diff --git a/LeanPool.lean b/LeanPool.lean index 6432adc220..38a5419661 100644 --- a/LeanPool.lean +++ b/LeanPool.lean @@ -1649,6 +1649,1828 @@ public import LeanPool.Circuitlib.Circuit.Category.Sequential public import LeanPool.Circuitlib.Circuit.Combinational public import LeanPool.Circuitlib.Circuit.Gate public import LeanPool.Circuitlib.Circuit.Wires +public import LeanPool.ClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Fields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Frobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Indices +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Norm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormConjugation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormLaws +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PadicCyclicClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PrimeElements +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ProfiniteIntegerFiniteQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Valuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ValuationLaws +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldCandidate +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CanonicalUnramifiedNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ChosenDegreeOneFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CoreFrobeniusNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.DoubleCosetOrbitGeometry +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteFieldUnitMaps +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateFieldCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitCorrection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusClosureCommutation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusPowerFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusQuotientDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusSemigroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainFiniteReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ConjugatePrimeNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.CorrectionSum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FiniteStageCorrections +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusPowerSumRelation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.NormClassRelation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.PrimeUnitDifferences +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ReciprocityMapMul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransfer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobeniusGeometry +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.NormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.PrimeChoice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityDefinition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityIndependence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.RelativeNormDoubleCoset +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferOrbitClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnitCohomologyAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.Universal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UniversalNormDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnramifiedNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.CyclicNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FieldRepresentation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.IntermediateExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormContinuity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopologyCharacterization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ProfiniteAPI +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Sylow +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.Conclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FixedSource +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusNorms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionCosets +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ValuationContinuity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.AbelianGaloisEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.FiniteAbelianIntermediateFieldAlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.IntermediateFieldAlgEquivOrderIso +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.Coordinates +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FinitePlaceTensorBlock +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FiniteRestrictedProductBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.InfinitePlaceTensorBlock +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralLocalFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.IdeleSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Localization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.LocalComponents +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.AdeleBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.Comparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.FinitePlaceAdicCompletionCongrEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.IntegerRingComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.LocalizedValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.RamificationIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.CompositumEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.FiniteAbelianCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.AbsoluteAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeDegreeSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.FixedFieldLattice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.InfiniteBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteGaloisBaseEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MaximalAbelianSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.NormalFieldRange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.RelativeAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.UnboundedDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.BaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivAdeleTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivFiniteIntegral +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivIdeleClassTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.ConnectedComponentQuotientCongr +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.InfiniteAlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibTopologyComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Decomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.HerbrandExactSequence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Factors +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyCardinality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyFinite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Local +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.LocalBlocks +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Reassociation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.BaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.ClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.EmbeddingNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdealClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleClassBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.InfiniteOnePlaceBaseNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormLocalOrder +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormProperties +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.OnePlaceBaseNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FiniteMathlibTopologyComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdentityComponent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormOneCompact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ArchimedeanNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.Continuity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ExtensionBehavior +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.FiniteNormArithmetic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.IdeleClassNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.NormOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PositiveArchimedeanSection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FiniteIntegralNormPreimage +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.InfinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.SPlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.Support +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.RestrictedProductUnitsTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SufficientlyLarge +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitFinset +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimesModFour +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.DegreeOnePrimes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.EverywhereUnramifiedTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedEtaleBridge +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.GaloisDifferentBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.IntegralPrimitiveElement +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.MathlibUnramifiedInterface +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.PlaceEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.RootDiscriminantBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SchurPrimeDivisors +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SmallModel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SupportedDiscriminantBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.TameDifferentTrace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.FiniteField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.Ideal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.QuadraticReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeFromChosenPrimes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.RationalPrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.NormalClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.PrimeOrderFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.UnramifiedRationals +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.FullModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.IdealNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.LocalConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Narrow +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.OrdinaryClassGroupComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PublicHigherUnitComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.GaloisAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Herbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.LogLattice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Rank +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.TensorProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.EmbedsInRayClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNormExponentMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealModulusProjection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassPrimeToIdeals +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsEverywhereUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsUnramifiedAtFinitePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealFactorization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IdeleClassConnectedQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IsMaximalAbelianGlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsLowerRamificationJump +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsUpperRamificationJump +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.FinitePlaceHilbertBadSet +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFamily +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalInfinitePlaceHilbertSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingLaws +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingNormResidueCriterion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsKummerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebraNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormHom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.OpenFiniteIndexSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsEverywhereLocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtFinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.HasseNormPrinciple +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.PrimePowerKummerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitNormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.KummerLocalNormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.MathlibNormInterface +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.BasePlaceSelection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.Conclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.CoordinatePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.DecompositionFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.FinitePlaceDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.PrimeSet +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.RestrictionKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitLocalPowerMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SupportedIdelePowerLocalUnitQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CofinitelySplitFiniteExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CyclicPrimePowerFullDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.IdeleClassHerbrandSupportedFinal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianLocalConductorComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianNormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticClassFieldCorrespondence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticHilbertClassFieldReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticRayClassFieldReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldMathlibArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldOverOriginalBase +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldConstruction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldNormRange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldOriginalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Evaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.GlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.Conductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorInfinitePart +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLattice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLocalComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorRayClassMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicConductorUniqueness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicRayClassMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclotomicKummerNormDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.EmbeddedAbelianSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondenceTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteIndexNormClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FinitePlaceArtinQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FullConductorRayClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximalSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldPrimeSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigActual +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigOriginal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallActual +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallOriginal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.Transport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldUnramifiedMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertNormCharacterization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.InfiniteAbelianClassFieldCorrespondence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.KummerNormDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibGlobalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormLimitation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormRayClassMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormTowerConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.OrdinaryNormClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PowerCongruenceCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealArtinKernelComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormArtinKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormQuotientComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RationalRayPrimeClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassModulusProjection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupFieldAntitone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayPrimeGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMathlibArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMaximalSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldOverOriginalBase +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertNormCharacterization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeNormClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.AbstractCapitulation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealDecompositionLaw +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealDecompositionLaw +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealNormArtinExactness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationStatement +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTheorem +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTransfer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalAbstractExtensionToOrdinary +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Compatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FieldSpine +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FiniteNormClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.MembershipTypes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Quotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Representatives +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.ZeroTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFixedFieldBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertPrincipalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerConjugation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.AbstractFixedFieldGlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceOverfield +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.NumberFieldComplexification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.OverextensionArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RamifiedOverextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RationalComplexification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicAbstractFixedFieldArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValueTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicNormOneCorrection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicPrincipalIdele +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicTorsionFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedGeometricRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedLocalGlobalCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicZHatBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationFinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteLocalFamily +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertProductFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicLocalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Conjugation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.CrossLocalRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.NormRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.TowerRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.UnramifiedNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceCyclotomicFrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinFiniteSupportApproximation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceCharacterComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceFiniteSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceLocalGlobal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceCharacter +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegative +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeRoot +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeUnit +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlacePositive +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealSquare +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianizationNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFamilyAlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFiniteFactorNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormulaAlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitAbstractFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevelCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormProof +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormStatement +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescentCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPoints +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassNormTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinSurjectivity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteHilbertFactorNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteLocalGlobalArtinCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfinitePlaceArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IntermediateNormAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicAuxiliaryField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicCyclicData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.SeparableClosurePadicLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibHilbertProductFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibTopologicalGlobalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianGlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.NormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.PowerResidueReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ProductFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicArithmeticProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicCharacterRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlaceArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicLocalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalAwayProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalPrimeFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicRayNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicZHatRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrimeFactorization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrincipalLocalUnit +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalQuadraticPowerResidueReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidueAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Final +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumCyclotomicTarget +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumGlobalEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLeftFactors +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLocalizationEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuationInertiaBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuedEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalPadicPrimePowInertiaBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.LocalCyclotomicEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalCyclotomicArithmeticReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalRayClassFieldCyclotomic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RayClassComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Setup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.UnramifiedCompositumSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.CyclotomicPrimeBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.FinitePlaceDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitKummerUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.EnlargedSUnitRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FiniteRadicalSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FullSUnitKummerExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitLocalPowerKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitPowerQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SimpleExtensionLocalBehavior +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanHilbert90 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.CohomologyBridge +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FieldUnitsHerbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FilteredLiftingSequence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Hilbert90 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.IntegerUnitsHerbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.H0 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.HMinusOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.Instances +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.FamilyClassAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Induced +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.TensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Main +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasis +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisCohomology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisFiniteQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGaloisAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGradedLifting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisInfiniteProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisRecursiveLifting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.PrincipalUnitGraded +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValuationHerbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValueGroupCohomology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Conductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.PrincipalUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.StandardSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.Unramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CharacteristicZero +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.Classification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CyclotomicKummerDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristicDominatingExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.FiniteUnramifiedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.KummerNormOpen +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LocalAbsoluteData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LubinTateUniformizerDiagonal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MathlibFieldClassification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MaximalKummerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupOrderEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupRingEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupSurjectivity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianNorms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianNorms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkIntermediateFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkLocalClassification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkOpenSubgroups +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkSeparableClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardDominatingExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardLubinTate +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardSubgroupIntersection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedLubinTateDiagonal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnshrinkFiniteAbelianFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbsoluteUnitsFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityPrimeNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConjugationNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.AbstractUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Compositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristicStandardCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.FiniteAbelian +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.InertiaUnramifiedExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.StandardCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Unramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilySubgroupKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyUnramifiedCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteGaloisRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFinrankTransfer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueValuationComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteSubgroupResidueDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldContinuousNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeNormTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeSymbolSetup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeTarget +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitnessComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport.Fields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport.Groups +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusQuotientTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.NormRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.PrimeComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldLocalData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldNormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldRelativeNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.HenselianValuationBase +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntermediateFieldNormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalClassFieldAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalResidueDatum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueActionIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicClosureDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicallyClosed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueDatum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SemilinearNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableFixedFieldNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableNormProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TateTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedResidueUniqueness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ValuationSemilinear +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Cohomology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Norm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Lift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.ResidueNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Uniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.UnramifiedConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtinRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotientTransitions +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotients +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteGaloisAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbstractProfiniteCompletionComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteAbelianQuotientKernels +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteReciprocityDiagram +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.LocalMultiplicativeCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletionCriteria +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteLocalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.TopologicalAbelianizationCongr +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.CanonicalKummerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerExponentTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerNormPowerClassDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertExponentCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairingNondegeneracy +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbolLaws +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MathlibHilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MaximalLocalKummerPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.PowerResidueTameFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicRealFilteredComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedFixedFieldComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedLevelTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedRealFilteredComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicUpperFiltration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LaurentPrincipalUnitTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LubinTateTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.PadicMultiplicativeArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFilteredArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFixedFieldComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormSubgroupExact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardSubgroupIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.TransportedNormSubgroupExact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedPrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedPolynomialEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizerNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusBaseEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldCoefficientDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPowerBasis +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPrimitive +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectBracketAtCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracketRecursion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectTargetLevelEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFirstIdentity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFrobeniusFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaIteration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaAtCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaLocalInverse +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FreeRankOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelFieldTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.UnitQuotientGalois +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.AmbientBracketAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.DivisionModuleEndomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateEndomorphism +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CoefficientFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CompletedUnramifiedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.ContractingEquation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.LaurentSeriesFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFrobeniusFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitsNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.LevelAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.StandardSubgroupNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitQuotientCard +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.DisplacementValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.GaloisAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.LowerGroups +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.PrimitivePoint +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.RealIndexSteps +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaCoefficients +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaUniqueness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedLevelCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedPrimitiveEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedIterates +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.DivisionPolynomial +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameterFiltration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameters +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.GaloisParameterFiltration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HerbrandFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HigherUnitLevelEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelFieldTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LocalUpperRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamificationFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ParameterCongruence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveDisplacement +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveEisenstein +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveRoot +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveTorsion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.UpperRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.CoefficientEquation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.DegreeStabilization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Intertwiner +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.LinearTerm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCoefficient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCorrection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveIntertwiner +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Reduction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Series +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerCoefficient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.CompletedSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.DefectCorrection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.IntertwinerConstruction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarEndomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerPrimitive +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerThetaFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedResidueFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedStandardLevelTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedFrobeniusFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedCoefficientEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedPrimitivePoint +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedScalarEndomorphism +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelPrimitiveRoot +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeIntertwiner +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.ChosenInertiaCoverage +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.InertiaGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.PadicValuationInertia +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicInertiaBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicRamificationIndexBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicLocalizationCanonicalValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.RamificationIndexComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteExponentIsLeast +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteNormCriterion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorRayClassFieldLe +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorRealRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorTameCriterion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInEveryRayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInRayClassFieldIffConductorLe +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsRayArtinModulusProjection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsUniqueAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.FractionalIdealNormPrimeExponent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsAbelianConductorUnique +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsRayCongruentOfLe +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.NarrowRayClassGroupEquivNarrowClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.OrdinaryNarrowModuliEqOfNoReal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.OrdinaryRayClassGroupEquivClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayArtinModulusProjection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldModulusMonotone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldPrimeSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupFinite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupHomExtFinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealArtinKerEqNormRangeSupPrincipal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionPrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionSurjective +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageEqArtinKer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageLeArtinKer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupExistence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupFieldAntitone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupPrimeInertiaDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupPrimeSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquivMk +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupRealizationEq +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupRealizationEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitAntitone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitMembership +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitOneAdd +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitOpen +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitZero +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealMembership +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealPrimeTo +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAlgEquivTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusEqOneIffSplitsCompletely +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIndependentOfPrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIsArithmetic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusOrder +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusRestrictTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldArtinEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldExists +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldNarrowRayRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplittingPositivePrincipal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldUnique +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.NarrowRayRealizationIsBigHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.OrdinaryRayRealizationIsSmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallBigHilbertClassFieldIffOfNoReal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldArtinEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldEmbedsInBig +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldExists +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldLeBig +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldOrdinaryRayRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldPrimeSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldPrincipalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldUnique +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldUniqueUpToEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianGlobalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianGlobalReciprocityQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquivMk +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceCompletionLocalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceLocalGlobalNormKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinLocalValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinNormKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.MaximalAbelianGlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.TopologicalGlobalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HasseArf +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexDifference +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexNatOfJump +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexStrictMono +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionInverseHerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionNat +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.InverseHerbrandFunctionHerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.IsUpperRamificationJumpInt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupAntitone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupEventuallyBot +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupNormal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupZeroEqInertia +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealAndUpperRamificationGroupNormal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNat +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNormal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAfter +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAntitone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupEventuallyBot +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.FinitePlaceHilbertBadSetFinite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.GlobalHilbertPairingFiniteSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.GlobalHilbertPairingSupportBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingPerfect +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingSymbolMul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingSymbolMulRight +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertProductFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraCopiesOfSimpleFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteEtale +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteFree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFinrank +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormIffSimpleRadicalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraOneNormSurjective +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraProductDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFactorDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFieldFactors +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerRadicalDegreeEqPowerClassOrder +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingArtinNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExists +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExponentCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingInverse +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingNormCriterion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingPerfectExists +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassEqIff +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassEqOneIff +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassGroupFinite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassInv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassMul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassPow +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.RootQuotientChoiceIndependence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.KroneckerWeber +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupFiniteIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupIsOpen +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupRingEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistenceOrderIso +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamily +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyExt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivMk +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivOfArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedFamilyExt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedHomExt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.MemFieldNormSubgroupIff +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CompletionTensorNormDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CompletionTensorNormDecompositionCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.ComplexInfinitePlaceAllNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CyclicHasseNormTheorem +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.GlobalNormIsEverywhereLocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.InfiniteNormIffPositive +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.NegativeOneNotInfiniteNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.TensorNormBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.UnramifiedInfinitePlaceAllNorm +public import LeanPool.ClassFieldTheory.GaloisCohomology +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.GaloisCohomology +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.BinaryProduct +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Cardinality +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Core +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.EquivariantEquiv +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Index +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Product +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.TateComparison +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Induced +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLattice +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.Lattice +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.LatticeHerbrand +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.Module +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientReps +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientTower +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Product +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0 +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Invariants +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Main +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.NormImage +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Augmentation +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Finite +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Quotient +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.QuotientTower +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.RestrictionKernel +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer.RelativeAugmentation +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer.Witt +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerAbelianAssembly +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerAbelianCyclicFactors +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerCyclicOperator +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerDelta +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerFixedField +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerGlobalOperator +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Basic +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.CyclotomicQuotient +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Decomposition +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.DenseTorsion +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteFree +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteOrder +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FreeCoordinate +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Gather +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Local +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Swap +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientEquiv +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientMk +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacter +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacterEquiv +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicField +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicTorsionField +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.CyclotomicField +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.ExtensionRoundTrip +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteCharacterEquiv +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteDualSeparation +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteSupport +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.GaloisCohomology +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteContinuity +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteGeneration +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteInverse +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.KummerCorrespondenceFormula +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalMaximalKummerExtension +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalUnitKummerUnramified +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.MaximalKummerSubgroup +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalExtension +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalQuotient +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RestrictedFinite +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RootCharacters +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SUnitPreparation +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SUnitPreparation.PrimePowerKernelCoordinates +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtensionNorm +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.CyclotomicTorsionQuotient +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteInteger +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerCore +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerPrimeProduct +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerUnits +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.TopologicalGeneration +public import LeanPool.ClassFieldTheory.GaloisCohomology.Topology +public import LeanPool.ClassFieldTheory.GaloisCohomology.Topology.TotallyDisconnectedQuotients +public import LeanPool.ClassFieldTheory.ProCGroups +public import LeanPool.ClassFieldTheory.ProCGroups.InducedFunctions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.Arithmetic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.ContinuousFieldUnitLog +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.DenominatorValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogUniqueness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpAdditivity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpComposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpContinuity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.ExpConvergence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCore +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.BasicFactors +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoiceCountSystem +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoicePositions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ExplicitChoiceCounts +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.PowerSeriesComposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ProductArgument +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalProduct +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.Homomorphisms +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.InverseEstimates +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.LogConvergence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitExp +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog.Equivalences +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.SeriesTerms +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.PrincipalUnitExpLogEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.EqualCharacteristicLaurent +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNorm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormBase +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitFactors +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitPowerIndexFormulas +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitStructure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FiniteCoefficientLaurent +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaIndexing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaPrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicQp +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.DeepPrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.IntegralLattice +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Quotients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.NormFiltration +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicLinearOfContinuous +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicModuleStructure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicPowerIndex +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicValuationComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PolynomialRootProximity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PowerIndex +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitInverseLimitSurjectivity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicPadicModule +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicProdiscreteComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.FiniteQuotientPadicModule +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitCore +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.PadicReductionContinuous +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.ProdiscretePadicModule +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.QuotientTransition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.TopologyModelTypes +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.WithZeroValuationTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.AutomorphismTransport +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Filtration +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueQuotient +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueRoots +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerLift +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Units +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuedExtensionUnitMap +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValueGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.WithZeroValuationTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.ContinuousQuotientEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.IntegerMultipleSubgroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.PowerIndex +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.AdditiveEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.MultiplicativeDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Norm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormContinuity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormSubgroupFunctoriality +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PowerClassFiniteness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitActions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ProfiniteUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueGalois +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.SeparableNormValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ShrinkTransport +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Small +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UniformizerPrincipalQuotient +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnitTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Valuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuativeExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NormUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.ClosedAddSubgroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinPolynomial +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinRelation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.Existence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralTranslate +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.PrimeElement +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.RamificationIndex +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.ValuationRingEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.Unramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.Unramified.ArithmeticFrobenius +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.NonarchimedeanLocalField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.PrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.UnitDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChange +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChangeCore +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BasicInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Composition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.FiniteSupport +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselReduction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselianAlgebraicExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalResidue +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalSubextension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.RamificationIndexTower +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueEmbedding +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueLifting +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Separable +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.ClosedSubgroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Different +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Filtration +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.AbsoluteRamification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteExtensionCorrespondence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteLevelValuationRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.InfiniteGaloisCorrespondence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.ClosedFixingSubgroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.CompositumRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.Ramification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.RamificationQuotients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Average +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.FixedField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Function +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Quotient +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Tower +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AbsoluteValueConjugacy +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.BaseChange +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CharacterMap +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CompleteDVF +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CyclotomicDegreeBound +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.CompositumUnramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Conjugation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFieldTower +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFieldUnramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFields +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.NumberFieldPrimes +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.OrbitCardinality +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.PrimeContractions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.TowerInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.ValuedGalois +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteGaloisLevel +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteGaloisLevelIndependence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteInertiaStructure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteOrderValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteRamificationPrimary +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FirstRamificationComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamificationIndex +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldValuationRing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.GaloisStabilizer +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandFunction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandTheorem +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRamificationCard +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRestrictionCard +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationDensity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationRamificationGroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Monogeneity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.OrbitPolynomialIdeal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.PadicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Polynomial +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationCharacterization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationDepth +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumber +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumberFormula +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumberRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationPrimeToResidueTorsion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ResidueExactSequence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniformizerGradedHom +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniqueExtensionIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationKrasner +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.InertiaCardinality +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.FirstRamificationComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.InertiaCard +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.ProfiniteInvariant +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ExponentialValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Ostrowski +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.PrincipalAdicCompleteness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.SpectralExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.AbsoluteValues +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.ExponentialValuations +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.AbsoluteValueExtensions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.BaseChangeAdjoinRoot +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.BaseChangeNormTrace +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.CanonicalTensorMap +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.DegreeNormTrace +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionFactorClassification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteProductNormTrace +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.Padic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialCRT +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialFactors +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.SeparablePolynomialFactors +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductProductFormulas +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AdicPower +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AmbientUniformizer +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.CompleteDVRExpansion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Compositum +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Defectless +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Degree +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Henselian +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianFinite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianValuationExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.IntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ResidueField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationTransport +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.HenselLemma +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.AlgebraicExtensionUniqueness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.AlgebraicIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Complete +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.CoprimeFactorLifting +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.EtaleLifting +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.AdicLimits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Assembly +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.CoefficientMinimum +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Complete +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DegreeBounds +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DivisionBounds +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.ErrorPowers +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.FiniteApproximation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.InfiniteApproximation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Iteration +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.PrincipalLimits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Step +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Truncation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.WeakLimits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialBounds +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialLifting +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.MonicFactorization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.NonmonicReduction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveFactorization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveReduction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.SimpleRootFactorization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.StandardEtaleLifting +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueAlgebraicExtensions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionPrimitive +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionReduction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.ValuationExtensionCriterion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicCompletionInverseLimit +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicCompletionInverseLimitRing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicContractingFixedPoint +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.CompatibleInverseLimit +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.Models +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.UniqueRing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.ValuedAdicComplete public import LeanPool.ClassificationOfSurfaces public import LeanPool.ClassificationOfSurfaces.API public import LeanPool.ClassificationOfSurfaces.Basic diff --git a/LeanPool/ClassFieldTheory.lean b/LeanPool/ClassFieldTheory.lean new file mode 100644 index 0000000000..df1898d5d9 --- /dev/null +++ b/LeanPool/ClassFieldTheory.lean @@ -0,0 +1,1840 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Fields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Frobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Indices +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Norm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormConjugation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormLaws +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PadicCyclicClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PrimeElements +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ProfiniteIntegerFiniteQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Valuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ValuationLaws +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldCandidate +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CanonicalUnramifiedNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ChosenDegreeOneFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CoreFrobeniusNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.DoubleCosetOrbitGeometry +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteFieldUnitMaps +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateFieldCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitCorrection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusClosureCommutation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusPowerFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusQuotientDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusSemigroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainFiniteReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ConjugatePrimeNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.CorrectionSum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FiniteStageCorrections +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusPowerSumRelation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.NormClassRelation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.PrimeUnitDifferences +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ReciprocityMapMul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransfer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobeniusGeometry +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.NormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.PrimeChoice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityDefinition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityIndependence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.RelativeNormDoubleCoset +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferOrbitClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnitCohomologyAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.Universal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UniversalNormDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnramifiedNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.CyclicNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FieldRepresentation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.IntermediateExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormContinuity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopologyCharacterization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ProfiniteAPI +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Sylow +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.Conclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FixedSource +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusNorms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionCosets +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ValuationContinuity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.AbelianGaloisEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.FiniteAbelianIntermediateFieldAlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.IntermediateFieldAlgEquivOrderIso +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.Coordinates +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FinitePlaceTensorBlock +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FiniteRestrictedProductBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.InfinitePlaceTensorBlock +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralLocalFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.IdeleSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Localization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.LocalComponents +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.AdeleBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.Comparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.FinitePlaceAdicCompletionCongrEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.IntegerRingComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.LocalizedValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.RamificationIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.CompositumEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.FiniteAbelianCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.AbsoluteAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeDegreeSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.FixedFieldLattice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.InfiniteBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteGaloisBaseEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MaximalAbelianSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.NormalFieldRange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.RelativeAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.UnboundedDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.BaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivAdeleTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivFiniteIntegral +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivIdeleClassTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.ConnectedComponentQuotientCongr +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.InfiniteAlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibTopologyComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Decomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.HerbrandExactSequence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Factors +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyCardinality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyFinite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Local +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.LocalBlocks +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Reassociation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.BaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.ClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.EmbeddingNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdealClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleClassBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.InfiniteOnePlaceBaseNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormLocalOrder +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormProperties +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.OnePlaceBaseNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FiniteMathlibTopologyComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdentityComponent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormOneCompact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ArchimedeanNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.Continuity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ExtensionBehavior +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.FiniteNormArithmetic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.IdeleClassNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.NormOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PositiveArchimedeanSection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FiniteIntegralNormPreimage +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.InfinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.SPlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.Support +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.RestrictedProductUnitsTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SufficientlyLarge +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitFinset +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimesModFour +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.DegreeOnePrimes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.EverywhereUnramifiedTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedEtaleBridge +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.GaloisDifferentBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.IntegralPrimitiveElement +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.MathlibUnramifiedInterface +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.PlaceEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.RootDiscriminantBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SchurPrimeDivisors +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SmallModel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SupportedDiscriminantBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.TameDifferentTrace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.FiniteField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.Ideal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.QuadraticReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeFromChosenPrimes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.RationalPrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.NormalClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.PrimeOrderFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.UnramifiedRationals +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.FullModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.IdealNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.LocalConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Narrow +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.OrdinaryClassGroupComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PublicHigherUnitComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.GaloisAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Herbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.LogLattice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Rank +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.TensorProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.EmbedsInRayClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNormExponentMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealModulusProjection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassPrimeToIdeals +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsEverywhereUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsUnramifiedAtFinitePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealFactorization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IdeleClassConnectedQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IsMaximalAbelianGlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsLowerRamificationJump +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsUpperRamificationJump +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.FinitePlaceHilbertBadSet +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFamily +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalInfinitePlaceHilbertSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingLaws +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingNormResidueCriterion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsKummerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebraNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormHom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.OpenFiniteIndexSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsEverywhereLocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtFinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.HasseNormPrinciple +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.PrimePowerKummerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitNormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.KummerLocalNormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.MathlibNormInterface +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.BasePlaceSelection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.Conclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.CoordinatePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.DecompositionFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.FinitePlaceDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.PrimeSet +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.RestrictionKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitLocalPowerMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SupportedIdelePowerLocalUnitQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CofinitelySplitFiniteExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CyclicPrimePowerFullDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.IdeleClassHerbrandSupportedFinal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianLocalConductorComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianNormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticClassFieldCorrespondence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticHilbertClassFieldReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticRayClassFieldReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldMathlibArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldOverOriginalBase +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldConstruction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldNormRange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldOriginalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Evaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.GlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.Conductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorInfinitePart +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLattice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLocalComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorRayClassMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicConductorUniqueness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicRayClassMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclotomicKummerNormDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.EmbeddedAbelianSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondenceTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteIndexNormClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FinitePlaceArtinQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FullConductorRayClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximalSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldPrimeSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigActual +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigOriginal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallActual +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallOriginal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.Transport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldUnramifiedMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertNormCharacterization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.InfiniteAbelianClassFieldCorrespondence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.KummerNormDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibGlobalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormLimitation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormRayClassMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormTowerConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.OrdinaryNormClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PowerCongruenceCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealArtinKernelComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormArtinKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormQuotientComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RationalRayPrimeClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassModulusProjection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupFieldAntitone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayPrimeGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMathlibArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMaximalSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldOverOriginalBase +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertNormCharacterization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeNormClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.AbstractCapitulation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealDecompositionLaw +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealDecompositionLaw +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealNormArtinExactness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationStatement +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTheorem +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTransfer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalAbstractExtensionToOrdinary +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Compatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FieldSpine +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FiniteNormClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.MembershipTypes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Quotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Representatives +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.ZeroTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFixedFieldBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertPrincipalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerConjugation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.AbstractFixedFieldGlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceOverfield +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.NumberFieldComplexification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.OverextensionArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RamifiedOverextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RationalComplexification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicAbstractFixedFieldArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValueTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicNormOneCorrection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicPrincipalIdele +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicTorsionFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedGeometricRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedLocalGlobalCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicZHatBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationFinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteLocalFamily +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertProductFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicLocalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Conjugation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.CrossLocalRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.NormRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.TowerRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.UnramifiedNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceCyclotomicFrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinFiniteSupportApproximation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceCharacterComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceFiniteSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceLocalGlobal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceCharacter +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegative +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeRoot +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeUnit +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlacePositive +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealSquare +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianizationNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFamilyAlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFiniteFactorNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormulaAlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitAbstractFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevelCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormProof +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormStatement +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescentCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPoints +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassNormTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinSurjectivity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteHilbertFactorNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteLocalGlobalArtinCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfinitePlaceArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IntermediateNormAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicAuxiliaryField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicCyclicData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.SeparableClosurePadicLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibHilbertProductFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibTopologicalGlobalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianGlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.NormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.PowerResidueReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ProductFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicArithmeticProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicCharacterRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlaceArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicLocalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalAwayProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalPrimeFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicRayNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicZHatRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrimeFactorization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrincipalLocalUnit +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalQuadraticPowerResidueReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidueAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Final +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumCyclotomicTarget +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumGlobalEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLeftFactors +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLocalizationEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuationInertiaBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuedEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalPadicPrimePowInertiaBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.LocalCyclotomicEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalCyclotomicArithmeticReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalRayClassFieldCyclotomic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RayClassComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Setup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.UnramifiedCompositumSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.CyclotomicPrimeBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.FinitePlaceDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitKummerUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.EnlargedSUnitRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FiniteRadicalSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FullSUnitKummerExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitLocalPowerKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitPowerQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SimpleExtensionLocalBehavior +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanHilbert90 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.CohomologyBridge +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FieldUnitsHerbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FilteredLiftingSequence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Hilbert90 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.IntegerUnitsHerbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.H0 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.HMinusOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.Instances +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.FamilyClassAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Induced +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.TensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Main +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasis +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisCohomology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisFiniteQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGaloisAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGradedLifting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisInfiniteProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisRecursiveLifting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.PrincipalUnitGraded +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValuationHerbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValueGroupCohomology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Conductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.PrincipalUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.StandardSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.Unramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CharacteristicZero +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.Classification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CyclotomicKummerDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristicDominatingExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.FiniteUnramifiedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.KummerNormOpen +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LocalAbsoluteData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LubinTateUniformizerDiagonal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MathlibFieldClassification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MaximalKummerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupOrderEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupRingEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupSurjectivity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianNorms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianNorms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkIntermediateFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkLocalClassification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkOpenSubgroups +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkSeparableClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardDominatingExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardLubinTate +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardSubgroupIntersection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedLubinTateDiagonal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnshrinkFiniteAbelianFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbsoluteUnitsFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityPrimeNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConjugationNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.AbstractUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Compositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristicStandardCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.FiniteAbelian +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.InertiaUnramifiedExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.StandardCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Unramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilySubgroupKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyUnramifiedCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteGaloisRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFinrankTransfer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueValuationComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteSubgroupResidueDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldContinuousNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeNormTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeSymbolSetup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeTarget +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitnessComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport.Fields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport.Groups +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusQuotientTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.NormRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.PrimeComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldLocalData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldNormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldRelativeNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.HenselianValuationBase +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntermediateFieldNormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalClassFieldAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalResidueDatum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueActionIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicClosureDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicallyClosed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueDatum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SemilinearNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableFixedFieldNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableNormProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TateTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedResidueUniqueness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ValuationSemilinear +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Cohomology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Norm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Lift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.ResidueNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Uniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.UnramifiedConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtinRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotientTransitions +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotients +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteGaloisAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbstractProfiniteCompletionComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteAbelianQuotientKernels +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteReciprocityDiagram +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.LocalMultiplicativeCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletionCriteria +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteLocalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.TopologicalAbelianizationCongr +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.CanonicalKummerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerExponentTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerNormPowerClassDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertExponentCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairingNondegeneracy +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbolLaws +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MathlibHilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MaximalLocalKummerPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.PowerResidueTameFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicRealFilteredComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedFixedFieldComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedLevelTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedRealFilteredComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicUpperFiltration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LaurentPrincipalUnitTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LubinTateTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.PadicMultiplicativeArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFilteredArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFixedFieldComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormSubgroupExact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardSubgroupIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.TransportedNormSubgroupExact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedPrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedPolynomialEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizerNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusBaseEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldCoefficientDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPowerBasis +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPrimitive +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectBracketAtCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracketRecursion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectTargetLevelEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFirstIdentity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFrobeniusFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaIteration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaAtCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaLocalInverse +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FreeRankOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelFieldTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.UnitQuotientGalois +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.AmbientBracketAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.DivisionModuleEndomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateEndomorphism +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CoefficientFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CompletedUnramifiedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.ContractingEquation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.LaurentSeriesFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFrobeniusFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitsNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.LevelAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.StandardSubgroupNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitQuotientCard +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.DisplacementValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.GaloisAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.LowerGroups +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.PrimitivePoint +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.RealIndexSteps +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaCoefficients +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaUniqueness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedLevelCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedPrimitiveEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedIterates +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.DivisionPolynomial +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameterFiltration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameters +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.GaloisParameterFiltration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HerbrandFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HigherUnitLevelEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelFieldTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LocalUpperRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamificationFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ParameterCongruence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveDisplacement +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveEisenstein +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveRoot +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveTorsion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.UpperRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.CoefficientEquation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.DegreeStabilization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Intertwiner +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.LinearTerm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCoefficient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCorrection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveIntertwiner +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Reduction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Series +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerCoefficient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.CompletedSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.DefectCorrection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.IntertwinerConstruction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarEndomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerPrimitive +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerThetaFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedResidueFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedStandardLevelTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedFrobeniusFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedCoefficientEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedPrimitivePoint +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedScalarEndomorphism +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelPrimitiveRoot +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeIntertwiner +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.ChosenInertiaCoverage +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.InertiaGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.PadicValuationInertia +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicInertiaBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicRamificationIndexBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicLocalizationCanonicalValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.RamificationIndexComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteExponentIsLeast +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteNormCriterion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorRayClassFieldLe +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorRealRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorTameCriterion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInEveryRayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInRayClassFieldIffConductorLe +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsRayArtinModulusProjection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsUniqueAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.FractionalIdealNormPrimeExponent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsAbelianConductorUnique +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsRayCongruentOfLe +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.NarrowRayClassGroupEquivNarrowClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.OrdinaryNarrowModuliEqOfNoReal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.OrdinaryRayClassGroupEquivClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayArtinModulusProjection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldModulusMonotone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldPrimeSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupFinite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupHomExtFinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealArtinKerEqNormRangeSupPrincipal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionPrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionSurjective +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageEqArtinKer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageLeArtinKer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupExistence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupFieldAntitone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupPrimeInertiaDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupPrimeSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquivMk +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupRealizationEq +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupRealizationEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitAntitone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitMembership +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitOneAdd +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitOpen +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitZero +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealMembership +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealPrimeTo +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAlgEquivTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusEqOneIffSplitsCompletely +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIndependentOfPrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIsArithmetic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusOrder +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusRestrictTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldArtinEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldExists +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldNarrowRayRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplittingPositivePrincipal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldUnique +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.NarrowRayRealizationIsBigHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.OrdinaryRayRealizationIsSmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallBigHilbertClassFieldIffOfNoReal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldArtinEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldEmbedsInBig +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldExists +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldLeBig +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldOrdinaryRayRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldPrimeSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldPrincipalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldUnique +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldUniqueUpToEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianGlobalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianGlobalReciprocityQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquivMk +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceCompletionLocalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceLocalGlobalNormKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinLocalValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinNormKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.MaximalAbelianGlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.TopologicalGlobalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HasseArf +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexDifference +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexNatOfJump +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexStrictMono +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionInverseHerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionNat +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.InverseHerbrandFunctionHerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.IsUpperRamificationJumpInt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupAntitone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupEventuallyBot +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupNormal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupZeroEqInertia +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealAndUpperRamificationGroupNormal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNat +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNormal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAfter +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAntitone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupEventuallyBot +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.FinitePlaceHilbertBadSetFinite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.GlobalHilbertPairingFiniteSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.GlobalHilbertPairingSupportBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingPerfect +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingSymbolMul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingSymbolMulRight +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertProductFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraCopiesOfSimpleFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteEtale +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteFree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFinrank +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormIffSimpleRadicalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraOneNormSurjective +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraProductDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFactorDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFieldFactors +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerRadicalDegreeEqPowerClassOrder +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingArtinNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExists +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExponentCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingInverse +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingNormCriterion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingPerfectExists +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassEqIff +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassEqOneIff +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassGroupFinite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassInv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassMul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassPow +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.RootQuotientChoiceIndependence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.KroneckerWeber +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupFiniteIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupIsOpen +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupRingEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistenceOrderIso +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamily +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyExt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivMk +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivOfArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedFamilyExt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedHomExt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.MemFieldNormSubgroupIff +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CompletionTensorNormDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CompletionTensorNormDecompositionCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.ComplexInfinitePlaceAllNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CyclicHasseNormTheorem +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.GlobalNormIsEverywhereLocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.InfiniteNormIffPositive +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.NegativeOneNotInfiniteNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.TensorNormBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.UnramifiedInfinitePlaceAllNorm +public import LeanPool.ClassFieldTheory.GaloisCohomology +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.GaloisCohomology +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.BinaryProduct +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Cardinality +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Core +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.EquivariantEquiv +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Index +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Product +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.TateComparison +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Induced +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLattice +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.Lattice +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.LatticeHerbrand +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.Module +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientReps +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientTower +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Product +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0 +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Invariants +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Main +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.NormImage +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Augmentation +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Finite +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Quotient +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.QuotientTower +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.RestrictionKernel +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer.RelativeAugmentation +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer.Witt +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerAbelianAssembly +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerAbelianCyclicFactors +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerCyclicOperator +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerDelta +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerFixedField +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerGlobalOperator +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Basic +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.CyclotomicQuotient +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Decomposition +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.DenseTorsion +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteFree +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteOrder +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FreeCoordinate +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Gather +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Local +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Swap +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientEquiv +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientMk +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacter +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacterEquiv +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicField +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicTorsionField +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.CyclotomicField +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.ExtensionRoundTrip +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteCharacterEquiv +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteDualSeparation +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteSupport +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.GaloisCohomology +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteContinuity +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteGeneration +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteInverse +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.KummerCorrespondenceFormula +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalMaximalKummerExtension +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalUnitKummerUnramified +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.MaximalKummerSubgroup +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalExtension +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalQuotient +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RestrictedFinite +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RootCharacters +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SUnitPreparation +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SUnitPreparation.PrimePowerKernelCoordinates +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtensionNorm +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.CyclotomicTorsionQuotient +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteInteger +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerCore +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerPrimeProduct +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerUnits +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.TopologicalGeneration +public import LeanPool.ClassFieldTheory.GaloisCohomology.Topology +public import LeanPool.ClassFieldTheory.GaloisCohomology.Topology.TotallyDisconnectedQuotients +public import LeanPool.ClassFieldTheory.ProCGroups +public import LeanPool.ClassFieldTheory.ProCGroups.InducedFunctions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.Arithmetic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.ContinuousFieldUnitLog +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.DenominatorValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogUniqueness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpAdditivity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpComposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpContinuity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.ExpConvergence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCore +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.BasicFactors +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoiceCountSystem +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoicePositions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ExplicitChoiceCounts +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.PowerSeriesComposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ProductArgument +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalProduct +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.Homomorphisms +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.InverseEstimates +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.LogConvergence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitExp +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog.Equivalences +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.SeriesTerms +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.PrincipalUnitExpLogEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.EqualCharacteristicLaurent +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNorm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormBase +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitFactors +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitPowerIndexFormulas +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitStructure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FiniteCoefficientLaurent +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaIndexing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaPrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicQp +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.DeepPrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.IntegralLattice +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Quotients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.NormFiltration +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicLinearOfContinuous +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicModuleStructure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicPowerIndex +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicValuationComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PolynomialRootProximity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PowerIndex +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitInverseLimitSurjectivity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicPadicModule +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicProdiscreteComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.FiniteQuotientPadicModule +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitCore +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.PadicReductionContinuous +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.ProdiscretePadicModule +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.QuotientTransition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.TopologyModelTypes +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.WithZeroValuationTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.AutomorphismTransport +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Filtration +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueQuotient +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueRoots +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerLift +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Units +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuedExtensionUnitMap +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValueGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.WithZeroValuationTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.ContinuousQuotientEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.IntegerMultipleSubgroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.PowerIndex +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.AdditiveEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.MultiplicativeDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Norm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormContinuity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormSubgroupFunctoriality +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PowerClassFiniteness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitActions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ProfiniteUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueGalois +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.SeparableNormValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ShrinkTransport +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Small +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UniformizerPrincipalQuotient +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnitTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Valuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuativeExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NormUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.ClosedAddSubgroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinPolynomial +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinRelation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.Existence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralTranslate +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.PrimeElement +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.RamificationIndex +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.ValuationRingEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.Unramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.Unramified.ArithmeticFrobenius +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.NonarchimedeanLocalField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.PrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.UnitDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChange +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChangeCore +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BasicInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Composition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.FiniteSupport +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselReduction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselianAlgebraicExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalResidue +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalSubextension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.RamificationIndexTower +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueEmbedding +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueLifting +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Separable +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.ClosedSubgroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Different +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Filtration +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.AbsoluteRamification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteExtensionCorrespondence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteLevelValuationRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.InfiniteGaloisCorrespondence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.ClosedFixingSubgroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.CompositumRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.Ramification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.RamificationQuotients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Average +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.FixedField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Function +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Quotient +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Tower +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AbsoluteValueConjugacy +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.BaseChange +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CharacterMap +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CompleteDVF +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CyclotomicDegreeBound +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.CompositumUnramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Conjugation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFieldTower +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFieldUnramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFields +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.NumberFieldPrimes +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.OrbitCardinality +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.PrimeContractions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.TowerInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.ValuedGalois +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteGaloisLevel +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteGaloisLevelIndependence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteInertiaStructure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteOrderValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteRamificationPrimary +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FirstRamificationComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamificationIndex +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldValuationRing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.GaloisStabilizer +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandFunction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandTheorem +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRamificationCard +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRestrictionCard +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationDensity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationRamificationGroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Monogeneity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.OrbitPolynomialIdeal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.PadicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Polynomial +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationCharacterization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationDepth +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumber +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumberFormula +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumberRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationPrimeToResidueTorsion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ResidueExactSequence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniformizerGradedHom +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniqueExtensionIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationKrasner +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.InertiaCardinality +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.FirstRamificationComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.InertiaCard +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.ProfiniteInvariant +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ExponentialValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Ostrowski +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.PrincipalAdicCompleteness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.SpectralExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.AbsoluteValues +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.ExponentialValuations +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.AbsoluteValueExtensions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.BaseChangeAdjoinRoot +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.BaseChangeNormTrace +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.CanonicalTensorMap +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.DegreeNormTrace +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionFactorClassification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteProductNormTrace +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.Padic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialCRT +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialFactors +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.SeparablePolynomialFactors +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductProductFormulas +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AdicPower +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AmbientUniformizer +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.CompleteDVRExpansion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Compositum +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Defectless +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Degree +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Henselian +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianFinite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianValuationExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.IntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ResidueField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationTransport +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.HenselLemma +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.AlgebraicExtensionUniqueness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.AlgebraicIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Complete +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.CoprimeFactorLifting +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.EtaleLifting +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.AdicLimits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Assembly +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.CoefficientMinimum +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Complete +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DegreeBounds +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DivisionBounds +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.ErrorPowers +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.FiniteApproximation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.InfiniteApproximation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Iteration +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.PrincipalLimits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Step +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Truncation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.WeakLimits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialBounds +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialLifting +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.MonicFactorization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.NonmonicReduction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveFactorization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveReduction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.SimpleRootFactorization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.StandardEtaleLifting +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueAlgebraicExtensions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionPrimitive +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionReduction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.ValuationExtensionCriterion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicCompletionInverseLimit +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicCompletionInverseLimitRing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicContractingFixedPoint +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.CompatibleInverseLimit +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.Models +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.UniqueRing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.ValuedAdicComplete + +/-! +# Local and global class field theory + +Source: url:https://github.com/n-yamaguchi-0729/ClassFieldTheory +Authors: n-yamaguchi-0729 +Status: verified +Main declarations: `ClassFieldTheory.finiteAbelianLocalReciprocity`, `ClassFieldTheory.topologicalGlobalReciprocity` +Tags: class-field-theory, local-fields, number-fields, galois-cohomology +MSC: 11R37, 11S31 +-/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory.lean new file mode 100644 index 0000000000..792561c9eb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory.lean @@ -0,0 +1,25 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory.lean new file mode 100644 index 0000000000..b7b176e07f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/All.lean new file mode 100644 index 0000000000..8290bc58f9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/All.lean @@ -0,0 +1,24 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.All +/-! +# Abstract class field theory + +Public root for abstract degree data, class formations, reciprocity, and the construction and +naturality of Artin maps. The public declarations live in the `ClassFormation` namespace. This +library is independent of local class field theory. + +The representation-free degree, field, extension, and topological-generation +APIs are universe-polymorphic. The boundary that uses Mathlib's `Rep ℤ G` is +necessarily universe zero because `Rep` currently places its coefficient ring +and acting group in the same universe; the affected source sections state that +constraint explicitly. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree.lean new file mode 100644 index 0000000000..c58d81a6ce --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree.lean @@ -0,0 +1,25 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Fields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Frobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Indices +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Norm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormConjugation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormLaws +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PadicCyclicClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PrimeElements +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ProfiniteIntegerFiniteQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Valuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ValuationLaws + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/All.lean new file mode 100644 index 0000000000..831eb2e2d9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/All.lean @@ -0,0 +1,28 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Fields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Frobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Indices +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Norm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormConjugation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormLaws +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PadicCyclicClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PrimeElements +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ProfiniteIntegerFiniteQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Valuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ValuationLaws +/-! +# Degree and valuation data + +Focused aggregate for abstract fields, normalized degrees, Frobenius, norms, prime elements, and +valuation laws used by class formations. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Fields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Fields.lean new file mode 100644 index 0000000000..11dcf02f33 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Fields.lean @@ -0,0 +1,1318 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.GroupTheory.QuotientGroup.Basic +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Indices +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteInteger + +/-! # Fields -/ + +@[expose] public section +namespace ClassFormation + +open CyclicCohomology + +/-! +# normalized degree and Frobenius theory: the initial datum and abstract fields + +This file records the opening datum of abstract valuation theory and the +residue and ramification indices attached to inclusions of abstract fields. +As in, a field is represented contravariantly by a closed subgroup of the +ambient profinite group. +-/ + +noncomputable +section + +universe u + +/-- The multiplicative presentation of `ℤ̂`; multiplication here is addition +in the profinite integers. -/ +abbrev ZHatMul : Type 0 := Multiplicative ZHat + +/-- The degree datum on a topological group: a continuous surjection +`d : G → ℤ̂`. Profinite hypotheses belong to the ambient group and are +requested only by results that use them; they are not duplicated as proof +fields inside this datum. -/ +structure DegreeData (G : Type*) [Group G] [TopologicalSpace G] where + /-- The continuous degree homomorphism to the profinite integers. -/ + degree : G →ₜ* ZHatMul + /-- The degree homomorphism is surjective. -/ + degree_surjective : Function.Surjective degree + +variable {G : Type u} [Group G] [TopologicalSpace G] + +/-- The distinguished base field, represented contravariantly by the full +ambient group. -/ +def baseField (G : Type u) [Group G] [TopologicalSpace G] : ClosedSubgroup G where + toSubgroup := ⊤ + isClosed' := isClosed_univ + +/-- The distinguished base field is represented by the full ambient subgroup. -/ +@[simp] +theorem baseField_toSubgroup (G : Type u) [Group G] [TopologicalSpace G] : + (baseField G).toSubgroup = ⊤ := + rfl + +/-- Every abstract field lies over the distinguished base field. -/ +theorem le_baseField (K : ClosedSubgroup G) : + K.toSubgroup ≤ (baseField G).toSubgroup := + le_top + +namespace DegreeData + +/-- The inertia group `I = ker d`, including its closedness. -/ +def inertia (D : DegreeData G) : ClosedSubgroup G where + toSubgroup := D.degree.toMonoidHom.ker + isClosed' := by + change IsClosed {g : G | (D.degree g).toAdd = 0} + exact isClosed_eq D.degree.continuous_toFun continuous_const + +/-- An element is inertial exactly when its degree is the multiplicative identity. -/ +@[simp] +theorem mem_inertia_iff (D : DegreeData G) (g : G) : + g ∈ D.inertia ↔ D.degree g = 1 := + Iff.rfl + +/-- The restriction of `d` to the subgroup representing an abstract field. -/ +def restrictedDegree (D : DegreeData G) (K : ClosedSubgroup G) : + K.toSubgroup →ₜ* ZHatMul where + toMonoidHom := D.degree.toMonoidHom.comp K.toSubgroup.subtype + continuous_toFun := D.degree.continuous_toFun.comp continuous_subtype_val + +/-- The restricted degree map evaluates through the underlying ambient element. -/ +@[simp] +theorem restrictedDegree_apply (D : DegreeData G) (K : ClosedSubgroup G) + (k : K.toSubgroup) : D.restrictedDegree K k = D.degree k.1 := + rfl + +/-- The image `d(G_K)` in `ℤ̂`. -/ +def fieldImage (D : DegreeData G) (K : ClosedSubgroup G) : Subgroup ZHatMul := + (D.restrictedDegree K).toMonoidHom.range + +/-- The field's degree image is the image of its subgroup under the ambient degree map. -/ +theorem fieldImage_eq_map (D : DegreeData G) (K : ClosedSubgroup G) : + D.fieldImage K = K.toSubgroup.map D.degree.toMonoidHom := by + ext z + constructor + · rintro ⟨k, rfl⟩ + exact ⟨k.1, k.2, rfl⟩ + · rintro ⟨g, hg, rfl⟩ + exact ⟨⟨g, hg⟩, rfl⟩ + +/-- The inertia group `I_K = G_K ∩ I` over `K`. -/ +def fieldInertia (D : DegreeData G) (K : ClosedSubgroup G) : ClosedSubgroup G := + K ⊓ D.inertia + +/-- Field inertia consists of field elements whose ambient degree is one. -/ +@[simp] +theorem mem_fieldInertia_iff (D : DegreeData G) (K : ClosedSubgroup G) (g : G) : + g ∈ D.fieldInertia K ↔ g ∈ K ∧ D.degree g = 1 := + Iff.rfl + +/-- `I_K` viewed inside `G_K`; equivalently, the kernel of `d|G_K`. -/ +def fieldInertiaWithin (D : DegreeData G) (K : ClosedSubgroup G) : + Subgroup K.toSubgroup := + (D.restrictedDegree K).toMonoidHom.ker + +/-- The degree kernel defining inertia inside a field subgroup is normal. -/ +instance fieldInertiaWithin_normal (D : DegreeData G) (K : ClosedSubgroup G) : + (D.fieldInertiaWithin K).Normal := by + rw [fieldInertiaWithin] + infer_instance + +/-- Membership in internal field inertia is equivalent to having ambient degree one. -/ +@[simp] +theorem mem_fieldInertiaWithin_iff (D : DegreeData G) (K : ClosedSubgroup G) + (k : K.toSubgroup) : k ∈ D.fieldInertiaWithin K ↔ D.degree k.1 = 1 := + Iff.rfl + +/-- The absolute residue degree as the cardinality of the actual quotient of +`ZHat` by the degree image. -/ +noncomputable def residueDegreeCardinal (D : DegreeData G) + (K : ClosedSubgroup G) : Cardinal := + relativeIndexCardinal + (show D.fieldImage K ≤ (⊤ : Subgroup ZHatMul) from le_top) + +/-- The actual quotient whose cardinality is the absolute residue degree. -/ +def residueQuotient (D : DegreeData G) (K : ClosedSubgroup G) : Type := + (⊤ : Subgroup ZHatMul) ⧸ (D.fieldImage K).subgroupOf ⊤ + +/-- The cardinal residue degree is the cardinality of the concrete residue quotient. -/ +@[simp] theorem residueDegreeCardinal_eq_mk_residueQuotient + (D : DegreeData G) (K : ClosedSubgroup G) : + D.residueDegreeCardinal K = Cardinal.mk (D.residueQuotient K) := + rfl + +/-- The distinguished base field has absolute residue degree one, without +passing through a natural-valued subgroup index. -/ +theorem residueDegreeCardinal_baseField (D : DegreeData G) : + D.residueDegreeCardinal (baseField G) = 1 := by + change + intersectionIndexCardinal (D.fieldImage (baseField G)) + (⊤ : Subgroup ZHatMul) = 1 + rw [D.fieldImage_eq_map, baseField_toSubgroup, + Subgroup.map_top_of_surjective _ D.degree_surjective] + change Cardinal.mk (↥(⊤ : Subgroup ZHatMul) ⧸ ⊤) = 1 + let : Subsingleton (↥(⊤ : Subgroup ZHatMul) ⧸ + (⊤ : Subgroup ↥(⊤ : Subgroup ZHatMul))) := + QuotientGroup.subsingleton_quotient_top + exact Cardinal.mk_eq_one _ + +/-- An abstract field together with finiteness of its actual degree-image +quotient. Its numerical residue degree is therefore genuinely positive. -/ +structure FiniteResidueAbstractField (D : DegreeData G) where + /-- The closed subgroup representing the abstract field. -/ + field : ClosedSubgroup G + /-- The field's residue quotient is finite. -/ + finiteResidueQuotient : Finite (D.residueQuotient field) + +namespace FiniteResidueAbstractField + +variable {D : DegreeData G} + +/-- Bundle a field at the boundary where its actual residue quotient is known +to be finite. -/ +def ofField (D : DegreeData G) (K : ClosedSubgroup G) + [hfinite : Finite (D.residueQuotient K)] : + FiniteResidueAbstractField D where + field := K + finiteResidueQuotient := hfinite + +/-- The underlying subgroup. -/ +@[implicit_reducible] +def toSubgroup (K : FiniteResidueAbstractField D) : Subgroup G := + K.field.toSubgroup + +/-- A finite-residue abstract field supplies finiteness of its residue quotient. -/ +instance (K : FiniteResidueAbstractField D) : + Finite (D.residueQuotient K.field) := + K.finiteResidueQuotient + +/-- The positive absolute residue degree. -/ +noncomputable def residueDegree (K : FiniteResidueAbstractField D) : ℕ+ := by + letI : Nonempty (D.residueQuotient K.field) := ⟨QuotientGroup.mk 1⟩ + exact ⟨Nat.card (D.residueQuotient K.field), Nat.card_pos⟩ + +/-- The natural value of the positive residue degree is the quotient's `Nat.card`. -/ +@[simp] theorem residueDegree_coe (K : FiniteResidueAbstractField D) : + (K.residueDegree : ℕ) = Nat.card (D.residueQuotient K.field) := + rfl + +/-- Cardinal-to-positive-natural specialization at the finite boundary. -/ +theorem residueDegreeCardinal_eq_coe + (K : FiniteResidueAbstractField D) : + D.residueDegreeCardinal K.field = ((K.residueDegree : ℕ) : Cardinal) := by + change Cardinal.mk (D.residueQuotient K.field) = + (Nat.card (D.residueQuotient K.field) : Cardinal) + exact Nat.cast_card.symm + +end FiniteResidueAbstractField + +end DegreeData + +namespace DegreeData + +/-- An abstract field extension, including the containment which makes the +notation `L / K` meaningful in the closed-subgroup model. Keeping this proof +in the object prevents predicates for extensions from being formed for +unrelated closed subgroups. -/ +structure AbstractExtension (G : Type*) [Group G] [TopologicalSpace G] where + /-- The closed subgroup contravariantly representing the extension field. -/ + field : ClosedSubgroup G + /-- The closed subgroup contravariantly representing the base field. -/ + base : ClosedSubgroup G + /-- Contravariance turns the field inclusion into this subgroup inclusion. -/ + below : field.toSubgroup ≤ base.toSubgroup + +namespace AbstractExtension + +/-- The subgroup of the base group represented by the extension field. This +projection packages the proof-dependent `subgroupOf` construction behind the +extension object. -/ +def subgroup (E : AbstractExtension G) : Subgroup E.base.toSubgroup := + extensionSubgroup E.base E.field E.below + +/-- The actual relative coset space of an abstract extension. -/ +def quotient (E : AbstractExtension G) : Type u := + E.base.toSubgroup ⧸ E.subgroup + +/-- The honest cardinal degree of an arbitrary abstract extension. Unlike +the raw natural-valued subgroup index, this does not encode infinity as zero. -/ +noncomputable def degreeCardinal (E : AbstractExtension G) : Cardinal := + relativeIndexCardinal E.below + +/-- The cardinal degree of an abstract extension is the cardinality of its coset space. -/ +@[simp] theorem degreeCardinal_eq_mk_quotient (E : AbstractExtension G) : + E.degreeCardinal = Cardinal.mk E.quotient := + rfl + +/-- The relative residue degree of an arbitrary abstract extension, as the +cardinality of the actual coset type of degree images. This is the canonical +general API: an infinite residue degree remains an infinite cardinal. -/ +noncomputable def relativeResidueDegreeCardinal + (E : AbstractExtension G) (D : DegreeData G) : Cardinal := + relativeIndexCardinal (Subgroup.map_mono (f := D.degree.toMonoidHom) E.below) + +/-- The relative ramification index of an arbitrary abstract extension, as +the cardinality of the actual coset type inside the degree kernel. In +particular, infinity is not encoded as zero. -/ +noncomputable def relativeRamificationIndexCardinal + (E : AbstractExtension G) (D : DegreeData G) : Cardinal := + relativeIndexCardinal + (show E.field.toSubgroup ⊓ D.degree.toMonoidHom.ker ≤ + E.base.toSubgroup ⊓ D.degree.toMonoidHom.ker from + inf_le_inf E.below le_rfl) + +/-- The cardinal-valued fundamental identity for an arbitrary abstract +extension. The residue cardinal is lifted from the universe of `ZHat`; no +finiteness assumption or infinite-index convention is involved. -/ +theorem degreeCardinal_eq_residueDegreeCardinal_mul_ramificationIndexCardinal + (E : AbstractExtension G) (D : DegreeData G) : + E.degreeCardinal = + Cardinal.lift.{u} (E.relativeResidueDegreeCardinal D) * + E.relativeRamificationIndexCardinal D := by + simpa [degreeCardinal, relativeResidueDegreeCardinal, + relativeRamificationIndexCardinal] using + (relativeIndexCardinal_eq_map_mul_inf_ker + D.degree.toMonoidHom E.below) + +/-- Cardinal Frobenius residue-degree compatibility: the relative residue +cardinal times the absolute residue cardinal of the base is the absolute +residue cardinal of the extension field. -/ +theorem relativeResidueDegreeCardinal_mul_residueDegreeCardinal + (E : AbstractExtension G) (D : DegreeData G) : + E.relativeResidueDegreeCardinal D * D.residueDegreeCardinal E.base = + D.residueDegreeCardinal E.field := by + change + intersectionIndexCardinal + (E.field.toSubgroup.map D.degree.toMonoidHom) + (E.base.toSubgroup.map D.degree.toMonoidHom) * + intersectionIndexCardinal (D.fieldImage E.base) (⊤ : Subgroup ZHatMul) = + intersectionIndexCardinal (D.fieldImage E.field) (⊤ : Subgroup ZHatMul) + rw [D.fieldImage_eq_map, + D.fieldImage_eq_map] + simpa only [relativeIndexCardinal] using + (relativeIndexCardinal_mul + (Subgroup.map_mono (f := D.degree.toMonoidHom) E.below) + (show E.base.toSubgroup.map D.degree.toMonoidHom ≤ + (⊤ : Subgroup ZHatMul) from le_top)) + +/-- A composable tower of abstract extensions, represented by three closed +subgroups and the two adjacent containments. -/ +structure Tower (G : Type*) [Group G] [TopologicalSpace G] where + /-- The closed subgroup representing the top field. -/ + top : ClosedSubgroup G + /-- The closed subgroup representing the middle field. -/ + middle : ClosedSubgroup G + /-- The closed subgroup representing the base field. -/ + base : ClosedSubgroup G + /-- Contravariant containment for the top-to-middle extension. -/ + top_le_middle : top.toSubgroup ≤ middle.toSubgroup + /-- Contravariant containment for the middle-to-base extension. -/ + middle_le_base : middle.toSubgroup ≤ base.toSubgroup + +namespace Tower + +variable (T : Tower G) + +/-- The upper extension in a tower. -/ +def topExtension : AbstractExtension G where + field := T.top + base := T.middle + below := T.top_le_middle + +/-- The lower extension in a tower. -/ +def baseExtension : AbstractExtension G where + field := T.middle + base := T.base + below := T.middle_le_base + +/-- The composite extension in a tower. -/ +def totalExtension : AbstractExtension G where + field := T.top + base := T.base + below := T.top_le_middle.trans T.middle_le_base + +/-- Cardinal degrees multiply in an arbitrary abstract-extension tower. -/ +theorem degreeCardinal_mul : + T.topExtension.degreeCardinal * T.baseExtension.degreeCardinal = + T.totalExtension.degreeCardinal := by + exact relativeIndexCardinal_mul T.top_le_middle T.middle_le_base + +/-- Cardinal residue degrees multiply in an arbitrary abstract-extension +tower. -/ +theorem relativeResidueDegreeCardinal_mul (D : DegreeData G) : + T.topExtension.relativeResidueDegreeCardinal D * + T.baseExtension.relativeResidueDegreeCardinal D = + T.totalExtension.relativeResidueDegreeCardinal D := by + exact relativeIndexCardinal_mul + (Subgroup.map_mono (f := D.degree.toMonoidHom) T.top_le_middle) + (Subgroup.map_mono (f := D.degree.toMonoidHom) T.middle_le_base) + +/-- Cardinal ramification indices multiply in an arbitrary +abstract-extension tower. -/ +theorem relativeRamificationIndexCardinal_mul (D : DegreeData G) : + T.topExtension.relativeRamificationIndexCardinal D * + T.baseExtension.relativeRamificationIndexCardinal D = + T.totalExtension.relativeRamificationIndexCardinal D := by + exact relativeIndexCardinal_mul + (show T.top.toSubgroup ⊓ D.degree.toMonoidHom.ker ≤ + T.middle.toSubgroup ⊓ D.degree.toMonoidHom.ker from + inf_le_inf T.top_le_middle le_rfl) + (show T.middle.toSubgroup ⊓ D.degree.toMonoidHom.ker ≤ + T.base.toSubgroup ⊓ D.degree.toMonoidHom.ker from + inf_le_inf T.middle_le_base le_rfl) + +end Tower + +/-- An abstract extension is unramified when the inertia subgroup of its base +is already contained in the subgroup representing its field. This +containment is the definition; it does not pass through a natural-valued index +that would encode an infinite index as zero. -/ +def IsUnramified (E : AbstractExtension G) (D : DegreeData G) : Prop := + E.base.toSubgroup ⊓ D.degree.toMonoidHom.ker ≤ E.field.toSubgroup + +/-- An abstract extension is totally ramified when the degree image of its +base is contained in the degree image of its field. -/ +def IsTotallyRamified (E : AbstractExtension G) (D : DegreeData G) : Prop := + E.base.toSubgroup.map D.degree.toMonoidHom ≤ + E.field.toSubgroup.map D.degree.toMonoidHom + +/-- An extension is unramified exactly when the inertia subgroup of its base +is contained in the subgroup representing its field. The containment needed +to form the extension is carried by `E`. -/ +theorem isUnramified_iff_inertia_le (E : AbstractExtension G) (D : DegreeData G) : + E.IsUnramified D ↔ + E.base.toSubgroup ⊓ D.degree.toMonoidHom.ker ≤ E.field.toSubgroup := + Iff.rfl + +/-- An extension is totally ramified exactly when the degree image of its +base is contained in the degree image of its field. -/ +theorem isTotallyRamified_iff_image_le (E : AbstractExtension G) (D : DegreeData G) : + E.IsTotallyRamified D ↔ + E.base.toSubgroup.map D.degree.toMonoidHom ≤ + E.field.toSubgroup.map D.degree.toMonoidHom := + Iff.rfl + +/-- An unramified extension has cardinal ramification index one. -/ +theorem relativeRamificationIndexCardinal_eq_one_of_isUnramified + (E : AbstractExtension G) (D : DegreeData G) (hE : E.IsUnramified D) : + E.relativeRamificationIndexCardinal D = 1 := by + have heq : + E.field.toSubgroup ⊓ D.degree.toMonoidHom.ker = + E.base.toSubgroup ⊓ D.degree.toMonoidHom.ker := by + apply le_antisymm + · exact inf_le_inf E.below le_rfl + · intro x hx + exact ⟨hE hx, hx.2⟩ + change + intersectionIndexCardinal + (E.field.toSubgroup ⊓ D.degree.toMonoidHom.ker) + (E.base.toSubgroup ⊓ D.degree.toMonoidHom.ker) = 1 + rw [heq] + exact relativeIndexCardinal_self _ + +/-- A totally ramified extension has cardinal residue degree one. -/ +theorem relativeResidueDegreeCardinal_eq_one_of_isTotallyRamified + (E : AbstractExtension G) (D : DegreeData G) + (hE : E.IsTotallyRamified D) : + E.relativeResidueDegreeCardinal D = 1 := by + have heq : + E.field.toSubgroup.map D.degree.toMonoidHom = + E.base.toSubgroup.map D.degree.toMonoidHom := + le_antisymm (Subgroup.map_mono (f := D.degree.toMonoidHom) E.below) hE + change + intersectionIndexCardinal + (E.field.toSubgroup.map D.degree.toMonoidHom) + (E.base.toSubgroup.map D.degree.toMonoidHom) = 1 + rw [heq] + exact relativeIndexCardinal_self _ + +/-- For an unramified extension, its cardinal degree is its lifted residue +degree. -/ +theorem degreeCardinal_eq_lift_relativeResidueDegreeCardinal_of_isUnramified + (E : AbstractExtension G) (D : DegreeData G) (hE : E.IsUnramified D) : + E.degreeCardinal = + Cardinal.lift.{u} (E.relativeResidueDegreeCardinal D) := by + rw [E.degreeCardinal_eq_residueDegreeCardinal_mul_ramificationIndexCardinal D, + E.relativeRamificationIndexCardinal_eq_one_of_isUnramified D hE, mul_one] + +/-- For a totally ramified extension, its cardinal degree is its +ramification cardinal. -/ +theorem degreeCardinal_eq_relativeRamificationIndexCardinal_of_isTotallyRamified + (E : AbstractExtension G) (D : DegreeData G) + (hE : E.IsTotallyRamified D) : + E.degreeCardinal = E.relativeRamificationIndexCardinal D := by + rw [E.degreeCardinal_eq_residueDegreeCardinal_mul_ramificationIndexCardinal D, + E.relativeResidueDegreeCardinal_eq_one_of_isTotallyRamified D hE] + simp + +end AbstractExtension + +/-- A (not necessarily finite) Galois extension above `K`. Normality and +the inclusion of the upper field are carried by the object, while no +finiteness assumption is introduced. -/ +structure GaloisSubextension (K : ClosedSubgroup G) where + /-- The closed subgroup representing the top field. -/ + field : ClosedSubgroup G + /-- The top-field subgroup is contained in the base-field subgroup. -/ + below : field.toSubgroup ≤ K.toSubgroup + /-- The relative subgroup is normal in the base-field subgroup. -/ + normal : (extensionSubgroup K field below).Normal + +namespace GaloisSubextension + +variable {K : ClosedSubgroup G} + +/-- Forget normality while retaining the underlying abstract extension. -/ +def toAbstractExtension (L : GaloisSubextension K) : + DegreeData.AbstractExtension G where + field := L.field + base := K + below := L.below + +/-- The actual quotient represented by a Galois subextension. This is a +named object boundary rather than a transparent abbreviation. -/ +def extensionQuotient (L : GaloisSubextension K) : Type u := + K.toSubgroup ⧸ extensionSubgroup K L.field L.below + +/-- Structural unramifiedness of a Galois subextension. -/ +def IsUnramified (L : GaloisSubextension K) (D : DegreeData G) : Prop := + L.toAbstractExtension.IsUnramified D + +/-- Structural total ramification of a Galois subextension. -/ +def IsTotallyRamified (L : GaloisSubextension K) (D : DegreeData G) : Prop := + L.toAbstractExtension.IsTotallyRamified D + +/-- A Galois subextension has a normal subgroup inside its base subgroup. -/ +instance extensionSubgroup_normalInstance (L : GaloisSubextension K) : + (extensionSubgroup K L.field L.below).Normal := + L.normal + +/-- The group structure transported across the named quotient boundary. -/ +instance extensionQuotientGroupInstance (L : GaloisSubextension K) : + Group L.extensionQuotient := by + change Group + (K.toSubgroup ⧸ extensionSubgroup K L.field L.below) + infer_instance + +/-- Comparison with the quotient presentation used by the underlying group +library. -/ +def extensionQuotientMulEquiv (L : GaloisSubextension K) : + L.extensionQuotient ≃* + (K.toSubgroup ⧸ extensionSubgroup K L.field L.below) := + MulEquiv.refl _ + +/-- The canonical quotient projection for a Galois subextension. -/ +def extensionQuotientMk (L : GaloisSubextension K) : + K.toSubgroup →* L.extensionQuotient := + QuotientGroup.mk' (extensionSubgroup K L.field L.below) + +/-- The named quotient projection agrees with `QuotientGroup.mk` under the +comparison equivalence. -/ +@[simp] +theorem extensionQuotientMk_apply (L : GaloisSubextension K) + (k : K.toSubgroup) : + L.extensionQuotientMulEquiv (L.extensionQuotientMk k) = + (QuotientGroup.mk k : + K.toSubgroup ⧸ extensionSubgroup K L.field L.below) := + rfl + +/-- Eliminate a Galois quotient without exposing a chosen representative. -/ +protected theorem extensionQuotient_inductionOn + (L : GaloisSubextension K) {motive : L.extensionQuotient → Prop} + (q : L.extensionQuotient) + (mk : ∀ k : K.toSubgroup, motive (L.extensionQuotientMk k)) : + motive q := by + exact @Quotient.inductionOn' K.toSubgroup + (QuotientGroup.leftRel (extensionSubgroup K L.field L.below)) + motive q mk + +/-- Unramifiedness is the canonical inertia-containment condition. -/ +theorem isUnramified_iff_inertia_le (L : GaloisSubextension K) + (D : DegreeData G) : + L.IsUnramified D ↔ + K.toSubgroup ⊓ D.degree.toMonoidHom.ker ≤ L.field.toSubgroup := + L.toAbstractExtension.isUnramified_iff_inertia_le D + +/-- Total ramification is the canonical equality of degree images. -/ +theorem isTotallyRamified_iff_image_le (L : GaloisSubextension K) + (D : DegreeData G) : + L.IsTotallyRamified D ↔ + K.toSubgroup.map D.degree.toMonoidHom ≤ + L.field.toSubgroup.map D.degree.toMonoidHom := + L.toAbstractExtension.isTotallyRamified_iff_image_le D + +end GaloisSubextension + +/-- A finite abstract extension. Finiteness is carried by the extension +object, so its public numerical invariants can be positive naturals rather than +using the raw subgroup-index convention in which an infinite index is encoded +as `0`. -/ +structure FiniteAbstractExtension (G : Type*) [Group G] [TopologicalSpace G] + extends AbstractExtension G where + /-- The relative quotient of the base subgroup by the extension subgroup is finite. -/ + finiteQuotient : + Finite + (toAbstractExtension.base.toSubgroup ⧸ + extensionSubgroup toAbstractExtension.base toAbstractExtension.field + toAbstractExtension.below) + +namespace FiniteAbstractExtension + +variable (E : FiniteAbstractExtension G) + +/-- The subgroup of the base represented by a finite extension. -/ +def subgroup : Subgroup E.base.toSubgroup := + extensionSubgroup E.base E.field E.below + +/-- The finite extension's actual relative coset space. -/ +def quotient : Type u := + E.base.toSubgroup ⧸ E.subgroup + +/-- Bundle an inclusion once its actual relative coset type is known to be +finite. This is the canonical boundary from subgroup data to the finite +extension API; numerical invariants are obtained only from the resulting +object. -/ +def ofInclusion (field base : ClosedSubgroup G) + (below : field.toSubgroup ≤ base.toSubgroup) + [hfinite : Finite + (base.toSubgroup ⧸ extensionSubgroup base field below)] : + FiniteAbstractExtension G where + field := field + base := base + below := below + finiteQuotient := hfinite + +/-- The field endpoint of an extension bundled from an inclusion is the supplied field. -/ +@[simp] theorem ofInclusion_field (field base : ClosedSubgroup G) + (below : field.toSubgroup ≤ base.toSubgroup) + [Finite (base.toSubgroup ⧸ extensionSubgroup base field below)] : + (ofInclusion field base below).field = field := + rfl + +/-- The base endpoint of an extension bundled from an inclusion is the supplied base. -/ +@[simp] theorem ofInclusion_base (field base : ClosedSubgroup G) + (below : field.toSubgroup ≤ base.toSubgroup) + [Finite (base.toSubgroup ⧸ extensionSubgroup base field below)] : + (ofInclusion field base below).base = base := + rfl + +/-- The unramified predicate for a finite extension is the predicate on its +underlying abstract extension. -/ +def IsUnramified (D : DegreeData G) : Prop := + E.toAbstractExtension.IsUnramified D + +/-- The totally ramified predicate for a finite extension is the predicate on +its underlying abstract extension. -/ +def IsTotallyRamified (D : DegreeData G) : Prop := + E.toAbstractExtension.IsTotallyRamified D + +/-- Finite-extension unramifiedness is exactly unramifiedness of the underlying +abstract extension. -/ +@[simp] theorem isUnramified_iff (D : DegreeData G) : + E.IsUnramified D ↔ E.toAbstractExtension.IsUnramified D := + Iff.rfl + +/-- Finite-extension total ramification is inherited from the underlying abstract extension. -/ +@[simp] theorem isTotallyRamified_iff (D : DegreeData G) : + E.IsTotallyRamified D ↔ E.toAbstractExtension.IsTotallyRamified D := + Iff.rfl + +/-- Finite unramified extensions satisfy the same inertia-containment +characterization as their underlying abstract extensions. -/ +theorem isUnramified_iff_inertia_le (D : DegreeData G) : + E.IsUnramified D ↔ + E.base.toSubgroup ⊓ D.degree.toMonoidHom.ker ≤ E.field.toSubgroup := + E.toAbstractExtension.isUnramified_iff_inertia_le D + +/-- Finite totally ramified extensions satisfy the same degree-image +characterization as their underlying abstract extensions. -/ +theorem isTotallyRamified_iff_image_le (D : DegreeData G) : + E.IsTotallyRamified D ↔ + E.base.toSubgroup.map D.degree.toMonoidHom ≤ + E.field.toSubgroup.map D.degree.toMonoidHom := + E.toAbstractExtension.isTotallyRamified_iff_image_le D + +/-- The coset space carried by a finite abstract extension is finite. -/ +instance quotientFinite : + Finite E.quotient := by + simpa [quotient, subgroup] using E.finiteQuotient + +/-- The finite instance in the concrete quotient presentation used by norm +maps. -/ +instance representedQuotientFinite : + Finite + (E.base.toSubgroup ⧸ + extensionSubgroup E.base E.field E.below) := + E.finiteQuotient + +private theorem degreeCardinal_lt_aleph0 : + E.toAbstractExtension.degreeCardinal < Cardinal.aleph0 := by + change Cardinal.mk + (E.base.toSubgroup ⧸ extensionSubgroup E.base E.field E.below) < + Cardinal.aleph0 + exact Cardinal.lt_aleph0_of_finite _ + +private theorem relativeDegreeCardinals_lt_aleph0 (D : DegreeData G) : + Cardinal.lift.{u} + (E.toAbstractExtension.relativeResidueDegreeCardinal D) < + Cardinal.aleph0 ∧ + E.toAbstractExtension.relativeRamificationIndexCardinal D < + Cardinal.aleph0 := by + have hresidueUnlifted : + E.toAbstractExtension.relativeResidueDegreeCardinal D ≠ 0 := by + rw [AbstractExtension.relativeResidueDegreeCardinal, + relativeIndexCardinal, intersectionIndexCardinal] + exact Cardinal.mk_ne_zero _ + have hresidue : + Cardinal.lift.{u} + (E.toAbstractExtension.relativeResidueDegreeCardinal D) ≠ 0 := by + intro hzero + exact hresidueUnlifted (Cardinal.lift_eq_zero.mp hzero) + have hramification : + E.toAbstractExtension.relativeRamificationIndexCardinal D ≠ 0 := by + rw [AbstractExtension.relativeRamificationIndexCardinal, + relativeIndexCardinal, intersectionIndexCardinal] + exact Cardinal.mk_ne_zero _ + apply (Cardinal.mul_lt_aleph0_iff_of_ne_zero + hresidue hramification).mp + rw [← + E.toAbstractExtension.degreeCardinal_eq_residueDegreeCardinal_mul_ramificationIndexCardinal D] + exact E.degreeCardinal_lt_aleph0 + +private theorem relativeResidueDegreeCardinal_lt_aleph0 + (D : DegreeData G) : + E.toAbstractExtension.relativeResidueDegreeCardinal D < + Cardinal.aleph0 := + Cardinal.lift_lt_aleph0.mp (E.relativeDegreeCardinals_lt_aleph0 D).1 + +private theorem relativeRamificationIndexCardinal_lt_aleph0 + (D : DegreeData G) : + E.toAbstractExtension.relativeRamificationIndexCardinal D < + Cardinal.aleph0 := + (E.relativeDegreeCardinals_lt_aleph0 D).2 + +/-- The residue coset type of a finite extension is finite. This is derived +from the cardinal fundamental identity, rather than from a natural-valued +index whose infinite case would be represented by zero. -/ +noncomputable instance residueQuotientFinite (D : DegreeData G) : + Finite + (↥(E.base.toSubgroup.map D.degree.toMonoidHom) ⧸ + (E.field.toSubgroup.map D.degree.toMonoidHom).subgroupOf + (E.base.toSubgroup.map D.degree.toMonoidHom)) := by + apply Cardinal.lt_aleph0_iff_finite.mp + simpa [AbstractExtension.relativeResidueDegreeCardinal, + relativeIndexCardinal, intersectionIndexCardinal] using + E.relativeResidueDegreeCardinal_lt_aleph0 D + +/-- The inertia coset type of a finite extension is finite. As for the +residue quotient, this is a consequence of the cardinal fundamental identity. -/ +noncomputable instance ramificationQuotientFinite (D : DegreeData G) : + Finite + (↥(E.base.toSubgroup ⊓ D.degree.toMonoidHom.ker) ⧸ + (E.field.toSubgroup ⊓ D.degree.toMonoidHom.ker).subgroupOf + (E.base.toSubgroup ⊓ D.degree.toMonoidHom.ker)) := by + apply Cardinal.lt_aleph0_iff_finite.mp + simpa [AbstractExtension.relativeRamificationIndexCardinal, + relativeIndexCardinal, intersectionIndexCardinal] using + E.relativeRamificationIndexCardinal_lt_aleph0 D + +/-- The positive degree of a finite abstract extension. -/ +def degree : ℕ+ := + by + letI : Nonempty E.quotient := + ⟨QuotientGroup.mk 1⟩ + exact ⟨Nat.card E.quotient, Nat.card_pos⟩ + +/-- The positive relative residue degree of a finite abstract extension. -/ +def residueDegree (D : DegreeData G) : ℕ+ := + ⟨Nat.card + (↥(E.base.toSubgroup.map D.degree.toMonoidHom) ⧸ + (E.field.toSubgroup.map D.degree.toMonoidHom).subgroupOf + (E.base.toSubgroup.map D.degree.toMonoidHom)), + Nat.card_pos⟩ + +/-- The positive relative ramification index of a finite abstract extension. -/ +def ramificationIndex (D : DegreeData G) : ℕ+ := + ⟨Nat.card + (↥(E.base.toSubgroup ⊓ D.degree.toMonoidHom.ker) ⧸ + (E.field.toSubgroup ⊓ D.degree.toMonoidHom.ker).subgroupOf + (E.base.toSubgroup ⊓ D.degree.toMonoidHom.ker)), + Nat.card_pos⟩ + +/-- The natural value of the positive extension degree is the cardinality of its quotient. -/ +@[simp] theorem degree_coe : + (E.degree : ℕ) = Nat.card E.quotient := + rfl + +/-- The positive residue degree coerces to the cardinality of the mapped-subgroup quotient. -/ +@[simp] theorem residueDegree_coe (D : DegreeData G) : + (E.residueDegree D : ℕ) = + Nat.card + (↥(E.base.toSubgroup.map D.degree.toMonoidHom) ⧸ + (E.field.toSubgroup.map D.degree.toMonoidHom).subgroupOf + (E.base.toSubgroup.map D.degree.toMonoidHom)) := + rfl + +/-- The positive ramification index coerces to the cardinality of the inertia quotient. -/ +@[simp] theorem ramificationIndex_coe (D : DegreeData G) : + (E.ramificationIndex D : ℕ) = + Nat.card + (↥(E.base.toSubgroup ⊓ D.degree.toMonoidHom.ker) ⧸ + (E.field.toSubgroup ⊓ D.degree.toMonoidHom.ker).subgroupOf + (E.base.toSubgroup ⊓ D.degree.toMonoidHom.ker)) := + rfl + +/-- The underlying subgroup index of a finite extension is the natural +coercion of its positive degree. This theorem is a finite-only bridge, not a +general natural-valued degree definition. -/ +@[simp] theorem relIndex_eq_degree : + E.field.toSubgroup.relIndex E.base.toSubgroup = (E.degree : ℕ) := by + rw [Subgroup.relIndex, Subgroup.index, E.degree_coe] + rfl + +/-- The index of the represented extension subgroup is the finite extension +degree. -/ +@[simp] theorem extensionSubgroup_index_eq_degree : + (extensionSubgroup E.base E.field E.below).index = (E.degree : ℕ) := by + rw [Subgroup.index, E.degree_coe] + rfl + +/-- The relative index of the mapped field subgroups is the positive residue +degree of a finite extension. -/ +theorem mapped_relIndex_eq_residueDegree (D : DegreeData G) : + (E.field.toSubgroup.map D.degree.toMonoidHom).relIndex + (E.base.toSubgroup.map D.degree.toMonoidHom) = + (E.residueDegree D : ℕ) := by + rw [Subgroup.relIndex, Subgroup.index, E.residueDegree_coe] + +/-- The relative index inside the degree kernel is the positive ramification +index of a finite extension. -/ +theorem inertia_relIndex_eq_ramificationIndex (D : DegreeData G) : + (E.field.toSubgroup ⊓ D.degree.toMonoidHom.ker).relIndex + (E.base.toSubgroup ⊓ D.degree.toMonoidHom.ker) = + (E.ramificationIndex D : ℕ) := by + rw [Subgroup.relIndex, Subgroup.index, E.ramificationIndex_coe] + +/-- The finite fundamental identity, stated only in terms of the positive +invariants carried by a finite extension object. -/ +theorem degree_eq_residueDegree_mul_ramificationIndex (D : DegreeData G) : + (E.degree : ℕ) = + (E.residueDegree D : ℕ) * (E.ramificationIndex D : ℕ) := by + rw [← E.relIndex_eq_degree, ← E.mapped_relIndex_eq_residueDegree D, + ← E.inertia_relIndex_eq_ramificationIndex D] + exact relIndex_eq_map_relIndex_mul_inf_ker_relIndex + D.degree.toMonoidHom E.below + +/-- An unramified finite extension has ramification index one. -/ +theorem ramificationIndex_eq_one_of_isUnramified (D : DegreeData G) + (hE : E.IsUnramified D) : + (E.ramificationIndex D : ℕ) = 1 := by + rw [← E.inertia_relIndex_eq_ramificationIndex D, + Subgroup.relIndex_eq_one] + intro x hx + exact ⟨hE hx, hx.2⟩ + +/-- A totally ramified finite extension has residue degree one. -/ +theorem residueDegree_eq_one_of_isTotallyRamified (D : DegreeData G) + (hE : E.IsTotallyRamified D) : + (E.residueDegree D : ℕ) = 1 := by + rw [← E.mapped_relIndex_eq_residueDegree D, + Subgroup.relIndex_eq_one] + exact hE + +/-- A finite extension has residue degree one exactly when it is totally +ramified. This keeps callers on the structural predicate API instead of +unfolding the image-index implementation. -/ +theorem isTotallyRamified_iff_residueDegree_eq_one (D : DegreeData G) : + E.IsTotallyRamified D ↔ (E.residueDegree D : ℕ) = 1 := by + constructor + · exact E.residueDegree_eq_one_of_isTotallyRamified D + · intro h + rw [isTotallyRamified_iff_image_le] + rw [← E.mapped_relIndex_eq_residueDegree D, + Subgroup.relIndex_eq_one] at h + exact h + +/-- Converse form convenient for constructing the structural predicate from +the positive finite invariant. -/ +theorem isTotallyRamified_of_residueDegree_eq_one (D : DegreeData G) + (h : (E.residueDegree D : ℕ) = 1) : E.IsTotallyRamified D := + (E.isTotallyRamified_iff_residueDegree_eq_one D).2 h + +/-- In an unramified finite extension, residue degree equals extension +degree. -/ +theorem residueDegree_eq_degree_of_isUnramified (D : DegreeData G) + (hE : E.IsUnramified D) : + (E.residueDegree D : ℕ) = (E.degree : ℕ) := by + rw [E.degree_eq_residueDegree_mul_ramificationIndex D, + E.ramificationIndex_eq_one_of_isUnramified D hE, mul_one] + +/-- In a totally ramified finite extension, ramification index equals +extension degree. -/ +theorem ramificationIndex_eq_degree_of_isTotallyRamified (D : DegreeData G) + (hE : E.IsTotallyRamified D) : + (E.ramificationIndex D : ℕ) = (E.degree : ℕ) := by + rw [E.degree_eq_residueDegree_mul_ramificationIndex D, + E.residueDegree_eq_one_of_isTotallyRamified D hE, one_mul] + +/-- For a finite extension, its cardinal-valued degree is the cardinal cast +of its positive natural degree. -/ +theorem degreeCardinal_eq_coe : + E.toAbstractExtension.degreeCardinal = + ((E.degree : ℕ) : Cardinal) := by + change Cardinal.mk + (E.base.toSubgroup ⧸ extensionSubgroup E.base E.field E.below) = + (Nat.card + (E.base.toSubgroup ⧸ extensionSubgroup E.base E.field E.below) : Cardinal) + simpa [quotient, subgroup] using + ((Nat.cast_card : + (Nat.card E.quotient : Cardinal) = Cardinal.mk E.quotient).symm) + +/-- For a finite extension, the cardinal-valued relative residue degree is +the cardinal cast of the positive natural residue degree. -/ +@[simp] theorem relativeResidueDegreeCardinal_eq_coe (D : DegreeData G) : + E.toAbstractExtension.relativeResidueDegreeCardinal D = + ((E.residueDegree D : ℕ) : Cardinal) := by + change Cardinal.mk + (↥(E.base.toSubgroup.map D.degree.toMonoidHom) ⧸ + (E.field.toSubgroup.map D.degree.toMonoidHom).subgroupOf + (E.base.toSubgroup.map D.degree.toMonoidHom)) = + (Nat.card + (↥(E.base.toSubgroup.map D.degree.toMonoidHom) ⧸ + (E.field.toSubgroup.map D.degree.toMonoidHom).subgroupOf + (E.base.toSubgroup.map D.degree.toMonoidHom)) : Cardinal) + exact (Nat.cast_card).symm + +/-- For a finite extension, the cardinal-valued relative ramification index +is the cardinal cast of the positive natural ramification index. -/ +@[simp] theorem relativeRamificationIndexCardinal_eq_coe (D : DegreeData G) : + E.toAbstractExtension.relativeRamificationIndexCardinal D = + ((E.ramificationIndex D : ℕ) : Cardinal) := by + change Cardinal.mk + (↥(E.base.toSubgroup ⊓ D.degree.toMonoidHom.ker) ⧸ + (E.field.toSubgroup ⊓ D.degree.toMonoidHom.ker).subgroupOf + (E.base.toSubgroup ⊓ D.degree.toMonoidHom.ker)) = + (Nat.card + (↥(E.base.toSubgroup ⊓ D.degree.toMonoidHom.ker) ⧸ + (E.field.toSubgroup ⊓ D.degree.toMonoidHom.ker).subgroupOf + (E.base.toSubgroup ⊓ D.degree.toMonoidHom.ker)) : Cardinal) + exact (Nat.cast_card).symm + +end FiniteAbstractExtension + +/-- A finite composable tower of abstract extensions. The two adjacent +finite quotient proofs belong to the tower object, so downstream norm and +degree laws do not thread subgroup containments and finiteness instances as +independent arguments. -/ +structure FiniteTower (G : Type*) [Group G] [TopologicalSpace G] + extends AbstractExtension.Tower G where + /-- The quotient for the top-to-middle extension is finite. -/ + finiteTopQuotient : Finite toTower.topExtension.quotient + /-- The quotient for the middle-to-base extension is finite. -/ + finiteBaseQuotient : Finite toTower.baseExtension.quotient + +namespace FiniteTower + +variable (T : FiniteTower G) + +/-- The upper relative quotient in a finite tower is finite. -/ +instance topQuotientFinite : + Finite (T.middle.toSubgroup ⧸ + extensionSubgroup T.middle T.top T.top_le_middle) := + T.finiteTopQuotient + +/-- The lower relative quotient in a finite tower is finite. -/ +instance baseQuotientFinite : + Finite (T.base.toSubgroup ⧸ + extensionSubgroup T.base T.middle T.middle_le_base) := + T.finiteBaseQuotient + +/-- The upper finite extension represented by a finite tower. -/ +def topExtension : FiniteAbstractExtension G where + toAbstractExtension := T.toTower.topExtension + finiteQuotient := T.finiteTopQuotient + +/-- The lower finite extension represented by a finite tower. -/ +def baseExtension : FiniteAbstractExtension G where + toAbstractExtension := T.toTower.baseExtension + finiteQuotient := T.finiteBaseQuotient + +end FiniteTower + +namespace FiniteResidueAbstractField + +variable {D : DegreeData G} + +/-- If the relative residue quotient over a field with finite absolute +residue quotient is finite, then the upper field also has finite absolute +residue quotient. This is the minimal honest boundary constructor: it uses +the actual quotient types and the cardinal tower identity. -/ +noncomputable def ofRelativeInclusion (D : DegreeData G) + (field : ClosedSubgroup G) (base : FiniteResidueAbstractField D) + (below : field.toSubgroup ≤ base.field.toSubgroup) + [finiteRelativeResidueQuotient : Finite + (↥(base.field.toSubgroup.map D.degree.toMonoidHom) ⧸ + (field.toSubgroup.map D.degree.toMonoidHom).subgroupOf + (base.field.toSubgroup.map D.degree.toMonoidHom))] : + FiniteResidueAbstractField D where + field := field + finiteResidueQuotient := by + apply Cardinal.lt_aleph0_iff_finite.mp + rw [← D.residueDegreeCardinal_eq_mk_residueQuotient] + let E : AbstractExtension G := { + field := field + base := base.field + below := below + } + rw [← E.relativeResidueDegreeCardinal_mul_residueDegreeCardinal D] + apply Cardinal.mul_lt_aleph0_iff.mpr + exact Or.inr (Or.inr ⟨by + change Cardinal.mk + (↥(base.field.toSubgroup.map D.degree.toMonoidHom) ⧸ + (field.toSubgroup.map D.degree.toMonoidHom).subgroupOf + (base.field.toSubgroup.map D.degree.toMonoidHom)) < + Cardinal.aleph0 + exact Cardinal.lt_aleph0_of_finite _, by + rw [D.residueDegreeCardinal_eq_mk_residueQuotient] + exact Cardinal.lt_aleph0_of_finite _⟩) + +end FiniteResidueAbstractField + +/-- A finite extension whose base and field both carry their honest finite +absolute residue quotients. The proof-dependent relative quotient is stored +once in the object and exposed through `toFiniteAbstractExtension`. -/ +structure FiniteResidueAbstractExtension (D : DegreeData G) where + /-- The top endpoint with its finite residue quotient. -/ + field : FiniteResidueAbstractField D + /-- The base endpoint with its finite residue quotient. -/ + base : FiniteResidueAbstractField D + /-- The top-field subgroup is contained in the base-field subgroup. -/ + below : field.field.toSubgroup ≤ base.field.toSubgroup + /-- The relative extension quotient is finite. -/ + finiteQuotient : + Finite + (base.field.toSubgroup ⧸ + extensionSubgroup base.field field.field below) + +namespace FiniteResidueAbstractExtension + +variable {D : DegreeData G} + +/-- Enrich a finite extension of a field with finite absolute residue quotient +with the corresponding honest residue data on its upper endpoint. Finiteness +of the upper absolute residue quotient is deduced from the cardinal-valued +tower identity, which is the source of truth for arbitrary-index data. -/ +noncomputable def ofInclusion (D : DegreeData G) + (field : ClosedSubgroup G) (base : FiniteResidueAbstractField D) + (below : field.toSubgroup ≤ base.field.toSubgroup) + [finiteQuotient : Finite + (base.field.toSubgroup ⧸ + extensionSubgroup base.field field below)] : + FiniteResidueAbstractExtension D where + field := { + field := field + finiteResidueQuotient := by + apply Cardinal.lt_aleph0_iff_finite.mp + rw [← D.residueDegreeCardinal_eq_mk_residueQuotient] + let E : FiniteAbstractExtension G := { + field := field + base := base.field + below := below + finiteQuotient := finiteQuotient + } + rw [← E.toAbstractExtension.relativeResidueDegreeCardinal_mul_residueDegreeCardinal D] + apply Cardinal.mul_lt_aleph0_iff.mpr + exact Or.inr (Or.inr ⟨E.relativeResidueDegreeCardinal_lt_aleph0 D, by + rw [D.residueDegreeCardinal_eq_mk_residueQuotient] + exact Cardinal.lt_aleph0_of_finite (D.residueQuotient base.field)⟩) } + base := base + below := below + finiteQuotient := finiteQuotient + +/-- Forget only the endpoint residue-finiteness data. -/ +def toFiniteAbstractExtension (E : FiniteResidueAbstractExtension D) : + FiniteAbstractExtension G where + field := E.field.field + base := E.base.field + below := E.below + finiteQuotient := E.finiteQuotient + +/-- A finite-residue extension supplies finiteness of its represented relative quotient. -/ +instance (E : FiniteResidueAbstractExtension D) : + Finite + (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) := + E.finiteQuotient + +/-- The positive relative degree. -/ +noncomputable def degree (E : FiniteResidueAbstractExtension D) : ℕ+ := + E.toFiniteAbstractExtension.degree + +/-- The positive relative residue degree. -/ +noncomputable def residueDegree (E : FiniteResidueAbstractExtension D) : ℕ+ := + E.toFiniteAbstractExtension.residueDegree D + +/-- The positive relative ramification index. -/ +noncomputable def ramificationIndex + (E : FiniteResidueAbstractExtension D) : ℕ+ := + E.toFiniteAbstractExtension.ramificationIndex D + +/-- The residue-enriched extension degree agrees with the underlying finite-extension degree. -/ +@[simp] theorem degree_coe (E : FiniteResidueAbstractExtension D) : + (E.degree : ℕ) = (E.toFiniteAbstractExtension.degree : ℕ) := + rfl + +/-- The residue-enriched residue degree agrees with the underlying finite-extension invariant. -/ +@[simp] theorem residueDegree_coe (E : FiniteResidueAbstractExtension D) : + (E.residueDegree : ℕ) = + (E.toFiniteAbstractExtension.residueDegree D : ℕ) := + rfl + +/-- The residue-enriched ramification index agrees with the underlying +finite-extension invariant. -/ +@[simp] theorem ramificationIndex_coe + (E : FiniteResidueAbstractExtension D) : + (E.ramificationIndex : ℕ) = + (E.toFiniteAbstractExtension.ramificationIndex D : ℕ) := + rfl + +end FiniteResidueAbstractExtension + +end DegreeData + +/-! ## Fields finite over the distinguished base -/ + +/-- An abstract field finite over the distinguished base field. -/ +structure FiniteAbstractField (G : Type u) [Group G] [TopologicalSpace G] where + /-- The closed subgroup representing the abstract field. -/ + field : ClosedSubgroup G + /-- The field has finite degree over the distinguished base. -/ + finite : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) field (le_baseField field)) + +namespace FiniteAbstractField + +/-- A finite abstract field is determined by its underlying closed subgroup; +the finiteness component is proof-irrelevant. -/ +theorem eq_of_field_eq (K L : FiniteAbstractField G) + (h : K.field = L.field) : K = L := by + cases K with + | mk K hK => + cases L with + | mk L hL => + cases h + rfl + +/-- The distinguished base field, bundled with its trivial finite quotient. -/ +noncomputable def base (G : Type u) [Group G] [TopologicalSpace G] : + FiniteAbstractField G where + field := baseField G + finite := by + let : (extensionSubgroup (baseField G) (baseField G) + (le_baseField (baseField G))).Normal := by + rw [show extensionSubgroup (baseField G) (baseField G) + (le_baseField (baseField G)) = ⊤ by + ext x + exact Iff.rfl] + infer_instance + let : Subsingleton + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) (baseField G) + (le_baseField (baseField G))) := by + constructor + intro x y + refine Quotient.inductionOn₂' x y ?_ + intro a b + apply QuotientGroup.eq_iff_div_mem.mpr + exact Subgroup.mem_top _ + infer_instance + +/-- Regard a finite abstract field as its finite extension of the +distinguished base field. -/ +def toFiniteAbstractExtension (K : FiniteAbstractField G) : + DegreeData.FiniteAbstractExtension G where + field := K.field + base := baseField G + below := le_baseField K.field + finiteQuotient := K.finite + +/-- A finite abstract field supplies finiteness of its quotient over the distinguished base. -/ +instance (K : FiniteAbstractField G) : + Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) K.field (le_baseField K.field)) := + K.finite + +/-- A finite field over the distinguished base has a finite absolute residue +quotient. This is derived from the finite relative quotient and the +surjectivity of the ambient degree map. -/ +@[implicit_reducible] +noncomputable def toFiniteResidueAbstractField + (K : FiniteAbstractField G) (D : DegreeData G) : + DegreeData.FiniteResidueAbstractField D where + field := K.field + finiteResidueQuotient := by + apply Cardinal.lt_aleph0_iff_finite.mp + change + intersectionIndexCardinal (D.fieldImage K.field) + (⊤ : Subgroup ZHatMul) < Cardinal.aleph0 + rw [D.fieldImage_eq_map] + have htop : + (baseField G).toSubgroup.map D.degree.toMonoidHom = ⊤ := by + rw [baseField_toSubgroup] + exact Subgroup.map_top_of_surjective _ D.degree_surjective + rw [← htop] + simpa only [FiniteAbstractField.toFiniteAbstractExtension, + DegreeData.AbstractExtension.relativeResidueDegreeCardinal, relativeIndexCardinal] using + K.toFiniteAbstractExtension.relativeResidueDegreeCardinal_lt_aleph0 D + +/-- The positive absolute residue degree of a field finite over the +distinguished base. -/ +noncomputable def residueDegree (K : FiniteAbstractField G) + (D : DegreeData G) : ℕ+ := + (K.toFiniteResidueAbstractField D).residueDegree + +/-- Positive-natural specialization of the base-field residue degree. -/ +@[simp] theorem base_residueDegree (D : DegreeData G) : + (FiniteAbstractField.base G).residueDegree D = 1 := by + apply Subtype.ext + change (((FiniteAbstractField.base G).toFiniteResidueAbstractField D).residueDegree : ℕ) = 1 + apply Nat.cast_injective (R := Cardinal) + rw [← DegreeData.FiniteResidueAbstractField.residueDegreeCardinal_eq_coe] + exact D.residueDegreeCardinal_baseField + +/-- The field residue degree is inherited from its finite-residue-field enrichment. -/ +@[simp] theorem residueDegree_coe (K : FiniteAbstractField G) + (D : DegreeData G) : + (K.residueDegree D : ℕ) = + ((K.toFiniteResidueAbstractField D).residueDegree : ℕ) := + rfl + +end FiniteAbstractField + +/-- A finite extension between two fields that are themselves finite over the +distinguished base. Both endpoint finiteness proofs and the relative quotient +belong to the object. -/ +structure FiniteAbstractFieldExtension (G : Type u) + [Group G] [TopologicalSpace G] where + /-- The top endpoint, finite over the distinguished base. -/ + field : FiniteAbstractField G + /-- The base endpoint, finite over the distinguished base. -/ + base : FiniteAbstractField G + /-- The top-field subgroup is contained in the base-field subgroup. -/ + below : field.field.toSubgroup ≤ base.field.toSubgroup + /-- The relative extension quotient is finite. -/ + finiteQuotient : + Finite + (base.field.toSubgroup ⧸ + extensionSubgroup base.field field.field below) + +namespace FiniteAbstractFieldExtension + +/-- Canonically bundle a finite relative extension of a field already finite +over the distinguished base. Finiteness of the upper field follows from the +actual quotient tower. -/ +@[implicit_reducible] +noncomputable def ofInclusion (field : ClosedSubgroup G) + (base : FiniteAbstractField G) + (below : field.toSubgroup ≤ base.field.toSubgroup) + [finiteQuotient : Finite + (base.field.toSubgroup ⧸ + extensionSubgroup base.field field below)] : + FiniteAbstractFieldExtension G where + field := { + field := field + finite := by + apply Cardinal.lt_aleph0_iff_finite.mp + let T : DegreeData.AbstractExtension.Tower G := { + top := field + middle := base.field + base := baseField G + top_le_middle := below + middle_le_base := le_baseField base.field } + change T.totalExtension.degreeCardinal < Cardinal.aleph0 + rw [← T.degreeCardinal_mul] + apply Cardinal.mul_lt_aleph0 + · change Cardinal.mk + (base.field.toSubgroup ⧸ + extensionSubgroup base.field field below) < Cardinal.aleph0 + exact Cardinal.lt_aleph0_of_finite _ + · change Cardinal.mk + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) base.field + (le_baseField base.field)) < Cardinal.aleph0 + exact Cardinal.lt_aleph0_of_finite _ } + base := base + below := below + finiteQuotient := finiteQuotient + +/-- Forget endpoint finiteness over the distinguished base. -/ +@[implicit_reducible] +def toFiniteAbstractExtension (E : FiniteAbstractFieldExtension G) : + DegreeData.FiniteAbstractExtension G where + field := E.field.field + base := E.base.field + below := E.below + finiteQuotient := E.finiteQuotient + +/-- Structural unramifiedness of the represented relative extension. -/ +@[implicit_reducible] +def IsUnramified (E : FiniteAbstractFieldExtension G) (D : DegreeData G) : Prop := + E.toFiniteAbstractExtension.IsUnramified D + +/-- Structural total ramification of the represented relative extension. -/ +def IsTotallyRamified (E : FiniteAbstractFieldExtension G) + (D : DegreeData G) : Prop := + E.toFiniteAbstractExtension.IsTotallyRamified D + +/-- The positive relative degree. -/ +noncomputable def degree (E : FiniteAbstractFieldExtension G) : ℕ+ := + E.toFiniteAbstractExtension.degree + +/-- The positive relative residue degree. -/ +noncomputable def residueDegree (E : FiniteAbstractFieldExtension G) + (D : DegreeData G) : ℕ+ := + E.toFiniteAbstractExtension.residueDegree D + +/-- The positive relative ramification index. -/ +noncomputable def ramificationIndex (E : FiniteAbstractFieldExtension G) + (D : DegreeData G) : ℕ+ := + E.toFiniteAbstractExtension.ramificationIndex D + +/-- In an unramified finite field extension, the positive relative residue +degree is the positive extension degree. -/ +theorem residueDegree_eq_degree_of_isUnramified + (E : FiniteAbstractFieldExtension G) (D : DegreeData G) + (hE : E.IsUnramified D) : + (E.residueDegree D : ℕ) = (E.degree : ℕ) := + E.toFiniteAbstractExtension.residueDegree_eq_degree_of_isUnramified D hE + +/-- A finite abstract field extension supplies finiteness of its relative quotient. -/ +instance (E : FiniteAbstractFieldExtension G) : + Finite + (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) := + E.finiteQuotient + +/-- Canonically enrich both endpoints with their finite residue quotients. -/ +noncomputable def toFiniteResidueAbstractExtension + (E : FiniteAbstractFieldExtension G) (D : DegreeData G) : + DegreeData.FiniteResidueAbstractExtension D where + field := E.field.toFiniteResidueAbstractField D + base := E.base.toFiniteResidueAbstractField D + below := E.below + finiteQuotient := E.finiteQuotient + +end FiniteAbstractFieldExtension + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Frobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Frobenius.lean new file mode 100644 index 0000000000..b0425342d8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Frobenius.lean @@ -0,0 +1,342 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Fields + +/-! # Frobenius -/ + +@[expose] public section +namespace ClassFormation + +/-! +# normalized degree and Frobenius theory: normalized degree maps and Frobenius + +For a field of finite residue degree, this file constructs the map +`d_K = (1 / f_K) d`; division is performed only after proving that +`d(G_K) = f_K ℤ̂`. The Frobenius is then the unique class mapping to `1`. +-/ + +noncomputable +section + +variable {G : Type*} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- The image `d(G_K)`, written additively inside `ℤ̂`. -/ +def fieldImageAdd (D : DegreeData G) (K : ClosedSubgroup G) : AddSubgroup ZHat := + Subgroup.toAddSubgroup' (D.fieldImage K) + +/-- The additive degree image has index equal to the field's positive residue degree. -/ +@[simp] +theorem fieldImageAdd_index (D : DegreeData G) + (K : FiniteResidueAbstractField D) : + (D.fieldImageAdd K.field).index = (K.residueDegree : ℕ) := by + change (D.fieldImage K.field).index = (K.residueDegree : ℕ) + rw [← Subgroup.relIndex_top_right] + change Nat.card (D.residueQuotient K.field) = (K.residueDegree : ℕ) + exact K.residueDegree_coe.symm + +/-- Finite residue degree identifies `d(G_K)` with `f_K ℤ̂`. -/ +theorem fieldImageAdd_eq_mulNat_range (D : DegreeData G) + (K : FiniteResidueAbstractField D) : + D.fieldImageAdd K.field = + (zHatMulNat (K.residueDegree : ℕ)).toAddMonoidHom.range := by + apply zHatAddSubgroup_eq_mulNat_range_of_index_eq + · exact K.residueDegree.property + · exact D.fieldImageAdd_index K + +/-- The raw value `d(k)` regarded as an element of the subgroup `f_K ℤ̂`. -/ +def restrictedDegreeInMulNatRange (D : DegreeData G) + (K : FiniteResidueAbstractField D) (k : K.field.toSubgroup) : + (zHatMulNat (K.residueDegree : ℕ)).toAddMonoidHom.range := by + refine ⟨(D.degree k.1).toAdd, ?_⟩ + rw [← D.fieldImageAdd_eq_mulNat_range K] + change D.degree k.1 ∈ D.fieldImage K.field + exact ⟨k, rfl⟩ + +/-- The restricted degree in the natural-multiple range has the original additive value. -/ +@[simp] +theorem restrictedDegreeInMulNatRange_coe (D : DegreeData G) + (K : FiniteResidueAbstractField D) (k : K.toSubgroup) : + (D.restrictedDegreeInMulNatRange K k).1 = (D.degree k.1).toAdd := + rfl + +/-- The normalized degree map `d_K = (1 / f_K)d`. -/ +def normalizedDegree (D : DegreeData G) (K : FiniteResidueAbstractField D) : + K.field.toSubgroup →ₜ* ZHatMul where + toFun k := Multiplicative.ofAdd + (zHatDivide (K.residueDegree : ℕ) K.residueDegree.property + (D.restrictedDegreeInMulNatRange K k)) + map_one' := by + apply Multiplicative.ext + change zHatDivide (K.residueDegree : ℕ) K.residueDegree.property + (D.restrictedDegreeInMulNatRange K 1) = 0 + rw [show D.restrictedDegreeInMulNatRange K 1 = 0 by + apply Subtype.ext + exact congrArg Multiplicative.toAdd (map_one D.degree)] + exact map_zero (zHatDivide (K.residueDegree : ℕ) K.residueDegree.property) + map_mul' x y := by + apply Multiplicative.ext + change zHatDivide (K.residueDegree : ℕ) K.residueDegree.property + (D.restrictedDegreeInMulNatRange K (x * y)) = + zHatDivide (K.residueDegree : ℕ) K.residueDegree.property + (D.restrictedDegreeInMulNatRange K x) + + zHatDivide (K.residueDegree : ℕ) K.residueDegree.property + (D.restrictedDegreeInMulNatRange K y) + rw [show D.restrictedDegreeInMulNatRange K (x * y) = + D.restrictedDegreeInMulNatRange K x + + D.restrictedDegreeInMulNatRange K y by + apply Subtype.ext + exact congrArg Multiplicative.toAdd + (map_mul D.degree x.1 y.1)] + exact map_add (zHatDivide (K.residueDegree : ℕ) K.residueDegree.property) _ _ + continuous_toFun := by + apply (map_continuous + (zHatDivide (K.residueDegree : ℕ) K.residueDegree.property)).comp + exact Continuous.subtype_mk + (D.restrictedDegree K.field).continuous_toFun + (fun k => (D.restrictedDegreeInMulNatRange K k).2) + +/-- The additive coordinate of normalized degree is obtained by dividing by the residue degree. -/ +@[simp] +theorem normalizedDegree_apply_toAdd (D : DegreeData G) + (K : FiniteResidueAbstractField D) (k : K.field.toSubgroup) : + (D.normalizedDegree K k).toAdd = + zHatDivide (K.residueDegree : ℕ) K.residueDegree.property + (D.restrictedDegreeInMulNatRange K k) := + rfl + +/-- The defining identity `f_K d_K = d`. -/ +theorem residueDegree_nsmul_normalizedDegree (D : DegreeData G) + (K : FiniteResidueAbstractField D) (k : K.field.toSubgroup) : + (K.residueDegree : ℕ) • (D.normalizedDegree K k).toAdd = + (D.degree k.1).toAdd := by + exact zHatMulNat_zHatDivide (K.residueDegree : ℕ) K.residueDegree.property + (D.restrictedDegreeInMulNatRange K k) + +/-- The normalized map is surjective, exactly as asserted before the normalized Frobenius +definition. -/ +theorem normalizedDegree_surjective (D : DegreeData G) + (K : FiniteResidueAbstractField D) : + Function.Surjective (D.normalizedDegree K) := by + intro z + have hzImageAdd : (K.residueDegree : ℕ) • z.toAdd ∈ + D.fieldImageAdd K.field := by + rw [D.fieldImageAdd_eq_mulNat_range K] + exact ⟨z.toAdd, rfl⟩ + have hzImage : Multiplicative.ofAdd ((K.residueDegree : ℕ) • z.toAdd) ∈ + D.fieldImage K.field := hzImageAdd + obtain ⟨k, hk⟩ := hzImage + refine ⟨k, ?_⟩ + apply Multiplicative.ext + apply zHatMulNat_injective K.residueDegree.property + change (K.residueDegree : ℕ) • (D.normalizedDegree K k).toAdd = + (K.residueDegree : ℕ) • z.toAdd + rw [D.residueDegree_nsmul_normalizedDegree K k] + exact congrArg Multiplicative.toAdd hk + +/-- The kernel of `d_K` is the inertia group `I_K`. -/ +theorem normalizedDegree_ker (D : DegreeData G) + (K : FiniteResidueAbstractField D) : + (D.normalizedDegree K).toMonoidHom.ker = D.fieldInertiaWithin K.field := by + ext k + constructor + · intro hk + change D.degree k.1 = 1 + apply Multiplicative.ext + rw [← D.residueDegree_nsmul_normalizedDegree K k] + change (K.residueDegree : ℕ) • (D.normalizedDegree K k).toAdd = 0 + rw [show D.normalizedDegree K k = 1 from hk] + simp + · intro hk + apply Multiplicative.ext + apply zHatMulNat_injective K.residueDegree.property + change (K.residueDegree : ℕ) • (D.normalizedDegree K k).toAdd = + (K.residueDegree : ℕ) • (1 : ZHatMul).toAdd + rw [D.residueDegree_nsmul_normalizedDegree K k] + rw [show D.degree k.1 = 1 from hk] + simp + +private theorem fieldInertiaWithin_le_normalizedDegree_ker + (D : DegreeData G) (K : FiniteResidueAbstractField D) : + D.fieldInertiaWithin K.field ≤ (D.normalizedDegree K).toMonoidHom.ker := by + rw [D.normalizedDegree_ker K] + +/-- The isomorphism `d_K : G(\widetilde K|K) ≃ ℤ̂`. -/ +def maximalUnramifiedDegreeEquiv (D : DegreeData G) + (K : FiniteResidueAbstractField D) : + (K.field.toSubgroup ⧸ D.fieldInertiaWithin K.field) ≃* ZHatMul := by + let dquot : (K.field.toSubgroup ⧸ D.fieldInertiaWithin K.field) →* ZHatMul := + QuotientGroup.lift (D.fieldInertiaWithin K.field) + (D.normalizedDegree K).toMonoidHom + (by exact D.fieldInertiaWithin_le_normalizedDegree_ker K) + apply MulEquiv.ofBijective dquot + constructor + · intro x y hxy + refine Quotient.inductionOn₂' x y ?_ hxy + intro a b hab + apply QuotientGroup.eq.mpr + change a⁻¹ * b ∈ D.fieldInertiaWithin K.field + rw [← D.normalizedDegree_ker K] + change D.normalizedDegree K (a⁻¹ * b) = 1 + rw [map_mul, map_inv] + have hab' : D.normalizedDegree K a = D.normalizedDegree K b := by + simpa [dquot] using hab + rw [hab', inv_mul_cancel] + · exact QuotientGroup.lift_surjective_of_surjective + (D.fieldInertiaWithin K.field) + (D.normalizedDegree K).toMonoidHom + (D.normalizedDegree_surjective K) + (by exact D.fieldInertiaWithin_le_normalizedDegree_ker K) + +/-- On quotient representatives, the maximal-unramified degree equivalence is normalized degree. -/ +@[simp] +theorem maximalUnramifiedDegreeEquiv_mk (D : DegreeData G) + (K : FiniteResidueAbstractField D) (k : K.field.toSubgroup) : + D.maximalUnramifiedDegreeEquiv K (QuotientGroup.mk k) = + D.normalizedDegree K k := by + rfl + +/-- **the normalized Frobenius definition.** The Frobenius over `K`, characterized by +`d_K(φ_K)=1`. -/ +def frobenius (D : DegreeData G) (K : FiniteResidueAbstractField D) : + K.field.toSubgroup ⧸ D.fieldInertiaWithin K.field := + (D.maximalUnramifiedDegreeEquiv K).symm + (Multiplicative.ofAdd (1 : ZHat)) + +/-- The maximal-unramified degree equivalence sends Frobenius to the generator one. -/ +@[simp] +theorem maximalUnramifiedDegreeEquiv_frobenius (D : DegreeData G) + (K : FiniteResidueAbstractField D) : + D.maximalUnramifiedDegreeEquiv K (D.frobenius K) = + Multiplicative.ofAdd (1 : ZHat) := by + exact (D.maximalUnramifiedDegreeEquiv K).apply_symm_apply _ + +/-- Uniqueness clause in the normalized Frobenius definition. -/ +theorem eq_frobenius_iff (D : DegreeData G) + (K : FiniteResidueAbstractField D) + (σ : K.field.toSubgroup ⧸ D.fieldInertiaWithin K.field) : + σ = D.frobenius K ↔ + D.maximalUnramifiedDegreeEquiv K σ = + Multiplicative.ofAdd (1 : ZHat) := by + constructor + · rintro rfl + exact D.maximalUnramifiedDegreeEquiv_frobenius K + · intro h + exact (D.maximalUnramifiedDegreeEquiv K).injective + (h.trans (D.maximalUnramifiedDegreeEquiv_frobenius K).symm) + +/-- For a finite extension, its positive residue degree times the absolute +residue degree of the base is the absolute residue degree of the field. -/ +theorem FiniteResidueAbstractExtension.residueDegree_mul_absoluteResidueDegree + (D : DegreeData G) (E : FiniteResidueAbstractExtension D) : + (E.residueDegree : ℕ) * (E.base.residueDegree : ℕ) = + (E.field.residueDegree : ℕ) := by + have h := + AbstractExtension.relativeResidueDegreeCardinal_mul_residueDegreeCardinal + E.toFiniteAbstractExtension.toAbstractExtension D + rw [E.toFiniteAbstractExtension.relativeResidueDegreeCardinal_eq_coe D] at h + change ((E.residueDegree : ℕ) : Cardinal) * + D.residueDegreeCardinal E.base.field = + D.residueDegreeCardinal E.field.field at h + rw [E.base.residueDegreeCardinal_eq_coe, + E.field.residueDegreeCardinal_eq_coe] at h + exact_mod_cast h + +/-- **Frobenius residue-degree compatibility (residue degrees).** If `f_K` and `f_L` are finite, +then `f_{L|K} = f_L / f_K`. -/ +theorem frobeniusRestrictionNaturality_residueDegree (D : DegreeData G) + (E : FiniteResidueAbstractExtension D) : + (E.residueDegree : ℕ) = + (E.field.residueDegree : ℕ) / (E.base.residueDegree : ℕ) := by + rw [← E.residueDegree_mul_absoluteResidueDegree D] + rw [Nat.mul_comm (E.residueDegree : ℕ) (E.base.residueDegree : ℕ)] + exact (Nat.mul_div_cancel_left _ E.base.residueDegree.property).symm + +/-- **Frobenius residue-degree compatibility (commutative square).** On `G_L`, the normalized +degree maps satisfy `d_K = f_{L|K} d_L`. -/ +theorem frobeniusRestrictionNaturality_normalizedDegree (D : DegreeData G) + (E : FiniteResidueAbstractExtension D) + (l : E.field.field.toSubgroup) : + (D.normalizedDegree E.base (Subgroup.inclusion E.below l)).toAdd = + (E.residueDegree : ℕ) • + (D.normalizedDegree E.field l).toAdd := by + apply zHatMulNat_injective E.base.residueDegree.property + change (E.base.residueDegree : ℕ) • + (D.normalizedDegree E.base (Subgroup.inclusion E.below l)).toAdd = + (E.base.residueDegree : ℕ) • + ((E.residueDegree : ℕ) • + (D.normalizedDegree E.field l).toAdd) + rw [D.residueDegree_nsmul_normalizedDegree E.base] + change (D.degree l.1).toAdd = _ + rw [smul_smul, Nat.mul_comm (E.base.residueDegree : ℕ), + E.residueDegree_mul_absoluteResidueDegree D, + D.residueDegree_nsmul_normalizedDegree E.field] + +private theorem fieldInertiaWithin_le_comap_inclusion + (D : DegreeData G) {L K : ClosedSubgroup G} + (hLK : L.toSubgroup ≤ K.toSubgroup) : + D.fieldInertiaWithin L ≤ + (D.fieldInertiaWithin K).comap (Subgroup.inclusion hLK) := by + intro l hl + exact hl + +/-- Restriction `G(\widetilde L/L) → G(\widetilde K/K)` for `L | K`. -/ +def maximalUnramifiedRestriction (D : DegreeData G) {L K : ClosedSubgroup G} + (hLK : L.toSubgroup ≤ K.toSubgroup) : + (L.toSubgroup ⧸ D.fieldInertiaWithin L) →* + (K.toSubgroup ⧸ D.fieldInertiaWithin K) := + QuotientGroup.map (D.fieldInertiaWithin L) (D.fieldInertiaWithin K) + (Subgroup.inclusion hLK) (by exact D.fieldInertiaWithin_le_comap_inclusion hLK) + +/-- Maximal-unramified restriction sends a quotient representative to its +restricted representative. -/ +@[simp] +theorem maximalUnramifiedRestriction_mk (D : DegreeData G) + {L K : ClosedSubgroup G} (hLK : L.toSubgroup ≤ K.toSubgroup) + (l : L.toSubgroup) : + D.maximalUnramifiedRestriction hLK (QuotientGroup.mk l) = + QuotientGroup.mk (Subgroup.inclusion hLK l) := by + rfl + +/-- The quotient form of the commutative square in Frobenius residue-degree compatibility. -/ +theorem frobeniusRestrictionNaturality_quotient_square (D : DegreeData G) + (E : FiniteResidueAbstractExtension D) + (σ : E.field.field.toSubgroup ⧸ D.fieldInertiaWithin E.field.field) : + (D.maximalUnramifiedDegreeEquiv E.base + (D.maximalUnramifiedRestriction E.below σ)).toAdd = + (E.residueDegree : ℕ) • + (D.maximalUnramifiedDegreeEquiv E.field σ).toAdd := by + refine Quotient.inductionOn' σ ?_ + intro l + simpa using D.frobeniusRestrictionNaturality_normalizedDegree E l + +/-- The final assertion of Frobenius residue-degree compatibility: +`φ_L|_{\widetilde K} = φ_K ^ f_{L|K}`. -/ +theorem frobenius_restriction_eq_power (D : DegreeData G) + (E : FiniteResidueAbstractExtension D) : + D.maximalUnramifiedRestriction E.below (D.frobenius E.field) = + (D.frobenius E.base) ^ (E.residueDegree : ℕ) := by + apply (D.maximalUnramifiedDegreeEquiv E.base).injective + apply Multiplicative.ext + rw [map_pow] + change (D.maximalUnramifiedDegreeEquiv E.base + (D.maximalUnramifiedRestriction E.below + (D.frobenius E.field))).toAdd = + (E.residueDegree : ℕ) • + (D.maximalUnramifiedDegreeEquiv E.base + (D.frobenius E.base)).toAdd + rw [D.frobeniusRestrictionNaturality_quotient_square E, + D.maximalUnramifiedDegreeEquiv_frobenius, + D.maximalUnramifiedDegreeEquiv_frobenius] + +end DegreeData + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean new file mode 100644 index 0000000000..14a13af64e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean @@ -0,0 +1,1142 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusLift +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.TopologicalGeneration +public import LeanPool.ClassFieldTheory.GaloisCohomology.Topology.TotallyDisconnectedQuotients + +/-! # Frobenius Fixed Field -/ + +@[expose] public section +namespace ClassFormation + +open CyclicCohomology + +/-! +# normalized degree and Frobenius theory: the fixed field of a Frobenius lift + +This file gives the group-dual form of the Frobenius fixed-field theorem. If `σ` is a +Frobenius lift in `G(\widetilde L | K)`, the subgroup `Γ` fixing the +field `Σ` is the closed subgroup topologically generated by `σ`. +-/ + +noncomputable +section + +universe u + +variable {G : Type u} [Group G] [TopologicalSpace G] +/-- The quotient projection with its quotient topology, used locally below. -/ +private def continuousQuotientMk + {A : Type*} [Group A] [TopologicalSpace A] + (N : Subgroup A) [N.Normal] : A →ₜ* A ⧸ N where + toMonoidHom := QuotientGroup.mk' N + continuous_toFun := continuous_quotient_mk' + +/-- The continuous lift of a homomorphism through a quotient, used locally +below. -/ +private def continuousQuotientLift + {A : Type*} {B : Type*} [Group A] [TopologicalSpace A] + [Group B] [TopologicalSpace B] + (N : Subgroup A) [N.Normal] (f : A →ₜ* B) + (hN : N ≤ f.toMonoidHom.ker) : A ⧸ N →ₜ* B := by + let φ : A ⧸ N →* B := QuotientGroup.lift N f.toMonoidHom hN + have hcomp : Continuous (fun x : A => φ (QuotientGroup.mk' N x)) := by + simpa [φ, QuotientGroup.lift_mk'] using f.continuous_toFun + exact + { toMonoidHom := φ + continuous_toFun := + (QuotientGroup.isQuotientMap_mk (G := A) (N := N)).continuous_iff.2 hcomp } + +/-- Inclusion of a subgroup with its subtype topology, used locally below. -/ +def continuousSubgroupSubtype + {A : Type*} [Group A] [TopologicalSpace A] + (H : Subgroup A) : H →ₜ* A where + toMonoidHom := H.subtype + continuous_toFun := continuous_subtype_val + +/-- A bijective continuous homomorphism from a compact group to a Hausdorff +group is a continuous multiplicative equivalence. -/ +noncomputable def continuousMulEquivOfBijectiveCompactToT2 + {A : Type*} {B : Type*} [Group A] [TopologicalSpace A] + [Group B] [TopologicalSpace B] [CompactSpace A] [T2Space B] + (φ : A →* B) (hφcont : Continuous φ) (hφ : Function.Bijective φ) : + A ≃ₜ* B := by + let e : A ≃ B := Equiv.ofBijective φ hφ + let eh : A ≃ₜ B := + e.toHomeomorphOfContinuousClosed hφcont (Continuous.isClosedMap hφcont) + exact ContinuousMulEquiv.mk' eh φ.map_mul + +/-- A nonidentity element of a profinite group is omitted by some open normal +subgroup. -/ +private theorem exists_openNormalSubgroup_not_mem + {A : Type*} [Group A] [TopologicalSpace A] [IsTopologicalGroup A] + [CompactSpace A] [TotallyDisconnectedSpace A] + {x : A} (hx : x ≠ 1) : + ∃ U : OpenNormalSubgroup A, x ∉ (U : Subgroup A) := by + let W : Set A := ({x} : Set A)ᶜ + have hWopen : IsOpen W := isClosed_singleton.isOpen_compl + have hWone : (1 : A) ∈ W := by + simpa [W] using hx.symm + obtain ⟨U, hUW⟩ := + ProfiniteGrp.exist_openNormalSubgroup_sub_open_nhds_of_one + (G := A) hWopen hWone + refine ⟨U, ?_⟩ + intro hxU + have hxW : x ∈ W := hUW hxU + change x ∉ ({x} : Set A) at hxW + exact hxW (by simp) + + +/-- Multiplication by `n` on `ℤ̂`, in the multiplicative presentation. -/ +def zHatPowNat (n : ℕ) : ZHatMul →ₜ* ZHatMul where + toFun z := Multiplicative.ofAdd (zHatMulNat n z.toAdd) + map_one' := by + apply Multiplicative.ext + simp [zHatMulNat] + map_mul' x y := by + apply Multiplicative.ext + exact nsmul_add x.toAdd y.toAdd n + continuous_toFun := map_continuous (zHatMulNat n) + +/-- The additive coordinate of a natural profinite power is multiplication by that natural. -/ +@[simp] +theorem zHatPowNat_apply_toAdd (n : ℕ) (z : ZHatMul) : + (zHatPowNat n z).toAdd = n • z.toAdd := + rfl + +/-- The natural profinite power map sends one to the multiplicative generator. -/ +@[simp] +theorem zHatPowNat_one (n : ℕ) : + zHatPowNat n + (Multiplicative.ofAdd (1 : ZHat)) = + (Multiplicative.ofAdd (1 : ZHat)) ^ n := by + apply Multiplicative.ext + rfl + +/-- Reduction modulo `n`, in the multiplicative presentation. -/ +def zHatReductionMul (n : ℕ) (hn : 0 < n) : + ZHatMul →ₜ* Multiplicative (ZMod n) where + toFun z := Multiplicative.ofAdd (zHatReduction n hn z.toAdd) + map_one' := by + apply Multiplicative.ext + exact map_zero (zHatReduction n hn) + map_mul' x y := by + apply Multiplicative.ext + exact map_add (zHatReduction n hn) x.toAdd y.toAdd + continuous_toFun := map_continuous (zHatReduction n hn) + +/-- Reduction followed by multiplication has the expected additive-coordinate formula. -/ +@[simp] +theorem zHatReductionMul_apply_toAdd (n : ℕ) (hn : 0 < n) + (z : ZHatMul) : + (zHatReductionMul n hn z).toAdd = zHatReduction n hn z.toAdd := + rfl + +/-- The cardinal comparison used in the classical proof of the Frobenius fixed-field theorem: +a continuous map from a profinite procyclic group to `ℤ̂` which sends a +topological generator to `1` is injective. -/ +private theorem injective_of_topologicallyGenerates_zHat_one + {A : Type*} [CommGroup A] [TopologicalSpace A] + [IsTopologicalGroup A] [CompactSpace A] + [TotallyDisconnectedSpace A] + (f : A →ₜ* ZHatMul) (x : A) + (hxgen : TopologicallyGenerates ({x} : Set A)) + (hfx : f x = Multiplicative.ofAdd (1 : ZHat)) : + Function.Injective f := by + intro a b hab + suffices h : a⁻¹ * b = 1 by + exact inv_mul_eq_one.mp h + let y := a⁻¹ * b + have hfy : f y = 1 := by + dsimp [y] + rw [map_mul, map_inv, hab, inv_mul_cancel] + by_contra hy + obtain ⟨U, hyU⟩ := exists_openNormalSubgroup_not_mem hy + let : Finite (A ⧸ (U : Subgroup A)) := + Subgroup.quotient_finite_of_isOpen (U : Subgroup A) + U.toOpenSubgroup.isOpen' + let : DiscreteTopology (A ⧸ (U : Subgroup A)) := + QuotientGroup.discreteTopology U.toOpenSubgroup.isOpen' + let m := Nat.card (A ⧸ (U : Subgroup A)) + have hm : 0 < m := by + dsimp [m] + exact Nat.card_pos + let : NeZero m := ⟨hm.ne'⟩ + let q : A →ₜ* (A ⧸ (U : Subgroup A)) := + continuousQuotientMk (U : Subgroup A) + have hqx : + q x = QuotientGroup.mk' (U : Subgroup A) x := rfl + have hqgen : TopologicallyGenerates ({q x} : Set + (A ⧸ (U : Subgroup A))) := by + have h := topologicallyGenerates_quotient_image (U : Subgroup A) hxgen + simpa only [Set.image_singleton, hqx] using h + have hqpow : (q x) ^ m = 1 := by + exact pow_card_eq_one' + let H : ClosedSubgroup A := + closedSubgroupGenerated ({x ^ m} : Set A) + have hHU : H.toSubgroup ≤ (U : Subgroup A) := by + apply Subgroup.topologicalClosure_minimal + · rw [Subgroup.closure_le] + intro z hz + rw [Set.mem_singleton_iff] at hz + subst z + apply (QuotientGroup.eq_one_iff (x ^ m)).mp + change q (x ^ m) = 1 + rw [map_pow] + simpa only [hqx] using hqpow + · exact Subgroup.isClosed_of_isOpen (U : Subgroup A) U.isOpen' + let : IsClosed (H.toSubgroup : Set A) := H.isClosed' + let B := A ⧸ H.toSubgroup + let qH : A →ₜ* B := continuousQuotientMk H.toSubgroup + have hqHx : + qH x = QuotientGroup.mk' H.toSubgroup x := rfl + have hqHgen : TopologicallyGenerates ({qH x} : Set B) := by + have h := topologicallyGenerates_quotient_image H.toSubgroup hxgen + simpa only [Set.image_singleton, hqHx] using h + have hqHpow : (qH x) ^ m = 1 := by + rw [← map_pow] + change (QuotientGroup.mk' H.toSubgroup) (x ^ m) = 1 + apply (QuotientGroup.eq_one_iff (N := H.toSubgroup) (x ^ m)).2 + change x ^ m ∈ + (closedSubgroupGenerated ({x ^ m} : Set A) : Subgroup A) + exact Subgroup.le_topologicalClosure _ + (Subgroup.subset_closure (by simp)) + have hqHfiniteOrder : IsOfFinOrder (qH x) := by + rw [← orderOf_pos_iff] + have hdvd : orderOf (qH x) ∣ m := + orderOf_dvd_of_pow_eq_one hqHpow + exact Nat.pos_of_dvd_of_pos hdvd hm + have hzpowersClosed : + IsClosed ((Subgroup.zpowers (qH x) : Subgroup B) : Set B) := + (Set.finite_coe_iff.mp (finite_zpowers.mpr hqHfiniteOrder)).isClosed + have hzpowersTopologicalClosure : + (Subgroup.zpowers (qH x)).topologicalClosure = + Subgroup.zpowers (qH x) := by + apply SetLike.ext' + rw [Subgroup.topologicalClosure_coe] + rw [hzpowersClosed.closure_eq] + have hzpowersTop : Subgroup.zpowers (qH x) = ⊤ := by + rw [TopologicallyGenerates, ← Subgroup.zpowers_eq_closure, + hzpowersTopologicalClosure] at hqHgen + exact hqHgen + let : Finite (Subgroup.zpowers (qH x)) := + finite_zpowers.mpr hqHfiniteOrder + let : Finite B := + Finite.of_injective + (fun b : B => + (⟨b, by rw [hzpowersTop]; trivial⟩ : Subgroup.zpowers (qH x))) + (by + intro a b hab + exact congrArg Subtype.val hab) + have hcardB : Nat.card B = orderOf (qH x) := + (orderOf_eq_card_of_zpowers_eq_top hzpowersTop).symm + have hcardBle : Nat.card B ≤ m := by + rw [hcardB] + exact orderOf_le_of_pow_eq_one hm hqHpow + let r : A →ₜ* Multiplicative (ZMod m) := + (zHatReductionMul m hm).comp f + have hrx : r x = Multiplicative.ofAdd (1 : ZMod m) := by + apply Multiplicative.ext + change zHatReduction m hm (f x).toAdd = 1 + rw [hfx] + simp + have hHker : H.toSubgroup ≤ r.toMonoidHom.ker := by + apply Subgroup.topologicalClosure_minimal + · rw [Subgroup.closure_le] + intro z hz + rw [Set.mem_singleton_iff] at hz + subst z + change r (x ^ m) = 1 + rw [map_pow, hrx] + apply Multiplicative.ext + simp + · change IsClosed {z : A | r z = 1} + let : T2Space (Multiplicative (ZMod m)) := by + change T2Space (ZMod m) + infer_instance + exact isClosed_eq r.continuous_toFun continuous_const + let rbar : B →ₜ* Multiplicative (ZMod m) := + continuousQuotientLift H.toSubgroup r hHker + have hrbarSurj : Function.Surjective rbar := by + intro z + obtain ⟨k, hk⟩ := ZMod.intCast_surjective z.toAdd + refine ⟨(qH x) ^ k, ?_⟩ + apply Multiplicative.ext + rw [map_zpow] + change ((r x) ^ k).toAdd = z.toAdd + rw [hrx] + simpa using hk + have hcodCard : Nat.card (Multiplicative (ZMod m)) = m := by + calc + Nat.card (Multiplicative (ZMod m)) = + Nat.card (ZMod m) := + Nat.card_congr Multiplicative.toAdd + _ = m := Nat.card_zmod m + have hcardLower : m ≤ Nat.card B := by + rw [← hcodCard] + exact Nat.card_le_card_of_surjective rbar hrbarSurj + have hcardEq : Nat.card B = + Nat.card (Multiplicative (ZMod m)) := by + rw [hcodCard] + exact le_antisymm hcardBle hcardLower + have hrbarInj : Function.Injective rbar := + (Nat.bijective_iff_surjective_and_card rbar).mpr + ⟨hrbarSurj, hcardEq⟩ |>.1 + have hry : r y = 1 := by + change zHatReductionMul m hm (f y) = 1 + rw [hfy, map_one] + have hqy : qH y = 1 := by + apply hrbarInj + change r y = r 1 + rw [hry, map_one] + change (QuotientGroup.mk' H.toSubgroup) y = 1 at hqy + have hyH : y ∈ H.toSubgroup := + (QuotientGroup.eq_one_iff (N := H.toSubgroup) y).mp hqy + exact hyU (hHU hyH) + +namespace DegreeData + +/-- The positive integer `d_K(σ)` attached to a Frobenius lift. -/ +def frobeniusExponent (D : DegreeData G) (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : ℕ := + Exists.choose σ.2 + +/-- The Frobenius exponent attached to a finite extension is strictly positive. -/ +theorem frobeniusExponent_pos (D : DegreeData G) (K : FiniteResidueAbstractField D) (L : + ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + 0 < D.frobeniusExponent K L hLK σ := + (Exists.choose_spec σ.2).1 + +/-- The normalized degree of Frobenius is the corresponding natural profinite power. -/ +theorem extensionNormalizedDegree_frobenius_eq_pow (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + D.extensionNormalizedDegree K L hLK σ.1 = + (Multiplicative.ofAdd (1 : ZHat)) ^ + D.frobeniusExponent K L hLK σ := + (Exists.choose_spec σ.2).2 + +/-- The normalized-degree equation uniquely determines the natural Frobenius +exponent. -/ +theorem frobeniusExponent_unique (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) (n : ℕ) + (hn : + D.extensionNormalizedDegree K L hLK σ.1 = + (Multiplicative.ofAdd (1 : ZHat)) ^ n) : + n = D.frobeniusExponent K L hLK σ := by + apply proCIntegerOne_pow_nat_injective + exact hn.symm.trans + (D.extensionNormalizedDegree_frobenius_eq_pow K L hLK σ) + +/-- The factorized normalized degree as a continuous homomorphism. -/ +def extensionNormalizedDegreeContinuous (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] : + (K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) →ₜ* ZHatMul := + { toMonoidHom := D.extensionNormalizedDegree K L hLK + continuous_toFun := by + exact (continuousQuotientLift (D.extensionInertiaWithin K.field L hLK) + (D.normalizedDegree K) + (by + intro x hx + rw [D.normalizedDegree_ker K] + exact hx.2)).continuous_toFun } + +/-- The continuous normalized-degree map evaluates as the algebraic normalized-degree map. -/ +@[simp] +theorem extensionNormalizedDegreeContinuous_apply (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (x : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) : + D.extensionNormalizedDegreeContinuous K L hLK x = + D.extensionNormalizedDegree K L hLK x := + rfl + +/-- Forgetting continuity recovers the underlying normalized-degree monoid homomorphism. -/ +theorem extensionNormalizedDegreeContinuous_toMonoidHom (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] : + (D.extensionNormalizedDegreeContinuous K L hLK).toMonoidHom = + D.extensionNormalizedDegree K L hLK := + rfl + +/-- The continuous normalized-degree map of the extension is surjective. -/ +theorem extensionNormalizedDegreeContinuous_surjective (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] : + Function.Surjective + (D.extensionNormalizedDegreeContinuous K L hLK) := by + intro z + obtain ⟨k, hk⟩ := D.normalizedDegree_surjective K z + refine ⟨QuotientGroup.mk k, ?_⟩ + simpa using hk + +/-- Restriction embeds the kernel of `d_K` on `G(\widetilde L|K)` into +the finite group `G(L|K)`. -/ +def extensionDegreeKernelRestriction (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] : + (D.extensionNormalizedDegreeContinuous K L hLK).toMonoidHom.ker →* + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK) := + (D.extensionRestriction K.field L hLK).comp + (D.extensionNormalizedDegreeContinuous K L hLK).toMonoidHom.ker.subtype + +/-- Restriction to the degree kernel is injective on the extension subgroup. -/ +theorem extensionDegreeKernelRestriction_injective (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] : + Function.Injective + (D.extensionDegreeKernelRestriction K L hLK) := by + intro a b hab + let c := (a.1 : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK)⁻¹ * b.1 + have hcRestriction : D.extensionRestriction K.field L hLK c = 1 := by + dsimp [c] + rw [map_mul, map_inv] + change (D.extensionDegreeKernelRestriction K L hLK a)⁻¹ * + D.extensionDegreeKernelRestriction K L hLK b = 1 + rw [hab, inv_mul_cancel] + have hcDegree : + D.extensionNormalizedDegreeContinuous K L hLK c = 1 := by + dsimp [c] + rw [map_mul, map_inv] + change (D.extensionNormalizedDegreeContinuous K L hLK a.1)⁻¹ * + D.extensionNormalizedDegreeContinuous K L hLK b.1 = 1 + have ha : D.extensionNormalizedDegreeContinuous K L hLK a.1 = 1 := a.2 + have hb : D.extensionNormalizedDegreeContinuous K L hLK b.1 = 1 := b.2 + rw [ha, hb, inv_one, one_mul] + obtain ⟨k, hk⟩ := QuotientGroup.mk'_surjective + (D.extensionInertiaWithin K.field L hLK) c + have hkE : k ∈ extensionSubgroup K.field L hLK := by + apply (QuotientGroup.eq_one_iff k).mp + rw [← hk] at hcRestriction + simpa using hcRestriction + have hkI : k ∈ D.fieldInertiaWithin K.field := by + rw [← D.normalizedDegree_ker K] + change D.normalizedDegree K k = 1 + rw [← hk] at hcDegree + simpa using hcDegree + have hkc : k ∈ D.extensionInertiaWithin K.field L hLK := + ⟨hkE, hkI⟩ + have hcOne : c = 1 := by + rw [← hk] + exact (QuotientGroup.eq_one_iff k).mpr hkc + apply Subtype.ext + exact inv_mul_eq_one.mp hcOne + +/-- The extension's inertia subgroup is closed inside its base subgroup. -/ +theorem extensionInertiaWithin_isClosed (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) : + IsClosed (D.extensionInertiaWithin K.field L hLK : Set K.field.toSubgroup) := by + have hE : IsClosed (extensionSubgroup K.field L hLK : Set K.field.toSubgroup) := by + change IsClosed ((fun x : K.field.toSubgroup => (x : G)) ⁻¹' (L : Set G)) + exact L.isClosed'.preimage continuous_subtype_val + have hI : IsClosed (D.fieldInertiaWithin K.field : Set K.field.toSubgroup) := by + let : T2Space ZHatMul := by + change T2Space ZHat + infer_instance + change IsClosed {x : K.field.toSubgroup | D.degree x.1 = 1} + exact isClosed_eq + (D.restrictedDegree K.field).continuous_toFun continuous_const + change IsClosed + ((extensionSubgroup K.field L hLK ⊓ D.fieldInertiaWithin K.field) : Set K.field.toSubgroup) + exact hE.inter hI + +/-- The closed cyclic subgroup `Γ = closure ⟨σ⟩` fixing the field `Σ` +of the Frobenius fixed-field theorem. -/ +def frobeniusClosure (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + ClosedSubgroup + (K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) := + closedSubgroupGenerated + (Set.range (fun _ : Unit => σ.1)) + +/-- The chosen Frobenius lift, regarded as an element of `Γ`. -/ +def frobeniusInClosure (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + D.frobeniusClosure K L hLK σ := + closedSubgroupGeneratedMap (fun _ : Unit => σ.1) () + +/-- The closure of the Frobenius-generated subgroup inherits a topological group structure. -/ +instance frobeniusClosure_isTopologicalGroup + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + IsTopologicalGroup (D.frobeniusClosure K L hLK σ) := by + change IsTopologicalGroup + ↑((D.frobeniusClosure K L hLK σ).toSubgroup) + infer_instance + +/-- Defines `frobeniusClosureCommGroup`. -/ +@[reducible] def frobeniusClosureCommGroup + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + CommGroup (D.frobeniusClosure K L hLK σ) := by + letI : IsClosed + (D.extensionInertiaWithin K.field L hLK : Set K.field.toSubgroup) := + D.extensionInertiaWithin_isClosed K L hLK + let Q := K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK + let s : Subgroup Q := + Subgroup.closure (Set.range (fun _ : Unit => σ.1)) + letI : IsMulCommutative ↑s := + isMulCommutative_iff.mpr (by + intro a b + have hrange : Set.range (fun _ : Unit => σ.1) = ({σ.1} : Set Q) := by + ext y + simp + have ha : (a : Q) ∈ Subgroup.zpowers σ.1 := by + simpa [s, hrange, Subgroup.zpowers_eq_closure] using a.2 + have hb : (b : Q) ∈ Subgroup.zpowers σ.1 := by + simpa [s, hrange, Subgroup.zpowers_eq_closure] using b.2 + obtain ⟨m, hm⟩ := Subgroup.mem_zpowers_iff.mp ha + obtain ⟨n, hn⟩ := Subgroup.mem_zpowers_iff.mp hb + apply Subtype.ext + change (a : Q) * (b : Q) = (b : Q) * (a : Q) + rw [← hm, ← hn, ← zpow_add, add_comm, zpow_add]) + let c : CommGroup ↑s.topologicalClosure := + open scoped IsMulCommutative in inferInstance + letI : IsMulCommutative (D.frobeniusClosure K L hLK σ) := + isMulCommutative_iff.mpr c.mul_comm + exact open scoped IsMulCommutative in inferInstance + +/-- By construction, `σ` topologically generates `Γ`. -/ +theorem frobeniusInClosure_topologicallyGenerates + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + TopologicallyGenerates + ({D.frobeniusInClosure K L hLK σ} : Set + (D.frobeniusClosure K L hLK σ)) := by + let φ : Unit → + (K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) := + fun _ => σ.1 + have hgen := closedSubgroupGeneratedMap_topologicallyGenerates φ + have hrange : Set.range (closedSubgroupGeneratedMap φ) = + ({closedSubgroupGeneratedMap φ ()} : Set + (closedSubgroupGenerated (Set.range φ))) := by + ext x + simp only [Set.mem_range, Set.mem_singleton_iff] + constructor + · rintro ⟨u, rfl⟩ + cases u + rfl + · intro hx + exact ⟨(), hx.symm⟩ + rw [hrange] at hgen + change TopologicallyGenerates + ({closedSubgroupGeneratedMap φ ()} : Set + (closedSubgroupGenerated (Set.range φ) : Subgroup _)) + exact hgen + +/-- The normalized degree restricted to `Γ`. -/ +def frobeniusClosureDegree (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + D.frobeniusClosure K L hLK σ →ₜ* ZHatMul := + (D.extensionNormalizedDegreeContinuous K L hLK).comp + (continuousSubgroupSubtype + (D.frobeniusClosure K L hLK σ).toSubgroup) + +/-- The degree map sends the canonical Frobenius-closure generator to its expected value. -/ +@[simp] +theorem frobeniusClosureDegree_generator (D : DegreeData G) + [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + D.frobeniusClosureDegree K L hLK σ + (D.frobeniusInClosure K L hLK σ) = + (Multiplicative.ofAdd (1 : ZHat)) ^ + D.frobeniusExponent K L hLK σ := by + change D.extensionNormalizedDegree K L hLK + (D.frobeniusInClosure K L hLK σ).1 = + (Multiplicative.ofAdd (1 : ZHat)) ^ + D.frobeniusExponent K L hLK σ + have hval : + (D.frobeniusInClosure K L hLK σ).1 = σ.1 := rfl + rw [hval] + exact D.extensionNormalizedDegree_frobenius_eq_pow K L hLK σ + +/-- The image of `d_K` on `Γ` is precisely `n ℤ̂`, where +`n = d_K(σ)`. This is the group-dual residue-degree calculation in +the Frobenius fixed-field residue-degree formula. -/ +theorem frobeniusClosureDegree_range (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + (D.frobeniusClosureDegree K L hLK σ).toMonoidHom.range = + AddSubgroup.toSubgroup + ((zHatMulNat (D.frobeniusExponent K L hLK σ)).toAddMonoidHom.range) := by + let : CompactSpace K.field.toSubgroup := by + change CompactSpace K.field + infer_instance + let Γ := D.frobeniusClosure K L hLK σ + let x : Γ := D.frobeniusInClosure K L hLK σ + let f : Γ →ₜ* ZHatMul := + D.frobeniusClosureDegree K L hLK σ + let n := D.frobeniusExponent K L hLK σ + let R : Subgroup ZHatMul := + AddSubgroup.toSubgroup ((zHatMulNat n).toAddMonoidHom.range) + have hn : 0 < n := D.frobeniusExponent_pos K L hLK σ + have hxgen : TopologicallyGenerates ({x} : Set Γ) := by + simpa [Γ, x] using + D.frobeniusInClosure_topologicallyGenerates K L hLK σ + have hfx : f x = + (Multiplicative.ofAdd (1 : ZHat)) ^ n := by + change D.frobeniusClosureDegree K L hLK σ + (D.frobeniusInClosure K L hLK σ) = + (Multiplicative.ofAdd (1 : ZHat)) ^ + D.frobeniusExponent K L hLK σ + exact D.frobeniusClosureDegree_generator K L hLK σ + have hRclosed : IsClosed (R : Set ZHatMul) := by + exact isClosed_zHatMulNat_range n + have hclosed_le_R : + (closedSubgroupGenerated ({f x} : Set ZHatMul) : Subgroup ZHatMul) ≤ R := by + apply Subgroup.topologicalClosure_minimal + · rw [Subgroup.closure_le] + intro y hy + rw [Set.mem_singleton_iff] at hy + subst y + rw [hfx] + change n • (1 : ZHat) ∈ + (zHatMulNat n).toAddMonoidHom.range + exact ⟨(1 : ZHat), rfl⟩ + · exact hRclosed + apply le_antisymm + · rintro y ⟨a, rfl⟩ + have ha : a ∈ + (closedSubgroupGenerated ({x} : Set Γ) : Subgroup Γ) := by + rw [show (closedSubgroupGenerated ({x} : Set Γ) : Subgroup Γ) = ⊤ by + simpa [TopologicallyGenerates, closedSubgroupGenerated] using hxgen] + trivial + exact hclosed_le_R + (map_mem_closedSubgroupGenerated_singleton f x ha) + · intro y hy + change y.toAdd ∈ (zHatMulNat n).toAddMonoidHom.range at hy + obtain ⟨z, hz⟩ := hy + have hzgen : z ∈ + (closedSubgroupGenerated + ({Multiplicative.ofAdd (1 : ZHat)} : Set ZHatMul) : + Subgroup ZHatMul) := by + rw [show (closedSubgroupGenerated + ({Multiplicative.ofAdd (1 : ZHat)} : Set ZHatMul) : + Subgroup ZHatMul) = ⊤ by + simpa [TopologicallyGenerates, closedSubgroupGenerated] using + zHatOne_topologicallyGenerates] + trivial + have hmap := map_mem_closedSubgroupGenerated_singleton + (zHatPowNat n) + (Multiplicative.ofAdd (1 : ZHat)) hzgen + have hclosed_le_range : + (closedSubgroupGenerated + ({(Multiplicative.ofAdd (1 : ZHat)) ^ n} : Set ZHatMul) : + Subgroup ZHatMul) ≤ f.toMonoidHom.range := by + apply Subgroup.topologicalClosure_minimal + · rw [Subgroup.closure_le] + intro w hw + rw [Set.mem_singleton_iff] at hw + subst w + exact ⟨x, hfx⟩ + · have hcompact : IsCompact (Set.range f) := + isCompact_range f.continuous_toFun + have hrange : Set.range f = (f.toMonoidHom.range : Set ZHatMul) := by + ext w + constructor <;> rintro ⟨a, rfl⟩ <;> exact ⟨a, rfl⟩ + let : T2Space ZHatMul := by + change T2Space ZHat + infer_instance + exact (hrange ▸ hcompact).isClosed + have hzmap : zHatPowNat n z ∈ f.toMonoidHom.range := by + apply hclosed_le_range + simpa using hmap + have hzy : zHatPowNat n z = y := by + apply Multiplicative.ext + exact hz + exact hzy ▸ hzmap + +/-- The Frobenius fixed-field residue-degree formula, stated as the index of the normalized +degree image: +the relative residue degree of the fixed field `Σ` over `K` is `d_K(σ)`. -/ +theorem frobeniusClosureDegree_range_index (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + (Subgroup.toAddSubgroup' + (D.frobeniusClosureDegree K L hLK σ).toMonoidHom.range).index = + D.frobeniusExponent K L hLK σ := by + rw [D.frobeniusClosureDegree_range K L hLK σ] + exact zHatMulNat_range_index _ + (D.frobeniusExponent_pos K L hLK σ) + +/-- The value of `d_K` on `Γ`, regarded in the subgroup `n ℤ̂`. -/ +def frobeniusClosureDegreeInMulNatRange (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) + (a : D.frobeniusClosure K L hLK σ) : + (zHatMulNat (D.frobeniusExponent K L hLK σ)).toAddMonoidHom.range := by + refine ⟨(D.frobeniusClosureDegree K L hLK σ a).toAdd, ?_⟩ + have ha : D.frobeniusClosureDegree K L hLK σ a ∈ + (D.frobeniusClosureDegree K L hLK σ).toMonoidHom.range := + ⟨a, rfl⟩ + rw [D.frobeniusClosureDegree_range K L hLK σ] at ha + exact ha + +/-- The restricted Frobenius-closure degree has the stated underlying profinite value. -/ +@[simp] +theorem frobeniusClosureDegreeInMulNatRange_coe (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) + (a : D.frobeniusClosure K L hLK σ) : + (D.frobeniusClosureDegreeInMulNatRange K L hLK σ a).1 = + (D.frobeniusClosureDegree K L hLK σ a).toAdd := + rfl + +/-- The normalized degree `d_Σ = (1/n)d_K` on `Γ`. -/ +def fixedFieldNormalizedDegree (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + D.frobeniusClosure K L hLK σ →ₜ* ZHatMul where + toFun a := Multiplicative.ofAdd + (zHatDivide (D.frobeniusExponent K L hLK σ) + (D.frobeniusExponent_pos K L hLK σ) + (D.frobeniusClosureDegreeInMulNatRange K L hLK σ a)) + map_one' := by + apply Multiplicative.ext + rw [show D.frobeniusClosureDegreeInMulNatRange K L hLK σ 1 = 0 by + apply Subtype.ext + exact congrArg Multiplicative.toAdd + (map_one (D.frobeniusClosureDegree K L hLK σ))] + exact map_zero (zHatDivide + (D.frobeniusExponent K L hLK σ) + (D.frobeniusExponent_pos K L hLK σ)) + map_mul' a b := by + apply Multiplicative.ext + rw [show D.frobeniusClosureDegreeInMulNatRange K L hLK σ (a * b) = + D.frobeniusClosureDegreeInMulNatRange K L hLK σ a + + D.frobeniusClosureDegreeInMulNatRange K L hLK σ b by + apply Subtype.ext + exact congrArg Multiplicative.toAdd + (map_mul (D.frobeniusClosureDegree K L hLK σ) a b)] + exact map_add (zHatDivide + (D.frobeniusExponent K L hLK σ) + (D.frobeniusExponent_pos K L hLK σ)) _ _ + continuous_toFun := by + apply (map_continuous (zHatDivide + (D.frobeniusExponent K L hLK σ) + (D.frobeniusExponent_pos K L hLK σ))).comp + exact Continuous.subtype_mk + (D.frobeniusClosureDegree K L hLK σ).continuous_toFun + (fun a => + (D.frobeniusClosureDegreeInMulNatRange K L hLK σ a).2) + +/-- The defining identity `n d_Σ = d_K` on `Γ`. -/ +theorem frobeniusExponent_nsmul_fixedFieldNormalizedDegree + (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) + (a : D.frobeniusClosure K L hLK σ) : + D.frobeniusExponent K L hLK σ • + (D.fixedFieldNormalizedDegree K L hLK σ a).toAdd = + (D.frobeniusClosureDegree K L hLK σ a).toAdd := by + exact zHatMulNat_zHatDivide + (D.frobeniusExponent K L hLK σ) + (D.frobeniusExponent_pos K L hLK σ) + (D.frobeniusClosureDegreeInMulNatRange K L hLK σ a) + +/-- The chosen lift has normalized degree `1` over its fixed field. -/ +@[simp] +theorem fixedFieldNormalizedDegree_generator (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + D.fixedFieldNormalizedDegree K L hLK σ + (D.frobeniusInClosure K L hLK σ) = + Multiplicative.ofAdd (1 : ZHat) := by + apply Multiplicative.ext + apply zHatMulNat_injective + (D.frobeniusExponent_pos K L hLK σ) + change D.frobeniusExponent K L hLK σ • + (D.fixedFieldNormalizedDegree K L hLK σ + (D.frobeniusInClosure K L hLK σ)).toAdd = + D.frobeniusExponent K L hLK σ • + (Multiplicative.ofAdd (1 : ZHat)).toAdd + rw [D.frobeniusExponent_nsmul_fixedFieldNormalizedDegree] + change (D.frobeniusClosureDegree K L hLK σ + (D.frobeniusInClosure K L hLK σ)).toAdd = + D.frobeniusExponent K L hLK σ • (1 : ZHat) + rw [D.frobeniusClosureDegree_generator] + rfl + +/-- The normalized degree on `Γ` is onto. -/ +theorem fixedFieldNormalizedDegree_surjective (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + Function.Surjective + (D.fixedFieldNormalizedDegree K L hLK σ) := by + intro z + have hz : Multiplicative.ofAdd + (D.frobeniusExponent K L hLK σ • z.toAdd) ∈ + (D.frobeniusClosureDegree K L hLK σ).toMonoidHom.range := by + rw [D.frobeniusClosureDegree_range K L hLK σ] + exact ⟨z.toAdd, rfl⟩ + obtain ⟨a, ha⟩ := hz + refine ⟨a, ?_⟩ + apply Multiplicative.ext + apply zHatMulNat_injective + (D.frobeniusExponent_pos K L hLK σ) + change D.frobeniusExponent K L hLK σ • + (D.fixedFieldNormalizedDegree K L hLK σ a).toAdd = + D.frobeniusExponent K L hLK σ • z.toAdd + rw [D.frobeniusExponent_nsmul_fixedFieldNormalizedDegree] + exact congrArg Multiplicative.toAdd ha + +/-- The closed cyclic group `Γ` is totally disconnected. -/ +theorem frobeniusClosure_totallyDisconnectedSpace (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + TotallyDisconnectedSpace (D.frobeniusClosure K L hLK σ) := by + let : CompactSpace K.field.toSubgroup := by + change CompactSpace K.field + infer_instance + let Q := K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK + let : TotallyDisconnectedSpace Q := + QuotientGroup.totallyDisconnectedSpace_of_isClosed + (D.extensionInertiaWithin K.field L hLK) + (D.extensionInertiaWithin_isClosed K L hLK) + infer_instance + +/-- finiteness of the Frobenius fixed field, in the Galois-dual form: the closed subgroup +`Γ = closure ⟨σ⟩` has finite index in `G(\widetilde L|K)`, hence its +fixed field `Σ` is finite over `K`. -/ +theorem frobeniusFixedField_finiteIndex (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (σ : D.FrobeniusElements K L hLK) : + Finite + ((K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) ⧸ + (D.frobeniusClosure K L hLK σ).toSubgroup) := by + let Q := K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK + let Γ : Subgroup Q := + (D.frobeniusClosure K L hLK σ).toSubgroup + let dQ : Q →ₜ* ZHatMul := + D.extensionNormalizedDegreeContinuous K L hLK + have hΓmap : Γ.map dQ.toMonoidHom = + (D.frobeniusClosureDegree K L hLK σ).toMonoidHom.range := by + ext z + constructor + · rintro ⟨q, hq, rfl⟩ + exact ⟨⟨q, hq⟩, rfl⟩ + · rintro ⟨q, rfl⟩ + exact ⟨q.1, q.2, rfl⟩ + have htopmap : (Subgroup.map dQ.toMonoidHom (⊤ : Subgroup Q)) = ⊤ := by + apply top_unique + intro z _ + obtain ⟨q, rfl⟩ := + D.extensionNormalizedDegreeContinuous_surjective K L hLK z + exact ⟨q, trivial, rfl⟩ + have himage : (Γ.map dQ.toMonoidHom).relIndex + ((⊤ : Subgroup Q).map dQ.toMonoidHom) ≠ 0 := by + rw [hΓmap, htopmap, Subgroup.relIndex_top_right, + D.frobeniusClosureDegree_range K L hLK σ, + AddSubgroup.index_toSubgroup, + zHatMulNat_range_index _ + (D.frobeniusExponent_pos K L hLK σ)] + exact (D.frobeniusExponent_pos K L hLK σ).ne' + let j := D.extensionDegreeKernelRestriction K L hLK + let : Finite dQ.toMonoidHom.ker := + Finite.of_injective j + (D.extensionDegreeKernelRestriction_injective K L hLK) + let T : Subgroup Q := (⊤ : Subgroup Q) ⊓ dQ.toMonoidHom.ker + let toKer : T → dQ.toMonoidHom.ker := + fun t => ⟨t.1, t.2.2⟩ + let : Finite T := Finite.of_injective toKer (by + intro a b hab + apply Subtype.ext + exact congrArg (fun x : dQ.toMonoidHom.ker => x.1) hab) + have hkernel : (Γ ⊓ dQ.toMonoidHom.ker).relIndex + ((⊤ : Subgroup Q) ⊓ dQ.toMonoidHom.ker) ≠ 0 := by + rw [Subgroup.relIndex] + change ((Γ ⊓ dQ.toMonoidHom.ker).subgroupOf T).index ≠ 0 + exact Subgroup.index_ne_zero_of_finite + have hrel : Γ.relIndex (⊤ : Subgroup Q) ≠ 0 := by + rw [relIndex_eq_map_relIndex_mul_inf_ker_relIndex + dQ.toMonoidHom le_top] + exact Nat.mul_ne_zero himage hkernel + apply (Subgroup.index_ne_zero_iff_finite).mp + simpa [Γ, Q, Subgroup.relIndex_top_right] using hrel + +/-- The procyclic degree isomorphism, kernel form: `d_Σ` has trivial kernel. The +proof is the comparison of the finite quotients `Γ/Γ^m` with +`ℤ̂/mℤ̂`. -/ +theorem frobeniusFixedField_normalizedDegree_injective (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + Function.Injective + (D.fixedFieldNormalizedDegree K L hLK σ) := by + let Γ := D.frobeniusClosure K L hLK σ + let : CompactSpace K.field.toSubgroup := by + change CompactSpace K.field + infer_instance + let : IsClosed + (D.extensionInertiaWithin K.field L hLK : Set K.field.toSubgroup) := + D.extensionInertiaWithin_isClosed K L hLK + let : TotallyDisconnectedSpace Γ := + D.frobeniusClosure_totallyDisconnectedSpace K L hLK σ + let : CommGroup Γ := + D.frobeniusClosureCommGroup K L hLK σ + apply injective_of_topologicallyGenerates_zHat_one + (D.fixedFieldNormalizedDegree K L hLK σ) + (D.frobeniusInClosure K L hLK σ) + · exact D.frobeniusInClosure_topologicallyGenerates K L hLK σ + · exact D.fixedFieldNormalizedDegree_generator K L hLK σ + +/-- The index estimate in the proof of finiteness of the Frobenius fixed field. When the chosen +Frobenius lift has degree one, the degree of its fixed field is at most the +degree of the finite Galois extension from which the lift was chosen. -/ +theorem frobeniusClosure_index_le_extensionIndex_of_exponent_eq_one + (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (σ : D.FrobeniusElements K L hLK) + (hσ : D.frobeniusExponent K L hLK σ = 1) : + (D.frobeniusClosure K L hLK σ).toSubgroup.index ≤ + (extensionSubgroup K.field L hLK).index := by + let Q := K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK + let dQ : Q →ₜ* ZHatMul := + D.extensionNormalizedDegreeContinuous K L hLK + let H : Subgroup Q := dQ.toMonoidHom.ker + let Γ : Subgroup Q := + (D.frobeniusClosure K L hLK σ).toSubgroup + let j := D.extensionDegreeKernelRestriction K L hLK + let : Finite H := + Finite.of_injective j + (D.extensionDegreeKernelRestriction_injective K L hLK) + have hΓmap : Γ.map dQ.toMonoidHom = + (D.frobeniusClosureDegree K L hLK σ).toMonoidHom.range := by + ext z + constructor + · rintro ⟨q, hq, rfl⟩ + exact ⟨⟨q, hq⟩, rfl⟩ + · rintro ⟨q, rfl⟩ + exact ⟨q.1, q.2, rfl⟩ + have htopmap : (⊤ : Subgroup Q).map dQ.toMonoidHom = ⊤ := by + apply top_unique + intro z _ + obtain ⟨q, hq⟩ := + D.extensionNormalizedDegreeContinuous_surjective K L hLK z + exact ⟨q, trivial, hq⟩ + have himage : (Γ.map dQ.toMonoidHom).relIndex + ((⊤ : Subgroup Q).map dQ.toMonoidHom) = 1 := by + rw [hΓmap, htopmap, Subgroup.relIndex_top_right, + D.frobeniusClosureDegree_range K L hLK σ, + AddSubgroup.index_toSubgroup, + zHatMulNat_range_index _ + (D.frobeniusExponent_pos K L hLK σ), hσ] + have hΓker : Γ ⊓ dQ.toMonoidHom.ker = ⊥ := by + apply le_antisymm + · intro q hq + let γ : D.frobeniusClosure K L hLK σ := ⟨q, hq.1⟩ + have hγDegreeOne : + D.frobeniusClosureDegree K L hLK σ γ = 1 := by + change dQ q = 1 + exact hq.2 + have hγNormalizedOne : + D.fixedFieldNormalizedDegree K L hLK σ γ = 1 := by + apply Multiplicative.ext + have hrel := + D.frobeniusExponent_nsmul_fixedFieldNormalizedDegree + K L hLK σ γ + rw [hσ, one_nsmul, hγDegreeOne] at hrel + simpa using hrel + have hγone : γ = 1 := + D.frobeniusFixedField_normalizedDegree_injective K L hLK σ (by + rw [map_one] + exact hγNormalizedOne) + change q = 1 + exact congrArg Subtype.val hγone + · exact bot_le + have hkernel : (Γ ⊓ dQ.toMonoidHom.ker).relIndex + ((⊤ : Subgroup Q) ⊓ dQ.toMonoidHom.ker) = + Nat.card H := by + rw [hΓker] + have htopker : (⊤ : Subgroup Q) ⊓ dQ.toMonoidHom.ker = + dQ.toMonoidHom.ker := inf_eq_right.mpr le_top + rw [htopker] + change (⊥ : Subgroup Q).relIndex H = Nat.card H + rw [Subgroup.relIndex_bot_left] + have hindex : Γ.index = Nat.card H := by + rw [← Subgroup.relIndex_top_right] + rw [relIndex_eq_map_relIndex_mul_inf_ker_relIndex dQ.toMonoidHom le_top, + himage, hkernel, one_mul] + have hcard_le : Nat.card H ≤ + Nat.card + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK) := + Nat.card_le_card_of_injective j + (D.extensionDegreeKernelRestriction_injective K L hLK) + calc + (D.frobeniusClosure K L hLK σ).toSubgroup.index = + Nat.card H := hindex + _ ≤ Nat.card + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK) := hcard_le + _ = (extensionSubgroup K.field L hLK).index := + (Subgroup.index_eq_card (extensionSubgroup K.field L hLK)).symm + +/-- The procyclic degree isomorphism: `d_Σ` identifies `Γ` continuously with `ℤ̂`. +On the field side its trivial kernel says exactly +`\widetilde Σ = \widetilde L`. -/ +def frobeniusFixedFieldNormalizedDegreeEquiv (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + D.frobeniusClosure K L hLK σ ≃ₜ* ZHatMul := by + letI : CompactSpace K.field.toSubgroup := by + change CompactSpace K.field + infer_instance + letI : IsClosed + (D.extensionInertiaWithin K.field L hLK : Set K.field.toSubgroup) := + D.extensionInertiaWithin_isClosed K L hLK + letI : T2Space ZHatMul := by + change T2Space ZHat + infer_instance + exact continuousMulEquivOfBijectiveCompactToT2 + (D.fixedFieldNormalizedDegree K L hLK σ).toMonoidHom + (D.fixedFieldNormalizedDegree K L hLK σ).continuous_toFun + ⟨D.frobeniusFixedField_normalizedDegree_injective K L hLK σ, + D.fixedFieldNormalizedDegree_surjective K L hLK σ⟩ + +/-- The normalized-degree equivalence on the Frobenius fixed field evaluates by restriction. -/ +@[simp] +theorem frobeniusFixedField_normalizedDegreeEquiv_apply (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) + (a : D.frobeniusClosure K L hLK σ) : + D.frobeniusFixedFieldNormalizedDegreeEquiv K L hLK σ a = + D.fixedFieldNormalizedDegree K L hLK σ a := + rfl + +/-- The explicit kernel-triviality form of the procyclic degree isomorphism. -/ +theorem frobeniusFixedField_kernel (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + (D.fixedFieldNormalizedDegree K L hLK σ).toMonoidHom.ker = ⊥ := by + exact (D.fixedFieldNormalizedDegree K L hLK σ).toMonoidHom.ker_eq_bot_iff.mpr + (D.frobeniusFixedField_normalizedDegree_injective K L hLK σ) + +/-- The Frobenius over the fixed field `Σ`, defined by `d_Σ(φ_Σ)=1`. -/ +def fixedFieldFrobenius (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + D.frobeniusClosure K L hLK σ := + (D.frobeniusFixedFieldNormalizedDegreeEquiv K L hLK σ).symm + (Multiplicative.ofAdd (1 : ZHat)) + +/-- The Frobenius characterization of the chosen lift: the original lift `σ` is the Frobenius of its +fixed field `Σ`. -/ +theorem frobeniusFixedField_frobenius (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + D.frobeniusInClosure K L hLK σ = + D.fixedFieldFrobenius K L hLK σ := by + apply (D.frobeniusFixedFieldNormalizedDegreeEquiv K L hLK σ).injective + rw [D.frobeniusFixedField_normalizedDegreeEquiv_apply] + rw [D.fixedFieldNormalizedDegree_generator] + exact + ((D.frobeniusFixedFieldNormalizedDegreeEquiv K L hLK σ).apply_symm_apply _).symm + +end DegreeData + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusLift.lean new file mode 100644 index 0000000000..db0939b56b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusLift.lean @@ -0,0 +1,232 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Frobenius + +/-! # Frobenius Lift -/ + +@[expose] public section +namespace ClassFormation + +open CyclicCohomology + +/-! +# normalized degree and Frobenius theory: lifting finite Galois automorphisms + +This file defines the Frobenius semigroup in `G(\widetilde L|K)` and proves +the lifting statement of the finite degree-quotient decomposition. Positivity is explicit, so the +convention `0 ∉ ℕ` is not lost in Lean's natural numbers. +-/ + +noncomputable +section + +universe u + +variable {G : Type u} [Group G] [TopologicalSpace G] + +/-- In a finite cyclic quotient of `ℤ̂`, every class is represented by a +strictly positive natural multiple of `1`. -/ +theorem exists_positive_nsmul_one_sub_mem_of_index_ne_zero + (H : AddSubgroup ZHat) (hH : H.index ≠ 0) (z : ZHat) : + ∃ n : ℕ, 0 < n ∧ z - n • (1 : ZHat) ∈ H := by + let m := H.index + have hm : 0 < m := Nat.pos_of_ne_zero hH + let r : ZMod m := zHatReduction m hm z + let n : ℕ := r.val + m + refine ⟨n, Nat.add_pos_right r.val hm, ?_⟩ + rw [zHatAddSubgroup_eq_mulNat_range_of_index_ne_zero H hH, + zHatMulNat_range_eq_ker_reduction m hm] + change zHatReduction m hm (z - n • (1 : ZHat)) = 0 + rw [map_sub, map_nsmul] + have hredOne : zHatReduction m hm (1 : ZHat) = 1 := + rfl + rw [hredOne] + change zHatReduction m hm z - n • (1 : ZMod m) = 0 + rw [nsmul_eq_mul, mul_one] + change r - (n : ZMod m) = 0 + have : NeZero m := ⟨Nat.ne_of_gt hm⟩ + have hn : (n : ZMod m) = r := by + change ((r.val + m : ℕ) : ZMod m) = r + rw [Nat.cast_add, ZMod.natCast_zmod_val, ZMod.natCast_self, add_zero] + rw [hn, sub_self] + +namespace DegreeData + +/-- `I_L`, viewed inside `G_K`; this is `G_{\widetilde L}`. -/ +def extensionInertiaWithin (D : DegreeData G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) : Subgroup K.toSubgroup := + extensionSubgroup K L hLK ⊓ D.fieldInertiaWithin K + +/-- +The relative inertia subgroup is normal whenever the full extension subgroup is normal. +-/ +instance extensionInertiaWithin_normal (D : DegreeData G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] : + (D.extensionInertiaWithin K L hLK).Normal := by + rw [extensionInertiaWithin] + infer_instance + +private theorem extensionInertiaWithin_le_normalizedDegree_ker + (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) : + D.extensionInertiaWithin K.field L hLK ≤ + (D.normalizedDegree K).toMonoidHom.ker := by + intro x hx + rw [D.normalizedDegree_ker K] + exact hx.2 + +/-- The factorized map `d_K : G(\widetilde L|K) → ℤ̂`. -/ +def extensionNormalizedDegree (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] : + (K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) →* ZHatMul := + QuotientGroup.lift (D.extensionInertiaWithin K.field L hLK) + (D.normalizedDegree K).toMonoidHom + (by exact D.extensionInertiaWithin_le_normalizedDegree_ker K L hLK) + +/-- +Establishes the identity `D.extensionNormalizedDegree K L hLK (QuotientGroup.mk k) = +D.normalizedDegree K k`. +-/ +@[simp] +theorem extensionNormalizedDegree_mk (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (k : K.field.toSubgroup) : + D.extensionNormalizedDegree K L hLK (QuotientGroup.mk k) = + D.normalizedDegree K k := + rfl + +/-- Restriction from `G(\widetilde L|K)` to `G(L|K)`. -/ +def extensionRestriction (D : DegreeData G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] : + (K.toSubgroup ⧸ D.extensionInertiaWithin K L hLK) →* + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + QuotientGroup.map (D.extensionInertiaWithin K L hLK) + (extensionSubgroup K L hLK) (MonoidHom.id K.toSubgroup) inf_le_left + +/-- +Establishes the identity `D.extensionRestriction K L hLK (QuotientGroup.mk k) = QuotientGroup.mk +k`. +-/ +@[simp] +theorem extensionRestriction_mk (D : DegreeData G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + (k : K.toSubgroup) : + D.extensionRestriction K L hLK (QuotientGroup.mk k) = + QuotientGroup.mk k := + rfl + +/-- The semigroup `Frob(\widetilde L|K)`: elements whose normalized +degree is a strictly positive natural. -/ +def FrobeniusElements (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] : Type u := + {σ : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK // + ∃ n : ℕ, 0 < n ∧ + D.extensionNormalizedDegree K L hLK σ = + (Multiplicative.ofAdd (1 : ZHat)) ^ n} + +/-- The restriction map occurring in the finite degree-quotient decomposition. -/ +def frobeniusRestriction (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] : + D.FrobeniusElements K L hLK → + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK) := + fun σ => D.extensionRestriction K.field L hLK σ.1 + +private def normalizedExtensionImageAdd (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) : AddSubgroup ZHat := + Subgroup.toAddSubgroup' + ((extensionSubgroup K.field L hLK).map + (D.normalizedDegree K).toMonoidHom) + +private theorem normalizedExtensionImageAdd_index_ne_zero + (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] : + (D.normalizedExtensionImageAdd K L hLK).index ≠ 0 := by + let E := extensionSubgroup K.field L hLK + let dK := (D.normalizedDegree K).toMonoidHom + let H := E.map dK + have hE : E ≤ H.comap dK := Subgroup.le_comap_map dK E + have hdvd : (H.comap dK).index ∣ E.index := + Subgroup.index_dvd_of_le hE + have hcomap : (H.comap dK).index = H.index := + Subgroup.index_comap_of_surjective H (D.normalizedDegree_surjective K) + have hHdvd : H.index ∣ E.index := hcomap ▸ hdvd + have hE0 : E.index ≠ 0 := E.index_ne_zero_of_finite + have hH0 : H.index ≠ 0 := by + intro hzero + rw [hzero] at hHdvd + exact hE0 (zero_dvd_iff.mp hHdvd) + exact hH0 + +/-- **the finite degree-quotient decomposition.** For a finite Galois extension `L | K`, restriction +maps the Frobenius semigroup onto `G(L|K)`. -/ +theorem frobeniusRestriction_surjective (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] : + Function.Surjective (D.frobeniusRestriction K L hLK) := by + intro σ + refine Quotient.inductionOn' σ ?_ + intro s + let H := D.normalizedExtensionImageAdd K L hLK + have hH0 : H.index ≠ 0 := + D.normalizedExtensionImageAdd_index_ne_zero K L hLK + obtain ⟨n, hn, hmem⟩ := + exists_positive_nsmul_one_sub_mem_of_index_ne_zero H hH0 + (D.normalizedDegree K s).toAdd + have hneg : n • (1 : ZHat) - (D.normalizedDegree K s).toAdd ∈ H := by + simpa [sub_eq_add_neg, add_comm] using H.neg_mem hmem + change Multiplicative.ofAdd + (n • (1 : ZHat) - (D.normalizedDegree K s).toAdd) ∈ + (extensionSubgroup K.field L hLK).map + (D.normalizedDegree K).toMonoidHom at hneg + obtain ⟨l, hlE, hdl⟩ := hneg + let t : K.field.toSubgroup := s * l + let q : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK := + QuotientGroup.mk t + have hdq : D.extensionNormalizedDegree K L hLK q = + (Multiplicative.ofAdd (1 : ZHat)) ^ n := by + apply Multiplicative.ext + change (D.normalizedDegree K (s * l)).toAdd = + n • (1 : ZHat) + rw [map_mul] + change (D.normalizedDegree K s).toAdd + + (D.normalizedDegree K l).toAdd = n • (1 : ZHat) + have hdl' := congrArg Multiplicative.toAdd hdl + change (D.normalizedDegree K l).toAdd = + n • (1 : ZHat) - (D.normalizedDegree K s).toAdd at hdl' + rw [hdl'] + abel + let qF : D.FrobeniusElements K L hLK := ⟨q, n, hn, hdq⟩ + refine ⟨qF, ?_⟩ + change QuotientGroup.mk (s * l) = QuotientGroup.mk s + apply QuotientGroup.eq.mpr + change (s * l)⁻¹ * s ∈ extensionSubgroup K.field L hLK + simpa [mul_inv_rev, mul_assoc] using + (extensionSubgroup K.field L hLK).inv_mem hlE + +end DegreeData + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Indices.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Indices.lean new file mode 100644 index 0000000000..d5387d671e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Indices.lean @@ -0,0 +1,320 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.QuotientTower + +/-! # Indices -/ + +@[expose] public section +namespace ClassFormation + +/-! +# Relative indices + +This file isolates the group-theoretic index calculation used in abstract valuation theory. +For a homomorphism `d`, an inclusion `L ≤ K` splits its relative index into the index of +the images under `d` and the relative index inside `ker d`. +-/ + +open scoped Pointwise + +universe u v + +variable {G : Type u} {D : Type v} [Group G] [Group D] + +/-- Include the kernel intersection into the part saturated by the kernel. -/ +def kernelToSaturation (d : G →* D) (L K : Subgroup G) : + ↑(K ⊓ d.ker) →* ↑(K ⊓ (L ⊔ d.ker)) := + Subgroup.inclusion (inf_le_inf le_rfl le_sup_right) + +private theorem kernelToSaturation_rel_iff (d : G →* D) (L K : Subgroup G) + (x y : ↑(K ⊓ d.ker)) : + QuotientGroup.leftRel ((L ⊓ d.ker).subgroupOf (K ⊓ d.ker)) x y ↔ + QuotientGroup.leftRel (L.subgroupOf (K ⊓ (L ⊔ d.ker))) + (kernelToSaturation d L K x) (kernelToSaturation d L K y) := by + simp only [QuotientGroup.leftRel_apply, Subgroup.mem_subgroupOf, Subgroup.mem_inf] + constructor + · exact fun h ↦ h.1 + · intro h + exact ⟨h, d.ker.mul_mem (d.ker.inv_mem x.property.2) y.property.2⟩ + +/-- Map kernel-intersection cosets to cosets in the kernel-saturated subgroup. -/ +noncomputable def kernelCosetToSaturationCoset (d : G →* D) (L K : Subgroup G) : + (↑(K ⊓ d.ker) ⧸ (L ⊓ d.ker).subgroupOf (K ⊓ d.ker)) → + (↑(K ⊓ (L ⊔ d.ker)) ⧸ L.subgroupOf (K ⊓ (L ⊔ d.ker))) := + Quotient.map' (kernelToSaturation d L K) (by + intro x y h + exact (kernelToSaturation_rel_iff d L K x y).mp h) + +private theorem kernelCosetToSaturationCoset_injective (d : G →* D) (L K : Subgroup G) : + Function.Injective (kernelCosetToSaturationCoset d L K) := by + intro q₁ q₂ + refine Quotient.inductionOn₂ q₁ q₂ ?_ + intro x y h + apply Quotient.eq''.mpr + apply (kernelToSaturation_rel_iff d L K x y).mpr + apply Quotient.eq''.mp + simpa only [kernelCosetToSaturationCoset, Quotient.map'_mk''] using h + +private theorem kernelCosetToSaturationCoset_surjective (d : G →* D) {L K : Subgroup G} + (hLK : L ≤ K) : Function.Surjective (kernelCosetToSaturationCoset d L K) := by + intro q + refine Quotient.inductionOn q ?_ + intro z + have hzSup : (z : G) ∈ d.ker ⊔ L := by + rw [sup_comm] + exact z.property.2 + obtain ⟨n, hnKer, l, hlL, hnl⟩ := + (Subgroup.mem_sup_of_normal_left (s := d.ker) (t := L)).mp hzSup + have hnK : n ∈ K := by + rw [show n = (z : G) * l⁻¹ by rw [← hnl]; simp] + exact K.mul_mem z.property.1 (K.inv_mem (hLK hlL)) + let n' : ↑(K ⊓ d.ker) := ⟨n, hnK, hnKer⟩ + refine ⟨Quotient.mk'' n', ?_⟩ + simp only [kernelCosetToSaturationCoset, Quotient.map'_mk''] + apply Quotient.eq''.mpr + rw [QuotientGroup.leftRel_apply, Subgroup.mem_subgroupOf] + change n⁻¹ * (z : G) ∈ L + rw [← hnl] + simpa using hlL + +/-- The kernel cosets for `L ≤ K` are the cosets in the part of `K` saturated by `ker d`. + +This is the set-level second-isomorphism argument needed for relative indices; no normality +assumption on `L` is required. -/ +noncomputable def kernelCosetEquivSaturation (d : G →* D) {L K : Subgroup G} (hLK : L ≤ K) : + (↑(K ⊓ d.ker) ⧸ (L ⊓ d.ker).subgroupOf (K ⊓ d.ker)) ≃ + (↑(K ⊓ (L ⊔ d.ker)) ⧸ L.subgroupOf (K ⊓ (L ⊔ d.ker))) := + Equiv.ofBijective (kernelCosetToSaturationCoset d L K) + ⟨by exact kernelCosetToSaturationCoset_injective d L K, + by exact kernelCosetToSaturationCoset_surjective d hLK⟩ + +/-- The index of `L` in the `ker d`-saturated part of `K` is the relative +index of the corresponding kernel intersections. -/ +theorem relIndex_saturation_eq_inf_ker_relIndex (d : G →* D) + {L K : Subgroup G} (hLK : L ≤ K) : + L.relIndex (K ⊓ (L ⊔ d.ker)) = + (L ⊓ d.ker).relIndex (K ⊓ d.ker) := by + unfold Subgroup.relIndex + exact Nat.card_congr (kernelCosetEquivSaturation d hLK).symm + +/-- The mapped relative index is the index of the `ker d`-saturated part of +`K`. -/ +theorem map_relIndex_eq_saturation_relIndex (d : G →* D) + (L K : Subgroup G) : + (L.map d).relIndex (K.map d) = + (K ⊓ (L ⊔ d.ker)).relIndex K := by + rw [← Subgroup.relIndex_comap, Subgroup.comap_map_eq, ← Subgroup.inf_relIndex_right, + inf_comm] + +/-- The exact relative-index identity associated to a group homomorphism. + +No finite-index assumption is needed: the proof is induced by equivalences +of coset types, so the equality remains valid with Mathlib's convention that +an infinite relative index is `0`. -/ +theorem relIndex_eq_map_relIndex_mul_inf_ker_relIndex (d : G →* D) {L K : Subgroup G} + (hLK : L ≤ K) : + L.relIndex K = + (L.map d).relIndex (K.map d) * (L ⊓ d.ker).relIndex (K ⊓ d.ker) := by + rw [map_relIndex_eq_saturation_relIndex, + ← relIndex_saturation_eq_inf_ker_relIndex d hLK, mul_comm] + exact (Subgroup.relIndex_mul_relIndex L (K ⊓ (L ⊔ d.ker)) K + (fun x hx ↦ ⟨hLK hx, (show L ≤ L ⊔ d.ker from le_sup_left) hx⟩) inf_le_left).symm + +/-! ## Cardinal-valued relative indices + +The natural-valued `Subgroup.relIndex` is useful only after finiteness is +known: it represents every infinite index by zero. The following API keeps +the actual coset cardinality and is therefore the source for general tower +and image--kernel laws. Chosen representatives occur only in private +equivalences used to prove these canonical equalities. -/ + +/-- The cardinality of the coset type of the intersection of two subgroups. + +This is defined for arbitrary subgroups. For the cardinal relative index of +an inclusion, use `relativeIndexCardinal`, which records the inclusion in its +domain. -/ +noncomputable def intersectionIndexCardinal (L K : Subgroup G) : Cardinal := + Cardinal.mk (K ⧸ L.subgroupOf K) + +/-- The cardinality of the actual relative coset type of a subgroup inclusion. -/ +noncomputable def relativeIndexCardinal {L K : Subgroup G} (_ : L ≤ K) : Cardinal := + intersectionIndexCardinal L K + +/-- At an explicitly finite boundary, the cardinal relative index specializes +to Mathlib's natural-valued relative index. -/ +theorem relativeIndexCardinal_eq_index_of_finite {L K : Subgroup G} (hLK : L ≤ K) + [Finite (K ⧸ L.subgroupOf K)] : + relativeIndexCardinal hLK = (L.relIndex K : Cardinal) := by + rw [relativeIndexCardinal, intersectionIndexCardinal, Subgroup.relIndex, Subgroup.index] + exact Nat.cast_card.symm + +/-- Establishes the identity `relativeIndexCardinal (le_refl K) = 1`. -/ +@[simp] theorem relativeIndexCardinal_self (K : Subgroup G) : + relativeIndexCardinal (le_refl K) = 1 := by + let α := K ⧸ K.subgroupOf K + let : Subsingleton α := by + constructor + intro q r + refine Quotient.inductionOn₂ q r ?_ + intro x y + apply Quotient.eq''.mpr + rw [QuotientGroup.leftRel_apply, Subgroup.mem_subgroupOf] + exact (x⁻¹ * y).2 + change Cardinal.mk α = 1 + exact Cardinal.mk_eq_one α + +/-- Relative cardinal indices multiply in every subgroup tower. -/ +theorem relativeIndexCardinal_mul {M L K : Subgroup G} + (hML : M ≤ L) (hLK : L ≤ K) : + relativeIndexCardinal hML * relativeIndexCardinal hLK = + relativeIndexCardinal (hML.trans hLK) := by + rw [mul_comm, relativeIndexCardinal, relativeIndexCardinal, + relativeIndexCardinal, intersectionIndexCardinal, intersectionIndexCardinal, + intersectionIndexCardinal, Cardinal.mul_def] + exact Cardinal.mk_congr (Subgroup.quotientTowerEquiv hML hLK).symm + +private def subgroupMapRestriction (d : G →* D) (K : Subgroup G) : + K →* K.map d where + toFun x := ⟨d x.1, ⟨x.1, x.2, rfl⟩⟩ + map_one' := Subtype.ext (map_one d) + map_mul' x y := Subtype.ext (map_mul d x.1 y.1) + +private theorem subgroupMapRestriction_surjective (d : G →* D) (K : Subgroup G) : + Function.Surjective (subgroupMapRestriction d K) := by + rintro ⟨_, x, hx, rfl⟩ + exact ⟨⟨x, hx⟩, rfl⟩ + +private theorem subgroupMapRestriction_rel_iff (d : G →* D) + (H : Subgroup D) (K : Subgroup G) (x y : K) : + QuotientGroup.leftRel ((H.comap d).subgroupOf K) x y ↔ + QuotientGroup.leftRel (H.subgroupOf (K.map d)) + (subgroupMapRestriction d K x) (subgroupMapRestriction d K y) := by + simp only [QuotientGroup.leftRel_apply, Subgroup.mem_subgroupOf, + Subgroup.mem_comap] + change d (x.1⁻¹ * y.1) ∈ H ↔ (d x.1)⁻¹ * d y.1 ∈ H + rw [map_mul, map_inv] + +private noncomputable def relativeCosetComapMap (d : G →* D) + (H : Subgroup D) (K : Subgroup G) : + (K ⧸ (H.comap d).subgroupOf K) → + (K.map d ⧸ H.subgroupOf (K.map d)) := + Quotient.map' (subgroupMapRestriction d K) fun x y h ↦ + (subgroupMapRestriction_rel_iff d H K x y).mp h + +private theorem relativeCosetComapMap_injective (d : G →* D) + (H : Subgroup D) (K : Subgroup G) : + Function.Injective (relativeCosetComapMap d H K) := by + intro q₁ q₂ + refine Quotient.inductionOn₂ q₁ q₂ ?_ + intro x y h + apply Quotient.eq''.mpr + apply (subgroupMapRestriction_rel_iff d H K x y).mpr + apply Quotient.eq''.mp + simpa only [relativeCosetComapMap, Quotient.map'_mk''] using h + +private theorem relativeCosetComapMap_surjective (d : G →* D) + (H : Subgroup D) (K : Subgroup G) : + Function.Surjective (relativeCosetComapMap d H K) := by + intro q + refine Quotient.inductionOn' q ?_ + intro z + obtain ⟨x, rfl⟩ := subgroupMapRestriction_surjective d K z + exact ⟨Quotient.mk'' x, by + simp only [relativeCosetComapMap, Quotient.map'_mk'']⟩ + +private noncomputable def relativeCosetComapEquiv (d : G →* D) + (H : Subgroup D) (K : Subgroup G) : + (K ⧸ (H.comap d).subgroupOf K) ≃ + (K.map d ⧸ H.subgroupOf (K.map d)) := + Equiv.ofBijective (relativeCosetComapMap d H K) + ⟨relativeCosetComapMap_injective d H K, + relativeCosetComapMap_surjective d H K⟩ + +private noncomputable def imageCosetEquivSaturation (d : G →* D) + (L K : Subgroup G) : + (K ⧸ (K ⊓ (L ⊔ d.ker)).subgroupOf K) ≃ + (K.map d ⧸ (L.map d).subgroupOf (K.map d)) := by + have hsub : + ((L.map d).comap d).subgroupOf K = + (K ⊓ (L ⊔ d.ker)).subgroupOf K := by + ext x + simp only [Subgroup.mem_subgroupOf, Subgroup.mem_inf] + rw [Subgroup.comap_map_eq] + exact (and_iff_right x.2).symm + exact (Subgroup.quotientEquivOfEq hsub.symm).trans + (relativeCosetComapEquiv d (L.map d) K) + +/-- Cardinal form of the image contribution: it is the intersection index of +the kernel-saturated part of the upper subgroup. -/ +theorem intersectionIndexCardinal_image_eq_saturation (d : G →* D) + (L K : Subgroup G) : + Cardinal.lift.{u} (intersectionIndexCardinal (L.map d) (K.map d)) = + Cardinal.lift.{v} + (intersectionIndexCardinal (K ⊓ (L ⊔ d.ker)) K) := by + exact (imageCosetEquivSaturation d L K).lift_cardinal_eq.symm + +/-- Cardinal form of the kernel contribution: intersecting both subgroups +with the kernel gives the saturated inner index. -/ +theorem relativeIndexCardinal_kernel_eq_saturation (d : G →* D) + {L K : Subgroup G} (hLK : L ≤ K) : + relativeIndexCardinal + (show L ⊓ d.ker ≤ K ⊓ d.ker from inf_le_inf hLK le_rfl) = + relativeIndexCardinal + (show L ≤ K ⊓ (L ⊔ d.ker) from fun _ hx ↦ + ⟨hLK hx, (show L ≤ L ⊔ d.ker from le_sup_left) hx⟩) := by + exact Cardinal.mk_congr (kernelCosetEquivSaturation d hLK) + +/-- The cardinal image--kernel identity for a subgroup inclusion. It remains +valid for infinite indices because it is induced by equivalences of the +actual coset types. -/ +theorem relativeIndexCardinal_eq_map_mul_inf_ker (d : G →* D) + {L K : Subgroup G} (hLK : L ≤ K) : + Cardinal.lift.{v} (relativeIndexCardinal hLK) = + Cardinal.lift.{u} + (relativeIndexCardinal (Subgroup.map_mono (f := d) hLK)) * + Cardinal.lift.{v} + (relativeIndexCardinal + (show L ⊓ d.ker ≤ K ⊓ d.ker from inf_le_inf hLK le_rfl)) := by + have hLS : L ≤ K ⊓ (L ⊔ d.ker) := fun _ hx ↦ + ⟨hLK hx, (show L ≤ L ⊔ d.ker from le_sup_left) hx⟩ + have hSK : K ⊓ (L ⊔ d.ker) ≤ K := inf_le_left + calc + Cardinal.lift.{v} (relativeIndexCardinal hLK) = + Cardinal.lift.{v} + (relativeIndexCardinal hLS) * + Cardinal.lift.{v} + (relativeIndexCardinal hSK) := by + rw [← Cardinal.lift_mul, relativeIndexCardinal_mul hLS hSK] + _ = Cardinal.lift.{v} + (relativeIndexCardinal + (show L ⊓ d.ker ≤ K ⊓ d.ker from inf_le_inf hLK le_rfl)) * + Cardinal.lift.{u} + (relativeIndexCardinal (Subgroup.map_mono (f := d) hLK)) := by + have hkernel : + intersectionIndexCardinal (L ⊓ d.ker) (K ⊓ d.ker) = + intersectionIndexCardinal L (K ⊓ (L ⊔ d.ker)) := by + simpa only [relativeIndexCardinal] using + relativeIndexCardinal_kernel_eq_saturation d hLK + change + Cardinal.lift.{v} + (intersectionIndexCardinal L (K ⊓ (L ⊔ d.ker))) * + Cardinal.lift.{v} + (intersectionIndexCardinal (K ⊓ (L ⊔ d.ker)) K) = + Cardinal.lift.{v} + (intersectionIndexCardinal (L ⊓ d.ker) (K ⊓ d.ker)) * + Cardinal.lift.{u} + (intersectionIndexCardinal (L.map d) (K.map d)) + rw [hkernel, intersectionIndexCardinal_image_eq_saturation d L K] + _ = Cardinal.lift.{u} + (relativeIndexCardinal (Subgroup.map_mono (f := d) hLK)) * + Cardinal.lift.{v} + (relativeIndexCardinal + (show L ⊓ d.ker ≤ K ⊓ d.ker from inf_le_inf hLK le_rfl)) := mul_comm _ _ + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Norm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Norm.lean new file mode 100644 index 0000000000..c7d7882a6e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Norm.lean @@ -0,0 +1,181 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.GroupTheory.Index +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerDelta + +/-! # Norm -/ + +@[expose] public section +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +/-! +# normalized degree and Frobenius theory: norms on abstract fields + +This file constructs the norm attached to a finite extension of the +abstract fields. An abstract field is represented, as in, by a closed +subgroup of the ambient profinite group. The norm is the sum over left +cosets (the additive form of the multiplicative product), so it does +not require the extension to be Galois. +-/ + +noncomputable +section + +open scoped BigOperators + +-- Mathlib's `Rep ℤ G` currently fixes `G` to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +/-- The value of a fixed coefficient at a left coset. This is independent +of the representative precisely because the coefficient is fixed by the +smaller abstract-field subgroup. -/ +def relativeCosetAction + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (a : ambientFixedAddSubgroup A L) + (q : K.toSubgroup ⧸ extensionSubgroup K L hLK) : A.V := + Quotient.liftOn' q (fun k : K.toSubgroup => A.ρ k.1 a.1) (by + intro x y hxy + have hmem : x⁻¹ * y ∈ extensionSubgroup K L hLK := + QuotientGroup.leftRel_apply.mp hxy + let l : L.toSubgroup := ⟨(x⁻¹ * y).1, hmem⟩ + have hy : y = x * ⟨l.1, hLK l.2⟩ := by + apply Subtype.ext + simp [l] + rw [hy] + change A.ρ x.1 a.1 = A.ρ (x.1 * l.1) a.1 + rw [map_mul] + change A.ρ x.1 a.1 = A.ρ x.1 (A.ρ l.1 a.1) + rw [a.2 l]) + +/-- The relative coset action on a quotient representative is the corresponding group action. -/ +@[simp] +theorem relativeCosetAction_mk + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (a : ambientFixedAddSubgroup A L) (k : K.toSubgroup) : + relativeCosetAction A K L hLK a (QuotientGroup.mk k) = A.ρ k.1 a.1 := + rfl + +/-- Left multiplication permutes the cosets of an arbitrary subgroup. -/ +def leftMulCosetEquiv {G : Type*} [Group G] + (H : Subgroup G) (g : G) : (G ⧸ H) ≃ (G ⧸ H) where + toFun q := g • q + invFun q := g⁻¹ • q + left_inv q := by simp + right_inv q := by simp + +/-- Left multiplication sends the coset of `x` to the coset of `g * x`. -/ +@[simp] theorem leftMulCosetEquiv_mk {G : Type*} [Group G] + (H : Subgroup G) (g x : G) : + leftMulCosetEquiv H g (QuotientGroup.mk x) = QuotientGroup.mk (g * x) := + rfl + +/-- The additive norm value from `A_L` to the ambient module. -/ +def relativeNormValue + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a : ambientFixedAddSubgroup A L) : A.V := by + letI := Fintype.ofFinite (K.toSubgroup ⧸ extensionSubgroup K L hLK) + exact ∑ q, relativeCosetAction A K L hLK a q + +/-- The relative coset action is additive in the represented fixed element. -/ +theorem relativeCosetAction_add + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (a b : ambientFixedAddSubgroup A L) + (q : K.toSubgroup ⧸ extensionSubgroup K L hLK) : + relativeCosetAction A K L hLK (a + b) q = + relativeCosetAction A K L hLK a q + + relativeCosetAction A K L hLK b q := by + refine Quotient.inductionOn' q ?_ + intro k + simp only [relativeCosetAction_mk] + exact map_add (A.ρ k.1) a.1 b.1 + +/-- Every relative coset acts trivially on the zero fixed element. -/ +@[simp] +theorem relativeCosetAction_zero + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (q : K.toSubgroup ⧸ extensionSubgroup K L hLK) : + relativeCosetAction A K L hLK 0 q = 0 := by + refine Quotient.inductionOn' q ?_ + intro k + simp only [relativeCosetAction_mk] + exact map_zero (A.ρ k.1) + +/-- The relative norm value is fixed by the base subgroup action. -/ +theorem relativeNormValue_fixed + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a : ambientFixedAddSubgroup A L) (k : K.toSubgroup) : + A.ρ k.1 (relativeNormValue A K L hLK a) = + relativeNormValue A K L hLK a := by + let := Fintype.ofFinite (K.toSubgroup ⧸ extensionSubgroup K L hLK) + have hterm : ∀ q : K.toSubgroup ⧸ extensionSubgroup K L hLK, + A.ρ k.1 (relativeCosetAction A K L hLK a q) = + relativeCosetAction A K L hLK a + (leftMulCosetEquiv (extensionSubgroup K L hLK) k q) := by + intro q + refine Quotient.inductionOn' q ?_ + intro x + simp only [relativeCosetAction_mk, leftMulCosetEquiv_mk] + change A.ρ k.1 (A.ρ x.1 a.1) = A.ρ (k.1 * x.1) a.1 + rw [map_mul] + rfl + rw [relativeNormValue] + simp_rw [map_sum, hterm] + exact (leftMulCosetEquiv (extensionSubgroup K L hLK) k).sum_comp + (relativeCosetAction A K L hLK a) + +/-- The norm homomorphism for a finite abstract extension `L | K`. + +In the multiplicative notation of the construction this additive sum is the product +over a system of representatives of `G_K / G_L`. Its codomain is the +actual fixed module `A_K`, with fixedness proved by coset reindexing. -/ +def relativeNorm + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + ambientFixedAddSubgroup A L →+ ambientFixedAddSubgroup A K where + toFun a := ⟨relativeNormValue A K L hLK a, + relativeNormValue_fixed A K L hLK a⟩ + map_zero' := by + apply Subtype.ext + let := Fintype.ofFinite (K.toSubgroup ⧸ extensionSubgroup K L hLK) + simp [relativeNormValue] + map_add' a b := by + apply Subtype.ext + let := Fintype.ofFinite (K.toSubgroup ⧸ extensionSubgroup K L hLK) + simp only [AddSubgroup.coe_add, relativeNormValue] + rw [← Finset.sum_add_distrib] + apply Finset.sum_congr rfl + intro q _ + exact relativeCosetAction_add A K L hLK a b q + +/-- Coercing a relative norm gives the explicit sum over quotient representatives. -/ +@[simp] +theorem relativeNorm_apply_coe + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a : ambientFixedAddSubgroup A L) : + ((relativeNorm A K L hLK a : ambientFixedAddSubgroup A K) : A.V) = + relativeNormValue A K L hLK a := + rfl + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormConjugation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormConjugation.lean new file mode 100644 index 0000000000..ee882cf0a0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormConjugation.lean @@ -0,0 +1,303 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormLaws +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +/-! # Norm Conjugation -/ + +@[expose] public section +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +/-! +# Conjugation and relative norms + +These are the field-conjugation and norm identities used in the abstract reciprocity + construction and theorem. They belong before the reciprocity construction: their proofs +use only the actual relative norm and the conjugation action. +-/ + +noncomputable +section + +open scoped BigOperators + +universe u + +section GroupOnly + +variable {G : Type u} [Group G] [TopologicalSpace G] + +/-- Conjugation preserves inclusions of abstract fields. -/ +theorem conjugateClosedSubgroup_mono [ContinuousMul G] + {K L : ClosedSubgroup G} (hLK : L.toSubgroup ≤ K.toSubgroup) + (s : G) : + (conjugateClosedSubgroup L s).toSubgroup ≤ + (conjugateClosedSubgroup K s).toSubgroup := by + intro x hx + change x ∈ conjugateClosedSubgroup L s at hx + change x ∈ conjugateClosedSubgroup K s + rw [conjugateClosedSubgroup_mem] at hx ⊢ + exact hLK hx + +/-- Conjugation by `s⁻¹` identifies a field subgroup with the subgroup +representing its right conjugate `K^s`. -/ +def conjugateSubgroupEquiv [ContinuousMul G] + (K : ClosedSubgroup G) (s : G) : + K.toSubgroup ≃* (conjugateClosedSubgroup K s).toSubgroup where + toFun k := ⟨s⁻¹ * k.1 * s, by + change s⁻¹ * k.1 * s ∈ conjugateClosedSubgroup K s + rw [conjugateClosedSubgroup_mem] + convert k.2 using 1 + simp [mul_assoc]⟩ + invFun x := ⟨s * x.1 * s⁻¹, + (conjugateClosedSubgroup_mem K s x.1).mp x.2⟩ + left_inv k := by + apply Subtype.ext + simp [mul_assoc] + right_inv x := by + apply Subtype.ext + simp [mul_assoc] + map_mul' a b := by + apply Subtype.ext + simp [mul_assoc] + +/-- Establishes the identity `(conjugateSubgroupEquiv K s k).1 = s⁻¹ * k.1 * s`. -/ +@[simp] +theorem conjugateSubgroupEquiv_apply_coe [ContinuousMul G] + (K : ClosedSubgroup G) (s : G) (k : K.toSubgroup) : + (conjugateSubgroupEquiv K s k).1 = s⁻¹ * k.1 * s := + rfl + +/-- Conjugation carries the subgroup for `L/K` exactly to the subgroup for +`L^s/K^s`. -/ +theorem map_extensionSubgroup_conjugate [ContinuousMul G] + (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) (s : G) : + (extensionSubgroup K L hLK).map + (conjugateSubgroupEquiv K s).toMonoidHom = + extensionSubgroup (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) := by + ext x + constructor + · rintro ⟨k, hk, rfl⟩ + change s⁻¹ * k.1 * s ∈ conjugateClosedSubgroup L s + rw [conjugateClosedSubgroup_mem] + simpa [mul_assoc] using hk + · intro hx + refine ⟨(conjugateSubgroupEquiv K s).symm x, ?_, ?_⟩ + · change s * x.1 * s⁻¹ ∈ L.toSubgroup + exact (conjugateClosedSubgroup_mem L s x.1).mp hx + · exact (conjugateSubgroupEquiv K s).apply_symm_apply x + +/-- Conjugation identifies the relative coset spaces even when the +extension is not normal. -/ +noncomputable def relativeConjugateCosetEquiv [ContinuousMul G] + (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) (s : G) : + (K.toSubgroup ⧸ extensionSubgroup K L hLK) ≃ + ((conjugateClosedSubgroup K s).toSubgroup ⧸ + extensionSubgroup (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) := + Quotient.congr (conjugateSubgroupEquiv K s).toEquiv (by + intro x y + rw [QuotientGroup.leftRel_apply, QuotientGroup.leftRel_apply] + let e := conjugateSubgroupEquiv K s + let H := extensionSubgroup K L hLK + let Hs := extensionSubgroup (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + have hmap : H.map e.toMonoidHom = Hs := + map_extensionSubgroup_conjugate K L hLK s + change x⁻¹ * y ∈ H ↔ (e x)⁻¹ * e y ∈ Hs + rw [← hmap] + constructor + · intro hxy + refine ⟨x⁻¹ * y, hxy, ?_⟩ + simp + · rintro ⟨z, hz, hez⟩ + have heq : z = x⁻¹ * y := by + apply e.injective + simpa using hez + simpa [heq] using hz) + +/-- +Establishes the identity `relativeConjugateCosetEquiv K L hLK s (QuotientGroup.mk k) = +QuotientGroup.mk (conjugateSubgroupEquiv K s k)`. +-/ +@[simp] +theorem relativeConjugateCosetEquiv_mk [ContinuousMul G] + (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) (s : G) + (k : K.toSubgroup) : + relativeConjugateCosetEquiv K L hLK s (QuotientGroup.mk k) = + QuotientGroup.mk (conjugateSubgroupEquiv K s k) := + rfl + +/-- A conjugate of a Galois extension is Galois. -/ +instance conjugateExtension_normal [ContinuousMul G] + (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) (s : G) + [hLnormal : (extensionSubgroup K L hLK).Normal] : + (extensionSubgroup (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)).Normal := by + rw [← map_extensionSubgroup_conjugate K L hLK s] + exact Subgroup.Normal.map hLnormal + (conjugateSubgroupEquiv K s).toMonoidHom + (conjugateSubgroupEquiv K s).surjective + +/-- The left vertical isomorphism in the conjugation diagram of +norm--conjugation naturality, `τ ↦ s⁻¹τs`. -/ +noncomputable def finiteReciprocityNaturalityConjugation + [ContinuousMul G] (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) (s : G) + [hLnormal : (extensionSubgroup K L hLK).Normal] : + (K.toSubgroup ⧸ extensionSubgroup K L hLK) ≃* + ((conjugateClosedSubgroup K s).toSubgroup ⧸ + extensionSubgroup (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) := + QuotientGroup.congr + (extensionSubgroup K L hLK) + (extensionSubgroup (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) + (conjugateSubgroupEquiv K s) + (map_extensionSubgroup_conjugate K L hLK s) + +/-- +Establishes the identity `finiteReciprocityNaturalityConjugation K L hLK s (QuotientGroup.mk k) = +QuotientGroup.mk (conjugateSubgroupEquiv K s k)`. +-/ +@[simp] +theorem finiteReciprocityNaturalityConjugation_mk [ContinuousMul G] + (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) (s : G) + [hLnormal : (extensionSubgroup K L hLK).Normal] + (k : K.toSubgroup) : + finiteReciprocityNaturalityConjugation K L hLK s (QuotientGroup.mk k) = + QuotientGroup.mk (conjugateSubgroupEquiv K s k) := by + exact QuotientGroup.congr_mk' _ _ _ _ k + +/-- Conjugation preserves finiteness of the Galois quotient. -/ +theorem finite_conjugateExtension [ContinuousMul G] + (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) (s : G) + [hLfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + Finite ((conjugateClosedSubgroup K s).toSubgroup ⧸ + extensionSubgroup (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) := + Finite.of_equiv + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + (relativeConjugateCosetEquiv K L hLK s) + +end GroupOnly + +section Representation + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +/-- Conjugation intertwines the two relative coset actions. -/ +private theorem relativeCosetAction_conjugate + [ContinuousMul G] (A : Rep ℤ G) + (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) (s : G) + (a : ambientFixedAddSubgroup A L) + (q : K.toSubgroup ⧸ extensionSubgroup K L hLK) : + relativeCosetAction A (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + (conjugateFixedElement A L s a) + (relativeConjugateCosetEquiv K L hLK s q) = + A.ρ s⁻¹ (relativeCosetAction A K L hLK a q) := by + refine Quotient.inductionOn' q ?_ + intro k + rw [relativeConjugateCosetEquiv_mk, relativeCosetAction_mk, + relativeCosetAction_mk, conjugateFixedElement_coe] + calc + A.ρ (s⁻¹ * k.1 * s) (A.ρ s⁻¹ a.1) = + A.ρ ((s⁻¹ * k.1 * s) * s⁻¹) a.1 := by + have hm := congrArg (fun φ => φ a.1) + (map_mul A.ρ (s⁻¹ * k.1 * s) s⁻¹) + exact hm.symm + _ = A.ρ (s⁻¹ * k.1) a.1 := by + congr 2 + simp [mul_assoc] + _ = A.ρ s⁻¹ (A.ρ k.1 a.1) := by + exact congrArg (fun φ => φ a.1) (map_mul A.ρ s⁻¹ k.1) + +/-- Relative norms commute with the right conjugation used in the second +diagram of norm--conjugation naturality: +`N_{L^s/K^s}(a^s) = N_{L/K}(a)^s`. -/ +theorem relativeNorm_conjugate_apply + [ContinuousMul G] (A : Rep ℤ G) + (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) (s : G) + [hLfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a : ambientFixedAddSubgroup A L) : + letI : Finite ((conjugateClosedSubgroup K s).toSubgroup ⧸ + extensionSubgroup (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) := + finite_conjugateExtension K L hLK s + relativeNorm A (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + (conjugateFixedElement A L s a) = + conjugateFixedElement A K s (relativeNorm A K L hLK a) := by + let hConj := conjugateClosedSubgroup_mono hLK s + let := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + let e := relativeConjugateCosetEquiv K L hLK s + let conjugateFintype : Fintype + ((conjugateClosedSubgroup K s).toSubgroup ⧸ + extensionSubgroup (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) hConj) := + Fintype.ofEquiv (K.toSubgroup ⧸ extensionSubgroup K L hLK) e + have hconjugateFintype : Fintype.ofFinite + ((conjugateClosedSubgroup K s).toSubgroup ⧸ + extensionSubgroup (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) hConj) = conjugateFintype := + Subsingleton.elim _ _ + apply Subtype.ext + simp only [relativeNorm_apply_coe, relativeNormValue, + conjugateFixedElement_coe] + rw [hconjugateFintype] + calc + ∑ q, relativeCosetAction A (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) hConj + (conjugateFixedElement A L s a) q = + ∑ q, relativeCosetAction A (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) hConj + (conjugateFixedElement A L s a) (e q) := by + exact (e.sum_comp fun q => + relativeCosetAction A (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) hConj + (conjugateFixedElement A L s a) q).symm + _ = ∑ q, A.ρ s⁻¹ (relativeCosetAction A K L hLK a q) := by + apply Finset.sum_congr rfl + intro q _ + exact relativeCosetAction_conjugate A K L hLK s a q + _ = A.ρ s⁻¹ (∑ q, relativeCosetAction A K L hLK a q) := by + rw [map_sum] + +end Representation + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormLaws.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormLaws.lean new file mode 100644 index 0000000000..ba003ae790 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormLaws.lean @@ -0,0 +1,465 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Valuation +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.QuotientTower + +/-! # Norm Laws -/ + +@[expose] public section +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +/-! +# Laws for relative norms + +This file proves the structural laws for the coset-sum norm constructed in `Norm.lean`. +-/ + +noncomputable +section + +open scoped BigOperators Pointwise + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +/-- The subgroup corresponding to the conjugate abstract field `K^σ`. + +The construction uses a right exponent, hence `G_{K^σ} = σ⁻¹ G_K σ`. -/ +def conjugateClosedSubgroup {G : Type*} [Group G] [TopologicalSpace G] + [ContinuousMul G] + (K : ClosedSubgroup G) (σ : G) : ClosedSubgroup G where + toSubgroup := ConjAct.toConjAct σ⁻¹ • K.toSubgroup + isClosed' := by + convert IsClosed.preimage + (IsTopologicalGroup.continuous_conj (G := G) σ) K.isClosed' using 1 + ext x + change x ∈ (ConjAct.toConjAct σ⁻¹ • K.toSubgroup : Subgroup G) ↔ + σ * x * σ⁻¹ ∈ K.toSubgroup + rw [Subgroup.mem_pointwise_smul_iff_inv_smul_mem] + simp only [ConjAct.toConjAct_inv, inv_inv, ConjAct.toConjAct_smul] + +/-- +Characterizes `x ∈ conjugateClosedSubgroup K σ` by the equivalent condition `σ * x * σ⁻¹ ∈ K`. +-/ +@[simp] +theorem conjugateClosedSubgroup_mem {G : Type*} [Group G] [TopologicalSpace G] + [ContinuousMul G] + (K : ClosedSubgroup G) (σ x : G) : + x ∈ conjugateClosedSubgroup K σ ↔ σ * x * σ⁻¹ ∈ K := by + change x ∈ (ConjAct.toConjAct σ⁻¹ • K.toSubgroup : Subgroup G) ↔ + σ * x * σ⁻¹ ∈ K.toSubgroup + rw [Subgroup.mem_pointwise_smul_iff_inv_smul_mem] + simp only [ConjAct.toConjAct_inv, inv_inv, ConjAct.toConjAct_smul] + +/-- The right-conjugate `a^σ`, expressed through the left action of `G`. -/ +def conjugateFixedElement [ContinuousMul G] + (A : Rep ℤ G) (K : ClosedSubgroup G) (σ : G) + (a : ambientFixedAddSubgroup A K) : + ambientFixedAddSubgroup A (conjugateClosedSubgroup K σ) := by + refine ⟨A.ρ σ⁻¹ a.1, ?_⟩ + intro x + let k : K.toSubgroup := ⟨σ * x.1 * σ⁻¹, + (conjugateClosedSubgroup_mem K σ x.1).mp x.2⟩ + calc + A.ρ x.1 (A.ρ σ⁻¹ a.1) = A.ρ (x.1 * σ⁻¹) a.1 := by + rw [map_mul] + rfl + _ = A.ρ (σ⁻¹ * k.1) a.1 := by simp [k, mul_assoc] + _ = A.ρ σ⁻¹ (A.ρ k.1 a.1) := by + rw [map_mul] + rfl + _ = A.ρ σ⁻¹ a.1 := by rw [a.2 k] + +/-- +Establishes the identity `((conjugateFixedElement A K σ a : ambientFixedAddSubgroup A +(conjugateClosedSubgroup K σ)) : A.V) = A.ρ σ⁻¹ a.1`. +-/ +@[simp] +theorem conjugateFixedElement_coe [ContinuousMul G] + (A : Rep ℤ G) (K : ClosedSubgroup G) (σ : G) + (a : ambientFixedAddSubgroup A K) : + ((conjugateFixedElement A K σ a : + ambientFixedAddSubgroup A (conjugateClosedSubgroup K σ)) : A.V) = + A.ρ σ⁻¹ a.1 := + rfl + +/-- Conjugation permutes the elements of the absolute base subgroup. -/ +def absoluteConjugationEquiv {G : Type*} [Group G] [TopologicalSpace G] + (σ : G) : + (baseField G).toSubgroup ≃ + (baseField G).toSubgroup where + toFun x := ⟨σ * x.1 * σ⁻¹, trivial⟩ + invFun x := ⟨σ⁻¹ * x.1 * σ, trivial⟩ + left_inv x := by + apply Subtype.ext + simp [mul_assoc] + right_inv x := by + apply Subtype.ext + simp [mul_assoc] + +private theorem mem_absoluteExtension {G : Type*} [Group G] [TopologicalSpace G] + (K : ClosedSubgroup G) + (x : (baseField G).toSubgroup) : + x ∈ extensionSubgroup (baseField G) K + (le_baseField K) ↔ x.1 ∈ K := + Iff.rfl + +/-- Conjugation identifies the absolute coset spaces for `K^σ` and `K`. -/ +noncomputable def absoluteConjugateCosetEquiv + {G : Type*} [Group G] [TopologicalSpace G] [ContinuousMul G] + (K : ClosedSubgroup G) (σ : G) : + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (conjugateClosedSubgroup K σ) + (le_baseField (conjugateClosedSubgroup K σ))) ≃ + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) K + (le_baseField K)) := + Quotient.congr (absoluteConjugationEquiv σ) (by + intro x y + rw [QuotientGroup.leftRel_apply, QuotientGroup.leftRel_apply, + mem_absoluteExtension, mem_absoluteExtension, + conjugateClosedSubgroup_mem] + change σ * (x.1⁻¹ * y.1) * σ⁻¹ ∈ K.toSubgroup ↔ + (σ * x.1 * σ⁻¹)⁻¹ * (σ * y.1 * σ⁻¹) ∈ K.toSubgroup + simp [mul_assoc]) + +/-- +Establishes the identity `absoluteConjugateCosetEquiv K σ (QuotientGroup.mk x) = QuotientGroup.mk +(absoluteConjugationEquiv σ x)`. +-/ +theorem absoluteConjugateCosetEquiv_mk + {G : Type*} [Group G] [TopologicalSpace G] [ContinuousMul G] + (K : ClosedSubgroup G) (σ : G) + (x : (baseField G).toSubgroup) : + absoluteConjugateCosetEquiv K σ (QuotientGroup.mk x) = + QuotientGroup.mk (absoluteConjugationEquiv σ x) := + rfl + +private theorem relativeCosetAction_absoluteConjugate [ContinuousMul G] + (A : Rep ℤ G) (K : ClosedSubgroup G) (σ : G) + (a : ambientFixedAddSubgroup A K) + (q : (baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (conjugateClosedSubgroup K σ) + (le_baseField (conjugateClosedSubgroup K σ))) : + relativeCosetAction A (baseField G) + (conjugateClosedSubgroup K σ) + (le_baseField (conjugateClosedSubgroup K σ)) + (conjugateFixedElement A K σ a) q = + A.ρ σ⁻¹ + (relativeCosetAction A (baseField G) K + (le_baseField K) a + (absoluteConjugateCosetEquiv K σ q)) := by + refine Quotient.inductionOn' q ?_ + intro x + rw [relativeCosetAction_mk, absoluteConjugateCosetEquiv_mk, + relativeCosetAction_mk, conjugateFixedElement_coe] + calc + A.ρ x.1 (A.ρ σ⁻¹ a.1) = A.ρ (x.1 * σ⁻¹) a.1 := by + rw [map_mul] + rfl + _ = A.ρ (σ⁻¹ * (σ * x.1 * σ⁻¹)) a.1 := by simp [mul_assoc] + _ = A.ρ σ⁻¹ (A.ρ (σ * x.1 * σ⁻¹) a.1) := by + rw [map_mul] + rfl + +/-- conjugation compatibility of normalized valuations: the absolute norm commutes with conjugation. + +The construction writes the action on fields and elements on the right. Thus the +left action used by `Rep` realizes `a^σ` as `ρ(σ⁻¹)a`. -/ +theorem relativeNorm_absoluteConjugate_apply [ContinuousMul G] + (A : Rep ℤ G) (K : ClosedSubgroup G) (σ : G) + [Finite + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) K + (le_baseField K))] + (a : ambientFixedAddSubgroup A K) : + letI : Finite + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (conjugateClosedSubgroup K σ) + (le_baseField (conjugateClosedSubgroup K σ))) := + Finite.of_equiv + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) K + (le_baseField K)) + (absoluteConjugateCosetEquiv K σ).symm + ((relativeNorm A (baseField G) + (conjugateClosedSubgroup K σ) + (le_baseField (conjugateClosedSubgroup K σ)) + (conjugateFixedElement A K σ a) : + ambientFixedAddSubgroup A (baseField G)) : A.V) = + A.ρ σ⁻¹ + ((relativeNorm A (baseField G) K + (le_baseField K) a : + ambientFixedAddSubgroup A (baseField G)) : A.V) := by + let := Fintype.ofFinite + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) K + (le_baseField K)) + let conjugateFintype : Fintype + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (conjugateClosedSubgroup K σ) + (le_baseField (conjugateClosedSubgroup K σ))) := + Fintype.ofEquiv + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) K + (le_baseField K)) + (absoluteConjugateCosetEquiv K σ).symm + have hconjugateFintype : Fintype.ofFinite + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (conjugateClosedSubgroup K σ) + (le_baseField (conjugateClosedSubgroup K σ))) = conjugateFintype := + Subsingleton.elim _ _ + simp only [relativeNorm_apply_coe, relativeNormValue] + rw [hconjugateFintype] + calc + ∑ q, relativeCosetAction A (baseField G) + (conjugateClosedSubgroup K σ) + (le_baseField (conjugateClosedSubgroup K σ)) + (conjugateFixedElement A K σ a) q = + ∑ q, A.ρ σ⁻¹ + (relativeCosetAction A (baseField G) K + (le_baseField K) a + (absoluteConjugateCosetEquiv K σ q)) := by + apply Finset.sum_congr rfl + intro q _ + exact relativeCosetAction_absoluteConjugate A K σ a q + _ = A.ρ σ⁻¹ + (∑ q, relativeCosetAction A (baseField G) K + (le_baseField K) a + (absoluteConjugateCosetEquiv K σ q)) := by + rw [map_sum] + _ = A.ρ σ⁻¹ + (∑ q, relativeCosetAction A (baseField G) K + (le_baseField K) a q) := by + rw [(absoluteConjugateCosetEquiv K σ).sum_comp] + +/-- The action of an element of `G_K` on `A_L`, when `L | K` is Galois. + +Normality is used only to prove that the translate is still fixed by `G_L`. -/ +def normalExtensionAction + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (k : K.toSubgroup) (a : ambientFixedAddSubgroup A L) : + ambientFixedAddSubgroup A L := by + refine ⟨A.ρ k.1 a.1, ?_⟩ + intro l + let lK : K.toSubgroup := Subgroup.inclusion hLK l + have hc : k⁻¹ * lK * k ∈ extensionSubgroup K L hLK := + by simpa using hnormal.conj_mem lK l.2 k⁻¹ + let l' : L.toSubgroup := ⟨(k⁻¹ * lK * k).1, hc⟩ + have hl'val : (l' : G) = (k⁻¹ * lK * k : K.toSubgroup) := + rfl + calc + A.ρ l.1 (A.ρ k.1 a.1) = A.ρ (l.1 * k.1) a.1 := by rw [map_mul]; rfl + _ = A.ρ (k.1 * l'.1) a.1 := by rw [hl'val]; simp [lK, mul_assoc] + _ = A.ρ k.1 (A.ρ l'.1 a.1) := by rw [map_mul]; rfl + _ = A.ρ k.1 a.1 := by rw [a.2 l'] + +/-- +Establishes the identity `((normalExtensionAction A K L hLK hnormal k a : ambientFixedAddSubgroup +A L) : A.V) = A.ρ k.1 a.1`. +-/ +@[simp] +theorem normalExtensionAction_coe + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (k : K.toSubgroup) (a : ambientFixedAddSubgroup A L) : + ((normalExtensionAction A K L hLK hnormal k a : ambientFixedAddSubgroup A L) : A.V) = + A.ρ k.1 a.1 := + rfl + +/-- For a finite Galois abstract extension, the relative norm is invariant under +the `G_K`-conjugacy action on `A_L`. -/ +theorem relativeNorm_normalExtensionAction + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (k : K.toSubgroup) (a : ambientFixedAddSubgroup A L) : + relativeNorm A K L hLK (normalExtensionAction A K L hLK hnormal k a) = + relativeNorm A K L hLK a := by + apply Subtype.ext + let := Fintype.ofFinite (K.toSubgroup ⧸ extensionSubgroup K L hLK) + let e : (K.toSubgroup ⧸ extensionSubgroup K L hLK) ≃ + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + Equiv.mulRight (QuotientGroup.mk k) + have hterm : ∀ q : K.toSubgroup ⧸ extensionSubgroup K L hLK, + relativeCosetAction A K L hLK (normalExtensionAction A K L hLK hnormal k a) q = + relativeCosetAction A K L hLK a (e q) := by + intro q + refine Quotient.inductionOn' q ?_ + intro x + simp only [relativeCosetAction_mk, normalExtensionAction_coe] + have he : e (QuotientGroup.mk x) = QuotientGroup.mk (x * k) := rfl + rw [he, relativeCosetAction_mk] + change A.ρ x.1 (A.ρ k.1 a.1) = A.ρ (x.1 * k.1) a.1 + rw [map_mul] + rfl + simp only [relativeNorm_apply_coe, relativeNormValue] + simp_rw [hterm] + exact e.sum_comp (relativeCosetAction A K L hLK a) + +/-- Finiteness is closed under composition in a tower of closed subgroups. -/ +theorem relativeTowerQuotientFinite + {G : Type*} [Group G] [TopologicalSpace G] + (K L M : ClosedSubgroup G) + (hML : M.toSubgroup ≤ L.toSubgroup) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [Finite (L.toSubgroup ⧸ extensionSubgroup L M hML)] : + Finite + (K.toSubgroup ⧸ extensionSubgroup K M (hML.trans hLK)) := + Finite.of_equiv + ((K.toSubgroup ⧸ extensionSubgroup K L hLK) × + (L.toSubgroup ⧸ extensionSubgroup L M hML)) + (Subgroup.quotientTowerEquiv hML hLK).symm + +namespace DegreeData.FiniteTower + +variable (T : DegreeData.FiniteTower G) + +/-- The finite composite extension represented by a finite tower. -/ +noncomputable def totalExtension : DegreeData.FiniteAbstractExtension G where + toAbstractExtension := T.toTower.totalExtension + finiteQuotient := relativeTowerQuotientFinite + T.base T.middle T.top T.top_le_middle T.middle_le_base + +/-- The quotient from the top to the base of a finite tower is finite. -/ +instance totalQuotientFinite : + Finite (T.base.toSubgroup ⧸ + extensionSubgroup T.base T.top + (T.top_le_middle.trans T.middle_le_base)) := + T.totalExtension.finiteQuotient + +end DegreeData.FiniteTower + +private theorem relativeCosetAction_towerProductEquiv + (A : Rep ℤ G) (K L M : ClosedSubgroup G) + (hML : M.toSubgroup ≤ L.toSubgroup) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (a : ambientFixedAddSubgroup A M) + (q : K.toSubgroup ⧸ extensionSubgroup K L hLK) + (r : L.toSubgroup ⧸ extensionSubgroup L M hML) : + relativeCosetAction A K M (hML.trans hLK) a + ((Subgroup.quotientTowerEquiv hML hLK).symm (q, r)) = + A.ρ (Quotient.out q).1 (relativeCosetAction A L M hML a r) := by + refine Quotient.inductionOn' r ?_ + intro x + have he : (Subgroup.quotientTowerEquiv hML hLK).symm + (q, QuotientGroup.mk x) = + QuotientGroup.mk (Quotient.out q * Subgroup.inclusion hLK x) := rfl + rw [he, relativeCosetAction_mk, relativeCosetAction_mk] + change A.ρ ((Quotient.out q).1 * x.1) a.1 = + A.ρ (Quotient.out q).1 (A.ρ x.1 a.1) + rw [map_mul] + rfl + +private theorem finiteTowerNormTransApplyAux + (A : Rep ℤ G) (K L M : ClosedSubgroup G) + (hML : M.toSubgroup ≤ L.toSubgroup) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [Finite (L.toSubgroup ⧸ extensionSubgroup L M hML)] + (a : ambientFixedAddSubgroup A M) : + letI : Finite (K.toSubgroup ⧸ extensionSubgroup K M (hML.trans hLK)) := + relativeTowerQuotientFinite K L M hML hLK + relativeNorm A K L hLK (relativeNorm A L M hML a) = + relativeNorm A K M (hML.trans hLK) a := by + apply Subtype.ext + let := Fintype.ofFinite (K.toSubgroup ⧸ extensionSubgroup K L hLK) + let := Fintype.ofFinite (L.toSubgroup ⧸ extensionSubgroup L M hML) + let totalFintype : Fintype + (K.toSubgroup ⧸ extensionSubgroup K M (hML.trans hLK)) := + Fintype.ofEquiv + ((K.toSubgroup ⧸ extensionSubgroup K L hLK) × + (L.toSubgroup ⧸ extensionSubgroup L M hML)) + (Subgroup.quotientTowerEquiv hML hLK).symm + have htotalFintype : Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K M (hML.trans hLK)) = totalFintype := + Subsingleton.elim _ _ + have houter : ∀ q : K.toSubgroup ⧸ extensionSubgroup K L hLK, + relativeCosetAction A K L hLK (relativeNorm A L M hML a) q = + A.ρ (Quotient.out q).1 (relativeNormValue A L M hML a) := by + intro q + calc + relativeCosetAction A K L hLK (relativeNorm A L M hML a) q = + relativeCosetAction A K L hLK (relativeNorm A L M hML a) + (QuotientGroup.mk (Quotient.out q)) := by + exact congrArg + (relativeCosetAction A K L hLK (relativeNorm A L M hML a)) + (Quotient.out_eq' q).symm + _ = A.ρ (Quotient.out q).1 + ((relativeNorm A L M hML a : ambientFixedAddSubgroup A L) : A.V) := + relativeCosetAction_mk A K L hLK (relativeNorm A L M hML a) + (Quotient.out q) + _ = A.ρ (Quotient.out q).1 (relativeNormValue A L M hML a) := by + rw [relativeNorm_apply_coe] + simp only [relativeNorm_apply_coe, relativeNormValue] + rw [htotalFintype] + rw [Finset.sum_congr rfl (fun q _ ↦ houter q)] + simp only [relativeNormValue] + simp_rw [map_sum] + rw [← Fintype.sum_prod_type (f := fun p : + (K.toSubgroup ⧸ extensionSubgroup K L hLK) × + (L.toSubgroup ⧸ extensionSubgroup L M hML) ↦ + A.ρ (Quotient.out p.1).1 + (relativeCosetAction A L M hML a p.2))] + calc + ∑ p : (K.toSubgroup ⧸ extensionSubgroup K L hLK) × + (L.toSubgroup ⧸ extensionSubgroup L M hML), + A.ρ (Quotient.out p.1).1 (relativeCosetAction A L M hML a p.2) = + ∑ p, relativeCosetAction A K M (hML.trans hLK) a + ((Subgroup.quotientTowerEquiv hML hLK).symm p) := by + apply Fintype.sum_congr + intro p + exact (relativeCosetAction_towerProductEquiv A K L M hML hLK a p.1 p.2).symm + _ = ∑ q, relativeCosetAction A K M (hML.trans hLK) a q := + (Subgroup.quotientTowerEquiv hML hLK).symm.sum_comp + (relativeCosetAction A K M (hML.trans hLK) a) + +namespace DegreeData.FiniteTower + +variable (T : DegreeData.FiniteTower G) + +/-- Relative norms are transitive along a finite tower. All containments and +finite quotient witnesses are obtained from `T`. -/ +theorem norm_trans_apply (A : Rep ℤ G) + (a : ambientFixedAddSubgroup A T.top) : + relativeNorm A T.base T.middle T.middle_le_base + (relativeNorm A T.middle T.top T.top_le_middle a) = + relativeNorm A T.base T.top + (T.top_le_middle.trans T.middle_le_base) a := by + exact finiteTowerNormTransApplyAux A T.base T.middle T.top + T.top_le_middle T.middle_le_base a + +/-- Homomorphism form of norm transitivity along a finite tower. -/ +theorem norm_trans (A : Rep ℤ G) : + (relativeNorm A T.base T.middle T.middle_le_base).comp + (relativeNorm A T.middle T.top T.top_le_middle) = + relativeNorm A T.base T.top + (T.top_le_middle.trans T.middle_le_base) := by + apply AddMonoidHom.ext + intro a + exact T.norm_trans_apply A a + +end DegreeData.FiniteTower + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PadicCyclicClosure.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PadicCyclicClosure.lean new file mode 100644 index 0000000000..fb1a6f8ae9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PadicCyclicClosure.lean @@ -0,0 +1,411 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.TopologicalGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Indices +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.ClosedAddSubgroup +public import Mathlib.GroupTheory.Index +public import Mathlib.NumberTheory.Padics.ProperSpace +/-! +# Cyclic closures detected by a p-adic degree + +This file isolates the topological group argument used in the +finite-place Frobenius construction. A continuous `ℤ_p`-degree with +finite kernel detects openness of the closed subgroup generated by +any element of nonzero degree. +-/ + +@[expose] public section + +open scoped Topology + +namespace ClassFormation + +noncomputable +section + +universe u + +variable + {G : Type u} [Group G] [TopologicalSpace G] + [IsTopologicalGroup G] [CompactSpace G] + +/-- The closed subgroup topologically generated by one element. -/ +def padicCyclicClosure (τ : G) : ClosedSubgroup G := + closedSubgroupGenerated (Set.range (fun _ : Unit => τ)) + +/-- The distinguished element belongs to its p-adic cyclic closure. -/ +def padicCyclicClosureGenerator (τ : G) : + padicCyclicClosure τ := + closedSubgroupGeneratedMap (fun _ : Unit => τ) () + +/-- A continuous p-adic degree with finite kernel makes the cyclic +closure of every element of nonzero degree open. + +The degree image of the cyclic closure is compact, hence closed in +`ℤ_p`; it contains a nonzero element, hence is open. Its relative +index in the full degree image is therefore finite. The remaining +relative-index factor lies in the finite degree kernel. -/ +theorem padicCyclicClosure_isOpen_of_degree_ne_one + (p : ℕ) [Fact p.Prime] + (degree : G →ₜ* Multiplicative ℤ_[p]) + [Finite degree.toMonoidHom.ker] + (τ : G) + (hτ : degree τ ≠ 1) : + IsOpen ((padicCyclicClosure τ : Subgroup G) : Set G) := by + let Γ : ClosedSubgroup G := + padicCyclicClosure τ + let inclusion : Γ →ₜ* G := + { toMonoidHom := Γ.toSubgroup.subtype + continuous_toFun := continuous_subtype_val } + let restrictedDegree : Γ →ₜ* Multiplicative ℤ_[p] := + degree.comp inclusion + let R : Subgroup (Multiplicative ℤ_[p]) := + restrictedDegree.toMonoidHom.range + let H : AddSubgroup ℤ_[p] := + R.toAddSubgroup' + have hRclosed : + IsClosed (R : Set (Multiplicative ℤ_[p])) := by + change + IsClosed (Set.range restrictedDegree) + exact + (isCompact_range + restrictedDegree.continuous_toFun).isClosed + have hHclosed : + IsClosed (H : Set ℤ_[p]) := by + change + IsClosed + ((fun z : ℤ_[p] => Multiplicative.ofAdd z) ⁻¹' + (R : Set (Multiplicative ℤ_[p]))) + exact hRclosed.preimage continuous_ofAdd + have hHne : H ≠ ⊥ := by + intro hbot + let γ : Γ := + padicCyclicClosureGenerator τ + have hdegreeMem : + degree τ ∈ R := by + exact ⟨γ, rfl⟩ + have hdegreeAddMem : + Multiplicative.toAdd (degree τ) ∈ H := by + rw [Subgroup.mem_toAddSubgroup'] + exact hdegreeMem + rw [hbot] at hdegreeAddMem + have hdegreeAddZero : + Multiplicative.toAdd (degree τ) = 0 := by + simpa only [AddSubgroup.mem_bot] using hdegreeAddMem + apply hτ + apply Multiplicative.ext + change Multiplicative.toAdd (degree τ) = 0 + exact hdegreeAddZero + have hHopen : + IsOpen (H : Set ℤ_[p]) := + PadicInt.addSubgroup_isOpen_of_isClosed_of_ne_bot + p H hHclosed hHne + have hRopen : + IsOpen (R : Set (Multiplicative ℤ_[p])) := by + change + IsOpen + ((fun z : Multiplicative ℤ_[p] => + Multiplicative.toAdd z) ⁻¹' (H : Set ℤ_[p])) + exact hHopen.preimage continuous_toAdd + have hRle : + R ≤ degree.toMonoidHom.range := by + rintro y ⟨γ, rfl⟩ + exact ⟨γ.1, rfl⟩ + have hDegreeRangeOpen : + IsOpen + (degree.toMonoidHom.range : + Set (Multiplicative ℤ_[p])) := + Subgroup.isOpen_mono hRle hRopen + have hRsubgroupOpen : + IsOpen + (R.subgroupOf degree.toMonoidHom.range : + Set degree.toMonoidHom.range) := + Subgroup.subgroupOf_isOpen + degree.toMonoidHom.range R hRopen + let : + Finite + (degree.toMonoidHom.range ⧸ + R.subgroupOf degree.toMonoidHom.range) := + Subgroup.quotient_finite_of_isOpen' + degree.toMonoidHom.range + (R.subgroupOf degree.toMonoidHom.range) + hDegreeRangeOpen hRsubgroupOpen + have hΓmap : + Γ.toSubgroup.map degree.toMonoidHom = R := by + ext z + constructor + · rintro ⟨γ, hγ, rfl⟩ + exact ⟨⟨γ, hγ⟩, rfl⟩ + · rintro ⟨γ, rfl⟩ + exact ⟨γ.1, γ.2, rfl⟩ + have htopmap : + (⊤ : Subgroup G).map degree.toMonoidHom = + degree.toMonoidHom.range := by + ext z + constructor + · rintro ⟨g, _, rfl⟩ + exact ⟨g, rfl⟩ + · rintro ⟨g, rfl⟩ + exact ⟨g, Subgroup.mem_top g, rfl⟩ + have himage : + (Γ.toSubgroup.map degree.toMonoidHom).relIndex + ((⊤ : Subgroup G).map degree.toMonoidHom) ≠ 0 := by + rw [hΓmap, htopmap, Subgroup.relIndex] + exact Subgroup.index_ne_zero_of_finite + let T : Subgroup G := + (⊤ : Subgroup G) ⊓ degree.toMonoidHom.ker + let toKernel : T → degree.toMonoidHom.ker := + fun x => ⟨x.1, x.2.2⟩ + let : Finite T := + Finite.of_injective toKernel (by + intro x y hxy + apply Subtype.ext + simpa [toKernel] using + congrArg (fun z : degree.toMonoidHom.ker => (z : G)) hxy) + have hkernel : + (Γ.toSubgroup ⊓ degree.toMonoidHom.ker).relIndex + ((⊤ : Subgroup G) ⊓ degree.toMonoidHom.ker) ≠ 0 := by + rw [Subgroup.relIndex] + change + ((Γ.toSubgroup ⊓ degree.toMonoidHom.ker).subgroupOf T).index ≠ 0 + exact Subgroup.index_ne_zero_of_finite + have hrel : + Γ.toSubgroup.relIndex (⊤ : Subgroup G) ≠ 0 := by + rw [ + relIndex_eq_map_relIndex_mul_inf_ker_relIndex + degree.toMonoidHom le_top] + exact Nat.mul_ne_zero himage hkernel + have hindex : Γ.toSubgroup.index ≠ 0 := by + simpa only [Subgroup.relIndex_top_right] using hrel + let : Γ.toSubgroup.FiniteIndex := + ⟨hindex⟩ + exact + Γ.toSubgroup.isOpen_of_isClosed_of_finiteIndex + Γ.isClosed' + +omit [CompactSpace G] in +/-- On the cyclic closure of an element whose finite coordinate has +`p`-power order and whose `p`-adic degree is a positive integer, the +`p`-adic degree is injective. + +The proof uses one carefully chosen open neighborhood. If a limit of +integral powers has trivial `p`-adic degree, approximate it by a power +whose degree lies in `(n * p^m)ℤ_p`. Cancellation of the nonzero +integer `n` forces the exponent to be divisible by `p^m`, so its finite +coordinate is trivial as well. -/ +theorem padicCyclicClosure_degree_injective_of_primePower_finiteCoordinate + {Q : Type*} [Group Q] [TopologicalSpace Q] [DiscreteTopology Q] + (p : ℕ) [Fact p.Prime] + (finiteCoordinate : G →ₜ* Q) + (degree : G →ₜ* Multiplicative ℤ_[p]) + (hjoint : + Function.Injective + (fun g : G => (finiteCoordinate g, degree g))) + (γ : G) + (m n : ℕ) + (hn : 0 < n) + (hfinite : (finiteCoordinate γ) ^ (p ^ m) = 1) + (hdegree : + degree γ = + (Multiplicative.ofAdd (1 : ℤ_[p])) ^ n) : + Function.Injective + ((degree.toMonoidHom.comp + (padicCyclicClosure γ).toSubgroup.subtype) : + padicCyclicClosure γ → + Multiplicative ℤ_[p]) := by + let Γ : ClosedSubgroup G := + padicCyclicClosure γ + let inclusion : Γ.toSubgroup →ₜ* G := + { toMonoidHom := Γ.toSubgroup.subtype + continuous_toFun := continuous_subtype_val } + let restrictedDegree : + Γ.toSubgroup →ₜ* Multiplicative ℤ_[p] := + degree.comp inclusion + have hkernel : + ∀ z : Γ.toSubgroup, + restrictedDegree z = 1 → + z = 1 := by + intro z hzdegree + let c : ℕ := + n * p ^ m + let J : AddSubgroup ℤ_[p] := + (Ideal.span ({(c : ℤ_[p])} : Set ℤ_[p])).toAddSubgroup + have hcne : c ≠ 0 := by + exact + Nat.mul_ne_zero (Nat.ne_of_gt hn) + (pow_ne_zero m (Fact.out : p.Prime).ne_zero) + have hJrange : + (J : Set ℤ_[p]) = + Set.range (fun a : ℤ_[p] => a * (c : ℤ_[p])) := by + ext x + constructor + · intro hx + change + x ∈ Ideal.span + ({(c : ℤ_[p])} : Set ℤ_[p]) at hx + rw [Ideal.mem_span_singleton] at hx + obtain ⟨a, rfl⟩ := hx + exact ⟨a, mul_comm _ _⟩ + · rintro ⟨a, rfl⟩ + change + a * (c : ℤ_[p]) ∈ + Ideal.span ({(c : ℤ_[p])} : Set ℤ_[p]) + rw [Ideal.mem_span_singleton] + exact ⟨a, mul_comm _ _⟩ + have hJclosed : IsClosed (J : Set ℤ_[p]) := by + rw [hJrange] + exact + (isCompact_range + (continuous_id.mul continuous_const)).isClosed + have hJne : J ≠ ⊥ := by + intro hbot + have hcMem : (c : ℤ_[p]) ∈ J := by + change + (c : ℤ_[p]) ∈ + Ideal.span ({(c : ℤ_[p])} : Set ℤ_[p]) + exact Ideal.subset_span (by simp) + rw [hbot] at hcMem + have hc0 : (c : ℤ_[p]) = 0 := by + simpa only [AddSubgroup.mem_bot] using hcMem + have hc0' : c = 0 := by + exact_mod_cast hc0 + exact hcne hc0' + have hJopen : IsOpen (J : Set ℤ_[p]) := + PadicInt.addSubgroup_isOpen_of_isClosed_of_ne_bot + p J hJclosed hJne + let O : Set G := + finiteCoordinate ⁻¹' {finiteCoordinate z.1} ∩ + (fun g : G => + Multiplicative.toAdd (degree g)) ⁻¹' + (J : Set ℤ_[p]) + have hOopen : IsOpen O := by + exact + ((isOpen_discrete + ({finiteCoordinate z.1} : Set Q)).preimage + finiteCoordinate.continuous_toFun).inter + (hJopen.preimage + (continuous_toAdd.comp + degree.continuous_toFun)) + have hzO : z.1 ∈ O := by + refine ⟨rfl, ?_⟩ + change + Multiplicative.toAdd (restrictedDegree z) ∈ J + rw [hzdegree] + exact J.zero_mem + have hzclosure : + z.1 ∈ + closure + (((Subgroup.closure + (Set.range (fun _ : Unit => γ))) : + Subgroup G) : + Set G) := by + exact z.2 + obtain ⟨y, hyO, hyGenerated⟩ := + mem_closure_iff.mp hzclosure O hOopen hzO + have hrange : + Set.range (fun _ : Unit => γ) = + ({γ} : Set G) := by + ext x + constructor + · rintro ⟨u, rfl⟩ + simp + · intro hx + rw [Set.mem_singleton_iff] at hx + exact ⟨(), hx.symm⟩ + have hyZPowers : + y ∈ Subgroup.zpowers γ := by + rw [Subgroup.zpowers_eq_closure, ← hrange] + exact hyGenerated + obtain ⟨k, hk⟩ := + Subgroup.mem_zpowers_iff.mp hyZPowers + have hyJ : + Multiplicative.toAdd (degree y) ∈ J := + hyO.2 + have hyJ' : + (k : ℤ_[p]) * (n : ℤ_[p]) ∈ J := by + rw [← hk, map_zpow, hdegree] at hyJ + simpa using hyJ + change + (k : ℤ_[p]) * (n : ℤ_[p]) ∈ + Ideal.span ({(c : ℤ_[p])} : Set ℤ_[p]) at hyJ' + rw [Ideal.mem_span_singleton] at hyJ' + obtain ⟨a, ha⟩ := hyJ' + have hnZ : (n : ℤ_[p]) ≠ 0 := by + exact_mod_cast Nat.ne_of_gt hn + have hcancel : + a * (p : ℤ_[p]) ^ m = + (k : ℤ_[p]) := by + apply mul_left_cancel₀ hnZ + calc + (n : ℤ_[p]) * + (a * (p : ℤ_[p]) ^ m) = + a * (c : ℤ_[p]) := by + simp only [c, Nat.cast_mul, Nat.cast_pow] + ring + _ = (k : ℤ_[p]) * (n : ℤ_[p]) := by + simpa [mul_comm] using ha.symm + _ = (n : ℤ_[p]) * (k : ℤ_[p]) := mul_comm _ _ + have hkSpan : + (k : ℤ_[p]) ∈ + Ideal.span + ({(p : ℤ_[p]) ^ m} : Set ℤ_[p]) := by + rw [Ideal.mem_span_singleton] + exact ⟨a, by simpa [mul_comm] using hcancel.symm⟩ + have hkMod : + PadicInt.toZModPow m (k : ℤ_[p]) = 0 := by + rw [← PadicInt.ker_toZModPow m, + RingHom.mem_ker] at hkSpan + exact hkSpan + have hkMod' : + (k : ZMod (p ^ m)) = 0 := by + simpa only [map_intCast] using hkMod + have hkdiv : + ((p ^ m : ℕ) : ℤ) ∣ k := + (CharP.intCast_eq_zero_iff + (ZMod (p ^ m)) (p ^ m) k).1 hkMod' + obtain ⟨l, hl⟩ := hkdiv + have hfinitePower : + finiteCoordinate y = 1 := by + rw [← hk, map_zpow, hl] + calc + finiteCoordinate γ ^ + (((p ^ m : ℕ) : ℤ) * l) = + (finiteCoordinate γ ^ + ((p ^ m : ℕ) : ℤ)) ^ l := by + rw [zpow_mul] + _ = 1 := by + rw [zpow_natCast, hfinite, one_zpow] + have hzfinite : + finiteCoordinate z.1 = 1 := by + exact hyO.1.symm.trans hfinitePower + have hzG : z.1 = (1 : G) := by + apply hjoint + apply Prod.ext + · simpa only [map_one] using hzfinite + · have hzdegree' : degree z.1 = 1 := by + dsimp [restrictedDegree, inclusion] at hzdegree + exact hzdegree + simpa only [map_one] using hzdegree' + exact Subtype.ext hzG + intro x y hxy + have hxy' : restrictedDegree x = restrictedDegree y := by + change degree (x : G) = degree (y : G) + change degree (x : G) = degree (y : G) at hxy + exact hxy + have hquotient : + restrictedDegree (x * y⁻¹) = 1 := by + rw [map_mul, map_inv, hxy', mul_inv_cancel] + have hunit : + x * y⁻¹ = 1 := + hkernel (x * y⁻¹) hquotient + exact mul_inv_eq_one.mp hunit + +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PrimeElements.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PrimeElements.lean new file mode 100644 index 0000000000..01809eee8c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PrimeElements.lean @@ -0,0 +1,223 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ValuationLaws + +/-! # Prime Elements -/ + +@[expose] public section +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +/-! +# normalized degree and Frobenius theory: prime elements and units + +This file formalizes the prime-element definition and its two immediate consequences for +unramified and totally ramified extensions. +-/ + +noncomputable +section + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] +variable {D : DegreeData G} {A : Rep ℤ G} + +/-- Inclusion `A_K → A_L` for an extension `L | K`. -/ +def fixedFieldInclusion (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) : + ambientFixedAddSubgroup A K →+ ambientFixedAddSubgroup A L where + toFun a := ⟨a.1, fun l => a.2 ⟨l.1, hLK l.2⟩⟩ + map_zero' := rfl + map_add' _ _ := rfl + +/-- +Establishes the identity `((fixedFieldInclusion A K L hLK a : ambientFixedAddSubgroup A L) : A.V) += a.1`. +-/ +@[simp] +theorem fixedFieldInclusion_coe (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (a : ambientFixedAddSubgroup A K) : + ((fixedFieldInclusion A K L hLK a : ambientFixedAddSubgroup A L) : A.V) = a.1 := + rfl + +/-- The norm of an element already fixed over `K` is its `[L:K]`-fold sum. -/ +theorem relativeNorm_fixedFieldInclusion + (A : Rep ℤ G) (E : DegreeData.FiniteAbstractExtension G) + (a : ambientFixedAddSubgroup A E.base) : + relativeNorm A E.base E.field E.below + (fixedFieldInclusion A E.base E.field E.below a) = + (E.degree : ℕ) • a := by + apply Subtype.ext + let := Fintype.ofFinite + (E.base.toSubgroup ⧸ extensionSubgroup E.base E.field E.below) + have hterm : ∀ q : E.base.toSubgroup ⧸ + extensionSubgroup E.base E.field E.below, + relativeCosetAction A E.base E.field E.below + (fixedFieldInclusion A E.base E.field E.below a) q = a.1 := by + intro q + refine Quotient.inductionOn' q ?_ + intro k + rw [relativeCosetAction_mk, fixedFieldInclusion_coe] + exact a.2 k + simp only [relativeNorm_apply_coe, relativeNormValue] + simp_rw [hterm] + rw [Finset.sum_const, Finset.card_univ] + change Fintype.card + (E.base.toSubgroup ⧸ extensionSubgroup E.base E.field E.below) • a.1 = + (E.degree : ℕ) • a.1 + rw [← E.extensionSubgroup_index_eq_degree, + Subgroup.index, Nat.card_eq_fintype_card] + +/-- The norm of the trivial extension is the identity. -/ +@[simp] +theorem relativeNorm_self + (A : Rep ℤ G) (K : ClosedSubgroup G) + [Finite (K.toSubgroup ⧸ extensionSubgroup K K le_rfl)] + (a : ambientFixedAddSubgroup A K) : + relativeNorm A K K le_rfl a = a := by + apply Subtype.ext + let := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K K le_rfl) + have hterm : ∀ q : K.toSubgroup ⧸ extensionSubgroup K K le_rfl, + relativeCosetAction A K K le_rfl a q = a.1 := by + intro q + refine Quotient.inductionOn' q ?_ + intro k + rw [relativeCosetAction_mk] + exact a.2 k + simp only [relativeNorm_apply_coe, relativeNormValue] + simp_rw [hterm] + rw [Finset.sum_const, Finset.card_univ] + have htop : extensionSubgroup K K le_rfl = ⊤ := by + change K.toSubgroup.subgroupOf K.toSubgroup = ⊤ + exact Subgroup.subgroupOf_self _ + have hcard : + Fintype.card (K.toSubgroup ⧸ extensionSubgroup K K le_rfl) = 1 := by + rw [← Nat.card_eq_fintype_card, + ← Subgroup.index_eq_card (extensionSubgroup K K le_rfl), + htop, Subgroup.index_top] + rw [hcard, one_nsmul] + +namespace ValuationData + +/-- The value `1` belongs to `Z`, by the valuation-quotient axiom. -/ +def oneValue (v : ValuationData D A) : v.valueGroup := + ⟨1, by + obtain ⟨a, ha⟩ := v.integers_mem 1 + exact ⟨a, by simpa using ha⟩⟩ + +/-- Establishes the identity `(v.oneValue : ZHat) = 1`. -/ +@[simp] +theorem oneValue_coe (v : ValuationData D A) : + (v.oneValue : ZHat) = 1 := + rfl + +/-- **the prime-element definition.** A prime element has normalized value `1`. -/ +def IsPrimeElement (v : ValuationData D A) (K : FiniteAbstractField G) + (π : ambientFixedAddSubgroup A K.field) : Prop := + v.valuationAt K π = v.oneValue + +/-- **the prime-element definition.** The additive form of the unit group +`U_K = {u | v_K(u)=0}`. -/ +def unitAddSubgroup (v : ValuationData D A) (K : FiniteAbstractField G) : + AddSubgroup (ambientFixedAddSubgroup A K.field) := + (v.valuationAt K).ker + +/-- Characterizes `u ∈ v.unitAddSubgroup K` by the equivalent condition `v.valuationAt K u = 0`. -/ +@[simp] +theorem mem_unitAddSubgroup_iff (v : ValuationData D A) + (K : FiniteAbstractField G) + (u : ambientFixedAddSubgroup A K.field) : + u ∈ v.unitAddSubgroup K ↔ v.valuationAt K u = 0 := + Iff.rfl + +/-- Over an unramified extension, the normalized valuation restricts to the +valuation below. -/ +theorem valuationAt_fixedFieldInclusion_of_unramified + (v : ValuationData D A) + (E : FiniteAbstractFieldExtension G) + (hUn : E.IsUnramified D) + (a : ambientFixedAddSubgroup A E.base.field) : + v.valuationAt E.field + (fixedFieldInclusion A E.base.field E.field.field E.below a) = + v.valuationAt E.base a := by + let EF := E.toFiniteAbstractExtension + have hfeq : (E.residueDegree D : ℕ) = (E.degree : ℕ) := + E.residueDegree_eq_degree_of_isUnramified D hUn + apply Subtype.ext + apply zHatMulNat_injective (E.residueDegree D).property + calc + (E.residueDegree D : ℕ) • + ((v.valuationAt E.field + (fixedFieldInclusion A E.base.field E.field.field E.below a) : + v.valueGroup) : ZHat) = + ((v.valuationAt E.base + (relativeNorm A E.base.field E.field.field E.below + (fixedFieldInclusion A E.base.field E.field.field E.below a)) : + v.valueGroup) : ZHat) := + v.normalizedValuation_tower E + (fixedFieldInclusion A E.base.field E.field.field E.below a) + _ = ((v.valuationAt E.base ((E.degree : ℕ) • a) : + v.valueGroup) : ZHat) := by + rw [show relativeNorm A E.base.field E.field.field E.below + (fixedFieldInclusion A E.base.field E.field.field E.below a) = + (E.degree : ℕ) • a by + simpa [EF, FiniteAbstractFieldExtension.toFiniteAbstractExtension, + FiniteAbstractFieldExtension.degree] using + relativeNorm_fixedFieldInclusion A EF a] + _ = (E.degree : ℕ) • + ((v.valuationAt E.base a : v.valueGroup) : ZHat) := by + exact congrArg Subtype.val + (map_nsmul (v.valuationAt E.base) (E.degree : ℕ) a) + _ = (E.residueDegree D : ℕ) • + ((v.valuationAt E.base a : v.valueGroup) : ZHat) := by + rw [hfeq] + +/-- A prime element remains prime in an unramified extension. -/ +theorem prime_of_unramified (v : ValuationData D A) + (E : FiniteAbstractFieldExtension G) + (hUn : E.IsUnramified D) + (π : ambientFixedAddSubgroup A E.base.field) + (hπ : v.IsPrimeElement E.base π) : + v.IsPrimeElement E.field + (fixedFieldInclusion A E.base.field E.field.field E.below π) := by + rw [IsPrimeElement, + v.valuationAt_fixedFieldInclusion_of_unramified E hUn π] + exact hπ + +/-- The norm of a prime element is prime in a totally ramified extension. -/ +theorem norm_prime_of_totallyRamified (v : ValuationData D A) + (E : FiniteAbstractFieldExtension G) + (hTot : E.IsTotallyRamified D) + (π : ambientFixedAddSubgroup A E.field.field) : + v.IsPrimeElement E.field π → + v.IsPrimeElement E.base + (relativeNorm A E.base.field E.field.field E.below π) := by + intro hπ + have htower := v.normalizedValuation_tower E π + have hresidue : (E.residueDegree D : ℕ) = 1 := + E.toFiniteAbstractExtension.residueDegree_eq_one_of_isTotallyRamified D hTot + change (E.residueDegree D : ℕ) • + ((v.valuationAt E.field π : v.valueGroup) : ZHat) = + ((v.valuationAt E.base + (relativeNorm A E.base.field E.field.field E.below π) : + v.valueGroup) : ZHat) at htower + rw [hresidue, one_nsmul] at htower + rw [IsPrimeElement] at hπ ⊢ + apply Subtype.ext + exact htower.symm.trans (congrArg Subtype.val hπ) + +end ValuationData + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ProfiniteIntegerFiniteQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ProfiniteIntegerFiniteQuotient.lean new file mode 100644 index 0000000000..1ca88811bd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ProfiniteIntegerFiniteQuotient.lean @@ -0,0 +1,374 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Data.ZMod.QuotientGroup +public import Mathlib.GroupTheory.Archimedean +public import Mathlib.GroupTheory.FiniteIndexNormalSubgroup +public import Mathlib.Topology.Algebra.Group.Quotient +public import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Completion +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerCore + +/-! # Profinite Integer Finite Quotient -/ + +@[expose] public section +namespace ClassFormation + +open CategoryTheory CategoryTheory.Limits + +/-! +# Finite quotient reductions of profinite integers + +This module extends the concrete `ZHat` reduction maps to every finite-index +additive quotient of `ℤ`. The construction first identifies such a subgroup +with the multiples of its index, then uses the existing reduction to `ZMod` +and Mathlib's `ZMod.lift`. +-/ + +noncomputable +section + +private theorem finiteIndexNormalAddSubgroup_eq_zmultiples_index + (H : FiniteIndexNormalAddSubgroup ℤ) : + H.toAddSubgroup = + AddSubgroup.zmultiples (H.toAddSubgroup.index : ℤ) := by + obtain ⟨d, hd⟩ := Int.subgroup_cyclic H.toAddSubgroup + have hH : H.toAddSubgroup = AddSubgroup.zmultiples d := + hd.trans (AddSubgroup.zmultiples_eq_closure d).symm + have hindex : H.toAddSubgroup.index = d.natAbs := by + rw [hH, Int.index_zmultiples] + calc + H.toAddSubgroup = AddSubgroup.zmultiples d := hH + _ = AddSubgroup.zmultiples (d.natAbs : ℤ) := + (Int.zmultiples_natAbs d).symm + _ = AddSubgroup.zmultiples (H.toAddSubgroup.index : ℤ) := by + rw [hindex] + +private theorem finiteIndexNormalAddSubgroup_index_pos + (H : FiniteIndexNormalAddSubgroup ℤ) : + 0 < H.toAddSubgroup.index := + Nat.pos_of_ne_zero H.isFiniteIndex'.index_ne_zero + +private theorem finiteIndexNormalAddSubgroup_index_mem + (H : FiniteIndexNormalAddSubgroup ℤ) : + (H.toAddSubgroup.index : ℤ) ∈ H.toAddSubgroup := by + let n := H.toAddSubgroup.index + change (n : ℤ) ∈ H.toAddSubgroup + have hH : H.toAddSubgroup = AddSubgroup.zmultiples (n : ℤ) := by + simpa only [n] using finiteIndexNormalAddSubgroup_eq_zmultiples_index H + rw [hH, Int.mem_zmultiples_iff] + +/-- Reduction modulo the subgroup index followed by the corresponding integer quotient map. -/ +noncomputable def zHatFiniteIndexQuotientReduction + (H : FiniteIndexNormalAddSubgroup ℤ) : + ZMod H.toAddSubgroup.index →+ ℤ ⧸ H.toAddSubgroup := + ZMod.lift H.toAddSubgroup.index + ⟨QuotientAddGroup.mk' H.toAddSubgroup, by + change ((H.toAddSubgroup.index : ℤ) : ℤ ⧸ H.toAddSubgroup) = 0 + exact (QuotientAddGroup.eq_zero_iff _).mpr + (finiteIndexNormalAddSubgroup_index_mem H)⟩ + +/-- The canonical reduction of `ZHat` to the finite quotient of `ℤ` by `H`. -/ +noncomputable def zHatReductionToFiniteIndexQuotient + (H : FiniteIndexNormalAddSubgroup ℤ) : + ZHat →ₜ+ ℤ ⧸ H.toAddSubgroup := by + let quotientReduction : + ZMod H.toAddSubgroup.index →ₜ+ ℤ ⧸ H.toAddSubgroup := + { toAddMonoidHom := zHatFiniteIndexQuotientReduction H + continuous_toFun := continuous_of_discreteTopology } + exact quotientReduction.comp + (zHatReduction H.toAddSubgroup.index + (by exact finiteIndexNormalAddSubgroup_index_pos H)) + +/-- The finite quotient reduction extends the ordinary quotient map on integers. -/ +@[simp] +theorem zHatReductionToFiniteIndexQuotient_intCast + (H : FiniteIndexNormalAddSubgroup ℤ) (a : ℤ) : + zHatReductionToFiniteIndexQuotient H (a : ZHat) = + QuotientAddGroup.mk' H.toAddSubgroup a := by + change zHatFiniteIndexQuotientReduction H + (zHatReduction H.toAddSubgroup.index + (by exact finiteIndexNormalAddSubgroup_index_pos H) (a : ZHat)) = + QuotientAddGroup.mk' H.toAddSubgroup a + rw [zHatReduction_intCast] + unfold zHatFiniteIndexQuotientReduction + exact ZMod.lift_coe H.toAddSubgroup.index _ a + +/-- The reduction to a finite-index quotient, regarded as a leg of the +finite-quotient diagram defining Mathlib's profinite completion of `ℤ`. -/ +noncomputable def zHatFiniteIndexQuotientDiagramLeg + (H : FiniteIndexNormalAddSubgroup ℤ) : + zHatProfiniteAddGrp ⟶ + (ProfiniteAddGrp.ProfiniteCompletion.diagram (AddGrpCat.of ℤ)).obj H := by + change zHatProfiniteAddGrp ⟶ + ProfiniteAddGrp.ofFiniteAddGrp + (FiniteAddGrp.of (ℤ ⧸ H.toAddSubgroup)) + let Q := FiniteAddGrp.of (ℤ ⧸ H.toAddSubgroup) + letI : TopologicalSpace Q := ⊥ + letI : DiscreteTopology Q := discreteTopology_bot Q + let quotientReduction : ZMod H.toAddSubgroup.index →ₜ+ Q := + { toAddMonoidHom := zHatFiniteIndexQuotientReduction H + continuous_toFun := continuous_of_discreteTopology } + let reduction : ZHat →ₜ+ Q := + quotientReduction.comp + (zHatReduction H.toAddSubgroup.index + (by exact finiteIndexNormalAddSubgroup_index_pos H)) + exact ProfiniteAddGrp.ofHom reduction + +/-- The diagram leg agrees with quotient reduction on the dense copy of +the integers in `ZHat`. -/ +@[simp] +theorem zHatFiniteIndexQuotientDiagramLeg_intCast + (H : FiniteIndexNormalAddSubgroup ℤ) (a : ℤ) : + (zHatFiniteIndexQuotientDiagramLeg H).hom (a : ZHat) = + QuotientAddGroup.mk' H.toAddSubgroup a := by + change zHatReductionToFiniteIndexQuotient H (a : ZHat) = + QuotientAddGroup.mk' H.toAddSubgroup a + exact zHatReductionToFiniteIndexQuotient_intCast H a + +/-- The finite-quotient reductions form a cone over the diagram of finite +index quotients of `ℤ`. -/ +theorem zHatFiniteIndexQuotientDiagramLeg_naturality + {H K : FiniteIndexNormalAddSubgroup ℤ} (f : H ⟶ K) : + zHatFiniteIndexQuotientDiagramLeg H ≫ + (ProfiniteAddGrp.ProfiniteCompletion.diagram (AddGrpCat.of ℤ)).map f = + zHatFiniteIndexQuotientDiagramLeg K := by + let intCast : ℤ → zHatProfiniteAddGrp := fun a => (a : ZHat) + have hdense : DenseRange intCast := by + change DenseRange (Int.castRingHom ZHat) + exact denseRange_intCast_zHat + have hfun : + ((zHatFiniteIndexQuotientDiagramLeg H ≫ + (ProfiniteAddGrp.ProfiniteCompletion.diagram (AddGrpCat.of ℤ)).map f).hom : + zHatProfiniteAddGrp → _) = + (zHatFiniteIndexQuotientDiagramLeg K).hom := + hdense.equalizer + ((zHatFiniteIndexQuotientDiagramLeg H ≫ + (ProfiniteAddGrp.ProfiniteCompletion.diagram (AddGrpCat.of ℤ)).map f).hom.continuous_toFun) + (zHatFiniteIndexQuotientDiagramLeg K).hom.continuous_toFun (by + funext a + change + ((ProfiniteAddGrp.ProfiniteCompletion.diagram + (AddGrpCat.of ℤ)).map f).hom + ((zHatFiniteIndexQuotientDiagramLeg H).hom (a : ZHat)) = + (zHatFiniteIndexQuotientDiagramLeg K).hom (a : ZHat) + rw [zHatFiniteIndexQuotientDiagramLeg_intCast H a, + zHatFiniteIndexQuotientDiagramLeg_intCast K a] + rfl) + exact ConcreteCategory.hom_ext _ _ fun x => congrFun hfun x + +/-- The finite quotient reductions of `ZHat` are a cone over the finite-index +quotient diagram used by Mathlib to define the profinite completion of `ℤ`. -/ +noncomputable def zHatFiniteIndexQuotientCone : + Cone (ProfiniteAddGrp.ProfiniteCompletion.diagram (AddGrpCat.of ℤ)) where + pt := zHatProfiniteAddGrp + π := + { app := zHatFiniteIndexQuotientDiagramLeg + naturality := by + intro H K f + change 𝟙 zHatProfiniteAddGrp ≫ zHatFiniteIndexQuotientDiagramLeg K = + zHatFiniteIndexQuotientDiagramLeg H ≫ + (ProfiniteAddGrp.ProfiniteCompletion.diagram (AddGrpCat.of ℤ)).map f + simpa only [Category.id_comp] using + (zHatFiniteIndexQuotientDiagramLeg_naturality f).symm } + +/-- The continuous additive map from `ZHat` to Mathlib's profinite completion +of the additive group of integers, induced by its finite quotient reductions. -/ +noncomputable def zHatToIntegerProfiniteCompletion : + zHatProfiniteAddGrp ⟶ + ProfiniteAddGrp.ProfiniteCompletion.completion (AddGrpCat.of ℤ) := + (ProfiniteAddGrp.limitConeIsLimit + (ProfiniteAddGrp.ProfiniteCompletion.diagram (AddGrpCat.of ℤ))).lift + zHatFiniteIndexQuotientCone + +/-- Projecting the induced map to a finite quotient recovers its reduction map. -/ +theorem zHatToIntegerProfiniteCompletion_fac + (H : FiniteIndexNormalAddSubgroup ℤ) : + zHatToIntegerProfiniteCompletion ≫ + (ProfiniteAddGrp.limitCone + (ProfiniteAddGrp.ProfiniteCompletion.diagram (AddGrpCat.of ℤ))).π.app H = + zHatFiniteIndexQuotientDiagramLeg H := by + exact (ProfiniteAddGrp.limitConeIsLimit + (ProfiniteAddGrp.ProfiniteCompletion.diagram (AddGrpCat.of ℤ))).fac + zHatFiniteIndexQuotientCone H + +/-- On ordinary integers, the induced map is Mathlib's canonical completion map. -/ +theorem zHatToIntegerProfiniteCompletion_intCast + (a : ℤ) : + zHatToIntegerProfiniteCompletion (a : ZHat) = + ProfiniteAddGrp.ProfiniteCompletion.etaFn (AddGrpCat.of ℤ) a := by + apply Subtype.ext + funext H + change + ((ProfiniteAddGrp.limitCone + (ProfiniteAddGrp.ProfiniteCompletion.diagram (AddGrpCat.of ℤ))).π.app H).hom + (zHatToIntegerProfiniteCompletion (a : ZHat)) = + QuotientAddGroup.mk' H.toAddSubgroup a + rw [← zHatFiniteIndexQuotientDiagramLeg_intCast H a] + exact ConcreteCategory.congr_hom + (zHatToIntegerProfiniteCompletion_fac H) (a : ZHat) + +private theorem zHatFiniteIndexQuotientReduction_injective + (H : FiniteIndexNormalAddSubgroup ℤ) : + Function.Injective (zHatFiniteIndexQuotientReduction H) := by + intro x y hxy + obtain ⟨a, rfl⟩ := ZMod.intCast_surjective x + obtain ⟨b, rfl⟩ := ZMod.intCast_surjective y + have hquotient : + QuotientAddGroup.mk' H.toAddSubgroup a = + QuotientAddGroup.mk' H.toAddSubgroup b := by + simpa only [zHatFiniteIndexQuotientReduction, ZMod.lift_coe] using hxy + have hmem : a - b ∈ H.toAddSubgroup := + (QuotientAddGroup.eq_iff_sub_mem).mp hquotient + rw [finiteIndexNormalAddSubgroup_eq_zmultiples_index H, + Int.mem_zmultiples_iff] at hmem + rw [ZMod.intCast_eq_intCast_iff_dvd_sub] + simpa only [neg_sub] using dvd_neg.mpr hmem + +private theorem zHatToIntegerProfiniteCompletion_injective : + Function.Injective + (fun z : ZHat => zHatToIntegerProfiniteCompletion z) := by + intro x y hxy + apply ZHat.ext + intro n hn + have hnatAbs : (n : ℤ).natAbs = n := by + cases n <;> rfl + let H : FiniteIndexNormalAddSubgroup ℤ := + { toAddSubgroup := AddSubgroup.zmultiples (n : ℤ) + isFiniteIndex' := + ⟨by + simpa only [Int.index_zmultiples, hnatAbs] using + Nat.ne_of_gt hn⟩ } + have hindex : H.toAddSubgroup.index = n := by + simp only [H, Int.index_zmultiples, hnatAbs] + have hprojection := congrArg + (fun z => + ((ProfiniteAddGrp.limitCone + (ProfiniteAddGrp.ProfiniteCompletion.diagram + (AddGrpCat.of ℤ))).π.app H).hom z) + hxy + have hleg : + (zHatFiniteIndexQuotientDiagramLeg H).hom x = + (zHatFiniteIndexQuotientDiagramLeg H).hom y := by + calc + (zHatFiniteIndexQuotientDiagramLeg H).hom x = + ((ProfiniteAddGrp.limitCone + (ProfiniteAddGrp.ProfiniteCompletion.diagram + (AddGrpCat.of ℤ))).π.app H).hom + (zHatToIntegerProfiniteCompletion x) := + (ConcreteCategory.congr_hom + (zHatToIntegerProfiniteCompletion_fac H) x).symm + _ = ((ProfiniteAddGrp.limitCone + (ProfiniteAddGrp.ProfiniteCompletion.diagram + (AddGrpCat.of ℤ))).π.app H).hom + (zHatToIntegerProfiniteCompletion y) := hprojection + _ = (zHatFiniteIndexQuotientDiagramLeg H).hom y := + ConcreteCategory.congr_hom + (zHatToIntegerProfiniteCompletion_fac H) y + have hreduction : + zHatReduction H.toAddSubgroup.index + (by exact finiteIndexNormalAddSubgroup_index_pos H) x = + zHatReduction H.toAddSubgroup.index + (by exact finiteIndexNormalAddSubgroup_index_pos H) y := by + apply zHatFiniteIndexQuotientReduction_injective H + change zHatReductionToFiniteIndexQuotient H x = + zHatReductionToFiniteIndexQuotient H y + exact hleg + have hreductionAll : + ∀ hm : 0 < H.toAddSubgroup.index, + zHatReduction H.toAddSubgroup.index hm x = + zHatReduction H.toAddSubgroup.index hm y := by + intro hm + exact hreduction + have hreductionAtN : + ∀ hm : 0 < n, + zHatReduction n hm x = zHatReduction n hm y := + hindex ▸ hreductionAll + exact hreductionAtN hn + +private theorem zHatToIntegerProfiniteCompletion_surjective : + Function.Surjective + (fun z : ZHat => zHatToIntegerProfiniteCompletion z) := by + have hsubset : + Set.range + (ProfiniteAddGrp.ProfiniteCompletion.etaFn + (AddGrpCat.of ℤ)) ⊆ + Set.range (fun z : ZHat => zHatToIntegerProfiniteCompletion z) := by + rintro _ ⟨a, rfl⟩ + exact ⟨(a : ZHat), zHatToIntegerProfiniteCompletion_intCast a⟩ + have hdense : DenseRange + (fun z : ZHat => zHatToIntegerProfiniteCompletion z) := + (ProfiniteAddGrp.ProfiniteCompletion.denseRange + (G := AddGrpCat.of ℤ)).mono hsubset + have hclosed : IsClosed + (Set.range (fun z : ZHat => zHatToIntegerProfiniteCompletion z)) := + zHatToIntegerProfiniteCompletion.hom.continuous_toFun.isClosedMap.isClosed_range + rw [← Set.range_eq_univ, ← closure_eq_iff_isClosed.mpr hclosed, + Dense.closure_eq hdense] + +/-- The canonical topological additive equivalence between `ZHat` and the +profinite completion of the additive group of integers. -/ +noncomputable def zHatContinuousAddEquivIntegerProfiniteCompletion : + ZHat ≃ₜ+ + ProfiniteAddGrp.ProfiniteCompletion.completion (AddGrpCat.of ℤ) := by + have hcontinuous : + Continuous (fun z : ZHat => zHatToIntegerProfiniteCompletion z) := by + exact zHatToIntegerProfiniteCompletion.hom.continuous_toFun + exact + { (Continuous.homeoOfEquivCompactToT2 + (f := Equiv.ofBijective + (fun z : ZHat => zHatToIntegerProfiniteCompletion z) + ⟨by exact zHatToIntegerProfiniteCompletion_injective, + by exact zHatToIntegerProfiniteCompletion_surjective⟩) + hcontinuous) with + map_add' := zHatToIntegerProfiniteCompletion.hom.map_add } + +/-- The forward map of the completion equivalence is the finite-quotient +comparison map. -/ +@[simp] +theorem zHatContinuousAddEquivIntegerProfiniteCompletion_apply (z : ZHat) : + zHatContinuousAddEquivIntegerProfiniteCompletion z = + zHatToIntegerProfiniteCompletion z := + rfl + +/-- The canonical continuous additive map from the profinite completion of +the integers back to `ZHat`. -/ +noncomputable def integerProfiniteCompletionToZHat : + ProfiniteAddGrp.ProfiniteCompletion.completion (AddGrpCat.of ℤ) ⟶ + zHatProfiniteAddGrp := + ProfiniteAddGrp.ofHom + (zHatContinuousAddEquivIntegerProfiniteCompletion.symm : + ProfiniteAddGrp.ProfiniteCompletion.completion (AddGrpCat.of ℤ) →ₜ+ ZHat) + +/-- The map from the profinite completion to `ZHat` extends the ordinary +integer embedding. -/ +@[simp] +theorem integerProfiniteCompletionToZHat_etaFn (a : ℤ) : + integerProfiniteCompletionToZHat + (ProfiniteAddGrp.ProfiniteCompletion.etaFn (AddGrpCat.of ℤ) a) = + (a : ZHat) := by + change zHatContinuousAddEquivIntegerProfiniteCompletion.symm + (ProfiniteAddGrp.ProfiniteCompletion.etaFn (AddGrpCat.of ℤ) a) = + (a : ZHat) + apply zHatContinuousAddEquivIntegerProfiniteCompletion.injective + rw [zHatContinuousAddEquivIntegerProfiniteCompletion.apply_symm_apply] + simpa only [zHatContinuousAddEquivIntegerProfiniteCompletion_apply] using + (zHatToIntegerProfiniteCompletion_intCast a).symm + +/-- The inverse map of the completion equivalence is the canonical comparison +map back to `ZHat`. -/ +@[simp] +theorem zHatContinuousAddEquivIntegerProfiniteCompletion_symm_apply + (x : ProfiniteAddGrp.ProfiniteCompletion.completion + (AddGrpCat.of ℤ)) : + zHatContinuousAddEquivIntegerProfiniteCompletion.symm x = + integerProfiniteCompletionToZHat x := + rfl + +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Valuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Valuation.lean new file mode 100644 index 0000000000..cdea67d117 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Valuation.lean @@ -0,0 +1,331 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Norm + +/-! # Valuation -/ + +@[expose] public section +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +/-! +# normalized degree and Frobenius theory: henselian valuations + +The multiplicative coefficient module is represented additively, as +in . Accordingly a valuation and a norm are additive homomorphisms. This +file formalizes the valuation-quotient axiom and constructs the normalized valuations of +normalized-valuation functoriality. +-/ + +noncomputable +section + +universe u + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +/-- The norm `N_{K|k}` on the actual fixed modules. -/ +def normToBase (A : Rep ℤ G) (K : ClosedSubgroup G) + [Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) K (le_baseField K))] : + ambientFixedAddSubgroup A K →+ + ambientFixedAddSubgroup A (baseField G) := + relativeNorm A (baseField G) K (le_baseField K) + +/-- Multiplication by `n` on an additive subgroup. -/ +def nsmulOnAddSubgroup (Z : AddSubgroup ZHat) (n : ℕ) : Z →+ Z where + toFun z := ⟨n • z.1, Z.nsmul_mem z.2 n⟩ + map_zero' := by ext; simp + map_add' x y := by ext; simp + +/-- The subgroup `nZ` inside a value group `Z`. -/ +def nsmulWithin (Z : AddSubgroup ZHat) (n : ℕ) : AddSubgroup Z := + (nsmulOnAddSubgroup Z n).range + +/-- The ambient subgroup `nZ ⊆ ℤ̂`. -/ +def nsmulImage (Z : AddSubgroup ZHat) (n : ℕ) : AddSubgroup ZHat := + Z.map + { toFun := fun z : ZHat => n • z + map_zero' := nsmul_zero n + map_add' := fun x y => nsmul_add x y n } + +/-- An element belongs to the natural-multiple image exactly when it has a +preimage in the subgroup. -/ +@[simp] +theorem mem_nsmulImage_iff (Z : AddSubgroup ZHat) (n : ℕ) (z : ZHat) : + z ∈ nsmulImage Z n ↔ ∃ x ∈ Z, n • x = z := by + rfl + +/-- Multiples of the full value group are the range of multiplication +by the same natural number on `ZHat`. -/ +@[simp] +theorem nsmulImage_top (n : ℕ) : + nsmulImage (⊤ : AddSubgroup ZHat) n = + (zHatMulNat n).toAddMonoidHom.range := by + ext z + constructor + · rintro ⟨x, _hx, rfl⟩ + exact ⟨x, rfl⟩ + · rintro ⟨x, rfl⟩ + exact ⟨x, AddSubgroup.mem_top x, rfl⟩ + +/-- Restriction of reduction modulo `n` along the inclusion `Z ≤ ℤ̂`. -/ +def valueGroupReduction (Z : AddSubgroup ZHat) (n : ℕ) (hn : 0 < n) : + Z →+ ZMod n := + (zHatReduction n hn).toAddMonoidHom.comp Z.subtype + +/-- The canonical map `Z/nZ → ℤ/nℤ` induced by the inclusion `Z ≤ ℤ̂` +and reduction modulo `n`. + +This is the specific map required in the valuation-quotient axiom, rather than an +arbitrarily chosen abstract equivalence between the two quotients. -/ +def canonicalValueQuotientMap (Z : AddSubgroup ZHat) + (n : ℕ) (hn : 0 < n) : (Z ⧸ nsmulWithin Z n) →+ ZMod n := + QuotientAddGroup.lift (nsmulWithin Z n) (valueGroupReduction Z n hn) (by + rintro _ ⟨z, rfl⟩ + change zHatReduction n hn (n • (z : ZHat)) = 0 + rw [map_nsmul] + simp [nsmul_eq_mul]) + +/-- The canonical value map evaluates on a quotient representative by reduction modulo `n`. -/ +theorem canonicalValueQuotientMap_mk (Z : AddSubgroup ZHat) + (n : ℕ) (hn : 0 < n) (z : Z) : + canonicalValueQuotientMap Z n hn + (QuotientAddGroup.mk' (nsmulWithin Z n) z) = + zHatReduction n hn (z : ZHat) := + rfl + +/-- For the full profinite-integer value group, the canonical +inclusion-and-reduction quotient map is bijective. -/ +theorem canonicalValueQuotientMap_top_bijective + (n : ℕ) (hn : 0 < n) : + Function.Bijective + (canonicalValueQuotientMap + (⊤ : AddSubgroup ZHat) n hn) := by + constructor + · intro q₁ q₂ + refine Quotient.inductionOn' q₁ ?_ + intro z₁ + refine Quotient.inductionOn' q₂ ?_ + intro z₂ h + apply QuotientAddGroup.eq_iff_sub_mem.mpr + have hz : + zHatReduction n hn + ((z₁ : ZHat) - (z₂ : ZHat)) = + 0 := by + rw [map_sub] + change + zHatReduction n hn (z₁ : ZHat) = + zHatReduction n hn (z₂ : ZHat) at h + rw [h, sub_self] + have hrange : + (z₁ : ZHat) - (z₂ : ZHat) ∈ + (zHatMulNat n).toAddMonoidHom.range := by + rw [zHatMulNat_range_eq_ker_reduction n hn] + exact hz + obtain ⟨w, hw⟩ := hrange + refine ⟨⟨w, AddSubgroup.mem_top w⟩, ?_⟩ + apply Subtype.ext + exact hw + · intro a + obtain ⟨z, hz⟩ := + zHatReduction_surjective n hn a + exact + ⟨QuotientAddGroup.mk' + (nsmulWithin (⊤ : AddSubgroup ZHat) n) + ⟨z, AddSubgroup.mem_top z⟩, + hz⟩ + +/-- The quotient used by the norm has the positive degree carried by a +finite abstract field. -/ +@[simp] theorem FiniteAbstractField.normToBase_index_eq_degree + {G : Type*} [Group G] [TopologicalSpace G] + (K : FiniteAbstractField G) : + (extensionSubgroup (baseField G) K.field + (le_baseField K.field)).index = + (K.toFiniteAbstractExtension.degree : ℕ) := + K.toFiniteAbstractExtension.extensionSubgroup_index_eq_degree + +/-- **the valuation-quotient axiom.** A henselian valuation of `A_k` with respect to `d`. + +`integers_mem` and `canonical_value_quotient_bijective` are precisely +condition (i), while `norm_range` is condition (ii). -/ +structure ValuationData (D : DegreeData G) (A : Rep ℤ G) where + /-- The additive valuation on the distinguished base-field fixed module. -/ + toAddMonoidHom : ambientFixedAddSubgroup A (baseField G) →+ ZHat + /-- Every integral value occurs in the image of the valuation. -/ + integers_mem : ∀ m : ℤ, + (Int.castRingHom ZHat) m ∈ + toAddMonoidHom.range + /-- Reduction of the value group modulo every positive integer is bijective. -/ + canonical_value_quotient_bijective : ∀ (n : ℕ) (hn : 0 < n), + Function.Bijective + (canonicalValueQuotientMap toAddMonoidHom.range n hn) + /-- Norms from a finite abstract field have the prescribed value-group image. -/ + norm_range : ∀ K : FiniteAbstractField G, + (toAddMonoidHom.comp (normToBase A K.field)).range = + nsmulImage toAddMonoidHom.range (K.residueDegree D : ℕ) + +namespace ValuationData + +variable {D : DegreeData G} {A : Rep ℤ G} + +/-- The value group `Z = v(A_k)`. -/ +def valueGroup (v : ValuationData D A) : AddSubgroup ZHat := + v.toAddMonoidHom.range + +/-- The valuation-quotient axiom's canonical map for a henselian valuation. -/ +def canonicalQuotientMap (v : ValuationData D A) + (n : ℕ) (hn : 0 < n) : + (v.valueGroup ⧸ nsmulWithin v.valueGroup n) →+ ZMod n := + canonicalValueQuotientMap v.valueGroup n hn + +/-- The former equivalence API, now derived from the bijectivity of the +canonical inclusion-and-reduction map in the valuation-quotient axiom. -/ +def cyclicValueQuotients (v : ValuationData D A) + (n : ℕ) (hn : 0 < n) : + (v.valueGroup ⧸ nsmulWithin v.valueGroup n) ≃+ ZMod n := + AddEquiv.ofBijective (v.canonicalQuotientMap n hn) + (v.canonical_value_quotient_bijective n hn) + +/-- Canonical reduction of the value group modulo `n`. -/ +def valueModulo (v : ValuationData D A) (n : ℕ) (hn : 0 < n) : + v.valueGroup →+ ZMod n := + (v.cyclicValueQuotients n hn).toAddMonoidHom.comp + (QuotientAddGroup.mk' (nsmulWithin v.valueGroup n)) + +/-- Value modulo `n` is profinite-integer reduction of the underlying value. -/ +@[simp] +theorem valueModulo_apply (v : ValuationData D A) + (n : ℕ) (hn : 0 < n) (z : v.valueGroup) : + v.valueModulo n hn z = zHatReduction n hn (z : ZHat) := + rfl + +/-- Reduction of the value group modulo a positive integer is surjective. -/ +theorem valueModulo_surjective (v : ValuationData D A) + (n : ℕ) (hn : 0 < n) : + Function.Surjective (v.valueModulo n hn) := by + intro z + obtain ⟨q, rfl⟩ := (v.cyclicValueQuotients n hn).surjective z + refine Quotient.inductionOn' q ?_ + intro a + exact ⟨a, rfl⟩ + +/-- The norm composite `v ∘ N_{K|k}` before division by the residue degree. -/ +def normCompositeAt (v : ValuationData D A) (K : FiniteAbstractField G) : + ambientFixedAddSubgroup A K.field →+ ZHat := + v.toAddMonoidHom.comp (normToBase A K.field) + +/-- The norm-valuation composite has range equal to the residue-degree multiple image. -/ +theorem normCompositeAt_range (v : ValuationData D A) (K : FiniteAbstractField G) : + (v.normCompositeAt K).range = + nsmulImage v.valueGroup (K.residueDegree D : ℕ) := + v.norm_range K + +/-- `v(N_{K|k}a)` regarded as an element of `f_K ℤ̂`. -/ +def normCompositeAtInResidueImage (v : ValuationData D A) + (K : FiniteAbstractField G) : + ambientFixedAddSubgroup A K.field →+ + (zHatMulNat (K.residueDegree D : ℕ)).toAddMonoidHom.range where + toFun a := ⟨v.normCompositeAt K a, by + have ha : v.normCompositeAt K a ∈ (v.normCompositeAt K).range := ⟨a, rfl⟩ + rw [v.normCompositeAt_range K] at ha + obtain ⟨z, _hz, hz⟩ := ha + exact ⟨z, hz⟩⟩ + map_zero' := by ext; simp [normCompositeAt] + map_add' x y := by + apply Subtype.ext + exact map_add (v.normCompositeAt K) x y + +/-- Division by `f_K` before restricting the codomain back to `Z`. -/ +def dividedAt (v : ValuationData D A) (K : FiniteAbstractField G) : + ambientFixedAddSubgroup A K.field →+ ZHat := + (zHatDivide (K.residueDegree D : ℕ) + (K.residueDegree D).property).toAddMonoidHom.comp + (v.normCompositeAtInResidueImage K) + +/-- The defining identity `f_K v_K = v ∘ N_{K|k}` before codomain +restriction. -/ +theorem residueDegree_nsmul_dividedAt (v : ValuationData D A) + (K : FiniteAbstractField G) + (a : ambientFixedAddSubgroup A K.field) : + (K.residueDegree D : ℕ) • v.dividedAt K a = v.normCompositeAt K a := by + exact zHatMulNat_zHatDivide (K.residueDegree D : ℕ) + (K.residueDegree D).property + (v.normCompositeAtInResidueImage K a) + +/-- The divided value lies in the original value group `Z`. -/ +theorem dividedAt_mem_valueGroup (v : ValuationData D A) + (K : FiniteAbstractField G) + (a : ambientFixedAddSubgroup A K.field) : + v.dividedAt K a ∈ v.valueGroup := by + have ha : v.normCompositeAt K a ∈ (v.normCompositeAt K).range := ⟨a, rfl⟩ + rw [v.normCompositeAt_range K] at ha + obtain ⟨z, hzZ, hz⟩ := ha + have hzSubtype : v.normCompositeAtInResidueImage K a = + ⟨zHatMulNat (K.residueDegree D : ℕ) z, ⟨z, rfl⟩⟩ := by + apply Subtype.ext + change v.normCompositeAt K a = + zHatMulNat (K.residueDegree D : ℕ) z + exact hz.symm + change zHatDivide (K.residueDegree D : ℕ) + (K.residueDegree D).property + (v.normCompositeAtInResidueImage K a) ∈ v.valueGroup + rw [hzSubtype] + exact (zHatDivide_zHatMulNat (K.residueDegree D : ℕ) + (K.residueDegree D).property z).symm ▸ hzZ + +/-- The normalized valuation `v_K = (1/f_K) v ∘ N_{K|k}`, with the exact +codomain `Z` from the valuation-quotient axiom. -/ +def valuationAt (v : ValuationData D A) (K : FiniteAbstractField G) : + ambientFixedAddSubgroup A K.field →+ v.valueGroup := + (v.dividedAt K).codRestrict v.valueGroup (fun a => v.dividedAt_mem_valueGroup K a) + +/-- The underlying profinite value of the positive valuation is the divided valuation. -/ +@[simp] +theorem valuationAt_coe (v : ValuationData D A) (K : FiniteAbstractField G) + (a : ambientFixedAddSubgroup A K.field) : + (v.valuationAt K a : ZHat) = v.dividedAt K a := + rfl + +/-- **normalized-valuation functoriality (surjectivity).** The normalized valuation over every +finite abstract field maps onto `Z`. -/ +theorem normalizedValuation_surjective (v : ValuationData D A) + (K : FiniteAbstractField G) : + Function.Surjective (v.valuationAt K) := by + intro z + have hzImage : (K.residueDegree D : ℕ) • z.1 ∈ + nsmulImage v.valueGroup (K.residueDegree D : ℕ) := + ⟨z.1, z.2, rfl⟩ + rw [← v.normCompositeAt_range K] at hzImage + obtain ⟨a, ha⟩ := hzImage + refine ⟨a, ?_⟩ + apply Subtype.ext + change zHatDivide (K.residueDegree D : ℕ) + (K.residueDegree D).property + (v.normCompositeAtInResidueImage K a) = z.1 + have hsub : v.normCompositeAtInResidueImage K a = + ⟨zHatMulNat (K.residueDegree D : ℕ) z.1, ⟨z.1, rfl⟩⟩ := by + apply Subtype.ext + change v.normCompositeAt K a = + zHatMulNat (K.residueDegree D : ℕ) z.1 + exact ha + rw [hsub] + exact zHatDivide_zHatMulNat (K.residueDegree D : ℕ) + (K.residueDegree D).property z.1 + +end ValuationData + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ValuationLaws.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ValuationLaws.lean new file mode 100644 index 0000000000..bc89d6be84 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ValuationLaws.lean @@ -0,0 +1,211 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Valuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormLaws + +/-! # Valuation Laws -/ + +@[expose] public section +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +/-! +# normalized degree and Frobenius theory: functoriality of normalized valuations + +This file proves the two functorial assertions of normalized-valuation functoriality from the +source norm laws. +-/ + +noncomputable +section + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] +variable {D : DegreeData G} {A : Rep ℤ G} + +/-- Conjugating an abstract field does not change its degree image. -/ +theorem DegreeData.fieldImage_conjugate + {G : Type*} [Group G] [TopologicalSpace G] [ContinuousMul G] + (D : DegreeData G) (K : ClosedSubgroup G) (σ : G) : + D.fieldImage (conjugateClosedSubgroup K σ) = D.fieldImage K := by + rw [D.fieldImage_eq_map, D.fieldImage_eq_map] + ext z + constructor + · rintro ⟨x, hx, rfl⟩ + let k : K.toSubgroup := + ⟨σ * x * σ⁻¹, (conjugateClosedSubgroup_mem K σ x).mp hx⟩ + refine ⟨k.1, k.2, ?_⟩ + simp [k, map_mul, mul_assoc] + · rintro ⟨k, hk, rfl⟩ + let x : G := σ⁻¹ * k * σ + have hx : x ∈ conjugateClosedSubgroup K σ := by + rw [conjugateClosedSubgroup_mem] + change σ * x * σ⁻¹ ∈ K.toSubgroup + simpa [x, mul_assoc] using hk + refine ⟨x, hx, ?_⟩ + simp [x, map_mul, mul_assoc, mul_comm] + +/-- Conjugate a field whose actual absolute residue quotient is finite. +The transported field remains in the same residue-finite boundary because +conjugation does not change the degree image. -/ +noncomputable def DegreeData.FiniteResidueAbstractField.conjugate + {G : Type*} [Group G] [TopologicalSpace G] {D : DegreeData G} + [ContinuousMul G] (K : DegreeData.FiniteResidueAbstractField D) (σ : G) : + DegreeData.FiniteResidueAbstractField D where + field := conjugateClosedSubgroup K.field σ + finiteResidueQuotient := by + unfold DegreeData.residueQuotient + rw [D.fieldImage_conjugate K.field σ] + exact K.finiteResidueQuotient + +/-- Conjugation preserves the positive absolute residue degree at the +residue-finite boundary. -/ +theorem DegreeData.FiniteResidueAbstractField.residueDegree_conjugate + {G : Type*} [Group G] [TopologicalSpace G] {D : DegreeData G} + [ContinuousMul G] (K : DegreeData.FiniteResidueAbstractField D) (σ : G) : + (K.conjugate σ).residueDegree = K.residueDegree := by + apply PNat.eq + change Nat.card + (D.residueQuotient (conjugateClosedSubgroup K.field σ)) = + Nat.card (D.residueQuotient K.field) + unfold DegreeData.residueQuotient + have himage := D.fieldImage_conjugate K.field σ + apply Nat.card_congr + exact Subgroup.quotientEquivOfEq + (congrArg + (fun H : Subgroup ZHatMul => H.subgroupOf (⊤ : Subgroup ZHatMul)) + himage) + +/-- Conjugate a finite abstract field without separating the transported +finiteness proof from the field. -/ +noncomputable def FiniteAbstractField.conjugate + {G : Type*} [Group G] [TopologicalSpace G] + [ContinuousMul G] (K : FiniteAbstractField G) (σ : G) : + FiniteAbstractField G where + field := conjugateClosedSubgroup K.field σ + finite := Finite.of_equiv + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) K.field (le_baseField K.field)) + (absoluteConjugateCosetEquiv K.field σ).symm + +/-- Conjugation preserves the positive absolute residue degree. -/ +theorem FiniteAbstractField.residueDegree_conjugate + {G : Type*} [Group G] [TopologicalSpace G] + [ContinuousMul G] (K : FiniteAbstractField G) + (D : DegreeData G) (σ : G) : + (K.conjugate σ).residueDegree D = K.residueDegree D := by + apply PNat.eq + change Nat.card + (D.residueQuotient (conjugateClosedSubgroup K.field σ)) = + Nat.card (D.residueQuotient K.field) + unfold DegreeData.residueQuotient + have himage := D.fieldImage_conjugate K.field σ + apply Nat.card_congr + exact Subgroup.quotientEquivOfEq + (congrArg + (fun H : Subgroup ZHatMul => H.subgroupOf (⊤ : Subgroup ZHatMul)) + himage) + +namespace ValuationData + +/-- **conjugation compatibility of normalized valuations.** The normalized valuations are +compatible with +conjugation: `v_{K^σ}(a^σ) = v_K(a)` (the right-action notation). -/ +theorem normalizedValuation_conjugate [ContinuousMul G] + (v : ValuationData D A) (K : FiniteAbstractField G) (σ : G) + (a : ambientFixedAddSubgroup A K.field) : + v.valuationAt (K.conjugate σ) + (conjugateFixedElement A K.field σ a) = + v.valuationAt K a := by + let : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) (conjugateClosedSubgroup K.field σ) + (le_baseField (conjugateClosedSubgroup K.field σ))) := + (K.conjugate σ).finite + apply Subtype.ext + apply zHatMulNat_injective (K.residueDegree D).property + calc + (K.residueDegree D : ℕ) • + v.dividedAt (K.conjugate σ) + (conjugateFixedElement A K.field σ a) = + ((K.conjugate σ).residueDegree D : ℕ) • + v.dividedAt (K.conjugate σ) + (conjugateFixedElement A K.field σ a) := by + rw [K.residueDegree_conjugate D σ] + _ = v.normCompositeAt (K.conjugate σ) + (conjugateFixedElement A K.field σ a) := + v.residueDegree_nsmul_dividedAt (K.conjugate σ) _ + _ = v.normCompositeAt K a := by + change v.toAddMonoidHom + (normToBase A (conjugateClosedSubgroup K.field σ) + (conjugateFixedElement A K.field σ a)) = + v.toAddMonoidHom (normToBase A K.field a) + congr 1 + apply Subtype.ext + calc + ((normToBase A (conjugateClosedSubgroup K.field σ) + (conjugateFixedElement A K.field σ a) : + ambientFixedAddSubgroup A (baseField G)) : A.V) = + A.ρ σ⁻¹ + ((normToBase A K.field a : + ambientFixedAddSubgroup A (baseField G)) : A.V) := by + simpa [normToBase] using + (relativeNorm_absoluteConjugate_apply A K.field σ a) + _ = ((normToBase A K.field a : + ambientFixedAddSubgroup A (baseField G)) : A.V) := by + exact (normToBase A K.field a).2 ⟨σ⁻¹, trivial⟩ + _ = (K.residueDegree D : ℕ) • v.dividedAt K a := + (v.residueDegree_nsmul_dividedAt K a).symm + +/-- **the norm--valuation formula.** For a finite tower `L | K`, +`v_K ∘ N_{L|K} = f_{L|K} v_L`. -/ +theorem normalizedValuation_tower (v : ValuationData D A) + (E : FiniteAbstractFieldExtension G) + (a : ambientFixedAddSubgroup A E.field.field) : + let ER := E.toFiniteResidueAbstractExtension D + (ER.residueDegree : ℕ) • + ((v.valuationAt E.field a : v.valueGroup) : ZHat) = + ((v.valuationAt E.base + (relativeNorm A E.base.field E.field.field E.below a) : v.valueGroup) : ZHat) := by + let ER := E.toFiniteResidueAbstractExtension D + apply zHatMulNat_injective (E.base.residueDegree D).property + change (ER.base.residueDegree : ℕ) • + ((ER.residueDegree : ℕ) • v.dividedAt E.field a) = + (ER.base.residueDegree : ℕ) • + v.dividedAt E.base + (relativeNorm A E.base.field E.field.field E.below a) + rw [smul_smul, Nat.mul_comm (ER.base.residueDegree : ℕ), + ER.residueDegree_mul_absoluteResidueDegree D] + change (E.field.residueDegree D : ℕ) • v.dividedAt E.field a = + (E.base.residueDegree D : ℕ) • + v.dividedAt E.base + (relativeNorm A E.base.field E.field.field E.below a) + rw [v.residueDegree_nsmul_dividedAt E.field, + v.residueDegree_nsmul_dividedAt E.base] + change v.toAddMonoidHom (normToBase A E.field.field a) = + v.toAddMonoidHom + (normToBase A E.base.field + (relativeNorm A E.base.field E.field.field E.below a)) + let T : DegreeData.FiniteTower G := { + top := E.field.field + middle := E.base.field + base := baseField G + top_le_middle := E.below + middle_le_base := le_baseField E.base.field + finiteTopQuotient := E.finiteQuotient + finiteBaseQuotient := E.base.finite } + exact congrArg v.toAddMonoidHom + (by simpa [T, normToBase] using (T.norm_trans_apply A a).symm) + +end ValuationData + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity.lean new file mode 100644 index 0000000000..2df5d7619c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity.lean @@ -0,0 +1,35 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldCandidate +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.CyclicNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FieldRepresentation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.IntermediateExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormContinuity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopologyCharacterization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ProfiniteAPI +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Sylow +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ValuationContinuity + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/All.lean new file mode 100644 index 0000000000..f425e3dccb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/All.lean @@ -0,0 +1,38 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldCandidate +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.CyclicNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FieldRepresentation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.IntermediateExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormContinuity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopologyCharacterization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ProfiniteAPI +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Sylow +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ValuationContinuity +/-! +# Abstract reciprocity + +Public aggregate for the class-formation reciprocity theorem and the canonical +construction and naturality of its reciprocity maps. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassField.lean new file mode 100644 index 0000000000..34b449de68 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassField.lean @@ -0,0 +1,217 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification +/-! +# The abstract class-field correspondence + +This file gives the inverse direction of the finite abelian classification: +a norm-open subgroup produces its class field. The construction is the +inverse of the order isomorphism proved by abstract class field theory, so +the defining norm-subgroup equality and the two lattice formulas are +consequences rather than extra assumptions. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFormation + +open CyclicCohomology KummerTheory + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace FiniteAbelianSubextension + +variable {D : DegreeData G} {A : Rep ℤ G} + +/-- The class field belonging to a norm-open subgroup. -/ +noncomputable def classField + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) + (N : NormOpenAddSubgroup A K.field) : + FiniteAbelianSubextension K.field := + (normSubgroupOrderIso v hcf K).symm (OrderDual.toDual N) + +/-- The norm subgroup of the class field of `N` is `N`. -/ +@[simp] +theorem classField_normSubgroup + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) + (N : NormOpenAddSubgroup A K.field) : + (classField v hcf K N).normSubgroup A = N.1 := by + calc + (classField v hcf K N).normSubgroup A = + (OrderDual.ofDual + (normSubgroupOrderIso v hcf K (classField v hcf K N))).1 := by + exact (normSubgroupOrderIso_apply + v hcf K (classField v hcf K N)).symm + _ = N.1 := by + simp [classField] + +/-- Taking the class field is inverse to taking the norm subgroup. -/ +@[simp] +theorem classField_normSubgroupMap + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) + (L : FiniteAbelianSubextension K.field) : + classField v hcf K (normSubgroupMap A L) = L := by + change (normSubgroupOrderIso v hcf K).symm + (normSubgroupOrderIso v hcf K L) = L + exact (normSubgroupOrderIso v hcf K).symm_apply_apply L + +/-- Characterization of the unique class field having norm subgroup `N`. -/ +theorem eq_classField_iff_normSubgroup_eq + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) + (L : FiniteAbelianSubextension K.field) + (N : NormOpenAddSubgroup A K.field) : + L = classField v hcf K N ↔ L.normSubgroup A = N.1 := by + constructor + · rintro rfl + exact classField_normSubgroup v hcf K N + · intro h + apply normSubgroupMap_injective v hcf K + apply Subtype.ext + simpa using h + +/-- Inclusion of class fields is reverse inclusion of their defining norm +subgroups. -/ +theorem classField_le_classField_iff + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) + (N₁ N₂ : NormOpenAddSubgroup A K.field) : + classField v hcf K N₁ ≤ classField v hcf K N₂ ↔ N₂.1 ≤ N₁.1 := by + rw [le_iff_normSubgroup_le v hcf K] + simp + +/-- A finite abelian extension lies in the class field of `N` exactly when +its norm subgroup contains `N`. -/ +theorem le_classField_iff + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) + (L : FiniteAbelianSubextension K.field) + (N : NormOpenAddSubgroup A K.field) : + L ≤ classField v hcf K N ↔ N.1 ≤ L.normSubgroup A := by + rw [le_iff_normSubgroup_le v hcf K] + simp + +/-- The class field of `N` lies in `L` exactly when the norm subgroup of +`L` lies in `N`. -/ +theorem classField_le_iff + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) + (N : NormOpenAddSubgroup A K.field) + (L : FiniteAbelianSubextension K.field) : + classField v hcf K N ≤ L ↔ L.normSubgroup A ≤ N.1 := by + rw [le_iff_normSubgroup_le v hcf K] + simp + +/-- Intersection of two norm-open subgroups, with its openness produced +from finite Galois norm neighbourhoods. -/ +def normOpenInf + (K : FiniteAbstractField G) + (N₁ N₂ : NormOpenAddSubgroup A K.field) : + NormOpenAddSubgroup A K.field := by + refine ⟨N₁.1 ⊓ N₂.1, ?_⟩ + rw [normTopology_addSubgroup_isOpen_iff] + obtain ⟨E₁, hE₁⟩ := + (normTopology_addSubgroup_isOpen_iff A K.field N₁.1).1 N₁.2 + obtain ⟨E₂, hE₂⟩ := + (normTopology_addSubgroup_isOpen_iff A K.field N₂.1).1 N₂.2 + refine ⟨E₁.compositum E₂, le_inf ?_ ?_⟩ + · exact (FiniteGaloisSubextension.normSubgroup_compositum_le_left + A E₁ E₂).trans hE₁ + · exact (FiniteGaloisSubextension.normSubgroup_compositum_le_right + A E₁ E₂).trans hE₂ + +/-- Product of two norm-open subgroups, with openness produced by either +of its open factors. -/ +def normOpenSup + (K : FiniteAbstractField G) + (N₁ N₂ : NormOpenAddSubgroup A K.field) : + NormOpenAddSubgroup A K.field := by + refine ⟨N₁.1 ⊔ N₂.1, ?_⟩ + rw [normTopology_addSubgroup_isOpen_iff] + obtain ⟨E₁, hE₁⟩ := + (normTopology_addSubgroup_isOpen_iff A K.field N₁.1).1 N₁.2 + exact ⟨E₁, hE₁.trans le_sup_left⟩ + +@[simp] +theorem normOpenInf_val + (K : FiniteAbstractField G) + (N₁ N₂ : NormOpenAddSubgroup A K.field) : + (normOpenInf K N₁ N₂).1 = N₁.1 ⊓ N₂.1 := + rfl + +@[simp] +theorem normOpenSup_val + (K : FiniteAbstractField G) + (N₁ N₂ : NormOpenAddSubgroup A K.field) : + (normOpenSup K N₁ N₂).1 = N₁.1 ⊔ N₂.1 := + rfl + +/-- The class field of an intersection of norm groups is the compositum of +the two class fields. -/ +theorem classField_normOpenInf + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) + (N₁ N₂ : NormOpenAddSubgroup A K.field) : + classField (D := D) v hcf K (normOpenInf K N₁ N₂) = + (classField (D := D) v hcf K N₁).compositum + (classField (D := D) v hcf K N₂) := by + apply normSubgroupMap_injective (D := D) v hcf K + apply Subtype.ext + rw [normSubgroupMap_val, normSubgroupMap_val, + normSubgroup_compositum (D := D) v hcf K, + classField_normSubgroup (D := D) v hcf K, + classField_normSubgroup (D := D) v hcf K, + classField_normSubgroup (D := D) v hcf K] + rfl + +/-- The class field of a product of norm groups is the intersection of the +two class fields. -/ +theorem classField_normOpenSup + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) + (N₁ N₂ : NormOpenAddSubgroup A K.field) : + classField (D := D) v hcf K (normOpenSup K N₁ N₂) = + (classField (D := D) v hcf K N₁).intersection + (classField (D := D) v hcf K N₂) := by + apply normSubgroupMap_injective (D := D) v hcf K + apply Subtype.ext + rw [normSubgroupMap_val, normSubgroupMap_val, + normSubgroup_intersection (D := D) v hcf K, + classField_normSubgroup (D := D) v hcf K, + classField_normSubgroup (D := D) v hcf K, + classField_normSubgroup (D := D) v hcf K] + rfl + +end FiniteAbelianSubextension +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldAxiom.lean new file mode 100644 index 0000000000..2c2445aad8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldAxiom.lean @@ -0,0 +1,105 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnitCohomologyAxiom + +/-! # Class Field Axiom -/ + +@[expose] public section +namespace ClassFormation + +open CyclicCohomology + +/-! +# Abstract reciprocity: the class field axiom + +The coefficient group for a finite cyclic extension `L / K` is the actual +fixed module `A_L`, descended to the actual quotient `G_K / G_L`. Thus the +two numbers below are the orders of the Tate groups occurring in the +original statement the class-field axiom, rather than cardinality data attached to an +auxiliary reciprocity map. +-/ + +noncomputable +section + +open CategoryTheory + +/-! `Representation.Rep` places its coefficient ring and acting group in the +same universe. The shared `IntegralRepGroupType` boundary records the +universe forced by the coefficient ring `ℤ` without scattering raw +universe-zero declarations through the reciprocity API. -/ + +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +/-- The finite cohomology data asserted at one finite cyclic extension. +Finiteness is stored before either natural-valued cardinality is formed. -/ +structure ClassFieldAxiomCohomologyData (A : Rep ℤ G) + (K : FiniteAbstractField G) (E : FiniteCyclicSubextension K) : Prop where + /-- The degree-zero Tate cohomology group is finite. -/ + finiteTateHZero : Finite (tateCohomology (E.fixedRepresentation A) 0) + /-- The degree-minus-one Tate cohomology group is finite. -/ + finiteTateHMinusOne : + Finite (tateCohomology (E.fixedRepresentation A) (-1)) + /-- Degree-zero Tate cohomology has cardinality equal to the extension degree. -/ + tateHZero_card : + Nat.card (tateCohomology (E.fixedRepresentation A) 0) = + (E.toFiniteAbstractExtension.degree : ℕ) + /-- Degree-minus-one Tate cohomology is trivial by cardinality. -/ + tateHMinusOne_card : + Nat.card (tateCohomology (E.fixedRepresentation A) (-1)) = 1 + +/-- **The class-field axiom.** For every finite cyclic extension `L / K` +with `K` finite over the distinguished base field, +`#H⁰(G(L/K), A_L) = [L : K]` and `#H⁻¹(G(L/K), A_L) = 1`. + +Both the base field and the cyclic extension are bundled, so containment, +finiteness, normality, and the chosen generator cannot become detached from +the subgroups to which they belong. -/ +def SatisfiesClassFieldAxiom (A : Rep ℤ G) : Prop := + ∀ (K : FiniteAbstractField G) (E : FiniteCyclicSubextension K), + ClassFieldAxiomCohomologyData A K E + +namespace SatisfiesClassFieldAxiom + +variable {A : Rep ℤ G} + +/-- The degree-zero half of the class-field axiom for a bundled cyclic +extension. -/ +theorem tateHZero_card + (hcf : SatisfiesClassFieldAxiom A) + (K : FiniteAbstractField G) (E : FiniteCyclicSubextension K) : + Nat.card (tateCohomology (E.fixedRepresentation A) 0) = + (E.toFiniteAbstractExtension.degree : ℕ) := + (hcf K E).tateHZero_card + +/-- The degree-minus-one half of the class-field axiom for a bundled cyclic +extension. -/ +theorem tateHMinusOne_card + (hcf : SatisfiesClassFieldAxiom A) + (K : FiniteAbstractField G) (E : FiniteCyclicSubextension K) : + Nat.card (tateCohomology (E.fixedRepresentation A) (-1)) = 1 := + (hcf K E).tateHMinusOne_card + +/-- The order-one assertion in the class-field axiom gives actual vanishing of +`H⁻¹(G(L/K), A_L)`. -/ +theorem tateHMinusOne_isZero + (hcf : SatisfiesClassFieldAxiom A) + (K : FiniteAbstractField G) (E : FiniteCyclicSubextension K) : + Limits.IsZero (tateCohomology (E.fixedRepresentation A) (-1)) := by + let H := tateCohomology (E.fixedRepresentation A) (-1) + let : Finite H := (hcf K E).finiteTateHMinusOne + have hcard : Nat.card H = 1 := by + simpa [H] using hcf.tateHMinusOne_card K E + let : Subsingleton H := (Nat.card_eq_one_iff_unique.mp hcard).1 + exact ModuleCat.isZero_of_subsingleton H + +end SatisfiesClassFieldAxiom + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldCandidate.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldCandidate.lean new file mode 100644 index 0000000000..1bb1453997 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldCandidate.lean @@ -0,0 +1,371 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.IntermediateExtension +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +/-! +# A finite class-field candidate from a norm-open subgroup + +This file isolates the source-producing part of finite-classification surjectivity. +An open subgroup `H ≤ A_K` contains an actual finite Galois +norm subgroup. Modulo that norm subgroup, `H` gives a concrete subgroup. +Transporting this subgroup to the additive abelianization and pulling it +back along `Q → Qᵃᵇ` gives a subgroup of the actual finite Galois quotient +which contains its commutator. The finite Galois correspondence then cuts +out an actual finite abelian intermediate extension. + +The equivalence used for the transport is an explicit argument of the +construction. A later specialization supplies it from finite reciprocity for +the reciprocity map. No existence statement, norm-kernel equality, or +classification conclusion depending on that specialization is +asserted here. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFormation + +open CyclicCohomology KummerTheory +open scoped commutatorElement + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] [IsTopologicalGroup G] + +/-! ## The finite level beneath an open norm-topology subgroup -/ + +omit [IsTopologicalGroup G] in +/-- The first step in the proof of the finite abelian classification theorem: an open subgroup +in the +norm topology contains the norm subgroup of an actual finite Galois +extension. -/ +theorem normOpenAddSubgroup_contains_finiteNormSubgroup + (A : Rep ℤ G) (K : ClosedSubgroup G) + (H : AddSubgroup (ambientFixedAddSubgroup A K)) + (hH : IsNormOpen A K H) : + ∃ E : FiniteGaloisSubextension K, ClassFormation.FiniteGaloisSubextension.normSubgroup A E ≤ + H := + (normTopology_addSubgroup_isOpen_iff A K H).1 hH + +namespace FiniteGaloisSubextension + +variable {K : ClosedSubgroup G} + +local instance normQuotient_extensionQuotient_finite + (E : FiniteGaloisSubextension K) : + Finite (K.toSubgroup ⧸ extensionSubgroup K E.field E.below) := + E.finite + +/-- The subgroup `H / N_E` of the actual norm quotient, represented as +the image of `H` under the quotient map. -/ +def normQuotientSubgroup + (A : Rep ℤ G) (E : FiniteGaloisSubextension K) + (H : AddSubgroup (ambientFixedAddSubgroup A K)) : + AddSubgroup (FiniteNormQuotient A K E.field E.below) := by + letI : Finite (K.toSubgroup ⧸ + extensionSubgroup K E.field E.below) := E.finite + exact H.map (finiteNormClassHom A K E.field E.below) + +omit [IsTopologicalGroup G] in +/-- If `N_E ⊆ H`, then `H` is exactly the full inverse image of +`H / N_E`. This is the group-theoretic fact used in the middle of the +finite-classification surjectivity proof. -/ +theorem finiteNormClass_mem_normQuotientSubgroup_iff + (A : Rep ℤ G) (E : FiniteGaloisSubextension K) + (H : AddSubgroup (ambientFixedAddSubgroup A K)) + (hEH : ClassFormation.FiniteGaloisSubextension.normSubgroup A E ≤ H) + (a : ambientFixedAddSubgroup A K) : + letI : Finite (K.toSubgroup ⧸ + extensionSubgroup K E.field E.below) := E.finite + finiteNormClass A K E.field E.below a ∈ + normQuotientSubgroup A E H ↔ + a ∈ H := by + let : Finite (K.toSubgroup ⧸ + extensionSubgroup K E.field E.below) := E.finite + constructor + · rintro ⟨b, hb, hba⟩ + have hba' : finiteNormClass A K E.field E.below b = + finiteNormClass A K E.field E.below a := by + simpa [finiteNormClass] using hba + have hzero : finiteNormClass A K E.field E.below (b - a) = 0 := by + rw [finiteNormClass_sub, hba', sub_self] + have hsub : b - a ∈ ClassFormation.FiniteGaloisSubextension.normSubgroup A E := + (finiteNormClass_eq_zero_iff A K E.field E.below (b - a)).1 hzero + have hsubH : b - a ∈ H := hEH hsub + have ha : a = b - (b - a) := by abel + rw [ha] + exact H.sub_mem hb hsubH + · intro ha + exact ⟨a, ha, rfl⟩ + +/-! ## Transport to the abelianized finite quotient -/ + +/-- Transport `H / N_E` through a specified finite reciprocity +equivalence and forget additive notation. This is a genuine subgroup of +the actual abelianization `G(E/K)ᵃᵇ`. + +The argument `rE` is kept explicit: this definition does not construct the +finite reciprocity equivalence. -/ +def reciprocityAbelianizedSubgroup + (A : Rep ℤ G) (E : FiniteGaloisSubextension K) + (H : AddSubgroup (ambientFixedAddSubgroup A K)) + (rE : FiniteNormQuotient A K E.field E.below ≃+ + Additive (Abelianization E.extensionQuotient)) : + Subgroup (Abelianization E.extensionQuotient) := by + letI : Finite (K.toSubgroup ⧸ + extensionSubgroup K E.field E.below) := E.finite + exact AddSubgroup.toSubgroup' + ((normQuotientSubgroup A E H).map rE.toAddMonoidHom) + +omit [IsTopologicalGroup G] in +/-- Membership in the transported subgroup is literal membership of the +corresponding reciprocity class in the image of `H / N_E`. -/ +theorem mem_reciprocityAbelianizedSubgroup_iff + (A : Rep ℤ G) (E : FiniteGaloisSubextension K) + (H : AddSubgroup (ambientFixedAddSubgroup A K)) + (rE : FiniteNormQuotient A K E.field E.below ≃+ + Additive (Abelianization E.extensionQuotient)) + (q : Abelianization E.extensionQuotient) : + q ∈ reciprocityAbelianizedSubgroup A E H rE ↔ + ∃ z ∈ normQuotientSubgroup A E H, + rE z = Additive.ofMul q := by + let : Finite (K.toSubgroup ⧸ + extensionSubgroup K E.field E.below) := E.finite + rfl + +/-- The representative-level abelianized class map obtained by first +passing to `A_K / N_E` and then applying the specified equivalence. -/ +def reciprocityAbelianizedClassHom + (A : Rep ℤ G) (E : FiniteGaloisSubextension K) + (rE : FiniteNormQuotient A K E.field E.below ≃+ + Additive (Abelianization E.extensionQuotient)) : + ambientFixedAddSubgroup A K →+ + Additive (Abelianization E.extensionQuotient) := + rE.toAddMonoidHom.comp (finiteNormClassHom A K E.field E.below) + +omit [IsTopologicalGroup G] in +/-- If `N_E ⊆ H`, the transported subgroup has exactly `H` as its +inverse image under the abelianized class map. This is the precise +full-preimage statement used before taking the fixed field in the finite classification argument. -/ +theorem reciprocityClass_mem_abelianizedSubgroup_iff + (A : Rep ℤ G) (E : FiniteGaloisSubextension K) + (H : AddSubgroup (ambientFixedAddSubgroup A K)) + (hEH : ClassFormation.FiniteGaloisSubextension.normSubgroup A E ≤ H) + (rE : FiniteNormQuotient A K E.field E.below ≃+ + Additive (Abelianization E.extensionQuotient)) + (a : ambientFixedAddSubgroup A K) : + Additive.toMul (reciprocityAbelianizedClassHom A E rE a) ∈ + reciprocityAbelianizedSubgroup A E H rE ↔ + a ∈ H := by + change rE (finiteNormClass A K E.field E.below a) ∈ + (normQuotientSubgroup A E H).map rE.toAddMonoidHom ↔ + a ∈ H + constructor + · rintro ⟨z, hz, hza⟩ + have hzEq : z = finiteNormClass A K E.field E.below a := + rE.injective hza + rw [hzEq] at hz + exact (finiteNormClass_mem_normQuotientSubgroup_iff A E H hEH a).1 hz + · intro ha + refine ⟨finiteNormClass A K E.field E.below a, ?_, rfl⟩ + exact (finiteNormClass_mem_normQuotientSubgroup_iff A E H hEH a).2 ha + +end FiniteGaloisSubextension + +/-! ## From a subgroup above the commutator to an abelian field -/ + +/-- Pull a subgroup of an abelianization back to the original finite +Galois group. -/ +def abelianizationPreimageSubgroup + {Q : Type*} [Group Q] (T : Subgroup (Abelianization Q)) : + Subgroup Q := + T.comap (Abelianization.of : Q →* Abelianization Q) + +/-- Every such pullback contains the commutator subgroup. -/ +theorem commutator_le_abelianizationPreimageSubgroup + {Q : Type*} [Group Q] (T : Subgroup (Abelianization Q)) : + commutator Q ≤ abelianizationPreimageSubgroup T := by + intro q hq + change Abelianization.of q ∈ T + have hk : q ∈ + MonoidHom.ker (Abelianization.of : Q →* Abelianization Q) := + Abelianization.commutator_subset_ker + (Abelianization.of : Q →* Abelianization Q) hq + rw [MonoidHom.mem_ker.mp hk] + exact T.one_mem + +namespace FiniteGaloisSubextension + +variable {K : ClosedSubgroup G} + +local instance candidate_extensionQuotient_finite + {G : Type*} [Group G] [TopologicalSpace G] + {K : ClosedSubgroup G} (E : FiniteGaloisSubextension K) : + Finite (K.toSubgroup ⧸ extensionSubgroup K E.field E.below) := + E.finite + +/-- The actual finite abelian intermediate extension cut out by a subgroup +`S ≤ G(E/K)` containing the commutator. -/ +def intermediateFiniteAbelianOfCommutatorLe + {G : Type*} [Group G] [TopologicalSpace G] [IsTopologicalGroup G] + {K : ClosedSubgroup G} + (E : FiniteGaloisSubextension K) + (S : Subgroup E.extensionQuotient) + (hS : commutator E.extensionQuotient ≤ S) : + FiniteAbelianSubextension K := by + let hnormal : S.Normal := + Subgroup.Normal.of_commutator_le E.extensionQuotient hS + letI : S.Normal := hnormal + let M := E.intermediateFiniteGalois S hnormal + refine + { toFiniteGaloisExtension := M + commutative := ?_ } + let e := E.upperQuotientEquiv S + let : IsMulCommutative (E.extensionQuotient ⧸ S) := + (Subgroup.Normal.quotient_commutative_iff_commutator_le).2 hS + refine ⟨⟨?_⟩⟩ + intro x y + obtain ⟨x', rfl⟩ := e.surjective x + obtain ⟨y', rfl⟩ := e.surjective y + calc + e x' * e y' = e (x' * y') := (map_mul e x' y').symm + _ = e (y' * x') := congrArg e + (Std.Commutative.comm + (op := fun a b : E.extensionQuotient ⧸ S => a * b) x' y') + _ = e y' * e x' := map_mul e y' x' + +/-- The field underlying the preceding package is the literal fixed field +of `S`. -/ +@[simp] +theorem intermediateFiniteAbelianOfCommutatorLe_field + {G : Type*} [Group G] [TopologicalSpace G] [IsTopologicalGroup G] + {K : ClosedSubgroup G} + (E : FiniteGaloisSubextension K) + (S : Subgroup E.extensionQuotient) + (hS : commutator E.extensionQuotient ≤ S) : + (intermediateFiniteAbelianOfCommutatorLe E S hS).field = + E.intermediateField S := + rfl + +/-- The subgroup obtained from `H / N_E` on the abelianization side, +pulled back to the actual finite Galois quotient. -/ +def reciprocityPreimageSubgroup + (A : Rep ℤ G) (E : FiniteGaloisSubextension K) + (H : AddSubgroup (ambientFixedAddSubgroup A K)) + (rE : FiniteNormQuotient A K E.field E.below ≃+ + Additive (Abelianization E.extensionQuotient)) : + Subgroup E.extensionQuotient := + abelianizationPreimageSubgroup + (reciprocityAbelianizedSubgroup A E H rE) + +omit [IsTopologicalGroup G] in +/-- The actual subgroup used to define the intermediate field contains +the commutator, independently of any kernel assertion for `rE`. -/ +theorem commutator_le_reciprocityPreimageSubgroup + (A : Rep ℤ G) (E : FiniteGaloisSubextension K) + (H : AddSubgroup (ambientFixedAddSubgroup A K)) + (rE : FiniteNormQuotient A K E.field E.below ≃+ + Additive (Abelianization E.extensionQuotient)) : + commutator E.extensionQuotient ≤ + reciprocityPreimageSubgroup A E H rE := + commutator_le_abelianizationPreimageSubgroup _ + +omit [IsTopologicalGroup G] in +/-- The pulled-back subgroup has exactly `H` as the inverse image of the +representative-level reciprocity class. This is the group-side form of the +full-preimage assertion used in the finite-classification surjectivity proof. -/ +theorem reciprocityClass_mem_preimageSubgroup_iff + (A : Rep ℤ G) (E : FiniteGaloisSubextension K) + (H : AddSubgroup (ambientFixedAddSubgroup A K)) + (hEH : ClassFormation.FiniteGaloisSubextension.normSubgroup A E ≤ H) + (rE : FiniteNormQuotient A K E.field E.below ≃+ + Additive (Abelianization E.extensionQuotient)) + (a : ambientFixedAddSubgroup A K) : + Quotient.out (Additive.toMul + (reciprocityAbelianizedClassHom A E rE a)) ∈ + reciprocityPreimageSubgroup A E H rE ↔ + a ∈ H := by + change Abelianization.of (Quotient.out (Additive.toMul + (reciprocityAbelianizedClassHom A E rE a))) ∈ + reciprocityAbelianizedSubgroup A E H rE ↔ a ∈ H + rw [show Abelianization.of (Quotient.out (Additive.toMul + (reciprocityAbelianizedClassHom A E rE a))) = + Additive.toMul (reciprocityAbelianizedClassHom A E rE a) by + exact Quotient.out_eq' _] + exact reciprocityClass_mem_abelianizedSubgroup_iff A E H hEH rE a + +omit [IsTopologicalGroup G] in +/-- Equivalently, the representative of the transported reciprocity class +restricts trivially to the quotient cut out by the candidate precisely for +the elements of `H`. -/ +theorem candidateQuotient_eq_one_iff + (A : Rep ℤ G) (E : FiniteGaloisSubextension K) + (H : AddSubgroup (ambientFixedAddSubgroup A K)) + (hEH : ClassFormation.FiniteGaloisSubextension.normSubgroup A E ≤ H) + (rE : FiniteNormQuotient A K E.field E.below ≃+ + Additive (Abelianization E.extensionQuotient)) + (a : ambientFixedAddSubgroup A K) : + let S := reciprocityPreimageSubgroup A E H rE + letI : S.Normal := Subgroup.Normal.of_commutator_le E.extensionQuotient + (commutator_le_reciprocityPreimageSubgroup A E H rE) + QuotientGroup.mk' S + (Quotient.out (Additive.toMul + (reciprocityAbelianizedClassHom A E rE a))) = 1 ↔ + a ∈ H := by + dsimp only + let : (reciprocityPreimageSubgroup A E H rE).Normal := + Subgroup.Normal.of_commutator_le E.extensionQuotient + (commutator_le_reciprocityPreimageSubgroup A E H rE) + constructor + · intro h + apply (reciprocityClass_mem_preimageSubgroup_iff + A E H hEH rE a).1 + exact (QuotientGroup.eq_one_iff _).1 h + · intro ha + apply (QuotientGroup.eq_one_iff _).2 + exact (reciprocityClass_mem_preimageSubgroup_iff + A E H hEH rE a).2 ha + +/-- The finite abelian intermediate extension determined by the subgroup +transported from `H / N_E`. This is the field candidate in the +surjectivity proof of the finite abelian classification theorem. No claim that its norm + subgroup equals +`H` is made before finite reciprocity is available. -/ +def classFieldCandidate + (A : Rep ℤ G) (E : FiniteGaloisSubextension K) + (H : AddSubgroup (ambientFixedAddSubgroup A K)) + (rE : FiniteNormQuotient A K E.field E.below ≃+ + Additive (Abelianization E.extensionQuotient)) : + FiniteAbelianSubextension K := + intermediateFiniteAbelianOfCommutatorLe E + (reciprocityPreimageSubgroup A E H rE) + (commutator_le_reciprocityPreimageSubgroup A E H rE) + +/-- The candidate is cut out by the explicit pulled-back subgroup, not by +an opaque correspondence object. -/ +@[simp] +theorem classFieldCandidate_field + (A : Rep ℤ G) (E : FiniteGaloisSubextension K) + (H : AddSubgroup (ambientFixedAddSubgroup A K)) + (rE : FiniteNormQuotient A K E.field E.below ≃+ + Additive (Abelianization E.extensionQuotient)) : + (classFieldCandidate A E H rE).field = + E.intermediateField + (reciprocityPreimageSubgroup A E H rE) := + by + exact intermediateFiniteAbelianOfCommutatorLe_field E + (reciprocityPreimageSubgroup A E H rE) + (commutator_le_reciprocityPreimageSubgroup A E H rE) + +end FiniteGaloisSubextension + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction.lean new file mode 100644 index 0000000000..808f15c8c0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction.lean @@ -0,0 +1,49 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CanonicalUnramifiedNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ChosenDegreeOneFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CoreFrobeniusNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.DoubleCosetOrbitGeometry +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteFieldUnitMaps +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateFieldCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitCorrection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusClosureCommutation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusPowerFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusQuotientDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusSemigroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainFiniteReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransfer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobeniusGeometry +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.NormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.PrimeChoice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityDefinition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityIndependence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.RelativeNormDoubleCoset +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferOrbitClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnitCohomologyAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.Universal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UniversalNormDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnramifiedNormQuotient + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/All.lean new file mode 100644 index 0000000000..f3bec44ac9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/All.lean @@ -0,0 +1,52 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CanonicalUnramifiedNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ChosenDegreeOneFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CoreFrobeniusNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.DoubleCosetOrbitGeometry +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteFieldUnitMaps +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateFieldCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitCorrection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusClosureCommutation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusPowerFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusQuotientDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusSemigroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainFiniteReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransfer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobeniusGeometry +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.NormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.PrimeChoice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityDefinition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityIndependence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.RelativeNormDoubleCoset +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferOrbitClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnitCohomologyAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.Universal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UniversalNormDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnramifiedNormQuotient +/-! +# Abstract reciprocity construction + +Aggregate for norm quotients, Frobenius descent, prime independence, transfer naturality, and the +canonical abstract reciprocity map. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CanonicalUnramifiedNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CanonicalUnramifiedNormQuotient.lean new file mode 100644 index 0000000000..90d5e76c59 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CanonicalUnramifiedNormQuotient.lean @@ -0,0 +1,284 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnramifiedNormQuotient +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +/-! # Canonical Unramified Norm Quotient -/ + +@[expose] public section +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +/-! +# The abstract reciprocity construction: the canonical unramified valuation quotient + +the valuation-quotient axiom supplies the order of `Z / nZ`. The construction then uses the +canonical reduction inherited from `Z ⊆ ℤ̂`, rather than an arbitrary +isomorphism with `ℤ / nℤ`. This file constructs that canonical map and +proves directly that it induces the unramified norm-quotient isomorphism +used in the unramified norm-quotient equivalence. +-/ + +noncomputable +section + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] +variable {D : DegreeData G} {A : Rep ℤ G} + +namespace ValuationData + +/-- Reduction modulo `n` restricted to the actual value subgroup +`Z ⊆ ℤ̂`. -/ +def canonicalValueReduction + (v : ValuationData D A) (n : ℕ) (hn : 0 < n) : + v.valueGroup →+ ZMod n := + v.valueModulo n hn + +/-- The canonical value reduction sends the unit element to zero. -/ +@[simp] +theorem canonicalValueReduction_one + (v : ValuationData D A) (n : ℕ) (hn : 0 < n) : + v.canonicalValueReduction n hn v.oneValue = 1 := by + change zHatReduction n hn (1 : ZHat) = 1 + rfl + +/-- The canonical value reduction onto the residue-degree quotient is surjective. -/ +theorem canonicalValueReduction_surjective + (v : ValuationData D A) (n : ℕ) (hn : 0 < n) : + Function.Surjective (v.canonicalValueReduction n hn) := + v.valueModulo_surjective n hn + +/-- Canonical reduction descended to `Z / nZ`. -/ +def canonicalValueQuotientHom + (v : ValuationData D A) (n : ℕ) (hn : 0 < n) : + (v.valueGroup ⧸ nsmulWithin v.valueGroup n) →+ ZMod n := + v.canonicalQuotientMap n hn + +/-- The quotient homomorphism evaluates on a coset through canonical value reduction. -/ +theorem canonicalValueQuotientHom_mk + (v : ValuationData D A) (n : ℕ) (hn : 0 < n) + (z : v.valueGroup) : + v.canonicalValueQuotientHom n hn + (QuotientAddGroup.mk' (nsmulWithin v.valueGroup n) z) = + v.canonicalValueReduction n hn z := by + rfl + +/-- The induced canonical value map on the quotient is surjective. -/ +theorem canonicalValueQuotientHom_surjective + (v : ValuationData D A) (n : ℕ) (hn : 0 < n) : + Function.Surjective (v.canonicalValueQuotientHom n hn) := + (v.canonical_value_quotient_bijective n hn).2 + +/-- The canonical isomorphism `Z / nZ ≃ ℤ / nℤ` from the valuation-quotient axiom. -/ +def canonicalValueQuotientEquiv + (v : ValuationData D A) (n : ℕ) (hn : 0 < n) : + (v.valueGroup ⧸ nsmulWithin v.valueGroup n) ≃+ ZMod n := + v.cyclicValueQuotients n hn + +/-- Canonical valuation modulo `[L : K]` on `A_K`. -/ +def canonicalUnramifiedValuationHom + (v : ValuationData D A) (E : FiniteAbstractFieldExtension G) : + ambientFixedAddSubgroup A E.base.field →+ ZMod (E.degree : ℕ) := + (v.canonicalValueReduction (E.degree : ℕ) E.degree.property).comp + (v.valuationAt E.base) + +private theorem finiteNormSubgroup_le_canonicalUnramifiedValuationHom_ker + (v : ValuationData D A) (E : FiniteAbstractFieldExtension G) + (hUnramified : E.IsUnramified D) : + finiteNormSubgroup A E.base.field E.field.field E.below ≤ + (v.canonicalUnramifiedValuationHom E).ker := by + rintro _ ⟨a, rfl⟩ + let n := (E.degree : ℕ) + let hn : 0 < n := E.degree.property + have htower := v.normalizedValuation_tower E a + have hresidueDegree : + ((E.toFiniteResidueAbstractExtension D).residueDegree : ℕ) = + (E.degree : ℕ) := by + exact E.residueDegree_eq_degree_of_isUnramified D hUnramified + dsimp only at htower + rw [hresidueDegree] at htower + have htower' : + n • ((v.valuationAt E.field a : v.valueGroup) : ZHat) = + ((v.valuationAt E.base + (relativeNorm A E.base.field E.field.field E.below a) : + v.valueGroup) : ZHat) := by + simpa [n] using htower + change zHatReduction n hn + (v.valuationAt E.base + (relativeNorm A E.base.field E.field.field E.below a) : ZHat) = 0 + rw [← htower', map_nsmul] + simp [n] + +/-- The canonical valuation induced on the finite unramified norm +quotient. -/ +def canonicalUnramifiedNormQuotientValuation + (v : ValuationData D A) (E : FiniteAbstractFieldExtension G) + (hUnramified : E.IsUnramified D) : + FiniteNormQuotient A E.base.field E.field.field E.below →+ + ZMod (E.degree : ℕ) := + finiteNormQuotientLift A E.base.field E.field.field E.below + (v.canonicalUnramifiedValuationHom E) + (by exact v.finiteNormSubgroup_le_canonicalUnramifiedValuationHom_ker E hUnramified) + +/-- Valuation sends a finite norm class to its canonical unramified quotient value. -/ +@[simp] +theorem canonicalUnramifiedNormQuotientValuation_finiteNormClass + (v : ValuationData D A) (E : FiniteAbstractFieldExtension G) + (hUnramified : E.IsUnramified D) + (a : ambientFixedAddSubgroup A E.base.field) : + v.canonicalUnramifiedNormQuotientValuation E hUnramified + (finiteNormClass A E.base.field E.field.field E.below a) = + v.canonicalUnramifiedValuationHom E a := by + rfl + +/-- The valuation map from the unramified norm quotient is surjective. -/ +theorem canonicalUnramifiedNormQuotientValuation_surjective + (v : ValuationData D A) (E : FiniteAbstractFieldExtension G) + (hUnramified : E.IsUnramified D) : + Function.Surjective + (v.canonicalUnramifiedNormQuotientValuation E hUnramified) := by + intro z + let n := (E.degree : ℕ) + let hn : 0 < n := E.degree.property + obtain ⟨w, hw⟩ := v.canonicalValueReduction_surjective n hn z + obtain ⟨a, ha⟩ := v.normalizedValuation_surjective E.base w + refine ⟨finiteNormClass A E.base.field E.field.field E.below a, ?_⟩ + rw [v.canonicalUnramifiedNormQuotientValuation_finiteNormClass] + change v.canonicalValueReduction n hn (v.valuationAt E.base a) = z + rw [ha] + exact hw + +/-- The valuation map separates classes in the unramified norm quotient. -/ +theorem canonicalUnramifiedNormQuotientValuation_injective + (v : ValuationData D A) (hAxiom : SatisfiesUnramifiedUnitCohomology D v) + (E : FiniteAbstractFieldExtension G) + (hnormal : (extensionSubgroup + E.base.field E.field.field E.below).Normal) + (hUnramified : E.IsUnramified D) : + Function.Injective + (v.canonicalUnramifiedNormQuotientValuation E hUnramified) := by + let := hnormal + let n := (E.degree : ℕ) + let hn : 0 < n := E.degree.property + have hkernel : ∀ q : FiniteNormQuotient A E.base.field + E.field.field E.below, + v.canonicalUnramifiedNormQuotientValuation E hUnramified q = 0 → + q = 0 := by + intro q + refine FiniteNormQuotient.induction_on A E.base.field E.field.field + E.below q ?_ + intro a ha + change v.canonicalValueReduction n hn (v.valuationAt E.base a) = 0 at ha + have hqValue : + (QuotientAddGroup.mk' (nsmulWithin v.valueGroup n) + (v.valuationAt E.base a)) = 0 := by + apply (v.canonicalValueQuotientEquiv n hn).injective + change v.canonicalValueQuotientHom n hn + (QuotientAddGroup.mk' (nsmulWithin v.valueGroup n) + (v.valuationAt E.base a)) = + v.canonicalValueQuotientHom n hn 0 + rw [v.canonicalValueQuotientHom_mk, ha, map_zero] + obtain ⟨z, haz⟩ := + (QuotientAddGroup.eq_zero_iff (v.valuationAt E.base a)).1 hqValue + have haz' : v.valuationAt E.base a = n • z := haz.symm + obtain ⟨b, hb⟩ := v.normalizedValuation_surjective E.field z + let normb : ambientFixedAddSubgroup A E.base.field := + relativeNorm A E.base.field E.field.field E.below b + have htower := v.normalizedValuation_tower E b + have hresidueDegree : + ((E.toFiniteResidueAbstractExtension D).residueDegree : ℕ) = + (E.degree : ℕ) := by + exact E.residueDegree_eq_degree_of_isUnramified D hUnramified + dsimp only at htower + rw [hresidueDegree] at htower + have hnormb : v.valuationAt E.base normb = n • z := by + apply Subtype.ext + calc + ((v.valuationAt E.base normb : v.valueGroup) : ZHat) = + n • ((v.valuationAt E.field b : v.valueGroup) : ZHat) := htower.symm + _ = n • ((z : v.valueGroup) : ZHat) := by rw [hb] + _ = (((n • z : v.valueGroup)) : ZHat) := rfl + let u : v.unitAddSubgroup E.base := + ⟨a - normb, by + rw [v.mem_unitAddSubgroup_iff, map_sub, haz', hnormb, sub_self]⟩ + let KR := E.base.toFiniteResidueAbstractField D + let hnormalKR : + (extensionSubgroup KR.field E.field.field E.below).Normal := by + change (extensionSubgroup E.base.field E.field.field E.below).Normal + exact hnormal + let hfiniteKR : Finite + (KR.field.toSubgroup ⧸ + extensionSubgroup KR.field E.field.field E.below) := by + change Finite (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) + exact E.finiteQuotient + obtain ⟨g, hg⟩ := + D.exists_quotient_generator_of_unramified + KR E.field.field E.below hUnramified + let : Fintype (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) := + Fintype.ofFinite _ + let Euc : FiniteUnramifiedCyclicExtension D E.base := + { field := E.field.field + below := E.below + normal := hnormal + finite := E.finiteQuotient + generator := g + generates := hg + unramified := by + change E.IsUnramified D + exact hUnramified } + have hzero : + CategoryTheory.Limits.IsZero + (tateCohomology (Euc.unitRepresentation v) 0) ∧ + CategoryTheory.Limits.IsZero + (tateCohomology (Euc.unitRepresentation v) (-1)) := + hAxiom E.base Euc + obtain ⟨ε, hε⟩ := + v.exists_unit_relativeNorm_eq_of_tateHZero_isZero + Euc.toFiniteAbstractFieldExtension Euc.normal + Euc.toFiniteAbstractFieldExtension_isUnramified + g hg hzero.1 u + change v.unitAddSubgroup E.field at ε + change relativeNorm A E.base.field E.field.field E.below ε.1 = u.1 at hε + apply (finiteNormClass_eq_zero_iff A E.base.field E.field.field + E.below a).2 + refine ⟨b + ε.1, ?_⟩ + rw [map_add, hε] + change normb + (a - normb) = a + abel + intro x y hxy + apply sub_eq_zero.mp + apply hkernel + rw [map_sub, hxy, sub_self] + +/-- Canonical form of the valuation isomorphism in the unramified norm-quotient equivalence. -/ +def canonicalUnramifiedNormQuotientEquiv + (v : ValuationData D A) (hAxiom : SatisfiesUnramifiedUnitCohomology D v) + (E : FiniteAbstractFieldExtension G) + (hnormal : (extensionSubgroup + E.base.field E.field.field E.below).Normal) + (hUnramified : E.IsUnramified D) : + FiniteNormQuotient A E.base.field E.field.field E.below ≃+ + ZMod (E.degree : ℕ) := + AddEquiv.ofBijective + (v.canonicalUnramifiedNormQuotientValuation E hUnramified) + ⟨v.canonicalUnramifiedNormQuotientValuation_injective + hAxiom E hnormal hUnramified, + v.canonicalUnramifiedNormQuotientValuation_surjective + E hUnramified⟩ + +end ValuationData + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ChosenDegreeOneFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ChosenDegreeOneFrobenius.lean new file mode 100644 index 0000000000..33a91877b0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ChosenDegreeOneFrobenius.lean @@ -0,0 +1,84 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.Universal + +/-! # Chosen Degree One Frobenius -/ + +@[expose] public section +universe u + +namespace ClassFormation + +open CyclicCohomology + +/-! +# The chosen degree-one Frobenius element + +Surjectivity of the normalized degree supplies a Frobenius-semigroup element +of exponent one. The chosen object and its specification are kept together +here so the multiplicativity proof can consume a named choice boundary. +-/ + +noncomputable +section + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- A chosen degree-one element of `G(\widetilde L/K)`, packaged as an +element of the Frobenius semigroup. -/ +noncomputable def chosenDegreeOneFrobeniusElement (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] : + D.FrobeniusElements K L hLK := by + let hsurj := D.extensionNormalizedDegreeContinuous_surjective K L hLK + (Multiplicative.ofAdd (1 : ZHat)) + refine ⟨Classical.choose hsurj, 1, Nat.one_pos, ?_⟩ + rw [pow_one, ← D.extensionNormalizedDegreeContinuous_apply] + exact Classical.choose_spec hsurj + +/-- +Establishes the identity `D.frobeniusExponent K L hLK (D.chosenDegreeOneFrobeniusElement K L hLK) += 1`. +-/ +@[simp] +theorem frobeniusExponent_chosenDegreeOneFrobeniusElement (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] : + D.frobeniusExponent K L hLK + (D.chosenDegreeOneFrobeniusElement K L hLK) = 1 := by + apply proCIntegerOne_pow_nat_injective + calc + (Multiplicative.ofAdd (1 : ZHat)) ^ + D.frobeniusExponent K L hLK + (D.chosenDegreeOneFrobeniusElement K L hLK) = + D.extensionNormalizedDegree K L hLK + (D.chosenDegreeOneFrobeniusElement K L hLK).1 := + (D.extensionNormalizedDegree_frobenius_eq_pow K L hLK + (D.chosenDegreeOneFrobeniusElement K L hLK)).symm + _ = Multiplicative.ofAdd (1 : ZHat) := by + rw [← D.extensionNormalizedDegreeContinuous_apply] + change D.extensionNormalizedDegreeContinuous K L hLK + (Classical.choose + (D.extensionNormalizedDegreeContinuous_surjective K L hLK + (Multiplicative.ofAdd (1 : ZHat)))) = + Multiplicative.ofAdd (1 : ZHat) + exact Classical.choose_spec + (D.extensionNormalizedDegreeContinuous_surjective K L hLK + (Multiplicative.ofAdd (1 : ZHat))) + _ = (Multiplicative.ofAdd (1 : ZHat)) ^ (1 : ℕ) := by simp + +end DegreeData + +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CoreFrobeniusNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CoreFrobeniusNorm.lean new file mode 100644 index 0000000000..8a9cd0cfa2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CoreFrobeniusNorm.lean @@ -0,0 +1,1292 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityDefinition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormConjugation + +/-! # Core Frobenius Norm -/ + +@[expose] public section +universe u + +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +/-! +# The abstract reciprocity construction, the Frobenius norm-identity lemma + +The operator `φ_n` is written additively as the sum of the first +`n` powers of the actual quotient action. This file compares that sum with +the relative norm through the Frobenius fixed field `Σ` constructed in +the Frobenius fixed-field theorem. +-/ + +noncomputable +section + +open scoped BigOperators + +section inertiaQuotients + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- The inclusion of inertia cosets into the finite extension cosets. -/ +private noncomputable def inertiaCosetToExtensionCoset (D : DegreeData G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) : + ((D.maximalUnramifiedField K).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) → + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + Quotient.map' + (fun x : (D.maximalUnramifiedField K).toSubgroup => + (⟨x.1, x.2.1⟩ : K.toSubgroup)) + (by + intro x y hxy + rw [QuotientGroup.leftRel_apply] at hxy ⊢ + exact hxy.1) + +private theorem inertiaCosetToExtensionCoset_injective (D : DegreeData G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) : + Function.Injective (D.inertiaCosetToExtensionCoset K L hLK) := by + intro x y hxy + refine Quotient.inductionOn₂' x y ?_ hxy + intro a b hab + apply Quotient.sound' + rw [QuotientGroup.leftRel_apply] + have habE : + (⟨a.1, a.2.1⟩ : K.toSubgroup)⁻¹ * ⟨b.1, b.2.1⟩ ∈ + extensionSubgroup K L hLK := by + exact QuotientGroup.leftRel_apply.mp (Quotient.exact' hab) + refine ⟨habE, ?_⟩ + change D.degree (a.1⁻¹ * b.1) = 1 + rw [map_mul, map_inv] + change (D.degree a.1)⁻¹ * D.degree b.1 = 1 + rw [show D.degree a.1 = 1 from a.2.2, + show D.degree b.1 = 1 from b.2.2] + simp + +/-- Finiteness of `\widetilde L | \widetilde K`, derived from the finite +Galois extension `L | K`; no separate finiteness assumption is introduced. -/ +theorem maximalUnramifiedExtension_finite (D : DegreeData G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + Finite + ((D.maximalUnramifiedField K).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + Finite.of_injective (D.inertiaCosetToExtensionCoset K L hLK) + (D.inertiaCosetToExtensionCoset_injective K L hLK) + +/-- The actual quotient `G(\widetilde L/\widetilde K)` is the kernel of +`d_K` inside `G(\widetilde L/K)`. -/ +noncomputable def inertiaCosetToDegreeKernel (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] : + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) → + (D.extensionNormalizedDegreeContinuous K L hLK).toMonoidHom.ker := + fun r => Quotient.liftOn' r + (fun x : (D.maximalUnramifiedField K.field).toSubgroup => by + let k : K.field.toSubgroup := ⟨x.1, x.2.1⟩ + refine ⟨QuotientGroup.mk k, ?_⟩ + change D.normalizedDegree K k = 1 + change k ∈ (D.normalizedDegree K).toMonoidHom.ker + rw [D.normalizedDegree_ker K] + exact x.2.2) + (by + intro x y hxy + apply Subtype.ext + apply QuotientGroup.eq.mpr + rw [← D.extensionSubgroup_maximalUnramifiedField K.field L hLK] + rw [QuotientGroup.leftRel_apply] at hxy + exact hxy) + +private theorem inertiaCosetToDegreeKernel_bijective (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] : + Function.Bijective (D.inertiaCosetToDegreeKernel K L hLK) := by + constructor + · intro x y hxy + refine Quotient.inductionOn₂' x y ?_ hxy + intro a b hab + apply Quotient.sound' + rw [QuotientGroup.leftRel_apply] + have hq : QuotientGroup.mk (⟨a.1, a.2.1⟩ : K.field.toSubgroup) = + QuotientGroup.mk (⟨b.1, b.2.1⟩ : K.field.toSubgroup) := + congrArg Subtype.val hab + have hkN : + (⟨a.1, a.2.1⟩ : K.field.toSubgroup)⁻¹ * ⟨b.1, b.2.1⟩ ∈ + D.extensionInertiaWithin K.field L hLK := + QuotientGroup.eq.mp hq + refine ⟨hkN.1, ?_⟩ + change D.degree (a.1⁻¹ * b.1) = 1 + rw [map_mul, map_inv] + change (D.degree a.1)⁻¹ * D.degree b.1 = 1 + rw [show D.degree a.1 = 1 from a.2.2, + show D.degree b.1 = 1 from b.2.2] + simp + · intro z + obtain ⟨k, hk⟩ := QuotientGroup.mk'_surjective + (D.extensionInertiaWithin K.field L hLK) z.1 + have hkNorm : D.normalizedDegree K k = 1 := by + change D.extensionNormalizedDegreeContinuous K L hLK + ((QuotientGroup.mk' (D.extensionInertiaWithin K.field L hLK)) k) = 1 + exact (congrArg + (D.extensionNormalizedDegreeContinuous K L hLK) hk).trans z.2 + have hkI : k ∈ D.fieldInertiaWithin K.field := by + rw [← D.normalizedDegree_ker K] + exact hkNorm + let x : (D.maximalUnramifiedField K.field).toSubgroup := + ⟨k.1, ⟨k.2, hkI⟩⟩ + refine ⟨QuotientGroup.mk x, ?_⟩ + apply Subtype.ext + exact hk + +/-- Canonical actual-group identification used in the Frobenius norm-identity lemma. -/ +noncomputable def inertiaQuotientDegreeKernelEquiv (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] : + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) ≃ + (D.extensionNormalizedDegreeContinuous K L hLK).toMonoidHom.ker := + Equiv.ofBijective (D.inertiaCosetToDegreeKernel K L hLK) + (by exact D.inertiaCosetToDegreeKernel_bijective K L hLK) + +end DegreeData + +end inertiaQuotients + +section quotientActions + +/-! +Mathlib's `Rep ℤ G` requires the coefficient ring and acting group to share +a universe; `IntegralRepGroupType` names that shared boundary. +-/ +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- The actual action of `G(\widetilde L/K)` on `A_{\widetilde L}`. -/ +def frobeniusQuotientAction (D : DegreeData G) (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + (q : K.toSubgroup ⧸ D.extensionInertiaWithin K L hLK) + (a : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : + ambientFixedAddSubgroup A (D.maximalUnramifiedField L) := + Quotient.liftOn' q + (fun k : K.toSubgroup => + normalExtensionAction A K (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_le_of_le hLK) + (D.extensionSubgroup_maximalUnramifiedField_normal K L hLK) k a) + (by + intro x y hxy + rw [QuotientGroup.leftRel_apply] at hxy + rw [← D.extensionSubgroup_maximalUnramifiedField K L hLK] at hxy + let l : (D.maximalUnramifiedField L).toSubgroup := + ⟨x.1⁻¹ * y.1, hxy⟩ + have hy : y = x * Subgroup.inclusion + (D.maximalUnramifiedField_le_of_le hLK) l := by + apply Subtype.ext + simp [l] + apply Subtype.ext + change A.ρ x.1 a.1 = A.ρ y.1 a.1 + rw [hy] + change A.ρ x.1 a.1 = A.ρ (x.1 * l.1) a.1 + rw [map_mul] + change A.ρ x.1 a.1 = A.ρ x.1 (A.ρ l.1 a.1) + rw [a.2 l]) + +/-- +Establishes the identity `D.frobeniusQuotientAction A K L hLK (QuotientGroup.mk k) a = +normalExtensionAction A K (D.maximalUnramifiedField L) (D.maximalUnramifiedField_le_of_le hLK) +(D.extensionSubgroup_maximalUnramifiedField_normal K L hLK) k a`. +-/ +@[simp] +theorem frobeniusQuotientAction_mk (D : DegreeData G) (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + (k : K.toSubgroup) + (a : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : + D.frobeniusQuotientAction A K L hLK (QuotientGroup.mk k) a = + normalExtensionAction A K (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_le_of_le hLK) + (D.extensionSubgroup_maximalUnramifiedField_normal K L hLK) k a := + rfl + +/-- Conjugation by an element of `G_K` preserves the inertia group `I_K`. +The inverse convention is chosen so that the resulting coset permutation +rewrites `τ·φ` as `φ·(φ⁻¹τφ)`. -/ +private def inertiaConjugationEquiv (D : DegreeData G) (K : ClosedSubgroup G) + (k : K.toSubgroup) : + (D.maximalUnramifiedField K).toSubgroup ≃ + (D.maximalUnramifiedField K).toSubgroup where + toFun x := ⟨k.1⁻¹ * x.1 * k.1, ⟨by + exact K.toSubgroup.mul_mem + (K.toSubgroup.mul_mem (K.toSubgroup.inv_mem k.2) x.2.1) k.2, by + change D.degree (k.1⁻¹ * x.1 * k.1) = 1 + have hx : D.degree x.1 = 1 := x.2.2 + rw [map_mul, map_mul, map_inv, hx] + simp⟩⟩ + invFun x := ⟨k.1 * x.1 * k.1⁻¹, ⟨by + exact K.toSubgroup.mul_mem + (K.toSubgroup.mul_mem k.2 x.2.1) (K.toSubgroup.inv_mem k.2), by + change D.degree (k.1 * x.1 * k.1⁻¹) = 1 + have hx : D.degree x.1 = 1 := x.2.2 + rw [map_mul, map_mul, map_inv, hx] + simp⟩⟩ + left_inv x := by + apply Subtype.ext + simp [mul_assoc] + right_inv x := by + apply Subtype.ext + simp [mul_assoc] + +/-- Conjugation by `G_K` also preserves `I_L` when `L/K` is Galois. -/ +private theorem conjugate_mem_maximalUnramifiedField (D : DegreeData G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + (k : K.toSubgroup) (l : (D.maximalUnramifiedField L).toSubgroup) : + k.1⁻¹ * l.1 * k.1 ∈ (D.maximalUnramifiedField L).toSubgroup := by + let lK : K.toSubgroup := ⟨l.1, hLK l.2.1⟩ + have hcK : k⁻¹ * lK * k ∈ extensionSubgroup K L hLK := by + simpa [lK] using hLnormal.conj_mem lK l.2.1 k⁻¹ + refine ⟨?_, ?_⟩ + · exact hcK + · change D.degree (k.1⁻¹ * l.1 * k.1) = 1 + have hlDegree : D.degree l.1 = 1 := l.2.2 + rw [map_mul, map_mul, map_inv, hlDegree] + simp + +/-- The coset permutation `τ ↦ φ⁻¹τφ` of +`G(\widetilde L/\widetilde K)`. -/ +private noncomputable def inertiaConjugationCosetEquiv (D : DegreeData G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + (k : K.toSubgroup) : + ((D.maximalUnramifiedField K).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) ≃ + ((D.maximalUnramifiedField K).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + Quotient.congr (D.inertiaConjugationEquiv K k) (by + intro x y + rw [QuotientGroup.leftRel_apply, QuotientGroup.leftRel_apply] + constructor + · intro hxy + let l : (D.maximalUnramifiedField L).toSubgroup := + ⟨x.1⁻¹ * y.1, hxy⟩ + have hl := D.conjugate_mem_maximalUnramifiedField K L hLK k l + change (k.1⁻¹ * x.1 * k.1)⁻¹ * (k.1⁻¹ * y.1 * k.1) ∈ + (D.maximalUnramifiedField L).toSubgroup + simpa [l, mul_assoc] using hl + · intro hxy + let l : (D.maximalUnramifiedField L).toSubgroup := + ⟨(k.1⁻¹ * x.1 * k.1)⁻¹ * (k.1⁻¹ * y.1 * k.1), hxy⟩ + have hl := D.conjugate_mem_maximalUnramifiedField K L hLK k⁻¹ l + change x.1⁻¹ * y.1 ∈ (D.maximalUnramifiedField L).toSubgroup + simpa [l, mul_assoc] using hl) + +@[simp] +private theorem inertiaConjugationCosetEquiv_mk (D : DegreeData G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + (k : K.toSubgroup) (x : (D.maximalUnramifiedField K).toSubgroup) : + D.inertiaConjugationCosetEquiv K L hLK k (QuotientGroup.mk x) = + QuotientGroup.mk (D.inertiaConjugationEquiv K k x) := + rfl + +private theorem relativeCosetAction_inertiaConjugation (D : DegreeData G) + (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + (k : K.toSubgroup) + (a : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) + (r : (D.maximalUnramifiedField K).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) : + relativeCosetAction A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + (normalExtensionAction A K (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_le_of_le hLK) + (D.extensionSubgroup_maximalUnramifiedField_normal K L hLK) k a) r = + A.ρ k.1 + (relativeCosetAction A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + a (D.inertiaConjugationCosetEquiv K L hLK k r)) := by + refine Quotient.inductionOn' r ?_ + intro x + rw [relativeCosetAction_mk, D.inertiaConjugationCosetEquiv_mk, + relativeCosetAction_mk, normalExtensionAction_coe] + calc + A.ρ x.1 (A.ρ k.1 a.1) = A.ρ (x.1 * k.1) a.1 := by + rw [map_mul] + rfl + _ = A.ρ (k.1 * (k.1⁻¹ * x.1 * k.1)) a.1 := by + simp [mul_assoc] + _ = A.ρ k.1 (A.ρ (k.1⁻¹ * x.1 * k.1) a.1) := by + rw [map_mul] + rfl + +/-- The norm `N_{\widetilde L/\widetilde K}` is equivariant for the +normalizing `G_K`-action. -/ +private theorem relativeNorm_normalizingAction (D : DegreeData G) (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + [Finite ((D.maximalUnramifiedField K).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK))] + (k : K.toSubgroup) + (a : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : + ((relativeNorm A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + (normalExtensionAction A K (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_le_of_le hLK) + (D.extensionSubgroup_maximalUnramifiedField_normal K L hLK) k a) : + ambientFixedAddSubgroup A (D.maximalUnramifiedField K)) : A.V) = + A.ρ k.1 + ((relativeNorm A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) a : + ambientFixedAddSubgroup A (D.maximalUnramifiedField K)) : A.V) := by + let R := (D.maximalUnramifiedField K).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + let e := D.inertiaConjugationCosetEquiv K L hLK k + let := Fintype.ofFinite R + simp only [relativeNorm_apply_coe, relativeNormValue] + calc + ∑ r : R, relativeCosetAction A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + (normalExtensionAction A K (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_le_of_le hLK) + (D.extensionSubgroup_maximalUnramifiedField_normal K L hLK) k a) r = + ∑ r : R, A.ρ k.1 + (relativeCosetAction A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + a (e r)) := by + apply Finset.sum_congr rfl + intro r _ + exact D.relativeCosetAction_inertiaConjugation A K L hLK k a r + _ = A.ρ k.1 + (∑ r : R, relativeCosetAction A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + a (e r)) := by + rw [map_sum] + _ = A.ρ k.1 + (∑ r : R, relativeCosetAction A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + a r) := by + rw [e.sum_comp] + +/-- +Relative norm commutes with the Frobenius quotient action after including the norm into the upper +fixed field. +-/ +theorem relativeNorm_frobeniusQuotientAction (D : DegreeData G) + (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + [Finite ((D.maximalUnramifiedField K).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK))] + (q : K.toSubgroup ⧸ D.extensionInertiaWithin K L hLK) + (a : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : + ((relativeNorm A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + (D.frobeniusQuotientAction A K L hLK q a) : + ambientFixedAddSubgroup A (D.maximalUnramifiedField K)) : A.V) = + ((D.frobeniusQuotientAction A K L hLK q + (fixedFieldInclusion A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + (relativeNorm A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + a)) : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : + A.V) := by + let k : K.toSubgroup := Quotient.out q + have hq : q = QuotientGroup.mk k := (Quotient.out_eq' q).symm + rw [hq] + exact D.relativeNorm_normalizingAction A K L hLK k a + +/-- Additive form of the `φ_n = 1 + φ + ⋯ + φ^{n-1}`. -/ +def frobeniusPowerSum (D : DegreeData G) (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + (φ : K.toSubgroup ⧸ D.extensionInertiaWithin K L hLK) + (n : ℕ) + (a : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : + ambientFixedAddSubgroup A (D.maximalUnramifiedField L) := + ∑ i : Fin n, D.frobeniusQuotientAction A K L hLK (φ ^ i.1) a + +/-- +Establishes the identity `((D.frobeniusPowerSum A K L hLK φ n a : ambientFixedAddSubgroup A +(D.maximalUnramifiedField L)) : A.V) = ∑ i : Fin n, (D.frobeniusQuotientAction A K L hLK (φ ^ i.1) +a : A.V)`. +-/ +@[simp] +theorem frobeniusPowerSum_coe (D : DegreeData G) (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + (φ : K.toSubgroup ⧸ D.extensionInertiaWithin K L hLK) + (n : ℕ) + (a : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : + ((D.frobeniusPowerSum A K L hLK φ n a : + ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : A.V) = + ∑ i : Fin n, + (D.frobeniusQuotientAction A K L hLK (φ ^ i.1) a : A.V) := + by + change (ambientFixedAddSubgroup A + (D.maximalUnramifiedField L)).subtype + (∑ i : Fin n, + D.frobeniusQuotientAction A K L hLK (φ ^ i.1) a) = _ + rw [map_sum] + apply Finset.sum_congr rfl + intro i _ + rfl + +end DegreeData + +end quotientActions + +section frobeniusCosetEquivalences + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- Quotient projection identifies the actual cosets `G_K/G_Σ` with +the cosets of `Γ` in `G(\widetilde L/K)`. -/ +noncomputable def frobeniusFixedCosetToClosureCoset + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + (K.field.toSubgroup ⧸ + extensionSubgroup K.field (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ)) → + ((K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) ⧸ + (D.frobeniusClosure K L hLK σ).toSubgroup) := + Quotient.map' + (QuotientGroup.mk' (D.extensionInertiaWithin K.field L hLK)) + (by + intro x y hxy + rw [QuotientGroup.leftRel_apply] at hxy ⊢ + rw [D.extensionSubgroup_frobeniusFixedField K L hLK σ] at hxy + exact hxy) + +private theorem frobeniusFixedCosetToClosureCoset_bijective + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + Function.Bijective + (D.frobeniusFixedCosetToClosureCoset K L hLK σ) := by + constructor + · intro x y hxy + refine Quotient.inductionOn₂' x y ?_ hxy + intro a b hab + apply Quotient.sound' + rw [QuotientGroup.leftRel_apply] + rw [D.extensionSubgroup_frobeniusFixedField K L hLK σ] + have hrel := QuotientGroup.leftRel_apply.mp (Quotient.exact' hab) + exact hrel + · intro z + refine Quotient.inductionOn' z ?_ + intro q + obtain ⟨k, hk⟩ := QuotientGroup.mk'_surjective + (D.extensionInertiaWithin K.field L hLK) q + refine ⟨QuotientGroup.mk k, ?_⟩ + change QuotientGroup.mk + ((QuotientGroup.mk' (D.extensionInertiaWithin K.field L hLK)) k) = + QuotientGroup.mk q + rw [hk] + +/-- Projection identifies fixed-field cosets with cosets of the Frobenius closure. -/ +noncomputable def frobeniusFixedCosetClosureEquiv + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + (K.field.toSubgroup ⧸ + extensionSubgroup K.field (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ)) ≃ + ((K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) ⧸ + (D.frobeniusClosure K L hLK σ).toSubgroup) := + Equiv.ofBijective + (D.frobeniusFixedCosetToClosureCoset K L hLK σ) + (by exact D.frobeniusFixedCosetToClosureCoset_bijective K L hLK σ) + +/-- The procyclic degree isomorphism says that `Γ` meets the inertia kernel trivially. -/ +private theorem frobeniusClosure_inf_degreeKernel (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + (D.frobeniusClosure K L hLK σ).toSubgroup ⊓ + (D.extensionNormalizedDegreeContinuous K L hLK).toMonoidHom.ker = + ⊥ := by + ext q + constructor + · intro hq + let a : D.frobeniusClosure K L hLK σ := ⟨q, hq.1⟩ + have hclosure : D.frobeniusClosureDegree K L hLK σ a = 1 := hq.2 + have hfixed : D.fixedFieldNormalizedDegree K L hLK σ a = 1 := by + apply Multiplicative.ext + apply zHatMulNat_injective + (D.frobeniusExponent_pos K L hLK σ) + change D.frobeniusExponent K L hLK σ • + (D.fixedFieldNormalizedDegree K L hLK σ a).toAdd = + D.frobeniusExponent K L hLK σ • (1 : ZHatMul).toAdd + rw [D.frobeniusExponent_nsmul_fixedFieldNormalizedDegree] + rw [hclosure] + simp + have ha : a = 1 := + D.frobeniusFixedField_normalizedDegree_injective K L hLK σ (by + simpa using hfixed) + exact congrArg Subtype.val ha + · intro hq + have : q = 1 := hq + subst q + exact ⟨Subgroup.one_mem _, Subgroup.one_mem _⟩ + +/-- Candidate enumeration of the cosets of `Γ`: an inertia element followed +by one of the first `n=d_K(σ)` powers of a degree-one Frobenius. -/ +def kernelPowerCosetMap (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ σ : D.FrobeniusElements K L hLK) : + (D.extensionNormalizedDegreeContinuous K L hLK).toMonoidHom.ker × + Fin (D.frobeniusExponent K L hLK σ) → + ((K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) ⧸ + (D.frobeniusClosure K L hLK σ).toSubgroup) := + fun p => QuotientGroup.mk (φ.1 ^ p.2.1 * p.1.1) + +private theorem kernelPowerCosetMap_injective (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ σ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) : + Function.Injective (D.kernelPowerCosetMap K L hLK φ σ) := by + rintro ⟨h, i⟩ ⟨h', j⟩ hij + let n := D.frobeniusExponent K L hLK σ + let dQ := D.extensionNormalizedDegreeContinuous K L hLK + have hn : 0 < n := D.frobeniusExponent_pos K L hLK σ + have hdφ : dQ φ.1 = + Multiplicative.ofAdd (1 : ZHat) := by + change D.extensionNormalizedDegree K L hLK φ.1 = _ + rw [D.extensionNormalizedDegree_frobenius_eq_pow K L hLK φ, hφ] + simp + have hrel : (φ.1 ^ i.1 * h.1)⁻¹ * (φ.1 ^ j.1 * h'.1) ∈ + (D.frobeniusClosure K L hLK σ).toSubgroup := + QuotientGroup.leftRel_apply.mp (Quotient.exact' hij) + let γ : D.frobeniusClosure K L hLK σ := + ⟨(φ.1 ^ i.1 * h.1)⁻¹ * (φ.1 ^ j.1 * h'.1), hrel⟩ + have hdegreeRange : + (D.frobeniusClosureDegree K L hLK σ γ).toAdd ∈ + (zHatMulNat n).toAddMonoidHom.range := by + have hmem : D.frobeniusClosureDegree K L hLK σ γ ∈ + (D.frobeniusClosureDegree K L hLK σ).toMonoidHom.range := + ⟨γ, rfl⟩ + rw [D.frobeniusClosureDegree_range K L hLK σ] at hmem + exact hmem + have hred : zHatReduction n hn + (D.frobeniusClosureDegree K L hLK σ γ).toAdd = 0 := by + have hker : + (D.frobeniusClosureDegree K L hLK σ γ).toAdd ∈ + (zHatReduction n hn).ker := by + rw [← zHatMulNat_range_eq_ker_reduction n hn] + exact hdegreeRange + exact hker + have hredOne : zHatReduction n hn (1 : ZHat) = 1 := rfl + have hmod : (j.1 : ZMod n) - (i.1 : ZMod n) = 0 := by + have hdh : dQ h.1 = 1 := h.2 + have hdh' : dQ h'.1 = 1 := h'.2 + have hdegMul : + dQ ((φ.1 ^ i.1 * h.1)⁻¹ * (φ.1 ^ j.1 * h'.1)) = + (Multiplicative.ofAdd (1 : ZHat) ^ i.1)⁻¹ * + Multiplicative.ofAdd (1 : ZHat) ^ j.1 := by + rw [map_mul, map_inv, map_mul, map_mul, map_pow, map_pow, + hdφ, hdh, hdh', mul_one, mul_one] + have hdegAdd := congrArg Multiplicative.toAdd hdegMul + change (D.frobeniusClosureDegree K L hLK σ γ).toAdd = + -(i.1 • (1 : ZHat)) + j.1 • (1 : ZHat) at hdegAdd + rw [hdegAdd] at hred + rw [map_add, map_neg, map_nsmul, map_nsmul, hredOne] at hred + simpa [sub_eq_add_neg, add_comm] using hred + have hijCast : (i.1 : ZMod n) = (j.1 : ZMod n) := by + exact (sub_eq_zero.mp hmod).symm + have hijVal : i.1 = j.1 := by + have hv := congrArg ZMod.val hijCast + simpa [ZMod.val_natCast_of_lt i.2, ZMod.val_natCast_of_lt j.2] using hv + have hijFin : i = j := Fin.ext hijVal + subst j + have hkernel : h.1⁻¹ * h'.1 ∈ dQ.toMonoidHom.ker := by + have hdh : dQ h.1 = 1 := h.2 + have hdh' : dQ h'.1 = 1 := h'.2 + change dQ (h.1⁻¹ * h'.1) = 1 + rw [map_mul, map_inv, hdh, hdh', inv_one, one_mul] + have hgamma : h.1⁻¹ * h'.1 ∈ + (D.frobeniusClosure K L hLK σ).toSubgroup := by + simpa [mul_assoc] using hrel + have hone : h.1⁻¹ * h'.1 = 1 := by + have hm : h.1⁻¹ * h'.1 ∈ (⊥ : Subgroup + (K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK)) := by + rw [← D.frobeniusClosure_inf_degreeKernel K L hLK σ] + exact ⟨hgamma, hkernel⟩ + exact hm + have hh : h = h' := by + apply Subtype.ext + exact inv_mul_eq_one.mp hone + subst h' + rfl + +private theorem kernelPowerCosetMap_bijective (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (φ σ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) : + Function.Bijective (D.kernelPowerCosetMap K L hLK φ σ) := by + let Q := K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK + let dQ := D.extensionNormalizedDegreeContinuous K L hLK + let H : Subgroup Q := dQ.toMonoidHom.ker + let Γ : Subgroup Q := (D.frobeniusClosure K L hLK σ).toSubgroup + let n := D.frobeniusExponent K L hLK σ + let j := D.extensionDegreeKernelRestriction K L hLK + let : Finite H := + Finite.of_injective j + (D.extensionDegreeKernelRestriction_injective K L hLK) + let : Finite (Q ⧸ Γ) := by + simpa [Q, Γ] using D.frobeniusFixedField_finiteIndex K L hLK σ + have hΓmap : Γ.map dQ.toMonoidHom = + (D.frobeniusClosureDegree K L hLK σ).toMonoidHom.range := by + ext z + constructor + · rintro ⟨q, hq, rfl⟩ + exact ⟨⟨q, hq⟩, rfl⟩ + · rintro ⟨q, rfl⟩ + exact ⟨q.1, q.2, rfl⟩ + have htopmap : (⊤ : Subgroup Q).map dQ.toMonoidHom = ⊤ := by + apply top_unique + intro z _ + obtain ⟨q, hq⟩ := + D.extensionNormalizedDegreeContinuous_surjective K L hLK z + exact ⟨q, trivial, hq⟩ + have himage : (Γ.map dQ.toMonoidHom).relIndex + ((⊤ : Subgroup Q).map dQ.toMonoidHom) = n := by + rw [hΓmap, htopmap, Subgroup.relIndex_top_right, + D.frobeniusClosureDegree_range K L hLK σ, + AddSubgroup.index_toSubgroup, + zHatMulNat_range_index _ + (D.frobeniusExponent_pos K L hLK σ)] + have hkernel : (Γ ⊓ dQ.toMonoidHom.ker).relIndex + ((⊤ : Subgroup Q) ⊓ dQ.toMonoidHom.ker) = Nat.card H := by + rw [show Γ ⊓ dQ.toMonoidHom.ker = ⊥ by + simpa [Γ, dQ, Q] using + D.frobeniusClosure_inf_degreeKernel K L hLK σ] + rw [top_inf_eq] + change (⊥ : Subgroup Q).relIndex H = Nat.card H + rw [Subgroup.relIndex_bot_left] + have hindex : Γ.index = n * Nat.card H := by + rw [← Subgroup.relIndex_top_right] + rw [relIndex_eq_map_relIndex_mul_inf_ker_relIndex dQ.toMonoidHom le_top, + himage, hkernel] + have hcard : + Nat.card (H × Fin n) = Nat.card (Q ⧸ Γ) := by + calc + Nat.card (H × Fin n) = + Nat.card H * Nat.card (Fin n) := Nat.card_prod _ _ + _ = Nat.card H * n := by + have hfin : Nat.card (Fin n) = n := by + calc + Nat.card (Fin n) = Fintype.card (Fin n) := + Nat.card_eq_fintype_card + _ = n := Fintype.card_fin n + rw [hfin] + _ = n * Nat.card H := Nat.mul_comm _ _ + _ = Γ.index := hindex.symm + _ = Nat.card (Q ⧸ Γ) := Subgroup.index_eq_card Γ + apply (Nat.bijective_iff_injective_and_card + (D.kernelPowerCosetMap K L hLK φ σ)).2 + exact ⟨D.kernelPowerCosetMap_injective K L hLK φ σ hφ, + by simpa [H, n, Q, Γ, dQ] using hcard⟩ + +/-- The coset decomposition used in the proof of the Frobenius norm-identity lemma. -/ +noncomputable def kernelPowerCosetEquiv (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (φ σ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) : + (D.extensionNormalizedDegreeContinuous K L hLK).toMonoidHom.ker × + Fin (D.frobeniusExponent K L hLK σ) ≃ + ((K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) ⧸ + (D.frobeniusClosure K L hLK σ).toSubgroup) := + Equiv.ofBijective (D.kernelPowerCosetMap K L hLK φ σ) + (by exact D.kernelPowerCosetMap_bijective K L hLK φ σ hφ) + +/-- Explicit version of the coset decomposition, with representatives in +the order `φ^i · τ`; this is the order occurring in `φ_n ∘ N`. -/ +noncomputable def frobeniusNormIdentityCosetMap (D : DegreeData G) + [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ σ : D.FrobeniusElements K L hLK) : + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) × + Fin (D.frobeniusExponent K L hLK σ) → + (K.field.toSubgroup ⧸ + extensionSubgroup K.field (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ)) := + fun p => + let kφ : K.field.toSubgroup := Quotient.out (φ.1 ^ p.2.1) + let kI : (D.maximalUnramifiedField K.field).toSubgroup := Quotient.out p.1 + QuotientGroup.mk (kφ * (⟨kI.1, kI.2.1⟩ : K.field.toSubgroup)) + +private theorem frobeniusNormIdentityCosetMap_commutes (D : DegreeData G) + [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ σ : D.FrobeniusElements K L hLK) + (p : ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) × + Fin (D.frobeniusExponent K L hLK σ)) : + D.frobeniusFixedCosetToClosureCoset K L hLK σ + (D.frobeniusNormIdentityCosetMap K L hLK φ σ p) = + D.kernelPowerCosetMap K L hLK φ σ + (D.inertiaQuotientDegreeKernelEquiv K L hLK p.1, p.2) := by + let kφ : K.field.toSubgroup := Quotient.out (φ.1 ^ p.2.1) + let kI : (D.maximalUnramifiedField K.field).toSubgroup := Quotient.out p.1 + let kIK : K.field.toSubgroup := ⟨kI.1, kI.2.1⟩ + have hkφ : (QuotientGroup.mk' + (D.extensionInertiaWithin K.field L hLK)) kφ = φ.1 ^ p.2.1 := + Quotient.out_eq' (φ.1 ^ p.2.1) + have hkI : + (D.inertiaQuotientDegreeKernelEquiv K L hLK p.1).1 = + (QuotientGroup.mk' (D.extensionInertiaWithin K.field L hLK)) kIK := by + change (D.inertiaCosetToDegreeKernel K L hLK p.1).1 = _ + calc + (D.inertiaCosetToDegreeKernel K L hLK p.1).1 = + (D.inertiaCosetToDegreeKernel K L hLK + (QuotientGroup.mk kI)).1 := by + exact congrArg + (fun r => (D.inertiaCosetToDegreeKernel K L hLK r).1) + (Quotient.out_eq' p.1).symm + _ = _ := rfl + change QuotientGroup.mk + ((QuotientGroup.mk' (D.extensionInertiaWithin K.field L hLK)) + (kφ * kIK)) = + QuotientGroup.mk + (φ.1 ^ p.2.1 * + (D.inertiaQuotientDegreeKernelEquiv K L hLK p.1).1) + rw [map_mul, hkφ, hkI] + +private theorem frobeniusNormIdentityCosetMap_bijective (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (φ σ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) : + Function.Bijective (D.frobeniusNormIdentityCosetMap K L hLK φ σ) := by + let eI := D.inertiaQuotientDegreeKernelEquiv K L hLK + let eP := D.kernelPowerCosetEquiv K L hLK φ σ hφ + let eSigma := D.frobeniusFixedCosetClosureEquiv K L hLK σ + have hinj : Function.Injective (D.frobeniusNormIdentityCosetMap K L hLK φ σ) := by + intro p q hpq + apply (Equiv.prodCongr eI (Equiv.refl _)).injective + apply eP.injective + calc + eP (eI p.1, p.2) = + eSigma (D.frobeniusNormIdentityCosetMap K L hLK φ σ p) := + (D.frobeniusNormIdentityCosetMap_commutes K L hLK φ σ p).symm + _ = eSigma (D.frobeniusNormIdentityCosetMap K L hLK φ σ q) := + congrArg eSigma hpq + _ = eP (eI q.1, q.2) := + D.frobeniusNormIdentityCosetMap_commutes K L hLK φ σ q + have hsurj : Function.Surjective (D.frobeniusNormIdentityCosetMap K L hLK φ σ) := by + intro q + obtain ⟨p, hp⟩ := eP.surjective (eSigma q) + obtain ⟨r, hr⟩ := (Equiv.prodCongr eI (Equiv.refl _)).surjective p + refine ⟨r, ?_⟩ + apply eSigma.injective + calc + eSigma (D.frobeniusNormIdentityCosetMap K L hLK φ σ r) = + eP (eI r.1, r.2) := + D.frobeniusNormIdentityCosetMap_commutes K L hLK φ σ r + _ = eP p := by + apply congrArg eP + exact hr + _ = eSigma q := hp + exact ⟨hinj, hsurj⟩ + +/-- Inertia cosets and bounded Frobenius powers parametrize the fixed-field cosets. -/ +noncomputable def frobeniusNormIdentityCosetEquiv (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (φ σ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) : + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) × + Fin (D.frobeniusExponent K L hLK σ) ≃ + (K.field.toSubgroup ⧸ + extensionSubgroup K.field (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ)) := + Equiv.ofBijective (D.frobeniusNormIdentityCosetMap K L hLK φ σ) + (by exact D.frobeniusNormIdentityCosetMap_bijective K L hLK φ σ hφ) + +end DegreeData + +end frobeniusCosetEquivalences + +section frobeniusNormIdentities + +/-! +Mathlib's `Rep ℤ G` requires the coefficient ring and acting group to share +a universe; `IntegralRepGroupType` names that shared boundary. +-/ +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +private theorem relativeCosetAction_frobeniusNormIdentityCosetEquiv + (D : DegreeData G) (A : Rep ℤ G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (φ σ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) + (a : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σ)) + (r : (D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) + (i : Fin (D.frobeniusExponent K L hLK σ)) : + relativeCosetAction A K.field (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ) a + (D.frobeniusNormIdentityCosetEquiv K L hLK φ σ hφ (r, i)) = + A.ρ (Quotient.out (φ.1 ^ i.1)).1 + (relativeCosetAction A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK) + (fixedFieldInclusion A + (D.frobeniusFixedField K L hLK σ) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ) a) r) := by + let kφ : K.field.toSubgroup := Quotient.out (φ.1 ^ i.1) + let kI : (D.maximalUnramifiedField K.field).toSubgroup := Quotient.out r + let kIK : K.field.toSubgroup := ⟨kI.1, kI.2.1⟩ + change relativeCosetAction A K.field + (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ) a + (QuotientGroup.mk (kφ * kIK)) = _ + rw [relativeCosetAction_mk] + have hr : r = QuotientGroup.mk kI := (Quotient.out_eq' r).symm + rw [hr, relativeCosetAction_mk] + change A.ρ (kφ.1 * kI.1) a.1 = A.ρ kφ.1 (A.ρ kI.1 a.1) + rw [map_mul] + rfl + +private theorem frobeniusQuotientAction_relativeNorm (D : DegreeData G) + (A : Rep ℤ G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hInertiaFintype : Finite + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK))] + (φ : D.FrobeniusElements K L hLK) + (a : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) + (i : ℕ) : + ((D.frobeniusQuotientAction A K.field L hLK (φ.1 ^ i) + (fixedFieldInclusion A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK) + (relativeNorm A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK) a)) : + ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : A.V) = + (@Finset.univ + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) + (Fintype.ofFinite _)).sum (fun r => + A.ρ (Quotient.out (φ.1 ^ i)).1 + (relativeCosetAction A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK) a r)) := by + let kφ : K.field.toSubgroup := Quotient.out (φ.1 ^ i) + have hkφ : φ.1 ^ i = QuotientGroup.mk kφ := + (Quotient.out_eq' (φ.1 ^ i)).symm + let b := fixedFieldInclusion A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + (relativeNorm A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) a) + calc + ((D.frobeniusQuotientAction A K.field L hLK (φ.1 ^ i) b : + ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : A.V) = + (D.frobeniusQuotientAction A K.field L hLK + (QuotientGroup.mk kφ) b : A.V) := by + exact congrArg + (fun q => (D.frobeniusQuotientAction A K.field L hLK q b : A.V)) hkφ + _ = A.ρ kφ.1 b.1 := rfl + _ = A.ρ kφ.1 + ((relativeNorm A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK) a : + ambientFixedAddSubgroup A (D.maximalUnramifiedField K.field)) : A.V) := by + rw [fixedFieldInclusion_coe] + _ = A.ρ kφ.1 + (relativeNormValue A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK) a) := by + rw [relativeNorm_apply_coe] + _ = A.ρ kφ.1 + ((@Finset.univ + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) + (Fintype.ofFinite _)).sum (fun r => + relativeCosetAction A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK) a r)) := by + rfl + _ = (@Finset.univ + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) + (Fintype.ofFinite _)).sum (fun r => A.ρ kφ.1 + (relativeCosetAction A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK) a r)) := by + rw [map_sum] + +/-- The first norm identity of the Frobenius norm-identity lemma, in the order `φ_n ∘ N`. -/ +theorem frobeniusNormIdentity_norm_eq_powerSum_norm (D : DegreeData G) (A : Rep ℤ G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (φ σ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) + (a : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σ)) : + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ)) := + D.frobeniusFixedField_finite K L hLK σ + letI : Finite + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K.field L hLK + ((relativeNorm A K.field (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ) a : + ambientFixedAddSubgroup A K.field) : A.V) = + ((D.frobeniusPowerSum A K.field L hLK φ.1 + (D.frobeniusExponent K L hLK σ) + (fixedFieldInclusion A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK) + (relativeNorm A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK) + (fixedFieldInclusion A + (D.frobeniusFixedField K L hLK σ) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ) a))) : + ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : A.V) := by + let : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ)) := + D.frobeniusFixedField_finite K L hLK σ + let : Finite + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K.field L hLK + let R := (D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + let n := D.frobeniusExponent K L hLK σ + let e := D.frobeniusNormIdentityCosetEquiv K L hLK φ σ hφ + let aI := fixedFieldInclusion A + (D.frobeniusFixedField K L hLK σ) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ) a + let b := fixedFieldInclusion A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + (relativeNorm A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) aI) + let := Fintype.ofFinite R + let := Fintype.ofFinite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ)) + rw [relativeNorm_apply_coe, relativeNormValue, + D.frobeniusPowerSum_coe] + calc + ∑ q, relativeCosetAction A K.field + (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ) a q = + ∑ p : R × Fin n, + relativeCosetAction A K.field + (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ) a (e p) := + (e.sum_comp _).symm + _ = ∑ p : R × Fin n, + A.ρ (Quotient.out (φ.1 ^ p.2.1)).1 + (relativeCosetAction A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + aI p.1) := by + apply Finset.sum_congr rfl + intro p _ + exact D.relativeCosetAction_frobeniusNormIdentityCosetEquiv + A K L hLK φ σ hφ a p.1 p.2 + _ = ∑ i : Fin n, ∑ r : R, + A.ρ (Quotient.out (φ.1 ^ i.1)).1 + (relativeCosetAction A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + aI r) := by + rw [Fintype.sum_prod_type] + exact Finset.sum_comm + _ = ∑ i : Fin n, + (D.frobeniusQuotientAction A K.field L hLK (φ.1 ^ i.1) b : A.V) := by + apply Finset.sum_congr rfl + intro i _ + exact (D.frobeniusQuotientAction_relativeNorm + A K L hLK φ aI i.1).symm + +/-- The second identity of the Frobenius norm-identity lemma: +`N_{\widetilde L/\widetilde K} ∘ φ_n = + φ_n ∘ N_{\widetilde L/\widetilde K}`. -/ +theorem frobeniusNormIdentity_norm_powerSum_eq_powerSum_norm (D : DegreeData G) + (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + [hLfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (φ : K.toSubgroup ⧸ D.extensionInertiaWithin K L hLK) + (n : ℕ) + (a : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : + letI : Finite + ((D.maximalUnramifiedField K).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K L hLK + ((relativeNorm A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + (D.frobeniusPowerSum A K L hLK φ n a) : + ambientFixedAddSubgroup A (D.maximalUnramifiedField K)) : A.V) = + ((D.frobeniusPowerSum A K L hLK φ n + (fixedFieldInclusion A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + (relativeNorm A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + a)) : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : + A.V) := by + let : Finite + ((D.maximalUnramifiedField K).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K L hLK + change + ((relativeNorm A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK)) + (∑ i : Fin n, D.frobeniusQuotientAction A K L hLK (φ ^ i.1) a)).1 = + (∑ i : Fin n, D.frobeniusQuotientAction A K L hLK (φ ^ i.1) + (fixedFieldInclusion A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + (relativeNorm A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + a))).1 + simp only [map_sum] + change (ambientFixedAddSubgroup A + (D.maximalUnramifiedField K)).subtype + (∑ i : Fin n, relativeNorm A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + (D.frobeniusQuotientAction A K L hLK (φ ^ i.1) a)) = + (ambientFixedAddSubgroup A + (D.maximalUnramifiedField L)).subtype + (∑ i : Fin n, D.frobeniusQuotientAction A K L hLK (φ ^ i.1) + (fixedFieldInclusion A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + (relativeNorm A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + a))) + rw [map_sum, map_sum] + apply Finset.sum_congr rfl + intro i _ + exact D.relativeNorm_frobeniusQuotientAction A K L hLK (φ ^ i.1) a + +/-- **The Frobenius norm-identity lemma.** For `d_K(φ)=1`, `d_K(σ)=n` and the +fixed field `Σ` of `σ`, the three actual norm expressions agree: +`N_{Σ/K}(a) = (N_{\widetilde L/\widetilde K} ∘ φ_n)(a) = +(φ_n ∘ N_{\widetilde L/\widetilde K})(a)`. -/ +theorem frobeniusNormIdentities (D : DegreeData G) (A : Rep ℤ G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (φ σ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) + (a : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σ)) : + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ)) := + D.frobeniusFixedField_finite K L hLK σ + letI : Finite + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K.field L hLK + let n := D.frobeniusExponent K L hLK σ + let aI := fixedFieldInclusion A + (D.frobeniusFixedField K L hLK σ) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ) a + let b := fixedFieldInclusion A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + (relativeNorm A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) aI) + let φnAI := D.frobeniusPowerSum A K.field L hLK φ.1 n aI + (((relativeNorm A K.field (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ) a : + ambientFixedAddSubgroup A K.field) : A.V) = + ((relativeNorm A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + φnAI : ambientFixedAddSubgroup A + (D.maximalUnramifiedField K.field)) : A.V)) ∧ + (((relativeNorm A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + φnAI : ambientFixedAddSubgroup A + (D.maximalUnramifiedField K.field)) : A.V) = + ((D.frobeniusPowerSum A K.field L hLK φ.1 n b : + ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : A.V)) := by + let : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ)) := + D.frobeniusFixedField_finite K L hLK σ + let : Finite + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K.field L hLK + let n := D.frobeniusExponent K L hLK σ + let aI := fixedFieldInclusion A + (D.frobeniusFixedField K L hLK σ) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ) a + let b := fixedFieldInclusion A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + (relativeNorm A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) aI) + let φnAI := D.frobeniusPowerSum A K.field L hLK φ.1 n aI + have hFirst : + ((relativeNorm A K.field (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ) a : + ambientFixedAddSubgroup A K.field) : A.V) = + ((D.frobeniusPowerSum A K.field L hLK φ.1 n b : + ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : A.V) := by + simpa [n, aI, b] using + D.frobeniusNormIdentity_norm_eq_powerSum_norm A K L hLK φ σ hφ a + have hCommute : + ((relativeNorm A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + φnAI : ambientFixedAddSubgroup A + (D.maximalUnramifiedField K.field)) : A.V) = + ((D.frobeniusPowerSum A K.field L hLK φ.1 n b : + ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : A.V) := by + simpa [n, aI, b, φnAI] using + D.frobeniusNormIdentity_norm_powerSum_eq_powerSum_norm + A K.field L hLK φ.1 n aI + exact ⟨hFirst.trans hCommute.symm, hCommute⟩ + +end DegreeData +end frobeniusNormIdentities +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/DoubleCosetOrbitGeometry.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/DoubleCosetOrbitGeometry.lean new file mode 100644 index 0000000000..9a39ba2952 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/DoubleCosetOrbitGeometry.lean @@ -0,0 +1,414 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.TopologicalGeneration +public import Mathlib.GroupTheory.DoubleCoset +public import Mathlib.GroupTheory.GroupAction.Quotient +public import Mathlib.Topology.Algebra.Group.ClosedSubgroup +public import Mathlib.Topology.Algebra.Group.SubmonoidClosure +/-! +# Orbit quotients and double-coset geometry + +This module contains the group-theoretic geometry used by the transfer formula: +orbit quotients of coset spaces, inversion of double cosets, transport along +surjective equivariant maps, and replacement of a cyclic subgroup by its +topological closure. It has no class-formation or field-theoretic input. +-/ + +@[expose] public section + +universe u + +namespace ClassFormation + +noncomputable +section + +open MulAction + +/-- Orbits of `S` on `Q/H` are the double cosets `S \\ Q / H`. +This makes the indexing set in Mathlib's transfer formula literally the +double-coset set used by the abstract class-field construction. -/ +noncomputable def orbitQuotientEquivDoubleCoset + {Q : Type u} [Group Q] (S H : Subgroup Q) : + Quotient (orbitRel S (Q ⧸ H)) ≃ + DoubleCoset.Quotient (S : Set Q) (H : Set Q) where + toFun z := Quotient.liftOn' z + (fun q => DoubleCoset.mk S H q.out) (by + intro q₁ q₂ hq + rw [orbitRel_apply, mem_orbit_iff] at hq + obtain ⟨s, hs⟩ := hq + symm + apply DoubleCoset.eq.mpr + have hcoset : + (QuotientGroup.mk q₁.out : Q ⧸ H) = + QuotientGroup.mk (s.1 * q₂.out) := by + calc + QuotientGroup.mk q₁.out = q₁ := Quotient.out_eq' q₁ + _ = s • q₂ := hs.symm + _ = s • (QuotientGroup.mk q₂.out : Q ⧸ H) := + congrArg (s • ·) (Quotient.out_eq' q₂).symm + _ = QuotientGroup.mk (s.1 * q₂.out) := rfl + have hh : q₁.out⁻¹ * (s.1 * q₂.out) ∈ H := + QuotientGroup.eq.mp hcoset + refine ⟨s.1, s.2, (q₁.out⁻¹ * (s.1 * q₂.out))⁻¹, + H.inv_mem hh, ?_⟩ + simp [mul_assoc]) + invFun z := Quotient.liftOn' z + (fun x => Quotient.mk'' (QuotientGroup.mk x : Q ⧸ H)) (by + intro x y hxy + rw [DoubleCoset.rel_iff] at hxy + obtain ⟨s, hs, h, hh, rfl⟩ := hxy + apply Quotient.eq''.mpr + rw [orbitRel_apply, mem_orbit_iff] + refine ⟨⟨s⁻¹, S.inv_mem hs⟩, ?_⟩ + apply QuotientGroup.eq.mpr + simpa [mul_assoc] using hh) + left_inv z := by + refine Quotient.inductionOn' z ?_ + intro q + change Quotient.mk'' (QuotientGroup.mk q.out : Q ⧸ H) = Quotient.mk'' q + exact congrArg Quotient.mk'' (Quotient.out_eq' q) + right_inv z := by + refine Quotient.inductionOn' z ?_ + intro x + change DoubleCoset.mk S H (Quotient.out + (QuotientGroup.mk x : Q ⧸ H)) = DoubleCoset.mk S H x + apply DoubleCoset.eq.mpr + have hh : (Quotient.out (QuotientGroup.mk x : Q ⧸ H))⁻¹ * x ∈ H := + QuotientGroup.leftRel_apply.mp + (Quotient.exact' (Quotient.out_eq' (QuotientGroup.mk x : Q ⧸ H))) + exact ⟨1, S.one_mem, + (Quotient.out (QuotientGroup.mk x : Q ⧸ H))⁻¹ * x, + hh, by simp⟩ + +/-- The orbit-to-double-coset equivalence sends the orbit represented by +`x` to its double coset. This exposes that the definition is independent +of the representative selected by `Quotient.out`. -/ +@[simp] +theorem orbitQuotientEquivDoubleCoset_mk + {Q : Type u} [Group Q] (S H : Subgroup Q) (x : Q) : + orbitQuotientEquivDoubleCoset S H + (Quotient.mk'' (QuotientGroup.mk x : Q ⧸ H)) = + DoubleCoset.mk S H x := by + change DoubleCoset.mk S H + (Quotient.out (QuotientGroup.mk x : Q ⧸ H)) = + DoubleCoset.mk S H x + apply DoubleCoset.eq.mpr + have hh : + (Quotient.out (QuotientGroup.mk x : Q ⧸ H))⁻¹ * x ∈ H := + QuotientGroup.leftRel_apply.mp + (Quotient.exact' + (Quotient.out_eq' (QuotientGroup.mk x : Q ⧸ H))) + exact ⟨1, S.one_mem, + (Quotient.out (QuotientGroup.mk x : Q ⧸ H))⁻¹ * x, + hh, by simp⟩ + +/-- The inverse double-coset equivalence sends a represented double coset +to the corresponding represented orbit. -/ +@[simp] +theorem orbitQuotientEquivDoubleCoset_symm_mk + {Q : Type u} [Group Q] (S H : Subgroup Q) (x : Q) : + (orbitQuotientEquivDoubleCoset S H).symm (DoubleCoset.mk S H x) = + Quotient.mk'' (QuotientGroup.mk x : Q ⧸ H) := + rfl + +/-- Inversion exchanges the two sides of a double-coset space. -/ +noncomputable def doubleCosetInversionEquiv + {Q : Type u} [Group Q] (S H : Subgroup Q) : + DoubleCoset.Quotient (S : Set Q) (H : Set Q) ≃ + DoubleCoset.Quotient (H : Set Q) (S : Set Q) where + toFun z := Quotient.liftOn' z + (fun x => DoubleCoset.mk H S x⁻¹) (by + intro x y hxy + rw [DoubleCoset.rel_iff] at hxy + obtain ⟨s, hs, h, hh, rfl⟩ := hxy + apply DoubleCoset.eq.mpr + exact ⟨h⁻¹, H.inv_mem hh, s⁻¹, S.inv_mem hs, + by simp [mul_assoc]⟩) + invFun z := Quotient.liftOn' z + (fun x => DoubleCoset.mk S H x⁻¹) (by + intro x y hxy + rw [DoubleCoset.rel_iff] at hxy + obtain ⟨h, hh, s, hs, rfl⟩ := hxy + apply DoubleCoset.eq.mpr + exact ⟨s⁻¹, S.inv_mem hs, h⁻¹, H.inv_mem hh, + by simp [mul_assoc]⟩) + left_inv z := by + refine Quotient.inductionOn' z ?_ + intro x + change DoubleCoset.mk S H (x⁻¹)⁻¹ = DoubleCoset.mk S H x + rw [inv_inv] + right_inv z := by + refine Quotient.inductionOn' z ?_ + intro x + change DoubleCoset.mk H S (x⁻¹)⁻¹ = DoubleCoset.mk H S x + rw [inv_inv] + +/-- Orbit sets on the two quotient spaces are exchanged by inversion. +This is the reindexing between the transfer and norm double-coset +decompositions in the proof of transfer--norm naturality. -/ +noncomputable def orbitQuotientSwapEquiv + {Q : Type u} [Group Q] (S H : Subgroup Q) : + Quotient (orbitRel S (Q ⧸ H)) ≃ + Quotient (orbitRel H (Q ⧸ S)) := + (orbitQuotientEquivDoubleCoset S H).trans + ((doubleCosetInversionEquiv S H).trans + (orbitQuotientEquivDoubleCoset H S).symm) + +/-- The double-coset swap sends the orbit represented by `x` to the orbit +represented by `x⁻¹`; this proposition records that fact independently of +the representatives selected by `Quotient.out`. -/ +@[simp] +theorem orbitQuotientSwapEquiv_mk + {Q : Type u} [Group Q] (S H : Subgroup Q) (x : Q) : + orbitQuotientSwapEquiv S H + (Quotient.mk'' (QuotientGroup.mk x : Q ⧸ H)) = + Quotient.mk'' (QuotientGroup.mk x⁻¹ : Q ⧸ S) := by + change (orbitQuotientEquivDoubleCoset H S).symm + (doubleCosetInversionEquiv S H + (orbitQuotientEquivDoubleCoset S H + (Quotient.mk'' (QuotientGroup.mk x : Q ⧸ H)))) = _ + unfold orbitQuotientEquivDoubleCoset doubleCosetInversionEquiv + simp only [Equiv.coe_fn_mk, Quotient.liftOn'_mk'', Equiv.coe_fn_symm_mk] + let u : Q := Quotient.out (QuotientGroup.mk x : Q ⧸ H) + have hu : u⁻¹ * x ∈ H := by + apply QuotientGroup.eq.mp + exact Quotient.out_eq' (QuotientGroup.mk x : Q ⧸ H) + apply Quotient.sound' + rw [orbitRel_apply, mem_orbit_iff] + refine ⟨⟨u⁻¹ * x, hu⟩, ?_⟩ + change QuotientGroup.mk ((u⁻¹ * x) * x⁻¹) = + (QuotientGroup.mk u⁻¹ : Q ⧸ S) + simp [mul_assoc] + +/-- A surjective homomorphism and an equivariant equivalence of the acted-on +sets induce an equivalence of orbit sets. -/ +noncomputable def orbitQuotientEquivOfSurjectiveEquivariant + {M : Type*} {N : Type*} {X : Type*} {Y : Type*} [Group M] [Group N] + [MulAction M X] [MulAction N Y] + (f : M →* N) (hf : Function.Surjective f) (e : X ≃ Y) + (he : ∀ (m : M) (x : X), e (m • x) = f m • e x) : + Quotient (orbitRel M X) ≃ Quotient (orbitRel N Y) := + { toFun := Quotient.map' e (by + intro x y hxy + rw [orbitRel_apply, mem_orbit_iff] at hxy ⊢ + obtain ⟨m, hm⟩ := hxy + exact ⟨f m, (he m y).symm.trans (congrArg e hm)⟩) + invFun := Quotient.map' e.symm (by + intro x y hxy + rw [orbitRel_apply, mem_orbit_iff] at hxy ⊢ + obtain ⟨n, hn⟩ := hxy + obtain ⟨m, rfl⟩ := hf n + refine ⟨m, ?_⟩ + apply e.injective + rw [he, e.apply_symm_apply, e.apply_symm_apply] + exact hn) + left_inv := by + intro q + refine Quotient.inductionOn' q ?_ + intro x + change Quotient.mk'' (e.symm (e x)) = Quotient.mk'' x + rw [e.symm_apply_apply] + right_inv := by + intro q + refine Quotient.inductionOn' q ?_ + intro y + change Quotient.mk'' (e (e.symm y)) = Quotient.mk'' y + rw [e.apply_symm_apply] } + +/-- The orbit-quotient equivalence sends a represented orbit to the image representative. -/ +@[simp] +theorem orbitQuotientEquivOfSurjectiveEquivariant_mk + {M : Type*} {N : Type*} {X : Type*} {Y : Type*} [Group M] [Group N] + [MulAction M X] [MulAction N Y] + (f : M →* N) (hf : Function.Surjective f) (e : X ≃ Y) + (he : ∀ (m : M) (x : X), e (m • x) = f m • e x) (x : X) : + orbitQuotientEquivOfSurjectiveEquivariant f hf e he + (Quotient.mk'' x) = Quotient.mk'' (e x) := + rfl + +/-- The inverse orbit-quotient equivalence lifts a representative to its source orbit. -/ +@[simp] +theorem orbitQuotientEquivOfSurjectiveEquivariant_symm_mk + {M : Type*} {N : Type*} {X : Type*} {Y : Type*} [Group M] [Group N] + [MulAction M X] [MulAction N Y] + (f : M →* N) (hf : Function.Surjective f) (e : X ≃ Y) + (he : ∀ (m : M) (x : X), e (m • x) = f m • e x) (y : Y) : + (orbitQuotientEquivOfSurjectiveEquivariant f hf e he).symm + (Quotient.mk'' y) = Quotient.mk'' (e.symm y) := + rfl + +/-- A group equivalence transports left cosets along the image of a +subgroup; no normality hypothesis is required. -/ +noncomputable def leftCosetEquivOfMulEquiv + {Q : Type*} {R : Type*} [Group Q] [Group R] + (e : Q ≃* R) (S : Subgroup Q) : + Q ⧸ S ≃ R ⧸ S.map e.toMonoidHom where + toFun := Quotient.map' e (by + intro x y hxy + rw [QuotientGroup.leftRel_apply] at hxy ⊢ + exact ⟨x⁻¹ * y, hxy, by simp⟩) + invFun := Quotient.map' e.symm (by + intro x y hxy + rw [QuotientGroup.leftRel_apply] at hxy ⊢ + obtain ⟨z, hz, heq⟩ := hxy + have hzEq : e.symm (x⁻¹ * y) = z := by + rw [← heq] + simp + have hxyEq : (e.symm x)⁻¹ * e.symm y = z := by + calc + (e.symm x)⁻¹ * e.symm y = e.symm (x⁻¹ * y) := by simp + _ = z := hzEq + rw [hxyEq] + exact hz) + left_inv q := by + refine Quotient.inductionOn' q ?_ + intro x + change QuotientGroup.mk (e.symm (e x)) = QuotientGroup.mk x + rw [e.symm_apply_apply] + right_inv q := by + refine Quotient.inductionOn' q ?_ + intro x + change QuotientGroup.mk (e (e.symm x)) = QuotientGroup.mk x + rw [e.apply_symm_apply] + +/-- A multiplicative equivalence transports a left-coset representative as expected. -/ +theorem leftCosetEquivOfMulEquiv_mk + {Q : Type*} {R : Type*} [Group Q] [Group R] + (e : Q ≃* R) (S : Subgroup Q) (x : Q) : + leftCosetEquivOfMulEquiv e S (QuotientGroup.mk x) = + QuotientGroup.mk (e x) := + rfl + +/-- Closing a cyclic subgroup does not change its double cosets against a +closed finite-index subgroup. This is the density/open-subgroup step which +passes from the algebraic powers of a Frobenius to its closed procyclic +subgroup in the classical argument. -/ +theorem doubleCoset_closedCyclic_eq + {Q : Type u} [Group Q] [TopologicalSpace Q] [IsTopologicalGroup Q] + (H : Subgroup Q) [H.FiniteIndex] (hHclosed : IsClosed (H : Set Q)) + (g x y : Q) : + DoubleCoset.mk H (Subgroup.zpowers g) x = + DoubleCoset.mk H (Subgroup.zpowers g) y ↔ + DoubleCoset.mk H + (closedSubgroupGenerated ({g} : Set Q)).toSubgroup x = + DoubleCoset.mk H + (closedSubgroupGenerated ({g} : Set Q)).toSubgroup y := by + let C := (closedSubgroupGenerated ({g} : Set Q)).toSubgroup + have hzC : Subgroup.zpowers g ≤ C := by + rw [Subgroup.zpowers_eq_closure] + exact Subgroup.le_topologicalClosure _ + constructor + · intro hxy + rw [DoubleCoset.eq] at hxy ⊢ + obtain ⟨h, hh, s, hs, hsxy⟩ := hxy + exact ⟨h, hh, s, hzC hs, hsxy⟩ + · intro hxy + rw [DoubleCoset.eq] at hxy ⊢ + obtain ⟨h, hh, c, hc, rfl⟩ := hxy + have hcclosure : c ∈ closure + ((Subgroup.zpowers g : Subgroup Q) : Set Q) := by + rw [Subgroup.zpowers_eq_closure] + rw [← Subgroup.topologicalClosure_coe] + change c ∈ + ((Subgroup.closure ({g} : Set Q)).topologicalClosure : Set Q) at hc + exact hc + let U : Set Q := + (fun s : Q => x * c * s⁻¹ * x⁻¹) ⁻¹' (H : Set Q) + have hUopen : IsOpen U := by + apply (((continuous_const.mul continuous_inv).mul + continuous_const).isOpen_preimage (H : Set Q)) + exact H.isOpen_of_isClosed_of_finiteIndex hHclosed + have hcU : c ∈ U := by + change x * c * c⁻¹ * x⁻¹ ∈ H + simp [mul_assoc] + obtain ⟨s, hsU, hs⟩ := + (mem_closure_iff.mp hcclosure U hUopen hcU) + have hsH : x * c * s⁻¹ * x⁻¹ ∈ H := hsU + refine ⟨h * (x * c * s⁻¹ * x⁻¹), H.mul_mem hh hsH, + s, hs, ?_⟩ + simp [mul_assoc] + +/-- Double-coset equivalence induced by the preceding density argument. -/ +noncomputable def doubleCosetClosedCyclicEquiv + {Q : Type u} [Group Q] [TopologicalSpace Q] [IsTopologicalGroup Q] + (H : Subgroup Q) [H.FiniteIndex] (hHclosed : IsClosed (H : Set Q)) + (g : Q) : + DoubleCoset.Quotient (H : Set Q) (Subgroup.zpowers g : Set Q) ≃ + DoubleCoset.Quotient (H : Set Q) + ((closedSubgroupGenerated ({g} : Set Q)).toSubgroup : Set Q) where + toFun z := Quotient.liftOn' z + (fun x => DoubleCoset.mk H + (closedSubgroupGenerated ({g} : Set Q)).toSubgroup x) + (fun x y hxy => + (doubleCoset_closedCyclic_eq H hHclosed g x y).mp + (Quotient.sound' hxy)) + invFun z := Quotient.liftOn' z + (fun x => DoubleCoset.mk H (Subgroup.zpowers g) x) + (fun x y hxy => + (doubleCoset_closedCyclic_eq H hHclosed g x y).mpr + (Quotient.sound' hxy)) + left_inv z := by + refine Quotient.inductionOn' z ?_ + intro x + rfl + right_inv z := by + refine Quotient.inductionOn' z ?_ + intro x + rfl + +/-- On orbit sets, replacing the powers of a Frobenius by their closure is +an equivalence whenever the subgroup acting on the other side has finite +index and is closed. -/ +noncomputable def orbitQuotientClosedCyclicEquiv + {Q : Type u} [Group Q] [TopologicalSpace Q] [IsTopologicalGroup Q] + (H : Subgroup Q) [H.FiniteIndex] (hHclosed : IsClosed (H : Set Q)) + (g : Q) : + Quotient (orbitRel H (Q ⧸ Subgroup.zpowers g)) ≃ + Quotient (orbitRel H + (Q ⧸ (closedSubgroupGenerated ({g} : Set Q)).toSubgroup)) := + (orbitQuotientEquivDoubleCoset H (Subgroup.zpowers g)).trans + ((doubleCosetClosedCyclicEquiv H hHclosed g).trans + (orbitQuotientEquivDoubleCoset H + (closedSubgroupGenerated ({g} : Set Q)).toSubgroup).symm) + +/-- Passing from the powers of `g` to their closure preserves the orbit +represented by every literal group element. -/ +@[simp] +theorem orbitQuotientClosedCyclicEquiv_mk + {Q : Type u} [Group Q] [TopologicalSpace Q] [IsTopologicalGroup Q] + (H : Subgroup Q) [H.FiniteIndex] (hHclosed : IsClosed (H : Set Q)) + (g x : Q) : + orbitQuotientClosedCyclicEquiv H hHclosed g + (Quotient.mk'' (QuotientGroup.mk x : Q ⧸ Subgroup.zpowers g)) = + Quotient.mk'' (QuotientGroup.mk x : + Q ⧸ (closedSubgroupGenerated ({g} : Set Q)).toSubgroup) := by + let C := (closedSubgroupGenerated ({g} : Set Q)).toSubgroup + change (orbitQuotientEquivDoubleCoset H C).symm + (doubleCosetClosedCyclicEquiv H hHclosed g + (orbitQuotientEquivDoubleCoset H (Subgroup.zpowers g) + (Quotient.mk'' + (QuotientGroup.mk x : Q ⧸ Subgroup.zpowers g)))) = _ + unfold orbitQuotientEquivDoubleCoset doubleCosetClosedCyclicEquiv + simp only [Equiv.coe_fn_mk, Quotient.liftOn'_mk'', Equiv.coe_fn_symm_mk] + let a := Quotient.out (QuotientGroup.mk x : Q ⧸ Subgroup.zpowers g) + have ha : a⁻¹ * x ∈ Subgroup.zpowers g := + QuotientGroup.leftRel_apply.mp + (Quotient.exact' (Quotient.out_eq' + (QuotientGroup.mk x : Q ⧸ Subgroup.zpowers g))) + have haC : a⁻¹ * x ∈ C := by + apply Subgroup.le_topologicalClosure _ + simpa [Subgroup.zpowers_eq_closure] using ha + apply congrArg Quotient.mk'' + apply QuotientGroup.eq.mpr + exact haC + +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteFieldUnitMaps.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteFieldUnitMaps.lean new file mode 100644 index 0000000000..ccb3f9481f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteFieldUnitMaps.lean @@ -0,0 +1,253 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusClosureCommutation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldAction + +/-! # Finite Field Unit Maps -/ + +@[expose] public section +universe u v + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +/-! +# Finite-field unit maps + +This module proves valuation invariance on Frobenius fixed fields and +constructs the induced actions, inclusions, and relative norms on the +corresponding finite unit groups. +-/ + +noncomputable +section + +open CategoryTheory +open scoped BigOperators + +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace FiniteAbstractField + +/-- Normality transports across the canonical residue-field enrichment. -/ +instance toFiniteResidueAbstractField_extensionNormal + (K : FiniteAbstractField G) (D : DegreeData G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hnormal : (extensionSubgroup K.field L hLK).Normal] : + (extensionSubgroup (K.toFiniteResidueAbstractField D).field L hLK).Normal := by + change (extensionSubgroup K.field L hLK).Normal + exact hnormal + +/-- Relative finiteness transports across the canonical residue-field enrichment. -/ +instance toFiniteResidueAbstractField_extensionFinite + (K : FiniteAbstractField G) (D : DegreeData G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] : + Finite ((K.toFiniteResidueAbstractField D).field.toSubgroup ⧸ + extensionSubgroup (K.toFiniteResidueAbstractField D).field L hLK) := by + change Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK) + exact hfinite + +end FiniteAbstractField + +namespace ValuationData + +variable {D : DegreeData G} {A : Rep ℤ G} + +private theorem ambientFixedAddSubgroup_transport_coe + (K L : FiniteAbstractField G) (h : K = L) + (a : ambientFixedAddSubgroup A K.field) : + (((h ▸ a : ambientFixedAddSubgroup A L.field) : A.V)) = a.1 := by + cases h + rfl + +private theorem valuationAt_transport + (v : ValuationData D A) (K L : FiniteAbstractField G) (h : K = L) + (a : ambientFixedAddSubgroup A K.field) : + v.valuationAt L (h ▸ a) = v.valuationAt K a := by + cases h + rfl + +/-- A quotient element stabilizing a Frobenius fixed field preserves its +normalized valuation. -/ +theorem valuationAt_frobeniusFixedFieldAction + (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : DegreeData.FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) + (q : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hq : q * σ.1 = σ.1 * q) + [Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (D.frobeniusFixedField K L hLK σ) + (le_baseField (D.frobeniusFixedField K L hLK σ)))] + (a : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σ)) : + v.valuationAt (D.frobeniusFixedAbstractField K L hLK σ) + (D.frobeniusFixedFieldAction A K L hLK σ q hq a) = + v.valuationAt (D.frobeniusFixedAbstractField K L hLK σ) a := by + let TF := D.frobeniusFixedAbstractField K L hLK σ + let k : K.field.toSubgroup := Quotient.out q + let hstable : conjugateClosedSubgroup TF.field k.1⁻¹ = TF.field := + D.conjugate_frobeniusFixedField_eq_of_commutes K L hLK σ q hq + let CF := TF.conjugate k.1⁻¹ + let C := CF.field + have hconj := v.normalizedValuation_conjugate TF k.1⁻¹ a + let bC : ambientFixedAddSubgroup A C := + conjugateFixedElement A TF.field k.1⁻¹ a + have hCFTF : CF = TF := by + exact FiniteAbstractField.eq_of_field_eq CF TF hstable + let bT : ambientFixedAddSubgroup A TF.field := hCFTF ▸ bC + have hbTcoe : bT.1 = bC.1 := by + exact ambientFixedAddSubgroup_transport_coe CF TF hCFTF bC + have hvaluationTransport : v.valuationAt TF bT = v.valuationAt CF bC := by + exact v.valuationAt_transport CF TF hCFTF bC + have hbT : bT = D.frobeniusFixedFieldAction + A K L hLK σ q hq a := by + apply Subtype.ext + change bT.1 = + (D.frobeniusFixedFieldAction A K L hLK σ q hq a).1 + calc + bT.1 = bC.1 := hbTcoe + _ = A.ρ k.1 a.1 := + (conjugateFixedElement_coe A TF.field k.1⁻¹ a).trans + (congrArg (fun s : G => A.ρ s a.1) (inv_inv k.1)) + _ = (D.frobeniusFixedFieldAction A K L hLK σ q hq a).1 := by rfl + calc + v.valuationAt TF (D.frobeniusFixedFieldAction A K L hLK σ q hq a) = + v.valuationAt TF bT := congrArg (v.valuationAt TF) hbT.symm + _ = v.valuationAt CF bC := hvaluationTransport + _ = v.valuationAt TF a := by simpa [CF, C, bC] using hconj + +/-- The stabilizing action restricted to the unit group of a Frobenius +fixed field. -/ +noncomputable def frobeniusFixedFieldUnitAction + (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : DegreeData.FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) + (q : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hq : q * σ.1 = σ.1 * q) + [Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (D.frobeniusFixedField K L hLK σ) + (le_baseField (D.frobeniusFixedField K L hLK σ)))] : + v.unitAddSubgroup (D.frobeniusFixedAbstractField K L hLK σ) →+ + v.unitAddSubgroup (D.frobeniusFixedAbstractField K L hLK σ) where + toFun u := ⟨D.frobeniusFixedFieldAction A K L hLK σ q hq u.1, by + exact (v.mem_unitAddSubgroup_iff + (D.frobeniusFixedAbstractField K L hLK σ) + (D.frobeniusFixedFieldAction A K L hLK σ q hq u.1)).2 + ((v.valuationAt_frobeniusFixedFieldAction K L hLK σ q hq u.1).trans u.2)⟩ + map_zero' := by apply Subtype.ext; exact map_zero _ + map_add' _ _ := by apply Subtype.ext; exact map_add _ _ _ + +/-- Units stay units after inclusion into any finite extension. The construction +uses this silently when all finitely many terms of `(*)` are placed in one +finite Galois field. -/ +theorem fixedFieldInclusion_mem_unitAddSubgroup + (v : ValuationData D A) (E : FiniteAbstractFieldExtension G) + (u : v.unitAddSubgroup E.base) : + fixedFieldInclusion A E.base.field E.field.field E.below u.1 ∈ + v.unitAddSubgroup E.field := by + rw [v.mem_unitAddSubgroup_iff] + apply Subtype.ext + let ER := E.toFiniteResidueAbstractExtension D + apply zHatMulNat_injective ER.residueDegree.property + change (ER.residueDegree : ℕ) • + ((v.valuationAt E.field + (fixedFieldInclusion A E.base.field E.field.field E.below u.1) : + v.valueGroup) : ZHat) = + (ER.residueDegree : ℕ) • ((0 : v.valueGroup) : ZHat) + have htower := + v.normalizedValuation_tower E + (fixedFieldInclusion A E.base.field E.field.field E.below u.1) + have htower' : + (ER.residueDegree : ℕ) • + ((v.valuationAt E.field + (fixedFieldInclusion A E.base.field E.field.field E.below u.1) : + v.valueGroup) : ZHat) = + ((v.valuationAt E.base + (relativeNorm A E.base.field E.field.field E.below + (fixedFieldInclusion A E.base.field E.field.field E.below u.1)) : + v.valueGroup) : ZHat) := by + simpa [ER] using htower + rw [htower'] + rw [show relativeNorm A E.base.field E.field.field E.below + (fixedFieldInclusion A E.base.field E.field.field E.below u.1) = + (E.degree : ℕ) • u.1 by + exact relativeNorm_fixedFieldInclusion A E.toFiniteAbstractExtension u.1] + rw [map_nsmul] + have hu : v.valuationAt E.base u.1 = 0 := u.2 + simp [hu] + +/-- Inclusion of units along an arbitrary finite extension. -/ +def finiteUnitInclusion + (v : ValuationData D A) (E : FiniteAbstractFieldExtension G) : + v.unitAddSubgroup E.base →+ v.unitAddSubgroup E.field where + toFun u := ⟨fixedFieldInclusion A E.base.field E.field.field E.below u.1, + v.fixedFieldInclusion_mem_unitAddSubgroup E u⟩ + map_zero' := by apply Subtype.ext; rfl + map_add' _ _ := by apply Subtype.ext; rfl + +/-- Transporting a finite-unit inclusion along equality of its target field +does not change its ambient coefficient. -/ +theorem finiteUnitInclusion_transport_coe + (v : ValuationData D A) (E : FiniteAbstractFieldExtension G) + (F : FiniteAbstractField G) (h : E.field = F) + (u : v.unitAddSubgroup E.base) : + (((h ▸ v.finiteUnitInclusion E u : v.unitAddSubgroup F).1 : + ambientFixedAddSubgroup A F.field) : A.V) = u.1.1 := by + cases h + rfl + +/-- The norm of a unit through an arbitrary finite extension is a unit. +This is the valuation-theoretic step used when a finite Galois refinement +is pushed back down to the originally prescribed intermediate field. -/ +theorem relativeNorm_mem_unitAddSubgroup + (v : ValuationData D A) (E : FiniteAbstractFieldExtension G) + (u : v.unitAddSubgroup E.field) : + relativeNorm A E.base.field E.field.field E.below u.1 ∈ + v.unitAddSubgroup E.base := by + rw [v.mem_unitAddSubgroup_iff] + apply Subtype.ext + have h := v.normalizedValuation_tower E u.1 + let ER := E.toFiniteResidueAbstractExtension D + change (ER.residueDegree : ℕ) • + ((v.valuationAt E.field u.1 : v.valueGroup) : ZHat) = + ((v.valuationAt E.base + (relativeNorm A E.base.field E.field.field E.below u.1) : + v.valueGroup) : ZHat) at h + have hu : v.valuationAt E.field u.1 = 0 := u.2 + simpa [hu] using h.symm + +/-- Relative norm restricted to the finite unit groups. -/ +def finiteUnitNorm + (v : ValuationData D A) (E : FiniteAbstractFieldExtension G) : + v.unitAddSubgroup E.field →+ v.unitAddSubgroup E.base where + toFun u := ⟨relativeNorm A E.base.field E.field.field E.below u.1, + v.relativeNorm_mem_unitAddSubgroup E u⟩ + map_zero' := by apply Subtype.ext; exact map_zero _ + map_add' _ _ := by apply Subtype.ext; exact map_add _ _ _ + +end ValuationData +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateCompositum.lean new file mode 100644 index 0000000000..020e22072f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateCompositum.lean @@ -0,0 +1,74 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityIndependence + +/-! # Finite Intermediate Compositum -/ + +@[expose] public section +namespace ClassFormation + +open CyclicCohomology + +/-! +# Finite intermediate fields: composita and absolute finiteness + +These are the finite-stage closure facts used in the proof of the universal norm-descent lemma. + The compositum of two finite intermediate fields is their +intersection on the Galois-group side. +-/ + +noncomputable +section + +variable {G : Type*} [Group G] [TopologicalSpace G] + +namespace FiniteIntermediateField + +/-- The compositum of two finite intermediate fields of `E / K`. -/ +def compositum {E K : ClosedSubgroup G} + (M N : FiniteIntermediateField E K) : + FiniteIntermediateField E K where + field := M.field ⊓ N.field + above := fun x hx => ⟨M.above hx, N.above hx⟩ + below := (inf_le_left : + (M.field ⊓ N.field).toSubgroup ≤ M.field.toSubgroup).trans M.below + finite := by + let : Finite + (K.toSubgroup ⧸ extensionSubgroup K N.field N.below) := N.finite + exact M.compositumWith_finite_over_base N.field N.below + +/-- Proves the bound `(M.compositum N).field.toSubgroup ≤ M.field.toSubgroup`. -/ +theorem compositum_le_left {E K : ClosedSubgroup G} + (M N : FiniteIntermediateField E K) : + (M.compositum N).field.toSubgroup ≤ M.field.toSubgroup := + inf_le_left + +/-- Proves the bound `(M.compositum N).field.toSubgroup ≤ N.field.toSubgroup`. -/ +theorem compositum_le_right {E K : ClosedSubgroup G} + (M N : FiniteIntermediateField E K) : + (M.compositum N).field.toSubgroup ≤ N.field.toSubgroup := + inf_le_right + +/-- A finite intermediate field over a finite abstract base field is itself +finite over the global base field. -/ +theorem absoluteFinite {E K : ClosedSubgroup G} + [hKfinite : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) K (le_baseField K))] + (M : FiniteIntermediateField E K) : + Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) M.field (le_baseField M.field)) := by + let : Finite + (K.toSubgroup ⧸ extensionSubgroup K M.field M.below) := M.finite + exact relativeTowerQuotientFinite (baseField G) K M.field M.below + (le_baseField K) + +end FiniteIntermediateField + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateFieldCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateFieldCompositum.lean new file mode 100644 index 0000000000..c5405c2604 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateFieldCompositum.lean @@ -0,0 +1,87 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CoreFrobeniusNorm + +/-! # Finite Intermediate Field Compositum -/ + +@[expose] public section +universe u v + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +/-! +# Finite intermediate-field composita + +This module records the quotient cardinal and common-compositum facts for +finite intermediate fields used by the norm-descent tower. +-/ + +noncomputable +section + +open CategoryTheory +open scoped BigOperators + +section finiteIntermediateFields + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace FiniteIntermediateField + +/-- Cardinality of the finite relative Galois quotient attached to a finite +intermediate field. Recording the supplied `Finite` instance in the +definition lets later fixed-field constructions use the cardinality without +adding a second finiteness parameter. -/ +noncomputable def quotientCard {E K : ClosedSubgroup G} + (M : FiniteIntermediateField E K) : ℕ := by + letI : Finite + (K.toSubgroup ⧸ extensionSubgroup K M.field M.below) := M.finite + exact Nat.card + (K.toSubgroup ⧸ extensionSubgroup K M.field M.below) + +/-- The finite quotient used in the descent construction has positive cardinality. -/ +theorem quotientCard_pos {E K : ClosedSubgroup G} + (M : FiniteIntermediateField E K) : 0 < M.quotientCard := by + let : Finite + (K.toSubgroup ⧸ extensionSubgroup K M.field M.below) := M.finite + exact Nat.card_pos + +/-- An initial finite stage and finitely many further stages have a common +finite overfield. This existential form avoids choosing an artificial +ordering of the finite family. -/ +theorem exists_common_compositum {E K : ClosedSubgroup G} {ι : Type v} + (M : FiniteIntermediateField E K) (s : Finset ι) + (F : ι → FiniteIntermediateField E K) : + ∃ P : FiniteIntermediateField E K, + P.field.toSubgroup ≤ M.field.toSubgroup ∧ + ∀ i ∈ s, P.field.toSubgroup ≤ (F i).field.toSubgroup := by + classical + induction s using Finset.induction_on with + | empty => + exact ⟨M, le_rfl, by simp⟩ + | @insert i s hi ih => + rcases ih with ⟨P, hPM, hPF⟩ + let Q := P.compositum (F i) + refine ⟨Q, (P.compositum_le_left (F i)).trans hPM, ?_⟩ + intro j hj + rw [Finset.mem_insert] at hj + rcases hj with hji | hj + · simpa [hji] using P.compositum_le_right (F i) + · exact (P.compositum_le_left (F i)).trans (hPF j hj) + +end FiniteIntermediateField + +end finiteIntermediateFields + +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteNormQuotient.lean new file mode 100644 index 0000000000..1ced404d90 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteNormQuotient.lean @@ -0,0 +1,313 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.NormSubgroup +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +/-! # Finite Norm Quotient -/ + +@[expose] public section +universe u + +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +/-! +# The abstract reciprocity construction: passage to a finite norm quotient + +For finite `L | K`, the universal norm subgroup from `\widetilde L` is +contained in the single norm image from `L`. Hence the reciprocity construction descends +canonically to `A_K / N_{L|K}A_L`, the target in the finite reciprocity equivalence. +-/ + +noncomputable +section + +section finiteNorms + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +/-- The finite norm subgroup `N_{L|K}A_L`. -/ +def finiteNormSubgroup (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + AddSubgroup (ambientFixedAddSubgroup A K) := + (relativeNorm A K L hLK).range + +/-- The finite norm quotient in the finite reciprocity equivalence. + +This is a stable public object rather than an `abbrev`: downstream APIs do +not acquire a reducibility dependency on the concrete quotient +representation. -/ +def FiniteNormQuotient (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] := + ambientFixedAddSubgroup A K ⧸ finiteNormSubgroup A K L hLK + +/-- The additive group structure of the finite norm quotient. It is +exported explicitly so typeclass search does not unfold the stable public +type synonym. -/ +instance finiteNormQuotientAddCommGroup + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + AddCommGroup (FiniteNormQuotient A K L hLK) := by + unfold FiniteNormQuotient + infer_instance + +/-- The canonical equivalence with the concrete quotient implementation. +Clients that genuinely need quotient-level operations can use this boundary +without relying on reducible unfolding. -/ +def finiteNormQuotientConcreteEquiv + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + FiniteNormQuotient A K L hLK ≃+ + ambientFixedAddSubgroup A K ⧸ finiteNormSubgroup A K L hLK := by + unfold FiniteNormQuotient + exact AddEquiv.refl _ + +/-- The canonical class map into the finite norm quotient. -/ +def finiteNormClassHom + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + ambientFixedAddSubgroup A K →+ FiniteNormQuotient A K L hLK := by + unfold FiniteNormQuotient + exact QuotientAddGroup.mk' (finiteNormSubgroup A K L hLK) + +/-- The class of an element modulo the finite norm subgroup. -/ +def finiteNormClass + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a : ambientFixedAddSubgroup A K) : + FiniteNormQuotient A K L hLK := + finiteNormClassHom A K L hLK a + +/-- The finite norm-class map sends zero to the trivial quotient class. -/ +@[simp] +theorem finiteNormClass_zero + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + finiteNormClass A K L hLK 0 = 0 := by + exact map_zero (finiteNormClassHom A K L hLK) + +/-- Finite norm classes preserve addition of representatives. -/ +@[simp] +theorem finiteNormClass_add + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a b : ambientFixedAddSubgroup A K) : + finiteNormClass A K L hLK (a + b) = + finiteNormClass A K L hLK a + finiteNormClass A K L hLK b := by + exact map_add (finiteNormClassHom A K L hLK) a b + +/-- Finite norm classes preserve subtraction of representatives. -/ +@[simp] +theorem finiteNormClass_sub + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a b : ambientFixedAddSubgroup A K) : + finiteNormClass A K L hLK (a - b) = + finiteNormClass A K L hLK a - finiteNormClass A K L hLK b := by + exact map_sub (finiteNormClassHom A K L hLK) a b + +/-- Finite norm classes commute with natural scalar multiplication. -/ +@[simp] +theorem finiteNormClass_nsmul + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (n : ℕ) (a : ambientFixedAddSubgroup A K) : + finiteNormClass A K L hLK (n • a) = + n • finiteNormClass A K L hLK a := by + exact map_nsmul (finiteNormClassHom A K L hLK) n a + +/-- The concrete quotient equivalence sends a finite norm class to its canonical coset. -/ +@[simp] +theorem finiteNormQuotientConcreteEquiv_finiteNormClass + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a : ambientFixedAddSubgroup A K) : + finiteNormQuotientConcreteEquiv A K L hLK + (finiteNormClass A K L hLK a) = + QuotientAddGroup.mk' (finiteNormSubgroup A K L hLK) a := by + rfl + +/-- A finite norm class vanishes exactly when its representative lies in the norm subgroup. -/ +@[simp] +theorem finiteNormClass_eq_zero_iff + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a : ambientFixedAddSubgroup A K) : + finiteNormClass A K L hLK a = 0 ↔ + a ∈ finiteNormSubgroup A K L hLK := by + unfold finiteNormClass finiteNormClassHom FiniteNormQuotient + exact QuotientAddGroup.eq_zero_iff _ + +/-- Every finite norm-quotient class has an ambient representative. -/ +theorem finiteNormClass_surjective + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + Function.Surjective (finiteNormClass A K L hLK) := by + intro q + change ambientFixedAddSubgroup A K ⧸ + finiteNormSubgroup A K L hLK at q + obtain ⟨a, rfl⟩ := QuotientAddGroup.mk'_surjective + (finiteNormSubgroup A K L hLK) q + exact ⟨a, rfl⟩ + +/-- Eliminate a finite norm-quotient class through an ambient representative. -/ +@[elab_as_elim] +theorem FiniteNormQuotient.induction_on + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + {motive : FiniteNormQuotient A K L hLK → Prop} + (q : FiniteNormQuotient A K L hLK) + (h : ∀ a, motive (finiteNormClass A K L hLK a)) : motive q := by + obtain ⟨a, rfl⟩ := finiteNormClass_surjective A K L hLK q + exact h a + +/-- Descend an additive homomorphism that kills the finite norm subgroup. -/ +def finiteNormQuotientLift + {B : Type*} [AddCommGroup B] + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (f : ambientFixedAddSubgroup A K →+ B) + (hf : finiteNormSubgroup A K L hLK ≤ f.ker) : + FiniteNormQuotient A K L hLK →+ B := by + unfold FiniteNormQuotient + exact QuotientAddGroup.lift (finiteNormSubgroup A K L hLK) f hf + +/-- The quotient lift evaluates on a finite norm class by the chosen representative. -/ +@[simp] +theorem finiteNormQuotientLift_finiteNormClass + {B : Type*} [AddCommGroup B] + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (f : ambientFixedAddSubgroup A K →+ B) + (hf : finiteNormSubgroup A K L hLK ≤ f.ker) + (a : ambientFixedAddSubgroup A K) : + finiteNormQuotientLift A K L hLK f hf + (finiteNormClass A K L hLK a) = f a := by + rfl + +/-- Every class in the finite norm quotient is killed by `[L : K]`. +This is the actual norm identity +`N_{L/K}(a) = [L : K] a` for an element already fixed by `G_K`. -/ +theorem finiteNormQuotient_degree_nsmul_eq_zero + (A : Rep ℤ G) (E : DegreeData.FiniteAbstractExtension G) + (q : FiniteNormQuotient A E.base E.field E.below) : + (E.degree : ℕ) • q = 0 := by + refine FiniteNormQuotient.induction_on A E.base E.field E.below q ?_ + intro a + unfold finiteNormClass + rw [← map_nsmul] + apply (finiteNormClass_eq_zero_iff A E.base E.field E.below _).2 + refine ⟨fixedFieldInclusion A E.base E.field E.below a, ?_⟩ + exact relativeNorm_fixedFieldInclusion A E a + +end finiteNorms + +section finiteIntermediateField + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- `L` itself is a finite intermediate field of `\widetilde L | K`. -/ +def fieldAsMaximalUnramifiedIntermediate (D : DegreeData G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + FiniteIntermediateField (D.maximalUnramifiedField L) K where + field := L + above := D.maximalUnramifiedField_le L + below := hLK + finite := hfinite + +end DegreeData + +end finiteIntermediateField + +section quotientMaps + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- The defining intersection for the infinite norm subgroup is contained +in the norm image from the particular finite field `L`. -/ +theorem maximalUnramifiedNormSubgroup_le_finiteNormSubgroup + (D : DegreeData G) (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + D.maximalUnramifiedNormSubgroup A K L ≤ + finiteNormSubgroup A K L hLK := by + rw [D.maximalUnramifiedNormSubgroup_eq_infiniteNormSubgroup] + rw [infiniteNormSubgroup] + refine iInf_le_of_le (D.fieldAsMaximalUnramifiedIntermediate K L hLK) ?_ + rfl + +private theorem maximalUnramifiedNormSubgroup_le_finiteNormClassHom_ker + (D : DegreeData G) (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + D.maximalUnramifiedNormSubgroup A K L ≤ + (finiteNormClassHom A K L hLK).ker := by + intro a ha + exact (finiteNormClass_eq_zero_iff A K L hLK a).2 + (D.maximalUnramifiedNormSubgroup_le_finiteNormSubgroup A K L hLK ha) + +/-- The canonical quotient map +`A_K/N_{\widetilde L|K}A_{\widetilde L} → A_K/N_{L|K}A_L`. -/ +def maximalUnramifiedToFiniteNormQuotient + (D : DegreeData G) (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + D.MaximalUnramifiedNormQuotient A K L →+ + FiniteNormQuotient A K L hLK := + D.maximalUnramifiedNormQuotientLift A K L + (finiteNormClassHom A K L hLK) + (by exact D.maximalUnramifiedNormSubgroup_le_finiteNormClassHom_ker A K L hLK) + +/-- The comparison to a finite norm quotient carries the maximal-unramified +class to its finite-level class. -/ +@[simp] +theorem maximalUnramifiedToFiniteNormQuotient_maximalUnramifiedNormClass + (D : DegreeData G) (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a : ambientFixedAddSubgroup A K) : + D.maximalUnramifiedToFiniteNormQuotient A K L hLK + (D.maximalUnramifiedNormClass A K L a) = + finiteNormClass A K L hLK a := by + exact D.maximalUnramifiedNormQuotientLift_maximalUnramifiedNormClass + A K L (finiteNormClassHom A K L hLK) + (D.maximalUnramifiedNormSubgroup_le_finiteNormClassHom_ker A K L hLK) a + +end DegreeData + +end quotientMaps + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitCorrection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitCorrection.lean new file mode 100644 index 0000000000..9e6e8e586f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitCorrection.lean @@ -0,0 +1,312 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteFieldUnitMaps + +/-! # Fixed Tower Unit Correction -/ + +@[expose] public section +universe u v + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +/-! +# Fixed-tower unit correction + +This module constructs the unit-valued correction term on a Frobenius +fixed-field tower and proves its coefficient and relative-norm identities. +-/ + +noncomputable +section + +open CategoryTheory +open scoped BigOperators + +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace ValuationData + +variable {D : DegreeData G} {A : Rep ℤ G} + +/-- The unit-valued correction term on the upper Frobenius fixed field. +This is the additive form of the right-hand side of the corrected equation. -/ +noncomputable def fixedTowerCorrection + (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : DegreeData.FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σn : D.FrobeniusElements K L hLK) + [Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (D.frobeniusFixedField K L hLK σn) + (le_baseField (D.frobeniusFixedField K L hLK σn)))] + {ι : Type v} (s : Finset ι) + (φ : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hφσn : φ * σn.1 = σn.1 * φ) + (τ : ι → K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hτσn : ∀ i, τ i * σn.1 = σn.1 * τ i) + (uBar : + v.unitAddSubgroup (D.frobeniusFixedAbstractField K L hLK σn)) + (uBarᵢ : ι → + v.unitAddSubgroup (D.frobeniusFixedAbstractField K L hLK σn)) : + v.unitAddSubgroup (D.frobeniusFixedAbstractField K L hLK σn) := + v.frobeniusFixedFieldUnitAction K L hLK σn φ hφσn uBar - + uBar - + ∑ i ∈ s, + (v.frobeniusFixedFieldUnitAction K L hLK σn + (τ i) (hτσn i) (uBarᵢ i) - uBarᵢ i) + +/-- +The underlying fixed-tower correction is the Frobenius difference minus the prescribed finite sum +of correction terms. +-/ +theorem fixedTowerCorrection_coe + (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : DegreeData.FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σn : D.FrobeniusElements K L hLK) + [Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (D.frobeniusFixedField K L hLK σn) + (le_baseField (D.frobeniusFixedField K L hLK σn)))] + {ι : Type v} (s : Finset ι) + (φ : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hφσn : φ * σn.1 = σn.1 * φ) + (τ : ι → K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hτσn : ∀ i, τ i * σn.1 = σn.1 * τ i) + (uBar : + v.unitAddSubgroup (D.frobeniusFixedAbstractField K L hLK σn)) + (uBarᵢ : ι → + v.unitAddSubgroup (D.frobeniusFixedAbstractField K L hLK σn)) : + (v.fixedTowerCorrection K L hLK σn s φ hφσn + τ hτσn uBar uBarᵢ).1 = + (v.frobeniusFixedFieldUnitAction K L hLK σn + φ hφσn uBar).1 - + uBar.1 - + ∑ i ∈ s, + ((v.frobeniusFixedFieldUnitAction K L hLK σn + (τ i) (hτσn i) (uBarᵢ i)).1 - (uBarᵢ i).1) := by + let inclusion := + (v.unitAddSubgroup (D.frobeniusFixedAbstractField K L hLK σn)).subtype + change inclusion (v.fixedTowerCorrection K L hLK σn s φ hφσn + τ hτσn uBar uBarᵢ) = + inclusion (v.frobeniusFixedFieldUnitAction K L hLK σn φ hφσn uBar) - + inclusion uBar - ∑ i ∈ s, + (inclusion (v.frobeniusFixedFieldUnitAction K L hLK σn + (τ i) (hτσn i) (uBarᵢ i)) - inclusion (uBarᵢ i)) + simp only [fixedTowerCorrection, map_sub, map_sum] + +/-- Applying the lower norm to the correction term gives zero. This is +the norm calculation immediately before the use of H⁻¹ = 0. -/ +theorem fixedTowerCorrection_relativeNorm_eq_zero + (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : DegreeData.FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ σn : D.FrobeniusElements K L hLK) + (hTS : (D.frobeniusFixedField K L hLK σn).toSubgroup ≤ + (D.frobeniusFixedField K L hLK σ).toSubgroup) + [Finite ((D.frobeniusFixedField K L hLK σ).toSubgroup ⧸ + extensionSubgroup (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField K L hLK σn) hTS)] + [Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (D.frobeniusFixedField K L hLK σ) + (le_baseField (D.frobeniusFixedField K L hLK σ)))] + [Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (D.frobeniusFixedField K L hLK σn) + (le_baseField (D.frobeniusFixedField K L hLK σn)))] + {ι : Type v} (s : Finset ι) + (φ : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hφσ : φ * σ.1 = σ.1 * φ) + (hφσn : φ * σn.1 = σn.1 * φ) + (τ : ι → K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hτσ : ∀ i, τ i * σ.1 = σ.1 * τ i) + (hτσn : ∀ i, τ i * σn.1 = σn.1 * τ i) + (u : + v.unitAddSubgroup (D.frobeniusFixedAbstractField K L hLK σ)) + (uᵢ : ι → + v.unitAddSubgroup (D.frobeniusFixedAbstractField K L hLK σ)) + (uBar : + v.unitAddSubgroup (D.frobeniusFixedAbstractField K L hLK σn)) + (uBarᵢ : ι → + v.unitAddSubgroup (D.frobeniusFixedAbstractField K L hLK σn)) + (huBar : relativeNorm A (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField K L hLK σn) hTS uBar.1 = u.1) + (huBarᵢ : ∀ i, + relativeNorm A (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField K L hLK σn) hTS + (uBarᵢ i).1 = (uᵢ i).1) + (hstar : + A.ρ (Quotient.out φ).1 u.1.1 - u.1.1 = + ∑ i ∈ s, + (A.ρ (Quotient.out (τ i)).1 (uᵢ i).1.1 - (uᵢ i).1.1)) : + relativeNorm A (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField K L hLK σn) hTS + (v.fixedTowerCorrection K L hLK σn s φ hφσn + τ hτσn uBar uBarᵢ).1 = 0 := by + dsimp only [DegreeData.frobeniusFixedAbstractField] at * + let u' : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σ) := + ⟨u.1.1, u.1.2⟩ + let uᵢ' (i : ι) : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σ) := + ⟨(uᵢ i).1.1, (uᵢ i).1.2⟩ + let uBar' : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σn) := + ⟨uBar.1.1, uBar.1.2⟩ + let uBarᵢ' (i : ι) : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σn) := + ⟨(uBarᵢ i).1.1, (uBarᵢ i).1.2⟩ + have hsumBar (f : ι → + v.unitAddSubgroup (D.frobeniusFixedAbstractField K L hLK σn)) : + ((∑ i ∈ s, f i).1.1 : A.V) = ∑ i ∈ s, (f i).1.1 := by + calc + ((∑ i ∈ s, f i).1.1 : A.V) = + (ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σn)).subtype + (∑ i ∈ s, (v.unitAddSubgroup + (D.frobeniusFixedAbstractField K L hLK σn)).subtype (f i)) := by + exact congrArg (ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σn)).subtype + (map_sum (v.unitAddSubgroup + (D.frobeniusFixedAbstractField K L hLK σn)).subtype f s) + _ = _ := map_sum + (ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σn)).subtype + (fun i => (v.unitAddSubgroup + (D.frobeniusFixedAbstractField K L hLK σn)).subtype (f i)) s + have hsumBar' (f : ι → ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σn)) : + ((∑ i ∈ s, f i).1 : A.V) = ∑ i ∈ s, (f i).1 := + map_sum (ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σn)).subtype f s + have hφVal : + ((D.frobeniusFixedFieldAction A K L hLK σn φ hφσn uBar').1 : A.V) = + A.ρ (Quotient.out φ).1 uBar.1.1 := by + simp [uBar'] + have hτVal (i : ι) : + ((D.frobeniusFixedFieldAction A K L hLK σn + (τ i) (hτσn i) (uBarᵢ' i)).1 : A.V) = + A.ρ (Quotient.out (τ i)).1 (uBarᵢ i).1.1 := by + simp [uBarᵢ'] + have hunitφVal : + ((v.frobeniusFixedFieldUnitAction K L hLK σn + φ hφσn uBar).1.1 : A.V) = + A.ρ (Quotient.out φ).1 uBar.1.1 := by + change ((D.frobeniusFixedFieldAction A K L hLK σn + φ hφσn uBar.1).1 : A.V) = _ + exact hφVal + have hunitτVal (i : ι) : + ((v.frobeniusFixedFieldUnitAction K L hLK σn + (τ i) (hτσn i) (uBarᵢ i)).1.1 : A.V) = + A.ρ (Quotient.out (τ i)).1 (uBarᵢ i).1.1 := by + change ((D.frobeniusFixedFieldAction A K L hLK σn + (τ i) (hτσn i) (uBarᵢ i).1).1 : A.V) = _ + exact hτVal i + have hsubAmbient (x y : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σn)) : + ((x - y).1 : A.V) = x.1 - y.1 := + map_sub (ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σn)).subtype x y + have hsumAmbient (f : ι → ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σn)) : + ((∑ i ∈ s, f i).1 : A.V) = ∑ i ∈ s, (f i).1 := + map_sum (ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σn)).subtype f s + have hcorrection : + (v.fixedTowerCorrection K L hLK σn s φ hφσn + τ hτσn uBar uBarᵢ).1 = + D.frobeniusFixedFieldAction A K L hLK σn + φ hφσn uBar' - + uBar' - + ∑ i ∈ s, + (D.frobeniusFixedFieldAction A K L hLK σn + (τ i) (hτσn i) (uBarᵢ' i) - uBarᵢ' i) := by + rw [v.fixedTowerCorrection_coe + K L hLK σn s φ hφσn τ hτσn uBar uBarᵢ] + rfl + rw [hcorrection] + simp only [map_sub, map_sum] + have hφEquiv : + relativeNorm A (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField K L hLK σn) hTS + (D.frobeniusFixedFieldAction A K L hLK σn + φ hφσn uBar') = + D.frobeniusFixedFieldAction A K L hLK σ + φ hφσ + (relativeNorm A (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField K L hLK σn) hTS uBar') := by + exact D.relativeNorm_frobeniusFixedFieldAction + A K L hLK σ σn hTS φ hφσ hφσn uBar' + rw [hφEquiv] + have hτEquiv (i : ι) : + relativeNorm A (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField K L hLK σn) hTS + (D.frobeniusFixedFieldAction A K L hLK σn + (τ i) (hτσn i) (uBarᵢ' i)) = + D.frobeniusFixedFieldAction A K L hLK σ + (τ i) (hτσ i) + (relativeNorm A (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField K L hLK σn) hTS (uBarᵢ' i)) := by + exact D.relativeNorm_frobeniusFixedFieldAction + A K L hLK σ σn hTS (τ i) (hτσ i) (hτσn i) (uBarᵢ' i) + simp_rw [hτEquiv] + have huBar' : + relativeNorm A (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField K L hLK σn) hTS uBar' = u' := by + exact huBar + have huBarᵢ' (i : ι) : + relativeNorm A (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField K L hLK σn) hTS (uBarᵢ' i) = uᵢ' i := by + exact huBarᵢ i + rw [huBar'] + simp_rw [huBarᵢ'] + apply Subtype.ext + have hsum : ((∑ i ∈ s, uᵢ i).1.1 : A.V) = + ∑ i ∈ s, (uᵢ i).1.1 := by + calc + ((∑ i ∈ s, uᵢ i).1.1 : A.V) = + (ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σ)).subtype + (∑ i ∈ s, (v.unitAddSubgroup + (D.frobeniusFixedAbstractField K L hLK σ)).subtype (uᵢ i)) := by + exact congrArg (ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σ)).subtype + (map_sum (v.unitAddSubgroup + (D.frobeniusFixedAbstractField K L hLK σ)).subtype uᵢ s) + _ = _ := map_sum + (ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σ)).subtype + (fun i => (v.unitAddSubgroup + (D.frobeniusFixedAbstractField K L hLK σ)).subtype (uᵢ i)) s + have hsum' (f : ι → ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σ)) : + ((∑ i ∈ s, f i).1 : A.V) = ∑ i ∈ s, (f i).1 := + map_sum (ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σ)).subtype f s + simpa [u', uᵢ', D.frobeniusFixedFieldAction_coe, + hsum, hsum', Finset.sum_sub_distrib] using + sub_eq_zero.mpr hstar + +end ValuationData +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitDescent.lean new file mode 100644 index 0000000000..1f725e7693 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitDescent.lean @@ -0,0 +1,658 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitCorrection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusQuotientDescent + +/-! # Fixed Tower Unit Descent -/ + +@[expose] public section +universe u v + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +/-! +# Unit descent on Frobenius fixed-field towers + +This module packages the fixed-tower action and power correction, applies +the unit-cohomology axiom, and proves the corrected universal norm-descent +equation on finite fixed-field towers. +-/ + +noncomputable +section + +open CategoryTheory +open scoped BigOperators + +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace ValuationData + +variable {D : DegreeData G} {A : Rep ℤ G} + +/-- The stabilizing action on the upper unit group, expressed directly on a +fixed-field tower. This is the bundle-native boundary used by the descent +construction. -/ +noncomputable def fixedTowerUnitAction + (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (T : DegreeData.FrobeniusFixedFieldTower D) + (q : T.ambientBase.field.toSubgroup ⧸ + D.extensionInertiaWithin T.ambientBase.field T.ambient.field + T.ambient.below) + (hq : q * T.fieldFrobenius.1 = T.fieldFrobenius.1 * q) : + v.unitAddSubgroup + (DegreeData.FrobeniusFixedFieldTower.field (G := G) (D := D) T) →+ + v.unitAddSubgroup + (DegreeData.FrobeniusFixedFieldTower.field (G := G) (D := D) T) := by + let TF := + D.frobeniusFixedAbstractField T.ambientBase T.ambient.field + T.ambient.below T.fieldFrobenius + have hTF : TF = T.field := by + apply FiniteAbstractField.eq_of_field_eq + rfl + exact hTF ▸ + v.frobeniusFixedFieldUnitAction T.ambientBase T.ambient.field + T.ambient.below T.fieldFrobenius q hq + +/-- The corrected upper unit associated with a power-fixed-field tower. +All fixed fields and finiteness witnesses are obtained from `P`; callers no +longer have to align independently constructed unit-group types. -/ +noncomputable def powerTowerCorrection + (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (P : DegreeData.FrobeniusPowerFixedFieldTower D) + {ι : Type v} (s : Finset ι) + (τ : ι → + (D.extensionNormalizedDegreeContinuous P.ambientBase P.ambient.field + P.ambient.below).toMonoidHom.ker) + (hτ : ∀ i, (τ i).1 * P.fieldFrobenius.1 = + P.fieldFrobenius.1 * (τ i).1) + (uBar : v.unitAddSubgroup + (DegreeData.FrobeniusFixedFieldTower.field (G := G) (D := D) + (DegreeData.FrobeniusPowerFixedFieldTower.toFrobeniusFixedFieldTower + (G := G) (D := D) P))) + (uBarᵢ : ι → v.unitAddSubgroup + (DegreeData.FrobeniusFixedFieldTower.field (G := G) (D := D) + (DegreeData.FrobeniusPowerFixedFieldTower.toFrobeniusFixedFieldTower + (G := G) (D := D) P))) : + v.unitAddSubgroup + (DegreeData.FrobeniusFixedFieldTower.field (G := G) (D := D) + (DegreeData.FrobeniusPowerFixedFieldTower.toFrobeniusFixedFieldTower + (G := G) (D := D) P)) := + let T := DegreeData.FrobeniusPowerFixedFieldTower.toFrobeniusFixedFieldTower + (G := G) (D := D) P + v.fixedTowerUnitAction T P.frobenius.1 P.frobenius_commute_field uBar - + uBar - + ∑ i ∈ s, + (v.fixedTowerUnitAction T (τ i).1 (hτ i) (uBarᵢ i) - uBarᵢ i) + +/-- The cyclic generator selected on the lower fixed field acts on the +upper unit group as the concrete quotient element defining that field. -/ +theorem unitRepresentation_generator_action_eq + (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (T : DegreeData.FrobeniusFixedFieldTower D) + (g : T.Representative) + (y : v.unitAddSubgroup + (DegreeData.FrobeniusFixedFieldTower.field (G := G) (D := D) T)) : + v.fixedTowerUnitAction T T.baseFrobenius.1 T.commute y = + ((v.unitRepresentation T.extension T.normal).ρ + (QuotientGroup.mk g.element) y : + v.unitAddSubgroup + (DegreeData.FrobeniusFixedFieldTower.field (G := G) (D := D) T)) := by + let gK : T.ambientBase.field.toSubgroup := + ⟨g.element.1, (D.frobeniusFixedField_le T.ambientBase T.ambient.field + T.ambient.below T.baseFrobenius) g.element.2⟩ + have hgKσ : + (QuotientGroup.mk gK : + T.ambientBase.field.toSubgroup ⧸ + D.extensionInertiaWithin T.ambientBase.field T.ambient.field + T.ambient.below) = T.baseFrobenius.1 := by + exact congrArg Subtype.val g.mapsToFrobenius + apply Subtype.ext + apply Subtype.ext + change A.ρ (Quotient.out T.baseFrobenius.1).1 y.1.1 = + A.ρ g.element.1 y.1.1 + calc + A.ρ (Quotient.out T.baseFrobenius.1).1 y.1.1 = + A.ρ gK.1 y.1.1 := by + calc + A.ρ (Quotient.out T.baseFrobenius.1).1 y.1.1 = + (D.frobeniusFixedFieldAction A T.ambientBase T.ambient.field + T.ambient.below T.fieldFrobenius T.baseFrobenius.1 + T.commute y.1).1 := by + exact (D.frobeniusFixedFieldAction_coe A T.ambientBase + T.ambient.field T.ambient.below T.fieldFrobenius + T.baseFrobenius.1 T.commute y.1).symm + _ = A.ρ gK.1 y.1.1 := by + exact D.frobeniusFixedFieldAction_coe_of_mk + A T.ambientBase T.ambient.field T.ambient.below + T.fieldFrobenius T.baseFrobenius.1 T.commute gK hgKσ y.1 + _ = A.ρ g.element.1 y.1.1 := rfl + +/-- The unit-cohomology axiom supplies the barred unit lifts and the corrected upper unit in +the exact power-fixed-field tower used. -/ +theorem universalNormDescent_fixedTower_solution + (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology) + (P : DegreeData.FrobeniusPowerFixedFieldTower D) + {ι : Type v} (s : Finset ι) + (τ : ι → + (D.extensionNormalizedDegreeContinuous P.ambientBase P.ambient.field + P.ambient.below).toMonoidHom.ker) + (hτσ : ∀ i, (τ i).1 * P.baseFrobenius.1 = + P.baseFrobenius.1 * (τ i).1) + (hτσn : ∀ i, (τ i).1 * P.fieldFrobenius.1 = + P.fieldFrobenius.1 * (τ i).1) + (u : v.unitAddSubgroup P.toFrobeniusFixedFieldTower.base) + (uᵢ : ι → v.unitAddSubgroup P.toFrobeniusFixedFieldTower.base) + (hstar : + A.ρ (Quotient.out P.frobenius.1).1 u.1.1 - u.1.1 = + ∑ i ∈ s, + (A.ρ (Quotient.out (τ i).1).1 (uᵢ i).1.1 - (uᵢ i).1.1)) : + let T : DegreeData.FrobeniusFixedFieldTower D := + DegreeData.FrobeniusPowerFixedFieldTower.toFrobeniusFixedFieldTower + (G := G) (D := D) P + ∃ (uBar : v.unitAddSubgroup + (DegreeData.FrobeniusFixedFieldTower.field (G := G) (D := D) T)) + (uBarᵢ : ι → v.unitAddSubgroup + (DegreeData.FrobeniusFixedFieldTower.field (G := G) (D := D) T)) + (yBar : v.unitAddSubgroup + (DegreeData.FrobeniusFixedFieldTower.field (G := G) (D := D) T)), + relativeNorm A T.extension.base.field T.extension.field.field + T.extension.below uBar.1 = u.1 ∧ + (∀ i, relativeNorm A T.extension.base.field T.extension.field.field + T.extension.below + (uBarᵢ i).1 = (uᵢ i).1) ∧ + v.fixedTowerUnitAction T P.baseFrobenius.1 T.commute yBar - yBar = + v.powerTowerCorrection P s τ hτσn uBar uBarᵢ := by + dsimp only + let K := P.ambientBase + let L := P.ambient.field + let hLK := P.ambient.below + let φ := P.frobenius + let hφ := P.exponent_one + let n := P.n + let hn := P.n_pos + let σ := P.baseFrobenius + let σn := P.fieldFrobenius + let tower := P.toFrobeniusFixedFieldTower + let S := tower.base.field + let T := tower.field.field + let SF := tower.base + let TF := tower.field + let hTS := tower.field_le_base + let hTSnormal : (extensionSubgroup S T hTS).Normal := tower.normal + let : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK) := + P.ambient.finite + let : Finite + (S.toSubgroup ⧸ extensionSubgroup S T hTS) := + tower.finiteQuotient + let : (extensionSubgroup S T hTS).Normal := hTSnormal + have hφσ : φ.1 * σ.1 = σ.1 * φ.1 := + P.frobenius_commute_base + have hφσn : φ.1 * σn.1 = σn.1 * φ.1 := + P.frobenius_commute_field + have hσσn : σ.1 * σn.1 = σn.1 * σ.1 := + tower.commute + have hTSunramified : (DegreeData.AbstractExtension.mk T S hTS).IsUnramified D := + D.frobeniusPowerFixedField_isUnramified K L hLK φ hφ n n hn hn + obtain ⟨gS, hgClosure, _hgDegree, hg⟩ := + D.frobeniusPowerFixedField_generator K L hLK φ hφ n n hn hn + let generator : tower.CyclicGenerator := + { element := gS + mapsToFrobenius := hgClosure + generates := hg } + let g : S.toSubgroup ⧸ extensionSubgroup S T hTS := QuotientGroup.mk gS + let : Fintype (S.toSubgroup ⧸ extensionSubgroup S T hTS) := + Fintype.ofFinite _ + let Kuc : FiniteAbstractField G := SF + let Euc : FiniteUnramifiedCyclicExtension D Kuc := + { field := T + below := hTS + normal := hTSnormal + finite := tower.finiteQuotient + generator := g + generates := hg + unramified := hTSunramified } + let E : FiniteAbstractFieldExtension G := Euc.toFiniteAbstractFieldExtension + have hEnormal : + (extensionSubgroup E.base.field E.field.field E.below).Normal := + Euc.normal + let : (extensionSubgroup E.base.field E.field.field E.below).Normal := + hEnormal + let : Fintype + (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) := + Fintype.ofFinite _ + have hEunramified : E.IsUnramified D := by + exact Euc.toFiniteAbstractFieldExtension_isUnramified + have hA : + CategoryTheory.Limits.IsZero + (tateCohomology (v.unitRepresentation E hEnormal) 0) ∧ + CategoryTheory.Limits.IsZero + (tateCohomology (v.unitRepresentation E hEnormal) (-1)) := by + simpa [E, hEnormal, + FiniteUnramifiedCyclicExtension.unitRepresentation] using + hAxiom Kuc Euc + obtain ⟨uBar, huBar⟩ := + v.exists_unit_relativeNorm_eq_of_tateHZero_isZero + E hEnormal hEunramified g hg hA.1 u + have huBarᵢ_exists (i : ι) : ∃ z : v.unitAddSubgroup TF, + relativeNorm A S T hTS z.1 = (uᵢ i).1 := + v.exists_unit_relativeNorm_eq_of_tateHZero_isZero + E hEnormal hEunramified g hg hA.1 (uᵢ i) + choose uBarᵢ huBarᵢ using huBarᵢ_exists + let delta : v.unitAddSubgroup TF := + v.powerTowerCorrection P s τ hτσn uBar uBarᵢ + have hfixedAction + (q : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hq : q * σn.1 = σn.1 * q) + (z : v.unitAddSubgroup TF) : + v.fixedTowerUnitAction tower q hq z = + v.frobeniusFixedFieldUnitAction K L hLK σn q hq z := by + apply Subtype.ext + apply Subtype.ext + change A.ρ (Quotient.out q).1 z.1.1 = + A.ρ (Quotient.out q).1 z.1.1 + rfl + have hdeltaRelativeNorm : relativeNorm A S T hTS delta.1 = 0 := by + have hdeltaAmbient : + delta.1 = + (v.fixedTowerCorrection K L hLK σn s φ.1 hφσn + (fun i => (τ i).1) hτσn uBar uBarᵢ).1 := by + have hdeltaUnit : + delta = + v.fixedTowerCorrection K L hLK σn s φ.1 hφσn + (fun i => (τ i).1) hτσn uBar uBarᵢ := by + simp [delta, powerTowerCorrection, + fixedTowerCorrection, tower, K, L, σn, + hfixedAction] + rfl + exact congrArg Subtype.val hdeltaUnit + rw [hdeltaAmbient] + let : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) (D.frobeniusFixedField K L hLK σ) + (le_baseField (D.frobeniusFixedField K L hLK σ))) := + tower.baseAbsoluteFinite + exact + v.fixedTowerCorrection_relativeNorm_eq_zero K L hLK σ σn hTS + s φ.1 hφσ hφσn (fun i => (τ i).1) hτσ hτσn + u uᵢ uBar uBarᵢ huBar huBarᵢ hstar + let U := v.unitRepresentation E hEnormal + have hdeltaNorm : U.norm.hom delta = 0 := by + apply Subtype.ext + apply Subtype.ext + calc + (((U.norm.hom delta).1 : ambientFixedAddSubgroup A T) : A.V) = + ((relativeNorm A S T hTS delta.1 : ambientFixedAddSubgroup A S) : A.V) := + v.unitRepresentation_norm_coe E hEnormal delta + _ = 0 := congrArg Subtype.val hdeltaRelativeNorm + _ = (((0 : v.unitAddSubgroup TF).1 : ambientFixedAddSubgroup A T) : A.V) := rfl + obtain ⟨yBar, hyBar⟩ := + v.exists_unit_sigma_sub_eq_of_tateHMinusOne_isZero + E hEnormal g hg hA.2 delta hdeltaNorm + have haction := + v.unitRepresentation_generator_action_eq + tower generator.toRepresentative yBar + have haction' : + v.fixedTowerUnitAction tower σ.1 hσσn yBar = U.ρ g yBar := by + apply Subtype.ext + apply Subtype.ext + calc + (v.fixedTowerUnitAction tower σ.1 hσσn yBar).1.1 = + (((v.unitRepresentation tower.extension tower.normal).ρ + (QuotientGroup.mk generator.element) yBar).1.1 : A.V) := + congrArg (fun z : v.unitAddSubgroup TF => z.1.1) haction + _ = (U.ρ g yBar).1.1 := by + rfl + refine ⟨uBar, uBarᵢ, yBar, huBar, huBarᵢ, ?_⟩ + rw [← haction'] at hyBar + apply Subtype.ext + apply Subtype.ext + exact congrArg (fun z : v.unitAddSubgroup TF => z.1.1) hyBar + +/-- The maximal-unramified norm of a relative norm in the power-fixed +tower is the corresponding orbit sum. This is the actual norm-enumeration +step behind the factor `z^n`. -/ +theorem maximalNorm_relativeNorm_fixedTower + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (v : ValuationData D A) + (FT : DegreeData.FiniteAmbientFrobeniusFixedFieldTower D) + (generator : FT.toFrobeniusFixedFieldTower.CyclicGenerator) + (n : ℕ) + (hcard : (FT.extension.degree : ℕ) = n) + (a : v.unitAddSubgroup + (DegreeData.FrobeniusFixedFieldTower.field (G := G) (D := D) + FT.toFrobeniusFixedFieldTower)) : + letI : Finite + ((D.maximalUnramifiedField FT.ambientBase.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField FT.ambientBase.field) + (D.maximalUnramifiedField FT.ambient.field) + (D.maximalUnramifiedField_mono FT.ambient.below)) := + D.maximalUnramifiedExtension_finite FT.ambientBase.field + FT.ambient.field FT.ambient.below + let Ext := FT.extension + let S := Ext.base.field + let T := Ext.field.field + let I := D.maximalUnramifiedField FT.ambientBase.field + let E := D.maximalUnramifiedField FT.ambient.field + let hTE : E.toSubgroup ≤ T.toSubgroup := by + change (D.maximalUnramifiedField FT.ambient.field).toSubgroup ≤ + (D.frobeniusFixedField FT.ambientBase FT.ambient.field + FT.ambient.below FT.fieldFrobenius).toSubgroup + rw [D.maximalUnramifiedField_eq_fieldInertia] + exact D.fieldInertia_le_frobeniusFixedField FT.ambientBase + FT.ambient.field FT.ambient.below FT.fieldFrobenius + let hSE : E.toSubgroup ≤ S.toSubgroup := by + change (D.maximalUnramifiedField FT.ambient.field).toSubgroup ≤ + (D.frobeniusFixedField FT.ambientBase FT.ambient.field + FT.ambient.below FT.baseFrobenius).toSubgroup + rw [D.maximalUnramifiedField_eq_fieldInertia] + exact D.fieldInertia_le_frobeniusFixedField FT.ambientBase + FT.ambient.field FT.ambient.below FT.baseFrobenius + let hEI := D.maximalUnramifiedField_mono FT.ambient.below + let N := relativeNorm A I E hEI + let J := fixedFieldInclusion A I E hEI + J (N (fixedFieldInclusion A S E hSE + (relativeNorm A S T Ext.below a.1))) = + D.frobeniusPowerSum A FT.ambientBase.field FT.ambient.field + FT.ambient.below FT.baseFrobenius.1 n + (J (N (fixedFieldInclusion A T E hTE a.1))) := by + dsimp only + let tower := FT.toFrobeniusFixedFieldTower + let K := FT.ambientBase + let L := FT.ambient.field + let hLK := FT.ambient.below + let σ := FT.baseFrobenius + let σ' := FT.fieldFrobenius + let hTS := FT.field_le_base + let hTSnormal : (extensionSubgroup FT.base.field FT.field.field hTS).Normal := + FT.normal + let gS := generator.element + let hgClosure := generator.mapsToFrobenius + let hg := generator.generates + let hσσ' := FT.commute + let : Finite + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K.field L hLK + let S := FT.base.field + let T := FT.field.field + let SF := FT.base + let TF := FT.field + let : Finite (S.toSubgroup ⧸ extensionSubgroup S T hTS) := + FT.finiteQuotient + let : (extensionSubgroup S T hTS).Normal := hTSnormal + let I := D.maximalUnramifiedField K.field + let E := D.maximalUnramifiedField L + let hTE : E.toSubgroup ≤ T.toSubgroup := by + change (D.maximalUnramifiedField L).toSubgroup ≤ + (D.frobeniusFixedField K L hLK σ').toSubgroup + rw [D.maximalUnramifiedField_eq_fieldInertia] + exact D.fieldInertia_le_frobeniusFixedField K L hLK σ' + let hSE : E.toSubgroup ≤ S.toSubgroup := by + change (D.maximalUnramifiedField L).toSubgroup ≤ + (D.frobeniusFixedField K L hLK σ).toSubgroup + rw [D.maximalUnramifiedField_eq_fieldInertia] + exact D.fieldInertia_le_frobeniusFixedField K L hLK σ + let hEI := D.maximalUnramifiedField_mono hLK + let N := relativeNorm A I E hEI + let J := fixedFieldInclusion A I E hEI + let Ext : FiniteAbstractFieldExtension G := FT.extension + have hExtNormal : + (extensionSubgroup Ext.base.field Ext.field.field Ext.below).Normal := + FT.normal + let : (extensionSubgroup Ext.base.field Ext.field.field Ext.below).Normal := + hExtNormal + let U := v.unitRepresentation Ext hExtNormal + let g : S.toSubgroup ⧸ extensionSubgroup S T hTS := QuotientGroup.mk gS + let f : v.unitAddSubgroup TF → v.unitAddSubgroup TF := + v.frobeniusFixedFieldUnitAction K L hLK σ' σ.1 hσσ' + let F : v.unitAddSubgroup TF →+ ambientFixedAddSubgroup A E := + (J.comp N).comp + ((fixedFieldInclusion A T E hTE).comp (v.unitAddSubgroup TF).subtype) + let act : ambientFixedAddSubgroup A E → ambientFixedAddSubgroup A E := + D.frobeniusQuotientAction A K.field L hLK σ.1 + have hsemiconj : Function.Semiconj F f act := by + intro z + have hIncl := D.frobeniusFixedFieldAction_inclusion A K L hLK + σ' σ.1 hσσ' z.1 + have hNorm := D.maximalUnramifiedNorm_frobeniusQuotientAction + A K.field L hLK σ.1 (fixedFieldInclusion A T E hTE z.1) + calc + F (f z) = J (N (D.frobeniusQuotientAction A K.field L hLK σ.1 + (fixedFieldInclusion A T E hTE z.1))) := by + apply congrArg (J.comp N) + exact hIncl + _ = D.frobeniusQuotientAction A K.field L hLK σ.1 + (J (N (fixedFieldInclusion A T E hTE z.1))) := hNorm + _ = act (F z) := rfl + let : Fintype (S.toSubgroup ⧸ extensionSubgroup S T hTS) := + Fintype.ofFinite _ + let : Fintype + (Ext.base.field.toSubgroup ⧸ + extensionSubgroup Ext.base.field Ext.field.field Ext.below) := by + change Fintype (S.toSubgroup ⧸ extensionSubgroup S T hTS) + infer_instance + have hcard' : Fintype.card + (S.toSubgroup ⧸ extensionSubgroup S T hTS) = n := by + calc + Fintype.card (S.toSubgroup ⧸ extensionSubgroup S T hTS) = + Nat.card (S.toSubgroup ⧸ extensionSubgroup S T hTS) := by + rw [Nat.card_eq_fintype_card] + _ = (Ext.degree : ℕ) := + Ext.toFiniteAbstractExtension.degree_coe.symm + _ = n := hcard + have hgen (z : v.unitAddSubgroup TF) : U.ρ g z = f z := + (v.unitRepresentation_generator_action_eq + tower generator.toRepresentative z).symm + have hRep := rep_norm_eq_generatorIterateSum U g hg n hcard' f hgen a + have hMapped : F (U.norm.hom a) = + ∑ i : Fin n, F ((f^[i.1]) a) := by + calc + F (U.norm.hom a) = F (∑ i : Fin n, (f^[i.1]) a) := + congrArg F hRep + _ = ∑ i : Fin n, F ((f^[i.1]) a) := + map_sum F (fun i : Fin n => (f^[i.1]) a) Finset.univ + have hMapped' : F (U.norm.hom a) = + ∑ i : Fin n, D.frobeniusQuotientAction A K.field L hLK + (σ.1 ^ i.1) (F a) := by + calc + F (U.norm.hom a) = ∑ i : Fin n, F ((f^[i.1]) a) := hMapped + _ = ∑ i : Fin n, (act^[i.1]) (F a) := by + apply Finset.sum_congr rfl + intro i _ + exact hsemiconj.iterate_right i.1 a + _ = _ := by + apply Finset.sum_congr rfl + intro i _ + let B := D.frobeniusQuotientRepresentation A K.field L hLK + have hpow := + (rep_action_pow_eq_iterate B σ.1 i.1 (F a)).symm + change + ((D.frobeniusQuotientAction A K.field L hLK σ.1)^[i.1]) (F a) = + D.frobeniusQuotientAction A K.field L hLK + (σ.1 ^ i.1) (F a) at hpow + simpa only [act] using hpow + have hLeft : F (U.norm.hom a) = + J (N (fixedFieldInclusion A S E hSE + (relativeNorm A S T hTS a.1))) := by + apply congrArg (J.comp N) + apply Subtype.ext + exact v.unitRepresentation_norm_coe Ext hExtNormal a + calc + J (N (fixedFieldInclusion A S E hSE + (relativeNorm A S T hTS a.1))) = F (U.norm.hom a) := hLeft.symm + _ = ∑ i : Fin n, D.frobeniusQuotientAction A K.field L hLK + (σ.1 ^ i.1) (F a) := hMapped' + _ = D.frobeniusPowerSum A K.field L hLK σ.1 n + (J (N (fixedFieldInclusion A T E hTE a.1))) := rfl + +/-- The corrected barred unit satisfies the original coinvariant equation +after inclusion into the maximal unramified field. -/ +theorem universalNormDescent_correctedEquation + (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : DegreeData.FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ σn : D.FrobeniusElements K L hLK) + {ι : Type v} (s : Finset ι) + (φ : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hφσn : φ * σn.1 = σn.1 * φ) + (τ : ι → + K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hτσn : ∀ i, τ i * σn.1 = σn.1 * τ i) + (hσσn : σ.1 * σn.1 = σn.1 * σ.1) + [hTabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (D.frobeniusFixedField K L hLK σn) + (le_baseField (D.frobeniusFixedField K L hLK σn)))] + (n : ℕ) + (hσpow : σ.1 = φ ^ n) + (uBar : v.unitAddSubgroup + (D.frobeniusFixedAbstractField K L hLK σn)) + (uBarᵢ : ι → v.unitAddSubgroup + (D.frobeniusFixedAbstractField K L hLK σn)) + (yBar : v.unitAddSubgroup + (D.frobeniusFixedAbstractField K L hLK σn)) + (hyBar : + v.frobeniusFixedFieldUnitAction K L hLK σn σ.1 hσσn yBar - yBar = + v.fixedTowerCorrection K L hLK σn s φ hφσn + τ hτσn uBar uBarᵢ) : + let E := D.maximalUnramifiedField L + let hTE := D.fieldInertia_le_frobeniusFixedField K L hLK σn + let uBarE := fixedFieldInclusion A + (D.frobeniusFixedField K L hLK σn) E hTE uBar.1 + let uBarᵢE := fun i => fixedFieldInclusion A + (D.frobeniusFixedField K L hLK σn) E hTE (uBarᵢ i).1 + let yBarE := fixedFieldInclusion A + (D.frobeniusFixedField K L hLK σn) E hTE yBar.1 + let w := uBarE - D.frobeniusPowerSum A K.field L hLK φ n yBarE + D.frobeniusQuotientAction A K.field L hLK φ w - w = + ∑ i ∈ s, + (D.frobeniusQuotientAction A K.field L hLK (τ i) (uBarᵢE i) - + uBarᵢE i) := by + dsimp only + let T := D.frobeniusFixedField K L hLK σn + let TF := D.frobeniusFixedAbstractField K L hLK σn + let E := D.maximalUnramifiedField L + let hTE := D.fieldInertia_le_frobeniusFixedField K L hLK σn + let uBarE := fixedFieldInclusion A T E hTE uBar.1 + let uBarᵢE := fun i => fixedFieldInclusion A T E hTE (uBarᵢ i).1 + let yBarE := fixedFieldInclusion A T E hTE yBar.1 + let φny := D.frobeniusPowerSum A K.field L hLK φ n yBarE + let w := uBarE - φny + have hdeltaCoe := v.fixedTowerCorrection_coe K L hLK σn + s φ hφσn τ hτσn uBar uBarᵢ + have hyVal := congrArg (fun z : v.unitAddSubgroup TF => z.1.1) hyBar + have hdeltaVal := congrArg + (fun z : ambientFixedAddSubgroup A TF.field => z.1) hdeltaCoe + have hdeltaVal' : + (v.fixedTowerCorrection K L hLK σn s φ hφσn + τ hτσn uBar uBarᵢ).1.1 = + A.ρ (Quotient.out φ).1 uBar.1.1 - uBar.1.1 - + ∑ i ∈ s, + (A.ρ (Quotient.out (τ i)).1 (uBarᵢ i).1.1 - + (uBarᵢ i).1.1) := by + change + (v.fixedTowerCorrection K L hLK σn s φ hφσn + τ hτσn uBar uBarᵢ).1.1 = + (AddSubgroup.subtype (ambientFixedAddSubgroup A TF.field)) + ((v.frobeniusFixedFieldUnitAction K L hLK σn + φ hφσn uBar).1 - + uBar.1 - ∑ i ∈ s, + ((v.frobeniusFixedFieldUnitAction K L hLK σn + (τ i) (hτσn i) (uBarᵢ i)).1 - (uBarᵢ i).1)) at hdeltaVal + rw [map_sub, map_sub, map_sum] at hdeltaVal + simp only [ValuationData.frobeniusFixedFieldUnitAction] at hdeltaVal + exact hdeltaVal + have hraw : + A.ρ (Quotient.out σ.1).1 yBar.1.1 - yBar.1.1 = + A.ρ (Quotient.out φ).1 uBar.1.1 - uBar.1.1 - + ∑ i ∈ s, + (A.ρ (Quotient.out (τ i)).1 (uBarᵢ i).1.1 - + (uBarᵢ i).1.1) := + hyVal.trans hdeltaVal' + have hcorrE : + D.frobeniusQuotientAction A K.field L hLK σ.1 yBarE - yBarE = + D.frobeniusQuotientAction A K.field L hLK φ uBarE - uBarE - + ∑ i ∈ s, + (D.frobeniusQuotientAction A K.field L hLK (τ i) (uBarᵢE i) - + uBarᵢE i) := by + apply Subtype.ext + change + (AddSubgroup.subtype (ambientFixedAddSubgroup A E)) + (D.frobeniusQuotientAction A K.field L hLK σ.1 yBarE - yBarE) = + (AddSubgroup.subtype (ambientFixedAddSubgroup A E)) + (D.frobeniusQuotientAction A K.field L hLK φ uBarE - uBarE - + ∑ i ∈ s, + (D.frobeniusQuotientAction A K.field L hLK (τ i) (uBarᵢE i) - + uBarᵢE i)) + rw [map_sub, map_sub, map_sum] + simp_rw [map_sub] + change + (D.frobeniusQuotientAction A K.field L hLK σ.1 yBarE).1 - yBarE.1 = + (D.frobeniusQuotientAction A K.field L hLK φ uBarE).1 - uBarE.1 - + ∑ i ∈ s, + ((D.frobeniusQuotientAction A K.field L hLK (τ i) (uBarᵢE i)).1 - + (uBarᵢE i).1) + simp_rw [D.frobeniusQuotientAction_coe_out] + exact hraw + have htel := D.frobeniusPowerSum_action_sub A K.field L hLK φ n yBarE + rw [← hσpow] at htel + have hw : + D.frobeniusQuotientAction A K.field L hLK φ w - w = + (D.frobeniusQuotientAction A K.field L hLK φ uBarE - uBarE) - + (D.frobeniusQuotientAction A K.field L hLK φ φny - φny) := by + dsimp [w] + apply Subtype.ext + change + (AddSubgroup.subtype (ambientFixedAddSubgroup A E)) + (D.frobeniusQuotientAction A K.field L hLK φ (uBarE - φny) - + (uBarE - φny)) = + (AddSubgroup.subtype (ambientFixedAddSubgroup A E)) + ((D.frobeniusQuotientAction A K.field L hLK φ uBarE - uBarE) - + (D.frobeniusQuotientAction A K.field L hLK φ φny - φny)) + rw [map_sub, map_sub, map_sub, map_sub] + change + (D.frobeniusQuotientAction A K.field L hLK φ (uBarE - φny)).1 - + (uBarE.1 - φny.1) = + ((D.frobeniusQuotientAction A K.field L hLK φ uBarE).1 - uBarE.1) - + ((D.frobeniusQuotientAction A K.field L hLK φ φny).1 - φny.1) + simp_rw [D.frobeniusQuotientAction_coe_out] + change + A.ρ (Quotient.out φ).1 (uBarE.1 - φny.1) - + (uBarE.1 - φny.1) = + (A.ρ (Quotient.out φ).1 uBarE.1 - uBarE.1) - + (A.ρ (Quotient.out φ).1 φny.1 - φny.1) + rw [map_sub] + abel + rw [hw, htel, hcorrE] + abel + +end ValuationData +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusClosureCommutation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusClosureCommutation.lean new file mode 100644 index 0000000000..6c0e7e11c5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusClosureCommutation.lean @@ -0,0 +1,178 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CoreFrobeniusNorm + +/-! # Frobenius Closure Commutation -/ + +@[expose] public section +universe u + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +/-! +# Frobenius-closure commutation + +This module promotes commutation with a Frobenius generator to its closed +procyclic subgroup and derives the conjugation identities for the associated +fixed field. +-/ + +noncomputable +section + +open CategoryTheory +open scoped BigOperators + +section frobeniusClosureCommutation + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- Commuting with the chosen generator means commuting with its closed +procyclic closure. -/ +theorem frobeniusClosure_commutes_of_commutes_generator (D : DegreeData G) + [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) + (q : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hq : q * σ.1 = σ.1 * q) + (c : D.frobeniusClosure K L hLK σ) : + q * c.1 = c.1 * q := by + let : IsClosed + (D.extensionInertiaWithin K.field L hLK : Set K.field.toSubgroup) := + D.extensionInertiaWithin_isClosed K L hLK + let : T2Space + (K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) := by + infer_instance + let Q := K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK + let X : Set Q := Set.range (fun _ : Unit => σ.1) + have hclosure : Subgroup.closure X ≤ + Subgroup.centralizer ({q} : Set Q) := by + rw [Subgroup.closure_le] + rintro x ⟨i, rfl⟩ + exact Subgroup.mem_centralizer_singleton_iff.mpr hq.symm + have htop : (Subgroup.closure X).topologicalClosure ≤ + Subgroup.centralizer ({q} : Set Q) := + Subgroup.topologicalClosure_minimal _ hclosure + (Set.isClosed_centralizer (M := Q) ({q} : Set Q)) + have hc : c.1 ∈ (Subgroup.closure X).topologicalClosure := c.2 + exact (Subgroup.mem_centralizer_singleton_iff.mp (htop hc)).symm + +/-- If a quotient element commutes with the Frobenius lift, its chosen +representative stabilizes the corresponding fixed field. -/ +theorem conjugate_frobeniusFixedField_eq_of_commutes (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) + (q : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hq : q * σ.1 = σ.1 * q) : + let k : K.field.toSubgroup := Quotient.out q + conjugateClosedSubgroup (D.frobeniusFixedField K L hLK σ) k.1⁻¹ = + D.frobeniusFixedField K L hLK σ := by + dsimp only + let T := D.frobeniusFixedField K L hLK σ + let k : K.field.toSubgroup := Quotient.out q + have hkq : + (QuotientGroup.mk k : + K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) = q := + Quotient.out_eq' q + ext x + change x ∈ conjugateClosedSubgroup + (D.frobeniusFixedField K L hLK σ) k.1⁻¹ ↔ + x ∈ D.frobeniusFixedField K L hLK σ + rw [conjugateClosedSubgroup_mem] + constructor + · intro hx + obtain ⟨t, htClosure, htx⟩ := hx + let xK : K.field.toSubgroup := ⟨x, by + have htK : t.1 ∈ K.field.toSubgroup := t.2 + have htxval : t.1 = k.1⁻¹ * x * k.1 := by simpa using htx + have : x = k.1 * t.1 * k.1⁻¹ := by + calc + x = k.1 * (k.1⁻¹ * x * k.1) * k.1⁻¹ := by simp [mul_assoc] + _ = k.1 * t.1 * k.1⁻¹ := by rw [htxval] + rw [this] + exact K.field.toSubgroup.mul_mem + (K.field.toSubgroup.mul_mem k.2 htK) (K.field.toSubgroup.inv_mem k.2)⟩ + have hcomm := D.frobeniusClosure_commutes_of_commutes_generator + K L hLK σ q hq ⟨QuotientGroup.mk t, htClosure⟩ + have hcomm' : q * QuotientGroup.mk t = QuotientGroup.mk t * q := hcomm + have hxClosure : QuotientGroup.mk xK ∈ + (D.frobeniusClosure K L hLK σ).toSubgroup := by + have hqconj : q * QuotientGroup.mk t * q⁻¹ = QuotientGroup.mk t := by + calc + q * QuotientGroup.mk t * q⁻¹ = + (QuotientGroup.mk t * q) * q⁻¹ := by rw [hcomm'] + _ = QuotientGroup.mk t := by simp + change QuotientGroup.mk xK ∈ + (D.frobeniusClosure K L hLK σ).toSubgroup + have hxval : xK = k * t * k⁻¹ := by + apply Subtype.ext + dsimp [xK] + have htxval : t.1 = k.1⁻¹ * x * k.1 := by simpa using htx + calc + x = k.1 * (k.1⁻¹ * x * k.1) * k.1⁻¹ := by simp [mul_assoc] + _ = k.1 * t.1 * k.1⁻¹ := by rw [htxval] + rw [hxval] + change (QuotientGroup.mk k : + K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) * + QuotientGroup.mk t * (QuotientGroup.mk k)⁻¹ ∈ + (D.frobeniusClosure K L hLK σ).toSubgroup + rw [hkq, hqconj] + exact htClosure + exact ⟨xK, hxClosure, rfl⟩ + · intro hx + obtain ⟨t, htClosure, htx⟩ := hx + let yK : K.field.toSubgroup := ⟨k.1⁻¹ * x * k.1, by + have htK : t.1 ∈ K.field.toSubgroup := t.2 + rw [← htx] + exact K.field.toSubgroup.mul_mem + (K.field.toSubgroup.mul_mem (K.field.toSubgroup.inv_mem k.2) htK) k.2⟩ + have hcomm := D.frobeniusClosure_commutes_of_commutes_generator + K L hLK σ q hq ⟨QuotientGroup.mk t, htClosure⟩ + have hcomm' : q * QuotientGroup.mk t = QuotientGroup.mk t * q := hcomm + have hyClosure : QuotientGroup.mk yK ∈ + (D.frobeniusClosure K L hLK σ).toSubgroup := by + have hqconj : q⁻¹ * QuotientGroup.mk t * q = QuotientGroup.mk t := by + calc + q⁻¹ * QuotientGroup.mk t * q = + q⁻¹ * (QuotientGroup.mk t * q) := by simp [mul_assoc] + _ = q⁻¹ * (q * QuotientGroup.mk t) := by rw [hcomm'] + _ = QuotientGroup.mk t := by simp + have hyval : yK = k⁻¹ * t * k := by + apply Subtype.ext + dsimp [yK] + have htxval : t.1 = x := by simpa using htx + rw [htxval] + rw [hyval] + change (QuotientGroup.mk k : + K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK)⁻¹ * + QuotientGroup.mk t * QuotientGroup.mk k ∈ + (D.frobeniusClosure K L hLK σ).toSubgroup + rw [hkq, hqconj] + exact htClosure + refine ⟨yK, hyClosure, ?_⟩ + simp [yK] + +end DegreeData + +end frobeniusClosureCommutation + +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusDescent.lean new file mode 100644 index 0000000000..a2df4a81f4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusDescent.lean @@ -0,0 +1,257 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusSemigroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusField + +/-! # Frobenius Descent -/ + +@[expose] public section +namespace ClassFormation + +open CyclicCohomology + +/-! +# The abstract reciprocity construction: descent from the Frobenius semigroup + +The two maps on `G(\widetilde L/K)`--restriction to `G(L/K)` and normalized +degree--are jointly injective. This is the group-theoretic fact used when two Frobenius lifts +have the same +restriction and degree. +-/ + +noncomputable +section + +variable {G : Type*} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- The image of `G_L` in `G_K / I_L`. -/ +def extensionImageInInertiaQuotient (D : DegreeData G) + (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] : + Subgroup (K.toSubgroup ⧸ D.extensionInertiaWithin K L hLK) := + (extensionSubgroup K L hLK).map + (QuotientGroup.mk' (D.extensionInertiaWithin K L hLK)) + +/-- The image of `G_L` in `G_K / I_L` is closed. This is the compact-image +step implicit in the Galois correspondence used. -/ +theorem extensionImageInInertiaQuotient_isClosed + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] : + IsClosed (D.extensionImageInInertiaQuotient K.field L hLK : Set + (K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK)) := by + let : IsClosed + (D.extensionInertiaWithin K.field L hLK : Set K.field.toSubgroup) := + D.extensionInertiaWithin_isClosed K L hLK + let E := extensionSubgroup K.field L hLK + have hEclosed : IsClosed (E : Set K.field.toSubgroup) := by + have hcarrier : (E : Set K.field.toSubgroup) = + ((fun x : K.field.toSubgroup => (x : G)) ⁻¹' (L : Set G)) := by + rfl + rw [hcarrier] + exact L.isClosed'.preimage continuous_subtype_val + let : E.FiniteIndex := + @Subgroup.finiteIndex_of_finite_quotient K.field.toSubgroup _ E hLfinite + have hEopen : IsOpen (E : Set K.field.toSubgroup) := + E.isOpen_of_isClosed_of_finiteIndex hEclosed + change IsClosed + ((QuotientGroup.mk' (D.extensionInertiaWithin K.field L hLK)) '' + (E : Set K.field.toSubgroup)) + exact (D.extensionImageInInertiaQuotient K.field L hLK).isClosed_of_isOpen + (QuotientGroup.isOpenMap_coe + (N := D.extensionInertiaWithin K.field L hLK) + (E : Set K.field.toSubgroup) hEopen) + +/-- A finite field fixed by both the relative inertia and one representative +of a Frobenius lift is contained in the lift's Frobenius fixed field. This +is the closed-subgroup minimality argument used in finiteness of the Frobenius fixed field. -/ +theorem frobeniusFixedField_le_of_inertia_le_of_lift_mem + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L M : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + (hMK : M.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hMfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field M hMK)] + (σ : D.FrobeniusElements K L hLK) + (hI : D.extensionInertiaWithin K.field L hLK ≤ + extensionSubgroup K.field M hMK) + (s : K.field.toSubgroup) + (hsM : s ∈ extensionSubgroup K.field M hMK) + (hsσ : (QuotientGroup.mk s : + K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) = σ.1) : + (D.frobeniusFixedField K L hLK σ).toSubgroup ≤ + M.toSubgroup := by + let H := D.extensionInertiaWithin K.field L hLK + let E := extensionSubgroup K.field M hMK + let Q := K.field.toSubgroup ⧸ H + let J : Subgroup Q := E.map (QuotientGroup.mk' H) + let : IsClosed (H : Set K.field.toSubgroup) := + D.extensionInertiaWithin_isClosed K L hLK + have hEclosed : IsClosed (E : Set K.field.toSubgroup) := by + have hcarrier : (E : Set K.field.toSubgroup) = + ((fun x : K.field.toSubgroup => (x : G)) ⁻¹' (M : Set G)) := by + rfl + rw [hcarrier] + exact M.isClosed'.preimage continuous_subtype_val + let : E.FiniteIndex := + @Subgroup.finiteIndex_of_finite_quotient K.field.toSubgroup _ E hMfinite + have hEopen : IsOpen (E : Set K.field.toSubgroup) := + E.isOpen_of_isClosed_of_finiteIndex hEclosed + have hJclosed : IsClosed (J : Set Q) := by + change IsClosed ((QuotientGroup.mk' H) '' (E : Set K.field.toSubgroup)) + exact J.isClosed_of_isOpen + (QuotientGroup.isOpenMap_coe (N := H) + (E : Set K.field.toSubgroup) hEopen) + have hσJ : σ.1 ∈ J := ⟨s, hsM, hsσ⟩ + have hClosureJ : + (D.frobeniusClosure K L hLK σ).toSubgroup ≤ J := by + change (Subgroup.closure + (Set.range (fun _ : Unit => σ.1))).topologicalClosure ≤ J + apply Subgroup.topologicalClosure_minimal + · rw [Subgroup.closure_le] + rintro q ⟨u, rfl⟩ + exact hσJ + · exact hJclosed + rintro g ⟨k, hkClosure, rfl⟩ + have hkJ : (QuotientGroup.mk k : Q) ∈ J := hClosureJ hkClosure + rcases hkJ with ⟨e, heE, heq⟩ + have hdiff : e⁻¹ * k ∈ H := QuotientGroup.eq.mp heq + have hdiffE : e⁻¹ * k ∈ E := hI hdiff + have hkE : k ∈ E := by + have hmul := E.mul_mem heE hdiffE + simpa [mul_assoc] using hmul + change (k : G) ∈ M + exact hkE + +/-- If a Frobenius lift restricts trivially to `L`, its fixed field contains +`L` (equivalently `G_Σ ≤ G_L`). -/ +theorem frobeniusFixedField_le_of_restriction_eq_one + (D : DegreeData G) [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (σ : D.FrobeniusElements K L hLK) + (hσ : D.frobeniusRestriction K L hLK σ = 1) : + (D.frobeniusFixedField K L hLK σ).toSubgroup ≤ + L.toSubgroup := by + let H := D.extensionInertiaWithin K.field L hLK + let E := extensionSubgroup K.field L hLK + let Q := K.field.toSubgroup ⧸ H + let J : Subgroup Q := D.extensionImageInInertiaQuotient K.field L hLK + have hσJ : σ.1 ∈ J := by + let k : K.field.toSubgroup := Quotient.out σ.1 + have hkq : QuotientGroup.mk k = σ.1 := Quotient.out_eq' σ.1 + have hkE : k ∈ E := by + have hq : (QuotientGroup.mk k : + K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK) = 1 := by + change D.extensionRestriction K.field L hLK + (QuotientGroup.mk k : K.field.toSubgroup ⧸ H) = 1 + rw [hkq] + exact hσ + simpa using QuotientGroup.eq.mp hq.symm + exact ⟨k, hkE, hkq⟩ + have hClosureJ : + (D.frobeniusClosure K L hLK σ).toSubgroup ≤ J := by + change (Subgroup.closure (Set.range (fun _ : Unit => σ.1))).topologicalClosure ≤ J + apply Subgroup.topologicalClosure_minimal + · rw [Subgroup.closure_le] + rintro q ⟨u, rfl⟩ + exact hσJ + · exact D.extensionImageInInertiaQuotient_isClosed K L hLK + rintro g ⟨k, hkClosure, rfl⟩ + have hkJ : (QuotientGroup.mk k : Q) ∈ J := hClosureJ hkClosure + rcases hkJ with ⟨e, heE, heq⟩ + have hdiff : e⁻¹ * k ∈ H := QuotientGroup.eq.mp heq + have hdiffE : e⁻¹ * k ∈ E := hdiff.1 + have hkE : k ∈ E := by + have := E.mul_mem heE hdiffE + simpa [mul_assoc] using this + change (k : G) ∈ L + exact hkE + +/-- Restriction and normalized degree jointly distinguish elements of +`G(\widetilde L/K)`. -/ +theorem extensionRestriction_normalizedDegree_joint_injective + (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] : + Function.Injective (fun q : + K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK => + (D.extensionRestriction K.field L hLK q, + D.extensionNormalizedDegree K L hLK q)) := by + intro q r hqr + refine Quotient.inductionOn₂' q r ?_ hqr + intro a b hab + apply QuotientGroup.eq.mpr + have hRestriction : QuotientGroup.mk a = + (QuotientGroup.mk b : + K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK) := by + exact congrArg Prod.fst hab + have hExtension : a⁻¹ * b ∈ extensionSubgroup K.field L hLK := + QuotientGroup.eq.mp hRestriction + have hDegree : D.normalizedDegree K a = + D.normalizedDegree K b := + congrArg Prod.snd hab + refine ⟨hExtension, ?_⟩ + rw [← D.normalizedDegree_ker K] + change D.normalizedDegree K (a⁻¹ * b) = 1 + rw [map_mul, map_inv, hDegree, inv_mul_cancel] + +/-- +`frobeniusRestriction` satisfies the multiplication formula `D.frobeniusRestriction K L hLK (σ * +τ) = D.frobeniusRestriction K L hLK σ * D.frobeniusRestriction K L hLK τ`. +-/ +@[simp] +theorem frobeniusRestriction_mul (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ τ : D.FrobeniusElements K L hLK) : + D.frobeniusRestriction K L hLK (σ * τ) = + D.frobeniusRestriction K L hLK σ * + D.frobeniusRestriction K L hLK τ := by + change D.extensionRestriction K.field L hLK (σ.1 * τ.1) = + D.extensionRestriction K.field L hLK σ.1 * + D.extensionRestriction K.field L hLK τ.1 + exact map_mul _ _ _ + +/-- Frobenius elements with equal restriction and equal normalized degree +are equal. -/ +theorem frobenius_eq_of_restriction_eq_of_degree_eq + (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + {σ τ : D.FrobeniusElements K L hLK} + (hRestriction : + D.frobeniusRestriction K L hLK σ = + D.frobeniusRestriction K L hLK τ) + (hDegree : + D.extensionNormalizedDegree K L hLK σ.1 = + D.extensionNormalizedDegree K L hLK τ.1) : + σ = τ := by + apply Subtype.ext + apply D.extensionRestriction_normalizedDegree_joint_injective + K L hLK + exact Prod.ext hRestriction hDegree + +end DegreeData + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusField.lean new file mode 100644 index 0000000000..1aeb0d9bf5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusField.lean @@ -0,0 +1,730 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusFixedField + +/-! # Frobenius Field -/ + +@[expose] public section +namespace ClassFormation + +open CyclicCohomology + +/-! +# The abstract reciprocity construction: the field fixed by a Frobenius lift + +This file passes from the group-dual `Γ` of the Frobenius fixed-field theorem to the actual +abstract field `Σ`. Thus `G_Σ` is the inverse image of `Γ` under +`G_K → G_K / I_L`, embedded back into the ambient profinite group. +-/ + +noncomputable +section + +variable {G : Type*} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- The subgroup `G_Σ ≤ G_K`: the inverse image of +`Γ = closure ⟨σ⟩` under `G_K → G_K / I_L`. -/ +def frobeniusFixedSubgroupWithin (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : Subgroup K.field.toSubgroup := + (D.frobeniusClosure K L hLK σ).toSubgroup.comap + (QuotientGroup.mk' (D.extensionInertiaWithin K.field L hLK)) + +/-- Membership in the internal Frobenius-fixed subgroup is characterized by +fixedness under Frobenius. -/ +@[simp] +theorem mem_frobeniusFixedSubgroupWithin_iff (D : DegreeData G) + [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) (k : K.field.toSubgroup) : + k ∈ D.frobeniusFixedSubgroupWithin K L hLK σ ↔ + QuotientGroup.mk k ∈ + (D.frobeniusClosure K L hLK σ).toSubgroup := + Iff.rfl + +/-- The Frobenius-fixed subgroup inside the extension subgroup is closed. -/ +theorem frobeniusFixedSubgroupWithin_isClosed (D : DegreeData G) + [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + IsClosed + (D.frobeniusFixedSubgroupWithin K L hLK σ : Set K.field.toSubgroup) := by + change IsClosed + ((QuotientGroup.mk' (D.extensionInertiaWithin K.field L hLK)) ⁻¹' + ((D.frobeniusClosure K L hLK σ).toSubgroup : Set + (K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK))) + exact (D.frobeniusClosure K L hLK σ).isClosed'.preimage + continuous_quotient_mk' + +/-- The actual abstract field `Σ` fixed by the chosen Frobenius lift. +Its absolute Galois subgroup is the inverse image of `Γ`, now regarded as +a closed subgroup of the ambient group `G`. -/ +def frobeniusFixedField (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : ClosedSubgroup G where + toSubgroup := + (D.frobeniusFixedSubgroupWithin K L hLK σ).map + K.field.toSubgroup.subtype + isClosed' := by + change IsClosed + (Subtype.val '' + (D.frobeniusFixedSubgroupWithin K L hLK σ : Set K.field.toSubgroup)) + exact K.field.isClosed'.isClosedEmbedding_subtypeVal.isClosedMap _ + (D.frobeniusFixedSubgroupWithin_isClosed K L hLK σ) + +/-- An element lies in the Frobenius fixed field exactly when Frobenius fixes its restriction. -/ +@[simp] +theorem mem_frobeniusFixedField_iff (D : DegreeData G) + [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) (g : G) : + g ∈ D.frobeniusFixedField K L hLK σ ↔ + ∃ k : K.field.toSubgroup, + k ∈ D.frobeniusFixedSubgroupWithin K L hLK σ ∧ k.1 = g := by + rfl + +/-- The field `Σ` extends `K`, i.e. `G_Σ ≤ G_K`. -/ +theorem frobeniusFixedField_le (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + (D.frobeniusFixedField K L hLK σ).toSubgroup ≤ K.field.toSubgroup := by + rintro g ⟨k, _, rfl⟩ + exact k.2 + +/-- Inside `G_K`, the subgroup attached to the actual field `Σ` is +literally the quotient-projection inverse image used in its definition. -/ +theorem extensionSubgroup_frobeniusFixedField (D : DegreeData G) + [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + extensionSubgroup K.field (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ) = + D.frobeniusFixedSubgroupWithin K L hLK σ := by + ext k + change + (k.1 ∈ D.frobeniusFixedField K L hLK σ) ↔ + k ∈ D.frobeniusFixedSubgroupWithin K L hLK σ + rw [D.mem_frobeniusFixedField_iff K L hLK σ] + constructor + · rintro ⟨t, ht, htk⟩ + have : t = k := by + apply Subtype.ext + exact htk + simpa [this] using ht + · intro hk + exact ⟨k, hk, rfl⟩ + +/-- The subgroup `I_L = G_{\widetilde L}` lies in `G_Σ`. -/ +theorem extensionInertiaWithin_le_frobeniusFixedSubgroupWithin + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + D.extensionInertiaWithin K.field L hLK ≤ + D.frobeniusFixedSubgroupWithin K L hLK σ := by + intro k hk + change QuotientGroup.mk k ∈ + (D.frobeniusClosure K L hLK σ).toSubgroup + rw [(QuotientGroup.eq_one_iff k).2 hk] + exact Subgroup.one_mem _ + +/-- Ambient form of `I_L ≤ G_Σ`. -/ +theorem fieldInertia_le_frobeniusFixedField (D : DegreeData G) + [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + (D.fieldInertia L).toSubgroup ≤ + (D.frobeniusFixedField K L hLK σ).toSubgroup := by + intro g hg + let k : K.field.toSubgroup := ⟨g, hLK hg.1⟩ + have hkE : k ∈ extensionSubgroup K.field L hLK := hg.1 + have hkI : k ∈ D.fieldInertiaWithin K.field := hg.2 + exact ⟨k, + D.extensionInertiaWithin_le_frobeniusFixedSubgroupWithin + K L hLK σ ⟨hkE, hkI⟩, + rfl⟩ + +/-- finiteness of the Frobenius fixed field on the actual field side: `Σ | K` is finite. -/ +theorem frobeniusFixedField_finite (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (σ : D.FrobeniusElements K L hLK) : + Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ)) := by + let N := D.extensionInertiaWithin K.field L hLK + let Q := K.field.toSubgroup ⧸ N + let Γ : Subgroup Q := + (D.frobeniusClosure K L hLK σ).toSubgroup + let S : Subgroup K.field.toSubgroup := + D.frobeniusFixedSubgroupWithin K L hLK σ + let : Finite (Q ⧸ Γ) := by + simpa [Q, Γ, N] using + D.frobeniusFixedField_finiteIndex K L hLK σ + have hΓ : Γ.index ≠ 0 := Γ.index_ne_zero_of_finite + have hS : S.index ≠ 0 := by + rw [show S = Γ.comap (QuotientGroup.mk' N) by rfl] + rw [Subgroup.index_comap_of_surjective Γ + (QuotientGroup.mk'_surjective N)] + exact hΓ + apply Nat.finite_of_card_ne_zero + change + (extensionSubgroup K.field (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ)).index ≠ 0 + rw [D.extensionSubgroup_frobeniusFixedField K L hLK σ] + exact hS + +/-- The Frobenius fixed field bundled with its finite extension data. -/ +def frobeniusFixedFiniteExtension (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (σ : D.FrobeniusElements K L hLK) : + FiniteAbstractExtension G where + field := D.frobeniusFixedField K L hLK σ + base := K.field + below := D.frobeniusFixedField_le K L hLK σ + finiteQuotient := D.frobeniusFixedField_finite K L hLK σ + +/-- finiteness of the Frobenius fixed field, with the index estimate from the proof exposed on +the actual-field side. For a degree-one lift, `[Σ : K] ≤ [L : K]`. -/ +theorem frobeniusFixedField_index_le_extensionIndex_of_exponent_eq_one + (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (σ : D.FrobeniusElements K L hLK) + (hσ : D.frobeniusExponent K L hLK σ = 1) : + (extensionSubgroup K.field (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ)).index ≤ + (extensionSubgroup K.field L hLK).index := by + let N := D.extensionInertiaWithin K.field L hLK + let Q := K.field.toSubgroup ⧸ N + let Γ : Subgroup Q := + (D.frobeniusClosure K L hLK σ).toSubgroup + let S : Subgroup K.field.toSubgroup := + D.frobeniusFixedSubgroupWithin K L hLK σ + rw [D.extensionSubgroup_frobeniusFixedField K L hLK σ] + change S.index ≤ (extensionSubgroup K.field L hLK).index + rw [show S = Γ.comap (QuotientGroup.mk' N) by rfl] + rw [Subgroup.index_comap_of_surjective Γ + (QuotientGroup.mk'_surjective N)] + exact D.frobeniusClosure_index_le_extensionIndex_of_exponent_eq_one + K L hLK σ hσ + +/-- The procyclic degree isomorphism, faithfully pulled back along +`G_K → G_K / I_L`: `G_Σ ∩ I_K = I_L`. This is the subgroup form of +the equality `\widetilde Σ = \widetilde L`. -/ +theorem frobeniusFixedSubgroupWithin_inf_fieldInertiaWithin + (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + D.frobeniusFixedSubgroupWithin K L hLK σ ⊓ + D.fieldInertiaWithin K.field = + D.extensionInertiaWithin K.field L hLK := by + apply le_antisymm + · intro k hk + let a : D.frobeniusClosure K L hLK σ := + ⟨QuotientGroup.mk k, hk.1⟩ + have hda : D.fixedFieldNormalizedDegree K L hLK σ a = 1 := by + apply Multiplicative.ext + apply zHatMulNat_injective + (D.frobeniusExponent_pos K L hLK σ) + change D.frobeniusExponent K L hLK σ • + (D.fixedFieldNormalizedDegree K L hLK σ a).toAdd = + D.frobeniusExponent K L hLK σ • (1 : ZHatMul).toAdd + rw [D.frobeniusExponent_nsmul_fixedFieldNormalizedDegree] + change (D.normalizedDegree K k).toAdd = + D.frobeniusExponent K L hLK σ • (1 : ZHatMul).toAdd + have hdk : D.normalizedDegree K k = 1 := by + change k ∈ (D.normalizedDegree K).toMonoidHom.ker + rw [D.normalizedDegree_ker K] + exact hk.2 + rw [hdk] + simp + have ha : a = 1 := by + apply D.frobeniusFixedField_normalizedDegree_injective K L hLK σ + simpa using hda + apply (QuotientGroup.eq_one_iff k).mp + exact congrArg Subtype.val ha + · intro k hk + exact + ⟨D.extensionInertiaWithin_le_frobeniusFixedSubgroupWithin + K L hLK σ hk, + hk.2⟩ + +/-- Ambient version of the procyclic degree isomorphism: the maximal unramified +extensions of `Σ` and `L` have the same absolute Galois subgroup. -/ +theorem frobeniusFixedField_fieldInertia (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + D.fieldInertia (D.frobeniusFixedField K L hLK σ) = + D.fieldInertia L := by + ext g + constructor + · intro hg + obtain ⟨k, hkS, hkg⟩ := hg.1 + have hgdeg : D.degree g = 1 := hg.2 + have hkI : k ∈ D.fieldInertiaWithin K.field := by + change D.degree k.1 = 1 + exact (congrArg D.degree hkg).trans hgdeg + have hkN : k ∈ D.extensionInertiaWithin K.field L hLK := by + rw [← D.frobeniusFixedSubgroupWithin_inf_fieldInertiaWithin + K L hLK σ] + exact ⟨hkS, hkI⟩ + exact ⟨hkg ▸ hkN.1, hg.2⟩ + · intro hg + let k : K.field.toSubgroup := ⟨g, hLK hg.1⟩ + have hgdeg : D.degree g = 1 := hg.2 + have hkE : k ∈ extensionSubgroup K.field L hLK := hg.1 + have hkI : k ∈ D.fieldInertiaWithin K.field := hgdeg + have hkS : k ∈ D.frobeniusFixedSubgroupWithin K L hLK σ := + D.extensionInertiaWithin_le_frobeniusFixedSubgroupWithin + K L hLK σ ⟨hkE, hkI⟩ + exact ⟨⟨k, hkS, rfl⟩, hg.2⟩ + +/-- The normalized-degree image of the actual subgroup `G_Σ ≤ G_K` is +the image already computed on the group-dual `Γ`. -/ +theorem frobeniusFixedSubgroupWithin_normalizedDegree_image + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + (D.frobeniusFixedSubgroupWithin K L hLK σ).map + (D.normalizedDegree K).toMonoidHom = + (D.frobeniusClosureDegree K L hLK σ).toMonoidHom.range := by + ext z + constructor + · rintro ⟨k, hk, rfl⟩ + exact ⟨⟨QuotientGroup.mk k, hk⟩, rfl⟩ + · rintro ⟨a, rfl⟩ + obtain ⟨k, hk⟩ := QuotientGroup.mk'_surjective + (D.extensionInertiaWithin K.field L hLK) a.1 + have hkS : k ∈ D.frobeniusFixedSubgroupWithin K L hLK σ := by + change (QuotientGroup.mk' (D.extensionInertiaWithin K.field L hLK)) k ∈ + (D.frobeniusClosure K L hLK σ).toSubgroup + exact hk.symm ▸ a.2 + refine ⟨k, hkS, ?_⟩ + calc + D.normalizedDegree K k = + D.extensionNormalizedDegree K L hLK + ((QuotientGroup.mk' (D.extensionInertiaWithin K.field L hLK)) k) := + (D.extensionNormalizedDegree_mk K L hLK k).symm + _ = D.extensionNormalizedDegree K L hLK a.1 := + congrArg (D.extensionNormalizedDegree K L hLK) hk + +private theorem frobeniusFixedField_mappedRelIndex (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + ((D.frobeniusFixedField K L hLK σ).toSubgroup.map + D.degree.toMonoidHom).relIndex + (K.field.toSubgroup.map D.degree.toMonoidHom) = + D.frobeniusExponent K L hLK σ := by + let S : Subgroup K.field.toSubgroup := + D.frobeniusFixedSubgroupWithin K L hLK σ + let dK : K.field.toSubgroup →* ZHatMul := + (D.normalizedDegree K).toMonoidHom + let scale : ZHatMul →* ZHatMul := + (zHatPowNat (K.residueDegree : ℕ)).toMonoidHom + have hraw : (D.restrictedDegree K.field).toMonoidHom = scale.comp dK := by + apply MonoidHom.ext + intro k + apply Multiplicative.ext + exact (D.residueDegree_nsmul_normalizedDegree K k).symm + have hSigmaImage : + (D.frobeniusFixedField K L hLK σ).toSubgroup.map + D.degree.toMonoidHom = + S.map (D.restrictedDegree K.field).toMonoidHom := by + ext z + constructor + · rintro ⟨g, hg, rfl⟩ + obtain ⟨k, hk, hkg⟩ := hg + refine ⟨k, hk, ?_⟩ + exact congrArg D.degree hkg + · rintro ⟨k, hk, rfl⟩ + exact ⟨k.1, ⟨k, hk, rfl⟩, rfl⟩ + have hKimage : + K.field.toSubgroup.map D.degree.toMonoidHom = + (⊤ : Subgroup K.field.toSubgroup).map + (D.restrictedDegree K.field).toMonoidHom := by + ext z + constructor + · rintro ⟨g, hg, rfl⟩ + exact ⟨⟨g, hg⟩, trivial, rfl⟩ + · rintro ⟨k, _, rfl⟩ + exact ⟨k.1, k.2, rfl⟩ + have hscale : Function.Injective scale := by + intro x y hxy + apply Multiplicative.ext + apply zHatMulNat_injective K.residueDegree.property + exact congrArg Multiplicative.toAdd hxy + have htop : (⊤ : Subgroup K.field.toSubgroup).map dK = ⊤ := by + apply top_unique + intro z _ + obtain ⟨k, hk⟩ := D.normalizedDegree_surjective K z + exact ⟨k, trivial, hk⟩ + rw [hSigmaImage, hKimage, hraw] + rw [← Subgroup.map_map, ← Subgroup.map_map] + rw [Subgroup.relIndex_map_map_of_injective _ _ hscale] + rw [show S.map dK = + (D.frobeniusClosureDegree K L hLK σ).toMonoidHom.range by + simpa [S, dK] using + D.frobeniusFixedSubgroupWithin_normalizedDegree_image + K L hLK σ] + rw [htop, Subgroup.relIndex_top_right, + D.frobeniusClosureDegree_range K L hLK σ, + AddSubgroup.index_toSubgroup, + zHatMulNat_range_index _ + (D.frobeniusExponent_pos K L hLK σ)] + +/-- The Frobenius fixed-field residue-degree formula on the finite extension +object: `f_{Σ|K} = d_K(σ)`. -/ +theorem frobeniusFixedField_residueDegreeOverBase (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (σ : D.FrobeniusElements K L hLK) : + ((D.frobeniusFixedFiniteExtension K L hLK σ).residueDegree D : ℕ) = + D.frobeniusExponent K L hLK σ := by + let E := D.frobeniusFixedFiniteExtension K L hLK σ + rw [← E.mapped_relIndex_eq_residueDegree D] + simpa [E, frobeniusFixedFiniteExtension] using + D.frobeniusFixedField_mappedRelIndex K L hLK σ + +/-- The actual relative residue quotient of the Frobenius fixed field over +`K` is finite. Positivity of the computed mapped relative index gives an +honest finite-index witness before any natural-valued cardinality is formed. -/ +theorem frobeniusFixedField_relativeResidueQuotientFinite + (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + Finite + (↥(K.field.toSubgroup.map D.degree.toMonoidHom) ⧸ + ((D.frobeniusFixedField K L hLK σ).toSubgroup.map + D.degree.toMonoidHom).subgroupOf + (K.field.toSubgroup.map D.degree.toMonoidHom)) := by + apply (Subgroup.index_ne_zero_iff_finite).mp + change ((D.frobeniusFixedField K L hLK σ).toSubgroup.map + D.degree.toMonoidHom).relIndex + (K.field.toSubgroup.map D.degree.toMonoidHom) ≠ 0 + rw [D.frobeniusFixedField_mappedRelIndex K L hLK σ] + exact (D.frobeniusExponent_pos K L hLK σ).ne' + +/-- The Frobenius fixed field equipped with its actual finite absolute +residue quotient. -/ +noncomputable def frobeniusFixedResidueField (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + FiniteResidueAbstractField D := by + letI := D.frobeniusFixedField_relativeResidueQuotientFinite K L hLK σ + exact FiniteResidueAbstractField.ofRelativeInclusion D + (D.frobeniusFixedField K L hLK σ) K + (D.frobeniusFixedField_le K L hLK σ) + +/-- Absolute residue-degree formula, now stated only through positive +natural invariants of honest finite quotient bundles. -/ +theorem frobeniusFixedResidueField_residueDegree (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + ((D.frobeniusFixedResidueField K L hLK σ).residueDegree : ℕ) = + D.frobeniusExponent K L hLK σ * (K.residueDegree : ℕ) := by + let Sigma := D.frobeniusFixedResidueField K L hLK σ + let E : AbstractExtension G := { + field := D.frobeniusFixedField K L hLK σ + base := K.field + below := D.frobeniusFixedField_le K L hLK σ + } + let := D.frobeniusFixedField_relativeResidueQuotientFinite K L hLK σ + have hrelative : + E.relativeResidueDegreeCardinal D = + (D.frobeniusExponent K L hLK σ : Cardinal) := by + rw [AbstractExtension.relativeResidueDegreeCardinal] + change Cardinal.mk + (↥(K.field.toSubgroup.map D.degree.toMonoidHom) ⧸ + ((D.frobeniusFixedField K L hLK σ).toSubgroup.map + D.degree.toMonoidHom).subgroupOf + (K.field.toSubgroup.map D.degree.toMonoidHom)) = _ + rw [← Nat.cast_card] + exact_mod_cast D.frobeniusFixedField_mappedRelIndex K L hLK σ + have hcard := + E.relativeResidueDegreeCardinal_mul_residueDegreeCardinal D + change E.relativeResidueDegreeCardinal D * + D.residueDegreeCardinal K.field = + D.residueDegreeCardinal Sigma.field at hcard + rw [hrelative, K.residueDegreeCardinal_eq_coe, + Sigma.residueDegreeCardinal_eq_coe] at hcard + exact_mod_cast hcard.symm + +/-- Restriction from the actual group `G_Σ` to the group-dual `Γ`. -/ +def frobeniusFixedFieldToClosure (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + (D.frobeniusFixedField K L hLK σ).toSubgroup →* + D.frobeniusClosure K L hLK σ where + toFun s := by + let k : K.field.toSubgroup := + Subgroup.inclusion (D.frobeniusFixedField_le K L hLK σ) s + refine ⟨QuotientGroup.mk k, ?_⟩ + have hk : k ∈ + extensionSubgroup K.field (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ) := s.2 + rw [D.extensionSubgroup_frobeniusFixedField K L hLK σ] at hk + exact hk + map_one' := by + apply Subtype.ext + rfl + map_mul' := by + intro a b + apply Subtype.ext + rfl + +/-- The map from the Frobenius fixed field to the closure evaluates by the underlying inclusion. -/ +@[simp] +theorem frobeniusFixedFieldToClosure_apply (D : DegreeData G) + [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) + (s : (D.frobeniusFixedField K L hLK σ).toSubgroup) : + (D.frobeniusFixedFieldToClosure K L hLK σ s).1 = + QuotientGroup.mk + (Subgroup.inclusion + (D.frobeniusFixedField_le K L hLK σ) s) := + rfl + +/-- Every element of the Frobenius closure lifts from the Frobenius fixed field. -/ +theorem frobeniusFixedFieldToClosure_surjective (D : DegreeData G) + [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + Function.Surjective (D.frobeniusFixedFieldToClosure K L hLK σ) := by + intro a + obtain ⟨k, hk⟩ := QuotientGroup.mk'_surjective + (D.extensionInertiaWithin K.field L hLK) a.1 + have hkS : k ∈ D.frobeniusFixedSubgroupWithin K L hLK σ := by + change (QuotientGroup.mk' (D.extensionInertiaWithin K.field L hLK)) k ∈ + (D.frobeniusClosure K L hLK σ).toSubgroup + exact hk.symm ▸ a.2 + let s : (D.frobeniusFixedField K L hLK σ).toSubgroup := + ⟨k.1, ⟨k, hkS, rfl⟩⟩ + refine ⟨s, ?_⟩ + apply Subtype.ext + exact hk + +/-- The kernel of restriction `G_Σ → Γ` is precisely `I_Σ`; by +the procyclic degree isomorphism, this is also `I_L`. -/ +theorem frobeniusFixedFieldToClosure_ker (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + (D.frobeniusFixedFieldToClosure K L hLK σ).ker = + D.fieldInertiaWithin (D.frobeniusFixedField K L hLK σ) := by + ext s + let k : K.field.toSubgroup := + Subgroup.inclusion (D.frobeniusFixedField_le K L hLK σ) s + have hkS : k ∈ D.frobeniusFixedSubgroupWithin K L hLK σ := by + have hk : k ∈ + extensionSubgroup K.field (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ) := s.2 + rw [D.extensionSubgroup_frobeniusFixedField K L hLK σ] at hk + exact hk + constructor + · intro hs + have hq : QuotientGroup.mk k = 1 := + congrArg Subtype.val hs + have hkN : k ∈ D.extensionInertiaWithin K.field L hLK := + (QuotientGroup.eq_one_iff k).mp hq + exact hkN.2 + · intro hs + have hkI : k ∈ D.fieldInertiaWithin K.field := hs + have hkN : k ∈ D.extensionInertiaWithin K.field L hLK := by + rw [← D.frobeniusFixedSubgroupWithin_inf_fieldInertiaWithin + K L hLK σ] + exact ⟨hkS, hkI⟩ + apply Subtype.ext + exact (QuotientGroup.eq_one_iff k).mpr hkN + +/-- The canonical identification +`G_Σ / I_Σ ≃ Γ = Gal(\widetilde L / Σ)`. -/ +def frobeniusFixedFieldQuotientEquiv (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + ((D.frobeniusFixedField K L hLK σ).toSubgroup ⧸ + D.fieldInertiaWithin (D.frobeniusFixedField K L hLK σ)) ≃* + D.frobeniusClosure K L hLK σ := + (QuotientGroup.quotientMulEquivOfEq + (D.frobeniusFixedFieldToClosure_ker K L hLK σ).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (D.frobeniusFixedFieldToClosure K L hLK σ) + (D.frobeniusFixedFieldToClosure_surjective K L hLK σ)) + +/-- The Frobenius fixed-field quotient equivalence has the expected value on representatives. -/ +@[simp] +theorem frobeniusFixedFieldQuotientEquiv_mk (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) + (s : (D.frobeniusFixedField K L hLK σ).toSubgroup) : + D.frobeniusFixedFieldQuotientEquiv K L hLK σ + (QuotientGroup.mk s) = + D.frobeniusFixedFieldToClosure K L hLK σ s := by + rfl + +/-- The normalized degree constructed on `Γ` in the Frobenius fixed-field theorem is exactly +the intrinsic normalized degree of the actual field `Σ`. -/ +theorem frobeniusFixedField_normalizedDegree_compatibility (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) + (s : (D.frobeniusFixedField K L hLK σ).toSubgroup) : + D.fixedFieldNormalizedDegree K L hLK σ + (D.frobeniusFixedFieldToClosure K L hLK σ s) = + D.normalizedDegree (D.frobeniusFixedResidueField K L hLK σ) s := by + let Sigma := D.frobeniusFixedResidueField K L hLK σ + let a : D.frobeniusClosure K L hLK σ := + D.frobeniusFixedFieldToClosure K L hLK σ s + let k : K.field.toSubgroup := + Subgroup.inclusion (D.frobeniusFixedField_le K L hLK σ) s + let n := D.frobeniusExponent K L hLK σ + apply Multiplicative.ext + apply zHatMulNat_injective Sigma.residueDegree.property + change (Sigma.residueDegree : ℕ) • + (D.fixedFieldNormalizedDegree K L hLK σ a).toAdd = + (Sigma.residueDegree : ℕ) • (D.normalizedDegree Sigma s).toAdd + calc + (Sigma.residueDegree : ℕ) • + (D.fixedFieldNormalizedDegree K L hLK σ a).toAdd = + (K.residueDegree : ℕ) • + (n • (D.fixedFieldNormalizedDegree K L hLK σ a).toAdd) := by + rw [show (Sigma.residueDegree : ℕ) = + n * (K.residueDegree : ℕ) by + simpa [Sigma, n] using + D.frobeniusFixedResidueField_residueDegree K L hLK σ] + rw [smul_smul, Nat.mul_comm] + _ = (K.residueDegree : ℕ) • + (D.frobeniusClosureDegree K L hLK σ a).toAdd := by + rw [D.frobeniusExponent_nsmul_fixedFieldNormalizedDegree] + _ = (K.residueDegree : ℕ) • (D.normalizedDegree K k).toAdd := by + rfl + _ = (D.degree s.1).toAdd := by + exact D.residueDegree_nsmul_normalizedDegree K k + _ = (Sigma.residueDegree : ℕ) • + (D.normalizedDegree Sigma s).toAdd := by + exact (D.residueDegree_nsmul_normalizedDegree Sigma s).symm + +/-- Quotient-level form of normalized-degree compatibility. -/ +theorem frobeniusFixedFieldQuotientEquiv_degree (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) + (q : (D.frobeniusFixedField K L hLK σ).toSubgroup ⧸ + D.fieldInertiaWithin (D.frobeniusFixedField K L hLK σ)) : + D.fixedFieldNormalizedDegree K L hLK σ + (D.frobeniusFixedFieldQuotientEquiv K L hLK σ q) = + D.maximalUnramifiedDegreeEquiv + (D.frobeniusFixedResidueField K L hLK σ) q := by + refine Quotient.inductionOn' q ?_ + intro s + exact D.frobeniusFixedField_normalizedDegree_compatibility + K L hLK σ s + +/-- The Frobenius characterization of the chosen lift for the fixed field `Σ`: under the canonical +identification with `Γ`, its Frobenius is the originally chosen lift `σ`. -/ +theorem frobeniusFixedField_frobenius_eq_inClosure (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + D.frobeniusFixedFieldQuotientEquiv K L hLK σ + (D.frobenius (D.frobeniusFixedResidueField K L hLK σ)) = + D.frobeniusInClosure K L hLK σ := by + apply D.frobeniusFixedField_normalizedDegree_injective K L hLK σ + exact (D.frobeniusFixedFieldQuotientEquiv_degree K L hLK σ + (D.frobenius (D.frobeniusFixedResidueField K L hLK σ))).trans + ((D.maximalUnramifiedDegreeEquiv_frobenius + (D.frobeniusFixedResidueField K L hLK σ)).trans + (D.fixedFieldNormalizedDegree_generator K L hLK σ).symm) + +end DegreeData + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldAction.lean new file mode 100644 index 0000000000..08cb02657c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldAction.lean @@ -0,0 +1,324 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UniversalNormDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusClosureCommutation + +/-! # Frobenius Fixed Field Action -/ + +@[expose] public section +universe u + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +/-! +# Actions on Frobenius fixed fields + +This module defines the action induced on a Frobenius fixed field and proves +its compatibility with conjugate-stable actions, relative norms, inclusions, +and Frobenius power sums. +-/ + +noncomputable +section + +open CategoryTheory +open scoped BigOperators + +section fixedFieldActions + +/-! +Mathlib's `Rep ℤ G` requires its coefficient ring and acting group in the +same universe; `IntegralRepGroupType` names that shared boundary. +-/ +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- The action on a Frobenius fixed field induced by an element commuting +with its defining generator. -/ +noncomputable def frobeniusFixedFieldAction (D : DegreeData G) (A : Rep ℤ G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) + (q : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hq : q * σ.1 = σ.1 * q) : + ambientFixedAddSubgroup A (D.frobeniusFixedField K L hLK σ) →+ + ambientFixedAddSubgroup A (D.frobeniusFixedField K L hLK σ) := by + let k : K.field.toSubgroup := Quotient.out q + let hstable : + conjugateClosedSubgroup (D.frobeniusFixedField K L hLK σ) k.1⁻¹ = + D.frobeniusFixedField K L hLK σ := + D.conjugate_frobeniusFixedField_eq_of_commutes K L hLK σ q hq + exact + { toFun := fun a => ⟨A.ρ k.1 a.1, by + intro t + have htConj : t.1 ∈ conjugateClosedSubgroup + (D.frobeniusFixedField K L hLK σ) k.1⁻¹ := by + rw [hstable] + exact t.2 + have hcMem : k.1⁻¹ * t.1 * k.1 ∈ + D.frobeniusFixedField K L hLK σ := by + simpa using (conjugateClosedSubgroup_mem + (D.frobeniusFixedField K L hLK σ) k.1⁻¹ t.1).mp htConj + let c : (D.frobeniusFixedField K L hLK σ).toSubgroup := + ⟨k.1⁻¹ * t.1 * k.1, hcMem⟩ + calc + A.ρ t.1 (A.ρ k.1 a.1) = A.ρ (t.1 * k.1) a.1 := by + rw [map_mul] + rfl + _ = A.ρ (k.1 * c.1) a.1 := by simp [c, mul_assoc] + _ = A.ρ k.1 (A.ρ c.1 a.1) := by rw [map_mul]; rfl + _ = A.ρ k.1 a.1 := by rw [a.2 c]⟩ + map_zero' := by apply Subtype.ext; exact map_zero _ + map_add' := by + intro a b + apply Subtype.ext + exact map_add _ _ _ } + +/-- The fixed-field action has the expected ambient automorphism after coercion. -/ +@[simp] +theorem frobeniusFixedFieldAction_coe (D : DegreeData G) (A : Rep ℤ G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) + (q : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hq : q * σ.1 = σ.1 * q) + (a : ambientFixedAddSubgroup A (D.frobeniusFixedField K L hLK σ)) : + ((D.frobeniusFixedFieldAction A K L hLK σ q hq a : + ambientFixedAddSubgroup A (D.frobeniusFixedField K L hLK σ)) : A.V) = + A.ρ (Quotient.out q).1 a.1 := by + rfl + +/-- On a quotient representative, the fixed-field action coerces to the represented action. -/ +theorem frobeniusFixedFieldAction_coe_of_mk (D : DegreeData G) (A : Rep ℤ G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) + (q : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hq : q * σ.1 = σ.1 * q) + (k : K.field.toSubgroup) (hkq : QuotientGroup.mk k = q) + (a : ambientFixedAddSubgroup A (D.frobeniusFixedField K L hLK σ)) : + ((D.frobeniusFixedFieldAction A K L hLK σ q hq a : + ambientFixedAddSubgroup A (D.frobeniusFixedField K L hLK σ)) : A.V) = + A.ρ k.1 a.1 := by + let t : K.field.toSubgroup := Quotient.out q + have htq : + (QuotientGroup.mk t : + K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) = q := + Quotient.out_eq' q + have hrel : t⁻¹ * k ∈ D.extensionInertiaWithin K.field L hLK := + QuotientGroup.eq.mp (htq.trans hkq.symm) + have hrField : (t⁻¹ * k).1 ∈ + (D.frobeniusFixedField K L hLK σ).toSubgroup := by + let rI : (D.fieldInertia L).toSubgroup := + ⟨(t⁻¹ * k).1, ⟨ + (mem_extensionSubgroup_iff K.field L hLK (t⁻¹ * k)).1 hrel.1, + hrel.2⟩⟩ + exact D.fieldInertia_le_frobeniusFixedField K L hLK σ rI.2 + let r : (D.frobeniusFixedField K L hLK σ).toSubgroup := + ⟨(t⁻¹ * k).1, hrField⟩ + rw [D.frobeniusFixedFieldAction_coe] + calc + A.ρ t.1 a.1 = A.ρ t.1 (A.ρ r.1 a.1) := by rw [a.2 r] + _ = A.ρ (t.1 * r.1) a.1 := by rw [map_mul]; rfl + _ = A.ρ k.1 a.1 := by simp [r, t] + +/-- The fixed-field action coincides with the conjugation-stable action. -/ +theorem frobeniusFixedFieldAction_eq_conjugateStableAction + (D : DegreeData G) (A : Rep ℤ G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) + (q : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hq : q * σ.1 = σ.1 * q) + (a : ambientFixedAddSubgroup A (D.frobeniusFixedField K L hLK σ)) : + let k : K.field.toSubgroup := Quotient.out q + let hstable : conjugateClosedSubgroup + (D.frobeniusFixedField K L hLK σ) k.1⁻¹ = + D.frobeniusFixedField K L hLK σ := + D.conjugate_frobeniusFixedField_eq_of_commutes K L hLK σ q hq + D.frobeniusFixedFieldAction A K L hLK σ q hq a = + conjugateStableAction A (D.frobeniusFixedField K L hLK σ) + k.1⁻¹ hstable a := by + dsimp only + apply Subtype.ext + rw [D.frobeniusFixedFieldAction_coe, conjugateStableAction_coe] + simp + +/-- Relative norm in a power-fixed-field tower is equivariant for every +quotient element commuting with both defining powers. -/ +theorem relativeNorm_frobeniusFixedFieldAction (D : DegreeData G) (A : Rep ℤ G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ σ' : D.FrobeniusElements K L hLK) + (hTS : (D.frobeniusFixedField K L hLK σ').toSubgroup ≤ + (D.frobeniusFixedField K L hLK σ).toSubgroup) + [Finite ((D.frobeniusFixedField K L hLK σ).toSubgroup ⧸ + extensionSubgroup (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField K L hLK σ') hTS)] + (q : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hq : q * σ.1 = σ.1 * q) + (hq' : q * σ'.1 = σ'.1 * q) + (a : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σ')) : + relativeNorm A (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField K L hLK σ') hTS + (D.frobeniusFixedFieldAction A K L hLK σ' q hq' a) = + D.frobeniusFixedFieldAction A K L hLK σ q hq + (relativeNorm A (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField K L hLK σ') hTS a) := by + let k : K.field.toSubgroup := Quotient.out q + let hSstable := D.conjugate_frobeniusFixedField_eq_of_commutes + K L hLK σ q hq + let hTstable := D.conjugate_frobeniusFixedField_eq_of_commutes + K L hLK σ' q hq' + rw [D.frobeniusFixedFieldAction_eq_conjugateStableAction + A K L hLK σ' q hq' a] + rw [relativeNorm_conjugateStableAction] + rw [D.frobeniusFixedFieldAction_eq_conjugateStableAction + A K L hLK σ q hq] + +/-- Inclusion of a stabilized Frobenius fixed field intertwines its action +with the actual quotient action on the maximal unramified field. -/ +theorem frobeniusFixedFieldAction_inclusion (D : DegreeData G) (A : Rep ℤ G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) + (q : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hq : q * σ.1 = σ.1 * q) + (a : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σ)) : + fixedFieldInclusion A (D.frobeniusFixedField K L hLK σ) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ) + (D.frobeniusFixedFieldAction A K L hLK σ q hq a) = + D.frobeniusQuotientAction A K.field L hLK q + (fixedFieldInclusion A (D.frobeniusFixedField K L hLK σ) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ) a) := by + apply Subtype.ext + refine (D.frobeniusFixedFieldAction_coe A K L hLK σ q hq a).trans ?_ + let k : K.field.toSubgroup := Quotient.out q + have hkq : (QuotientGroup.mk k : + K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) = q := + Quotient.out_eq' q + calc + A.ρ (Quotient.out q).1 a.1 = A.ρ k.1 a.1 := rfl + _ = (D.frobeniusQuotientAction A K.field L hLK (QuotientGroup.mk k) + (fixedFieldInclusion A (D.frobeniusFixedField K L hLK σ) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ) a)).1 := rfl + _ = _ := congrArg (fun z => + (D.frobeniusQuotientAction A K.field L hLK z + (fixedFieldInclusion A (D.frobeniusFixedField K L hLK σ) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ) a)).1) hkq + +/-- A Frobenius power sum commutes with the relative norm in a fixed-field +tower whenever the quotient element stabilizes both fields. -/ +theorem fixedFieldPowerSum_relativeNorm (D : DegreeData G) (A : Rep ℤ G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ σ' : D.FrobeniusElements K L hLK) + (hTS : (D.frobeniusFixedField K L hLK σ').toSubgroup ≤ + (D.frobeniusFixedField K L hLK σ).toSubgroup) + [Finite ((D.frobeniusFixedField K L hLK σ).toSubgroup ⧸ + extensionSubgroup (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField K L hLK σ') hTS)] + (q : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hq : q * σ.1 = σ.1 * q) (hq' : q * σ'.1 = σ'.1 * q) + (n : ℕ) + (a : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σ')) : + relativeNorm A (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField K L hLK σ') hTS + (∑ i : Fin n, + D.frobeniusFixedFieldAction A K L hLK σ' + (q ^ i.1) (Commute.pow_left hq' i.1) a) = + ∑ i : Fin n, + D.frobeniusFixedFieldAction A K L hLK σ + (q ^ i.1) (Commute.pow_left hq i.1) + (relativeNorm A (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField K L hLK σ') hTS a) := by + rw [map_sum] + apply Finset.sum_congr rfl + intro i _ + exact D.relativeNorm_frobeniusFixedFieldAction A K L hLK + σ σ' hTS (q ^ i.1) (Commute.pow_left hq i.1) + (Commute.pow_left hq' i.1) a + +/-- The fixed-field power sum becomes the global Frobenius power sum after +inclusion into the maximal unramified field. -/ +theorem fixedFieldPowerSum_inclusion (D : DegreeData G) (A : Rep ℤ G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) + (q : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hq : q * σ.1 = σ.1 * q) (n : ℕ) + (a : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σ)) : + fixedFieldInclusion A (D.frobeniusFixedField K L hLK σ) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ) + (∑ i : Fin n, + D.frobeniusFixedFieldAction A K L hLK σ + (q ^ i.1) (Commute.pow_left hq i.1) a) = + D.frobeniusPowerSum A K.field L hLK q n + (fixedFieldInclusion A (D.frobeniusFixedField K L hLK σ) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ) a) := by + apply Subtype.ext + rw [D.frobeniusPowerSum_coe] + change + (AddSubgroup.subtype (ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σ))) + (∑ i : Fin n, + D.frobeniusFixedFieldAction A K L hLK σ + (q ^ i.1) (Commute.pow_left hq i.1) a) = _ + rw [map_sum] + apply Finset.sum_congr rfl + intro i _ + exact congrArg Subtype.val + (D.frobeniusFixedFieldAction_inclusion A K L hLK σ + (q ^ i.1) (Commute.pow_left hq i.1) a) + +end DegreeData + +end fixedFieldActions + +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldTower.lean new file mode 100644 index 0000000000..109f8b3f13 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldTower.lean @@ -0,0 +1,448 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusPowerFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension +/-! +Bundles finite towers of Frobenius fixed fields together with the normality and finiteness data +needed for norm and unit calculations. +-/ + +@[expose] public section + +universe u + +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +noncomputable +section + +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- The Frobenius fixed field bundled with its proved absolute finiteness. +This is the field object used by valuation and unit APIs. -/ +noncomputable def frobeniusFixedAbstractField + (D : DegreeData G) [IsTopologicalGroup G] + (K : DegreeData.FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) + [Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (D.frobeniusFixedField K L hLK σ) + (le_baseField (D.frobeniusFixedField K L hLK σ)))] : + FiniteAbstractField G where + field := D.frobeniusFixedField K L hLK σ + finite := inferInstance + +/-- A finite normal tower between two Frobenius fixed fields. + +The ambient Galois extension, both Frobenius elements, the fixed-field +inclusion, and exactly the finiteness hypotheses needed by the unit +representation are stored once. In particular, downstream statements no +longer re-thread the proof-dependent subgroup inclusions and quotient +instances independently. -/ +structure FrobeniusFixedFieldTower + (D : DegreeData G) [IsTopologicalGroup G] where + /-- The finite-residue field in which the ambient Galois extension begins. -/ + ambientBase : DegreeData.FiniteResidueAbstractField D + /-- The ambient Galois subextension. -/ + ambient : GaloisSubextension ambientBase.field + /-- The Frobenius element whose fixed field is the base of the tower. -/ + baseFrobenius : + D.FrobeniusElements ambientBase ambient.field ambient.below + /-- The Frobenius element whose fixed field is the top of the tower. -/ + fieldFrobenius : + D.FrobeniusElements ambientBase ambient.field ambient.below + /-- Inclusion of the top fixed field into the base fixed field. -/ + field_le_base : + (D.frobeniusFixedField ambientBase ambient.field ambient.below + fieldFrobenius).toSubgroup ≤ + (D.frobeniusFixedField ambientBase ambient.field ambient.below + baseFrobenius).toSubgroup + /-- The relative quotient between the two fixed fields is finite. -/ + finiteQuotient : + Finite + ((D.frobeniusFixedField ambientBase ambient.field ambient.below + baseFrobenius).toSubgroup ⧸ + extensionSubgroup + (D.frobeniusFixedField ambientBase ambient.field ambient.below + baseFrobenius) + (D.frobeniusFixedField ambientBase ambient.field ambient.below + fieldFrobenius) + field_le_base) + /-- The base fixed field is finite over the distinguished base. -/ + baseAbsoluteFinite : + Finite + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (D.frobeniusFixedField ambientBase ambient.field ambient.below + baseFrobenius) + (le_baseField + (D.frobeniusFixedField ambientBase ambient.field ambient.below + baseFrobenius))) + /-- The top fixed field is finite over the distinguished base. -/ + fieldAbsoluteFinite : + Finite + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (D.frobeniusFixedField ambientBase ambient.field ambient.below + fieldFrobenius) + (le_baseField + (D.frobeniusFixedField ambientBase ambient.field ambient.below + fieldFrobenius))) + /-- The relative subgroup between the fixed fields is normal. -/ + normal : + (extensionSubgroup + (D.frobeniusFixedField ambientBase ambient.field ambient.below + baseFrobenius) + (D.frobeniusFixedField ambientBase ambient.field ambient.below + fieldFrobenius) + field_le_base).Normal + /-- The two chosen ambient Frobenius elements commute. -/ + commute : + baseFrobenius.1 * fieldFrobenius.1 = + fieldFrobenius.1 * baseFrobenius.1 + +namespace FrobeniusFixedFieldTower + +variable {D : DegreeData G} [IsTopologicalGroup G] + +/-- The lower fixed field, finite over the distinguished base. -/ +noncomputable def base (T : FrobeniusFixedFieldTower D) : + FiniteAbstractField G := by + letI : Finite + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (D.frobeniusFixedField T.ambientBase T.ambient.field T.ambient.below + T.baseFrobenius) + (le_baseField + (D.frobeniusFixedField T.ambientBase T.ambient.field T.ambient.below + T.baseFrobenius))) := + T.baseAbsoluteFinite + exact D.frobeniusFixedAbstractField T.ambientBase T.ambient.field + T.ambient.below T.baseFrobenius + +/-- The upper fixed field, finite over the distinguished base. -/ +noncomputable def field (T : FrobeniusFixedFieldTower D) : + FiniteAbstractField G := by + letI : Finite + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (D.frobeniusFixedField T.ambientBase T.ambient.field T.ambient.below + T.fieldFrobenius) + (le_baseField + (D.frobeniusFixedField T.ambientBase T.ambient.field T.ambient.below + T.fieldFrobenius))) := + T.fieldAbsoluteFinite + exact D.frobeniusFixedAbstractField T.ambientBase T.ambient.field + T.ambient.below T.fieldFrobenius + +/-- The fixed-field inclusion as a bundled Galois subextension. -/ +noncomputable def toGaloisSubextension (T : FrobeniusFixedFieldTower D) : + GaloisSubextension T.base.field where + field := T.field.field + below := T.field_le_base + normal := T.normal + +/-- The finite extension between the two bundled fixed fields. -/ +noncomputable def extension (T : FrobeniusFixedFieldTower D) : + FiniteAbstractFieldExtension G where + field := T.field + base := T.base + below := T.field_le_base + finiteQuotient := T.finiteQuotient + +/-- A concrete lower-fixed-field element representing its Frobenius class. -/ +structure Representative (T : FrobeniusFixedFieldTower D) where + /-- The chosen element in the base fixed-field subgroup. -/ + element : T.extension.base.field.toSubgroup + /-- The chosen element maps to the prescribed ambient Frobenius class. -/ + mapsToFrobenius : + D.frobeniusFixedFieldToClosure T.ambientBase T.ambient.field + T.ambient.below T.baseFrobenius element = + D.frobeniusInClosure T.ambientBase T.ambient.field + T.ambient.below T.baseFrobenius + +/-- The extension subgroup of a bundled Frobenius fixed-field tower is normal. -/ +instance extensionNormal (T : FrobeniusFixedFieldTower D) : + (extensionSubgroup T.extension.base.field T.extension.field.field + T.extension.below).Normal := + T.normal + +/-- A representative which generates the finite fixed-field quotient. -/ +structure CyclicGenerator (T : FrobeniusFixedFieldTower D) + extends Representative T where + /-- Every relative Galois element is a power of the representative's class. -/ + generates : + ∀ x : + T.extension.base.field.toSubgroup ⧸ + extensionSubgroup T.extension.base.field T.extension.field.field + T.extension.below, + x ∈ Subgroup.zpowers (QuotientGroup.mk toRepresentative.element) + +/-- The Galois quotient of a bundled Frobenius fixed-field extension is finite. -/ +instance extensionFinite (T : FrobeniusFixedFieldTower D) : + Finite + (T.extension.base.field.toSubgroup ⧸ + extensionSubgroup T.extension.base.field T.extension.field.field + T.extension.below) := + T.finiteQuotient + +/-- The lower Frobenius fixed field in the tower is finite over the distinguished base field. -/ +instance baseAbsoluteFiniteInstance (T : FrobeniusFixedFieldTower D) : + Finite + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (D.frobeniusFixedField T.ambientBase T.ambient.field T.ambient.below + T.baseFrobenius) + (le_baseField + (D.frobeniusFixedField T.ambientBase T.ambient.field T.ambient.below + T.baseFrobenius))) := + T.baseAbsoluteFinite + +/-- The upper Frobenius fixed field in the tower is finite over the distinguished base field. -/ +instance fieldAbsoluteFiniteInstance (T : FrobeniusFixedFieldTower D) : + Finite + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (D.frobeniusFixedField T.ambientBase T.ambient.field T.ambient.below + T.fieldFrobenius) + (le_baseField + (D.frobeniusFixedField T.ambientBase T.ambient.field T.ambient.below + T.fieldFrobenius))) := + T.fieldAbsoluteFinite + +end FrobeniusFixedFieldTower + +/-- A Frobenius fixed-field tower whose ambient Galois extension is finite. +The additional finiteness is stored on the opaque quotient object exposed by +`GaloisSubextension`. -/ +structure FiniteAmbientFrobeniusFixedFieldTower + (D : DegreeData G) [IsTopologicalGroup G] + extends FrobeniusFixedFieldTower D where + /-- The ambient Galois quotient is finite. -/ + ambientFinite : Finite toFrobeniusFixedFieldTower.ambient.extensionQuotient + +namespace FiniteAmbientFrobeniusFixedFieldTower + +variable {D : DegreeData G} [IsTopologicalGroup G] + +/-- +The ambient Galois quotient stored in a finite Frobenius fixed-field tower is finite. +-/ +instance ambientQuotientFinite + (T : FiniteAmbientFrobeniusFixedFieldTower D) : + Finite T.ambient.extensionQuotient := + T.ambientFinite + +/-- Finiteness transported to the quotient presentation required by the +underlying Frobenius calculations. -/ +noncomputable instance ambientRepresentedQuotientFinite + (T : FiniteAmbientFrobeniusFixedFieldTower D) : + Finite + (T.ambientBase.field.toSubgroup ⧸ + extensionSubgroup T.ambientBase.field T.ambient.field + T.ambient.below) := + Finite.of_equiv T.ambient.extensionQuotient + T.ambient.extensionQuotientMulEquiv + +end FiniteAmbientFrobeniusFixedFieldTower + +/-- The power tower fixed by `φⁿ² ≤ φⁿ`. + +Only data already required by the universal norm-descent construction is +stored: the finite ambient Galois extension, a degree-one Frobenius, its +positive exponent, and the three fixed-field finiteness witnesses. The +fixed-field inclusion, normality, and commutation relation are consequences +of the power construction. -/ +structure FrobeniusPowerFixedFieldTower + (D : DegreeData G) [IsTopologicalGroup G] where + /-- The finite-residue field at the base of the ambient extension. -/ + ambientBase : DegreeData.FiniteResidueAbstractField D + /-- The finite ambient Galois subextension. -/ + ambient : FiniteGaloisSubextension ambientBase.field + /-- A chosen degree-one Frobenius element in the ambient extension. -/ + frobenius : + D.FrobeniusElements ambientBase ambient.field ambient.below + /-- The chosen Frobenius has exponent one. -/ + exponent_one : + D.frobeniusExponent ambientBase ambient.field ambient.below frobenius = 1 + /-- The positive exponent defining the first fixed field. -/ + n : ℕ + /-- Positivity of the fixed-field exponent. -/ + n_pos : 0 < n + /-- The fixed field of the `n`-th Frobenius power is finite over the distinguished base. -/ + baseAbsoluteFinite : + let σ := D.frobeniusPowerOfDegreeOne ambientBase ambient.field + ambient.below frobenius exponent_one n n_pos + Finite + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (D.frobeniusFixedField ambientBase ambient.field ambient.below σ) + (le_baseField + (D.frobeniusFixedField ambientBase ambient.field ambient.below σ))) + /-- The fixed field of the `n²`-th Frobenius power is finite over the distinguished base. -/ + fieldAbsoluteFinite : + let σn := D.frobeniusPowerOfDegreeOne ambientBase ambient.field + ambient.below frobenius exponent_one (n * n) (Nat.mul_pos n_pos n_pos) + Finite + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (D.frobeniusFixedField ambientBase ambient.field ambient.below σn) + (le_baseField + (D.frobeniusFixedField ambientBase ambient.field ambient.below σn))) + /-- The relative quotient between the `n`- and `n²`-power fixed fields is finite. -/ + relativeFinite : + let σ := D.frobeniusPowerOfDegreeOne ambientBase ambient.field + ambient.below frobenius exponent_one n n_pos + let σn := D.frobeniusPowerOfDegreeOne ambientBase ambient.field + ambient.below frobenius exponent_one (n * n) (Nat.mul_pos n_pos n_pos) + let hTS := D.frobeniusPowerFixedField_le ambientBase ambient.field + ambient.below frobenius exponent_one n n n_pos n_pos + Finite + ((D.frobeniusFixedField ambientBase ambient.field ambient.below σ).toSubgroup ⧸ + extensionSubgroup + (D.frobeniusFixedField ambientBase ambient.field ambient.below σ) + (D.frobeniusFixedField ambientBase ambient.field ambient.below σn) + hTS) + +namespace FrobeniusPowerFixedFieldTower + +variable {D : DegreeData G} [IsTopologicalGroup G] + +/-- Forget ambient finiteness while retaining its Galois structure. -/ +noncomputable def ambientGalois (P : FrobeniusPowerFixedFieldTower D) : + GaloisSubextension P.ambientBase.field := + P.ambient.toGaloisSubextension + +/-- The Frobenius element `φⁿ` defining the lower fixed field. -/ +def baseFrobenius (P : FrobeniusPowerFixedFieldTower D) : + D.FrobeniusElements P.ambientBase P.ambient.field P.ambient.below := + D.frobeniusPowerOfDegreeOne P.ambientBase P.ambient.field P.ambient.below + P.frobenius P.exponent_one P.n P.n_pos + +/-- The Frobenius element `φⁿ²` defining the upper fixed field. -/ +def fieldFrobenius (P : FrobeniusPowerFixedFieldTower D) : + D.FrobeniusElements P.ambientBase P.ambient.field P.ambient.below := + D.frobeniusPowerOfDegreeOne P.ambientBase P.ambient.field P.ambient.below + P.frobenius P.exponent_one (P.n * P.n) + (Nat.mul_pos P.n_pos P.n_pos) + +/-- The original Frobenius commutes with its `n`-th power. -/ +theorem frobenius_commute_base (P : FrobeniusPowerFixedFieldTower D) : + P.frobenius.1 * P.baseFrobenius.1 = + P.baseFrobenius.1 * P.frobenius.1 := by + simpa [baseFrobenius] using + ((Commute.refl P.frobenius.1).pow_right P.n).eq + +/-- The original Frobenius commutes with its `n²`-th power. -/ +theorem frobenius_commute_field (P : FrobeniusPowerFixedFieldTower D) : + P.frobenius.1 * P.fieldFrobenius.1 = + P.fieldFrobenius.1 * P.frobenius.1 := by + simpa [fieldFrobenius] using + ((Commute.refl P.frobenius.1).pow_right (P.n * P.n)).eq + +/-- Inclusion of the field fixed by `φⁿ²` into the field fixed by `φⁿ`. -/ +theorem field_le_base (P : FrobeniusPowerFixedFieldTower D) : + (D.frobeniusFixedField P.ambientBase P.ambient.field P.ambient.below + P.fieldFrobenius).toSubgroup ≤ + (D.frobeniusFixedField P.ambientBase P.ambient.field P.ambient.below + P.baseFrobenius).toSubgroup := + D.frobeniusPowerFixedField_le P.ambientBase P.ambient.field P.ambient.below + P.frobenius P.exponent_one P.n P.n P.n_pos P.n_pos + +/-- Relative finiteness in the fixed-field presentation used by the +Frobenius action and norm lemmas. The witness is projected from the power +tower rather than requested again from callers. -/ +instance relativeRepresentedQuotientFinite + (P : FrobeniusPowerFixedFieldTower D) : + Finite + ((D.frobeniusFixedField P.ambientBase P.ambient.field P.ambient.below + P.baseFrobenius).toSubgroup ⧸ + extensionSubgroup + (D.frobeniusFixedField P.ambientBase P.ambient.field P.ambient.below + P.baseFrobenius) + (D.frobeniusFixedField P.ambientBase P.ambient.field P.ambient.below + P.fieldFrobenius) + P.field_le_base) := + P.relativeFinite + +/-- Absolute finiteness of the lower fixed field in the presentation used by +the Frobenius action API. -/ +instance baseRepresentedAbsoluteFinite + (P : FrobeniusPowerFixedFieldTower D) : + Finite + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (D.frobeniusFixedField P.ambientBase P.ambient.field P.ambient.below + P.baseFrobenius) + (le_baseField + (D.frobeniusFixedField P.ambientBase P.ambient.field P.ambient.below + P.baseFrobenius))) := + P.baseAbsoluteFinite + +/-- Absolute finiteness of the upper fixed field in the presentation used by +the Frobenius action API. -/ +instance fieldRepresentedAbsoluteFinite + (P : FrobeniusPowerFixedFieldTower D) : + Finite + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (D.frobeniusFixedField P.ambientBase P.ambient.field P.ambient.below + P.fieldFrobenius) + (le_baseField + (D.frobeniusFixedField P.ambientBase P.ambient.field P.ambient.below + P.fieldFrobenius))) := + P.fieldAbsoluteFinite + +/-- The power construction as the canonical fixed-field tower bundle. -/ +noncomputable def toFrobeniusFixedFieldTower + (P : FrobeniusPowerFixedFieldTower D) [T2Space G] : + FrobeniusFixedFieldTower D where + ambientBase := P.ambientBase + ambient := P.ambientGalois + baseFrobenius := P.baseFrobenius + fieldFrobenius := P.fieldFrobenius + field_le_base := P.field_le_base + finiteQuotient := P.relativeFinite + baseAbsoluteFinite := P.baseAbsoluteFinite + fieldAbsoluteFinite := P.fieldAbsoluteFinite + normal := + D.frobeniusPowerFixedField_normal P.ambientBase P.ambient.field + P.ambient.below P.frobenius P.exponent_one P.n P.n P.n_pos P.n_pos + commute := by + change P.baseFrobenius.1 * P.fieldFrobenius.1 = + P.fieldFrobenius.1 * P.baseFrobenius.1 + simpa [baseFrobenius, fieldFrobenius] using + ((Commute.refl P.frobenius.1).pow_pow P.n (P.n * P.n)).eq + +/-- The power tower together with the already assumed finiteness of its +ambient extension. -/ +noncomputable def toFiniteAmbientFrobeniusFixedFieldTower + (P : FrobeniusPowerFixedFieldTower D) [T2Space G] : + FiniteAmbientFrobeniusFixedFieldTower D where + toFrobeniusFixedFieldTower := P.toFrobeniusFixedFieldTower + ambientFinite := by + change Finite P.ambient.toGaloisSubextension.extensionQuotient + exact Finite.of_equiv P.ambient.extensionQuotient + P.ambient.toGaloisExtensionQuotientMulEquiv + +end FrobeniusPowerFixedFieldTower + +end DegreeData + +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusPowerFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusPowerFixedField.lean new file mode 100644 index 0000000000..8f9bdd6570 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusPowerFixedField.lean @@ -0,0 +1,704 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateFieldCompositum + +/-! # Frobenius Power Fixed Field -/ + +@[expose] public section +universe u + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +/-! +# Frobenius power fixed fields + +This module constructs the fixed fields of powers of a Frobenius element and +proves their inclusion, exponent, normality, unramifiedness, finiteness, +degree, quotient-cardinality, and generator properties. +-/ + +noncomputable +section + +open CategoryTheory +open scoped BigOperators + +section degreeOnePowerFields + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- An element fixing `L` commutes modulo `G_{\widetilde L}` with every +degree-zero element of `G(\widetilde L/K)`. Group-theoretically this is +`[G_L,I_K] ⊆ G_L ∩ I_K = G_{\widetilde L}`; it is the reason the +fields fixed by the powers of `φⁿ` in the universal norm-descent lemma are stable under the +elements `τᵢ` occurring in `(*)`. -/ +theorem extensionInertia_commutes_of_mem_extensionSubgroup (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (k : K.field.toSubgroup) (hk : k ∈ extensionSubgroup K.field L hLK) + (q : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hq : D.extensionNormalizedDegree K L hLK q = 1) : + (QuotientGroup.mk k : + K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) * q = + q * QuotientGroup.mk k := by + revert hq + refine Quotient.inductionOn' q ?_ + intro t hdt + have htI : t ∈ D.fieldInertiaWithin K.field := by + rw [← D.normalizedDegree_ker K] + exact hdt + change QuotientGroup.mk (k * t) = QuotientGroup.mk (t * k) + apply QuotientGroup.eq.mpr + constructor + · change (k * t)⁻¹ * (t * k) ∈ extensionSubgroup K.field L hLK + have hconj : t⁻¹ * k⁻¹ * t ∈ extensionSubgroup K.field L hLK := by + simpa using hLnormal.conj_mem k⁻¹ + ((extensionSubgroup K.field L hLK).inv_mem hk) t⁻¹ + simpa [mul_assoc] using + (extensionSubgroup K.field L hLK).mul_mem hconj hk + · change (k * t)⁻¹ * (t * k) ∈ D.fieldInertiaWithin K.field + have hconj : k⁻¹ * t * k ∈ D.fieldInertiaWithin K.field := by + simpa using (inferInstance : (D.fieldInertiaWithin K.field).Normal).conj_mem + t htI k⁻¹ + simp [mul_assoc] + +/-- Let `P/K` be a finite Galois subextension of `\widetilde L/K` +containing `L`. The `|G(P/K)|`-th power of every element of +`G(\widetilde L/K)` fixes `P`, hence commutes with the degree-zero kernel. +This is the precise finite-stage input behind the choice +`n = [M:K]`, `σ = φⁿ`. -/ +theorem quotientPower_card_commutes_degreeZero (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (P : FiniteIntermediateField (D.maximalUnramifiedField L) K.field) + (hPL : P.field.toSubgroup ≤ L.toSubgroup) + [hPnormal : (extensionSubgroup K.field P.field P.below).Normal] + (q τ : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hτ : D.extensionNormalizedDegree K L hLK τ = 1) : + let n := Nat.card + (K.field.toSubgroup ⧸ extensionSubgroup K.field P.field P.below) + q ^ n * τ = τ * q ^ n := by + let R := K.field.toSubgroup ⧸ extensionSubgroup K.field P.field P.below + let : Finite R := P.finite + let n := Nat.card R + let Q := K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK + let hIP : D.extensionInertiaWithin K.field L hLK ≤ + extensionSubgroup K.field P.field P.below := by + intro x hx + have hxE : x ∈ extensionSubgroup K.field (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_le_of_le hLK) := by + rw [D.extensionSubgroup_maximalUnramifiedField K.field L hLK] + exact hx + apply (mem_extensionSubgroup_iff K.field P.field P.below x).2 + exact P.above + ((mem_extensionSubgroup_iff K.field (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_le_of_le hLK) x).1 hxE) + let rP : Q →* R := + QuotientGroup.map (D.extensionInertiaWithin K.field L hLK) + (extensionSubgroup K.field P.field P.below) + (MonoidHom.id K.field.toSubgroup) hIP + let k : K.field.toSubgroup := Quotient.out (q ^ n) + have hkq : (QuotientGroup.mk k : Q) = q ^ n := + Quotient.out_eq' (q ^ n) + have hrPpow : rP (q ^ n) = 1 := by + rw [map_pow] + exact pow_card_eq_one' + have hkP : k ∈ extensionSubgroup K.field P.field P.below := by + apply (QuotientGroup.eq_one_iff k).1 + calc + (QuotientGroup.mk k : R) = rP (QuotientGroup.mk k) := rfl + _ = rP (q ^ n) := congrArg rP hkq + _ = 1 := hrPpow + have hkL : k ∈ extensionSubgroup K.field L hLK := by + apply (mem_extensionSubgroup_iff K.field L hLK k).2 + exact hPL ((mem_extensionSubgroup_iff K.field P.field P.below k).1 hkP) + have hcomm := D.extensionInertia_commutes_of_mem_extensionSubgroup + K L hLK k hkL τ hτ + simpa [Q, n, hkq] using hcomm + +private theorem extensionNormalizedDegree_pow_of_degreeOne (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) + (n : ℕ) : + D.extensionNormalizedDegree K L hLK (φ.1 ^ n) = + (Multiplicative.ofAdd (1 : ZHat)) ^ n := by + rw [map_pow, + D.extensionNormalizedDegree_frobenius_eq_pow K L hLK φ, hφ] + simp + +/-- A positive power of a degree-one Frobenius element, with the exponent +recorded exactly. These are the elements `σ = φⁿ` and `σⁿ = φⁿ²`. -/ +def frobeniusPowerOfDegreeOne (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) + (n : ℕ) (hn : 0 < n) : D.FrobeniusElements K L hLK := + ⟨φ.1 ^ n, + ⟨n, hn, by exact D.extensionNormalizedDegree_pow_of_degreeOne K L hLK φ hφ n⟩⟩ + +/-- The degree-one Frobenius power has the stated ambient coercion. -/ +@[simp] +theorem frobeniusPowerOfDegreeOne_coe (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) + (n : ℕ) (hn : 0 < n) : + (D.frobeniusPowerOfDegreeOne K L hLK φ hφ n hn).1 = φ.1 ^ n := + rfl + +/-- If `P/K` is finite Galois and contained in `\widetilde L`, then `P` +is contained in the field fixed by `φⁿ`, where +`n = |G(P/K)|`. Indeed `φⁿ` is trivial in `G(P/K)`, and the kernel +of the restriction map is closed, so it contains the whole procyclic +closure generated by `φⁿ`. -/ +theorem frobeniusPowerFixedField_le_finiteField (D : DegreeData G) + [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (P : FiniteIntermediateField (D.maximalUnramifiedField L) K.field) + [hPnormal : (extensionSubgroup K.field P.field P.below).Normal] + (φ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) : + let n := P.quotientCard + let hn : 0 < n := P.quotientCard_pos + (D.frobeniusFixedField K L hLK + (D.frobeniusPowerOfDegreeOne K L hLK φ hφ n hn)).toSubgroup ≤ + P.field.toSubgroup := by + dsimp only + let R := K.field.toSubgroup ⧸ extensionSubgroup K.field P.field P.below + let n := P.quotientCard + have hn : 0 < n := P.quotientCard_pos + let Q := K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK + let hIP : D.extensionInertiaWithin K.field L hLK ≤ + extensionSubgroup K.field P.field P.below := by + intro x hx + have hxE : x ∈ extensionSubgroup K.field (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_le_of_le hLK) := by + rw [D.extensionSubgroup_maximalUnramifiedField K.field L hLK] + exact hx + apply (mem_extensionSubgroup_iff K.field P.field P.below x).2 + exact P.above + ((mem_extensionSubgroup_iff K.field (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_le_of_le hLK) x).1 hxE) + let rP : Q →ₜ* R := + { toMonoidHom := + QuotientGroup.map + (N := D.extensionInertiaWithin K.field L hLK) + (M := extensionSubgroup K.field P.field P.below) + (f := MonoidHom.id K.field.toSubgroup) hIP + continuous_toFun := by + refine (QuotientGroup.isQuotientMap_mk + (G := K.field.toSubgroup) + (N := D.extensionInertiaWithin K.field L hLK)).continuous_iff.2 ?_ + change Continuous + (⇑(QuotientGroup.map + (D.extensionInertiaWithin K.field L hLK) + (extensionSubgroup K.field P.field P.below) + (MonoidHom.id K.field.toSubgroup) hIP) ∘ + QuotientGroup.mk' + (D.extensionInertiaWithin K.field L hLK)) + have hcomp : + (⇑(QuotientGroup.map + (D.extensionInertiaWithin K.field L hLK) + (extensionSubgroup K.field P.field P.below) + (MonoidHom.id K.field.toSubgroup) hIP) ∘ + QuotientGroup.mk' + (D.extensionInertiaWithin K.field L hLK)) = + QuotientGroup.mk' + (extensionSubgroup K.field P.field P.below) := by + funext k + exact QuotientGroup.map_mk' _ _ _ _ k + rw [hcomp] + exact continuous_quotient_mk' } + let : Finite R := P.finite + let : IsClosed + (extensionSubgroup K.field P.field P.below : Set K.field.toSubgroup) := + extensionSubgroup_isClosed K.field P.field P.below + have hrPpow : rP (φ.1 ^ n) = 1 := by + rw [map_pow] + change (rP φ.1) ^ Nat.card R = 1 + exact pow_card_eq_one' + let σ := D.frobeniusPowerOfDegreeOne K L hLK φ hφ n hn + have hclosure : + (D.frobeniusClosure K L hLK σ).toSubgroup ≤ + rP.toMonoidHom.ker := by + apply Subgroup.topologicalClosure_minimal + · rw [Subgroup.closure_le] + intro z hz + have hz' : z = φ.1 ^ n := by simpa [σ] using hz + subst z + exact hrPpow + · change IsClosed {x : Q | rP x = 1} + exact isClosed_eq rP.continuous continuous_const + rintro g ⟨k, hk, rfl⟩ + apply (mem_extensionSubgroup_iff K.field P.field P.below k).1 + apply (QuotientGroup.eq_one_iff k).1 + have hk' := hclosure hk + change QuotientGroup.mk' (extensionSubgroup K.field P.field P.below) k = 1 at hk' + exact hk' + +/-- The Frobenius exponent of the degree-one power is the supplied exponent. -/ +@[simp] +theorem frobeniusExponent_powerOfDegreeOne (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) + (n : ℕ) (hn : 0 < n) : + D.frobeniusExponent K L hLK + (D.frobeniusPowerOfDegreeOne K L hLK φ hφ n hn) = n := + by + apply proCIntegerOne_pow_nat_injective + calc + (Multiplicative.ofAdd (1 : ZHat)) ^ + D.frobeniusExponent K L hLK + (D.frobeniusPowerOfDegreeOne K L hLK φ hφ n hn) = + D.extensionNormalizedDegree K L hLK + (D.frobeniusPowerOfDegreeOne K L hLK φ hφ n hn).1 := + (D.extensionNormalizedDegree_frobenius_eq_pow K L hLK + (D.frobeniusPowerOfDegreeOne K L hLK φ hφ n hn)).symm + _ = (Multiplicative.ofAdd (1 : ZHat)) ^ n := + D.extensionNormalizedDegree_pow_of_degreeOne K L hLK φ hφ n + +private theorem frobeniusClosure_power_mul_le (D : DegreeData G) + [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) + (n m : ℕ) (hn : 0 < n) (hm : 0 < m) : + (D.frobeniusClosure K L hLK + (D.frobeniusPowerOfDegreeOne K L hLK φ hφ (n * m) + (Nat.mul_pos hn hm))).toSubgroup ≤ + (D.frobeniusClosure K L hLK + (D.frobeniusPowerOfDegreeOne K L hLK φ hφ n hn)).toSubgroup := by + let Q := K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK + let x : Q := φ.1 ^ n + let C : ClosedSubgroup Q := closedSubgroupGenerated ({x} : Set Q) + have hxC : x ∈ C.toSubgroup := + Subgroup.le_topologicalClosure _ + (Subgroup.subset_closure (by simp [x])) + have hpowC : φ.1 ^ (n * m) ∈ C.toSubgroup := by + rw [pow_mul] + exact C.toSubgroup.pow_mem hxC m + change (closedSubgroupGenerated + (Set.range (fun _ : Unit => φ.1 ^ (n * m)))).toSubgroup ≤ + (closedSubgroupGenerated + (Set.range (fun _ : Unit => φ.1 ^ n))).toSubgroup + have hrangeLeft : Set.range (fun _ : Unit => φ.1 ^ (n * m)) = + ({φ.1 ^ (n * m)} : Set Q) := by ext q; simp + have hrangeRight : Set.range (fun _ : Unit => φ.1 ^ n) = + ({φ.1 ^ n} : Set Q) := by ext q; simp + rw [hrangeLeft, hrangeRight] + apply Subgroup.topologicalClosure_minimal + · rw [Subgroup.closure_le] + simpa [C, x] using hpowC + · exact (closedSubgroupGenerated ({φ.1 ^ n} : Set Q)).isClosed' + +/-- If `Σ` is fixed by `φⁿ`, then the field fixed by `φⁿᵐ` extends `Σ`. +This is the tower `Σ_m / Σ` used in the universal norm-descent lemma. -/ +theorem frobeniusPowerFixedField_le (D : DegreeData G) + [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) + (n m : ℕ) (hn : 0 < n) (hm : 0 < m) : + (D.frobeniusFixedField K L hLK + (D.frobeniusPowerOfDegreeOne K L hLK φ hφ (n * m) + (Nat.mul_pos hn hm))).toSubgroup ≤ + (D.frobeniusFixedField K L hLK + (D.frobeniusPowerOfDegreeOne K L hLK φ hφ n hn)).toSubgroup := by + rintro z ⟨k, hk, rfl⟩ + exact ⟨k, + D.frobeniusClosure_power_mul_le K L hLK φ hφ n m hn hm hk, + rfl⟩ + +/-- The power-fixed-field tower is Galois. On the group side this is the +normality of `closure ⟨φⁿᵐ⟩` inside the procyclic group +`closure ⟨φⁿ⟩`. -/ +theorem frobeniusPowerFixedField_normal (D : DegreeData G) + [IsTopologicalGroup G] [T2Space G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) + (n m : ℕ) (hn : 0 < n) (hm : 0 < m) : + let σ := D.frobeniusPowerOfDegreeOne K L hLK φ hφ n hn + let σm := D.frobeniusPowerOfDegreeOne K L hLK φ hφ (n * m) + (Nat.mul_pos hn hm) + let S := D.frobeniusFixedField K L hLK σ + let T := D.frobeniusFixedField K L hLK σm + (extensionSubgroup S T + (D.frobeniusPowerFixedField_le K L hLK φ hφ n m hn hm)).Normal := by + dsimp only + let σ := D.frobeniusPowerOfDegreeOne K L hLK φ hφ n hn + let σm := D.frobeniusPowerOfDegreeOne K L hLK φ hφ (n * m) + (Nat.mul_pos hn hm) + let S := D.frobeniusFixedField K L hLK σ + let T := D.frobeniusFixedField K L hLK σm + let hSK := D.frobeniusFixedField_le K L hLK σ + let hTK := D.frobeniusFixedField_le K L hLK σm + let hTS := D.frobeniusPowerFixedField_le K L hLK φ hφ n m hn hm + let C := D.frobeniusClosure K L hLK σ + let Cm := D.frobeniusClosure K L hLK σm + let : CommGroup C := D.frobeniusClosureCommGroup K L hLK σ + have hCmC : Cm.toSubgroup ≤ C.toSubgroup := + D.frobeniusClosure_power_mul_le K L hLK φ hφ n m hn hm + constructor + intro t ht s + have htT : t.1 ∈ T.toSubgroup := + (mem_extensionSubgroup_iff S T hTS t).1 ht + let tK : K.field.toSubgroup := ⟨t.1, hSK t.2⟩ + let sK : K.field.toSubgroup := ⟨s.1, hSK s.2⟩ + have htFixed : tK ∈ D.frobeniusFixedSubgroupWithin K L hLK σm := by + rw [← D.extensionSubgroup_frobeniusFixedField K L hLK σm] + exact (mem_extensionSubgroup_iff K.field T hTK tK).2 htT + have hsFixed : sK ∈ D.frobeniusFixedSubgroupWithin K L hLK σ := by + rw [← D.extensionSubgroup_frobeniusFixedField K L hLK σ] + exact (mem_extensionSubgroup_iff K.field S hSK sK).2 s.2 + let a : C := ⟨QuotientGroup.mk sK, hsFixed⟩ + let b : C := ⟨QuotientGroup.mk tK, hCmC htFixed⟩ + have hconj : + (QuotientGroup.mk sK : + K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) * + QuotientGroup.mk tK * (QuotientGroup.mk sK)⁻¹ = + QuotientGroup.mk tK := by + exact congrArg Subtype.val (by + change a * b * a⁻¹ = b + simp) + apply (mem_extensionSubgroup_iff S T hTS _).2 + let cK : K.field.toSubgroup := ⟨s.1 * t.1 * s.1⁻¹, by + exact K.field.toSubgroup.mul_mem + (K.field.toSubgroup.mul_mem (hSK s.2) (hSK t.2)) + (K.field.toSubgroup.inv_mem (hSK s.2))⟩ + refine ⟨cK, ?_, rfl⟩ + change QuotientGroup.mk cK ∈ Cm.toSubgroup + change QuotientGroup.mk sK * QuotientGroup.mk tK * + (QuotientGroup.mk sK)⁻¹ ∈ Cm.toSubgroup + rw [hconj] + exact htFixed + +/-- The extension fixed by `φⁿᵐ` over the field fixed by `φⁿ` is +unramified. -/ +theorem frobeniusPowerFixedField_isUnramified (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) + (n m : ℕ) (hn : 0 < n) (hm : 0 < m) : + let σ := D.frobeniusPowerOfDegreeOne K L hLK φ hφ n hn + let σm := D.frobeniusPowerOfDegreeOne K L hLK φ hφ (n * m) + (Nat.mul_pos hn hm) + let S := D.frobeniusFixedField K L hLK σ + let T := D.frobeniusFixedField K L hLK σm + let hTS := D.frobeniusPowerFixedField_le K L hLK φ hφ n m hn hm + (DegreeData.AbstractExtension.mk T S hTS).IsUnramified D := by + dsimp only + let σ := D.frobeniusPowerOfDegreeOne K L hLK φ hφ n hn + let σm := D.frobeniusPowerOfDegreeOne K L hLK φ hφ (n * m) + (Nat.mul_pos hn hm) + let S := D.frobeniusFixedField K L hLK σ + let T := D.frobeniusFixedField K L hLK σm + let hTS := D.frobeniusPowerFixedField_le K L hLK φ hφ n m hn hm + rw [(DegreeData.AbstractExtension.mk T S hTS).isUnramified_iff_inertia_le D] + intro x hx + have hxI : x ∈ D.fieldInertia S := ⟨hx.1, hx.2⟩ + have hSI : D.fieldInertia S = D.fieldInertia L := + D.frobeniusFixedField_fieldInertia K L hLK σ + have hTI : D.fieldInertia T = D.fieldInertia L := + D.frobeniusFixedField_fieldInertia K L hLK σm + rw [hSI, ← hTI] at hxI + exact hxI.1 + +/-- Finiteness of the power-fixed-field tower. -/ +theorem frobeniusPowerFixedField_finite (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (φ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) + (n m : ℕ) (hn : 0 < n) (hm : 0 < m) : + let σ := D.frobeniusPowerOfDegreeOne K L hLK φ hφ n hn + let σm := D.frobeniusPowerOfDegreeOne K L hLK φ hφ (n * m) + (Nat.mul_pos hn hm) + let S := D.frobeniusFixedField K L hLK σ + let T := D.frobeniusFixedField K L hLK σm + let hTS := D.frobeniusPowerFixedField_le K L hLK φ hφ n m hn hm + Finite (S.toSubgroup ⧸ extensionSubgroup S T hTS) := by + dsimp only + let σ := D.frobeniusPowerOfDegreeOne K L hLK φ hφ n hn + let σm := D.frobeniusPowerOfDegreeOne K L hLK φ hφ (n * m) + (Nat.mul_pos hn hm) + let S := D.frobeniusFixedField K L hLK σ + let T := D.frobeniusFixedField K L hLK σm + let hSK := D.frobeniusFixedField_le K L hLK σ + let hTK := D.frobeniusFixedField_le K L hLK σm + let hTS := D.frobeniusPowerFixedField_le K L hLK φ hφ n m hn hm + let hTKfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field T hTK) := + D.frobeniusFixedField_finite K L hLK σm + exact FiniteIntermediateField.finite_extension_of_le hTK hSK hTS + +/-- The relative degree of the tower fixed by φⁿᵐ over the field fixed +by φⁿ is exactly m. -/ +private theorem frobeniusPowerFixedField_relIndex (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) + (n m : ℕ) (hn : 0 < n) (hm : 0 < m) : + let σ := D.frobeniusPowerOfDegreeOne K L hLK φ hφ n hn + let σm := D.frobeniusPowerOfDegreeOne K L hLK φ hφ + (n * m) (Nat.mul_pos hn hm) + let S := D.frobeniusFixedField K L hLK σ + let T := D.frobeniusFixedField K L hLK σm + T.toSubgroup.relIndex S.toSubgroup = m := by + dsimp only + let σ := D.frobeniusPowerOfDegreeOne K L hLK φ hφ n hn + let σm := D.frobeniusPowerOfDegreeOne K L hLK φ hφ + (n * m) (Nat.mul_pos hn hm) + let S := D.frobeniusFixedField K L hLK σ + let T := D.frobeniusFixedField K L hLK σm + let hTS := D.frobeniusPowerFixedField_le + K L hLK φ hφ n m hn hm + have hTSunramified : (DegreeData.AbstractExtension.mk T S hTS).IsUnramified D := + D.frobeniusPowerFixedField_isUnramified + K L hLK φ hφ n m hn hm + have hTSramification : + (T.toSubgroup ⊓ D.degree.toMonoidHom.ker).relIndex + (S.toSubgroup ⊓ D.degree.toMonoidHom.ker) = 1 := by + rw [Subgroup.relIndex_eq_one] + intro x hx + exact ⟨hTSunramified hx, hx.2⟩ + rw [relIndex_eq_map_relIndex_mul_inf_ker_relIndex + D.degree.toMonoidHom hTS, + hTSramification, Nat.mul_one] + let SR := D.frobeniusFixedResidueField K L hLK σ + let TR := D.frobeniusFixedResidueField K L hLK σm + have hSindex : (D.fieldImage S).index = (SR.residueDegree : ℕ) := by + have h := D.fieldImageAdd_index SR + change (D.fieldImage S).index = (SR.residueDegree : ℕ) at h + exact h + have hTindex : (D.fieldImage T).index = (TR.residueDegree : ℕ) := by + have h := D.fieldImageAdd_index TR + change (D.fieldImage T).index = (TR.residueDegree : ℕ) at h + exact h + have hresidueMul : + (T.toSubgroup.map D.degree.toMonoidHom).relIndex + (S.toSubgroup.map D.degree.toMonoidHom) * + (SR.residueDegree : ℕ) = (TR.residueDegree : ℕ) := by + rw [← hSindex, ← hTindex, D.fieldImage_eq_map, D.fieldImage_eq_map] + exact Subgroup.relIndex_mul_index (Subgroup.map_mono hTS) + rw [D.frobeniusFixedResidueField_residueDegree K L hLK σ, + D.frobeniusFixedResidueField_residueDegree K L hLK σm] at hresidueMul + rw [show D.frobeniusExponent K L hLK σm = n * m by + exact D.frobeniusExponent_powerOfDegreeOne + K L hLK φ hφ (n * m) (Nat.mul_pos hn hm), + show D.frobeniusExponent K L hLK σ = n by + exact D.frobeniusExponent_powerOfDegreeOne + K L hLK φ hφ n hn] at hresidueMul + apply Nat.eq_of_mul_eq_mul_right (Nat.mul_pos hn K.residueDegree.property) + calc + (T.toSubgroup.map D.degree.toMonoidHom).relIndex + (S.toSubgroup.map D.degree.toMonoidHom) * + (n * (K.residueDegree : ℕ)) = + (n * m) * (K.residueDegree : ℕ) := hresidueMul + _ = m * (n * (K.residueDegree : ℕ)) := by ac_rfl + +/-- The quotient between two successive Frobenius power fixed fields is +genuinely finite. This is obtained from the computed finite relative index, +before taking its natural-valued cardinality. -/ +theorem frobeniusPowerFixedField_quotientFinite (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) + (n m : ℕ) (hn : 0 < n) (hm : 0 < m) : + let σ := D.frobeniusPowerOfDegreeOne K L hLK φ hφ n hn + let σm := D.frobeniusPowerOfDegreeOne K L hLK φ hφ + (n * m) (Nat.mul_pos hn hm) + let S := D.frobeniusFixedField K L hLK σ + let T := D.frobeniusFixedField K L hLK σm + let hTS := D.frobeniusPowerFixedField_le + K L hLK φ hφ n m hn hm + Finite (S.toSubgroup ⧸ extensionSubgroup S T hTS) := by + dsimp only + let σ := D.frobeniusPowerOfDegreeOne K L hLK φ hφ n hn + let σm := D.frobeniusPowerOfDegreeOne K L hLK φ hφ + (n * m) (Nat.mul_pos hn hm) + let S := D.frobeniusFixedField K L hLK σ + let T := D.frobeniusFixedField K L hLK σm + let hTS := D.frobeniusPowerFixedField_le + K L hLK φ hφ n m hn hm + apply (Subgroup.index_ne_zero_iff_finite).mp + change T.toSubgroup.relIndex S.toSubgroup ≠ 0 + rw [D.frobeniusPowerFixedField_relIndex + K L hLK φ hφ n m hn hm] + exact hm.ne' + +/-- Cardinality form of the preceding relative-degree computation. -/ +theorem frobeniusPowerFixedField_quotientCard (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) + (n m : ℕ) (hn : 0 < n) (hm : 0 < m) : + let σ := D.frobeniusPowerOfDegreeOne K L hLK φ hφ n hn + let σm := D.frobeniusPowerOfDegreeOne K L hLK φ hφ + (n * m) (Nat.mul_pos hn hm) + let S := D.frobeniusFixedField K L hLK σ + let T := D.frobeniusFixedField K L hLK σm + let hTS := D.frobeniusPowerFixedField_le + K L hLK φ hφ n m hn hm + Nat.card (S.toSubgroup ⧸ extensionSubgroup S T hTS) = m := by + dsimp only + let σ := D.frobeniusPowerOfDegreeOne K L hLK φ hφ n hn + let σm := D.frobeniusPowerOfDegreeOne K L hLK φ hφ + (n * m) (Nat.mul_pos hn hm) + let S := D.frobeniusFixedField K L hLK σ + let T := D.frobeniusFixedField K L hLK σm + let hTS := D.frobeniusPowerFixedField_le + K L hLK φ hφ n m hn hm + let : Finite (S.toSubgroup ⧸ extensionSubgroup S T hTS) := + D.frobeniusPowerFixedField_quotientFinite + K L hLK φ hφ n m hn hm + calc + Nat.card (S.toSubgroup ⧸ extensionSubgroup S T hTS) = + (extensionSubgroup S T hTS).index := rfl + _ = T.toSubgroup.relIndex S.toSubgroup := by + rfl + _ = m := + D.frobeniusPowerFixedField_relIndex + K L hLK φ hφ n m hn hm + +/-- The restriction of the concrete element `φⁿ` is a degree-one +generator of `Gal(Σₘ/Σ)`. This is the generator to which the unit-cohomology axiom +is applied; retaining the actual representative is essential for +the subsequent equation involving `σ = φⁿ`. -/ +theorem frobeniusPowerFixedField_generator (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (φ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) + (n m : ℕ) (hn : 0 < n) (hm : 0 < m) : + let σ := D.frobeniusPowerOfDegreeOne K L hLK φ hφ n hn + let σm := D.frobeniusPowerOfDegreeOne K L hLK φ hφ (n * m) + (Nat.mul_pos hn hm) + let S := D.frobeniusFixedField K L hLK σ + let T := D.frobeniusFixedField K L hLK σm + let hTS := D.frobeniusPowerFixedField_le K L hLK φ hφ n m hn hm + let hTSnormal : (extensionSubgroup S T hTS).Normal := + D.frobeniusPowerFixedField_normal K L hLK φ hφ n m hn hm + letI := hTSnormal + ∃ s : S.toSubgroup, + D.frobeniusFixedFieldToClosure K L hLK σ s = + D.frobeniusInClosure K L hLK σ ∧ + D.normalizedDegree (D.frobeniusFixedResidueField K L hLK σ) s = + Multiplicative.ofAdd (1 : ZHat) ∧ + ∀ x : S.toSubgroup ⧸ extensionSubgroup S T hTS, + x ∈ Subgroup.zpowers (QuotientGroup.mk s) := by + dsimp only + let σ := D.frobeniusPowerOfDegreeOne K L hLK φ hφ n hn + let σm := D.frobeniusPowerOfDegreeOne K L hLK φ hφ (n * m) + (Nat.mul_pos hn hm) + let S := D.frobeniusFixedField K L hLK σ + let T := D.frobeniusFixedField K L hLK σm + let hTS := D.frobeniusPowerFixedField_le K L hLK φ hφ n m hn hm + let hTSnormal : (extensionSubgroup S T hTS).Normal := + D.frobeniusPowerFixedField_normal K L hLK φ hφ n m hn hm + let := hTSnormal + let k : K.field.toSubgroup := Quotient.out σ.1 + have hkσ : + (QuotientGroup.mk k : + K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) = σ.1 := + Quotient.out_eq' σ.1 + have hkClosure : QuotientGroup.mk k ∈ + (D.frobeniusClosure K L hLK σ).toSubgroup := by + rw [hkσ] + exact (D.frobeniusInClosure K L hLK σ).2 + let s : S.toSubgroup := ⟨k.1, ⟨k, hkClosure, rfl⟩⟩ + have hsClosure : + D.frobeniusFixedFieldToClosure K L hLK σ s = + D.frobeniusInClosure K L hLK σ := by + apply Subtype.ext + exact hkσ + have hsDegree : + D.normalizedDegree (D.frobeniusFixedResidueField K L hLK σ) s = + Multiplicative.ofAdd (1 : ZHat) := by + rw [← D.frobeniusFixedField_normalizedDegree_compatibility + K L hLK σ s, hsClosure] + exact D.fixedFieldNormalizedDegree_generator K L hLK σ + let hTSfinite : Finite + (S.toSubgroup ⧸ extensionSubgroup S T hTS) := + D.frobeniusPowerFixedField_finite K L hLK φ hφ n m hn hm + have hTSunramified : (DegreeData.AbstractExtension.mk T S hTS).IsUnramified D := + D.frobeniusPowerFixedField_isUnramified + K L hLK φ hφ n m hn hm + let SR := D.frobeniusFixedResidueField K L hLK σ + let : (extensionSubgroup SR.field T hTS).Normal := by + change (extensionSubgroup S T hTS).Normal + exact hTSnormal + let : Finite + (SR.field.toSubgroup ⧸ extensionSubgroup SR.field T hTS) := by + change Finite (S.toSubgroup ⧸ extensionSubgroup S T hTS) + exact hTSfinite + have hTSunramifiedR : + (DegreeData.AbstractExtension.mk T SR.field hTS).IsUnramified D := by + change (DegreeData.AbstractExtension.mk T S hTS).IsUnramified D + exact hTSunramified + refine ⟨s, hsClosure, hsDegree, ?_⟩ + exact D.quotient_generator_of_unramified_degree_one + SR T hTS hTSunramifiedR s hsDegree + +end DegreeData +end degreeOnePowerFields + +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusQuotientDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusQuotientDescent.lean new file mode 100644 index 0000000000..7914173d24 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusQuotientDescent.lean @@ -0,0 +1,515 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UniversalNormDescent + +/-! # Frobenius Quotient Descent -/ + +@[expose] public section +universe u v + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +/-! +# Frobenius quotient descent + +This module constructs the Frobenius quotient representation, identifies its +Birkhoff sums with Frobenius power sums, and proves the finite-support +descent from the maximal unramified field. +-/ + +noncomputable +section + +open CategoryTheory +open scoped BigOperators + +section representationDescent + +/-! +Mathlib's `Rep ℤ G` requires its coefficient ring and acting group in the +same universe; `IntegralRepGroupType` names that shared boundary. +-/ +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- Underlying coefficient of the actual quotient action, expressed through +the chosen quotient representative. -/ +theorem frobeniusQuotientAction_coe_out (D : DegreeData G) (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + (q : K.toSubgroup ⧸ D.extensionInertiaWithin K L hLK) + (a : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : + (D.frobeniusQuotientAction A K L hLK q a).1 = + A.ρ (Quotient.out q).1 a.1 := by + let k : K.toSubgroup := Quotient.out q + have hkq : (QuotientGroup.mk k : + K.toSubgroup ⧸ D.extensionInertiaWithin K L hLK) = q := + Quotient.out_eq' q + calc + (D.frobeniusQuotientAction A K L hLK q a).1 = + (D.frobeniusQuotientAction A K L hLK (QuotientGroup.mk k) a).1 := + congrArg (fun z => (D.frobeniusQuotientAction A K L hLK z a).1) hkq.symm + _ = A.ρ k.1 a.1 := rfl + _ = A.ρ (Quotient.out q).1 a.1 := rfl + +/-- The linear action of `G(\widetilde L/K)` on +`A_{\widetilde L}`. This packages the concrete quotient action from +the Frobenius norm-identity lemma in the form needed by the Tate-cohomology calculation. -/ +noncomputable def frobeniusQuotientActionLinearMap (D : DegreeData G) + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + (q : K.toSubgroup ⧸ D.extensionInertiaWithin K L hLK) : + ambientFixedAddSubgroup A (D.maximalUnramifiedField L) →ₗ[ℤ] + ambientFixedAddSubgroup A (D.maximalUnramifiedField L) where + toFun := D.frobeniusQuotientAction A K L hLK q + map_add' a b := by + refine Quotient.inductionOn' q ?_ + intro k + apply Subtype.ext + change A.ρ k.1 (a.1 + b.1) = A.ρ k.1 a.1 + A.ρ k.1 b.1 + exact map_add (A.ρ k.1) _ _ + map_smul' n a := by + refine Quotient.inductionOn' q ?_ + intro k + apply Subtype.ext + change A.ρ k.1 (n • a.1) = n • A.ρ k.1 a.1 + exact map_zsmul (A.ρ k.1) n a.1 + +/-- The actual `G(\widetilde L/K)`-representation on +`A_{\widetilde L}` used in the universal norm-descent lemma. -/ +noncomputable def frobeniusQuotientRepresentation (D : DegreeData G) + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] : + Rep ℤ (K.toSubgroup ⧸ D.extensionInertiaWithin K L hLK) := + Rep.of + { toFun := D.frobeniusQuotientActionLinearMap A K L hLK + map_one' := by + ext a + change A.ρ (1 : G) a.1 = a.1 + simp + map_mul' := by + intro q r + refine Quotient.inductionOn₂' q r ?_ + intro k l + ext a + change A.ρ (k.1 * l.1) a.1 = A.ρ k.1 (A.ρ l.1 a.1) + rw [map_mul] + rfl } + +/-- The Frobenius quotient representation evaluates by the chosen quotient action. -/ +@[simp] +theorem frobeniusQuotientRepresentation_apply (D : DegreeData G) + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + (q : K.toSubgroup ⧸ D.extensionInertiaWithin K L hLK) + (a : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : + (D.frobeniusQuotientRepresentation A K L hLK).ρ q a = + D.frobeniusQuotientAction A K L hLK q a := + rfl + +/-- The Birkhoff sum of the quotient action is the corresponding sum of Frobenius powers. -/ +theorem birkhoffSum_eq_frobeniusPowerSum (D : DegreeData G) + (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + (φ : K.toSubgroup ⧸ D.extensionInertiaWithin K L hLK) (n : ℕ) + (a : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : + birkhoffSum + ((D.frobeniusQuotientRepresentation A K L hLK).ρ φ) id n a = + D.frobeniusPowerSum A K L hLK φ n a := by + unfold birkhoffSum frobeniusPowerSum + rw [Finset.sum_fin_eq_sum_range] + apply Finset.sum_congr rfl + intro i hi + simp only [id_eq, Finset.mem_range.mp hi, dite_true] + exact (rep_action_pow_eq_iterate + (D.frobeniusQuotientRepresentation A K L hLK) φ i a).symm + +/-- A Frobenius power sum splits into its first `n` terms and a translated +block of `m` terms. -/ +theorem frobeniusPowerSum_add (D : DegreeData G) (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + (φ : K.toSubgroup ⧸ D.extensionInertiaWithin K L hLK) + (n m : ℕ) + (x : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : + D.frobeniusPowerSum A K L hLK φ (n + m) x = + D.frobeniusPowerSum A K L hLK φ n x + + D.frobeniusPowerSum A K L hLK φ m + (D.frobeniusQuotientAction A K L hLK (φ ^ n) x) := by + let B := D.frobeniusQuotientRepresentation A K L hLK + have hsum (r : ℕ) + (a : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : + birkhoffSum (B.ρ φ) id r a = + D.frobeniusPowerSum A K L hLK φ r a := + D.birkhoffSum_eq_frobeniusPowerSum A K L hLK φ r a + have hiterate : ((B.ρ φ)^[n]) x = + D.frobeniusQuotientAction A K L hLK (φ ^ n) x := + (rep_action_pow_eq_iterate B φ n x).symm + exact ((hsum (n + m) x).symm.trans + (birkhoffSum_add_right_apply (B.ρ φ) id n m x)).trans + (congrArg₂ + (fun a b : ambientFixedAddSubgroup A (D.maximalUnramifiedField L) => a + b) + (hsum n x) + ((hsum m (((B.ρ φ)^[n]) x)).trans + (congrArg (D.frobeniusPowerSum A K L hLK φ m) hiterate))) + +/-- Actual additive telescoping identity for the Frobenius power sum. -/ +theorem frobeniusPowerSum_action_sub (D : DegreeData G) + (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + (φ : K.toSubgroup ⧸ D.extensionInertiaWithin K L hLK) (n : ℕ) + (a : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : + D.frobeniusQuotientAction A K L hLK φ + (D.frobeniusPowerSum A K L hLK φ n a) - + D.frobeniusPowerSum A K L hLK φ n a = + D.frobeniusQuotientAction A K L hLK (φ ^ n) a - a := by + let B := D.frobeniusQuotientRepresentation A K L hLK + have h := birkhoffSum_apply_sub_birkhoffSum (B.ρ φ) id n a + have hshift : + B.ρ φ (birkhoffSum (B.ρ φ) id n a) = + birkhoffSum (B.ρ φ) id n (B.ρ φ a) := by + calc + B.ρ φ (birkhoffSum (B.ρ φ) id n a) = + birkhoffSum (B.ρ φ) (B.ρ φ ∘ id) n a := + map_birkhoffSum (B.ρ φ) (B.ρ φ) id n a + _ = birkhoffSum (B.ρ φ) id n (B.ρ φ a) := by + unfold birkhoffSum + apply Finset.sum_congr rfl + intro i _ + simp only [Function.comp_apply, id_eq] + exact (Function.Commute.self_iterate (B.ρ φ) i).eq a + rw [← hshift] at h + simp only [id_eq] at h + rw [D.birkhoffSum_eq_frobeniusPowerSum A K L hLK, + ← rep_action_pow_eq_iterate B φ n a] at h + change + D.frobeniusQuotientAction A K L hLK φ + (D.frobeniusPowerSum A K L hLK φ n a) - + D.frobeniusPowerSum A K L hLK φ n a = + D.frobeniusQuotientAction A K L hLK (φ ^ n) a - a at h + exact h + +/-- The difference of Frobenius power sums is represented by universal norm descent. -/ +theorem frobeniusPowerSum_sub_universalNormDescent (D : DegreeData G) (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + (φ : K.toSubgroup ⧸ D.extensionInertiaWithin K L hLK) + (n : ℕ) + (x y : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : + D.frobeniusPowerSum A K L hLK φ n (x - y) = + D.frobeniusPowerSum A K L hLK φ n x - + D.frobeniusPowerSum A K L hLK φ n y := by + unfold DegreeData.frobeniusPowerSum + change + (∑ i : Fin n, + D.frobeniusQuotientActionLinearMap A K L hLK (φ ^ i.1) (x - y)) = + (∑ i : Fin n, + D.frobeniusQuotientActionLinearMap A K L hLK (φ ^ i.1) x) - + ∑ i : Fin n, + D.frobeniusQuotientActionLinearMap A K L hLK (φ ^ i.1) y + simp only [map_sub, Finset.sum_sub_distrib] + +/-- An orbit sum of an element fixed by its first translate is scalar +multiplication by the orbit length. -/ +theorem frobeniusPowerSum_eq_nsmul_of_fixed (D : DegreeData G) (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + (q : K.toSubgroup ⧸ D.extensionInertiaWithin K L hLK) + (n : ℕ) + (a : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) + (ha : D.frobeniusQuotientAction A K L hLK q a = a) : + D.frobeniusPowerSum A K L hLK q n a = n • a := by + let B := D.frobeniusQuotientRepresentation A K L hLK + have hpow (i : ℕ) : + D.frobeniusQuotientAction A K L hLK (q ^ i) a = a := by + have haB : B.ρ q a = a := by + change D.frobeniusQuotientAction A K L hLK q a = a + exact ha + have hi := rep_action_pow_fixed B q a haB i + change D.frobeniusQuotientAction A K L hLK (q ^ i) a = a at hi + exact hi + unfold DegreeData.frobeniusPowerSum + simp_rw [hpow] + simp + +/-- Equivariance of `N_{\widetilde L/\widetilde K}` expressed inside +`A_{\widetilde L}`. -/ +theorem maximalUnramifiedNorm_frobeniusQuotientAction (D : DegreeData G) + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (q : K.toSubgroup ⧸ D.extensionInertiaWithin K L hLK) + (a : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) : + letI : Finite + ((D.maximalUnramifiedField K).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K L hLK + fixedFieldInclusion A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + (relativeNorm A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + (D.frobeniusQuotientAction A K L hLK q a)) = + D.frobeniusQuotientAction A K L hLK q + (fixedFieldInclusion A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + (relativeNorm A (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + a)) := by + let : Finite + ((D.maximalUnramifiedField K).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K L hLK + apply Subtype.ext + exact D.relativeNorm_frobeniusQuotientAction A K L hLK q a + +/-- A degree-zero element acts trivially on an element already defined +over `\widetilde K`. -/ +theorem frobeniusQuotientAction_fixed_of_degreeZero (D : DegreeData G) + (A : Rep ℤ G) (K : FiniteResidueAbstractField D) + (L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (q : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (hq : D.extensionNormalizedDegree K L hLK q = 1) + (a : ambientFixedAddSubgroup A (D.maximalUnramifiedField K.field)) : + D.frobeniusQuotientAction A K.field L hLK q + (fixedFieldInclusion A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) a) = + fixedFieldInclusion A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) a := by + let k : K.field.toSubgroup := Quotient.out q + have hkq : + (QuotientGroup.mk k : + K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) = q := + Quotient.out_eq' q + have hkDegree : D.normalizedDegree K k = 1 := by + calc + D.normalizedDegree K k = + D.extensionNormalizedDegree K L hLK (QuotientGroup.mk k) := rfl + _ = D.extensionNormalizedDegree K L hLK q := + congrArg (D.extensionNormalizedDegree K L hLK) hkq + _ = 1 := hq + have hkInertia : k ∈ D.fieldInertiaWithin K.field := by + rw [← D.normalizedDegree_ker K] + exact hkDegree + let kI : (D.maximalUnramifiedField K.field).toSubgroup := + ⟨k.1, ⟨k.2, hkInertia⟩⟩ + rw [← hkq] + apply Subtype.ext + exact a.2 kI + +/-- Applying `N_{\widetilde L/\widetilde K}` to equation `(*)` kills +all degree-zero differences. Hence the norm of `u` is fixed by the +chosen degree-one Frobenius element. -/ +theorem maximalUnramifiedNorm_fixed_of_hstar (D : DegreeData G) + (A : Rep ℤ G) (K : FiniteResidueAbstractField D) + (L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + {ι : Type v} (s : Finset ι) + (φ : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (τ : ι → + (D.extensionNormalizedDegreeContinuous K L hLK).toMonoidHom.ker) + (u : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) + (uᵢ : ι → ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) + (hstar : D.frobeniusQuotientAction A K.field L hLK φ u - u = + ∑ i ∈ s, + (D.frobeniusQuotientAction A K.field L hLK (τ i).1 (uᵢ i) - uᵢ i)) : + letI : Finite + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K.field L hLK + let N := relativeNorm A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + let b := fixedFieldInclusion A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) (N u) + D.frobeniusQuotientAction A K.field L hLK φ b = b := by + dsimp only + let : Finite + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K.field L hLK + let N := relativeNorm A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + let J := fixedFieldInclusion A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + have hnorm := congrArg (J.comp N) hstar + simp only [map_sub, map_sum] at hnorm + change J (N (D.frobeniusQuotientAction A K.field L hLK φ u)) - J (N u) = + ∑ i ∈ s, + (J (N (D.frobeniusQuotientAction A K.field L hLK (τ i).1 (uᵢ i))) - + J (N (uᵢ i))) at hnorm + have hφEquiv : + J (N (D.frobeniusQuotientAction A K.field L hLK φ u)) = + D.frobeniusQuotientAction A K.field L hLK φ (J (N u)) := by + simpa [J, N] using + D.maximalUnramifiedNorm_frobeniusQuotientAction A K.field L hLK φ u + rw [hφEquiv] at hnorm + have hzero (i : ι) : + J (N (D.frobeniusQuotientAction A K.field L hLK (τ i).1 (uᵢ i))) = + J (N (uᵢ i)) := by + calc + J (N (D.frobeniusQuotientAction A K.field L hLK (τ i).1 (uᵢ i))) = + D.frobeniusQuotientAction A K.field L hLK (τ i).1 (J (N (uᵢ i))) := by + simpa [J, N] using + D.maximalUnramifiedNorm_frobeniusQuotientAction + A K.field L hLK (τ i).1 (uᵢ i) + _ = J (N (uᵢ i)) := by + simpa [J, N] using D.frobeniusQuotientAction_fixed_of_degreeZero + A K L hLK (τ i).1 (τ i).2 (N (uᵢ i)) + simp_rw [hzero] at hnorm + have hnormzero : + D.frobeniusQuotientAction A K.field L hLK φ (J (N u)) - J (N u) = 0 := by + simpa only [sub_self, Finset.sum_const_zero] using hnorm + simpa [J, N] using sub_eq_zero.mp hnormzero + +/-- A `\widetilde K`-fixed element with finite Galois support descends to +`K` as soon as it is fixed by a degree-one Frobenius lift. The proof is +the finite-quotient argument implicit: the finite degree-quotient decomposition writes +each element of `Gal(P/K)` as a positive Frobenius power up to inertia. -/ +theorem descend_maximalUnramified_fixed_of_finiteSupport (D : DegreeData G) + (A : Rep ℤ G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) + (P : FiniteIntermediateField (D.maximalUnramifiedField L) K.field) + [hPnormal : (extensionSubgroup K.field P.field P.below).Normal] + (aI : ambientFixedAddSubgroup A (D.maximalUnramifiedField K.field)) + (aP : ambientFixedAddSubgroup A P.field) + (hsupport : + fixedFieldInclusion A P.field (D.maximalUnramifiedField L) P.above aP = + fixedFieldInclusion A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) aI) + (hfixed : + D.frobeniusQuotientAction A K.field L hLK φ.1 + (fixedFieldInclusion A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) aI) = + fixedFieldInclusion A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) aI) : + ∃ aK : ambientFixedAddSubgroup A K.field, + fixedFieldInclusion A K.field (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField_le K.field) aK = aI := by + let hPfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field P.field P.below) := P.finite + let f : K.field.toSubgroup := Quotient.out φ.1 + have hfφ : + (QuotientGroup.mk f : + K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) = φ.1 := + Quotient.out_eq' φ.1 + have hfDegree : D.normalizedDegree K f = + Multiplicative.ofAdd (1 : ZHat) := by + calc + D.normalizedDegree K f = + D.extensionNormalizedDegree K L hLK (QuotientGroup.mk f) := rfl + _ = D.extensionNormalizedDegree K L hLK φ.1 := + congrArg (D.extensionNormalizedDegree K L hLK) hfφ + _ = (Multiplicative.ofAdd (1 : ZHat)) ^ + D.frobeniusExponent K L hLK φ := + D.extensionNormalizedDegree_frobenius_eq_pow K L hLK φ + _ = Multiplicative.ofAdd (1 : ZHat) := by simp [hφ] + have hfFixed : A.ρ f.1 aI.1 = aI.1 := by + rw [← hfφ] at hfixed + exact congrArg Subtype.val hfixed + have hfPowFixed (n : ℕ) : A.ρ (f.1 ^ n) aI.1 = aI.1 := by + induction n with + | zero => simp + | succ n ih => + rw [pow_succ, map_mul] + change A.ρ (f.1 ^ n) (A.ρ f.1 aI.1) = aI.1 + rw [hfFixed, ih] + have hsval : aP.1 = aI.1 := congrArg Subtype.val hsupport + have hKfixed (k : K.field.toSubgroup) : A.ρ k.1 aI.1 = aI.1 := by + obtain ⟨q, hqk⟩ := D.frobeniusRestriction_surjective K P.field P.below + (QuotientGroup.mk k) + obtain ⟨n, _hn, hqDegree⟩ := q.2 + let t : K.field.toSubgroup := Quotient.out q.1 + have htq : + (QuotientGroup.mk t : + K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field P.field P.below) = q.1 := + Quotient.out_eq' q.1 + have htDegree : D.normalizedDegree K t = + (Multiplicative.ofAdd (1 : ZHat)) ^ n := by + calc + D.normalizedDegree K t = + D.extensionNormalizedDegree K P.field P.below + (QuotientGroup.mk t) := rfl + _ = D.extensionNormalizedDegree K P.field P.below q.1 := + congrArg (D.extensionNormalizedDegree K P.field P.below) htq + _ = _ := hqDegree + let z : K.field.toSubgroup := t⁻¹ * f ^ n + have hzInertia : z ∈ D.fieldInertiaWithin K.field := by + rw [← D.normalizedDegree_ker K] + change D.normalizedDegree K z = 1 + rw [map_mul, map_inv, map_pow, htDegree, hfDegree] + simp + let zI : (D.maximalUnramifiedField K.field).toSubgroup := + ⟨z.1, ⟨z.2, hzInertia⟩⟩ + have hzFixed : A.ρ z.1 aI.1 = aI.1 := aI.2 zI + have htFixed : A.ρ t.1 aI.1 = aI.1 := by + calc + A.ρ t.1 aI.1 = A.ρ t.1 (A.ρ z.1 aI.1) := + congrArg (A.ρ t.1) hzFixed.symm + _ = A.ρ (t.1 * z.1) aI.1 := by rw [map_mul]; rfl + _ = A.ρ (f.1 ^ n) aI.1 := by simp [z] + _ = aI.1 := hfPowFixed n + have htk : + (QuotientGroup.mk t : + K.field.toSubgroup ⧸ extensionSubgroup K.field P.field P.below) = + QuotientGroup.mk k := by + calc + QuotientGroup.mk t = + D.extensionRestriction K.field P.field P.below (QuotientGroup.mk t) := rfl + _ = D.extensionRestriction K.field P.field P.below q.1 := + congrArg (D.extensionRestriction K.field P.field P.below) htq + _ = QuotientGroup.mk k := hqk + have hrel : t⁻¹ * k ∈ extensionSubgroup K.field P.field P.below := + QuotientGroup.eq.mp htk + let rP : P.field.toSubgroup := ⟨(t⁻¹ * k).1, hrel⟩ + have hrval : rP.1 = (t⁻¹ * k).1 := rfl + have hrval' : rP.1 = t.1⁻¹ * k.1 := hrval + have hrFixed : A.ρ (t.1⁻¹ * k.1) aI.1 = aI.1 := by + rw [← hsval, ← hrval'] + exact aP.2 rP + calc + A.ρ k.1 aI.1 = A.ρ (t.1 * (t.1⁻¹ * k.1)) aI.1 := by simp + _ = A.ρ t.1 (A.ρ (t.1⁻¹ * k.1) aI.1) := by rw [map_mul]; rfl + _ = A.ρ t.1 aI.1 := by rw [hrFixed] + _ = aI.1 := htFixed + let aK : ambientFixedAddSubgroup A K.field := ⟨aI.1, hKfixed⟩ + refine ⟨aK, ?_⟩ + apply Subtype.ext + rfl + +end DegreeData + +end representationDescent + +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusSemigroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusSemigroup.lean new file mode 100644 index 0000000000..0cea85ed63 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusSemigroup.lean @@ -0,0 +1,102 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusFixedField + +/-! # Frobenius Semigroup -/ + +@[expose] public section +namespace ClassFormation + +open CyclicCohomology + +/-! +# The abstract reciprocity construction: the Frobenius semigroup + +The set `Frob(\widetilde L | K)` from is closed under multiplication: +normalized degrees are positive natural numbers and add under products. +-/ + +noncomputable +section + +namespace DegreeData + +variable {G : Type*} [Group G] [TopologicalSpace G] + +/-- Multiplication in this construction's Frobenius semigroup. -/ +def frobeniusMul (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (CyclicCohomology.extensionSubgroup (G := G) + K.field L hLK).Normal] + (σ τ : D.FrobeniusElements K L hLK) : + D.FrobeniusElements K L hLK := by + let m := D.frobeniusExponent K L hLK σ + let n := D.frobeniusExponent K L hLK τ + refine ⟨σ.1 * τ.1, m + n, + Nat.add_pos_left (D.frobeniusExponent_pos K L hLK σ) n, ?_⟩ + rw [map_mul, + D.extensionNormalizedDegree_frobenius_eq_pow K L hLK σ, + D.extensionNormalizedDegree_frobenius_eq_pow K L hLK τ, + pow_add] + +/-- +Multiplication of Frobenius elements is induced by multiplication of their quotient +representatives. +-/ +instance frobeniusElementsMul (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (CyclicCohomology.extensionSubgroup (G := G) + K.field L hLK).Normal] : + Mul (D.FrobeniusElements K L hLK) := + ⟨D.frobeniusMul K L hLK⟩ + +/-- Establishes the identity `(σ * τ).1 = σ.1 * τ.1`. -/ +@[simp] +theorem frobeniusMul_coe (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (CyclicCohomology.extensionSubgroup (G := G) + K.field L hLK).Normal] + (σ τ : D.FrobeniusElements K L hLK) : + (σ * τ).1 = σ.1 * τ.1 := + rfl + +/-- The induced multiplication makes the Frobenius elements a semigroup. -/ +instance frobeniusElementsSemigroup (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (CyclicCohomology.extensionSubgroup (G := G) + K.field L hLK).Normal] : + Semigroup (D.FrobeniusElements K L hLK) where + mul_assoc σ τ υ := by + apply Subtype.ext + change (σ.1 * τ.1) * υ.1 = σ.1 * (τ.1 * υ.1) + exact mul_assoc σ.1 τ.1 υ.1 + +/-- +`extensionNormalizedDegree_frobenius` satisfies the multiplication formula +`D.extensionNormalizedDegree K L hLK (σ * τ).1 = D.extensionNormalizedDegree K L hLK σ.1 * +D.extensionNormalizedDegree K L hLK τ.1`. +-/ +theorem extensionNormalizedDegree_frobenius_mul (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (CyclicCohomology.extensionSubgroup (G := G) + K.field L hLK).Normal] + (σ τ : D.FrobeniusElements K L hLK) : + D.extensionNormalizedDegree K L hLK (σ * τ).1 = + D.extensionNormalizedDegree K L hLK σ.1 * + D.extensionNormalizedDegree K L hLK τ.1 := + map_mul _ _ _ + +end DegreeData + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitDescent.lean new file mode 100644 index 0000000000..da8fce14df --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitDescent.lean @@ -0,0 +1,513 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteFieldUnitMaps + +/-! # Infinite Unit Descent -/ + +@[expose] public section +universe u v + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +/-! +# Infinite-level unit descent + +This module bundles finite intermediate fields over a finite base, defines +the infinite unit subgroup, proves its action and norm stability, and +descends maximal-unramified norm equations from finite support. +-/ + +noncomputable +section + +open CategoryTheory +open scoped BigOperators + +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace FiniteIntermediateField + +/-- The canonical finite-field extension bundle carried by a finite +intermediate field over a bundled finite base. -/ +noncomputable def toFiniteAbstractFieldExtension + {E : ClosedSubgroup G} (K : FiniteAbstractField G) + (M : FiniteIntermediateField E K.field) : + FiniteAbstractFieldExtension G := by + letI : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field M.field M.below) := + M.finite + exact FiniteAbstractFieldExtension.ofInclusion M.field K M.below + +/-- The upper endpoint of the canonical finite-field extension bundle. -/ +noncomputable def toFiniteAbstractField + {E : ClosedSubgroup G} (K : FiniteAbstractField G) + (M : FiniteIntermediateField E K.field) : FiniteAbstractField G := + (M.toFiniteAbstractFieldExtension K).field + +end FiniteIntermediateField + +namespace ValuationData + +variable {D : DegreeData G} {A : Rep ℤ G} + +/-- Unit-valued strengthening of finite-support descent. If the chosen +finite support is a unit, the descended K-rational element is a unit as +well. -/ +theorem descend_maximalUnramified_fixed_unit_of_finiteSupport + (v : ValuationData D A) [IsTopologicalGroup G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ : D.FrobeniusElements (K.toFiniteResidueAbstractField D) L hLK) + (hφ : D.frobeniusExponent + (K.toFiniteResidueAbstractField D) L hLK φ = 1) + (P : FiniteIntermediateField (D.maximalUnramifiedField L) K.field) + [hPnormal : (extensionSubgroup K.field P.field P.below).Normal] + (aI : ambientFixedAddSubgroup A (D.maximalUnramifiedField K.field)) + (aP : v.unitAddSubgroup (P.toFiniteAbstractField K)) + (hsupport : + fixedFieldInclusion A P.field (D.maximalUnramifiedField L) P.above aP.1 = + fixedFieldInclusion A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) aI) + (hfixed : + D.frobeniusQuotientAction A K.field L hLK φ.1 + (fixedFieldInclusion A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) aI) = + fixedFieldInclusion A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) aI) : + ∃ aK : v.unitAddSubgroup K, + fixedFieldInclusion A K.field (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField_le K.field) aK.1 = aI := by + obtain ⟨bK, hbK⟩ := + D.descend_maximalUnramified_fixed_of_finiteSupport + A (K.toFiniteResidueAbstractField D) L hLK φ hφ + P aI aP.1 hsupport hfixed + let : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field P.field P.below) := + P.finite + let EP := P.toFiniteAbstractFieldExtension K + have hKP : + fixedFieldInclusion A K.field P.field P.below bK = aP.1 := by + apply Subtype.ext + have hsupportVal := congrArg + (fun z : ambientFixedAddSubgroup A (D.maximalUnramifiedField L) => z.1) + hsupport + have hbKVal := congrArg + (fun z : ambientFixedAddSubgroup A (D.maximalUnramifiedField K.field) => z.1) + hbK + exact hbKVal.trans hsupportVal.symm + have htower := v.normalizedValuation_tower EP + (fixedFieldInclusion A K.field P.field P.below bK) + have hvalP : + v.valuationAt EP.field + (fixedFieldInclusion A K.field P.field P.below bK) = 0 := by + rw [hKP] + exact aP.2 + have hmul : + (EP.degree : ℕ) • + ((v.valuationAt K bK : v.valueGroup) : ZHat) = 0 := by + let ER := EP.toFiniteResidueAbstractExtension D + change (ER.residueDegree : ℕ) • + ((v.valuationAt EP.field + (fixedFieldInclusion A K.field P.field P.below bK) : + v.valueGroup) : ZHat) = + ((v.valuationAt K + (relativeNorm A K.field P.field P.below + (fixedFieldInclusion A K.field P.field P.below bK)) : + v.valueGroup) : ZHat) at htower + rw [hvalP] at htower + rw [show relativeNorm A K.field P.field P.below + (fixedFieldInclusion A K.field P.field P.below bK) = + (EP.degree : ℕ) • bK by + exact relativeNorm_fixedFieldInclusion A EP.toFiniteAbstractExtension bK, + map_nsmul] at htower + simpa using htower.symm + have hbKunit : bK ∈ v.unitAddSubgroup K := by + rw [v.mem_unitAddSubgroup_iff] + apply Subtype.ext + apply zHatMulNat_injective EP.degree.property + change (EP.degree : ℕ) • + ((v.valuationAt K bK : v.valueGroup) : ZHat) = + (EP.degree : ℕ) • ((0 : v.valueGroup) : ZHat) + simpa using hmul + exact ⟨⟨bK, hbKunit⟩, hbK⟩ + +/-- An element of an infinite algebraic extension is a unit when it is +already a unit at some finite intermediate stage. This is the literal +finite-support meaning of `U_E = \bigcup_M U_M` used. -/ +def IsFiniteStageUnit + (v : ValuationData D A) (E : ClosedSubgroup G) + (K : FiniteAbstractField G) + (a : ambientFixedAddSubgroup A E) : Prop := + ∃ M : FiniteIntermediateField E K.field, + ∃ u : v.unitAddSubgroup (M.toFiniteAbstractField K), + fixedFieldInclusion A M.field E M.above u.1 = a + +/-- The actual finite-stage unit group `U_E` inside `A_E`. -/ +noncomputable def infiniteUnitAddSubgroup + (v : ValuationData D A) (E : ClosedSubgroup G) + (K : FiniteAbstractField G) + (hEK : E.toSubgroup ≤ K.field.toSubgroup) : + AddSubgroup (ambientFixedAddSubgroup A E) where + carrier := {a | v.IsFiniteStageUnit E K a} + zero_mem' := by + let M := FiniteIntermediateField.base E K.field hEK + refine ⟨M, 0, ?_⟩ + rfl + add_mem' := by + intro a b ha hb + rcases ha with ⟨M, u, hu⟩ + rcases hb with ⟨N, w, hw⟩ + let P := M.compositum N + let hPfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field P.field P.below) := + P.finite + let hPM : P.field.toSubgroup ≤ M.field.toSubgroup := M.compositum_le_left N + let hPN : P.field.toSubgroup ≤ N.field.toSubgroup := M.compositum_le_right N + let hPMfinite : Finite + (M.field.toSubgroup ⧸ extensionSubgroup M.field P.field hPM) := + FiniteIntermediateField.finite_extension_of_le + P.below M.below hPM + let hPNfinite : Finite + (N.field.toSubgroup ⧸ extensionSubgroup N.field P.field hPN) := + FiniteIntermediateField.finite_extension_of_le + P.below N.below hPN + let : Finite + ((M.toFiniteAbstractField K).field.toSubgroup ⧸ + extensionSubgroup (M.toFiniteAbstractField K).field P.field hPM) := by + change Finite + (M.field.toSubgroup ⧸ extensionSubgroup M.field P.field hPM) + exact hPMfinite + let : Finite + ((N.toFiniteAbstractField K).field.toSubgroup ⧸ + extensionSubgroup (N.toFiniteAbstractField K).field P.field hPN) := by + change Finite + (N.field.toSubgroup ⧸ extensionSubgroup N.field P.field hPN) + exact hPNfinite + let EMP : FiniteAbstractFieldExtension G := + FiniteAbstractFieldExtension.ofInclusion + P.field (M.toFiniteAbstractField K) hPM + let ENP : FiniteAbstractFieldExtension G := + FiniteAbstractFieldExtension.ofInclusion + P.field (N.toFiniteAbstractField K) hPN + let hEMPfield : EMP.field = P.toFiniteAbstractField K := + FiniteAbstractField.eq_of_field_eq _ _ rfl + let hENPfield : ENP.field = P.toFiniteAbstractField K := + FiniteAbstractField.eq_of_field_eq _ _ rfl + let uP : v.unitAddSubgroup (P.toFiniteAbstractField K) := + hEMPfield ▸ v.finiteUnitInclusion EMP u + let wP : v.unitAddSubgroup (P.toFiniteAbstractField K) := + hENPfield ▸ v.finiteUnitInclusion ENP w + refine ⟨P, uP + wP, ?_⟩ + apply Subtype.ext + have huval : u.1.1 = a.1 := + congrArg (fun x : ambientFixedAddSubgroup A E => x.1) hu + have hwval : w.1.1 = b.1 := + congrArg (fun x : ambientFixedAddSubgroup A E => x.1) hw + change uP.1.1 + wP.1.1 = a.1 + b.1 + have huP : uP.1.1 = u.1.1 := + v.finiteUnitInclusion_transport_coe EMP + (P.toFiniteAbstractField K) hEMPfield u + have hwP : wP.1.1 = w.1.1 := + v.finiteUnitInclusion_transport_coe ENP + (P.toFiniteAbstractField K) hENPfield w + rw [huP, hwP, huval, hwval] + neg_mem' := by + intro a ha + rcases ha with ⟨M, u, hu⟩ + refine ⟨M, -u, ?_⟩ + apply Subtype.ext + exact congrArg Neg.neg (congrArg Subtype.val hu) + +/-- +Characterizes `a ∈ v.infiniteUnitAddSubgroup E K hEK` by the equivalent condition +`v.IsFiniteStageUnit E K a`. +-/ +@[simp] +theorem mem_infiniteUnitAddSubgroup_iff + (v : ValuationData D A) (E : ClosedSubgroup G) + (K : FiniteAbstractField G) + (hEK : E.toSubgroup ≤ K.field.toSubgroup) + (a : ambientFixedAddSubgroup A E) : + a ∈ v.infiniteUnitAddSubgroup E K hEK ↔ + v.IsFiniteStageUnit E K a := + Iff.rfl + +/-- The actual `G(\widetilde L/K)`-action preserves the finite-stage unit +group `U_{\widetilde L}`. A unit is first moved to a finite Galois +refinement of its support; that refinement is stable under the chosen +representative, so the translated element still has finite unit support. -/ +theorem frobeniusQuotientAction_mem_infiniteUnitAddSubgroup + (v : ValuationData D A) [IsTopologicalGroup G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (q : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (a : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) + (ha : a ∈ v.infiniteUnitAddSubgroup (D.maximalUnramifiedField L) K + (D.maximalUnramifiedField_le_of_le hLK)) : + D.frobeniusQuotientAction A K.field L hLK q a ∈ + v.infiniteUnitAddSubgroup (D.maximalUnramifiedField L) K + (D.maximalUnramifiedField_le_of_le hLK) := by + let E := D.maximalUnramifiedField L + let hEK := D.maximalUnramifiedField_le_of_le hLK + let hEnormal : (extensionSubgroup K.field E hEK).Normal := + D.extensionSubgroup_maximalUnramifiedField_normal K.field L hLK + rcases ha with ⟨M, u, hu⟩ + let R := M.galoisRefinement + have hRM : R.field.toSubgroup ≤ M.field.toSubgroup := + M.galoisRefinement_le_field + let hRfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field R.field R.below) := + R.finite + let hRMfinite : Finite + (M.field.toSubgroup ⧸ extensionSubgroup M.field R.field hRM) := + FiniteIntermediateField.finite_extension_of_le R.below M.below hRM + let : Finite + ((M.toFiniteAbstractField K).field.toSubgroup ⧸ + extensionSubgroup (M.toFiniteAbstractField K).field R.field hRM) := by + change Finite + (M.field.toSubgroup ⧸ extensionSubgroup M.field R.field hRM) + exact hRMfinite + let k : K.field.toSubgroup := Quotient.out q + have hkq : + (QuotientGroup.mk k : + K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) = q := + Quotient.out_eq' q + let EMR : FiniteAbstractFieldExtension G := + FiniteAbstractFieldExtension.ofInclusion + R.field (M.toFiniteAbstractField K) hRM + let ER := R.toFiniteAbstractFieldExtension K + let hEMRfield : EMR.field = R.toFiniteAbstractField K := + FiniteAbstractField.eq_of_field_eq _ _ rfl + let uR : v.unitAddSubgroup (R.toFiniteAbstractField K) := + hEMRfield ▸ v.finiteUnitInclusion EMR u + let uR' : v.unitAddSubgroup (R.toFiniteAbstractField K) := + v.unitActionLinearMap ER + (inferInstance : (extensionSubgroup K.field R.field R.below).Normal) k uR + refine ⟨R, uR', ?_⟩ + rw [← hkq] + apply Subtype.ext + have huval : u.1.1 = a.1 := + congrArg (fun z : ambientFixedAddSubgroup A E => z.1) hu + change A.ρ k.1 uR.1.1 = A.ρ k.1 a.1 + have huR : uR.1.1 = u.1.1 := + v.finiteUnitInclusion_transport_coe EMR + (R.toFiniteAbstractField K) hEMRfield u + rw [huR, huval] + +/-- The Frobenius power sum used preserves the finite-stage unit +group of the maximal unramified extension. -/ +theorem frobeniusPowerSum_mem_infiniteUnit_universalNormDescent + (v : ValuationData D A) [IsTopologicalGroup G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) + (n : ℕ) + (x : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) + (hx : x ∈ v.infiniteUnitAddSubgroup + (D.maximalUnramifiedField L) K + (D.maximalUnramifiedField_le_of_le hLK)) : + D.frobeniusPowerSum A K.field L hLK φ n x ∈ + v.infiniteUnitAddSubgroup (D.maximalUnramifiedField L) K + (D.maximalUnramifiedField_le_of_le hLK) := by + unfold DegreeData.frobeniusPowerSum + apply AddSubgroup.sum_mem + intro i _ + exact v.frobeniusQuotientAction_mem_infiniteUnitAddSubgroup + K L hLK (φ ^ i.1) x hx + +/-- The relative norm from `\widetilde L` to `\widetilde K`, included back +in `A_{\widetilde L}`, preserves finite-stage units. -/ +theorem maximalUnramifiedNorm_mem_infiniteUnitAddSubgroup + (v : ValuationData D A) [IsTopologicalGroup G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (a : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) + (ha : a ∈ v.infiniteUnitAddSubgroup + (D.maximalUnramifiedField L) K + (D.maximalUnramifiedField_le_of_le hLK)) : + letI : Finite + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K.field L hLK + fixedFieldInclusion A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + (relativeNorm A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) a) + ∈ v.infiniteUnitAddSubgroup (D.maximalUnramifiedField L) K + (D.maximalUnramifiedField_le_of_le hLK) := by + let : Finite + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K.field L hLK + let I := D.maximalUnramifiedField K.field + let E := D.maximalUnramifiedField L + let hEI := D.maximalUnramifiedField_mono hLK + let N := relativeNorm A I E hEI + let : Fintype (I.toSubgroup ⧸ extensionSubgroup I E hEI) := + Fintype.ofFinite _ + let qK (q : I.toSubgroup ⧸ extensionSubgroup I E hEI) : + K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK := + let r : I.toSubgroup := Quotient.out q + let k : K.field.toSubgroup := + ⟨r.1, (D.maximalUnramifiedField_le K.field) r.2⟩ + QuotientGroup.mk k + let f (q : I.toSubgroup ⧸ extensionSubgroup I E hEI) : + ambientFixedAddSubgroup A E := + D.frobeniusQuotientAction A K.field L hLK (qK q) a + have hterm (q : I.toSubgroup ⧸ extensionSubgroup I E hEI) : + f q ∈ v.infiniteUnitAddSubgroup E K + (D.maximalUnramifiedField_le_of_le hLK) := by + exact + v.frobeniusQuotientAction_mem_infiniteUnitAddSubgroup + K L hLK (qK q) a ha + have hsum : + ∑ q : I.toSubgroup ⧸ extensionSubgroup I E hEI, f q ∈ + v.infiniteUnitAddSubgroup E K + (D.maximalUnramifiedField_le_of_le hLK) := + AddSubgroup.sum_mem _ (fun q _ => hterm q) + have heq : + fixedFieldInclusion A I E hEI (N a) = + ∑ q : I.toSubgroup ⧸ extensionSubgroup I E hEI, f q := by + apply Subtype.ext + rw [fixedFieldInclusion_coe, relativeNorm_apply_coe] + rw [relativeNormValue] + change + ∑ q : I.toSubgroup ⧸ extensionSubgroup I E hEI, + relativeCosetAction A I E hEI a q = + (AddSubgroup.subtype (ambientFixedAddSubgroup A E)) + (∑ q : I.toSubgroup ⧸ extensionSubgroup I E hEI, f q) + rw [map_sum] + apply Finset.sum_congr rfl + intro q _ + let r : I.toSubgroup := Quotient.out q + have hrq : (QuotientGroup.mk r : + I.toSubgroup ⧸ extensionSubgroup I E hEI) = q := + Quotient.out_eq' q + change relativeCosetAction A I E hEI a q = (f q).1 + calc + relativeCosetAction A I E hEI a q = + relativeCosetAction A I E hEI a (QuotientGroup.mk r) := + congrArg (relativeCosetAction A I E hEI a) hrq.symm + _ = A.ρ r.1 a.1 := relativeCosetAction_mk A I E hEI a r + _ = (f q).1 := by rfl + rw [heq] + exact hsum + +/-- A maximal-unramified norm of a finite-stage unit descends to a genuine +unit of `K` once it is fixed by a degree-one Frobenius lift. -/ +theorem descend_maximalUnramifiedNorm_unit + (v : ValuationData D A) [IsTopologicalGroup G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (φ : D.FrobeniusElements (K.toFiniteResidueAbstractField D) L hLK) + (hφ : D.frobeniusExponent + (K.toFiniteResidueAbstractField D) L hLK φ = 1) + (a : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) + (ha : a ∈ v.infiniteUnitAddSubgroup (D.maximalUnramifiedField L) K + (D.maximalUnramifiedField_le_of_le hLK)) + (hfixed : + letI : Finite + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K.field L hLK + let N := relativeNorm A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + let J := fixedFieldInclusion A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + D.frobeniusQuotientAction A K.field L hLK φ.1 (J (N a)) = J (N a)) : + letI : Finite + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K.field L hLK + ∃ aK : v.unitAddSubgroup K, + fixedFieldInclusion A K.field (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField_le K.field) aK.1 = + relativeNorm A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) a := by + let : Finite + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K.field L hLK + let I := D.maximalUnramifiedField K.field + let E := D.maximalUnramifiedField L + let hEI := D.maximalUnramifiedField_mono hLK + let N := relativeNorm A I E hEI + let J := fixedFieldInclusion A I E hEI + let hEnormal : (extensionSubgroup K.field E + (D.maximalUnramifiedField_le_of_le hLK)).Normal := + D.extensionSubgroup_maximalUnramifiedField_normal K.field L hLK + have hmem : J (N a) ∈ v.infiniteUnitAddSubgroup E K + (D.maximalUnramifiedField_le_of_le hLK) := + v.maximalUnramifiedNorm_mem_infiniteUnitAddSubgroup K L hLK a ha + rcases hmem with ⟨Q, aQ, haQ⟩ + let R := Q.galoisRefinement + let hRQ : R.field.toSubgroup ≤ Q.field.toSubgroup := + Q.galoisRefinement_le_field + let hQabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) Q.field (le_baseField Q.field)) := + Q.absoluteFinite + let hRfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field R.field R.below) := + R.finite + let hRQfinite : Finite + (Q.field.toSubgroup ⧸ extensionSubgroup Q.field R.field hRQ) := + FiniteIntermediateField.finite_extension_of_le R.below Q.below hRQ + let : Finite + ((Q.toFiniteAbstractField K).field.toSubgroup ⧸ + extensionSubgroup (Q.toFiniteAbstractField K).field R.field hRQ) := by + change Finite + (Q.field.toSubgroup ⧸ extensionSubgroup Q.field R.field hRQ) + exact hRQfinite + let hRnormal : (extensionSubgroup K.field R.field R.below).Normal := + FiniteIntermediateField.galoisRefinement_normal Q + let EQR : FiniteAbstractFieldExtension G := + FiniteAbstractFieldExtension.ofInclusion + R.field (Q.toFiniteAbstractField K) hRQ + let hEQRfield : EQR.field = R.toFiniteAbstractField K := + FiniteAbstractField.eq_of_field_eq _ _ rfl + let aR : v.unitAddSubgroup (R.toFiniteAbstractField K) := + hEQRfield ▸ v.finiteUnitInclusion EQR aQ + have haR : fixedFieldInclusion A R.field E R.above aR.1 = J (N a) := by + apply Subtype.ext + change aR.1.1 = (J (N a)).1 + have haRcoe : aR.1.1 = aQ.1.1 := + v.finiteUnitInclusion_transport_coe EQR + (R.toFiniteAbstractField K) hEQRfield aQ + rw [haRcoe] + exact congrArg Subtype.val haQ + exact v.descend_maximalUnramified_fixed_unit_of_finiteSupport + K L hLK φ hφ R (N a) aR haR hfixed + +end ValuationData +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitNormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitNormSubgroup.lean new file mode 100644 index 0000000000..2f05f9567c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitNormSubgroup.lean @@ -0,0 +1,164 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitDescent + +/-! # Infinite Unit Norm Subgroup -/ + +@[expose] public section +universe u + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +/-! +# Infinite unit norm subgroups + +This module defines the finite-level and infinite unit norm ranges, proves +their tower compatibility, and compares them with the ambient norm +subgroups. +-/ + +noncomputable +section + +open CategoryTheory +open scoped BigOperators + +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace ValuationData + +variable {D : DegreeData G} {A : Rep ℤ G} + +/-- The image `N_{M/K} U_M` from one finite intermediate field. -/ +def finiteIntermediateUnitNormRange + (v : ValuationData D A) (E : ClosedSubgroup G) + (K : FiniteAbstractField G) + (M : FiniteIntermediateField E K.field) : + AddSubgroup (ambientFixedAddSubgroup A K.field) := by + letI : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field M.field M.below) := + M.finite + exact ((relativeNorm A K.field M.field M.below).comp + (v.unitAddSubgroup (M.toFiniteAbstractField K)).subtype).range + +/-- A unit norm obtained from a finite overfield of `M` already lies in the +unit norm range attached to `M`, by transitivity of the actual norm. -/ +theorem mem_finiteIntermediateUnitNormRange_of_overfield + (v : ValuationData D A) (E : ClosedSubgroup G) + (K : FiniteAbstractField G) + (M P : FiniteIntermediateField E K.field) + (hPM : P.field.toSubgroup ≤ M.field.toSubgroup) + [hPfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field P.field P.below)] + (uP : v.unitAddSubgroup (P.toFiniteAbstractField K)) + (aK : ambientFixedAddSubgroup A K.field) + (haK : relativeNorm A K.field P.field P.below uP.1 = aK) : + aK ∈ v.finiteIntermediateUnitNormRange E K M := by + let hMfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field M.field M.below) := + M.finite + let hPMfinite : Finite + (M.field.toSubgroup ⧸ extensionSubgroup M.field P.field hPM) := + FiniteIntermediateField.finite_extension_of_le P.below M.below hPM + let : Finite + ((M.toFiniteAbstractField K).field.toSubgroup ⧸ + extensionSubgroup (M.toFiniteAbstractField K).field P.field hPM) := by + change Finite + (M.field.toSubgroup ⧸ extensionSubgroup M.field P.field hPM) + exact hPMfinite + let EMP : FiniteAbstractFieldExtension G := + FiniteAbstractFieldExtension.ofInclusion + P.field (M.toFiniteAbstractField K) hPM + let uM : v.unitAddSubgroup (M.toFiniteAbstractField K) := + by + simpa [EMP, FiniteAbstractFieldExtension.ofInclusion] using + v.finiteUnitNorm EMP uP + let T : DegreeData.FiniteTower G := { + top := P.field + middle := M.field + base := K.field + top_le_middle := hPM + middle_le_base := M.below + finiteTopQuotient := hPMfinite + finiteBaseQuotient := hMfinite } + simp only [finiteIntermediateUnitNormRange] + change aK ∈ ((relativeNorm A K.field M.field M.below).comp + (v.unitAddSubgroup (M.toFiniteAbstractField K)).subtype).range + refine ⟨uM, ?_⟩ + change relativeNorm A K.field M.field M.below + (relativeNorm A M.field P.field hPM uP.1) = aK + calc + _ = relativeNorm A K.field P.field (hPM.trans M.below) uP.1 := + T.norm_trans_apply A uP.1 + _ = relativeNorm A K.field P.field P.below uP.1 := by rfl + _ = aK := haK + +/-- The universal unit norm group +`N_{E/K} U_E = ⋂_M N_{M/K} U_M`. -/ +def infiniteUnitNormSubgroup + (v : ValuationData D A) (E : ClosedSubgroup G) + (K : FiniteAbstractField G) : + AddSubgroup (ambientFixedAddSubgroup A K.field) := + ⨅ M : FiniteIntermediateField E K.field, + v.finiteIntermediateUnitNormRange E K M + +/-- +Characterizes `a ∈ v.infiniteUnitNormSubgroup E K` by the equivalent condition `∀ M : +FiniteIntermediateField E K.field, a ∈ v.finiteIntermediateUnitNormRange E K M`. +-/ +@[simp] +theorem mem_infiniteUnitNormSubgroup_iff + (v : ValuationData D A) (E : ClosedSubgroup G) + (K : FiniteAbstractField G) + (a : ambientFixedAddSubgroup A K.field) : + a ∈ v.infiniteUnitNormSubgroup E K ↔ + ∀ M : FiniteIntermediateField E K.field, + a ∈ v.finiteIntermediateUnitNormRange E K M := by + simp [infiniteUnitNormSubgroup] + +/-- +Proves the bound `v.finiteIntermediateUnitNormRange E K M ≤ finiteIntermediateNormRange A E +K.field M`. +-/ +theorem finiteIntermediateUnitNormRange_le_normRange + (v : ValuationData D A) (E : ClosedSubgroup G) + (K : FiniteAbstractField G) + (M : FiniteIntermediateField E K.field) : + v.finiteIntermediateUnitNormRange E K M ≤ + finiteIntermediateNormRange A E K.field M := by + let hMfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field M.field M.below) := + M.finite + change + ((relativeNorm A K.field M.field M.below).comp + (v.unitAddSubgroup (M.toFiniteAbstractField K)).subtype).range ≤ + (relativeNorm A K.field M.field M.below).range + rintro a ⟨u, hu⟩ + refine ⟨u.1, ?_⟩ + change relativeNorm A K.field M.field M.below u.1 = a at hu + exact hu + +/-- Proves the bound `v.infiniteUnitNormSubgroup E K ≤ infiniteNormSubgroup A E K.field`. -/ +theorem infiniteUnitNormSubgroup_le_normSubgroup + (v : ValuationData D A) (E : ClosedSubgroup G) + (K : FiniteAbstractField G) : + v.infiniteUnitNormSubgroup E K ≤ infiniteNormSubgroup A E K.field := by + intro a ha + rw [mem_infiniteNormSubgroup_iff] + intro M + exact v.finiteIntermediateUnitNormRange_le_normRange E K M + ((v.mem_infiniteUnitNormSubgroup_iff E K a).1 ha M) + +end ValuationData +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean new file mode 100644 index 0000000000..7551fdf341 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean @@ -0,0 +1,1206 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ConjugatePrimeNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.CorrectionSum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusPowerSumRelation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.NormClassRelation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.PrimeUnitDifferences +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FiniteStageCorrections +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ReciprocityMapMul + +/-! # Main Finite Reciprocity -/ + +@[expose] public section +universe u + +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +open CategoryTheory +open scoped BigOperators + + +/-! +# The abstract reciprocity construction, the finite reciprocity equivalence + +This file carries out the descent preparation. The reciprocity +value on the Frobenius semigroup is first mapped to the finite norm quotient. +We then compare two lifts by their positive Frobenius exponents, construct +the degree-zero quotient between unequal lifts, and prove that this quotient +has zero finite reciprocity value. Finally reciprocity multiplicativity supplies +additivity on the Frobenius semigroup, so the lift supplied by + the finite degree-quotient decomposition descends to the additive reciprocity homomorphism of + the finite reciprocity equivalence. +-/ + +noncomputable +section + +section finiteReciprocityValues + +/-! Mathlib's `Rep ℤ G` forces its representation-bearing group `G` to `Type 0`. -/ +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- The reciprocity value of a Frobenius element after passage from the +universal norm quotient to the finite quotient by `N_{L/K} A_L`. -/ +def finiteReciprocityValue (D : DegreeData G) (A : Rep ℤ G) + (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (σ : D.FrobeniusElements (K.toFiniteResidueAbstractField D) L hLK) : + FiniteNormQuotient A K.field L hLK := + D.maximalUnramifiedToFiniteNormQuotient A K.field L hLK + (D.reciprocityMap A v K L hLK σ) + +/-- reciprocity multiplicativity remains additive after passage from the universal norm +quotient to the finite quotient by `N_{L/K} A_L`. -/ +theorem finiteReciprocityValue_mul + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (α β : D.FrobeniusElements (K.toFiniteResidueAbstractField D) L hLK) : + D.finiteReciprocityValue A v K L hLK (α * β) = + D.finiteReciprocityValue A v K L hLK α + + D.finiteReciprocityValue A v K L hLK β := by + unfold finiteReciprocityValue + rw [D.reciprocityMap_mul A v hAxiom K L hLK α β] + exact map_add + (D.maximalUnramifiedToFiniteNormQuotient A K.field L hLK) _ _ + +/-- Formula for the finite Frobenius value using the chosen prime element +of its fixed field. -/ +theorem finiteReciprocityValue_eq_primeNormClass + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (σ : D.FrobeniusElements (K.toFiniteResidueAbstractField D) L hLK) : + let KR := K.toFiniteResidueAbstractField D + let S := D.frobeniusFixedField KR L hLK σ + let hSK := D.frobeniusFixedField_le KR L hLK σ + letI : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S hSK) := + D.frobeniusFixedField_finite KR L hLK σ + letI : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) S (le_baseField S)) := + D.frobeniusFixedField_absoluteFinite K L hLK σ + let Sigma : FiniteAbstractField G := ⟨S, inferInstance⟩ + D.finiteReciprocityValue A v K L hLK σ = + finiteNormClass A K.field L hLK + (relativeNorm A K.field S hSK (v.chosenPrimeElement Sigma)) := by + dsimp only + rw [finiteReciprocityValue, + D.reciprocityMap_eq_chosenPrime A v K L hLK σ] + exact D.maximalUnramifiedToFiniteNormQuotient_maximalUnramifiedNormClass + A K.field L hLK _ + +/-- The same formula for any prime element of the fixed field. Prime-choice +independence is exactly the reciprocity construction's consequence of the unit-cohomology axiom. -/ +theorem finiteReciprocityValue_eq_primeNormClass_of_isPrime + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (σ : D.FrobeniusElements (K.toFiniteResidueAbstractField D) L hLK) + (π : ambientFixedAddSubgroup A + (D.frobeniusFixedField (K.toFiniteResidueAbstractField D) L hLK σ)) + (hπ : + let Sigma : FiniteAbstractField G := + { field := D.frobeniusFixedField + (K.toFiniteResidueAbstractField D) L hLK σ + finite := D.frobeniusFixedField_absoluteFinite K L hLK σ } + v.IsPrimeElement Sigma π) : + let KR := K.toFiniteResidueAbstractField D + let S := D.frobeniusFixedField KR L hLK σ + let hSK := D.frobeniusFixedField_le KR L hLK σ + letI : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S hSK) := + D.frobeniusFixedField_finite KR L hLK σ + D.finiteReciprocityValue A v K L hLK σ = + finiteNormClass A K.field L hLK + (relativeNorm A K.field S hSK π) := by + dsimp only + rw [finiteReciprocityValue, + ← D.reciprocityValueOfPrime_eq_reciprocityMap + A v hAxiom K L hLK σ π hπ] + exact D.maximalUnramifiedToFiniteNormQuotient_maximalUnramifiedNormClass + A K.field L hLK _ + +end DegreeData + +end finiteReciprocityValues + +section frobeniusLiftAlgebra + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- The quotient between two Frobenius lifts when the exponent of the first +is strictly smaller. Its exponent is the positive difference. -/ +def frobeniusLiftDifference (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ τ : D.FrobeniusElements K L hLK) + (hdegree : D.frobeniusExponent K L hLK σ < + D.frobeniusExponent K L hLK τ) : + D.FrobeniusElements K L hLK := by + let nσ := D.frobeniusExponent K L hLK σ + let nτ := D.frobeniusExponent K L hLK τ + let m := nτ - nσ + have hm : 0 < m := Nat.sub_pos_of_lt hdegree + refine ⟨σ.1⁻¹ * τ.1, m, hm, ?_⟩ + rw [map_mul, map_inv, + D.extensionNormalizedDegree_frobenius_eq_pow K L hLK σ, + D.extensionNormalizedDegree_frobenius_eq_pow K L hLK τ] + have hle : nσ ≤ nτ := Nat.le_of_lt hdegree + change ((Multiplicative.ofAdd (1 : ZHat) : ZHatMul) ^ nσ)⁻¹ * + (Multiplicative.ofAdd (1 : ZHat) : ZHatMul) ^ nτ = + (Multiplicative.ofAdd (1 : ZHat) : ZHatMul) ^ m + rw [← Nat.add_sub_of_le hle, pow_add] + simp [m] + +/-- The difference of two Frobenius lifts coerces to their ambient quotient difference. -/ +@[simp] +theorem frobeniusLiftDifference_coe (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ τ : D.FrobeniusElements K L hLK) + (hdegree : D.frobeniusExponent K L hLK σ < + D.frobeniusExponent K L hLK τ) : + (D.frobeniusLiftDifference K L hLK σ τ hdegree).1 = + σ.1⁻¹ * τ.1 := + by simp [frobeniusLiftDifference] + +/-- Multiplying the smaller lift by its quotient recovers the larger lift. -/ +theorem mul_frobeniusLiftDifference (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ τ : D.FrobeniusElements K L hLK) + (hdegree : D.frobeniusExponent K L hLK σ < + D.frobeniusExponent K L hLK τ) : + σ * D.frobeniusLiftDifference K L hLK σ τ hdegree = τ := by + apply Subtype.ext + rw [frobeniusMul_coe, frobeniusLiftDifference_coe] + simp + +/-- If the two lifts have the same restriction, their quotient restricts +trivially. -/ +theorem frobeniusRestriction_frobeniusLiftDifference (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ τ : D.FrobeniusElements K L hLK) + (hRestriction : D.frobeniusRestriction K L hLK σ = + D.frobeniusRestriction K L hLK τ) + (hdegree : D.frobeniusExponent K L hLK σ < + D.frobeniusExponent K L hLK τ) : + D.frobeniusRestriction K L hLK + (D.frobeniusLiftDifference K L hLK σ τ hdegree) = 1 := by + change D.extensionRestriction K.field L hLK + (D.frobeniusLiftDifference K L hLK σ τ hdegree).1 = 1 + rw [D.frobeniusLiftDifference_coe K L hLK σ τ hdegree] + rw [map_mul, map_inv] + change (D.frobeniusRestriction K L hLK σ)⁻¹ * + D.frobeniusRestriction K L hLK τ = 1 + rw [hRestriction, inv_mul_cancel] + +end DegreeData + +end frobeniusLiftAlgebra + +section trivialRestrictionValues + +/-! Mathlib's `Rep ℤ G` forces its representation-bearing group `G` to `Type 0`. -/ +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- A Frobenius lift restricting trivially to `L` has zero value in the +finite norm quotient. Its fixed field contains `L`, so its norm to `K` factors through +`N_{L/K}`. -/ +theorem finiteReciprocityValue_eq_zero_of_restriction_eq_one + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (σ : D.FrobeniusElements (K.toFiniteResidueAbstractField D) L hLK) + (hσ : D.frobeniusRestriction + (K.toFiniteResidueAbstractField D) L hLK σ = 1) : + D.finiteReciprocityValue A v K L hLK σ = 0 := by + let KR := K.toFiniteResidueAbstractField D + let hLnormalKR : (extensionSubgroup KR.field L hLK).Normal := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal + let S := D.frobeniusFixedField KR L hLK σ + let hSK : S.toSubgroup ≤ K.field.toSubgroup := + D.frobeniusFixedField_le KR L hLK σ + let hSL : S.toSubgroup ≤ L.toSubgroup := + D.frobeniusFixedField_le_of_restriction_eq_one + KR L hLK σ hσ + let hSfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S hSK) := + D.frobeniusFixedField_finite KR L hLK σ + let hSLfinite : Finite + (L.toSubgroup ⧸ extensionSubgroup L S hSL) := + FiniteIntermediateField.finite_extension_of_le hSK hLK hSL + let hSabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) S (le_baseField S)) := + D.frobeniusFixedField_absoluteFinite K L hLK σ + let Sigma : FiniteAbstractField G := ⟨S, hSabsolute⟩ + rw [finiteReciprocityValue, + D.reciprocityMap_eq_chosenPrime A v K L hLK σ] + change D.maximalUnramifiedToFiniteNormQuotient A K.field L hLK + (D.maximalUnramifiedNormClass A K.field L + (relativeNorm A K.field S hSK (v.chosenPrimeElement Sigma))) = 0 + rw [D.maximalUnramifiedToFiniteNormQuotient_maximalUnramifiedNormClass] + apply (finiteNormClass_eq_zero_iff A K.field L hLK _).2 + change relativeNorm A K.field S hSK (v.chosenPrimeElement Sigma) ∈ + (relativeNorm A K.field L hLK).range + refine ⟨relativeNorm A L S hSL (v.chosenPrimeElement Sigma), ?_⟩ + let T : DegreeData.FiniteTower G := + { top := S + middle := L + base := K.field + top_le_middle := hSL + middle_le_base := hLK + finiteTopQuotient := hSLfinite + finiteBaseQuotient := hLfinite } + exact T.norm_trans_apply A (v.chosenPrimeElement Sigma) + +end DegreeData + +end trivialRestrictionValues + +section equalFrobeniusLifts + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- Equal restrictions and equal positive degrees give equal Frobenius +lifts. This is the first case in the lift-independence proof. -/ +theorem frobenius_eq_of_restriction_eq_of_exponent_eq (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + {σ τ : D.FrobeniusElements K L hLK} + (hRestriction : D.frobeniusRestriction K L hLK σ = + D.frobeniusRestriction K L hLK τ) + (hExponent : D.frobeniusExponent K L hLK σ = + D.frobeniusExponent K L hLK τ) : + σ = τ := by + apply D.frobenius_eq_of_restriction_eq_of_degree_eq + K L hLK hRestriction + rw [D.extensionNormalizedDegree_frobenius_eq_pow, + D.extensionNormalizedDegree_frobenius_eq_pow, hExponent] + +end DegreeData + +end equalFrobeniusLifts + +section liftComparison + +/-! Mathlib's `Rep ℤ G` forces its representation-bearing group `G` to `Type 0`. -/ +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- The complete degree comparison. Two lifts of the same +finite automorphism are either equal, or the larger-degree lift is the +smaller one times a positive Frobenius lift which restricts trivially and +therefore has zero value in the finite norm quotient. -/ +theorem finiteReciprocityHom_lift_comparison + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (σ τ : D.FrobeniusElements (K.toFiniteResidueAbstractField D) L hLK) + (hRestriction : D.frobeniusRestriction + (K.toFiniteResidueAbstractField D) L hLK σ = + D.frobeniusRestriction + (K.toFiniteResidueAbstractField D) L hLK τ) : + σ = τ ∨ + (∃ ι : D.FrobeniusElements (K.toFiniteResidueAbstractField D) L hLK, + τ = σ * ι ∧ + D.frobeniusRestriction + (K.toFiniteResidueAbstractField D) L hLK ι = 1 ∧ + D.finiteReciprocityValue A v K L hLK ι = 0) ∨ + (∃ ι : D.FrobeniusElements (K.toFiniteResidueAbstractField D) L hLK, + σ = τ * ι ∧ + D.frobeniusRestriction + (K.toFiniteResidueAbstractField D) L hLK ι = 1 ∧ + D.finiteReciprocityValue A v K L hLK ι = 0) := by + let KR := K.toFiniteResidueAbstractField D + let hLnormalKR : (extensionSubgroup KR.field L hLK).Normal := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal + rcases lt_trichotomy + (D.frobeniusExponent KR L hLK σ) + (D.frobeniusExponent KR L hLK τ) with hlt | heq | hgt + · right + left + let ι := D.frobeniusLiftDifference KR L hLK σ τ hlt + refine ⟨ι, ?_, ?_, ?_⟩ + · exact (D.mul_frobeniusLiftDifference KR L hLK σ τ hlt).symm + · exact D.frobeniusRestriction_frobeniusLiftDifference + KR L hLK σ τ hRestriction hlt + · exact D.finiteReciprocityValue_eq_zero_of_restriction_eq_one + A v K L hLK ι + (D.frobeniusRestriction_frobeniusLiftDifference + KR L hLK σ τ hRestriction hlt) + · left + exact D.frobenius_eq_of_restriction_eq_of_exponent_eq + KR L hLK hRestriction heq + · right + right + let ι := D.frobeniusLiftDifference KR L hLK τ σ hgt + refine ⟨ι, ?_, ?_, ?_⟩ + · exact (D.mul_frobeniusLiftDifference KR L hLK τ σ hgt).symm + · exact D.frobeniusRestriction_frobeniusLiftDifference + KR L hLK τ σ hRestriction.symm hgt + · exact D.finiteReciprocityValue_eq_zero_of_restriction_eq_one + A v K L hLK ι + (D.frobeniusRestriction_frobeniusLiftDifference + KR L hLK τ σ hRestriction.symm hgt) + +end DegreeData + +end liftComparison + +section chosenFrobeniusLifts + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- A specified Frobenius lift of a finite Galois automorphism, chosen from +the surjectivity in the finite degree-quotient decomposition. -/ +def chosenFiniteReciprocityFrobeniusLift (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (q : K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK) : + D.FrobeniusElements K L hLK := + Classical.choose (D.frobeniusRestriction_surjective K L hLK q) + +/-- The chosen finite-reciprocity Frobenius lift restricts to the prescribed Frobenius element. -/ +@[simp] +theorem frobeniusRestriction_chosenFiniteReciprocityFrobeniusLift (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (q : K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK) : + D.frobeniusRestriction K L hLK + (D.chosenFiniteReciprocityFrobeniusLift K L hLK q) = q := + Classical.choose_spec (D.frobeniusRestriction_surjective K L hLK q) + +end DegreeData + +end chosenFrobeniusLifts + +section finiteReciprocityHom + +/-! Mathlib's `Rep ℤ G` forces its representation-bearing group `G` to `Type 0`. -/ +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- The canonical candidate underlying the finite reciprocity equivalence, obtained by +choosing the finite degree-quotient decomposition lift and evaluating in the finite norm +quotient. Lift-independence and additivity are reduced to the concrete +steps above and reciprocity multiplicativity, respectively. -/ +def finiteReciprocityCandidate (D : DegreeData G) (A : Rep ℤ G) + (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] : + Additive (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK) → + FiniteNormQuotient A K.field L hLK := + fun q => D.finiteReciprocityValue A v K L hLK + (D.chosenFiniteReciprocityFrobeniusLift + (K.toFiniteResidueAbstractField D) L hLK q.toMul) + +/-- The finite reciprocity candidate evaluates a norm class through its chosen Frobenius lift. -/ +@[simp] +theorem finiteReciprocityCandidate_apply (D : DegreeData G) (A : Rep ℤ G) + (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (q : Additive + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)) : + D.finiteReciprocityCandidate A v K L hLK q = + D.finiteReciprocityValue A v K L hLK + (D.chosenFiniteReciprocityFrobeniusLift + (K.toFiniteResidueAbstractField D) L hLK q.toMul) := + rfl + +/-- Formula for the candidate using the fixed field of its specified +the finite degree-quotient decomposition lift. -/ +theorem finiteReciprocityCandidate_eq_primeNormClass + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (q : Additive + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)) : + let KR := K.toFiniteResidueAbstractField D + letI hLnormalKR : (extensionSubgroup KR.field L hLK).Normal := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal + let σ := D.chosenFiniteReciprocityFrobeniusLift KR L hLK q.toMul + let S := D.frobeniusFixedField KR L hLK σ + let hSK := D.frobeniusFixedField_le KR L hLK σ + letI : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S hSK) := + D.frobeniusFixedField_finite KR L hLK σ + letI : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) S (le_baseField S)) := + D.frobeniusFixedField_absoluteFinite K L hLK σ + let Sigma : FiniteAbstractField G := ⟨S, inferInstance⟩ + D.finiteReciprocityCandidate A v K L hLK q = + finiteNormClass A K.field L hLK + (relativeNorm A K.field S hSK (v.chosenPrimeElement Sigma)) := by + dsimp only + exact D.finiteReciprocityValue_eq_primeNormClass + A v K L hLK + (D.chosenFiniteReciprocityFrobeniusLift + (K.toFiniteResidueAbstractField D) L hLK q.toMul) + +/-- The finite reciprocity candidate sends the zero norm class to the identity. -/ +theorem finiteReciprocityCandidate_zero (D : DegreeData G) (A : Rep ℤ G) + (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] : + D.finiteReciprocityCandidate A v K L hLK 0 = 0 := by + apply D.finiteReciprocityValue_eq_zero_of_restriction_eq_one + exact D.frobeniusRestriction_chosenFiniteReciprocityFrobeniusLift + (K.toFiniteResidueAbstractField D) L hLK + (1 : K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK) + +/-- For two finite automorphisms, the chosen lift of their product and the +product of their chosen lifts have the same restriction. Applying the +degree comparison gives exactly the remaining lift-independence obligation +in the additivity proof of the finite reciprocity equivalence. -/ +theorem finiteReciprocityHom_product_lift_comparison + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (q r : Additive + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)) : + let KR := K.toFiniteResidueAbstractField D + letI hLnormalKR : (extensionSubgroup KR.field L hLK).Normal := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal + let σ₁ := D.chosenFiniteReciprocityFrobeniusLift KR L hLK q.toMul + let σ₂ := D.chosenFiniteReciprocityFrobeniusLift KR L hLK r.toMul + let σ₃ := D.chosenFiniteReciprocityFrobeniusLift KR L hLK (q + r).toMul + σ₃ = σ₁ * σ₂ ∨ + (∃ ι : D.FrobeniusElements KR L hLK, + σ₁ * σ₂ = σ₃ * ι ∧ + D.frobeniusRestriction KR L hLK ι = 1 ∧ + D.finiteReciprocityValue A v K L hLK ι = 0) ∨ + (∃ ι : D.FrobeniusElements KR L hLK, + σ₃ = (σ₁ * σ₂) * ι ∧ + D.frobeniusRestriction KR L hLK ι = 1 ∧ + D.finiteReciprocityValue A v K L hLK ι = 0) := by + dsimp only + apply D.finiteReciprocityHom_lift_comparison A v K L hLK + rw [D.frobeniusRestriction_chosenFiniteReciprocityFrobeniusLift, + D.frobeniusRestriction_mul, + D.frobeniusRestriction_chosenFiniteReciprocityFrobeniusLift, + D.frobeniusRestriction_chosenFiniteReciprocityFrobeniusLift] + rfl + +/-- Once reciprocity multiplicativity supplies additivity on the Frobenius semigroup, +the degree comparison proves that the finite reciprocity value is +independent of the chosen lift. This is the full three-case argument. -/ +private theorem finiteReciprocityValue_eq_of_same_restriction_of_mul + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hmul : ∀ α β : D.FrobeniusElements + (K.toFiniteResidueAbstractField D) L hLK, + D.finiteReciprocityValue A v K L hLK (α * β) = + D.finiteReciprocityValue A v K L hLK α + + D.finiteReciprocityValue A v K L hLK β) + (σ τ : D.FrobeniusElements (K.toFiniteResidueAbstractField D) L hLK) + (hRestriction : D.frobeniusRestriction + (K.toFiniteResidueAbstractField D) L hLK σ = + D.frobeniusRestriction + (K.toFiniteResidueAbstractField D) L hLK τ) : + D.finiteReciprocityValue A v K L hLK σ = + D.finiteReciprocityValue A v K L hLK τ := by + rcases D.finiteReciprocityHom_lift_comparison A v K L hLK + σ τ hRestriction with h | h | h + · rw [h] + · rcases h with ⟨ι, hτ, _, hι⟩ + rw [hτ, hmul, hι, add_zero] + · rcases h with ⟨ι, hσ, _, hι⟩ + rw [hσ, hmul, hι, add_zero] + +/-- The finite degree-quotient decomposition candidate is additive as soon as reciprocity +multiplicativity +is available. Lift-independence is invoked for the chosen lift of a +product and the product of the two chosen lifts. -/ +private theorem finiteReciprocityCandidate_add_of_mul + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hmul : ∀ α β : D.FrobeniusElements + (K.toFiniteResidueAbstractField D) L hLK, + D.finiteReciprocityValue A v K L hLK (α * β) = + D.finiteReciprocityValue A v K L hLK α + + D.finiteReciprocityValue A v K L hLK β) + (q r : Additive + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)) : + D.finiteReciprocityCandidate A v K L hLK (q + r) = + D.finiteReciprocityCandidate A v K L hLK q + + D.finiteReciprocityCandidate A v K L hLK r := by + let KR := K.toFiniteResidueAbstractField D + let hLnormalKR : (extensionSubgroup KR.field L hLK).Normal := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal + let σ₁ := D.chosenFiniteReciprocityFrobeniusLift KR L hLK q.toMul + let σ₂ := D.chosenFiniteReciprocityFrobeniusLift KR L hLK r.toMul + let σ₃ := D.chosenFiniteReciprocityFrobeniusLift KR L hLK (q + r).toMul + change D.finiteReciprocityValue A v K L hLK σ₃ = + D.finiteReciprocityValue A v K L hLK σ₁ + + D.finiteReciprocityValue A v K L hLK σ₂ + have hRestriction : + D.frobeniusRestriction KR L hLK σ₃ = + D.frobeniusRestriction KR L hLK (σ₁ * σ₂) := by + dsimp [σ₁, σ₂, σ₃] + rw [D.frobeniusRestriction_chosenFiniteReciprocityFrobeniusLift, + D.frobeniusRestriction_mul, + D.frobeniusRestriction_chosenFiniteReciprocityFrobeniusLift, + D.frobeniusRestriction_chosenFiniteReciprocityFrobeniusLift] + calc + D.finiteReciprocityValue A v K L hLK σ₃ = + D.finiteReciprocityValue A v K L hLK (σ₁ * σ₂) := + D.finiteReciprocityValue_eq_of_same_restriction_of_mul + A v K L hLK hmul σ₃ (σ₁ * σ₂) hRestriction + _ = D.finiteReciprocityValue A v K L hLK σ₁ + + D.finiteReciprocityValue A v K L hLK σ₂ := hmul σ₁ σ₂ + +/-- The finite reciprocity equivalence with the semigroup-additivity input isolated. The +final theorem discharges this input directly from reciprocity multiplicativity. -/ +def finiteReciprocityHom_of_mul + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hmul : ∀ α β : D.FrobeniusElements + (K.toFiniteResidueAbstractField D) L hLK, + D.finiteReciprocityValue A v K L hLK (α * β) = + D.finiteReciprocityValue A v K L hLK α + + D.finiteReciprocityValue A v K L hLK β) : + Additive (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK) →+ + FiniteNormQuotient A K.field L hLK where + toFun := D.finiteReciprocityCandidate A v K L hLK + map_zero' := by exact D.finiteReciprocityCandidate_zero A v K L hLK + map_add' := by + exact D.finiteReciprocityCandidate_add_of_mul A v K L hLK hmul + +/-- Evaluation of the conditional finite reciprocity homomorphism using any +Frobenius lift of the specified finite automorphism. -/ +private theorem finiteReciprocityHom_of_mul_apply_of_frobeniusLift + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hmul : ∀ α β : D.FrobeniusElements + (K.toFiniteResidueAbstractField D) L hLK, + D.finiteReciprocityValue A v K L hLK (α * β) = + D.finiteReciprocityValue A v K L hLK α + + D.finiteReciprocityValue A v K L hLK β) + (q : Additive + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)) + (σ : D.FrobeniusElements (K.toFiniteResidueAbstractField D) L hLK) + (hσ : D.frobeniusRestriction + (K.toFiniteResidueAbstractField D) L hLK σ = q.toMul) : + D.finiteReciprocityHom_of_mul A v K L hLK hmul q = + D.finiteReciprocityValue A v K L hLK σ := by + change D.finiteReciprocityValue A v K L hLK + (D.chosenFiniteReciprocityFrobeniusLift + (K.toFiniteResidueAbstractField D) L hLK q.toMul) = + D.finiteReciprocityValue A v K L hLK σ + apply D.finiteReciprocityValue_eq_of_same_restriction_of_mul + A v K L hLK hmul + rw [D.frobeniusRestriction_chosenFiniteReciprocityFrobeniusLift, hσ] + +/-- Prime-norm formula for the conditional finite reciprocity equivalence map, using +an arbitrary Frobenius lift and an arbitrary prime of its fixed field. -/ +private theorem finiteReciprocityHom_of_mul_apply_eq_primeNormClass + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hmul : ∀ α β : D.FrobeniusElements + (K.toFiniteResidueAbstractField D) L hLK, + D.finiteReciprocityValue A v K L hLK (α * β) = + D.finiteReciprocityValue A v K L hLK α + + D.finiteReciprocityValue A v K L hLK β) + (q : Additive + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)) + (σ : D.FrobeniusElements (K.toFiniteResidueAbstractField D) L hLK) + (hσ : D.frobeniusRestriction + (K.toFiniteResidueAbstractField D) L hLK σ = q.toMul) + (π : ambientFixedAddSubgroup A + (D.frobeniusFixedField (K.toFiniteResidueAbstractField D) L hLK σ)) + (hπ : + let Sigma : FiniteAbstractField G := + { field := D.frobeniusFixedField + (K.toFiniteResidueAbstractField D) L hLK σ + finite := D.frobeniusFixedField_absoluteFinite K L hLK σ } + v.IsPrimeElement Sigma π) : + let KR := K.toFiniteResidueAbstractField D + let S := D.frobeniusFixedField KR L hLK σ + let hSK := D.frobeniusFixedField_le KR L hLK σ + letI : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S hSK) := + D.frobeniusFixedField_finite KR L hLK σ + D.finiteReciprocityHom_of_mul A v K L hLK hmul q = + finiteNormClass A K.field L hLK + (relativeNorm A K.field S hSK π) := by + dsimp only + rw [D.finiteReciprocityHom_of_mul_apply_of_frobeniusLift + A v K L hLK hmul q σ hσ] + exact D.finiteReciprocityValue_eq_primeNormClass_of_isPrime + A v hAxiom K L hLK σ π hπ + +/-- **the finite reciprocity equivalence.** The prime-norm construction descends from positive +Frobenius lifts to an additive reciprocity homomorphism on the finite Galois +group. -/ +def finiteReciprocityHom + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] : + Additive (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK) →+ + FiniteNormQuotient A K.field L hLK := + D.finiteReciprocityHom_of_mul A v K L hLK + (D.finiteReciprocityValue_mul A v hAxiom K L hLK) + +/-- Prime-norm evaluation formula for the finite reciprocity equivalence, using any prime +element in the fixed field of a chosen Frobenius lift. -/ +theorem finiteReciprocityHom_apply_eq_primeNormClass + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (q : Additive + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)) + (σ : D.FrobeniusElements (K.toFiniteResidueAbstractField D) L hLK) + (hσ : D.frobeniusRestriction + (K.toFiniteResidueAbstractField D) L hLK σ = q.toMul) + (π : ambientFixedAddSubgroup A + (D.frobeniusFixedField (K.toFiniteResidueAbstractField D) L hLK σ)) + (hπ : + let Sigma : FiniteAbstractField G := + { field := D.frobeniusFixedField + (K.toFiniteResidueAbstractField D) L hLK σ + finite := D.frobeniusFixedField_absoluteFinite K L hLK σ } + v.IsPrimeElement Sigma π) : + let KR := K.toFiniteResidueAbstractField D + let S := D.frobeniusFixedField KR L hLK σ + let hSK := D.frobeniusFixedField_le KR L hLK σ + letI : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S hSK) := + D.frobeniusFixedField_finite KR L hLK σ + D.finiteReciprocityHom A v hAxiom K L hLK q = + finiteNormClass A K.field L hLK + (relativeNorm A K.field S hSK π) := by + exact D.finiteReciprocityHom_of_mul_apply_eq_primeNormClass + A v hAxiom K L hLK + (D.finiteReciprocityValue_mul A v hAxiom K L hLK) + q σ hσ π hπ + +end DegreeData + +end finiteReciprocityHom + +/-! +# The abstract reciprocity construction, the unramified norm-quotient equivalence + +This file proves the generator calculation in the unramified case: the finite reciprocity + equivalence sends arithmetic Frobenius to the prime +class. That class generates the finite norm quotient, so the resulting +reciprocity homomorphism is promoted to an additive equivalence. +-/ + +noncomputable +section + +section unramifiedFixedFields + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- For an unramified `L / K`, the fixed field of the degree-one +Frobenius lift is itself unramified over `K`. -/ +theorem unramifiedFrobenius_fixedField_isUnramified + (D : DegreeData G) + [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hnormal : (extensionSubgroup K.field L hLK).Normal] + (hUnramified : + (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D) : + (DegreeData.AbstractExtension.mk + (D.frobeniusFixedField K L hLK + (D.chosenUnramifiedFrobeniusLift K L hLK)) K.field + (D.frobeniusFixedField_le K L hLK + (D.chosenUnramifiedFrobeniusLift K L hLK))).IsUnramified D := by + let σ := D.chosenUnramifiedFrobeniusLift K L hLK + let S := D.frobeniusFixedField K L hLK σ + let hSK : S.toSubgroup ≤ K.field.toSubgroup := + D.frobeniusFixedField_le K L hLK σ + rw [(DegreeData.AbstractExtension.mk S K.field hSK).isUnramified_iff_inertia_le D] + intro g hg + have hgL : g ∈ L.toSubgroup := + ((DegreeData.AbstractExtension.mk L K.field hLK).isUnramified_iff_inertia_le D).1 + hUnramified hg + exact D.fieldInertia_le_frobeniusFixedField K L hLK σ + ⟨hgL, hg.2⟩ + +/-- The fixed field of the degree-one lift has degree one over `K` in the +unramified case. This is `f_{Σ/K}=d_K(φ_K)=1` together with +`[Σ:K]=f_{Σ/K}`. -/ +theorem unramifiedFrobenius_fixedField_degree + (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hnormal : (extensionSubgroup K.field L hLK).Normal] + [hfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hUnramified : + (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D) : + let σ := D.chosenUnramifiedFrobeniusLift K L hLK + let S := D.frobeniusFixedField K L hLK σ + let hSK := D.frobeniusFixedField_le K L hLK σ + letI : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S hSK) := + D.frobeniusFixedField_finite K L hLK σ + ((DegreeData.FiniteAbstractExtension.ofInclusion S K.field hSK).degree : ℕ) = 1 := by + let σ := D.chosenUnramifiedFrobeniusLift K L hLK + let S := D.frobeniusFixedField K L hLK σ + let hSK : S.toSubgroup ≤ K.field.toSubgroup := + D.frobeniusFixedField_le K L hLK σ + let : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S hSK) := + D.frobeniusFixedField_finite K L hLK σ + let E : DegreeData.FiniteAbstractExtension G := + DegreeData.FiniteAbstractExtension.ofInclusion S K.field hSK + have hSUnramified : + (DegreeData.AbstractExtension.mk S K.field hSK).IsUnramified D := + D.unramifiedFrobenius_fixedField_isUnramified + K L hLK hUnramified + calc + (E.degree : ℕ) = (E.residueDegree D : ℕ) := by + symm + exact E.residueDegree_eq_degree_of_isUnramified D (by + simpa [E, DegreeData.FiniteAbstractExtension.ofInclusion] using hSUnramified) + _ = D.frobeniusExponent K L hLK σ := + D.frobeniusFixedField_residueDegreeOverBase K L hLK σ + _ = 1 := D.chosenUnramifiedFrobeniusLift_exponent K L hLK + +end DegreeData + +end unramifiedFixedFields + +section unramifiedReciprocity + +/-! Mathlib's `Rep ℤ G` forces its representation-bearing group `G` to `Type 0`. -/ +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] +variable {D : DegreeData G} {A : Rep ℤ G} + +namespace ValuationData + +/-- The prime-norm calculation in the unramified norm-quotient equivalence: the prime element of +`K`, included into the fixed field of the degree-one lift, has norm equal +to the original prime element. -/ +theorem unramifiedFrobenius_primeNorm + (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hnormal : (extensionSubgroup K.field L hLK).Normal] + [Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hUnramified : + (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D) : + let KR := K.toFiniteResidueAbstractField D + letI hLnormalKR : (extensionSubgroup KR.field L hLK).Normal := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hnormal + let σ := D.chosenUnramifiedFrobeniusLift KR L hLK + let S := D.frobeniusFixedField KR L hLK σ + let hSK := D.frobeniusFixedField_le KR L hLK σ + letI : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S hSK) := + D.frobeniusFixedField_finite KR L hLK σ + relativeNorm A K.field S hSK + (fixedFieldInclusion A K.field S hSK (v.chosenPrimeElement K)) = + v.chosenPrimeElement K := by + dsimp only + let KR := K.toFiniteResidueAbstractField D + let hLnormalKR : (extensionSubgroup KR.field L hLK).Normal := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hnormal + let σ := D.chosenUnramifiedFrobeniusLift KR L hLK + let : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field + (D.frobeniusFixedField KR L hLK σ) + (D.frobeniusFixedField_le KR L hLK σ)) := + D.frobeniusFixedField_finite KR L hLK σ + let S := D.frobeniusFixedField KR L hLK σ + let hSK : S.toSubgroup ≤ K.field.toSubgroup := + D.frobeniusFixedField_le KR L hLK σ + let E : DegreeData.FiniteAbstractExtension G := + DegreeData.FiniteAbstractExtension.ofInclusion S K.field hSK + change relativeNorm A K.field S hSK + (fixedFieldInclusion A K.field S hSK (v.chosenPrimeElement K)) = + v.chosenPrimeElement K + calc + relativeNorm A K.field S hSK + (fixedFieldInclusion A K.field S hSK (v.chosenPrimeElement K)) = + (E.degree : ℕ) • v.chosenPrimeElement K := by + have hnorm := + relativeNorm_fixedFieldInclusion A E (v.chosenPrimeElement K) + change relativeNorm A K.field S hSK + (fixedFieldInclusion A K.field S hSK (v.chosenPrimeElement K)) = + (E.degree : ℕ) • v.chosenPrimeElement K at hnorm + exact hnorm + _ = 1 • v.chosenPrimeElement K := by + rw [show (E.degree : ℕ) = 1 by + have hdegree := + D.unramifiedFrobenius_fixedField_degree + KR L hLK hUnramified + change (E.degree : ℕ) = 1 at hdegree + exact hdegree] + _ = v.chosenPrimeElement K := one_nsmul _ + +/-- The included prime element is a prime element in the fixed field used +for the degree-one Frobenius lift. -/ +theorem unramifiedFrobenius_includedPrime_isPrime + (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hnormal : (extensionSubgroup K.field L hLK).Normal] + [Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hUnramified : + (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D) : + let KR := K.toFiniteResidueAbstractField D + letI hLnormalKR : (extensionSubgroup KR.field L hLK).Normal := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hnormal + let σ := D.chosenUnramifiedFrobeniusLift KR L hLK + let S := D.frobeniusFixedField KR L hLK σ + let hSK := D.frobeniusFixedField_le KR L hLK σ + letI : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S hSK) := + D.frobeniusFixedField_finite KR L hLK σ + letI : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) S (le_baseField S)) := + D.frobeniusFixedField_absoluteFinite K L hLK σ + let Sigma : FiniteAbstractField G := ⟨S, inferInstance⟩ + v.IsPrimeElement Sigma + (fixedFieldInclusion A K.field S hSK (v.chosenPrimeElement K)) := by + dsimp only + let KR := K.toFiniteResidueAbstractField D + let hLnormalKR : (extensionSubgroup KR.field L hLK).Normal := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hnormal + let σ := D.chosenUnramifiedFrobeniusLift KR L hLK + let S := D.frobeniusFixedField KR L hLK σ + let hSK : S.toSubgroup ≤ K.field.toSubgroup := + D.frobeniusFixedField_le KR L hLK σ + let hSfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S hSK) := + D.frobeniusFixedField_finite KR L hLK σ + let hSabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) S (le_baseField S)) := + D.frobeniusFixedField_absoluteFinite K L hLK σ + let Sigma : FiniteAbstractField G := ⟨S, hSabsolute⟩ + let ES : FiniteAbstractFieldExtension G := + { field := Sigma + base := K + below := hSK + finiteQuotient := hSfinite } + have hES : ES.IsUnramified D := by + have hunramified := + D.unramifiedFrobenius_fixedField_isUnramified KR L hLK hUnramified + change ES.IsUnramified D at hunramified + exact hunramified + exact v.prime_of_unramified ES hES + (v.chosenPrimeElement K) (v.chosenPrimeElement_isPrime K) + +/-- The last generator-and-order argument in the unramified norm-quotient equivalence. Any +homomorphism which sends the arithmetic Frobenius generator to the prime +class is bijective: the prime class generates the norm quotient, and both +finite groups have order `[L : K]`. -/ +theorem unramifiedReciprocity_bijective_of_generator + (v : ValuationData D A) (hAxiom : SatisfiesUnramifiedUnitCohomology D v) + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hnormal : (extensionSubgroup K.field L hLK).Normal] + [Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hUnramified : + (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D) + (f : Additive + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK) →+ + FiniteNormQuotient A K.field L hLK) + (hf : f (Additive.ofMul (D.unramifiedFrobenius + (K.toFiniteResidueAbstractField D) L hLK)) = + finiteNormClass A K.field L hLK (v.chosenPrimeElement K)) : + Function.Bijective f := by + let e := v.unramifiedReciprocityValuationEquiv + hAxiom K L hLK hUnramified + let E : FiniteAbstractFieldExtension G := + FiniteAbstractFieldExtension.ofInclusion L K hLK + let : NeZero (E.degree : ℕ) := ⟨E.degree.property.ne'⟩ + let : Finite (FiniteNormQuotient A K.field L hLK) := + Finite.of_equiv (ZMod (E.degree : ℕ)) e.symm + have hsurj : Function.Surjective f := by + rw [← AddMonoidHom.range_eq_top] + apply top_unique + rw [← v.primeClass_zmultiples_eq_top hAxiom K L hLK + hUnramified (v.chosenPrimeElement K) (v.chosenPrimeElement_isPrime K)] + rw [AddSubgroup.zmultiples_le] + exact ⟨Additive.ofMul (D.unramifiedFrobenius + (K.toFiniteResidueAbstractField D) L hLK), hf⟩ + apply (Nat.bijective_iff_surjective_and_card f).2 + refine ⟨hsurj, ?_⟩ + calc + Nat.card (Additive + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)) = + Nat.card + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK) := + Nat.card_congr Additive.toMul + _ = (extensionSubgroup K.field L hLK).index := + (Subgroup.index_eq_card _).symm + _ = (E.degree : ℕ) := by + exact E.toFiniteAbstractExtension.extensionSubgroup_index_eq_degree + _ = Nat.card (ZMod (E.degree : ℕ)) := + (Nat.card_zmod _).symm + _ = Nat.card (FiniteNormQuotient A K.field L hLK) := + (Nat.card_congr e.toEquiv).symm + +/-- Additive-equivalence form of the generator criterion for the unramified norm-quotient +equivalence. This is useful independently of the particular construction of the +reciprocity homomorphism: a homomorphism with the required Frobenius value +is canonically promoted to an equivalence. -/ +noncomputable def unramifiedReciprocityEquivOfGenerator + (v : ValuationData D A) (hAxiom : SatisfiesUnramifiedUnitCohomology D v) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hnormal : (extensionSubgroup K.field L hLK).Normal] + [Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hUnramified : + (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D) + (f : Additive + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK) →+ + FiniteNormQuotient A K.field L hLK) + (hf : f (Additive.ofMul (D.unramifiedFrobenius + (K.toFiniteResidueAbstractField D) L hLK)) = + finiteNormClass A K.field L hLK (v.chosenPrimeElement K)) : + Additive (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK) ≃+ + FiniteNormQuotient A K.field L hLK := + AddEquiv.ofBijective f + (v.unramifiedReciprocity_bijective_of_generator hAxiom + K L hLK hUnramified f hf) + +/-- The generator-dependent unramified reciprocity equivalence has the expected +value on each class. -/ +@[simp] +theorem unramifiedReciprocity_equiv_of_generator_apply + (v : ValuationData D A) (hAxiom : SatisfiesUnramifiedUnitCohomology D v) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hnormal : (extensionSubgroup K.field L hLK).Normal] + [Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hUnramified : + (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D) + (f : Additive + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK) →+ + FiniteNormQuotient A K.field L hLK) + (hf : f (Additive.ofMul (D.unramifiedFrobenius + (K.toFiniteResidueAbstractField D) L hLK)) = + finiteNormClass A K.field L hLK (v.chosenPrimeElement K)) + (q : Additive + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)) : + v.unramifiedReciprocityEquivOfGenerator hAxiom K L hLK + hUnramified f hf q = f q := + rfl + +/-- The finite reciprocity equivalence sends arithmetic Frobenius to the class of a prime +element when `L / K` is unramified. This is the generator calculation. -/ +theorem unramifiedReciprocity_frobenius_image + (v : ValuationData D A) (hAxiom : SatisfiesUnramifiedUnitCohomology D v) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hnormal : (extensionSubgroup K.field L hLK).Normal] + [Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hUnramified : + (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D) : + D.finiteReciprocityHom A v hAxiom K L hLK + (Additive.ofMul (D.unramifiedFrobenius + (K.toFiniteResidueAbstractField D) L hLK)) = + finiteNormClass A K.field L hLK (v.chosenPrimeElement K) := by + let KR := K.toFiniteResidueAbstractField D + let hLnormalKR : (extensionSubgroup KR.field L hLK).Normal := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hnormal + let σ := D.chosenUnramifiedFrobeniusLift KR L hLK + let S := D.frobeniusFixedField KR L hLK σ + let hSK := D.frobeniusFixedField_le KR L hLK σ + let hSfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S hSK) := + D.frobeniusFixedField_finite KR L hLK σ + let hSabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) S (le_baseField S)) := + D.frobeniusFixedField_absoluteFinite K L hLK σ + let Sigma : FiniteAbstractField G := ⟨S, hSabsolute⟩ + let π : ambientFixedAddSubgroup A S := + fixedFieldInclusion A K.field S hSK (v.chosenPrimeElement K) + have hπ : v.IsPrimeElement Sigma π := by + simpa [σ, S, hSK, π] using + v.unramifiedFrobenius_includedPrime_isPrime K L hLK hUnramified + rw [D.finiteReciprocityHom_apply_eq_primeNormClass + A v hAxiom K L hLK + (Additive.ofMul (D.unramifiedFrobenius KR L hLK)) σ + (by rfl) π hπ] + rw [show relativeNorm A K.field S hSK π = v.chosenPrimeElement K by + simpa [σ, S, hSK, π] using + v.unramifiedFrobenius_primeNorm K L hLK hUnramified] + +/-- **the unramified norm-quotient equivalence.** For a finite unramified Galois extension, the +reciprocity homomorphism of the finite reciprocity equivalence is an additive equivalence. -/ +noncomputable def unramifiedReciprocityEquiv + (v : ValuationData D A) (hAxiom : SatisfiesUnramifiedUnitCohomology D v) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hnormal : (extensionSubgroup K.field L hLK).Normal] + [Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hUnramified : + (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D) : + Additive (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK) ≃+ + FiniteNormQuotient A K.field L hLK := + v.unramifiedReciprocityEquivOfGenerator hAxiom K L hLK hUnramified + (D.finiteReciprocityHom A v hAxiom K L hLK) + (v.unramifiedReciprocity_frobenius_image hAxiom + K L hLK hUnramified) + +/-- The canonical unramified reciprocity equivalence evaluates by the normalized valuation class. -/ +@[simp] +theorem unramifiedReciprocityEquiv_apply + (v : ValuationData D A) (hAxiom : SatisfiesUnramifiedUnitCohomology D v) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hnormal : (extensionSubgroup K.field L hLK).Normal] + [Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hUnramified : + (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D) + (q : Additive + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)) : + v.unramifiedReciprocityEquiv hAxiom K L hLK hUnramified q = + D.finiteReciprocityHom A v hAxiom K L hLK q := + rfl + +end ValuationData +end unramifiedReciprocity +end +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity.lean new file mode 100644 index 0000000000..eecff2a7ae --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity.lean @@ -0,0 +1,20 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ConjugatePrimeNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.CorrectionSum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FiniteStageCorrections +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusPowerSumRelation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.NormClassRelation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.PrimeUnitDifferences +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ReciprocityMapMul + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/All.lean new file mode 100644 index 0000000000..ce6b88c63e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/All.lean @@ -0,0 +1,23 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ConjugatePrimeNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.CorrectionSum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FiniteStageCorrections +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusPowerSumRelation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.NormClassRelation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.PrimeUnitDifferences +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ReciprocityMapMul +/-! +# Multiplicativity of the abstract reciprocity map + +This aggregate exposes the construction proving that the abstract reciprocity +map respects multiplication. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ConjugatePrimeNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ConjugatePrimeNorm.lean new file mode 100644 index 0000000000..4c9817972a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ConjugatePrimeNorm.lean @@ -0,0 +1,228 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.RelativeNormDoubleCoset +/-! +# Norms of primes in conjugate Frobenius fixed fields + +This file transports prime elements across Frobenius-action conjugation and +proves equality of their relative norms in the base fixed field. +-/ + +@[expose] public section + +universe u + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +noncomputable +section + +open CategoryTheory + +section conjugatePrimeNorms + +/-! +Mathlib's `Rep ℤ G` requires its coefficient ring and acting group in the +same universe, so this representation-bearing portion has `G : IntegralRepGroupType`. +-/ +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- The prime used for the conjugate Frobenius fixed field may be chosen +as the conjugate of a prime in the original fixed field. Conjugation compatibility of + normalized valuations preserves primality, while conjugation equivariance of the relative +norm and the fact that the conjugating representative lies in `G_K` give +equality of the two norms in `A_K`. -/ +theorem exists_primeElement_frobeniusActionConjugate_norm_eq + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (φ σ : D.FrobeniusElements + (K.toFiniteResidueAbstractField D) L hLK) (m : ℕ) + (π : ambientFixedAddSubgroup A + (D.frobeniusFixedField (K.toFiniteResidueAbstractField D) L hLK σ)) + (hπ : + let KR := K.toFiniteResidueAbstractField D + let Sigma : FiniteAbstractField G := + ⟨D.frobeniusFixedField KR L hLK σ, + D.frobeniusFixedField_absoluteFinite K L hLK σ⟩ + v.IsPrimeElement Sigma π) : + let KR := K.toFiniteResidueAbstractField D + let σ' := D.frobeniusActionConjugate KR L hLK φ σ m + let S := D.frobeniusFixedField KR L hLK σ + let S' := D.frobeniusFixedField KR L hLK σ' + let hSK := D.frobeniusFixedField_le KR L hLK σ + let hS'K := D.frobeniusFixedField_le KR L hLK σ' + letI : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field S hSK) := + D.frobeniusFixedField_finite KR L hLK σ + letI : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field S' hS'K) := + D.frobeniusFixedField_finite KR L hLK σ' + let Sigma' : FiniteAbstractField G := + ⟨S', D.frobeniusFixedField_absoluteFinite K L hLK σ'⟩ + ∃ π' : ambientFixedAddSubgroup A S', + v.IsPrimeElement Sigma' π' ∧ + relativeNorm A K.field S' hS'K π' = + relativeNorm A K.field S hSK π := by + dsimp only + let KR := K.toFiniteResidueAbstractField D + let hLnormalKR : (extensionSubgroup KR.field L hLK).Normal := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal + let hLfiniteKR : Finite + (KR.field.toSubgroup ⧸ extensionSubgroup KR.field L hLK) := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLfinite + let σ' := D.frobeniusActionConjugate KR L hLK φ σ m + let S := D.frobeniusFixedField KR L hLK σ + let S' := D.frobeniusFixedField KR L hLK σ' + let hSK := D.frobeniusFixedField_le KR L hLK σ + let hS'K := D.frobeniusFixedField_le KR L hLK σ' + let hSfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S hSK) := + D.frobeniusFixedField_finite KR L hLK σ + let hS'finite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S' hS'K) := + D.frobeniusFixedField_finite KR L hLK σ' + let hSabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) S (le_baseField S)) := + D.frobeniusFixedField_absoluteFinite K L hLK σ + let hS'absolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) S' (le_baseField S')) := + D.frobeniusFixedField_absoluteFinite K L hLK σ' + let Sigma : FiniteAbstractField G := ⟨S, hSabsolute⟩ + let Sigma' : FiniteAbstractField G := ⟨S', hS'absolute⟩ + let q := φ.1 ^ m + let k : K.field.toSubgroup := Quotient.out q + let s : G := k.1⁻¹ + let C := conjugateClosedSubgroup S s + let Kc := conjugateClosedSubgroup K.field s + let hCS := conjugateClosedSubgroup_mono hSK s + have hC : C = S' := by + simpa [C, S, S', σ', q, k, s] using + D.conjugate_frobeniusFixedField_actionConjugate KR L hLK φ σ m + have hKc : Kc = K.field := by + ext x + change x ∈ conjugateClosedSubgroup K.field s ↔ x ∈ K.field + rw [conjugateClosedSubgroup_mem] + constructor + · intro hx + change x ∈ K.field.toSubgroup + simpa [s, mul_assoc] using K.field.toSubgroup.mul_mem + (K.field.toSubgroup.mul_mem k.2 hx) (K.field.toSubgroup.inv_mem k.2) + · intro hx + change s * x * s⁻¹ ∈ K.field.toSubgroup + simpa [s] using K.field.toSubgroup.mul_mem + (K.field.toSubgroup.mul_mem (K.field.toSubgroup.inv_mem k.2) hx) k.2 + let hCabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) C (le_baseField C)) := + Finite.of_equiv + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) S (le_baseField S)) + (by + simpa [C, baseField] using + (absoluteConjugateCosetEquiv S s).symm) + let SigmaC : FiniteAbstractField G := Sigma.conjugate s + let πC : ambientFixedAddSubgroup A C := + conjugateFixedElement A S s π + let π' : ambientFixedAddSubgroup A S' := + ⟨πC.1, by rw [← hC]; exact πC.2⟩ + have hπC : v.IsPrimeElement SigmaC πC := by + change v.valuationAt Sigma π = v.oneValue at hπ + change v.valuationAt SigmaC πC = v.oneValue + have hconj : v.valuationAt SigmaC πC = v.valuationAt Sigma π := by + simpa [C, SigmaC, Sigma, πC] using + v.normalizedValuation_conjugate Sigma s π + exact hconj.trans hπ + have hπ' : v.IsPrimeElement Sigma' π' := by + change v.valuationAt SigmaC πC = v.oneValue at hπC + change v.valuationAt Sigma' π' = v.oneValue + have valuation_transport + (C₀ S₀ : FiniteAbstractField G) + (h : C₀.field = S₀.field) + (aC : ambientFixedAddSubgroup A C₀.field) + (aS : ambientFixedAddSubgroup A S₀.field) + (ha : aC.1 = aS.1) : + v.valuationAt S₀ aS = v.valuationAt C₀ aC := by + cases C₀ with + | mk C₀ hC₀ => + cases S₀ with + | mk S₀ hS₀ => + dsimp only at h + subst S₀ + congr 1 + exact Subtype.ext ha.symm + have hSigmaField : SigmaC.field = Sigma'.field := by + change C = S' + exact hC + have hv : v.valuationAt Sigma' π' = v.valuationAt SigmaC πC := + valuation_transport SigmaC Sigma' hSigmaField πC π' rfl + exact hv.trans hπC + refine ⟨π', hπ', ?_⟩ + let hCSfinite : Finite + (Kc.toSubgroup ⧸ extensionSubgroup Kc C hCS) := + finite_conjugateExtension K.field S hSK s + have hnormC := relativeNorm_conjugate_apply A K.field S hSK s π + apply Subtype.ext + have relativeNorm_transport + (K₀ K₁ L₀ L₁ : ClosedSubgroup G) + (h₀ : L₀.toSubgroup ≤ K₀.toSubgroup) + (h₁ : L₁.toSubgroup ≤ K₁.toSubgroup) + [Finite (K₀.toSubgroup ⧸ extensionSubgroup K₀ L₀ h₀)] + [Finite (K₁.toSubgroup ⧸ extensionSubgroup K₁ L₁ h₁)] + (hK₀ : K₀ = K₁) (hL₀ : L₀ = L₁) + (a₀ : ambientFixedAddSubgroup A L₀) + (a₁ : ambientFixedAddSubgroup A L₁) + (ha : a₀.1 = a₁.1) : + ((relativeNorm A K₀ L₀ h₀ a₀ : + ambientFixedAddSubgroup A K₀) : A.V) = + ((relativeNorm A K₁ L₁ h₁ a₁ : + ambientFixedAddSubgroup A K₁) : A.V) := by + subst K₁ + subst L₁ + have ha' : a₀ = a₁ := Subtype.ext ha + subst a₁ + rfl + have hleft : + ((relativeNorm A K.field S' hS'K π' : + ambientFixedAddSubgroup A K.field) : A.V) = + ((relativeNorm A Kc C hCS πC : + ambientFixedAddSubgroup A Kc) : A.V) := by + exact (relativeNorm_transport Kc K.field C S' hCS hS'K + hKc hC πC π' rfl).symm + calc + ((relativeNorm A K.field S' hS'K π' : + ambientFixedAddSubgroup A K.field) : A.V) = + ((relativeNorm A Kc C hCS πC : + ambientFixedAddSubgroup A Kc) : A.V) := hleft + _ = ((conjugateFixedElement A K.field s + (relativeNorm A K.field S hSK π) : + ambientFixedAddSubgroup A Kc) : A.V) := + congrArg Subtype.val hnormC + _ = ((relativeNorm A K.field S hSK π : + ambientFixedAddSubgroup A K.field) : A.V) := by + rw [conjugateFixedElement_coe] + have hs : s⁻¹ = k.1 := by simp [s] + rw [hs] + change A.ρ k.1 (relativeNorm A K.field S hSK π).1 = + (relativeNorm A K.field S hSK π).1 + exact (relativeNorm A K.field S hSK π).2 k + +end DegreeData + +end conjugatePrimeNorms + +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/CorrectionSum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/CorrectionSum.lean new file mode 100644 index 0000000000..daf51dcee7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/CorrectionSum.lean @@ -0,0 +1,108 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder +/-! +# Correction sums for reciprocity multiplicativity + +This file packages the three correction coefficients and action elements, +proves their degree-zero property, and identifies their action-difference sum. +-/ + +@[expose] public section + +universe u + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +noncomputable +section + +open CategoryTheory +open scoped BigOperators + +/-- Correction coefficients in the order produced by the left-action +translation of the Frobenius multiplicativity identity. -/ +def frobeniusMultiplicativityCorrectionTerm + {R : IntegralRepGroupType} [Group R] + (B : Rep ℤ R) (τ₁ : R) (p₁ p₃ p₄ : B.V) : Fin 3 → B.V := + ![p₄ - p₃, p₁ - p₃, p₃ - B.ρ τ₁ p₃] + +/-- The corresponding left-action elements are `τ₄,τ₁,τ₄`. +The last action is `τ₄` because the product in the actual `(*)` +identity is `τ₄τ₁`. -/ +def frobeniusMultiplicativityCorrectionAction {R : Type*} + (τ₁ τ₄ : R) : Fin 3 → R := + ![τ₄, τ₁, τ₄] + +section correctionActionDegrees + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- All three actual correction actions have normalized degree zero, as +required by the universal norm-descent lemma. -/ +theorem frobeniusMultiplicativityCorrectionAction_mem_degreeKernel + (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ σ₁ σ₂ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) : + let σ₄ := D.frobeniusActionConjugate K L hLK φ σ₂ + (D.frobeniusExponent K L hLK σ₁) + let τ₁ := D.frobeniusActionRemainder K L hLK φ σ₁ + let τ₄ := D.frobeniusActionRemainder K L hLK φ σ₄ + ∀ i : Fin 3, + frobeniusMultiplicativityCorrectionAction τ₁ τ₄ i ∈ + (D.extensionNormalizedDegreeContinuous K L hLK).toMonoidHom.ker := by + dsimp only + let σ₄ := D.frobeniusActionConjugate K L hLK φ σ₂ + (D.frobeniusExponent K L hLK σ₁) + let τ₁ := D.frobeniusActionRemainder K L hLK φ σ₁ + let τ₄ := D.frobeniusActionRemainder K L hLK φ σ₄ + have hτ₁ := D.frobeniusActionRemainder_mem_degreeKernel + K L hLK φ σ₁ hφ + have hτ₄ := D.frobeniusActionRemainder_mem_degreeKernel + K L hLK φ σ₄ hφ + intro i + fin_cases i + · exact hτ₄ + · exact hτ₁ + · exact hτ₄ + +end DegreeData + +end correctionActionDegrees + +/-- Explicit left-action form of the group-ring identity, with the factor +order and the first two terms arranged as they occur in `(*)`. -/ +theorem frobeniusMultiplicativity_actionDifference_eq_correctionSum + {R : IntegralRepGroupType} [Group R] (B : Rep ℤ R) + (τ₁ τ₄ : R) (p₁ p₃ p₄ : B.V) : + (B.ρ τ₄ p₄ - p₄) + (B.ρ τ₁ p₁ - p₁) + + (p₃ - B.ρ (τ₄ * τ₁) p₃) = + ∑ i : Fin 3, + (B.ρ (frobeniusMultiplicativityCorrectionAction τ₁ τ₄ i) + (frobeniusMultiplicativityCorrectionTerm B τ₁ p₁ p₃ p₄ i) - + frobeniusMultiplicativityCorrectionTerm B τ₁ p₁ p₃ p₄ i) := by + have hmul : B.ρ (τ₄ * τ₁) p₃ = B.ρ τ₄ (B.ρ τ₁ p₃) := by + rw [map_mul] + rfl + rw [hmul] + simp [frobeniusMultiplicativityCorrectionAction, + frobeniusMultiplicativityCorrectionTerm, Fin.sum_univ_succ, map_sub] + abel + +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FiniteStageCorrections.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FiniteStageCorrections.lean new file mode 100644 index 0000000000..8235cc327c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FiniteStageCorrections.lean @@ -0,0 +1,292 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.PrimeUnitDifferences +/-! +# Finite-stage correction terms for reciprocity multiplicativity + +This file proves that the alternating Frobenius power sum and each coefficient +of the three-term correction identity are genuine finite-stage units. +-/ + +@[expose] public section + +universe u + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +noncomputable +section + +open CategoryTheory + +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- The alternating Frobenius power sum used in multiplicativity is a genuine +finite-stage unit. Splitting the long sum into two blocks expresses it as +power sums of differences of prime elements. -/ +theorem frobeniusPowerSum_alternating_mem_infiniteUnitAddSubgroup + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (φ σ₁ σ₂ : D.FrobeniusElements + (K.toFiniteResidueAbstractField D) L hLK) + (π₁ : ambientFixedAddSubgroup A + (D.frobeniusFixedField (K.toFiniteResidueAbstractField D) L hLK σ₁)) + (π₃ : ambientFixedAddSubgroup A + (D.frobeniusFixedField (K.toFiniteResidueAbstractField D) L hLK + (σ₁ * σ₂))) + (π₄ : ambientFixedAddSubgroup A + (D.frobeniusFixedField (K.toFiniteResidueAbstractField D) L hLK + (D.frobeniusActionConjugate (K.toFiniteResidueAbstractField D) + L hLK φ σ₂ + (D.frobeniusExponent (K.toFiniteResidueAbstractField D) + L hLK σ₁)))) + (hπ₁ : + let KR := K.toFiniteResidueAbstractField D + let Sigma1 : FiniteAbstractField G := + ⟨D.frobeniusFixedField KR L hLK σ₁, + D.frobeniusFixedField_absoluteFinite K L hLK σ₁⟩ + v.IsPrimeElement Sigma1 π₁) + (hπ₃ : + let KR := K.toFiniteResidueAbstractField D + let Sigma3 : FiniteAbstractField G := + ⟨D.frobeniusFixedField KR L hLK (σ₁ * σ₂), + D.frobeniusFixedField_absoluteFinite K L hLK (σ₁ * σ₂)⟩ + v.IsPrimeElement Sigma3 π₃) + (hπ₄ : + let KR := K.toFiniteResidueAbstractField D + let σ₄ := D.frobeniusActionConjugate KR L hLK φ σ₂ + (D.frobeniusExponent KR L hLK σ₁) + let Sigma4 : FiniteAbstractField G := + ⟨D.frobeniusFixedField KR L hLK σ₄, + D.frobeniusFixedField_absoluteFinite K L hLK σ₄⟩ + v.IsPrimeElement Sigma4 π₄) : + let KR := K.toFiniteResidueAbstractField D + let σ₃ := σ₁ * σ₂ + let σ₄ := D.frobeniusActionConjugate KR L hLK φ σ₂ + (D.frobeniusExponent KR L hLK σ₁) + let p₁ := fixedFieldInclusion A + (D.frobeniusFixedField KR L hLK σ₁) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField KR L hLK σ₁) π₁ + let p₃ := fixedFieldInclusion A + (D.frobeniusFixedField KR L hLK σ₃) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField KR L hLK σ₃) π₃ + let p₄ := fixedFieldInclusion A + (D.frobeniusFixedField KR L hLK σ₄) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField KR L hLK σ₄) π₄ + let u := D.frobeniusPowerSum A KR.field L hLK φ.1 + (D.frobeniusExponent KR L hLK σ₄) p₄ + + D.frobeniusPowerSum A KR.field L hLK φ.1 + (D.frobeniusExponent KR L hLK σ₁) p₁ - + D.frobeniusPowerSum A KR.field L hLK φ.1 + (D.frobeniusExponent KR L hLK σ₃) p₃ + u ∈ v.infiniteUnitAddSubgroup (D.maximalUnramifiedField L) K + (D.maximalUnramifiedField_le_of_le hLK) := by + dsimp only + let KR := K.toFiniteResidueAbstractField D + let hLnormalKR : (extensionSubgroup KR.field L hLK).Normal := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal + let hLfiniteKR : Finite + (KR.field.toSubgroup ⧸ extensionSubgroup KR.field L hLK) := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLfinite + let σ₃ := σ₁ * σ₂ + let σ₄ := D.frobeniusActionConjugate KR L hLK φ σ₂ + (D.frobeniusExponent KR L hLK σ₁) + let p₁ := fixedFieldInclusion A + (D.frobeniusFixedField KR L hLK σ₁) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField KR L hLK σ₁) π₁ + let p₃ := fixedFieldInclusion A + (D.frobeniusFixedField KR L hLK σ₃) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField KR L hLK σ₃) π₃ + let p₄ := fixedFieldInclusion A + (D.frobeniusFixedField KR L hLK σ₄) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField KR L hLK σ₄) π₄ + let n₁ := D.frobeniusExponent KR L hLK σ₁ + let n₃ := D.frobeniusExponent KR L hLK σ₃ + let n₄ := D.frobeniusExponent KR L hLK σ₄ + let U := v.infiniteUnitAddSubgroup (D.maximalUnramifiedField L) K + (D.maximalUnramifiedField_le_of_le hLK) + have h₄₃ : p₄ - p₃ ∈ U := by + exact D.frobeniusPrimeDifference_mem_infiniteUnitAddSubgroup + A v K L hLK σ₄ σ₃ π₄ π₃ hπ₄ hπ₃ + have h₁₃ : p₁ - p₃ ∈ U := by + exact D.frobeniusPrimeDifference_mem_infiniteUnitAddSubgroup + A v K L hLK σ₁ σ₃ π₁ π₃ hπ₁ hπ₃ + have h₃action : p₃ - D.frobeniusQuotientAction A KR.field L hLK + (φ.1 ^ n₄) p₃ ∈ U := by + exact D.frobeniusPrime_actionDifference_mem_infiniteUnitAddSubgroup + A v K L hLK σ₃ π₃ hπ₃ (φ.1 ^ n₄) + have h₁shift : p₁ - D.frobeniusQuotientAction A KR.field L hLK + (φ.1 ^ n₄) p₃ ∈ U := by + have heq : p₁ - D.frobeniusQuotientAction A KR.field L hLK + (φ.1 ^ n₄) p₃ = (p₁ - p₃) + + (p₃ - D.frobeniusQuotientAction A KR.field L hLK + (φ.1 ^ n₄) p₃) := by + abel + rw [heq] + exact U.add_mem h₁₃ h₃action + have hn₃ : n₃ = n₄ + n₁ := by + simp [n₁, n₃, n₄, σ₃, σ₄, Nat.add_comm] + let u := D.frobeniusPowerSum A KR.field L hLK φ.1 n₄ p₄ + + D.frobeniusPowerSum A KR.field L hLK φ.1 n₁ p₁ - + D.frobeniusPowerSum A KR.field L hLK φ.1 n₃ p₃ + have huEq : u = + D.frobeniusPowerSum A KR.field L hLK φ.1 n₄ (p₄ - p₃) + + D.frobeniusPowerSum A KR.field L hLK φ.1 n₁ + (p₁ - D.frobeniusQuotientAction A KR.field L hLK + (φ.1 ^ n₄) p₃) := by + dsimp [u] + rw [D.frobeniusPowerSum_sub_universalNormDescent, + D.frobeniusPowerSum_sub_universalNormDescent, hn₃, + D.frobeniusPowerSum_add] + abel + have hsum₄₃ : D.frobeniusPowerSum A KR.field L hLK φ.1 n₄ + (p₄ - p₃) ∈ U := + v.frobeniusPowerSum_mem_infiniteUnit_universalNormDescent + K L hLK φ.1 n₄ (p₄ - p₃) h₄₃ + have hsum₁ : D.frobeniusPowerSum A KR.field L hLK φ.1 n₁ + (p₁ - D.frobeniusQuotientAction A KR.field L hLK + (φ.1 ^ n₄) p₃) ∈ U := + v.frobeniusPowerSum_mem_infiniteUnit_universalNormDescent + K L hLK φ.1 n₁ _ h₁shift + rw [show D.frobeniusPowerSum A KR.field L hLK φ.1 n₄ p₄ + + D.frobeniusPowerSum A KR.field L hLK φ.1 n₁ p₁ - + D.frobeniusPowerSum A KR.field L hLK φ.1 n₃ p₃ = u from rfl, + huEq] + exact U.add_mem hsum₄₃ hsum₁ + +/-- Each of the three correction coefficients in the group-ring +identity is a finite-stage unit. In the left-action translation the +product is `τ₄τ₁`, so the third coefficient is `p₃-τ₁p₃`; it is +acted on by `τ₄` in `frobeniusMultiplicativityCorrectionAction`. -/ +theorem frobeniusCorrectionTerms_mem_infiniteUnitAddSubgroup + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (φ σ₁ σ₂ : D.FrobeniusElements + (K.toFiniteResidueAbstractField D) L hLK) + (π₁ : ambientFixedAddSubgroup A + (D.frobeniusFixedField (K.toFiniteResidueAbstractField D) L hLK σ₁)) + (π₃ : ambientFixedAddSubgroup A + (D.frobeniusFixedField (K.toFiniteResidueAbstractField D) L hLK + (σ₁ * σ₂))) + (π₄ : ambientFixedAddSubgroup A + (D.frobeniusFixedField (K.toFiniteResidueAbstractField D) L hLK + (D.frobeniusActionConjugate (K.toFiniteResidueAbstractField D) + L hLK φ σ₂ + (D.frobeniusExponent (K.toFiniteResidueAbstractField D) + L hLK σ₁)))) + (hπ₁ : + let KR := K.toFiniteResidueAbstractField D + let Sigma1 : FiniteAbstractField G := + ⟨D.frobeniusFixedField KR L hLK σ₁, + D.frobeniusFixedField_absoluteFinite K L hLK σ₁⟩ + v.IsPrimeElement Sigma1 π₁) + (hπ₃ : + let KR := K.toFiniteResidueAbstractField D + let Sigma3 : FiniteAbstractField G := + ⟨D.frobeniusFixedField KR L hLK (σ₁ * σ₂), + D.frobeniusFixedField_absoluteFinite K L hLK (σ₁ * σ₂)⟩ + v.IsPrimeElement Sigma3 π₃) + (hπ₄ : + let KR := K.toFiniteResidueAbstractField D + let σ₄ := D.frobeniusActionConjugate KR L hLK φ σ₂ + (D.frobeniusExponent KR L hLK σ₁) + let Sigma4 : FiniteAbstractField G := + ⟨D.frobeniusFixedField KR L hLK σ₄, + D.frobeniusFixedField_absoluteFinite K L hLK σ₄⟩ + v.IsPrimeElement Sigma4 π₄) : + let KR := K.toFiniteResidueAbstractField D + let σ₃ := σ₁ * σ₂ + let σ₄ := D.frobeniusActionConjugate KR L hLK φ σ₂ + (D.frobeniusExponent KR L hLK σ₁) + let p₁ := fixedFieldInclusion A + (D.frobeniusFixedField KR L hLK σ₁) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField KR L hLK σ₁) π₁ + let p₃ := fixedFieldInclusion A + (D.frobeniusFixedField KR L hLK σ₃) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField KR L hLK σ₃) π₃ + let p₄ := fixedFieldInclusion A + (D.frobeniusFixedField KR L hLK σ₄) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField KR L hLK σ₄) π₄ + let τ₁ := D.frobeniusActionRemainder KR L hLK φ σ₁ + ∀ i : Fin 3, + (![p₄ - p₃, p₁ - p₃, + p₃ - D.frobeniusQuotientAction A KR.field L hLK τ₁ p₃] : + Fin 3 → ambientFixedAddSubgroup A + (D.maximalUnramifiedField L)) i ∈ + v.infiniteUnitAddSubgroup (D.maximalUnramifiedField L) K + (D.maximalUnramifiedField_le_of_le hLK) := by + dsimp only + let KR := K.toFiniteResidueAbstractField D + let hLnormalKR : (extensionSubgroup KR.field L hLK).Normal := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal + let hLfiniteKR : Finite + (KR.field.toSubgroup ⧸ extensionSubgroup KR.field L hLK) := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLfinite + let σ₃ := σ₁ * σ₂ + let σ₄ := D.frobeniusActionConjugate KR L hLK φ σ₂ + (D.frobeniusExponent KR L hLK σ₁) + let p₁ := fixedFieldInclusion A + (D.frobeniusFixedField KR L hLK σ₁) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField KR L hLK σ₁) π₁ + let p₃ := fixedFieldInclusion A + (D.frobeniusFixedField KR L hLK σ₃) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField KR L hLK σ₃) π₃ + let p₄ := fixedFieldInclusion A + (D.frobeniusFixedField KR L hLK σ₄) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField KR L hLK σ₄) π₄ + let τ₁ := D.frobeniusActionRemainder KR L hLK φ σ₁ + have h₄₃ := D.frobeniusPrimeDifference_mem_infiniteUnitAddSubgroup + A v K L hLK σ₄ σ₃ π₄ π₃ hπ₄ hπ₃ + have h₁₃ := D.frobeniusPrimeDifference_mem_infiniteUnitAddSubgroup + A v K L hLK σ₁ σ₃ π₁ π₃ hπ₁ hπ₃ + have h₃action := + D.frobeniusPrime_actionDifference_mem_infiniteUnitAddSubgroup + A v K L hLK σ₃ π₃ hπ₃ τ₁ + intro i + fin_cases i + · change p₄ - p₃ ∈ _ + exact h₄₃ + · change p₁ - p₃ ∈ _ + exact h₁₃ + · change p₃ - D.frobeniusQuotientAction A KR.field L hLK τ₁ p₃ ∈ _ + exact h₃action + + +end DegreeData + +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusActionRemainder.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusActionRemainder.lean new file mode 100644 index 0000000000..365c150197 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusActionRemainder.lean @@ -0,0 +1,426 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.Universal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferOrbitClosure +/-! +# Frobenius action remainders + +This file develops the Frobenius exponent, conjugation, quotient-action, and +action-remainder identities used by reciprocity-map multiplicativity. +-/ + +@[expose] public section + +universe u + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +noncomputable +section + +open CategoryTheory + +section frobeniusAlgebra + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- The exponent is additive under multiplication in the Frobenius +semigroup. -/ +@[simp] +theorem frobeniusExponent_mul (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ₁ σ₂ : D.FrobeniusElements K L hLK) : + D.frobeniusExponent K L hLK (σ₁ * σ₂) = + D.frobeniusExponent K L hLK σ₁ + + D.frobeniusExponent K L hLK σ₂ := by + apply proCIntegerOne_pow_nat_injective + calc + (Multiplicative.ofAdd (1 : ZHat)) ^ + D.frobeniusExponent K L hLK (σ₁ * σ₂) = + D.extensionNormalizedDegree K L hLK (σ₁ * σ₂).1 := + (D.extensionNormalizedDegree_frobenius_eq_pow K L hLK + (σ₁ * σ₂)).symm + _ = D.extensionNormalizedDegree K L hLK σ₁.1 * + D.extensionNormalizedDegree K L hLK σ₂.1 := by + rw [frobeniusMul_coe, map_mul] + _ = (Multiplicative.ofAdd (1 : ZHat)) ^ + D.frobeniusExponent K L hLK σ₁ * + (Multiplicative.ofAdd (1 : ZHat)) ^ + D.frobeniusExponent K L hLK σ₂ := by + rw [D.extensionNormalizedDegree_frobenius_eq_pow, + D.extensionNormalizedDegree_frobenius_eq_pow] + _ = (Multiplicative.ofAdd (1 : ZHat)) ^ + (D.frobeniusExponent K L hLK σ₁ + + D.frobeniusExponent K L hLK σ₂) := by + rw [pow_add] + +end DegreeData + +end frobeniusAlgebra + +section frobeniusQuotientActions + +/-! +Mathlib's `Rep ℤ G` requires its coefficient ring and acting group in the +same universe, so this representation-bearing portion has `G : IntegralRepGroupType`. +-/ +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- A Frobenius element fixes the elements of its actual fixed field, +viewed inside `A_{\widetilde L}`. -/ +theorem frobeniusQuotientAction_fixedFieldInclusion (D : DegreeData G) + (A : Rep ℤ G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) + (a : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σ)) : + D.frobeniusQuotientAction A K.field L hLK σ.1 + (fixedFieldInclusion A (D.frobeniusFixedField K L hLK σ) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ) a) = + fixedFieldInclusion A (D.frobeniusFixedField K L hLK σ) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ) a := by + let k : K.field.toSubgroup := Quotient.out σ.1 + have hσk : σ.1 = QuotientGroup.mk k := (Quotient.out_eq' σ.1).symm + have hσClosure : σ.1 ∈ + (D.frobeniusClosure K L hLK σ).toSubgroup := by + exact Subgroup.le_topologicalClosure _ + (Subgroup.subset_closure (by simp)) + have hkFixed : k ∈ D.frobeniusFixedSubgroupWithin K L hLK σ := by + change QuotientGroup.mk k ∈ + (D.frobeniusClosure K L hLK σ).toSubgroup + rw [← hσk] + exact hσClosure + rw [← D.extensionSubgroup_frobeniusFixedField K L hLK σ] at hkFixed + obtain ⟨s, hs⟩ := hkFixed + rw [hσk] + apply Subtype.ext + change A.ρ k.1 a.1 = a.1 + let sFixed : (D.frobeniusFixedField K L hLK σ).toSubgroup := + ⟨s.1, ⟨s, hs.1, rfl⟩⟩ + have hsval : sFixed.1 = k.1 := hs.2 + rw [← hsval] + exact a.2 sFixed + +end DegreeData + +end frobeniusQuotientActions + +section actionRemainderAlgebra + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- For the left `Rep` action, the remainder corresponding to the +right-action notation is `φⁿσ⁻¹`. -/ +def frobeniusActionRemainder (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ σ : D.FrobeniusElements K L hLK) : + K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK := + φ.1 ^ D.frobeniusExponent K L hLK σ * σ.1⁻¹ + +/-- If `φ` has Frobenius exponent one, its action remainder has normalized +degree zero. -/ +theorem frobeniusActionRemainder_mem_degreeKernel (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ σ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) : + D.frobeniusActionRemainder K L hLK φ σ ∈ + (D.extensionNormalizedDegreeContinuous K L hLK).toMonoidHom.ker := by + change D.extensionNormalizedDegree K L hLK + (φ.1 ^ D.frobeniusExponent K L hLK σ * σ.1⁻¹) = 1 + rw [map_mul, map_pow, map_inv, + D.extensionNormalizedDegree_frobenius_eq_pow K L hLK σ, + D.extensionNormalizedDegree_frobenius_eq_pow K L hLK φ, hφ] + simp + +/-- Conjugate adapted to the left action: +`σ₄ˡ = φⁿ²σ₁φ⁻ⁿ²`. -/ +def frobeniusActionConjugate (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ σ : D.FrobeniusElements K L hLK) (m : ℕ) : + D.FrobeniusElements K L hLK := by + let n := D.frobeniusExponent K L hLK σ + refine ⟨φ.1 ^ m * σ.1 * φ.1⁻¹ ^ m, n, + D.frobeniusExponent_pos K L hLK σ, ?_⟩ + rw [map_mul, map_mul, map_pow, map_pow, map_inv, + D.extensionNormalizedDegree_frobenius_eq_pow K L hLK σ] + simp [n, mul_assoc] + +/-- The underlying quotient element of the Frobenius action conjugate. -/ +@[simp] +theorem frobeniusActionConjugate_coe (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ σ : D.FrobeniusElements K L hLK) (m : ℕ) : + (D.frobeniusActionConjugate K L hLK φ σ m).1 = + φ.1 ^ m * σ.1 * φ.1⁻¹ ^ m := by + simp [frobeniusActionConjugate] + +/-- Frobenius action conjugation preserves the Frobenius exponent. -/ +@[simp] +theorem frobeniusExponent_actionConjugate (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ σ : D.FrobeniusElements K L hLK) (m : ℕ) : + D.frobeniusExponent K L hLK + (D.frobeniusActionConjugate K L hLK φ σ m) = + D.frobeniusExponent K L hLK σ := by + apply proCIntegerOne_pow_nat_injective + calc + (Multiplicative.ofAdd (1 : ZHat)) ^ + D.frobeniusExponent K L hLK + (D.frobeniusActionConjugate K L hLK φ σ m) = + D.extensionNormalizedDegree K L hLK + (D.frobeniusActionConjugate K L hLK φ σ m).1 := + (D.extensionNormalizedDegree_frobenius_eq_pow K L hLK + (D.frobeniusActionConjugate K L hLK φ σ m)).symm + _ = (Multiplicative.ofAdd (1 : ZHat)) ^ + D.frobeniusExponent K L hLK σ := by + rw [frobeniusActionConjugate_coe, map_mul, map_mul, map_pow, map_pow, + map_inv, + D.extensionNormalizedDegree_frobenius_eq_pow K L hLK σ] + simp [mul_assoc] + +/-- The fixed field of the left-action conjugate +`φᵐσφ⁻ᵐ` is the corresponding conjugate of the fixed field of +`σ`. The representative is only used to express the quotient +conjugation in the ambient absolute Galois group. -/ +theorem conjugate_frobeniusFixedField_actionConjugate + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ σ : D.FrobeniusElements K L hLK) (m : ℕ) : + let q := φ.1 ^ m + let k : K.field.toSubgroup := Quotient.out q + conjugateClosedSubgroup + (D.frobeniusFixedField K L hLK σ) k.1⁻¹ = + D.frobeniusFixedField K L hLK + (D.frobeniusActionConjugate K L hLK φ σ m) := by + dsimp only + let q := φ.1 ^ m + let k : K.field.toSubgroup := Quotient.out q + let σ' := D.frobeniusActionConjugate K L hLK φ σ m + have hkq : + (QuotientGroup.mk k : + K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) = q := + Quotient.out_eq' q + have hσ' : σ'.1 = q * σ.1 * q⁻¹ := by + simp [σ', q, frobeniusActionConjugate_coe] + ext x + change x ∈ conjugateClosedSubgroup + (D.frobeniusFixedField K L hLK σ) k.1⁻¹ ↔ + x ∈ D.frobeniusFixedField K L hLK σ' + rw [conjugateClosedSubgroup_mem] + constructor + · intro hx + obtain ⟨t, htClosure, htx⟩ := hx + let xK : K.field.toSubgroup := ⟨x, by + have htK : t.1 ∈ K.field.toSubgroup := t.2 + have htxval : t.1 = k.1⁻¹ * x * k.1 := by simpa using htx + have hxval : x = k.1 * t.1 * k.1⁻¹ := by + calc + x = k.1 * (k.1⁻¹ * x * k.1) * k.1⁻¹ := by + simp [mul_assoc] + _ = k.1 * t.1 * k.1⁻¹ := by rw [htxval] + rw [hxval] + exact K.field.toSubgroup.mul_mem + (K.field.toSubgroup.mul_mem k.2 htK) (K.field.toSubgroup.inv_mem k.2)⟩ + have htClosure' : QuotientGroup.mk t ∈ + (closedSubgroupGenerated ({σ.1} : Set + (K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK))).toSubgroup := by + simpa [DegreeData.frobeniusClosure] using htClosure + have hxClosure' : q * QuotientGroup.mk t * q⁻¹ ∈ + (closedSubgroupGenerated ({σ'.1} : Set + (K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK))).toSubgroup := by + rw [hσ'] + exact (mem_closedSubgroupGenerated_conjugate_iff + q σ.1 (QuotientGroup.mk t)).mp htClosure' + have hxClosure : QuotientGroup.mk xK ∈ + (D.frobeniusClosure K L hLK σ').toSubgroup := by + have hxK : xK = k * t * k⁻¹ := by + apply Subtype.ext + dsimp [xK] + have htxval : t.1 = k.1⁻¹ * x * k.1 := by simpa using htx + calc + x = k.1 * (k.1⁻¹ * x * k.1) * k.1⁻¹ := by + simp [mul_assoc] + _ = k.1 * t.1 * k.1⁻¹ := by rw [htxval] + rw [hxK] + change (QuotientGroup.mk k : + K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) * + QuotientGroup.mk t * (QuotientGroup.mk k)⁻¹ ∈ _ + rw [hkq] + simpa [DegreeData.frobeniusClosure] using hxClosure' + exact ⟨xK, hxClosure, rfl⟩ + · intro hx + obtain ⟨t, htClosure, htx⟩ := hx + let yK : K.field.toSubgroup := ⟨k.1⁻¹ * x * k.1, by + have htK : t.1 ∈ K.field.toSubgroup := t.2 + rw [← htx] + exact K.field.toSubgroup.mul_mem + (K.field.toSubgroup.mul_mem (K.field.toSubgroup.inv_mem k.2) htK) k.2⟩ + have htClosure' : QuotientGroup.mk t ∈ + (closedSubgroupGenerated ({σ'.1} : Set + (K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK))).toSubgroup := by + simpa [DegreeData.frobeniusClosure] using htClosure + have hyClosure' : QuotientGroup.mk yK ∈ + (closedSubgroupGenerated ({σ.1} : Set + (K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK))).toSubgroup := by + apply (mem_closedSubgroupGenerated_conjugate_iff + q σ.1 (QuotientGroup.mk yK)).mpr + have hyK : k * yK * k⁻¹ = t := by + apply Subtype.ext + dsimp [yK] + simpa [mul_assoc] using htx.symm + have hyKq : q * QuotientGroup.mk yK * q⁻¹ = + (QuotientGroup.mk t : + K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) := by + rw [← hkq] + simpa using congrArg + (fun z : K.field.toSubgroup => + (QuotientGroup.mk z : + K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK)) hyK + rw [hyKq] + rw [← hσ'] + exact htClosure' + exact ⟨yK, by simpa [DegreeData.frobeniusClosure] using hyClosure', by simp [yK]⟩ + +end DegreeData + +end actionRemainderAlgebra + +section actionRemainderMultiplication + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- Left-action translation of `τ₃=τ₂τ₄`: conjugation moves to +the second factor and the order reverses. -/ +theorem frobeniusActionRemainder_mul (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ σ₁ σ₂ : D.FrobeniusElements K L hLK) : + D.frobeniusActionRemainder K L hLK φ (σ₁ * σ₂) = + D.frobeniusActionRemainder K L hLK φ + (D.frobeniusActionConjugate K L hLK φ σ₂ + (D.frobeniusExponent K L hLK σ₁)) * + D.frobeniusActionRemainder K L hLK φ σ₁ := by + simp only [frobeniusActionRemainder, frobeniusExponent_mul, pow_add, frobeniusMul_coe, + mul_inv_rev, mul_assoc, frobeniusExponent_actionConjugate, frobeniusActionConjugate_coe, + inv_pow, inv_inv, inv_mul_cancel_left] + have hp : φ.1 ^ D.frobeniusExponent K L hLK σ₁ * + φ.1 ^ D.frobeniusExponent K L hLK σ₂ = + φ.1 ^ D.frobeniusExponent K L hLK σ₂ * + φ.1 ^ D.frobeniusExponent K L hLK σ₁ := by + rw [← pow_add, ← pow_add, Nat.add_comm] + calc + φ.1 ^ D.frobeniusExponent K L hLK σ₁ * + (φ.1 ^ D.frobeniusExponent K L hLK σ₂ * + (σ₂.1⁻¹ * σ₁.1⁻¹)) = + (φ.1 ^ D.frobeniusExponent K L hLK σ₁ * + φ.1 ^ D.frobeniusExponent K L hLK σ₂) * + (σ₂.1⁻¹ * σ₁.1⁻¹) := by rw [mul_assoc] + _ = (φ.1 ^ D.frobeniusExponent K L hLK σ₂ * + φ.1 ^ D.frobeniusExponent K L hLK σ₁) * + (σ₂.1⁻¹ * σ₁.1⁻¹) := by rw [hp] + _ = φ.1 ^ D.frobeniusExponent K L hLK σ₂ * + (φ.1 ^ D.frobeniusExponent K L hLK σ₁ * + (σ₂.1⁻¹ * σ₁.1⁻¹)) := by rw [mul_assoc] + +end DegreeData + +end actionRemainderMultiplication + +section fixedFieldRemainderActions + +/-! +Mathlib's `Rep ℤ G` requires its coefficient ring and acting group in the +same universe, so this representation-bearing portion has `G : IntegralRepGroupType`. +-/ +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- On the fixed field of `σ`, the left-action remainder acts exactly as +the `n`-th power of `φ`. -/ +theorem frobeniusActionRemainder_apply_fixedField (D : DegreeData G) + (A : Rep ℤ G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ σ : D.FrobeniusElements K L hLK) + (a : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σ)) : + D.frobeniusQuotientAction A K.field L hLK + (D.frobeniusActionRemainder K L hLK φ σ) + (fixedFieldInclusion A (D.frobeniusFixedField K L hLK σ) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ) a) = + D.frobeniusQuotientAction A K.field L hLK + (φ.1 ^ D.frobeniusExponent K L hLK σ) + (fixedFieldInclusion A (D.frobeniusFixedField K L hLK σ) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ) a) := by + let aI := fixedFieldInclusion A + (D.frobeniusFixedField K L hLK σ) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ) a + let B := D.frobeniusQuotientRepresentation A K.field L hLK + have hfix : B.ρ σ.1 aI = aI := by + change D.frobeniusQuotientAction A K.field L hLK σ.1 aI = aI + exact D.frobeniusQuotientAction_fixedFieldInclusion A K L hLK σ a + have hinv : B.ρ σ.1⁻¹ aI = aI := by + have hmul : B.ρ (σ.1⁻¹ * σ.1) aI = aI := by + rw [inv_mul_cancel, map_one] + rfl + rw [map_mul] at hmul + change B.ρ σ.1⁻¹ (B.ρ σ.1 aI) = aI at hmul + rw [hfix] at hmul + exact hmul + change B.ρ + (φ.1 ^ D.frobeniusExponent K L hLK σ * σ.1⁻¹) aI = + B.ρ (φ.1 ^ D.frobeniusExponent K L hLK σ) aI + rw [map_mul] + change B.ρ (φ.1 ^ D.frobeniusExponent K L hLK σ) (B.ρ σ.1⁻¹ aI) = + B.ρ (φ.1 ^ D.frobeniusExponent K L hLK σ) aI + rw [hinv] + +end DegreeData + +end fixedFieldRemainderActions + +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusPowerSumRelation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusPowerSumRelation.lean new file mode 100644 index 0000000000..ccb14ee42d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusPowerSumRelation.lean @@ -0,0 +1,172 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder +/-! +# The Frobenius power-sum relation for reciprocity multiplicativity + +This file proves the three-term action identity obtained from the Frobenius +action remainders and their associated fixed-field prime elements. +-/ + +@[expose] public section + +universe u + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +noncomputable +section + +open CategoryTheory + +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- The three Frobenius power sums attached to `σ₁`, `σ₁σ₂`, and the +left-action conjugate of `σ₂` satisfy the action-difference relation used by +universal norm descent. -/ +theorem frobeniusPowerSum_mul_action_sub (D : DegreeData G) (A : Rep ℤ G) + [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (φ σ₁ σ₂ : D.FrobeniusElements K L hLK) + (π₁ : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σ₁)) + (π₃ : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK (σ₁ * σ₂))) + (π₄ : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK + (D.frobeniusActionConjugate K L hLK φ σ₂ + (D.frobeniusExponent K L hLK σ₁)))) : + let σ₃ := σ₁ * σ₂ + let σ₄ := D.frobeniusActionConjugate K L hLK φ σ₂ + (D.frobeniusExponent K L hLK σ₁) + let p₁ := fixedFieldInclusion A + (D.frobeniusFixedField K L hLK σ₁) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ₁) π₁ + let p₃ := fixedFieldInclusion A + (D.frobeniusFixedField K L hLK σ₃) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ₃) π₃ + let p₄ := fixedFieldInclusion A + (D.frobeniusFixedField K L hLK σ₄) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ₄) π₄ + let τ₁ := D.frobeniusActionRemainder K L hLK φ σ₁ + let τ₄ := D.frobeniusActionRemainder K L hLK φ σ₄ + let u := D.frobeniusPowerSum A K.field L hLK φ.1 + (D.frobeniusExponent K L hLK σ₄) p₄ + + D.frobeniusPowerSum A K.field L hLK φ.1 + (D.frobeniusExponent K L hLK σ₁) p₁ - + D.frobeniusPowerSum A K.field L hLK φ.1 + (D.frobeniusExponent K L hLK σ₃) p₃ + D.frobeniusQuotientAction A K.field L hLK φ.1 u - u = + (D.frobeniusQuotientAction A K.field L hLK τ₄ p₄ - p₄) + + (D.frobeniusQuotientAction A K.field L hLK τ₁ p₁ - p₁) + + (p₃ - D.frobeniusQuotientAction A K.field L hLK (τ₄ * τ₁) p₃) := by + let σ₃ := σ₁ * σ₂ + let σ₄ := D.frobeniusActionConjugate K L hLK φ σ₂ + (D.frobeniusExponent K L hLK σ₁) + let p₁ := fixedFieldInclusion A + (D.frobeniusFixedField K L hLK σ₁) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ₁) π₁ + let p₃ := fixedFieldInclusion A + (D.frobeniusFixedField K L hLK σ₃) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ₃) π₃ + let p₄ := fixedFieldInclusion A + (D.frobeniusFixedField K L hLK σ₄) + (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ₄) π₄ + let s₁ := D.frobeniusPowerSum A K.field L hLK φ.1 + (D.frobeniusExponent K L hLK σ₁) p₁ + let s₃ := D.frobeniusPowerSum A K.field L hLK φ.1 + (D.frobeniusExponent K L hLK σ₃) p₃ + let s₄ := D.frobeniusPowerSum A K.field L hLK φ.1 + (D.frobeniusExponent K L hLK σ₄) p₄ + let τ₁ := D.frobeniusActionRemainder K L hLK φ σ₁ + let τ₃ := D.frobeniusActionRemainder K L hLK φ σ₃ + let τ₄ := D.frobeniusActionRemainder K L hLK φ σ₄ + have h₁ : + D.frobeniusQuotientAction A K.field L hLK τ₁ p₁ = + D.frobeniusQuotientAction A K.field L hLK + (φ.1 ^ D.frobeniusExponent K L hLK σ₁) p₁ := by + exact D.frobeniusActionRemainder_apply_fixedField + A K L hLK φ σ₁ π₁ + have h₃ : + D.frobeniusQuotientAction A K.field L hLK τ₃ p₃ = + D.frobeniusQuotientAction A K.field L hLK + (φ.1 ^ D.frobeniusExponent K L hLK σ₃) p₃ := by + exact D.frobeniusActionRemainder_apply_fixedField + A K L hLK φ σ₃ π₃ + have h₄ : + D.frobeniusQuotientAction A K.field L hLK τ₄ p₄ = + D.frobeniusQuotientAction A K.field L hLK + (φ.1 ^ D.frobeniusExponent K L hLK σ₄) p₄ := by + exact D.frobeniusActionRemainder_apply_fixedField + A K L hLK φ σ₄ π₄ + have hτ : τ₃ = τ₄ * τ₁ := by + exact D.frobeniusActionRemainder_mul K L hLK φ σ₁ σ₂ + change + D.frobeniusQuotientAction A K.field L hLK φ.1 + (s₄ + s₁ - s₃) - (s₄ + s₁ - s₃) = + (D.frobeniusQuotientAction A K.field L hLK τ₄ p₄ - p₄) + + (D.frobeniusQuotientAction A K.field L hLK τ₁ p₁ - p₁) + + (p₃ - + D.frobeniusQuotientAction A K.field L hLK (τ₄ * τ₁) p₃) + have hmap : + D.frobeniusQuotientAction A K.field L hLK φ.1 (s₄ + s₁ - s₃) = + D.frobeniusQuotientAction A K.field L hLK φ.1 s₄ + + D.frobeniusQuotientAction A K.field L hLK φ.1 s₁ - + D.frobeniusQuotientAction A K.field L hLK φ.1 s₃ := by + change + D.frobeniusQuotientActionLinearMap A K.field L hLK φ.1 + (s₄ + s₁ - s₃) = + D.frobeniusQuotientActionLinearMap A K.field L hLK φ.1 s₄ + + D.frobeniusQuotientActionLinearMap A K.field L hLK φ.1 s₁ - + D.frobeniusQuotientActionLinearMap A K.field L hLK φ.1 s₃ + rw [map_sub, map_add] + rw [hmap] + calc + _ = + (D.frobeniusQuotientAction A K.field L hLK φ.1 s₄ - s₄) + + (D.frobeniusQuotientAction A K.field L hLK φ.1 s₁ - s₁) - + (D.frobeniusQuotientAction A K.field L hLK φ.1 s₃ - s₃) := by + abel + _ = + (D.frobeniusQuotientAction A K.field L hLK + (φ.1 ^ D.frobeniusExponent K L hLK σ₄) p₄ - p₄) + + (D.frobeniusQuotientAction A K.field L hLK + (φ.1 ^ D.frobeniusExponent K L hLK σ₁) p₁ - p₁) - + (D.frobeniusQuotientAction A K.field L hLK + (φ.1 ^ D.frobeniusExponent K L hLK σ₃) p₃ - p₃) := by + dsimp only [s₁, s₃, s₄] + rw [D.frobeniusPowerSum_action_sub, + D.frobeniusPowerSum_action_sub, + D.frobeniusPowerSum_action_sub] + _ = + (D.frobeniusQuotientAction A K.field L hLK τ₄ p₄ - p₄) + + (D.frobeniusQuotientAction A K.field L hLK τ₁ p₁ - p₁) + + (p₃ - + D.frobeniusQuotientAction A K.field L hLK (τ₄ * τ₁) p₃) := by + rw [← h₄, ← h₁, ← h₃, hτ] + abel + +end DegreeData + +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/NormClassRelation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/NormClassRelation.lean new file mode 100644 index 0000000000..b25ccb576d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/NormClassRelation.lean @@ -0,0 +1,282 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CanonicalUnramifiedNormQuotient +/-! +# Norm-class relations for reciprocity multiplicativity + +This file passes the alternating Frobenius power-sum norm relation to the +maximal-unramified norm quotient and then to the reciprocity map. +-/ + +@[expose] public section + +universe u + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +noncomputable +section + +open CategoryTheory + +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- Applying the relative norm from the maximal unramified extension to the +alternating Frobenius power sum gives the alternating sum of the three +finite fixed-field norms. -/ +theorem relativeNorm_frobeniusPowerSum_alternating + (D : DegreeData G) (A : Rep ℤ G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (φ σ₁ σ₂ : D.FrobeniusElements K L hLK) + (hφ : D.frobeniusExponent K L hLK φ = 1) + (π₁ : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σ₁)) + (π₃ : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK (σ₁ * σ₂))) + (π₄ : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK + (D.frobeniusActionConjugate K L hLK φ σ₂ + (D.frobeniusExponent K L hLK σ₁)))) : + let σ₃ := σ₁ * σ₂ + let σ₄ := D.frobeniusActionConjugate K L hLK φ σ₂ + (D.frobeniusExponent K L hLK σ₁) + let S₁ := D.frobeniusFixedField K L hLK σ₁ + let S₃ := D.frobeniusFixedField K L hLK σ₃ + let S₄ := D.frobeniusFixedField K L hLK σ₄ + let hS₁K := D.frobeniusFixedField_le K L hLK σ₁ + let hS₃K := D.frobeniusFixedField_le K L hLK σ₃ + let hS₄K := D.frobeniusFixedField_le K L hLK σ₄ + let p₁ := fixedFieldInclusion A S₁ (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ₁) π₁ + let p₃ := fixedFieldInclusion A S₃ (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ₃) π₃ + let p₄ := fixedFieldInclusion A S₄ (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ₄) π₄ + let u := D.frobeniusPowerSum A K.field L hLK φ.1 + (D.frobeniusExponent K L hLK σ₄) p₄ + + D.frobeniusPowerSum A K.field L hLK φ.1 + (D.frobeniusExponent K L hLK σ₁) p₁ - + D.frobeniusPowerSum A K.field L hLK φ.1 + (D.frobeniusExponent K L hLK σ₃) p₃ + letI : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field S₁ hS₁K) := + D.frobeniusFixedField_finite K L hLK σ₁ + letI : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field S₃ hS₃K) := + D.frobeniusFixedField_finite K L hLK σ₃ + letI : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field S₄ hS₄K) := + D.frobeniusFixedField_finite K L hLK σ₄ + letI : Finite + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K.field L hLK + ((relativeNorm A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) u : + ambientFixedAddSubgroup A (D.maximalUnramifiedField K.field)) : A.V) = + ((relativeNorm A K.field S₄ hS₄K π₄ + + relativeNorm A K.field S₁ hS₁K π₁ - + relativeNorm A K.field S₃ hS₃K π₃ : + ambientFixedAddSubgroup A K.field) : A.V) := by + dsimp only + let σ₃ := σ₁ * σ₂ + let σ₄ := D.frobeniusActionConjugate K L hLK φ σ₂ + (D.frobeniusExponent K L hLK σ₁) + let S₁ := D.frobeniusFixedField K L hLK σ₁ + let S₃ := D.frobeniusFixedField K L hLK σ₃ + let S₄ := D.frobeniusFixedField K L hLK σ₄ + let hS₁K := D.frobeniusFixedField_le K L hLK σ₁ + let hS₃K := D.frobeniusFixedField_le K L hLK σ₃ + let hS₄K := D.frobeniusFixedField_le K L hLK σ₄ + let p₁ := fixedFieldInclusion A S₁ (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ₁) π₁ + let p₃ := fixedFieldInclusion A S₃ (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ₃) π₃ + let p₄ := fixedFieldInclusion A S₄ (D.maximalUnramifiedField L) + (D.fieldInertia_le_frobeniusFixedField K L hLK σ₄) π₄ + let s₁ := D.frobeniusPowerSum A K.field L hLK φ.1 + (D.frobeniusExponent K L hLK σ₁) p₁ + let s₃ := D.frobeniusPowerSum A K.field L hLK φ.1 + (D.frobeniusExponent K L hLK σ₃) p₃ + let s₄ := D.frobeniusPowerSum A K.field L hLK φ.1 + (D.frobeniusExponent K L hLK σ₄) p₄ + let u := s₄ + s₁ - s₃ + let hS₁finite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S₁ hS₁K) := + D.frobeniusFixedField_finite K L hLK σ₁ + let hS₃finite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S₃ hS₃K) := + D.frobeniusFixedField_finite K L hLK σ₃ + let hS₄finite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S₄ hS₄K) := + D.frobeniusFixedField_finite K L hLK σ₄ + let hIfinite : Finite + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K.field L hLK + have h₁ := (D.frobeniusNormIdentities A K L hLK φ σ₁ hφ π₁).1 + have h₃ := (D.frobeniusNormIdentities A K L hLK φ σ₃ hφ π₃).1 + have h₄ := (D.frobeniusNormIdentities A K L hLK φ σ₄ hφ π₄).1 + let N := relativeNorm A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) + change ((N (s₄ + s₁ - s₃) : + ambientFixedAddSubgroup A (D.maximalUnramifiedField K.field)) : A.V) = _ + rw [map_sub, map_add] + change (N s₄).1 + (N s₁).1 - (N s₃).1 = _ + rw [← h₄, ← h₁, ← h₃] + rfl + +/-- Final quotient step in reciprocity multiplicativity. Once the maximal-unramified +norm of `u` descends to a universal norm in `A_K`, the alternating norm +relation is exactly the desired equality of reciprocity classes. -/ +theorem maximalUnramifiedNormClass_add_eq_of_relativeNorm + (D : DegreeData G) (A : Rep ℤ G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [Finite + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK))] + (r₁ r₂ r₃ : ambientFixedAddSubgroup A K.field) + (u : ambientFixedAddSubgroup A (D.maximalUnramifiedField L)) + (hnorm : + ((relativeNorm A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) u : + ambientFixedAddSubgroup A (D.maximalUnramifiedField K.field)) : A.V) = + ((r₁ + r₂ - r₃ : ambientFixedAddSubgroup A K.field) : A.V)) + (huniversal : ∃ aK : ambientFixedAddSubgroup A K.field, + fixedFieldInclusion A K.field (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField_le K.field) aK = + relativeNorm A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) u ∧ + aK ∈ D.maximalUnramifiedNormSubgroup A K.field L) : + D.maximalUnramifiedNormClass A K.field L r₁ + + D.maximalUnramifiedNormClass A K.field L r₂ = + D.maximalUnramifiedNormClass A K.field L r₃ := by + obtain ⟨aK, hdescend, haK⟩ := huniversal + have hsum : r₁ + r₂ - r₃ = aK := by + apply Subtype.ext + exact hnorm.symm.trans (congrArg Subtype.val hdescend).symm + have hmem : r₁ + r₂ - r₃ ∈ + D.maximalUnramifiedNormSubgroup A K.field L := by + rw [hsum] + exact haK + have hzero := (D.maximalUnramifiedNormClass_eq_zero_iff + A K.field L (r₁ + r₂ - r₃)).2 hmem + rw [map_sub, map_add] at hzero + exact sub_eq_zero.mp hzero + +/-- Prime-choice independence converts an equality of the three explicit +norm classes into reciprocity multiplicativity's equality for the canonical reciprocity +map. -/ +theorem reciprocityMap_mul_of_primeNormClass_eq + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (σ₁ σ₂ : D.FrobeniusElements + (K.toFiniteResidueAbstractField D) L hLK) + (π₁ : ambientFixedAddSubgroup A + (D.frobeniusFixedField (K.toFiniteResidueAbstractField D) L hLK σ₁)) + (π₂ : ambientFixedAddSubgroup A + (D.frobeniusFixedField (K.toFiniteResidueAbstractField D) L hLK σ₂)) + (π₃ : ambientFixedAddSubgroup A + (D.frobeniusFixedField (K.toFiniteResidueAbstractField D) L hLK + (σ₁ * σ₂))) + (hπ₁ : + let KR := K.toFiniteResidueAbstractField D + let Sigma1 : FiniteAbstractField G := + ⟨D.frobeniusFixedField KR L hLK σ₁, + D.frobeniusFixedField_absoluteFinite K L hLK σ₁⟩ + v.IsPrimeElement Sigma1 π₁) + (hπ₂ : + let KR := K.toFiniteResidueAbstractField D + let Sigma2 : FiniteAbstractField G := + ⟨D.frobeniusFixedField KR L hLK σ₂, + D.frobeniusFixedField_absoluteFinite K L hLK σ₂⟩ + v.IsPrimeElement Sigma2 π₂) + (hπ₃ : + let KR := K.toFiniteResidueAbstractField D + let Sigma3 : FiniteAbstractField G := + ⟨D.frobeniusFixedField KR L hLK (σ₁ * σ₂), + D.frobeniusFixedField_absoluteFinite K L hLK (σ₁ * σ₂)⟩ + v.IsPrimeElement Sigma3 π₃) + (hclasses : + let KR := K.toFiniteResidueAbstractField D + let S₁ := D.frobeniusFixedField KR L hLK σ₁ + let S₂ := D.frobeniusFixedField KR L hLK σ₂ + let S₃ := D.frobeniusFixedField KR L hLK (σ₁ * σ₂) + let hS₁K := D.frobeniusFixedField_le KR L hLK σ₁ + let hS₂K := D.frobeniusFixedField_le KR L hLK σ₂ + let hS₃K := D.frobeniusFixedField_le KR L hLK (σ₁ * σ₂) + letI : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field S₁ hS₁K) := + D.frobeniusFixedField_finite KR L hLK σ₁ + letI : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field S₂ hS₂K) := + D.frobeniusFixedField_finite KR L hLK σ₂ + letI : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field S₃ hS₃K) := + D.frobeniusFixedField_finite KR L hLK (σ₁ * σ₂) + D.maximalUnramifiedNormClass A K.field L + (relativeNorm A K.field S₁ hS₁K π₁) + + D.maximalUnramifiedNormClass A K.field L + (relativeNorm A K.field S₂ hS₂K π₂) = + D.maximalUnramifiedNormClass A K.field L + (relativeNorm A K.field S₃ hS₃K π₃)) : + D.reciprocityMap A v K L hLK (σ₁ * σ₂) = + D.reciprocityMap A v K L hLK σ₁ + + D.reciprocityMap A v K L hLK σ₂ := by + let KR := K.toFiniteResidueAbstractField D + let hLnormalKR : (extensionSubgroup KR.field L hLK).Normal := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal + let hLfiniteKR : Finite + (KR.field.toSubgroup ⧸ extensionSubgroup KR.field L hLK) := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLfinite + let hS₁finite : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field + (D.frobeniusFixedField KR L hLK σ₁) + (D.frobeniusFixedField_le KR L hLK σ₁)) := + D.frobeniusFixedField_finite KR L hLK σ₁ + let hS₂finite : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field + (D.frobeniusFixedField KR L hLK σ₂) + (D.frobeniusFixedField_le KR L hLK σ₂)) := + D.frobeniusFixedField_finite KR L hLK σ₂ + let hS₃finite : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field + (D.frobeniusFixedField KR L hLK (σ₁ * σ₂)) + (D.frobeniusFixedField_le KR L hLK (σ₁ * σ₂))) := + D.frobeniusFixedField_finite KR L hLK (σ₁ * σ₂) + have h₁ := D.reciprocityValueOfPrime_eq_reciprocityMap + A v hAxiom K L hLK σ₁ π₁ hπ₁ + have h₂ := D.reciprocityValueOfPrime_eq_reciprocityMap + A v hAxiom K L hLK σ₂ π₂ hπ₂ + have h₃ := D.reciprocityValueOfPrime_eq_reciprocityMap + A v hAxiom K L hLK (σ₁ * σ₂) π₃ hπ₃ + rw [← h₃, ← h₁, ← h₂] + simpa only [reciprocityValueOfPrime, KR, + FiniteAbstractField.toFiniteResidueAbstractField] using hclasses.symm + +end DegreeData + +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/PrimeUnitDifferences.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/PrimeUnitDifferences.lean new file mode 100644 index 0000000000..23c31aec9c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/PrimeUnitDifferences.lean @@ -0,0 +1,263 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder +/-! +# Finite-stage unit differences of Frobenius primes + +This file proves that differences of Frobenius fixed-field primes, including +differences from quotient-action translates, come from finite-stage units. +-/ + +@[expose] public section + +universe u + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +noncomputable +section + +open CategoryTheory + +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- Two prime elements coming from Frobenius fixed fields differ by a +finite-stage unit after inclusion in `A_{\widetilde L}`. The common stage is +their finite compositum, which is unramified over both fixed fields. -/ +theorem frobeniusPrimeDifference_mem_infiniteUnitAddSubgroup + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (σ τ : D.FrobeniusElements + (K.toFiniteResidueAbstractField D) L hLK) + (πσ : ambientFixedAddSubgroup A + (D.frobeniusFixedField (K.toFiniteResidueAbstractField D) L hLK σ)) + (πτ : ambientFixedAddSubgroup A + (D.frobeniusFixedField (K.toFiniteResidueAbstractField D) L hLK τ)) + (hπσ : + let KR := K.toFiniteResidueAbstractField D + let Sigma : FiniteAbstractField G := + ⟨D.frobeniusFixedField KR L hLK σ, + D.frobeniusFixedField_absoluteFinite K L hLK σ⟩ + v.IsPrimeElement Sigma πσ) + (hπτ : + let KR := K.toFiniteResidueAbstractField D + let Tau : FiniteAbstractField G := + ⟨D.frobeniusFixedField KR L hLK τ, + D.frobeniusFixedField_absoluteFinite K L hLK τ⟩ + v.IsPrimeElement Tau πτ) : + let KR := K.toFiniteResidueAbstractField D + let E := D.maximalUnramifiedField L + let pσ := fixedFieldInclusion A + (D.frobeniusFixedField KR L hLK σ) E + (D.fieldInertia_le_frobeniusFixedField KR L hLK σ) πσ + let pτ := fixedFieldInclusion A + (D.frobeniusFixedField KR L hLK τ) E + (D.fieldInertia_le_frobeniusFixedField KR L hLK τ) πτ + pσ - pτ ∈ v.infiniteUnitAddSubgroup E K + (D.maximalUnramifiedField_le_of_le hLK) := by + dsimp only + let KR := K.toFiniteResidueAbstractField D + let hLnormalKR : (extensionSubgroup KR.field L hLK).Normal := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal + let hLfiniteKR : Finite + (KR.field.toSubgroup ⧸ extensionSubgroup KR.field L hLK) := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLfinite + let E := D.maximalUnramifiedField L + let S := D.frobeniusFixedField KR L hLK σ + let T := D.frobeniusFixedField KR L hLK τ + let hSK : S.toSubgroup ≤ K.field.toSubgroup := + D.frobeniusFixedField_le KR L hLK σ + let hTK : T.toSubgroup ≤ K.field.toSubgroup := + D.frobeniusFixedField_le KR L hLK τ + let M := D.frobeniusFixedIntermediateField KR L hLK σ + let N := D.frobeniusFixedIntermediateField KR L hLK τ + let P := M.compositum N + let hPS : P.field.toSubgroup ≤ S.toSubgroup := + M.compositum_le_left N + let hPT : P.field.toSubgroup ≤ T.toSubgroup := + M.compositum_le_right N + let hSabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) S (le_baseField S)) := + D.frobeniusFixedField_absoluteFinite K L hLK σ + let hTabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) T (le_baseField T)) := + D.frobeniusFixedField_absoluteFinite K L hLK τ + let Sigma : FiniteAbstractField G := ⟨S, hSabsolute⟩ + let Tau : FiniteAbstractField G := ⟨T, hTabsolute⟩ + let hPfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field P.field P.below) := P.finite + let Pi : FiniteAbstractField G := P.toFiniteAbstractField K + let hPSfinite : Finite + (S.toSubgroup ⧸ extensionSubgroup S P.field hPS) := + FiniteIntermediateField.finite_extension_of_le P.below hSK hPS + let hPTfinite : Finite + (T.toSubgroup ⧸ extensionSubgroup T P.field hPT) := + FiniteIntermediateField.finite_extension_of_le P.below hTK hPT + let EPS : FiniteAbstractFieldExtension G := + { field := Pi + base := Sigma + below := hPS + finiteQuotient := hPSfinite } + let EPT : FiniteAbstractFieldExtension G := + { field := Pi + base := Tau + below := hPT + finiteQuotient := hPTfinite } + have hPSunramified : + EPS.IsUnramified D := by + change D.fieldInertia S ≤ P.field.toSubgroup + have hSI : D.fieldInertia S = D.fieldInertia L := by + simpa [S] using + D.frobeniusFixedField_fieldInertia KR L hLK σ + rw [hSI] + exact P.above + have hPTunramified : + EPT.IsUnramified D := by + change D.fieldInertia T ≤ P.field.toSubgroup + have hTI : D.fieldInertia T = D.fieldInertia L := by + simpa [T] using + D.frobeniusFixedField_fieldInertia KR L hLK τ + rw [hTI] + exact P.above + let πσP := fixedFieldInclusion A S P.field hPS πσ + let πτP := fixedFieldInclusion A T P.field hPT πτ + have hπσP : v.IsPrimeElement Pi πσP := by + exact v.prime_of_unramified EPS hPSunramified πσ hπσ + have hπτP : v.IsPrimeElement Pi πτP := by + exact v.prime_of_unramified EPT hPTunramified πτ hπτ + let uP : v.unitAddSubgroup Pi := + ⟨πσP - πτP, + v.sub_mem_unitAddSubgroup_of_prime Pi hπτP hπσP⟩ + rw [v.mem_infiniteUnitAddSubgroup_iff] + refine ⟨P, uP, ?_⟩ + apply Subtype.ext + rfl + +/-- The difference between a prime and any `G(\widetilde L/K)`-translate +of it is a finite-stage unit. A finite Galois refinement of the prime's +fixed field supplies a stage stable under the chosen quotient +representative. -/ +theorem frobeniusPrime_actionDifference_mem_infiniteUnitAddSubgroup + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (σ : D.FrobeniusElements (K.toFiniteResidueAbstractField D) L hLK) + (π : ambientFixedAddSubgroup A + (D.frobeniusFixedField (K.toFiniteResidueAbstractField D) L hLK σ)) + (hπ : + let KR := K.toFiniteResidueAbstractField D + let Sigma : FiniteAbstractField G := + ⟨D.frobeniusFixedField KR L hLK σ, + D.frobeniusFixedField_absoluteFinite K L hLK σ⟩ + v.IsPrimeElement Sigma π) + (q : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) : + let KR := K.toFiniteResidueAbstractField D + let E := D.maximalUnramifiedField L + let p := fixedFieldInclusion A + (D.frobeniusFixedField KR L hLK σ) E + (D.fieldInertia_le_frobeniusFixedField KR L hLK σ) π + p - D.frobeniusQuotientAction A K.field L hLK q p ∈ + v.infiniteUnitAddSubgroup E K + (D.maximalUnramifiedField_le_of_le hLK) := by + dsimp only + let KR := K.toFiniteResidueAbstractField D + let hLnormalKR : (extensionSubgroup KR.field L hLK).Normal := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal + let hLfiniteKR : Finite + (KR.field.toSubgroup ⧸ extensionSubgroup KR.field L hLK) := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLfinite + let E := D.maximalUnramifiedField L + let S := D.frobeniusFixedField KR L hLK σ + let hSK : S.toSubgroup ≤ K.field.toSubgroup := + D.frobeniusFixedField_le KR L hLK σ + let M := D.frobeniusFixedIntermediateField KR L hLK σ + let hEnormal : (extensionSubgroup K.field E + (D.maximalUnramifiedField_le_of_le hLK)).Normal := + D.extensionSubgroup_maximalUnramifiedField_normal K.field L hLK + let P := M.galoisRefinement + let hPS : P.field.toSubgroup ≤ S.toSubgroup := + M.galoisRefinement_le_field + let hSabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) S (le_baseField S)) := + D.frobeniusFixedField_absoluteFinite K L hLK σ + let Sigma : FiniteAbstractField G := ⟨S, hSabsolute⟩ + let hPfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field P.field P.below) := P.finite + let Pi : FiniteAbstractField G := P.toFiniteAbstractField K + let hPSfinite : Finite + (S.toSubgroup ⧸ extensionSubgroup S P.field hPS) := + FiniteIntermediateField.finite_extension_of_le P.below hSK hPS + let hPnormal : (extensionSubgroup K.field P.field P.below).Normal := by + exact FiniteIntermediateField.galoisRefinement_normal M + let EPS : FiniteAbstractFieldExtension G := + { field := Pi + base := Sigma + below := hPS + finiteQuotient := hPSfinite } + let EPK : FiniteAbstractFieldExtension G := + { field := Pi + base := K + below := P.below + finiteQuotient := hPfinite } + have hPSunramified : + EPS.IsUnramified D := by + change D.fieldInertia S ≤ P.field.toSubgroup + have hSI : D.fieldInertia S = D.fieldInertia L := by + simpa [S] using + D.frobeniusFixedField_fieldInertia KR L hLK σ + rw [hSI] + exact P.above + let πP := fixedFieldInclusion A S P.field hPS π + have hπP : v.IsPrimeElement Pi πP := by + exact v.prime_of_unramified EPS hPSunramified π hπ + let k : K.field.toSubgroup := Quotient.out q + let πqP := normalExtensionAction A K.field P.field P.below hPnormal k πP + have hπqP : v.IsPrimeElement Pi πqP := by + change v.valuationAt Pi πP = v.oneValue at hπP + change v.valuationAt Pi πqP = v.oneValue + calc + v.valuationAt Pi πqP = v.valuationAt Pi πP := by + have hvaluation := + v.valuationAt_normalExtensionAction EPK hPnormal k πP + change v.valuationAt Pi + (normalExtensionAction A K.field P.field P.below hPnormal k πP) = + v.valuationAt Pi πP at hvaluation + exact hvaluation + _ = v.oneValue := hπP + let uP : v.unitAddSubgroup Pi := + ⟨πP - πqP, + v.sub_mem_unitAddSubgroup_of_prime Pi hπqP hπP⟩ + rw [v.mem_infiniteUnitAddSubgroup_iff] + refine ⟨P, uP, ?_⟩ + have hkq : (QuotientGroup.mk k : + K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) = q := + Quotient.out_eq' q + rw [← hkq, D.frobeniusQuotientAction_mk] + apply Subtype.ext + rfl + +end DegreeData + +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ReciprocityMapMul.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ReciprocityMapMul.lean new file mode 100644 index 0000000000..bd0ebaae04 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ReciprocityMapMul.lean @@ -0,0 +1,255 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ConjugatePrimeNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusPowerSumRelation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.NormClassRelation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FiniteStageCorrections +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.CorrectionSum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ChosenDegreeOneFrobenius +/-! +# Multiplicativity of the abstract reciprocity map + +This file assembles the Frobenius conjugation, finite-stage unit, correction +sum, and universal norm-descent results into reciprocity-map multiplicativity. +-/ + +@[expose] public section + +universe u + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +noncomputable +section + +open CategoryTheory +open scoped BigOperators + +section reciprocityMapMultiplicativity + +/-! +Mathlib's `Rep ℤ G` requires its coefficient ring and acting group in the +same universe, so this representation-bearing portion has `G : IntegralRepGroupType`. +-/ +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- **reciprocity multiplicativity.** The reciprocity function is multiplicative on +Frobenius elements (written additively on the norm-class quotient). + +This is the endpoint of the calculation: the +group-ring identity `(*)` supplies the hypothesis of the universal norm-descent lemma, whose +universal-unit norm descends the resulting norm relation to `K`. -/ +theorem reciprocityMap_mul + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (sigma1 sigma2 : D.FrobeniusElements + (K.toFiniteResidueAbstractField D) L hLK) : + D.reciprocityMap A v K L hLK (sigma1 * sigma2) = + D.reciprocityMap A v K L hLK sigma1 + + D.reciprocityMap A v K L hLK sigma2 := by + let KR := K.toFiniteResidueAbstractField D + let hLnormalKR : (extensionSubgroup KR.field L hLK).Normal := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal + let hLfiniteKR : Finite + (KR.field.toSubgroup ⧸ extensionSubgroup KR.field L hLK) := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLfinite + let phi := D.chosenDegreeOneFrobeniusElement KR L hLK + have hphi : D.frobeniusExponent KR L hLK phi = 1 := + D.frobeniusExponent_chosenDegreeOneFrobeniusElement KR L hLK + let sigma3 := sigma1 * sigma2 + let m := D.frobeniusExponent KR L hLK sigma1 + let sigma4 := D.frobeniusActionConjugate KR L hLK phi sigma2 m + let S1 := D.frobeniusFixedField KR L hLK sigma1 + let S2 := D.frobeniusFixedField KR L hLK sigma2 + let S3 := D.frobeniusFixedField KR L hLK sigma3 + let S4 := D.frobeniusFixedField KR L hLK sigma4 + let hS1K := D.frobeniusFixedField_le KR L hLK sigma1 + let hS2K := D.frobeniusFixedField_le KR L hLK sigma2 + let hS3K := D.frobeniusFixedField_le KR L hLK sigma3 + let hS4K := D.frobeniusFixedField_le KR L hLK sigma4 + let hS1finite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S1 hS1K) := + D.frobeniusFixedField_finite KR L hLK sigma1 + let hS2finite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S2 hS2K) := + D.frobeniusFixedField_finite KR L hLK sigma2 + let hS3finite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S3 hS3K) := + D.frobeniusFixedField_finite KR L hLK sigma3 + let hS4finite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S4 hS4K) := + D.frobeniusFixedField_finite KR L hLK sigma4 + let hS1absolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) S1 (le_baseField S1)) := + D.frobeniusFixedField_absoluteFinite K L hLK sigma1 + let hS2absolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) S2 (le_baseField S2)) := + D.frobeniusFixedField_absoluteFinite K L hLK sigma2 + let hS3absolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) S3 (le_baseField S3)) := + D.frobeniusFixedField_absoluteFinite K L hLK sigma3 + let hS4absolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) S4 (le_baseField S4)) := + D.frobeniusFixedField_absoluteFinite K L hLK sigma4 + let Sigma1 : FiniteAbstractField G := ⟨S1, hS1absolute⟩ + let Sigma2 : FiniteAbstractField G := ⟨S2, hS2absolute⟩ + let Sigma3 : FiniteAbstractField G := ⟨S3, hS3absolute⟩ + let pi1 : ambientFixedAddSubgroup A S1 := by + simpa [Sigma1] using v.chosenPrimeElement Sigma1 + let pi2 : ambientFixedAddSubgroup A S2 := by + simpa [Sigma2] using v.chosenPrimeElement Sigma2 + let pi3 : ambientFixedAddSubgroup A S3 := by + simpa [Sigma3] using v.chosenPrimeElement Sigma3 + have hpi1 : v.IsPrimeElement Sigma1 pi1 := by + simpa [Sigma1, pi1] using v.chosenPrimeElement_isPrime Sigma1 + have hpi2 : v.IsPrimeElement Sigma2 pi2 := by + simpa [Sigma2, pi2] using v.chosenPrimeElement_isPrime Sigma2 + have hpi3 : v.IsPrimeElement Sigma3 pi3 := by + simpa [Sigma3, pi3] using v.chosenPrimeElement_isPrime Sigma3 + obtain ⟨pi4, hpi4, hnorm42⟩ := + D.exists_primeElement_frobeniusActionConjugate_norm_eq A v K L hLK + phi sigma2 m pi2 hpi2 + let E := D.maximalUnramifiedField L + let I := D.maximalUnramifiedField KR.field + let hEI := D.maximalUnramifiedField_mono hLK + let p1 := fixedFieldInclusion A S1 E + (D.fieldInertia_le_frobeniusFixedField KR L hLK sigma1) pi1 + let p3 := fixedFieldInclusion A S3 E + (D.fieldInertia_le_frobeniusFixedField KR L hLK sigma3) pi3 + let p4 := fixedFieldInclusion A S4 E + (D.fieldInertia_le_frobeniusFixedField KR L hLK sigma4) pi4 + let u := D.frobeniusPowerSum A KR.field L hLK phi.1 + (D.frobeniusExponent KR L hLK sigma4) p4 + + D.frobeniusPowerSum A KR.field L hLK phi.1 + (D.frobeniusExponent KR L hLK sigma1) p1 - + D.frobeniusPowerSum A KR.field L hLK phi.1 + (D.frobeniusExponent KR L hLK sigma3) p3 + let tau1 := D.frobeniusActionRemainder KR L hLK phi sigma1 + let tau4 := D.frobeniusActionRemainder KR L hLK phi sigma4 + let B := D.frobeniusQuotientRepresentation A KR.field L hLK + let correction : Fin 3 → ambientFixedAddSubgroup A E := + frobeniusMultiplicativityCorrectionTerm B tau1 p1 p3 p4 + have hcorrectionMem : ∀ i : Fin 3, + correction i ∈ v.infiniteUnitAddSubgroup E K + (D.maximalUnramifiedField_le_of_le hLK) := by + have hmem := + D.frobeniusCorrectionTerms_mem_infiniteUnitAddSubgroup + A v K L hLK phi sigma1 sigma2 pi1 pi3 pi4 hpi1 hpi3 hpi4 + change ∀ i : Fin 3, + (![p4 - p3, p1 - p3, + p3 - D.frobeniusQuotientAction A KR.field L hLK tau1 p3] : + Fin 3 → ambientFixedAddSubgroup A E) i ∈ + v.infiniteUnitAddSubgroup E K + (D.maximalUnramifiedField_le_of_le hLK) + change ∀ i : Fin 3, + (![p4 - p3, p1 - p3, + p3 - D.frobeniusQuotientAction A KR.field L hLK tau1 p3] : + Fin 3 → ambientFixedAddSubgroup A E) i ∈ + v.infiniteUnitAddSubgroup E K + (D.maximalUnramifiedField_le_of_le hLK) at hmem + exact hmem + have huMem : u ∈ v.infiniteUnitAddSubgroup E K + (D.maximalUnramifiedField_le_of_le hLK) := by + simpa [u, p1, p3, p4, E, S1, S3, S4, sigma3, sigma4, m, + pi1, pi3] using + D.frobeniusPowerSum_alternating_mem_infiniteUnitAddSubgroup + A v K L hLK phi sigma1 sigma2 pi1 pi3 pi4 hpi1 hpi3 hpi4 + have hactionMem := + D.frobeniusMultiplicativityCorrectionAction_mem_degreeKernel + KR L hLK phi sigma1 sigma2 hphi + let tau : Fin 3 → + (D.extensionNormalizedDegreeContinuous KR L hLK).toMonoidHom.ker := + fun i ↦ ⟨frobeniusMultiplicativityCorrectionAction tau1 tau4 i, by + simpa [tau1, tau4, sigma4, m] using hactionMem i⟩ + let uU : v.infiniteUnitAddSubgroup E K + (D.maximalUnramifiedField_le_of_le hLK) := ⟨u, huMem⟩ + let uiU : Fin 3 → v.infiniteUnitAddSubgroup E K + (D.maximalUnramifiedField_le_of_le hLK) := + fun i ↦ ⟨correction i, hcorrectionMem i⟩ + have hraw := D.frobeniusPowerSum_mul_action_sub A KR L hLK + phi sigma1 sigma2 pi1 pi3 pi4 + have hdiff := + frobeniusMultiplicativity_actionDifference_eq_correctionSum + B tau1 tau4 p1 p3 p4 + change + (D.frobeniusQuotientAction A KR.field L hLK tau4 p4 - p4) + + (D.frobeniusQuotientAction A KR.field L hLK tau1 p1 - p1) + + (p3 - D.frobeniusQuotientAction A KR.field L hLK (tau4 * tau1) p3) = + ∑ i : Fin 3, + (D.frobeniusQuotientAction A KR.field L hLK + (frobeniusMultiplicativityCorrectionAction tau1 tau4 i) + (correction i) - correction i) at hdiff + have hstar : + D.frobeniusQuotientAction A KR.field L hLK phi.1 uU.1 - uU.1 = + ∑ i ∈ (Finset.univ : Finset (Fin 3)), + (D.frobeniusQuotientAction A KR.field L hLK (tau i).1 (uiU i).1 - + (uiU i).1) := by + change D.frobeniusQuotientAction A KR.field L hLK phi.1 u - u = _ + rw [show D.frobeniusQuotientAction A KR.field L hLK phi.1 u - u = + (D.frobeniusQuotientAction A KR.field L hLK tau4 p4 - p4) + + (D.frobeniusQuotientAction A KR.field L hLK tau1 p1 - p1) + + (p3 - D.frobeniusQuotientAction A KR.field L hLK (tau4 * tau1) p3) by + simpa [u, p1, p3, p4, tau1, tau4, sigma3, sigma4, m, + E, S1, S3, S4, pi1, pi3] using hraw] + simpa only [tau, uiU, correction, B, + D.frobeniusQuotientRepresentation_apply] using hdiff + let hIfinite : Finite + (I.toSubgroup ⧸ extensionSubgroup I E hEI) := + D.maximalUnramifiedExtension_finite KR.field L hLK + obtain ⟨aK, haKdescend, haKunitNorm⟩ := + v.universalNormDescent hAxiom K L hLK phi hphi + (Finset.univ : Finset (Fin 3)) tau uU uiU hstar + have haKnormRaw : aK.1 ∈ infiniteNormSubgroup A E K.field := + v.infiniteUnitNormSubgroup_le_normSubgroup E K haKunitNorm + let r1 := relativeNorm A K.field S1 hS1K pi1 + let r2 := relativeNorm A K.field S2 hS2K pi2 + let r3 := relativeNorm A K.field S3 hS3K pi3 + let r4 := relativeNorm A K.field S4 hS4K pi4 + have hnormu := D.relativeNorm_frobeniusPowerSum_alternating A KR L hLK + phi sigma1 sigma2 hphi pi1 pi3 pi4 + have hclasses41 : + D.maximalUnramifiedNormClass A K.field L r4 + + D.maximalUnramifiedNormClass A K.field L r1 = + D.maximalUnramifiedNormClass A K.field L r3 := by + apply D.maximalUnramifiedNormClass_add_eq_of_relativeNorm A KR L hLK + r4 r1 r3 u hnormu + refine ⟨aK.1, haKdescend, ?_⟩ + exact (D.mem_maximalUnramifiedNormSubgroup_iff A K.field L aK.1).2 (by + simpa only [E] using haKnormRaw) + have hclasses12 : + D.maximalUnramifiedNormClass A K.field L r1 + + D.maximalUnramifiedNormClass A K.field L r2 = + D.maximalUnramifiedNormClass A K.field L r3 := by + have hr42 : r4 = r2 := by + simpa [r4, r2, S4, S2, sigma4, m] using hnorm42 + rw [← hr42, add_comm] + exact hclasses41 + apply D.reciprocityMap_mul_of_primeNormClass_eq + A v hAxiom K L hLK sigma1 sigma2 pi1 pi2 pi3 + hpi1 hpi2 hpi3 + simpa [r1, r2, r3, E, S1, S2, S3, sigma3, pi1, pi2, pi3] + using hclasses12 + +end DegreeData +end reciprocityMapMultiplicativity + +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean new file mode 100644 index 0000000000..820e287c41 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean @@ -0,0 +1,1590 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainFiniteReciprocity + +/-! # Main Naturality -/ + +@[expose] public section +universe u + +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +open CategoryTheory + + +/-! +# The abstract reciprocity construction, norm--conjugation naturality: naturality of reciprocity + +The two vertical maps are constructed here on the actual finite +Galois quotients and the actual finite norm quotients. Their defining +commutativities are proved from norm transitivity and conjugation, so the +eventual the finite reciprocity equivalence reciprocity homomorphisms can be connected without +any additional comparison datum. +-/ + +noncomputable +section + +open scoped BigOperators + +section GroupOnly + +variable {G : Type u} [Group G] [TopologicalSpace G] + +/-- The left vertical map in the first diagram of norm--conjugation naturality: +restriction from `G(L'/K')` to `G(L/K)`. -/ +def finiteReciprocityNaturalityRestriction + (K K' L L' : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + [hL'normal : (extensionSubgroup K' L' hL'K').Normal] : + (K'.toSubgroup ⧸ extensionSubgroup K' L' hL'K') →* + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := by + apply QuotientGroup.map + (extensionSubgroup K' L' hL'K') + (extensionSubgroup K L hLK) + (Subgroup.inclusion hK'K) + intro k' hk'L' + change k'.1 ∈ L'.toSubgroup at hk'L' + change (Subgroup.inclusion hK'K k').1 ∈ L.toSubgroup + exact hL'L hk'L' + +/-- Restriction sends a represented finite reciprocity class to the corresponding +lower-level class. -/ +@[simp] +theorem finiteReciprocityNaturalityRestriction_mk + (K K' L L' : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + [hL'normal : (extensionSubgroup K' L' hL'K').Normal] + (k' : K'.toSubgroup) : + finiteReciprocityNaturalityRestriction K K' L L' hLK hL'K' hK'K hL'L + (QuotientGroup.mk k') = + QuotientGroup.mk (Subgroup.inclusion hK'K k') := + rfl + +namespace DegreeData + +/-- Restriction on the infinite Frobenius quotients underlying the first +diagram of norm--conjugation naturality. -/ +def finiteReciprocityNaturalityFrobeniusTowerMap + (D : DegreeData G) + (K K' L L' : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + [hL'normal : (extensionSubgroup K' L' hL'K').Normal] : + (K'.toSubgroup ⧸ D.extensionInertiaWithin K' L' hL'K') →* + (K.toSubgroup ⧸ D.extensionInertiaWithin K L hLK) := by + apply QuotientGroup.map + (D.extensionInertiaWithin K' L' hL'K') + (D.extensionInertiaWithin K L hLK) + (Subgroup.inclusion hK'K) + rintro k' ⟨hk'L', hk'I⟩ + constructor + · change k'.1 ∈ L'.toSubgroup at hk'L' + change (Subgroup.inclusion hK'K k').1 ∈ L.toSubgroup + exact hL'L hk'L' + · exact hk'I + +/-- The Frobenius tower map has the expected value on a quotient representative. -/ +@[simp] +theorem finiteReciprocityNaturalityFrobeniusTowerMap_mk + (D : DegreeData G) [IsTopologicalGroup G] + (K K' L L' : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + [hL'normal : (extensionSubgroup K' L' hL'K').Normal] + (k' : K'.toSubgroup) : + D.finiteReciprocityNaturalityFrobeniusTowerMap K K' L L' + hLK hL'K' hK'K hL'L (QuotientGroup.mk k') = + QuotientGroup.mk (Subgroup.inclusion hK'K k') := rfl + +/-- Continuous form of `finiteReciprocityNaturalityFrobeniusTowerMap`, used to transport +the closed cyclic subgroup generated by a Frobenius lift. -/ +def finiteReciprocityNaturalityFrobeniusTowerMapContinuous + (D : DegreeData G) [IsTopologicalGroup G] + (K K' L L' : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + [hL'normal : (extensionSubgroup K' L' hL'K').Normal] : + (K'.toSubgroup ⧸ D.extensionInertiaWithin K' L' hL'K') →ₜ* + (K.toSubgroup ⧸ D.extensionInertiaWithin K L hLK) where + toMonoidHom := D.finiteReciprocityNaturalityFrobeniusTowerMap + K K' L L' hLK hL'K' hK'K hL'L + continuous_toFun := by + rw [← QuotientGroup.isOpenQuotientMap_mk.continuous_comp_iff] + change Continuous (fun k' : K'.toSubgroup => + QuotientGroup.mk (Subgroup.inclusion hK'K k')) + apply QuotientGroup.continuous_mk.comp + exact continuous_subtype_val.subtype_mk _ + +/-- Frobenius residue-degree compatibility's normalized-degree square on the two infinite +Frobenius quotients. -/ +theorem finiteReciprocityNaturalityFrobeniusTowerMap_degree + (D : DegreeData G) [IsTopologicalGroup G] + (E : DegreeData.FiniteResidueAbstractExtension D) + (L L' : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ E.base.toSubgroup) + (hL'K' : L'.toSubgroup ≤ E.field.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLnormal : (extensionSubgroup E.base.field L hLK).Normal] + [hL'normal : (extensionSubgroup E.field.field L' hL'K').Normal] + (q : E.field.toSubgroup ⧸ + D.extensionInertiaWithin E.field.field L' hL'K') : + (D.extensionNormalizedDegree E.base L hLK + (D.finiteReciprocityNaturalityFrobeniusTowerMap + E.base.field E.field.field L L' + hLK hL'K' E.below hL'L q)).toAdd = + (E.residueDegree : ℕ) • + (D.extensionNormalizedDegree E.field L' hL'K' q).toAdd := by + refine Quotient.inductionOn' q ?_ + intro k' + change (D.normalizedDegree E.base (Subgroup.inclusion E.below k')).toAdd = + (E.residueDegree : ℕ) • (D.normalizedDegree E.field k').toAdd + exact D.frobeniusRestrictionNaturality_normalizedDegree E k' + +/-- A positive Frobenius lift over `K'` remains a positive Frobenius lift +over `K`; its exponent is multiplied by `f_{K'/K}`. -/ +def finiteReciprocityNaturalityFrobeniusTowerLift + (D : DegreeData G) [IsTopologicalGroup G] + (E : DegreeData.FiniteResidueAbstractExtension D) + (L L' : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ E.base.toSubgroup) + (hL'K' : L'.toSubgroup ≤ E.field.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLnormal : (extensionSubgroup E.base.field L hLK).Normal] + [hL'normal : (extensionSubgroup E.field.field L' hL'K').Normal] + (σ : D.FrobeniusElements E.field L' hL'K') : + D.FrobeniusElements E.base L hLK := by + let f := (E.residueDegree : ℕ) + let n := D.frobeniusExponent E.field L' hL'K' σ + refine ⟨D.finiteReciprocityNaturalityFrobeniusTowerMap + E.base.field E.field.field L L' hLK hL'K' E.below hL'L σ.1, + f * n, Nat.mul_pos E.residueDegree.property + (D.frobeniusExponent_pos E.field L' hL'K' σ), ?_⟩ + apply Multiplicative.ext + rw [D.finiteReciprocityNaturalityFrobeniusTowerMap_degree E L L' + hLK hL'K' hL'L σ.1] + rw [D.extensionNormalizedDegree_frobenius_eq_pow E.field L' hL'K' σ] + change f • (n • (1 : ZHat)) = (f * n) • (1 : ZHat) + rw [smul_smul] + +/-- The chosen Frobenius tower lift coerces to the represented ambient automorphism. -/ +@[simp] +theorem finiteReciprocityNaturalityFrobeniusTowerLift_coe + (D : DegreeData G) [IsTopologicalGroup G] + (E : DegreeData.FiniteResidueAbstractExtension D) + (L L' : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ E.base.toSubgroup) + (hL'K' : L'.toSubgroup ≤ E.field.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLnormal : (extensionSubgroup E.base.field L hLK).Normal] + [hL'normal : (extensionSubgroup E.field.field L' hL'K').Normal] + (σ : D.FrobeniusElements E.field L' hL'K') : + (D.finiteReciprocityNaturalityFrobeniusTowerLift + E L L' hLK hL'K' hL'L σ).1 = + D.finiteReciprocityNaturalityFrobeniusTowerMap + E.base.field E.field.field L L' hLK hL'K' E.below hL'L σ.1 := by + simp [finiteReciprocityNaturalityFrobeniusTowerLift] + +/-- The Frobenius tower lift has the prescribed Frobenius exponent. -/ +@[simp] +theorem finiteReciprocityNaturalityFrobeniusTowerLift_exponent + (D : DegreeData G) [IsTopologicalGroup G] + (E : DegreeData.FiniteResidueAbstractExtension D) + (L L' : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ E.base.toSubgroup) + (hL'K' : L'.toSubgroup ≤ E.field.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLnormal : (extensionSubgroup E.base.field L hLK).Normal] + [hL'normal : (extensionSubgroup E.field.field L' hL'K').Normal] + (σ : D.FrobeniusElements E.field L' hL'K') : + D.frobeniusExponent E.base L hLK + (D.finiteReciprocityNaturalityFrobeniusTowerLift + E L L' hLK hL'K' hL'L σ) = + (E.residueDegree : ℕ) * + D.frobeniusExponent E.field L' hL'K' σ := by + apply proCIntegerOne_pow_nat_injective + let f := (E.residueDegree : ℕ) + let n := D.frobeniusExponent E.field L' hL'K' σ + calc + (Multiplicative.ofAdd (1 : ZHat)) ^ + D.frobeniusExponent E.base L hLK + (D.finiteReciprocityNaturalityFrobeniusTowerLift + E L L' hLK hL'K' hL'L σ) = + D.extensionNormalizedDegree E.base L hLK + (D.finiteReciprocityNaturalityFrobeniusTowerLift + E L L' hLK hL'K' hL'L σ).1 := + (D.extensionNormalizedDegree_frobenius_eq_pow E.base L hLK _).symm + _ = (Multiplicative.ofAdd (1 : ZHat)) ^ (f * n) := by + apply Multiplicative.ext + rw [D.finiteReciprocityNaturalityFrobeniusTowerLift_coe] + rw [D.finiteReciprocityNaturalityFrobeniusTowerMap_degree E L L' + hLK hL'K' hL'L σ.1] + rw [D.extensionNormalizedDegree_frobenius_eq_pow + E.field L' hL'K' σ] + change f • (n • (1 : ZHat)) = (f * n) • (1 : ZHat) + rw [smul_smul] + _ = (Multiplicative.ofAdd (1 : ZHat)) ^ + ((E.residueDegree : ℕ) * + D.frobeniusExponent E.field L' hL'K' σ) := by rfl + +/-- Restriction of the transported lift is the restriction of the original +lift along the left vertical map of norm--conjugation naturality. -/ +theorem finiteReciprocityNaturalityRestriction_frobeniusTowerLift + (D : DegreeData G) [IsTopologicalGroup G] + (E : DegreeData.FiniteResidueAbstractExtension D) + (L L' : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ E.base.toSubgroup) + (hL'K' : L'.toSubgroup ≤ E.field.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLnormal : (extensionSubgroup E.base.field L hLK).Normal] + [hL'normal : (extensionSubgroup E.field.field L' hL'K').Normal] + (σ : D.FrobeniusElements E.field L' hL'K') : + finiteReciprocityNaturalityRestriction + E.base.field E.field.field L L' hLK hL'K' E.below hL'L + (D.frobeniusRestriction E.field L' hL'K' σ) = + D.frobeniusRestriction E.base L hLK + (D.finiteReciprocityNaturalityFrobeniusTowerLift + E L L' hLK hL'K' hL'L σ) := by + change finiteReciprocityNaturalityRestriction + E.base.field E.field.field L L' hLK hL'K' E.below hL'L + (D.extensionRestriction E.field.field L' hL'K' σ.1) = + D.extensionRestriction E.base.field L hLK + (D.finiteReciprocityNaturalityFrobeniusTowerLift + E L L' hLK hL'K' hL'L σ).1 + rw [D.finiteReciprocityNaturalityFrobeniusTowerLift_coe] + refine Quotient.inductionOn' σ.1 ?_ + intro k' + rfl + +/-- The fixed field of a transported Frobenius lift contains the original +fixed field, i.e. `Σ' / Σ` is an intermediate extension. -/ +theorem finiteReciprocityNaturalityFrobeniusFixedField_le + (D : DegreeData G) [IsTopologicalGroup G] + (E : DegreeData.FiniteResidueAbstractExtension D) + (L L' : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ E.base.toSubgroup) + (hL'K' : L'.toSubgroup ≤ E.field.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLnormal : (extensionSubgroup E.base.field L hLK).Normal] + [hL'normal : (extensionSubgroup E.field.field L' hL'K').Normal] + (σ : D.FrobeniusElements E.field L' hL'K') : + (D.frobeniusFixedField E.field L' hL'K' σ).toSubgroup ≤ + (D.frobeniusFixedField E.base L hLK + (D.finiteReciprocityNaturalityFrobeniusTowerLift + E L L' hLK hL'K' hL'L σ)).toSubgroup := by + rintro g ⟨k', hk', rfl⟩ + let k : E.base.field.toSubgroup := Subgroup.inclusion E.below k' + refine ⟨k, ?_, rfl⟩ + change QuotientGroup.mk k ∈ + (D.frobeniusClosure E.base L hLK + (D.finiteReciprocityNaturalityFrobeniusTowerLift + E L L' hLK hL'K' hL'L σ)).toSubgroup + change QuotientGroup.mk k' ∈ + (D.frobeniusClosure E.field L' hL'K' σ).toSubgroup at hk' + have hmap := map_mem_closedSubgroupGenerated_singleton + (D.finiteReciprocityNaturalityFrobeniusTowerMapContinuous + E.base.field E.field.field L L' hLK hL'K' E.below hL'L) σ.1 (by + simpa [DegreeData.frobeniusClosure] using hk') + let f := D.finiteReciprocityNaturalityFrobeniusTowerMap + E.base.field E.field.field L L' hLK hL'K' E.below hL'L + change f (QuotientGroup.mk k') ∈ + (closedSubgroupGenerated ({f σ.1} : Set _) : Subgroup _) at hmap + simp only [frobeniusClosure, finiteReciprocityNaturalityFrobeniusTowerLift_coe, + Set.range_const] + change f (QuotientGroup.mk k') ∈ + (closedSubgroupGenerated ({f σ.1} : Set _) : Subgroup _) + exact hmap + +/-- The intermediate extension `Σ' / Σ` attached to a transported +Frobenius lift is totally ramified. -/ +theorem finiteReciprocityNaturalityFrobeniusFixedField_isTotallyRamified + (D : DegreeData G) [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (E : DegreeData.FiniteResidueAbstractExtension D) + (L L' : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ E.base.toSubgroup) + (hL'K' : L'.toSubgroup ≤ E.field.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLnormal : (extensionSubgroup E.base.field L hLK).Normal] + [hL'normal : (extensionSubgroup E.field.field L' hL'K').Normal] + [Finite + (E.base.toSubgroup ⧸ extensionSubgroup E.base.field L hLK)] + [hL'K'finite : Finite + (E.field.toSubgroup ⧸ extensionSubgroup E.field.field L' hL'K')] + (σ : D.FrobeniusElements E.field L' hL'K') : + (DegreeData.AbstractExtension.mk + (D.frobeniusFixedField E.field L' hL'K' σ) + (D.frobeniusFixedField E.base L hLK + (D.finiteReciprocityNaturalityFrobeniusTowerLift + E L L' hLK hL'K' hL'L σ)) + (D.finiteReciprocityNaturalityFrobeniusFixedField_le + E L L' hLK hL'K' hL'L σ)).IsTotallyRamified D := by + let τ := D.finiteReciprocityNaturalityFrobeniusTowerLift + E L L' hLK hL'K' hL'L σ + let S' := D.frobeniusFixedField E.field L' hL'K' σ + let S := D.frobeniusFixedField E.base L hLK τ + let hS'S := D.finiteReciprocityNaturalityFrobeniusFixedField_le + E L L' hLK hL'K' hL'L σ + let FS := D.frobeniusFixedResidueField E.base L hLK τ + let FS' := D.frobeniusFixedResidueField E.field L' hL'K' σ + have hresidue : (FS.residueDegree : ℕ) = (FS'.residueDegree : ℕ) := by + calc + (FS.residueDegree : ℕ) = + D.frobeniusExponent E.base L hLK τ * + (E.base.residueDegree : ℕ) := + D.frobeniusFixedResidueField_residueDegree E.base L hLK τ + _ = ((E.residueDegree : ℕ) * + D.frobeniusExponent E.field L' hL'K' σ) * + (E.base.residueDegree : ℕ) := by + rw [D.finiteReciprocityNaturalityFrobeniusTowerLift_exponent] + _ = D.frobeniusExponent E.field L' hL'K' σ * + ((E.residueDegree : ℕ) * (E.base.residueDegree : ℕ)) := by + ac_rfl + _ = D.frobeniusExponent E.field L' hL'K' σ * + (E.field.residueDegree : ℕ) := by + rw [E.residueDegree_mul_absoluteResidueDegree D] + _ = (FS'.residueDegree : ℕ) := + (D.frobeniusFixedResidueField_residueDegree E.field L' hL'K' σ).symm + let hS'K' := D.frobeniusFixedField_le E.field L' hL'K' σ + let hSK := D.frobeniusFixedField_le E.base L hLK τ + let : Finite (E.field.toSubgroup ⧸ + extensionSubgroup E.field.field S' hS'K') := + D.frobeniusFixedField_finite E.field L' hL'K' σ + let : Finite (E.base.toSubgroup ⧸ + extensionSubgroup E.base.field S hSK) := + D.frobeniusFixedField_finite E.base L hLK τ + let : Finite (E.base.toSubgroup ⧸ + extensionSubgroup E.base.field S' (hS'K'.trans E.below)) := + relativeTowerQuotientFinite E.base.field E.field.field S' hS'K' E.below + let hS'Sfinite : Finite + (S.toSubgroup ⧸ extensionSubgroup S S' hS'S) := + FiniteIntermediateField.finite_extension_of_le + (hS'S.trans hSK) hSK hS'S + let ES'S : DegreeData.FiniteResidueAbstractExtension D := + { field := FS' + base := FS + below := hS'S + finiteQuotient := hS'Sfinite } + have hrelative : (ES'S.residueDegree : ℕ) = 1 := by + change (ES'S.base.residueDegree : ℕ) = + (ES'S.field.residueDegree : ℕ) at hresidue + have hmul := ES'S.residueDegree_mul_absoluteResidueDegree D + rw [← hresidue] at hmul + have hpos : 0 < (ES'S.base.residueDegree : ℕ) := + ES'S.base.residueDegree.property + nlinarith + exact ES'S.toFiniteAbstractExtension.isTotallyRamified_of_residueDegree_eq_one + D hrelative + +end DegreeData + +/-- Finiteness of the upper-left-to-lower-right composite extension in the +first diagram. -/ +private theorem finiteReciprocityNaturality_tower_finite + (K K' L' : ClosedSubgroup G) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K K' hK'K)] + [Finite (K'.toSubgroup ⧸ extensionSubgroup K' L' hL'K')] : + Finite (K.toSubgroup ⧸ + extensionSubgroup K L' (hL'K'.trans hK'K)) := + relativeTowerQuotientFinite K K' L' hL'K' hK'K + +end GroupOnly + +section Representation + +/-! Mathlib's `Rep ℤ G` forces its representation-bearing group `G` to `Type 0`. -/ +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +/-- The right vertical map in the first diagram of norm--conjugation naturality. It is +the actual norm `N_{K'/K}`, descended to the actual finite norm quotients. -/ +def finiteReciprocityNaturalityNormMap + (A : Rep ℤ G) (K K' L L' : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLKfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [hL'K'finite : Finite + (K'.toSubgroup ⧸ extensionSubgroup K' L' hL'K')] + [hK'Kfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K K' hK'K)] : + FiniteNormQuotient A K' L' hL'K' →+ + FiniteNormQuotient A K L hLK := by + letI hL'Kfinite : Finite (K.toSubgroup ⧸ + extensionSubgroup K L' (hL'K'.trans hK'K)) := by + exact finiteReciprocityNaturality_tower_finite K K' L' hK'K hL'K' + letI hL'Lfinite : Finite + (L.toSubgroup ⧸ extensionSubgroup L L' hL'L) := + FiniteIntermediateField.finite_extension_of_le + (hL'L.trans hLK) hLK hL'L + let f : ambientFixedAddSubgroup A K' →+ FiniteNormQuotient A K L hLK := + (finiteNormClassHom A K L hLK).comp (relativeNorm A K K' hK'K) + apply finiteNormQuotientLift A K' L' hL'K' f + rintro _ ⟨a, rfl⟩ + let TLL' : DegreeData.FiniteTower G := + { top := L' + middle := L + base := K + top_le_middle := hL'L + middle_le_base := hLK + finiteTopQuotient := hL'Lfinite + finiteBaseQuotient := hLKfinite } + let TKK' : DegreeData.FiniteTower G := + { top := L' + middle := K' + base := K + top_le_middle := hL'K' + middle_le_base := hK'K + finiteTopQuotient := hL'K'finite + finiteBaseQuotient := hK'Kfinite } + apply (finiteNormClass_eq_zero_iff A K L hLK _).2 + refine ⟨relativeNorm A L L' hL'L a, ?_⟩ + calc + relativeNorm A K L hLK (relativeNorm A L L' hL'L a) = + relativeNorm A K L' (hL'L.trans hLK) a := + TLL'.norm_trans_apply A a + _ = relativeNorm A K L' (hL'K'.trans hK'K) a := by + congr 2 + _ = relativeNorm A K K' hK'K (relativeNorm A K' L' hL'K' a) := + (TKK'.norm_trans_apply A a).symm + +/-- The norm map carries a finite norm class to the corresponding class over the base. -/ +@[simp] +theorem finiteReciprocityNaturalityNormMap_finiteNormClass + (A : Rep ℤ G) (K K' L L' : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLKfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [Finite + (K'.toSubgroup ⧸ extensionSubgroup K' L' hL'K')] + [hK'Kfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K K' hK'K)] + (a : ambientFixedAddSubgroup A K') : + finiteReciprocityNaturalityNormMap A K K' L L' hLK hL'K' hK'K hL'L + (finiteNormClass A K' L' hL'K' a) = + finiteNormClass A K L hLK (relativeNorm A K K' hK'K a) := + by + simp [finiteReciprocityNaturalityNormMap] + rfl + +/-- The additive map `a ↦ a^s` between the two actual fixed subgroups. -/ +def conjugateFixedElementHom [ContinuousMul G] + (A : Rep ℤ G) (K : ClosedSubgroup G) (s : G) : + ambientFixedAddSubgroup A K →+ + ambientFixedAddSubgroup A (conjugateClosedSubgroup K s) where + toFun := conjugateFixedElement A K s + map_zero' := by + apply Subtype.ext + exact map_zero (A.ρ s⁻¹) + map_add' a b := by + apply Subtype.ext + exact map_add (A.ρ s⁻¹) a.1 b.1 + +/-- The homomorphism on conjugate-fixed elements evaluates by the underlying conjugation map. -/ +@[simp] +theorem conjugateFixedElementHom_apply [ContinuousMul G] + (A : Rep ℤ G) (K : ClosedSubgroup G) (s : G) + (a : ambientFixedAddSubgroup A K) : + conjugateFixedElementHom A K s a = conjugateFixedElement A K s a := + rfl + +/-- The right vertical map in the conjugation diagram of norm--conjugation naturality, +descended to the actual finite norm quotients. -/ +def finiteReciprocityNaturalityConjugationNormMap + [ContinuousMul G] (A : Rep ℤ G) + (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) (s : G) + [hLfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + letI : Finite ((conjugateClosedSubgroup K s).toSubgroup ⧸ + extensionSubgroup (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) := + finite_conjugateExtension K L hLK s + FiniteNormQuotient A K L hLK →+ + FiniteNormQuotient A (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) := by + letI hConjFinite : Finite ((conjugateClosedSubgroup K s).toSubgroup ⧸ + extensionSubgroup (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) := + finite_conjugateExtension K L hLK s + let f : ambientFixedAddSubgroup A K →+ + FiniteNormQuotient A (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) := + (finiteNormClassHom A (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)).comp + (conjugateFixedElementHom A K s) + apply finiteNormQuotientLift A K L hLK f + rintro _ ⟨a, rfl⟩ + apply (finiteNormClass_eq_zero_iff A (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) (conjugateClosedSubgroup_mono hLK s) _).2 + refine ⟨conjugateFixedElement A L s a, ?_⟩ + exact relativeNorm_conjugate_apply A K L hLK s a + +/-- The conjugation norm map preserves canonical finite norm classes. -/ +@[simp] +theorem finiteReciprocityNaturalityConjugationNormMap_finiteNormClass + [ContinuousMul G] (A : Rep ℤ G) + (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) (s : G) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a : ambientFixedAddSubgroup A K) : + letI : Finite ((conjugateClosedSubgroup K s).toSubgroup ⧸ + extensionSubgroup (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) := + finite_conjugateExtension K L hLK s + finiteReciprocityNaturalityConjugationNormMap A K L hLK s + (finiteNormClass A K L hLK a) = + finiteNormClass A (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) (conjugateClosedSubgroup_mono hLK s) + (conjugateFixedElement A K s a) := by + let hConjFinite : Finite ((conjugateClosedSubgroup K s).toSubgroup ⧸ + extensionSubgroup (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) := + finite_conjugateExtension K L hLK s + simp [finiteReciprocityNaturalityConjugationNormMap] + rfl + +/-- The norm identity used for the first diagram of norm--conjugation naturality, +already expressed in the target finite norm quotient. Taking `S = Σ` and +`S' = Σ'` gives the calculation. -/ +theorem finiteReciprocityNaturality_norm_tower_class + (A : Rep ℤ G) + (K K' L L' S S' : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + (hSK : S.toSubgroup ≤ K.toSubgroup) + (hS'K' : S'.toSubgroup ≤ K'.toSubgroup) + (hS'S : S'.toSubgroup ≤ S.toSubgroup) + [hLKfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [hL'K'finite : Finite (K'.toSubgroup ⧸ extensionSubgroup K' L' hL'K')] + [hK'Kfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K K' hK'K)] + [hSKfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K S hSK)] + [hS'K'finite : Finite (K'.toSubgroup ⧸ extensionSubgroup K' S' hS'K')] + [hS'Sfinite : Finite (S.toSubgroup ⧸ extensionSubgroup S S' hS'S)] + (π : ambientFixedAddSubgroup A S') : + finiteReciprocityNaturalityNormMap A K K' L L' hLK hL'K' hK'K hL'L + (finiteNormClass A K' L' hL'K' + (relativeNorm A K' S' hS'K' π)) = + finiteNormClass A K L hLK + (relativeNorm A K S hSK (relativeNorm A S S' hS'S π)) := by + let hS'Kfinite : Finite (K.toSubgroup ⧸ + extensionSubgroup K S' (hS'K'.trans hK'K)) := + finiteReciprocityNaturality_tower_finite K K' S' hK'K hS'K' + let TKK' : DegreeData.FiniteTower G := + { top := S' + middle := K' + base := K + top_le_middle := hS'K' + middle_le_base := hK'K + finiteTopQuotient := hS'K'finite + finiteBaseQuotient := hK'Kfinite } + let TSS' : DegreeData.FiniteTower G := + { top := S' + middle := S + base := K + top_le_middle := hS'S + middle_le_base := hSK + finiteTopQuotient := hS'Sfinite + finiteBaseQuotient := hSKfinite } + rw [finiteReciprocityNaturalityNormMap_finiteNormClass] + apply congrArg (finiteNormClass A K L hLK) + calc + relativeNorm A K K' hK'K (relativeNorm A K' S' hS'K' π) = + relativeNorm A K S' (hS'K'.trans hK'K) π := + TKK'.norm_trans_apply A π + _ = relativeNorm A K S' (hS'S.trans hSK) π := by + congr 2 + _ = relativeNorm A K S hSK (relativeNorm A S S' hS'S π) := + (TSS'.norm_trans_apply A π).symm + +namespace DegreeData + +/-- **norm--conjugation naturality, first diagram.** Restriction on finite Galois groups +corresponds under the finite reciprocity equivalence to the norm `N_{K'/K}` on finite norm +quotients. -/ +theorem finiteReciprocityNaturality_restriction_norm_commutes + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (E : FiniteAbstractFieldExtension G) + (L L' : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ E.base.field.toSubgroup) + (hL'K' : L'.toSubgroup ≤ E.field.field.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLnormal : (extensionSubgroup E.base.field L hLK).Normal] + [hL'normal : (extensionSubgroup E.field.field L' hL'K').Normal] + [hLKfinite : Finite + (E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field L hLK)] + [hL'K'finite : Finite + (E.field.field.toSubgroup ⧸ + extensionSubgroup E.field.field L' hL'K')] : + (finiteReciprocityNaturalityNormMap A E.base.field E.field.field L L' + hLK hL'K' E.below hL'L).comp + (D.finiteReciprocityHom A v hAxiom E.field L' hL'K') = + (D.finiteReciprocityHom A v hAxiom E.base L hLK).comp + (finiteReciprocityNaturalityRestriction + E.base.field E.field.field L L' + hLK hL'K' E.below hL'L).toAdditive := by + let ER := E.toFiniteResidueAbstractExtension D + let hL'K'finiteER : Finite + (ER.field.field.toSubgroup ⧸ + extensionSubgroup ER.field.field L' hL'K') := by + change Finite + (ER.field.field.toSubgroup ⧸ + extensionSubgroup ER.field.field L' hL'K') at hL'K'finite + exact hL'K'finite + let hLKfiniteER : Finite + (ER.base.field.toSubgroup ⧸ + extensionSubgroup ER.base.field L hLK) := by + change Finite + (ER.base.field.toSubgroup ⧸ + extensionSubgroup ER.base.field L hLK) at hLKfinite + exact hLKfinite + let hLnormalERbase : + (extensionSubgroup ER.base.field L hLK).Normal := by + change (extensionSubgroup ER.base.field L hLK).Normal at hLnormal + exact hLnormal + let hL'normalERfield : + (extensionSubgroup ER.field.field L' hL'K').Normal := by + change (extensionSubgroup ER.field.field L' hL'K').Normal at hL'normal + exact hL'normal + apply AddMonoidHom.ext + intro q + let σ := D.chosenFiniteReciprocityFrobeniusLift ER.field L' hL'K' q.toMul + let τ := D.finiteReciprocityNaturalityFrobeniusTowerLift + ER L L' hLK hL'K' hL'L σ + have hσ : D.frobeniusRestriction ER.field L' hL'K' σ = q.toMul := + D.frobeniusRestriction_chosenFiniteReciprocityFrobeniusLift + ER.field L' hL'K' q.toMul + have hτ : D.frobeniusRestriction ER.base L hLK τ = + ((finiteReciprocityNaturalityRestriction + E.base.field E.field.field L L' + hLK hL'K' E.below hL'L).toAdditive q).toMul := by + rw [← D.finiteReciprocityNaturalityRestriction_frobeniusTowerLift + ER L L' hLK hL'K' hL'L σ, hσ] + rfl + let S' := D.frobeniusFixedField ER.field L' hL'K' σ + let S := D.frobeniusFixedField ER.base L hLK τ + let hS'K' := D.frobeniusFixedField_le ER.field L' hL'K' σ + let hSK := D.frobeniusFixedField_le ER.base L hLK τ + let hS'S := D.finiteReciprocityNaturalityFrobeniusFixedField_le + ER L L' hLK hL'K' hL'L σ + let hS'K'finite : Finite + (E.field.field.toSubgroup ⧸ + extensionSubgroup E.field.field S' hS'K') := + D.frobeniusFixedField_finite ER.field L' hL'K' σ + let hSKfinite : Finite + (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field S hSK) := + D.frobeniusFixedField_finite ER.base L hLK τ + let hS'Kfinite : Finite + (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field S' (hS'K'.trans E.below)) := + finiteReciprocityNaturality_tower_finite + E.base.field E.field.field S' E.below hS'K' + let hS'Sfinite : Finite + (S.toSubgroup ⧸ extensionSubgroup S S' hS'S) := + FiniteIntermediateField.finite_extension_of_le + (K := E.base.field) (hS'S.trans hSK) hSK hS'S + let hSabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) S (le_baseField S)) := + D.frobeniusFixedField_absoluteFinite E.base L hLK τ + let hS'absolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) S' (le_baseField S')) := + D.frobeniusFixedField_absoluteFinite E.field L' hL'K' σ + let Sfinite : FiniteAbstractField G := ⟨S, hSabsolute⟩ + let S'finite : FiniteAbstractField G := ⟨S', hS'absolute⟩ + let ES'S : FiniteAbstractFieldExtension G := + { field := S'finite + base := Sfinite + below := hS'S + finiteQuotient := hS'Sfinite } + let π : ambientFixedAddSubgroup A S' := v.chosenPrimeElement S'finite + have hπ : v.IsPrimeElement S'finite π := v.chosenPrimeElement_isPrime S'finite + let πS : ambientFixedAddSubgroup A S := relativeNorm A S S' hS'S π + have hTot : ES'S.IsTotallyRamified D := by + have hTot' := + D.finiteReciprocityNaturalityFrobeniusFixedField_isTotallyRamified + ER L L' hLK hL'K' hL'L σ + change ES'S.IsTotallyRamified D at hTot' + exact hTot' + have hπS : v.IsPrimeElement Sfinite πS := + v.norm_prime_of_totallyRamified ES'S hTot π hπ + change finiteReciprocityNaturalityNormMap + A E.base.field E.field.field L L' hLK hL'K' E.below hL'L + (D.finiteReciprocityHom A v hAxiom E.field L' hL'K' q) = + D.finiteReciprocityHom A v hAxiom E.base L hLK + ((finiteReciprocityNaturalityRestriction + E.base.field E.field.field L L' + hLK hL'K' E.below hL'L).toAdditive q) + calc + finiteReciprocityNaturalityNormMap + A E.base.field E.field.field L L' hLK hL'K' E.below hL'L + (D.finiteReciprocityHom A v hAxiom E.field L' hL'K' q) = + finiteReciprocityNaturalityNormMap + A E.base.field E.field.field L L' hLK hL'K' E.below hL'L + (finiteNormClass A E.field.field L' hL'K' + (relativeNorm A E.field.field S' hS'K' π)) := by + apply congrArg (finiteReciprocityNaturalityNormMap + A E.base.field E.field.field L L' hLK hL'K' E.below hL'L) + have hprime := + D.finiteReciprocityHom_apply_eq_primeNormClass + A v hAxiom E.field L' hL'K' q σ hσ π hπ + change D.finiteReciprocityHom A v hAxiom E.field L' hL'K' q = + finiteNormClass A E.field.field L' hL'K' + (relativeNorm A E.field.field S' hS'K' π) at hprime + exact hprime + _ = finiteNormClass A E.base.field L hLK + (relativeNorm A E.base.field S hSK πS) := by + exact finiteReciprocityNaturality_norm_tower_class + A E.base.field E.field.field L L' S S' + hLK hL'K' E.below hL'L hSK hS'K' hS'S π + _ = D.finiteReciprocityHom A v hAxiom E.base L hLK + ((finiteReciprocityNaturalityRestriction + E.base.field E.field.field L L' + hLK hL'K' E.below hL'L).toAdditive q) := by + symm + have hprime := + D.finiteReciprocityHom_apply_eq_primeNormClass + A v hAxiom E.base L hLK _ τ hτ πS hπS + change D.finiteReciprocityHom A v hAxiom E.base L hLK _ = + finiteNormClass A E.base.field L hLK + (relativeNorm A E.base.field S hSK πS) at hprime + exact hprime + +end DegreeData + +/-- The norm identity used for the second diagram of norm--conjugation naturality, +expressed in the conjugate finite norm quotient. -/ +theorem finiteReciprocityNaturality_conjugation_norm_class + [ContinuousMul G] (A : Rep ℤ G) + (K L S : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hSK : S.toSubgroup ≤ K.toSubgroup) (s : G) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [Finite (K.toSubgroup ⧸ extensionSubgroup K S hSK)] + (π : ambientFixedAddSubgroup A S) : + let hConjLK := conjugateClosedSubgroup_mono hLK s + let hConjSK := conjugateClosedSubgroup_mono hSK s + letI : Finite ((conjugateClosedSubgroup K s).toSubgroup ⧸ + extensionSubgroup (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) hConjLK) := + finite_conjugateExtension K L hLK s + letI : Finite ((conjugateClosedSubgroup K s).toSubgroup ⧸ + extensionSubgroup (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup S s) hConjSK) := + finite_conjugateExtension K S hSK s + finiteReciprocityNaturalityConjugationNormMap A K L hLK s + (finiteNormClass A K L hLK + (relativeNorm A K S hSK π)) = + finiteNormClass A (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) hConjLK + (relativeNorm A (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup S s) hConjSK + (conjugateFixedElement A S s π)) := by + dsimp only + rw [finiteReciprocityNaturalityConjugationNormMap_finiteNormClass, + relativeNorm_conjugate_apply] + +end Representation + +section GroupOnly + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- The global degree is invariant under conjugation. -/ +theorem finiteReciprocityNaturalityDegree_conjugateSubgroupEquiv + (D : DegreeData G) [IsTopologicalGroup G] + (K : ClosedSubgroup G) (s : G) (k : K.toSubgroup) : + D.degree (conjugateSubgroupEquiv K s k).1 = D.degree k.1 := by + rw [conjugateSubgroupEquiv_apply_coe, map_mul, map_mul, map_inv] + simp [mul_comm] + +/-- The normalized degree is invariant under the conjugation equivalence +of field subgroups. -/ +theorem finiteReciprocityNaturalityNormalizedDegree_conjugateSubgroupEquiv + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (s : G) + (k : K.field.toSubgroup) : + D.normalizedDegree (K.conjugate s : D.FiniteResidueAbstractField) + (conjugateSubgroupEquiv K.field s k) = + D.normalizedDegree K k := by + apply Multiplicative.ext + apply zHatMulNat_injective K.residueDegree.property + change (K.residueDegree : ℕ) • + (D.normalizedDegree (K.conjugate s : D.FiniteResidueAbstractField) + (conjugateSubgroupEquiv K.field s k)).toAdd = + (K.residueDegree : ℕ) • (D.normalizedDegree K k).toAdd + rw [D.residueDegree_nsmul_normalizedDegree K k] + rw [← K.residueDegree_conjugate s] + exact (D.residueDegree_nsmul_normalizedDegree + (K.conjugate s : D.FiniteResidueAbstractField) + (show (K.conjugate s).field.toSubgroup from + conjugateSubgroupEquiv K.field s k)).trans + (congrArg Multiplicative.toAdd + (D.finiteReciprocityNaturalityDegree_conjugateSubgroupEquiv K.field s k)) + +/-- Conjugation carries `I_L` inside `G_K` exactly to the corresponding +inertia subgroup for `L^s / K^s`. -/ +theorem finiteReciprocityNaturalityMap_extensionInertiaWithin_conjugate + (D : DegreeData G) [IsTopologicalGroup G] + (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) (s : G) : + (D.extensionInertiaWithin K L hLK).map + (conjugateSubgroupEquiv K s).toMonoidHom = + D.extensionInertiaWithin (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) := by + ext x + constructor + · rintro ⟨k, ⟨hkL, hkI⟩, rfl⟩ + constructor + · rw [← map_extensionSubgroup_conjugate K L hLK s] + exact ⟨k, hkL, rfl⟩ + · change conjugateSubgroupEquiv K s k ∈ + D.fieldInertiaWithin (conjugateClosedSubgroup K s) + rw [D.mem_fieldInertiaWithin_iff, + D.finiteReciprocityNaturalityDegree_conjugateSubgroupEquiv K s, + ← D.mem_fieldInertiaWithin_iff] + exact hkI + · intro hx + let k := (conjugateSubgroupEquiv K s).symm x + refine ⟨k, ?_, (conjugateSubgroupEquiv K s).apply_symm_apply x⟩ + constructor + · have hxL : x ∈ extensionSubgroup (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) := hx.1 + rw [← map_extensionSubgroup_conjugate K L hLK s] at hxL + rcases hxL with ⟨k', hk'L, hk'eq⟩ + have : k' = k := by + apply (conjugateSubgroupEquiv K s).injective + exact hk'eq.trans + ((conjugateSubgroupEquiv K s).apply_symm_apply x).symm + simpa [this] using hk'L + · change k ∈ D.fieldInertiaWithin K + rw [D.mem_fieldInertiaWithin_iff] + rw [← D.finiteReciprocityNaturalityDegree_conjugateSubgroupEquiv K s k] + rw [(conjugateSubgroupEquiv K s).apply_symm_apply x] + exact (D.mem_fieldInertiaWithin_iff _ _).mp hx.2 + +/-- Conjugation as a continuous multiplicative equivalence on the infinite +Frobenius quotients. -/ +noncomputable def finiteReciprocityNaturalityFrobeniusConjugationEquiv + (D : DegreeData G) [IsTopologicalGroup G] + (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) (s : G) + [hLnormal : (extensionSubgroup K L hLK).Normal] : + (K.toSubgroup ⧸ D.extensionInertiaWithin K L hLK) ≃ₜ* + ((conjugateClosedSubgroup K s).toSubgroup ⧸ + D.extensionInertiaWithin (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) := by + let e : (K.toSubgroup ⧸ D.extensionInertiaWithin K L hLK) ≃* + ((conjugateClosedSubgroup K s).toSubgroup ⧸ + D.extensionInertiaWithin (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) := + QuotientGroup.congr + (D.extensionInertiaWithin K L hLK) + (D.extensionInertiaWithin (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) + (conjugateSubgroupEquiv K s) + (D.finiteReciprocityNaturalityMap_extensionInertiaWithin_conjugate K L hLK s) + refine { e with + continuous_toFun := ?_ + continuous_invFun := ?_ } + · rw [← QuotientGroup.isOpenQuotientMap_mk.continuous_comp_iff] + change Continuous (fun k : K.toSubgroup => + QuotientGroup.mk (conjugateSubgroupEquiv K s k)) + apply QuotientGroup.continuous_mk.comp + change Continuous (fun k : K.toSubgroup => + (⟨s⁻¹ * k.1 * s, by + change s⁻¹ * k.1 * s ∈ conjugateClosedSubgroup K s + rw [conjugateClosedSubgroup_mem] + simp [mul_assoc]⟩ : + (conjugateClosedSubgroup K s).toSubgroup)) + exact ((continuous_const.mul continuous_subtype_val).mul + continuous_const).subtype_mk _ + · rw [← QuotientGroup.isOpenQuotientMap_mk.continuous_comp_iff] + change Continuous (fun x : (conjugateClosedSubgroup K s).toSubgroup => + QuotientGroup.mk ((conjugateSubgroupEquiv K s).symm x)) + apply QuotientGroup.continuous_mk.comp + change Continuous (fun x : (conjugateClosedSubgroup K s).toSubgroup => + (⟨s * x.1 * s⁻¹, + (conjugateClosedSubgroup_mem K s x.1).mp x.2⟩ : K.toSubgroup)) + exact ((continuous_const.mul continuous_subtype_val).mul + continuous_const).subtype_mk _ + +/-- The Frobenius conjugation equivalence has the expected value on quotient representatives. -/ +@[simp] +theorem finiteReciprocityNaturalityFrobeniusConjugationEquiv_mk + (D : DegreeData G) [IsTopologicalGroup G] + (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) (s : G) + [(extensionSubgroup K L hLK).Normal] + (k : K.toSubgroup) : + D.finiteReciprocityNaturalityFrobeniusConjugationEquiv K L hLK s + (QuotientGroup.mk k) = + QuotientGroup.mk (conjugateSubgroupEquiv K s k) := by + exact QuotientGroup.congr_mk + (D.extensionInertiaWithin K L hLK) + (D.extensionInertiaWithin (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) (conjugateClosedSubgroup_mono hLK s)) + (conjugateSubgroupEquiv K s) + (D.finiteReciprocityNaturalityMap_extensionInertiaWithin_conjugate K L hLK s) k + +/-- The normality transported by conjugation is exposed at the +residue-finite field boundary. Keeping this bridge as an instance prevents +clients from unfolding the bundled conjugate merely to recover the existing +normality instance for the literal conjugate subgroup. -/ +instance finiteReciprocityNaturalityFiniteResidueConjugate_normal + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) (s : G) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] : + (extensionSubgroup (K.conjugate s).field + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)).Normal := by + change + (extensionSubgroup (conjugateClosedSubgroup K.field s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)).Normal + infer_instance + +/-- The conjugation equivalence preserves normalized degree. -/ +theorem finiteReciprocityNaturalityFrobeniusConjugationEquiv_degree + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) (s : G) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (q : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) : + D.extensionNormalizedDegree + (K.conjugate s : D.FiniteResidueAbstractField) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + (D.finiteReciprocityNaturalityFrobeniusConjugationEquiv K.field L hLK s q) = + D.extensionNormalizedDegree K L hLK q := by + refine Quotient.inductionOn' q ?_ + intro k + change D.normalizedDegree (K.conjugate s) + (conjugateSubgroupEquiv K.field s k) = + D.normalizedDegree K k + exact D.finiteReciprocityNaturalityNormalizedDegree_conjugateSubgroupEquiv + K s k + +/-- Conjugation transports positive Frobenius lifts without changing their +exponent. -/ +def finiteReciprocityNaturalityFrobeniusConjugationLift + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) (s : G) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + D.FrobeniusElements (K.conjugate s : D.FiniteResidueAbstractField) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) := by + let n := D.frobeniusExponent K L hLK σ + refine ⟨D.finiteReciprocityNaturalityFrobeniusConjugationEquiv K.field L hLK s σ.1, + n, D.frobeniusExponent_pos K L hLK σ, ?_⟩ + rw [D.finiteReciprocityNaturalityFrobeniusConjugationEquiv_degree] + exact D.extensionNormalizedDegree_frobenius_eq_pow K L hLK σ + +/-- The Frobenius conjugation lift has the stated ambient coercion. -/ +@[simp] +theorem finiteReciprocityNaturalityFrobeniusConjugationLift_coe + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) (s : G) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + (D.finiteReciprocityNaturalityFrobeniusConjugationLift K L hLK s σ).1 = + D.finiteReciprocityNaturalityFrobeniusConjugationEquiv K.field L hLK s σ.1 := by + rfl + +/-- Restricting a conjugated Frobenius lift conjugates its finite Galois restriction. -/ +private theorem frobeniusRestriction_conjugationLift + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) (s : G) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + D.frobeniusRestriction (K.conjugate s) (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + (D.finiteReciprocityNaturalityFrobeniusConjugationLift K L hLK s σ) = + finiteReciprocityNaturalityConjugation K.field L hLK s + (D.frobeniusRestriction K L hLK σ) := by + change D.extensionRestriction (K.conjugate s).field (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + (D.finiteReciprocityNaturalityFrobeniusConjugationLift K L hLK s σ).1 = + finiteReciprocityNaturalityConjugation K.field L hLK s + (D.extensionRestriction K.field L hLK σ.1) + rw [D.finiteReciprocityNaturalityFrobeniusConjugationLift_coe] + refine Quotient.inductionOn' σ.1 ?_ + intro k + rfl + +/-- The Frobenius conjugation lift preserves the selected exponent. -/ +@[simp] +theorem finiteReciprocityNaturalityFrobeniusConjugationLift_exponent + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) (s : G) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + D.frobeniusExponent (K.conjugate s : D.FiniteResidueAbstractField) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + (D.finiteReciprocityNaturalityFrobeniusConjugationLift K L hLK s σ) = + D.frobeniusExponent K L hLK σ := by + apply proCIntegerOne_pow_nat_injective + calc + (Multiplicative.ofAdd (1 : ZHat)) ^ + D.frobeniusExponent + (K.conjugate s : D.FiniteResidueAbstractField) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + (D.finiteReciprocityNaturalityFrobeniusConjugationLift K L hLK s σ) = + D.extensionNormalizedDegree + (K.conjugate s : D.FiniteResidueAbstractField) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + (D.finiteReciprocityNaturalityFrobeniusConjugationLift K L hLK s σ).1 := + (D.extensionNormalizedDegree_frobenius_eq_pow + (K.conjugate s : D.FiniteResidueAbstractField) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + _).symm + _ = D.extensionNormalizedDegree K L hLK σ.1 := by + rw [D.finiteReciprocityNaturalityFrobeniusConjugationLift_coe, + D.finiteReciprocityNaturalityFrobeniusConjugationEquiv_degree] + _ = (Multiplicative.ofAdd (1 : ZHat)) ^ + D.frobeniusExponent K L hLK σ := + D.extensionNormalizedDegree_frobenius_eq_pow K L hLK σ + +section ConjugateFrobeniusQuotients + +/-- Conjugation preserves normality of the inertia subgroup in the relative Galois group. -/ +theorem finiteReciprocityNaturalityConjugateInertia_normal + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) (s : G) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] : + (D.extensionInertiaWithin (K.conjugate s).field + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)).Normal := + D.extensionInertiaWithin_normal + (K.conjugate s).field (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + (hLnormal := D.finiteReciprocityNaturalityFiniteResidueConjugate_normal + K L hLK s (hLnormal := hLnormal)) + +attribute [local instance] finiteReciprocityNaturalityConjugateInertia_normal + + +/-- The continuous conjugation equivalence identifies the two closed cyclic +subgroups generated by corresponding Frobenius lifts. -/ +theorem finiteReciprocityNaturalityFrobeniusConjugationEquiv_mem_closure_iff + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) (s : G) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) + (q : K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) : + q ∈ (D.frobeniusClosure K L hLK σ).toSubgroup ↔ + D.finiteReciprocityNaturalityFrobeniusConjugationEquiv K.field L hLK s q ∈ + (D.frobeniusClosure + (K.conjugate s : D.FiniteResidueAbstractField) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + (D.finiteReciprocityNaturalityFrobeniusConjugationLift + K L hLK s σ)).toSubgroup := by + let e := D.finiteReciprocityNaturalityFrobeniusConjugationEquiv K.field L hLK s + constructor + · intro hq + have hmap := map_mem_closedSubgroupGenerated_singleton + (ContinuousMonoidHom.toContinuousMonoidHom e) σ.1 (by + simpa [DegreeData.frobeniusClosure] using hq) + unfold DegreeData.frobeniusClosure + unfold DegreeData.FiniteResidueAbstractField.conjugate + rw [D.finiteReciprocityNaturalityFrobeniusConjugationLift_coe] + simpa [e] using hmap + · intro hq + have hq' : e q ∈ closedSubgroupGenerated {e σ.1} := by + unfold DegreeData.frobeniusClosure at hq + unfold DegreeData.FiniteResidueAbstractField.conjugate at hq + rw [D.finiteReciprocityNaturalityFrobeniusConjugationLift_coe] at hq + change e q ∈ (closedSubgroupGenerated {e σ.1}).toSubgroup + simpa [e] using hq + have hmap := map_mem_closedSubgroupGenerated_singleton + (ContinuousMonoidHom.toContinuousMonoidHom e.symm) + (D.finiteReciprocityNaturalityFrobeniusConjugationLift K L hLK s σ).1 + (by + rw [D.finiteReciprocityNaturalityFrobeniusConjugationLift_coe] + exact hq') + simpa [DegreeData.frobeniusClosure, + D.finiteReciprocityNaturalityFrobeniusConjugationLift_coe, e] using hmap + +/-- Conjugation of a Frobenius lift commutes with restriction to the finite +Galois quotient. -/ +theorem finiteReciprocityNaturalityConjugation_frobeniusRestriction + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) (s : G) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + finiteReciprocityNaturalityConjugation K.field L hLK s + (D.frobeniusRestriction K L hLK σ) = + D.frobeniusRestriction + (K.conjugate s : D.FiniteResidueAbstractField) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + (D.finiteReciprocityNaturalityFrobeniusConjugationLift K L hLK s σ) := by + change finiteReciprocityNaturalityConjugation K.field L hLK s + (D.extensionRestriction K.field L hLK σ.1) = + D.extensionRestriction + (K.conjugate s : D.FiniteResidueAbstractField).field + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + (D.finiteReciprocityNaturalityFrobeniusConjugationLift K L hLK s σ).1 + rw [D.finiteReciprocityNaturalityFrobeniusConjugationLift_coe] + refine Quotient.inductionOn' σ.1 ?_ + intro k + rfl + +/-- The fixed field of the conjugated Frobenius lift is the conjugate of +the original fixed field. -/ +theorem finiteReciprocityNaturalityFrobeniusFixedField_conjugate + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) (s : G) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + (σ : D.FrobeniusElements K L hLK) : + conjugateClosedSubgroup (D.frobeniusFixedField K L hLK σ) s = + D.frobeniusFixedField + (K.conjugate s : D.FiniteResidueAbstractField) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + (D.finiteReciprocityNaturalityFrobeniusConjugationLift K L hLK s σ) := by + ext g + change (g ∈ conjugateClosedSubgroup + (D.frobeniusFixedField K L hLK σ) s) ↔ + g ∈ D.frobeniusFixedField + (K.conjugate s : D.FiniteResidueAbstractField) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + (D.finiteReciprocityNaturalityFrobeniusConjugationLift K L hLK s σ) + rw [conjugateClosedSubgroup_mem] + constructor + · rintro ⟨k, hk, hkg⟩ + let ks : (K.conjugate s : D.FiniteResidueAbstractField).field.toSubgroup := + conjugateSubgroupEquiv K.field s k + have hksg : ks.1 = g := by + dsimp [ks] + change (k : G) = s * g * s⁻¹ at hkg + rw [hkg] + simp [mul_assoc] + have hkClosure : QuotientGroup.mk k ∈ + (D.frobeniusClosure K L hLK σ).toSubgroup := + (D.mem_frobeniusFixedSubgroupWithin_iff K L hLK σ k).1 hk + have hksClosure : QuotientGroup.mk ks ∈ + (D.frobeniusClosure + (K.conjugate s : D.FiniteResidueAbstractField) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + (D.finiteReciprocityNaturalityFrobeniusConjugationLift + K L hLK s σ)).toSubgroup := by + have hmap := + (D.finiteReciprocityNaturalityFrobeniusConjugationEquiv_mem_closure_iff + K L hLK s σ (QuotientGroup.mk k)).1 hkClosure + have hmk : + D.finiteReciprocityNaturalityFrobeniusConjugationEquiv + K.field L hLK s (QuotientGroup.mk k) = + QuotientGroup.mk ks := by + apply QuotientGroup.eq_iff_div_mem.mpr + simp [ks] + rw [hmk] at hmap + exact hmap + refine ⟨ks, ?_, hksg⟩ + exact (D.mem_frobeniusFixedSubgroupWithin_iff + (K.conjugate s : D.FiniteResidueAbstractField) + (conjugateClosedSubgroup L s) (conjugateClosedSubgroup_mono hLK s) + (D.finiteReciprocityNaturalityFrobeniusConjugationLift + K L hLK s σ) ks).2 hksClosure + · rintro ⟨ks, hks, hksg⟩ + let k : K.field.toSubgroup := + (conjugateSubgroupEquiv K.field s).symm ks + have hkValue : k.1 = s * g * s⁻¹ := by + dsimp [k] + change (ks : G) = g at hksg + change s * (ks : G) * s⁻¹ = s * g * s⁻¹ + rw [hksg] + have hksClosure : QuotientGroup.mk ks ∈ + (D.frobeniusClosure + (K.conjugate s : D.FiniteResidueAbstractField) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + (D.finiteReciprocityNaturalityFrobeniusConjugationLift + K L hLK s σ)).toSubgroup := + (D.mem_frobeniusFixedSubgroupWithin_iff + (K.conjugate s : D.FiniteResidueAbstractField) + (conjugateClosedSubgroup L s) (conjugateClosedSubgroup_mono hLK s) + (D.finiteReciprocityNaturalityFrobeniusConjugationLift + K L hLK s σ) ks).1 hks + have hkClosure : QuotientGroup.mk k ∈ + (D.frobeniusClosure K L hLK σ).toSubgroup := by + apply (D.finiteReciprocityNaturalityFrobeniusConjugationEquiv_mem_closure_iff + K L hLK s σ (QuotientGroup.mk k)).2 + have hmk : + D.finiteReciprocityNaturalityFrobeniusConjugationEquiv + K.field L hLK s (QuotientGroup.mk k) = + QuotientGroup.mk ks := by + exact congrArg + (QuotientGroup.mk' (D.extensionInertiaWithin + (conjugateClosedSubgroup K.field s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s))) + ((conjugateSubgroupEquiv K.field s).apply_symm_apply ks) + rw [hmk] + exact hksClosure + refine ⟨k, ?_, hkValue⟩ + exact (D.mem_frobeniusFixedSubgroupWithin_iff K L hLK σ k).2 hkClosure + +end ConjugateFrobeniusQuotients + +end DegreeData + +end GroupOnly + +section Representation + +/-! Mathlib's `Rep ℤ G` forces its representation-bearing group `G` to `Type 0`. -/ +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- Normality of a conjugated finite abstract field is available without +unfolding the finite-field bundle. -/ +instance finiteReciprocityNaturalityFiniteAbstractConjugate_normal + [IsTopologicalGroup G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) (s : G) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] : + (extensionSubgroup (K.conjugate s).field + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)).Normal := by + change + (extensionSubgroup (conjugateClosedSubgroup K.field s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)).Normal + infer_instance + +private theorem finiteReciprocityNaturality_isPrimeElement_transport + (D : DegreeData G) {A : Rep ℤ G} (v : ValuationData D A) + (S T : FiniteAbstractField G) (hST : S.field = T.field) + (π : ambientFixedAddSubgroup A S.field) (hπ : v.IsPrimeElement S π) : + v.IsPrimeElement T (hST ▸ π) := by + cases S + cases T + cases hST + simpa only using hπ + +private theorem finiteReciprocityNaturality_relativeNorm_right_transport + (A : Rep ℤ G) (K S T : ClosedSubgroup G) (hST : S = T) + (hSK : S.toSubgroup ≤ K.toSubgroup) + (hTK : T.toSubgroup ≤ K.toSubgroup) + [hKSfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K S hSK)] + [hKTfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K T hTK)] + (π : ambientFixedAddSubgroup A S) : + relativeNorm A K S hSK π = + relativeNorm A K T hTK (hST ▸ π) := by + subst T + rfl + +section ConjugateFiniteNormQuotient + +/-- The additive zero structure on the conjugate finite norm quotient. -/ +@[instance_reducible] +def finiteReciprocityNaturalityConjugateNormAddZero + (A : Rep ℤ G) [IsTopologicalGroup G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) (s : G) + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] := + letI : Finite + ((K.conjugate s).field.toSubgroup ⧸ + extensionSubgroup (K.conjugate s).field (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) := + finite_conjugateExtension K.field L hLK s (hLfinite := hLfinite) + show AddZero (FiniteNormQuotient A (K.conjugate s).field + (conjugateClosedSubgroup L s) (conjugateClosedSubgroup_mono hLK s)) from + (finiteNormQuotientAddCommGroup A (K.conjugate s).field + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)).toAddZeroClass.toAddZero + +attribute [local instance] finiteReciprocityNaturalityConjugateNormAddZero + + +/-- **norm--conjugation naturality, second diagram.** Conjugation of finite Galois +groups corresponds under the finite reciprocity equivalence to conjugation of finite norm +classes. -/ +theorem finiteReciprocityNaturality_conjugation_commutes + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) (s : G) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] : + let Ks : FiniteAbstractField G := K.conjugate s + let Ls := conjugateClosedSubgroup L s + let hLsKs := conjugateClosedSubgroup_mono hLK s + letI : Finite + (Ks.field.toSubgroup ⧸ extensionSubgroup Ks.field Ls hLsKs) := + finite_conjugateExtension K.field L hLK s + (finiteReciprocityNaturalityConjugationNormMap A K.field L hLK s).comp + (D.finiteReciprocityHom A v hAxiom K L hLK) = + (D.finiteReciprocityHom A v hAxiom Ks Ls hLsKs).comp + (finiteReciprocityNaturalityConjugation K.field L hLK s).toMonoidHom.toAdditive := by + dsimp only + let hLsfinite : Finite + ((conjugateClosedSubgroup K.field s).toSubgroup ⧸ + extensionSubgroup (conjugateClosedSubgroup K.field s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) := + finite_conjugateExtension K.field L hLK s + let KR : D.FiniteResidueAbstractField := + K.toFiniteResidueAbstractField D + let Ks : FiniteAbstractField G := K.conjugate s + let KRs : D.FiniteResidueAbstractField := + Ks.toFiniteResidueAbstractField D + let hLsfiniteKs : Finite + (Ks.field.toSubgroup ⧸ + extensionSubgroup Ks.field (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) := by + change Finite + ((conjugateClosedSubgroup K.field s).toSubgroup ⧸ + extensionSubgroup (conjugateClosedSubgroup K.field s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) + exact hLsfinite + let hLsfiniteKRs : Finite + (KRs.field.toSubgroup ⧸ + extensionSubgroup KRs.field (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) := by + simpa only [KRs, FiniteAbstractField.toFiniteResidueAbstractField] using + hLsfiniteKs + let hLnormalKR : (extensionSubgroup KR.field L hLK).Normal := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using + hLnormal + let hLsnormalKs : + (extensionSubgroup Ks.field (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)).Normal := by + change + (extensionSubgroup (conjugateClosedSubgroup K.field s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)).Normal + infer_instance + let hLsnormalKRs : + (extensionSubgroup KRs.field (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)).Normal := by + simpa only [KRs, FiniteAbstractField.toFiniteResidueAbstractField] using + hLsnormalKs + apply AddMonoidHom.ext + intro q + let σ := D.chosenFiniteReciprocityFrobeniusLift KR L hLK q.toMul + let σs : D.FrobeniusElements KRs + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) := + D.finiteReciprocityNaturalityFrobeniusConjugationLift KR L hLK s σ + have hσ : D.frobeniusRestriction KR L hLK σ = q.toMul := + D.frobeniusRestriction_chosenFiniteReciprocityFrobeniusLift + KR L hLK q.toMul + have hσs : D.frobeniusRestriction KRs + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) σs = + ((finiteReciprocityNaturalityConjugation + K.field L hLK s).toMonoidHom.toAdditive q).toMul := by + change D.frobeniusRestriction KRs + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) σs = + finiteReciprocityNaturalityConjugation K.field L hLK s q.toMul + rw [← hσ] + exact D.frobeniusRestriction_conjugationLift KR L hLK s σ + let S := D.frobeniusFixedField KR L hLK σ + let Ss := D.frobeniusFixedField KRs + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) σs + let hSK := D.frobeniusFixedField_le KR L hLK σ + let hSsKs := D.frobeniusFixedField_le KRs + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) σs + have hConjS : conjugateClosedSubgroup S s = Ss := by + exact D.finiteReciprocityNaturalityFrobeniusFixedField_conjugate + KR L hLK s σ + let hSKfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S hSK) := + D.frobeniusFixedField_finite KR L hLK σ + let hConjSKfinite : Finite + (Ks.field.toSubgroup ⧸ + extensionSubgroup Ks.field + (conjugateClosedSubgroup S s) + (conjugateClosedSubgroup_mono hSK s)) := + by + change Finite + ((conjugateClosedSubgroup K.field s).toSubgroup ⧸ + extensionSubgroup (conjugateClosedSubgroup K.field s) + (conjugateClosedSubgroup S s) + (conjugateClosedSubgroup_mono hSK s)) + exact finite_conjugateExtension K.field S hSK s + let hSsKsfinite : Finite + (Ks.field.toSubgroup ⧸ extensionSubgroup Ks.field Ss hSsKs) := + D.frobeniusFixedField_finite KRs + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) σs + let Sfinite : FiniteAbstractField G := + { field := S + finite := D.frobeniusFixedField_absoluteFinite K L hLK σ } + let Ssfinite : FiniteAbstractField G := + { field := Ss + finite := D.frobeniusFixedField_absoluteFinite Ks + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) σs } + let π : ambientFixedAddSubgroup A S := v.chosenPrimeElement Sfinite + have hπ : v.IsPrimeElement Sfinite π := v.chosenPrimeElement_isPrime Sfinite + let πs0 : ambientFixedAddSubgroup A (conjugateClosedSubgroup S s) := + conjugateFixedElement A S s π + have hπs0 : v.IsPrimeElement (Sfinite.conjugate s) πs0 := by + change v.valuationAt (Sfinite.conjugate s) πs0 = v.oneValue + rw [show v.valuationAt (Sfinite.conjugate s) πs0 = + v.valuationAt Sfinite π by + simpa [Sfinite, πs0] using + v.normalizedValuation_conjugate Sfinite s π] + exact hπ + let πs : ambientFixedAddSubgroup A Ss := hConjS ▸ πs0 + have hπs : v.IsPrimeElement Ssfinite πs := by + have htransport := + D.finiteReciprocityNaturality_isPrimeElement_transport v + (Sfinite.conjugate s) Ssfinite (by exact hConjS) πs0 hπs0 + unfold πs + exact htransport + change finiteReciprocityNaturalityConjugationNormMap A K.field L hLK s + (D.finiteReciprocityHom A v hAxiom K L hLK q) = + D.finiteReciprocityHom A v hAxiom Ks + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + ((finiteReciprocityNaturalityConjugation + K.field L hLK s).toMonoidHom.toAdditive q) + have hprimeNorm : + finiteReciprocityNaturalityConjugationNormMap A K.field L hLK s + (D.finiteReciprocityHom A v hAxiom K L hLK q) = + finiteReciprocityNaturalityConjugationNormMap A K.field L hLK s + (finiteNormClass A K.field L hLK + (relativeNorm A K.field S hSK π)) := by + rw [D.finiteReciprocityHom_apply_eq_primeNormClass + A v hAxiom K L hLK q σ hσ π hπ] + have hconjugateNorm : + finiteReciprocityNaturalityConjugationNormMap A K.field L hLK s + (finiteNormClass A K.field L hLK + (relativeNorm A K.field S hSK π)) = + finiteNormClass A Ks.field + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + (relativeNorm A Ks.field + (conjugateClosedSubgroup S s) + (conjugateClosedSubgroup_mono hSK s) πs0) := by + exact finiteReciprocityNaturality_conjugation_norm_class + A K.field L S hLK hSK s π + have htransportNorm : + finiteNormClass A Ks.field + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + (relativeNorm A Ks.field + (conjugateClosedSubgroup S s) + (conjugateClosedSubgroup_mono hSK s) πs0) = + finiteNormClass A Ks.field + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + (relativeNorm A Ks.field Ss hSsKs πs) := by + apply congrArg (finiteNormClass A Ks.field + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) + have htransport := + finiteReciprocityNaturality_relativeNorm_right_transport A + Ks.field (conjugateClosedSubgroup S s) Ss + hConjS (conjugateClosedSubgroup_mono hSK s) hSsKs πs0 + simpa [πs] using htransport + have hconjugatePrimeNorm : + finiteNormClass A Ks.field + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + (relativeNorm A Ks.field Ss hSsKs πs) = + D.finiteReciprocityHom A v hAxiom Ks + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + ((finiteReciprocityNaturalityConjugation + K.field L hLK s).toMonoidHom.toAdditive q) := by + rw [D.finiteReciprocityHom_apply_eq_primeNormClass + A v hAxiom Ks + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + _ σs hσs πs hπs] + exact hprimeNorm.trans (hconjugateNorm.trans (htransportNorm.trans hconjugatePrimeNorm)) + +end ConjugateFiniteNormQuotient + +end DegreeData + +end Representation + +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean new file mode 100644 index 0000000000..a8f3d688e3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean @@ -0,0 +1,1264 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferNaturality +/-! +Constructs the transfer map for intermediate Galois quotients and relates it to Frobenius +restriction and norm naturality. +-/ + +@[expose] public section + +universe u + +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +noncomputable +section + +open CategoryTheory +open scoped BigOperators +open MulAction + +section GroupOnly + +variable {G : Type u} [Group G] [TopologicalSpace G] + + +/-- The inclusion `G(L/K') → G(L/K)` induced by `K' ⊆ K`. -/ +def transferNormNaturalityIntermediateInclusion + (K K' L : ClosedSubgroup G) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L (hLK'.trans hK'K)).Normal] + [hL'normal : (extensionSubgroup K' L hLK').Normal] : + (K'.toSubgroup ⧸ extensionSubgroup K' L hLK') →* + (K.toSubgroup ⧸ extensionSubgroup K L (hLK'.trans hK'K)) := + finiteReciprocityNaturalityRestriction K K' L L (hLK'.trans hK'K) hLK' + hK'K le_rfl + +/-- +Establishes the identity `transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K +(QuotientGroup.mk k') = QuotientGroup.mk (Subgroup.inclusion hK'K k')`. +-/ +@[simp] +theorem transferNormNaturalityIntermediateInclusion_mk + (K K' L : ClosedSubgroup G) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L (hLK'.trans hK'K)).Normal] + [hL'normal : (extensionSubgroup K' L hLK').Normal] + (k' : K'.toSubgroup) : + transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K + (QuotientGroup.mk k') = + QuotientGroup.mk (Subgroup.inclusion hK'K k') := + rfl + +/-- The inclusion of finite Galois groups attached to an intermediate field +is injective. -/ +theorem transferNormNaturalityIntermediateInclusion_injective + (K K' L : ClosedSubgroup G) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L (hLK'.trans hK'K)).Normal] + [hL'normal : (extensionSubgroup K' L hLK').Normal] : + Function.Injective + (transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K) := by + intro x y + refine QuotientGroup.induction_on x ?_ + intro k' + refine QuotientGroup.induction_on y ?_ + intro l' h + apply QuotientGroup.eq.mpr + apply (mem_extensionSubgroup_iff K' L hLK' (k'⁻¹ * l')).2 + have hmem : + (Subgroup.inclusion hK'K k')⁻¹ * + Subgroup.inclusion hK'K l' ∈ + extensionSubgroup K L (hLK'.trans hK'K) := + QuotientGroup.eq.mp h + have hG := (mem_extensionSubgroup_iff K L (hLK'.trans hK'K) + ((Subgroup.inclusion hK'K k')⁻¹ * + Subgroup.inclusion hK'K l')).1 hmem + simpa using hG + +/-- The copy of `G(L/K')` inside `G(L/K)`. -/ +def transferNormNaturalityIntermediateSubgroup + (K K' L : ClosedSubgroup G) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L (hLK'.trans hK'K)).Normal] + [hL'normal : (extensionSubgroup K' L hLK').Normal] : + Subgroup (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K)) := + (transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K).range + +/-- The canonical identification of `G(L/K')` with its image in +`G(L/K)`. -/ +noncomputable def transferNormNaturalityIntermediateQuotientEquiv + (K K' L : ClosedSubgroup G) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L (hLK'.trans hK'K)).Normal] + [hL'normal : (extensionSubgroup K' L hLK').Normal] : + (K'.toSubgroup ⧸ extensionSubgroup K' L hLK') ≃* + transferNormNaturalityIntermediateSubgroup K K' L hLK' hK'K := + MulEquiv.ofBijective + (transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K).rangeRestrict + ⟨fun _ _ h => + transferNormNaturalityIntermediateInclusion_injective K K' L hLK' hK'K + (congrArg Subtype.val h), + MonoidHom.rangeRestrict_surjective _⟩ + +/-- +Establishes the identity `(transferNormNaturalityIntermediateQuotientEquiv K K' L hLK' hK'K +(QuotientGroup.mk k')).1 = QuotientGroup.mk (Subgroup.inclusion hK'K k')`. +-/ +@[simp] +theorem transferNormNaturalityIntermediateQuotientEquiv_mk + (K K' L : ClosedSubgroup G) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L (hLK'.trans hK'K)).Normal] + [hL'normal : (extensionSubgroup K' L hLK').Normal] + (k' : K'.toSubgroup) : + (transferNormNaturalityIntermediateQuotientEquiv K K' L hLK' hK'K + (QuotientGroup.mk k')).1 = + QuotientGroup.mk (Subgroup.inclusion hK'K k') := + rfl + +namespace DegreeData + +/-- Restriction sends the Frobenius-level intermediate subgroup exactly +onto the finite intermediate Galois subgroup. -/ +theorem transferNormNaturalityFrobeniusIntermediate_map_restriction + (D : DegreeData G) [IsTopologicalGroup G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] : + (D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL).map + (D.extensionRestriction E.base.field L (hL.trans E.below)) = + transferNormNaturalityIntermediateSubgroup + E.base.field E.field.field L hL E.below := by + have hcomm (x : E.field.field.toSubgroup ⧸ + D.extensionInertiaWithin E.field.field L hL) : + transferNormNaturalityIntermediateInclusion + E.base.field E.field.field L hL E.below + (D.extensionRestriction E.field.field L hL x) = + D.extensionRestriction E.base.field L (hL.trans E.below) + (D.finiteReciprocityNaturalityFrobeniusTowerMap + E.base.field E.field.field L L + (hL.trans E.below) hL E.below le_rfl x) := by + refine QuotientGroup.induction_on x ?_ + intro k' + rfl + ext q + constructor + · rintro ⟨h, hh, rfl⟩ + rcases hh with ⟨x, rfl⟩ + exact ⟨D.extensionRestriction E.field.field L hL x, hcomm x⟩ + · rintro ⟨x, rfl⟩ + refine QuotientGroup.induction_on x ?_ + intro k' + refine ⟨QuotientGroup.mk (Subgroup.inclusion E.below k'), ?_, rfl⟩ + exact ⟨QuotientGroup.mk k', rfl⟩ + +end DegreeData + +/-- The left vertical arrow in transfer--norm naturality. This is Mathlib's actual +transfer into the abelianization of the intermediate subgroup, transported +along the canonical identification with `G(L/K')`. -/ +noncomputable def transferNormNaturalityTransfer + (K K' L : ClosedSubgroup G) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L (hLK'.trans hK'K)).Normal] + [hL'normal : (extensionSubgroup K' L hLK').Normal] + [Finite (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))] : + Abelianization (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K)) →* + Abelianization (K'.toSubgroup ⧸ extensionSubgroup K' L hLK') := by + let H := transferNormNaturalityIntermediateSubgroup K K' L hLK' hK'K + letI : H.FiniteIndex := Subgroup.finiteIndex_of_finite + let e := transferNormNaturalityIntermediateQuotientEquiv K K' L hLK' hK'K + exact e.symm.abelianizationCongr.toMonoidHom.comp + (Abelianization.lift + (MonoidHom.transfer (Abelianization.of : H →* Abelianization H))) + +namespace DegreeData + +/-- Transfer commutes with restriction from the infinite Frobenius +quotients to the finite Galois quotients. This is the quotient-naturality +step in the proof of transfer--norm naturality. -/ +theorem transferNormNaturalityTransfer_restriction_natural + (D : DegreeData G) [IsTopologicalGroup G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + [hLfinite : Finite + (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field L (hL.trans E.below))] : + (transferNormNaturalityTransfer + E.base.field E.field.field L hL E.below).comp + (Abelianization.map + (D.extensionRestriction E.base.field L (hL.trans E.below))) = + (Abelianization.map + (D.extensionRestriction E.field.field L hL)).comp + (D.transferNormNaturalityFrobeniusTransfer E L hL) := by + let P := E.base.field.toSubgroup ⧸ + D.extensionInertiaWithin E.base.field L (hL.trans E.below) + let Q := E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field L (hL.trans E.below) + let f : P →* Q := + D.extensionRestriction E.base.field L (hL.trans E.below) + let H := D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL + let H₀ := transferNormNaturalityIntermediateSubgroup + E.base.field E.field.field L hL E.below + let e := D.transferNormNaturalityFrobeniusIntermediateEquiv + E L hL + let e₀ := transferNormNaturalityIntermediateQuotientEquiv + E.base.field E.field.field L hL E.below + let : H.FiniteIndex := + D.transferNormNaturalityFrobeniusIntermediateFiniteIndex E L hL + have hf : Function.Surjective f := + D.transferNormNaturalityExtensionRestriction_surjective + E.base.field L (hL.trans E.below) + have hker : f.ker ≤ H := + D.transferNormNaturalityExtensionRestriction_ker_le_intermediate + E L hL + have hmap : H.map f = H₀ := + D.transferNormNaturalityFrobeniusIntermediate_map_restriction + E L hL + let c : H.map f ≃* H₀ := MulEquiv.subgroupCongr hmap + have hnat := abelianization_transfer_natural_of_surjective + f hf H hker + dsimp only at hnat + have htransferCast : + c.abelianizationCongr.toMonoidHom.comp + (Abelianization.lift + (MonoidHom.transfer + (Abelianization.of : H.map f →* Abelianization (H.map f)))) = + Abelianization.lift + (MonoidHom.transfer + (Abelianization.of : H₀ →* Abelianization H₀)) := by + exact abelianization_transfer_congr_subgroup (H.map f) H₀ hmap + have hcomm (x : E.field.field.toSubgroup ⧸ + D.extensionInertiaWithin E.field.field L hL) : + transferNormNaturalityIntermediateInclusion + E.base.field E.field.field L hL E.below + (D.extensionRestriction E.field.field L hL x) = + f (D.finiteReciprocityNaturalityFrobeniusTowerMap + E.base.field E.field.field L L + (hL.trans E.below) hL E.below le_rfl x) := by + refine QuotientGroup.induction_on x ?_ + intro k' + rfl + have htransport : + (e₀.symm.abelianizationCongr.toMonoidHom.comp + c.abelianizationCongr.toMonoidHom).comp + (Abelianization.map (f.subgroupMap H)) = + (Abelianization.map + (D.extensionRestriction E.field.field L hL)).comp + e.symm.abelianizationCongr.toMonoidHom := by + apply Abelianization.hom_ext + apply MonoidHom.ext + intro h + simp only [MonoidHom.comp_apply, Abelianization.map_of] + apply congrArg Abelianization.of + obtain ⟨x, rfl⟩ := e.surjective h + have hex : e.symm.toMonoidHom (e x) = x := e.symm_apply_apply x + rw [hex] + apply e₀.injective + calc + e₀ (e₀.symm.toMonoidHom + (c.toMonoidHom ((f.subgroupMap H) (e x)))) = + c.toMonoidHom ((f.subgroupMap H) (e x)) := + e₀.apply_symm_apply _ + _ = e₀ (D.extensionRestriction E.field.field L hL x) := by + apply Subtype.ext + exact (hcomm x).symm + unfold transferNormNaturalityTransfer DegreeData.transferNormNaturalityFrobeniusTransfer + dsimp only + calc + (e₀.symm.abelianizationCongr.toMonoidHom.comp + (Abelianization.lift + (MonoidHom.transfer + (Abelianization.of : H₀ →* Abelianization H₀)))).comp + (Abelianization.map f) = + (e₀.symm.abelianizationCongr.toMonoidHom.comp + (c.abelianizationCongr.toMonoidHom.comp + (Abelianization.lift + (MonoidHom.transfer + (Abelianization.of : H.map f →* + Abelianization (H.map f)))))).comp + (Abelianization.map f) := by rw [htransferCast] + _ = (e₀.symm.abelianizationCongr.toMonoidHom.comp + c.abelianizationCongr.toMonoidHom).comp + ((Abelianization.map (f.subgroupMap H)).comp + (Abelianization.lift + (MonoidHom.transfer + (Abelianization.of : H →* Abelianization H)))) := by + rw [hnat] + simp only [MonoidHom.comp_assoc] + _ = ((Abelianization.map + (D.extensionRestriction E.field.field L hL)).comp + e.symm.abelianizationCongr.toMonoidHom).comp + (Abelianization.lift + (MonoidHom.transfer + (Abelianization.of : H →* Abelianization H))) := by + rw [← MonoidHom.comp_assoc, htransport] + _ = (Abelianization.map + (D.extensionRestriction E.field.field L hL)).comp + (e.symm.abelianizationCongr.toMonoidHom.comp + (Abelianization.lift + (MonoidHom.transfer + (Abelianization.of : H →* Abelianization H)))) := by + simp only [MonoidHom.comp_assoc] + +/-- For a positive Frobenius lift, finite transfer is the product of the +restrictions of the positive transfer factors. This is the first displayed +transfer identity in the proof of transfer--norm naturality. -/ +theorem transferNormNaturalityTransfer_frobenius_product + (D : DegreeData G) [IsTopologicalGroup G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + [Finite (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field L (hL.trans E.below))] + (σ : D.FrobeniusElements E.base L (hL.trans E.below)) : + let H := D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL + letI : H.FiniteIndex := + D.transferNormNaturalityFrobeniusIntermediateFiniteIndex + E L hL + let Ω := Quotient (orbitRel (Subgroup.zpowers σ.1) + ((E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ H)) + letI : Fintype Ω := Fintype.ofFinite _ + transferNormNaturalityTransfer E.base.field E.field.field L hL E.below + (Abelianization.of + (D.frobeniusRestriction E.base L (hL.trans E.below) σ)) = + ∏ q : Ω, Abelianization.of + (D.frobeniusRestriction E.field L hL + (D.transferNormNaturalityTransferFrobeniusLift + E L hL σ q)) := by + dsimp only + let H := D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL + let : H.FiniteIndex := + D.transferNormNaturalityFrobeniusIntermediateFiniteIndex + E L hL + let Ω := Quotient (orbitRel (Subgroup.zpowers σ.1) + ((E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ H)) + let : Fintype Ω := Fintype.ofFinite _ + have hnat := D.transferNormNaturalityTransfer_restriction_natural + E L hL + have hnatσ := DFunLike.congr_fun hnat (Abelianization.of σ.1) + have hprod := D.transferNormNaturalityFrobeniusTransfer_doubleCoset_formula + E L hL σ.1 + calc + transferNormNaturalityTransfer E.base.field E.field.field L hL E.below + (Abelianization.of + (D.frobeniusRestriction E.base L (hL.trans E.below) σ)) = + Abelianization.map (D.extensionRestriction E.field.field L hL) + (D.transferNormNaturalityFrobeniusTransfer E L hL + (Abelianization.of σ.1)) := by + simpa only [MonoidHom.comp_apply, Abelianization.map_of, + DegreeData.frobeniusRestriction] using hnatσ + _ = Abelianization.map (D.extensionRestriction E.field.field L hL) + (∏ q : Ω, Abelianization.of + ((D.transferNormNaturalityFrobeniusIntermediateEquiv + E L hL).symm + ⟨q.out.out⁻¹ * σ.1 ^ Function.minimalPeriod (σ.1 • ·) q.out * + q.out.out, + QuotientGroup.out_conj_pow_minimalPeriod_mem + H σ.1 q.out⟩)) := by + rw [hprod] + _ = ∏ q : Ω, Abelianization.of + (D.frobeniusRestriction E.field L hL + (D.transferNormNaturalityTransferFrobeniusLift + E L hL σ q)) := by + rw [map_prod] + apply Finset.prod_congr rfl + intro q _ + rw [Abelianization.map_of] + rfl + +end DegreeData + +end GroupOnly + +section Representation + +/-! Mathlib's `Rep ℤ G` forces its representation-bearing group `G` to `Type 0`. -/ +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- The finite reciprocity equivalence factored through the maximal abelian quotient. This +is the horizontal reciprocity arrow in transfer--norm naturality. -/ +noncomputable def transferNormNaturalityAbelianizedReciprocity + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] : + Additive (Abelianization + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)) →+ + FiniteNormQuotient A K.field L hLK := + MonoidHom.toAdditiveLeft + (Abelianization.lift + (AddMonoidHom.toMultiplicativeRight + (D.finiteReciprocityHom A v hAxiom K L hLK))) + +/-- +Establishes the identity `D.transferNormNaturalityAbelianizedReciprocity A v hAxiom K L hLK +(Additive.ofMul (Abelianization.of q)) = D.finiteReciprocityHom A v hAxiom K L hLK (Additive.ofMul +q)`. +-/ +@[simp] +theorem transferNormNaturalityAbelianizedReciprocity_of + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (q : K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK) : + D.transferNormNaturalityAbelianizedReciprocity A v hAxiom K L hLK + (Additive.ofMul (Abelianization.of q)) = + D.finiteReciprocityHom A v hAxiom K L hLK (Additive.ofMul q) := by + exact Abelianization.lift_apply_of + (AddMonoidHom.toMultiplicativeRight + (D.finiteReciprocityHom A v hAxiom K L hLK)) q + +end DegreeData + +end Representation + +section GroupOnly + +variable {G : Type u} [Group G] [TopologicalSpace G] + +/-- The double-coset transfer formula for transfer--norm naturality. The indexing type is +`⟨σ⟩ \\ G(L/K) / G(L/K')`, represented by the orbit quotient of the action +of `zpowers σ` on the left-coset space. -/ +theorem transferNormNaturality_transfer_doubleCoset_formula + (K K' L : ClosedSubgroup G) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L (hLK'.trans hK'K)).Normal] + [Finite (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))] + (σ : K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K)) : + letI : (extensionSubgroup K' L hLK').Normal := + transferNormNaturality_intermediateExtension_normal K K' L hLK' hK'K + let H := transferNormNaturalityIntermediateSubgroup K K' L hLK' hK'K + letI : H.FiniteIndex := Subgroup.finiteIndex_of_finite + letI : Fintype (Quotient (orbitRel (Subgroup.zpowers σ) + ((K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K)) ⧸ H))) := + Fintype.ofFinite _ + transferNormNaturalityTransfer K K' L hLK' hK'K (Abelianization.of σ) = + ∏ q : Quotient (orbitRel (Subgroup.zpowers σ) + ((K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K)) ⧸ H)), + Abelianization.of + ((transferNormNaturalityIntermediateQuotientEquiv K K' L hLK' hK'K).symm + ⟨q.out.out⁻¹ * σ ^ Function.minimalPeriod (σ • ·) q.out * + q.out.out, + QuotientGroup.out_conj_pow_minimalPeriod_mem H σ q.out⟩) := by + let hL'normal : (extensionSubgroup K' L hLK').Normal := + transferNormNaturality_intermediateExtension_normal K K' L hLK' hK'K + dsimp only + let H := transferNormNaturalityIntermediateSubgroup K K' L hLK' hK'K + let : H.FiniteIndex := Subgroup.finiteIndex_of_finite + let := Fintype.ofFinite + (Quotient (orbitRel (Subgroup.zpowers σ) + ((K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K)) ⧸ H))) + rw [transferNormNaturalityTransfer] + simp only [MonoidHom.comp_apply, Abelianization.lift_apply_of] + rw [MonoidHom.transfer_eq_prod_quotient_orbitRel_zpowers_quot] + rw [map_prod] + apply Finset.prod_congr rfl + intro q _ + exact abelianizationCongr_of + (transferNormNaturalityIntermediateQuotientEquiv K K' L hLK' hK'K).symm _ + +end GroupOnly + +section Representation + +/-! Mathlib's `Rep ℤ G` forces its representation-bearing group `G` to `Type 0`. -/ +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +/-- The invariant carrier used by `extensionFixedRepresentation` is +canonically the ambient fixed subgroup `A_L`. -/ +def transferNormNaturalityExtensionFixedEquiv + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) : + (extensionFixedRepresentation A K L hLK hnormal).V ≃+ + ambientFixedAddSubgroup A L where + toFun a := ⟨a.1, by + intro l + let s : extensionSubgroup K L hLK := + ⟨Subgroup.inclusion hLK l, l.2⟩ + exact a.2 s⟩ + invFun a := ⟨a.1, by + rintro ⟨k, hk⟩ + exact a.2 ⟨k.1, hk⟩⟩ + left_inv _ := by rfl + right_inv _ := by rfl + map_add' _ _ := rfl + +/-- +Establishes the identity `((transferNormNaturalityExtensionFixedEquiv A K L hLK hnormal a : +ambientFixedAddSubgroup A L) : A.V) = a.1`. +-/ +@[simp] +theorem transferNormNaturalityExtensionFixedEquiv_apply_coe + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (a : (extensionFixedRepresentation A K L hLK hnormal).V) : + ((transferNormNaturalityExtensionFixedEquiv A K L hLK hnormal a : + ambientFixedAddSubgroup A L) : A.V) = a.1 := + rfl + +/-- +Establishes the identity `((transferNormNaturalityExtensionFixedEquiv A K L hLK hnormal).symm a).1 += a.1`. +-/ +@[simp] +theorem transferNormNaturalityExtensionFixedEquiv_symm_coe + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (a : ambientFixedAddSubgroup A L) : + ((transferNormNaturalityExtensionFixedEquiv A K L hLK hnormal).symm a).1 = + a.1 := + rfl + +end Representation + +section GroupOnly + +variable {G : Type u} [Group G] [TopologicalSpace G] + +/-- A fixed choice of right-coset representatives for the intermediate +subgroup in `G(L/K)`. -/ +noncomputable def chosenTransferNormNaturalityRightTransversal + (K K' L : ClosedSubgroup G) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L (hLK'.trans hK'K)).Normal] + [hL'normal : (extensionSubgroup K' L hLK').Normal] : + (transferNormNaturalityIntermediateSubgroup K K' L hLK' hK'K).RightTransversal := + ⟨Set.range Quotient.out, Subgroup.isComplement_range_right Quotient.out_eq'⟩ + +/-- Multiplication gives the right-coset decomposition +`G(L/K') × T ≃ G(L/K)` used. -/ +private noncomputable def transferNormNaturalityRightCosetProductEquiv + (K K' L : ClosedSubgroup G) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L (hLK'.trans hK'K)).Normal] + [hL'normal : (extensionSubgroup K' L hLK').Normal] : + (K'.toSubgroup ⧸ extensionSubgroup K' L hLK') × + (chosenTransferNormNaturalityRightTransversal K K' L hLK' hK'K : + Set (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))) ≃ + (K.toSubgroup ⧸ extensionSubgroup K L (hLK'.trans hK'K)) := + (Equiv.prodCongr + (transferNormNaturalityIntermediateQuotientEquiv K K' L hLK' hK'K).toEquiv + (Equiv.refl _)).trans + (chosenTransferNormNaturalityRightTransversal K K' L hLK' hK'K).2.equiv.symm + +@[simp] +private theorem transferNormNaturalityRightCosetProductEquiv_apply + (K K' L : ClosedSubgroup G) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L (hLK'.trans hK'K)).Normal] + [hL'normal : (extensionSubgroup K' L hLK').Normal] + (r : K'.toSubgroup ⧸ extensionSubgroup K' L hLK') + (t : (chosenTransferNormNaturalityRightTransversal K K' L hLK' hK'K : + Set (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K)))) : + transferNormNaturalityRightCosetProductEquiv K K' L hLK' hK'K (r, t) = + transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K r * t.1 := + rfl + +end GroupOnly + +section Representation + +/-! Mathlib's `Rep ℤ G` forces its representation-bearing group `G` to `Type 0`. -/ +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +/-- The quotient action on the invariant carrier agrees with the relative +coset action used to define the norm. -/ +private theorem transferNormNaturality_relativeCosetAction_eq_extensionAction + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (a : (extensionFixedRepresentation A K L hLK hnormal).V) + (q : K.toSubgroup ⧸ extensionSubgroup K L hLK) : + relativeCosetAction A K L hLK + (transferNormNaturalityExtensionFixedEquiv A K L hLK hnormal a) q = + ((extensionFixedRepresentation A K L hLK hnormal).ρ q a).1 := by + let := hnormal + refine QuotientGroup.induction_on q ?_ + intro k + rw [relativeCosetAction_mk] + change A.ρ k.1 a.1 = + ((extensionFixedRepresentation A K L hLK hnormal).ρ + (QuotientGroup.mk k) a).1 + exact (extensionFixedRepresentation_quotient_mk_apply_val + A K L hLK a k).symm + +/-- Restricting the quotient action to `G(L/K')` agrees with the relative +coset action for `L | K'`. -/ +private theorem transferNormNaturality_relativeCosetAction_intermediate + (A : Rep ℤ G) (K K' L : ClosedSubgroup G) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L (hLK'.trans hK'K)).Normal] + [hL'normal : (extensionSubgroup K' L hLK').Normal] + (a : (extensionFixedRepresentation A K L + (hLK'.trans hK'K) hLnormal).V) + (r : K'.toSubgroup ⧸ extensionSubgroup K' L hLK') : + relativeCosetAction A K' L hLK' + (transferNormNaturalityExtensionFixedEquiv A K L + (hLK'.trans hK'K) hLnormal a) r = + ((extensionFixedRepresentation A K L + (hLK'.trans hK'K) hLnormal).ρ + (transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K r) a).1 := by + refine QuotientGroup.induction_on r ?_ + intro k' + rw [relativeCosetAction_mk, transferNormNaturalityIntermediateInclusion_mk] + change A.ρ k'.1 a.1 = + ((extensionFixedRepresentation A K L (hLK'.trans hK'K) hLnormal).ρ + (QuotientGroup.mk (Subgroup.inclusion hK'K k')) a).1 + exact (extensionFixedRepresentation_quotient_mk_apply_val + A K L (hLK'.trans hK'K) a (Subgroup.inclusion hK'K k')).symm + +/-- The element of `A_L` obtained by summing the conjugates indexed by a +right transversal for `G(L/K')` in `G(L/K)`. Its `L | K'` norm is the +`L | K` norm of the original element. -/ +noncomputable def transferNormNaturalityNormWitness + (A : Rep ℤ G) (K K' L : ClosedSubgroup G) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L (hLK'.trans hK'K)).Normal] + [hL'normal : (extensionSubgroup K' L hLK').Normal] + [Finite (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))] + (a : ambientFixedAddSubgroup A L) : + ambientFixedAddSubgroup A L := by + let H := transferNormNaturalityIntermediateSubgroup K K' L hLK' hK'K + let T := chosenTransferNormNaturalityRightTransversal K K' L hLK' hK'K + letI : H.FiniteIndex := Subgroup.finiteIndex_of_finite + letI : Fintype (T : Set (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))) := + T.2.finite_right.fintype + let E := extensionFixedRepresentation A K L + (hLK'.trans hK'K) hLnormal + let eA := transferNormNaturalityExtensionFixedEquiv A K L + (hLK'.trans hK'K) hLnormal + exact eA (∑ t : (T : Set _), E.ρ t.1 (eA.symm a)) + +private theorem transferNormNaturality_extensionAction_product + (A : Rep ℤ G) (K K' L : ClosedSubgroup G) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L (hLK'.trans hK'K)).Normal] + [hL'normal : (extensionSubgroup K' L hLK').Normal] + (a : (extensionFixedRepresentation A K L + (hLK'.trans hK'K) hLnormal).V) + (r : K'.toSubgroup ⧸ extensionSubgroup K' L hLK') + (t : (chosenTransferNormNaturalityRightTransversal K K' L hLK' hK'K : + Set (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K)))) : + (extensionFixedRepresentation A K L + (hLK'.trans hK'K) hLnormal).ρ + (transferNormNaturalityRightCosetProductEquiv K K' L hLK' hK'K (r, t)) a = + (extensionFixedRepresentation A K L + (hLK'.trans hK'K) hLnormal).ρ + (transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K r) + ((extensionFixedRepresentation A K L + (hLK'.trans hK'K) hLnormal).ρ t.1 a) := by + rw [transferNormNaturalityRightCosetProductEquiv_apply, map_mul] + rfl + +/-- The norm identity underlying the right vertical arrow of transfer--norm naturality. It is +the additive form of the product calculation. -/ +theorem transferNormNaturality_norm_doubleCoset_formula + (A : Rep ℤ G) (K K' L : ClosedSubgroup G) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L (hLK'.trans hK'K)).Normal] + [Finite (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))] + (a : ambientFixedAddSubgroup A L) : + letI : (extensionSubgroup K' L hLK').Normal := + transferNormNaturality_intermediateExtension_normal K K' L hLK' hK'K + letI : Finite (K'.toSubgroup ⧸ extensionSubgroup K' L hLK') := + Finite.of_injective + (transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K) + (transferNormNaturalityIntermediateInclusion_injective + K K' L hLK' hK'K) + fixedFieldInclusion A K K' hK'K + (relativeNorm A K L (hLK'.trans hK'K) a) = + relativeNorm A K' L hLK' + (transferNormNaturalityNormWitness A K K' L hLK' hK'K a) := by + let hL'normal : (extensionSubgroup K' L hLK').Normal := + transferNormNaturality_intermediateExtension_normal K K' L hLK' hK'K + let hL'finite : Finite + (K'.toSubgroup ⧸ extensionSubgroup K' L hLK') := + Finite.of_injective + (transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K) + (transferNormNaturalityIntermediateInclusion_injective + K K' L hLK' hK'K) + let : Fintype (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K)) := Fintype.ofFinite _ + let : Fintype (K'.toSubgroup ⧸ + extensionSubgroup K' L hLK') := Fintype.ofFinite _ + let H := transferNormNaturalityIntermediateSubgroup K K' L hLK' hK'K + let T := chosenTransferNormNaturalityRightTransversal K K' L hLK' hK'K + let : H.FiniteIndex := Subgroup.finiteIndex_of_finite + let : Fintype (T : Set (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))) := + T.2.finite_right.fintype + let E := extensionFixedRepresentation A K L + (hLK'.trans hK'K) hLnormal + let eA := transferNormNaturalityExtensionFixedEquiv A K L + (hLK'.trans hK'K) hLnormal + let aE := eA.symm a + let valHom : E.V →+ A.V := + (ambientFixedAddSubgroup A L).subtype.comp eA.toAddMonoidHom + apply Subtype.ext + simp only [fixedFieldInclusion_coe, relativeNorm_apply_coe, + relativeNormValue] + have ha : eA aE = a := eA.apply_symm_apply a + have hwitness : + eA.symm (transferNormNaturalityNormWitness A K K' L hLK' hK'K a) = + ∑ t : (T : Set (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))), E.ρ t.1 aE := by + simp [transferNormNaturalityNormWitness, T, E, eA, aE] + have hE : + (∑ q : K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K), E.ρ q aE) = + ∑ r : K'.toSubgroup ⧸ extensionSubgroup K' L hLK', + E.ρ (transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K r) + (∑ t : (T : Set (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))), E.ρ t.1 aE) := by + calc + (∑ q : K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K), E.ρ q aE) = + ∑ p : (K'.toSubgroup ⧸ extensionSubgroup K' L hLK') × + (T : Set (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))), + E.ρ (transferNormNaturalityRightCosetProductEquiv + K K' L hLK' hK'K p) aE := + (transferNormNaturalityRightCosetProductEquiv K K' L hLK' hK'K).sum_comp + (fun q => E.ρ q aE) |>.symm + _ = ∑ p : (K'.toSubgroup ⧸ extensionSubgroup K' L hLK') × + (T : Set (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))), + E.ρ (transferNormNaturalityIntermediateInclusion + K K' L hLK' hK'K p.1) (E.ρ p.2.1 aE) := by + apply Fintype.sum_congr + intro p + exact transferNormNaturality_extensionAction_product + A K K' L hLK' hK'K aE p.1 p.2 + _ = ∑ r : K'.toSubgroup ⧸ extensionSubgroup K' L hLK', + ∑ t : (T : Set (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))), + E.ρ (transferNormNaturalityIntermediateInclusion + K K' L hLK' hK'K r) (E.ρ t.1 aE) := by + rw [Fintype.sum_prod_type] + _ = ∑ r : K'.toSubgroup ⧸ extensionSubgroup K' L hLK', + E.ρ (transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K r) + (∑ t : (T : Set (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))), E.ρ t.1 aE) := by + apply Fintype.sum_congr + intro r + rw [map_sum] + calc + (∑ q : K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K), + relativeCosetAction A K L (hLK'.trans hK'K) a q) = + ∑ q : K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K), (E.ρ q aE).1 := by + apply Fintype.sum_congr + intro q + rw [← ha] + exact transferNormNaturality_relativeCosetAction_eq_extensionAction + A K L (hLK'.trans hK'K) hLnormal aE q + _ = (∑ q : K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K), E.ρ q aE).1 := by + change (∑ q, valHom (E.ρ q aE)) = valHom (∑ q, E.ρ q aE) + rw [map_sum] + _ = (∑ r : K'.toSubgroup ⧸ extensionSubgroup K' L hLK', + E.ρ (transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K r) + (∑ t : (T : Set (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))), E.ρ t.1 aE)).1 := + congrArg Subtype.val hE + _ = ∑ r : K'.toSubgroup ⧸ extensionSubgroup K' L hLK', + (E.ρ (transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K r) + (∑ t : (T : Set (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))), E.ρ t.1 aE)).1 := by + change valHom (∑ r, + E.ρ (transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K r) + (∑ t : (T : Set (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))), E.ρ t.1 aE)) = + ∑ r, valHom + (E.ρ (transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K r) + (∑ t : (T : Set (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))), E.ρ t.1 aE)) + rw [map_sum] + _ = ∑ r : K'.toSubgroup ⧸ extensionSubgroup K' L hLK', + relativeCosetAction A K' L hLK' + (transferNormNaturalityNormWitness A K K' L hLK' hK'K a) r := by + apply Fintype.sum_congr + intro r + rw [← hwitness] + have hr := transferNormNaturality_relativeCosetAction_intermediate + A K K' L hLK' hK'K + (eA.symm (transferNormNaturalityNormWitness A K K' L hLK' hK'K a)) r + calc + _ = relativeCosetAction A K' L hLK' + (eA (eA.symm + (transferNormNaturalityNormWitness A K K' L hLK' hK'K a))) r := by + simpa only [E, eA] using hr.symm + _ = relativeCosetAction A K' L hLK' + (transferNormNaturalityNormWitness A K K' L hLK' hK'K a) r := by + rw [eA.apply_symm_apply] + +/-- The right vertical arrow of transfer--norm naturality: inclusion `A_K → A_{K'}` +descended to the actual finite norm quotients. -/ +def transferNormNaturalityNormQuotientInclusion + (A : Rep ℤ G) (K K' L : ClosedSubgroup G) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L (hLK'.trans hK'K)).Normal] + [hL'normal : (extensionSubgroup K' L hLK').Normal] + [Finite (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))] : + letI : Finite (K'.toSubgroup ⧸ extensionSubgroup K' L hLK') := + Finite.of_injective + (transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K) + (transferNormNaturalityIntermediateInclusion_injective + K K' L hLK' hK'K) + FiniteNormQuotient A K L (hLK'.trans hK'K) →+ + FiniteNormQuotient A K' L hLK' := by + letI hL'finite : Finite + (K'.toSubgroup ⧸ extensionSubgroup K' L hLK') := + Finite.of_injective + (transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K) + (transferNormNaturalityIntermediateInclusion_injective + K K' L hLK' hK'K) + let targetClass : ambientFixedAddSubgroup A K →+ + FiniteNormQuotient A K' L hLK' := + (finiteNormClassHom A K' L hLK').comp + (fixedFieldInclusion A K K' hK'K) + refine finiteNormQuotientLift A K L (hLK'.trans hK'K) targetClass ?_ + rintro _ ⟨a, rfl⟩ + apply (finiteNormClass_eq_zero_iff A K' L hLK' _).2 + refine ⟨transferNormNaturalityNormWitness A K K' L hLK' hK'K a, ?_⟩ + exact (transferNormNaturality_norm_doubleCoset_formula + A K K' L hLK' hK'K a).symm + +/-- The transfer-side map sends a finite norm class to the class of its fixed-field inclusion. -/ +@[simp] +theorem transferNormNaturality_normQuotientInclusion_finiteNormClass + (A : Rep ℤ G) (K K' L : ClosedSubgroup G) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L (hLK'.trans hK'K)).Normal] + [Finite (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))] + (x : ambientFixedAddSubgroup A K) : + letI : (extensionSubgroup K' L hLK').Normal := + transferNormNaturality_intermediateExtension_normal K K' L hLK' hK'K + letI : Finite (K'.toSubgroup ⧸ extensionSubgroup K' L hLK') := + Finite.of_injective + (transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K) + (transferNormNaturalityIntermediateInclusion_injective + K K' L hLK' hK'K) + transferNormNaturalityNormQuotientInclusion A K K' L hLK' hK'K + (finiteNormClass A K L (hLK'.trans hK'K) x) = + finiteNormClass A K' L hLK' + (fixedFieldInclusion A K K' hK'K x) := by + let hL'normal : (extensionSubgroup K' L hLK').Normal := + transferNormNaturality_intermediateExtension_normal K K' L hLK' hK'K + let hL'finite : Finite + (K'.toSubgroup ⧸ extensionSubgroup K' L hLK') := + Finite.of_injective + (transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K) + (transferNormNaturalityIntermediateInclusion_injective + K K' L hLK' hK'K) + unfold transferNormNaturalityNormQuotientInclusion + rw [finiteNormQuotientLift_finiteNormClass] + rfl + +namespace DegreeData + +/-- Abelianized reciprocity evaluates a Frobenius class as the norm of a prime element. -/ +private theorem abelianizedReciprocity_frobenius_eq_primeNormClass + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (σ : D.FrobeniusElements (K.toFiniteResidueAbstractField D) L hLK) + (π : ambientFixedAddSubgroup A + (D.frobeniusFixedField (K.toFiniteResidueAbstractField D) L hLK σ)) + (hπ : + let Sigma : FiniteAbstractField G := + { field := D.frobeniusFixedField + (K.toFiniteResidueAbstractField D) L hLK σ + finite := D.frobeniusFixedField_absoluteFinite K L hLK σ } + v.IsPrimeElement Sigma π) : + let KR := K.toFiniteResidueAbstractField D + let S := D.frobeniusFixedField KR L hLK σ + let hSK := D.frobeniusFixedField_le KR L hLK σ + letI : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S hSK) := + D.frobeniusFixedField_finite KR L hLK σ + D.transferNormNaturalityAbelianizedReciprocity A v hAxiom K L hLK + (Additive.ofMul (Abelianization.of (D.frobeniusRestriction KR L hLK σ))) = + finiteNormClass A K.field L hLK + (relativeNorm A K.field S hSK π) := by + exact (D.transferNormNaturalityAbelianizedReciprocity_of A v hAxiom K L hLK + (D.frobeniusRestriction (K.toFiniteResidueAbstractField D) L hLK σ)).trans + (D.finiteReciprocityHom_apply_eq_primeNormClass A v hAxiom K L hLK + (Additive.ofMul (D.frobeniusRestriction + (K.toFiniteResidueAbstractField D) L hLK σ)) σ rfl π hπ) + +/-- An equality of underlying subgroup values yields the corresponding mapped sum. -/ +private theorem map_eq_sum_of_coe_eq + {B C : Type*} [AddCommGroup B] [AddCommMonoid C] + {H : AddSubgroup B} {ι : Type*} [Fintype ι] + (g : H →+ C) (x : H) (f : ι → H) (h : (x : B) = ∑ i, (f i : B)) : + g x = ∑ i, g (f i) := by + have hsub : x = ∑ i, f i := + Subtype.ext (h.trans (map_sum H.subtype f Finset.univ).symm) + rw [hsub, map_sum] + +/-- transfer--norm naturality on one Frobenius generator. The proof follows: transfer is +expanded over double cosets, the finite reciprocity equivalence +evaluates every positive Frobenius factor, and the resulting prime norms +are identified by `transferNormNaturalityNorm_eq_sum_transferNorms`. -/ +theorem transferNormNaturality_generator_square + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (F : FiniteAbstractFieldExtension G) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ F.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup F.base.field L (hL.trans F.below)).Normal] + [hLbasefinite : Finite (F.base.field.toSubgroup ⧸ + extensionSubgroup F.base.field L (hL.trans F.below))] + (σ : D.FrobeniusElements + (F.toFiniteResidueAbstractExtension D).base L + (hL.trans F.below) (hLnormal := by + change (extensionSubgroup F.base.field L + (hL.trans F.below)).Normal + exact hLnormal)) : + letI : (extensionSubgroup F.field.field L hL).Normal := + transferNormNaturality_intermediateExtension_normal + F.base.field F.field.field L hL F.below + letI : Finite + (F.field.field.toSubgroup ⧸ + extensionSubgroup F.field.field L hL) := + Finite.of_injective + (transferNormNaturalityIntermediateInclusion + F.base.field F.field.field L hL F.below) + (transferNormNaturalityIntermediateInclusion_injective + F.base.field F.field.field L hL F.below) + D.transferNormNaturalityAbelianizedReciprocity A v hAxiom + F.field L hL + (Additive.ofMul + (transferNormNaturalityTransfer + F.base.field F.field.field L hL F.below + (Abelianization.of + (D.frobeniusRestriction + (F.base.toFiniteResidueAbstractField D) L + (hL.trans F.below) σ)))) = + transferNormNaturalityNormQuotientInclusion A + F.base.field F.field.field L hL F.below + (D.transferNormNaturalityAbelianizedReciprocity A v hAxiom + F.base L (hL.trans F.below) + (Additive.ofMul + (Abelianization.of + (D.frobeniusRestriction + (F.base.toFiniteResidueAbstractField D) L + (hL.trans F.below) σ)))) := by + let hL'normal : (extensionSubgroup F.field.field L hL).Normal := + transferNormNaturality_intermediateExtension_normal + F.base.field F.field.field L hL F.below + let hL'finite : Finite + (F.field.field.toSubgroup ⧸ + extensionSubgroup F.field.field L hL) := + Finite.of_injective + (transferNormNaturalityIntermediateInclusion + F.base.field F.field.field L hL F.below) + (transferNormNaturalityIntermediateInclusion_injective + F.base.field F.field.field L hL F.below) + let E := F.toFiniteResidueAbstractExtension D + let hLnormalE : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal := + hLnormal + let hL'normalE : (extensionSubgroup E.field.field L hL).Normal := hL'normal + let hLbasefiniteE : Finite (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field L (hL.trans E.below)) := + hLbasefinite + let hL'finiteE : Finite (E.field.field.toSubgroup ⧸ + extensionSubgroup E.field.field L hL) := + hL'finite + let S := D.frobeniusFixedField E.base L (hL.trans E.below) σ + let hSK := D.frobeniusFixedField_le E.base L (hL.trans E.below) σ + let hSKF : S.toSubgroup ≤ F.base.field.toSubgroup := hSK + let : Finite (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field S hSK) := + D.frobeniusFixedField_finite E.base L (hL.trans E.below) σ + let hSbasefiniteF : Finite (F.base.field.toSubgroup ⧸ + extensionSubgroup F.base.field S hSKF) := + D.frobeniusFixedField_finite E.base L (hL.trans E.below) σ + let Sfinite : FiniteAbstractField G := { + field := S + finite := D.frobeniusFixedField_absoluteFinite F.base L (hL.trans F.below) σ } + let π : ambientFixedAddSubgroup A S := v.chosenPrimeElement Sfinite + let H := D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL + let : H.FiniteIndex := + D.transferNormNaturalityFrobeniusIntermediateFiniteIndex + E L hL + let Ω := Quotient (orbitRel (Subgroup.zpowers σ.1) + ((E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ H)) + let : Fintype Ω := Fintype.ofFinite _ + let β (q : Ω) := D.transferNormNaturalityTransferFrobeniusLift + E L hL σ q + let tK (q : Ω) : E.base.field.toSubgroup := Quotient.out q.out.out + let C (q : Ω) := conjugateClosedSubgroup S (tK q).1 + let Sβ (q : Ω) := D.frobeniusFixedField E.field L hL (β q) + let hSβK' (q : Ω) := + D.frobeniusFixedField_le E.field L hL (β q) + let hSβK'F (q : Ω) : (Sβ q).toSubgroup ≤ F.field.field.toSubgroup := hSβK' q + let hSβC (q : Ω) : (Sβ q).toSubgroup ≤ (C q).toSubgroup := + D.transferNormNaturalityTransferFrobenius_fixedField_le_conjugate + E L hL σ q + let πβ (q : Ω) : ambientFixedAddSubgroup A (Sβ q) := + fixedFieldInclusion A (C q) (Sβ q) (hSβC q) + (conjugateFixedElement A S (tK q).1 π) + let (q : Ω) : Finite + (E.field.field.toSubgroup ⧸ + extensionSubgroup E.field.field (Sβ q) (hSβK' q)) := + D.frobeniusFixedField_finite E.field L hL (β q) + let (q : Ω) : Finite + (F.field.field.toSubgroup ⧸ + extensionSubgroup F.field.field (Sβ q) (hSβK'F q)) := by + change Finite + (E.field.field.toSubgroup ⧸ + extensionSubgroup E.field.field (Sβ q) (hSβK' q)) + infer_instance + let (q : Ω) : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) (Sβ q) (le_baseField (Sβ q))) := + D.frobeniusFixedField_absoluteFinite F.field L hL (β q) + let Sβfinite (q : Ω) : FiniteAbstractField G := { + field := Sβ q + finite := inferInstance } + have hPrime (q : Ω) : v.IsPrimeElement (Sβfinite q) (πβ q) := + D.transferNormNaturalityTransferFrobenius_conjugatePrime_isPrime + A v F L hL σ q π + (v.chosenPrimeElement_isPrime Sfinite) + let M := extensionSubgroup E.base.field E.field.field E.below + let ΩN := Quotient (orbitRel M + (E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field S hSK)) + let orbitEquiv : Ω ≃ ΩN := + D.transferNormNaturalityTransferNormOrbitEquiv E L hL σ + let : Fintype ΩN := Fintype.ofFinite _ + let f : ΩN → A.V := fun qN => + let q := orbitEquiv.symm qN + ((relativeNorm A E.field.field (Sβ q) (hSβK' q) (πβ q) : + ambientFixedAddSubgroup A E.field.field) : A.V) + have hNorm0 := D.transferNormNaturalityNorm_eq_sum_transferNorms + A F L hL σ π + have hNorm : + ((fixedFieldInclusion A E.base.field E.field.field E.below + (relativeNorm A E.base.field S hSK π) : + ambientFixedAddSubgroup A E.field.field) : A.V) = + ∑ q : Ω, ((relativeNorm A E.field.field + (Sβ q) (hSβK' q) (πβ q) : + ambientFixedAddSubgroup A E.field.field) : A.V) := by + calc + _ = ∑ qN : ΩN, f qN := by + simpa only [f, orbitEquiv, Sβ, hSβK', πβ, C, tK, β, S, + hSK, E] using hNorm0 + _ = ∑ q : Ω, f (orbitEquiv q) := + (orbitEquiv.sum_comp f).symm + _ = ∑ q : Ω, ((relativeNorm A E.field.field + (Sβ q) (hSβK' q) (πβ q) : + ambientFixedAddSubgroup A E.field.field) : A.V) := by + apply Fintype.sum_congr + intro q + change ((relativeNorm A E.field.field + (Sβ (orbitEquiv.symm (orbitEquiv q))) + (hSβK' (orbitEquiv.symm (orbitEquiv q))) + (πβ (orbitEquiv.symm (orbitEquiv q))) : + ambientFixedAddSubgroup A E.field.field) : A.V) = _ + rw [orbitEquiv.symm_apply_apply] + have hTransfer := D.transferNormNaturalityTransfer_frobenius_product + E L hL σ + change D.transferNormNaturalityAbelianizedReciprocity A v hAxiom + F.field L hL + (Additive.ofMul + (transferNormNaturalityTransfer + E.base.field E.field.field L hL E.below + (Abelianization.of + (D.frobeniusRestriction E.base L + (hL.trans E.below) σ)))) = _ + rw [hTransfer] + change D.transferNormNaturalityAbelianizedReciprocity A v hAxiom + F.field L hL + (∑ q : Ω, Additive.ofMul + (Abelianization.of + (D.frobeniusRestriction E.field L hL (β q)))) = _ + rw [map_sum] + have hLeft : + (∑ q : Ω, + D.transferNormNaturalityAbelianizedReciprocity A v hAxiom + F.field L hL + (Additive.ofMul + (Abelianization.of + (D.frobeniusRestriction E.field L hL (β q))))) = + ∑ q : Ω, finiteNormClass A F.field.field L hL + (relativeNorm A F.field.field (Sβ q) (hSβK'F q) (πβ q)) := by + apply Fintype.sum_congr + intro q + exact abelianizedReciprocity_frobenius_eq_primeNormClass D A v hAxiom + F.field L hL (β q) (πβ q) (by + simpa [Sβfinite, Sβ, E, + FiniteAbstractFieldExtension.toFiniteResidueAbstractExtension, + FiniteAbstractField.toFiniteResidueAbstractField] using hPrime q) + rw [hLeft] + have hBase := abelianizedReciprocity_frobenius_eq_primeNormClass D A v hAxiom + F.base L (hL.trans F.below) σ π (v.chosenPrimeElement_isPrime Sfinite) + have hRight := (congrArg + (transferNormNaturalityNormQuotientInclusion A + F.base.field F.field.field L hL F.below) hBase).trans + (transferNormNaturality_normQuotientInclusion_finiteNormClass + A F.base.field F.field.field L hL F.below + (relativeNorm A F.base.field S hSKF π)) + have hNormClasses := map_eq_sum_of_coe_eq + (finiteNormClassHom A F.field.field L hL) _ + (fun q : Ω => relativeNorm A F.field.field (Sβ q) (hSβK'F q) (πβ q)) hNorm + exact hNormClasses.symm.trans hRight.symm + +/-- Transfer--norm naturality. For a finite Galois extension +`L | K` and an intermediate field `K'`, reciprocity commutes with transfer: +`r_{L/K'} ∘ Ver = inclusion ∘ r_{L/K}`. -/ +theorem transferNormNaturality + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (F : FiniteAbstractFieldExtension G) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ F.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup F.base.field L (hL.trans F.below)).Normal] + [hLbasefinite : Finite (F.base.field.toSubgroup ⧸ + extensionSubgroup F.base.field L (hL.trans F.below))] : + letI : (extensionSubgroup F.field.field L hL).Normal := + transferNormNaturality_intermediateExtension_normal + F.base.field F.field.field L hL F.below + letI : Finite + (F.field.field.toSubgroup ⧸ + extensionSubgroup F.field.field L hL) := + Finite.of_injective + (transferNormNaturalityIntermediateInclusion + F.base.field F.field.field L hL F.below) + (transferNormNaturalityIntermediateInclusion_injective + F.base.field F.field.field L hL F.below) + (D.transferNormNaturalityAbelianizedReciprocity A v hAxiom + F.field L hL).comp + (MonoidHom.toAdditive + (transferNormNaturalityTransfer + F.base.field F.field.field L hL F.below)) = + (transferNormNaturalityNormQuotientInclusion A + F.base.field F.field.field L hL F.below).comp + (D.transferNormNaturalityAbelianizedReciprocity A v hAxiom + F.base L (hL.trans F.below)) := by + let hL'normal : (extensionSubgroup F.field.field L hL).Normal := + transferNormNaturality_intermediateExtension_normal + F.base.field F.field.field L hL F.below + let : Finite + (F.field.field.toSubgroup ⧸ extensionSubgroup F.field.field L hL) := + Finite.of_injective + (transferNormNaturalityIntermediateInclusion + F.base.field F.field.field L hL F.below) + (transferNormNaturalityIntermediateInclusion_injective + F.base.field F.field.field L hL F.below) + apply AddMonoidHom.ext + intro x + change D.transferNormNaturalityAbelianizedReciprocity A v hAxiom + F.field L hL + (Additive.ofMul + (transferNormNaturalityTransfer + F.base.field F.field.field L hL F.below x.toMul)) = + transferNormNaturalityNormQuotientInclusion A + F.base.field F.field.field L hL F.below + (D.transferNormNaturalityAbelianizedReciprocity A v hAxiom + F.base L (hL.trans F.below) (Additive.ofMul x.toMul)) + refine QuotientGroup.induction_on x.toMul ?_ + intro q + obtain ⟨σ, hσ⟩ := D.frobeniusRestriction_surjective + (F.base.toFiniteResidueAbstractField D) L (hL.trans F.below) q + rw [← hσ] + exact D.transferNormNaturality_generator_square + A v hAxiom F L hL σ + +end DegreeData + +end Representation + +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobenius.lean new file mode 100644 index 0000000000..61ab7b29ed --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobenius.lean @@ -0,0 +1,1667 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobeniusGeometry + +/-! # Main Transfer Frobenius -/ + +@[expose] public section +universe u + +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +open CategoryTheory + +/-! +# The abstract reciprocity construction, transfer--norm naturality: Frobenius fibers + +This module continues the geometric transfer construction with the chosen +norm-orbit representatives, fiber calculations, fixed-field arithmetic, and +the final Frobenius transfer formula. +-/ + +noncomputable +section + +open scoped BigOperators + +open MulAction + +section transferFrobeniusGeometry + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace Internal + +/-- The chosen representative of a norm orbit is the inverse of the +representative of the corresponding transfer orbit. -/ +private noncomputable def chosenTransferNormNaturalityNormOrbitRepresentative + (D : DegreeData G) [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (E : DegreeData.FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + (σ : D.FrobeniusElements E.base L (hL.trans E.below)) + (qN : Quotient (orbitRel + (extensionSubgroup E.base.field E.field.field E.below) + (E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field + (D.frobeniusFixedField E.base L (hL.trans E.below) σ) + (D.frobeniusFixedField_le E.base L + (hL.trans E.below) σ)))) : + E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field + (D.frobeniusFixedField E.base L (hL.trans E.below) σ) + (D.frobeniusFixedField_le E.base L (hL.trans E.below) σ) := + let qT := (D.transferNormNaturalityTransferNormOrbitEquiv + E L hL σ).symm qN + QuotientGroup.mk (Quotient.out qT.out.out)⁻¹ + +private theorem chosenTransferNormNaturalityNormOrbitRepresentative_spec + (D : DegreeData G) [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (E : DegreeData.FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + (σ : D.FrobeniusElements E.base L (hL.trans E.below)) : + Function.LeftInverse Quotient.mk'' + (Internal.chosenTransferNormNaturalityNormOrbitRepresentative + D E L hL σ) := by + intro qN + let orbitEquiv := D.transferNormNaturalityTransferNormOrbitEquiv E L hL σ + let qT := orbitEquiv.symm qN + change Quotient.mk'' (QuotientGroup.mk (Quotient.out qT.out.out)⁻¹) = qN + rw [← D.transferNormNaturalityTransferNormOrbitEquiv_apply + E L hL σ qT] + exact orbitEquiv.apply_symm_apply qN + +end Internal + +end transferFrobeniusGeometry + +section transferOrbitNorms + +/-! +Mathlib's `Rep ℤ G` requires its coefficient ring and acting group in the +same universe, so this representation-bearing portion has `G : Type 0`. +-/ +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace Internal + +/-- The relative norm from the Frobenius fixed field is the sum over +the norm double cosets corresponding to the classical transfer orbits. +The representative of the orbit paired with `q` is the inverse of the +transfer representative selected by `Quotient.out`. -/ +private theorem transferNormNaturalityNorm_eq_sum_transferOrbitRepresentatives + (D : DegreeData G) (A : Rep ℤ G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (E : DegreeData.FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + [hLfinite : Finite (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field L (hL.trans E.below))] + (σ : D.FrobeniusElements E.base L (hL.trans E.below)) + (π : ambientFixedAddSubgroup A + (D.frobeniusFixedField E.base L (hL.trans E.below) σ)) : + let S := D.frobeniusFixedField E.base L (hL.trans E.below) σ + let hSK := D.frobeniusFixedField_le E.base L (hL.trans E.below) σ + let M := extensionSubgroup E.base.field E.field.field E.below + let Ω := Quotient (orbitRel M + (E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field S hSK)) + let φ : Ω → E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field S hSK := + Internal.chosenTransferNormNaturalityNormOrbitRepresentative + D E L hL σ + letI : Finite (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field S hSK) := + D.frobeniusFixedField_finite E.base L (hL.trans E.below) σ + letI : Fintype Ω := Fintype.ofFinite _ + letI (q : Ω) : Fintype (M ⧸ stabilizer M (φ q)) := by + letI : Finite (orbit M (φ q)) := + Finite.of_injective Subtype.val Subtype.val_injective + letI := Fintype.ofFinite (orbit M (φ q)) + exact Fintype.ofEquiv (orbit M (φ q)) + (orbitEquivQuotientStabilizer M (φ q)) + ((relativeNorm A E.base.field S hSK π : + ambientFixedAddSubgroup A E.base.field) : A.V) = + ∑ q : Ω, ∑ r : M ⧸ stabilizer M (φ q), + relativeCosetAction A E.base.field S hSK π (r.out • φ q) := by + dsimp only + let S := D.frobeniusFixedField E.base L (hL.trans E.below) σ + let hSK := D.frobeniusFixedField_le E.base L (hL.trans E.below) σ + let M := extensionSubgroup E.base.field E.field.field E.below + let Ω := Quotient (orbitRel M + (E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field S hSK)) + let φ : Ω → E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field S hSK := + Internal.chosenTransferNormNaturalityNormOrbitRepresentative + D E L hL σ + let : Finite (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field S hSK) := + D.frobeniusFixedField_finite E.base L (hL.trans E.below) σ + let : Fintype Ω := Fintype.ofFinite _ + let (q : Ω) : Fintype (M ⧸ stabilizer M (φ q)) := by + letI : Finite (orbit M (φ q)) := + Finite.of_injective Subtype.val Subtype.val_injective + letI := Fintype.ofFinite (orbit M (φ q)) + exact Fintype.ofEquiv (orbit M (φ q)) + (orbitEquivQuotientStabilizer M (φ q)) + rw [relativeNorm_eq_sum_chosenOrbit_of_fintype A E.base.field S hSK M + (Internal.chosenTransferNormNaturalityNormOrbitRepresentative_spec + D E L hL σ) π] + apply Fintype.sum_congr + intro q + apply Fintype.sum_congr + intro r + rw [chosenOrbitClassEquiv_symm_apply] + +end Internal + +end transferOrbitNorms + +section transferFrobeniusFibers + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- Canonical identification of the two realizations of +`G(\widetilde L/K')`. -/ +noncomputable def transferNormNaturalityFrobeniusIntermediateEquiv + (D : DegreeData G) [IsTopologicalGroup G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] : + (E.field.field.toSubgroup ⧸ + D.extensionInertiaWithin E.field.field L hL) ≃* + D.transferNormNaturalityFrobeniusIntermediateSubgroup E L hL := + MulEquiv.ofBijective + (D.finiteReciprocityNaturalityFrobeniusTowerMap + E.base.field E.field.field L L + (hL.trans E.below) hL E.below le_rfl).rangeRestrict + ⟨fun _ _ h => D.transferNormNaturalityFrobeniusTowerMap_injective + E L hL (congrArg Subtype.val h), + MonoidHom.rangeRestrict_surjective _⟩ + +/-- +Establishes the identity `(D.transferNormNaturalityFrobeniusIntermediateEquiv E L hL +(QuotientGroup.mk k')).1 = QuotientGroup.mk (Subgroup.inclusion E.below k')`. +-/ +@[simp] +theorem transferNormNaturalityFrobeniusIntermediateEquiv_mk + (D : DegreeData G) [IsTopologicalGroup G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + (k' : E.field.field.toSubgroup) : + (D.transferNormNaturalityFrobeniusIntermediateEquiv + E L hL (QuotientGroup.mk k')).1 = + QuotientGroup.mk (Subgroup.inclusion E.below k') := rfl + +/-- A divisibility fact in `ℤ̂` used to recognize every transfer term as +a positive Frobenius element over `K'`. -/ +theorem transferNormNaturality_zHat_positive_nat_of_nsmul_eq_nat + (f N : ℕ) (hf : 0 < f) (hN : 0 < N) (z : ZHat) + (h : f • z = N • (1 : ZHat)) : + ∃ n : ℕ, 0 < n ∧ z = n • (1 : ZHat) := by + have hRange : N • (1 : ZHat) ∈ + (zHatMulNat f).toAddMonoidHom.range := by + refine ⟨z, ?_⟩ + change f • z = N • (1 : ZHat) + exact h + have hKer : N • (1 : ZHat) ∈ + (zHatReduction f hf).toAddMonoidHom.ker := by + rw [← zHatMulNat_range_eq_ker_reduction f hf] + exact hRange + have hmod : (N : ZMod f) = 0 := by + change zHatReduction f hf (N • (1 : ZHat)) = 0 at hKer + rw [map_nsmul] at hKer + have hredOne : zHatReduction f hf (1 : ZHat) = 1 := by + rfl + simpa [hredOne] using hKer + have hdiv : f ∣ N := (ZMod.natCast_eq_zero_iff N f).1 hmod + let n := N / f + have hN_eq : N = f * n := (Nat.mul_div_cancel' hdiv).symm + have hn : 0 < n := Nat.div_pos (Nat.le_of_dvd hN hdiv) hf + refine ⟨n, hn, ?_⟩ + apply zHatMulNat_injective hf + change f • z = f • (n • (1 : ZHat)) + rw [h, smul_smul, ← hN_eq] + +/-- The element `τ⁻¹ σ ^ f(τ) τ` of `H` attached to one double coset in +the transfer formula on `G(\widetilde L/K)`. -/ +noncomputable def transferNormNaturalityFrobeniusTransferTerm + (D : DegreeData G) [IsTopologicalGroup G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + (σ : D.FrobeniusElements E.base L (hL.trans E.below)) + (q : Quotient (orbitRel (Subgroup.zpowers σ.1) + ((E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ + D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL))) : + D.transferNormNaturalityFrobeniusIntermediateSubgroup E L hL := by + let H := D.transferNormNaturalityFrobeniusIntermediateSubgroup E L hL + exact ⟨q.out.out⁻¹ * σ.1 ^ Function.minimalPeriod (σ.1 • ·) q.out * + q.out.out, + QuotientGroup.out_conj_pow_minimalPeriod_mem H σ.1 q.out⟩ + +/-- The transfer term pulled back from `H` to +`G(\widetilde L/K')`. -/ +noncomputable def transferNormNaturalityFrobeniusTransferTermPreimage + (D : DegreeData G) [IsTopologicalGroup G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + (σ : D.FrobeniusElements E.base L (hL.trans E.below)) + (q : Quotient (orbitRel (Subgroup.zpowers σ.1) + ((E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ + D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL))) : + E.field.field.toSubgroup ⧸ D.extensionInertiaWithin E.field.field L hL := + (D.transferNormNaturalityFrobeniusIntermediateEquiv E L hL).symm + (D.transferNormNaturalityFrobeniusTransferTerm E L hL σ q) + +/-- The pullback of each double-coset term has strictly positive integral +normalized degree, as asserted. -/ +theorem transferNormNaturalityFrobeniusTransferTermPreimage_degree + (D : DegreeData G) [IsTopologicalGroup G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + (σ : D.FrobeniusElements E.base L (hL.trans E.below)) + (q : Quotient (orbitRel (Subgroup.zpowers σ.1) + ((E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ + D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL))) : + ∃ n : ℕ, 0 < n ∧ + D.extensionNormalizedDegree E.field L hL + (D.transferNormNaturalityFrobeniusTransferTermPreimage + E L hL σ q) = + (Multiplicative.ofAdd (1 : ZHat)) ^ n := by + let H := D.transferNormNaturalityFrobeniusIntermediateSubgroup E L hL + let : H.FiniteIndex := + D.transferNormNaturalityFrobeniusIntermediateFiniteIndex E L hL + let := H.fintypeQuotientOfFiniteIndex + let m := Function.minimalPeriod (σ.1 • ·) q.out + let N := m * D.frobeniusExponent E.base L (hL.trans E.below) σ + let u := D.transferNormNaturalityFrobeniusTransferTermPreimage + E L hL σ q + let f := (E.residueDegree : ℕ) + let : Finite (orbit (Subgroup.zpowers σ.1) q.out) := + Finite.of_injective Subtype.val Subtype.val_injective + have hf : 0 < f := E.residueDegree.property + have hm : 0 < m := by + have hm0 : Function.minimalPeriod (σ.1 • ·) q.out ≠ 0 := + NeZero.ne _ + simpa [m] using Nat.pos_of_ne_zero hm0 + have hN : 0 < N := Nat.mul_pos hm + (D.frobeniusExponent_pos E.base L (hL.trans E.below) σ) + have hu : + D.finiteReciprocityNaturalityFrobeniusTowerMap + E.base.field E.field.field L L + (hL.trans E.below) hL E.below le_rfl u = + (D.transferNormNaturalityFrobeniusTransferTerm + E L hL σ q).1 := by + exact congrArg Subtype.val + ((D.transferNormNaturalityFrobeniusIntermediateEquiv + E L hL).apply_symm_apply + (D.transferNormNaturalityFrobeniusTransferTerm + E L hL σ q)) + have hconj : + D.extensionNormalizedDegree E.base L (hL.trans E.below) + (D.transferNormNaturalityFrobeniusTransferTerm + E L hL σ q).1 = + D.extensionNormalizedDegree E.base L (hL.trans E.below) + (σ.1 ^ m) := by + change D.extensionNormalizedDegree E.base L (hL.trans E.below) + (q.out.out⁻¹ * σ.1 ^ m * q.out.out) = _ + rw [map_mul, map_mul, map_inv] + simp [mul_comm] + have hdegree : f • + (D.extensionNormalizedDegree E.field L hL u).toAdd = + N • (1 : ZHat) := by + calc + f • (D.extensionNormalizedDegree E.field L hL u).toAdd = + (D.extensionNormalizedDegree E.base L (hL.trans E.below) + (D.finiteReciprocityNaturalityFrobeniusTowerMap + E.base.field E.field.field L L + (hL.trans E.below) hL E.below le_rfl u)).toAdd := by + symm + exact D.finiteReciprocityNaturalityFrobeniusTowerMap_degree + E L L (hL.trans E.below) hL le_rfl u + _ = (D.extensionNormalizedDegree E.base L (hL.trans E.below) + (σ.1 ^ m)).toAdd := by rw [hu, hconj] + _ = N • (1 : ZHat) := by + rw [map_pow, + D.extensionNormalizedDegree_frobenius_eq_pow + E.base L (hL.trans E.below) σ] + change m • + (D.frobeniusExponent E.base L (hL.trans E.below) σ • + (1 : ZHat)) = N • (1 : ZHat) + rw [smul_smul] + obtain ⟨n, hn, hnEq⟩ := + transferNormNaturality_zHat_positive_nat_of_nsmul_eq_nat f N hf hN + (D.extensionNormalizedDegree E.field L hL u).toAdd hdegree + refine ⟨n, hn, ?_⟩ + apply Multiplicative.ext + exact hnEq + +/-- The actual Frobenius lift over `K'` represented by one term of the +transfer product. -/ +noncomputable def transferNormNaturalityTransferFrobeniusLift + (D : DegreeData G) [IsTopologicalGroup G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + (σ : D.FrobeniusElements E.base L (hL.trans E.below)) + (q : Quotient (orbitRel (Subgroup.zpowers σ.1) + ((E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ + D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL))) : + D.FrobeniusElements E.field L hL := + ⟨D.transferNormNaturalityFrobeniusTransferTermPreimage + E L hL σ q, + D.transferNormNaturalityFrobeniusTransferTermPreimage_degree + E L hL σ q⟩ + +/-- +Establishes the identity `(D.transferNormNaturalityTransferFrobeniusLift E L hL σ q).1 = +D.transferNormNaturalityFrobeniusTransferTermPreimage E L hL σ q`. +-/ +@[simp] +theorem transferNormNaturalityTransferFrobeniusLift_coe + (D : DegreeData G) [IsTopologicalGroup G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + (σ : D.FrobeniusElements E.base L (hL.trans E.below)) + (q : Quotient (orbitRel (Subgroup.zpowers σ.1) + ((E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ + D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL))) : + (D.transferNormNaturalityTransferFrobeniusLift + E L hL σ q).1 = + D.transferNormNaturalityFrobeniusTransferTermPreimage + E L hL σ q := rfl + +/-- The Frobenius lift attached to a transfer orbit maps to the transfer +term `τ⁻¹ σ^f τ` in `G(\widetilde L/K)`. -/ +theorem transferNormNaturalityTransferFrobeniusLift_towerMap + (D : DegreeData G) [IsTopologicalGroup G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + (σ : D.FrobeniusElements E.base L (hL.trans E.below)) + (q : Quotient (orbitRel (Subgroup.zpowers σ.1) + ((E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ + D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL))) : + D.finiteReciprocityNaturalityFrobeniusTowerMap + E.base.field E.field.field L L + (hL.trans E.below) hL E.below le_rfl + (D.transferNormNaturalityTransferFrobeniusLift + E L hL σ q).1 = + (D.transferNormNaturalityFrobeniusTransferTerm + E L hL σ q).1 := by + exact congrArg Subtype.val + ((D.transferNormNaturalityFrobeniusIntermediateEquiv + E L hL).apply_symm_apply + (D.transferNormNaturalityFrobeniusTransferTerm + E L hL σ q)) + +/-- The closed subgroup generated by a transfer Frobenius lift maps onto +the closed subgroup generated by the corresponding transfer term. -/ +theorem transferNormNaturalityTransferFrobeniusLift_closure_map + (D : DegreeData G) [IsTopologicalGroup G] [CompactSpace G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + (σ : D.FrobeniusElements E.base L (hL.trans E.below)) + (q : Quotient (orbitRel (Subgroup.zpowers σ.1) + ((E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ + D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL))) : + let β := D.transferNormNaturalityTransferFrobeniusLift + E L hL σ q + let f := D.finiteReciprocityNaturalityFrobeniusTowerMap + E.base.field E.field.field L L + (hL.trans E.below) hL E.below le_rfl + (D.frobeniusClosure E.field L hL β).toSubgroup.map f = + (closedSubgroupGenerated + ({(D.transferNormNaturalityFrobeniusTransferTerm + E L hL σ q).1} : Set + (E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below))) : Subgroup + (E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below))) := by + dsimp only + let β := D.transferNormNaturalityTransferFrobeniusLift + E L hL σ q + let Γβ := D.frobeniusClosure E.field L hL β + let f := D.finiteReciprocityNaturalityFrobeniusTowerMap + E.base.field E.field.field L L + (hL.trans E.below) hL E.below le_rfl + let fc := D.finiteReciprocityNaturalityFrobeniusTowerMapContinuous + E.base.field E.field.field L L + (hL.trans E.below) hL E.below le_rfl + let P := E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below) + let u := (D.transferNormNaturalityFrobeniusTransferTerm + E L hL σ q).1 + have hβu : f β.1 = u := + D.transferNormNaturalityTransferFrobeniusLift_towerMap + E L hL σ q + apply le_antisymm + · rintro y ⟨x, hx, rfl⟩ + change x ∈ Γβ.toSubgroup at hx + have hx' : x ∈ + (closedSubgroupGenerated + ({(D.transferNormNaturalityTransferFrobeniusLift + E L hL σ q).1} : Set + (E.field.field.toSubgroup ⧸ + D.extensionInertiaWithin E.field.field L hL))).toSubgroup := by + simpa only [Γβ, DegreeData.frobeniusClosure, Set.range_unique] using hx + have hmap := map_mem_closedSubgroupGenerated_singleton + fc (D.transferNormNaturalityTransferFrobeniusLift E L hL σ q).1 hx' + change f x ∈ + (closedSubgroupGenerated ({f β.1} : Set P) : Subgroup P) at hmap + rw [hβu] at hmap + exact hmap + · have hK'compact : CompactSpace E.field.field.toSubgroup := + isCompact_iff_compactSpace.mp E.field.field.isClosed'.isCompact + let : CompactSpace E.field.field.toSubgroup := hK'compact + let : IsClosed + (D.extensionInertiaWithin E.field.field L hL : + Set E.field.field.toSubgroup) := + D.extensionInertiaWithin_isClosed E.field L hL + let : IsClosed (D.extensionInertiaWithin E.base.field L + (hL.trans E.below) : Set E.base.field.toSubgroup) := + D.extensionInertiaWithin_isClosed E.base L (hL.trans E.below) + have hmapClosed : IsClosed + ((Γβ.toSubgroup.map f : Subgroup P) : Set P) := by + have hrange : ((Γβ.toSubgroup.map f : Subgroup P) : Set P) = + Set.range (fun x : Γβ => f x.1) := by + ext y + constructor + · rintro ⟨x, hx, rfl⟩ + exact ⟨⟨x, hx⟩, rfl⟩ + · rintro ⟨x, rfl⟩ + exact ⟨x.1, x.2, rfl⟩ + rw [hrange] + have hclosed := + ((isCompact_univ (X := Γβ)).image + (fc.continuous.comp continuous_subtype_val)).isClosed + change IsClosed + ((fun x : Γβ => fc.toMonoidHom x.1) '' Set.univ) at hclosed + have hclosed' : + IsClosed (Set.range (fun x : Γβ => fc.toMonoidHom x.1)) := by + simpa only [Set.image_univ] using hclosed + have hfc : fc.toMonoidHom = f := by + rfl + rw [hfc] at hclosed' + exact hclosed' + apply Subgroup.topologicalClosure_minimal + · rw [Subgroup.closure_le] + intro y hy + rw [Set.mem_singleton_iff] at hy + subst y + have hβmem : β.1 ∈ Γβ.toSubgroup := by + have hgen : β.1 ∈ + (closedSubgroupGenerated ({β.1} : Set _) : Subgroup _) := + Subgroup.le_topologicalClosure _ + (Subgroup.subset_closure (by simp)) + simpa [Γβ, β, DegreeData.frobeniusClosure] using hgen + exact ⟨β.1, hβmem, hβu⟩ + · exact hmapClosed + +/-- For a transfer orbit represented by `t`, the absolute subgroup fixed +by its Frobenius lift over `K'` is the stabilizer of the norm coset +`t⁻¹ G_Σ`. This is the intersection +`G_K' ∩ t⁻¹ G_Σ t`. -/ +theorem transferNormNaturalityTransferFrobeniusLift_mem_fixedSubgroup_iff_stabilizer + (D : DegreeData G) [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + (σ : D.FrobeniusElements E.base L (hL.trans E.below)) + (q : Quotient (orbitRel (Subgroup.zpowers σ.1) + ((E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ + D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL))) + (k' : E.field.field.toSubgroup) : + let β := D.transferNormNaturalityTransferFrobeniusLift + E L hL σ q + let S := D.frobeniusFixedField E.base L (hL.trans E.below) σ + let tK : E.base.field.toSubgroup := Quotient.out q.out.out + let kM : extensionSubgroup E.base.field E.field.field E.below := + ⟨Subgroup.inclusion E.below k', k'.2⟩ + k' ∈ extensionSubgroup E.field.field + (D.frobeniusFixedField E.field L hL β) + (D.frobeniusFixedField_le E.field L hL β) ↔ + kM ∈ MulAction.stabilizer + (extensionSubgroup E.base.field E.field.field E.below) + (QuotientGroup.mk tK⁻¹ : + E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field S + (D.frobeniusFixedField_le E.base L + (hL.trans E.below) σ)) := by + dsimp only + let P := E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below) + let P' := E.field.field.toSubgroup ⧸ + D.extensionInertiaWithin E.field.field L hL + let f : P' →* P := D.finiteReciprocityNaturalityFrobeniusTowerMap + E.base.field E.field.field L L + (hL.trans E.below) hL E.below le_rfl + let H := D.transferNormNaturalityFrobeniusIntermediateSubgroup E L hL + let : H.FiniteIndex := + D.transferNormNaturalityFrobeniusIntermediateFiniteIndex E L hL + have hHclosed : IsClosed (H : Set P) := + D.transferNormNaturalityFrobeniusIntermediate_isClosed E L hL + let β := D.transferNormNaturalityTransferFrobeniusLift + E L hL σ q + let Γβ := D.frobeniusClosure E.field L hL β + let Γ := D.frobeniusClosure E.base L (hL.trans E.below) σ + let m := Function.minimalPeriod (σ.1 • ·) q.out + let t : P := q.out.out + let tK : E.base.field.toSubgroup := Quotient.out t + let u : P := + (D.transferNormNaturalityFrobeniusTransferTerm E L hL σ q).1 + let Cu : Subgroup P := + (closedSubgroupGenerated ({u} : Set P) : Subgroup P) + let Cpow : Subgroup P := + (closedSubgroupGenerated ({σ.1 ^ m} : Set P) : Subgroup P) + let c : P →ₜ* P := + { toMonoidHom := (MulAut.conj t).toMonoidHom + continuous_toFun := IsTopologicalGroup.continuous_conj t } + let ci : P →ₜ* P := + { toMonoidHom := (MulAut.conj t⁻¹).toMonoidHom + continuous_toFun := IsTopologicalGroup.continuous_conj t⁻¹ } + have hc_apply (y : P) : c y = t * y * t⁻¹ := rfl + have hci_apply (y : P) : ci y = t⁻¹ * y * t := by + change t⁻¹ * y * (t⁻¹)⁻¹ = t⁻¹ * y * t + rw [inv_inv] + have hclosureMap : Γβ.toSubgroup.map f = Cu := by + simpa [Γβ, Cu, u, β, f] using + D.transferNormNaturalityTransferFrobeniusLift_closure_map + E L hL σ q + have hpow : Cpow = Γ.toSubgroup ⊓ MulAction.stabilizer P q.out := by + simpa [Cpow, Γ, DegreeData.frobeniusClosure, m] using + closedSubgroupGenerated_pow_eq_inf_stabilizer + H hHclosed σ.1 q.out + have hcu : c u = σ.1 ^ m := by + change t * (t⁻¹ * σ.1 ^ m * t) * t⁻¹ = σ.1 ^ m + simp [mul_assoc] + have hcig : ci (σ.1 ^ m) = u := by + rw [hci_apply] + rfl + have hVeq : MulAction.stabilizer P q.out = + H.map (MulAut.conj t).toMonoidHom := by + have hx : q.out = t • (QuotientGroup.mk 1 : P ⧸ H) := by + symm + change QuotientGroup.mk (t * 1) = q.out + rw [mul_one] + exact Quotient.out_eq' q.out + rw [hx, stabilizer_smul_eq_stabilizer_map_conj, + MulAction.stabilizer_quotient] + have hclosure_iff (x : P') : + x ∈ Γβ.toSubgroup ↔ c (f x) ∈ Γ.toSubgroup := by + constructor + · intro hx + have hfx : f x ∈ Cu := by + rw [← hclosureMap] + exact ⟨x, hx, rfl⟩ + have hcx := map_mem_closedSubgroupGenerated_singleton c u hfx + rw [hcu] at hcx + change c (f x) ∈ Cpow at hcx + rw [hpow] at hcx + exact hcx.1 + · intro hx + have hfxH : f x ∈ H := ⟨x, rfl⟩ + have hcfxV : c (f x) ∈ MulAction.stabilizer P q.out := by + rw [hVeq] + exact ⟨f x, hfxH, rfl⟩ + have hcfx : c (f x) ∈ Cpow := by + rw [hpow] + exact ⟨hx, hcfxV⟩ + have hcix := map_mem_closedSubgroupGenerated_singleton + ci (σ.1 ^ m) hcfx + rw [hcig] at hcix + have hif : ci (c (f x)) = f x := by + rw [hci_apply, hc_apply] + simp [mul_assoc] + rw [hif] at hcix + have hmap : f x ∈ Γβ.toSubgroup.map f := by + rw [hclosureMap] + exact hcix + exact (Subgroup.mem_map_iff_mem + (D.transferNormNaturalityFrobeniusTowerMap_injective + E L hL)).mp hmap + let S := D.frobeniusFixedField E.base L (hL.trans E.below) σ + let hSK := D.frobeniusFixedField_le E.base L (hL.trans E.below) σ + let kM : extensionSubgroup E.base.field E.field.field E.below := + ⟨Subgroup.inclusion E.below k', k'.2⟩ + rw [D.extensionSubgroup_frobeniusFixedField E.field L hL β] + change QuotientGroup.mk k' ∈ Γβ.toSubgroup ↔ _ + rw [hclosure_iff] + rw [mem_relativeNormDoubleCoset_stabilizer_iff + E.base.field E.field.field S hSK E.below tK⁻¹ kM] + let zK : E.base.field.toSubgroup := + tK * Subgroup.inclusion E.below k' * tK⁻¹ + have htz : c (f (QuotientGroup.mk k')) = QuotientGroup.mk zK := by + change t * QuotientGroup.mk (Subgroup.inclusion E.below k') * t⁻¹ = + QuotientGroup.mk zK + have htK : (QuotientGroup.mk tK : P) = t := Quotient.out_eq' t + rw [← htK] + rfl + rw [htz] + rw [← D.mem_frobeniusFixedSubgroupWithin_iff E.base L + (hL.trans E.below) σ zK] + rw [← D.extensionSubgroup_frobeniusFixedField E.base L + (hL.trans E.below) σ] + rw [mem_extensionSubgroup_iff] + change zK.1 ∈ S.toSubgroup ↔ _ + simp [zK, kM, tK, mul_assoc] + +/-- The pointwise fixed-subgroup calculation above, upgraded to the +literal subgroup equality used to identify the stabilizer-coset fiber in +the transfer formula with the norm fiber. -/ +theorem transferNormNaturalityTransferFrobeniusLift_fixedSubgroup_map + (D : DegreeData G) [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + (σ : D.FrobeniusElements E.base L (hL.trans E.below)) + (q : Quotient (orbitRel (Subgroup.zpowers σ.1) + ((E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ + D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL))) : + let β := D.transferNormNaturalityTransferFrobeniusLift + E L hL σ q + let S := D.frobeniusFixedField E.base L (hL.trans E.below) σ + let tK : E.base.field.toSubgroup := Quotient.out q.out.out + let e := transferNormNaturalityIntermediateAbsoluteEquiv + E.base.field E.field.field E.below + (extensionSubgroup E.field.field + (D.frobeniusFixedField E.field L hL β) + (D.frobeniusFixedField_le E.field L hL β)).map e.toMonoidHom = + MulAction.stabilizer + (extensionSubgroup E.base.field E.field.field E.below) + (QuotientGroup.mk tK⁻¹ : + E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field S + (D.frobeniusFixedField_le E.base L + (hL.trans E.below) σ)) := by + dsimp only + let e := transferNormNaturalityIntermediateAbsoluteEquiv + E.base.field E.field.field E.below + ext kM + obtain ⟨k', rfl⟩ := e.surjective kM + change e k' ∈ Subgroup.map e.toMonoidHom _ ↔ _ + have hmem : e k' ∈ Subgroup.map e.toMonoidHom + (extensionSubgroup E.field.field + (D.frobeniusFixedField E.field L hL + (D.transferNormNaturalityTransferFrobeniusLift + E L hL σ q)) + (D.frobeniusFixedField_le E.field L hL + (D.transferNormNaturalityTransferFrobeniusLift + E L hL σ q))) ↔ + k' ∈ extensionSubgroup E.field.field + (D.frobeniusFixedField E.field L hL + (D.transferNormNaturalityTransferFrobeniusLift + E L hL σ q)) + (D.frobeniusFixedField_le E.field L hL + (D.transferNormNaturalityTransferFrobeniusLift + E L hL σ q)) := + Subgroup.mem_map_iff_mem e.injective + rw [hmem] + exact D.transferNormNaturalityTransferFrobeniusLift_mem_fixedSubgroup_iff_stabilizer + E L hL σ q k' + +end DegreeData + +namespace Internal + +/-- For each transfer double coset, the quotient by the fixed subgroup of +its Frobenius factor is the stabilizer-coset fiber in the corresponding +norm double coset. -/ +private noncomputable def chosenTransferNormNaturalityTransferNormFiberEquiv + (D : DegreeData G) [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (E : DegreeData.FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + (σ : D.FrobeniusElements E.base L (hL.trans E.below)) + (q : Quotient (orbitRel (Subgroup.zpowers σ.1) + ((E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ + D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL))) : + let β := D.transferNormNaturalityTransferFrobeniusLift + E L hL σ q + let S := D.frobeniusFixedField E.base L (hL.trans E.below) σ + let tK : E.base.field.toSubgroup := Quotient.out q.out.out + E.field.field.toSubgroup ⧸ extensionSubgroup E.field.field + (D.frobeniusFixedField E.field L hL β) + (D.frobeniusFixedField_le E.field L hL β) ≃ + (extensionSubgroup E.base.field E.field.field E.below) ⧸ + MulAction.stabilizer + (extensionSubgroup E.base.field E.field.field E.below) + (QuotientGroup.mk tK⁻¹ : + E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field S + (D.frobeniusFixedField_le E.base L + (hL.trans E.below) σ)) := by + dsimp only + let e := transferNormNaturalityIntermediateAbsoluteEquiv + E.base.field E.field.field E.below + let Sβsubgroup := extensionSubgroup E.field.field + (D.frobeniusFixedField E.field L hL + (D.transferNormNaturalityTransferFrobeniusLift E L hL σ q)) + (D.frobeniusFixedField_le E.field L hL + (D.transferNormNaturalityTransferFrobeniusLift E L hL σ q)) + have hEq := D.transferNormNaturalityTransferFrobeniusLift_fixedSubgroup_map + E L hL σ q + exact (leftCosetEquivOfMulEquiv e Sβsubgroup).trans + (Subgroup.quotientEquivOfEq hEq) + +@[simp] +private theorem chosenTransferNormNaturalityTransferNormFiberEquiv_mk + (D : DegreeData G) [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (E : DegreeData.FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + (σ : D.FrobeniusElements E.base L (hL.trans E.below)) + (q : Quotient (orbitRel (Subgroup.zpowers σ.1) + ((E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ + D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL))) + (k' : E.field.field.toSubgroup) : + Internal.chosenTransferNormNaturalityTransferNormFiberEquiv + D E L hL σ q (QuotientGroup.mk k') = + QuotientGroup.mk + (transferNormNaturalityIntermediateAbsoluteEquiv + E.base.field E.field.field E.below k') := by + unfold chosenTransferNormNaturalityTransferNormFiberEquiv + rfl + +end Internal + +end transferFrobeniusFibers + +section transferNormFibers + +/-! +Mathlib's `Rep ℤ G` requires its coefficient ring and acting group in the +same universe, so this representation-bearing portion has `G : Type 0`. +-/ +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace Internal + +/-- Under the fiber equivalence, a summand in the double-coset norm is +literally the corresponding summand in `N_{Σₜ/K'}`. -/ +private theorem transferNormNaturalityTransferNormFiber_term + (D : DegreeData G) (A : Rep ℤ G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (E : DegreeData.FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + (σ : D.FrobeniusElements E.base L (hL.trans E.below)) + (q : Quotient (orbitRel (Subgroup.zpowers σ.1) + ((E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ + D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL))) + (π : ambientFixedAddSubgroup A + (D.frobeniusFixedField E.base L (hL.trans E.below) σ)) : + let β := D.transferNormNaturalityTransferFrobeniusLift + E L hL σ q + let S := D.frobeniusFixedField E.base L (hL.trans E.below) σ + let hSK := D.frobeniusFixedField_le E.base L (hL.trans E.below) σ + let tK : E.base.field.toSubgroup := Quotient.out q.out.out + let C := conjugateClosedSubgroup S tK.1 + let Sβ := D.frobeniusFixedField E.field L hL β + let hSβK' := D.frobeniusFixedField_le E.field L hL β + ∀ (hSβC : Sβ.toSubgroup ≤ C.toSubgroup) + (kq : E.field.field.toSubgroup ⧸ + extensionSubgroup E.field.field Sβ hSβK'), + relativeCosetAction A E.base.field S hSK π + ((Internal.chosenTransferNormNaturalityTransferNormFiberEquiv + D E L hL σ q kq).out • + (QuotientGroup.mk tK⁻¹ : + E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field S hSK)) = + relativeCosetAction A E.field.field Sβ hSβK' + (fixedFieldInclusion A C Sβ hSβC + (conjugateFixedElement A S tK.1 π)) kq := by + dsimp only + let β := D.transferNormNaturalityTransferFrobeniusLift E L hL σ q + let S := D.frobeniusFixedField E.base L (hL.trans E.below) σ + let hSK := D.frobeniusFixedField_le E.base L (hL.trans E.below) σ + let tK : E.base.field.toSubgroup := Quotient.out q.out.out + let C := conjugateClosedSubgroup S tK.1 + let Sβ := D.frobeniusFixedField E.field L hL β + let hSβK' := D.frobeniusFixedField_le E.field L hL β + intro hSβC kq + refine QuotientGroup.induction_on kq ?_ + intro k' + let M := extensionSubgroup E.base.field E.field.field E.below + let φ : E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field S hSK := + QuotientGroup.mk tK⁻¹ + let kM : M := transferNormNaturalityIntermediateAbsoluteEquiv + E.base.field E.field.field E.below k' + let fiberEquiv := Internal.chosenTransferNormNaturalityTransferNormFiberEquiv + D E L hL σ q + let r : M ⧸ stabilizer M φ := fiberEquiv (QuotientGroup.mk k') + have hrmk : (QuotientGroup.mk r.out : M ⧸ stabilizer M φ) = + QuotientGroup.mk kM := by + calc + QuotientGroup.mk r.out = r := Quotient.out_eq' r + _ = fiberEquiv (QuotientGroup.mk k') := rfl + _ = QuotientGroup.mk kM := + Internal.chosenTransferNormNaturalityTransferNormFiberEquiv_mk + D E L hL σ q k' + have hrel : r.out⁻¹ * kM ∈ stabilizer M φ := + QuotientGroup.eq.mp hrmk + have hact : r.out • φ = kM • φ := by + have hh := congrArg (fun z => r.out • z) hrel + simpa [mul_smul] using hh.symm + change relativeCosetAction A E.base.field S hSK π (r.out • φ) = _ + rw [hact] + change relativeCosetAction A E.base.field S hSK π + (QuotientGroup.mk (kM.1 * tK⁻¹)) = _ + rw [relativeCosetAction_mk, relativeCosetAction_mk] + simp only [fixedFieldInclusion_coe, conjugateFixedElement_coe] + change A.ρ (k'.1 * tK.1⁻¹) π.1 = A.ρ k'.1 (A.ρ tK.1⁻¹ π.1) + rw [map_mul] + rfl + +/-- The inner double-coset sum for a transfer orbit is the relative norm +`N_{Σₜ/K'}(π^t)` appearing. -/ +private theorem transferNormNaturalityTransferNormFiber_sum + (D : DegreeData G) (A : Rep ℤ G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (E : DegreeData.FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + [hL'finite : Finite + (E.field.field.toSubgroup ⧸ extensionSubgroup E.field.field L hL)] + (σ : D.FrobeniusElements E.base L (hL.trans E.below)) + (q : Quotient (orbitRel (Subgroup.zpowers σ.1) + ((E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ + D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL))) + (π : ambientFixedAddSubgroup A + (D.frobeniusFixedField E.base L (hL.trans E.below) σ)) + (hSβC : + let β := D.transferNormNaturalityTransferFrobeniusLift + E L hL σ q + let S := D.frobeniusFixedField E.base L (hL.trans E.below) σ + let tK : E.base.field.toSubgroup := Quotient.out q.out.out + (D.frobeniusFixedField E.field L hL β).toSubgroup ≤ + (conjugateClosedSubgroup S tK.1).toSubgroup) : + let β := D.transferNormNaturalityTransferFrobeniusLift + E L hL σ q + let S := D.frobeniusFixedField E.base L (hL.trans E.below) σ + let hSK := D.frobeniusFixedField_le E.base L (hL.trans E.below) σ + let tK : E.base.field.toSubgroup := Quotient.out q.out.out + let C := conjugateClosedSubgroup S tK.1 + let Sβ := D.frobeniusFixedField E.field L hL β + let hSβK' := D.frobeniusFixedField_le E.field L hL β + let M := extensionSubgroup E.base.field E.field.field E.below + let φ : E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field S hSK := + QuotientGroup.mk tK⁻¹ + letI : Finite (E.field.field.toSubgroup ⧸ + extensionSubgroup E.field.field Sβ hSβK') := + D.frobeniusFixedField_finite E.field L hL β + letI : Fintype (E.field.field.toSubgroup ⧸ + extensionSubgroup E.field.field Sβ hSβK') := Fintype.ofFinite _ + let fiberEquiv := Internal.chosenTransferNormNaturalityTransferNormFiberEquiv + D E L hL σ q + letI : Fintype (M ⧸ stabilizer M φ) := + Fintype.ofEquiv + (E.field.field.toSubgroup ⧸ + extensionSubgroup E.field.field Sβ hSβK') fiberEquiv + ∑ r : M ⧸ stabilizer M φ, + relativeCosetAction A E.base.field S hSK π (r.out • φ) = + ((relativeNorm A E.field.field Sβ hSβK' + (fixedFieldInclusion A C Sβ hSβC + (conjugateFixedElement A S tK.1 π)) : + ambientFixedAddSubgroup A E.field.field) : A.V) := by + dsimp only + let β := D.transferNormNaturalityTransferFrobeniusLift E L hL σ q + let S := D.frobeniusFixedField E.base L (hL.trans E.below) σ + let hSK := D.frobeniusFixedField_le E.base L (hL.trans E.below) σ + let tK : E.base.field.toSubgroup := Quotient.out q.out.out + let C := conjugateClosedSubgroup S tK.1 + let Sβ := D.frobeniusFixedField E.field L hL β + let hSβK' := D.frobeniusFixedField_le E.field L hL β + let M := extensionSubgroup E.base.field E.field.field E.below + let φ : E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field S hSK := + QuotientGroup.mk tK⁻¹ + let : Finite (E.field.field.toSubgroup ⧸ + extensionSubgroup E.field.field Sβ hSβK') := + D.frobeniusFixedField_finite E.field L hL β + let : Fintype (E.field.field.toSubgroup ⧸ + extensionSubgroup E.field.field Sβ hSβK') := Fintype.ofFinite _ + let fiberEquiv := Internal.chosenTransferNormNaturalityTransferNormFiberEquiv + D E L hL σ q + let : Fintype (M ⧸ stabilizer M φ) := + Fintype.ofEquiv + (E.field.field.toSubgroup ⧸ + extensionSubgroup E.field.field Sβ hSβK') fiberEquiv + rw [relativeNorm_apply_coe, relativeNormValue] + calc + (∑ r : M ⧸ stabilizer M φ, + relativeCosetAction A E.base.field S hSK π (r.out • φ)) = + ∑ kq : E.field.field.toSubgroup ⧸ + extensionSubgroup E.field.field Sβ hSβK', + relativeCosetAction A E.base.field S hSK π + ((fiberEquiv kq).out • φ) := + (fiberEquiv.sum_comp + (fun r => relativeCosetAction A E.base.field S hSK π + (r.out • φ))).symm + _ = ∑ kq : E.field.field.toSubgroup ⧸ + extensionSubgroup E.field.field Sβ hSβK', + relativeCosetAction A E.field.field Sβ hSβK' + (fixedFieldInclusion A C Sβ hSβC + (conjugateFixedElement A S tK.1 π)) kq := by + apply Fintype.sum_congr + intro kq + exact Internal.transferNormNaturalityTransferNormFiber_term + D A E L hL σ q π hSβC kq + +end Internal + +end transferNormFibers + +section transferredFixedFields + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- The fixed field `Σₜ` of a transfer Frobenius factor is contained +in the conjugate field `Σ^t`. On absolute groups this is +`G_{Σₜ} ⊆ G_{Σ^t}` from. -/ +theorem transferNormNaturalityTransferFrobenius_fixedField_le_conjugate + (D : DegreeData G) [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + (σ : D.FrobeniusElements E.base L (hL.trans E.below)) + (q : Quotient (orbitRel (Subgroup.zpowers σ.1) + ((E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ + D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL))) : + let β := D.transferNormNaturalityTransferFrobeniusLift + E L hL σ q + let S := D.frobeniusFixedField E.base L (hL.trans E.below) σ + let tK : E.base.field.toSubgroup := Quotient.out q.out.out + let C := conjugateClosedSubgroup S tK.1 + let Sβ := D.frobeniusFixedField E.field L hL β + Sβ.toSubgroup ≤ C.toSubgroup := by + dsimp only + intro x hx + apply (conjugateClosedSubgroup_mem + (D.frobeniusFixedField E.base L (hL.trans E.below) σ) + (Quotient.out q.out.out).1 x).2 + let k' : E.field.field.toSubgroup := + ⟨x, (D.frobeniusFixedField_le E.field L hL + (D.transferNormNaturalityTransferFrobeniusLift E L hL σ q)) hx⟩ + have hxext : k' ∈ extensionSubgroup E.field.field + (D.frobeniusFixedField E.field L hL + (D.transferNormNaturalityTransferFrobeniusLift E L hL σ q)) + (D.frobeniusFixedField_le E.field L hL + (D.transferNormNaturalityTransferFrobeniusLift E L hL σ q)) := by + rw [mem_extensionSubgroup_iff] + exact hx + have hstab := + (D.transferNormNaturalityTransferFrobeniusLift_mem_fixedSubgroup_iff_stabilizer + E L hL σ q k').1 hxext + have hmem := + (mem_relativeNormDoubleCoset_stabilizer_iff + E.base.field E.field.field + (D.frobeniusFixedField E.base L (hL.trans E.below) σ) + (D.frobeniusFixedField_le E.base L (hL.trans E.below) σ) + E.below (Quotient.out q.out.out)⁻¹ + (⟨Subgroup.inclusion E.below k', k'.2⟩ : + extensionSubgroup E.base.field E.field.field E.below)).1 hstab + change + ((Quotient.out q.out.out)⁻¹).1⁻¹ * + (Subgroup.inclusion E.below k').1 * + ((Quotient.out q.out.out)⁻¹).1 ∈ + (D.frobeniusFixedField E.base L (hL.trans E.below) σ).toSubgroup at hmem + have heq : + ((Quotient.out q.out.out)⁻¹).1⁻¹ * + (Subgroup.inclusion E.below k').1 * + ((Quotient.out q.out.out)⁻¹).1 = + (Quotient.out q.out.out).1 * x * + (Quotient.out q.out.out).1⁻¹ := by + simp [k'] + rw [heq] at hmem + exact hmem + +/-- The extension `Σₜ | Σ^t` attached to one transfer orbit is +unramified, as asserted. -/ +theorem transferNormNaturalityTransferFrobenius_fixedField_isUnramified_conjugate + (D : DegreeData G) [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + (σ : D.FrobeniusElements E.base L (hL.trans E.below)) + (q : Quotient (orbitRel (Subgroup.zpowers σ.1) + ((E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ + D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL))) : + let β := D.transferNormNaturalityTransferFrobeniusLift + E L hL σ q + let S := D.frobeniusFixedField E.base L (hL.trans E.below) σ + let tK : E.base.field.toSubgroup := Quotient.out q.out.out + let C := conjugateClosedSubgroup S tK.1 + let Sβ := D.frobeniusFixedField E.field L hL β + let hSβC := D.transferNormNaturalityTransferFrobenius_fixedField_le_conjugate + E L hL σ q + (DegreeData.AbstractExtension.mk Sβ C hSβC).IsUnramified D := by + dsimp only + let β := D.transferNormNaturalityTransferFrobeniusLift E L hL σ q + let S := D.frobeniusFixedField E.base L (hL.trans E.below) σ + let tK : E.base.field.toSubgroup := Quotient.out q.out.out + let C := conjugateClosedSubgroup S tK.1 + let Sβ := D.frobeniusFixedField E.field L hL β + have hSβC : Sβ.toSubgroup ≤ C.toSubgroup := by + exact D.transferNormNaturalityTransferFrobenius_fixedField_le_conjugate + E L hL σ q + rw [(DegreeData.AbstractExtension.mk Sβ C hSβC).isUnramified_iff_inertia_le D] + intro x hx + have hxC : x ∈ C.toSubgroup := hx.1 + have hxd : D.degree x = 1 := hx.2 + have hconjS : tK.1 * x * tK.1⁻¹ ∈ S.toSubgroup := by + exact (conjugateClosedSubgroup_mem S tK.1 x).1 hxC + have hconjd : D.degree (tK.1 * x * tK.1⁻¹) = 1 := by + rw [map_mul, map_mul, map_inv, hxd] + simp + have hconjI : tK.1 * x * tK.1⁻¹ ∈ + (D.fieldInertia S).toSubgroup := by + exact ⟨hconjS, hconjd⟩ + have hconjIL : tK.1 * x * tK.1⁻¹ ∈ + (D.fieldInertia L).toSubgroup := by + rw [← D.frobeniusFixedField_fieldInertia + E.base L (hL.trans E.below) σ] + exact hconjI + have hxK : x ∈ E.base.field.toSubgroup := by + have hconjK : tK.1 * x * tK.1⁻¹ ∈ E.base.field.toSubgroup := + (D.frobeniusFixedField_le E.base L (hL.trans E.below) σ) hconjS + have hback := E.base.field.toSubgroup.mul_mem + (E.base.field.toSubgroup.mul_mem + (E.base.field.toSubgroup.inv_mem tK.2) hconjK) tK.2 + simpa [mul_assoc] using hback + let xK : E.base.field.toSubgroup := ⟨x, hxK⟩ + let yK : E.base.field.toSubgroup := + ⟨tK.1 * x * tK.1⁻¹, + E.base.field.toSubgroup.mul_mem + (E.base.field.toSubgroup.mul_mem tK.2 hxK) + (E.base.field.toSubgroup.inv_mem tK.2)⟩ + have hyL : yK ∈ + extensionSubgroup E.base.field L (hL.trans E.below) := by + rw [mem_extensionSubgroup_iff] + exact hconjIL.1 + have hxLext : xK ∈ + extensionSubgroup E.base.field L (hL.trans E.below) := by + have hback := hLnormal.conj_mem yK hyL tK⁻¹ + simpa [xK, yK, tK, mul_assoc] using hback + have hxL : x ∈ L.toSubgroup := by + exact (mem_extensionSubgroup_iff E.base.field L + (hL.trans E.below) xK).1 hxLext + have hxIL : x ∈ (D.fieldInertia L).toSubgroup := ⟨hxL, hxd⟩ + have hxISβ : x ∈ (D.fieldInertia Sβ).toSubgroup := by + rw [D.frobeniusFixedField_fieldInertia E.field L hL β] + exact hxIL + exact hxISβ.1 + +end DegreeData + +end transferredFixedFields + +section transferNormArithmetic + +/-! +Mathlib's `Rep ℤ G` requires its coefficient ring and acting group in the +same universe, so this representation-bearing portion has `G : Type 0`. +-/ +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- If `π` is prime in `Σ`, its conjugate `π^t`, included into the +unramified extension `Σₜ`, remains prime. -/ +theorem transferNormNaturalityTransferFrobenius_conjugatePrime_isPrime + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (F : FiniteAbstractFieldExtension G) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ F.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup F.base.field L (hL.trans F.below)).Normal] + [hL'normal : (extensionSubgroup F.field.field L hL).Normal] + [hLfinite : Finite + (F.field.field.toSubgroup ⧸ extensionSubgroup F.field.field L hL)] + (σ : D.FrobeniusElements + (F.toFiniteResidueAbstractExtension D).base L + (hL.trans F.below) (hLnormal := by + change (extensionSubgroup F.base.field L + (hL.trans F.below)).Normal + exact hLnormal)) + (q : + letI : (extensionSubgroup + (F.toFiniteResidueAbstractExtension D).base.field L + (hL.trans F.below)).Normal := by + change (extensionSubgroup F.base.field L + (hL.trans F.below)).Normal + exact hLnormal + letI : (extensionSubgroup + (F.toFiniteResidueAbstractExtension D).field.field L hL).Normal := by + change (extensionSubgroup F.field.field L hL).Normal + exact hL'normal + Quotient (orbitRel (Subgroup.zpowers σ.1) + (((F.toFiniteResidueAbstractExtension D).base.field.toSubgroup ⧸ + D.extensionInertiaWithin + (F.toFiniteResidueAbstractExtension D).base.field L + (hL.trans F.below)) ⧸ + D.transferNormNaturalityFrobeniusIntermediateSubgroup + (F.toFiniteResidueAbstractExtension D) L hL + (hLnormal := by + change (extensionSubgroup F.base.field L + (hL.trans F.below)).Normal + exact hLnormal) + (hL'normal := by + change (extensionSubgroup F.field.field L hL).Normal + exact hL'normal)))) + (π : ambientFixedAddSubgroup A + (D.frobeniusFixedField + (F.toFiniteResidueAbstractExtension D).base L + (hL.trans F.below) (hLnormal := by + change (extensionSubgroup F.base.field L + (hL.trans F.below)).Normal + exact hLnormal) σ)) + (hπ : + let KR := (F.toFiniteResidueAbstractExtension D).base + letI : + (extensionSubgroup KR.field L (hL.trans F.below)).Normal := by + change (extensionSubgroup F.base.field L + (hL.trans F.below)).Normal + exact hLnormal + let T : FiniteTower G := { + top := L + middle := F.field.field + base := F.base.field + top_le_middle := hL + middle_le_base := F.below + finiteTopQuotient := hLfinite + finiteBaseQuotient := F.finiteQuotient } + letI : Finite (F.base.field.toSubgroup ⧸ + extensionSubgroup F.base.field L (hL.trans F.below)) := + T.totalQuotientFinite + let S := D.frobeniusFixedField + KR L (hL.trans F.below) σ + let Sfinite : FiniteAbstractField G := { + field := S + finite := D.frobeniusFixedField_absoluteFinite + F.base L (hL.trans F.below) σ } + v.IsPrimeElement Sfinite π) : + let E := F.toFiniteResidueAbstractExtension D + letI hLnormalE : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal := by + change (extensionSubgroup F.base.field L + (hL.trans F.below)).Normal + exact hLnormal + letI hL'normalE : (extensionSubgroup E.field.field L hL).Normal := by + change (extensionSubgroup F.field.field L hL).Normal + exact hL'normal + let T : FiniteTower G := { + top := L + middle := F.field.field + base := F.base.field + top_le_middle := hL + middle_le_base := F.below + finiteTopQuotient := hLfinite + finiteBaseQuotient := F.finiteQuotient } + letI : Finite (F.base.field.toSubgroup ⧸ + extensionSubgroup F.base.field L (hL.trans F.below)) := + T.totalQuotientFinite + let β := D.transferNormNaturalityTransferFrobeniusLift + E L hL σ q + let S := D.frobeniusFixedField E.base L (hL.trans E.below) σ + let Sfinite : FiniteAbstractField G := { + field := S + finite := by + simpa [E, S, + FiniteAbstractFieldExtension.toFiniteResidueAbstractExtension, + FiniteAbstractField.toFiniteResidueAbstractField] using + D.frobeniusFixedField_absoluteFinite + F.base L (hL.trans F.below) σ } + let tK : E.base.field.toSubgroup := Quotient.out q.out.out + let Cfinite := Sfinite.conjugate tK.1 + let Sβ := D.frobeniusFixedField E.field L hL β + let Sβfinite : FiniteAbstractField G := { + field := Sβ + finite := by + simpa [E, Sβ, + FiniteAbstractFieldExtension.toFiniteResidueAbstractExtension, + FiniteAbstractField.toFiniteResidueAbstractField] using + D.frobeniusFixedField_absoluteFinite F.field L hL β } + let hSβC : Sβfinite.field.toSubgroup ≤ Cfinite.field.toSubgroup := by + change Sβ.toSubgroup ≤ + (conjugateClosedSubgroup S tK.1).toSubgroup + exact D.transferNormNaturalityTransferFrobenius_fixedField_le_conjugate + E L hL σ q + v.IsPrimeElement Sβfinite + (fixedFieldInclusion A Cfinite.field Sβfinite.field hSβC + (conjugateFixedElement A S tK.1 π)) := by + dsimp only + let E := F.toFiniteResidueAbstractExtension D + let hLnormalE : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal := by + change (extensionSubgroup F.base.field L + (hL.trans F.below)).Normal + exact hLnormal + let hL'normalE : (extensionSubgroup E.field.field L hL).Normal := by + change (extensionSubgroup F.field.field L hL).Normal + exact hL'normal + let T : FiniteTower G := { + top := L + middle := F.field.field + base := F.base.field + top_le_middle := hL + middle_le_base := F.below + finiteTopQuotient := hLfinite + finiteBaseQuotient := F.finiteQuotient } + let hLbaseFinite : Finite (F.base.field.toSubgroup ⧸ + extensionSubgroup F.base.field L (hL.trans F.below)) := + T.totalQuotientFinite + let β := D.transferNormNaturalityTransferFrobeniusLift + E L hL σ q + let S := D.frobeniusFixedField E.base L (hL.trans E.below) σ + let Sfinite : FiniteAbstractField G := { + field := S + finite := by + simpa [E, S, + FiniteAbstractFieldExtension.toFiniteResidueAbstractExtension, + FiniteAbstractField.toFiniteResidueAbstractField] using + D.frobeniusFixedField_absoluteFinite + F.base L (hL.trans F.below) σ } + let tK : E.base.field.toSubgroup := Quotient.out q.out.out + let Cfinite := Sfinite.conjugate tK.1 + let Sβ := D.frobeniusFixedField E.field L hL β + let Sβfinite : FiniteAbstractField G := { + field := Sβ + finite := by + simpa [E, Sβ, + FiniteAbstractFieldExtension.toFiniteResidueAbstractExtension, + FiniteAbstractField.toFiniteResidueAbstractField] using + D.frobeniusFixedField_absoluteFinite F.field L hL β } + let hSβC : Sβfinite.field.toSubgroup ≤ Cfinite.field.toSubgroup := by + change Sβ.toSubgroup ≤ + (conjugateClosedSubgroup S tK.1).toSubgroup + exact D.transferNormNaturalityTransferFrobenius_fixedField_le_conjugate + E L hL σ q + let hSβabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) Sβfinite.field + (le_baseField Sβfinite.field)) := + Sβfinite.finite + let hSβCfinite : Finite + (Cfinite.field.toSubgroup ⧸ + extensionSubgroup Cfinite.field Sβfinite.field hSβC) := + FiniteIntermediateField.finite_extension_of_le + (le_baseField Sβfinite.field) (le_baseField Cfinite.field) hSβC + let EβC : FiniteAbstractFieldExtension G := { + field := Sβfinite + base := Cfinite + below := hSβC + finiteQuotient := hSβCfinite } + let πC : ambientFixedAddSubgroup A Cfinite.field := + conjugateFixedElement A S tK.1 π + have hπC : v.IsPrimeElement Cfinite πC := by + rw [ValuationData.IsPrimeElement] + rw [show v.valuationAt Cfinite πC = v.valuationAt Sfinite π by + simpa [Cfinite, Sfinite, πC] using + v.normalizedValuation_conjugate Sfinite tK.1 π] + exact hπ + have hUn : EβC.IsUnramified D := by + exact D.transferNormNaturalityTransferFrobenius_fixedField_isUnramified_conjugate + E L hL σ q + exact v.prime_of_unramified EβC hUn πC hπC + +/-- The norm identity for transfer--norm naturality: +`N_{Σ/K}(π)` is the sum, over transfer double cosets, of +`N_{Σₜ/K'}(π^t)`. The construction writes this identity multiplicatively. -/ +theorem transferNormNaturalityNorm_eq_sum_transferNorms + (D : DegreeData G) (A : Rep ℤ G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (F : FiniteAbstractFieldExtension G) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ F.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup F.base.field L (hL.trans F.below)).Normal] + [hLfinite : Finite + (F.field.field.toSubgroup ⧸ extensionSubgroup F.field.field L hL)] + (σ : D.FrobeniusElements + (F.toFiniteResidueAbstractExtension D).base L + (hL.trans F.below) (hLnormal := by + change (extensionSubgroup F.base.field L + (hL.trans F.below)).Normal + exact hLnormal)) + (π : ambientFixedAddSubgroup A + (D.frobeniusFixedField + (F.toFiniteResidueAbstractExtension D).base L + (hL.trans F.below) (hLnormal := by + change (extensionSubgroup F.base.field L + (hL.trans F.below)).Normal + exact hLnormal) σ)) : + let E := F.toFiniteResidueAbstractExtension D + letI hLnormalE : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal := by + change (extensionSubgroup F.base.field L + (hL.trans F.below)).Normal + exact hLnormal + let T : FiniteTower G := { + top := L + middle := F.field.field + base := F.base.field + top_le_middle := hL + middle_le_base := F.below + finiteTopQuotient := hLfinite + finiteBaseQuotient := F.finiteQuotient } + letI : Finite (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field L (hL.trans E.below)) := by + change Finite (F.base.field.toSubgroup ⧸ + extensionSubgroup F.base.field L (hL.trans F.below)) + exact T.totalQuotientFinite + letI : Finite (E.field.field.toSubgroup ⧸ + extensionSubgroup E.field.field L hL) := by + change Finite (F.field.field.toSubgroup ⧸ + extensionSubgroup F.field.field L hL) + exact hLfinite + letI : (extensionSubgroup E.field.field L hL).Normal := + transferNormNaturality_intermediateExtension_normal + E.base.field E.field.field L hL E.below + let S := D.frobeniusFixedField E.base L (hL.trans E.below) σ + let hSK := D.frobeniusFixedField_le E.base L (hL.trans E.below) σ + let M := extensionSubgroup E.base.field E.field.field E.below + let ΩN := Quotient (orbitRel M + (E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field S hSK)) + letI : Finite (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field S hSK) := + D.frobeniusFixedField_finite E.base L (hL.trans E.below) σ + letI : Fintype ΩN := Fintype.ofFinite _ + ((fixedFieldInclusion A E.base.field E.field.field E.below + (relativeNorm A E.base.field S hSK π) : + ambientFixedAddSubgroup A E.field.field) : A.V) = + ∑ qN : ΩN, + let qT := (D.transferNormNaturalityTransferNormOrbitEquiv + E L hL σ).symm qN + let β := D.transferNormNaturalityTransferFrobeniusLift + E L hL σ qT + let tK : E.base.field.toSubgroup := Quotient.out qT.out.out + let C := conjugateClosedSubgroup S tK.1 + let Sβ := D.frobeniusFixedField E.field L hL β + let hSβK' := D.frobeniusFixedField_le E.field L hL β + let hSβC : Sβ.toSubgroup ≤ C.toSubgroup := + D.transferNormNaturalityTransferFrobenius_fixedField_le_conjugate + E L hL σ qT + letI : Finite (E.field.field.toSubgroup ⧸ + extensionSubgroup E.field.field Sβ hSβK') := + D.frobeniusFixedField_finite E.field L hL β + ((relativeNorm A E.field.field Sβ hSβK' + (fixedFieldInclusion A C Sβ hSβC + (conjugateFixedElement A S tK.1 π)) : + ambientFixedAddSubgroup A E.field.field) : A.V) := by + dsimp only + let E := F.toFiniteResidueAbstractExtension D + let hLnormalE : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal := by + change (extensionSubgroup F.base.field L + (hL.trans F.below)).Normal + exact hLnormal + let T : FiniteTower G := { + top := L + middle := F.field.field + base := F.base.field + top_le_middle := hL + middle_le_base := F.below + finiteTopQuotient := hLfinite + finiteBaseQuotient := F.finiteQuotient } + let hLbaseFinite : Finite (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field L (hL.trans E.below)) := by + change Finite (F.base.field.toSubgroup ⧸ + extensionSubgroup F.base.field L (hL.trans F.below)) + exact T.totalQuotientFinite + let hLfieldFinite : Finite (E.field.field.toSubgroup ⧸ + extensionSubgroup E.field.field L hL) := by + change Finite (F.field.field.toSubgroup ⧸ + extensionSubgroup F.field.field L hL) + exact hLfinite + let hL'normal : (extensionSubgroup E.field.field L hL).Normal := + transferNormNaturality_intermediateExtension_normal + E.base.field E.field.field L hL E.below + let S := D.frobeniusFixedField E.base L (hL.trans E.below) σ + let hSK := D.frobeniusFixedField_le E.base L (hL.trans E.below) σ + let M := extensionSubgroup E.base.field E.field.field E.below + let ΩN := Quotient (orbitRel M + (E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field S hSK)) + let φ : ΩN → + E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field S hSK := + Internal.chosenTransferNormNaturalityNormOrbitRepresentative + D E L hL σ + let : Finite (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field S hSK) := + D.frobeniusFixedField_finite E.base L (hL.trans E.below) σ + let : Fintype ΩN := Fintype.ofFinite _ + let (qN : ΩN) : Fintype (M ⧸ stabilizer M (φ qN)) := by + letI : Finite (orbit M (φ qN)) := + Finite.of_injective Subtype.val Subtype.val_injective + letI := Fintype.ofFinite (orbit M (φ qN)) + exact Fintype.ofEquiv (orbit M (φ qN)) + (orbitEquivQuotientStabilizer M (φ qN)) + change ((relativeNorm A E.base.field S hSK π : + ambientFixedAddSubgroup A E.base.field) : A.V) = _ + rw [relativeNorm_eq_sum_chosenOrbit_of_fintype A E.base.field S hSK M + (Internal.chosenTransferNormNaturalityNormOrbitRepresentative_spec + D E L hL σ) π] + apply Fintype.sum_congr + intro qN + let qT := (D.transferNormNaturalityTransferNormOrbitEquiv + E L hL σ).symm qN + let β := D.transferNormNaturalityTransferFrobeniusLift + E L hL σ qT + let tK : E.base.field.toSubgroup := Quotient.out qT.out.out + let C := conjugateClosedSubgroup S tK.1 + let Sβ := D.frobeniusFixedField E.field L hL β + let hSβK' := D.frobeniusFixedField_le E.field L hL β + let hSβC : Sβ.toSubgroup ≤ C.toSubgroup := + D.transferNormNaturalityTransferFrobenius_fixedField_le_conjugate + E L hL σ qT + let fiberEquiv : + (E.field.field.toSubgroup ⧸ extensionSubgroup E.field.field Sβ hSβK') ≃ + (M ⧸ stabilizer M (φ qN)) := + Internal.chosenTransferNormNaturalityTransferNormFiberEquiv D E L hL σ qT + let : Finite (E.field.field.toSubgroup ⧸ + extensionSubgroup E.field.field Sβ hSβK') := + D.frobeniusFixedField_finite E.field L hL β + let : Fintype (E.field.field.toSubgroup ⧸ + extensionSubgroup E.field.field Sβ hSβK') := + Fintype.ofFinite _ + rw [relativeNorm_apply_coe, relativeNormValue] + calc + (∑ r : M ⧸ stabilizer M (φ qN), + relativeCosetAction A E.base.field S hSK π + ((MulAction.selfEquivSigmaOrbitsQuotientStabilizer' + M (E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field S hSK) + (Internal.chosenTransferNormNaturalityNormOrbitRepresentative_spec + D E L hL σ)).symm ⟨qN, r⟩)) = + ∑ r : M ⧸ stabilizer M (φ qN), + relativeCosetAction A E.base.field S hSK π (r.out • φ qN) := by + apply Fintype.sum_congr + intro r + rw [chosenOrbitClassEquiv_symm_apply] + _ = ∑ kq : E.field.field.toSubgroup ⧸ + extensionSubgroup E.field.field Sβ hSβK', + relativeCosetAction A E.base.field S hSK π + ((fiberEquiv kq).out • φ qN) := + (fiberEquiv.sum_comp + (fun r => relativeCosetAction A E.base.field S hSK π + (r.out • φ qN))).symm + _ = ∑ kq : E.field.field.toSubgroup ⧸ + extensionSubgroup E.field.field Sβ hSβK', + relativeCosetAction A E.field.field Sβ hSβK' + (fixedFieldInclusion A C Sβ hSβC + (conjugateFixedElement A S tK.1 π)) kq := by + apply Fintype.sum_congr + intro kq + exact Internal.transferNormNaturalityTransferNormFiber_term + D A E L hL σ qT π hSβC kq + +end DegreeData + +end transferNormArithmetic + +section frobeniusTransfer + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- The classical transfer on the groups +`G(\widetilde L/K) → G(\widetilde L/K')`, before passage to the finite +Galois quotient. -/ +noncomputable def transferNormNaturalityFrobeniusTransfer + (D : DegreeData G) [IsTopologicalGroup G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] : + Abelianization (E.base.field.toSubgroup ⧸ + D.extensionInertiaWithin E.base.field L (hL.trans E.below)) →* + Abelianization (E.field.field.toSubgroup ⧸ + D.extensionInertiaWithin E.field.field L hL) := by + let H := D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL + letI : H.FiniteIndex := + D.transferNormNaturalityFrobeniusIntermediateFiniteIndex E L hL + let e := D.transferNormNaturalityFrobeniusIntermediateEquiv + E L hL + exact e.symm.abelianizationCongr.toMonoidHom.comp + (Abelianization.lift + (MonoidHom.transfer (Abelianization.of : H →* Abelianization H))) + +/-- The double-coset formula for the preceding Frobenius-level transfer. +Every factor is the positive Frobenius lift constructed above. -/ +theorem transferNormNaturalityFrobeniusTransfer_doubleCoset_formula + (D : DegreeData G) [IsTopologicalGroup G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + (σ : E.base.field.toSubgroup ⧸ + D.extensionInertiaWithin E.base.field L (hL.trans E.below)) : + let H := D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL + letI : H.FiniteIndex := + D.transferNormNaturalityFrobeniusIntermediateFiniteIndex E L hL + letI : Fintype (Quotient (orbitRel (Subgroup.zpowers σ) + ((E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ H))) := + Fintype.ofFinite _ + D.transferNormNaturalityFrobeniusTransfer E L hL + (Abelianization.of σ) = + ∏ q : Quotient (orbitRel (Subgroup.zpowers σ) + ((E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ H)), + Abelianization.of + ((D.transferNormNaturalityFrobeniusIntermediateEquiv + E L hL).symm + ⟨q.out.out⁻¹ * σ ^ Function.minimalPeriod (σ • ·) q.out * + q.out.out, + QuotientGroup.out_conj_pow_minimalPeriod_mem + H σ q.out⟩) := by + dsimp only + let H := D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL + let : H.FiniteIndex := + D.transferNormNaturalityFrobeniusIntermediateFiniteIndex E L hL + let := Fintype.ofFinite + (Quotient (orbitRel (Subgroup.zpowers σ) + ((E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ H))) + unfold transferNormNaturalityFrobeniusTransfer + simp only [MonoidHom.comp_apply, Abelianization.lift_apply_of] + rw [MonoidHom.transfer_eq_prod_quotient_orbitRel_zpowers_quot] + rw [map_prod] + apply Finset.prod_congr rfl + intro q _ + exact abelianizationCongr_of + (D.transferNormNaturalityFrobeniusIntermediateEquiv + E L hL).symm _ + +end DegreeData +end frobeniusTransfer +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobeniusGeometry.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobeniusGeometry.lean new file mode 100644 index 0000000000..9bdb7b877b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobeniusGeometry.lean @@ -0,0 +1,497 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.DoubleCosetOrbitGeometry +/-! +# Transfer--norm Frobenius geometry + +For a finite Galois extension and an intermediate field, this module builds the +Frobenius-side subgroup and orbit equivalences used in transfer--norm +naturality. The reusable orbit and double-coset constructions are isolated in +`DoubleCosetOrbitGeometry`. +-/ + +@[expose] public section + +universe u + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology +open CategoryTheory + +noncomputable +section + +open scoped BigOperators +open MulAction + +section transferFrobeniusGeometry + +variable {G : Type u} [Group G] [TopologicalSpace G] + +/-- The absolute group of an intermediate field, identified with its +literal copy inside the absolute group of the base field. -/ +noncomputable def transferNormNaturalityIntermediateAbsoluteEquiv + (K K' : ClosedSubgroup G) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) : + K'.toSubgroup ≃* extensionSubgroup K K' hK'K := + MulEquiv.ofBijective + ((Subgroup.inclusion hK'K).codRestrict + (extensionSubgroup K K' hK'K) (fun k' => k'.2)) + ⟨fun _ _ h => Subtype.ext (congrArg (fun z => z.1.1) h), by + rintro ⟨k, hk'⟩ + let k' : K'.toSubgroup := ⟨k.1, hk'⟩ + exact ⟨k', Subtype.ext rfl⟩⟩ + +/-- The absolute intermediate-field equivalence evaluates by the underlying transfer map. -/ +@[simp] +theorem transferNormNaturalityIntermediateAbsoluteEquiv_apply + (K K' : ClosedSubgroup G) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + (k' : K'.toSubgroup) : + ((transferNormNaturalityIntermediateAbsoluteEquiv K K' hK'K k').1 : G) = k'.1 := + rfl + +/-- Normality of `L | K` restricts to every intermediate field `K'`. -/ +theorem transferNormNaturality_intermediateExtension_normal + (K K' L : ClosedSubgroup G) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L (hLK'.trans hK'K)).Normal] : + (extensionSubgroup K' L hLK').Normal := by + have hcomap : extensionSubgroup K' L hLK' = + (extensionSubgroup K L (hLK'.trans hK'K)).comap + (Subgroup.inclusion hK'K) := by + ext k' + rw [Subgroup.mem_comap, mem_extensionSubgroup_iff, + mem_extensionSubgroup_iff] + rfl + rw [hcomap] + exact hLnormal.comap (Subgroup.inclusion hK'K) + +namespace DegreeData + +/-- The restriction map on the infinite Frobenius quotients is injective +when the top field is unchanged. -/ +theorem transferNormNaturalityFrobeniusTowerMap_injective + (D : DegreeData G) [IsTopologicalGroup G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] : + Function.Injective + (D.finiteReciprocityNaturalityFrobeniusTowerMap + E.base.field E.field.field L L + (hL.trans E.below) hL E.below le_rfl) := by + intro x y + refine QuotientGroup.induction_on x ?_ + intro k' + refine QuotientGroup.induction_on y ?_ + intro l' h + apply QuotientGroup.eq.mpr + have hmem : + (Subgroup.inclusion E.below k')⁻¹ * Subgroup.inclusion E.below l' ∈ + D.extensionInertiaWithin E.base.field L (hL.trans E.below) := + QuotientGroup.eq.mp h + constructor + · apply (mem_extensionSubgroup_iff E.field.field L hL (k'⁻¹ * l')).2 + have hG := (mem_extensionSubgroup_iff E.base.field L + (hL.trans E.below) + ((Subgroup.inclusion E.below k')⁻¹ * + Subgroup.inclusion E.below l')).1 hmem.1 + simpa using hG + · have hI := hmem.2 + change D.degree (((Subgroup.inclusion E.below k')⁻¹ * + Subgroup.inclusion E.below l' : E.base.field.toSubgroup) : G) = 1 at hI + change D.degree ((k'⁻¹ * l' : E.field.field.toSubgroup) : G) = 1 + exact hI + +/-- The copy of `G(\widetilde L/K')` inside +`G(\widetilde L/K)`. This is the subgroup `H` used in the classical +double-coset proof of transfer--norm naturality. -/ +def transferNormNaturalityFrobeniusIntermediateSubgroup + (D : DegreeData G) [IsTopologicalGroup G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] : + Subgroup (E.base.field.toSubgroup ⧸ + D.extensionInertiaWithin E.base.field L (hL.trans E.below)) := + (D.finiteReciprocityNaturalityFrobeniusTowerMap + E.base.field E.field.field L L + (hL.trans E.below) hL E.below le_rfl).range + +/-- The subgroup above is also the image of `G_K'` under the quotient +projection `G_K → G(\widetilde L/K)`. -/ +theorem transferNormNaturalityFrobeniusIntermediateSubgroup_eq_map + (D : DegreeData G) [IsTopologicalGroup G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] : + D.transferNormNaturalityFrobeniusIntermediateSubgroup E L hL = + (extensionSubgroup E.base.field E.field.field E.below).map + (QuotientGroup.mk' + (D.extensionInertiaWithin E.base.field L + (hL.trans E.below))) := by + ext q + constructor + · rintro ⟨x, rfl⟩ + refine QuotientGroup.induction_on x ?_ + intro k' + refine ⟨Subgroup.inclusion E.below k', ?_, rfl⟩ + exact k'.2 + · rintro ⟨k, hk', rfl⟩ + let k' : E.field.field.toSubgroup := ⟨k.1, hk'⟩ + refine ⟨QuotientGroup.mk k', ?_⟩ + change QuotientGroup.mk (Subgroup.inclusion E.below k') = + QuotientGroup.mk k + rfl + +/-- Quotient projection maps the literal absolute subgroup belonging to +`K'` onto its copy `H` inside `G(\widetilde L/K)`. -/ +noncomputable def transferNormNaturalityIntermediateToFrobeniusSubgroup + (D : DegreeData G) [IsTopologicalGroup G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] : + extensionSubgroup E.base.field E.field.field E.below →* + D.transferNormNaturalityFrobeniusIntermediateSubgroup E L hL := by + refine ((QuotientGroup.mk' + (D.extensionInertiaWithin E.base.field L (hL.trans E.below))).comp + (extensionSubgroup E.base.field E.field.field E.below).subtype).codRestrict + (D.transferNormNaturalityFrobeniusIntermediateSubgroup E L hL) ?_ + intro m + change QuotientGroup.mk m.1 ∈ + D.transferNormNaturalityFrobeniusIntermediateSubgroup E L hL + rw [D.transferNormNaturalityFrobeniusIntermediateSubgroup_eq_map + E L hL] + exact ⟨m.1, m.2, rfl⟩ + +/-- The map from the intermediate quotient onto the Frobenius subgroup is surjective. -/ +theorem transferNormNaturalityIntermediateToFrobeniusSubgroup_surjective + (D : DegreeData G) [IsTopologicalGroup G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] : + Function.Surjective + (D.transferNormNaturalityIntermediateToFrobeniusSubgroup + E L hL) := by + intro h + have hh : h.1 ∈ + (extensionSubgroup E.base.field E.field.field E.below).map + (QuotientGroup.mk' + (D.extensionInertiaWithin E.base.field L (hL.trans E.below))) := by + rw [← D.transferNormNaturalityFrobeniusIntermediateSubgroup_eq_map + E L hL] + exact h.2 + obtain ⟨m, hm, hval⟩ := hh + refine ⟨⟨m, hm⟩, ?_⟩ + apply Subtype.ext + unfold transferNormNaturalityIntermediateToFrobeniusSubgroup + simpa only [MonoidHom.codRestrict_apply, MonoidHom.comp_apply, + Subgroup.subtype_apply] using hval + +/-- The intermediate-to-Frobenius map has the stated value on each representative. -/ +@[simp] +theorem transferNormNaturalityIntermediateToFrobeniusSubgroup_apply + (D : DegreeData G) [IsTopologicalGroup G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + (m : extensionSubgroup E.base.field E.field.field E.below) : + (D.transferNormNaturalityIntermediateToFrobeniusSubgroup + E L hL m).1 = + (QuotientGroup.mk m.1 : E.base.field.toSubgroup ⧸ + D.extensionInertiaWithin E.base.field L (hL.trans E.below)) := by + rfl + +/-- The canonical coset equivalence from `G_K/G_Σ` to +`G(\widetilde L/K)/Γ` intertwines the two copies of the `K'`-action. -/ +theorem frobeniusFixedCosetClosureEquiv_equivariant + (D : DegreeData G) [IsTopologicalGroup G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + (σ : D.FrobeniusElements E.base L (hL.trans E.below)) + (m : extensionSubgroup E.base.field E.field.field E.below) + (x : E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field + (D.frobeniusFixedField E.base L (hL.trans E.below) σ) + (D.frobeniusFixedField_le E.base L (hL.trans E.below) σ)) : + D.frobeniusFixedCosetClosureEquiv E.base L (hL.trans E.below) σ (m • x) = + (D.transferNormNaturalityIntermediateToFrobeniusSubgroup + E L hL m) • + D.frobeniusFixedCosetClosureEquiv E.base L + (hL.trans E.below) σ x := by + refine Quotient.inductionOn' x ?_ + intro k + change QuotientGroup.mk (QuotientGroup.mk (m.1 * k)) = + QuotientGroup.mk + ((D.transferNormNaturalityIntermediateToFrobeniusSubgroup + E L hL m).1 * QuotientGroup.mk k) + rw [D.transferNormNaturalityIntermediateToFrobeniusSubgroup_apply] + rfl + +/-- Restriction from the infinite Frobenius quotient onto the finite +Galois quotient is surjective. -/ +theorem transferNormNaturalityExtensionRestriction_surjective + (D : DegreeData G) + (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] : + Function.Surjective (D.extensionRestriction K L hLK) := by + intro q + refine QuotientGroup.induction_on q ?_ + intro k + exact ⟨QuotientGroup.mk k, rfl⟩ + +/-- The kernel of restriction to `G(L/K)` is contained in the subgroup +coming from `G(\widetilde L/K')`. -/ +theorem transferNormNaturalityExtensionRestriction_ker_le_intermediate + (D : DegreeData G) [IsTopologicalGroup G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] : + (D.extensionRestriction E.base.field L (hL.trans E.below)).ker ≤ + D.transferNormNaturalityFrobeniusIntermediateSubgroup E L hL := by + rw [D.transferNormNaturalityFrobeniusIntermediateSubgroup_eq_map + E L hL] + intro q hq + revert hq + refine QuotientGroup.induction_on q ?_ + intro k hk + change D.extensionRestriction E.base.field L (hL.trans E.below) + (QuotientGroup.mk k) = 1 at hk + rw [D.extensionRestriction_mk] at hk + have hkL : k ∈ + extensionSubgroup E.base.field L (hL.trans E.below) := by + exact QuotientGroup.eq_one_iff k |>.1 hk + have hkK' : k ∈ + extensionSubgroup E.base.field E.field.field E.below := by + apply (mem_extensionSubgroup_iff + E.base.field E.field.field E.below k).2 + exact hL ((mem_extensionSubgroup_iff E.base.field L + (hL.trans E.below) k).1 hkL) + exact ⟨k, hkK', rfl⟩ + +/-- `H` has finite index in `G(\widetilde L/K)`, with no normality +assumption on the intermediate extension `K'/K`. -/ +theorem transferNormNaturalityFrobeniusIntermediateFiniteIndex + (D : DegreeData G) [IsTopologicalGroup G] + (R : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ R.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup R.base.field L (hL.trans R.below)).Normal] + [hL'normal : (extensionSubgroup R.field.field L hL).Normal] : + (D.transferNormNaturalityFrobeniusIntermediateSubgroup R L hL).FiniteIndex := by + rw [D.transferNormNaturalityFrobeniusIntermediateSubgroup_eq_map + R L hL] + let I := D.extensionInertiaWithin R.base.field L (hL.trans R.below) + let M := extensionSubgroup R.base.field R.field.field R.below + have hIM : I ≤ M := by + intro k hk + apply (mem_extensionSubgroup_iff + R.base.field R.field.field R.below k).2 + exact hL ((mem_extensionSubgroup_iff R.base.field L + (hL.trans R.below) k).1 hk.1) + let p := QuotientGroup.mk' I + have hker : p.ker ≤ M := by + simpa [p] using hIM + let : M.FiniteIndex := Subgroup.finiteIndex_of_finite_quotient + rw [Subgroup.finiteIndex_iff, + M.index_map_eq (QuotientGroup.mk'_surjective I) hker] + exact Subgroup.FiniteIndex.index_ne_zero + +/-- The copy of `G(\widetilde L/K')` is closed in +`G(\widetilde L/K)`. -/ +theorem transferNormNaturalityFrobeniusIntermediate_isClosed + (D : DegreeData G) [IsTopologicalGroup G] [CompactSpace G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] : + IsClosed (D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL : Set + (E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below))) := by + let : CompactSpace E.field.field.toSubgroup := + isCompact_iff_compactSpace.mp E.field.field.isClosed'.isCompact + let : IsClosed + (D.extensionInertiaWithin E.field.field L hL : + Set E.field.field.toSubgroup) := + D.extensionInertiaWithin_isClosed E.field L hL + let : IsClosed (D.extensionInertiaWithin E.base.field L + (hL.trans E.below) : Set E.base.field.toSubgroup) := + D.extensionInertiaWithin_isClosed E.base L (hL.trans E.below) + let f := D.finiteReciprocityNaturalityFrobeniusTowerMapContinuous + E.base.field E.field.field L L + (hL.trans E.below) hL E.below le_rfl + change IsClosed (Set.range f) + have hrange : Set.range f = Set.range f.toContinuousMap := by + ext y + constructor <;> rintro ⟨x, rfl⟩ <;> exact ⟨x, rfl⟩ + rw [hrange] + simpa only [Set.image_univ] using + (isCompact_univ.image f.continuous).isClosed + +/-- The transfer-orbit index set +`⟨σ⟩ \ G(\widetilde L/K) / H` is canonically the norm double-coset +index set `G_K' \ G_K / G_Σ`. The equivalence is inversion of double +cosets, followed by passage from powers of `σ` to their closure `Γ` and +the canonical identification `G_K/G_Σ ≃ G(\widetilde L/K)/Γ`. -/ +noncomputable def transferNormNaturalityTransferNormOrbitEquiv + (D : DegreeData G) [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + (σ : D.FrobeniusElements E.base L (hL.trans E.below)) : + Quotient (orbitRel (Subgroup.zpowers σ.1) + ((E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ + D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL)) ≃ + Quotient (orbitRel + (extensionSubgroup E.base.field E.field.field E.below) + (E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field + (D.frobeniusFixedField E.base L (hL.trans E.below) σ) + (D.frobeniusFixedField_le E.base L + (hL.trans E.below) σ))) := by + let P := E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below) + let H := D.transferNormNaturalityFrobeniusIntermediateSubgroup E L hL + let M := extensionSubgroup E.base.field E.field.field E.below + let Γ := D.frobeniusClosure E.base L (hL.trans E.below) σ + let S := D.frobeniusFixedField E.base L (hL.trans E.below) σ + let hSK := D.frobeniusFixedField_le E.base L (hL.trans E.below) σ + let f : M →* H := D.transferNormNaturalityIntermediateToFrobeniusSubgroup + E L hL + let e := D.frobeniusFixedCosetClosureEquiv + E.base L (hL.trans E.below) σ + letI : H.FiniteIndex := + D.transferNormNaturalityFrobeniusIntermediateFiniteIndex E L hL + have hHclosed : IsClosed (H : Set P) := + D.transferNormNaturalityFrobeniusIntermediate_isClosed E L hL + have hΓ : + (closedSubgroupGenerated ({σ.1} : Set P)).toSubgroup = Γ.toSubgroup := by + simp [Γ, DegreeData.frobeniusClosure] + let eΓ : P ⧸ (closedSubgroupGenerated ({σ.1} : Set P)).toSubgroup ≃ + P ⧸ Γ.toSubgroup := Subgroup.quotientEquivOfEq hΓ + have heΓ (h : H) + (x : P ⧸ (closedSubgroupGenerated ({σ.1} : Set P)).toSubgroup) : + eΓ (h • x) = h • eΓ x := by + refine Quotient.inductionOn' x ?_ + intro p + rfl + let eΓorbit := orbitQuotientEquivOfSurjectiveEquivariant + (MonoidHom.id H) Function.surjective_id eΓ heΓ + have hf : Function.Surjective f := + D.transferNormNaturalityIntermediateToFrobeniusSubgroup_surjective + E L hL + have he (m : M) + (x : E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field S hSK) : + e (m • x) = f m • e x := by + exact D.frobeniusFixedCosetClosureEquiv_equivariant + E L hL σ m x + let eAction := orbitQuotientEquivOfSurjectiveEquivariant f hf e he + exact (orbitQuotientSwapEquiv (Subgroup.zpowers σ.1) H).trans + ((orbitQuotientClosedCyclicEquiv H hHclosed σ.1).trans + (eΓorbit.trans eAction.symm)) + +/-- The transfer-norm orbit equivalence sends quotient representatives to their norm orbits. -/ +@[simp] +theorem transferNormNaturalityTransferNormOrbitEquiv_mk + (D : DegreeData G) [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + (σ : D.FrobeniusElements E.base L (hL.trans E.below)) + (k : E.base.field.toSubgroup) : + D.transferNormNaturalityTransferNormOrbitEquiv E L hL σ + (Quotient.mk'' (QuotientGroup.mk + (QuotientGroup.mk k : E.base.field.toSubgroup ⧸ + D.extensionInertiaWithin E.base.field L (hL.trans E.below)) : + (E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ + D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL)) = + Quotient.mk'' (QuotientGroup.mk k⁻¹ : + E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field + (D.frobeniusFixedField E.base L (hL.trans E.below) σ) + (D.frobeniusFixedField_le E.base L + (hL.trans E.below) σ)) := by + unfold transferNormNaturalityTransferNormOrbitEquiv + simp only [Equiv.trans_apply, orbitQuotientSwapEquiv_mk, + orbitQuotientClosedCyclicEquiv_mk, + orbitQuotientEquivOfSurjectiveEquivariant_mk, + orbitQuotientEquivOfSurjectiveEquivariant_symm_mk, + Subgroup.quotientEquivOfEq_mk] + apply congrArg Quotient.mk'' + exact (D.frobeniusFixedCosetClosureEquiv E.base L + (hL.trans E.below) σ).symm_apply_apply (QuotientGroup.mk k⁻¹) + +/-- On the classical chosen transfer representative `t`, the preceding +equivalence is literally the norm orbit represented by `t⁻¹`. -/ +theorem transferNormNaturalityTransferNormOrbitEquiv_apply + (D : DegreeData G) [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) + (hL : L.toSubgroup ≤ E.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup E.base.field L (hL.trans E.below)).Normal] + [hL'normal : (extensionSubgroup E.field.field L hL).Normal] + (σ : D.FrobeniusElements E.base L (hL.trans E.below)) + (q : Quotient (orbitRel (Subgroup.zpowers σ.1) + ((E.base.field.toSubgroup ⧸ D.extensionInertiaWithin E.base.field L + (hL.trans E.below)) ⧸ + D.transferNormNaturalityFrobeniusIntermediateSubgroup + E L hL))) : + D.transferNormNaturalityTransferNormOrbitEquiv E L hL σ q = + Quotient.mk'' (QuotientGroup.mk (Quotient.out q.out.out)⁻¹ : + E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field + (D.frobeniusFixedField E.base L (hL.trans E.below) σ) + (D.frobeniusFixedField_le E.base L + (hL.trans E.below) σ)) := by + let orbitEquiv := D.transferNormNaturalityTransferNormOrbitEquiv E L hL σ + calc + orbitEquiv q = orbitEquiv (Quotient.mk'' q.out) := + congrArg orbitEquiv (Quotient.out_eq' q).symm + _ = orbitEquiv (Quotient.mk'' (QuotientGroup.mk q.out.out)) := + congrArg orbitEquiv (congrArg Quotient.mk'' (Quotient.out_eq' q.out).symm) + _ = orbitEquiv (Quotient.mk'' (QuotientGroup.mk + (QuotientGroup.mk (Quotient.out q.out.out)))) := + congrArg orbitEquiv (congrArg Quotient.mk'' + (congrArg QuotientGroup.mk (Quotient.out_eq' q.out.out).symm)) + _ = _ := D.transferNormNaturalityTransferNormOrbitEquiv_mk + E L hL σ (Quotient.out q.out.out) + +end DegreeData + +end transferFrobeniusGeometry +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/NormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/NormSubgroup.lean new file mode 100644 index 0000000000..f4486f8014 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/NormSubgroup.lean @@ -0,0 +1,424 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PrimeElements +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +/-! # Norm Subgroup -/ + +@[expose] public section +universe u + +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +/-! +# The abstract reciprocity construction: norm subgroups for infinite extensions + +For an infinite abstract extension `E | K`, the abstract class-field construction defines +`N_{E|K} A_E` as the intersection of the norm images from all finite +intermediate fields. This file records that definition literally. +-/ + +noncomputable +section + +section finiteIntermediateFields + +variable {G : Type u} [Group G] [TopologicalSpace G] + +/-- A finite intermediate field `M` of an abstract extension `E | K`. +Contravariantly, its subgroup lies between `G_E` and `G_K`. -/ +structure FiniteIntermediateField (E K : ClosedSubgroup G) where + /-- The closed subgroup representing the intermediate field. -/ + field : ClosedSubgroup G + /-- The extension endpoint lies below the intermediate-field subgroup. -/ + above : E.toSubgroup ≤ field.toSubgroup + /-- The intermediate-field subgroup lies below the base endpoint. -/ + below : field.toSubgroup ≤ K.toSubgroup + /-- The intermediate field has finite degree over the base endpoint. -/ + finite : Finite + (K.toSubgroup ⧸ extensionSubgroup K field below) + +namespace FiniteIntermediateField + +/-- The base field itself is a finite intermediate field. -/ +def base (E K : ClosedSubgroup G) (hEK : E.toSubgroup ≤ K.toSubgroup) : + FiniteIntermediateField E K where + field := K + above := hEK + below := le_rfl + finite := by + have htop : extensionSubgroup K K le_rfl = ⊤ := by + ext x + constructor + · intro _ + trivial + · intro _ + exact x.2 + rw [htop] + infer_instance + +end FiniteIntermediateField + +end finiteIntermediateFields + +section infiniteNorms + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +/-- The norm image from a finite intermediate field `M` to `K`. -/ +def finiteIntermediateNormRange + (A : Rep ℤ G) (E K : ClosedSubgroup G) + (M : FiniteIntermediateField E K) : + AddSubgroup (ambientFixedAddSubgroup A K) := by + letI := M.finite + exact (relativeNorm A K M.field M.below).range + +/-- The norm subgroup for a possibly infinite extension: +`N_{E|K} A_E = ⋂_M N_{M|K} A_M`, where `M` runs through the finite +intermediate fields. -/ +def infiniteNormSubgroup + (A : Rep ℤ G) (E K : ClosedSubgroup G) : + AddSubgroup (ambientFixedAddSubgroup A K) := + ⨅ M : FiniteIntermediateField E K, + finiteIntermediateNormRange A E K M + +/-- Membership in the infinite norm subgroup is characterized by norms from every finite level. -/ +@[simp] +theorem mem_infiniteNormSubgroup_iff + (A : Rep ℤ G) (E K : ClosedSubgroup G) + (a : ambientFixedAddSubgroup A K) : + a ∈ infiniteNormSubgroup A E K ↔ + ∀ M : FiniteIntermediateField E K, + a ∈ finiteIntermediateNormRange A E K M := by + simp [infiniteNormSubgroup] + +/-- The quotient `A_K / N_{E|K} A_E` used by the reciprocity map. + +This public object is opaque: clients use `infiniteNormClass`, +`InfiniteNormQuotient.induction_on`, or `infiniteNormQuotientLift` instead of +depending on the concrete quotient representation. -/ +def InfiniteNormQuotient + (A : Rep ℤ G) (E K : ClosedSubgroup G) := + ambientFixedAddSubgroup A K ⧸ infiniteNormSubgroup A E K + +/-- The additive group structure on the infinite norm quotient. -/ +instance infiniteNormQuotientAddCommGroup + (A : Rep ℤ G) (E K : ClosedSubgroup G) : + AddCommGroup (InfiniteNormQuotient A E K) := by + unfold InfiniteNormQuotient + infer_instance + +/-- The explicit boundary to the concrete quotient implementation. -/ +def infiniteNormQuotientConcreteEquiv + (A : Rep ℤ G) (E K : ClosedSubgroup G) : + InfiniteNormQuotient A E K ≃+ + ambientFixedAddSubgroup A K ⧸ infiniteNormSubgroup A E K := by + unfold InfiniteNormQuotient + exact AddEquiv.refl _ + +/-- The canonical class map into the infinite norm quotient. -/ +def infiniteNormClass + (A : Rep ℤ G) (E K : ClosedSubgroup G) : + ambientFixedAddSubgroup A K →+ + InfiniteNormQuotient A E K := by + unfold InfiniteNormQuotient + exact QuotientAddGroup.mk' (infiniteNormSubgroup A E K) + +/-- The concrete infinite-norm quotient equivalence sends a class to its +canonical quotient class. -/ +@[simp] +theorem infiniteNormQuotientConcreteEquiv_infiniteNormClass + (A : Rep ℤ G) (E K : ClosedSubgroup G) + (a : ambientFixedAddSubgroup A K) : + infiniteNormQuotientConcreteEquiv A E K (infiniteNormClass A E K a) = + QuotientAddGroup.mk' (infiniteNormSubgroup A E K) a := by + rfl + +/-- An infinite norm class vanishes exactly when its representative lies in the norm subgroup. -/ +@[simp] +theorem infiniteNormClass_eq_zero_iff + (A : Rep ℤ G) (E K : ClosedSubgroup G) + (a : ambientFixedAddSubgroup A K) : + infiniteNormClass A E K a = 0 ↔ + a ∈ infiniteNormSubgroup A E K := by + unfold infiniteNormClass InfiniteNormQuotient + exact QuotientAddGroup.eq_zero_iff a + +/-- Every infinite norm-quotient class has an ambient representative. -/ +theorem infiniteNormClass_surjective + (A : Rep ℤ G) (E K : ClosedSubgroup G) : + Function.Surjective (infiniteNormClass A E K) := by + intro q + change ambientFixedAddSubgroup A K ⧸ infiniteNormSubgroup A E K at q + obtain ⟨a, rfl⟩ := + QuotientAddGroup.mk'_surjective (infiniteNormSubgroup A E K) q + exact ⟨a, rfl⟩ + +/-- Eliminate an infinite norm-quotient class through an ambient representative. -/ +@[elab_as_elim] +theorem InfiniteNormQuotient.induction_on + (A : Rep ℤ G) (E K : ClosedSubgroup G) + {motive : InfiniteNormQuotient A E K → Prop} + (q : InfiniteNormQuotient A E K) + (h : ∀ a, motive (infiniteNormClass A E K a)) : motive q := by + obtain ⟨a, rfl⟩ := infiniteNormClass_surjective A E K q + exact h a + +/-- Descend an additive homomorphism that kills the infinite norm subgroup. -/ +def infiniteNormQuotientLift + {B : Type*} [AddCommGroup B] + (A : Rep ℤ G) (E K : ClosedSubgroup G) + (f : ambientFixedAddSubgroup A K →+ B) + (hf : infiniteNormSubgroup A E K ≤ f.ker) : + InfiniteNormQuotient A E K →+ B := by + unfold InfiniteNormQuotient + exact QuotientAddGroup.lift (infiniteNormSubgroup A E K) f hf + +/-- Lifting the canonical infinite norm class recovers its representative in the +concrete quotient. -/ +@[simp] +theorem infiniteNormQuotientLift_infiniteNormClass + {B : Type*} [AddCommGroup B] + (A : Rep ℤ G) (E K : ClosedSubgroup G) + (f : ambientFixedAddSubgroup A K →+ B) + (hf : infiniteNormSubgroup A E K ≤ f.ker) + (a : ambientFixedAddSubgroup A K) : + infiniteNormQuotientLift A E K f hf (infiniteNormClass A E K a) = f a := by + rfl + +end infiniteNorms + +section maximalUnramifiedFields + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- The maximal unramified extension `\widetilde L`, represented by +`I_L = G_L ∩ ker(d)`. -/ +def maximalUnramifiedField (D : DegreeData G) (L : ClosedSubgroup G) : + ClosedSubgroup G := + D.fieldInertia L + +/-- The implementation theorem identifying the maximal unramified field +with absolute inertia. Downstream code should use this theorem instead of +unfolding `maximalUnramifiedField`. -/ +theorem maximalUnramifiedField_eq_fieldInertia + (D : DegreeData G) (L : ClosedSubgroup G) : + D.maximalUnramifiedField L = D.fieldInertia L := by + rfl + +/-- Membership in the maximal unramified field is the expected inertia +condition. -/ +@[simp] +theorem mem_maximalUnramifiedField_iff + (D : DegreeData G) (L : ClosedSubgroup G) (g : G) : + g ∈ D.maximalUnramifiedField L ↔ g ∈ L ∧ D.degree g = 1 := by + rw [D.maximalUnramifiedField_eq_fieldInertia] + exact D.mem_fieldInertia_iff L g + +/-- Every finite unramified field lies below the maximal unramified field. -/ +theorem maximalUnramifiedField_le (D : DegreeData G) (L : ClosedSubgroup G) : + (D.maximalUnramifiedField L).toSubgroup ≤ L.toSubgroup := by + rw [D.maximalUnramifiedField_eq_fieldInertia] + exact inf_le_left + +/-- A field containing all finite unramified fields contains the maximal unramified field. -/ +theorem maximalUnramifiedField_le_of_le (D : DegreeData G) + {L K : ClosedSubgroup G} (hLK : L.toSubgroup ≤ K.toSubgroup) : + (D.maximalUnramifiedField L).toSubgroup ≤ K.toSubgroup := + (D.maximalUnramifiedField_le L).trans hLK + +/-- Monotonicity of maximal unramified fields. -/ +theorem maximalUnramifiedField_mono (D : DegreeData G) + {K L : ClosedSubgroup G} (hLK : L.toSubgroup ≤ K.toSubgroup) : + (D.maximalUnramifiedField L).toSubgroup ≤ + (D.maximalUnramifiedField K).toSubgroup := by + intro g hg + have hg' : g ∈ D.maximalUnramifiedField L := hg + obtain ⟨hgL, hgd⟩ := (D.mem_maximalUnramifiedField_iff L g).1 hg' + exact (D.mem_maximalUnramifiedField_iff K g).2 ⟨hLK hgL, hgd⟩ + +/-- Inside `G_K`, the absolute subgroup of `\widetilde L` is the relative +inertia subgroup. -/ +theorem extensionSubgroup_maximalUnramifiedField (D : DegreeData G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) : + extensionSubgroup K (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_le_of_le hLK) = + D.extensionInertiaWithin K L hLK := by + ext k + constructor + · intro hk + have hkMax : k.1 ∈ D.maximalUnramifiedField L := + (mem_extensionSubgroup_iff K (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_le_of_le hLK) k).1 hk + have hkData := (D.mem_maximalUnramifiedField_iff L k.1).1 hkMax + exact ⟨(mem_extensionSubgroup_iff K L hLK k).2 hkData.1, + (D.mem_fieldInertiaWithin_iff K k).2 hkData.2⟩ + · intro hk + apply (mem_extensionSubgroup_iff K (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_le_of_le hLK) k).2 + apply (D.mem_maximalUnramifiedField_iff L k.1).2 + exact ⟨(mem_extensionSubgroup_iff K L hLK k).1 hk.1, + (D.mem_fieldInertiaWithin_iff K k).1 hk.2⟩ + +/-- The subgroup representing the maximal unramified field is normal in the base subgroup. -/ +theorem extensionSubgroup_maximalUnramifiedField_normal (D : DegreeData G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] : + (extensionSubgroup K (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_le_of_le hLK)).Normal := by + rw [D.extensionSubgroup_maximalUnramifiedField K L hLK] + infer_instance + +end DegreeData + +end maximalUnramifiedFields + +section maximalUnramifiedNorms + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- `N_{\widetilde L|K} A_{\widetilde L}` in the reciprocity construction. -/ +def maximalUnramifiedNormSubgroup (D : DegreeData G) (A : Rep ℤ G) + (K L : ClosedSubgroup G) : + AddSubgroup (ambientFixedAddSubgroup A K) := + infiniteNormSubgroup A (D.maximalUnramifiedField L) K + +/-- The maximal-unramified norm subgroup is the infinite norm subgroup for +the maximal unramified field. -/ +theorem maximalUnramifiedNormSubgroup_eq_infiniteNormSubgroup + (D : DegreeData G) (A : Rep ℤ G) (K L : ClosedSubgroup G) : + D.maximalUnramifiedNormSubgroup A K L = + infiniteNormSubgroup A (D.maximalUnramifiedField L) K := by + rfl + +/-- Membership in the maximal unramified norm subgroup is characterized levelwise. -/ +@[simp] +theorem mem_maximalUnramifiedNormSubgroup_iff + (D : DegreeData G) (A : Rep ℤ G) (K L : ClosedSubgroup G) + (a : ambientFixedAddSubgroup A K) : + a ∈ D.maximalUnramifiedNormSubgroup A K L ↔ + a ∈ infiniteNormSubgroup A (D.maximalUnramifiedField L) K := by + rw [D.maximalUnramifiedNormSubgroup_eq_infiniteNormSubgroup] + +/-- `A_K / N_{\widetilde L|K} A_{\widetilde L}`. + +This is an opaque public object, not a reducible alias for the infinite norm +quotient. -/ +def MaximalUnramifiedNormQuotient (D : DegreeData G) (A : Rep ℤ G) + (K L : ClosedSubgroup G) := + InfiniteNormQuotient A (D.maximalUnramifiedField L) K + +/-- The additive group structure on the maximal-unramified norm quotient. -/ +instance maximalUnramifiedNormQuotientAddCommGroup + (D : DegreeData G) (A : Rep ℤ G) (K L : ClosedSubgroup G) : + AddCommGroup (D.MaximalUnramifiedNormQuotient A K L) := by + unfold MaximalUnramifiedNormQuotient + infer_instance + +/-- The explicit boundary to the corresponding infinite norm quotient. -/ +def maximalUnramifiedNormQuotientInfiniteEquiv + (D : DegreeData G) (A : Rep ℤ G) (K L : ClosedSubgroup G) : + D.MaximalUnramifiedNormQuotient A K L ≃+ + InfiniteNormQuotient A (D.maximalUnramifiedField L) K := by + unfold MaximalUnramifiedNormQuotient + exact AddEquiv.refl _ + +/-- The canonical class map into the maximal-unramified norm quotient. -/ +def maximalUnramifiedNormClass + (D : DegreeData G) (A : Rep ℤ G) (K L : ClosedSubgroup G) : + ambientFixedAddSubgroup A K →+ + D.MaximalUnramifiedNormQuotient A K L := by + unfold MaximalUnramifiedNormQuotient + exact infiniteNormClass A (D.maximalUnramifiedField L) K + +/-- The infinite quotient equivalence preserves the canonical maximal-unramified norm class. -/ +@[simp] +theorem maximalUnramifiedNormQuotientInfiniteEquiv_maximalUnramifiedNormClass + (D : DegreeData G) (A : Rep ℤ G) (K L : ClosedSubgroup G) + (a : ambientFixedAddSubgroup A K) : + D.maximalUnramifiedNormQuotientInfiniteEquiv A K L + (D.maximalUnramifiedNormClass A K L a) = + infiniteNormClass A (D.maximalUnramifiedField L) K a := by + rfl + +/-- A maximal-unramified norm class vanishes exactly on its defining norm subgroup. -/ +@[simp] +theorem maximalUnramifiedNormClass_eq_zero_iff + (D : DegreeData G) (A : Rep ℤ G) (K L : ClosedSubgroup G) + (a : ambientFixedAddSubgroup A K) : + D.maximalUnramifiedNormClass A K L a = 0 ↔ + a ∈ D.maximalUnramifiedNormSubgroup A K L := by + unfold maximalUnramifiedNormClass MaximalUnramifiedNormQuotient + exact infiniteNormClass_eq_zero_iff A (D.maximalUnramifiedField L) K a + +/-- Every maximal-unramified norm class has an ambient representative. -/ +theorem maximalUnramifiedNormClass_surjective + (D : DegreeData G) (A : Rep ℤ G) (K L : ClosedSubgroup G) : + Function.Surjective (D.maximalUnramifiedNormClass A K L) := by + intro q + change InfiniteNormQuotient A (D.maximalUnramifiedField L) K at q + obtain ⟨a, ha⟩ := + infiniteNormClass_surjective A (D.maximalUnramifiedField L) K q + exact ⟨a, ha⟩ + +/-- Eliminate a maximal-unramified norm class through an ambient representative. -/ +@[elab_as_elim] +theorem MaximalUnramifiedNormQuotient.induction_on + (D : DegreeData G) (A : Rep ℤ G) (K L : ClosedSubgroup G) + {motive : D.MaximalUnramifiedNormQuotient A K L → Prop} + (q : D.MaximalUnramifiedNormQuotient A K L) + (h : ∀ a, motive (D.maximalUnramifiedNormClass A K L a)) : motive q := by + obtain ⟨a, rfl⟩ := D.maximalUnramifiedNormClass_surjective A K L q + exact h a + +/-- Descend an additive homomorphism that kills the maximal-unramified norm subgroup. -/ +def maximalUnramifiedNormQuotientLift + {B : Type*} [AddCommGroup B] + (D : DegreeData G) (A : Rep ℤ G) (K L : ClosedSubgroup G) + (f : ambientFixedAddSubgroup A K →+ B) + (hf : D.maximalUnramifiedNormSubgroup A K L ≤ f.ker) : + D.MaximalUnramifiedNormQuotient A K L →+ B := by + unfold MaximalUnramifiedNormQuotient + refine infiniteNormQuotientLift A (D.maximalUnramifiedField L) K f ?_ + intro a ha + exact hf ((D.mem_maximalUnramifiedNormSubgroup_iff A K L a).2 ha) + +/-- The quotient lift sends a maximal-unramified norm class back to its representative. -/ +@[simp] +theorem maximalUnramifiedNormQuotientLift_maximalUnramifiedNormClass + {B : Type*} [AddCommGroup B] + (D : DegreeData G) (A : Rep ℤ G) (K L : ClosedSubgroup G) + (f : ambientFixedAddSubgroup A K →+ B) + (hf : D.maximalUnramifiedNormSubgroup A K L ≤ f.ker) + (a : ambientFixedAddSubgroup A K) : + D.maximalUnramifiedNormQuotientLift A K L f hf + (D.maximalUnramifiedNormClass A K L a) = f a := by + unfold maximalUnramifiedNormQuotientLift maximalUnramifiedNormClass + MaximalUnramifiedNormQuotient + exact infiniteNormQuotientLift_infiniteNormClass + A (D.maximalUnramifiedField L) K f (by + intro b hb + exact hf ((D.mem_maximalUnramifiedNormSubgroup_iff A K L b).2 hb)) a + +end DegreeData + +end maximalUnramifiedNorms + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/PrimeChoice.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/PrimeChoice.lean new file mode 100644 index 0000000000..0e3f597e62 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/PrimeChoice.lean @@ -0,0 +1,77 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PrimeElements + +/-! # Prime Choice -/ + +@[expose] public section +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +/-! +# The abstract reciprocity construction: choosing prime elements + +Surjectivity of the normalized valuation supplies a prime element in every +finite abstract field. Any two choices differ by a unit (additively, their +difference has value zero). +-/ + +noncomputable +section + +namespace ValuationData + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] +variable {D : DegreeData G} {A : Rep ℤ G} + +/-- A chosen prime element of a finite abstract field. Later independence +lemmas show that the reciprocity class does not depend on this choice. -/ +def chosenPrimeElement (v : ValuationData D A) (K : FiniteAbstractField G) : + ambientFixedAddSubgroup A K.field := + Classical.choose (v.normalizedValuation_surjective K v.oneValue) + +/-- Establishes the identity `v.valuationAt K (v.chosenPrimeElement K) = v.oneValue`. -/ +@[simp] +theorem valuationAt_chosenPrimeElement (v : ValuationData D A) + (K : FiniteAbstractField G) : + v.valuationAt K (v.chosenPrimeElement K) = v.oneValue := + Classical.choose_spec (v.normalizedValuation_surjective K v.oneValue) + +/-- The chosen prime element has valuation equal to the distinguished degree-one value. -/ +theorem chosenPrimeElement_isPrime (v : ValuationData D A) + (K : FiniteAbstractField G) : + v.IsPrimeElement K (v.chosenPrimeElement K) := + v.valuationAt_chosenPrimeElement K + +/-- In additive notation, two prime elements differ by a unit. -/ +theorem sub_mem_unitAddSubgroup_of_prime + (v : ValuationData D A) (K : FiniteAbstractField G) + {π π' : ambientFixedAddSubgroup A K.field} + (hπ : v.IsPrimeElement K π) (hπ' : v.IsPrimeElement K π') : + π' - π ∈ v.unitAddSubgroup K := by + rw [v.mem_unitAddSubgroup_iff, map_sub, hπ, hπ'] + exact sub_self _ + +/-- Establishes the membership statement `π - v.chosenPrimeElement K ∈ v.unitAddSubgroup K`. -/ +theorem sub_chosenPrimeElement_mem_unitAddSubgroup + (v : ValuationData D A) (K : FiniteAbstractField G) + {π : ambientFixedAddSubgroup A K.field} + (hπ : v.IsPrimeElement K π) : + π - v.chosenPrimeElement K ∈ v.unitAddSubgroup K := + v.sub_mem_unitAddSubgroup_of_prime + K (v.chosenPrimeElement_isPrime K) hπ + +end ValuationData + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityDefinition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityDefinition.lean new file mode 100644 index 0000000000..f96e90bf21 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityDefinition.lean @@ -0,0 +1,198 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusSemigroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.NormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.PrimeChoice + +/-! # Reciprocity Definition -/ + +@[expose] public section +universe u + +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +/-! +# The abstract reciprocity construction, the reciprocity construction: the reciprocity map + +For a Frobenius element `σ`, let `Σ` be its fixed field. The reciprocity +class is the class of `N_{Σ|K}(π_Σ)` in +`A_K / N_{\widetilde L|K} A_{\widetilde L}`. Independence of the prime +element is proved separately from the unit-cohomology axiom. +-/ + +noncomputable +section + +section frobeniusFixedFields + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- A finite intermediate-field package for the fixed field `Σ` of a +Frobenius element. -/ +def frobeniusFixedIntermediateField (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (σ : D.FrobeniusElements K L hLK) : + FiniteIntermediateField (D.maximalUnramifiedField L) K.field where + field := D.frobeniusFixedField K L hLK σ + above := D.fieldInertia_le_frobeniusFixedField K L hLK σ + below := D.frobeniusFixedField_le K L hLK σ + finite := D.frobeniusFixedField_finite K L hLK σ + +/-- Finiteness of `Σ | k`, obtained from the finite tower `Σ | K | k`. -/ +theorem frobeniusFixedField_absoluteFinite (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (σ : D.FrobeniusElements (K.toFiniteResidueAbstractField D) L hLK + (hLnormal := by + simpa only [FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal)) : + Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (D.frobeniusFixedField (K.toFiniteResidueAbstractField D) L hLK + (hLnormal := by + simpa only [FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal) σ) + (le_baseField + (D.frobeniusFixedField (K.toFiniteResidueAbstractField D) L hLK + (hLnormal := by + simpa only [FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal) σ))) + := by + let KR := K.toFiniteResidueAbstractField D + let hLnormalKR : (extensionSubgroup KR.field L hLK).Normal := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal + let hLfiniteKR : Finite + (KR.field.toSubgroup ⧸ extensionSubgroup KR.field L hLK) := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLfinite + let : Finite (K.field.toSubgroup ⧸ + extensionSubgroup K.field (D.frobeniusFixedField KR L hLK σ) + (D.frobeniusFixedField_le KR L hLK σ)) := + D.frobeniusFixedField_finite KR L hLK σ + exact relativeTowerQuotientFinite (baseField G) K.field + (D.frobeniusFixedField KR L hLK σ) + (D.frobeniusFixedField_le KR L hLK σ) (le_baseField K.field) + +end DegreeData + +end frobeniusFixedFields + +section reciprocityValues + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] +variable {D : DegreeData G} {A : Rep ℤ G} + +namespace DegreeData + +/-- The reciprocity construction with an explicit prime element `π_Σ`. -/ +def reciprocityValueOfPrime (D : DegreeData G) (A : Rep ℤ G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (σ : D.FrobeniusElements K L hLK) + (π : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L hLK σ)) : + D.MaximalUnramifiedNormQuotient A K.field L := by + letI : Finite (K.field.toSubgroup ⧸ + extensionSubgroup K.field (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ)) := + D.frobeniusFixedField_finite K L hLK σ + exact D.maximalUnramifiedNormClass A K.field L + (relativeNorm A K.field (D.frobeniusFixedField K L hLK σ) + (D.frobeniusFixedField_le K L hLK σ) π) + +/-- **the reciprocity construction.** The reciprocity map on the Frobenius semigroup, +using the canonical chosen prime supplied by surjectivity of `v_Σ`. +The following independence theorem identifies this value with the formula +for every prime element. -/ +def reciprocityMap (D : DegreeData G) (A : Rep ℤ G) + (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] : + D.FrobeniusElements (K.toFiniteResidueAbstractField D) L hLK + (hLnormal := by + simpa only [FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal) → + D.MaximalUnramifiedNormQuotient A K.field L := + fun σ => by + let KR := K.toFiniteResidueAbstractField D + letI hLnormalKR : (extensionSubgroup KR.field L hLK).Normal := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal + letI hLfiniteKR : Finite + (KR.field.toSubgroup ⧸ extensionSubgroup KR.field L hLK) := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLfinite + letI : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (D.frobeniusFixedField KR L hLK σ) + (le_baseField (D.frobeniusFixedField KR L hLK σ))) := + D.frobeniusFixedField_absoluteFinite K L hLK σ + let Sigma : FiniteAbstractField G := + ⟨D.frobeniusFixedField KR L hLK σ, inferInstance⟩ + exact D.reciprocityValueOfPrime A KR L hLK σ + (v.chosenPrimeElement Sigma) + +/-- +The reciprocity map at a Frobenius element is represented by the chosen prime element in its +Frobenius fixed field. +-/ +theorem reciprocityMap_eq_chosenPrime (D : DegreeData G) (A : Rep ℤ G) + (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (σ : D.FrobeniusElements (K.toFiniteResidueAbstractField D) L hLK + (hLnormal := by + simpa only [FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal)) : + D.reciprocityMap A v K L hLK σ = by + let KR := K.toFiniteResidueAbstractField D + letI : (extensionSubgroup KR.field L hLK).Normal := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal + letI hLfiniteKR : Finite + (KR.field.toSubgroup ⧸ extensionSubgroup KR.field L hLK) := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLfinite + letI : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) + (D.frobeniusFixedField KR L hLK σ) + (le_baseField (D.frobeniusFixedField KR L hLK σ))) := + D.frobeniusFixedField_absoluteFinite K L hLK σ + let Sigma : FiniteAbstractField G := + ⟨D.frobeniusFixedField KR L hLK σ, inferInstance⟩ + simpa only [Sigma, KR, FiniteAbstractField.toFiniteResidueAbstractField] using + (D.reciprocityValueOfPrime A KR L hLK σ + (v.chosenPrimeElement Sigma)) := + rfl + +end DegreeData + +end reciprocityValues + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityIndependence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityIndependence.lean new file mode 100644 index 0000000000..1826948d4b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityIndependence.lean @@ -0,0 +1,561 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnitCohomologyAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityDefinition + +/-! # Reciprocity Independence -/ + +@[expose] public section +universe u + +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +/-! +# The abstract reciprocity construction: independence of the prime element + +This file supplies the finite-Galois cofinality and compositum argument used to prove that the + reciprocity construction is independent of its prime element. +-/ + +noncomputable +section + +section groupTheoreticRefinements + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace FiniteIntermediateField + +/-- The normal core of a finite intermediate field, embedded back into the +ambient absolute Galois group. -/ +def normalCoreField [IsTopologicalGroup G] + {E K : ClosedSubgroup G} (M : FiniteIntermediateField E K) : + ClosedSubgroup G where + toSubgroup := + (extensionSubgroup K M.field M.below).normalCore.map + K.toSubgroup.subtype + isClosed' := by + change IsClosed + (Subtype.val '' + ((extensionSubgroup K M.field M.below).normalCore : Set K.toSubgroup)) + exact K.isClosed'.isClosedEmbedding_subtypeVal.isClosedMap _ + ((extensionSubgroup K M.field M.below).normalCore_isClosed + (extensionSubgroup_isClosed K M.field M.below)) + +/-- The normal core field lies below the field from which it is constructed. -/ +theorem normalCoreField_le [IsTopologicalGroup G] + {E K : ClosedSubgroup G} (M : FiniteIntermediateField E K) : + (M.normalCoreField).toSubgroup ≤ K.toSubgroup := by + rintro g ⟨k, _, rfl⟩ + exact k.2 + +/-- The normal core is contained in the specified refinement field. -/ +theorem normalCoreField_le_field [IsTopologicalGroup G] + {E K : ClosedSubgroup G} (M : FiniteIntermediateField E K) : + (M.normalCoreField).toSubgroup ≤ M.field.toSubgroup := by + rintro g ⟨k, hk, rfl⟩ + exact (mem_extensionSubgroup_iff K M.field M.below k).1 + ((extensionSubgroup K M.field M.below).normalCore_le hk) + +/-- The subgroup representing the normal core field is the corresponding normal core. -/ +theorem extensionSubgroup_normalCoreField [IsTopologicalGroup G] + {E K : ClosedSubgroup G} (M : FiniteIntermediateField E K) : + extensionSubgroup K M.normalCoreField M.normalCoreField_le = + (extensionSubgroup K M.field M.below).normalCore := by + ext k + constructor + · intro hk + obtain ⟨k', hk', hk'n⟩ := hk + have hk'eq : k' = k := by + apply Subtype.ext + exact hk'n + simpa [hk'eq] using hk' + · intro hk + exact ⟨k, hk, rfl⟩ + +/-- Every finite intermediate field admits a finite Galois refinement once +the bottom extension is normal. -/ +def galoisRefinement [IsTopologicalGroup G] + {E K : ClosedSubgroup G} (M : FiniteIntermediateField E K) + [hEnormal : + (extensionSubgroup K E (M.above.trans M.below)).Normal] : + FiniteIntermediateField E K where + field := M.normalCoreField + above := by + intro e he + let eK : K.toSubgroup := ⟨e, M.below (M.above he)⟩ + have heE : eK ∈ extensionSubgroup K E (M.above.trans M.below) := + (mem_extensionSubgroup_iff K E (M.above.trans M.below) eK).2 he + have hle : extensionSubgroup K E (M.above.trans M.below) ≤ + extensionSubgroup K M.field M.below := by + intro x hx + apply (mem_extensionSubgroup_iff K M.field M.below x).2 + exact M.above + ((mem_extensionSubgroup_iff K E (M.above.trans M.below) x).1 hx) + have heCore : eK ∈ (extensionSubgroup K M.field M.below).normalCore := + (Subgroup.normal_le_normalCore.mpr hle) heE + exact ⟨eK, heCore, rfl⟩ + below := M.normalCoreField_le + finite := by + let H := extensionSubgroup K M.field M.below + let : H.FiniteIndex := + @Subgroup.finiteIndex_of_finite_quotient K.toSubgroup _ H M.finite + let : H.normalCore.FiniteIndex := inferInstance + rw [M.extensionSubgroup_normalCoreField] + infer_instance + +/-- A Galois refinement lies below the original finite field. -/ +theorem galoisRefinement_le_field [IsTopologicalGroup G] + {E K : ClosedSubgroup G} (M : FiniteIntermediateField E K) + [_hEnormal : + (extensionSubgroup K E (M.above.trans M.below)).Normal] : + (M.galoisRefinement).field.toSubgroup ≤ M.field.toSubgroup := + M.normalCoreField_le_field + +/-- The subgroup representing a Galois refinement is normal. -/ +instance galoisRefinement_normal [IsTopologicalGroup G] + {E K : ClosedSubgroup G} (M : FiniteIntermediateField E K) + [hEnormal : + (extensionSubgroup K E (M.above.trans M.below)).Normal] : + (extensionSubgroup K (M.galoisRefinement).field + (M.galoisRefinement).below).Normal := by + change (extensionSubgroup K M.normalCoreField M.normalCoreField_le).Normal + rw [M.extensionSubgroup_normalCoreField] + infer_instance + +/-- The field compositum `MΣ`, contravariantly represented by +`G_M ∩ G_Σ`. -/ +def compositumWith + {E K : ClosedSubgroup G} (M : FiniteIntermediateField E K) + (S : ClosedSubgroup G) : ClosedSubgroup G := + M.field ⊓ S + +/-- The common compositum refinement maps below its left input field. -/ +theorem compositumWith_le_left + {E K : ClosedSubgroup G} (M : FiniteIntermediateField E K) + (S : ClosedSubgroup G) : + (M.compositumWith S).toSubgroup ≤ M.field.toSubgroup := + inf_le_left + +/-- The common compositum refinement maps below its right input field. -/ +theorem compositumWith_le_right + {E K : ClosedSubgroup G} (M : FiniteIntermediateField E K) + (S : ClosedSubgroup G) : + (M.compositumWith S).toSubgroup ≤ S.toSubgroup := + inf_le_right + +/-- Any common refinement above both inputs lies below their constructed compositum. -/ +theorem above_le_compositumWith + {E K : ClosedSubgroup G} (M : FiniteIntermediateField E K) + (S : ClosedSubgroup G) (hES : E.toSubgroup ≤ S.toSubgroup) : + E.toSubgroup ≤ (M.compositumWith S).toSubgroup := + fun _ h => ⟨M.above h, hES h⟩ + +/-- The compositum of the two finite refinements has finite relative quotient. -/ +theorem compositumWith_finite + {E K : ClosedSubgroup G} (M : FiniteIntermediateField E K) + (S : ClosedSubgroup G) (hSK : S.toSubgroup ≤ K.toSubgroup) : + Finite (S.toSubgroup ⧸ + extensionSubgroup S (M.compositumWith S) (M.compositumWith_le_right S)) := by + let : Finite (K.toSubgroup ⧸ + extensionSubgroup K M.field M.below) := M.finite + have hMK : M.field.toSubgroup.relIndex K.toSubgroup ≠ 0 := by + rw [Subgroup.relIndex] + exact Subgroup.index_ne_zero_of_finite + have hinter := Subgroup.relIndex_inter_ne_zero hMK S.toSubgroup + have hKinfS : K.toSubgroup ⊓ S.toSubgroup = S.toSubgroup := + inf_eq_right.mpr hSK + rw [hKinfS] at hinter + apply Nat.finite_of_card_ne_zero + change (extensionSubgroup S (M.compositumWith S) + (M.compositumWith_le_right S)).index ≠ 0 + have hsub : extensionSubgroup S (M.compositumWith S) + (M.compositumWith_le_right S) = + M.field.toSubgroup.subgroupOf S.toSubgroup := by + ext x + rw [mem_extensionSubgroup_iff, Subgroup.mem_subgroupOf] + change (x.1 ∈ M.field.toSubgroup ∧ x.1 ∈ S.toSubgroup) ↔ + x.1 ∈ M.field.toSubgroup + exact and_iff_left x.2 + rw [hsub] + simpa [Subgroup.relIndex] using hinter + +/-- The compositum of normal refinements is again normal. -/ +theorem compositumWith_normal + {E K : ClosedSubgroup G} (M : FiniteIntermediateField E K) + (S : ClosedSubgroup G) (hSK : S.toSubgroup ≤ K.toSubgroup) + [hMnormal : (extensionSubgroup K M.field M.below).Normal] : + (extensionSubgroup S (M.compositumWith S) + (M.compositumWith_le_right S)).Normal := by + constructor + intro p hp s + have hpP : p.1 ∈ (M.compositumWith S).toSubgroup := + (mem_extensionSubgroup_iff S (M.compositumWith S) + (M.compositumWith_le_right S) p).1 hp + let pK : K.toSubgroup := ⟨p.1, hSK p.2⟩ + let sK : K.toSubgroup := ⟨s.1, hSK s.2⟩ + have hpM : pK ∈ extensionSubgroup K M.field M.below := + (mem_extensionSubgroup_iff K M.field M.below pK).2 hpP.1 + have hconjM : sK * pK * sK⁻¹ ∈ + extensionSubgroup K M.field M.below := + hMnormal.conj_mem pK hpM sK + have hconjM' : s.1 * p.1 * s.1⁻¹ ∈ M.field.toSubgroup := by + have := (mem_extensionSubgroup_iff K M.field M.below _).1 hconjM + change (sK * pK * sK⁻¹).1 ∈ M.field.toSubgroup + exact this + apply (mem_extensionSubgroup_iff S (M.compositumWith S) + (M.compositumWith_le_right S) _).2 + refine ⟨hconjM', ?_⟩ + exact S.toSubgroup.mul_mem + (S.toSubgroup.mul_mem s.2 p.2) (S.toSubgroup.inv_mem s.2) + +/-- The compositum of two finite extensions of `K` is finite over `K`. +Contravariantly this is the finite-index theorem for an intersection. -/ +theorem compositumWith_finite_over_base + {E K : ClosedSubgroup G} (M : FiniteIntermediateField E K) + (S : ClosedSubgroup G) (hSK : S.toSubgroup ≤ K.toSubgroup) + [hSfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K S hSK)] : + Finite (K.toSubgroup ⧸ extensionSubgroup K (M.compositumWith S) + ((M.compositumWith_le_right S).trans hSK)) := by + have hMindex : M.field.toSubgroup.relIndex K.toSubgroup ≠ 0 := by + rw [Subgroup.relIndex] + exact @Subgroup.index_ne_zero_of_finite K.toSubgroup _ + (extensionSubgroup K M.field M.below) M.finite + have hSindex : S.toSubgroup.relIndex K.toSubgroup ≠ 0 := by + rw [Subgroup.relIndex] + exact @Subgroup.index_ne_zero_of_finite K.toSubgroup _ + (extensionSubgroup K S hSK) hSfinite + apply Nat.finite_of_card_ne_zero + change (extensionSubgroup K (M.compositumWith S) + ((M.compositumWith_le_right S).trans hSK)).index ≠ 0 + have hsub : extensionSubgroup K (M.compositumWith S) + ((M.compositumWith_le_right S).trans hSK) = + (M.field.toSubgroup ⊓ S.toSubgroup).subgroupOf K.toSubgroup := by + ext x + rw [mem_extensionSubgroup_iff, Subgroup.mem_subgroupOf, Subgroup.mem_inf] + rfl + rw [hsub] + simpa only [Subgroup.relIndex] using + Subgroup.relIndex_inf_ne_zero hMindex hSindex + +/-- If `P | K` is finite and `P` contains the intermediate field `M`, then +`P | M` is finite. -/ +theorem finite_extension_of_le + {P M K : ClosedSubgroup G} + (hPK : P.toSubgroup ≤ K.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + (hPM : P.toSubgroup ≤ M.toSubgroup) + [hPfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K P hPK)] : + Finite (M.toSubgroup ⧸ extensionSubgroup M P hPM) := by + have hPKindex : P.toSubgroup.relIndex K.toSubgroup ≠ 0 := by + rw [Subgroup.relIndex] + exact @Subgroup.index_ne_zero_of_finite K.toSubgroup _ + (extensionSubgroup K P hPK) hPfinite + have hPMindex : P.toSubgroup.relIndex M.toSubgroup ≠ 0 := by + intro hzero + have hmul := Subgroup.relIndex_mul_relIndex + P.toSubgroup M.toSubgroup K.toSubgroup hPM hMK + rw [hzero, zero_mul] at hmul + exact hPKindex hmul.symm + apply Nat.finite_of_card_ne_zero + change (extensionSubgroup M P hPM).index ≠ 0 + simpa [Subgroup.relIndex] using hPMindex + +end FiniteIntermediateField + +namespace DegreeData + +/-- In a finite unramified Galois extension, the restriction of any +degree-one lift is a generator. This common form is used both in the universal norm-descent lemma +and in the explicit unramified norm-quotient calculation. -/ +theorem quotient_generator_of_unramified_degree_one (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hnormal : (extensionSubgroup K.field L hLK).Normal] + [hfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hUnramified : + (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D) + (φ : K.field.toSubgroup) + (hφ : D.normalizedDegree K φ = + Multiplicative.ofAdd (1 : ZHat)) : + ∀ x : K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK, + x ∈ Subgroup.zpowers (QuotientGroup.mk φ) := by + intro x + obtain ⟨q, hqx⟩ := D.frobeniusRestriction_surjective K L hLK x + obtain ⟨n, _hn, hdegree⟩ := q.2 + let t : K.field.toSubgroup := Quotient.out q.1 + have htq : + (QuotientGroup.mk t : + K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) = q.1 := + Quotient.out_eq' q.1 + have hdt : D.normalizedDegree K t = + (Multiplicative.ofAdd (1 : ZHat)) ^ n := by + calc + D.normalizedDegree K t = + D.extensionNormalizedDegree K L hLK + (QuotientGroup.mk t) := rfl + _ = D.extensionNormalizedDegree K L hLK q.1 := + congrArg (D.extensionNormalizedDegree K L hLK) htq + _ = _ := hdegree + let z : K.field.toSubgroup := t⁻¹ * φ ^ n + have hzI : z ∈ D.fieldInertiaWithin K.field := by + rw [← D.normalizedDegree_ker K] + change D.normalizedDegree K z = 1 + calc + D.normalizedDegree K z = + (D.normalizedDegree K t)⁻¹ * + (D.normalizedDegree K φ) ^ n := by + simp [z, map_mul, map_inv, map_pow] + _ = ((Multiplicative.ofAdd (1 : ZHat)) ^ n)⁻¹ * + (Multiplicative.ofAdd (1 : ZHat)) ^ n := by + rw [hdt, hφ] + _ = 1 := by simp + have hzL : z.1 ∈ L.toSubgroup := + ((DegreeData.AbstractExtension.mk L K.field hLK).isUnramified_iff_inertia_le D).1 + hUnramified ⟨z.2, hzI⟩ + have hzE : z ∈ extensionSubgroup K.field L hLK := + (mem_extensionSubgroup_iff K.field L hLK z).2 hzL + have htgen : + (QuotientGroup.mk t : K.field.toSubgroup ⧸ + extensionSubgroup K.field L hLK) = (QuotientGroup.mk φ) ^ n := by + apply QuotientGroup.eq.mpr + simpa [z] using hzE + have htx : + (QuotientGroup.mk t : K.field.toSubgroup ⧸ + extensionSubgroup K.field L hLK) = x := by + calc + QuotientGroup.mk t = D.extensionRestriction K.field L hLK + (QuotientGroup.mk t) := rfl + _ = D.extensionRestriction K.field L hLK q.1 := + congrArg (D.extensionRestriction K.field L hLK) htq + _ = x := hqx + have hxpow : x = (QuotientGroup.mk φ) ^ n := htx.symm.trans htgen + rw [hxpow] + exact Subgroup.mem_zpowers_iff.mpr ⟨(n : ℤ), by simp⟩ + +/-- A finite unramified Galois quotient is generated by the restriction of +an element of normalized degree `1`. This is the cyclicity input needed to +use the finite-cyclic Tate complexes in the unit-cohomology axiom. -/ +theorem exists_quotient_generator_of_unramified + (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hnormal : (extensionSubgroup K.field L hLK).Normal] + [hfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hUnramified : + (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D) : + ∃ g : K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK, + ∀ x, x ∈ Subgroup.zpowers g := by + obtain ⟨φ, hφ⟩ := D.normalizedDegree_surjective K + (Multiplicative.ofAdd (1 : ZHat)) + refine ⟨QuotientGroup.mk φ, ?_⟩ + exact D.quotient_generator_of_unramified_degree_one + K L hLK hUnramified φ hφ + +end DegreeData + +end groupTheoreticRefinements + +section reciprocityIndependence + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- **Independence of the prime element.** +Assuming the unit-cohomology axiom, replacing the chosen prime of the Frobenius fixed field +by any other prime does not change the reciprocity class. -/ +theorem reciprocityValueOfPrime_eq_reciprocityMap + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (σ : D.FrobeniusElements (K.toFiniteResidueAbstractField D) L hLK + (hLnormal := by + simpa only [FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal)) + (π : ambientFixedAddSubgroup A + (D.frobeniusFixedField (K.toFiniteResidueAbstractField D) L hLK + (hLnormal := by + simpa only [FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal) σ)) + (hπ : + let Sigma : FiniteAbstractField G := + { field := D.frobeniusFixedField + (K.toFiniteResidueAbstractField D) L hLK + (hLnormal := by + simpa only [FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal) σ + finite := D.frobeniusFixedField_absoluteFinite K L hLK σ } + v.IsPrimeElement Sigma π) : + D.reciprocityValueOfPrime A (K.toFiniteResidueAbstractField D) + L hLK + (hLnormal := by + simpa only [FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal) + (hLfinite := by + simpa only [FiniteAbstractField.toFiniteResidueAbstractField] using hLfinite) σ π = + D.reciprocityMap A v K L hLK σ := by + let KR := K.toFiniteResidueAbstractField D + let hLnormalKR : (extensionSubgroup KR.field L hLK).Normal := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLnormal + let hLfiniteKR : Finite + (KR.field.toSubgroup ⧸ extensionSubgroup KR.field L hLK) := by + simpa only [KR, FiniteAbstractField.toFiniteResidueAbstractField] using hLfinite + let S := D.frobeniusFixedField KR L hLK σ + let E := D.maximalUnramifiedField L + have hSK : S.toSubgroup ≤ K.field.toSubgroup := + D.frobeniusFixedField_le KR L hLK σ + let hSfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S hSK) := + D.frobeniusFixedField_finite KR L hLK σ + let hSabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) S (le_baseField S)) := + D.frobeniusFixedField_absoluteFinite K L hLK σ + let Sigma : FiniteAbstractField G := ⟨S, hSabsolute⟩ + have hπSigma : v.IsPrimeElement Sigma π := by + simpa [Sigma, S, KR] using hπ + let π₀ : ambientFixedAddSubgroup A S := v.chosenPrimeElement Sigma + let u : v.unitAddSubgroup Sigma := + ⟨π - π₀, v.sub_chosenPrimeElement_mem_unitAddSubgroup Sigma hπSigma⟩ + rw [D.reciprocityMap_eq_chosenPrime A v K L hLK σ] + apply QuotientAddGroup.eq_iff_sub_mem.mpr + change relativeNorm A K.field S hSK π - + relativeNorm A K.field S hSK π₀ ∈ infiniteNormSubgroup A E K.field + rw [← map_sub] + change relativeNorm A K.field S hSK u.1 ∈ + infiniteNormSubgroup A E K.field + rw [mem_infiniteNormSubgroup_iff] + intro M + let hEnormal : + (extensionSubgroup K.field E + (D.maximalUnramifiedField_le_of_le hLK)).Normal := + D.extensionSubgroup_maximalUnramifiedField_normal K.field L hLK + let R := M.galoisRefinement + let P := R.compositumWith S + have hES : E.toSubgroup ≤ S.toSubgroup := + D.fieldInertia_le_frobeniusFixedField KR L hLK σ + have hPS : P.toSubgroup ≤ S.toSubgroup := + R.compositumWith_le_right S + have hPK : P.toSubgroup ≤ K.field.toSubgroup := hPS.trans hSK + have hPM : P.toSubgroup ≤ M.field.toSubgroup := + (R.compositumWith_le_left S).trans M.galoisRefinement_le_field + let hRnormal : + (extensionSubgroup K.field R.field R.below).Normal := inferInstance + let hPSnormal : + (extensionSubgroup S P hPS).Normal := + FiniteIntermediateField.compositumWith_normal R S hSK + let hPSfinite : Finite + (S.toSubgroup ⧸ extensionSubgroup S P hPS) := + R.compositumWith_finite S hSK + let hPKfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field P hPK) := + R.compositumWith_finite_over_base S hSK + have hSinertia : D.fieldInertia S = E := by + dsimp [S, E] + exact D.frobeniusFixedField_fieldInertia KR L hLK σ + have hPSunramified : + (DegreeData.AbstractExtension.mk P S hPS).IsUnramified D := by + rw [(DegreeData.AbstractExtension.mk P S hPS).isUnramified_iff_inertia_le D] + intro x hx + change x ∈ R.field.toSubgroup ∧ x ∈ S.toSubgroup + refine ⟨R.above ?_, hx.1⟩ + have hxI : x ∈ D.fieldInertia S := ⟨hx.1, hx.2⟩ + rw [hSinertia] at hxI + exact hxI + let Sresidue := Sigma.toFiniteResidueAbstractField D + let hPSnormalResidue : + (extensionSubgroup Sresidue.field P hPS).Normal := by + simpa only [Sresidue, Sigma, + FiniteAbstractField.toFiniteResidueAbstractField] using hPSnormal + let hPSfiniteResidue : Finite + (Sresidue.field.toSubgroup ⧸ + extensionSubgroup Sresidue.field P hPS) := by + simpa only [Sresidue, Sigma, + FiniteAbstractField.toFiniteResidueAbstractField] using hPSfinite + obtain ⟨g, hg⟩ := + D.exists_quotient_generator_of_unramified + Sresidue P hPS (by + simpa only [Sresidue, Sigma, + FiniteAbstractField.toFiniteResidueAbstractField] using hPSunramified) + let hPabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) P (le_baseField P)) := + relativeTowerQuotientFinite (baseField G) S P hPS (le_baseField S) + let : Fintype (S.toSubgroup ⧸ extensionSubgroup S P hPS) := + Fintype.ofFinite _ + let Kuc : FiniteAbstractField G := Sigma + let Euc : FiniteUnramifiedCyclicExtension D Kuc := + { field := P + below := hPS + normal := hPSnormal + finite := hPSfinite + generator := g + generates := hg + unramified := hPSunramified } + have hzero : + CategoryTheory.Limits.IsZero + (tateCohomology (Euc.unitRepresentation v) 0) ∧ + CategoryTheory.Limits.IsZero + (tateCohomology (Euc.unitRepresentation v) (-1)) := + hAxiom Kuc Euc + obtain ⟨ε, hε⟩ := + v.exists_unit_relativeNorm_eq_of_tateHZero_isZero + Euc.toFiniteAbstractFieldExtension Euc.normal + Euc.toFiniteAbstractFieldExtension_isUnramified + g hg hzero.1 u + let hMfinite : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field M.field M.below) := M.finite + let hPMfinite : Finite + (M.field.toSubgroup ⧸ extensionSubgroup M.field P hPM) := + FiniteIntermediateField.finite_extension_of_le hPK M.below hPM + change relativeNorm A K.field S hSK u.1 ∈ + (relativeNorm A K.field M.field M.below).range + refine ⟨relativeNorm A M.field P hPM ε.1, ?_⟩ + let TMP : DegreeData.FiniteTower G := + { top := P + middle := M.field + base := K.field + top_le_middle := hPM + middle_le_base := M.below + finiteTopQuotient := hPMfinite + finiteBaseQuotient := hMfinite } + let TSP : DegreeData.FiniteTower G := + { top := P + middle := S + base := K.field + top_le_middle := hPS + middle_le_base := hSK + finiteTopQuotient := hPSfinite + finiteBaseQuotient := hSfinite } + calc + relativeNorm A K.field M.field M.below + (relativeNorm A M.field P hPM ε.1) = + relativeNorm A K.field P hPK ε.1 := + TMP.norm_trans_apply A ε.1 + _ = relativeNorm A K.field S hSK + (relativeNorm A S P hPS ε.1) := + (TSP.norm_trans_apply A ε.1).symm + _ = relativeNorm A K.field S hSK u.1 := congrArg _ hε + +end DegreeData + +end reciprocityIndependence + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/RelativeNormDoubleCoset.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/RelativeNormDoubleCoset.lean new file mode 100644 index 0000000000..098e32134b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/RelativeNormDoubleCoset.lean @@ -0,0 +1,311 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Norm +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +public import Mathlib.GroupTheory.GroupAction.Quotient + +/-! # Relative Norm Double Coset -/ + +@[expose] public section +universe u + +namespace ClassFormation + +open KummerTheory + +/-! +# The abstract reciprocity construction: the double-coset decomposition of a relative norm + +The norm calculation in the proof of transfer--norm naturality partitions +the left cosets for an extension by the orbits of an intermediate subgroup. +This file constructs that partition from Mathlib's class-formula equivalence +and reindexes the actual relative norm along it. +-/ + +noncomputable +section + +open scoped BigOperators + +open CyclicCohomology MulAction + +section doubleCosetEquivalences + +variable {G : Type u} [Group G] [TopologicalSpace G] + +/-- Membership in the stabilizer of a left coset is the literal conjugate +intersection condition. For the representative `t⁻¹` this reads +`k' ∈ K' ∩ t⁻¹ S t`, the subgroup occurring in the classical +double-coset norm calculation. -/ +theorem mem_relativeNormDoubleCoset_stabilizer_iff + (K K' S : ClosedSubgroup G) + (hSK : S.toSubgroup ≤ K.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + (t : K.toSubgroup) + (k' : extensionSubgroup K K' hK'K) : + k' ∈ MulAction.stabilizer (extensionSubgroup K K' hK'K) + (QuotientGroup.mk t : + K.toSubgroup ⧸ extensionSubgroup K S hSK) ↔ + t.1⁻¹ * k'.1.1 * t.1 ∈ S.toSubgroup := by + rw [mem_stabilizer_iff] + change QuotientGroup.mk (k'.1 * t) = QuotientGroup.mk t ↔ _ + rw [QuotientGroup.eq] + change (k'.1 * t).1⁻¹ * t.1 ∈ S.toSubgroup ↔ _ + constructor + · intro h + have hi := S.toSubgroup.inv_mem h + simpa [mul_assoc] using hi + · intro h + have hi := S.toSubgroup.inv_mem h + simpa [mul_assoc] using hi + +/-- The class-formula decomposition of the left cosets for `S | K` into +orbits under the subgroup belonging to `K' | K` and the corresponding +stabilizer cosets. These orbits are the double cosets used. -/ +noncomputable def relativeNormDoubleCosetEquiv + (K K' S : ClosedSubgroup G) + (hSK : S.toSubgroup ≤ K.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) : + (K.toSubgroup ⧸ extensionSubgroup K S hSK) ≃ + Σ q : Quotient (orbitRel (extensionSubgroup K K' hK'K) + (K.toSubgroup ⧸ extensionSubgroup K S hSK)), + (extensionSubgroup K K' hK'K) ⧸ + MulAction.stabilizer (extensionSubgroup K K' hK'K) q.out := + MulAction.selfEquivSigmaOrbitsQuotientStabilizer + (extensionSubgroup K K' hK'K) + (K.toSubgroup ⧸ extensionSubgroup K S hSK) + +/-- The inverse class-formula map is left multiplication of the selected +orbit representative by the selected stabilizer-coset representative. -/ +@[simp] +theorem relativeNormDoubleCosetEquiv_symm_apply + (K K' S : ClosedSubgroup G) + (hSK : S.toSubgroup ≤ K.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + (q : Quotient (orbitRel (extensionSubgroup K K' hK'K) + (K.toSubgroup ⧸ extensionSubgroup K S hSK))) + (r : (extensionSubgroup K K' hK'K) ⧸ + MulAction.stabilizer (extensionSubgroup K K' hK'K) q.out) : + (relativeNormDoubleCosetEquiv K K' S hSK hK'K).symm ⟨q, r⟩ = + r.out • q.out := by + change (((MulAction.orbitEquivQuotientStabilizer + (extensionSubgroup K K' hK'K) q.out).symm r : + MulAction.orbit (extensionSubgroup K K' hK'K) q.out) : + K.toSubgroup ⧸ extensionSubgroup K S hSK) = _ + refine Quotient.inductionOn' r ?_ + intro s + calc + (((MulAction.orbitEquivQuotientStabilizer + (extensionSubgroup K K' hK'K) q.out).symm + (QuotientGroup.mk s) : + MulAction.orbit (extensionSubgroup K K' hK'K) q.out) : + K.toSubgroup ⧸ extensionSubgroup K S hSK) = s • q.out := + MulAction.orbitEquivQuotientStabilizer_symm_apply + (extensionSubgroup K K' hK'K) q.out s + _ = (QuotientGroup.mk s).out • q.out := by + symm + simpa only [MulAction.ofQuotientStabilizer_mk] using + congrArg + (MulAction.ofQuotientStabilizer + (extensionSubgroup K K' hK'K) q.out) + (QuotientGroup.out_eq' (QuotientGroup.mk s)) + +end doubleCosetEquivalences + +/-- The class-formula inverse for an arbitrary chosen representative of +each orbit. This form is used in transfer--norm naturality to choose the norm +representative `t⁻¹` attached to a transfer representative `t`. -/ +@[simp] +theorem chosenOrbitClassEquiv_symm_apply + {M : Type*} {X : Type*} [Group M] [MulAction M X] + {φ : Quotient (orbitRel M X) → X} + (hφ : Function.LeftInverse Quotient.mk'' φ) + (q : Quotient (orbitRel M X)) + (r : M ⧸ stabilizer M (φ q)) : + (MulAction.selfEquivSigmaOrbitsQuotientStabilizer' M X hφ).symm + ⟨q, r⟩ = r.out • φ q := by + change (((MulAction.orbitEquivQuotientStabilizer M (φ q)).symm r : + orbit M (φ q)) : X) = _ + refine Quotient.inductionOn' r ?_ + intro m + calc + (((MulAction.orbitEquivQuotientStabilizer M (φ q)).symm + (QuotientGroup.mk m) : orbit M (φ q)) : X) = m • φ q := + MulAction.orbitEquivQuotientStabilizer_symm_apply M (φ q) m + _ = (QuotientGroup.mk m).out • φ q := by + symm + simpa only [MulAction.ofQuotientStabilizer_mk] using + congrArg (MulAction.ofQuotientStabilizer M (φ q)) + (QuotientGroup.out_eq' (QuotientGroup.mk m)) + +section relativeNormFormulas + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +/-- The relative norm reindexed by arbitrary chosen representatives of the +intermediate-subgroup orbits. -/ +theorem relativeNorm_eq_sum_chosenOrbit_of_fintype + (A : Rep ℤ G) (K S : ClosedSubgroup G) + (hSK : S.toSubgroup ≤ K.toSubgroup) + (M : Subgroup K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K S hSK)] + {φ : Quotient (orbitRel M + (K.toSubgroup ⧸ extensionSubgroup K S hSK)) → + (K.toSubgroup ⧸ extensionSubgroup K S hSK)} + (hφ : Function.LeftInverse Quotient.mk'' φ) + [Fintype (Quotient (orbitRel M + (K.toSubgroup ⧸ extensionSubgroup K S hSK)))] + [(q : Quotient (orbitRel M + (K.toSubgroup ⧸ extensionSubgroup K S hSK))) → + Fintype (M ⧸ stabilizer M (φ q))] + (a : ambientFixedAddSubgroup A S) : + ((relativeNorm A K S hSK a : ambientFixedAddSubgroup A K) : A.V) = + ∑ q, ∑ r, relativeCosetAction A K S hSK a + ((MulAction.selfEquivSigmaOrbitsQuotientStabilizer' + M (K.toSubgroup ⧸ extensionSubgroup K S hSK) hφ).symm ⟨q, r⟩) := by + let := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K S hSK) + rw [relativeNorm_apply_coe, relativeNormValue] + let e := MulAction.selfEquivSigmaOrbitsQuotientStabilizer' + M (K.toSubgroup ⧸ extensionSubgroup K S hSK) hφ + calc + ∑ q, relativeCosetAction A K S hSK a q = + ∑ p, relativeCosetAction A K S hSK a (e.symm p) := + (e.symm.sum_comp (relativeCosetAction A K S hSK a)).symm + _ = _ := Fintype.sum_sigma _ + +/-- Enumerate the orbit and stabilizer-coset pairs indexing a relative norm. -/ +@[implicit_reducible] +noncomputable def relativeNormDoubleCosetSigmaFintype + (K K' S : ClosedSubgroup G) + (hSK : S.toSubgroup ≤ K.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K S hSK)] : + Fintype (Σ q : Quotient (orbitRel + (extensionSubgroup K K' hK'K) + (K.toSubgroup ⧸ extensionSubgroup K S hSK)), + (extensionSubgroup K K' hK'K) ⧸ + MulAction.stabilizer (extensionSubgroup K K' hK'K) q.out) := by + letI := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K S hSK) + exact Fintype.ofEquiv + (K.toSubgroup ⧸ extensionSubgroup K S hSK) + (relativeNormDoubleCosetEquiv K K' S hSK hK'K) + +/-- Enumerate the finitely many intermediate-subgroup orbits on relative cosets. -/ +@[implicit_reducible] +noncomputable def relativeNormDoubleCosetOrbitFintype + (K K' S : ClosedSubgroup G) + (hSK : S.toSubgroup ≤ K.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K S hSK)] : + Fintype (Quotient (orbitRel (extensionSubgroup K K' hK'K) + (K.toSubgroup ⧸ extensionSubgroup K S hSK))) := by + letI := relativeNormDoubleCosetSigmaFintype K K' S hSK hK'K + exact Fintype.ofInjective + (fun q => (⟨q, QuotientGroup.mk 1⟩ : + Σ q : Quotient (orbitRel (extensionSubgroup K K' hK'K) + (K.toSubgroup ⧸ extensionSubgroup K S hSK)), + (extensionSubgroup K K' hK'K) ⧸ + MulAction.stabilizer (extensionSubgroup K K' hK'K) q.out)) (by + intro q q' h + exact congrArg Sigma.fst h) + +/-- Enumerate the stabilizer cosets in a relative-norm orbit. -/ +@[implicit_reducible] +noncomputable def relativeNormDoubleCosetStabilizerFintype + (K K' S : ClosedSubgroup G) + (hSK : S.toSubgroup ≤ K.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K S hSK)] + (q : Quotient (orbitRel (extensionSubgroup K K' hK'K) + (K.toSubgroup ⧸ extensionSubgroup K S hSK))) : + Fintype ((extensionSubgroup K K' hK'K) ⧸ + MulAction.stabilizer (extensionSubgroup K K' hK'K) q.out) := by + letI := relativeNormDoubleCosetSigmaFintype K K' S hSK hK'K + exact Fintype.ofInjective + (fun r => (⟨q, r⟩ : + Σ q : Quotient (orbitRel (extensionSubgroup K K' hK'K) + (K.toSubgroup ⧸ extensionSubgroup K S hSK)), + (extensionSubgroup K K' hK'K) ⧸ + MulAction.stabilizer (extensionSubgroup K K' hK'K) q.out)) (by + intro r r' h + exact eq_of_heq (Sigma.mk.inj_iff.mp h).2) + +/-- The double-coset norm formula with caller-supplied finite enumerations +of the orbit set and the stabilizer cosets. This form is convenient in +arguments which already obtained those enumerations from a transfer +formula; the result is independent of their ordering. -/ +theorem relativeNorm_eq_sum_doubleCoset_of_fintype + (A : Rep ℤ G) (K K' S : ClosedSubgroup G) + (hSK : S.toSubgroup ≤ K.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K S hSK)] + [Fintype (Quotient (orbitRel (extensionSubgroup K K' hK'K) + (K.toSubgroup ⧸ extensionSubgroup K S hSK)))] + [(q : Quotient (orbitRel (extensionSubgroup K K' hK'K) + (K.toSubgroup ⧸ extensionSubgroup K S hSK))) → + Fintype ((extensionSubgroup K K' hK'K) ⧸ + MulAction.stabilizer (extensionSubgroup K K' hK'K) q.out)] + (a : ambientFixedAddSubgroup A S) : + ((relativeNorm A K S hSK a : ambientFixedAddSubgroup A K) : A.V) = + ∑ q, ∑ r, relativeCosetAction A K S hSK a + ((relativeNormDoubleCosetEquiv K K' S hSK hK'K).symm ⟨q, r⟩) := by + let := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K S hSK) + rw [relativeNorm_apply_coe, relativeNormValue] + calc + ∑ q, relativeCosetAction A K S hSK a q = + ∑ p, relativeCosetAction A K S hSK a + ((relativeNormDoubleCosetEquiv K K' S hSK hK'K).symm p) := + ((relativeNormDoubleCosetEquiv K K' S hSK hK'K).symm.sum_comp + (relativeCosetAction A K S hSK a)).symm + _ = ∑ q, ∑ r, relativeCosetAction A K S hSK a + ((relativeNormDoubleCosetEquiv K K' S hSK hK'K).symm ⟨q, r⟩) := + Fintype.sum_sigma _ + +/-- The actual norm `N_{S/K}` reindexed first by intermediate-subgroup +orbits and then by stabilizer cosets. This is the additive form of the +double-coset product decomposition in the proof of transfer--norm naturality. -/ +theorem relativeNorm_eq_sum_doubleCoset + (A : Rep ℤ G) (K K' S : ClosedSubgroup G) + (hSK : S.toSubgroup ≤ K.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [Finite (K.toSubgroup ⧸ extensionSubgroup K S hSK)] + (a : ambientFixedAddSubgroup A S) : + let Ω := Quotient (orbitRel (extensionSubgroup K K' hK'K) + (K.toSubgroup ⧸ extensionSubgroup K S hSK)) + letI : Fintype Ω := + relativeNormDoubleCosetOrbitFintype K K' S hSK hK'K + letI (q : Ω) : Fintype ((extensionSubgroup K K' hK'K) ⧸ + MulAction.stabilizer (extensionSubgroup K K' hK'K) q.out) := + relativeNormDoubleCosetStabilizerFintype K K' S hSK hK'K q + ((relativeNorm A K S hSK a : ambientFixedAddSubgroup A K) : A.V) = + ∑ q, ∑ r, relativeCosetAction A K S hSK a + ((relativeNormDoubleCosetEquiv K K' S hSK hK'K).symm ⟨q, r⟩) := by + dsimp only + let := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K S hSK) + let : Fintype (Quotient (orbitRel + (extensionSubgroup K K' hK'K) + (K.toSubgroup ⧸ extensionSubgroup K S hSK))) := + relativeNormDoubleCosetOrbitFintype K K' S hSK hK'K + let (q : Quotient (orbitRel (extensionSubgroup K K' hK'K) + (K.toSubgroup ⧸ extensionSubgroup K S hSK))) : + Fintype ((extensionSubgroup K K' hK'K) ⧸ + MulAction.stabilizer (extensionSubgroup K K' hK'K) q.out) := + relativeNormDoubleCosetStabilizerFintype K K' S hSK hK'K q + exact relativeNorm_eq_sum_doubleCoset_of_fintype + A K K' S hSK hK'K a + +end relativeNormFormulas + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferNaturality.lean new file mode 100644 index 0000000000..be1ccfaaca --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferNaturality.lean @@ -0,0 +1,284 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.GroupTheory.Transfer +public import Mathlib.GroupTheory.Abelianization.Defs + +/-! # Transfer Naturality -/ + +@[expose] public section +namespace ClassFormation + +/-! +# Naturality of transfer under a quotient + +This file supplies the group-theoretic source used in transfer--norm naturality. If a surjection +has kernel contained in a finite-index subgroup, it identifies the two left-coset spaces and +transfer commutes with the induced maps on abelianizations. +-/ + +noncomputable +section + +open Function +open scoped Pointwise + +variable {P : Type*} {Q : Type*} [Group P] [Group Q] + +/-- A surjection identifies left cosets of `H` with left cosets of its image +when its kernel is contained in `H`. -/ +noncomputable def leftCosetEquivMapOfSurjective + (f : P →* Q) (hf : Function.Surjective f) + (H : Subgroup P) (hker : f.ker ≤ H) : + P ⧸ H ≃ Q ⧸ H.map f := by + let mapCoset : P ⧸ H → Q ⧸ H.map f := + Quotient.map' f fun x y hxy => by + rw [QuotientGroup.leftRel_apply] + rw [← f.map_inv, ← f.map_mul] + exact ⟨x⁻¹ * y, (QuotientGroup.leftRel_apply).1 hxy, rfl⟩ + apply Equiv.ofBijective mapCoset + constructor + · refine Quotient.ind' fun x => ?_ + refine Quotient.ind' fun y hxy => ?_ + apply Quotient.sound' + rw [QuotientGroup.leftRel_apply] + have hrel : QuotientGroup.leftRel (H.map f) (f x) (f y) := + Quotient.eq''.1 hxy + have hmap : f (x⁻¹ * y) ∈ H.map f := by + rw [f.map_mul, f.map_inv] + exact (QuotientGroup.leftRel_apply).1 hrel + have hcomap : x⁻¹ * y ∈ (H.map f).comap f := hmap + rwa [Subgroup.comap_map_eq_self hker] at hcomap + · refine Quotient.ind' fun q => ?_ + obtain ⟨p, rfl⟩ := hf q + exact ⟨QuotientGroup.mk p, rfl⟩ + +/-- +Establishes the identity `leftCosetEquivMapOfSurjective f hf H hker (QuotientGroup.mk p) = +QuotientGroup.mk (f p)`. +-/ +@[simp] +theorem leftCosetEquivMapOfSurjective_mk + (f : P →* Q) (hf : Function.Surjective f) + (H : Subgroup P) (hker : f.ker ≤ H) (p : P) : + leftCosetEquivMapOfSurjective f hf H hker (QuotientGroup.mk p) = + QuotientGroup.mk (f p) := + rfl + +/-- +Establishes the identity `leftCosetEquivMapOfSurjective f hf H hker (p • q) = f p • +leftCosetEquivMapOfSurjective f hf H hker q`. +-/ +@[simp] +theorem leftCosetEquivMapOfSurjective_smul + (f : P →* Q) (hf : Function.Surjective f) + (H : Subgroup P) (hker : f.ker ≤ H) + (p : P) (q : P ⧸ H) : + leftCosetEquivMapOfSurjective f hf H hker (p • q) = + f p • leftCosetEquivMapOfSurjective f hf H hker q := by + refine Quotient.inductionOn' q ?_ + intro x + simp only [MulAction.Quotient.smul_mk, leftCosetEquivMapOfSurjective_mk, + smul_eq_mul, map_mul] + +/-- A left transversal descends along the same quotient map. It is built +from the induced equivalence of left-coset spaces, so its chosen +representatives are literally the images of the original representatives. -/ +noncomputable def leftTransversalMapOfSurjective + (f : P →* Q) (hf : Function.Surjective f) + (H : Subgroup P) (hker : f.ker ≤ H) + (T : H.LeftTransversal) : (H.map f).LeftTransversal := by + let e := leftCosetEquivMapOfSurjective f hf H hker + let u : Q ⧸ H.map f → Q := fun q => + f (T.2.leftQuotientEquiv (e.symm q) : P) + have hu (q : Q ⧸ H.map f) : (u q : Q ⧸ H.map f) = q := by + change e (QuotientGroup.mk + (T.2.leftQuotientEquiv (e.symm q) : P)) = q + have hrep : QuotientGroup.mk + (T.2.leftQuotientEquiv (e.symm q) : P) = e.symm q := + T.2.quotientGroupMk_leftQuotientEquiv (e.symm q) + exact (congrArg e hrep).trans (e.apply_symm_apply q) + exact ⟨Set.range u, Subgroup.isComplement_range_left hu⟩ + +/-- +The defining evaluation formula for `leftTransversalMapOfSurjective` is +`((leftTransversalMapOfSurjective f hf H hker T).2.leftQuotientEquiv q : Q) = f +(T.2.leftQuotientEquiv ((leftCosetEquivMapOfSurjective f hf H hker).symm q) : P)`. +-/ +@[simp] +theorem leftTransversalMapOfSurjective_apply + (f : P →* Q) (hf : Function.Surjective f) + (H : Subgroup P) (hker : f.ker ≤ H) + (T : H.LeftTransversal) (q : Q ⧸ H.map f) : + ((leftTransversalMapOfSurjective f hf H hker T).2.leftQuotientEquiv q : Q) = + f (T.2.leftQuotientEquiv + ((leftCosetEquivMapOfSurjective f hf H hker).symm q) : P) := by + let e := leftCosetEquivMapOfSurjective f hf H hker + let u : Q ⧸ H.map f → Q := fun r => + f (T.2.leftQuotientEquiv (e.symm r) : P) + have hu (r : Q ⧸ H.map f) : (u r : Q ⧸ H.map f) = r := by + change e (QuotientGroup.mk + (T.2.leftQuotientEquiv (e.symm r) : P)) = r + have hrep : QuotientGroup.mk + (T.2.leftQuotientEquiv (e.symm r) : P) = e.symm r := + T.2.quotientGroupMk_leftQuotientEquiv (e.symm r) + exact (congrArg e hrep).trans (e.apply_symm_apply r) + change ((Subgroup.isComplement_range_left hu).leftQuotientEquiv q : Q) = u q + exact Subgroup.IsComplement.leftQuotientEquiv_apply hu q + +private theorem leftQuotientEquiv_mk_of_mem + (H : Subgroup P) (T : H.LeftTransversal) (p : P) + (hp : p ∈ (T : Set P)) : + (T.2.leftQuotientEquiv (QuotientGroup.mk p) : P) = p := by + have heq : T.2.leftQuotientEquiv (QuotientGroup.mk p) = + (⟨p, hp⟩ : (T : Set P)) := by + apply T.2.leftQuotientEquiv.symm.injective + rw [T.2.leftQuotientEquiv.symm_apply_apply] + rfl + exact congrArg Subtype.val heq + +private theorem mem_leftTransversalMapOfSurjective_iff + (f : P →* Q) (hf : Function.Surjective f) + (H : Subgroup P) (hker : f.ker ≤ H) + (T : H.LeftTransversal) (q : Q) : + q ∈ (leftTransversalMapOfSurjective f hf H hker T : Set Q) ↔ + ∃ p ∈ (T : Set P), f p = q := by + let e := leftCosetEquivMapOfSurjective f hf H hker + change q ∈ Set.range (fun r : Q ⧸ H.map f => + f (T.2.leftQuotientEquiv (e.symm r) : P)) ↔ _ + constructor + · rintro ⟨r, rfl⟩ + exact ⟨T.2.leftQuotientEquiv (e.symm r), + (T.2.leftQuotientEquiv (e.symm r)).2, rfl⟩ + · rintro ⟨p, hp, rfl⟩ + refine ⟨e (QuotientGroup.mk p), ?_⟩ + change f (T.2.leftQuotientEquiv + (e.symm (e (QuotientGroup.mk p))) : P) = f p + rw [e.symm_apply_apply, leftQuotientEquiv_mk_of_mem H T p hp] + +private theorem leftTransversalMapOfSurjective_smul + (f : P →* Q) (hf : Function.Surjective f) + (H : Subgroup P) (hker : f.ker ≤ H) + (T : H.LeftTransversal) (p : P) : + leftTransversalMapOfSurjective f hf H hker (p • T) = + f p • leftTransversalMapOfSurjective f hf H hker T := by + apply Subtype.ext + ext q + rw [mem_leftTransversalMapOfSurjective_iff] + constructor + · rintro ⟨x, hx, rfl⟩ + obtain ⟨t, ht, rfl⟩ := Set.mem_smul_set.mp hx + have hft := (mem_leftTransversalMapOfSurjective_iff + f hf H hker T (f t)).2 + ⟨t, ht, rfl⟩ + rw [smul_eq_mul, map_mul] + change f p * f t ∈ + (f p • (leftTransversalMapOfSurjective f hf H hker T : Set Q) : Set Q) + exact Set.smul_mem_smul_set hft + · intro hq + obtain ⟨t, ht, hpt⟩ := Set.mem_smul_set.mp hq + subst q + obtain ⟨x, hx, hfx⟩ := + (mem_leftTransversalMapOfSurjective_iff + f hf H hker T t).1 ht + refine ⟨p * x, Set.smul_mem_smul_set (a := p) hx, ?_⟩ + simp [map_mul, hfx] + +private theorem leftTransversals_diff_natural_of_surjective + (f : P →* Q) (hf : Function.Surjective f) + (H : Subgroup P) (hker : f.ker ≤ H) [H.FiniteIndex] + (S T : H.LeftTransversal) : + let J := H.map f + letI : J.FiniteIndex := by + rw [Subgroup.finiteIndex_iff, H.index_map_eq hf hker] + exact Subgroup.FiniteIndex.index_ne_zero + Abelianization.map (f.subgroupMap H) + (Subgroup.leftTransversals.diff + (Abelianization.of : H →* Abelianization H) S T) = + Subgroup.leftTransversals.diff + (Abelianization.of : J →* Abelianization J) + (leftTransversalMapOfSurjective f hf H hker S) + (leftTransversalMapOfSurjective f hf H hker T) := by + dsimp only + let : (H.map f).FiniteIndex := by + rw [Subgroup.finiteIndex_iff, H.index_map_eq hf hker] + exact Subgroup.FiniteIndex.index_ne_zero + classical + let : Fintype (P ⧸ H) := H.fintypeQuotientOfFiniteIndex + let : Fintype (Q ⧸ H.map f) := + (H.map f).fintypeQuotientOfFiniteIndex + let e := leftCosetEquivMapOfSurjective f hf H hker + simp only [Subgroup.leftTransversals.diff, map_prod, + Abelianization.map_of, leftTransversalMapOfSurjective_apply] + rw [← e.prod_comp] + apply Finset.prod_congr rfl + intro q _ + apply congrArg Abelianization.of + apply Subtype.ext + simp [e] + +/-- Transfer is natural for a surjective homomorphism whose kernel is +contained in the finite-index subgroup. Both transfer maps are Mathlib's +actual `MonoidHom.transfer`; the proof descends an arbitrary left +transversal and compares the defining products term by term. -/ +theorem abelianization_transfer_natural_of_surjective + (f : P →* Q) (hf : Function.Surjective f) + (H : Subgroup P) (hker : f.ker ≤ H) [H.FiniteIndex] : + let J := H.map f + letI : J.FiniteIndex := by + rw [Subgroup.finiteIndex_iff, H.index_map_eq hf hker] + exact Subgroup.FiniteIndex.index_ne_zero + (Abelianization.map (f.subgroupMap H)).comp + (Abelianization.lift + (MonoidHom.transfer + (Abelianization.of : H →* Abelianization H))) = + (Abelianization.lift + (MonoidHom.transfer + (Abelianization.of : J →* Abelianization J))).comp + (Abelianization.map f) := by + dsimp only + let : (H.map f).FiniteIndex := by + rw [Subgroup.finiteIndex_iff, H.index_map_eq hf hker] + exact Subgroup.FiniteIndex.index_ne_zero + apply Abelianization.hom_ext + apply MonoidHom.ext + intro p + simp only [MonoidHom.comp_apply, Abelianization.lift_apply_of, + Abelianization.map_of] + let T : H.LeftTransversal := default + rw [MonoidHom.transfer_def + (Abelianization.of : H →* Abelianization H) T p] + rw [MonoidHom.transfer_def + (Abelianization.of : H.map f →* Abelianization (H.map f)) + (leftTransversalMapOfSurjective f hf H hker T) (f p)] + rw [← leftTransversalMapOfSurjective_smul f hf H hker T p] + exact leftTransversals_diff_natural_of_surjective + f hf H hker T (p • T) + +/-- Replacing a finite-index subgroup by an equal subgroup only transports +the codomain of transfer along the corresponding canonical equivalence. -/ +theorem abelianization_transfer_congr_subgroup + (H J : Subgroup P) (h : H = J) + [H.FiniteIndex] [J.FiniteIndex] : + (MulEquiv.subgroupCongr h).abelianizationCongr.toMonoidHom.comp + (Abelianization.lift + (MonoidHom.transfer + (Abelianization.of : H →* Abelianization H))) = + Abelianization.lift + (MonoidHom.transfer + (Abelianization.of : J →* Abelianization J)) := by + subst J + have hc : MulEquiv.subgroupCongr (show H = H from rfl) = + MulEquiv.refl H := by + ext x + rfl + rw [hc, abelianizationCongr_refl] + exact MonoidHom.id_comp _ + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferOrbitClosure.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferOrbitClosure.lean new file mode 100644 index 0000000000..2d626c5cfd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferOrbitClosure.lean @@ -0,0 +1,140 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.TopologicalGeneration +public import Mathlib.GroupTheory.Transfer +public import Mathlib.Topology.Algebra.Group.ClosedSubgroup + +/-! # Transfer Orbit Closure -/ + +@[expose] public section +namespace ClassFormation + +/-! +# The closed cyclic subgroup attached to one transfer orbit + +For a finite-index subgroup `H` and an element `g`, the intersection of +the closed cyclic subgroup generated by `g` with the stabilizer of a coset +is generated by the power whose exponent is that orbit's minimal period. +This is the topological group calculation used in transfer--norm naturality. +-/ + +noncomputable +section + +open MulAction + +/-- The closed cyclic subgroup generated by the transfer power is the +intersection of the original closed cyclic subgroup with the stabilizer of +the chosen coset. -/ +theorem closedSubgroupGenerated_pow_eq_inf_stabilizer + {Q : Type*} [Group Q] [TopologicalSpace Q] [IsTopologicalGroup Q] + (H : Subgroup Q) [H.FiniteIndex] + (hHclosed : IsClosed (H : Set Q)) (g : Q) (x : Q ⧸ H) : + (closedSubgroupGenerated + ({g ^ Function.minimalPeriod (g • ·) x} : Set Q) : Subgroup Q) = + (closedSubgroupGenerated ({g} : Set Q) : Subgroup Q) ⊓ + MulAction.stabilizer Q x := by + let m := Function.minimalPeriod (g • ·) x + let V := MulAction.stabilizer Q x + let t := x.out + have hx : x = t • (QuotientGroup.mk 1 : Q ⧸ H) := by + symm + change QuotientGroup.mk (t * 1) = x + rw [mul_one] + exact Quotient.out_eq' x + have hVeq : V = H.map (MulAut.conj t).toMonoidHom := by + change MulAction.stabilizer Q x = _ + rw [hx, stabilizer_smul_eq_stabilizer_map_conj, + MulAction.stabilizer_quotient] + have hVclosed : IsClosed (V : Set Q) := by + rw [hVeq, Subgroup.map_equiv_eq_comap_symm' + (MulAut.conj t) H] + change IsClosed ((fun y : Q => t⁻¹ * y * t) ⁻¹' (H : Set Q)) + simpa only [inv_inv] using + hHclosed.preimage (IsTopologicalGroup.continuous_conj t⁻¹) + let : V.FiniteIndex := by + rw [Subgroup.finiteIndex_iff, hVeq, + Subgroup.index_map_of_bijective (MulAut.conj t).bijective H] + exact Subgroup.FiniteIndex.index_ne_zero + have hVopen : IsOpen (V : Set Q) := + V.isOpen_of_isClosed_of_finiteIndex hVclosed + have halg : Subgroup.zpowers g ⊓ V = Subgroup.zpowers (g ^ m) := by + ext y + constructor + · rintro ⟨hy, hyV⟩ + obtain ⟨z, rfl⟩ := Subgroup.mem_zpowers_iff.mp hy + have hfix : g ^ z • x = x := + (mem_stabilizer_iff (G := Q)).mp hyV + have hdvd : (m : ℤ) ∣ z := + zpow_smul_eq_iff_minimalPeriod_dvd.mp hfix + obtain ⟨k, rfl⟩ := hdvd + apply Subgroup.mem_zpowers_iff.mpr + refine ⟨k, ?_⟩ + rw [zpow_mul, zpow_natCast] + · intro hy + obtain ⟨z, hz⟩ := Subgroup.mem_zpowers_iff.mp hy + rw [← hz] + constructor + · apply Subgroup.mem_zpowers_iff.mpr + refine ⟨(m : ℤ) * z, ?_⟩ + rw [zpow_mul, zpow_natCast] + · apply (mem_stabilizer_iff (G := Q)).mpr + rw [← zpow_natCast g m, ← zpow_mul] + apply zpow_smul_eq_iff_minimalPeriod_dvd.mpr + exact dvd_mul_right (m : ℤ) z + have hpow_le : Subgroup.zpowers (g ^ m) ≤ Subgroup.zpowers g := + Subgroup.zpowers_le_of_mem (Subgroup.npow_mem_zpowers g m) + have hpowV : Subgroup.zpowers (g ^ m) ≤ V := by + rw [← halg] + exact inf_le_right + have hsets : ((Subgroup.zpowers g : Set Q) ∩ (V : Set Q)) = + (Subgroup.zpowers (g ^ m) : Set Q) := + congrArg (fun U : Subgroup Q => (U : Set Q)) halg + change (Subgroup.closure ({g ^ m} : Set Q)).topologicalClosure = + (Subgroup.closure ({g} : Set Q)).topologicalClosure ⊓ V + rw [← Subgroup.zpowers_eq_closure, ← Subgroup.zpowers_eq_closure] + ext y + change y ∈ closure (Subgroup.zpowers (g ^ m) : Set Q) ↔ + y ∈ closure (Subgroup.zpowers g : Set Q) ∧ y ∈ V + constructor + · intro hy + exact ⟨closure_mono hpow_le hy, + closure_minimal hpowV hVclosed hy⟩ + · rintro ⟨hyg, hyV⟩ + have hyInter : y ∈ closure + ((Subgroup.zpowers g : Set Q) ∩ (V : Set Q)) := + hVopen.closure_inter ⟨hyg, hyV⟩ + rwa [hsets] at hyInter + +/-- Conjugation carries membership in the closed cyclic subgroup generated by +`x` to membership in the closed cyclic subgroup generated by the conjugate of +`x`. -/ +theorem mem_closedSubgroupGenerated_conjugate_iff + {Q : Type*} [Group Q] [TopologicalSpace Q] [IsTopologicalGroup Q] + (q x c : Q) : + c ∈ (closedSubgroupGenerated ({x} : Set Q)).toSubgroup ↔ + q * c * q⁻¹ ∈ + (closedSubgroupGenerated ({q * x * q⁻¹} : Set Q)).toSubgroup := by + let conjugationHom (g : Q) : Q →ₜ* Q := + { toMonoidHom := (MulAut.conj g).toMonoidHom + continuous_toFun := IsTopologicalGroup.continuous_conj g } + constructor + · intro hc + exact map_mem_closedSubgroupGenerated_singleton + (conjugationHom q) x hc + · intro hc + have h := map_mem_closedSubgroupGenerated_singleton + (conjugationHom q⁻¹) (q * x * q⁻¹) hc + change q⁻¹ * (q * c * q⁻¹) * (q⁻¹)⁻¹ ∈ + (closedSubgroupGenerated + ({q⁻¹ * (q * x * q⁻¹) * (q⁻¹)⁻¹} : Set Q)).toSubgroup at h + simpa [mul_assoc] using h + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean new file mode 100644 index 0000000000..0e1f2ac710 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean @@ -0,0 +1,514 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PrimeElements +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison + +/-! # Unit Cohomology Axiom -/ + +@[expose] public section +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +/-! +# The abstract reciprocity construction: the unit-cohomology axiom + +The coefficient group in the unit-cohomology axiom is the actual unit subgroup `U_L`, with +the action of the actual quotient `G_K / G_L`. The two Tate groups are the +homology objects of the finite-cyclic norm complexes. +-/ + +noncomputable +section + +open CategoryTheory + +universe u + +section Generic + +variable {G : Type u} [Group G] [TopologicalSpace G] + +/-- A finite cyclic extension of a bundled finite abstract field. The +generator and its cyclicity proof travel with the finite normal extension. -/ +structure FiniteCyclicSubextension (K : FiniteAbstractField G) where + /-- The closed subgroup representing the top field. -/ + field : ClosedSubgroup G + /-- The top-field subgroup is contained in the base-field subgroup. -/ + below : field.toSubgroup ≤ K.field.toSubgroup + /-- The top-field subgroup is normal inside the base-field subgroup. -/ + normal : (extensionSubgroup K.field field below).Normal + /-- The relative Galois quotient is finite. -/ + finite : Finite (K.field.toSubgroup ⧸ + extensionSubgroup K.field field below) + /-- A chosen generator of the relative Galois quotient. -/ + generator : K.field.toSubgroup ⧸ extensionSubgroup K.field field below + /-- Every quotient element is a power of the chosen generator. -/ + generates : ∀ x, x ∈ Subgroup.zpowers generator + +namespace FiniteCyclicSubextension + +variable {K : FiniteAbstractField G} + +/-- Forget the cyclic generator and normality, retaining the underlying finite +abstract extension. -/ +@[implicit_reducible] +def toFiniteAbstractExtension (E : FiniteCyclicSubextension K) : + DegreeData.FiniteAbstractExtension G where + field := E.field + base := K.field + below := E.below + finiteQuotient := E.finite + +/-- Structural unramifiedness of the underlying finite extension. -/ +def IsUnramified (E : FiniteCyclicSubextension K) (D : DegreeData G) : Prop := + E.toFiniteAbstractExtension.IsUnramified D + +/-- Structural total ramification of the underlying finite extension. -/ +def IsTotallyRamified (E : FiniteCyclicSubextension K) + (D : DegreeData G) : Prop := + E.toFiniteAbstractExtension.IsTotallyRamified D + +/-- Retain the finite-over-base endpoint bundles as well as the relative +finite quotient. -/ +@[implicit_reducible] +noncomputable def toFiniteAbstractFieldExtension + (E : FiniteCyclicSubextension K) : FiniteAbstractFieldExtension G := by + letI : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field E.field E.below) := + E.finite + exact FiniteAbstractFieldExtension.ofInclusion E.field K E.below + +/-- A finite cyclic subextension supplies normality of its representing subgroup. -/ +instance (E : FiniteCyclicSubextension K) : + (extensionSubgroup K.field E.field E.below).Normal := + E.normal + +/-- A finite cyclic subextension supplies finiteness of its Galois quotient. -/ +instance (E : FiniteCyclicSubextension K) : + Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field E.field E.below) := + E.finite + +/-- The finite quotient of a cyclic subextension carries its canonical `Fintype`. -/ +noncomputable instance (E : FiniteCyclicSubextension K) : + Fintype (K.field.toSubgroup ⧸ extensionSubgroup K.field E.field E.below) := + Fintype.ofFinite _ + +end FiniteCyclicSubextension + +end Generic + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] +variable {D : DegreeData G} {A : Rep ℤ G} + +/-- A finite cyclic extension together with the assertion that it is +unramified for the fixed degree datum. -/ +structure FiniteUnramifiedCyclicExtension + (D : DegreeData G) (K : FiniteAbstractField G) + extends FiniteCyclicSubextension K where + /-- The underlying finite cyclic extension is unramified for `D`. -/ + unramified : toFiniteCyclicSubextension.IsUnramified D + +namespace FiniteUnramifiedCyclicExtension + +variable {K : FiniteAbstractField G} + +/-- Forget cyclic and unramified structure while retaining both finite +endpoint fields and the relative finite quotient. -/ +@[implicit_reducible] +noncomputable def toFiniteAbstractFieldExtension + (E : FiniteUnramifiedCyclicExtension D K) : + FiniteAbstractFieldExtension G := + E.toFiniteCyclicSubextension.toFiniteAbstractFieldExtension + +/-- The unramified proof transported to the canonical finite field-extension +bundle. -/ +theorem toFiniteAbstractFieldExtension_isUnramified + (E : FiniteUnramifiedCyclicExtension D K) : + E.toFiniteAbstractFieldExtension.IsUnramified D := by + exact E.unramified + +/-- A finite unramified cyclic extension supplies normality of its representing subgroup. -/ +instance (E : FiniteUnramifiedCyclicExtension D K) : + (extensionSubgroup K.field E.field E.below).Normal := + E.normal + +/-- The quotient over `K` attached to a finite unramified cyclic extension is finite. -/ +instance (E : FiniteUnramifiedCyclicExtension D K) : + Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field E.field E.below) := + E.finite + +/-- The absolute quotient attached to a finite unramified cyclic extension is finite. -/ +noncomputable instance (E : FiniteUnramifiedCyclicExtension D K) : + Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) E.field (le_baseField E.field)) := + relativeTowerQuotientFinite (baseField G) K.field E.field E.below + (le_baseField K.field) + +/-- The finite quotient over `K` carries the canonical `Fintype` structure. -/ +noncomputable instance (E : FiniteUnramifiedCyclicExtension D K) : + Fintype (K.field.toSubgroup ⧸ extensionSubgroup K.field E.field E.below) := + Fintype.ofFinite _ + +end FiniteUnramifiedCyclicExtension + +namespace FiniteCyclicSubextension + +variable {K : FiniteAbstractField G} + +/-- The fixed coefficient representation attached to a bundled cyclic +extension. -/ +noncomputable def fixedRepresentation (E : FiniteCyclicSubextension K) + (A : Rep ℤ G) : + Rep ℤ (K.field.toSubgroup ⧸ extensionSubgroup K.field E.field E.below) := + extensionFixedRepresentation A K.field E.field E.below E.normal + +end FiniteCyclicSubextension + +/-- Elementwise content of `H⁰(Q,M)=0`: every element fixed by a cyclic +generator is an actual norm. -/ +theorem exists_norm_eq_of_tateHZero_isZero + {Q : IntegralRepGroupType} [Group Q] [Fintype Q] + (M : Rep ℤ Q) (g : Q) (hg : ∀ x, x ∈ Subgroup.zpowers g) + (hzero : Limits.IsZero (tateCohomology M 0)) : + ∀ x : M.V, M.ρ g x = x → ∃ y : M.V, M.norm.hom y = x := by + let : IsCyclic Q := isCyclic_of_generator g hg + let : CommGroup Q := IsCyclic.commGroup (α := Q) + let S := Rep.FiniteCyclicGroup.normHomCompSub M g + have hSzero : Limits.IsZero S.homology := by + exact Limits.IsZero.of_iso hzero + (TateCohomology.isoFiniteCyclicZero M g hg).symm + have hS : S.Exact := (S.exact_iff_isZero_homology).2 hSzero + intro x hx + have hxker : S.g x = 0 := by + change M.ρ g x - x = 0 + exact sub_eq_zero.mpr hx + rcases (S.moduleCat_exact_iff.mp hS x hxker) with ⟨y, hy⟩ + exact ⟨y, hy⟩ + +namespace ValuationData + +/-- Normalized valuation is invariant under the Galois action in a finite +tower. The proof uses transitivity of the actual norm and its invariance +under the normal-extension action. -/ +theorem valuationAt_normalExtensionAction + (v : ValuationData D A) (E : FiniteAbstractFieldExtension G) + (hnormal : (extensionSubgroup E.base.field E.field.field E.below).Normal) + (k : E.base.field.toSubgroup) + (a : ambientFixedAddSubgroup A E.field.field) : + v.valuationAt E.field + (normalExtensionAction A E.base.field E.field.field E.below + hnormal k a) = + v.valuationAt E.field a := by + apply Subtype.ext + apply zHatMulNat_injective (E.field.residueDegree D).property + calc + (E.field.residueDegree D : ℕ) • + ((v.valuationAt E.field + (normalExtensionAction A E.base.field E.field.field E.below + hnormal k a) : v.valueGroup) : ZHat) = + v.normCompositeAt E.field + (normalExtensionAction A E.base.field E.field.field E.below + hnormal k a) := + v.residueDegree_nsmul_dividedAt E.field _ + _ = v.normCompositeAt E.field a := by + change v.toAddMonoidHom + (normToBase A E.field.field + (normalExtensionAction A E.base.field E.field.field E.below + hnormal k a)) = + v.toAddMonoidHom (normToBase A E.field.field a) + congr 1 + let T : DegreeData.FiniteTower G := { + top := E.field.field + middle := E.base.field + base := baseField G + top_le_middle := E.below + middle_le_base := le_baseField E.base.field + finiteTopQuotient := E.finiteQuotient + finiteBaseQuotient := E.base.finite } + calc + relativeNorm A (baseField G) E.field.field + (E.below.trans (le_baseField E.base.field)) + (normalExtensionAction A E.base.field E.field.field E.below + hnormal k a) = + relativeNorm A (baseField G) E.base.field + (le_baseField E.base.field) + (relativeNorm A E.base.field E.field.field E.below + (normalExtensionAction A E.base.field E.field.field E.below + hnormal k a)) := + (T.norm_trans_apply A _).symm + _ = relativeNorm A (baseField G) E.base.field + (le_baseField E.base.field) + (relativeNorm A E.base.field E.field.field E.below a) := by + rw [relativeNorm_normalExtensionAction A E.base.field E.field.field + E.below hnormal k a] + _ = relativeNorm A (baseField G) E.field.field + (E.below.trans (le_baseField E.base.field)) a := + T.norm_trans_apply A a + _ = (E.field.residueDegree D : ℕ) • + ((v.valuationAt E.field a : v.valueGroup) : ZHat) := + (v.residueDegree_nsmul_dividedAt E.field a).symm + +/-- The action of `G_K` on the actual unit subgroup `U_L`. -/ +noncomputable def unitActionLinearMap + (v : ValuationData D A) (E : FiniteAbstractFieldExtension G) + (hnormal : (extensionSubgroup E.base.field E.field.field E.below).Normal) + (k : E.base.field.toSubgroup) : + v.unitAddSubgroup E.field →ₗ[ℤ] v.unitAddSubgroup E.field where + toFun u := ⟨normalExtensionAction A E.base.field E.field.field E.below + hnormal k u.1, by + rw [mem_unitAddSubgroup_iff, + v.valuationAt_normalExtensionAction E hnormal k u.1] + exact u.2⟩ + map_add' u w := by + apply Subtype.ext + apply Subtype.ext + change A.ρ k.1 (u.1.1 + w.1.1) = A.ρ k.1 u.1.1 + A.ρ k.1 w.1.1 + exact map_add (A.ρ k.1) _ _ + map_smul' n u := by + apply Subtype.ext + apply Subtype.ext + change A.ρ k.1 (n • u.1.1) = n • A.ρ k.1 u.1.1 + exact map_zsmul (A.ρ k.1) n u.1.1 + +/-- The `G_K`-representation on `U_L` before descending through `G_L`. -/ +noncomputable def unitRepresentationOverK + (v : ValuationData D A) (E : FiniteAbstractFieldExtension G) + (hnormal : (extensionSubgroup E.base.field E.field.field E.below).Normal) : + Rep ℤ E.base.field.toSubgroup := + Rep.of + { toFun := fun k => v.unitActionLinearMap E hnormal k + map_one' := by + ext u + change A.ρ (1 : G) u.1.1 = u.1.1 + simp + map_mul' := by + intro k₁ k₂ + ext u + change A.ρ (k₁.1 * k₂.1) u.1.1 = + A.ρ k₁.1 (A.ρ k₂.1 u.1.1) + rw [map_mul] + rfl } + +private theorem unitRepresentationOverK_isTrivialOnExtension + (v : ValuationData D A) (E : FiniteAbstractFieldExtension G) + (hnormal : (extensionSubgroup E.base.field E.field.field E.below).Normal) : + Representation.IsTrivial + ((v.unitRepresentationOverK E hnormal).ρ.comp + (extensionSubgroup E.base.field E.field.field E.below).subtype) := by + constructor + intro s + ext u + apply Subtype.ext + apply Subtype.ext + change A.ρ s.1.1 u.1.1 = u.1.1 + exact u.1.2 + ⟨s.1.1, (mem_extensionSubgroup_iff E.base.field E.field.field E.below s.1).1 s.2⟩ + +/-- The actual quotient representation on the unit group `U_L`. -/ +noncomputable def unitRepresentation + (v : ValuationData D A) (E : FiniteAbstractFieldExtension G) + (hnormal : (extensionSubgroup E.base.field E.field.field E.below).Normal) : + Rep ℤ (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) := by + letI := hnormal + letI : Representation.IsTrivial + ((v.unitRepresentationOverK E hnormal).ρ.comp + (extensionSubgroup E.base.field E.field.field E.below).subtype) := by + exact v.unitRepresentationOverK_isTrivialOnExtension E hnormal + exact (v.unitRepresentationOverK E hnormal).ofQuotient + (extensionSubgroup E.base.field E.field.field E.below) + +end ValuationData + +namespace FiniteUnramifiedCyclicExtension + +variable {K : FiniteAbstractField G} + +/-- The unit representation carried by a bundled finite unramified cyclic +extension. -/ +noncomputable def unitRepresentation + (E : FiniteUnramifiedCyclicExtension D K) (v : ValuationData D A) : + Rep ℤ (K.field.toSubgroup ⧸ extensionSubgroup K.field E.field E.below) := + v.unitRepresentation E.toFiniteAbstractFieldExtension E.normal + +end FiniteUnramifiedCyclicExtension + +namespace ValuationData + +/-- The quotient unit representation acts on a representative through the original unit action. -/ +theorem unitRepresentation_quotient_mk_apply + (v : ValuationData D A) (E : FiniteAbstractFieldExtension G) + (hnormal : (extensionSubgroup E.base.field E.field.field E.below).Normal) + (k : E.base.field.toSubgroup) (u : v.unitAddSubgroup E.field) : + (v.unitRepresentation E hnormal).ρ + ((QuotientGroup.mk' + (extensionSubgroup E.base.field E.field.field E.below)) k) u = + v.unitActionLinearMap E hnormal k u := + rfl + +/-- Inclusion of units along an unramified finite extension. -/ +def unitInclusion + (v : ValuationData D A) (E : FiniteAbstractFieldExtension G) + (hUnramified : E.IsUnramified D) : + v.unitAddSubgroup E.base →+ v.unitAddSubgroup E.field where + toFun u := ⟨fixedFieldInclusion A E.base.field E.field.field E.below u.1, by + rw [mem_unitAddSubgroup_iff] + exact (v.valuationAt_fixedFieldInclusion_of_unramified E hUnramified u.1).trans + u.2⟩ + map_zero' := by + apply Subtype.ext + rfl + map_add' _ _ := by + apply Subtype.ext + rfl + +/-- On underlying coefficients, the quotient action on `U_L` is the same +coset action used in the relative norm. -/ +theorem unitRepresentation_action_coe + (v : ValuationData D A) (E : FiniteAbstractFieldExtension G) + (hnormal : (extensionSubgroup E.base.field E.field.field E.below).Normal) + (q : E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) + (u : v.unitAddSubgroup E.field) : + (((v.unitRepresentation E hnormal).ρ q u).1 : + ambientFixedAddSubgroup A E.field.field).1 = + relativeCosetAction A E.base.field E.field.field E.below u.1 q := by + refine Quotient.inductionOn' q ?_ + intro k + rw [relativeCosetAction_mk] + rfl + +/-- The representation norm on `U_L` is the relative field norm on +underlying coefficients. -/ +theorem unitRepresentation_norm_coe + (v : ValuationData D A) (E : FiniteAbstractFieldExtension G) + (hnormal : (extensionSubgroup E.base.field E.field.field E.below).Normal) + (u : v.unitAddSubgroup E.field) : + letI := Fintype.ofFinite + (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) + ((((v.unitRepresentation E hnormal).norm.hom u).1 : + ambientFixedAddSubgroup A E.field.field) : A.V) = + ((relativeNorm A E.base.field E.field.field E.below u.1 : + ambientFixedAddSubgroup A E.base.field) : A.V) := by + let := Fintype.ofFinite + (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) + rw [relativeNorm_apply_coe] + change + (((Representation.norm (v.unitRepresentation E hnormal).ρ) u).1 : + ambientFixedAddSubgroup A E.field.field).1 = + relativeNormValue A E.base.field E.field.field E.below u.1 + rw [Representation.norm, relativeNormValue] + let coeToAmbient : v.unitAddSubgroup E.field →+ A.V := + (ambientFixedAddSubgroup A E.field.field).subtype.comp + (v.unitAddSubgroup E.field).subtype + change coeToAmbient + ((∑ q, (v.unitRepresentation E hnormal).ρ q) u) = + ∑ q, relativeCosetAction A E.base.field E.field.field E.below u.1 q + refine (congrArg coeToAmbient (LinearMap.sum_apply Finset.univ + (fun q : E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below => + (v.unitRepresentation E hnormal).ρ q) u)).trans ?_ + refine (map_sum coeToAmbient _ _).trans ?_ + apply Finset.sum_congr rfl + intro q _ + exact v.unitRepresentation_action_coe E hnormal q u + +/-- Actual `H⁰=0` eliminator needed after the reciprocity construction: every unit of +`K` is the relative norm of a unit of an unramified Galois extension `L`. -/ +theorem exists_unit_relativeNorm_eq_of_tateHZero_isZero + (v : ValuationData D A) (E : FiniteAbstractFieldExtension G) + (hnormal : (extensionSubgroup E.base.field E.field.field E.below).Normal) + (hUnramified : E.IsUnramified D) + (g : E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) + (hg : ∀ x, x ∈ Subgroup.zpowers g) : + letI := Fintype.ofFinite + (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) + Limits.IsZero + (tateCohomology (v.unitRepresentation E hnormal) 0) → + ∀ u : v.unitAddSubgroup E.base, ∃ ε : v.unitAddSubgroup E.field, + relativeNorm A E.base.field E.field.field E.below ε.1 = u.1 := by + let := Fintype.ofFinite + (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) + intro hzero u + let U := v.unitRepresentation E hnormal + let uL := v.unitInclusion E hUnramified u + have hfixed : U.ρ g uL = uL := by + refine Quotient.inductionOn' g ?_ + intro k + apply Subtype.ext + apply Subtype.ext + change A.ρ k.1 u.1.1 = u.1.1 + exact u.1.2 k + obtain ⟨ε, hε⟩ := exists_norm_eq_of_tateHZero_isZero + U g hg hzero uL hfixed + refine ⟨ε, ?_⟩ + apply Subtype.ext + calc + ((relativeNorm A E.base.field E.field.field E.below ε.1 : + ambientFixedAddSubgroup A E.base.field) : A.V) = + ((((v.unitRepresentation E hnormal).norm.hom ε).1 : + ambientFixedAddSubgroup A E.field.field) : A.V) := + (v.unitRepresentation_norm_coe E hnormal ε).symm + _ = ((uL.1 : ambientFixedAddSubgroup A E.field.field) : A.V) := + congrArg + (fun z : v.unitAddSubgroup E.field => + ((z.1 : ambientFixedAddSubgroup A E.field.field) : A.V)) hε + _ = u.1.1 := rfl + +/-- Actual `H⁻¹=0` eliminator on units: a unit of relative norm zero is +in the image of `g-1`. -/ +theorem exists_unit_sigma_sub_eq_of_tateHMinusOne_isZero + (v : ValuationData D A) (E : FiniteAbstractFieldExtension G) + (hnormal : (extensionSubgroup E.base.field E.field.field E.below).Normal) + (g : E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) + (hg : ∀ x, x ∈ Subgroup.zpowers g) : + letI := Fintype.ofFinite + (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) + Limits.IsZero + (tateCohomology (v.unitRepresentation E hnormal) (-1)) → + ∀ u : (v.unitRepresentation E hnormal).V, + (v.unitRepresentation E hnormal).norm.hom u = 0 → + ∃ ε : (v.unitRepresentation E hnormal).V, + (v.unitRepresentation E hnormal).ρ g ε - ε = u := by + let := Fintype.ofFinite + (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) + intro hzero u hu + let U := v.unitRepresentation E hnormal + exact CyclicCohomology.normKernel_le_sigmaMinusOneRange_of_tateHMinusOne_isZero + U g hg hzero u hu + +/-- **the unit-cohomology axiom.** For every finite unramified Galois extension `L/K`, +`H⁰(G(L/K),U_L)` and `H⁻¹(G(L/K),U_L)` vanish. + +This is a predicate on the abstract valuation datum. It is the source axiom +used in the subsequent proofs of independence and multiplicativity; +it is not introduced as a Lean axiom. -/ +def SatisfiesUnramifiedUnitCohomology + (D : DegreeData G) (v : ValuationData D A) : Prop := + ∀ (K : FiniteAbstractField G) + (E : FiniteUnramifiedCyclicExtension D K), + Limits.IsZero (tateCohomology (E.unitRepresentation v) 0) ∧ + Limits.IsZero (tateCohomology (E.unitRepresentation v) (-1)) + +end ValuationData + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/Universal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/Universal.lean new file mode 100644 index 0000000000..efe905d854 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/Universal.lean @@ -0,0 +1,682 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateFieldCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusPowerFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusQuotientDescent +/-! +Proves the universal norm-descent argument from maximal-unramified units to finite intermediate +norm subgroups. +-/ + +@[expose] public section + +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +noncomputable +section +open CategoryTheory +open scoped BigOperators +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] +namespace ValuationData +variable {D : DegreeData G} {A : Rep ℤ G} + +/-- The universal norm-descent lemma, first descent step: the maximal-unramified norm of `u` +is represented by a genuine unit over `K`. -/ +theorem universalNormDescent_endpoint_descent + (v : ValuationData D A) [IsTopologicalGroup G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (φ : D.FrobeniusElements (K.toFiniteResidueAbstractField D) L hLK) + (hφ : D.frobeniusExponent + (K.toFiniteResidueAbstractField D) L hLK φ = 1) + {ι : Type*} (s : Finset ι) + (τ : ι → + (D.extensionNormalizedDegreeContinuous + (K.toFiniteResidueAbstractField D) L hLK).toMonoidHom.ker) + (u : v.infiniteUnitAddSubgroup (D.maximalUnramifiedField L) K + (D.maximalUnramifiedField_le_of_le hLK)) + (uᵢ : ι → v.infiniteUnitAddSubgroup (D.maximalUnramifiedField L) K + (D.maximalUnramifiedField_le_of_le hLK)) + (hstar : D.frobeniusQuotientAction A K.field L hLK φ.1 u.1 - u.1 = + ∑ i ∈ s, + (D.frobeniusQuotientAction A K.field L hLK (τ i).1 (uᵢ i).1 - + (uᵢ i).1)) : + letI : Finite + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K.field L hLK + ∃ aK : v.unitAddSubgroup K, + fixedFieldInclusion A K.field (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField_le K.field) aK.1 = + relativeNorm A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) u.1 := by + let : Finite + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K.field L hLK + have hfixed := D.maximalUnramifiedNorm_fixed_of_hstar A + (K.toFiniteResidueAbstractField D) L hLK + s φ.1 τ u.1 (fun i => (uᵢ i).1) hstar + exact v.descend_maximalUnramifiedNorm_unit K L hLK φ hφ u.1 u.2 hfixed + +private theorem finiteUnitNormRange_of_norm_add_quotientCard_smul + (v : ValuationData D A) [IsTopologicalGroup G] + (E : ClosedSubgroup G) (K : FiniteAbstractField G) + (M P : FiniteIntermediateField E K.field) + (hPM : P.field.toSubgroup ≤ M.field.toSubgroup) + (SF : FiniteAbstractField G) + (hSP : SF.field.toSubgroup ≤ P.field.toSubgroup) + (hSK : SF.field.toSubgroup ≤ K.field.toSubgroup) + [Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field SF.field hSK)] + (aK zK : v.unitAddSubgroup K) (yS : v.unitAddSubgroup SF) + (hbaseRelation : aK.1 = relativeNorm A K.field SF.field hSK yS.1 + + P.quotientCard • zK.1) : + aK.1 ∈ v.finiteIntermediateUnitNormRange E K M := by + let : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field P.field P.below) := P.finite + let hPSfinite : Finite + (P.field.toSubgroup ⧸ extensionSubgroup P.field SF.field hSP) := + FiniteIntermediateField.finite_extension_of_le hSK P.below hSP + let : Finite + ((P.toFiniteAbstractField K).field.toSubgroup ⧸ + extensionSubgroup (P.toFiniteAbstractField K).field SF.field hSP) := by + change Finite + (P.field.toSubgroup ⧸ extensionSubgroup P.field SF.field hSP) + exact hPSfinite + let EPS : FiniteAbstractFieldExtension G := + FiniteAbstractFieldExtension.ofInclusion + SF.field (P.toFiniteAbstractField K) hSP + let yP : v.unitAddSubgroup (P.toFiniteAbstractField K) := by + simpa [EPS, FiniteAbstractFieldExtension.ofInclusion] using + v.finiteUnitNorm EPS yS + let EP := P.toFiniteAbstractFieldExtension K + let zP : v.unitAddSubgroup (P.toFiniteAbstractField K) := + v.finiteUnitInclusion EP zK + let aP : v.unitAddSubgroup (P.toFiniteAbstractField K) := yP + zP + let FT : DegreeData.FiniteTower G := { + top := SF.field + middle := P.field + base := K.field + top_le_middle := hSP + middle_le_base := P.below + finiteTopQuotient := hPSfinite + finiteBaseQuotient := P.finite } + have hnDegree : (EP.degree : ℕ) = P.quotientCard := by + change (EP.toFiniteAbstractExtension.degree : ℕ) = P.quotientCard + rw [EP.toFiniteAbstractExtension.degree_coe] + change + Nat.card + (K.field.toSubgroup ⧸ extensionSubgroup K.field P.field P.below) = P.quotientCard + rfl + let yPraw : ambientFixedAddSubgroup A P.field := + ⟨yP.1.1, by + intro g + apply yP.1.2⟩ + let zPraw : ambientFixedAddSubgroup A P.field := + ⟨zP.1.1, by + intro g + apply zP.1.2⟩ + let aPraw : ambientFixedAddSubgroup A P.field := + ⟨aP.1.1, by + intro g + apply aP.1.2⟩ + have haPnorm : relativeNorm A K.field P.field P.below aP.1 = aK.1 := by + change relativeNorm A K.field P.field P.below aPraw = aK.1 + have haPraw : aPraw = yPraw + zPraw := by + apply Subtype.ext + rfl + rw [haPraw, map_add] + have hyTower := FT.norm_trans_apply A yS.1 + have hzNorm := relativeNorm_fixedFieldInclusion A + EP.toFiniteAbstractExtension zK.1 + change relativeNorm A K.field P.field P.below + (fixedFieldInclusion A K.field P.field P.below zK.1) = + (EP.degree : ℕ) • zK.1 at hzNorm + change relativeNorm A K.field P.field P.below yPraw + + relativeNorm A K.field P.field P.below zPraw = aK.1 + change relativeNorm A K.field P.field P.below + (relativeNorm A P.field SF.field hSP yS.1) + + relativeNorm A K.field P.field P.below + (fixedFieldInclusion A K.field P.field P.below zK.1) = aK.1 + rw [hyTower] + rw [hzNorm, hnDegree] + exact hbaseRelation.symm + exact v.mem_finiteIntermediateUnitNormRange_of_overfield + E K M P hPM aP aK.1 haPnorm + +private theorem exists_unit_lift_of_field_le + (v : ValuationData D A) [IsTopologicalGroup G] + (B F : FiniteAbstractField G) (h : F.field.toSubgroup ≤ B.field.toSubgroup) + (u : v.unitAddSubgroup B) : + ∃ x : v.unitAddSubgroup F, x.1.1 = u.1.1 := by + let E : FiniteAbstractFieldExtension G := + { base := B + field := F + below := h + finiteQuotient := FiniteIntermediateField.finite_extension_of_le + (le_baseField F.field) (le_baseField B.field) h } + exact ⟨v.finiteUnitInclusion E u, rfl⟩ + +private theorem fixedFieldInclusion_unit_mem_infinite + (v : ValuationData D A) [IsTopologicalGroup G] + (E : ClosedSubgroup G) (K F : FiniteAbstractField G) + (hFE : E.toSubgroup ≤ F.field.toSubgroup) + (hFK : F.field.toSubgroup ≤ K.field.toSubgroup) + (hEK : E.toSubgroup ≤ K.field.toSubgroup) + (u : v.unitAddSubgroup F) : + fixedFieldInclusion A F.field E hFE u.1 ∈ v.infiniteUnitAddSubgroup E K hEK := by + let M : FiniteIntermediateField E K.field := + { field := F.field + above := hFE + below := hFK + finite := FiniteIntermediateField.finite_extension_of_le + (le_baseField F.field) (le_baseField K.field) hFK } + have h : F = M.toFiniteAbstractField K := FiniteAbstractField.eq_of_field_eq _ _ rfl + refine ⟨M, h ▸ u, ?_⟩ + apply Subtype.ext + change (h ▸ u : v.unitAddSubgroup (M.toFiniteAbstractField K)).1.1 = u.1.1 + dsimp only + +private theorem powerTower_corrected_norm_relation + (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (powerTower : DegreeData.FrobeniusPowerFixedFieldTower D) + (uS : v.unitAddSubgroup powerTower.toFrobeniusFixedFieldTower.base) + (uBar yBar : v.unitAddSubgroup powerTower.toFrobeniusFixedFieldTower.field) + (u : ambientFixedAddSubgroup A + (D.maximalUnramifiedField powerTower.ambient.field)) : + let KR := powerTower.ambientBase + let L := powerTower.ambient.field + let hLK := powerTower.ambient.below + letI : Finite (KR.field.toSubgroup ⧸ extensionSubgroup KR.field L hLK) := + powerTower.ambient.finite + let φ := powerTower.frobenius + let n := powerTower.n + let σ := powerTower.baseFrobenius + let σn := powerTower.fieldFrobenius + let fixedTower := powerTower.toFrobeniusFixedFieldTower + let SF := fixedTower.base + let TF := fixedTower.field + let S := SF.field + let T := TF.field + let hTS := powerTower.field_le_base + letI : Finite (S.toSubgroup ⧸ extensionSubgroup S T hTS) := + powerTower.relativeFinite + let hTE := D.fieldInertia_le_frobeniusFixedField KR L hLK σn + let hSE := D.fieldInertia_le_frobeniusFixedField KR L hLK σ + let E := D.maximalUnramifiedField L + let I := D.maximalUnramifiedField KR.field + let hEI := D.maximalUnramifiedField_mono hLK + letI : Finite (I.toSubgroup ⧸ extensionSubgroup I E hEI) := + D.maximalUnramifiedExtension_finite KR.field L hLK + let N := relativeNorm A I E hEI + let J := fixedFieldInclusion A I E hEI + let φnyBarE := D.frobeniusPowerSum A KR.field L hLK φ.1 n + (fixedFieldInclusion A T E hTE yBar.1) + let w := fixedFieldInclusion A T E hTE uBar.1 - φnyBarE + relativeNorm A S T hTS uBar.1 = uS.1 → uS.1.1 = u.1 → + D.frobeniusQuotientAction A KR.field L hLK φ.1 (J (N w)) = J (N w) → + ∃ yS : v.unitAddSubgroup SF, + J (N u) = J (N (D.frobeniusPowerSum A KR.field L hLK φ.1 n + (fixedFieldInclusion A S E hSE yS.1))) + n • J (N w) := by + dsimp only + intro huBar huSval hfixedZ + let KR := powerTower.ambientBase + let L := powerTower.ambient.field + let hLK := powerTower.ambient.below + let : Finite (KR.field.toSubgroup ⧸ extensionSubgroup KR.field L hLK) := + powerTower.ambient.finite + let φ := powerTower.frobenius + let hφ := powerTower.exponent_one + let n := powerTower.n + let hn := powerTower.n_pos + let σ := powerTower.baseFrobenius + let σn := powerTower.fieldFrobenius + let fixedTower := powerTower.toFrobeniusFixedFieldTower + let finiteFixedTower := powerTower.toFiniteAmbientFrobeniusFixedFieldTower + let SF := fixedTower.base + let TF := fixedTower.field + let S := SF.field + let T := TF.field + let hTS := powerTower.field_le_base + let : Finite (S.toSubgroup ⧸ extensionSubgroup S T hTS) := + powerTower.relativeFinite + let hTE := D.fieldInertia_le_frobeniusFixedField KR L hLK σn + let hSE := D.fieldInertia_le_frobeniusFixedField KR L hLK σ + let E := D.maximalUnramifiedField L + let I := D.maximalUnramifiedField KR.field + let hEI := D.maximalUnramifiedField_mono hLK + let : Finite (I.toSubgroup ⧸ extensionSubgroup I E hEI) := + D.maximalUnramifiedExtension_finite KR.field L hLK + let N := relativeNorm A I E hEI + let J := fixedFieldInclusion A I E hEI + let φnyBarE := D.frobeniusPowerSum A KR.field L hLK φ.1 n + (fixedFieldInclusion A T E hTE yBar.1) + let w := fixedFieldInclusion A T E hTE uBar.1 - φnyBarE + have hφσ := powerTower.frobenius_commute_base + have hφσn := powerTower.frobenius_commute_field + let powerT : ambientFixedAddSubgroup A T := + ∑ i : Fin n, D.frobeniusFixedFieldAction A KR L hLK σn + (φ.1 ^ i.1) (Commute.pow_left hφσn i.1) yBar.1 + let powerTUnit : v.unitAddSubgroup TF := + ∑ i : Fin n, v.frobeniusFixedFieldUnitAction KR L hLK σn + (φ.1 ^ i.1) (Commute.pow_left hφσn i.1) yBar + have hpowerTUnit : powerTUnit.1 = powerT := + map_sum (v.unitAddSubgroup TF).subtype _ Finset.univ + let wBar : v.unitAddSubgroup TF := uBar - powerTUnit + have hwBarIncl : fixedFieldInclusion A T E hTE wBar.1 = w := by + have hpIncl := D.fixedFieldPowerSum_inclusion A KR L hLK σn + φ.1 hφσn n yBar.1 + apply Subtype.ext + have hpVal := congrArg Subtype.val hpIncl + change uBar.1.1 - powerTUnit.1.1 = uBar.1.1 - φnyBarE.1 + rw [hpowerTUnit] + exact congrArg (fun z => uBar.1.1 - z) hpVal + let EST : FiniteAbstractFieldExtension G := fixedTower.extension + let yS : v.unitAddSubgroup SF := v.finiteUnitNorm EST yBar + let uSraw : ambientFixedAddSubgroup A S := uS.1 + let ySraw : ambientFixedAddSubgroup A S := yS.1 + let uBarraw : ambientFixedAddSubgroup A T := uBar.1 + let wBarraw : ambientFixedAddSubgroup A T := wBar.1 + let powerS : ambientFixedAddSubgroup A S := + ∑ i : Fin n, D.frobeniusFixedFieldAction A KR L hLK σ + (φ.1 ^ i.1) (Commute.pow_left hφσ i.1) ySraw + have hpowerNorm := D.fixedFieldPowerSum_relativeNorm A KR L hLK + σ σn hTS φ.1 hφσ hφσn n yBar.1 + have huBarraw : relativeNorm A S T hTS uBarraw = uSraw := huBar + have hySraw : relativeNorm A S T hTS yBar.1 = ySraw := rfl + have hpowerNormRaw : relativeNorm A S T hTS powerT = powerS := by + change relativeNorm A S T hTS powerT = + ∑ i : Fin n, D.frobeniusFixedFieldAction A KR L hLK σ + (φ.1 ^ i.1) (Commute.pow_left hφσ i.1) + (relativeNorm A S T hTS yBar.1) at hpowerNorm + rw [hySraw] at hpowerNorm + exact hpowerNorm + have hwBarNorm : relativeNorm A S T hTS wBarraw = uSraw - powerS := by + have hwBarCoe : wBarraw = uBarraw - powerT := by + apply Subtype.ext + change uBar.1.1 - powerTUnit.1.1 = uBar.1.1 - powerT.1 + exact congrArg (fun z => uBar.1.1 - z) + (congrArg Subtype.val hpowerTUnit) + rw [hwBarCoe] + rw [map_sub, huBarraw] + exact congrArg (fun z => uSraw - z) hpowerNormRaw + obtain ⟨gS, hgClosure, _hgDegree, hg⟩ := + D.frobeniusPowerFixedField_generator KR L hLK φ hφ n n hn hn + let fixedGenerator : + finiteFixedTower.toFrobeniusFixedFieldTower.CyclicGenerator := + { element := gS + mapsToFrobenius := hgClosure + generates := hg } + have hcard := D.frobeniusPowerFixedField_quotientCard + KR L hLK φ hφ n n hn hn + have hdegree : (finiteFixedTower.extension.degree : ℕ) = n := by + calc + (finiteFixedTower.extension.degree : ℕ) = + Nat.card + finiteFixedTower.extension.toFiniteAbstractExtension.quotient := + finiteFixedTower.extension.toFiniteAbstractExtension.degree_coe + _ = n := hcard + have hnormW := v.maximalNorm_relativeNorm_fixedTower + finiteFixedTower fixedGenerator n hdegree wBar + have hnormWraw : + J (N (fixedFieldInclusion A S E hSE + (relativeNorm A S T hTS wBarraw))) = + D.frobeniusPowerSum A KR.field L hLK σ.1 n + (J (N (fixedFieldInclusion A T E hTE wBarraw))) := hnormW + have hσfixedZ : D.frobeniusQuotientAction A KR.field L hLK σ.1 (J (N w)) = + J (N w) := by + let B := D.frobeniusQuotientRepresentation A KR.field L hLK + have hpow := rep_action_pow_fixed + B φ.1 (J (N w)) hfixedZ n + change D.frobeniusQuotientAction A KR.field L hLK + (φ.1 ^ n) (J (N w)) = J (N w) at hpow + simpa only [σ, DegreeData.FrobeniusPowerFixedFieldTower.baseFrobenius, + D.frobeniusPowerOfDegreeOne_coe] using hpow + have hpowerZ : D.frobeniusPowerSum A KR.field L hLK σ.1 n (J (N w)) = + n • J (N w) := + D.frobeniusPowerSum_eq_nsmul_of_fixed A KR.field L hLK + σ.1 n (J (N w)) hσfixedZ + have hnormW' : + J (N (fixedFieldInclusion A S E hSE (uSraw - powerS))) = + n • J (N w) := by + rw [← hwBarNorm, hnormWraw] + have hwBarInclRaw : fixedFieldInclusion A T E hTE wBarraw = w := by + apply Subtype.ext + exact congrArg Subtype.val hwBarIncl + rw [hwBarInclRaw, hpowerZ] + have hpowerSIncl := D.fixedFieldPowerSum_inclusion A KR L hLK σ + φ.1 hφσ n ySraw + have huSIncl : fixedFieldInclusion A S E hSE uSraw = u := by + apply Subtype.ext + change uSraw.1 = u.1 + exact huSval + refine ⟨yS, ?_⟩ + have h := hnormW' + simp only [map_sub] at h + have hpowerSInclRaw : fixedFieldInclusion A S E hSE powerS = + D.frobeniusPowerSum A KR.field L hLK φ.1 n + (fixedFieldInclusion A S E hSE ySraw) := hpowerSIncl + rw [huSIncl, hpowerSInclRaw] at h + calc + J (N u) = n • J (N w) + + J (N (D.frobeniusPowerSum A KR.field L hLK φ.1 n + (fixedFieldInclusion A S E hSE ySraw))) := + sub_eq_iff_eq_add.mp h + _ = _ := add_comm _ _ + + +/-- The universal norm-descent lemma, finite target step. After placing the finite support in a +common finite Galois overfield, the descended unit is a norm from every +prescribed finite intermediate field. -/ +theorem universalNormDescent_mem_finiteUnitNormRange + (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology) + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (φ : D.FrobeniusElements (K.toFiniteResidueAbstractField D) L hLK) + (hφ : D.frobeniusExponent + (K.toFiniteResidueAbstractField D) L hLK φ = 1) + {ι : Type*} (s : Finset ι) + (τ : ι → + (D.extensionNormalizedDegreeContinuous + (K.toFiniteResidueAbstractField D) L hLK).toMonoidHom.ker) + (u : v.infiniteUnitAddSubgroup (D.maximalUnramifiedField L) K + (D.maximalUnramifiedField_le_of_le hLK)) + (uᵢ : ι → v.infiniteUnitAddSubgroup (D.maximalUnramifiedField L) K + (D.maximalUnramifiedField_le_of_le hLK)) + (hstar : D.frobeniusQuotientAction A K.field L hLK φ.1 u.1 - u.1 = + ∑ i ∈ s, + (D.frobeniusQuotientAction A K.field L hLK (τ i).1 (uᵢ i).1 - + (uᵢ i).1)) + (aK : v.unitAddSubgroup K) + (haK : + letI : Finite + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K.field L hLK + fixedFieldInclusion A K.field (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField_le K.field) aK.1 = + relativeNorm A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) (D.maximalUnramifiedField_mono hLK) u.1) + (M : FiniteIntermediateField (D.maximalUnramifiedField L) K.field) : + aK.1 ∈ v.finiteIntermediateUnitNormRange + (D.maximalUnramifiedField L) K M := by + classical + let : Finite + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K.field L hLK + let KR := K.toFiniteResidueAbstractField D + let I := D.maximalUnramifiedField K.field + let E := D.maximalUnramifiedField L + let hEI := D.maximalUnramifiedField_mono hLK + let N := relativeNorm A I E hEI + let J := fixedFieldInclusion A I E hEI + let hEK := D.maximalUnramifiedField_le_of_le hLK + let hEnormal : (extensionSubgroup K.field E hEK).Normal := + D.extensionSubgroup_maximalUnramifiedField_normal K.field L hLK + rcases u.2 with ⟨Mu, uMu, huMu⟩ + let ιs := {i : ι // i ∈ s} + have huᵢsupport (j : ιs) := (uᵢ j.1).2 + choose Mi uMi huMi using huᵢsupport + let ML : FiniteIntermediateField E K.field := + { field := L + above := D.maximalUnramifiedField_le L + below := hLK + finite := hLfinite } + let B₀ := M.compositum ML + let B := B₀.compositum Mu + obtain ⟨Q, hQB, hQMi⟩ := + FiniteIntermediateField.exists_common_compositum B + (Finset.univ : Finset ιs) Mi + let P := Q.galoisRefinement + let hPQ : P.field.toSubgroup ≤ Q.field.toSubgroup := + Q.galoisRefinement_le_field + let hPB : P.field.toSubgroup ≤ B.field.toSubgroup := hPQ.trans hQB + let hPM : P.field.toSubgroup ≤ M.field.toSubgroup := + hPB.trans ((B₀.compositum_le_left Mu).trans (M.compositum_le_left ML)) + let hPL : P.field.toSubgroup ≤ L.toSubgroup := + hPB.trans ((B₀.compositum_le_left Mu).trans (M.compositum_le_right ML)) + let hPMu : P.field.toSubgroup ≤ Mu.field.toSubgroup := + hPB.trans (B₀.compositum_le_right Mu) + let hPMi (j : ιs) : P.field.toSubgroup ≤ (Mi j).field.toSubgroup := + hPQ.trans (hQMi j (Finset.mem_univ j)) + let hPfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field P.field P.below) := P.finite + let hPnormal : (extensionSubgroup K.field P.field P.below).Normal := + FiniteIntermediateField.galoisRefinement_normal Q + let n := P.quotientCard + have hn : 0 < n := P.quotientCard_pos + let σ := D.frobeniusPowerOfDegreeOne KR L hLK φ hφ n hn + let σn := D.frobeniusPowerOfDegreeOne KR L hLK φ hφ (n * n) + (Nat.mul_pos hn hn) + let S := D.frobeniusFixedField KR L hLK σ + let T := D.frobeniusFixedField KR L hLK σn + let hSP : S.toSubgroup ≤ P.field.toSubgroup := + D.frobeniusPowerFixedField_le_finiteField KR L hLK P φ hφ + let hSK := D.frobeniusFixedField_le KR L hLK σ + let hTK := D.frobeniusFixedField_le KR L hLK σn + let hTS := D.frobeniusPowerFixedField_le KR L hLK φ hφ n n hn hn + let hTE := D.fieldInertia_le_frobeniusFixedField KR L hLK σn + let hSE := D.fieldInertia_le_frobeniusFixedField KR L hLK σ + let hSfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S hSK) := + D.frobeniusFixedField_finite KR L hLK σ + let hSabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) S (le_baseField S)) := + D.frobeniusFixedField_absoluteFinite K L hLK σ + let hTabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) T (le_baseField T)) := + D.frobeniusFixedField_absoluteFinite K L hLK σn + let hTSfinite : Finite + (S.toSubgroup ⧸ extensionSubgroup S T hTS) := + D.frobeniusPowerFixedField_finite KR L hLK φ hφ n n hn hn + let hTSnormal : (extensionSubgroup S T hTS).Normal := + D.frobeniusPowerFixedField_normal KR L hLK φ hφ n n hn hn + let : (extensionSubgroup S T hTS).Normal := hTSnormal + let ambientExtension : FiniteGaloisSubextension KR.field := + { field := L + below := hLK + normal := hLnormal + finite := hLfinite } + let powerTower : DegreeData.FrobeniusPowerFixedFieldTower D := + { ambientBase := KR + ambient := ambientExtension + frobenius := φ + exponent_one := hφ + n := n + n_pos := hn + baseAbsoluteFinite := hSabsolute + fieldAbsoluteFinite := hTabsolute + relativeFinite := hTSfinite } + let fixedTower := powerTower.toFrobeniusFixedFieldTower + let SF := fixedTower.base + let TF := fixedTower.field + obtain ⟨uS, huStransport⟩ := v.exists_unit_lift_of_field_le + (Mu.toFiniteAbstractField K) SF (hSP.trans hPMu) uMu + have hlift (j : ιs) := v.exists_unit_lift_of_field_le + ((Mi j).toFiniteAbstractField K) SF (hSP.trans (hPMi j)) (uMi j) + choose uᵢS huᵢStransport using hlift + have huSval : uS.1.1 = u.1.1 := huStransport.trans (congrArg Subtype.val huMu) + have huᵢSval (j : ιs) : (uᵢS j).1.1 = (uᵢ j.1).1.1 := + (huᵢStransport j).trans (congrArg Subtype.val (huMi j)) + have hstarVal : + (D.frobeniusQuotientAction A K.field L hLK φ.1 u.1).1 - u.1.1 = + ∑ i ∈ s, + ((D.frobeniusQuotientAction A K.field L hLK (τ i).1 (uᵢ i).1).1 - + (uᵢ i).1.1) := by + have h := congrArg + (AddSubgroup.subtype + (ambientFixedAddSubgroup A (D.maximalUnramifiedField L))) hstar + rw [map_sub, map_sum] at h + exact h + simp_rw [D.frobeniusQuotientAction_coe_out] at hstarVal + have hstarS : + A.ρ (Quotient.out φ.1).1 uS.1.1 - uS.1.1 = + ∑ j : ιs, + (A.ρ (Quotient.out (τ j.1).1).1 (uᵢS j).1.1 - (uᵢS j).1.1) := by + rw [huSval] + calc + A.ρ (Quotient.out φ.1).1 u.1.1 - u.1.1 = + ∑ i ∈ s, + (A.ρ (Quotient.out (τ i).1).1 (uᵢ i).1.1 - (uᵢ i).1.1) := hstarVal + _ = ∑ j : ιs, + (A.ρ (Quotient.out (τ j.1).1).1 (uᵢ j.1).1.1 - + (uᵢ j.1).1.1) := + Finset.sum_subtype s (fun _ => Iff.rfl) _ + _ = _ := by simp_rw [huᵢSval] + let τs : ιs → + (D.extensionNormalizedDegreeContinuous KR L hLK).toMonoidHom.ker := + fun j => τ j.1 + have hφσn : φ.1 * σn.1 = σn.1 * φ.1 := + powerTower.frobenius_commute_field + have hτσ (j : ιs) : (τs j).1 * (φ.1 ^ n) = + (φ.1 ^ n) * (τs j).1 := by + exact (D.quotientPower_card_commutes_degreeZero KR L hLK P hPL + φ.1 (τs j).1 (τs j).2).symm + have hτσn (j : ιs) : (τs j).1 * (φ.1 ^ (n * n)) = + (φ.1 ^ (n * n)) * (τs j).1 := by + have hcomm : Commute (τs j).1 (φ.1 ^ n) := hτσ j + simpa only [pow_mul] using (hcomm.pow_right n).eq + have hσσn : σ.1 * σn.1 = σn.1 * σ.1 := + fixedTower.commute + obtain ⟨uBar, uBarᵢ, yBar, huBar, huBarᵢ, hyBar⟩ := + v.universalNormDescent_fixedTower_solution hAxiom powerTower + (Finset.univ : Finset ιs) τs hτσ hτσn uS uᵢS hstarS + let uBarE := fixedFieldInclusion A T E hTE uBar.1 + let uBarᵢE := fun j : ιs => fixedFieldInclusion A T E hTE (uBarᵢ j).1 + let yBarE := fixedFieldInclusion A T E hTE yBar.1 + let φnyBarE := D.frobeniusPowerSum A K.field L hLK φ.1 n yBarE + let w := uBarE - φnyBarE + have hstarW := v.universalNormDescent_correctedEquation KR L hLK σ σn + (Finset.univ : Finset ιs) φ.1 hφσn (fun j => (τs j).1) hτσn + hσσn n rfl uBar uBarᵢ yBar hyBar + have huBarEmem : uBarE ∈ v.infiniteUnitAddSubgroup E K hEK := + v.fixedFieldInclusion_unit_mem_infinite E K TF hTE hTK hEK uBar + have hyBarEmem : yBarE ∈ v.infiniteUnitAddSubgroup E K hEK := + v.fixedFieldInclusion_unit_mem_infinite E K TF hTE hTK hEK yBar + have hφnyMem : φnyBarE ∈ v.infiniteUnitAddSubgroup E K hEK := + v.frobeniusPowerSum_mem_infiniteUnit_universalNormDescent K L hLK φ.1 n yBarE hyBarEmem + have hwMem : w ∈ v.infiniteUnitAddSubgroup E K hEK := + (v.infiniteUnitAddSubgroup E K hEK).sub_mem huBarEmem hφnyMem + have hfixedZ := D.maximalUnramifiedNorm_fixed_of_hstar A KR L hLK + (Finset.univ : Finset ιs) φ.1 τs w uBarᵢE hstarW + obtain ⟨zK, hzK⟩ := + v.descend_maximalUnramifiedNorm_unit K L hLK φ hφ w hwMem hfixedZ + obtain ⟨yS, hnormRelationE⟩ := v.powerTower_corrected_norm_relation + powerTower uS uBar yBar u.1 huBar huSval hfixedZ + let ySraw : ambientFixedAddSubgroup A S := yS.1 + have hlemma53 := (D.frobeniusNormIdentities A KR L hLK φ σ hφ ySraw).1 + have hbaseRelation : + aK.1 = relativeNorm A K.field S hSK ySraw + n • zK.1 := by + apply Subtype.ext + have haKval := congrArg Subtype.val haK + have hzKval := congrArg Subtype.val hzK + have hrelVal := congrArg Subtype.val hnormRelationE + have h53' := hlemma53.symm + rw [D.frobeniusExponent_powerOfDegreeOne KR L hLK φ hφ n hn] at h53' + change aK.1.1 = + (relativeNorm A K.field S hSK ySraw).1 + n • zK.1.1 + change aK.1.1 = (N u.1).1 at haKval + change zK.1.1 = (N w).1 at hzKval + change (N u.1).1 = + (N (D.frobeniusPowerSum A K.field L hLK φ.1 n + (fixedFieldInclusion A S E hSE ySraw))).1 + n • (N w).1 at hrelVal + rw [haKval, hrelVal, ← hzKval] + exact congrArg (fun z => z + n • zK.1.1) h53' + let : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field SF.field hSK) := by + change Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field S hSK) + exact hSfinite + exact v.finiteUnitNormRange_of_norm_add_quotientCard_smul E K M P hPM + SF hSP hSK aK zK yS hbaseRelation + +/-- **The universal norm-descent lemma.** A finite Frobenius coboundary +relation for an infinite-level unit forces its maximal-unramified norm to +descend to a `K`-unit which is a unit norm from every finite intermediate +field. -/ +theorem universalNormDescent + (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology) + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (φ : D.FrobeniusElements (K.toFiniteResidueAbstractField D) L hLK) + (hφ : D.frobeniusExponent + (K.toFiniteResidueAbstractField D) L hLK φ = 1) + {ι : Type*} (s : Finset ι) + (τ : ι → + (D.extensionNormalizedDegreeContinuous + (K.toFiniteResidueAbstractField D) L hLK).toMonoidHom.ker) + (u : v.infiniteUnitAddSubgroup (D.maximalUnramifiedField L) K + (D.maximalUnramifiedField_le_of_le hLK)) + (uᵢ : ι → v.infiniteUnitAddSubgroup (D.maximalUnramifiedField L) K + (D.maximalUnramifiedField_le_of_le hLK)) + (hstar : D.frobeniusQuotientAction A K.field L hLK φ.1 u.1 - u.1 = + ∑ i ∈ s, + (D.frobeniusQuotientAction A K.field L hLK (τ i).1 (uᵢ i).1 - + (uᵢ i).1)) : + letI : Finite + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K.field L hLK + ∃ aK : v.unitAddSubgroup K, + fixedFieldInclusion A K.field (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField_le K.field) aK.1 = + relativeNorm A (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK) u.1 ∧ + aK.1 ∈ v.infiniteUnitNormSubgroup (D.maximalUnramifiedField L) K := by + let : Finite + ((D.maximalUnramifiedField K.field).toSubgroup ⧸ + extensionSubgroup (D.maximalUnramifiedField K.field) + (D.maximalUnramifiedField L) + (D.maximalUnramifiedField_mono hLK)) := + D.maximalUnramifiedExtension_finite K.field L hLK + obtain ⟨aK, haK⟩ := v.universalNormDescent_endpoint_descent K L hLK φ hφ + s τ u uᵢ hstar + refine ⟨aK, haK, ?_⟩ + rw [v.mem_infiniteUnitNormSubgroup_iff] + intro M + exact v.universalNormDescent_mem_finiteUnitNormRange hAxiom K L hLK φ hφ + s τ u uᵢ hstar aK haK M + +end ValuationData + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UniversalNormDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UniversalNormDescent.lean new file mode 100644 index 0000000000..a43e600e57 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UniversalNormDescent.lean @@ -0,0 +1,291 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CoreFrobeniusNorm +public import Mathlib.Dynamics.BirkhoffSum.Basic + +/-! # Universal Norm Descent -/ + +@[expose] public section +universe u v + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +/-! +# Universal norm descent + +This module contains the representation-theoretic lifting and correction +calculation used by the abstract reciprocity construction, together with +the norm, action, and iterate identities it requires. +-/ + +noncomputable +section + +open CategoryTheory +open scoped BigOperators + +/-- The norm over a finite normal subgroup commutes with every ambient +group action. This is the equivariance used when the construction applies the norm +to equation `(*)`. -/ +private theorem restricted_norm_action + {R : IntegralRepGroupType} [Group R] (H : Subgroup R) [H.Normal] [Fintype H] + (B : Rep ℤ R) (r : R) (x : B.V) : + (∑ h : H, B.ρ h.1 (B.ρ r x)) = + B.ρ r (∑ h : H, B.ρ h.1 x) := by + rw [map_sum] + let e : H ≃ H := (MulAut.conjNormal r).symm.toEquiv + calc + (∑ h : H, B.ρ h.1 (B.ρ r x)) = + ∑ h : H, B.ρ r (B.ρ (e h).1 x) := by + apply Finset.sum_congr rfl + intro h _ + have he : (e h).1 = r⁻¹ * h.1 * r := by + exact MulAut.conjNormal_symm_apply r h + calc + B.ρ h.1 (B.ρ r x) = B.ρ (h.1 * r) x := by + rw [map_mul] + rfl + _ = B.ρ (r * (e h).1) x := by + rw [he] + simp [mul_assoc] + _ = B.ρ r (B.ρ (e h).1 x) := by + rw [map_mul] + rfl + _ = ∑ h : H, B.ρ r (B.ρ h.1 x) := by + exact e.sum_comp (fun h : H => B.ρ r (B.ρ h.1 x)) + +private theorem restricted_rep_norm_action + {R : IntegralRepGroupType} [Group R] (H : Subgroup R) [H.Normal] [Fintype H] + (B : Rep ℤ R) (r : R) (x : B.V) : + let U : Rep ℤ H := Rep.res H.subtype B + U.norm.hom (B.ρ r x) = B.ρ r (U.norm.hom x) := by + let U : Rep ℤ H := Rep.res H.subtype B + simpa [Rep.norm, Representation.norm] using + restricted_norm_action H B r x + +/-- Transport the ordinary conjugation action back to a field stabilized +by that conjugation. -/ +noncomputable def conjugateStableAction + {R : IntegralRepGroupType} [Group R] [TopologicalSpace R] [ContinuousMul R] + (B : Rep ℤ R) (F : ClosedSubgroup R) (s : R) + (hF : conjugateClosedSubgroup F s = F) + (a : ambientFixedAddSubgroup B F) : ambientFixedAddSubgroup B F := + hF ▸ conjugateFixedElement B F s a + +private theorem transport_fixed_coe + {R : IntegralRepGroupType} [Group R] [TopologicalSpace R] + (B : Rep ℤ R) (F' F : ClosedSubgroup R) (h : F' = F) + (a : ambientFixedAddSubgroup B F') : + (((h ▸ a : ambientFixedAddSubgroup B F) : B.V)) = a.1 := by + cases h + rfl + +private theorem relativeNorm_transport_coe + {R : IntegralRepGroupType} [Group R] [TopologicalSpace R] + (B : Rep ℤ R) + (F' E' F E : ClosedSubgroup R) + (hF : F' = F) (hE : E' = E) + (hE'F' : E'.toSubgroup ≤ F'.toSubgroup) + (hEF : E.toSubgroup ≤ F.toSubgroup) + [Finite (F'.toSubgroup ⧸ extensionSubgroup F' E' hE'F')] + [Finite (F.toSubgroup ⧸ extensionSubgroup F E hEF)] + (a : ambientFixedAddSubgroup B E') : + ((relativeNorm B F E hEF (hE ▸ a) : ambientFixedAddSubgroup B F) : B.V) = + ((relativeNorm B F' E' hE'F' a : ambientFixedAddSubgroup B F') : B.V) := by + cases hF + cases hE + rfl + +/-- The conjugation-stable action agrees with its ambient action after coercion. -/ +@[simp] +theorem conjugateStableAction_coe + {R : IntegralRepGroupType} [Group R] [TopologicalSpace R] [ContinuousMul R] + (B : Rep ℤ R) (F : ClosedSubgroup R) (s : R) + (hF : conjugateClosedSubgroup F s = F) + (a : ambientFixedAddSubgroup B F) : + ((conjugateStableAction B F s hF a : ambientFixedAddSubgroup B F) : B.V) = + B.ρ s⁻¹ a.1 := by + exact transport_fixed_coe B _ F hF _ + +/-- Relative norm is equivariant for a conjugation stabilizing both +fields in the tower. -/ +theorem relativeNorm_conjugateStableAction + {R : IntegralRepGroupType} [Group R] [TopologicalSpace R] [ContinuousMul R] + (B : Rep ℤ R) (F E : ClosedSubgroup R) + (hEF : E.toSubgroup ≤ F.toSubgroup) (s : R) + [Finite (F.toSubgroup ⧸ extensionSubgroup F E hEF)] + (hF : conjugateClosedSubgroup F s = F) + (hE : conjugateClosedSubgroup E s = E) + (a : ambientFixedAddSubgroup B E) : + relativeNorm B F E hEF (conjugateStableAction B E s hE a) = + conjugateStableAction B F s hF (relativeNorm B F E hEF a) := by + let hConj := conjugateClosedSubgroup_mono hEF s + let : Finite ((conjugateClosedSubgroup F s).toSubgroup ⧸ + extensionSubgroup (conjugateClosedSubgroup F s) + (conjugateClosedSubgroup E s) hConj) := + finite_conjugateExtension F E hEF s + have hs := congrArg Subtype.val + (relativeNorm_conjugate_apply B F E hEF s a) + apply Subtype.ext + calc + ((relativeNorm B F E hEF (conjugateStableAction B E s hE a) : + ambientFixedAddSubgroup B F) : B.V) = + ((relativeNorm B (conjugateClosedSubgroup F s) + (conjugateClosedSubgroup E s) hConj + (conjugateFixedElement B E s a) : + ambientFixedAddSubgroup B (conjugateClosedSubgroup F s)) : B.V) := by + exact relativeNorm_transport_coe B + (conjugateClosedSubgroup F s) (conjugateClosedSubgroup E s) F E + hF hE hConj hEF (conjugateFixedElement B E s a) + _ = ((conjugateFixedElement B F s (relativeNorm B F E hEF a) : + ambientFixedAddSubgroup B (conjugateClosedSubgroup F s)) : B.V) := hs + _ = ((conjugateStableAction B F s hF (relativeNorm B F E hEF a) : + ambientFixedAddSubgroup B F) : B.V) := + (transport_fixed_coe B _ F hF _).symm + +/-- The cohomological calculation in the first half of the universal norm-descent lemma. + +The hypothesis `hstar` is precisely equation `(*)`: it says that +the class of `u` in coinvariants is fixed by `φ`. The conclusion is not +assumed: `H⁰=0` first produces the barred lifts, and `H⁻¹=0` then produces +the correction term `y` appearing. -/ +theorem universalNormDescent_cyclic_lift_and_correction + {R : IntegralRepGroupType} [Group R] (H : Subgroup R) [H.Normal] [Fintype H] + (B : Rep ℤ R) (g : H) (hg : ∀ q, q ∈ Subgroup.zpowers g) + (hzero0 : + let U : Rep ℤ H := Rep.res H.subtype B + Limits.IsZero (tateCohomology U 0)) + (hzeroMinusOne : + let U : Rep ℤ H := Rep.res H.subtype B + Limits.IsZero (tateCohomology U (-1))) + {ι : Type v} (s : Finset ι) (φ : R) (τ : ι → R) + (u : B.V) (uᵢ : ι → B.V) + (huFixed : ∀ q : H, B.ρ q.1 u = u) + (huᵢFixed : ∀ (i : ι) (q : H), B.ρ q.1 (uᵢ i) = uᵢ i) + (hstar : B.ρ φ u - u = + ∑ i ∈ s, (B.ρ (τ i) (uᵢ i) - uᵢ i)) : + ∃ (uBar : B.V) (uBarᵢ : ι → B.V) (y : B.V), + (∑ q : H, B.ρ q.1 uBar) = u ∧ + (∀ i, (∑ q : H, B.ρ q.1 (uBarᵢ i)) = uᵢ i) ∧ + B.ρ g.1 y - y = + B.ρ φ uBar - uBar - + ∑ i ∈ s, (B.ρ (τ i) (uBarᵢ i) - uBarᵢ i) := by + let U : Rep ℤ H := Rep.res H.subtype B + have huGenerator : U.ρ g u = u := huFixed g + have huLift : ∃ z : B.V, U.norm.hom z = u := + exists_norm_eq_of_tateHZero_isZero U g hg hzero0 u huGenerator + obtain ⟨uBar, huBar⟩ := huLift + have huᵢGenerator (i : ι) : U.ρ g (uᵢ i) = uᵢ i := huᵢFixed i g + have huᵢLift (i : ι) : ∃ z : B.V, U.norm.hom z = uᵢ i := + exists_norm_eq_of_tateHZero_isZero U g hg hzero0 + (uᵢ i) (huᵢGenerator i) + choose uBarᵢ huBarᵢ using huᵢLift + let delta : B.V := + B.ρ φ uBar - uBar - + ∑ i ∈ s, (B.ρ (τ i) (uBarᵢ i) - uBarᵢ i) + have hdeltaNorm : U.norm.hom delta = 0 := by + calc + U.norm.hom delta = + U.norm.hom (B.ρ φ uBar) - U.norm.hom uBar - + ∑ i ∈ s, + (U.norm.hom (B.ρ (τ i) (uBarᵢ i)) - + U.norm.hom (uBarᵢ i)) := by + dsimp [delta] + rw [map_sub, map_sub, map_sum] + simp_rw [map_sub] + _ = B.ρ φ u - u - + ∑ i ∈ s, (B.ρ (τ i) (uᵢ i) - uᵢ i) := by + rw [restricted_rep_norm_action H B φ uBar, huBar] + congr 1 + apply Finset.sum_congr rfl + intro i _ + rw [restricted_rep_norm_action H B (τ i) (uBarᵢ i), huBarᵢ i] + _ = 0 := by rw [hstar, sub_self] + obtain ⟨y, hy⟩ := + CyclicCohomology.normKernel_le_sigmaMinusOneRange_of_tateHMinusOne_isZero + U g hg hzeroMinusOne delta hdeltaNorm + refine ⟨uBar, uBarᵢ, y, ?_, ?_, ?_⟩ + · simpa [U, Rep.norm, Representation.norm] using huBar + · intro i + simpa [U, Rep.norm, Representation.norm] using huBarᵢ i + · simpa [U, delta] using hy + +/-- Enumerate the norm of a finite cyclic representation by the first +n powers of a specified generator. -/ +theorem rep_norm_eq_generatorPowerSum + {Q : IntegralRepGroupType} [Group Q] [Fintype Q] + (B : Rep ℤ Q) (g : Q) (hg : ∀ q, q ∈ Subgroup.zpowers g) + (n : ℕ) (hcard : Fintype.card Q = n) (x : B.V) : + B.norm.hom x = ∑ i : Fin n, B.ρ (g ^ i.1) x := by + classical + have horder : orderOf g = n := by + calc + orderOf g = Nat.card Q := + orderOf_eq_card_of_forall_mem_zpowers hg + _ = Fintype.card Q := Nat.card_eq_fintype_card + _ = n := hcard + let e : Fin n ≃ Q := Equiv.ofBijective (fun i => g ^ i.1) (by + constructor + · intro i j hij + apply Fin.ext + have hmod : i.1 ≡ j.1 [MOD orderOf g] := + (pow_eq_pow_iff_modEq).mp hij + rw [horder] at hmod + exact hmod.eq_of_lt_of_lt i.2 j.2 + · intro q + have himage : + Finset.image (fun i => g ^ i) (Finset.range n) = Finset.univ := by + rw [← horder] + exact IsCyclic.image_range_orderOf hg + have hq : q ∈ Finset.image (fun i => g ^ i) (Finset.range n) := by + rw [himage] + simp + obtain ⟨i, hi, hiq⟩ := Finset.mem_image.mp hq + exact ⟨⟨i, Finset.mem_range.mp hi⟩, hiq⟩) + have hsum : (∑ q : Q, B.ρ q x) = + ∑ i : Fin n, B.ρ (g ^ i.1) x := + (e.sum_comp (fun q : Q => B.ρ q x)).symm + simpa [Rep.norm, Representation.norm] using hsum + +/-- Powers in a representation are the iterates of the corresponding +action map. -/ +theorem rep_action_pow_eq_iterate {R : IntegralRepGroupType} [Group R] + (B : Rep ℤ R) (g : R) (n : ℕ) (x : B.V) : + B.ρ (g ^ n) x = ((B.ρ g)^[n]) x := by + let : Module ℤ B.V := B.hV2 + rw [map_pow, Module.End.coe_pow] + +/-- Replace the generator action in the preceding norm formula by a +pointwise equal endomorphism and enumerate its iterates. -/ +theorem rep_norm_eq_generatorIterateSum + {Q : IntegralRepGroupType} [Group Q] [Fintype Q] + (B : Rep ℤ Q) (g : Q) (hg : ∀ q, q ∈ Subgroup.zpowers g) + (n : ℕ) (hcard : Fintype.card Q = n) + (f : B.V → B.V) (hf : ∀ z, B.ρ g z = f z) (x : B.V) : + B.norm.hom x = ∑ i : Fin n, (f^[i.1]) x := by + rw [rep_norm_eq_generatorPowerSum B g hg n hcard x] + apply Finset.sum_congr rfl + intro i _ + rw [rep_action_pow_eq_iterate] + exact congrFun (congrArg (fun h : B.V → B.V => h^[i.1]) (funext hf)) x + +/-- Every nonnegative power fixes an element fixed by the original group +element. -/ +theorem rep_action_pow_fixed {R : IntegralRepGroupType} [Group R] + (B : Rep ℤ R) (g : R) (x : B.V) (hx : B.ρ g x = x) (n : ℕ) : + B.ρ (g ^ n) x = x := by + rw [rep_action_pow_eq_iterate] + exact Function.IsFixedPt.iterate hx n + +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnramifiedNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnramifiedNormQuotient.lean new file mode 100644 index 0000000000..9aa2b7dce5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnramifiedNormQuotient.lean @@ -0,0 +1,496 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityIndependence + +/-! # Unramified Norm Quotient -/ + +@[expose] public section +universe u + +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +/-! +# The abstract reciprocity construction, the unramified norm-quotient equivalence: the + unramified norm quotient + +For a finite unramified Galois extension `L / K`, normalized valuation +identifies the actual norm quotient `A_K / N_{L/K} A_L` with +`ℤ / [L : K]ℤ`. The only non-formal part of injectivity is the unit +correction: the unit-cohomology axiom (`H⁰ = 0`) makes every unit of `K` the norm +of a unit of `L`. +-/ + +noncomputable +section + +section unramifiedFrobenius + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- The degree-one lift `φ_K` used in the unramified norm-quotient equivalence. -/ +def chosenUnramifiedFrobeniusLift + (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hnormal : (extensionSubgroup K.field L hLK).Normal] : + D.FrobeniusElements K L hLK := by + let φ : K.field.toSubgroup := Classical.choose + (D.normalizedDegree_surjective K + (Multiplicative.ofAdd (1 : ZHat))) + have hφ : D.normalizedDegree K φ = + Multiplicative.ofAdd (1 : ZHat) := + Classical.choose_spec + (D.normalizedDegree_surjective K + (Multiplicative.ofAdd (1 : ZHat))) + refine ⟨QuotientGroup.mk φ, 1, Nat.zero_lt_one, ?_⟩ + rw [D.extensionNormalizedDegree_mk K L hLK φ, hφ, pow_one] + +/-- +Establishes the identity `D.frobeniusExponent K L hLK (D.chosenUnramifiedFrobeniusLift K L hLK) = +1`. +-/ +@[simp] +theorem chosenUnramifiedFrobeniusLift_exponent + (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hnormal : (extensionSubgroup K.field L hLK).Normal] : + D.frobeniusExponent K L hLK + (D.chosenUnramifiedFrobeniusLift K L hLK) = 1 := by + apply proCIntegerOne_pow_nat_injective + calc + (Multiplicative.ofAdd (1 : ZHat)) ^ + D.frobeniusExponent K L hLK + (D.chosenUnramifiedFrobeniusLift K L hLK) = + D.extensionNormalizedDegree K L hLK + (D.chosenUnramifiedFrobeniusLift K L hLK).1 := + (D.extensionNormalizedDegree_frobenius_eq_pow K L hLK + (D.chosenUnramifiedFrobeniusLift K L hLK)).symm + _ = Multiplicative.ofAdd (1 : ZHat) := by + change D.normalizedDegree K + (Classical.choose + (D.normalizedDegree_surjective K + (Multiplicative.ofAdd (1 : ZHat)))) = _ + exact Classical.choose_spec + (D.normalizedDegree_surjective K + (Multiplicative.ofAdd (1 : ZHat))) + _ = (Multiplicative.ofAdd (1 : ZHat)) ^ 1 := (pow_one _).symm + +/-- The arithmetic Frobenius `φ_{L/K}`, obtained by restricting `φ_K`. -/ +def unramifiedFrobenius + (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hnormal : (extensionSubgroup K.field L hLK).Normal] : + K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK := + D.frobeniusRestriction K L hLK + (D.chosenUnramifiedFrobeniusLift K L hLK) + +/-- In an unramified extension, arithmetic Frobenius generates the actual +finite Galois quotient. -/ +theorem unramifiedFrobenius_generates + (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hnormal : (extensionSubgroup K.field L hLK).Normal] + [Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hUnramified : + (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D) : + ∀ x : K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK, + x ∈ Subgroup.zpowers (D.unramifiedFrobenius K L hLK) := by + let φ : K.field.toSubgroup := Classical.choose + (D.normalizedDegree_surjective K + (Multiplicative.ofAdd (1 : ZHat))) + have hφ : D.normalizedDegree K φ = + Multiplicative.ofAdd (1 : ZHat) := + Classical.choose_spec + (D.normalizedDegree_surjective K + (Multiplicative.ofAdd (1 : ZHat))) + simpa only [unramifiedFrobenius, chosenUnramifiedFrobeniusLift, φ, + frobeniusRestriction, extensionRestriction_mk] using + D.quotient_generator_of_unramified_degree_one + K L hLK hUnramified φ hφ + +/-- Additive form of the preceding generator statement, matching the +domain of the reciprocity homomorphism in the finite reciprocity equivalence. -/ +theorem unramifiedFrobenius_zmultiples_eq_top + (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hnormal : (extensionSubgroup K.field L hLK).Normal] + [Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hUnramified : + (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D) : + AddSubgroup.zmultiples + (Additive.ofMul (D.unramifiedFrobenius K L hLK)) = ⊤ := by + ext x + constructor + · intro _ + exact AddSubgroup.mem_top x + · intro _ + obtain ⟨m, hm⟩ := Subgroup.mem_zpowers_iff.mp + (D.unramifiedFrobenius_generates K L hLK hUnramified x.toMul) + apply AddSubgroup.mem_zmultiples_iff.mpr + refine ⟨m, ?_⟩ + change Additive.ofMul + ((D.unramifiedFrobenius K L hLK) ^ m) = x + exact congrArg Additive.ofMul hm + +end DegreeData + +end unramifiedFrobenius + +section valuationQuotient + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] +variable {D : DegreeData G} {A : Rep ℤ G} + +namespace ValuationData + +private theorem valueModulo_eq_zero_iff + (v : ValuationData D A) (n : ℕ) (hn : 0 < n) + (z : v.valueGroup) : + v.valueModulo n hn z = 0 ↔ ∃ w : v.valueGroup, z = n • w := by + constructor + · intro hz + have hq : + (QuotientAddGroup.mk' (nsmulWithin v.valueGroup n)) z = 0 := by + apply (v.cyclicValueQuotients n hn).injective + change v.valueModulo n hn z = v.valueModulo n hn 0 + rw [hz, map_zero] + obtain ⟨w, hw⟩ := + (QuotientAddGroup.eq_zero_iff z).1 hq + exact ⟨w, hw.symm⟩ + · rintro ⟨w, rfl⟩ + have hq : + (QuotientAddGroup.mk' (nsmulWithin v.valueGroup n)) (n • w) = 0 := by + apply (QuotientAddGroup.eq_zero_iff _).2 + exact ⟨w, rfl⟩ + change (v.cyclicValueQuotients n hn) + ((QuotientAddGroup.mk' (nsmulWithin v.valueGroup n)) (n • w)) = 0 + rw [hq, map_zero] + +/-- The normalized valuation reduced modulo the finite extension degree. -/ +def unramifiedValuationHom + (v : ValuationData D A) (K : FiniteAbstractField G) + (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] : + ambientFixedAddSubgroup A K.field →+ + ZMod ((FiniteAbstractFieldExtension.ofInclusion L K hLK).degree : ℕ) := + (v.valueModulo + ((FiniteAbstractFieldExtension.ofInclusion L K hLK).degree : ℕ) + (FiniteAbstractFieldExtension.ofInclusion L K hLK).degree.property).comp + (v.valuationAt K) + +private theorem finiteNormSubgroup_le_unramifiedValuationHom_ker + (v : ValuationData D A) + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hUnramified : + (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D) : + finiteNormSubgroup A K.field L hLK ≤ + (v.unramifiedValuationHom K L hLK).ker := by + rintro _ ⟨a, rfl⟩ + let E := FiniteAbstractFieldExtension.ofInclusion L K hLK + let n := (E.degree : ℕ) + have hUn : E.IsUnramified D := by + change (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D + exact hUnramified + have htower := v.normalizedValuation_tower E a + change (E.residueDegree D : ℕ) • _ = _ at htower + rw [E.residueDegree_eq_degree_of_isUnramified D hUn] at htower + have hval : v.valuationAt K (relativeNorm A K.field L hLK a) = + n • v.valuationAt E.field a := by + apply Subtype.ext + exact htower.symm + change v.valueModulo n E.degree.property + (v.valuationAt K (relativeNorm A K.field L hLK a)) = 0 + rw [hval] + exact (v.valueModulo_eq_zero_iff n E.degree.property _).2 + ⟨v.valuationAt E.field a, rfl⟩ + +/-- The valuation map induced on the finite norm quotient. -/ +def unramifiedNormQuotientValuation + (v : ValuationData D A) + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hUnramified : + (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D) : + FiniteNormQuotient A K.field L hLK →+ + ZMod ((FiniteAbstractFieldExtension.ofInclusion L K hLK).degree : ℕ) := + finiteNormQuotientLift A K.field L hLK + (v.unramifiedValuationHom K L hLK) + (by exact v.finiteNormSubgroup_le_unramifiedValuationHom_ker K L hLK hUnramified) + +/-- +Establishes the identity `v.unramifiedNormQuotientValuation K L hLK hUnramified (finiteNormClass A +K.field L hLK a) = v.unramifiedValuationHom K L hLK a`. +-/ +@[simp] +theorem unramifiedNormQuotientValuation_finiteNormClass + (v : ValuationData D A) + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hUnramified : + (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D) + (a : ambientFixedAddSubgroup A K.field) : + v.unramifiedNormQuotientValuation K L hLK hUnramified + (finiteNormClass A K.field L hLK a) = + v.unramifiedValuationHom K L hLK a := + rfl + +/-- +The specified map is surjective: `Function.Surjective (v.unramifiedNormQuotientValuation K L hLK +hUnramified)`. +-/ +theorem unramifiedNormQuotientValuation_surjective + (v : ValuationData D A) + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hUnramified : + (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D) : + Function.Surjective + (v.unramifiedNormQuotientValuation K L hLK hUnramified) := by + intro z + let E := FiniteAbstractFieldExtension.ofInclusion L K hLK + let n := (E.degree : ℕ) + obtain ⟨c, hc⟩ := + v.valueModulo_surjective n E.degree.property z + obtain ⟨a, ha⟩ := v.normalizedValuation_surjective K c + refine ⟨finiteNormClass A K.field L hLK a, ?_⟩ + rw [v.unramifiedNormQuotientValuation_finiteNormClass] + change v.valueModulo n E.degree.property + (v.valuationAt K a) = z + rw [ha] + exact hc + +/-- The unit argument: modulo valuation, the unit-cohomology axiom makes the +remaining unit an actual norm. -/ +theorem unramifiedNormQuotientValuation_injective + (v : ValuationData D A) (hAxiom : SatisfiesUnramifiedUnitCohomology D v) + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hnormal : (extensionSubgroup K.field L hLK).Normal] + [hfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hUnramified : + (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D) : + Function.Injective + (v.unramifiedNormQuotientValuation K L hLK hUnramified) := by + let E := FiniteAbstractFieldExtension.ofInclusion L K hLK + let n := (E.degree : ℕ) + have hUn : E.IsUnramified D := by + change (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D + exact hUnramified + have hkernel : ∀ q : FiniteNormQuotient A K.field L hLK, + v.unramifiedNormQuotientValuation K L hLK hUnramified q = 0 → q = 0 := by + intro q + refine FiniteNormQuotient.induction_on A K.field L hLK q ?_ + intro a ha + change v.unramifiedValuationHom K L hLK a = 0 at ha + change v.valueModulo n E.degree.property + (v.valuationAt K a) = 0 at ha + obtain ⟨z, haz⟩ := + (v.valueModulo_eq_zero_iff n E.degree.property + (v.valuationAt K a)).1 ha + obtain ⟨b, hb⟩ := v.normalizedValuation_surjective E.field z + let normb : ambientFixedAddSubgroup A K.field := + relativeNorm A K.field L hLK b + have htower := v.normalizedValuation_tower E b + change (E.residueDegree D : ℕ) • _ = _ at htower + rw [E.residueDegree_eq_degree_of_isUnramified D hUn] at htower + have hnormb : v.valuationAt K normb = n • z := by + apply Subtype.ext + calc + ((v.valuationAt K normb : v.valueGroup) : ZHat) = + n • ((v.valuationAt E.field b : v.valueGroup) : ZHat) := htower.symm + _ = n • ((z : v.valueGroup) : ZHat) := by rw [hb] + _ = (((n • z : v.valueGroup)) : ZHat) := rfl + let u : v.unitAddSubgroup K := + ⟨a - normb, by + rw [v.mem_unitAddSubgroup_iff, map_sub, haz, hnormb, sub_self]⟩ + let KR := K.toFiniteResidueAbstractField D + let : (extensionSubgroup KR.field L hLK).Normal := by + change (extensionSubgroup K.field L hLK).Normal + exact hnormal + let : Finite + (KR.field.toSubgroup ⧸ extensionSubgroup KR.field L hLK) := by + change Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK) + exact hfinite + obtain ⟨g, hg⟩ := + D.exists_quotient_generator_of_unramified + KR L hLK hUnramified + let : Fintype + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK) := + Fintype.ofFinite _ + let Euc : FiniteUnramifiedCyclicExtension D K := + { field := L + below := hLK + normal := hnormal + finite := hfinite + generator := g + generates := hg + unramified := hUnramified } + have hzero : + CategoryTheory.Limits.IsZero + (tateCohomology (Euc.unitRepresentation v) 0) ∧ + CategoryTheory.Limits.IsZero + (tateCohomology (Euc.unitRepresentation v) (-1)) := + hAxiom K Euc + obtain ⟨ε, hε⟩ := + v.exists_unit_relativeNorm_eq_of_tateHZero_isZero + Euc.toFiniteAbstractFieldExtension Euc.normal + Euc.toFiniteAbstractFieldExtension_isUnramified + g hg hzero.1 u + change v.unitAddSubgroup E.field at ε + change relativeNorm A K.field L hLK ε.1 = u.1 at hε + apply (finiteNormClass_eq_zero_iff A K.field L hLK a).2 + refine ⟨b + ε.1, ?_⟩ + rw [map_add, hε] + change normb + (a - normb) = a + abel + intro x y hxy + apply sub_eq_zero.mp + apply hkernel + rw [map_sub, hxy, sub_self] + +/-- **the unramified norm-quotient equivalence (valuation part).** For finite unramified `L / K`, +valuation induces `A_K / N_{L/K}A_L ≃ ℤ/[L:K]ℤ`. -/ +def unramifiedReciprocityValuationEquiv + (v : ValuationData D A) (hAxiom : SatisfiesUnramifiedUnitCohomology D v) + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hnormal : (extensionSubgroup K.field L hLK).Normal] + [Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hUnramified : + (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D) : + FiniteNormQuotient A K.field L hLK ≃+ + ZMod ((FiniteAbstractFieldExtension.ofInclusion L K hLK).degree : ℕ) := + AddEquiv.ofBijective + (v.unramifiedNormQuotientValuation K L hLK hUnramified) + ⟨v.unramifiedNormQuotientValuation_injective hAxiom K L hLK + hUnramified, + v.unramifiedNormQuotientValuation_surjective K L hLK hUnramified⟩ + +/-- A prime class has exact additive order `[L : K]` in an unramified +norm quotient. The lower bound is read after reduction in `ℤ̂/nℤ̂`; the +upper bound is the norm of the included prime. -/ +theorem primeClass_addOrderOf + (v : ValuationData D A) + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hUnramified : + (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D) + (π : ambientFixedAddSubgroup A K.field) (hπ : v.IsPrimeElement K π) : + addOrderOf + (finiteNormClass A K.field L hLK π) = + ((FiniteAbstractFieldExtension.ofInclusion L K hLK).degree : ℕ) := by + let E := FiniteAbstractFieldExtension.ofInclusion L K hLK + let n := (E.degree : ℕ) + have hUn : E.IsUnramified D := by + change (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D + exact hUnramified + let g : FiniteNormQuotient A K.field L hLK := + finiteNormClass A K.field L hLK π + have hn : 0 < n := E.degree.property + have hng : n • g = 0 := by + change n • finiteNormClass A K.field L hLK π = 0 + rw [← finiteNormClass_nsmul] + apply (finiteNormClass_eq_zero_iff A K.field L hLK _).2 + refine ⟨fixedFieldInclusion A K.field L hLK π, ?_⟩ + have hnorm := + relativeNorm_fixedFieldInclusion A E.toFiniteAbstractExtension π + change relativeNorm A K.field L hLK + (fixedFieldInclusion A K.field L hLK π) = n • π at hnorm + exact hnorm + have hdiv : ∀ m : ℕ, m • g = 0 → n ∣ m := by + intro m hm + have hm' : + finiteNormClass A K.field L hLK (m • π) = 0 := by + simpa [g] using hm + have hmNorm := (finiteNormClass_eq_zero_iff A K.field L hLK _).1 hm' + obtain ⟨b, hb⟩ := hmNorm + have htower := v.normalizedValuation_tower E b + change (E.residueDegree D : ℕ) • _ = _ at htower + rw [E.residueDegree_eq_degree_of_isUnramified D hUn] at htower + have hval : + n • ((v.valuationAt E.field b : v.valueGroup) : ZHat) = + m • (1 : ZHat) := by + calc + n • ((v.valuationAt E.field b : v.valueGroup) : ZHat) = + ((v.valuationAt K (relativeNorm A K.field L hLK b) : + v.valueGroup) : ZHat) := htower + _ = ((v.valuationAt K (m • π) : v.valueGroup) : ZHat) := by + rw [hb] + _ = m • ((v.valuationAt K π : v.valueGroup) : ZHat) := by + exact congrArg Subtype.val (map_nsmul (v.valuationAt K) m π) + _ = m • (1 : ZHat) := by rw [hπ, v.oneValue_coe] + have hred := congrArg (fun z : ZHat => zHatReduction n hn z) hval + have hredOne : zHatReduction n hn (1 : ZHat) = 1 := rfl + have hred' : + n • zHatReduction n hn + ((v.valuationAt E.field b : v.valueGroup) : ZHat) = + m • (1 : ZMod n) := by + simpa only [map_nsmul, hredOne] using hred + have hmzero : (m : ZMod n) = 0 := by + have hmzero' : m • (1 : ZMod n) = 0 := by + rw [← hred'] + simp [nsmul_eq_mul] + simpa using hmzero' + exact (ZMod.natCast_eq_zero_iff m n).1 hmzero + apply Nat.dvd_antisymm + · exact (addOrderOf_dvd_iff_nsmul_eq_zero).2 hng + · exact hdiv (addOrderOf g) (addOrderOf_nsmul_eq_zero g) + +/-- The prime class generates the full unramified norm quotient, as in the +last sentence of the proof of the unramified norm-quotient equivalence. -/ +theorem primeClass_zmultiples_eq_top + (v : ValuationData D A) (hAxiom : SatisfiesUnramifiedUnitCohomology D v) + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) + [hnormal : (extensionSubgroup K.field L hLK).Normal] + [Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + (hUnramified : + (DegreeData.AbstractExtension.mk L K.field hLK).IsUnramified D) + (π : ambientFixedAddSubgroup A K.field) (hπ : v.IsPrimeElement K π) : + AddSubgroup.zmultiples + (finiteNormClass A K.field L hLK π) = ⊤ := by + let e := v.unramifiedReciprocityValuationEquiv hAxiom K L hLK hUnramified + let E := FiniteAbstractFieldExtension.ofInclusion L K hLK + let : NeZero (E.degree : ℕ) := + ⟨E.degree.property.ne'⟩ + let : Finite (FiniteNormQuotient A K.field L hLK) := + Finite.of_equiv (ZMod (E.degree : ℕ)) (by + simpa [E] using e.symm.toEquiv) + apply AddSubgroup.eq_top_of_card_eq + rw [Nat.card_zmultiples, + v.primeClass_addOrderOf K L hLK hUnramified π hπ] + exact ((Nat.card_congr e.toEquiv).trans (Nat.card_zmod _)).symm + +end ValuationData + +end valuationQuotient + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean new file mode 100644 index 0000000000..3ddb959095 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean @@ -0,0 +1,1292 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FieldRepresentation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransfer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.CyclicNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension + +/-! # Core -/ + +@[expose] public section +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +/-! +# Abstract reciprocity, the unramified cohomology consequence + +The class field axiom implies the unit-cohomology axiom for every finite unramified +extension. The proof follows: degree minus one is reduced to +the corresponding assertion for `A_L`, after correcting a primitive by an +element of `A_K` with the same valuation; in degree zero, valuation induces +a surjection from `A_K / N A_L` to `Z / [L : K] Z`, and equality of the two +orders makes this map injective. +-/ + +noncomputable +section + +open CategoryTheory + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] +variable {D : DegreeData G} {A : Rep ℤ G} + +namespace ValuationData + +private theorem valueModulo_nsmul + (v : ValuationData D A) (n : ℕ) (hn : 0 < n) + (z : v.valueGroup) : + v.valueModulo n hn (n • z) = 0 := by + have hq : + (QuotientAddGroup.mk' (nsmulWithin v.valueGroup n)) (n • z) = 0 := by + apply (QuotientAddGroup.eq_zero_iff _).2 + exact ⟨z, rfl⟩ + change (v.cyclicValueQuotients n hn) + ((QuotientAddGroup.mk' (nsmulWithin v.valueGroup n)) (n • z)) = 0 + rw [hq, map_zero] + +private theorem classFieldAxiom_unramifiedUnits_hMinusOne + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + (E : FiniteAbstractFieldExtension G) + (hnormal : (extensionSubgroup E.base.field E.field.field E.below).Normal) + (hUnramified : E.IsUnramified D) + (g : E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) + (hg : ∀ x, x ∈ Subgroup.zpowers g) : + letI := Fintype.ofFinite + (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) + Limits.IsZero + (tateCohomology (v.unitRepresentation E hnormal) (-1)) := by + let K := E.base.field + let L := E.field.field + let hLK := E.below + let := hnormal + let := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + let : IsCyclic (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + isCyclic_of_generator g hg + let : CommGroup (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + IsCyclic.commGroup + let U := v.unitRepresentation E hnormal + let M := extensionFixedRepresentation A K L hLK hnormal + let S := Rep.FiniteCyclicGroup.subCompNormHom U g + let Kcf : FiniteAbstractField G := E.base + let Ecf : FiniteCyclicSubextension Kcf := + { field := L + below := hLK + normal := hnormal + finite := inferInstance + generator := g + generates := hg } + have hMzero : Limits.IsZero (tateCohomology M (-1)) := + by + simpa [Kcf, Ecf, + FiniteCyclicSubextension.fixedRepresentation] using + hcf.tateHMinusOne_isZero Kcf Ecf + have hExact : S.Exact := by + rw [S.moduleCat_exact_iff] + intro u hu + have huNorm : U.norm.hom u = 0 := by + simpa [S] using hu + let uM : M.V := + (extensionFixedRepresentationEquiv A K L hLK hnormal).symm u.1 + have huMNorm : M.norm.hom uM = 0 := by + apply Subtype.ext + calc + (M.norm.hom uM).1 = + ((relativeNorm A K L hLK + (extensionFixedRepresentationEquiv A K L hLK hnormal uM) : + ambientFixedAddSubgroup A K) : A.V) := + extensionFixedRepresentation_norm_coe A K L hLK hnormal uM + _ = ((relativeNorm A K L hLK u.1 : + ambientFixedAddSubgroup A K) : A.V) := by + rfl + _ = ((((U.norm.hom u).1 : ambientFixedAddSubgroup A L)) : A.V) := + (v.unitRepresentation_norm_coe E hnormal u).symm + _ = 0 := by rw [huNorm]; rfl + obtain ⟨a, ha⟩ := + CyclicCohomology.normKernel_le_sigmaMinusOneRange_of_tateHMinusOne_isZero + M g hg hMzero uM huMNorm + let aL : ambientFixedAddSubgroup A L := + extensionFixedRepresentationEquiv A K L hLK hnormal a + obtain ⟨b, hb⟩ := + v.normalizedValuation_surjective E.base (v.valuationAt E.field aL) + let bL : ambientFixedAddSubgroup A L := + fixedFieldInclusion A K L hLK b + let eL : ambientFixedAddSubgroup A L := aL - bL + have heL : v.valuationAt E.field eL = 0 := by + change v.valuationAt E.field (aL - bL) = 0 + rw [map_sub, + v.valuationAt_fixedFieldInclusion_of_unramified E hUnramified b, + hb, sub_self] + let e : U.V := ⟨eL, (v.mem_unitAddSubgroup_iff E.field eL).2 heL⟩ + refine ⟨e, ?_⟩ + have hactionSub : + relativeCosetAction A K L hLK eL g = + relativeCosetAction A K L hLK aL g - + relativeCosetAction A K L hLK bL g := by + refine Quotient.inductionOn' g ?_ + intro k + rw [relativeCosetAction_mk, relativeCosetAction_mk, + relativeCosetAction_mk] + exact map_sub (A.ρ k.1) aL.1 bL.1 + have hactionB : + relativeCosetAction A K L hLK bL g = bL.1 := by + refine Quotient.inductionOn' g ?_ + intro k + rw [relativeCosetAction_mk] + exact b.2 k + have hUaction : + (((U.ρ g e).1 : ambientFixedAddSubgroup A L) : A.V) = + relativeCosetAction A K L hLK eL g := by + simpa [U] using + v.unitRepresentation_action_coe E hnormal g e + have hMaction : + (M.ρ g a).1 = relativeCosetAction A K L hLK aL g := by + simpa [M, aL] using + extensionFixedRepresentation_action_coe A K L hLK hnormal g a + apply Subtype.ext + apply Subtype.ext + calc + ((((U.ρ g e - e).1 : ambientFixedAddSubgroup A L)) : A.V) = + relativeCosetAction A K L hLK eL g - eL.1 := by + change (((U.ρ g e).1 : ambientFixedAddSubgroup A L) : A.V) - + ((e.1 : ambientFixedAddSubgroup A L) : A.V) = _ + rw [hUaction] + _ = relativeCosetAction A K L hLK aL g - aL.1 := by + rw [hactionSub, hactionB] + change (_ - bL.1) - (aL.1 - bL.1) = _ - aL.1 + abel + _ = (M.ρ g a - a).1 := by + change _ = (M.ρ g a).1 - a.1 + rw [hMaction] + rfl + _ = uM.1 := congrArg Subtype.val ha + _ = u.1.1 := rfl + have hzeroS : Limits.IsZero S.homology := + (S.exact_iff_isZero_homology).1 hExact + exact Limits.IsZero.of_iso hzeroS + (TateCohomology.isoFiniteCyclicNegOne U g hg) + +/-- In an unramified extension, the representation norm multiplies the upper valuation by degree. -/ +private theorem valuationAt_unramified_representation_norm + (v : ValuationData D A) (E : FiniteAbstractFieldExtension G) + (hnormal : (extensionSubgroup E.base.field E.field.field E.below).Normal) + (hUnramified : E.IsUnramified D) : + letI := Fintype.ofFinite + (E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field E.field.field E.below) + ∀ y : (extensionFixedRepresentation A E.base.field E.field.field E.below hnormal).V, + v.valuationAt E.field + (extensionFixedRepresentationEquiv A E.base.field E.field.field E.below hnormal + ((extensionFixedRepresentation A E.base.field E.field.field E.below hnormal).norm.hom + y)) = + (E.degree : ℕ) • v.valuationAt E.field + (extensionFixedRepresentationEquiv A E.base.field E.field.field E.below hnormal y) := by + let := Fintype.ofFinite + (E.base.field.toSubgroup ⧸ extensionSubgroup E.base.field E.field.field E.below) + intro y + let K := E.base.field + let L := E.field.field + let hLK := E.below + let := hnormal + let M := extensionFixedRepresentation A K L hLK hnormal + let yL : ambientFixedAddSubgroup A L := + extensionFixedRepresentationEquiv A K L hLK hnormal y + let normK : ambientFixedAddSubgroup A K := relativeNorm A K L hLK yL + have hnormM : + extensionFixedRepresentationEquiv A K L hLK hnormal (M.norm.hom y) = + fixedFieldInclusion A K L hLK normK := by + apply Subtype.ext + exact extensionFixedRepresentation_norm_coe A K L hLK hnormal y + have htower := v.normalizedValuation_tower E yL + change (E.residueDegree D : ℕ) • + ((v.valuationAt E.field yL : v.valueGroup) : ZHat) = + ((v.valuationAt E.base normK : v.valueGroup) : ZHat) at htower + rw [E.residueDegree_eq_degree_of_isUnramified D hUnramified] at htower + change v.valuationAt E.field + (extensionFixedRepresentationEquiv A K L hLK hnormal (M.norm.hom y)) = + (E.degree : ℕ) • v.valuationAt E.field yL + rw [hnormM, v.valuationAt_fixedFieldInclusion_of_unramified E hUnramified normK] + apply Subtype.ext + exact htower.symm + +private theorem classFieldAxiom_unramifiedUnits_hZero + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + (E : FiniteAbstractFieldExtension G) + (hnormal : (extensionSubgroup E.base.field E.field.field E.below).Normal) + (hUnramified : E.IsUnramified D) + (g : E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) + (hg : ∀ x, x ∈ Subgroup.zpowers g) : + letI := Fintype.ofFinite + (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) + Limits.IsZero + (tateCohomology (v.unitRepresentation E hnormal) 0) := by + let K := E.base.field + let L := E.field.field + let hLK := E.below + let := hnormal + let := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + let : IsCyclic (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + isCyclic_of_generator g hg + let : CommGroup (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + IsCyclic.commGroup + let n := (E.degree : ℕ) + have hn : 0 < n := E.degree.property + let M := extensionFixedRepresentation A K L hLK hnormal + let instM : Module ℤ M.V := M.hV2 + let T := Rep.FiniteCyclicGroup.normHomCompSub M g + let instTCycles : Module ℤ (LinearMap.ker T.g.hom) := + (LinearMap.ker T.g.hom).module + let C := LinearMap.ker T.g.hom + let cycleValAdd : C →+ ZMod n := + (v.valueModulo n hn).comp <| + (v.valuationAt E.field).comp <| + (extensionFixedRepresentationEquiv A K L hLK hnormal).toAddMonoidHom.comp + C.subtype.toAddMonoidHom + let cycleVal : C →ₗ[ℤ] ZMod n := + { toFun := cycleValAdd + map_add' := cycleValAdd.map_add + map_smul' := by + intro m x + simp only [RingHom.id_apply] + convert! cycleValAdd.map_zsmul m x using 1 + exact congrArg cycleValAdd (int_smul_eq_zsmul ..) } + have hcycleValNorm : + LinearMap.range T.moduleCatToCycles ≤ LinearMap.ker cycleVal := by + rintro x ⟨y, rfl⟩ + change v.valueModulo n hn + (v.valuationAt E.field + (extensionFixedRepresentationEquiv A K L hLK hnormal + (M.norm.hom y))) = 0 + rw [v.valuationAt_unramified_representation_norm E hnormal hUnramified y] + exact v.valueModulo_nsmul n hn + (v.valuationAt E.field (extensionFixedRepresentationEquiv A K L hLK hnormal y)) + let H := T.moduleCatLeftHomologyData.H + let fieldVal : H →ₗ[ℤ] ZMod n := + (LinearMap.range T.moduleCatToCycles).liftQ cycleVal hcycleValNorm + have hfieldValSurjective : Function.Surjective fieldVal := by + intro z + obtain ⟨c, hc⟩ := v.valueModulo_surjective n hn z + obtain ⟨aK, haK⟩ := v.normalizedValuation_surjective E.base c + let aL : ambientFixedAddSubgroup A L := + fixedFieldInclusion A K L hLK aK + let aM : M.V := + (extensionFixedRepresentationEquiv A K L hLK hnormal).symm aL + have haMfixed : M.ρ g aM = aM := by + refine Quotient.inductionOn' g ?_ + intro k + apply Subtype.ext + change A.ρ k.1 aK.1 = aK.1 + exact aK.2 k + have haMcycle : T.g aM = 0 := by + change M.ρ g aM - aM = 0 + exact sub_eq_zero.mpr haMfixed + let aCycle : C := ⟨aM, haMcycle⟩ + refine ⟨Submodule.mkQ (LinearMap.range T.moduleCatToCycles) aCycle, ?_⟩ + change v.valueModulo n hn (v.valuationAt E.field aL) = z + rw [v.valuationAt_fixedFieldInclusion_of_unramified E hUnramified aK, + haK] + exact hc + let homologyEquiv : H ≃ T.homology := + { toFun := fun x => T.moduleCatLeftHomologyData.homologyIso.inv x + invFun := fun x => T.moduleCatLeftHomologyData.homologyIso.hom x + left_inv := by intro x; simp + right_inv := by intro x; simp } + let eHTate : H ≃ tateCohomology M 0 := homologyEquiv.trans + (TateCohomology.isoFiniteCyclicZero M g hg).symm.toLinearEquiv.toEquiv + let Kcf : FiniteAbstractField G := E.base + let Ecf : FiniteCyclicSubextension Kcf := + { field := E.field.field + below := E.below + normal := hnormal + finite := E.finiteQuotient + generator := g + generates := hg } + let hEcfTateFinite : + Finite (tateCohomology (Ecf.fixedRepresentation A) 0) := + (hcf Kcf Ecf).finiteTateHZero + let hMTateFinite : Finite (tateCohomology M 0) := by + simpa [M, K, L, hLK, Kcf, Ecf, + FiniteCyclicSubextension.fixedRepresentation] using hEcfTateFinite + let hHFinite : Finite H := + Finite.of_equiv (tateCohomology M 0) eHTate.symm + have hcardT : Nat.card H = n := by + calc + Nat.card H = Nat.card (tateCohomology M 0) := + Nat.card_congr eHTate + _ = n := by + convert hcf.tateHZero_card Kcf Ecf using 1 <;> + simp [n, M, K, L, Kcf, Ecf, + FiniteCyclicSubextension.fixedRepresentation, + FiniteCyclicSubextension.toFiniteAbstractExtension, + FiniteAbstractFieldExtension.degree, + FiniteAbstractFieldExtension.toFiniteAbstractExtension] + have hfieldValInjective : Function.Injective fieldVal := + ((Nat.bijective_iff_surjective_and_card fieldVal).2 + ⟨hfieldValSurjective, hcardT.trans (Nat.card_zmod n).symm⟩).1 + let U := v.unitRepresentation E hnormal + let S := Rep.FiniteCyclicGroup.normHomCompSub U g + have hExact : S.Exact := by + rw [S.moduleCat_exact_iff] + intro u hu + have huFixed : U.ρ g u = u := by + apply sub_eq_zero.mp + simpa [S, Rep.sub_hom, Rep.applyAsHom_apply] using hu + let uM : M.V := + (extensionFixedRepresentationEquiv A K L hLK hnormal).symm u.1 + have huMFixed : M.ρ g uM = uM := by + have hUaction : + (((U.ρ g u).1 : ambientFixedAddSubgroup A L) : A.V) = + relativeCosetAction A K L hLK u.1 g := by + simpa [U] using + v.unitRepresentation_action_coe E hnormal g u + have hMaction : + (M.ρ g uM).1 = relativeCosetAction A K L hLK u.1 g := by + simpa [M, uM] using + extensionFixedRepresentation_action_coe A K L hLK hnormal g uM + apply Subtype.ext + calc + (M.ρ g uM).1 = relativeCosetAction A K L hLK u.1 g := hMaction + _ = (((U.ρ g u).1 : ambientFixedAddSubgroup A L) : A.V) := + hUaction.symm + _ = u.1.1 := by rw [huFixed] + _ = uM.1 := rfl + have huMcycle : T.g uM = 0 := by + change M.ρ g uM - uM = 0 + exact sub_eq_zero.mpr huMFixed + let uCycle : C := ⟨uM, huMcycle⟩ + have huClassVal : + fieldVal (Submodule.mkQ (LinearMap.range T.moduleCatToCycles) uCycle) = 0 := by + change v.valueModulo n hn (v.valuationAt E.field u.1) = 0 + rw [(v.mem_unitAddSubgroup_iff E.field u.1).1 u.2, map_zero] + have huClass : + Submodule.mkQ (LinearMap.range T.moduleCatToCycles) uCycle = 0 := by + apply hfieldValInjective + exact huClassVal.trans (map_zero fieldVal).symm + have huCycleRange : uCycle ∈ LinearMap.range T.moduleCatToCycles := + (Submodule.Quotient.mk_eq_zero _).1 huClass + obtain ⟨y, hy⟩ := huCycleRange + have hyNorm : M.norm.hom y = uM := congrArg Subtype.val hy + let yL : ambientFixedAddSubgroup A L := + extensionFixedRepresentationEquiv A K L hLK hnormal y + let normK : ambientFixedAddSubgroup A K := relativeNorm A K L hLK yL + have hnormInclusion : + fixedFieldInclusion A K L hLK normK = u.1 := by + apply Subtype.ext + calc + normK.1 = (M.norm.hom y).1 := + (extensionFixedRepresentation_norm_coe A K L hLK hnormal y).symm + _ = uM.1 := congrArg Subtype.val hyNorm + _ = u.1.1 := rfl + have huVal : v.valuationAt E.field u.1 = 0 := + (v.mem_unitAddSubgroup_iff E.field u.1).1 u.2 + have htower := v.normalizedValuation_tower E yL + change (E.residueDegree D : ℕ) • + ((v.valuationAt E.field yL : v.valueGroup) : ZHat) = + ((v.valuationAt E.base + (relativeNorm A E.base.field E.field.field E.below yL) : + v.valueGroup) : ZHat) at htower + rw [E.residueDegree_eq_degree_of_isUnramified D hUnramified] at htower + have hyVal : v.valuationAt E.field yL = 0 := by + apply Subtype.ext + apply zHatMulNat_injective hn + calc + n • ((v.valuationAt E.field yL : v.valueGroup) : ZHat) = + ((v.valuationAt E.base normK : v.valueGroup) : ZHat) := htower + _ = ((v.valuationAt E.field + (fixedFieldInclusion A K L hLK normK) : v.valueGroup) : ZHat) := by + rw [v.valuationAt_fixedFieldInclusion_of_unramified E hUnramified normK] + _ = ((v.valuationAt E.field u.1 : v.valueGroup) : ZHat) := by + rw [hnormInclusion] + _ = 0 := congrArg Subtype.val huVal + _ = n • (0 : ZHat) := (nsmul_zero n).symm + let yU : U.V := + ⟨yL, (v.mem_unitAddSubgroup_iff E.field yL).2 hyVal⟩ + refine ⟨yU, ?_⟩ + apply Subtype.ext + apply Subtype.ext + calc + ((((U.norm.hom yU).1 : ambientFixedAddSubgroup A L)) : A.V) = + normK.1 := v.unitRepresentation_norm_coe E hnormal yU + _ = (M.norm.hom y).1 := + (extensionFixedRepresentation_norm_coe A K L hLK hnormal y).symm + _ = uM.1 := congrArg Subtype.val hyNorm + _ = u.1.1 := rfl + have hzeroS : Limits.IsZero S.homology := (S.exact_iff_isZero_homology).1 hExact + exact Limits.IsZero.of_iso hzeroS + (TateCohomology.isoFiniteCyclicZero U g hg) + +/-- **the unramified cohomology consequence.** The class field axiom implies the +unit-cohomology axiom: for every +finite unramified Galois extension `L / K`, both +`H⁰(G(L/K), U_L)` and `H⁻¹(G(L/K), U_L)` vanish. -/ +theorem classFieldAxiom_implies_unramifiedUnitCohomology + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) : + SatisfiesUnramifiedUnitCohomology D v := by + intro K E + constructor + · simpa [FiniteUnramifiedCyclicExtension.unitRepresentation] using + v.classFieldAxiom_unramifiedUnits_hZero hcf + E.toFiniteAbstractFieldExtension E.normal + E.toFiniteAbstractFieldExtension_isUnramified E.generator E.generates + · simpa [FiniteUnramifiedCyclicExtension.unitRepresentation] using + v.classFieldAxiom_unramifiedUnits_hMinusOne hcf + E.toFiniteAbstractFieldExtension E.normal + E.toFiniteAbstractFieldExtension_isUnramified E.generator E.generates + +end ValuationData + +/-! +# Abstract reciprocity, the abstract reciprocity theorem: the two exact rows + +The proof of the abstract reciprocity theorem starts with a finite Galois tower +`L | M | K`. This file constructs the two rows of that diagram on the +actual finite Galois groups and finite norm quotients: + +`1 → G(L/M) → G(L/K) → G(M/K) → 1`, + +`A_M / N_{L/M} A_L → A_K / N_{L/K} A_L + → A_K / N_{M/K} A_M → 0`. + +It also records the canonical factorization of an additive reciprocity map +through the abelianization. No exactness or bijectivity statement is taken +as an input; both rows are proved directly from quotient membership and norm +transitivity. +-/ + +noncomputable +section + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +/-- The restriction `G(L/K) → G(M/K)` in the upper row. -/ +def abstractReciprocityRestriction + {G : Type*} [Group G] [TopologicalSpace G] + (K M L : ClosedSubgroup G) + (hLM : L.toSubgroup ≤ M.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLM.trans hMK)).Normal] + [hMnormal : (extensionSubgroup K M hMK).Normal] : + (K.toSubgroup ⧸ extensionSubgroup K L (hLM.trans hMK)) →* + (K.toSubgroup ⧸ extensionSubgroup K M hMK) := by + apply QuotientGroup.map + (extensionSubgroup K L (hLM.trans hMK)) + (extensionSubgroup K M hMK) + (MonoidHom.id K.toSubgroup) + intro k hk + exact hLM hk + +/-- +Establishes the identity `abstractReciprocityRestriction K M L hLM hMK (QuotientGroup.mk k) = +QuotientGroup.mk k`. +-/ +@[simp] +theorem abstractReciprocityRestriction_mk + {G : Type*} [Group G] [TopologicalSpace G] + (K M L : ClosedSubgroup G) + (hLM : L.toSubgroup ≤ M.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLM.trans hMK)).Normal] + [hMnormal : (extensionSubgroup K M hMK).Normal] + (k : K.toSubgroup) : + abstractReciprocityRestriction K M L hLM hMK (QuotientGroup.mk k) = + QuotientGroup.mk k := + rfl + +/-- Restriction to the intermediate Galois extension is surjective. -/ +theorem abstractReciprocityRestriction_surjective + {G : Type*} [Group G] [TopologicalSpace G] + (K M L : ClosedSubgroup G) + (hLM : L.toSubgroup ≤ M.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLM.trans hMK)).Normal] + [hMnormal : (extensionSubgroup K M hMK).Normal] : + Function.Surjective (abstractReciprocityRestriction K M L hLM hMK) := by + intro q + refine QuotientGroup.induction_on q ?_ + intro k + exact ⟨QuotientGroup.mk k, rfl⟩ + +/-- With equal base fields, norm--conjugation naturality's Galois-side restriction is +the restriction in the reciprocity reduction exact row's exact row. -/ +theorem finiteReciprocityNaturalityRestriction_sameBase_eq_restriction + {G : Type*} [Group G] [TopologicalSpace G] + (K M L : ClosedSubgroup G) + (hLM : L.toSubgroup ≤ M.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLM.trans hMK)).Normal] + [hMnormal : (extensionSubgroup K M hMK).Normal] : + finiteReciprocityNaturalityRestriction K K M L hMK (hLM.trans hMK) le_rfl hLM = + abstractReciprocityRestriction K M L hLM hMK := by + apply MonoidHom.ext + intro q + refine QuotientGroup.induction_on q ?_ + intro k + rfl + +/-- Finiteness of `L | K` implies finiteness of the quotient `G(M/K)`. +This is derived from the actual surjective restriction map. -/ +theorem abstractReciprocity_intermediateQuotient_finite + {G : Type*} [Group G] [TopologicalSpace G] + (K M L : ClosedSubgroup G) + (hLM : L.toSubgroup ≤ M.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLM.trans hMK)).Normal] + [hMnormal : (extensionSubgroup K M hMK).Normal] + [hLfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L (hLM.trans hMK))] : + Finite (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + Finite.of_surjective (abstractReciprocityRestriction K M L hLM hMK) + (abstractReciprocityRestriction_surjective K M L hLM hMK) + +/-- The inclusion `G(L/M) → G(L/K)` in the upper row. +Normality of `L | M` is derived from normality of `L | K`. -/ +def abstractReciprocityInclusion + {G : Type*} [Group G] [TopologicalSpace G] + (K M L : ClosedSubgroup G) + (hLM : L.toSubgroup ≤ M.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLM.trans hMK)).Normal] : + letI : (extensionSubgroup M L hLM).Normal := + transferNormNaturality_intermediateExtension_normal K M L hLM hMK + (M.toSubgroup ⧸ extensionSubgroup M L hLM) →* + (K.toSubgroup ⧸ extensionSubgroup K L (hLM.trans hMK)) := by + letI : (extensionSubgroup M L hLM).Normal := + transferNormNaturality_intermediateExtension_normal K M L hLM hMK + exact transferNormNaturalityIntermediateInclusion K M L hLM hMK + +/-- +On quotient representatives, the abstract reciprocity inclusion is induced by inclusion of the +intermediate subgroup. +-/ +@[simp] +theorem abstractReciprocityInclusion_mk + {G : Type*} [Group G] [TopologicalSpace G] + (K M L : ClosedSubgroup G) + (hLM : L.toSubgroup ≤ M.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLM.trans hMK)).Normal] + (m : M.toSubgroup) : + letI : (extensionSubgroup M L hLM).Normal := + transferNormNaturality_intermediateExtension_normal K M L hLM hMK + abstractReciprocityInclusion K M L hLM hMK (QuotientGroup.mk m) = + QuotientGroup.mk (Subgroup.inclusion hMK m) := by + let : (extensionSubgroup M L hLM).Normal := + transferNormNaturality_intermediateExtension_normal K M L hLM hMK + rfl + +/-- The upper row is exact at `G(L/K)`: the image of `G(L/M)` is exactly +the kernel of restriction to `G(M/K)`. -/ +theorem abstractReciprocity_galois_exact + {G : Type*} [Group G] [TopologicalSpace G] + (K M L : ClosedSubgroup G) + (hLM : L.toSubgroup ≤ M.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLM.trans hMK)).Normal] + [hMnormal : (extensionSubgroup K M hMK).Normal] : + letI : (extensionSubgroup M L hLM).Normal := + transferNormNaturality_intermediateExtension_normal K M L hLM hMK + (abstractReciprocityRestriction K M L hLM hMK).ker = + (abstractReciprocityInclusion K M L hLM hMK).range := by + let : (extensionSubgroup M L hLM).Normal := + transferNormNaturality_intermediateExtension_normal K M L hLM hMK + ext q + refine QuotientGroup.induction_on q ?_ + intro k + constructor + · intro hk + change abstractReciprocityRestriction K M L hLM hMK + (QuotientGroup.mk k) = 1 at hk + have hkM : k ∈ extensionSubgroup K M hMK := + (QuotientGroup.eq_one_iff k).1 hk + let m : M.toSubgroup := ⟨k.1, hkM⟩ + refine ⟨QuotientGroup.mk m, ?_⟩ + exact congrArg + (fun t : K.toSubgroup => + (QuotientGroup.mk t : + K.toSubgroup ⧸ extensionSubgroup K L (hLM.trans hMK))) + (Subtype.ext rfl) + · rintro ⟨q, hq⟩ + rw [← hq] + refine QuotientGroup.induction_on q ?_ + intro m + change (QuotientGroup.mk (Subgroup.inclusion hMK m) : + K.toSubgroup ⧸ extensionSubgroup K M hMK) = 1 + exact (QuotientGroup.eq_one_iff _).2 m.2 + +/-- Finiteness of `L | K` also implies finiteness of `L | M`. -/ +theorem abstractReciprocity_lowerExtension_finite + {G : Type*} [Group G] [TopologicalSpace G] + (K M L : ClosedSubgroup G) + (hLM : L.toSubgroup ≤ M.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hLfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L (hLM.trans hMK))] : + Finite (M.toSubgroup ⧸ extensionSubgroup M L hLM) := by + let inclusion : + (M.toSubgroup ⧸ extensionSubgroup M L hLM) → + (K.toSubgroup ⧸ extensionSubgroup K L (hLM.trans hMK)) := + Quotient.map' (Subgroup.inclusion hMK) (by + intro x y hxy + rw [QuotientGroup.leftRel_apply] at hxy ⊢ + apply (mem_extensionSubgroup_iff K L (hLM.trans hMK) _).2 + simpa using (mem_extensionSubgroup_iff M L hLM _).1 hxy) + apply Finite.of_injective inclusion + intro x y + refine QuotientGroup.induction_on x ?_ + intro m + refine QuotientGroup.induction_on y ?_ + intro n h + apply QuotientGroup.eq.mpr + apply (mem_extensionSubgroup_iff M L hLM (m⁻¹ * n)).2 + have h' : + (QuotientGroup.mk (Subgroup.inclusion hMK m) : + K.toSubgroup ⧸ extensionSubgroup K L (hLM.trans hMK)) = + QuotientGroup.mk (Subgroup.inclusion hMK n) := by + simpa [inclusion] using h + have hmem := QuotientGroup.eq.mp h' + have hG := (mem_extensionSubgroup_iff K L (hLM.trans hMK) + ((Subgroup.inclusion hMK m)⁻¹ * Subgroup.inclusion hMK n)).1 hmem + simpa using hG + +/-- Norm transitivity identifies the norm image from `L` with a subgroup +of the norm image from `M`. -/ +theorem abstractReciprocity_finiteNormSubgroup_le + (A : Rep ℤ G) (K M L : ClosedSubgroup G) + (hLM : L.toSubgroup ≤ M.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hKMfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K M hMK)] + [hMLfinite : Finite + (M.toSubgroup ⧸ extensionSubgroup M L hLM)] + [hKLfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L (hLM.trans hMK))] : + finiteNormSubgroup A K L (hLM.trans hMK) ≤ + finiteNormSubgroup A K M hMK := by + let T : DegreeData.FiniteTower G := + { top := L + middle := M + base := K + top_le_middle := hLM + middle_le_base := hMK + finiteTopQuotient := hMLfinite + finiteBaseQuotient := hKMfinite } + rintro _ ⟨a, rfl⟩ + refine ⟨relativeNorm A M L hLM a, ?_⟩ + exact T.norm_trans_apply A a + +/-- The first arrow in the lower row, induced by `N_{M/K}`. -/ +def abstractReciprocityNormMap + (A : Rep ℤ G) (K M L : ClosedSubgroup G) + (hLM : L.toSubgroup ≤ M.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLM.trans hMK)).Normal] + [hMnormal : (extensionSubgroup K M hMK).Normal] + [hKLfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L (hLM.trans hMK))] : + letI : Finite (M.toSubgroup ⧸ extensionSubgroup M L hLM) := + abstractReciprocity_lowerExtension_finite K M L hLM hMK + letI : Finite (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + abstractReciprocity_intermediateQuotient_finite K M L hLM hMK + FiniteNormQuotient A M L hLM →+ + FiniteNormQuotient A K L (hLM.trans hMK) := by + letI : Finite (M.toSubgroup ⧸ extensionSubgroup M L hLM) := + abstractReciprocity_lowerExtension_finite K M L hLM hMK + letI : Finite (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + abstractReciprocity_intermediateQuotient_finite K M L hLM hMK + exact finiteReciprocityNaturalityNormMap A K M L L (hLM.trans hMK) hLM hMK le_rfl + +/-- +The abstract reciprocity norm map sends a finite norm class to the class of the corresponding +relative norm. +-/ +@[simp] +theorem abstractReciprocityNormMap_finiteNormClass + (A : Rep ℤ G) (K M L : ClosedSubgroup G) + (hLM : L.toSubgroup ≤ M.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLM.trans hMK)).Normal] + [hMnormal : (extensionSubgroup K M hMK).Normal] + [hKLfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L (hLM.trans hMK))] + (a : ambientFixedAddSubgroup A M) : + letI : Finite (M.toSubgroup ⧸ extensionSubgroup M L hLM) := + abstractReciprocity_lowerExtension_finite K M L hLM hMK + letI : Finite (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + abstractReciprocity_intermediateQuotient_finite K M L hLM hMK + abstractReciprocityNormMap A K M L hLM hMK + (finiteNormClass A M L hLM a) = + finiteNormClass A K L (hLM.trans hMK) + (relativeNorm A K M hMK a) := by + let : Finite (M.toSubgroup ⧸ extensionSubgroup M L hLM) := + abstractReciprocity_lowerExtension_finite K M L hLM hMK + let : Finite (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + abstractReciprocity_intermediateQuotient_finite K M L hLM hMK + exact finiteReciprocityNaturalityNormMap_finiteNormClass A K M L L + (hLM.trans hMK) hLM hMK le_rfl a + +/-- The quotient projection +`A_K/N_{L/K}A_L → A_K/N_{M/K}A_M` in the lower row. -/ +def abstractReciprocityNormProjection + (A : Rep ℤ G) (K M L : ClosedSubgroup G) + (hLM : L.toSubgroup ≤ M.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLM.trans hMK)).Normal] + [hMnormal : (extensionSubgroup K M hMK).Normal] + [hKLfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L (hLM.trans hMK))] : + letI : Finite (M.toSubgroup ⧸ extensionSubgroup M L hLM) := + abstractReciprocity_lowerExtension_finite K M L hLM hMK + letI : Finite (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + abstractReciprocity_intermediateQuotient_finite K M L hLM hMK + FiniteNormQuotient A K L (hLM.trans hMK) →+ + FiniteNormQuotient A K M hMK := by + letI : Finite (M.toSubgroup ⧸ extensionSubgroup M L hLM) := + abstractReciprocity_lowerExtension_finite K M L hLM hMK + letI : Finite (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + abstractReciprocity_intermediateQuotient_finite K M L hLM hMK + apply finiteNormQuotientLift A K L (hLM.trans hMK) + (finiteNormClassHom A K M hMK) + intro a ha + exact (finiteNormClass_eq_zero_iff A K M hMK a).2 + (abstractReciprocity_finiteNormSubgroup_le A K M L hLM hMK ha) + +/-- +The abstract reciprocity norm projection preserves the representative while passing to the +intermediate norm quotient. +-/ +@[simp] +theorem abstractReciprocityNormProjection_finiteNormClass + (A : Rep ℤ G) (K M L : ClosedSubgroup G) + (hLM : L.toSubgroup ≤ M.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLM.trans hMK)).Normal] + [hMnormal : (extensionSubgroup K M hMK).Normal] + [hKLfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L (hLM.trans hMK))] + (a : ambientFixedAddSubgroup A K) : + letI : Finite (M.toSubgroup ⧸ extensionSubgroup M L hLM) := + abstractReciprocity_lowerExtension_finite K M L hLM hMK + letI : Finite (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + abstractReciprocity_intermediateQuotient_finite K M L hLM hMK + abstractReciprocityNormProjection A K M L hLM hMK + (finiteNormClass A K L (hLM.trans hMK) a) = + finiteNormClass A K M hMK a := by + let : Finite (M.toSubgroup ⧸ extensionSubgroup M L hLM) := + abstractReciprocity_lowerExtension_finite K M L hLM hMK + let : Finite (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + abstractReciprocity_intermediateQuotient_finite K M L hLM hMK + simp [abstractReciprocityNormProjection] + rfl + +/-- When the two base fields in norm--conjugation naturality coincide, its norm map is +the ordinary projection between the two actual finite norm quotients. -/ +theorem finiteReciprocityNaturalityNormMap_sameBase_eq_normProjection + (A : Rep ℤ G) (K M L : ClosedSubgroup G) + (hLM : L.toSubgroup ≤ M.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLM.trans hMK)).Normal] + [hMnormal : (extensionSubgroup K M hMK).Normal] + [hKLfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L (hLM.trans hMK))] : + letI : Finite (M.toSubgroup ⧸ extensionSubgroup M L hLM) := + abstractReciprocity_lowerExtension_finite K M L hLM hMK + letI : Finite (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + abstractReciprocity_intermediateQuotient_finite K M L hLM hMK + letI : Finite (K.toSubgroup ⧸ extensionSubgroup K K le_rfl) := + (FiniteGaloisSubextension.refl K).finite + finiteReciprocityNaturalityNormMap A K K M L hMK (hLM.trans hMK) le_rfl hLM = + abstractReciprocityNormProjection A K M L hLM hMK := by + let : Finite (M.toSubgroup ⧸ extensionSubgroup M L hLM) := + abstractReciprocity_lowerExtension_finite K M L hLM hMK + let : Finite (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + abstractReciprocity_intermediateQuotient_finite K M L hLM hMK + let : Finite (K.toSubgroup ⧸ extensionSubgroup K K le_rfl) := + (FiniteGaloisSubextension.refl K).finite + apply AddMonoidHom.ext + intro q + refine FiniteNormQuotient.induction_on A K L (hLM.trans hMK) q ?_ + intro a + have hmap := finiteReciprocityNaturalityNormMap_finiteNormClass + A K K M L hMK (hLM.trans hMK) le_rfl hLM a + have hnorm := congrArg (finiteNormClass A K M hMK) (relativeNorm_self A K a) + exact hmap.trans (hnorm.trans + (abstractReciprocityNormProjection_finiteNormClass A K M L hLM hMK a).symm) + +/-- The quotient projection in the lower row is surjective. -/ +theorem abstractReciprocityNormProjection_surjective + (A : Rep ℤ G) (K M L : ClosedSubgroup G) + (hLM : L.toSubgroup ≤ M.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLM.trans hMK)).Normal] + [hMnormal : (extensionSubgroup K M hMK).Normal] + [hKLfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L (hLM.trans hMK))] : + letI : Finite (M.toSubgroup ⧸ extensionSubgroup M L hLM) := + abstractReciprocity_lowerExtension_finite K M L hLM hMK + letI : Finite (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + abstractReciprocity_intermediateQuotient_finite K M L hLM hMK + Function.Surjective (abstractReciprocityNormProjection A K M L hLM hMK) := by + let : Finite (M.toSubgroup ⧸ extensionSubgroup M L hLM) := + abstractReciprocity_lowerExtension_finite K M L hLM hMK + let : Finite (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + abstractReciprocity_intermediateQuotient_finite K M L hLM hMK + intro q + refine FiniteNormQuotient.induction_on A K M hMK q ?_ + intro a + exact ⟨finiteNormClass A K L (hLM.trans hMK) a, by + rw [abstractReciprocityNormProjection_finiteNormClass]⟩ + +/-- The lower row is exact at `A_K/N_{L/K}A_L`. -/ +theorem abstractReciprocity_normQuotient_exact + (A : Rep ℤ G) (K M L : ClosedSubgroup G) + (hLM : L.toSubgroup ≤ M.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLM.trans hMK)).Normal] + [hMnormal : (extensionSubgroup K M hMK).Normal] + [hKLfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L (hLM.trans hMK))] : + letI : Finite (M.toSubgroup ⧸ extensionSubgroup M L hLM) := + abstractReciprocity_lowerExtension_finite K M L hLM hMK + letI : Finite (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + abstractReciprocity_intermediateQuotient_finite K M L hLM hMK + Function.Exact (abstractReciprocityNormMap A K M L hLM hMK) + (abstractReciprocityNormProjection A K M L hLM hMK) := by + let : Finite (M.toSubgroup ⧸ extensionSubgroup M L hLM) := + abstractReciprocity_lowerExtension_finite K M L hLM hMK + let : Finite (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + abstractReciprocity_intermediateQuotient_finite K M L hLM hMK + rw [AddMonoidHom.exact_iff] + ext q + refine FiniteNormQuotient.induction_on A K L (hLM.trans hMK) q ?_ + intro a + constructor + · intro ha + change abstractReciprocityNormProjection A K M L hLM hMK + (finiteNormClass A K L (hLM.trans hMK) a) = 0 at ha + rw [abstractReciprocityNormProjection_finiteNormClass] at ha + have haM : a ∈ finiteNormSubgroup A K M hMK := + (finiteNormClass_eq_zero_iff A K M hMK a).1 ha + obtain ⟨b, rfl⟩ := haM + exact ⟨finiteNormClass A M L hLM b, by + rw [abstractReciprocityNormMap_finiteNormClass]⟩ + · rintro ⟨q, hq⟩ + rw [← hq] + refine FiniteNormQuotient.induction_on A M L hLM q ?_ + intro b + change abstractReciprocityNormProjection A K M L hLM hMK + (abstractReciprocityNormMap A K M L hLM hMK + (finiteNormClass A M L hLM b)) = 0 + rw [abstractReciprocityNormMap_finiteNormClass, + abstractReciprocityNormProjection_finiteNormClass] + exact (finiteNormClass_eq_zero_iff A K M hMK _).2 ⟨b, rfl⟩ + +/-- An additive homomorphism from a (possibly noncommutative) Galois group +to an additive commutative group factors canonically through its +abelianization. This is the factor map used in the first reduction once the finite reciprocity + equivalence supplies the reciprocity homomorphism. -/ +def abstractReciprocityAbelianizationFactor + {Q : Type*} {B : Type*} [Group Q] [AddCommGroup B] + (f : Additive Q →+ B) : Additive (Abelianization Q) →+ B := by + let fMul : Q →* Multiplicative B := + { toFun := fun q => Multiplicative.ofAdd (f (Additive.ofMul q)) + map_one' := f.map_zero + map_mul' := f.map_add } + let fAb : Abelianization Q →* Multiplicative B := + Abelianization.lift fMul + exact + { toFun := fun q => Multiplicative.toAdd (fAb q.toMul) + map_zero' := fAb.map_one + map_add' := fAb.map_mul } + +/-- +Establishes the identity `abstractReciprocityAbelianizationFactor f (Additive.ofMul +(Abelianization.of q)) = f (Additive.ofMul q)`. +-/ +@[simp] +theorem abstractReciprocityAbelianizationFactor_of + {Q : Type*} {B : Type*} [Group Q] [AddCommGroup B] + (f : Additive Q →+ B) (q : Q) : + abstractReciprocityAbelianizationFactor f + (Additive.ofMul (Abelianization.of q)) = + f (Additive.ofMul q) := by + exact Abelianization.lift_apply_of + ({ toFun := fun q => Multiplicative.ofAdd (f (Additive.ofMul q)) + map_one' := f.map_zero + map_mul' := f.map_add } : Q →* Multiplicative B) q + +/-- Restriction also induces the canonical map on abelianizations. -/ +def abstractReciprocityAbelianizedRestriction + {G : Type*} [Group G] [TopologicalSpace G] + (K M L : ClosedSubgroup G) + (hLM : L.toSubgroup ≤ M.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLM.trans hMK)).Normal] + [hMnormal : (extensionSubgroup K M hMK).Normal] : + Abelianization + (K.toSubgroup ⧸ extensionSubgroup K L (hLM.trans hMK)) →* + Abelianization (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + Abelianization.map (abstractReciprocityRestriction K M L hLM hMK) + +/-- The identity `N_{M/K} ∘ i = [M:K]` used in the Sylow argument of the +first reduction. Here `i` is the actual inclusion of finite norm +quotients constructed in transfer--norm naturality. -/ +theorem abstractReciprocity_normMap_comp_normQuotientInclusion + (A : Rep ℤ G) (K M L : ClosedSubgroup G) + (hLM : L.toSubgroup ≤ M.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLM.trans hMK)).Normal] + [hMnormal : (extensionSubgroup K M hMK).Normal] + [hKLfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L (hLM.trans hMK))] + (q : FiniteNormQuotient A K L (hLM.trans hMK)) : + letI : (extensionSubgroup M L hLM).Normal := + transferNormNaturality_intermediateExtension_normal K M L hLM hMK + letI : Finite (M.toSubgroup ⧸ extensionSubgroup M L hLM) := + abstractReciprocity_lowerExtension_finite K M L hLM hMK + letI : Finite (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + abstractReciprocity_intermediateQuotient_finite K M L hLM hMK + abstractReciprocityNormMap A K M L hLM hMK + (transferNormNaturalityNormQuotientInclusion A K M L hLM hMK q) = + ((DegreeData.FiniteAbstractExtension.ofInclusion M K hMK).degree : ℕ) • q := by + let : (extensionSubgroup M L hLM).Normal := + transferNormNaturality_intermediateExtension_normal K M L hLM hMK + let : Finite (M.toSubgroup ⧸ extensionSubgroup M L hLM) := + abstractReciprocity_lowerExtension_finite K M L hLM hMK + let : Finite (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + abstractReciprocity_intermediateQuotient_finite K M L hLM hMK + refine FiniteNormQuotient.induction_on A K L (hLM.trans hMK) q ?_ + intro a + rw [transferNormNaturality_normQuotientInclusion_finiteNormClass, + abstractReciprocityNormMap_finiteNormClass] + have hnorm : + relativeNorm A K M hMK + (fixedFieldInclusion A K M hMK a) = + ((DegreeData.FiniteAbstractExtension.ofInclusion M K hMK).degree : + ℕ) • a := by + let E := DegreeData.FiniteAbstractExtension.ofInclusion M K hMK + change relativeNorm A E.base E.field E.below + (fixedFieldInclusion A E.base E.field E.below a) = + (E.degree : ℕ) • a + exact relativeNorm_fixedFieldInclusion A E a + rw [hnorm, finiteNormClass_nsmul] + +/-- In the cyclic case, the class-field axiom upgrades surjectivity of the actual +reciprocity-shaped homomorphism to bijectivity. The converse is formal; +the forward implication uses the equality of the two actual finite orders, +not an assumed cardinality certificate. -/ +theorem abstractReciprocity_cyclic_surjective_iff_bijective + (A : Rep ℤ G) (hcf : SatisfiesClassFieldAxiom A) + (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hKabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) K (le_baseField K))] + [hnormal : (extensionSubgroup K L hLK).Normal] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (g : K.toSubgroup ⧸ extensionSubgroup K L hLK) + (hg : ∀ q, q ∈ Subgroup.zpowers g) + (r : Additive (K.toSubgroup ⧸ extensionSubgroup K L hLK) →+ + FiniteNormQuotient A K L hLK) : + Function.Surjective r ↔ Function.Bijective r := by + let E : DegreeData.FiniteAbstractExtension G := + DegreeData.FiniteAbstractExtension.ofInclusion L K hLK + let hEbaseAbsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) E.base (le_baseField E.base)) := by + simpa [E, DegreeData.FiniteAbstractExtension.ofInclusion] using hKabsolute + let : Finite (FiniteNormQuotient A K L hLK) := + finiteNormQuotient_finite_of_classFieldAxiom + A hcf E hnormal g hg + constructor + · intro hr + apply (Nat.bijective_iff_surjective_and_card r).2 + exact ⟨hr, cyclicReciprocity_card_equality + A hcf E hnormal g hg⟩ + · exact fun hr => hr.2 + +/-- In a cyclic tower, the first norm map in the lower exact row is +injective. This is the order calculation in the third reduction: +the three norm quotients have orders `[L:M]`, `[L:K]`, and `[M:K]`, and +the tower law cancels the last factor. -/ +theorem abstractReciprocity_cyclicTower_normMap_injective + (A : Rep ℤ G) (hcf : SatisfiesClassFieldAxiom A) + (K M L : ClosedSubgroup G) + (hLM : L.toSubgroup ≤ M.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hKabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) K (le_baseField K))] + [hLnormal : + (extensionSubgroup K L (hLM.trans hMK)).Normal] + [hMnormal : (extensionSubgroup K M hMK).Normal] + [hKLfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L (hLM.trans hMK))] + (gKL : K.toSubgroup ⧸ + extensionSubgroup K L (hLM.trans hMK)) + (hgKL : ∀ q, q ∈ Subgroup.zpowers gKL) + (gML : + letI : (extensionSubgroup M L hLM).Normal := + transferNormNaturality_intermediateExtension_normal K M L hLM hMK + M.toSubgroup ⧸ extensionSubgroup M L hLM) + (hgML : + letI : (extensionSubgroup M L hLM).Normal := + transferNormNaturality_intermediateExtension_normal K M L hLM hMK + ∀ q, q ∈ Subgroup.zpowers gML) + (gKM : K.toSubgroup ⧸ extensionSubgroup K M hMK) + (hgKM : ∀ q, q ∈ Subgroup.zpowers gKM) : + letI : Finite (M.toSubgroup ⧸ extensionSubgroup M L hLM) := + abstractReciprocity_lowerExtension_finite K M L hLM hMK + letI : Finite (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + abstractReciprocity_intermediateQuotient_finite K M L hLM hMK + Function.Injective (abstractReciprocityNormMap A K M L hLM hMK) := by + let hMLnormal : (extensionSubgroup M L hLM).Normal := + transferNormNaturality_intermediateExtension_normal K M L hLM hMK + let hMLfinite : Finite + (M.toSubgroup ⧸ extensionSubgroup M L hLM) := + abstractReciprocity_lowerExtension_finite K M L hLM hMK + let hKMfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + abstractReciprocity_intermediateQuotient_finite K M L hLM hMK + let hMabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) M (le_baseField M)) := + relativeTowerQuotientFinite (baseField G) K M hMK (le_baseField K) + let ELM : DegreeData.FiniteAbstractExtension G := + DegreeData.FiniteAbstractExtension.ofInclusion L M hLM + let EMK : DegreeData.FiniteAbstractExtension G := + DegreeData.FiniteAbstractExtension.ofInclusion M K hMK + let ELK : DegreeData.FiniteAbstractExtension G := + DegreeData.FiniteAbstractExtension.ofInclusion L K (hLM.trans hMK) + let hELMbaseAbsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) ELM.base (le_baseField ELM.base)) := by + simpa [ELM, DegreeData.FiniteAbstractExtension.ofInclusion] using hMabsolute + let hEMKbaseAbsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) EMK.base (le_baseField EMK.base)) := by + simpa [EMK, DegreeData.FiniteAbstractExtension.ofInclusion] using hKabsolute + let hELKbaseAbsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) ELK.base (le_baseField ELK.base)) := by + simpa [ELK, DegreeData.FiniteAbstractExtension.ofInclusion] using hKabsolute + let f := abstractReciprocityNormMap A K M L hLM hMK + let p := abstractReciprocityNormProjection A K M L hLM hMK + let : Finite (FiniteNormQuotient A M L hLM) := + finiteNormQuotient_finite_of_classFieldAxiom + A hcf ELM hMLnormal gML hgML + let : Finite (FiniteNormQuotient A K L (hLM.trans hMK)) := + finiteNormQuotient_finite_of_classFieldAxiom + A hcf ELK hLnormal gKL hgKL + let : Finite (FiniteNormQuotient A K M hMK) := + finiteNormQuotient_finite_of_classFieldAxiom + A hcf EMK hMnormal gKM hgKM + have hexact : p.ker = f.range := + (AddMonoidHom.exact_iff).1 + (abstractReciprocity_normQuotient_exact A K M L hLM hMK) + have hpsurjective : Function.Surjective p := + abstractReciprocityNormProjection_surjective A K M L hLM hMK + have hmiddle : + Nat.card (FiniteNormQuotient A K L (hLM.trans hMK)) = + Nat.card f.range * + Nat.card (FiniteNormQuotient A K M hMK) := by + calc + Nat.card (FiniteNormQuotient A K L (hLM.trans hMK)) = + Nat.card p.ker * p.ker.index := + (AddSubgroup.card_mul_index p.ker).symm + _ = Nat.card f.range * Nat.card p.range := by + rw [AddSubgroup.index_ker, hexact] + _ = Nat.card f.range * + Nat.card (FiniteNormQuotient A K M hMK) := by + have hpRange : p.range = ⊤ := + (AddMonoidHom.range_eq_top).2 hpsurjective + rw [hpRange] + simp + have hdegree : + (ELM.degree : ℕ) * (EMK.degree : ℕ) = (ELK.degree : ℕ) := by + rw [← ELM.relIndex_eq_degree, ← EMK.relIndex_eq_degree, + ← ELK.relIndex_eq_degree] + exact Subgroup.relIndex_mul_relIndex L.toSubgroup M.toSubgroup + K.toSubgroup hLM hMK + have hKMpositive : 0 < (EMK.degree : ℕ) := EMK.degree.property + have hcardML : + Nat.card (FiniteNormQuotient A M L hLM) = + (ELM.degree : ℕ) := by + simpa [ELM, DegreeData.FiniteAbstractExtension.ofInclusion] using + finiteNormQuotient_card_of_classFieldAxiom + A hcf ELM hMLnormal gML hgML + have hcardKL : + Nat.card (FiniteNormQuotient A K L (hLM.trans hMK)) = + (ELK.degree : ℕ) := by + simpa [ELK, DegreeData.FiniteAbstractExtension.ofInclusion] using + finiteNormQuotient_card_of_classFieldAxiom + A hcf ELK hLnormal gKL hgKL + have hcardKM : + Nat.card (FiniteNormQuotient A K M hMK) = + (EMK.degree : ℕ) := by + simpa [EMK, DegreeData.FiniteAbstractExtension.ofInclusion] using + finiteNormQuotient_card_of_classFieldAxiom + A hcf EMK hMnormal gKM hgKM + have hcardRange : + Nat.card (FiniteNormQuotient A M L hLM) = + Nat.card f.range := by + apply Nat.mul_right_cancel hKMpositive + calc + Nat.card (FiniteNormQuotient A M L hLM) * + (EMK.degree : ℕ) = + (ELM.degree : ℕ) * (EMK.degree : ℕ) := by + rw [hcardML] + _ = (ELK.degree : ℕ) := hdegree + _ = Nat.card (FiniteNormQuotient A K L (hLM.trans hMK)) := by + rw [hcardKL] + _ = Nat.card f.range * + Nat.card (FiniteNormQuotient A K M hMK) := hmiddle + _ = Nat.card f.range * (EMK.degree : ℕ) := by + rw [hcardKM] + have hRangeBijective : Function.Bijective f.rangeRestrict := + (Nat.bijective_iff_surjective_and_card f.rangeRestrict).2 + ⟨AddMonoidHom.rangeRestrict_surjective f, hcardRange⟩ + intro x y hxy + apply hRangeBijective.1 + exact Subtype.ext hxy + +/-- An elementary profinite-integer step: +if `n z = k` in `ℤ̂`, with `0 ≤ k < n`, then `k = 0`. -/ +theorem abstractReciprocity_zHat_nsmul_eq_natCast_forces_zero + (n k : ℕ) (hn : 0 < n) (hk : k < n) (z : ZHat) + (h : n • z = + Int.castRingHom ZHat (k : ℤ)) : + k = 0 := by + have hkmod : (k : ZMod n) = 0 := by + have hkmodInt : ((k : ℤ) : ZMod n) = 0 := by + calc + ((k : ℤ) : ZMod n) = zHatReduction n hn + (Int.castRingHom ZHat (k : ℤ)) := + (zHatReduction_int n hn (k : ℤ)).symm + _ = + zHatReduction n hn (n • z) := congrArg (zHatReduction n hn) h.symm + _ = n • zHatReduction n hn z := map_nsmul (zHatReduction n hn) n z + _ = 0 := by simp + simpa using hkmodInt + exact Nat.eq_zero_of_dvd_of_lt + ((ZMod.natCast_eq_zero_iff k n).1 hkmod) hk + +/-- In a finite totally ramified extension, the normalized valuation of an +element from the lower field is multiplied by the extension degree after +inclusion into the upper field. This is the valuation identity used for +`M/M⁰`. -/ +theorem abstractReciprocity_valuationAt_fixedFieldInclusion_of_totallyRamified + {D : DegreeData G} {A : Rep ℤ G} (v : ValuationData D A) + (E : FiniteAbstractFieldExtension G) + (hTot : E.IsTotallyRamified D) + (x : ambientFixedAddSubgroup A E.base.field) : + ((v.valuationAt E.field + (fixedFieldInclusion A E.base.field E.field.field E.below x) : + v.valueGroup) : ZHat) = + (E.degree : ℕ) • + ((v.valuationAt E.base x : v.valueGroup) : ZHat) := by + let EF := E.toFiniteAbstractExtension + let hEFfinite : Finite + (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) := + EF.finiteQuotient + have htower := v.normalizedValuation_tower E + (fixedFieldInclusion A E.base.field E.field.field E.below x) + have hresidue : (E.residueDegree D : ℕ) = 1 := + EF.residueDegree_eq_one_of_isTotallyRamified D hTot + change (E.residueDegree D : ℕ) • + ((v.valuationAt E.field + (fixedFieldInclusion A E.base.field E.field.field E.below x) : + v.valueGroup) : ZHat) = + ((v.valuationAt E.base + (relativeNorm A E.base.field E.field.field E.below + (fixedFieldInclusion A E.base.field E.field.field E.below x)) : + v.valueGroup) : ZHat) at htower + rw [hresidue, one_nsmul] at htower + have hbelow : E.below = EF.below := Subsingleton.elim _ _ + rw [hbelow] at htower + change + ((v.valuationAt E.field + (fixedFieldInclusion A EF.base EF.field EF.below x) : + v.valueGroup) : ZHat) = + ((v.valuationAt E.base + (relativeNorm A EF.base EF.field EF.below + (fixedFieldInclusion A EF.base EF.field EF.below x)) : + v.valueGroup) : ZHat) at htower + rw [relativeNorm_fixedFieldInclusion A EF x] at htower + have hfixedFieldInclusion : + fixedFieldInclusion A EF.base EF.field EF.below x = + fixedFieldInclusion A E.base.field E.field.field E.below x := by + apply Subtype.ext + rfl + rw [hfixedFieldInclusion] at htower + have htower' : + ((v.valuationAt E.field + (fixedFieldInclusion A E.base.field E.field.field E.below x) : + v.valueGroup) : ZHat) = + ((v.valuationAt E.base ((E.degree : ℕ) • x) : + v.valueGroup) : ZHat) := by + simpa [EF, FiniteAbstractFieldExtension.degree] using htower + calc + ((v.valuationAt E.field + (fixedFieldInclusion A E.base.field E.field.field E.below x) : + v.valueGroup) : ZHat) = + ((v.valuationAt E.base ((E.degree : ℕ) • x) : + v.valueGroup) : ZHat) := htower' + _ = (E.degree : ℕ) • + ((v.valuationAt E.base x : v.valueGroup) : ZHat) := + congrArg Subtype.val + (map_nsmul (v.valuationAt E.base) (E.degree : ℕ) x) + +/-- The exact `k = 0` valuation endpoint of the totally ramified argument. Here `K = M⁰`, `L = +M`, and `x` is the element constructed in +the fixed subgroup. -/ +theorem abstractReciprocity_totallyRamified_valuation_forces_exponent_zero + {D : DegreeData G} {A : Rep ℤ G} (v : ValuationData D A) + (E : FiniteAbstractFieldExtension G) + (hTot : E.IsTotallyRamified D) + (k : ℕ) (hk : k < (E.degree : ℕ)) + (x : ambientFixedAddSubgroup A E.base.field) + (hx : + ((v.valuationAt E.field + (fixedFieldInclusion A E.base.field E.field.field E.below x) : + v.valueGroup) : ZHat) = + Int.castRingHom ZHat (k : ℤ)) : + k = 0 := by + have hn : 0 < (E.degree : ℕ) := E.degree.property + apply abstractReciprocity_zHat_nsmul_eq_natCast_forces_zero + (E.degree : ℕ) k hn hk + (((v.valuationAt E.base x : v.valueGroup) : ZHat)) + rw [← abstractReciprocity_valuationAt_fixedFieldInclusion_of_totallyRamified + v E hTot] + exact hx + +end +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/CyclicNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/CyclicNormQuotient.lean new file mode 100644 index 0000000000..0cf2ca62bd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/CyclicNormQuotient.lean @@ -0,0 +1,610 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FieldRepresentation + +/-! # Cyclic Norm Quotient -/ + +@[expose] public section +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +/-! +# Cyclic norm quotients as degree-zero Tate cohomology + +For a finite cyclic abstract extension `L / K`, this file identifies the +actual quotient `A_K / N_{L/K} A_L` with the degree-zero Tate homology +object used in the class-field axiom. This is the source comparison needed before the +cardinality assertion of the class field axiom can be applied to the +reciprocity map. +-/ + +noncomputable +section + +open CategoryTheory + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +/-- The actual fixed group `A_K` is the kernel of `ρ(g)-1` on `A_L` +when `g` generates `G(L/K)`. -/ +def cyclicFixedCycleEquiv + (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)) + (g : K.toSubgroup ⧸ extensionSubgroup K L hLK) + (hg : ∀ x, x ∈ Subgroup.zpowers g) : + letI := hnormal + letI := hfinite + letI := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + letI : IsCyclic + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + isCyclic_of_generator g hg + letI : CommGroup + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + IsCyclic.commGroup + let M := extensionFixedRepresentation A K L hLK hnormal + let T := Rep.FiniteCyclicGroup.normHomCompSub M g + ambientFixedAddSubgroup A K ≃+ + T.moduleCatLeftHomologyData.K := by + dsimp only + letI := hnormal + letI := hfinite + letI := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + letI : IsCyclic (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + isCyclic_of_generator g hg + letI : CommGroup (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + IsCyclic.commGroup + let M := extensionFixedRepresentation A K L hLK hnormal + let T := Rep.FiniteCyclicGroup.normHomCompSub M g + let toCycle : ambientFixedAddSubgroup A K → + T.moduleCatLeftHomologyData.K := fun a => by + let aL := fixedFieldInclusion A K L hLK a + let aM : M.V := + (extensionFixedRepresentationEquiv A K L hLK hnormal).symm aL + refine ⟨aM, sub_eq_zero.mpr ?_⟩ + refine Quotient.inductionOn' g ?_ + intro k + apply Subtype.ext + change A.ρ k.1 a.1 = a.1 + exact a.2 k + let fromCycle : T.moduleCatLeftHomologyData.K → + ambientFixedAddSubgroup A K := fun x => by + let aM : M.V := x.1 + let aL : ambientFixedAddSubgroup A L := + extensionFixedRepresentationEquiv A K L hLK hnormal aM + have hxzero : T.g.hom aM = 0 := x.2 + have hxg : M.ρ g aM = aM := by + apply sub_eq_zero.mp + exact hxzero + have hxall : ∀ q, M.ρ q aM = aM := by + let : Module ℤ M := M.hV2 + exact (Representation.mem_invariants_iff_of_forall_mem_zpowers + M.ρ g hg aM).2 hxg + refine ⟨aL.1, ?_⟩ + intro k + have hk := hxall + ((QuotientGroup.mk' (extensionSubgroup K L hLK)) k) + have haction := extensionFixedRepresentation_action_coe + A K L hLK hnormal + ((QuotientGroup.mk' (extensionSubgroup K L hLK)) k) aM + have haction' : + (M.ρ ((QuotientGroup.mk' + (extensionSubgroup K L hLK)) k) aM).1 = + A.ρ k.1 aL.1 := by + calc + _ = relativeCosetAction A K L hLK aL + ((QuotientGroup.mk' + (extensionSubgroup K L hLK)) k) := haction + _ = A.ρ k.1 aL.1 := + relativeCosetAction_mk A K L hLK aL k + exact haction'.symm.trans ((congrArg Subtype.val hk).trans rfl) + exact + { toFun := toCycle + invFun := fromCycle + left_inv := by + intro a + apply Subtype.ext + rfl + right_inv := by + intro x + apply Subtype.ext + rfl + map_add' := by + intro a b + apply Subtype.ext + apply Subtype.ext + rfl } + +/-- The canonical map from `A_K` to the concrete kernel/range quotient +computing degree-zero Tate cohomology. -/ +def cyclicNormClassHom + (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)) + (g : K.toSubgroup ⧸ extensionSubgroup K L hLK) + (hg : ∀ x, x ∈ Subgroup.zpowers g) : + letI := hnormal + letI := hfinite + letI := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + letI : IsCyclic + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + isCyclic_of_generator g hg + letI : CommGroup + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + IsCyclic.commGroup + let M := extensionFixedRepresentation A K L hLK hnormal + let T := Rep.FiniteCyclicGroup.normHomCompSub M g + ambientFixedAddSubgroup A K →+ + T.moduleCatLeftHomologyData.H := by + dsimp only + letI := hnormal + letI := hfinite + letI := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + letI : IsCyclic (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + isCyclic_of_generator g hg + letI : CommGroup (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + IsCyclic.commGroup + let M := extensionFixedRepresentation A K L hLK hnormal + let T := Rep.FiniteCyclicGroup.normHomCompSub M g + let e := cyclicFixedCycleEquiv A K L hLK hnormal hfinite g hg + exact + { toFun := fun a => T.moduleCatLeftHomologyData.π (e a) + map_zero' := by simp + map_add' := by + intro a b + simp } + +/-- +The cyclic norm-class map evaluates by applying the fixed-cycle equivalence and projecting to +cyclic homology. +-/ +@[simp] +theorem cyclicNormClassHom_apply + (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)) + (g : K.toSubgroup ⧸ extensionSubgroup K L hLK) + (hg : ∀ x, x ∈ Subgroup.zpowers g) + (a : ambientFixedAddSubgroup A K) : + letI := hnormal + letI := hfinite + letI := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + letI : IsCyclic + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + isCyclic_of_generator g hg + letI : CommGroup + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + IsCyclic.commGroup + let M := extensionFixedRepresentation A K L hLK hnormal + let T := Rep.FiniteCyclicGroup.normHomCompSub M g + cyclicNormClassHom A K L hLK hnormal hfinite g hg a = + T.moduleCatLeftHomologyData.π + (cyclicFixedCycleEquiv A K L hLK hnormal hfinite g hg a) := by + rfl + +/-- Under the fixed-cycle equivalence, the actual relative norm is the +first differential in the cyclic Tate complex. -/ +theorem cyclicFixedCycleEquiv_relativeNorm + (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)) + (g : K.toSubgroup ⧸ extensionSubgroup K L hLK) + (hg : ∀ x, x ∈ Subgroup.zpowers g) + (a : ambientFixedAddSubgroup A L) : + letI := hnormal + letI := hfinite + letI := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + letI : IsCyclic + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + isCyclic_of_generator g hg + letI : CommGroup + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + IsCyclic.commGroup + let M := extensionFixedRepresentation A K L hLK hnormal + let T := Rep.FiniteCyclicGroup.normHomCompSub M g + cyclicFixedCycleEquiv A K L hLK hnormal hfinite g hg + (relativeNorm A K L hLK a) = + T.moduleCatToCycles + ((extensionFixedRepresentationEquiv A K L hLK hnormal).symm a) := by + dsimp only + let := hnormal + let := hfinite + let := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + let : IsCyclic (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + isCyclic_of_generator g hg + let : CommGroup (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + IsCyclic.commGroup + let M := extensionFixedRepresentation A K L hLK hnormal + let T := Rep.FiniteCyclicGroup.normHomCompSub M g + apply Subtype.ext + apply Subtype.ext + exact (extensionFixedRepresentation_norm_coe + A K L hLK hnormal + ((extensionFixedRepresentationEquiv A K L hLK hnormal).symm a)).symm + +/-- The kernel of the concrete Tate-class map is exactly the actual norm +subgroup `N_{L/K} A_L`. -/ +theorem cyclicNormClassHom_ker + (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)) + (g : K.toSubgroup ⧸ extensionSubgroup K L hLK) + (hg : ∀ x, x ∈ Subgroup.zpowers g) : + letI := hnormal + letI := hfinite + letI := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + letI : IsCyclic + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + isCyclic_of_generator g hg + letI : CommGroup + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + IsCyclic.commGroup + (cyclicNormClassHom A K L hLK hnormal hfinite g hg).ker = + finiteNormSubgroup A K L hLK := by + let := hnormal + let := hfinite + let := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + let : IsCyclic (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + isCyclic_of_generator g hg + let : CommGroup (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + IsCyclic.commGroup + let M := extensionFixedRepresentation A K L hLK hnormal + let T := Rep.FiniteCyclicGroup.normHomCompSub M g + let : Module ℤ T.X₁ := T.X₁.isModule + let : Module ℤ (LinearMap.ker T.g.hom) := + (LinearMap.ker T.g.hom).module + let e := cyclicFixedCycleEquiv A K L hLK hnormal hfinite g hg + ext a + constructor + · intro ha + change cyclicNormClassHom A K L hLK hnormal hfinite g hg a = 0 at ha + rw [cyclicNormClassHom_apply] at ha + let ea : T.moduleCatLeftHomologyData.K := e a + have ha' : + Submodule.mkQ (LinearMap.range T.moduleCatToCycles) ea = 0 := by + exact ha + have harange : ea ∈ LinearMap.range T.moduleCatToCycles := + (Submodule.Quotient.mk_eq_zero _).1 ha' + obtain ⟨y, hy⟩ := harange + change a ∈ (relativeNorm A K L hLK).range + let b : ambientFixedAddSubgroup A L := + extensionFixedRepresentationEquiv A K L hLK hnormal y + refine ⟨b, ?_⟩ + apply Subtype.ext + calc + (relativeNorm A K L hLK b).1 = (M.norm.hom y).1 := + (extensionFixedRepresentation_norm_coe + A K L hLK hnormal y).symm + _ = ea.1.1 := + congrArg Subtype.val (congrArg Subtype.val hy) + _ = a.1 := rfl + · intro ha + change a ∈ (relativeNorm A K L hLK).range at ha + obtain ⟨b, rfl⟩ := ha + change cyclicNormClassHom A K L hLK hnormal hfinite g hg + (relativeNorm A K L hLK b) = 0 + rw [cyclicNormClassHom_apply] + let eb : T.moduleCatLeftHomologyData.K := + e (relativeNorm A K L hLK b) + change Submodule.mkQ (LinearMap.range T.moduleCatToCycles) + eb = 0 + apply (Submodule.Quotient.mk_eq_zero _).2 + refine ⟨(extensionFixedRepresentationEquiv + A K L hLK hnormal).symm b, ?_⟩ + exact (cyclicFixedCycleEquiv_relativeNorm + A K L hLK hnormal hfinite g hg b).symm + +/-- Every concrete Tate class has a representative in the actual fixed +group `A_K`. -/ +theorem cyclicNormClassHom_surjective + (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)) + (g : K.toSubgroup ⧸ extensionSubgroup K L hLK) + (hg : ∀ x, x ∈ Subgroup.zpowers g) : + letI := hnormal + letI := hfinite + letI := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + letI : IsCyclic + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + isCyclic_of_generator g hg + letI : CommGroup + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + IsCyclic.commGroup + Function.Surjective + (cyclicNormClassHom A K L hLK hnormal hfinite g hg) := by + let := hnormal + let := hfinite + let := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + let : IsCyclic (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + isCyclic_of_generator g hg + let : CommGroup (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + IsCyclic.commGroup + let M := extensionFixedRepresentation A K L hLK hnormal + let T := Rep.FiniteCyclicGroup.normHomCompSub M g + let e := cyclicFixedCycleEquiv A K L hLK hnormal hfinite g hg + have hπ : Function.Surjective T.moduleCatLeftHomologyData.π := + (ModuleCat.epi_iff_surjective + T.moduleCatLeftHomologyData.π).1 inferInstance + intro z + obtain ⟨x, hx⟩ := hπ z + refine ⟨e.symm x, ?_⟩ + rw [cyclicNormClassHom_apply, e.apply_symm_apply] + exact hx + +/-- The actual finite norm quotient is the concrete kernel/range quotient +which computes degree-zero Tate cohomology. -/ +def cyclicFiniteNormQuotientEquivConcrete + (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)) + (g : K.toSubgroup ⧸ extensionSubgroup K L hLK) + (hg : ∀ x, x ∈ Subgroup.zpowers g) : + letI := hnormal + letI := hfinite + letI := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + letI : IsCyclic + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + isCyclic_of_generator g hg + letI : CommGroup + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + IsCyclic.commGroup + let M := extensionFixedRepresentation A K L hLK hnormal + let T := Rep.FiniteCyclicGroup.normHomCompSub M g + FiniteNormQuotient A K L hLK ≃+ + T.moduleCatLeftHomologyData.H := by + dsimp only + letI := hnormal + letI := hfinite + letI := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + letI : IsCyclic (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + isCyclic_of_generator g hg + letI : CommGroup (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + IsCyclic.commGroup + let f := cyclicNormClassHom A K L hLK hnormal hfinite g hg + exact + (finiteNormQuotientConcreteEquiv A K L hLK).trans + ((QuotientAddGroup.quotientAddEquivOfEq + (cyclicNormClassHom_ker A K L hLK hnormal hfinite g hg).symm).trans + (QuotientAddGroup.quotientKerEquivOfSurjective f + (cyclicNormClassHom_surjective + A K L hLK hnormal hfinite g hg))) + +/-- The concrete kernel/range quotient is the homology object used in the +definition of `tateHZero`. -/ +def cyclicConcreteEquivTateHZero + (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)) + (g : K.toSubgroup ⧸ extensionSubgroup K L hLK) + (hg : ∀ x, x ∈ Subgroup.zpowers g) : + letI := hnormal + letI := hfinite + letI := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + letI : IsCyclic + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + isCyclic_of_generator g hg + letI : CommGroup + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + IsCyclic.commGroup + let M := extensionFixedRepresentation A K L hLK hnormal + let T := Rep.FiniteCyclicGroup.normHomCompSub M g + T.moduleCatLeftHomologyData.H ≃+ tateCohomology M 0 := by + dsimp only + letI := hnormal + letI := hfinite + letI := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + letI : IsCyclic (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + isCyclic_of_generator g hg + letI : CommGroup (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + IsCyclic.commGroup + let M := extensionFixedRepresentation A K L hLK hnormal + let T := Rep.FiniteCyclicGroup.normHomCompSub M g + exact + (T.moduleCatHomologyIso.symm ≪≫ + (TateCohomology.isoFiniteCyclicZero M g hg).symm).toLinearEquiv.toAddEquiv + +/-- Canonical identification of the actual norm quotient with +degree-zero Tate cohomology for a finite cyclic extension. -/ +def cyclicFiniteNormQuotientEquivTateHZero + (A : Rep ℤ G) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)) + (g : K.toSubgroup ⧸ extensionSubgroup K L hLK) + (hg : ∀ x, x ∈ Subgroup.zpowers g) : + letI := hnormal + letI := hfinite + letI := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + let M := extensionFixedRepresentation A K L hLK hnormal + FiniteNormQuotient A K L hLK ≃+ tateCohomology M 0 := by + dsimp only + letI := hnormal + letI := hfinite + letI := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + exact + (cyclicFiniteNormQuotientEquivConcrete + A K L hLK hnormal hfinite g hg).trans + (cyclicConcreteEquivTateHZero + A K L hLK hnormal hfinite g hg) + +/-- The class-field axiom first gives genuine finiteness of the actual norm +quotient, transported from finite degree-zero Tate cohomology. -/ +theorem finiteNormQuotientFiniteOfClassFieldAxiom + (A : Rep ℤ G) (hcf : SatisfiesClassFieldAxiom A) + (E : DegreeData.FiniteAbstractExtension G) + [hKfinite : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) E.base (le_baseField E.base))] + (hnormal : (extensionSubgroup E.base E.field E.below).Normal) + (g : E.base.toSubgroup ⧸ + extensionSubgroup E.base E.field E.below) + (hg : ∀ x, x ∈ Subgroup.zpowers g) : + Finite (FiniteNormQuotient A E.base E.field E.below) := by + let := hnormal + let := E.finiteQuotient + let := Fintype.ofFinite + (E.base.toSubgroup ⧸ extensionSubgroup E.base E.field E.below) + let M := extensionFixedRepresentation A E.base E.field E.below hnormal + let Kcf : FiniteAbstractField G := ⟨E.base, hKfinite⟩ + let Ecf : FiniteCyclicSubextension Kcf := + { field := E.field + below := E.below + normal := hnormal + finite := E.finiteQuotient + generator := g + generates := hg } + let : Finite (tateCohomology (Ecf.fixedRepresentation A) 0) := + (hcf Kcf Ecf).finiteTateHZero + exact Finite.of_equiv (tateCohomology (Ecf.fixedRepresentation A) 0) (by + simpa [Kcf, Ecf, FiniteCyclicSubextension.fixedRepresentation] using + (cyclicFiniteNormQuotientEquivTateHZero + A E.base E.field E.below hnormal E.finiteQuotient g hg).symm.toEquiv) + +/-- The class-field axiom gives the exact order of the actual norm quotient in the +cyclic case. -/ +theorem finiteNormQuotient_card_of_classFieldAxiom + (A : Rep ℤ G) (hcf : SatisfiesClassFieldAxiom A) + (E : DegreeData.FiniteAbstractExtension G) + [hKfinite : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) E.base (le_baseField E.base))] + (hnormal : (extensionSubgroup E.base E.field E.below).Normal) + (g : E.base.toSubgroup ⧸ + extensionSubgroup E.base E.field E.below) + (hg : ∀ x, x ∈ Subgroup.zpowers g) : + Nat.card (FiniteNormQuotient A E.base E.field E.below) = + (E.degree : ℕ) := by + let := hnormal + let := E.finiteQuotient + let := Fintype.ofFinite + (E.base.toSubgroup ⧸ extensionSubgroup E.base E.field E.below) + let M := extensionFixedRepresentation A E.base E.field E.below hnormal + let Kcf : FiniteAbstractField G := ⟨E.base, hKfinite⟩ + let Ecf : FiniteCyclicSubextension Kcf := + { field := E.field + below := E.below + normal := hnormal + finite := E.finiteQuotient + generator := g + generates := hg } + let : Finite (tateCohomology (Ecf.fixedRepresentation A) 0) := + (hcf Kcf Ecf).finiteTateHZero + let : Finite (tateCohomology M 0) := by + simpa [M, Kcf, Ecf, + FiniteCyclicSubextension.fixedRepresentation] using + (inferInstance : + Finite (tateCohomology (Ecf.fixedRepresentation A) 0)) + let : Finite (FiniteNormQuotient A E.base E.field E.below) := + finiteNormQuotientFiniteOfClassFieldAxiom A hcf E hnormal g hg + calc + Nat.card (FiniteNormQuotient A E.base E.field E.below) = + Nat.card (tateCohomology M 0) := + Nat.card_congr + (cyclicFiniteNormQuotientEquivTateHZero + A E.base E.field E.below hnormal E.finiteQuotient g hg).toEquiv + _ = (E.degree : ℕ) := + by + simpa [Kcf, Ecf, + FiniteCyclicSubextension.fixedRepresentation, + FiniteCyclicSubextension.toFiniteAbstractExtension] using + hcf.tateHZero_card Kcf Ecf + +/-- The additive Galois quotient has the extension degree as its order. -/ +theorem additiveExtensionQuotient_card + (E : DegreeData.FiniteAbstractExtension G) : + Nat.card + (Additive + (E.base.toSubgroup ⧸ + extensionSubgroup E.base E.field E.below)) = + (E.degree : ℕ) := by + calc + Nat.card + (Additive + (E.base.toSubgroup ⧸ + extensionSubgroup E.base E.field E.below)) = + Nat.card + (E.base.toSubgroup ⧸ + extensionSubgroup E.base E.field E.below) := + (Nat.card_congr + (Additive.ofMul : + (E.base.toSubgroup ⧸ + extensionSubgroup E.base E.field E.below) ≃ + Additive + (E.base.toSubgroup ⧸ + extensionSubgroup E.base E.field E.below))).symm + _ = (extensionSubgroup E.base E.field E.below).index := + (Subgroup.index_eq_card + (extensionSubgroup E.base E.field E.below)).symm + _ = (E.degree : ℕ) := E.extensionSubgroup_index_eq_degree + +/-- Under the class-field axiom, the cyclic Galois quotient and its actual norm +quotient have the same finite order. -/ +theorem cyclicReciprocity_card_equality + (A : Rep ℤ G) (hcf : SatisfiesClassFieldAxiom A) + (E : DegreeData.FiniteAbstractExtension G) + [Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) E.base (le_baseField E.base))] + (hnormal : (extensionSubgroup E.base E.field E.below).Normal) + (g : E.base.toSubgroup ⧸ + extensionSubgroup E.base E.field E.below) + (hg : ∀ x, x ∈ Subgroup.zpowers g) : + Nat.card + (Additive + (E.base.toSubgroup ⧸ + extensionSubgroup E.base E.field E.below)) = + Nat.card (FiniteNormQuotient A E.base E.field E.below) := by + rw [additiveExtensionQuotient_card E, + finiteNormQuotient_card_of_classFieldAxiom + A hcf E hnormal g hg] + +/-- The cyclic norm quotient is finite as an actual type under the class-field axiom. -/ +theorem finiteNormQuotient_finite_of_classFieldAxiom + (A : Rep ℤ G) (hcf : SatisfiesClassFieldAxiom A) + (E : DegreeData.FiniteAbstractExtension G) + [Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) E.base (le_baseField E.base))] + (hnormal : (extensionSubgroup E.base E.field E.below).Normal) + (g : E.base.toSubgroup ⧸ + extensionSubgroup E.base E.field E.below) + (hg : ∀ x, x ∈ Subgroup.zpowers g) : + Finite (FiniteNormQuotient A E.base E.field E.below) := + finiteNormQuotientFiniteOfClassFieldAxiom A hcf E hnormal g hg + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FieldRepresentation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FieldRepresentation.lean new file mode 100644 index 0000000000..60df6df8a6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FieldRepresentation.lean @@ -0,0 +1,146 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormLaws +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +/-! # Field Representation -/ + +@[expose] public section +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +/-! +# Actual coefficient representation for an abstract extension + +This file identifies the invariant carrier used by +`extensionFixedRepresentation A K L` with the actual fixed group +`A_L`, and compares the representation norm with `N_{L/K}`. +-/ + +noncomputable +section + +open scoped BigOperators + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +/-- The invariant carrier in the descended quotient representation is the +actual fixed group `A_L`. -/ +def extensionFixedRepresentationEquiv + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) : + (extensionFixedRepresentation A K L hLK hnormal).V ≃+ + ambientFixedAddSubgroup A L where + toFun x := ⟨x.1, by + intro l + exact x.2 ⟨⟨l.1, hLK l.2⟩, l.2⟩⟩ + invFun a := ⟨a.1, by + intro s + let l : L.toSubgroup := ⟨s.1.1, s.2⟩ + change A.ρ s.1.1 a.1 = a.1 + exact a.2 l⟩ + left_inv x := by + apply Subtype.ext + rfl + right_inv a := by + apply Subtype.ext + rfl + map_add' _ _ := by + apply Subtype.ext + rfl + +/-- +Establishes the identity `((extensionFixedRepresentationEquiv A K L hLK hnormal a : +ambientFixedAddSubgroup A L) : A.V) = a.1`. +-/ +@[simp] +theorem extensionFixedRepresentationEquiv_apply_coe + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (a : (extensionFixedRepresentation A K L hLK hnormal).V) : + ((extensionFixedRepresentationEquiv A K L hLK hnormal a : + ambientFixedAddSubgroup A L) : A.V) = a.1 := + rfl + +/-- +Establishes the identity `((extensionFixedRepresentationEquiv A K L hLK hnormal).symm a).1 = a.1`. +-/ +@[simp] +theorem extensionFixedRepresentationEquiv_symm_apply_coe + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (a : ambientFixedAddSubgroup A L) : + ((extensionFixedRepresentationEquiv A K L hLK hnormal).symm a).1 = a.1 := + rfl + +/-- The quotient action on `A_L` is the same coset action used by the +relative norm. -/ +theorem extensionFixedRepresentation_action_coe + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (q : K.toSubgroup ⧸ extensionSubgroup K L hLK) + (a : (extensionFixedRepresentation A K L hLK hnormal).V) : + ((extensionFixedRepresentation A K L hLK hnormal).ρ q a).1 = + relativeCosetAction A K L hLK + (extensionFixedRepresentationEquiv A K L hLK hnormal a) q := by + let := hnormal + refine Quotient.inductionOn' q ?_ + intro k + rw [relativeCosetAction_mk] + rfl + +/-- The norm in the descended representation is the actual relative norm +on the underlying fixed coefficient. -/ +theorem extensionFixedRepresentation_norm_coe + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a : (extensionFixedRepresentation A K L hLK hnormal).V) : + letI := hnormal + letI := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + ((extensionFixedRepresentation A K L hLK hnormal).norm.hom a).1 = + ((relativeNorm A K L hLK + (extensionFixedRepresentationEquiv A K L hLK hnormal a) : + ambientFixedAddSubgroup A K) : A.V) := by + let := hnormal + let := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + rw [relativeNorm_apply_coe] + simp only [Rep.norm, Representation.norm, relativeNormValue] + let M := extensionFixedRepresentation A K L hLK hnormal + let : Module ℤ M.V := M.hV2 + change ((∑ q, M.ρ q) a).1 = + ∑ q, relativeCosetAction A K L hLK + (extensionFixedRepresentationEquiv A K L hLK hnormal a) q + rw [LinearMap.sum_apply] + let coeToAmbient : + (extensionFixedRepresentation A K L hLK hnormal).V →+ A.V := + { toFun := fun x => x.1 + map_zero' := rfl + map_add' := fun _ _ => rfl } + change coeToAmbient (∑ q, M.ρ q a) = + ∑ q, relativeCosetAction A K L hLK + (extensionFixedRepresentationEquiv A K L hLK hnormal a) q + rw [map_sum] + apply Finset.sum_congr rfl + intro q _ + exact extensionFixedRepresentation_action_coe A K L hLK hnormal q a + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianClassification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianClassification.lean new file mode 100644 index 0000000000..b2fdf13ab4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianClassification.lean @@ -0,0 +1,963 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldCandidate +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main +/-! +# Finite abelian classification by norm subgroups + +The first paragraph of the finite classification proof uses the two restriction maps +from the Galois group of a compositum. This file constructs those maps on +the actual finite quotients and proves that they are jointly injective. +This is the group-theoretic source of the implication that a reciprocity +class which restricts trivially to both subextensions is already trivial on +their compositum. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFormation + +open CyclicCohomology KummerTheory + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace FiniteAbelianSubextension + +variable {K : ClosedSubgroup G} + +local instance extensionQuotient_normal + {G : Type*} [Group G] [TopologicalSpace G] {K : ClosedSubgroup G} + (L : FiniteAbelianSubextension K) : + (extensionSubgroup K L.field L.below).Normal := + L.normal + +local instance representedQuotient_finite + {G : Type*} [Group G] [TopologicalSpace G] {K : ClosedSubgroup G} + (L : FiniteAbelianSubextension K) : + Finite (K.toSubgroup ⧸ extensionSubgroup K L.field L.below) := + L.finite + +/-- Additive subgroups which are open for the explicitly declared norm +topology. The topology is part of the predicate, so no ambient topology +instance is changed outside the finite abelian classification theorem. -/ +def NormOpenAddSubgroup (A : Rep ℤ G) (K : ClosedSubgroup G) := + {H : AddSubgroup (ambientFixedAddSubgroup A K) // + IsNormOpen A K (H : Set (ambientFixedAddSubgroup A K))} + +/-- Norm-open subgroups inherit the literal inclusion order of their +underlying additive subgroups. This instance is stated explicitly because +`NormOpenAddSubgroup` is an opaque boundary type, not a transparent alias. -/ +instance normOpenAddSubgroupPartialOrder (A : Rep ℤ G) + (K : ClosedSubgroup G) : PartialOrder (NormOpenAddSubgroup A K) := + PartialOrder.lift (fun H => H.1) (fun _ _ h => Subtype.ext h) + +/-- The actual map in the finite abelian classification theorem, `L ↦ N_{L/K} A_L`, with openness +carried by the codomain rather than assumed. -/ +def normSubgroupMap (A : Rep ℤ G) + (L : FiniteAbelianSubextension K) : NormOpenAddSubgroup A K := by + refine ⟨L.normSubgroup A, ?_⟩ + simpa [FiniteAbelianSubextension.normSubgroup, + FiniteGaloisSubextension.normSubgroup] using + ClassFormation.normSubgroup_isOpen A K + L.toFiniteGaloisExtension + +/-- Establishes the identity `(L.normSubgroupMap A).1 = L.normSubgroup A`. -/ +@[simp] +theorem normSubgroupMap_val + (A : Rep ℤ G) (L : FiniteAbelianSubextension K) : + (L.normSubgroupMap A).1 = L.normSubgroup A := + rfl + +/-- The subgroup product `N_{L₁}N_{L₂}` (a supremum in additive +notation) is open in the norm topology. It contains the defining norm +neighbourhood attached to `L₁`. -/ +theorem sup_normSubgroup_isOpen (A : Rep ℤ G) + (L₁ L₂ : FiniteAbelianSubextension K) : + IsNormOpen A K + ((L₁.normSubgroup A ⊔ L₂.normSubgroup A : + AddSubgroup (ambientFixedAddSubgroup A K)) : + Set (ambientFixedAddSubgroup A K)) := by + apply (normTopology_addSubgroup_isOpen_iff A K + (L₁.normSubgroup A ⊔ L₂.normSubgroup A)).2 + refine ⟨L₁.toFiniteGaloisExtension, ?_⟩ + change L₁.normSubgroup A ≤ L₁.normSubgroup A ⊔ L₂.normSubgroup A + exact le_sup_left + +/-- The finite classification compositum argument, isolated as a private diagram chase. +The final public theorem supplies the three bijectivity facts directly from +finite reciprocity; they are not exposed as hypotheses of the classification. +-/ +private theorem normSubgroup_compositum_eq_inf_of_reciprocity_bijective + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) + (L₁ L₂ : FiniteAbelianSubextension K.field) + (hbij₁ : Function.Bijective + (D.finiteReciprocityHom A v hAxiom K L₁.field L₁.below)) + (hbij₂ : Function.Bijective + (D.finiteReciprocityHom A v hAxiom K L₂.field L₂.below)) + (hbijP : Function.Bijective + (D.finiteReciprocityHom A v hAxiom K (L₁.compositum L₂).field + (L₁.compositum L₂).below)) : + (L₁.compositum L₂).normSubgroup A = + L₁.normSubgroup A ⊓ L₂.normSubgroup A := by + let P := L₁.compositum L₂ + let hP₁ : P.field.toSubgroup ≤ L₁.field.toSubgroup := by + change (L₁.field.toSubgroup ⊓ L₂.field.toSubgroup) ≤ + L₁.field.toSubgroup + exact inf_le_left + let hP₂ : P.field.toSubgroup ≤ L₂.field.toSubgroup := by + change (L₁.field.toSubgroup ⊓ L₂.field.toSubgroup) ≤ + L₂.field.toSubgroup + exact inf_le_right + let EKK : FiniteAbstractFieldExtension G := + { field := K + base := K + below := le_rfl + finiteQuotient := (FiniteGaloisSubextension.refl K.field).finite } + let : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field K.field le_rfl) := + (FiniteGaloisSubextension.refl K.field).finite + apply le_antisymm + · exact normSubgroup_compositum_le_inf A L₁ L₂ + · intro a ha + have ha₁ : a ∈ finiteNormSubgroup A K.field L₁.field L₁.below := by + simpa [FiniteAbelianSubextension.normSubgroup] using ha.1 + have ha₂ : a ∈ finiteNormSubgroup A K.field L₂.field L₂.below := by + simpa [FiniteAbelianSubextension.normSubgroup] using ha.2 + let z : FiniteNormQuotient A K.field P.field P.below := + finiteNormClass A K.field P.field P.below a + obtain ⟨σ, hσ⟩ := hbijP.2 z + have hz₁ : + abstractReciprocityNormProjection A K.field L₁.field P.field hP₁ L₁.below z = + 0 := by + rw [abstractReciprocityNormProjection_finiteNormClass] + exact (finiteNormClass_eq_zero_iff A K.field L₁.field L₁.below a).2 ha₁ + have hz₂ : + abstractReciprocityNormProjection A K.field L₂.field P.field hP₂ L₂.below z = + 0 := by + rw [abstractReciprocityNormProjection_finiteNormClass] + exact (finiteNormClass_eq_zero_iff A K.field L₂.field L₂.below a).2 ha₂ + have hnat₁ := D.finiteReciprocityNaturality_restriction_norm_commutes + A v hAxiom EKK L₁.field P.field L₁.below P.below hP₁ + have hnat₂ := D.finiteReciprocityNaturality_restriction_norm_commutes + A v hAxiom EKK L₂.field P.field L₂.below P.below hP₂ + rw [finiteReciprocityNaturalityNormMap_sameBase_eq_normProjection, + finiteReciprocityNaturalityRestriction_sameBase_eq_restriction] at hnat₁ hnat₂ + have hres₁ : + (abstractReciprocityRestriction K.field L₁.field P.field hP₁ + L₁.below).toAdditive + σ = 0 := by + apply hbij₁.1 + calc + D.finiteReciprocityHom A v hAxiom K L₁.field L₁.below + ((abstractReciprocityRestriction K.field L₁.field P.field hP₁ + L₁.below).toAdditive σ) = + abstractReciprocityNormProjection A K.field L₁.field P.field hP₁ + L₁.below + (D.finiteReciprocityHom A v hAxiom K P.field P.below σ) := by + exact (DFunLike.congr_fun hnat₁ σ).symm + _ = abstractReciprocityNormProjection A K.field L₁.field P.field hP₁ + L₁.below z := congrArg _ hσ + _ = 0 := hz₁ + _ = D.finiteReciprocityHom A v hAxiom K L₁.field L₁.below 0 := + (map_zero _).symm + have hres₂ : + (abstractReciprocityRestriction K.field L₂.field P.field hP₂ + L₂.below).toAdditive + σ = 0 := by + apply hbij₂.1 + calc + D.finiteReciprocityHom A v hAxiom K L₂.field L₂.below + ((abstractReciprocityRestriction K.field L₂.field P.field hP₂ + L₂.below).toAdditive σ) = + abstractReciprocityNormProjection A K.field L₂.field P.field hP₂ + L₂.below + (D.finiteReciprocityHom A v hAxiom K P.field P.below σ) := by + exact (DFunLike.congr_fun hnat₂ σ).symm + _ = abstractReciprocityNormProjection A K.field L₂.field P.field hP₂ + L₂.below z := congrArg _ hσ + _ = 0 := hz₂ + _ = D.finiteReciprocityHom A v hAxiom K L₂.field L₂.below 0 := + (map_zero _).symm + have hleft : + abstractReciprocityRestriction K.field L₁.field P.field hP₁ + L₁.below σ.toMul = + 1 := by + exact congrArg Additive.toMul hres₁ + have hright : + abstractReciprocityRestriction K.field L₂.field P.field hP₂ + L₂.below σ.toMul = + 1 := by + exact congrArg Additive.toMul hres₂ + have hσMul : σ.toMul = 1 := by + let k : K.field.toSubgroup := Quotient.out σ.toMul + have hkleft : k ∈ extensionSubgroup K.field L₁.field L₁.below := by + apply (QuotientGroup.eq_one_iff k).1 + have := hleft + rw [← Quotient.out_eq' σ.toMul] at this + exact this + have hkright : k ∈ extensionSubgroup K.field L₂.field L₂.below := by + apply (QuotientGroup.eq_one_iff k).1 + have := hright + rw [← Quotient.out_eq' σ.toMul] at this + exact this + have hkP : k ∈ extensionSubgroup K.field P.field P.below := by + apply (mem_extensionSubgroup_iff K.field P.field P.below k).2 + exact ⟨ + (mem_extensionSubgroup_iff K.field L₁.field L₁.below k).1 hkleft, + (mem_extensionSubgroup_iff K.field L₂.field L₂.below k).1 hkright⟩ + calc + σ.toMul = QuotientGroup.mk k := (Quotient.out_eq' σ.toMul).symm + _ = 1 := (QuotientGroup.eq_one_iff k).2 hkP + have hσzero : σ = 0 := by + apply Additive.ext + exact hσMul + have hz : z = 0 := by + calc + z = D.finiteReciprocityHom A v hAxiom K P.field P.below σ := hσ.symm + _ = D.finiteReciprocityHom A v hAxiom K P.field P.below 0 := + congrArg _ hσzero + _ = 0 := map_zero _ + change a ∈ finiteNormSubgroup A K.field P.field P.below + exact (finiteNormClass_eq_zero_iff A K.field P.field P.below a).1 hz + +/-- Restriction along an inclusion of finite abelian subextensions. The +proof-dependent raw quotient map is transported through the two named +quotient boundaries here and nowhere in its callers. -/ +def restriction + {G : Type*} [Group G] [TopologicalSpace G] {K : ClosedSubgroup G} + {L₁ L₂ : FiniteAbelianSubextension K} (h₁₂ : L₁ ≤ L₂) : + L₂.extensionQuotient →* L₁.extensionQuotient := by + letI : (extensionSubgroup K L₁.field L₁.below).Normal := L₁.normal + letI : (extensionSubgroup K L₂.field L₂.below).Normal := L₂.normal + exact L₁.extensionQuotientMulEquiv.symm.toMonoidHom.comp + ((abstractReciprocityRestriction K L₁.field L₂.field h₁₂ L₁.below).comp + L₂.extensionQuotientMulEquiv.toMonoidHom) + +/-- +Establishes the identity `restriction h₁₂ (L₂.extensionQuotientMk k) = L₁.extensionQuotientMk k`. +-/ +@[simp] +theorem restriction_mk + {G : Type*} [Group G] [TopologicalSpace G] {K : ClosedSubgroup G} + {L₁ L₂ : FiniteAbelianSubextension K} (h₁₂ : L₁ ≤ L₂) + (k : K.toSubgroup) : + restriction h₁₂ (L₂.extensionQuotientMk k) = + L₁.extensionQuotientMk k := by + apply L₁.extensionQuotientMulEquiv.injective + simp [restriction] + +/-- Restriction from the actual Galois quotient of `L₁L₂ / K` to that of +`L₁ / K`. -/ +def compositumRestrictionLeft + {G : Type*} [Group G] [TopologicalSpace G] {K : ClosedSubgroup G} + (L₁ L₂ : FiniteAbelianSubextension K) : + (L₁.compositum L₂).extensionQuotient →* L₁.extensionQuotient := + restriction (L₁.le_compositum_left L₂) + +/-- Restriction from the actual Galois quotient of `L₁L₂ / K` to that of +`L₂ / K`. -/ +def compositumRestrictionRight + {G : Type*} [Group G] [TopologicalSpace G] {K : ClosedSubgroup G} + (L₁ L₂ : FiniteAbelianSubextension K) : + (L₁.compositum L₂).extensionQuotient →* L₂.extensionQuotient := + restriction (L₁.le_compositum_right L₂) + +/-- +Establishes the identity `compositumRestrictionLeft L₁ L₂ ((L₁.compositum L₂).extensionQuotientMk +k) = L₁.extensionQuotientMk k`. +-/ +@[simp] +theorem compositumRestrictionLeft_mk + {G : Type*} [Group G] [TopologicalSpace G] {K : ClosedSubgroup G} + (L₁ L₂ : FiniteAbelianSubextension K) (k : K.toSubgroup) : + compositumRestrictionLeft L₁ L₂ + ((L₁.compositum L₂).extensionQuotientMk k) = + L₁.extensionQuotientMk k := by + exact restriction_mk (L₁.le_compositum_left L₂) k + +/-- +Establishes the identity `compositumRestrictionRight L₁ L₂ ((L₁.compositum L₂).extensionQuotientMk +k) = L₂.extensionQuotientMk k`. +-/ +@[simp] +theorem compositumRestrictionRight_mk + {G : Type*} [Group G] [TopologicalSpace G] {K : ClosedSubgroup G} + (L₁ L₂ : FiniteAbelianSubextension K) (k : K.toSubgroup) : + compositumRestrictionRight L₁ L₂ + ((L₁.compositum L₂).extensionQuotientMk k) = + L₂.extensionQuotientMk k := by + exact restriction_mk (L₁.le_compositum_right L₂) k + +/-- The two restriction maps from the Galois group of a compositum are +jointly injective. This is proved on the literal quotient representatives: +an element trivial modulo both field subgroups lies in their intersection, +which is the subgroup representing the compositum. -/ +theorem compositumRestriction_joint_injective + {G : Type*} [Group G] [TopologicalSpace G] {K : ClosedSubgroup G} + (L₁ L₂ : FiniteAbelianSubextension K) : + Function.Injective (fun q : (L₁.compositum L₂).extensionQuotient ↦ + (compositumRestrictionLeft L₁ L₂ q, + compositumRestrictionRight L₁ L₂ q)) := by + intro x y + revert y + refine (L₁.compositum L₂).extensionQuotient_inductionOn + (motive := fun x ↦ ∀ y, + (compositumRestrictionLeft L₁ L₂ x, + compositumRestrictionRight L₁ L₂ x) = + (compositumRestrictionLeft L₁ L₂ y, + compositumRestrictionRight L₁ L₂ y) → x = y) x ?_ + intro a y + refine (L₁.compositum L₂).extensionQuotient_inductionOn + (motive := fun y ↦ + (compositumRestrictionLeft L₁ L₂ + ((L₁.compositum L₂).extensionQuotientMk a), + compositumRestrictionRight L₁ L₂ + ((L₁.compositum L₂).extensionQuotientMk a)) = + (compositumRestrictionLeft L₁ L₂ y, + compositumRestrictionRight L₁ L₂ y) → + (L₁.compositum L₂).extensionQuotientMk a = y) y ?_ + intro b hab + have hleft : + L₁.extensionQuotientMk a = L₁.extensionQuotientMk b := + congrArg Prod.fst hab + have hright : + L₂.extensionQuotientMk a = L₂.extensionQuotientMk b := + congrArg Prod.snd hab + have hleftRaw := congrArg L₁.extensionQuotientMulEquiv hleft + have hrightRaw := congrArg L₂.extensionQuotientMulEquiv hright + simp only [L₁.extensionQuotientMk_apply] at hleftRaw + simp only [L₂.extensionQuotientMk_apply] at hrightRaw + apply (L₁.compositum L₂).extensionQuotientMulEquiv.injective + simp only [FiniteAbelianSubextension.extensionQuotientMk_apply] + apply QuotientGroup.eq.mpr + apply (mem_extensionSubgroup_iff K (L₁.compositum L₂).field + (L₁.compositum L₂).below _).2 + exact ⟨ + (mem_extensionSubgroup_iff K L₁.field L₁.below _).1 + (QuotientGroup.eq.mp hleftRaw), + (mem_extensionSubgroup_iff K L₂.field L₂.below _).1 + (QuotientGroup.eq.mp hrightRaw)⟩ + +/-- Equivalently, the kernels of the two restrictions have trivial +intersection. This is the literal group statement used in the first +paragraph of the proof of the finite abelian classification theorem. -/ +theorem ker_compositumRestrictionLeft_inf_ker_compositumRestrictionRight + {G : Type*} [Group G] [TopologicalSpace G] {K : ClosedSubgroup G} + (L₁ L₂ : FiniteAbelianSubextension K) : + (compositumRestrictionLeft L₁ L₂).ker ⊓ + (compositumRestrictionRight L₁ L₂).ker = ⊥ := by + ext q + constructor + · intro hq + rw [Subgroup.mem_inf] at hq + rw [Subgroup.mem_bot] + apply compositumRestriction_joint_injective L₁ L₂ + apply Prod.ext + · simpa using hq.1 + · simpa using hq.2 + · intro hq + rw [Subgroup.mem_bot] at hq + subst q + simp + +/-! ## Recovering a field from the order of its finite quotient -/ + +/-- If one finite abelian extension is contained in another and their +actual Galois quotients have the same finite cardinality, then the fields +are equal. This is the group-theoretic final step in the injectivity +finite classification argument, where equality of cardinalities comes from finite reciprocity. +-/ +theorem eq_of_le_of_extensionQuotient_card_eq + {G : Type*} [Group G] [TopologicalSpace G] {K : ClosedSubgroup G} + {L₁ L₂ : FiniteAbelianSubextension K} (h₁₂ : L₁ ≤ L₂) + (hcard : Nat.card L₂.extensionQuotient = + Nat.card L₁.extensionQuotient) : + L₁ = L₂ := by + let r := restriction h₁₂ + have hrSurjective : Function.Surjective r := by + simpa [r, restriction] using + L₁.extensionQuotientMulEquiv.symm.surjective.comp + ((abstractReciprocityRestriction_surjective K L₁.field L₂.field + h₁₂ L₁.below).comp + L₂.extensionQuotientMulEquiv.surjective) + have hrBijective : Function.Bijective r := + (Nat.bijective_iff_surjective_and_card r).2 + ⟨hrSurjective, hcard⟩ + apply le_antisymm h₁₂ + intro g hg + let k : K.toSubgroup := ⟨g, L₁.below hg⟩ + have hrOne : r (L₂.extensionQuotientMk k) = 1 := by + rw [show r (L₂.extensionQuotientMk k) = + L₁.extensionQuotientMk k by exact restriction_mk h₁₂ k] + apply L₁.extensionQuotientMulEquiv.injective + rw [map_one, L₁.extensionQuotientMk_apply] + apply (QuotientGroup.eq_one_iff k).2 + exact (mem_extensionSubgroup_iff K L₁.field L₁.below k).2 hg + have hkOne : L₂.extensionQuotientMk k = 1 := by + apply hrBijective.1 + simpa [r] using hrOne + have hkOneRaw := congrArg L₂.extensionQuotientMulEquiv hkOne + simp only [L₂.extensionQuotientMk_apply, map_one] at hkOneRaw + exact (mem_extensionSubgroup_iff K L₂.field L₂.below k).1 + ((QuotientGroup.eq_one_iff k).1 hkOneRaw) + +/-- The order-reversing finite classification argument, kept private until the public +the finite abelian classification theorem supplies the compositum formula and the two reciprocity +bijectivities from finite reciprocity. -/ +private theorem le_iff_normSubgroup_le_of_compositum_and_reciprocity + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) + (L₁ L₂ : FiniteAbelianSubextension K.field) + (hcomp : (L₁.compositum L₂).normSubgroup A = + L₁.normSubgroup A ⊓ L₂.normSubgroup A) + (hbijP : Function.Bijective + (D.finiteReciprocityHom A v hAxiom K (L₁.compositum L₂).field + (L₁.compositum L₂).below)) + (hbij₂ : Function.Bijective + (D.finiteReciprocityHom A v hAxiom K L₂.field L₂.below)) : + L₁ ≤ L₂ ↔ L₂.normSubgroup A ≤ L₁.normSubgroup A := by + constructor + · exact normSubgroup_antitone A + · intro hnorm + let P := L₁.compositum L₂ + have hNP : P.normSubgroup A = L₂.normSubgroup A := by + calc + P.normSubgroup A = L₁.normSubgroup A ⊓ L₂.normSubgroup A := hcomp + _ = L₂.normSubgroup A := inf_eq_right.mpr hnorm + let hPfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field P.field P.below) := + P.finite + let hL₂finite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L₂.field L₂.below) := + L₂.finite + let hPNormFinite : Finite + (FiniteNormQuotient A K.field P.field P.below) := + Finite.of_surjective + (D.finiteReciprocityHom A v hAxiom K P.field P.below) hbijP.2 + let hL₂NormFinite : Finite + (FiniteNormQuotient A K.field L₂.field L₂.below) := + Finite.of_surjective + (D.finiteReciprocityHom A v hAxiom K L₂.field L₂.below) hbij₂.2 + have hnormCard : + Nat.card (FiniteNormQuotient A K.field P.field P.below) = + Nat.card (FiniteNormQuotient A K.field L₂.field L₂.below) := by + apply Nat.card_congr + exact ((finiteNormQuotientConcreteEquiv A K.field P.field P.below).trans + ((QuotientAddGroup.quotientAddEquivOfEq (by + simpa [FiniteAbelianSubextension.normSubgroup] using hNP)).trans + (finiteNormQuotientConcreteEquiv A K.field L₂.field L₂.below).symm)).toEquiv + have hPcard : + Nat.card P.extensionQuotient = + Nat.card (FiniteNormQuotient A K.field P.field P.below) := by + change Nat.card (Additive P.extensionQuotient) = + Nat.card (FiniteNormQuotient A K.field P.field P.below) + exact Nat.card_congr (Equiv.ofBijective _ hbijP) + have hL₂card : + Nat.card L₂.extensionQuotient = + Nat.card (FiniteNormQuotient A K.field L₂.field L₂.below) := by + change Nat.card (Additive L₂.extensionQuotient) = + Nat.card (FiniteNormQuotient A K.field L₂.field L₂.below) + exact Nat.card_congr (Equiv.ofBijective _ hbij₂) + have hcard : Nat.card P.extensionQuotient = + Nat.card L₂.extensionQuotient := + hPcard.trans (hnormCard.trans hL₂card.symm) + have hL₂P : L₂ = P := + eq_of_le_of_extensionQuotient_card_eq + (le_compositum_right L₁ L₂) hcard + rw [hL₂P] + exact le_compositum_left L₁ L₂ + +/-- The final surjectivity step: surjectivity and order reversal turn +the unconditional inclusion for an intersection field into equality. -/ +private theorem normSubgroup_intersection_eq_sup_of_surjective_and_order + [IsTopologicalGroup G] [CompactSpace G] + (A : Rep ℤ G) (K : ClosedSubgroup G) + (L₁ L₂ : FiniteAbelianSubextension K) + (hsurjective : ∀ H : AddSubgroup (ambientFixedAddSubgroup A K), + IsNormOpen A K (H : Set (ambientFixedAddSubgroup A K)) → + ∃ L : FiniteAbelianSubextension K, L.normSubgroup A = H) + (horder : ∀ X Y : FiniteAbelianSubextension K, + X ≤ Y ↔ Y.normSubgroup A ≤ X.normSubgroup A) : + (L₁.intersection L₂).normSubgroup A = + L₁.normSubgroup A ⊔ L₂.normSubgroup A := by + apply le_antisymm + · let H := L₁.normSubgroup A ⊔ L₂.normSubgroup A + obtain ⟨L, hL⟩ := hsurjective H (sup_normSubgroup_isOpen A L₁ L₂) + have hLL₁ : L ≤ L₁ := by + apply (horder L L₁).2 + rw [hL] + exact le_sup_left + have hLL₂ : L ≤ L₂ := by + apply (horder L L₂).2 + rw [hL] + exact le_sup_right + have hLintersection : L ≤ L₁.intersection L₂ := + le_intersection hLL₁ hLL₂ + have hnorm := normSubgroup_antitone A hLintersection + rw [hL] at hnorm + exact hnorm + · exact sup_normSubgroup_le_intersection A L₁ L₂ + +end FiniteAbelianSubextension + +namespace FiniteGaloisSubextension + +variable {K : ClosedSubgroup G} [IsTopologicalGroup G] + +local instance classification_extensionQuotient_finite + (E : FiniteGaloisSubextension K) : + Finite (K.toSubgroup ⧸ extensionSubgroup K E.field E.below) := + E.finite + +local instance classification_abelianExtension_normal + (M : FiniteAbelianSubextension K) : + (extensionSubgroup K M.field M.below).Normal := + M.normal + +local instance classification_abelianExtension_finite + (M : FiniteAbelianSubextension K) : + Finite (K.toSubgroup ⧸ extensionSubgroup K M.field M.below) := + M.finite + +/-- The original finite Galois field lies below the abelian class-field +candidate cut out inside it. -/ +theorem classFieldCandidate_field_le + (E : FiniteGaloisSubextension K) (A : Rep ℤ G) + (H : AddSubgroup (ambientFixedAddSubgroup A K)) + (rE : FiniteNormQuotient A K E.field E.below ≃+ + Additive (Abelianization E.extensionQuotient)) : + E.field.toSubgroup ≤ + (ClassFormation.FiniteGaloisSubextension.classFieldCandidate A E H rE).field.toSubgroup := by + rw [classFieldCandidate_field A E H rE] + exact E.field_le_intermediateField + (reciprocityPreimageSubgroup A E H rE) + +/-- Restriction from `E/K` to its class-field candidate is trivial exactly +on the pulled-back subgroup used to define that candidate. -/ +theorem classFieldCandidate_restriction_eq_one_iff + (E : FiniteGaloisSubextension K) (A : Rep ℤ G) + (H : AddSubgroup (ambientFixedAddSubgroup A K)) + (rE : FiniteNormQuotient A K E.field E.below ≃+ + Additive (Abelianization E.extensionQuotient)) + (q : E.extensionQuotient) : + abstractReciprocityRestriction K + (ClassFormation.FiniteGaloisSubextension.classFieldCandidate A E H rE).field E.field + (classFieldCandidate_field_le E A H rE) + (ClassFormation.FiniteGaloisSubextension.classFieldCandidate A E H rE).below q = 1 ↔ + q ∈ reciprocityPreimageSubgroup A E H rE := by + let S := reciprocityPreimageSubgroup A E H rE + let M := ClassFormation.FiniteGaloisSubextension.classFieldCandidate A E H rE + let hEM := classFieldCandidate_field_le E A H rE + let k : K.toSubgroup := Quotient.out q + rw [← Quotient.out_eq' q] + constructor + · intro hk + have hkM : k ∈ extensionSubgroup K M.field M.below := + (QuotientGroup.eq_one_iff k).1 hk + have hkMfield : k.1 ∈ M.field.toSubgroup := + (mem_extensionSubgroup_iff K M.field M.below k).1 hkM + have hkIntermediate : k.1 ∈ (E.intermediateField S).toSubgroup := by + rw [← classFieldCandidate_field A E H rE] + exact hkMfield + have hkIntermediateSubgroup : + k ∈ extensionSubgroup K (E.intermediateField S) + (E.intermediateField_le_base S) := + (mem_extensionSubgroup_iff K (E.intermediateField S) + (E.intermediateField_le_base S) k).2 hkIntermediate + rw [E.extensionSubgroup_intermediateField_eq S] at hkIntermediateSubgroup + exact hkIntermediateSubgroup + · intro hkS + have hkIntermediateSubgroup : k ∈ E.intermediateSubgroup S := hkS + rw [← E.extensionSubgroup_intermediateField_eq S] at hkIntermediateSubgroup + have hkIntermediate : k.1 ∈ (E.intermediateField S).toSubgroup := + (mem_extensionSubgroup_iff K (E.intermediateField S) + (E.intermediateField_le_base S) k).1 hkIntermediateSubgroup + have hkMfield : k.1 ∈ M.field.toSubgroup := by + rw [classFieldCandidate_field A E H rE] + exact hkIntermediate + apply (QuotientGroup.eq_one_iff k).2 + exact (mem_extensionSubgroup_iff K M.field M.below k).2 hkMfield + +/-- The finite classification surjectivity diagram chase. The final public theorem feeds +`rE` and its compatibility from finite reciprocity, so neither appears as an +assumption of the classification endpoint. -/ +private theorem classFieldCandidate_normSubgroup_eq_of_reciprocity + [CompactSpace G] [T2Space G] [TotallyDisconnectedSpace G] + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) + (E : FiniteGaloisSubextension K.field) + (H : AddSubgroup (ambientFixedAddSubgroup A K.field)) + (hEH : ClassFormation.FiniteGaloisSubextension.normSubgroup A E ≤ H) + (rE : FiniteNormQuotient A K.field E.field E.below ≃+ + Additive (Abelianization E.extensionQuotient)) + (hcompatE : ∀ q : E.extensionQuotient, + rE.symm (Additive.ofMul (Abelianization.of q)) = + D.finiteReciprocityHom A v hAxiom K E.field E.below + (Additive.ofMul q)) + (hbijM : Function.Bijective + (D.finiteReciprocityHom A v hAxiom K + (ClassFormation.FiniteGaloisSubextension.classFieldCandidate A E H rE).field + (ClassFormation.FiniteGaloisSubextension.classFieldCandidate A E H rE).below)) : + (ClassFormation.FiniteGaloisSubextension.classFieldCandidate A E H rE).normSubgroup A = H := by + let S := reciprocityPreimageSubgroup A E H rE + let M := ClassFormation.FiniteGaloisSubextension.classFieldCandidate A E H rE + let hEM := classFieldCandidate_field_le E A H rE + let EKK : FiniteAbstractFieldExtension G := + { field := K + base := K + below := le_rfl + finiteQuotient := (FiniteGaloisSubextension.refl K.field).finite } + let : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field K.field le_rfl) := + (FiniteGaloisSubextension.refl K.field).finite + have hnat := D.finiteReciprocityNaturality_restriction_norm_commutes + A v hAxiom EKK M.field E.field M.below E.below hEM + rw [finiteReciprocityNaturalityNormMap_sameBase_eq_normProjection, + finiteReciprocityNaturalityRestriction_sameBase_eq_restriction] + at hnat + ext a + have haClass := + reciprocityClass_mem_preimageSubgroup_iff A E H hEH rE a + let zE : FiniteNormQuotient A K.field E.field E.below := + finiteNormClass A K.field E.field E.below a + let ab : Additive (Abelianization E.extensionQuotient) := rE zE + let q : E.extensionQuotient := Quotient.out ab.toMul + let zM : FiniteNormQuotient A K.field M.field M.below := + finiteNormClass A K.field M.field M.below a + have hab : Additive.ofMul (Abelianization.of q) = ab := by + apply Additive.ext + exact Quotient.out_eq' ab.toMul + have hrecE : + D.finiteReciprocityHom A v hAxiom K E.field E.below + (Additive.ofMul q) = zE := by + rw [← hcompatE q, hab, AddEquiv.symm_apply_apply] + have hcomm : + D.finiteReciprocityHom A v hAxiom K M.field M.below + ((abstractReciprocityRestriction K.field M.field E.field hEM M.below).toAdditive + (Additive.ofMul q)) = zM := by + calc + D.finiteReciprocityHom A v hAxiom K M.field M.below + ((abstractReciprocityRestriction K.field M.field E.field hEM M.below).toAdditive + (Additive.ofMul q)) = + abstractReciprocityNormProjection A K.field M.field E.field hEM M.below + (D.finiteReciprocityHom A v hAxiom K E.field E.below + (Additive.ofMul q)) := by + exact (DFunLike.congr_fun hnat (Additive.ofMul q)).symm + _ = abstractReciprocityNormProjection A K.field M.field E.field hEM M.below zE := + congrArg _ hrecE + _ = zM := by + rw [abstractReciprocityNormProjection_finiteNormClass] + change a ∈ finiteNormSubgroup A K.field M.field M.below ↔ a ∈ H + constructor + · intro haM + have hzM : zM = 0 := + (finiteNormClass_eq_zero_iff A K.field M.field M.below a).2 haM + have hresZero : + (abstractReciprocityRestriction K.field M.field E.field hEM M.below).toAdditive + (Additive.ofMul q) = 0 := by + apply hbijM.1 + calc + D.finiteReciprocityHom A v hAxiom K M.field M.below + ((abstractReciprocityRestriction K.field M.field E.field hEM M.below).toAdditive + (Additive.ofMul q)) = zM := hcomm + _ = 0 := hzM + _ = D.finiteReciprocityHom A v hAxiom K M.field M.below 0 := + (map_zero _).symm + have hresOne : + abstractReciprocityRestriction K.field M.field E.field hEM M.below q = 1 := by + exact congrArg Additive.toMul hresZero + apply haClass.1 + have hqS := + (classFieldCandidate_restriction_eq_one_iff E A H rE q).1 + hresOne + convert hqS using 1; rfl + · intro haH + have hqS : q ∈ S := by + apply haClass.2 at haH + convert haH using 1; rfl + have hresOne : + abstractReciprocityRestriction K.field M.field E.field hEM M.below q = 1 := + (classFieldCandidate_restriction_eq_one_iff E A H rE q).2 hqS + have hresZero : + (abstractReciprocityRestriction K.field M.field E.field hEM M.below).toAdditive + (Additive.ofMul q) = 0 := by + exact congrArg Additive.ofMul hresOne + have hzM : zM = 0 := by + calc + zM = D.finiteReciprocityHom A v hAxiom K M.field M.below + ((abstractReciprocityRestriction K.field M.field E.field hEM M.below).toAdditive + (Additive.ofMul q)) := hcomm.symm + _ = D.finiteReciprocityHom A v hAxiom K M.field M.below 0 := + congrArg _ hresZero + _ = 0 := map_zero _ + exact (finiteNormClass_eq_zero_iff A K.field M.field M.below a).1 hzM + +/-- The third-isomorphism quotient by `S` is literally restriction from +`E / K` to the intermediate field fixed by `S`. This representative-level +identity connects the candidate quotient in the surjectivity construction +of the finite abelian classification theorem to restriction compatibility's restriction map. -/ +theorem upperQuotientEquiv_quotientMk_eq_restriction + {G : Type*} [Group G] [TopologicalSpace G] [IsTopologicalGroup G] + {K : ClosedSubgroup G} + (E : FiniteGaloisSubextension K) (S : Subgroup E.extensionQuotient) + [hS : S.Normal] (q : E.extensionQuotient) : + letI : (extensionSubgroup K E.field E.below).Normal := E.normal + letI : (extensionSubgroup K (E.intermediateField S) + (E.intermediateField_le_base S)).Normal := + E.intermediateField_normal S hS + E.upperQuotientEquiv S (QuotientGroup.mk q) = + abstractReciprocityRestriction K (E.intermediateField S) E.field + (E.field_le_intermediateField S) + (E.intermediateField_le_base S) q := by + let : (extensionSubgroup K E.field E.below).Normal := E.normal + let : (extensionSubgroup K (E.intermediateField S) + (E.intermediateField_le_base S)).Normal := + E.intermediateField_normal S hS + refine QuotientGroup.induction_on q ?_ + intro k + exact E.upperQuotientEquiv_mk_mk S k + +end FiniteGaloisSubextension +end ClassFormation + +namespace ClassFormation + +open CyclicCohomology KummerTheory + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace FiniteAbelianSubextension + +variable {D : DegreeData G} {A : Rep ℤ G} + +/-- finite reciprocity specialized to an actual finite abelian extension. +The two halves are supplied by the general Sylow surjectivity argument and +the cyclic-coordinate injectivity argument; no bijectivity premise is +exposed by the finite abelian classification theorem. -/ +private theorem reciprocityEquiv_bijective + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) + (L : FiniteAbelianSubextension K.field) : + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + Function.Bijective + (D.finiteReciprocityHom A v hAxiom K L.field L.below) := by + let : (extensionSubgroup K.field L.field L.below).Normal := L.normal + let : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L.field L.below) := L.finite + let : IsMulCommutative L.toFiniteGaloisExtension.extensionQuotient := + L.commutative + exact ⟨ + v.abstractReciprocity_abelian_finiteReciprocityHom_injective + hcf hAxiom K L.toFiniteGaloisExtension, + v.abstractReciprocity_finiteReciprocityHom_surjective + hcf hAxiom K L.toFiniteGaloisExtension⟩ + +/-- The first displayed formula in the finite abelian classification theorem: the norm subgroup +of the compositum is +the intersection of the two norm subgroups. This is the first paragraph +of the finite classification proof, with finite reciprocity supplying all three vertical +isomorphisms. -/ +theorem normSubgroup_compositum + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) + (L₁ L₂ : FiniteAbelianSubextension K.field) : + (L₁.compositum L₂).normSubgroup A = + L₁.normSubgroup A ⊓ L₂.normSubgroup A := by + let hAxiom := v.classFieldAxiom_implies_unramifiedUnitCohomology hcf + exact normSubgroup_compositum_eq_inf_of_reciprocity_bijective + D A v hAxiom K L₁ L₂ + (reciprocityEquiv_bijective + v hcf hAxiom K L₁) + (reciprocityEquiv_bijective + v hcf hAxiom K L₂) + (reciprocityEquiv_bijective + v hcf hAxiom K (L₁.compositum L₂)) + +/-- The order-reversal assertion in the finite abelian classification theorem: field inclusion +is exactly reverse inclusion of norm +subgroups. -/ +theorem le_iff_normSubgroup_le + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) + (L₁ L₂ : FiniteAbelianSubextension K.field) : + L₁ ≤ L₂ ↔ L₂.normSubgroup A ≤ L₁.normSubgroup A := by + let hAxiom := v.classFieldAxiom_implies_unramifiedUnitCohomology hcf + exact le_iff_normSubgroup_le_of_compositum_and_reciprocity + D A v hAxiom K L₁ L₂ + (normSubgroup_compositum v hcf K L₁ L₂) + (reciprocityEquiv_bijective + v hcf hAxiom K (L₁.compositum L₂)) + (reciprocityEquiv_bijective + v hcf hAxiom K L₂) + +/-- The forward map in the finite abelian classification theorem is injective. -/ +theorem normSubgroupMap_injective + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) : + Function.Injective (normSubgroupMap A : + FiniteAbelianSubextension K.field → NormOpenAddSubgroup A K.field) := by + intro L₁ L₂ h + have hnorm : L₁.normSubgroup A = L₂.normSubgroup A := by + exact congrArg Subtype.val h + apply le_antisymm + · apply (le_iff_normSubgroup_le v hcf K L₁ L₂).2 + rw [hnorm] + · apply (le_iff_normSubgroup_le v hcf K L₂ L₁).2 + rw [hnorm] + +/-- The kernel equality in the surjectivity surjectivity step. Starting +from `N_E ≤ H`, pull `H / N_E` back through the actual norm-residue symbol +of finite reciprocity and take its fixed field. The norm subgroup of that concrete +finite abelian candidate is exactly `H`. -/ +theorem classFieldCandidate_normSubgroup_eq + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) + (E : FiniteGaloisSubextension K.field) + (H : AddSubgroup (ambientFixedAddSubgroup A K.field)) + (hEH : ClassFormation.FiniteGaloisSubextension.normSubgroup A E ≤ H) : + let rE := D.normResidueSymbol A v hcf K E + (ClassFormation.FiniteGaloisSubextension.classFieldCandidate A E H rE).normSubgroup A = H := by + dsimp only + let : (extensionSubgroup K.field E.field E.below).Normal := E.normal + let : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field E.field E.below) := E.finite + let hAxiom := v.classFieldAxiom_implies_unramifiedUnitCohomology hcf + let rE := D.normResidueSymbol A v hcf K E + let M := ClassFormation.FiniteGaloisSubextension.classFieldCandidate A E H rE + have hcompatE (q : E.extensionQuotient) : + rE.symm (Additive.ofMul (Abelianization.of q)) = + D.finiteReciprocityHom A v hAxiom K E.field E.below + (Additive.ofMul q) := by + simpa only [rE, DegreeData.normResidueSymbol, AddEquiv.symm_symm] using + D.abstractReciprocityEquiv_apply_of A v hcf K E q + exact + FiniteGaloisSubextension.classFieldCandidate_normSubgroup_eq_of_reciprocity + D A v hAxiom K E H hEH rE hcompatE + (reciprocityEquiv_bijective + v hcf hAxiom K M) + +/-- Every open subgroup in the norm topology is the norm subgroup of an +actual finite abelian extension. The extension is the fixed field of the +literal preimage of `H / N_E` under the norm-residue symbol of finite reciprocity. +-/ +theorem normSubgroupMap_surjective + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) : + Function.Surjective (normSubgroupMap A : + FiniteAbelianSubextension K.field → NormOpenAddSubgroup A K.field) := by + intro H + obtain ⟨E, hEH⟩ := normOpenAddSubgroup_contains_finiteNormSubgroup + A K.field H.1 H.2 + let : (extensionSubgroup K.field E.field E.below).Normal := E.normal + let : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field E.field E.below) := E.finite + let rE := D.normResidueSymbol A v hcf K E + let M := ClassFormation.FiniteGaloisSubextension.classFieldCandidate A E H.1 rE + have hM : M.normSubgroup A = H.1 := by + simpa only [rE, M] using + classFieldCandidate_normSubgroup_eq + v hcf K E H.1 hEH + refine ⟨M, ?_⟩ + apply Subtype.ext + exact hM + +/-- The norm-subgroup map of the finite abelian classification theorem is bijective. -/ +theorem normSubgroupMap_bijective + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) : + Function.Bijective (normSubgroupMap A : + FiniteAbelianSubextension K.field → NormOpenAddSubgroup A K.field) := + ⟨normSubgroupMap_injective v hcf K, + normSubgroupMap_surjective v hcf K⟩ + +/-- **the finite abelian classification theorem.** Finite abelian extensions of the base are +order-isomorphic +to the opposite poset of norm-open subgroups. -/ +noncomputable def normSubgroupOrderIso + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) : + FiniteAbelianSubextension K.field ≃o (NormOpenAddSubgroup A K.field)ᵒᵈ where + toEquiv := Equiv.ofBijective (normSubgroupMap A) + (normSubgroupMap_bijective v hcf K) + map_rel_iff' := by + intro L₁ L₂ + change L₂.normSubgroup A ≤ L₁.normSubgroup A ↔ L₁ ≤ L₂ + exact (le_iff_normSubgroup_le v hcf K L₁ L₂).symm + +/-- +The defining evaluation formula for `normSubgroupOrderIso` is `(OrderDual.ofDual +(normSubgroupOrderIso v hcf K L)).1 = L.normSubgroup A`. +-/ +@[simp] +theorem normSubgroupOrderIso_apply + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) + (L : FiniteAbelianSubextension K.field) : + (OrderDual.ofDual (normSubgroupOrderIso v hcf K L)).1 = + L.normSubgroup A := + rfl + +/-- The second displayed formula in the finite abelian classification theorem: the norm subgroup +of the +intersection field is the product of the two norm subgroups (their supremum +in additive notation). -/ +theorem normSubgroup_intersection + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) + (L₁ L₂ : FiniteAbelianSubextension K.field) : + (L₁.intersection L₂).normSubgroup A = + L₁.normSubgroup A ⊔ L₂.normSubgroup A := by + apply normSubgroup_intersection_eq_sup_of_surjective_and_order + A K.field L₁ L₂ + · intro H hH + let Hopen : NormOpenAddSubgroup A K.field := ⟨H, hH⟩ + obtain ⟨L, hL⟩ := + normSubgroupMap_surjective v hcf K Hopen + refine ⟨L, ?_⟩ + exact congrArg Subtype.val hL + · exact le_iff_normSubgroup_le v hcf K + +end FiniteAbelianSubextension +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianSubextension.lean new file mode 100644 index 0000000000..2964782b29 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianSubextension.lean @@ -0,0 +1,479 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension +public import Mathlib.Algebra.Group.Subgroup.Pointwise +public import Mathlib.Topology.Algebra.Group.Pointwise +/-! +# Finite abelian extensions in abstract reciprocity + +the finite abelian class-field classification classifies finite abelian extensions `L | K` by +their norm subgroups. This file builds the extension side of that +correspondence independently of the reciprocity isomorphism: + +* a finite Galois extension whose actual quotient is commutative; +* the field-inclusion order (opposite to inclusion of closed subgroups); +* compositum and intersection operations; +* the actual assignment `L ↦ N_{L/K} A_L` and its unconditional order + relations. + +The reverse inclusions in the two norm formulas, and hence the classification +bijection itself, require the abstract reciprocity theorem and are deliberately not postulated. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFormation + +open CyclicCohomology KummerTheory + +universe u + +section GroupOnly + +variable {G : Type u} [Group G] [TopologicalSpace G] + +/-- A finite abelian extension `L | K`: a finite Galois extension together +with commutativity of its actual quotient `G_K/G_L`. -/ +structure FiniteAbelianSubextension (K : ClosedSubgroup G) where + /-- The underlying finite Galois subextension. -/ + toFiniteGaloisExtension : FiniteGaloisSubextension K + /-- Commutativity of the relative Galois quotient. -/ + commutative : IsMulCommutative toFiniteGaloisExtension.extensionQuotient + +namespace FiniteAbelianSubextension + +variable {K : ClosedSubgroup G} + +/-- Introduces the abbreviation `field`. -/ +abbrev field (L : FiniteAbelianSubextension K) : ClosedSubgroup G := + L.toFiniteGaloisExtension.field + +/-- Introduces the abbreviation `below`. -/ +abbrev below (L : FiniteAbelianSubextension K) : + L.field.toSubgroup ≤ K.toSubgroup := + L.toFiniteGaloisExtension.below + +/-- Introduces the abbreviation `normal`. -/ +abbrev normal (L : FiniteAbelianSubextension K) : + (extensionSubgroup K L.field L.below).Normal := + L.toFiniteGaloisExtension.normal + +/-- Introduces the abbreviation `finite`. -/ +abbrev finite (L : FiniteAbelianSubextension K) : + Finite (K.toSubgroup ⧸ extensionSubgroup K L.field L.below) := + L.toFiniteGaloisExtension.finite + +/-- The finite abelian quotient carried by the extension. Its representation +is inherited through the finite Galois extension boundary rather than exposed +as a transparent quotient abbreviation. -/ +@[implicit_reducible] +def extensionQuotient (L : FiniteAbelianSubextension K) : Type u := + L.toFiniteGaloisExtension.extensionQuotient + +/-- The quotient attached to a finite abelian subextension is a commutative group. -/ +@[implicit_reducible] +instance extensionQuotientCommGroup (L : FiniteAbelianSubextension K) : + CommGroup L.extensionQuotient := by + unfold extensionQuotient + letI : IsMulCommutative + L.toFiniteGaloisExtension.extensionQuotient := L.commutative + exact + { (inferInstance : + Group L.toFiniteGaloisExtension.extensionQuotient) with + mul_comm := L.commutative.is_comm.comm } + +/-- The quotient attached to a finite abelian subextension is finite. -/ +instance extensionQuotient_finite (L : FiniteAbelianSubextension K) : + Finite L.extensionQuotient := by + unfold extensionQuotient + infer_instance + +/-- Comparison with the quotient presentation used by the underlying group +library. -/ +def extensionQuotientMulEquiv (L : FiniteAbelianSubextension K) : + L.extensionQuotient ≃* + (K.toSubgroup ⧸ extensionSubgroup K L.field L.below) := + L.toFiniteGaloisExtension.extensionQuotientMulEquiv + +/-- The canonical quotient projection for a finite abelian extension. -/ +def extensionQuotientMk (L : FiniteAbelianSubextension K) : + K.toSubgroup →* L.extensionQuotient := + L.toFiniteGaloisExtension.extensionQuotientMk + +/-- The named abelian quotient projection agrees with the underlying quotient map. -/ +@[simp] +theorem extensionQuotientMk_apply (L : FiniteAbelianSubextension K) + (k : K.toSubgroup) : + L.extensionQuotientMulEquiv (L.extensionQuotientMk k) = + (QuotientGroup.mk k : + K.toSubgroup ⧸ extensionSubgroup K L.field L.below) := + L.toFiniteGaloisExtension.extensionQuotientMk_apply k + +/-- Eliminate an abelian extension quotient without choosing a representative. -/ +protected theorem extensionQuotient_inductionOn + (L : FiniteAbelianSubextension K) + {motive : L.extensionQuotient → Prop} (q : L.extensionQuotient) + (mk : ∀ k : K.toSubgroup, motive (L.extensionQuotientMk k)) : + motive q := by + exact L.toFiniteGaloisExtension.extensionQuotient_inductionOn q mk + +/-- Two packages with the same closed subgroup represent the same finite +abelian extension. -/ +@[ext] +theorem ext {L₁ L₂ : FiniteAbelianSubextension K} + (h : L₁.field = L₂.field) : L₁ = L₂ := by + cases L₁ with + | mk L₁ h₁ => + cases L₂ with + | mk L₂ h₂ => + cases L₁ with + | mk F₁ b₁ n₁ f₁ => + cases L₂ with + | mk F₂ b₂ n₂ f₂ => + dsimp only [field] at h + cases h + rfl + +/-- The order is field inclusion. Since fields are represented by their +absolute Galois subgroups, it is the opposite subgroup order. -/ +instance : PartialOrder (FiniteAbelianSubextension K) where + le L₁ L₂ := L₂.field.toSubgroup ≤ L₁.field.toSubgroup + le_refl _ := le_rfl + le_trans _ _ _ h₁₂ h₂₃ := h₂₃.trans h₁₂ + le_antisymm L₁ L₂ h₁₂ h₂₁ := by + apply ext + apply ClosedSubgroup.ext + have hs : L₁.field.toSubgroup = L₂.field.toSubgroup := + le_antisymm h₂₁ h₁₂ + exact congrArg (fun H : Subgroup G => H.carrier) hs + +/-- The order on finite abelian subextensions is characterized by containment of their fields. -/ +theorem le_iff (L₁ L₂ : FiniteAbelianSubextension K) : + L₁ ≤ L₂ ↔ L₂.field.toSubgroup ≤ L₁.field.toSubgroup := + Iff.rfl + +/-- Base change of a finite abelian extension to an arbitrary +intermediate abstract field. Contravariantly the new top subgroup is +the intersection with the new base subgroup. -/ +def baseChange (M : FiniteAbelianSubextension K) + (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) : + FiniteAbelianSubextension L where + toFiniteGaloisExtension := + M.toFiniteGaloisExtension.baseChange L hLK + commutative := by + let P := + M.toFiniteGaloisExtension.baseChange L hLK + let : + (extensionSubgroup K M.field M.below).Normal := + M.normal + let : + (extensionSubgroup L P.field P.below).Normal := + P.normal + refine ⟨⟨?_⟩⟩ + intro x y + refine P.extensionQuotient_inductionOn + (motive := fun x => x * y = y * x) x ?_ + intro a + refine P.extensionQuotient_inductionOn + (motive := fun y => + P.extensionQuotientMk a * y = + y * P.extensionQuotientMk a) y ?_ + intro b + apply P.extensionQuotientMulEquiv.injective + simp only [map_mul, P.extensionQuotientMk_apply] + apply QuotientGroup.eq.mpr + apply (mem_extensionSubgroup_iff L P.field P.below _).2 + constructor + · exact ((a * b)⁻¹ * (b * a)).property + · let aK : K.toSubgroup := + Subgroup.inclusion hLK a + let bK : K.toSubgroup := + Subgroup.inclusion hLK b + have hcomm := + M.commutative.is_comm.comm + (M.extensionQuotientMk aK) + (M.extensionQuotientMk bK) + have hcommRaw := + congrArg M.extensionQuotientMulEquiv hcomm + simp only [map_mul, M.extensionQuotientMk_apply] at hcommRaw + exact + (mem_extensionSubgroup_iff + K M.field M.below _).1 + (QuotientGroup.eq.mp hcommRaw) + +/-- The compositum `L₁L₂`, contravariantly represented by +`G_{L₁} ∩ G_{L₂}`. -/ +def compositum (L₁ L₂ : FiniteAbelianSubextension K) : + FiniteAbelianSubextension K where + toFiniteGaloisExtension := + L₁.toFiniteGaloisExtension.compositum L₂.toFiniteGaloisExtension + commutative := by + let P := L₁.toFiniteGaloisExtension.compositum + L₂.toFiniteGaloisExtension + let : (extensionSubgroup K L₁.field L₁.below).Normal := L₁.normal + let : (extensionSubgroup K L₂.field L₂.below).Normal := L₂.normal + let : (extensionSubgroup K P.field P.below).Normal := P.normal + refine ⟨⟨?_⟩⟩ + intro x y + refine P.extensionQuotient_inductionOn + (motive := fun x => x * y = y * x) x ?_ + intro a + refine P.extensionQuotient_inductionOn + (motive := fun y => P.extensionQuotientMk a * y = + y * P.extensionQuotientMk a) y ?_ + intro b + apply P.extensionQuotientMulEquiv.injective + simp only [map_mul, P.extensionQuotientMk_apply] + apply QuotientGroup.eq.mpr + apply (mem_extensionSubgroup_iff K P.field P.below _).2 + constructor + · have hcomm := L₁.commutative.is_comm.comm + (L₁.extensionQuotientMk a) (L₁.extensionQuotientMk b) + have hcommRaw := congrArg L₁.extensionQuotientMulEquiv hcomm + simp only [map_mul, L₁.extensionQuotientMk_apply] at hcommRaw + exact (mem_extensionSubgroup_iff K L₁.field L₁.below _).1 + (QuotientGroup.eq.mp hcommRaw) + · have hcomm := L₂.commutative.is_comm.comm + (L₂.extensionQuotientMk a) (L₂.extensionQuotientMk b) + have hcommRaw := congrArg L₂.extensionQuotientMulEquiv hcomm + simp only [map_mul, L₂.extensionQuotientMk_apply] at hcommRaw + exact (mem_extensionSubgroup_iff K L₂.field L₂.below _).1 + (QuotientGroup.eq.mp hcommRaw) + +/-- The left subextension embeds into the compositum. -/ +theorem le_compositum_left (L₁ L₂ : FiniteAbelianSubextension K) : + L₁ ≤ L₁.compositum L₂ := + by + change (L₁.field.toSubgroup ⊓ L₂.field.toSubgroup) ≤ + L₁.field.toSubgroup + exact inf_le_left + +/-- The right subextension embeds into the compositum. -/ +theorem le_compositum_right (L₁ L₂ : FiniteAbelianSubextension K) : + L₂ ≤ L₁.compositum L₂ := + by + change (L₁.field.toSubgroup ⊓ L₂.field.toSubgroup) ≤ + L₂.field.toSubgroup + exact inf_le_right + +/-- The compositum is the least subextension containing both inputs. -/ +theorem compositum_le {L₁ L₂ P : FiniteAbelianSubextension K} + (h₁ : L₁ ≤ P) (h₂ : L₂ ≤ P) : + L₁.compositum L₂ ≤ P := + fun _ hp => ⟨h₁ hp, h₂ hp⟩ + +section Intersection + +variable [IsTopologicalGroup G] [CompactSpace G] + +omit [IsTopologicalGroup G] [CompactSpace G] in +/-- Each field subgroup normalizes the other one. This is not an +ambient-normality assumption: it is obtained from the packaged normality of +`G_L` inside `G_K`. -/ +theorem field_le_normalizer (L₁ L₂ : FiniteAbelianSubextension K) : + L₁.field.toSubgroup ≤ Subgroup.normalizer L₂.field.toSubgroup := by + have hnormal : + (L₂.field.toSubgroup.subgroupOf K.toSubgroup).Normal := by + exact L₂.normal + let : (L₂.field.toSubgroup.subgroupOf K.toSubgroup).Normal := hnormal + exact L₁.below.trans + (Subgroup.le_normalizer_of_normal_subgroupOf L₂.below) + +/-- The field intersection `L₁ ∩ L₂`, contravariantly represented by +the subgroup generated by `G_{L₁}` and `G_{L₂}`. Its closedness follows +from the product description and compactness. -/ +def intersectionField (L₁ L₂ : FiniteAbelianSubextension K) : + ClosedSubgroup G where + toSubgroup := L₁.field.toSubgroup ⊔ L₂.field.toSubgroup + isClosed' := by + change IsClosed + ((↑(L₁.field.toSubgroup ⊔ L₂.field.toSubgroup) : Set G)) + rw [Subgroup.coe_mul_of_left_le_normalizer_right _ _ + (field_le_normalizer L₁ L₂)] + exact L₂.field.isClosed'.mul_left_of_isCompact + L₁.field.isClosed'.isCompact + +/-- The intersection field remains above the fixed base field. -/ +theorem intersectionField_below (L₁ L₂ : FiniteAbelianSubextension K) : + (intersectionField L₁ L₂).toSubgroup ≤ K.toSubgroup := + sup_le L₁.below L₂.below + +/-- Viewing the generated ambient subgroup inside `G_K` agrees with taking +the supremum of the two actual extension subgroups. -/ +theorem extensionSubgroup_intersectionField (L₁ L₂ : + FiniteAbelianSubextension K) : + extensionSubgroup K (intersectionField L₁ L₂) + (intersectionField_below L₁ L₂) = + extensionSubgroup K L₁.field L₁.below ⊔ + extensionSubgroup K L₂.field L₂.below := by + simpa [intersectionField] using + (Subgroup.subgroupOf_sup L₁.below L₂.below) + +/-- The finite Galois package underlying the intersection field. -/ +def intersectionGalois (L₁ L₂ : FiniteAbelianSubextension K) : + FiniteGaloisSubextension K where + field := intersectionField L₁ L₂ + below := intersectionField_below L₁ L₂ + normal := by + rw [extensionSubgroup_intersectionField] + let : (extensionSubgroup K L₁.field L₁.below).Normal := L₁.normal + let : (extensionSubgroup K L₂.field L₂.below).Normal := L₂.normal + exact Subgroup.sup_normal _ _ + finite := by + rw [extensionSubgroup_intersectionField] + let : (extensionSubgroup K L₁.field L₁.below).FiniteIndex := + @Subgroup.finiteIndex_of_finite_quotient K.toSubgroup _ + (extensionSubgroup K L₁.field L₁.below) L₁.finite + let : (extensionSubgroup K L₁.field L₁.below ⊔ + extensionSubgroup K L₂.field L₂.below).FiniteIndex := + Subgroup.finiteIndex_of_le le_sup_left + exact Subgroup.finite_quotient_of_finiteIndex + +/-- The intersection of two finite abelian extensions. -/ +def intersection (L₁ L₂ : FiniteAbelianSubextension K) : + FiniteAbelianSubextension K where + toFiniteGaloisExtension := intersectionGalois L₁ L₂ + commutative := by + let P := intersectionGalois L₁ L₂ + let : (extensionSubgroup K L₁.field L₁.below).Normal := L₁.normal + let : (extensionSubgroup K L₂.field L₂.below).Normal := L₂.normal + let : (extensionSubgroup K P.field P.below).Normal := P.normal + refine ⟨⟨?_⟩⟩ + intro x y + refine P.extensionQuotient_inductionOn + (motive := fun x => x * y = y * x) x ?_ + intro a + refine P.extensionQuotient_inductionOn + (motive := fun y => P.extensionQuotientMk a * y = + y * P.extensionQuotientMk a) y ?_ + intro b + apply P.extensionQuotientMulEquiv.injective + simp only [map_mul, P.extensionQuotientMk_apply] + apply QuotientGroup.eq.mpr + change (a * b)⁻¹ * (b * a) ∈ + extensionSubgroup K (intersectionField L₁ L₂) + (intersectionField_below L₁ L₂) + rw [extensionSubgroup_intersectionField] + have hcomm := L₁.commutative.is_comm.comm + (L₁.extensionQuotientMk a) (L₁.extensionQuotientMk b) + have hcommRaw := congrArg L₁.extensionQuotientMulEquiv hcomm + simp only [map_mul, L₁.extensionQuotientMk_apply] at hcommRaw + have hin : (a * b)⁻¹ * (b * a) ∈ + extensionSubgroup K L₁.field L₁.below := + QuotientGroup.eq.mp hcommRaw + exact (show extensionSubgroup K L₁.field L₁.below ≤ + extensionSubgroup K L₁.field L₁.below ⊔ + extensionSubgroup K L₂.field L₂.below from le_sup_left) hin + +/-- The intersection subextension lies below its left input. -/ +theorem intersection_le_left (L₁ L₂ : FiniteAbelianSubextension K) : + L₁.intersection L₂ ≤ L₁ := by + change L₁.field.toSubgroup ≤ + L₁.field.toSubgroup ⊔ L₂.field.toSubgroup + exact le_sup_left + +/-- The intersection subextension lies below its right input. -/ +theorem intersection_le_right (L₁ L₂ : FiniteAbelianSubextension K) : + L₁.intersection L₂ ≤ L₂ := by + change L₂.field.toSubgroup ≤ + L₁.field.toSubgroup ⊔ L₂.field.toSubgroup + exact le_sup_right + +/-- A subextension below both inputs lies below their intersection. -/ +theorem le_intersection {P L₁ L₂ : FiniteAbelianSubextension K} + (h₁ : P ≤ L₁) (h₂ : P ≤ L₂) : + P ≤ L₁.intersection L₂ := by + change L₁.field.toSubgroup ⊔ L₂.field.toSubgroup ≤ + P.field.toSubgroup + exact sup_le h₁ h₂ + +end Intersection + +end FiniteAbelianSubextension + +end GroupOnly + +section Representation + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace FiniteAbelianSubextension + +variable {K : ClosedSubgroup G} + +/-- The norm subgroup assigned to a finite abelian extension, +`N_L = N_{L/K} A_L` in the finite abelian class-field classification. -/ +def normSubgroup (A : Rep ℤ G) (L : FiniteAbelianSubextension K) : + AddSubgroup (ambientFixedAddSubgroup A K) := by + letI : Finite (K.toSubgroup ⧸ + extensionSubgroup K L.field L.below) := L.finite + exact finiteNormSubgroup A K L.field L.below + +/-- The source-level implication in the order formula: +an inclusion of fields gives the reverse inclusion of norm subgroups. -/ +theorem normSubgroup_antitone (A : Rep ℤ G) + {L₁ L₂ : FiniteAbelianSubextension K} (h : L₁ ≤ L₂) : + normSubgroup A L₂ ≤ normSubgroup A L₁ := by + let : Finite (K.toSubgroup ⧸ + extensionSubgroup K L₂.field L₂.below) := L₂.finite + let : Finite (K.toSubgroup ⧸ + extensionSubgroup K L₁.field L₁.below) := L₁.finite + let hL₂L₁finite : Finite (L₁.field.toSubgroup ⧸ + extensionSubgroup L₁.field L₂.field h) := + FiniteGaloisSubextension.finite_extension_over_intermediate + L₂.below L₁.below h + let T : DegreeData.FiniteTower G := { + top := L₂.field + middle := L₁.field + base := K + top_le_middle := h + middle_le_base := L₁.below + finiteTopQuotient := by + change Finite (L₁.field.toSubgroup ⧸ + extensionSubgroup L₁.field L₂.field h) + exact hL₂L₁finite + finiteBaseQuotient := L₁.finite } + change finiteNormSubgroup A K L₂.field L₂.below ≤ + finiteNormSubgroup A K L₁.field L₁.below + rintro _ ⟨a, rfl⟩ + refine ⟨relativeNorm A L₁.field L₂.field h a, ?_⟩ + exact T.norm_trans_apply A a + +/-- The unconditional half of +`N_{L₁L₂} = N_{L₁} ∩ N_{L₂}` in the finite abelian class-field classification. -/ +theorem normSubgroup_compositum_le_inf (A : Rep ℤ G) + (L₁ L₂ : FiniteAbelianSubextension K) : + normSubgroup A (L₁.compositum L₂) ≤ + normSubgroup A L₁ ⊓ normSubgroup A L₂ := by + intro x hx + exact ⟨normSubgroup_antitone A (le_compositum_left L₁ L₂) hx, + normSubgroup_antitone A (le_compositum_right L₁ L₂) hx⟩ + +/-- The unconditional half of +`N_{L₁∩L₂} = N_{L₁}N_{L₂}` in additive notation. -/ +theorem sup_normSubgroup_le_intersection + [IsTopologicalGroup G] [CompactSpace G] + (A : Rep ℤ G) (L₁ L₂ : FiniteAbelianSubextension K) : + normSubgroup A L₁ ⊔ normSubgroup A L₂ ≤ + normSubgroup A (L₁.intersection L₂) := by + apply sup_le + · exact normSubgroup_antitone A (intersection_le_left L₁ L₂) + · exact normSubgroup_antitone A (intersection_le_right L₁ L₂) + + +end FiniteAbelianSubextension + +end Representation + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteGaloisSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteGaloisSubextension.lean new file mode 100644 index 0000000000..a7bd33ef53 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteGaloisSubextension.lean @@ -0,0 +1,484 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient + +/-! # Finite Galois Subextension -/ + +@[expose] public section +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +/-! +# Finite Galois extensions above an abstract field + +The norm topology is indexed by the actual finite Galois extensions +of a fixed abstract field. This file packages those extensions and their +composita contravariantly as intersections of closed subgroups. +-/ + +noncomputable +section + +universe u + +section GroupOnly + +variable {G : Type u} [Group G] [TopologicalSpace G] + +/-- A finite Galois extension `L / K`, represented by `G_L ≤ G_K`. -/ +structure FiniteGaloisSubextension (K : ClosedSubgroup G) where + /-- The closed subgroup representing the top field. -/ + field : ClosedSubgroup G + /-- The top-field subgroup is contained in the base-field subgroup. -/ + below : field.toSubgroup ≤ K.toSubgroup + /-- The top-field subgroup is normal inside the base-field subgroup. -/ + normal : (extensionSubgroup K field below).Normal + /-- The relative Galois quotient is finite. -/ + finite : Finite (K.toSubgroup ⧸ extensionSubgroup K field below) + +namespace FiniteGaloisSubextension + +variable {K : ClosedSubgroup G} + +/-- Forget only finiteness from a finite Galois subextension. -/ +def toGaloisSubextension (L : FiniteGaloisSubextension K) : + DegreeData.GaloisSubextension K where + field := L.field + below := L.below + normal := L.normal + +/-- Forget normality, retaining the underlying finite abstract extension. +This is the canonical bridge from a finite Galois subextension to the degree +and ramification API. -/ +def toFiniteAbstractExtension (L : FiniteGaloisSubextension K) : + DegreeData.FiniteAbstractExtension G where + field := L.field + base := K + below := L.below + finiteQuotient := L.finite + +/-- The actual finite quotient `G(L/K)`, kept behind a named object +boundary. -/ +def extensionQuotient (L : FiniteGaloisSubextension K) : Type u := + K.toSubgroup ⧸ extensionSubgroup K L.field L.below + +/-- Structural unramifiedness of the underlying finite extension. -/ +def IsUnramified (L : FiniteGaloisSubextension K) (D : DegreeData G) : Prop := + L.toFiniteAbstractExtension.IsUnramified D + +/-- Structural total ramification of the underlying finite extension. -/ +def IsTotallyRamified (L : FiniteGaloisSubextension K) + (D : DegreeData G) : Prop := + L.toFiniteAbstractExtension.IsTotallyRamified D + +/-- A finite Galois subextension is represented by a normal subgroup. -/ +instance extensionSubgroup_normalInstance (L : FiniteGaloisSubextension K) : + (extensionSubgroup K L.field L.below).Normal := + L.normal + +/-- The group structure transported across the named finite quotient +boundary. -/ +instance extensionQuotientGroupInstance (L : FiniteGaloisSubextension K) : + Group L.extensionQuotient := by + change Group + (K.toSubgroup ⧸ extensionSubgroup K L.field L.below) + infer_instance + +/-- The quotient represented by a finite Galois subextension is finite. -/ +instance extensionQuotient_finiteInstance (L : FiniteGaloisSubextension K) : + Finite L.extensionQuotient := + L.finite + +/-- Comparison with the quotient presentation used by the underlying group +library. -/ +def extensionQuotientMulEquiv (L : FiniteGaloisSubextension K) : + L.extensionQuotient ≃* + (K.toSubgroup ⧸ extensionSubgroup K L.field L.below) := + MulEquiv.refl _ + +/-- The canonical quotient projection for a finite Galois subextension. -/ +def extensionQuotientMk (L : FiniteGaloisSubextension K) : + K.toSubgroup →* L.extensionQuotient := + QuotientGroup.mk' (extensionSubgroup K L.field L.below) + +/-- The named finite Galois quotient projection agrees with `QuotientGroup.mk`. -/ +@[simp] +theorem extensionQuotientMk_apply (L : FiniteGaloisSubextension K) + (k : K.toSubgroup) : + L.extensionQuotientMulEquiv (L.extensionQuotientMk k) = + (QuotientGroup.mk k : + K.toSubgroup ⧸ extensionSubgroup K L.field L.below) := + rfl + +/-- A quotient representative is trivial exactly when it lies in the extension subgroup. -/ +@[simp] +theorem extensionQuotientMk_eq_one_iff (L : FiniteGaloisSubextension K) + (k : K.toSubgroup) : + L.extensionQuotientMk k = 1 ↔ + k ∈ extensionSubgroup K L.field L.below := by + constructor + · intro h + apply (QuotientGroup.eq_one_iff k).1 + calc + (QuotientGroup.mk k : + K.toSubgroup ⧸ extensionSubgroup K L.field L.below) = + L.extensionQuotientMulEquiv (L.extensionQuotientMk k) := + (L.extensionQuotientMk_apply k).symm + _ = L.extensionQuotientMulEquiv 1 := congrArg L.extensionQuotientMulEquiv h + _ = 1 := L.extensionQuotientMulEquiv.map_one + · intro hk + apply L.extensionQuotientMulEquiv.injective + rw [L.extensionQuotientMk_apply, L.extensionQuotientMulEquiv.map_one] + exact (QuotientGroup.eq_one_iff k).2 hk + +/-- The canonical projection onto the finite Galois quotient is surjective. -/ +theorem extensionQuotientMk_surjective (L : FiniteGaloisSubextension K) : + Function.Surjective L.extensionQuotientMk := by + intro q + obtain ⟨k, hk⟩ := QuotientGroup.mk'_surjective + (extensionSubgroup K L.field L.below) (L.extensionQuotientMulEquiv q) + refine ⟨k, L.extensionQuotientMulEquiv.injective ?_⟩ + rw [L.extensionQuotientMk_apply] + exact hk + +/-- The finite and non-finite Galois bundles have the same quotient; this +named equivalence is the only public comparison needed by clients. -/ +def toGaloisExtensionQuotientMulEquiv (L : FiniteGaloisSubextension K) : + L.extensionQuotient ≃* L.toGaloisSubextension.extensionQuotient := + L.extensionQuotientMulEquiv.trans + L.toGaloisSubextension.extensionQuotientMulEquiv.symm + +/-- Eliminate a finite Galois quotient without exposing a chosen +representative. -/ +protected theorem extensionQuotient_inductionOn + (L : FiniteGaloisSubextension K) {motive : L.extensionQuotient → Prop} + (q : L.extensionQuotient) + (mk : ∀ k : K.toSubgroup, motive (L.extensionQuotientMk k)) : + motive q := by + exact @Quotient.inductionOn' K.toSubgroup + (QuotientGroup.leftRel (extensionSubgroup K L.field L.below)) + motive q mk + +/-- Bundling a finite Galois extension preserves its unramified predicate. -/ +@[simp] +theorem toGaloisSubextension_isUnramified_iff + (L : FiniteGaloisSubextension K) (D : DegreeData G) : + L.toGaloisSubextension.IsUnramified D ↔ L.IsUnramified D := + Iff.rfl + +/-- Bundling a finite Galois extension preserves its total-ramification predicate. -/ +@[simp] +theorem toGaloisSubextension_isTotallyRamified_iff + (L : FiniteGaloisSubextension K) (D : DegreeData G) : + L.toGaloisSubextension.IsTotallyRamified D ↔ L.IsTotallyRamified D := + Iff.rfl + +/-- Transport an unramifiedness proof through the finite-to-Galois +forgetful map. -/ +theorem isUnramified_toGaloisSubextension + (L : FiniteGaloisSubextension K) (D : DegreeData G) + (hL : L.IsUnramified D) : + L.toGaloisSubextension.IsUnramified D := + (L.toGaloisSubextension_isUnramified_iff D).2 hL + +/-- Transport a total-ramification proof through the finite-to-Galois +forgetful map. -/ +theorem isTotallyRamified_toGaloisSubextension + (L : FiniteGaloisSubextension K) (D : DegreeData G) + (hL : L.IsTotallyRamified D) : + L.toGaloisSubextension.IsTotallyRamified D := + (L.toGaloisSubextension_isTotallyRamified_iff D).2 hL + +/-- Unramifiedness is the canonical inertia-containment condition. -/ +theorem isUnramified_iff_inertia_le (L : FiniteGaloisSubextension K) + (D : DegreeData G) : + L.IsUnramified D ↔ + K.toSubgroup ⊓ D.degree.toMonoidHom.ker ≤ L.field.toSubgroup := + L.toFiniteAbstractExtension.isUnramified_iff_inertia_le D + +/-- Total ramification is the canonical equality of degree images. -/ +theorem isTotallyRamified_iff_image_le (L : FiniteGaloisSubextension K) + (D : DegreeData G) : + L.IsTotallyRamified D ↔ + K.toSubgroup.map D.degree.toMonoidHom ≤ + L.field.toSubgroup.map D.degree.toMonoidHom := + L.toFiniteAbstractExtension.isTotallyRamified_iff_image_le D + +/-- Retain the finite-over-base endpoint bundles of a finite Galois +subextension of an abstract field which is finite over the distinguished +base. -/ +noncomputable def toFiniteAbstractFieldExtension + {K : FiniteAbstractField G} (L : FiniteGaloisSubextension K.field) : + FiniteAbstractFieldExtension G := by + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := + L.finite + exact FiniteAbstractFieldExtension.ofInclusion L.field K L.below + +/-- Finiteness is transitive in a tower of abstract fields. -/ +theorem finite_extension_trans + {P L K : ClosedSubgroup G} + (hPL : P.toSubgroup ≤ L.toSubgroup) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hPLfinite : Finite + (L.toSubgroup ⧸ extensionSubgroup L P hPL)] + [hLKfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + Finite (K.toSubgroup ⧸ extensionSubgroup K P (hPL.trans hLK)) := by + have hPL0 : P.toSubgroup.relIndex L.toSubgroup ≠ 0 := by + rw [Subgroup.relIndex] + exact @Subgroup.index_ne_zero_of_finite L.toSubgroup _ + (extensionSubgroup L P hPL) hPLfinite + have hLK0 : L.toSubgroup.relIndex K.toSubgroup ≠ 0 := by + rw [Subgroup.relIndex] + exact @Subgroup.index_ne_zero_of_finite K.toSubgroup _ + (extensionSubgroup K L hLK) hLKfinite + apply Nat.finite_of_card_ne_zero + change (extensionSubgroup K P (hPL.trans hLK)).index ≠ 0 + simpa [Subgroup.relIndex] using + Subgroup.relIndex_ne_zero_trans hPL0 hLK0 + +/-- A finite extension remains finite over every intermediate field. -/ +theorem finite_extension_over_intermediate + {P M K : ClosedSubgroup G} + (hPK : P.toSubgroup ≤ K.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + (hPM : P.toSubgroup ≤ M.toSubgroup) + [hPKfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K P hPK)] : + Finite (M.toSubgroup ⧸ extensionSubgroup M P hPM) := by + have hPK0 : P.toSubgroup.relIndex K.toSubgroup ≠ 0 := by + rw [Subgroup.relIndex] + exact @Subgroup.index_ne_zero_of_finite K.toSubgroup _ + (extensionSubgroup K P hPK) hPKfinite + have hPM0 : P.toSubgroup.relIndex M.toSubgroup ≠ 0 := by + intro hzero + have hmul := Subgroup.relIndex_mul_relIndex + P.toSubgroup M.toSubgroup K.toSubgroup hPM hMK + rw [hzero, zero_mul] at hmul + exact hPK0 hmul.symm + apply Nat.finite_of_card_ne_zero + change (extensionSubgroup M P hPM).index ≠ 0 + simpa [Subgroup.relIndex] using hPM0 + +/-- Every intermediate field of a finite extension is finite over the +base. No normality hypothesis is needed: this is the finite-index +statement for an arbitrary subgroup between the two endpoint subgroups. -/ +theorem finite_intermediate_extension + {P M K : ClosedSubgroup G} + (hPK : P.toSubgroup ≤ K.toSubgroup) + (hPM : P.toSubgroup ≤ M.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hPKfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K P hPK)] : + Finite (K.toSubgroup ⧸ extensionSubgroup K M hMK) := by + have hPK0 : P.toSubgroup.relIndex K.toSubgroup ≠ 0 := by + rw [Subgroup.relIndex] + exact @Subgroup.index_ne_zero_of_finite K.toSubgroup _ + (extensionSubgroup K P hPK) hPKfinite + have hMK0 : M.toSubgroup.relIndex K.toSubgroup ≠ 0 := by + intro hzero + have hmul := Subgroup.relIndex_mul_relIndex + P.toSubgroup M.toSubgroup K.toSubgroup hPM hMK + rw [hzero, mul_zero] at hmul + exact hPK0 hmul.symm + apply Nat.finite_of_card_ne_zero + change (extensionSubgroup K M hMK).index ≠ 0 + simpa [Subgroup.relIndex] using hMK0 + +/-- Base change of a finite Galois extension `M / K` to an arbitrary +intermediate field `L / K`. Contravariantly, the compositum `ML` is the +intersection `G_M ∩ G_L`; normality and finite index are pulled back from +`G_M ◁ G_K`. -/ +def baseChange (M : FiniteGaloisSubextension K) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) : FiniteGaloisSubextension L where + field := L ⊓ M.field + below := inf_le_left + normal := by + let f : L.toSubgroup →* K.toSubgroup := Subgroup.inclusion hLK + have heq : extensionSubgroup L (L ⊓ M.field) inf_le_left = + (extensionSubgroup K M.field M.below).comap f := by + ext x + rw [mem_extensionSubgroup_iff, Subgroup.mem_comap, + mem_extensionSubgroup_iff] + change (x : G) ∈ L ⊓ M.field ↔ (x : G) ∈ M.field + exact ⟨fun hx => hx.2, fun hx => ⟨x.property, hx⟩⟩ + rw [heq] + let : (extensionSubgroup K M.field M.below).Normal := M.normal + infer_instance + finite := by + let f : L.toSubgroup →* K.toSubgroup := Subgroup.inclusion hLK + let E := extensionSubgroup K M.field M.below + have heq : extensionSubgroup L (L ⊓ M.field) inf_le_left = E.comap f := by + ext x + rw [mem_extensionSubgroup_iff, Subgroup.mem_comap] + dsimp only [E, f, Subgroup.inclusion] + rw [mem_extensionSubgroup_iff] + change (x : G) ∈ L ⊓ M.field ↔ (x : G) ∈ M.field + exact ⟨fun hx => hx.2, fun hx => ⟨x.property, hx⟩⟩ + let : Finite (K.toSubgroup ⧸ E) := M.finite + let : E.Normal := M.normal + have hE0 : E.index ≠ 0 := Subgroup.index_ne_zero_of_finite + have hrel0 : E.relIndex f.range ≠ 0 := by + intro hzero + have hdvd : E.relIndex f.range ∣ E.index := + E.relIndex_dvd_index_of_normal f.range + rw [hzero, zero_dvd_iff] at hdvd + exact hE0 hdvd + apply Nat.finite_of_card_ne_zero + change (extensionSubgroup L (L ⊓ M.field) inf_le_left).index ≠ 0 + rw [heq, E.index_comap f] + exact hrel0 + +/-- The trivial extension `K / K`. -/ +def refl (K : ClosedSubgroup G) : FiniteGaloisSubextension K where + field := K + below := le_rfl + normal := by + have htop : extensionSubgroup K K le_rfl = ⊤ := by + rw [eq_top_iff] + intro x _ + exact x.2 + rw [htop] + infer_instance + finite := by + have htop : extensionSubgroup K K le_rfl = ⊤ := by + rw [eq_top_iff] + intro x _ + exact x.2 + rw [htop] + infer_instance + +/-- The compositum `L₁L₂`, represented by `G_{L₁} ∩ G_{L₂}`. -/ +def compositum (L₁ L₂ : FiniteGaloisSubextension K) : + FiniteGaloisSubextension K where + field := L₁.field ⊓ L₂.field + below := fun _ h => L₁.below h.1 + normal := by + have heq : extensionSubgroup K (L₁.field ⊓ L₂.field) + (fun _ h => L₁.below h.1) = + extensionSubgroup K L₁.field L₁.below ⊓ + extensionSubgroup K L₂.field L₂.below := by + ext k + simp only [Subgroup.mem_inf, mem_extensionSubgroup_iff] + constructor + · intro hk + exact ⟨hk.1, hk.2⟩ + · rintro ⟨h₁, h₂⟩ + exact ⟨h₁, h₂⟩ + rw [heq] + let : (extensionSubgroup K L₁.field L₁.below).Normal := L₁.normal + let : (extensionSubgroup K L₂.field L₂.below).Normal := L₂.normal + infer_instance + finite := by + have heq : extensionSubgroup K (L₁.field ⊓ L₂.field) + (fun _ h => L₁.below h.1) = + extensionSubgroup K L₁.field L₁.below ⊓ + extensionSubgroup K L₂.field L₂.below := by + ext k + simp only [Subgroup.mem_inf, mem_extensionSubgroup_iff] + constructor + · intro hk + exact ⟨hk.1, hk.2⟩ + · rintro ⟨h₁, h₂⟩ + exact ⟨h₁, h₂⟩ + let : (extensionSubgroup K L₁.field L₁.below).FiniteIndex := + @Subgroup.finiteIndex_of_finite_quotient K.toSubgroup _ + (extensionSubgroup K L₁.field L₁.below) L₁.finite + let : (extensionSubgroup K L₂.field L₂.below).FiniteIndex := + @Subgroup.finiteIndex_of_finite_quotient K.toSubgroup _ + (extensionSubgroup K L₂.field L₂.below) L₂.finite + rw [heq] + exact Subgroup.finite_quotient_of_finiteIndex + +/-- The constructed Galois compositum satisfies the left comparison bound. -/ +theorem compositum_le_left (L₁ L₂ : FiniteGaloisSubextension K) : + (L₁.compositum L₂).field.toSubgroup ≤ L₁.field.toSubgroup := + inf_le_left + +/-- The constructed Galois compositum satisfies the right comparison bound. -/ +theorem compositum_le_right (L₁ L₂ : FiniteGaloisSubextension K) : + (L₁.compositum L₂).field.toSubgroup ≤ L₂.field.toSubgroup := + inf_le_right + +end FiniteGaloisSubextension + +end GroupOnly + +section Representation + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace FiniteGaloisSubextension + +variable {K : ClosedSubgroup G} + +/-- The norm group from a compositum is contained in the norm group from +its first factor. -/ +theorem finiteNormSubgroup_compositum_le_left + (A : Rep ℤ G) (L₁ L₂ : FiniteGaloisSubextension K) : + letI := (L₁.compositum L₂).finite + letI := L₁.finite + finiteNormSubgroup A K (L₁.compositum L₂).field + (L₁.compositum L₂).below ≤ + finiteNormSubgroup A K L₁.field L₁.below := by + let P := L₁.compositum L₂ + let hPL₁ := L₁.compositum_le_left L₂ + let : Finite (K.toSubgroup ⧸ + extensionSubgroup K P.field P.below) := P.finite + let : Finite (K.toSubgroup ⧸ + extensionSubgroup K L₁.field L₁.below) := L₁.finite + have hPKindex : P.field.toSubgroup.relIndex K.toSubgroup ≠ 0 := by + rw [Subgroup.relIndex] + exact Subgroup.index_ne_zero_of_finite + have hPLindex : P.field.toSubgroup.relIndex L₁.field.toSubgroup ≠ 0 := by + intro hzero + have hmul := Subgroup.relIndex_mul_relIndex + P.field.toSubgroup L₁.field.toSubgroup K.toSubgroup hPL₁ L₁.below + rw [hzero, zero_mul] at hmul + exact hPKindex hmul.symm + let hPLfinite : Finite (L₁.field.toSubgroup ⧸ + extensionSubgroup L₁.field P.field hPL₁) := by + apply Nat.finite_of_card_ne_zero + change (extensionSubgroup L₁.field P.field hPL₁).index ≠ 0 + simpa [Subgroup.relIndex] using hPLindex + let T : DegreeData.FiniteTower G := { + top := P.field + middle := L₁.field + base := K + top_le_middle := hPL₁ + middle_le_base := L₁.below + finiteTopQuotient := hPLfinite + finiteBaseQuotient := L₁.finite } + rintro x ⟨a, rfl⟩ + refine ⟨relativeNorm A L₁.field P.field hPL₁ a, ?_⟩ + exact T.norm_trans_apply A a + +/-- The symmetric norm-group containment for the second factor. -/ +theorem finiteNormSubgroup_compositum_le_right + (A : Rep ℤ G) (L₁ L₂ : FiniteGaloisSubextension K) : + letI := (L₁.compositum L₂).finite + letI := L₂.finite + finiteNormSubgroup A K (L₁.compositum L₂).field + (L₁.compositum L₂).below ≤ + finiteNormSubgroup A K L₂.field L₂.below := by + simpa [compositum, inf_comm] using + finiteNormSubgroup_compositum_le_left A L₂ L₁ + +end FiniteGaloisSubextension + +end Representation + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/IntermediateExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/IntermediateExtension.lean new file mode 100644 index 0000000000..1909253aa3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/IntermediateExtension.lean @@ -0,0 +1,614 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension +public import Mathlib.Topology.Algebra.Group.Basic + +/-! # Intermediate Extension -/ + +@[expose] public section +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +/-! +# Intermediate extensions from actual quotient subgroups + +For the three reductions in the proof of the abstract reciprocity theorem, this file supplies + the finite Galois correspondence in the +direction used by the construction. If `L / K` is a packaged finite Galois extension +and `S ≤ G(L/K)`, its inverse image in `G_K` is realized as an actual closed +intermediate field `M`. + +Closedness is proved from the explicit decomposition of the inverse image +as the finite union of right `G_L`-cosets. The two Galois-group +identifications are then obtained from the actual restriction map and the +first and third isomorphism theorems; no correspondence certificate is +assumed. +-/ + +noncomputable +section + +variable {G : Type*} [Group G] [TopologicalSpace G] [IsTopologicalGroup G] + +namespace FiniteGaloisSubextension + +variable {K : ClosedSubgroup G} + +/-- The inverse image in `G_K` of a subgroup of `G(L/K)`. -/ +def intermediateSubgroup (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) : Subgroup K.toSubgroup := by + exact S.comap L.extensionQuotientMk + +omit [IsTopologicalGroup G] in +/-- Membership in the intermediate subgroup is characterized by membership of +the underlying ambient element. -/ +@[simp] +theorem mem_intermediateSubgroup_iff + (L : FiniteGaloisSubextension K) (S : Subgroup L.extensionQuotient) + (k : K.toSubgroup) : + k ∈ L.intermediateSubgroup S ↔ L.extensionQuotientMk k ∈ S := + Iff.rfl + +omit [IsTopologicalGroup G] in +/-- The original `G_L` lies in every inverse-image subgroup. -/ +theorem extensionSubgroup_le_intermediateSubgroup + (L : FiniteGaloisSubextension K) (S : Subgroup L.extensionQuotient) : + extensionSubgroup K L.field L.below ≤ L.intermediateSubgroup S := by + intro x hx + apply (L.mem_intermediateSubgroup_iff S x).2 + have hmk : L.extensionQuotientMk x = 1 := + (L.extensionQuotientMk_eq_one_iff x).2 hx + rw [hmk] + exact S.one_mem + +/-- The `G_L`-coset classified by `q ∈ G(L/K)`, defined canonically as a +fiber of the quotient map. In particular, its public definition does not +choose a representative of `q`. -/ +def intermediateCoset (L : FiniteGaloisSubextension K) + (q : L.extensionQuotient) : Set K.toSubgroup := + {x | L.extensionQuotientMk x = q} + +/-- A representative-based description used only to prove topological facts +about the canonical quotient fiber. -/ +private def representativeIntermediateCoset (L : FiniteGaloisSubextension K) + (q : L.extensionQuotient) : Set K.toSubgroup := + (fun x : K.toSubgroup => + x * Quotient.out (L.extensionQuotientMulEquiv q)) '' + (extensionSubgroup K L.field L.below : Set K.toSubgroup) + +omit [IsTopologicalGroup G] in +/-- Membership in the canonical coset is equality with its quotient class. -/ +theorem mem_intermediateCoset_iff (L : FiniteGaloisSubextension K) + (q : L.extensionQuotient) (x : K.toSubgroup) : + x ∈ L.intermediateCoset q ↔ + L.extensionQuotientMk x = q := + Iff.rfl + +omit [IsTopologicalGroup G] in +private theorem mem_representativeIntermediateCoset_iff + (L : FiniteGaloisSubextension K) + (q : L.extensionQuotient) (x : K.toSubgroup) : + x ∈ representativeIntermediateCoset L q ↔ + L.extensionQuotientMk x = q := by + let : (extensionSubgroup K L.field L.below).Normal := L.normal + constructor + · rintro ⟨h, hh, rfl⟩ + apply L.extensionQuotientMulEquiv.injective + rw [L.extensionQuotientMk_apply] + rw [← Quotient.out_eq' (L.extensionQuotientMulEquiv q)] + apply QuotientGroup.eq_iff_div_mem.mpr + simpa [div_eq_mul_inv, mul_assoc] using hh + · intro hx + have hxout : + (QuotientGroup.mk' (extensionSubgroup K L.field L.below)) x = + (QuotientGroup.mk' + (extensionSubgroup K L.field L.below)) + (Quotient.out (L.extensionQuotientMulEquiv q)) := by + calc + (QuotientGroup.mk' + (extensionSubgroup K L.field L.below)) x = + L.extensionQuotientMulEquiv (L.extensionQuotientMk x) := + (L.extensionQuotientMk_apply x).symm + _ = L.extensionQuotientMulEquiv q := + congrArg L.extensionQuotientMulEquiv hx + _ = (QuotientGroup.mk' + (extensionSubgroup K L.field L.below)) + (Quotient.out (L.extensionQuotientMulEquiv q)) := + (Quotient.out_eq' (L.extensionQuotientMulEquiv q)).symm + have hdiv : x / Quotient.out (L.extensionQuotientMulEquiv q) ∈ + extensionSubgroup K L.field L.below := + QuotientGroup.eq_iff_div_mem.mp hxout + refine ⟨x / Quotient.out (L.extensionQuotientMulEquiv q), hdiv, ?_⟩ + simp [div_eq_mul_inv, mul_assoc] + +omit [IsTopologicalGroup G] in +private theorem intermediateCoset_eq_representativeIntermediateCoset + (L : FiniteGaloisSubextension K) (q : L.extensionQuotient) : + L.intermediateCoset q = representativeIntermediateCoset L q := by + ext x + exact (mem_representativeIntermediateCoset_iff L q x).symm + +omit [IsTopologicalGroup G] in +/-- The inverse image of `S` is literally the finite union of the `G_L` +cosets indexed by the elements of `S`. -/ +theorem intermediateSubgroup_eq_iUnion_cosets + (L : FiniteGaloisSubextension K) (S : Subgroup L.extensionQuotient) : + (L.intermediateSubgroup S : Set K.toSubgroup) = + ⋃ q ∈ (S : Set L.extensionQuotient), L.intermediateCoset q := by + ext x + constructor + · intro hx + have hxS := (L.mem_intermediateSubgroup_iff S x).1 hx + refine Set.mem_iUnion₂.mpr ⟨ + L.extensionQuotientMk x, hxS, ?_⟩ + exact (mem_intermediateCoset_iff L _ x).2 rfl + · intro hx + rcases Set.mem_iUnion₂.mp hx with ⟨q, hqS, hxq⟩ + apply (L.mem_intermediateSubgroup_iff S x).2 + rw [(mem_intermediateCoset_iff L q x).1 hxq] + exact hqS + +private theorem representativeIntermediateCoset_isClosed + (L : FiniteGaloisSubextension K) (q : L.extensionQuotient) : + IsClosed (representativeIntermediateCoset L q) := by + exact isClosedMap_mul_right + (Quotient.out (L.extensionQuotientMulEquiv q)) _ + (extensionSubgroup_isClosed K L.field L.below) + +/-- Every coset in the preceding union is closed: it is the image of the +closed subgroup `G_L ≤ G_K` under right translation. -/ +theorem intermediateCoset_isClosed (L : FiniteGaloisSubextension K) + (q : L.extensionQuotient) : IsClosed (L.intermediateCoset q) := by + rw [intermediateCoset_eq_representativeIntermediateCoset] + exact representativeIntermediateCoset_isClosed L q + +/-- Closedness of the inverse image, proved by its finite coset +decomposition rather than postulated as a Galois-correspondence property. -/ +theorem intermediateSubgroup_isClosed (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) : + IsClosed (L.intermediateSubgroup S : Set K.toSubgroup) := by + let : Finite L.extensionQuotient := L.finite + rw [intermediateSubgroup_eq_iUnion_cosets] + have hfinite : (S : Set L.extensionQuotient).Finite := Set.toFinite _ + exact hfinite.isClosed_biUnion fun q _ => intermediateCoset_isClosed L q + +/-- The closed intermediate field cut out by `S ≤ G(L/K)`. -/ +def intermediateField (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) : ClosedSubgroup G where + toSubgroup := (L.intermediateSubgroup S).map K.toSubgroup.subtype + isClosed' := by + change IsClosed + ((fun x : K.toSubgroup => (x : G)) '' + (L.intermediateSubgroup S : Set K.toSubgroup)) + exact K.isClosed'.isClosedMap_subtype_val _ + (intermediateSubgroup_isClosed L S) + +/-- The constructed intermediate field lies over `K`. -/ +theorem intermediateField_le_base (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) : + (L.intermediateField S).toSubgroup ≤ K.toSubgroup := by + rintro _ ⟨m, hm, rfl⟩ + exact m.property + +/-- Pulling the constructed field back to `G_K` recovers exactly the +inverse-image subgroup. -/ +theorem extensionSubgroup_intermediateField_eq + (L : FiniteGaloisSubextension K) (S : Subgroup L.extensionQuotient) : + extensionSubgroup K (L.intermediateField S) + (L.intermediateField_le_base S) = + L.intermediateSubgroup S := by + ext x + simp only [extensionSubgroup, intermediateField, mem_intermediateSubgroup_iff] + rw [Subgroup.mem_subgroupOf] + constructor + · rintro ⟨y, hy, hxy⟩ + have hyx : y = x := Subtype.ext hxy + simpa [hyx] using hy + · intro hx + exact ⟨x, hx, rfl⟩ + +/-- The constructed field is intermediate: `L ≤ M`. -/ +theorem field_le_intermediateField (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) : + L.field.toSubgroup ≤ (L.intermediateField S).toSubgroup := by + intro x hx + let xK : K.toSubgroup := ⟨x, L.below hx⟩ + have hxH : xK ∈ extensionSubgroup K L.field L.below := + (mem_extensionSubgroup_iff K L.field L.below xK).2 hx + have hxP : xK ∈ L.intermediateSubgroup S := + L.extensionSubgroup_le_intermediateSubgroup S hxH + exact ⟨xK, hxP, rfl⟩ + +/-- The extension subgroup for `L/M` is the pullback of `G_L ◁ G_K` +along `G_M → G_K`. -/ +theorem extensionSubgroup_over_intermediate_eq_comap + (L : FiniteGaloisSubextension K) (S : Subgroup L.extensionQuotient) : + extensionSubgroup (L.intermediateField S) L.field + (L.field_le_intermediateField S) = + (extensionSubgroup K L.field L.below).comap + (Subgroup.inclusion (L.intermediateField_le_base S)) := by + ext x + rw [mem_extensionSubgroup_iff, Subgroup.mem_comap, + mem_extensionSubgroup_iff] + rfl + +/-- `L/M` is normal because it is obtained by restricting the normal +subgroup `G_L ◁ G_K` to `G_M`. -/ +theorem extensionSubgroup_over_intermediate_normal + (L : FiniteGaloisSubextension K) (S : Subgroup L.extensionQuotient) : + (extensionSubgroup (L.intermediateField S) L.field + (L.field_le_intermediateField S)).Normal := by + rw [extensionSubgroup_over_intermediate_eq_comap] + infer_instance + +/-- The extension subgroup over an intermediate field is normal in the intermediate subgroup. -/ +instance extensionSubgroup_over_intermediate_normalInstance + (L : FiniteGaloisSubextension K) (S : Subgroup L.extensionQuotient) : + (extensionSubgroup (L.intermediateField S) L.field + (L.field_le_intermediateField S)).Normal := + L.extensionSubgroup_over_intermediate_normal S + +/-- The lower extension `L/M` is finite. -/ +theorem extension_over_intermediate_finite + (L : FiniteGaloisSubextension K) (S : Subgroup L.extensionQuotient) : + Finite ((L.intermediateField S).toSubgroup ⧸ + extensionSubgroup (L.intermediateField S) L.field + (L.field_le_intermediateField S)) := by + let : Finite (K.toSubgroup ⧸ + extensionSubgroup K L.field L.below) := L.finite + exact FiniteGaloisSubextension.finite_extension_over_intermediate + L.below (L.intermediateField_le_base S) + (L.field_le_intermediateField S) + +/-- The intermediate extension `M/K` is finite, since its subgroup contains +the finite-index subgroup `G_L`. -/ +theorem intermediateField_finite + (L : FiniteGaloisSubextension K) (S : Subgroup L.extensionQuotient) : + Finite (K.toSubgroup ⧸ extensionSubgroup K (L.intermediateField S) + (L.intermediateField_le_base S)) := by + rw [extensionSubgroup_intermediateField_eq] + let : (extensionSubgroup K L.field L.below).FiniteIndex := + @Subgroup.finiteIndex_of_finite_quotient K.toSubgroup _ + (extensionSubgroup K L.field L.below) L.finite + let : (L.intermediateSubgroup S).FiniteIndex := + Subgroup.finiteIndex_of_le (L.extensionSubgroup_le_intermediateSubgroup S) + exact Subgroup.finite_quotient_of_finiteIndex + +/-- The generally non-Galois finite extension `L^S/K` attached to an +arbitrary subgroup `S ≤ G(L/K)`. Normality is deliberately absent from this +bundle; clients that only need finite-extension invariants should use this +rather than forcing `S` through `intermediateFiniteGalois`. -/ +def intermediateFiniteAbstractExtension + (L : FiniteGaloisSubextension K) (S : Subgroup L.extensionQuotient) : + DegreeData.FiniteAbstractExtension G where + field := L.intermediateField S + base := K + below := L.intermediateField_le_base S + finiteQuotient := L.intermediateField_finite S + +omit [IsTopologicalGroup G] in +/-- A normal subgroup `S ◁ G(L/K)` has normal inverse image in `G_K`. -/ +theorem intermediateSubgroup_normal + (L : FiniteGaloisSubextension K) (S : Subgroup L.extensionQuotient) + (hS : S.Normal) : (L.intermediateSubgroup S).Normal := by + let : S.Normal := hS + exact hS.comap L.extensionQuotientMk + +/-- Hence `M/K` is normal whenever `S` is normal. -/ +theorem intermediateField_normal + (L : FiniteGaloisSubextension K) (S : Subgroup L.extensionQuotient) + (hS : S.Normal) : + (extensionSubgroup K (L.intermediateField S) + (L.intermediateField_le_base S)).Normal := by + rw [extensionSubgroup_intermediateField_eq] + exact L.intermediateSubgroup_normal S hS + +/-- The actual finite Galois extension `L/M`. -/ +def lowerFiniteGalois (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) : + FiniteGaloisSubextension (L.intermediateField S) where + field := L.field + below := L.field_le_intermediateField S + normal := L.extensionSubgroup_over_intermediate_normal S + finite := L.extension_over_intermediate_finite S + +/-- If `S` is normal, the actual finite Galois extension `M/K`. -/ +def intermediateFiniteGalois (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) (hS : S.Normal) : + FiniteGaloisSubextension K where + field := L.intermediateField S + below := L.intermediateField_le_base S + normal := L.intermediateField_normal S hS + finite := L.intermediateField_finite S + +/-- Restriction from `G_M` to the subgroup `S ≤ G(L/K)`. The codomain +membership proof is supplied by the defining inverse-image equation for +`M`. -/ +def lowerRestrictionHom (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) : + (L.intermediateField S).toSubgroup →* S := + (L.extensionQuotientMk.comp + (Subgroup.inclusion (L.intermediateField_le_base S))).codRestrict S + (by + intro m + apply (L.mem_intermediateSubgroup_iff S _).1 + rw [← extensionSubgroup_intermediateField_eq L S] + exact + (mem_extensionSubgroup_iff K (L.intermediateField S) + (L.intermediateField_le_base S) + (Subgroup.inclusion (L.intermediateField_le_base S) m)).2 + m.property) + +/-- The lower restriction homomorphism evaluates by restricting the underlying +ambient automorphism. -/ +@[simp] +theorem lowerRestrictionHom_apply_coe (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) + (m : (L.intermediateField S).toSubgroup) : + ((L.lowerRestrictionHom S m : S) : L.extensionQuotient) = + L.extensionQuotientMk + (Subgroup.inclusion (L.intermediateField_le_base S) m) := + rfl + +/-- Every element of `S` is represented by an element of `G_M`; hence the +restriction map is onto. -/ +theorem lowerRestrictionHom_surjective (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) : + Function.Surjective (L.lowerRestrictionHom S) := by + intro s + rcases L.extensionQuotientMk_surjective s.1 with ⟨k, hk⟩ + have hkP : k ∈ L.intermediateSubgroup S := by + apply (L.mem_intermediateSubgroup_iff S k).2 + rw [hk] + exact s.property + let m : (L.intermediateField S).toSubgroup := + ⟨k.1, ⟨k, hkP, rfl⟩⟩ + refine ⟨m, ?_⟩ + apply Subtype.ext + rw [lowerRestrictionHom_apply_coe] + change L.extensionQuotientMk k = s + exact hk + +/-- The kernel of restriction is exactly `G_L` viewed inside `G_M`. -/ +theorem lowerRestrictionHom_ker (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) : + MonoidHom.ker (L.lowerRestrictionHom S) = + extensionSubgroup (L.intermediateField S) L.field + (L.field_le_intermediateField S) := by + ext m + rw [MonoidHom.mem_ker, mem_extensionSubgroup_iff] + constructor + · intro hm + let mK : K.toSubgroup := + ⟨m.1, L.intermediateField_le_base S m.property⟩ + have hq : + ((L.lowerRestrictionHom S m : S) : L.extensionQuotient) = 1 := + congrArg Subtype.val hm + rw [lowerRestrictionHom_apply_coe] at hq + have hH : mK ∈ extensionSubgroup K L.field L.below := + (L.extensionQuotientMk_eq_one_iff mK).1 hq + exact (mem_extensionSubgroup_iff K L.field L.below + mK).1 hH + · intro hm + let mK : K.toSubgroup := + ⟨m.1, L.intermediateField_le_base S m.property⟩ + have hH : mK ∈ extensionSubgroup K L.field L.below := + (mem_extensionSubgroup_iff K L.field L.below mK).2 hm + have hq : L.extensionQuotientMk mK = 1 := + (L.extensionQuotientMk_eq_one_iff mK).2 hH + apply Subtype.ext + rw [lowerRestrictionHom_apply_coe] + exact hq + +/-- The first actual Galois-group identification used: +`G(L/M) ≃ S`. -/ +noncomputable def lowerQuotientEquiv (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) : + (L.lowerFiniteGalois S).extensionQuotient ≃* S := by + letI : (extensionSubgroup (L.intermediateField S) L.field + (L.field_le_intermediateField S)).Normal := + L.extensionSubgroup_over_intermediate_normal S + exact (L.lowerFiniteGalois S).extensionQuotientMulEquiv.trans + ((QuotientGroup.quotientMulEquivOfEq + (L.lowerRestrictionHom_ker S).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (L.lowerRestrictionHom S) (L.lowerRestrictionHom_surjective S))) + +/-- Representative formula for `G(L/M) ≃ S`. -/ +@[simp] +theorem lowerQuotientEquiv_mk (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) + (m : (L.intermediateField S).toSubgroup) : + L.lowerQuotientEquiv S + ((L.lowerFiniteGalois S).extensionQuotientMk m) = + L.lowerRestrictionHom S m := by + let : (extensionSubgroup (L.intermediateField S) L.field + (L.field_le_intermediateField S)).Normal := + L.extensionSubgroup_over_intermediate_normal S + change + ((QuotientGroup.quotientMulEquivOfEq + (L.lowerRestrictionHom_ker S).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (L.lowerRestrictionHom S) (L.lowerRestrictionHom_surjective S))) + (QuotientGroup.mk m) = L.lowerRestrictionHom S m + rfl + +/-- The same representative formula after forgetting the subtype `S`; this +is the form used when composing restriction maps in the reduction diagram. -/ +theorem lowerQuotientEquiv_mk_coe (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) + (m : (L.intermediateField S).toSubgroup) : + ((L.lowerQuotientEquiv S + ((L.lowerFiniteGalois S).extensionQuotientMk m) : S) : + L.extensionQuotient) = + L.extensionQuotientMk + ⟨m.1, L.intermediateField_le_base S m.property⟩ := by + rw [lowerQuotientEquiv_mk, lowerRestrictionHom_apply_coe] + apply congrArg L.extensionQuotientMk + exact Subtype.ext (by rfl) + +omit [IsTopologicalGroup G] in +/-- Mapping the inverse image of `S` back to `G(L/K)` recovers `S` +itself. -/ +theorem intermediateSubgroup_map_quotient_eq + (L : FiniteGaloisSubextension K) (S : Subgroup L.extensionQuotient) : + (L.intermediateSubgroup S).map L.extensionQuotientMk = S := by + exact Subgroup.map_comap_eq_self_of_surjective + L.extensionQuotientMk_surjective S + +/-- The subgroup attached to the intermediate extension is normal. -/ +instance intermediateSubgroup_normalInstance + (L : FiniteGaloisSubextension K) (S : Subgroup L.extensionQuotient) + [hS : S.Normal] : (L.intermediateSubgroup S).Normal := + L.intermediateSubgroup_normal S hS + +/-- The field represented by a normal intermediate subgroup is a normal subextension. -/ +instance intermediateField_normalInstance + (L : FiniteGaloisSubextension K) (S : Subgroup L.extensionQuotient) + [hS : S.Normal] : + (extensionSubgroup K (L.intermediateField S) + (L.intermediateField_le_base S)).Normal := + L.intermediateField_normal S hS + +/-- The third-isomorphism identification used in the normal-subextension +diagram: `G(L/K)/S ≃ G(M/K)`. -/ +def upperQuotient (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) : Type _ := + L.extensionQuotient ⧸ S + +/-- The upper quotient over an intermediate field carries its canonical group structure. -/ +instance upperQuotientGroupInstance (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) [S.Normal] : + Group (L.upperQuotient S) := by + change Group (L.extensionQuotient ⧸ S) + infer_instance + +/-- Comparison with the group-library presentation of the upper quotient. -/ +def upperQuotientMulEquiv (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) [S.Normal] : + L.upperQuotient S ≃* (L.extensionQuotient ⧸ S) := + MulEquiv.refl _ + +/-- The canonical projection to the named upper quotient. -/ +def upperQuotientMk (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) [S.Normal] : + L.extensionQuotient →* L.upperQuotient S := + QuotientGroup.mk' S + +omit [IsTopologicalGroup G] in +/-- The named upper quotient projection agrees with the underlying quotient-group projection. -/ +@[simp] +theorem upperQuotientMk_apply (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) [S.Normal] + (q : L.extensionQuotient) : + L.upperQuotientMulEquiv S (L.upperQuotientMk S q) = + (QuotientGroup.mk q : L.extensionQuotient ⧸ S) := + rfl + +/-- The third-isomorphism identification, with both source and target kept +behind their named finite-Galois quotient boundaries. -/ +noncomputable def upperQuotientEquiv (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) [S.Normal] : + L.upperQuotient S ≃* + (L.intermediateFiniteGalois S inferInstance).extensionQuotient := by + let H := extensionSubgroup K L.field L.below + let P := L.intermediateSubgroup S + let π : K.toSubgroup →* L.extensionQuotient := L.extensionQuotientMk + have hHP : H ≤ P := L.extensionSubgroup_le_intermediateSubgroup S + have hmap : P.map π = S := L.intermediateSubgroup_map_quotient_eq S + have hupper : extensionSubgroup K (L.intermediateField S) + (L.intermediateField_le_base S) = P := + L.extensionSubgroup_intermediateField_eq S + letI : H.Normal := L.normal + letI : P.Normal := L.intermediateSubgroup_normal S inferInstance + letI : (P.map π).Normal := by rw [hmap]; infer_instance + exact (L.upperQuotientMulEquiv S).trans + ((QuotientGroup.quotientMulEquivOfEq hmap.symm).trans + ((QuotientGroup.quotientQuotientEquivQuotient H P hHP).trans + ((QuotientGroup.quotientMulEquivOfEq hupper.symm).trans + (L.intermediateFiniteGalois S inferInstance).extensionQuotientMulEquiv.symm))) + +/-- Representative formula for `G(L/K)/S ≃ G(M/K)`. -/ +@[simp] +theorem upperQuotientEquiv_mk_mk (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) [S.Normal] (k : K.toSubgroup) : + L.upperQuotientEquiv S + (L.upperQuotientMk S (L.extensionQuotientMk k)) = + (L.intermediateFiniteGalois S inferInstance).extensionQuotientMk k := by + let H := extensionSubgroup K L.field L.below + let P := L.intermediateSubgroup S + let π : K.toSubgroup →* L.extensionQuotient := L.extensionQuotientMk + have hHP : H ≤ P := L.extensionSubgroup_le_intermediateSubgroup S + have hmap : P.map π = S := L.intermediateSubgroup_map_quotient_eq S + have hupper : extensionSubgroup K (L.intermediateField S) + (L.intermediateField_le_base S) = P := + L.extensionSubgroup_intermediateField_eq S + let : H.Normal := L.normal + let : P.Normal := L.intermediateSubgroup_normal S inferInstance + let : (P.map π).Normal := by rw [hmap]; infer_instance + change + (L.intermediateFiniteGalois S + inferInstance).extensionQuotientMulEquiv.symm + ((QuotientGroup.quotientMulEquivOfEq hupper.symm) + ((QuotientGroup.quotientQuotientEquivQuotient H P hHP) + ((QuotientGroup.quotientMulEquivOfEq hmap.symm) + (QuotientGroup.mk (L.extensionQuotientMk k))))) = + (L.intermediateFiniteGalois S inferInstance).extensionQuotientMk k + apply + (L.intermediateFiniteGalois S inferInstance).extensionQuotientMulEquiv.injective + refine ((L.intermediateFiniteGalois S + inferInstance).extensionQuotientMulEquiv.apply_symm_apply _).trans ?_ + refine Eq.trans ?_ + ((L.intermediateFiniteGalois S inferInstance).extensionQuotientMk_apply k).symm + have hmk : + L.extensionQuotientMk k = + (QuotientGroup.mk k : K.toSubgroup ⧸ H) := by + change L.extensionQuotientMulEquiv (L.extensionQuotientMk k) = + (QuotientGroup.mk k : K.toSubgroup ⧸ H) + exact L.extensionQuotientMk_apply k + have hthird : + (QuotientGroup.quotientQuotientEquivQuotient H P hHP) + ((QuotientGroup.mk + (QuotientGroup.mk k : K.toSubgroup ⧸ H)) : + (K.toSubgroup ⧸ H) ⧸ + P.map (QuotientGroup.mk' H)) = + (QuotientGroup.mk k : K.toSubgroup ⧸ P) := by + exact + QuotientGroup.quotientQuotientEquivQuotientAux_mk_mk H P hHP k + calc + _ = + (QuotientGroup.quotientMulEquivOfEq hupper.symm) + ((QuotientGroup.quotientQuotientEquivQuotient H P hHP) + (QuotientGroup.mk (L.extensionQuotientMk k))) := + congrArg + (fun q => (QuotientGroup.quotientMulEquivOfEq hupper.symm) + ((QuotientGroup.quotientQuotientEquivQuotient H P hHP) q)) + (QuotientGroup.quotientMulEquivOfEq_mk hmap.symm (L.extensionQuotientMk k)) + _ = + (QuotientGroup.quotientMulEquivOfEq hupper.symm) + ((QuotientGroup.quotientQuotientEquivQuotient H P hHP) + (QuotientGroup.mk (QuotientGroup.mk k : K.toSubgroup ⧸ H))) := + congrArg + (fun q : K.toSubgroup ⧸ H => + (QuotientGroup.quotientMulEquivOfEq hupper.symm) + ((QuotientGroup.quotientQuotientEquivQuotient H P hHP) + (QuotientGroup.mk q))) hmk + _ = + (QuotientGroup.quotientMulEquivOfEq hupper.symm) + (QuotientGroup.mk k : K.toSubgroup ⧸ P) := + congrArg (QuotientGroup.quotientMulEquivOfEq hupper.symm) hthird + _ = _ := QuotientGroup.quotientMulEquivOfEq_mk hupper.symm k + +end FiniteGaloisSubextension + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Main.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Main.lean new file mode 100644 index 0000000000..aa89154790 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Main.lean @@ -0,0 +1,1583 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransfer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Sylow +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionCosets +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusNorms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FixedSource +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.Conclusion +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +/-! # Main -/ + +@[expose] public section +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +/-! +# The abstract reciprocity theorem + +This file assembles the three reductions. The terminal +cyclic totally ramified calculation is proved in +`AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase`. +-/ + +noncomputable +section + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +/-- Additive exactness of the finite Galois row attached to an intermediate +Galois field. -/ +private theorem abstractReciprocity_galois_functionExact + (K M L : ClosedSubgroup G) + (hLM : L.toSubgroup ≤ M.toSubgroup) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLM.trans hMK)).Normal] + [hMnormal : (extensionSubgroup K M hMK).Normal] : + letI : (extensionSubgroup M L hLM).Normal := + transferNormNaturality_intermediateExtension_normal K M L hLM hMK + Function.Exact + (MonoidHom.toAdditive (abstractReciprocityInclusion K M L hLM hMK)) + (MonoidHom.toAdditive (abstractReciprocityRestriction K M L hLM hMK)) := by + let : (extensionSubgroup M L hLM).Normal := + transferNormNaturality_intermediateExtension_normal K M L hLM hMK + intro q + constructor + · intro hq + have hmul : abstractReciprocityRestriction K M L hLM hMK q.toMul = 1 := by + exact Additive.ofMul.injective (by simpa using hq) + have hmem : q.toMul ∈ + (abstractReciprocityRestriction K M L hLM hMK).ker := hmul + rw [abstractReciprocity_galois_exact K M L hLM hMK] at hmem + obtain ⟨x, hx⟩ := hmem + refine ⟨Additive.ofMul x, ?_⟩ + exact Additive.toMul.injective hx + · rintro ⟨x, rfl⟩ + have hmem : abstractReciprocityInclusion K M L hLM hMK x.toMul ∈ + (abstractReciprocityInclusion K M L hLM hMK).range := + ⟨x.toMul, rfl⟩ + rw [← abstractReciprocity_galois_exact K M L hLM hMK] at hmem + exact Additive.ofMul.injective (by simpa using hmem) + +/-- A proper subgroup of a finite group has strictly smaller cardinality. -/ +private theorem abstractReciprocity_subgroup_card_lt_of_ne_top + {Q : Type*} [Group Q] [Finite Q] (S : Subgroup Q) (hS : S ≠ ⊤) : + Nat.card S < Nat.card Q := by + by_contra hlt + have hsurj : Function.Surjective S.subtype := + (S.subtype_injective.bijective_of_nat_card_le (Nat.le_of_not_gt hlt)).2 + apply hS + rw [eq_top_iff] + intro q _ + obtain ⟨s, hs⟩ := hsurj q + rw [← hs] + exact s.property + +/-- Quotienting a finite group by a nontrivial normal subgroup strictly +decreases its cardinality. -/ +private theorem abstractReciprocity_quotient_card_lt_of_ne_bot + {Q : Type*} [Group Q] [Finite Q] (S : Subgroup Q) [S.Normal] + (hS : S ≠ ⊥) : + Nat.card (Q ⧸ S) < Nat.card Q := by + by_contra hlt + have hinj : Function.Injective (QuotientGroup.mk' S) := + ((QuotientGroup.mk'_surjective S).bijective_of_nat_card_le + (Nat.le_of_not_gt hlt)).1 + apply hS + rw [← QuotientGroup.ker_mk' S] + exact (MonoidHom.ker_eq_bot_iff (QuotientGroup.mk' S)).2 hinj + +/-- A subgroup of a finite commutative group which contains every Sylow +subgroup is the whole group. -/ +private theorem abstractReciprocity_subgroup_eq_top_of_sylow_le + {B : Type*} [CommGroup B] [Finite B] + (H : Subgroup B) + (hSylow : ∀ {p : ℕ} [Fact p.Prime] (P : Sylow p B), + (P : Subgroup B) ≤ H) : + H = ⊤ := by + classical + apply (Subgroup.index_eq_one (H := H)).1 + apply Nat.eq_one_iff_not_exists_prime_dvd.mpr + intro p hp hpdvd + let : Fact p.Prime := ⟨hp⟩ + let quotientMap : B →* B ⧸ H := QuotientGroup.mk' H + have hquotientMap : Function.Surjective quotientMap := + QuotientGroup.mk'_surjective H + let Q : Sylow p (B ⧸ H) := default + obtain ⟨P, hP⟩ := Sylow.mapSurjective_surjective + hquotientMap p Q + have hmapBot : (P : Subgroup B).map quotientMap = ⊥ := by + exact (Subgroup.map_eq_bot_iff (P : Subgroup B)).2 (by + simpa [quotientMap, QuotientGroup.ker_mk'] using hSylow P) + have hQBot : (Q : Subgroup (B ⧸ H)) = ⊥ := by + have hco := congrArg (fun S : Sylow p (B ⧸ H) => + (S : Subgroup (B ⧸ H))) hP + simpa [hmapBot] using hco.symm + exact (Q.ne_bot_of_dvd_card hpdvd) hQBot + +/-- If a commutative group has finite exponent and an additive subgroup +contains every Sylow subgroup, then it is the whole group. Only the finite +cyclic subgroup generated by the element under consideration is made +finite; no finiteness of the ambient group is assumed. -/ +private theorem abstractReciprocity_addSubgroup_eq_top_of_exponent_and_sylow_le + {B : Type*} [AddCommGroup B] + (d : ℕ) (hd : 0 < d) (hexponent : ∀ b : B, d • b = 0) + (H : AddSubgroup B) + (hSylow : ∀ {p : ℕ} [Fact p.Prime] + (P : Sylow p (Multiplicative B)), + Subgroup.toAddSubgroup' + (P : Subgroup (Multiplicative B)) ≤ H) : + H = ⊤ := by + apply AddSubgroup.toSubgroup.injective + apply top_unique + intro g _ + let b : B := g.toAdd + have hgfinite : IsOfFinOrder g := + isOfFinOrder_iff_pow_eq_one.2 ⟨d, hd, by + apply Multiplicative.toAdd.injective + simpa [b] using hexponent b⟩ + let C := Subgroup.zpowers g + let : Fintype C := + Fintype.ofEquiv (Fin (orderOf g)) (finEquivZPowers hgfinite) + let J : Subgroup C := H.toSubgroup.comap C.subtype + have hJ : J = ⊤ := by + apply abstractReciprocity_subgroup_eq_top_of_sylow_le J + intro p _ Q x hx + have hQp : IsPGroup p ((Q : Subgroup C).map C.subtype) := + Q.isPGroup'.map C.subtype + obtain ⟨P, hQP⟩ := hQp.exists_le_sylow + have hxmap : (x : Multiplicative B) ∈ + (Q : Subgroup C).map C.subtype := + ⟨x, hx, rfl⟩ + exact hSylow P (hQP hxmap) + let x : C := ⟨g, Subgroup.mem_zpowers g⟩ + have hxJ : x ∈ J := by rw [hJ]; exact Subgroup.mem_top x + exact hxJ + +namespace ValuationData + +variable {D : DegreeData G} {A : Rep ℤ G} + +/-- The common reciprocity square used by the cyclic and intermediate-field +reductions in the abstract reciprocity theorem. -/ +private theorem abstractReciprocity_finiteReciprocityHom_diagram + (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K M : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLM : L.toSubgroup ≤ M.field.toSubgroup) + (hMK : M.field.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : (extensionSubgroup K.field L (hLM.trans hMK)).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L (hLM.trans hMK))] + [hMnormal : (extensionSubgroup K.field M.field hMK).Normal] + [hMfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field M.field hMK)] + [hLMnormal : (extensionSubgroup M.field L hLM).Normal] + [hLMfinite : Finite + (M.field.toSubgroup ⧸ extensionSubgroup M.field L hLM)] : + let r₀ := D.finiteReciprocityHom A v hAxiom M L hLM + let r := D.finiteReciprocityHom A v hAxiom K L (hLM.trans hMK) + let r₁ := D.finiteReciprocityHom A v hAxiom K M.field hMK + let i := MonoidHom.toAdditive + (abstractReciprocityInclusion K.field M.field L hLM hMK) + let q := MonoidHom.toAdditive + (abstractReciprocityRestriction K.field M.field L hLM hMK) + let n := abstractReciprocityNormMap A K.field M.field L hLM hMK + let p := abstractReciprocityNormProjection A K.field M.field L hLM hMK + Function.Surjective q ∧ + (∀ x, r (i x) = n (r₀ x)) ∧ + (∀ x, p (r x) = r₁ (q x)) := by + dsimp only + let EMK : FiniteAbstractFieldExtension G := + { field := M + base := K + below := hMK + finiteQuotient := hMfinite } + let EKK : FiniteAbstractFieldExtension G := + { field := K + base := K + below := le_rfl + finiteQuotient := (FiniteGaloisSubextension.refl K.field).finite } + let r₀ := D.finiteReciprocityHom A v hAxiom M L hLM + let r := D.finiteReciprocityHom A v hAxiom K L (hLM.trans hMK) + let r₁ := D.finiteReciprocityHom A v hAxiom K M.field hMK + let i := MonoidHom.toAdditive + (abstractReciprocityInclusion K.field M.field L hLM hMK) + let q := MonoidHom.toAdditive + (abstractReciprocityRestriction K.field M.field L hLM hMK) + let n := abstractReciprocityNormMap A K.field M.field L hLM hMK + let p := abstractReciprocityNormProjection A K.field M.field L hLM hMK + have hq : Function.Surjective q := by + intro y + obtain ⟨x, hx⟩ := abstractReciprocityRestriction_surjective + K.field M.field L hLM hMK y.toMul + refine ⟨Additive.ofMul x, ?_⟩ + exact Additive.toMul.injective hx + have hleft : ∀ x, r (i x) = n (r₀ x) := by + intro x + have hcomm := D.finiteReciprocityNaturality_restriction_norm_commutes + A v hAxiom EMK L L (hLM.trans hMK) hLM le_rfl + simpa only [r, r₀, n, i, abstractReciprocityNormMap, + abstractReciprocityInclusion, transferNormNaturalityIntermediateInclusion, + AddMonoidHom.comp_apply] using + (congrArg (fun f => f x) hcomm).symm + have hright : ∀ x, p (r x) = r₁ (q x) := by + intro x + have hcomm := D.finiteReciprocityNaturality_restriction_norm_commutes + A v hAxiom EKK M.field L hMK (hLM.trans hMK) hLM + rw [finiteReciprocityNaturalityNormMap_sameBase_eq_normProjection, + finiteReciprocityNaturalityRestriction_sameBase_eq_restriction] at hcomm + simpa only [r, r₁, p, q, AddMonoidHom.comp_apply] using + congrArg (fun f => f x) hcomm + exact ⟨hq, hleft, hright⟩ + +/-- The third reduction: the reciprocity homomorphism is +bijective for every cyclic finite Galois extension, by splitting it into +its maximal unramified and totally ramified parts. -/ +theorem abstractReciprocity_cyclic_finiteReciprocityHom_bijective + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) (L : FiniteGaloisSubextension K.field) + [hCyclic : IsCyclic L.extensionQuotient] : + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + Function.Bijective + (D.finiteReciprocityHom A v hAxiom K L.field L.below) := by + let : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + let S := L.inertiaImage D + let M := L.maximalUnramifiedSubextension D + let hLM : L.field.toSubgroup ≤ M.toSubgroup := + L.field_le_intermediateField S + let hMK : M.toSubgroup ≤ K.field.toSubgroup := + L.intermediateField_le_base S + let hLnormal : + (extensionSubgroup K.field L.field (hLM.trans hMK)).Normal := by + simpa only using L.normal + let hLfinite : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field (hLM.trans hMK)) := by + simpa only using L.finite + let hMnormal : (extensionSubgroup K.field M hMK).Normal := + L.intermediateField_normal S inferInstance + let hMfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field M hMK) := + L.intermediateField_finite S + let hLMnormal : (extensionSubgroup M L.field hLM).Normal := + L.extensionSubgroup_over_intermediate_normal S + let hLMfinite : Finite + (M.toSubgroup ⧸ extensionSubgroup M L.field hLM) := + L.extension_over_intermediate_finite S + let hMabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) M (le_baseField M)) := + FiniteGaloisSubextension.finite_extension_trans hMK (le_baseField K.field) + let MF : FiniteAbstractField G := ⟨M, hMabsolute⟩ + let hLowerCyclic : IsCyclic + (M.toSubgroup ⧸ extensionSubgroup M L.field hLM) := + L.lowerQuotient_isCyclic S + obtain ⟨g, hg⟩ := IsCyclic.exists_generator + (α := M.toSubgroup ⧸ extensionSubgroup M L.field hLM) + let Ecyc : FiniteCyclicSubextension MF := + { field := L.field + below := hLM + normal := hLMnormal + finite := hLMfinite + generator := g + generates := hg } + let r₀ := D.finiteReciprocityHom A v hAxiom MF L.field hLM + let r := D.finiteReciprocityHom A v hAxiom K L.field (hLM.trans hMK) + let r₁ := D.finiteReciprocityHom A v hAxiom K M hMK + have hr₀ : Function.Bijective r₀ := + v.abstractReciprocity_cyclicTotallyRamified_finiteReciprocityHom_bijective + hcf hAxiom MF Ecyc + (L.maximalUnramifiedSubextension_isTotallyRamified D) + have hr₁ : Function.Bijective r₁ := + (v.unramifiedReciprocityEquiv hAxiom K M hMK + (L.maximalUnramifiedSubextension_isUnramified D)).bijective + obtain ⟨hpQ, hleft, hright⟩ := + abstractReciprocity_finiteReciprocityHom_diagram + v hAxiom K MF L.field hLM hMK + exact abstractReciprocity_bijective_of_exact_diagram + (MonoidHom.toAdditive + (abstractReciprocityInclusion K.field M L.field hLM hMK)) + (MonoidHom.toAdditive + (abstractReciprocityRestriction K.field M L.field hLM hMK)) + (abstractReciprocityNormMap A K.field M L.field hLM hMK) + (abstractReciprocityNormProjection A K.field M L.field hLM hMK) + r₀ r r₁ + (abstractReciprocity_galois_functionExact K.field M L.field hLM hMK) + (abstractReciprocity_normQuotient_exact A K.field M L.field hLM hMK) + hpQ (L.maximalUnramified_normMap_injective A hcf D) + hleft hright hr₀ hr₁ + +/-- Surjectivity ascends through a normal intermediate field. This is the +diagram chase used in the degree induction of the first reduction. -/ +private theorem abstractReciprocity_finiteReciprocityHom_surjective_of_intermediate + (v : ValuationData D A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) (L : FiniteGaloisSubextension K.field) + (S : Subgroup L.extensionQuotient) [hSnormal : S.Normal] : + let M := L.intermediateField S + let hLM := L.field_le_intermediateField S + let hMK := L.intermediateField_le_base S + letI : (extensionSubgroup K.field M hMK).Normal := + L.intermediateField_normal S hSnormal + letI : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field M hMK) := + L.intermediateField_finite S + letI : (extensionSubgroup M L.field hLM).Normal := + L.extensionSubgroup_over_intermediate_normal S + letI : Finite + (M.toSubgroup ⧸ extensionSubgroup M L.field hLM) := + L.extension_over_intermediate_finite S + letI : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) M (le_baseField M)) := + FiniteGaloisSubextension.finite_extension_trans hMK (le_baseField K.field) + let MF : FiniteAbstractField G := ⟨M, inferInstance⟩ + Function.Surjective + (D.finiteReciprocityHom A v hAxiom MF L.field hLM) → + Function.Surjective + (D.finiteReciprocityHom A v hAxiom K M hMK) → + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + Function.Surjective + (D.finiteReciprocityHom A v hAxiom K L.field L.below) := by + dsimp only + let : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + let M := L.intermediateField S + let hLM := L.field_le_intermediateField S + let hMK := L.intermediateField_le_base S + let hLnormal : + (extensionSubgroup K.field L.field (hLM.trans hMK)).Normal := by + simpa only using L.normal + let hLfinite : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field (hLM.trans hMK)) := by + simpa only using L.finite + let hMnormal : (extensionSubgroup K.field M hMK).Normal := + L.intermediateField_normal S hSnormal + let hMfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field M hMK) := + L.intermediateField_finite S + let hLMnormal : (extensionSubgroup M L.field hLM).Normal := + L.extensionSubgroup_over_intermediate_normal S + let hLMfinite : Finite + (M.toSubgroup ⧸ extensionSubgroup M L.field hLM) := + L.extension_over_intermediate_finite S + let hMabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) M (le_baseField M)) := + FiniteGaloisSubextension.finite_extension_trans hMK (le_baseField K.field) + let MF : FiniteAbstractField G := ⟨M, hMabsolute⟩ + intro hr₀ hr₁ + let r₀ := D.finiteReciprocityHom A v hAxiom MF L.field hLM + let r := D.finiteReciprocityHom A v hAxiom K L.field (hLM.trans hMK) + let r₁ := D.finiteReciprocityHom A v hAxiom K M hMK + obtain ⟨hpQ, hleft, hright⟩ := + abstractReciprocity_finiteReciprocityHom_diagram + v hAxiom K MF L.field hLM hMK + exact abstractReciprocity_surjective_of_exact_diagram + (MonoidHom.toAdditive + (abstractReciprocityInclusion K.field M L.field hLM hMK)) + (MonoidHom.toAdditive + (abstractReciprocityRestriction K.field M L.field hLM hMK)) + (abstractReciprocityNormMap A K.field M L.field hLM hMK) + (abstractReciprocityNormProjection A K.field M L.field hLM hMK) + r₀ r r₁ + (abstractReciprocity_normQuotient_exact A K.field M L.field hLM hMK) + hpQ hleft hright hr₀ hr₁ + +section SolvableReciprocity + +local notation "IsSolvable" => Group.IsSolvable + +/-- The degree induction in the first reduction for solvable +Galois groups. In the abelian noncyclic case one cuts out one of the +faithful cyclic coordinates; in the nonabelian case one cuts out the +commutator subgroup. -/ +private theorem abstractReciprocity_solvable_finiteReciprocityHom_surjective + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) (L : FiniteGaloisSubextension K.field) + [hsolvable : IsSolvable L.extensionQuotient] : + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + Function.Surjective + (D.finiteReciprocityHom A v hAxiom K L.field L.below) := by + classical + let : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + let Q := L.extensionQuotient + by_cases hcyclic : IsCyclic Q + · let : IsCyclic Q := hcyclic + exact (v.abstractReciprocity_cyclic_finiteReciprocityHom_bijective + hcf hAxiom K L).2 + have hQnotSubsingleton : ¬ Subsingleton Q := by + intro hQ + let : Subsingleton Q := hQ + exact hcyclic inferInstance + let hQnontrivial : Nontrivial Q := + not_subsingleton_iff_nontrivial.mp hQnotSubsingleton + by_cases hcommutative : IsMulCommutative Q + · let : IsMulCommutative Q := hcommutative + obtain ⟨I, hIfinite, _, _, f, _, hfaithful, hfactorCyclic, + _⟩ := L.exists_cyclicIntermediateFields + let : Fintype I := hIfinite + obtain ⟨q, hq⟩ := exists_ne (1 : Q) + have hnotAll : ¬ ∀ i, f i q = 1 := by + intro hall + have hmem : q ∈ ⨅ i, MonoidHom.ker (f i) := by + rw [Subgroup.mem_iInf] + intro i + exact (MonoidHom.mem_ker).2 (hall i) + rw [hfaithful, Subgroup.mem_bot] at hmem + exact hq hmem + push Not at hnotAll + obtain ⟨i, hi⟩ := hnotAll + let S := MonoidHom.ker (f i) + let hSnormal : S.Normal := inferInstance + have hSneTop : S ≠ ⊤ := by + intro htop + have hmem : q ∈ S := by rw [htop]; trivial + exact hi ((MonoidHom.mem_ker).1 hmem) + let M := L.intermediateField S + let N := L.lowerFiniteGalois S + let U := L.intermediateFiniteGalois S hSnormal + let hMabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) M (le_baseField M)) := + FiniteGaloisSubextension.finite_extension_trans + (L.intermediateField_le_base S) (le_baseField K.field) + let MF : FiniteAbstractField G := ⟨M, hMabsolute⟩ + let hNsolvable : Group.IsSolvable N.extensionQuotient := + Group.isSolvable_of_isSolvable_injective + (f := (L.lowerQuotientEquiv S).toMonoidHom) + (L.lowerQuotientEquiv S).injective + let hUcyclic : IsCyclic U.extensionQuotient := hfactorCyclic i + let : Finite + (MF.field.toSubgroup ⧸ + extensionSubgroup MF.field N.field N.below) := N.finite + let : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field U.field U.below) := U.finite + have hNcard : Nat.card N.extensionQuotient < Nat.card Q := by + calc + Nat.card N.extensionQuotient = Nat.card S := + Nat.card_congr (L.lowerQuotientEquiv S).toEquiv + _ < Nat.card Q := + abstractReciprocity_subgroup_card_lt_of_ne_top S hSneTop + have hrN : Function.Surjective + (D.finiteReciprocityHom A v hAxiom MF N.field N.below) := + abstractReciprocity_solvable_finiteReciprocityHom_surjective + v hcf hAxiom MF N + have hrU : Function.Surjective + (D.finiteReciprocityHom A v hAxiom K U.field U.below) := + (v.abstractReciprocity_cyclic_finiteReciprocityHom_bijective + hcf hAxiom K U).2 + exact abstractReciprocity_finiteReciprocityHom_surjective_of_intermediate + v hAxiom K L S hrN hrU + · let S := commutator Q + let hSnormal : S.Normal := inferInstance + have hSneBot : S ≠ ⊥ := by + intro hbot + apply hcommutative + have hcenter : Subgroup.center Q = ⊤ := + (commutator_eq_bot_iff_center_eq_top Q).1 hbot + let hcommGroup : CommGroup Q := + Group.commGroupOfCenterEqTop hcenter + exact ⟨⟨fun x y => hcommGroup.mul_comm x y⟩⟩ + have hSlt : S < ⊤ := + Group.IsSolvable.commutator_lt_top_of_nontrivial Q + let M := L.intermediateField S + let N := L.lowerFiniteGalois S + let U := L.intermediateFiniteGalois S hSnormal + let hMfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field M + (L.intermediateField_le_base S)) := + L.intermediateField_finite S + let hMabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) M (le_baseField M)) := + FiniteGaloisSubextension.finite_extension_trans + (L.intermediateField_le_base S) (le_baseField K.field) + let MF : FiniteAbstractField G := ⟨M, hMabsolute⟩ + let hNsolvable : Group.IsSolvable N.extensionQuotient := + Group.isSolvable_of_isSolvable_injective + (f := (L.lowerQuotientEquiv S).toMonoidHom) + (L.lowerQuotientEquiv S).injective + let hUpperSolvable : Group.IsSolvable (L.upperQuotient S) := by + change Group.IsSolvable (Q ⧸ S) + infer_instance + let hUsolvable : Group.IsSolvable U.extensionQuotient := + Group.isSolvable_of_isSolvable_injective + (f := (L.upperQuotientEquiv S).symm.toMonoidHom) + (L.upperQuotientEquiv S).symm.injective + let : Finite + (MF.field.toSubgroup ⧸ + extensionSubgroup MF.field N.field N.below) := N.finite + let : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field U.field U.below) := U.finite + have hNcard : Nat.card N.extensionQuotient < Nat.card Q := by + calc + Nat.card N.extensionQuotient = Nat.card S := + Nat.card_congr (L.lowerQuotientEquiv S).toEquiv + _ < Nat.card Q := + abstractReciprocity_subgroup_card_lt_of_ne_top S hSlt.ne + have hUcard : Nat.card U.extensionQuotient < Nat.card Q := by + calc + Nat.card U.extensionQuotient = Nat.card (Q ⧸ S) := + Nat.card_congr (L.upperQuotientEquiv S).symm.toEquiv + _ < Nat.card Q := + abstractReciprocity_quotient_card_lt_of_ne_bot S hSneBot + have hrN : Function.Surjective + (D.finiteReciprocityHom A v hAxiom MF N.field N.below) := + abstractReciprocity_solvable_finiteReciprocityHom_surjective + v hcf hAxiom MF N + have hrU : Function.Surjective + (D.finiteReciprocityHom A v hAxiom K U.field U.below) := + abstractReciprocity_solvable_finiteReciprocityHom_surjective + v hcf hAxiom K U + exact abstractReciprocity_finiteReciprocityHom_surjective_of_intermediate + v hAxiom K L S hrN hrU +termination_by Nat.card L.extensionQuotient +decreasing_by all_goals assumption + +end SolvableReciprocity + +/-- The Sylow step in the first reduction. The norm quotient +need not be known finite here: the unramified cohomology consequence kills every element by the +extension degree, so the Sylow argument is performed inside the finite +cyclic subgroup generated by that element. -/ +theorem abstractReciprocity_finiteReciprocityHom_surjective + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) (L : FiniteGaloisSubextension K.field) : + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + Function.Surjective + (D.finiteReciprocityHom A v hAxiom K L.field L.below) := by + classical + let : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + let r := D.finiteReciprocityHom A v hAxiom K L.field L.below + apply (AddMonoidHom.range_eq_top (f := r)).1 + have hdegreePos : 0 < (L.toFiniteAbstractExtension.degree : ℕ) := + L.toFiniteAbstractExtension.degree.property + apply abstractReciprocity_addSubgroup_eq_top_of_exponent_and_sylow_le + (L.toFiniteAbstractExtension.degree : ℕ) hdegreePos + (finiteNormQuotient_degree_nsmul_eq_zero + A L.toFiniteAbstractExtension) r.range + intro p _ Ptarget x hx + let Psource : Sylow p L.extensionQuotient := default + let S : Subgroup L.extensionQuotient := + (Psource : Subgroup L.extensionQuotient) + let M := L.intermediateField S + let hLM := L.field_le_intermediateField S + let hMK := L.intermediateField_le_base S + let N := L.lowerFiniteGalois S + let hMfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field M hMK) := + L.intermediateField_finite S + let hLMnormal : (extensionSubgroup M L.field hLM).Normal := + L.extensionSubgroup_over_intermediate_normal S + let hLMfinite : Finite + (M.toSubgroup ⧸ extensionSubgroup M L.field hLM) := + L.extension_over_intermediate_finite S + let hMabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) M (le_baseField M)) := + FiniteGaloisSubextension.finite_extension_trans hMK (le_baseField K.field) + let MF : FiniteAbstractField G := ⟨M, hMabsolute⟩ + let EMK : FiniteAbstractFieldExtension G := + { field := MF + base := K + below := hMK + finiteQuotient := hMfinite } + let hNsolvable : Group.IsSolvable N.extensionQuotient := + L.abstractReciprocity_sylow_lowerQuotient_isSolvable Psource + let rLower := D.finiteReciprocityHom A v hAxiom MF L.field hLM + have hrLower : Function.Surjective rLower := + abstractReciprocity_solvable_finiteReciprocityHom_surjective + v hcf hAxiom MF N + have hxNsmul := + L.abstractReciprocity_sylowAddSubgroup_le_intermediateDegree_nsmul_range + Psource Ptarget hx + obtain ⟨y, hy⟩ := hxNsmul + obtain ⟨g, hg⟩ := hrLower + (L.intermediateNormQuotientInclusion A S y) + refine ⟨MonoidHom.toAdditive + (finiteReciprocityNaturalityRestriction K.field M L.field L.field + L.below hLM hMK le_rfl) g, ?_⟩ + have hcomm := D.finiteReciprocityNaturality_restriction_norm_commutes + A v hAxiom EMK L.field L.field + L.below hLM le_rfl + have hrecip : r (MonoidHom.toAdditive + (finiteReciprocityNaturalityRestriction K.field M L.field L.field + L.below hLM hMK le_rfl) g) = + L.intermediateNormMap A S (rLower g) := by + change r (MonoidHom.toAdditive + (finiteReciprocityNaturalityRestriction K.field M L.field L.field + L.below hLM hMK le_rfl) g) = + finiteReciprocityNaturalityNormMap A K.field M L.field L.field + L.below hLM hMK le_rfl (rLower g) + simpa only [r, rLower, AddMonoidHom.comp_apply] using + (congrArg (fun f => f g) hcomm).symm + exact hrecip.trans ((congrArg (L.intermediateNormMap A S) hg).trans + ((L.intermediateNormMap_comp_inclusion A S y).trans hy)) + +/-- The second reduction: for an abelian Galois group, the +cyclic quotient coordinates are jointly faithful, hence the reciprocity +homomorphism is injective. -/ +theorem abstractReciprocity_abelian_finiteReciprocityHom_injective + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) (L : FiniteGaloisSubextension K.field) + [hcommutative : IsMulCommutative L.extensionQuotient] : + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + Function.Injective + (D.finiteReciprocityHom A v hAxiom K L.field L.below) := by + classical + let : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + let EKK : FiniteAbstractFieldExtension G := + { field := K + base := K + below := le_rfl + finiteQuotient := (FiniteGaloisSubextension.refl K.field).finite } + obtain ⟨I, hIfinite, _, _, f, _, hfaithful, hfactorCyclic, + _⟩ := L.exists_cyclicIntermediateFields + let : Fintype I := hIfinite + rw [injective_iff_map_eq_zero] + intro q hq + have hrestriction (i : I) : + L.upperRestrictionHom (MonoidHom.ker (f i)) q.toMul = 1 := by + let S := MonoidHom.ker (f i) + let hSnormal : S.Normal := inferInstance + let M := L.intermediateField S + let hLM := L.field_le_intermediateField S + let hMK := L.intermediateField_le_base S + let U := L.intermediateFiniteGalois S hSnormal + let hMnormal : (extensionSubgroup K.field M hMK).Normal := + L.intermediateField_normal S hSnormal + let hMfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field M hMK) := + L.intermediateField_finite S + let hUcyclic : IsCyclic U.extensionQuotient := hfactorCyclic i + let rFactor := D.finiteReciprocityHom A v hAxiom K M hMK + have hrFactor : Function.Injective rFactor := + (v.abstractReciprocity_cyclic_finiteReciprocityHom_bijective + hcf hAxiom K U).1 + have hcomm := D.finiteReciprocityNaturality_restriction_norm_commutes + A v hAxiom EKK M L.field hMK L.below hLM + rw [finiteReciprocityNaturalityNormMap_sameBase_eq_normProjection, + finiteReciprocityNaturalityRestriction_sameBase_eq_restriction] at hcomm + have hzero : rFactor (MonoidHom.toAdditive + (abstractReciprocityRestriction K.field M L.field hLM hMK) q) = 0 := by + calc + rFactor (MonoidHom.toAdditive + (abstractReciprocityRestriction K.field M L.field hLM hMK) q) = + abstractReciprocityNormProjection A K.field M L.field hLM hMK + (D.finiteReciprocityHom A v hAxiom + K L.field L.below q) := by + simpa only [rFactor, AddMonoidHom.comp_apply] using + (congrArg (fun h => h q) hcomm).symm + _ = 0 := by rw [hq, map_zero] + have hadd : MonoidHom.toAdditive + (abstractReciprocityRestriction K.field M L.field hLM hMK) q = 0 := by + apply hrFactor + simpa only [map_zero] using hzero + have hbridge (z : L.extensionQuotient) : + L.upperRestrictionHom S z = + abstractReciprocityRestriction K.field M L.field hLM hMK z := by + refine QuotientGroup.induction_on z ?_ + intro k + rw [L.upperRestrictionHom_mk, + abstractReciprocityRestriction_mk] + have hmul : + abstractReciprocityRestriction K.field M L.field hLM hMK q.toMul = 1 := + congrArg Additive.toMul hadd + exact (hbridge (show L.extensionQuotient from q.toMul)).trans hmul + have hqone : q.toMul = 1 := + (L.upperRestrictionHom_jointlyFaithful f hfaithful q.toMul).1 + hrestriction + exact Additive.toMul.injective (by simpa using hqone) + +/-- The first reduction: the factor of the finite reciprocity equivalence +through the maximal abelian quotient is bijective. -/ +theorem abstractReciprocity_abelianizedReciprocity_bijective + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) (L : FiniteGaloisSubextension K.field) : + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + Function.Bijective + (D.transferNormNaturalityAbelianizedReciprocity + A v hAxiom K L.field L.below) := by + classical + let : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + let Q := L.extensionQuotient + let S := commutator Q + let hSnormal : S.Normal := inferInstance + let M := L.intermediateField S + let hLM := L.field_le_intermediateField S + let hMK := L.intermediateField_le_base S + let U := L.intermediateFiniteGalois S hSnormal + let hMnormal : (extensionSubgroup K.field M hMK).Normal := + L.intermediateField_normal S hSnormal + let hMfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field M hMK) := + L.intermediateField_finite S + let EKK : FiniteAbstractFieldExtension G := + { field := K + base := K + below := le_rfl + finiteQuotient := (FiniteGaloisSubextension.refl K.field).finite } + let upperEquiv := L.upperQuotientEquiv S + let hUpperCommutative : IsMulCommutative (Q ⧸ S) := by + dsimp only [S] + exact + (Subgroup.Normal.quotient_commutative_iff_commutator_le).2 le_rfl + let hUcommutative : IsMulCommutative U.extensionQuotient := + ⟨⟨fun x y => by + obtain ⟨x', rfl⟩ := upperEquiv.surjective x + obtain ⟨y', rfl⟩ := upperEquiv.surjective y + calc + upperEquiv x' * upperEquiv y' = + upperEquiv (x' * y') := (map_mul upperEquiv x' y').symm + _ = upperEquiv (y' * x') := congrArg upperEquiv + (Std.Commutative.comm + (op := fun a b : Q ⧸ S => a * b) x' y') + _ = upperEquiv y' * upperEquiv x' := map_mul upperEquiv y' x'⟩⟩ + let factor := D.transferNormNaturalityAbelianizedReciprocity + A v hAxiom K L.field L.below + let r := D.finiteReciprocityHom A v hAxiom K L.field L.below + let p := abstractReciprocityNormProjection A K.field M L.field hLM hMK + let rAb := D.finiteReciprocityHom A v hAxiom K M hMK + have hrAb : Function.Injective rAb := + v.abstractReciprocity_abelian_finiteReciprocityHom_injective + hcf hAxiom K U + have hrestrictionEq (q : Q) : + abstractReciprocityRestriction K.field M L.field hLM hMK q = + L.abelianRestrictionHom q := by + refine QuotientGroup.induction_on q ?_ + intro k + rw [abstractReciprocityRestriction_mk] + rfl + have hright (q : Q) : + p (r (Additive.ofMul q)) = + rAb (Additive.ofMul (L.abelianRestrictionHom q)) := by + have hcomm := D.finiteReciprocityNaturality_restriction_norm_commutes + A v hAxiom EKK M L.field hMK L.below hLM + rw [finiteReciprocityNaturalityNormMap_sameBase_eq_normProjection, + finiteReciprocityNaturalityRestriction_sameBase_eq_restriction] at hcomm + have hq := congrArg (fun h => h (Additive.ofMul q)) hcomm + calc + p (r (Additive.ofMul q)) = + rAb (Additive.ofMul + (abstractReciprocityRestriction K.field M L.field hLM hMK q)) := by + change + p (r (Additive.ofMul q)) = + rAb (Additive.ofMul + (abstractReciprocityRestriction K.field M L.field hLM hMK q)) at hq + exact hq + _ = rAb (Additive.ofMul (L.abelianRestrictionHom q)) := by + rw [hrestrictionEq] + constructor + · rw [injective_iff_map_eq_zero] + intro z hz + change factor (Additive.ofMul z.toMul) = 0 at hz + change Additive.ofMul z.toMul = 0 + revert hz + refine QuotientGroup.induction_on z.toMul ?_ + intro q hz + have hrq : r (Additive.ofMul q) = 0 := by + calc + r (Additive.ofMul q) = + factor (Additive.ofMul (Abelianization.of q)) := + (D.transferNormNaturalityAbelianizedReciprocity_of + A v hAxiom K L.field L.below q).symm + _ = 0 := by + change factor (Additive.ofMul (Abelianization.of q)) = 0 at hz + exact hz + have hcommutator : q ∈ commutator Q := + (abstractReciprocity_abelianReduction_kernel + L p r rAb hright hrAb q).1 hrq + have hof : Abelianization.of q = 1 := + (QuotientGroup.eq_one_iff q).2 hcommutator + change Additive.ofMul (Abelianization.of q) = Additive.ofMul 1 + exact congrArg Additive.ofMul hof + · intro b + obtain ⟨q, hq⟩ := + v.abstractReciprocity_finiteReciprocityHom_surjective + hcf hAxiom K L b + refine ⟨Additive.ofMul (Abelianization.of q.toMul), ?_⟩ + calc + factor (Additive.ofMul (Abelianization.of q.toMul)) = + r (Additive.ofMul q.toMul) := + D.transferNormNaturalityAbelianizedReciprocity_of + A v hAxiom K L.field L.below q.toMul + _ = r q := by rw [ofMul_toMul] + _ = b := hq + +end ValuationData + +namespace DegreeData + +/-- **the abstract reciprocity theorem (reciprocity isomorphism).** For a finite Galois +extension `L/K`, the reciprocity homomorphism identifies the abelianized +Galois group with the finite norm quotient. -/ +noncomputable def abstractReciprocityEquiv + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) (L : FiniteGaloisSubextension K.field) : + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + Additive (Abelianization L.extensionQuotient) ≃+ + FiniteNormQuotient A K.field L.field L.below := by + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + let hAxiom := v.classFieldAxiom_implies_unramifiedUnitCohomology hcf + exact AddEquiv.ofBijective + (D.transferNormNaturalityAbelianizedReciprocity + A v hAxiom K L.field L.below) + (v.abstractReciprocity_abelianizedReciprocity_bijective + hcf hAxiom K L) + +/-- On a Galois element, the abstract reciprocity theorem is the reciprocity homomorphism of +the finite reciprocity equivalence. -/ +@[simp] +theorem abstractReciprocityEquiv_apply_of + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) (L : FiniteGaloisSubextension K.field) + (q : L.extensionQuotient) : + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + D.abstractReciprocityEquiv A v hcf K L + (Additive.ofMul (Abelianization.of q)) = + D.finiteReciprocityHom A v (v.classFieldAxiom_implies_unramifiedUnitCohomology hcf) + K L.field L.below + (Additive.ofMul q) := by + let : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + exact D.transferNormNaturalityAbelianizedReciprocity_of + A v (v.classFieldAxiom_implies_unramifiedUnitCohomology hcf) K L.field L.below + q + +/-- The norm-residue symbol `(·, L/K)`, defined in this construction as the inverse +of the reciprocity isomorphism in the abstract reciprocity theorem. -/ +noncomputable def normResidueSymbol + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) (L : FiniteGaloisSubextension K.field) : + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + FiniteNormQuotient A K.field L.field L.below ≃+ + Additive (Abelianization L.extensionQuotient) := by + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + exact (D.abstractReciprocityEquiv A v hcf K L).symm + +/-- The norm-residue symbol sends the reciprocity class of a Galois +element back to its class in the abelianization. -/ +@[simp] +theorem normResidueSymbol_finiteReciprocityHom + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) (L : FiniteGaloisSubextension K.field) + (q : L.extensionQuotient) : + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + D.normResidueSymbol A v hcf K L + (D.finiteReciprocityHom A v (v.classFieldAxiom_implies_unramifiedUnitCohomology hcf) + K L.field L.below + (Additive.ofMul q)) = + Additive.ofMul (Abelianization.of q) := by + let : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + rw [← D.abstractReciprocityEquiv_apply_of A v hcf K L q] + exact (D.abstractReciprocityEquiv A v hcf K L).symm_apply_apply _ + +/-- Reciprocity followed by the norm-residue symbol inverse is the +identity on the finite norm quotient. -/ +@[simp] +theorem abstractReciprocity_normResidueSymbol + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) (L : FiniteGaloisSubextension K.field) : + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + ∀ a : FiniteNormQuotient A K.field L.field L.below, + D.abstractReciprocityEquiv A v hcf K L + (D.normResidueSymbol A v hcf K L a) = a := by + let : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + intro a + exact (D.abstractReciprocityEquiv A v hcf K L).apply_symm_apply a + +end DegreeData + +/-! +# Abstract reciprocity, reciprocity naturality: the three naturality diagrams + +Reciprocity naturality states three diagrams for the norm residue +symbol. Before taking the inverse of reciprocity, their vertical arrows are +exactly the maps already constructed in norm--conjugation and transfer--norm naturality: + +* restriction on Galois groups together with the relative norm; +* conjugation on both sides; +* transfer together with inclusion of fixed elements. + +This file applies abelianization to the Galois arrows and combines each pair +of vertical arrows into one map between the products +`Additive G(L/K)ᵃᵇ × A_K/N_{L/K}A_L`. The formulas on quotient +representatives are proved from the actual maps. Finally, the abstract reciprocity theorem and +norm--conjugation and transfer--norm naturality turn those reciprocity squares into the three +printed +commutative diagrams for the inverse norm-residue symbol. +-/ + +noncomputable +section + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +/-- A commutative square of additive isomorphisms remains commutative after +replacing both horizontal isomorphisms by their inverses. -/ +private theorem normResidueNaturality_symm_naturality + {Q B Q' B' : Type*} + [AddCommGroup Q] [AddCommGroup B] + [AddCommGroup Q'] [AddCommGroup B'] + (r : Q ≃+ B) (r' : Q' ≃+ B') + (q : Q →+ Q') (b : B →+ B') + (h : b.comp r.toAddMonoidHom = + r'.toAddMonoidHom.comp q) : + q.comp r.symm.toAddMonoidHom = + r'.symm.toAddMonoidHom.comp b := by + apply AddMonoidHom.ext + intro x + apply r'.injective + change r' (q (r.symm x)) = r' (r'.symm (b x)) + rw [r'.apply_symm_apply] + have hx := DFunLike.congr_fun h (r.symm x) + change b (r (r.symm x)) = r' (q (r.symm x)) at hx + rw [r.apply_symm_apply] at hx + exact hx.symm + +/-! ## The norm/restriction diagram -/ + +/-- Restriction in the first diagram of reciprocity naturality, after applying +abelianization. -/ +def normResidueNaturalityAbelianizedRestriction + {G : Type*} [Group G] [TopologicalSpace G] + (K K' L L' : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + [hL'normal : (extensionSubgroup K' L' hL'K').Normal] : + Abelianization + (K'.toSubgroup ⧸ extensionSubgroup K' L' hL'K') →* + Abelianization (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + Abelianization.map + (finiteReciprocityNaturalityRestriction K K' L L' hLK hL'K' hK'K hL'L) + +/-- +Establishes the identity `normResidueNaturalityAbelianizedRestriction K K' L L' hLK hL'K' hK'K +hL'L (Abelianization.of (QuotientGroup.mk k')) = Abelianization.of (QuotientGroup.mk +(Subgroup.inclusion hK'K k'))`. +-/ +@[simp] +theorem normResidueNaturalityAbelianizedRestriction_of_mk + {G : Type*} [Group G] [TopologicalSpace G] + (K K' L L' : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + [hL'normal : (extensionSubgroup K' L' hL'K').Normal] + (k' : K'.toSubgroup) : + normResidueNaturalityAbelianizedRestriction K K' L L' + hLK hL'K' hK'K hL'L + (Abelianization.of (QuotientGroup.mk k')) = + Abelianization.of + (QuotientGroup.mk (Subgroup.inclusion hK'K k')) := by + change + (Abelianization.lift + (Abelianization.of.comp + (finiteReciprocityNaturalityRestriction K K' L L' + hLK hL'K' hK'K hL'L))) + (Abelianization.of (QuotientGroup.mk k')) = _ + rw [Abelianization.lift_apply_of] + rfl + +/-- The two vertical arrows of the first diagram, assembled into one actual +additive homomorphism. Its second component is `N_{K'/K}` on finite norm +quotients from norm--conjugation naturality. -/ +def normResidueNaturalityNormRestrictionPairMap + (A : Rep ℤ G) + (K K' L L' : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + [hL'normal : (extensionSubgroup K' L' hL'K').Normal] + [hLKfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [hL'K'finite : Finite + (K'.toSubgroup ⧸ extensionSubgroup K' L' hL'K')] + [hK'Kfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K K' hK'K)] : + Additive (Abelianization + (K'.toSubgroup ⧸ extensionSubgroup K' L' hL'K')) × + FiniteNormQuotient A K' L' hL'K' →+ + Additive (Abelianization + (K.toSubgroup ⧸ extensionSubgroup K L hLK)) × + FiniteNormQuotient A K L hLK := + AddMonoidHom.prodMap + (MonoidHom.toAdditive + (normResidueNaturalityAbelianizedRestriction K K' L L' + hLK hL'K' hK'K hL'L)) + (finiteReciprocityNaturalityNormMap A K K' L L' + hLK hL'K' hK'K hL'L) + +/-- +On representatives, norm-restriction naturality applies subgroup inclusion to the Galois class and +relative norm to the field element. +-/ +@[simp] +theorem normResidueNaturalityNormRestrictionPairMap_on_representatives + (A : Rep ℤ G) + (K K' L L' : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + [hL'normal : (extensionSubgroup K' L' hL'K').Normal] + [hLKfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [hL'K'finite : Finite + (K'.toSubgroup ⧸ extensionSubgroup K' L' hL'K')] + [hK'Kfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K K' hK'K)] + (k' : K'.toSubgroup) (a : ambientFixedAddSubgroup A K') : + normResidueNaturalityNormRestrictionPairMap A K K' L L' + hLK hL'K' hK'K hL'L + (Additive.ofMul (Abelianization.of (QuotientGroup.mk k')), + finiteNormClass A K' L' hL'K' a) = + (Additive.ofMul + (Abelianization.of + (QuotientGroup.mk (Subgroup.inclusion hK'K k'))), + finiteNormClass A K L hLK (relativeNorm A K K' hK'K a)) := by + ext + · exact normResidueNaturalityAbelianizedRestriction_of_mk + K K' L L' hLK hL'K' hK'K hL'L k' + · exact finiteReciprocityNaturalityNormMap_finiteNormClass A K K' L L' + hLK hL'K' hK'K hL'L a + +/-! ## The conjugation diagram -/ + +/-- The right vertical isomorphism `σ*` in the second diagram of +reciprocity naturality, obtained by abelianizing the actual conjugation isomorphism +from norm--conjugation naturality. -/ +noncomputable def normResidueNaturalityAbelianizedConjugation + {G : Type*} [Group G] [TopologicalSpace G] [ContinuousMul G] + (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) (s : G) + [hLnormal : (extensionSubgroup K L hLK).Normal] : + Abelianization (K.toSubgroup ⧸ extensionSubgroup K L hLK) ≃* + Abelianization + ((conjugateClosedSubgroup K s).toSubgroup ⧸ + extensionSubgroup (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) := + (finiteReciprocityNaturalityConjugation K L hLK s).abelianizationCongr + +/-- +Establishes the identity `normResidueNaturalityAbelianizedConjugation K L hLK s (Abelianization.of +(QuotientGroup.mk k)) = Abelianization.of (QuotientGroup.mk (conjugateSubgroupEquiv K s k))`. +-/ +@[simp] +theorem normResidueNaturalityAbelianizedConjugation_of_mk + {G : Type*} [Group G] [TopologicalSpace G] [ContinuousMul G] + (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) (s : G) + [hLnormal : (extensionSubgroup K L hLK).Normal] + (k : K.toSubgroup) : + normResidueNaturalityAbelianizedConjugation K L hLK s + (Abelianization.of (QuotientGroup.mk k)) = + Abelianization.of + (QuotientGroup.mk (conjugateSubgroupEquiv K s k)) := by + calc + normResidueNaturalityAbelianizedConjugation K L hLK s + (Abelianization.of (QuotientGroup.mk k)) = + Abelianization.of + (finiteReciprocityNaturalityConjugation K L hLK s (QuotientGroup.mk k)) := + abelianizationCongr_of (finiteReciprocityNaturalityConjugation K L hLK s) + (QuotientGroup.mk k) + _ = Abelianization.of + (QuotientGroup.mk (conjugateSubgroupEquiv K s k)) := by + rw [finiteReciprocityNaturalityConjugation_mk] + +/-- The two vertical conjugation arrows in reciprocity naturality, assembled into +one additive homomorphism. The second component is the actual descended +map `a ↦ a^s` from norm--conjugation naturality. -/ +def normResidueNaturalityConjugationPairMap + [ContinuousMul G] + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) (s : G) + [hLnormal : (extensionSubgroup K L hLK).Normal] + [hLfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + let hConjLK := conjugateClosedSubgroup_mono hLK s + letI : Finite ((conjugateClosedSubgroup K s).toSubgroup ⧸ + extensionSubgroup (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) hConjLK) := + finite_conjugateExtension K L hLK s + Additive (Abelianization + (K.toSubgroup ⧸ extensionSubgroup K L hLK)) × + FiniteNormQuotient A K L hLK →+ + Additive (Abelianization + ((conjugateClosedSubgroup K s).toSubgroup ⧸ + extensionSubgroup (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) hConjLK)) × + FiniteNormQuotient A (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) hConjLK := by + dsimp only + letI : Finite ((conjugateClosedSubgroup K s).toSubgroup ⧸ + extensionSubgroup (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) := + finite_conjugateExtension K L hLK s + exact AddMonoidHom.prodMap + (MonoidHom.toAdditive + (normResidueNaturalityAbelianizedConjugation K L hLK s).toMonoidHom) + (finiteReciprocityNaturalityConjugationNormMap A K L hLK s) + +/-- +On representatives, the conjugation pair map conjugates both the Galois class and the fixed-field +element. +-/ +@[simp] +theorem normResidueNaturalityConjugationPairMap_on_representatives + [ContinuousMul G] + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) (s : G) + [hLnormal : (extensionSubgroup K L hLK).Normal] + [hLfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (k : K.toSubgroup) (a : ambientFixedAddSubgroup A K) : + let hConjLK := conjugateClosedSubgroup_mono hLK s + letI : Finite ((conjugateClosedSubgroup K s).toSubgroup ⧸ + extensionSubgroup (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) hConjLK) := + finite_conjugateExtension K L hLK s + normResidueNaturalityConjugationPairMap A K L hLK s + (Additive.ofMul (Abelianization.of (QuotientGroup.mk k)), + finiteNormClass A K L hLK a) = + (Additive.ofMul + (Abelianization.of + (QuotientGroup.mk (conjugateSubgroupEquiv K s k))), + finiteNormClass A (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) hConjLK + (conjugateFixedElement A K s a)) := by + dsimp only + let : Finite ((conjugateClosedSubgroup K s).toSubgroup ⧸ + extensionSubgroup (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) := + finite_conjugateExtension K L hLK s + ext + · exact normResidueNaturalityAbelianizedConjugation_of_mk K L hLK s k + · exact finiteReciprocityNaturalityConjugationNormMap_finiteNormClass + A K L hLK s a + +/-! ## The inclusion/transfer diagram -/ + +/-- The two upward arrows in the third diagram of reciprocity naturality. The +first component is Mathlib's actual transfer, transported to +`G(L/K')ᵃᵇ` in transfer--norm naturality; the second is inclusion +`A_K → A_{K'}` descended to finite norm quotients. -/ +def normResidueNaturalityTransferInclusionPairMap + (A : Rep ℤ G) (K K' L : ClosedSubgroup G) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLK'.trans hK'K)).Normal] + [hLfinite : Finite + (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))] : + letI : (extensionSubgroup K' L hLK').Normal := + transferNormNaturality_intermediateExtension_normal K K' L hLK' hK'K + letI : Finite + (K'.toSubgroup ⧸ extensionSubgroup K' L hLK') := + Finite.of_injective + (transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K) + (transferNormNaturalityIntermediateInclusion_injective + K K' L hLK' hK'K) + Additive (Abelianization + (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))) × + FiniteNormQuotient A K L (hLK'.trans hK'K) →+ + Additive (Abelianization + (K'.toSubgroup ⧸ extensionSubgroup K' L hLK')) × + FiniteNormQuotient A K' L hLK' := by + letI : (extensionSubgroup K' L hLK').Normal := + transferNormNaturality_intermediateExtension_normal K K' L hLK' hK'K + letI : Finite + (K'.toSubgroup ⧸ extensionSubgroup K' L hLK') := + Finite.of_injective + (transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K) + (transferNormNaturalityIntermediateInclusion_injective + K K' L hLK' hK'K) + exact AddMonoidHom.prodMap + (MonoidHom.toAdditive + (transferNormNaturalityTransfer K K' L hLK' hK'K)) + (transferNormNaturalityNormQuotientInclusion A K K' L hLK' hK'K) + +/-- +On representatives, the transfer-inclusion pair map applies transfer to the Galois class and +fixed-field inclusion to the norm class. +-/ +@[simp] +theorem normResidueNaturalityTransferInclusionPairMap_on_representatives + (A : Rep ℤ G) (K K' L : ClosedSubgroup G) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLK'.trans hK'K)).Normal] + [hLfinite : Finite + (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))] + (σ : K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K)) + (a : ambientFixedAddSubgroup A K) : + letI : (extensionSubgroup K' L hLK').Normal := + transferNormNaturality_intermediateExtension_normal K K' L hLK' hK'K + letI : Finite + (K'.toSubgroup ⧸ extensionSubgroup K' L hLK') := + Finite.of_injective + (transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K) + (transferNormNaturalityIntermediateInclusion_injective + K K' L hLK' hK'K) + normResidueNaturalityTransferInclusionPairMap A K K' L hLK' hK'K + (Additive.ofMul (Abelianization.of σ), + finiteNormClass A K L (hLK'.trans hK'K) a) = + (Additive.ofMul + (transferNormNaturalityTransfer K K' L hLK' hK'K + (Abelianization.of σ)), + finiteNormClass A K' L hLK' + (fixedFieldInclusion A K K' hK'K a)) := by + let : (extensionSubgroup K' L hLK').Normal := + transferNormNaturality_intermediateExtension_normal K K' L hLK' hK'K + let : Finite + (K'.toSubgroup ⧸ extensionSubgroup K' L hLK') := + Finite.of_injective + (transferNormNaturalityIntermediateInclusion K K' L hLK' hK'K) + (transferNormNaturalityIntermediateInclusion_injective + K K' L hLK' hK'K) + ext + · rfl + · exact transferNormNaturality_normQuotientInclusion_finiteNormClass + A K K' L hLK' hK'K a + +/-! ## The three norm-residue diagrams -/ + +namespace DegreeData + +/-- **Reciprocity naturality, first diagram.** The norm-residue symbol +commutes with restriction on Galois groups and the relative norm on norm +quotients. -/ +theorem normResidueNaturality_norm_restriction + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (T : FiniteAbstractFieldExtension G) (L L' : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ T.base.field.toSubgroup) + (hL'K' : L'.toSubgroup ≤ T.field.field.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLnormal : (extensionSubgroup T.base.field L hLK).Normal] + [hL'normal : (extensionSubgroup T.field.field L' hL'K').Normal] + [hLKfinite : Finite + (T.base.field.toSubgroup ⧸ extensionSubgroup T.base.field L hLK)] + [hL'K'finite : Finite + (T.field.field.toSubgroup ⧸ + extensionSubgroup T.field.field L' hL'K')] : + let E : FiniteGaloisSubextension T.base.field := + ⟨L, hLK, hLnormal, hLKfinite⟩ + let E' : FiniteGaloisSubextension T.field.field := + ⟨L', hL'K', hL'normal, hL'K'finite⟩ + (MonoidHom.toAdditive + (normResidueNaturalityAbelianizedRestriction + T.base.field T.field.field L L' + hLK hL'K' T.below hL'L)).comp + (D.normResidueSymbol A v hcf T.field E').toAddMonoidHom = + (D.normResidueSymbol A v hcf T.base E).toAddMonoidHom.comp + (finiteReciprocityNaturalityNormMap A + T.base.field T.field.field L L' + hLK hL'K' T.below hL'L) := by + dsimp only + let E : FiniteGaloisSubextension T.base.field := + ⟨L, hLK, hLnormal, hLKfinite⟩ + let E' : FiniteGaloisSubextension T.field.field := + ⟨L', hL'K', hL'normal, hL'K'finite⟩ + let q := MonoidHom.toAdditive + (normResidueNaturalityAbelianizedRestriction + T.base.field T.field.field L L' + hLK hL'K' T.below hL'L) + let b := finiteReciprocityNaturalityNormMap A + T.base.field T.field.field L L' hLK hL'K' T.below hL'L + have hRec : + b.comp (D.abstractReciprocityEquiv A v hcf T.field E').toAddMonoidHom = + (D.abstractReciprocityEquiv A v hcf T.base E).toAddMonoidHom.comp q := by + apply AddMonoidHom.ext + intro x + change b (D.abstractReciprocityEquiv A v hcf T.field E' + (Additive.ofMul x.toMul)) = + D.abstractReciprocityEquiv A v hcf T.base E + (q (Additive.ofMul x.toMul)) + refine QuotientGroup.induction_on x.toMul ?_ + intro z + change b (D.abstractReciprocityEquiv A v hcf T.field E' + (Additive.ofMul (Abelianization.of z))) = + D.abstractReciprocityEquiv A v hcf T.base E + (Additive.ofMul (Abelianization.of + (finiteReciprocityNaturalityRestriction + T.base.field T.field.field L L' + hLK hL'K' T.below hL'L z))) + rw [D.abstractReciprocityEquiv_apply_of A v hcf T.field E' z] + rw [D.abstractReciprocityEquiv_apply_of A v hcf T.base E + (finiteReciprocityNaturalityRestriction + T.base.field T.field.field L L' + hLK hL'K' T.below hL'L z)] + have h := D.finiteReciprocityNaturality_restriction_norm_commutes + A v (v.classFieldAxiom_implies_unramifiedUnitCohomology hcf) + T L L' hLK hL'K' hL'L + exact DFunLike.congr_fun h (Additive.ofMul z) + exact normResidueNaturality_symm_naturality + (D.abstractReciprocityEquiv A v hcf T.field E') + (D.abstractReciprocityEquiv A v hcf T.base E) q b hRec + +/-- **Reciprocity naturality, second diagram.** The norm-residue symbol +commutes with conjugation of the extension and of norm classes. -/ +theorem normResidueNaturality_conjugation + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) (L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.field.toSubgroup) (s : G) + [hLnormal : (extensionSubgroup K.field L hLK).Normal] + [hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] : + let Ks := K.conjugate s + let Ls := conjugateClosedSubgroup L s + let hLsKs := conjugateClosedSubgroup_mono hLK s + letI : Finite (Ks.field.toSubgroup ⧸ + extensionSubgroup Ks.field Ls hLsKs) := + finite_conjugateExtension K.field L hLK s + let E : FiniteGaloisSubextension K.field := + ⟨L, hLK, hLnormal, hLfinite⟩ + let Es : FiniteGaloisSubextension Ks.field := + ⟨Ls, hLsKs, inferInstance, inferInstance⟩ + (MonoidHom.toAdditive + (normResidueNaturalityAbelianizedConjugation + K.field L hLK s).toMonoidHom).comp + (D.normResidueSymbol A v hcf K E).toAddMonoidHom = + (D.normResidueSymbol A v hcf Ks Es).toAddMonoidHom.comp + (finiteReciprocityNaturalityConjugationNormMap A K.field L hLK s) := by + dsimp only + let hLsfinite : Finite + ((conjugateClosedSubgroup K.field s).toSubgroup ⧸ + extensionSubgroup (conjugateClosedSubgroup K.field s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) := + finite_conjugateExtension K.field L hLK s + let Ks := K.conjugate s + let E : FiniteGaloisSubextension K.field := + ⟨L, hLK, hLnormal, hLfinite⟩ + let Es : FiniteGaloisSubextension Ks.field := + ⟨conjugateClosedSubgroup L s, conjugateClosedSubgroup_mono hLK s, + inferInstance, hLsfinite⟩ + let q := MonoidHom.toAdditive + (normResidueNaturalityAbelianizedConjugation K.field L hLK s).toMonoidHom + let b := finiteReciprocityNaturalityConjugationNormMap A K.field L hLK s + have hRec : + b.comp (D.abstractReciprocityEquiv A v hcf K E).toAddMonoidHom = + (D.abstractReciprocityEquiv A v hcf Ks Es).toAddMonoidHom.comp q := by + apply AddMonoidHom.ext + intro x + change b (D.abstractReciprocityEquiv A v hcf K E + (Additive.ofMul x.toMul)) = + D.abstractReciprocityEquiv A v hcf Ks Es + (q (Additive.ofMul x.toMul)) + refine QuotientGroup.induction_on x.toMul ?_ + intro z + change b (D.abstractReciprocityEquiv A v hcf K E + (Additive.ofMul (Abelianization.of z))) = + D.abstractReciprocityEquiv A v hcf Ks Es + (Additive.ofMul (Abelianization.of + (finiteReciprocityNaturalityConjugation K.field L hLK s z))) + rw [D.abstractReciprocityEquiv_apply_of A v hcf K E z] + rw [D.abstractReciprocityEquiv_apply_of A v hcf + Ks Es + (finiteReciprocityNaturalityConjugation K.field L hLK s z)] + have h := D.finiteReciprocityNaturality_conjugation_commutes + A v (v.classFieldAxiom_implies_unramifiedUnitCohomology hcf) K L hLK s + exact DFunLike.congr_fun h (Additive.ofMul z) + exact normResidueNaturality_symm_naturality + (D.abstractReciprocityEquiv A v hcf K E) + (D.abstractReciprocityEquiv A v hcf Ks Es) q b hRec + +/-- **Reciprocity naturality, third diagram.** The norm-residue symbol +commutes with transfer on abelianized Galois groups and inclusion on norm +quotients. -/ +theorem normResidueNaturality_transfer_inclusion + (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) + (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (T : FiniteAbstractFieldExtension G) (L : ClosedSubgroup G) + (hLK' : L.toSubgroup ≤ T.field.field.toSubgroup) + [hLnormal : + (extensionSubgroup T.base.field L (hLK'.trans T.below)).Normal] + [hLfinite : Finite + (T.base.field.toSubgroup ⧸ + extensionSubgroup T.base.field L (hLK'.trans T.below))] : + letI : (extensionSubgroup T.field.field L hLK').Normal := + transferNormNaturality_intermediateExtension_normal + T.base.field T.field.field L hLK' T.below + letI : Finite + (T.field.field.toSubgroup ⧸ + extensionSubgroup T.field.field L hLK') := + Finite.of_injective + (transferNormNaturalityIntermediateInclusion + T.base.field T.field.field L hLK' T.below) + (transferNormNaturalityIntermediateInclusion_injective + T.base.field T.field.field L hLK' T.below) + let E : FiniteGaloisSubextension T.base.field := + ⟨L, hLK'.trans T.below, hLnormal, hLfinite⟩ + let E' : FiniteGaloisSubextension T.field.field := + ⟨L, hLK', inferInstance, inferInstance⟩ + (MonoidHom.toAdditive + (transferNormNaturalityTransfer + T.base.field T.field.field L hLK' T.below)).comp + (D.normResidueSymbol A v hcf T.base E).toAddMonoidHom = + (D.normResidueSymbol A v hcf T.field E').toAddMonoidHom.comp + (transferNormNaturalityNormQuotientInclusion A + T.base.field T.field.field L hLK' T.below) := by + dsimp only + let : (extensionSubgroup T.field.field L hLK').Normal := + transferNormNaturality_intermediateExtension_normal + T.base.field T.field.field L hLK' T.below + let : Finite + (T.field.field.toSubgroup ⧸ + extensionSubgroup T.field.field L hLK') := + Finite.of_injective + (transferNormNaturalityIntermediateInclusion + T.base.field T.field.field L hLK' T.below) + (transferNormNaturalityIntermediateInclusion_injective + T.base.field T.field.field L hLK' T.below) + let E : FiniteGaloisSubextension T.base.field := + ⟨L, hLK'.trans T.below, hLnormal, hLfinite⟩ + let E' : FiniteGaloisSubextension T.field.field := + ⟨L, hLK', inferInstance, inferInstance⟩ + let q := MonoidHom.toAdditive + (transferNormNaturalityTransfer + T.base.field T.field.field L hLK' T.below) + let b := transferNormNaturalityNormQuotientInclusion A + T.base.field T.field.field L hLK' T.below + have hRec : + b.comp (D.abstractReciprocityEquiv A v hcf T.base E).toAddMonoidHom = + (D.abstractReciprocityEquiv A v hcf T.field E').toAddMonoidHom.comp q := by + apply AddMonoidHom.ext + intro x + change + b + (D.transferNormNaturalityAbelianizedReciprocity + A v (v.classFieldAxiom_implies_unramifiedUnitCohomology hcf) + T.base L (hLK'.trans T.below) x) = + D.transferNormNaturalityAbelianizedReciprocity + A v (v.classFieldAxiom_implies_unramifiedUnitCohomology hcf) + T.field L hLK' (q x) + have h := congrArg (fun f => f x) + (D.transferNormNaturality A v + (v.classFieldAxiom_implies_unramifiedUnitCohomology hcf) + T L hLK').symm + exact h + exact normResidueNaturality_symm_naturality + (D.abstractReciprocityEquiv A v hcf T.base E) + (D.abstractReciprocityEquiv A v hcf T.field E') q b hRec + +end DegreeData + +end +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedReciprocity.lean new file mode 100644 index 0000000000..e2b83cefcd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedReciprocity.lean @@ -0,0 +1,125 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +/-! +# Abstract reciprocity, maximal-unramified reciprocity + +The maximal-unramified norm-residue symbol is realized by the +valuation--Frobenius map whose restriction to every finite unramified +extension is the inverse of the unramified norm-quotient equivalence. This file first proves that +finite compatibility and then records the two formulas. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFormation + +open ClassFormation CyclicCohomology KummerTheory + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] +variable {D : DegreeData G} {A : Rep ℤ G} + +namespace ValuationData + +/-- On every finite unramified quotient, the maximal-unramified symbol is +the inverse of the actual reciprocity equivalence of the unramified norm-quotient equivalence. +This is the inverse-limit compatibility used to define the infinite symbol. -/ +theorem maximalUnramifiedNormResidueSymbol_finiteRestriction + (v : ValuationData D A) (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) (L : FiniteGaloisSubextension K.field) + (hUnramified : L.IsUnramified D) : + letI : Finite (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + ∀ a : ambientFixedAddSubgroup A K.field, + Additive.ofMul + (DegreeData.finiteUnramifiedRestriction D + (K.toFiniteResidueAbstractField D) L hUnramified + (maximalUnramifiedNormResidueSymbol v K a).toMul) = + (v.unramifiedReciprocityEquiv hAxiom + K L.field L.below hUnramified).symm + (finiteNormClass A K.field L.field L.below a) := by + let : Finite (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + intro a + exact (maximalUnramifiedNormResidueSymbol_finiteRestriction_of_generator v hAxiom + K L hUnramified + (D.finiteReciprocityHom A v hAxiom K L.field L.below) + (v.unramifiedReciprocity_frobenius_image hAxiom + K L.field L.below hUnramified) a).symm + +/-- For a finite unramified extension, the restriction of the +maximal-unramified norm-residue symbol is exactly the finite abstract +norm-residue symbol. This is the source-level bridge from maximal +unramified reciprocity to the finite reciprocity theorem. -/ +theorem normResidueSymbol_finiteNormClass_eq_maximalUnramifiedRestriction + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) (L : FiniteGaloisSubextension K.field) + (hUnramified : L.IsUnramified D) + (a : ambientFixedAddSubgroup A K.field) : + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + D.normResidueSymbol A v hcf K L + (finiteNormClass A K.field L.field L.below a) = + Additive.ofMul + (Abelianization.of + (DegreeData.finiteUnramifiedRestriction D + (K.toFiniteResidueAbstractField D) L hUnramified + (maximalUnramifiedNormResidueSymbol v K a).toMul)) := by + let : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + let hAxiom := + v.classFieldAxiom_implies_unramifiedUnitCohomology hcf + let q := + DegreeData.finiteUnramifiedRestriction D + (K.toFiniteResidueAbstractField D) L hUnramified + (maximalUnramifiedNormResidueSymbol v K a).toMul + have hrestriction := + maximalUnramifiedNormResidueSymbol_finiteRestriction + v hAxiom K L hUnramified a + have hreciprocity : + v.unramifiedReciprocityEquiv hAxiom + K L.field L.below hUnramified + (Additive.ofMul q) = + finiteNormClass A K.field L.field L.below a := by + calc + _ = + v.unramifiedReciprocityEquiv hAxiom + K L.field L.below hUnramified + ((v.unramifiedReciprocityEquiv hAxiom + K L.field L.below hUnramified).symm + (finiteNormClass A K.field L.field L.below a)) := + congrArg + (v.unramifiedReciprocityEquiv hAxiom + K L.field L.below hUnramified) + hrestriction + _ = _ := + (v.unramifiedReciprocityEquiv hAxiom + K L.field L.below hUnramified).apply_symm_apply _ + have hfinite : D.finiteReciprocityHom A v hAxiom K L.field L.below + (Additive.ofMul q) = finiteNormClass A K.field L.field L.below a := + (v.unramifiedReciprocityEquiv_apply hAxiom K L.field L.below hUnramified + (Additive.ofMul q)).symm.trans hreciprocity + exact (congrArg (D.normResidueSymbol A v hcf K L) hfinite.symm).trans + (D.normResidueSymbol_finiteReciprocityHom A v hcf K L q) + +end ValuationData + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean new file mode 100644 index 0000000000..e59b27726a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean @@ -0,0 +1,599 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransfer +/-! +# Abstract reciprocity: the maximal-unramified symbol + +This file constructs the source maps used in maximal-unramified reciprocity. In +particular, the maximal unramified quotient is projected to every finite +unramified Galois quotient, and its Frobenius is sent to the finite +arithmetic Frobenius. The valuation--Frobenius map below is kept as a +candidate until its compatibility with the finite norm-residue symbols has +been proved from the unramified norm-quotient equivalence. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFormation + +open ClassFormation CyclicCohomology KummerTheory + +universe u + +section DegreeOnly + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- Restriction from the maximal unramified Galois group over `K` to the +actual quotient of an unramified Galois extension `L / K`. This construction +does not require the quotient to be finite. -/ +def maximalUnramifiedExtensionRestriction + (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : GaloisSubextension K.field) + (hUnramified : L.IsUnramified D) : + (K.field.toSubgroup ⧸ D.fieldInertiaWithin K.field) →* + L.extensionQuotient := + L.extensionQuotientMulEquiv.symm.toMonoidHom.comp + (QuotientGroup.map (D.fieldInertiaWithin K.field) + (extensionSubgroup K.field L.field L.below) + (MonoidHom.id K.field.toSubgroup) (by + intro k hk + apply (mem_extensionSubgroup_iff K.field L.field L.below k).2 + exact (L.isUnramified_iff_inertia_le D).1 hUnramified ⟨k.2, hk⟩)) + +/-- +Establishes the identity `maximalUnramifiedExtensionRestriction D K L hUnramified +(QuotientGroup.mk k) = L.extensionQuotientMk k`. +-/ +@[simp] +theorem maximalUnramifiedExtensionRestriction_mk + (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : GaloisSubextension K.field) + (hUnramified : L.IsUnramified D) + (k : K.field.toSubgroup) : + maximalUnramifiedExtensionRestriction D K L hUnramified + (QuotientGroup.mk k) = + L.extensionQuotientMk k := by + exact + L.extensionQuotientMulEquiv.symm_apply_eq.mpr + (L.extensionQuotientMk_apply k).symm + +/-- Restriction sends the maximal-unramified Frobenius to the arithmetic +Frobenius of every finite unramified quotient. -/ +@[simp] +theorem maximalUnramifiedRestriction_frobenius + (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : GaloisSubextension K.field) + (hUnramified : L.IsUnramified D) : + maximalUnramifiedExtensionRestriction D K L hUnramified + (D.frobenius K) = + L.extensionQuotientMulEquiv.symm + (D.unramifiedFrobenius K L.field L.below) := by + let φ : K.field.toSubgroup := Classical.choose + (D.normalizedDegree_surjective K + (Multiplicative.ofAdd (1 : ZHat))) + have hφ : D.normalizedDegree K φ = + Multiplicative.ofAdd (1 : ZHat) := + Classical.choose_spec + (D.normalizedDegree_surjective K + (Multiplicative.ofAdd (1 : ZHat))) + have hmk : (QuotientGroup.mk φ : + K.field.toSubgroup ⧸ D.fieldInertiaWithin K.field) = D.frobenius K := by + apply (D.maximalUnramifiedDegreeEquiv K).injective + rw [D.maximalUnramifiedDegreeEquiv_mk, hφ, + D.maximalUnramifiedDegreeEquiv_frobenius] + rw [← hmk, maximalUnramifiedExtensionRestriction_mk D] + symm + exact + L.extensionQuotientMulEquiv.symm_apply_eq.mpr + (L.extensionQuotientMk_apply φ).symm + +/-- Restriction to a bundled finite Galois extension. The named comparison +between the finite and non-finite Galois quotient boundaries is applied here, +once, rather than left to definitional unfolding in every consumer. -/ +def finiteUnramifiedRestriction + (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hUnramified : L.IsUnramified D) : + (K.field.toSubgroup ⧸ D.fieldInertiaWithin K.field) →* + L.extensionQuotient := + L.toGaloisExtensionQuotientMulEquiv.symm.toMonoidHom.comp + (D.maximalUnramifiedExtensionRestriction K L.toGaloisSubextension + (L.isUnramified_toGaloisSubextension D hUnramified)) + +/-- +Establishes the identity `finiteUnramifiedRestriction D K L hUnramified (QuotientGroup.mk k) = +L.extensionQuotientMk k`. +-/ +@[simp] +theorem finiteUnramifiedRestriction_mk + (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hUnramified : L.IsUnramified D) (k : K.field.toSubgroup) : + finiteUnramifiedRestriction D K L hUnramified (QuotientGroup.mk k) = + L.extensionQuotientMk k := by + apply L.extensionQuotientMulEquiv.injective + simp only [finiteUnramifiedRestriction, + FiniteGaloisSubextension.toGaloisExtensionQuotientMulEquiv, MulEquiv.toMonoidHom_eq_coe, + MonoidHom.coe_comp, MonoidHom.coe_coe, Function.comp_apply, + maximalUnramifiedExtensionRestriction_mk, FiniteGaloisSubextension.extensionQuotientMk_apply] + exact L.toGaloisSubextension.extensionQuotientMk_apply k + +/-- +Establishes the identity `finiteUnramifiedRestriction D K L hUnramified (D.frobenius K) = +L.extensionQuotientMulEquiv.symm (D.unramifiedFrobenius K L.field L.below)`. +-/ +@[simp] +theorem finiteUnramifiedRestriction_frobenius + (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hUnramified : L.IsUnramified D) : + finiteUnramifiedRestriction D K L hUnramified (D.frobenius K) = + L.extensionQuotientMulEquiv.symm + (D.unramifiedFrobenius K L.field L.below) := by + rw [finiteUnramifiedRestriction, MonoidHom.comp_apply, + maximalUnramifiedRestriction_frobenius] + apply L.extensionQuotientMulEquiv.injective + simp only [FiniteGaloisSubextension.toGaloisExtensionQuotientMulEquiv, + MulEquiv.toMonoidHom_eq_coe, MonoidHom.coe_coe, MulEquiv.apply_symm_apply] + exact + L.toGaloisSubextension.extensionQuotientMulEquiv.apply_symm_apply + (D.unramifiedFrobenius K L.field L.below) + +private theorem finiteUnramifiedDegreeHom_killsExtension + (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hUnramified : L.IsUnramified D) : + extensionSubgroup K.field L.field L.below ≤ + (((zHatReductionMul + (L.toFiniteAbstractExtension.degree : ℕ) + L.toFiniteAbstractExtension.degree.property).comp + (D.normalizedDegree K)).toMonoidHom).ker := by + let : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := + L.finite + intro k hk + let E := L.toFiniteAbstractExtension + let ER : FiniteResidueAbstractExtension D := + FiniteResidueAbstractExtension.ofInclusion D L.field K L.below + let n := (E.degree : ℕ) + let hn : 0 < n := E.degree.property + have hkL : k.1 ∈ L.field.toSubgroup := + (mem_extensionSubgroup_iff K.field L.field L.below k).1 hk + let l : ER.field.field.toSubgroup := + ⟨k.1, by + simpa [ER, FiniteResidueAbstractExtension.ofInclusion] using hkL⟩ + have hkl : Subgroup.inclusion ER.below l = k := Subtype.ext rfl + have hd := D.frobeniusRestrictionNaturality_normalizedDegree ER l + have hERUnramified : ER.toFiniteAbstractExtension.IsUnramified D := by + simpa [ER, FiniteResidueAbstractExtension.ofInclusion, + FiniteResidueAbstractExtension.toFiniteAbstractExtension, + FiniteGaloisSubextension.IsUnramified, + FiniteGaloisSubextension.toFiniteAbstractExtension] using hUnramified + have hdegree : + (ER.toFiniteAbstractExtension.degree : ℕ) = n := by + change Nat.card ER.toFiniteAbstractExtension.quotient = + Nat.card E.quotient + apply Nat.card_congr + change + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) ≃ + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) + exact Equiv.refl _ + have hresidueDegree : (ER.residueDegree : ℕ) = n := by + exact + (ER.toFiniteAbstractExtension.residueDegree_eq_degree_of_isUnramified + D hERUnramified).trans hdegree + rw [hresidueDegree] at hd + have hd' : + (D.normalizedDegree K (Subgroup.inclusion ER.below l)).toAdd = + n • (D.normalizedDegree ER.field l).toAdd := by + change + (D.normalizedDegree ER.base + (Subgroup.inclusion ER.below l)).toAdd = + n • (D.normalizedDegree ER.field l).toAdd + exact hd + change zHatReductionMul n hn (D.normalizedDegree K k) = 1 + apply Multiplicative.ext + change zHatReduction n hn (D.normalizedDegree K k).toAdd = 0 + rw [← hkl, hd', map_nsmul] + exact ZModModule.char_nsmul_eq_zero n _ + +/-- Normalized degree modulo `[L : K]` on a finite unramified Galois +quotient. -/ +def finiteUnramifiedDegreeHom + (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hUnramified : L.IsUnramified D) : + L.extensionQuotient →* + Multiplicative + (ZMod (L.toFiniteAbstractExtension.degree : ℕ)) := + (QuotientGroup.lift (extensionSubgroup K.field L.field L.below) + (((zHatReductionMul + (L.toFiniteAbstractExtension.degree : ℕ) + L.toFiniteAbstractExtension.degree.property).comp + (D.normalizedDegree K)).toMonoidHom) + (by exact finiteUnramifiedDegreeHom_killsExtension D K L hUnramified)).comp + L.extensionQuotientMulEquiv.toMonoidHom + +/-- +Establishes the identity `finiteUnramifiedDegreeHom D K L hUnramified (L.extensionQuotientMk k) = +zHatReductionMul (L.toFiniteAbstractExtension.degree : ℕ) +L.toFiniteAbstractExtension.degree.property (D.normalizedDegree K k)`. +-/ +theorem finiteUnramifiedDegreeHom_mk + (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hUnramified : L.IsUnramified D) + (k : K.field.toSubgroup) : + finiteUnramifiedDegreeHom D K L hUnramified + (L.extensionQuotientMk k) = + zHatReductionMul + (L.toFiniteAbstractExtension.degree : ℕ) + L.toFiniteAbstractExtension.degree.property + (D.normalizedDegree K k) := by + exact QuotientGroup.lift_mk' (extensionSubgroup K.field L.field L.below) + (finiteUnramifiedDegreeHom_killsExtension D K L hUnramified) k + +/-- +The specified map is surjective: `Function.Surjective (finiteUnramifiedDegreeHom D K L +hUnramified)`. +-/ +theorem finiteUnramifiedDegreeHom_surjective + (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hUnramified : L.IsUnramified D) : + Function.Surjective + (finiteUnramifiedDegreeHom D K L hUnramified) := by + intro z + let E := L.toFiniteAbstractExtension + let n := (E.degree : ℕ) + let hn : 0 < n := E.degree.property + obtain ⟨w, hw⟩ := zHatReduction_surjective n hn z.toAdd + obtain ⟨k, hk⟩ := + D.normalizedDegree_surjective K (Multiplicative.ofAdd w) + refine ⟨L.extensionQuotientMk k, ?_⟩ + rw [finiteUnramifiedDegreeHom_mk D] + apply Multiplicative.ext + change zHatReduction n hn (D.normalizedDegree K k).toAdd = z.toAdd + rw [hk] + exact hw + +/-- For an unramified finite extension, normalized degree modulo the +extension degree is an isomorphism. -/ +def finiteUnramifiedDegreeEquiv + (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hUnramified : L.IsUnramified D) : + L.extensionQuotient ≃* + Multiplicative (ZMod (L.toFiniteAbstractExtension.degree : ℕ)) := by + let E := L.toFiniteAbstractExtension + let n := (E.degree : ℕ) + let hn : 0 < n := E.degree.property + letI : NeZero n := ⟨hn.ne'⟩ + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := + L.finite + apply MulEquiv.ofBijective + (finiteUnramifiedDegreeHom D K L hUnramified) + apply (Nat.bijective_iff_surjective_and_card _).2 + refine ⟨finiteUnramifiedDegreeHom_surjective D + K L hUnramified, ?_⟩ + calc + Nat.card L.extensionQuotient = + Nat.card + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := + Nat.card_congr L.extensionQuotientMulEquiv.toEquiv + _ = + (extensionSubgroup K.field L.field L.below).index := + (Subgroup.index_eq_card _).symm + _ = n := by + change + (extensionSubgroup E.base E.field E.below).index = + (E.degree : ℕ) + exact E.extensionSubgroup_index_eq_degree + _ = Nat.card (ZMod n) := (Nat.card_zmod n).symm + _ = Nat.card (Multiplicative (ZMod n)) := + (Nat.card_congr Multiplicative.toAdd).symm + +/-- The maximal and finite normalized-degree isomorphisms commute with +restriction and reduction modulo `[L : K]`. -/ +theorem finiteUnramifiedDegreeEquiv_restriction + (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hUnramified : L.IsUnramified D) + (x : K.field.toSubgroup ⧸ D.fieldInertiaWithin K.field) : + finiteUnramifiedDegreeEquiv D K L hUnramified + (finiteUnramifiedRestriction D K L hUnramified x) = + zHatReductionMul + (L.toFiniteAbstractExtension.degree : ℕ) + L.toFiniteAbstractExtension.degree.property + (D.maximalUnramifiedDegreeEquiv K x) := by + refine Quotient.inductionOn' x ?_ + intro k + change finiteUnramifiedDegreeHom D K L hUnramified + (L.extensionQuotientMk k) = _ + rw [finiteUnramifiedDegreeHom_mk D, + D.maximalUnramifiedDegreeEquiv_mk] + +/-- The arithmetic Frobenius has finite normalized degree one. -/ +theorem finiteUnramifiedDegreeEquiv_unramifiedFrobenius + (D : DegreeData G) (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hUnramified : L.IsUnramified D) : + finiteUnramifiedDegreeEquiv D K L hUnramified + (L.extensionQuotientMulEquiv.symm + (D.unramifiedFrobenius K L.field L.below)) = + Multiplicative.ofAdd + (1 : ZMod (L.toFiniteAbstractExtension.degree : ℕ)) := by + rw [← finiteUnramifiedRestriction_frobenius D K L hUnramified, + finiteUnramifiedDegreeEquiv_restriction D] + rw [D.maximalUnramifiedDegreeEquiv_frobenius] + apply Multiplicative.ext + rfl + +/-- Profinite exponentiation of the maximal-unramified Frobenius, expressed +through the canonical degree isomorphism with `ℤ̂`. -/ +def maximalUnramifiedFrobeniusPower + (D : DegreeData G) (K : FiniteResidueAbstractField D) (z : ZHat) : + Additive (K.field.toSubgroup ⧸ D.fieldInertiaWithin K.field) := + (D.maximalUnramifiedDegreeEquiv K).toAdditive.symm z + +/-- +Establishes the identity `maximalUnramifiedFrobeniusPower D K 1 = Additive.ofMul (D.frobenius K)`. +-/ +@[simp] +theorem maximalUnramifiedFrobeniusPower_one + (D : DegreeData G) (K : FiniteResidueAbstractField D) : + maximalUnramifiedFrobeniusPower D K 1 = + Additive.ofMul (D.frobenius K) := by + rfl + +end DegreeData + +end DegreeOnly + +section Representation + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] +variable {D : DegreeData G} {A : Rep ℤ G} + +open DegreeData + +namespace ValuationData + +/-- A finite unramified reciprocity homomorphism which sends Frobenius to +the prime class intertwines the canonical valuation and normalized-degree +isomorphisms. This is the generator calculation in the unramified norm-quotient equivalence, +expressed in the normalization needed. -/ +theorem canonicalUnramifiedReciprocity_degree_of_generator + (v : ValuationData D A) + (K : FiniteAbstractField G) (L : FiniteGaloisSubextension K.field) : + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + ∀ (hUnramified : L.IsUnramified D) + (r : Additive L.extensionQuotient →+ + FiniteNormQuotient A K.field L.field L.below) + (_hr : r (Additive.ofMul (D.unramifiedFrobenius + (K.toFiniteResidueAbstractField D) L.field L.below)) = + finiteNormClass A K.field L.field L.below (v.chosenPrimeElement K)) + (q : Additive L.extensionQuotient), + v.canonicalUnramifiedNormQuotientValuation + L.toFiniteAbstractFieldExtension hUnramified + (r q) = + (finiteUnramifiedDegreeEquiv D (K.toFiniteResidueAbstractField D) + L hUnramified + q.toMul).toAdd := by + let : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + intro hUnramified r hr q + let KR := K.toFiniteResidueAbstractField D + let g : Additive L.extensionQuotient := + Additive.ofMul (D.unramifiedFrobenius KR L.field L.below) + let lhs : Additive L.extensionQuotient →+ + ZMod (L.toFiniteAbstractFieldExtension.degree : ℕ) := + (v.canonicalUnramifiedNormQuotientValuation + L.toFiniteAbstractFieldExtension hUnramified).comp r + let rhs : Additive L.extensionQuotient →+ + ZMod (L.toFiniteAbstractFieldExtension.degree : ℕ) := + (finiteUnramifiedDegreeEquiv D + KR L hUnramified).toAdditive.toAddMonoidHom + change lhs q = rhs q + have hgen : lhs g = rhs g := by + change v.canonicalUnramifiedNormQuotientValuation + L.toFiniteAbstractFieldExtension hUnramified + (r g) = + (finiteUnramifiedDegreeEquiv D KR L hUnramified + g.toMul).toAdd + rw [show r g = finiteNormClass A K.field L.field L.below + (v.chosenPrimeElement K) from hr] + change v.canonicalUnramifiedValuationHom + L.toFiniteAbstractFieldExtension + (v.chosenPrimeElement K) = _ + change v.canonicalValueReduction + (L.toFiniteAbstractFieldExtension.degree : ℕ) + _ (v.valuationAt K (v.chosenPrimeElement K)) = _ + exact (congrArg + (v.canonicalValueReduction (L.toFiniteAbstractFieldExtension.degree : ℕ) + L.toFiniteAbstractFieldExtension.degree.property) + (v.valuationAt_chosenPrimeElement K)).trans <| + (v.canonicalValueReduction_one (L.toFiniteAbstractFieldExtension.degree : ℕ) + L.toFiniteAbstractFieldExtension.degree.property).trans <| + congrArg Multiplicative.toAdd + (finiteUnramifiedDegreeEquiv_unramifiedFrobenius D + KR L hUnramified).symm + have hqmem : q ∈ AddSubgroup.zmultiples g := by + rw [show AddSubgroup.zmultiples g = ⊤ from + D.unramifiedFrobenius_zmultiples_eq_top + KR L.field L.below hUnramified] + trivial + obtain ⟨m, hm⟩ := AddSubgroup.mem_zmultiples_iff.mp hqmem + rw [← hm, map_zsmul, map_zsmul, hgen] + +/-- The maximal-unramified norm-residue symbol, given by the +valuation--Frobenius homomorphism. -/ +def maximalUnramifiedNormResidueSymbol + (v : ValuationData D A) + (K : FiniteAbstractField G) : + ambientFixedAddSubgroup A K.field →+ + Additive (K.field.toSubgroup ⧸ D.fieldInertiaWithin K.field) := + (D.maximalUnramifiedDegreeEquiv + (K.toFiniteResidueAbstractField D)).toAdditive.symm.toAddMonoidHom.comp + ((v.valueGroup).subtype.comp (v.valuationAt K)) + +/-- Applying normalized degree to the maximal-unramified symbol recovers the valuation. -/ +@[simp] +theorem maximalUnramifiedNormResidue_degree + (v : ValuationData D A) + (K : FiniteAbstractField G) + (a : ambientFixedAddSubgroup A K.field) : + ((D.maximalUnramifiedDegreeEquiv (K.toFiniteResidueAbstractField D) + (maximalUnramifiedNormResidueSymbol v K a).toMul).toAdd : ZHat) = + (v.valuationAt K a : ZHat) := by + change (D.maximalUnramifiedDegreeEquiv + (K.toFiniteResidueAbstractField D)).toAdditive + ((D.maximalUnramifiedDegreeEquiv + (K.toFiniteResidueAbstractField D)).toAdditive.symm + ((v.valueGroup).subtype (v.valuationAt K a))) = + (v.valuationAt K a : ZHat) + exact (D.maximalUnramifiedDegreeEquiv + (K.toFiniteResidueAbstractField D)).toAdditive.apply_symm_apply + ((v.valueGroup).subtype (v.valuationAt K a)) + +/-- The maximal-unramified symbol is literally the profinite power +`φ_K ^ v_K(a)`. -/ +theorem maximalUnramifiedNormResidue_eq_frobeniusPower + (v : ValuationData D A) + (K : FiniteAbstractField G) + (a : ambientFixedAddSubgroup A K.field) : + maximalUnramifiedNormResidueSymbol v K a = + maximalUnramifiedFrobeniusPower D (K.toFiniteResidueAbstractField D) + (v.valuationAt K a : ZHat) := by + rfl + +/-- At every finite unramified quotient, normalized degree of the +maximal-unramified symbol is valuation reduced modulo the extension degree. -/ +theorem maximalUnramifiedNormResidueSymbol_finiteDegree + (v : ValuationData D A) + (K : FiniteAbstractField G) (L : FiniteGaloisSubextension K.field) + (hUnramified : L.IsUnramified D) + (a : ambientFixedAddSubgroup A K.field) : + (finiteUnramifiedDegreeEquiv D (K.toFiniteResidueAbstractField D) + L hUnramified + (finiteUnramifiedRestriction D + (K.toFiniteResidueAbstractField D) L hUnramified + (maximalUnramifiedNormResidueSymbol v K a).toMul)).toAdd = + zHatReduction + (L.toFiniteAbstractFieldExtension.degree : ℕ) + L.toFiniteAbstractFieldExtension.degree.property + (v.valuationAt K a : ZHat) := by + let KR := K.toFiniteResidueAbstractField D + have h := finiteUnramifiedDegreeEquiv_restriction D + KR L hUnramified + (maximalUnramifiedNormResidueSymbol v K a).toMul + have hv := maximalUnramifiedNormResidue_degree v K a + exact congrArg Multiplicative.toAdd h |>.trans (by + change zHatReduction + (L.toFiniteAbstractFieldExtension.degree : ℕ) + L.toFiniteAbstractFieldExtension.degree.property + ((D.maximalUnramifiedDegreeEquiv KR + (maximalUnramifiedNormResidueSymbol v K a).toMul).toAdd) = _ + rw [hv]) + +/-- The maximal-unramified symbol extends every finite unramified reciprocity map: after +restriction to `G(L/K)`, applying finite reciprocity gives the class of the +original element. This is the non-circular compatibility statement which +identifies the symbol with the inverse-limit norm-residue map. -/ +theorem maximalUnramifiedNormResidueSymbol_finiteReciprocity_of_generator + (v : ValuationData D A) (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : FiniteGaloisSubextension K.field) : + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + ∀ (hUnramified : L.IsUnramified D) + (r : Additive L.extensionQuotient →+ + FiniteNormQuotient A K.field L.field L.below) + (_hr : r (Additive.ofMul (D.unramifiedFrobenius + (K.toFiniteResidueAbstractField D) L.field L.below)) = + finiteNormClass A K.field L.field L.below (v.chosenPrimeElement K)) + (a : ambientFixedAddSubgroup A K.field), + r (Additive.ofMul + (finiteUnramifiedRestriction D + (K.toFiniteResidueAbstractField D) L hUnramified + (maximalUnramifiedNormResidueSymbol v K a).toMul)) = + finiteNormClass A K.field L.field L.below a := by + let : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + intro hUnramified r hr a + apply v.canonicalUnramifiedNormQuotientValuation_injective + hAxiom L.toFiniteAbstractFieldExtension L.normal hUnramified + rw [canonicalUnramifiedReciprocity_degree_of_generator v + K L hUnramified r hr] + change _ = v.canonicalUnramifiedValuationHom + L.toFiniteAbstractFieldExtension a + exact maximalUnramifiedNormResidueSymbol_finiteDegree v + K L hUnramified a + +/-- The finite restriction of the maximal-unramified symbol is the +inverse of finite unramified reciprocity. The map `r` is kept explicit +here so this statement records the uniqueness argument of maximal-unramified reciprocity +without anticipating the final name of the finite reciprocity equivalence: the unramified + norm-quotient equivalence +promotes any reciprocity map with the Frobenius--prime value to an +equivalence, and the preceding compatibility identifies its inverse. -/ +theorem maximalUnramifiedNormResidueSymbol_finiteRestriction_of_generator + (v : ValuationData D A) (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : FiniteGaloisSubextension K.field) : + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + ∀ (hUnramified : L.IsUnramified D) + (r : Additive L.extensionQuotient →+ + FiniteNormQuotient A K.field L.field L.below) + (hr : r (Additive.ofMul (D.unramifiedFrobenius + (K.toFiniteResidueAbstractField D) L.field L.below)) = + finiteNormClass A K.field L.field L.below (v.chosenPrimeElement K)) + (a : ambientFixedAddSubgroup A K.field), + (v.unramifiedReciprocityEquivOfGenerator hAxiom K L.field L.below + hUnramified r hr).symm + (finiteNormClass A K.field L.field L.below a) = + Additive.ofMul + (finiteUnramifiedRestriction D + (K.toFiniteResidueAbstractField D) L hUnramified + (maximalUnramifiedNormResidueSymbol v K a).toMul) := by + let : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + intro hUnramified r hr a + apply (v.unramifiedReciprocityEquivOfGenerator hAxiom K L.field L.below + hUnramified r hr).injective + rw [AddEquiv.apply_symm_apply] + exact (maximalUnramifiedNormResidueSymbol_finiteReciprocity_of_generator v hAxiom + K L hUnramified r hr a).symm + +end ValuationData + +end Representation + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormContinuity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormContinuity.lean new file mode 100644 index 0000000000..81a56c3481 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormContinuity.lean @@ -0,0 +1,100 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology +/-! +# Continuity of norms + +For a finite extension `L / K`, the base change to `L` of a finite Galois +extension `M / K` is finite Galois. Norm transitivity then sends its norm +subgroup into , providing the key continuity input. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFormation + +open ClassFormation CyclicCohomology KummerTheory + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +/-- The norm from a finite extension is continuous for the norm topologies +of its source and target (continuity of norms). -/ +theorem normTopology_norm_continuous + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hLKfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + IsNormContinuous A L K (relativeNorm A K L hLK) := by + unfold IsNormContinuous + let : TopologicalSpace (ambientFixedAddSubgroup A L) := normTopology A L + let : TopologicalSpace (ambientFixedAddSubgroup A K) := normTopology A K + let : IsTopologicalAddGroup (ambientFixedAddSubgroup A L) := + (normFilterBasis A L).isTopologicalAddGroup + let : IsTopologicalAddGroup (ambientFixedAddSubgroup A K) := + (normFilterBasis A K).isTopologicalAddGroup + apply continuous_of_continuousAt_zero (relativeNorm A K L hLK) + rw [ContinuousAt, map_zero] + rw [(normFilterBasis A L).nhds_zero_hasBasis.tendsto_iff + (normFilterBasis A K).nhds_zero_hasBasis] + intro U hU + rcases hU with ⟨M, rfl⟩ + let P : ClosedSubgroup G := L ⊓ M.field + let ML : FiniteGaloisSubextension L := M.baseChange L hLK + let hMKfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K M.field M.below) := M.finite + refine ⟨(FiniteGaloisSubextension.normSubgroup A ML : Set (ambientFixedAddSubgroup A L)), + ⟨ML, rfl⟩, ?_⟩ + intro x hx + change x ∈ FiniteGaloisSubextension.normSubgroup A ML at hx + rcases hx with ⟨a, rfl⟩ + let hMLfinite : Finite + (L.toSubgroup ⧸ extensionSubgroup L P inf_le_left) := ML.finite + let hPKfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K P (inf_le_left.trans hLK)) := + FiniteGaloisSubextension.finite_extension_trans inf_le_left hLK + let hPMfinite : Finite + (M.field.toSubgroup ⧸ + extensionSubgroup M.field P inf_le_right) := + FiniteGaloisSubextension.finite_extension_over_intermediate + (inf_le_left.trans hLK) M.below inf_le_right + let TM : DegreeData.FiniteTower G := { + top := P + middle := M.field + base := K + top_le_middle := inf_le_right + middle_le_base := M.below + finiteTopQuotient := hPMfinite + finiteBaseQuotient := hMKfinite } + let TL : DegreeData.FiniteTower G := { + top := P + middle := L + base := K + top_le_middle := inf_le_left + middle_le_base := hLK + finiteTopQuotient := hMLfinite + finiteBaseQuotient := hLKfinite } + change relativeNorm A K L hLK + (relativeNorm A L P inf_le_left a) ∈ FiniteGaloisSubextension.normSubgroup A M + refine ⟨relativeNorm A M.field P inf_le_right a, ?_⟩ + calc + relativeNorm A K M.field M.below + (relativeNorm A M.field P inf_le_right a) = + relativeNorm A K P (inf_le_right.trans M.below) a := + TM.norm_trans_apply A a + _ = relativeNorm A K P (inf_le_left.trans hLK) a := by + congr 2 + _ = relativeNorm A K L hLK + (relativeNorm A L P inf_le_left a) := + (TL.norm_trans_apply A a).symm + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopology.lean new file mode 100644 index 0000000000..0009c275b8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopology.lean @@ -0,0 +1,331 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Group.TransferInstance +public import Mathlib.Topology.Algebra.FilterBasis +public import Mathlib.Topology.Algebra.Group.ClosedSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.Models +/-! +# Abstract reciprocity: the norm topology + +The neighbourhood basis at zero consists literally of the norm subgroups +`N_{L/K} A_L` as `L / K` ranges over finite Galois extensions. Composita +make this family downward directed. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFormation + +open CyclicCohomology KummerTheory + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace FiniteGaloisSubextension + +variable {K : ClosedSubgroup G} + +/-- The actual norm subgroup belonging to a packaged finite Galois +extension. -/ +def normSubgroup (A : Rep ℤ G) (L : FiniteGaloisSubextension K) : + AddSubgroup (ambientFixedAddSubgroup A K) := by + letI := L.finite + exact finiteNormSubgroup A K L.field L.below + +/-- Proves the bound `normSubgroup A (L₁.compositum L₂) ≤ normSubgroup A L₁`. -/ +theorem normSubgroup_compositum_le_left + (A : Rep ℤ G) (L₁ L₂ : FiniteGaloisSubextension K) : + normSubgroup A (L₁.compositum L₂) ≤ normSubgroup A L₁ := by + simpa [normSubgroup] using + ClassFormation.FiniteGaloisSubextension.finiteNormSubgroup_compositum_le_left A L₁ L₂ + +/-- Proves the bound `normSubgroup A (L₁.compositum L₂) ≤ normSubgroup A L₂`. -/ +theorem normSubgroup_compositum_le_right + (A : Rep ℤ G) (L₁ L₂ : FiniteGaloisSubextension K) : + normSubgroup A (L₁.compositum L₂) ≤ normSubgroup A L₂ := by + simpa [normSubgroup] using + ClassFormation.FiniteGaloisSubextension.finiteNormSubgroup_compositum_le_right A L₁ L₂ + +end FiniteGaloisSubextension + +open FiniteGaloisSubextension + +/-- The additive-group filter basis formed by all finite Galois norm +subgroups. -/ +@[implicit_reducible] +def normFilterBasis (A : Rep ℤ G) (K : ClosedSubgroup G) : + AddGroupFilterBasis (ambientFixedAddSubgroup A K) := + addGroupFilterBasisOfComm + {U | ∃ L : FiniteGaloisSubextension K, + U = (normSubgroup A L : Set (ambientFixedAddSubgroup A K))} + (by + refine ⟨(normSubgroup A (FiniteGaloisSubextension.refl K) : + Set (ambientFixedAddSubgroup A K)), ?_⟩ + exact ⟨FiniteGaloisSubextension.refl K, rfl⟩) + (by + rintro U V ⟨L₁, rfl⟩ ⟨L₂, rfl⟩ + refine ⟨(normSubgroup A (L₁.compositum L₂) : + Set (ambientFixedAddSubgroup A K)), + ⟨L₁.compositum L₂, rfl⟩, ?_⟩ + intro x hx + exact ⟨normSubgroup_compositum_le_left A L₁ L₂ hx, + normSubgroup_compositum_le_right A L₁ L₂ hx⟩) + (by + rintro _ ⟨L, rfl⟩ + exact (normSubgroup A L).zero_mem) + (by + rintro _ ⟨L, rfl⟩ + refine ⟨(normSubgroup A L : Set (ambientFixedAddSubgroup A K)), + ⟨L, rfl⟩, ?_⟩ + rintro x ⟨a, ha, b, hb, rfl⟩ + exact (normSubgroup A L).add_mem ha hb) + (by + rintro _ ⟨L, rfl⟩ + refine ⟨(normSubgroup A L : Set (ambientFixedAddSubgroup A K)), + ⟨L, rfl⟩, ?_⟩ + intro x hx + exact (normSubgroup A L).neg_mem hx) + +/-- The norm topology: norm subgroups form a basis at zero. -/ +@[implicit_reducible] +def normTopology (A : Rep ℤ G) (K : ClosedSubgroup G) : + TopologicalSpace (ambientFixedAddSubgroup A K) := + (normFilterBasis A K).topology + +/-- The fixed subgroup with its norm topology recorded in the type. This is +the public carrier model for norm-topological statements; choosing the norm +topology no longer mutates the topology instance of the underlying group. -/ +def WithNormTopology (A : Rep ℤ G) (K : ClosedSubgroup G) : Type _ := + WithTopology + (ambientFixedAddSubgroup A K) (normTopology A K) + +/-- Installs the norm topology on the `WithNormTopology` carrier. -/ +instance withNormTopology.instTopologicalSpace + (A : Rep ℤ G) (K : ClosedSubgroup G) : + TopologicalSpace (WithNormTopology A K) := by + unfold WithNormTopology + infer_instance + +/-- +Transports the additive commutative group structure to the `WithNormTopology` carrier. +-/ +instance withNormTopology.instAddCommGroup + (A : Rep ℤ G) (K : ClosedSubgroup G) : + AddCommGroup (WithNormTopology A K) := by + unfold WithNormTopology + exact + (WithTopology.equiv + (ambientFixedAddSubgroup A K) (normTopology A K)).addCommGroup + +/-- Forget the norm-topology wrapper without changing the underlying point. -/ +def withNormTopologyEquiv (A : Rep ℤ G) (K : ClosedSubgroup G) : + WithNormTopology A K ≃ ambientFixedAddSubgroup A K := by + unfold WithNormTopology + exact WithTopology.equiv (ambientFixedAddSubgroup A K) (normTopology A K) + +/-- Openness in the norm topology, expressed through the type-level norm +topology model. -/ +def IsNormOpen (A : Rep ℤ G) (K : ClosedSubgroup G) + (s : Set (ambientFixedAddSubgroup A K)) : Prop := + @IsOpen (ambientFixedAddSubgroup A K) (normTopology A K) s + +/-- Closedness in the norm topology, expressed through the type-level norm +topology model. -/ +def IsNormClosed (A : Rep ℤ G) (K : ClosedSubgroup G) + (s : Set (ambientFixedAddSubgroup A K)) : Prop := + @IsClosed (ambientFixedAddSubgroup A K) (normTopology A K) s + +/-- Hausdorffness of the type-level norm-topology model. -/ +def IsNormHausdorff (A : Rep ℤ G) (K : ClosedSubgroup G) : Prop := + T2Space (WithNormTopology A K) + +/-- Continuity from a norm-topological fixed subgroup to an explicitly +topologized target. -/ +def IsContinuousFromNormTopology + (A : Rep ℤ G) (K : ClosedSubgroup G) + {β : Type*} [TopologicalSpace β] + (f : ambientFixedAddSubgroup A K → β) : Prop := + @Continuous (ambientFixedAddSubgroup A K) β (normTopology A K) inferInstance f + +/-- Continuity between two fixed subgroups carrying their norm topologies. -/ +def IsNormContinuous + (A : Rep ℤ G) (L K : ClosedSubgroup G) + (f : ambientFixedAddSubgroup A L → ambientFixedAddSubgroup A K) : Prop := + @Continuous (ambientFixedAddSubgroup A L) (ambientFixedAddSubgroup A K) + (normTopology A L) (normTopology A K) f + +private theorem isNormOpen_iff_raw + (A : Rep ℤ G) (K : ClosedSubgroup G) + (s : Set (ambientFixedAddSubgroup A K)) : + IsNormOpen A K s ↔ + @IsOpen (ambientFixedAddSubgroup A K) (normTopology A K) s := by + rfl + +private theorem isNormClosed_iff_raw + (A : Rep ℤ G) (K : ClosedSubgroup G) + (s : Set (ambientFixedAddSubgroup A K)) : + IsNormClosed A K s ↔ + @IsClosed (ambientFixedAddSubgroup A K) (normTopology A K) s := by + rfl + +private def withNormTopologyHomeomorph + (A : Rep ℤ G) (K : ClosedSubgroup G) : + @Homeomorph (WithNormTopology A K) (ambientFixedAddSubgroup A K) + (inferInstance : TopologicalSpace (WithNormTopology A K)) + (normTopology A K) := by + unfold WithNormTopology + exact WithTopology.homeomorph + +/-- A set belongs to the defining filter basis exactly when it is one of +the finite Galois norm subgroups. -/ +@[simp] +theorem mem_normFilterBasis_iff + (A : Rep ℤ G) (K : ClosedSubgroup G) + (U : Set (ambientFixedAddSubgroup A K)) : + U ∈ normFilterBasis A K ↔ + ∃ L : FiniteGaloisSubextension K, + U = (normSubgroup A L : Set (ambientFixedAddSubgroup A K)) := + Iff.rfl + +/-- A subgroup is open in the norm topology exactly when it contains one +finite Galois norm subgroup. -/ +theorem normTopology_addSubgroup_isOpen_iff + (A : Rep ℤ G) (K : ClosedSubgroup G) + (H : AddSubgroup (ambientFixedAddSubgroup A K)) : + IsNormOpen A K H ↔ + ∃ L : FiniteGaloisSubextension K, normSubgroup A L ≤ H := by + rw [isNormOpen_iff_raw] + let : TopologicalSpace (ambientFixedAddSubgroup A K) := normTopology A K + let : IsTopologicalAddGroup (ambientFixedAddSubgroup A K) := + (normFilterBasis A K).isTopologicalAddGroup + constructor + · intro hH + have hnh : (H : Set (ambientFixedAddSubgroup A K)) ∈ nhds 0 := + hH.mem_nhds H.zero_mem + rcases (normFilterBasis A K).nhds_zero_hasBasis.mem_iff.mp hnh with + ⟨U, hU, hUH⟩ + rcases hU with ⟨L, rfl⟩ + exact ⟨L, hUH⟩ + · rintro ⟨L, hLH⟩ + apply H.isOpen_of_mem_nhds + exact Filter.mem_of_superset + ((normFilterBasis A K).mem_nhds_zero ⟨L, rfl⟩) hLH + +/-- Every defining norm subgroup is open. -/ +theorem normSubgroup_isOpen + (A : Rep ℤ G) (K : ClosedSubgroup G) + (L : FiniteGaloisSubextension K) : + IsNormOpen A K (normSubgroup A L) := by + rw [normTopology_addSubgroup_isOpen_iff] + exact ⟨L, le_rfl⟩ + +/-- The subgroup of universal norms used in Hausdorffness of the norm topology. -/ +def universalNormSubgroup (A : Rep ℤ G) (K : ClosedSubgroup G) : + AddSubgroup (ambientFixedAddSubgroup A K) := + ⨅ L : FiniteGaloisSubextension K, normSubgroup A L + +/-- +Characterizes `a ∈ universalNormSubgroup A K` by the equivalent condition `∀ L : +FiniteGaloisSubextension K, a ∈ normSubgroup A L`. +-/ +@[simp] +theorem mem_universalNormSubgroup_iff + (A : Rep ℤ G) (K : ClosedSubgroup G) + (a : ambientFixedAddSubgroup A K) : + a ∈ universalNormSubgroup A K ↔ + ∀ L : FiniteGaloisSubextension K, a ∈ normSubgroup A L := by + simp [universalNormSubgroup] + +private theorem normTopology_hausdorff_raw + (A : Rep ℤ G) (K : ClosedSubgroup G) : + @T2Space (ambientFixedAddSubgroup A K) (normTopology A K) ↔ + universalNormSubgroup A K = ⊥ := by + let B := normFilterBasis A K + have hsInter : ⋂₀ B.sets = + (universalNormSubgroup A K : Set (ambientFixedAddSubgroup A K)) := by + ext a + constructor + · intro ha + change a ∈ universalNormSubgroup A K + rw [mem_universalNormSubgroup_iff] + intro L + exact ha (normSubgroup A L) ⟨L, rfl⟩ + · intro ha U hU + rcases hU with ⟨L, rfl⟩ + exact (mem_universalNormSubgroup_iff A K a).1 ha L + rw [B.t2Space_iff (t := normTopology A K) rfl, hsInter] + constructor + · intro h + apply SetLike.coe_injective + simpa using h + · intro h + have := congrArg + (fun S : AddSubgroup (ambientFixedAddSubgroup A K) => + (S : Set (ambientFixedAddSubgroup A K))) h + simpa using this + +/-- Hausdorffness of the norm topology: the norm-topology model is Hausdorff +exactly when the universal norm subgroup is trivial. -/ +theorem normTopology_hausdorff + (A : Rep ℤ G) (K : ClosedSubgroup G) : + IsNormHausdorff A K ↔ universalNormSubgroup A K = ⊥ := by + let modelHomeomorph := withNormTopologyHomeomorph A K + constructor + · intro hmodel + let : T2Space (WithNormTopology A K) := hmodel + let : TopologicalSpace (ambientFixedAddSubgroup A K) := normTopology A K + let : T2Space (ambientFixedAddSubgroup A K) := + modelHomeomorph.t2Space + exact (normTopology_hausdorff_raw A K).1 inferInstance + · intro huniversal + let : TopologicalSpace (ambientFixedAddSubgroup A K) := normTopology A K + let : T2Space (ambientFixedAddSubgroup A K) := + (normTopology_hausdorff_raw A K).2 huniversal + exact modelHomeomorph.symm.t2Space + +/-- General norm-topology lemma: once every defining norm quotient is +finite, openness is equivalent to closedness together with finite index. +the norm-subgroup basis characterization supplies the finiteness premise from the abstract + reciprocity theorem. -/ +theorem normTopology_open_iff_closed_finiteIndex_of_finite_normQuotients + (A : Rep ℤ G) (K : ClosedSubgroup G) + (hfinite : ∀ L : FiniteGaloisSubextension K, + Finite (ambientFixedAddSubgroup A K ⧸ normSubgroup A L)) + (H : AddSubgroup (ambientFixedAddSubgroup A K)) : + IsNormOpen A K H ↔ + IsNormClosed A K H ∧ + Finite (ambientFixedAddSubgroup A K ⧸ H) := by + let : TopologicalSpace (ambientFixedAddSubgroup A K) := normTopology A K + let : IsTopologicalAddGroup (ambientFixedAddSubgroup A K) := + (normFilterBasis A K).isTopologicalAddGroup + constructor + · intro hHmodel + have hH := (isNormOpen_iff_raw A K H).1 hHmodel + refine ⟨(isNormClosed_iff_raw A K H).2 (H.isClosed_of_isOpen hH), ?_⟩ + obtain ⟨L, hLH⟩ := + (normTopology_addSubgroup_isOpen_iff A K H).1 hHmodel + let : Finite (ambientFixedAddSubgroup A K ⧸ normSubgroup A L) := + hfinite L + let : (normSubgroup A L).FiniteIndex := + AddSubgroup.finiteIndex_of_finite_quotient + let : H.FiniteIndex := AddSubgroup.finiteIndex_of_le hLH + exact AddSubgroup.finite_quotient_of_finiteIndex + · rintro ⟨hclosedModel, hfin⟩ + have hclosed := (isNormClosed_iff_raw A K H).1 hclosedModel + let : Finite (ambientFixedAddSubgroup A K ⧸ H) := hfin + let : H.FiniteIndex := AddSubgroup.finiteIndex_of_finite_quotient + exact (isNormOpen_iff_raw A K H).2 + (H.isOpen_of_isClosed_of_finiteIndex hclosed) + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopologyCharacterization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopologyCharacterization.lean new file mode 100644 index 0000000000..d67cf8b627 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopologyCharacterization.lean @@ -0,0 +1,66 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ValuationContinuity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormContinuity +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +/-! +# The norm-topology characterization + +This file supplies part (i), whose finite-index assertion uses the actual +reciprocity isomorphism of the abstract reciprocity theorem. Parts (ii)--(iv) are proved in the +imported valuation-, norm-, and norm-topology modules. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFormation + +open ClassFormation CyclicCohomology KummerTheory + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace ValuationData + +variable {D : DegreeData G} {A : Rep ℤ G} + +/-- The norm-subgroup basis characterization: in the norm topology, the open subgroups are +exactly the closed subgroups of finite index. Finiteness of every defining +norm quotient is obtained from the abstract reciprocity theorem, not assumed. -/ +theorem normTopology_open_iff_closed_finiteIndex + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : ClosedSubgroup G) + [hKabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) K (le_baseField K))] + (H : AddSubgroup (ambientFixedAddSubgroup A K)) : + IsNormOpen A K H ↔ + IsNormClosed A K H ∧ + Finite (ambientFixedAddSubgroup A K ⧸ H) := by + apply normTopology_open_iff_closed_finiteIndex_of_finite_normQuotients + A K _ H + intro L + let KF : FiniteAbstractField G := ⟨K, hKabsolute⟩ + let : (extensionSubgroup K L.field L.below).Normal := L.normal + let : Finite + (K.toSubgroup ⧸ extensionSubgroup K L.field L.below) := L.finite + let : Finite (Abelianization L.extensionQuotient) := + Finite.of_surjective Abelianization.of QuotientGroup.mk_surjective + change Finite (FiniteNormQuotient A K L.field L.below) + exact Finite.of_equiv + (Additive (Abelianization L.extensionQuotient)) + (D.abstractReciprocityEquiv A v hcf KF L).toEquiv + +end ValuationData +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ProfiniteAPI.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ProfiniteAPI.lean new file mode 100644 index 0000000000..9b73ddbd9b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ProfiniteAPI.lean @@ -0,0 +1,65 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassField +/-! +# Profinite reciprocity facade + +This module specializes the three principal finite reciprocity endpoints to a +bundled profinite group. The bundle supplies the ambient topology, compactness, +separation, and total disconnectedness instances required by the generic +theorems. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFormation.Profinite + +open CyclicCohomology KummerTheory + +/-- The finite abelian norm-subgroup classification for a bundled profinite +group. This is the thin specialization of the existing generic order +isomorphism; the profinite bundle supplies all ambient topological instances. -/ +noncomputable def normSubgroupOrderIso + (P : ProfiniteGrp) {D : DegreeData P} {A : Rep ℤ P} + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + (K : FiniteAbstractField P) : + FiniteAbelianSubextension K.field ≃o + (FiniteAbelianSubextension.NormOpenAddSubgroup A K.field)ᵒᵈ := + FiniteAbelianSubextension.normSubgroupOrderIso v hcf K + +/-- The class field attached to a norm-open subgroup for a bundled profinite +group. This thin specialization consumes the profinite norm-subgroup facade, +so callers do not enumerate ambient topological instances. -/ +noncomputable def classField + (P : ProfiniteGrp) {D : DegreeData P} {A : Rep ℤ P} + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + (K : FiniteAbstractField P) + (N : FiniteAbelianSubextension.NormOpenAddSubgroup A K.field) : + FiniteAbelianSubextension K.field := + (normSubgroupOrderIso P v hcf K).symm (OrderDual.toDual N) + +/-- The finite norm-residue symbol for a bundled profinite group. This is the +thin specialization of the existing generic symbol; the profinite bundle +supplies all ambient topological instances. -/ +noncomputable def normResidueSymbol + (P : ProfiniteGrp) (D : DegreeData P) (A : Rep ℤ P) + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + (K : FiniteAbstractField P) (L : FiniteGaloisSubextension K.field) : + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := L.finite + FiniteNormQuotient A K.field L.field L.below ≃+ + Additive (Abelianization L.extensionQuotient) := + D.normResidueSymbol A v hcf K L + +end ClassFormation.Profinite diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Reduction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Reduction.lean new file mode 100644 index 0000000000..1c5cb5867a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Reduction.lean @@ -0,0 +1,851 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.IntermediateExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Core +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +/-! # Reduction -/ + +@[expose] public section +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +/-! +# The abstract reciprocity theorem: actual reduction maps + +This file isolates the field- and quotient-theoretic content of the three +reductions. In particular, the Sylow reduction uses an +intermediate field which need not be normal over the base. We therefore +construct its norm map without a normality assumption on the intermediate +extension. + +The reciprocity homomorphisms themselves belong to the finite reciprocity equivalence. The +lemmas below only construct the actual arrows and prove the algebraic diagram +chases which will be applied to those homomorphisms. +-/ + +noncomputable +section + +universe u + +section Representation + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + [IsTopologicalGroup G] + +namespace FiniteGaloisSubextension + +variable {K : ClosedSubgroup G} + +/-- The norm arrow +`A_M / N_{L/M} A_L → A_K / N_{L/K} A_L` for the actual intermediate +field cut out by `S ≤ G(L/K)`. No normality of `M/K` is used. -/ +def intermediateNormMap (A : Rep ℤ G) (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) : + let M := L.intermediateField S + let hLM := L.field_le_intermediateField S + letI : Finite (M.toSubgroup ⧸ extensionSubgroup M L.field hLM) := + L.extension_over_intermediate_finite S + letI : Finite (K.toSubgroup ⧸ extensionSubgroup K L.field L.below) := + L.finite + FiniteNormQuotient A M L.field hLM →+ + FiniteNormQuotient A K L.field L.below := by + let M := L.intermediateField S + let hLM := L.field_le_intermediateField S + let hMK := L.intermediateField_le_base S + letI : Finite (K.toSubgroup ⧸ + extensionSubgroup K L.field L.below) := L.finite + letI : Finite (M.toSubgroup ⧸ + extensionSubgroup M L.field hLM) := + L.extension_over_intermediate_finite S + letI : Finite (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + L.intermediateField_finite S + exact finiteReciprocityNaturalityNormMap A K M L.field L.field + L.below hLM hMK le_rfl + +/-- Representative formula for the nonnormal-intermediate norm arrow. -/ +@[simp] +theorem intermediateNormMap_finiteNormClass (A : Rep ℤ G) + (L : FiniteGaloisSubextension K) (S : Subgroup L.extensionQuotient) + (a : ambientFixedAddSubgroup A (L.intermediateField S)) : + letI : Finite (K.toSubgroup ⧸ + extensionSubgroup K L.field L.below) := L.finite + letI : Finite ((L.intermediateField S).toSubgroup ⧸ + extensionSubgroup (L.intermediateField S) L.field + (L.field_le_intermediateField S)) := + L.extension_over_intermediate_finite S + letI : Finite (K.toSubgroup ⧸ extensionSubgroup K + (L.intermediateField S) (L.intermediateField_le_base S)) := + L.intermediateField_finite S + L.intermediateNormMap A S + (finiteNormClass A (L.intermediateField S) L.field + (L.field_le_intermediateField S) a) = + finiteNormClass A K L.field L.below + (relativeNorm A K (L.intermediateField S) + (L.intermediateField_le_base S) a) := by + let : Finite (K.toSubgroup ⧸ + extensionSubgroup K L.field L.below) := L.finite + let : Finite ((L.intermediateField S).toSubgroup ⧸ + extensionSubgroup (L.intermediateField S) L.field + (L.field_le_intermediateField S)) := + L.extension_over_intermediate_finite S + let : Finite (K.toSubgroup ⧸ extensionSubgroup K + (L.intermediateField S) (L.intermediateField_le_base S)) := + L.intermediateField_finite S + exact finiteReciprocityNaturalityNormMap_finiteNormClass A K + (L.intermediateField S) L.field L.field L.below + (L.field_le_intermediateField S) (L.intermediateField_le_base S) le_rfl a + +/-- Inclusion of fixed elements, descended to the two actual norm +quotients. This is the map `i` in the Sylow argument. -/ +def intermediateNormQuotientInclusion (A : Rep ℤ G) + (L : FiniteGaloisSubextension K) (S : Subgroup L.extensionQuotient) : + letI : Finite (K.toSubgroup ⧸ + extensionSubgroup K L.field L.below) := L.finite + letI : Finite ((L.intermediateField S).toSubgroup ⧸ + extensionSubgroup (L.intermediateField S) L.field + (L.field_le_intermediateField S)) := + L.extension_over_intermediate_finite S + FiniteNormQuotient A K L.field L.below →+ + FiniteNormQuotient A (L.intermediateField S) L.field + (L.field_le_intermediateField S) := by + letI : Finite (K.toSubgroup ⧸ + extensionSubgroup K L.field L.below) := L.finite + letI : (extensionSubgroup K L.field L.below).Normal := L.normal + letI : (extensionSubgroup (L.intermediateField S) L.field + (L.field_le_intermediateField S)).Normal := + L.extensionSubgroup_over_intermediate_normal S + letI : Finite ((L.intermediateField S).toSubgroup ⧸ + extensionSubgroup (L.intermediateField S) L.field + (L.field_le_intermediateField S)) := + L.extension_over_intermediate_finite S + exact transferNormNaturalityNormQuotientInclusion A K (L.intermediateField S) + L.field (L.field_le_intermediateField S) + (L.intermediateField_le_base S) + +/-- Representative formula for the inclusion used in the Sylow +reduction. -/ +@[simp] +theorem intermediateNormQuotientInclusion_finiteNormClass (A : Rep ℤ G) + (L : FiniteGaloisSubextension K) (S : Subgroup L.extensionQuotient) + (a : ambientFixedAddSubgroup A K) : + letI : Finite (K.toSubgroup ⧸ + extensionSubgroup K L.field L.below) := L.finite + letI : Finite ((L.intermediateField S).toSubgroup ⧸ + extensionSubgroup (L.intermediateField S) L.field + (L.field_le_intermediateField S)) := + L.extension_over_intermediate_finite S + L.intermediateNormQuotientInclusion A S + (finiteNormClass A K L.field L.below a) = + finiteNormClass A (L.intermediateField S) L.field + (L.field_le_intermediateField S) + (fixedFieldInclusion A K (L.intermediateField S) + (L.intermediateField_le_base S) a) := by + let : Finite (K.toSubgroup ⧸ + extensionSubgroup K L.field L.below) := L.finite + let : (extensionSubgroup K L.field L.below).Normal := L.normal + let : (extensionSubgroup (L.intermediateField S) L.field + (L.field_le_intermediateField S)).Normal := + L.extensionSubgroup_over_intermediate_normal S + let : Finite ((L.intermediateField S).toSubgroup ⧸ + extensionSubgroup (L.intermediateField S) L.field + (L.field_le_intermediateField S)) := + L.extension_over_intermediate_finite S + exact transferNormNaturality_normQuotientInclusion_finiteNormClass A K + (L.intermediateField S) L.field (L.field_le_intermediateField S) + (L.intermediateField_le_base S) a + +/-- The exact identity `N_{M/K} ∘ i = [M:K]`, now for an +arbitrary (possibly nonnormal) intermediate field. -/ +theorem intermediateNormMap_comp_inclusion (A : Rep ℤ G) + (L : FiniteGaloisSubextension K) (S : Subgroup L.extensionQuotient) : + letI : Finite (K.toSubgroup ⧸ + extensionSubgroup K L.field L.below) := L.finite + ∀ q : FiniteNormQuotient A K L.field L.below, + letI : Finite ((L.intermediateField S).toSubgroup ⧸ + extensionSubgroup (L.intermediateField S) L.field + (L.field_le_intermediateField S)) := + L.extension_over_intermediate_finite S + letI : Finite (K.toSubgroup ⧸ extensionSubgroup K + (L.intermediateField S) (L.intermediateField_le_base S)) := + L.intermediateField_finite S + L.intermediateNormMap A S + (L.intermediateNormQuotientInclusion A S q) = + ((L.intermediateFiniteAbstractExtension S).degree : ℕ) • q := by + let : Finite (K.toSubgroup ⧸ + extensionSubgroup K L.field L.below) := L.finite + intro q + let : (extensionSubgroup K L.field L.below).Normal := L.normal + let : (extensionSubgroup (L.intermediateField S) L.field + (L.field_le_intermediateField S)).Normal := + L.extensionSubgroup_over_intermediate_normal S + let : Finite ((L.intermediateField S).toSubgroup ⧸ + extensionSubgroup (L.intermediateField S) L.field + (L.field_le_intermediateField S)) := + L.extension_over_intermediate_finite S + let : Finite (K.toSubgroup ⧸ extensionSubgroup K + (L.intermediateField S) (L.intermediateField_le_base S)) := + L.intermediateField_finite S + refine FiniteNormQuotient.induction_on A K L.field L.below q ?_ + intro a + rw [intermediateNormQuotientInclusion_finiteNormClass, + intermediateNormMap_finiteNormClass] + rw [show relativeNorm A K (L.intermediateField S) + (L.intermediateField_le_base S) + (fixedFieldInclusion A K (L.intermediateField S) + (L.intermediateField_le_base S) a) = + ((L.intermediateFiniteAbstractExtension S).degree : ℕ) • a by + change relativeNorm A + (L.intermediateFiniteAbstractExtension S).base + (L.intermediateFiniteAbstractExtension S).field + (L.intermediateFiniteAbstractExtension S).below + (fixedFieldInclusion A + (L.intermediateFiniteAbstractExtension S).base + (L.intermediateFiniteAbstractExtension S).field + (L.intermediateFiniteAbstractExtension S).below a) = + ((L.intermediateFiniteAbstractExtension S).degree : ℕ) • a + exact relativeNorm_fixedFieldInclusion A + (L.intermediateFiniteAbstractExtension S) a] + exact finiteNormClass_nsmul A K L.field L.below _ a + +end FiniteGaloisSubextension + +end Representation + +section GroupOnly + +variable {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G] + +namespace FiniteGaloisSubextension + +variable {K : ClosedSubgroup G} + +/-- The inclusion `G(L/M) → G(L/K)` for the actual intermediate field, +obtained from `G(L/M) ≃ S` followed by the subgroup inclusion. -/ +def lowerInclusionHom (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) : + (L.intermediateField S).toSubgroup ⧸ + extensionSubgroup (L.intermediateField S) L.field + (L.field_le_intermediateField S) →* + L.extensionQuotient := + S.subtype.comp (L.lowerQuotientEquiv S).toMonoidHom + +/-- Representative formula for the actual lower inclusion. -/ +@[simp] +theorem lowerInclusionHom_mk (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) + (m : (L.intermediateField S).toSubgroup) : + L.lowerInclusionHom S (QuotientGroup.mk m) = + (QuotientGroup.mk' + (extensionSubgroup K L.field L.below)) + ⟨m.1, L.intermediateField_le_base S m.property⟩ := by + exact L.lowerQuotientEquiv_mk_coe S m + +/-- The lower inclusion is injective. -/ +theorem lowerInclusionHom_injective (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) : + Function.Injective (L.lowerInclusionHom S) := by + intro x y hxy + apply (L.lowerQuotientEquiv S).injective + exact Subtype.ext hxy + +/-- Every lower quotient of a cyclic extension is cyclic. -/ +theorem lowerQuotient_isCyclic (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) [IsCyclic L.extensionQuotient] : + IsCyclic + ((L.intermediateField S).toSubgroup ⧸ + extensionSubgroup (L.intermediateField S) L.field + (L.field_le_intermediateField S)) := + (L.lowerQuotientEquiv S).isCyclic.2 inferInstance + +/-- The actual restriction arrow `G(L/K) → G(M/K)` attached to a normal +subgroup `S ◁ G(L/K)`, expressed through the third-isomorphism +identification constructed in `IntermediateExtension`. -/ +def upperRestrictionHom (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) [S.Normal] : + L.extensionQuotient →* + K.toSubgroup ⧸ extensionSubgroup K (L.intermediateField S) + (L.intermediateField_le_base S) := + (L.upperQuotientEquiv S).toMonoidHom.comp (QuotientGroup.mk' S) + +/-- Representative formula for the actual upper restriction arrow. -/ +@[simp] +theorem upperRestrictionHom_mk (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) [S.Normal] (k : K.toSubgroup) : + L.upperRestrictionHom S + (QuotientGroup.mk k : L.extensionQuotient) = + QuotientGroup.mk k := by + exact L.upperQuotientEquiv_mk_mk S k + +/-- Restriction to a normal intermediate field is surjective. -/ +theorem upperRestrictionHom_surjective (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) [S.Normal] : + Function.Surjective (L.upperRestrictionHom S) := + (L.upperQuotientEquiv S).surjective.comp + (QuotientGroup.mk'_surjective S) + +/-- Every upper quotient of a cyclic extension is cyclic. -/ +theorem upperQuotient_isCyclic (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) [S.Normal] + [IsCyclic L.extensionQuotient] : + IsCyclic + (K.toSubgroup ⧸ extensionSubgroup K (L.intermediateField S) + (L.intermediateField_le_base S)) := by + have hsource : IsCyclic (L.extensionQuotient ⧸ S) := + isCyclic_of_surjective (QuotientGroup.mk' S) + (QuotientGroup.mk'_surjective S) + exact (L.upperQuotientEquiv S).isCyclic.1 hsource + +/-- Its kernel is exactly the subgroup defining the intermediate field. -/ +theorem upperRestrictionHom_eq_one_iff (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) [S.Normal] + (q : L.extensionQuotient) : + L.upperRestrictionHom S q = 1 ↔ q ∈ S := by + change L.upperQuotientEquiv S + (L.upperQuotientMk S q) = 1 ↔ q ∈ S + constructor + · intro h + apply (QuotientGroup.eq_one_iff q).1 + change L.upperQuotientMk S q = 1 + apply (L.upperQuotientEquiv S).injective + exact h.trans ((L.upperQuotientEquiv S).map_one).symm + · intro h + have hmk : L.upperQuotientMk S q = 1 := by + change (QuotientGroup.mk' S) q = 1 + exact (QuotientGroup.eq_one_iff q).2 h + exact (congrArg (L.upperQuotientEquiv S) hmk).trans + (L.upperQuotientEquiv S).map_one + +/-- Exactness of the actual upper row for an intermediate field, in +additive form for direct use with the reciprocity homomorphisms. -/ +theorem intermediateGalois_exact (L : FiniteGaloisSubextension K) + (S : Subgroup L.extensionQuotient) [S.Normal] : + Function.Exact + (MonoidHom.toAdditive (L.lowerInclusionHom S)) + (MonoidHom.toAdditive (L.upperRestrictionHom S)) := by + intro q + constructor + · intro hq + have hres : L.upperRestrictionHom S q.toMul = 1 := by + exact Additive.ofMul.injective (by simpa using hq) + have hmem : q.toMul ∈ S := + (L.upperRestrictionHom_eq_one_iff S q.toMul).1 hres + let s : S := ⟨q.toMul, hmem⟩ + refine ⟨Additive.ofMul ((L.lowerQuotientEquiv S).symm s), ?_⟩ + apply Additive.toMul.injective + change + ↑(L.lowerQuotientEquiv S ((L.lowerQuotientEquiv S).symm s)) = q.toMul + exact congrArg Subtype.val + ((L.lowerQuotientEquiv S).apply_symm_apply s) + · rintro ⟨x, rfl⟩ + apply Additive.toMul.injective + change L.upperRestrictionHom S (L.lowerInclusionHom S x.toMul) = 1 + apply (L.upperRestrictionHom_eq_one_iff S _).2 + change (((L.lowerQuotientEquiv S) x.toMul : S) : + L.extensionQuotient) ∈ S + exact Subtype.property _ + +/-- The maximal abelian intermediate field in the first reduction is the +actual field cut out by the commutator subgroup of `G(L/K)`. -/ +def abelianIntermediateField (L : FiniteGaloisSubextension K) : + ClosedSubgroup G := + L.intermediateField (commutator L.extensionQuotient) + +/-- Normality of the maximal abelian intermediate extension. -/ +instance abelianIntermediateField_normalInstance + (L : FiniteGaloisSubextension K) : + (extensionSubgroup K L.abelianIntermediateField + (L.intermediateField_le_base + (commutator L.extensionQuotient))).Normal := by + change (extensionSubgroup K + (L.intermediateField (commutator L.extensionQuotient)) + (L.intermediateField_le_base + (commutator L.extensionQuotient))).Normal + exact L.intermediateField_normal + (commutator L.extensionQuotient) inferInstance + +/-- Restriction to the maximal abelian intermediate field. -/ +def abelianRestrictionHom (L : FiniteGaloisSubextension K) : + L.extensionQuotient →* + K.toSubgroup ⧸ extensionSubgroup K L.abelianIntermediateField + (L.intermediateField_le_base + (commutator L.extensionQuotient)) := + L.upperRestrictionHom (commutator L.extensionQuotient) + +/-- The first reduction's exact upper-row assertion: the kernel of +restriction to `L^ab` is the commutator subgroup. -/ +theorem abelianRestrictionHom_eq_one_iff + (L : FiniteGaloisSubextension K) (q : L.extensionQuotient) : + L.abelianRestrictionHom q = 1 ↔ + q ∈ commutator L.extensionQuotient := + L.upperRestrictionHom_eq_one_iff (commutator L.extensionQuotient) q + +/-- A jointly faithful family of quotient coordinates gives a jointly +faithful family of actual restriction maps to the corresponding +intermediate fields. -/ +theorem upperRestrictionHom_jointlyFaithful + (L : FiniteGaloisSubextension K) + {I : Type*} {C : I → Type*} [∀ i, Group (C i)] + (f : ∀ i, L.extensionQuotient →* C i) + (hfaithful : (⨅ i, MonoidHom.ker (f i)) = ⊥) + (q : L.extensionQuotient) : + (∀ i, L.upperRestrictionHom (MonoidHom.ker (f i)) q = 1) ↔ + q = 1 := by + constructor + · intro hq + have hmem : q ∈ ⨅ i, MonoidHom.ker (f i) := by + rw [Subgroup.mem_iInf] + intro i + exact (L.upperRestrictionHom_eq_one_iff + (MonoidHom.ker (f i)) q).1 (hq i) + rw [hfaithful, Subgroup.mem_bot] at hmem + exact hmem + · rintro rfl + intro i + exact map_one _ + +/-- For a coordinate homomorphism, the actual restriction map has exactly +the same kernel. -/ +theorem upperRestrictionHom_ker_factor + (L : FiniteGaloisSubextension K) {C : Type*} [Group C] + (f : L.extensionQuotient →* C) (q : L.extensionQuotient) : + L.upperRestrictionHom (MonoidHom.ker f) q = 1 ↔ f q = 1 := by + rw [L.upperRestrictionHom_eq_one_iff (MonoidHom.ker f) q] + exact MonoidHom.mem_ker + +/-- A finite abelian `G(L/K)` supplies the actual cyclic intermediate +extensions used in the second reduction. The coordinate kernels have +trivial intersection, and the corresponding groups `G(Mᵢ/K)` are finite +cyclic. -/ +theorem exists_cyclicIntermediateFields + (L : FiniteGaloisSubextension K) + [IsMulCommutative L.extensionQuotient] : + ∃ (I : Type 0) (_ : Fintype I) (m : I → ℕ), + (∀ i, 1 < m i) ∧ + ∃ f : ∀ i, + L.extensionQuotient →* Multiplicative (ZMod (m i)), + (∀ i, Function.Surjective (f i)) ∧ + (⨅ i, MonoidHom.ker (f i)) = ⊥ ∧ + (∀ i, IsCyclic + (K.toSubgroup ⧸ extensionSubgroup K + (L.intermediateField (MonoidHom.ker (f i))) + (L.intermediateField_le_base (MonoidHom.ker (f i))))) ∧ + (∀ i, Finite + (K.toSubgroup ⧸ extensionSubgroup K + (L.intermediateField (MonoidHom.ker (f i))) + (L.intermediateField_le_base (MonoidHom.ker (f i))))) := by + let : CommGroup L.extensionQuotient := + open scoped IsMulCommutative in inferInstance + obtain ⟨I, hI, m, hm, f, hf, hfaithful⟩ := + finiteCommGroup_exists_jointlyFaithful_cyclic_factors + L.extensionQuotient + let : Fintype I := hI + refine ⟨I, hI, m, hm, f, hf, hfaithful, ?_, ?_⟩ + · intro i + let e : L.extensionQuotient ⧸ MonoidHom.ker (f i) ≃* + Multiplicative (ZMod (m i)) := + QuotientGroup.quotientKerEquivOfSurjective (f i) (hf i) + have hsource : IsCyclic + (L.extensionQuotient ⧸ MonoidHom.ker (f i)) := + e.isCyclic.2 inferInstance + exact (L.upperQuotientEquiv (MonoidHom.ker (f i))).isCyclic.1 hsource + · intro i + exact L.intermediateField_finite (MonoidHom.ker (f i)) + +/-! ## The maximal unramified subextension in the third reduction -/ + +/-- The inertia subgroup of `G(L/K)`: the image of `I_K` in the actual +finite quotient. Its fixed field is `L ∩ K_tilde` in the notation of. -/ +def inertiaImage (D : DegreeData G) (L : FiniteGaloisSubextension K) : + Subgroup L.extensionQuotient := + (D.fieldInertiaWithin K).map + (QuotientGroup.mk' (extensionSubgroup K L.field L.below)) + +omit [IsTopologicalGroup G] in +/-- The inertia image is normal, since it is the image of the normal +inertia subgroup under a surjective quotient map. -/ +theorem inertiaImage_normal (D : DegreeData G) + (L : FiniteGaloisSubextension K) : (L.inertiaImage D).Normal := by + exact (inferInstance : (D.fieldInertiaWithin K).Normal).map + (QuotientGroup.mk' (extensionSubgroup K L.field L.below)) + (QuotientGroup.mk'_surjective + (extensionSubgroup K L.field L.below)) + +/-- The inertia image in a finite Galois quotient is normal. -/ +instance inertiaImage_normalInstance (D : DegreeData G) + (L : FiniteGaloisSubextension K) : (L.inertiaImage D).Normal := + L.inertiaImage_normal D + +/-- The actual maximal unramified subextension `M = L ∩ K_tilde`. -/ +def maximalUnramifiedSubextension (D : DegreeData G) + (L : FiniteGaloisSubextension K) : ClosedSubgroup G := + L.intermediateField (L.inertiaImage D) + +/-- `M/K` as an actual finite Galois extension. -/ +def maximalUnramifiedFiniteGalois (D : DegreeData G) + (L : FiniteGaloisSubextension K) : FiniteGaloisSubextension K := + L.intermediateFiniteGalois (L.inertiaImage D) + (L.inertiaImage_normal D) + +/-- The constructed `M/K` is unramified. -/ +theorem maximalUnramifiedSubextension_isUnramified + (D : DegreeData G) (L : FiniteGaloisSubextension K) : + (DegreeData.AbstractExtension.mk (L.maximalUnramifiedSubextension D) K + (L.intermediateField_le_base (L.inertiaImage D))).IsUnramified D := by + change (DegreeData.AbstractExtension.mk + (L.intermediateField (L.inertiaImage D)) K + (L.intermediateField_le_base (L.inertiaImage D))).IsUnramified D + rw [(DegreeData.AbstractExtension.mk + (L.intermediateField (L.inertiaImage D)) K + (L.intermediateField_le_base (L.inertiaImage D))).isUnramified_iff_inertia_le D] + intro x hx + let k : K.toSubgroup := ⟨x, hx.1⟩ + have hkI : k ∈ D.fieldInertiaWithin K := by + exact hx.2 + have hkS : + (QuotientGroup.mk' + (extensionSubgroup K L.field L.below)) k ∈ L.inertiaImage D := + ⟨k, hkI, rfl⟩ + have hkP : k ∈ L.intermediateSubgroup (L.inertiaImage D) := by + change (QuotientGroup.mk' + (extensionSubgroup K L.field L.below)) k ∈ L.inertiaImage D + exact hkS + exact ⟨k, hkP, rfl⟩ + +/-- The complementary extension `L/M` is totally ramified, i.e. +`f_{L/M}=1`. -/ +theorem maximalUnramifiedSubextension_isTotallyRamified + (D : DegreeData G) (L : FiniteGaloisSubextension K) : + (DegreeData.AbstractExtension.mk L.field + (L.maximalUnramifiedSubextension D) + (L.field_le_intermediateField (L.inertiaImage D))).IsTotallyRamified D := by + let S := L.inertiaImage D + let M := L.maximalUnramifiedSubextension D + let hLM := L.field_le_intermediateField S + let hMK := L.intermediateField_le_base S + change (DegreeData.AbstractExtension.mk L.field + (L.intermediateField (L.inertiaImage D)) hLM).IsTotallyRamified D + rw [(DegreeData.AbstractExtension.mk L.field + (L.intermediateField (L.inertiaImage D)) hLM).isTotallyRamified_iff_image_le D] + rintro z ⟨x, hxM, rfl⟩ + let xK : K.toSubgroup := ⟨x, hMK hxM⟩ + have hxP : xK ∈ L.intermediateSubgroup S := by + rw [← L.extensionSubgroup_intermediateField_eq S] + exact (mem_extensionSubgroup_iff K M hMK xK).2 hxM + change (QuotientGroup.mk' + (extensionSubgroup K L.field L.below)) xK ∈ + (D.fieldInertiaWithin K).map + (QuotientGroup.mk' + (extensionSubgroup K L.field L.below)) at hxP + obtain ⟨i, hiI, hi⟩ := hxP + have hiH : i⁻¹ * xK ∈ extensionSubgroup K L.field L.below := + QuotientGroup.eq.mp hi + have hiL : i.1⁻¹ * x ∈ L.field.toSubgroup := by + exact (mem_extensionSubgroup_iff K L.field L.below (i⁻¹ * xK)).1 hiH + refine ⟨i.1⁻¹ * x, hiL, ?_⟩ + have hdegree : D.degree i.1 = 1 := + (D.mem_fieldInertiaWithin_iff K i).1 hiI + simp [hdegree] + +/-- Maximality: every unramified intermediate extension of `L/K` is +contained in the field cut out by the inertia image. In subgroup order this +is the displayed inclusion. -/ +theorem maximalUnramifiedSubextension_le_of_isUnramified + (D : DegreeData G) (L : FiniteGaloisSubextension K) + (N : ClosedSubgroup G) + (hLN : L.field.toSubgroup ≤ N.toSubgroup) + (hNK : N.toSubgroup ≤ K.toSubgroup) + (hNunramified : (DegreeData.AbstractExtension.mk N K hNK).IsUnramified D) : + (L.maximalUnramifiedSubextension D).toSubgroup ≤ N.toSubgroup := by + change (L.intermediateField (L.inertiaImage D)).toSubgroup ≤ + N.toSubgroup + intro x hxM + obtain ⟨k, hkP, rfl⟩ := hxM + change (QuotientGroup.mk' + (extensionSubgroup K L.field L.below)) k ∈ + (D.fieldInertiaWithin K).map + (QuotientGroup.mk' + (extensionSubgroup K L.field L.below)) at hkP + obtain ⟨i, hiI, hi⟩ := hkP + have hiH : i⁻¹ * k ∈ extensionSubgroup K L.field L.below := + QuotientGroup.eq.mp hi + have hikL : i.1⁻¹ * k.1 ∈ L.field.toSubgroup := + (mem_extensionSubgroup_iff K L.field L.below (i⁻¹ * k)).1 hiH + have hiDegree : D.degree i.1 = 1 := + (D.mem_fieldInertiaWithin_iff K i).1 hiI + have hiKN : i.1 ∈ N.toSubgroup := by + apply ((DegreeData.AbstractExtension.mk N K hNK).isUnramified_iff_inertia_le D).1 + hNunramified + exact ⟨i.property, hiDegree⟩ + have hikN : i.1⁻¹ * k.1 ∈ N.toSubgroup := hLN hikL + have hmul : i.1 * (i.1⁻¹ * k.1) ∈ N.toSubgroup := + N.toSubgroup.mul_mem hiKN hikN + simpa [mul_assoc] using hmul + +end FiniteGaloisSubextension + +end GroupOnly + +section Representation + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + [IsTopologicalGroup G] + +namespace FiniteGaloisSubextension + +variable {K : ClosedSubgroup G} + +/-- In the cyclic case, the lower norm arrow for +`L / (L ∩ K_tilde) / K` is injective by the order calculation from. +This specializes the actual cardinality proof in the reciprocity reduction exact row to the +inertia-image intermediate field. -/ +theorem maximalUnramified_normMap_injective + (A : Rep ℤ G) (hcf : SatisfiesClassFieldAxiom A) + (D : DegreeData G) (L : FiniteGaloisSubextension K) + [Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) K (le_baseField K))] + [IsCyclic L.extensionQuotient] : + let S := L.inertiaImage D + let M := L.intermediateField S + let hLM := L.field_le_intermediateField S + let hMK := L.intermediateField_le_base S + letI : Finite + (M.toSubgroup ⧸ extensionSubgroup M L.field hLM) := + L.extension_over_intermediate_finite S + letI : Finite + (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + L.intermediateField_finite S + letI : Finite + (K.toSubgroup ⧸ extensionSubgroup K L.field (hLM.trans hMK)) := by + simpa only using L.finite + Function.Injective + (abstractReciprocityNormMap A K M L.field hLM hMK) := by + dsimp only + let S := L.inertiaImage D + let M := L.intermediateField S + let hLM := L.field_le_intermediateField S + let hMK := L.intermediateField_le_base S + let : (extensionSubgroup K L.field (hLM.trans hMK)).Normal := by + simpa only using L.normal + let : (extensionSubgroup K M hMK).Normal := + L.intermediateField_normal S inferInstance + let : Finite + (K.toSubgroup ⧸ extensionSubgroup K L.field (hLM.trans hMK)) := by + simpa only using L.finite + let : Finite + (M.toSubgroup ⧸ extensionSubgroup M L.field hLM) := + L.extension_over_intermediate_finite S + let : Finite + (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + L.intermediateField_finite S + let : IsCyclic + (M.toSubgroup ⧸ extensionSubgroup M L.field hLM) := + L.lowerQuotient_isCyclic S + let : IsCyclic + (K.toSubgroup ⧸ extensionSubgroup K M hMK) := + L.upperQuotient_isCyclic S + obtain ⟨gKL, hgKL⟩ := IsCyclic.exists_generator + (α := L.extensionQuotient) + obtain ⟨gML, hgML⟩ := IsCyclic.exists_generator + (α := M.toSubgroup ⧸ extensionSubgroup M L.field hLM) + obtain ⟨gKM, hgKM⟩ := IsCyclic.exists_generator + (α := K.toSubgroup ⧸ extensionSubgroup K M hMK) + exact abstractReciprocity_cyclicTower_normMap_injective + A hcf K M L.field hLM hMK gKL hgKL gML hgML gKM hgKM + +end FiniteGaloisSubextension + +/-- The diagram chase used twice in the first reduction. The +middle vertical arrow is surjective when the two outside vertical arrows +are surjective, the top-right arrow is surjective, and the bottom row is +exact. -/ +theorem abstractReciprocity_surjective_of_exact_diagram + {Q₀ Q Q₁ B₀ B B₁ : Type*} + [AddGroup Q₀] [AddGroup Q] [AddGroup Q₁] + [AddGroup B₀] [AddGroup B] [AddGroup B₁] + (iQ : Q₀ →+ Q) (pQ : Q →+ Q₁) + (iB : B₀ →+ B) (pB : B →+ B₁) + (r₀ : Q₀ →+ B₀) (r : Q →+ B) (r₁ : Q₁ →+ B₁) + (hexact : Function.Exact iB pB) + (hpQ : Function.Surjective pQ) + (hleft : ∀ q, r (iQ q) = iB (r₀ q)) + (hright : ∀ q, pB (r q) = r₁ (pQ q)) + (hr₀ : Function.Surjective r₀) + (hr₁ : Function.Surjective r₁) : + Function.Surjective r := by + intro b + obtain ⟨q₁, hq₁⟩ := hr₁ (pB b) + obtain ⟨q, hq⟩ := hpQ q₁ + have hzero : pB (b - r q) = 0 := by + calc + pB (b - r q) = pB b - pB (r q) := map_sub pB b (r q) + _ = pB b - r₁ (pQ q) := by rw [hright q] + _ = pB b - r₁ q₁ := by rw [hq] + _ = pB b - pB b := by rw [hq₁] + _ = 0 := sub_self _ + obtain ⟨b₀, hb₀⟩ := (hexact (b - r q)).mp hzero + obtain ⟨q₀, hq₀⟩ := hr₀ b₀ + refine ⟨iQ q₀ + q, ?_⟩ + calc + r (iQ q₀ + q) = r (iQ q₀) + r q := map_add r _ _ + _ = iB (r₀ q₀) + r q := by rw [hleft q₀] + _ = iB b₀ + r q := by rw [hq₀] + _ = (b - r q) + r q := by rw [hb₀] + _ = b := sub_add_cancel b (r q) + +/-- The diagram chase in the third reduction. If both outside +reciprocity arrows are bijective and the first lower arrow is injective, +then the middle reciprocity arrow is bijective. -/ +theorem abstractReciprocity_bijective_of_exact_diagram + {Q₀ Q Q₁ B₀ B B₁ : Type*} + [AddGroup Q₀] [AddGroup Q] [AddGroup Q₁] + [AddGroup B₀] [AddGroup B] [AddGroup B₁] + (iQ : Q₀ →+ Q) (pQ : Q →+ Q₁) + (iB : B₀ →+ B) (pB : B →+ B₁) + (r₀ : Q₀ →+ B₀) (r : Q →+ B) (r₁ : Q₁ →+ B₁) + (hexactQ : Function.Exact iQ pQ) + (hexactB : Function.Exact iB pB) + (hpQ : Function.Surjective pQ) + (hiB : Function.Injective iB) + (hleft : ∀ q, r (iQ q) = iB (r₀ q)) + (hright : ∀ q, pB (r q) = r₁ (pQ q)) + (hr₀ : Function.Bijective r₀) + (hr₁ : Function.Bijective r₁) : + Function.Bijective r := by + refine ⟨?_, abstractReciprocity_surjective_of_exact_diagram + iQ pQ iB pB r₀ r r₁ hexactB hpQ hleft hright hr₀.2 hr₁.2⟩ + rw [injective_iff_map_eq_zero] + intro q hq + have hpzero : pB (r q) = 0 := by rw [hq, map_zero] + have hr₁zero : r₁ (pQ q) = 0 := by + rw [← hright q] + exact hpzero + have hpQzero : pQ q = 0 := by + apply hr₁.1 + simpa using hr₁zero + obtain ⟨q₀, hq₀⟩ := (hexactQ q).mp hpQzero + have hiBzero : iB (r₀ q₀) = 0 := by + calc + iB (r₀ q₀) = r (iQ q₀) := (hleft q₀).symm + _ = r q := by rw [hq₀] + _ = 0 := hq + have hr₀zero : r₀ q₀ = 0 := by + apply hiB + simpa using hiBzero + have hq₀zero : q₀ = 0 := by + apply hr₀.1 + simpa using hr₀zero + rw [← hq₀, hq₀zero, map_zero] + +/-- Every additive homomorphism from a group into an abelian group kills +the commutator subgroup. This is the automatic inclusion in the kernel +statement of the first reduction. -/ +theorem abstractReciprocity_commutator_mem_kernel + {Q : Type*} {B : Type*} [Group Q] [AddCommGroup B] + (r : Additive Q →+ B) (q : Q) + (hq : q ∈ commutator Q) : + r (Additive.ofMul q) = 0 := by + let rMul : Q →* Multiplicative B := + { toFun := fun x => Multiplicative.ofAdd (r (Additive.ofMul x)) + map_one' := r.map_zero + map_mul' := r.map_add } + have hker : q ∈ rMul.ker := + Abelianization.commutator_subset_ker rMul hq + change Multiplicative.ofAdd (r (Additive.ofMul q)) = 1 at hker + exact Multiplicative.ofAdd.injective (by simpa using hker) + +/-- Exact remaining kernel calculation in the first reduction. For the +actual maximal abelian intermediate field, commutativity of the right square +and injectivity of its reciprocity arrow identify the kernel of the middle +arrow with the commutator subgroup. -/ +theorem abstractReciprocity_abelianReduction_kernel + {K : ClosedSubgroup G} {B : Type*} {C : Type*} + [AddCommGroup B] [AddCommGroup C] + (L : FiniteGaloisSubextension K) + (p : B →+ C) + (r : Additive L.extensionQuotient →+ B) + (rAb : Additive + (K.toSubgroup ⧸ extensionSubgroup K L.abelianIntermediateField + (L.intermediateField_le_base + (commutator L.extensionQuotient))) →+ C) + (hright : ∀ q, + p (r (Additive.ofMul q)) = + rAb (Additive.ofMul (L.abelianRestrictionHom q))) + (hrAb : Function.Injective rAb) + (q : L.extensionQuotient) : + r (Additive.ofMul q) = 0 ↔ + q ∈ commutator L.extensionQuotient := by + constructor + · intro hq + have hzero : + rAb (Additive.ofMul (L.abelianRestrictionHom q)) = 0 := by + rw [← hright q, hq, map_zero] + have hresAdd : + Additive.ofMul (L.abelianRestrictionHom q) = 0 := by + apply hrAb + simpa using hzero + have hres : L.abelianRestrictionHom q = 1 := by + exact Additive.ofMul.injective (by simpa using hresAdd) + exact (L.abelianRestrictionHom_eq_one_iff q).1 hres + · exact abstractReciprocity_commutator_mem_kernel r q + +/-- The kernel argument in the second reduction. Injectivity of +the reciprocity arrows for a jointly faithful family of cyclic quotients +forces injectivity of the original arrow. All horizontal maps are the +actual restrictions to the intermediate fields cut out by the coordinate +kernels. -/ +theorem abstractReciprocity_cyclicFactors_injective + {K : ClosedSubgroup G} {I : Type*} {C : I → Type*} + [∀ i, Group (C i)] + (L : FiniteGaloisSubextension K) + (f : ∀ i, L.extensionQuotient →* C i) + (hfaithful : (⨅ i, MonoidHom.ker (f i)) = ⊥) + {B : Type*} [AddCommGroup B] + {D : I → Type*} [∀ i, AddCommGroup (D i)] + (p : ∀ i, B →+ D i) + (r : Additive L.extensionQuotient →+ B) + (rFactor : ∀ i, + Additive + (K.toSubgroup ⧸ extensionSubgroup K + (L.intermediateField (MonoidHom.ker (f i))) + (L.intermediateField_le_base (MonoidHom.ker (f i)))) →+ D i) + (hright : ∀ i q, + p i (r (Additive.ofMul q)) = + rFactor i (Additive.ofMul + (L.upperRestrictionHom (MonoidHom.ker (f i)) q))) + (hinjective : ∀ i, Function.Injective (rFactor i)) : + Function.Injective r := by + rw [injective_iff_map_eq_zero] + intro q hq + have hres (i : I) : + L.upperRestrictionHom (MonoidHom.ker (f i)) q.toMul = 1 := by + have hrq : r (Additive.ofMul q.toMul) = 0 := by + simpa using hq + have hzero : rFactor i (Additive.ofMul + (L.upperRestrictionHom (MonoidHom.ker (f i)) q.toMul)) = 0 := by + rw [← hright i q.toMul, hrq, map_zero] + have hadd : Additive.ofMul + (L.upperRestrictionHom (MonoidHom.ker (f i)) q.toMul) = 0 := by + apply hinjective i + simpa using hzero + exact Additive.ofMul.injective (by simpa using hadd) + have hqone : q.toMul = 1 := + (L.upperRestrictionHom_jointlyFaithful f hfaithful q.toMul).1 hres + exact Additive.toMul.injective (by simpa using hqone) + +end Representation + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Sylow.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Sylow.lean new file mode 100644 index 0000000000..8b0ef66abe --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Sylow.lean @@ -0,0 +1,184 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction +public import Mathlib.GroupTheory.Nilpotent + +/-! # Sylow -/ + +@[expose] public section +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +/-! +# The abstract reciprocity theorem: the Sylow step in the first reduction + +This file formalizes the source-producing group-theoretic part of the +first reduction. For a Sylow `p`-subgroup `P` of the actual +finite quotient `G(L/K)`, the already constructed fixed field `M = L^P` +is an actual (not necessarily Galois over `K`) intermediate field. The +actual quotient `G(L/M)` is a `p`-group and hence solvable, while +`[M:K] = (G(L/K) : P)` is prime to `p`. + +For an abelian group `B`, multiplication by `[M:K]` is therefore +surjective on every Sylow `p`-subgroup of `B`, without assuming that the +ambient group is finite. Equivalently, that Sylow subgroup lies in the +image of the `[M:K]`-fold map. In the abstract reciprocity theorem the ambient norm quotient is +only known at this point to have bounded exponent; its individual cyclic +subgroups are finite. This avoids using the desired reciprocity +surjectivity to prove finiteness. No reciprocity surjectivity or +the finite reciprocity equivalence comparison is assumed here. +-/ + +noncomputable +section + +variable {G : Type*} [Group G] [TopologicalSpace G] [IsTopologicalGroup G] + +namespace FiniteGaloisSubextension + +variable {K : ClosedSubgroup G} + +/-! ## The fixed field of a Sylow subgroup -/ + +/-- For `M = L^P`, the actual lower quotient `G(L/M)` is a `p`-group. +This is the identification `G(L/M) \cong P`, applied to an actual +Sylow subgroup of the actual finite quotient `G(L/K)`. -/ +theorem abstractReciprocity_sylow_lowerQuotient_isPGroup + (L : FiniteGaloisSubextension K) {p : ℕ} + (P : Sylow p L.extensionQuotient) : + IsPGroup p + ((L.intermediateField (P : Subgroup L.extensionQuotient)).toSubgroup ⧸ + extensionSubgroup + (L.intermediateField (P : Subgroup L.extensionQuotient)) L.field + (L.field_le_intermediateField + (P : Subgroup L.extensionQuotient))) := by + exact P.isPGroup'.of_equiv + (L.lowerQuotientEquiv (P : Subgroup L.extensionQuotient)).symm + +section SylowSolvability + +local notation "IsSolvable" => Group.IsSolvable + +/-- Consequently, the actual extension `L/M` cut out by a Sylow subgroup +is solvable. Mathlib proves this by the standard chain +finite `p`-group `\Rightarrow` nilpotent `\Rightarrow` solvable. -/ +theorem abstractReciprocity_sylow_lowerQuotient_isSolvable + (L : FiniteGaloisSubextension K) {p : ℕ} [Fact p.Prime] + (P : Sylow p L.extensionQuotient) : + IsSolvable + ((L.intermediateField (P : Subgroup L.extensionQuotient)).toSubgroup ⧸ + extensionSubgroup + (L.intermediateField (P : Subgroup L.extensionQuotient)) L.field + (L.field_le_intermediateField + (P : Subgroup L.extensionQuotient))) := by + let : Finite + ((L.intermediateField (P : Subgroup L.extensionQuotient)).toSubgroup ⧸ + extensionSubgroup + (L.intermediateField (P : Subgroup L.extensionQuotient)) L.field + (L.field_le_intermediateField + (P : Subgroup L.extensionQuotient))) := + L.extension_over_intermediate_finite + (P : Subgroup L.extensionQuotient) + let : Group.IsNilpotent + ((L.intermediateField (P : Subgroup L.extensionQuotient)).toSubgroup ⧸ + extensionSubgroup + (L.intermediateField (P : Subgroup L.extensionQuotient)) L.field + (L.field_le_intermediateField + (P : Subgroup L.extensionQuotient))) := + (L.abstractReciprocity_sylow_lowerQuotient_isPGroup P).isNilpotent + change Group.IsSolvable + ((L.intermediateField (P : Subgroup L.extensionQuotient)).toSubgroup ⧸ + extensionSubgroup + (L.intermediateField (P : Subgroup L.extensionQuotient)) L.field + (L.field_le_intermediateField (P : Subgroup L.extensionQuotient))) + infer_instance + +end SylowSolvability + +/-- The degree of the actual fixed field `M = L^P` over `K` is the index +of `P` in `G(L/K)`. No normality of `P`, and hence none of `M/K`, is +used. -/ +theorem abstractReciprocity_sylow_intermediateDegree_eq_index + (L : FiniteGaloisSubextension K) {p : ℕ} + (P : Sylow p L.extensionQuotient) : + (L.intermediateFiniteAbstractExtension + (P : Subgroup L.extensionQuotient)).degree = + (P : Subgroup L.extensionQuotient).index := by + rw [← (L.intermediateFiniteAbstractExtension + (P : Subgroup L.extensionQuotient)).extensionSubgroup_index_eq_degree] + change (extensionSubgroup K + (L.intermediateField (P : Subgroup L.extensionQuotient)) + (L.intermediateField_le_base (P : Subgroup L.extensionQuotient))).index = _ + rw [L.extensionSubgroup_intermediateField_eq + (P : Subgroup L.extensionQuotient)] + exact (P : Subgroup L.extensionQuotient).index_comap_of_surjective + (QuotientGroup.mk'_surjective + (extensionSubgroup K L.field L.below)) + +/-- Hence the actual degree `[M:K]` is prime to the chosen Sylow prime +`p`, as asserted. -/ +theorem abstractReciprocity_sylow_intermediateDegree_coprime + (L : FiniteGaloisSubextension K) {p : ℕ} [Fact p.Prime] + (P : Sylow p L.extensionQuotient) : + Nat.Coprime + (L.intermediateFiniteAbstractExtension + (P : Subgroup L.extensionQuotient)).degree p := by + rw [L.abstractReciprocity_sylow_intermediateDegree_eq_index P] + rw [Nat.coprime_comm, Nat.Prime.coprime_iff_not_dvd Fact.out] + exact P.not_dvd_index + +/-! ## Sylow subgroups in a possibly infinite abelian target -/ + +/-- Let `S` be a Sylow `p`-subgroup of an abelian group `B`. If +`n` is prime to `p`, then `S` lies in the range of the additive `n`-fold +map on `B`. + +The proof follows the sentence literally: `S` has `p`-power +order, so the `n`-fold map is a bijection on `S`; a preimage in `S` is in +particular a preimage in `B`. -/ +theorem sylowAddSubgroup_le_nsmul_range_of_coprime + {B : Type*} [AddCommGroup B] + {p n : ℕ} + (S : Sylow p (Multiplicative B)) (hn : Nat.Coprime n p) : + Subgroup.toAddSubgroup' + (S : Subgroup (Multiplicative B)) ≤ + (nsmulAddMonoidHom (α := B) n).range := by + intro x hx + let xS : S := ⟨Multiplicative.ofAdd x, hx⟩ + let e : S ≃ S := S.isPGroup'.powEquiv hn.symm + let yS : S := e.symm xS + refine ⟨yS.1.toAdd, ?_⟩ + have hy : yS ^ n = xS := e.apply_symm_apply xS + have hyval : yS.1 ^ n = xS.1 := congrArg Subtype.val hy + simpa [xS] using congrArg Multiplicative.toAdd hyval + +/-- The exact specialization: for `M = L^P`, every Sylow +`p`-subgroup of an abelian group `B` lies in the image of the +`[M:K]`-fold map on `B`. This is the group-theoretic input which the +identity `N_{M/K} ∘ i = [M:K]` later converts into norm-map containment. -/ +theorem abstractReciprocity_sylowAddSubgroup_le_intermediateDegree_nsmul_range + (L : FiniteGaloisSubextension K) {p : ℕ} [Fact p.Prime] + (P : Sylow p L.extensionQuotient) + {B : Type*} [AddCommGroup B] + (S : Sylow p (Multiplicative B)) : + Subgroup.toAddSubgroup' + (S : Subgroup (Multiplicative B)) ≤ + (nsmulAddMonoidHom (α := B) + (L.intermediateFiniteAbstractExtension + (P : Subgroup L.extensionQuotient)).degree).range := by + exact sylowAddSubgroup_le_nsmul_range_of_coprime S + (L.abstractReciprocity_sylow_intermediateDegree_coprime P) + +end FiniteGaloisSubextension + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamified.lean new file mode 100644 index 0000000000..287723cf55 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamified.lean @@ -0,0 +1,448 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Core + +/-! # Totally Ramified -/ + +@[expose] public section +namespace ClassFormation + +open KummerTheory + +open CyclicCohomology + +/-! +# The abstract reciprocity theorem: the totally ramified calculation + +This file isolates the calculation. The input from the finite reciprocity equivalence is an + equality in an actual finite norm quotient. Such an equality is +first turned into an equality of actual norms. For the cyclic totally +ramified extension `M / M⁰`, the class-field axiom then supplies the element `a` with +`aᵒ-a = v-u`. The element written in this construction as +`π_L^k v a^(1-σ_tilde)` is descended from `A_M` to the actual fixed group +`A_{M⁰}`, and its valuation is computed to be `k`. The final invocation of +the valuation endpoint in the reciprocity reduction exact row therefore gives `k = 0`. + +The only comparison not made in this file is the finite reciprocity equivalence +identification of a reciprocity value with the prime-norm class. No +compatibility record or theorem-shaped certificate is introduced for that +comparison. +-/ + +noncomputable +section + +open CategoryTheory + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +/-! ## The linear calculation behind the fixed element -/ + +/-- The additive form of the calculation. Here `g` is `σ`, `t` +is `σ_tilde`, `c = π_Σ^k`, and `b = π_L^k v`. The hypotheses say +that `t` fixes `c`, that `g` and `t` have the same action on `b`, and that +`b-c = a^g-a`. Commutativity of the cyclic quotient then shows that +`b+a-a^t` is fixed by `g`. -/ +private theorem abstractReciprocity_fixedCombination + {Q : IntegralRepGroupType} [CommGroup Q] (M : Rep ℤ Q) + (g t : Q) (c b a : M.V) + (htc : M.ρ t c = c) + (hgb : M.ρ g b = M.ρ t b) + (hbc : b - c = M.ρ g a - a) : + M.ρ g (b + a - M.ρ t a) = b + a - M.ρ t a := by + have hcomm : M.ρ g (M.ρ t a) = M.ρ t (M.ρ g a) := by + calc + M.ρ g (M.ρ t a) = M.ρ (g * t) a := by + rw [map_mul] + rfl + _ = M.ρ (t * g) a := by rw [mul_comm] + _ = M.ρ t (M.ρ g a) := by + rw [map_mul] + rfl + have hb : b = c + M.ρ g a - a := by + calc + b = (b - c) + c := by abel + _ = (M.ρ g a - a) + c := by rw [hbc] + _ = c + M.ρ g a - a := by abel + have htbc := congrArg (fun z : M.V ↦ M.ρ t z) hbc + have htbc' : M.ρ t b - c = + M.ρ t (M.ρ g a) - M.ρ t a := by + simpa only [map_sub, htc] using htbc + have htb : M.ρ t b = + c + M.ρ t (M.ρ g a) - M.ρ t a := by + calc + M.ρ t b = (M.ρ t b - c) + c := by abel + _ = (M.ρ t (M.ρ g a) - M.ρ t a) + c := by rw [htbc'] + _ = c + M.ρ t (M.ρ g a) - M.ρ t a := by abel + calc + M.ρ g (b + a - M.ρ t a) = + M.ρ g b + M.ρ g a - M.ρ g (M.ρ t a) := by + simp only [map_add, map_sub] + _ = M.ρ t b + M.ρ g a - M.ρ t (M.ρ g a) := by + rw [hgb, hcomm] + _ = c + M.ρ g a - M.ρ t a := by rw [htb]; abel + _ = b + a - M.ρ t a := by rw [hb]; abel + +namespace ValuationData + +variable {D : DegreeData G} {A : Rep ℤ G} + +/-- The representative extracted from a zero prime-norm class can be +written as `π_L^k v` with an actual unit `v ∈ U_L`. This is the +prime/valuation calculation: both +`L / K` and the Frobenius fixed field `Σ / K` have relative residue +degree one. -/ +theorem primeNormClass_eq_zero_exists_unit_norm_eq + (v : ValuationData D A) + (K L S : FiniteAbstractField G) + (hLK : L.field.toSubgroup ≤ K.field.toSubgroup) + (hSK : S.field.toSubgroup ≤ K.field.toSubgroup) + (hTot : (DegreeData.AbstractExtension.mk + L.field K.field hLK).IsTotallyRamified D) + [hLKfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L.field hLK)] + [hSKfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field S.field hSK)] + (hSigmaResidue : + ((DegreeData.FiniteAbstractExtension.ofInclusion + S.field K.field hSK).residueDegree D : ℕ) = 1) + (k : ℕ) + (piS : ambientFixedAddSubgroup A S.field) + (piL : ambientFixedAddSubgroup A L.field) + (hpiS : v.IsPrimeElement S piS) + (hpiL : v.IsPrimeElement L piL) + (hclass : + finiteNormClass A K.field L.field hLK + (relativeNorm A K.field S.field hSK (k • piS)) = 0) : + ∃ w : v.unitAddSubgroup L, + relativeNorm A K.field L.field hLK (k • piL + w.1) = + relativeNorm A K.field S.field hSK (k • piS) := by + obtain ⟨b, hb⟩ := + (finiteNormClass_eq_zero_iff + A K.field L.field hLK _).1 hclass + let EL : FiniteAbstractFieldExtension G := + { field := L + base := K + below := hLK + finiteQuotient := hLKfinite } + let ES : FiniteAbstractFieldExtension G := + FiniteAbstractFieldExtension.ofInclusion S.field K hSK + have hvalB : v.valuationAt L b = k • v.oneValue := by + apply Subtype.ext + have hL := v.normalizedValuation_tower EL b + have hS := v.normalizedValuation_tower ES (k • piS) + have hTotEL : EL.IsTotallyRamified D := by + simpa [EL, FiniteAbstractFieldExtension.IsTotallyRamified, + FiniteAbstractFieldExtension.toFiniteAbstractExtension] using hTot + have hresidue : (EL.residueDegree D : ℕ) = 1 := + EL.toFiniteAbstractExtension.residueDegree_eq_one_of_isTotallyRamified + D hTotEL + change (EL.residueDegree D : ℕ) • + ((v.valuationAt L b : v.valueGroup) : ZHat) = + ((v.valuationAt K (relativeNorm A K.field L.field hLK b) : + v.valueGroup) : ZHat) at hL + rw [hresidue, one_nsmul] at hL + have hSigmaResidue' : (ES.residueDegree D : ℕ) = 1 := by + let ES₀ := + DegreeData.FiniteAbstractExtension.ofInclusion S.field K.field hSK + have hSigmaCard : + ES₀.toAbstractExtension.relativeResidueDegreeCardinal D = 1 := by + calc + ES₀.toAbstractExtension.relativeResidueDegreeCardinal D = + ((ES₀.residueDegree D : ℕ) : Cardinal) := + ES₀.relativeResidueDegreeCardinal_eq_coe D + _ = 1 := by rw [hSigmaResidue]; simp + apply Nat.cast_injective (R := Cardinal) + unfold FiniteAbstractFieldExtension.residueDegree + rw [← ES.toFiniteAbstractExtension.relativeResidueDegreeCardinal_eq_coe D] + simpa [ES, ES₀, FiniteAbstractFieldExtension.toFiniteAbstractExtension, + FiniteAbstractFieldExtension.ofInclusion, + DegreeData.FiniteAbstractExtension.toAbstractExtension, + DegreeData.FiniteAbstractExtension.ofInclusion] using hSigmaCard + change (ES.residueDegree D : ℕ) • + ((v.valuationAt S (k • piS) : v.valueGroup) : ZHat) = + ((v.valuationAt K + (relativeNorm A K.field S.field hSK (k • piS)) : + v.valueGroup) : ZHat) at hS + rw [hSigmaResidue', one_nsmul] at hS + calc + ((v.valuationAt L b : v.valueGroup) : ZHat) = + ((v.valuationAt K (relativeNorm A K.field L.field hLK b) : + v.valueGroup) : ZHat) := hL + _ = ((v.valuationAt K + (relativeNorm A K.field S.field hSK (k • piS)) : + v.valueGroup) : ZHat) := by rw [hb] + _ = ((v.valuationAt S (k • piS) : v.valueGroup) : ZHat) := hS.symm + _ = ((k • v.oneValue : v.valueGroup) : ZHat) := by + congr 1 + rw [map_nsmul, hpiS] + let wL : ambientFixedAddSubgroup A L.field := b - k • piL + have hw : v.valuationAt L wL = 0 := by + change v.valuationAt L (b - k • piL) = 0 + rw [map_sub, map_nsmul, hvalB, hpiL, sub_self] + let w : v.unitAddSubgroup L := + ⟨wL, (v.mem_unitAddSubgroup_iff L wL).2 hw⟩ + refine ⟨w, ?_⟩ + calc + relativeNorm A K.field L.field hLK (k • piL + w.1) = + relativeNorm A K.field L.field hLK b := by + congr 1 + apply Subtype.ext + dsimp [w, wL] + abel + _ = relativeNorm A K.field S.field hSK (k • piS) := hb + +/-- Normalized valuation is invariant under the actual quotient action. +This is the quotient-representation form of the unit-cohomology axiom's +`valuationAt_normalExtensionAction`. -/ +theorem valuationAt_extensionFixedRepresentation_action + (v : ValuationData D A) + (E : FiniteAbstractFieldExtension G) + (hnormal : (extensionSubgroup + E.base.field E.field.field E.below).Normal) + (q : E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) + (a : (extensionFixedRepresentation A E.base.field E.field.field + E.below hnormal).V) : + v.valuationAt E.field + (extensionFixedRepresentationEquiv A E.base.field E.field.field + E.below hnormal + ((extensionFixedRepresentation A E.base.field E.field.field + E.below hnormal).ρ q a)) = + v.valuationAt E.field + (extensionFixedRepresentationEquiv A E.base.field E.field.field + E.below hnormal a) := by + let := hnormal + refine Quotient.inductionOn' q ?_ + intro r + let aL : ambientFixedAddSubgroup A E.field.field := + extensionFixedRepresentationEquiv A E.base.field E.field.field + E.below hnormal a + have heq : + extensionFixedRepresentationEquiv A E.base.field E.field.field + E.below hnormal + ((extensionFixedRepresentation A E.base.field E.field.field + E.below hnormal).ρ + (QuotientGroup.mk r) a) = + normalExtensionAction A E.base.field E.field.field E.below + hnormal r aL := by + apply Subtype.ext + rfl + rw [heq] + exact v.valuationAt_normalExtensionAction E hnormal r aL + +/-- The class-field axiom, in representative form: equality of two actual relative +norms yields the element `a` for which `a^σ-a = v-u`. -/ +theorem abstractReciprocity_exists_hMinusOne_primitive + (hcf : SatisfiesClassFieldAxiom A) + (E : FiniteAbstractFieldExtension G) + (hnormal : (extensionSubgroup + E.base.field E.field.field E.below).Normal) + (g : E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) + (hg : ∀ q, q ∈ Subgroup.zpowers g) + (u w : ambientFixedAddSubgroup A E.field.field) + (hnorm : relativeNorm A E.base.field E.field.field E.below w = + relativeNorm A E.base.field E.field.field E.below u) : + let M := extensionFixedRepresentation A E.base.field E.field.field + E.below hnormal + ∃ a : M.V, + M.ρ g a - a = + (extensionFixedRepresentationEquiv A E.base.field E.field.field + E.below hnormal).symm + (w - u) := by + let := hnormal + let := E.finiteQuotient + let := Fintype.ofFinite + (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) + let M := extensionFixedRepresentation A E.base.field E.field.field + E.below hnormal + let z : M.V := + (extensionFixedRepresentationEquiv A E.base.field E.field.field + E.below hnormal).symm (w - u) + have hzNorm : M.norm.hom z = 0 := by + apply Subtype.ext + calc + (M.norm.hom z).1 = + ((relativeNorm A E.base.field E.field.field E.below (w - u) : + ambientFixedAddSubgroup A E.base.field) : A.V) := + extensionFixedRepresentation_norm_coe A E.base.field E.field.field + E.below hnormal z + _ = ((relativeNorm A E.base.field E.field.field E.below w - + relativeNorm A E.base.field E.field.field E.below u : + ambientFixedAddSubgroup A E.base.field) : A.V) := by + rw [map_sub] + _ = 0 := by rw [hnorm, sub_self]; rfl + let Ecf : FiniteCyclicSubextension E.base := + { field := E.field.field + below := E.below + normal := hnormal + finite := E.finiteQuotient + generator := g + generates := hg } + have hzero : Limits.IsZero (tateCohomology M (-1)) := by + simpa [Ecf, + FiniteCyclicSubextension.fixedRepresentation] using + hcf.tateHMinusOne_isZero E.base Ecf + obtain ⟨a, ha⟩ := + CyclicCohomology.normKernel_le_sigmaMinusOneRange_of_tateHMinusOne_isZero + M g hg hzero z hzNorm + exact ⟨a, ha⟩ + +/-- The full source-producing calculation. It returns both the +`H⁻¹` primitive `a` and an actual element of `A_K` (with `K = M⁰` and +`L = M`) whose inclusion has normalized valuation `k`. + +The two action equations are not comparison data: they are the literal +claims used in this construction, namely that `σ_tilde` fixes `π_Σ`, and that `σ` and +`σ_tilde` have the same action on the element coming from `L`. -/ +theorem abstractReciprocity_totallyRamified_fixedSource + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + (E : FiniteAbstractFieldExtension G) + (hnormal : (extensionSubgroup + E.base.field E.field.field E.below).Normal) + (g : E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) + (hg : ∀ q, q ∈ Subgroup.zpowers g) + (t : E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) + (k : ℕ) + (piSigma piL u : ambientFixedAddSubgroup A E.field.field) + (w : v.unitAddSubgroup E.field) + (hpiL : v.IsPrimeElement E.field piL) + (hprime : k • piSigma = u + k • piL) + (hnorm : relativeNorm A E.base.field E.field.field E.below w.1 = + relativeNorm A E.base.field E.field.field E.below u) + (htSigma : relativeCosetAction A E.base.field E.field.field + E.below piSigma t = piSigma.1) + (hgt : relativeCosetAction A E.base.field E.field.field E.below + (k • piL + w.1) g = + relativeCosetAction A E.base.field E.field.field E.below + (k • piL + w.1) t) : + let M := extensionFixedRepresentation A E.base.field E.field.field + E.below hnormal + ∃ (a : M.V) (x : ambientFixedAddSubgroup A E.base.field), + fixedFieldInclusion A E.base.field E.field.field E.below x = + extensionFixedRepresentationEquiv A E.base.field E.field.field + E.below hnormal + ((extensionFixedRepresentationEquiv A E.base.field E.field.field + E.below hnormal).symm + (k • piL + w.1) + a - M.ρ t a) ∧ + ((v.valuationAt E.field + (fixedFieldInclusion A E.base.field E.field.field E.below x) : + v.valueGroup) : ZHat) = + Int.castRingHom ZHat (k : ℤ) := by + let := hnormal + let := E.finiteQuotient + let := Fintype.ofFinite + (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) + let : IsCyclic + (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) := + isCyclic_of_generator g hg + let : CommGroup + (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field E.field.field E.below) := + IsCyclic.commGroup + let M := extensionFixedRepresentation A E.base.field E.field.field + E.below hnormal + let e := extensionFixedRepresentationEquiv A E.base.field E.field.field + E.below hnormal + let piSigmaM : M.V := e.symm piSigma + let piLM : M.V := e.symm piL + let uM : M.V := e.symm u + let wM : M.V := e.symm w.1 + obtain ⟨a, ha⟩ := + abstractReciprocity_exists_hMinusOne_primitive hcf E hnormal + g hg u w.1 hnorm + have hSigmaM : M.ρ t piSigmaM = piSigmaM := by + apply Subtype.ext + calc + (M.ρ t piSigmaM).1 = + relativeCosetAction A E.base.field E.field.field E.below piSigma t := by + simpa [M, e, piSigmaM] using + extensionFixedRepresentation_action_coe + A E.base.field E.field.field E.below hnormal t piSigmaM + _ = piSigma.1 := htSigma + _ = piSigmaM.1 := rfl + have hSigmaPow : M.ρ t (k • piSigmaM) = k • piSigmaM := by + calc + M.ρ t (k • piSigmaM) = k • M.ρ t piSigmaM := + map_nsmul (M.ρ t) k piSigmaM + _ = k • piSigmaM := by rw [hSigmaM] + let bM : M.V := k • piLM + wM + have hbAction : M.ρ g bM = M.ρ t bM := by + apply Subtype.ext + calc + (M.ρ g bM).1 = + relativeCosetAction A E.base.field E.field.field E.below + (k • piL + w.1) g := by + simpa [M, e, bM, piLM, wM] using + extensionFixedRepresentation_action_coe A E.base.field E.field.field + E.below hnormal g bM + _ = relativeCosetAction A E.base.field E.field.field E.below + (k • piL + w.1) t := hgt + _ = (M.ρ t bM).1 := by + simpa [M, e, bM, piLM, wM] using + (extensionFixedRepresentation_action_coe + A E.base.field E.field.field E.below hnormal t bM).symm + have hbc : bM - k • piSigmaM = M.ρ g a - a := by + rw [ha] + apply Subtype.ext + have hprime' : k • piSigma.1 = u.1 + k • piL.1 := by + simpa using congrArg + (fun z : ambientFixedAddSubgroup A E.field.field ↦ (z : A.V)) hprime + change k • piL.1 + w.1.1 - k • piSigma.1 = w.1.1 - u.1 + rw [hprime'] + abel + let xM : M.V := bM + a - M.ρ t a + have hxM : M.ρ g xM = xM := by + exact abstractReciprocity_fixedCombination M g t (k • piSigmaM) bM a + hSigmaPow hbAction hbc + let T := Rep.FiniteCyclicGroup.normHomCompSub M g + let xCycle : T.moduleCatLeftHomologyData.K := ⟨xM, by + change M.ρ g xM - xM = 0 + exact sub_eq_zero.mpr hxM⟩ + let x : ambientFixedAddSubgroup A E.base.field := + (cyclicFixedCycleEquiv A E.base.field E.field.field E.below + hnormal E.finiteQuotient g hg).symm xCycle + refine ⟨a, x, ?_, ?_⟩ + · apply Subtype.ext + rfl + · have hActionVal := + v.valuationAt_extensionFixedRepresentation_action + E hnormal t a + have hxFormula : fixedFieldInclusion A E.base.field E.field.field E.below x = + k • piL + w.1 + e a - e (M.ρ t a) := by + apply Subtype.ext + rfl + have hval : + v.valuationAt E.field + (fixedFieldInclusion A E.base.field E.field.field E.below x) = + k • v.oneValue := by + rw [hxFormula, map_sub, map_add, map_add, map_nsmul, + hpiL, w.2, hActionVal] + abel + calc + ((v.valuationAt E.field + (fixedFieldInclusion A E.base.field E.field.field E.below x) : + v.valueGroup) : ZHat) = + ((k • v.oneValue : v.valueGroup) : ZHat) := + congrArg Subtype.val hval + _ = k • (1 : ZHat) := rfl + _ = Int.castRingHom ZHat (k : ℤ) := by + simp + +end ValuationData + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase.lean new file mode 100644 index 0000000000..5f11ba142e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.Conclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FixedSource +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusNorms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionCosets +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionEquiv + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/All.lean new file mode 100644 index 0000000000..f9706af837 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/All.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.Conclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FixedSource +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusNorms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionCosets +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionEquiv +/-! +# The cyclic totally ramified reciprocity case + +This aggregate module exposes the constructed Frobenius tower, restriction +equivalences, fixed-source calculation, and the final reciprocity theorem. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/Conclusion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/Conclusion.lean new file mode 100644 index 0000000000..1001713818 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/Conclusion.lean @@ -0,0 +1,309 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FixedSource +/-! +# Totally ramified reciprocity + +This file derives exponent vanishing, injectivity, and finally bijectivity of +finite reciprocity from the constructed fixed source. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace ValuationData + +variable {D : DegreeData G} {A : Rep ℤ G} + +-- The two fixed-field presentations have the same canonical addition. +-- Fix its homogeneous type before elaborating the bundled second operand. +local infixl:65 (priority := high) " + " => + (fun {α : Type _} [Add α] (a b : α) => HAdd.hAdd a b) + +/-- The exponent in the chosen cyclic decomposition is zero. -/ +theorem abstractReciprocity_cyclicTotallyRamified_exponent_eq_zero + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) + (E : FiniteCyclicSubextension K) + (hTot : E.IsTotallyRamified D) + (k : ℕ) + (hk : k < (E.toFiniteAbstractExtension.degree : ℕ)) + (piSigma : ambientFixedAddSubgroup A + (D.frobeniusFixedField (K.toFiniteResidueAbstractField D) + E.field E.below + (D.chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + (K.toFiniteResidueAbstractField D) + E.toFiniteGaloisSubextension + hTot + E.galoisGenerator))) + (piL : ambientFixedAddSubgroup A E.field) : + let L := E.toFiniteAbstractFieldExtension.field + let KR := K.toFiniteResidueAbstractField D + letI : Finite + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) KR.field + (le_baseField KR.field)) := by + change Finite + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) K.field + (le_baseField K.field)) + exact K.finite + let LG := E.toFiniteGaloisSubextension + letI : Finite + (KR.field.toSubgroup ⧸ + extensionSubgroup KR.field LG.field LG.below) := + LG.finite + let q := E.galoisGenerator + let hLGTot := hTot + let σ := D.chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + KR LG hLGTot q + let Sigma := D.frobeniusFixedField KR LG.field LG.below σ + let hSigmaK := D.frobeniusFixedField_le KR LG.field LG.below σ + letI : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field Sigma hSigmaK) := + D.frobeniusFixedField_finite KR LG.field LG.below σ + ∀ (w : v.unitAddSubgroup L) + (_hpiL : v.IsPrimeElement L piL) + (_hnorm : + relativeNorm A K.field E.field E.below (k • piL + w.1) = + relativeNorm A K.field Sigma hSigmaK (k • piSigma)), + k = 0 := by + dsimp only + let L := E.toFiniteAbstractFieldExtension.field + let KR := K.toFiniteResidueAbstractField D + let LG := E.toFiniteGaloisSubextension + let hLGfinite : Finite + (KR.field.toSubgroup ⧸ + extensionSubgroup KR.field LG.field LG.below) := + LG.finite + let hLGfiniteOverK : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field LG.field LG.below) := by + have h := hLGfinite + change Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field LG.field LG.below) at h + exact h + let q := E.galoisGenerator + let hLGTot := hTot + let hKRabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) KR.field (le_baseField KR.field)) := by + change Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) K.field (le_baseField K.field)) + exact K.finite + let σ := D.chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + KR LG hLGTot q + let Sigma := D.frobeniusFixedField KR LG.field LG.below σ + let hSigmaK := D.frobeniusFixedField_le KR LG.field LG.below σ + let hSigmaFinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field Sigma hSigmaK) := + D.frobeniusFixedField_finite KR LG.field LG.below σ + intro w hpiL hnorm + let M := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + KR LG hLGTot q + let hMfinite : Finite + (KR.field.toSubgroup ⧸ + extensionSubgroup KR.field M.field M.below) := + M.finite + let S := M.inertiaImage D + let M₀ := M.maximalUnramifiedSubextension D + let hMM₀ : M.field.toSubgroup ≤ M₀.toSubgroup := + M.field_le_intermediateField S + let hM₀K : M₀.toSubgroup ≤ K.field.toSubgroup := + M.intermediateField_le_base S + let N := M.lowerFiniteGalois S + let hNnormal : (extensionSubgroup M₀ M.field hMM₀).Normal := N.normal + let hNfinite : Finite + (M₀.toSubgroup ⧸ extensionSubgroup M₀ M.field hMM₀) := + N.finite + let hM₀finite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field M₀ hM₀K) := + M.intermediateField_finite S + let hM₀absolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) M₀ (le_baseField M₀)) := + FiniteGaloisSubextension.finite_extension_trans hM₀K (le_baseField K.field) + let hMabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) M.field (le_baseField M.field)) := + FiniteGaloisSubextension.finite_extension_trans M.below (le_baseField K.field) + let MF : FiniteAbstractField G := ⟨M.field, hMabsolute⟩ + let M₀F : FiniteAbstractField G := ⟨M₀, hM₀absolute⟩ + let EN : FiniteAbstractFieldExtension G := + { field := MF + base := M₀F + below := hMM₀ + finiteQuotient := hNfinite } + obtain ⟨x, hx⟩ := + v.abstractReciprocity_cyclicTotallyRamified_fixedSource hcf + K E hTot k piSigma piL w hpiL hnorm + have hkLower : k < (N.toFiniteAbstractExtension.degree : ℕ) := by + rw [D.abstractReciprocityTotallyRamifiedLowerDegree_eq + KR LG hLGTot q] + exact hk + exact abstractReciprocity_totallyRamified_valuation_forces_exponent_zero + v EN (by + simpa [EN, FiniteAbstractFieldExtension.IsTotallyRamified, + FiniteAbstractFieldExtension.toFiniteAbstractExtension] using + M.maximalUnramifiedSubextension_isTotallyRamified D) + k hkLower x hx + +/-- In the cyclic totally ramified case, the reciprocity homomorphism of +the finite reciprocity equivalence has trivial kernel. This is the final kernel calculation. -/ +theorem abstractReciprocity_cyclicTotallyRamified_finiteReciprocityHom_injective + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) + (E : FiniteCyclicSubextension K) + (hTot : E.IsTotallyRamified D) : + Function.Injective + (D.finiteReciprocityHom A v hAxiom K E.field E.below) := by + let L := E.toFiniteAbstractFieldExtension.field + let KR := K.toFiniteResidueAbstractField D + let LG := E.toFiniteGaloisSubextension + let hLGfinite : Finite + (KR.field.toSubgroup ⧸ + extensionSubgroup KR.field LG.field LG.below) := + LG.finite + let hLGfiniteOverK : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field LG.field LG.below) := by + have h := hLGfinite + change Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field LG.field LG.below) at h + exact h + let q := E.galoisGenerator + let qRaw := E.generator + let hLGTot := hTot + let hKRabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) KR.field (le_baseField KR.field)) := by + change Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) K.field (le_baseField K.field)) + exact K.finite + let Q := K.field.toSubgroup ⧸ + extensionSubgroup K.field E.field E.below + let EF := E.toFiniteAbstractExtension + let hQFintype : Fintype Q := Fintype.ofFinite _ + let σ := D.chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + KR LG hLGTot q + let Sigma := D.frobeniusFixedField KR LG.field LG.below σ + let hSigmaK := D.frobeniusFixedField_le KR LG.field LG.below σ + let hSigmaFinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field Sigma hSigmaK) := + D.frobeniusFixedField_finite KR LG.field LG.below σ + let hSigmaAbsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) Sigma (le_baseField Sigma)) := + D.frobeniusFixedField_absoluteFinite K LG.field LG.below σ + let SigmaF : FiniteAbstractField G := ⟨Sigma, hSigmaAbsolute⟩ + let piSigma : ambientFixedAddSubgroup A Sigma := v.chosenPrimeElement SigmaF + let piL : ambientFixedAddSubgroup A E.field := v.chosenPrimeElement L + rw [injective_iff_map_eq_zero] + intro x hx + obtain ⟨i, hi, _⟩ := + IsCyclic.unique_zpow_zmod (a := qRaw) E.generates x.toMul + let k : ℕ := i.val + have hcard : Fintype.card Q = (EF.degree : ℕ) := by + calc + Fintype.card Q = Nat.card Q := by + rw [Nat.card_eq_fintype_card] + _ = (extensionSubgroup K.field E.field E.below).index := + (Subgroup.index_eq_card + (extensionSubgroup K.field E.field E.below)).symm + _ = (EF.degree : ℕ) := + EF.extensionSubgroup_index_eq_degree + have hk : k < (EF.degree : ℕ) := by + rw [← hcard] + exact i.val_lt + have hxrepr : x = k • Additive.ofMul qRaw := by + apply Additive.toMul.injective + change x.toMul = qRaw ^ k + exact hi + rw [hxrepr, map_nsmul, + D.finiteReciprocityHom_apply_eq_primeNormClass + A v hAxiom K E.field E.below (Additive.ofMul qRaw) σ + (by + change D.frobeniusRestriction KR LG.field LG.below σ = qRaw + exact + (D.frobeniusRestriction_chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified_underlying + KR LG hLGTot q).trans + (E.toFiniteGaloisSubextension.extensionQuotientMulEquiv.apply_symm_apply + E.generator)) + piSigma (v.chosenPrimeElement_isPrime SigmaF)] at hx + have hclass : + finiteNormClass A K.field E.field E.below + (relativeNorm A K.field Sigma hSigmaK (k • piSigma)) = 0 := by + have hx' := hx + change k • finiteNormClass A K.field E.field E.below + (relativeNorm A K.field Sigma hSigmaK piSigma) = 0 at hx' + rw [map_nsmul, finiteNormClass_nsmul] + exact hx' + have hSigmaResidue : + ((DegreeData.FiniteAbstractExtension.ofInclusion + Sigma K.field hSigmaK).residueDegree D : ℕ) = 1 := by + calc + ((DegreeData.FiniteAbstractExtension.ofInclusion + Sigma K.field hSigmaK).residueDegree D : ℕ) = + D.frobeniusExponent KR LG.field LG.below σ := + D.frobeniusFixedField_residueDegreeOverBase KR LG.field LG.below σ + _ = 1 := + D.frobeniusExponent_chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + KR LG hLGTot q + let : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L.field E.below) := E.finite + obtain ⟨w, hnorm⟩ := + v.primeNormClass_eq_zero_exists_unit_norm_eq + K L SigmaF E.below hSigmaK hTot hSigmaResidue + k piSigma piL (v.chosenPrimeElement_isPrime SigmaF) + (v.chosenPrimeElement_isPrime L) hclass + have hkzero := v.abstractReciprocity_cyclicTotallyRamified_exponent_eq_zero + hcf K E hTot k hk piSigma piL + w (v.chosenPrimeElement_isPrime L) hnorm + rw [hxrepr, hkzero, zero_nsmul] + +/-- The cyclic totally ramified instance of the abstract reciprocity theorem. -/ +theorem abstractReciprocity_cyclicTotallyRamified_finiteReciprocityHom_bijective + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (hAxiom : v.SatisfiesUnramifiedUnitCohomology D) + (K : FiniteAbstractField G) + (E : FiniteCyclicSubextension K) + (hTot : E.IsTotallyRamified D) : + Function.Bijective + (D.finiteReciprocityHom A v hAxiom K E.field E.below) := by + let EF := E.toFiniteAbstractExtension + let hEbaseAbsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) EF.base (le_baseField EF.base)) := by + simpa [EF, FiniteCyclicSubextension.toFiniteAbstractExtension] using K.finite + let : Finite (FiniteNormQuotient A K.field E.field E.below) := + finiteNormQuotient_finite_of_classFieldAxiom + A hcf EF E.normal E.generator E.generates + apply (Nat.bijective_iff_injective_and_card + (D.finiteReciprocityHom A v hAxiom K E.field E.below)).2 + exact ⟨v.abstractReciprocity_cyclicTotallyRamified_finiteReciprocityHom_injective + hcf hAxiom K E hTot, + cyclicReciprocity_card_equality + A hcf EF E.normal E.generator E.generates⟩ + +end ValuationData + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FixedSource.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FixedSource.lean new file mode 100644 index 0000000000..e962c45365 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FixedSource.lean @@ -0,0 +1,505 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusNorms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamified +/-! +# The fixed source in the totally ramified reciprocity argument + +This file converts a finite cyclic extension to the canonical finite Galois +boundary and carries out the source-producing fixed-element calculation. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +/-- If two commuting group elements act compatibly on a coboundary, the +standard corrected combination is fixed by the first element. -/ +theorem abstractReciprocity_fixedCombination_of_commute + {Q : IntegralRepGroupType} [Group Q] (B : Rep ℤ Q) + (g t : Q) (hcomm : Commute g t) (c b a : B.V) + (htc : B.ρ t c = c) + (hgb : B.ρ g b = B.ρ t b) + (hbc : b - c = B.ρ g a - a) : + B.ρ g (b + a - B.ρ t a) = b + a - B.ρ t a := by + have hcommAction : B.ρ g (B.ρ t a) = B.ρ t (B.ρ g a) := by + calc + B.ρ g (B.ρ t a) = B.ρ (g * t) a := by + rw [map_mul] + rfl + _ = B.ρ (t * g) a := by rw [hcomm.eq] + _ = B.ρ t (B.ρ g a) := by + rw [map_mul] + rfl + have hb : b = c + B.ρ g a - a := by + calc + b = (b - c) + c := by abel + _ = (B.ρ g a - a) + c := by rw [hbc] + _ = c + B.ρ g a - a := by abel + have htbc := congrArg (fun z : B.V ↦ B.ρ t z) hbc + have htbc' : B.ρ t b - c = B.ρ t (B.ρ g a) - B.ρ t a := by + simpa only [map_sub, htc] using htbc + have htb : B.ρ t b = c + B.ρ t (B.ρ g a) - B.ρ t a := by + calc + B.ρ t b = (B.ρ t b - c) + c := by abel + _ = (B.ρ t (B.ρ g a) - B.ρ t a) + c := by rw [htbc'] + _ = c + B.ρ t (B.ρ g a) - B.ρ t a := by abel + calc + B.ρ g (b + a - B.ρ t a) = + B.ρ g b + B.ρ g a - B.ρ g (B.ρ t a) := by + simp only [map_add, map_sub] + _ = B.ρ t b + B.ρ g a - B.ρ t (B.ρ g a) := by + rw [hgb, hcommAction] + _ = c + B.ρ g a - B.ρ t a := by rw [htb]; abel + _ = b + a - B.ρ t a := by rw [hb]; abel + +namespace FiniteGaloisSubextension +/-- The lower inclusion homomorphism preserves the relative coset action. -/ +theorem relativeCosetAction_lowerInclusionHom + (A : Rep ℤ G) [IsTopologicalGroup G] {K : ClosedSubgroup G} + (M : FiniteGaloisSubextension K) (S : Subgroup M.extensionQuotient) + (a : ambientFixedAddSubgroup A M.field) + (g : (M.intermediateField S).toSubgroup ⧸ + extensionSubgroup (M.intermediateField S) M.field + (M.field_le_intermediateField S)) : + relativeCosetAction A (M.intermediateField S) M.field + (M.field_le_intermediateField S) a g = + relativeCosetAction A K M.field M.below a + (M.lowerInclusionHom S g) := by + refine Quotient.inductionOn' g ?_ + intro m + rfl +end FiniteGaloisSubextension + +namespace FiniteCyclicSubextension +variable {K : FiniteAbstractField G} +/-- Forget only the chosen cyclic generator. The resulting finite Galois +bundle is the canonical input to the finite reciprocity construction. -/ +def toFiniteGaloisSubextension (E : FiniteCyclicSubextension K) : + FiniteGaloisSubextension K.field where + field := E.field + below := E.below + normal := E.normal + finite := E.finite +/-- The cyclic generator transported across the finite Galois quotient +boundary. -/ +def galoisGenerator (E : FiniteCyclicSubextension K) : + E.toFiniteGaloisSubextension.extensionQuotient := + E.toFiniteGaloisSubextension.extensionQuotientMulEquiv.symm E.generator +/-- The transported generator still generates the whole finite Galois +quotient. -/ +theorem galoisGenerator_generates (E : FiniteCyclicSubextension K) : + ∀ x, x ∈ Subgroup.zpowers E.galoisGenerator := by + intro x + let e := E.toFiniteGaloisSubextension.extensionQuotientMulEquiv + obtain ⟨n, hn⟩ := Subgroup.mem_zpowers_iff.mp (E.generates (e x)) + apply Subgroup.mem_zpowers_iff.mpr + refine ⟨n, ?_⟩ + apply e.injective + change e (e.symm E.generator ^ n) = e x + exact (map_zpow e _ n).trans + ((congrArg (fun y => y ^ n) (e.apply_symm_apply E.generator)).trans hn) + +end FiniteCyclicSubextension + +namespace ValuationData + +variable {D : DegreeData G} {A : Rep ℤ G} + +-- The two fixed-field presentations have the same canonical addition. +-- Fix its homogeneous type before elaborating the bundled second operand. +local infixl:65 (priority := high) " + " => + (fun {α : Type _} [Add α] (a b : α) => HAdd.hAdd a b) + +private theorem fixedRepresentation_action_eq_of_coset_eq + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (g t : K.toSubgroup ⧸ extensionSubgroup K L hLK) + (b : ambientFixedAddSubgroup A L) + (h : relativeCosetAction A K L hLK b g = relativeCosetAction A K L hLK b t) : + let B := extensionFixedRepresentation A K L hLK hnormal + let e := extensionFixedRepresentationEquiv A K L hLK hnormal + B.ρ g (e.symm b) = B.ρ t (e.symm b) := by + apply Subtype.ext + let e := extensionFixedRepresentationEquiv A K L hLK hnormal + have hg := extensionFixedRepresentation_action_coe A K L hLK hnormal g (e.symm b) + have ht := extensionFixedRepresentation_action_coe A K L hLK hnormal t (e.symm b) + exact hg.trans (h.trans ht.symm) + +private theorem fixedRepresentation_fixes_nsmul_of_coset_fixed + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (g : K.toSubgroup ⧸ extensionSubgroup K L hLK) + (b : ambientFixedAddSubgroup A L) + (h : relativeCosetAction A K L hLK b g = b.1) (k : ℕ) : + let B := extensionFixedRepresentation A K L hLK hnormal + let e := extensionFixedRepresentationEquiv A K L hLK hnormal + B.ρ g (e.symm (k • b)) = e.symm (k • b) := by + let B := extensionFixedRepresentation A K L hLK hnormal + let e := extensionFixedRepresentationEquiv A K L hLK hnormal + have hfix : B.ρ g (e.symm b) = e.symm b := by + apply Subtype.ext + exact (extensionFixedRepresentation_action_coe A K L hLK hnormal g _).trans h + simpa only [map_nsmul] using congrArg (fun z => k • z) hfix + +private theorem fixedSource_of_cyclic_primitive + (v : ValuationData D A) [IsTopologicalGroup G] + (K : FiniteAbstractField G) (M : FiniteGaloisSubextension K.field) + (S : Subgroup M.extensionQuotient) + (g : (M.lowerFiniteGalois S).extensionQuotient) + (hg : ∀ x, x ∈ Subgroup.zpowers g) + (tB : K.field.toSubgroup ⧸ extensionSubgroup K.field M.field M.below) + (bM cM : ambientFixedAddSubgroup A M.field) (k : ℕ) : + let M₀ := M.intermediateField S + let hMM₀ := M.field_le_intermediateField S + let N := M.lowerFiniteGalois S + letI : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field M.field M.below) := M.finite + let EM := FiniteAbstractFieldExtension.ofInclusion M.field K M.below + let MF := EM.field + let B := extensionFixedRepresentation A K.field M.field M.below M.normal + let B₀ := extensionFixedRepresentation A M₀ M.field hMM₀ N.normal + let eB := extensionFixedRepresentationEquiv A K.field M.field M.below M.normal + let eB₀ := extensionFixedRepresentationEquiv A M₀ M.field hMM₀ N.normal + let gB := M.extensionQuotientMulEquiv (M.lowerInclusionHom S g) + ∀ (aN : B₀.V), + B₀.ρ g aN - aN = eB₀.symm (bM - cM) → + B.ρ tB (eB.symm cM) = eB.symm cM → + B.ρ gB (eB.symm bM) = B.ρ tB (eB.symm bM) → + Commute gB tB → v.valuationAt MF bM = k • v.oneValue → + ∃ x : ambientFixedAddSubgroup A M₀, + ((v.valuationAt MF (fixedFieldInclusion A M₀ M.field hMM₀ x) : + v.valueGroup) : ZHat) = Int.castRingHom ZHat (k : ℤ) := by + dsimp only + intro aN haN htc hgb hcomm hvalb + let M₀ := M.intermediateField S + let hMM₀ := M.field_le_intermediateField S + let N := M.lowerFiniteGalois S + let : Finite (K.field.toSubgroup ⧸ extensionSubgroup K.field M.field M.below) := M.finite + let EM := FiniteAbstractFieldExtension.ofInclusion M.field K M.below + let MF := EM.field + let B := extensionFixedRepresentation A K.field M.field M.below M.normal + let B₀ := extensionFixedRepresentation A M₀ M.field hMM₀ N.normal + let eB := extensionFixedRepresentationEquiv A K.field M.field M.below M.normal + let eB₀ := extensionFixedRepresentationEquiv A M₀ M.field hMM₀ N.normal + let gB := M.extensionQuotientMulEquiv (M.lowerInclusionHom S g) + let aB : B.V := eB.symm (eB₀ aN) + let bB : B.V := eB.symm bM + let cB : B.V := eB.symm cM + have hActionPrimitive : eB (B.ρ gB aB) = eB₀ (B₀.ρ g aN) := by + apply Subtype.ext + calc + (eB (B.ρ gB aB)).1 = + relativeCosetAction A K.field M.field M.below (eB aB) gB := + extensionFixedRepresentation_action_coe + A K.field M.field M.below M.normal gB aB + _ = relativeCosetAction A M₀ M.field hMM₀ (eB₀ aN) g := by + exact (M.relativeCosetAction_lowerInclusionHom A S (eB₀ aN) g).symm + _ = (eB₀ (B₀.ρ g aN)).1 := by + exact (extensionFixedRepresentation_action_coe + A M₀ M.field hMM₀ N.normal g aN).symm + have hprimitiveB : B.ρ gB aB - aB = eB.symm (bM - cM) := by + apply eB.injective + calc + eB (B.ρ gB aB - aB) = + eB₀ (B₀.ρ g aN) - eB₀ aN := by + rw [map_sub, hActionPrimitive] + simp [aB] + _ = eB₀ (B₀.ρ g aN - aN) := by + rw [map_sub] + _ = eB₀ (eB₀.symm (bM - cM)) := + congrArg eB₀ haN + _ = bM - cM := eB₀.apply_symm_apply _ + _ = eB (eB.symm (bM - cM)) := + (eB.apply_symm_apply _).symm + have hbc : bB - cB = B.ρ gB aB - aB := by + rw [hprimitiveB] + exact (map_sub eB.symm bM cM).symm + let xB : B.V := bB + aB - B.ρ tB aB + have hxB : B.ρ gB xB = xB := + abstractReciprocity_fixedCombination_of_commute + B gB tB hcomm cB bB aB htc hgb hbc + let xB₀ : B₀.V := eB₀.symm (eB xB) + have hActionX : eB₀ (B₀.ρ g xB₀) = eB (B.ρ gB xB) := by + apply Subtype.ext + calc + (eB₀ (B₀.ρ g xB₀)).1 = + relativeCosetAction A M₀ M.field hMM₀ (eB₀ xB₀) g := + extensionFixedRepresentation_action_coe + A M₀ M.field hMM₀ N.normal g xB₀ + _ = relativeCosetAction A K.field M.field M.below (eB xB) gB := + M.relativeCosetAction_lowerInclusionHom A S (eB xB) g + _ = (eB (B.ρ gB xB)).1 := by + exact (extensionFixedRepresentation_action_coe + A K.field M.field M.below M.normal gB xB).symm + have hxB₀ : B₀.ρ g xB₀ = xB₀ := by + apply eB₀.injective + rw [hActionX, hxB] + rfl + let : Fintype N.extensionQuotient := Fintype.ofFinite _ + let : IsCyclic N.extensionQuotient := + isCyclic_iff_exists_zpowers_eq_top.mpr ⟨g, top_unique (fun x _ => hg x)⟩ + let : CommGroup N.extensionQuotient := IsCyclic.commGroup + let T := Rep.FiniteCyclicGroup.normHomCompSub B₀ g + let xCycle : T.moduleCatLeftHomologyData.K := ⟨xB₀, by + change B₀.ρ g xB₀ - xB₀ = 0 + exact sub_eq_zero.mpr hxB₀⟩ + let x : ambientFixedAddSubgroup A M₀ := + (cyclicFixedCycleEquiv A M₀ M.field hMM₀ + N.normal N.finite g hg).symm xCycle + refine ⟨x, ?_⟩ + have hxFormula : fixedFieldInclusion A M₀ M.field hMM₀ x = eB xB := by + apply Subtype.ext + rfl + have hActionVal := + v.valuationAt_extensionFixedRepresentation_action + EM M.normal tB aB + change v.valuationAt MF (eB (B.ρ tB aB)) = v.valuationAt MF (eB aB) at hActionVal + have hval : v.valuationAt MF + (fixedFieldInclusion A M₀ M.field hMM₀ x) = + k • v.oneValue := by + rw [hxFormula] + have hxBFormula : eB xB = bM + eB aB - eB (B.ρ tB aB) := by + apply Subtype.ext + rfl + rw [hxBFormula] + rw [map_sub, map_add, hvalb, hActionVal] + abel + calc + ((v.valuationAt MF + (fixedFieldInclusion A M₀ M.field hMM₀ x) : + v.valueGroup) : ZHat) = + ((k • v.oneValue : v.valueGroup) : ZHat) := + congrArg Subtype.val hval + _ = k • (1 : ZHat) := rfl + _ = Int.castRingHom ZHat (k : ℤ) := by + simp + +/-- The complete source-producing calculation in the cyclic totally +ramified case of the abstract reciprocity theorem. All fields, restriction +maps, norm identities, and action identities are constructed from the +original data; none is exposed as a hypothesis. -/ +theorem abstractReciprocity_cyclicTotallyRamified_fixedSource + (v : ValuationData D A) (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteAbstractField G) + (E : FiniteCyclicSubextension K) + (hTot : E.IsTotallyRamified D) + (k : ℕ) + (piSigma : ambientFixedAddSubgroup A + (D.frobeniusFixedField (K.toFiniteResidueAbstractField D) + E.field E.below + (D.chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + (K.toFiniteResidueAbstractField D) + E.toFiniteGaloisSubextension + hTot + E.galoisGenerator))) + (piL : ambientFixedAddSubgroup A E.field) : + let L := E.toFiniteAbstractFieldExtension.field + let KR := K.toFiniteResidueAbstractField D + letI : Finite + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) KR.field + (le_baseField KR.field)) := K.finite + let LG := E.toFiniteGaloisSubextension + letI : Finite + (KR.field.toSubgroup ⧸ + extensionSubgroup KR.field LG.field LG.below) := + LG.finite + let q := E.galoisGenerator + let hLGTot := hTot + let σ := D.chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + KR LG hLGTot q + let Sigma := D.frobeniusFixedField KR LG.field LG.below σ + let hSigmaK := D.frobeniusFixedField_le KR LG.field LG.below σ + letI : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field Sigma hSigmaK) := + D.frobeniusFixedField_finite KR LG.field LG.below σ + ∀ (w : v.unitAddSubgroup L) + (_hpiL : v.IsPrimeElement L piL) + (_hnorm : + relativeNorm A K.field E.field E.below (k • piL + w.1) = + relativeNorm A K.field Sigma hSigmaK (k • piSigma)), + let M := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + KR LG hLGTot q + letI : Finite + (KR.field.toSubgroup ⧸ + extensionSubgroup KR.field M.field M.below) := + M.finite + letI : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) M.field + (le_baseField M.field)) := + FiniteGaloisSubextension.finite_extension_trans M.below (le_baseField K.field) + let MF : FiniteAbstractField G := ⟨M.field, inferInstance⟩ + let S := M.inertiaImage D + let M₀ := M.maximalUnramifiedSubextension D + let hMM₀ : M.field.toSubgroup ≤ M₀.toSubgroup := + M.field_le_intermediateField S + ∃ x : ambientFixedAddSubgroup A M₀, + ((v.valuationAt MF + (fixedFieldInclusion A M₀ M.field hMM₀ x) : + v.valueGroup) : ZHat) = + Int.castRingHom ZHat (k : ℤ) := by + dsimp only + let L := E.toFiniteAbstractFieldExtension.field + let KR := K.toFiniteResidueAbstractField D + let LG := E.toFiniteGaloisSubextension + let hLGfinite := LG.finite + let q := E.galoisGenerator + let hq := E.galoisGenerator_generates + let hLGTot := hTot + let hKRabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) KR.field (le_baseField KR.field)) := K.finite + let σ := D.chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + KR LG hLGTot q + let Sigma := D.frobeniusFixedField KR LG.field LG.below σ + let hSigmaK := D.frobeniusFixedField_le KR LG.field LG.below σ + let hSigmaFinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field Sigma hSigmaK) := + D.frobeniusFixedField_finite KR LG.field LG.below σ + intro w hpiL hnorm + let M := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + KR LG hLGTot q + let hMfinite := M.finite + let hMabsolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) M.field (le_baseField M.field)) := + FiniteGaloisSubextension.finite_extension_trans M.below (le_baseField K.field) + let MF : FiniteAbstractField G := ⟨M.field, hMabsolute⟩ + let S := M.inertiaImage D + let M₀ := M.maximalUnramifiedSubextension D + let hML := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension_le_L + KR LG hLGTot q + let hMSigma := + D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension_le_sigma + KR LG hLGTot q + let hMM₀ : M.field.toSubgroup ≤ M₀.toSubgroup := + M.field_le_intermediateField S + let hM₀K : M₀.toSubgroup ≤ K.field.toSubgroup := + M.intermediateField_le_base S + let N := M.lowerFiniteGalois S + let hMnormal : (extensionSubgroup K.field M.field M.below).Normal := M.normal + let hNnormal : (extensionSubgroup M₀ M.field hMM₀).Normal := N.normal + let hNfinite : Finite (M₀.toSubgroup ⧸ extensionSubgroup M₀ M.field hMM₀) := N.finite + let hMLfinite : Finite + (E.field.toSubgroup ⧸ extensionSubgroup E.field M.field hML) := + FiniteGaloisSubextension.finite_extension_over_intermediate + M.below E.below hML + let hM₀finite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field M₀ hM₀K) := M.intermediateField_finite S + let hM₀absolute : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) M₀ (le_baseField M₀)) := + FiniteGaloisSubextension.finite_extension_trans hM₀K (le_baseField K.field) + let M₀F : FiniteAbstractField G := ⟨M₀, hM₀absolute⟩ + let EN : FiniteAbstractFieldExtension G := + { field := MF + base := M₀F + below := hMM₀ + finiteQuotient := hNfinite } + let EML : FiniteAbstractFieldExtension G := + { field := MF + base := L + below := hML + finiteQuotient := hMLfinite } + have hUnramifiedML : + EML.IsUnramified D := by + change EML.toFiniteAbstractExtension.IsUnramified D + rw [EML.toFiniteAbstractExtension.isUnramified_iff_inertia_le D] + intro x hx + apply D.maximalUnramifiedField_le_abstractReciprocityTotallyRamifiedFiniteGaloisExtension + KR LG hLGTot q + exact hx + let piSigmaM : ambientFixedAddSubgroup A M.field := + fixedFieldInclusion A Sigma M.field hMSigma piSigma + let piLM : ambientFixedAddSubgroup A M.field := + fixedFieldInclusion A E.field M.field hML piL + let wUnitM : v.unitAddSubgroup MF := + v.unitInclusion EML hUnramifiedML w + let wM : ambientFixedAddSubgroup A M.field := wUnitM.1 + have hpiLM : v.IsPrimeElement MF piLM := by + exact v.prime_of_unramified EML hUnramifiedML piL hpiL + let cM : ambientFixedAddSubgroup A M.field := k • piSigmaM + let bM : ambientFixedAddSubgroup A M.field := k • piLM + wM + let uM : ambientFixedAddSubgroup A M.field := cM - k • piLM + have hbM : + bM = fixedFieldInclusion A E.field M.field hML (k • piL + w.1) := rfl + have hcM : + cM = fixedFieldInclusion A Sigma M.field hMSigma (k • piSigma) := rfl + have hNormBC : relativeNorm A M₀ M.field hMM₀ bM = + relativeNorm A M₀ M.field hMM₀ cM := + (D.abstractReciprocity_totallyRamified_relativeNorm_L + A KR LG hLGTot q (k • piL + w.1)).trans + ((congrArg (fixedFieldInclusion A K.field M₀ hM₀K) hnorm).trans + (D.abstractReciprocity_totallyRamified_relativeNorm_sigma + A KR LG hLGTot q (k • piSigma)).symm) + have hnormWU : relativeNorm A M₀ M.field hMM₀ wM = + relativeNorm A M₀ M.field hMM₀ uM := by + dsimp only [bM, cM, uM] at hNormBC ⊢ + rw [map_add, map_nsmul, map_nsmul] at hNormBC + rw [map_sub, map_nsmul, map_nsmul] + exact eq_sub_of_add_eq' hNormBC + let g := D.abstractReciprocityTotallyRamifiedLowerGenerator + KR LG hLGTot q + have hg : ∀ x, x ∈ Subgroup.zpowers g := + D.abstractReciprocityTotallyRamifiedLowerGenerator_generates + KR LG hLGTot q hq + let hNFintype : Fintype N.extensionQuotient := Fintype.ofFinite _ + let hNCyclic : IsCyclic N.extensionQuotient := + isCyclic_iff_exists_zpowers_eq_top.mpr ⟨g, top_unique (fun x _ => hg x)⟩ + let hNcomm : CommGroup N.extensionQuotient := IsCyclic.commGroup + obtain ⟨aN, haN⟩ := + abstractReciprocity_exists_hMinusOne_primitive hcf + EN N.normal g hg uM wM hnormWU + let B := extensionFixedRepresentation A K.field M.field M.below M.normal + let B₀ := extensionFixedRepresentation A M₀ M.field hMM₀ N.normal + let eB := extensionFixedRepresentationEquiv A K.field M.field M.below M.normal + let eB₀ := extensionFixedRepresentationEquiv A M₀ M.field hMM₀ N.normal + let gB := M.extensionQuotientMulEquiv (M.lowerInclusionHom S g) + let tB := M.extensionQuotientMulEquiv + (D.abstractReciprocityTotallyRamifiedFrobeniusInM + KR LG hLGTot q) + let aB : B.V := eB.symm (eB₀ aN) + let bB : B.V := eB.symm bM + let cB : B.V := eB.symm cM + have hprimitive : B₀.ρ g aN - aN = eB₀.symm (bM - cM) := by + have hdiff : wM - uM = bM - cM := by + dsimp only [wM, uM, bM] + abel + exact haN.trans (congrArg eB₀.symm hdiff) + have htc : B.ρ tB cB = cB := + fixedRepresentation_fixes_nsmul_of_coset_fixed A K.field M.field M.below M.normal + tB piSigmaM (D.abstractReciprocityTotallyRamified_frobenius_fixes_sigma + A KR LG hLGTot q piSigma) k + have hgb : B.ρ gB bB = B.ρ tB bB := by + apply fixedRepresentation_action_eq_of_coset_eq A K.field M.field M.below M.normal + rw [hbM] + exact D.abstractReciprocityTotallyRamified_actions_agree_on_L A KR LG hLGTot q + (k • piL + w.1) + have hcomm : Commute gB tB := + (D.abstractReciprocityTotallyRamified_generator_commutes_frobenius + KR LG hLGTot q).map M.extensionQuotientMulEquiv.toMonoidHom + have hvalb : v.valuationAt MF bM = k • v.oneValue := by + dsimp only [bM] + rw [map_add, map_nsmul, hpiLM, wUnitM.2, add_zero] + exact v.fixedSource_of_cyclic_primitive K M S g hg tB bM cM k + aN hprimitive htc hgb hcomm hvalb + +end ValuationData + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusLift.lean new file mode 100644 index 0000000000..522e0b83d3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusLift.lean @@ -0,0 +1,347 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction +/-! +# Frobenius lifts for totally ramified extensions + +This file constructs degree-one Frobenius lifts and the finite auxiliary +Galois extension used in the totally ramified reciprocity argument. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- Every automorphism of a totally ramified Galois extension has a +Frobenius lift of exponent one. -/ +theorem exists_degreeOneFrobeniusLiftOfTotallyRamified + (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : GaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) : + ∃ σ : D.FrobeniusElements K L.field L.below, + D.frobeniusExponent K L.field L.below σ = 1 ∧ + L.extensionQuotientMulEquiv.symm + (D.frobeniusRestriction K L.field L.below σ) = q := by + let φ := D.chosenDegreeOneFrobeniusElement K L.field L.below + let q₀ := D.frobeniusRestriction K L.field L.below φ + let qRaw := L.extensionQuotientMulEquiv q + obtain ⟨s, hs⟩ := QuotientGroup.mk'_surjective + (extensionSubgroup K.field L.field L.below) (qRaw * q₀⁻¹) + have hsDegree : D.degree s.1 ∈ + K.field.toSubgroup.map D.degree.toMonoidHom := ⟨s.1, s.2, rfl⟩ + have hImage := + (L.isTotallyRamified_iff_image_le D).1 hTot hsDegree + obtain ⟨l, hlL, hlDegree⟩ := hImage + let lL : L.field.toSubgroup := ⟨l, hlL⟩ + let lK : K.field.toSubgroup := Subgroup.inclusion L.below lL + let i : K.field.toSubgroup := s * lK⁻¹ + let t : K.field.toSubgroup ⧸ + D.extensionInertiaWithin K.field L.field L.below := + QuotientGroup.mk i * φ.1 + have hiDegree : D.normalizedDegree K i = 1 := by + change i ∈ (D.normalizedDegree K).toMonoidHom.ker + rw [D.normalizedDegree_ker K] + change D.degree i.1 = 1 + dsimp [i, lK, lL] + rw [map_mul, map_inv] + change D.degree s.1 * (D.degree l)⁻¹ = 1 + rw [← hlDegree] + simp + have htDegree : D.extensionNormalizedDegree K L.field L.below t = + (Multiplicative.ofAdd (1 : ZHat) : ZHatMul) ^ (1 : ℕ) := by + change D.extensionNormalizedDegree K L.field L.below + (QuotientGroup.mk i * φ.1) = _ + rw [map_mul, D.extensionNormalizedDegree_mk, hiDegree, one_mul] + calc + D.extensionNormalizedDegree K L.field L.below φ.1 = + (Multiplicative.ofAdd (1 : ZHat) : ZHatMul) ^ + D.frobeniusExponent K L.field L.below φ := + D.extensionNormalizedDegree_frobenius_eq_pow K L.field L.below φ + _ = (Multiplicative.ofAdd (1 : ZHat) : ZHatMul) ^ (1 : ℕ) := by + rw [D.frobeniusExponent_chosenDegreeOneFrobeniusElement] + let σ : D.FrobeniusElements K L.field L.below := + ⟨t, 1, Nat.one_pos, htDegree⟩ + have hσExponent : D.frobeniusExponent K L.field L.below σ = 1 := by + apply proCIntegerOne_pow_nat_injective + calc + (Multiplicative.ofAdd (1 : ZHat) : ZHatMul) ^ + D.frobeniusExponent K L.field L.below σ = + D.extensionNormalizedDegree K L.field L.below σ.1 := + (D.extensionNormalizedDegree_frobenius_eq_pow + K L.field L.below σ).symm + _ = (Multiplicative.ofAdd (1 : ZHat) : ZHatMul) ^ (1 : ℕ) := + htDegree + refine ⟨σ, hσExponent, ?_⟩ + refine L.extensionQuotientMulEquiv.symm_apply_eq.mpr ?_ + change D.extensionRestriction K.field L.field L.below + (QuotientGroup.mk i * φ.1) = qRaw + rw [map_mul, D.extensionRestriction_mk] + have hiRestriction : + (QuotientGroup.mk i : + K.field.toSubgroup ⧸ extensionSubgroup K.field L.field L.below) = + QuotientGroup.mk s := by + dsimp [i] + change (QuotientGroup.mk' (extensionSubgroup K.field L.field L.below)) + (s * lK⁻¹) = + (QuotientGroup.mk' (extensionSubgroup K.field L.field L.below)) s + rw [map_mul, map_inv] + have hlOne : + (QuotientGroup.mk' (extensionSubgroup K.field L.field L.below)) lK = 1 := by + apply (QuotientGroup.eq_one_iff _).2 + exact lL.2 + rw [hlOne, inv_one, mul_one] + rw [hiRestriction] + change (QuotientGroup.mk' (extensionSubgroup K.field L.field L.below)) s * q₀ = qRaw + rw [hs] + simp [q₀] +/-- In a totally ramified finite Galois extension every finite automorphism +has a degree-one Frobenius lift. This is the element denoted +`\tilde\sigma = \sigma\varphi_L`. -/ +noncomputable def chosenDegreeOneFrobeniusLiftOfTotallyRamified + (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : GaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) : + D.FrobeniusElements K L.field L.below := + Classical.choose + (D.exists_degreeOneFrobeniusLiftOfTotallyRamified + K L hTot q) +/-- The chosen Frobenius lift for a totally ramified extension has exponent one. -/ +@[simp] +theorem frobeniusExponent_chosenDegreeOneFrobeniusLiftOfTotallyRamified + (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : GaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) : + D.frobeniusExponent K L.field L.below + (D.chosenDegreeOneFrobeniusLiftOfTotallyRamified + K L hTot q) = 1 := by + exact (Classical.choose_spec + (D.exists_degreeOneFrobeniusLiftOfTotallyRamified + K L hTot q)).1 +/-- The chosen degree-one Frobenius lift restricts to the prescribed automorphism. -/ +@[simp] +theorem frobeniusRestriction_chosenDegreeOneFrobeniusLiftOfTotallyRamified + (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : GaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) : + L.extensionQuotientMulEquiv.symm + (D.frobeniusRestriction K L.field L.below + (D.chosenDegreeOneFrobeniusLiftOfTotallyRamified + K L hTot q)) = q := by + exact (Classical.choose_spec + (D.exists_degreeOneFrobeniusLiftOfTotallyRamified + K L hTot q)).2 +/-- Underlying quotient form of the Galois-bundle restriction theorem. -/ +theorem frobeniusRestriction_chosenDegreeOneFrobeniusLiftOfTotallyRamified_underlying + (D : DegreeData G) + (K : FiniteResidueAbstractField D) (L : GaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) : + D.frobeniusRestriction K L.field L.below + (D.chosenDegreeOneFrobeniusLiftOfTotallyRamified + K L hTot q) = + L.extensionQuotientMulEquiv q := by + apply L.extensionQuotientMulEquiv.symm.injective + exact + D.frobeniusRestriction_chosenDegreeOneFrobeniusLiftOfTotallyRamified + K L hTot q +/-- The degree-one lift specialized to a bundled finite Galois extension. +The conversion to the non-finite Galois boundary and the quotient comparison +are performed once in this definition. -/ +noncomputable def chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + (D : DegreeData G) + (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) : + D.FrobeniusElements K L.field L.below := + D.chosenDegreeOneFrobeniusLiftOfTotallyRamified + K L.toGaloisSubextension + (L.isTotallyRamified_toGaloisSubextension D hTot) + (L.toGaloisExtensionQuotientMulEquiv q) +/-- The finite totally ramified Frobenius lift has exponent one. -/ +@[simp] +theorem frobeniusExponent_chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + (D : DegreeData G) + (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) : + D.frobeniusExponent K L.field L.below + (D.chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + K L hTot q) = 1 := by + exact D.frobeniusExponent_chosenDegreeOneFrobeniusLiftOfTotallyRamified + K L.toGaloisSubextension + (L.isTotallyRamified_toGaloisSubextension D hTot) + (L.toGaloisExtensionQuotientMulEquiv q) +/-- The finite totally ramified Frobenius lift restricts to the chosen automorphism. -/ +@[simp] +theorem frobeniusRestriction_chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + (D : DegreeData G) + (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) : + L.extensionQuotientMulEquiv.symm + (D.frobeniusRestriction K L.field L.below + (D.chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + K L hTot q)) = q := by + refine L.extensionQuotientMulEquiv.symm_apply_eq.mpr ?_ + have h := + D.frobeniusRestriction_chosenDegreeOneFrobeniusLiftOfTotallyRamified_underlying + K L.toGaloisSubextension + (L.isTotallyRamified_toGaloisSubextension D hTot) + (L.toGaloisExtensionQuotientMulEquiv q) + change + D.frobeniusRestriction K L.field L.below + (D.chosenDegreeOneFrobeniusLiftOfTotallyRamified + K L.toGaloisSubextension + (L.isTotallyRamified_toGaloisSubextension D hTot) + (L.toGaloisExtensionQuotientMulEquiv q)) = + L.extensionQuotientMulEquiv q at h + exact h +/-- Underlying quotient form of the preceding finite-bundle theorem. -/ +theorem frobeniusRestriction_chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified_underlying + (D : DegreeData G) + (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) : + D.frobeniusRestriction K L.field L.below + (D.chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + K L hTot q) = + L.extensionQuotientMulEquiv q := by + apply L.extensionQuotientMulEquiv.symm.injective + exact + D.frobeniusRestriction_chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + K L hTot q +/-- The finite Galois extension `M / K` chosen. It contains both +`L` and the degree-one Frobenius fixed field `Σ`, and is contained in the +maximal unramified extension of `L`. -/ +noncomputable def abstractReciprocityTotallyRamifiedFiniteGaloisExtension + (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) : + FiniteGaloisSubextension K.field := by + let σ := D.chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + K L hTot q + letI : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L.field L.below) := + L.finite + let SigmaI := D.frobeniusFixedIntermediateField K L.field L.below σ + let LI := D.fieldAsMaximalUnramifiedIntermediate K.field L.field L.below + let C := SigmaI.compositum LI + letI : (extensionSubgroup K.field (D.maximalUnramifiedField L.field) + (D.maximalUnramifiedField_le_of_le L.below)).Normal := + D.extensionSubgroup_maximalUnramifiedField_normal K.field L.field L.below + let M := C.galoisRefinement + exact + { field := M.field + below := M.below + normal := by + exact FiniteIntermediateField.galoisRefinement_normal C + finite := M.finite } +/-- The auxiliary reciprocity extension lies below the given totally ramified extension. -/ +theorem abstractReciprocityTotallyRamifiedFiniteGaloisExtension_le_L + (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) : + (D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q).field.toSubgroup ≤ L.field.toSubgroup := by + let σ := D.chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + K L hTot q + let : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L.field L.below) := + L.finite + let SigmaI := D.frobeniusFixedIntermediateField K L.field L.below σ + let LI := D.fieldAsMaximalUnramifiedIntermediate K.field L.field L.below + let C := SigmaI.compositum LI + let : (extensionSubgroup K.field (D.maximalUnramifiedField L.field) + (D.maximalUnramifiedField_le_of_le L.below)).Normal := + D.extensionSubgroup_maximalUnramifiedField_normal K.field L.field L.below + change (C.galoisRefinement).field.toSubgroup ≤ L.field.toSubgroup + exact C.galoisRefinement_le_field.trans + (FiniteIntermediateField.compositum_le_right SigmaI LI) +/-- The auxiliary reciprocity extension is fixed by the selected automorphism. -/ +theorem abstractReciprocityTotallyRamifiedFiniteGaloisExtension_le_sigma + (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) : + (D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q).field.toSubgroup ≤ + (D.frobeniusFixedField K L.field L.below + (D.chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + K L hTot q)).toSubgroup := by + let σ := D.chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + K L hTot q + let : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L.field L.below) := + L.finite + let SigmaI := D.frobeniusFixedIntermediateField K L.field L.below σ + let LI := D.fieldAsMaximalUnramifiedIntermediate K.field L.field L.below + let C := SigmaI.compositum LI + let : (extensionSubgroup K.field (D.maximalUnramifiedField L.field) + (D.maximalUnramifiedField_le_of_le L.below)).Normal := + D.extensionSubgroup_maximalUnramifiedField_normal K.field L.field L.below + change (C.galoisRefinement).field.toSubgroup ≤ SigmaI.field.toSubgroup + exact C.galoisRefinement_le_field.trans + (FiniteIntermediateField.compositum_le_left SigmaI LI) + +/-- The maximal unramified field lies below the auxiliary totally ramified reciprocity field. -/ +theorem maximalUnramifiedField_le_abstractReciprocityTotallyRamifiedFiniteGaloisExtension + (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) : + (D.maximalUnramifiedField L.field).toSubgroup ≤ + (D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q).field.toSubgroup := by + let σ := D.chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + K L hTot q + let : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L.field L.below) := + L.finite + let SigmaI := D.frobeniusFixedIntermediateField K L.field L.below σ + let LI := D.fieldAsMaximalUnramifiedIntermediate K.field L.field L.below + let C := SigmaI.compositum LI + let : (extensionSubgroup K.field (D.maximalUnramifiedField L.field) + (D.maximalUnramifiedField_le_of_le L.below)).Normal := + D.extensionSubgroup_maximalUnramifiedField_normal K.field L.field L.below + change (D.maximalUnramifiedField L.field).toSubgroup ≤ + (C.galoisRefinement).field.toSubgroup + exact (C.galoisRefinement).above + +end DegreeData + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusNorms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusNorms.lean new file mode 100644 index 0000000000..95cffcf33e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusNorms.lean @@ -0,0 +1,469 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionEquiv +/-! +# Frobenius actions and relative norms in a totally ramified tower + +This file constructs the Frobenius element in the auxiliary extension and +proves its restriction, commutation, action, and relative-norm identities. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- The restriction `\tilde\sigma|_M`, an element of the actual upper +quotient `G(M/K)`. -/ +noncomputable def abstractReciprocityTotallyRamifiedFrobeniusInM + (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) : + (D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q).extensionQuotient := by + let σ := D.chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + K L hTot q + let M := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + letI : (extensionSubgroup K.field M.field M.below).Normal := M.normal + have hIM : D.extensionInertiaWithin K.field L.field L.below ≤ + extensionSubgroup K.field M.field M.below := by + intro x hx + apply (mem_extensionSubgroup_iff K.field M.field M.below x).2 + apply D.maximalUnramifiedField_le_abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + exact ⟨(mem_extensionSubgroup_iff K.field L.field L.below x).1 hx.1, + (D.mem_fieldInertiaWithin_iff K.field x).1 hx.2⟩ + let r : (K.field.toSubgroup ⧸ + D.extensionInertiaWithin K.field L.field L.below) →* + (K.field.toSubgroup ⧸ + extensionSubgroup K.field M.field M.below) := + QuotientGroup.map + (D.extensionInertiaWithin K.field L.field L.below) + (extensionSubgroup K.field M.field M.below) + (MonoidHom.id K.field.toSubgroup) hIM + exact M.extensionQuotientMulEquiv.symm (r σ.1) + +/-- The Frobenius chosen in the auxiliary field has the expected restriction. -/ +@[simp] +theorem abstractReciprocityTotallyRamifiedFrobeniusInM_restriction + (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) : + let M := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + let hML := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension_le_L + K L hTot q + M.bundledRestrictionHom L hML + (D.abstractReciprocityTotallyRamifiedFrobeniusInM + K L hTot q) = q := by + let σ := D.chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + K L hTot q + let M := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + let hML := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension_le_L + K L hTot q + let : (extensionSubgroup K.field M.field M.below).Normal := M.normal + have hIM : D.extensionInertiaWithin K.field L.field L.below ≤ + extensionSubgroup K.field M.field M.below := by + intro x hx + apply (mem_extensionSubgroup_iff K.field M.field M.below x).2 + apply D.maximalUnramifiedField_le_abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + exact ⟨(mem_extensionSubgroup_iff K.field L.field L.below x).1 hx.1, + (D.mem_fieldInertiaWithin_iff K.field x).1 hx.2⟩ + let r : (K.field.toSubgroup ⧸ + D.extensionInertiaWithin K.field L.field L.below) →* + (K.field.toSubgroup ⧸ + extensionSubgroup K.field M.field M.below) := + QuotientGroup.map + (D.extensionInertiaWithin K.field L.field L.below) + (extensionSubgroup K.field M.field M.below) + (MonoidHom.id K.field.toSubgroup) hIM + change L.extensionQuotientMulEquiv.symm + (abstractReciprocityRestriction K.field L.field M.field hML L.below + (r σ.1)) = q + refine L.extensionQuotientMulEquiv.symm_apply_eq.mpr ?_ + have hcompat : ∀ z : K.field.toSubgroup ⧸ + D.extensionInertiaWithin K.field L.field L.below, + abstractReciprocityRestriction K.field L.field M.field hML L.below (r z) = + D.extensionRestriction K.field L.field L.below z := by + intro z + refine Quotient.inductionOn' z ?_ + intro x + rfl + exact (hcompat σ.1).trans + (D.frobeniusRestriction_chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified_underlying + K L hTot q) + +/-- Including the lower generator and then restricting recovers its prescribed action. -/ +@[simp] +theorem abstractReciprocityTotallyRamifiedLowerGenerator_inclusion_restriction + (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) : + let M := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + let S := M.inertiaImage D + let hML := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension_le_L + K L hTot q + M.bundledRestrictionHom L hML + (M.lowerInclusionHom S + (D.abstractReciprocityTotallyRamifiedLowerGenerator + K L hTot q)) = q := by + let M := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + let S := M.inertiaImage D + let hML := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension_le_L + K L hTot q + let e := D.abstractReciprocityTotallyRamifiedRestrictionEquiv + K L hTot q + let g := D.abstractReciprocityTotallyRamifiedLowerGenerator + K L hTot q + change M.bundledRestrictionHom L hML + (M.lowerInclusionHom S g) = q + have hcompat : ∀ x, + M.bundledRestrictionHom L hML + (M.lowerInclusionHom S x) = e x := by + intro x + refine Quotient.inductionOn' x ?_ + intro m + rw [M.lowerInclusionHom_mk S m] + dsimp [e, abstractReciprocityTotallyRamifiedRestrictionEquiv] + rfl + exact (hcompat g).trans + (D.abstractReciprocityTotallyRamifiedRestrictionEquiv_lowerGenerator K L hTot q) + +/-- The lower cyclic generator commutes with the selected Frobenius element. -/ +theorem abstractReciprocityTotallyRamified_generator_commutes_frobenius + (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) : + let M := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + let S := M.inertiaImage D + Commute + (M.lowerInclusionHom S + (D.abstractReciprocityTotallyRamifiedLowerGenerator + K L hTot q)) + (D.abstractReciprocityTotallyRamifiedFrobeniusInM + K L hTot q) := by + let M := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + let S := M.inertiaImage D + let hML := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension_le_L + K L hTot q + let g := D.abstractReciprocityTotallyRamifiedLowerGenerator + K L hTot q + let t := D.abstractReciprocityTotallyRamifiedFrobeniusInM + K L hTot q + let EL : DegreeData.AbstractExtension G := { + field := L.field + base := K.field + below := L.below } + let : (extensionSubgroup EL.base EL.field EL.below).Normal := by + change (extensionSubgroup K.field L.field L.below).Normal + exact L.normal + have hresBundled : + M.bundledRestrictionHom L hML (M.lowerInclusionHom S g) = + M.bundledRestrictionHom L hML t := by + rw [D.abstractReciprocityTotallyRamifiedLowerGenerator_inclusion_restriction, + D.abstractReciprocityTotallyRamifiedFrobeniusInM_restriction] + have hresRaw : + abstractReciprocityRestriction K.field L.field M.field hML L.below + (M.extensionQuotientMulEquiv (M.lowerInclusionHom S g)) = + abstractReciprocityRestriction K.field L.field M.field hML L.below + (M.extensionQuotientMulEquiv t) := by + apply L.extensionQuotientMulEquiv.symm.injective + simpa [FiniteGaloisSubextension.bundledRestrictionHom] using hresBundled + have hcommRaw := M.commute_of_same_restriction_of_inertia_le + D EL hML + (D.maximalUnramifiedField_le_abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q) + (M.extensionQuotientMulEquiv (M.lowerInclusionHom S g)) + (M.extensionQuotientMulEquiv t) hresRaw + rw [Commute] + apply M.extensionQuotientMulEquiv.injective + simpa only [map_mul] using hcommRaw.eq + +/-- Frobenius fixes the automorphism used in the totally ramified construction. -/ +theorem abstractReciprocityTotallyRamified_frobenius_fixes_sigma + (D : DegreeData G) (A : Rep ℤ G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) + (a : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L.field L.below + (D.chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + K L hTot q))) : + let σ := D.chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + K L hTot q + let Sigma := D.frobeniusFixedField K L.field L.below σ + let M := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + let hMSigma := + D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension_le_sigma + K L hTot q + relativeCosetAction A K.field M.field M.below + (fixedFieldInclusion A Sigma M.field hMSigma a) + (M.extensionQuotientMulEquiv + (D.abstractReciprocityTotallyRamifiedFrobeniusInM + K L hTot q)) = + (fixedFieldInclusion A Sigma M.field hMSigma a).1 := by + let σ := D.chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + K L hTot q + let Sigma := D.frobeniusFixedField K L.field L.below σ + let M := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + let hMSigma := + D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension_le_sigma + K L hTot q + let : (extensionSubgroup K.field M.field M.below).Normal := M.normal + have hIM : D.extensionInertiaWithin K.field L.field L.below ≤ + extensionSubgroup K.field M.field M.below := by + intro x hx + apply (mem_extensionSubgroup_iff K.field M.field M.below x).2 + apply D.maximalUnramifiedField_le_abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + exact ⟨(mem_extensionSubgroup_iff K.field L.field L.below x).1 hx.1, + (D.mem_fieldInertiaWithin_iff K.field x).1 hx.2⟩ + let r : (K.field.toSubgroup ⧸ + D.extensionInertiaWithin K.field L.field L.below) →* + (K.field.toSubgroup ⧸ + extensionSubgroup K.field M.field M.below) := + QuotientGroup.map + (D.extensionInertiaWithin K.field L.field L.below) + (extensionSubgroup K.field M.field M.below) + (MonoidHom.id K.field.toSubgroup) hIM + change relativeCosetAction A K.field M.field M.below + (fixedFieldInclusion A Sigma M.field hMSigma a) (r σ.1) = _ + let x : K.field.toSubgroup := Quotient.out σ.1 + have hx : (QuotientGroup.mk x : + K.field.toSubgroup ⧸ + D.extensionInertiaWithin K.field L.field L.below) = σ.1 := + Quotient.out_eq' σ.1 + rw [← hx] + change A.ρ x.1 a.1 = a.1 + have hxClosure : (QuotientGroup.mk x : + K.field.toSubgroup ⧸ + D.extensionInertiaWithin K.field L.field L.below) ∈ + (D.frobeniusClosure K L.field L.below σ).toSubgroup := by + rw [hx] + exact (D.frobeniusInClosure K L.field L.below σ).2 + let xSigma : Sigma.toSubgroup := + ⟨x.1, ⟨x, hxClosure, rfl⟩⟩ + exact a.2 xSigma + +/-- The two constructed automorphisms induce the same action on the extension field. -/ +theorem abstractReciprocityTotallyRamified_actions_agree_on_L + (D : DegreeData G) (A : Rep ℤ G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) + (a : ambientFixedAddSubgroup A L.field) : + let M := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + let S := M.inertiaImage D + let hML := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension_le_L + K L hTot q + relativeCosetAction A K.field M.field M.below + (fixedFieldInclusion A L.field M.field hML a) + (M.extensionQuotientMulEquiv + (M.lowerInclusionHom S + (D.abstractReciprocityTotallyRamifiedLowerGenerator + K L hTot q))) = + relativeCosetAction A K.field M.field M.below + (fixedFieldInclusion A L.field M.field hML a) + (M.extensionQuotientMulEquiv + (D.abstractReciprocityTotallyRamifiedFrobeniusInM + K L hTot q)) := by + let M := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + let S := M.inertiaImage D + let hML := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension_le_L + K L hTot q + let EL : DegreeData.AbstractExtension G := { + field := L.field + base := K.field + below := L.below } + let : (extensionSubgroup EL.base EL.field EL.below).Normal := by + change (extensionSubgroup K.field L.field L.below).Normal + exact L.normal + apply M.relativeCosetAction_eq_of_restriction_eq A EL hML + apply L.extensionQuotientMulEquiv.symm.injective + simpa [FiniteGaloisSubextension.bundledRestrictionHom] using + (show M.bundledRestrictionHom L hML + (M.lowerInclusionHom S + (D.abstractReciprocityTotallyRamifiedLowerGenerator + K L hTot q)) = + M.bundledRestrictionHom L hML + (D.abstractReciprocityTotallyRamifiedFrobeniusInM + K L hTot q) by + rw [D.abstractReciprocityTotallyRamifiedLowerGenerator_inclusion_restriction, + D.abstractReciprocityTotallyRamifiedFrobeniusInM_restriction]) + +/-- The first norm restriction used: +`N_{M/M⁰}|_{A_L}=N_{L/K}`, with both sides included in `A_{M⁰}`. -/ +theorem abstractReciprocity_totallyRamified_relativeNorm_L + (D : DegreeData G) (A : Rep ℤ G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) + (a : ambientFixedAddSubgroup A L.field) : + let M := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + let M₀ := M.maximalUnramifiedSubextension D + let hML := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension_le_L + K L hTot q + let hMM₀ : M.field.toSubgroup ≤ M₀.toSubgroup := + M.field_le_intermediateField (M.inertiaImage D) + let hM₀K : M₀.toSubgroup ≤ K.field.toSubgroup := + M.intermediateField_le_base (M.inertiaImage D) + letI : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L.field L.below) := + L.finite + letI : Finite + (M₀.toSubgroup ⧸ extensionSubgroup M₀ M.field hMM₀) := + M.extension_over_intermediate_finite (M.inertiaImage D) + relativeNorm A M₀ M.field hMM₀ + (fixedFieldInclusion A L.field M.field hML a) = + fixedFieldInclusion A K.field M₀ hM₀K + (relativeNorm A K.field L.field L.below a) := by + let M := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + let hML := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension_le_L + K L hTot q + let : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L.field L.below) := + L.finite + have hInertia : ∀ i : K.field.toSubgroup, + i ∈ D.fieldInertiaWithin K.field → + i.1 ∈ L.field.toSubgroup → i.1 ∈ M.field.toSubgroup := by + intro i hiI hiL + apply D.maximalUnramifiedField_le_abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + exact ⟨hiL, (D.mem_fieldInertiaWithin_iff K.field i).1 hiI⟩ + exact M.abstractReciprocity_relativeNorm_fixedFieldInclusion + A D L.toFiniteAbstractExtension hML hTot hInertia a + +/-- The second norm restriction used: +`N_{M/M⁰}|_{A_Σ}=N_{Σ/K}`, again in the actual fixed group +`A_{M⁰}`. -/ +theorem abstractReciprocity_totallyRamified_relativeNorm_sigma + (D : DegreeData G) (A : Rep ℤ G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) + (a : ambientFixedAddSubgroup A + (D.frobeniusFixedField K L.field L.below + (D.chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + K L hTot q))) : + letI : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L.field L.below) := + L.finite + let σ := D.chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + K L hTot q + let Sigma := D.frobeniusFixedField K L.field L.below σ + let hSigmaK := D.frobeniusFixedField_le K L.field L.below σ + letI : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field Sigma hSigmaK) := + D.frobeniusFixedField_finite K L.field L.below σ + let M := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + let M₀ := M.maximalUnramifiedSubextension D + let hMSigma := + D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension_le_sigma + K L hTot q + let hMM₀ : M.field.toSubgroup ≤ M₀.toSubgroup := + M.field_le_intermediateField (M.inertiaImage D) + let hM₀K : M₀.toSubgroup ≤ K.field.toSubgroup := + M.intermediateField_le_base (M.inertiaImage D) + letI : Finite + (M₀.toSubgroup ⧸ extensionSubgroup M₀ M.field hMM₀) := + M.extension_over_intermediate_finite (M.inertiaImage D) + relativeNorm A M₀ M.field hMM₀ + (fixedFieldInclusion A Sigma M.field hMSigma a) = + fixedFieldInclusion A K.field M₀ hM₀K + (relativeNorm A K.field Sigma hSigmaK a) := by + let : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L.field L.below) := + L.finite + let σ := D.chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + K L hTot q + let Sigma := D.frobeniusFixedField K L.field L.below σ + let hSigmaK := D.frobeniusFixedField_le K L.field L.below σ + let hSigmaFinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field Sigma hSigmaK) := + D.frobeniusFixedField_finite K L.field L.below σ + let ESigma : DegreeData.FiniteAbstractExtension G := + DegreeData.FiniteAbstractExtension.ofInclusion Sigma K.field hSigmaK + let M := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + let hMSigma := + D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension_le_sigma + K L hTot q + have hSigmaTot : ESigma.IsTotallyRamified D := by + have hrelative : (ESigma.residueDegree D : ℕ) = 1 := by + calc + (ESigma.residueDegree D : ℕ) = + D.frobeniusExponent K L.field L.below σ := + D.frobeniusFixedField_residueDegreeOverBase K L.field L.below σ + _ = 1 := + D.frobeniusExponent_chosenDegreeOneFrobeniusLiftOfFiniteTotallyRamified + K L hTot q + exact ESigma.isTotallyRamified_of_residueDegree_eq_one D hrelative + have hInertia : ∀ i : K.field.toSubgroup, + i ∈ D.fieldInertiaWithin K.field → + i.1 ∈ Sigma.toSubgroup → i.1 ∈ M.field.toSubgroup := by + intro i hiI hiSigma + apply D.maximalUnramifiedField_le_abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + have hiSigmaInertia : + i.1 ∈ (D.fieldInertia Sigma).toSubgroup := + ⟨hiSigma, (D.mem_fieldInertiaWithin_iff K.field i).1 hiI⟩ + rw [D.frobeniusFixedField_fieldInertia + K L.field L.below σ] at hiSigmaInertia + exact hiSigmaInertia + exact M.abstractReciprocity_relativeNorm_fixedFieldInclusion + A D ESigma hMSigma hSigmaTot hInertia a + +end DegreeData + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionCosets.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionCosets.lean new file mode 100644 index 0000000000..d9f0c75b41 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionCosets.lean @@ -0,0 +1,448 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction +/-! +# Restriction transport for finite Galois subextensions + +This file constructs quotient restriction maps, their coset equivalences, +and the compatible relative actions and norms used in ramified towers. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace FiniteGaloisSubextension + +/-- Restriction between the named finite Galois quotient boundaries. -/ +def bundledRestrictionHom + {K : ClosedSubgroup G} + (M L : FiniteGaloisSubextension K) + (hML : M.field.toSubgroup ≤ L.field.toSubgroup) : + M.extensionQuotient →* L.extensionQuotient := + L.extensionQuotientMulEquiv.symm.toMonoidHom.comp + ((abstractReciprocityRestriction + K L.field M.field hML L.below).comp + M.extensionQuotientMulEquiv.toMonoidHom) + +/-- The coset map from the lower maximal-unramified quotient to a totally +ramified quotient. -/ +noncomputable def abstractReciprocityRestrictionCosetMap + (D : DegreeData G) [IsTopologicalGroup G] + (E : DegreeData.AbstractExtension G) + (M : FiniteGaloisSubextension E.base) + (hME : M.field.toSubgroup ≤ E.field.toSubgroup) : + let M₀ := M.maximalUnramifiedSubextension D + let hMM₀ : M.field.toSubgroup ≤ M₀.toSubgroup := + M.field_le_intermediateField (M.inertiaImage D) + (M₀.toSubgroup ⧸ extensionSubgroup M₀ M.field hMM₀) → + (E.base.toSubgroup ⧸ E.subgroup) := by + let S := M.inertiaImage D + let M₀ := M.maximalUnramifiedSubextension D + let hMM₀ : M.field.toSubgroup ≤ M₀.toSubgroup := + M.field_le_intermediateField S + let hM₀K : M₀.toSubgroup ≤ E.base.toSubgroup := + M.intermediateField_le_base S + exact Quotient.map' + (fun x : M₀.toSubgroup => + (⟨x.1, hM₀K x.2⟩ : E.base.toSubgroup)) + (by + intro x y hxy + rw [QuotientGroup.leftRel_apply] at hxy ⊢ + exact hME hxy) + +/-- The restriction coset map is bijective when the upper extension is +totally ramified and the auxiliary field contains the relevant inertia. -/ +theorem abstractReciprocityRestrictionCosetMap_bijective + (D : DegreeData G) [IsTopologicalGroup G] + (E : DegreeData.AbstractExtension G) + (M : FiniteGaloisSubextension E.base) + (hME : M.field.toSubgroup ≤ E.field.toSubgroup) + (hTot : E.IsTotallyRamified D) + (hInertia : ∀ i : E.base.toSubgroup, + i ∈ D.fieldInertiaWithin E.base → + i.1 ∈ E.field.toSubgroup → i.1 ∈ M.field.toSubgroup) : + Function.Bijective (M.abstractReciprocityRestrictionCosetMap D E hME) := by + let S := M.inertiaImage D + let M₀ := M.maximalUnramifiedSubextension D + let hMM₀ : M.field.toSubgroup ≤ M₀.toSubgroup := + M.field_le_intermediateField S + let hM₀K : M₀.toSubgroup ≤ E.base.toSubgroup := + M.intermediateField_le_base S + constructor + · intro x y hxy + refine Quotient.inductionOn₂' x y ?_ hxy + intro a b hab + apply Quotient.sound' + rw [QuotientGroup.leftRel_apply] + let aK : E.base.toSubgroup := ⟨a.1, hM₀K a.2⟩ + let bK : E.base.toSubgroup := ⟨b.1, hM₀K b.2⟩ + let z : E.base.toSubgroup := aK⁻¹ * bK + have habE : aK⁻¹ * bK ∈ E.subgroup := by + exact QuotientGroup.leftRel_apply.mp (Quotient.exact' hab) + have hzE : z.1 ∈ E.field.toSubgroup := + (mem_extensionSubgroup_iff E.base E.field E.below z).1 habE + have haP : aK ∈ M.intermediateSubgroup S := by + rw [← M.extensionSubgroup_intermediateField_eq S] + exact (mem_extensionSubgroup_iff E.base M₀ hM₀K aK).2 a.2 + have hbP : bK ∈ M.intermediateSubgroup S := by + rw [← M.extensionSubgroup_intermediateField_eq S] + exact (mem_extensionSubgroup_iff E.base M₀ hM₀K bK).2 b.2 + have hzP : z ∈ M.intermediateSubgroup S := + (M.intermediateSubgroup S).mul_mem + ((M.intermediateSubgroup S).inv_mem haP) hbP + change (QuotientGroup.mk' + (extensionSubgroup E.base M.field M.below)) z ∈ + (D.fieldInertiaWithin E.base).map + (QuotientGroup.mk' + (extensionSubgroup E.base M.field M.below)) at hzP + obtain ⟨i, hiI, hi⟩ := hzP + have hizM : i⁻¹ * z ∈ extensionSubgroup E.base M.field M.below := + QuotientGroup.eq.mp hi + have hizM' : i.1⁻¹ * z.1 ∈ M.field.toSubgroup := + (mem_extensionSubgroup_iff E.base M.field M.below (i⁻¹ * z)).1 hizM + have hiE : i.1 ∈ E.field.toSubgroup := by + have hmul := E.field.toSubgroup.mul_mem hzE + (E.field.toSubgroup.inv_mem (hME hizM')) + simpa [mul_inv_rev, mul_assoc] using hmul + have hiM : i.1 ∈ M.field.toSubgroup := hInertia i hiI hiE + have hzM : z.1 ∈ M.field.toSubgroup := by + have hmul := M.field.toSubgroup.mul_mem hiM hizM' + simpa [mul_assoc] using hmul + exact hzM + · intro x + refine Quotient.inductionOn' x ?_ + intro k + have hkDegree : D.degree k.1 ∈ + E.base.toSubgroup.map D.degree.toMonoidHom := ⟨k.1, k.2, rfl⟩ + obtain ⟨e, heE, heDegree⟩ := + (E.isTotallyRamified_iff_image_le D).1 hTot hkDegree + let eE : E.field.toSubgroup := ⟨e, heE⟩ + let eK : E.base.toSubgroup := Subgroup.inclusion E.below eE + let i : E.base.toSubgroup := k * eK⁻¹ + have hiI : i ∈ D.fieldInertiaWithin E.base := by + change D.degree i.1 = 1 + dsimp [i, eK, eE] + rw [map_mul, map_inv] + change D.degree k.1 * (D.degree e)⁻¹ = 1 + change D.degree e = D.degree k.1 at heDegree + rw [heDegree] + simp + have hiS : (QuotientGroup.mk' + (extensionSubgroup E.base M.field M.below)) i ∈ S := + ⟨i, hiI, rfl⟩ + have hiP : i ∈ M.intermediateSubgroup S := hiS + let iM₀ : M₀.toSubgroup := ⟨i.1, ⟨i, hiP, rfl⟩⟩ + refine ⟨QuotientGroup.mk iM₀, ?_⟩ + apply Quotient.sound' + rw [QuotientGroup.leftRel_apply] + change (i⁻¹ * k).1 ∈ E.field.toSubgroup + simpa [i, eK, eE, mul_inv_rev, mul_assoc] using eE.2 + +/-- The equivalence induced by the totally ramified restriction coset map. -/ +noncomputable def abstractReciprocityRestrictionCosetEquiv + (D : DegreeData G) [IsTopologicalGroup G] + (E : DegreeData.AbstractExtension G) + (M : FiniteGaloisSubextension E.base) + (hME : M.field.toSubgroup ≤ E.field.toSubgroup) + (hTot : E.IsTotallyRamified D) + (hInertia : ∀ i : E.base.toSubgroup, + i ∈ D.fieldInertiaWithin E.base → + i.1 ∈ E.field.toSubgroup → i.1 ∈ M.field.toSubgroup) : + let M₀ := M.maximalUnramifiedSubextension D + let hMM₀ : M.field.toSubgroup ≤ M₀.toSubgroup := + M.field_le_intermediateField (M.inertiaImage D) + (M₀.toSubgroup ⧸ extensionSubgroup M₀ M.field hMM₀) ≃ + E.quotient := + Equiv.ofBijective (M.abstractReciprocityRestrictionCosetMap D E hME) + (M.abstractReciprocityRestrictionCosetMap_bijective + D E hME hTot hInertia) + +/-- The multiplicative restriction equivalence from the lower Galois group +to the original totally ramified quotient. -/ +noncomputable def abstractReciprocityRestrictionMulEquiv + (D : DegreeData G) [IsTopologicalGroup G] + (E : DegreeData.AbstractExtension G) + (M : FiniteGaloisSubextension E.base) + (hME : M.field.toSubgroup ≤ E.field.toSubgroup) + [hEnormal : + (extensionSubgroup E.base E.field E.below).Normal] + (hTot : E.IsTotallyRamified D) + (hInertia : ∀ i : E.base.toSubgroup, + i ∈ D.fieldInertiaWithin E.base → + i.1 ∈ E.field.toSubgroup → i.1 ∈ M.field.toSubgroup) : + let S := M.inertiaImage D + let N := M.lowerFiniteGalois S + letI : (extensionSubgroup + (M.maximalUnramifiedSubextension D) M.field N.below).Normal := + N.normal + letI : Group E.quotient := by + change Group + (E.base.toSubgroup ⧸ extensionSubgroup E.base E.field E.below) + infer_instance + N.extensionQuotient ≃* + E.quotient := by + let S := M.inertiaImage D + let M₀ := M.maximalUnramifiedSubextension D + let N := M.lowerFiniteGalois S + let hM₀K : M₀.toSubgroup ≤ E.base.toSubgroup := + M.intermediateField_le_base S + letI : (extensionSubgroup M₀ M.field N.below).Normal := N.normal + letI : Group E.quotient := by + change Group + (E.base.toSubgroup ⧸ extensionSubgroup E.base E.field E.below) + infer_instance + let r : N.extensionQuotient →* + E.quotient := + QuotientGroup.map + (extensionSubgroup M₀ M.field N.below) + (extensionSubgroup E.base E.field E.below) + (Subgroup.inclusion hM₀K) + (by + intro m hm + exact hME hm) + apply MulEquiv.ofBijective r + have hr : (r : N.extensionQuotient → + E.quotient) = + M.abstractReciprocityRestrictionCosetMap D E hME := by + funext x + refine Quotient.inductionOn' x ?_ + intro m + rfl + rw [hr] + exact M.abstractReciprocityRestrictionCosetMap_bijective + D E hME hTot hInertia + +/-- Relative coset actions are transported by the restriction coset +equivalence. -/ +theorem relativeCosetAction_abstractReciprocityRestrictionCosetEquiv + (A : Rep ℤ G) (D : DegreeData G) [IsTopologicalGroup G] + (E : DegreeData.AbstractExtension G) + (M : FiniteGaloisSubextension E.base) + (hME : M.field.toSubgroup ≤ E.field.toSubgroup) + (hTot : E.IsTotallyRamified D) + (hInertia : ∀ i : E.base.toSubgroup, + i ∈ D.fieldInertiaWithin E.base → + i.1 ∈ E.field.toSubgroup → i.1 ∈ M.field.toSubgroup) + (a : ambientFixedAddSubgroup A E.field) + (r : let M₀ := M.maximalUnramifiedSubextension D + let hMM₀ : M.field.toSubgroup ≤ M₀.toSubgroup := + M.field_le_intermediateField (M.inertiaImage D) + M₀.toSubgroup ⧸ extensionSubgroup M₀ M.field hMM₀) : + let M₀ := M.maximalUnramifiedSubextension D + let hMM₀ : M.field.toSubgroup ≤ M₀.toSubgroup := + M.field_le_intermediateField (M.inertiaImage D) + relativeCosetAction A M₀ M.field hMM₀ + (fixedFieldInclusion A E.field M.field hME a) r = + relativeCosetAction A E.base E.field E.below a + (M.abstractReciprocityRestrictionCosetEquiv + D E hME hTot hInertia r) := by + let S := M.inertiaImage D + let M₀ := M.maximalUnramifiedSubextension D + let hMM₀ : M.field.toSubgroup ≤ M₀.toSubgroup := + M.field_le_intermediateField S + let hM₀K : M₀.toSubgroup ≤ E.base.toSubgroup := + M.intermediateField_le_base S + refine Quotient.inductionOn' r ?_ + intro x + rfl + +/-- Relative norm commutes with fixed-field inclusion along the totally +ramified restriction equivalence. -/ +theorem abstractReciprocity_relativeNorm_fixedFieldInclusion + (A : Rep ℤ G) (D : DegreeData G) [IsTopologicalGroup G] + (E : DegreeData.FiniteAbstractExtension G) + (M : FiniteGaloisSubextension E.base) + (hME : M.field.toSubgroup ≤ E.field.toSubgroup) + (hTot : E.IsTotallyRamified D) + (hInertia : ∀ i : E.base.toSubgroup, + i ∈ D.fieldInertiaWithin E.base → + i.1 ∈ E.field.toSubgroup → i.1 ∈ M.field.toSubgroup) + (a : ambientFixedAddSubgroup A E.field) : + let M₀ := M.maximalUnramifiedSubextension D + let hMM₀ : M.field.toSubgroup ≤ M₀.toSubgroup := + M.field_le_intermediateField (M.inertiaImage D) + let hM₀K : M₀.toSubgroup ≤ E.base.toSubgroup := + M.intermediateField_le_base (M.inertiaImage D) + letI : Finite + (M₀.toSubgroup ⧸ extensionSubgroup M₀ M.field hMM₀) := + M.extension_over_intermediate_finite (M.inertiaImage D) + relativeNorm A M₀ M.field hMM₀ + (fixedFieldInclusion A E.field M.field hME a) = + fixedFieldInclusion A E.base M₀ hM₀K + (relativeNorm A E.base E.field E.below a) := by + let S := M.inertiaImage D + let M₀ := M.maximalUnramifiedSubextension D + let hMM₀ : M.field.toSubgroup ≤ M₀.toSubgroup := + M.field_le_intermediateField S + let hM₀K : M₀.toSubgroup ≤ E.base.toSubgroup := + M.intermediateField_le_base S + let hMfinite : Finite + (M₀.toSubgroup ⧸ extensionSubgroup M₀ M.field hMM₀) := + M.extension_over_intermediate_finite S + let : Finite + (E.base.toSubgroup ⧸ extensionSubgroup E.base E.field E.below) := + E.finiteQuotient + let e : (M₀.toSubgroup ⧸ extensionSubgroup M₀ M.field hMM₀) ≃ + (E.base.toSubgroup ⧸ extensionSubgroup E.base E.field E.below) := + M.abstractReciprocityRestrictionCosetEquiv + D E.toAbstractExtension hME hTot hInertia + apply Subtype.ext + let : Fintype + (M₀.toSubgroup ⧸ extensionSubgroup M₀ M.field hMM₀) := + Fintype.ofFinite _ + let : Fintype + (E.base.toSubgroup ⧸ extensionSubgroup E.base E.field E.below) := + Fintype.ofFinite _ + change (∑ r, relativeCosetAction A M₀ M.field hMM₀ + (fixedFieldInclusion A E.field M.field hME a) r) = + ∑ q, relativeCosetAction A E.base E.field E.below a q + calc + ∑ r, relativeCosetAction A M₀ M.field hMM₀ + (fixedFieldInclusion A E.field M.field hME a) r = + ∑ r, relativeCosetAction A E.base E.field E.below a (e r) := by + apply Fintype.sum_congr + intro r + exact M.relativeCosetAction_abstractReciprocityRestrictionCosetEquiv + A D E.toAbstractExtension hME hTot hInertia a r + _ = ∑ q, relativeCosetAction A E.base E.field E.below a q := + e.sum_comp (relativeCosetAction A E.base E.field E.below a) + +/-- Two auxiliary quotient elements commute when they have the same +restriction and the auxiliary field contains the inertia subgroup. -/ +theorem commute_of_same_restriction_of_inertia_le + (D : DegreeData G) + (E : DegreeData.AbstractExtension G) + (M : FiniteGaloisSubextension E.base) + (hME : M.field.toSubgroup ≤ E.field.toSubgroup) + (hIE : (D.fieldInertia E.field).toSubgroup ≤ M.field.toSubgroup) + [hEnormal : + (extensionSubgroup E.base E.field E.below).Normal] + (g t : E.base.toSubgroup ⧸ + extensionSubgroup E.base M.field M.below) + (hres : abstractReciprocityRestriction + E.base E.field M.field hME E.below g = + abstractReciprocityRestriction + E.base E.field M.field hME E.below t) : + Commute g t := by + rw [Commute] + let a : E.base.toSubgroup := Quotient.out g + let b : E.base.toSubgroup := Quotient.out t + have ha : (QuotientGroup.mk' + (extensionSubgroup E.base M.field M.below)) a = g := + Quotient.out_eq' g + have hb : (QuotientGroup.mk' + (extensionSubgroup E.base M.field M.below)) b = t := + Quotient.out_eq' t + have hcosetE : + (QuotientGroup.mk' + (extensionSubgroup E.base E.field E.below)) (a * b) = + (QuotientGroup.mk' + (extensionSubgroup E.base E.field E.below)) (b * a) := by + rw [map_mul, map_mul] + have haE : (QuotientGroup.mk' + (extensionSubgroup E.base E.field E.below)) a = + abstractReciprocityRestriction + E.base E.field M.field hME E.below g := by + calc + (QuotientGroup.mk' + (extensionSubgroup E.base E.field E.below)) a = + abstractReciprocityRestriction E.base E.field M.field hME E.below + ((QuotientGroup.mk' + (extensionSubgroup E.base M.field M.below)) a) := rfl + _ = abstractReciprocityRestriction + E.base E.field M.field hME E.below g := + congrArg (abstractReciprocityRestriction + E.base E.field M.field hME E.below) ha + have hbE : (QuotientGroup.mk' + (extensionSubgroup E.base E.field E.below)) b = + abstractReciprocityRestriction + E.base E.field M.field hME E.below t := by + calc + (QuotientGroup.mk' + (extensionSubgroup E.base E.field E.below)) b = + abstractReciprocityRestriction E.base E.field M.field hME E.below + ((QuotientGroup.mk' + (extensionSubgroup E.base M.field M.below)) b) := rfl + _ = abstractReciprocityRestriction + E.base E.field M.field hME E.below t := + congrArg (abstractReciprocityRestriction + E.base E.field M.field hME E.below) hb + rw [haE, hbE, hres] + let z : E.base.toSubgroup := (a * b)⁻¹ * (b * a) + have hzE : z ∈ extensionSubgroup E.base E.field E.below := + QuotientGroup.eq.mp hcosetE + have hzE' : z.1 ∈ E.field.toSubgroup := + (mem_extensionSubgroup_iff E.base E.field E.below z).1 hzE + have hzDegree : D.degree z.1 = 1 := by + dsimp [z] + rw [map_mul, map_inv, map_mul, map_mul] + apply Multiplicative.ext + change -((D.degree a.1).toAdd + (D.degree b.1).toAdd) + + ((D.degree b.1).toAdd + (D.degree a.1).toAdd) = 0 + abel + have hzM : z.1 ∈ M.field.toSubgroup := + hIE ⟨hzE', hzDegree⟩ + have hzH : z ∈ extensionSubgroup E.base M.field M.below := + (mem_extensionSubgroup_iff E.base M.field M.below z).2 hzM + calc + g * t = (QuotientGroup.mk' + (extensionSubgroup E.base M.field M.below)) (a * b) := by + rw [map_mul, ha, hb] + _ = (QuotientGroup.mk' + (extensionSubgroup E.base M.field M.below)) (b * a) := + QuotientGroup.eq.mpr hzH + _ = t * g := by rw [map_mul, ha, hb] + +/-- Equal restrictions induce equal relative coset actions on elements +fixed by the upper field. -/ +theorem relativeCosetAction_eq_of_restriction_eq + (A : Rep ℤ G) (E : DegreeData.AbstractExtension G) + (M : FiniteGaloisSubextension E.base) + (hME : M.field.toSubgroup ≤ E.field.toSubgroup) + [hEnormal : + (extensionSubgroup E.base E.field E.below).Normal] + (a : ambientFixedAddSubgroup A E.field) + (g t : E.base.toSubgroup ⧸ + extensionSubgroup E.base M.field M.below) + (hres : abstractReciprocityRestriction + E.base E.field M.field hME E.below g = + abstractReciprocityRestriction + E.base E.field M.field hME E.below t) : + relativeCosetAction A E.base M.field M.below + (fixedFieldInclusion A E.field M.field hME a) g = + relativeCosetAction A E.base M.field M.below + (fixedFieldInclusion A E.field M.field hME a) t := by + refine Quotient.inductionOn₂' g t ?_ hres + intro x y hxy + simp only [relativeCosetAction_mk, fixedFieldInclusion_coe] + have hxyE : x⁻¹ * y ∈ extensionSubgroup E.base E.field E.below := + QuotientGroup.eq.mp hxy + let e : E.field.toSubgroup := ⟨(x⁻¹ * y).1, hxyE⟩ + have hy : y = x * Subgroup.inclusion E.below e := by + apply Subtype.ext + simp [e] + rw [hy] + change A.ρ x.1 a.1 = A.ρ (x.1 * e.1) a.1 + rw [map_mul] + change A.ρ x.1 a.1 = A.ρ x.1 (A.ρ e.1 a.1) + rw [a.2 e] + +end FiniteGaloisSubextension + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionEquiv.lean new file mode 100644 index 0000000000..b69adbaedf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionEquiv.lean @@ -0,0 +1,175 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionCosets +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusLift +/-! +# The lower Galois group in the totally ramified auxiliary tower + +This file identifies the lower Galois group with the original totally +ramified quotient and constructs its cyclic generator. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFormation + +open KummerTheory +open CyclicCohomology + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- Restriction identifies the actual lower Galois group `G(M/M⁰)` with +the original totally ramified group `G(L/K)`. -/ +noncomputable def abstractReciprocityTotallyRamifiedRestrictionEquiv + (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) : + let M := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + let S := M.inertiaImage D + let N := M.lowerFiniteGalois S + letI : (extensionSubgroup + (M.maximalUnramifiedSubextension D) M.field N.below).Normal := + N.normal + N.extensionQuotient ≃* L.extensionQuotient := by + let M := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + let hML := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension_le_L + K L hTot q + have hInertia : ∀ i : K.field.toSubgroup, + i ∈ D.fieldInertiaWithin K.field → + i.1 ∈ L.field.toSubgroup → i.1 ∈ M.field.toSubgroup := by + intro i hiI hiL + apply D.maximalUnramifiedField_le_abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + exact ⟨hiL, (D.mem_fieldInertiaWithin_iff K.field i).1 hiI⟩ + letI : (extensionSubgroup K.field L.field L.below).Normal := L.normal + let EL := L.toFiniteAbstractExtension.toAbstractExtension + letI : (extensionSubgroup EL.base EL.field EL.below).Normal := by + change (extensionSubgroup K.field L.field L.below).Normal + exact L.normal + letI : Group EL.quotient := by + change Group + (K.field.toSubgroup ⧸ extensionSubgroup K.field L.field L.below) + infer_instance + exact (M.abstractReciprocityRestrictionMulEquiv + D EL + hML hTot hInertia).trans + L.extensionQuotientMulEquiv.symm + +/-- Restriction identifies the degree of the totally ramified lower +extension `M/M⁰` with the original cyclic degree `[L:K]`. -/ +theorem abstractReciprocityTotallyRamifiedLowerDegree_eq + (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) : + let M := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + let N := M.lowerFiniteGalois (M.inertiaImage D) + (N.toFiniteAbstractExtension.degree : ℕ) = + (L.toFiniteAbstractExtension.degree : ℕ) := by + let M := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + let S := M.inertiaImage D + let M₀ := M.maximalUnramifiedSubextension D + let hMM₀ : M.field.toSubgroup ≤ M₀.toSubgroup := + M.field_le_intermediateField S + let N := M.lowerFiniteGalois S + let E := L.toFiniteAbstractExtension + let e := D.abstractReciprocityTotallyRamifiedRestrictionEquiv + K L hTot q + calc + (N.toFiniteAbstractExtension.degree : ℕ) = + (extensionSubgroup M₀ M.field hMM₀).index := + N.toFiniteAbstractExtension.extensionSubgroup_index_eq_degree.symm + _ = Nat.card N.extensionQuotient := + Subgroup.index_eq_card (extensionSubgroup M₀ M.field hMM₀) + _ = Nat.card L.extensionQuotient := + Nat.card_congr e.toEquiv + _ = (extensionSubgroup K.field L.field L.below).index := + (Subgroup.index_eq_card (extensionSubgroup K.field L.field L.below)).symm + _ = (E.degree : ℕ) := by + have h := E.extensionSubgroup_index_eq_degree + change (extensionSubgroup K.field L.field L.below).index = + (E.degree : ℕ) at h + exact h + +/-- The generator of `G(M/M⁰)` corresponding to the prescribed generator +of `G(L/K)`. -/ +noncomputable def abstractReciprocityTotallyRamifiedLowerGenerator + (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) : + let M := D.abstractReciprocityTotallyRamifiedFiniteGaloisExtension + K L hTot q + let S := M.inertiaImage D + let N := M.lowerFiniteGalois S + letI : (extensionSubgroup + (M.maximalUnramifiedSubextension D) M.field N.below).Normal := + N.normal + N.extensionQuotient := by + exact (D.abstractReciprocityTotallyRamifiedRestrictionEquiv + K L hTot q).symm q + +/-- The restriction equivalence sends the constructed lower generator to the target generator. -/ +@[simp] +theorem abstractReciprocityTotallyRamifiedRestrictionEquiv_lowerGenerator + (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) : + D.abstractReciprocityTotallyRamifiedRestrictionEquiv K L hTot q + (D.abstractReciprocityTotallyRamifiedLowerGenerator + K L hTot q) = q := by + exact MulEquiv.apply_symm_apply _ q + +/-- The constructed lower automorphism generates the relevant cyclic quotient. -/ +theorem abstractReciprocityTotallyRamifiedLowerGenerator_generates + (D : DegreeData G) + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteResidueAbstractField D) + (L : FiniteGaloisSubextension K.field) + (hTot : L.IsTotallyRamified D) + (q : L.extensionQuotient) + (hq : ∀ x, x ∈ Subgroup.zpowers q) : + ∀ x, x ∈ Subgroup.zpowers + (D.abstractReciprocityTotallyRamifiedLowerGenerator + K L hTot q) := by + let e := D.abstractReciprocityTotallyRamifiedRestrictionEquiv + K L hTot q + let g := D.abstractReciprocityTotallyRamifiedLowerGenerator + K L hTot q + intro x + obtain ⟨n, hn⟩ := Subgroup.mem_zpowers_iff.mp (hq (e x)) + apply Subgroup.mem_zpowers_iff.mpr + refine ⟨n, ?_⟩ + apply e.injective + rw [map_zpow, + D.abstractReciprocityTotallyRamifiedRestrictionEquiv_lowerGenerator, hn] + +end DegreeData + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ValuationContinuity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ValuationContinuity.lean new file mode 100644 index 0000000000..6449849327 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ValuationContinuity.lean @@ -0,0 +1,429 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology +/-! +# Continuity of the normalized valuation + +The proof uses the neighbourhoods `f ℤ̂`. We construct the +required unramified extension of degree `f` as the fixed field of the kernel +of reduction modulo `f` after the normalized degree map `d_K`. The norm--valuation formula then +sends its norm subgroup into the prescribed neighbourhood. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Topology + +namespace ClassFormation + +open ClassFormation CyclicCohomology KummerTheory + +universe u + +section DegreeOnly + +variable {G : Type u} [Group G] [TopologicalSpace G] + +namespace DegreeData + +/-- Reduction modulo `f` after the normalized degree `d_K`. -/ +def unramifiedDegreeHom (D : DegreeData G) + (K : FiniteResidueAbstractField D) (f : ℕ) (hf : 0 < f) : + K.toSubgroup →ₜ* Multiplicative (ZMod f) := + (zHatReductionMul f hf).comp (D.normalizedDegree K) + +/-- The subgroup of `G_K` fixing the degree-`f` unramified extension. -/ +def unramifiedDegreeKernelWithin (D : DegreeData G) + (K : FiniteResidueAbstractField D) (f : ℕ) (hf : 0 < f) : + Subgroup K.toSubgroup := + (unramifiedDegreeHom D K f hf).toMonoidHom.ker + +/-- The defining kernel equation for the reduction subgroup. -/ +theorem unramifiedDegreeKernelWithin_eq_ker (D : DegreeData G) + (K : FiniteResidueAbstractField D) (f : ℕ) (hf : 0 < f) : + unramifiedDegreeKernelWithin D K f hf = + (unramifiedDegreeHom D K f hf).toMonoidHom.ker := by + rfl + +/-- +The kernel of normalized degree modulo a positive integer is closed inside the finite-residue +field subgroup. +-/ +theorem unramifiedDegreeKernelWithin_isClosed (D : DegreeData G) + (K : FiniteResidueAbstractField D) + (f : ℕ) (hf : 0 < f) : + IsClosed (unramifiedDegreeKernelWithin D K f hf : + Set K.toSubgroup) := by + change IsClosed + ((unramifiedDegreeHom D K f hf) ⁻¹' ({1} : + Set (Multiplicative (ZMod f)))) + exact isClosed_singleton.preimage + (unramifiedDegreeHom D K f hf).continuous_toFun + +/-- The actual fixed field of the reduction-modulo-`f` kernel of `d_K`. -/ +def unramifiedExtensionOfDegree (D : DegreeData G) + (K : FiniteResidueAbstractField D) + (f : ℕ) (hf : 0 < f) : ClosedSubgroup G where + toSubgroup := + (unramifiedDegreeKernelWithin D K f hf).map K.toSubgroup.subtype + isClosed' := by + change IsClosed + (Subtype.val '' + (unramifiedDegreeKernelWithin D K f hf : Set K.toSubgroup)) + exact K.field.isClosed'.isClosedEmbedding_subtypeVal.isClosedMap _ + (unramifiedDegreeKernelWithin_isClosed D K f hf) + +/-- +Characterizes `g ∈ unramifiedExtensionOfDegree D K f hf` by the equivalent condition `∃ k : +K.toSubgroup, k ∈ unramifiedDegreeKernelWithin D K f hf ∧ k.1 = g`. +-/ +@[simp] +theorem mem_unramifiedExtensionOfDegree_iff (D : DegreeData G) + [IsTopologicalGroup G] (K : FiniteResidueAbstractField D) + (f : ℕ) (hf : 0 < f) (g : G) : + g ∈ unramifiedExtensionOfDegree D K f hf ↔ + ∃ k : K.toSubgroup, + k ∈ unramifiedDegreeKernelWithin D K f hf ∧ k.1 = g := + Iff.rfl + +/-- Proves the bound `(unramifiedExtensionOfDegree D K f hf).toSubgroup ≤ K.toSubgroup`. -/ +theorem unramifiedExtensionOfDegree_le (D : DegreeData G) + [IsTopologicalGroup G] (K : FiniteResidueAbstractField D) + (f : ℕ) (hf : 0 < f) : + (unramifiedExtensionOfDegree D K f hf).toSubgroup ≤ + K.toSubgroup := by + rintro g ⟨k, _, rfl⟩ + exact k.2 + +/-- +Establishes the identity `extensionSubgroup K.field (unramifiedExtensionOfDegree D K f hf) +(unramifiedExtensionOfDegree_le D K f hf) = unramifiedDegreeKernelWithin D K f hf`. +-/ +theorem extensionSubgroup_unramifiedExtensionOfDegree (D : DegreeData G) + [IsTopologicalGroup G] (K : FiniteResidueAbstractField D) + (f : ℕ) (hf : 0 < f) : + extensionSubgroup K.field (unramifiedExtensionOfDegree D K f hf) + (unramifiedExtensionOfDegree_le D K f hf) = + unramifiedDegreeKernelWithin D K f hf := by + ext k + constructor + · intro hk + obtain ⟨t, ht, hts⟩ := hk + have htk : t = k := by + apply Subtype.ext + exact hts + simpa [htk] using ht + · intro hk + exact ⟨k, hk, rfl⟩ + +/-- The specified map is surjective: `Function.Surjective (unramifiedDegreeHom D K f hf)`. -/ +theorem unramifiedDegreeHom_surjective (D : DegreeData G) + (K : FiniteResidueAbstractField D) + (f : ℕ) (hf : 0 < f) : + Function.Surjective (unramifiedDegreeHom D K f hf) := by + intro z + obtain ⟨w, hw⟩ := zHatReduction_surjective f hf z.toAdd + obtain ⟨k, hk⟩ := + D.normalizedDegree_surjective K (Multiplicative.ofAdd w) + refine ⟨k, ?_⟩ + apply Multiplicative.ext + change zHatReduction f hf (D.normalizedDegree K k).toAdd = z.toAdd + rw [hk] + exact hw + +/-- +The extension subgroup of the canonical unramified degree-`f` extension is normal. +-/ +instance unramifiedExtensionOfDegree_normal (D : DegreeData G) + [IsTopologicalGroup G] (K : FiniteResidueAbstractField D) + (f : ℕ) (hf : 0 < f) : + (extensionSubgroup K.field (unramifiedExtensionOfDegree D K f hf) + (unramifiedExtensionOfDegree_le D K f hf)).Normal := by + rw [extensionSubgroup_unramifiedExtensionOfDegree D K f hf] + change (unramifiedDegreeHom D K f hf).toMonoidHom.ker.Normal + infer_instance + +/-- The reduction kernel packages an actual finite Galois extension of `K`. -/ +def finiteUnramifiedExtension (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) + (f : ℕ) (hf : 0 < f) : FiniteGaloisSubextension K.field where + field := unramifiedExtensionOfDegree D K f hf + below := unramifiedExtensionOfDegree_le D K f hf + normal := inferInstance + finite := by + rw [extensionSubgroup_unramifiedExtensionOfDegree D K f hf] + let : NeZero f := ⟨Nat.ne_of_gt hf⟩ + let : Finite (Multiplicative (ZMod f)) := by + change Finite (ZMod f) + infer_instance + let q := (unramifiedDegreeHom D K f hf).toMonoidHom + exact Finite.of_injective + (QuotientGroup.quotientKerEquivOfSurjective q + (unramifiedDegreeHom_surjective D K f hf)) + (QuotientGroup.quotientKerEquivOfSurjective q + (unramifiedDegreeHom_surjective D K f hf)).injective + +/-- The extension subgroup carried by the bundled finite unramified +extension is the reduction kernel used to construct it. -/ +theorem extensionSubgroup_finiteUnramifiedExtension + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (f : ℕ) (hf : 0 < f) : + extensionSubgroup K.field (D.finiteUnramifiedExtension K f hf).field + (D.finiteUnramifiedExtension K f hf).below = + unramifiedDegreeKernelWithin D K f hf := by + simpa only [finiteUnramifiedExtension] using + extensionSubgroup_unramifiedExtensionOfDegree D K f hf + +/-- The finite unramified extension is abelian: its Galois quotient is the +cyclic quotient detected by the normalized degree modulo `f`. -/ +def finiteUnramifiedAbelianExtension (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) + (f : ℕ) (hf : 0 < f) : FiniteAbelianSubextension K.field where + toFiniteGaloisExtension := finiteUnramifiedExtension D K f hf + commutative := by + let : + (extensionSubgroup K.field + (D.finiteUnramifiedExtension K f hf).field + (D.finiteUnramifiedExtension K f hf).below).Normal := + (D.finiteUnramifiedExtension K f hf).normal + change IsMulCommutative + (K.toSubgroup ⧸ + extensionSubgroup K.field + (D.finiteUnramifiedExtension K f hf).field + (D.finiteUnramifiedExtension K f hf).below) + let q := (unramifiedDegreeHom D K f hf).toMonoidHom + have hsub : + extensionSubgroup K.field + (D.finiteUnramifiedExtension K f hf).field + (D.finiteUnramifiedExtension K f hf).below = + q.ker := by + rw [D.extensionSubgroup_finiteUnramifiedExtension K f hf, + D.unramifiedDegreeKernelWithin_eq_ker K f hf] + let e : + (K.toSubgroup ⧸ + extensionSubgroup K.field + (D.finiteUnramifiedExtension K f hf).field + (D.finiteUnramifiedExtension K f hf).below) ≃* + Multiplicative (ZMod f) := + (QuotientGroup.quotientMulEquivOfEq hsub).trans + (QuotientGroup.quotientKerEquivOfSurjective q + (unramifiedDegreeHom_surjective D K f hf)) + exact + { is_comm.comm := fun x y => by + apply e.injective + rw [map_mul, map_mul, mul_comm] } + +/-- Forgetting commutativity from the abelian package recovers the canonical +finite unramified Galois extension. -/ +@[simp] +theorem finiteUnramifiedAbelianExtension_toFiniteGaloisExtension + (D : DegreeData G) [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) + (f : ℕ) (hf : 0 < f) : + (D.finiteUnramifiedAbelianExtension K f hf).toFiniteGaloisExtension = + D.finiteUnramifiedExtension K f hf := by + rfl + +/-- The reduction kernel contains inertia, so its fixed field is unramified. -/ +theorem unramifiedExtensionOfDegree_isUnramified (D : DegreeData G) + [IsTopologicalGroup G] (K : FiniteResidueAbstractField D) + (f : ℕ) (hf : 0 < f) : + (DegreeData.AbstractExtension.mk (unramifiedExtensionOfDegree D K f hf) K.field + (unramifiedExtensionOfDegree_le D K f hf)).IsUnramified D := by + rw [(DegreeData.AbstractExtension.mk + (unramifiedExtensionOfDegree D K f hf) K.field + (unramifiedExtensionOfDegree_le D K f hf)).isUnramified_iff_inertia_le D] + rintro g ⟨hgK, hgI⟩ + let k : K.toSubgroup := ⟨g, hgK⟩ + have hkI : k ∈ D.fieldInertiaWithin K.field := hgI + have hkDegree : D.normalizedDegree K k = 1 := by + have hkKer : k ∈ (D.normalizedDegree K).toMonoidHom.ker := by + rw [D.normalizedDegree_ker K] + exact hkI + exact hkKer + have hkReduction : + k ∈ unramifiedDegreeKernelWithin D K f hf := by + change unramifiedDegreeHom D K f hf k = 1 + change zHatReductionMul f hf (D.normalizedDegree K k) = 1 + rw [hkDegree, map_one] + exact ⟨k, hkReduction, rfl⟩ + +/-- The finite extension cut out by reduction modulo `f` has positive degree +`f`. -/ +theorem finiteUnramifiedExtension_degree (D : DegreeData G) + [IsTopologicalGroup G] (K : FiniteResidueAbstractField D) + (f : ℕ) (hf : 0 < f) : + (((finiteUnramifiedExtension D K f hf).toFiniteAbstractExtension.degree : ℕ)) = f := by + let : NeZero f := ⟨hf.ne'⟩ + let : Fintype (ZMod f) := ZMod.fintype f + let q := (unramifiedDegreeHom D K f hf).toMonoidHom + rw [← (finiteUnramifiedExtension D K f + hf).toFiniteAbstractExtension.extensionSubgroup_index_eq_degree] + change (extensionSubgroup K.field + (D.finiteUnramifiedExtension K f hf).field + (D.finiteUnramifiedExtension K f hf).below).index = f + rw [D.extensionSubgroup_finiteUnramifiedExtension K f hf] + rw [D.unramifiedDegreeKernelWithin_eq_ker K f hf] + rw [Subgroup.index_ker] + rw [MonoidHom.range_eq_top_of_surjective q + (unramifiedDegreeHom_surjective D K f hf)] + calc + Nat.card (↑(⊤ : Subgroup (Multiplicative (ZMod f)))) = + Nat.card (Multiplicative (ZMod f)) := + Nat.card_congr + { toFun := fun x ↦ x.1 + invFun := fun x ↦ ⟨x, Subgroup.mem_top x⟩ + left_inv := fun x ↦ Subtype.ext rfl + right_inv := fun _ ↦ rfl } + _ = Nat.card (ZMod f) := + Nat.card_congr + { toFun := Multiplicative.toAdd + invFun := Multiplicative.ofAdd + left_inv := fun _ ↦ rfl + right_inv := fun _ ↦ rfl } + _ = f := Nat.card_zmod f + +/-- Thus the positive relative residue degree is also `f`. -/ +theorem finiteUnramifiedExtension_residueDegree (D : DegreeData G) + [IsTopologicalGroup G] (K : FiniteResidueAbstractField D) + (f : ℕ) (hf : 0 < f) : + (((finiteUnramifiedExtension D K f hf).toFiniteAbstractExtension.residueDegree D : ℕ)) = f := by + let E := (finiteUnramifiedExtension D K f hf).toFiniteAbstractExtension + have hE : E.IsUnramified D := by + simpa [E, finiteUnramifiedExtension, + FiniteGaloisSubextension.toFiniteAbstractExtension] using + unramifiedExtensionOfDegree_isUnramified D K f hf + rw [E.residueDegree_eq_degree_of_isUnramified D hE] + exact finiteUnramifiedExtension_degree D K f hf + +end DegreeData + +end DegreeOnly + +section Representation + +-- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +namespace ValuationData + +variable {D : DegreeData G} {A : Rep ℤ G} + +/-- Every neighbourhood of zero in the value group contains all `f`-fold +multiples for some `f > 0`. This is the subspace-topology form of the +neighbourhood basis `f ℤ̂`. -/ +theorem exists_nsmul_mem_of_valueGroup_mem_nhds + (v : ValuationData D A) {U : Set v.valueGroup} + (hU : U ∈ 𝓝 (0 : v.valueGroup)) : + ∃ f : ℕ, 0 < f ∧ ∀ z : v.valueGroup, f • z ∈ U := by + rcases (mem_nhds_subtype (v.valueGroup : Set ZHat) + (0 : v.valueGroup) U).1 hU with ⟨W, hW, hWU⟩ + rcases mem_nhds_iff.mp hW with ⟨W₀, hW₀W, hW₀open, hzero⟩ + let Wm : Set ZHatMul := {z | z.toAdd ∈ W₀} + have hWmOpen : IsOpen Wm := by + change IsOpen W₀ + exact hW₀open + have hone : (1 : ZHatMul) ∈ Wm := by + change (0 : ZHat) ∈ W₀ + exact hzero + let : TotallyDisconnectedSpace ZHatMul := by + change TotallyDisconnectedSpace ZHat + infer_instance + obtain ⟨H, hHWm⟩ := + ProfiniteGrp.exist_openNormalSubgroup_sub_open_nhds_of_one + (G := ZHatMul) hWmOpen hone + let HAdd : AddSubgroup ZHat := + Subgroup.toAddSubgroup' (H : Subgroup ZHatMul) + let : Finite (ZHatMul ⧸ (H : Subgroup ZHatMul)) := + Subgroup.quotient_finite_of_isOpen (H : Subgroup ZHatMul) + H.toOpenSubgroup.isOpen' + have hindex : HAdd.index ≠ 0 := by + change (H : Subgroup ZHatMul).index ≠ 0 + exact (H : Subgroup ZHatMul).index_ne_zero_of_finite + let f := HAdd.index + have hf : f ≠ 0 := hindex + have hHAdd : + HAdd = (zHatMulNat f).toAddMonoidHom.range := by + simpa only [f] using + zHatAddSubgroup_eq_mulNat_range_of_index_ne_zero HAdd hindex + refine ⟨f, Nat.pos_of_ne_zero hf, ?_⟩ + intro z + apply hWU + apply hW₀W + have hzHAdd : f • (z.1 : ZHat) ∈ HAdd := by + rw [hHAdd] + exact ⟨z.1, zHatMulNat_apply f z.1⟩ + have hzH : Multiplicative.ofAdd (f • (z.1 : ZHat)) ∈ + (H : Subgroup ZHatMul) := hzHAdd + exact hHWm hzH + +/-- **continuity of the normalized valuation.** The normalized valuation is continuous from the +norm topology on `A_K` to the value group with its `ℤ̂`-subspace topology. -/ +theorem normTopology_valuation_continuous + [IsTopologicalGroup G] (v : ValuationData D A) + (K : FiniteAbstractField G) : + IsContinuousFromNormTopology A K.field (v.valuationAt K) := by + unfold IsContinuousFromNormTopology + let : TopologicalSpace (ambientFixedAddSubgroup A K.field) := + normTopology A K.field + let : IsTopologicalAddGroup (ambientFixedAddSubgroup A K.field) := + (normFilterBasis A K.field).isTopologicalAddGroup + apply continuous_of_continuousAt_zero (v.valuationAt K) + rw [ContinuousAt, map_zero] + rw [(normFilterBasis A K.field).nhds_zero_hasBasis.tendsto_left_iff] + intro U hU + obtain ⟨f, hf, hfU⟩ := exists_nsmul_mem_of_valueGroup_mem_nhds v hU + let Kresidue : DegreeData.FiniteResidueAbstractField D := + K.toFiniteResidueAbstractField D + let L : FiniteGaloisSubextension K.field := + DegreeData.finiteUnramifiedExtension D Kresidue f hf + let hLfinite : Finite + (K.field.toSubgroup ⧸ extensionSubgroup K.field L.field L.below) := L.finite + let hLabsoluteFinite : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) L.field (le_baseField L.field)) := + relativeTowerQuotientFinite (baseField G) K.field L.field L.below + (le_baseField K.field) + let Lfinite : FiniteAbstractField G := ⟨L.field, hLabsoluteFinite⟩ + let E : FiniteAbstractFieldExtension G := + { field := Lfinite + base := K + below := L.below + finiteQuotient := L.finite } + refine ⟨(FiniteGaloisSubextension.normSubgroup A L : + Set (ambientFixedAddSubgroup A K.field)), + ⟨L, rfl⟩, ?_⟩ + intro x hx + change x ∈ FiniteGaloisSubextension.normSubgroup A L at hx + rcases hx with ⟨a, rfl⟩ + have hres : (E.residueDegree D : ℕ) = f := by + change ((L.toFiniteAbstractExtension.residueDegree D : ℕ)) = f + simpa only [L] using + DegreeData.finiteUnramifiedExtension_residueDegree D Kresidue f hf + have hvaluation : + v.valuationAt K (relativeNorm A K.field L.field L.below a) = + f • v.valuationAt Lfinite a := by + apply Subtype.ext + change ((v.valuationAt K + (relativeNorm A K.field L.field L.below a) : v.valueGroup) : ZHat) = + f • ((v.valuationAt Lfinite a : v.valueGroup) : ZHat) + rw [← hres] + exact (v.normalizedValuation_tower E a).symm + rw [hvaluation] + exact hfU (v.valuationAt Lfinite a) + +end ValuationData + +end Representation + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra.lean new file mode 100644 index 0000000000..14059413c5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.AbelianGaloisEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.FiniteAbelianIntermediateFieldAlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.IntermediateFieldAlgEquivOrderIso + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/AbelianGaloisEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/AbelianGaloisEquiv.lean new file mode 100644 index 0000000000..d9b66da80e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/AbelianGaloisEquiv.lean @@ -0,0 +1,119 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Abelian +/-! +# Abelian Galois extensions under equivalent field presentations + +Compatible equivalences of the base and extension fields identify their +Galois automorphisms and preserve the abelian Galois property. These results +use only Mathlib's algebra and Galois APIs; they do not depend on local class +field theory or ramification. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +/-- Abelian Galois extensions remain abelian Galois after compatible ring +equivalences on both the base and extension fields. -/ +theorem isAbelianGalois_of_equiv_equiv + {K L M N : Type*} + [Field K] [Field L] [Algebra K L] [IsAbelianGalois K L] + [Field M] [Field N] [Algebra M N] + (f : K ≃+* M) (g : L ≃+* N) + (hcomp : (algebraMap M N).comp f.toRingHom = + g.toRingHom.comp (algebraMap K L)) : + IsAbelianGalois M N := by + let : IsGalois M N := IsGalois.of_equiv_equiv (f := f) (g := g) hcomp + have hbase (x : K) : + g (algebraMap K L x) = algebraMap M N (f x) := by + exact congrArg (fun h : K →+* N => h x) hcomp.symm + let transport (σ : Gal(N/M)) : Gal(L/K) := + AlgEquiv.ofRingEquiv + (f := (g.trans σ.toRingEquiv).trans g.symm) (by + intro x + apply g.injective + simp only [RingEquiv.trans_apply, RingEquiv.apply_symm_apply] + rw [hbase] + change σ (algebraMap M N (f x)) = algebraMap M N (f x) + exact σ.commutes (f x)) + have htransport_mul (σ τ : Gal(N/M)) : + transport (σ * τ) = transport σ * transport τ := by + ext x + simp only [transport, AlgEquiv.ofRingEquiv_apply, RingEquiv.trans_apply, + AlgEquiv.mul_apply, RingEquiv.apply_symm_apply] + congr 1 + have htransport_injective : Function.Injective transport := by + intro σ τ h + ext x + have hx := congrArg (fun e : Gal(L/K) => e (g.symm x)) h + have hx' := congrArg g hx + change σ.toRingEquiv x = τ.toRingEquiv x + simpa only [transport, + AlgEquiv.ofRingEquiv_apply, RingEquiv.trans_apply, + RingEquiv.apply_symm_apply, RingEquiv.symm_apply_apply] using hx' + let : IsMulCommutative Gal(N/M) := + .of_comm fun σ τ => htransport_injective (by + calc + transport (σ * τ) = transport σ * transport τ := htransport_mul σ τ + _ = transport τ * transport σ := mul_comm' _ _ + _ = transport (τ * σ) := (htransport_mul τ σ).symm) + exact { } + +/-- Compatible equivalences of field extensions identify their Galois +automorphisms by conjugation. -/ +noncomputable def galEquivOfEquivEquiv + {K L M N : Type*} + [Field K] [Field L] [Algebra K L] + [Field M] [Field N] [Algebra M N] + (f : K ≃+* M) (g : L ≃+* N) + (hcomp : (algebraMap M N).comp f.toRingHom = + g.toRingHom.comp (algebraMap K L)) : + Gal(N/M) ≃ Gal(L/K) := by + have hbase (x : K) : + g (algebraMap K L x) = algebraMap M N (f x) := + congrArg (fun h : K →+* N => h x) hcomp.symm + have hbase' (x : M) : + g.symm (algebraMap M N x) = algebraMap K L (f.symm x) := by + apply g.injective + rw [g.apply_symm_apply, hbase, f.apply_symm_apply] + let forward (σ : Gal(N/M)) : Gal(L/K) := + AlgEquiv.ofRingEquiv + (f := (g.trans σ.toRingEquiv).trans g.symm) (by + intro x + apply g.injective + simp only [RingEquiv.trans_apply, RingEquiv.apply_symm_apply] + rw [hbase] + change σ (algebraMap M N (f x)) = algebraMap M N (f x) + exact σ.commutes (f x)) + let backward (τ : Gal(L/K)) : Gal(N/M) := + AlgEquiv.ofRingEquiv + (f := (g.symm.trans τ.toRingEquiv).trans g) (by + intro x + apply g.symm.injective + simp only [RingEquiv.trans_apply, RingEquiv.symm_apply_apply] + rw [hbase'] + change τ (algebraMap K L (f.symm x)) = algebraMap K L (f.symm x) + exact τ.commutes (f.symm x)) + refine { + toFun := forward + invFun := backward + left_inv := ?_ + right_inv := ?_ } + · intro σ + ext x + simp [forward, backward, AlgEquiv.ofRingEquiv_apply] + · intro τ + ext x + simp [forward, backward, AlgEquiv.ofRingEquiv_apply] + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/FiniteAbelianIntermediateFieldAlgEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/FiniteAbelianIntermediateFieldAlgEquiv.lean new file mode 100644 index 0000000000..91fe7272c1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/FiniteAbelianIntermediateFieldAlgEquiv.lean @@ -0,0 +1,58 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.IntermediateFieldAlgEquivOrderIso +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.AbelianGaloisEquiv +/-! +# Finite abelian intermediate fields under an ambient algebra equivalence + +An algebra equivalence of ambient fields transports finite-dimensionality and +the abelian Galois property of every intermediate field. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u v w + +variable {F : Type u} {L : Type v} {L' : Type w} + [Field F] [Field L] [Field L'] [Algebra F L] [Algebra F L'] + (e : L ≃ₐ[F] L') (E : IntermediateField F L) + +/-- The equivalence of intermediate fields commutes with their base-field +embeddings. -/ +theorem intermediateFieldMap_commutes : + (algebraMap F (E.map e.toAlgHom)).comp (RingEquiv.refl F).toRingHom = + (IntermediateField.intermediateFieldMap e E).toRingHom.comp + (algebraMap F E) := by + ext x + simp + +/-- Mapping an intermediate field through an ambient algebra equivalence +preserves its finite-dimensionality. -/ +theorem finiteDimensional_intermediateField_map_algEquiv + [FiniteDimensional F E] : + FiniteDimensional F (E.map e.toAlgHom) := by + exact Module.Finite.of_equiv_equiv + (RingEquiv.refl F) (IntermediateField.intermediateFieldMap e E).toRingEquiv + (intermediateFieldMap_commutes e E) + +/-- Mapping an intermediate field through an ambient algebra equivalence +preserves its abelian Galois property. -/ +theorem isAbelianGalois_intermediateField_map_algEquiv + [IsAbelianGalois F E] : + IsAbelianGalois F (E.map e.toAlgHom) := by + exact isAbelianGalois_of_equiv_equiv + (RingEquiv.refl F) (IntermediateField.intermediateFieldMap e E).toRingEquiv + (intermediateFieldMap_commutes e E) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/IntermediateFieldAlgEquivOrderIso.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/IntermediateFieldAlgEquivOrderIso.lean new file mode 100644 index 0000000000..c0b94f4536 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/IntermediateFieldAlgEquivOrderIso.lean @@ -0,0 +1,54 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.IntermediateField.Basic +/-! +# Intermediate fields under an algebra equivalence + +An algebra equivalence of ambient fields induces an order equivalence of +their intermediate-field lattices. This is the ambient-change step used for +Mathlib's chosen separable closures. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u v w + +variable {F : Type u} {L : Type v} {L' : Type w} + [Field F] [Field L] [Field L'] [Algebra F L] [Algebra F L'] + +/-- Map intermediate fields along an algebra equivalence of ambient fields. -/ +def intermediateFieldAlgEquivOrderIso (e : L ≃ₐ[F] L') : + IntermediateField F L ≃o IntermediateField F L' where + toEquiv := { + toFun := fun E => E.map e.toAlgHom + invFun := fun E => E.map e.symm.toAlgHom + left_inv := by + intro E + apply SetLike.coe_injective + change e.symm '' (e '' (E : Set L)) = E + ext x + simp + right_inv := by + intro E + apply SetLike.coe_injective + change e '' (e.symm '' (E : Set L')) = E + ext x + simp + } + map_rel_iff' := by + intro E G + change e '' (E : Set L) ⊆ e '' (G : Set L) ↔ (E : Set L) ⊆ G + exact Set.image_subset_image_iff e.injective + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory.lean new file mode 100644 index 0000000000..89b1472e89 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory.lean @@ -0,0 +1,28 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.AdeleBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.CompositumEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.FiniteAbelianCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.QuadraticReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.TensorProduct + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele.lean new file mode 100644 index 0000000000..eac969cfd7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.Coordinates +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FinitePlaceTensorBlock +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FiniteRestrictedProductBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.InfinitePlaceTensorBlock +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralLocalFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.LocalComponents +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedProduct + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/All.lean new file mode 100644 index 0000000000..60d4e5f701 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/All.lean @@ -0,0 +1,19 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.Coordinates +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FinitePlaceTensorBlock +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FiniteRestrictedProductBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.InfinitePlaceTensorBlock +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralLocalFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.LocalComponents +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedProduct +/-! # Adelic coordinates and restricted products -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/Coordinates.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/Coordinates.lean new file mode 100644 index 0000000000..5577bc4281 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/Coordinates.lean @@ -0,0 +1,183 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.Support +/-! +# Coordinate assembly for relative adeles + +The chosen finite `K`-basis of `L` identifies +`𝔸_K ⊗[K] L` with a finite family of base adeles. The support file +constructs and controls the forward coefficients; this file supplies the +inverse assembly map. It is the global reconstruction half needed when +local tensor components have first been chosen place by place. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + + +universe u v + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +/-- A relative adele is linearly equivalent to its finite family of +base-adele coefficients in the chosen extension basis. -/ +noncomputable def relativeAdeleCoefficientLinearEquiv : + RelativeAdeleRing K L ≃ₗ[ + NumberField.AdeleRing (𝓞 K) K] + (RelativeAdeleBasisIndex (K := K) (L := L) → + NumberField.AdeleRing (𝓞 K) K) := + (relativeAdeleBasis (K := K) (L := L)).equivFun + +omit [NumberField L] in +@[simp] +theorem relativeAdeleCoefficientLinearEquiv_apply + (z : RelativeAdeleRing K L) + (i : RelativeAdeleBasisIndex (K := K) (L := L)) : + relativeAdeleCoefficientLinearEquiv + (K := K) (L := L) z i = + relativeAdeleCoefficient + (K := K) (L := L) z i := + rfl + +/-- Assemble a finite family of base adeles into a relative adele. -/ +noncomputable def relativeAdeleOfCoefficients + (a : + RelativeAdeleBasisIndex (K := K) (L := L) → + NumberField.AdeleRing (𝓞 K) K) : + RelativeAdeleRing K L := + (relativeAdeleCoefficientLinearEquiv + (K := K) (L := L)).symm a + +omit [NumberField L] in +@[simp] +theorem relativeAdeleCoefficient_ofCoefficients + (a : + RelativeAdeleBasisIndex (K := K) (L := L) → + NumberField.AdeleRing (𝓞 K) K) + (i : RelativeAdeleBasisIndex (K := K) (L := L)) : + relativeAdeleCoefficient + (K := K) (L := L) + (relativeAdeleOfCoefficients + (K := K) (L := L) a) i = + a i := by + change + relativeAdeleCoefficientLinearEquiv + (K := K) (L := L) + ((relativeAdeleCoefficientLinearEquiv + (K := K) (L := L)).symm a) i = + a i + rw [LinearEquiv.apply_symm_apply] + +omit [NumberField L] in +@[simp] +theorem relativeAdeleOfCoefficients_coefficients + (z : RelativeAdeleRing K L) : + relativeAdeleOfCoefficients + (K := K) (L := L) + (relativeAdeleCoefficient + (K := K) (L := L) z) = + z := by + change + (relativeAdeleCoefficientLinearEquiv + (K := K) (L := L)).symm + (relativeAdeleCoefficientLinearEquiv + (K := K) (L := L) z) = z + exact + (relativeAdeleCoefficientLinearEquiv + (K := K) (L := L)).symm_apply_apply z + +omit [NumberField L] in +/-- Finite-place evaluation of an assembled relative adele is the +corresponding tensor sum of its coefficient components. -/ +theorem relativeAdeleOfCoefficients_finiteComponent + (a : + RelativeAdeleBasisIndex (K := K) (L := L) → + NumberField.AdeleRing (𝓞 K) K) + (w : HeightOneSpectrum (𝓞 K)) : + relativeAdeleFiniteComponent + (K := K) (L := L) w + (relativeAdeleOfCoefficients + (K := K) (L := L) a) = + ∑ i : RelativeAdeleBasisIndex (K := K) (L := L), + (a i).2 w ⊗ₜ[K] + relativeExtensionBasis + (K := K) (L := L) i := by + rw [relativeAdeleFiniteComponent_eq_sum_tmul_coefficients] + apply Finset.sum_congr rfl + intro i _ + rw [relativeAdeleCoefficient_ofCoefficients] + +omit [NumberField L] in +/-- Infinite-place evaluation of an assembled relative adele is the +corresponding tensor sum of its coefficient components. -/ +theorem relativeAdeleOfCoefficients_infiniteComponent + (a : + RelativeAdeleBasisIndex (K := K) (L := L) → + NumberField.AdeleRing (𝓞 K) K) + (w : InfinitePlace K) : + relativeAdeleInfiniteComponent + (K := K) (L := L) w + (relativeAdeleOfCoefficients + (K := K) (L := L) a) = + ∑ i : RelativeAdeleBasisIndex (K := K) (L := L), + (a i).1 w ⊗ₜ[K] + relativeExtensionBasis + (K := K) (L := L) i := by + rw [relativeAdeleInfiniteComponent_eq_sum_tmul_coefficients] + apply Finset.sum_congr rfl + intro i _ + rw [relativeAdeleCoefficient_ofCoefficients] + +/-- Assemble mutually inverse coordinate families into an actual relative +idele. The inverse equation is checked after global coordinate assembly, +so no invertibility is hidden in the definition. -/ +noncomputable def relativeIdeleOfCoefficientFamilies + (a b : + RelativeAdeleBasisIndex (K := K) (L := L) → + NumberField.AdeleRing (𝓞 K) K) + (hab : + relativeAdeleOfCoefficients + (K := K) (L := L) a * + relativeAdeleOfCoefficients + (K := K) (L := L) b = 1) : + RelativeIdeleGroup K L := + Units.mkOfMulEqOne + (relativeAdeleOfCoefficients + (K := K) (L := L) a) + (relativeAdeleOfCoefficients + (K := K) (L := L) b) + hab + +omit [NumberField L] in +@[simp] +theorem relativeIdeleOfCoefficientFamilies_coe + (a b : + RelativeAdeleBasisIndex (K := K) (L := L) → + NumberField.AdeleRing (𝓞 K) K) + (hab : + relativeAdeleOfCoefficients + (K := K) (L := L) a * + relativeAdeleOfCoefficients + (K := K) (L := L) b = 1) : + ((relativeIdeleOfCoefficientFamilies + (K := K) (L := L) a b hab : + RelativeIdeleGroup K L) : + RelativeAdeleRing K L) = + relativeAdeleOfCoefficients + (K := K) (L := L) a := + Units.val_mkOfMulEqOne hab diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FinitePlaceTensorBlock.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FinitePlaceTensorBlock.lean new file mode 100644 index 0000000000..070f568f2b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FinitePlaceTensorBlock.lean @@ -0,0 +1,278 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedAction +/-! +# Finite-place tensor factors as induced local blocks + +This file is the finite-place counterpart of +`InfinitePlaceTensorBlock`. It compares the concrete completion +`K_v` used by the idele restricted product with the absolute-value +completion used by the canonical local tensor decomposition, and records equivariance for +conjugation on the second tensor factor. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + +open LocalClassFieldTheory + + +open AlgebraicNumberTheory.Valuations +open HilbertRamification + +variable {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +omit [NumberField L] [FiniteDimensional K L] [IsGalois K L] in +/-- Base change from the absolute-value completion to the concrete +adic completion commutes with conjugation on `L`. -/ +theorem finitePlaceLocalTensorAlgEquiv_conjugation + (v : HeightOneSpectrum (𝓞 K)) + (σ : L ≃ₐ[K] L) + (z : + LocalTensorAlgebra (L := L) + (HeightOneSpectrum.adicAbv K v)) : + finitePlaceLocalTensorAlgEquiv + (K := K) (L := L) v + (localTensorConjugation + (K := K) (L := L) + (HeightOneSpectrum.adicAbv K v) σ z) = + scalarTensorConjugation + (K := K) (L := L) + (A := v.adicCompletion K) σ + (finitePlaceLocalTensorAlgEquiv + (K := K) (L := L) v z) := by + induction z using TensorProduct.inductionOn with + | tmul a x => rfl + | add x y hx hy => simp [hx, hy] + +omit [NumberField L] [FiniteDimensional K L] [IsGalois K L] in +/-- The finite-completion comparison on tensor units is equivariant. -/ +theorem finitePlaceLocalTensorUnitsEquiv_smul + (v : HeightOneSpectrum (𝓞 K)) + (σ : L ≃ₐ[K] L) + (z : + (LocalTensorAlgebra (L := L) + (HeightOneSpectrum.adicAbv K v))ˣ) : + letI := + localTensorUnitsAction + (K := K) (L := L) + (HeightOneSpectrum.adicAbv K v) + letI := + scalarTensorUnitsAction + (K := K) (L := L) + (A := v.adicCompletion K) + finitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) v (σ • z) = + σ • finitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) v z := by + let := + localTensorUnitsAction + (K := K) (L := L) + (HeightOneSpectrum.adicAbv K v) + let := + scalarTensorUnitsAction + (K := K) (L := L) + (A := v.adicCompletion K) + apply Units.ext + exact finitePlaceLocalTensorAlgEquiv_conjugation + (K := K) (L := L) v σ + (z : + LocalTensorAlgebra (L := L) + (HeightOneSpectrum.adicAbv K v)) + +omit [NumberField L] [FiniteDimensional K L] [IsGalois K L] in +/-- Equivariance of the inverse finite-completion comparison. -/ +theorem finitePlaceLocalTensorUnitsEquiv_symm_smul + (v : HeightOneSpectrum (𝓞 K)) + (σ : L ≃ₐ[K] L) + (z : (v.adicCompletion K ⊗[K] L)ˣ) : + letI := + localTensorUnitsAction + (K := K) (L := L) + (HeightOneSpectrum.adicAbv K v) + letI := + scalarTensorUnitsAction + (K := K) (L := L) + (A := v.adicCompletion K) + (finitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) v).symm (σ • z) = + σ • + (finitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) v).symm z := by + let := + localTensorUnitsAction + (K := K) (L := L) + (HeightOneSpectrum.adicAbv K v) + let := + scalarTensorUnitsAction + (K := K) (L := L) + (A := v.adicCompletion K) + apply + (finitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) v).injective + rw [MulEquiv.apply_symm_apply, + finitePlaceLocalTensorUnitsEquiv_smul, + MulEquiv.apply_symm_apply] + +/-- The local tensor decomposition for the concrete finite component type used by relative +ideles. -/ +noncomputable def finitePlaceTensorUnitsEquivLocalPlaceBlock + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + letI := + decompositionGroupLocalUnitsAction + (HeightOneSpectrum.adicAbv K v) + (RayClass.adicAbv_isNontrivial v) w + letI hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := + AbsoluteValue.completionAlgebra + (HeightOneSpectrum.adicAbv K v) w.1 w.2 + letI : ∀ w' : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L, + Algebra + (HeightOneSpectrum.adicAbv K v).Completion + w'.1.Completion := + fun w' => + AbsoluteValue.completionAlgebra + (HeightOneSpectrum.adicAbv K v) + w'.1 w'.2 + (v.adicCompletion K ⊗[K] L)ˣ ≃* + LocalPlaceBlock + (HeightOneSpectrum.adicAbv K v) + (RayClass.adicAbv_isNontrivial v) w := + (finitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) v).symm.trans + (localTensorUnitsEquivLocalPlaceBlock + (HeightOneSpectrum.adicAbv K v) + (RayClass.adicAbv_isNontrivial v) w) + +section Equivariance + +variable + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) + +/-- The decomposition group acts on the units of the localized completion at the chosen finite +place. -/ +local instance finitePlaceDecompositionGroupAction : + MulDistribMulAction + (absoluteValueDecompositionGroup K w.1) + (AlgebraicNumberTheory.Valuations.LocalizedCompletion + (HeightOneSpectrum.adicAbv K v) w)ˣ := + decompositionGroupLocalUnitsAction + (HeightOneSpectrum.adicAbv K v) + (RayClass.adicAbv_isNontrivial v) w + +/-- The completion at the extended finite absolute value is an algebra over the base field. -/ +local instance finitePlaceExtensionCompletionAlgebra : + Algebra K w.1.Completion := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + +/-- The base field acts on the extended finite-place completion through its chosen algebra +structure. -/ +local instance finitePlaceExtensionCompletionSMul : + SMul K w.1.Completion := + (finitePlaceExtensionCompletionAlgebra v w).toSMul + +/-- The completion at the extended finite place is an algebra over the base-place completion. -/ +local instance finitePlaceLocalizedCompletionAlgebra : + Algebra + (HeightOneSpectrum.adicAbv K v).Completion + w.1.Completion := + AbsoluteValue.completionAlgebra + (HeightOneSpectrum.adicAbv K v) w.1 w.2 + +/-- Every extension of the finite absolute value gives a completion over the base-place +completion. -/ +local instance finitePlaceAllCompletionAlgebra + (w' : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + Algebra + (HeightOneSpectrum.adicAbv K v).Completion + w'.1.Completion := + AbsoluteValue.completionAlgebra + (HeightOneSpectrum.adicAbv K v) w'.1 w'.2 + +/-- Global Galois automorphisms act on units of the finite-place scalar tensor algebra. -/ +local instance finitePlaceScalarTensorUnitsAction : + MulDistribMulAction + (L ≃ₐ[K] L) + (v.adicCompletion K ⊗[K] L)ˣ := + scalarTensorUnitsAction + (K := K) (L := L) (A := v.adicCompletion K) + +/-- Global Galois automorphisms act on units of the finite-place local tensor algebra. -/ +local instance finitePlaceLocalTensorUnitsAction : + MulDistribMulAction + (L ≃ₐ[K] L) + (LocalTensorAlgebra (L := L) + (HeightOneSpectrum.adicAbv K v))ˣ := + localTensorUnitsAction + (K := K) (L := L) + (HeightOneSpectrum.adicAbv K v) + +omit [NumberField L] in +/-- The concrete finite-place local tensor decomposition is equivariant for the +full global Galois action. -/ +theorem finitePlaceTensorUnitsEquivLocalPlaceBlock_smul + (σ : L ≃ₐ[K] L) + (z : (v.adicCompletion K ⊗[K] L)ˣ) : + finitePlaceTensorUnitsEquivLocalPlaceBlock + (K := K) (L := L) v w (σ • z) = + σ • + finitePlaceTensorUnitsEquivLocalPlaceBlock + (K := K) (L := L) v w z := by + have hsource : + (finitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) v).symm (σ • z) = + σ • + (finitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) v).symm z := + finitePlaceLocalTensorUnitsEquiv_symm_smul + (K := K) (L := L) v σ z + calc + finitePlaceTensorUnitsEquivLocalPlaceBlock + (K := K) (L := L) v w (σ • z) = + localTensorUnitsEquivLocalPlaceBlock + (HeightOneSpectrum.adicAbv K v) + (RayClass.adicAbv_isNontrivial v) w + (σ • + (finitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) v).symm z) := + congrArg + (localTensorUnitsEquivLocalPlaceBlock + (HeightOneSpectrum.adicAbv K v) + (RayClass.adicAbv_isNontrivial v) w) + hsource + _ = + σ • + finitePlaceTensorUnitsEquivLocalPlaceBlock + (K := K) (L := L) v w z := + localTensorUnitsEquivLocalPlaceBlock_smul + (HeightOneSpectrum.adicAbv K v) + (RayClass.adicAbv_isNontrivial v) w σ + ((finitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) v).symm z) + +end Equivariance diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FiniteRestrictedProductBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FiniteRestrictedProductBaseChange.lean new file mode 100644 index 0000000000..ef0bb8403c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FiniteRestrictedProductBaseChange.lean @@ -0,0 +1,601 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.Comparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.SPlaces +/-! +# Finite restricted products under scalar extension + +This file flattens the finite local tensor factors of a relative idele over +`K` into the ordinary finite-place factors of `L`. The local map is +The canonical local tensor decomposition followed by the comparison between an exact-extension +completion and the concrete adic completion at its centre. + +The main point is restrictedness: coefficientwise restrictedness in a fixed +`K`-basis of `L` is equivalent, up to the already isolated finite comparison +set, to the usual valuation-ring-unit condition at almost every finite place +of `L`. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct RestrictedProduct +open NumberField IsDedekindDomain + +noncomputable +section + + +open AlgebraicNumberTheory.Valuations + +universe u v + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +/-- Reindex a dependent product along an equivalence, retaining its +coordinatewise multiplicative structure. -/ +noncomputable def piCongrLeftMulEquiv + {ι ι' : Type*} (M : ι' → Type*) + [∀ i, Mul (M i)] (e : ι ≃ ι') : + (∀ i, M (e i)) ≃* ∀ j, M j where + toEquiv := Equiv.piCongrLeft M e + map_mul' f g := by + funext j + obtain ⟨i, rfl⟩ := e.surjective j + change + Equiv.piCongrLeft M e (f * g) (e i) = + Equiv.piCongrLeft M e f (e i) * + Equiv.piCongrLeft M e g (e i) + rw [Equiv.piCongrLeft_apply_apply, + Equiv.piCongrLeft_apply_apply, + Equiv.piCongrLeft_apply_apply] + rfl + +/-- At one finite place of `K`, the canonical local tensor decomposition followed by completion +comparison identifies the tensor-unit group with the product of the concrete +adic unit groups at all finite places of `L` above it. -/ +noncomputable def finitePlaceTensorUnitsEquivAboveAdic + (w : HeightOneSpectrum (𝓞 K)) : + (w.adicCompletion K ⊗[K] L)ˣ ≃* + ∀ W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}, + (W.1.adicCompletion L)ˣ := + (finitePlaceLocalTensorDecompositionUnitsEquiv + (K := K) (L := L) w).trans + ((MulEquiv.piCongrRight fun u : + AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L => + Units.mapEquiv + (finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) w u).toMulEquiv).trans + (piCongrLeftMulEquiv + (fun W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w} => + (W.1.adicCompletion L)ˣ) + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w))) + +/-- Evaluation of the finite-place tensor units equivalence at an +extension of the given adic absolute value. -/ +@[simp] +theorem finitePlaceTensorUnitsEquivAboveAdic_apply_extension + (w : HeightOneSpectrum (𝓞 K)) + (x : (w.adicCompletion K ⊗[K] L)ˣ) + (u : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L) : + finitePlaceTensorUnitsEquivAboveAdic + (K := K) (L := L) w x + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w u) = + Units.mapEquiv + (finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) w u).toMulEquiv + (finitePlaceLocalTensorDecompositionUnitsComponent + (K := K) (L := L) w u x) := by + let P := + fun W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w} => + (W.1.adicCompletion L)ˣ + let e := finitePlaceExtensionEquivAbove (K := K) (L := L) w + let f : ∀ a, P (e a) := fun a => + Units.mapEquiv + (finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) w a).toMulEquiv + (finitePlaceLocalTensorDecompositionUnitsEquiv + (K := K) (L := L) w x a) + exact + (Equiv.piCongrLeft_apply_apply P e f u).trans + (congrArg + (Units.mapEquiv + (finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) w u).toMulEquiv) + (finitePlaceLocalTensorDecompositionUnitsEquiv_apply + (K := K) (L := L) w x u)) + +/-- On a diagonal extension-field unit, the finite local +relative-to-ordinary comparison is the ordinary diagonal embedding. -/ +theorem finitePlaceTensorUnitsEquivAboveAdic_localFieldIdeleInclusion + (w : HeightOneSpectrum (𝓞 K)) + (W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}) + (x : Lˣ) : + finitePlaceTensorUnitsEquivAboveAdic + (K := K) (L := L) w + (localFieldIdeleInclusion + (K := K) (L := L) w x) W = + Units.map + (FinitePlace.embedding (K := L) W.1) + x := by + obtain ⟨a, rfl⟩ := + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w).surjective W + rw [finitePlaceTensorUnitsEquivAboveAdic_apply_extension] + apply Units.ext + simp only [Units.coe_map] + change + finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) w a + (finitePlaceLocalTensorDecompositionComponent + (K := K) (L := L) w a + (1 ⊗ₜ[K] (x : L))) = + FinitePlace.embedding + (finitePlaceExtensionCentre + (K := K) (L := L) w a) + (x : L) + rw [finitePlaceLocalTensorDecompositionComponent_tmul] + simp only [map_one, one_mul, + finitePlaceExtensionAdicCompletionRingEquiv_toCompletion] + +/-- Flatten products first over finite places of `K` and then over places +above them into one product over all finite places of `L`. -/ +noncomputable def finitePlaceAbovePiMulEquiv : + (∀ w : HeightOneSpectrum (𝓞 K), + ∀ W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}, + (W.1.adicCompletion L)ˣ) ≃* + ∀ W : HeightOneSpectrum (𝓞 L), + (W.adicCompletion L)ˣ where + toFun f W := + f (finitePlaceBelow (K := K) W) ⟨W, rfl⟩ + invFun f w W := f W.1 + left_inv f := by + funext w W + rcases W with ⟨W, hW⟩ + subst w + rfl + right_inv f := by + funext W + rfl + map_mul' f g := by + funext W + rfl + +/-- The unrestricted product of all finite local tensor-unit groups is the +unrestricted product of all concrete finite local unit groups of `L`. -/ +noncomputable def relativeFiniteTensorPiMulEquiv : + (∀ w : HeightOneSpectrum (𝓞 K), + (w.adicCompletion K ⊗[K] L)ˣ) ≃* + ∀ W : HeightOneSpectrum (𝓞 L), + (W.adicCompletion L)ˣ := + (MulEquiv.piCongrRight fun w => + finitePlaceTensorUnitsEquivAboveAdic + (K := K) (L := L) w).trans + (finitePlaceAbovePiMulEquiv (K := K) (L := L)) + +/-- Coordinate formula for the relative finite tensor units +equivalence. -/ +@[simp] +theorem relativeFiniteTensorPiMulEquiv_apply + (x : ∀ w : HeightOneSpectrum (𝓞 K), + (w.adicCompletion K ⊗[K] L)ˣ) + (W : HeightOneSpectrum (𝓞 L)) : + relativeFiniteTensorPiMulEquiv + (K := K) (L := L) x W = + finitePlaceTensorUnitsEquivAboveAdic + (K := K) (L := L) + (finitePlaceBelow (K := K) W) + (x (finitePlaceBelow (K := K) W)) ⟨W, rfl⟩ := + rfl + +/-- Coordinate formula for the inverse relative finite tensor units +equivalence. -/ +@[simp] +theorem relativeFiniteTensorPiMulEquiv_symm_apply + (y : ∀ W : HeightOneSpectrum (𝓞 L), + (W.adicCompletion L)ˣ) + (w : HeightOneSpectrum (𝓞 K)) : + (relativeFiniteTensorPiMulEquiv + (K := K) (L := L)).symm y w = + (finitePlaceTensorUnitsEquivAboveAdic + (K := K) (L := L) w).symm + (fun W => y W.1) := + rfl + +/-- A multiplicative equivalence carries units of one submonoid to units +of another exactly when it carries their underlying elements between +the two submonoids. -/ +theorem unitsMapEquiv_mem_units_iff + {R S : Type*} [CommMonoid R] [CommMonoid S] + (e : R ≃* S) (A : Submonoid R) (B : Submonoid S) + (h : ∀ y : R, e y ∈ B ↔ y ∈ A) + (x : Rˣ) : + Units.mapEquiv e x ∈ B.units ↔ x ∈ A.units := by + rw [Submonoid.mem_units_iff, Submonoid.mem_units_iff] + constructor + · rintro ⟨hval, hinv⟩ + constructor + · exact (h (x : R)).mp (by simpa using hval) + · apply (h ((x⁻¹ : Rˣ) : R)).mp + rw [← (Units.mapEquiv e).map_inv x] at hinv + exact hinv + · rintro ⟨hval, hinv⟩ + constructor + · simpa using (h (x : R)).mpr hval + · rw [← (Units.mapEquiv e).map_inv x] + exact (h ((x⁻¹ : Rˣ) : R)).mpr hinv + +/-- The local tensor unit is integral in every relative-tensor factor +exactly when its flattened concrete components are local integer units at +every finite place above the base place. -/ +theorem relativeLocalTensorDecompositionIntegralUnitAt_iff_aboveAdic + (w : HeightOneSpectrum (𝓞 K)) + (x : (w.adicCompletion K ⊗[K] L)ˣ) : + RelativeLocalTensorDecompositionIntegralUnitAt + (K := K) (L := L) w x ↔ + ∀ W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}, + finitePlaceTensorUnitsEquivAboveAdic + (K := K) (L := L) w x W ∈ + (W.1.adicCompletionIntegers L).units := by + rw [relativeLocalTensorDecompositionIntegralUnitAt_iff] + constructor + · intro hx W + let u := + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w).symm W + have hW : + finitePlaceExtensionEquivAbove + (K := K) (L := L) w u = W := + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w).apply_symm_apply W + rw [← hW] + rw [finitePlaceTensorUnitsEquivAboveAdic_apply_extension] + exact + (unitsMapEquiv_mem_units_iff + (finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) w u).toMulEquiv + (absoluteValueCompletionIntegers u.1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K w) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w) u)).toSubmonoid + ((finitePlaceExtensionCentre + (K := K) (L := L) w u).adicCompletionIntegers L).toSubmonoid + (finitePlaceExtensionAdicCompletionRingEquiv_mem_integers_iff + (K := K) (L := L) w u) + (finitePlaceLocalTensorDecompositionUnitsComponent + (K := K) (L := L) w u x)).2 (hx u) + · intro hx u + have h := + hx (finitePlaceExtensionEquivAbove + (K := K) (L := L) w u) + rw [finitePlaceTensorUnitsEquivAboveAdic_apply_extension] at h + exact + (unitsMapEquiv_mem_units_iff + (finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) w u).toMulEquiv + (absoluteValueCompletionIntegers u.1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K w) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w) u)).toSubmonoid + ((finitePlaceExtensionCentre + (K := K) (L := L) w u).adicCompletionIntegers L).toSubmonoid + (finitePlaceExtensionAdicCompletionRingEquiv_mem_integers_iff + (K := K) (L := L) w u) + (finitePlaceLocalTensorDecompositionUnitsComponent + (K := K) (L := L) w u x)).1 h + +/-- Cofinite quantification over finite places of `L` is equivalent to +cofinite quantification over finite places of `K`, uniformly over every +place above the chosen base place. -/ +theorem eventually_finitePlace_iff_eventually_all_above + (P : ∀ _W : HeightOneSpectrum (𝓞 L), Prop) : + (∀ᶠ W : HeightOneSpectrum (𝓞 L) in Filter.cofinite, P W) ↔ + ∀ᶠ w : HeightOneSpectrum (𝓞 K) in Filter.cofinite, + ∀ W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}, + P W.1 := by + constructor + · intro h + have hbad : + {W : HeightOneSpectrum (𝓞 L) | ¬ P W}.Finite := + Filter.eventually_cofinite.mp h + have himage : + (finitePlaceBelow (K := K) '' + {W : HeightOneSpectrum (𝓞 L) | ¬ P W}).Finite := + hbad.image _ + apply Filter.eventually_cofinite.mpr + apply himage.subset + intro w hw + simp only [Set.mem_ofPred_eq] at hw + rw [Set.mem_image] + push Not at hw + rcases hw with ⟨W, hW⟩ + exact ⟨W.1, hW, W.2⟩ + · intro h + have hfibre (w : HeightOneSpectrum (𝓞 K)) : + Finite {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w} := by + let : Fintype + (AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L) := + completionTensorDecompositionExtensionFintype + (HeightOneSpectrum.adicAbv K w) + (RayClass.adicAbv_isNontrivial w) + exact + Finite.of_equiv + (AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L) + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w) + have htendsto : + Filter.Tendsto + (finitePlaceBelow (K := K)) + Filter.cofinite Filter.cofinite := + Filter.Tendsto.cofinite_of_finite_preimage_singleton + (f := finitePlaceBelow (K := K) (L := L)) + fun w => by + change + {W : HeightOneSpectrum (𝓞 L) | + finitePlaceBelow (K := K) W = w}.Finite + exact Set.finite_coe_iff.mp (hfibre w) + filter_upwards [htendsto.eventually h] with W hW + exact hW ⟨W, rfl⟩ + +/-- The finite part of the relative restricted local product. This is +the source model whose flattening is the ordinary finite idele group of +`L`. -/ +structure RelativeFiniteIdeleData where + /-- The unit in each finite local tensor factor. -/ + finite : + ∀ w : HeightOneSpectrum (𝓞 K), + (w.adicCompletion K ⊗[K] L)ˣ + /-- Every basis coordinate of the finite component is integral at + all but finitely many places. -/ + eventually_integral : + ∀ i : RelativeAdeleBasisIndex (K := K) (L := L), + ∀ᶠ w : HeightOneSpectrum (𝓞 K) in Filter.cofinite, + (Algebra.TensorProduct.basis + (w.adicCompletion K) + (relativeExtensionBasis + (K := K) (L := L))).repr + (finite w : w.adicCompletion K ⊗[K] L) i ∈ + w.adicCompletionIntegers K + /-- Every basis coordinate of the inverse finite component is integral + at all but finitely many places. -/ + eventually_inverse_integral : + ∀ i : RelativeAdeleBasisIndex (K := K) (L := L), + ∀ᶠ w : HeightOneSpectrum (𝓞 K) in Filter.cofinite, + (Algebra.TensorProduct.basis + (w.adicCompletion K) + (relativeExtensionBasis + (K := K) (L := L))).repr + (↑((finite w)⁻¹) : + w.adicCompletion K ⊗[K] L) i ∈ + w.adicCompletionIntegers K + +omit [NumberField L] in +/-- Relative finite idele data are equal when their finite components +are equal. -/ +@[ext] +theorem RelativeFiniteIdeleData.ext + {a b : RelativeFiniteIdeleData (K := K) (L := L)} + (hfinite : a.finite = b.finite) : + a = b := by + cases a + cases b + simp_all + +/-- Adjoin the trivial infinite family, so that the established relative +idele support theorem can be applied to finite restricted data. -/ +noncomputable def RelativeFiniteIdeleData.toLocalData + (a : RelativeFiniteIdeleData (K := K) (L := L)) : + RelativeLocalIdeleData (K := K) (L := L) where + infinite _ := 1 + finite := a.finite + eventually_integral := a.eventually_integral + eventually_inverse_integral := a.eventually_inverse_integral + +/-- A finite relative restricted family is integral in every concrete +completion factor over almost every base finite place. -/ +theorem RelativeFiniteIdeleData.eventually_aboveAdicUnit + (a : RelativeFiniteIdeleData (K := K) (L := L)) : + ∀ᶠ w : HeightOneSpectrum (𝓞 K) in Filter.cofinite, + ∀ W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}, + finitePlaceTensorUnitsEquivAboveAdic + (K := K) (L := L) w (a.finite w) W ∈ + (W.1.adicCompletionIntegers L).units := by + let z : RelativeIdeleGroup K L := + relativeIdeleOfLocalData + (K := K) (L := L) a.toLocalData + filter_upwards [ + (relativeIdeleLocalTensorDecompositionSupport + (K := K) (L := L) z).eventually_cofinite_notMem] with w hw + apply + (relativeLocalTensorDecompositionIntegralUnitAt_iff_aboveAdic + (K := K) (L := L) w (a.finite w)).mp + have hz := + relativeIdele_finiteComponent_localTensorDecompositionIntegralUnit_of_notMem + (K := K) (L := L) z w hw + simpa [z, RelativeFiniteIdeleData.toLocalData] using hz + +/-- Flatten a finite relative restricted family into an ordinary finite +idele of `L`. -/ +noncomputable def relativeFiniteIdeleToFiniteIdele + (a : RelativeFiniteIdeleData (K := K) (L := L)) : + FiniteIdeleGroup L := + ⟨relativeFiniteTensorPiMulEquiv + (K := K) (L := L) a.finite, + (eventually_finitePlace_iff_eventually_all_above + (K := K) (L := L) + (fun W => + relativeFiniteTensorPiMulEquiv + (K := K) (L := L) a.finite W ∈ + (W.adicCompletionIntegers L).units)).mpr <| by + filter_upwards [a.eventually_aboveAdicUnit] with w hw + intro W + rcases W with ⟨W, hW⟩ + subst w + exact hw ⟨W, rfl⟩⟩ + +/-- Evaluation of the map from relative finite idele data to finite +ideles. -/ +@[simp] +theorem relativeFiniteIdeleToFiniteIdele_apply + (a : RelativeFiniteIdeleData (K := K) (L := L)) + (W : HeightOneSpectrum (𝓞 L)) : + relativeFiniteIdeleToFiniteIdele + (K := K) (L := L) a W = + relativeFiniteTensorPiMulEquiv + (K := K) (L := L) a.finite W := + rfl + +/-- Pull an ordinary finite idele back to the unrestricted family of +finite tensor-unit factors. -/ +noncomputable def finiteIdeleRelativeTensorFamily + (y : FiniteIdeleGroup L) : + ∀ w : HeightOneSpectrum (𝓞 K), + (w.adicCompletion K ⊗[K] L)ˣ := + (relativeFiniteTensorPiMulEquiv + (K := K) (L := L)).symm (fun W => y W) + +/-- The pulled-back tensor family is basis-integral, together with its +inverse, at almost every finite place of `K`. -/ +theorem finiteIdeleRelativeTensorFamily_eventually_basisIntegralUnit + (y : FiniteIdeleGroup L) : + ∀ᶠ w : HeightOneSpectrum (𝓞 K) in Filter.cofinite, + RelativeBasisIntegralUnitAt + (K := K) (L := L) w + (finiteIdeleRelativeTensorFamily + (K := K) (L := L) y w) := by + have habove : + ∀ᶠ w : HeightOneSpectrum (𝓞 K) in Filter.cofinite, + ∀ W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}, + y W.1 ∈ (W.1.adicCompletionIntegers L).units := + (eventually_finitePlace_iff_eventually_all_above + (K := K) (L := L) + (fun W => y W ∈ + (W.adicCompletionIntegers L).units)).mp + (FiniteIdeleGroup.eventually_mem_localUnits y) + filter_upwards [ + habove, + (integralTensorComparisonBadPlaces + (K := K) (L := L)).eventually_cofinite_notMem] with w hw hbad + apply + (relativeBasisIntegralUnitAt_iff_localTensorDecompositionIntegralUnit_of_notMem + (K := K) (L := L) w hbad).mpr + apply + (relativeLocalTensorDecompositionIntegralUnitAt_iff_aboveAdic + (K := K) (L := L) w + (finiteIdeleRelativeTensorFamily + (K := K) (L := L) y w)).mpr + intro W + have hcomponent := + congrFun + ((finitePlaceTensorUnitsEquivAboveAdic + (K := K) (L := L) w).apply_symm_apply + (fun W => y W.1)) W + rw [finiteIdeleRelativeTensorFamily, + relativeFiniteTensorPiMulEquiv_symm_apply, + hcomponent] + exact hw W + +/-- Pull an ordinary finite idele back to finite relative restricted +data. -/ +noncomputable def finiteIdeleToRelativeFiniteIdeleData + (y : FiniteIdeleGroup L) : + RelativeFiniteIdeleData (K := K) (L := L) where + finite := + finiteIdeleRelativeTensorFamily + (K := K) (L := L) y + eventually_integral i := + (finiteIdeleRelativeTensorFamily_eventually_basisIntegralUnit + (K := K) (L := L) y).mono fun w hw => + relativeBasisIntegralAt_repr_mem + (K := K) (L := L) w _ hw.1 i + eventually_inverse_integral i := + (finiteIdeleRelativeTensorFamily_eventually_basisIntegralUnit + (K := K) (L := L) y).mono fun w hw => + relativeBasisIntegralAt_repr_mem + (K := K) (L := L) w _ hw.2 i + +/-- The finite relative restricted product is the ordinary finite idele +group of the extension field. -/ +noncomputable def relativeFiniteIdeleEquiv : + RelativeFiniteIdeleData (K := K) (L := L) ≃ + FiniteIdeleGroup L where + toFun := + relativeFiniteIdeleToFiniteIdele + (K := K) (L := L) + invFun := + finiteIdeleToRelativeFiniteIdeleData + (K := K) (L := L) + left_inv a := by + apply RelativeFiniteIdeleData.ext + change + (relativeFiniteTensorPiMulEquiv + (K := K) (L := L)).symm + (relativeFiniteTensorPiMulEquiv + (K := K) (L := L) a.finite) = + a.finite + exact + (relativeFiniteTensorPiMulEquiv + (K := K) (L := L)).symm_apply_apply a.finite + right_inv y := by + apply Subtype.ext + change + relativeFiniteTensorPiMulEquiv + (K := K) (L := L) + ((relativeFiniteTensorPiMulEquiv + (K := K) (L := L)).symm (fun W => y W)) = + fun W => y W + exact + (relativeFiniteTensorPiMulEquiv + (K := K) (L := L)).apply_symm_apply (fun W => y W) + +/-- The transported group structure on the finite relative restricted +product. -/ +noncomputable instance relativeFiniteIdeleDataGroup : + Group (RelativeFiniteIdeleData (K := K) (L := L)) := + (relativeFiniteIdeleEquiv + (K := K) (L := L)).group + +/-- The finite restricted-product comparison as a multiplicative +equivalence. -/ +noncomputable def relativeFiniteIdeleMulEquiv : + RelativeFiniteIdeleData (K := K) (L := L) ≃* + FiniteIdeleGroup L := + (relativeFiniteIdeleEquiv + (K := K) (L := L)).mulEquiv + +/-- The relative finite idele equivalence agrees with the underlying +finite-idele map. -/ +@[simp] +theorem relativeFiniteIdeleMulEquiv_apply + (a : RelativeFiniteIdeleData (K := K) (L := L)) : + relativeFiniteIdeleMulEquiv + (K := K) (L := L) a = + relativeFiniteIdeleToFiniteIdele + (K := K) (L := L) a := + rfl diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/InfinitePlaceTensorBlock.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/InfinitePlaceTensorBlock.lean new file mode 100644 index 0000000000..c4ea3562f1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/InfinitePlaceTensorBlock.lean @@ -0,0 +1,309 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor +public import Mathlib.NumberTheory.NumberField.Completion.LiesOverInstances +/-! +# Archimedean relative-idele factors as induced local blocks + +The concrete archimedean completion `w.Completion` used by the adele +library is canonically the completion of the underlying absolute value +`w.1`. Base change along this equivalence connects the actual +archimedean component of a relative idele to the local tensor block of +the local tensor decomposition, equivariantly for the full Galois action. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct NumberField.LiesOver +open NumberField + +noncomputable +section + +open LocalClassFieldTheory + + +open AlgebraicNumberTheory.Valuations +open HilbertRamification + +universe u v + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +/-- The wrapper completion at an infinite place as a `K`-algebra +equivalence with the underlying absolute-value completion. -/ +def infinitePlaceCompletionAlgEquiv + (w : InfinitePlace K) : + w.Completion ≃ₐ[K] w.1.Completion where + __ := InfinitePlace.Completion.equiv w + commutes' _ := rfl + +omit [NumberField L] in +/-- The canonical comparisons from concrete infinite-place completions to +absolute-value completions commute with the completion maps in a tower of +number fields. -/ +theorem infinitePlaceCompletionAlgEquiv_algebraMap + (v : InfinitePlace K) (w : InfinitePlace L) + (hw : w.comap (algebraMap K L) = v) : + letI : w.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) hw⟩ + let u : AbsoluteValueExtension v.1 L := + ⟨w.1, fun x => + congrArg (fun q : InfinitePlace K => q.1 x) hw⟩ + letI : Algebra v.1.Completion u.1.Completion := + AbsoluteValue.completionAlgebra v.1 u.1 u.2 + RingHom.comp + (algebraMap v.1.Completion u.1.Completion) + (infinitePlaceCompletionAlgEquiv v).toRingEquiv = + RingHom.comp + (infinitePlaceCompletionAlgEquiv w).toRingEquiv + (algebraMap v.Completion w.Completion) := by + let : w.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) hw⟩ + let u : AbsoluteValueExtension v.1 L := + ⟨w.1, fun x => + congrArg (fun q : InfinitePlace K => q.1 x) hw⟩ + let : Algebra v.1.Completion u.1.Completion := + AbsoluteValue.completionAlgebra v.1 u.1 u.2 + ext x + refine InfinitePlace.Completion.induction_on v x ?_ ?_ + · exact + isClosed_eq + ((AbsoluteValue.completionMap_isometry + v.1 w.1 u.2).continuous.comp + (InfinitePlace.Completion.continuous_toCompletion v)) + ((InfinitePlace.Completion.continuous_toCompletion w).comp + NumberField.LiesOver.continuous_completionMap) + · intro y + have hy : + (y : v.1.Completion) = + algebraMap K v.1.Completion + (WithAbs.equiv v.1 y) := by + rw [← AbsoluteValue.toCompletion_eq_algebraMap] + simp + change + AbsoluteValue.completionMap v.1 u.1 u.2 + (y : v.1.Completion) = + (NumberField.LiesOver.completionMap + (v := v) (w := w) + (y : v.Completion)).toCompletion + rw [NumberField.LiesOver.completionMap_coe] + rw [hy, AbsoluteValue.completionMap_coe] + rfl + +/-- Base change of the first tensor factor from the concrete +archimedean completion to the absolute-value completion. -/ +noncomputable def infinitePlaceLocalTensorAlgEquiv + (w : InfinitePlace K) : + w.Completion ⊗[K] L ≃ₐ[K] + LocalTensorAlgebra (L := L) w.1 := + Algebra.TensorProduct.congr + (infinitePlaceCompletionAlgEquiv w) + (AlgEquiv.refl : L ≃ₐ[K] L) + +omit [NumberField K] [NumberField L] [FiniteDimensional K L] in +/-- The concrete-to-absolute completion comparison acts componentwise +on a pure tensor. -/ +@[simp] +theorem infinitePlaceLocalTensorAlgEquiv_tmul + (w : InfinitePlace K) (a : w.Completion) (x : L) : + infinitePlaceLocalTensorAlgEquiv + (K := K) (L := L) w (a ⊗ₜ[K] x) = + infinitePlaceCompletionAlgEquiv w a ⊗ₜ[K] x := by + rfl + +/-- The induced multiplicative equivalence on local tensor units. -/ +noncomputable def infinitePlaceLocalTensorUnitsEquiv + (w : InfinitePlace K) : + (w.Completion ⊗[K] L)ˣ ≃* + (LocalTensorAlgebra (L := L) w.1)ˣ := + Units.mapEquiv + (infinitePlaceLocalTensorAlgEquiv + (K := K) (L := L) w).toMulEquiv + +omit [NumberField K] [NumberField L] [FiniteDimensional K L] in +/-- Completion comparison commutes with conjugation on the second +tensor factor. -/ +theorem infinitePlaceLocalTensorAlgEquiv_conjugation + (w : InfinitePlace K) + (σ : L ≃ₐ[K] L) + (z : w.Completion ⊗[K] L) : + infinitePlaceLocalTensorAlgEquiv + (K := K) (L := L) w + (scalarTensorConjugation + (K := K) (L := L) + (A := w.Completion) σ z) = + localTensorConjugation + (K := K) (L := L) w.1 σ + (infinitePlaceLocalTensorAlgEquiv + (K := K) (L := L) w z) := by + induction z using TensorProduct.inductionOn with + | tmul a x => rfl + | add x y hx hy => simp [hx, hy] + +omit [NumberField K] [NumberField L] [FiniteDimensional K L] in +/-- The completion comparison on units is equivariant. -/ +theorem infinitePlaceLocalTensorUnitsEquiv_smul + (w : InfinitePlace K) + (σ : L ≃ₐ[K] L) + (z : (w.Completion ⊗[K] L)ˣ) : + letI := scalarTensorUnitsAction + (K := K) (L := L) (A := w.Completion) + letI := localTensorUnitsAction + (K := K) (L := L) w.1 + infinitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) w (σ • z) = + σ • infinitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) w z := by + let := scalarTensorUnitsAction + (K := K) (L := L) (A := w.Completion) + let := localTensorUnitsAction + (K := K) (L := L) w.1 + apply Units.ext + exact infinitePlaceLocalTensorAlgEquiv_conjugation + (K := K) (L := L) w σ + (z : w.Completion ⊗[K] L) + +section Galois + +variable [IsGalois K L] + +/-- The local tensor decomposition for the actual archimedean component type used by the +relative idele restricted product. -/ +noncomputable def + infinitePlaceTensorUnitsEquivLocalPlaceBlock + (w : InfinitePlace K) + (hw : w.1.IsNontrivial) + (u : AbsoluteValueExtension w.1 L) : + letI := + decompositionGroupLocalUnitsAction w.1 hw u + letI hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) u.1 + letI : SMul K u.1.Completion := hK.toSMul + letI := + AbsoluteValue.completionAlgebra + w.1 u.1 u.2 + letI : ∀ u' : AbsoluteValueExtension w.1 L, + Algebra w.1.Completion u'.1.Completion := + fun u' => + AbsoluteValue.completionAlgebra + w.1 u'.1 u'.2 + (w.Completion ⊗[K] L)ˣ ≃* + LocalPlaceBlock w.1 hw u := by + letI := + decompositionGroupLocalUnitsAction w.1 hw u + letI hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) u.1 + letI : SMul K u.1.Completion := hK.toSMul + letI := + AbsoluteValue.completionAlgebra + w.1 u.1 u.2 + letI : ∀ u' : AbsoluteValueExtension w.1 L, + Algebra w.1.Completion u'.1.Completion := + fun u' => + AbsoluteValue.completionAlgebra + w.1 u'.1 u'.2 + exact + (infinitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) w).trans + (localTensorUnitsEquivLocalPlaceBlock + w.1 hw u) + +section Equivariance + +variable + (w : InfinitePlace K) + (hw : w.1.IsNontrivial) + (u : AbsoluteValueExtension w.1 L) + +/-- The completion at the extended infinite absolute value is an algebra over the base field. -/ +local instance infinitePlaceExtensionCompletionAlgebra : + Algebra K u.1.Completion := + AbsoluteValue.extensionCompletionAlgebra (K := K) u.1 + +/-- The base field acts on the extended infinite-place completion through its chosen algebra +structure. -/ +local instance infinitePlaceExtensionCompletionSMul : + SMul K u.1.Completion := + infinitePlaceExtensionCompletionAlgebra w u |>.toSMul + +/-- The completion at the extended infinite place is an algebra over the base-place completion. -/ +local instance infinitePlaceLocalizedCompletionAlgebra : + Algebra w.1.Completion u.1.Completion := + AbsoluteValue.completionAlgebra w.1 u.1 u.2 + +/-- Every extension of the infinite absolute value gives a completion over the base-place +completion. -/ +local instance infinitePlaceAllCompletionAlgebra + (u' : AbsoluteValueExtension w.1 L) : + Algebra w.1.Completion u'.1.Completion := + AbsoluteValue.completionAlgebra w.1 u'.1 u'.2 + +/-- Global Galois automorphisms act on units of the infinite-place scalar tensor algebra. -/ +local instance infinitePlaceScalarTensorUnitsAction : + MulDistribMulAction (L ≃ₐ[K] L) (w.Completion ⊗[K] L)ˣ := + scalarTensorUnitsAction (K := K) (L := L) (A := w.Completion) + +/-- Global Galois automorphisms act on units of the infinite-place local tensor algebra. -/ +local instance infinitePlaceLocalTensorUnitsAction : + MulDistribMulAction + (L ≃ₐ[K] L) + (LocalTensorAlgebra (L := L) w.1)ˣ := + localTensorUnitsAction (K := K) (L := L) w.1 + +omit [NumberField K] [NumberField L] in +/-- The actual archimedean local tensor equivalence is equivariant for the +full Galois action. -/ +theorem + infinitePlaceTensorUnitsEquivLocalPlaceBlock_smul + (σ : L ≃ₐ[K] L) + (z : (w.Completion ⊗[K] L)ˣ) : + letI := + decompositionGroupLocalUnitsAction w.1 hw u + infinitePlaceTensorUnitsEquivLocalPlaceBlock + (K := K) (L := L) w hw u (σ • z) = + σ • + infinitePlaceTensorUnitsEquivLocalPlaceBlock + (K := K) (L := L) w hw u z := by + let := + decompositionGroupLocalUnitsAction w.1 hw u + have hsource : + infinitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) w (σ • z) = + σ • infinitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) w z := + infinitePlaceLocalTensorUnitsEquiv_smul + (K := K) (L := L) w σ z + calc + infinitePlaceTensorUnitsEquivLocalPlaceBlock + (K := K) (L := L) w hw u (σ • z) = + localTensorUnitsEquivLocalPlaceBlock w.1 hw u + (σ • infinitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) w z) := + congrArg + (localTensorUnitsEquivLocalPlaceBlock w.1 hw u) + hsource + _ = + σ • infinitePlaceTensorUnitsEquivLocalPlaceBlock + (K := K) (L := L) w hw u z := + localTensorUnitsEquivLocalPlaceBlock_smul + w.1 hw u σ + (infinitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) w z) + +end Equivariance + +end Galois diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralLocalFactor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralLocalFactor.lean new file mode 100644 index 0000000000..fd878d5078 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralLocalFactor.lean @@ -0,0 +1,642 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.IdeleSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Localization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor +public import Mathlib.Algebra.Group.Pi.Units +public import Mathlib.Algebra.Group.Submonoid.Units +/-! +# Integral finite local factors of the relative idele group + +For a finite place `w` of the base field, the canonical local tensor decomposition identifies +`K_w ⊗_K L` with the product of the completions of `L` above `w`. +This file packages each projection as an actual ring homomorphism and +defines the subgroup of tensor units whose value and inverse are integral +in every completion factor. Thus the integrality predicate used for the +restricted product is closed under all group operations for structural, +rather than coordinate-dependent, reasons. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + + +open AlgebraicNumberTheory.Valuations +open LocalClassFieldTheory + +universe u v + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +/-- The projection of the finite local tensor algebra to one completion +factor in the canonical local tensor decomposition, as a ring homomorphism. -/ +noncomputable def finitePlaceLocalTensorDecompositionComponentRingHom + (w : HeightOneSpectrum (𝓞 K)) + (wL : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L) : + (w.adicCompletion K ⊗[K] L) →+* wL.1.Completion := by + let vK := HeightOneSpectrum.adicAbv K w + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial w + letI : ∀ u : AbsoluteValueExtension vK L, + Algebra vK.Completion u.1.Completion := + fun u => + AbsoluteValue.completionAlgebra vK u.1 u.2 + exact + (Pi.evalRingHom + (fun u : AbsoluteValueExtension vK L => + u.1.Completion) wL).comp + ((completionTensorDecompositionLeft + (K := K) (L := L) vK hvK).toRingEquiv.toRingHom.comp + (relativeFinitePlaceLocalTensorAlgEquiv + (K := K) (L := L) w).symm.toRingEquiv.toRingHom) + +omit [NumberField L] in +/-- The ring-homomorphism packaging evaluates to the original +relative-tensor component map. -/ +@[simp] +theorem finitePlaceLocalTensorDecompositionComponentRingHom_apply + (w : HeightOneSpectrum (𝓞 K)) + (wL : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L) + (x : w.adicCompletion K ⊗[K] L) : + finitePlaceLocalTensorDecompositionComponentRingHom + (K := K) (L := L) w wL x = + finitePlaceLocalTensorDecompositionComponent + (K := K) (L := L) w wL x := + rfl + +omit [NumberField L] in +/-- Every relative-tensor component map sends zero to zero. -/ +@[simp] +theorem finitePlaceLocalTensorDecompositionComponent_zero + (w : HeightOneSpectrum (𝓞 K)) + (wL : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L) : + finitePlaceLocalTensorDecompositionComponent + (K := K) (L := L) w wL 0 = 0 := by + simpa only [finitePlaceLocalTensorDecompositionComponentRingHom_apply] using + (finitePlaceLocalTensorDecompositionComponentRingHom + (K := K) (L := L) w wL).map_zero + +omit [NumberField L] in +/-- Relative-tensor component maps preserve addition. -/ +@[simp] +theorem finitePlaceLocalTensorDecompositionComponent_add + (w : HeightOneSpectrum (𝓞 K)) + (wL : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L) + (x y : w.adicCompletion K ⊗[K] L) : + finitePlaceLocalTensorDecompositionComponent + (K := K) (L := L) w wL (x + y) = + finitePlaceLocalTensorDecompositionComponent + (K := K) (L := L) w wL x + + finitePlaceLocalTensorDecompositionComponent + (K := K) (L := L) w wL y := by + simpa only [finitePlaceLocalTensorDecompositionComponentRingHom_apply] using + (finitePlaceLocalTensorDecompositionComponentRingHom + (K := K) (L := L) w wL).map_add x y + +/-- The corresponding component homomorphism on units. -/ +noncomputable def finitePlaceLocalTensorDecompositionUnitsComponent + (w : HeightOneSpectrum (𝓞 K)) + (wL : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L) : + (w.adicCompletion K ⊗[K] L)ˣ →* + wL.1.Completionˣ := + Units.map + (finitePlaceLocalTensorDecompositionComponentRingHom + (K := K) (L := L) w wL) + +/-- The canonical local tensor decomposition on the complete group of units of the finite local +tensor algebra. -/ +noncomputable def finitePlaceLocalTensorDecompositionUnitsEquiv + (w : HeightOneSpectrum (𝓞 K)) : + (w.adicCompletion K ⊗[K] L)ˣ ≃* + ∀ wL : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L, + wL.1.Completionˣ := by + let vK := HeightOneSpectrum.adicAbv K w + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial w + letI : ∀ u : AbsoluteValueExtension vK L, + Algebra vK.Completion u.1.Completion := + fun u => + AbsoluteValue.completionAlgebra vK u.1 u.2 + exact + (Units.mapEquiv + (((relativeFinitePlaceLocalTensorAlgEquiv + (K := K) (L := L) w).symm.toRingEquiv.trans + (completionTensorDecompositionLeft + (K := K) (L := L) vK hvK).toRingEquiv).toMulEquiv)).trans + MulEquiv.piUnits + +omit [NumberField L] in +/-- The product equivalence on units evaluates componentwise through the +corresponding unit homomorphism. -/ +@[simp] +theorem finitePlaceLocalTensorDecompositionUnitsEquiv_apply + (w : HeightOneSpectrum (𝓞 K)) + (x : (w.adicCompletion K ⊗[K] L)ˣ) + (wL : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L) : + finitePlaceLocalTensorDecompositionUnitsEquiv + (K := K) (L := L) w x wL = + finitePlaceLocalTensorDecompositionUnitsComponent + (K := K) (L := L) w wL x := + rfl + +omit [NumberField L] in +/-- Coercing a unit component to the completion agrees with applying the +underlying tensor component map. -/ +@[simp] +theorem finitePlaceLocalTensorDecompositionUnitsComponent_coe + (w : HeightOneSpectrum (𝓞 K)) + (wL : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L) + (x : (w.adicCompletion K ⊗[K] L)ˣ) : + ((finitePlaceLocalTensorDecompositionUnitsComponent + (K := K) (L := L) w wL x : + wL.1.Completionˣ) : + wL.1.Completion) = + finitePlaceLocalTensorDecompositionComponent + (K := K) (L := L) w wL + (x : w.adicCompletion K ⊗[K] L) := + rfl + +omit [NumberField K] [NumberField L] + [FiniteDimensional K L] in +/-- The completion equivalence induced by conjugation preserves the +norm exactly. -/ +theorem conjugateExtensionCompletionRingEquiv_norm_eq + (vK : AbsoluteValue K ℝ) + (wL : AbsoluteValueExtension vK L) + (σ : L ≃ₐ[K] L) + (x : + (absoluteValueExtensionConjugate + vK wL σ).1.Completion) : + ‖conjugateExtensionCompletionRingEquiv vK wL σ x‖ = + ‖x‖ := by + change ‖conjugateCompletionRingEquiv wL.1 σ x‖ = ‖x‖ + let f := (conjugateWithAbsRingEquiv wL.1 σ).toRingHom + let h := conjugateWithAbsRingEquiv_isometry wL.1 σ + change + ‖UniformSpace.Completion.mapRingHom f h.continuous x‖ = ‖x‖ + exact + (UniformSpace.Completion.isometry_mapRingHom h).norm_map_of_map_zero + (map_zero (UniformSpace.Completion.mapRingHom f h.continuous)) x + +omit [NumberField K] [NumberField L] + [FiniteDimensional K L] in +/-- The conjugate-completion equivalence identifies the two valuation +rings. -/ +theorem + conjugateExtensionCompletionRingEquiv_mem_integers_iff + (vK : AbsoluteValue K ℝ) + (hvK : IsNonarchimedean (vK : K → ℝ)) + (wL : AbsoluteValueExtension vK L) + (σ : L ≃ₐ[K] L) + (x : + (absoluteValueExtensionConjugate + vK wL σ).1.Completion) : + conjugateExtensionCompletionRingEquiv vK wL σ x ∈ + absoluteValueCompletionIntegers wL.1 + (absoluteValueExtension_isNonarchimedean + vK hvK wL) ↔ + x ∈ + absoluteValueCompletionIntegers + (absoluteValueExtensionConjugate + vK wL σ).1 + (absoluteValueExtension_isNonarchimedean + vK hvK + (absoluteValueExtensionConjugate + vK wL σ)) := by + rw [mem_absoluteValueCompletionIntegers_iff, + mem_absoluteValueCompletionIntegers_iff, + conjugateExtensionCompletionRingEquiv_norm_eq] + +omit [NumberField L] in +/-- Galois conjugation sends the component at `wL` to the component at +the conjugate extension, transported by the canonical completion +isometry. -/ +theorem finitePlaceLocalTensorDecompositionComponent_scalarTensorConjugation + (w : HeightOneSpectrum (𝓞 K)) + (wL : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L) + (σ : L ≃ₐ[K] L) + (x : w.adicCompletion K ⊗[K] L) : + finitePlaceLocalTensorDecompositionComponent + (K := K) (L := L) w wL + (scalarTensorConjugation + (K := K) (L := L) + (A := w.adicCompletion K) σ x) = + conjugateExtensionCompletionRingEquiv + (HeightOneSpectrum.adicAbv K w) wL σ + (finitePlaceLocalTensorDecompositionComponent + (K := K) (L := L) w + (absoluteValueExtensionConjugate + (HeightOneSpectrum.adicAbv K w) wL σ) x) := by + let vK := HeightOneSpectrum.adicAbv K w + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial w + let : ∀ u : AbsoluteValueExtension vK L, + Algebra vK.Completion u.1.Completion := + fun u => + AbsoluteValue.completionAlgebra vK u.1 u.2 + induction x using TensorProduct.inductionOn with + | add x y hx hy => + rw [map_add, finitePlaceLocalTensorDecompositionComponent_add, + finitePlaceLocalTensorDecompositionComponent_add, map_add, hx, hy] + | tmul a b => + rw [scalarTensorConjugation_tmul, + finitePlaceLocalTensorDecompositionComponent_tmul, + finitePlaceLocalTensorDecompositionComponent_tmul, + map_mul] + change + algebraMap vK.Completion wL.1.Completion + ((relativeFinitePlaceCompletionAlgEquiv + (K := K) w).symm a) * + AbsoluteValue.toCompletion wL.1 (σ b) = + conjugateExtensionCompletionRingEquiv vK wL σ + (algebraMap vK.Completion + (absoluteValueExtensionConjugate + vK wL σ).1.Completion + ((relativeFinitePlaceCompletionAlgEquiv + (K := K) w).symm a)) * + conjugateExtensionCompletionRingEquiv vK wL σ + (AbsoluteValue.toCompletion + (absoluteValueExtensionConjugate + vK wL σ).1 b) + rw [conjugateExtensionCompletionRingEquiv_algebraMap, + conjugateExtensionCompletionRingEquiv_toCompletion] + +omit [NumberField L] in +/-- Valuation-ring integrality of a tensor element is preserved by +Galois conjugation. -/ +theorem relativeLocalTensorDecompositionIntegralAt_scalarTensorConjugation + (w : HeightOneSpectrum (𝓞 K)) + (σ : L ≃ₐ[K] L) + {x : w.adicCompletion K ⊗[K] L} + (hx : RelativeLocalTensorDecompositionIntegralAt + (K := K) (L := L) w x) : + RelativeLocalTensorDecompositionIntegralAt + (K := K) (L := L) w + (scalarTensorConjugation + (K := K) (L := L) + (A := w.adicCompletion K) σ x) := by + intro wL + rw [finitePlaceLocalTensorDecompositionComponent_scalarTensorConjugation] + exact + (conjugateExtensionCompletionRingEquiv_mem_integers_iff + (K := K) (L := L) + (vK := HeightOneSpectrum.adicAbv K w) + (hvK := + HeightOneSpectrum.isNonarchimedean_adicAbv K w) + (wL := wL) (σ := σ) _).2 + (hx + (absoluteValueExtensionConjugate + (HeightOneSpectrum.adicAbv K w) wL σ)) + +omit [NumberField L] in +/-- The integral tensor-unit condition is stable under the natural +Galois action. -/ +theorem relativeLocalTensorDecompositionIntegralUnitAt_smul + (w : HeightOneSpectrum (𝓞 K)) + (σ : L ≃ₐ[K] L) + (x : (w.adicCompletion K ⊗[K] L)ˣ) + (hx : RelativeLocalTensorDecompositionIntegralUnitAt + (K := K) (L := L) w x) : + letI := scalarTensorUnitsAction + (K := K) (L := L) + (A := w.adicCompletion K) + RelativeLocalTensorDecompositionIntegralUnitAt + (K := K) (L := L) w (σ • x) := by + let := scalarTensorUnitsAction + (K := K) (L := L) + (A := w.adicCompletion K) + constructor + · change + RelativeLocalTensorDecompositionIntegralAt + (K := K) (L := L) w + (↑(σ • x) : + w.adicCompletion K ⊗[K] L) + rw [scalarTensorUnitsAction_coe] + exact + relativeLocalTensorDecompositionIntegralAt_scalarTensorConjugation + (K := K) (L := L) w σ hx.1 + · change + RelativeLocalTensorDecompositionIntegralAt + (K := K) (L := L) w + (↑((σ • x)⁻¹) : + w.adicCompletion K ⊗[K] L) + rw [← smul_inv', scalarTensorUnitsAction_coe] + exact + relativeLocalTensorDecompositionIntegralAt_scalarTensorConjugation + (K := K) (L := L) w σ hx.2 + +omit [NumberField L] in +/-- Integrality of a tensor unit is exactly membership of every +relative-tensor component in the unit subgroup of its valuation ring. -/ +theorem relativeLocalTensorDecompositionIntegralUnitAt_iff + (w : HeightOneSpectrum (𝓞 K)) + (x : (w.adicCompletion K ⊗[K] L)ˣ) : + RelativeLocalTensorDecompositionIntegralUnitAt + (K := K) (L := L) w x ↔ + ∀ wL : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L, + finitePlaceLocalTensorDecompositionUnitsComponent + (K := K) (L := L) w wL x ∈ + (absoluteValueCompletionIntegers wL.1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K w) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w) + wL)).units := by + constructor + · rintro ⟨hx, hxinv⟩ wL + exact ⟨hx wL, by + change + finitePlaceLocalTensorDecompositionComponent + (K := K) (L := L) w wL + (↑(x⁻¹) : + w.adicCompletion K ⊗[K] L) ∈ + absoluteValueCompletionIntegers wL.1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K w) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w) + wL) + exact hxinv wL⟩ + · intro hx + constructor + · intro wL + exact (hx wL).1 + · intro wL + exact (hx wL).2 + +/-- The actual integral-unit subgroup in a finite local tensor factor. -/ +noncomputable def relativeLocalTensorDecompositionIntegralUnitSubgroup + (w : HeightOneSpectrum (𝓞 K)) : + Subgroup (w.adicCompletion K ⊗[K] L)ˣ := + Subgroup.comap + (MonoidHom.pi + (fun wL : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L => + finitePlaceLocalTensorDecompositionUnitsComponent + (K := K) (L := L) w wL)) + (Subgroup.pi Set.univ fun wL => + (absoluteValueCompletionIntegers wL.1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K w) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w) + wL)).units) + +/-- The product of the actual valuation-ring unit groups in all +completion factors above a finite base place. -/ +abbrev FinitePlaceLocalTensorDecompositionIntegralUnitProduct + (w : HeightOneSpectrum (𝓞 K)) := + Subgroup.pi Set.univ fun + wL : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L => + (absoluteValueCompletionIntegers wL.1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K w) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w) + wL)).units + +/-- A product subgroup is the product of its component subgroup types. -/ +@[implicit_reducible] +noncomputable def + finitePlaceLocalTensorDecompositionIntegralUnitProductEquivPi + (w : HeightOneSpectrum (𝓞 K)) : + FinitePlaceLocalTensorDecompositionIntegralUnitProduct + (K := K) (L := L) w ≃* + ∀ wL : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L, + (absoluteValueCompletionIntegers wL.1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K w) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w) + wL)).units where + toFun x wL := + ⟨x.1 wL, x.2 wL (Set.mem_univ wL)⟩ + invFun x := + ⟨fun wL => x wL, by + intro wL hwL + exact (x wL).2⟩ + left_inv x := by + apply Subtype.ext + rfl + right_inv x := by + funext wL + apply Subtype.ext + rfl + map_mul' x y := by + funext wL + apply Subtype.ext + rfl + +/-- Replace each valuation-ring unit subgroup by the intrinsic unit +group of the valuation ring. -/ +noncomputable def + finitePlaceLocalTensorDecompositionIntegralUnitProductEquivPiUnits + (w : HeightOneSpectrum (𝓞 K)) : + FinitePlaceLocalTensorDecompositionIntegralUnitProduct + (K := K) (L := L) w ≃* + ∀ wL : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L, + (absoluteValueCompletionIntegers wL.1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K w) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w) + wL))ˣ := + (finitePlaceLocalTensorDecompositionIntegralUnitProductEquivPi + (K := K) (L := L) w).trans + (MulEquiv.piCongrRight fun wL => + (absoluteValueCompletionIntegers wL.1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K w) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w) + wL)).unitsEquivUnitsType) + +omit [NumberField L] in +/-- Membership in the integral tensor-unit subgroup is exactly the +pointwise valuation-ring integrality condition. -/ +@[simp] +theorem mem_relativeLocalTensorDecompositionIntegralUnitSubgroup_iff + (w : HeightOneSpectrum (𝓞 K)) + (x : (w.adicCompletion K ⊗[K] L)ˣ) : + x ∈ relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w ↔ + RelativeLocalTensorDecompositionIntegralUnitAt + (K := K) (L := L) w x := by + rw [relativeLocalTensorDecompositionIntegralUnitAt_iff] + simp only [relativeLocalTensorDecompositionIntegralUnitSubgroup, + Subgroup.mem_comap, MonoidHom.pi_apply, Subgroup.mem_pi, + Set.mem_univ, forall_const] + +/-- The restricted Galois action on the integral tensor-unit +subgroup. -/ +@[implicit_reducible] +noncomputable def + relativeLocalTensorDecompositionIntegralUnitSubgroupAction + (w : HeightOneSpectrum (𝓞 K)) : + MulDistribMulAction + (L ≃ₐ[K] L) + (relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w) := by + letI := scalarTensorUnitsAction + (K := K) (L := L) + (A := w.adicCompletion K) + exact + { smul := fun σ x => + ⟨σ • (x : + (w.adicCompletion K ⊗[K] L)ˣ), + by + rw [mem_relativeLocalTensorDecompositionIntegralUnitSubgroup_iff] + have hx : + RelativeLocalTensorDecompositionIntegralUnitAt + (K := K) (L := L) w + (x : (w.adicCompletion K ⊗[K] L)ˣ) := + (mem_relativeLocalTensorDecompositionIntegralUnitSubgroup_iff + (K := K) (L := L) w x).1 x.property + exact + relativeLocalTensorDecompositionIntegralUnitAt_smul + (K := K) (L := L) w σ x hx⟩ + one_smul := by + intro x + apply Subtype.ext + change + (1 : L ≃ₐ[K] L) • + (x : (w.adicCompletion K ⊗[K] L)ˣ) = + (x : (w.adicCompletion K ⊗[K] L)ˣ) + exact one_smul (L ≃ₐ[K] L) _ + mul_smul := by + intro σ τ x + apply Subtype.ext + exact mul_smul σ τ + (x : (w.adicCompletion K ⊗[K] L)ˣ) + smul_one := by + intro σ + apply Subtype.ext + change + σ • (1 : (w.adicCompletion K ⊗[K] L)ˣ) = 1 + exact smul_one σ + smul_mul := by + intro σ x y + apply Subtype.ext + exact smul_mul' σ + (x : (w.adicCompletion K ⊗[K] L)ˣ) + (y : (w.adicCompletion K ⊗[K] L)ˣ) } + +omit [NumberField L] in +@[simp] +theorem + relativeLocalTensorDecompositionIntegralUnitSubgroupAction_coe + (w : HeightOneSpectrum (𝓞 K)) + (σ : L ≃ₐ[K] L) + (x : relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w) : + letI := + relativeLocalTensorDecompositionIntegralUnitSubgroupAction + (K := K) (L := L) w + ((σ • x : + relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w) : + (w.adicCompletion K ⊗[K] L)ˣ) = + letI := scalarTensorUnitsAction + (K := K) (L := L) + (A := w.adicCompletion K) + σ • + (x : (w.adicCompletion K ⊗[K] L)ˣ) := + rfl + +/-- The integral local tensor-unit subgroup is exactly the product of +the valuation-ring unit groups occurring in the canonical local tensor decomposition. -/ +noncomputable def + relativeLocalTensorDecompositionIntegralUnitSubgroupEquivProduct + (w : HeightOneSpectrum (𝓞 K)) : + relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w ≃* + FinitePlaceLocalTensorDecompositionIntegralUnitProduct + (K := K) (L := L) w where + toFun x := ⟨finitePlaceLocalTensorDecompositionUnitsEquiv + (K := K) (L := L) w x, by + have hx := x.property + rw [mem_relativeLocalTensorDecompositionIntegralUnitSubgroup_iff, + relativeLocalTensorDecompositionIntegralUnitAt_iff] at hx + rw [Subgroup.mem_pi] + intro wL hwL + simpa only [finitePlaceLocalTensorDecompositionUnitsEquiv_apply] using + (hx wL)⟩ + invFun y := ⟨(finitePlaceLocalTensorDecompositionUnitsEquiv + (K := K) (L := L) w).symm y, by + rw [mem_relativeLocalTensorDecompositionIntegralUnitSubgroup_iff, + relativeLocalTensorDecompositionIntegralUnitAt_iff] + intro wL + have hy : + finitePlaceLocalTensorDecompositionUnitsEquiv + (K := K) (L := L) w + ((finitePlaceLocalTensorDecompositionUnitsEquiv + (K := K) (L := L) w).symm y) wL ∈ + (absoluteValueCompletionIntegers wL.1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K w) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w) + wL)).units := by + rw [(finitePlaceLocalTensorDecompositionUnitsEquiv + (K := K) (L := L) w).apply_symm_apply] + exact y.property wL (Set.mem_univ wL) + simpa only [finitePlaceLocalTensorDecompositionUnitsEquiv_apply] using hy⟩ + left_inv x := by + apply Subtype.ext + exact + (finitePlaceLocalTensorDecompositionUnitsEquiv + (K := K) (L := L) w).symm_apply_apply x + right_inv y := by + apply Subtype.ext + exact + (finitePlaceLocalTensorDecompositionUnitsEquiv + (K := K) (L := L) w).apply_symm_apply y + map_mul' x y := by + apply Subtype.ext + exact + (finitePlaceLocalTensorDecompositionUnitsEquiv + (K := K) (L := L) w).map_mul x y + +/-- Final local form: the integral tensor units are the product of the +intrinsic unit groups of all completion valuation rings above `w`. -/ +noncomputable def + relativeLocalTensorDecompositionIntegralUnitSubgroupEquivPiUnits + (w : HeightOneSpectrum (𝓞 K)) : + relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w ≃* + ∀ wL : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L, + (absoluteValueCompletionIntegers wL.1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K w) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w) + wL))ˣ := + (relativeLocalTensorDecompositionIntegralUnitSubgroupEquivProduct + (K := K) (L := L) w).trans + (finitePlaceLocalTensorDecompositionIntegralUnitProductEquivPiUnits + (K := K) (L := L) w) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport.lean new file mode 100644 index 0000000000..0d9bd2e06c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.IdeleSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Localization + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/AbsoluteValue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/AbsoluteValue.lean new file mode 100644 index 0000000000..4221476f5d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/AbsoluteValue.lean @@ -0,0 +1,260 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.Support +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ExponentialValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Complete +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductDecomposition +public import Mathlib.Algebra.Module.Torsion.Basic +public import Mathlib.LinearAlgebra.Basis.SMul +public import Mathlib.RingTheory.Algebraic.Integral +public import Mathlib.RingTheory.DedekindDomain.Factorization +public import Mathlib.RingTheory.Discriminant +public import Mathlib.RingTheory.Localization.Finiteness +public import Mathlib.RingTheory.Valuation.LocalSubring +public import Mathlib.RingTheory.Valuation.ValuationSubring +/-! +# Integral lattices for the relative tensor basis + +This file continues the finite-support construction for relative tensor +decompositions. A single nonzero integer is chosen which carries every +vector of the fixed `K`-basis of `L` into `𝓞 L`. Their +`𝓞 K`-span is a full lattice in `𝓞 L`. + +The quotient of `𝓞 L` by this lattice is then proved directly to be a +finite torsion `𝓞 K`-module. A nonzero element of its annihilator +therefore gives an actual finite set of bad height-one primes. Outside +that set the scaled lattice generates the localization of `𝓞 L` over +the local ring of `K`. + +Finally, a universe-polymorphic comparison between the absolute-value +and adic models of `K_v` carries this result through the canonical local tensor decomposition. +Away from the same bad set, the chosen basis-integral lattice maps into +the product of the completion valuation rings; applying the statement +to a unit and its inverse gives the actual product of local integer +unit groups needed in the finite-support decomposition. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct NNReal +open NumberField IsDedekindDomain + +noncomputable +section + + +open AlgebraicNumberTheory.Valuations + +universe u v + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +/-- A nonarchimedean real absolute value, regarded as a valuation with +values in the nonnegative reals. -/ +noncomputable def realAbsoluteValueValuation + {F : Type*} [Field F] + (vF : AbsoluteValue F ℝ) + (hvF : IsNonarchimedean (vF : F → ℝ)) : + Valuation F NNReal where + toFun x := ⟨vF x, vF.nonneg x⟩ + map_one' := by + ext + exact vF.map_one + map_zero' := by + ext + exact vF.map_zero + map_mul' x y := by + ext + exact vF.map_mul x y + map_add_le_max' x y := by + change vF (x + y) ≤ max (vF x) (vF y) + exact hvF x y + +/-- The following two lemmas expose the valuation-subring interface used by later modules. -/ +@[simp] +theorem realAbsoluteValueValuation_apply + {F : Type*} [Field F] + (vF : AbsoluteValue F ℝ) + (hvF : IsNonarchimedean (vF : F → ℝ)) + (x : F) : + ((realAbsoluteValueValuation vF hvF x : NNReal) : ℝ) = + vF x := + rfl + +/-- Every extension of a nonarchimedean absolute value is again +nonarchimedean. For algebraic extensions this follows already from +the bounded-natural-number criterion and the extension identity. -/ +theorem absoluteValueExtension_isNonarchimedean + {F E : Type*} [Field F] [Field E] [Algebra F E] + (vF : AbsoluteValue F ℝ) + (hvF : IsNonarchimedean (vF : F → ℝ)) + (w : AbsoluteValueExtension vF E) : + IsNonarchimedean (w.1 : E → ℝ) := by + rw [AbsoluteValue.isNonarchimedean_iff_bounded_nat] + refine ⟨1, ?_⟩ + intro n + calc + w.1 (n : E) = + w.1 (algebraMap F E (n : F)) := by simp + _ = vF (n : F) := w.2 (n : F) + _ ≤ 1 := + hvF.apply_natCast_le_one (map_zero_le vF 1) (map_one vF) + +/-- An element integral over `ℤ` lies in the valuation subring of +every nonarchimedean real absolute value. -/ +theorem absoluteValue_le_one_of_isIntegral + {F : Type*} [Field F] + (vF : AbsoluteValue F ℝ) + (hvF : IsNonarchimedean (vF : F → ℝ)) + {x : F} (hx : IsIntegral ℤ x) : + vF x ≤ 1 := by + let ν : Valuation F NNReal := + realAbsoluteValueValuation vF hvF + let V : ValuationSubring F := ν.valuationSubring + let : IsIntegrallyClosedIn V F := + (isIntegrallyClosed_iff_isIntegrallyClosedIn F).1 + inferInstance + let : IsScalarTower ℤ V F := + IsScalarTower.of_algebraMap_eq fun n => by + simp + have hxV : IsIntegral V x := + hx.tower_top + obtain ⟨y, hy⟩ := + (IsIntegrallyClosedIn.isIntegral_iff).1 hxV + have hν : x ∈ V := by + rw [← hy, ValuationSubring.algebraMap_apply] + exact y.property + change + realAbsoluteValueValuation vF hvF x ≤ 1 at hν + exact_mod_cast hν + +/-- The valuation ring in the completion of a nonarchimedean +real-absolute-valued field. -/ +noncomputable def absoluteValueCompletionIntegers + {F : Type*} [Field F] + (vF : AbsoluteValue F ℝ) + (hvF : IsNonarchimedean (vF : F → ℝ)) : + ValuationSubring vF.Completion := + (realAbsoluteValueValuation + (AbsoluteValue.completionAbsoluteValue vF) + (AbsoluteValue.completionAbsoluteValue_isNonarchimedean + vF hvF)).valuationSubring + +/-- Membership in the absolute-value completion integers is the valuation bound. -/ +@[simp] +theorem mem_absoluteValueCompletionIntegers_iff + {F : Type*} [Field F] + (vF : AbsoluteValue F ℝ) + (hvF : IsNonarchimedean (vF : F → ℝ)) + (x : vF.Completion) : + x ∈ absoluteValueCompletionIntegers vF hvF ↔ + ‖x‖ ≤ 1 := + Iff.rfl + +omit [NumberField K] [NumberField L] in +/-- An element of an extension-completion valuation ring is integral +over the valuation ring in the base completion. This is the +integral-closure characterization for complete henselian valued +fields, expressed in the absolute-value completion model used by +the canonical local tensor decomposition. -/ +theorem isIntegral_over_baseCompletionIntegers_of_mem + [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) + (hvK : IsNonarchimedean (vK : K → ℝ)) + (hvK0 : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + {x : w.1.Completion} + (hx : x ∈ absoluteValueCompletionIntegers w.1 + (absoluteValueExtension_isNonarchimedean vK hvK w)) : + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + IsIntegral (absoluteValueCompletionIntegers vK hvK) x := by + let hw : IsNonarchimedean (w.1 : L → ℝ) := + absoluteValueExtension_isNonarchimedean vK hvK w + let aC := AbsoluteValue.completionAbsoluteValue vK + let bC := AbsoluteValue.completionAbsoluteValue w.1 + let haC : LubinTate.Valuations.NonarchimedeanAbsoluteValue aC := + (AbsoluteValue.isNonarchimedean_iff_bounded_nat aC).1 + (AbsoluteValue.completionAbsoluteValue_isNonarchimedean vK hvK) + let hbC : LubinTate.Valuations.NonarchimedeanAbsoluteValue bC := + (AbsoluteValue.isNonarchimedean_iff_bounded_nat bC).1 + (AbsoluteValue.completionAbsoluteValue_isNonarchimedean w.1 hw) + let va := + absoluteValueExponentialValuation aC haC + let vb := + absoluteValueExponentialValuation bC hbC + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let : Module.Finite vK.Completion w.1.Completion := + completionModuleFinite vK hvK0 w + let : Algebra.IsAlgebraic vK.Completion w.1.Completion := + Algebra.IsAlgebraic.of_finite vK.Completion w.1.Completion + have hVaAbs : + LubinTate.Valuations.exponentialValuationSubringAsValuationSubring va = + absoluteValueValuationSubring aC haC := + associatedAbsoluteValue_valuationSubring_eq + va (Real.exp 1) aC haC + (absoluteValueExponentialValuation_associated aC haC) + have hVbAbs : + LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vb = + absoluteValueValuationSubring bC hbC := + associatedAbsoluteValue_valuationSubring_eq + vb (Real.exp 1) bC hbC + (absoluteValueExponentialValuation_associated bC hbC) + have hVa : + LubinTate.Valuations.exponentialValuationSubringAsValuationSubring va = + absoluteValueCompletionIntegers vK hvK := by + rw [hVaAbs] + ext y + rw [mem_absoluteValueValuationSubring_iff, + mem_absoluteValueCompletionIntegers_iff] + rfl + have hVb : + LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vb = + absoluteValueCompletionIntegers w.1 hw := by + rw [hVbAbs] + ext y + rw [mem_absoluteValueValuationSubring_iff, + mem_absoluteValueCompletionIntegers_iff] + rfl + have hhensAbs : + ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (absoluteValueValuationSubring aC haC).valuation := + henselianValuation_of_complete aC + ((absoluteValueCompleteness_completeSpace_withAbs_iff_complete aC).1 + (AbsoluteValue.completionAbsoluteValue_complete vK)) + haC + have hhens : + ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring + va).valuation := by + rw [hVaAbs] + exact hhensAbs + have hExt : + ∀ y : vK.Completion, + bC (algebraMap vK.Completion w.1.Completion y) = aC y := + AbsoluteValue.completionAbsoluteValue_extends vK w.1 w.2 + have hclosure := + exponentialValuationSubring_eq_integralClosure_of_henselian + va vb + (absoluteValueExponentialValuation_extends + aC bC haC hbC hExt) + hhens + rw [hVa, hVb] at hclosure + rw [← mem_integralClosure_iff] + change x ∈ + (integralClosure + (absoluteValueCompletionIntegers vK hvK) w.1.Completion).toSubring + rw [← hclosure] + exact hx diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/All.lean new file mode 100644 index 0000000000..e1c314d5a3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/All.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.IdeleSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Localization +/-! +# Integral support for relative adelic tensor products + +Public aggregate for the lattice, localization, local tensor decomposition, +and finite-support results controlling integral relative ideles. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/FinitePlaceCompletion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/FinitePlaceCompletion.lean new file mode 100644 index 0000000000..5afc147664 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/FinitePlaceCompletion.lean @@ -0,0 +1,361 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice +/-! +# Finite-place completion maps for relative tensor factors + +This module compares the absolute-value and adic-completion models at finite +places and records how the resulting maps preserve norms and integrality. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct NNReal +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations + +universe u v + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +/-- The canonical dense map from the absolute-value model at a finite +place to mathlib's adic-completion model, universe-polymorphic in the +number field. -/ +noncomputable def relativeFinitePlaceCompletionBaseMap + (w : HeightOneSpectrum (𝓞 K)) : + WithAbs (NumberField.HeightOneSpectrum.adicAbv K w) →+* + w.adicCompletion K := + (FinitePlace.embedding w).comp + (WithAbs.equiv + (NumberField.HeightOneSpectrum.adicAbv K w)).toRingHom + +/-- These lemmas record the canonical map and equivalence interfaces for the finite-place model. -/ +@[simp] +theorem relativeFinitePlaceCompletionBaseMap_apply + (w : HeightOneSpectrum (𝓞 K)) + (x : WithAbs + (NumberField.HeightOneSpectrum.adicAbv K w)) : + relativeFinitePlaceCompletionBaseMap w x = + FinitePlace.embedding w + (WithAbs.equiv + (NumberField.HeightOneSpectrum.adicAbv K w) x) := + rfl + +/-- The canonical finite-place map preserves norms. -/ +theorem relativeFinitePlaceCompletionBaseMap_norm + (w : HeightOneSpectrum (𝓞 K)) + (x : WithAbs + (NumberField.HeightOneSpectrum.adicAbv K w)) : + ‖relativeFinitePlaceCompletionBaseMap w x‖ = ‖x‖ := by + rw [relativeFinitePlaceCompletionBaseMap_apply, + FinitePlace.norm_embedding] + rfl + +/-- The canonical finite-place map is an isometry. -/ +theorem relativeFinitePlaceCompletionBaseMap_isometry + (w : HeightOneSpectrum (𝓞 K)) : + Isometry (relativeFinitePlaceCompletionBaseMap w) := + AddMonoidHomClass.isometry_of_norm _ + (relativeFinitePlaceCompletionBaseMap_norm w) + +/-- Extension of the preceding dense map to the completion. -/ +noncomputable def relativeFinitePlaceCompletionRingHom + (w : HeightOneSpectrum (𝓞 K)) : + (NumberField.HeightOneSpectrum.adicAbv K w).Completion →+* + w.adicCompletion K := + UniformSpace.Completion.extensionHom + (relativeFinitePlaceCompletionBaseMap w) + (relativeFinitePlaceCompletionBaseMap_isometry w).continuous + +/-- Coercion, isometry, and surjectivity facts for the canonical ring homomorphism. -/ +@[simp] +theorem relativeFinitePlaceCompletionRingHom_coe + (w : HeightOneSpectrum (𝓞 K)) + (x : WithAbs + (NumberField.HeightOneSpectrum.adicAbv K w)) : + relativeFinitePlaceCompletionRingHom w + (x : + (NumberField.HeightOneSpectrum.adicAbv K w).Completion) = + relativeFinitePlaceCompletionBaseMap w x := + UniformSpace.Completion.extensionHom_coe + (relativeFinitePlaceCompletionBaseMap w) + (relativeFinitePlaceCompletionBaseMap_isometry w).continuous x + +/-- The canonical finite-place ring homomorphism is an isometry. -/ +theorem relativeFinitePlaceCompletionRingHom_isometry + (w : HeightOneSpectrum (𝓞 K)) : + Isometry (relativeFinitePlaceCompletionRingHom w) := + (relativeFinitePlaceCompletionBaseMap_isometry w).completion_extension + +/-- The canonical finite-place ring homomorphism is surjective. -/ +theorem relativeFinitePlaceCompletionRingHom_surjective + (w : HeightOneSpectrum (𝓞 K)) : + Function.Surjective + (relativeFinitePlaceCompletionRingHom w) := by + let f := relativeFinitePlaceCompletionRingHom w + have hrangeClosed : IsClosed (Set.range f) := + (relativeFinitePlaceCompletionRingHom_isometry w).isClosedEmbedding.isClosed_range + have hdense : + DenseRange (algebraMap K (w.adicCompletion K)) := + w.denseRange_algebraMap K + have hrange : + Set.range (algebraMap K (w.adicCompletion K)) ⊆ + Set.range f := by + rintro _ ⟨x, rfl⟩ + let x' : WithAbs + (NumberField.HeightOneSpectrum.adicAbv K w) := + (WithAbs.equiv + (NumberField.HeightOneSpectrum.adicAbv K w)).symm x + refine + ⟨(x' : + (NumberField.HeightOneSpectrum.adicAbv K w).Completion), + ?_⟩ + rw [relativeFinitePlaceCompletionRingHom_coe] + rfl + intro x + have hx : + x ∈ closure + (Set.range (algebraMap K (w.adicCompletion K))) := by + rw [hdense.closure_range] + trivial + exact closure_minimal hrange hrangeClosed hx + +/-- Canonical ring equivalence between the two models of `K_w`. -/ +noncomputable def relativeFinitePlaceCompletionRingEquiv + (w : HeightOneSpectrum (𝓞 K)) : + (NumberField.HeightOneSpectrum.adicAbv K w).Completion ≃+* + w.adicCompletion K := + RingEquiv.ofBijective + (relativeFinitePlaceCompletionRingHom w) + ⟨(relativeFinitePlaceCompletionRingHom_isometry w).injective, + relativeFinitePlaceCompletionRingHom_surjective w⟩ + +/-- The same comparison as a `K`-algebra equivalence. -/ +noncomputable def relativeFinitePlaceCompletionAlgEquiv + (w : HeightOneSpectrum (𝓞 K)) : + (NumberField.HeightOneSpectrum.adicAbv K w).Completion ≃ₐ[K] + w.adicCompletion K where + __ := relativeFinitePlaceCompletionRingEquiv w + commutes' x := by + change + relativeFinitePlaceCompletionRingHom w + (((WithAbs.equiv + (NumberField.HeightOneSpectrum.adicAbv K w)).symm x : + WithAbs + (NumberField.HeightOneSpectrum.adicAbv K w)) : + (NumberField.HeightOneSpectrum.adicAbv K w).Completion) = + algebraMap K (w.adicCompletion K) x + rw [relativeFinitePlaceCompletionRingHom_coe] + rfl + +/-- Base change in the first tensor factor, now without a universe +restriction. -/ +noncomputable def relativeFinitePlaceLocalTensorAlgEquiv + (w : HeightOneSpectrum (𝓞 K)) : + (NumberField.HeightOneSpectrum.adicAbv K w).Completion ⊗[K] L + ≃ₐ[K] + w.adicCompletion K ⊗[K] L := + Algebra.TensorProduct.congr + (relativeFinitePlaceCompletionAlgEquiv w) + (AlgEquiv.refl : L ≃ₐ[K] L) + +/-- Membership in the concrete finite-place valuation ring implies the +usual norm bound. -/ +theorem norm_le_one_of_mem_adicCompletionIntegers + (w : HeightOneSpectrum (𝓞 K)) + {x : w.adicCompletion K} + (hx : x ∈ w.adicCompletionIntegers K) : + ‖x‖ ≤ 1 := by + rw [FinitePlace.norm_def] + exact_mod_cast + (WithZeroMulInt.toNNReal_le_one_iff + (NumberField.HeightOneSpectrum.one_lt_absNorm_nnreal w)).2 hx + +/-- The concrete adic completion integers are exactly the elements of +norm at most one. -/ +theorem mem_adicCompletionIntegers_of_norm_le_one + (w : HeightOneSpectrum (𝓞 K)) + {x : w.adicCompletion K} + (hx : ‖x‖ ≤ 1) : + x ∈ w.adicCompletionIntegers K := by + rw [FinitePlace.norm_def] at hx + exact_mod_cast + (WithZeroMulInt.toNNReal_le_one_iff + (NumberField.HeightOneSpectrum.one_lt_absNorm_nnreal w)).1 hx + +/-- The inverse of the universe-polymorphic completion comparison is +also an isometry. -/ +theorem relativeFinitePlaceCompletionAlgEquiv_symm_norm + (w : HeightOneSpectrum (𝓞 K)) + (x : w.adicCompletion K) : + ‖(relativeFinitePlaceCompletionAlgEquiv w).symm x‖ = + ‖x‖ := by + let y := + (relativeFinitePlaceCompletionAlgEquiv w).symm x + have h := + (relativeFinitePlaceCompletionRingHom_isometry w).norm_map_of_map_zero + (map_zero + (relativeFinitePlaceCompletionRingHom w)) y + have hy : + relativeFinitePlaceCompletionRingHom w y = x := by + change + relativeFinitePlaceCompletionAlgEquiv w y = x + exact + (relativeFinitePlaceCompletionAlgEquiv w).apply_symm_apply x + rw [hy] at h + exact h.symm + +/-- Cramer's rule over an integrally closed base: coordinates are +integral once the trace matrix, the trace vector, and the inverse +discriminant are integral. -/ +theorem basis_coord_isIntegral_of_integral_traces + {R A B ι : Type*} + [CommRing R] [Field A] [CommRing B] + [Algebra R A] [Algebra A B] + [Fintype ι] [DecidableEq ι] + (b : Module.Basis ι A B) + {x : B} + (hM : ∀ j k, IsIntegral R + (Algebra.trace A B (b j * b k))) + (ht : ∀ j, IsIntegral R + (Algebra.trace A B (x * b j))) + (hdiscInv : IsIntegral R (Algebra.discr A b)⁻¹) + (hdiscne : Algebra.discr A b ≠ 0) + (i : ι) : + IsIntegral R (b.equivFun x i) := by + let M : Matrix ι ι A := Algebra.traceMatrix A b + let c : ι → A := b.equivFun x + let t : ι → A := fun j => Algebra.trace A B (x * b j) + have hM' : ∀ j k, IsIntegral R (M j k) := by + intro j k + exact hM j k + have ht' : ∀ j, IsIntegral R (t j) := by + intro j + exact ht j + have hcramer : IsIntegral R (M.cramer t i) := by + rw [Matrix.cramer_apply] + apply IsIntegral.det + intro j k + by_cases hki : k = i + · simpa [Matrix.updateCol_apply, hki] using ht' j + · simpa [Matrix.updateCol_apply, hki] using hM' j k + have hmul : M.mulVec c = t := + Algebra.traceMatrix_of_basis_mulVec b x + have hcramerEq : M.det • c = M.cramer t := by + rw [Matrix.cramer_eq_adjugate_mulVec, ← hmul, + Matrix.mulVec_mulVec, Matrix.adjugate_mul, + Matrix.smul_mulVec, Matrix.one_mulVec] + have hcoord : + Algebra.discr A b * c i = M.cramer t i := by + have hi := congrFun hcramerEq i + simpa [M, Algebra.discr_def, Pi.smul_apply] using hi + have hcEq : + c i = (Algebra.discr A b)⁻¹ * M.cramer t i := by + rw [← hcoord, ← mul_assoc, inv_mul_cancel₀ hdiscne, one_mul] + change IsIntegral R (c i) + rw [hcEq] + exact hdiscInv.mul hcramer + +omit [NumberField L] in +/-- The trace matrix of the tensor-product basis is obtained from the +original trace matrix by scalar extension. -/ +theorem trace_tensorProduct_basis_mul + {ι : Type*} + (b : Module.Basis ι K L) + (A : Type*) [Field A] [Algebra K A] + (i j : ι) : + Algebra.trace A (A ⊗[K] L) + ((Algebra.TensorProduct.basis A b i) * + (Algebra.TensorProduct.basis A b j)) = + algebraMap K A (Algebra.trace K L (b i * b j)) := by + simp only [Algebra.TensorProduct.basis_apply, + Algebra.TensorProduct.tmul_mul_tmul, one_mul] + change LinearMap.trace A (A ⊗[K] L) + (Algebra.lmul A (A ⊗[K] L) (1 ⊗ₜ[K] (b i * b j))) = + _ + rw [← Algebra.baseChange_lmul] + exact LinearMap.trace_baseChange (Algebra.lmul K L (b i * b j)) A + +omit [NumberField L] in +/-- Discriminants of tensor-product bases commute with scalar +extension. -/ +theorem discr_tensorProduct_basis + {ι : Type*} [Fintype ι] [DecidableEq ι] + (b : Module.Basis ι K L) + (A : Type*) [Field A] [Algebra K A] : + Algebra.discr A (Algebra.TensorProduct.basis A b) = + algebraMap K A (Algebra.discr K b) := by + rw [Algebra.discr_def, Algebra.discr_def] + rw [(algebraMap K A).map_det] + congr 1 + ext i j + exact trace_tensorProduct_basis_mul b A i j + +omit [NumberField K] [NumberField L] in +/-- Trace in the canonical local tensor algebra preserves integrality +when all completed-field components are integral. -/ +theorem isIntegral_trace_tensor_of_components + [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) + (hvK : IsNonarchimedean (vK : K → ℝ)) + (hvK0 : vK.IsNontrivial) + (x : vK.Completion ⊗[K] L) + (hx : ∀ w : AbsoluteValueExtension vK L, + completionTensorDecompositionLeft + (K := K) (L := L) vK hvK0 x w ∈ + absoluteValueCompletionIntegers w.1 + (absoluteValueExtension_isNonarchimedean vK hvK w)) : + IsIntegral (absoluteValueCompletionIntegers vK hvK) + (Algebra.trace vK.Completion + (vK.Completion ⊗[K] L) x) := by + classical + let : Fintype (AbsoluteValueExtension vK L) := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK0 + let : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w => AbsoluteValue.completionAlgebra vK w.1 w.2 + let : ∀ w : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w.1.Completion := + fun w => completionModuleFinite vK hvK0 w + let : ∀ w : AbsoluteValueExtension vK L, + Module.Free vK.Completion w.1.Completion := + fun w => Module.Free.of_divisionRing + vK.Completion w.1.Completion + let y : + ∀ w : AbsoluteValueExtension vK L, w.1.Completion := + completionTensorDecompositionLeft + (K := K) (L := L) vK hvK0 x + have hy : + ∀ w : AbsoluteValueExtension vK L, + IsIntegral (absoluteValueCompletionIntegers vK hvK) (y w) := by + intro w + exact isIntegral_over_baseCompletionIntegers_of_mem + (K := K) (L := L) vK hvK hvK0 w (hx w) + have hsum : + IsIntegral (absoluteValueCompletionIntegers vK hvK) + (∑ w : AbsoluteValueExtension vK L, + Algebra.trace vK.Completion w.1.Completion (y w)) := by + apply IsIntegral.sum + intro w _ + exact Algebra.isIntegral_trace (hy w) + rw [← ValuationTheory.Completion.algebra_trace_pi_apply + (fun w : AbsoluteValueExtension vK L => w.1.Completion) y] at hsum + rw [Algebra.trace_eq_of_algEquiv + (completionTensorDecompositionLeft + (K := K) (L := L) vK hvK0) x] at hsum + exact hsum diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/IdeleSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/IdeleSupport.lean new file mode 100644 index 0000000000..f460295d5f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/IdeleSupport.lean @@ -0,0 +1,83 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition +/-! +# Finite support for integral relative ideles + +This module combines coefficient support with the exceptional places of the +local tensor decomposition, producing one finite set that controls integrality +of a relative idele and its inverse. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct NNReal +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations + +universe u v + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +/-- The single finite support controlling both coefficient integrality +of a relative idele and the integral compatibility of the local tensor decomposition. -/ +noncomputable def relativeIdeleLocalTensorDecompositionSupport + (z : RelativeIdeleGroup K L) : + Finset (HeightOneSpectrum (𝓞 K)) := by + classical + exact + relativeIdeleCoefficientSupport + (K := K) (L := L) z ∪ + integralTensorBadPlaces + (K := K) (L := L) + +/-- The support is exposed through this membership characterization. -/ +@[simp] +theorem mem_relativeIdeleLocalTensorDecompositionSupport_iff + (z : RelativeIdeleGroup K L) + (w : HeightOneSpectrum (𝓞 K)) : + w ∈ relativeIdeleLocalTensorDecompositionSupport + (K := K) (L := L) z ↔ + w ∈ relativeIdeleCoefficientSupport + (K := K) (L := L) z ∨ + w ∈ integralTensorBadPlaces + (K := K) (L := L) := by + simp [relativeIdeleLocalTensorDecompositionSupport] + +/-- Outside one explicit finite support, the actual finite component of +a relative idele and its inverse are units in every valuation-ring +factor of the local tensor decomposition. -/ +theorem relativeIdele_finiteComponent_localTensorDecompositionIntegralUnit_of_notMem + (z : RelativeIdeleGroup K L) + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ relativeIdeleLocalTensorDecompositionSupport + (K := K) (L := L) z) : + RelativeLocalTensorDecompositionIntegralUnitAt + (K := K) (L := L) w + (RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w z) := by + have hsep : + w ∉ relativeIdeleCoefficientSupport + (K := K) (L := L) z ∧ + w ∉ integralTensorBadPlaces + (K := K) (L := L) := by + simpa [relativeIdeleLocalTensorDecompositionSupport] using hw + exact + relativeBasisIntegralUnitAt_imp_localTensorDecompositionIntegralUnit_of_notMem + (K := K) (L := L) w hsep.2 + (relativeIdele_finiteComponent_basisIntegralUnit_of_notMem + (K := K) (L := L) z w hsep.1) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Lattice.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Lattice.lean new file mode 100644 index 0000000000..60a289610f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Lattice.lean @@ -0,0 +1,561 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue +/-! +# Integral lattices in relative tensor coordinates + +This module chooses a common integral scale for a field basis, constructs the +associated integer lattice, and isolates the finite set of primes where its +local integrality properties can fail. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct NNReal +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations + +universe u v + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +omit [NumberField K] in +/-- One common nonzero integer scales every vector of the chosen +`K`-basis into the ring of integers of `L`. -/ +theorem exists_integral_relativeBasis_scale : + ∃ d : ℤ, d ≠ 0 ∧ + ∀ i : RelativeAdeleBasisIndex (K := K) (L := L), + IsIntegral ℤ + (d • relativeExtensionBasis + (K := K) (L := L) i) := by + classical + let : Algebra.IsAlgebraic ℤ L := + (IsFractionRing.isAlgebraic_iff' ℤ (𝓞 L) L).mp + inferInstance + let s : Finset L := + Finset.univ.image fun i : + RelativeAdeleBasisIndex (K := K) (L := L) => + relativeExtensionBasis (K := K) (L := L) i + obtain ⟨d, hd, hint⟩ := + Algebra.IsAlgebraic.exists_integral_multiples ℤ s + refine ⟨d, hd, ?_⟩ + intro i + exact + hint + (relativeExtensionBasis (K := K) (L := L) i) + (Finset.mem_image.mpr + ⟨i, Finset.mem_univ i, rfl⟩) + +/-- The chosen common integral scale. -/ +noncomputable def chosenRelativeBasisIntegralScale : ℤ := + Classical.choose + (exists_integral_relativeBasis_scale + (K := K) (L := L)) + +omit [NumberField K] in +/-- The chosen integral scale is nonzero. -/ +theorem chosenRelativeBasisIntegralScale_ne_zero : + chosenRelativeBasisIntegralScale (K := K) (L := L) ≠ 0 := + (Classical.choose_spec + (exists_integral_relativeBasis_scale + (K := K) (L := L))).1 + +omit [NumberField K] in +/-- The chosen integral scale is integral in the base field. -/ +theorem chosenRelativeBasisIntegralScale_isIntegral + (i : RelativeAdeleBasisIndex (K := K) (L := L)) : + IsIntegral ℤ + (chosenRelativeBasisIntegralScale (K := K) (L := L) • + relativeExtensionBasis (K := K) (L := L) i) := + (Classical.choose_spec + (exists_integral_relativeBasis_scale + (K := K) (L := L))).2 i + +/-- The integral scale viewed in the base field. -/ +noncomputable def relativeBasisIntegralScaleInK : K := + algebraMap ℤ K + (chosenRelativeBasisIntegralScale (K := K) (L := L)) + +/-- The base-field coercion of the chosen integral scale is nonzero. -/ +theorem relativeBasisIntegralScaleInK_ne_zero : + relativeBasisIntegralScaleInK (K := K) (L := L) ≠ 0 := by + intro h + have hc : + (chosenRelativeBasisIntegralScale + (K := K) (L := L) : K) = + ((0 : ℤ) : K) := by + simpa [relativeBasisIntegralScaleInK] using h + exact + chosenRelativeBasisIntegralScale_ne_zero + (K := K) (L := L) + (Int.cast_injective hc) + +/-- The integral scale as a unit of `K`. -/ +noncomputable def relativeBasisIntegralScaleUnit : Kˣ := + Units.mk0 + (relativeBasisIntegralScaleInK (K := K) (L := L)) + (relativeBasisIntegralScaleInK_ne_zero + (K := K) (L := L)) + +/-- The chosen basis after multiplying every vector by the common +integral scale. -/ +noncomputable def scaledRelativeExtensionBasis : + Module.Basis + (RelativeAdeleBasisIndex (K := K) (L := L)) K L := + (relativeExtensionBasis (K := K) (L := L)).unitsSMul + fun _ => relativeBasisIntegralScaleUnit + (K := K) (L := L) + +/-- Evaluation and integrality properties of the scaled relative basis. -/ +@[simp] +theorem scaledRelativeExtensionBasis_apply + (i : RelativeAdeleBasisIndex (K := K) (L := L)) : + scaledRelativeExtensionBasis (K := K) (L := L) i = + relativeBasisIntegralScaleInK + (K := K) (L := L) • + relativeExtensionBasis (K := K) (L := L) i := by + rw [scaledRelativeExtensionBasis, + Module.Basis.unitsSMul_apply] + rfl + +/-- Every vector of the scaled relative basis is integral. -/ +theorem scaledRelativeExtensionBasis_isIntegral + (i : RelativeAdeleBasisIndex (K := K) (L := L)) : + IsIntegral ℤ + (scaledRelativeExtensionBasis + (K := K) (L := L) i) := by + simpa [scaledRelativeExtensionBasis_apply, + relativeBasisIntegralScaleInK, Algebra.smul_def] using + chosenRelativeBasisIntegralScale_isIntegral + (K := K) (L := L) i + +/-- Every scaled basis vector belongs to the valuation ring of every +nonarchimedean extension of an absolute value of `K`. -/ +theorem scaledRelativeExtensionBasis_absoluteValue_le_one + (vK : AbsoluteValue K ℝ) + (hvK : IsNonarchimedean (vK : K → ℝ)) + (wL : AbsoluteValueExtension vK L) + (i : RelativeAdeleBasisIndex (K := K) (L := L)) : + wL.1 + (scaledRelativeExtensionBasis + (K := K) (L := L) i) ≤ 1 := + absoluteValue_le_one_of_isIntegral + wL.1 + (absoluteValueExtension_isNonarchimedean + vK hvK wL) + (scaledRelativeExtensionBasis_isIntegral + (K := K) (L := L) i) + +/-- The scaled basis vector as an actual element of `𝓞 L`. -/ +noncomputable def scaledRelativeExtensionInteger + (i : RelativeAdeleBasisIndex (K := K) (L := L)) : + 𝓞 L := + ⟨scaledRelativeExtensionBasis (K := K) (L := L) i, + scaledRelativeExtensionBasis_isIntegral + (K := K) (L := L) i⟩ + +/-- The named scaled integer is the corresponding scaled basis vector. -/ +@[simp] +theorem scaledRelativeExtensionInteger_coe + (i : RelativeAdeleBasisIndex (K := K) (L := L)) : + (scaledRelativeExtensionInteger + (K := K) (L := L) i : L) = + scaledRelativeExtensionBasis (K := K) (L := L) i := + rfl + +/-- The `𝓞 K`-lattice in `𝓞 L` generated by the scaled basis. -/ +noncomputable def scaledRelativeIntegerLattice : + Submodule (𝓞 K) (𝓞 L) := + Submodule.span (𝓞 K) + (Set.range + (scaledRelativeExtensionInteger + (K := K) (L := L))) + +/-- The same scaled lattice, viewed inside the field `L`. -/ +noncomputable def scaledRelativeFieldLattice : + Submodule (𝓞 K) L := + Submodule.span (𝓞 K) + (Set.range + (scaledRelativeExtensionBasis + (K := K) (L := L))) + +/-- The canonical `𝓞 K`-linear inclusion `𝓞 L → L`. -/ +noncomputable def ringOfIntegersToFieldLinearMap : + 𝓞 L →ₗ[𝓞 K] L := + (IsScalarTower.toAlgHom (𝓞 K) (𝓞 L) L).toLinearMap + +/-- Mapping the integral lattice into `L` gives the field-valued +lattice spanned by the scaled basis. -/ +theorem scaledRelativeIntegerLattice_map_toField : + (scaledRelativeIntegerLattice + (K := K) (L := L)).map + (ringOfIntegersToFieldLinearMap + (K := K) (L := L)) = + scaledRelativeFieldLattice + (K := K) (L := L) := by + rw [scaledRelativeIntegerLattice, + scaledRelativeFieldLattice, + Submodule.map_span] + congr 1 + exact + (Set.range_comp + (ringOfIntegersToFieldLinearMap (K := K) (L := L)) + (scaledRelativeExtensionInteger (K := K) (L := L))).symm + +omit [NumberField K] [NumberField L] [FiniteDimensional K L] in +/-- The inclusion `𝓞 L → L` used above is injective. -/ +theorem ringOfIntegersToFieldLinearMap_injective : + Function.Injective + (ringOfIntegersToFieldLinearMap + (K := K) (L := L)) := by + intro x y h + exact NumberField.RingOfIntegers.ext h + +/-- Every algebraic integer becomes a member of the scaled lattice +after multiplication by some non-zero-divisor of `𝓞 K`. This is the +direct denominator-clearing statement behind torsion of the lattice +quotient. -/ +theorem exists_nonZeroDivisor_smul_mem_scaledRelativeIntegerLattice + (x : 𝓞 L) : + ∃ d : nonZeroDivisors (𝓞 K), + (d : 𝓞 K) • x ∈ + scaledRelativeIntegerLattice + (K := K) (L := L) := by + let s : Set L := + Set.range + (scaledRelativeExtensionBasis + (K := K) (L := L)) + have hx : + (x : L) ∈ Submodule.span K s := by + change + (x : L) ∈ + Submodule.span K + (Set.range + (scaledRelativeExtensionBasis + (K := K) (L := L))) + rw [(scaledRelativeExtensionBasis + (K := K) (L := L)).span_eq] + exact Submodule.mem_top + obtain ⟨d, hd⟩ := + multiple_mem_span_of_mem_localization_span + (nonZeroDivisors (𝓞 K)) K s (x : L) hx + refine ⟨d, ?_⟩ + have hdmap : + d • (x : L) ∈ + (scaledRelativeIntegerLattice + (K := K) (L := L)).map + (ringOfIntegersToFieldLinearMap + (K := K) (L := L)) := by + rw [scaledRelativeIntegerLattice_map_toField + (K := K) (L := L)] + exact hd + obtain ⟨y, hy, hyx⟩ := hdmap + have hyx' : y = (d : 𝓞 K) • x := by + apply ringOfIntegersToFieldLinearMap_injective + (K := K) (L := L) + simpa [ringOfIntegersToFieldLinearMap, + Submonoid.smul_def] using hyx + rw [← hyx'] + exact hy + +/-- The finite quotient measuring the index of the scaled basis +lattice in `𝓞 L`. -/ +abbrev ScaledRelativeIntegerLatticeQuotient := + (𝓞 L) ⧸ + scaledRelativeIntegerLattice + (K := K) (L := L) + +/-- The lattice quotient is finitely generated over `𝓞 K`. -/ +noncomputable instance + scaledRelativeIntegerLatticeQuotientFinite : + Module.Finite (𝓞 K) + (ScaledRelativeIntegerLatticeQuotient + (K := K) (L := L)) := + Module.Finite.quotient (𝓞 K) + (scaledRelativeIntegerLattice + (K := K) (L := L)) + +/-- The lattice quotient is torsion. -/ +theorem scaledRelativeIntegerLatticeQuotient_isTorsion : + Module.IsTorsion (𝓞 K) + (ScaledRelativeIntegerLatticeQuotient + (K := K) (L := L)) := by + intro q + refine + Submodule.Quotient.induction_on + (p := scaledRelativeIntegerLattice + (K := K) (L := L)) q ?_ + intro x + obtain ⟨d, hd⟩ := + exists_nonZeroDivisor_smul_mem_scaledRelativeIntegerLattice + (K := K) (L := L) x + refine ⟨d, ?_⟩ + rw [Submonoid.smul_def, + ← Submodule.Quotient.mk_smul, + Submodule.Quotient.mk_eq_zero] + exact hd + +/-- A chosen nonzero element of the annihilator of the finite lattice +quotient. -/ +noncomputable def chosenScaledRelativeIntegerLatticeAnnihilatorData : + { r : 𝓞 K // + r ∈ + (⊤ : Submodule (𝓞 K) + (ScaledRelativeIntegerLatticeQuotient + (K := K) (L := L))).annihilator ∧ + r ∈ nonZeroDivisors (𝓞 K) } := by + let h := + Submodule.annihilator_top_inter_nonZeroDivisors + (scaledRelativeIntegerLatticeQuotient_isTorsion + (K := K) (L := L)) + exact + ⟨Classical.choose h, + (Classical.choose_spec h).1, + (Classical.choose_spec h).2⟩ + +/-- The chosen annihilator element in `𝓞 K`. -/ +noncomputable def scaledRelativeIntegerLatticeAnnihilator : + 𝓞 K := + (chosenScaledRelativeIntegerLatticeAnnihilatorData + (K := K) (L := L) : 𝓞 K) + +/-- The selected annihilator element lies in the annihilator ideal. -/ +theorem scaledRelativeIntegerLatticeAnnihilator_mem : + scaledRelativeIntegerLatticeAnnihilator + (K := K) (L := L) ∈ + (⊤ : Submodule (𝓞 K) + (ScaledRelativeIntegerLatticeQuotient + (K := K) (L := L))).annihilator := + (chosenScaledRelativeIntegerLatticeAnnihilatorData + (K := K) (L := L)).2.1 + +/-- The selected annihilator element is nonzero. -/ +theorem scaledRelativeIntegerLatticeAnnihilator_ne_zero : + scaledRelativeIntegerLatticeAnnihilator + (K := K) (L := L) ≠ 0 := + nonZeroDivisors.ne_zero + (chosenScaledRelativeIntegerLatticeAnnihilatorData + (K := K) (L := L)).2.2 + +/-- The chosen annihilator uniformly carries all of `𝓞 L` into the +scaled basis lattice. -/ +theorem scaledRelativeIntegerLatticeAnnihilator_smul_mem + (x : 𝓞 L) : + scaledRelativeIntegerLatticeAnnihilator + (K := K) (L := L) • x ∈ + scaledRelativeIntegerLattice + (K := K) (L := L) := by + have hkill : + scaledRelativeIntegerLatticeAnnihilator + (K := K) (L := L) • + Submodule.Quotient.mk x = 0 := + Submodule.mem_annihilator.mp + (scaledRelativeIntegerLatticeAnnihilator_mem + (K := K) (L := L)) + (Submodule.Quotient.mk x) Submodule.mem_top + rw [← Submodule.Quotient.mk_smul, + Submodule.Quotient.mk_eq_zero] at hkill + exact hkill + +/-- The original integral scaling factor, now viewed in `𝓞 K`. -/ +noncomputable def relativeBasisIntegralScaleInRingOfIntegers : + 𝓞 K := + algebraMap ℤ (𝓞 K) + (chosenRelativeBasisIntegralScale (K := K) (L := L)) + +/-- The integral scale remains nonzero in the ring of integers. -/ +theorem relativeBasisIntegralScaleInRingOfIntegers_ne_zero : + relativeBasisIntegralScaleInRingOfIntegers + (K := K) (L := L) ≠ 0 := by + intro h + have hc : + (chosenRelativeBasisIntegralScale + (K := K) (L := L) : 𝓞 K) = + ((0 : ℤ) : 𝓞 K) := by + simpa [relativeBasisIntegralScaleInRingOfIntegers] using h + exact + chosenRelativeBasisIntegralScale_ne_zero + (K := K) (L := L) + (Int.cast_injective hc) + +/-- One nonzero element controlling both the initial basis scaling and +the finite index of the resulting lattice. -/ +noncomputable def integralTensorControlElement : + 𝓞 K := + relativeBasisIntegralScaleInRingOfIntegers + (K := K) (L := L) * + scaledRelativeIntegerLatticeAnnihilator + (K := K) (L := L) + +/-- The tensor control element is nonzero. -/ +theorem integralTensorControlElement_ne_zero : + integralTensorControlElement + (K := K) (L := L) ≠ 0 := + mul_ne_zero + (relativeBasisIntegralScaleInRingOfIntegers_ne_zero + (K := K) (L := L)) + (scaledRelativeIntegerLatticeAnnihilator_ne_zero + (K := K) (L := L)) + +/-- The nonzero principal ideal defining the bad primes. -/ +noncomputable def integralTensorControlIdeal : + Ideal (𝓞 K) := + Ideal.span + ({integralTensorControlElement + (K := K) (L := L)} : Set (𝓞 K)) + +/-- The tensor control ideal is nontrivial. -/ +theorem integralTensorControlIdeal_ne_bot : + integralTensorControlIdeal + (K := K) (L := L) ≠ ⊥ := by + rw [integralTensorControlIdeal, + ne_eq, Ideal.span_singleton_eq_bot] + exact integralTensorControlElement_ne_zero + (K := K) (L := L) + +/-- The actual finite set of primes at which either the basis scaling +or the lattice index can fail to be invertible. -/ +noncomputable def integralTensorBadPlaces : + Finset (HeightOneSpectrum (𝓞 K)) := + (Ideal.finite_factors + (integralTensorControlIdeal_ne_bot + (K := K) (L := L))).toFinset + +/-- Membership in the finite bad-place set is ideal membership. -/ +@[simp] +theorem mem_integralTensorBadPlaces_iff + (w : HeightOneSpectrum (𝓞 K)) : + w ∈ integralTensorBadPlaces + (K := K) (L := L) ↔ + w.asIdeal ∣ + integralTensorControlIdeal + (K := K) (L := L) := + Set.Finite.mem_toFinset + (Ideal.finite_factors + (integralTensorControlIdeal_ne_bot + (K := K) (L := L))) + +/-- Outside the bad set the common control element is not in the +corresponding height-one prime. -/ +theorem integralTensorControlElement_not_mem_of_notMem + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ integralTensorBadPlaces + (K := K) (L := L)) : + integralTensorControlElement + (K := K) (L := L) ∉ w.asIdeal := by + intro hmem + apply hw + rw [mem_integralTensorBadPlaces_iff, + integralTensorControlIdeal, + Ideal.dvd_span_singleton] + exact hmem + +/-- The annihilator alone is invertible away from the bad set. -/ +theorem scaledRelativeIntegerLatticeAnnihilator_not_mem_of_notMem + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ integralTensorBadPlaces + (K := K) (L := L)) : + scaledRelativeIntegerLatticeAnnihilator + (K := K) (L := L) ∉ w.asIdeal := by + intro hmem + exact + integralTensorControlElement_not_mem_of_notMem + (K := K) (L := L) w hw + (w.asIdeal.mul_mem_left + (relativeBasisIntegralScaleInRingOfIntegers + (K := K) (L := L)) hmem) + +/-- The initial integer scale is also invertible away from the bad +set. -/ +theorem relativeBasisIntegralScale_not_mem_of_notMem + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ integralTensorBadPlaces + (K := K) (L := L)) : + relativeBasisIntegralScaleInRingOfIntegers + (K := K) (L := L) ∉ w.asIdeal := by + intro hmem + exact + integralTensorControlElement_not_mem_of_notMem + (K := K) (L := L) w hw + (w.asIdeal.mul_mem_right + (scaledRelativeIntegerLatticeAnnihilator + (K := K) (L := L)) hmem) + +/-- Away from the bad set, the original (unscaled) relative basis is +integral for every extension of the corresponding finite absolute +value to `L`. -/ +theorem relativeExtensionBasis_absoluteValue_le_one_of_notMem + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ integralTensorBadPlaces + (K := K) (L := L)) + (wL : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K w) L) + (i : RelativeAdeleBasisIndex (K := K) (L := L)) : + wL.1 + (relativeExtensionBasis + (K := K) (L := L) i) ≤ 1 := by + let vK := + NumberField.HeightOneSpectrum.adicAbv K w + have hdnot : + relativeBasisIntegralScaleInRingOfIntegers + (K := K) (L := L) ∉ w.asIdeal := + relativeBasisIntegralScale_not_mem_of_notMem + (K := K) (L := L) w hw + have hnorm : + ‖FinitePlace.embedding w + (algebraMap (𝓞 K) K + (relativeBasisIntegralScaleInRingOfIntegers + (K := K) (L := L)))‖ = 1 := + (FinitePlace.norm_eq_one_iff_notMem + (R := 𝓞 K) K w + (relativeBasisIntegralScaleInRingOfIntegers + (K := K) (L := L))).2 hdnot + have hvscaleInteger : + vK + (algebraMap (𝓞 K) K + (relativeBasisIntegralScaleInRingOfIntegers + (K := K) (L := L))) = 1 := by + simpa [vK, FinitePlace.norm_embedding] using hnorm + have hscaleField : + relativeBasisIntegralScaleInK + (K := K) (L := L) = + algebraMap (𝓞 K) K + (relativeBasisIntegralScaleInRingOfIntegers + (K := K) (L := L)) := by + simp [relativeBasisIntegralScaleInK, + relativeBasisIntegralScaleInRingOfIntegers] + have hvscale : + vK + (relativeBasisIntegralScaleInK + (K := K) (L := L)) = 1 := by + rw [hscaleField] + exact hvscaleInteger + have hwscale : + wL.1 + (algebraMap K L + (relativeBasisIntegralScaleInK + (K := K) (L := L))) = 1 := by + rw [wL.2] + exact hvscale + have hscaled := + scaledRelativeExtensionBasis_absoluteValue_le_one + (K := K) (L := L) vK + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv + K w) wL i + rw [scaledRelativeExtensionBasis_apply, + Algebra.smul_def, map_mul, hwscale, one_mul] at hscaled + exact hscaled diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/LocalTensorDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/LocalTensorDecomposition.lean new file mode 100644 index 0000000000..6fcfdccc44 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/LocalTensorDecomposition.lean @@ -0,0 +1,724 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion +/-! +# Integral comparison for local tensor decompositions + +This module identifies integrality and units in a finite-place tensor factor +with the corresponding componentwise conditions in the completions above that +place. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct NNReal +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations + +universe u v + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +section LocalTensorDecompositionIntegralComparison + +/-- The component of the concrete finite tensor factor in a completion +above `w`, obtained from the canonical local tensor equivalence. -/ +noncomputable def finitePlaceLocalTensorDecompositionComponent + (w : HeightOneSpectrum (𝓞 K)) + (wL : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K w) L) + (x : w.adicCompletion K ⊗[K] L) : + wL.1.Completion := by + let vK := + NumberField.HeightOneSpectrum.adicAbv K w + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial w + letI : ∀ u : AbsoluteValueExtension vK L, + Algebra vK.Completion u.1.Completion := + fun u => + AbsoluteValue.completionAlgebra vK u.1 u.2 + exact + completionTensorDecompositionLeft + (K := K) (L := L) vK hvK + ((relativeFinitePlaceLocalTensorAlgEquiv + (K := K) (L := L) w).symm x) wL + +/-- Integrality in the actual product of completion valuation rings +on the local tensor-product side. -/ +def RelativeLocalTensorDecompositionIntegralAt + (w : HeightOneSpectrum (𝓞 K)) + (x : w.adicCompletion K ⊗[K] L) : Prop := + ∀ wL : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K w) L, + finitePlaceLocalTensorDecompositionComponent + (K := K) (L := L) w wL x ∈ + absoluteValueCompletionIntegers wL.1 + (absoluteValueExtension_isNonarchimedean + (NumberField.HeightOneSpectrum.adicAbv K w) + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv + K w) wL) + +/-- A tensor unit is valuation-integral when every completion +component of it and of its inverse is in the corresponding valuation +ring. -/ +def RelativeLocalTensorDecompositionIntegralUnitAt + (w : HeightOneSpectrum (𝓞 K)) + (x : (w.adicCompletion K ⊗[K] L)ˣ) : Prop := + RelativeLocalTensorDecompositionIntegralAt + (K := K) (L := L) w + (x : w.adicCompletion K ⊗[K] L) ∧ + RelativeLocalTensorDecompositionIntegralAt + (K := K) (L := L) w + ((x⁻¹ : (w.adicCompletion K ⊗[K] L)ˣ) : + w.adicCompletion K ⊗[K] L) + +/-- The discriminant of the globally integral scaled relative basis, +viewed as an algebraic integer of the base field. -/ +noncomputable def scaledRelativeBasisDiscriminantInteger : + 𝓞 K := + ⟨Algebra.discr K + (scaledRelativeExtensionBasis (K := K) (L := L)), + Algebra.discr_isIntegral K fun i => + scaledRelativeExtensionBasis_isIntegral + (K := K) (L := L) i⟩ + +/-- Coercion and nonvanishing properties of the discriminant control element. -/ +@[simp] +theorem scaledRelativeBasisDiscriminantInteger_coe : + (scaledRelativeBasisDiscriminantInteger + (K := K) (L := L) : K) = + Algebra.discr K + (scaledRelativeExtensionBasis (K := K) (L := L)) := + rfl + +/-- The discriminant control integer is nonzero. -/ +theorem scaledRelativeBasisDiscriminantInteger_ne_zero : + scaledRelativeBasisDiscriminantInteger + (K := K) (L := L) ≠ 0 := by + intro h + apply Algebra.discr_not_zero_of_basis K + (scaledRelativeExtensionBasis (K := K) (L := L)) + exact congrArg (fun x : 𝓞 K => (x : K)) h + +/-- The principal discriminant ideal of the scaled relative basis. -/ +noncomputable def scaledRelativeBasisDiscriminantIdeal : + Ideal (𝓞 K) := + Ideal.span + ({scaledRelativeBasisDiscriminantInteger + (K := K) (L := L)} : Set (𝓞 K)) + +/-- The discriminant control ideal is nontrivial. -/ +theorem scaledRelativeBasisDiscriminantIdeal_ne_bot : + scaledRelativeBasisDiscriminantIdeal + (K := K) (L := L) ≠ ⊥ := by + rw [scaledRelativeBasisDiscriminantIdeal, + ne_eq, Ideal.span_singleton_eq_bot] + exact scaledRelativeBasisDiscriminantInteger_ne_zero + (K := K) (L := L) + +/-- Finite set of places at which the scaled relative basis has +nonunit discriminant. -/ +noncomputable def scaledRelativeBasisDiscriminantBadPlaces : + Finset (HeightOneSpectrum (𝓞 K)) := + (Ideal.finite_factors + (scaledRelativeBasisDiscriminantIdeal_ne_bot + (K := K) (L := L))).toFinset + +/-- Membership in the discriminant bad-place set is ideal membership. -/ +@[simp] +theorem mem_scaledRelativeBasisDiscriminantBadPlaces_iff + (w : HeightOneSpectrum (𝓞 K)) : + w ∈ scaledRelativeBasisDiscriminantBadPlaces + (K := K) (L := L) ↔ + w.asIdeal ∣ + scaledRelativeBasisDiscriminantIdeal + (K := K) (L := L) := + Set.Finite.mem_toFinset + (Ideal.finite_factors + (scaledRelativeBasisDiscriminantIdeal_ne_bot + (K := K) (L := L))) + +/-- Outside the discriminant bad places, the control integer avoids the prime. -/ +theorem scaledRelativeBasisDiscriminantInteger_not_mem_of_notMem + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ scaledRelativeBasisDiscriminantBadPlaces + (K := K) (L := L)) : + scaledRelativeBasisDiscriminantInteger + (K := K) (L := L) ∉ w.asIdeal := by + intro hmem + apply hw + rw [mem_scaledRelativeBasisDiscriminantBadPlaces_iff, + scaledRelativeBasisDiscriminantIdeal, + Ideal.dvd_span_singleton] + exact hmem + +/-- Outside the discriminant bad places, its adic absolute value is one. -/ +theorem adicAbv_scaledRelativeBasisDiscriminant_eq_one_of_notMem + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ scaledRelativeBasisDiscriminantBadPlaces + (K := K) (L := L)) : + NumberField.HeightOneSpectrum.adicAbv K w + (Algebra.discr K + (scaledRelativeExtensionBasis (K := K) (L := L))) = 1 := by + have hnorm : + ‖FinitePlace.embedding (K := K) w + (scaledRelativeBasisDiscriminantInteger + (K := K) (L := L))‖ = 1 := + (FinitePlace.norm_eq_one_iff_notMem + (R := 𝓞 K) K w + (scaledRelativeBasisDiscriminantInteger + (K := K) (L := L))).2 + (scaledRelativeBasisDiscriminantInteger_not_mem_of_notMem + (K := K) (L := L) w hw) + exact (FinitePlace.norm_embedding w + (scaledRelativeBasisDiscriminantInteger (K := K) (L := L) : K)).symm.trans hnorm + +/-- The finite set controlling both the integral lattice and the +inverse discriminant needed for the Cramer-rule converse. -/ +noncomputable def integralTensorComparisonBadPlaces : + Finset (HeightOneSpectrum (𝓞 K)) := by + classical + exact + integralTensorBadPlaces (K := K) (L := L) ∪ + scaledRelativeBasisDiscriminantBadPlaces + (K := K) (L := L) + +/-- Membership in the combined comparison bad-place set is componentwise. -/ +@[simp] +theorem mem_integralTensorComparisonBadPlaces_iff + (w : HeightOneSpectrum (𝓞 K)) : + w ∈ integralTensorComparisonBadPlaces + (K := K) (L := L) ↔ + w ∈ integralTensorBadPlaces (K := K) (L := L) ∨ + w ∈ scaledRelativeBasisDiscriminantBadPlaces + (K := K) (L := L) := by + simp [integralTensorComparisonBadPlaces] + +omit [NumberField L] in +/-- The local tensor-decomposition component of a pure tensor has the expected value. -/ +@[simp] +theorem finitePlaceLocalTensorDecompositionComponent_tmul + (w : HeightOneSpectrum (𝓞 K)) + (wL : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K w) L) + (a : w.adicCompletion K) (b : L) : + finitePlaceLocalTensorDecompositionComponent + (K := K) (L := L) w wL (a ⊗ₜ[K] b) = + AbsoluteValue.completionMap + (NumberField.HeightOneSpectrum.adicAbv K w) + wL.1 wL.2 + ((relativeFinitePlaceCompletionAlgEquiv w).symm a) * + AbsoluteValue.toCompletion wL.1 b := by + simp [finitePlaceLocalTensorDecompositionComponent, + relativeFinitePlaceLocalTensorAlgEquiv, + completionTensorDecomposition_left_tmul_apply, + AbsoluteValue.toCompletionAlgHom] + +omit [NumberField L] [FiniteDimensional K L] in +/-- A coefficient in the concrete base valuation ring maps to the +valuation ring of every completion above it. -/ +theorem finitePlaceLocalTensorDecomposition_coefficient_mem_integers + (w : HeightOneSpectrum (𝓞 K)) + (wL : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K w) L) + (c : w.adicCompletionIntegers K) : + AbsoluteValue.completionMap + (NumberField.HeightOneSpectrum.adicAbv K w) + wL.1 wL.2 + ((relativeFinitePlaceCompletionAlgEquiv w).symm + (c : w.adicCompletion K)) ∈ + absoluteValueCompletionIntegers wL.1 + (absoluteValueExtension_isNonarchimedean + (NumberField.HeightOneSpectrum.adicAbv K w) + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv + K w) wL) := by + rw [mem_absoluteValueCompletionIntegers_iff] + calc + ‖AbsoluteValue.completionMap + (NumberField.HeightOneSpectrum.adicAbv K w) + wL.1 wL.2 + ((relativeFinitePlaceCompletionAlgEquiv w).symm + (c : w.adicCompletion K))‖ = + ‖(relativeFinitePlaceCompletionAlgEquiv w).symm + (c : w.adicCompletion K)‖ := + (AbsoluteValue.completionMap_isometry + (NumberField.HeightOneSpectrum.adicAbv K w) + wL.1 wL.2).norm_map_of_map_zero + (map_zero + (AbsoluteValue.completionMap + (NumberField.HeightOneSpectrum.adicAbv K w) + wL.1 wL.2)) _ + _ = ‖(c : w.adicCompletion K)‖ := + relativeFinitePlaceCompletionAlgEquiv_symm_norm + (K := K) w (c : w.adicCompletion K) + _ ≤ 1 := + norm_le_one_of_mem_adicCompletionIntegers + (K := K) w c.property + +/-- Away from the bad set, every chosen relative basis vector maps to +the valuation ring in each local completion factor. -/ +theorem finitePlaceLocalTensorDecomposition_basis_mem_integers_of_notMem + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ integralTensorBadPlaces + (K := K) (L := L)) + (wL : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K w) L) + (i : RelativeAdeleBasisIndex (K := K) (L := L)) : + AbsoluteValue.toCompletion wL.1 + (relativeExtensionBasis + (K := K) (L := L) i) ∈ + absoluteValueCompletionIntegers wL.1 + (absoluteValueExtension_isNonarchimedean + (NumberField.HeightOneSpectrum.adicAbv K w) + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv + K w) wL) := by + rw [mem_absoluteValueCompletionIntegers_iff] + simpa [AbsoluteValue.toCompletion_apply, + WithAbs.norm_eq_apply_ofAbs] using + relativeExtensionBasis_absoluteValue_le_one_of_notMem + (K := K) (L := L) w hw wL i + +/-- The chosen-basis integral lattice maps into the actual product of +completion valuation rings under the local tensor decomposition, away from the finite +bad set. -/ +theorem relativeBasisIntegralAt_imp_localTensorDecompositionIntegral_of_notMem + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ integralTensorBadPlaces + (K := K) (L := L)) + {x : w.adicCompletion K ⊗[K] L} + (hx : RelativeBasisIntegralAt + (K := K) (L := L) w x) : + RelativeLocalTensorDecompositionIntegralAt + (K := K) (L := L) w x := by + obtain ⟨c, rfl⟩ := hx + intro wL + have hsum : + finitePlaceLocalTensorDecompositionComponent + (K := K) (L := L) w wL + (∑ i : RelativeAdeleBasisIndex + (K := K) (L := L), + ((c i : w.adicCompletionIntegers K) : + w.adicCompletion K) ⊗ₜ[K] + relativeExtensionBasis + (K := K) (L := L) i) = + ∑ i : RelativeAdeleBasisIndex + (K := K) (L := L), + finitePlaceLocalTensorDecompositionComponent + (K := K) (L := L) w wL + (((c i : w.adicCompletionIntegers K) : + w.adicCompletion K) ⊗ₜ[K] + relativeExtensionBasis + (K := K) (L := L) i) := by + simp [finitePlaceLocalTensorDecompositionComponent] + rw [hsum] + apply Subring.sum_mem + intro i hi + rw [finitePlaceLocalTensorDecompositionComponent_tmul] + apply + (absoluteValueCompletionIntegers wL.1 + (absoluteValueExtension_isNonarchimedean + (NumberField.HeightOneSpectrum.adicAbv K w) + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv + K w) wL)).mul_mem + · exact + finitePlaceLocalTensorDecomposition_coefficient_mem_integers + (K := K) (L := L) w wL (c i) + · exact + finitePlaceLocalTensorDecomposition_basis_mem_integers_of_notMem + (K := K) (L := L) w hw wL i + +/-- Consequently, basis integrality of a tensor unit and its inverse +is genuine integrality in every local tensor factor. -/ +theorem relativeBasisIntegralUnitAt_imp_localTensorDecompositionIntegralUnit_of_notMem + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ integralTensorBadPlaces + (K := K) (L := L)) + {x : (w.adicCompletion K ⊗[K] L)ˣ} + (hx : RelativeBasisIntegralUnitAt + (K := K) (L := L) w x) : + RelativeLocalTensorDecompositionIntegralUnitAt + (K := K) (L := L) w x := + ⟨relativeBasisIntegralAt_imp_localTensorDecompositionIntegral_of_notMem + (K := K) (L := L) w hw hx.1, + relativeBasisIntegralAt_imp_localTensorDecompositionIntegral_of_notMem + (K := K) (L := L) w hw hx.2⟩ + +/-- Local tensor integrality forces the coordinates in the +base-changed scaled basis to be integral. The proof takes traces +componentwise and recovers the coordinates by Cramer's rule. -/ +theorem scaledRelativeTensorCoordinates_isIntegral_of_localTensorDecompositionIntegral + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ scaledRelativeBasisDiscriminantBadPlaces + (K := K) (L := L)) + {x : w.adicCompletion K ⊗[K] L} + (hx : RelativeLocalTensorDecompositionIntegralAt + (K := K) (L := L) w x) : + let vK := NumberField.HeightOneSpectrum.adicAbv K w + let xA := + (relativeFinitePlaceLocalTensorAlgEquiv + (K := K) (L := L) w).symm x + let bA := + Algebra.TensorProduct.basis vK.Completion + (scaledRelativeExtensionBasis (K := K) (L := L)) + ∀ i, IsIntegral (absoluteValueCompletionIntegers vK + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K w)) + (bA.equivFun xA i) := by + classical + let vK := NumberField.HeightOneSpectrum.adicAbv K w + let hvK : IsNonarchimedean (vK : K → ℝ) := + NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K w + let hvK0 : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial w + let : Fintype (AbsoluteValueExtension vK L) := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK0 + let : ∀ wL : AbsoluteValueExtension vK L, + Algebra vK.Completion wL.1.Completion := + fun wL => AbsoluteValue.completionAlgebra vK wL.1 wL.2 + let : ∀ wL : AbsoluteValueExtension vK L, + Module.Finite vK.Completion wL.1.Completion := + fun wL => completionModuleFinite vK hvK0 wL + let : ∀ wL : AbsoluteValueExtension vK L, + Module.Free vK.Completion wL.1.Completion := + fun wL => Module.Free.of_divisionRing + vK.Completion wL.1.Completion + let xA : vK.Completion ⊗[K] L := + (relativeFinitePlaceLocalTensorAlgEquiv + (K := K) (L := L) w).symm x + let bA := + Algebra.TensorProduct.basis vK.Completion + (scaledRelativeExtensionBasis (K := K) (L := L)) + have hxA : + ∀ wL : AbsoluteValueExtension vK L, + completionTensorDecompositionLeft + (K := K) (L := L) vK hvK0 xA wL ∈ + absoluteValueCompletionIntegers wL.1 + (absoluteValueExtension_isNonarchimedean vK hvK wL) := by + intro wL + simpa [xA, vK, hvK, hvK0, + finitePlaceLocalTensorDecompositionComponent] using hx wL + have hbA : + ∀ (i : RelativeAdeleBasisIndex (K := K) (L := L)) + (wL : AbsoluteValueExtension vK L), + completionTensorDecompositionLeft + (K := K) (L := L) vK hvK0 (bA i) wL ∈ + absoluteValueCompletionIntegers wL.1 + (absoluteValueExtension_isNonarchimedean vK hvK wL) := by + intro i wL + have hbAi : + bA i = + 1 ⊗ₜ[K] + scaledRelativeExtensionBasis (K := K) (L := L) i := by + simp [bA, Algebra.TensorProduct.basis_apply] + rw [hbAi] + rw [completionTensorDecomposition_left_tmul_apply] + simp only [map_one, one_mul] + rw [mem_absoluteValueCompletionIntegers_iff] + simpa [AbsoluteValue.toCompletionAlgHom, + AbsoluteValue.toCompletion_apply, + WithAbs.norm_eq_apply_ofAbs] using + scaledRelativeExtensionBasis_absoluteValue_le_one + (K := K) (L := L) vK hvK wL i + have hM : + ∀ i j : RelativeAdeleBasisIndex (K := K) (L := L), + IsIntegral (absoluteValueCompletionIntegers vK hvK) + (Algebra.trace vK.Completion + (vK.Completion ⊗[K] L) (bA i * bA j)) := by + intro i j + apply isIntegral_trace_tensor_of_components + (K := K) (L := L) vK hvK hvK0 + intro wL + rw [map_mul, Pi.mul_apply] + change _ ∈ + (absoluteValueCompletionIntegers wL.1 + (absoluteValueExtension_isNonarchimedean + vK hvK wL)).toSubring + exact + (absoluteValueCompletionIntegers wL.1 + (absoluteValueExtension_isNonarchimedean + vK hvK wL)).toSubring.mul_mem (hbA i wL) (hbA j wL) + have ht : + ∀ i : RelativeAdeleBasisIndex (K := K) (L := L), + IsIntegral (absoluteValueCompletionIntegers vK hvK) + (Algebra.trace vK.Completion + (vK.Completion ⊗[K] L) (xA * bA i)) := by + intro i + apply isIntegral_trace_tensor_of_components + (K := K) (L := L) vK hvK hvK0 + intro wL + rw [map_mul, Pi.mul_apply] + change _ ∈ + (absoluteValueCompletionIntegers wL.1 + (absoluteValueExtension_isNonarchimedean + vK hvK wL)).toSubring + exact + (absoluteValueCompletionIntegers wL.1 + (absoluteValueExtension_isNonarchimedean + vK hvK wL)).toSubring.mul_mem (hxA wL) (hbA i wL) + have hdiscInv : + IsIntegral (absoluteValueCompletionIntegers vK hvK) + (Algebra.discr vK.Completion bA)⁻¹ := by + rw [discr_tensorProduct_basis] + apply (IsIntegrallyClosedIn.isIntegral_iff).2 + refine ⟨⟨_, ?_⟩, rfl⟩ + rw [mem_absoluteValueCompletionIntegers_iff] + have hdabs := + adicAbv_scaledRelativeBasisDiscriminant_eq_one_of_notMem + (K := K) (L := L) w hw + have hdnorm : + ‖algebraMap K vK.Completion + (Algebra.discr K + (scaledRelativeExtensionBasis (K := K) (L := L)))‖ = 1 := by + calc + ‖algebraMap K vK.Completion + (Algebra.discr K + (scaledRelativeExtensionBasis (K := K) (L := L)))‖ = + vK (Algebra.discr K + (scaledRelativeExtensionBasis (K := K) (L := L))) := by + exact AbsoluteValue.completionAbsoluteValue_coe _ _ + _ = 1 := hdabs + change AbsoluteValue.completionAbsoluteValue vK + ((algebraMap K vK.Completion + (Algebra.discr K + (scaledRelativeExtensionBasis (K := K) (L := L))))⁻¹) ≤ 1 + rw [map_inv₀] + change + ‖algebraMap K vK.Completion + (Algebra.discr K + (scaledRelativeExtensionBasis (K := K) (L := L)))‖⁻¹ ≤ 1 + rw [hdnorm, inv_one] + have hdiscne : + Algebra.discr vK.Completion bA ≠ 0 := by + rw [discr_tensorProduct_basis] + exact (algebraMap K vK.Completion).injective.ne + (Algebra.discr_not_zero_of_basis K + (scaledRelativeExtensionBasis (K := K) (L := L))) + change ∀ i : RelativeAdeleBasisIndex (K := K) (L := L), + IsIntegral (absoluteValueCompletionIntegers vK hvK) + (bA.equivFun xA i) + intro i + exact basis_coord_isIntegral_of_integral_traces + bA hM ht hdiscInv hdiscne i + +/-- The concrete tensor comparison sends a scaled-basis summand to +the corresponding original-basis summand, with the global scale +absorbed into its coefficient. -/ +theorem relativeFinitePlaceLocalTensorAlgEquiv_scaled_basis_smul + (w : HeightOneSpectrum (𝓞 K)) + (a : + (NumberField.HeightOneSpectrum.adicAbv K w).Completion) + (i : RelativeAdeleBasisIndex (K := K) (L := L)) : + relativeFinitePlaceLocalTensorAlgEquiv + (K := K) (L := L) w + (a • + Algebra.TensorProduct.basis + (NumberField.HeightOneSpectrum.adicAbv K w).Completion + (scaledRelativeExtensionBasis (K := K) (L := L)) i) = + relativeFinitePlaceCompletionAlgEquiv w + (a * algebraMap K + (NumberField.HeightOneSpectrum.adicAbv K w).Completion + (relativeBasisIntegralScaleInK + (K := K) (L := L))) ⊗ₜ[K] + relativeExtensionBasis (K := K) (L := L) i := by + simp [relativeFinitePlaceLocalTensorAlgEquiv, + Algebra.TensorProduct.basis_apply, + scaledRelativeExtensionBasis_apply, + Algebra.smul_def, mul_comm] + simpa [Algebra.smul_def] using + (TensorProduct.smul_tmul + (relativeBasisIntegralScaleInK (K := K) (L := L)) + (relativeFinitePlaceCompletionAlgEquiv w a) + (relativeExtensionBasis (K := K) (L := L) i)).symm + +/-- Outside the lattice and discriminant bad places, integrality of +all local tensor components implies integrality in the original +relative basis. -/ +theorem localTensorDecompositionIntegral_imp_relativeBasisIntegralAt_of_notMem + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ integralTensorComparisonBadPlaces + (K := K) (L := L)) + {x : w.adicCompletion K ⊗[K] L} + (hx : RelativeLocalTensorDecompositionIntegralAt + (K := K) (L := L) w x) : + RelativeBasisIntegralAt (K := K) (L := L) w x := by + classical + have hwdisc : + w ∉ scaledRelativeBasisDiscriminantBadPlaces + (K := K) (L := L) := by + intro hw' + exact hw (by + simp [integralTensorComparisonBadPlaces, hw']) + let vK := NumberField.HeightOneSpectrum.adicAbv K w + let hvK : IsNonarchimedean (vK : K → ℝ) := + NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K w + let xA : vK.Completion ⊗[K] L := + (relativeFinitePlaceLocalTensorAlgEquiv + (K := K) (L := L) w).symm x + let bA := + Algebra.TensorProduct.basis vK.Completion + (scaledRelativeExtensionBasis (K := K) (L := L)) + have hscaled : + ∀ i : RelativeAdeleBasisIndex (K := K) (L := L), + IsIntegral (absoluteValueCompletionIntegers vK hvK) + (bA.equivFun xA i) := by + simpa [vK, hvK, xA, bA] using + scaledRelativeTensorCoordinates_isIntegral_of_localTensorDecompositionIntegral + (K := K) (L := L) w hwdisc hx + have hscaledNorm : + ∀ i : RelativeAdeleBasisIndex (K := K) (L := L), + ‖bA.equivFun xA i‖ ≤ 1 := by + intro i + obtain ⟨ci, hci⟩ := + (IsIntegrallyClosedIn.isIntegral_iff).1 (hscaled i) + rw [← hci] + exact ci.property + have hscaleIntegral : + IsIntegral ℤ + (relativeBasisIntegralScaleInK + (K := K) (L := L)) := by + change IsIntegral ℤ + (algebraMap ℤ K + (chosenRelativeBasisIntegralScale (K := K) (L := L))) + exact isIntegral_algebraMap + have hscaleAbs : + vK (relativeBasisIntegralScaleInK + (K := K) (L := L)) ≤ 1 := + absoluteValue_le_one_of_isIntegral vK hvK hscaleIntegral + have hscaleNorm : + ‖algebraMap K vK.Completion + (relativeBasisIntegralScaleInK + (K := K) (L := L))‖ ≤ 1 := by + calc + ‖algebraMap K vK.Completion + (relativeBasisIntegralScaleInK + (K := K) (L := L))‖ = + vK (relativeBasisIntegralScaleInK + (K := K) (L := L)) := + AbsoluteValue.completionAbsoluteValue_coe _ _ + _ ≤ 1 := hscaleAbs + let cA : + RelativeAdeleBasisIndex (K := K) (L := L) → + vK.Completion := + fun i => + bA.equivFun xA i * + algebraMap K vK.Completion + (relativeBasisIntegralScaleInK + (K := K) (L := L)) + have hcANorm : + ∀ i : RelativeAdeleBasisIndex (K := K) (L := L), + ‖cA i‖ ≤ 1 := by + intro i + change ‖bA.equivFun xA i * + algebraMap K vK.Completion + (relativeBasisIntegralScaleInK + (K := K) (L := L))‖ ≤ 1 + rw [norm_mul] + calc + ‖bA.equivFun xA i‖ * + ‖algebraMap K vK.Completion + (relativeBasisIntegralScaleInK + (K := K) (L := L))‖ ≤ + 1 * 1 := + mul_le_mul (hscaledNorm i) hscaleNorm + (norm_nonneg _) (by positivity) + _ = 1 := one_mul 1 + have hmapNorm (y : vK.Completion) : + ‖relativeFinitePlaceCompletionAlgEquiv w y‖ = ‖y‖ := by + change ‖relativeFinitePlaceCompletionRingHom w y‖ = ‖y‖ + exact + (relativeFinitePlaceCompletionRingHom_isometry w).norm_map_of_map_zero + (map_zero (relativeFinitePlaceCompletionRingHom w)) y + let c : + RelativeAdeleBasisIndex (K := K) (L := L) → + w.adicCompletionIntegers K := + fun i => + ⟨relativeFinitePlaceCompletionAlgEquiv w (cA i), + mem_adicCompletionIntegers_of_norm_le_one w + (by rw [hmapNorm]; exact hcANorm i)⟩ + refine ⟨c, ?_⟩ + let e := + relativeFinitePlaceLocalTensorAlgEquiv + (K := K) (L := L) w + calc + x = e xA := (e.apply_symm_apply x).symm + _ = e (∑ i : RelativeAdeleBasisIndex (K := K) (L := L), + (bA.equivFun xA i) • bA i) := + congrArg e (bA.sum_repr xA).symm + _ = ∑ i : RelativeAdeleBasisIndex (K := K) (L := L), + e ((bA.equivFun xA i) • bA i) := by + rw [map_sum] + _ = ∑ i : RelativeAdeleBasisIndex (K := K) (L := L), + ((c i : w.adicCompletionIntegers K) : + w.adicCompletion K) ⊗ₜ[K] + relativeExtensionBasis (K := K) (L := L) i := by + apply Finset.sum_congr rfl + intro i _ + rw [relativeFinitePlaceLocalTensorAlgEquiv_scaled_basis_smul] + +/-- The same converse for tensor units, applied to the unit and its +inverse. -/ +theorem localTensorDecompositionIntegralUnit_imp_relativeBasisIntegralUnitAt_of_notMem + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ integralTensorComparisonBadPlaces + (K := K) (L := L)) + {x : (w.adicCompletion K ⊗[K] L)ˣ} + (hx : RelativeLocalTensorDecompositionIntegralUnitAt + (K := K) (L := L) w x) : + RelativeBasisIntegralUnitAt (K := K) (L := L) w x := + ⟨localTensorDecompositionIntegral_imp_relativeBasisIntegralAt_of_notMem + (K := K) (L := L) w hw hx.1, + localTensorDecompositionIntegral_imp_relativeBasisIntegralAt_of_notMem + (K := K) (L := L) w hw hx.2⟩ + +/-- Away from one explicit finite bad set, basis integrality is +equivalent to integrality in every local tensor factor. -/ +theorem relativeBasisIntegralAt_iff_localTensorDecompositionIntegral_of_notMem + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ integralTensorComparisonBadPlaces + (K := K) (L := L)) + {x : w.adicCompletion K ⊗[K] L} : + RelativeBasisIntegralAt (K := K) (L := L) w x ↔ + RelativeLocalTensorDecompositionIntegralAt (K := K) (L := L) w x := by + have hwold : w ∉ integralTensorBadPlaces (K := K) (L := L) := by + intro hw' + exact hw (by + simp [integralTensorComparisonBadPlaces, hw']) + exact + ⟨relativeBasisIntegralAt_imp_localTensorDecompositionIntegral_of_notMem + (K := K) (L := L) w hwold, + localTensorDecompositionIntegral_imp_relativeBasisIntegralAt_of_notMem + (K := K) (L := L) w hw⟩ + +/-- Unit version of the local tensor integral comparison. -/ +theorem relativeBasisIntegralUnitAt_iff_localTensorDecompositionIntegralUnit_of_notMem + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ integralTensorComparisonBadPlaces + (K := K) (L := L)) + {x : (w.adicCompletion K ⊗[K] L)ˣ} : + RelativeBasisIntegralUnitAt (K := K) (L := L) w x ↔ + RelativeLocalTensorDecompositionIntegralUnitAt (K := K) (L := L) w x := by + have hwold : w ∉ integralTensorBadPlaces (K := K) (L := L) := by + intro hw' + exact hw (by + simp [integralTensorComparisonBadPlaces, hw']) + exact + ⟨relativeBasisIntegralUnitAt_imp_localTensorDecompositionIntegralUnit_of_notMem + (K := K) (L := L) w hwold, + localTensorDecompositionIntegralUnit_imp_relativeBasisIntegralUnitAt_of_notMem + (K := K) (L := L) w hw⟩ + +end LocalTensorDecompositionIntegralComparison diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Localization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Localization.lean new file mode 100644 index 0000000000..3659c01f3d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Localization.lean @@ -0,0 +1,218 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice +/-! +# Localization of the relative integral lattice + +Away from the finite exceptional set, this module compares the localized +integer lattice with the integral closure and derives coordinatewise +integrality after localization. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct NNReal +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations + +universe u v + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +/-- Uniform local denominator statement: outside the bad set a +denominator avoiding the prime carries every algebraic integer into +the scaled lattice. -/ +theorem exists_notMem_smul_mem_scaledRelativeIntegerLattice + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ integralTensorBadPlaces + (K := K) (L := L)) + (x : 𝓞 L) : + ∃ d : 𝓞 K, d ∉ w.asIdeal ∧ + d • x ∈ + scaledRelativeIntegerLattice + (K := K) (L := L) := + ⟨scaledRelativeIntegerLatticeAnnihilator + (K := K) (L := L), + scaledRelativeIntegerLatticeAnnihilator_not_mem_of_notMem + (K := K) (L := L) w hw, + scaledRelativeIntegerLatticeAnnihilator_smul_mem + (K := K) (L := L) x⟩ + +/-- The local ring of `K` at a finite place. -/ +abbrev RelativeBaseIntegerLocalization + (w : HeightOneSpectrum (𝓞 K)) := + Localization.AtPrime w.asIdeal + +/-- The localization of `𝓞 L` above the same finite place of `K`. -/ +abbrev RelativeExtensionIntegerLocalization + (w : HeightOneSpectrum (𝓞 K)) := + Localization + (Algebra.algebraMapSubmonoid + (𝓞 L) w.asIdeal.primeCompl) + +/-- The canonical localization map, regarded as an `𝓞 K`-linear map. -/ +noncomputable def relativeIntegerLocalizationLinearMap + (w : HeightOneSpectrum (𝓞 K)) : + 𝓞 L →ₗ[𝓞 K] + RelativeExtensionIntegerLocalization + (K := K) (L := L) w := + (IsScalarTower.toAlgHom + (𝓞 K) (𝓞 L) + (RelativeExtensionIntegerLocalization + (K := K) (L := L) w)).toLinearMap + +/-- The span of the scaled integral relative basis after localization +at a finite place of `K`. -/ +noncomputable def localizedScaledRelativeIntegerLattice + (w : HeightOneSpectrum (𝓞 K)) : + Submodule + (RelativeBaseIntegerLocalization (K := K) w) + (RelativeExtensionIntegerLocalization + (K := K) (L := L) w) := + Submodule.span + (RelativeBaseIntegerLocalization (K := K) w) + (Set.range fun i : + RelativeAdeleBasisIndex (K := K) (L := L) => + algebraMap (𝓞 L) + (RelativeExtensionIntegerLocalization + (K := K) (L := L) w) + (scaledRelativeExtensionInteger + (K := K) (L := L) i)) + +/-- Every element of the global scaled lattice maps into its localized +span. -/ +theorem relativeIntegerLocalizationLinearMap_mem_localizedLattice + (w : HeightOneSpectrum (𝓞 K)) + {x : 𝓞 L} + (hx : x ∈ + scaledRelativeIntegerLattice + (K := K) (L := L)) : + relativeIntegerLocalizationLinearMap + (K := K) (L := L) w x ∈ + localizedScaledRelativeIntegerLattice + (K := K) (L := L) w := by + rw [scaledRelativeIntegerLattice] at hx + refine Submodule.span_induction ?_ ?_ ?_ ?_ hx + · rintro y ⟨i, rfl⟩ + exact Submodule.subset_span ⟨i, rfl⟩ + · rw [map_zero] + exact + Submodule.zero_mem + (localizedScaledRelativeIntegerLattice + (K := K) (L := L) w) + · intro y z _ _ hy hz + simpa using + (Submodule.add_mem + (localizedScaledRelativeIntegerLattice + (K := K) (L := L) w) hy hz) + · intro a y _ hy + have hsmul := + (localizedScaledRelativeIntegerLattice + (K := K) (L := L) w).smul_mem + (algebraMap (𝓞 K) + (RelativeBaseIntegerLocalization (K := K) w) a) hy + simpa [relativeIntegerLocalizationLinearMap] using hsmul + +/-- Away from the finite bad set, every algebraic integer of `L` maps +into the span of the scaled relative integral basis. -/ +theorem algebraMap_mem_localizedScaledRelativeIntegerLattice_of_notMem + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ integralTensorBadPlaces + (K := K) (L := L)) + (x : 𝓞 L) : + algebraMap (𝓞 L) + (RelativeExtensionIntegerLocalization + (K := K) (L := L) w) x ∈ + localizedScaledRelativeIntegerLattice + (K := K) (L := L) w := by + let d : 𝓞 K := + scaledRelativeIntegerLatticeAnnihilator + (K := K) (L := L) + have hd : d ∉ w.asIdeal := by + exact + scaledRelativeIntegerLatticeAnnihilator_not_mem_of_notMem + (K := K) (L := L) w hw + let ds : w.asIdeal.primeCompl := ⟨d, hd⟩ + let hdu : + IsUnit + (algebraMap (𝓞 K) + (RelativeBaseIntegerLocalization (K := K) w) d) := + IsLocalization.map_units + (RelativeBaseIntegerLocalization (K := K) w) ds + let du : + (RelativeBaseIntegerLocalization (K := K) w)ˣ := + hdu.unit + have hdx : + d • x ∈ + scaledRelativeIntegerLattice + (K := K) (L := L) := + scaledRelativeIntegerLatticeAnnihilator_smul_mem + (K := K) (L := L) x + have hmap := + relativeIntegerLocalizationLinearMap_mem_localizedLattice + (K := K) (L := L) w hdx + have hdu_spec : + (du : + RelativeBaseIntegerLocalization (K := K) w) = + algebraMap (𝓞 K) + (RelativeBaseIntegerLocalization (K := K) w) d := by + exact hdu.unit_spec + have hmap' : + (du : + RelativeBaseIntegerLocalization (K := K) w) • + algebraMap (𝓞 L) + (RelativeExtensionIntegerLocalization + (K := K) (L := L) w) x ∈ + localizedScaledRelativeIntegerLattice + (K := K) (L := L) w := by + simpa [relativeIntegerLocalizationLinearMap, hdu_spec] using hmap + have hinv := + (localizedScaledRelativeIntegerLattice + (K := K) (L := L) w).smul_mem + (↑(du⁻¹) : + RelativeBaseIntegerLocalization (K := K) w) hmap' + simpa [← smul_smul] using hinv + +/-- Outside the explicitly constructed finite set of bad places, the +localized scaled lattice is the whole localization of `𝓞 L`. -/ +theorem localizedScaledRelativeIntegerLattice_eq_top_of_notMem + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ integralTensorBadPlaces + (K := K) (L := L)) : + localizedScaledRelativeIntegerLattice + (K := K) (L := L) w = ⊤ := by + apply top_unique + have htop : + Submodule.span + (RelativeBaseIntegerLocalization (K := K) w) + (algebraMap (𝓞 L) + (RelativeExtensionIntegerLocalization + (K := K) (L := L) w) '' + (Set.univ : Set (𝓞 L))) = + ⊤ := + span_eq_top_localization_localization + (RelativeBaseIntegerLocalization (K := K) w) + w.asIdeal.primeCompl + (RelativeExtensionIntegerLocalization + (K := K) (L := L) w) + (by simp) + rw [← htop] + refine Submodule.span_le.2 ?_ + rintro y ⟨x, -, rfl⟩ + exact + algebraMap_mem_localizedScaledRelativeIntegerLattice_of_notMem + (K := K) (L := L) w hw x diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/LocalComponents.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/LocalComponents.lean new file mode 100644 index 0000000000..965398d928 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/LocalComponents.lean @@ -0,0 +1,212 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.Coordinates +/-! +# Joint local components of relative adeles and ideles + +The archimedean and finite tensor components jointly determine an element +of `𝔸_K ⊗[K] L`. This file records the corresponding injective +homomorphism on relative ideles. Surjectivity onto the restricted local +product is handled separately, once integral compatibility with the local +tensor decomposition has been established. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + + +universe u v + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +omit [NumberField L] in +/-- A local tensor component has the expected chosen-basis +coordinates at a finite place. -/ +@[simp] +theorem relativeAdeleFiniteComponent_basis_repr + (z : RelativeAdeleRing K L) + (w : HeightOneSpectrum (𝓞 K)) + (i : RelativeAdeleBasisIndex (K := K) (L := L)) : + (Algebra.TensorProduct.basis + (w.adicCompletion K) + (relativeExtensionBasis + (K := K) (L := L))).repr + (relativeAdeleFiniteComponent + (K := K) (L := L) w z) i = + (relativeAdeleCoefficient + (K := K) (L := L) z i).2 w := by + classical + rw [relativeAdeleFiniteComponent_eq_sum_tmul_coefficients] + simp [relativeExtensionBasis, Finsupp.single_apply] + +omit [NumberField L] in +/-- A local tensor component has the expected chosen-basis +coordinates at an infinite place. -/ +@[simp] +theorem relativeAdeleInfiniteComponent_basis_repr + (z : RelativeAdeleRing K L) + (w : InfinitePlace K) + (i : RelativeAdeleBasisIndex (K := K) (L := L)) : + (Algebra.TensorProduct.basis + w.Completion + (relativeExtensionBasis + (K := K) (L := L))).repr + (relativeAdeleInfiniteComponent + (K := K) (L := L) w z) i = + (relativeAdeleCoefficient + (K := K) (L := L) z i).1 w := by + classical + rw [relativeAdeleInfiniteComponent_eq_sum_tmul_coefficients] + simp only [relativeExtensionBasis, map_sum, Algebra.TensorProduct.basis_repr_tmul, + Module.Basis.repr_self, Finsupp.mapRange_single, InfinitePlace.Completion.algebraMap_apply, + WithAbs.toAbs_one, Finsupp.smul_single, smul_eq_mul, Finsupp.coe_finsetSum, Finset.sum_apply, + Finsupp.single_apply, Finset.sum_ite_eq', Finset.mem_univ, ↓reduceIte] + change + (relativeAdeleCoefficient + (K := K) (L := L) z i).1 w * + algebraMap K w.Completion (1 : K) = + (relativeAdeleCoefficient + (K := K) (L := L) z i).1 w + rw [map_one, mul_one] + +omit [NumberField L] in +/-- Equality of every archimedean and finite tensor component implies +equality of relative adeles. -/ +theorem relativeAdele_ext_of_components + {x y : RelativeAdeleRing K L} + (hinfinite : + ∀ w : InfinitePlace K, + relativeAdeleInfiniteComponent + (K := K) (L := L) w x = + relativeAdeleInfiniteComponent + (K := K) (L := L) w y) + (hfinite : + ∀ w : HeightOneSpectrum (𝓞 K), + relativeAdeleFiniteComponent + (K := K) (L := L) w x = + relativeAdeleFiniteComponent + (K := K) (L := L) w y) : + x = y := by + apply + (relativeAdeleCoefficientLinearEquiv + (K := K) (L := L)).injective + funext i + apply Prod.ext + · funext w + have h := + congrArg + (fun z => + (Algebra.TensorProduct.basis + w.Completion + (relativeExtensionBasis + (K := K) (L := L))).repr z i) + (hinfinite w) + change (relativeAdeleCoefficient (K := K) (L := L) x i).1 w = + (relativeAdeleCoefficient (K := K) (L := L) y i).1 w + simpa using h + · apply DFunLike.coe_injective + funext w + have h := + congrArg + (fun z => + (Algebra.TensorProduct.basis + (w.adicCompletion K) + (relativeExtensionBasis + (K := K) (L := L))).repr z i) + (hfinite w) + change (relativeAdeleCoefficient (K := K) (L := L) x i).2 w = + (relativeAdeleCoefficient (K := K) (L := L) y i).2 w + simpa using h + +/-- The unrestricted family of every archimedean and finite local +tensor unit group. -/ +abbrev RelativeLocalTensorFamily := + (∀ w : InfinitePlace K, + (w.Completion ⊗[K] L)ˣ) × + (∀ w : HeightOneSpectrum (𝓞 K), + (w.adicCompletion K ⊗[K] L)ˣ) + +/-- All local tensor components of a relative idele. -/ +def relativeIdeleLocalComponents : + RelativeIdeleGroup K L →* + RelativeLocalTensorFamily (K := K) (L := L) where + toFun z := + ⟨fun w => + RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) w z, + fun w => + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w z⟩ + map_one' := by + apply Prod.ext + · funext w + exact map_one + (RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) w) + · funext w + exact map_one + (RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w) + map_mul' x y := by + apply Prod.ext + · funext w + exact map_mul + (RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) w) x y + · funext w + exact map_mul + (RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w) x y + +omit [NumberField L] [FiniteDimensional K L] in +@[simp] +theorem relativeIdeleLocalComponents_infinite + (z : RelativeIdeleGroup K L) + (w : InfinitePlace K) : + (relativeIdeleLocalComponents + (K := K) (L := L) z).1 w = + RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) w z := + rfl + +omit [NumberField L] [FiniteDimensional K L] in +@[simp] +theorem relativeIdeleLocalComponents_finite + (z : RelativeIdeleGroup K L) + (w : HeightOneSpectrum (𝓞 K)) : + (relativeIdeleLocalComponents + (K := K) (L := L) z).2 w = + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w z := + rfl + +omit [NumberField L] in +/-- The complete local-component map is injective. -/ +theorem relativeIdeleLocalComponents_injective : + Function.Injective + (relativeIdeleLocalComponents + (K := K) (L := L)) := by + intro x y hxy + apply Units.ext + apply relativeAdele_ext_of_components + · intro w + have h := congrArg (fun z => z.1 w) hxy + exact congrArg Units.val h + · intro w + have h := congrArg (fun z => z.2 w) hxy + exact congrArg Units.val h diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedAction.lean new file mode 100644 index 0000000000..cf3ddefe3f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedAction.lean @@ -0,0 +1,373 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedProduct +/-! +# Galois action on the restricted local product + +The Galois action on `𝔸_K ⊗[K] L` commutes with evaluation at every +place. Consequently the exact restricted-product equivalence for +relative ideles is equivariant, and the transported action is the +coordinatewise tensor-conjugation action. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + + +universe u v w + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +/-- The natural action on relative ideles, upgraded to an action by +group automorphisms for the restricted-product comparison. -/ +@[reducible] +noncomputable def relativeIdeleRestrictedMulDistribMulAction : + MulDistribMulAction + (L ≃ₐ[K] L) (RelativeIdeleGroup K L) where + __ := RelativeIdeleGroup.relativeIdeleMulAction K L + smul_one σ := + map_one + (RelativeIdeleGroup.conjugationIdele K L σ) + smul_mul σ a b := + map_mul + (RelativeIdeleGroup.conjugationIdele K L σ) a b + +section ScalarTensor + +variable + {A : Type w} [CommRing A] [Algebra K A] + +/-- Conjugation on the second factor of an arbitrary scalar extension +`A ⊗[K] L`. -/ +noncomputable def scalarTensorConjugation + (σ : L ≃ₐ[K] L) : + A ⊗[K] L ≃ₐ[A] A ⊗[K] L := by + let f : A ⊗[K] L →ₐ[A] A ⊗[K] L := + Algebra.TensorProduct.map + (AlgHom.id A A) σ.toAlgHom + let g : A ⊗[K] L →ₐ[A] A ⊗[K] L := + Algebra.TensorProduct.map + (AlgHom.id A A) σ.symm.toAlgHom + exact AlgEquiv.ofAlgHom f g + (by ext x; simp [f, g]) + (by ext x; simp [f, g]) + +omit [NumberField K] [NumberField L] + [FiniteDimensional K L] in +@[simp] +theorem scalarTensorConjugation_tmul + (σ : L ≃ₐ[K] L) (a : A) (x : L) : + scalarTensorConjugation + (K := K) (L := L) (A := A) σ + (a ⊗ₜ[K] x) = + a ⊗ₜ[K] σ x := + rfl + +omit [NumberField K] [NumberField L] + [FiniteDimensional K L] in +theorem scalarTensorConjugation_one + (z : A ⊗[K] L) : + scalarTensorConjugation + (K := K) (L := L) (A := A) + (1 : L ≃ₐ[K] L) z = z := by + induction z using TensorProduct.inductionOn with + | tmul a x => simp + | add x y hx hy => simp [hx, hy] + +omit [NumberField K] [NumberField L] + [FiniteDimensional K L] in +theorem scalarTensorConjugation_mul + (σ τ : L ≃ₐ[K] L) + (z : A ⊗[K] L) : + scalarTensorConjugation + (K := K) (L := L) (A := A) (σ * τ) z = + scalarTensorConjugation + (K := K) (L := L) (A := A) σ + (scalarTensorConjugation + (K := K) (L := L) (A := A) τ z) := by + induction z using TensorProduct.inductionOn with + | tmul a x => simp + | add x y hx hy => simp [hx, hy] + +/-- The action by tensor conjugation on local tensor units. -/ +@[reducible] +noncomputable def scalarTensorUnitsAction : + MulDistribMulAction + (L ≃ₐ[K] L) (A ⊗[K] L)ˣ where + smul σ z := + Units.mapEquiv + (scalarTensorConjugation + (K := K) (L := L) (A := A) σ).toMulEquiv z + one_smul z := by + apply Units.ext + exact scalarTensorConjugation_one + (K := K) (L := L) (A := A) + (z : A ⊗[K] L) + mul_smul σ τ z := by + apply Units.ext + exact scalarTensorConjugation_mul + (K := K) (L := L) (A := A) + σ τ (z : A ⊗[K] L) + smul_one σ := by + apply Units.ext + exact + (scalarTensorConjugation + (K := K) (L := L) (A := A) σ).map_one + smul_mul σ x y := by + apply Units.ext + exact + (scalarTensorConjugation + (K := K) (L := L) (A := A) σ).map_mul + (x : A ⊗[K] L) (y : A ⊗[K] L) + +omit [NumberField K] [NumberField L] + [FiniteDimensional K L] in +@[simp] +theorem scalarTensorUnitsAction_coe + (σ : L ≃ₐ[K] L) + (z : (A ⊗[K] L)ˣ) : + letI := scalarTensorUnitsAction + (K := K) (L := L) (A := A) + ((σ • z : (A ⊗[K] L)ˣ) : + A ⊗[K] L) = + scalarTensorConjugation + (K := K) (L := L) (A := A) σ + (z : A ⊗[K] L) := + rfl + +end ScalarTensor + +omit [NumberField L] [FiniteDimensional K L] in +/-- Infinite-place evaluation commutes with Galois conjugation. -/ +theorem relativeAdeleInfiniteComponent_conjugation + (w : InfinitePlace K) + (σ : L ≃ₐ[K] L) + (z : RelativeAdeleRing K L) : + relativeAdeleInfiniteComponent + (K := K) (L := L) w + (RelativeIdeleGroup.conjugation K L σ z) = + scalarTensorConjugation + (K := K) (L := L) + (A := w.Completion) σ + (relativeAdeleInfiniteComponent + (K := K) (L := L) w z) := by + induction z using TensorProduct.inductionOn with + | tmul a x => rfl + | add x y hx hy => simp [hx, hy] + +omit [NumberField L] [FiniteDimensional K L] in +/-- Finite-place evaluation commutes with Galois conjugation. -/ +theorem relativeAdeleFiniteComponent_conjugation + (w : HeightOneSpectrum (𝓞 K)) + (σ : L ≃ₐ[K] L) + (z : RelativeAdeleRing K L) : + relativeAdeleFiniteComponent + (K := K) (L := L) w + (RelativeIdeleGroup.conjugation K L σ z) = + scalarTensorConjugation + (K := K) (L := L) + (A := w.adicCompletion K) σ + (relativeAdeleFiniteComponent + (K := K) (L := L) w z) := by + induction z using TensorProduct.inductionOn with + | tmul a x => rfl + | add x y hx hy => simp [hx, hy] + +omit [NumberField L] [FiniteDimensional K L] in +/-- The infinite local unit component map is equivariant. -/ +theorem RelativeIdeleGroup.infiniteComponent_smul + (w : InfinitePlace K) + (σ : L ≃ₐ[K] L) + (z : RelativeIdeleGroup K L) : + letI := scalarTensorUnitsAction + (K := K) (L := L) (A := w.Completion) + RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) w (σ • z) = + σ • RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) w z := by + let _ := scalarTensorUnitsAction + (K := K) (L := L) (A := w.Completion) + apply Units.ext + exact relativeAdeleInfiniteComponent_conjugation + (K := K) (L := L) w σ + (z : RelativeAdeleRing K L) + +omit [NumberField L] [FiniteDimensional K L] in +/-- The finite local unit component map is equivariant. -/ +theorem RelativeIdeleGroup.finiteComponent_smul + (w : HeightOneSpectrum (𝓞 K)) + (σ : L ≃ₐ[K] L) + (z : RelativeIdeleGroup K L) : + letI := scalarTensorUnitsAction + (K := K) (L := L) + (A := w.adicCompletion K) + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w (σ • z) = + σ • RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w z := by + let _ := scalarTensorUnitsAction + (K := K) (L := L) + (A := w.adicCompletion K) + apply Units.ext + exact relativeAdeleFiniteComponent_conjugation + (K := K) (L := L) w σ + (z : RelativeAdeleRing K L) + +/-- The Galois action on the restricted local product transported +through the exact relative-idele equivalence. -/ +@[reducible] +noncomputable def relativeLocalIdeleDataMulDistribMulAction : + MulDistribMulAction + (L ≃ₐ[K] L) + (RelativeLocalIdeleData + (K := K) (L := L)) := by + letI : MulDistribMulAction + (L ≃ₐ[K] L) (RelativeIdeleGroup K L) := + relativeIdeleRestrictedMulDistribMulAction + (K := K) (L := L) + let e := + relativeIdeleMulEquivLocalData + (K := K) (L := L) + exact + { smul := fun σ a => e (σ • e.symm a) + one_smul := by + intro a + change e (1 • e.symm a) = a + rw [one_smul, e.apply_symm_apply] + mul_smul := by + intro σ τ a + change + e ((σ * τ) • e.symm a) = + e (σ • e.symm (e (τ • e.symm a))) + rw [e.symm_apply_apply, mul_smul] + smul_one := by + intro σ + change e (σ • e.symm 1) = 1 + rw [e.symm.map_one, smul_one, e.map_one] + smul_mul := by + intro σ a b + change + e (σ • e.symm (a * b)) = + e (σ • e.symm a) * + e (σ • e.symm b) + rw [e.symm.map_mul, + MulDistribMulAction.smul_mul, e.map_mul] } + +omit [NumberField L] in +/-- Equivariance of the exact restricted-product equivalence. -/ +theorem relativeIdeleMulEquivLocalData_smul + (σ : L ≃ₐ[K] L) + (z : RelativeIdeleGroup K L) : + letI := + relativeIdeleRestrictedMulDistribMulAction + (K := K) (L := L) + letI := + relativeLocalIdeleDataMulDistribMulAction + (K := K) (L := L) + relativeIdeleMulEquivLocalData + (K := K) (L := L) (σ • z) = + σ • relativeIdeleMulEquivLocalData + (K := K) (L := L) z := by + let _ := + relativeIdeleRestrictedMulDistribMulAction + (K := K) (L := L) + let _ := + relativeLocalIdeleDataMulDistribMulAction + (K := K) (L := L) + change + relativeIdeleMulEquivLocalData + (K := K) (L := L) (σ • z) = + relativeIdeleMulEquivLocalData + (K := K) (L := L) + (σ • + (relativeIdeleMulEquivLocalData + (K := K) (L := L)).symm + (relativeIdeleMulEquivLocalData + (K := K) (L := L) z)) + rw [(relativeIdeleMulEquivLocalData + (K := K) (L := L)).symm_apply_apply] + +omit [NumberField L] in +/-- The transported action is coordinatewise tensor conjugation at +infinite places. -/ +theorem RelativeLocalIdeleData.infinite_smul + (σ : L ≃ₐ[K] L) + (a : RelativeLocalIdeleData (K := K) (L := L)) + (w : InfinitePlace K) : + letI := + relativeIdeleRestrictedMulDistribMulAction + (K := K) (L := L) + letI := + relativeLocalIdeleDataMulDistribMulAction + (K := K) (L := L) + letI := scalarTensorUnitsAction + (K := K) (L := L) (A := w.Completion) + (σ • a).infinite w = + σ • a.infinite w := by + let _ := + relativeIdeleRestrictedMulDistribMulAction + (K := K) (L := L) + let _ := + relativeLocalIdeleDataMulDistribMulAction + (K := K) (L := L) + let _ := scalarTensorUnitsAction + (K := K) (L := L) (A := w.Completion) + change + RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) w + (σ • relativeIdeleOfLocalData + (K := K) (L := L) a) = + σ • a.infinite w + rw [RelativeIdeleGroup.infiniteComponent_smul, + relativeIdeleOfLocalData_infiniteComponent] + +omit [NumberField L] in +/-- The transported action is coordinatewise tensor conjugation at +finite places. -/ +theorem RelativeLocalIdeleData.finite_smul + (σ : L ≃ₐ[K] L) + (a : RelativeLocalIdeleData (K := K) (L := L)) + (w : HeightOneSpectrum (𝓞 K)) : + letI := + relativeIdeleRestrictedMulDistribMulAction + (K := K) (L := L) + letI := + relativeLocalIdeleDataMulDistribMulAction + (K := K) (L := L) + letI := scalarTensorUnitsAction + (K := K) (L := L) + (A := w.adicCompletion K) + (σ • a).finite w = + σ • a.finite w := by + let _ := + relativeIdeleRestrictedMulDistribMulAction + (K := K) (L := L) + let _ := + relativeLocalIdeleDataMulDistribMulAction + (K := K) (L := L) + let _ := scalarTensorUnitsAction + (K := K) (L := L) + (A := w.adicCompletion K) + change + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w + (σ • relativeIdeleOfLocalData + (K := K) (L := L) a) = + σ • a.finite w + rw [RelativeIdeleGroup.finiteComponent_smul, + relativeIdeleOfLocalData_finiteComponent] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedProduct.lean new file mode 100644 index 0000000000..347f7a92d0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedProduct.lean @@ -0,0 +1,632 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.LocalComponents +public import Mathlib.Algebra.Group.TransferInstance +/-! +# The restricted local product of a relative adele algebra + +Using the chosen finite `K`-basis of `L`, a family of local tensor +components comes from `𝔸_K ⊗[K] L` precisely when each basis coefficient +is integral at almost every finite place. Applying the same condition to +a family of local units and to its pointwise inverse gives an exact +restricted-product model of the relative idele group. + +This construction is independent of the later identification of the +chosen-basis lattice with the product of local integer rings. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + + +universe u v + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +/-- A family of local tensor elements whose chosen-basis coefficients +are integral at almost every finite place. -/ +structure RelativeLocalAdeleData where + /-- The family of archimedean local tensor components. -/ + infinite : + ∀ w : InfinitePlace K, + w.Completion ⊗[K] L + /-- The family of finite local tensor components. -/ + finite : + ∀ w : HeightOneSpectrum (𝓞 K), + w.adicCompletion K ⊗[K] L + /-- Every chosen-basis coefficient of the finite family is integral + at all but finitely many places. -/ + eventually_integral : + ∀ i : RelativeAdeleBasisIndex (K := K) (L := L), + ∀ᶠ w : HeightOneSpectrum (𝓞 K) in Filter.cofinite, + (Algebra.TensorProduct.basis + (w.adicCompletion K) + (relativeExtensionBasis + (K := K) (L := L))).repr + (finite w) i ∈ + w.adicCompletionIntegers K + +omit [NumberField L] in +@[ext] +theorem RelativeLocalAdeleData.ext + {a b : RelativeLocalAdeleData (K := K) (L := L)} + (hinfinite : a.infinite = b.infinite) + (hfinite : a.finite = b.finite) : + a = b := by + cases a + cases b + simp_all + +/-- The `i`-th base-adele coefficient assembled from local tensor +coordinates. -/ +noncomputable def relativeLocalAdeleCoefficient + (a : RelativeLocalAdeleData (K := K) (L := L)) + (i : RelativeAdeleBasisIndex (K := K) (L := L)) : + NumberField.AdeleRing (𝓞 K) K := + ⟨fun w => + (Algebra.TensorProduct.basis + w.Completion + (relativeExtensionBasis + (K := K) (L := L))).repr + (a.infinite w) i, + ⟨fun w => + (Algebra.TensorProduct.basis + (w.adicCompletion K) + (relativeExtensionBasis + (K := K) (L := L))).repr + (a.finite w) i, + a.eventually_integral i⟩⟩ + +omit [NumberField L] in +@[simp] +theorem relativeLocalAdeleCoefficient_infinite + (a : RelativeLocalAdeleData (K := K) (L := L)) + (i : RelativeAdeleBasisIndex (K := K) (L := L)) + (w : InfinitePlace K) : + (relativeLocalAdeleCoefficient + (K := K) (L := L) a i).1 w = + (Algebra.TensorProduct.basis + w.Completion + (relativeExtensionBasis + (K := K) (L := L))).repr + (a.infinite w) i := + rfl + +omit [NumberField L] in +@[simp] +theorem relativeLocalAdeleCoefficient_finite + (a : RelativeLocalAdeleData (K := K) (L := L)) + (i : RelativeAdeleBasisIndex (K := K) (L := L)) + (w : HeightOneSpectrum (𝓞 K)) : + (relativeLocalAdeleCoefficient + (K := K) (L := L) a i).2 w = + (Algebra.TensorProduct.basis + (w.adicCompletion K) + (relativeExtensionBasis + (K := K) (L := L))).repr + (a.finite w) i := + rfl + +/-- Assemble a restricted family of local tensor elements into a +relative adele. -/ +noncomputable def relativeAdeleOfLocalData + (a : RelativeLocalAdeleData (K := K) (L := L)) : + RelativeAdeleRing K L := + relativeAdeleOfCoefficients + (K := K) (L := L) + (relativeLocalAdeleCoefficient + (K := K) (L := L) a) + +omit [NumberField L] in +@[simp] +theorem relativeAdeleOfLocalData_infiniteComponent + (a : RelativeLocalAdeleData (K := K) (L := L)) + (w : InfinitePlace K) : + relativeAdeleInfiniteComponent + (K := K) (L := L) w + (relativeAdeleOfLocalData + (K := K) (L := L) a) = + a.infinite w := by + apply + (Algebra.TensorProduct.basis + w.Completion + (relativeExtensionBasis + (K := K) (L := L))).repr.injective + apply Finsupp.ext + intro i + rw [relativeAdeleInfiniteComponent_basis_repr] + have h := + relativeAdeleCoefficient_ofCoefficients + (K := K) (L := L) + (relativeLocalAdeleCoefficient + (K := K) (L := L) a) i + exact congrArg + (fun q : NumberField.AdeleRing (𝓞 K) K => + q.1 w) h + +omit [NumberField L] in +@[simp] +theorem relativeAdeleOfLocalData_finiteComponent + (a : RelativeLocalAdeleData (K := K) (L := L)) + (w : HeightOneSpectrum (𝓞 K)) : + relativeAdeleFiniteComponent + (K := K) (L := L) w + (relativeAdeleOfLocalData + (K := K) (L := L) a) = + a.finite w := by + apply + (Algebra.TensorProduct.basis + (w.adicCompletion K) + (relativeExtensionBasis + (K := K) (L := L))).repr.injective + apply Finsupp.ext + intro i + rw [relativeAdeleFiniteComponent_basis_repr] + have h := + relativeAdeleCoefficient_ofCoefficients + (K := K) (L := L) + (relativeLocalAdeleCoefficient + (K := K) (L := L) a) i + exact congrArg + (fun q : NumberField.AdeleRing (𝓞 K) K => + q.2.1 w) h + +/-- Extract every local tensor component of a relative adele, together +with the restrictedness supplied by its base-adele coefficients. -/ +noncomputable def relativeAdeleToLocalData + (z : RelativeAdeleRing K L) : + RelativeLocalAdeleData (K := K) (L := L) where + infinite w := + relativeAdeleInfiniteComponent + (K := K) (L := L) w z + finite w := + relativeAdeleFiniteComponent + (K := K) (L := L) w z + eventually_integral i := by + filter_upwards [ + (relativeAdeleCoefficient + (K := K) (L := L) z i).2.2] with w hw + rw [relativeAdeleFiniteComponent_basis_repr] + change + (relativeAdeleCoefficient + (K := K) (L := L) z i).2.1 w ∈ + w.adicCompletionIntegers K at hw ⊢ + exact hw + +omit [NumberField L] in +@[simp] +theorem relativeAdeleOfLocalData_toLocalData + (z : RelativeAdeleRing K L) : + relativeAdeleOfLocalData + (K := K) (L := L) + (relativeAdeleToLocalData + (K := K) (L := L) z) = + z := by + apply relativeAdele_ext_of_components + · intro w + rw [relativeAdeleOfLocalData_infiniteComponent + (K := K) (L := L)] + rfl + · intro w + rw [relativeAdeleOfLocalData_finiteComponent + (K := K) (L := L)] + rfl + +omit [NumberField L] in +@[simp] +theorem relativeAdeleToLocalData_ofLocalData + (a : RelativeLocalAdeleData (K := K) (L := L)) : + relativeAdeleToLocalData + (K := K) (L := L) + (relativeAdeleOfLocalData + (K := K) (L := L) a) = + a := by + apply RelativeLocalAdeleData.ext + · funext w + change + relativeAdeleInfiniteComponent + (K := K) (L := L) w + (relativeAdeleOfLocalData + (K := K) (L := L) a) = + a.infinite w + rw [relativeAdeleOfLocalData_infiniteComponent + (K := K) (L := L)] + · funext w + change + relativeAdeleFiniteComponent + (K := K) (L := L) w + (relativeAdeleOfLocalData + (K := K) (L := L) a) = + a.finite w + rw [relativeAdeleOfLocalData_finiteComponent + (K := K) (L := L)] + +/-- Coordinatewise restricted local tensor families are exactly +relative adeles. -/ +noncomputable def relativeAdeleEquivLocalData : + RelativeAdeleRing K L ≃ + RelativeLocalAdeleData (K := K) (L := L) where + toFun := + relativeAdeleToLocalData (K := K) (L := L) + invFun := + relativeAdeleOfLocalData (K := K) (L := L) + left_inv := + relativeAdeleOfLocalData_toLocalData + (K := K) (L := L) + right_inv := + relativeAdeleToLocalData_ofLocalData + (K := K) (L := L) + +/-- A restricted family of local tensor units. Restrictedness is +required both for the family and for its pointwise inverse. -/ +structure RelativeLocalIdeleData where + /-- The family of archimedean local tensor units. -/ + infinite : + ∀ w : InfinitePlace K, + (w.Completion ⊗[K] L)ˣ + /-- The family of finite local tensor units. -/ + finite : + ∀ w : HeightOneSpectrum (𝓞 K), + (w.adicCompletion K ⊗[K] L)ˣ + /-- Every chosen-basis coefficient of the finite family is integral + at all but finitely many places. -/ + eventually_integral : + ∀ i : RelativeAdeleBasisIndex (K := K) (L := L), + ∀ᶠ w : HeightOneSpectrum (𝓞 K) in Filter.cofinite, + (Algebra.TensorProduct.basis + (w.adicCompletion K) + (relativeExtensionBasis + (K := K) (L := L))).repr + (finite w : w.adicCompletion K ⊗[K] L) i ∈ + w.adicCompletionIntegers K + /-- Every chosen-basis coefficient of the pointwise inverse finite + family is integral at all but finitely many places. -/ + eventually_inverse_integral : + ∀ i : RelativeAdeleBasisIndex (K := K) (L := L), + ∀ᶠ w : HeightOneSpectrum (𝓞 K) in Filter.cofinite, + (Algebra.TensorProduct.basis + (w.adicCompletion K) + (relativeExtensionBasis + (K := K) (L := L))).repr + (↑((finite w)⁻¹) : + w.adicCompletion K ⊗[K] L) i ∈ + w.adicCompletionIntegers K + +omit [NumberField L] in +@[ext] +theorem RelativeLocalIdeleData.ext + {a b : RelativeLocalIdeleData (K := K) (L := L)} + (hinfinite : a.infinite = b.infinite) + (hfinite : a.finite = b.finite) : + a = b := by + cases a + cases b + simp_all + +/-- Forget local invertibility while retaining the value family. -/ +noncomputable def RelativeLocalIdeleData.value + (a : RelativeLocalIdeleData (K := K) (L := L)) : + RelativeLocalAdeleData (K := K) (L := L) where + infinite w := a.infinite w + finite w := a.finite w + eventually_integral := a.eventually_integral + +/-- The pointwise inverse family as restricted local adele data. -/ +noncomputable def RelativeLocalIdeleData.inverse + (a : RelativeLocalIdeleData (K := K) (L := L)) : + RelativeLocalAdeleData (K := K) (L := L) where + infinite w := + (↑((a.infinite w)⁻¹) : + w.Completion ⊗[K] L) + finite w := + (↑((a.finite w)⁻¹) : + w.adicCompletion K ⊗[K] L) + eventually_integral := a.eventually_inverse_integral + +/-- Extract the complete restricted local-unit family of a relative +idele. -/ +noncomputable def relativeIdeleToLocalData + (z : RelativeIdeleGroup K L) : + RelativeLocalIdeleData (K := K) (L := L) where + infinite w := + RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) w z + finite w := + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w z + eventually_integral i := by + filter_upwards [ + (relativeAdeleCoefficient + (K := K) (L := L) + (z : RelativeAdeleRing K L) i).2.2] with w hw + rw [RelativeIdeleGroup.finiteComponent_coe, + relativeAdeleFiniteComponent_basis_repr] + change + (relativeAdeleCoefficient + (K := K) (L := L) + (z : RelativeAdeleRing K L) i).2.1 w ∈ + w.adicCompletionIntegers K at hw ⊢ + exact hw + eventually_inverse_integral i := by + filter_upwards [ + (relativeAdeleCoefficient + (K := K) (L := L) + ((z⁻¹ : RelativeIdeleGroup K L) : + RelativeAdeleRing K L) i).2.2] with w hw + rw [← map_inv + (RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w) z, + RelativeIdeleGroup.finiteComponent_coe, + relativeAdeleFiniteComponent_basis_repr] + change + (relativeAdeleCoefficient + (K := K) (L := L) + ((z⁻¹ : RelativeIdeleGroup K L) : + RelativeAdeleRing K L) i).2.1 w ∈ + w.adicCompletionIntegers K at hw ⊢ + exact hw + +/-- Assemble a restricted local-unit family into a relative idele. -/ +noncomputable def relativeIdeleOfLocalData + (a : RelativeLocalIdeleData (K := K) (L := L)) : + RelativeIdeleGroup K L := by + let x := + relativeAdeleOfLocalData + (K := K) (L := L) a.value + let y := + relativeAdeleOfLocalData + (K := K) (L := L) a.inverse + have hxy : x * y = 1 := by + apply relativeAdele_ext_of_components + · intro w + rw [map_mul, + relativeAdeleOfLocalData_infiniteComponent, + relativeAdeleOfLocalData_infiniteComponent, + map_one] + change + (((a.infinite w) * (a.infinite w)⁻¹ : + (w.Completion ⊗[K] L)ˣ) : + w.Completion ⊗[K] L) = 1 + simp + · intro w + rw [map_mul, + relativeAdeleOfLocalData_finiteComponent, + relativeAdeleOfLocalData_finiteComponent, + map_one] + change + (((a.finite w) * (a.finite w)⁻¹ : + (w.adicCompletion K ⊗[K] L)ˣ) : + w.adicCompletion K ⊗[K] L) = 1 + simp + exact Units.mkOfMulEqOne x y hxy + +omit [NumberField L] in +@[simp] +theorem relativeIdeleOfLocalData_infiniteComponent + (a : RelativeLocalIdeleData (K := K) (L := L)) + (w : InfinitePlace K) : + RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) w + (relativeIdeleOfLocalData + (K := K) (L := L) a) = + a.infinite w := by + apply Units.ext + change + relativeAdeleInfiniteComponent + (K := K) (L := L) w + (relativeAdeleOfLocalData + (K := K) (L := L) a.value) = + (a.infinite w : + w.Completion ⊗[K] L) + rw [relativeAdeleOfLocalData_infiniteComponent] + change + (↑(a.infinite w) : + w.Completion ⊗[K] L) = + (↑(a.infinite w) : + w.Completion ⊗[K] L) + rfl + +omit [NumberField L] in +@[simp] +theorem relativeIdeleOfLocalData_finiteComponent + (a : RelativeLocalIdeleData (K := K) (L := L)) + (w : HeightOneSpectrum (𝓞 K)) : + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w + (relativeIdeleOfLocalData + (K := K) (L := L) a) = + a.finite w := by + apply Units.ext + change + relativeAdeleFiniteComponent + (K := K) (L := L) w + (relativeAdeleOfLocalData + (K := K) (L := L) a.value) = + (a.finite w : + w.adicCompletion K ⊗[K] L) + rw [relativeAdeleOfLocalData_finiteComponent] + change + (↑(a.finite w) : + w.adicCompletion K ⊗[K] L) = + (↑(a.finite w) : + w.adicCompletion K ⊗[K] L) + rfl + +omit [NumberField L] in +@[simp] +theorem relativeIdeleOfLocalData_toLocalData + (z : RelativeIdeleGroup K L) : + relativeIdeleOfLocalData + (K := K) (L := L) + (relativeIdeleToLocalData + (K := K) (L := L) z) = + z := by + apply relativeIdeleLocalComponents_injective + apply Prod.ext + · funext w + change + RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) w + (relativeIdeleOfLocalData + (K := K) (L := L) + (relativeIdeleToLocalData + (K := K) (L := L) z)) = + RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) w z + rw [relativeIdeleOfLocalData_infiniteComponent + (K := K) (L := L)] + rfl + · funext w + change + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w + (relativeIdeleOfLocalData + (K := K) (L := L) + (relativeIdeleToLocalData + (K := K) (L := L) z)) = + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w z + rw [relativeIdeleOfLocalData_finiteComponent + (K := K) (L := L)] + rfl + +omit [NumberField L] in +@[simp] +theorem relativeIdeleToLocalData_ofLocalData + (a : RelativeLocalIdeleData (K := K) (L := L)) : + relativeIdeleToLocalData + (K := K) (L := L) + (relativeIdeleOfLocalData + (K := K) (L := L) a) = + a := by + apply RelativeLocalIdeleData.ext + · funext w + change + RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) w + (relativeIdeleOfLocalData + (K := K) (L := L) a) = + a.infinite w + rw [relativeIdeleOfLocalData_infiniteComponent + (K := K) (L := L)] + · funext w + change + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w + (relativeIdeleOfLocalData + (K := K) (L := L) a) = + a.finite w + rw [relativeIdeleOfLocalData_finiteComponent + (K := K) (L := L)] + +/-- The relative idele group is exactly the coordinate-restricted +product of all local tensor unit groups. -/ +noncomputable def relativeIdeleEquivLocalData : + RelativeIdeleGroup K L ≃ + RelativeLocalIdeleData (K := K) (L := L) where + toFun := + relativeIdeleToLocalData (K := K) (L := L) + invFun := + relativeIdeleOfLocalData (K := K) (L := L) + left_inv := + relativeIdeleOfLocalData_toLocalData + (K := K) (L := L) + right_inv := + relativeIdeleToLocalData_ofLocalData + (K := K) (L := L) + +/-- The group structure on the restricted local product, transported +through its proved equivalence with the relative idele group. -/ +noncomputable instance relativeLocalIdeleDataGroup : + Group + (RelativeLocalIdeleData + (K := K) (L := L)) := + (relativeIdeleEquivLocalData + (K := K) (L := L)).symm.group + +/-- The restricted local-product equivalence as a multiplicative +equivalence. -/ +noncomputable def relativeIdeleMulEquivLocalData : + RelativeIdeleGroup K L ≃* + RelativeLocalIdeleData (K := K) (L := L) := + ((relativeIdeleEquivLocalData + (K := K) (L := L)).symm.mulEquiv).symm + +omit [NumberField L] in +@[simp] +theorem relativeIdeleMulEquivLocalData_apply + (z : RelativeIdeleGroup K L) : + relativeIdeleMulEquivLocalData + (K := K) (L := L) z = + relativeIdeleToLocalData + (K := K) (L := L) z := + rfl + +omit [NumberField L] in +@[simp] +theorem RelativeLocalIdeleData.infinite_mul + (a b : RelativeLocalIdeleData (K := K) (L := L)) + (w : InfinitePlace K) : + (a * b).infinite w = + a.infinite w * b.infinite w := by + change + (relativeIdeleToLocalData + (K := K) (L := L) + (relativeIdeleOfLocalData + (K := K) (L := L) a * + relativeIdeleOfLocalData + (K := K) (L := L) b)).infinite w = + a.infinite w * b.infinite w + change + RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) w + (relativeIdeleOfLocalData + (K := K) (L := L) a * + relativeIdeleOfLocalData + (K := K) (L := L) b) = + a.infinite w * b.infinite w + rw [map_mul, + relativeIdeleOfLocalData_infiniteComponent, + relativeIdeleOfLocalData_infiniteComponent] + +omit [NumberField L] in +@[simp] +theorem RelativeLocalIdeleData.finite_mul + (a b : RelativeLocalIdeleData (K := K) (L := L)) + (w : HeightOneSpectrum (𝓞 K)) : + (a * b).finite w = + a.finite w * b.finite w := by + change + (relativeIdeleToLocalData + (K := K) (L := L) + (relativeIdeleOfLocalData + (K := K) (L := L) a * + relativeIdeleOfLocalData + (K := K) (L := L) b)).finite w = + a.finite w * b.finite w + change + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w + (relativeIdeleOfLocalData + (K := K) (L := L) a * + relativeIdeleOfLocalData + (K := K) (L := L) b) = + a.finite w * b.finite w + rw [map_mul, + relativeIdeleOfLocalData_finiteComponent, + relativeIdeleOfLocalData_finiteComponent] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean new file mode 100644 index 0000000000..2bf2525fc6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean @@ -0,0 +1,1133 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.BaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison +/-! +# Scalar extension from relative to ordinary adeles + +This file upgrades the relative-to-ordinary idele comparison to the +underlying adele rings. The additive structure is needed to transport +determinant norms in a field tower. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct RestrictedProduct +open NumberField IsDedekindDomain + +noncomputable +section + + +open AlgebraicNumberTheory.Valuations + +universe u v + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +/-- The finite local tensor algebra, decomposed into the concrete adic +completions above the chosen base place. -/ +noncomputable def finitePlaceTensorRingEquivAboveAdic + (w : HeightOneSpectrum (𝓞 K)) : + (w.adicCompletion K ⊗[K] L) ≃+* + ∀ W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}, + W.1.adicCompletion L := by + let vK := HeightOneSpectrum.adicAbv K w + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial w + letI : ∀ u : AbsoluteValueExtension vK L, + Algebra vK.Completion u.1.Completion := + fun u => + AbsoluteValue.completionAlgebra vK u.1 u.2 + let e₁ : + (w.adicCompletion K ⊗[K] L) ≃+* + (∀ u : AbsoluteValueExtension vK L, + u.1.Completion) := + (relativeFinitePlaceLocalTensorAlgEquiv + (K := K) (L := L) w).symm.toRingEquiv.trans + (completionTensorDecompositionLeft + (K := K) (L := L) vK hvK).toRingEquiv + let e₂ : + (∀ u : AbsoluteValueExtension vK L, + u.1.Completion) ≃+* + (∀ u : AbsoluteValueExtension vK L, + (finitePlaceExtensionCentre + (K := K) (L := L) w u).adicCompletion L) := + RingEquiv.piCongrRight fun u => + finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) w u + let e₃ : + (∀ u : AbsoluteValueExtension vK L, + (finitePlaceExtensionCentre + (K := K) (L := L) w u).adicCompletion L) ≃+* + (∀ W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}, + W.1.adicCompletion L) := + RingEquiv.piCongrLeft + (fun W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w} => + W.1.adicCompletion L) + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w) + exact e₁.trans (e₂.trans e₃) + +/-- Evaluation of the finite-place tensor equivalence at an extension of +the given adic absolute value. -/ +@[simp] +theorem finitePlaceTensorRingEquivAboveAdic_apply_extension + (w : HeightOneSpectrum (𝓞 K)) + (x : w.adicCompletion K ⊗[K] L) + (u : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L) : + finitePlaceTensorRingEquivAboveAdic + (K := K) (L := L) w x + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w u) = + finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) w u + (finitePlaceLocalTensorDecompositionComponent + (K := K) (L := L) w u x) := by + let P := + fun W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w} => + W.1.adicCompletion L + let e := finitePlaceExtensionEquivAbove (K := K) (L := L) w + let f : ∀ a, P (e a) := fun a => + finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) w a + (finitePlaceLocalTensorDecompositionComponent + (K := K) (L := L) w a x) + exact Equiv.piCongrLeft_apply_apply P e f u + +/-- On a pure tensor, the finite-place relative-to-ordinary comparison +is the canonical completion map on the local coefficient multiplied by +the diagonal image of the extension-field factor. -/ +theorem finitePlaceTensorRingEquivAboveAdic_tmul + (w : HeightOneSpectrum (𝓞 K)) + (W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}) + (a : w.adicCompletion K) + (x : L) : + finitePlaceTensorRingEquivAboveAdic + (K := K) (L := L) w + (a ⊗ₜ[K] x) W = + finitePlaceAdicCompletionMap K L w W a * + algebraMap L (W.1.adicCompletion L) x := by + obtain ⟨u, rfl⟩ := + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w).surjective W + rw [finitePlaceTensorRingEquivAboveAdic_apply_extension, + finitePlaceLocalTensorDecompositionComponent_tmul, map_mul] + change + finitePlaceExtensionAdicCompletionMap K L w u a * + finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) w u + (AbsoluteValue.toCompletion u.1 x) = + _ + rw [ + finitePlaceExtensionAdicCompletionMap_eq_finitePlaceAdicCompletionMap, + finitePlaceExtensionAdicCompletionRingEquiv_toCompletion] + rfl + +/-- Reindex the archimedean relative-tensor product by concrete places +above `w`, before replacing the completion wrappers. -/ +noncomputable def infiniteCompletionRingProductReindexAbove + (w : InfinitePlace K) : + (∀ u : AbsoluteValueExtension w.1 L, + u.1.Completion) ≃+* + ∀ W : {W : InfinitePlace L // + infinitePlaceBelow (K := K) W = w}, + W.1.1.Completion := by + let e := + Equiv.piCongrLeft' + (fun u : AbsoluteValueExtension w.1 L => + u.1.Completion) + (infinitePlaceAboveEquivExtension + (K := K) (L := L) w).symm + exact + { e with + map_add' := by + intro x y + funext W + rfl + map_mul' := by + intro x y + funext W + rfl } + +/-- The archimedean local tensor algebra, decomposed into the concrete +infinite completions above the chosen base place. -/ +noncomputable def infinitePlaceTensorRingEquivAbove + (w : InfinitePlace K) : + (w.Completion ⊗[K] L) ≃+* + ∀ W : {W : InfinitePlace L // + infinitePlaceBelow (K := K) W = w}, + W.1.Completion := by + letI : ∀ u : AbsoluteValueExtension w.1 L, + Algebra w.1.Completion u.1.Completion := + fun u => + AbsoluteValue.completionAlgebra w.1 u.1 u.2 + exact + (infinitePlaceLocalTensorAlgEquiv + (K := K) (L := L) w).toRingEquiv.trans + ((completionTensorDecompositionLeft + (K := K) (L := L) w.1 + w.isNontrivial).toRingEquiv.trans + ((infiniteCompletionRingProductReindexAbove + (K := K) (L := L) w).trans + (RingEquiv.piCongrRight fun W => + (InfinitePlace.Completion.equiv W.1).symm))) + +/-- Evaluation of the infinite-place tensor equivalence at a place above +the chosen base place. -/ +@[simp] +theorem infinitePlaceTensorRingEquivAbove_apply + (w : InfinitePlace K) + (z : w.Completion ⊗[K] L) + (W : {W : InfinitePlace L // + infinitePlaceBelow (K := K) W = w}) : + infinitePlaceTensorRingEquivAbove + (K := K) (L := L) w z W = + (InfinitePlace.Completion.equiv W.1).symm + (completionTensorDecompositionLeft + w.1 w.isNontrivial + (infinitePlaceLocalTensorAlgEquiv + (K := K) (L := L) w z) + (infinitePlaceAboveEquivExtension + (K := K) (L := L) w W)) := + rfl + +/-- On a pure tensor, the infinite-place relative-to-ordinary comparison +is the canonical completion map on the local coefficient multiplied by +the diagonal image of the extension-field factor. -/ +theorem infinitePlaceTensorRingEquivAbove_tmul + (w : InfinitePlace K) + (W : {W : InfinitePlace L // + infinitePlaceBelow (K := K) W = w}) + (a : w.Completion) + (x : L) : + letI : W.1.1.LiesOver w.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) W.2⟩ + infinitePlaceTensorRingEquivAbove + (K := K) (L := L) w + (a ⊗ₜ[K] x) W = + NumberField.LiesOver.completionMap + (v := w) (w := W.1) a * + algebraMap L W.1.Completion x := by + let : W.1.1.LiesOver w.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) W.2⟩ + rw [infinitePlaceTensorRingEquivAbove_apply] + change + (InfinitePlace.Completion.equiv W.1).symm + (completionTensorDecompositionLeft + w.1 w.isNontrivial + ((infinitePlaceCompletionAlgEquiv w a) ⊗ₜ[K] x) + (infinitePlaceAboveToExtension + (K := K) (L := L) w W)) = + NumberField.LiesOver.completionMap + (v := w) (w := W.1) a * + algebraMap L W.1.Completion x + dsimp only [infinitePlaceAboveToExtension] + rw [completionTensorDecomposition_left_tmul_apply, map_mul] + congr 1 + apply InfinitePlace.Completion.ext + exact DFunLike.congr_fun + (infinitePlaceCompletionAlgEquiv_algebraMap + (K := K) (L := L) w W.1 W.2) a + +/-- Flatten the products over finite base places and places above them +to the product over all finite places of the extension field. -/ +noncomputable def finitePlaceAbovePiRingEquiv : + (∀ w : HeightOneSpectrum (𝓞 K), + ∀ W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}, + W.1.adicCompletion L) ≃+* + ∀ W : HeightOneSpectrum (𝓞 L), + W.adicCompletion L where + toFun f W := + f (finitePlaceBelow (K := K) W) ⟨W, rfl⟩ + invFun f w W := f W.1 + left_inv f := by + funext w W + rcases W with ⟨W, hW⟩ + subst w + rfl + right_inv f := by + funext W + rfl + map_add' f g := by + funext W + rfl + map_mul' f g := by + funext W + rfl + +/-- All finite local tensor rings, flattened to the concrete finite +completion family of the extension field. -/ +noncomputable def relativeFiniteTensorPiRingEquiv : + (∀ w : HeightOneSpectrum (𝓞 K), + w.adicCompletion K ⊗[K] L) ≃+* + ∀ W : HeightOneSpectrum (𝓞 L), + W.adicCompletion L := + (RingEquiv.piCongrRight fun w => + finitePlaceTensorRingEquivAboveAdic + (K := K) (L := L) w).trans + (finitePlaceAbovePiRingEquiv (K := K) (L := L)) + +/-- Coordinate formula for the relative finite tensor product +equivalence. -/ +@[simp] +theorem relativeFiniteTensorPiRingEquiv_apply + (x : ∀ w : HeightOneSpectrum (𝓞 K), + w.adicCompletion K ⊗[K] L) + (W : HeightOneSpectrum (𝓞 L)) : + relativeFiniteTensorPiRingEquiv + (K := K) (L := L) x W = + finitePlaceTensorRingEquivAboveAdic + (K := K) (L := L) + (finitePlaceBelow (K := K) W) + (x (finitePlaceBelow (K := K) W)) ⟨W, rfl⟩ := + rfl + +/-- Coordinate formula for the inverse relative finite tensor product +equivalence. -/ +@[simp] +theorem relativeFiniteTensorPiRingEquiv_symm_apply + (y : ∀ W : HeightOneSpectrum (𝓞 L), + W.adicCompletion L) + (w : HeightOneSpectrum (𝓞 K)) : + (relativeFiniteTensorPiRingEquiv + (K := K) (L := L)).symm y w = + (finitePlaceTensorRingEquivAboveAdic + (K := K) (L := L) w).symm + (fun W => y W.1) := + rfl + +/-- Flatten the products over infinite base places and places above +them to the product over all infinite places of the extension field. -/ +noncomputable def infinitePlaceAbovePiRingEquiv : + (∀ w : InfinitePlace K, + ∀ W : {W : InfinitePlace L // + infinitePlaceBelow (K := K) W = w}, + W.1.Completion) ≃+* + ∀ W : InfinitePlace L, W.Completion where + toFun f W := + f (infinitePlaceBelow (K := K) W) ⟨W, rfl⟩ + invFun f w W := f W.1 + left_inv f := by + funext w W + rcases W with ⟨W, hW⟩ + subst w + rfl + right_inv f := by + funext W + rfl + map_add' f g := by + funext W + rfl + map_mul' f g := by + funext W + rfl + +/-- All infinite local tensor rings, flattened to the concrete infinite +completion family of the extension field. -/ +noncomputable def relativeInfiniteTensorPiRingEquiv : + (∀ w : InfinitePlace K, + w.Completion ⊗[K] L) ≃+* + ∀ W : InfinitePlace L, W.Completion := + (RingEquiv.piCongrRight fun w => + infinitePlaceTensorRingEquivAbove + (K := K) (L := L) w).trans + (infinitePlaceAbovePiRingEquiv (K := K) (L := L)) + +/-- Coordinate formula for the relative infinite tensor product +equivalence. -/ +@[simp] +theorem relativeInfiniteTensorPiRingEquiv_apply + (x : ∀ w : InfinitePlace K, + w.Completion ⊗[K] L) + (W : InfinitePlace L) : + relativeInfiniteTensorPiRingEquiv + (K := K) (L := L) x W = + infinitePlaceTensorRingEquivAbove + (K := K) (L := L) + (infinitePlaceBelow (K := K) W) + (x (infinitePlaceBelow (K := K) W)) ⟨W, rfl⟩ := + rfl + +/-- Coordinate formula for the inverse relative infinite tensor product +equivalence. -/ +@[simp] +theorem relativeInfiniteTensorPiRingEquiv_symm_apply + (y : ∀ W : InfinitePlace L, W.Completion) + (w : InfinitePlace K) : + (relativeInfiniteTensorPiRingEquiv + (K := K) (L := L)).symm y w = + (infinitePlaceTensorRingEquivAbove + (K := K) (L := L) w).symm + (fun W => y W.1) := + rfl + +/-- Integrality in the relative-tensor factors is exactly integrality +of every concrete finite completion coordinate. -/ +theorem relativeLocalTensorDecompositionIntegralAt_iff_aboveAdicRing + (w : HeightOneSpectrum (𝓞 K)) + (x : w.adicCompletion K ⊗[K] L) : + RelativeLocalTensorDecompositionIntegralAt + (K := K) (L := L) w x ↔ + ∀ W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}, + finitePlaceTensorRingEquivAboveAdic + (K := K) (L := L) w x W ∈ + W.1.adicCompletionIntegers L := by + constructor + · intro hx W + let u := + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w).symm W + have hW : + finitePlaceExtensionEquivAbove + (K := K) (L := L) w u = W := + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w).apply_symm_apply W + rw [← hW, + finitePlaceTensorRingEquivAboveAdic_apply_extension] + exact + (finitePlaceExtensionAdicCompletionRingEquiv_mem_integers_iff + (K := K) (L := L) w u _).2 (hx u) + · intro hx u + have h := + hx (finitePlaceExtensionEquivAbove + (K := K) (L := L) w u) + rw [finitePlaceTensorRingEquivAboveAdic_apply_extension] at h + exact + (finitePlaceExtensionAdicCompletionRingEquiv_mem_integers_iff + (K := K) (L := L) w u _).1 h + +omit [NumberField L] in +/-- Outside its coefficient support, a relative adele finite component +belongs to the fixed local basis lattice. -/ +theorem relativeAdele_finiteComponent_basisIntegral_of_notMem + (z : RelativeAdeleRing K L) + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ relativeAdeleCoefficientSupport + (K := K) (L := L) z) : + RelativeBasisIntegralAt + (K := K) (L := L) w + (relativeAdeleFiniteComponent + (K := K) (L := L) w z) := by + let c : + ∀ i : RelativeAdeleBasisIndex (K := K) (L := L), + w.adicCompletionIntegers K := + fun i => + ⟨(relativeAdeleCoefficient + (K := K) (L := L) z i).2 w, by + by_contra hi + apply hw + exact + (mem_relativeAdeleCoefficientSupport_iff + (K := K) (L := L) z w).2 ⟨i, hi⟩⟩ + refine ⟨c, ?_⟩ + simpa only [c, Subtype.coe_mk] using + relativeAdeleFiniteComponent_eq_sum_tmul_coefficients + (K := K) (L := L) z w + +/-- A relative adele becomes integral in every concrete completion +above almost every finite base place. -/ +theorem relativeAdele_eventually_aboveAdicIntegral + (z : RelativeAdeleRing K L) : + ∀ᶠ w : HeightOneSpectrum (𝓞 K) in Filter.cofinite, + ∀ W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}, + finitePlaceTensorRingEquivAboveAdic + (K := K) (L := L) w + (relativeAdeleFiniteComponent + (K := K) (L := L) w z) W ∈ + W.1.adicCompletionIntegers L := by + classical + filter_upwards [ + (relativeAdeleCoefficientSupport + (K := K) (L := L) z).eventually_cofinite_notMem, + (integralTensorComparisonBadPlaces + (K := K) (L := L)).eventually_cofinite_notMem] with w hs hbad + apply + (relativeLocalTensorDecompositionIntegralAt_iff_aboveAdicRing + (K := K) (L := L) w _).1 + apply + (relativeBasisIntegralAt_iff_localTensorDecompositionIntegral_of_notMem + (K := K) (L := L) w hbad).1 + exact relativeAdele_finiteComponent_basisIntegral_of_notMem + (K := K) (L := L) z w hs + +/-- The forward ring-level scalar-extension map on adeles. -/ +noncomputable def relativeAdeleToAdele + (z : RelativeAdeleRing K L) : + NumberField.AdeleRing (𝓞 L) L := + ⟨relativeInfiniteTensorPiRingEquiv + (K := K) (L := L) + (fun w => + relativeAdeleInfiniteComponent + (K := K) (L := L) w z), + ⟨relativeFiniteTensorPiRingEquiv + (K := K) (L := L) + (fun w => + relativeAdeleFiniteComponent + (K := K) (L := L) w z), + (eventually_finitePlace_iff_eventually_all_above + (K := K) (L := L) + (fun W => + relativeFiniteTensorPiRingEquiv + (K := K) (L := L) + (fun w => + relativeAdeleFiniteComponent + (K := K) (L := L) w z) W ∈ + W.adicCompletionIntegers L)).2 <| by + filter_upwards [ + relativeAdele_eventually_aboveAdicIntegral + (K := K) (L := L) z] with w hw + intro W + rcases W with ⟨W, hW⟩ + subst w + exact hw ⟨W, rfl⟩⟩⟩ + +/-- The infinite component of the underlying adele of a relative adele. -/ +@[simp] +theorem relativeAdeleToAdele_infinite + (z : RelativeAdeleRing K L) + (W : InfinitePlace L) : + (relativeAdeleToAdele + (K := K) (L := L) z).1 W = + infinitePlaceTensorRingEquivAbove + (K := K) (L := L) + (infinitePlaceBelow (K := K) W) + (relativeAdeleInfiniteComponent + (K := K) (L := L) + (infinitePlaceBelow (K := K) W) z) ⟨W, rfl⟩ := + rfl + +/-- The finite component of the underlying adele of a relative adele. -/ +@[simp] +theorem relativeAdeleToAdele_finite + (z : RelativeAdeleRing K L) + (W : HeightOneSpectrum (𝓞 L)) : + (relativeAdeleToAdele + (K := K) (L := L) z).2 W = + finitePlaceTensorRingEquivAboveAdic + (K := K) (L := L) + (finitePlaceBelow (K := K) W) + (relativeAdeleFiniteComponent + (K := K) (L := L) + (finitePlaceBelow (K := K) W) z) ⟨W, rfl⟩ := + rfl + +/-- Pull the finite coordinates of an ordinary adele back to the +relative local tensor family. -/ +noncomputable def finiteAdeleRelativeTensorFamily + (y : IsDedekindDomain.FiniteAdeleRing (𝓞 L) L) : + ∀ w : HeightOneSpectrum (𝓞 K), + w.adicCompletion K ⊗[K] L := + (relativeFiniteTensorPiRingEquiv + (K := K) (L := L)).symm (fun W => y W) + +/-- The pulled-back finite tensor family is basis-integral at almost +every finite place. -/ +theorem finiteAdeleRelativeTensorFamily_eventually_basisIntegral + (y : IsDedekindDomain.FiniteAdeleRing (𝓞 L) L) : + ∀ᶠ w : HeightOneSpectrum (𝓞 K) in Filter.cofinite, + RelativeBasisIntegralAt + (K := K) (L := L) w + (finiteAdeleRelativeTensorFamily + (K := K) (L := L) y w) := by + have habove : + ∀ᶠ w : HeightOneSpectrum (𝓞 K) in Filter.cofinite, + ∀ W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}, + y W.1 ∈ W.1.adicCompletionIntegers L := + (eventually_finitePlace_iff_eventually_all_above + (K := K) (L := L) + (fun W => y W ∈ W.adicCompletionIntegers L)).1 y.2 + filter_upwards [ + habove, + (integralTensorComparisonBadPlaces + (K := K) (L := L)).eventually_cofinite_notMem] with w hw hbad + apply + (relativeBasisIntegralAt_iff_localTensorDecompositionIntegral_of_notMem + (K := K) (L := L) w hbad).2 + apply + (relativeLocalTensorDecompositionIntegralAt_iff_aboveAdicRing + (K := K) (L := L) w _).2 + intro W + have hcomponent := + congrFun + ((finitePlaceTensorRingEquivAboveAdic + (K := K) (L := L) w).apply_symm_apply + (fun W => y W.1)) W + rw [finiteAdeleRelativeTensorFamily, + relativeFiniteTensorPiRingEquiv_symm_apply, + hcomponent] + exact hw W + +/-- Pull an ordinary adele back to restricted relative local data. -/ +noncomputable def adeleToRelativeLocalAdeleData + (y : NumberField.AdeleRing (𝓞 L) L) : + RelativeLocalAdeleData (K := K) (L := L) where + infinite := + (relativeInfiniteTensorPiRingEquiv + (K := K) (L := L)).symm (fun W => y.1 W) + finite := + finiteAdeleRelativeTensorFamily + (K := K) (L := L) y.2 + eventually_integral i := + (finiteAdeleRelativeTensorFamily_eventually_basisIntegral + (K := K) (L := L) y.2).mono fun w hw => + relativeBasisIntegralAt_repr_mem + (K := K) (L := L) w _ hw i + +/-- The inverse ring-level scalar-extension map on adeles. -/ +noncomputable def adeleToRelativeAdele + (y : NumberField.AdeleRing (𝓞 L) L) : + RelativeAdeleRing K L := + relativeAdeleOfLocalData + (K := K) (L := L) + (adeleToRelativeLocalAdeleData + (K := K) (L := L) y) + +/-- The infinite component of the relative adele reconstructed from an +ordinary adele. -/ +@[simp] +theorem adeleToRelativeAdele_infiniteComponent + (y : NumberField.AdeleRing (𝓞 L) L) + (w : InfinitePlace K) : + relativeAdeleInfiniteComponent + (K := K) (L := L) w + (adeleToRelativeAdele + (K := K) (L := L) y) = + (relativeInfiniteTensorPiRingEquiv + (K := K) (L := L)).symm + (fun W => y.1 W) w := by + rw [adeleToRelativeAdele, + relativeAdeleOfLocalData_infiniteComponent] + rfl + +/-- The finite component of the relative adele reconstructed from an +ordinary adele. -/ +@[simp] +theorem adeleToRelativeAdele_finiteComponent + (y : NumberField.AdeleRing (𝓞 L) L) + (w : HeightOneSpectrum (𝓞 K)) : + relativeAdeleFiniteComponent + (K := K) (L := L) w + (adeleToRelativeAdele + (K := K) (L := L) y) = + (relativeFiniteTensorPiRingEquiv + (K := K) (L := L)).symm + (fun W => y.2 W) w := by + rw [adeleToRelativeAdele, + relativeAdeleOfLocalData_finiteComponent] + rfl + +/-- Scalar extension of relative adeles preserves addition componentwise. -/ +private theorem relativeAdeleToAdele_map_add (x y : RelativeAdeleRing K L) : + relativeAdeleToAdele (K := K) (L := L) (x + y) = + relativeAdeleToAdele (K := K) (L := L) x + + relativeAdeleToAdele (K := K) (L := L) y := by + apply Prod.ext + · funext W + change + relativeInfiniteTensorPiRingEquiv + (K := K) (L := L) + (fun w => + relativeAdeleInfiniteComponent + (K := K) (L := L) w (x + y)) W = + relativeInfiniteTensorPiRingEquiv + (K := K) (L := L) + (fun w => + relativeAdeleInfiniteComponent + (K := K) (L := L) w x) W + + relativeInfiniteTensorPiRingEquiv + (K := K) (L := L) + (fun w => + relativeAdeleInfiniteComponent + (K := K) (L := L) w y) W + rw [show + (fun w => + relativeAdeleInfiniteComponent + (K := K) (L := L) w (x + y)) = + (fun w => + relativeAdeleInfiniteComponent + (K := K) (L := L) w x) + + (fun w => + relativeAdeleInfiniteComponent + (K := K) (L := L) w y) by + funext w + exact map_add _ _ _, + map_add] + rfl + · apply Subtype.ext + funext W + change + relativeFiniteTensorPiRingEquiv + (K := K) (L := L) + (fun w => + relativeAdeleFiniteComponent + (K := K) (L := L) w (x + y)) W = + relativeFiniteTensorPiRingEquiv + (K := K) (L := L) + (fun w => + relativeAdeleFiniteComponent + (K := K) (L := L) w x) W + + relativeFiniteTensorPiRingEquiv + (K := K) (L := L) + (fun w => + relativeAdeleFiniteComponent + (K := K) (L := L) w y) W + rw [show + (fun w => + relativeAdeleFiniteComponent + (K := K) (L := L) w (x + y)) = + (fun w => + relativeAdeleFiniteComponent + (K := K) (L := L) w x) + + (fun w => + relativeAdeleFiniteComponent + (K := K) (L := L) w y) by + funext w + exact map_add _ _ _, + map_add] + rfl + +/-- Scalar extension of relative adeles preserves multiplication componentwise. -/ +private theorem relativeAdeleToAdele_map_mul (x y : RelativeAdeleRing K L) : + relativeAdeleToAdele (K := K) (L := L) (x * y) = + relativeAdeleToAdele (K := K) (L := L) x * + relativeAdeleToAdele (K := K) (L := L) y := by + apply Prod.ext + · funext W + change + relativeInfiniteTensorPiRingEquiv + (K := K) (L := L) + (fun w => + relativeAdeleInfiniteComponent + (K := K) (L := L) w (x * y)) W = + relativeInfiniteTensorPiRingEquiv + (K := K) (L := L) + (fun w => + relativeAdeleInfiniteComponent + (K := K) (L := L) w x) W * + relativeInfiniteTensorPiRingEquiv + (K := K) (L := L) + (fun w => + relativeAdeleInfiniteComponent + (K := K) (L := L) w y) W + rw [show + (fun w => + relativeAdeleInfiniteComponent + (K := K) (L := L) w (x * y)) = + (fun w => + relativeAdeleInfiniteComponent + (K := K) (L := L) w x) * + (fun w => + relativeAdeleInfiniteComponent + (K := K) (L := L) w y) by + funext w + exact map_mul _ _ _, + map_mul] + rfl + · apply Subtype.ext + funext W + change + relativeFiniteTensorPiRingEquiv + (K := K) (L := L) + (fun w => + relativeAdeleFiniteComponent + (K := K) (L := L) w (x * y)) W = + relativeFiniteTensorPiRingEquiv + (K := K) (L := L) + (fun w => + relativeAdeleFiniteComponent + (K := K) (L := L) w x) W * + relativeFiniteTensorPiRingEquiv + (K := K) (L := L) + (fun w => + relativeAdeleFiniteComponent + (K := K) (L := L) w y) W + rw [show + (fun w => + relativeAdeleFiniteComponent + (K := K) (L := L) w (x * y)) = + (fun w => + relativeAdeleFiniteComponent + (K := K) (L := L) w x) * + (fun w => + relativeAdeleFiniteComponent + (K := K) (L := L) w y) by + funext w + exact map_mul _ _ _, + map_mul] + rfl + +/-- Scalar extension identifies the relative adele ring over `K` with +the ordinary adele ring of `L`. -/ +noncomputable def relativeAdeleBaseChangeRingEquiv : + RelativeAdeleRing K L ≃+* + NumberField.AdeleRing (𝓞 L) L where + toFun := + relativeAdeleToAdele (K := K) (L := L) + invFun := + adeleToRelativeAdele (K := K) (L := L) + left_inv z := by + apply relativeAdele_ext_of_components + · intro w + rw [adeleToRelativeAdele_infiniteComponent] + change + (relativeInfiniteTensorPiRingEquiv + (K := K) (L := L)).symm + (relativeInfiniteTensorPiRingEquiv + (K := K) (L := L) + (fun w => + relativeAdeleInfiniteComponent + (K := K) (L := L) w z)) w = + relativeAdeleInfiniteComponent + (K := K) (L := L) w z + rw [(relativeInfiniteTensorPiRingEquiv + (K := K) (L := L)).symm_apply_apply] + · intro w + rw [adeleToRelativeAdele_finiteComponent] + change + (relativeFiniteTensorPiRingEquiv + (K := K) (L := L)).symm + (relativeFiniteTensorPiRingEquiv + (K := K) (L := L) + (fun w => + relativeAdeleFiniteComponent + (K := K) (L := L) w z)) w = + relativeAdeleFiniteComponent + (K := K) (L := L) w z + rw [(relativeFiniteTensorPiRingEquiv + (K := K) (L := L)).symm_apply_apply] + right_inv y := by + apply Prod.ext + · funext W + rw [relativeAdeleToAdele_infinite, + adeleToRelativeAdele_infiniteComponent] + change + relativeInfiniteTensorPiRingEquiv + (K := K) (L := L) + ((relativeInfiniteTensorPiRingEquiv + (K := K) (L := L)).symm + (fun W => y.1 W)) W = + y.1 W + rw [(relativeInfiniteTensorPiRingEquiv + (K := K) (L := L)).apply_symm_apply] + · apply DFunLike.coe_injective + funext W + change + relativeFiniteTensorPiRingEquiv + (K := K) (L := L) + (fun w => + relativeAdeleFiniteComponent + (K := K) (L := L) w + (adeleToRelativeAdele + (K := K) (L := L) y)) W = + y.2 W + rw [show + (fun w => + relativeAdeleFiniteComponent + (K := K) (L := L) w + (adeleToRelativeAdele + (K := K) (L := L) y)) = + (relativeFiniteTensorPiRingEquiv + (K := K) (L := L)).symm + (fun W => y.2 W) by + funext w + exact adeleToRelativeAdele_finiteComponent + (K := K) (L := L) y w] + rw [(relativeFiniteTensorPiRingEquiv + (K := K) (L := L)).apply_symm_apply] + map_add' := by + exact relativeAdeleToAdele_map_add + map_mul' := by + exact relativeAdeleToAdele_map_mul + +/-- Finite-coordinate formula for scalar extension of a pure relative +adele tensor. -/ +@[simp] +theorem relativeAdeleBaseChangeRingEquiv_finiteComponent_tmul + (a : NumberField.AdeleRing (𝓞 K) K) + (x : L) + (W : HeightOneSpectrum (𝓞 L)) : + (relativeAdeleBaseChangeRingEquiv + (K := K) (L := L) (a ⊗ₜ[K] x)).2 W = + finitePlaceAdicCompletionMap K L + (finitePlaceBelow (K := K) W) ⟨W, rfl⟩ + (a.2 (finitePlaceBelow (K := K) W)) * + algebraMap L (W.adicCompletion L) x := by + change + finitePlaceTensorRingEquivAboveAdic + (K := K) (L := L) + (finitePlaceBelow (K := K) W) + (a.2 (finitePlaceBelow (K := K) W) ⊗ₜ[K] x) + ⟨W, rfl⟩ = + _ + exact + finitePlaceTensorRingEquivAboveAdic_tmul + (K := K) (L := L) + (finitePlaceBelow (K := K) W) ⟨W, rfl⟩ + (a.2 (finitePlaceBelow (K := K) W)) x + +/-- Infinite-coordinate formula for scalar extension of a pure relative +adele tensor. -/ +@[simp] +theorem relativeAdeleBaseChangeRingEquiv_infiniteComponent_tmul + (a : NumberField.AdeleRing (𝓞 K) K) + (x : L) + (W : InfinitePlace L) : + let v := infinitePlaceBelow (K := K) W + letI : W.1.LiesOver v.1 := ⟨rfl⟩ + (relativeAdeleBaseChangeRingEquiv + (K := K) (L := L) (a ⊗ₜ[K] x)).1 W = + NumberField.LiesOver.completionMap + (v := v) (w := W) (a.1 v) * + algebraMap L W.Completion x := by + let v := infinitePlaceBelow (K := K) W + let : W.1.LiesOver v.1 := ⟨rfl⟩ + change + infinitePlaceTensorRingEquivAbove + (K := K) (L := L) v + (a.1 v ⊗ₜ[K] x) ⟨W, rfl⟩ = + NumberField.LiesOver.completionMap + (v := v) (w := W) (a.1 v) * + algebraMap L W.Completion x + exact + infinitePlaceTensorRingEquivAbove_tmul + (K := K) (L := L) v ⟨W, rfl⟩ (a.1 v) x + +/-- A diagonal extension-field element has its expected concrete +finite component under the ring comparison. -/ +theorem finitePlaceTensorRingEquivAboveAdic_tmul_one + (w : HeightOneSpectrum (𝓞 K)) + (W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}) + (x : L) : + finitePlaceTensorRingEquivAboveAdic + (K := K) (L := L) w + ((1 : w.adicCompletion K) ⊗ₜ[K] x) W = + algebraMap L (W.1.adicCompletion L) x := by + obtain ⟨u, rfl⟩ := + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w).surjective W + rw [finitePlaceTensorRingEquivAboveAdic_apply_extension, + finitePlaceLocalTensorDecompositionComponent_tmul] + simp only [map_one, one_mul, + finitePlaceExtensionAdicCompletionRingEquiv_toCompletion] + rfl + +/-- A diagonal extension-field element has its expected concrete +archimedean component under the ring comparison. -/ +theorem infinitePlaceTensorRingEquivAbove_tmul_one + (w : InfinitePlace K) + (W : {W : InfinitePlace L // + infinitePlaceBelow (K := K) W = w}) + (x : L) : + infinitePlaceTensorRingEquivAbove + (K := K) (L := L) w + ((1 : w.Completion) ⊗ₜ[K] x) W = + algebraMap L W.1.Completion x := by + rw [infinitePlaceTensorRingEquivAbove_apply] + change + (InfinitePlace.Completion.equiv W.1).symm + (completionTensorDecompositionLeft + w.1 w.isNontrivial + ((1 : w.1.Completion) ⊗ₜ[K] x) + (infinitePlaceAboveEquivExtension + (K := K) (L := L) w W)) = + algebraMap L W.1.Completion x + rw [completionTensorDecomposition_left_tmul_apply] + simp only [map_one, one_mul] + apply InfinitePlace.Completion.ext + rfl + +/-- The ring comparison carries the diagonal copy of `L` to the +ordinary diagonal adele. -/ +theorem relativeAdeleBaseChangeRingEquiv_fieldInclusion + (x : L) : + relativeAdeleBaseChangeRingEquiv + (K := K) (L := L) + ((1 : NumberField.AdeleRing (𝓞 K) K) ⊗ₜ[K] x) = + algebraMap L (NumberField.AdeleRing (𝓞 L) L) x := by + change + relativeAdeleToAdele + (K := K) (L := L) + ((1 : NumberField.AdeleRing (𝓞 K) K) ⊗ₜ[K] x) = + algebraMap L (NumberField.AdeleRing (𝓞 L) L) x + apply Prod.ext + · funext W + rw [relativeAdeleToAdele_infinite] + change + infinitePlaceTensorRingEquivAbove + (K := K) (L := L) + (infinitePlaceBelow (K := K) W) + ((1 : + (infinitePlaceBelow + (K := K) W).Completion) ⊗ₜ[K] x) + ⟨W, rfl⟩ = + algebraMap L W.Completion x + exact infinitePlaceTensorRingEquivAbove_tmul_one + (K := K) (L := L) + (infinitePlaceBelow (K := K) W) ⟨W, rfl⟩ x + · apply DFunLike.coe_injective + funext W + rw [relativeAdeleToAdele_finite] + change + finitePlaceTensorRingEquivAboveAdic + (K := K) (L := L) + (finitePlaceBelow (K := K) W) + ((1 : + (finitePlaceBelow + (K := K) W).adicCompletion K) ⊗ₜ[K] x) + ⟨W, rfl⟩ = + algebraMap L (W.adicCompletion L) x + exact finitePlaceTensorRingEquivAboveAdic_tmul_one + (K := K) (L := L) + (finitePlaceBelow (K := K) W) ⟨W, rfl⟩ x + +/-- The finite local unit comparison is induced by the corresponding +ring equivalence. -/ +theorem finitePlaceTensorUnitsEquivAboveAdic_coe + (w : HeightOneSpectrum (𝓞 K)) + (x : (w.adicCompletion K ⊗[K] L)ˣ) + (W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}) : + ((finitePlaceTensorUnitsEquivAboveAdic + (K := K) (L := L) w x W : + (W.1.adicCompletion L)ˣ) : + W.1.adicCompletion L) = + finitePlaceTensorRingEquivAboveAdic + (K := K) (L := L) w + (x : w.adicCompletion K ⊗[K] L) W := by + obtain ⟨u, rfl⟩ := + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w).surjective W + rw [finitePlaceTensorUnitsEquivAboveAdic_apply_extension, + finitePlaceTensorRingEquivAboveAdic_apply_extension] + rfl + +/-- The flattened finite unit comparison is induced by the flattened +finite ring comparison. -/ +theorem relativeFiniteTensorPiMulEquiv_coe + (x : ∀ w : HeightOneSpectrum (𝓞 K), + (w.adicCompletion K ⊗[K] L)ˣ) + (W : HeightOneSpectrum (𝓞 L)) : + ((relativeFiniteTensorPiMulEquiv + (K := K) (L := L) x W : + (W.adicCompletion L)ˣ) : + W.adicCompletion L) = + relativeFiniteTensorPiRingEquiv + (K := K) (L := L) + (fun w => + (x w : w.adicCompletion K ⊗[K] L)) W := by + rw [relativeFiniteTensorPiMulEquiv_apply, + relativeFiniteTensorPiRingEquiv_apply] + exact finitePlaceTensorUnitsEquivAboveAdic_coe + (K := K) (L := L) + (finitePlaceBelow (K := K) W) + (x (finitePlaceBelow (K := K) W)) ⟨W, rfl⟩ + +/-- The previously constructed idele comparison is the unit-group map +induced by the ring comparison. -/ +theorem relativeIdeleBaseChangeMulEquiv_eq_ringUnits + (z : RelativeIdeleGroup K L) : + IdeleGroup.equivAdeleRingUnits + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) z) = + Units.mapEquiv + (relativeAdeleBaseChangeRingEquiv + (K := K) (L := L)).toMulEquiv z := by + apply Units.ext + apply Prod.ext + · funext W + change + ((IdeleGroup.infiniteComponent W + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) z) : + W.Completionˣ) : W.Completion) = + (relativeAdeleToAdele + (K := K) (L := L) + (z : RelativeAdeleRing K L)).1 W + rfl + · apply DFunLike.coe_injective + funext W + change + ((((relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) z).2 W : + (W.adicCompletion L)ˣ)) : + W.adicCompletion L) = + relativeFiniteTensorPiRingEquiv + (K := K) (L := L) + (fun w => + relativeAdeleFiniteComponent + (K := K) (L := L) w + (z : RelativeAdeleRing K L)) W + rw [relativeIdeleBaseChangeMulEquiv_finite, + relativeFiniteIdeleToFiniteIdele_apply] + exact relativeFiniteTensorPiMulEquiv_coe + (K := K) (L := L) + (fun w => + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w z) W + +/-- The relative-to-ordinary comparison sends the extension-field +diagonal to the ordinary diagonal idele. -/ +@[simp] +theorem relativeIdeleBaseChangeMulEquiv_principalIdele + (x : Lˣ) : + relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) + (RelativeIdeleGroup.principalIdele K L x) = + IdeleGroup.principalIdele L x := by + apply Prod.ext + · apply Units.ext + funext W + change + infinitePlaceTensorUnitsEquivAbove + (K := K) (L := L) + (infinitePlaceBelow (K := K) W) + ((relativeIdeleToLocalData + (K := K) (L := L) + (RelativeIdeleGroup.principalIdele K L x)).infinite + (infinitePlaceBelow (K := K) W)) + ⟨W, rfl⟩ = + algebraMap L W.Completion (x : L) + simp only [relativeIdeleToLocalData] + rw [RelativeIdeleGroup.infiniteComponent_principalIdele, + infinitePlaceTensorUnitsEquivAbove_localFieldIdeleInclusion] + simp + · rw [relativeIdeleBaseChangeMulEquiv_finite] + apply RestrictedProduct.ext + intro W + rw [relativeFiniteIdeleToFiniteIdele_apply, + relativeFiniteTensorPiMulEquiv_apply] + change + finitePlaceTensorUnitsEquivAboveAdic + (K := K) (L := L) + (finitePlaceBelow (K := K) W) + ((relativeIdeleToLocalData + (K := K) (L := L) + (RelativeIdeleGroup.principalIdele K L x)).finite + (finitePlaceBelow (K := K) W)) + ⟨W, rfl⟩ = + Units.map (FinitePlace.embedding (K := L) W) x + simp only [relativeIdeleToLocalData] + rw [RelativeIdeleGroup.finiteComponent_principalIdele, + finitePlaceTensorUnitsEquivAboveAdic_localFieldIdeleInclusion] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/All.lean new file mode 100644 index 0000000000..4673c2d03f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/All.lean @@ -0,0 +1,35 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.AdeleBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.CompositumEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.FiniteAbelianCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.FinitePlaceAdicCompletionCongrEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.QuadraticReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.TensorProduct +/-! +# Algebraic number theory + +Public root for the reusable global algebraic-number-theory layer used by +class field theory. It exports finite abelian composita, idèles and idèle +classes in extensions, normal-closure and splitting results, ray class groups, +S-units, and the ramification and degree results needed by global applications. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion.lean new file mode 100644 index 0000000000..88f596f498 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.Comparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.FinitePlaceAdicCompletionCongrEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.IntegerRingComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.LocalizedValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionComparison.lean new file mode 100644 index 0000000000..cbeca9315a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionComparison.lean @@ -0,0 +1,408 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.Comparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.IdeleSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Localization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition +public import Mathlib.NumberTheory.RamificationInertia.Valuation +/-! +# Comparing the exact-extension and concrete adic-completion maps + +The completion map attached to an exact extension of a finite-place +absolute value agrees with the canonical map between the concrete adic +completions at the corresponding finite places. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations + +universe u v + +variable + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + +/-- The concrete homomorphism of adic completions associated with an +exact extension of the normalized absolute value. -/ +noncomputable def finitePlaceExtensionAdicCompletionMap + (w : HeightOneSpectrum (𝓞 K)) + (a : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L) : + w.adicCompletion K →+* + (finitePlaceExtensionCentre + (K := K) (L := L) w a).adicCompletion L := + (finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) w a).toRingHom.comp + ((AbsoluteValue.completionMap + (HeightOneSpectrum.adicAbv K w) a.1 a.2).comp + (relativeFinitePlaceCompletionAlgEquiv w).symm.toRingHom) + +/-- The exact-extension completion map agrees with the field embedding +on elements of the base number field. -/ +theorem finitePlaceExtensionAdicCompletionMap_coe + (w : HeightOneSpectrum (𝓞 K)) + (a : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L) + (x : K) : + finitePlaceExtensionAdicCompletionMap K L w a + (x : w.adicCompletion K) = + (algebraMap K L x : + (finitePlaceExtensionCentre + (K := K) (L := L) w a).adicCompletion L) := by + have hcomparison : + (relativeFinitePlaceCompletionAlgEquiv w).symm + (x : w.adicCompletion K) = + algebraMap K + (HeightOneSpectrum.adicAbv K w).Completion x := by + change + (relativeFinitePlaceCompletionAlgEquiv w).symm + (algebraMap K (w.adicCompletion K) x) = + algebraMap K + (HeightOneSpectrum.adicAbv K w).Completion x + exact (relativeFinitePlaceCompletionAlgEquiv w).symm.commutes x + change + finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) w a + (AbsoluteValue.completionMap + (HeightOneSpectrum.adicAbv K w) a.1 a.2 + ((relativeFinitePlaceCompletionAlgEquiv w).symm + (x : w.adicCompletion K))) = + _ + rw [hcomparison, + AbsoluteValue.completionMap_coe, + finitePlaceExtensionAdicCompletionRingEquiv_toCompletion] + rfl + +/-- The completion map defined using an exact absolute-value extension +is continuous. -/ +theorem finitePlaceExtensionAdicCompletionMap_continuous + (w : HeightOneSpectrum (𝓞 K)) + (a : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L) : + Continuous + (finitePlaceExtensionAdicCompletionMap K L w a) := by + have hrelative : + Isometry (relativeFinitePlaceCompletionAlgEquiv w).symm := + AddMonoidHomClass.isometry_of_norm + (relativeFinitePlaceCompletionAlgEquiv w).symm + (relativeFinitePlaceCompletionAlgEquiv_symm_norm w) + exact + ((relativeFinitePlaceCompletionRingHom_isometry + (finitePlaceExtensionCentre + (K := K) (L := L) w a)).continuous.comp + (finitePlaceExtensionCompletionRingEquiv_continuous + (K := K) (L := L) w a)).comp + ((AbsoluteValue.completionMap_isometry + (HeightOneSpectrum.adicAbv K w) a.1 a.2).continuous.comp + hrelative.continuous) + +/-- The exact-extension construction and the canonical completion of the +field embedding agree. Equality on the dense copy of `K` is extended by +continuity. -/ +theorem finitePlaceExtensionAdicCompletionMap_eq_finitePlaceAdicCompletionMap + (w : HeightOneSpectrum (𝓞 K)) + (a : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L) + (x : w.adicCompletion K) : + finitePlaceExtensionAdicCompletionMap K L w a x = + finitePlaceAdicCompletionMap K L w + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w a) x := by + let P : (w.valuation K).Completion → Prop := fun y => + finitePlaceExtensionAdicCompletionMap K L w a + (HeightOneSpectrum.adicCompletion.ofCompletion y) = + finitePlaceAdicCompletionMap K L w + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w a) + (HeightOneSpectrum.adicCompletion.ofCompletion y) + change P x.toCompletion + refine UniformSpace.Completion.induction_on + (α := WithVal (w.valuation K)) x.toCompletion ?_ ?_ + · change IsClosed + {y | finitePlaceExtensionAdicCompletionMap K L w a + (HeightOneSpectrum.adicCompletion.ofCompletion y) = + finitePlaceAdicCompletionMap K L w + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w a) + (HeightOneSpectrum.adicCompletion.ofCompletion y)} + exact isClosed_eq + ((finitePlaceExtensionAdicCompletionMap_continuous K L w a).comp + (HeightOneSpectrum.adicCompletion.continuous_ofCompletion K w)) + ((finitePlaceAdicCompletionMap_continuous K L w + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w a)).comp + (HeightOneSpectrum.adicCompletion.continuous_ofCompletion K w)) + · intro r + let k : K := WithVal.equiv (w.valuation K) r + change + finitePlaceExtensionAdicCompletionMap K L w a + (HeightOneSpectrum.adicCompletion.ofCompletion + (r : (w.valuation K).Completion)) = + finitePlaceAdicCompletionMap K L w + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w a) + (HeightOneSpectrum.adicCompletion.ofCompletion + (r : (w.valuation K).Completion)) + change + finitePlaceExtensionAdicCompletionMap K L w a + (k : w.adicCompletion K) = + finitePlaceAdicCompletionMap K L w + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w a) + (k : w.adicCompletion K) + rw [finitePlaceExtensionAdicCompletionMap_coe, + finitePlaceAdicCompletionMap_coe] + change + (algebraMap K L k : + (finitePlaceExtensionCentre + (K := K) (L := L) w a).adicCompletion L) = + (algebraMap K L k : + (finitePlaceExtensionCentre + (K := K) (L := L) w a).adicCompletion L) + rfl + +/-- The concrete completion at a finite place above `w` is finite over the +concrete completion at `w`, for the canonical completion map. -/ +theorem finitePlaceAdicCompletionMap_moduleFinite + [FiniteDimensional K L] + (w : HeightOneSpectrum (𝓞 K)) + (W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}) : + letI : Algebra (w.adicCompletion K) (W.1.adicCompletion L) := + (finitePlaceAdicCompletionMap K L w W).toAlgebra + Module.Finite (w.adicCompletion K) (W.1.adicCompletion L) := by + classical + obtain ⟨a, rfl⟩ := + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w).surjective W + let vK := HeightOneSpectrum.adicAbv K w + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial w + let : Algebra + (w.adicCompletion K) + ((finitePlaceExtensionEquivAbove + (K := K) (L := L) w a).1.adicCompletion L) := + (finitePlaceAdicCompletionMap K L w + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w a)).toAlgebra + let : Module + (w.adicCompletion K) + ((finitePlaceExtensionEquivAbove + (K := K) (L := L) w a).1.adicCompletion L) := + Algebra.toModule + let : Algebra (w.adicCompletion K) vK.Completion := + (relativeFinitePlaceCompletionAlgEquiv w).symm.toRingHom.toAlgebra + let : Algebra vK.Completion a.1.Completion := + AbsoluteValue.completionAlgebra vK a.1 a.2 + let : Algebra (w.adicCompletion K) a.1.Completion := + ((algebraMap vK.Completion a.1.Completion).comp + (relativeFinitePlaceCompletionAlgEquiv w).symm.toRingHom).toAlgebra + let : IsScalarTower + (w.adicCompletion K) vK.Completion a.1.Completion := + IsScalarTower.of_algebraMap_eq' rfl + let : Module.Finite (w.adicCompletion K) vK.Completion := + Module.Finite.of_surjective + (Algebra.linearMap (w.adicCompletion K) vK.Completion) + (relativeFinitePlaceCompletionAlgEquiv w).symm.surjective + let : Module.Finite vK.Completion a.1.Completion := + completionModuleFinite vK hvK a + let : Module.Finite (w.adicCompletion K) a.1.Completion := + Module.Finite.trans vK.Completion a.1.Completion + let e : + a.1.Completion ≃ₐ[w.adicCompletion K] + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w a).1.adicCompletion L := + { __ := + finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) w a + commutes' := fun x => by + change + finitePlaceExtensionAdicCompletionMap K L w a x = + finitePlaceAdicCompletionMap K L w + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w a) x + exact + finitePlaceExtensionAdicCompletionMap_eq_finitePlaceAdicCompletionMap + K L w a x } + exact Module.Finite.equiv e.toLinearEquiv + +/-- The norm of the image under the concrete adic-completion map is +raised to the exact-extension exponent. -/ +theorem finitePlaceExtensionAdicCompletionMap_norm + (w : HeightOneSpectrum (𝓞 K)) + (a : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L) + (x : w.adicCompletion K) : + ‖finitePlaceExtensionAdicCompletionMap K L w a x‖ = + ‖x‖ ^ finitePlaceExtensionExponent + (K := K) (L := L) w a := by + change + ‖finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) w a + (AbsoluteValue.completionMap + (HeightOneSpectrum.adicAbv K w) a.1 a.2 + ((relativeFinitePlaceCompletionAlgEquiv w).symm x))‖ = + _ + rw [ + finitePlaceExtensionAdicCompletionRingEquiv_norm, + (AbsoluteValue.completionMap_isometry + (HeightOneSpectrum.adicAbv K w) a.1 a.2).norm_map_of_map_zero + (map_zero + (AbsoluteValue.completionMap + (HeightOneSpectrum.adicAbv K w) a.1 a.2)), + relativeFinitePlaceCompletionAlgEquiv_symm_norm] + +/-- The canonical map between concrete adic completions preserves the +valuation ring, expressed by the norm bound defining its unit ball. -/ +theorem finitePlaceAdicCompletionMap_norm_le_one_iff + (w : HeightOneSpectrum (𝓞 K)) + (W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}) + (x : w.adicCompletion K) : + ‖finitePlaceAdicCompletionMap K L w W x‖ ≤ 1 ↔ + ‖x‖ ≤ 1 := by + obtain ⟨a, rfl⟩ := + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w).surjective W + have hnorm : + ‖finitePlaceExtensionAdicCompletionMap K L w a x‖ = + ‖finitePlaceAdicCompletionMap K L w + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w a) x‖ := + congrArg (fun y => ‖y‖) + (finitePlaceExtensionAdicCompletionMap_eq_finitePlaceAdicCompletionMap + K L w a x) + rw [← hnorm, + finitePlaceExtensionAdicCompletionMap_norm] + simpa only [Real.one_rpow] using + Real.rpow_le_rpow_iff (norm_nonneg x) zero_le_one + (finitePlaceExtensionExponent_pos + (K := K) (L := L) w a) + +/-- The valuation of the image under the concrete adic-completion map +is multiplied by the ramification index. This extends the corresponding +formula for elements of `K` to every element of the completion. -/ +theorem finitePlaceExtensionAdicCompletionMap_valued + (w : HeightOneSpectrum (𝓞 K)) + (a : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) L) + (x : w.adicCompletion K) : + Valued.v (finitePlaceExtensionAdicCompletionMap K L w a x) = + Valued.v x ^ w.asIdeal.ramificationIdx' + (finitePlaceExtensionCentre + (K := K) (L := L) w a).asIdeal := by + let W := + finitePlaceExtensionCentre + (K := K) (L := L) w a + let : W.asIdeal.LiesOver w.asIdeal := + finitePlaceExtensionCentre_liesOver + (K := K) (L := L) w a + by_cases hx : x = 0 + · subst x + have he : + w.asIdeal.ramificationIdx' W.asIdeal ≠ 0 := + Ideal.IsDedekindDomain.ramificationIdx'_ne_zero_of_liesOver + W.asIdeal w.ne_bot + simp only [map_zero] + exact (zero_pow he).symm + obtain ⟨r, hr⟩ := Valued.exists_coe_eq_v x.toCompletion + let k : K := WithVal.equiv (w.valuation K) r + have hkval : w.valuation K k = Valued.v x := by + change Valued.v r = Valued.v x + rw [← HeightOneSpectrum.adicCompletion.valued_toCompletion] + exact hr.symm + have hk : k ≠ 0 := by + intro hk + have : Valued.v x = 0 := by + rw [← hkval, hk, map_zero] + apply hx + simpa using this + let z : w.adicCompletion K := x * (k : w.adicCompletion K)⁻¹ + have hzval : Valued.v z = 1 := by + simp [z, hkval, hx] + have hznorm : ‖z‖ = 1 := by + simp [FinitePlace.norm_def, hzval] + have hmapznorm : + ‖finitePlaceExtensionAdicCompletionMap K L w a z‖ = 1 := by + rw [finitePlaceExtensionAdicCompletionMap_norm, hznorm] + simp + have hmapzval : + Valued.v + (finitePlaceExtensionAdicCompletionMap K L w a z) = 1 := by + rw [FinitePlace.norm_def] at hmapznorm + exact + (WithZeroMulInt.toNNReal_eq_one_iff + (Valued.v + (finitePlaceExtensionAdicCompletionMap K L w a z)) + (HeightOneSpectrum.absNorm_ne_zero W) + (HeightOneSpectrum.one_lt_absNorm_nnreal W).ne').mp + (NNReal.eq hmapznorm) + have hkcoe : + (k : w.adicCompletion K) ≠ 0 := by + change algebraMap K (w.adicCompletion K) k ≠ 0 + exact (map_ne_zero + (algebraMap K (w.adicCompletion K))).2 hk + have hx_factor : + x = z * (k : w.adicCompletion K) := by + dsimp [z] + rw [mul_assoc, inv_mul_cancel₀ hkcoe, mul_one] + calc + Valued.v + (finitePlaceExtensionAdicCompletionMap K L w a x) = + Valued.v + (finitePlaceExtensionAdicCompletionMap K L w a + (z * (k : w.adicCompletion K))) := by + rw [← hx_factor] + _ = Valued.v + (finitePlaceExtensionAdicCompletionMap K L w a z) * + Valued.v + (finitePlaceExtensionAdicCompletionMap K L w a + (k : w.adicCompletion K)) := by + rw [map_mul, map_mul] + _ = Valued.v + (finitePlaceExtensionAdicCompletionMap K L w a + (k : w.adicCompletion K)) := by + rw [hmapzval, one_mul] + _ = W.valuation L (algebraMap K L k) := by + rw [finitePlaceExtensionAdicCompletionMap_coe, + HeightOneSpectrum.valuedAdicCompletion_eq_valuation'] + _ = (w.valuation K k) ^ + w.asIdeal.ramificationIdx' W.asIdeal := + (HeightOneSpectrum.valuation_liesOver L w W k).symm + _ = Valued.v x ^ + w.asIdeal.ramificationIdx' W.asIdeal := by + rw [hkval] + +/-- Under the canonical map to a place above `w`, the completed +valuation is raised to the ramification index. -/ +theorem finitePlaceAdicCompletionMap_valued + (w : HeightOneSpectrum (𝓞 K)) + (W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}) + (x : w.adicCompletion K) : + Valued.v (finitePlaceAdicCompletionMap K L w W x) = + Valued.v x ^ w.asIdeal.ramificationIdx' W.1.asIdeal := by + obtain ⟨a, rfl⟩ := + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w).surjective W + rw [← + finitePlaceExtensionAdicCompletionMap_eq_finitePlaceAdicCompletionMap] + exact finitePlaceExtensionAdicCompletionMap_valued K L w a x diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionMap.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionMap.lean new file mode 100644 index 0000000000..74dfe6d2cd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionMap.lean @@ -0,0 +1,212 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +public import Mathlib.NumberTheory.RamificationInertia.Valuation +/-! +# The canonical map between adic completions + +A finite place above a base finite place determines the continuous +extension of the number-field algebra map to their concrete adic +completions. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +universe u v w + +variable + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + +/-- The canonical map between adic completions at a finite place and a +chosen place above it. It is obtained by completing the algebra map +between the corresponding valued copies of the number fields. -/ +noncomputable def finitePlaceAdicCompletionMap + (w : HeightOneSpectrum (𝓞 K)) + (W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}) : + w.adicCompletion K →+* W.1.adicCompletion L := by + letI : W.1.asIdeal.LiesOver w.asIdeal := by + constructor + exact congrArg HeightOneSpectrum.asIdeal W.2.symm + exact + (HeightOneSpectrum.adicCompletion.equiv L W.1).symm.toRingHom.comp + ((UniformSpace.Completion.mapRingHom + (algebraMap + (WithVal (w.valuation K)) + (WithVal (W.1.valuation L))) + (HeightOneSpectrum.uniformContinuous_algebraMap_liesOver + K L w W.1).continuous).comp + (HeightOneSpectrum.adicCompletion.equiv K w).toRingHom) + +/-- On the dense copy of the base field, the canonical map of adic +completions is the original field embedding. -/ +theorem finitePlaceAdicCompletionMap_coe + (w : HeightOneSpectrum (𝓞 K)) + (W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}) + (x : K) : + finitePlaceAdicCompletionMap K L w W + (x : w.adicCompletion K) = + (algebraMap K L x : W.1.adicCompletion L) := by + let : W.1.asIdeal.LiesOver w.asIdeal := by + constructor + exact congrArg HeightOneSpectrum.asIdeal W.2.symm + change + HeightOneSpectrum.adicCompletion.ofCompletion + (UniformSpace.Completion.mapRingHom + (algebraMap + (WithVal (w.valuation K)) + (WithVal (W.1.valuation L))) + (HeightOneSpectrum.uniformContinuous_algebraMap_liesOver + K L w W.1).continuous + (algebraMap K (w.valuation K).Completion x)) = + _ + congr 1 + change + UniformSpace.Completion.mapRingHom + (algebraMap + (WithVal (w.valuation K)) + (WithVal (W.1.valuation L))) + (HeightOneSpectrum.uniformContinuous_algebraMap_liesOver + K L w W.1).continuous + ((WithVal.equiv (w.valuation K)).symm x : + (w.valuation K).Completion) = + ((algebraMap + (WithVal (w.valuation K)) + (WithVal (W.1.valuation L))) + ((WithVal.equiv (w.valuation K)).symm x) : + (W.1.valuation L).Completion) + rw [UniformSpace.Completion.mapRingHom_coe] + +/-- The canonical map of adic completions is compatible with the original +number-field tower. -/ +theorem finitePlaceAdicCompletionMap_isScalarTower + (w : HeightOneSpectrum (𝓞 K)) + (W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}) : + letI : Algebra (w.adicCompletion K) (W.1.adicCompletion L) := + (finitePlaceAdicCompletionMap K L w W).toAlgebra + IsScalarTower K (w.adicCompletion K) (W.1.adicCompletion L) := by + let : Algebra (w.adicCompletion K) (W.1.adicCompletion L) := + (finitePlaceAdicCompletionMap K L w W).toAlgebra + apply IsScalarTower.of_algebraMap_eq + intro x + change + (algebraMap K (W.1.adicCompletion L)) x = + finitePlaceAdicCompletionMap K L w W + (x : w.adicCompletion K) + rw [finitePlaceAdicCompletionMap_coe K L w W x] + exact IsScalarTower.algebraMap_apply K L (W.1.adicCompletion L) x + +/-- The canonical map between the two adic completions is continuous. -/ +theorem finitePlaceAdicCompletionMap_continuous + (w : HeightOneSpectrum (𝓞 K)) + (W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}) : + Continuous (finitePlaceAdicCompletionMap K L w W) := by + let : W.1.asIdeal.LiesOver w.asIdeal := by + constructor + exact congrArg HeightOneSpectrum.asIdeal W.2.symm + unfold finitePlaceAdicCompletionMap + exact + (HeightOneSpectrum.adicCompletion.continuous_ofCompletion L W.1).comp + (UniformSpace.Completion.continuous_map.comp + (HeightOneSpectrum.adicCompletion.continuous_toCompletion K w)) + +/-- The canonical map on a finite-place adic completion induced by the +identity field extension is the identity map. -/ +@[simp] +theorem finitePlaceAdicCompletionMap_self_apply + (W : HeightOneSpectrum (𝓞 K)) + (x : W.adicCompletion K) : + finitePlaceAdicCompletionMap K K W + ⟨W, finitePlaceBelow_self W⟩ x = + x := by + let P : (W.valuation K).Completion → Prop := fun y => + finitePlaceAdicCompletionMap K K W + ⟨W, finitePlaceBelow_self W⟩ + (HeightOneSpectrum.adicCompletion.ofCompletion y) = + HeightOneSpectrum.adicCompletion.ofCompletion y + change P x.toCompletion + refine UniformSpace.Completion.induction_on + (α := WithVal (W.valuation K)) x.toCompletion ?_ ?_ + · exact isClosed_eq + ((finitePlaceAdicCompletionMap_continuous + K K W ⟨W, finitePlaceBelow_self W⟩).comp + (HeightOneSpectrum.adicCompletion.continuous_ofCompletion K W)) + (HeightOneSpectrum.adicCompletion.continuous_ofCompletion K W) + · intro r + let k : K := WithVal.equiv (W.valuation K) r + change + finitePlaceAdicCompletionMap K K W + ⟨W, finitePlaceBelow_self W⟩ + (k : W.adicCompletion K) = + (k : W.adicCompletion K) + rw [finitePlaceAdicCompletionMap_coe + K K W ⟨W, finitePlaceBelow_self W⟩ k] + simp + +/-- Canonical maps between concrete adic completions compose in a +number-field tower. -/ +theorem finitePlaceAdicCompletionMap_comp + {M : Type w} + [Field M] [NumberField M] + [Algebra K M] [Algebra M L] + [IsScalarTower K M L] + (vK : HeightOneSpectrum (𝓞 K)) + (vM : HeightOneSpectrum (𝓞 M)) + (vL : HeightOneSpectrum (𝓞 L)) + (hMK : finitePlaceBelow (K := K) vM = vK) + (hLM : finitePlaceBelow (K := M) vL = vM) + (hLK : finitePlaceBelow (K := K) vL = vK) + (x : vK.adicCompletion K) : + finitePlaceAdicCompletionMap M L vM ⟨vL, hLM⟩ + (finitePlaceAdicCompletionMap K M vK ⟨vM, hMK⟩ x) = + finitePlaceAdicCompletionMap K L vK ⟨vL, hLK⟩ x := by + let P : (vK.valuation K).Completion → Prop := fun y => + finitePlaceAdicCompletionMap M L vM ⟨vL, hLM⟩ + (finitePlaceAdicCompletionMap K M vK ⟨vM, hMK⟩ + (HeightOneSpectrum.adicCompletion.ofCompletion y)) = + finitePlaceAdicCompletionMap K L vK ⟨vL, hLK⟩ + (HeightOneSpectrum.adicCompletion.ofCompletion y) + change P x.toCompletion + refine UniformSpace.Completion.induction_on + (α := WithVal (vK.valuation K)) x.toCompletion ?_ ?_ + · exact isClosed_eq + ((finitePlaceAdicCompletionMap_continuous + M L vM ⟨vL, hLM⟩).comp + ((finitePlaceAdicCompletionMap_continuous + K M vK ⟨vM, hMK⟩).comp + (HeightOneSpectrum.adicCompletion.continuous_ofCompletion K vK))) + ((finitePlaceAdicCompletionMap_continuous + K L vK ⟨vL, hLK⟩).comp + (HeightOneSpectrum.adicCompletion.continuous_ofCompletion K vK)) + · intro r + let k : K := WithVal.equiv (vK.valuation K) r + change + finitePlaceAdicCompletionMap M L vM ⟨vL, hLM⟩ + (finitePlaceAdicCompletionMap K M vK ⟨vM, hMK⟩ + (k : vK.adicCompletion K)) = + finitePlaceAdicCompletionMap K L vK ⟨vL, hLK⟩ + (k : vK.adicCompletion K) + rw [finitePlaceAdicCompletionMap_coe + K M vK ⟨vM, hMK⟩ k, + finitePlaceAdicCompletionMap_coe + M L vM ⟨vL, hLM⟩ (algebraMap K M k), + finitePlaceAdicCompletionMap_coe + K L vK ⟨vL, hLK⟩ k, + IsScalarTower.algebraMap_apply K M L] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/All.lean new file mode 100644 index 0000000000..08905dac43 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/All.lean @@ -0,0 +1,19 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.Comparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.FinitePlaceAdicCompletionCongrEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.IntegerRingComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.LocalizedValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.All +/-! # Completions of number fields and their local comparisons -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ChosenLocalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ChosenLocalization.lean new file mode 100644 index 0000000000..b76cc4e049 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ChosenLocalization.lean @@ -0,0 +1,397 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.LocalizedValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +/-! +# The chosen localization at a finite place + +This file equips the actual chosen localization of a finite number-field +extension with its canonical valued local-field structures. It also defines +unramifiedness for that actual completed extension. +-/ + +@[expose] public section + +open scoped NumberField ValuativeRel NNReal +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +open scoped Classical in +/-- The completion of the base field at the chosen finite place. -/ +abbrev ChosenFinitePlaceBaseCompletion + (w₀ : HeightOneSpectrum (𝓞 K)) := + (HeightOneSpectrum.adicAbv K w₀).Completion + +open scoped Classical in +noncomputable instance chosenFinitePlaceExtensionCompletionAlgebra + (w₀ : HeightOneSpectrum (𝓞 K)) : + Algebra K + (chosenFinitePlaceExtension (L := L) w₀).1.Completion := + AbsoluteValue.extensionCompletionAlgebra + (K := K) (chosenFinitePlaceExtension (L := L) w₀).1 + +open scoped Classical in +noncomputable instance chosenFinitePlaceExtensionCompletionSMul + (w₀ : HeightOneSpectrum (𝓞 K)) : + SMul K + (chosenFinitePlaceExtension (L := L) w₀).1.Completion := + (chosenFinitePlaceExtensionCompletionAlgebra + (K := K) (L := L) w₀).toSMul + +open scoped Classical in +noncomputable instance chosenFinitePlaceCompletionAlgebra + (w₀ : HeightOneSpectrum (𝓞 K)) : + Algebra + (ChosenFinitePlaceBaseCompletion (K := K) w₀) + (chosenFinitePlaceExtension (L := L) w₀).1.Completion := + AbsoluteValue.completionAlgebra + (HeightOneSpectrum.adicAbv K w₀) + (chosenFinitePlaceExtension (L := L) w₀).1 + (chosenFinitePlaceExtension (L := L) w₀).2 + +open scoped Classical in +noncomputable instance chosenFinitePlaceBaseValued + (w₀ : HeightOneSpectrum (𝓞 K)) : + Valued + (ChosenFinitePlaceBaseCompletion (K := K) w₀) ℝ≥0 := + finitePlaceCompletionValued + (HeightOneSpectrum.adicAbv K w₀) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w₀) + +open scoped Classical in +noncomputable instance chosenFinitePlaceBaseValuativeRel + (w₀ : HeightOneSpectrum (𝓞 K)) : + ValuativeRel + (ChosenFinitePlaceBaseCompletion (K := K) w₀) := + finitePlaceCompletionValuativeRel + (HeightOneSpectrum.adicAbv K w₀) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w₀) + +open scoped Classical in +noncomputable instance chosenFinitePlaceLocalizedValued + (w₀ : HeightOneSpectrum (𝓞 K)) : + Valued + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀) ℝ≥0 := + localizedCompletionFinitePlaceValued + (HeightOneSpectrum.adicAbv K w₀) + (chosenFinitePlaceExtension (L := L) w₀) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w₀) + +open scoped Classical in +noncomputable instance chosenFinitePlaceLocalizedValuativeRel + (w₀ : HeightOneSpectrum (𝓞 K)) : + ValuativeRel + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀) := + localizedCompletionFinitePlaceValuativeRel + (HeightOneSpectrum.adicAbv K w₀) + (chosenFinitePlaceExtension (L := L) w₀) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w₀) + +open scoped Classical in +noncomputable instance + chosenFinitePlaceLocalizedValuationHasExtension + (w₀ : HeightOneSpectrum (𝓞 K)) : + Valuation.HasExtension + (ValuativeRel.valuation + (ChosenFinitePlaceBaseCompletion (K := K) w₀)) + (ValuativeRel.valuation + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀)) := + localizedCompletionValuationHasExtension + (HeightOneSpectrum.adicAbv K w₀) + (chosenFinitePlaceExtension (L := L) w₀) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w₀) + +open scoped Classical in +noncomputable instance chosenFinitePlaceLocalizedIntegerAlgebra + (w₀ : HeightOneSpectrum (𝓞 K)) : + Algebra + 𝒪[ChosenFinitePlaceBaseCompletion (K := K) w₀] + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀) := + Algebra.ofSubsemiring + 𝒪[ChosenFinitePlaceBaseCompletion (K := K) w₀] + +open scoped Classical in +noncomputable instance chosenFinitePlaceLocalizedIsIntegralClosure + (w₀ : HeightOneSpectrum (𝓞 K)) : + IsIntegralClosure + 𝒪[ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀] + 𝒪[ChosenFinitePlaceBaseCompletion (K := K) w₀] + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀) := + localizedCompletionIsIntegralClosureWithExtension + (HeightOneSpectrum.adicAbv K w₀) + (chosenFinitePlaceExtension (L := L) w₀) + (RayClass.adicAbv_isNontrivial w₀) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w₀) + +open scoped Classical in +noncomputable instance + chosenFinitePlaceBaseNontriviallyNormedField + (w₀ : HeightOneSpectrum (𝓞 K)) : + NontriviallyNormedField + (ChosenFinitePlaceBaseCompletion (K := K) w₀) := + absoluteValueExtensionCompletionNontriviallyNormedField + (HeightOneSpectrum.adicAbv K w₀) + (RayClass.adicAbv_isNontrivial w₀) + +open scoped Classical in +noncomputable instance chosenFinitePlaceBaseLocallyCompactSpace + (w₀ : HeightOneSpectrum (𝓞 K)) : + LocallyCompactSpace + (ChosenFinitePlaceBaseCompletion (K := K) w₀) := + AbsoluteValue.Completion.locallyCompactSpace + (finitePlaceCompletionBaseMap_isometry w₀) + +open scoped Classical in +noncomputable instance chosenFinitePlaceBaseIsUltrametricDist + (w₀ : HeightOneSpectrum (𝓞 K)) : + IsUltrametricDist + (ChosenFinitePlaceBaseCompletion (K := K) w₀) := + completionIsUltrametricDist + (HeightOneSpectrum.adicAbv K w₀) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w₀) + +open scoped Classical in +noncomputable instance + chosenFinitePlaceBaseValuationIsNontrivial + (w₀ : HeightOneSpectrum (𝓞 K)) : + (Valued.v : + Valuation + (ChosenFinitePlaceBaseCompletion (K := K) w₀) + ℝ≥0).IsNontrivial := + (inferInstance : + (NormedField.valuation + (K := ChosenFinitePlaceBaseCompletion (K := K) w₀)).IsNontrivial) + +open scoped Classical in +noncomputable instance chosenFinitePlaceBaseValuationCompatible + (w₀ : HeightOneSpectrum (𝓞 K)) : + (Valued.v : + Valuation + (ChosenFinitePlaceBaseCompletion (K := K) w₀) + ℝ≥0).Compatible := + Valuation.Compatible.ofValuation _ + +open scoped Classical in +noncomputable instance + chosenFinitePlaceBaseValuativeRelIsNontrivial + (w₀ : HeightOneSpectrum (𝓞 K)) : + ValuativeRel.IsNontrivial + (ChosenFinitePlaceBaseCompletion (K := K) w₀) := + (ValuativeRel.isNontrivial_iff_isNontrivial + (Valued.v : + Valuation + (ChosenFinitePlaceBaseCompletion (K := K) w₀) + ℝ≥0)).2 inferInstance + +open scoped Classical in +noncomputable instance chosenFinitePlaceBaseIsValuativeTopology + (w₀ : HeightOneSpectrum (𝓞 K)) : + IsValuativeTopology + (ChosenFinitePlaceBaseCompletion (K := K) w₀) := + isValuativeTopology_of_valued_ofValuation + (ChosenFinitePlaceBaseCompletion (K := K) w₀) ℝ≥0 + +open scoped Classical in +noncomputable instance + chosenFinitePlaceBaseIsNonarchimedeanLocalField + (w₀ : HeightOneSpectrum (𝓞 K)) : + IsNonarchimedeanLocalField + (ChosenFinitePlaceBaseCompletion (K := K) w₀) := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + +open scoped Classical in +noncomputable instance chosenFinitePlaceCompletionFiniteDimensional + (w₀ : HeightOneSpectrum (𝓞 K)) : + FiniteDimensional + (ChosenFinitePlaceBaseCompletion (K := K) w₀) + (chosenFinitePlaceExtension (L := L) w₀).1.Completion := + completionModuleFinite + (HeightOneSpectrum.adicAbv K w₀) + (RayClass.adicAbv_isNontrivial w₀) + (chosenFinitePlaceExtension (L := L) w₀) + +open scoped Classical in +noncomputable instance chosenFinitePlaceCompletionContinuousSMul + (w₀ : HeightOneSpectrum (𝓞 K)) : + ContinuousSMul + (ChosenFinitePlaceBaseCompletion (K := K) w₀) + (chosenFinitePlaceExtension (L := L) w₀).1.Completion := + continuousSMul_of_algebraMap _ _ + (AbsoluteValue.completionMap_isometry + (HeightOneSpectrum.adicAbv K w₀) + (chosenFinitePlaceExtension (L := L) w₀).1 + (chosenFinitePlaceExtension (L := L) w₀).2).continuous + +open scoped Classical in +noncomputable instance chosenFinitePlaceCompletionLocallyCompactSpace + (w₀ : HeightOneSpectrum (𝓞 K)) : + LocallyCompactSpace + (chosenFinitePlaceExtension (L := L) w₀).1.Completion := + LocallyCompactSpace.of_finiteDimensional_of_complete + (ChosenFinitePlaceBaseCompletion (K := K) w₀) + (chosenFinitePlaceExtension (L := L) w₀).1.Completion + +open scoped Classical in +noncomputable instance chosenFinitePlaceLocalizedFiniteDimensional + (w₀ : HeightOneSpectrum (𝓞 K)) : + FiniteDimensional + (ChosenFinitePlaceBaseCompletion (K := K) w₀) + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀) := + AlgebraicNumberTheory.Valuations.localizedCompletionModuleFinite + (HeightOneSpectrum.adicAbv K w₀) + (RayClass.adicAbv_isNontrivial w₀) + (chosenFinitePlaceExtension (L := L) w₀) + +open scoped Classical in +noncomputable instance chosenFinitePlaceLocalizedIsGalois + (w₀ : HeightOneSpectrum (𝓞 K)) : + IsGalois + (ChosenFinitePlaceBaseCompletion (K := K) w₀) + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀) := + HilbertRamification.algebraicLocalization_isGalois + (HeightOneSpectrum.adicAbv K w₀) + (chosenFinitePlaceExtension (L := L) w₀) + +open scoped Classical in +noncomputable instance + chosenFinitePlaceLocalizedLocallyCompactSpace + (w₀ : HeightOneSpectrum (𝓞 K)) : + LocallyCompactSpace + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀) := by + let e : + ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀ ≃ᵢ + (chosenFinitePlaceExtension (L := L) w₀).1.Completion := + { toEquiv := + (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + (HeightOneSpectrum.adicAbv K w₀) + (RayClass.adicAbv_isNontrivial w₀) + (chosenFinitePlaceExtension (L := L) w₀)).toEquiv + isometry_toFun := Isometry.of_dist_eq fun _ _ => rfl } + exact (e.toHomeomorph.locallyCompactSpace_iff).2 inferInstance + +open scoped Classical in +noncomputable instance chosenFinitePlaceLocalizedIsUltrametricDist + (w₀ : HeightOneSpectrum (𝓞 K)) : + IsUltrametricDist + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀) := + localizedCompletionIsUltrametricDist + (HeightOneSpectrum.adicAbv K w₀) + (chosenFinitePlaceExtension (L := L) w₀) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w₀) + +open scoped Classical in +noncomputable instance chosenFinitePlaceLocalizedValuationCompatible + (w₀ : HeightOneSpectrum (𝓞 K)) : + (Valued.v : + Valuation + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀) + ℝ≥0).Compatible := + Valuation.Compatible.ofValuation _ + +open scoped Classical in +noncomputable instance + chosenFinitePlaceLocalizedValuationIsNontrivial + (w₀ : HeightOneSpectrum (𝓞 K)) : + (ValuativeRel.valuation + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀)).IsNontrivial := + Valuation.IsNontrivial.of_hasExtension + (ValuativeRel.valuation + (ChosenFinitePlaceBaseCompletion (K := K) w₀)) + (ValuativeRel.valuation + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀)) + +open scoped Classical in +noncomputable instance + chosenFinitePlaceLocalizedValuativeRelIsNontrivial + (w₀ : HeightOneSpectrum (𝓞 K)) : + ValuativeRel.IsNontrivial + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀) := + (ValuativeRel.isNontrivial_iff_isNontrivial + (ValuativeRel.valuation + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀))).2 inferInstance + +open scoped Classical in +noncomputable instance chosenFinitePlaceLocalizedIsValuativeTopology + (w₀ : HeightOneSpectrum (𝓞 K)) : + IsValuativeTopology + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀) := + isValuativeTopology_of_valued_ofValuation + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀) ℝ≥0 + +open scoped Classical in +noncomputable instance + chosenFinitePlaceLocalizedIsNonarchimedeanLocalField + (w₀ : HeightOneSpectrum (𝓞 K)) : + IsNonarchimedeanLocalField + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀) := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + +open scoped Classical in +noncomputable instance chosenFinitePlaceLocalizedIntegerModuleFinite + (w₀ : HeightOneSpectrum (𝓞 K)) : + Module.Finite + 𝒪[ChosenFinitePlaceBaseCompletion (K := K) w₀] + 𝒪[ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀] := by + let : Algebra.IsSeparable + (ChosenFinitePlaceBaseCompletion (K := K) w₀) + (ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) w₀) := + (chosenFinitePlaceLocalizedIsGalois (K := K) (L := L) w₀).to_isSeparable + exact integerRing_moduleFinite_of_isIntegralClosure + (ChosenFinitePlaceBaseCompletion (K := K) w₀) + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀) + +open scoped Classical in +/-- The chosen extension of the completed field is unramified, expressed +using the intrinsic valuation on the algebraic localization. The canonical local-field + instances for the chosen completion are exported +from this module, so clients only supply the mathematical unramifiedness +hypothesis. -/ +noncomputable def ChosenFinitePlaceIsUnramified + (w₀ : HeightOneSpectrum (𝓞 K)) : Prop := + IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + (ChosenFinitePlaceBaseCompletion (K := K) w₀) + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/Comparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/Comparison.lean new file mode 100644 index 0000000000..c22418c9d8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/Comparison.lean @@ -0,0 +1,468 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +public import Mathlib.Analysis.SpecialFunctions.Pow.Continuity +/-! +# Comparing finite-place completion models + +For an exact extension `w` of the normalized absolute value at a finite +place `v` of `K`, its centre `W` is a finite place of `L`. The absolute +values `w` and the standard normalized absolute value at `W` differ by a +positive real power. Consequently the identity on `L` extends to a ring +equivalence between their completions and preserves the valuation ring. + +Composing with the existing comparison between the standard +absolute-value completion and mathlib's concrete adic completion gives the +local factor comparison used in the adelic restricted-product bridge. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations + +universe u v + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- The standard absolute value at the centre of an exact extension has +the same valuation subring as that exact extension. -/ +theorem finitePlaceExtension_adicAbv_valuationSubring + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + absoluteValueValuationSubring + (HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v w)) + (finitePlaceExtension_nonarchimedean + (K := L) (L := L) + (finitePlaceExtensionCentre + (K := K) (L := L) v w) + ⟨HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v w), + fun _ => rfl⟩) = + finitePlaceExtensionValuationSubring + (K := K) (L := L) v w := by + rw [finitePlaceExtensionValuationSubring_eq_localization, + (finitePlaceExtensionCentre + (K := K) (L := L) v w).valuationSubringAtPrime_eq_valuationSubring] + ext x + rw [mem_absoluteValueValuationSubring_iff] + change + HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v w) x ≤ 1 ↔ + (finitePlaceExtensionCentre + (K := K) (L := L) v w).valuation L x ≤ 1 + rw [HeightOneSpectrum.adicAbv_def] + exact_mod_cast + WithZeroMulInt.toNNReal_le_one_iff + (HeightOneSpectrum.one_lt_absNorm_nnreal + (finitePlaceExtensionCentre + (K := K) (L := L) v w)) + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- The exact extension and the standard absolute value at its centre are +equivalent absolute values. -/ +theorem finitePlaceExtension_isEquiv_adicAbv + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + w.1.IsEquiv + (HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v w)) := by + apply AbsoluteValue.isEquiv_iff_lt_one_iff.mpr + intro x + have hle (y : L) : + w.1 y ≤ 1 ↔ + HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v w) y ≤ 1 := by + rw [← mem_absoluteValueValuationSubring_iff + w.1 (finitePlaceExtension_nonarchimedean + (K := K) (L := L) v w), + ← mem_absoluteValueValuationSubring_iff + (HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v w)) + (finitePlaceExtension_nonarchimedean + (K := L) (L := L) + (finitePlaceExtensionCentre + (K := K) (L := L) v w) + ⟨HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v w), + fun _ => rfl⟩)] + change + y ∈ finitePlaceExtensionValuationSubring + (K := K) (L := L) v w ↔ + y ∈ absoluteValueValuationSubring + (HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v w)) + (finitePlaceExtension_nonarchimedean + (K := L) (L := L) + (finitePlaceExtensionCentre + (K := K) (L := L) v w) + ⟨HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v w), + fun _ => rfl⟩) + rw [finitePlaceExtension_adicAbv_valuationSubring] + by_cases hx : x = 0 + · subst x + simp + calc + w.1 x < 1 ↔ 1 < (w.1 x)⁻¹ := + (one_lt_inv₀ (w.1.pos hx)).symm + _ ↔ 1 < w.1 x⁻¹ := by rw [map_inv₀] + _ ↔ ¬ w.1 x⁻¹ ≤ 1 := not_le.symm + _ ↔ ¬ HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v w) x⁻¹ ≤ 1 := + not_congr (hle x⁻¹) + _ ↔ 1 < HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v w) x⁻¹ := not_le + _ ↔ 1 < (HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v w) x)⁻¹ := by + rw [map_inv₀] + _ ↔ HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v w) x < 1 := + one_lt_inv₀ + ((HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v w)).pos hx) + +open scoped Classical in +/-- The positive exponent relating an exact extension to the standard +absolute value at its centre. -/ +noncomputable def finitePlaceExtensionExponent + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : ℝ := + (AbsoluteValue.isEquiv_iff_exists_rpow_eq.mp + (finitePlaceExtension_isEquiv_adicAbv + (K := K) (L := L) v w)).choose + +omit [FiniteDimensional K L] in +open scoped Classical in +theorem finitePlaceExtensionExponent_pos + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + 0 < finitePlaceExtensionExponent + (K := K) (L := L) v w := + (AbsoluteValue.isEquiv_iff_exists_rpow_eq.mp + (finitePlaceExtension_isEquiv_adicAbv + (K := K) (L := L) v w)).choose_spec.1 + +omit [FiniteDimensional K L] in +open scoped Classical in +theorem finitePlaceExtension_adicAbv_eq_rpow + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) + (x : L) : + HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v w) x = + w.1 x ^ finitePlaceExtensionExponent + (K := K) (L := L) v w := + (congrFun + (AbsoluteValue.isEquiv_iff_exists_rpow_eq.mp + (finitePlaceExtension_isEquiv_adicAbv + (K := K) (L := L) v w)).choose_spec.2 x).symm + +open scoped Classical in +/-- The identity on `L`, regarded as a ring equivalence between the two +normed copies determined by the equivalent absolute values. -/ +noncomputable def finitePlaceExtensionWithAbsRingEquiv + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + WithAbs w.1 ≃+* + WithAbs + (HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v w)) := + WithAbs.congr w.1 + (HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v w)) + (RingEquiv.refl L) + +omit [FiniteDimensional K L] in +open scoped Classical in +theorem finitePlaceExtensionWithAbsRingEquiv_continuous + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + Continuous + (finitePlaceExtensionWithAbsRingEquiv + (K := K) (L := L) v w) := + (AbsoluteValue.isEquiv_iff_isHomeomorph _ _).mp + (finitePlaceExtension_isEquiv_adicAbv + (K := K) (L := L) v w) |>.continuous + +omit [FiniteDimensional K L] in +open scoped Classical in +theorem finitePlaceExtensionWithAbsRingEquiv_symm_continuous + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + Continuous + (finitePlaceExtensionWithAbsRingEquiv + (K := K) (L := L) v w).symm := by + rw [finitePlaceExtensionWithAbsRingEquiv, + WithAbs.congr_symm] + exact + ((AbsoluteValue.isEquiv_iff_isHomeomorph _ _).mp + (finitePlaceExtension_isEquiv_adicAbv + (K := K) (L := L) v w).symm).continuous + +open scoped Classical in +/-- The completion comparison induced by the identity on `L`. -/ +noncomputable def finitePlaceExtensionCompletionRingEquiv + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + w.1.Completion ≃+* + (HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v w)).Completion := + UniformSpace.Completion.mapRingEquiv + (finitePlaceExtensionWithAbsRingEquiv + (K := K) (L := L) v w) + (finitePlaceExtensionWithAbsRingEquiv_continuous + (K := K) (L := L) v w) + (finitePlaceExtensionWithAbsRingEquiv_symm_continuous + (K := K) (L := L) v w) + +omit [FiniteDimensional K L] in +open scoped Classical in +theorem finitePlaceExtensionCompletionRingEquiv_toCompletion + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) + (x : L) : + finitePlaceExtensionCompletionRingEquiv + (K := K) (L := L) v w + (AbsoluteValue.toCompletion w.1 x) = + AbsoluteValue.toCompletion + (HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v w)) x := by + change + UniformSpace.Completion.mapRingEquiv + (finitePlaceExtensionWithAbsRingEquiv + (K := K) (L := L) v w) + (finitePlaceExtensionWithAbsRingEquiv_continuous + (K := K) (L := L) v w) + (finitePlaceExtensionWithAbsRingEquiv_symm_continuous + (K := K) (L := L) v w) + (((WithAbs.equiv w.1).symm x : WithAbs w.1) : + w.1.Completion) = _ + rw [UniformSpace.Completion.mapRingEquiv_apply, + UniformSpace.Completion.map_coe + (uniformContinuous_addMonoidHom_of_continuous + (finitePlaceExtensionWithAbsRingEquiv_continuous + (K := K) (L := L) v w))] + rfl + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- The completion comparison is continuous. -/ +theorem finitePlaceExtensionCompletionRingEquiv_continuous + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + Continuous + (finitePlaceExtensionCompletionRingEquiv + (K := K) (L := L) v w) := + UniformSpace.Completion.continuous_map + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- The norm on the standard completion is the positive power of the +norm on the exact-extension completion. -/ +theorem finitePlaceExtensionCompletionRingEquiv_norm + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) + (x : w.1.Completion) : + ‖finitePlaceExtensionCompletionRingEquiv + (K := K) (L := L) v w x‖ = + ‖x‖ ^ finitePlaceExtensionExponent + (K := K) (L := L) v w := by + refine UniformSpace.Completion.induction_on + (α := WithAbs w.1) x ?_ ?_ + · exact isClosed_eq + (continuous_norm.comp + (finitePlaceExtensionCompletionRingEquiv_continuous + (K := K) (L := L) v w)) + (continuous_norm.rpow_const + (fun _ => Or.inr + (finitePlaceExtensionExponent_pos + (K := K) (L := L) v w).le)) + · intro a + change + ‖UniformSpace.Completion.map + (finitePlaceExtensionWithAbsRingEquiv + (K := K) (L := L) v w) + (a : w.1.Completion)‖ = + ‖(a : w.1.Completion)‖ ^ + finitePlaceExtensionExponent + (K := K) (L := L) v w + rw [UniformSpace.Completion.map_coe + (uniformContinuous_addMonoidHom_of_continuous + (finitePlaceExtensionWithAbsRingEquiv_continuous + (K := K) (L := L) v w)), + UniformSpace.Completion.norm_coe, + UniformSpace.Completion.norm_coe, + WithAbs.norm_eq_apply_ofAbs, + WithAbs.norm_eq_apply_ofAbs] + exact finitePlaceExtension_adicAbv_eq_rpow + (K := K) (L := L) v w (WithAbs.equiv w.1 a) + +open scoped Classical in +/-- The existing comparison from the standard absolute-value completion +to the concrete adic completion is an isometry. -/ +theorem relativeFinitePlaceCompletionRingEquiv_norm + (W : HeightOneSpectrum (𝓞 L)) + (x : (HeightOneSpectrum.adicAbv L W).Completion) : + ‖relativeFinitePlaceCompletionRingEquiv W x‖ = ‖x‖ := by + change ‖relativeFinitePlaceCompletionRingHom W x‖ = ‖x‖ + exact + (relativeFinitePlaceCompletionRingHom_isometry W).norm_map_of_map_zero + (map_zero (relativeFinitePlaceCompletionRingHom W)) x + +open scoped Classical in +/-- The local factor comparison from an exact-extension completion to +the concrete completion at its centre. -/ +noncomputable def finitePlaceExtensionAdicCompletionRingEquiv + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + w.1.Completion ≃+* + (finitePlaceExtensionCentre + (K := K) (L := L) v w).adicCompletion L := + (finitePlaceExtensionCompletionRingEquiv + (K := K) (L := L) v w).trans + (relativeFinitePlaceCompletionRingEquiv + (finitePlaceExtensionCentre + (K := K) (L := L) v w)) + +omit [FiniteDimensional K L] in +open scoped Classical in +theorem finitePlaceExtensionAdicCompletionRingEquiv_norm + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) + (x : w.1.Completion) : + ‖finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w x‖ = + ‖x‖ ^ finitePlaceExtensionExponent + (K := K) (L := L) v w := by + rw [finitePlaceExtensionAdicCompletionRingEquiv, + RingEquiv.trans_apply, + relativeFinitePlaceCompletionRingEquiv_norm, + finitePlaceExtensionCompletionRingEquiv_norm] + +omit [FiniteDimensional K L] in +open scoped Classical in +theorem finitePlaceExtensionAdicCompletionRingEquiv_toCompletion + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) + (x : L) : + finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w + (AbsoluteValue.toCompletion w.1 x) = + FinitePlace.embedding + (finitePlaceExtensionCentre + (K := K) (L := L) v w) x := by + rw [finitePlaceExtensionAdicCompletionRingEquiv, + RingEquiv.trans_apply, + finitePlaceExtensionCompletionRingEquiv_toCompletion] + change + relativeFinitePlaceCompletionRingHom + (finitePlaceExtensionCentre + (K := K) (L := L) v w) + (((WithAbs.equiv + (HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v w))).symm x : + WithAbs + (HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v w))) : + (HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v w)).Completion) = _ + rw [relativeFinitePlaceCompletionRingHom_coe] + rfl + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- The local factor comparison identifies the valuation ring in the +exact-extension completion with the concrete adic integers. -/ +theorem finitePlaceExtensionAdicCompletionRingEquiv_mem_integers_iff + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) + (x : w.1.Completion) : + finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w x ∈ + (finitePlaceExtensionCentre + (K := K) (L := L) v w).adicCompletionIntegers L ↔ + x ∈ absoluteValueCompletionIntegers w.1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K v) + (HeightOneSpectrum.isNonarchimedean_adicAbv K v) w) := by + rw [mem_absoluteValueCompletionIntegers_iff] + have hrpow : + ‖x‖ ^ finitePlaceExtensionExponent + (K := K) (L := L) v w ≤ 1 ↔ + ‖x‖ ≤ 1 := by + simpa only [Real.one_rpow] using + Real.rpow_le_rpow_iff (norm_nonneg x) zero_le_one + (finitePlaceExtensionExponent_pos + (K := K) (L := L) v w) + constructor + · intro hx + have hnorm := + norm_le_one_of_mem_adicCompletionIntegers + (finitePlaceExtensionCentre + (K := K) (L := L) v w) hx + rw [finitePlaceExtensionAdicCompletionRingEquiv_norm] at hnorm + exact hrpow.mp hnorm + · intro hx + apply mem_adicCompletionIntegers_of_norm_le_one + (finitePlaceExtensionCentre + (K := K) (L := L) v w) + rw [finitePlaceExtensionAdicCompletionRingEquiv_norm] + exact hrpow.mpr hx diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ExtensionIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ExtensionIndex.lean new file mode 100644 index 0000000000..14c3bc2925 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ExtensionIndex.lean @@ -0,0 +1,764 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralLocalFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.GaloisAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.PrimeContractions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AbsoluteValueConjugacy +public import Mathlib.RingTheory.Ideal.GoingUp +/-! +# Finite places in a number-field extension + +This file supplies the finite-place index comparison needed to pass from +the relative adelic tensor product to the ordinary adeles of the extension +field. It is deliberately independent of the restricted-product +construction. + +For a finite place `W` of `L`, `finitePlaceBelow W` is its contraction to +`K`. Conversely, an exact extension of the normalized absolute value at +`v` has a canonical centre in `𝓞 L`. Passing through the finite normal +closure shows that the centres are precisely the finite places above `v`. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations + +universe u v w + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + +open scoped Classical in +/-- Contraction of a finite place of `L` to a finite place of `K`. -/ +noncomputable def finitePlaceBelow + (W : HeightOneSpectrum (𝓞 L)) : + HeightOneSpectrum (𝓞 K) where + asIdeal := W.asIdeal.under (𝓞 K) + isPrime := inferInstance + ne_bot := + HilbertRamification.Dedekind.ringOfIntegers_under_ne_bot + (E := K) (F := L) W.asIdeal + +open scoped Classical in +@[simp] +theorem finitePlaceBelow_asIdeal + (W : HeightOneSpectrum (𝓞 L)) : + (finitePlaceBelow (K := K) W).asIdeal = + W.asIdeal.under (𝓞 K) := + rfl + +open scoped Classical in +/-- Contracting a finite place along the identity extension fixes it. -/ +@[simp] +theorem finitePlaceBelow_self + (W : HeightOneSpectrum (𝓞 K)) : + finitePlaceBelow (K := K) W = W := by + apply HeightOneSpectrum.ext + change + W.asIdeal.comap (algebraMap (𝓞 K) (𝓞 K)) = + W.asIdeal + rw [Algebra.algebraMap_self, Ideal.comap_id] + +section Tower + +variable {M : Type w} + [Field M] [NumberField M] + [Algebra K M] [Algebra M L] + [IsScalarTower K M L] + +open scoped Classical in +/-- Contraction of finite places is transitive in a tower of number +fields. -/ +@[simp] +theorem finitePlaceBelow_finitePlaceBelow + (W : HeightOneSpectrum (𝓞 L)) : + finitePlaceBelow (K := K) + (finitePlaceBelow (K := M) W) = + finitePlaceBelow (K := K) W := by + apply HeightOneSpectrum.ext + exact + Ideal.under_under + (A := 𝓞 K) (B := 𝓞 M) (C := 𝓞 L) W.asIdeal + +end Tower + +section Centre + +variable [FiniteDimensional K L] + +omit [NumberField L] [FiniteDimensional K L] in +open scoped Classical in +/-- Nonarchimedeanness of an exact extension of a finite +absolute value. -/ +theorem finitePlaceExtension_nonarchimedean + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + LubinTate.Valuations.NonarchimedeanAbsoluteValue w.1 := + (AbsoluteValue.isNonarchimedean_iff_bounded_nat w.1).1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K v) + (HeightOneSpectrum.isNonarchimedean_adicAbv K v) w) + +open scoped Classical in +/-- The valuation subring of `L` cut out by an exact extension of the +normalized absolute value at `v`. -/ +noncomputable def finitePlaceExtensionValuationSubring + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + ValuationSubring L := + absoluteValueValuationSubring w.1 + (finitePlaceExtension_nonarchimedean + (K := K) (L := L) v w) + +omit [NumberField L] [FiniteDimensional K L] in +open scoped Classical in +/-- Every algebraic integer of `L` belongs to the valuation subring +defined by a finite-place extension. -/ +theorem ringOfIntegers_mem_finitePlaceExtensionValuationSubring + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) + (x : 𝓞 L) : + (x : L) ∈ + finitePlaceExtensionValuationSubring + (K := K) (L := L) v w := by + rw [finitePlaceExtensionValuationSubring, + mem_absoluteValueValuationSubring_iff] + exact + absoluteValue_le_one_of_isIntegral w.1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K v) + (HeightOneSpectrum.isNonarchimedean_adicAbv K v) w) + x.property + +open scoped Classical in +/-- The canonical map from algebraic integers to the valuation subring +of an exact finite-place extension. -/ +noncomputable def ringOfIntegersToFinitePlaceExtensionValuationSubring + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + 𝓞 L →+* + finitePlaceExtensionValuationSubring + (K := K) (L := L) v w := + RingHom.codRestrict (algebraMap (𝓞 L) L) + (finitePlaceExtensionValuationSubring + (K := K) (L := L) v w).toSubring + (ringOfIntegers_mem_finitePlaceExtensionValuationSubring + (K := K) (L := L) v w) + +omit [NumberField L] [FiniteDimensional K L] in +open scoped Classical in +@[simp] +theorem ringOfIntegersToFinitePlaceExtensionValuationSubring_coe + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) + (x : 𝓞 L) : + ((ringOfIntegersToFinitePlaceExtensionValuationSubring + (K := K) (L := L) v w x : + finitePlaceExtensionValuationSubring + (K := K) (L := L) v w) : L) = (x : L) := + rfl + +open scoped Classical in +/-- The centre in `𝓞 L` of an exact extension of the absolute value at +`v`. -/ +noncomputable def finitePlaceExtensionCentreIdeal + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + Ideal (𝓞 L) := + (IsLocalRing.maximalIdeal + (finitePlaceExtensionValuationSubring + (K := K) (L := L) v w)).comap + (ringOfIntegersToFinitePlaceExtensionValuationSubring + (K := K) (L := L) v w) + +omit [NumberField L] [FiniteDimensional K L] in +open scoped Classical in +/-- Membership in the centre is the strict-unit-ball condition. -/ +theorem mem_finitePlaceExtensionCentreIdeal_iff + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) + (x : 𝓞 L) : + x ∈ finitePlaceExtensionCentreIdeal + (K := K) (L := L) v w ↔ + w.1 (x : L) < 1 := by + let A := + finitePlaceExtensionValuationSubring + (K := K) (L := L) v w + let f := + ringOfIntegersToFinitePlaceExtensionValuationSubring + (K := K) (L := L) v w + change + f x ∈ IsLocalRing.maximalIdeal A ↔ + w.1 (((f x : A) : L)) < 1 + rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] + exact + not_isUnit_iff_abs_lt_one_of_mem_iff_le_one + w.1 A + (fun y => by + change + y ∈ finitePlaceExtensionValuationSubring + (K := K) (L := L) v w ↔ + w.1 y ≤ 1 + rw [finitePlaceExtensionValuationSubring, + mem_absoluteValueValuationSubring_iff]) + (f x) + +omit [NumberField L] [FiniteDimensional K L] in +open scoped Classical in +theorem finitePlaceExtensionCentreIdeal_isPrime + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + (finitePlaceExtensionCentreIdeal + (K := K) (L := L) v w).IsPrime := by + unfold finitePlaceExtensionCentreIdeal + exact Ideal.comap_isPrime _ _ + +omit [NumberField L] [FiniteDimensional K L] in +open scoped Classical in +/-- The centre contracts to the original finite place. -/ +theorem finitePlaceExtensionCentreIdeal_under + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + (finitePlaceExtensionCentreIdeal + (K := K) (L := L) v w).under (𝓞 K) = + v.asIdeal := by + ext x + change + algebraMap (𝓞 K) (𝓞 L) x ∈ + finitePlaceExtensionCentreIdeal + (K := K) (L := L) v w ↔ + x ∈ v.asIdeal + rw [mem_finitePlaceExtensionCentreIdeal_iff] + have hcoe : + ((algebraMap (𝓞 K) (𝓞 L) x : 𝓞 L) : L) = + algebraMap K L (x : K) := by + rfl + rw [hcoe, w.2] + rw [← FinitePlace.norm_embedding] + exact FinitePlace.norm_lt_one_iff_mem (K := K) v x + +omit [NumberField L] [FiniteDimensional K L] in +open scoped Classical in +theorem finitePlaceExtensionCentreIdeal_ne_bot + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + finitePlaceExtensionCentreIdeal + (K := K) (L := L) v w ≠ ⊥ := by + intro hbot + apply v.ne_bot + rw [← finitePlaceExtensionCentreIdeal_under + (K := K) (L := L) v w, hbot] + simp + +open scoped Classical in +/-- The finite place of `L` centred at an exact extension of the +absolute value at `v`. -/ +noncomputable def finitePlaceExtensionCentre + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + HeightOneSpectrum (𝓞 L) where + asIdeal := + finitePlaceExtensionCentreIdeal + (K := K) (L := L) v w + isPrime := + finitePlaceExtensionCentreIdeal_isPrime + (K := K) (L := L) v w + ne_bot := + finitePlaceExtensionCentreIdeal_ne_bot + (K := K) (L := L) v w + +omit [NumberField L] [FiniteDimensional K L] in +open scoped Classical in +@[simp] +theorem finitePlaceExtensionCentre_asIdeal + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + (finitePlaceExtensionCentre + (K := K) (L := L) v w).asIdeal = + finitePlaceExtensionCentreIdeal + (K := K) (L := L) v w := + rfl + +omit [FiniteDimensional K L] in +open scoped Classical in +@[simp] +theorem finitePlaceBelow_finitePlaceExtensionCentre + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + finitePlaceBelow (K := K) + (finitePlaceExtensionCentre + (K := K) (L := L) v w) = + v := by + apply HeightOneSpectrum.ext + exact + finitePlaceExtensionCentreIdeal_under + (K := K) (L := L) v w + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- The centre of an exact extension of the normalized absolute value +lies over the original finite place. -/ +theorem finitePlaceExtensionCentre_liesOver + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + (finitePlaceExtensionCentre + (K := K) (L := L) v w).asIdeal.LiesOver v.asIdeal := by + constructor + exact congrArg HeightOneSpectrum.asIdeal + (finitePlaceBelow_finitePlaceExtensionCentre + (K := K) (L := L) v w).symm + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- The valuation subring defined by an exact extension is the +localization of `𝓞 L` at its centre. -/ +theorem finitePlaceExtensionValuationSubring_eq_localization + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + finitePlaceExtensionValuationSubring + (K := K) (L := L) v w = + (finitePlaceExtensionCentre + (K := K) (L := L) v w).valuationSubringAtPrime L := by + let P := + finitePlaceExtensionCentreIdeal + (K := K) (L := L) v w + let : P.IsPrime := + finitePlaceExtensionCentreIdeal_isPrime + (K := K) (L := L) v w + let W := + finitePlaceExtensionCentre + (K := K) (L := L) v w + let V := W.valuationSubringAtPrime L + let A := + finitePlaceExtensionValuationSubring + (K := K) (L := L) v w + have hVA : V ≤ A := by + rintro x ⟨a, s, hs, rfl⟩ + have haA : (a : L) ∈ A := + ringOfIntegers_mem_finitePlaceExtensionValuationSubring + (K := K) (L := L) v w a + have hsA : (s : L) ∈ A := + ringOfIntegers_mem_finitePlaceExtensionValuationSubring + (K := K) (L := L) v w s + have haLe : w.1 (a : L) ≤ 1 := by + change (a : L) ∈ + finitePlaceExtensionValuationSubring + (K := K) (L := L) v w at haA + rw [finitePlaceExtensionValuationSubring, + mem_absoluteValueValuationSubring_iff] at haA + exact haA + have hsLe : w.1 (s : L) ≤ 1 := by + change (s : L) ∈ + finitePlaceExtensionValuationSubring + (K := K) (L := L) v w at hsA + rw [finitePlaceExtensionValuationSubring, + mem_absoluteValueValuationSubring_iff] at hsA + exact hsA + have hsNotLt : ¬ w.1 (s : L) < 1 := by + intro hlt + apply hs + exact + (mem_finitePlaceExtensionCentreIdeal_iff + (K := K) (L := L) v w s).2 hlt + have hsEq : w.1 (s : L) = 1 := + le_antisymm hsLe (not_lt.mp hsNotLt) + change + (a : L) * (s : L)⁻¹ ∈ + finitePlaceExtensionValuationSubring + (K := K) (L := L) v w + rw [finitePlaceExtensionValuationSubring, + mem_absoluteValueValuationSubring_iff, + map_mul, map_inv₀, hsEq, inv_one, mul_one] + exact haLe + have hAne : A ≠ ⊤ := by + intro htop + obtain ⟨x, hx0, hx1⟩ := + RayClass.adicAbv_isNontrivial v + let y : L := algebraMap K L x + have hy0 : y ≠ 0 := by + change algebraMap K L x ≠ 0 + simpa only [map_zero] using + (algebraMap K L).injective.ne hx0 + have hy1 : w.1 y ≠ 1 := by + change w.1 (algebraMap K L x) ≠ 1 + rw [w.2] + exact hx1 + have hle (z : L) : w.1 z ≤ 1 := by + have hzA : z ∈ A := by + rw [htop] + trivial + change + z ∈ finitePlaceExtensionValuationSubring + (K := K) (L := L) v w at hzA + rw [finitePlaceExtensionValuationSubring, + mem_absoluteValueValuationSubring_iff] at hzA + exact hzA + have honeLe : 1 ≤ w.1 y := by + calc + 1 = w.1 y * w.1 y⁻¹ := by + rw [← map_mul, mul_inv_cancel₀ hy0, map_one] + _ ≤ w.1 y * 1 := + mul_le_mul_of_nonneg_left (hle y⁻¹) (w.1.nonneg y) + _ = w.1 y := mul_one _ + exact hy1 (le_antisymm (hle y) honeLe) + exact (V.eq_of_le_of_ne_top hVA hAne).symm + +section CrossBaseEquivalence + +variable {F M : Type*} + [Field F] [NumberField F] + [Field M] [NumberField M] + [Algebra F L] [Algebra M L] + +omit [Algebra K L] [FiniteDimensional K L] in +open scoped Classical in +/-- Exact finite-place extensions, even over different intermediate +base fields, define equivalent top-field valuations when their centres +coincide. -/ +theorem finitePlaceExtensions_isEquiv_of_centres_eq + (vF : HeightOneSpectrum (𝓞 F)) + (vM : HeightOneSpectrum (𝓞 M)) + (wF : + AbsoluteValueExtension + (HeightOneSpectrum.adicAbv F vF) L) + (wM : + AbsoluteValueExtension + (HeightOneSpectrum.adicAbv M vM) L) + (hcentre : + finitePlaceExtensionCentre + (K := F) (L := L) vF wF = + finitePlaceExtensionCentre + (K := M) (L := L) vM wM) : + wF.1.IsEquiv wM.1 := by + have hsubring : + finitePlaceExtensionValuationSubring + (K := F) (L := L) vF wF = + finitePlaceExtensionValuationSubring + (K := M) (L := L) vM wM := by + rw [finitePlaceExtensionValuationSubring_eq_localization, + finitePlaceExtensionValuationSubring_eq_localization, + hcentre] + have hle (x : L) : + wF.1 x ≤ 1 ↔ wM.1 x ≤ 1 := by + change + x ∈ + finitePlaceExtensionValuationSubring + (K := F) (L := L) vF wF ↔ + x ∈ + finitePlaceExtensionValuationSubring + (K := M) (L := L) vM wM + rw [hsubring] + apply AbsoluteValue.isEquiv_iff_lt_one_iff.mpr + intro x + by_cases hx : x = 0 + · subst x + simp + calc + wF.1 x < 1 ↔ 1 < (wF.1 x)⁻¹ := + (one_lt_inv₀ (wF.1.pos hx)).symm + _ ↔ 1 < wF.1 x⁻¹ := by + rw [map_inv₀] + _ ↔ ¬ wF.1 x⁻¹ ≤ 1 := not_le.symm + _ ↔ ¬ wM.1 x⁻¹ ≤ 1 := + not_congr (hle x⁻¹) + _ ↔ 1 < wM.1 x⁻¹ := not_le + _ ↔ 1 < (wM.1 x)⁻¹ := by + rw [map_inv₀] + _ ↔ wM.1 x < 1 := + one_lt_inv₀ (wM.1.pos hx) + +end CrossBaseEquivalence + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- An exact extension of the normalized finite absolute value is +determined by its centre in `𝓞 L`. -/ +theorem finitePlaceExtensionCentre_injective + (v : HeightOneSpectrum (𝓞 K)) : + Function.Injective + (finitePlaceExtensionCentre + (K := K) (L := L) v) := by + intro w w' hcentre + have hequiv : w.1.IsEquiv w'.1 := + finitePlaceExtensions_isEquiv_of_centres_eq + (F := K) (M := K) v v w w' hcentre + exact + equivalent_exactExtensions_eq + (HeightOneSpectrum.adicAbv K v) + (RayClass.adicAbv_isNontrivial v) w w' + ((LubinTate.Valuations.equivalentAbsoluteValues_iff_isEquiv + w.1 w'.1).2 hequiv) + +omit [NumberField L] [FiniteDimensional K L] in +open scoped Classical in +/-- Pulling an exact extension back by `σ` carries its centre by the +inverse prime permutation. -/ +theorem finitePlaceExtensionCentre_conjugate + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) + (σ : L ≃ₐ[K] L) : + finitePlaceExtensionCentre + (K := K) (L := L) v + (absoluteValueExtensionConjugate + (HeightOneSpectrum.adicAbv K v) w σ) = + finitePlaceEquiv K L σ⁻¹ + (finitePlaceExtensionCentre + (K := K) (L := L) v w) := by + apply HeightOneSpectrum.ext + ext x + change + x ∈ finitePlaceExtensionCentreIdeal + (K := K) (L := L) v + (absoluteValueExtensionConjugate + (HeightOneSpectrum.adicAbv K v) w σ) ↔ + NumberField.RingOfIntegers.mapRingHom + σ.toRingHom x ∈ + finitePlaceExtensionCentreIdeal + (K := K) (L := L) v w + rw [mem_finitePlaceExtensionCentreIdeal_iff, + mem_finitePlaceExtensionCentreIdeal_iff] + rfl + +open scoped Classical in +/-- An exact extension of the absolute value at `v`, regarded as a finite +place of `L` lying above `v`. -/ +noncomputable def finitePlaceExtensionCentreInFibre + (v : HeightOneSpectrum (𝓞 K)) : + AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L → + {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = v} := + fun w => + ⟨finitePlaceExtensionCentre (K := K) (L := L) v w, + finitePlaceBelow_finitePlaceExtensionCentre + (K := K) (L := L) v w⟩ + +omit [FiniteDimensional K L] in +open scoped Classical in +@[simp] +theorem finitePlaceExtensionCentreInFibre_coe + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + (finitePlaceExtensionCentreInFibre + (K := K) (L := L) v w : + HeightOneSpectrum (𝓞 L)) = + finitePlaceExtensionCentre (K := K) (L := L) v w := + rfl + +omit [FiniteDimensional K L] in +open scoped Classical in +theorem finitePlaceExtensionCentreInFibre_injective + (v : HeightOneSpectrum (𝓞 K)) : + Function.Injective + (finitePlaceExtensionCentreInFibre + (K := K) (L := L) v) := by + intro w w' h + apply finitePlaceExtensionCentre_injective + (K := K) (L := L) v + exact congrArg Subtype.val h + +open scoped Classical in +private theorem + finitePlaceExtensionCentreInFibre_surjective_of_isGalois + [IsGalois K L] + (v : HeightOneSpectrum (𝓞 K)) : + Function.Surjective + (finitePlaceExtensionCentreInFibre + (K := K) (L := L) v) := by + let w₀ : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L := + pullbackAbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) + (RayClass.adicAbv_isNontrivial v) + IsAlgClosed.lift + let W₀ := + finitePlaceExtensionCentre (K := K) (L := L) v w₀ + let : Finite (L ≃ₐ[K] L) := + IsGaloisGroup.finite (L ≃ₐ[K] L) K L + let : + IsGaloisGroup (L ≃ₐ[K] L) (𝓞 K) (𝓞 L) := + IsGaloisGroup.of_isFractionRing + (L ≃ₐ[K] L) (𝓞 K) (𝓞 L) K L + intro W + let : W₀.asIdeal.LiesOver v.asIdeal := + ⟨(finitePlaceExtensionCentreIdeal_under + (K := K) (L := L) v w₀).symm⟩ + let : W.1.asIdeal.LiesOver v.asIdeal := ⟨by + have h := congrArg HeightOneSpectrum.asIdeal W.2 + simpa only [finitePlaceBelow_asIdeal] using h.symm⟩ + obtain ⟨σ, hσ⟩ := + HilbertRamification.Dedekind.exists_smul_eq_of_isGaloisGroup + v.asIdeal W₀.asIdeal W.1.asIdeal (L ≃ₐ[K] L) + have hplace : + finitePlaceEquiv K L σ W₀ = W.1 := by + apply HeightOneSpectrum.ext + rw [finitePlaceEquiv_asIdeal] + exact hσ + refine ⟨absoluteValueExtensionConjugate + (HeightOneSpectrum.adicAbv K v) w₀ σ⁻¹, ?_⟩ + apply Subtype.ext + rw [finitePlaceExtensionCentreInFibre_coe, + finitePlaceExtensionCentre_conjugate] + simpa only [inv_inv] using hplace + +open scoped Classical in +/-- Every finite place of `L` above `v` is the centre of an exact extension +of the normalized absolute value at `v`. -/ +theorem finitePlaceExtensionCentreInFibre_surjective + (v : HeightOneSpectrum (𝓞 K)) : + Function.Surjective + (finitePlaceExtensionCentreInFibre + (K := K) (L := L) v) := by + intro W + let M := finiteNormalClosure K L + let e : L →ₐ[K] M := + finiteNormalClosureEmbedding K L + let : Algebra L M := + e.toRingHom.toAlgebra + let : IsScalarTower K L M := + IsScalarTower.of_algebraMap_eq' + e.comp_algebraMap.symm + let : FiniteDimensional L M := + FiniteDimensional.right K L M + obtain ⟨Q, hQmax, hQover⟩ := + Ideal.exists_maximal_ideal_liesOver_of_isIntegral + (S := 𝓞 M) W.1.asIdeal + let : Q.IsMaximal := + hQmax + let U : HeightOneSpectrum (𝓞 M) := + { asIdeal := Q + isPrime := hQmax.isPrime + ne_bot := + Ideal.IsMaximal.ne_bot_of_isIntegral_int Q } + have hUbelowL : + finitePlaceBelow (K := L) U = W.1 := by + apply HeightOneSpectrum.ext + exact hQover.over.symm + have hUbelowK : + finitePlaceBelow (K := K) U = v := by + have htrans : + finitePlaceBelow (K := K) + (finitePlaceBelow (K := L) U) = + finitePlaceBelow (K := K) U := by + apply HeightOneSpectrum.ext + exact + Ideal.under_under + (A := 𝓞 K) (B := 𝓞 L) (C := 𝓞 M) Q + rw [← htrans, hUbelowL, W.2] + let Uv : + {U : HeightOneSpectrum (𝓞 M) // + finitePlaceBelow (K := K) U = v} := + ⟨U, hUbelowK⟩ + obtain ⟨uM, huM⟩ := + finitePlaceExtensionCentreInFibre_surjective_of_isGalois + (K := K) (L := M) v Uv + have hcentreM : + finitePlaceExtensionCentre + (K := K) (L := M) v uM = U := + congrArg Subtype.val huM + have hcentreIdealM : + finitePlaceExtensionCentreIdeal + (K := K) (L := M) v uM = Q := by + simpa only [finitePlaceExtensionCentre_asIdeal] using + congrArg HeightOneSpectrum.asIdeal hcentreM + let uL : + AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L := + { val := + uM.1.comp (f := algebraMap L M) + (algebraMap L M).injective + property := by + intro x + change + uM.1 + (algebraMap L M + (algebraMap K L x)) = + HeightOneSpectrum.adicAbv K v x + rw [← IsScalarTower.algebraMap_apply K L M] + exact uM.2 x } + refine ⟨uL, ?_⟩ + apply Subtype.ext + apply HeightOneSpectrum.ext + ext x + change + x ∈ finitePlaceExtensionCentreIdeal + (K := K) (L := L) v uL ↔ + x ∈ W.1.asIdeal + rw [mem_finitePlaceExtensionCentreIdeal_iff] + change + uM.1 (algebraMap L M (x : L)) < 1 ↔ + x ∈ W.1.asIdeal + have hmap : + ((algebraMap (𝓞 L) (𝓞 M) x : 𝓞 M) : M) = + algebraMap L M (x : L) := + rfl + rw [← hmap] + rw [← mem_finitePlaceExtensionCentreIdeal_iff + (K := K) (L := M) v uM + (algebraMap (𝓞 L) (𝓞 M) x), + hcentreIdealM, hQover.over] + rfl + +open scoped Classical in +/-- The exact normalized extensions of the finite absolute value at `v` +are canonically indexed by the finite places of `L` above `v`. -/ +noncomputable def finitePlaceExtensionEquivAbove + (v : HeightOneSpectrum (𝓞 K)) : + AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L ≃ + {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = v} := + Equiv.ofBijective + (finitePlaceExtensionCentreInFibre + (K := K) (L := L) v) + ⟨finitePlaceExtensionCentreInFibre_injective + (K := K) (L := L) v, + finitePlaceExtensionCentreInFibre_surjective + (K := K) (L := L) v⟩ + +open scoped Classical in +@[simp] +theorem finitePlaceExtensionEquivAbove_coe + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + (finitePlaceExtensionEquivAbove + (K := K) (L := L) v w : + HeightOneSpectrum (𝓞 L)) = + finitePlaceExtensionCentre (K := K) (L := L) v w := + rfl + +end Centre diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/FinitePlaceAdicCompletionCongrEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/FinitePlaceAdicCompletionCongrEquiv.lean new file mode 100644 index 0000000000..0358ccc654 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/FinitePlaceAdicCompletionCongrEquiv.lean @@ -0,0 +1,79 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +/-! +# Adic completions under a number-field equivalence + +The existing continuous maps of adic completions along an equivalence of +number fields are mutual inverses. This bundles them as a field equivalence +for transporting local Hilbert pairings. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +universe u v + +variable {K : Type u} {M : Type v} + [Field K] [NumberField K] [Field M] [NumberField M] + +/-- The finite completion at corresponding places, viewed as a field +equivalence rather than merely a continuous map. -/ +def finitePlaceAdicCompletionCongrEquiv + (e : K ≃ₐ[ℚ] M) (W : HeightOneSpectrum (𝓞 M)) : + ((finitePlaceCongr e).symm W).adicCompletion K ≃+* + W.adicCompletion M := by + letI : Algebra K M := e.toRingHom.toAlgebra + letI : Algebra M K := e.symm.toRingHom.toAlgebra + let w := (finitePlaceCongr e).symm W + have hKM : finitePlaceBelow (K := K) W = w := by + apply HeightOneSpectrum.ext + rfl + have hMK : finitePlaceBelow (K := M) w = W := by + have he : finitePlaceCongr e w = W := + (finitePlaceCongr e).apply_symm_apply W + apply HeightOneSpectrum.ext + rw [← he] + rfl + haveI : IsScalarTower K M K := by + apply IsScalarTower.of_algebraMap_eq' + ext x + change x = e.symm (e x) + exact (e.symm_apply_apply x).symm + haveI : IsScalarTower M K M := by + apply IsScalarTower.of_algebraMap_eq' + ext x + change x = e (e.symm x) + exact (e.apply_symm_apply x).symm + let f : w.adicCompletion K →+* W.adicCompletion M := + finitePlaceAdicCompletionMap K M w ⟨W, hKM⟩ + let g : W.adicCompletion M →+* w.adicCompletion K := + finitePlaceAdicCompletionMap M K W ⟨w, hMK⟩ + exact RingEquiv.ofRingHom f g + (by + apply RingHom.ext + intro x + change f (g x) = x + rw [finitePlaceAdicCompletionMap_comp M M (M := K) + W w W hMK hKM (finitePlaceBelow_self W) x] + exact finitePlaceAdicCompletionMap_self_apply M W x) + (by + apply RingHom.ext + intro x + change g (f x) = x + rw [finitePlaceAdicCompletionMap_comp K K (M := M) + w W w hKM hMK (finitePlaceBelow_self w) x] + exact finitePlaceAdicCompletionMap_self_apply K w x) + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/IntegerRingComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/IntegerRingComparison.lean new file mode 100644 index 0000000000..5bcad6c0ea --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/IntegerRingComparison.lean @@ -0,0 +1,611 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueGalois +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization +public import Mathlib.NumberTheory.Padics.HeightOneSpectrum +/-! +# Integer rings in the two finite-place completion models + +This file restricts the canonical equivalences between the absolute-value and +adic completion models to their valuation rings. It also identifies the +residue field of a rational finite-place completion. +-/ + +@[expose] public section + +open scoped NumberField NNReal ValuativeRel +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +open scoped Classical in +/-- Embed global integers into the valuation ring of their finite-place +completion. -/ +noncomputable def finitePlaceIntegerToCompletion + {K : Type} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) : + (𝓞 K) →+* 𝒪[ChosenFinitePlaceBaseCompletion (K := K) v] := + RingHom.codRestrict + ((algebraMap K (ChosenFinitePlaceBaseCompletion (K := K) v)).comp + (algebraMap (𝓞 K) K)) + 𝒪[ChosenFinitePlaceBaseCompletion (K := K) v] (by + intro x + rw [finitePlaceCompletion_mem_integers_iff_norm_le_one] + change ‖((WithAbs.toAbs (HeightOneSpectrum.adicAbv K v) (x : K) : + WithAbs (HeightOneSpectrum.adicAbv K v)) : + ChosenFinitePlaceBaseCompletion (K := K) v)‖ ≤ 1 + rw [UniformSpace.Completion.norm_coe, WithAbs.norm_toAbs_eq] + rw [HeightOneSpectrum.adicAbv_def] + apply (WithZeroMulInt.toNNReal_le_one_iff + (HeightOneSpectrum.one_lt_absNorm_nnreal v)).2 + rw [HeightOneSpectrum.valuation_of_algebraMap] + exact v.intValuation_le_one x) + +open scoped Classical in +@[simp] +theorem finitePlaceIntegerToCompletion_coe + {K : Type} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) (x : 𝓞 K) : + ((finitePlaceIntegerToCompletion v x : + 𝒪[ChosenFinitePlaceBaseCompletion (K := K) v]) : + ChosenFinitePlaceBaseCompletion (K := K) v) = + algebraMap K (ChosenFinitePlaceBaseCompletion (K := K) v) (x : K) := + rfl + +open scoped Classical in +/-- The comparison with the adic model takes a global element to its +standard finite-place embedding. -/ +@[simp] +theorem finitePlaceCompletionRingEquiv_toCompletion + {K : Type} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) (x : K) : + finitePlaceCompletionRingEquiv v + (algebraMap K (ChosenFinitePlaceBaseCompletion (K := K) v) x) = + FinitePlace.embedding v x := by + change finitePlaceCompletionRingHom v + ((WithAbs.toAbs (HeightOneSpectrum.adicAbv K v) x : + WithAbs (HeightOneSpectrum.adicAbv K v)) : + ChosenFinitePlaceBaseCompletion (K := K) v) = _ + rw [finitePlaceCompletionRingHom_coe, + finitePlaceCompletionBaseMap_apply] + rfl + +open scoped Classical in +/-- Localizing the ring of integers at a finite prime preserves its residue +field. This is the ideal-theoretic end of the finite-completion residue +comparison. -/ +noncomputable def finitePlaceIdealResidueEquivLocalization + {K : Type*} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) : + (𝓞 K ⧸ v.asIdeal) ≃+* + IsLocalRing.ResidueField (v.valuationSubringAtPrime K) := + IsLocalization.AtPrime.equivQuotMaximalIdeal + v.asIdeal (v.valuationSubringAtPrime K) + +open scoped Classical in +/-- The residue field at a finite prime is canonically the residue field of +its normalized absolute-value completion. -/ +noncomputable def finitePlaceIdealResidueEquivCompletion + {K : Type} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) : + (𝓞 K ⧸ v.asIdeal) ≃+* + 𝓀[ChosenFinitePlaceBaseCompletion (K := K) v] := by + let a := HeightOneSpectrum.adicAbv K v + let ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a := + (AbsoluteValue.isNonarchimedean_iff_bounded_nat a).1 + (HeightOneSpectrum.isNonarchimedean_adicAbv K v) + let aC := AbsoluteValue.completionAbsoluteValue a + let haC : LubinTate.Valuations.NonarchimedeanAbsoluteValue aC := + (AbsoluteValue.isNonarchimedean_iff_bounded_nat aC).1 + (AbsoluteValue.completionAbsoluteValue_isNonarchimedean a + (HeightOneSpectrum.isNonarchimedean_adicAbv K v)) + let eBase : + (v.valuationSubringAtPrime K) ≃+* + LubinTate.Valuations.exponentialValuationSubring + (absoluteValueExponentialValuation a ha) := + RingEquiv.restrict (RingEquiv.refl K) + (v.valuationSubringAtPrime K) + (LubinTate.Valuations.exponentialValuationSubring + (absoluteValueExponentialValuation a ha)) (by + intro x + rw [v.valuationSubringAtPrime_eq_valuationSubring] + change (v.valuation K) x ≤ 1 ↔ + x ∈ LubinTate.Valuations.exponentialValuationSubring + (absoluteValueExponentialValuation a ha) + rw [mem_absoluteValueExponentialSubring_iff] + rw [HeightOneSpectrum.adicAbv_def] + exact (WithZeroMulInt.toNNReal_le_one_iff + (HeightOneSpectrum.one_lt_absNorm_nnreal v)).symm) + let eCompletion : + LubinTate.Valuations.exponentialValuationSubring + (absoluteValueExponentialValuation aC haC) ≃+* + 𝒪[ChosenFinitePlaceBaseCompletion (K := K) v] := + RingEquiv.restrict (RingEquiv.refl a.Completion) + (LubinTate.Valuations.exponentialValuationSubring + (absoluteValueExponentialValuation aC haC)) + 𝒪[ChosenFinitePlaceBaseCompletion (K := K) v] (by + intro x + rw [mem_absoluteValueExponentialSubring_iff] + rw [finitePlaceCompletion_mem_integers_iff_norm_le_one] + rfl) + exact (finitePlaceIdealResidueEquivLocalization v).trans + ((IsLocalRing.ResidueField.mapEquiv eBase).trans + ((completionResidueEquiv a ha).trans + (IsLocalRing.ResidueField.mapEquiv eCompletion))) + +open scoped Classical in +@[simp] +theorem finitePlaceIdealResidueEquivCompletion_apply_mk + {K : Type} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) (x : 𝓞 K) : + finitePlaceIdealResidueEquivCompletion v + (Ideal.Quotient.mk v.asIdeal x) = + IsLocalRing.residue + 𝒪[ChosenFinitePlaceBaseCompletion (K := K) v] + (finitePlaceIntegerToCompletion v x) := by + unfold finitePlaceIdealResidueEquivCompletion + finitePlaceIdealResidueEquivLocalization + rfl + +open scoped Classical in +/-- The finite completion and its defining prime ideal have residue fields +of the same cardinality. -/ +theorem finitePlaceCompletion_residueField_card + {K : Type} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) : + Nat.card 𝓀[ChosenFinitePlaceBaseCompletion (K := K) v] = + Nat.card (𝓞 K ⧸ v.asIdeal) := + Nat.card_congr (finitePlaceIdealResidueEquivCompletion v).symm.toEquiv + +open scoped Classical in +/-- The canonical equivalence of completion fields identifies their two +valuation rings. -/ +theorem finitePlaceCompletionRingEquiv_mem_integers_iff + {K : Type} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) + (x : ChosenFinitePlaceBaseCompletion (K := K) v) : + finitePlaceCompletionRingEquiv v x ∈ + v.adicCompletionIntegers K ↔ + x ∈ 𝒪[ChosenFinitePlaceBaseCompletion (K := K) v] := by + symm + have hnorm : + ‖finitePlaceCompletionRingEquiv v x‖ = ‖x‖ := + (finitePlaceCompletionRingHom_isometry v).norm_map_of_map_zero + (map_zero (finitePlaceCompletionRingHom v)) x + rw [finitePlaceCompletion_mem_integers_iff_norm_le_one + (HeightOneSpectrum.adicAbv K v) + (HeightOneSpectrum.isNonarchimedean_adicAbv K v) x] + constructor + · intro hx + apply mem_adicCompletionIntegers_of_norm_le_one v + simpa only [hnorm] using hx + · intro hx + have hxnorm := + norm_le_one_of_mem_adicCompletionIntegers v hx + simpa only [hnorm] using hxnorm + +open scoped Classical in +/-- The canonical equivalence between the valuation ring of the +absolute-value completion and mathlib's adic completion integers. -/ +noncomputable def finitePlaceCompletionIntegerRingEquiv + {K : Type} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) : + 𝒪[ChosenFinitePlaceBaseCompletion (K := K) v] ≃+* + v.adicCompletionIntegers K := + RingEquiv.restrict + (finitePlaceCompletionRingEquiv v) + 𝒪[ChosenFinitePlaceBaseCompletion (K := K) v] + (v.adicCompletionIntegers K).toSubring + (fun x => + (finitePlaceCompletionRingEquiv_mem_integers_iff v x).symm) + +open scoped Classical in +/-- The canonical equivalence between the valuation ring of the chosen +localized completion and the concrete adic completion integers at its +centre. -/ +noncomputable def chosenFinitePlaceLocalizedIntegerRingEquiv + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (v : HeightOneSpectrum (𝓞 K)) : + let W := + finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v) + 𝒪[ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v] ≃+* + W.adicCompletionIntegers L := by + let vK := HeightOneSpectrum.adicAbv K v + let w := chosenFinitePlaceExtension (L := L) v + let W := + finitePlaceExtensionCentre + (K := K) (L := L) v w + let E := + ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v + let eField : E ≃+* W.adicCompletion L := + (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + vK (RayClass.adicAbv_isNontrivial v) w).toRingEquiv.trans + (finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w) + exact + RingEquiv.restrict eField 𝒪[E] + (W.adicCompletionIntegers L).toSubring (by + intro x + symm + change + eField x ∈ W.adicCompletionIntegers L ↔ + x ∈ 𝒪[E] + change + finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w + (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + vK (RayClass.adicAbv_isNontrivial v) w x) ∈ + W.adicCompletionIntegers L ↔ + x ∈ 𝒪[E] + rw [ + finitePlaceExtensionAdicCompletionRingEquiv_mem_integers_iff, + mem_absoluteValueCompletionIntegers_iff, + localizedCompletion_mem_integers_iff_norm_le_one + vK w + (HeightOneSpectrum.isNonarchimedean_adicAbv K v) x] + rfl) + +open scoped Classical in +/-- The integer rings of the standard completion at the centre and of the +chosen localized completion are canonically equivalent. -/ +noncomputable def standardToChosenLocalizedIntegerRingEquiv + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (v : HeightOneSpectrum (𝓞 K)) : + let W := finitePlaceExtensionCentre + (K := K) (L := L) v (chosenFinitePlaceExtension (L := L) v) + 𝒪[ChosenFinitePlaceBaseCompletion (K := L) W] ≃+* + 𝒪[ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v] := by + let W := finitePlaceExtensionCentre + (K := K) (L := L) v (chosenFinitePlaceExtension (L := L) v) + exact (finitePlaceCompletionIntegerRingEquiv W).trans + (chosenFinitePlaceLocalizedIntegerRingEquiv (K := K) (L := L) v).symm + +open scoped Classical in +/-- Embed global integers into the integer ring of the chosen localized +completion, through the canonical comparison of completion models. -/ +noncomputable def chosenFinitePlaceIntegerToLocalizedCompletion + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (v : HeightOneSpectrum (𝓞 K)) : + (𝓞 L) →+* + 𝒪[ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v] := by + let W := finitePlaceExtensionCentre + (K := K) (L := L) v (chosenFinitePlaceExtension (L := L) v) + exact (standardToChosenLocalizedIntegerRingEquiv + (K := K) (L := L) v).toRingHom.comp + (finitePlaceIntegerToCompletion W) + +open scoped Classical in +/-- On global integers the chosen localized integer-ring map is the +standard field embedding into the algebraic localization. -/ +@[simp] +theorem chosenFinitePlaceIntegerToLocalizedCompletion_coe + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (v : HeightOneSpectrum (𝓞 K)) (x : 𝓞 L) : + ((chosenFinitePlaceIntegerToLocalizedCompletion + (K := K) (L := L) v x : + 𝒪[ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v]) : + ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v) = + AbsoluteValue.toAlgebraicLocalization + (HeightOneSpectrum.adicAbv K v) + (chosenFinitePlaceExtension (L := L) v).1 + (chosenFinitePlaceExtension (L := L) v).2 + (x : L) := by + let vK := HeightOneSpectrum.adicAbv K v + let w := chosenFinitePlaceExtension (L := L) v + let W := finitePlaceExtensionCentre (K := K) (L := L) v w + let E := ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v + let eField : E ≃+* W.adicCompletion L := + (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + vK (RayClass.adicAbv_isNontrivial v) w).toRingEquiv.trans + (finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w) + have hRight : + eField (AbsoluteValue.toAlgebraicLocalization + vK w.1 w.2 (x : L)) = + FinitePlace.embedding W (x : L) := by + change + finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w + (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + vK (RayClass.adicAbv_isNontrivial v) w + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 (x : L))) = + FinitePlace.embedding W (x : L) + rw [AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion_coe, + AbsoluteValue.toAlgebraicLocalization_apply] + exact finitePlaceExtensionAdicCompletionRingEquiv_toCompletion v w (x : L) + apply eField.injective + calc + eField + ((chosenFinitePlaceIntegerToLocalizedCompletion + (K := K) (L := L) v x : 𝒪[E]) : E) = + finitePlaceCompletionRingEquiv W + ((finitePlaceIntegerToCompletion W x : + 𝒪[ChosenFinitePlaceBaseCompletion (K := L) W]) : + ChosenFinitePlaceBaseCompletion (K := L) W) := by + have hInteger : + chosenFinitePlaceLocalizedIntegerRingEquiv (K := K) (L := L) v + (chosenFinitePlaceIntegerToLocalizedCompletion + (K := K) (L := L) v x) = + finitePlaceCompletionIntegerRingEquiv W + (finitePlaceIntegerToCompletion W x) := by + change + (chosenFinitePlaceLocalizedIntegerRingEquiv (K := K) (L := L) v) + ((chosenFinitePlaceLocalizedIntegerRingEquiv + (K := K) (L := L) v).symm + ((finitePlaceCompletionIntegerRingEquiv W) + (finitePlaceIntegerToCompletion W x))) = _ + exact RingEquiv.apply_symm_apply _ _ + exact congrArg + (fun y : W.adicCompletionIntegers L => + (y : W.adicCompletion L)) hInteger + _ = FinitePlace.embedding W (x : L) := by + rw [finitePlaceIntegerToCompletion_coe] + exact finitePlaceCompletionRingEquiv_toCompletion W (x : L) + _ = eField (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 (x : L)) := + hRight.symm + +open scoped Classical in +/-- Restriction of a decomposition-group automorphism to global integers +commutes with their embedding in the chosen algebraic localization. -/ +theorem chosenFinitePlaceIntegerToLocalizedCompletion_equivariant + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (v : HeightOneSpectrum (𝓞 K)) + (σ : HilbertRamification.absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := L) v).1) + (x : 𝓞 L) : + let vK := HeightOneSpectrum.adicAbv K v + let w := chosenFinitePlaceExtension (L := L) v + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + (HilbertRamification.decompositionGroupEquivAlgebraicLocalizationAut + vK (RayClass.adicAbv_isNontrivial v) w σ) + ((chosenFinitePlaceIntegerToLocalizedCompletion + (K := K) (L := L) v x : + 𝒪[ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v]) : + ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v) = + ((chosenFinitePlaceIntegerToLocalizedCompletion + (K := K) (L := L) v + (NumberField.RingOfIntegers.mapAlgEquiv (σ : L ≃ₐ[K] L) x) : + 𝒪[ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v]) : + ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v) := by + let vK := HeightOneSpectrum.adicAbv K v + let w := chosenFinitePlaceExtension (L := L) v + rw [chosenFinitePlaceIntegerToLocalizedCompletion_coe, + chosenFinitePlaceIntegerToLocalizedCompletion_coe] + change + (HilbertRamification.decompositionGroupEquivAlgebraicLocalizationAut + vK (RayClass.adicAbv_isNontrivial v) w σ) + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 (x : L)) = + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + ((σ : L ≃ₐ[K] L) (x : L)) + exact + HilbertRamification.localizationRamificationGroups_decompositionGroupEquiv_toLocalization + vK (RayClass.adicAbv_isNontrivial v) w σ (x : L) + +open scoped Classical in +/-- The centre ideal and the chosen localized completion have canonically +equivalent residue fields. This transfers ideal-theoretic Frobenius +conditions to the local field on which the chosen Artin map acts. -/ +noncomputable def chosenFinitePlaceLocalizedResidueEquiv + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (v : HeightOneSpectrum (𝓞 K)) : + let W := finitePlaceExtensionCentre + (K := K) (L := L) v (chosenFinitePlaceExtension (L := L) v) + (𝓞 L ⧸ W.asIdeal) ≃+* + 𝓀[ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v] := by + let W := finitePlaceExtensionCentre + (K := K) (L := L) v (chosenFinitePlaceExtension (L := L) v) + exact (finitePlaceIdealResidueEquivCompletion W).trans + (IsLocalRing.ResidueField.mapEquiv + (standardToChosenLocalizedIntegerRingEquiv (K := K) (L := L) v)) + +open scoped Classical in +theorem chosenFinitePlaceLocalizedResidueEquiv_apply_mk + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (v : HeightOneSpectrum (𝓞 K)) (x : 𝓞 L) : + let W := finitePlaceExtensionCentre + (K := K) (L := L) v (chosenFinitePlaceExtension (L := L) v) + chosenFinitePlaceLocalizedResidueEquiv (K := K) (L := L) v + (Ideal.Quotient.mk W.asIdeal x) = + IsLocalRing.residue + 𝒪[ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v] + (chosenFinitePlaceIntegerToLocalizedCompletion + (K := K) (L := L) v x) := by + let W := finitePlaceExtensionCentre + (K := K) (L := L) v (chosenFinitePlaceExtension (L := L) v) + let eInteger : + 𝒪[ChosenFinitePlaceBaseCompletion (K := L) W] ≃+* + 𝒪[ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v] := + standardToChosenLocalizedIntegerRingEquiv (K := K) (L := L) v + have hMap : + eInteger (finitePlaceIntegerToCompletion W x) = + chosenFinitePlaceIntegerToLocalizedCompletion + (K := K) (L := L) v x := by + rfl + calc + chosenFinitePlaceLocalizedResidueEquiv (K := K) (L := L) v + (Ideal.Quotient.mk W.asIdeal x) = + (IsLocalRing.ResidueField.mapEquiv eInteger) + (finitePlaceIdealResidueEquivCompletion W + (Ideal.Quotient.mk W.asIdeal x)) := by + rfl + _ = (IsLocalRing.ResidueField.mapEquiv eInteger) + (IsLocalRing.residue + 𝒪[ChosenFinitePlaceBaseCompletion (K := L) W] + (finitePlaceIntegerToCompletion W x)) := by + exact congrArg (IsLocalRing.ResidueField.mapEquiv eInteger) + (finitePlaceIdealResidueEquivCompletion_apply_mk W x) + _ = IsLocalRing.residue + 𝒪[ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v] + (eInteger (finitePlaceIntegerToCompletion W x)) := by + rfl + _ = IsLocalRing.residue + 𝒪[ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v] + (chosenFinitePlaceIntegerToLocalizedCompletion + (K := K) (L := L) v x) := by + exact congrArg + (IsLocalRing.residue + 𝒪[ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v]) hMap + +open scoped Classical in +/-- The chosen comparison from the prime-ideal residue field to the localized +completion residue field respects the decomposition-group action. -/ +theorem chosenFinitePlaceLocalizedResidueEquiv_equivariant + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (v : HeightOneSpectrum (𝓞 K)) + (σ : HilbertRamification.absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := L) v).1) + (x : 𝓞 L) : + let vK := HeightOneSpectrum.adicAbv K v + let w := chosenFinitePlaceExtension (L := L) v + let W := finitePlaceExtensionCentre (K := K) (L := L) v w + let C := ChosenFinitePlaceBaseCompletion (K := K) v + let E := ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + chosenFinitePlaceLocalizedResidueEquiv (K := K) (L := L) v + (Ideal.Quotient.mk W.asIdeal + (NumberField.RingOfIntegers.mapAlgEquiv (σ : L ≃ₐ[K] L) x)) = + LocalFieldTheory.galoisGroupResidueAlgEquivOfIsIntegralClosure C E + ((HilbertRamification.decompositionGroupEquivAlgebraicLocalizationAut + vK (RayClass.adicAbv_isNontrivial v) w) σ) + (chosenFinitePlaceLocalizedResidueEquiv (K := K) (L := L) v + (Ideal.Quotient.mk W.asIdeal x)) := by + let vK := HeightOneSpectrum.adicAbv K v + let w := chosenFinitePlaceExtension (L := L) v + let W := finitePlaceExtensionCentre (K := K) (L := L) v w + let C := ChosenFinitePlaceBaseCompletion (K := K) v + let E := ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v + let f : E ≃ₐ[C] E := + (HilbertRamification.decompositionGroupEquivAlgebraicLocalizationAut + vK (RayClass.adicAbv_isNontrivial v) w) σ + let y : 𝒪[E] := chosenFinitePlaceIntegerToLocalizedCompletion + (K := K) (L := L) v x + have hInt : + LocalFieldTheory.galoisGroupIntegerRingEquivOfIsIntegralClosure C E f y = + chosenFinitePlaceIntegerToLocalizedCompletion (K := K) (L := L) v + (NumberField.RingOfIntegers.mapAlgEquiv (σ : L ≃ₐ[K] L) x) := by + apply Subtype.ext + rw [LocalFieldTheory.galoisGroupIntegerRingEquivOfIsIntegralClosure_apply] + exact chosenFinitePlaceIntegerToLocalizedCompletion_equivariant + (K := K) (L := L) v σ x + calc + chosenFinitePlaceLocalizedResidueEquiv (K := K) (L := L) v + (Ideal.Quotient.mk W.asIdeal + (NumberField.RingOfIntegers.mapAlgEquiv (σ : L ≃ₐ[K] L) x)) = + IsLocalRing.residue 𝒪[E] + (chosenFinitePlaceIntegerToLocalizedCompletion (K := K) (L := L) v + (NumberField.RingOfIntegers.mapAlgEquiv (σ : L ≃ₐ[K] L) x)) := + chosenFinitePlaceLocalizedResidueEquiv_apply_mk (K := K) (L := L) v _ + _ = IsLocalRing.residue 𝒪[E] + (LocalFieldTheory.galoisGroupIntegerRingEquivOfIsIntegralClosure C E f y) := + congrArg (IsLocalRing.residue 𝒪[E]) hInt.symm + _ = LocalFieldTheory.galoisGroupResidueAlgEquivOfIsIntegralClosure C E f + (IsLocalRing.residue 𝒪[E] y) := + (LocalFieldTheory.galoisGroupResidueFieldEquivOfIsIntegralClosure_residue + C E f y).symm + _ = LocalFieldTheory.galoisGroupResidueAlgEquivOfIsIntegralClosure C E f + (chosenFinitePlaceLocalizedResidueEquiv (K := K) (L := L) v + (Ideal.Quotient.mk W.asIdeal x)) := by + exact congrArg + (LocalFieldTheory.galoisGroupResidueAlgEquivOfIsIntegralClosure C E f) + (chosenFinitePlaceLocalizedResidueEquiv_apply_mk + (K := K) (L := L) v x).symm + +open scoped Classical in +/-- The residue cardinality of the chosen localized extension is the norm +of its centre ideal. -/ +theorem chosenFinitePlaceLocalized_residueField_card + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (v : HeightOneSpectrum (𝓞 K)) : + let W := finitePlaceExtensionCentre + (K := K) (L := L) v (chosenFinitePlaceExtension (L := L) v) + Nat.card 𝓀[ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v] = + Nat.card (𝓞 L ⧸ W.asIdeal) := by + exact Nat.card_congr (chosenFinitePlaceLocalizedResidueEquiv + (K := K) (L := L) v).symm.toEquiv + +open scoped Classical in +/-- The residue field of the absolute-value completion at a rational finite +place has cardinality equal to the natural prime represented by that place. -/ +theorem rationalFinitePlaceCompletion_residueField_card + (v : HeightOneSpectrum (𝓞 ℚ)) : + Nat.card + 𝓀[ChosenFinitePlaceBaseCompletion (K := ℚ) v] = + ((Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ) v : Nat.Primes) : ℕ) := by + let p : Nat.Primes := + Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ) v + let : Fact p.1.Prime := ⟨p.2⟩ + let eIntegers : + 𝒪[ChosenFinitePlaceBaseCompletion (K := ℚ) v] ≃+* + v.adicCompletionIntegers ℚ := + finitePlaceCompletionIntegerRingEquiv v + let ePadicIntegers : + v.adicCompletionIntegers ℚ ≃+* ℤ_[p.1] := + (Rat.HeightOneSpectrum.adicCompletionIntegers.padicIntEquiv v).toRingEquiv + let eResidue : + 𝓀[ChosenFinitePlaceBaseCompletion (K := ℚ) v] ≃+* + ZMod p.1 := + (IsLocalRing.ResidueField.mapEquiv + (eIntegers.trans ePadicIntegers)).trans + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicIntResidueFieldEquivZMod + p.1) + change Nat.card + 𝓀[ChosenFinitePlaceBaseCompletion (K := ℚ) v] = p.1 + calc + Nat.card + 𝓀[ChosenFinitePlaceBaseCompletion (K := ℚ) v] = + Nat.card (ZMod p.1) := + Nat.card_congr eResidue.toEquiv + _ = p.1 := Nat.card_zmod p.1 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/LocalizedValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/LocalizedValuation.lean new file mode 100644 index 0000000000..63248c2664 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/LocalizedValuation.lean @@ -0,0 +1,518 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralLocalFactor +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuativeExtension +/-! +# Valuation rings of algebraic localizations + +This file equips nonarchimedean absolute-value completions and their algebraic +localizations with the norm-induced valuation structures. It identifies the +localized valuation ring with the integral closure of the base valuation ring. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct ValuativeRel NNReal +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory + +variable + {K : Type} {L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +section LocalValuation + +variable (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + +omit [NumberField K] in +/-- A nonarchimedean absolute value makes its completion an ultrametric +space. -/ +theorem completionIsUltrametricDist + (hvKna : IsNonarchimedean (vK : K → ℝ)) : + IsUltrametricDist vK.Completion := + IsUltrametricDist.isUltrametricDist_of_isNonarchimedean_norm + (AbsoluteValue.completionAbsoluteValue_isNonarchimedean + vK hvKna) + +/-- The norm-induced valued-field structure on a nonarchimedean completion. -/ +@[reducible] +noncomputable def finitePlaceCompletionValued + (hvKna : IsNonarchimedean (vK : K → ℝ)) : + Valued vK.Completion ℝ≥0 := + letI : IsUltrametricDist vK.Completion := + completionIsUltrametricDist vK hvKna + NormedField.toValued + +/-- The valuation relation induced by the norm valuation on a +nonarchimedean completion. -/ +@[reducible] +noncomputable def finitePlaceCompletionValuativeRel + (hvKna : IsNonarchimedean (vK : K → ℝ)) : + ValuativeRel vK.Completion := by + letI : Valued vK.Completion ℝ≥0 := + finitePlaceCompletionValued vK hvKna + exact ValuativeRel.ofValuation + (Valued.v : Valuation vK.Completion ℝ≥0) + +omit [NumberField K] in +/-- Membership in the valuation ring of a nonarchimedean completion is +equivalent to the usual norm bound by one, for the canonical norm-induced +valuation used in this file. -/ +theorem finitePlaceCompletion_mem_integers_iff_norm_le_one + (hvKna : IsNonarchimedean (vK : K → ℝ)) + (x : vK.Completion) : + letI : Valued vK.Completion ℝ≥0 := + finitePlaceCompletionValued vK hvKna + letI : ValuativeRel vK.Completion := + finitePlaceCompletionValuativeRel vK hvKna + x ∈ 𝒪[vK.Completion] ↔ ‖x‖ ≤ 1 := by + let : Valued vK.Completion ℝ≥0 := + finitePlaceCompletionValued vK hvKna + let ν : Valuation vK.Completion ℝ≥0 := Valued.v + let : ValuativeRel vK.Completion := + finitePlaceCompletionValuativeRel vK hvKna + rw [Valuation.mem_integer_iff, + ← map_one (ValuativeRel.valuation vK.Completion), + ← Valuation.Compatible.vle_iff_le + (v := ValuativeRel.valuation vK.Completion)] + change ν x ≤ ν 1 ↔ _ + simp only [map_one] + change ‖x‖₊ ≤ 1 ↔ ‖x‖ ≤ 1 + exact NNReal.coe_le_coe + +omit [NumberField K] [NumberField L] [FiniteDimensional K L] + [IsGalois K L] in +/-- A chosen localization above a nonarchimedean place inherits an +ultrametric distance. -/ +theorem localizedCompletionIsUltrametricDist + (hvKna : IsNonarchimedean (vK : K → ℝ)) : + IsUltrametricDist (LocalizedCompletion vK w) := by + let hw : IsNonarchimedean (w.1 : L → ℝ) := + absoluteValueExtension_isNonarchimedean + vK hvKna w + let : IsUltrametricDist w.1.Completion := + IsUltrametricDist.isUltrametricDist_of_isNonarchimedean_norm + (AbsoluteValue.completionAbsoluteValue_isNonarchimedean + w.1 hw) + infer_instance + +/-- The norm-induced valued-field structure on the chosen algebraic +localization. -/ +@[reducible] +noncomputable def localizedCompletionFinitePlaceValued + (hvKna : IsNonarchimedean (vK : K → ℝ)) : + Valued (LocalizedCompletion vK w) ℝ≥0 := + letI : IsUltrametricDist (LocalizedCompletion vK w) := + localizedCompletionIsUltrametricDist vK w hvKna + NormedField.toValued + +/-- The valuation relation induced by the norm valuation on the chosen +algebraic localization. -/ +@[reducible] +noncomputable def localizedCompletionFinitePlaceValuativeRel + (hvKna : IsNonarchimedean (vK : K → ℝ)) : + ValuativeRel (LocalizedCompletion vK w) := by + letI : Valued (LocalizedCompletion vK w) ℝ≥0 := + localizedCompletionFinitePlaceValued vK w hvKna + exact ValuativeRel.ofValuation + (Valued.v : Valuation (LocalizedCompletion vK w) ℝ≥0) + +omit [NumberField K] [NumberField L] [FiniteDimensional K L] + [IsGalois K L] in +/-- Membership in the valuation ring of a chosen algebraic localization is +equivalent to the usual norm bound by one, for the canonical norm-induced +valuation used in this file. -/ +theorem localizedCompletion_mem_integers_iff_norm_le_one + (hvKna : IsNonarchimedean (vK : K → ℝ)) + (x : LocalizedCompletion vK w) : + letI : Valued (LocalizedCompletion vK w) ℝ≥0 := + localizedCompletionFinitePlaceValued vK w hvKna + letI : ValuativeRel (LocalizedCompletion vK w) := + localizedCompletionFinitePlaceValuativeRel vK w hvKna + x ∈ 𝒪[LocalizedCompletion vK w] ↔ ‖x‖ ≤ 1 := by + let : Valued (LocalizedCompletion vK w) ℝ≥0 := + localizedCompletionFinitePlaceValued vK w hvKna + let ν : Valuation (LocalizedCompletion vK w) ℝ≥0 := Valued.v + let : ValuativeRel (LocalizedCompletion vK w) := + localizedCompletionFinitePlaceValuativeRel vK w hvKna + rw [Valuation.mem_integer_iff, + ← map_one (ValuativeRel.valuation (LocalizedCompletion vK w)), + ← Valuation.Compatible.vle_iff_le + (v := ValuativeRel.valuation (LocalizedCompletion vK w))] + change ν x ≤ ν 1 ↔ _ + simp only [map_one] + change ‖x‖₊ ≤ 1 ↔ ‖x‖ ≤ 1 + exact NNReal.coe_le_coe + +omit [NumberField K] [NumberField L] [IsGalois K L] in +/-- The norm-defined integer ring of the chosen localization is the +integral closure of the norm-defined integer ring of the completed base. +This is the concrete Henselian source of the local integer-ring action. -/ +theorem localizedCompletion_integerRing_eq_integralClosure + (hvK : vK.IsNontrivial) + (hvKna : IsNonarchimedean (vK : K → ℝ)) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : Valued vK.Completion ℝ≥0 := + finitePlaceCompletionValued vK hvKna + letI : ValuativeRel vK.Completion := + finitePlaceCompletionValuativeRel vK hvKna + letI : Valued (LocalizedCompletion vK w) ℝ≥0 := + localizedCompletionFinitePlaceValued vK w hvKna + letI : ValuativeRel (LocalizedCompletion vK w) := + localizedCompletionFinitePlaceValuativeRel vK w hvKna + (ValuativeRel.valuation + (LocalizedCompletion vK w)).integer = + (integralClosure + (ValuativeRel.valuation vK.Completion).integer + (LocalizedCompletion vK w)).toSubring := by + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let : Valued vK.Completion ℝ≥0 := + finitePlaceCompletionValued vK hvKna + let : ValuativeRel vK.Completion := + finitePlaceCompletionValuativeRel vK hvKna + let : Valued (LocalizedCompletion vK w) ℝ≥0 := + localizedCompletionFinitePlaceValued vK w hvKna + let : ValuativeRel (LocalizedCompletion vK w) := + localizedCompletionFinitePlaceValuativeRel vK w hvKna + let aC := AbsoluteValue.completionAbsoluteValue vK + let bE := + AbsoluteValue.algebraicLocalizationAbsoluteValue + vK w.1 w.2 + let haC : + LubinTate.Valuations.NonarchimedeanAbsoluteValue aC := + (AbsoluteValue.isNonarchimedean_iff_bounded_nat aC).1 + (AbsoluteValue.completionAbsoluteValue_isNonarchimedean + vK hvKna) + let hbE : + LubinTate.Valuations.NonarchimedeanAbsoluteValue bE := + (AbsoluteValue.isNonarchimedean_iff_bounded_nat bE).1 + (absoluteValueExtension_isNonarchimedean + aC + (AbsoluteValue.completionAbsoluteValue_isNonarchimedean + vK hvKna) + ⟨bE, + AbsoluteValue.algebraicLocalizationAbsoluteValue_extends + vK w.1 w.2⟩) + let va := absoluteValueExponentialValuation aC haC + let vb := absoluteValueExponentialValuation bE hbE + let : Module.Finite vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + let : Algebra.IsAlgebraic vK.Completion + (LocalizedCompletion vK w) := + Algebra.IsAlgebraic.of_finite + vK.Completion (LocalizedCompletion vK w) + have hVaAbs : + LubinTate.Valuations.exponentialValuationSubringAsValuationSubring va = + absoluteValueValuationSubring aC haC := + associatedAbsoluteValue_valuationSubring_eq + va (Real.exp 1) aC haC + (absoluteValueExponentialValuation_associated aC haC) + have hVbAbs : + LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vb = + absoluteValueValuationSubring bE hbE := + associatedAbsoluteValue_valuationSubring_eq + vb (Real.exp 1) bE hbE + (absoluteValueExponentialValuation_associated bE hbE) + have hVa : + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring + va).toSubring = + (ValuativeRel.valuation vK.Completion).integer := by + rw [hVaAbs] + ext x + change + x ∈ absoluteValueValuationSubring aC haC ↔ + x ∈ (ValuativeRel.valuation vK.Completion).integer + rw [mem_absoluteValueValuationSubring_iff, + finitePlaceCompletion_mem_integers_iff_norm_le_one] + rfl + have hVb : + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring + vb).toSubring = + (ValuativeRel.valuation + (LocalizedCompletion vK w)).integer := by + rw [hVbAbs] + ext x + change + x ∈ absoluteValueValuationSubring bE hbE ↔ + x ∈ (ValuativeRel.valuation + (LocalizedCompletion vK w)).integer + rw [mem_absoluteValueValuationSubring_iff, + localizedCompletion_mem_integers_iff_norm_le_one] + rfl + have hhensAbs : + ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (absoluteValueValuationSubring aC haC).valuation := + henselianValuation_of_complete aC + ((absoluteValueCompleteness_completeSpace_withAbs_iff_complete aC).1 + (AbsoluteValue.completionAbsoluteValue_complete vK)) + haC + have hhens : + ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring + va).valuation := by + rw [hVaAbs] + exact hhensAbs + have hExt : ∀ x : vK.Completion, + vb (algebraMap vK.Completion + (LocalizedCompletion vK w) x) = va x := + absoluteValueExponentialValuation_extends + aC bE haC hbE + (AbsoluteValue.algebraicLocalizationAbsoluteValue_extends + vK w.1 w.2) + let W := + LubinTate.Valuations.exponentialValuationSubringAsValuationSubring va + let : Algebra W (LocalizedCompletion vK w) := inferInstance + have hclosure := + exponentialValuationSubring_eq_integralClosure_of_henselian + va vb hExt hhens + let O := (ValuativeRel.valuation vK.Completion).integer + have hWO : W.toSubring = O := by + simpa only [W, O] using hVa + let eWO : W ≃+* O := + { toFun := fun x => + ⟨x, by + rw [← hWO] + exact x.property⟩ + invFun := fun x => + ⟨x, by + change (x : vK.Completion) ∈ W.toSubring + rw [hWO] + exact x.property⟩ + left_inv := fun x ↦ by + apply Subtype.ext + rfl + right_inv := fun x ↦ by + apply Subtype.ext + rfl + map_mul' := fun x y ↦ by + apply Subtype.ext + rfl + map_add' := fun x y ↦ by + apply Subtype.ext + rfl } + have heWO : + (algebraMap O (LocalizedCompletion vK w)).comp + eWO.toRingHom = + algebraMap W (LocalizedCompletion vK w) := by + ext x + rw [RingHom.comp_apply, + IsScalarTower.algebraMap_apply O vK.Completion, + IsScalarTower.algebraMap_apply W vK.Completion] + rfl + ext x + change + x ∈ (ValuativeRel.valuation + (LocalizedCompletion vK w)).integer ↔ + IsIntegral O x + constructor + · intro hx + have hxv : + x ∈ + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring + vb).toSubring := by + rw [hVb] + exact hx + rw [hclosure] at hxv + have hxW : IsIntegral W x := hxv + exact (eWO.isIntegral_iff heWO x).1 hxW + · intro hx + have hxW : IsIntegral W x := + (eWO.isIntegral_iff heWO x).2 hx + have hxv : + x ∈ + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring + vb).toSubring := by + rw [hclosure] + exact hxW + rw [← hVb] + exact hxv + +omit [NumberField K] [NumberField L] [IsGalois K L] in +/-- The norm-defined integer ring of the chosen localization is the +actual integral closure of the norm-defined completed-base integer ring. -/ +theorem localizedCompletionIsIntegralClosure + (hvK : vK.IsNontrivial) + (hvKna : IsNonarchimedean (vK : K → ℝ)) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : Valued vK.Completion ℝ≥0 := + finitePlaceCompletionValued vK hvKna + letI : ValuativeRel vK.Completion := + finitePlaceCompletionValuativeRel vK hvKna + letI : Valued (LocalizedCompletion vK w) ℝ≥0 := + localizedCompletionFinitePlaceValued vK w hvKna + letI : ValuativeRel (LocalizedCompletion vK w) := + localizedCompletionFinitePlaceValuativeRel vK w hvKna + IsIntegralClosure + 𝒪[LocalizedCompletion vK w] + 𝒪[vK.Completion] + (LocalizedCompletion vK w) := by + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let : Valued vK.Completion ℝ≥0 := + finitePlaceCompletionValued vK hvKna + let : ValuativeRel vK.Completion := + finitePlaceCompletionValuativeRel vK hvKna + let : Valued (LocalizedCompletion vK w) ℝ≥0 := + localizedCompletionFinitePlaceValued vK w hvKna + let : ValuativeRel (LocalizedCompletion vK w) := + localizedCompletionFinitePlaceValuativeRel vK w hvKna + let h := + localizedCompletion_integerRing_eq_integralClosure + vK w hvK hvKna + refine + { algebraMap_injective := + (ValuativeRel.valuation + (LocalizedCompletion vK w)).integer.subtype_injective + isIntegral_iff := ?_ } + intro x + constructor + · intro hx + have hxO : x ∈ 𝒪[LocalizedCompletion vK w] := by + rw [h] + exact hx + exact ⟨⟨x, hxO⟩, rfl⟩ + · rintro ⟨y, rfl⟩ + change (y : LocalizedCompletion vK w) ∈ + (integralClosure 𝒪[vK.Completion] + (LocalizedCompletion vK w)).toSubring + rw [← h] + exact y.property + +omit [NumberField K] [NumberField L] [FiniteDimensional K L] + [IsGalois K L] in +/-- The intrinsic norm valuations on the completed base and on the +chosen localization form an extension pair. -/ +theorem localizedCompletionValuationHasExtension + (hvKna : IsNonarchimedean (vK : K → ℝ)) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : Valued vK.Completion ℝ≥0 := + finitePlaceCompletionValued vK hvKna + letI : ValuativeRel vK.Completion := + finitePlaceCompletionValuativeRel vK hvKna + letI : Valued (LocalizedCompletion vK w) ℝ≥0 := + localizedCompletionFinitePlaceValued vK w hvKna + letI : ValuativeRel (LocalizedCompletion vK w) := + localizedCompletionFinitePlaceValuativeRel vK w hvKna + Valuation.HasExtension + (ValuativeRel.valuation vK.Completion) + (ValuativeRel.valuation (LocalizedCompletion vK w)) := by + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let : Valued vK.Completion ℝ≥0 := + finitePlaceCompletionValued vK hvKna + let : ValuativeRel vK.Completion := + finitePlaceCompletionValuativeRel vK hvKna + let : Valued (LocalizedCompletion vK w) ℝ≥0 := + localizedCompletionFinitePlaceValued vK w hvKna + let : ValuativeRel (LocalizedCompletion vK w) := + localizedCompletionFinitePlaceValuativeRel vK w hvKna + apply Valuation.HasExtension.ofComapInteger + ext x + rw [Subring.mem_comap, + localizedCompletion_mem_integers_iff_norm_le_one, + finitePlaceCompletion_mem_integers_iff_norm_le_one] + have h := + AbsoluteValue.algebraicLocalizationAbsoluteValue_extends + vK w.1 w.2 x + change + AbsoluteValue.algebraicLocalizationAbsoluteValue + vK w.1 w.2 + (algebraMap vK.Completion + (LocalizedCompletion vK w) x) ≤ 1 ↔ + AbsoluteValue.completionAbsoluteValue vK x ≤ 1 + rw [h] + +omit [NumberField K] [NumberField L] [IsGalois K L] in +/-- The integral-closure certificate with the canonical algebra structure +on valuation rings supplied by `Valuation.HasExtension`. -/ +theorem localizedCompletionIsIntegralClosureWithExtension + (hvK : vK.IsNontrivial) + (hvKna : IsNonarchimedean (vK : K → ℝ)) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : Valued vK.Completion ℝ≥0 := + finitePlaceCompletionValued vK hvKna + letI : ValuativeRel vK.Completion := + finitePlaceCompletionValuativeRel vK hvKna + letI : Valued (LocalizedCompletion vK w) ℝ≥0 := + localizedCompletionFinitePlaceValued vK w hvKna + letI : ValuativeRel (LocalizedCompletion vK w) := + localizedCompletionFinitePlaceValuativeRel vK w hvKna + letI : Algebra 𝒪[vK.Completion] (LocalizedCompletion vK w) := + Algebra.ofSubsemiring 𝒪[vK.Completion] + letI := localizedCompletionValuationHasExtension vK w hvKna + IsIntegralClosure + 𝒪[LocalizedCompletion vK w] + 𝒪[vK.Completion] + (LocalizedCompletion vK w) := by + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let : Valued vK.Completion ℝ≥0 := + finitePlaceCompletionValued vK hvKna + let : ValuativeRel vK.Completion := + finitePlaceCompletionValuativeRel vK hvKna + let : Valued (LocalizedCompletion vK w) ℝ≥0 := + localizedCompletionFinitePlaceValued vK w hvKna + let : ValuativeRel (LocalizedCompletion vK w) := + localizedCompletionFinitePlaceValuativeRel vK w hvKna + let : Algebra 𝒪[vK.Completion] (LocalizedCompletion vK w) := + Algebra.ofSubsemiring 𝒪[vK.Completion] + let := localizedCompletionValuationHasExtension vK w hvKna + let h := + localizedCompletion_integerRing_eq_integralClosure + vK w hvK hvKna + refine + { algebraMap_injective := + (ValuativeRel.valuation + (LocalizedCompletion vK w)).integer.subtype_injective + isIntegral_iff := ?_ } + intro x + constructor + · intro hx + have hxO : x ∈ 𝒪[LocalizedCompletion vK w] := by + rw [h] + exact hx + exact ⟨⟨x, hxO⟩, rfl⟩ + · rintro ⟨y, rfl⟩ + have hyO : + algebraMap 𝒪[LocalizedCompletion vK w] + (LocalizedCompletion vK w) y ∈ + 𝒪[LocalizedCompletion vK w] := by + change (y : LocalizedCompletion vK w) ∈ + 𝒪[LocalizedCompletion vK w] + exact y.property + exact (SetLike.ext_iff.mp h _).1 hyO + + +end LocalValuation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison.lean new file mode 100644 index 0000000000..95dbe6bde7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.RamificationIndex + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/All.lean new file mode 100644 index 0000000000..6bb6ab3b13 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/All.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.RamificationIndex +/-! # Unramified comparisons between completions and prime ideals -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/CompletionToIdeal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/CompletionToIdeal.lean new file mode 100644 index 0000000000..c291b1882f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/CompletionToIdeal.lean @@ -0,0 +1,410 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal +public import Mathlib.RingTheory.Ideal.Quotient.HasFiniteQuotients.Basic +public import Mathlib.RingTheory.Ideal.Quotient.HasFiniteQuotients.Norm +/-! +# From completed to ideal-theoretic unramifiedness + +This file recovers ideal-theoretic unramifiedness from the actual chosen +localized completion and propagates it to every place above the base place in +a finite Galois extension. +-/ + +@[expose] public section + +open scoped NumberField NNReal ValuativeRel +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open LocalClassFieldTheory +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +open scoped Classical in +/-- The actual image of the chosen global integral uniformizer in the +integer ring of the chosen localized completion. -/ +noncomputable def chosenFinitePlaceTargetIntegralUniformizer + (v : HeightOneSpectrum (𝓞 K)) : + 𝒪[ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v] := + algebraMap + 𝒪[ChosenFinitePlaceBaseCompletion (K := K) v] + 𝒪[ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v] + (chosenFinitePlaceCompletionIntegralUniformizer v).completionInteger + +omit [NumberField L] in +open scoped Classical in +/-- In an unramified chosen localized completion, the canonical global +integral uniformizer remains a uniformizer after scalar extension. -/ +theorem chosenFinitePlace_integralUniformizer_map_isUniformizer + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + (ValuativeRel.valuation + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v)).IsUniformizer + ((chosenFinitePlaceTargetIntegralUniformizer + (K := K) (L := L) v : + 𝒪[ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v]) : + ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v) := by + let vK := HeightOneSpectrum.adicAbv K v + let E := + ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v + let : + IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + vK.Completion E := by + simpa [ChosenFinitePlaceIsUnramified] using hunram + let πData := + chosenFinitePlaceCompletionIntegralUniformizer v + let baseDVF : + ValuationTheory.DiscreteValuationField.DVF + vK.Completion := + { ValueGroup := ValuativeRel.ValueGroupWithZero vK.Completion + valuation := ValuativeRel.valuation vK.Completion } + have hpiBaseMaximalIdeal : + (𝓂[vK.Completion] : + Ideal 𝒪[vK.Completion]) = + Ideal.span ({πData.completionInteger} : + Set 𝒪[vK.Completion]) := + baseDVF.maximalIdeal_eq_span_uniformizer + πData.completionInteger_isUniformizer + let integerMap : + 𝒪[vK.Completion] →+* 𝒪[E] := + algebraMap 𝒪[vK.Completion] 𝒪[E] + let πTarget : 𝒪[E] := + integerMap πData.completionInteger + have hpiTargetMaximalIdeal : + (𝓂[E] : Ideal 𝒪[E]) = + Ideal.span ({πTarget} : Set 𝒪[E]) := by + calc + (𝓂[E] : Ideal 𝒪[E]) = + Ideal.map + integerMap + (𝓂[vK.Completion] : + Ideal 𝒪[vK.Completion]) := + (maximalIdeal_map_eq_maximalIdeal_of_unramifiedValuation + vK.Completion E).symm + _ = + Ideal.map + integerMap + (Ideal.span ({πData.completionInteger} : + Set 𝒪[vK.Completion])) := by + exact congrArg + (Ideal.map integerMap) + hpiBaseMaximalIdeal + _ = Ideal.span ({πTarget} : Set 𝒪[E]) := by + rw [Ideal.map_span, Set.image_singleton] + let targetDVF : + ValuationTheory.DiscreteValuationField.DVF E := + { ValueGroup := ValuativeRel.ValueGroupWithZero E + valuation := ValuativeRel.valuation E } + change + targetDVF.valuation.IsUniformizer + (πTarget : E) + exact + Valuation.isUniformizer_of_maximalIdeal_eq_span + (v := targetDVF.valuation) hpiTargetMaximalIdeal + +open scoped Classical in +/-- Completed unramifiedness forces ramification index one at the actual +global centre of the chosen finite-place extension. -/ +theorem + finitePlaceExtensionCentre_ramificationIdx'_eq_one_of_chosenFinitePlaceIsUnramified + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + v.asIdeal.ramificationIdx' + (finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v)).asIdeal = + 1 := by + let vK := HeightOneSpectrum.adicAbv K v + let w := chosenFinitePlaceExtension (L := L) v + let W := + finitePlaceExtensionCentre + (K := K) (L := L) v w + let E := + ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v + let πData := + chosenFinitePlaceCompletionIntegralUniformizer v + let πTarget : 𝒪[E] := + chosenFinitePlaceTargetIntegralUniformizer + (K := K) (L := L) v + let eTarget : + 𝒪[E] ≃+* W.adicCompletionIntegers L := + chosenFinitePlaceLocalizedIntegerRingEquiv + (K := K) (L := L) v + have hpiTargetConcreteIrreducible : + Irreducible (eTarget πTarget) := by + apply (MulEquiv.irreducible_iff eTarget.toMulEquiv).2 + rw [IsDiscreteValuationRing.irreducible_iff_uniformizer] + let targetIntrinsicDVF : + ValuationTheory.DiscreteValuationField.DVF E := + { ValueGroup := ValuativeRel.ValueGroupWithZero E + valuation := ValuativeRel.valuation E } + exact + targetIntrinsicDVF.maximalIdeal_eq_span_uniformizer + (by + simpa only [πTarget] using + chosenFinitePlace_integralUniformizer_map_isUniformizer + (K := K) (L := L) v hunram) + let targetDVF : + ValuationTheory.DiscreteValuationField.DVF + (W.adicCompletion L) := + { ValueGroup := WithZero (Multiplicative ℤ) + valuation := Valued.v } + have hpiTargetConcreteUniformizer : + targetDVF.valuation.IsUniformizer + ((eTarget πTarget : + W.adicCompletionIntegers L) : + W.adicCompletion L) := + Valuation.isUniformizer_of_maximalIdeal_eq_span + (v := targetDVF.valuation) + hpiTargetConcreteIrreducible.maximalIdeal_eq + have hpiTargetConcreteValuation : + targetDVF.valuation + ((eTarget πTarget : + W.adicCompletionIntegers L) : + W.adicCompletion L) = + WithZero.exp (-1 : ℤ) := by + have h := hpiTargetConcreteUniformizer + rw [Valuation.IsUniformizer.iff, + Valuation.IsRankOneDiscrete.generator_eq_exp_neg_one_of_surjective + (W.valuedAdicCompletion_surjective L)] at h + exact h + have hpiTargetField : + (eTarget πTarget : W.adicCompletion L) = + algebraMap L (W.adicCompletion L) + (algebraMap K L (πData.integer : K)) := by + change + finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w + (localizedCompletionEquivCompletion + vK (RayClass.adicAbv_isNontrivial v) w + (algebraMap vK.Completion E + (πData.completionInteger : + vK.Completion))) = + _ + rw [(localizedCompletionEquivCompletion + vK (RayClass.adicAbv_isNontrivial v) w).commutes, + πData.coe_completionInteger] + change + finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w + (AbsoluteValue.completionMap + vK w.1 w.2 + (algebraMap K vK.Completion + (πData.integer : K))) = + _ + rw [AbsoluteValue.completionMap_coe, + finitePlaceExtensionAdicCompletionRingEquiv_toCompletion] + rfl + have hmapPi : + finitePlaceExtensionAdicCompletionMap K L v w + (algebraMap K (v.adicCompletion K) + (πData.integer : K)) = + (eTarget πTarget : W.adicCompletion L) := by + rw [hpiTargetField] + change + finitePlaceExtensionAdicCompletionMap K L v w + ((πData.integer : K) : v.adicCompletion K) = + ((algebraMap K L (πData.integer : K) : L) : + W.adicCompletion L) + exact + finitePlaceExtensionAdicCompletionMap_coe + K L v w (πData.integer : K) + have hpiConcreteValuation : + Valued.v + (algebraMap K (v.adicCompletion K) + (πData.integer : K)) = + WithZero.exp (-1 : ℤ) := by + change + Valued.v + (πData.integer : v.adicCompletion K) = + WithZero.exp (-1 : ℤ) + rw [HeightOneSpectrum.valuedAdicCompletion_eq_valuation', + HeightOneSpectrum.valuation_of_algebraMap, + πData.intValuation_eq_exp_neg_one] + let eGlobal : ℕ := + v.asIdeal.ramificationIdx' W.asIdeal + have hvalued : + WithZero.exp (-1 : ℤ) = + WithZero.exp (-1 : ℤ) ^ eGlobal := by + calc + WithZero.exp (-1 : ℤ) = + Valued.v + (eTarget πTarget : + W.adicCompletion L) := + hpiTargetConcreteValuation.symm + _ = + Valued.v + (finitePlaceExtensionAdicCompletionMap + K L v w + (algebraMap K (v.adicCompletion K) + (πData.integer : K))) := by + exact congrArg + (fun x : W.adicCompletion L => Valued.v x) + hmapPi.symm + _ = + Valued.v + (algebraMap K (v.adicCompletion K) + (πData.integer : K)) ^ + eGlobal := by + exact + finitePlaceExtensionAdicCompletionMap_valued + K L v w + (algebraMap K (v.adicCompletion K) + (πData.integer : K)) + _ = WithZero.exp (-1 : ℤ) ^ eGlobal := by + exact congrArg (fun z => z ^ eGlobal) + hpiConcreteValuation + have hexp : + WithZero.exp (-1 : ℤ) = + WithZero.exp (-(eGlobal : ℤ)) := by + calc + WithZero.exp (-1 : ℤ) = + WithZero.exp (-1 : ℤ) ^ eGlobal := + hvalued + _ = + WithZero.exp (eGlobal • (-1 : ℤ)) := + (WithZero.exp_nsmul _ _).symm + _ = + WithZero.exp (-(eGlobal : ℤ)) := by + congr 1 + simp + have hint : + (-1 : ℤ) = -(eGlobal : ℤ) := + WithZero.exp_injective hexp + have heGlobal : eGlobal = 1 := by + have heInt : (1 : ℤ) = (eGlobal : ℤ) := + neg_injective hint + exact_mod_cast heInt.symm + exact heGlobal + +open scoped Classical in +/-- Unramifiedness of the actual chosen localized completion forces +ideal-theoretic unramifiedness at its global centre. -/ +theorem isUnramifiedAt_of_chosenFinitePlaceIsUnramified + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + Algebra.IsUnramifiedAt (𝓞 K) + (finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v)).asIdeal := by + let w := chosenFinitePlaceExtension (L := L) v + let W := + finitePlaceExtensionCentre + (K := K) (L := L) v w + let : W.asIdeal.LiesOver v.asIdeal := + finitePlaceExtensionCentre_liesOver + (K := K) (L := L) v w + have hBasePrime : + W.asIdeal.under (𝓞 K) ≠ ⊥ := by + rw [← W.asIdeal.over_def v.asIdeal] + exact v.ne_bot + let : Finite ((𝓞 K) ⧸ W.asIdeal.under (𝓞 K)) := + Ring.HasFiniteQuotients.finiteQuotient hBasePrime + let : + PerfectField + (W.asIdeal.under (𝓞 K)).ResidueField := + PerfectField.ofFinite + apply Ideal.ramificationIdx_eq_one_iff.mp + rw [← Ideal.ramificationIdx'_eq_ramificationIdx + v.asIdeal W.asIdeal v.ne_bot] + exact + finitePlaceExtensionCentre_ramificationIdx'_eq_one_of_chosenFinitePlaceIsUnramified + (K := K) (L := L) v hunram + +open scoped Classical in +/-- In a finite Galois number-field extension, completed unramifiedness at +the chosen place implies ideal-theoretic unramifiedness at every finite place +above the same base place. -/ +theorem + isUnramifiedAt_at_finitePlaceAbove_of_chosenFinitePlaceIsUnramified + (v : HeightOneSpectrum (𝓞 K)) + (P : HeightOneSpectrum (𝓞 L)) + (hP : finitePlaceBelow (K := K) P = v) + (hunram : + ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + Algebra.IsUnramifiedAt (𝓞 K) P.asIdeal := by + let w := chosenFinitePlaceExtension (L := L) v + let W := + finitePlaceExtensionCentre + (K := K) (L := L) v w + let : Finite (L ≃ₐ[K] L) := + IsGaloisGroup.finite (L ≃ₐ[K] L) K L + let : + IsGaloisGroup + (L ≃ₐ[K] L) (𝓞 K) (𝓞 L) := + IsGaloisGroup.of_isFractionRing + (L ≃ₐ[K] L) (𝓞 K) (𝓞 L) K L + let : P.asIdeal.LiesOver v.asIdeal := by + constructor + have h := congrArg HeightOneSpectrum.asIdeal hP + simpa only [finitePlaceBelow_asIdeal] using h.symm + let : W.asIdeal.LiesOver v.asIdeal := + finitePlaceExtensionCentre_liesOver + (K := K) (L := L) v w + have hChosen : + Algebra.IsUnramifiedAt (𝓞 K) W.asIdeal := + isUnramifiedAt_of_chosenFinitePlaceIsUnramified + (K := K) (L := L) v hunram + have hChosenRamification : + W.asIdeal.ramificationIdx (𝓞 K) = 1 := by + let : Algebra.IsUnramifiedAt (𝓞 K) W.asIdeal := + hChosen + exact Ideal.ramificationIdx_eq_one W.asIdeal (𝓞 K) + have hRamification : + P.asIdeal.ramificationIdx (𝓞 K) = + W.asIdeal.ramificationIdx (𝓞 K) := + HilbertRamification.Dedekind.dedekindRamification_ramificationIdx_eq + v.asIdeal P.asIdeal W.asIdeal (L ≃ₐ[K] L) + have hWBasePrime : + W.asIdeal.under (𝓞 K) ≠ ⊥ := by + rw [← W.asIdeal.over_def v.asIdeal] + exact v.ne_bot + let : Finite ((𝓞 K) ⧸ W.asIdeal.under (𝓞 K)) := + Ring.HasFiniteQuotients.finiteQuotient hWBasePrime + let : + PerfectField + (W.asIdeal.under (𝓞 K)).ResidueField := + PerfectField.ofFinite + have hPBasePrime : + P.asIdeal.under (𝓞 K) ≠ ⊥ := by + rw [← P.asIdeal.over_def v.asIdeal] + exact v.ne_bot + let : Finite ((𝓞 K) ⧸ P.asIdeal.under (𝓞 K)) := + Ring.HasFiniteQuotients.finiteQuotient hPBasePrime + let : + PerfectField + (P.asIdeal.under (𝓞 K)).ResidueField := + PerfectField.ofFinite + apply Ideal.ramificationIdx_eq_one_iff.mp + exact hRamification.trans hChosenRamification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/IdealToCompletion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/IdealToCompletion.lean new file mode 100644 index 0000000000..896e9a47ed --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/IdealToCompletion.lean @@ -0,0 +1,529 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.IntegerRingComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv +/-! +# From ideal-theoretic to completed unramifiedness + +This file proves that ideal-theoretic unramifiedness at the centre of the +actual chosen finite-place extension implies unramifiedness of its localized +completion. +-/ + +@[expose] public section + +open scoped NumberField NNReal ValuativeRel +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open LocalClassFieldTheory +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +open scoped Classical in +/-- A uniformizer of a finite-place completion induced by an element of the +global integer ring, together with its valuation and comparison properties. -/ +structure FinitePlaceCompletionIntegralUniformizer + {F : Type} [Field F] [NumberField F] + (v : HeightOneSpectrum (𝓞 F)) where + /-- The inducing element of the global integer ring. -/ + integer : 𝓞 F + /-- The corresponding element of the completion integer ring. -/ + completionInteger : + 𝒪[ChosenFinitePlaceBaseCompletion (K := F) v] + /-- The inducing global integer has normalized valuation `-1`. -/ + intValuation_eq_exp_neg_one : + v.intValuation integer = WithZero.exp (-1 : ℤ) + /-- The completion element is the image of the global integer. -/ + coe_completionInteger : + (completionInteger : + ChosenFinitePlaceBaseCompletion (K := F) v) = + algebraMap F + (ChosenFinitePlaceBaseCompletion (K := F) v) + (integer : F) + /-- The completion element is a uniformizer for the intrinsic valuation. -/ + completionInteger_isUniformizer : + (ValuativeRel.valuation + (ChosenFinitePlaceBaseCompletion (K := F) v)).IsUniformizer + (completionInteger : + ChosenFinitePlaceBaseCompletion (K := F) v) + /-- The completion element lies in the completion's maximal ideal. -/ + completionInteger_mem_maximalIdeal : + completionInteger ∈ + (𝓂[ChosenFinitePlaceBaseCompletion (K := F) v] : + Ideal + 𝒪[ChosenFinitePlaceBaseCompletion (K := F) v]) + +open scoped Classical in +/-- A chosen global integral uniformizer and its image in a finite-place +completion. -/ +noncomputable def chosenFinitePlaceCompletionIntegralUniformizer + {F : Type} [Field F] [NumberField F] + (v : HeightOneSpectrum (𝓞 F)) : + FinitePlaceCompletionIntegralUniformizer v := by + let vF := HeightOneSpectrum.adicAbv F v + let eBaseField : + vF.Completion ≃+* v.adicCompletion F := + finitePlaceCompletionRingEquiv v + let eBase : + 𝒪[vF.Completion] ≃+* + v.adicCompletionIntegers F := + finitePlaceCompletionIntegerRingEquiv v + let π : 𝓞 F := + Classical.choose v.intValuation_exists_uniformizer + have hπ : + v.intValuation π = WithZero.exp (-1 : ℤ) := + Classical.choose_spec v.intValuation_exists_uniformizer + let πConcrete : + v.adicCompletionIntegers F := + ⟨algebraMap (𝓞 F) (v.adicCompletion F) π, by + rw [HeightOneSpectrum.mem_adicCompletionIntegers] + change Valued.v (π : v.adicCompletion F) ≤ 1 + rw [HeightOneSpectrum.valuedAdicCompletion_eq_valuation', + HeightOneSpectrum.valuation_of_algebraMap, hπ] + change WithZero.exp (-1 : ℤ) ≤ WithZero.exp 0 + rw [WithZero.exp_le_exp] + omega⟩ + let baseDVF : + ValuationTheory.DiscreteValuationField.DVF + (v.adicCompletion F) := + { ValueGroup := WithZero (Multiplicative ℤ) + valuation := Valued.v } + have hπConcreteUniformizer : + baseDVF.valuation.IsUniformizer + (πConcrete : v.adicCompletion F) := by + rw [Valuation.IsUniformizer.iff, + Valuation.IsRankOneDiscrete.generator_eq_exp_neg_one_of_surjective + (v.valuedAdicCompletion_surjective F)] + change Valued.v (π : v.adicCompletion F) = + WithZero.exp (-1 : ℤ) + rw [HeightOneSpectrum.valuedAdicCompletion_eq_valuation', + HeightOneSpectrum.valuation_of_algebraMap, hπ] + let πCompletion : 𝒪[vF.Completion] := + eBase.symm πConcrete + have hπCompletionField : + (πCompletion : vF.Completion) = + algebraMap F vF.Completion (π : F) := by + apply eBaseField.injective + have happ := + congrArg Subtype.val + (eBase.apply_symm_apply πConcrete) + change + eBaseField (πCompletion : vF.Completion) = + (πConcrete : v.adicCompletion F) at happ + rw [happ] + let x : WithAbs vF := + (WithAbs.equiv vF).symm (π : F) + change + (π : v.adicCompletion F) = + finitePlaceCompletionRingHom v + (x : vF.Completion) + rw [finitePlaceCompletionRingHom_coe] + rfl + have hπCompletionMaximal : + πCompletion ∈ + (IsLocalRing.maximalIdeal + 𝒪[vF.Completion]) := by + have hπConcreteMaximal : + πConcrete ∈ + (IsLocalRing.maximalIdeal + (v.adicCompletionIntegers F)) := + baseDVF.uniformizer_mem_maximalIdeal + hπConcreteUniformizer + have hpow : + eBase πCompletion ∈ + (IsLocalRing.maximalIdeal + (v.adicCompletionIntegers F)) ^ 1 := by + simpa [πCompletion] using hπConcreteMaximal + have hmem := + (ValuationTheory.ringEquiv_mem_maximalIdeal_pow_iff + eBase 1 πCompletion).1 hpow + simpa using hmem + have hπConcreteNotDeep : + πConcrete ∉ + (IsLocalRing.maximalIdeal + (v.adicCompletionIntegers F)) ^ 2 := + baseDVF.uniformizer_not_mem_maximalIdeal_sq + hπConcreteUniformizer + have hπCompletionNotDeep : + πCompletion ∉ + (IsLocalRing.maximalIdeal + 𝒪[vF.Completion]) ^ 2 := by + intro hdeep + apply hπConcreteNotDeep + simpa [πCompletion] using + ((ValuationTheory.ringEquiv_mem_maximalIdeal_pow_iff + eBase 2 πCompletion).2 hdeep) + let completionDVF : + ValuationTheory.DiscreteValuationField.DVF + vF.Completion := + { ValueGroup := ValuativeRel.ValueGroupWithZero vF.Completion + valuation := ValuativeRel.valuation vF.Completion } + have hπCompletionUniformizer : + completionDVF.valuation.IsUniformizer + (πCompletion : vF.Completion) := + completionDVF.isUniformizer_of_mem_maximalIdeal_of_not_mem_maximalIdeal_sq + hπCompletionMaximal hπCompletionNotDeep + exact + { integer := π + completionInteger := πCompletion + intValuation_eq_exp_neg_one := hπ + coe_completionInteger := hπCompletionField + completionInteger_isUniformizer := + hπCompletionUniformizer + completionInteger_mem_maximalIdeal := + hπCompletionMaximal } + +open scoped Classical in +/-- If the centre of the chosen finite-place extension has ramification +index one, a global integral uniformizer remains a uniformizer after passing +to the chosen localized completion. In particular it is not in the square of +the target maximal ideal. -/ +theorem chosenFinitePlace_integral_uniformizer_not_mem_maximalIdeal_sq + (v : HeightOneSpectrum (𝓞 K)) + (π : 𝓞 K) + (πBase : + 𝒪[ChosenFinitePlaceBaseCompletion (K := K) v]) + (hπ : + v.intValuation π = WithZero.exp (-1 : ℤ)) + (hπBase : + (πBase : + ChosenFinitePlaceBaseCompletion (K := K) v) = + algebraMap K + (ChosenFinitePlaceBaseCompletion (K := K) v) + (π : K)) + (hglobal : + v.asIdeal.ramificationIdx' + (finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v)).asIdeal = + 1) : + algebraMap + 𝒪[ChosenFinitePlaceBaseCompletion (K := K) v] + 𝒪[ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v] πBase ∉ + (𝓂[ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v] : + Ideal + 𝒪[ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v]) ^ 2 := by + let vK := HeightOneSpectrum.adicAbv K v + let w := chosenFinitePlaceExtension (L := L) v + let W := + finitePlaceExtensionCentre + (K := K) (L := L) v w + let : W.asIdeal.LiesOver v.asIdeal := + finitePlaceExtensionCentre_liesOver + (K := K) (L := L) v w + let E := + ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v + let eTarget : + 𝒪[E] ≃+* W.adicCompletionIntegers L := + chosenFinitePlaceLocalizedIntegerRingEquiv + (K := K) (L := L) v + let πTarget : 𝒪[E] := + algebraMap 𝒪[vK.Completion] 𝒪[E] πBase + change πTarget ∉ + (IsLocalRing.maximalIdeal 𝒪[E]) ^ 2 + intro hπTargetDeep + have hπTargetConcrete : + eTarget πTarget ∈ + (IsLocalRing.maximalIdeal + (W.adicCompletionIntegers L)) ^ 2 := + (ValuationTheory.ringEquiv_mem_maximalIdeal_pow_iff + eTarget 2 πTarget).2 hπTargetDeep + have hπTargetField : + (eTarget πTarget : W.adicCompletion L) = + (algebraMap L (W.adicCompletion L) + (algebraMap K L (π : K))) := by + change + finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w + (localizedCompletionEquivCompletion + vK (RayClass.adicAbv_isNontrivial v) w + (algebraMap vK.Completion E + (πBase : vK.Completion))) = + _ + rw [(localizedCompletionEquivCompletion + vK (RayClass.adicAbv_isNontrivial v) w).commutes, hπBase] + change + finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w + (AbsoluteValue.completionMap + vK w.1 w.2 + (algebraMap K vK.Completion + (π : K))) = + _ + rw [AbsoluteValue.completionMap_coe, + finitePlaceExtensionAdicCompletionRingEquiv_toCompletion] + rfl + let targetDVF : + ValuationTheory.DiscreteValuationField.DVF + (W.adicCompletion L) := + { ValueGroup := WithZero (Multiplicative ℤ) + valuation := Valued.v } + have hπTargetValuation : + targetDVF.valuation + (eTarget πTarget : W.adicCompletion L) = + WithZero.exp (-1 : ℤ) := by + rw [hπTargetField] + change + Valued.v + (algebraMap L (W.adicCompletion L) + (algebraMap K L (π : K))) = + WithZero.exp (-1 : ℤ) + calc + Valued.v + (algebraMap L (W.adicCompletion L) + (algebraMap K L (π : K))) = + W.valuation L (algebraMap K L (π : K)) := + HeightOneSpectrum.valuedAdicCompletion_eq_valuation' + W (algebraMap K L (π : K)) + _ = + (v.valuation K (π : K)) ^ + v.asIdeal.ramificationIdx' W.asIdeal := by + symm + exact HeightOneSpectrum.valuation_liesOver + L v W (π : K) + _ = WithZero.exp (-1 : ℤ) := by + rw [hglobal, pow_one, + HeightOneSpectrum.valuation_of_algebraMap, hπ] + have hπTargetUniformizer : + targetDVF.valuation.IsUniformizer + (eTarget πTarget : W.adicCompletion L) := by + rw [Valuation.IsUniformizer.iff, + Valuation.IsRankOneDiscrete.generator_eq_exp_neg_one_of_surjective + (W.valuedAdicCompletion_surjective L)] + exact hπTargetValuation + exact + (targetDVF.uniformizer_not_mem_maximalIdeal_sq + hπTargetUniformizer) hπTargetConcrete + +open scoped Classical in +/-- Ramification index one at the global centre prevents the image of the +completed base maximal ideal from lying in the square of the target maximal +ideal. -/ +theorem chosenFinitePlace_maximalIdeal_map_not_le_sq_of_centre_ramificationIdx_eq_one + (v : HeightOneSpectrum (𝓞 K)) + (hglobal : + v.asIdeal.ramificationIdx' + (finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v)).asIdeal = + 1) : + ¬ (𝓂[ChosenFinitePlaceBaseCompletion (K := K) v] : + Ideal + 𝒪[ChosenFinitePlaceBaseCompletion (K := K) v]).map + (algebraMap + 𝒪[ChosenFinitePlaceBaseCompletion (K := K) v] + 𝒪[ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v]) ≤ + (𝓂[ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v] : + Ideal + 𝒪[ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v]) ^ 2 := by + let πData := + chosenFinitePlaceCompletionIntegralUniformizer v + intro hdeep + apply + chosenFinitePlace_integral_uniformizer_not_mem_maximalIdeal_sq + (K := K) (L := L) v + πData.integer πData.completionInteger + πData.intValuation_eq_exp_neg_one + πData.coe_completionInteger hglobal + exact + hdeep + (Ideal.mem_map_of_mem + (algebraMap + 𝒪[ChosenFinitePlaceBaseCompletion (K := K) v] + 𝒪[ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v]) + πData.completionInteger_mem_maximalIdeal) + +open scoped Classical in +/-- Ramification index one at the global centre gives ramification index one +for the completed maximal ideals in the multiplicity formulation. -/ +theorem chosenFinitePlace_maximalIdeal_ramificationIdx'_eq_one_of_centre_ramificationIdx_eq_one + (v : HeightOneSpectrum (𝓞 K)) + (hglobal : + v.asIdeal.ramificationIdx' + (finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v)).asIdeal = + 1) : + (𝓂[ChosenFinitePlaceBaseCompletion (K := K) v] : + Ideal + 𝒪[ChosenFinitePlaceBaseCompletion (K := K) v]).ramificationIdx' + (𝓂[ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v] : + Ideal + 𝒪[ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v]) = + 1 := by + let vK := HeightOneSpectrum.adicAbv K v + let E := + ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v + change + (𝓂[vK.Completion] : + Ideal 𝒪[vK.Completion]).ramificationIdx' + (𝓂[E] : Ideal 𝒪[E]) = 1 + let : + IsLocalHom (algebraMap vK.Completion E) := + IsLocalRing.instIsLocalHomRingHomOfNontrivial + (algebraMap vK.Completion E) + let : + IsLocalHom + (algebraMap 𝒪[vK.Completion] 𝒪[E]) := + Valuation.HasExtension.instIsLocalHomValuationInteger + rw [← not_ne_iff, + Ideal.ramificationIdx'_ne_one_iff + (IsLocalRing.map_maximalIdeal_le + (algebraMap 𝒪[vK.Completion] 𝒪[E]))] + exact + chosenFinitePlace_maximalIdeal_map_not_le_sq_of_centre_ramificationIdx_eq_one + (K := K) (L := L) v hglobal + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- Ideal-theoretic unramifiedness gives ramification index one at the actual +centre of the chosen finite-place extension. -/ +theorem finitePlaceExtensionCentre_ramificationIdx_eq_one_of_isUnramifiedAt + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + Algebra.IsUnramifiedAt (𝓞 K) + (finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v)).asIdeal) : + v.asIdeal.ramificationIdx' + (finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v)).asIdeal = + 1 := by + let w := chosenFinitePlaceExtension (L := L) v + let W := + finitePlaceExtensionCentre + (K := K) (L := L) v w + let : W.asIdeal.LiesOver v.asIdeal := + finitePlaceExtensionCentre_liesOver + (K := K) (L := L) v w + rw [Ideal.ramificationIdx'_eq_ramificationIdx + v.asIdeal W.asIdeal v.ne_bot] + let : Algebra.IsUnramifiedAt (𝓞 K) W.asIdeal := hunram + exact Ideal.ramificationIdx_eq_one W.asIdeal (𝓞 K) + +open scoped Classical in +/-- Ramification index one at the actual global centre gives ramification +index one for the maximal ideals of the corresponding completed valued-field +extension. -/ +theorem chosenFinitePlace_maximalIdeal_ramificationIdx_eq_one_of_centre_ramificationIdx_eq_one + (v : HeightOneSpectrum (𝓞 K)) + (hglobal : + v.asIdeal.ramificationIdx' + (finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v)).asIdeal = + 1) : + (𝓂[ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v] : + Ideal + 𝒪[ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v]).ramificationIdx + 𝒪[ChosenFinitePlaceBaseCompletion (K := K) v] = + 1 := by + let vK := HeightOneSpectrum.adicAbv K v + let E := + ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v + change + (𝓂[E] : Ideal 𝒪[E]).ramificationIdx + 𝒪[vK.Completion] = 1 + have hbaseBot : + (𝓂[vK.Completion] : Ideal 𝒪[vK.Completion]) ≠ ⊥ := + Ring.ne_bot_of_isMaximal_of_not_isField + (IsLocalRing.maximalIdeal.isMaximal + 𝒪[vK.Completion]) + (IsDiscreteValuationRing.not_isField + 𝒪[vK.Completion]) + let : + Module.IsTorsionFree vK.Completion E := + DivisionSemiring.to_moduleIsTorsionFree + let : + Module.IsTorsionFree + 𝒪[vK.Completion] 𝒪[E] := + Valuation.HasExtension.instIsTorsionFreeInteger + let : + (𝓂[E] : Ideal 𝒪[E]).LiesOver + (𝓂[vK.Completion] : Ideal 𝒪[vK.Completion]) := by + exact + ⟨(Valuation.HasExtension.maximalIdeal_comap_algebraMap_eq_maximalIdeal + (ValuativeRel.valuation vK.Completion) + (ValuativeRel.valuation E)).symm⟩ + rw [← Ideal.ramificationIdx'_eq_ramificationIdx + (𝓂[vK.Completion] : Ideal 𝒪[vK.Completion]) + (𝓂[E] : Ideal 𝒪[E]) hbaseBot] + exact + chosenFinitePlace_maximalIdeal_ramificationIdx'_eq_one_of_centre_ramificationIdx_eq_one + (K := K) (L := L) v hglobal + +open scoped Classical in +/-- Ramification index one at the actual global centre implies +unramifiedness of the corresponding completed valued-field extension. -/ +theorem chosenFinitePlaceIsUnramified_of_centre_ramificationIdx_eq_one + (v : HeightOneSpectrum (𝓞 K)) + (hglobal : + v.asIdeal.ramificationIdx' + (finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v)).asIdeal = + 1) : + ChosenFinitePlaceIsUnramified + (K := K) (L := L) v := by + change + IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + (ChosenFinitePlaceBaseCompletion (K := K) v) + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v) + refine + { maximalIdeal_ramificationIdx_eq_one := ?_ } + exact + chosenFinitePlace_maximalIdeal_ramificationIdx_eq_one_of_centre_ramificationIdx_eq_one + (K := K) (L := L) v hglobal + +open scoped Classical in +/-- Algebraic unramifiedness of the centre of the chosen extension +implies unramifiedness of the corresponding completed valued-field +extension. -/ +theorem chosenFinitePlaceIsUnramified_of_isUnramifiedAt + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + Algebra.IsUnramifiedAt (𝓞 K) + (finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v)).asIdeal) : + ChosenFinitePlaceIsUnramified + (K := K) (L := L) v := by + apply + chosenFinitePlaceIsUnramified_of_centre_ramificationIdx_eq_one + (K := K) (L := L) v + exact + finitePlaceExtensionCentre_ramificationIdx_eq_one_of_isUnramifiedAt + (K := K) (L := L) v hunram diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/LocalNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/LocalNorm.lean new file mode 100644 index 0000000000..70605fbebb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/LocalNorm.lean @@ -0,0 +1,135 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Norm +/-! +# Local norms at an unramified chosen finite place + +This file proves that the concrete adic integer units lie in the actual local +norm subgroup of the chosen localized completion. +-/ + +@[expose] public section + +open scoped NumberField NNReal ValuativeRel +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open LocalClassFieldTheory +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +open scoped Classical in +/-- At a chosen finite place which is unramified in `L`, every concrete +adic integer unit is an actual norm from the chosen localization. -/ +theorem adicCompletionIntegerUnits_le_chosenFinitePlaceLocalNormSubgroup + (v₀ : HeightOneSpectrum (𝓞 K)) + (hunram : + ChosenFinitePlaceIsUnramified + (K := K) (L := L) v₀) : + (v₀.adicCompletionIntegers K).units ≤ + chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v₀ := by + let vK := HeightOneSpectrum.adicAbv K v₀ + let E := + ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) v₀ + let : + IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + vK.Completion E := by + simpa [ChosenFinitePlaceIsUnramified] using hunram + intro x hx + let e := + finitePlaceCompletionUnitsContinuousMulEquiv v₀ + let x₀ : vK.Completionˣ := e.symm x + have hx₀map : e x₀ = x := + e.apply_symm_apply x + rw [Submonoid.mem_units_iff] at hx + have hx₀norm : + ‖(x₀ : vK.Completion)‖ ≤ 1 := by + have hval := + congrArg + (fun q : (v₀.adicCompletion K)ˣ => + (q : v₀.adicCompletion K)) hx₀map + have hnorm : + ‖finitePlaceCompletionRingHom v₀ + (x₀ : vK.Completion)‖ = + ‖(x₀ : vK.Completion)‖ := + (finitePlaceCompletionRingHom_isometry v₀).norm_map_of_map_zero + (map_zero (finitePlaceCompletionRingHom v₀)) _ + rw [← hnorm] + rw [show finitePlaceCompletionRingHom v₀ + (x₀ : vK.Completion) = (x : v₀.adicCompletion K) by + exact hval] + exact norm_le_one_of_mem_adicCompletionIntegers v₀ hx.1 + have hx₀invnorm : + ‖((x₀⁻¹ : vK.Completionˣ) : vK.Completion)‖ ≤ 1 := by + have hval := + congrArg + (fun q : (v₀.adicCompletion K)ˣ => + (q : v₀.adicCompletion K)) + (congrArg Inv.inv hx₀map) + have hnorm : + ‖finitePlaceCompletionRingHom v₀ + ((x₀⁻¹ : vK.Completionˣ) : vK.Completion)‖ = + ‖((x₀⁻¹ : vK.Completionˣ) : vK.Completion)‖ := + (finitePlaceCompletionRingHom_isometry v₀).norm_map_of_map_zero + (map_zero (finitePlaceCompletionRingHom v₀)) _ + rw [← hnorm] + rw [show finitePlaceCompletionRingHom v₀ + ((x₀⁻¹ : vK.Completionˣ) : vK.Completion) = + ((x⁻¹ : (v₀.adicCompletion K)ˣ) : + v₀.adicCompletion K) by + exact hval] + exact norm_le_one_of_mem_adicCompletionIntegers v₀ hx.2 + have hBaseMem (a : vK.Completion) : + a ∈ 𝒪[vK.Completion] ↔ ‖a‖ ≤ 1 := by + simpa [vK] using + (finitePlaceCompletion_mem_integers_iff_norm_le_one + vK (HeightOneSpectrum.isNonarchimedean_adicAbv K v₀) a) + let x₀O : 𝒪[vK.Completion]ˣ := + { val := ⟨x₀, (hBaseMem (x₀ : vK.Completion)).2 hx₀norm⟩ + inv := + ⟨x₀⁻¹, + by + simpa using + (hBaseMem + ((x₀⁻¹ : vK.Completionˣ) : + vK.Completion)).2 hx₀invnorm⟩ + val_inv := by + apply Subtype.ext + simp + inv_val := by + apply Subtype.ext + simp } + have hx₀O : + integerUnitsToFieldUnits vK.Completion x₀O = x₀ := by + apply Units.ext + rfl + obtain ⟨yO, hyO⟩ := + LocalClassFieldTheory.normIntegerUnits_surjective_unramified_of_isIntegralClosure + vK.Completion E x₀O + have hx₀Norm : + x₀ ∈ localNormSubgroup vK.Completion E := by + rw [← hx₀O, ← hyO, + LocalClassFieldTheory.normIntegerUnits_to_fieldUnits] + exact ⟨integerUnitsToFieldUnits E yO, rfl⟩ + change + x ∈ + (localNormSubgroup vK.Completion E).map e.toMonoidHom + exact ⟨x₀, hx₀Norm, hx₀map⟩ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/RamificationIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/RamificationIndex.lean new file mode 100644 index 0000000000..6c56a159ab --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/RamificationIndex.lean @@ -0,0 +1,302 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.AlgebraicExtensionUniqueness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv +/-! +# Ramification index and finite-place completion + +The ideal-theoretic ramification index at the centre of a finite-place +extension agrees with the ramification index of the corresponding explicit +localized completions. The comparison uses a global integral uniformizer: +its valuation in the completed target is the global ramification index, and +its image generates the completed base maximal ideal. +-/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + mem_maximalIdeal_pow_iff_valuation_le_uniformizer_pow → + mem_maximalIdeal_pow_iff_valuation_le_uniformizer_pow + + +open scoped NumberField NNReal ValuativeRel +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open LocalClassFieldTheory +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +open scoped Classical in +/-- The ramification index of the maximal ideals in the explicit localized +completions is the ramification index of the corresponding global ideals. -/ +theorem chosenFinitePlace_completed_ramificationIdx'_eq_centre + (v : HeightOneSpectrum (𝓞 K)) : + (𝓂[ChosenFinitePlaceBaseCompletion (K := K) v] : + Ideal 𝒪[ChosenFinitePlaceBaseCompletion (K := K) v]).ramificationIdx' + (𝓂[ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v] : + Ideal 𝒪[ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v]) = + v.asIdeal.ramificationIdx' + (finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v)).asIdeal := by + let vK := HeightOneSpectrum.adicAbv K v + let w := chosenFinitePlaceExtension (L := L) v + let W := finitePlaceExtensionCentre (K := K) (L := L) v w + let : W.asIdeal.LiesOver v.asIdeal := + finitePlaceExtensionCentre_liesOver (K := K) (L := L) v w + let E := ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v + let πData := chosenFinitePlaceCompletionIntegralUniformizer v + let πBase : 𝒪[vK.Completion] := πData.completionInteger + let integerMap : 𝒪[vK.Completion] →+* 𝒪[E] := + algebraMap 𝒪[vK.Completion] 𝒪[E] + let πTarget : 𝒪[E] := + integerMap πBase + let eTarget : 𝒪[E] ≃+* W.adicCompletionIntegers L := + chosenFinitePlaceLocalizedIntegerRingEquiv (K := K) (L := L) v + let eGlobal : ℕ := v.asIdeal.ramificationIdx' W.asIdeal + have hπTargetField : + (eTarget πTarget : W.adicCompletion L) = + algebraMap L (W.adicCompletion L) + (algebraMap K L (πData.integer : K)) := by + change + finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w + (localizedCompletionEquivCompletion + vK (RayClass.adicAbv_isNontrivial v) w + (algebraMap vK.Completion E + (πData.completionInteger : vK.Completion))) = + _ + rw [(localizedCompletionEquivCompletion + vK (RayClass.adicAbv_isNontrivial v) w).commutes, + πData.coe_completionInteger] + change + finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w + (AbsoluteValue.completionMap + vK w.1 w.2 + (algebraMap K vK.Completion + (πData.integer : K))) = + _ + rw [AbsoluteValue.completionMap_coe, + finitePlaceExtensionAdicCompletionRingEquiv_toCompletion] + rfl + have hπTargetValuation : + Valued.v (eTarget πTarget : W.adicCompletion L) = + WithZero.exp (-(eGlobal : ℤ)) := by + rw [hπTargetField] + calc + Valued.v + (algebraMap L (W.adicCompletion L) + (algebraMap K L (πData.integer : K))) = + W.valuation L (algebraMap K L (πData.integer : K)) := + HeightOneSpectrum.valuedAdicCompletion_eq_valuation' + W (algebraMap K L (πData.integer : K)) + _ = (v.valuation K (πData.integer : K)) ^ eGlobal := by + symm + exact HeightOneSpectrum.valuation_liesOver + L v W (πData.integer : K) + _ = WithZero.exp (-1 : ℤ) ^ eGlobal := by + rw [HeightOneSpectrum.valuation_of_algebraMap, + πData.intValuation_eq_exp_neg_one] + _ = WithZero.exp (eGlobal • (-1 : ℤ)) := + (WithZero.exp_nsmul _ _).symm + _ = WithZero.exp (-(eGlobal : ℤ)) := by + congr 1 + simp only [nsmul_eq_mul, mul_neg, mul_one] + let targetDVF : + ValuationTheory.DiscreteValuationField.DVF + (W.adicCompletion L) := + { ValueGroup := WithZero (Multiplicative ℤ) + valuation := Valued.v } + let concreteRingEquiv : + targetDVF.valuationSubring ≃+* W.adicCompletionIntegers L := + RingEquiv.subringCongr + (show targetDVF.valuation.valuationSubring.toSubring = + (W.adicCompletionIntegers L).toSubring by rfl) + let πConcrete : targetDVF.valuationSubring := + concreteRingEquiv.symm (eTarget πTarget) + obtain ⟨ϖ, hϖ⟩ := targetDVF.exists_uniformizer + have hϖValuation : + Valued.v (ϖ : W.adicCompletion L) = + WithZero.exp (-1 : ℤ) := by + have h := hϖ + rw [Valuation.IsUniformizer.iff, + Valuation.IsRankOneDiscrete.generator_eq_exp_neg_one_of_surjective + (W.valuedAdicCompletion_surjective L)] at h + exact h + have hπConcreteMem (n : ℕ) : + πConcrete ∈ targetDVF.maximalIdeal ^ n ↔ n ≤ eGlobal := by + rw [mem_maximalIdeal_pow_iff_valuation_le_uniformizer_pow + targetDVF.valuation hϖ n] + change Valued.v (πConcrete : W.adicCompletion L) ≤ + Valued.v ((ϖ : W.adicCompletion L) ^ n) ↔ n ≤ eGlobal + have hCoe : + (πConcrete : W.adicCompletion L) = + (eTarget πTarget : W.adicCompletion L) := rfl + rw [hCoe] + rw [hπTargetValuation, map_pow, hϖValuation] + rw [← WithZero.exp_nsmul] + simp only [nsmul_eq_mul, mul_neg, mul_one] + rw [WithZero.exp_le_exp] + omega + have hπTargetConcreteMem (n : ℕ) : + eTarget πTarget ∈ + (IsLocalRing.maximalIdeal + (W.adicCompletionIntegers L)) ^ n ↔ + n ≤ eGlobal := by + have htransport := + ValuationTheory.ringEquiv_mem_maximalIdeal_pow_iff + concreteRingEquiv n πConcrete + rw [concreteRingEquiv.apply_symm_apply] at htransport + exact htransport.trans (hπConcreteMem n) + have hπTargetMem (n : ℕ) : + πTarget ∈ (𝓂[E] : Ideal 𝒪[E]) ^ n ↔ n ≤ eGlobal := + (ValuationTheory.ringEquiv_mem_maximalIdeal_pow_iff + eTarget n πTarget).symm.trans (hπTargetConcreteMem n) + let baseDVF : + ValuationTheory.DiscreteValuationField.DVF vK.Completion := + { ValueGroup := ValuativeRel.ValueGroupWithZero vK.Completion + valuation := ValuativeRel.valuation vK.Completion } + have hπBaseGenerates : + (𝓂[vK.Completion] : Ideal 𝒪[vK.Completion]) = + Ideal.span ({πBase} : Set 𝒪[vK.Completion]) := + baseDVF.maximalIdeal_eq_span_uniformizer + πData.completionInteger_isUniformizer + change + (𝓂[vK.Completion] : Ideal 𝒪[vK.Completion]).ramificationIdx' + (𝓂[E] : Ideal 𝒪[E]) = eGlobal + apply Ideal.ramificationIdx'_spec + · calc + Ideal.map integerMap + (𝓂[vK.Completion] : Ideal 𝒪[vK.Completion]) = + Ideal.map integerMap + (Ideal.span ({πBase} : Set 𝒪[vK.Completion])) := + congrArg (Ideal.map integerMap) hπBaseGenerates + _ ≤ (𝓂[E] : Ideal 𝒪[E]) ^ eGlobal := by + apply Ideal.map_le_iff_le_comap.mpr + rw [Ideal.span_le] + intro x hx + have hxπ : x = πBase := Set.mem_singleton_iff.mp hx + subst x + change πTarget ∈ (𝓂[E] : Ideal 𝒪[E]) ^ eGlobal + exact (hπTargetMem eGlobal).2 le_rfl + · intro hdeep + have hπDeep : πTarget ∈ (𝓂[E] : Ideal 𝒪[E]) ^ (eGlobal + 1) := + hdeep (Ideal.mem_map_of_mem + integerMap + πData.completionInteger_mem_maximalIdeal) + exact (Nat.not_succ_le_self eGlobal) + ((hπTargetMem (eGlobal + 1)).1 hπDeep) + +open scoped Classical in +/-- The ramification index computed using the integral-closure valuation +chosen for the finite local extension equals the ideal-theoretic index at +the corresponding global centre. -/ +theorem chosenFinitePlace_chosenLocal_ramificationIndex_eq_centre + (v : HeightOneSpectrum (𝓞 K)) : + let C := ChosenFinitePlaceBaseCompletion (K := K) v; + let E := ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v; + letI : FiniteDimensional C E := + chosenFinitePlaceLocalizedFiniteDimensional (K := K) (L := L) v; + letI : Algebra.IsSeparable C E := + (chosenFinitePlaceLocalizedIsGalois + (K := K) (L := L) v).to_isSeparable; + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + (localCompleteDVF C).toDVF + (chosenLocalExtensionCompleteDVF C E).toDVF = + v.asIdeal.ramificationIdx' + (finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v)).asIdeal := by + dsimp only + let C := ChosenFinitePlaceBaseCompletion (K := K) v + let E := ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v + let : FiniteDimensional C E := + chosenFinitePlaceLocalizedFiniteDimensional (K := K) (L := L) v + let : Algebra.IsSeparable C E := + (chosenFinitePlaceLocalizedIsGalois + (K := K) (L := L) v).to_isSeparable + let base := localCompleteDVF C + let target := chosenLocalExtensionCompleteDVF C E + let V := base.valuation.valuationSubring + let : HenselianRing V (IsLocalRing.maximalIdeal V) := + ValuationTheory.DiscreteValuationField.Valuation.henselianRing + base.valuation + let : base.valuation.HasExtension target.valuation := + chosenLocalExtensionCompleteDVF_hasExtension C E + let : base.valuation.HasExtension (ValuativeRel.valuation E) := + chosenFinitePlaceLocalizedValuationHasExtension + (K := K) (L := L) v + let : V.valuation.HasExtension target.valuation := + ⟨(Valuation.isEquiv_valuation_valuationSubring + base.valuation).symm.trans + (Valuation.HasExtension.val_isEquiv_comap + (vR := base.valuation) (vA := target.valuation))⟩ + let : V.valuation.HasExtension (ValuativeRel.valuation E) := + ⟨(Valuation.isEquiv_valuation_valuationSubring + base.valuation).symm.trans + (Valuation.HasExtension.val_isEquiv_comap + (vR := base.valuation) (vA := ValuativeRel.valuation E))⟩ + have hRing : + target.valuation.valuationSubring = + (ValuativeRel.valuation E).valuationSubring := + ValuationTheory.Henselian.valuationSubring_eq_of_henselianRing + V target.valuation (ValuativeRel.valuation E) + let intrinsic := (ValuativeRel.valuation E).valuationSubring + let : Algebra base.valuationSubring intrinsic := + Valuation.HasExtension.instAlgebra_valuationSubring + base.valuation (ValuativeRel.valuation E) + let eTarget : target.valuationSubring ≃+* intrinsic := + RingEquiv.subringCongr + (congrArg ValuationSubring.toSubring hRing) + let eAlg : target.valuationSubring ≃ₐ[base.valuationSubring] intrinsic := + AlgEquiv.ofRingEquiv (f := eTarget) (by + intro a + apply Subtype.ext + rfl) + have htransport := + Ideal.ramificationIdx'_map_eq + (base.maximalIdeal) (target.maximalIdeal) eAlg + have hMax : + Ideal.map eTarget target.maximalIdeal = + IsLocalRing.maximalIdeal intrinsic := + ValuationTheory.ringEquiv_map_maximalIdeal eTarget + change + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF = _ + calc + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF = + Ideal.ramificationIdx' base.maximalIdeal target.maximalIdeal := rfl + _ = Ideal.ramificationIdx' base.maximalIdeal + (Ideal.map eTarget target.maximalIdeal) := htransport.symm + _ = Ideal.ramificationIdx' base.maximalIdeal + (IsLocalRing.maximalIdeal intrinsic) := by rw [hMax] + _ = v.asIdeal.ramificationIdx' + (finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v)).asIdeal := by + change + (𝓂[C] : Ideal 𝒪[C]).ramificationIdx' + (𝓂[E] : Ideal 𝒪[E]) = _ + exact chosenFinitePlace_completed_ramificationIdx'_eq_centre + (K := K) (L := L) v + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/CompositumEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/CompositumEmbedding.lean new file mode 100644 index 0000000000..ab42432f1c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/CompositumEmbedding.lean @@ -0,0 +1,207 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.Cyclotomic.PrimitiveRoots +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.FiniteAbelianCompositum +/-! +# Embedding a finite Galois compositum into a common field + +Two finite normal extensions embedded in a common field generate the same +compositum as their chosen realizations in the separable closure. This +normality argument is the field-theoretic mechanism used to place the local +inertia-field compositum in one cyclotomic target. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory + +open Polynomial + +/-- Divisibility of cyclotomic orders gives an embedding of the smaller +concrete cyclotomic field into the larger one. -/ +noncomputable def cyclotomicFieldEmbeddingOfDvd + (K : Type*) [Field K] [CharZero K] + (m n : ℕ) (hm : 0 < m) (hn : 0 < n) (hmn : m ∣ n) : + CyclotomicField m K →ₐ[K] CyclotomicField n K := by + letI : NeZero m := ⟨hm.ne'⟩ + letI : NeZero n := ⟨hn.ne'⟩ + letI : IsCyclotomicExtension {m} K (CyclotomicField m K) := + CyclotomicField.isCyclotomicExtension m K + letI : IsSplittingField K (CyclotomicField m K) + (Polynomial.cyclotomic m K) := + IsCyclotomicExtension.splitting_field_cyclotomic + m K (CyclotomicField m K) + let C := CyclotomicField n K + letI hC : IsCyclotomicExtension {n} K C := + CyclotomicField.isCyclotomicExtension n K + letI : IsCyclotomicExtension ({n} ∪ {m}) K C := + IsCyclotomicExtension.of_union_of_dvd K C + ⟨n, Set.mem_singleton n, hn.ne', hmn⟩ + exact IsSplittingField.lift (CyclotomicField m K) + (Polynomial.cyclotomic m K) + (IsCyclotomicExtension.splits_cyclotomic K C + (Set.mem_union_right {n} (Set.mem_singleton m))) + +/-- Base extension and divisibility of cyclotomic orders together give an +embedding into the larger cyclotomic field over the enlarged base. -/ +noncomputable def cyclotomicFieldEmbeddingOfBaseAndDvd + (K K' : Type*) [Field K] [Field K'] [CharZero K] [CharZero K'] + [Algebra K K'] + (m n : ℕ) (hm : 0 < m) (hn : 0 < n) (hmn : m ∣ n) : + CyclotomicField m K →ₐ[K] CyclotomicField n K' := by + letI : NeZero m := ⟨hm.ne'⟩ + letI : NeZero n := ⟨hn.ne'⟩ + letI : IsCyclotomicExtension {m} K (CyclotomicField m K) := + CyclotomicField.isCyclotomicExtension m K + letI : IsSplittingField K (CyclotomicField m K) + (Polynomial.cyclotomic m K) := + IsCyclotomicExtension.splitting_field_cyclotomic + m K (CyclotomicField m K) + let C := CyclotomicField n K' + letI : IsScalarTower K K' C := inferInstance + letI hC : IsCyclotomicExtension {n} K' C := + CyclotomicField.isCyclotomicExtension n K' + letI : IsCyclotomicExtension ({n} ∪ {m}) K' C := + IsCyclotomicExtension.of_union_of_dvd K' C + ⟨n, Set.mem_singleton n, hn.ne', hmn⟩ + have hs' : ((Polynomial.cyclotomic m K').map + (algebraMap K' C)).Splits := + IsCyclotomicExtension.splits_cyclotomic K' C + (Set.mem_union_right {n} (Set.mem_singleton m)) + have hs : ((Polynomial.cyclotomic m K).map + (algebraMap K C)).Splits := by + simpa only [← Polynomial.map_cyclotomic m (algebraMap K K'), + Polynomial.map_map, IsScalarTower.algebraMap_eq K K' C] using hs' + exact IsSplittingField.lift (CyclotomicField m K) + (Polynomial.cyclotomic m K) hs + +variable (K L E T : Type) +variable [Field K] [Field L] [Field E] [Field T] +variable [Algebra K L] [Algebra K E] [Algebra K T] +variable [FiniteDimensional K L] [FiniteDimensional K E] +variable [IsAbelianGalois K L] [IsAbelianGalois K E] + +/-- If two finite Galois extensions embed in one field, their concrete +compositum in the chosen separable closure embeds in that field as well. -/ +noncomputable def finiteGaloisCompositumEmbeddingOfEmbeddings + (i : L →ₐ[K] T) (j : E →ₐ[K] T) : + finiteAbelianCompositumField K L E →ₐ[K] T := by + let A : IntermediateField K T := i.fieldRange + let B : IntermediateField K T := j.fieldRange + let R : IntermediateField K T := A ⊔ B + let eA : L ≃ₐ[K] A := AlgEquiv.ofInjectiveField i + let eB : E ≃ₐ[K] B := AlgEquiv.ofInjectiveField j + letI : FiniteDimensional K A := eA.toLinearEquiv.finiteDimensional + letI : FiniteDimensional K B := eB.toLinearEquiv.finiteDimensional + letI : IsGalois K A := IsGalois.of_algEquiv eA + letI : IsGalois K B := IsGalois.of_algEquiv eB + letI : FiniteDimensional K R := + IntermediateField.finiteDimensional_sup A B + letI : IsGalois K R := inferInstance + let r : R →ₐ[K] SeparableClosure K := IsSepClosed.lift + let A₀ : IntermediateField K (SeparableClosure K) := + finiteGaloisFieldRange K L + let B₀ : IntermediateField K (SeparableClosure K) := + finiteGaloisFieldRange K E + let M₀ : IntermediateField K (SeparableClosure K) := A₀ ⊔ B₀ + let aR : A →ₐ[K] R := IntermediateField.inclusion le_sup_left + let bR : B →ₐ[K] R := IntermediateField.inclusion le_sup_right + let eA₀ : L ≃ₐ[K] A₀ := finiteGaloisFieldRangeEquiv K L + let eB₀ : E ≃ₐ[K] B₀ := finiteGaloisFieldRangeEquiv K E + let fA : A₀ →ₐ[K] SeparableClosure K := + r.comp (aR.comp (eA.toAlgHom.comp eA₀.symm.toAlgHom)) + let fB : B₀ →ₐ[K] SeparableClosure K := + r.comp (bR.comp (eB.toAlgHom.comp eB₀.symm.toAlgHom)) + have hA : A₀ ≤ r.fieldRange := by + rw [← AlgHom.fieldRange_of_normal fA] + rintro x ⟨y, rfl⟩ + exact ⟨aR (eA (eA₀.symm y)), rfl⟩ + have hB : B₀ ≤ r.fieldRange := by + rw [← AlgHom.fieldRange_of_normal fB] + rintro x ⟨y, rfl⟩ + exact ⟨bR (eB (eB₀.symm y)), rfl⟩ + have hM : M₀ ≤ r.fieldRange := sup_le hA hB + let intoRange : M₀ →ₐ[K] r.fieldRange := + IntermediateField.inclusion hM + let rangeEquiv : R ≃ₐ[K] r.fieldRange := AlgEquiv.ofInjectiveField r + exact R.val.comp (rangeEquiv.symm.toAlgHom.comp intoRange) + +/-- The common-target embedding can be chosen to agree with the prescribed +embedding of the left factor. Normality first identifies the two copies of +the left field; the correcting automorphism then extends to the whole +Galois compositum. -/ +theorem exists_finiteGaloisCompositumEmbeddingOfEmbeddings_left_eq + (i : L →ₐ[K] T) (j : E →ₐ[K] T) : + ∃ g : finiteAbelianCompositumField K L E →ₐ[K] T, + ∀ x : L, g (finiteAbelianCompositumEmbeddingLeft K L E x) = i x := by + let M := finiteAbelianCompositumField K L E + let i₀ : L →ₐ[K] M := finiteAbelianCompositumEmbeddingLeft K L E + let g₀ : M →ₐ[K] T := + finiteGaloisCompositumEmbeddingOfEmbeddings K L E T i j + let f : L →ₐ[K] T := g₀.comp i₀ + let A : IntermediateField K T := f.fieldRange + let B : IntermediateField K T := i.fieldRange + let eF : L ≃ₐ[K] A := AlgEquiv.ofInjectiveField f + let eI : L ≃ₐ[K] B := AlgEquiv.ofInjectiveField i + let : FiniteDimensional K A := eF.toLinearEquiv.finiteDimensional + let : IsGalois K A := IsGalois.of_algEquiv eF + let gA : A →ₐ[K] T := i.comp eF.symm.toAlgHom + have hgA_range : gA.fieldRange = B := by + apply le_antisymm + · rintro y ⟨x, rfl⟩ + exact ⟨eF.symm x, rfl⟩ + · rintro y ⟨x, rfl⟩ + refine ⟨eF x, ?_⟩ + exact congrArg i (eF.symm_apply_apply x) + have hAB : A = B := + (AlgHom.fieldRange_of_normal gA).symm.trans hgA_range + let eAB : A ≃ₐ[K] B := IntermediateField.equivOfEq hAB + let χ : L ≃ₐ[K] L := eI.trans (eAB.symm.trans eF.symm) + have hfχ (x : L) : f (χ x) = i x := by + change f (eF.symm (eAB.symm (eI x))) = i x + have h := congrArg Subtype.val + (eF.apply_symm_apply (eAB.symm (eI x))) + exact h + let A₀ : IntermediateField K M := i₀.fieldRange + let e₀ : L ≃ₐ[K] A₀ := AlgEquiv.ofInjectiveField i₀ + let : FiniteDimensional K A₀ := e₀.toLinearEquiv.finiteDimensional + let : IsGalois K A₀ := IsGalois.of_algEquiv e₀ + let hA₀M : Algebra A₀ M := A₀.val.toRingHom.toAlgebra + let : SMul A₀ M := hA₀M.toSMul + let : Module A₀ M := hA₀M.toModule + let : IsScalarTower K A₀ M := + IsScalarTower.of_algebraMap_eq' (by + ext x + change (((algebraMap K M x : M) : SeparableClosure K) : + AlgebraicClosure K) = + (((A₀.val (algebraMap K A₀ x) : M) : SeparableClosure K) : + AlgebraicClosure K) + exact congrArg (fun y : M ↦ + (((y : SeparableClosure K)) : AlgebraicClosure K)) + (A₀.val.commutes x).symm) + let χA : A₀ ≃ₐ[K] A₀ := e₀.symm.trans (χ.trans e₀) + let σ : M ≃ₐ[K] M := χA.liftNormal M + have hσ (x : L) : σ (i₀ x) = i₀ (χ x) := by + change σ (algebraMap A₀ M (e₀ x)) = + algebraMap A₀ M (e₀ (χ x)) + rw [AlgEquiv.liftNormal_commutes] + congr 1 + simp [χA] + refine ⟨g₀.comp σ.toAlgHom, ?_⟩ + intro x + change g₀ (σ (i₀ x)) = i x + rw [hσ] + exact hfχ x + +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean new file mode 100644 index 0000000000..252efc8490 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean @@ -0,0 +1,271 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.FieldTheory.Galois.GaloisClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +/-! +# Finite abelian composita + +This file gives a common realization, in a chosen separable closure, of the +compositum of two finite abelian Galois extensions. It also records the +canonical factor embeddings and their elementary degree bounds. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory + +open scoped IsMulCommutative + +universe u v + +/-- The chosen copy of a finite Galois extension in the separable closure. -/ +def finiteGaloisFieldRange + (K L : Type) [Field K] [Field L] [Algebra K L] + [IsGalois K L] : + IntermediateField K (SeparableClosure K) := + AlgHom.fieldRange + (AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L) + +/-- The chosen embedding identifies the extension with its field range. -/ +def finiteGaloisFieldRangeEquiv + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] : + L ≃ₐ[K] finiteGaloisFieldRange K L := + AlgEquiv.ofInjectiveField + (AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L) + +/-- The chosen field-range model is finite-dimensional over the base. -/ +instance finiteGaloisFieldRange_finiteDimensional + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] : + FiniteDimensional K (finiteGaloisFieldRange K L) := + (finiteGaloisFieldRangeEquiv K L).toLinearEquiv.finiteDimensional + +/-- The chosen field-range model is Galois over the base. -/ +instance finiteGaloisFieldRange_isGalois + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] : + IsGalois K (finiteGaloisFieldRange K L) := + IsGalois.of_algEquiv (finiteGaloisFieldRangeEquiv K L) + +section AbelianCompositum + +variable (K : Type u) [Field K] +variable {Omega : Type v} [Field Omega] [Algebra K Omega] + +/-- The compositum, inside a common overfield, of two abelian Galois +intermediate fields is again abelian Galois over the base. -/ +theorem isAbelianGalois_sup + (A B : IntermediateField K Omega) + [IsAbelianGalois K A] [IsAbelianGalois K B] : + IsAbelianGalois K (A ⊔ B : IntermediateField K Omega) := by + let M : IntermediateField K Omega := A ⊔ B + let j : M →ₐ[K] Omega := M.val + let A' : IntermediateField K M := A.comap j + let B' : IntermediateField K M := B.comap j + have hjrange : j.fieldRange = M := + IntermediateField.fieldRange_val M + have hAmap : A'.map j = A := by + apply IntermediateField.map_comap_eq_self + rw [hjrange] + exact le_sup_left + have hBmap : B'.map j = B := by + apply IntermediateField.map_comap_eq_self + rw [hjrange] + exact le_sup_right + have hsup : A' ⊔ B' = ⊤ := by + apply IntermediateField.map_injective j + rw [IntermediateField.map_sup, hAmap, hBmap, + ← AlgHom.fieldRange_eq_map, hjrange] + let eA : A' →ₐ[K] A := + ((j.comp A'.val).codRestrict A.toSubalgebra fun x ↦ x.2) + let eB : B' →ₐ[K] B := + ((j.comp B'.val).codRestrict B.toSubalgebra fun x ↦ x.2) + let : IsAbelianGalois K A' := IsAbelianGalois.of_algHom eA + let : IsAbelianGalois K B' := IsAbelianGalois.of_algHom eB + let : IsGalois K M := inferInstance + let rA : (M ≃ₐ[K] M) →* (A' ≃ₐ[K] A') := + AlgEquiv.restrictNormalHom A' + let rB : (M ≃ₐ[K] M) →* (B' ≃ₐ[K] B') := + AlgEquiv.restrictNormalHom B' + let r : (M ≃ₐ[K] M) →* (A' ≃ₐ[K] A') × (B' ≃ₐ[K] B') := + rA.prod rB + have hr : Function.Injective r := by + rw [injective_iff_map_eq_one] + intro sigma hsigma + have hAone : rA sigma = 1 := congrArg Prod.fst hsigma + have hBone : rB sigma = 1 := congrArg Prod.snd hsigma + have hmemA : sigma ∈ A'.fixingSubgroup := by + rw [← IntermediateField.restrictNormalHom_ker] + exact hAone + have hmemB : sigma ∈ B'.fixingSubgroup := by + rw [← IntermediateField.restrictNormalHom_ker] + exact hBone + have hmem : sigma ∈ (A' ⊔ B').fixingSubgroup := by + rw [IntermediateField.fixingSubgroup_sup] + exact ⟨hmemA, hmemB⟩ + simpa [hsup] using hmem + exact + { is_comm.comm := fun sigma tau ↦ by + apply hr + rw [map_mul, map_mul] + apply Prod.ext + · change rA sigma * rA tau = rA tau * rA sigma + exact mul_comm (rA sigma) (rA tau) + · change rB sigma * rB tau = rB tau * rB sigma + exact mul_comm (rB sigma) (rB tau) } + +end AbelianCompositum + +section ConcreteAbelianCompositum + +variable (K L E : Type) +variable [Field K] +variable [Field L] [Field E] [Algebra K L] [Algebra K E] +variable [FiniteDimensional K L] [FiniteDimensional K E] +variable [IsAbelianGalois K L] [IsAbelianGalois K E] + +/-- A concrete common realization of the compositum of two finite abelian +extensions in the chosen separable closure of the base. -/ +def finiteAbelianCompositumField : + IntermediateField K (SeparableClosure K) := + finiteGaloisFieldRange K L ⊔ finiteGaloisFieldRange K E + +/-- The concrete compositum is finite-dimensional over the base. -/ +instance finiteAbelianCompositumField_finiteDimensional : + FiniteDimensional K (finiteAbelianCompositumField K L E) := + IntermediateField.finiteDimensional_sup + (finiteGaloisFieldRange K L) (finiteGaloisFieldRange K E) + +/-- The concrete compositum is abelian Galois over the base. -/ +instance finiteAbelianCompositumField_isAbelianGalois : + IsAbelianGalois K (finiteAbelianCompositumField K L E) := by + let : IsAbelianGalois K (finiteGaloisFieldRange K L) := + IsAbelianGalois.of_algHom + (finiteGaloisFieldRangeEquiv K L).symm.toAlgHom + let : IsAbelianGalois K (finiteGaloisFieldRange K E) := + IsAbelianGalois.of_algHom + (finiteGaloisFieldRangeEquiv K E).symm.toAlgHom + exact isAbelianGalois_sup K + (finiteGaloisFieldRange K L) (finiteGaloisFieldRange K E) + +/-- The given left extension embeds into its concrete compositum. -/ +def finiteAbelianCompositumEmbeddingLeft : + L →ₐ[K] finiteAbelianCompositumField K L E := + (IntermediateField.inclusion le_sup_left).comp + (finiteGaloisFieldRangeEquiv K L).toAlgHom + +/-- The given right extension embeds into its concrete compositum. -/ +def finiteAbelianCompositumEmbeddingRight : + E →ₐ[K] finiteAbelianCompositumField K L E := + (IntermediateField.inclusion le_sup_right).comp + (finiteGaloisFieldRangeEquiv K E).toAlgHom + +/-- The images of the two canonical embeddings generate their concrete +compositum. -/ +theorem finiteAbelianCompositum_embeddingRanges_sup_eq_top : + (finiteAbelianCompositumEmbeddingLeft K L E).fieldRange ⊔ + (finiteAbelianCompositumEmbeddingRight K L E).fieldRange = ⊤ := by + let A₀ : IntermediateField K (SeparableClosure K) := + finiteGaloisFieldRange K L + let B₀ : IntermediateField K (SeparableClosure K) := + finiteGaloisFieldRange K E + let M : IntermediateField K (SeparableClosure K) := + finiteAbelianCompositumField K L E + let j : M →ₐ[K] SeparableClosure K := M.val + have hjrange : j.fieldRange = M := + IntermediateField.fieldRange_val M + have hjleft : + j.comp (finiteAbelianCompositumEmbeddingLeft K L E) = + A₀.val.comp (finiteGaloisFieldRangeEquiv K L).toAlgHom := by + ext x + rfl + have hjright : + j.comp (finiteAbelianCompositumEmbeddingRight K L E) = + B₀.val.comp (finiteGaloisFieldRangeEquiv K E).toAlgHom := by + ext x + rfl + have heqLeft : + (finiteGaloisFieldRangeEquiv K L).toAlgHom.fieldRange = + (⊤ : IntermediateField K A₀) := + AlgHom.fieldRange_eq_top.mpr + (finiteGaloisFieldRangeEquiv K L).surjective + have heqRight : + (finiteGaloisFieldRangeEquiv K E).toAlgHom.fieldRange = + (⊤ : IntermediateField K B₀) := + AlgHom.fieldRange_eq_top.mpr + (finiteGaloisFieldRangeEquiv K E).surjective + have hleft : + (finiteAbelianCompositumEmbeddingLeft K L E).fieldRange.map j = A₀ := by + calc + (finiteAbelianCompositumEmbeddingLeft K L E).fieldRange.map j = + (j.comp (finiteAbelianCompositumEmbeddingLeft K L E)).fieldRange := + AlgHom.map_fieldRange _ _ + _ = (A₀.val.comp + (finiteGaloisFieldRangeEquiv K L).toAlgHom).fieldRange := + congrArg AlgHom.fieldRange hjleft + _ = (finiteGaloisFieldRangeEquiv K L).toAlgHom.fieldRange.map A₀.val := + (AlgHom.map_fieldRange _ _).symm + _ = (⊤ : IntermediateField K A₀).map A₀.val := by + rw [heqLeft] + _ = A₀.val.fieldRange := + (AlgHom.fieldRange_eq_map A₀.val).symm + _ = A₀ := IntermediateField.fieldRange_val A₀ + have hright : + (finiteAbelianCompositumEmbeddingRight K L E).fieldRange.map j = B₀ := by + calc + (finiteAbelianCompositumEmbeddingRight K L E).fieldRange.map j = + (j.comp (finiteAbelianCompositumEmbeddingRight K L E)).fieldRange := + AlgHom.map_fieldRange _ _ + _ = (B₀.val.comp + (finiteGaloisFieldRangeEquiv K E).toAlgHom).fieldRange := + congrArg AlgHom.fieldRange hjright + _ = (finiteGaloisFieldRangeEquiv K E).toAlgHom.fieldRange.map B₀.val := + (AlgHom.map_fieldRange _ _).symm + _ = (⊤ : IntermediateField K B₀).map B₀.val := by + rw [heqRight] + _ = B₀.val.fieldRange := + (AlgHom.fieldRange_eq_map B₀.val).symm + _ = B₀ := IntermediateField.fieldRange_val B₀ + apply IntermediateField.map_injective j + calc + ((finiteAbelianCompositumEmbeddingLeft K L E).fieldRange ⊔ + (finiteAbelianCompositumEmbeddingRight K L E).fieldRange).map j = + A₀ ⊔ B₀ := by + rw [IntermediateField.map_sup, hleft, hright] + _ = M := rfl + _ = j.fieldRange := hjrange.symm + _ = (⊤ : IntermediateField K M).map j := + AlgHom.fieldRange_eq_map j + +/-- The degree of the left factor is bounded by the degree of the +compositum. -/ +theorem finiteAbelianCompositum_finrank_left_le : + Module.finrank K L ≤ + Module.finrank K (finiteAbelianCompositumField K L E) := + (finiteAbelianCompositumEmbeddingLeft K L E).toLinearMap + |>.finrank_le_finrank_of_injective + (finiteAbelianCompositumEmbeddingLeft K L E).injective + +/-- The degree of the right factor is bounded by the degree of the +compositum. -/ +theorem finiteAbelianCompositum_finrank_right_le : + Module.finrank K E ≤ + Module.finrank K (finiteAbelianCompositumField K L E) := + (finiteAbelianCompositumEmbeddingRight K L E).toLinearMap + |>.finrank_le_finrank_of_injective + (finiteAbelianCompositumEmbeddingRight K L E).injective + +end ConcreteAbelianCompositum + +end AlgebraicNumberTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois.lean new file mode 100644 index 0000000000..2c796d41f0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois.lean @@ -0,0 +1,23 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.AbsoluteAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeDegreeSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.FixedFieldLattice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.InfiniteBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteGaloisBaseEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MaximalAbelianSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.NormalFieldRange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.RelativeAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.UnboundedDegree + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/AbsoluteAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/AbsoluteAbelianization.lean new file mode 100644 index 0000000000..d83ce46529 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/AbsoluteAbelianization.lean @@ -0,0 +1,179 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.FieldTheory.Galois.Profinite +public import Mathlib.FieldTheory.IsSepClosed +public import Mathlib.Topology.Algebra.Group.TopologicalAbelianization +/-! +# Absolute abelianization inside the separable closure + +For an arbitrary field, this module identifies the topological abelianization +of the Galois group of its separable closure with the Galois group of the +maximal abelian subextension. Working inside the separable closure makes the +construction uniform in every characteristic. +-/ + +@[expose] public section + +noncomputable +section + +open scoped IsMulCommutative + +variable (K : Type) [Field K] + +/-- The closure of the commutator subgroup of the separable absolute Galois +group, packaged as a closed subgroup. -/ +def absoluteCommutatorClosure : + ClosedSubgroup Gal(SeparableClosure K/K) where + toSubgroup := + (commutator Gal(SeparableClosure K/K)).topologicalClosure + isClosed' := Subgroup.isClosed_topologicalClosure _ + +/-- The topological closure of the absolute commutator subgroup is normal. -/ +instance absoluteCommutatorClosure_normal : + (absoluteCommutatorClosure K).Normal := by + change + ((commutator Gal(SeparableClosure K/K)).topologicalClosure).Normal + infer_instance + +/-- The maximal abelian subextension of the separable closure. -/ +def maximalAbelianExtension : + IntermediateField K (SeparableClosure K) := + IntermediateField.fixedField (absoluteCommutatorClosure K).toSubgroup + +/-- The maximal abelian subextension is Galois over the base field. -/ +instance maximalAbelianExtension_isGalois : + IsGalois K (maximalAbelianExtension K) := by + apply (InfiniteGalois.normal_iff_isGalois + (maximalAbelianExtension K)).1 + change + (IntermediateField.fixedField + (absoluteCommutatorClosure K).toSubgroup).fixingSubgroup.Normal + rw [InfiniteGalois.fixingSubgroup_fixedField + (absoluteCommutatorClosure K)] + infer_instance + +/-- The algebraic quotient equivalence from the absolute topological +abelianization to the Galois group of the maximal abelian extension. -/ +noncomputable def absoluteAbelianizationMulEquivMaximalAbelianGalois : + TopologicalAbelianization Gal(SeparableClosure K/K) ≃* + Gal(maximalAbelianExtension K/K) := + InfiniteGalois.normalAutEquivQuotient (absoluteCommutatorClosure K) + +/-- The algebraic equivalence sends a quotient class to restriction to the +maximal abelian extension. -/ +@[simp] +theorem absoluteAbelianizationMulEquivMaximalAbelianGalois_mk + (sigma : Gal(SeparableClosure K/K)) : + absoluteAbelianizationMulEquivMaximalAbelianGalois K + (QuotientGroup.mk sigma) = + AlgEquiv.restrictNormalHom (maximalAbelianExtension K) sigma := + rfl + +/-- The algebraic equivalence from the absolute abelianization is continuous. -/ +theorem absoluteAbelianizationMulEquivMaximalAbelianGalois_continuous : + Continuous (absoluteAbelianizationMulEquivMaximalAbelianGalois K) := by + apply (QuotientGroup.isQuotientMap_mk + (absoluteCommutatorClosure K).toSubgroup).continuous_iff.2 + refine (InfiniteGalois.restrictNormalHom_continuous + (maximalAbelianExtension K)).congr ?_ + intro sigma + exact + (absoluteAbelianizationMulEquivMaximalAbelianGalois_mk K sigma).symm + +/-- The canonical topological identification of the absolute separable +Galois group's abelianization with the maximal abelian Galois group. -/ +noncomputable def absoluteTopologicalAbelianizationEquivMaximalAbelianGalois : + TopologicalAbelianization Gal(SeparableClosure K/K) ≃ₜ* + Gal(maximalAbelianExtension K/K) := by + letI : T2Space Gal(maximalAbelianExtension K/K) := + krullTopology_t2 + let h : + TopologicalAbelianization Gal(SeparableClosure K/K) ≃ₜ + Gal(maximalAbelianExtension K/K) := + Continuous.homeoOfEquivCompactToT2 + (f := (absoluteAbelianizationMulEquivMaximalAbelianGalois K).toEquiv) + (absoluteAbelianizationMulEquivMaximalAbelianGalois_continuous K) + exact + { h with + map_mul' := + (absoluteAbelianizationMulEquivMaximalAbelianGalois K).map_mul } + +/-- The absolute topological abelianization is totally disconnected. -/ +instance absoluteTopologicalAbelianization_totallyDisconnectedSpace : + TotallyDisconnectedSpace + (TopologicalAbelianization Gal(SeparableClosure K/K)) := + Homeomorph.totallyDisconnectedSpace + (absoluteTopologicalAbelianizationEquivMaximalAbelianGalois K).symm.toHomeomorph + +/-- The maximal abelian subextension has an abelian Galois group. -/ +instance maximalAbelianExtension_isAbelianGalois : + IsAbelianGalois K (maximalAbelianExtension K) where + is_comm.comm sigma tau := by + apply + (absoluteTopologicalAbelianizationEquivMaximalAbelianGalois K).symm.injective + simp only [map_mul] + exact mul_comm _ _ + +/-- Every finite abelian intermediate field of the separable closure is +contained in the maximal abelian extension. -/ +theorem finiteAbelianIntermediateField_le_maximalAbelianExtension + (E : IntermediateField K (SeparableClosure K)) + [FiniteDimensional K E] [IsAbelianGalois K E] : + E ≤ maximalAbelianExtension K := by + rw [maximalAbelianExtension, IntermediateField.le_iff_le] + change + (commutator Gal(SeparableClosure K/K)).topologicalClosure ≤ + E.fixingSubgroup + apply Subgroup.topologicalClosure_minimal + · rw [← E.restrictNormalHom_ker] + exact + Abelianization.commutator_subset_ker + (AlgEquiv.restrictNormalHom + (F := K) (K₁ := SeparableClosure K) E) + · exact E.fixingSubgroup_isClosed + +/-- A selected embedding of a finite abelian extension into the maximal +abelian extension. Naming this embedding keeps downstream finite-coordinate +arguments independent of the implementation of the separable closure. -/ +noncomputable def finiteAbelianExtensionEmbeddingIntoMaximalAbelianExtension + (L : Type*) [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] : + L →ₐ[K] maximalAbelianExtension K := by + let i : L →ₐ[K] SeparableClosure K := IsSepClosed.lift + let e : L ≃ₐ[K] i.fieldRange := i.equivFieldRange + letI : FiniteDimensional K i.fieldRange := + e.toLinearEquiv.finiteDimensional + letI : IsAbelianGalois K i.fieldRange := + IsAbelianGalois.of_algHom e.symm.toAlgHom + have hle : i.fieldRange ≤ maximalAbelianExtension K := + finiteAbelianIntermediateField_le_maximalAbelianExtension K i.fieldRange + exact + i.codRestrict (maximalAbelianExtension K).toSubalgebra + (fun x => hle (AlgHom.mem_fieldRange.mpr ⟨x, rfl⟩)) + +/-- The finite Galois intermediate field of the maximal abelian extension +selected by a finite abelian extension. -/ +noncomputable def finiteAbelianExtensionInMaximalAbelianExtension + (L : Type*) [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] : + FiniteGaloisIntermediateField K (maximalAbelianExtension K) := + let j := finiteAbelianExtensionEmbeddingIntoMaximalAbelianExtension K L + { toIntermediateField := j.fieldRange + finiteDimensional := j.equivFieldRange.toLinearEquiv.finiteDimensional + isGalois := IsGalois.of_algEquiv j.equivFieldRange } + +/-- The selected finite layer is canonically equivalent to the original +finite abelian extension. -/ +noncomputable def finiteAbelianExtensionEquivInMaximalAbelianExtension + (L : Type*) [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] : + L ≃ₐ[K] finiteAbelianExtensionInMaximalAbelianExtension K L := + (finiteAbelianExtensionEmbeddingIntoMaximalAbelianExtension K L).equivFieldRange diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/All.lean new file mode 100644 index 0000000000..84b62bcdfb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/All.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.AbsoluteAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeDegreeSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.FixedFieldLattice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.InfiniteBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteGaloisBaseEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MaximalAbelianSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.NormalFieldRange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.RelativeAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.UnboundedDegree +/-! # Galois subextensions and fixed-field constructions -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeDegreeSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeDegreeSubextension.lean new file mode 100644 index 0000000000..b60f5aeafc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeDegreeSubextension.lean @@ -0,0 +1,244 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +/-! +# A prime-degree intermediate field of a finite cyclic extension + +This file supplies an induction field for finite cyclic extensions. +If `L / K` is a nontrivial finite cyclic Galois extension, choose a +prime `p ∣ [L : K]`. For a generator `σ` of its Galois group, the +subgroup generated by `σ ^ p` has index `p`. Its fixed field is +therefore an actual cyclic Galois extension of `K` of degree `p`, while +the remaining extension has degree `[L : K] / p`. +-/ + +@[expose] public section + +noncomputable +section + +variable {K L : Type} + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [IsCyclic (L ≃ₐ[K] L)] + +local notation "G" => L ≃ₐ[K] L + +/-- A fixed generator of the cyclic Galois group. -/ +noncomputable def cyclicGaloisGenerator : G := + (IsCyclic.exists_generator (α := G)).choose + +omit [FiniteDimensional K L] [IsGalois K L] in +theorem mem_zpowers_cyclicGaloisGenerator (σ : G) : + σ ∈ Subgroup.zpowers + (cyclicGaloisGenerator (K := K) (L := L)) := + (IsCyclic.exists_generator (α := G)).choose_spec σ + +theorem orderOf_cyclicGaloisGenerator : + orderOf (cyclicGaloisGenerator (K := K) (L := L)) = + Module.finrank K L := by + rw [orderOf_eq_card_of_forall_mem_zpowers + (mem_zpowers_cyclicGaloisGenerator (K := K) (L := L))] + exact IsGalois.card_aut_eq_finrank K L + +/-- A prime divisor of the degree of a nontrivial cyclic extension. -/ +noncomputable def cyclicDegreePrime + (hdegree : 1 < Module.finrank K L) : ℕ := + (Nat.exists_prime_and_dvd + (ne_of_gt hdegree)).choose + +omit [FiniteDimensional K L] [IsGalois K L] + [IsCyclic (L ≃ₐ[K] L)] in +theorem cyclicDegreePrime_prime + (hdegree : 1 < Module.finrank K L) : + (cyclicDegreePrime (K := K) (L := L) hdegree).Prime := + (Nat.exists_prime_and_dvd + (ne_of_gt hdegree)).choose_spec.1 + +omit [FiniteDimensional K L] [IsGalois K L] + [IsCyclic (L ≃ₐ[K] L)] in +theorem cyclicDegreePrime_dvd_finrank + (hdegree : 1 < Module.finrank K L) : + cyclicDegreePrime (K := K) (L := L) hdegree ∣ + Module.finrank K L := + (Nat.exists_prime_and_dvd + (ne_of_gt hdegree)).choose_spec.2 + +/-- The subgroup generated by `σ ^ p`; it has index `p`. -/ +noncomputable def cyclicPrimeDegreeSubgroup + (hdegree : 1 < Module.finrank K L) : + Subgroup G := + Subgroup.zpowers + ((cyclicGaloisGenerator (K := K) (L := L)) ^ + cyclicDegreePrime (K := K) (L := L) hdegree) + +theorem cyclicPrimeDegreeSubgroup_card + (hdegree : 1 < Module.finrank K L) : + Nat.card + (cyclicPrimeDegreeSubgroup + (K := K) (L := L) hdegree) = + Module.finrank K L / + cyclicDegreePrime (K := K) (L := L) hdegree := by + rw [cyclicPrimeDegreeSubgroup, Nat.card_zpowers, + orderOf_pow_of_dvd + (cyclicDegreePrime_prime + (K := K) (L := L) hdegree).ne_zero + (by + rw [orderOf_cyclicGaloisGenerator] + exact cyclicDegreePrime_dvd_finrank + (K := K) (L := L) hdegree), + orderOf_cyclicGaloisGenerator] + +theorem cyclicPrimeDegreeSubgroup_index + (hdegree : 1 < Module.finrank K L) : + (cyclicPrimeDegreeSubgroup + (K := K) (L := L) hdegree).index = + cyclicDegreePrime (K := K) (L := L) hdegree := by + let P := + cyclicPrimeDegreeSubgroup + (K := K) (L := L) hdegree + let p := + cyclicDegreePrime (K := K) (L := L) hdegree + have hp : p.Prime := + cyclicDegreePrime_prime + (K := K) (L := L) hdegree + have hpDvd : p ∣ Module.finrank K L := + cyclicDegreePrime_dvd_finrank + (K := K) (L := L) hdegree + have hcardP : + Nat.card P = Module.finrank K L / p := + cyclicPrimeDegreeSubgroup_card + (K := K) (L := L) hdegree + have hcardG : + Nat.card G = Module.finrank K L := + IsGalois.card_aut_eq_finrank K L + have hmul : + (Module.finrank K L / p) * P.index = + Module.finrank K L := by + simpa only [hcardP, ← Nat.card_eq_fintype_card, hcardG] using + P.card_mul_index + have hdivpos : + 0 < Module.finrank K L / p := + Nat.div_pos + (Nat.le_of_dvd Module.finrank_pos hpDvd) + hp.pos + apply Nat.mul_left_cancel hdivpos + calc + (Module.finrank K L / p) * P.index = + Module.finrank K L := hmul + _ = (Module.finrank K L / p) * p := + (Nat.div_mul_cancel hpDvd).symm + +noncomputable instance cyclicPrimeDegreeSubgroup_normal + (hdegree : 1 < Module.finrank K L) : + (cyclicPrimeDegreeSubgroup + (K := K) (L := L) hdegree).Normal := + inferInstance + +/-- The fixed field of the chosen index-prime subgroup. -/ +noncomputable def cyclicPrimeDegreeIntermediate + (hdegree : 1 < Module.finrank K L) : + IntermediateField K L := + IntermediateField.fixedField + (cyclicPrimeDegreeSubgroup + (K := K) (L := L) hdegree) + +noncomputable instance cyclicPrimeDegreeIntermediate_isGalois + (hdegree : 1 < Module.finrank K L) : + IsGalois K + (cyclicPrimeDegreeIntermediate + (K := K) (L := L) hdegree) := by + unfold cyclicPrimeDegreeIntermediate + infer_instance + +theorem cyclicPrimeDegreeIntermediate_finrank + (hdegree : 1 < Module.finrank K L) : + Module.finrank K + (cyclicPrimeDegreeIntermediate + (K := K) (L := L) hdegree) = + cyclicDegreePrime (K := K) (L := L) hdegree := by + let P := + cyclicPrimeDegreeSubgroup + (K := K) (L := L) hdegree + let M := + cyclicPrimeDegreeIntermediate + (K := K) (L := L) hdegree + let : P.Normal := + cyclicPrimeDegreeSubgroup_normal + (K := K) (L := L) hdegree + let : IsGalois K M := + cyclicPrimeDegreeIntermediate_isGalois + (K := K) (L := L) hdegree + calc + Module.finrank K M = + Nat.card (M ≃ₐ[K] M) := + (IsGalois.card_aut_eq_finrank K M).symm + _ = Nat.card (G ⧸ P) := + Nat.card_congr + (IsGalois.normalAutEquivQuotient P).symm.toEquiv + _ = P.index := by + rw [P.index_eq_card] + _ = cyclicDegreePrime (K := K) (L := L) hdegree := + cyclicPrimeDegreeSubgroup_index + (K := K) (L := L) hdegree + +theorem cyclicPrimeDegreeIntermediate_top_finrank + (hdegree : 1 < Module.finrank K L) : + Module.finrank + (cyclicPrimeDegreeIntermediate + (K := K) (L := L) hdegree) + L = + Module.finrank K L / + cyclicDegreePrime (K := K) (L := L) hdegree := by + unfold cyclicPrimeDegreeIntermediate + rw [IntermediateField.finrank_fixedField_eq_card, + cyclicPrimeDegreeSubgroup_card] + +noncomputable instance cyclicPrimeDegreeIntermediate_top_isGalois + (hdegree : 1 < Module.finrank K L) : + IsGalois + (cyclicPrimeDegreeIntermediate + (K := K) (L := L) hdegree) + L := by + unfold cyclicPrimeDegreeIntermediate + exact + IsGalois.of_fixed_field L + (cyclicPrimeDegreeSubgroup + (K := K) (L := L) hdegree) + +noncomputable instance cyclicPrimeDegreeIntermediate_base_isCyclic + (hdegree : 1 < Module.finrank K L) : + IsCyclic + (cyclicPrimeDegreeIntermediate + (K := K) (L := L) hdegree ≃ₐ[K] + cyclicPrimeDegreeIntermediate + (K := K) (L := L) hdegree) := by + let P := + cyclicPrimeDegreeSubgroup + (K := K) (L := L) hdegree + let : P.Normal := + cyclicPrimeDegreeSubgroup_normal + (K := K) (L := L) hdegree + exact + (IsGalois.normalAutEquivQuotient P).isCyclic.mp + (isCyclic_of_surjective + (QuotientGroup.mk' P) + (QuotientGroup.mk'_surjective P)) + +noncomputable instance cyclicPrimeDegreeIntermediate_top_isCyclic + (hdegree : 1 < Module.finrank K L) : + IsCyclic + (L ≃ₐ[cyclicPrimeDegreeIntermediate + (K := K) (L := L) hdegree] L) := by + let P := + cyclicPrimeDegreeSubgroup + (K := K) (L := L) hdegree + exact + (IntermediateField.subgroupEquivAlgEquiv P).isCyclic.mp + (inferInstance : IsCyclic P) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeSubextension.lean new file mode 100644 index 0000000000..5d34ccde4b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeSubextension.lean @@ -0,0 +1,845 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace +/-! +# The prime-degree subextension of a cyclic prime-power extension + +This file constructs a prime-degree intermediate field. +For a nontrivial cyclic Galois extension whose group has order +`p ^ exponent`, the index-`p` subgroup constructed in +`SplittingGroupTheory` is sent through the finite Galois +correspondence. Its fixed field is an actual cyclic Galois extension +of the base of degree `p`. + +The finite-place decomposition group in that subextension is obtained +by restricting the decomposition group of `L / K`. Thus complete +splitting descends to the prime-degree subextension, and nonsplitting +there ascends to `L`. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification + +section ValuationRestriction + +variable {F E : Type} + [Field F] [Field E] [Algebra F E] + +open scoped Classical in +/-- Restrict an actual extension of an absolute value to an +intermediate field. -/ +def restrictAbsoluteValueExtensionToIntermediate + (vF : AbsoluteValue F ℝ) + (w : AbsoluteValueExtension vF E) + (M : IntermediateField F E) : + AbsoluteValueExtension vF M where + val := + w.1.comp (f := M.val.toRingHom) + M.val.injective + property x := by + change w.1 (algebraMap F E x) = vF x + exact w.2 x + +open scoped Classical in +@[simp] +theorem restrictAbsoluteValueExtensionToIntermediate_apply + (vF : AbsoluteValue F ℝ) + (w : AbsoluteValueExtension vF E) + (M : IntermediateField F E) + (x : M) : + (restrictAbsoluteValueExtensionToIntermediate + vF w M).1 x = w.1 x := + rfl + +open scoped Classical in +/-- Regard the original extension as an extension of its restriction +to an intermediate field. -/ +def absoluteValueExtensionOverIntermediate + (vF : AbsoluteValue F ℝ) + (w : AbsoluteValueExtension vF E) + (M : IntermediateField F E) : + AbsoluteValueExtension + (restrictAbsoluteValueExtensionToIntermediate + vF w M).1 E where + val := w.1 + property _ := rfl + +open scoped Classical in +/-- Restriction of an extension of a nontrivial absolute value remains +nontrivial. -/ +theorem restrictAbsoluteValueExtensionToIntermediate_isNontrivial + (vF : AbsoluteValue F ℝ) + (hvF : vF.IsNontrivial) + (w : AbsoluteValueExtension vF E) + (M : IntermediateField F E) : + (restrictAbsoluteValueExtensionToIntermediate + vF w M).1.IsNontrivial := by + rcases hvF with ⟨a, ha, hva⟩ + refine + ⟨algebraMap F M a, + (map_ne_zero (algebraMap F M)).2 ha, ?_⟩ + simpa only + [(restrictAbsoluteValueExtensionToIntermediate + vF w M).2 a] using hva + +open scoped Classical in +/-- For a normal subextension represented by a field type, its +decomposition group is the restriction image of the decomposition +group upstairs. + +The reverse inclusion uses valuation-extension counting over the subextension: a +lift of a valuation-preserving automorphism is corrected by an +automorphism fixing that field. -/ +theorem absoluteValueDecompositionGroup_map_restrictNormalHom + {M : Type*} + [Field M] [Algebra F M] [Algebra M E] + [IsScalarTower F M E] + [IsGalois F E] + [Normal F M] + (vF : AbsoluteValue F ℝ) + (hvF : vF.IsNontrivial) + (w : AbsoluteValueExtension vF E) : + (absoluteValueDecompositionGroup F w.1).map + (AlgEquiv.restrictNormalHom + (F := F) (K₁ := E) M) = + absoluteValueDecompositionGroup F + (w.1.comp (f := algebraMap M E) + (algebraMap M E).injective) := by + let : IsGalois M E := + IsGalois.tower_top_of_isGalois F M E + let vM : AbsoluteValueExtension vF M := + { val := + w.1.comp (f := algebraMap M E) + (algebraMap M E).injective + property := by + intro x + change + w.1 (algebraMap M E (algebraMap F M x)) = + vF x + rw [← IsScalarTower.algebraMap_apply F M E] + exact w.2 x } + let q := + AlgEquiv.restrictNormalHom + (F := F) (K₁ := E) M + ext τ + constructor + · rintro ⟨σ, hσ, rfl⟩ + change + ∀ x : E, + w.1 (σ x) < 1 ↔ w.1 x < 1 + at hσ + change + ∀ x : M, + vM.1 ((q σ) x) < 1 ↔ + vM.1 x < 1 + intro x + have hleft : + vM.1 ((q σ) x) = + w.1 (σ (algebraMap M E x)) := by + change + w.1 (algebraMap M E ((q σ) x)) = + w.1 (σ (algebraMap M E x)) + exact congrArg w.1 + (AlgEquiv.restrictNormal_commutes + σ M x) + have hright : + vM.1 x = w.1 (algebraMap M E x) := + rfl + rw [hleft, hright] + exact hσ (algebraMap M E x) + · intro hτ + obtain ⟨σ : E ≃ₐ[F] E, hσ⟩ := + (AlgEquiv.restrictNormalHom_surjective + (F := F) (K₁ := M) (E := E)) τ + have hτext : + absoluteValueExtensionConjugate + vF vM τ = vM := + (mem_absoluteValueDecompositionGroup_iff_extensionConjugate_eq + vF hvF vM τ).mp hτ + let wSigma : + AbsoluteValueExtension vM.1 E := + { val := + absoluteValueConjugate w.1 σ + property := by + intro x + calc + w.1 (σ (algebraMap M E x)) = + vM.1 ((q σ) x) := by + change + w.1 (σ (algebraMap M E x)) = + w.1 (algebraMap M E ((q σ) x)) + exact congrArg w.1 + (AlgEquiv.restrictNormal_commutes + σ M x).symm + _ = vM.1 (τ x) := by + rw [hσ] + _ = vM.1 x := by + have hx := + congrArg + (fun e : + AbsoluteValueExtension vF M => + e.1 x) + hτext + exact hx } + let wOverM : AbsoluteValueExtension vM.1 E := + { val := w.1 + property := by + intro x + rfl } + let hvM : vM.1.IsNontrivial := by + rcases hvF with ⟨a, ha, hva⟩ + refine + ⟨algebraMap F M a, + (map_ne_zero (algebraMap F M)).2 ha, ?_⟩ + simpa only [vM.2 a] using hva + obtain ⟨ηM, hηM⟩ := + absoluteValueConjugacy vM.1 hvM + wOverM wSigma + let η : E ≃ₐ[F] E := + ηM.restrictScalars F + have hqη : q η = 1 := by + apply AlgEquiv.ext + intro x + apply (algebraMap M E).injective + calc + algebraMap M E ((q η) x) = + η (algebraMap M E x) := + AlgEquiv.restrictNormal_commutes + η M x + _ = algebraMap M E x := + ηM.commutes x + let δ : E ≃ₐ[F] E := + σ * η⁻¹ + have hδ : + δ ∈ absoluteValueDecompositionGroup F w.1 := by + change + ∀ x : E, + w.1 (δ x) < 1 ↔ + w.1 x < 1 + intro x + have hx := + congrArg + (fun e : AbsoluteValueExtension vM.1 E => + e.1 (ηM⁻¹ x)) + hηM + change + w.1 (σ (ηM⁻¹ x)) = + w.1 (ηM (ηM⁻¹ x)) + at hx + have hvalue : + w.1 (δ x) = w.1 x := by + simpa [δ, η] using hx + rw [hvalue] + refine ⟨δ, hδ, ?_⟩ + change q δ = τ + rw [show δ = σ * η⁻¹ from rfl, + map_mul, map_inv, hqη, inv_one, + mul_one, hσ] + +end ValuationRestriction + +section DecompositionGroupChoice + +variable {F L : Type*} + [Field F] [Field L] [Algebra F L] + +open scoped Classical in +/-- Decomposition groups depend only on the valuation class. -/ +theorem absoluteValueDecompositionGroup_eq_of_absoluteValue_isEquiv + (w w' : AbsoluteValue L ℝ) + (hww' : w.IsEquiv w') : + absoluteValueDecompositionGroup F w = + absoluteValueDecompositionGroup F w' := by + have hlt : ∀ x : L, w x < 1 ↔ w' x < 1 := + AbsoluteValue.isEquiv_iff_lt_one_iff.mp hww' + ext σ + simp only [mem_absoluteValueDecompositionGroup_iff] + constructor + · intro hσ x + exact + (hlt (σ x)).symm.trans + ((hσ x).trans (hlt x)) + · intro hσ x + exact + (hlt (σ x)).trans + ((hσ x).trans (hlt x).symm) + +open scoped Classical in +/-- In an abelian Galois extension, conjugating an exact extension does +not change its decomposition subgroup. -/ +theorem absoluteValueDecompositionGroup_conjugate_eq_of_isMulCommutative + [IsMulCommutative (L ≃ₐ[F] L)] + (vF : AbsoluteValue F ℝ) + (w : AbsoluteValueExtension vF L) + (ρ : L ≃ₐ[F] L) : + absoluteValueDecompositionGroup F + (absoluteValueExtensionConjugate + vF w ρ).1 = + absoluteValueDecompositionGroup F w.1 := by + ext τ + change + (∀ x : L, + w.1 (ρ (τ x)) < 1 ↔ w.1 (ρ x) < 1) ↔ + ∀ x : L, w.1 (τ x) < 1 ↔ w.1 x < 1 + constructor + · intro hτ x + have hx := hτ (ρ⁻¹ x) + have hleft : + ρ (τ (ρ⁻¹ x)) = τ x := by + calc + ρ (τ (ρ⁻¹ x)) = + τ (ρ (ρ⁻¹ x)) := by + change + (ρ * τ) (ρ⁻¹ x) = + (τ * ρ) (ρ⁻¹ x) + rw [mul_comm] + _ = τ x := by simp + have hright : ρ (ρ⁻¹ x) = x := by simp + rwa [hleft, hright] at hx + · intro hτ x + have hx := hτ (ρ x) + have hcomm : + ρ (τ x) = τ (ρ x) := by + change (ρ * τ) x = (τ * ρ) x + rw [mul_comm] + rwa [hcomm] + +open scoped Classical in +/-- In an abelian Galois extension the decomposition subgroup is +independent of the exact extension above the base place. -/ +theorem absoluteValueDecompositionGroup_eq_of_exactExtensions_of_isMulCommutative + [IsGalois F L] + [IsMulCommutative (L ≃ₐ[F] L)] + (vF : AbsoluteValue F ℝ) + (hvF : vF.IsNontrivial) + (w w' : AbsoluteValueExtension vF L) : + absoluteValueDecompositionGroup F w.1 = + absoluteValueDecompositionGroup F w'.1 := by + obtain ⟨ρ, hρ⟩ := + absoluteValueConjugacy vF hvF w w' + rw [hρ, + absoluteValueDecompositionGroup_conjugate_eq_of_isMulCommutative + (F := F) vF w ρ] + +end DecompositionGroupChoice + +section ValuationRestriction + +variable {F E : Type} + [Field F] [Field E] [Algebra F E] + +open scoped Classical in +/-- Triviality of a decomposition group is preserved when the chosen +extension is conjugated. -/ +theorem absoluteValueDecompositionGroup_conjugate_eq_bot + (vF : AbsoluteValue F ℝ) + (w : AbsoluteValueExtension vF E) + (ρ : E ≃ₐ[F] E) + (hbot : + absoluteValueDecompositionGroup F w.1 = ⊥) : + absoluteValueDecompositionGroup F + (absoluteValueExtensionConjugate + vF w ρ).1 = ⊥ := by + apply le_bot_iff.mp + intro τ hτ + rw [Subgroup.mem_bot] + change + ∀ x : E, + w.1 (ρ (τ x)) < 1 ↔ + w.1 (ρ x) < 1 + at hτ + let δ : E ≃ₐ[F] E := + ρ * τ * ρ⁻¹ + have hδ : + δ ∈ absoluteValueDecompositionGroup F w.1 := by + change + ∀ x : E, + w.1 (δ x) < 1 ↔ + w.1 x < 1 + intro x + simpa [δ] using hτ (ρ⁻¹ x) + have hδOne : δ = 1 := + Subgroup.mem_bot.mp (hbot ▸ hδ) + have hconj := + congrArg (fun z : E ≃ₐ[F] E => + ρ⁻¹ * z * ρ) hδOne + simpa [δ, mul_assoc] using hconj + +open scoped Classical in +/-- For a Galois extension, triviality of the decomposition group is +independent of the chosen extension of the base absolute value. -/ +theorem absoluteValueDecompositionGroup_eq_bot_independent_extension + [IsGalois F E] + (vF : AbsoluteValue F ℝ) + (hvF : vF.IsNontrivial) + (w w' : AbsoluteValueExtension vF E) + (hbot : + absoluteValueDecompositionGroup F w.1 = ⊥) : + absoluteValueDecompositionGroup F w'.1 = ⊥ := by + obtain ⟨ρ, hρ⟩ := + absoluteValueConjugacy vF hvF w w' + rw [hρ] + exact + absoluteValueDecompositionGroup_conjugate_eq_bot + vF w ρ hbot + +end ValuationRestriction + +variable {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] + [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [IsCyclic (L ≃ₐ[K] L)] + +omit [NumberField K] [NumberField L] [IsGalois K L] in +open scoped Classical in +/-- A cyclic group of nonzero prime-power order has an actual normal +subgroup of index `p`. -/ +theorem exists_index_prime_normal_subgroup + {p exponent : ℕ} + (hp : p.Prime) + (hexponent : 0 < exponent) + (hcard : + Nat.card (L ≃ₐ[K] L) = + p ^ exponent) : + ∃ P : Subgroup (L ≃ₐ[K] L), + P.index = p ∧ + P.Normal ∧ + Nat.card ((L ≃ₐ[K] L) ⧸ P) = p := by + have hgroupCard : + 1 < Nat.card (L ≃ₐ[K] L) := by + rw [hcard] + exact + one_lt_pow₀ hp.one_lt hexponent.ne' + let : Nontrivial (L ≃ₐ[K] L) := + Finite.one_lt_card_iff_nontrivial.mp + hgroupCard + obtain + ⟨P, _hbot, hPindex, hPnormal, + hPquotient⟩ := + cyclic_exists_normal_index_prime_supergroup + hp hexponent hcard + (⊥ : Subgroup (L ≃ₐ[K] L)) + bot_ne_top + exact + ⟨P, hPindex, hPnormal, hPquotient⟩ + +open scoped Classical in +/-- The chosen index-`p` subgroup of the global cyclic Galois group. -/ +noncomputable def cyclicPrimeIndexSubgroup + {p exponent : ℕ} + (hp : p.Prime) + (hexponent : 0 < exponent) + (hcard : + Nat.card (L ≃ₐ[K] L) = + p ^ exponent) : + Subgroup (L ≃ₐ[K] L) := + (exists_index_prime_normal_subgroup + (K := K) (L := L) + hp hexponent hcard).choose + +omit [NumberField K] [NumberField L] [IsGalois K L] in +open scoped Classical in +theorem cyclicPrimeIndexSubgroup_index + {p exponent : ℕ} + (hp : p.Prime) + (hexponent : 0 < exponent) + (hcard : + Nat.card (L ≃ₐ[K] L) = + p ^ exponent) : + (cyclicPrimeIndexSubgroup + (K := K) (L := L) + hp hexponent hcard).index = p := + (exists_index_prime_normal_subgroup + (K := K) (L := L) + hp hexponent hcard).choose_spec.1 + +omit [NumberField K] [NumberField L] [IsGalois K L] in +open scoped Classical in +theorem cyclicPrimeIndexSubgroup_normal + {p exponent : ℕ} + (hp : p.Prime) + (hexponent : 0 < exponent) + (hcard : + Nat.card (L ≃ₐ[K] L) = + p ^ exponent) : + (cyclicPrimeIndexSubgroup + (K := K) (L := L) + hp hexponent hcard).Normal := + (exists_index_prime_normal_subgroup + (K := K) (L := L) + hp hexponent hcard).choose_spec.2.1 + +omit [NumberField K] [NumberField L] [IsGalois K L] in +open scoped Classical in +theorem cyclicPrimeIndexSubgroup_quotient_card + {p exponent : ℕ} + (hp : p.Prime) + (hexponent : 0 < exponent) + (hcard : + Nat.card (L ≃ₐ[K] L) = + p ^ exponent) : + Nat.card + ((L ≃ₐ[K] L) ⧸ + cyclicPrimeIndexSubgroup + (K := K) (L := L) + hp hexponent hcard) = + p := + (exists_index_prime_normal_subgroup + (K := K) (L := L) + hp hexponent hcard).choose_spec.2.2 + +open scoped Classical in +/-- The actual degree-`p` intermediate field in the cyclic prime-power reduction. -/ +noncomputable def cyclicPrimeSubextension + {p exponent : ℕ} + (hp : p.Prime) + (hexponent : 0 < exponent) + (hcard : + Nat.card (L ≃ₐ[K] L) = + p ^ exponent) : + IntermediateField K L := + IntermediateField.fixedField + (cyclicPrimeIndexSubgroup + (K := K) (L := L) + hp hexponent hcard) + +omit [NumberField K] [NumberField L] in +open scoped Classical in +/-- The constructed intermediate extension is Galois over `K`. -/ +noncomputable instance cyclicPrimeSubextension_isGalois + {p exponent : ℕ} + (hp : p.Prime) + (hexponent : 0 < exponent) + (hcard : + Nat.card (L ≃ₐ[K] L) = + p ^ exponent) : + IsGalois K + (cyclicPrimeSubextension + (K := K) (L := L) + hp hexponent hcard) := by + unfold cyclicPrimeSubextension + let P := + cyclicPrimeIndexSubgroup + (K := K) (L := L) + hp hexponent hcard + let : P.Normal := + cyclicPrimeIndexSubgroup_normal + (K := K) (L := L) + hp hexponent hcard + infer_instance + +omit [NumberField K] [NumberField L] in +open scoped Classical in +/-- The constructed intermediate extension has degree exactly `p`. -/ +theorem cyclicPrimeSubextension_finrank + {p exponent : ℕ} + (hp : p.Prime) + (hexponent : 0 < exponent) + (hcard : + Nat.card (L ≃ₐ[K] L) = + p ^ exponent) : + Module.finrank K + (cyclicPrimeSubextension + (K := K) (L := L) + hp hexponent hcard) = + p := by + let P := + cyclicPrimeIndexSubgroup + (K := K) (L := L) + hp hexponent hcard + let M := + cyclicPrimeSubextension + (K := K) (L := L) + hp hexponent hcard + let : P.Normal := + cyclicPrimeIndexSubgroup_normal + (K := K) (L := L) + hp hexponent hcard + let : IsGalois K M := + cyclicPrimeSubextension_isGalois + (K := K) (L := L) + hp hexponent hcard + calc + Module.finrank K M = + Nat.card (M ≃ₐ[K] M) := + (IsGalois.card_aut_eq_finrank K M).symm + _ = Nat.card ((L ≃ₐ[K] L) ⧸ P) := + Nat.card_congr + (IsGalois.normalAutEquivQuotient P).symm.toEquiv + _ = p := + cyclicPrimeIndexSubgroup_quotient_card + (K := K) (L := L) + hp hexponent hcard + +omit [NumberField K] [NumberField L] in +open scoped Classical in +/-- The Galois group of the constructed degree-`p` extension is +cyclic. -/ +theorem cyclicPrimeSubextension_isCyclic + {p exponent : ℕ} + (hp : p.Prime) + (hexponent : 0 < exponent) + (hcard : + Nat.card (L ≃ₐ[K] L) = + p ^ exponent) : + IsCyclic + (cyclicPrimeSubextension + (K := K) (L := L) + hp hexponent hcard ≃ₐ[K] + cyclicPrimeSubextension + (K := K) (L := L) + hp hexponent hcard) := by + let P := + cyclicPrimeIndexSubgroup + (K := K) (L := L) + hp hexponent hcard + let : P.Normal := + cyclicPrimeIndexSubgroup_normal + (K := K) (L := L) + hp hexponent hcard + have hquotient : + IsCyclic ((L ≃ₐ[K] L) ⧸ P) := + isCyclic_of_surjective + (QuotientGroup.mk' P) + (QuotientGroup.mk'_surjective P) + exact + (IsGalois.normalAutEquivQuotient P).isCyclic.mp + hquotient + +open scoped Classical in +/-- The decomposition subgroup in the constructed subextension, +obtained by restricting the decomposition subgroup in `L / K`. -/ +noncomputable def cyclicPrimeSubextensionDecompositionGroup + {p exponent : ℕ} + (hp : p.Prime) + (hexponent : 0 < exponent) + (hcard : + Nat.card (L ≃ₐ[K] L) = + p ^ exponent) + (v : HeightOneSpectrum (𝓞 K)) : + Subgroup + (cyclicPrimeSubextension + (K := K) (L := L) + hp hexponent hcard ≃ₐ[K] + cyclicPrimeSubextension + (K := K) (L := L) + hp hexponent hcard) := by + let M := + cyclicPrimeSubextension + (K := K) (L := L) + hp hexponent hcard + letI : IsGalois K M := + cyclicPrimeSubextension_isGalois + (K := K) (L := L) + hp hexponent hcard + exact + (finitePlaceDecompositionGroup + (K := K) (L := L) v).map + (AlgEquiv.restrictNormalHom M) + +omit [NumberField L] in +open scoped Classical in +/-- The restricted decomposition group agrees with the quotient +decomposition group transported by the fixed-field Galois +correspondence. -/ +theorem cyclicPrimeSubextensionDecompositionGroup_eq_quotient_image + {p exponent : ℕ} + (hp : p.Prime) + (hexponent : 0 < exponent) + (hcard : + Nat.card (L ≃ₐ[K] L) = + p ^ exponent) + (v : HeightOneSpectrum (𝓞 K)) : + cyclicPrimeSubextensionDecompositionGroup + (K := K) (L := L) + hp hexponent hcard v = + (finitePlaceDecompositionGroupInQuotient + (K := K) (L := L) v + (cyclicPrimeIndexSubgroup + (K := K) (L := L) + hp hexponent hcard)).map + (IsGalois.normalAutEquivQuotient + (cyclicPrimeIndexSubgroup + (K := K) (L := L) + hp hexponent hcard)).toMonoidHom := by + let P := + cyclicPrimeIndexSubgroup + (K := K) (L := L) + hp hexponent hcard + let M := + cyclicPrimeSubextension + (K := K) (L := L) + hp hexponent hcard + let : P.Normal := + cyclicPrimeIndexSubgroup_normal + (K := K) (L := L) + hp hexponent hcard + let : IsGalois K M := + cyclicPrimeSubextension_isGalois + (K := K) (L := L) + hp hexponent hcard + change + (finitePlaceDecompositionGroup + (K := K) (L := L) v).map + (AlgEquiv.restrictNormalHom M) = + ((finitePlaceDecompositionGroup + (K := K) (L := L) v).map + (QuotientGroup.mk' P)).map + (IsGalois.normalAutEquivQuotient P).toMonoidHom + rw [Subgroup.map_map] + congr 1 + +omit [NumberField L] in +open scoped Classical in +/-- Complete splitting in `L` implies complete splitting in the +constructed prime-degree subextension. -/ +theorem finitePlaceSplitsCompletely_in_cyclicPrimeSubextension + {p exponent : ℕ} + (hp : p.Prime) + (hexponent : 0 < exponent) + (hcard : + Nat.card (L ≃ₐ[K] L) = + p ^ exponent) + (v : HeightOneSpectrum (𝓞 K)) + (hsplit : + FinitePlaceSplitsCompletely + (K := K) (L := L) v) : + cyclicPrimeSubextensionDecompositionGroup + (K := K) (L := L) + hp hexponent hcard v = ⊥ := by + unfold + cyclicPrimeSubextensionDecompositionGroup + rw [show + finitePlaceDecompositionGroup + (K := K) (L := L) v = ⊥ + from hsplit] + exact Subgroup.map_bot _ + +omit [NumberField L] in +open scoped Classical in +/-- Complete splitting in `L` implies complete splitting, in the +standard chosen-extension sense, in the actual fixed intermediate +field. -/ +theorem finitePlaceSplitsCompletely_in_cyclicPrimeSubextension_actual + {p exponent : ℕ} + (hp : p.Prime) + (hexponent : 0 < exponent) + (hcard : + Nat.card (L ≃ₐ[K] L) = + p ^ exponent) + (v : HeightOneSpectrum (𝓞 K)) + (hsplit : + FinitePlaceSplitsCompletely + (K := K) (L := L) v) : + FinitePlaceSplitsCompletely + (K := K) + (L := cyclicPrimeSubextension + (K := K) (L := L) + hp hexponent hcard) v := by + let M := + cyclicPrimeSubextension + (K := K) (L := L) + hp hexponent hcard + let : IsGalois K M := + cyclicPrimeSubextension_isGalois + (K := K) (L := L) + hp hexponent hcard + let vK := + NumberField.HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let w := + chosenFinitePlaceExtension (L := L) v + let wM := + restrictAbsoluteValueExtensionToIntermediate + vK w M + have hwBot : + absoluteValueDecompositionGroup K w.1 = ⊥ := + hsplit + have hwMbot : + absoluteValueDecompositionGroup K wM.1 = ⊥ := by + change + absoluteValueDecompositionGroup K + (w.1.comp (f := algebraMap M L) + (algebraMap M L).injective) = ⊥ + rw [← absoluteValueDecompositionGroup_map_restrictNormalHom + (M := M) vK hvK w] + rw [hwBot] + exact Subgroup.map_bot _ + change + absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension + (L := M) v).1 = ⊥ + exact + absoluteValueDecompositionGroup_eq_bot_independent_extension + vK hvK wM + (chosenFinitePlaceExtension (L := M) v) + hwMbot + +omit [NumberField L] in +open scoped Classical in +/-- Contrapositive in the standard chosen-extension sense: a place +nonsplit in the constructed degree-`p` field is nonsplit in `L`. -/ +theorem finitePlace_not_splitsCompletely_of_not_in_cyclicPrimeSubextension_actual + {p exponent : ℕ} + (hp : p.Prime) + (hexponent : 0 < exponent) + (hcard : + Nat.card (L ≃ₐ[K] L) = + p ^ exponent) + (v : HeightOneSpectrum (𝓞 K)) + (hnonsplit : + ¬ FinitePlaceSplitsCompletely + (K := K) + (L := cyclicPrimeSubextension + (K := K) (L := L) + hp hexponent hcard) v) : + ¬ FinitePlaceSplitsCompletely + (K := K) (L := L) v := by + intro hsplit + exact + hnonsplit + (finitePlaceSplitsCompletely_in_cyclicPrimeSubextension_actual + (K := K) (L := L) + hp hexponent hcard v hsplit) + +omit [NumberField L] in +open scoped Classical in +/-- Contrapositive form: a finite place nonsplit in the prime-degree +subextension is already nonsplit in `L`. -/ +theorem finitePlace_not_splitsCompletely_of_not_in_cyclicPrimeSubextension + {p exponent : ℕ} + (hp : p.Prime) + (hexponent : 0 < exponent) + (hcard : + Nat.card (L ≃ₐ[K] L) = + p ^ exponent) + (v : HeightOneSpectrum (𝓞 K)) + (hnonsplit : + cyclicPrimeSubextensionDecompositionGroup + (K := K) (L := L) + hp hexponent hcard v ≠ ⊥) : + ¬ FinitePlaceSplitsCompletely + (K := K) (L := L) v := by + intro hsplit + exact + hnonsplit + (finitePlaceSplitsCompletely_in_cyclicPrimeSubextension + (K := K) (L := L) + hp hexponent hcard v hsplit) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/FixedFieldLattice.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/FixedFieldLattice.lean new file mode 100644 index 0000000000..6a5a8e7d41 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/FixedFieldLattice.lean @@ -0,0 +1,49 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +/-! +# Fixed fields and subgroup lattice operations + +Small order-theoretic facts about fixed fields of automorphism subgroups. +They do not depend on class field theory and belong with the general Galois +infrastructure rather than a concrete reciprocity construction. +-/ + +@[expose] public section + +namespace IntermediateField + +/-- Fixed fields turn a supremum of automorphism subgroups into the +intersection of their fixed fields. -/ +theorem fixedField_sup_eq_inf + {k Ω : Type*} [Field k] [Field Ω] [Algebra k Ω] + (S T : Subgroup (Gal(Ω/k))) : + IntermediateField.fixedField (S ⊔ T) = + IntermediateField.fixedField S ⊓ IntermediateField.fixedField T := by + apply le_antisymm + · exact le_inf + (IntermediateField.fixedField_le le_sup_left) + (IntermediateField.fixedField_le le_sup_right) + · intro x hx + rw [IntermediateField.mem_fixedField_iff] + intro σ hσ + let stabilizer : Subgroup (Gal(Ω/k)) := + MulAction.stabilizer (Gal(Ω/k)) x + have hS : S ≤ stabilizer := by + intro τ hτ + change τ x = x + exact (IntermediateField.mem_fixedField_iff S x).1 hx.1 τ hτ + have hT : T ≤ stabilizer := by + intro τ hτ + change τ x = x + exact (IntermediateField.mem_fixedField_iff T x).1 hx.2 τ hτ + have hfix : σ ∈ stabilizer := (sup_le hS hT) hσ + exact hfix + +end IntermediateField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/InfiniteBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/InfiniteBaseChange.lean new file mode 100644 index 0000000000..d30ae664ed --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/InfiniteBaseChange.lean @@ -0,0 +1,135 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.GaloisClosure +public import Mathlib.FieldTheory.Normal.Basic +public import Mathlib.FieldTheory.SeparableClosure +/-! +# Infinite Galois base change from finite layers + +This module supplies the field-theoretic passage from finite Galois layers to +their union after a change of base field. It is stated entirely in terms of +mathlib's actual intermediate fields and uses no abstract replacement for the +compositum. +-/ + +@[expose] public section + +noncomputable +section + +namespace IntermediateField + +variable {R U : Type*} [Field R] [Field U] [Algebra R U] + +/-- A Galois intermediate field is the union of the lifts of its finite +Galois intermediate subfields. -/ +theorem le_iSup_lift_finiteGalois + (B : IntermediateField R U) [IsGalois R B] : + B ≤ ⨆ E : FiniteGaloisIntermediateField R B, + IntermediateField.lift E.toIntermediateField := by + intro x hx + let xB : B := ⟨x, hx⟩ + let E : FiniteGaloisIntermediateField R B := + FiniteGaloisIntermediateField.adjoin R {xB} + have hxE : xB ∈ E.toIntermediateField := + FiniteGaloisIntermediateField.subset_adjoin R {xB} + (Set.mem_singleton xB) + exact + (le_iSup + (fun E : FiniteGaloisIntermediateField R B => + IntermediateField.lift E.toIntermediateField) + E) + ((IntermediateField.mem_lift xB).2 hxE) + +/-- A compositum with a Galois intermediate field is the supremum of the +composita with its finite Galois intermediate layers. -/ +theorem sup_eq_iSup_finiteGaloisComposita + (A B : IntermediateField R U) [IsGalois R B] : + A ⊔ B = ⨆ E : FiniteGaloisIntermediateField R B, + A ⊔ IntermediateField.lift E.toIntermediateField := by + apply le_antisymm + · refine sup_le ?_ ?_ + · let E0 : FiniteGaloisIntermediateField R B := ⊥ + exact + le_trans le_sup_left + (le_iSup + (fun E : FiniteGaloisIntermediateField R B => + A ⊔ IntermediateField.lift E.toIntermediateField) + E0) + · exact + (le_iSup_lift_finiteGalois B).trans + (iSup_mono fun E => + (show IntermediateField.lift E.toIntermediateField ≤ + A ⊔ IntermediateField.lift E.toIntermediateField from + le_sup_right)) + · refine iSup_le fun E => ?_ + exact + sup_le le_sup_left + ((IntermediateField.lift_le E.toIntermediateField).trans le_sup_right) + +/-- Base change commutes with the supremum of finite Galois composita. -/ +theorem extendScalars_sup_eq_iSup_finiteGaloisComposita + (A B : IntermediateField R U) [IsGalois R B] : + IntermediateField.extendScalars (F := A) (E := A ⊔ B) le_sup_left = + ⨆ E : FiniteGaloisIntermediateField R B, + IntermediateField.extendScalars (F := A) + (E := A ⊔ IntermediateField.lift E.toIntermediateField) + le_sup_left := by + apply le_antisymm + · apply (IntermediateField.extendScalars_le_iff le_sup_left _).2 + rw [sup_eq_iSup_finiteGaloisComposita] + refine iSup_le fun E => ?_ + exact + (IntermediateField.extendScalars_le_iff le_sup_left _).1 + (le_iSup + (fun E : FiniteGaloisIntermediateField R B => + IntermediateField.extendScalars (F := A) + (E := A ⊔ IntermediateField.lift E.toIntermediateField) + le_sup_left) + E) + · refine iSup_le fun E => ?_ + apply (IntermediateField.extendScalars_le_iff le_sup_left _).2 + rw [IntermediateField.extendScalars_restrictScalars] + exact + sup_le le_sup_left + ((IntermediateField.lift_le E.toIntermediateField).trans le_sup_right) + +/-- If every finite Galois layer of a compositum remains Galois after base +change, then so does the full compositum. -/ +theorem isGalois_extendScalars_sup_of_forall_finiteGalois + (A B : IntermediateField R U) [IsGalois R B] + (hG : ∀ E : FiniteGaloisIntermediateField R B, + IsGalois A + (IntermediateField.extendScalars (F := A) + (E := A ⊔ IntermediateField.lift E.toIntermediateField) + le_sup_left)) : + IsGalois A + (IntermediateField.extendScalars (F := A) (E := A ⊔ B) le_sup_left) := by + let C : IntermediateField A U := + IntermediateField.extendScalars (F := A) (E := A ⊔ B) le_sup_left + let finiteLayer : + FiniteGaloisIntermediateField R B → IntermediateField A U := + fun E => + IntermediateField.extendScalars (F := A) + (E := A ⊔ IntermediateField.lift E.toIntermediateField) + le_sup_left + let : ∀ E : FiniteGaloisIntermediateField R B, + IsGalois A (finiteLayer E) := + fun E => by + simpa only [finiteLayer] using hG E + have hC : C = ⨆ E : FiniteGaloisIntermediateField R B, finiteLayer E := by + simpa only [C, finiteLayer] using + extendScalars_sup_eq_iSup_finiteGaloisComposita A B + change IsGalois A C + rw [hC] + exact { + to_isSeparable := IntermediateField.isSeparable_iSup A U + to_normal := IntermediateField.normal_iSup A U finiteLayer } + +end IntermediateField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteAbelianization.lean new file mode 100644 index 0000000000..d34a82a7f0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteAbelianization.lean @@ -0,0 +1,46 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.TopologicalAbelianizationCongr +public import Mathlib.FieldTheory.AbsoluteGaloisGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.InfiniteGaloisCorrespondence +/-! +# Comparison with Mathlib's absolute Galois abelianization + +Restriction from the algebraic closure to the separable closure identifies +Mathlib's absolute Galois group with the separable-closure model. The induced +map on topological abelianizations is a homeomorphism of groups, not merely +an abstract group isomorphism. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +/-- Mathlib's absolute Galois abelianization and the separable-closure +topological abelianization are canonically isomorphic as topological groups. -/ +noncomputable def absoluteGaloisGroupAbelianizationEquivSeparable + (K : Type u) [Field K] : + Field.absoluteGaloisGroupAbelianization K ≃ₜ* + TopologicalAbelianization Gal(SeparableClosure K/K) := + LocalClassFieldTheory.topologicalAbelianizationCongr + (RamificationTheory.Field.absoluteGaloisGroup.separableClosureContinuousMulEquiv K) + +/-- The comparison sends an absolute Galois automorphism to its restriction +to the separable closure, also after passing to the abelianization. -/ +@[simp] +theorem absoluteGaloisGroupAbelianizationEquivSeparable_mk + (K : Type u) [Field K] (σ : Field.absoluteGaloisGroup K) : + absoluteGaloisGroupAbelianizationEquivSeparable K + (QuotientGroup.mk σ) = + QuotientGroup.mk (AlgEquiv.separableClosure σ) := + LocalClassFieldTheory.topologicalAbelianizationCongr_mk + (RamificationTheory.Field.absoluteGaloisGroup.separableClosureContinuousMulEquiv K) σ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteGaloisBaseEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteGaloisBaseEquiv.lean new file mode 100644 index 0000000000..2dfa41c11c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteGaloisBaseEquiv.lean @@ -0,0 +1,102 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.TopologicalAbelianizationCongr +public import Mathlib.FieldTheory.AbsoluteGaloisGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.InfiniteGaloisCorrespondence +/-! +# Absolute Galois groups under an equivalence of base fields + +A field equivalence extends to an equivalence of the chosen algebraic closures. +Conjugation then identifies the absolute Galois groups, including their Krull +topologies, and hence their topological abelianizations. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u v w z + +variable {K : Type u} {M : Type v} {Ω : Type w} {Ψ : Type z} + [Field K] [Field M] [Field Ω] [Field Ψ] + [Algebra K Ω] [Algebra M Ψ] + +private theorem semilinear_symm_algebraMap (e : K ≃+* M) (E : Ω ≃+* Ψ) + (hE : ∀ x : K, E (algebraMap K Ω x) = algebraMap M Ψ (e x)) + (y : M) : + E.symm (algebraMap M Ψ y) = algebraMap K Ω (e.symm y) := by + apply E.injective + rw [E.apply_symm_apply, hE, e.apply_symm_apply] + +/-- Transport a Galois automorphism through compatible semilinear field identifications. -/ +def semilinearGaloisConjugate (e : K ≃+* M) (E : Ω ≃+* Ψ) + (hE : ∀ x : K, E (algebraMap K Ω x) = algebraMap M Ψ (e x)) + (σ : Gal(Ω/K)) : Gal(Ψ/M) where + toRingEquiv := (E.symm.trans σ.toRingEquiv).trans E + commutes' := by + intro y + change E (σ (E.symm (algebraMap M Ψ y))) = algebraMap M Ψ y + rw [semilinear_symm_algebraMap e E hE y, σ.commutes, hE, + e.apply_symm_apply] + +/-- Semilinear field identifications induce an equivalence of Galois groups. -/ +def semilinearGaloisEquiv (e : K ≃+* M) (E : Ω ≃+* Ψ) + (hE : ∀ x : K, E (algebraMap K Ω x) = algebraMap M Ψ (e x)) : + Gal(Ω/K) ≃* Gal(Ψ/M) where + toFun := semilinearGaloisConjugate e E hE + invFun := semilinearGaloisConjugate e.symm E.symm + (by exact semilinear_symm_algebraMap e E hE) + left_inv σ := by + apply AlgEquiv.ext + intro x + simp [semilinearGaloisConjugate] + right_inv σ := by + apply AlgEquiv.ext + intro x + simp [semilinearGaloisConjugate] + map_mul' σ τ := by + apply AlgEquiv.ext + intro x + simp [semilinearGaloisConjugate, AlgEquiv.mul_apply] + +/-- The semilinear Galois equivalence preserves the Krull topologies. -/ +def semilinearGaloisContinuousEquiv (e : K ≃+* M) (E : Ω ≃+* Ψ) + (hE : ∀ x : K, E (algebraMap K Ω x) = algebraMap M Ψ (e x)) : + Gal(Ω/K) ≃ₜ* Gal(Ψ/M) where + toMulEquiv := semilinearGaloisEquiv e E hE + continuous_toFun := by + exact RamificationTheory.Field.absoluteGaloisGroup.semilinear_conjugation_continuous + e E hE (semilinearGaloisEquiv e E hE).toMonoidHom (by intro σ; rfl) + continuous_invFun := by + exact RamificationTheory.Field.absoluteGaloisGroup.semilinear_conjugation_continuous + e.symm E.symm (semilinear_symm_algebraMap e E hE) + (semilinearGaloisEquiv e.symm E.symm + (semilinear_symm_algebraMap e E hE)).toMonoidHom (by intro σ; rfl) + +/-- A field equivalence identifies the Krull topological absolute Galois groups +of its source and target fields. -/ +noncomputable def absoluteGaloisGroupEquivOfRingEquiv (e : K ≃+* M) : + Field.absoluteGaloisGroup K ≃ₜ* Field.absoluteGaloisGroup M := + semilinearGaloisContinuousEquiv e + (IsAlgClosure.equivOfEquiv (AlgebraicClosure K) (AlgebraicClosure M) e) + (IsAlgClosure.equivOfEquiv_algebraMap + (AlgebraicClosure K) (AlgebraicClosure M) e) + +/-- The induced equivalence of Mathlib's topological abelianizations. -/ +noncomputable def absoluteGaloisGroupAbelianizationEquivOfRingEquiv + (e : K ≃+* M) : + Field.absoluteGaloisGroupAbelianization K ≃ₜ* + Field.absoluteGaloisGroupAbelianization M := + LocalClassFieldTheory.topologicalAbelianizationCongr + (absoluteGaloisGroupEquivOfRingEquiv e) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MaximalAbelianSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MaximalAbelianSubextension.lean new file mode 100644 index 0000000000..a70bfe9dcc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MaximalAbelianSubextension.lean @@ -0,0 +1,138 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Quotient +public import Mathlib.FieldTheory.Galois.Abelian +/-! +# Maximal abelian subextensions inside finite normal closures + +For a finite extension `L / K`, its chosen finite normal closure contains a +distinguished copy of `L`. The subgroup fixing that copy, together with the +commutator subgroup of the full Galois group, cuts out the largest abelian +Galois intermediate field contained in the distinguished copy. +-/ + +@[expose] public section + +noncomputable +section + +open scoped IsMulCommutative + +universe u v + +variable + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + +/-- The subgroup of the finite-normal-closure Galois group fixing the +distinguished copy of the original extension. -/ +noncomputable def finiteNormalClosureOriginalFixingSubgroup : + Subgroup Gal(finiteNormalClosure K L/K) := + (finiteNormalClosureOriginalField K L).fixingSubgroup + +/-- The relative Galois group over the distinguished original field is the +corresponding fixing subgroup of the full normal-closure Galois group. -/ +noncomputable def finiteNormalClosureOriginalFixingSubgroupEquiv : + Gal(finiteNormalClosure K L/finiteNormalClosureOriginalField K L) ≃* + finiteNormalClosureOriginalFixingSubgroup K L := by + change + Gal(finiteNormalClosure K L/finiteNormalClosureOriginalField K L) ≃* + (finiteNormalClosureOriginalField K L).fixingSubgroup + exact + (IntermediateField.fixingSubgroupEquiv + (finiteNormalClosureOriginalField K L)).symm + +/-- The largest abelian Galois intermediate field of the finite normal +closure that is contained in the distinguished copy of the original field. -/ +noncomputable def finiteNormalClosureMaximalAbelianSubfield : + IntermediateField K (finiteNormalClosure K L) := + IntermediateField.fixedField + (finiteNormalClosureOriginalFixingSubgroup K L ⊔ + _root_.commutator Gal(finiteNormalClosure K L/K)) + +/-- The maximal abelian subfield is contained in the distinguished copy of +the original extension. -/ +theorem finiteNormalClosureMaximalAbelianSubfield_le_originalField : + finiteNormalClosureMaximalAbelianSubfield K L ≤ + finiteNormalClosureOriginalField K L := by + let N := finiteNormalClosure K L + let E : IntermediateField K N := + finiteNormalClosureOriginalField K L + let G := Gal(N/K) + let H : Subgroup G := + finiteNormalClosureOriginalFixingSubgroup K L + change + IntermediateField.fixedField + (H ⊔ _root_.commutator G) ≤ E + calc + IntermediateField.fixedField + (H ⊔ _root_.commutator G) ≤ + IntermediateField.fixedField H := + IntermediateField.fixedField_le le_sup_left + _ = E := by + change IntermediateField.fixedField E.fixingSubgroup = E + exact IsGalois.fixedField_fixingSubgroup E + +/-- The maximal abelian subfield is abelian Galois over the base field. -/ +noncomputable instance + finiteNormalClosureMaximalAbelianSubfield_isAbelianGalois : + IsAbelianGalois K + (finiteNormalClosureMaximalAbelianSubfield K L) := by + let N := finiteNormalClosure K L + let G := Gal(N/K) + let H : Subgroup G := + finiteNormalClosureOriginalFixingSubgroup K L + let S : Subgroup G := H ⊔ _root_.commutator G + let M : IntermediateField K N := + IntermediateField.fixedField S + change IsAbelianGalois K M + let : S.Normal := inferInstance + let hM : IsGalois K M := + IsGalois.of_fixedField_normal_subgroup S + let e : + Gal(M/K) ≃* + Abelianization G ⧸ + H.map (Abelianization.of : G →* Abelianization G) := + (IsGalois.normalAutEquivQuotient S).symm.trans + H.quotientSupCommutatorEquivMapAbelianization + have hcomm : IsMulCommutative Gal(M/K) := + ⟨⟨fun sigma tau => by + apply e.injective + rw [map_mul, map_mul, mul_comm]⟩⟩ + exact + { toIsGalois := hM + toIsMulCommutative := hcomm } + +/-- Every abelian Galois intermediate field contained in the distinguished +original field is contained in the maximal abelian subfield. -/ +theorem finiteNormalClosureMaximalAbelianSubfield_greatest + (F : IntermediateField K (finiteNormalClosure K L)) + [IsAbelianGalois K F] + (hF : F ≤ finiteNormalClosureOriginalField K L) : + F ≤ finiteNormalClosureMaximalAbelianSubfield K L := by + let N := finiteNormalClosure K L + let E : IntermediateField K N := + finiteNormalClosureOriginalField K L + let G := Gal(N/K) + let H : Subgroup G := + finiteNormalClosureOriginalFixingSubgroup K L + change + F ≤ IntermediateField.fixedField + (H ⊔ _root_.commutator G) + apply + (IntermediateField.le_iff_le + (H ⊔ _root_.commutator G) F).2 + apply sup_le + · change E.fixingSubgroup ≤ F.fixingSubgroup + exact IntermediateField.fixingSubgroup_le hF + · rw [← F.restrictNormalHom_ker] + exact Abelianization.commutator_subset_ker + (AlgEquiv.restrictNormalHom (F := K) (K₁ := N) F) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/NormalFieldRange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/NormalFieldRange.lean new file mode 100644 index 0000000000..3313de514e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/NormalFieldRange.lean @@ -0,0 +1,45 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Normal.Basic +/-! +# Ranges of embeddings of normal extensions + +This file records the intrinsic image of a normal field extension inside an +ambient field: every embedding over the base has the same intermediate-field +range. +-/ + +@[expose] public section + +namespace AlgHom + +/-- Two embeddings of a normal extension into a common ambient field have the +same intermediate-field range. -/ +theorem fieldRange_eq_of_normal + {F L Ω : Type*} [Field F] [Field L] [Field Ω] + [Algebra F L] [Algebra F Ω] [Normal F L] + (f g : L →ₐ[F] Ω) : + f.fieldRange = g.fieldRange := by + have fieldRange_le_of_normal + (u v : L →ₐ[F] Ω) : u.fieldRange ≤ v.fieldRange := by + let : Normal F v.fieldRange := + (AlgEquiv.transfer_normal v.equivFieldRange).mp + (inferInstance : Normal F L) + have hrange : + (u.comp v.equivFieldRange.symm.toAlgHom).fieldRange = + v.fieldRange := + AlgHom.fieldRange_of_normal _ + intro x hx + rw [← hrange] + rcases AlgHom.mem_fieldRange.mp hx with ⟨y, rfl⟩ + exact AlgHom.mem_fieldRange.mpr ⟨v.equivFieldRange y, by simp⟩ + exact le_antisymm + (fieldRange_le_of_normal f g) (fieldRange_le_of_normal g f) + +end AlgHom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/RelativeAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/RelativeAbelianization.lean new file mode 100644 index 0000000000..a8f407d790 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/RelativeAbelianization.lean @@ -0,0 +1,97 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.AbsoluteAbelianization +/-! +# Relative topological abelianization + +For a possibly infinite Galois extension `M/F`, this file identifies the +topological abelianization of `Gal(M/F)` with the Galois group of the +intermediate field fixed by the closed commutator subgroup. +-/ + +@[expose] public section + +open scoped IsMulCommutative + +noncomputable +section + +universe u v + +namespace ClassFieldTower.Martinet + +variable (F : Type u) (M : Type v) +variable [Field F] [Field M] [Algebra F M] [IsGalois F M] + +/-- Closed commutator subgroup of a relative, possibly infinite, Galois +group. -/ +def relativeCommutatorClosure : ClosedSubgroup Gal(M/F) where + toSubgroup := (commutator Gal(M/F)).topologicalClosure + isClosed' := Subgroup.isClosed_topologicalClosure _ + +local instance relativeCommutatorClosure_normal : + (relativeCommutatorClosure F M).Normal := by + change ((commutator Gal(M/F)).topologicalClosure).Normal + infer_instance + +/-- Maximal abelian intermediate field of a relative Galois extension. -/ +def relativeMaximalAbelianSubextension : IntermediateField F M := + IntermediateField.fixedField (relativeCommutatorClosure F M).toSubgroup + +/-- The relative maximal abelian subextension is Galois. -/ +theorem relativeMaximalAbelianSubextension_isGalois : + IsGalois F (relativeMaximalAbelianSubextension F M) := by + apply (InfiniteGalois.normal_iff_isGalois + (relativeMaximalAbelianSubextension F M)).1 + change (IntermediateField.fixedField + (relativeCommutatorClosure F M).toSubgroup).fixingSubgroup.Normal + rw [InfiniteGalois.fixingSubgroup_fixedField + (relativeCommutatorClosure F M)] + infer_instance + +local instance relativeMaximalAbelianSubextension.instIsGalois : + IsGalois F (relativeMaximalAbelianSubextension F M) := + relativeMaximalAbelianSubextension_isGalois F M + +/-- Algebraic quotient equivalence for relative abelianization. -/ +noncomputable def relativeAbelianizationMulEquiv : + TopologicalAbelianization Gal(M/F) ≃* + Gal(relativeMaximalAbelianSubextension F M/F) := + InfiniteGalois.normalAutEquivQuotient (relativeCommutatorClosure F M) + +/-- The quotient equivalence sends a class to restriction. -/ +@[simp] +theorem relativeAbelianizationMulEquiv_mk (sigma : Gal(M/F)) : + relativeAbelianizationMulEquiv F M (QuotientGroup.mk sigma) = + AlgEquiv.restrictNormalHom (relativeMaximalAbelianSubextension F M) sigma := + rfl + +/-- The algebraic relative-abelianization equivalence is continuous. -/ +theorem relativeAbelianizationMulEquiv_continuous : + Continuous (relativeAbelianizationMulEquiv F M) := by + apply (QuotientGroup.isQuotientMap_mk + (relativeCommutatorClosure F M).toSubgroup).continuous_iff.2 + refine (InfiniteGalois.restrictNormalHom_continuous + (relativeMaximalAbelianSubextension F M)).congr ?_ + intro sigma + exact (relativeAbelianizationMulEquiv_mk F M sigma).symm + +/-- The topological abelianization is the Galois group of the maximal +relative abelian subfield. -/ +noncomputable def relativeTopologicalAbelianizationEquiv : + TopologicalAbelianization Gal(M/F) ≃ₜ* + Gal(relativeMaximalAbelianSubextension F M/F) := by + let h := Continuous.homeoOfEquivCompactToT2 + (relativeAbelianizationMulEquiv_continuous F M) + exact + { toMulEquiv := relativeAbelianizationMulEquiv F M + continuous_toFun := h.continuous + continuous_invFun := h.symm.continuous } + +end ClassFieldTower.Martinet diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/UnboundedDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/UnboundedDegree.lean new file mode 100644 index 0000000000..d5f5ad74c4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/UnboundedDegree.lean @@ -0,0 +1,80 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.GaloisClosure +public import Mathlib.FieldTheory.IntermediateField.Basic +public import Mathlib.FieldTheory.IntermediateField.Adjoin.Basic +public import Mathlib.Algebra.Algebra.Equiv +public import Mathlib.LinearAlgebra.Dimension.Free +public import Mathlib.LinearAlgebra.Dimension.Finite +public import Mathlib.LinearAlgebra.LinearIndependent.Defs +/-! +# Unbounded finite Galois degrees inside an infinite Galois extension + +A finite-dimensional extension has only finitely many automorphisms. An +infinite Galois group therefore supplies arbitrarily large linearly +independent finite families. Their finite Galois closures give the required +actual intermediate fields. +-/ + +@[expose] public section + +namespace AlgebraicNumberTheory + +universe u v + +/-- An extension with infinitely many base-field automorphisms contains +finite Galois intermediate fields of arbitrarily large degree. -/ +theorem exists_finiteGaloisIntermediateField_finrank_ge_of_infinite_aut + (K : Type u) (L : Type v) [Field K] [Field L] [Algebra K L] + [IsGalois K L] [Infinite (L ≃ₐ[K] L)] (N : ℕ) : + ∃ M : FiniteGaloisIntermediateField K L, N ≤ Module.finrank K M := by + classical + have hRank : Cardinal.aleph0 ≤ Module.rank K L := by + apply le_of_not_gt + intro h + let : Module.Finite K L := Module.rank_lt_aleph0_iff.mp h + exact not_finite (L ≃ₐ[K] L) + have hN : (N : Cardinal) ≤ Module.rank K L := + Cardinal.natCast_lt_aleph0.le.trans hRank + obtain ⟨f, hf⟩ := exists_linearIndependent_of_le_rank (R := K) (M := L) hN + let M : FiniteGaloisIntermediateField K L := + FiniteGaloisIntermediateField.adjoin K (Set.range f) + have hmem : ∀ i, f i ∈ M.toIntermediateField := by + intro i + exact FiniteGaloisIntermediateField.subset_adjoin K (Set.range f) ⟨i, rfl⟩ + let g : Fin N → M := fun i ↦ ⟨f i, hmem i⟩ + have hg : LinearIndependent K g := + LinearIndependent.of_comp M.toIntermediateField.val.toLinearMap hf + exact ⟨M, by simpa using hg.fintype_card_le_finrank⟩ + +/-- An infinite Galois intermediate extension contains ambient finite +Galois intermediate fields of arbitrarily large degree. The actual lift +keeps the field inclusion available to arithmetic consumers. -/ +theorem exists_finiteGaloisIntermediateField_le_finrank_ge_of_infinite_aut + (K : Type u) (Ω : Type v) [Field K] [Field Ω] [Algebra K Ω] + (L : IntermediateField K Ω) [IsGalois K L] [Infinite (L ≃ₐ[K] L)] + (N : ℕ) : + ∃ E : FiniteGaloisIntermediateField K Ω, + E.toIntermediateField ≤ L ∧ N ≤ Module.finrank K E := by + obtain ⟨M, hM⟩ := + exists_finiteGaloisIntermediateField_finrank_ge_of_infinite_aut K L N + let e : M.toIntermediateField ≃ₐ[K] + IntermediateField.lift M.toIntermediateField := + IntermediateField.liftAlgEquiv M.toIntermediateField + let : IsGalois K M.toIntermediateField := M.isGalois + let E : FiniteGaloisIntermediateField K Ω := + { toIntermediateField := IntermediateField.lift M.toIntermediateField + finiteDimensional := e.toLinearEquiv.finiteDimensional + isGalois := IsGalois.of_algEquiv e } + refine ⟨E, IntermediateField.lift_le M.toIntermediateField, ?_⟩ + change N ≤ Module.finrank K (IntermediateField.lift M.toIntermediateField) + rw [← e.toLinearEquiv.finrank_eq] + exact hM + +end AlgebraicNumberTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele.lean new file mode 100644 index 0000000000..5d29958eab --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele.lean @@ -0,0 +1,38 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.BaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FiniteMathlibTopologyComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdentityComponent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormOneCompact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PositiveArchimedeanSection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.RestrictedProductUnitsTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SufficientlyLarge +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/All.lean new file mode 100644 index 0000000000..9e303b14ea --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/All.lean @@ -0,0 +1,41 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.BaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FiniteMathlibTopologyComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdentityComponent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormOneCompact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PositiveArchimedeanSection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.RestrictedProductUnitsTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SufficientlyLarge +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology +/-! +# Ideles and idele classes + +Public aggregate for the idele group and the idele class group of a number +field. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/BaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/BaseChange.lean new file mode 100644 index 0000000000..3ba4c2997f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/BaseChange.lean @@ -0,0 +1,597 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FiniteRestrictedProductBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.InfinitePlaceTensorBlock +/-! +# Scalar extension from relative to ordinary ideles + +The finite restricted-product comparison is combined here with the +archimedean form of the canonical local tensor decomposition. Infinite places above a fixed +infinite place of the base field are identified with exact extensions of +its absolute value. Surjectivity is reduced through the finite normal +closure to the Galois valuation-extension comparison. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct RestrictedProduct +open NumberField IsDedekindDomain + +noncomputable +section + + +open AlgebraicNumberTheory.Valuations + +universe u v + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +/-- Restriction of an infinite place of `L` to the base field. -/ +def infinitePlaceBelow + (W : InfinitePlace L) : InfinitePlace K := + W.comap (algebraMap K L) + +omit [NumberField K] in +/-- Restricting an infinite place along the identity extension fixes it. -/ +@[simp] +theorem infinitePlaceBelow_self + (W : InfinitePlace K) : + infinitePlaceBelow (K := K) W = W := by + rw [infinitePlaceBelow, + Algebra.algebraMap_self, InfinitePlace.comap_id] + +section InfinitePlaceTower + +variable {M : Type*} + [Field M] [NumberField M] + [Algebra K M] [Algebra M L] + [IsScalarTower K M L] + +omit [NumberField K] [NumberField L] [NumberField M] + [FiniteDimensional K L] in +/-- Restriction of infinite places is transitive in a tower of number +fields. -/ +@[simp] +theorem infinitePlaceBelow_infinitePlaceBelow + (W : InfinitePlace L) : + infinitePlaceBelow (K := K) + (infinitePlaceBelow (K := M) W) = + infinitePlaceBelow (K := K) W := by + rw [infinitePlaceBelow, infinitePlaceBelow, infinitePlaceBelow, + ← InfinitePlace.comap_comp, + IsScalarTower.algebraMap_eq K M L] + +end InfinitePlaceTower + +omit [NumberField K] in +/-- The map on infinite-place completions induced by the identity field +extension is the identity map. -/ +@[simp] +theorem infinitePlaceCompletionMap_self_apply + (W : InfinitePlace K) + (x : W.Completion) : + letI : W.1.LiesOver W.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) + (infinitePlaceBelow_self (K := K) W)⟩ + NumberField.LiesOver.completionMap + (v := W) (w := W) x = x := by + let : W.1.LiesOver W.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) + (infinitePlaceBelow_self (K := K) W)⟩ + refine InfinitePlace.Completion.induction_on W x ?_ ?_ + · exact isClosed_eq + NumberField.LiesOver.continuous_completionMap + continuous_id + · intro y + change + NumberField.LiesOver.completionMap + (y : W.Completion) = + (y : W.Completion) + rw [NumberField.LiesOver.completionMap_coe + (v := W) (w := W) y] + have hy : + algebraMap (WithAbs W.1) (WithAbs W.1) y = y := by + apply (WithAbs.equiv W.1).injective + change + algebraMap K K (WithAbs.equiv W.1 y) = + WithAbs.equiv W.1 y + rw [Algebra.algebraMap_self] + rfl + exact + congrArg + (fun z : WithAbs W.1 => (z : W.Completion)) hy + +/-- Completion maps at infinite places compose in a tower of number +fields. -/ +theorem infinitePlaceCompletionMap_comp_apply + {M : Type*} + [Field M] [NumberField M] + [Algebra K M] [Algebra M L] + [IsScalarTower K M L] + (W : InfinitePlace L) + (x : + (infinitePlaceBelow + (K := K) W).Completion) : + let V := + infinitePlaceBelow (K := M) W + let v := + infinitePlaceBelow (K := K) W + letI : V.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) + (infinitePlaceBelow_infinitePlaceBelow + (K := K) (M := M) (L := L) W)⟩ + letI : W.1.LiesOver V.1 := ⟨rfl⟩ + letI : W.1.LiesOver v.1 := ⟨rfl⟩ + NumberField.LiesOver.completionMap + (v := V) (w := W) + (NumberField.LiesOver.completionMap + (v := v) (w := V) x) = + NumberField.LiesOver.completionMap + (v := v) (w := W) x := by + dsimp only + let V := + infinitePlaceBelow (K := M) W + let v := + infinitePlaceBelow (K := K) W + let : V.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) + (infinitePlaceBelow_infinitePlaceBelow + (K := K) (M := M) (L := L) W)⟩ + let : W.1.LiesOver V.1 := ⟨rfl⟩ + let : W.1.LiesOver v.1 := ⟨rfl⟩ + refine InfinitePlace.Completion.induction_on v x ?_ ?_ + · exact isClosed_eq + ((NumberField.LiesOver.continuous_completionMap + (v := V) (w := W)).comp + (NumberField.LiesOver.continuous_completionMap + (v := v) (w := V))) + (NumberField.LiesOver.continuous_completionMap + (v := v) (w := W)) + · intro y + rw [NumberField.LiesOver.completionMap_coe + (v := v) (w := V) y, + NumberField.LiesOver.completionMap_coe + (v := V) (w := W) + (algebraMap (WithAbs v.1) (WithAbs V.1) y), + NumberField.LiesOver.completionMap_coe + (v := v) (w := W) y] + apply congrArg + (fun z : WithAbs W.1 => (z : W.Completion)) + apply (WithAbs.equiv W.1).injective + change + algebraMap M L + (algebraMap K M (WithAbs.equiv v.1 y)) = + algebraMap K L (WithAbs.equiv v.1 y) + rw [IsScalarTower.algebraMap_apply K M L] + +/-- An infinite place above `w`, regarded as an exact extension of the +underlying absolute value. -/ +def infinitePlaceAboveToExtension + (w : InfinitePlace K) + (W : {W : InfinitePlace L // + infinitePlaceBelow (K := K) W = w}) : + AbsoluteValueExtension w.1 L := by + refine ⟨W.1.1, ?_⟩ + intro x + have h := + congrArg (fun v : InfinitePlace K => v x) W.2 + exact h + +omit [NumberField K] [NumberField L] [FiniteDimensional K L] in +/-- For a finite Galois extension, every extension of an infinite-place +absolute value is represented by an infinite place above the base +place. -/ +theorem + infinitePlaceAboveToExtension_surjective_of_isGalois + [IsGalois K L] + (w : InfinitePlace K) : + Function.Surjective + (infinitePlaceAboveToExtension + (K := K) (L := L) w) := by + intro u + obtain ⟨W₀, hW₀⟩ := + InfinitePlace.comap_surjective + (k := K) (K := L) w + let W₀' : + {W : InfinitePlace L // + infinitePlaceBelow (K := K) W = w} := + ⟨W₀, hW₀⟩ + let u₀ : AbsoluteValueExtension w.1 L := + infinitePlaceAboveToExtension + (K := K) (L := L) w W₀' + obtain ⟨σ, hσ⟩ := + absoluteValueConjugacy w.1 w.isNontrivial u₀ u + let Wσ : InfinitePlace L := + W₀.comap σ.toRingEquiv.toRingHom + have hWσ : + infinitePlaceBelow (K := K) Wσ = w := by + apply InfinitePlace.ext + intro x + change W₀ (σ (algebraMap K L x)) = w x + rw [σ.commutes] + exact congrArg (fun v : InfinitePlace K => v x) hW₀ + refine ⟨⟨Wσ, hWσ⟩, ?_⟩ + rw [hσ] + apply Subtype.ext + rfl + +/-- Infinite places of `L` above `w` are exactly the exact extensions of +the absolute value represented by `w`. -/ +noncomputable def infinitePlaceAboveEquivExtension + (w : InfinitePlace K) : + {W : InfinitePlace L // + infinitePlaceBelow (K := K) W = w} ≃ + AbsoluteValueExtension w.1 L := by + apply Equiv.ofBijective + (infinitePlaceAboveToExtension + (K := K) (L := L) w) + constructor + · intro W W' h + have habs : W.1.1 = W'.1.1 := + congrArg + (fun u : AbsoluteValueExtension w.1 L => u.1) h + apply Subtype.ext + apply Subtype.ext + exact habs + · intro u + let M := finiteNormalClosure K L + let e : L →ₐ[K] M := + finiteNormalClosureEmbedding K L + let : Algebra L M := + e.toRingHom.toAlgebra + let : IsScalarTower K L M := + IsScalarTower.of_algebraMap_eq' + e.comp_algebraMap.symm + let : FiniteDimensional L M := + FiniteDimensional.right K L M + let hu : u.1.IsNontrivial := + u.isNontrivial w.isNontrivial + let uOverL : AbsoluteValueExtension u.1 M := + pullbackAbsoluteValueExtension + u.1 hu IsAlgClosed.lift + let uM : AbsoluteValueExtension w.1 M := + { val := uOverL.1 + property := by + intro x + rw [IsScalarTower.algebraMap_apply K L M, + uOverL.2, u.2] } + obtain ⟨WM, hWM⟩ := + infinitePlaceAboveToExtension_surjective_of_isGalois + (K := K) (L := M) w uM + let WL : InfinitePlace L := + WM.1.comap (algebraMap L M) + have hWL : + infinitePlaceBelow (K := K) WL = w := by + apply InfinitePlace.ext + intro x + change + WM.1 + (algebraMap L M + (algebraMap K L x)) = + w x + rw [← IsScalarTower.algebraMap_apply K L M] + exact congrArg (fun v : InfinitePlace K => v x) WM.2 + refine ⟨⟨WL, hWL⟩, ?_⟩ + apply Subtype.ext + ext x + have hWMval : + WM.1.1 = uM.1 := + congrArg Subtype.val hWM + change + WM.1.1 (algebraMap L M x) = u.1 x + rw [hWMval] + exact uOverL.2 x + +/-- The absolute value underlying the extension corresponding to an +infinite place above `w`. -/ +@[simp] +theorem infinitePlaceAboveEquivExtension_apply_val + (w : InfinitePlace K) + (W : {W : InfinitePlace L // + infinitePlaceBelow (K := K) W = w}) : + (infinitePlaceAboveEquivExtension + (K := K) (L := L) w W).1 = W.1.1 := + rfl + +/-- Reindex the relative completion product by actual infinite +places above `w`. -/ +noncomputable def infiniteCompletionProductReindexAbove + (w : InfinitePlace K) : + (∀ u : AbsoluteValueExtension w.1 L, + u.1.Completionˣ) ≃* + ∀ W : {W : InfinitePlace L // + infinitePlaceBelow (K := K) W = w}, + W.1.1.Completionˣ := by + let e := + Equiv.piCongrLeft' + (fun u : AbsoluteValueExtension w.1 L => + u.1.Completionˣ) + (infinitePlaceAboveEquivExtension + (K := K) (L := L) w).symm + exact + { e with + map_mul' := by + intro x y + funext W + rfl } + +/-- Replace the absolute-value completion in every factor by mathlib's +concrete infinite-place completion. -/ +noncomputable def infiniteCompletionProductEquivAbove + (w : InfinitePlace K) : + (∀ u : AbsoluteValueExtension w.1 L, + u.1.Completionˣ) ≃* + ∀ W : {W : InfinitePlace L // + infinitePlaceBelow (K := K) W = w}, + W.1.Completionˣ := + (infiniteCompletionProductReindexAbove + (K := K) (L := L) w).trans + (MulEquiv.piCongrRight fun W => + Units.mapEquiv + (InfinitePlace.Completion.equiv W.1).symm.toMulEquiv) + +/-- The canonical local tensor decomposition for the actual archimedean tensor component, with +codomain indexed by concrete infinite places above the base place. -/ +noncomputable def infinitePlaceTensorUnitsEquivAbove + (w : InfinitePlace K) : + (w.Completion ⊗[K] L)ˣ ≃* + ∀ W : {W : InfinitePlace L // + infinitePlaceBelow (K := K) W = w}, + W.1.Completionˣ := by + letI : ∀ u : AbsoluteValueExtension w.1 L, + Algebra w.1.Completion u.1.Completion := + fun u => + AbsoluteValue.completionAlgebra w.1 u.1 u.2 + exact + (infinitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) w).trans + ((localTensorUnitsEquivCompletionProduct + (K := K) (L := L) w.1 w.isNontrivial).trans + (infiniteCompletionProductEquivAbove + (K := K) (L := L) w)) + +/-- Evaluation formula for the archimedean relative-to-ordinary +comparison at a concrete infinite place above the base place. -/ +@[simp] +theorem infinitePlaceTensorUnitsEquivAbove_apply + (w : InfinitePlace K) + (z : (w.Completion ⊗[K] L)ˣ) + (W : {W : InfinitePlace L // + infinitePlaceBelow (K := K) W = w}) : + infinitePlaceTensorUnitsEquivAbove + (K := K) (L := L) w z W = + Units.mapEquiv + (InfinitePlace.Completion.equiv W.1).symm.toMulEquiv + (localTensorUnitsEquivCompletionProduct + w.1 w.isNontrivial + (infinitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) w z) + (infinitePlaceAboveEquivExtension + (K := K) (L := L) w W)) := + rfl + +omit [NumberField K] [NumberField L] [FiniteDimensional K L] in +/-- After replacing the concrete completion by the underlying +absolute-value completion, scalar extension of a local unit is the pure +tensor with right factor one. -/ +@[simp] +theorem infinitePlaceLocalTensorUnitsEquiv_infiniteLocalIdeleInclusion_coe + (w : InfinitePlace K) (x : w.Completionˣ) : + (infinitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) w + (infiniteLocalIdeleInclusion + (K := K) (L := L) w x) : + LocalClassFieldTheory.LocalTensorAlgebra (L := L) w.1) = + infinitePlaceCompletionAlgEquiv w + (x : w.Completion) ⊗ₜ[K] (1 : L) := by + rfl + +/-- On a diagonal extension-field unit, the infinite local +relative-to-ordinary comparison is the ordinary diagonal embedding. -/ +theorem infinitePlaceTensorUnitsEquivAbove_localFieldIdeleInclusion + (w : InfinitePlace K) + (W : {W : InfinitePlace L // + infinitePlaceBelow (K := K) W = w}) + (x : Lˣ) : + infinitePlaceTensorUnitsEquivAbove + (K := K) (L := L) w + (infiniteLocalFieldIdeleInclusion + (K := K) (L := L) w x) W = + Units.map + (algebraMap L W.1.Completion) + x := by + rw [infinitePlaceTensorUnitsEquivAbove_apply] + apply Units.ext + simp only [Units.coe_map] + change + (InfinitePlace.Completion.equiv W.1).symm + (completionTensorDecompositionLeft + w.1 w.isNontrivial + (1 ⊗ₜ[K] (x : L)) + (infinitePlaceAboveEquivExtension + (K := K) (L := L) w W)) = + algebraMap L W.1.Completion (x : L) + rw [completionTensorDecomposition_left_tmul_apply] + simp only [map_one, one_mul] + apply InfinitePlace.Completion.ext + rfl + +/-- Flatten the products over base infinite places and places above them +to the product over all infinite places of `L`. -/ +noncomputable def infinitePlaceAbovePiMulEquiv : + (∀ w : InfinitePlace K, + ∀ W : {W : InfinitePlace L // + infinitePlaceBelow (K := K) W = w}, + W.1.Completionˣ) ≃* + ∀ W : InfinitePlace L, W.Completionˣ where + toFun f W := + f (infinitePlaceBelow (K := K) W) ⟨W, rfl⟩ + invFun f w W := f W.1 + left_inv f := by + funext w W + rcases W with ⟨W, hW⟩ + subst w + rfl + right_inv f := by + funext W + rfl + map_mul' f g := by + funext W + rfl + +/-- The unrestricted product of all archimedean tensor-unit factors is +the product of the concrete archimedean local unit groups of `L`. -/ +noncomputable def relativeInfiniteTensorPiMulEquiv : + (∀ w : InfinitePlace K, + (w.Completion ⊗[K] L)ˣ) ≃* + ∀ W : InfinitePlace L, W.Completionˣ := + (MulEquiv.piCongrRight fun w => + infinitePlaceTensorUnitsEquivAbove + (K := K) (L := L) w).trans + (infinitePlaceAbovePiMulEquiv + (K := K) (L := L)) + +/-- Evaluation of the archimedean tensor-product comparison at an +infinite place of the extension field. -/ +@[simp] +theorem relativeInfiniteTensorPiMulEquiv_apply + (f : ∀ w : InfinitePlace K, (w.Completion ⊗[K] L)ˣ) + (W : InfinitePlace L) : + relativeInfiniteTensorPiMulEquiv (K := K) (L := L) f W = + infinitePlaceTensorUnitsEquivAbove + (K := K) (L := L) + (infinitePlaceBelow (K := K) W) + (f (infinitePlaceBelow (K := K) W)) + ⟨W, rfl⟩ := rfl + +/-- The archimedean relative tensor factors form the ordinary infinite +idele group of `L`. -/ +noncomputable def relativeInfiniteIdeleMulEquiv : + (∀ w : InfinitePlace K, + (w.Completion ⊗[K] L)ˣ) ≃* + InfiniteIdeleGroup L := + (relativeInfiniteTensorPiMulEquiv + (K := K) (L := L)).trans + ContinuousMulEquiv.piUnits.symm.toMulEquiv + +/-- Multiplication in the transported finite relative restricted product +is pointwise on its local tensor factors. -/ +@[simp] +theorem RelativeFiniteIdeleData.finite_mul + (a b : RelativeFiniteIdeleData (K := K) (L := L)) + (w : HeightOneSpectrum (𝓞 K)) : + (a * b).finite w = a.finite w * b.finite w := by + change + (relativeFiniteTensorPiMulEquiv + (K := K) (L := L)).symm + (relativeFiniteTensorPiMulEquiv + (K := K) (L := L) a.finite * + relativeFiniteTensorPiMulEquiv + (K := K) (L := L) b.finite) w = + a.finite w * b.finite w + rw [← map_mul, + (relativeFiniteTensorPiMulEquiv + (K := K) (L := L)).symm_apply_apply] + rfl + +/-- Forget the infinite component of restricted local idele data. -/ +noncomputable def RelativeLocalIdeleData.toFiniteData + (a : RelativeLocalIdeleData (K := K) (L := L)) : + RelativeFiniteIdeleData (K := K) (L := L) where + finite := a.finite + eventually_integral := a.eventually_integral + eventually_inverse_integral := + a.eventually_inverse_integral + +/-- Passing relative local idele data to finite data preserves +multiplication. -/ +@[simp] +theorem RelativeLocalIdeleData.toFiniteData_mul + (a b : RelativeLocalIdeleData (K := K) (L := L)) : + (a * b).toFiniteData = + a.toFiniteData * b.toFiniteData := by + apply RelativeFiniteIdeleData.ext + funext w + rw [RelativeFiniteIdeleData.finite_mul] + change (a * b).finite w = a.finite w * b.finite w + exact RelativeLocalIdeleData.finite_mul + (K := K) (L := L) a b w + +/-- Split restricted local idele data into its unrestricted infinite part +and finite restricted part. -/ +noncomputable def relativeLocalIdeleDataSplitMulEquiv : + RelativeLocalIdeleData (K := K) (L := L) ≃* + ((∀ w : InfinitePlace K, + (w.Completion ⊗[K] L)ˣ) × + RelativeFiniteIdeleData (K := K) (L := L)) where + toFun a := + ⟨a.infinite, a.toFiniteData⟩ + invFun a := + { infinite := a.1 + finite := a.2.finite + eventually_integral := a.2.eventually_integral + eventually_inverse_integral := + a.2.eventually_inverse_integral } + left_inv a := by + apply RelativeLocalIdeleData.ext <;> rfl + right_inv a := by + rcases a with ⟨a, b⟩ + rfl + map_mul' a b := by + apply Prod.ext + · funext w + exact RelativeLocalIdeleData.infinite_mul + (K := K) (L := L) a b w + · exact RelativeLocalIdeleData.toFiniteData_mul + (K := K) (L := L) a b + +/-- Scalar extension identifies the actual relative +idele group `I_K ⊗_K L` with the ordinary idele group `I_L`. -/ +noncomputable def relativeIdeleBaseChangeMulEquiv : + RelativeIdeleGroup K L ≃* IdeleGroup L := + (relativeIdeleMulEquivLocalData + (K := K) (L := L)).trans + ((relativeLocalIdeleDataSplitMulEquiv + (K := K) (L := L)).trans + ((relativeInfiniteIdeleMulEquiv + (K := K) (L := L)).prodCongr + (relativeFiniteIdeleMulEquiv + (K := K) (L := L)))) + +/-- The infinite component of the relative idele base-change +equivalence. -/ +@[simp] +theorem relativeIdeleBaseChangeMulEquiv_infinite + (z : RelativeIdeleGroup K L) : + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) z).1 = + relativeInfiniteIdeleMulEquiv + (K := K) (L := L) + (relativeIdeleToLocalData + (K := K) (L := L) z).infinite := + rfl + +/-- The finite component of the relative idele base-change +equivalence. -/ +@[simp] +theorem relativeIdeleBaseChangeMulEquiv_finite + (z : RelativeIdeleGroup K L) : + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) z).2 = + relativeFiniteIdeleToFiniteIdele + (K := K) (L := L) + (relativeIdeleToLocalData + (K := K) (L := L) z).toFiniteData := + rfl diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Basic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Basic.lean new file mode 100644 index 0000000000..f49b91d560 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Basic.lean @@ -0,0 +1,169 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.NumberField.AdeleRing +public import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +public import Mathlib.Topology.Algebra.Group.Units +/-! +# Ideles of a number field + +This file defines the ideles of a number field. + +The finite ideles are defined as the restricted product of the multiplicative +groups of the finite completions with respect to the unit groups of their +valuation rings. This is deliberately not the topology induced from the +finite adele ring: the latter is not the idele topology. The infinite factor +is the unit group of the finite product of the archimedean completions. +-/ + +@[expose] public section + +open scoped NumberField RestrictedProduct +open NumberField IsDedekindDomain + +noncomputable +section + + +variable (K : Type*) [Field K] [NumberField K] + +/-- The finite idele group attached to a Dedekind domain and its fraction +field. The number-field definition below specializes this to the ring of +integers. -/ +abbrev FiniteIdeleGroupOf + (R : Type*) [CommRing R] [IsDedekindDomain R] + (F : Type*) [Field F] [Algebra R F] [IsFractionRing R F] := + Πʳ v : HeightOneSpectrum R, + [(v.adicCompletion F)ˣ, (v.adicCompletionIntegers F).units] + +/-- The group of finite ideles of a number field. -/ +abbrev FiniteIdeleGroup := + FiniteIdeleGroupOf (𝓞 K) K + +/-- The product of the multiplicative groups of the archimedean completions. -/ +abbrev InfiniteIdeleGroup := + (NumberField.InfiniteAdeleRing K)ˣ + +/-- The idele group `I_K`. -/ +abbrev IdeleGroup := + InfiniteIdeleGroup K × FiniteIdeleGroup K + +namespace FiniteIdeleGroup + +variable {K} + +/-- Evaluation of a finite idele at a finite place. -/ +def component (v : HeightOneSpectrum (𝓞 K)) : + FiniteIdeleGroup K →* (v.adicCompletion K)ˣ where + toFun a := a v + map_one' := rfl + map_mul' _ _ := rfl + +@[simp] +theorem component_apply (a : FiniteIdeleGroup K) + (v : HeightOneSpectrum (𝓞 K)) : + component v a = a v := + rfl + +/-- A finite idele is a local integral unit at all but finitely many finite +places. -/ +theorem eventually_mem_localUnits (a : FiniteIdeleGroup K) : + ∀ᶠ v in Filter.cofinite, + a v ∈ (v.adicCompletionIntegers K).units := + a.2 + +end FiniteIdeleGroup + +namespace InfiniteIdeleGroup + +variable {K} + +/-- The component of an infinite idele at an archimedean place. -/ +def component (v : InfinitePlace K) : + InfiniteIdeleGroup K →* v.Completionˣ := + (Pi.evalMonoidHom (fun w : InfinitePlace K ↦ w.Completionˣ) v).comp + ContinuousMulEquiv.piUnits.toMonoidHom + +omit [NumberField K] in +@[simp] +theorem component_apply (a : InfiniteIdeleGroup K) (v : InfinitePlace K) : + component v a = ContinuousMulEquiv.piUnits a v := + rfl + +end InfiniteIdeleGroup + +namespace IdeleGroup + +variable {K} + +/-- Algebraically, the finite ideles over a Dedekind domain are the units of +its finite adele ring. -/ +def finiteEquivFiniteAdeleUnitsOf + (R : Type*) [CommRing R] [IsDedekindDomain R] + (F : Type*) [Field F] [Algebra R F] [IsFractionRing R F] : + FiniteIdeleGroupOf R F ≃* + (IsDedekindDomain.FiniteAdeleRing R F)ˣ := + (RestrictedProduct.unitsEquiv + (ι := HeightOneSpectrum R) + (S := fun v : HeightOneSpectrum R ↦ ValuationSubring (v.adicCompletion F)) + (B := fun v : HeightOneSpectrum R ↦ v.adicCompletionIntegers F) + (𝓕 := Filter.cofinite) + (fun v : HeightOneSpectrum R ↦ v.adicCompletion F)).symm + +/-- The component of an idele at an archimedean place. -/ +def infiniteComponent (v : InfinitePlace K) : + IdeleGroup K →* v.Completionˣ := + (InfiniteIdeleGroup.component v).comp (MonoidHom.fst _ _) + +/-- The component of an idele at a finite place. -/ +def finiteComponent (v : HeightOneSpectrum (𝓞 K)) : + IdeleGroup K →* (v.adicCompletion K)ˣ := + (FiniteIdeleGroup.component v).comp (MonoidHom.snd _ _) + +@[simp] +theorem infiniteComponent_apply (a : IdeleGroup K) (v : InfinitePlace K) : + infiniteComponent v a = ContinuousMulEquiv.piUnits a.1 v := + rfl + +@[simp] +theorem finiteComponent_apply (a : IdeleGroup K) + (v : HeightOneSpectrum (𝓞 K)) : + finiteComponent v a = a.2 v := + rfl + +/-- Algebraically, the finite ideles are the units of the finite adele ring. +The topology on the left is the restricted-product topology and is not +transported through this equivalence. -/ +def finiteEquivFiniteAdeleUnits : + FiniteIdeleGroup K ≃* + (IsDedekindDomain.FiniteAdeleRing (𝓞 K) K)ˣ := + finiteEquivFiniteAdeleUnitsOf (𝓞 K) K + +/-- Algebraically, the idele group is the unit group of the adele ring. + +This is only a multiplicative equivalence. It is intentionally not stated as +a homeomorphism because the idele topology is finer than the topology induced +from the adele ring. -/ +def equivAdeleRingUnits : + IdeleGroup K ≃* (NumberField.AdeleRing (𝓞 K) K)ˣ := + ((MulEquiv.refl (InfiniteIdeleGroup K)).prodCongr + (finiteEquivFiniteAdeleUnits (K := K))).trans + MulEquiv.prodUnits.symm + +@[simp] +theorem equivAdeleRingUnits_fst (a : IdeleGroup K) : + (MulEquiv.prodUnits (equivAdeleRingUnits a)).1 = a.1 := by + rfl + +@[simp] +theorem equivAdeleRingUnits_snd (a : IdeleGroup K) : + (MulEquiv.prodUnits (equivAdeleRingUnits a)).2 = + finiteEquivFiniteAdeleUnits (K := K) a.2 := by + rfl + +end IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup.lean new file mode 100644 index 0000000000..599a31a1b2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup.lean @@ -0,0 +1,28 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivAdeleTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivFiniteIntegral +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivIdeleClassTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.ConnectedComponentQuotientCongr +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.InfiniteAlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibTopologyComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean new file mode 100644 index 0000000000..b9024b1170 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean @@ -0,0 +1,1563 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent +public import Mathlib.RingTheory.Norm.Basic +public import Mathlib.RingTheory.TensorProduct.Maps +public import Mathlib.RingTheory.DedekindDomain.Ideal.Lemmas +/-! +# Relative idele classes under an isomorphic realization + +If two finite extensions of a number field are isomorphic over the base, +their tensor-product presentations of the relative adeles are canonically +isomorphic. This file descends that canonical isomorphism to relative +ideles and idele classes and records compatibility with the determinant +norm. + +The construction is the direct tensor-product congruence + +`𝔸_K ⊗[K] L ≃ 𝔸_K ⊗[K] M` + +induced by an algebra equivalence `L ≃ₐ[K] M`. In particular, no second +model of relative adeles or of the idele-class norm is introduced. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField +open IsDedekindDomain + +noncomputable +section + +open RelativeIdeleGroup.Cohomology + + +universe u v w + +variable + {K : Type u} {L : Type v} {M : Type w} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [Field M] [Algebra K M] + +/-- A base-field algebra equivalence between two realizations of a finite +extension induces the canonical equivalence between their relative adele +algebras. -/ +noncomputable def relativeAdeleCongr + (e : L ≃ₐ[K] M) : + RelativeAdeleRing K L ≃ₐ[NumberField.AdeleRing (𝓞 K) K] + RelativeAdeleRing K M := + Algebra.TensorProduct.congr AlgEquiv.refl e + +@[simp] +theorem relativeAdeleCongr_tmul + (e : L ≃ₐ[K] M) + (a : NumberField.AdeleRing (𝓞 K) K) + (x : L) : + relativeAdeleCongr (K := K) e (a ⊗ₜ[K] x) = + a ⊗ₜ[K] e x := + rfl + +/-- The canonical transport of relative ideles along an isomorphic +realization of the top field. -/ +noncomputable def relativeIdeleCongr + (e : L ≃ₐ[K] M) : + RelativeIdeleGroup K L ≃* + RelativeIdeleGroup K M := + Units.mapEquiv + (relativeAdeleCongr (K := K) e).toMulEquiv + +@[simp] +theorem relativeIdeleCongr_coe + (e : L ≃ₐ[K] M) + (a : RelativeIdeleGroup K L) : + ((relativeIdeleCongr (K := K) e a : + RelativeIdeleGroup K M) : + RelativeAdeleRing K M) = + relativeAdeleCongr (K := K) e + (a : RelativeAdeleRing K L) := + rfl + +/-- For an automorphism of the top field, canonical relative-idele +transport is the actual Galois action. -/ +theorem relativeIdeleCongr_eq_smul + (σ : L ≃ₐ[K] L) + (a : RelativeIdeleGroup K L) : + relativeIdeleCongr (K := K) σ a = σ • a := + rfl + +/-- Transport of relative ideles sends a principal idele to the principal +idele of the transported field unit. -/ +@[simp] +theorem relativeIdeleCongr_principalIdele + (e : L ≃ₐ[K] M) + (x : Lˣ) : + relativeIdeleCongr (K := K) e + (RelativeIdeleGroup.principalIdele K L x) = + RelativeIdeleGroup.principalIdele K M + (Units.mapEquiv e.toMulEquiv x) := by + apply Units.ext + change + relativeAdeleCongr (K := K) e + ((1 : NumberField.AdeleRing (𝓞 K) K) ⊗ₜ[K] (x : L)) = + (1 : NumberField.AdeleRing (𝓞 K) K) ⊗ₜ[K] e (x : L) + rfl + +/-- The canonical transport identifies the two principal-relative-idele +subgroups. -/ +theorem relativeIdelePrincipalSubgroup_map_congr + (e : L ≃ₐ[K] M) : + (RelativeIdeleGroup.principalSubgroup K L).map + (relativeIdeleCongr (K := K) e) = + RelativeIdeleGroup.principalSubgroup K M := by + ext y + constructor + · rintro ⟨z, ⟨x, hx⟩, rfl⟩ + rw [← hx] + exact + ⟨Units.mapEquiv e.toMulEquiv x, + (relativeIdeleCongr_principalIdele + (K := K) e x).symm⟩ + · rintro ⟨y, rfl⟩ + obtain ⟨x, rfl⟩ := + (Units.mapEquiv e.toMulEquiv).surjective y + exact + ⟨RelativeIdeleGroup.principalIdele K L x, + ⟨x, rfl⟩, + relativeIdeleCongr_principalIdele + (K := K) e x⟩ + +/-- The relative idele class group is unchanged when the top field is +replaced by an isomorphic realization. -/ +noncomputable def relativeIdeleClassCongr + (e : L ≃ₐ[K] M) : + RelativeIdeleGroup.ClassGroup K L ≃* + RelativeIdeleGroup.ClassGroup K M := + QuotientGroup.congr + (RelativeIdeleGroup.principalSubgroup K L) + (RelativeIdeleGroup.principalSubgroup K M) + (relativeIdeleCongr (K := K) e) + (relativeIdelePrincipalSubgroup_map_congr + (K := K) e) + +theorem relativeIdeleClassCongr_mk + (e : L ≃ₐ[K] M) + (a : RelativeIdeleGroup K L) : + relativeIdeleClassCongr (K := K) e + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) a) = + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K M) + (relativeIdeleCongr (K := K) e a) := + rfl + +/-- Transporting a relative idèle class along an equivalence and then +embedding it into a third relative idèle class group is the same as +embedding along the composite field embedding. -/ +theorem RelativeIdeleGroup.classEmbedding_relativeIdeleClassCongr + {N : Type*} [Field N] [Algebra K N] + (e : L ≃ₐ[K] M) + (f : M →ₐ[K] N) + (c : RelativeIdeleGroup.ClassGroup K L) : + RelativeIdeleGroup.classEmbedding f + (relativeIdeleClassCongr (K := K) e c) = + RelativeIdeleGroup.classEmbedding + (f.comp e.toAlgHom) c := by + refine QuotientGroup.induction_on c ?_ + intro a + change + RelativeIdeleGroup.classEmbedding f + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K M) + (relativeIdeleCongr (K := K) e a)) = + RelativeIdeleGroup.classEmbedding + (f.comp e.toAlgHom) + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) a) + rw [RelativeIdeleGroup.classEmbedding_mk, + RelativeIdeleGroup.classEmbedding_mk] + apply congrArg + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K N)) + apply Units.ext + change + RelativeIdeleGroup.adeleEmbedding f + (relativeAdeleCongr (K := K) e + (a : RelativeAdeleRing K L)) = + RelativeIdeleGroup.adeleEmbedding + (f.comp e.toAlgHom) + (a : RelativeAdeleRing K L) + induction (a : RelativeAdeleRing K L) using + TensorProduct.inductionOn with + | tmul x y => + simp only [relativeAdeleCongr_tmul, + RelativeIdeleGroup.adeleEmbedding, + RelativeIdeleGroup.scalarEmbedding_tmul, + AlgHom.coe_comp, Function.comp_apply] + rfl + | add x y hx hy => + simpa only [map_add] using congrArg₂ (· + ·) hx hy + +/-- The determinant norm on relative ideles is invariant under replacement +of the top field by an isomorphic realization. -/ +@[simp] +theorem relativeIdeleCongr_norm + (e : L ≃ₐ[K] M) + (a : RelativeIdeleGroup K L) : + RelativeIdeleGroup.norm K M + (relativeIdeleCongr (K := K) e a) = + RelativeIdeleGroup.norm K L a := by + apply + (IdeleGroup.equivAdeleRingUnits + (K := K)).injective + simp only [RelativeIdeleGroup.norm, + MonoidHom.comp_apply, MulEquiv.coe_toMonoidHom, + MulEquiv.apply_symm_apply] + apply Units.ext + change + Algebra.norm + (NumberField.AdeleRing (𝓞 K) K) + (relativeAdeleCongr (K := K) e + (a : RelativeAdeleRing K L)) = + Algebra.norm + (NumberField.AdeleRing (𝓞 K) K) + (a : RelativeAdeleRing K L) + exact + Algebra.norm_eq_of_algEquiv + (relativeAdeleCongr (K := K) e) + (a : RelativeAdeleRing K L) + +section Norm + +variable [FiniteDimensional K L] [FiniteDimensional K M] + +/-- The descended idele-class norm is invariant under the canonical +transport of the relative idele class group. -/ +@[simp] +theorem relativeIdeleClassCongr_ideleClassNorm + (e : L ≃ₐ[K] M) + (c : RelativeIdeleGroup.ClassGroup K L) : + RelativeIdeleGroup.classNorm K M + (relativeIdeleClassCongr (K := K) e c) = + RelativeIdeleGroup.classNorm K L c := by + refine QuotientGroup.induction_on c ?_ + intro a + change + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (RelativeIdeleGroup.norm K M + (relativeIdeleCongr (K := K) e a)) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (RelativeIdeleGroup.norm K L a) + rw [relativeIdeleCongr_norm (K := K) e a] + +/-- Isomorphic realizations of a finite extension have the same actual +idele-class norm subgroup in the base idele class group. -/ +theorem ideleClassNorm_range_algEquiv + (e : L ≃ₐ[K] M) : + (RelativeIdeleGroup.classNorm K M).range = + (RelativeIdeleGroup.classNorm K L).range := by + ext c + constructor + · rintro ⟨d, rfl⟩ + refine + ⟨(relativeIdeleClassCongr + (K := K) e).symm d, ?_⟩ + have h := + relativeIdeleClassCongr_ideleClassNorm + (K := K) e + ((relativeIdeleClassCongr + (K := K) e).symm d) + rw [MulEquiv.apply_symm_apply] at h + exact h.symm + · rintro ⟨d, rfl⟩ + exact + ⟨relativeIdeleClassCongr (K := K) e d, + relativeIdeleClassCongr_ideleClassNorm + (K := K) e d⟩ + +/-- Ordinary idele-class norm subgroups are invariant under a base-field equivalence. -/ +theorem ordinaryIdeleClassNorm_range_algEquiv + [NumberField L] [NumberField M] (e : L ≃ₐ[K] M) : + (_root_.ideleClassNorm K L).range = (_root_.ideleClassNorm K M).range := by + calc + (_root_.ideleClassNorm K L).range = (RelativeIdeleGroup.classNorm K L).range := + ordinaryIdeleClassNorm_range_eq_relative (K := K) (L := L) + _ = (RelativeIdeleGroup.classNorm K M).range := + (ideleClassNorm_range_algEquiv (K := K) e).symm + _ = (_root_.ideleClassNorm K M).range := + (ordinaryIdeleClassNorm_range_eq_relative (K := K) (L := M)).symm + +/-- The idele-class norm index is invariant under an isomorphic realization +of the top field. -/ +theorem ideleClassNorm_index_algEquiv + (e : L ≃ₐ[K] M) : + (RelativeIdeleGroup.classNorm K M).range.index = + (RelativeIdeleGroup.classNorm K L).range.index := by + rw [ideleClassNorm_range_algEquiv + (K := K) e] + +end Norm + +section Absolute + +variable + {K : Type u} {M : Type w} + [Field K] [NumberField K] [Algebra ℚ K] + [Field M] [NumberField M] [Algebra ℚ M] + +/-- The canonical transport of ordinary adele rings along an equivalence +of number fields. It is the existing relative-adele transport over `ℚ`, +conjugated by the relative-to-ordinary scalar-extension equivalences. -/ +noncomputable def adeleCongr + (e : K ≃ₐ[ℚ] M) : + NumberField.AdeleRing (𝓞 K) K ≃+* + NumberField.AdeleRing (𝓞 M) M := + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K)).symm |>.trans + ((relativeAdeleCongr (K := ℚ) e).toRingEquiv.trans + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := M))) + +/-- The relative-to-ordinary scalar-extension comparison is natural for +transport of the top number field. -/ +theorem relativeAdeleBaseChangeRingEquiv_relativeAdeleCongr + (e : K ≃ₐ[ℚ] M) + (z : RelativeAdeleRing ℚ K) : + relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := M) + (relativeAdeleCongr (K := ℚ) e z) = + adeleCongr e + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K) z) := by + change + relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := M) + (relativeAdeleCongr (K := ℚ) e z) = + relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := M) + (relativeAdeleCongr (K := ℚ) e + ((relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K)).symm + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K) z))) + rw [RingEquiv.symm_apply_apply] + +/-- Transport of ordinary adeles carries the diagonal field embedding to +the diagonal field embedding. -/ +@[simp] +theorem adeleCongr_algebraMap + (e : K ≃ₐ[ℚ] M) + (x : K) : + adeleCongr e + (algebraMap K + (NumberField.AdeleRing (𝓞 K) K) x) = + algebraMap M + (NumberField.AdeleRing (𝓞 M) M) (e x) := by + have hx : + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K)).symm + (algebraMap K + (NumberField.AdeleRing (𝓞 K) K) x) = + (1 : NumberField.AdeleRing (𝓞 ℚ) ℚ) ⊗ₜ[ℚ] x := by + apply + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K)).injective + rw [RingEquiv.apply_symm_apply, + relativeAdeleBaseChangeRingEquiv_fieldInclusion] + change + relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := M) + (relativeAdeleCongr (K := ℚ) e + ((relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K)).symm + (algebraMap K + (NumberField.AdeleRing (𝓞 K) K) x))) = + algebraMap M + (NumberField.AdeleRing (𝓞 M) M) (e x) + rw [hx, relativeAdeleCongr_tmul, + relativeAdeleBaseChangeRingEquiv_fieldInclusion] + +/-- The permutation of finite places induced by an equivalence of number +fields. -/ +noncomputable def finitePlaceCongr + (e : K ≃ₐ[ℚ] M) : + HeightOneSpectrum (𝓞 K) ≃ + HeightOneSpectrum (𝓞 M) := + HeightOneSpectrum.equivOfRingEquiv + (NumberField.RingOfIntegers.mapRingEquiv + e.toRingEquiv) + +omit [NumberField K] [NumberField M] in +@[simp] +theorem finitePlaceCongr_asIdeal + (e : K ≃ₐ[ℚ] M) + (v : HeightOneSpectrum (𝓞 K)) : + (finitePlaceCongr e v).asIdeal = + v.asIdeal.map + (NumberField.RingOfIntegers.mapRingEquiv + e.toRingEquiv) := by + ext x + exact Ideal.symm_apply_mem_of_equiv_iff + +private theorem finitePlaceBelow_eq_finitePlaceCongr_symm + (e : K ≃ₐ[ℚ] M) + (W : HeightOneSpectrum (𝓞 M)) : + letI : Algebra K M := e.toRingHom.toAlgebra + finitePlaceBelow (K := K) W = + (finitePlaceCongr e).symm W := by + apply HeightOneSpectrum.ext + rfl + +/-- The canonical map between corresponding finite completions induced by +an equivalence of number fields. -/ +noncomputable def finitePlaceAdicCompletionCongrHom + (e : K ≃ₐ[ℚ] M) + (W : HeightOneSpectrum (𝓞 M)) : + ((finitePlaceCongr e).symm W).adicCompletion K →+* + W.adicCompletion M := by + letI : Algebra K M := e.toRingHom.toAlgebra + exact + finitePlaceAdicCompletionMap K M + ((finitePlaceCongr e).symm W) + ⟨W, by exact finitePlaceBelow_eq_finitePlaceCongr_symm e W⟩ + +/-- On finite coordinates, canonical adelic transport is the completion +map at the corresponding finite places. -/ +theorem adeleCongr_finiteComponent + (e : K ≃ₐ[ℚ] M) + (a : NumberField.AdeleRing (𝓞 K) K) + (W : HeightOneSpectrum (𝓞 M)) : + (adeleCongr e a).2 W = + finitePlaceAdicCompletionCongrHom e W + (a.2 ((finitePlaceCongr e).symm W)) := by + let : Algebra K M := e.toRingHom.toAlgebra + let : IsScalarTower ℚ K M := + IsScalarTower.of_algHom e.toAlgHom + let componentK := + (finiteAdeleComponentAlgHom + ((finitePlaceCongr e).symm W)).toAddMonoidHom + let componentM := + (finiteAdeleComponentAlgHom W).toAddMonoidHom + change + componentM (adeleCongr e a) = + finitePlaceAdicCompletionCongrHom e W + (componentK a) + let z := + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K)).symm a + have ha : + relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K) z = a := + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K)).apply_symm_apply a + rw [← ha] + have htransport : + componentM + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := M) + (relativeAdeleCongr (K := ℚ) e z)) = + componentM + (adeleCongr e + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K) z)) := + congrArg + componentM + (relativeAdeleBaseChangeRingEquiv_relativeAdeleCongr + e z) + rw [← htransport] + induction z using TensorProduct.inductionOn with + | add x y hx hy => + simpa only [map_add] using congrArg₂ (· + ·) hx hy + | tmul b x => + let w : HeightOneSpectrum (𝓞 K) := + (finitePlaceCongr e).symm W + have hW : + finitePlaceBelow (K := K) W = w := by + exact finitePlaceBelow_eq_finitePlaceCongr_symm e W + have hq : + finitePlaceBelow (K := ℚ) w = + finitePlaceBelow (K := ℚ) W := by + rw [← hW, finitePlaceBelow_finitePlaceBelow] + have hcomponent + (q' : HeightOneSpectrum (𝓞 ℚ)) + (hq' : + q' = finitePlaceBelow (K := ℚ) W) + (hwq : + finitePlaceBelow (K := ℚ) w = q') : + finitePlaceAdicCompletionMap ℚ M + (finitePlaceBelow (K := ℚ) W) ⟨W, rfl⟩ + (b.2 (finitePlaceBelow (K := ℚ) W)) * + algebraMap M (W.adicCompletion M) (e x) = + finitePlaceAdicCompletionMap K M w ⟨W, hW⟩ + (finitePlaceAdicCompletionMap ℚ K q' + ⟨w, hwq⟩ (b.2 q') * + algebraMap K (w.adicCompletion K) x) := by + subst q' + have hx : + finitePlaceAdicCompletionMap K M w ⟨W, hW⟩ + (algebraMap K (w.adicCompletion K) x) = + algebraMap M (W.adicCompletion M) (e x) := by + change + finitePlaceAdicCompletionMap K M w ⟨W, hW⟩ + (x : w.adicCompletion K) = + (e x : W.adicCompletion M) + exact + finitePlaceAdicCompletionMap_coe K M w + ⟨W, hW⟩ x + rw [map_mul, + finitePlaceAdicCompletionMap_comp ℚ M (M := K) + (finitePlaceBelow (K := ℚ) W) w W + hwq hW rfl, + hx] + rw [relativeAdeleCongr_tmul] + change + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := M) + (b ⊗ₜ[ℚ] e x)).2 W = + finitePlaceAdicCompletionCongrHom e W + ((relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K) + (b ⊗ₜ[ℚ] x)).2 w) + rw [ + relativeAdeleBaseChangeRingEquiv_finiteComponent_tmul, + relativeAdeleBaseChangeRingEquiv_finiteComponent_tmul] + change + finitePlaceAdicCompletionMap ℚ M + (finitePlaceBelow (K := ℚ) W) ⟨W, rfl⟩ + (b.2 (finitePlaceBelow (K := ℚ) W)) * + algebraMap M (W.adicCompletion M) (e x) = + finitePlaceAdicCompletionMap K M w ⟨W, hW⟩ + (finitePlaceAdicCompletionMap ℚ K + (finitePlaceBelow (K := ℚ) w) ⟨w, rfl⟩ + (b.2 (finitePlaceBelow (K := ℚ) w)) * + algebraMap K (w.adicCompletion K) x) + exact hcomponent + (finitePlaceBelow (K := ℚ) w) hq rfl + +/-- The canonical transport of ordinary ideles along an equivalence of +number fields. It is obtained from the existing relative-idele transport +over `ℚ` and the canonical relative-to-ordinary base-change equivalences. -/ +noncomputable def ideleCongr + (e : K ≃ₐ[ℚ] M) : + IdeleGroup K ≃* IdeleGroup M := + (IdeleGroup.equivAdeleRingUnits (K := K)).trans + ((Units.mapEquiv (adeleCongr e).toMulEquiv).trans + (IdeleGroup.equivAdeleRingUnits (K := M)).symm) + +/-- The relative-to-ordinary scalar-extension comparison is natural for +transport of relative ideles along an equivalence of their top fields. -/ +theorem relativeIdeleBaseChangeMulEquiv_relativeIdeleCongr + (e : K ≃ₐ[ℚ] M) + (a : RelativeIdeleGroup ℚ K) : + relativeIdeleBaseChangeMulEquiv + (K := ℚ) (L := M) + (relativeIdeleCongr (K := ℚ) e a) = + ideleCongr e + (relativeIdeleBaseChangeMulEquiv + (K := ℚ) (L := K) a) := by + apply + (IdeleGroup.equivAdeleRingUnits + (K := M)).injective + rw [relativeIdeleBaseChangeMulEquiv_eq_ringUnits] + simp only [ideleCongr, MulEquiv.trans_apply, + MulEquiv.apply_symm_apply, + relativeIdeleBaseChangeMulEquiv_eq_ringUnits] + apply Units.ext + exact + relativeAdeleBaseChangeRingEquiv_relativeAdeleCongr + e (a : RelativeAdeleRing ℚ K) + +/-- Under the actual Galois action on relative ideles, the +relative-to-ordinary scalar-extension comparison is equivariant for the +canonical transport of ordinary ideles. -/ +theorem relativeIdeleBaseChangeMulEquiv_smul_congr + {E : Type*} [Field E] [NumberField E] [Algebra ℚ E] + (σ : E ≃ₐ[ℚ] E) + (a : RelativeIdeleGroup ℚ E) : + relativeIdeleBaseChangeMulEquiv + (K := ℚ) (L := E) (σ • a) = + ideleCongr σ + (relativeIdeleBaseChangeMulEquiv + (K := ℚ) (L := E) a) := by + rw [← relativeIdeleCongr_eq_smul (K := ℚ) σ a] + exact + relativeIdeleBaseChangeMulEquiv_relativeIdeleCongr + σ a + +/-- On finite coordinates, canonical idelic transport is the completion +map at the corresponding finite places. -/ +theorem ideleCongr_finiteComponent + (e : K ≃ₐ[ℚ] M) + (a : IdeleGroup K) + (W : HeightOneSpectrum (𝓞 M)) : + IdeleGroup.finiteComponent W (ideleCongr e a) = + Units.map + (finitePlaceAdicCompletionCongrHom e W).toMonoidHom + (IdeleGroup.finiteComponent + ((finitePlaceCongr e).symm W) a) := by + apply Units.ext + exact + adeleCongr_finiteComponent e + (((IdeleGroup.equivAdeleRingUnits + (K := K) a : + (NumberField.AdeleRing (𝓞 K) K)ˣ) : + NumberField.AdeleRing (𝓞 K) K)) + W + +omit [NumberField K] in +private theorem finitePlaceCongr_ramificationIdx + (e : K ≃ₐ[ℚ] M) + (W : HeightOneSpectrum (𝓞 M)) : + letI : Algebra K M := e.toRingHom.toAlgebra + ((finitePlaceCongr e).symm W).asIdeal.ramificationIdx' + W.asIdeal = 1 := by + let : Algebra K M := e.toRingHom.toAlgebra + let w : HeightOneSpectrum (𝓞 K) := + (finitePlaceCongr e).symm W + have hmap : + w.asIdeal.map (algebraMap (𝓞 K) (𝓞 M)) = + W.asIdeal := by + change + w.asIdeal.map + (NumberField.RingOfIntegers.mapRingEquiv + e.toRingEquiv) = + W.asIdeal + rw [← finitePlaceCongr_asIdeal e w] + simp [w] + rw [← hmap] + exact + Ideal.ramificationIdx'_map_self_eq_one + (p := w.asIdeal) + (by rw [hmap]; exact W.isPrime.ne_top) + (by rw [hmap]; exact W.ne_bot) + +/-- Normalized local orders are unchanged by transport along a +number-field equivalence. -/ +theorem ideleCongr_localOrder + (e : K ≃ₐ[ℚ] M) + (a : IdeleGroup K) + (W : HeightOneSpectrum (𝓞 M)) : + (FiniteIdeleGroup.localOrder W + (IdeleGroup.finiteComponent W + (ideleCongr e a))).toAdd = + (FiniteIdeleGroup.localOrder + ((finitePlaceCongr e).symm W) + (IdeleGroup.finiteComponent + ((finitePlaceCongr e).symm W) a)).toAdd := by + let : Algebra K M := e.toRingHom.toAlgebra + let w : HeightOneSpectrum (𝓞 K) := + (finitePlaceCongr e).symm W + have hW : + finitePlaceBelow (K := K) W = w := + finitePlaceBelow_eq_finitePlaceCongr_symm e W + rw [ideleCongr_finiteComponent] + have hr : + w.asIdeal.ramificationIdx' W.asIdeal = 1 := + finitePlaceCongr_ramificationIdx e W + change + (FiniteIdeleGroup.localOrder W + (Units.map + (finitePlaceAdicCompletionMap K M w ⟨W, hW⟩).toMonoidHom + (IdeleGroup.finiteComponent w a))).toAdd = + (FiniteIdeleGroup.localOrder w + (IdeleGroup.finiteComponent w a)).toAdd + simpa only [hr, Nat.cast_one, one_mul] using + localOrder_finitePlaceAdicCompletionMap K M w + ⟨W, hW⟩ + (IdeleGroup.finiteComponent w a) + +/-- An idele is integral at every finite place exactly when its transport +along a number-field equivalence is. -/ +theorem ideleCongr_mem_integralAtFinitePlaces_iff + (e : K ≃ₐ[ℚ] M) + (a : IdeleGroup K) : + ideleCongr e a ∈ + IdeleGroup.integralAtFinitePlaces (K := M) ↔ + a ∈ IdeleGroup.integralAtFinitePlaces (K := K) := by + change + (∀ W : HeightOneSpectrum (𝓞 M), + IdeleGroup.finiteComponent W (ideleCongr e a) ∈ + (W.adicCompletionIntegers M).units) ↔ + ∀ w : HeightOneSpectrum (𝓞 K), + IdeleGroup.finiteComponent w a ∈ + (w.adicCompletionIntegers K).units + constructor + · intro h w + let W : HeightOneSpectrum (𝓞 M) := + finitePlaceCongr e w + apply + (FiniteIdeleGroup.localOrder_eq_zero_iff w + (IdeleGroup.finiteComponent w a)).1 + have horder := ideleCongr_localOrder e a W + rw [show (finitePlaceCongr e).symm W = w by + simp [W]] at horder + rw [← horder] + exact + (FiniteIdeleGroup.localOrder_eq_zero_iff W + (IdeleGroup.finiteComponent W + (ideleCongr e a))).2 (h W) + · intro h W + apply + (FiniteIdeleGroup.localOrder_eq_zero_iff W + (IdeleGroup.finiteComponent W + (ideleCongr e a))).1 + rw [ideleCongr_localOrder] + exact + (FiniteIdeleGroup.localOrder_eq_zero_iff + ((finitePlaceCongr e).symm W) + (IdeleGroup.finiteComponent + ((finitePlaceCongr e).symm W) a)).2 + (h ((finitePlaceCongr e).symm W)) + +/-- Transport along a number-field equivalence identifies the subgroups +of ideles integral at every finite place. -/ +theorem ideleIntegralAtFinitePlaces_map_congr + (e : K ≃ₐ[ℚ] M) : + (IdeleGroup.integralAtFinitePlaces (K := K)).map + (ideleCongr e).toMonoidHom = + IdeleGroup.integralAtFinitePlaces (K := M) := by + ext b + constructor + · rintro ⟨a, ha, rfl⟩ + exact + (ideleCongr_mem_integralAtFinitePlaces_iff + e a).2 ha + · intro hb + let a : IdeleGroup K := (ideleCongr e).symm b + refine ⟨a, ?_, ?_⟩ + · exact + (ideleCongr_mem_integralAtFinitePlaces_iff + e a).1 (by simpa [a] using hb) + · exact (ideleCongr e).apply_symm_apply b + +/-- Transport along a number-field equivalence carries the diagonal idele +to the diagonal idele of the transported field unit. -/ +@[simp] +theorem ideleCongr_principalIdele + (e : K ≃ₐ[ℚ] M) + (x : Kˣ) : + ideleCongr e (IdeleGroup.principalIdele K x) = + IdeleGroup.principalIdele M + (Units.mapEquiv e.toMulEquiv x) := by + apply + (IdeleGroup.equivAdeleRingUnits + (K := M)).injective + apply Units.ext + exact adeleCongr_algebraMap e (x : K) + +/-- The ordinary principal-idele subgroups are identified by transport +along a number-field equivalence. -/ +theorem idelePrincipalSubgroup_map_congr + (e : K ≃ₐ[ℚ] M) : + (IdeleGroup.principalSubgroup K).map + (ideleCongr e) = + IdeleGroup.principalSubgroup M := by + ext y + constructor + · rintro ⟨z, ⟨x, hx⟩, rfl⟩ + rw [← hx] + exact + ⟨Units.mapEquiv e.toMulEquiv x, + (ideleCongr_principalIdele e x).symm⟩ + · rintro ⟨y, rfl⟩ + obtain ⟨x, rfl⟩ := + (Units.mapEquiv e.toMulEquiv).surjective y + exact + ⟨IdeleGroup.principalIdele K x, + ⟨x, rfl⟩, + ideleCongr_principalIdele e x⟩ + +/-- Transport along a number-field equivalence identifies the subgroups +defining the ordinary ideal-class quotients. -/ +theorem ordinaryIdealClassSubgroup_map_congr + (e : K ≃ₐ[ℚ] M) : + (IdeleGroup.ordinaryIdealClassSubgroup (K := K)).map + (ideleCongr e).toMonoidHom = + IdeleGroup.ordinaryIdealClassSubgroup (K := M) := by + rw [IdeleGroup.ordinaryIdealClassSubgroup, + IdeleGroup.ordinaryIdealClassSubgroup, + Subgroup.map_sup, + ideleIntegralAtFinitePlaces_map_congr] + apply congrArg + (fun H => + IdeleGroup.integralAtFinitePlaces (K := M) ⊔ H) + change + (IdeleGroup.principalSubgroup K).map + (ideleCongr e) = + IdeleGroup.principalSubgroup M + exact idelePrincipalSubgroup_map_congr e + +/-- The canonical transport of ordinary idele classes along an equivalence +of number fields. This descends `ideleCongr`; it does not introduce a +second idele-class quotient. -/ +noncomputable def ideleClassCongr + (e : K ≃ₐ[ℚ] M) : + IdeleClassGroup K ≃* IdeleClassGroup M := + QuotientGroup.congr + (IdeleGroup.principalSubgroup K) + (IdeleGroup.principalSubgroup M) + (ideleCongr e) + (idelePrincipalSubgroup_map_congr e) + +/-- The ordinary idele-class transport is induced by `ideleCongr` on +quotient representatives. -/ +theorem ideleClassCongr_mk + (e : K ≃ₐ[ℚ] M) + (a : IdeleGroup K) : + ideleClassCongr e + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup M) + (ideleCongr e a) := + rfl + +/-- The relative-to-ordinary scalar-extension comparison is natural for +transport of relative idèle classes along an equivalence of their top +fields. -/ +theorem + relativeIdeleClassBaseChangeMulEquiv_relativeIdeleClassCongr + (e : K ≃ₐ[ℚ] M) + (c : RelativeIdeleGroup.ClassGroup ℚ K) : + relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := M) + (relativeIdeleClassCongr (K := ℚ) e c) = + ideleClassCongr e + (relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K) c) := by + refine QuotientGroup.induction_on c ?_ + intro a + change + relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := M) + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup ℚ M) + (relativeIdeleCongr (K := ℚ) e a)) = + ideleClassCongr e + (relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K) + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup ℚ K) a)) + rw [relativeIdeleClassBaseChangeMulEquiv_mk, + relativeIdeleClassBaseChangeMulEquiv_mk, + ideleClassCongr_mk, + relativeIdeleBaseChangeMulEquiv_relativeIdeleCongr] + +section GaloisBaseChangeNaturality + +variable {E : Type} [Field E] [NumberField E] [Algebra ℚ E] + +/-- Rational Galois automorphisms act on relative idele classes. -/ +local instance : + MulDistribMulAction (E ≃ₐ[ℚ] E) + (RelativeIdeleGroup.ClassGroup ℚ E) := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction ℚ E + +/-- The actual Galois action on relative idele classes becomes canonical +ordinary idele-class transport under the relative-to-ordinary +scalar-extension comparison. -/ +theorem relativeIdeleClassBaseChangeMulEquiv_smul_congr + (σ : E ≃ₐ[ℚ] E) + (c : RelativeIdeleGroup.ClassGroup ℚ E) : + relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) (σ • c) = + ideleClassCongr σ + (relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) c) := by + refine QuotientGroup.induction_on c ?_ + intro a + change + relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup ℚ E) + (σ • a)) = + ideleClassCongr σ + (relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup ℚ E) a)) + rw [relativeIdeleClassBaseChangeMulEquiv_mk, + relativeIdeleClassBaseChangeMulEquiv_mk, + ideleClassCongr_mk, + relativeIdeleBaseChangeMulEquiv_smul_congr] + +end GaloisBaseChangeNaturality + +/-- On idele class groups, transport identifies the images of the +ordinary ideal-class subgroups. This is the subgroup-level naturality +used by the small Hilbert class field. -/ +theorem ordinaryIdealClassSubgroup_image_map_ideleClassCongr + (e : K ≃ₐ[ℚ] M) : + (Subgroup.map + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K)) + (IdeleGroup.ordinaryIdealClassSubgroup (K := K))).map + (ideleClassCongr e).toMonoidHom = + Subgroup.map + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup M)) + (IdeleGroup.ordinaryIdealClassSubgroup (K := M)) := by + have hcomp : + (ideleClassCongr e).toMonoidHom.comp + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K)) = + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup M)).comp + (ideleCongr e).toMonoidHom := by + ext a + exact ideleClassCongr_mk e a + rw [Subgroup.map_map, hcomp, ← Subgroup.map_map, + ordinaryIdealClassSubgroup_map_congr] + +omit [Algebra ℚ K] in +private theorem + relativeAdeleBaseChangeRingEquiv_self_tmul_one + (a : NumberField.AdeleRing (𝓞 K) K) : + relativeAdeleBaseChangeRingEquiv + (K := K) (L := K) (a ⊗ₜ[K] (1 : K)) = + a := by + apply Prod.ext + · funext W + rw [relativeAdeleBaseChangeRingEquiv_infiniteComponent_tmul] + simp only [map_one, mul_one] + let V := infinitePlaceBelow (K := K) W + have hV : V = W := + infinitePlaceBelow_self (K := K) W + let : W.1.LiesOver V.1 := ⟨rfl⟩ + change + NumberField.LiesOver.completionMap + (v := V) (w := W) (a.1 V) = + a.1 W + subst V + exact + infinitePlaceCompletionMap_self_apply + (K := K) W (a.1 W) + · apply DFunLike.coe_injective + funext W + rw [relativeAdeleBaseChangeRingEquiv_finiteComponent_tmul] + simp only [map_one, mul_one] + let v := finitePlaceBelow (K := K) W + have hv : v = W := + finitePlaceBelow_self (K := K) W + change + finitePlaceAdicCompletionMap K K v + ⟨W, by rfl⟩ (a.2 v) = + a.2 W + subst v + exact + finitePlaceAdicCompletionMap_self_apply + K W (a.2 W) + +omit [Algebra ℚ K] in +private theorem + relativeAdeleBaseChangeRingEquiv_self_symm_apply + (a : NumberField.AdeleRing (𝓞 K) K) : + (relativeAdeleBaseChangeRingEquiv + (K := K) (L := K)).symm a = + a ⊗ₜ[K] (1 : K) := by + apply + (relativeAdeleBaseChangeRingEquiv + (K := K) (L := K)).injective + rw [RingEquiv.apply_symm_apply, + relativeAdeleBaseChangeRingEquiv_self_tmul_one] + +/-- Scalar extension from `ℚ` to a realization algebra-equivalent to +`ℚ` is the canonical transport of ordinary adele rings. -/ +theorem rationalAdeleExtension_eq_adeleCongr + (e : ℚ ≃ₐ[ℚ] M) + (a : NumberField.AdeleRing (𝓞 ℚ) ℚ) : + relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := M) + (RelativeIdeleGroup.adeleInclusion ℚ M a) = + adeleCongr e a := by + change + relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := M) + (a ⊗ₜ[ℚ] (1 : M)) = + relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := M) + (relativeAdeleCongr (K := ℚ) e + ((relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := ℚ)).symm a)) + rw [relativeAdeleBaseChangeRingEquiv_self_symm_apply] + simp only [relativeAdeleCongr_tmul, map_one] + +/-- Scalar extension from `ℚ` to a realization algebra-equivalent to +`ℚ` is the canonical transport of ordinary ideles. -/ +theorem rationalIdeleExtension_eq_ideleCongr + (e : ℚ ≃ₐ[ℚ] M) : + IdeleGroup.extension ℚ M = + (ideleCongr e).toMonoidHom := by + apply MonoidHom.ext + intro a + change + relativeIdeleBaseChangeMulEquiv + (K := ℚ) (L := M) + (RelativeIdeleGroup.inclusion ℚ M a) = + ideleCongr e a + apply + (IdeleGroup.equivAdeleRingUnits + (K := M)).injective + rw [relativeIdeleBaseChangeMulEquiv_eq_ringUnits] + apply Units.ext + exact + rationalAdeleExtension_eq_adeleCongr e + ((IdeleGroup.equivAdeleRingUnits + (K := ℚ) a : + (NumberField.AdeleRing (𝓞 ℚ) ℚ)ˣ) : + NumberField.AdeleRing (𝓞 ℚ) ℚ) + +/-- Scalar extension from `ℚ` to a realization algebra-equivalent to +`ℚ` is the canonical transport of ordinary idele classes. -/ +theorem rationalIdeleClassExtension_eq_ideleClassCongr + (e : ℚ ≃ₐ[ℚ] M) : + ideleClassExtension ℚ M = + (ideleClassCongr e).toMonoidHom := by + apply MonoidHom.ext + intro c + refine QuotientGroup.induction_on c ?_ + intro a + change + QuotientGroup.mk' + (IdeleGroup.principalSubgroup M) + (IdeleGroup.extension ℚ M a) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup M) + (ideleCongr e a) + exact congrArg + (QuotientGroup.mk' (IdeleGroup.principalSubgroup M)) + (DFunLike.congr_fun + (rationalIdeleExtension_eq_ideleCongr e) a) + +section RelativeTowerCongr + +variable + {K L K' L' : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [Field K'] [NumberField K'] + [Field L'] [NumberField L'] [Algebra K' L'] + +/-- The tensor-product map induced by compatible equivalences of both +fields in a finite extension. The coefficient-ring equivalence is kept +explicit so the inverse uses that exact equivalence rather than a second +choice. -/ +noncomputable def relativeAdeleMapOfCompatibleEquiv + (eK : K ≃ₐ[ℚ] K') + (eA : + NumberField.AdeleRing (𝓞 K) K ≃+* + NumberField.AdeleRing (𝓞 K') K') + (hA : ∀ x : K, + eA + (algebraMap K + (NumberField.AdeleRing (𝓞 K) K) x) = + algebraMap K' + (NumberField.AdeleRing (𝓞 K') K') (eK x)) + (eL : L ≃ₐ[ℚ] L') + (hL : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) : + RelativeAdeleRing K L →+* + RelativeAdeleRing K' L' := by + letI : Algebra K (RelativeAdeleRing K' L') := + ((algebraMap K' (RelativeAdeleRing K' L')).comp + eK.toRingHom).toAlgebra + let fA : + NumberField.AdeleRing (𝓞 K) K →ₐ[K] + RelativeAdeleRing K' L' := + { __ := + (RelativeIdeleGroup.adeleInclusion K' L').comp + eA.toRingHom + commutes' := by + intro x + change + RelativeIdeleGroup.adeleInclusion K' L' + (eA + (algebraMap K + (NumberField.AdeleRing (𝓞 K) K) x)) = + algebraMap K' + (RelativeAdeleRing K' L') (eK x) + rw [hA] + simp [RelativeIdeleGroup.adeleInclusion] } + let fL : L →ₐ[K] RelativeAdeleRing K' L' := + { __ := + (RelativeIdeleGroup.fieldInclusion K' L').comp + eL.toRingHom + commutes' := by + intro x + change + RelativeIdeleGroup.fieldInclusion K' L' + (eL (algebraMap K L x)) = + algebraMap K' + (RelativeAdeleRing K' L') (eK x) + rw [hL] + simp [RelativeIdeleGroup.fieldInclusion] } + exact + (Algebra.TensorProduct.lift + fA fL (fun _ _ ↦ Commute.all _ _)).toRingHom + +@[simp] +private theorem relativeAdeleMapOfCompatibleEquiv_tmul + (eK : K ≃ₐ[ℚ] K') + (eA : + NumberField.AdeleRing (𝓞 K) K ≃+* + NumberField.AdeleRing (𝓞 K') K') + (hA : ∀ x : K, + eA + (algebraMap K + (NumberField.AdeleRing (𝓞 K) K) x) = + algebraMap K' + (NumberField.AdeleRing (𝓞 K') K') (eK x)) + (eL : L ≃ₐ[ℚ] L') + (hL : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) + (a : NumberField.AdeleRing (𝓞 K) K) + (x : L) : + relativeAdeleMapOfCompatibleEquiv + eK eA hA eL hL (a ⊗ₜ[K] x) = + eA a ⊗ₜ[K'] eL x := by + change + Algebra.TensorProduct.includeLeft + (R := K') (S := K') + (A := NumberField.AdeleRing (𝓞 K') K') (B := L') + (eA a) * + Algebra.TensorProduct.includeRight + (R := K') + (A := NumberField.AdeleRing (𝓞 K') K') (B := L') + (eL x) = + eA a ⊗ₜ[K'] eL x + rw [Algebra.TensorProduct.includeLeft_apply, + Algebra.TensorProduct.includeRight_apply, + Algebra.TensorProduct.tmul_mul_tmul, + mul_one, one_mul] + +/-- Compatible equivalences of number-field extensions induce the +canonical equivalence of their relative adele rings. -/ +noncomputable def relativeAdeleCongrOfAlgEquiv + (eK : K ≃ₐ[ℚ] K') + (eL : L ≃ₐ[ℚ] L') + (h : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) : + RelativeAdeleRing K L ≃+* + RelativeAdeleRing K' L' := by + let eA := adeleCongr eK + have hA : ∀ x : K, + eA + (algebraMap K + (NumberField.AdeleRing (𝓞 K) K) x) = + algebraMap K' + (NumberField.AdeleRing (𝓞 K') K') (eK x) := + adeleCongr_algebraMap eK + have hA' : ∀ x : K', + eA.symm + (algebraMap K' + (NumberField.AdeleRing (𝓞 K') K') x) = + algebraMap K + (NumberField.AdeleRing (𝓞 K) K) + (eK.symm x) := by + intro x + apply eA.injective + calc + eA + (eA.symm + (algebraMap K' + (NumberField.AdeleRing (𝓞 K') K') x)) = + algebraMap K' + (NumberField.AdeleRing (𝓞 K') K') x := + eA.apply_symm_apply _ + _ = + algebraMap K' + (NumberField.AdeleRing (𝓞 K') K') + (eK (eK.symm x)) := by + rw [eK.apply_symm_apply] + _ = + eA + (algebraMap K + (NumberField.AdeleRing (𝓞 K) K) + (eK.symm x)) := + (hA (eK.symm x)).symm + have h' : ∀ x : K', + eL.symm (algebraMap K' L' x) = + algebraMap K L (eK.symm x) := by + intro x + apply eL.injective + calc + eL (eL.symm (algebraMap K' L' x)) = + algebraMap K' L' x := + eL.apply_symm_apply _ + _ = algebraMap K' L' (eK (eK.symm x)) := by + rw [eK.apply_symm_apply] + _ = eL (algebraMap K L (eK.symm x)) := + (h (eK.symm x)).symm + let f := + relativeAdeleMapOfCompatibleEquiv + eK eA hA eL h + let g := + relativeAdeleMapOfCompatibleEquiv + eK.symm eA.symm hA' eL.symm h' + exact + { f with + invFun := g + left_inv := by + intro z + induction z using TensorProduct.inductionOn with + | add x y hx hy => + calc + g (f (x + y)) = + g (f x + f y) := + congrArg g (map_add f x y) + _ = g (f x) + g (f y) := + map_add g (f x) (f y) + _ = x + y := + congrArg₂ (· + ·) hx hy + | tmul a x => + calc + g (f (a ⊗ₜ[K] x)) = + g (eA a ⊗ₜ[K'] eL x) := + congrArg g + (relativeAdeleMapOfCompatibleEquiv_tmul + eK eA hA eL h a x) + _ = eA.symm (eA a) ⊗ₜ[K] eL.symm (eL x) := + relativeAdeleMapOfCompatibleEquiv_tmul + eK.symm eA.symm hA' eL.symm h' + (eA a) (eL x) + _ = a ⊗ₜ[K] x := by simp + right_inv := by + intro z + induction z using TensorProduct.inductionOn with + | add x y hx hy => + calc + f (g (x + y)) = + f (g x + g y) := + congrArg f (map_add g x y) + _ = f (g x) + f (g y) := + map_add f (g x) (g y) + _ = x + y := + congrArg₂ (· + ·) hx hy + | tmul a x => + calc + f (g (a ⊗ₜ[K'] x)) = + f (eA.symm a ⊗ₜ[K] eL.symm x) := + congrArg f + (relativeAdeleMapOfCompatibleEquiv_tmul + eK.symm eA.symm hA' eL.symm h' a x) + _ = eA (eA.symm a) ⊗ₜ[K'] eL (eL.symm x) := + relativeAdeleMapOfCompatibleEquiv_tmul + eK eA hA eL h (eA.symm a) (eL.symm x) + _ = a ⊗ₜ[K'] x := by simp } + +@[simp] +theorem relativeAdeleCongrOfAlgEquiv_tmul + (eK : K ≃ₐ[ℚ] K') + (eL : L ≃ₐ[ℚ] L') + (h : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) + (a : NumberField.AdeleRing (𝓞 K) K) + (x : L) : + relativeAdeleCongrOfAlgEquiv eK eL h + (a ⊗ₜ[K] x) = + adeleCongr eK a ⊗ₜ[K'] eL x := + relativeAdeleMapOfCompatibleEquiv_tmul + eK (adeleCongr eK) + (adeleCongr_algebraMap eK) eL h a x + +/-- Compatible equivalences of number-field extensions induce the +canonical equivalence of their relative idele groups. -/ +noncomputable def relativeIdeleCongrOfAlgEquiv + (eK : K ≃ₐ[ℚ] K') + (eL : L ≃ₐ[ℚ] L') + (h : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) : + RelativeIdeleGroup K L ≃* + RelativeIdeleGroup K' L' := + Units.mapEquiv + (relativeAdeleCongrOfAlgEquiv eK eL h).toMulEquiv + +@[simp] +theorem relativeIdeleCongrOfAlgEquiv_principalIdele + (eK : K ≃ₐ[ℚ] K') + (eL : L ≃ₐ[ℚ] L') + (h : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) + (x : Lˣ) : + relativeIdeleCongrOfAlgEquiv eK eL h + (RelativeIdeleGroup.principalIdele K L x) = + RelativeIdeleGroup.principalIdele K' L' + (Units.mapEquiv eL.toMulEquiv x) := by + apply Units.ext + change + relativeAdeleCongrOfAlgEquiv eK eL h + ((1 : NumberField.AdeleRing (𝓞 K) K) ⊗ₜ[K] (x : L)) = + (1 : NumberField.AdeleRing (𝓞 K') K') ⊗ₜ[K'] eL (x : L) + rw [relativeAdeleCongrOfAlgEquiv_tmul] + simp + +/-- The semilinear relative-idele transport identifies the principal +subgroups. -/ +theorem relativeIdelePrincipalSubgroup_map_congrOfAlgEquiv + (eK : K ≃ₐ[ℚ] K') + (eL : L ≃ₐ[ℚ] L') + (h : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) : + (RelativeIdeleGroup.principalSubgroup K L).map + (relativeIdeleCongrOfAlgEquiv eK eL h) = + RelativeIdeleGroup.principalSubgroup K' L' := by + ext y + constructor + · rintro ⟨z, ⟨x, hx⟩, rfl⟩ + rw [← hx] + exact + ⟨Units.mapEquiv eL.toMulEquiv x, + (relativeIdeleCongrOfAlgEquiv_principalIdele + eK eL h x).symm⟩ + · rintro ⟨y, rfl⟩ + obtain ⟨x, rfl⟩ := + (Units.mapEquiv eL.toMulEquiv).surjective y + exact + ⟨RelativeIdeleGroup.principalIdele K L x, + ⟨x, rfl⟩, + relativeIdeleCongrOfAlgEquiv_principalIdele + eK eL h x⟩ + +/-- Compatible equivalences of number-field extensions induce the +canonical equivalence of their existing relative idele class groups. -/ +noncomputable def relativeIdeleClassCongrOfAlgEquiv + (eK : K ≃ₐ[ℚ] K') + (eL : L ≃ₐ[ℚ] L') + (h : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) : + RelativeIdeleGroup.ClassGroup K L ≃* + RelativeIdeleGroup.ClassGroup K' L' := + QuotientGroup.congr + (RelativeIdeleGroup.principalSubgroup K L) + (RelativeIdeleGroup.principalSubgroup K' L') + (relativeIdeleCongrOfAlgEquiv eK eL h) + (relativeIdelePrincipalSubgroup_map_congrOfAlgEquiv + eK eL h) + +theorem relativeIdeleClassCongrOfAlgEquiv_mk + (eK : K ≃ₐ[ℚ] K') + (eL : L ≃ₐ[ℚ] L') + (h : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) + (a : RelativeIdeleGroup K L) : + relativeIdeleClassCongrOfAlgEquiv eK eL h + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) a) = + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K' L') + (relativeIdeleCongrOfAlgEquiv eK eL h a) := + rfl + +section Norm + +variable + [FiniteDimensional K L] + [FiniteDimensional K' L'] + +omit [FiniteDimensional K L] [FiniteDimensional K' L'] in +/-- Determinant norms on relative adele rings commute with compatible +equivalences of both fields in the extension. -/ +theorem relativeAdeleCongrOfAlgEquiv_norm + (eK : K ≃ₐ[ℚ] K') + (eL : L ≃ₐ[ℚ] L') + (h : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) + (z : RelativeAdeleRing K L) : + adeleCongr eK + (Algebra.norm + (NumberField.AdeleRing (𝓞 K) K) z) = + Algebra.norm + (NumberField.AdeleRing (𝓞 K') K') + (relativeAdeleCongrOfAlgEquiv eK eL h z) := by + have hcompat : + (algebraMap + (NumberField.AdeleRing (𝓞 K') K') + (RelativeAdeleRing K' L')).comp + (adeleCongr eK).toRingHom = + (relativeAdeleCongrOfAlgEquiv eK eL h).toRingHom.comp + (algebraMap + (NumberField.AdeleRing (𝓞 K) K) + (RelativeAdeleRing K L)) := by + ext a + change + (adeleCongr eK a) ⊗ₜ[K'] (1 : L') = + relativeAdeleCongrOfAlgEquiv eK eL h + (a ⊗ₜ[K] (1 : L)) + rw [relativeAdeleCongrOfAlgEquiv_tmul] + simp + have hnorm := + Algebra.norm_eq_of_equiv_equiv + (adeleCongr eK) + (relativeAdeleCongrOfAlgEquiv eK eL h) + hcompat z + simpa using congrArg (adeleCongr eK) hnorm + +omit [FiniteDimensional K L] [FiniteDimensional K' L'] in +/-- The relative idele norm commutes with compatible equivalences of +number-field extensions. -/ +theorem relativeIdeleCongrOfAlgEquiv_norm + (eK : K ≃ₐ[ℚ] K') + (eL : L ≃ₐ[ℚ] L') + (h : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) + (a : RelativeIdeleGroup K L) : + ideleCongr eK (RelativeIdeleGroup.norm K L a) = + RelativeIdeleGroup.norm K' L' + (relativeIdeleCongrOfAlgEquiv eK eL h a) := by + apply + (IdeleGroup.equivAdeleRingUnits + (K := K')).injective + apply Units.ext + exact + relativeAdeleCongrOfAlgEquiv_norm + eK eL h (a : RelativeAdeleRing K L) + +variable [IsGalois K L] [IsGalois K' L'] + +omit [IsGalois K L] [IsGalois K' L'] in +/-- The descended relative idele-class norm commutes with compatible +equivalences of number-field extensions. -/ +theorem relativeIdeleClassCongrOfAlgEquiv_ideleClassNorm + (eK : K ≃ₐ[ℚ] K') + (eL : L ≃ₐ[ℚ] L') + (h : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) + (c : RelativeIdeleGroup.ClassGroup K L) : + ideleClassCongr eK + (RelativeIdeleGroup.classNorm K L c) = + RelativeIdeleGroup.classNorm K' L' + (relativeIdeleClassCongrOfAlgEquiv + eK eL h c) := by + refine QuotientGroup.induction_on c ?_ + intro a + exact congrArg + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K')) + (relativeIdeleCongrOfAlgEquiv_norm eK eL h a) + +omit [IsGalois K L] [IsGalois K' L'] in +/-- Under compatible equivalences of number-field extensions, the +relative class-norm subgroup is carried exactly to the relative +class-norm subgroup of the transported extension. -/ +theorem relativeIdeleClassNorm_range_map_congrOfAlgEquiv + (eK : K ≃ₐ[ℚ] K') + (eL : L ≃ₐ[ℚ] L') + (h : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) : + (RelativeIdeleGroup.classNorm K L).range.map + (ideleClassCongr eK).toMonoidHom = + (RelativeIdeleGroup.classNorm K' L').range := by + ext c + constructor + · rintro ⟨_, ⟨d, rfl⟩, rfl⟩ + exact + ⟨relativeIdeleClassCongrOfAlgEquiv + eK eL h d, + (relativeIdeleClassCongrOfAlgEquiv_ideleClassNorm + eK eL h d).symm⟩ + · rintro ⟨d, rfl⟩ + let c := + (relativeIdeleClassCongrOfAlgEquiv + eK eL h).symm d + refine + ⟨RelativeIdeleGroup.classNorm K L c, + ⟨c, rfl⟩, ?_⟩ + simpa [c] using + (relativeIdeleClassCongrOfAlgEquiv_ideleClassNorm + eK eL h c) + +omit [FiniteDimensional K L] [FiniteDimensional K' L'] + [IsGalois K L] [IsGalois K' L'] in +/-- Under compatible equivalences of finite Galois number-field +extensions, the ordinary class-norm subgroup is carried exactly to the +ordinary class-norm subgroup of the transported extension. -/ +theorem ordinaryIdeleClassNorm_range_map_congrOfAlgEquiv + (eK : K ≃ₐ[ℚ] K') + (eL : L ≃ₐ[ℚ] L') + (h : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) : + (_root_.ideleClassNorm K L).range.map + (ideleClassCongr eK).toMonoidHom = + (_root_.ideleClassNorm K' L').range := by + rw [ordinaryIdeleClassNorm_range_eq_relative + (K := K) (L := L), + ordinaryIdeleClassNorm_range_eq_relative + (K := K') (L := L')] + exact + relativeIdeleClassNorm_range_map_congrOfAlgEquiv + eK eL h + +-- Fix the canonical commutativity proof used by the norm-range quotients. +local instance normIdeleClassGroup_isMulCommutative + (F : Type) [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + IsMulCommutative.of_comm (fun a b => mul_comm a b) + +/-- Compatible equivalences of finite Galois number-field extensions +induce the canonical equivalence of their ordinary idele-class norm +quotients. -/ +noncomputable def ordinaryIdeleClassNormQuotientCongrOfAlgEquiv + (eK : K ≃ₐ[ℚ] K') + (eL : L ≃ₐ[ℚ] L') + (h : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≃* + (IdeleClassGroup K' ⧸ + (_root_.ideleClassNorm K' L').range) := + QuotientGroup.congr + (_root_.ideleClassNorm K L).range + (_root_.ideleClassNorm K' L').range + (ideleClassCongr eK) + (ordinaryIdeleClassNorm_range_map_congrOfAlgEquiv + eK eL h) + +omit [FiniteDimensional K L] [FiniteDimensional K' L'] + [IsGalois K L] [IsGalois K' L'] in +/-- On an ordinary idele-class representative, transport of norm +quotients is induced by the existing idele-class transport. -/ +theorem ordinaryIdeleClassNormQuotientCongrOfAlgEquiv_mk + (eK : K ≃ₐ[ℚ] K') + (eL : L ≃ₐ[ℚ] L') + (h : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) + (c : IdeleClassGroup K) : + ordinaryIdeleClassNormQuotientCongrOfAlgEquiv + eK eL h + (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range c) = + QuotientGroup.mk' + (_root_.ideleClassNorm K' L').range + (ideleClassCongr eK c) := + rfl + +end Norm + +end RelativeTowerCongr diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivAdeleTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivAdeleTopology.lean new file mode 100644 index 0000000000..fd1382da19 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivAdeleTopology.lean @@ -0,0 +1,86 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.InfiniteAlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivFiniteIntegral +/-! +# Continuity of adelic transport under a number-field equivalence + +The archimedean factor is a product of continuous completion maps. The +finite factor is a continuous map of restricted products because each +completion map preserves the local valuation subring. +-/ + +@[expose] public section + +open scoped NumberField RestrictedProduct +open NumberField IsDedekindDomain + +noncomputable +section + +universe u v + +variable {K : Type u} {M : Type v} + [Field K] [NumberField K] [Algebra ℚ K] + [Field M] [NumberField M] [Algebra ℚ M] + +/-- The existing algebraic transport of adeles is continuous. -/ +theorem continuous_adeleCongr (e : K ≃ₐ[ℚ] M) : + Continuous (adeleCongr e) := by + let f : HeightOneSpectrum (𝓞 M) → HeightOneSpectrum (𝓞 K) := + (finitePlaceCongr e).symm + have hf : Filter.Tendsto f Filter.cofinite Filter.cofinite := + (finitePlaceCongr e).symm.injective.tendsto_cofinite + let φ : (W : HeightOneSpectrum (𝓞 M)) → + (f W).adicCompletion K → W.adicCompletion M := + fun W => finitePlaceAdicCompletionCongrHom e W + have hφ : ∀ᶠ W : HeightOneSpectrum (𝓞 M) in Filter.cofinite, + Set.MapsTo (φ W) + ((f W).adicCompletionIntegers K : Set ((f W).adicCompletion K)) + (W.adicCompletionIntegers M : Set (W.adicCompletion M)) := + Filter.Eventually.of_forall (fun W => + finitePlaceAdicCompletionCongrHom_mapsToIntegers e W) + let transport : FiniteAdeleRing (𝓞 K) K → FiniteAdeleRing (𝓞 M) M := + RestrictedProduct.mapAlong + (fun w : HeightOneSpectrum (𝓞 K) => w.adicCompletion K) + (fun W : HeightOneSpectrum (𝓞 M) => W.adicCompletion M) + f hf φ hφ + have htransport : Continuous transport := + RestrictedProduct.mapAlong_continuous + (fun w : HeightOneSpectrum (𝓞 K) => w.adicCompletion K) + (fun W : HeightOneSpectrum (𝓞 M) => W.adicCompletion M) + f hf φ hφ + (fun W => finitePlaceAdicCompletionCongrHom_continuous e W) + have hfinite : Continuous + (fun a : NumberField.AdeleRing (𝓞 K) K => (adeleCongr e a).2) := by + have hsource : Continuous + (fun a : NumberField.AdeleRing (𝓞 K) K => a.2) := + continuous_snd + refine (htransport.comp hsource).congr ?_ + intro a + apply DFunLike.coe_injective + funext W + change finitePlaceAdicCompletionCongrHom e W + (a.2 ((finitePlaceCongr e).symm W)) = + (adeleCongr e a).2 W + exact (adeleCongr_finiteComponent e a W).symm + have hinfinite : Continuous + (fun a : NumberField.AdeleRing (𝓞 K) K => (adeleCongr e a).1) := by + apply continuous_pi + intro W + have hsource : Continuous + (fun a : NumberField.AdeleRing (𝓞 K) K => + a.1 ((ClassFieldTheory.infinitePlaceEquivOfRingEquiv + e.toRingEquiv).symm W)) := + (continuous_apply _).comp continuous_fst + exact ((infinitePlaceCompletionCongrHom_continuous e W).comp hsource).congr + (fun a => (adeleCongr_infiniteComponent e a W).symm) + exact hinfinite.prodMk hfinite + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivFiniteIntegral.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivFiniteIntegral.lean new file mode 100644 index 0000000000..402d7510e4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivFiniteIntegral.lean @@ -0,0 +1,62 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison +/-! +# Integral finite completions under a number-field equivalence + +The finite-completion map associated with a field equivalence preserves +the local valuation subring. This is the restricted-product compatibility +needed for continuity of adelic transport. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +universe u v + +variable {K : Type u} {M : Type v} + [Field K] [NumberField K] [Algebra ℚ K] + [Field M] [NumberField M] [Algebra ℚ M] + +/-- Corresponding finite-completion maps carry local integers to local +integers. -/ +theorem finitePlaceAdicCompletionCongrHom_mapsToIntegers + (e : K ≃ₐ[ℚ] M) (W : HeightOneSpectrum (𝓞 M)) : + Set.MapsTo (finitePlaceAdicCompletionCongrHom e W) + (((finitePlaceCongr e).symm W).adicCompletionIntegers K : + Set (((finitePlaceCongr e).symm W).adicCompletion K)) + (W.adicCompletionIntegers M : Set (W.adicCompletion M)) := by + intro x hx + let : Algebra K M := e.toRingHom.toAlgebra + let w := (finitePlaceCongr e).symm W + have hKM : finitePlaceBelow (K := K) W = w := by + apply HeightOneSpectrum.ext + rfl + let W' : {W : HeightOneSpectrum (𝓞 M) // + finitePlaceBelow (K := K) W = w} := ⟨W, hKM⟩ + let : W.asIdeal.LiesOver w.asIdeal := by + constructor + exact congrArg HeightOneSpectrum.asIdeal hKM.symm + have he : w.asIdeal.ramificationIdx' W.asIdeal ≠ 0 := + Ideal.IsDedekindDomain.ramificationIdx'_ne_zero_of_liesOver + W.asIdeal w.ne_bot + change finitePlaceAdicCompletionMap K M w W' x ∈ + W.adicCompletionIntegers M + change Valued.v x ≤ 1 at hx + change Valued.v (finitePlaceAdicCompletionMap K M w W' x) ≤ 1 + rw [finitePlaceAdicCompletionMap_valued K M w W' x] + exact (pow_le_one_iff he).mpr hx + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivIdeleClassTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivIdeleClassTopology.lean new file mode 100644 index 0000000000..036d7aab29 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivIdeleClassTopology.lean @@ -0,0 +1,99 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivAdeleTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FiniteMathlibTopologyComparison +public import Mathlib.Topology.Algebra.Group.Quotient +public import Mathlib.Topology.Algebra.Group.Units +/-! +# Idèle and idèle-class transport under a number-field equivalence + +The continuous adele-ring transport induces continuous transport of units +and then of the quotient by principal idèles. These topological equivalences +have the previously defined algebraic maps as their underlying maps. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +universe u v + +variable {K : Type u} {M : Type v} + [Field K] [NumberField K] [Algebra ℚ K] + [Field M] [NumberField M] [Algebra ℚ M] + +/-- Reversing the field equivalence reverses the adelic transport. -/ +theorem adeleCongr_symm (e : K ≃ₐ[ℚ] M) : + (adeleCongr e).symm = adeleCongr e.symm := by + rfl + +/-- Adelic field-isomorphism transport is a topological group equivalence. -/ +noncomputable def adeleCongrContinuousMulEquiv (e : K ≃ₐ[ℚ] M) : + NumberField.AdeleRing (𝓞 K) K ≃ₜ* + NumberField.AdeleRing (𝓞 M) M := by + refine + { toMulEquiv := (adeleCongr e).toMulEquiv + continuous_toFun := continuous_adeleCongr e + continuous_invFun := ?_ } + change Continuous ((adeleCongr e).symm) + rw [adeleCongr_symm] + exact continuous_adeleCongr e.symm + +/-- The existing idèle transport is an equivalence of topological groups. -/ +noncomputable def ideleCongrContinuousMulEquiv (e : K ≃ₐ[ℚ] M) : + IdeleGroup K ≃ₜ* IdeleGroup M := + (IdeleGroup.equivAdeleRingUnitsContinuousMulEquiv K).trans + ((Units.mapContinuousMulEquiv (adeleCongrContinuousMulEquiv e)).trans + (IdeleGroup.equivAdeleRingUnitsContinuousMulEquiv M).symm) + +/-- The topological and algebraic transports of idèles agree. -/ +@[simp] +theorem ideleCongrContinuousMulEquiv_apply + (e : K ≃ₐ[ℚ] M) (a : IdeleGroup K) : + ideleCongrContinuousMulEquiv e a = ideleCongr e a := + rfl + +/-- The existing idèle-class transport is an equivalence of topological +groups. -/ +noncomputable def ideleClassCongrContinuousMulEquiv + (e : K ≃ₐ[ℚ] M) : + IdeleClassGroup K ≃ₜ* IdeleClassGroup M := by + refine + { toMulEquiv := ideleClassCongr e + continuous_toFun := ?_ + continuous_invFun := ?_ } + · apply (QuotientGroup.isQuotientMap_mk + (IdeleGroup.principalSubgroup K)).continuous_iff.mpr + have h : Continuous (fun a : IdeleGroup K => + QuotientGroup.mk' (IdeleGroup.principalSubgroup M) + (ideleCongr e a)) := + QuotientGroup.continuous_mk.comp + (ideleCongrContinuousMulEquiv e).continuous + exact h.congr (fun a => (ideleClassCongr_mk e a).symm) + · apply (QuotientGroup.isQuotientMap_mk + (IdeleGroup.principalSubgroup M)).continuous_iff.mpr + have h : Continuous (fun a : IdeleGroup M => + QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + ((ideleCongr e).symm a)) := + QuotientGroup.continuous_mk.comp + (ideleCongrContinuousMulEquiv e).symm.continuous + exact h.congr (fun _ => rfl) + +/-- The topological and algebraic transports of idèle classes agree. -/ +@[simp] +theorem ideleClassCongrContinuousMulEquiv_apply + (e : K ≃ₐ[ℚ] M) (a : IdeleClassGroup K) : + ideleClassCongrContinuousMulEquiv e a = ideleClassCongr e a := + rfl + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivTopology.lean new file mode 100644 index 0000000000..da3da05893 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivTopology.lean @@ -0,0 +1,38 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionMap +/-! +# Local continuity for transport under a number-field equivalence + +The finite-completion map used by `adeleCongr` is continuous. This is the +local continuity input for transporting the restricted-product topology. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +universe u v + +variable {K : Type u} {M : Type v} + [Field K] [NumberField K] [Algebra ℚ K] + [Field M] [NumberField M] [Algebra ℚ M] + +/-- Field-isomorphism transport is continuous on each finite completion. -/ +theorem finitePlaceAdicCompletionCongrHom_continuous + (e : K ≃ₐ[ℚ] M) (W : HeightOneSpectrum (𝓞 M)) : + Continuous (finitePlaceAdicCompletionCongrHom e W) := by + let : Algebra K M := e.toRingHom.toAlgebra + unfold finitePlaceAdicCompletionCongrHom + exact finitePlaceAdicCompletionMap_continuous K M _ _ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/All.lean new file mode 100644 index 0000000000..64ca6175b6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/All.lean @@ -0,0 +1,31 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivAdeleTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivFiniteIntegral +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivIdeleClassTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.ConnectedComponentQuotientCongr +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.InfiniteAlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibTopologyComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +/-! +# Idelic class groups + +Public aggregate for the ordinary ideal class quotient of the ideles and its +base-change, norm-comparison, tower, and algebra-equivalence constructions. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/BaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/BaseChange.lean new file mode 100644 index 0000000000..e0781ef8b9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/BaseChange.lean @@ -0,0 +1,423 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent +public import Mathlib.RingTheory.IsTensorProduct +/-! +# Base change of idele-class norms along a pushout square + +For a pushout square of finite extensions + +``` +K ─→ M +│ │ +↓ ↓ +L ─→ N +``` + +this file constructs the maps on relative ideles and idele classes +that occur after adjoining roots of unity. +Keeping the bottom adele ring fixed makes the norm square an actual +determinant-norm base-change identity. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField + +noncomputable +section + +universe u + +variable + (K M L N : Type u) + [Field K] [NumberField K] + [Field M] [NumberField M] + [Field L] [NumberField L] + [Field N] [NumberField N] + [Algebra K M] [Algebra K L] + [Algebra M N] [Algebra L N] [Algebra K N] + [IsScalarTower K M N] [IsScalarTower K L N] + [Algebra.IsPushout K M L N] + [FiniteDimensional K M] [FiniteDimensional K L] + [FiniteDimensional M N] [FiniteDimensional L N] + +-- These canonical commutativity proofs are local to the imported tower +-- module; retain them here for the quotient-group instances. +local instance (A B C : Type u) [Field A] [NumberField A] + [Field B] [Field C] [Algebra A B] [Algebra B C] : + IsMulCommutative (TowerRelativeIdeleGroup A B C) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +local instance (A B : Type u) [Field A] [NumberField A] + [Field B] [Algebra A B] : + IsMulCommutative (RelativeIdeleGroup.ClassGroup A B) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +local instance (A : Type u) [Field A] [NumberField A] : + IsMulCommutative (IdeleClassGroup A) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +/-- The scalar extension of the one-step `K`-presentation of the +relative adeles of `L` from the bottom adele ring to +`𝔸_K ⊗[K] M`. -/ +abbrev BaseChangedRelativeAdeleRing := + RelativeAdeleRing K M ⊗[K] L + +/-- For a pushout `N = M ⊗[K] L`, the tower presentation + +`(𝔸_K ⊗[K] M) ⊗[M] N` + +is canonically the scalar extension + +`(𝔸_K ⊗[K] M) ⊗[K] L`. +-/ +def pushoutTowerAdeleEquiv : + TowerRelativeAdeleRing K M N ≃ₐ[RelativeAdeleRing K M] + BaseChangedRelativeAdeleRing K M L := by + letI : Algebra N (TowerRelativeAdeleRing K M N) := + Algebra.TensorProduct.rightAlgebra + letI : Algebra L (BaseChangedRelativeAdeleRing K M L) := + Algebra.TensorProduct.rightAlgebra + letI : Algebra.IsPushout K L M N := + Algebra.IsPushout.symm + (inferInstance : Algebra.IsPushout K M L N) + let e₁ := + (Algebra.TensorProduct.commRight + M N (RelativeAdeleRing K M)).symm + let e₂ := + Algebra.IsPushout.cancelBaseChangeAlg + K L M N (RelativeAdeleRing K M) + let e₃ := + Algebra.TensorProduct.commRight + K L (RelativeAdeleRing K M) + refine + { e₁.toRingEquiv.trans + (e₂.toRingEquiv.trans e₃.toRingEquiv) with + commutes' := ?_ } + intro a + simp [e₁, e₂, e₃] + +/-- Scalar extension of coefficients from the bottom adele ring to +`𝔸_K ⊗[K] M`, while retaining the top field `L`. -/ +def baseChangedRelativeAdeleMap : + RelativeAdeleRing K L →ₐ[K] + BaseChangedRelativeAdeleRing K M L := + Algebra.TensorProduct.map + (Algebra.TensorProduct.includeLeft + (R := K) (S := K) + (A := NumberField.AdeleRing (𝓞 K) K) (B := M)) + (AlgHom.id K L) + +/-- Inclusion from the relative adeles of `L/K` to the tower +presentation of the relative adeles of `N/M`, induced by the pushout +square. -/ +def pushoutTowerAdeleInclusion : + RelativeAdeleRing K L →+* + TowerRelativeAdeleRing K M N := + (pushoutTowerAdeleEquiv K M L N).symm.toRingHom.comp + (baseChangedRelativeAdeleMap K M L).toRingHom + +omit [NumberField M] [NumberField L] [NumberField N] + [FiniteDimensional K M] [FiniteDimensional K L] + [FiniteDimensional M N] [FiniteDimensional L N] in +@[simp] +theorem pushoutTowerAdeleInclusion_tmul + (a : NumberField.AdeleRing (𝓞 K) K) + (x : L) : + pushoutTowerAdeleInclusion K M L N (a ⊗ₜ[K] x) = + (a ⊗ₜ[K] (1 : M)) ⊗ₜ[M] + algebraMap L N x := by + let : Algebra N (RelativeAdeleRing K M ⊗[M] N) := + Algebra.TensorProduct.rightAlgebra + let : Algebra L (RelativeAdeleRing K M ⊗[K] L) := + Algebra.TensorProduct.rightAlgebra + have : Algebra.IsPushout K L M N := + Algebra.IsPushout.symm + (inferInstance : Algebra.IsPushout K M L N) + change + Algebra.TensorProduct.commRight M N (RelativeAdeleRing K M) + ((Algebra.IsPushout.cancelBaseChangeAlg + K L M N (RelativeAdeleRing K M)).symm + ((Algebra.TensorProduct.commRight + K L (RelativeAdeleRing K M)).symm + ((a ⊗ₜ[K] (1 : M)) ⊗ₜ[K] x))) = + (a ⊗ₜ[K] (1 : M)) ⊗ₜ[M] algebraMap L N x + simp only [Algebra.TensorProduct.commRight_symm_tmul, + Algebra.IsPushout.cancelBaseChangeAlg_symm_tmul, + Algebra.TensorProduct.commRight_tmul] + +/-- Inclusion on unit groups induced by a pushout square of fields. -/ +def pushoutTowerIdeleInclusion : + RelativeIdeleGroup K L →* + TowerRelativeIdeleGroup K M N := + Units.map (pushoutTowerAdeleInclusion K M L N) + +omit [NumberField M] [NumberField L] [NumberField N] + [FiniteDimensional K M] [FiniteDimensional K L] + [FiniteDimensional M N] [FiniteDimensional L N] in +/-- The pushout inclusion sends a principal idele of `L` to the +principal idele of its image in `N`. -/ +@[simp] +theorem pushoutTowerIdeleInclusion_principalIdele + (x : Lˣ) : + pushoutTowerIdeleInclusion K M L N + (RelativeIdeleGroup.principalIdele K L x) = + TowerRelativeIdeleGroup.principalIdele K M N + (Units.map (algebraMap L N) x) := by + apply Units.ext + change + pushoutTowerAdeleInclusion K M L N + ((1 : NumberField.AdeleRing (𝓞 K) K) ⊗ₜ[K] (x : L)) = + (1 : RelativeAdeleRing K M) ⊗ₜ[M] + algebraMap L N (x : L) + rw [pushoutTowerAdeleInclusion_tmul] + rfl + +omit [NumberField M] [NumberField L] [NumberField N] + [FiniteDimensional K M] [FiniteDimensional M N] + [FiniteDimensional L N] in +/-- Determinant norms commute with the pushout inclusion. This is the +idele-level norm square used after adjoining roots of unity. -/ +theorem pushoutTowerIdeleNorm_inclusion + (a : RelativeIdeleGroup K L) : + TowerRelativeIdeleGroup.norm K M N + (pushoutTowerIdeleInclusion K M L N a) = + RelativeIdeleGroup.inclusion K M + (RelativeIdeleGroup.norm K L a) := by + apply Units.ext + let f : + NumberField.AdeleRing (𝓞 K) K →ₐ[K] + RelativeAdeleRing K M := + Algebra.TensorProduct.includeLeft + (R := K) (S := K) + (A := NumberField.AdeleRing (𝓞 K) K) (B := M) + change + Algebra.norm (RelativeAdeleRing K M) + (pushoutTowerAdeleInclusion K M L N + (a : RelativeAdeleRing K L)) = + f (Algebra.norm + (NumberField.AdeleRing (𝓞 K) K) + (a : RelativeAdeleRing K L)) + calc + _ = Algebra.norm (RelativeAdeleRing K M) + (pushoutTowerAdeleEquiv K M L N + (pushoutTowerAdeleInclusion K M L N + (a : RelativeAdeleRing K L))) := + (Algebra.norm_eq_of_algEquiv + (pushoutTowerAdeleEquiv K M L N) + (pushoutTowerAdeleInclusion K M L N + (a : RelativeAdeleRing K L))).symm + _ = Algebra.norm (RelativeAdeleRing K M) + (baseChangedRelativeAdeleMap K M L + (a : RelativeAdeleRing K L)) := by + simp [pushoutTowerAdeleInclusion] + _ = f (Algebra.norm + (NumberField.AdeleRing (𝓞 K) K) + (a : RelativeAdeleRing K L)) := + (map_norm_tensorProduct_baseChange + (K := K) (L := L) f + (a : RelativeAdeleRing K L)).symm + +/-- The pushout inclusion descended to relative idele class groups. -/ +def pushoutTowerClassInclusion : + RelativeIdeleGroup.ClassGroup K L →* + TowerRelativeIdeleGroup.ClassGroup K M N := + QuotientGroup.map + (RelativeIdeleGroup.principalSubgroup K L) + (TowerRelativeIdeleGroup.principalSubgroup K M N) + (pushoutTowerIdeleInclusion K M L N) + (by + rintro _ ⟨x, rfl⟩ + exact + ⟨Units.map (algebraMap L N) x, + (pushoutTowerIdeleInclusion_principalIdele + K M L N x).symm⟩) + +omit [NumberField M] [NumberField L] [NumberField N] + [FiniteDimensional K M] [FiniteDimensional K L] + [FiniteDimensional M N] [FiniteDimensional L N] in +theorem pushoutTowerClassInclusion_mk + (a : RelativeIdeleGroup K L) : + pushoutTowerClassInclusion K M L N + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) a) = + QuotientGroup.mk' + (TowerRelativeIdeleGroup.principalSubgroup K M N) + (pushoutTowerIdeleInclusion K M L N a) := + rfl + +omit [NumberField M] [NumberField L] [NumberField N] + [FiniteDimensional K M] [FiniteDimensional L N] in +/-- The determinant-norm square after adjoining the pushout field, +descended to actual relative idele class groups. -/ +theorem pushoutTowerClassNorm_inclusion + (c : RelativeIdeleGroup.ClassGroup K L) : + TowerRelativeIdeleGroup.classNorm K M N + (pushoutTowerClassInclusion K M L N c) = + RelativeIdeleGroup.classInclusion K M + (RelativeIdeleGroup.classNorm K L c) := by + refine QuotientGroup.induction_on c ?_ + intro a + change + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K M) + (TowerRelativeIdeleGroup.norm K M N + (pushoutTowerIdeleInclusion K M L N a)) = + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K M) + (RelativeIdeleGroup.inclusion K M + (RelativeIdeleGroup.norm K L a)) + exact congrArg + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K M)) + (pushoutTowerIdeleNorm_inclusion K M L N a) + +/-- The map on degree-zero class-norm quotients induced by the pushout +inclusion. -/ +def pushoutNormQuotientMap : + RelativeIdeleGroup.ClassNormQuotient K L →* + IntermediateClassNormQuotient K M N := + QuotientGroup.map + (RelativeIdeleGroup.classNorm K L).range + (TowerRelativeIdeleGroup.classNorm K M N).range + (RelativeIdeleGroup.classInclusion K M) + (by + rintro _ ⟨c, rfl⟩ + exact + ⟨pushoutTowerClassInclusion K M L N c, + pushoutTowerClassNorm_inclusion K M L N c⟩) + +omit [NumberField M] [NumberField L] [NumberField N] + [FiniteDimensional K M] [FiniteDimensional L N] in +theorem pushoutNormQuotientMap_mk + (c : IdeleClassGroup K) : + pushoutNormQuotientMap K M L N + (QuotientGroup.mk' (RelativeIdeleGroup.classNorm K L).range c) = + QuotientGroup.mk' + (TowerRelativeIdeleGroup.classNorm K M N).range + (RelativeIdeleGroup.classInclusion K M c) := + rfl + +omit [NumberField M] in +/-- Norm followed by class inclusion is the extension-degree power on +the base idele class group. -/ +theorem ideleClassNorm_classInclusion + (c : IdeleClassGroup K) : + RelativeIdeleGroup.classNorm K M + (RelativeIdeleGroup.classInclusion K M c) = + c ^ Module.finrank K M := by + refine QuotientGroup.induction_on c ?_ + intro a + change + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (RelativeIdeleGroup.norm K M + (RelativeIdeleGroup.inclusion K M a)) = + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) ^ + Module.finrank K M + rw [RelativeIdeleGroup.norm_inclusion, map_pow] + +/-- Change the chosen intermediate field in the tower presentation of +the relative idele class group of `N`, keeping the bottom field `K` +fixed. -/ +def changeIntermediateClassGroupEquiv : + TowerRelativeIdeleGroup.ClassGroup K M N ≃* + TowerRelativeIdeleGroup.ClassGroup K L N := + (TowerRelativeIdeleGroup.classGroupEquiv K M N).trans + (TowerRelativeIdeleGroup.classGroupEquiv K L N).symm + +omit [NumberField M] [NumberField L] [Algebra.IsPushout K M L N] in +/-- Changing the intermediate tower presentation does not change the +composite class norm to `K`. -/ +theorem towerCompositeClassNorm_changeIntermediate + (c : TowerRelativeIdeleGroup.ClassGroup K M N) : + towerCompositeClassNorm K L N + (changeIntermediateClassGroupEquiv K M L N c) = + towerCompositeClassNorm K M N c := by + rw [towerCompositeClassNorm_eq_ideleClassNorm, + towerCompositeClassNorm_eq_ideleClassNorm] + simp [changeIntermediateClassGroupEquiv] + +omit [NumberField M] [NumberField L] [Algebra.IsPushout K M L N] in +/-- Every composite norm through `M` is, after changing the tower +presentation, already a norm through `L`. -/ +theorem towerCompositeClassNorm_mem_ideleClassNormRange + (c : TowerRelativeIdeleGroup.ClassGroup K M N) : + towerCompositeClassNorm K M N c ∈ + (RelativeIdeleGroup.classNorm K L).range := by + refine + ⟨TowerRelativeIdeleGroup.classNorm K L N + (changeIntermediateClassGroupEquiv K M L N c), + ?_⟩ + exact towerCompositeClassNorm_changeIntermediate K M L N c + +/-- Norm back from the pushout target quotient to the original +class-norm quotient. -/ +def pushoutNormQuotientNormBack : + IntermediateClassNormQuotient K M N →* + RelativeIdeleGroup.ClassNormQuotient K L := + QuotientGroup.map + (TowerRelativeIdeleGroup.classNorm K M N).range + (RelativeIdeleGroup.classNorm K L).range + (RelativeIdeleGroup.classNorm K M) + (by + rintro _ ⟨c, rfl⟩ + exact + towerCompositeClassNorm_mem_ideleClassNormRange + K M L N c) + +omit [NumberField M] [NumberField L] [Algebra.IsPushout K M L N] in +theorem pushoutNormQuotientNormBack_mk + (c : RelativeIdeleGroup.ClassGroup K M) : + pushoutNormQuotientNormBack K M L N + (QuotientGroup.mk' + (TowerRelativeIdeleGroup.classNorm K M N).range c) = + QuotientGroup.mk' (RelativeIdeleGroup.classNorm K L).range + (RelativeIdeleGroup.classNorm K M c) := + rfl + +omit [NumberField M] [NumberField L] in +/-- The norm-back composite is the `[M:K]`-power map on the original +class-norm quotient. -/ +theorem pushoutNormQuotientNormBack_comp_map + (q : RelativeIdeleGroup.ClassNormQuotient K L) : + pushoutNormQuotientNormBack K M L N + (pushoutNormQuotientMap K M L N q) = + q ^ Module.finrank K M := by + refine QuotientGroup.induction_on q ?_ + intro c + change + QuotientGroup.mk' (RelativeIdeleGroup.classNorm K L).range + (RelativeIdeleGroup.classNorm K M + (RelativeIdeleGroup.classInclusion K M c)) = + (QuotientGroup.mk' (RelativeIdeleGroup.classNorm K L).range c) ^ + Module.finrank K M + rw [ideleClassNorm_classInclusion, map_pow] + +omit [NumberField M] [NumberField L] in +/-- If the `[M:K]`-power map on the original norm quotient is +injective, then so is the map induced by the pushout inclusion. -/ +theorem pushoutNormQuotientMap_injective_of_pow_injective + (hpow : + Function.Injective + (fun q : RelativeIdeleGroup.ClassNormQuotient K L => + q ^ Module.finrank K M)) : + Function.Injective (pushoutNormQuotientMap K M L N) := by + intro x y hxy + apply hpow + change + x ^ Module.finrank K M = + y ^ Module.finrank K M + rw [← pushoutNormQuotientNormBack_comp_map K M L N x, + ← pushoutNormQuotientNormBack_comp_map K M L N y, + hxy] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/ConnectedComponentQuotientCongr.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/ConnectedComponentQuotientCongr.lean new file mode 100644 index 0000000000..443c40e01d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/ConnectedComponentQuotientCongr.lean @@ -0,0 +1,96 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Topology.TotallyDisconnectedQuotients +public import Mathlib.GroupTheory.QuotientGroup.Defs +public import Mathlib.Topology.Algebra.ContinuousMonoidHom +public import Mathlib.Topology.Algebra.Group.Quotient +public import Mathlib.Topology.Algebra.Group.Subgroup +/-! +# Connected-component quotients under topological group equivalences + +A topological group equivalence carries the connected component of one +onto the connected component of one. It therefore induces an equivalence +of the corresponding quotient topological groups. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +variable {G : Type u} {H : Type v} + [Group G] [Group H] + [TopologicalSpace G] [TopologicalSpace H] + [IsTopologicalGroup G] [IsTopologicalGroup H] + +/-- A topological group equivalence maps the identity component exactly +onto the identity component. -/ +theorem connectedComponentOfOne_map_equiv (e : G ≃ₜ* H) : + (Subgroup.connectedComponentOfOne G).map e.toMulEquiv.toMonoidHom = + Subgroup.connectedComponentOfOne H := by + ext y + constructor + · rintro ⟨x, hx, rfl⟩ + change e x ∈ connectedComponent (1 : H) + have h := e.continuous.mapsTo_connectedComponent (1 : G) hx + change e x ∈ connectedComponent (e 1) at h + simpa only [map_one] using h + · intro hy + refine ⟨e.symm y, ?_, e.apply_symm_apply y⟩ + change e.symm y ∈ connectedComponent (1 : G) + have h := e.symm.continuous.mapsTo_connectedComponent (1 : H) hy + change e.symm y ∈ connectedComponent (e.symm 1) at h + simpa only [map_one] using h + +/-- An equivalence of topological groups descends to a +topological group equivalence modulo the identity components. -/ +noncomputable def connectedComponentQuotientCongr (e : G ≃ₜ* H) : + (G ⧸ Subgroup.connectedComponentOfOne G) ≃ₜ* + (H ⧸ Subgroup.connectedComponentOfOne H) := by + let G₀ := Subgroup.connectedComponentOfOne G + let H₀ := Subgroup.connectedComponentOfOne H + have he : G₀.map e.toMulEquiv.toMonoidHom = H₀ := + connectedComponentOfOne_map_equiv e + let eQ : G ⧸ G₀ ≃* H ⧸ H₀ := + QuotientGroup.congr G₀ H₀ e.toMulEquiv he + have hcont : Continuous eQ := by + apply (QuotientGroup.isQuotientMap_mk G₀).continuous_iff.mpr + have hcomp : Continuous (fun g : G => QuotientGroup.mk' H₀ (e g)) := + QuotientGroup.continuous_mk.comp e.continuous + refine hcomp.congr ?_ + intro g + exact (QuotientGroup.congr_mk' G₀ H₀ e.toMulEquiv he g).symm + have hinv : Continuous eQ.symm := by + apply (QuotientGroup.isQuotientMap_mk H₀).continuous_iff.mpr + have hcomp : Continuous (fun h : H => QuotientGroup.mk' G₀ (e.symm h)) := + QuotientGroup.continuous_mk.comp e.symm.continuous + refine hcomp.congr ?_ + intro h + change QuotientGroup.mk' G₀ (e.symm h) = + (QuotientGroup.congr G₀ H₀ e.toMulEquiv he).symm + (QuotientGroup.mk' H₀ h) + rfl + exact + { toMulEquiv := eQ + continuous_toFun := hcont + continuous_invFun := hinv } + +/-- On representatives, the quotient equivalence applies the original map. -/ +theorem connectedComponentQuotientCongr_mk + (e : G ≃ₜ* H) (g : G) : + connectedComponentQuotientCongr e + (QuotientGroup.mk' (Subgroup.connectedComponentOfOne G) g) = + QuotientGroup.mk' (Subgroup.connectedComponentOfOne H) (e g) := + QuotientGroup.congr_mk' _ _ _ (connectedComponentOfOne_map_equiv e) g + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Core.lean new file mode 100644 index 0000000000..9b2fe68787 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Core.lean @@ -0,0 +1,172 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange +/-! +# The ordinary ideal class group as an idele quotient + +This file proves that quotienting the idele group by the +ideles integral at every finite place and by the principal ideles gives the +ordinary ideal class group. +-/ + +@[expose] public section + +open scoped NumberField RestrictedProduct WithZero +open NumberField IsDedekindDomain + +noncomputable +section + + +variable {K : Type*} [Field K] [NumberField K] + +namespace IdeleGroup + +/-- The exponent of a prime in a principal fractional ideal is the additive +form of the corresponding normalized finite-place valuation. -/ +theorem count_toPrincipalIdeal (x : Kˣ) + (v : HeightOneSpectrum (𝓞 K)) : + FractionalIdeal.count K v + ((toPrincipalIdeal (𝓞 K) K x : FractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = + -WithZero.log (v.valuation K (x : K)) := by + obtain ⟨⟨n, d, hd⟩, hnd⟩ := + IsLocalization.surj (nonZeroDivisors (𝓞 K)) (x : K) + let d' : nonZeroDivisors (𝓞 K) := ⟨d, hd⟩ + have hx : + (x : K) = IsLocalization.mk' K n d' := + IsLocalization.eq_mk'_iff_mul_eq.mpr hnd + have hn : n ≠ 0 := by + intro hn + have : (x : K) = 0 := by + rw [hx, hn, IsFractionRing.mk'_eq_div, map_zero, zero_div] + exact x.ne_zero this + have hspan : + (toPrincipalIdeal (𝓞 K) K x : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = + FractionalIdeal.spanSingleton (nonZeroDivisors (𝓞 K)) + ((algebraMap (𝓞 K) K) d)⁻¹ * + (Ideal.span {n} : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) := by + rw [coe_toPrincipalIdeal, hx, + FractionalIdeal.coeIdeal_span_singleton, + FractionalIdeal.spanSingleton_mul_spanSingleton, + IsFractionRing.mk'_eq_div, div_eq_mul_inv, mul_comm] + rw [FractionalIdeal.count_well_defined K v + (Units.ne_zero (toPrincipalIdeal (𝓞 K) K x)) hspan, + hx, v.valuation_of_mk'] + rw [v.intValuation_if_neg hn, + v.intValuation_if_neg (nonZeroDivisors.coe_ne_zero d')] + simp [d', sub_eq_add_neg, add_comm] + +/-- The fractional ideal map sends a principal idele to the corresponding +principal fractional ideal. -/ +@[simp] +theorem fractionalIdeal_principalIdele (x : Kˣ) : + fractionalIdeal (principalIdele K x) = + toPrincipalIdeal (𝓞 K) K x := by + apply FractionalIdealGroup.ext_count + intro v + rw [count_toPrincipalIdeal] + change FractionalIdeal.count K v + (((FractionalIdealGroup.factorization (K := K)) + (FiniteIdeleGroup.valuationVector + (principalIdele K x).2) : FractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = + -WithZero.log (v.valuation K (x : K)) + rw [FractionalIdealGroup.count_factorization] + change -WithZero.log + (Valued.v (((principalIdele K x).2 v : + (v.adicCompletion K)ˣ) : v.adicCompletion K)) = + -WithZero.log (v.valuation K (x : K)) + rw [show ((((principalIdele K x).2 v : + (v.adicCompletion K)ˣ) : v.adicCompletion K)) = (x : K) from rfl, + HeightOneSpectrum.valuedAdicCompletion_eq_valuation'] + +theorem classGroup_mk_eq_one_iff + (I : FractionalIdealGroup K) : + ClassGroup.mk K I = 1 ↔ + I ∈ (toPrincipalIdeal (𝓞 K) K).range := by + constructor + · intro h + have h' := congrArg (ClassGroup.equiv K) h + simpa using h' + · intro h + apply (ClassGroup.equiv K).injective + simpa using h + +@[simp] +theorem idealClass_principalIdele (x : Kˣ) : + idealClass (principalIdele K x) = 1 := by + change ClassGroup.mk K + (fractionalIdeal (principalIdele K x)) = 1 + rw [fractionalIdeal_principalIdele, + classGroup_mk_eq_one_iff] + exact ⟨x, rfl⟩ + +/-- The subgroup `I_K^{S∞} Kˣ` defining the ordinary ideal class quotient. -/ +def ordinaryIdealClassSubgroup : Subgroup (IdeleGroup K) := + integralAtFinitePlaces (K := K) ⊔ principalSubgroup K + +/-- The kernel of the map from ideles to the ordinary ideal class group is +exactly `I_K^{S∞} Kˣ`. -/ +theorem ordinaryIdealClassSubgroup_eq_ker : + ordinaryIdealClassSubgroup (K := K) = + (idealClass (K := K)).ker := by + ext a + constructor + · intro ha + rw [ordinaryIdealClassSubgroup, Subgroup.mem_sup] at ha + obtain ⟨u, hu, p, hp, rfl⟩ := ha + obtain ⟨x, rfl⟩ := hp + have hu' : fractionalIdeal u = 1 := by + rw [← MonoidHom.mem_ker, + fractionalIdeal_ker] + exact hu + change idealClass (u * principalIdele K x) = 1 + rw [map_mul, idealClass_principalIdele, mul_one] + change ClassGroup.mk K (fractionalIdeal u) = 1 + rw [hu', map_one] + · intro ha + change ClassGroup.mk K (fractionalIdeal a) = 1 at ha + rw [classGroup_mk_eq_one_iff] at ha + obtain ⟨x, hx⟩ := ha + let u : IdeleGroup K := a * (principalIdele K x)⁻¹ + have hu : u ∈ integralAtFinitePlaces (K := K) := by + rw [← fractionalIdeal_ker, MonoidHom.mem_ker] + change fractionalIdeal + (a * (principalIdele K x)⁻¹) = 1 + rw [map_mul, map_inv, fractionalIdeal_principalIdele, + ← hx, mul_inv_cancel] + rw [ordinaryIdealClassSubgroup, Subgroup.mem_sup] + refine ⟨u, hu, principalIdele K x, ⟨x, rfl⟩, ?_⟩ + dsimp [u] + group + +/-- The ordinary ideal class group is the quotient of +the ideles by the ideles integral at all finite places and the principal +ideles. -/ +def quotientIntegralSupPrincipalEquiv : + IdeleGroup K ⧸ + (integralAtFinitePlaces (K := K) ⊔ principalSubgroup K) ≃* + ClassGroup (𝓞 K) := by + let h : integralAtFinitePlaces (K := K) ⊔ principalSubgroup K = + (idealClass (K := K)).ker := by + simpa [ordinaryIdealClassSubgroup] using + ordinaryIdealClassSubgroup_eq_ker (K := K) + exact + (QuotientGroup.congr + (integralAtFinitePlaces (K := K) ⊔ principalSubgroup K) + (idealClass (K := K)).ker (MulEquiv.refl (IdeleGroup K)) + (by simpa using h)).trans + (quotientIdealClassKernelEquiv (K := K)) + +end IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/InfiniteAlgEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/InfiniteAlgEquiv.lean new file mode 100644 index 0000000000..7a959305cd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/InfiniteAlgEquiv.lean @@ -0,0 +1,236 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.PlaceEquiv +/-! +# Infinite completions under a number-field equivalence + +The completion maps along an isomorphism of number fields are mutually +inverse. This is the archimedean local input for the topology of `adeleCongr`. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + +universe u v + +variable {K : Type u} {M : Type v} + [Field K] [NumberField K] [Algebra ℚ K] + [Field M] [NumberField M] [Algebra ℚ M] + +/-- The map between the completions at corresponding infinite places. -/ +noncomputable def infinitePlaceCompletionCongrHom + (e : K ≃ₐ[ℚ] M) (W : InfinitePlace M) : + ((ClassFieldTheory.infinitePlaceEquivOfRingEquiv e.toRingEquiv).symm W).Completion →+* + W.Completion := by + let : Algebra K M := e.toRingHom.toAlgebra + let w := (ClassFieldTheory.infinitePlaceEquivOfRingEquiv e.toRingEquiv).symm W + have hKM : infinitePlaceBelow (K := K) W = w := by + change W.comap e.toRingHom = W.comap e.toRingHom + rfl + let : W.1.LiesOver w.1 := + ⟨congrArg (fun v : InfinitePlace K => v.1) hKM⟩ + exact NumberField.LiesOver.completionMap (v := w) (w := W) + +/-- The archimedean completion map is continuous. -/ +theorem infinitePlaceCompletionCongrHom_continuous + (e : K ≃ₐ[ℚ] M) (W : InfinitePlace M) : + Continuous (infinitePlaceCompletionCongrHom e W) := by + let : Algebra K M := e.toRingHom.toAlgebra + let w := (ClassFieldTheory.infinitePlaceEquivOfRingEquiv e.toRingEquiv).symm W + have hKM : infinitePlaceBelow (K := K) W = w := by + change W.comap e.toRingHom = W.comap e.toRingHom + rfl + let : W.1.LiesOver w.1 := + ⟨congrArg (fun v : InfinitePlace K => v.1) hKM⟩ + change Continuous (NumberField.LiesOver.completionMap (v := w) (w := W)) + exact NumberField.LiesOver.continuous_completionMap + +/-- Transport along a field isomorphism is an equivalence of the +corresponding infinite-place completions. -/ +noncomputable def infinitePlaceCompletionCongrEquiv + (e : K ≃ₐ[ℚ] M) (W : InfinitePlace M) : + ((ClassFieldTheory.infinitePlaceEquivOfRingEquiv e.toRingEquiv).symm W).Completion ≃+* + W.Completion := by + let : Algebra K M := e.toRingHom.toAlgebra + let : Algebra M K := e.symm.toRingHom.toAlgebra + let w := (ClassFieldTheory.infinitePlaceEquivOfRingEquiv e.toRingEquiv).symm W + have hKM : infinitePlaceBelow (K := K) W = w := by + change W.comap e.toRingHom = W.comap e.toRingHom + rfl + have hMK : infinitePlaceBelow (K := M) w = W := by + change (W.comap e.toRingHom).comap e.symm.toRingHom = W + exact (ClassFieldTheory.infinitePlaceEquivOfRingEquiv e.toRingEquiv).right_inv W + let : W.1.LiesOver w.1 := + ⟨congrArg (fun v : InfinitePlace K => v.1) hKM⟩ + let : w.1.LiesOver W.1 := + ⟨congrArg (fun v : InfinitePlace M => v.1) hMK⟩ + let f : w.Completion →+* W.Completion := + NumberField.LiesOver.completionMap (v := w) (w := W) + let g : W.Completion →+* w.Completion := + NumberField.LiesOver.completionMap (v := W) (w := w) + exact RingEquiv.ofRingHom f g + (by + apply RingHom.ext + intro x + change f (g x) = x + refine InfinitePlace.Completion.induction_on W x ?_ ?_ + · exact isClosed_eq + (NumberField.LiesOver.continuous_completionMap.comp + NumberField.LiesOver.continuous_completionMap) + continuous_id + · intro y + dsimp only [f, g] + rw [NumberField.LiesOver.completionMap_coe + (v := W) (w := w) y, + NumberField.LiesOver.completionMap_coe + (v := w) (w := W) + (algebraMap (WithAbs W.1) (WithAbs w.1) y)] + apply congrArg (fun z : WithAbs W.1 => (z : W.Completion)) + apply (WithAbs.equiv W.1).injective + change e (e.symm (WithAbs.equiv W.1 y)) = + WithAbs.equiv W.1 y + exact e.apply_symm_apply _) + (by + apply RingHom.ext + intro x + change g (f x) = x + refine InfinitePlace.Completion.induction_on w x ?_ ?_ + · exact isClosed_eq + (NumberField.LiesOver.continuous_completionMap.comp + NumberField.LiesOver.continuous_completionMap) + continuous_id + · intro y + dsimp only [f, g] + rw [NumberField.LiesOver.completionMap_coe + (v := w) (w := W) y, + NumberField.LiesOver.completionMap_coe + (v := W) (w := w) + (algebraMap (WithAbs w.1) (WithAbs W.1) y)] + apply congrArg (fun z : WithAbs w.1 => (z : w.Completion)) + apply (WithAbs.equiv w.1).injective + change e.symm (e (WithAbs.equiv w.1 y)) = + WithAbs.equiv w.1 y + exact e.symm_apply_apply _) + +/-- The completion map agrees with the number-field equivalence on +elements of the number field. -/ +theorem infinitePlaceCompletionCongrHom_algebraMap + (e : K ≃ₐ[ℚ] M) (W : InfinitePlace M) (x : K) : + infinitePlaceCompletionCongrHom e W + (algebraMap K + ((ClassFieldTheory.infinitePlaceEquivOfRingEquiv e.toRingEquiv).symm W).Completion x) = + algebraMap M W.Completion (e x) := by + let : Algebra K M := e.toRingHom.toAlgebra + let w := (ClassFieldTheory.infinitePlaceEquivOfRingEquiv e.toRingEquiv).symm W + have hKM : infinitePlaceBelow (K := K) W = w := by + change W.comap e.toRingHom = W.comap e.toRingHom + rfl + let : W.1.LiesOver w.1 := + ⟨congrArg (fun v : InfinitePlace K => v.1) hKM⟩ + change NumberField.LiesOver.completionMap + (v := w) (w := W) + ((WithAbs.toAbs w.1 x : WithAbs w.1) : w.Completion) = + algebraMap M W.Completion (e x) + rw [NumberField.LiesOver.completionMap_coe] + apply InfinitePlace.Completion.ext + rw [InfinitePlace.Completion.algebraMap_toCompletion, + UniformSpace.Completion.algebraMap_def] + simp [WithAbs.algebraMap_left_apply, + WithAbs.algebraMap_right_apply] + rfl + +/-- On infinite coordinates, `adeleCongr` is the completion map at the +corresponding infinite place. -/ +theorem adeleCongr_infiniteComponent + (e : K ≃ₐ[ℚ] M) + (a : NumberField.AdeleRing (𝓞 K) K) + (W : InfinitePlace M) : + (adeleCongr e a).1 W = + infinitePlaceCompletionCongrHom e W + (a.1 ((ClassFieldTheory.infinitePlaceEquivOfRingEquiv e.toRingEquiv).symm W)) := by + let : Algebra K M := e.toRingHom.toAlgebra + let : IsScalarTower ℚ K M := + IsScalarTower.of_algHom e.toAlgHom + let w := (ClassFieldTheory.infinitePlaceEquivOfRingEquiv e.toRingEquiv).symm W + let componentK : NumberField.AdeleRing (𝓞 K) K →+* w.Completion := + (Pi.evalRingHom (fun v : InfinitePlace K => v.Completion) w).comp + (RingHom.fst (NumberField.InfiniteAdeleRing K) + (IsDedekindDomain.FiniteAdeleRing (𝓞 K) K)) + let componentM : NumberField.AdeleRing (𝓞 M) M →+* W.Completion := + (Pi.evalRingHom (fun v : InfinitePlace M => v.Completion) W).comp + (RingHom.fst (NumberField.InfiniteAdeleRing M) + (IsDedekindDomain.FiniteAdeleRing (𝓞 M) M)) + change componentM (adeleCongr e a) = + infinitePlaceCompletionCongrHom e W (componentK a) + have hW : infinitePlaceBelow (K := K) W = w := by + change W.comap e.toRingHom = W.comap e.toRingHom + rfl + have hq : infinitePlaceBelow (K := ℚ) w = + infinitePlaceBelow (K := ℚ) W := by + rw [← hW, infinitePlaceBelow_infinitePlaceBelow] + let z := (relativeAdeleBaseChangeRingEquiv (K := ℚ) (L := K)).symm a + have ha : relativeAdeleBaseChangeRingEquiv (K := ℚ) (L := K) z = a := + (relativeAdeleBaseChangeRingEquiv (K := ℚ) (L := K)).apply_symm_apply a + rw [← ha] + have htransport : + componentM (relativeAdeleBaseChangeRingEquiv (K := ℚ) (L := M) + (relativeAdeleCongr (K := ℚ) e z)) = + componentM (adeleCongr e + (relativeAdeleBaseChangeRingEquiv (K := ℚ) (L := K) z)) := + congrArg componentM + (relativeAdeleBaseChangeRingEquiv_relativeAdeleCongr e z) + rw [← htransport] + induction z using TensorProduct.inductionOn with + | add z₁ z₂ hz₁ hz₂ => + simpa only [map_add] using congrArg₂ (· + ·) hz₁ hz₂ + | tmul b x => + let v := infinitePlaceBelow (K := ℚ) W + let : W.1.LiesOver + (infinitePlaceBelow (K := ℚ) W).1 := ⟨rfl⟩ + let : w.1.LiesOver + (infinitePlaceBelow (K := ℚ) w).1 := ⟨rfl⟩ + let : W.1.LiesOver w.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) hW⟩ + have hcomponent + (v' : InfinitePlace ℚ) (hv' : v' = v) + [hWv : W.1.LiesOver v.1] + [hwv' : w.1.LiesOver v'.1] + [hWw : W.1.LiesOver w.1] : + NumberField.LiesOver.completionMap + (v := v) (w := W) (b.1 v) = + NumberField.LiesOver.completionMap + (v := w) (w := W) + (NumberField.LiesOver.completionMap + (v := v') (w := w) (b.1 v')) := by + subst v' + exact (infinitePlaceCompletionMap_comp_apply + (K := ℚ) (M := K) (L := M) W (b.1 v)).symm + change + (relativeAdeleBaseChangeRingEquiv (K := ℚ) (L := M) + (relativeAdeleCongr (K := ℚ) e (b ⊗ₜ[ℚ] x))).1 W = + infinitePlaceCompletionCongrHom e W + ((relativeAdeleBaseChangeRingEquiv (K := ℚ) (L := K) + (b ⊗ₜ[ℚ] x)).1 w) + rw [relativeAdeleCongr_tmul, + relativeAdeleBaseChangeRingEquiv_infiniteComponent_tmul, + relativeAdeleBaseChangeRingEquiv_infiniteComponent_tmul] + rw [map_mul, infinitePlaceCompletionCongrHom_algebraMap] + exact congrArg₂ (· * ·) + (hcomponent (infinitePlaceBelow (K := ℚ) w) hq + (hWv := ⟨rfl⟩) (hwv' := ⟨rfl⟩) + (hWw := ⟨congrArg (fun q : InfinitePlace K => q.1) hW⟩)) + rfl + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibComparison.lean new file mode 100644 index 0000000000..bb1a546c7f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibComparison.lean @@ -0,0 +1,118 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +public import Mathlib.NumberTheory.NumberField.AdeleRing +/-! +# Comparison with Mathlib's idèle class group + +The restricted-product idèle group and Mathlib's adele-unit idèle group are +already multiplicatively equivalent. The principal subgroups correspond, +so the equivalence descends to idèle classes. The one-place map comparison +needed for the public local--global reciprocity theorem is recorded below. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace IdeleGroup + +variable (K : Type*) [Field K] [NumberField K] + +/-- The algebraic idèle equivalence carries each principal idèle to Mathlib's +diagonal idèle. -/ +theorem equivAdeleRingUnits_principalIdele (x : Kˣ) : + equivAdeleRingUnits (principalIdele K x) = + NumberField.IdeleGroup.unitEmbedding (𝓞 K) K x := by + change equivAdeleRingUnits + ((equivAdeleRingUnits (K := K)).symm + (NumberField.IdeleGroup.unitEmbedding (𝓞 K) K x)) = _ + exact (equivAdeleRingUnits (K := K)).apply_symm_apply _ + +/-- The induced multiplicative equivalence of idèle class groups. -/ +def ideleClassGroupEquivMathlib : + IdeleClassGroup K ≃* NumberField.IdeleClassGroup (𝓞 K) K := by + let e := equivAdeleRingUnits (K := K) + let N := principalSubgroup K + let M := NumberField.IdeleGroup.principalSubgroup (𝓞 K) K + have hforward : N ≤ M.comap e.toMonoidHom := by + rintro a ⟨x, rfl⟩ + exact ⟨x, equivAdeleRingUnits_principalIdele K x⟩ + have hbackward : M ≤ N.comap e.symm.toMonoidHom := by + rintro a ⟨x, rfl⟩ + refine ⟨x, ?_⟩ + apply e.injective + rw [equivAdeleRingUnits_principalIdele K x] + exact (e.apply_symm_apply _).symm + let f : IdeleClassGroup K →* NumberField.IdeleClassGroup (𝓞 K) K := + QuotientGroup.map N M e.toMonoidHom hforward + let g : NumberField.IdeleClassGroup (𝓞 K) K →* IdeleClassGroup K := + QuotientGroup.map M N e.symm.toMonoidHom hbackward + exact + { toFun := f + invFun := g + left_inv := by + intro a + refine QuotientGroup.induction_on a (fun x => ?_) + change QuotientGroup.mk' N (e.symm (e x)) = QuotientGroup.mk' N x + rw [e.symm_apply_apply] + right_inv := by + intro a + refine QuotientGroup.induction_on a (fun x => ?_) + change QuotientGroup.mk' M (e (e.symm x)) = QuotientGroup.mk' M x + rw [e.apply_symm_apply] + map_mul' := f.map_mul } + +/-- The algebraic idèle comparison carries a one-place idèle to Mathlib's +one-place adele-unit idèle. -/ +theorem equivAdeleRingUnits_finitePlaceIdele + (v : HeightOneSpectrum (𝓞 K)) (x : (v.adicCompletion K)ˣ) : + equivAdeleRingUnits (finitePlaceIdele v x) = + NumberField.IdeleGroup.ofAdicCompletion (𝓞 K) K v x := by + classical + apply Units.ext + apply Prod.ext + · rfl + · apply RestrictedProduct.ext + intro w + change ((finitePlaceIdele v x).2 w : w.adicCompletion K) = + (RestrictedProduct.mulSingle + (fun w : HeightOneSpectrum (𝓞 K) => w.adicCompletionIntegers K) + v (x : v.adicCompletion K)) w + by_cases hw : w = v + · subst w + rw [RestrictedProduct.mulSingle_eq_same] + exact congrArg (fun u : (v.adicCompletion K)ˣ => + (u : v.adicCompletion K)) + (finitePlaceIdele_finiteComponent_same v x) + · rw [RestrictedProduct.mulSingle_eq_of_ne + (fun w : HeightOneSpectrum (𝓞 K) => w.adicCompletionIntegers K) + (x : v.adicCompletion K) hw] + have h := finitePlaceIdele_finiteComponent_of_ne v w x hw + exact congrArg (fun u : (w.adicCompletion K)ˣ => + (u : w.adicCompletion K)) h + +/-- The class-group comparison respects the one-place idèle-class maps. -/ +theorem ideleClassGroupEquivMathlib_finitePlaceIdeleClass + (v : HeightOneSpectrum (𝓞 K)) (x : (v.adicCompletion K)ˣ) : + ideleClassGroupEquivMathlib K (finitePlaceIdeleClass v x) = + NumberField.IdeleClassGroup.ofAdicCompletion (𝓞 K) K v x := by + change QuotientGroup.mk' + (NumberField.IdeleGroup.principalSubgroup (𝓞 K) K) + (equivAdeleRingUnits (finitePlaceIdele v x)) = + QuotientGroup.mk' + (NumberField.IdeleGroup.principalSubgroup (𝓞 K) K) + (NumberField.IdeleGroup.ofAdicCompletion (𝓞 K) K v x) + rw [equivAdeleRingUnits_finitePlaceIdele K v x] + +end IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibTopologyComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibTopologyComparison.lean new file mode 100644 index 0000000000..b529511a46 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibTopologyComparison.lean @@ -0,0 +1,59 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FiniteMathlibTopologyComparison +public import Mathlib.Topology.Algebra.Group.Quotient +/-! +# Continuity of the comparison with Mathlib's idèle class group + +The algebraic equivalence from the restricted-product idèle class group to +Mathlib's adele-unit quotient is continuous. This is the quotient descent of +the continuous map on idèles. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace IdeleGroup + +variable (K : Type*) [Field K] [NumberField K] + +/-- The idèle-class comparison is continuous in the forward direction. -/ +theorem continuous_ideleClassGroupEquivMathlib : + Continuous (ideleClassGroupEquivMathlib K) := by + apply (QuotientGroup.isQuotientMap_mk (principalSubgroup K)).continuous_iff.mpr + have h : Continuous (fun a : IdeleGroup K => + QuotientGroup.mk' (NumberField.IdeleGroup.principalSubgroup (𝓞 K) K) + (equivAdeleRingUnits a)) := + QuotientGroup.continuous_mk.comp (continuous_equivAdeleRingUnits K) + exact h.congr (fun _ => rfl) + +/-- The restricted-product and adele-unit presentations of the idèle class +group are canonically isomorphic as topological groups. -/ +noncomputable def ideleClassGroupContinuousMulEquivMathlib : + IdeleClassGroup K ≃ₜ* NumberField.IdeleClassGroup (𝓞 K) K := by + refine + { toMulEquiv := ideleClassGroupEquivMathlib K + continuous_toFun := continuous_ideleClassGroupEquivMathlib K + continuous_invFun := ?_ } + apply (QuotientGroup.isQuotientMap_mk + (NumberField.IdeleGroup.principalSubgroup (𝓞 K) K)).continuous_iff.mpr + have h : Continuous (fun a : NumberField.IdeleGroup (𝓞 K) K => + QuotientGroup.mk' (principalSubgroup K) + ((equivAdeleRingUnitsContinuousMulEquiv K).symm a)) := + QuotientGroup.continuous_mk.comp + (equivAdeleRingUnitsContinuousMulEquiv K).symm.continuous + exact h.congr (fun _ => rfl) + +end IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormComparison.lean new file mode 100644 index 0000000000..d1ca5717d4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormComparison.lean @@ -0,0 +1,230 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleClassBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.EmbeddingNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm +/-! +# Relative and ordinary idele-class norms + +The determinant norm on relative ideles and the ordinary idele norm give +the same map after the canonical scalar-extension equivalence +`C(𝔸_K ⊗_K L) ≃ C_L`. This comparison lets the cohomological results +proved in relative coordinates be stated with the usual norm +`N_{L/K} : C_L → C_K`. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace RelativeIdeleGroup + +universe u v w + +variable + {K : Type u} {L : Type v} {M : Type w} + [Field K] [NumberField K] + [Field L] [Field M] + [Algebra K L] [Algebra K M] + [FiniteDimensional K L] [FiniteDimensional K M] + +/-- A field embedding into an ambient finite extension, descended from +relative ideles to the existing relative idele class groups. -/ +noncomputable def classEmbedding + (f : L →ₐ[K] M) : + RelativeIdeleGroup.ClassGroup K L →* + RelativeIdeleGroup.ClassGroup K M := + QuotientGroup.map + (RelativeIdeleGroup.principalSubgroup K L) + (RelativeIdeleGroup.principalSubgroup K M) + (RelativeIdeleGroup.ideleEmbedding f) + (by + rintro _ ⟨x, rfl⟩ + refine ⟨Units.map f x, ?_⟩ + apply Units.ext + rfl) + +omit [FiniteDimensional K L] [FiniteDimensional K M] in +theorem classEmbedding_mk + (f : L →ₐ[K] M) + (a : RelativeIdeleGroup K L) : + classEmbedding f + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) a) = + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K M) + (RelativeIdeleGroup.ideleEmbedding f a) := + rfl + +omit [FiniteDimensional K L] [FiniteDimensional K M] in +/-- Scalar extension on relative idele classes respects composition. -/ +theorem classEmbedding_comp {N : Type*} [Field N] [Algebra K N] + (g : M →ₐ[K] N) (f : L →ₐ[K] M) + (c : RelativeIdeleGroup.ClassGroup K L) : + classEmbedding g (classEmbedding f c) = classEmbedding (g.comp f) c := by + refine QuotientGroup.induction_on c ?_ + intro a + apply congrArg (QuotientGroup.mk' (RelativeIdeleGroup.principalSubgroup K N)) + apply Units.ext + exact congrArg (fun h => h (a : RelativeAdeleRing K L)) + (Algebra.TensorProduct.map_id_comp + (S := NumberField.AdeleRing (𝓞 K) K) + (A := NumberField.AdeleRing (𝓞 K) K) g f).symm + +/-- The Galois product formula after descent to relative idele classes. -/ +theorem classInclusion_ideleClassNorm_eq_prod_conjugates + [IsGalois K L] + (c : RelativeIdeleGroup.ClassGroup K L) : + RelativeIdeleGroup.classInclusion K L + (RelativeIdeleGroup.classNorm K L c) = + ∏ σ : L ≃ₐ[K] L, σ • c := by + refine QuotientGroup.induction_on c ?_ + intro a + change + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) + (RelativeIdeleGroup.inclusion K L + (RelativeIdeleGroup.norm K L a)) = + ∏ σ : L ≃ₐ[K] L, + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) + (σ • a) + rw [RelativeIdeleGroup.inclusion_norm_eq_prod_conjugates] + exact map_prod + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L)) + (fun σ : L ≃ₐ[K] L => σ • a) + Finset.univ + +variable [Algebra L M] [IsScalarTower K L M] [IsGalois K M] + +/-- The cosets of the subgroup fixing the intermediate extension form a finite type. -/ +local instance fixingSubextensionQuotientFintype : + Fintype + ((M ≃ₐ[K] M) ⧸ + RelativeIdeleGroup.fixingSubextension + (K := K) (L := L) (M := M)) := + Fintype.ofFinite _ + +/-- The embedded-subextension norm formula after descent to relative +idele classes. No normality of `L / K` is assumed. -/ +theorem classInclusion_ideleClassNorm_eq_prod_embeddings + (c : RelativeIdeleGroup.ClassGroup K L) : + RelativeIdeleGroup.classInclusion K M + (RelativeIdeleGroup.classNorm K L c) = + ∏ f : L →ₐ[K] M, + RelativeIdeleGroup.classEmbedding f c := by + refine QuotientGroup.induction_on c ?_ + intro a + change + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K M) + (RelativeIdeleGroup.inclusion K M + (RelativeIdeleGroup.norm K L a)) = + ∏ f : L →ₐ[K] M, + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K M) + (RelativeIdeleGroup.ideleEmbedding f a) + rw [RelativeIdeleGroup.inclusion_norm_eq_prod_embeddings] + exact map_prod + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K M)) + (fun f : L →ₐ[K] M => + RelativeIdeleGroup.ideleEmbedding f a) + Finset.univ + +/-- Coset form of the embedded-subextension norm formula on relative +idele classes. -/ +theorem classInclusion_ideleClassNorm_eq_prod_galoisCosets + (c : RelativeIdeleGroup.ClassGroup K L) : + RelativeIdeleGroup.classInclusion K M + (RelativeIdeleGroup.classNorm K L c) = + ∏ q : + (M ≃ₐ[K] M) ⧸ + RelativeIdeleGroup.fixingSubextension + (K := K) (L := L) (M := M), + RelativeIdeleGroup.classEmbedding + (RelativeIdeleGroup.cosetEquivEmbedding q) c := by + calc + RelativeIdeleGroup.classInclusion K M + (RelativeIdeleGroup.classNorm K L c) = + ∏ f : L →ₐ[K] M, + RelativeIdeleGroup.classEmbedding f c := + RelativeIdeleGroup.classInclusion_ideleClassNorm_eq_prod_embeddings c + _ = + ∏ q : + (M ≃ₐ[K] M) ⧸ + RelativeIdeleGroup.fixingSubextension + (K := K) (L := L) (M := M), + RelativeIdeleGroup.classEmbedding + (RelativeIdeleGroup.cosetEquivEmbedding q) c := by + exact + ((RelativeIdeleGroup.cosetEquivEmbedding + (K := K) (L := L) (M := M)).prod_comp + (fun f ↦ RelativeIdeleGroup.classEmbedding f c)).symm + +end RelativeIdeleGroup + +variable + {K L : Type*} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsGalois K L] + +omit [IsGalois K L] in +/-- The relative determinant norm is the ordinary idele-class norm after +the canonical base-change equivalence. -/ +@[simp] +theorem ordinaryIdeleClassNorm_relativeIdeleClassBaseChange + (c : RelativeIdeleGroup.ClassGroup K L) : + _root_.ideleClassNorm K L + (relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := L) c) = + RelativeIdeleGroup.classNorm K L c := by + refine QuotientGroup.induction_on c ?_ + intro a + change + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (IdeleGroup.norm K L + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) a)) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (RelativeIdeleGroup.norm K L a) + rw [IdeleGroup.norm_relativeIdeleBaseChangeMulEquiv] + +omit [IsGalois K L] in +/-- The ordinary and relative presentations define the same norm subgroup +of `C_K`. -/ +theorem ordinaryIdeleClassNorm_range_eq_relative : + (_root_.ideleClassNorm K L).range = + (RelativeIdeleGroup.classNorm K L).range := by + ext c + constructor + · rintro ⟨d, rfl⟩ + refine + ⟨(relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := L)).symm d, ?_⟩ + simpa using + (ordinaryIdeleClassNorm_relativeIdeleClassBaseChange + (K := K) (L := L) + ((relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := L)).symm d)).symm + · rintro ⟨d, rfl⟩ + exact + ⟨relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := L) d, + ordinaryIdeleClassNorm_relativeIdeleClassBaseChange + (K := K) (L := L) d⟩ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormalClosureNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormalClosureNorm.lean new file mode 100644 index 0000000000..d45f4e77ce --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormalClosureNorm.lean @@ -0,0 +1,83 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +/-! +# Idèle-class norms from a finite normal closure + +The distinguished copy of a finite extension inside its normal closure +is an intermediate field. Norm transitivity therefore puts every norm +from the normal closure inside the norm subgroup of that copy. Transport +across the canonical algebra equivalence identifies the latter subgroup +with the norm subgroup of the original extension. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +universe u v + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +/-- Every idèle-class norm from the finite normal closure of `L / K` is +already an idèle-class norm from `L / K`. This supplies a genuine +finite Galois norm neighbourhood inside the norm subgroup of an +arbitrary finite extension. -/ +theorem finiteNormalClosure_ideleClassNorm_range_le_source : + (_root_.ideleClassNorm K (finiteNormalClosure K L)).range ≤ + (_root_.ideleClassNorm K L).range := by + let N := finiteNormalClosure K L + let : Algebra (finiteNormalClosureOriginalField K L) N := + (finiteNormalClosureOriginalField K L).val.toRingHom.toAlgebra + let : IsScalarTower K (finiteNormalClosureOriginalField K L) N := + by infer_instance + let : FiniteDimensional (finiteNormalClosureOriginalField K L) N := + FiniteDimensional.right K (finiteNormalClosureOriginalField K L) N + let : IsMulCommutative + (RelativeIdeleGroup K + (finiteNormalClosureOriginalField K L)) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + let : Group + (RelativeIdeleGroup.ClassGroup K + (finiteNormalClosureOriginalField K L)) := + QuotientGroup.Quotient.group + (RelativeIdeleGroup.principalSubgroup K + (finiteNormalClosureOriginalField K L)) + calc + (_root_.ideleClassNorm K N).range ≤ + (_root_.ideleClassNorm K (finiteNormalClosureOriginalField K L)).range := + ordinaryIdeleClassNorm_range_le_of_tower + (K := K) (M := finiteNormalClosureOriginalField K L) (L := N) + _ = (RelativeIdeleGroup.classNorm K (finiteNormalClosureOriginalField K L)).range := + ordinaryIdeleClassNorm_range_eq_relative + (K := K) (L := finiteNormalClosureOriginalField K L) + _ = (RelativeIdeleGroup.classNorm K L).range := + (ideleClassNorm_range_algEquiv + (K := K) (L := L) + (M := finiteNormalClosureOriginalField K L) + (finiteNormalClosureOriginalFieldEquiv K L) : + (RelativeIdeleGroup.classNorm K + (finiteNormalClosureOriginalField K L)).range = + (RelativeIdeleGroup.classNorm K L).range) + _ = (_root_.ideleClassNorm K L).range := + (ordinaryIdeleClassNorm_range_eq_relative + (K := K) (L := L)).symm + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Tower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Tower.lean new file mode 100644 index 0000000000..eced64caa0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Tower.lean @@ -0,0 +1,721 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.ClassGroup +public import Mathlib.LinearAlgebra.TensorProduct.Basis +public import Mathlib.RingTheory.TensorProduct.Maps +/-! +# Idele-class norms in a field tower + +For a tower `K ⊂ M ⊂ L`, keep the bottom field `K` fixed and write + +`𝔸_M = 𝔸_K ⊗[K] M`, +`𝔸_L = (𝔸_K ⊗[K] M) ⊗[M] L`. + +This gives an actual norm `C_L → C_M` whose composite with +`C_M → C_K` is the tower norm. The resulting three concrete norm +quotients form a natural right-exact sequence. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField + +noncomputable +section + +universe u + +variable + (K M L : Type u) + [Field K] [NumberField K] + [Field M] [NumberField M] + [Field L] [NumberField L] + [Algebra K M] [Algebra M L] [Algebra K L] + [IsScalarTower K M L] + [FiniteDimensional K M] [FiniteDimensional M L] + +/-- The canonical right-factor `M`-algebra structure on +`𝔸_K ⊗[K] M`. -/ +noncomputable instance (priority := 100) + relativeAdeleRingIntermediateAlgebra : + Algebra M (RelativeAdeleRing K M) := + Algebra.TensorProduct.rightAlgebra + +/-- The relative adele algebra of `L`, presented over the intermediate +field while retaining the fixed bottom-field model of `𝔸_M`. -/ +abbrev TowerRelativeAdeleRing := + RelativeAdeleRing K M ⊗[M] L + +/-- The intermediate field acts on the one-step bottom-field model +`𝔸_K ⊗[K] L` through its embedding in `L`. -/ +noncomputable instance (priority := 100) + relativeAdeleRingTopIntermediateAlgebra : + Algebra M (RelativeAdeleRing K L) := + ((Algebra.TensorProduct.includeRight + (R := K) + (A := NumberField.AdeleRing (𝓞 K) K) + (B := L)).toRingHom.comp + (algebraMap M L)).toAlgebra + +/-- Extend the intermediate relative adele algebra along `M → L`. -/ +def intermediateAdeleInclusion : + RelativeAdeleRing K M →ₐ[M] + RelativeAdeleRing K L where + __ := + (Algebra.TensorProduct.map + (AlgHom.id + (NumberField.AdeleRing (𝓞 K) K) + (NumberField.AdeleRing (𝓞 K) K)) + (IsScalarTower.toAlgHom K M L)).toRingHom + commutes' m := by + change + 1 ⊗ₜ[K] algebraMap M L m = + 1 ⊗ₜ[K] algebraMap M L m + rfl + +omit [NumberField M] [NumberField L] + [FiniteDimensional K M] [FiniteDimensional M L] in +@[simp] +theorem intermediateAdeleInclusion_tmul + (a : NumberField.AdeleRing (𝓞 K) K) + (m : M) : + intermediateAdeleInclusion K M L (a ⊗ₜ[K] m) = + a ⊗ₜ[K] algebraMap M L m := + rfl + +/-- The copy of `L` in the one-step relative adele algebra, regarded +as an `M`-algebra map. -/ +def topFieldToOneStep : + L →ₐ[M] RelativeAdeleRing K L where + __ := + (Algebra.TensorProduct.includeRight + (R := K) + (A := NumberField.AdeleRing (𝓞 K) K) + (B := L)).toRingHom + commutes' _ := rfl + +omit [NumberField M] [NumberField L] [Algebra K M] + [IsScalarTower K M L] + [FiniteDimensional K M] [FiniteDimensional M L] in +@[simp] +theorem topFieldToOneStep_apply + (x : L) : + topFieldToOneStep K M L x = + (1 : NumberField.AdeleRing (𝓞 K) K) ⊗ₜ[K] x := + rfl + +/-- Canonical ring equivalence +`(𝔸_K ⊗[K] M) ⊗[M] L ≃+* 𝔸_K ⊗[K] L`. + +This is the standard tensor-product cancellation isomorphism: commute +the two outer factors, commute the inner scalar extension, cancel the +base change, and commute the remaining factors back. -/ +def towerRelativeAdeleRingEquiv : + TowerRelativeAdeleRing K M L ≃+* + RelativeAdeleRing K L := by + letI : Algebra L (TowerRelativeAdeleRing K M L) := + Algebra.TensorProduct.rightAlgebra + let e₁ := + (Algebra.TensorProduct.commRight + M L (RelativeAdeleRing K M)).symm + let e₂ := + Algebra.TensorProduct.congr + (AlgEquiv.refl : L ≃ₐ[M] L) + (Algebra.TensorProduct.commRight K M + (NumberField.AdeleRing (𝓞 K) K)).symm + let e₃ := + Algebra.TensorProduct.cancelBaseChange + K M L L (NumberField.AdeleRing (𝓞 K) K) + let e₄ := + Algebra.TensorProduct.commRight + K L (NumberField.AdeleRing (𝓞 K) K) + exact + e₁.toRingEquiv.trans + (e₂.toRingEquiv.trans + (e₃.toRingEquiv.trans e₄.toRingEquiv)) + +/-- Flatten the iterated scalar extension +`(𝔸_K ⊗[K] M) ⊗[M] L` to `𝔸_K ⊗[K] L`. -/ +def towerRelativeAdeleFlatten : + TowerRelativeAdeleRing K M L →ₐ[M] + RelativeAdeleRing K L := + { (towerRelativeAdeleRingEquiv K M L).toRingHom with + commutes' := by + intro m + change _ = + (1 : NumberField.AdeleRing (𝓞 K) K) ⊗ₜ[K] + algebraMap M L m + simp [towerRelativeAdeleRingEquiv, + Algebra.TensorProduct.right_algebraMap_apply, + Algebra.smul_def] } + +omit [NumberField M] [NumberField L] + [FiniteDimensional K M] [FiniteDimensional M L] in +@[simp] +theorem towerRelativeAdeleFlatten_tmul + (b : RelativeAdeleRing K M) + (x : L) : + towerRelativeAdeleFlatten K M L (b ⊗ₜ[M] x) = + intermediateAdeleInclusion K M L b * + topFieldToOneStep K M L x := by + induction b using TensorProduct.inductionOn with + | add b₁ b₂ hb₁ hb₂ => + simp only [TensorProduct.add_tmul, map_add, + add_mul, hb₁, hb₂] + | tmul a m => + simp [towerRelativeAdeleFlatten, + towerRelativeAdeleRingEquiv, + intermediateAdeleInclusion_tmul, + topFieldToOneStep_apply, + Algebra.TensorProduct.tmul_mul_tmul, + Algebra.smul_def] + +/-- Embed the bottom adele algebra into the iterated tensor model. -/ +def bottomAdeleToTower : + NumberField.AdeleRing (𝓞 K) K →ₐ[K] + TowerRelativeAdeleRing K M L := + (Algebra.TensorProduct.includeLeft + (R := M) (S := K) + (A := RelativeAdeleRing K M) (B := L)).comp + (Algebra.TensorProduct.includeLeft + (R := K) (S := K) + (A := NumberField.AdeleRing (𝓞 K) K) (B := M)) + +omit [NumberField M] [NumberField L] [Algebra K L] + [IsScalarTower K M L] + [FiniteDimensional K M] [FiniteDimensional M L] in +@[simp] +theorem bottomAdeleToTower_apply + (a : NumberField.AdeleRing (𝓞 K) K) : + bottomAdeleToTower K M L a = + (a ⊗ₜ[K] (1 : M)) ⊗ₜ[M] (1 : L) := + rfl + +/-- Embed `L` into the iterated tensor model. -/ +def topFieldToTower : + L →ₐ[K] TowerRelativeAdeleRing K M L := + { (Algebra.TensorProduct.includeRight + (R := M) + (A := RelativeAdeleRing K M) (B := L)).toRingHom with + commutes' := by + intro k + rw [IsScalarTower.algebraMap_apply K M L] + change + 1 ⊗ₜ[M] + algebraMap M L (algebraMap K M k) = + algebraMap K + (TowerRelativeAdeleRing K M L) k + rw [← Algebra.TensorProduct.tmul_one_eq_one_tmul + (R := M) + (A := RelativeAdeleRing K M) + (B := L)] + change + ((1 : NumberField.AdeleRing (𝓞 K) K) ⊗ₜ[K] + algebraMap K M k) ⊗ₜ[M] (1 : L) = + ((algebraMap K + (NumberField.AdeleRing (𝓞 K) K) k) ⊗ₜ[K] + (1 : M)) ⊗ₜ[M] (1 : L) + rw [← Algebra.TensorProduct.tmul_one_eq_one_tmul + (R := K) + (A := NumberField.AdeleRing (𝓞 K) K) + (B := M)] + } + +omit [NumberField M] [NumberField L] + [FiniteDimensional K M] [FiniteDimensional M L] in +@[simp] +theorem topFieldToTower_apply + (x : L) : + topFieldToTower K M L x = + (1 : RelativeAdeleRing K M) ⊗ₜ[M] x := + rfl + +/-- Expand the one-step tensor model back to the iterated tower model. -/ +def towerRelativeAdeleUnflatten : + RelativeAdeleRing K L →ₐ[K] + TowerRelativeAdeleRing K M L := + { (towerRelativeAdeleRingEquiv K M L).symm.toRingHom with + commutes' := by + intro k + simp [towerRelativeAdeleRingEquiv] } + +omit [NumberField M] [NumberField L] + [FiniteDimensional K M] [FiniteDimensional M L] in +@[simp] +theorem towerRelativeAdeleUnflatten_tmul + (a : NumberField.AdeleRing (𝓞 K) K) + (x : L) : + towerRelativeAdeleUnflatten K M L (a ⊗ₜ[K] x) = + bottomAdeleToTower K M L a * + topFieldToTower K M L x := by + simp [towerRelativeAdeleUnflatten, + towerRelativeAdeleRingEquiv, + bottomAdeleToTower_apply, + topFieldToTower_apply, + Algebra.TensorProduct.tmul_mul_tmul] + +/-- The flattening equivalence as an equivalence over the bottom adele +ring. This is the form needed for invariance of determinant norms. -/ +def towerRelativeAdeleAlgEquiv : + TowerRelativeAdeleRing K M L ≃ₐ[NumberField.AdeleRing (𝓞 K) K] + RelativeAdeleRing K L := + { towerRelativeAdeleRingEquiv K M L with + commutes' := by + intro a + change + towerRelativeAdeleFlatten K M L + ((a ⊗ₜ[K] (1 : M)) ⊗ₜ[M] (1 : L)) = + a ⊗ₜ[K] (1 : L) + simp } + +/-- Unit group of the tower presentation of the relative adeles of +`L`. -/ +abbrev TowerRelativeIdeleGroup := + (TowerRelativeAdeleRing K M L)ˣ + +/-- The canonical equivalence from the tower presentation of the +relative ideles of `L` to the one-step presentation over `K`. -/ +def towerRelativeIdeleEquiv : + TowerRelativeIdeleGroup K M L ≃* + RelativeIdeleGroup K L := + Units.mapEquiv + (towerRelativeAdeleRingEquiv K M L).toMulEquiv + +-- Fix the canonical commutativity proof for the tower's tensor-product units. +local instance : IsMulCommutative (TowerRelativeIdeleGroup K M L) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +local instance : IsMulCommutative (RelativeIdeleGroup.ClassGroup K L) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +local instance : IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +namespace TowerRelativeIdeleGroup + +/-- The diagonal copy of `Lˣ` in the tower relative idele group. -/ +def principalIdele : + Lˣ →* TowerRelativeIdeleGroup K M L := + Units.map + (Algebra.TensorProduct.includeRight + (R := M) (A := RelativeAdeleRing K M) (B := L)).toRingHom + +omit [NumberField M] [NumberField L] + [FiniteDimensional K M] [FiniteDimensional M L] in +/-- Flattening the tower presentation preserves the diagonal copy of +`Lˣ`. -/ +@[simp] +theorem towerRelativeIdeleEquiv_principalIdele + (x : Lˣ) : + towerRelativeIdeleEquiv K M L + (principalIdele K M L x) = + RelativeIdeleGroup.principalIdele K L x := by + apply Units.ext + change + towerRelativeAdeleFlatten K M L + ((1 : RelativeAdeleRing K M) ⊗ₜ[M] (x : L)) = + (1 : NumberField.AdeleRing (𝓞 K) K) ⊗ₜ[K] (x : L) + rw [towerRelativeAdeleFlatten_tmul] + simp [topFieldToOneStep_apply] + +/-- Principal ideles in the tower presentation. -/ +def principalSubgroup : + Subgroup (TowerRelativeIdeleGroup K M L) := + (principalIdele K M L).range + +/-- The idele class group of `L` in the tower presentation. -/ +abbrev ClassGroup := + TowerRelativeIdeleGroup K M L ⧸ + principalSubgroup K M L + +omit [NumberField M] [NumberField L] + [FiniteDimensional K M] [FiniteDimensional M L] in +/-- The canonical equivalence maps tower principal ideles exactly onto +the one-step principal-ideles subgroup. -/ +theorem principalSubgroup_map_towerRelativeIdeleEquiv : + (principalSubgroup K M L).map + (towerRelativeIdeleEquiv K M L) = + RelativeIdeleGroup.principalSubgroup K L := by + rw [principalSubgroup, + RelativeIdeleGroup.principalSubgroup, + MonoidHom.map_range] + congr 1 + ext x + exact congrArg Units.val + (towerRelativeIdeleEquiv_principalIdele K M L x) + +/-- Canonical equivalence between the tower and one-step presentations +of the relative idele class group of `L`. -/ +def classGroupEquiv : + ClassGroup K M L ≃* + RelativeIdeleGroup.ClassGroup K L := + QuotientGroup.congr + (principalSubgroup K M L) + (RelativeIdeleGroup.principalSubgroup K L) + (towerRelativeIdeleEquiv K M L) + (principalSubgroup_map_towerRelativeIdeleEquiv K M L) + +omit [NumberField M] [NumberField L] + [FiniteDimensional K M] [FiniteDimensional M L] in +theorem classGroupEquiv_mk + (a : TowerRelativeIdeleGroup K M L) : + classGroupEquiv K M L + (QuotientGroup.mk' (principalSubgroup K M L) a) = + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) + (towerRelativeIdeleEquiv K M L a) := + rfl + +/-- Determinant norm from the tower presentation of `𝔸_L` to +`𝔸_M = 𝔸_K ⊗[K] M`. -/ +def norm : + TowerRelativeIdeleGroup K M L →* + RelativeIdeleGroup K M := + Units.map (Algebra.norm (RelativeAdeleRing K M)) + +omit [NumberField M] [NumberField L] in +/-- Transitivity of determinant norms, after flattening the tower +presentation to the one-step presentation. -/ +theorem norm_transitive_flatten + (a : TowerRelativeIdeleGroup K M L) : + RelativeIdeleGroup.norm K M (norm K M L a) = + RelativeIdeleGroup.norm K L + (towerRelativeIdeleEquiv K M L a) := by + apply + (IdeleGroup.equivAdeleRingUnits (K := K)).injective + apply Units.ext + change + Algebra.norm (NumberField.AdeleRing (𝓞 K) K) + (Algebra.norm (RelativeAdeleRing K M) + (a : TowerRelativeAdeleRing K M L)) = + Algebra.norm (NumberField.AdeleRing (𝓞 K) K) + (towerRelativeAdeleFlatten K M L + (a : TowerRelativeAdeleRing K M L)) + calc + _ = Algebra.norm (NumberField.AdeleRing (𝓞 K) K) + (a : TowerRelativeAdeleRing K M L) := + Algebra.norm_norm + _ = _ := + (Algebra.norm_eq_of_algEquiv + (towerRelativeAdeleAlgEquiv K M L) + (a : TowerRelativeAdeleRing K M L)).symm + +omit [NumberField M] [NumberField L] [Algebra K L] [IsScalarTower K M L] + [FiniteDimensional K M] in +/-- Base change of the field norm from `M` to the relative adele +algebra `𝔸_K ⊗[K] M`. -/ +theorem norm_fieldInclusion + (x : L) : + Algebra.norm (RelativeAdeleRing K M) + (Algebra.TensorProduct.includeRight + (R := M) (A := RelativeAdeleRing K M) (B := L) x) = + algebraMap M (RelativeAdeleRing K M) + (Algebra.norm M x) := by + classical + let b := Module.Free.chooseBasis M L + let bA := b.baseChange (RelativeAdeleRing K M) + rw [Algebra.norm_eq_matrix_det bA, + Algebra.norm_eq_matrix_det b, + (algebraMap M (RelativeAdeleRing K M)).map_det] + congr 1 + ext i j + simp [bA, b, Algebra.smul_def, + Algebra.leftMulMatrix_eq_repr_mul, + Algebra.TensorProduct.tmul_mul_tmul] + +omit [NumberField M] [NumberField L] [Algebra K L] [IsScalarTower K M L] + [FiniteDimensional K M] in +/-- The tower idele norm carries a principal idele to the principal +idele of the field norm. -/ +@[simp] +theorem norm_principalIdele + (x : Lˣ) : + norm K M L (principalIdele K M L x) = + RelativeIdeleGroup.principalIdele K M + (Units.map (Algebra.norm M) x) := by + apply Units.ext + exact norm_fieldInclusion K M L (x : L) + +/-- The tower norm descended to actual idele class groups. -/ +def classNorm : + ClassGroup K M L →* + RelativeIdeleGroup.ClassGroup K M := + QuotientGroup.map + (principalSubgroup K M L) + (RelativeIdeleGroup.principalSubgroup K M) + (norm K M L) + (by + rintro _ ⟨x, rfl⟩ + exact + ⟨Units.map (Algebra.norm M) x, + (norm_principalIdele K M L x).symm⟩) + +omit [NumberField M] [NumberField L] [Algebra K L] [IsScalarTower K M L] + [FiniteDimensional K M] in +theorem classNorm_mk + (a : TowerRelativeIdeleGroup K M L) : + classNorm K M L + (QuotientGroup.mk' + (principalSubgroup K M L) a) = + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K M) + (norm K M L a) := + rfl + +end TowerRelativeIdeleGroup + +section NormQuotientSequence + +/-- The norm quotient `C_M / N_{L/M} C_L` in the fixed-bottom-field +tower model. -/ +abbrev IntermediateClassNormQuotient := + RelativeIdeleGroup.ClassGroup K M ⧸ + (TowerRelativeIdeleGroup.classNorm K M L).range + +/-- The composite class norm `C_L → C_M → C_K` in the tower model. -/ +def towerCompositeClassNorm : + TowerRelativeIdeleGroup.ClassGroup K M L →* + IdeleClassGroup K := + (RelativeIdeleGroup.classNorm K M).comp + (TowerRelativeIdeleGroup.classNorm K M L) + +omit [NumberField M] in +/-- After identifying the tower presentation with the one-step +presentation, the composite tower norm is the ordinary class norm from +`L` to `K`. -/ +theorem towerCompositeClassNorm_eq_ideleClassNorm + (c : TowerRelativeIdeleGroup.ClassGroup K M L) : + towerCompositeClassNorm K M L c = + RelativeIdeleGroup.classNorm K L + (TowerRelativeIdeleGroup.classGroupEquiv K M L c) := by + refine QuotientGroup.induction_on c ?_ + intro a + simp only [towerCompositeClassNorm, MonoidHom.comp_apply] + exact congrArg + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K)) + (TowerRelativeIdeleGroup.norm_transitive_flatten K M L a) + +omit [NumberField M] in +/-- The tower composite norm and the ordinary one-step norm have the +same subgroup of norms in `C_K`. -/ +theorem towerCompositeClassNorm_range_eq : + (towerCompositeClassNorm K M L).range = + (RelativeIdeleGroup.classNorm K L).range := by + ext c + constructor + · rintro ⟨d, rfl⟩ + exact + ⟨TowerRelativeIdeleGroup.classGroupEquiv K M L d, + (towerCompositeClassNorm_eq_ideleClassNorm + K M L d).symm⟩ + · rintro ⟨d, rfl⟩ + refine + ⟨(TowerRelativeIdeleGroup.classGroupEquiv K M L).symm d, + ?_⟩ + rw [towerCompositeClassNorm_eq_ideleClassNorm, + MulEquiv.apply_symm_apply] + +/-- The corresponding concrete quotient `C_K / N_{L/K} C_L`, before +identifying the tower presentation of `C_L` with the one-step +presentation. -/ +abbrev TowerCompositeClassNormQuotient := + IdeleClassGroup K ⧸ + (towerCompositeClassNorm K M L).range + +/-- Canonical identification of the tower composite norm quotient with +the existing one-step norm quotient `C_K / N_{L/K}C_L`. -/ +def towerCompositeClassNormQuotientEquiv : + TowerCompositeClassNormQuotient K M L ≃* + RelativeIdeleGroup.ClassNormQuotient K L := + QuotientGroup.congr + (towerCompositeClassNorm K M L).range + (RelativeIdeleGroup.classNorm K L).range + (MulEquiv.refl (IdeleClassGroup K)) + (by + simpa using towerCompositeClassNorm_range_eq K M L) + +/-- The norm-induced first map + +`C_M / N_{L/M}C_L → C_K / N_{L/K}C_L`. +-/ +def intermediateToCompositeNormQuotient : + IntermediateClassNormQuotient K M L →* + TowerCompositeClassNormQuotient K M L := + QuotientGroup.map + (TowerRelativeIdeleGroup.classNorm K M L).range + (towerCompositeClassNorm K M L).range + (RelativeIdeleGroup.classNorm K M) + (by + rintro _ ⟨c, rfl⟩ + exact ⟨c, rfl⟩) + +/-- The quotient map + +`C_K / N_{L/K}C_L → C_K / N_{M/K}C_M`. +-/ +def compositeToBaseNormQuotient : + TowerCompositeClassNormQuotient K M L →* + RelativeIdeleGroup.ClassNormQuotient K M := + QuotientGroup.map + (towerCompositeClassNorm K M L).range + (RelativeIdeleGroup.classNorm K M).range + (MonoidHom.id (IdeleClassGroup K)) + (by + rintro _ ⟨c, rfl⟩ + exact + ⟨TowerRelativeIdeleGroup.classNorm K M L c, rfl⟩) + +omit [NumberField M] [NumberField L] [Algebra K L] [IsScalarTower K M L] in +theorem intermediateToCompositeNormQuotient_mk + (c : RelativeIdeleGroup.ClassGroup K M) : + intermediateToCompositeNormQuotient K M L + (QuotientGroup.mk' + (TowerRelativeIdeleGroup.classNorm K M L).range c) = + QuotientGroup.mk' + (towerCompositeClassNorm K M L).range + (RelativeIdeleGroup.classNorm K M c) := + rfl + +omit [NumberField M] [NumberField L] [Algebra K L] [IsScalarTower K M L] in +theorem compositeToBaseNormQuotient_mk + (c : IdeleClassGroup K) : + compositeToBaseNormQuotient K M L + (QuotientGroup.mk' + (towerCompositeClassNorm K M L).range c) = + QuotientGroup.mk' + (RelativeIdeleGroup.classNorm K M).range c := + rfl + +omit [NumberField M] [NumberField L] [Algebra K L] [IsScalarTower K M L] in +/-- Exactness of the concrete tower norm-quotient sequence. -/ +theorem intermediateToCompositeNormQuotient_range_eq_ker : + MonoidHom.range + (intermediateToCompositeNormQuotient K M L) = + MonoidHom.ker + (compositeToBaseNormQuotient K M L) := by + ext q + constructor + · rintro ⟨a, rfl⟩ + refine QuotientGroup.induction_on a ?_ + intro c + change + QuotientGroup.mk' + (RelativeIdeleGroup.classNorm K M).range + (RelativeIdeleGroup.classNorm K M c) = 1 + exact + (QuotientGroup.eq_one_iff + (RelativeIdeleGroup.classNorm K M c)).2 ⟨c, rfl⟩ + · intro hq + refine QuotientGroup.induction_on q ?_ hq + intro c hc + change + QuotientGroup.mk' + (RelativeIdeleGroup.classNorm K M).range c = 1 + at hc + have hcRange : + c ∈ (RelativeIdeleGroup.classNorm K M).range := + (QuotientGroup.eq_one_iff c).1 hc + obtain ⟨d, rfl⟩ := hcRange + refine + ⟨QuotientGroup.mk' + (TowerRelativeIdeleGroup.classNorm K M L).range d, + ?_⟩ + rfl + +omit [NumberField M] [NumberField L] [Algebra K L] [IsScalarTower K M L] in +/-- The last map in the tower norm-quotient sequence is onto. -/ +theorem compositeToBaseNormQuotient_surjective : + Function.Surjective + (compositeToBaseNormQuotient K M L) := by + intro q + refine QuotientGroup.induction_on q ?_ + intro c + exact + ⟨QuotientGroup.mk' + (towerCompositeClassNorm K M L).range c, + rfl⟩ + +omit [NumberField M] [NumberField L] [Algebra K L] [IsScalarTower K M L] in +/-- Cardinal bound supplied by the actual right-exact tower sequence: + +`#(C_K / N_{L/K}C_L) ≤ + #(C_M / N_{L/M}C_L) · #(C_K / N_{M/K}C_M)`. + +Only finiteness of the two outer quotients is required; finiteness of +the middle quotient is constructed from exactness. -/ +theorem towerCompositeClassNormQuotient_card_le_mul + [Finite (IntermediateClassNormQuotient K M L)] + [Finite (RelativeIdeleGroup.ClassNormQuotient K M)] : + Nat.card (TowerCompositeClassNormQuotient K M L) ≤ + Nat.card (IntermediateClassNormQuotient K M L) * + Nat.card (RelativeIdeleGroup.ClassNormQuotient K M) := by + let A := IntermediateClassNormQuotient K M L + let B := TowerCompositeClassNormQuotient K M L + let C := RelativeIdeleGroup.ClassNormQuotient K M + let f : A →* B := + intermediateToCompositeNormQuotient K M L + let g : B →* C := + compositeToBaseNormQuotient K M L + let : Fintype A := Fintype.ofFinite A + let : Fintype C := Fintype.ofFinite C + let : Fintype B := + Group.fintypeOfKerEqRange f g + (intermediateToCompositeNormQuotient_range_eq_ker + K M L).symm + have hg : + Function.Surjective g := + compositeToBaseNormQuotient_surjective K M L + have hquot : + Nat.card (B ⧸ g.ker) = Nat.card C := + Nat.card_congr + (QuotientGroup.quotientKerEquivOfSurjective + g hg).toEquiv + have hrange : + Nat.card f.range ≤ Nat.card A := + Nat.card_le_card_of_surjective + f.rangeRestrict + f.rangeRestrict_surjective + calc + Nat.card B = + Nat.card (B ⧸ g.ker) * + Nat.card g.ker := + Subgroup.card_eq_card_quotient_mul_card_subgroup + g.ker + _ = Nat.card C * Nat.card f.range := by + rw [hquot, + ← intermediateToCompositeNormQuotient_range_eq_ker + K M L] + _ ≤ Nat.card C * Nat.card A := + Nat.mul_le_mul_left (Nat.card C) hrange + _ = Nat.card A * Nat.card C := Nat.mul_comm _ _ + +omit [NumberField M] in +/-- The tower cardinal bound in the standard one-step presentation: + +`#(C_K / N_{L/K}C_L) ≤ + #(C_M / N_{L/M}C_L) · #(C_K / N_{M/K}C_M)`. +-/ +theorem ideleClassNormQuotient_card_le_mul + [Finite (IntermediateClassNormQuotient K M L)] + [Finite (RelativeIdeleGroup.ClassNormQuotient K M)] : + Nat.card (RelativeIdeleGroup.ClassNormQuotient K L) ≤ + Nat.card (IntermediateClassNormQuotient K M L) * + Nat.card (RelativeIdeleGroup.ClassNormQuotient K M) := by + calc + Nat.card (RelativeIdeleGroup.ClassNormQuotient K L) = + Nat.card (TowerCompositeClassNormQuotient K M L) := + Nat.card_congr + (towerCompositeClassNormQuotientEquiv K M L).symm.toEquiv + _ ≤ Nat.card (IntermediateClassNormQuotient K M L) * + Nat.card (RelativeIdeleGroup.ClassNormQuotient K M) := + towerCompositeClassNormQuotient_card_le_mul K M L + +end NormQuotientSequence diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerAlgEquivNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerAlgEquivNaturality.lean new file mode 100644 index 0000000000..2bd55e0ae1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerAlgEquivNaturality.lean @@ -0,0 +1,463 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +/-! +# Naturality of tower base change under number-field equivalences + +The ordinary idele group of a finite extension is obtained from the +relative tensor presentation by scalar extension. This file proves that +this comparison is natural when both fields in the extension are replaced +by compatible equivalent number fields. The proof passes through the +fixed-bottom tower + +`(𝔸_ℚ ⊗[ℚ] K) ⊗[K] L` + +and therefore uses only tensor-product coherence; no new description of +local components is introduced. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField + +noncomputable +section + +variable + {K K' L L' : Type} + [Field K] [NumberField K] + [Field K'] [NumberField K'] + [Field L] [NumberField L] [Algebra K L] + [Field L'] [NumberField L'] [Algebra K' L'] + [FiniteDimensional K L] + [FiniteDimensional K' L'] + +section CongrComposition + +variable + {M N : Type} + [Field M] [NumberField M] + [Field N] [NumberField N] + +/-- Relative adelic transport over `ℚ` is functorial in the transported +top field. -/ +theorem relativeAdeleCongr_trans + (e : K ≃ₐ[ℚ] M) + (f : M ≃ₐ[ℚ] N) + (z : RelativeAdeleRing ℚ K) : + relativeAdeleCongr (K := ℚ) f + (relativeAdeleCongr (K := ℚ) e z) = + relativeAdeleCongr (K := ℚ) (e.trans f) z := by + induction z using TensorProduct.inductionOn with + | add x y hx hy => + simpa only [map_add] using congrArg₂ (· + ·) hx hy + | tmul a x => + rw [relativeAdeleCongr_tmul, + relativeAdeleCongr_tmul, + relativeAdeleCongr_tmul] + rfl + +/-- Canonical transport of ordinary adele rings is functorial. -/ +theorem adeleCongr_trans + (e : K ≃ₐ[ℚ] M) + (f : M ≃ₐ[ℚ] N) + (a : NumberField.AdeleRing (𝓞 K) K) : + adeleCongr f (adeleCongr e a) = + adeleCongr (e.trans f) a := by + change + relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := N) + (relativeAdeleCongr (K := ℚ) f + ((relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := M)).symm + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := M) + (relativeAdeleCongr (K := ℚ) e + ((relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K)).symm a))))) = + relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := N) + (relativeAdeleCongr (K := ℚ) (e.trans f) + ((relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K)).symm a)) + rw [RingEquiv.symm_apply_apply, + relativeAdeleCongr_trans] + +/-- Canonical transport of ordinary ideles is functorial. -/ +theorem ideleCongr_trans + (e : K ≃ₐ[ℚ] M) + (f : M ≃ₐ[ℚ] N) + (a : IdeleGroup K) : + ideleCongr f (ideleCongr e a) = + ideleCongr (e.trans f) a := by + apply + (IdeleGroup.equivAdeleRingUnits + (K := N)).injective + simp only [ideleCongr, MulEquiv.trans_apply, + MulEquiv.apply_symm_apply] + apply Units.ext + exact adeleCongr_trans e f + (((IdeleGroup.equivAdeleRingUnits + (K := K) a : + (NumberField.AdeleRing (𝓞 K) K)ˣ) : + NumberField.AdeleRing (𝓞 K) K)) + +/-- Canonical transport of ordinary idele classes is functorial. -/ +theorem ideleClassCongr_trans + (e : K ≃ₐ[ℚ] M) + (f : M ≃ₐ[ℚ] N) + (c : IdeleClassGroup K) : + ideleClassCongr f (ideleClassCongr e c) = + ideleClassCongr (e.trans f) c := by + refine QuotientGroup.induction_on c ?_ + intro a + exact congrArg + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup N)) + (ideleCongr_trans e f a) + +/-- Transport of ordinary idele classes along the identity +number-field equivalence is the identity. -/ +@[simp] +theorem ideleClassCongr_refl + (c : IdeleClassGroup K) : + ideleClassCongr + (AlgEquiv.refl : K ≃ₐ[ℚ] K) c = + c := by + refine QuotientGroup.induction_on c ?_ + intro a + change + ideleClassCongr + (AlgEquiv.refl : K ≃ₐ[ℚ] K) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a + rw [ideleClassCongr_mk] + congr 1 + apply + (IdeleGroup.equivAdeleRingUnits + (K := K)).injective + simp only [ideleCongr, MulEquiv.trans_apply, + MulEquiv.apply_symm_apply] + apply Units.ext + let u : NumberField.AdeleRing (𝓞 K) K := + ((IdeleGroup.equivAdeleRingUnits (K := K) a : + (NumberField.AdeleRing (𝓞 K) K)ˣ) : + NumberField.AdeleRing (𝓞 K) K) + change + adeleCongr + (AlgEquiv.refl : K ≃ₐ[ℚ] K) u = + u + let z : RelativeAdeleRing ℚ K := + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K)).symm u + have hz : + relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K) z = u := + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K)).apply_symm_apply u + have hcongr : + relativeAdeleCongr (K := ℚ) + (AlgEquiv.refl : K ≃ₐ[ℚ] K) z = z := by + induction z using TensorProduct.inductionOn with + | add x y hx hy => + simpa only [map_add] using congrArg₂ (· + ·) hx hy + | tmul b x => + rw [relativeAdeleCongr_tmul] + rfl + calc + adeleCongr + (AlgEquiv.refl : K ≃ₐ[ℚ] K) u = + adeleCongr + (AlgEquiv.refl : K ≃ₐ[ℚ] K) + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K) z) := + congrArg _ hz.symm + _ = + relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K) + (relativeAdeleCongr (K := ℚ) + (AlgEquiv.refl : K ≃ₐ[ℚ] K) z) := + (relativeAdeleBaseChangeRingEquiv_relativeAdeleCongr + (AlgEquiv.refl : K ≃ₐ[ℚ] K) z).symm + _ = + relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K) z := by + rw [hcongr] + _ = u := hz + +end CongrComposition + +omit [FiniteDimensional K L] [FiniteDimensional K' L'] in +/-- Before passing to ordinary adeles, compatible transport of a tower +agrees with transporting its flattened rational tensor presentation. -/ +theorem relativeAdeleCongrOfAlgEquiv_towerActual + (eK : K ≃ₐ[ℚ] K') + (eL : L ≃ₐ[ℚ] L') + (h : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) + (z : TowerRelativeAdeleRing ℚ K L) : + relativeAdeleCongrOfAlgEquiv eK eL h + (towerActualRelativeAdeleRingEquiv ℚ K L z) = + towerActualRelativeAdeleRingEquiv ℚ K' L' + (towerRelativeAdeleUnflatten ℚ K' L' + (relativeAdeleCongr (K := ℚ) eL + (towerRelativeAdeleFlatten ℚ K L z))) := by + induction z using TensorProduct.inductionOn with + | add z₁ z₂ hz₁ hz₂ => + simpa only [map_add] using congrArg₂ (· + ·) hz₁ hz₂ + | tmul b x => + induction b using TensorProduct.inductionOn with + | add b₁ b₂ hb₁ hb₂ => + simpa only [TensorProduct.add_tmul, map_add] using + congrArg₂ (· + ·) hb₁ hb₂ + | tmul a y => + have hK : + adeleCongr eK + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K) (a ⊗ₜ[ℚ] y)) = + relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K') + (a ⊗ₜ[ℚ] eK y) := by + rw [← + relativeAdeleBaseChangeRingEquiv_relativeAdeleCongr + eK (a ⊗ₜ[ℚ] y), + relativeAdeleCongr_tmul] + change + relativeAdeleCongrOfAlgEquiv eK eL h + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K) (a ⊗ₜ[ℚ] y) ⊗ₜ[K] x) = + towerActualRelativeAdeleRingEquiv ℚ K' L' + (towerRelativeAdeleUnflatten ℚ K' L' + (relativeAdeleCongr (K := ℚ) eL + (towerRelativeAdeleFlatten ℚ K L + ((a ⊗ₜ[ℚ] y) ⊗ₜ[K] x)))) + rw [relativeAdeleCongrOfAlgEquiv_tmul, + towerRelativeAdeleFlatten_tmul, + intermediateAdeleInclusion_tmul, + topFieldToOneStep_apply, + Algebra.TensorProduct.tmul_mul_tmul, + mul_one, + relativeAdeleCongr_tmul, + map_mul, h, + towerRelativeAdeleUnflatten_tmul, + bottomAdeleToTower_apply, + topFieldToTower_apply, + Algebra.TensorProduct.tmul_mul_tmul, + mul_one, one_mul, + towerActualRelativeAdeleRingEquiv_tmul] + rw [hK] + change + relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K') (a ⊗ₜ[ℚ] eK y) ⊗ₜ[K'] eL x = + relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K') (a ⊗ₜ[ℚ] (1 : K')) ⊗ₜ[K'] + ((algebraMap K' L') (eK y) * eL x) + have htmul : + (a ⊗ₜ[ℚ] eK y : RelativeAdeleRing ℚ K') = + (a ⊗ₜ[ℚ] (1 : K')) * + ((1 : NumberField.AdeleRing (𝓞 ℚ) ℚ) ⊗ₜ[ℚ] eK y) := by + rw [Algebra.TensorProduct.tmul_mul_tmul, + mul_one, one_mul] + rw [htmul, map_mul, + relativeAdeleBaseChangeRingEquiv_fieldInclusion] + rw [mul_comm + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K') (a ⊗ₜ[ℚ] (1 : K'))) + (algebraMap K' + (NumberField.AdeleRing (𝓞 K') K') (eK y)), + ← Algebra.smul_def, TensorProduct.smul_tmul, + Algebra.smul_def] + +/-- The relative-to-ordinary adele comparison commutes with compatible +equivalences of both fields in a finite extension. -/ +theorem relativeAdeleBaseChangeRingEquiv_congrOfAlgEquiv + (eK : K ≃ₐ[ℚ] K') + (eL : L ≃ₐ[ℚ] L') + (h : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) + (z : RelativeAdeleRing K L) : + relativeAdeleBaseChangeRingEquiv + (K := K') (L := L') + (relativeAdeleCongrOfAlgEquiv eK eL h z) = + adeleCongr eL + (relativeAdeleBaseChangeRingEquiv + (K := K) (L := L) z) := by + let t : TowerRelativeAdeleRing ℚ K L := + (towerActualRelativeAdeleRingEquiv ℚ K L).symm z + let q : RelativeAdeleRing ℚ L' := + relativeAdeleCongr (K := ℚ) eL + (towerRelativeAdeleFlatten ℚ K L t) + calc + relativeAdeleBaseChangeRingEquiv + (K := K') (L := L') + (relativeAdeleCongrOfAlgEquiv eK eL h z) = + relativeAdeleBaseChangeRingEquiv + (K := K') (L := L') + (relativeAdeleCongrOfAlgEquiv eK eL h + (towerActualRelativeAdeleRingEquiv ℚ K L t)) := by + rw [(towerActualRelativeAdeleRingEquiv ℚ K L).apply_symm_apply] + _ = + relativeAdeleBaseChangeRingEquiv + (K := K') (L := L') + (towerActualRelativeAdeleRingEquiv ℚ K' L' + (towerRelativeAdeleUnflatten ℚ K' L' q)) := by + rw [relativeAdeleCongrOfAlgEquiv_towerActual] + _ = + relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := L') + (towerRelativeAdeleRingEquiv ℚ K' L' + (towerRelativeAdeleUnflatten ℚ K' L' q)) := + relativeAdeleBaseChangeRingEquiv_tower + ℚ K' L' (towerRelativeAdeleUnflatten ℚ K' L' q) + _ = + relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := L') q := by + change + relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := L') + ((towerRelativeAdeleRingEquiv ℚ K' L') + ((towerRelativeAdeleRingEquiv ℚ K' L').symm q)) = + relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := L') q + rw [RingEquiv.apply_symm_apply] + _ = + adeleCongr eL + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := L) + (towerRelativeAdeleFlatten ℚ K L t)) := + relativeAdeleBaseChangeRingEquiv_relativeAdeleCongr + eL (towerRelativeAdeleFlatten ℚ K L t) + _ = + adeleCongr eL + (relativeAdeleBaseChangeRingEquiv + (K := K) (L := L) + (towerActualRelativeAdeleRingEquiv ℚ K L t)) := by + change + adeleCongr eL + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := L) + ((towerRelativeAdeleRingEquiv ℚ K L) t)) = + adeleCongr eL + (relativeAdeleBaseChangeRingEquiv + (K := K) (L := L) + (towerActualRelativeAdeleRingEquiv ℚ K L t)) + rw [← relativeAdeleBaseChangeRingEquiv_tower] + _ = + adeleCongr eL + (relativeAdeleBaseChangeRingEquiv + (K := K) (L := L) z) := by + rw [(towerActualRelativeAdeleRingEquiv ℚ K L).apply_symm_apply] + +/-- The relative-to-ordinary idele comparison commutes with compatible +equivalences of both fields in a finite extension. -/ +theorem relativeIdeleBaseChangeMulEquiv_congrOfAlgEquiv + (eK : K ≃ₐ[ℚ] K') + (eL : L ≃ₐ[ℚ] L') + (h : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) + (a : RelativeIdeleGroup K L) : + relativeIdeleBaseChangeMulEquiv + (K := K') (L := L') + (relativeIdeleCongrOfAlgEquiv eK eL h a) = + ideleCongr eL + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) a) := by + apply + (IdeleGroup.equivAdeleRingUnits + (K := L')).injective + rw [relativeIdeleBaseChangeMulEquiv_eq_ringUnits] + simp only [ideleCongr, MulEquiv.trans_apply, + MulEquiv.apply_symm_apply, + relativeIdeleBaseChangeMulEquiv_eq_ringUnits] + apply Units.ext + exact + relativeAdeleBaseChangeRingEquiv_congrOfAlgEquiv + eK eL h (a : RelativeAdeleRing K L) + +/-- The relative-to-ordinary idele-class comparison commutes with +compatible equivalences of both fields in a finite extension. -/ +@[simp] +theorem relativeIdeleClassBaseChangeMulEquiv_congrOfAlgEquiv + (eK : K ≃ₐ[ℚ] K') + (eL : L ≃ₐ[ℚ] L') + (h : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) + (c : RelativeIdeleGroup.ClassGroup K L) : + relativeIdeleClassBaseChangeMulEquiv + (K := K') (L := L') + (relativeIdeleClassCongrOfAlgEquiv eK eL h c) = + ideleClassCongr eL + (relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := L) c) := by + refine QuotientGroup.induction_on c ?_ + intro a + exact congrArg + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup L')) + (relativeIdeleBaseChangeMulEquiv_congrOfAlgEquiv + eK eL h a) + +/-- Ordinary idele-class norms are natural under compatible +equivalences of finite number-field extensions. -/ +theorem ideleClassCongr_ideleClassNorm + (eK : K ≃ₐ[ℚ] K') + (eL : L ≃ₐ[ℚ] L') + (h : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) + (c : IdeleClassGroup L) : + ideleClassCongr eK (_root_.ideleClassNorm K L c) = + _root_.ideleClassNorm K' L' (ideleClassCongr eL c) := by + let d : RelativeIdeleGroup.ClassGroup K L := + (relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := L)).symm c + have hd : + relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := L) d = c := + (relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := L)).apply_symm_apply c + calc + ideleClassCongr eK (_root_.ideleClassNorm K L c) = + ideleClassCongr eK + (_root_.ideleClassNorm K L + (relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := L) d)) := by rw [hd] + _ = + ideleClassCongr eK + (RelativeIdeleGroup.classNorm K L d) := by + rw [ordinaryIdeleClassNorm_relativeIdeleClassBaseChange] + _ = + RelativeIdeleGroup.classNorm K' L' + (relativeIdeleClassCongrOfAlgEquiv eK eL h d) := + relativeIdeleClassCongrOfAlgEquiv_ideleClassNorm + eK eL h d + _ = + _root_.ideleClassNorm K' L' + (relativeIdeleClassBaseChangeMulEquiv + (K := K') (L := L') + (relativeIdeleClassCongrOfAlgEquiv eK eL h d)) := by + rw [ordinaryIdeleClassNorm_relativeIdeleClassBaseChange] + _ = + _root_.ideleClassNorm K' L' + (ideleClassCongr eL + (relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := L) d)) := by + rw [relativeIdeleClassBaseChangeMulEquiv_congrOfAlgEquiv] + _ = + _root_.ideleClassNorm K' L' + (ideleClassCongr eL c) := by + rw [hd] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerBaseChange.lean new file mode 100644 index 0000000000..c444caa043 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerBaseChange.lean @@ -0,0 +1,1066 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +/-! +# The fixed-bottom tower model and the actual intermediate-field model + +For a tower `K ⊂ M ⊂ L`, `IdeleClassTower` presents the ideles of `L` +as units of `(𝔸_K ⊗[K] M) ⊗[M] L`. Here we compare that presentation +with the actual relative idele group `𝔸_M ⊗[M] L`, by passing through +the ordinary ideles of `L`. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations + +universe u + +variable + (K M L : Type u) + [Field K] [NumberField K] + [Field M] [NumberField M] + [Field L] [NumberField L] + [Algebra K M] [Algebra M L] [Algebra K L] + [IsScalarTower K M L] + [FiniteDimensional K M] [FiniteDimensional M L] + +-- These canonical commutativity proofs are local to the imported tower +-- module; retain them here for the quotient-group instances. +local instance + towerBaseChange_towerRelativeIdeleGroupIsMulCommutative + (A B C : Type u) [Field A] [NumberField A] + [Field B] [Field C] [Algebra A B] [Algebra B C] : + IsMulCommutative (TowerRelativeIdeleGroup A B C) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +local instance + towerBaseChange_relativeIdeleClassGroupIsMulCommutative + (A B : Type u) [Field A] [NumberField A] + [Field B] [Algebra A B] : + IsMulCommutative (RelativeIdeleGroup.ClassGroup A B) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +local instance towerBaseChange_ideleClassGroupIsMulCommutative + (A : Type u) [Field A] [NumberField A] : + IsMulCommutative (IdeleClassGroup A) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +section RingComparison + +/-- The ring-level relative-to-ordinary comparison, regarded as an +equivalence of `M`-algebras. -/ +noncomputable def intermediateRelativeAdeleBaseChangeAlgEquiv : + RelativeAdeleRing K M ≃ₐ[M] + NumberField.AdeleRing (𝓞 M) M := + AlgEquiv.ofRingEquiv + (f := relativeAdeleBaseChangeRingEquiv + (K := K) (L := M)) + (by + intro m + change + relativeAdeleBaseChangeRingEquiv + (K := K) (L := M) + ((1 : NumberField.AdeleRing (𝓞 K) K) ⊗ₜ[K] m) = + algebraMap M + (NumberField.AdeleRing (𝓞 M) M) m + exact relativeAdeleBaseChangeRingEquiv_fieldInclusion + (K := K) (L := M) m) + +/-- Extend the intermediate adele-ring comparison along `M → L`. -/ +noncomputable def towerActualRelativeAdeleRingEquiv : + TowerRelativeAdeleRing K M L ≃+* + RelativeAdeleRing M L := + (Algebra.TensorProduct.congr + (intermediateRelativeAdeleBaseChangeAlgEquiv K M) + (AlgEquiv.refl : L ≃ₐ[M] L)).toRingEquiv + +omit [NumberField L] [Algebra K L] [IsScalarTower K M L] + [FiniteDimensional M L] in +@[simp] +theorem towerActualRelativeAdeleRingEquiv_tmul + (b : RelativeAdeleRing K M) + (x : L) : + towerActualRelativeAdeleRingEquiv K M L (b ⊗ₜ[M] x) = + intermediateRelativeAdeleBaseChangeAlgEquiv K M b ⊗ₜ[M] x := + rfl + +omit [NumberField L] [FiniteDimensional M L] in +/-- Passing from the fixed-bottom tower presentation to the actual +relative adele ring over the intermediate field intertwines +conjugation by an automorphism of the top field. -/ +theorem towerActualRelativeAdeleRingEquiv_unflatten_conjugation + (σ : L ≃ₐ[M] L) + (z : RelativeAdeleRing K L) : + towerActualRelativeAdeleRingEquiv K M L + (towerRelativeAdeleUnflatten K M L + (RelativeIdeleGroup.conjugation K L + (σ.restrictScalars K) z)) = + RelativeIdeleGroup.conjugation M L σ + (towerActualRelativeAdeleRingEquiv K M L + (towerRelativeAdeleUnflatten K M L z)) := by + induction z using TensorProduct.inductionOn with + | tmul a x => + simp [RelativeIdeleGroup.conjugation_tmul, + towerRelativeAdeleUnflatten_tmul, + bottomAdeleToTower_apply, topFieldToTower_apply, + towerActualRelativeAdeleRingEquiv_tmul, + Algebra.TensorProduct.tmul_mul_tmul] + | add x y hx hy => + simp only [map_add, hx, hy] + +private theorem relativeAdeleBaseChangeRingEquiv_tower_finiteComponent + (z : TowerRelativeAdeleRing K M L) + (W : HeightOneSpectrum (𝓞 L)) : + (relativeAdeleBaseChangeRingEquiv + (K := M) (L := L) + (towerActualRelativeAdeleRingEquiv K M L z)).2 W = + (relativeAdeleBaseChangeRingEquiv + (K := K) (L := L) + (towerRelativeAdeleRingEquiv K M L z)).2 W := by + induction z using TensorProduct.inductionOn with + | add z₁ z₂ hz₁ hz₂ => + simp only [map_add] + change + (relativeAdeleBaseChangeRingEquiv + (towerActualRelativeAdeleRingEquiv K M L z₁)).2 W + + (relativeAdeleBaseChangeRingEquiv + (towerActualRelativeAdeleRingEquiv K M L z₂)).2 W = + (relativeAdeleBaseChangeRingEquiv + (towerRelativeAdeleRingEquiv K M L z₁)).2 W + + (relativeAdeleBaseChangeRingEquiv + (towerRelativeAdeleRingEquiv K M L z₂)).2 W + exact congrArg₂ (· + ·) hz₁ hz₂ + | tmul b x => + induction b using TensorProduct.inductionOn with + | add b₁ b₂ hb₁ hb₂ => + simp only [TensorProduct.add_tmul, map_add] + change + (relativeAdeleBaseChangeRingEquiv + (towerActualRelativeAdeleRingEquiv K M L + (b₁ ⊗ₜ[M] x))).2 W + + (relativeAdeleBaseChangeRingEquiv + (towerActualRelativeAdeleRingEquiv K M L + (b₂ ⊗ₜ[M] x))).2 W = + (relativeAdeleBaseChangeRingEquiv + (towerRelativeAdeleRingEquiv K M L + (b₁ ⊗ₜ[M] x))).2 W + + (relativeAdeleBaseChangeRingEquiv + (towerRelativeAdeleRingEquiv K M L + (b₂ ⊗ₜ[M] x))).2 W + exact congrArg₂ (· + ·) hb₁ hb₂ + | tmul a m => + have hflatten : + towerRelativeAdeleRingEquiv K M L + ((a ⊗ₜ[K] m) ⊗ₜ[M] x) = + a ⊗ₜ[K] (algebraMap M L m * x) := by + change + towerRelativeAdeleFlatten K M L + ((a ⊗ₜ[K] m) ⊗ₜ[M] x) = + a ⊗ₜ[K] (algebraMap M L m * x) + rw [ + towerRelativeAdeleFlatten_tmul, + intermediateAdeleInclusion_tmul, + topFieldToOneStep_apply, + Algebra.TensorProduct.tmul_mul_tmul, mul_one] + let V := finitePlaceBelow (K := M) W + let v := finitePlaceBelow (K := K) W + have hv : + finitePlaceBelow (K := K) V = v := + finitePlaceBelow_finitePlaceBelow + (K := K) (M := M) (L := L) W + have hcomponent + (v' : HeightOneSpectrum (𝓞 K)) + (hv' : v' = v) + (hV : finitePlaceBelow (K := K) V = v') + (hWV : finitePlaceBelow (K := M) W = V) + (hWv : finitePlaceBelow (K := K) W = v) : + finitePlaceAdicCompletionMap M L V ⟨W, hWV⟩ + (finitePlaceAdicCompletionMap K M v' ⟨V, hV⟩ + (a.2 v') * + algebraMap M (V.adicCompletion M) m) * + algebraMap L (W.adicCompletion L) x = + finitePlaceAdicCompletionMap K L v ⟨W, hWv⟩ + (a.2 v) * + algebraMap L (W.adicCompletion L) + (algebraMap M L m * x) := by + subst v' + have hm : + finitePlaceAdicCompletionMap M L V ⟨W, hWV⟩ + (algebraMap M (V.adicCompletion M) m) = + algebraMap L (W.adicCompletion L) + (algebraMap M L m) := by + change + finitePlaceAdicCompletionMap M L V ⟨W, hWV⟩ + (m : V.adicCompletion M) = + (algebraMap M L m : W.adicCompletion L) + exact + finitePlaceAdicCompletionMap_coe M L + V ⟨W, hWV⟩ m + rw [map_mul, + finitePlaceAdicCompletionMap_comp K L (M := M) v V W + hV hWV hWv, + hm, + map_mul, mul_assoc] + rw [towerActualRelativeAdeleRingEquiv_tmul, hflatten] + rw [ + relativeAdeleBaseChangeRingEquiv_finiteComponent_tmul + (K := M) (L := L)] + change + finitePlaceAdicCompletionMap M L V ⟨W, rfl⟩ + ((relativeAdeleBaseChangeRingEquiv + (K := K) (L := M) (a ⊗ₜ[K] m)).2 V) * + algebraMap L (W.adicCompletion L) x = + (relativeAdeleBaseChangeRingEquiv + (K := K) (L := L) + (a ⊗ₜ[K] (algebraMap M L m * x))).2 W + rw [ + relativeAdeleBaseChangeRingEquiv_finiteComponent_tmul + (K := K) (L := M), + relativeAdeleBaseChangeRingEquiv_finiteComponent_tmul + (K := K) (L := L)] + exact hcomponent + (finitePlaceBelow (K := K) V) hv rfl rfl rfl + +private theorem relativeAdeleBaseChangeRingEquiv_tower_infiniteComponent + (z : TowerRelativeAdeleRing K M L) + (W : InfinitePlace L) : + (relativeAdeleBaseChangeRingEquiv + (K := M) (L := L) + (towerActualRelativeAdeleRingEquiv K M L z)).1 W = + (relativeAdeleBaseChangeRingEquiv + (K := K) (L := L) + (towerRelativeAdeleRingEquiv K M L z)).1 W := by + induction z using TensorProduct.inductionOn with + | add z₁ z₂ hz₁ hz₂ => + simp only [map_add] + change + (relativeAdeleBaseChangeRingEquiv + (towerActualRelativeAdeleRingEquiv K M L z₁)).1 W + + (relativeAdeleBaseChangeRingEquiv + (towerActualRelativeAdeleRingEquiv K M L z₂)).1 W = + (relativeAdeleBaseChangeRingEquiv + (towerRelativeAdeleRingEquiv K M L z₁)).1 W + + (relativeAdeleBaseChangeRingEquiv + (towerRelativeAdeleRingEquiv K M L z₂)).1 W + exact congrArg₂ (· + ·) hz₁ hz₂ + | tmul b x => + induction b using TensorProduct.inductionOn with + | add b₁ b₂ hb₁ hb₂ => + simp only [TensorProduct.add_tmul, map_add] + change + (relativeAdeleBaseChangeRingEquiv + (towerActualRelativeAdeleRingEquiv K M L + (b₁ ⊗ₜ[M] x))).1 W + + (relativeAdeleBaseChangeRingEquiv + (towerActualRelativeAdeleRingEquiv K M L + (b₂ ⊗ₜ[M] x))).1 W = + (relativeAdeleBaseChangeRingEquiv + (towerRelativeAdeleRingEquiv K M L + (b₁ ⊗ₜ[M] x))).1 W + + (relativeAdeleBaseChangeRingEquiv + (towerRelativeAdeleRingEquiv K M L + (b₂ ⊗ₜ[M] x))).1 W + exact congrArg₂ (· + ·) hb₁ hb₂ + | tmul a m => + have hflatten : + towerRelativeAdeleRingEquiv K M L + ((a ⊗ₜ[K] m) ⊗ₜ[M] x) = + a ⊗ₜ[K] (algebraMap M L m * x) := by + change + towerRelativeAdeleFlatten K M L + ((a ⊗ₜ[K] m) ⊗ₜ[M] x) = + a ⊗ₜ[K] (algebraMap M L m * x) + rw [ + towerRelativeAdeleFlatten_tmul, + intermediateAdeleInclusion_tmul, + topFieldToOneStep_apply, + Algebra.TensorProduct.tmul_mul_tmul, mul_one] + let V := infinitePlaceBelow (K := M) W + let v := infinitePlaceBelow (K := K) W + have hv : + infinitePlaceBelow (K := K) V = v := + infinitePlaceBelow_infinitePlaceBelow + (K := K) (M := M) (L := L) W + have hcomponent + (v' : InfinitePlace K) + (hv' : v' = v) + [hVv : V.1.LiesOver v'.1] + [hWV : W.1.LiesOver V.1] + [hWv : W.1.LiesOver v.1] : + NumberField.LiesOver.completionMap + (v := V) (w := W) + (NumberField.LiesOver.completionMap + (v := v') (w := V) (a.1 v') * + algebraMap M V.Completion m) * + algebraMap L W.Completion x = + NumberField.LiesOver.completionMap + (v := v) (w := W) (a.1 v) * + algebraMap L W.Completion + (algebraMap M L m * x) := by + subst v' + have hm : + NumberField.LiesOver.completionMap + (v := V) (w := W) + (algebraMap M V.Completion m) = + algebraMap L W.Completion + (algebraMap M L m) := by + have h : + algebraMap M V.Completion m = + ((WithAbs.toAbs V.1 m : WithAbs V.1) : + V.Completion) := + rfl + rw [h, + NumberField.LiesOver.completionMap_coe + (v := V) (w := W)] + apply InfinitePlace.Completion.ext + rw [ + InfinitePlace.Completion.algebraMap_toCompletion, + UniformSpace.Completion.algebraMap_def] + simp [WithAbs.algebraMap_left_apply, + WithAbs.algebraMap_right_apply] + rw [map_mul, + infinitePlaceCompletionMap_comp_apply + (K := K) (M := M) (L := L) W, + hm, + map_mul, mul_assoc] + let : V.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) + hv⟩ + let : W.1.LiesOver V.1 := ⟨rfl⟩ + let : W.1.LiesOver v.1 := ⟨rfl⟩ + rw [towerActualRelativeAdeleRingEquiv_tmul, hflatten] + rw [ + relativeAdeleBaseChangeRingEquiv_infiniteComponent_tmul + (K := M) (L := L)] + change + NumberField.LiesOver.completionMap + (v := V) (w := W) + ((relativeAdeleBaseChangeRingEquiv + (K := K) (L := M) (a ⊗ₜ[K] m)).1 V) * + algebraMap L W.Completion x = + _ + rw [ + relativeAdeleBaseChangeRingEquiv_infiniteComponent_tmul + (K := K) (L := M), + relativeAdeleBaseChangeRingEquiv_infiniteComponent_tmul + (K := K) (L := L)] + exact hcomponent + (infinitePlaceBelow (K := K) V) hv + (hVv := ⟨rfl⟩) + (hWV := ⟨rfl⟩) + (hWv := ⟨rfl⟩) + +/-- Passing from the fixed-bottom tower presentation to ordinary adeles +is independent of whether one first changes to the actual relative +presentation over the intermediate field. -/ +theorem relativeAdeleBaseChangeRingEquiv_tower + (z : TowerRelativeAdeleRing K M L) : + relativeAdeleBaseChangeRingEquiv + (K := M) (L := L) + (towerActualRelativeAdeleRingEquiv K M L z) = + relativeAdeleBaseChangeRingEquiv + (K := K) (L := L) + (towerRelativeAdeleRingEquiv K M L z) := by + apply Prod.ext + · funext W + exact + relativeAdeleBaseChangeRingEquiv_tower_infiniteComponent + K M L z W + · apply DFunLike.coe_injective + funext W + exact + relativeAdeleBaseChangeRingEquiv_tower_finiteComponent + K M L z W + +end RingComparison + +section IdeleComparison + +section ViaOrdinary + +/-- The comparison through ordinary ideles, recording the compatibility +with the original fixed-bottom flattening construction. -/ +noncomputable def towerRelativeIdeleViaOrdinaryMulEquiv : + TowerRelativeIdeleGroup K M L ≃* + RelativeIdeleGroup M L := + (towerRelativeIdeleEquiv K M L).trans + ((relativeIdeleBaseChangeMulEquiv + (K := K) (L := L)).trans + (relativeIdeleBaseChangeMulEquiv + (K := M) (L := L)).symm) + +omit [FiniteDimensional K M] in +@[simp] +theorem towerRelativeIdeleViaOrdinaryMulEquiv_apply + (a : TowerRelativeIdeleGroup K M L) : + towerRelativeIdeleViaOrdinaryMulEquiv K M L a = + (relativeIdeleBaseChangeMulEquiv + (K := M) (L := L)).symm + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) + (towerRelativeIdeleEquiv K M L a)) := + rfl + +end ViaOrdinary + +/-- The fixed-bottom tower presentation of the ideles of `L` is +canonically equivalent to the actual relative idele group over `M`, +using the underlying adele-ring scalar-extension equivalence. -/ +noncomputable def towerRelativeIdeleBaseChangeMulEquiv : + TowerRelativeIdeleGroup K M L ≃* + RelativeIdeleGroup M L := + Units.mapEquiv + (towerActualRelativeAdeleRingEquiv K M L).toMulEquiv + +/-- The ring-level tower coherence identifies the direct +tower-to-actual comparison with the comparison through ordinary ideles. -/ +theorem towerRelativeIdeleBaseChangeMulEquiv_eq_viaOrdinary + (a : TowerRelativeIdeleGroup K M L) : + towerRelativeIdeleBaseChangeMulEquiv K M L a = + towerRelativeIdeleViaOrdinaryMulEquiv K M L a := by + apply + (relativeIdeleBaseChangeMulEquiv + (K := M) (L := L)).injective + rw [towerRelativeIdeleViaOrdinaryMulEquiv_apply, + (relativeIdeleBaseChangeMulEquiv + (K := M) (L := L)).apply_symm_apply] + apply (IdeleGroup.equivAdeleRingUnits (K := L)).injective + rw [relativeIdeleBaseChangeMulEquiv_eq_ringUnits + (K := M) (L := L), + relativeIdeleBaseChangeMulEquiv_eq_ringUnits + (K := K) (L := L)] + apply Units.ext + exact + relativeAdeleBaseChangeRingEquiv_tower + K M L (a : TowerRelativeAdeleRing K M L) + +/-- Scalar extension from the tower presentation to ordinary ideles is +the same along the direct and intermediate-field routes. -/ +theorem relativeIdeleBaseChangeMulEquiv_tower + (a : TowerRelativeIdeleGroup K M L) : + relativeIdeleBaseChangeMulEquiv + (K := M) (L := L) + (towerRelativeIdeleBaseChangeMulEquiv K M L a) = + relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) + (towerRelativeIdeleEquiv K M L a) := by + rw [towerRelativeIdeleBaseChangeMulEquiv_eq_viaOrdinary, + towerRelativeIdeleViaOrdinaryMulEquiv_apply, + (relativeIdeleBaseChangeMulEquiv + (K := M) (L := L)).apply_symm_apply] + +omit [NumberField L] [Algebra K L] [IsScalarTower K M L] + [FiniteDimensional M L] in +/-- The comparison preserves the diagonal copy of `Lˣ`. -/ +@[simp] +theorem towerRelativeIdeleBaseChangeMulEquiv_principalIdele + (x : Lˣ) : + towerRelativeIdeleBaseChangeMulEquiv K M L + (TowerRelativeIdeleGroup.principalIdele K M L x) = + RelativeIdeleGroup.principalIdele M L x := by + apply Units.ext + change + towerActualRelativeAdeleRingEquiv K M L + ((1 : RelativeAdeleRing K M) ⊗ₜ[M] (x : L)) = + (1 : NumberField.AdeleRing (𝓞 M) M) ⊗ₜ[M] (x : L) + rw [towerActualRelativeAdeleRingEquiv_tmul] + simp + +omit [NumberField L] [FiniteDimensional M L] in +/-- The tower-to-actual comparison transports the restricted +bottom-field conjugation to conjugation over the intermediate field. -/ +theorem towerRelativeIdeleBaseChangeMulEquiv_unflatten_conjugation + (σ : L ≃ₐ[M] L) + (a : RelativeIdeleGroup K L) : + towerRelativeIdeleBaseChangeMulEquiv K M L + ((towerRelativeIdeleEquiv K M L).symm + (RelativeIdeleGroup.conjugationIdele K L + (σ.restrictScalars K) a)) = + RelativeIdeleGroup.conjugationIdele M L σ + (towerRelativeIdeleBaseChangeMulEquiv K M L + ((towerRelativeIdeleEquiv K M L).symm a)) := by + apply Units.ext + exact + towerActualRelativeAdeleRingEquiv_unflatten_conjugation + K M L σ (a : RelativeAdeleRing K L) + +omit [NumberField L] [Algebra K L] [IsScalarTower K M L] + [FiniteDimensional M L] in +/-- Extending an idele from the intermediate relative adele ring into +the tower and then passing to the actual `M`-relative presentation is +the ordinary relative class-field-theoretic inclusion. -/ +theorem towerRelativeIdeleBaseChangeMulEquiv_includeLeft + (a : RelativeIdeleGroup K M) : + towerRelativeIdeleBaseChangeMulEquiv K M L + (Units.map + (Algebra.TensorProduct.includeLeft + (R := M) (S := M) + (A := RelativeAdeleRing K M) (B := L)).toRingHom a) = + RelativeIdeleGroup.inclusion M L + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := M) a) := by + apply Units.ext + change + towerActualRelativeAdeleRingEquiv K M L + ((a : RelativeAdeleRing K M) ⊗ₜ[M] (1 : L)) = + ((IdeleGroup.equivAdeleRingUnits (K := M) + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := M) a) : + (NumberField.AdeleRing (𝓞 M) M)ˣ) : + NumberField.AdeleRing (𝓞 M) M) ⊗ₜ[M] (1 : L) + rw [towerActualRelativeAdeleRingEquiv_tmul] + congr 1 + simpa [intermediateRelativeAdeleBaseChangeAlgEquiv] using + congrArg Units.val + (relativeIdeleBaseChangeMulEquiv_eq_ringUnits + (K := K) (L := M) a).symm + +omit [NumberField L] [Algebra K L] [IsScalarTower K M L] + [FiniteDimensional M L] in +/-- The comparison maps tower principal ideles exactly onto the actual +relative principal-ideles subgroup over `M`. -/ +theorem towerPrincipalSubgroup_map_baseChange : + (TowerRelativeIdeleGroup.principalSubgroup K M L).map + (towerRelativeIdeleBaseChangeMulEquiv K M L) = + RelativeIdeleGroup.principalSubgroup M L := by + rw [TowerRelativeIdeleGroup.principalSubgroup, + RelativeIdeleGroup.principalSubgroup, + MonoidHom.map_range] + congr 1 + ext x + exact congrArg Units.val + (towerRelativeIdeleBaseChangeMulEquiv_principalIdele + K M L x) + +/-- The fixed-bottom tower class group is canonically the actual +relative idele class group of `L/M`. -/ +noncomputable def towerRelativeIdeleClassBaseChangeMulEquiv : + TowerRelativeIdeleGroup.ClassGroup K M L ≃* + RelativeIdeleGroup.ClassGroup M L := + QuotientGroup.congr + (TowerRelativeIdeleGroup.principalSubgroup K M L) + (RelativeIdeleGroup.principalSubgroup M L) + (towerRelativeIdeleBaseChangeMulEquiv K M L) + (towerPrincipalSubgroup_map_baseChange K M L) + +omit [NumberField L] [Algebra K L] [IsScalarTower K M L] + [FiniteDimensional M L] in +theorem towerRelativeIdeleClassBaseChangeMulEquiv_mk + (a : TowerRelativeIdeleGroup K M L) : + towerRelativeIdeleClassBaseChangeMulEquiv K M L + (QuotientGroup.mk' + (TowerRelativeIdeleGroup.principalSubgroup K M L) a) = + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup M L) + (towerRelativeIdeleBaseChangeMulEquiv K M L a) := + rfl + +/-- Scalar extension from a fixed-bottom tower class group to the +ordinary top-field idele class group is independent of the intermediate +presentation. -/ +theorem relativeIdeleClassBaseChangeMulEquiv_tower + (c : RelativeIdeleGroup.ClassGroup K L) : + relativeIdeleClassBaseChangeMulEquiv + (K := M) (L := L) + (towerRelativeIdeleClassBaseChangeMulEquiv K M L + ((TowerRelativeIdeleGroup.classGroupEquiv + K M L).symm c)) = + relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := L) c := by + obtain ⟨d, hd⟩ := + (TowerRelativeIdeleGroup.classGroupEquiv + K M L).surjective c + rw [← hd] + rw [(TowerRelativeIdeleGroup.classGroupEquiv + K M L).symm_apply_apply] + refine QuotientGroup.induction_on d ?_ + intro a + change + QuotientGroup.mk' (IdeleGroup.principalSubgroup L) + (relativeIdeleBaseChangeMulEquiv + (K := M) (L := L) + (towerRelativeIdeleBaseChangeMulEquiv K M L a)) = + QuotientGroup.mk' (IdeleGroup.principalSubgroup L) + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) + (towerRelativeIdeleEquiv K M L a)) + exact + congrArg + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup L)) + (relativeIdeleBaseChangeMulEquiv_tower K M L a) + +omit [NumberField L] [FiniteDimensional M L] in +/-- The class-group comparison transports the Galois action obtained +by restricting scalars from the bottom field to the natural action +over the intermediate field. -/ +theorem towerRelativeIdeleClassBaseChangeMulEquiv_smul + (σ : L ≃ₐ[M] L) + (c : RelativeIdeleGroup.ClassGroup K L) : + towerRelativeIdeleClassBaseChangeMulEquiv K M L + ((TowerRelativeIdeleGroup.classGroupEquiv K M L).symm + ((σ.restrictScalars K) • c)) = + σ • + towerRelativeIdeleClassBaseChangeMulEquiv K M L + ((TowerRelativeIdeleGroup.classGroupEquiv K M L).symm c) := by + refine QuotientGroup.induction_on c ?_ + intro a + change + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup M L) + (towerRelativeIdeleBaseChangeMulEquiv K M L + ((towerRelativeIdeleEquiv K M L).symm + (RelativeIdeleGroup.conjugationIdele K L + (σ.restrictScalars K) a))) = + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup M L) + (RelativeIdeleGroup.conjugationIdele M L σ + (towerRelativeIdeleBaseChangeMulEquiv K M L + ((towerRelativeIdeleEquiv K M L).symm a))) + exact congrArg + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup M L)) + (towerRelativeIdeleBaseChangeMulEquiv_unflatten_conjugation + K M L σ a) + +end IdeleComparison + +section NormComparison + +/-- The actual finite component of the tower model after the +intermediate adele-ring comparison. -/ +noncomputable def towerActualFiniteComponent + (W : HeightOneSpectrum (𝓞 M)) : + TowerRelativeIdeleGroup K M L →* + (W.adicCompletion M ⊗[M] L)ˣ := + Units.map + (Algebra.TensorProduct.map + ((finiteAdeleComponentAlgHom W).comp + (intermediateRelativeAdeleBaseChangeAlgEquiv + K M).toAlgHom) + (AlgHom.id M L)).toRingHom + +/-- The actual archimedean component of the tower model after the +intermediate adele-ring comparison. -/ +noncomputable def towerActualInfiniteComponent + (W : InfinitePlace M) : + TowerRelativeIdeleGroup K M L →* + (W.Completion ⊗[M] L)ˣ := + Units.map + (Algebra.TensorProduct.map + ((infiniteAdeleComponentAlgHom W).comp + (intermediateRelativeAdeleBaseChangeAlgEquiv + K M).toAlgHom) + (AlgHom.id M L)).toRingHom + +omit [NumberField L] [Algebra K L] [IsScalarTower K M L] + [FiniteDimensional M L] in +/-- Finite-component identification for the norm-compatible tower +comparison. -/ +@[simp] +theorem towerRelativeIdeleBaseChangeMulEquiv_finiteComponent + (W : HeightOneSpectrum (𝓞 M)) + (a : TowerRelativeIdeleGroup K M L) : + RelativeIdeleGroup.finiteComponent + (K := M) (L := L) W + (towerRelativeIdeleBaseChangeMulEquiv K M L a) = + towerActualFiniteComponent K M L W a := by + apply Units.ext + change + relativeAdeleFiniteComponent + (K := M) (L := L) W + (towerActualRelativeAdeleRingEquiv K M L + (a : TowerRelativeAdeleRing K M L)) = + Algebra.TensorProduct.map + ((finiteAdeleComponentAlgHom W).comp + (intermediateRelativeAdeleBaseChangeAlgEquiv + K M).toAlgHom) + (AlgHom.id M L) + (a : TowerRelativeAdeleRing K M L) + induction (a : TowerRelativeAdeleRing K M L) using + TensorProduct.inductionOn with + | add x y hx hy => simp [hx, hy] + | tmul b x => + simp [towerActualRelativeAdeleRingEquiv_tmul, + relativeAdeleFiniteComponent_tmul] + +omit [NumberField L] [Algebra K L] [IsScalarTower K M L] + [FiniteDimensional M L] in +/-- Archimedean-component identification for the norm-compatible tower +comparison. -/ +@[simp] +theorem towerRelativeIdeleBaseChangeMulEquiv_infiniteComponent + (W : InfinitePlace M) + (a : TowerRelativeIdeleGroup K M L) : + RelativeIdeleGroup.infiniteComponent + (K := M) (L := L) W + (towerRelativeIdeleBaseChangeMulEquiv K M L a) = + towerActualInfiniteComponent K M L W a := by + apply Units.ext + change + relativeAdeleInfiniteComponent + (K := M) (L := L) W + (towerActualRelativeAdeleRingEquiv K M L + (a : TowerRelativeAdeleRing K M L)) = + Algebra.TensorProduct.map + ((infiniteAdeleComponentAlgHom W).comp + (intermediateRelativeAdeleBaseChangeAlgEquiv + K M).toAlgHom) + (AlgHom.id M L) + (a : TowerRelativeAdeleRing K M L) + induction (a : TowerRelativeAdeleRing K M L) using + TensorProduct.inductionOn with + | add x y hx hy => simp [hx, hy] + | tmul b x => + simp [towerActualRelativeAdeleRingEquiv_tmul, + relativeAdeleInfiniteComponent_tmul] + +/-- Evaluation of the fixed-bottom relative adele ring at one exact +finite extension of a place of `K`, as an `M`-algebra map. -/ +noncomputable def towerIntermediateFiniteComponentAlgHom + (w : HeightOneSpectrum (𝓞 K)) + (uM : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) M) : + RelativeAdeleRing K M →ₐ[M] uM.1.Completion := by + let f : RelativeAdeleRing K M →+* uM.1.Completion := + (finitePlaceLocalTensorDecompositionComponentRingHom + (K := K) (L := M) w uM).comp + (relativeAdeleFiniteComponent + (K := K) (L := M) w).toRingHom + exact + { f with + commutes' := by + intro m + change + finitePlaceLocalTensorDecompositionComponent + (K := K) (L := M) w uM + (relativeAdeleFiniteComponent + (K := K) (L := M) w + ((1 : NumberField.AdeleRing (𝓞 K) K) ⊗ₜ[K] m)) = + algebraMap M uM.1.Completion m + rw [relativeAdeleFiniteComponent_tmul, + finitePlaceLocalTensorDecompositionComponent_tmul] + have hOne : + ((1 : NumberField.AdeleRing (𝓞 K) K).2 w) = 1 := + rfl + rw [hOne, map_one, map_one, one_mul] + rfl } + +/-- The local tensor component of a tower idele at an exact finite +extension place of `M`. -/ +noncomputable def towerIntermediateFiniteComponent + (w : HeightOneSpectrum (𝓞 K)) + (uM : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) M) : + TowerRelativeIdeleGroup K M L →* + (uM.1.Completion ⊗[M] L)ˣ := + Units.map + (Algebra.TensorProduct.map + (towerIntermediateFiniteComponentAlgHom K M w uM) + (AlgHom.id M L)).toRingHom + +/-- Evaluation of a relative idele over `K` at the same exact finite +extension place of `M`. -/ +noncomputable def intermediateFiniteComponent + (w : HeightOneSpectrum (𝓞 K)) + (uM : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) M) : + RelativeIdeleGroup K M →* uM.1.Completionˣ := + Units.map + (towerIntermediateFiniteComponentAlgHom K M w uM).toRingHom + +omit [NumberField M] [NumberField L] [Algebra K L] [IsScalarTower K M L] in +/-- Determinant norm commutes with the exact finite-place component of +the fixed-bottom tower model. -/ +theorem towerIntermediateFiniteComponent_norm + (w : HeightOneSpectrum (𝓞 K)) + (uM : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w) M) + (a : TowerRelativeIdeleGroup K M L) : + intermediateFiniteComponent K M w uM + (TowerRelativeIdeleGroup.norm K M L a) = + Units.map (Algebra.norm uM.1.Completion) + (towerIntermediateFiniteComponent K M L w uM a) := by + apply Units.ext + exact + map_norm_tensorProduct_baseChange + (K := M) (L := L) + (towerIntermediateFiniteComponentAlgHom K M w uM) + (a : TowerRelativeAdeleRing K M L) + +omit [NumberField L] [Algebra K L] [IsScalarTower K M L] + [FiniteDimensional M L] in +/-- The actual relative-idele norm is the tower determinant norm after +the intermediate relative-to-ordinary adele comparison. -/ +theorem towerRelativeIdeleBaseChangeMulEquiv_norm + (a : TowerRelativeIdeleGroup K M L) : + relativeIdeleBaseChangeMulEquiv + (K := K) (L := M) + (TowerRelativeIdeleGroup.norm K M L a) = + RelativeIdeleGroup.norm M L + (towerRelativeIdeleBaseChangeMulEquiv K M L a) := by + let e₁ := + relativeAdeleBaseChangeRingEquiv + (K := K) (L := M) + let e₂ := + towerActualRelativeAdeleRingEquiv K M L + have he : + (algebraMap + (NumberField.AdeleRing (𝓞 M) M) + (RelativeAdeleRing M L)).comp e₁.toRingHom = + e₂.toRingHom.comp + (algebraMap + (RelativeAdeleRing K M) + (TowerRelativeAdeleRing K M L)) := by + apply DFunLike.ext _ _ + intro b + change + (e₁ b) ⊗ₜ[M] (1 : L) = + e₂ (b ⊗ₜ[M] (1 : L)) + rw [towerActualRelativeAdeleRingEquiv_tmul] + rfl + have hnorm := + Algebra.norm_eq_of_equiv_equiv + e₁ e₂ he (a : TowerRelativeAdeleRing K M L) + have hnorm' : + e₁ + (Algebra.norm + (RelativeAdeleRing K M) + (a : TowerRelativeAdeleRing K M L)) = + Algebra.norm + (NumberField.AdeleRing (𝓞 M) M) + (e₂ (a : TowerRelativeAdeleRing K M L)) := by + simpa using congrArg e₁ hnorm + apply + (IdeleGroup.equivAdeleRingUnits + (K := M)).injective + rw [relativeIdeleBaseChangeMulEquiv_eq_ringUnits + (K := K) (L := M)] + simp only [RelativeIdeleGroup.norm, + MonoidHom.comp_apply] + simp only [MulEquiv.coe_toMonoidHom, + MulEquiv.apply_symm_apply] + apply Units.ext + change + e₁ + (Algebra.norm + (RelativeAdeleRing K M) + (a : TowerRelativeAdeleRing K M L)) = + Algebra.norm + (NumberField.AdeleRing (𝓞 M) M) + (e₂ (a : TowerRelativeAdeleRing K M L)) + exact hnorm' + +end NormComparison + +section ClassNormComparison + +omit [NumberField L] [Algebra K L] [IsScalarTower K M L] in +/-- After both relative presentations are replaced by the ordinary +idele class groups, the fixed-bottom tower class norm is the actual +class norm for `L/M`. -/ +theorem towerRelativeIdeleClassBaseChangeMulEquiv_classNorm + (c : TowerRelativeIdeleGroup.ClassGroup K M L) : + relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := M) + (TowerRelativeIdeleGroup.classNorm K M L c) = + RelativeIdeleGroup.classNorm M L + (towerRelativeIdeleClassBaseChangeMulEquiv K M L c) := by + refine QuotientGroup.induction_on c ?_ + intro a + exact congrArg + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup M)) + (towerRelativeIdeleBaseChangeMulEquiv_norm K M L a) + +omit [NumberField L] [Algebra K L] [IsScalarTower K M L] in +/-- The fixed-bottom tower norm subgroup becomes exactly the actual +`L/M` class-norm subgroup after base change to the ordinary class group +of `M`. -/ +theorem towerClassNorm_range_map_baseChange : + (TowerRelativeIdeleGroup.classNorm K M L).range.map + (relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := M)).toMonoidHom = + (RelativeIdeleGroup.classNorm M L).range := by + ext c + constructor + · rintro ⟨d, ⟨a, rfl⟩, rfl⟩ + exact + ⟨towerRelativeIdeleClassBaseChangeMulEquiv K M L a, + (towerRelativeIdeleClassBaseChangeMulEquiv_classNorm + K M L a).symm⟩ + · rintro ⟨d, rfl⟩ + have h : + relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := M) + (TowerRelativeIdeleGroup.classNorm K M L + ((towerRelativeIdeleClassBaseChangeMulEquiv + K M L).symm d)) = + RelativeIdeleGroup.classNorm M L d := by + simpa using + (towerRelativeIdeleClassBaseChangeMulEquiv_classNorm + K M L + ((towerRelativeIdeleClassBaseChangeMulEquiv + K M L).symm d)) + exact + ⟨TowerRelativeIdeleGroup.classNorm K M L + ((towerRelativeIdeleClassBaseChangeMulEquiv + K M L).symm d), + ⟨(towerRelativeIdeleClassBaseChangeMulEquiv + K M L).symm d, rfl⟩, h⟩ + +/-- The fixed-bottom quotient `C_M / N_{L/M} C_L` is canonically the +ordinary idele-class norm quotient for the actual extension `L/M`. -/ +noncomputable def intermediateClassNormQuotientBaseChangeMulEquiv : + IntermediateClassNormQuotient K M L ≃* + RelativeIdeleGroup.ClassNormQuotient M L := + QuotientGroup.congr + (TowerRelativeIdeleGroup.classNorm K M L).range + (RelativeIdeleGroup.classNorm M L).range + (relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := M)) + (towerClassNorm_range_map_baseChange K M L) + +omit [NumberField L] [Algebra K L] [IsScalarTower K M L] in +theorem intermediateClassNormQuotientBaseChangeMulEquiv_mk + (c : RelativeIdeleGroup.ClassGroup K M) : + intermediateClassNormQuotientBaseChangeMulEquiv K M L + (QuotientGroup.mk' + (TowerRelativeIdeleGroup.classNorm K M L).range c) = + QuotientGroup.mk' + (RelativeIdeleGroup.classNorm M L).range + (relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := M) c) := + rfl + +end ClassNormComparison + +section OrdinaryNormTower + +/-- Ordinary idele-class norms are pointwise transitive in an arbitrary +finite tower of number fields. This is determinant-norm transitivity, +transported through the actual relative-idele presentations over the +bottom and intermediate fields. -/ +theorem ordinaryIdeleClassNorm_tower + (c : IdeleClassGroup L) : + _root_.ideleClassNorm K M + (_root_.ideleClassNorm M L c) = + _root_.ideleClassNorm K L c := by + let d : RelativeIdeleGroup.ClassGroup K L := + (relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := L)).symm c + let t : TowerRelativeIdeleGroup.ClassGroup K M L := + (TowerRelativeIdeleGroup.classGroupEquiv + K M L).symm d + have htop : + relativeIdeleClassBaseChangeMulEquiv + (K := M) (L := L) + (towerRelativeIdeleClassBaseChangeMulEquiv + K M L t) = + c := by + calc + relativeIdeleClassBaseChangeMulEquiv + (K := M) (L := L) + (towerRelativeIdeleClassBaseChangeMulEquiv + K M L t) = + relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := L) d := by + change + relativeIdeleClassBaseChangeMulEquiv + (K := M) (L := L) + (towerRelativeIdeleClassBaseChangeMulEquiv K M L + ((TowerRelativeIdeleGroup.classGroupEquiv + K M L).symm d)) = + relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := L) d + exact relativeIdeleClassBaseChangeMulEquiv_tower K M L d + _ = c := by + exact + (relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := L)).apply_symm_apply c + calc + _root_.ideleClassNorm K M + (_root_.ideleClassNorm M L c) = + _root_.ideleClassNorm K M + (_root_.ideleClassNorm M L + (relativeIdeleClassBaseChangeMulEquiv + (K := M) (L := L) + (towerRelativeIdeleClassBaseChangeMulEquiv + K M L t))) := by + rw [htop] + _ = _root_.ideleClassNorm K M + (RelativeIdeleGroup.classNorm M L + (towerRelativeIdeleClassBaseChangeMulEquiv + K M L t)) := by + exact congrArg + (_root_.ideleClassNorm K M) + (ordinaryIdeleClassNorm_relativeIdeleClassBaseChange + (K := M) (L := L) + (towerRelativeIdeleClassBaseChangeMulEquiv + K M L t)) + _ = _root_.ideleClassNorm K M + (relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := M) + (TowerRelativeIdeleGroup.classNorm K M L t)) := by + rw [ + towerRelativeIdeleClassBaseChangeMulEquiv_classNorm] + _ = RelativeIdeleGroup.classNorm K M + (TowerRelativeIdeleGroup.classNorm K M L t) := by + exact + ordinaryIdeleClassNorm_relativeIdeleClassBaseChange + (K := K) (L := M) + (TowerRelativeIdeleGroup.classNorm K M L t) + _ = towerCompositeClassNorm K M L t := rfl + _ = RelativeIdeleGroup.classNorm K L + (TowerRelativeIdeleGroup.classGroupEquiv K M L t) := + towerCompositeClassNorm_eq_ideleClassNorm K M L t + _ = RelativeIdeleGroup.classNorm K L d := by + exact congrArg + (RelativeIdeleGroup.classNorm K L) + ((TowerRelativeIdeleGroup.classGroupEquiv + K M L).apply_symm_apply d) + _ = _root_.ideleClassNorm K L + (relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := L) d) := by + exact + (ordinaryIdeleClassNorm_relativeIdeleClassBaseChange + (K := K) (L := L) d).symm + _ = _root_.ideleClassNorm K L c := by + exact congrArg + (_root_.ideleClassNorm K L) + ((relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := L)).apply_symm_apply c) + +/-- In an arbitrary finite tower of number fields, every ordinary +idele-class norm from the top field is already a norm from the +intermediate field. No normality hypothesis is needed: this is +determinant-norm transitivity transported from the fixed-bottom tower +presentation to the ordinary idele class groups. -/ +theorem ordinaryIdeleClassNorm_range_le_of_tower : + (_root_.ideleClassNorm K L).range ≤ + (_root_.ideleClassNorm K M).range := by + rw [ + ordinaryIdeleClassNorm_range_eq_relative + (K := K) (L := L), + ordinaryIdeleClassNorm_range_eq_relative + (K := K) (L := M), + ← towerCompositeClassNorm_range_eq K M L] + rintro _ ⟨c, rfl⟩ + exact + ⟨TowerRelativeIdeleGroup.classNorm K M L c, rfl⟩ + +end OrdinaryNormTower diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology.lean new file mode 100644 index 0000000000..401c2acfbc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Decomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.HerbrandExactSequence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/All.lean new file mode 100644 index 0000000000..656afc2da6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/All.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Decomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.HerbrandExactSequence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge +/-! # Cohomology of ideles and supported local decompositions -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean new file mode 100644 index 0000000000..f5e64f66a7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean @@ -0,0 +1,540 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.Instances +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.H0 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.HMinusOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Cohomology +/-! +# Finite-support decompositions of actual ideles + +For a finite set `S` of finite places, this file identifies the actual +subgroup `I_K^S` with the product of all archimedean local groups, the +full multiplicative groups at places in `S`, and the local unit groups +away from `S`. The construction is componentwise and uses the genuine +restricted-product membership condition. + +For a finite family of base places in a Galois extension, it also +assembles the local tensor-algebra decomposition and proves its +equivariance for the full Galois action. Finally, the concrete +unramified local class-field theorem is transported through Shapiro to +show that every unramified induced integer-unit block has trivial +`H⁰` and `H⁻¹`. +-/ + +@[expose] public section + +open scoped NumberField RestrictedProduct ValuativeRel +open NumberField IsDedekindDomain + +noncomputable +section + +open LocalClassFieldTheory + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology + +universe u + +variable {F : Type u} [Field F] [NumberField F] + +/-- The finite local factors occurring in `I_F^S`: arbitrary local +elements on `S`, and integral local units away from `S`. -/ +abbrev FiniteSPlaceFactors + (S : Finset (HeightOneSpectrum (𝓞 F))) := + (∀ v : {v : HeightOneSpectrum (𝓞 F) // v ∈ S}, + (v.1.adicCompletion F)ˣ) × + (∀ v : {v : HeightOneSpectrum (𝓞 F) // v ∉ S}, + (v.1.adicCompletionIntegers F).units) + +/-- The complete product model for `I_F^S`, including every +archimedean component. -/ +abbrev IdeleSPlaceFactors + (S : Finset (HeightOneSpectrum (𝓞 F))) := + InfiniteIdeleGroup F × FiniteSPlaceFactors (F := F) S + +/-- Assemble prescribed local factors into a finite idele. Restricted +product membership follows because the only possibly nonintegral +components lie in the finite set `S`. -/ +noncomputable def finiteIdeleOfSPlaceFactors + (S : Finset (HeightOneSpectrum (𝓞 F))) + (x : FiniteSPlaceFactors (F := F) S) : + FiniteIdeleGroup F := by + classical + let f : ∀ v : HeightOneSpectrum (𝓞 F), + (v.adicCompletion F)ˣ := + fun v ↦ if hv : v ∈ S then + x.1 ⟨v, hv⟩ + else + (x.2 ⟨v, hv⟩ : + (v.adicCompletion F)ˣ) + refine ⟨f, S.eventually_cofinite_notMem.mono ?_⟩ + intro v hv + simp only [f, dite_eq_right hv] + exact (x.2 ⟨v, hv⟩).2 + +@[simp] +theorem finiteIdeleOfSPlaceFactors_apply_mem + (S : Finset (HeightOneSpectrum (𝓞 F))) + (x : FiniteSPlaceFactors (F := F) S) + (v : HeightOneSpectrum (𝓞 F)) (hv : v ∈ S) : + finiteIdeleOfSPlaceFactors S x v = x.1 ⟨v, hv⟩ := by + simp [finiteIdeleOfSPlaceFactors, hv] + +@[simp] +theorem finiteIdeleOfSPlaceFactors_apply_notMem + (S : Finset (HeightOneSpectrum (𝓞 F))) + (x : FiniteSPlaceFactors (F := F) S) + (v : HeightOneSpectrum (𝓞 F)) (hv : v ∉ S) : + finiteIdeleOfSPlaceFactors S x v = + (x.2 ⟨v, hv⟩ : (v.adicCompletion F)ˣ) := by + simp [finiteIdeleOfSPlaceFactors, hv] + +/-- The finite part of the actual `S`-idele group is exactly the +displayed product of local multiplicative groups and local unit groups. -/ +noncomputable def finiteSupportedAtEquivSPlaceFactors + (S : Finset (HeightOneSpectrum (𝓞 F))) : + FiniteIdeleGroup.supportedAt (K := F) (S : Set _) ≃* + FiniteSPlaceFactors (F := F) S where + toFun a := + ⟨fun v ↦ a.1 v.1, + fun v ↦ ⟨a.1 v.1, a.2 v.1 v.2⟩⟩ + invFun x := + ⟨finiteIdeleOfSPlaceFactors S x, by + intro v hv + rw [finiteIdeleOfSPlaceFactors_apply_notMem S x v hv] + exact (x.2 ⟨v, hv⟩).2⟩ + left_inv a := by + apply Subtype.ext + ext v + by_cases hv : v ∈ S + · simp [finiteIdeleOfSPlaceFactors_apply_mem, hv] + · simp [finiteIdeleOfSPlaceFactors_apply_notMem, hv] + right_inv x := by + apply Prod.ext + · funext v + exact finiteIdeleOfSPlaceFactors_apply_mem S x v.1 v.2 + · funext v + apply Subtype.ext + exact finiteIdeleOfSPlaceFactors_apply_notMem S x v.1 v.2 + map_mul' a b := by + apply Prod.ext + · funext v + rfl + · funext v + apply Subtype.ext + rfl + +/-- The actual finite-support decomposition: + +`I_F^S ≃ I_{F,∞} × (∏_{v∈S} F_vˣ) × + (∏_{v∉S} O_vˣ)`. +-/ +noncomputable def ideleSupportedAtEquivInfiniteProd + (S : Finset (HeightOneSpectrum (𝓞 F))) : + IdeleGroup.supportedAt (K := F) (S : Set _) ≃* + InfiniteIdeleGroup F × + FiniteIdeleGroup.supportedAt (K := F) (S : Set _) where + toFun a := ⟨a.1.1, ⟨a.1.2, a.2⟩⟩ + invFun x := ⟨⟨x.1, x.2.1⟩, x.2.2⟩ + left_inv _ := rfl + right_inv _ := rfl + map_mul' _ _ := rfl + +/-- The actual `S`-idele group identified with its complete family of +archimedean, unrestricted finite, and integral finite local factors. -/ +noncomputable def ideleSupportedAtEquivSPlaceFactors + (S : Finset (HeightOneSpectrum (𝓞 F))) : + IdeleGroup.supportedAt (K := F) (S : Set _) ≃* + IdeleSPlaceFactors (F := F) S := + (ideleSupportedAtEquivInfiniteProd S).trans + ((MulEquiv.refl (InfiniteIdeleGroup F)).prodCongr + (finiteSupportedAtEquivSPlaceFactors S)) + +@[simp] +theorem ideleSupportedAtEquivSPlaceFactors_infinite + (S : Finset (HeightOneSpectrum (𝓞 F))) + (a : IdeleGroup.supportedAt (K := F) (S : Set _)) : + (ideleSupportedAtEquivSPlaceFactors S a).1 = a.1.1 := + rfl + +@[simp] +theorem ideleSupportedAtEquivSPlaceFactors_inside + (S : Finset (HeightOneSpectrum (𝓞 F))) + (a : IdeleGroup.supportedAt (K := F) (S : Set _)) + (v : {v : HeightOneSpectrum (𝓞 F) // v ∈ S}) : + (ideleSupportedAtEquivSPlaceFactors S a).2.1 v = + a.1.2 v.1 := + rfl + +@[simp] +theorem ideleSupportedAtEquivSPlaceFactors_outside_coe + (S : Finset (HeightOneSpectrum (𝓞 F))) + (a : IdeleGroup.supportedAt (K := F) (S : Set _)) + (v : {v : HeightOneSpectrum (𝓞 F) // v ∉ S}) : + ((ideleSupportedAtEquivSPlaceFactors S a).2.2 v : + (v.1.adicCompletion F)ˣ) = + a.1.2 v.1 := + rfl + +section FiniteTensorFamily + +universe uK uL uι + +variable {K : Type uK} {L : Type uL} + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- The actual scalar-extended local tensor factors over a family of +base places. -/ +abbrev LocalTensorFamily {ι : Type uι} + (d : ι → LocalPlaceDatum K L) := + ∀ i, (LocalTensorAlgebra (L := L) (d i).base)ˣ + +/-- The componentwise natural Galois action on a family of local tensor +factors. -/ +@[reducible] +noncomputable def localTensorFamilyAction {ι : Type uι} + (d : ι → LocalPlaceDatum K L) : + MulDistribMulAction (L ≃ₐ[K] L) + (LocalTensorFamily d) := by + letI : ∀ i, MulDistribMulAction (L ≃ₐ[K] L) + (LocalTensorAlgebra (L := L) (d i).base)ˣ := + fun i ↦ localTensorUnitsAction (d i).base + exact piMulDistribMulAction (L ≃ₐ[K] L) + (fun i ↦ (LocalTensorAlgebra (L := L) (d i).base)ˣ) + +/-- The componentwise induced-module action on a local block family. -/ +@[reducible] +noncomputable def localBlockFamilyAction {ι : Type uι} + (d : ι → LocalPlaceDatum K L) : + MulDistribMulAction (L ≃ₐ[K] L) + (LocalBlockFamily d) := by + letI : ∀ i, MulDistribMulAction + (absoluteValueDecompositionGroup K (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ := + fun i ↦ decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + letI : ∀ i, MulDistribMulAction (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) := + fun i ↦ inducedMulDistribMulAction + (absoluteValueDecompositionGroup K (d i).extension.1) + exact piMulDistribMulAction (L ≃ₐ[K] L) + (fun i ↦ LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) + +/-- The componentwise local tensor equivalence realizes a finite (or arbitrary) family of +actual local tensor unit groups as the corresponding family of induced +local blocks. -/ +noncomputable def localTensorFamilyEquivLocalBlockFamily + {ι : Type uι} (d : ι → LocalPlaceDatum K L) : + LocalTensorFamily d ≃* LocalBlockFamily d := by + letI : ∀ i, MulDistribMulAction + (absoluteValueDecompositionGroup K (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ := + fun i ↦ decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + letI hK : ∀ i, + Algebra K (d i).extension.1.Completion := + fun i ↦ AbsoluteValue.extensionCompletionAlgebra + (K := K) (d i).extension.1 + letI : ∀ i, SMul K (d i).extension.1.Completion := + fun i ↦ (hK i).toSMul + letI : ∀ i, Algebra (d i).base.Completion + (d i).extension.1.Completion := + fun i ↦ AbsoluteValue.completionAlgebra + (d i).base (d i).extension.1 (d i).extension.2 + exact MulEquiv.piCongrRight fun i ↦ + localTensorUnitsEquivLocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension + +/-- The family realization is equivariant for the full Galois action, +not merely componentwise multiplicative. -/ +theorem localTensorFamilyEquivLocalBlockFamily_smul + {ι : Type uι} (d : ι → LocalPlaceDatum K L) + (τ : L ≃ₐ[K] L) (z : LocalTensorFamily d) : + localTensorFamilyEquivLocalBlockFamily d + ((localTensorFamilyAction d).smul τ z) = + (localBlockFamilyAction d).smul τ + (localTensorFamilyEquivLocalBlockFamily d z) := by + funext i + let _ := + decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) (d i).extension.1 + let _ : SMul K (d i).extension.1.Completion := + hK.toSMul + let _ := + AbsoluteValue.completionAlgebra + (d i).base (d i).extension.1 + (d i).extension.2 + let _ : ∀ w' : AbsoluteValueExtension (d i).base L, + Algebra (d i).base.Completion w'.1.Completion := + fun w' ↦ AbsoluteValue.completionAlgebra + (d i).base w'.1 w'.2 + let _ := + localTensorUnitsAction (K := K) (L := L) + (d i).base + let _ : MulDistribMulAction (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) := + inducedMulDistribMulAction + (absoluteValueDecompositionGroup K (d i).extension.1) + change + localTensorUnitsEquivLocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension (τ • z i) = + τ • + localTensorUnitsEquivLocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension (z i) + exact localTensorUnitsEquivLocalPlaceBlock_smul + (d i).base (d i).base_isNontrivial + (d i).extension τ (z i) + +/-- Equivariance of the inverse family realization. This is often the +convenient direction when local induced blocks have already been +constructed. -/ +theorem localTensorFamilyEquivLocalBlockFamily_symm_smul + {ι : Type uι} (d : ι → LocalPlaceDatum K L) + (τ : L ≃ₐ[K] L) (z : LocalBlockFamily d) : + (localTensorFamilyEquivLocalBlockFamily d).symm + ((localBlockFamilyAction d).smul τ z) = + (localTensorFamilyAction d).smul τ + ((localTensorFamilyEquivLocalBlockFamily d).symm z) := by + apply (localTensorFamilyEquivLocalBlockFamily d).injective + rw [localTensorFamilyEquivLocalBlockFamily_smul] + simp + +end FiniteTensorFamily + +section UnramifiedLocalUnits + +/-- Outside the ramified support, the local integer-unit factor has +trivial low-degree Tate cohomology. This generator-explicit form is the +one needed after restricting a global cyclic generator to a decomposition +group. -/ +theorem unramifiedLocalIntegerUnitsHerbrand_subsingleton + (k ell : Type) + [Field k] [Field ell] [Algebra k ell] + [FiniteDimensional k ell] [IsGalois k ell] + [ValuativeRel k] [TopologicalSpace k] + [IsNonarchimedeanLocalField k] + [ValuativeRel ell] [UniformSpace ell] + [IsUniformAddGroup ell] + [IsNonarchimedeanLocalField ell] + [Valuation.HasExtension + (ValuativeRel.valuation k) (ValuativeRel.valuation ell)] + [IsIntegralClosure 𝒪[ell] 𝒪[k] ell] + [Module.Finite 𝒪[k] 𝒪[ell]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + k ell] + (g : Gal(ell/k)) + (hg : ∀ σ : Gal(ell/k), + σ ∈ Subgroup.zpowers g) : + letI := + galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure + k ell + Subsingleton + (HerbrandH0 (Gal(ell/k)) 𝒪[ell]ˣ) ∧ + Subsingleton + (HerbrandHMinusOne + (Gal(ell/k)) 𝒪[ell]ˣ g) := by + exact + (unramified_units_tateCohomology_and_norm_surjective_for_generator + k ell g hg).1 + +/-- Canonical Frobenius form of the same outside-`S` vanishing. -/ +theorem unramifiedLocalIntegerUnitsHerbrand_subsingleton_frobenius + (k ell : Type) + [Field k] [Field ell] [Algebra k ell] + [FiniteDimensional k ell] [IsGalois k ell] + [ValuativeRel k] [TopologicalSpace k] + [IsNonarchimedeanLocalField k] + [ValuativeRel ell] [UniformSpace ell] + [IsUniformAddGroup ell] + [IsNonarchimedeanLocalField ell] + [Valuation.HasExtension + (ValuativeRel.valuation k) (ValuativeRel.valuation ell)] + [IsIntegralClosure 𝒪[ell] 𝒪[k] ell] + [Module.Finite 𝒪[k] 𝒪[ell]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + k ell] : + let φ := arithmeticFrobeniusOfUnramifiedValuation k ell + letI := + galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure + k ell + Subsingleton + (HerbrandH0 (Gal(ell/k)) 𝒪[ell]ˣ) ∧ + Subsingleton + (HerbrandHMinusOne + (Gal(ell/k)) 𝒪[ell]ˣ φ) := by + exact + (unramified_units_tateCohomology_and_norm_surjective + k ell).1 + +section InducedOutsideSBlock + +universe uG + +variable {G : Type uG} [Group G] [Fintype G] + +/-- Shapiro plus change of group identifies an induced unramified +integer-unit block with its actual local Galois cohomology in degree +zero. -/ +noncomputable def unramifiedInducedIntegerUnitsHerbrandH0Equiv + (H : Subgroup G) + (k ell : Type) + [Field k] [Field ell] [Algebra k ell] + [FiniteDimensional k ell] + [ValuativeRel ell] + [MulDistribMulAction (Gal(ell/k)) 𝒪[ell]ˣ] + (e : H ≃* Gal(ell/k)) + (σ : G) + (hσ : ∀ τ : G, τ ∈ Subgroup.zpowers σ) : + letI : MulDistribMulAction H 𝒪[ell]ˣ := + MulDistribMulAction.compHom 𝒪[ell]ˣ e.toMonoidHom + letI : Fintype H := Fintype.ofFinite H + HerbrandH0 G (InducedModule (B := 𝒪[ell]ˣ) H) ≃* + HerbrandH0 (Gal(ell/k)) 𝒪[ell]ˣ := by + letI : MulDistribMulAction H 𝒪[ell]ˣ := + MulDistribMulAction.compHom 𝒪[ell]ˣ e.toMonoidHom + letI : Fintype H := Fintype.ofFinite H + exact + (inducedHerbrandH0EquivOfFiniteCyclic H σ hσ).trans + (herbrandH0CompMulEquiv (A := 𝒪[ell]ˣ) e) + +/-- The corresponding Shapiro and change-of-group equivalence in degree +minus one. -/ +noncomputable def unramifiedInducedIntegerUnitsHerbrandHMinusOneEquiv + (H : Subgroup G) + (k ell : Type) + [Field k] [Field ell] [Algebra k ell] + [FiniteDimensional k ell] + [ValuativeRel ell] + [MulDistribMulAction (Gal(ell/k)) 𝒪[ell]ˣ] + (e : H ≃* Gal(ell/k)) + (σ : G) + (hσ : ∀ τ : G, τ ∈ Subgroup.zpowers σ) : + letI : MulDistribMulAction H 𝒪[ell]ˣ := + MulDistribMulAction.compHom 𝒪[ell]ˣ e.toMonoidHom + letI : Fintype H := Fintype.ofFinite H + HerbrandHMinusOne G + (InducedModule (B := 𝒪[ell]ˣ) H) σ ≃* + HerbrandHMinusOne (Gal(ell/k)) 𝒪[ell]ˣ + (e (subgroupGeneratorOfGenerator H σ hσ)) := by + letI : MulDistribMulAction H 𝒪[ell]ˣ := + MulDistribMulAction.compHom 𝒪[ell]ˣ e.toMonoidHom + letI : Fintype H := Fintype.ofFinite H + exact + (inducedHerbrandHMinusOneEquivOfFiniteCyclic + H σ hσ).trans + (herbrandHMinusOneCompMulEquiv + (A := 𝒪[ell]ˣ) e + (subgroupGeneratorOfGenerator H σ hσ)) + +/-- An unramified outside-`S` induced unit block contributes neither +degree-zero nor degree-minus-one Tate cohomology. -/ +theorem unramifiedInducedIntegerUnitsHerbrand_subsingleton + (H : Subgroup G) + (k ell : Type) + [Field k] [Field ell] [Algebra k ell] + [FiniteDimensional k ell] [IsGalois k ell] + [ValuativeRel k] [TopologicalSpace k] + [IsNonarchimedeanLocalField k] + [ValuativeRel ell] [UniformSpace ell] + [IsUniformAddGroup ell] + [IsNonarchimedeanLocalField ell] + [Valuation.HasExtension + (ValuativeRel.valuation k) (ValuativeRel.valuation ell)] + [IsIntegralClosure 𝒪[ell] 𝒪[k] ell] + [Module.Finite 𝒪[k] 𝒪[ell]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + k ell] + (e : H ≃* Gal(ell/k)) + (σ : G) + (hσ : ∀ τ : G, τ ∈ Subgroup.zpowers σ) : + letI : MulDistribMulAction (Gal(ell/k)) 𝒪[ell]ˣ := + galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure + k ell + letI : MulDistribMulAction H 𝒪[ell]ˣ := + MulDistribMulAction.compHom 𝒪[ell]ˣ e.toMonoidHom + letI : Fintype H := Fintype.ofFinite H + Subsingleton + (HerbrandH0 G + (InducedModule (B := 𝒪[ell]ˣ) H)) ∧ + Subsingleton + (HerbrandHMinusOne G + (InducedModule (B := 𝒪[ell]ˣ) H) σ) := by + let _ : MulDistribMulAction (Gal(ell/k)) 𝒪[ell]ˣ := + galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure + k ell + let _ : MulDistribMulAction H 𝒪[ell]ˣ := + MulDistribMulAction.compHom 𝒪[ell]ˣ e.toMonoidHom + let _ : Fintype H := Fintype.ofFinite H + let δ := subgroupGeneratorOfGenerator H σ hσ + have hδ : ∀ τ : Gal(ell/k), + τ ∈ Subgroup.zpowers (e δ) := by + intro τ + have hmem : + e.symm τ ∈ Subgroup.zpowers δ := + subgroupGeneratorOfGenerator_generates H σ hσ (e.symm τ) + have himage : + e (e.symm τ) ∈ + (Subgroup.zpowers δ).map e.toMonoidHom := + ⟨e.symm τ, hmem, rfl⟩ + rw [MonoidHom.map_zpowers] at himage + simpa using himage + have hlocal := + unramifiedLocalIntegerUnitsHerbrand_subsingleton + k ell (e δ) hδ + constructor + · let E := + unramifiedInducedIntegerUnitsHerbrandH0Equiv + H k ell e σ hσ + exact + ⟨fun x y ↦ E.injective + (by exact @Subsingleton.elim _ hlocal.1 (E x) (E y))⟩ + · let E := + unramifiedInducedIntegerUnitsHerbrandHMinusOneEquiv + H k ell e σ hσ + exact + ⟨fun x y ↦ E.injective + (by exact @Subsingleton.elim _ hlocal.2 (E x) (E y))⟩ + +end InducedOutsideSBlock + +end UnramifiedLocalUnits diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean new file mode 100644 index 0000000000..df087e67a3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean @@ -0,0 +1,647 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisNorm +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.Module +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness +/-! +# Herbrand cohomology of the relative idele class group + +This file realizes the low-degree exact sequence on the actual relative +idele group + +`1 → Lˣ → I_L → C_L → 1`. + +The Galois actions are the concrete conjugation actions from the +tensor-product model of relative adeles. The class norm is descended from +the determinant norm on relative ideles, and its relation with the Tate +norm is proved from the Galois product formula. +-/ + +@[expose] public section + +open scoped BigOperators NumberField +open NumberField + +noncomputable +section + + +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology + +namespace RelativeIdeleGroup +namespace Cohomology + +variable + (K L : Type) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- The natural Galois action on relative ideles, upgraded from the +existing multiplicative action to an action by group automorphisms. -/ +@[reducible] +noncomputable def relativeIdeleMulDistribMulAction : + MulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup K L) where + __ := RelativeIdeleGroup.relativeIdeleMulAction K L + smul_one σ := + map_one (RelativeIdeleGroup.conjugationIdele K L σ) + smul_mul σ a b := + map_mul + (RelativeIdeleGroup.conjugationIdele K L σ) a b + +omit [NumberField L] [FiniteDimensional K L] [IsGalois K L] in +theorem principalRelativeIdele_smul_mem + (σ : L ≃ₐ[K] L) + (a : RelativeIdeleGroup K L) + (ha : + a ∈ RelativeIdeleGroup.principalSubgroup K L) : + σ • a ∈ + RelativeIdeleGroup.principalSubgroup K L := by + rcases ha with ⟨x, rfl⟩ + refine + ⟨Units.map σ.toRingEquiv.toMonoidHom x, ?_⟩ + exact + (RelativeIdeleGroup.smul_principalIdele + K L σ x).symm + +/-- The actual quotient Galois action on the relative idele class group, +upgraded to an action by group automorphisms. -/ +@[reducible] +noncomputable def ideleClassMulDistribMulAction : + MulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) := by + letI := relativeIdeleMulDistribMulAction K L + exact + stableQuotientMulDistribMulAction + (RelativeIdeleGroup.principalSubgroup K L) + (principalRelativeIdele_smul_mem K L) + +/-- The restricted Galois action on the actual subgroup of principal +relative ideles. -/ +@[reducible] +noncomputable def principalIdeleMulDistribMulAction : + MulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L) := by + letI := relativeIdeleMulDistribMulAction K L + exact + stableSubgroupMulDistribMulAction + (RelativeIdeleGroup.principalSubgroup K L) + (principalRelativeIdele_smul_mem K L) + +/-- The norm on relative ideles, descended through principal ideles to +the actual idele class groups. -/ +noncomputable def ideleClassNorm : + RelativeIdeleGroup.ClassGroup K L →* + IdeleClassGroup K := + QuotientGroup.map + (RelativeIdeleGroup.principalSubgroup K L) + (IdeleGroup.principalSubgroup K) + (RelativeIdeleGroup.norm K L) + (by + rintro _ ⟨x, rfl⟩ + refine + ⟨Units.map (Algebra.norm K) x, ?_⟩ + exact + (RelativeIdeleGroup.norm_principalIdele + K L x).symm) + +omit [NumberField L] [IsGalois K L] in +theorem ideleClassNorm_mk + (a : RelativeIdeleGroup K L) : + ideleClassNorm K L + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) a) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (RelativeIdeleGroup.norm K L a) := + rfl + +/-- The concrete norm quotient `C_K / N_{L/K} C_L`. -/ +abbrev IdeleClassNormQuotient := + IdeleClassGroup K ⧸ (ideleClassNorm K L).range + +section Actions + +/-- Galois automorphisms act on relative ideles by conjugation. -/ +local instance : + MulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup K L) := + relativeIdeleMulDistribMulAction K L + +/-- The Galois action on relative ideles descends to their class group. -/ +local instance : + MulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) := + ideleClassMulDistribMulAction K L + +/-- The Galois action on relative ideles restricts to the principal subgroup. -/ +local instance : + MulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L) := + principalIdeleMulDistribMulAction K L + +omit [NumberField L] [FiniteDimensional K L] [IsGalois K L] in +@[simp] +theorem relativeIdele_smul_def + (σ : L ≃ₐ[K] L) + (a : RelativeIdeleGroup K L) : + σ • a = + RelativeIdeleGroup.conjugationIdele K L σ a := + rfl + +omit [NumberField L] [FiniteDimensional K L] [IsGalois K L] in +@[simp] +theorem ideleClass_smul_mk + (σ : L ≃ₐ[K] L) + (a : RelativeIdeleGroup K L) : + σ • QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) a = + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) + (σ • a) := + rfl + +omit [NumberField L] [FiniteDimensional K L] [IsGalois K L] in +@[simp] +theorem principalIdele_smul_coe + (σ : L ≃ₐ[K] L) + (a : + RelativeIdeleGroup.principalSubgroup K L) : + ((σ • a : + RelativeIdeleGroup.principalSubgroup K L) : + RelativeIdeleGroup K L) = + σ • (a : RelativeIdeleGroup K L) := + stableSubgroup_smul_coe + (RelativeIdeleGroup.principalSubgroup K L) + (principalRelativeIdele_smul_mem K L) σ a + +omit [NumberField L] [FiniteDimensional K L] [IsGalois K L] in +/-- Equivariance of the principal-idele inclusion. -/ +theorem principalIdeleSubtype_equivariant : + ∀ (σ : L ≃ₐ[K] L) + (a : RelativeIdeleGroup.principalSubgroup K L), + (RelativeIdeleGroup.principalSubgroup K L).subtype + (σ • a) = + σ • + (RelativeIdeleGroup.principalSubgroup K L).subtype + a := + stableSubgroup_subtype_equivariant + (RelativeIdeleGroup.principalSubgroup K L) + (principalRelativeIdele_smul_mem K L) + +omit [NumberField L] [FiniteDimensional K L] [IsGalois K L] in +/-- Equivariance of the actual quotient map `I_L → C_L`. -/ +theorem ideleClassQuotientMap_equivariant : + ∀ (σ : L ≃ₐ[K] L) + (a : RelativeIdeleGroup K L), + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) + (σ • a) = + σ • QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) a := + stableSubgroup_quotientMap_equivariant + (RelativeIdeleGroup.principalSubgroup K L) + (principalRelativeIdele_smul_mem K L) + +omit [NumberField L] in +/-- On relative ideles the Tate norm is the inclusion of the determinant +norm. This is the Galois product formula, not a separate class-field +hypothesis. -/ +theorem relativeIdele_tateNorm_eq_inclusion_norm + (a : RelativeIdeleGroup K L) : + tateNorm (L ≃ₐ[K] L) + (RelativeIdeleGroup K L) a = + RelativeIdeleGroup.inclusion K L + (RelativeIdeleGroup.norm K L a) := by + simpa only [tateNorm] using + (RelativeIdeleGroup.inclusion_norm_eq_prod_conjugates + (K := K) (L := L) a).symm + +omit [NumberField L] in +/-- The class norm agrees, after Galois descent, with the Tate norm on +the actual relative idele class group. -/ +theorem classInclusion_ideleClassNorm_eq_tateNorm + (c : RelativeIdeleGroup.ClassGroup K L) : + RelativeIdeleGroup.classInclusion K L + (ideleClassNorm K L c) = + tateNorm (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) c := by + refine QuotientGroup.induction_on c ?_ + intro a + change + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) + (RelativeIdeleGroup.inclusion K L + (RelativeIdeleGroup.norm K L a)) = + ∏ σ : L ≃ₐ[K] L, + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) + (σ • a) + rw [← map_prod] + exact congrArg + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L)) + (RelativeIdeleGroup.inclusion_norm_eq_prod_conjugates + (K := K) (L := L) a) + +omit [NumberField L] [FiniteDimensional K L] [IsGalois K L] in +/-- The fixed subgroup used by Tate cohomology is the concrete +Galois-fixed subgroup from idele-class descent. -/ +theorem ideleClass_fixedSubgroup_eq_galoisFixed : + fixedSubgroup (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) = + RelativeIdeleGroup.galoisFixedClassSubgroup K L := by + ext c + constructor + · intro hc σ + exact hc σ + · intro hc σ + exact hc σ + +/-- Galois descent as a homomorphism from the base idele class group to +the Tate fixed subgroup. -/ +def baseIdeleClassToFixed : + IdeleClassGroup K →* + fixedSubgroup (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) := + (RelativeIdeleGroup.classInclusion K L).codRestrict + (fixedSubgroup (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) + (by + intro c + rw [ideleClass_fixedSubgroup_eq_galoisFixed K L] + exact + RelativeIdeleGroup.classInclusion_range_le_galoisFixed + K L ⟨c, rfl⟩) + +omit [NumberField L] [FiniteDimensional K L] [IsGalois K L] in +@[simp] +theorem baseIdeleClassToFixed_coe + (c : IdeleClassGroup K) : + ((baseIdeleClassToFixed K L c : + fixedSubgroup (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) : + RelativeIdeleGroup.ClassGroup K L) = + RelativeIdeleGroup.classInclusion K L c := + rfl + +/-- Galois descent packaged as the multiplicative equivalence +`C_K ≃ C_L^G` required by the `H⁰` calculation. -/ +noncomputable def baseIdeleClassEquivFixed : + IdeleClassGroup K ≃* + fixedSubgroup (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) := + MulEquiv.ofBijective + (baseIdeleClassToFixed K L) + ⟨by + intro a b hab + apply RelativeIdeleGroup.classInclusion_injective K L + exact congrArg Subtype.val hab, + by + intro c + have hc : + (c : RelativeIdeleGroup.ClassGroup K L) ∈ + (RelativeIdeleGroup.classInclusion K L).range := by + rw [ + RelativeIdeleGroup.classInclusion_range_eq_galoisFixedClassSubgroup + K L, + ← ideleClass_fixedSubgroup_eq_galoisFixed K L] + exact c.property + rcases hc with ⟨a, ha⟩ + exact ⟨a, Subtype.ext ha⟩⟩ + +omit [NumberField L] in +@[simp] +theorem baseIdeleClassEquivFixed_coe + (c : IdeleClassGroup K) : + ((baseIdeleClassEquivFixed K L c : + fixedSubgroup (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) : + RelativeIdeleGroup.ClassGroup K L) = + RelativeIdeleGroup.classInclusion K L c := + rfl + +omit [NumberField L] in +/-- Under Galois descent, the image of the class norm is exactly the +Tate-norm subgroup of the fixed idele classes. -/ +theorem ideleClassNorm_range_map_equivFixed : + (ideleClassNorm K L).range.map + (baseIdeleClassEquivFixed K L).toMonoidHom = + (tateNormSubgroup (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)).subgroupOf + (fixedSubgroup (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) := by + ext x + constructor + · rintro ⟨c, ⟨d, rfl⟩, rfl⟩ + change + RelativeIdeleGroup.classInclusion K L + (ideleClassNorm K L d) ∈ + tateNormSubgroup (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) + exact + ⟨d, + (classInclusion_ideleClassNorm_eq_tateNorm + K L d).symm⟩ + · intro hx + change + (x : RelativeIdeleGroup.ClassGroup K L) ∈ + tateNormSubgroup (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) at hx + rcases hx with ⟨d, hd⟩ + refine + ⟨ideleClassNorm K L d, ⟨d, rfl⟩, ?_⟩ + apply Subtype.ext + exact + (classInclusion_ideleClassNorm_eq_tateNorm + K L d).trans hd + +omit [NumberField L] in +/-- The Tate norm kernel on idele classes is the kernel of the descended +idele-class norm. Injectivity of `C_K → C_L` is the descent input. -/ +theorem ideleClass_normKernelSubgroup_eq_ker : + normKernelSubgroup (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) = + MonoidHom.ker (ideleClassNorm K L) := by + ext c + change + tateNorm (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) c = 1 ↔ + ideleClassNorm K L c = 1 + constructor + · intro hc + apply RelativeIdeleGroup.classInclusion_injective K L + rw [map_one, + classInclusion_ideleClassNorm_eq_tateNorm K L c, + hc] + · intro hc + rw [← classInclusion_ideleClassNorm_eq_tateNorm K L c, + hc, map_one] + +/-- The negative-first Tate group for the actual idele class module, +displayed as norm-one classes modulo augmentation classes. -/ +noncomputable def ideleClassHerbrandHMinusOneEquiv + (σ : L ≃ₐ[K] L) : + HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) σ ≃* + normKernelSubgroup (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) ⧸ + (augmentationSubgroup (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) σ).subgroupOf + (normKernelSubgroup (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) := + HerbrandHMinusOne.equiv + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup.ClassGroup K L) σ + +section NormQuotientIdentification + +local instance ideleClassNormQuotient_baseIsMulCommutative : + IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +/-- The degree-zero Tate group of the actual idele class group is the +class-norm quotient `C_K / N_{L/K} C_L`. -/ +noncomputable def ideleClassHerbrandH0EquivNormQuotient : + HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) ≃* + IdeleClassNormQuotient K L := + (HerbrandH0.equiv + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup.ClassGroup K L)).trans + (QuotientGroup.congr + (ideleClassNorm K L).range + ((tateNormSubgroup (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)).subgroupOf + (fixedSubgroup (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L))) + (baseIdeleClassEquivFixed K L) + (ideleClassNorm_range_map_equivFixed K L)).symm + +omit [NumberField L] in +/-- The norm index is the cardinality of the actual degree-zero Tate +cohomology group. This statement is valid without silently assigning a +positive finite index to an infinite quotient. -/ +theorem ideleClassNorm_index_eq_herbrandH0_card : + (ideleClassNorm K L).range.index = + Nat.card + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) := by + rw [Subgroup.index_eq_card] + exact + (Nat.card_congr + (ideleClassHerbrandH0EquivNormQuotient + K L).toEquiv).symm + +end NormQuotientIdentification + +omit [NumberField L] [FiniteDimensional K L] [IsGalois K L] in +/-- Exactness at `I_L` of `Lˣ → I_L → C_L`. -/ +theorem principalIdele_ideleClass_exact : + ∀ a : RelativeIdeleGroup K L, + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) a = 1 ↔ + ∃ p : RelativeIdeleGroup.principalSubgroup K L, + (RelativeIdeleGroup.principalSubgroup K L).subtype p = + a := + stableSubgroup_quotientMap_exact + (RelativeIdeleGroup.principalSubgroup K L) + +omit [NumberField L] [FiniteDimensional K L] [IsGalois K L] in +/-- The complete short-exactness data for the actual principal-idele +inclusion and idele-class quotient. -/ +theorem principalIdele_ideleClass_shortExact : + (∀ (σ : L ≃ₐ[K] L) + (p : RelativeIdeleGroup.principalSubgroup K L), + (RelativeIdeleGroup.principalSubgroup K L).subtype + (σ • p) = + σ • + (RelativeIdeleGroup.principalSubgroup K L).subtype p) ∧ + (∀ (σ : L ≃ₐ[K] L) + (a : RelativeIdeleGroup K L), + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) + (σ • a) = + σ • QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) a) ∧ + (∀ a : RelativeIdeleGroup K L, + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) a = 1 ↔ + ∃ p : RelativeIdeleGroup.principalSubgroup K L, + (RelativeIdeleGroup.principalSubgroup K L).subtype p = + a) ∧ + Function.Injective + (RelativeIdeleGroup.principalSubgroup K L).subtype ∧ + Function.Surjective + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L)) := by + exact + ⟨principalIdeleSubtype_equivariant K L, + ideleClassQuotientMap_equivariant K L, + principalIdele_ideleClass_exact K L, + (RelativeIdeleGroup.principalSubgroup K L).subtype_injective, + QuotientGroup.mk'_surjective + (RelativeIdeleGroup.principalSubgroup K L)⟩ + +omit [NumberField L] [IsGalois K L] in +/-- Herbrand-quotient multiplicativity for the actual exact sequence +`1 → Lˣ → I_L → C_L → 1`. -/ +theorem relativeIdele_herbrandQuotient_eq_principal_mul_class + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) + [Finite + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L))] + [Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L) σ)] + [Finite + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup K L))] + [Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup K L) σ)] + [Finite + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L))] + [Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) σ)] : + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup K L) σ = + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := + RelativeIdeleGroup.principalSubgroup K L) σ * + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup.ClassGroup K L) σ := by + let q : + RelativeIdeleGroup K L →* + RelativeIdeleGroup.ClassGroup K L := + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) + have hqEquivariant : + ∀ (τ : L ≃ₐ[K] L) + (a : RelativeIdeleGroup K L), + q (τ • a) = τ • q a := by + exact ideleClassQuotientMap_equivariant K L + have hqExact : + ∀ a : RelativeIdeleGroup K L, + q a = 1 ↔ + ∃ p : RelativeIdeleGroup.principalSubgroup K L, + (RelativeIdeleGroup.principalSubgroup K L).subtype p = + a := by + exact principalIdele_ideleClass_exact K L + have hqSurjective : Function.Surjective q := by + exact QuotientGroup.mk'_surjective + (RelativeIdeleGroup.principalSubgroup K L) + exact + @herbrandQuotient_multiplicative_of_shortExact + (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L) + (RelativeIdeleGroup K L) + (RelativeIdeleGroup.ClassGroup K L) + inferInstance inferInstance inferInstance inferInstance + inferInstance inferInstance inferInstance inferInstance + (RelativeIdeleGroup.principalSubgroup K L).subtype + q + (principalIdeleSubtype_equivariant K L) + hqEquivariant + hqExact + (RelativeIdeleGroup.principalSubgroup K L).subtype_injective + hqSurjective + σ hgen + inferInstance inferInstance inferInstance + inferInstance inferInstance inferInstance + +omit [NumberField L] [IsGalois K L] in +/-- Once the Herbrand quotients of principal ideles and relative ideles +have been computed, the actual idele-class quotient is automatically +defined and satisfies the multiplicativity identity. This is the +connection point for the unrestricted local-factor and `S`-unit calculations. -/ +theorem ideleClassHerbrandQuotientDefined_of_principal_relative + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) + [Finite + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L))] + [Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L) σ)] + [Finite + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup K L))] + [Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup K L) σ)] : + ∃ _ : + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) σ, + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup K L) σ = + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := + RelativeIdeleGroup.principalSubgroup K L) σ * + @herbrandQuotient + (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) + inferInstance inferInstance inferInstance + (ideleClassMulDistribMulAction K L) + σ := by + let q : + RelativeIdeleGroup K L →* + RelativeIdeleGroup.ClassGroup K L := + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) + have hqEquivariant : + ∀ (τ : L ≃ₐ[K] L) + (a : RelativeIdeleGroup K L), + q (τ • a) = τ • q a := + ideleClassQuotientMap_equivariant K L + have hqExact : + ∀ a : RelativeIdeleGroup K L, + q a = 1 ↔ + ∃ p : RelativeIdeleGroup.principalSubgroup K L, + (RelativeIdeleGroup.principalSubgroup K L).subtype p = + a := + principalIdele_ideleClass_exact K L + have hqSurjective : Function.Surjective q := + QuotientGroup.mk'_surjective + (RelativeIdeleGroup.principalSubgroup K L) + exact + @herbrandQuotient_multiplicative_of_left_middle_defined + (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L) + (RelativeIdeleGroup K L) + (RelativeIdeleGroup.ClassGroup K L) + inferInstance inferInstance inferInstance inferInstance + inferInstance inferInstance inferInstance inferInstance + (RelativeIdeleGroup.principalSubgroup K L).subtype + q + (principalIdeleSubtype_equivariant K L) + hqEquivariant + hqExact + (RelativeIdeleGroup.principalSubgroup K L).subtype_injective + hqSurjective + σ hgen + inferInstance inferInstance inferInstance inferInstance + +end Actions + +end Cohomology +end RelativeIdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/HerbrandExactSequence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/HerbrandExactSequence.lean new file mode 100644 index 0000000000..8147bb2437 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/HerbrandExactSequence.lean @@ -0,0 +1,269 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Index +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand +/-! +# The final cardinal step in the idele-class Herbrand calculation + +This file isolates the final cardinality argument in the idele-class Herbrand calculation. The +Herbrand quotients of the supported ideles and of the corresponding +principal ideles have a common nonzero local-degree factor. Cancelling +that factor in the exact-sequence identity gives + +`h(G, C_L) = |G|`. + +The degree-zero Tate group is the actual idele-class norm quotient, so +its cardinality, and hence the norm index, is at least `|G| = [L : K]`. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +open RelativeIdeleGroup.Cohomology + + +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology + +variable + (K L : Type) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- Finiteness of the two low Tate groups of the actual relative idele +module, with its concrete Galois action. -/ +def RelativeIdeleHerbrandQuotientDefined + (σ : L ≃ₐ[K] L) : Prop := + letI := relativeIdeleMulDistribMulAction K L + HerbrandQuotientDefined + (L ≃ₐ[K] L) (RelativeIdeleGroup K L) σ + +/-- Finiteness of the two low Tate groups of the actual principal-idele +module, with its concrete restricted Galois action. -/ +def PrincipalIdeleHerbrandQuotientDefined + (σ : L ≃ₐ[K] L) : Prop := + letI := relativeIdeleMulDistribMulAction K L + letI := principalIdeleMulDistribMulAction K L + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L) σ + +omit [NumberField L] [IsGalois K L] in +/-- Cancellation for the final idele-class Herbrand quotient. If the relative-idele and +principal-idele Herbrand quotients are respectively `q` and +`q / |G|`, then the idele-class Herbrand quotient is `|G|`. + +The hypotheses are phrased on the actual relative idele and principal +idele groups. The preceding supported-idele calculation supplies these +four finiteness instances and the two displayed values. -/ +theorem ideleClass_herbrandQuotient_eq_card_of_relative_principal_values + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) + (hRelativeDefined : + RelativeIdeleHerbrandQuotientDefined K L σ) + (hPrincipalDefined : + PrincipalIdeleHerbrandQuotientDefined K L σ) + (q : ℚ) (hq : q ≠ 0) + (hRelative : + letI := relativeIdeleMulDistribMulAction K L + letI : Finite + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup K L)) := + hRelativeDefined.1 + letI : Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup K L) σ) := + hRelativeDefined.2 + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup K L) σ = q) + (hPrincipal : + letI := relativeIdeleMulDistribMulAction K L + letI := principalIdeleMulDistribMulAction K L + letI : Finite + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L)) := + hPrincipalDefined.1 + letI : Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L) σ) := + hPrincipalDefined.2 + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup.principalSubgroup K L) σ = + q / (Fintype.card (L ≃ₐ[K] L) : ℚ)) : + letI := ideleClassMulDistribMulAction K L + ∃ _ : + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) σ, + @herbrandQuotient + (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) + _ _ _ _ σ = + (Fintype.card (L ≃ₐ[K] L) : ℚ) := by + let := relativeIdeleMulDistribMulAction K L + let := principalIdeleMulDistribMulAction K L + let := ideleClassMulDistribMulAction K L + let : Finite + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup K L)) := + hRelativeDefined.1 + let : Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup K L) σ) := + hRelativeDefined.2 + let : Finite + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L)) := + hPrincipalDefined.1 + let : Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L) σ) := + hPrincipalDefined.2 + obtain ⟨hC, hmul⟩ := + ideleClassHerbrandQuotientDefined_of_principal_relative + K L σ hgen + have hcard : + (Fintype.card (L ≃ₐ[K] L) : ℚ) ≠ 0 := + Nat.cast_ne_zero.mpr Fintype.card_ne_zero + have hfactor : + q / (Fintype.card (L ≃ₐ[K] L) : ℚ) ≠ 0 := + div_ne_zero hq hcard + refine ⟨hC, ?_⟩ + apply mul_left_cancel₀ hfactor + calc + (q / (Fintype.card (L ≃ₐ[K] L) : ℚ)) * + @herbrandQuotient + (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) + _ _ _ _ σ = + q := by + rw [← hPrincipal, ← hmul, hRelative] + _ = + (q / (Fintype.card (L ≃ₐ[K] L) : ℚ)) * + (Fintype.card (L ≃ₐ[K] L) : ℚ) := by + rw [div_mul_cancel₀ q hcard] + +omit [NumberField L] in +/-- Norm-index endpoint in group-order form. -/ +theorem card_le_ideleClassNorm_index_of_relative_principal_values + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) + (hRelativeDefined : + RelativeIdeleHerbrandQuotientDefined K L σ) + (hPrincipalDefined : + PrincipalIdeleHerbrandQuotientDefined K L σ) + (q : ℚ) (hq : q ≠ 0) + (hRelative : + letI := relativeIdeleMulDistribMulAction K L + letI : Finite + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup K L)) := + hRelativeDefined.1 + letI : Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup K L) σ) := + hRelativeDefined.2 + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup K L) σ = q) + (hPrincipal : + letI := relativeIdeleMulDistribMulAction K L + letI := principalIdeleMulDistribMulAction K L + letI : Finite + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L)) := + hPrincipalDefined.1 + letI : Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L) σ) := + hPrincipalDefined.2 + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup.principalSubgroup K L) σ = + q / (Fintype.card (L ≃ₐ[K] L) : ℚ)) : + Fintype.card (L ≃ₐ[K] L) ≤ + (RelativeIdeleGroup.Cohomology.ideleClassNorm K L).range.index := by + let := relativeIdeleMulDistribMulAction K L + let := principalIdeleMulDistribMulAction K L + let := ideleClassMulDistribMulAction K L + obtain ⟨hC, hCvalue⟩ := + ideleClass_herbrandQuotient_eq_card_of_relative_principal_values + K L σ hgen hRelativeDefined hPrincipalDefined + q hq hRelative hPrincipal + let : Finite + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) := + hC.1 + let : Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) σ) := + hC.2 + rw [ideleClassNorm_index_eq_herbrandH0_card K L] + apply + le_herbrandH0_card_of_herbrandQuotient_eq_nat + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup.ClassGroup K L) + σ (Fintype.card (L ≃ₐ[K] L)) + simpa using hCvalue + +omit [NumberField L] in +/-- Norm-index endpoint in extension-degree form. -/ +theorem finrank_le_ideleClassNorm_index_of_relative_principal_values + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) + (hRelativeDefined : + RelativeIdeleHerbrandQuotientDefined K L σ) + (hPrincipalDefined : + PrincipalIdeleHerbrandQuotientDefined K L σ) + (q : ℚ) (hq : q ≠ 0) + (hRelative : + letI := relativeIdeleMulDistribMulAction K L + letI : Finite + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup K L)) := + hRelativeDefined.1 + letI : Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup K L) σ) := + hRelativeDefined.2 + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup K L) σ = q) + (hPrincipal : + letI := relativeIdeleMulDistribMulAction K L + letI := principalIdeleMulDistribMulAction K L + letI : Finite + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L)) := + hPrincipalDefined.1 + letI : Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L) σ) := + hPrincipalDefined.2 + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup.principalSubgroup K L) σ = + q / (Fintype.card (L ≃ₐ[K] L) : ℚ)) : + Module.finrank K L ≤ + (RelativeIdeleGroup.Cohomology.ideleClassNorm K L).range.index := by + simpa only [Fintype.card_eq_nat_card, + IsGalois.card_aut_eq_finrank K L] using + card_le_ideleClassNorm_index_of_relative_principal_values + K L σ hgen hRelativeDefined hPrincipalDefined + q hq hRelative hPrincipal diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces.lean new file mode 100644 index 0000000000..1680858468 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.LocalBlocks +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Reassociation + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/All.lean new file mode 100644 index 0000000000..81c59a22ec --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/All.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.LocalBlocks +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Reassociation +/-! # Cohomological decompositions over finite sets of places -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand.lean new file mode 100644 index 0000000000..3755fd349a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Factors +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyCardinality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyFinite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Local + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/All.lean new file mode 100644 index 0000000000..2b074a4837 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/All.lean @@ -0,0 +1,19 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Factors +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyCardinality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyFinite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Local +/-! +# Cohomology of the unrestricted factors of a relative `S`-idele + +Public aggregate for the local, finite-family, and factor-transport Herbrand +calculations. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Factors.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Factors.lean new file mode 100644 index 0000000000..3f62c842b0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Factors.lean @@ -0,0 +1,391 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyCardinality +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.EquivariantEquiv +/-! +# Transport from local blocks to unrestricted factors + +This leaf transports the finite-family Herbrand calculation to the actual +unrestricted relative S-idele factors. +-/ + +@[expose] public section + +open scoped NumberField BigOperators ValuativeRel NNReal +open NumberField IsDedekindDomain + +noncomputable +section + + +open AlgebraicNumberTheory.Valuations +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory + +variable {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-! +## Canonical factor-transport action providers +-/ + +omit [NumberField L] in +open scoped Classical in +@[reducible] +noncomputable def + relativeUnrestrictedSPlaceFactorsActionProvider + (S : Finset (HeightOneSpectrum (𝓞 K))) : + MulDistribMulAction (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S) := + relativeUnrestrictedSPlaceFactorsAction + (K := K) (L := L) S + +omit [NumberField L] in +open scoped Classical in +@[reducible] +noncomputable def + relativeUnrestrictedSPlaceLocalBlockFamilyActionProvider + (S : Finset (HeightOneSpectrum (𝓞 K))) : + MulDistribMulAction (L ≃ₐ[K] L) + (LocalBlockFamily + (relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S)) := + localBlockFamilyAction + (relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S) + +omit [NumberField L] in +open scoped Classical in +/-- The equivariant realization by local blocks identifies degree-zero +Herbrand cohomology of the actual unrestricted factors with that of the +local-block family. -/ +noncomputable def + relativeUnrestrictedSPlaceFactorsHerbrandH0EquivLocalBlockFamily + (S : Finset (HeightOneSpectrum (𝓞 K))) : + @HerbrandH0 (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S) + _ _ _ + (relativeUnrestrictedSPlaceFactorsAction + (K := K) (L := L) S) ≃* + @HerbrandH0 (L ≃ₐ[K] L) + (LocalBlockFamily + (relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S)) + _ _ _ + (localBlockFamilyAction + (relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S)) := by + let d := + relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S + letI sourceAction := + relativeUnrestrictedSPlaceFactorsActionProvider + (K := K) (L := L) S + letI targetAction := + relativeUnrestrictedSPlaceLocalBlockFamilyActionProvider + (K := K) (L := L) S + exact + herbrandH0EquivariantMulEquiv + (relativeUnrestrictedSPlaceFactorsEquivLocalBlockFamily + (K := K) (L := L) S) + (relativeUnrestrictedSPlaceFactorsEquivLocalBlockFamily_smul + (K := K) (L := L) S) + +omit [NumberField L] in +open scoped Classical in +/-- The equivariant realization by local blocks identifies degree-minus-one +Herbrand cohomology of the actual unrestricted factors with that of the +local-block family. -/ +noncomputable def + relativeUnrestrictedSPlaceFactorsHerbrandHMinusOneEquivLocalBlockFamily + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) : + @HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S) + _ _ _ + (relativeUnrestrictedSPlaceFactorsAction + (K := K) (L := L) S) σ ≃* + @HerbrandHMinusOne (L ≃ₐ[K] L) + (LocalBlockFamily + (relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S)) + _ _ _ + (localBlockFamilyAction + (relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S)) σ := by + let d := + relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S + letI sourceAction := + relativeUnrestrictedSPlaceFactorsActionProvider + (K := K) (L := L) S + letI targetAction := + relativeUnrestrictedSPlaceLocalBlockFamilyActionProvider + (K := K) (L := L) S + exact + herbrandHMinusOneEquivariantMulEquiv + (relativeUnrestrictedSPlaceFactorsEquivLocalBlockFamily + (K := K) (L := L) S) + (relativeUnrestrictedSPlaceFactorsEquivLocalBlockFamily_smul + (K := K) (L := L) S) σ + +omit [NumberField L] in +open scoped Classical in +/-- Degree-zero cohomology of the actual unrestricted tensor factors is +finite. -/ +theorem relativeUnrestrictedSPlaceFactorsHerbrandH0Finite + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + letI := + relativeUnrestrictedSPlaceFactorsAction + (K := K) (L := L) S + Finite + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S)) := by + let d := + relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S + let sourceAction := + relativeUnrestrictedSPlaceFactorsActionProvider + (K := K) (L := L) S + let targetAction := + relativeUnrestrictedSPlaceLocalBlockFamilyActionProvider + (K := K) (L := L) S + let targetFinite : Finite + (HerbrandH0 (L ≃ₐ[K] L) + (LocalBlockFamily d)) := + relativeUnrestrictedLocalBlockFamilyHerbrandH0Finite + S σ hgen + exact + Finite.of_equiv + (HerbrandH0 (L ≃ₐ[K] L) + (LocalBlockFamily d)) + (relativeUnrestrictedSPlaceFactorsHerbrandH0EquivLocalBlockFamily + (K := K) (L := L) S).symm.toEquiv + +omit [NumberField L] in +open scoped Classical in +/-- Degree-minus-one cohomology of the actual unrestricted tensor +factors is finite. -/ +theorem relativeUnrestrictedSPlaceFactorsHerbrandHMinusOneFinite + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + letI := + relativeUnrestrictedSPlaceFactorsAction + (K := K) (L := L) S + Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S) σ) := by + let d := + relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S + let sourceAction := + relativeUnrestrictedSPlaceFactorsActionProvider + (K := K) (L := L) S + let targetAction := + relativeUnrestrictedSPlaceLocalBlockFamilyActionProvider + (K := K) (L := L) S + let targetFinite : Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (LocalBlockFamily d) σ) := + relativeUnrestrictedLocalBlockFamilyHerbrandHMinusOneFinite + S σ hgen + exact + Finite.of_equiv + (HerbrandHMinusOne (L ≃ₐ[K] L) + (LocalBlockFamily d) σ) + (relativeUnrestrictedSPlaceFactorsHerbrandHMinusOneEquivLocalBlockFamily + (K := K) (L := L) S σ).symm.toEquiv + +omit [NumberField L] in +open scoped Classical in +/-- Degree zero for the actual unrestricted factors: its +cardinality is the product of the local degrees. -/ +theorem + relativeUnrestrictedSPlaceFactorsHerbrandH0_card_eq_product + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + letI := + relativeUnrestrictedSPlaceFactorsAction + (K := K) (L := L) S + letI : Finite + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S)) := + relativeUnrestrictedSPlaceFactorsHerbrandH0Finite + S σ hgen + Nat.card + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S)) = + ∏ i, + relativeUnrestrictedSPlaceLocalDegree + (K := K) (L := L) S i := by + let d := + relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S + let sourceAction := + relativeUnrestrictedSPlaceFactorsActionProvider + (K := K) (L := L) S + let targetAction := + relativeUnrestrictedSPlaceLocalBlockFamilyActionProvider + (K := K) (L := L) S + let sourceFinite : Finite + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S)) := + relativeUnrestrictedSPlaceFactorsHerbrandH0Finite + S σ hgen + let targetFinite : Finite + (HerbrandH0 (L ≃ₐ[K] L) + (LocalBlockFamily d)) := + relativeUnrestrictedLocalBlockFamilyHerbrandH0Finite + S σ hgen + calc + Nat.card + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S)) = + Nat.card + (HerbrandH0 (L ≃ₐ[K] L) + (LocalBlockFamily d)) := + Nat.card_congr + (relativeUnrestrictedSPlaceFactorsHerbrandH0EquivLocalBlockFamily + (K := K) (L := L) S).toEquiv + _ = ∏ i, + relativeUnrestrictedSPlaceLocalDegree + (K := K) (L := L) S i := + relativeUnrestrictedLocalBlockFamilyHerbrandH0_card_eq_product + S σ hgen + +omit [NumberField L] in +open scoped Classical in +/-- Degree minus one for the actual unrestricted factors: +the group has one element. -/ +theorem + relativeUnrestrictedSPlaceFactorsHerbrandHMinusOne_card_eq_one + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + letI := + relativeUnrestrictedSPlaceFactorsAction + (K := K) (L := L) S + letI : Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S) σ) := + relativeUnrestrictedSPlaceFactorsHerbrandHMinusOneFinite + S σ hgen + Nat.card + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S) σ) = 1 := by + let d := + relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S + let sourceAction := + relativeUnrestrictedSPlaceFactorsActionProvider + (K := K) (L := L) S + let targetAction := + relativeUnrestrictedSPlaceLocalBlockFamilyActionProvider + (K := K) (L := L) S + let sourceFinite : Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S) σ) := + relativeUnrestrictedSPlaceFactorsHerbrandHMinusOneFinite + S σ hgen + let targetFinite : Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (LocalBlockFamily d) σ) := + relativeUnrestrictedLocalBlockFamilyHerbrandHMinusOneFinite + S σ hgen + calc + Nat.card + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S) σ) = + Nat.card + (HerbrandHMinusOne (L ≃ₐ[K] L) + (LocalBlockFamily d) σ) := + Nat.card_congr + (relativeUnrestrictedSPlaceFactorsHerbrandHMinusOneEquivLocalBlockFamily + (K := K) (L := L) S σ).toEquiv + _ = 1 := + relativeUnrestrictedLocalBlockFamilyHerbrandHMinusOne_card_eq_one + S σ hgen + +omit [NumberField L] in +open scoped Classical in +/-- The Herbrand quotient formula for the actual unrestricted tensor factors. -/ +theorem relativeUnrestrictedSPlaceFactors_herbrandQuotient + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + letI := + relativeUnrestrictedSPlaceFactorsAction + (K := K) (L := L) S + letI : Finite + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S)) := + relativeUnrestrictedSPlaceFactorsHerbrandH0Finite + S σ hgen + letI : Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S) σ) := + relativeUnrestrictedSPlaceFactorsHerbrandHMinusOneFinite + S σ hgen + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S) σ = + ∏ i, + (relativeUnrestrictedSPlaceLocalDegree + (K := K) (L := L) S i : ℚ) := by + let := + relativeUnrestrictedSPlaceFactorsAction + (K := K) (L := L) S + let : Finite + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S)) := + relativeUnrestrictedSPlaceFactorsHerbrandH0Finite + S σ hgen + let : Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S) σ) := + relativeUnrestrictedSPlaceFactorsHerbrandHMinusOneFinite + S σ hgen + rw [herbrandQuotient_eq_card_ratio, + relativeUnrestrictedSPlaceFactorsHerbrandH0_card_eq_product + S σ hgen, + relativeUnrestrictedSPlaceFactorsHerbrandHMinusOne_card_eq_one + S σ hgen] + simp only [Nat.cast_prod, Nat.cast_one, div_one] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyCardinality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyCardinality.lean new file mode 100644 index 0000000000..e92cd522f7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyCardinality.lean @@ -0,0 +1,249 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyFinite +/-! +# Cardinalities of finite unrestricted local-block families + +This leaf computes the two finite-family Herbrand cardinalities from the +finiteness results and the canonical family instance providers. +-/ + +@[expose] public section + +open scoped NumberField BigOperators ValuativeRel NNReal +open NumberField IsDedekindDomain + +noncomputable +section + + +open AlgebraicNumberTheory.Valuations +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory + +variable {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +omit [NumberField L] in +open scoped Classical in +/-- The degree-zero cardinality of the unrestricted local-block family +is the product of its local degrees. -/ +theorem + relativeUnrestrictedLocalBlockFamilyHerbrandH0_card_eq_product + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + let d := + relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S + letI : ∀ i, MulDistribMulAction + (absoluteValueDecompositionGroup K (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ := + fun i => + decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + letI : ∀ i, MulDistribMulAction + (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) := + fun i => + inducedMulDistribMulAction + (absoluteValueDecompositionGroup K + (d i).extension.1) + letI : MulDistribMulAction (L ≃ₐ[K] L) + (LocalBlockFamily d) := + piMulDistribMulAction (L ≃ₐ[K] L) + (fun i => + LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) + letI : Finite + (HerbrandH0 (L ≃ₐ[K] L) + (LocalBlockFamily d)) := + relativeUnrestrictedLocalBlockFamilyHerbrandH0Finite + S σ hgen + Nat.card + (HerbrandH0 (L ≃ₐ[K] L) + (LocalBlockFamily d)) = + ∏ i, + relativeUnrestrictedSPlaceLocalDegree + (K := K) (L := L) S i := by + let d := + relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S + let localAction := + localBlockFamilyLocalAction d + let blockAction := + localBlockFamilyBlockAction d + let familyAction := + localBlockFamilyAction d + let decompositionFintype := + localBlockFamilyDecompositionFintype d + let localFinite : ∀ i, Finite + (HerbrandH0 + (absoluteValueDecompositionGroup K (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ) := + fun i => + relativeUnrestrictedLocalHerbrandH0Finite + S i σ hgen + let familyFinite : Finite + (HerbrandH0 (L ≃ₐ[K] L) + (LocalBlockFamily d)) := + relativeUnrestrictedLocalBlockFamilyHerbrandH0Finite + S σ hgen + calc + Nat.card + (HerbrandH0 (L ≃ₐ[K] L) + (LocalBlockFamily d)) = + Nat.card + (∀ i, + HerbrandH0 + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ) := + Nat.card_congr + (localBlockFamilyHerbrandH0Equiv + d σ hgen).toEquiv + _ = ∏ i, Nat.card + (HerbrandH0 + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ) := + Nat.card_pi + _ = ∏ i, + relativeUnrestrictedSPlaceLocalDegree + (K := K) (L := L) S i := by + apply Finset.prod_congr rfl + intro i _ + exact + relativeUnrestrictedLocalHerbrandH0_card_eq_localDegree + S i σ hgen + +omit [NumberField L] in +open scoped Classical in +/-- The degree-minus-one cardinality of the unrestricted local-block +family is one. -/ +theorem + relativeUnrestrictedLocalBlockFamilyHerbrandHMinusOne_card_eq_one + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + let d := + relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S + letI : ∀ i, MulDistribMulAction + (absoluteValueDecompositionGroup K (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ := + fun i => + decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + letI : ∀ i, MulDistribMulAction + (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) := + fun i => + inducedMulDistribMulAction + (absoluteValueDecompositionGroup K + (d i).extension.1) + letI : MulDistribMulAction (L ≃ₐ[K] L) + (LocalBlockFamily d) := + piMulDistribMulAction (L ≃ₐ[K] L) + (fun i => + LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) + letI : Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (LocalBlockFamily d) σ) := + relativeUnrestrictedLocalBlockFamilyHerbrandHMinusOneFinite + S σ hgen + Nat.card + (HerbrandHMinusOne (L ≃ₐ[K] L) + (LocalBlockFamily d) σ) = 1 := by + let d := + relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S + let localAction := + localBlockFamilyLocalAction d + let blockAction := + localBlockFamilyBlockAction d + let familyAction := + localBlockFamilyAction d + let decompositionFintype := + localBlockFamilyDecompositionFintype d + let localFinite : ∀ i, Finite + (HerbrandHMinusOne + (absoluteValueDecompositionGroup K (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K + (d i).extension.1) + σ hgen)) := + fun i => + relativeUnrestrictedLocalHerbrandHMinusOneFinite + S i σ hgen + let familyFinite : Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (LocalBlockFamily d) σ) := + relativeUnrestrictedLocalBlockFamilyHerbrandHMinusOneFinite + S σ hgen + calc + Nat.card + (HerbrandHMinusOne (L ≃ₐ[K] L) + (LocalBlockFamily d) σ) = + Nat.card + (∀ i, + HerbrandHMinusOne + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K + (d i).extension.1) + σ hgen)) := + Nat.card_congr + (localBlockFamilyHerbrandHMinusOneEquiv + d σ hgen).toEquiv + _ = ∏ i, Nat.card + (HerbrandHMinusOne + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K + (d i).extension.1) + σ hgen)) := + Nat.card_pi + _ = ∏ _i : + RelativeUnrestrictedSPlaceIndex (K := K) S, 1 := by + apply Finset.prod_congr rfl + intro i _ + exact + relativeUnrestrictedLocalHerbrandHMinusOne_card_eq_one + S i σ hgen + _ = 1 := by simp diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyFinite.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyFinite.lean new file mode 100644 index 0000000000..09ce55e1f7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyFinite.lean @@ -0,0 +1,181 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Local +/-! +# Finite unrestricted local-block families + +This leaf assembles the local Herbrand calculations over the finite family of +unrestricted places. +-/ + +@[expose] public section + +open scoped NumberField BigOperators ValuativeRel NNReal +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory + +variable {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +omit [NumberField L] in +open scoped Classical in +/-- Degree-zero cohomology of the finite family of unrestricted local +blocks is finite. -/ +theorem relativeUnrestrictedLocalBlockFamilyHerbrandH0Finite + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + let d := + relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S + letI : ∀ i, MulDistribMulAction + (absoluteValueDecompositionGroup K (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ := + fun i => + decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + letI : ∀ i, MulDistribMulAction + (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) := + fun i => + inducedMulDistribMulAction + (absoluteValueDecompositionGroup K + (d i).extension.1) + letI : MulDistribMulAction (L ≃ₐ[K] L) + (LocalBlockFamily d) := + piMulDistribMulAction (L ≃ₐ[K] L) + (fun i => + LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) + Finite + (HerbrandH0 (L ≃ₐ[K] L) + (LocalBlockFamily d)) := by + let d := + relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S + let localAction := + localBlockFamilyLocalAction d + let blockAction := + localBlockFamilyBlockAction d + let familyAction := + localBlockFamilyCohomologyAction d + let decompositionFintype := + localBlockFamilyDecompositionFintype d + let localFinite : ∀ i, Finite + (HerbrandH0 + (absoluteValueDecompositionGroup K (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ) := + fun i => + relativeUnrestrictedLocalHerbrandH0Finite + S i σ hgen + exact + Finite.of_equiv + (∀ i, + HerbrandH0 + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ) + (localBlockFamilyHerbrandH0Equiv + d σ hgen).symm.toEquiv + +omit [NumberField L] in +open scoped Classical in +/-- Degree-minus-one cohomology of the finite family of unrestricted +local blocks is finite. -/ +theorem relativeUnrestrictedLocalBlockFamilyHerbrandHMinusOneFinite + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + let d := + relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S + letI : ∀ i, MulDistribMulAction + (absoluteValueDecompositionGroup K (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ := + fun i => + decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + letI : ∀ i, MulDistribMulAction + (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) := + fun i => + inducedMulDistribMulAction + (absoluteValueDecompositionGroup K + (d i).extension.1) + letI : MulDistribMulAction (L ≃ₐ[K] L) + (LocalBlockFamily d) := + piMulDistribMulAction (L ≃ₐ[K] L) + (fun i => + LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) + Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (LocalBlockFamily d) σ) := by + let d := + relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S + let localAction := + localBlockFamilyLocalAction d + let blockAction := + localBlockFamilyBlockAction d + let familyAction := + localBlockFamilyCohomologyAction d + let decompositionFintype := + localBlockFamilyDecompositionFintype d + let localFinite : ∀ i, Finite + (HerbrandHMinusOne + (absoluteValueDecompositionGroup K (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K + (d i).extension.1) + σ hgen)) := + fun i => + relativeUnrestrictedLocalHerbrandHMinusOneFinite + S i σ hgen + exact + Finite.of_equiv + (∀ i, + HerbrandHMinusOne + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K + (d i).extension.1) + σ hgen)) + (localBlockFamilyHerbrandHMinusOneEquiv + d σ hgen).symm.toEquiv diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Local.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Local.lean new file mode 100644 index 0000000000..d21758b0e8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Local.lean @@ -0,0 +1,336 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.FamilyClassAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.LocalBlocks +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization +/-! +# Cohomology of the unrestricted factors of a relative `S`-idele + +This file combines finite local class field theory with the explicit +real/complex norm calculation. It treats the finite family consisting +of all infinite places and the finite places in `S`. +-/ + +@[expose] public section + +open scoped NumberField BigOperators ValuativeRel NNReal +open NumberField IsDedekindDomain + +noncomputable +section + + +open AlgebraicNumberTheory.Valuations +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory + +variable {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +open scoped Classical in +/-- The local degree attached to one unrestricted place. At a finite +place it is the degree of the chosen localization; at an infinite place +it is one or two according as the place is unramified or ramified. -/ +noncomputable def relativeUnrestrictedSPlaceLocalDegree + (S : Finset (HeightOneSpectrum (𝓞 K))) : + RelativeUnrestrictedSPlaceIndex (K := K) S → ℕ := + fun i => + Nat.card + (absoluteValueDecompositionGroup K + ((relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S i).extension.1)) + +omit [NumberField K] [NumberField L] in +open scoped Classical in +/-- The decomposition-group localization equivalence identifies the order of a decomposition +group with +the degree of its localized completion. -/ +theorem absoluteValueDecompositionGroup_card_eq_localizedDegree + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) : + letI hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := localizedCompletionGlobalAlgebra vK w + letI := localizedCompletionIsScalarTower vK w + letI : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + letI : IsGalois vK.Completion + (LocalizedCompletion vK w) := + HilbertRamification.algebraicLocalization_isGalois vK w + Nat.card (absoluteValueDecompositionGroup K w.1) = + Module.finrank vK.Completion + (LocalizedCompletion vK w) := by + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let := localizedCompletionGlobalAlgebra vK w + let := localizedCompletionIsScalarTower vK w + let : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + let : IsGalois vK.Completion + (LocalizedCompletion vK w) := + HilbertRamification.algebraicLocalization_isGalois vK w + calc + Nat.card (absoluteValueDecompositionGroup K w.1) = + Nat.card + (LocalizedCompletion vK w ≃ₐ[vK.Completion] + LocalizedCompletion vK w) := + Nat.card_congr + (decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w).toEquiv + _ = Module.finrank vK.Completion + (LocalizedCompletion vK w) := + IsGalois.card_aut_eq_finrank + vK.Completion (LocalizedCompletion vK w) + +omit [NumberField L] in +open scoped Classical in +/-- Every local degree-zero Herbrand group in the unrestricted family is +finite. -/ +theorem relativeUnrestrictedLocalHerbrandH0Finite + (S : Finset (HeightOneSpectrum (𝓞 K))) + (i : RelativeUnrestrictedSPlaceIndex (K := K) S) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + let d := + relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S + letI : Fintype + (absoluteValueDecompositionGroup K (d i).extension.1) := + Fintype.ofFinite _ + letI : MulDistribMulAction + (absoluteValueDecompositionGroup K (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ := + decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + Finite + (HerbrandH0 + (absoluteValueDecompositionGroup K (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ) := by + cases i with + | inl v => + exact + infinitePlaceLocalHerbrandH0Finite + v (chosenInfinitePlaceAbove (L := L) v) + (chosenInfinitePlaceAbove_comap + (L := L) v) + | inr v => + let vK := HeightOneSpectrum.adicAbv K v.1 + let hvK := RayClass.adicAbv_isNontrivial v.1 + exact + localHerbrandH0Finite + vK hvK + (chosenFinitePlaceExtension + (L := L) v.1) + σ hgen + +omit [NumberField L] in +open scoped Classical in +/-- Every local degree-minus-one Herbrand group in the unrestricted +family is finite. -/ +theorem relativeUnrestrictedLocalHerbrandHMinusOneFinite + (S : Finset (HeightOneSpectrum (𝓞 K))) + (i : RelativeUnrestrictedSPlaceIndex (K := K) S) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + let d := + relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S + letI : Fintype + (absoluteValueDecompositionGroup K (d i).extension.1) := + Fintype.ofFinite _ + letI : MulDistribMulAction + (absoluteValueDecompositionGroup K (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ := + decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + Finite + (HerbrandHMinusOne + (absoluteValueDecompositionGroup K (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K + (d i).extension.1) + σ hgen)) := by + cases i with + | inl v => + exact + infinitePlaceLocalHerbrandHMinusOneFinite + v (chosenInfinitePlaceAbove (L := L) v) + (chosenInfinitePlaceAbove_comap + (L := L) v) + σ hgen + | inr v => + let vK := HeightOneSpectrum.adicAbv K v.1 + let hvK := RayClass.adicAbv_isNontrivial v.1 + exact + localHerbrandHMinusOneFinite + vK hvK + (chosenFinitePlaceExtension + (L := L) v.1) + σ hgen + +omit [NumberField L] in +open scoped Classical in +/-- The cardinality of one local degree-zero term is its local degree. -/ +theorem relativeUnrestrictedLocalHerbrandH0_card_eq_localDegree + (S : Finset (HeightOneSpectrum (𝓞 K))) + (i : RelativeUnrestrictedSPlaceIndex (K := K) S) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + let d := + relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S + letI : Fintype + (absoluteValueDecompositionGroup K (d i).extension.1) := + Fintype.ofFinite _ + letI : MulDistribMulAction + (absoluteValueDecompositionGroup K (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ := + decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + letI : Finite + (HerbrandH0 + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ) := + relativeUnrestrictedLocalHerbrandH0Finite + S i σ hgen + Nat.card + (HerbrandH0 + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ) = + relativeUnrestrictedSPlaceLocalDegree + (K := K) (L := L) S i := by + cases i with + | inl v => + dsimp only [relativeUnrestrictedSPlaceDatum, + relativeUnrestrictedSPlaceLocalDegree] + let w := chosenInfinitePlaceAbove (L := L) v + let hw := chosenInfinitePlaceAbove_comap + (L := L) v + have hcard := + infinitePlaceLocalHerbrandH0_card_eq_localDegree + v (chosenInfinitePlaceAbove (L := L) v) + (chosenInfinitePlaceAbove_comap + (L := L) v) + have hgroup : + Nat.card (absoluteValueDecompositionGroup K w.1) = + if w.IsUnramified K then 1 else 2 := by + rw [absoluteValueDecompositionGroup_eq_infinitePlaceStabilizer w, + InfinitePlace.card_stabilizer] + exact hcard.trans hgroup.symm + | inr v => + let vK := HeightOneSpectrum.adicAbv K v.1 + let hvK := RayClass.adicAbv_isNontrivial v.1 + dsimp only [relativeUnrestrictedSPlaceDatum, + relativeUnrestrictedSPlaceLocalDegree] + exact + (localHerbrandH0_card_eq_localDegree + vK hvK + (chosenFinitePlaceExtension + (L := L) v.1) + σ hgen).trans + (absoluteValueDecompositionGroup_card_eq_localizedDegree + (K := K) (L := L) + vK hvK + (chosenFinitePlaceExtension + (L := L) v.1)).symm + +omit [NumberField L] in +open scoped Classical in +/-- Every local degree-minus-one term has cardinality one. -/ +theorem relativeUnrestrictedLocalHerbrandHMinusOne_card_eq_one + (S : Finset (HeightOneSpectrum (𝓞 K))) + (i : RelativeUnrestrictedSPlaceIndex (K := K) S) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + let d := + relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S + letI : Fintype + (absoluteValueDecompositionGroup K (d i).extension.1) := + Fintype.ofFinite _ + letI : MulDistribMulAction + (absoluteValueDecompositionGroup K (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ := + decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + letI : Finite + (HerbrandHMinusOne + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K + (d i).extension.1) + σ hgen)) := + relativeUnrestrictedLocalHerbrandHMinusOneFinite + S i σ hgen + Nat.card + (HerbrandHMinusOne + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K + (d i).extension.1) + σ hgen)) = 1 := by + cases i with + | inl v => + dsimp only [relativeUnrestrictedSPlaceDatum] + exact + (infinitePlaceLocalClassAxiom_cards + v (chosenInfinitePlaceAbove (L := L) v) + (chosenInfinitePlaceAbove_comap + (L := L) v) + σ hgen).1 + | inr v => + let vK := HeightOneSpectrum.adicAbv K v.1 + let hvK := RayClass.adicAbv_isNontrivial v.1 + dsimp only [relativeUnrestrictedSPlaceDatum] + exact + localHerbrandHMinusOne_card_eq_one + vK hvK + (chosenFinitePlaceExtension + (L := L) v.1) + σ hgen diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/LocalBlocks.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/LocalBlocks.lean new file mode 100644 index 0000000000..75aceb1cf2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/LocalBlocks.lean @@ -0,0 +1,260 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FinitePlaceTensorBlock +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Decomposition +/-! +# The local blocks occurring in a relative `S`-idele + +For a finite set `S` of finite places, the unrestricted factors consist +of every infinite place and the finite places in `S`. This file packages +those two kinds of concrete tensor factors into one finite dependent +family and identifies it equivariantly with the induced local blocks of +the local tensor decomposition. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + +open LocalClassFieldTheory +open AlgebraicNumberTheory.Valuations +open CyclicCohomology +open HilbertRamification + +variable {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- A fixed infinite place of `L` above the given infinite place of +`K`. -/ +noncomputable def chosenInfinitePlaceAbove + (v : InfinitePlace K) : InfinitePlace L := + Classical.choose + (InfinitePlace.comap_surjective (K := L) v) + +omit [NumberField K] [NumberField L] [FiniteDimensional K L] in +/-- The chosen infinite place above `v` restricts back to `v`. -/ +@[simp] +theorem chosenInfinitePlaceAbove_comap + (v : InfinitePlace K) : + (chosenInfinitePlaceAbove (L := L) v).comap + (algebraMap K L) = v := + Classical.choose_spec + (InfinitePlace.comap_surjective (K := L) v) + +/-- Infinite places and the selected finite places form the finite +unrestricted index family of a relative `S`-idele. -/ +abbrev RelativeUnrestrictedSPlaceIndex + (S : Finset (HeightOneSpectrum (𝓞 K))) := + Sum (InfinitePlace K) + {v : HeightOneSpectrum (𝓞 K) // v ∈ S} + +/-- The chosen local-place data at every unrestricted place. -/ +noncomputable def relativeUnrestrictedSPlaceDatum + (S : Finset (HeightOneSpectrum (𝓞 K))) : + RelativeUnrestrictedSPlaceIndex (K := K) S → + LocalPlaceDatum K L + | Sum.inl v => + { base := v.1 + base_isNontrivial := v.isNontrivial + extension := + infinitePlaceAbsoluteValueExtension + v (chosenInfinitePlaceAbove (L := L) v) + (chosenInfinitePlaceAbove_comap + (L := L) v) } + | Sum.inr v => + { base := HeightOneSpectrum.adicAbv K v.1 + base_isNontrivial := + RayClass.adicAbv_isNontrivial v.1 + extension := + chosenFinitePlaceExtension + (L := L) v.1 } + +/-- The actual tensor-unit type attached to one unrestricted place. -/ +abbrev RelativeUnrestrictedSPlaceFactor + (S : Finset (HeightOneSpectrum (𝓞 K))) : + RelativeUnrestrictedSPlaceIndex (K := K) S → Type + | Sum.inl v => (v.Completion ⊗[K] L)ˣ + | Sum.inr v => (v.1.adicCompletion K ⊗[K] L)ˣ + +/-- Each unrestricted local tensor-unit factor is a commutative group. -/ +noncomputable instance relativeUnrestrictedSPlaceFactorCommGroup + (S : Finset (HeightOneSpectrum (𝓞 K))) + (i : RelativeUnrestrictedSPlaceIndex (K := K) S) : + CommGroup + (RelativeUnrestrictedSPlaceFactor + (K := K) (L := L) S i) := by + cases i <;> infer_instance + +/-- The finite family of actual unrestricted tensor factors. -/ +abbrev RelativeUnrestrictedSPlaceFactors + (S : Finset (HeightOneSpectrum (𝓞 K))) := + ∀ i : RelativeUnrestrictedSPlaceIndex (K := K) S, + RelativeUnrestrictedSPlaceFactor + (K := K) (L := L) S i + +/-- The componentwise scalar-conjugation action on the unrestricted +tensor factors. -/ +@[reducible] +noncomputable def relativeUnrestrictedSPlaceFactorsAction + (S : Finset (HeightOneSpectrum (𝓞 K))) : + MulDistribMulAction (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S) := by + letI : ∀ i : + RelativeUnrestrictedSPlaceIndex (K := K) S, + MulDistribMulAction (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactor + (K := K) (L := L) S i) := + fun i => by + cases i with + | inl v => + exact + scalarTensorUnitsAction + (K := K) (L := L) + (A := v.Completion) + | inr v => + exact + scalarTensorUnitsAction + (K := K) (L := L) + (A := v.1.adicCompletion K) + exact + piMulDistribMulAction (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactor + (K := K) (L := L) S) + +/-- The componentwise local tensor equivalence for every unrestricted place in `S`. -/ +noncomputable def + relativeUnrestrictedSPlaceFactorsEquivLocalBlockFamily + (S : Finset (HeightOneSpectrum (𝓞 K))) : + RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S ≃* + LocalBlockFamily + (relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S) := + MulEquiv.piCongrRight fun i => by + cases i with + | inl v => + exact + infinitePlaceTensorUnitsEquivLocalPlaceBlock + (K := K) (L := L) v v.isNontrivial + (infinitePlaceAbsoluteValueExtension + v (chosenInfinitePlaceAbove (L := L) v) + (chosenInfinitePlaceAbove_comap + (L := L) v)) + | inr v => + exact + finitePlaceTensorUnitsEquivLocalPlaceBlock + (K := K) (L := L) v.1 + (chosenFinitePlaceExtension + (L := L) v.1) + +omit [NumberField L] in +/-- The unrestricted-factor realization is equivariant for the full +global Galois action. -/ +theorem + relativeUnrestrictedSPlaceFactorsEquivLocalBlockFamily_smul + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) + (z : RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S) : + relativeUnrestrictedSPlaceFactorsEquivLocalBlockFamily + (K := K) (L := L) S + ((relativeUnrestrictedSPlaceFactorsAction + (K := K) (L := L) S).smul σ z) = + (localBlockFamilyAction + (relativeUnrestrictedSPlaceDatum + (K := K) (L := L) S)).smul σ + (relativeUnrestrictedSPlaceFactorsEquivLocalBlockFamily + (K := K) (L := L) S z) := by + funext i + cases i with + | inl v => + let u := + infinitePlaceAbsoluteValueExtension + v (chosenInfinitePlaceAbove (L := L) v) + (chosenInfinitePlaceAbove_comap (L := L) v) + let := + scalarTensorUnitsAction + (K := K) (L := L) (A := v.Completion) + let := + decompositionGroupLocalUnitsAction + v.1 v.isNontrivial u + let : MulDistribMulAction (L ≃ₐ[K] L) + (LocalPlaceBlock v.1 v.isNontrivial u) := + inducedMulDistribMulAction + (absoluteValueDecompositionGroup K u.1) + change + infinitePlaceTensorUnitsEquivLocalPlaceBlock + (K := K) (L := L) v v.isNontrivial u + (σ • z (Sum.inl v)) = + σ • + infinitePlaceTensorUnitsEquivLocalPlaceBlock + (K := K) (L := L) v v.isNontrivial u + (z (Sum.inl v)) + exact + infinitePlaceTensorUnitsEquivLocalPlaceBlock_smul + (K := K) (L := L) v v.isNontrivial u + σ (z (Sum.inl v)) + | inr v => + let u := chosenFinitePlaceExtension (L := L) v.1 + let := + scalarTensorUnitsAction + (K := K) (L := L) (A := v.1.adicCompletion K) + let := + decompositionGroupLocalUnitsAction + (HeightOneSpectrum.adicAbv K v.1) + (RayClass.adicAbv_isNontrivial v.1) u + let : MulDistribMulAction (L ≃ₐ[K] L) + (LocalPlaceBlock + (HeightOneSpectrum.adicAbv K v.1) + (RayClass.adicAbv_isNontrivial v.1) u) := + inducedMulDistribMulAction + (absoluteValueDecompositionGroup K u.1) + change + finitePlaceTensorUnitsEquivLocalPlaceBlock + (K := K) (L := L) v.1 u + (σ • z (Sum.inr v)) = + σ • + finitePlaceTensorUnitsEquivLocalPlaceBlock + (K := K) (L := L) v.1 u + (z (Sum.inr v)) + exact + finitePlaceTensorUnitsEquivLocalPlaceBlock_smul + (K := K) (L := L) v.1 u + σ (z (Sum.inr v)) + +/-- Reassociate the displayed unrestricted factors of +`RelativeIdeleSPlaceFactors` as the finite dependent family above. -/ +noncomputable def relativeUnrestrictedSPlaceFactorsEquivProd + (S : Finset (HeightOneSpectrum (𝓞 K))) : + RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S ≃* + (∀ v : InfinitePlace K, + (v.Completion ⊗[K] L)ˣ) × + (∀ v : + {v : HeightOneSpectrum (𝓞 K) // v ∈ S}, + (v.1.adicCompletion K ⊗[K] L)ˣ) where + toFun z := + ⟨fun v => z (Sum.inl v), + fun v => z (Sum.inr v)⟩ + invFun z + | Sum.inl v => z.1 v + | Sum.inr v => z.2 v + left_inv z := by + funext i + cases i <;> rfl + right_inv _ := rfl + map_mul' _ _ := rfl diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced.lean new file mode 100644 index 0000000000..9627e196d8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced.lean @@ -0,0 +1,22 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/All.lean new file mode 100644 index 0000000000..61caf0fd0b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/All.lean @@ -0,0 +1,25 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.All +/-! +# Integral induced blocks away from the exceptional places + +This is the public import entry point for the local integral induced-block +construction and its chosen-finite-place specialization. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlace.lean new file mode 100644 index 0000000000..9aa859c2a2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlace.lean @@ -0,0 +1,327 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Decomposition +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.EquivariantEquiv +/-! +# Integral induced blocks at the chosen finite place + +This file specializes the integral induced-block construction to the actual +chosen localization above a finite place and proves its unramified Tate +cohomology consequences. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct ValuativeRel NNReal +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology + +variable + {K : Type} {L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +section ChosenFinitePlace + +omit [NumberField L] in +private noncomputable def chosenFinitePlaceDecompositionGroupEquivProvider + (w₀ : HeightOneSpectrum (𝓞 K)) := + decompositionGroupEquivAlgebraicLocalizationAut + (HeightOneSpectrum.adicAbv K w₀) + (RayClass.adicAbv_isNontrivial w₀) + (chosenFinitePlaceExtension (L := L) w₀) + +omit [NumberField L] in +@[implicit_reducible] +private noncomputable def + chosenFinitePlaceLocalizedIntegerUnitsGaloisActionProvider + (w₀ : HeightOneSpectrum (𝓞 K)) : + MulDistribMulAction + (Gal(ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) + w₀/ChosenFinitePlaceBaseCompletion (K := K) w₀)) + 𝒪[ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀]ˣ := + galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure + (ChosenFinitePlaceBaseCompletion (K := K) w₀) + (ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) w₀) + +omit [NumberField L] in +@[implicit_reducible] +private noncomputable def chosenFinitePlaceDecompositionGroupFintypeProvider + (w₀ : HeightOneSpectrum (𝓞 K)) : + Fintype + (absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := L) w₀).1) := + Fintype.ofFinite _ + +private theorem zpowers_generator_map + {G H : Type*} [Group G] [Group H] + (e : G ≃* H) (g : G) + (hg : ∀ x : G, x ∈ Subgroup.zpowers g) : + ∀ y : H, y ∈ Subgroup.zpowers (e g) := by + intro y + have hmem : e.symm y ∈ Subgroup.zpowers g := + hg (e.symm y) + have himage : e (e.symm y) ∈ + (Subgroup.zpowers g).map e.toMonoidHom := + ⟨e.symm y, hmem, rfl⟩ + rw [MonoidHom.map_zpowers] at himage + simpa using himage + +private theorem subsingleton_of_equiv_of_equiv + {A B C : Type*} + (eAB : A ≃ B) (eBC : B ≃ C) + (hC : Subsingleton C) : + Subsingleton A := + ⟨fun _ _ ↦ + eAB.injective + (eBC.injective (@Subsingleton.elim C hC _ _))⟩ + +/-- Forget multiplication using the dictionaries already present in the equivalence. -/ +private def underlyingEquivOfMulEquiv + {A B : Type*} {mulA : Mul A} {mulB : Mul B} + (e : @MulEquiv A B mulA mulB) : A ≃ B := + e.toEquiv + +private theorem apply_of_zpowers_generator_map + {G H : Type*} [Group G] [Group H] + {P : H → Prop} + (e : G ≃* H) (g : G) + (hg : ∀ x : G, x ∈ Subgroup.zpowers g) + (hP : ∀ h : H, + (∀ y : H, y ∈ Subgroup.zpowers h) → P h) : + P (e g) := + hP (e g) (zpowers_generator_map e g hg) + +private theorem herbrandH0_subsingleton_of_action_and_group_equiv + {G H A X : Type*} + [Group G] [Fintype G] [Group H] [Fintype H] + [CommGroup A] [MulDistribMulAction H A] [Mul X] + (eGroup : G ≃* H) + (eAction : + X ≃* + letI : MulDistribMulAction G A := + MulDistribMulAction.compHom A eGroup.toMonoidHom + HerbrandH0 G A) + (hH : Subsingleton (HerbrandH0 H A)) : + Subsingleton X := by + let : MulDistribMulAction G A := + MulDistribMulAction.compHom A eGroup.toMonoidHom + let eChange := + herbrandH0CompMulEquiv (A := A) eGroup + exact subsingleton_of_equiv_of_equiv + eAction.toEquiv eChange.toEquiv hH + +private theorem herbrandHMinusOne_subsingleton_of_action_and_group_equiv + {G H A X : Type*} + [Group G] [Fintype G] [Group H] [Fintype H] + [CommGroup A] [MulDistribMulAction H A] [Mul X] + (eGroup : G ≃* H) (g : G) + (eAction : + X ≃* + letI : MulDistribMulAction G A := + MulDistribMulAction.compHom A eGroup.toMonoidHom + HerbrandHMinusOne G A g) + (hH : Subsingleton + (HerbrandHMinusOne H A (eGroup g))) : + Subsingleton X := by + let : MulDistribMulAction G A := + MulDistribMulAction.compHom A eGroup.toMonoidHom + let eChange := + herbrandHMinusOneCompMulEquiv + (A := A) eGroup g + exact subsingleton_of_equiv_of_equiv + eAction.toEquiv eChange.toEquiv hH + +omit [NumberField L] in +private theorem + chosenFinitePlaceDecompositionGroupIntegerUnits_unramifiedHerbrand_subsingleton + (w₀ : HeightOneSpectrum (𝓞 K)) + (σ : L ≃ₐ[K] L) + (hσ : ∀ τ : L ≃ₐ[K] L, τ ∈ Subgroup.zpowers σ) + (hunram : ChosenFinitePlaceIsUnramified + (K := K) (L := L) w₀) : + let E := ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀ + let H := absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := L) w₀).1 + letI : Fintype H := + chosenFinitePlaceDecompositionGroupFintypeProvider + (K := K) (L := L) w₀ + letI : MulDistribMulAction H 𝒪[E]ˣ := + chosenFinitePlaceDecompositionGroupIntegerUnitsAction + (K := K) (L := L) w₀ + Subsingleton (HerbrandH0 H 𝒪[E]ˣ) ∧ + Subsingleton + (HerbrandHMinusOne H 𝒪[E]ˣ + (subgroupGeneratorOfGenerator H σ hσ)) := by + let vK := HeightOneSpectrum.adicAbv K w₀ + let w := chosenFinitePlaceExtension (L := L) w₀ + let E := ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀ + let H := absoluteValueDecompositionGroup K w.1 + let eLocal := + chosenFinitePlaceDecompositionGroupEquivProvider + (K := K) (L := L) w₀ + let : MulDistribMulAction + (Gal(E/vK.Completion)) 𝒪[E]ˣ := + chosenFinitePlaceLocalizedIntegerUnitsGaloisActionProvider + (K := K) (L := L) w₀ + let : Fintype H := + chosenFinitePlaceDecompositionGroupFintypeProvider + (K := K) (L := L) w₀ + let : MulDistribMulAction H 𝒪[E]ˣ := + chosenFinitePlaceDecompositionGroupIntegerUnitsAction + (K := K) (L := L) w₀ + let δ := subgroupGeneratorOfGenerator H σ hσ + have hlocal := + apply_of_zpowers_generator_map eLocal δ + (subgroupGeneratorOfGenerator_generates H σ hσ) + (fun g hg ↦ + chosenFinitePlaceLocalizedIntegerUnits_unramifiedHerbrand_subsingleton + (K := K) (L := L) w₀ g hg hunram) + have hsmul : + ∀ (h : H) (x : 𝒪[E]ˣ), + (MulEquiv.refl 𝒪[E]ˣ) + ((chosenFinitePlaceDecompositionGroupIntegerUnitsAction + (K := K) (L := L) w₀).smul h x) = + (MulDistribMulAction.compHom + 𝒪[E]ˣ eLocal.toMonoidHom).smul h + ((MulEquiv.refl 𝒪[E]ˣ) x) := by + intro h x + exact + chosenFinitePlaceDecompositionGroupIntegerUnitsAction_smul_eq_pullback + (K := K) (L := L) w₀ h x + let eActionH0 := + @herbrandH0EquivariantMulEquiv + H 𝒪[E]ˣ 𝒪[E]ˣ _ _ _ _ + (chosenFinitePlaceDecompositionGroupIntegerUnitsAction + (K := K) (L := L) w₀) + (MulDistribMulAction.compHom 𝒪[E]ˣ eLocal.toMonoidHom) + (MulEquiv.refl 𝒪[E]ˣ) hsmul + let eActionHMinusOne := + @herbrandHMinusOneEquivariantMulEquiv + H 𝒪[E]ˣ 𝒪[E]ˣ _ _ _ _ + (chosenFinitePlaceDecompositionGroupIntegerUnitsAction + (K := K) (L := L) w₀) + (MulDistribMulAction.compHom 𝒪[E]ˣ eLocal.toMonoidHom) + (MulEquiv.refl 𝒪[E]ˣ) hsmul δ + let eGroupH0 := herbrandH0CompMulEquiv (A := 𝒪[E]ˣ) eLocal + let eGroupHMinusOne := + herbrandHMinusOneCompMulEquiv (A := 𝒪[E]ˣ) eLocal δ + exact + ⟨subsingleton_of_equiv_of_equiv + (underlyingEquivOfMulEquiv eActionH0) + (underlyingEquivOfMulEquiv eGroupH0) hlocal.1, + subsingleton_of_equiv_of_equiv + (underlyingEquivOfMulEquiv eActionHMinusOne) + (underlyingEquivOfMulEquiv eGroupHMinusOne) hlocal.2⟩ + +omit [NumberField L] in +/-- At an unramified chosen finite extension, the actual integral tensor +subgroup has trivial degree-zero Herbrand cohomology. -/ +theorem + relativeLocalTensorDecompositionIntegralUnitSubgroup_unramifiedHerbrandH0_subsingleton + (w₀ : HeightOneSpectrum (𝓞 K)) + (σ : L ≃ₐ[K] L) + (hσ : ∀ τ : L ≃ₐ[K] L, τ ∈ Subgroup.zpowers σ) + (hunram : ChosenFinitePlaceIsUnramified + (K := K) (L := L) w₀) : + letI := + relativeLocalTensorDecompositionIntegralUnitSubgroupAction + (K := K) (L := L) w₀ + Subsingleton + (HerbrandH0 (L ≃ₐ[K] L) + (relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w₀)) := by + let := + relativeLocalTensorDecompositionIntegralUnitSubgroupAction + (K := K) (L := L) w₀ + let E := ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀ + let H := absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := L) w₀).1 + let : Fintype H := + chosenFinitePlaceDecompositionGroupFintypeProvider + (K := K) (L := L) w₀ + let : MulDistribMulAction H 𝒪[E]ˣ := + chosenFinitePlaceDecompositionGroupIntegerUnitsAction + (K := K) (L := L) w₀ + have hdecomp := + chosenFinitePlaceDecompositionGroupIntegerUnits_unramifiedHerbrand_subsingleton + (K := K) (L := L) w₀ σ hσ hunram + let eTensor := herbrandH0EquivariantMulEquiv + (relativeLocalTensorDecompositionIntegralUnitSubgroupEquivInducedIntegerUnits + (K := K) (L := L) w₀) + (relativeLocalTensorDecompositionIntegralUnitSubgroupEquivInducedIntegerUnits_smul + (K := K) (L := L) w₀) + let eShapiro := + inducedHerbrandH0EquivOfFiniteCyclic (B := 𝒪[E]ˣ) H σ hσ + refine ⟨fun x y ↦ eTensor.injective ?_⟩ + refine eShapiro.injective ?_ + exact @Subsingleton.elim _ hdecomp.1 _ _ + +omit [NumberField L] in +/-- At an unramified chosen finite extension, the actual integral tensor +subgroup has trivial degree-minus-one Herbrand cohomology. -/ +theorem + relativeLocalTensorDecompositionIntegralUnitSubgroup_unramifiedHerbrandHMinusOne_subsingleton + (w₀ : HeightOneSpectrum (𝓞 K)) + (σ : L ≃ₐ[K] L) + (hσ : ∀ τ : L ≃ₐ[K] L, τ ∈ Subgroup.zpowers σ) + (hunram : ChosenFinitePlaceIsUnramified + (K := K) (L := L) w₀) : + letI := + relativeLocalTensorDecompositionIntegralUnitSubgroupAction + (K := K) (L := L) w₀ + Subsingleton + (HerbrandHMinusOne (L ≃ₐ[K] L) + (relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w₀) σ) := by + let := + relativeLocalTensorDecompositionIntegralUnitSubgroupAction + (K := K) (L := L) w₀ + let E := ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀ + let H := absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := L) w₀).1 + let : Fintype H := + chosenFinitePlaceDecompositionGroupFintypeProvider + (K := K) (L := L) w₀ + let : MulDistribMulAction H 𝒪[E]ˣ := + chosenFinitePlaceDecompositionGroupIntegerUnitsAction + (K := K) (L := L) w₀ + let δ := subgroupGeneratorOfGenerator H σ hσ + have hdecomp := + chosenFinitePlaceDecompositionGroupIntegerUnits_unramifiedHerbrand_subsingleton + (K := K) (L := L) w₀ σ hσ hunram + let eTensor := herbrandHMinusOneEquivariantMulEquiv + (relativeLocalTensorDecompositionIntegralUnitSubgroupEquivInducedIntegerUnits + (K := K) (L := L) w₀) + (relativeLocalTensorDecompositionIntegralUnitSubgroupEquivInducedIntegerUnits_smul + (K := K) (L := L) w₀) + σ + let eShapiro := + inducedHerbrandHMinusOneEquivOfFiniteCyclic (B := 𝒪[E]ˣ) H σ hσ + refine ⟨fun x y ↦ eTensor.injective ?_⟩ + refine eShapiro.injective ?_ + exact @Subsingleton.elim _ hdecomp.2 _ _ + +end ChosenFinitePlace diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceAction.lean new file mode 100644 index 0000000000..6c35b65164 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceAction.lean @@ -0,0 +1,231 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Decomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization +/-! +# The action at a chosen finite place + +This file exposes the decomposition-group action and the direct local +cohomology endpoint used by the integral induced-block construction. Keeping +this localization boundary in a lower leaf prevents downstream transport +proofs from elaborating it together with the tensor-block API. +-/ + +@[expose] public section + +open scoped NumberField ValuativeRel NNReal +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology + +variable + {K : Type} {L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +section ChosenFinitePlace + +/-- The decomposition group at the chosen extension of a finite place. -/ +abbrev ChosenFinitePlaceDecompositionGroup + (w₀ : HeightOneSpectrum (𝓞 K)) := + absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := L) w₀).1 + +/-- Integer units in the chosen localized completion. -/ +abbrev ChosenFinitePlaceLocalizedIntegerUnits + (w₀ : HeightOneSpectrum (𝓞 K)) := + 𝒪[ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀]ˣ + +/-- Field units in the chosen localized completion. -/ +abbrev ChosenFinitePlaceLocalizedFieldUnits + (w₀ : HeightOneSpectrum (𝓞 K)) := + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀)ˣ + +/-- The decomposition-group action on the chosen local integer units. + +The named action is the boundary at which dependent induced-module +declarations stop expanding the chosen-localization construction. -/ +@[implicit_reducible] +noncomputable def + chosenFinitePlaceDecompositionGroupIntegerUnitsAction + (w₀ : HeightOneSpectrum (𝓞 K)) : + MulDistribMulAction + (ChosenFinitePlaceDecompositionGroup + (K := K) (L := L) w₀) + (ChosenFinitePlaceLocalizedIntegerUnits + (K := K) (L := L) w₀) := + decompositionGroupLocalizedIntegerUnitsAction + (vK := HeightOneSpectrum.adicAbv K w₀) + (hvK := RayClass.adicAbv_isNontrivial w₀) + (hvKna := + HeightOneSpectrum.isNonarchimedean_adicAbv K w₀) + (w := chosenFinitePlaceExtension (L := L) w₀) + +/-- The decomposition-group action on the chosen local field units. -/ +@[implicit_reducible] +noncomputable def chosenFinitePlaceDecompositionGroupLocalUnitsAction + (w₀ : HeightOneSpectrum (𝓞 K)) : + MulDistribMulAction + (ChosenFinitePlaceDecompositionGroup + (K := K) (L := L) w₀) + (ChosenFinitePlaceLocalizedFieldUnits + (K := K) (L := L) w₀) := + decompositionGroupLocalUnitsAction + (HeightOneSpectrum.adicAbv K w₀) + (RayClass.adicAbv_isNontrivial w₀) + (chosenFinitePlaceExtension (L := L) w₀) + +/-- The induced module of integer units at the chosen finite place. -/ +abbrev ChosenFinitePlaceInducedIntegerUnits + (w₀ : HeightOneSpectrum (𝓞 K)) := + @InducedModule + (G := L ≃ₐ[K] L) + (B := ChosenFinitePlaceLocalizedIntegerUnits + (K := K) (L := L) w₀) + inferInstance + (ChosenFinitePlaceDecompositionGroup + (K := K) (L := L) w₀) + inferInstance + (chosenFinitePlaceDecompositionGroupIntegerUnitsAction + (K := K) (L := L) w₀) + +/-- The local multiplicative block attached to the chosen finite place. -/ +abbrev ChosenFinitePlaceLocalPlaceBlock + (w₀ : HeightOneSpectrum (𝓞 K)) := + LocalPlaceBlock + (HeightOneSpectrum.adicAbv K w₀) + (RayClass.adicAbv_isNontrivial w₀) + (chosenFinitePlaceExtension (L := L) w₀) + +/-- The global action on the chosen induced integer-unit block. -/ +@[implicit_reducible] +noncomputable def chosenFinitePlaceInducedIntegerUnitsAction + (w₀ : HeightOneSpectrum (𝓞 K)) : + MulDistribMulAction (L ≃ₐ[K] L) + (ChosenFinitePlaceInducedIntegerUnits + (K := K) (L := L) w₀) := by + letI : MulDistribMulAction + (ChosenFinitePlaceDecompositionGroup + (K := K) (L := L) w₀) + (ChosenFinitePlaceLocalizedIntegerUnits + (K := K) (L := L) w₀) := + chosenFinitePlaceDecompositionGroupIntegerUnitsAction + (K := K) (L := L) w₀ + exact inducedMulDistribMulAction + (ChosenFinitePlaceDecompositionGroup + (K := K) (L := L) w₀) + +/-- The global action on the chosen local multiplicative block. -/ +@[implicit_reducible] +noncomputable def chosenFinitePlaceLocalPlaceBlockAction + (w₀ : HeightOneSpectrum (𝓞 K)) : + MulDistribMulAction (L ≃ₐ[K] L) + (ChosenFinitePlaceLocalPlaceBlock + (K := K) (L := L) w₀) := by + letI : MulDistribMulAction + (ChosenFinitePlaceDecompositionGroup + (K := K) (L := L) w₀) + (ChosenFinitePlaceLocalizedFieldUnits + (K := K) (L := L) w₀) := + chosenFinitePlaceDecompositionGroupLocalUnitsAction + (K := K) (L := L) w₀ + exact inducedMulDistribMulAction + (ChosenFinitePlaceDecompositionGroup + (K := K) (L := L) w₀) + +omit [NumberField L] in +/-- On the actual chosen localization, the decomposition-group action on +integer units is the pullback of the local Galois action along the canonical +decomposition equivalence. Both sides are evaluated with the valued-field +and integral-closure data used by `LocalInduction`. -/ +theorem + chosenFinitePlaceDecompositionGroupIntegerUnitsAction_smul_eq_pullback + (w₀ : HeightOneSpectrum (𝓞 K)) : + let vK := HeightOneSpectrum.adicAbv K w₀ + let w := chosenFinitePlaceExtension (L := L) w₀ + let E := ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀ + let eLocal := + decompositionGroupEquivAlgebraicLocalizationAut + vK + (RayClass.adicAbv_isNontrivial w₀) + w + letI : MulDistribMulAction + (Gal(E/vK.Completion)) 𝒪[E]ˣ := + galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure + vK.Completion E + ∀ (σ : absoluteValueDecompositionGroup K w.1) + (x : 𝒪[E]ˣ), + (chosenFinitePlaceDecompositionGroupIntegerUnitsAction + (K := K) (L := L) w₀).smul σ x = + (MulDistribMulAction.compHom + 𝒪[E]ˣ eLocal.toMonoidHom).smul σ x := by + unfold chosenFinitePlaceDecompositionGroupIntegerUnitsAction + dsimp + intro σ x + rfl + +omit [NumberField L] in +/-- The actual completion selected over a finite place has trivial low-degree +Herbrand cohomology on its integer units whenever that local extension is +unramified. All valued-local-field and integer-ring structures here are the +canonical instances exported by `ChosenLocalization`. -/ +theorem chosenFinitePlaceLocalizedIntegerUnits_unramifiedHerbrand_subsingleton + (w₀ : HeightOneSpectrum (𝓞 K)) + (g : Gal(ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) + w₀/ChosenFinitePlaceBaseCompletion (K := K) w₀)) + (hg : ∀ τ : Gal(ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) + w₀/ChosenFinitePlaceBaseCompletion (K := K) w₀), + τ ∈ Subgroup.zpowers g) + (hunram : ChosenFinitePlaceIsUnramified + (K := K) (L := L) w₀) : + letI : MulDistribMulAction + (Gal(ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) + w₀/ChosenFinitePlaceBaseCompletion (K := K) w₀)) + 𝒪[ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) w₀]ˣ := + galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure + (ChosenFinitePlaceBaseCompletion (K := K) w₀) + (ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) w₀) + Subsingleton + (HerbrandH0 + (Gal(ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) + w₀/ChosenFinitePlaceBaseCompletion (K := K) w₀)) + 𝒪[ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) w₀]ˣ) ∧ + Subsingleton + (HerbrandHMinusOne + (Gal(ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) + w₀/ChosenFinitePlaceBaseCompletion (K := K) w₀)) + 𝒪[ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) w₀]ˣ g) := by + let vK := HeightOneSpectrum.adicAbv K w₀ + let E := ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀ + let : + IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + vK.Completion E := by + simpa [ChosenFinitePlaceIsUnramified] using hunram + exact + unramifiedLocalIntegerUnitsHerbrand_subsingleton + vK.Completion E g hg + +end ChosenFinitePlace diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlock.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlock.lean new file mode 100644 index 0000000000..35ebebea1a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlock.lean @@ -0,0 +1,129 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply +/-! +# Equivariance facade for the integral induced block + +This file combines the independent induced-block and tensor-block equivariance +lemmas into the transport used by the cohomology layer. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct ValuativeRel NNReal +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology + +variable + {K : Type} {L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +section ChosenFinitePlace + +omit [NumberField L] in +/-- The integral tensor-to-induced-module equivalence is equivariant for +the full global Galois action. -/ +theorem + relativeLocalTensorDecompositionIntegralUnitSubgroupEquivInducedIntegerUnits_smul + (w₀ : HeightOneSpectrum (𝓞 K)) + (τ : L ≃ₐ[K] L) + (x : relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w₀) : + letI := + relativeLocalTensorDecompositionIntegralUnitSubgroupAction + (K := K) (L := L) w₀ + letI := + chosenFinitePlaceInducedIntegerUnitsAction + (K := K) (L := L) w₀ + relativeLocalTensorDecompositionIntegralUnitSubgroupEquivInducedIntegerUnits + (K := K) (L := L) w₀ (τ • x) = + τ • + (relativeLocalTensorDecompositionIntegralUnitSubgroupEquivInducedIntegerUnits + (K := K) (L := L) w₀ x) := by + let := + relativeLocalTensorDecompositionIntegralUnitSubgroupAction + (K := K) (L := L) w₀ + let := + chosenFinitePlaceInducedIntegerUnitsAction + (K := K) (L := L) w₀ + let := + chosenFinitePlaceLocalPlaceBlockAction + (K := K) (L := L) w₀ + apply + chosenFinitePlaceIntegralInducedBlockToLocalPlaceBlock_injective + (K := K) (L := L) w₀ + calc + chosenFinitePlaceIntegralInducedBlockToLocalPlaceBlock + (K := K) (L := L) w₀ + (relativeLocalTensorDecompositionIntegralUnitSubgroupEquivInducedIntegerUnits + (K := K) (L := L) w₀ + ((relativeLocalTensorDecompositionIntegralUnitSubgroupAction + (K := K) (L := L) w₀).smul τ x)) = + finitePlaceTensorUnitsEquivLocalPlaceBlock + (K := K) (L := L) w₀ + (chosenFinitePlaceExtension (L := L) w₀) + (((relativeLocalTensorDecompositionIntegralUnitSubgroupAction + (K := K) (L := L) w₀).smul τ x : + relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w₀) : + (w₀.adicCompletion K ⊗[K] L)ˣ) := + chosenFinitePlaceIntegralInducedBlockToLocalPlaceBlock_equiv_apply + (K := K) (L := L) w₀ + ((relativeLocalTensorDecompositionIntegralUnitSubgroupAction + (K := K) (L := L) w₀).smul τ x) + _ = + (chosenFinitePlaceLocalPlaceBlockAction + (K := K) (L := L) w₀).smul τ + (finitePlaceTensorUnitsEquivLocalPlaceBlock + (K := K) (L := L) w₀ + (chosenFinitePlaceExtension (L := L) w₀) + (x : (w₀.adicCompletion K ⊗[K] L)ˣ)) := + finitePlaceTensorUnitsEquivLocalPlaceBlock_restricted_smul + (K := K) (L := L) w₀ τ x + _ = + (chosenFinitePlaceLocalPlaceBlockAction + (K := K) (L := L) w₀).smul τ + (chosenFinitePlaceIntegralInducedBlockToLocalPlaceBlock + (K := K) (L := L) w₀ + (relativeLocalTensorDecompositionIntegralUnitSubgroupEquivInducedIntegerUnits + (K := K) (L := L) w₀ x)) := + congrArg + (fun z : + ChosenFinitePlaceLocalPlaceBlock + (K := K) (L := L) w₀ => + (chosenFinitePlaceLocalPlaceBlockAction + (K := K) (L := L) w₀).smul τ z) + (chosenFinitePlaceIntegralInducedBlockToLocalPlaceBlock_equiv_apply + (K := K) (L := L) w₀ x).symm + _ = + chosenFinitePlaceIntegralInducedBlockToLocalPlaceBlock + (K := K) (L := L) w₀ + ((chosenFinitePlaceInducedIntegerUnitsAction + (K := K) (L := L) w₀).smul τ + (relativeLocalTensorDecompositionIntegralUnitSubgroupEquivInducedIntegerUnits + (K := K) (L := L) w₀ x)) := + (chosenFinitePlaceIntegralInducedBlockToLocalPlaceBlock_smul + (K := K) (L := L) w₀ τ + (relativeLocalTensorDecompositionIntegralUnitSubgroupEquivInducedIntegerUnits + (K := K) (L := L) w₀ x)).symm + +end ChosenFinitePlace diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquiv.lean new file mode 100644 index 0000000000..e18c3bbbe6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquiv.lean @@ -0,0 +1,68 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FinitePlaceTensorBlock +/-! +# The chosen integral tensor equivalence + +This file constructs the equivalence between the chosen integral tensor block +and the induced module of chosen local integer units. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct ValuativeRel NNReal +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology + +variable + {K : Type} {L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +section ChosenFinitePlace + +/-- Outside a finite exceptional set, the actual integral tensor-unit +subgroup at a finite place is the induced module of the +integer units at the chosen extension. -/ +noncomputable def + relativeLocalTensorDecompositionIntegralUnitSubgroupEquivInducedIntegerUnits + (w₀ : HeightOneSpectrum (𝓞 K)) : + relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w₀ ≃* + ChosenFinitePlaceInducedIntegerUnits + (K := K) (L := L) w₀ := + by + letI : MulDistribMulAction + (absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := L) w₀).1) + 𝒪[ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀]ˣ := + chosenFinitePlaceDecompositionGroupIntegerUnitsAction + (K := K) (L := L) w₀ + exact + (relativeLocalTensorDecompositionIntegralUnitSubgroupEquivPiUnits + (K := K) (L := L) w₀).trans + (completionProductIntegerUnitsEquivInducedModule + (K := K) (L := L) + (HeightOneSpectrum.adicAbv K w₀) + (RayClass.adicAbv_isNontrivial w₀) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w₀) + (chosenFinitePlaceExtension (L := L) w₀)) +end ChosenFinitePlace diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquivApply.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquivApply.lean new file mode 100644 index 0000000000..e4d297c621 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquivApply.lean @@ -0,0 +1,69 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion +/-! +# Compatibility of the chosen integral equivalence and inclusion + +This file compares the integral-block inclusion with the finite-place tensor +equivalence on underlying field units. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct ValuativeRel NNReal +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology + +variable + {K : Type} {L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +section ChosenFinitePlace + +omit [NumberField L] in +/-- The integral-block inclusion is compatible with the pre-existing +local-block equivalence on underlying field units. -/ +theorem + chosenFinitePlaceIntegralInducedBlockToLocalPlaceBlock_equiv_apply + (w₀ : HeightOneSpectrum (𝓞 K)) + (x : relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w₀) : + chosenFinitePlaceIntegralInducedBlockToLocalPlaceBlock + (K := K) (L := L) w₀ + (relativeLocalTensorDecompositionIntegralUnitSubgroupEquivInducedIntegerUnits + (K := K) (L := L) w₀ x) = + finitePlaceTensorUnitsEquivLocalPlaceBlock + (K := K) (L := L) w₀ + (chosenFinitePlaceExtension (L := L) w₀) + (x : (w₀.adicCompletion K ⊗[K] L)ˣ) := by + let vK := HeightOneSpectrum.adicAbv K w₀ + let u := chosenFinitePlaceExtension (L := L) w₀ + let hvK : vK.IsNontrivial := RayClass.adicAbv_isNontrivial w₀ + let hvKna : IsNonarchimedean (vK : K → ℝ) := + HeightOneSpectrum.isNonarchimedean_adicAbv K w₀ + let := decompositionGroupLocalUnitsAction vK hvK u + apply + (inducedRightCosetCoordinates + (absoluteValueDecompositionGroup K u.1)).injective + funext q + apply Units.ext + rfl +end ChosenFinitePlace diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInclusion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInclusion.lean new file mode 100644 index 0000000000..2bb5890139 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInclusion.lean @@ -0,0 +1,87 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction +/-! +# Inclusion of the chosen integral induced block + +This file embeds the chosen induced module of local integer units into the +ordinary local multiplicative block and proves injectivity. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct ValuativeRel NNReal +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology + +variable + {K : Type} {L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +section ChosenFinitePlace + +/-- Inclusion of the chosen integral block into the ordinary chosen +local multiplicative block. -/ +noncomputable def chosenFinitePlaceIntegralInducedBlockToLocalPlaceBlock + (w₀ : HeightOneSpectrum (𝓞 K)) : + ChosenFinitePlaceInducedIntegerUnits + (K := K) (L := L) w₀ → + ChosenFinitePlaceLocalPlaceBlock + (K := K) (L := L) w₀ := + by + letI : MulDistribMulAction + (absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := L) w₀).1) + 𝒪[ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀]ˣ := + chosenFinitePlaceDecompositionGroupIntegerUnitsAction + (K := K) (L := L) w₀ + change + InducedModule + (B := ChosenFinitePlaceLocalizedIntegerUnits + (K := K) (L := L) w₀) + (ChosenFinitePlaceDecompositionGroup + (K := K) (L := L) w₀) → + ChosenFinitePlaceLocalPlaceBlock + (K := K) (L := L) w₀ + exact + (inducedIntegerUnitsToLocalPlaceBlock + (HeightOneSpectrum.adicAbv K w₀) + (RayClass.adicAbv_isNontrivial w₀) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w₀) + (chosenFinitePlaceExtension (L := L) w₀)).toFun + +omit [NumberField L] in +/-- The chosen finite-place integral induced block embeds into its +unrestricted local-place block. -/ +theorem chosenFinitePlaceIntegralInducedBlockToLocalPlaceBlock_injective + (w₀ : HeightOneSpectrum (𝓞 K)) : + Function.Injective + (chosenFinitePlaceIntegralInducedBlockToLocalPlaceBlock + (K := K) (L := L) w₀) := by + let vK := HeightOneSpectrum.adicAbv K w₀ + let u := chosenFinitePlaceExtension (L := L) w₀ + let hvK : vK.IsNontrivial := RayClass.adicAbv_isNontrivial w₀ + let hvKna : IsNonarchimedean (vK : K → ℝ) := + HeightOneSpectrum.isNonarchimedean_adicAbv K w₀ + unfold chosenFinitePlaceIntegralInducedBlockToLocalPlaceBlock + exact inducedIntegerUnitsToLocalPlaceBlock_injective + vK hvK hvKna u +end ChosenFinitePlace diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInducedSmul.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInducedSmul.lean new file mode 100644 index 0000000000..a148e0acf1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInducedSmul.lean @@ -0,0 +1,59 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion +/-! +# Equivariance of the induced integral block + +This file proves that the inclusion of the chosen integral induced block is +equivariant for the global Galois action. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct ValuativeRel NNReal +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology + +variable + {K : Type} {L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +section ChosenFinitePlace + +omit [NumberField L] in +/-- The embedding of the chosen integral induced block is equivariant for +the full global Galois action. -/ +theorem chosenFinitePlaceIntegralInducedBlockToLocalPlaceBlock_smul + (w₀ : HeightOneSpectrum (𝓞 K)) + (τ : L ≃ₐ[K] L) : + ∀ f : ChosenFinitePlaceInducedIntegerUnits + (K := K) (L := L) w₀, + chosenFinitePlaceIntegralInducedBlockToLocalPlaceBlock + (K := K) (L := L) w₀ + ((chosenFinitePlaceInducedIntegerUnitsAction + (K := K) (L := L) w₀).smul τ f) = + (chosenFinitePlaceLocalPlaceBlockAction + (K := K) (L := L) w₀).smul τ + (chosenFinitePlaceIntegralInducedBlockToLocalPlaceBlock + (K := K) (L := L) w₀ f) := by + intro f + rfl + +end ChosenFinitePlace diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockTensorSmul.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockTensorSmul.lean new file mode 100644 index 0000000000..db3b1915ba --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockTensorSmul.lean @@ -0,0 +1,99 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FinitePlaceTensorBlock +/-! +# Equivariance of the integral tensor block + +This file proves equivariance of the finite-place tensor-unit block under the +restricted global Galois action. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct ValuativeRel NNReal +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology + +variable + {K : Type} {L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +section ChosenFinitePlace + +omit [NumberField L] in +/-- The local-place block equivalence intertwines the restricted integral +tensor action with the global Galois action. -/ +theorem + finitePlaceTensorUnitsEquivLocalPlaceBlock_restricted_smul + (w₀ : HeightOneSpectrum (𝓞 K)) + (τ : L ≃ₐ[K] L) + (x : relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w₀) : + letI := + relativeLocalTensorDecompositionIntegralUnitSubgroupAction + (K := K) (L := L) w₀ + finitePlaceTensorUnitsEquivLocalPlaceBlock + (K := K) (L := L) w₀ + (chosenFinitePlaceExtension (L := L) w₀) + (((τ • x : + relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w₀)) : + (w₀.adicCompletion K ⊗[K] L)ˣ) = + τ • + finitePlaceTensorUnitsEquivLocalPlaceBlock + (K := K) (L := L) w₀ + (chosenFinitePlaceExtension (L := L) w₀) + (x : (w₀.adicCompletion K ⊗[K] L)ˣ) := by + let := + relativeLocalTensorDecompositionIntegralUnitSubgroupAction + (K := K) (L := L) w₀ + let tensorUnitsAction := + scalarTensorUnitsAction + (K := K) (L := L) (A := w₀.adicCompletion K) + calc + finitePlaceTensorUnitsEquivLocalPlaceBlock + (K := K) (L := L) w₀ + (chosenFinitePlaceExtension (L := L) w₀) + (((τ • x : + relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w₀)) : + (w₀.adicCompletion K ⊗[K] L)ˣ) = + finitePlaceTensorUnitsEquivLocalPlaceBlock + (K := K) (L := L) w₀ + (chosenFinitePlaceExtension (L := L) w₀) + (τ • (x : (w₀.adicCompletion K ⊗[K] L)ˣ)) := + congrArg + (finitePlaceTensorUnitsEquivLocalPlaceBlock + (K := K) (L := L) w₀ + (chosenFinitePlaceExtension (L := L) w₀)) + (relativeLocalTensorDecompositionIntegralUnitSubgroupAction_coe + (K := K) (L := L) w₀ τ x) + _ = τ • + finitePlaceTensorUnitsEquivLocalPlaceBlock + (K := K) (L := L) w₀ + (chosenFinitePlaceExtension (L := L) w₀) + (x : (w₀.adicCompletion K ⊗[K] L)ˣ) := + finitePlaceTensorUnitsEquivLocalPlaceBlock_smul + (K := K) (L := L) w₀ + (chosenFinitePlaceExtension (L := L) w₀) τ + (x : (w₀.adicCompletion K ⊗[K] L)ˣ) + +end ChosenFinitePlace diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/CompletionTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/CompletionTransport.lean new file mode 100644 index 0000000000..f803747ec7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/CompletionTransport.lean @@ -0,0 +1,138 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.LocalizedValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor +/-! +# Transporting integer rings across finite-place cosets + +This file transports completion fields and their valuation rings from every +right coset of a decomposition group to the chosen algebraic localization. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct ValuativeRel NNReal +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory + +variable + {K : Type} {L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +section CompletionTransport + +variable (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + +/-- A completion belonging to a right coset, transported first by +Galois conjugation and then into the chosen algebraic localization. -/ +noncomputable def rightCosetCompletionRingEquivLocalized + (q : InducedRightCosets (absoluteValueDecompositionGroup K w.1)) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + (rightCosetExtensionEquiv vK hvK w q).1.Completion ≃+* + LocalizedCompletion vK w := by + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + change + (absoluteValueExtensionConjugate + vK w (Quotient.out q)).1.Completion ≃+* + LocalizedCompletion vK w + exact + (conjugateExtensionCompletionRingEquiv + vK w (Quotient.out q)).trans + (localizedCompletionEquivCompletion vK hvK w).symm.toRingEquiv + +omit [NumberField K] [NumberField L] in +/-- The right-coset transport is an isometry for the inherited norms. -/ +theorem rightCosetCompletionRingEquivLocalized_norm_eq + (q : InducedRightCosets (absoluteValueDecompositionGroup K w.1)) + (x : (absoluteValueExtensionConjugate + vK w (Quotient.out q)).1.Completion) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + ‖rightCosetCompletionRingEquivLocalized vK hvK w q x‖ = + ‖x‖ := by + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let z := + conjugateExtensionCompletionRingEquiv + vK w (Quotient.out q) x + have hcoe : + (((localizedCompletionEquivCompletion vK hvK w).symm z : + LocalizedCompletion vK w) : w.1.Completion) = z := by + have h := + localizedCompletionEquivCompletion_coe + vK hvK w + ((localizedCompletionEquivCompletion vK hvK w).symm z) + rw [AlgEquiv.apply_symm_apply] at h + exact h.symm + change + ‖(((localizedCompletionEquivCompletion vK hvK w).symm z : + LocalizedCompletion vK w) : w.1.Completion)‖ = ‖x‖ + rw [hcoe] + exact + conjugateExtensionCompletionRingEquiv_norm_eq + vK w (Quotient.out q) x + +/-- The same transport restricted to the two valuation integer rings. -/ +noncomputable def rightCosetCompletionIntegersRingEquivLocalized + (hvKna : IsNonarchimedean (vK : K → ℝ)) + (q : InducedRightCosets (absoluteValueDecompositionGroup K w.1)) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : Valued (LocalizedCompletion vK w) ℝ≥0 := + localizedCompletionFinitePlaceValued vK w hvKna + letI : ValuativeRel (LocalizedCompletion vK w) := + localizedCompletionFinitePlaceValuativeRel vK w hvKna + (absoluteValueCompletionIntegers + (absoluteValueExtensionConjugate + vK w (Quotient.out q)).1 + (absoluteValueExtension_isNonarchimedean + vK hvKna + (absoluteValueExtensionConjugate + vK w (Quotient.out q)))) ≃+* + 𝒪[LocalizedCompletion vK w] := by + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : Valued (LocalizedCompletion vK w) ℝ≥0 := + localizedCompletionFinitePlaceValued vK w hvKna + letI : ValuativeRel (LocalizedCompletion vK w) := + localizedCompletionFinitePlaceValuativeRel vK w hvKna + let e : + (absoluteValueExtensionConjugate + vK w (Quotient.out q)).1.Completion ≃+* + LocalizedCompletion vK w := + rightCosetCompletionRingEquivLocalized vK hvK w q + refine e.restrict _ _ ?_ + intro x + rw [mem_absoluteValueCompletionIntegers_iff, + localizedCompletion_mem_integers_iff_norm_le_one] + have hnorm := + rightCosetCompletionRingEquivLocalized_norm_eq + vK hvK w q x + change ‖e x‖ = ‖x‖ at hnorm + rw [hnorm] + +end CompletionTransport diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction.lean new file mode 100644 index 0000000000..81952df0b0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Action.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Action.lean new file mode 100644 index 0000000000..110f29c8de --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Action.lean @@ -0,0 +1,95 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine +/-! +# Integral local induced modules + +This file identifies the product of valuation-ring unit groups over the +extensions of a finite place with the corresponding induced module. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct ValuativeRel NNReal +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory + +variable + {K : Type} {L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +section IntegralInduction + +variable (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (hvKna : IsNonarchimedean (vK : K → ℝ)) + (w : AbsoluteValueExtension vK L) + +/-- The decomposition-group action on the units of the intrinsic integer +ring of the chosen localization. -/ +@[reducible] +noncomputable def decompositionGroupLocalizedIntegerUnitsAction : + letI := LocalInductionInternal.extensionCompletionAlgebra vK w + letI : SMul K w.1.Completion := + LocalInductionInternal.extensionCompletionSMul vK w + letI := LocalInductionInternal.completionAlgebra vK w + letI : Valued vK.Completion ℝ≥0 := + LocalInductionInternal.baseValued vK hvKna + letI : ValuativeRel vK.Completion := + LocalInductionInternal.baseValuativeRel vK hvKna + letI : Valued (LocalizedCompletion vK w) ℝ≥0 := + LocalInductionInternal.localizedValued vK w hvKna + letI : ValuativeRel (LocalizedCompletion vK w) := + LocalInductionInternal.localizedValuativeRel vK w hvKna + letI : Algebra 𝒪[vK.Completion] (LocalizedCompletion vK w) := + LocalInductionInternal.integerAlgebra vK w hvKna + letI := LocalInductionInternal.valuationHasExtension vK w hvKna + letI := LocalInductionInternal.isIntegralClosure + vK w hvK hvKna + MulDistribMulAction + (absoluteValueDecompositionGroup K w.1) + 𝒪[LocalizedCompletion vK w]ˣ := by + letI := LocalInductionInternal.extensionCompletionAlgebra vK w + letI : SMul K w.1.Completion := + LocalInductionInternal.extensionCompletionSMul vK w + letI := LocalInductionInternal.completionAlgebra vK w + letI : Valued vK.Completion ℝ≥0 := + LocalInductionInternal.baseValued vK hvKna + letI : ValuativeRel vK.Completion := + LocalInductionInternal.baseValuativeRel vK hvKna + letI : Valued (LocalizedCompletion vK w) ℝ≥0 := + LocalInductionInternal.localizedValued vK w hvKna + letI : ValuativeRel (LocalizedCompletion vK w) := + LocalInductionInternal.localizedValuativeRel vK w hvKna + letI : Algebra 𝒪[vK.Completion] (LocalizedCompletion vK w) := + LocalInductionInternal.integerAlgebra vK w hvKna + letI := LocalInductionInternal.valuationHasExtension vK w hvKna + letI := LocalInductionInternal.isIntegralClosure + vK w hvK hvKna + letI : MulDistribMulAction + (Gal(LocalizedCompletion vK w/vK.Completion)) + 𝒪[LocalizedCompletion vK w]ˣ := + galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure + vK.Completion (LocalizedCompletion vK w) + exact + MulDistribMulAction.compHom + 𝒪[LocalizedCompletion vK w]ˣ + (decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w).toMonoidHom + + +end IntegralInduction diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/All.lean new file mode 100644 index 0000000000..1e374e5470 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/All.lean @@ -0,0 +1,19 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine +/-! +# Integral local induced modules + +Public facade for the shared completion spine, action, product equivalence, +and inclusion leaves. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Equiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Equiv.lean new file mode 100644 index 0000000000..52ff4803df --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Equiv.lean @@ -0,0 +1,121 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action +/-! +# Integral local induction equivalence + +This leaf identifies the product of completed integer-unit groups with the +induced integer-unit module. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct ValuativeRel NNReal +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory + +variable + {K : Type} {L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +section IntegralInduction + +variable (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (hvKna : IsNonarchimedean (vK : K → ℝ)) + (w : AbsoluteValueExtension vK L) + +/-- The product of all local integer-unit groups from the canonical local tensor decomposition, +rewritten +as the induced integer-unit module at a chosen extension. -/ +noncomputable def completionProductIntegerUnitsEquivInducedModule : + letI := LocalInductionInternal.extensionCompletionAlgebra vK w + letI : SMul K w.1.Completion := + LocalInductionInternal.extensionCompletionSMul vK w + letI := LocalInductionInternal.completionAlgebra vK w + letI : Valued vK.Completion ℝ≥0 := + LocalInductionInternal.baseValued vK hvKna + letI : ValuativeRel vK.Completion := + LocalInductionInternal.baseValuativeRel vK hvKna + letI : Valued (LocalizedCompletion vK w) ℝ≥0 := + LocalInductionInternal.localizedValued vK w hvKna + letI : ValuativeRel (LocalizedCompletion vK w) := + LocalInductionInternal.localizedValuativeRel vK w hvKna + letI := LocalInductionInternal.valuationHasExtension vK w hvKna + letI := LocalInductionInternal.isIntegralClosure + vK w hvK hvKna + letI := decompositionGroupLocalizedIntegerUnitsAction + (vK := vK) (hvK := hvK) (hvKna := hvKna) (w := w) + (∀ w' : AbsoluteValueExtension vK L, + (absoluteValueCompletionIntegers w'.1 + (absoluteValueExtension_isNonarchimedean + vK hvKna w'))ˣ) ≃* + CyclicCohomology.InducedModule + (B := 𝒪[LocalizedCompletion vK w]ˣ) + (absoluteValueDecompositionGroup K w.1) := by + letI := LocalInductionInternal.extensionCompletionAlgebra vK w + letI : SMul K w.1.Completion := + LocalInductionInternal.extensionCompletionSMul vK w + letI := LocalInductionInternal.completionAlgebra vK w + letI : Valued vK.Completion ℝ≥0 := + LocalInductionInternal.baseValued vK hvKna + letI : ValuativeRel vK.Completion := + LocalInductionInternal.baseValuativeRel vK hvKna + letI : Valued (LocalizedCompletion vK w) ℝ≥0 := + LocalInductionInternal.localizedValued vK w hvKna + letI : ValuativeRel (LocalizedCompletion vK w) := + LocalInductionInternal.localizedValuativeRel vK w hvKna + letI := LocalInductionInternal.valuationHasExtension vK w hvKna + letI := LocalInductionInternal.isIntegralClosure + vK w hvK hvKna + letI := decompositionGroupLocalizedIntegerUnitsAction + (vK := vK) (hvK := hvK) (hvKna := hvKna) (w := w) + let reindex := + Equiv.piCongrLeft' + (fun w' : AbsoluteValueExtension vK L => + (absoluteValueCompletionIntegers w'.1 + (absoluteValueExtension_isNonarchimedean + vK hvKna w'))ˣ) + (rightCosetExtensionEquiv vK hvK w).symm + let reindexMul : + (∀ w' : AbsoluteValueExtension vK L, + (absoluteValueCompletionIntegers w'.1 + (absoluteValueExtension_isNonarchimedean + vK hvKna w'))ˣ) ≃* + (∀ q : InducedRightCosets + (absoluteValueDecompositionGroup K w.1), + (absoluteValueCompletionIntegers + (rightCosetExtensionEquiv vK hvK w q).1 + (absoluteValueExtension_isNonarchimedean + vK hvKna + (rightCosetExtensionEquiv vK hvK w q)))ˣ) := + { reindex with + map_mul' := by + intro x y + funext q + rfl } + exact + reindexMul.trans + ((MulEquiv.piCongrRight fun q : + InducedRightCosets (absoluteValueDecompositionGroup K w.1) => + Units.mapEquiv + (rightCosetCompletionIntegersRingEquivLocalized + vK hvK w hvKna q).toMulEquiv).trans + (inducedRightCosetCoordinates + (absoluteValueDecompositionGroup K w.1)).symm) + +end IntegralInduction diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Inclusion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Inclusion.lean new file mode 100644 index 0000000000..63da9888c8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Inclusion.lean @@ -0,0 +1,182 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv +/-! +# Inclusion of integral local induced modules + +This leaf embeds the induced integer-unit module into the ordinary local +multiplicative induced block and proves injectivity. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct ValuativeRel NNReal +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory + +variable + {K : Type} {L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +section IntegralInduction + +variable (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (hvKna : IsNonarchimedean (vK : K → ℝ)) + (w : AbsoluteValueExtension vK L) + +/-- Pointwise inclusion of integer units embeds the integral induced +block into the ordinary local multiplicative induced block. -/ +noncomputable def inducedIntegerUnitsToLocalPlaceBlock : + letI := LocalInductionInternal.extensionCompletionAlgebra vK w + letI : SMul K w.1.Completion := + LocalInductionInternal.extensionCompletionSMul vK w + letI := LocalInductionInternal.completionAlgebra vK w + letI : Valued vK.Completion ℝ≥0 := + LocalInductionInternal.baseValued vK hvKna + letI : ValuativeRel vK.Completion := + LocalInductionInternal.baseValuativeRel vK hvKna + letI : Valued (LocalizedCompletion vK w) ℝ≥0 := + LocalInductionInternal.localizedValued vK w hvKna + letI : ValuativeRel (LocalizedCompletion vK w) := + LocalInductionInternal.localizedValuativeRel vK w hvKna + letI : Algebra 𝒪[vK.Completion] (LocalizedCompletion vK w) := + LocalInductionInternal.integerAlgebra vK w hvKna + letI := LocalInductionInternal.valuationHasExtension vK w hvKna + letI := LocalInductionInternal.isIntegralClosure + vK w hvK hvKna + letI := decompositionGroupLocalizedIntegerUnitsAction + (vK := vK) (hvK := hvK) (hvKna := hvKna) (w := w) + CyclicCohomology.InducedModule + (B := 𝒪[LocalizedCompletion vK w]ˣ) + (absoluteValueDecompositionGroup K w.1) →* + LocalPlaceBlock vK hvK w := by + letI := LocalInductionInternal.extensionCompletionAlgebra vK w + letI : SMul K w.1.Completion := + LocalInductionInternal.extensionCompletionSMul vK w + letI := LocalInductionInternal.completionAlgebra vK w + letI : Valued vK.Completion ℝ≥0 := + LocalInductionInternal.baseValued vK hvKna + letI : ValuativeRel vK.Completion := + LocalInductionInternal.baseValuativeRel vK hvKna + letI : Valued (LocalizedCompletion vK w) ℝ≥0 := + LocalInductionInternal.localizedValued vK w hvKna + letI : ValuativeRel (LocalizedCompletion vK w) := + LocalInductionInternal.localizedValuativeRel vK w hvKna + letI : Algebra 𝒪[vK.Completion] (LocalizedCompletion vK w) := + LocalInductionInternal.integerAlgebra vK w hvKna + letI := LocalInductionInternal.valuationHasExtension vK w hvKna + letI := LocalInductionInternal.isIntegralClosure + vK w hvK hvKna + letI := decompositionGroupLocalizedIntegerUnitsAction + (vK := vK) (hvK := hvK) (hvKna := hvKna) (w := w) + letI := decompositionGroupLocalUnitsAction vK hvK w + refine + { toFun := fun f => + ⟨fun g => + LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits + (LocalizedCompletion vK w) (f.1 g), + by + intro h g + change + LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits + (LocalizedCompletion vK w) (f.1 (h.1 * g)) = + h • + LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits + (LocalizedCompletion vK w) (f.1 g) + rw [f.2 h g] + let : MulDistribMulAction + (Gal(LocalizedCompletion vK w/vK.Completion)) + 𝒪[LocalizedCompletion vK w]ˣ := + galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure + vK.Completion (LocalizedCompletion vK w) + let : MulDistribMulAction + (Gal(LocalizedCompletion vK w/vK.Completion)) + (LocalizedCompletion vK w)ˣ := + galoisGroupFieldUnitsMulDistribMulAction + vK.Completion (LocalizedCompletion vK w) + exact + integerUnitsToFieldUnits_galoisGroup_equivariant + vK.Completion (LocalizedCompletion vK w) + (decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w h) + (f.1 g)⟩ + map_one' := by + apply Subtype.ext + funext g + rfl + map_mul' := fun f₁ f₂ ↦ by + apply Subtype.ext + funext g + rfl } + +omit [NumberField K] [NumberField L] in +/-- The map from induced localized integer units to the corresponding +local-place block is injective. -/ +theorem inducedIntegerUnitsToLocalPlaceBlock_injective : + letI := LocalInductionInternal.extensionCompletionAlgebra vK w + letI : SMul K w.1.Completion := + LocalInductionInternal.extensionCompletionSMul vK w + letI := LocalInductionInternal.completionAlgebra vK w + letI : Valued vK.Completion ℝ≥0 := + LocalInductionInternal.baseValued vK hvKna + letI : ValuativeRel vK.Completion := + LocalInductionInternal.baseValuativeRel vK hvKna + letI : Valued (LocalizedCompletion vK w) ℝ≥0 := + LocalInductionInternal.localizedValued vK w hvKna + letI : ValuativeRel (LocalizedCompletion vK w) := + LocalInductionInternal.localizedValuativeRel vK w hvKna + letI : Algebra 𝒪[vK.Completion] (LocalizedCompletion vK w) := + LocalInductionInternal.integerAlgebra vK w hvKna + letI := LocalInductionInternal.valuationHasExtension vK w hvKna + letI := LocalInductionInternal.isIntegralClosure + vK w hvK hvKna + letI := decompositionGroupLocalizedIntegerUnitsAction + (vK := vK) (hvK := hvK) (hvKna := hvKna) (w := w) + Function.Injective + (inducedIntegerUnitsToLocalPlaceBlock + (K := K) (L := L) vK hvK hvKna w) := by + let := LocalInductionInternal.extensionCompletionAlgebra vK w + let : SMul K w.1.Completion := + LocalInductionInternal.extensionCompletionSMul vK w + let := LocalInductionInternal.completionAlgebra vK w + let : Valued vK.Completion ℝ≥0 := + LocalInductionInternal.baseValued vK hvKna + let : ValuativeRel vK.Completion := + LocalInductionInternal.baseValuativeRel vK hvKna + let : Valued (LocalizedCompletion vK w) ℝ≥0 := + LocalInductionInternal.localizedValued vK w hvKna + let : ValuativeRel (LocalizedCompletion vK w) := + LocalInductionInternal.localizedValuativeRel vK w hvKna + let : Algebra 𝒪[vK.Completion] (LocalizedCompletion vK w) := + LocalInductionInternal.integerAlgebra vK w hvKna + let := LocalInductionInternal.valuationHasExtension vK w hvKna + let := LocalInductionInternal.isIntegralClosure + vK w hvK hvKna + let := decompositionGroupLocalizedIntegerUnitsAction + (vK := vK) (hvK := hvK) (hvKna := hvKna) (w := w) + intro f₁ f₂ h + apply Subtype.ext + funext g + apply + LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits_injective + (LocalizedCompletion vK w) + exact congrArg + (fun z : LocalPlaceBlock vK hvK w => z.1 g) h + + +end IntegralInduction diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Spine.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Spine.lean new file mode 100644 index 0000000000..9dcef3c6f0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Spine.lean @@ -0,0 +1,164 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation +/-! +# Shared completion spine for integral local induction + +This file names the coherent algebra, valuation, and integral-closure +structures used by every integral local-induction leaf. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct ValuativeRel NNReal +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory + +variable + {K : Type} {L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +namespace LocalInductionInternal + +variable (vK : AbsoluteValue K ℝ) + (w : AbsoluteValueExtension vK L) + +/-- The base-field algebra structure on the chosen extension completion. -/ +@[reducible] +noncomputable def extensionCompletionAlgebra : + Algebra K w.1.Completion := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + +/-- The scalar action underlying `extensionCompletionAlgebra`. -/ +@[reducible] +noncomputable def extensionCompletionSMul : + SMul K w.1.Completion := + (extensionCompletionAlgebra vK w).toSMul + +/-- The completed-base algebra structure on the chosen extension +completion. -/ +@[reducible] +noncomputable def completionAlgebra : + Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + +/-- The canonical valued structure on the completed base place. -/ +@[reducible] +noncomputable def baseValued + (hvKna : IsNonarchimedean (vK : K → ℝ)) : + Valued vK.Completion ℝ≥0 := + finitePlaceCompletionValued vK hvKna + +/-- The canonical valuative relation on the completed base place. -/ +@[reducible] +noncomputable def baseValuativeRel + (hvKna : IsNonarchimedean (vK : K → ℝ)) : + letI : Valued vK.Completion ℝ≥0 := baseValued vK hvKna + ValuativeRel vK.Completion := + finitePlaceCompletionValuativeRel vK hvKna + +/-- The canonical valued structure on the chosen localized completion. -/ +@[reducible] +noncomputable def localizedValued + (hvKna : IsNonarchimedean (vK : K → ℝ)) : + Valued (LocalizedCompletion vK w) ℝ≥0 := + localizedCompletionFinitePlaceValued vK w hvKna + +/-- The canonical valuative relation on the chosen localized completion. -/ +@[reducible] +noncomputable def localizedValuativeRel + (hvKna : IsNonarchimedean (vK : K → ℝ)) : + letI : Valued (LocalizedCompletion vK w) ℝ≥0 := + localizedValued vK w hvKna + ValuativeRel (LocalizedCompletion vK w) := + localizedCompletionFinitePlaceValuativeRel vK w hvKna + +/-- The canonical algebra of the localized completion over the completed +base valuation ring. -/ +@[reducible] +noncomputable def integerAlgebra + (hvKna : IsNonarchimedean (vK : K → ℝ)) : + letI := extensionCompletionAlgebra vK w + letI : SMul K w.1.Completion := extensionCompletionSMul vK w + letI := completionAlgebra vK w + letI : Valued vK.Completion ℝ≥0 := baseValued vK hvKna + letI : ValuativeRel vK.Completion := baseValuativeRel vK hvKna + letI : Valued (LocalizedCompletion vK w) ℝ≥0 := + localizedValued vK w hvKna + letI : ValuativeRel (LocalizedCompletion vK w) := + localizedValuativeRel vK w hvKna + Algebra 𝒪[vK.Completion] (LocalizedCompletion vK w) := by + letI := extensionCompletionAlgebra vK w + letI : SMul K w.1.Completion := extensionCompletionSMul vK w + letI := completionAlgebra vK w + letI : Valued vK.Completion ℝ≥0 := baseValued vK hvKna + letI : ValuativeRel vK.Completion := baseValuativeRel vK hvKna + letI : Valued (LocalizedCompletion vK w) ℝ≥0 := + localizedValued vK w hvKna + letI : ValuativeRel (LocalizedCompletion vK w) := + localizedValuativeRel vK w hvKna + exact Algebra.ofSubsemiring 𝒪[vK.Completion] + +omit [NumberField K] [NumberField L] [FiniteDimensional K L] + [IsGalois K L] in +/-- The canonical valuation-extension certificate for the integral +local-induction completion pair. -/ +theorem valuationHasExtension + (hvKna : IsNonarchimedean (vK : K → ℝ)) : + letI := extensionCompletionAlgebra vK w + letI : SMul K w.1.Completion := extensionCompletionSMul vK w + letI := completionAlgebra vK w + letI : Valued vK.Completion ℝ≥0 := baseValued vK hvKna + letI : ValuativeRel vK.Completion := baseValuativeRel vK hvKna + letI : Valued (LocalizedCompletion vK w) ℝ≥0 := + localizedValued vK w hvKna + letI : ValuativeRel (LocalizedCompletion vK w) := + localizedValuativeRel vK w hvKna + Valuation.HasExtension + (ValuativeRel.valuation vK.Completion) + (ValuativeRel.valuation (LocalizedCompletion vK w)) := + localizedCompletionValuationHasExtension vK w hvKna + +omit [NumberField K] [NumberField L] [IsGalois K L] in +/-- The canonical integral-closure certificate for the integral +local-induction completion pair. -/ +theorem isIntegralClosure + (hvK : vK.IsNontrivial) + (hvKna : IsNonarchimedean (vK : K → ℝ)) : + letI := extensionCompletionAlgebra vK w + letI : SMul K w.1.Completion := extensionCompletionSMul vK w + letI := completionAlgebra vK w + letI : Valued vK.Completion ℝ≥0 := baseValued vK hvKna + letI : ValuativeRel vK.Completion := baseValuativeRel vK hvKna + letI : Valued (LocalizedCompletion vK w) ℝ≥0 := + localizedValued vK w hvKna + letI : ValuativeRel (LocalizedCompletion vK w) := + localizedValuativeRel vK w hvKna + letI : Algebra 𝒪[vK.Completion] (LocalizedCompletion vK w) := + integerAlgebra vK w hvKna + letI := valuationHasExtension vK w hvKna + IsIntegralClosure + 𝒪[LocalizedCompletion vK w] + 𝒪[vK.Completion] + (LocalizedCompletion vK w) := + localizedCompletionIsIntegralClosureWithExtension + vK w hvK hvKna + +end LocalInductionInternal diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Reassociation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Reassociation.lean new file mode 100644 index 0000000000..21c46fb21a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Reassociation.lean @@ -0,0 +1,270 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.LocalBlocks +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.BinaryProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.SPlaces +public import Mathlib.Algebra.GroupWithZero.Action.Prod +/-! +# Reassociation of supported relative-idele factors + +The factor model of a supported relative idele is reassociated into the +finite family of unrestricted places and the product of integral factors +outside the support. The comparison respects the concrete Galois +actions. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + + +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- The product of the actual integral tensor-unit factors outside +`S`. -/ +abbrev RelativeOutsideSPlaceFactors + (S : Finset (HeightOneSpectrum (𝓞 K))) := + ∀ w : {w : HeightOneSpectrum (𝓞 K) // w ∉ S}, + relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w.1 + +/-- The componentwise Galois action on the integral factors outside +`S`. -/ +@[reducible] +noncomputable def relativeOutsideSPlaceFactorsAction + (S : Finset (HeightOneSpectrum (𝓞 K))) : + MulDistribMulAction (L ≃ₐ[K] L) + (RelativeOutsideSPlaceFactors + (K := K) (L := L) S) := by + letI : ∀ w : + {w : HeightOneSpectrum (𝓞 K) // w ∉ S}, + MulDistribMulAction (L ≃ₐ[K] L) + (relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w.1) := + fun w => + relativeLocalTensorDecompositionIntegralUnitSubgroupAction + (K := K) (L := L) w.1 + exact + piMulDistribMulAction + (L ≃ₐ[K] L) + (fun w : + {w : HeightOneSpectrum (𝓞 K) // w ∉ S} => + relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w.1) + +/-- The componentwise Galois action on the product of unrestricted and +outside-integral local factors. -/ +@[reducible] +noncomputable def relativeUnrestrictedProdOutsideAction + (S : Finset (HeightOneSpectrum (𝓞 K))) : + MulDistribMulAction (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S × + RelativeOutsideSPlaceFactors + (K := K) (L := L) S) := by + letI := + relativeUnrestrictedSPlaceFactorsAction + (K := K) (L := L) S + letI := + relativeOutsideSPlaceFactorsAction + (K := K) (L := L) S + infer_instance + +/-- Reassociate all supported local factors as +`(unrestricted factors) × (outside integral factors)`. -/ +noncomputable def + relativeIdeleSPlaceFactorsEquivUnrestrictedProdOutside + (S : Finset (HeightOneSpectrum (𝓞 K))) : + RelativeIdeleSPlaceFactors (K := K) (L := L) S ≃* + RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S × + RelativeOutsideSPlaceFactors + (K := K) (L := L) S where + toFun z := + ⟨fun i => + match i with + | Sum.inl w => z.1 w + | Sum.inr w => z.2.1 w, + z.2.2⟩ + invFun z := + ⟨fun w => z.1 (Sum.inl w), + ⟨fun w => z.1 (Sum.inr w), z.2⟩⟩ + left_inv _ := rfl + right_inv z := by + apply Prod.ext + · funext i + cases i <;> rfl + · rfl + map_mul' x y := by + apply Prod.ext + · funext i + cases i <;> rfl + · rfl + +omit [NumberField L] [IsGalois K L] in +/-- The reassociation of supported local factors is Galois +equivariant. -/ +theorem + relativeIdeleSPlaceFactorsEquivUnrestrictedProdOutside_smul + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) + (z : RelativeIdeleSPlaceFactors + (K := K) (L := L) S) : + relativeIdeleSPlaceFactorsEquivUnrestrictedProdOutside + (K := K) (L := L) S + ((relativeIdeleSPlaceFactorsAction + (K := K) (L := L) S).smul σ z) = + (relativeUnrestrictedProdOutsideAction + (K := K) (L := L) S).smul σ + (relativeIdeleSPlaceFactorsEquivUnrestrictedProdOutside + (K := K) (L := L) S z) := by + apply Prod.ext + · funext i + cases i <;> rfl + · rfl + +/-- The complete supported relative-idele group, with its restricted-product +condition already built into the subtype, is the product of the unrestricted +local factors in `S` and the integral local factors outside `S`. -/ +noncomputable def + relativeIdeleSupportedEquivUnrestrictedProdOutside + (S : Finset (HeightOneSpectrum (𝓞 K))) : + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S ≃* + RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S × + RelativeOutsideSPlaceFactors + (K := K) (L := L) S := + (relativeIdeleSupportedEquivSPlaceFactors + (K := K) (L := L) S).trans + (relativeIdeleSPlaceFactorsEquivUnrestrictedProdOutside + (K := K) (L := L) S) + +omit [IsGalois K L] in +/-- The supported relative-idele decomposition is equivariant for the +concrete Galois action on every factor. -/ +theorem + relativeIdeleSupportedEquivUnrestrictedProdOutside_smul + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) + (z : relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) : + relativeIdeleSupportedEquivUnrestrictedProdOutside + (K := K) (L := L) S + ((relativeIdeleLocalTensorDecompositionSupportedSubgroupAction + (K := K) (L := L) S).smul σ z) = + (relativeUnrestrictedProdOutsideAction + (K := K) (L := L) S).smul σ + (relativeIdeleSupportedEquivUnrestrictedProdOutside + (K := K) (L := L) S z) := by + apply Prod.ext + · funext i + cases i with + | inl w => + let := + scalarTensorUnitsAction + (K := K) (L := L) (A := w.Completion) + exact + RelativeIdeleGroup.infiniteComponent_smul + (K := K) (L := L) w σ z + | inr w => + let := + scalarTensorUnitsAction + (K := K) (L := L) + (A := w.1.adicCompletion K) + exact + RelativeIdeleGroup.finiteComponent_smul + (K := K) (L := L) w.1 σ z + · funext w + apply Subtype.ext + let := + scalarTensorUnitsAction + (K := K) (L := L) + (A := w.1.adicCompletion K) + exact + RelativeIdeleGroup.finiteComponent_smul + (K := K) (L := L) w.1 σ z + +/-- Transport of degree-zero Tate cohomology from the actual +supported relative ideles to the unrestricted and outside-integral +factorization. -/ +noncomputable def + relativeIdeleSupportedHerbrandH0EquivUnrestrictedProdOutside + (S : Finset (HeightOneSpectrum (𝓞 K))) : + letI := + relativeIdeleLocalTensorDecompositionSupportedSubgroupAction + (K := K) (L := L) S + letI := + relativeUnrestrictedProdOutsideAction + (K := K) (L := L) S + HerbrandH0 (L ≃ₐ[K] L) + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) ≃* + HerbrandH0 (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S × + RelativeOutsideSPlaceFactors + (K := K) (L := L) S) := by + letI := + relativeIdeleLocalTensorDecompositionSupportedSubgroupAction + (K := K) (L := L) S + letI := + relativeUnrestrictedProdOutsideAction + (K := K) (L := L) S + exact + herbrandH0EquivariantMulEquiv + (relativeIdeleSupportedEquivUnrestrictedProdOutside + (K := K) (L := L) S) + (relativeIdeleSupportedEquivUnrestrictedProdOutside_smul + (K := K) (L := L) S) + +/-- Transport of degree-minus-one Tate cohomology from the +actual supported relative ideles to the unrestricted and outside-integral +factorization. -/ +noncomputable def + relativeIdeleSupportedHerbrandHMinusOneEquivUnrestrictedProdOutside + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) : + letI := + relativeIdeleLocalTensorDecompositionSupportedSubgroupAction + (K := K) (L := L) S + letI := + relativeUnrestrictedProdOutsideAction + (K := K) (L := L) S + HerbrandHMinusOne (L ≃ₐ[K] L) + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) σ ≃* + HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S × + RelativeOutsideSPlaceFactors + (K := K) (L := L) S) σ := by + letI := + relativeIdeleLocalTensorDecompositionSupportedSubgroupAction + (K := K) (L := L) S + letI := + relativeUnrestrictedProdOutsideAction + (K := K) (L := L) S + exact + herbrandHMinusOneEquivariantMulEquiv + (relativeIdeleSupportedEquivUnrestrictedProdOutside + (K := K) (L := L) S) + (relativeIdeleSupportedEquivUnrestrictedProdOutside_smul + (K := K) (L := L) S) σ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SupportedBridge.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SupportedBridge.lean new file mode 100644 index 0000000000..6f75f85e6d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SupportedBridge.lean @@ -0,0 +1,556 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.BaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Reassociation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleClassBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.ClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SufficientlyLarge +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.Module +/-! +# A sufficiently large unramified support for the idele-class calculation + +This file constructs the finite set used in the idele-class Herbrand calculation. It +contains the contractions of a sufficiently large set of places of `L` +and every finite place of `K` at which some place of `L` ramifies. + +It also compares the concrete tensor-coordinate supported subgroup of +relative ideles with the ordinary supported idele subgroup of `L`. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +open scoped Classical in +/-- The finite set of places of `L` lying above a finite set of places +of `K`. -/ +noncomputable def finitePlacesAbove + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Finset (HeightOneSpectrum (𝓞 L)) := + (Set.Finite.preimage_finitePlaceBelow + (K := K) (L := L) S.finite_toSet).toFinset + +omit [FiniteDimensional K L] [IsGalois K L] in +open scoped Classical in +@[simp] +theorem mem_finitePlacesAbove_iff + (S : Finset (HeightOneSpectrum (𝓞 K))) + (W : HeightOneSpectrum (𝓞 L)) : + W ∈ finitePlacesAbove (K := K) (L := L) S ↔ + finitePlaceBelow (K := K) W ∈ S := by + simp [finitePlacesAbove] + +omit [FiniteDimensional K L] [IsGalois K L] in +open scoped Classical in +/-- Galois conjugation does not change the place lying below a finite +place of the extension field. -/ +@[simp] +theorem finitePlaceBelow_finitePlaceEquiv + (σ : L ≃ₐ[K] L) + (W : HeightOneSpectrum (𝓞 L)) : + finitePlaceBelow (K := K) (finitePlaceEquiv K L σ W) = + finitePlaceBelow (K := K) W := by + apply HeightOneSpectrum.ext + rw [finitePlaceBelow_asIdeal, finitePlaceBelow_asIdeal, + finitePlaceEquiv_asIdeal] + ext x + rw [Ideal.mem_under, Ideal.mem_under] + have hfix : + NumberField.RingOfIntegers.mapAlgEquiv σ + (algebraMap (𝓞 K) (𝓞 L) x) = + algebraMap (𝓞 K) (𝓞 L) x := by + apply NumberField.RingOfIntegers.ext + exact σ.commutes (x : K) + conv_lhs => rw [← hfix] + exact + (Ideal.apply_mem_of_equiv_iff + (I := W.asIdeal) + (f := + (NumberField.RingOfIntegers.mapAlgEquiv σ).toRingEquiv) + (x := algebraMap (𝓞 K) (𝓞 L) x)) + +omit [FiniteDimensional K L] [IsGalois K L] in +open scoped Classical in +/-- The full set of extension places above a base support is stable +under the concrete Galois action. -/ +theorem finitePlacesAbove_isGaloisStable + (S : Finset (HeightOneSpectrum (𝓞 K))) : + IsGaloisStableFinitePlaces K L + (finitePlacesAbove (K := K) (L := L) S) := by + intro σ W + simp only [mem_finitePlacesAbove_iff] + change + finitePlaceBelow (K := K) W ∈ S ↔ + finitePlaceBelow (K := K) + (finitePlaceEquiv K L σ W) ∈ S + rw [finitePlaceBelow_finitePlaceEquiv] + +omit [IsGalois K L] in +open scoped Classical in +/-- Scalar extension carries the concrete supported +relative ideles exactly to the ordinary ideles supported at all places +above the same base support. -/ +theorem relativeIdeleBaseChange_mem_supportedAt_iff + (S : Finset (HeightOneSpectrum (𝓞 K))) + (z : RelativeIdeleGroup K L) : + z ∈ relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S ↔ + relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) z ∈ + IdeleGroup.supportedAt (K := L) + (finitePlacesAbove (K := K) (L := L) S : Set _) := by + rw [mem_relativeIdeleLocalTensorDecompositionSupportedSubgroup_iff, + IdeleGroup.mem_supportedAt_iff] + constructor + · intro hz W hW + have hbelow : + finitePlaceBelow (K := K) W ∉ S := by + intro hmem + exact hW ((mem_finitePlacesAbove_iff + (K := K) (L := L) S W).2 hmem) + have hlocal := + (relativeLocalTensorDecompositionIntegralUnitAt_iff_aboveAdic + (K := K) (L := L) + (finitePlaceBelow (K := K) W) + (RelativeIdeleGroup.finiteComponent + (K := K) (L := L) + (finitePlaceBelow (K := K) W) z)).1 + (hz (finitePlaceBelow (K := K) W) hbelow) ⟨W, rfl⟩ + rw [relativeIdeleBaseChangeMulEquiv_finite, + relativeFiniteIdeleToFiniteIdele_apply, + relativeFiniteTensorPiMulEquiv_apply] + exact hlocal + · intro hz w hw + apply + (relativeLocalTensorDecompositionIntegralUnitAt_iff_aboveAdic + (K := K) (L := L) w + (RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w z)).2 + intro W + rcases W with ⟨W, hWbelow⟩ + subst w + have hW : + W ∉ (finitePlacesAbove (K := K) (L := L) S : + Set (HeightOneSpectrum (𝓞 L))) := by + intro hmem + exact hw ((mem_finitePlacesAbove_iff + (K := K) (L := L) S W).1 hmem) + have hlocal := hz W hW + rw [relativeIdeleBaseChangeMulEquiv_finite, + relativeFiniteIdeleToFiniteIdele_apply, + relativeFiniteTensorPiMulEquiv_apply] at hlocal + exact hlocal + +omit [IsGalois K L] in +open scoped Classical in +/-- Subgroup-level form of +`relativeIdeleBaseChange_mem_supportedAt_iff`. -/ +theorem relativeIdeleLocalTensorDecompositionSupportedSubgroup_map_baseChange + (S : Finset (HeightOneSpectrum (𝓞 K))) : + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S).map + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L)).toMonoidHom = + IdeleGroup.supportedAt (K := L) + (finitePlacesAbove (K := K) (L := L) S : Set _) := by + ext y + constructor + · rintro ⟨z, hz, rfl⟩ + exact + (relativeIdeleBaseChange_mem_supportedAt_iff + (K := K) (L := L) S z).1 hz + · intro hy + refine ⟨(relativeIdeleBaseChangeMulEquiv + (K := K) (L := L)).symm y, ?_, ?_⟩ + · apply + (relativeIdeleBaseChange_mem_supportedAt_iff + (K := K) (L := L) S _).2 + simpa using hy + · exact + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L)).apply_symm_apply y + +omit [IsGalois K L] in +open scoped Classical in +/-- If the supported ordinary ideles and principal ideles generate +`I_L`, then their relative counterparts generate the full relative +idele group. -/ +theorem relativeIdeleSupported_sup_principal_eq_top + (S : Finset (HeightOneSpectrum (𝓞 K))) + (hOrdinary : + IdeleGroup.supportedAt (K := L) + (finitePlacesAbove (K := K) (L := L) S : Set _) ⊔ + IdeleGroup.principalSubgroup L = ⊤) : + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S ⊔ + RelativeIdeleGroup.principalSubgroup K L = + ⊤ := by + apply + Subgroup.map_injective + (f := + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L)).toMonoidHom) + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L)).injective + rw [Subgroup.map_sup, + relativeIdeleLocalTensorDecompositionSupportedSubgroup_map_baseChange, + relativeIdelePrincipalSubgroup_map_baseChange, + hOrdinary, + Subgroup.map_top_of_surjective + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L)).toMonoidHom + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L)).surjective] + +open scoped Classical in +/-- A diagonal idele is supported at `T` exactly when its defining +field unit is a `T`-unit. -/ +theorem principalIdele_mem_supportedAt_iff_sUnit + (T : Finset (HeightOneSpectrum (𝓞 L))) + (x : Lˣ) : + IdeleGroup.principalIdele L x ∈ + IdeleGroup.supportedAt (K := L) (T : Set _) ↔ + x ∈ SUnitGroup (K := L) T := by + rw [IdeleGroup.mem_supportedAt_iff, mem_SUnitGroup_iff] + constructor + · intro hx W hW + have hunit := hx W (by simpa using hW) + rw [ + HeightOneSpectrum.adicCompletionIntegers.mem_units_iff_valued_eq_one] + at hunit + change + Valued.v + (((IdeleGroup.finiteComponent W + (IdeleGroup.principalIdele L x) : + (W.adicCompletion L)ˣ) : + W.adicCompletion L)) = 1 at hunit + rw [IdeleGroup.finiteComponent_principalIdele, + HeightOneSpectrum.valuedAdicCompletion_eq_valuation'] at hunit + exact hunit + · intro hx W hW + rw [ + HeightOneSpectrum.adicCompletionIntegers.mem_units_iff_valued_eq_one] + change + Valued.v + (((IdeleGroup.finiteComponent W + (IdeleGroup.principalIdele L x) : + (W.adicCompletion L)ˣ) : + W.adicCompletion L)) = 1 + rw [IdeleGroup.finiteComponent_principalIdele, + HeightOneSpectrum.valuedAdicCompletion_eq_valuation'] + exact hx W (by simpa using hW) + +open scoped Classical in +/-- The diagonal map from extension-field `S`-units into the +intersection of the relative principal and supported subgroups. -/ +noncomputable def sUnitToRelativePrincipalSupportedIntersection + (S : Finset (HeightOneSpectrum (𝓞 K))) : + SUnitGroup (K := L) + (finitePlacesAbove (K := K) (L := L) S) →* + (RelativeIdeleGroup.principalSubgroup K L).subgroupOf + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) where + toFun x := by + have hOrdinary : + IdeleGroup.principalIdele L (x : Lˣ) ∈ + IdeleGroup.supportedAt (K := L) + (finitePlacesAbove (K := K) (L := L) S : Set _) := + (principalIdele_mem_supportedAt_iff_sUnit + (L := L) + (finitePlacesAbove (K := K) (L := L) S) + (x : Lˣ)).2 x.property + have hRelative : + RelativeIdeleGroup.principalIdele K L (x : Lˣ) ∈ + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S := by + apply + (relativeIdeleBaseChange_mem_supportedAt_iff + (K := K) (L := L) S _).2 + simpa using hOrdinary + exact + ⟨⟨RelativeIdeleGroup.principalIdele K L (x : Lˣ), + hRelative⟩, + ⟨(x : Lˣ), rfl⟩⟩ + map_one' := by + apply Subtype.ext + apply Subtype.ext + simp + map_mul' x y := by + apply Subtype.ext + apply Subtype.ext + simp + +open scoped Classical in +/-- The intersection of the relative principal ideles with the +relative `S`-idele subgroup is precisely the ordinary group of +`S`-units of `L`. -/ +noncomputable def sUnitEquivRelativePrincipalSupportedIntersection + (S : Finset (HeightOneSpectrum (𝓞 K))) : + SUnitGroup (K := L) + (finitePlacesAbove (K := K) (L := L) S) ≃* + (RelativeIdeleGroup.principalSubgroup K L).subgroupOf + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) := + MulEquiv.ofBijective + (sUnitToRelativePrincipalSupportedIntersection + (K := K) (L := L) S) + ⟨by + intro x y hxy + apply Subtype.ext + apply IdeleGroup.principalIdele_injective L + have hRelative := + congrArg + (fun z : + (RelativeIdeleGroup.principalSubgroup K L).subgroupOf + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) => + ((z : + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) : + RelativeIdeleGroup K L)) + hxy + change + RelativeIdeleGroup.principalIdele K L (x : Lˣ) = + RelativeIdeleGroup.principalIdele K L (y : Lˣ) + at hRelative + have hOrdinary := + congrArg + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L)) + hRelative + simpa using hOrdinary, + by + intro y + obtain ⟨x, hx⟩ := y.property + have hRelative : + RelativeIdeleGroup.principalIdele K L x ∈ + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S := by + rw [hx] + exact y.1.property + have hOrdinary := + (relativeIdeleBaseChange_mem_supportedAt_iff + (K := K) (L := L) S + (RelativeIdeleGroup.principalIdele K L x)).1 hRelative + have hxS : + x ∈ SUnitGroup (K := L) + (finitePlacesAbove (K := K) (L := L) S) := by + apply + (principalIdele_mem_supportedAt_iff_sUnit + (L := L) + (finitePlacesAbove (K := K) (L := L) S) x).1 + simpa using hOrdinary + refine ⟨⟨x, hxS⟩, ?_⟩ + apply Subtype.ext + apply Subtype.ext + exact hx⟩ + +open scoped Classical in +/-- The restricted Galois action on the intersection of the relative +principal and supported subgroups. -/ +@[reducible] +noncomputable def relativePrincipalSupportedIntersectionAction + (S : Finset (HeightOneSpectrum (𝓞 K))) : + MulDistribMulAction (L ≃ₐ[K] L) + ((RelativeIdeleGroup.principalSubgroup K L).subgroupOf + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S)) := by + letI := + relativeIdeleLocalTensorDecompositionSupportedSubgroupAction + (K := K) (L := L) S + exact + CyclicCohomology.stableSubgroupMulDistribMulAction + ((RelativeIdeleGroup.principalSubgroup K L).subgroupOf + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S)) + (by + intro σ z hz + change + (((σ • z : + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) : + RelativeIdeleGroup K L)) ∈ + RelativeIdeleGroup.principalSubgroup K L + rw [ + relativeIdeleLocalTensorDecompositionSupportedSubgroupAction_coe] + obtain ⟨x, hx⟩ := hz + refine + ⟨Units.map σ.toRingEquiv.toMonoidHom x, ?_⟩ + calc + RelativeIdeleGroup.principalIdele K L + (Units.map σ.toRingEquiv.toMonoidHom x) = + σ • RelativeIdeleGroup.principalIdele K L x := + (RelativeIdeleGroup.smul_principalIdele + K L σ x).symm + _ = σ • (z : RelativeIdeleGroup K L) := + congrArg (fun a : RelativeIdeleGroup K L => σ • a) hx) + +omit [IsGalois K L] in +open scoped Classical in +/-- The `S`-unit description of the principal-supported intersection +is equivariant for the genuine Galois actions. -/ +theorem + sUnitEquivRelativePrincipalSupportedIntersection_smul + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) + (x : + SUnitGroup (K := L) + (finitePlacesAbove (K := K) (L := L) S)) : + letI := + sUnitMulDistribMulAction K L + (finitePlacesAbove (K := K) (L := L) S) + (finitePlacesAbove_isGaloisStable + (K := K) (L := L) S) + letI := + relativePrincipalSupportedIntersectionAction + (K := K) (L := L) S + sUnitEquivRelativePrincipalSupportedIntersection + (K := K) (L := L) S (σ • x) = + σ • + sUnitEquivRelativePrincipalSupportedIntersection + (K := K) (L := L) S x := by + let := + sUnitMulDistribMulAction K L + (finitePlacesAbove (K := K) (L := L) S) + (finitePlacesAbove_isGaloisStable + (K := K) (L := L) S) + let := + relativePrincipalSupportedIntersectionAction + (K := K) (L := L) S + apply Subtype.ext + apply Subtype.ext + change + RelativeIdeleGroup.principalIdele K L + (((σ • x : + SUnitGroup (K := L) + (finitePlacesAbove (K := K) (L := L) S)) : + Lˣ)) = + σ • RelativeIdeleGroup.principalIdele K L (x : Lˣ) + rw [sUnit_smul_coe] + exact + (RelativeIdeleGroup.smul_principalIdele + K L σ (x : Lˣ)).symm + +open scoped Classical in +/-- The finite base places at which at least one extension prime is +ramified. -/ +noncomputable def ramifiedBaseFinitePlaces : + Finset (HeightOneSpectrum (𝓞 K)) := + (AlgebraicNumberTheory.Ramification.finite_ramified_base_heightOne_primes + (𝓞 K) (𝓞 L)).toFinset + +omit [FiniteDimensional K L] [IsGalois K L] in +open scoped Classical in +@[simp] +theorem mem_ramifiedBaseFinitePlaces_iff + (v : HeightOneSpectrum (𝓞 K)) : + v ∈ ramifiedBaseFinitePlaces (K := K) (L := L) ↔ + ∃ W : HeightOneSpectrum (𝓞 L), + W.asIdeal.LiesOver v.asIdeal ∧ + ¬ Algebra.IsUnramifiedAt (𝓞 K) W.asIdeal := by + simp [ramifiedBaseFinitePlaces] + +open scoped Classical in +/-- The idele-class Herbrand support: contractions of a sufficiently large support +for `I_L`, together with every ramified base finite place. -/ +noncomputable def ideleClassHerbrandSupport : + Finset (HeightOneSpectrum (𝓞 K)) := by + classical + exact + (IdeleGroup.sufficientlyLargeFiniteSet (K := L)).image + (finitePlaceBelow (K := K)) ∪ + ramifiedBaseFinitePlaces (K := K) (L := L) + +omit [FiniteDimensional K L] [IsGalois K L] in +open scoped Classical in +/-- Every place in the sufficiently large support of `L` lies above +the chosen base support. -/ +theorem sufficientlyLargeFiniteSet_subset_finitePlacesAbove_support : + (IdeleGroup.sufficientlyLargeFiniteSet (K := L) : + Set (HeightOneSpectrum (𝓞 L))) ⊆ + ((finitePlacesAbove + (K := K) (L := L) + (ideleClassHerbrandSupport (K := K) (L := L)) : + Finset (HeightOneSpectrum (𝓞 L))) : + Set (HeightOneSpectrum (𝓞 L))) := by + intro W hW + change W ∈ finitePlacesAbove + (K := K) (L := L) + (ideleClassHerbrandSupport (K := K) (L := L)) + rw [mem_finitePlacesAbove_iff] + apply Finset.mem_union_left + exact Finset.mem_image.mpr ⟨W, hW, rfl⟩ + +omit [FiniteDimensional K L] [IsGalois K L] in +open scoped Classical in +/-- The ordinary ideles supported above the chosen base support, +together with principal ideles, generate all of `I_L`. -/ +theorem supportedAboveHerbrandSupport_sup_principal_eq_top : + IdeleGroup.supportedAt (K := L) + (finitePlacesAbove + (K := K) (L := L) + (ideleClassHerbrandSupport (K := K) (L := L)) : Set _) ⊔ + IdeleGroup.principalSubgroup L = ⊤ := by + apply top_unique + rw [← IdeleGroup.supportedAt_sup_principalSubgroup_eq_top + (K := L)] + exact sup_le_sup + (IdeleGroup.supportedAt_mono + (sufficientlyLargeFiniteSet_subset_finitePlacesAbove_support + (K := K) (L := L))) + le_rfl + +omit [IsGalois K L] in +open scoped Classical in +/-- The relative ideles supported at the Herbrand support, together +with the relative principal ideles, generate the full relative idele +group. -/ +theorem relativeSupportedAboveHerbrandSupport_sup_principal_eq_top : + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) + (ideleClassHerbrandSupport (K := K) (L := L)) ⊔ + RelativeIdeleGroup.principalSubgroup K L = + ⊤ := + relativeIdeleSupported_sup_principal_eq_top + (K := K) (L := L) + (ideleClassHerbrandSupport (K := K) (L := L)) + (supportedAboveHerbrandSupport_sup_principal_eq_top + (K := K) (L := L)) + +omit [FiniteDimensional K L] [IsGalois K L] in +open scoped Classical in +/-- Outside the chosen base support, every finite place of `L` is +algebraically unramified over `K`. -/ +theorem isUnramifiedAt_of_notMem_ideleClassHerbrandSupport + (v : HeightOneSpectrum (𝓞 K)) + (hv : + v ∉ ideleClassHerbrandSupport (K := K) (L := L)) + (W : HeightOneSpectrum (𝓞 L)) + (hW : finitePlaceBelow (K := K) W = v) : + Algebra.IsUnramifiedAt (𝓞 K) W.asIdeal := by + classical + by_contra hram + apply hv + apply Finset.mem_union_right + rw [mem_ramifiedBaseFinitePlaces_iff] + refine ⟨W, ?_, hram⟩ + exact ⟨(congrArg HeightOneSpectrum.asIdeal hW).symm⟩ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension.lean new file mode 100644 index 0000000000..612ca2d19f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension.lean @@ -0,0 +1,27 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.BaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.ClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.EmbeddingNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdealClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleClassBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.InfiniteOnePlaceBaseNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormLocalOrder +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormProperties +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.OnePlaceBaseNorm + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/All.lean new file mode 100644 index 0000000000..850ea014c0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/All.lean @@ -0,0 +1,30 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.BaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.ClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.EmbeddingNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdealClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleClassBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.InfiniteOnePlaceBaseNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormLocalOrder +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormProperties +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.OnePlaceBaseNorm +/-! +# Ideles in finite extensions of number fields + +Public aggregate for base change, extension, and norm maps on ideles and +idele classes. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean new file mode 100644 index 0000000000..bb03c5e36d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean @@ -0,0 +1,485 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalCore +public import Mathlib.FieldTheory.Galois.NormalBasis +public import Mathlib.GroupTheory.GroupAction.Defs +public import Mathlib.LinearAlgebra.TensorProduct.Basis +public import Mathlib.RingTheory.Norm.Basic +public import Mathlib.RingTheory.TensorProduct.Maps +/-! +# Ideles in finite extensions: the tensor-product model + +This file uses the canonical presentation +`𝔸_L = 𝔸_K ⊗_K L`. This makes extension, Galois conjugation, and the +idele norm formal linear-algebra operations. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField + +noncomputable +section + + +variable + (K L : Type*) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +/-- The adele algebra of `L`, written in base-change form +`𝔸_K ⊗_K L`. -/ +abbrev RelativeAdeleRing := + NumberField.AdeleRing (𝓞 K) K ⊗[K] L + +/-- The idele group of the base-changed adele algebra. -/ +abbrev RelativeIdeleGroup := + (RelativeAdeleRing K L)ˣ + +namespace RelativeIdeleGroup + +instance baseAdeleRingNontrivial : + Nontrivial (NumberField.AdeleRing (𝓞 K) K) := + Function.Injective.nontrivial + (NumberField.AdeleRing.algebraMap_injective + (R := 𝓞 K) (K := K)) + +/-- The base-adele algebra map into its scalar extension. -/ +def adeleInclusion : + NumberField.AdeleRing (𝓞 K) K →+* + RelativeAdeleRing K L := + (Algebra.TensorProduct.includeLeft + (R := K) (S := K) + (A := NumberField.AdeleRing (𝓞 K) K) (B := L)).toRingHom + +/-- The extension field embedded in the scalar-extended adele algebra. -/ +def fieldInclusion : + L →+* RelativeAdeleRing K L := + (Algebra.TensorProduct.includeRight + (R := K) (A := NumberField.AdeleRing (𝓞 K) K) + (B := L)).toRingHom + +/-- The canonical inclusion `I_K → I_L` in the tensor-product model. -/ +def inclusion : + IdeleGroup K →* RelativeIdeleGroup K L := + (Units.map (adeleInclusion K L)).comp + (IdeleGroup.equivAdeleRingUnits (K := K)).toMonoidHom + +omit [NumberField L] in +theorem inclusion_injective : + Function.Injective (inclusion K L) := by + exact + (Units.map_injective + (Algebra.TensorProduct.includeLeft_injective + (R := K) (S := K) + (A := NumberField.AdeleRing (𝓞 K) K) (B := L) + (FaithfulSMul.algebraMap_injective K L))).comp + (IdeleGroup.equivAdeleRingUnits (K := K)).injective + +/-- The diagonal copy of `Lˣ` inside the relative idele group. -/ +def principalIdele : + Lˣ →* RelativeIdeleGroup K L := + Units.map (fieldInclusion K L) + +omit [NumberField L] [FiniteDimensional K L] in +@[simp] +theorem inclusion_principalIdele + (x : Kˣ) : + inclusion K L (IdeleGroup.principalIdele K x) = + principalIdele K L + (Units.map (algebraMap K L) x) := by + apply Units.ext + change + (Algebra.TensorProduct.includeLeft + (R := K) (S := K) + (A := NumberField.AdeleRing (𝓞 K) K) (B := L)) + (algebraMap K + (NumberField.AdeleRing (𝓞 K) K) (x : K)) = + (Algebra.TensorProduct.includeRight + (R := K) (A := NumberField.AdeleRing (𝓞 K) K) + (B := L)) + (algebraMap K L (x : K)) + simp + +/-- The norm of relative ideles, obtained as the determinant over +the base adele ring. -/ +def norm : + RelativeIdeleGroup K L →* IdeleGroup K := + (IdeleGroup.equivAdeleRingUnits (K := K)).symm.toMonoidHom.comp + (Units.map + (Algebra.norm + (NumberField.AdeleRing (𝓞 K) K))) + +omit [NumberField L] in +@[simp] +theorem norm_inclusion (a : IdeleGroup K) : + norm K L (inclusion K L a) = + a ^ Module.finrank K L := by + apply (IdeleGroup.equivAdeleRingUnits (K := K)).injective + simp only [norm, inclusion, MonoidHom.comp_apply] + apply Units.ext + change + Algebra.norm (NumberField.AdeleRing (𝓞 K) K) + (algebraMap + (NumberField.AdeleRing (𝓞 K) K) + (RelativeAdeleRing K L) + ((IdeleGroup.equivAdeleRingUnits (K := K) a : + (NumberField.AdeleRing (𝓞 K) K)ˣ) : + NumberField.AdeleRing (𝓞 K) K)) = + (((IdeleGroup.equivAdeleRingUnits (K := K) a) ^ + Module.finrank K L : + (NumberField.AdeleRing (𝓞 K) K)ˣ) : + NumberField.AdeleRing (𝓞 K) K) + rw [Algebra.norm_algebraMap, + Module.finrank_baseChange] + rfl + +omit [NumberField L] in +/-- Norm commutes with scalar extension from `K` to the base adele ring. -/ +theorem norm_fieldInclusion (x : L) : + Algebra.norm (NumberField.AdeleRing (𝓞 K) K) + (fieldInclusion K L x) = + algebraMap K (NumberField.AdeleRing (𝓞 K) K) + (Algebra.norm K x) := by + classical + let b := Module.Free.chooseBasis K L + let bA := b.baseChange + (NumberField.AdeleRing (𝓞 K) K) + rw [Algebra.norm_eq_matrix_det bA, + Algebra.norm_eq_matrix_det b, + (algebraMap K + (NumberField.AdeleRing (𝓞 K) K)).map_det] + congr 1 + ext i j + simp [bA, b, fieldInclusion, + Algebra.smul_def, + Algebra.leftMulMatrix_eq_repr_mul, + Algebra.TensorProduct.tmul_mul_tmul] + +omit [NumberField L] in +/-- The relative idele norm carries a principal idele to the +principal idele of the field norm. -/ +@[simp] +theorem norm_principalIdele (x : Lˣ) : + norm K L (principalIdele K L x) = + IdeleGroup.principalIdele K + (Units.map (Algebra.norm K) x) := by + apply (IdeleGroup.equivAdeleRingUnits (K := K)).injective + apply Units.ext + change + Algebra.norm (NumberField.AdeleRing (𝓞 K) K) + (fieldInclusion K L (x : L)) = + algebraMap K (NumberField.AdeleRing (𝓞 K) K) + (Algebra.norm K (x : L)) + exact norm_fieldInclusion K L (x : L) + +/-- Galois conjugation on the scalar-extended adele algebra. -/ +def conjugation + (σ : L ≃ₐ[K] L) : + RelativeAdeleRing K L ≃ₐ[NumberField.AdeleRing (𝓞 K) K] + RelativeAdeleRing K L := + Algebra.TensorProduct.congr AlgEquiv.refl σ + +omit [NumberField L] [FiniteDimensional K L] in +@[simp] +theorem conjugation_tmul + (σ : L ≃ₐ[K] L) + (a : NumberField.AdeleRing (𝓞 K) K) (x : L) : + conjugation K L σ (a ⊗ₜ[K] x) = + a ⊗ₜ[K] σ x := by + rfl + +/-- Galois conjugation on relative ideles. -/ +def conjugationIdele + (σ : L ≃ₐ[K] L) : + RelativeIdeleGroup K L ≃* + RelativeIdeleGroup K L := + Units.mapEquiv (conjugation K L σ).toMulEquiv + +omit [NumberField L] [FiniteDimensional K L] in +@[simp] +theorem conjugationIdele_coe + (σ : L ≃ₐ[K] L) (a : RelativeIdeleGroup K L) : + ((conjugationIdele K L σ a : + RelativeIdeleGroup K L) : RelativeAdeleRing K L) = + conjugation K L σ (a : RelativeAdeleRing K L) := + rfl + +omit [NumberField L] [FiniteDimensional K L] in +theorem conjugation_one + (a : RelativeAdeleRing K L) : + conjugation K L (1 : L ≃ₐ[K] L) a = a := by + change + Algebra.TensorProduct.congr + (AlgEquiv.refl : + NumberField.AdeleRing (𝓞 K) K ≃ₐ[NumberField.AdeleRing (𝓞 K) K] + NumberField.AdeleRing (𝓞 K) K) + (AlgEquiv.refl : L ≃ₐ[K] L) a = + a + rw [Algebra.TensorProduct.congr_refl] + rfl + +omit [NumberField L] [FiniteDimensional K L] in +theorem conjugation_mul + (σ τ : L ≃ₐ[K] L) + (a : RelativeAdeleRing K L) : + conjugation K L (σ * τ) a = + conjugation K L σ (conjugation K L τ a) := by + let e : + NumberField.AdeleRing (𝓞 K) K ≃ₐ[NumberField.AdeleRing (𝓞 K) K] + NumberField.AdeleRing (𝓞 K) K := + AlgEquiv.refl + have he : e.trans e = e := by + ext + rfl + have h := + Algebra.TensorProduct.congr_trans e e τ σ + rw [he] at h + change + Algebra.TensorProduct.congr e (τ.trans σ) a = + Algebra.TensorProduct.congr e σ + (Algebra.TensorProduct.congr e τ a) + exact congrArg + (fun f : + RelativeAdeleRing K L ≃ₐ[NumberField.AdeleRing (𝓞 K) K] + RelativeAdeleRing K L ↦ f a) h + +/-- The natural Galois action on relative ideles. -/ +instance relativeIdeleMulAction : + MulAction (L ≃ₐ[K] L) (RelativeIdeleGroup K L) where + smul σ a := conjugationIdele K L σ a + one_smul a := by + apply Units.ext + exact conjugation_one K L (a : RelativeAdeleRing K L) + mul_smul σ τ a := by + apply Units.ext + change conjugation K L (σ * τ) + (a : RelativeAdeleRing K L) = + conjugation K L σ + (conjugation K L τ (a : RelativeAdeleRing K L)) + exact conjugation_mul K L σ τ _ + +/-- The natural Galois action on relative ideles, viewed as an action by +group automorphisms. -/ +@[reducible] +noncomputable def relativeIdeleMulDistribMulAction : + MulDistribMulAction (L ≃ₐ[K] L) (RelativeIdeleGroup K L) where + __ := relativeIdeleMulAction K L + smul_one σ := map_one (conjugationIdele K L σ) + smul_mul σ a b := map_mul (conjugationIdele K L σ) a b + +omit [NumberField L] [FiniteDimensional K L] in +@[simp] +theorem smul_def + (σ : L ≃ₐ[K] L) (a : RelativeIdeleGroup K L) : + σ • a = conjugationIdele K L σ a := + rfl + +omit [NumberField L] [FiniteDimensional K L] in +theorem smul_inclusion + (σ : L ≃ₐ[K] L) (a : IdeleGroup K) : + σ • inclusion K L a = inclusion K L a := by + apply Units.ext + change conjugation K L σ + (algebraMap + (NumberField.AdeleRing (𝓞 K) K) + (RelativeAdeleRing K L) + ((IdeleGroup.equivAdeleRingUnits (K := K) a : + (NumberField.AdeleRing (𝓞 K) K)ˣ) : + NumberField.AdeleRing (𝓞 K) K)) = + algebraMap + (NumberField.AdeleRing (𝓞 K) K) + (RelativeAdeleRing K L) + ((IdeleGroup.equivAdeleRingUnits (K := K) a : + (NumberField.AdeleRing (𝓞 K) K)ˣ) : + NumberField.AdeleRing (𝓞 K) K) + exact (conjugation K L σ).commutes _ + +omit [NumberField L] [FiniteDimensional K L] in +theorem smul_principalIdele + (σ : L ≃ₐ[K] L) (x : Lˣ) : + σ • principalIdele K L x = + principalIdele K L (Units.map σ.toRingEquiv.toMonoidHom x) := by + apply Units.ext + change conjugation K L σ + (Algebra.TensorProduct.includeRight (x : L)) = + Algebra.TensorProduct.includeRight (σ (x : L)) + change conjugation K L σ (1 ⊗ₜ[K] (x : L)) = + 1 ⊗ₜ[K] σ (x : L) + rw [conjugation_tmul] + +/-- Reynolds averaging for the finite Galois action. -/ +def galoisAverage + (z : RelativeAdeleRing K L) : + RelativeAdeleRing K L := + ((Fintype.card (L ≃ₐ[K] L) : K)⁻¹) • + ∑ σ : L ≃ₐ[K] L, conjugation K L σ z + +omit [NumberField L] in +theorem galoisAverage_eq_of_fixed + (z : RelativeAdeleRing K L) + (hz : ∀ σ : L ≃ₐ[K] L, + conjugation K L σ z = z) : + galoisAverage K L z = z := by + rw [galoisAverage] + simp_rw [hz] + rw [Finset.sum_const, Finset.card_univ, + ← Nat.cast_smul_eq_nsmul K, ← mul_smul, + inv_mul_cancel₀ + (Nat.cast_ne_zero.mpr Fintype.card_ne_zero), + one_smul] + +omit [NumberField L] in +theorem galoisAverage_tmul + [IsGalois K L] + (a : NumberField.AdeleRing (𝓞 K) K) (x : L) : + galoisAverage K L (a ⊗ₜ[K] x) = + adeleInclusion K L + (a * algebraMap K + (NumberField.AdeleRing (𝓞 K) K) + ((Fintype.card (L ≃ₐ[K] L) : K)⁻¹ * + Algebra.trace K L x)) := by + rw [galoisAverage] + simp_rw [conjugation_tmul] + rw [← TensorProduct.tmul_sum, + ← trace_eq_sum_automorphisms x] + change + ((Fintype.card (L ≃ₐ[K] L) : K)⁻¹) • + (a ⊗ₜ[K] + algebraMap K L (Algebra.trace K L x)) = + (a * algebraMap K + (NumberField.AdeleRing (𝓞 K) K) + ((Fintype.card (L ≃ₐ[K] L) : K)⁻¹ * + Algebra.trace K L x)) ⊗ₜ[K] 1 + rw [TensorProduct.smul_tmul', + Algebra.algebraMap_eq_smul_one] + rw [← TensorProduct.smul_tmul] + congr 1 + simp [Algebra.smul_def, map_mul, mul_assoc, mul_comm] + +omit [NumberField L] in +theorem galoisAverage_mem_adeleInclusion_range + [IsGalois K L] + (z : RelativeAdeleRing K L) : + ∃ a : NumberField.AdeleRing (𝓞 K) K, + adeleInclusion K L a = galoisAverage K L z := by + induction z using TensorProduct.inductionOn with + | tmul a x => + refine ⟨a * algebraMap K + (NumberField.AdeleRing (𝓞 K) K) + ((Fintype.card (L ≃ₐ[K] L) : K)⁻¹ * + Algebra.trace K L x), ?_⟩ + exact (galoisAverage_tmul K L a x).symm + | add x y hx hy => + obtain ⟨a, ha⟩ := hx + obtain ⟨b, hb⟩ := hy + refine ⟨a + b, ?_⟩ + rw [map_add, ha, hb] + simp [galoisAverage, Finset.sum_add_distrib, + smul_add] + +omit [NumberField L] in +theorem exists_adele_eq_of_galois_fixed + [IsGalois K L] + (z : RelativeAdeleRing K L) + (hz : ∀ σ : L ≃ₐ[K] L, + conjugation K L σ z = z) : + ∃ a : NumberField.AdeleRing (𝓞 K) K, + adeleInclusion K L a = z := by + obtain ⟨a, ha⟩ := + galoisAverage_mem_adeleInclusion_range K L z + exact ⟨a, ha.trans (galoisAverage_eq_of_fixed K L z hz)⟩ + +/-- The subgroup of relative ideles fixed by every Galois automorphism. -/ +def galoisFixedSubgroup : + Subgroup (RelativeIdeleGroup K L) := by + letI := relativeIdeleMulDistribMulAction K L + exact FixedPoints.subgroup (L ≃ₐ[K] L) (RelativeIdeleGroup K L) + +omit [NumberField L] in +/-- In the canonical tensor-product presentation, +the fixed relative ideles are exactly the ideles of the base field. -/ +theorem inclusion_range_eq_galoisFixedSubgroup + [IsGalois K L] : + (inclusion K L).range = + galoisFixedSubgroup K L := by + ext u + constructor + · rintro ⟨a, rfl⟩ σ + exact smul_inclusion K L σ a + · intro hu + have hfixed : + ∀ σ : L ≃ₐ[K] L, + conjugation K L σ + (u : RelativeAdeleRing K L) = + (u : RelativeAdeleRing K L) := by + intro σ + exact congrArg Units.val (hu σ) + obtain ⟨a, ha⟩ := + exists_adele_eq_of_galois_fixed K L + (u : RelativeAdeleRing K L) hfixed + have hfixedInv : + ∀ σ : L ≃ₐ[K] L, + conjugation K L σ + ((u⁻¹ : RelativeIdeleGroup K L) : + RelativeAdeleRing K L) = + ((u⁻¹ : RelativeIdeleGroup K L) : + RelativeAdeleRing K L) := by + intro σ + have huσ : conjugationIdele K L σ u = u := by + simpa only [smul_def] using hu σ + exact congrArg Units.val (by + change conjugationIdele K L σ u⁻¹ = u⁻¹ + rw [map_inv, huσ]) + obtain ⟨b, hb⟩ := + exists_adele_eq_of_galois_fixed K L + ((u⁻¹ : RelativeIdeleGroup K L) : + RelativeAdeleRing K L) hfixedInv + unfold adeleInclusion at ha hb + change + (Algebra.TensorProduct.includeLeft + (R := K) (S := K) + (A := NumberField.AdeleRing (𝓞 K) K) (B := L)) a = + (u : RelativeAdeleRing K L) at ha + change + (Algebra.TensorProduct.includeLeft + (R := K) (S := K) + (A := NumberField.AdeleRing (𝓞 K) K) (B := L)) b = + ((u⁻¹ : RelativeIdeleGroup K L) : + RelativeAdeleRing K L) at hb + let q : (NumberField.AdeleRing (𝓞 K) K)ˣ := + { val := a + inv := b + val_inv := by + apply + (Algebra.TensorProduct.includeLeft_injective + (R := K) (S := K) + (A := NumberField.AdeleRing (𝓞 K) K) (B := L) + (FaithfulSMul.algebraMap_injective K L)) + rw [map_mul, ha, hb] + exact u.val_inv + inv_val := by + apply + (Algebra.TensorProduct.includeLeft_injective + (R := K) (S := K) + (A := NumberField.AdeleRing (𝓞 K) K) (B := L) + (FaithfulSMul.algebraMap_injective K L)) + rw [map_mul, hb, ha] + exact u.inv_val } + refine ⟨(IdeleGroup.equivAdeleRingUnits + (K := K)).symm q, ?_⟩ + apply Units.ext + change adeleInclusion K L (q : + NumberField.AdeleRing (𝓞 K) K) = + (u : RelativeAdeleRing K L) + exact ha + +end RelativeIdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/ClassGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/ClassGroup.lean new file mode 100644 index 0000000000..c406d98675 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/ClassGroup.lean @@ -0,0 +1,203 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormProperties +public import Mathlib.LinearAlgebra.Basis.VectorSpace +/-! +# Idele classes in finite extensions + +The tensor-product model makes the key intersection calculation + +`I_K ∩ Lˣ = Kˣ` + +an elementary linear-algebra statement. A linear retraction of +`K → 𝔸_K` shows that an equality `a ⊗ 1 = 1 ⊗ x` forces both factors to +come from the same scalar in `K`. We then descend the idele inclusion to +quotients and prove it injective. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField + +noncomputable +section + + +variable + (K L : Type*) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +namespace RelativeIdeleGroup + +omit [NumberField L] [FiniteDimensional K L] in +/-- If a base adele and an extension-field element define the same +element of `𝔸_K ⊗_K L`, then they arise from one scalar of `K`. -/ +theorem exists_scalar_of_adeleInclusion_eq_fieldInclusion + (a : NumberField.AdeleRing (𝓞 K) K) (x : L) + (h : adeleInclusion K L a = fieldInclusion K L x) : + ∃ k : K, + a = algebraMap K (NumberField.AdeleRing (𝓞 K) K) k ∧ + x = algebraMap K L k := by + let η := + Algebra.linearMap K + (NumberField.AdeleRing (𝓞 K) K) + have hη : LinearMap.ker η = ⊥ := + LinearMap.ker_eq_bot.mpr + (NumberField.AdeleRing.algebraMap_injective + (R := 𝓞 K) (K := K)) + let ε : + NumberField.AdeleRing (𝓞 K) K →ₗ[K] K := + η.leftInverse + have hε : + ε (1 : NumberField.AdeleRing (𝓞 K) K) = 1 := by + change ε (algebraMap K + (NumberField.AdeleRing (𝓞 K) K) 1) = 1 + exact LinearMap.leftInverse_apply_of_inj hη 1 + let q : + RelativeAdeleRing K L →ₗ[K] L := + (TensorProduct.lid K L).toLinearMap.comp + (TensorProduct.map ε LinearMap.id) + have hq := congrArg q h + have hx : x = algebraMap K L (ε a) := by + simpa [q, adeleInclusion, fieldInclusion, hε, + Algebra.smul_def] using hq.symm + refine ⟨ε a, ?_, hx⟩ + apply + (Algebra.TensorProduct.includeLeft_injective + (R := K) (S := K) + (A := NumberField.AdeleRing (𝓞 K) K) (B := L) + (FaithfulSMul.algebraMap_injective K L)) + change adeleInclusion K L a = + adeleInclusion K L + (algebraMap K + (NumberField.AdeleRing (𝓞 K) K) (ε a)) + rw [h, hx] + exact (Algebra.TensorProduct.tmul_one_eq_one_tmul + (A := NumberField.AdeleRing (𝓞 K) K) + (B := L) (ε a)).symm + +/-- The subgroup of principal relative ideles. -/ +def principalSubgroup : + Subgroup (RelativeIdeleGroup K L) := + (principalIdele K L).range + +/-- The relative idele class group in the canonical presentation +`𝔸_L = 𝔸_K ⊗_K L`. -/ +abbrev ClassGroup := + RelativeIdeleGroup K L ⧸ principalSubgroup K L + +omit [NumberField L] [FiniteDimensional K L] in +/-- The preimage of the principal relative ideles under `I_K → I_L` is +exactly the subgroup of principal ideles of `K`. -/ +theorem comap_principalSubgroup : + Subgroup.comap (inclusion K L) + (principalSubgroup K L) = + IdeleGroup.principalSubgroup K := by + ext a + constructor + · rintro ⟨x, hx⟩ + have htensor : + adeleInclusion K L + ((IdeleGroup.equivAdeleRingUnits (K := K) a : + (NumberField.AdeleRing (𝓞 K) K)ˣ) : + NumberField.AdeleRing (𝓞 K) K) = + fieldInclusion K L (x : L) := by + exact congrArg Units.val hx.symm + obtain ⟨k, hkA, hkL⟩ := + exists_scalar_of_adeleInclusion_eq_fieldInclusion + K L _ _ htensor + have hk : k ≠ 0 := by + intro hk0 + have : (x : L) = 0 := by + rw [hkL, hk0, map_zero] + exact x.ne_zero this + let y : Kˣ := Units.mk0 k hk + refine ⟨y, ?_⟩ + apply (IdeleGroup.equivAdeleRingUnits (K := K)).injective + apply Units.ext + change + algebraMap K + (NumberField.AdeleRing (𝓞 K) K) k = + ((IdeleGroup.equivAdeleRingUnits (K := K) a : + (NumberField.AdeleRing (𝓞 K) K)ˣ) : + NumberField.AdeleRing (𝓞 K) K) + exact hkA.symm + · rintro ⟨y, rfl⟩ + refine ⟨Units.map (algebraMap K L) y, ?_⟩ + exact (inclusion_principalIdele K L y).symm + +/-- Inclusion of ideles descends to inclusion of idele classes. -/ +def classInclusion : + IdeleClassGroup K →* ClassGroup K L := + QuotientGroup.map + (IdeleGroup.principalSubgroup K) + (principalSubgroup K L) + (inclusion K L) + (by + rw [← comap_principalSubgroup K L]) + +omit [NumberField L] [FiniteDimensional K L] in +theorem classInclusion_mk (a : IdeleGroup K) : + classInclusion K L + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) a) = + QuotientGroup.mk' (principalSubgroup K L) + (inclusion K L a) := + rfl + +/-- The determinant norm on relative ideles, descended to their +relative idele-class presentation. -/ +noncomputable def classNorm : + ClassGroup K L →* IdeleClassGroup K := + QuotientGroup.map + (principalSubgroup K L) + (IdeleGroup.principalSubgroup K) + (RelativeIdeleGroup.norm K L) + (by + rintro _ ⟨x, rfl⟩ + refine + ⟨Units.map (Algebra.norm K) x, ?_⟩ + exact + (RelativeIdeleGroup.norm_principalIdele + K L x).symm) + +omit [NumberField L] in +theorem classNorm_mk + (a : RelativeIdeleGroup K L) : + classNorm K L + (QuotientGroup.mk' (principalSubgroup K L) a) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (RelativeIdeleGroup.norm K L a) := + rfl + +/-- The norm quotient in the relative idele-class presentation. -/ +abbrev ClassNormQuotient := + IdeleClassGroup K ⧸ (classNorm K L).range + +omit [NumberField L] [FiniteDimensional K L] in +/-- The scalar-extension map `C_K → C_L` is injective. -/ +theorem classInclusion_injective : + Function.Injective (classInclusion K L) := by + rw [← MonoidHom.ker_eq_bot_iff] + unfold classInclusion + rw [QuotientGroup.ker_map, + comap_principalSubgroup K L] + ext z + constructor + · rintro ⟨a, ha, rfl⟩ + exact (QuotientGroup.eq_one_iff a).2 ha + · intro hz + have hz1 : z = 1 := Subgroup.mem_bot.mp hz + obtain ⟨a, rfl⟩ := + QuotientGroup.mk_surjective z + exact ⟨a, (QuotientGroup.eq_one_iff a).1 hz1, rfl⟩ + +end RelativeIdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/EmbeddingNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/EmbeddingNorm.lean new file mode 100644 index 0000000000..9e928f8bf4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/EmbeddingNorm.lean @@ -0,0 +1,587 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisNorm +public import Mathlib.FieldTheory.Normal.Basic +/-! +# Norms through an ambient Galois extension + +This file proves the embedded-subextension determinant-norm formula. +If `L/K` is embedded in a finite Galois extension `M/K`, extending the +determinant norm of an element of `A ⊗[K] L` to `A ⊗[K] M` gives the +product over all `K`-embeddings `L → M`. +-/ + +@[expose] public section + +open scoped BigOperators TensorProduct +open NumberField + +noncomputable +section + +namespace RelativeIdeleGroup + +universe u v w z + +section EmbeddingsIntoGaloisExtension + +variable + {K : Type u} {L : Type v} {M : Type w} + [Field K] [Field L] [Field M] + [Algebra K L] [Algebra K M] [Algebra L M] + [IsScalarTower K L M] + +/-- Extend a `K`-embedding `L → M` to the algebraic closure of `M`. -/ +def embeddingToAlgebraicClosure : + (L →ₐ[K] M) → + (L →ₐ[K] AlgebraicClosure M) := + fun f => + (IsScalarTower.toAlgHom K M + (AlgebraicClosure M)).comp f + +omit [Algebra L M] [IsScalarTower K L M] in +theorem embeddingToAlgebraicClosure_injective : + Function.Injective + (embeddingToAlgebraicClosure + (K := K) (L := L) (M := M)) := by + intro f g h + ext x + exact + (algebraMap M (AlgebraicClosure M)).injective + (DFunLike.congr_fun h x) + +theorem embeddingToAlgebraicClosure_surjective + [Normal K M] : + Function.Surjective + (embeddingToAlgebraicClosure + (K := K) (L := L) (M := M)) := by + intro f + let C := AlgebraicClosure M + let e : C →ₐ[K] C := f.liftNormal C + let r : M →ₐ[K] M := e.restrictNormal M + let j : L →ₐ[K] M := + IsScalarTower.toAlgHom K L M + refine ⟨r.comp j, ?_⟩ + ext x + change algebraMap M C + (r (algebraMap L M x)) = f x + rw [AlgHom.restrictNormal_commutes] + change e (algebraMap L C x) = f x + exact f.liftNormal_commutes C x + +/-- Embeddings of a subextension into a finite normal overfield are the +same as embeddings into an algebraic closure. -/ +noncomputable def embeddingToAlgebraicClosureEquiv + [FiniteDimensional K M] [Normal K M] : + (L →ₐ[K] M) ≃ + (L →ₐ[K] AlgebraicClosure M) := + Equiv.ofBijective embeddingToAlgebraicClosure + ⟨embeddingToAlgebraicClosure_injective, + embeddingToAlgebraicClosure_surjective⟩ + +/-- The subgroup of `Gal(M/K)` fixing the embedded copy of `L`. -/ +def fixingSubextension : + Subgroup (M ≃ₐ[K] M) := + (IsScalarTower.toAlgHom K L M).fieldRange.fixingSubgroup + +/-- Restriction of an automorphism of `M/K` to the embedded copy of `L`. -/ +def restrictToSubextension + (σ : M ≃ₐ[K] M) : L →ₐ[K] M := + σ.toAlgHom.comp + (IsScalarTower.toAlgHom K L M) + +/-- Extend an embedding `L →ₐ[K] M` to an automorphism of the normal +extension `M/K`. -/ +noncomputable def liftSubextensionEmbedding + [Normal K M] (f : L →ₐ[K] M) : + M ≃ₐ[K] M := + AlgEquiv.ofBijective (f.liftNormal M) + (AlgHom.normal_bijective K M M _) + +theorem restrict_liftSubextensionEmbedding + [Normal K M] (f : L →ₐ[K] M) : + restrictToSubextension + (liftSubextensionEmbedding f) = f := by + ext x + exact f.liftNormal_commutes M x + +/-- The canonical map from right cosets of the fixing subgroup to +embeddings of the subextension. -/ +noncomputable def cosetToEmbedding + : + (M ≃ₐ[K] M) ⧸ + fixingSubextension (K := K) (L := L) (M := M) → + (L →ₐ[K] M) := + fun q ↦ + Quotient.liftOn' q restrictToSubextension (by + intro σ τ hστ + rw [QuotientGroup.leftRel_apply] at hστ + ext x + have hfix := + (IntermediateField.mem_fixingSubgroup_iff + (IsScalarTower.toAlgHom K L M).fieldRange + (σ⁻¹ * τ)).1 hστ + (algebraMap L M x) + (by exact ⟨x, rfl⟩) + change σ (algebraMap L M x) = + τ (algebraMap L M x) + have ht : τ = σ * (σ⁻¹ * τ) := by + group + rw [ht, AlgEquiv.mul_apply, hfix]) + +/-- Right cosets `Gal(M/K)/Gal(M/L)` are canonically the `K`-embeddings +`L → M`. This is the index set in the coset form of the Galois product norm formula. -/ +noncomputable def cosetEquivEmbedding + [Normal K M] : + (M ≃ₐ[K] M) ⧸ + fixingSubextension (K := K) (L := L) (M := M) ≃ + (L →ₐ[K] M) where + toFun := cosetToEmbedding + invFun f := + (liftSubextensionEmbedding f : + (M ≃ₐ[K] M) ⧸ + fixingSubextension + (K := K) (L := L) (M := M)) + right_inv f := + restrict_liftSubextensionEmbedding f + left_inv q := by + refine Quotient.inductionOn' q ?_ + intro σ + apply QuotientGroup.eq.mpr + change + (liftSubextensionEmbedding + (restrictToSubextension σ))⁻¹ * σ ∈ + (IsScalarTower.toAlgHom K L M).fieldRange.fixingSubgroup + rw [IntermediateField.mem_fixingSubgroup_iff + (IsScalarTower.toAlgHom K L M).fieldRange] + intro y hy + rcases hy with ⟨x, rfl⟩ + change + ((liftSubextensionEmbedding + (restrictToSubextension σ))⁻¹ * σ) + (algebraMap L M x) = + algebraMap L M x + rw [AlgEquiv.mul_apply] + have hres := + DFunLike.congr_fun + (restrict_liftSubextensionEmbedding + (restrictToSubextension σ)) x + change + liftSubextensionEmbedding + (restrictToSubextension σ) + (algebraMap L M x) = + σ (algebraMap L M x) at hres + rw [← hres] + exact + (liftSubextensionEmbedding + (restrictToSubextension σ)).symm_apply_apply + (algebraMap L M x) + +/-- The field norm of a subextension, computed in an ambient finite +Galois extension, is the product over all embeddings into that extension. -/ +theorem norm_eq_prod_embeddings_in_galoisExtension + [FiniteDimensional K L] [FiniteDimensional K M] + [IsGalois K M] (x : L) : + algebraMap K M (Algebra.norm K x) = + ∏ f : L →ₐ[K] M, f x := by + let : Algebra.IsSeparable K L := + Algebra.isSeparable_tower_bot_of_isSeparable K L M + apply + (algebraMap M + (AlgebraicClosure M)).injective + rw [map_prod] + calc + algebraMap M (AlgebraicClosure M) + (algebraMap K M (Algebra.norm K x)) = + algebraMap K (AlgebraicClosure M) + (Algebra.norm K x) := by + rw [IsScalarTower.algebraMap_apply + K M (AlgebraicClosure M)] + _ = ∏ f : L →ₐ[K] AlgebraicClosure M, f x := + Algebra.norm_eq_prod_embeddings K + (AlgebraicClosure M) x + _ = ∏ f : L →ₐ[K] M, + algebraMap M (AlgebraicClosure M) (f x) := by + exact ((embeddingToAlgebraicClosureEquiv + (K := K) (L := L) (M := M)).prod_comp + (fun f ↦ f x)).symm + +end EmbeddingsIntoGaloisExtension + +section UniversalPolynomial + +variable + {K : Type u} {L : Type v} {M : Type w} + [Field K] [Field L] [Field M] + [Algebra K L] [Algebra K M] [Algebra L M] + [IsScalarTower K L M] + [FiniteDimensional K L] [FiniteDimensional K M] + [IsGalois K M] + +/-- The quotient by automorphisms fixing the intermediate field has a finite enumeration. -/ +local instance : + Fintype + ((M ≃ₐ[K] M) ⧸ + fixingSubextension + (K := K) (L := L) (M := M)) := + Fintype.ofFinite _ + +/-- The linear polynomial representing a chosen `K`-embedding `L → M`. -/ +def embeddingPolynomial + {ι : Type z} [Fintype ι] + (b : Module.Basis ι K L) (f : L →ₐ[K] M) : + MvPolynomial ι M := + ∑ i, MvPolynomial.X i * + MvPolynomial.C (f (b i)) + +omit [Algebra L M] [IsScalarTower K L M] + [FiniteDimensional K L] [FiniteDimensional K M] + [IsGalois K M] in +@[simp] +theorem eval_embeddingPolynomial + {ι : Type z} [Fintype ι] + (b : Module.Basis ι K L) (f : L →ₐ[K] M) + (x : L) : + MvPolynomial.eval + (fun i ↦ algebraMap K M (b.repr x i)) + (embeddingPolynomial b f) = + f x := by + classical + let : DecidableEq ι := Classical.decEq ι + rw [embeddingPolynomial, map_sum] + simp only [map_mul, MvPolynomial.eval_X, + MvPolynomial.eval_C] + calc + ∑ i, algebraMap K M (b.repr x i) * + f (b i) = + ∑ i, f ((b.repr x i) • b i) := by + apply Finset.sum_congr rfl + intro i hi + simp [Algebra.smul_def] + _ = f (∑ i, (b.repr x i) • b i) := by + rw [map_sum] + _ = f x := by rw [b.sum_repr] + +/-- The universal product over all embeddings `L →ₐ[K] M`. -/ +def embeddingProductPolynomial + {ι : Type z} [Fintype ι] [DecidableEq ι] + (b : Module.Basis ι K L) : + MvPolynomial ι M := + ∏ f : L →ₐ[K] M, embeddingPolynomial b f + +omit [Algebra L M] [IsScalarTower K L M] + [FiniteDimensional K M] [IsGalois K M] in +@[simp] +theorem eval_embeddingProductPolynomial + {ι : Type z} [Fintype ι] [DecidableEq ι] + (b : Module.Basis ι K L) (x : L) : + MvPolynomial.eval + (fun i ↦ algebraMap K M (b.repr x i)) + (embeddingProductPolynomial + (M := M) b) = + ∏ f : L →ₐ[K] M, f x := by + simp [embeddingProductPolynomial] + +/-- The determinant-norm polynomial becomes the product of all embeddings +after extending coefficients to the ambient Galois field. -/ +theorem map_normPolynomial_eq_embeddingProductPolynomial + [Infinite K] + {ι : Type z} [Fintype ι] [DecidableEq ι] + (b : Module.Basis ι K L) : + MvPolynomial.map (algebraMap K M) + (normPolynomial b) = + embeddingProductPolynomial (M := M) b := by + apply MvPolynomial.funext_set + (fun _ : ι ↦ Set.range (algebraMap K M)) + · intro i + exact Set.infinite_range_of_injective + (algebraMap K M).injective + · intro c hc + choose d hd using fun i ↦ + hc i (Set.mem_univ i) + let x : L := + b.repr.symm (Finsupp.equivFunOnFinite.symm d) + have hcoords : + c = fun i ↦ + algebraMap K M (b.repr x i) := by + funext i + calc + c i = algebraMap K M (d i) := + (hd i).symm + _ = algebraMap K M (b.repr x i) := by + simp [x] + rw [hcoords, eval_embeddingProductPolynomial] + rw [MvPolynomial.eval_map] + change MvPolynomial.eval₂ (algebraMap K M) + ((algebraMap K M) ∘ + fun i ↦ b.repr x i) + (normPolynomial b) = + _ + rw [← MvPolynomial.eval₂_comp] + rw [eval_normPolynomial] + exact + norm_eq_prod_embeddings_in_galoisExtension x + +/-- Scalar extension of an embedding `L → M` on tensor algebras. -/ +def scalarEmbedding + (A : Type*) [CommRing A] [Algebra K A] + (f : L →ₐ[K] M) : + A ⊗[K] L →ₐ[A] A ⊗[K] M := + Algebra.TensorProduct.map + (AlgHom.id A A) f + +omit [Algebra L M] [IsScalarTower K L M] + [FiniteDimensional K L] [FiniteDimensional K M] + [IsGalois K M] in +@[simp] +theorem scalarEmbedding_tmul + (A : Type*) [CommRing A] [Algebra K A] + (f : L →ₐ[K] M) (a : A) (x : L) : + scalarEmbedding A f (a ⊗ₜ[K] x) = + a ⊗ₜ[K] f x := + rfl + +omit [Algebra L M] [IsScalarTower K L M] + [FiniteDimensional K L] [FiniteDimensional K M] + [IsGalois K M] in +/-- Evaluation of an embedding polynomial after arbitrary scalar extension +is the corresponding tensor-algebra embedding. -/ +theorem eval₂_embeddingPolynomial_baseChange + (A : Type*) [CommRing A] [Algebra K A] + {ι : Type z} [Fintype ι] + (b : Module.Basis ι K L) (f : L →ₐ[K] M) + (x : A ⊗[K] L) : + MvPolynomial.eval₂ + ((Algebra.TensorProduct.includeRight + (R := K) (A := A) (B := M)).toRingHom) + (fun i ↦ + (Algebra.TensorProduct.includeLeft + (R := K) (S := K) (A := A) (B := M)) + ((Algebra.TensorProduct.basis A b).repr x i)) + (embeddingPolynomial b f) = + scalarEmbedding A f x := by + classical + let : DecidableEq ι := Classical.decEq ι + simp only [embeddingPolynomial, + MvPolynomial.eval₂_sum, + MvPolynomial.eval₂_mul, + MvPolynomial.eval₂_X, + MvPolynomial.eval₂_C] + calc + ∑ i, + (Algebra.TensorProduct.includeLeft + (R := K) (S := K) (A := A) (B := M)) + ((Algebra.TensorProduct.basis A b).repr x i) * + (Algebra.TensorProduct.includeRight + (R := K) (A := A) (B := M)) + (f (b i)) = + ∑ i, scalarEmbedding A f + (((Algebra.TensorProduct.basis A b).repr x i) • + Algebra.TensorProduct.basis A b i) := by + apply Finset.sum_congr rfl + intro i hi + simp [Algebra.TensorProduct.basis_apply, + Algebra.TensorProduct.tmul_mul_tmul, + Algebra.smul_def] + _ = scalarEmbedding A f + (∑ i, + ((Algebra.TensorProduct.basis A b).repr x i) • + Algebra.TensorProduct.basis A b i) := by + rw [map_sum] + _ = scalarEmbedding A f x := by + rw [(Algebra.TensorProduct.basis A b).sum_repr] + +/-- Full scalar-extension norm formula for a subextension of a +finite Galois extension. -/ +theorem includeLeft_norm_eq_prod_scalarEmbeddings + [Infinite K] + (A : Type*) [CommRing A] [Algebra K A] + [Nontrivial A] (x : A ⊗[K] L) : + (Algebra.TensorProduct.includeLeft + (R := K) (S := K) (A := A) (B := M)) + (Algebra.norm A x) = + ∏ f : L →ₐ[K] M, + scalarEmbedding A f x := by + classical + let b := Module.Free.chooseBasis K L + let c : Module.Free.ChooseBasisIndex K L → A := + fun i ↦ + (Algebra.TensorProduct.basis A b).repr x i + let iL : A →+* A ⊗[K] M := + (Algebra.TensorProduct.includeLeft + (R := K) (S := K) (A := A) (B := M)).toRingHom + let iR : M →+* A ⊗[K] M := + (Algebra.TensorProduct.includeRight + (R := K) (A := A) (B := M)).toRingHom + have hmaps : + iL.comp (algebraMap K A) = + iR.comp (algebraMap K M) := by + ext t + simp [iL, iR] + have hleft : + MvPolynomial.eval₂ iR + (fun i ↦ iL (c i)) + (MvPolynomial.map (algebraMap K M) + (normPolynomial b)) = + iL (Algebra.norm A x) := by + rw [MvPolynomial.eval₂_map] + rw [← hmaps] + rw [← MvPolynomial.hom_eval₂] + rw [eval₂_normPolynomial_baseChange] + have hright : + MvPolynomial.eval₂ iR + (fun i ↦ iL (c i)) + (embeddingProductPolynomial + (M := M) b) = + ∏ f : L →ₐ[K] M, + scalarEmbedding A f x := by + rw [embeddingProductPolynomial, + MvPolynomial.eval₂_prod] + apply Finset.prod_congr rfl + intro f hf + exact + eval₂_embeddingPolynomial_baseChange + A b f x + change iL (Algebra.norm A x) = + ∏ f : L →ₐ[K] M, + scalarEmbedding A f x + rw [← hright, ← hleft, + map_normPolynomial_eq_embeddingProductPolynomial b] + +/-- Coset form of the scalar-extension formula. The product is indexed +by `Gal(M/K) / Gal(M/L)`. -/ +theorem includeLeft_norm_eq_prod_galoisCosets + [Infinite K] + (A : Type*) [CommRing A] [Algebra K A] + [Nontrivial A] (x : A ⊗[K] L) : + (Algebra.TensorProduct.includeLeft + (R := K) (S := K) (A := A) (B := M)) + (Algebra.norm A x) = + ∏ q : + (M ≃ₐ[K] M) ⧸ + fixingSubextension + (K := K) (L := L) (M := M), + scalarEmbedding A + (cosetEquivEmbedding q) x := by + calc + (Algebra.TensorProduct.includeLeft + (R := K) (S := K) (A := A) (B := M)) + (Algebra.norm A x) = + ∏ f : L →ₐ[K] M, + scalarEmbedding A f x := + includeLeft_norm_eq_prod_scalarEmbeddings + (K := K) (L := L) (M := M) A x + _ = ∏ q : + (M ≃ₐ[K] M) ⧸ + fixingSubextension + (K := K) (L := L) (M := M), + scalarEmbedding A + (cosetEquivEmbedding q) x := by + exact + ((cosetEquivEmbedding + (K := K) (L := L) (M := M)).prod_comp + (fun f ↦ scalarEmbedding A f x)).symm + +end UniversalPolynomial + +section RelativeAdeles + +variable + {K : Type u} {L : Type v} {M : Type w} + [Field K] [Field L] [Field M] + [NumberField K] + [Algebra K L] [Algebra K M] [Algebra L M] + [IsScalarTower K L M] + [FiniteDimensional K L] [FiniteDimensional K M] + [IsGalois K M] + +/-- The cosets used to index relative idele embeddings have a finite enumeration. -/ +local instance : + Fintype + ((M ≃ₐ[K] M) ⧸ + fixingSubextension + (K := K) (L := L) (M := M)) := + Fintype.ofFinite _ + +/-- A field embedding inside an ambient Galois extension, extended to +relative adèles. -/ +def adeleEmbedding (f : L →ₐ[K] M) : + RelativeAdeleRing K L →ₐ[ + NumberField.AdeleRing (𝓞 K) K] + RelativeAdeleRing K M := + scalarEmbedding + (NumberField.AdeleRing (𝓞 K) K) f + +/-- The induced homomorphism on relative idèles. -/ +def ideleEmbedding (f : L →ₐ[K] M) : + RelativeIdeleGroup K L →* + RelativeIdeleGroup K M := + Units.map (adeleEmbedding f).toMonoidHom + +/-- The embedded-subextension adèle form of the Galois product norm formula. -/ +theorem adeleInclusion_norm_eq_prod_embeddings + (x : RelativeAdeleRing K L) : + adeleInclusion K M + (Algebra.norm + (NumberField.AdeleRing (𝓞 K) K) x) = + ∏ f : L →ₐ[K] M, + adeleEmbedding f x := by + exact + includeLeft_norm_eq_prod_scalarEmbeddings + (K := K) (L := L) (M := M) + (NumberField.AdeleRing (𝓞 K) K) x + +/-- The embedded-subextension idèle form of the Galois product norm formula. -/ +theorem inclusion_norm_eq_prod_embeddings + (a : RelativeIdeleGroup K L) : + inclusion K M (norm K L a) = + ∏ f : L →ₐ[K] M, + ideleEmbedding f a := by + apply Units.ext + simp only [inclusion, norm, MonoidHom.comp_apply, + Units.coe_map, Units.coe_prod, ideleEmbedding, + adeleEmbedding] + exact + adeleInclusion_norm_eq_prod_embeddings + (K := K) (L := L) (M := M) + (a : RelativeAdeleRing K L) + +/-- The literal coset form for arbitrary relative idèles: + +`i_{M/K}(N_{L/K}(a)) = ∏_{σ ∈ Gal(M/K)/Gal(M/L)} σ(a)`. +-/ +theorem inclusion_norm_eq_prod_galoisCosets + (a : RelativeIdeleGroup K L) : + inclusion K M (norm K L a) = + ∏ q : + (M ≃ₐ[K] M) ⧸ + fixingSubextension + (K := K) (L := L) (M := M), + ideleEmbedding + (cosetEquivEmbedding q) a := by + calc + inclusion K M (norm K L a) = + ∏ f : L →ₐ[K] M, + ideleEmbedding f a := + inclusion_norm_eq_prod_embeddings + (K := K) (L := L) (M := M) a + _ = ∏ q : + (M ≃ₐ[K] M) ⧸ + fixingSubextension + (K := K) (L := L) (M := M), + ideleEmbedding + (cosetEquivEmbedding q) a := by + exact + ((cosetEquivEmbedding + (K := K) (L := L) (M := M)).prod_comp + (fun f ↦ ideleEmbedding f a)).symm + +end RelativeAdeles + +end RelativeIdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisDescent.lean new file mode 100644 index 0000000000..1bdc40df91 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisDescent.lean @@ -0,0 +1,258 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.ClassGroup +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.GaloisCohomology +public import Mathlib.Algebra.Group.Action.Basic +public import Mathlib.GroupTheory.GroupAction.Quotient +/-! +# Galois descent for idele classes + +For a finite Galois extension `L/K`, the Galois action on relative ideles +preserves principal ideles and hence descends to the relative idele class +group. Noether's form of Hilbert 90 then shows that every fixed +class has a fixed representative. Together with fixed-idele descent, this identifies +the fixed subgroup with the embedded copy of `C_K`. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + + +variable + (K L : Type*) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +namespace RelativeIdeleGroup + +omit [NumberField L] [FiniteDimensional K L] in +/-- The diagonal copy of `Lˣ` in the relative ideles is injective. -/ +theorem principalIdele_injective : + Function.Injective (principalIdele K L) := by + exact Units.map_injective + (Algebra.TensorProduct.includeRight_injective + (B := L) + (NumberField.AdeleRing.algebraMap_injective + (R := 𝓞 K) (K := K))) + +omit [NumberField L] [FiniteDimensional K L] in +/-- Galois conjugation preserves the principal-relative-idele +congruence, so it acts on the quotient class group. -/ +instance principalQuotientAction : + MulAction.QuotientAction (L ≃ₐ[K] L) + (principalSubgroup K L) where + inv_mul_mem σ {a a'} h := by + rcases h with ⟨x, hx⟩ + refine + ⟨Units.map σ.toRingEquiv.toMonoidHom x, ?_⟩ + rw [← smul_principalIdele K L σ x, hx] + simp [smul_def] + +omit [NumberField L] [FiniteDimensional K L] in +@[simp] +theorem smul_class_mk + (σ : L ≃ₐ[K] L) (a : RelativeIdeleGroup K L) : + σ • + (QuotientGroup.mk' + (principalSubgroup K L) a) = + QuotientGroup.mk' + (principalSubgroup K L) (σ • a) := + rfl + +/-- The quotient Galois action on relative idele classes, viewed as an +action by group automorphisms. -/ +@[reducible] +noncomputable def relativeIdeleClassMulDistribMulAction : + MulDistribMulAction (L ≃ₐ[K] L) (ClassGroup K L) := by + letI := relativeIdeleMulDistribMulAction K L + exact Function.Surjective.mulDistribMulAction + (QuotientGroup.mk' (principalSubgroup K L)) + (QuotientGroup.mk'_surjective (principalSubgroup K L)) + (fun _ _ ↦ rfl) + +/-- The subgroup of relative idele classes fixed by every Galois +automorphism. -/ +def galoisFixedClassSubgroup : + Subgroup (ClassGroup K L) := by + letI := relativeIdeleClassMulDistribMulAction K L + exact FixedPoints.subgroup (L ≃ₐ[K] L) (ClassGroup K L) + +omit [NumberField L] [FiniteDimensional K L] in +/-- Every class coming from `C_K` is Galois fixed. -/ +theorem classInclusion_range_le_galoisFixed : + (classInclusion K L).range ≤ + galoisFixedClassSubgroup K L := by + rintro _ ⟨c, rfl⟩ + obtain ⟨a, rfl⟩ := + QuotientGroup.mk_surjective c + intro σ + change + σ • + QuotientGroup.mk' + (principalSubgroup K L) + (inclusion K L a) = + QuotientGroup.mk' + (principalSubgroup K L) + (inclusion K L a) + rw [smul_class_mk, smul_inclusion] + +omit [NumberField L] in +/-- A Galois-fixed relative idele class has a Galois-fixed idele +representative. This is the Noether–Hilbert-90 step in idele-class descent. -/ +theorem exists_fixed_representative_of_fixed_class + (a : RelativeIdeleGroup K L) + (ha : + ∀ σ : L ≃ₐ[K] L, + σ • + QuotientGroup.mk' + (principalSubgroup K L) a = + QuotientGroup.mk' + (principalSubgroup K L) a) : + ∃ a' : RelativeIdeleGroup K L, + QuotientGroup.mk' + (principalSubgroup K L) a' = + QuotientGroup.mk' + (principalSubgroup K L) a ∧ + ∀ σ : L ≃ₐ[K] L, σ • a' = a' := by + classical + let := relativeIdeleMulDistribMulAction K L + have hex : + ∀ σ : L ≃ₐ[K] L, + ∃ x : Lˣ, + principalIdele K L x = + (σ • a) / a := by + intro σ + have hmem : + (σ • a) / a ∈ principalSubgroup K L := by + exact (QuotientGroup.eq_iff_div_mem).1 (ha σ) + exact hmem + let f : (L ≃ₐ[K] L) → Lˣ := + fun σ ↦ Classical.choose (hex σ) + have hf_spec : + ∀ σ : L ≃ₐ[K] L, + principalIdele K L (f σ) = + (σ • a) / a := + fun σ ↦ Classical.choose_spec (hex σ) + have hf_cocycle : + groupCohomology.IsMulCocycle₁ f := by + intro σ τ + apply principalIdele_injective K L + have hsmul : + principalIdele K L (σ • f τ) = + σ • principalIdele K L (f τ) := by + calc + principalIdele K L (σ • f τ) = + principalIdele K L + (Units.map + σ.toRingEquiv.toMonoidHom (f τ)) := by + congr 1 + _ = σ • principalIdele K L (f τ) := + (smul_principalIdele K L σ (f τ)).symm + rw [map_mul, hsmul, + hf_spec (σ * τ), hf_spec τ, hf_spec σ, + smul_div', ← mul_smul] + exact (div_mul_div_cancel _ _ _).symm + obtain ⟨β, hβ⟩ := + groupCohomology.isMulCoboundary₁_of_isMulCocycle₁_of_aut_to_units + f hf_cocycle + let a' : RelativeIdeleGroup K L := + a / principalIdele K L β + have hratio : + ∀ σ : L ≃ₐ[K] L, + (σ • principalIdele K L β) / + principalIdele K L β = + (σ • a) / a := by + intro σ + have hβ' : + Units.map σ.toRingEquiv.toMonoidHom β / β = + f σ := by + calc + Units.map σ.toRingEquiv.toMonoidHom β / β = + σ • β / β := by + congr 2 + _ = f σ := hβ σ + rw [smul_principalIdele, + ← map_div, hβ', hf_spec σ] + have ha'fixed : + ∀ σ : L ≃ₐ[K] L, σ • a' = a' := by + intro σ + change + σ • (a / principalIdele K L β) = + a / principalIdele K L β + rw [smul_div'] + calc + (σ • a) / (σ • principalIdele K L β) = + ((σ • a) / a) * + (a / (σ • principalIdele K L β)) := by + exact (div_mul_div_cancel _ _ _).symm + _ = ((σ • principalIdele K L β) / + principalIdele K L β) * + (a / (σ • principalIdele K L β)) := by + rw [← hratio σ] + _ = a / principalIdele K L β := by + exact div_mul_div_cancel' _ _ _ + refine ⟨a', ?_, ha'fixed⟩ + apply (QuotientGroup.eq_iff_div_mem).2 + refine ⟨β⁻¹, ?_⟩ + change + (principalIdele K L β)⁻¹ = + (a / principalIdele K L β) / a + simpa only [div_mul_eq_div_div] using + (div_mul_cancel_right a + (principalIdele K L β)).symm + +omit [NumberField L] in +/-- Every Galois-fixed relative idele class comes from `C_K`. -/ +theorem galoisFixed_le_classInclusion_range + [IsGalois K L] : + galoisFixedClassSubgroup K L ≤ + (classInclusion K L).range := by + intro c hc + obtain ⟨a, rfl⟩ := + QuotientGroup.mk_surjective c + have ha : + ∀ σ : L ≃ₐ[K] L, + σ • + QuotientGroup.mk' + (principalSubgroup K L) a = + QuotientGroup.mk' + (principalSubgroup K L) a := + hc + obtain ⟨a', ha'class, ha'fixed⟩ := + exists_fixed_representative_of_fixed_class + K L a ha + have ha'mem : + a' ∈ galoisFixedSubgroup K L := + ha'fixed + rw [← inclusion_range_eq_galoisFixedSubgroup + K L] at ha'mem + obtain ⟨b, hb⟩ := ha'mem + refine + ⟨QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) b, ?_⟩ + rw [classInclusion_mk, hb] + exact ha'class + +omit [NumberField L] in +/-- Galois descent for idele classes, +`C_L^{Gal(L/K)} = C_K`. -/ +theorem classInclusion_range_eq_galoisFixedClassSubgroup + [IsGalois K L] : + (classInclusion K L).range = + galoisFixedClassSubgroup K L := + le_antisymm + (classInclusion_range_le_galoisFixed K L) + (galoisFixed_le_classInclusion_range K L) + +end RelativeIdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisNorm.lean new file mode 100644 index 0000000000..bdcf18f660 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisNorm.lean @@ -0,0 +1,356 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormProperties +public import Mathlib.Algebra.Module.LinearMap.Polynomial +public import Mathlib.LinearAlgebra.Charpoly.BaseChange +public import Mathlib.RingTheory.TensorProduct.MvPolynomial +/-! +# The Galois product formula for the relative idele norm + +This file proves that, in the tensor-product presentation +`𝔸_L = 𝔸_K ⊗_K L`, extension of the determinant norm back to `𝔸_L` +is the product of all Galois conjugates. +-/ + +@[expose] public section + +open scoped BigOperators TensorProduct +open NumberField + +noncomputable +section + + +namespace RelativeIdeleGroup + +universe u v w + +variable + {K : Type u} {L : Type v} + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + +/-- The determinant norm as a homogeneous polynomial in the coordinates +of a basis. Keeping this polynomial over the ground field is what makes +the Galois product formula stable under arbitrary scalar extension. -/ +def normPolynomial + {ι : Type w} [Fintype ι] [DecidableEq ι] + (b : Module.Basis ι K L) : MvPolynomial ι K := + (-1 : MvPolynomial ι K) ^ Module.finrank K L * + ((Algebra.lmul K L).toLinearMap.polyCharpoly b).coeff 0 + +@[simp] +theorem eval_normPolynomial + {ι : Type w} [Fintype ι] [DecidableEq ι] + (b : Module.Basis ι K L) (x : L) : + MvPolynomial.eval (b.repr x) (normPolynomial b) = + Algebra.norm K x := by + rw [normPolynomial, map_mul, map_pow, map_neg, map_one, + LinearMap.polyCharpoly_coeff_eval] + exact ((Algebra.norm_apply K x).trans + (LinearMap.det_eq_sign_charpoly_coeff + ((Algebra.lmul K L) x))).symm + +/-- The linear polynomial whose value at the coordinates of `x` is the +`σ`-conjugate of `x`. -/ +def conjugatePolynomial + {ι : Type w} [Fintype ι] + (b : Module.Basis ι K L) (σ : L ≃ₐ[K] L) : + MvPolynomial ι L := + ∑ i, MvPolynomial.X i * MvPolynomial.C (σ (b i)) + +omit [FiniteDimensional K L] in +@[simp] +theorem eval_conjugatePolynomial + {ι : Type w} [Fintype ι] + (b : Module.Basis ι K L) (σ : L ≃ₐ[K] L) (x : L) : + MvPolynomial.eval + (fun i ↦ algebraMap K L (b.repr x i)) + (conjugatePolynomial b σ) = + σ x := by + classical + let : DecidableEq ι := Classical.decEq ι + rw [conjugatePolynomial, map_sum] + simp only [map_mul, MvPolynomial.eval_X, MvPolynomial.eval_C] + calc + ∑ i, algebraMap K L (b.repr x i) * σ (b i) = + ∑ i, σ ((b.repr x i) • b i) := by + apply Finset.sum_congr rfl + intro i hi + simp [Algebra.smul_def] + _ = σ (∑ i, (b.repr x i) • b i) := by + rw [map_sum] + _ = σ x := by rw [b.sum_repr] + +/-- The product of the universal conjugates, written as a polynomial over +the splitting field. -/ +def galoisProductPolynomial + {ι : Type w} [Fintype ι] [DecidableEq ι] + (b : Module.Basis ι K L) : + MvPolynomial ι L := + ∏ σ : L ≃ₐ[K] L, conjugatePolynomial b σ + +@[simp] +theorem eval_galoisProductPolynomial + {ι : Type w} [Fintype ι] [DecidableEq ι] + (b : Module.Basis ι K L) (x : L) : + MvPolynomial.eval + (fun i ↦ algebraMap K L (b.repr x i)) + (galoisProductPolynomial b) = + ∏ σ : L ≃ₐ[K] L, σ x := by + simp [galoisProductPolynomial] + +/-- The universal determinant norm polynomial becomes the product of the +universal Galois conjugates after extending its coefficients to `L`. -/ +theorem map_normPolynomial_eq_galoisProductPolynomial + [IsGalois K L] [Infinite K] + {ι : Type w} [Fintype ι] [DecidableEq ι] + (b : Module.Basis ι K L) : + MvPolynomial.map (algebraMap K L) (normPolynomial b) = + galoisProductPolynomial b := by + apply MvPolynomial.funext_set + (fun _ : ι ↦ Set.range (algebraMap K L)) + · intro i + exact Set.infinite_range_of_injective + (algebraMap K L).injective + · intro c hc + choose d hd using fun i ↦ hc i (Set.mem_univ i) + let x : L := + b.repr.symm (Finsupp.equivFunOnFinite.symm d) + have hcoords : + c = fun i ↦ algebraMap K L (b.repr x i) := by + funext i + calc + c i = algebraMap K L (d i) := (hd i).symm + _ = algebraMap K L (b.repr x i) := by simp [x] + rw [hcoords, eval_galoisProductPolynomial] + rw [MvPolynomial.eval_map] + change MvPolynomial.eval₂ (algebraMap K L) + ((algebraMap K L) ∘ fun i ↦ b.repr x i) + (normPolynomial b) = + _ + rw [← MvPolynomial.eval₂_comp] + rw [eval_normPolynomial] + exact Algebra.norm_eq_prod_automorphisms K x + +omit [FiniteDimensional K L] in +/-- Base change carries the regular representation of `L/K` to the regular +representation of `A ⊗[K] L` over `A`. -/ +theorem baseChangedLmul_eq + (A : Type w) [CommRing A] [Algebra K A] : + LinearMap.tensorProduct K A L L ∘ₗ + (Algebra.lmul K L).toLinearMap.baseChange A = + (Algebra.lmul A (A ⊗[K] L)).toLinearMap := by + apply LinearMap.ext + intro z + induction z using TensorProduct.inductionOn with + | add z₁ z₂ hz₁ hz₂ => + rw [map_add, map_add, hz₁, hz₂] + | tmul a x => + apply LinearMap.ext + intro y + induction y using TensorProduct.inductionOn with + | add y₁ y₂ hy₁ hy₂ => + rw [map_add, map_add, hy₁, hy₂] + | tmul b t => + simp [LinearMap.tensorProduct, + Algebra.TensorProduct.tmul_mul_tmul, + Algebra.smul_def, mul_comm] + +/-- Evaluation of the universal norm polynomial after arbitrary scalar +extension is the determinant norm on the scalar-extended algebra. -/ +theorem eval₂_normPolynomial_baseChange + (A : Type*) [CommRing A] [Algebra K A] [Nontrivial A] + {ι : Type w} [Fintype ι] [DecidableEq ι] + (b : Module.Basis ι K L) (z : A ⊗[K] L) : + MvPolynomial.eval₂ (algebraMap K A) + ((Algebra.TensorProduct.basis A b).repr z) + (normPolynomial b) = + Algebra.norm A z := by + have hcoeff := congrArg + (fun p : Polynomial (MvPolynomial ι A) ↦ p.coeff 0) + (LinearMap.polyCharpoly_baseChange + (Algebra.lmul K L).toLinearMap b A) + rw [Polynomial.coeff_map] at hcoeff + rw [normPolynomial, MvPolynomial.eval₂_mul, + MvPolynomial.eval₂_pow, MvPolynomial.eval₂_neg, + MvPolynomial.eval₂_one] + have heval := + MvPolynomial.eval₂_eq_eval_map + (algebraMap K A) + ((Algebra.TensorProduct.basis A b).repr z) + (((Algebra.lmul K L).toLinearMap.polyCharpoly b).coeff 0) + rw [heval, ← hcoeff] + rw [LinearMap.polyCharpoly_coeff_eval] + rw [baseChangedLmul_eq (K := K) (L := L) A] + rw [Algebra.norm_apply, + LinearMap.det_eq_sign_charpoly_coeff, + Module.finrank_baseChange] + rfl + +/-- Galois conjugation after scalar extension to an arbitrary commutative +`K`-algebra. -/ +def scalarConjugation + (A : Type*) [CommRing A] [Algebra K A] + (σ : L ≃ₐ[K] L) : + A ⊗[K] L →ₐ[A] A ⊗[K] L := + Algebra.TensorProduct.map (AlgHom.id A A) σ.toAlgHom + +omit [FiniteDimensional K L] in +@[simp] +theorem scalarConjugation_tmul + (A : Type*) [CommRing A] [Algebra K A] + (σ : L ≃ₐ[K] L) (a : A) (x : L) : + scalarConjugation (K := K) (L := L) A σ (a ⊗ₜ[K] x) = + a ⊗ₜ[K] σ x := + rfl + +omit [FiniteDimensional K L] in +/-- Evaluating a universal conjugate polynomial at the coordinates of a +base-changed element gives its actual scalar-extended conjugate. -/ +theorem eval₂_conjugatePolynomial_baseChange + (A : Type*) [CommRing A] [Algebra K A] + {ι : Type w} [Fintype ι] + (b : Module.Basis ι K L) (σ : L ≃ₐ[K] L) + (z : A ⊗[K] L) : + MvPolynomial.eval₂ + ((Algebra.TensorProduct.includeRight + (R := K) (A := A) (B := L)).toRingHom) + (fun i ↦ (Algebra.TensorProduct.includeLeft + (R := K) (S := K) (A := A) (B := L)) + ((Algebra.TensorProduct.basis A b).repr z i)) + (conjugatePolynomial b σ) = + scalarConjugation (K := K) (L := L) A σ z := by + classical + let : DecidableEq ι := Classical.decEq ι + simp only [conjugatePolynomial, MvPolynomial.eval₂_sum, + MvPolynomial.eval₂_mul, MvPolynomial.eval₂_X, + MvPolynomial.eval₂_C] + calc + ∑ i, (Algebra.TensorProduct.includeLeft + (R := K) (S := K) (A := A) (B := L)) + ((Algebra.TensorProduct.basis A b).repr z i) * + (Algebra.TensorProduct.includeRight + (R := K) (A := A) (B := L)) (σ (b i)) = + ∑ i, scalarConjugation (K := K) (L := L) A σ + (((Algebra.TensorProduct.basis A b).repr z i) • + Algebra.TensorProduct.basis A b i) := by + apply Finset.sum_congr rfl + intro i hi + simp [scalarConjugation, Algebra.TensorProduct.basis_apply, + Algebra.TensorProduct.tmul_mul_tmul, + Algebra.smul_def] + _ = scalarConjugation (K := K) (L := L) A σ + (∑ i, ((Algebra.TensorProduct.basis A b).repr z i) • + Algebra.TensorProduct.basis A b i) := by + rw [map_sum] + _ = scalarConjugation (K := K) (L := L) A σ z := by + rw [(Algebra.TensorProduct.basis A b).sum_repr] + +/-- The full scalar-extension formula: extending +the determinant norm back to a Galois algebra is the product of all +Galois conjugates. The coefficient algebra `A` is arbitrary. -/ +theorem includeLeft_norm_eq_prod_scalarConjugations + [IsGalois K L] [Infinite K] + (A : Type*) [CommRing A] [Algebra K A] [Nontrivial A] + (z : A ⊗[K] L) : + (Algebra.TensorProduct.includeLeft + (R := K) (S := K) (A := A) (B := L)) + (Algebra.norm A z) = + ∏ σ : L ≃ₐ[K] L, + scalarConjugation (K := K) (L := L) A σ z := by + classical + let b := Module.Free.chooseBasis K L + let c : Module.Free.ChooseBasisIndex K L → A := + fun i ↦ (Algebra.TensorProduct.basis A b).repr z i + let iL : A →+* A ⊗[K] L := + (Algebra.TensorProduct.includeLeft + (R := K) (S := K) (A := A) (B := L)).toRingHom + let iR : L →+* A ⊗[K] L := + (Algebra.TensorProduct.includeRight + (R := K) (A := A) (B := L)).toRingHom + have hmaps : + iL.comp (algebraMap K A) = + iR.comp (algebraMap K L) := by + ext x + simp [iL, iR] + have hleft : + MvPolynomial.eval₂ iR (fun i ↦ iL (c i)) + (MvPolynomial.map (algebraMap K L) + (normPolynomial b)) = + iL (Algebra.norm A z) := by + rw [MvPolynomial.eval₂_map] + rw [← hmaps] + rw [← MvPolynomial.hom_eval₂] + rw [eval₂_normPolynomial_baseChange] + have hright : + MvPolynomial.eval₂ iR (fun i ↦ iL (c i)) + (galoisProductPolynomial b) = + ∏ σ : L ≃ₐ[K] L, + scalarConjugation (K := K) (L := L) A σ z := by + rw [galoisProductPolynomial, + MvPolynomial.eval₂_prod] + apply Finset.prod_congr rfl + intro σ hσ + exact eval₂_conjugatePolynomial_baseChange + (K := K) (L := L) A b σ z + change iL (Algebra.norm A z) = + ∏ σ : L ≃ₐ[K] L, + scalarConjugation (K := K) (L := L) A σ z + rw [← hright, ← hleft, + map_normPolynomial_eq_galoisProductPolynomial b] + +omit [FiniteDimensional K L] in +@[simp] +theorem scalarConjugation_baseAdele_apply + [NumberField K] + (σ : L ≃ₐ[K] L) (z : RelativeAdeleRing K L) : + scalarConjugation + (NumberField.AdeleRing (𝓞 K) K) σ z = + conjugation K L σ z := + rfl + +/-- In full adèle form, the base extension of the +determinant norm of an arbitrary relative adèle is the product of all of +its Galois conjugates. -/ +theorem adeleInclusion_norm_eq_prod_conjugates + [NumberField K] [IsGalois K L] + (z : RelativeAdeleRing K L) : + adeleInclusion K L + (Algebra.norm + (NumberField.AdeleRing (𝓞 K) K) z) = + ∏ σ : L ≃ₐ[K] L, conjugation K L σ z := by + change + (Algebra.TensorProduct.includeLeft + (R := K) (S := K) + (A := NumberField.AdeleRing (𝓞 K) K) (B := L)) + (Algebra.norm + (NumberField.AdeleRing (𝓞 K) K) z) = + _ + simpa only [scalarConjugation_baseAdele_apply] using + (includeLeft_norm_eq_prod_scalarConjugations + (K := K) (L := L) + (NumberField.AdeleRing (𝓞 K) K) z) + +/-- In full idèle form, +`i_{L/K}(N_{L/K}(a)) = ∏_{σ ∈ Gal(L/K)} σ(a)` for every relative +idèle `a`. -/ +theorem inclusion_norm_eq_prod_conjugates + [NumberField K] [IsGalois K L] + (a : RelativeIdeleGroup K L) : + inclusion K L (norm K L a) = + ∏ σ : L ≃ₐ[K] L, σ • a := by + apply Units.ext + simp only [inclusion, norm, MonoidHom.comp_apply, + Units.coe_map, Units.coe_prod, + smul_def, conjugationIdele_coe] + exact adeleInclusion_norm_eq_prod_conjugates + (K := K) (L := L) (a : RelativeAdeleRing K L) + +end RelativeIdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdealClass.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdealClass.lean new file mode 100644 index 0000000000..01fe192fcc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdealClass.lean @@ -0,0 +1,893 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.AdeleBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core +public import Mathlib.NumberTheory.RamificationInertia.Valuation +public import Mathlib.RingTheory.ClassGroup.ExtendedHom +/-! +# Extension of ideles and ideal classes + +For a finite Galois extension of number fields, scalar extension of the +relative adele algebra followed by the relative-to-ordinary comparison +gives the usual extension map on ideles. This file descends that map to +idele classes and compares it with extension of fractional ideals and +ideal classes. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct nonZeroDivisors +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations + +universe u v w + +variable + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +omit [IsGalois K L] in +/-- On a base-field local unit, the finite relative-to-ordinary +comparison is the canonical map to the chosen place above it. -/ +theorem finitePlaceTensorUnitsEquivAboveAdic_localIdeleInclusion + (w : HeightOneSpectrum (𝓞 K)) + (W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}) + (x : (w.adicCompletion K)ˣ) : + finitePlaceTensorUnitsEquivAboveAdic + (K := K) (L := L) w + (localIdeleInclusion + (K := K) (L := L) w x) W = + Units.map + (finitePlaceAdicCompletionMap K L w W).toMonoidHom + x := by + obtain ⟨a, rfl⟩ := + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w).surjective W + rw [finitePlaceTensorUnitsEquivAboveAdic_apply_extension] + apply Units.ext + simp only [Units.coe_map, Units.coe_mapEquiv, + finitePlaceLocalTensorDecompositionUnitsComponent_coe, + localIdeleInclusion] + change + finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) w a + (finitePlaceLocalTensorDecompositionComponent + (K := K) (L := L) w a + ((x : w.adicCompletion K) ⊗ₜ[K] 1)) = + finitePlaceAdicCompletionMap K L w + (finitePlaceExtensionEquivAbove + (K := K) (L := L) w a) + (x : w.adicCompletion K) + rw [finitePlaceLocalTensorDecompositionComponent_tmul] + simp only [map_one, mul_one] + exact + finitePlaceExtensionAdicCompletionMap_eq_finitePlaceAdicCompletionMap + K L w a (x : w.adicCompletion K) + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Local orders under the canonical completion map are multiplied by +the ramification index. -/ +theorem localOrder_finitePlaceAdicCompletionMap + (w : HeightOneSpectrum (𝓞 K)) + (W : {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = w}) + (x : (w.adicCompletion K)ˣ) : + (FiniteIdeleGroup.localOrder W.1 + (Units.map + (finitePlaceAdicCompletionMap K L w W).toMonoidHom + x)).toAdd = + (w.asIdeal.ramificationIdx' W.1.asIdeal : ℤ) * + (FiniteIdeleGroup.localOrder w x).toAdd := by + rw [FiniteIdeleGroup.localOrder_apply, + FiniteIdeleGroup.localOrder_apply] + simp only [Units.coe_map] + change + -WithZero.log + (Valued.v + (finitePlaceAdicCompletionMap K L w W + (x : w.adicCompletion K))) = + (w.asIdeal.ramificationIdx' W.1.asIdeal : ℤ) * + -WithZero.log (Valued.v (x : w.adicCompletion K)) + rw [finitePlaceAdicCompletionMap_valued, WithZero.log_pow] + simp + +namespace FractionalIdealGroup + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Extension of nonzero fractional ideals along the inclusion of number +fields. -/ +noncomputable def extension : + FractionalIdealGroup K →* FractionalIdealGroup L := + Units.map + (FractionalIdeal.extendedHom L (𝓞 L)).toMonoidHom + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- On a prime fractional ideal, extension is the fractional ideal +associated with the mapped integral ideal. -/ +theorem extension_prime_val + (w : HeightOneSpectrum (𝓞 K)) : + ((extension K L (prime w) : FractionalIdealGroup L) : + FractionalIdeal (nonZeroDivisors (𝓞 L)) L) = + (w.asIdeal.map (algebraMap (𝓞 K) (𝓞 L)) : + FractionalIdeal (nonZeroDivisors (𝓞 L)) L) := by + change FractionalIdeal.extendedHom L (𝓞 L) + (w.asIdeal : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = _ + exact + FractionalIdeal.extendedHom_coeIdeal_eq_map + L (𝓞 L) w.asIdeal + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- At a place above `w`, the exponent of the extended prime is the +ramification index. -/ +theorem count_extension_prime + (w : HeightOneSpectrum (𝓞 K)) + (W : HeightOneSpectrum (𝓞 L)) + (hW : _root_.finitePlaceBelow (K := K) W = w) : + FractionalIdeal.count L W + ((extension K L (prime w) : FractionalIdealGroup L) : + FractionalIdeal (nonZeroDivisors (𝓞 L)) L) = + (w.asIdeal.ramificationIdx' W.asIdeal : ℤ) := by + let : W.asIdeal.LiesOver w.asIdeal := by + constructor + exact congrArg HeightOneSpectrum.asIdeal hW.symm + have hmap : + w.asIdeal.map (algebraMap (𝓞 K) (𝓞 L)) ≠ ⊥ := + Ideal.map_ne_bot_of_ne_bot w.ne_bot + rw [extension_prime_val, + FractionalIdeal.count_coe L W hmap, + Ideal.count_associates_factors_eq + hmap W.isPrime W.ne_bot] + norm_cast + rw [← + Ideal.IsDedekindDomain.ramificationIdx_eq_normalizedFactors_count + w.asIdeal W.asIdeal hmap] + exact + (Ideal.ramificationIdx'_eq_ramificationIdx + w.asIdeal W.asIdeal w.ne_bot).symm + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- A prime below a different place has zero exponent after extension. -/ +theorem count_extension_prime_ne + (w : HeightOneSpectrum (𝓞 K)) + (W : HeightOneSpectrum (𝓞 L)) + (hW : _root_.finitePlaceBelow (K := K) W ≠ w) : + FractionalIdeal.count L W + ((extension K L (prime w) : FractionalIdealGroup L) : + FractionalIdeal (nonZeroDivisors (𝓞 L)) L) = 0 := by + have hmap : + w.asIdeal.map (algebraMap (𝓞 K) (𝓞 L)) ≠ ⊥ := + Ideal.map_ne_bot_of_ne_bot w.ne_bot + rw [extension_prime_val, + FractionalIdeal.count_coe L W hmap, + Ideal.count_associates_factors_eq + hmap W.isPrime W.ne_bot] + norm_cast + rw [Multiset.count_eq_zero] + intro hmem + have hprimes : + W.asIdeal ∈ w.asIdeal.primesOver (𝓞 L) := + (Ideal.mem_primesOver_iff_mem_normalizedFactors + (𝓞 L) w.ne_bot).2 hmem + apply hW + apply HeightOneSpectrum.ext + rw [_root_.finitePlaceBelow_asIdeal] + exact hprimes.2.over.symm + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- The exponent formula for extension of a fractional ideal presented +by its prime factorization. -/ +theorem count_extension_factorization + (exps : Multiplicative + (HeightOneSpectrum (𝓞 K) →₀ ℤ)) + (W : HeightOneSpectrum (𝓞 L)) : + FractionalIdeal.count L W + ((extension K L + (factorization exps) : FractionalIdealGroup L) : + FractionalIdeal (nonZeroDivisors (𝓞 L)) L) = + ((_root_.finitePlaceBelow + (K := K) W).asIdeal.ramificationIdx' W.asIdeal : ℤ) * + exps.toAdd + (_root_.finitePlaceBelow (K := K) W) := by + classical + change FractionalIdeal.count L W + (((extension K L) + (exps.toAdd.prod fun v n => + primePowerHom v (Multiplicative.ofAdd n)) : + FractionalIdealGroup L) : + FractionalIdeal (nonZeroDivisors (𝓞 L)) L) = _ + rw [Finsupp.prod, map_prod] + simp only [primePowerHom, MonoidHom.mk'_apply, + toAdd_ofAdd, map_zpow] + have hcoe : + (((∏ v ∈ exps.toAdd.support, + extension K L (prime v) ^ exps.toAdd v) : + FractionalIdealGroup L) : + FractionalIdeal (nonZeroDivisors (𝓞 L)) L) = + ∏ v ∈ exps.toAdd.support, + (((extension K L (prime v) : + FractionalIdealGroup L) : + FractionalIdeal (nonZeroDivisors (𝓞 L)) L) ^ + exps.toAdd v) := by + simp + rw [hcoe, FractionalIdeal.count_prod] + · simp only [FractionalIdeal.count_zpow] + by_cases hbelow : + _root_.finitePlaceBelow + (K := K) W ∈ exps.toAdd.support + · rw [Finset.sum_eq_single + (_root_.finitePlaceBelow (K := K) W)] + · rw [count_extension_prime K L + (_root_.finitePlaceBelow (K := K) W) W rfl] + ring + · intro v hv hne + rw [count_extension_prime_ne K L v W] + · simp + · exact Ne.symm hne + · exact fun h => (h hbelow).elim + · have hzero : + exps.toAdd + (_root_.finitePlaceBelow (K := K) W) = 0 := + Finsupp.notMem_support_iff.mp hbelow + rw [hzero, mul_zero] + apply Finset.sum_eq_zero + intro v hv + rw [count_extension_prime_ne K L v W] + · simp + · intro h + apply hbelow + simpa [h] using hv + · intro v hv + exact zpow_ne_zero _ (Units.ne_zero + (extension K L (prime v))) + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Extension multiplies the exponent at `W` by the ramification index +over the place below `W`. -/ +theorem count_extension + (I : FractionalIdealGroup K) + (W : HeightOneSpectrum (𝓞 L)) : + FractionalIdeal.count L W + ((extension K L I : FractionalIdealGroup L) : + FractionalIdeal (nonZeroDivisors (𝓞 L)) L) = + ((_root_.finitePlaceBelow + (K := K) W).asIdeal.ramificationIdx' W.asIdeal : ℤ) * + FractionalIdeal.count K + (_root_.finitePlaceBelow (K := K) W) + (I : FractionalIdeal + (nonZeroDivisors (𝓞 K)) K) := by + obtain ⟨exps, rfl⟩ := + factorization_surjective (K := K) I + rw [count_extension_factorization, + count_factorization] + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Extension of a prime fractional ideal commutes with passage to the +ideal class group. -/ +theorem classGroup_mk_extension_prime + (w : HeightOneSpectrum (𝓞 K)) : + ClassGroup.mk L (extension K L (prime w)) = + ClassGroup.extendedHom (𝓞 K) (𝓞 L) + (ClassGroup.mk K (prime w)) := by + let w₀ : (Ideal (𝓞 K))⁰ := + ⟨w.asIdeal, + mem_nonZeroDivisors_iff_ne_zero.mpr w.ne_bot⟩ + have hw : + prime w = FractionalIdeal.mk0 K w₀ := by + apply Units.ext + rfl + rw [hw, ClassGroup.mk_mk0, + ClassGroup.extendedHom_mk0] + rw [← ClassGroup.mk_mk0 L + (ClassGroup.extendedIdeal (𝓞 K) (𝓞 L) w₀)] + apply congrArg (ClassGroup.mk L) + apply Units.ext + exact extension_prime_val K L w + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Extension of arbitrary fractional ideals commutes with passage to +the ideal class group. -/ +@[simp] +theorem classGroup_mk_extension + (I : FractionalIdealGroup K) : + ClassGroup.mk L (extension K L I) = + ClassGroup.extendedHom (𝓞 K) (𝓞 L) + (ClassGroup.mk K I) := by + obtain ⟨exps, rfl⟩ := + factorization_surjective (K := K) I + change + ((ClassGroup.mk L).comp (extension K L)) + (factorization exps) = + ((ClassGroup.extendedHom (𝓞 K) (𝓞 L)).comp + (ClassGroup.mk K)) (factorization exps) + rw [factorization, MonoidHom.mk'_apply, Finsupp.prod] + simp only [map_prod, primePowerHom, MonoidHom.mk'_apply, + toAdd_ofAdd, MonoidHom.comp_apply, map_zpow, + classGroup_mk_extension_prime] + +end FractionalIdealGroup + +namespace ClassGroup + +section ExtensionPrincipality + +variable + (A B : Type*) [CommRing A] [CommRing B] + [Algebra A B] [Module.IsTorsionFree A B] + [IsDedekindDomain A] [IsDedekindDomain B] + +/-- If extension of ideal classes is trivial, then the extension of +each integral ideal is principal. -/ +theorem ideal_map_isPrincipal_of_extendedHom_eq_one + (h : extendedHom A B = 1) + (I : Ideal A) : + (I.map (algebraMap A B)).IsPrincipal := by + by_cases hI : I = ⊥ + · subst I + refine ⟨0, ?_⟩ + simp + · let I₀ : (Ideal A)⁰ := + ⟨I, mem_nonZeroDivisors_iff_ne_zero.mpr hI⟩ + have hclass := + DFunLike.congr_fun h (mk0 I₀) + rw [extendedHom_mk0] at hclass + simp only [MonoidHom.one_apply] at hclass + have hprincipal := + (mk0_eq_one_iff + (extendedIdeal A B I₀).2).mp hclass + simpa [extendedIdeal, I₀] using hprincipal + +/-- Triviality of the class-group extension map is exactly the +principalization of every integral ideal. -/ +theorem extendedHom_eq_one_iff_forall_ideal_map_isPrincipal : + extendedHom A B = 1 ↔ + ∀ I : Ideal A, + (I.map (algebraMap A B)).IsPrincipal := by + constructor + · intro h I + exact ideal_map_isPrincipal_of_extendedHom_eq_one A B h I + · exact extendedHom_eq_one_of_forall_isPrincipal A B + +end ExtensionPrincipality + +end ClassGroup + +namespace IdeleGroup + +/-- The usual extension map on ideles, constructed through the relative +tensor-product presentation. -/ +noncomputable def extension : + IdeleGroup K →* IdeleGroup L := + relativeIdeleBaseChangeMulEquiv.toMonoidHom.comp + (RelativeIdeleGroup.inclusion K L) + +omit [IsGalois K L] in +theorem extension_infiniteComponent + (a : IdeleGroup K) + (W : InfinitePlace L) : + infiniteComponent W (extension K L a) = + letI : Algebra.IsIntegral K L := + Algebra.IsIntegral.of_finite K L + let v := + _root_.infinitePlaceBelow (K := K) W + letI : W.1.LiesOver v.1 := ⟨rfl⟩ + Units.map + (NumberField.LiesOver.completionMap + (v := v) (w := W)) + (infiniteComponent v a) := by + let : Algebra.IsIntegral K L := + Algebra.IsIntegral.of_finite K L + let : Algebra.IsSeparable K L := + Algebra.IsSeparable.of_integral K L + let v := + _root_.infinitePlaceBelow (K := K) W + let : W.1.LiesOver v.1 := ⟨rfl⟩ + apply Units.ext + change + (ContinuousMulEquiv.piUnits (extension K L a).1 W : + W.Completion) = _ + change + (ContinuousMulEquiv.piUnits + (_root_.relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) + (RelativeIdeleGroup.inclusion K L a)).1 W : + W.Completion) = _ + rw [_root_.relativeIdeleBaseChangeMulEquiv_infinite] + let f := + _root_.relativeInfiniteTensorPiMulEquiv + (K := K) (L := L) + ((_root_.relativeIdeleToLocalData + (K := K) (L := L) + (RelativeIdeleGroup.inclusion K L a)).infinite) + change + (ContinuousMulEquiv.piUnits + (ContinuousMulEquiv.piUnits.symm f) W : + W.Completion) = _ + rw [ContinuousMulEquiv.piUnits.apply_symm_apply] + dsimp only [f] + rw [_root_.relativeInfiniteTensorPiMulEquiv_apply] + simp only [_root_.relativeIdeleToLocalData] + rw [RelativeIdeleGroup.infiniteComponent_inclusion] + rw [_root_.infinitePlaceTensorUnitsEquivAbove_apply] + simp only [Units.coe_map] + change + _root_.infinitePlaceTensorRingEquivAbove + (K := K) (L := L) v + ((infiniteComponent v a : v.Completion) ⊗ₜ[K] (1 : L)) + ⟨W, rfl⟩ = + NumberField.LiesOver.completionMap + (v := v) (w := W) + (infiniteComponent v a : v.Completion) + simpa only [map_one, mul_one] using + (_root_.infinitePlaceTensorRingEquivAbove_tmul + (K := K) (L := L) v ⟨W, rfl⟩ + (infiniteComponent v a : v.Completion) (1 : L)) + +omit [IsGalois K L] in +/-- The finite component of an extended idele is the canonical local +completion map applied to the component below it. -/ +theorem extension_finiteComponent + (a : IdeleGroup K) + (W : HeightOneSpectrum (𝓞 L)) : + finiteComponent W (extension K L a) = + Units.map + (finitePlaceAdicCompletionMap K L + (_root_.finitePlaceBelow (K := K) W) + ⟨W, rfl⟩).toMonoidHom + (finiteComponent + (_root_.finitePlaceBelow (K := K) W) a) := by + change (extension K L a).2 W = _ + rw [extension, MonoidHom.comp_apply] + change + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) + (RelativeIdeleGroup.inclusion K L a)).2 W = _ + rw [ + relativeIdeleBaseChangeMulEquiv_finite, + _root_.relativeFiniteIdeleToFiniteIdele_apply, + _root_.relativeFiniteTensorPiMulEquiv_apply] + change + _root_.finitePlaceTensorUnitsEquivAboveAdic + (K := K) (L := L) + (_root_.finitePlaceBelow (K := K) W) + ((_root_.relativeIdeleToLocalData + (K := K) (L := L) + (RelativeIdeleGroup.inclusion K L a)).finite + (_root_.finitePlaceBelow (K := K) W)) + ⟨W, rfl⟩ = + _ + simp only [_root_.relativeIdeleToLocalData] + rw [RelativeIdeleGroup.finiteComponent_inclusion, + _root_.finitePlaceTensorUnitsEquivAboveAdic_localIdeleInclusion] + +omit [IsGalois K L] in +/-- The local order of an extended idele is multiplied by the +ramification index at the chosen place above. -/ +theorem extension_localOrder + (a : IdeleGroup K) + (W : HeightOneSpectrum (𝓞 L)) : + (FiniteIdeleGroup.localOrder W + (finiteComponent W (extension K L a))).toAdd = + ((_root_.finitePlaceBelow + (K := K) W).asIdeal.ramificationIdx' W.asIdeal : ℤ) * + (FiniteIdeleGroup.localOrder + (_root_.finitePlaceBelow (K := K) W) + (finiteComponent + (_root_.finitePlaceBelow (K := K) W) a)).toAdd := by + rw [extension_finiteComponent] + exact + _root_.localOrder_finitePlaceAdicCompletionMap K L + (_root_.finitePlaceBelow (K := K) W) ⟨W, rfl⟩ + (finiteComponent + (_root_.finitePlaceBelow (K := K) W) a) + +omit [IsGalois K L] in +/-- The fractional ideal attached to an extended idele is the extension +of the fractional ideal attached to the original idele. -/ +theorem fractionalIdeal_extension + (a : IdeleGroup K) : + fractionalIdeal (extension K L a) = + FractionalIdealGroup.extension K L + (fractionalIdeal a) := by + apply FractionalIdealGroup.ext_count + intro W + rw [FractionalIdealGroup.count_extension] + change + FractionalIdeal.count L W + (((FractionalIdealGroup.factorization (K := L)) + (FiniteIdeleGroup.valuationVector + (extension K L a).2) : FractionalIdealGroup L) : + FractionalIdeal + (nonZeroDivisors (𝓞 L)) L) = + ((_root_.finitePlaceBelow + (K := K) W).asIdeal.ramificationIdx' W.asIdeal : ℤ) * + FractionalIdeal.count K + (_root_.finitePlaceBelow (K := K) W) + (((FractionalIdealGroup.factorization (K := K)) + (FiniteIdeleGroup.valuationVector a.2) : + FractionalIdealGroup K) : + FractionalIdeal + (nonZeroDivisors (𝓞 K)) K) + rw [FractionalIdealGroup.count_factorization, + FractionalIdealGroup.count_factorization] + exact extension_localOrder K L a W + +omit [IsGalois K L] in +/-- The ideal class attached to an extended idele is the extension of +the ideal class attached to the original idele. -/ +theorem idealClass_extension + (a : IdeleGroup K) : + idealClass (extension K L a) = + ClassGroup.extendedHom (𝓞 K) (𝓞 L) + (idealClass a) := by + change + ClassGroup.mk L + (fractionalIdeal (extension K L a)) = + ClassGroup.extendedHom (𝓞 K) (𝓞 L) + (ClassGroup.mk K (fractionalIdeal a)) + rw [fractionalIdeal_extension, + FractionalIdealGroup.classGroup_mk_extension] + +omit [IsGalois K L] in +/-- Extension sends the subgroup defining the ordinary ideal class +quotient into the corresponding subgroup over the extension field. -/ +theorem extension_mem_ordinaryIdealClassSubgroup + {a : IdeleGroup K} + (ha : a ∈ + integralAtFinitePlaces (K := K) ⊔ + principalSubgroup K) : + extension K L a ∈ + integralAtFinitePlaces (K := L) ⊔ + principalSubgroup L := by + change a ∈ ordinaryIdealClassSubgroup at ha + change extension K L a ∈ ordinaryIdealClassSubgroup + rw [ordinaryIdealClassSubgroup_eq_ker, + MonoidHom.mem_ker] at ha ⊢ + rw [idealClass_extension, ha, map_one] + +omit [IsGalois K L] in +/-- Extension of a principal idele is the corresponding principal idele +of the extension field. -/ +@[simp] +theorem extension_principalIdele (x : Kˣ) : + extension K L (principalIdele K x) = + principalIdele L + (Units.map (algebraMap K L).toMonoidHom x) := by + rw [extension, MonoidHom.comp_apply, + RelativeIdeleGroup.inclusion_principalIdele] + apply Prod.ext + · apply Units.ext + funext W + change + _root_.infinitePlaceTensorUnitsEquivAbove + (K := K) (L := L) + (_root_.infinitePlaceBelow (K := K) W) + ((_root_.relativeIdeleToLocalData + (K := K) (L := L) + (RelativeIdeleGroup.principalIdele K L + (Units.map (algebraMap K L).toMonoidHom x))).infinite + (_root_.infinitePlaceBelow (K := K) W)) + ⟨W, rfl⟩ = + algebraMap L W.Completion + (algebraMap K L (x : K)) + simp only [_root_.relativeIdeleToLocalData] + rw [RelativeIdeleGroup.infiniteComponent_principalIdele] + rw [ + _root_.infinitePlaceTensorUnitsEquivAbove_localFieldIdeleInclusion] + simp + · change + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) + (RelativeIdeleGroup.principalIdele K L + (Units.map (algebraMap K L).toMonoidHom x))).2 = + (principalIdele L + (Units.map (algebraMap K L).toMonoidHom x)).2 + rw [relativeIdeleBaseChangeMulEquiv_finite] + apply RestrictedProduct.ext + intro W + rw [_root_.relativeFiniteIdeleToFiniteIdele_apply, + _root_.relativeFiniteTensorPiMulEquiv_apply] + change + _root_.finitePlaceTensorUnitsEquivAboveAdic + (K := K) (L := L) + (_root_.finitePlaceBelow (K := K) W) + ((_root_.relativeIdeleToLocalData + (K := K) (L := L) + (RelativeIdeleGroup.principalIdele K L + (Units.map (algebraMap K L).toMonoidHom x))).finite + (_root_.finitePlaceBelow (K := K) W)) + ⟨W, rfl⟩ = + Units.map (FinitePlace.embedding (K := L) W) + (Units.map (algebraMap K L).toMonoidHom x) + simp only [_root_.relativeIdeleToLocalData] + rw [RelativeIdeleGroup.finiteComponent_principalIdele] + rw [ + _root_.finitePlaceTensorUnitsEquivAboveAdic_localFieldIdeleInclusion] + +/-- Extension of ideles along the identity field extension is the +identity homomorphism. -/ +@[simp] +theorem extension_self : + extension K K = MonoidHom.id (IdeleGroup K) := by + apply MonoidHom.ext + intro a + apply Prod.ext + · apply ContinuousMulEquiv.piUnits.injective + funext W + change + infiniteComponent W (extension K K a) = + infiniteComponent W a + rw [extension_infiniteComponent] + dsimp only + have hmap + (v : InfinitePlace K) + (hv : v = W) + [hov : W.1.LiesOver v.1] : + Units.map + (NumberField.LiesOver.completionMap + (v := v) (w := W)).toMonoidHom + (infiniteComponent v a) = + infiniteComponent W a := by + subst v + apply Units.ext + change + NumberField.LiesOver.completionMap + (v := W) (w := W) + (infiniteComponent W a : W.Completion) = + (infiniteComponent W a : W.Completion) + exact + _root_.infinitePlaceCompletionMap_self_apply + (K := K) W + (infiniteComponent W a : W.Completion) + exact + hmap + (_root_.infinitePlaceBelow (K := K) W) + (_root_.infinitePlaceBelow_self (K := K) W) + (hov := ⟨rfl⟩) + · apply RestrictedProduct.ext + intro W + change + finiteComponent W (extension K K a) = + finiteComponent W a + rw [extension_finiteComponent] + dsimp only + have hmap + (v : HeightOneSpectrum (𝓞 K)) + (hbelow : + _root_.finitePlaceBelow (K := K) W = v) + (hv : v = W) : + Units.map + (finitePlaceAdicCompletionMap K K v + ⟨W, hbelow⟩).toMonoidHom + (finiteComponent v a) = + finiteComponent W a := by + subst v + apply Units.ext + change + finitePlaceAdicCompletionMap K K W + ⟨W, + _root_.finitePlaceBelow_self + (K := K) W⟩ + (finiteComponent W a : W.adicCompletion K) = + (finiteComponent W a : W.adicCompletion K) + exact + _root_.finitePlaceAdicCompletionMap_self_apply K W + (finiteComponent W a : W.adicCompletion K) + exact + hmap + (_root_.finitePlaceBelow (K := K) W) + rfl + (_root_.finitePlaceBelow_self (K := K) W) + +/-- Extension of ideles is functorial in a tower of finite Galois +extensions. -/ +theorem extension_comp + (M : Type w) + [Field M] [NumberField M] + [Algebra K M] [Algebra M L] + [IsScalarTower K M L] + [FiniteDimensional K M] [FiniteDimensional M L] + [IsGalois K M] [IsGalois M L] : + (extension M L).comp (extension K M) = + extension K L := by + apply MonoidHom.ext + intro a + apply Prod.ext + · apply ContinuousMulEquiv.piUnits.injective + funext W + change + infiniteComponent W + (extension M L (extension K M a)) = + infiniteComponent W (extension K L a) + rw [extension_infiniteComponent, + extension_infiniteComponent] + dsimp only + rw [extension_infiniteComponent] + dsimp only + let V := _root_.infinitePlaceBelow (K := M) W + let v := _root_.infinitePlaceBelow (K := K) W + have hmap + (v' : InfinitePlace K) + (hv' : v' = v) + [hVv : V.1.LiesOver v'.1] + [hWV : W.1.LiesOver V.1] + [hWv : W.1.LiesOver v.1] : + Units.map + (NumberField.LiesOver.completionMap + (v := V) (w := W)).toMonoidHom + (Units.map + (NumberField.LiesOver.completionMap + (v := v') (w := V)).toMonoidHom + (infiniteComponent v' a)) = + Units.map + (NumberField.LiesOver.completionMap + (v := v) (w := W)).toMonoidHom + (infiniteComponent v a) := by + subst v' + apply Units.ext + change + NumberField.LiesOver.completionMap + (v := V) (w := W) + (NumberField.LiesOver.completionMap + (v := v) (w := V) + (infiniteComponent v a : v.Completion)) = + NumberField.LiesOver.completionMap + (v := v) (w := W) + (infiniteComponent v a : v.Completion) + exact + _root_.infinitePlaceCompletionMap_comp_apply + (K := K) (L := L) (M := M) W + (infiniteComponent v a : v.Completion) + exact + hmap + (_root_.infinitePlaceBelow (K := K) V) + (_root_.infinitePlaceBelow_infinitePlaceBelow + (K := K) (M := M) (L := L) W) + (hVv := ⟨rfl⟩) + (hWV := ⟨rfl⟩) + (hWv := ⟨rfl⟩) + · apply RestrictedProduct.ext + intro W + change + finiteComponent W + (extension M L (extension K M a)) = + finiteComponent W (extension K L a) + rw [extension_finiteComponent, + extension_finiteComponent] + dsimp only + rw [extension_finiteComponent] + dsimp only + let V := _root_.finitePlaceBelow (K := M) W + let v := _root_.finitePlaceBelow (K := K) W + have hmap + (v' : HeightOneSpectrum (𝓞 K)) + (hv' : v' = v) + (hV : _root_.finitePlaceBelow (K := K) V = v') + (hWV : _root_.finitePlaceBelow (K := M) W = V) + (hWv : _root_.finitePlaceBelow (K := K) W = v) : + Units.map + (finitePlaceAdicCompletionMap M L V + ⟨W, hWV⟩).toMonoidHom + (Units.map + (finitePlaceAdicCompletionMap K M v' + ⟨V, hV⟩).toMonoidHom + (finiteComponent v' a)) = + Units.map + (finitePlaceAdicCompletionMap K L v + ⟨W, hWv⟩).toMonoidHom + (finiteComponent v a) := by + subst v' + apply Units.ext + change + finitePlaceAdicCompletionMap M L V ⟨W, hWV⟩ + (finitePlaceAdicCompletionMap K M v ⟨V, hV⟩ + (finiteComponent v a : v.adicCompletion K)) = + finitePlaceAdicCompletionMap K L v ⟨W, hWv⟩ + (finiteComponent v a : v.adicCompletion K) + exact + finitePlaceAdicCompletionMap_comp + K L (M := M) v V W + hV hWV hWv + (finiteComponent v a : v.adicCompletion K) + exact + hmap + (_root_.finitePlaceBelow (K := K) V) + (_root_.finitePlaceBelow_finitePlaceBelow + (K := K) (M := M) (L := L) W) + rfl rfl rfl + +end IdeleGroup + +/-- The usual extension map on idele classes. -/ +noncomputable def ideleClassExtension : + IdeleClassGroup K →* IdeleClassGroup L := + QuotientGroup.map + (IdeleGroup.principalSubgroup K) + (IdeleGroup.principalSubgroup L) + (IdeleGroup.extension K L) + (by + rintro _ ⟨x, rfl⟩ + exact + ⟨Units.map (algebraMap K L).toMonoidHom x, + (IdeleGroup.extension_principalIdele K L x).symm⟩) + +omit [IsGalois K L] in +theorem ideleClassExtension_mk (a : IdeleGroup K) : + ideleClassExtension K L + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup L) + (IdeleGroup.extension K L a) := + rfl + +/-- Extension of idele classes along the identity field extension is +the identity homomorphism. -/ +@[simp] +theorem ideleClassExtension_self : + ideleClassExtension K K = + MonoidHom.id (IdeleClassGroup K) := by + apply MonoidHom.ext + intro c + refine QuotientGroup.induction_on c ?_ + intro a + change + ideleClassExtension K K + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a + rw [ideleClassExtension_mk, + IdeleGroup.extension_self] + rfl + +/-- Extension of idele classes is functorial in a tower of finite +Galois extensions. -/ +theorem ideleClassExtension_comp + (M : Type w) + [Field M] [NumberField M] + [Algebra K M] [Algebra M L] + [IsScalarTower K M L] + [FiniteDimensional K M] [FiniteDimensional M L] + [IsGalois K M] [IsGalois M L] : + (ideleClassExtension M L).comp + (ideleClassExtension K M) = + ideleClassExtension K L := by + apply MonoidHom.ext + intro c + refine QuotientGroup.induction_on c ?_ + intro a + change + ideleClassExtension M L + (ideleClassExtension K M + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a)) = + ideleClassExtension K L + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) + rw [ideleClassExtension_mk, + ideleClassExtension_mk, + ideleClassExtension_mk] + change + QuotientGroup.mk' + (IdeleGroup.principalSubgroup L) + (((IdeleGroup.extension M L).comp + (IdeleGroup.extension K M)) a) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup L) + (IdeleGroup.extension K L a) + rw [IdeleGroup.extension_comp] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleClassBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleClassBaseChange.lean new file mode 100644 index 0000000000..377981b4e0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleClassBaseChange.lean @@ -0,0 +1,108 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdealClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.ClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.AdeleBaseChange +/-! +# Relative and ordinary idele classes + +The tensor-product presentation of the ideles of a finite Galois +extension is canonically equivalent to the ordinary restricted-product +presentation. This file descends that equivalence through principal +ideles and identifies relative class inclusion with the concrete +extension map on ordinary idele classes. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField + +noncomputable +section + +universe u v + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + +/-- Scalar extension identifies the relative and ordinary principal +idele subgroups. -/ +theorem relativeIdelePrincipalSubgroup_map_baseChange : + (RelativeIdeleGroup.principalSubgroup K L).map + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L)).toMonoidHom = + IdeleGroup.principalSubgroup L := by + ext y + constructor + · rintro ⟨z, ⟨x, hx⟩, rfl⟩ + rw [← hx] + exact + ⟨x, + (relativeIdeleBaseChangeMulEquiv_principalIdele + (K := K) (L := L) x).symm⟩ + · rintro ⟨x, rfl⟩ + refine + ⟨RelativeIdeleGroup.principalIdele K L x, + ⟨x, rfl⟩, ?_⟩ + exact + relativeIdeleBaseChangeMulEquiv_principalIdele + (K := K) (L := L) x + +/-- Scalar extension identifies the relative presentation of the idele +class group with the ordinary idele class group of the extension field. -/ +noncomputable def relativeIdeleClassBaseChangeMulEquiv : + RelativeIdeleGroup.ClassGroup K L ≃* + IdeleClassGroup L := + QuotientGroup.congr + (RelativeIdeleGroup.principalSubgroup K L) + (IdeleGroup.principalSubgroup L) + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L)) + (relativeIdelePrincipalSubgroup_map_baseChange + (K := K) (L := L)) + +theorem relativeIdeleClassBaseChangeMulEquiv_mk + (z : RelativeIdeleGroup K L) : + relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := L) + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) z) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup L) + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) z) := + rfl + +/-- Under the relative-to-ordinary comparison, relative class inclusion +is the concrete extension map on ordinary idele classes. -/ +@[simp] +theorem relativeIdeleClassBaseChangeMulEquiv_classInclusion + (c : IdeleClassGroup K) : + relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := L) + (RelativeIdeleGroup.classInclusion K L c) = + ideleClassExtension K L c := by + refine QuotientGroup.induction_on c ?_ + intro a + rfl + +/-- Homomorphism form of the compatibility between relative class +inclusion and ordinary idele-class extension. -/ +theorem relativeIdeleClassBaseChange_comp_classInclusion : + (relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := L)).toMonoidHom.comp + (RelativeIdeleGroup.classInclusion K L) = + ideleClassExtension K L := by + ext c + exact + relativeIdeleClassBaseChangeMulEquiv_classInclusion + (K := K) (L := L) c diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNorm.lean new file mode 100644 index 0000000000..0593d0b243 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNorm.lean @@ -0,0 +1,96 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.AdeleBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.BaseChange +/-! +# The norm on ordinary ideles + +The relative idele group carries the determinant norm. The +scalar-extension equivalence with the ordinary ideles of the extension +field transports that existing norm to the usual map +`N_{L/K} : I_L → I_K`. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace IdeleGroup + +universe u v + +variable + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + +/-- The ordinary idele norm `N_{L/K} : I_L → I_K`, transported from +the determinant norm on the relative idele group. -/ +noncomputable def norm : + IdeleGroup L →* IdeleGroup K := + (RelativeIdeleGroup.norm K L).comp + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L)).symm.toMonoidHom + +@[simp] +theorem norm_relativeIdeleBaseChangeMulEquiv + (z : RelativeIdeleGroup K L) : + norm K L + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) z) = + RelativeIdeleGroup.norm K L z := by + simp [norm] + +/-- On principal ideles, the ordinary idele norm is induced by the +field norm. -/ +@[simp] +theorem norm_principalIdele + (x : Lˣ) : + norm K L (principalIdele L x) = + principalIdele K (Units.map (Algebra.norm K) x) := by + rw [← relativeIdeleBaseChangeMulEquiv_principalIdele + (K := K) (L := L) x] + rw [norm_relativeIdeleBaseChangeMulEquiv, + RelativeIdeleGroup.norm_principalIdele] + +end IdeleGroup + +universe u v + +variable + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + +/-- The ordinary idele-class norm `N_{L/K} : C_L → C_K`. -/ +noncomputable def ideleClassNorm : + IdeleClassGroup L →* IdeleClassGroup K := + QuotientGroup.map + (IdeleGroup.principalSubgroup L) + (IdeleGroup.principalSubgroup K) + (IdeleGroup.norm K L) + (by + rintro _ ⟨x, rfl⟩ + exact + ⟨Units.map (Algebra.norm K) x, + (IdeleGroup.norm_principalIdele K L x).symm⟩) + +theorem ideleClassNorm_mk + (a : IdeleGroup L) : + ideleClassNorm K L + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup L) a) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (IdeleGroup.norm K L a) := + rfl diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNormComponents.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNormComponents.lean new file mode 100644 index 0000000000..51b86e0124 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNormComponents.lean @@ -0,0 +1,1033 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison +/-! +# Local components of the ordinary idele norm + +The ordinary idele norm is transported from the determinant norm on the +relative idele group. At each place, the canonical local tensor decomposition identifies that +determinant with the product of the ordinary field norms on the completion +factors above the place. These are the concrete finite- and infinite-place +forms of the local idele norm formula. +-/ + +@[expose] public section + +open scoped BigOperators NumberField TensorProduct NumberField.LiesOver +open NumberField IsDedekindDomain + +noncomputable +section + +namespace IdeleGroup + +open AlgebraicNumberTheory.Valuations + +universe u v + +variable + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + +/-- The relative-tensor coordinate form underlying the public finite-place +formula below. -/ +private theorem finiteComponent_norm_eq_prod_extensions + (v : HeightOneSpectrum (𝓞 K)) + (a : IdeleGroup L) : + let vK := HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let z := + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L)).symm a + let x := + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) v z + letI := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w => + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : ∀ w : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w.1.Completion := + fun w => + completionModuleFinite vK hvK w + Units.mapEquiv + (_root_.relativeFinitePlaceCompletionAlgEquiv + (K := K) v).symm.toMulEquiv + (finiteComponent v (norm K L a)) = + ∏ w : AbsoluteValueExtension vK L, + Units.map (Algebra.norm vK.Completion) + (_root_.finitePlaceLocalTensorDecompositionUnitsComponent + (K := K) (L := L) v w x) := by + classical + let vK := HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let e := + relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) + let z := e.symm a + let x := + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) v z + let := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + let : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w => + AbsoluteValue.completionAlgebra vK w.1 w.2 + let : ∀ w : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w.1.Completion := + fun w => + completionModuleFinite vK hvK w + have hz : e z = a := + e.apply_symm_apply a + change + Units.mapEquiv + (_root_.relativeFinitePlaceCompletionAlgEquiv + (K := K) v).symm.toMulEquiv + (finiteComponent v (norm K L a)) = + ∏ w : AbsoluteValueExtension vK L, + Units.map (Algebra.norm vK.Completion) + (_root_.finitePlaceLocalTensorDecompositionUnitsComponent + (K := K) (L := L) v w x) + rw [← hz, norm_relativeIdeleBaseChangeMulEquiv, + RelativeIdeleGroup.finiteComponent_norm] + apply Units.ext + change + (_root_.relativeFinitePlaceCompletionAlgEquiv + (K := K) v).symm + (Algebra.norm (v.adicCompletion K) + (x : v.adicCompletion K ⊗[K] L)) = + (((∏ w : AbsoluteValueExtension vK L, + Units.map (Algebra.norm vK.Completion) + (_root_.finitePlaceLocalTensorDecompositionUnitsComponent + (K := K) (L := L) v w x)) : + vK.Completionˣ) : vK.Completion) + let x' : (vK.Completion ⊗[K] L)ˣ := + Units.mapEquiv + (_root_.relativeFinitePlaceLocalTensorAlgEquiv + (K := K) (L := L) v).symm.toMulEquiv x + calc + (_root_.relativeFinitePlaceCompletionAlgEquiv + (K := K) v).symm + (Algebra.norm (v.adicCompletion K) + (x : v.adicCompletion K ⊗[K] L)) = + Algebra.norm vK.Completion + (x' : vK.Completion ⊗[K] L) := by + exact + map_norm_tensorProduct_baseChange + (K := K) (L := L) + (_root_.relativeFinitePlaceCompletionAlgEquiv + (K := K) v).symm.toAlgHom + (x : v.adicCompletion K ⊗[K] L) + _ = ∏ w : AbsoluteValueExtension vK L, + Algebra.norm vK.Completion + (completionTensorDecompositionLeft + (K := K) (L := L) vK hvK + (x' : vK.Completion ⊗[K] L) w) := by + exact + RelativeIdeleGroup.localNorm_units_eq_prod + vK hvK x' + _ = + (((∏ w : AbsoluteValueExtension vK L, + Units.map (Algebra.norm vK.Completion) + (_root_.finitePlaceLocalTensorDecompositionUnitsComponent + (K := K) (L := L) v w x)) : + vK.Completionˣ) : vK.Completion) := by + change _ = Units.coeHom vK.Completion _ + rw [map_prod] + apply Finset.prod_congr rfl + intro w _ + rfl + +/-- The finite-place form of the ordinary idele norm. Each factor +is the mathlib field norm of the actual idele component at the concrete +finite place corresponding to an exact extension of `v`; the existing +completion equivalence is used only to put that component in the canonical +absolute-value completion. -/ +private theorem finiteComponent_norm_eq_prod_completion + (v : HeightOneSpectrum (𝓞 K)) + (a : IdeleGroup L) : + let vK := HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + letI := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w => + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : ∀ w : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w.1.Completion := + fun w => + completionModuleFinite vK hvK w + Units.mapEquiv + (_root_.relativeFinitePlaceCompletionAlgEquiv + (K := K) v).symm.toMulEquiv + (finiteComponent v (norm K L a)) = + ∏ w : AbsoluteValueExtension vK L, + Units.map (Algebra.norm vK.Completion) + (Units.mapEquiv + (finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w).symm.toMulEquiv + (finiteComponent + (finitePlaceExtensionEquivAbove + (K := K) (L := L) v w).1 a)) := by + classical + let vK := HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let e := + relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) + let z := e.symm a + let x := + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) v z + let := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + let : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w => + AbsoluteValue.completionAlgebra vK w.1 w.2 + let : ∀ w : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w.1.Completion := + fun w => + completionModuleFinite vK hvK w + have hz : e z = a := + e.apply_symm_apply a + change + Units.mapEquiv + (_root_.relativeFinitePlaceCompletionAlgEquiv + (K := K) v).symm.toMulEquiv + (finiteComponent v (norm K L a)) = + ∏ w : AbsoluteValueExtension vK L, + Units.map (Algebra.norm vK.Completion) + (Units.mapEquiv + (finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w).symm.toMulEquiv + (finiteComponent + (finitePlaceExtensionEquivAbove + (K := K) (L := L) v w).1 a)) + calc + Units.mapEquiv + (_root_.relativeFinitePlaceCompletionAlgEquiv + (K := K) v).symm.toMulEquiv + (finiteComponent v (norm K L a)) = + ∏ w : AbsoluteValueExtension vK L, + Units.map (Algebra.norm vK.Completion) + (_root_.finitePlaceLocalTensorDecompositionUnitsComponent + (K := K) (L := L) v w x) := + finiteComponent_norm_eq_prod_extensions + (K := K) (L := L) v a + _ = ∏ w : AbsoluteValueExtension vK L, + Units.map (Algebra.norm vK.Completion) + (Units.mapEquiv + (finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w).symm.toMulEquiv + (finiteComponent + (finitePlaceExtensionEquivAbove + (K := K) (L := L) v w).1 a)) := by + apply Finset.prod_congr rfl + intro w _ + apply congrArg (Units.map (Algebra.norm vK.Completion)) + let W := + finitePlaceExtensionEquivAbove + (K := K) (L := L) v w + have hcomponent := + congrArg (fun b : IdeleGroup L => finiteComponent W.1 b) hz + change + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) z).2 W.1 = + finiteComponent W.1 a at hcomponent + rw [relativeIdeleBaseChangeMulEquiv_finite, + _root_.relativeFiniteIdeleToFiniteIdele_apply, + _root_.relativeFiniteTensorPiMulEquiv_apply] at hcomponent + change + _root_.finitePlaceTensorUnitsEquivAboveAdic + (K := K) (L := L) + (_root_.finitePlaceBelow (K := K) W.1) + (RelativeIdeleGroup.finiteComponent + (K := K) (L := L) + (_root_.finitePlaceBelow (K := K) W.1) z) + ⟨W.1, rfl⟩ = + finiteComponent W.1 a at hcomponent + have hcomponent' : + _root_.finitePlaceTensorUnitsEquivAboveAdic + (K := K) (L := L) v x W = + finiteComponent W.1 a := by + let W₀ : HeightOneSpectrum (𝓞 L) := W.1 + let P : HeightOneSpectrum (𝓞 K) → Prop := fun q => + ∀ hq : _root_.finitePlaceBelow (K := K) W₀ = q, + _root_.finitePlaceTensorUnitsEquivAboveAdic + (K := K) (L := L) q + (RelativeIdeleGroup.finiteComponent + (K := K) (L := L) q z) + ⟨W₀, hq⟩ = + finiteComponent W₀ a + have hP : + P (_root_.finitePlaceBelow (K := K) W₀) := by + intro hq + simpa only [P, W₀] using hcomponent + have hW : + _root_.finitePlaceBelow (K := K) W₀ = v := + W.2 + have hPv : P v := + hW ▸ hP + simpa only [P, W₀, x] using hPv W.2 + dsimp only [W] at hcomponent' + rw [ + _root_.finitePlaceTensorUnitsEquivAboveAdic_apply_extension + ] at hcomponent' + apply + (Units.mapEquiv + (finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w).toMulEquiv).injective + rw [hcomponent'] + exact + ((Units.mapEquiv + (finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w).toMulEquiv).apply_symm_apply + (finiteComponent + (finitePlaceExtensionEquivAbove + (K := K) (L := L) v w).1 a)).symm + +/-- The finite-place form of the ordinary idele norm, entirely in +the concrete adic completions. Thus the component at `v` is the product +of the ordinary field norms of the components at all finite places above +`v`. -/ +private theorem finiteComponent_norm_eq_prod_exact_index + (v : HeightOneSpectrum (𝓞 K)) + (a : IdeleGroup L) : + let vK := HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + letI := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra (v.adicCompletion K) + ((finitePlaceExtensionEquivAbove + (K := K) (L := L) v w).1.adicCompletion L) := + fun w => + (finitePlaceAdicCompletionMap K L v + (finitePlaceExtensionEquivAbove + (K := K) (L := L) v w)).toAlgebra + finiteComponent v (norm K L a) = + ∏ w : AbsoluteValueExtension vK L, + LocalFieldTheory.normUnits + (v.adicCompletion K) + ((finitePlaceExtensionEquivAbove + (K := K) (L := L) v w).1.adicCompletion L) + (finiteComponent + (finitePlaceExtensionEquivAbove + (K := K) (L := L) v w).1 a) := by + classical + let vK := HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let eBase := + _root_.relativeFinitePlaceCompletionAlgEquiv + (K := K) v + let := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + let : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w => + AbsoluteValue.completionAlgebra vK w.1 w.2 + let : ∀ w : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w.1.Completion := + fun w => + completionModuleFinite vK hvK w + let : ∀ w : AbsoluteValueExtension vK L, + Algebra (v.adicCompletion K) + ((finitePlaceExtensionEquivAbove + (K := K) (L := L) v w).1.adicCompletion L) := + fun w => + (finitePlaceAdicCompletionMap K L v + (finitePlaceExtensionEquivAbove + (K := K) (L := L) v w)).toAlgebra + have hCompatible + (w : AbsoluteValueExtension vK L) : + RingHom.comp + (algebraMap + (v.adicCompletion K) + ((finitePlaceExtensionEquivAbove + (K := K) (L := L) v w).1.adicCompletion L)) + eBase.toRingEquiv = + RingHom.comp + (finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w).toRingHom + (algebraMap vK.Completion w.1.Completion) := by + apply RingHom.ext + intro x + change + finitePlaceAdicCompletionMap K L v + (finitePlaceExtensionEquivAbove + (K := K) (L := L) v w) + (eBase x) = + finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w + (algebraMap vK.Completion w.1.Completion x) + rw [← + finitePlaceExtensionAdicCompletionMap_eq_finitePlaceAdicCompletionMap + K L v w] + simp [finitePlaceExtensionAdicCompletionMap, eBase, vK] + have hcompletion := + finiteComponent_norm_eq_prod_completion + (K := K) (L := L) v a + change + finiteComponent v (norm K L a) = + ∏ w : AbsoluteValueExtension vK L, + LocalFieldTheory.normUnits + (v.adicCompletion K) + ((finitePlaceExtensionEquivAbove + (K := K) (L := L) v w).1.adicCompletion L) + (finiteComponent + (finitePlaceExtensionEquivAbove + (K := K) (L := L) v w).1 a) + calc + finiteComponent v (norm K L a) = + Units.mapEquiv eBase.toMulEquiv + (Units.mapEquiv eBase.symm.toMulEquiv + (finiteComponent v (norm K L a))) := by + apply Units.ext + simp + _ = Units.mapEquiv eBase.toMulEquiv + (∏ w : AbsoluteValueExtension vK L, + Units.map (Algebra.norm vK.Completion) + (Units.mapEquiv + (finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w).symm.toMulEquiv + (finiteComponent + (finitePlaceExtensionEquivAbove + (K := K) (L := L) v w).1 a))) := by + exact congrArg (Units.mapEquiv eBase.toMulEquiv) hcompletion + _ = ∏ w : AbsoluteValueExtension vK L, + Units.mapEquiv eBase.toMulEquiv + (Units.map (Algebra.norm vK.Completion) + (Units.mapEquiv + (finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w).symm.toMulEquiv + (finiteComponent + (finitePlaceExtensionEquivAbove + (K := K) (L := L) v w).1 a))) := by + rw [map_prod] + _ = ∏ w : AbsoluteValueExtension vK L, + LocalFieldTheory.normUnits + (v.adicCompletion K) + ((finitePlaceExtensionEquivAbove + (K := K) (L := L) v w).1.adicCompletion L) + (finiteComponent + (finitePlaceExtensionEquivAbove + (K := K) (L := L) v w).1 a) := by + apply Finset.prod_congr rfl + intro w _ + let W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v} := + ⟨finitePlaceExtensionCentre (K := K) (L := L) v w, + finitePlaceBelow_finitePlaceExtensionCentre + (K := K) (L := L) v w⟩ + let : Algebra (v.adicCompletion K) + ((finitePlaceExtensionCentre + (K := K) (L := L) v w).adicCompletion L) := + (finitePlaceAdicCompletionMap K L v W).toAlgebra + let eExtension := + finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w + let x : w.1.Completionˣ := + Units.mapEquiv eExtension.symm.toMulEquiv + (finiteComponent + (finitePlaceExtensionEquivAbove + (K := K) (L := L) v w).1 a) + have hNorm := + LocalClassFieldTheory.normUnits_map_ringEquiv + eBase.toRingEquiv eExtension (hCompatible w) x + have hx : + Units.mapEquiv eExtension.toMulEquiv x = + finiteComponent + (finitePlaceExtensionEquivAbove + (K := K) (L := L) v w).1 a := by + exact + (Units.mapEquiv eExtension.toMulEquiv).apply_symm_apply + (finiteComponent + (finitePlaceExtensionEquivAbove + (K := K) (L := L) v w).1 a) + rw [hx] at hNorm + change + Units.mapEquiv eBase.toMulEquiv + (LocalFieldTheory.normUnits + vK.Completion w.1.Completion x) = + LocalFieldTheory.normUnits + (v.adicCompletion K) + ((finitePlaceExtensionEquivAbove + (K := K) (L := L) v w).1.adicCompletion L) + (finiteComponent + (finitePlaceExtensionEquivAbove + (K := K) (L := L) v w).1 a) + exact hNorm + +/-- The finite-place form of the ordinary idele norm. The +component at `v` is the product of the ordinary field norms of the actual +idele components at the finite places above `v`. -/ +theorem finiteComponent_norm_eq_prod + (v : HeightOneSpectrum (𝓞 K)) + (a : IdeleGroup L) : + let vK := HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + letI := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + let eAbove := + finitePlaceExtensionEquivAbove + (K := K) (L := L) v + letI : Fintype {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v} := + Fintype.ofEquiv (AbsoluteValueExtension vK L) eAbove + letI : ∀ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v}, + Algebra (v.adicCompletion K) (W.1.adicCompletion L) := + fun W => + (finitePlaceAdicCompletionMap + K L v W).toAlgebra + finiteComponent v (norm K L a) = + ∏ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v}, + LocalFieldTheory.normUnits + (v.adicCompletion K) (W.1.adicCompletion L) + (finiteComponent W.1 a) := by + classical + let vK := HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let eAbove := + finitePlaceExtensionEquivAbove + (K := K) (L := L) v + let := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + let : Fintype {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v} := + Fintype.ofEquiv (AbsoluteValueExtension vK L) eAbove + let : ∀ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v}, + Algebra (v.adicCompletion K) (W.1.adicCompletion L) := + fun W => + (finitePlaceAdicCompletionMap + K L v W).toAlgebra + have hexact := + finiteComponent_norm_eq_prod_exact_index + (K := K) (L := L) v a + change + finiteComponent v (norm K L a) = + ∏ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v}, + LocalFieldTheory.normUnits + (v.adicCompletion K) (W.1.adicCompletion L) + (finiteComponent W.1 a) + calc + finiteComponent v (norm K L a) = + ∏ w : AbsoluteValueExtension vK L, + LocalFieldTheory.normUnits + (v.adicCompletion K) + ((eAbove w).1.adicCompletion L) + (finiteComponent (eAbove w).1 a) := + by + simpa only [eAbove, finitePlaceExtensionEquivAbove_coe] using + hexact + _ = ∏ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v}, + LocalFieldTheory.normUnits + (v.adicCompletion K) (W.1.adicCompletion L) + (finiteComponent W.1 a) := by + exact + Fintype.prod_equiv eAbove + (fun w : AbsoluteValueExtension vK L => + LocalFieldTheory.normUnits + (v.adicCompletion K) + ((eAbove w).1.adicCompletion L) + (finiteComponent (eAbove w).1 a)) + (fun W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v} => + LocalFieldTheory.normUnits + (v.adicCompletion K) (W.1.adicCompletion L) + (finiteComponent W.1 a)) + (fun _ => rfl) + +/-- The absolute-value-extension-coordinate form underlying the public +archimedean formula below. -/ +private theorem infiniteComponent_norm_eq_prod_extensions + (v : InfinitePlace K) + (a : IdeleGroup L) : + let vK := v.1 + let hvK : vK.IsNontrivial := v.isNontrivial + let z := + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L)).symm a + let x := + RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) v z + let x' := + _root_.infinitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) v x + letI := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w => + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : ∀ w : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w.1.Completion := + fun w => + completionModuleFinite vK hvK w + Units.mapEquiv + (_root_.infinitePlaceCompletionAlgEquiv + (K := K) v).toMulEquiv + (infiniteComponent v (norm K L a)) = + ∏ w : AbsoluteValueExtension vK L, + Units.map (Algebra.norm vK.Completion) + (AlgebraicNumberTheory.Valuations.localTensorUnitsEquivCompletionProduct + vK hvK x' w) := by + classical + let vK := v.1 + let hvK : vK.IsNontrivial := v.isNontrivial + let e := + relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) + let z := e.symm a + let x := + RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) v z + let x' := + _root_.infinitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) v x + let := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + let : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w => + AbsoluteValue.completionAlgebra vK w.1 w.2 + let : ∀ w : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w.1.Completion := + fun w => + completionModuleFinite vK hvK w + have hz : e z = a := + e.apply_symm_apply a + change + Units.mapEquiv + (_root_.infinitePlaceCompletionAlgEquiv + (K := K) v).toMulEquiv + (infiniteComponent v (norm K L a)) = + ∏ w : AbsoluteValueExtension vK L, + Units.map (Algebra.norm vK.Completion) + (AlgebraicNumberTheory.Valuations.localTensorUnitsEquivCompletionProduct + vK hvK x' w) + rw [← hz, norm_relativeIdeleBaseChangeMulEquiv, + RelativeIdeleGroup.infiniteComponent_norm] + apply Units.ext + change + _root_.infinitePlaceCompletionAlgEquiv + (K := K) v + (Algebra.norm v.Completion + (x : v.Completion ⊗[K] L)) = + (((∏ w : AbsoluteValueExtension vK L, + Units.map (Algebra.norm vK.Completion) + (AlgebraicNumberTheory.Valuations.localTensorUnitsEquivCompletionProduct + vK hvK x' w)) : + vK.Completionˣ) : vK.Completion) + calc + _root_.infinitePlaceCompletionAlgEquiv + (K := K) v + (Algebra.norm v.Completion + (x : v.Completion ⊗[K] L)) = + Algebra.norm vK.Completion + (x' : vK.Completion ⊗[K] L) := by + exact + map_norm_tensorProduct_baseChange + (K := K) (L := L) + (_root_.infinitePlaceCompletionAlgEquiv + (K := K) v).toAlgHom + (x : v.Completion ⊗[K] L) + _ = ∏ w : AbsoluteValueExtension vK L, + Algebra.norm vK.Completion + (completionTensorDecompositionLeft + (K := K) (L := L) vK hvK + (x' : vK.Completion ⊗[K] L) w) := by + exact + RelativeIdeleGroup.localNorm_units_eq_prod + vK hvK x' + _ = + (((∏ w : AbsoluteValueExtension vK L, + Units.map (Algebra.norm vK.Completion) + (AlgebraicNumberTheory.Valuations.localTensorUnitsEquivCompletionProduct + vK hvK x' w)) : + vK.Completionˣ) : vK.Completion) := by + change _ = Units.coeHom vK.Completion _ + rw [map_prod] + apply Finset.prod_congr rfl + intro w _ + rfl + +/-- The completion-coordinate form underlying the public archimedean +formula below, already reindexed by concrete infinite places. -/ +private theorem infiniteComponent_norm_eq_prod_completion + (v : InfinitePlace K) + (a : IdeleGroup L) : + let vK := v.1 + let hvK : vK.IsNontrivial := v.isNontrivial + let eAbove := + _root_.infinitePlaceAboveEquivExtension + (K := K) (L := L) v + letI := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w => + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : ∀ w : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w.1.Completion := + fun w => + completionModuleFinite vK hvK w + letI : Fintype {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v} := + Fintype.ofEquiv (AbsoluteValueExtension vK L) eAbove.symm + letI : ∀ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v}, + W.1.1.LiesOver vK := + fun W => + ⟨congrArg (fun q : InfinitePlace K => q.1) W.2⟩ + letI : ∀ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v}, + Algebra vK.Completion W.1.1.Completion := + fun W => + AbsoluteValue.completionAlgebra vK W.1.1 + (eAbove W).2 + letI : ∀ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v}, + Module.Finite vK.Completion W.1.1.Completion := + fun W => + completionModuleFinite vK hvK (eAbove W) + Units.mapEquiv + (_root_.infinitePlaceCompletionAlgEquiv + (K := K) v).toMulEquiv + (infiniteComponent v (norm K L a)) = + ∏ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v}, + Units.map (Algebra.norm vK.Completion) + (Units.mapEquiv + (InfinitePlace.Completion.equiv W.1).toMulEquiv + (infiniteComponent W.1 a)) := by + classical + let vK := v.1 + let hvK : vK.IsNontrivial := v.isNontrivial + let e := + relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) + let z := e.symm a + let x := + RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) v z + let x' := + _root_.infinitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) v x + let eAbove := + _root_.infinitePlaceAboveEquivExtension + (K := K) (L := L) v + let := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + let : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w => + AbsoluteValue.completionAlgebra vK w.1 w.2 + let : ∀ w : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w.1.Completion := + fun w => + completionModuleFinite vK hvK w + let : Fintype {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v} := + Fintype.ofEquiv (AbsoluteValueExtension vK L) eAbove.symm + let : ∀ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v}, + W.1.1.LiesOver vK := + fun W => + ⟨congrArg (fun q : InfinitePlace K => q.1) W.2⟩ + let : ∀ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v}, + Algebra vK.Completion W.1.1.Completion := + fun W => + AbsoluteValue.completionAlgebra vK W.1.1 + (eAbove W).2 + let : ∀ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v}, + Module.Finite vK.Completion W.1.1.Completion := + fun W => + completionModuleFinite vK hvK (eAbove W) + have hz : e z = a := + e.apply_symm_apply a + change + Units.mapEquiv + (_root_.infinitePlaceCompletionAlgEquiv + (K := K) v).toMulEquiv + (infiniteComponent v (norm K L a)) = + ∏ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v}, + Units.map (Algebra.norm vK.Completion) + (Units.mapEquiv + (InfinitePlace.Completion.equiv W.1).toMulEquiv + (infiniteComponent W.1 a)) + calc + Units.mapEquiv + (_root_.infinitePlaceCompletionAlgEquiv + (K := K) v).toMulEquiv + (infiniteComponent v (norm K L a)) = + ∏ w : AbsoluteValueExtension vK L, + Units.map (Algebra.norm vK.Completion) + (AlgebraicNumberTheory.Valuations.localTensorUnitsEquivCompletionProduct + vK hvK x' w) := + infiniteComponent_norm_eq_prod_extensions + (K := K) (L := L) v a + _ = ∏ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v}, + Units.map (Algebra.norm vK.Completion) + (AlgebraicNumberTheory.Valuations.localTensorUnitsEquivCompletionProduct + vK hvK x' (eAbove W)) := by + exact + (eAbove.prod_comp + (fun w : AbsoluteValueExtension vK L => + Units.map (Algebra.norm vK.Completion) + (AlgebraicNumberTheory.Valuations.localTensorUnitsEquivCompletionProduct + vK hvK x' w))).symm + _ = ∏ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v}, + Units.map (Algebra.norm vK.Completion) + (Units.mapEquiv + (InfinitePlace.Completion.equiv W.1).toMulEquiv + (infiniteComponent W.1 a)) := by + apply Finset.prod_congr rfl + intro W _ + apply congrArg (Units.map (Algebra.norm vK.Completion)) + have hcomponent := + congrArg (fun b : IdeleGroup L => infiniteComponent W.1 b) hz + change + _root_.infinitePlaceTensorUnitsEquivAbove + (K := K) (L := L) + (_root_.infinitePlaceBelow (K := K) W.1) + ((_root_.relativeIdeleToLocalData + (K := K) (L := L) z).infinite + (_root_.infinitePlaceBelow (K := K) W.1)) + ⟨W.1, rfl⟩ = + infiniteComponent W.1 a at hcomponent + simp only [_root_.relativeIdeleToLocalData] at hcomponent + have hcomponentFixed : + _root_.infinitePlaceTensorUnitsEquivAbove + (K := K) (L := L) v x W = + infiniteComponent W.1 a := by + let W₀ : InfinitePlace L := W.1 + let P : InfinitePlace K → Prop := fun q => + ∀ hq : _root_.infinitePlaceBelow (K := K) W₀ = q, + _root_.infinitePlaceTensorUnitsEquivAbove + (K := K) (L := L) q + (RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) q z) + ⟨W₀, hq⟩ = + infiniteComponent W₀ a + have hP : + P (_root_.infinitePlaceBelow (K := K) W₀) := by + intro hq + simpa only [P, W₀] using hcomponent + have hW : + _root_.infinitePlaceBelow (K := K) W₀ = v := + W.2 + have hPv : P v := + hW ▸ hP + simpa only [P, W₀, x] using hPv W.2 + rw [_root_.infinitePlaceTensorUnitsEquivAbove_apply] + at hcomponentFixed + apply + (Units.mapEquiv + (InfinitePlace.Completion.equiv W.1).symm.toMulEquiv).injective + rw [hcomponentFixed] + apply Units.ext + exact + ((InfinitePlace.Completion.equiv W.1).symm_apply_apply _).symm + +/-- The archimedean form of the ordinary idele norm. The component +at `v` is the product of the ordinary field norms of the actual idele +components at the infinite places above `v`. -/ +theorem infiniteComponent_norm_eq_prod + (v : InfinitePlace K) + (a : IdeleGroup L) : + let vK := v.1 + let hvK : vK.IsNontrivial := v.isNontrivial + let eAbove := + _root_.infinitePlaceAboveEquivExtension + (K := K) (L := L) v + letI := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + letI : Fintype {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v} := + Fintype.ofEquiv + (AbsoluteValueExtension vK L) eAbove.symm + letI : ∀ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v}, + W.1.1.LiesOver v.1 := + fun W => + ⟨congrArg (fun q : InfinitePlace K => q.1) W.2⟩ + infiniteComponent v (norm K L a) = + ∏ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v}, + LocalFieldTheory.normUnits + v.Completion W.1.Completion + (infiniteComponent W.1 a) := by + classical + let vK := v.1 + let hvK : vK.IsNontrivial := v.isNontrivial + let eBase := + _root_.infinitePlaceCompletionAlgEquiv + (K := K) v + let eAbove := + _root_.infinitePlaceAboveEquivExtension + (K := K) (L := L) v + let := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + let : Fintype {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v} := + Fintype.ofEquiv (AbsoluteValueExtension vK L) eAbove.symm + let : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w => + AbsoluteValue.completionAlgebra vK w.1 w.2 + let : ∀ w : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w.1.Completion := + fun w => + completionModuleFinite vK hvK w + let : ∀ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v}, + W.1.1.LiesOver v.1 := + fun W => + ⟨congrArg (fun q : InfinitePlace K => q.1) W.2⟩ + let : ∀ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v}, + Algebra vK.Completion W.1.1.Completion := + fun W => + AbsoluteValue.completionAlgebra vK W.1.1 + (eAbove W).2 + let : ∀ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v}, + Module.Finite vK.Completion W.1.1.Completion := + fun W => + completionModuleFinite vK hvK (eAbove W) + have hcompletion := + infiniteComponent_norm_eq_prod_completion + (K := K) (L := L) v a + change + infiniteComponent v (norm K L a) = + ∏ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v}, + LocalFieldTheory.normUnits + v.Completion W.1.Completion + (infiniteComponent W.1 a) + calc + infiniteComponent v (norm K L a) = + Units.mapEquiv eBase.symm.toMulEquiv + (Units.mapEquiv eBase.toMulEquiv + (infiniteComponent v (norm K L a))) := by + apply Units.ext + simp + _ = Units.mapEquiv eBase.symm.toMulEquiv + (∏ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v}, + Units.map (Algebra.norm vK.Completion) + (Units.mapEquiv + (InfinitePlace.Completion.equiv W.1).toMulEquiv + (infiniteComponent W.1 a))) := by + exact + congrArg (Units.mapEquiv eBase.symm.toMulEquiv) hcompletion + _ = ∏ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v}, + Units.mapEquiv eBase.symm.toMulEquiv + (Units.map (Algebra.norm vK.Completion) + (Units.mapEquiv + (InfinitePlace.Completion.equiv W.1).toMulEquiv + (infiniteComponent W.1 a))) := by + rw [map_prod] + _ = ∏ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v}, + LocalFieldTheory.normUnits + v.Completion W.1.Completion + (infiniteComponent W.1 a) := by + apply Finset.prod_congr rfl + intro W _ + let eExtension := + (InfinitePlace.Completion.equiv W.1).symm + let x : W.1.1.Completionˣ := + Units.mapEquiv + (InfinitePlace.Completion.equiv W.1).toMulEquiv + (infiniteComponent W.1 a) + have hWrapperCompletion : + RingHom.comp + (algebraMap v.1.Completion W.1.1.Completion) + eBase.toRingEquiv = + RingHom.comp + (InfinitePlace.Completion.equiv W.1).toRingHom + (algebraMap v.Completion W.1.Completion) := by + have hComparison := + _root_.infinitePlaceCompletionAlgEquiv_algebraMap + (K := K) (L := L) v W.1 W.2 + dsimp only [eBase, infinitePlaceCompletionAlgEquiv] at hComparison ⊢ + exact hComparison + have hCompatible := + LocalClassFieldTheory.ringEquiv_compat_symm + eBase.toRingEquiv + (InfinitePlace.Completion.equiv W.1) + hWrapperCompletion + have hNorm := + LocalClassFieldTheory.normUnits_map_ringEquiv + eBase.symm.toRingEquiv eExtension hCompatible x + have hx : + Units.mapEquiv eExtension.toMulEquiv x = + infiniteComponent W.1 a := by + apply Units.ext + change + (InfinitePlace.Completion.equiv W.1).symm + ((InfinitePlace.Completion.equiv W.1) + (infiniteComponent W.1 a : W.1.Completion)) = + (infiniteComponent W.1 a : W.1.Completion) + exact + (InfinitePlace.Completion.equiv W.1).symm_apply_apply _ + rw [hx] at hNorm + change + Units.mapEquiv eBase.symm.toMulEquiv + (LocalFieldTheory.normUnits + vK.Completion W.1.1.Completion x) = + LocalFieldTheory.normUnits + v.Completion W.1.Completion + (infiniteComponent W.1 a) + exact hNorm + +end IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/InfiniteOnePlaceBaseNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/InfiniteOnePlaceBaseNorm.lean new file mode 100644 index 0000000000..5cb2a8b0ae --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/InfiniteOnePlaceBaseNorm.lean @@ -0,0 +1,306 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Norm +/-! +# Norms of base units supported at one infinite place + +For an infinite place `W` of an extension field, a unit of the +completion at the place below `W` can be extended to `W` and inserted +as a one-place idele. Its ordinary idele norm remains supported at the +place below `W`; the surviving component is the corresponding local +degree power. +-/ + +@[expose] public section + +open scoped BigOperators NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace IdeleGroup + +universe u v + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + +/-- Extend a unit of the completion below `W` to the completion at +`W`. -/ +noncomputable def infinitePlaceBaseUnitExtension + (W : InfinitePlace L) : + ((_root_.infinitePlaceBelow (K := K) W).Completion)ˣ →* + W.Completionˣ := by + letI : W.1.LiesOver + (_root_.infinitePlaceBelow (K := K) W).1 := + ⟨rfl⟩ + exact + Units.map + (NumberField.LiesOver.completionMap + (v := _root_.infinitePlaceBelow (K := K) W) + (w := W)).toMonoidHom + +/-- The actual completion map carries negative one to negative one. -/ +@[simp] +theorem infinitePlaceBaseUnitExtension_neg_one + (W : InfinitePlace L) : + infinitePlaceBaseUnitExtension + (K := K) (L := L) W + (-1 : + ((_root_.infinitePlaceBelow (K := K) W).Completion)ˣ) = + (-1 : W.Completionˣ) := by + let : W.1.LiesOver + (_root_.infinitePlaceBelow (K := K) W).1 := + ⟨rfl⟩ + apply Units.ext + simp [infinitePlaceBaseUnitExtension] + +/-- The degree of the completed extension at `W` over the completion +at the place below it. -/ +noncomputable def infinitePlaceCompletionDegree + (W : InfinitePlace L) : ℕ := by + let v := _root_.infinitePlaceBelow (K := K) W + letI : W.1.LiesOver v.1 := ⟨rfl⟩ + letI : Algebra v.Completion W.Completion := + (NumberField.LiesOver.completionMap (v := v) (w := W)).toAlgebra + exact Module.finrank v.Completion W.Completion + +/-- The idele norm of a base-completion unit supported at one +extension infinite place is the corresponding local-degree power +supported at the place below it. -/ +theorem norm_infinitePlaceIdele_infinitePlaceBaseUnitExtension + (W : InfinitePlace L) + (x : + ((_root_.infinitePlaceBelow (K := K) W).Completion)ˣ) : + norm K L + (infinitePlaceIdele W + (infinitePlaceBaseUnitExtension + (K := K) (L := L) W x)) = + infinitePlaceIdele + (_root_.infinitePlaceBelow (K := K) W) + (x ^ infinitePlaceCompletionDegree + (K := K) (L := L) W) := by + classical + let v := _root_.infinitePlaceBelow (K := K) W + let W₀ : + {U : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) U = v} := + ⟨W, rfl⟩ + apply Prod.ext + · apply ContinuousMulEquiv.piUnits.injective + funext r + change + infiniteComponent r + (norm K L + (infinitePlaceIdele W + (infinitePlaceBaseUnitExtension + (K := K) (L := L) W x))) = + infiniteComponent r + (infinitePlaceIdele v + (x ^ infinitePlaceCompletionDegree + (K := K) (L := L) W)) + by_cases hr : r = v + · subst r + rw [infiniteComponent_norm_eq_prod, + infinitePlaceIdele_infiniteComponent_same] + rw [Finset.prod_eq_single W₀] + · rw [infinitePlaceIdele_infiniteComponent_same] + let : W.1.LiesOver v.1 := ⟨rfl⟩ + let : Algebra v.Completion W.Completion := + (NumberField.LiesOver.completionMap (v := v) (w := W)).toAlgebra + have hmap : + algebraMap v.Completion W.Completion = + NumberField.LiesOver.completionMap (v := v) (w := W) := + RingHom.algebraMap_toAlgebra _ + change + LocalFieldTheory.normUnits v.Completion W.Completion + (Units.map + (NumberField.LiesOver.completionMap (v := v) (w := W)).toMonoidHom + x) = + x ^ Module.finrank v.Completion W.Completion + rw [← hmap] + simpa [ + LocalFieldTheory.IsNonarchimedeanLocalField.mapBaseUnitsToExtensionUnits, + MonoidHom.id_apply] using + (LocalFieldTheory.IsNonarchimedeanLocalField.normUnits_algebraMap_base + (K := v.Completion) (L := W.Completion) x) + · intro U _ hU + have hUW : U.1 ≠ W := by + intro h + apply hU + exact Subtype.ext h + rw [ + infinitePlaceIdele_infiniteComponent_of_ne + W U.1 + (infinitePlaceBaseUnitExtension + (K := K) (L := L) W x) + hUW, + map_one] + · simp + · rw [ + infiniteComponent_norm_eq_prod, + infinitePlaceIdele_infiniteComponent_of_ne + v r + (x ^ infinitePlaceCompletionDegree + (K := K) (L := L) W) + hr] + apply Finset.prod_eq_one + intro U _ + have hUW : U.1 ≠ W := by + intro h + apply hr + calc + r = _root_.infinitePlaceBelow (K := K) U.1 := + U.2.symm + _ = v := by rw [h] + rw [ + infinitePlaceIdele_infiniteComponent_of_ne + W U.1 + (infinitePlaceBaseUnitExtension + (K := K) (L := L) W x) + hUW, + map_one] + · apply RestrictedProduct.ext + intro q + change + finiteComponent q + (norm K L + (infinitePlaceIdele W + (infinitePlaceBaseUnitExtension + (K := K) (L := L) W x))) = + finiteComponent q + (infinitePlaceIdele v + (x ^ infinitePlaceCompletionDegree + (K := K) (L := L) W)) + rw [finiteComponent_norm_eq_prod, + infinitePlaceIdele_finiteComponent] + apply Finset.prod_eq_one + intro U _ + rw [infinitePlaceIdele_finiteComponent, map_one] + +/-- If the chosen infinite place is unramified over the base, the +completed extension has degree one, so the norm of the extended +one-place idele is exactly the original one-place idele. -/ +theorem norm_infinitePlaceIdele_infinitePlaceBaseUnitExtension_of_isUnramified + (W : InfinitePlace L) + (hW : W.IsUnramified K) + (x : + ((_root_.infinitePlaceBelow (K := K) W).Completion)ˣ) : + norm K L + (infinitePlaceIdele W + (infinitePlaceBaseUnitExtension + (K := K) (L := L) W x)) = + infinitePlaceIdele + (_root_.infinitePlaceBelow (K := K) W) x := by + let v := _root_.infinitePlaceBelow (K := K) W + let : W.1.LiesOver v.1 := ⟨rfl⟩ + let : Algebra v.Completion W.Completion := + (NumberField.LiesOver.completionMap (v := v) (w := W)).toAlgebra + have hDegree : + Module.finrank v.Completion W.Completion = 1 := + InfinitePlace.IsUnramified.finrank_eq_one + v hW + rw [ + norm_infinitePlaceIdele_infinitePlaceBaseUnitExtension, + show infinitePlaceCompletionDegree + (K := K) (L := L) W = 1 by + simpa only [infinitePlaceCompletionDegree, v] using hDegree, + pow_one] + +/-- A real infinite place upstairs is unramified over every lower +number field, so the one-place norm of an extended base unit is +unchanged. -/ +theorem norm_infinitePlaceIdele_infinitePlaceBaseUnitExtension_of_isReal + (W : InfinitePlace L) + (hWReal : W.IsReal) + (x : + ((_root_.infinitePlaceBelow (K := K) W).Completion)ˣ) : + norm K L + (infinitePlaceIdele W + (infinitePlaceBaseUnitExtension + (K := K) (L := L) W x)) = + infinitePlaceIdele + (_root_.infinitePlaceBelow (K := K) W) x := by + apply + norm_infinitePlaceIdele_infinitePlaceBaseUnitExtension_of_isUnramified + (K := K) (L := L) W + exact InfinitePlace.isUnramified_iff.mpr (Or.inl hWReal) + +/-- The degree-one one-place norm equality descends verbatim to the +actual idele class groups. -/ +theorem ideleClassNorm_infinitePlaceIdeleClass_infinitePlaceBaseUnitExtension_of_isUnramified + (W : InfinitePlace L) + (hW : W.IsUnramified K) + (x : + ((_root_.infinitePlaceBelow (K := K) W).Completion)ˣ) : + _root_.ideleClassNorm K L + (infinitePlaceIdeleClass W + (infinitePlaceBaseUnitExtension + (K := K) (L := L) W x)) = + infinitePlaceIdeleClass + (_root_.infinitePlaceBelow (K := K) W) x := by + change + _root_.ideleClassNorm K L + (QuotientGroup.mk' + (principalSubgroup L) + (infinitePlaceIdele W + (infinitePlaceBaseUnitExtension + (K := K) (L := L) W x))) = + QuotientGroup.mk' + (principalSubgroup K) + (infinitePlaceIdele + (_root_.infinitePlaceBelow (K := K) W) x) + rw [ + _root_.ideleClassNorm_mk, + norm_infinitePlaceIdele_infinitePlaceBaseUnitExtension_of_isUnramified + (K := K) (L := L) W hW x] + +/-- Idele-class form of the one-place norm equality at a real place +upstairs. -/ +theorem ideleClassNorm_infinitePlaceIdeleClass_infinitePlaceBaseUnitExtension_of_isReal + (W : InfinitePlace L) + (hWReal : W.IsReal) + (x : + ((_root_.infinitePlaceBelow (K := K) W).Completion)ˣ) : + _root_.ideleClassNorm K L + (infinitePlaceIdeleClass W + (infinitePlaceBaseUnitExtension + (K := K) (L := L) W x)) = + infinitePlaceIdeleClass + (_root_.infinitePlaceBelow (K := K) W) x := by + apply + ideleClassNorm_infinitePlaceIdeleClass_infinitePlaceBaseUnitExtension_of_isUnramified + (K := K) (L := L) W + exact InfinitePlace.isUnramified_iff.mpr (Or.inl hWReal) + +/-- At a real place upstairs, the idele-class norm of the one-place +negative-one class is the one-place negative-one class below. -/ +theorem ideleClassNorm_infinitePlaceIdeleClass_neg_one_of_isReal + (W : InfinitePlace L) + (hWReal : W.IsReal) : + _root_.ideleClassNorm K L + (infinitePlaceIdeleClass W (-1 : W.Completionˣ)) = + infinitePlaceIdeleClass + (_root_.infinitePlaceBelow (K := K) W) + (-1 : + ((_root_.infinitePlaceBelow (K := K) W).Completion)ˣ) := by + rw [← infinitePlaceBaseUnitExtension_neg_one + (K := K) (L := L) W] + exact + ideleClassNorm_infinitePlaceIdeleClass_infinitePlaceBaseUnitExtension_of_isReal + (K := K) (L := L) W hWReal + (-1 : + ((_root_.infinitePlaceBelow (K := K) W).Completion)ˣ) + +end IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalComponent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalComponent.lean new file mode 100644 index 0000000000..ea687b5e46 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalComponent.lean @@ -0,0 +1,405 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisNorm +/-! +# Local components of relative adeles and ideles + +For a finite place `v` of `K`, evaluation on the finite-adele coordinate is +a `K`-algebra homomorphism `𝔸_K → K_v`. Scalar extension along `L/K` +therefore gives the actual local component map + +`𝔸_K ⊗[K] L → K_v ⊗[K] L`. + +This is the map needed to apply the local tensor decomposition and the local +norm calculation to a genuine relative idele. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + + +universe u v + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +/-- Evaluation of an adele at an infinite place, as a `K`-algebra +homomorphism. -/ +def infiniteAdeleComponentAlgHom + (v : InfinitePlace K) : + NumberField.AdeleRing (𝓞 K) K →ₐ[K] + v.Completion := + (Pi.evalAlgHom K + (fun w : InfinitePlace K => w.Completion) v).comp + (AlgHom.fst K + (NumberField.InfiniteAdeleRing K) + (FiniteAdeleRing (𝓞 K) K)) + +@[simp] +theorem infiniteAdeleComponentAlgHom_apply + (v : InfinitePlace K) + (a : NumberField.AdeleRing (𝓞 K) K) : + infiniteAdeleComponentAlgHom v a = a.1 v := + rfl + +@[simp] +theorem infiniteAdeleComponentAlgHom_algebraMap + (v : InfinitePlace K) (x : K) : + infiniteAdeleComponentAlgHom v + (algebraMap K + (NumberField.AdeleRing (𝓞 K) K) x) = + algebraMap K v.Completion x := + rfl + +/-- The relative-adele component at an infinite place: +`𝔸_K ⊗[K] L → K_v ⊗[K] L`. -/ +def relativeAdeleInfiniteComponent + (v : InfinitePlace K) : + RelativeAdeleRing K L →ₐ[K] + v.Completion ⊗[K] L := + Algebra.TensorProduct.map + (infiniteAdeleComponentAlgHom v) + (AlgHom.id K L) + +omit [NumberField L] [FiniteDimensional K L] in +@[simp] +theorem relativeAdeleInfiniteComponent_tmul + (v : InfinitePlace K) + (a : NumberField.AdeleRing (𝓞 K) K) (x : L) : + relativeAdeleInfiniteComponent + (K := K) (L := L) v (a ⊗ₜ[K] x) = + a.1 v ⊗ₜ[K] x := by + simp [relativeAdeleInfiniteComponent] + +/-- Evaluation of an adele at a finite place, as a `K`-algebra +homomorphism. -/ +def finiteAdeleComponentAlgHom + (v : HeightOneSpectrum (𝓞 K)) : + NumberField.AdeleRing (𝓞 K) K →ₐ[K] + v.adicCompletion K := + { __ := + (RestrictedProduct.evalRingHom + (fun w : HeightOneSpectrum (𝓞 K) => + w.adicCompletion K) v).comp + (RingHom.snd + (NumberField.InfiniteAdeleRing K) + (FiniteAdeleRing (𝓞 K) K)) + commutes' := by + intro x + rfl } + +@[simp] +theorem finiteAdeleComponentAlgHom_apply + (v : HeightOneSpectrum (𝓞 K)) + (a : NumberField.AdeleRing (𝓞 K) K) : + finiteAdeleComponentAlgHom v a = a.2 v := + rfl + +theorem finiteAdeleComponentAlgHom_algebraMap + (v : HeightOneSpectrum (𝓞 K)) (x : K) : + finiteAdeleComponentAlgHom v + (algebraMap K + (NumberField.AdeleRing (𝓞 K) K) x) = + algebraMap K (v.adicCompletion K) x := + rfl + +omit [NumberField L] [FiniteDimensional K L] in +/-- The relative-adele component at a finite place: +`𝔸_K ⊗[K] L → K_v ⊗[K] L`. -/ +def relativeAdeleFiniteComponent + (v : HeightOneSpectrum (𝓞 K)) : + RelativeAdeleRing K L →ₐ[K] + v.adicCompletion K ⊗[K] L := + Algebra.TensorProduct.map + (finiteAdeleComponentAlgHom v) + (AlgHom.id K L) + +omit [NumberField L] [FiniteDimensional K L] in +@[simp] +theorem relativeAdeleFiniteComponent_tmul + (v : HeightOneSpectrum (𝓞 K)) + (a : NumberField.AdeleRing (𝓞 K) K) (x : L) : + relativeAdeleFiniteComponent (K := K) (L := L) v + (a ⊗ₜ[K] x) = + a.2 v ⊗ₜ[K] x := by + simp [relativeAdeleFiniteComponent] + +omit [NumberField K] [NumberField L] in +/-- Determinant norm commutes with scalar extension along a homomorphism +of coefficient algebras. This is the base-change identity needed to +compare the global relative-idele norm with each local tensor norm. -/ +theorem map_norm_tensorProduct_baseChange + {A : Type*} {B : Type*} + [CommRing A] [CommRing B] + [Algebra K A] [Algebra K B] + [Nontrivial A] [Nontrivial B] + (f : A →ₐ[K] B) (z : A ⊗[K] L) : + f (Algebra.norm A z) = + Algebra.norm B + (Algebra.TensorProduct.map f (AlgHom.id K L) z) := by + classical + let b := Module.Free.chooseBasis K L + have hrepr : + ∀ i, + (Algebra.TensorProduct.basis B b).repr + (Algebra.TensorProduct.map f + (AlgHom.id K L) z) i = + f ((Algebra.TensorProduct.basis A b).repr z i) := by + intro i + induction z using TensorProduct.inductionOn with + | add x y hx hy => + simp [map_add, hx, hy] + | tmul a x => + simp + calc + f (Algebra.norm A z) = + f + (MvPolynomial.eval₂ (algebraMap K A) + ((Algebra.TensorProduct.basis A b).repr z) + (RelativeIdeleGroup.normPolynomial b)) := by + rw [RelativeIdeleGroup.eval₂_normPolynomial_baseChange] + _ = + MvPolynomial.eval₂ + (f.toRingHom.comp (algebraMap K A)) + (fun i => f + ((Algebra.TensorProduct.basis A b).repr z i)) + (RelativeIdeleGroup.normPolynomial b) := + MvPolynomial.hom_eval₂ + (RelativeIdeleGroup.normPolynomial b) + (algebraMap K A) f.toRingHom _ + _ = + MvPolynomial.eval₂ (algebraMap K B) + ((Algebra.TensorProduct.basis B b).repr + (Algebra.TensorProduct.map f + (AlgHom.id K L) z)) + (RelativeIdeleGroup.normPolynomial b) := by + congr 1 + · ext x + exact f.commutes x + · funext i + exact (hrepr i).symm + _ = + Algebra.norm B + (Algebra.TensorProduct.map f + (AlgHom.id K L) z) := + RelativeIdeleGroup.eval₂_normPolynomial_baseChange + B b _ + +/-- The unit-valued infinite component of a relative idele. -/ +def RelativeIdeleGroup.infiniteComponent + (v : InfinitePlace K) : + RelativeIdeleGroup K L →* + (v.Completion ⊗[K] L)ˣ := + Units.map + (relativeAdeleInfiniteComponent + (K := K) (L := L) v).toRingHom + +omit [NumberField L] [FiniteDimensional K L] in +@[simp] +theorem RelativeIdeleGroup.infiniteComponent_coe + (v : InfinitePlace K) + (a : RelativeIdeleGroup K L) : + ((RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) v a : + (v.Completion ⊗[K] L)ˣ) : + v.Completion ⊗[K] L) = + relativeAdeleInfiniteComponent + (K := K) (L := L) v + (a : RelativeAdeleRing K L) := + rfl + +/-- The unit-valued local component of a relative idele. -/ +def RelativeIdeleGroup.finiteComponent + (v : HeightOneSpectrum (𝓞 K)) : + RelativeIdeleGroup K L →* + (v.adicCompletion K ⊗[K] L)ˣ := + Units.map + (relativeAdeleFiniteComponent + (K := K) (L := L) v).toRingHom + +omit [NumberField L] [FiniteDimensional K L] in +@[simp] +theorem RelativeIdeleGroup.finiteComponent_coe + (v : HeightOneSpectrum (𝓞 K)) + (a : RelativeIdeleGroup K L) : + ((RelativeIdeleGroup.finiteComponent + (K := K) (L := L) v a : + (v.adicCompletion K ⊗[K] L)ˣ) : + v.adicCompletion K ⊗[K] L) = + relativeAdeleFiniteComponent + (K := K) (L := L) v + (a : RelativeAdeleRing K L) := + rfl + +/-- The determinant norm on the local tensor algebra. -/ +def localTensorNorm + (v : HeightOneSpectrum (𝓞 K)) : + (v.adicCompletion K ⊗[K] L)ˣ →* + (v.adicCompletion K)ˣ := + Units.map (Algebra.norm (v.adicCompletion K)) + +omit [NumberField L] in +/-- The finite component of the global relative-idele norm is the +determinant norm of the corresponding local tensor component. -/ +theorem RelativeIdeleGroup.finiteComponent_norm + (v : HeightOneSpectrum (𝓞 K)) + (a : RelativeIdeleGroup K L) : + IdeleGroup.finiteComponent v + (RelativeIdeleGroup.norm K L a) = + localTensorNorm (K := K) (L := L) v + (RelativeIdeleGroup.finiteComponent + (K := K) (L := L) v a) := by + apply Units.ext + change + finiteAdeleComponentAlgHom v + (Algebra.norm + (NumberField.AdeleRing (𝓞 K) K) + (a : RelativeAdeleRing K L)) = + Algebra.norm (v.adicCompletion K) + (relativeAdeleFiniteComponent + (K := K) (L := L) v + (a : RelativeAdeleRing K L)) + exact map_norm_tensorProduct_baseChange + (K := K) (L := L) + (finiteAdeleComponentAlgHom v) + (a : RelativeAdeleRing K L) + +omit [NumberField L] in +/-- The infinite component of the global relative-idele norm is the +determinant norm of the corresponding archimedean tensor component. -/ +theorem RelativeIdeleGroup.infiniteComponent_norm + (v : InfinitePlace K) + (a : RelativeIdeleGroup K L) : + IdeleGroup.infiniteComponent v + (RelativeIdeleGroup.norm K L a) = + Units.map (Algebra.norm v.Completion) + (RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) v a) := by + apply Units.ext + change + infiniteAdeleComponentAlgHom v + (Algebra.norm + (NumberField.AdeleRing (𝓞 K) K) + (a : RelativeAdeleRing K L)) = + Algebra.norm v.Completion + (relativeAdeleInfiniteComponent + (K := K) (L := L) v + (a : RelativeAdeleRing K L)) + exact map_norm_tensorProduct_baseChange + (K := K) (L := L) + (infiniteAdeleComponentAlgHom v) + (a : RelativeAdeleRing K L) + +/-- Scalar extension of an archimedean base-field unit into its local +tensor algebra. -/ +def infiniteLocalIdeleInclusion + (v : InfinitePlace K) : + v.Completionˣ →* + (v.Completion ⊗[K] L)ˣ := + Units.map + (Algebra.TensorProduct.includeLeft + (R := K) (S := K) + (A := v.Completion) (B := L)).toRingHom + +/-- Scalar extension of an extension-field unit into an archimedean +local tensor algebra. -/ +def infiniteLocalFieldIdeleInclusion + (v : InfinitePlace K) : + Lˣ →* (v.Completion ⊗[K] L)ˣ := + Units.map + (Algebra.TensorProduct.includeRight + (R := K) (A := v.Completion) + (B := L)).toRingHom + +omit [NumberField L] [FiniteDimensional K L] in +/-- The infinite component of a globally included idele is scalar +extension of its ordinary infinite component. -/ +@[simp] +theorem RelativeIdeleGroup.infiniteComponent_inclusion + (v : InfinitePlace K) + (a : IdeleGroup K) : + RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) v + (RelativeIdeleGroup.inclusion K L a) = + infiniteLocalIdeleInclusion + (K := K) (L := L) v + (IdeleGroup.infiniteComponent v a) := by + apply Units.ext + rfl + +omit [NumberField L] [FiniteDimensional K L] in +/-- The infinite component of a principal relative idele is the +diagonal extension-field unit in the local tensor algebra. -/ +@[simp] +theorem RelativeIdeleGroup.infiniteComponent_principalIdele + (v : InfinitePlace K) (x : Lˣ) : + RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) v + (RelativeIdeleGroup.principalIdele K L x) = + infiniteLocalFieldIdeleInclusion + (K := K) (L := L) v x := by + apply Units.ext + rfl + +/-- Scalar extension of a local base-field unit into the local tensor +algebra. -/ +def localIdeleInclusion + (v : HeightOneSpectrum (𝓞 K)) : + (v.adicCompletion K)ˣ →* + (v.adicCompletion K ⊗[K] L)ˣ := + Units.map + (Algebra.TensorProduct.includeLeft + (R := K) (S := K) + (A := v.adicCompletion K) (B := L)).toRingHom + +omit [NumberField L] [FiniteDimensional K L] in +/-- The local component of the globally included idele is the scalar +extension of its ordinary local component. -/ +@[simp] +theorem RelativeIdeleGroup.finiteComponent_inclusion + (v : HeightOneSpectrum (𝓞 K)) + (a : IdeleGroup K) : + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) v + (RelativeIdeleGroup.inclusion K L a) = + localIdeleInclusion (K := K) (L := L) v + (IdeleGroup.finiteComponent v a) := by + apply Units.ext + rfl + +/-- Scalar extension of an extension-field unit into the local tensor +algebra. -/ +def localFieldIdeleInclusion + (v : HeightOneSpectrum (𝓞 K)) : + Lˣ →* (v.adicCompletion K ⊗[K] L)ˣ := + Units.map + (Algebra.TensorProduct.includeRight + (R := K) (A := v.adicCompletion K) + (B := L)).toRingHom + +omit [NumberField L] [FiniteDimensional K L] in +/-- The local component of a principal relative idele is the diagonal +extension-field unit in the local tensor algebra. -/ +@[simp] +theorem RelativeIdeleGroup.finiteComponent_principalIdele + (v : HeightOneSpectrum (𝓞 K)) (x : Lˣ) : + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) v + (RelativeIdeleGroup.principalIdele K L x) = + localFieldIdeleInclusion (K := K) (L := L) v x := by + apply Units.ext + rfl diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalNorm.lean new file mode 100644 index 0000000000..b88c62ec85 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalNorm.lean @@ -0,0 +1,116 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.BaseChange +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.DegreeNormTrace +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteProductNormTrace +/-! +# Local components of the idele norm + +The local algebra at a place of the base field is a finite product of the +completions above it. This file proves that the determinant norm on a finite +product is the product of the norms of its factors. The last theorem applies +this calculation to the canonical completion decomposition. +-/ + +@[expose] public section + +open scoped BigOperators TensorProduct + +noncomputable +section + + +namespace RelativeIdeleGroup + +open AlgebraicNumberTheory.Valuations +open ValuationTheory.Completion + +universe u v + +/-- At one place of the base field, under the +canonical isomorphism + +`K_v ⊗[K] L ≃ ∏_{w ∣ v} L_w`, + +the determinant norm of an arbitrary local component is the product of +the field norms of its components above `v`. -/ +theorem localNorm_eq_prod + {K : Type u} {L : Type v} + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (z : vK.Completion ⊗[K] L) : + letI := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : ∀ w : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w.1.Completion := + fun w ↦ completionModuleFinite vK hvK w + _root_.Algebra.norm vK.Completion z = + ∏ w : AbsoluteValueExtension vK L, + _root_.Algebra.norm vK.Completion + (completionTensorDecompositionLeft + (K := K) (L := L) vK hvK z w) := by + classical + let := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + let : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + let : ∀ w : AbsoluteValueExtension vK L, + Module.Free vK.Completion w.1.Completion := + fun w ↦ Module.Free.of_divisionRing + vK.Completion w.1.Completion + let : ∀ w : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w.1.Completion := + fun w ↦ completionModuleFinite vK hvK w + let e := + completionTensorDecompositionLeft + (K := K) (L := L) vK hvK + calc + _root_.Algebra.norm vK.Completion z = + _root_.Algebra.norm vK.Completion (e z) := + (_root_.Algebra.norm_eq_of_algEquiv e z).symm + _ = ∏ w : AbsoluteValueExtension vK L, + _root_.Algebra.norm vK.Completion (e z w) := + algebra_norm_pi_apply + (R := vK.Completion) + (fun w : AbsoluteValueExtension vK L ↦ + w.1.Completion) (e z) + +/-- The unit-valued version of `localNorm_eq_prod`, which is the formula +used for local components of ideles. -/ +theorem localNorm_units_eq_prod + {K : Type u} {L : Type v} + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (z : (vK.Completion ⊗[K] L)ˣ) : + letI := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : ∀ w : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w.1.Completion := + fun w ↦ completionModuleFinite vK hvK w + ((Units.map (_root_.Algebra.norm vK.Completion) z : + vK.Completionˣ) : vK.Completion) = + ∏ w : AbsoluteValueExtension vK L, + _root_.Algebra.norm vK.Completion + (completionTensorDecompositionLeft + (K := K) (L := L) vK hvK (z : _) w) := by + exact localNorm_eq_prod vK hvK (z : vK.Completion ⊗[K] L) + +end RelativeIdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormLocalOrder.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormLocalOrder.lean new file mode 100644 index 0000000000..0a91b3f6ff --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormLocalOrder.lean @@ -0,0 +1,462 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.SeparableNormValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness +public import Mathlib.RingTheory.RamificationInertia.Inertia +/-! +# Local orders of finite-place norms + +For a finite extension of number fields and a place upstairs, the order of +the concrete local field norm is the inertia degree times the upstairs +order. The proof uses the actual norm–valuation theorem for finite separable +local-field extensions. The two normalization comparisons needed here are +also concrete: + +* the intrinsic local-field valuation is compared with the distinguished + `ℤᵐ⁰`-valued completion valuation; +* the residue degree of the completed extension is identified with the + inertia degree of the corresponding prime of the number-field extension. +-/ + +@[expose] public section + +open scoped NumberField ValuativeRel WithZero +open NumberField IsDedekindDomain + +noncomputable +section + +namespace FiniteIdeleGroup + +universe u v w + +private lemma withZeroMultiplicativeInt_le_exp_neg_one_of_lt_one + (γ : WithZero (Multiplicative ℤ)) (hγ : γ < 1) : + γ ≤ WithZero.exp (-1 : ℤ) := by + cases γ using WithZero.recZeroCoe with + | zero => + exact bot_le + | coe γ => + rw [WithZero.exp_eq_coe_ofAdd, WithZero.coe_le_coe] + rw [← Multiplicative.toAdd_le] + change Multiplicative.toAdd γ ≤ (-1 : ℤ) + have hγ' : Multiplicative.toAdd γ < (0 : ℤ) := by + have : γ < (1 : Multiplicative ℤ) := by + simpa using hγ + change + Multiplicative.toAdd γ < + Multiplicative.toAdd (1 : Multiplicative ℤ) + exact Multiplicative.toAdd_lt.mpr this + omega + +/-- A surjective standard integer valuation gives the same normalized +integer value as the intrinsic local-field valuation. -/ +private theorem normalizedValue_eq_withZeroLog_of_surjective + (F : Type w) + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + (ν : Valuation F (WithZero (Multiplicative ℤ))) + [ν.Compatible] + (hν : Function.Surjective ν) + (x : Fˣ) : + LocalFieldTheory.IsNonarchimedeanLocalField.v F + (Additive.ofMul x) = + WithZero.log (ν (x : F)) := by + let ν₀ := ValuativeRel.valuation F + have hEquiv : ν₀.IsEquiv ν := + ValuativeRel.isEquiv ν₀ ν + obtain ⟨π, hπ⟩ := + hν (WithZero.exp (-1 : ℤ)) + have hπ0 : π ≠ 0 := by + intro h + rw [h, map_zero] at hπ + exact WithZero.exp_ne_zero hπ.symm + let ϖ : Fˣ := Units.mk0 π hπ0 + have hπlt : ν π < 1 := by + rw [hπ, ← WithZero.exp_zero, WithZero.exp_lt_exp] + omega + have hπIntrinsicLt : ν₀ π < 1 := + hEquiv.lt_one_iff_lt_one.mpr hπlt + have hπIntrinsicMax : + ∀ γ : ValuativeRel.ValueGroupWithZero F, + γ < 1 → γ ≤ ν₀ π := by + intro γ hγ + obtain ⟨y, hy⟩ := + ValuativeRel.valuation_surjective γ + have hylt : ν y < 1 := by + apply hEquiv.lt_one_iff_lt_one.mp + simpa [ν₀, hy] + have hyle : ν y ≤ ν π := by + rw [hπ] + exact + withZeroMultiplicativeInt_le_exp_neg_one_of_lt_one + (ν y) hylt + have hyle' : ν₀ y ≤ ν₀ π := + hEquiv.le_iff_le.mpr hyle + simpa [ν₀, hy] using hyle' + let φ := + _root_.IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt F + have hφπ : + φ (ν₀ π) = WithZero.exp (-1 : ℤ) := by + apply le_antisymm + · exact + withZeroMultiplicativeInt_le_exp_neg_one_of_lt_one + (φ (ν₀ π)) (by + have h := φ.strictMono hπIntrinsicLt + simpa [φ] using h) + · let γ : ValuativeRel.ValueGroupWithZero F := + φ.symm (WithZero.exp (-1 : ℤ)) + have hγlt : γ < 1 := by + have hneg : + WithZero.exp (-1 : ℤ) < + (1 : WithZero (Multiplicative ℤ)) := by + rw [← WithZero.exp_zero, WithZero.exp_lt_exp] + omega + have h := φ.symm.strictMono hneg + simpa [γ, φ] using h + have hγle := hπIntrinsicMax γ hγlt + have hmap := φ.toOrderIso.monotone hγle + rw [← φ.apply_symm_apply (WithZero.exp (-1 : ℤ))] + exact hmap + have hϖValue : + LocalFieldTheory.IsNonarchimedeanLocalField.v F + (Additive.ofMul ϖ) = -1 := by + rw [LocalFieldTheory.IsNonarchimedeanLocalField.v_apply] + apply (WithZero.toAdd_unzero_eq_iff _ (-1 : ℤ)).2 + change + φ (ν₀ ((ϖ : Fˣ) : F)) = + ((Multiplicative.ofAdd (-1 : ℤ) : + Multiplicative ℤ) : + WithZero (Multiplicative ℤ)) + change + φ (ν₀ π) = + ((Multiplicative.ofAdd (-1 : ℤ) : + Multiplicative ℤ) : + WithZero (Multiplicative ℤ)) + simpa only [WithZero.exp_eq_coe_ofAdd] using hφπ + let n : ℤ := WithZero.log (ν (x : F)) + let y : Fˣ := x * ϖ ^ n + have hxν0 : ν (x : F) ≠ 0 := + (Valuation.ne_zero_iff ν).2 x.ne_zero + have hyν : ν (y : F) = 1 := by + have hϖν : ν (ϖ : F) = WithZero.exp (-1 : ℤ) := by + simpa [ϖ] using hπ + calc + ν (y : F) = + ν (x : F) * ν (ϖ : F) ^ n := by + simp [y] + _ = + WithZero.exp n * WithZero.exp (-1 : ℤ) ^ n := by + rw [← WithZero.exp_log hxν0] + rw [hϖν] + _ = + WithZero.exp n * + WithZero.exp (n • (-1 : ℤ)) := by + rw [WithZero.exp_zsmul] + _ = WithZero.exp (n + n • (-1 : ℤ)) := by + rw [WithZero.exp_add] + _ = 1 := by + simp + have hyInvν : ν ((y⁻¹ : Fˣ) : F) = 1 := by + rw [Units.val_inv_eq_inv_val, map_inv₀, hyν, inv_one] + have hyMem : (y : F) ∈ 𝒪[F] := by + change ν₀ (y : F) ≤ 1 + exact hEquiv.le_one_iff_le_one.mpr (by rw [hyν]) + have hyInvMem : ((y⁻¹ : Fˣ) : F) ∈ 𝒪[F] := by + change ν₀ ((y⁻¹ : Fˣ) : F) ≤ 1 + exact hEquiv.le_one_iff_le_one.mpr (by rw [hyInvν]) + let yInteger : 𝒪[F]ˣ := + { val := ⟨(y : F), hyMem⟩ + inv := ⟨((y⁻¹ : Fˣ) : F), hyInvMem⟩ + val_inv := by + apply Subtype.ext + simp + inv_val := by + apply Subtype.ext + simp } + have hyField : + LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits + F yInteger = + y := by + apply Units.ext + rfl + have hyValue : + LocalFieldTheory.IsNonarchimedeanLocalField.v F + (Additive.ofMul y) = 0 := by + rw [← hyField] + exact + LocalFieldTheory.IsNonarchimedeanLocalField.v_integerUnitsToFieldUnits + F yInteger + have hdecomp : y * ϖ ^ (-n) = x := by + rw [show y = x * ϖ ^ n by rfl, mul_assoc, zpow_neg, + mul_inv_cancel, mul_one] + have hdecompValue := + congrArg + (fun z : Fˣ => + LocalFieldTheory.IsNonarchimedeanLocalField.v F + (Additive.ofMul z)) + hdecomp + rw [LocalFieldTheory.IsNonarchimedeanLocalField.v_mul, + hyValue, + LocalFieldTheory.IsNonarchimedeanLocalField.v_zpow, + hϖValue] at hdecompValue + dsimp [n] at hdecompValue ⊢ + linarith + +/-- Identity on the underlying field gives the equivalence between the +intrinsic valuation ring and the distinguished valued-field integer ring. -/ +private noncomputable def intrinsicIntegerEquivValuedInteger + (F : Type w) + [Field F] [ValuativeRel F] + [Valued F (WithZero (Multiplicative ℤ))] + [(Valued.v : + Valuation F (WithZero (Multiplicative ℤ))).Compatible] : + 𝒪[F] ≃+* Valued.integer F := by + apply RingEquiv.subringCongr + exact congrArg ValuationSubring.toSubring <| + (Valuation.isEquiv_iff_valuationSubring + (ValuativeRel.valuation F) + (Valued.v : Valuation F (WithZero (Multiplicative ℤ)))).mp <| + ValuativeRel.isEquiv + (ValuativeRel.valuation F) + (Valued.v : + Valuation F (WithZero (Multiplicative ℤ))) + +/-- The residue field for the intrinsic valuation is the residue field of +the distinguished `ℤᵐ⁰`-valued completion valuation. -/ +private noncomputable def intrinsicResidueFieldEquivValuedResidueField + (F : Type w) + [Field F] [ValuativeRel F] + [Valued F (WithZero (Multiplicative ℤ))] + [(Valued.v : + Valuation F (WithZero (Multiplicative ℤ))).Compatible] : + 𝓀[F] ≃+* Valued.ResidueField F := + IsLocalRing.ResidueField.mapEquiv + (intrinsicIntegerEquivValuedInteger F) + + +private theorem absNorm_eq_card_intrinsicAdicResidueField + (K : Type u) [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) + [ValuativeRel (v.adicCompletion K)] + [(Valued.v : + Valuation (v.adicCompletion K) + (WithZero (Multiplicative ℤ))).Compatible] : + Ideal.absNorm v.asIdeal = + Nat.card 𝓀[v.adicCompletion K] := by + calc + Ideal.absNorm v.asIdeal = + Nat.card + (Valued.ResidueField (v.adicCompletion K)) := by + rw [Ideal.absNorm_apply] + exact + Nat.card_congr + (GlobalClassFieldTheory.ClassFieldAxiom.ringOfIntegersQuotientEquivAdicResidueField + (K := K) v).toEquiv + _ = Nat.card 𝓀[v.adicCompletion K] := by + exact + (Nat.card_congr + (intrinsicResidueFieldEquivValuedResidueField + (v.adicCompletion K)).toEquiv).symm + +variable + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] + [Algebra K L] [FiniteDimensional K L] + +/-- The local order of the actual norm between finite-place completions is +multiplied by the inertia degree of the upstairs prime. -/ +theorem localOrder_normUnits + (v₀ : HeightOneSpectrum (𝓞 K)) + (W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀}) + (x : (W.1.adicCompletion L)ˣ) : + letI : Algebra + (v₀.adicCompletion K) (W.1.adicCompletion L) := + (finitePlaceAdicCompletionMap K L v₀ W).toAlgebra + (localOrder v₀ + (LocalFieldTheory.normUnits + (v₀.adicCompletion K) (W.1.adicCompletion L) x)).toAdd = + (W.1.asIdeal.inertiaDeg (𝓞 K) : ℤ) * + (localOrder W.1 x).toAdd := by + classical + let F := v₀.adicCompletion K + let E := W.1.adicCompletion L + let : Algebra F E := + (finitePlaceAdicCompletionMap K L v₀ W).toAlgebra + let : IsScalarTower K F E := + finitePlaceAdicCompletionMap_isScalarTower K L v₀ W + let : FiniteDimensional F E := + finitePlaceAdicCompletionMap_moduleFinite K L v₀ W + let : CharZero F := + charZero_of_injective_algebraMap + (algebraMap K F).injective + let : Algebra.IsIntegral F E := + Algebra.IsIntegral.of_finite F E + let : Algebra.IsSeparable F E := + Algebra.IsSeparable.of_integral F E + let νF : Valuation F (WithZero (Multiplicative ℤ)) := + Valued.v + let νE : Valuation E (WithZero (Multiplicative ℤ)) := + Valued.v + have hνF : Function.Surjective νF := by + simpa [F, νF] using + v₀.valuedAdicCompletion_surjective K + have hνE : Function.Surjective νE := by + simpa [E, νE] using + W.1.valuedAdicCompletion_surjective L + let : ValuativeRel F := + ValuativeRel.ofValuation νF + let : ValuativeRel E := + ValuativeRel.ofValuation νE + let : νF.Compatible := + Valuation.Compatible.ofValuation νF + let : νE.Compatible := + Valuation.Compatible.ofValuation νE + let : νF.IsNontrivial := by + obtain ⟨π, hπ⟩ := + hνF (WithZero.exp (-1 : ℤ)) + refine ⟨⟨π, ?_, ?_⟩⟩ + · rw [hπ] + simp + · rw [hπ] + change + WithZero.exp (-1 : ℤ) ≠ + WithZero.exp (0 : ℤ) + simp + let : νE.IsNontrivial := by + obtain ⟨π, hπ⟩ := + hνE (WithZero.exp (-1 : ℤ)) + refine ⟨⟨π, ?_, ?_⟩⟩ + · rw [hπ] + simp + · rw [hπ] + change + WithZero.exp (-1 : ℤ) ≠ + WithZero.exp (0 : ℤ) + simp + let : ValuativeRel.IsNontrivial F := + (ValuativeRel.isNontrivial_iff_isNontrivial νF).2 + inferInstance + let : ValuativeRel.IsNontrivial E := + (ValuativeRel.isNontrivial_iff_isNontrivial νE).2 + inferInstance + let : IsValuativeTopology F := + LocalFieldTheory.isValuativeTopology_of_valued_ofValuation + F (WithZero (Multiplicative ℤ)) + let : IsValuativeTopology E := + LocalFieldTheory.isValuativeTopology_of_valued_ofValuation + E (WithZero (Multiplicative ℤ)) + let : IsNonarchimedeanLocalField F := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + let : IsNonarchimedeanLocalField E := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + let ν₀F := ValuativeRel.valuation F + let ν₀E := ValuativeRel.valuation E + let : W.1.asIdeal.LiesOver v₀.asIdeal := by + constructor + exact congrArg HeightOneSpectrum.asIdeal W.2.symm + let : ν₀F.HasExtension ν₀E := by + apply Valuation.HasExtension.ofComapInteger + ext z + change + ν₀E (algebraMap F E z) ≤ 1 ↔ + ν₀F z ≤ 1 + rw [(ValuativeRel.isEquiv ν₀E νE).le_one_iff_le_one, + (ValuativeRel.isEquiv ν₀F νF).le_one_iff_le_one] + have hmap : + νE (algebraMap F E z) = + νF z ^ + W.1.asIdeal.ramificationIdx (𝓞 K) := by + have h := + finitePlaceAdicCompletionMap_valued + K L v₀ W z + rw [Ideal.ramificationIdx'_eq_ramificationIdx + v₀.asIdeal W.1.asIdeal v₀.ne_bot] at h + exact h + rw [hmap, + pow_le_one_iff + (W.1.asIdeal.ramificationIdx_pos + (𝓞 K)).ne'] + let : Algebra 𝒪[F] E := + Algebra.ofSubsemiring 𝒪[F] + let : IsIntegralClosure 𝒪[E] 𝒪[F] E := + LocalFieldTheory.localCompleteDVF_integerRing_isIntegralClosure F E + have hNormValue := + LocalClassFieldTheory.v_normUnits_eq_residue_finrank_mul_of_isSeparable + F E x + rw [ + normalizedValue_eq_withZeroLog_of_surjective + F νF hνF + (LocalFieldTheory.normUnits F E x), + normalizedValue_eq_withZeroLog_of_surjective + E νE hνE x + ] at hNormValue + have hResidueDegree : + Module.finrank 𝓀[F] 𝓀[E] = + W.1.asIdeal.inertiaDeg (𝓞 K) := by + apply + Nat.pow_right_injective + (Nat.succ_le_iff.mpr + (HeightOneSpectrum.one_lt_absNorm v₀)) + calc + Ideal.absNorm v₀.asIdeal ^ + Module.finrank 𝓀[F] 𝓀[E] = + Nat.card 𝓀[F] ^ + Module.finrank 𝓀[F] 𝓀[E] := by + rw [ + absNorm_eq_card_intrinsicAdicResidueField + K v₀ + ] + _ = Nat.card 𝓀[E] := + Module.natCard_eq_pow_finrank.symm + _ = Ideal.absNorm W.1.asIdeal := by + rw [ + absNorm_eq_card_intrinsicAdicResidueField + L W.1 + ] + _ = + Ideal.absNorm v₀.asIdeal ^ + W.1.asIdeal.inertiaDeg (𝓞 K) := by + exact + (Ideal.absNorm_pow_inertiaDeg + v₀.asIdeal W.1.asIdeal).symm + rw [hResidueDegree] at hNormValue + rw [localOrder_apply, localOrder_apply] + change + -WithZero.log + (νF + (LocalFieldTheory.normUnits F E x : F)) = + (W.1.asIdeal.inertiaDeg (𝓞 K) : ℤ) * + -WithZero.log (νE (x : E)) + calc + -WithZero.log + (νF + (LocalFieldTheory.normUnits F E x : F)) = + -((W.1.asIdeal.inertiaDeg (𝓞 K) : ℤ) * + WithZero.log (νE (x : E))) := by + rw [hNormValue] + _ = + (W.1.asIdeal.inertiaDeg (𝓞 K) : ℤ) * + -WithZero.log (νE (x : E)) := by + ring + +end FiniteIdeleGroup + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormProperties.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormProperties.lean new file mode 100644 index 0000000000..d300294655 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormProperties.lean @@ -0,0 +1,68 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.BaseChange +public import Mathlib.RingTheory.Norm.Transitivity +/-! +# Functorial properties of the idele norm + +In the tensor-product presentation `𝔸_L = 𝔸_K ⊗_K L`, the idele norm is +the determinant norm of a finite free algebra. Thus transitivity is the +general transitivity theorem for determinant norms. The remaining +statements record the base-field power formula and compatibility with +principal ideles and Galois conjugation. +-/ + +@[expose] public section + +open scoped BigOperators +open NumberField + +noncomputable +section + + +namespace RelativeIdeleGroup + +variable + (K L : Type*) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +omit [NumberField K] [NumberField L] in +/-- The field norm, regarded in `L`, is the product of all Galois +conjugates. This is the unit-valued form used for principal ideles in +the Galois product norm formula. -/ +theorem fieldNormUnits_eq_prod_conjugates + [IsGalois K L] (x : Lˣ) : + Units.map (algebraMap K L) + (Units.map (_root_.Algebra.norm K) x) = + ∏ σ : L ≃ₐ[K] L, + Units.map σ.toRingEquiv.toMonoidHom x := by + apply Units.ext + simp only [Units.coe_map, Units.coe_prod] + convert + (_root_.Algebra.norm_eq_prod_automorphisms K (x : L)) + using 1 <;> rfl + +omit [NumberField L] in +/-- On the diagonal copy of `Lˣ`, after extending the norm +back to `L`, the principal idele of the norm is the product of the +Galois-conjugate principal ideles. -/ +theorem inclusion_norm_principalIdele_eq_prod_conjugates + [IsGalois K L] (x : Lˣ) : + inclusion K L (norm K L (principalIdele K L x)) = + ∏ σ : L ≃ₐ[K] L, + σ • principalIdele K L x := by + rw [norm_principalIdele, inclusion_principalIdele] + simp_rw [smul_principalIdele] + rw [← map_prod] + exact congrArg (principalIdele K L) + (fieldNormUnits_eq_prod_conjugates K L x) + +end RelativeIdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/OnePlaceBaseNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/OnePlaceBaseNorm.lean new file mode 100644 index 0000000000..ca8043fe3d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/OnePlaceBaseNorm.lean @@ -0,0 +1,317 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Norm +/-! +# Norms of base units supported at one finite place + +For a finite place `v` of an extension field, embed a unit of the +completion at the place below `v` into the completion at `v`, and +support it only at `v`. Its ordinary idele norm is supported only at +the place below `v`; the surviving component is the corresponding +local-degree power. +-/ + +@[expose] public section + +open scoped BigOperators NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace IdeleGroup + +open AlgebraicNumberTheory.Valuations + +universe u v + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] [FiniteDimensional K L] + +/-- The map from units of the completion below `v` to units of the +completion at `v`, using the actual finite-place completion map. -/ +noncomputable def finitePlaceBaseUnitExtension + (v : HeightOneSpectrum (𝓞 L)) : + ((_root_.finitePlaceBelow (K := K) v).adicCompletion K)ˣ →* + (v.adicCompletion L)ˣ := + Units.map + (finitePlaceAdicCompletionMap + K L + (_root_.finitePlaceBelow (K := K) v) + ⟨v, rfl⟩).toMonoidHom + +/-- The degree of the actual completed extension at `v` over the +completion at the place below `v`. -/ +noncomputable def finitePlaceCompletionDegree + (v : HeightOneSpectrum (𝓞 L)) : ℕ := by + let q := _root_.finitePlaceBelow (K := K) v + let W : + {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = q} := + ⟨v, rfl⟩ + letI : Algebra (q.adicCompletion K) (v.adicCompletion L) := + (finitePlaceAdicCompletionMap K L q W).toAlgebra + letI : Module.Finite (q.adicCompletion K) (v.adicCompletion L) := + finitePlaceAdicCompletionMap_moduleFinite K L q W + exact Module.finrank (q.adicCompletion K) (v.adicCompletion L) + +/-- The completed local degree at an actual finite place is positive. -/ +theorem finitePlaceCompletionDegree_pos + (v : HeightOneSpectrum (𝓞 L)) : + 0 < + finitePlaceCompletionDegree + (K := K) (L := L) v := by + let q := _root_.finitePlaceBelow (K := K) v + let W : + {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = q} := + ⟨v, rfl⟩ + let : Algebra (q.adicCompletion K) (v.adicCompletion L) := + (finitePlaceAdicCompletionMap K L q W).toAlgebra + let : Module.Finite (q.adicCompletion K) (v.adicCompletion L) := + finitePlaceAdicCompletionMap_moduleFinite K L q W + change + 0 < + Module.finrank + (q.adicCompletion K) (v.adicCompletion L) + exact Module.finrank_pos + +omit [FiniteDimensional K L] in +/-- The idele norm of a base-completion unit supported at one extension +place is the corresponding local-degree power supported at the place +below it. -/ +theorem norm_finitePlaceIdele_finitePlaceBaseUnitExtension + (v : HeightOneSpectrum (𝓞 L)) + (x : + ((_root_.finitePlaceBelow (K := K) v).adicCompletion K)ˣ) : + norm K L + (finitePlaceIdele v + (finitePlaceBaseUnitExtension + (K := K) (L := L) v x)) = + finitePlaceIdele + (_root_.finitePlaceBelow (K := K) v) + (x ^ finitePlaceCompletionDegree + (K := K) (L := L) v) := by + classical + let q := _root_.finitePlaceBelow (K := K) v + let W₀ : + {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = q} := + ⟨v, rfl⟩ + apply Prod.ext + · apply ContinuousMulEquiv.piUnits.injective + funext w + change + infiniteComponent w + (norm K L + (finitePlaceIdele v + (finitePlaceBaseUnitExtension + (K := K) (L := L) v x))) = + infiniteComponent w + (finitePlaceIdele q + (x ^ finitePlaceCompletionDegree + (K := K) (L := L) v)) + rw [infiniteComponent_norm_eq_prod] + rw [finitePlaceIdele_infiniteComponent] + apply Finset.prod_eq_one + intro W _ + rw [finitePlaceIdele_infiniteComponent] + exact map_one _ + · apply Subtype.ext + funext r + change + finiteComponent r + (norm K L + (finitePlaceIdele v + (finitePlaceBaseUnitExtension + (K := K) (L := L) v x))) = + finiteComponent r + (finitePlaceIdele q + (x ^ finitePlaceCompletionDegree + (K := K) (L := L) v)) + by_cases hr : r = q + · subst r + rw [finiteComponent_norm_eq_prod, + finitePlaceIdele_finiteComponent_same] + rw [Finset.prod_eq_single W₀] + · rw [finitePlaceIdele_finiteComponent_same] + let : + Algebra (q.adicCompletion K) (v.adicCompletion L) := + (finitePlaceAdicCompletionMap K L q W₀).toAlgebra + let : Module.Finite (q.adicCompletion K) (v.adicCompletion L) := + finitePlaceAdicCompletionMap_moduleFinite K L q W₀ + have hmap : + algebraMap (q.adicCompletion K) (v.adicCompletion L) = + finitePlaceAdicCompletionMap K L q W₀ := + RingHom.algebraMap_toAlgebra _ + change + LocalFieldTheory.normUnits + (q.adicCompletion K) (v.adicCompletion L) + (Units.map + (finitePlaceAdicCompletionMap K L q W₀).toMonoidHom x) = + x ^ Module.finrank (q.adicCompletion K) (v.adicCompletion L) + rw [← hmap] + simpa [ + LocalFieldTheory.IsNonarchimedeanLocalField.mapBaseUnitsToExtensionUnits, + MonoidHom.id_apply] using + (LocalFieldTheory.IsNonarchimedeanLocalField.normUnits_algebraMap_base + (K := q.adicCompletion K) (L := v.adicCompletion L) x) + · intro W _ hW + have hWv : W.1 ≠ v := by + intro h + apply hW + exact Subtype.ext h + rw [ + finitePlaceIdele_finiteComponent_of_ne + v W.1 + (finitePlaceBaseUnitExtension + (K := K) (L := L) v x) + hWv, + map_one] + · simp + · rw [ + finiteComponent_norm_eq_prod, + finitePlaceIdele_finiteComponent_of_ne + q r + (x ^ finitePlaceCompletionDegree + (K := K) (L := L) v) + hr] + apply Finset.prod_eq_one + intro W _ + have hWv : W.1 ≠ v := by + intro h + apply hr + calc + r = _root_.finitePlaceBelow (K := K) W.1 := + W.2.symm + _ = q := by rw [h] + rw [ + finitePlaceIdele_finiteComponent_of_ne + v W.1 + (finitePlaceBaseUnitExtension + (K := K) (L := L) v x) + hWv, + map_one] + +omit [FiniteDimensional K L] in +/-- The ordinary idele norm of an arbitrary unit supported at one +upper finite place is supported at the place below, with surviving +component equal to the genuine completed local norm. -/ +theorem norm_finitePlaceIdele_eq_finitePlaceIdele_normUnits + (v : HeightOneSpectrum (𝓞 K)) + (W : + {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v}) + (y : (W.1.adicCompletion L)ˣ) : + letI : + Algebra (v.adicCompletion K) (W.1.adicCompletion L) := + (finitePlaceAdicCompletionMap K L v W).toAlgebra + norm K L (finitePlaceIdele W.1 y) = + finitePlaceIdele v + (LocalFieldTheory.normUnits + (v.adicCompletion K) (W.1.adicCompletion L) y) := by + classical + let : + Algebra (v.adicCompletion K) (W.1.adicCompletion L) := + (finitePlaceAdicCompletionMap K L v W).toAlgebra + apply Prod.ext + · apply ContinuousMulEquiv.piUnits.injective + funext w + change + infiniteComponent w + (norm K L (finitePlaceIdele W.1 y)) = + infiniteComponent w + (finitePlaceIdele v + (LocalFieldTheory.normUnits + (v.adicCompletion K) (W.1.adicCompletion L) y)) + rw [infiniteComponent_norm_eq_prod] + rw [finitePlaceIdele_infiniteComponent] + apply Finset.prod_eq_one + intro W' _ + rw [finitePlaceIdele_infiniteComponent] + exact map_one _ + · apply Subtype.ext + funext r + change + finiteComponent r + (norm K L (finitePlaceIdele W.1 y)) = + finiteComponent r + (finitePlaceIdele v + (LocalFieldTheory.normUnits + (v.adicCompletion K) (W.1.adicCompletion L) y)) + by_cases hr : r = v + · subst r + rw [finiteComponent_norm_eq_prod, + finitePlaceIdele_finiteComponent_same] + rw [Finset.prod_eq_single W] + · rw [finitePlaceIdele_finiteComponent_same] + · intro W' _ hW' + have hne : W'.1 ≠ W.1 := by + intro h + apply hW' + exact Subtype.ext h + rw [ + finitePlaceIdele_finiteComponent_of_ne W.1 W'.1 y hne, + map_one] + · simp + · rw [ + finiteComponent_norm_eq_prod, + finitePlaceIdele_finiteComponent_of_ne + v r + (LocalFieldTheory.normUnits + (v.adicCompletion K) (W.1.adicCompletion L) y) + hr] + apply Finset.prod_eq_one + intro W' _ + have hne : W'.1 ≠ W.1 := by + intro h + apply hr + calc + r = _root_.finitePlaceBelow (K := K) W'.1 := + W'.2.symm + _ = v := by rw [h, W.2] + rw [ + finitePlaceIdele_finiteComponent_of_ne W.1 W'.1 y hne, + map_one] + +omit [FiniteDimensional K L] in +/-- Passing the preceding one-place norm identity to ordinary idele +classes gives the norm--restriction input used in the global +reciprocity square. -/ +theorem ideleClassNorm_finitePlaceIdeleClass_eq_normUnits + (v : HeightOneSpectrum (𝓞 K)) + (W : + {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v}) + (y : (W.1.adicCompletion L)ˣ) : + letI : + Algebra (v.adicCompletion K) (W.1.adicCompletion L) := + (finitePlaceAdicCompletionMap K L v W).toAlgebra + _root_.ideleClassNorm K L + (finitePlaceIdeleClass W.1 y) = + finitePlaceIdeleClass v + (LocalFieldTheory.normUnits + (v.adicCompletion K) (W.1.adicCompletion L) y) := by + classical + let : + Algebra (v.adicCompletion K) (W.1.adicCompletion L) := + (finitePlaceAdicCompletionMap K L v W).toAlgebra + rw [ + finitePlaceIdeleClass, + MonoidHom.coe_comp, + Function.comp_apply, + _root_.ideleClassNorm_mk, + norm_finitePlaceIdele_eq_finitePlaceIdele_normUnits] + rfl + +end IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FiniteMathlibTopologyComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FiniteMathlibTopologyComparison.lean new file mode 100644 index 0000000000..81bb684950 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FiniteMathlibTopologyComparison.lean @@ -0,0 +1,133 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.RestrictedProductUnitsTopology +public import Mathlib.Topology.Algebra.RestrictedProduct.TopologicalSpace +/-! +# The finite idèle topology and adele units + +The algebraic equivalence from finite idèles to units of the finite adele ring +is continuous for the restricted-product topology on idèles and the graph +topology on units. Both the value and inverse-value maps are induced by +continuous maps on local factors. +-/ + +@[expose] public section + +open scoped NumberField RestrictedProduct +open NumberField IsDedekindDomain + +noncomputable +section + +namespace IdeleGroup + +variable (K : Type*) [Field K] [NumberField K] + +/-- The finite restricted-product idèles and finite adele units are +canonically isomorphic as topological groups. -/ +noncomputable def finiteEquivFiniteAdeleUnitsContinuousMulEquiv : + FiniteIdeleGroup K ≃ₜ* + (IsDedekindDomain.FiniteAdeleRing (𝓞 K) K)ˣ := + (RestrictedProduct.unitsContinuousMulEquiv + (R := fun v : HeightOneSpectrum (𝓞 K) => v.adicCompletion K) + (B := fun v : HeightOneSpectrum (𝓞 K) => v.adicCompletionIntegers K) + (fun _ => Valued.isOpen_valuationSubring _)).symm + +/-- The topological and algebraic finite-idèle comparisons agree pointwise. -/ +@[simp] +theorem finiteEquivFiniteAdeleUnitsContinuousMulEquiv_apply + (a : FiniteIdeleGroup K) : + finiteEquivFiniteAdeleUnitsContinuousMulEquiv K a = + finiteEquivFiniteAdeleUnits a := + rfl + +/-- The algebraic finite-idèle comparison is continuous in the forward +direction. -/ +theorem continuous_finiteEquivFiniteAdeleUnits : + Continuous (finiteEquivFiniteAdeleUnits (K := K)) := by + let hval : ∀ᶠ v : HeightOneSpectrum (𝓞 K) in Filter.cofinite, + Set.MapsTo (fun u : (v.adicCompletion K)ˣ => + (u : v.adicCompletion K)) + ((v.adicCompletionIntegers K).units : Set (v.adicCompletion K)ˣ) + (v.adicCompletionIntegers K : Set (v.adicCompletion K)) := + Filter.Eventually.of_forall (fun _ u hu => hu.1) + let hinv : ∀ᶠ v : HeightOneSpectrum (𝓞 K) in Filter.cofinite, + Set.MapsTo (fun u : (v.adicCompletion K)ˣ => + ((u⁻¹ : (v.adicCompletion K)ˣ) : v.adicCompletion K)) + ((v.adicCompletionIntegers K).units : Set (v.adicCompletion K)ˣ) + (v.adicCompletionIntegers K : Set (v.adicCompletion K)) := + Filter.Eventually.of_forall (fun _ u hu => hu.2) + apply Units.continuous_iff.mpr + constructor + · have h : Continuous (RestrictedProduct.mapAlong + (fun v : HeightOneSpectrum (𝓞 K) => (v.adicCompletion K)ˣ) + (fun v : HeightOneSpectrum (𝓞 K) => v.adicCompletion K) + (𝓕₁ := Filter.cofinite) (𝓕₂ := Filter.cofinite) + (A₁ := fun v => ((v.adicCompletionIntegers K).units : + Set (v.adicCompletion K)ˣ)) + (A₂ := fun v => (v.adicCompletionIntegers K : + Set (v.adicCompletion K))) + id Filter.tendsto_id + (fun v (u : (v.adicCompletion K)ˣ) => + (u : v.adicCompletion K)) hval) := by + apply RestrictedProduct.mapAlong_continuous + intro v + exact Units.continuous_val + exact h.congr (fun a => by + apply RestrictedProduct.ext + intro v + rfl) + · have h : Continuous (RestrictedProduct.mapAlong + (fun v : HeightOneSpectrum (𝓞 K) => (v.adicCompletion K)ˣ) + (fun v : HeightOneSpectrum (𝓞 K) => v.adicCompletion K) + (𝓕₁ := Filter.cofinite) (𝓕₂ := Filter.cofinite) + (A₁ := fun v => ((v.adicCompletionIntegers K).units : + Set (v.adicCompletion K)ˣ)) + (A₂ := fun v => (v.adicCompletionIntegers K : + Set (v.adicCompletion K))) + id Filter.tendsto_id + (fun v (u : (v.adicCompletion K)ˣ) => + ((u⁻¹ : (v.adicCompletion K)ˣ) : v.adicCompletion K)) hinv) := by + apply RestrictedProduct.mapAlong_continuous + intro v + exact Units.continuous_coe_inv + exact h.congr (fun a => by + apply RestrictedProduct.ext + intro v + rfl) + +/-- The algebraic equivalence from restricted-product idèles to adele units +is continuous in the forward direction. -/ +theorem continuous_equivAdeleRingUnits : + Continuous (equivAdeleRingUnits (K := K)) := by + have hprod : Continuous (fun a : IdeleGroup K => + (a.1, finiteEquivFiniteAdeleUnits (K := K) a.2)) := + continuous_fst.prodMk + ((continuous_finiteEquivFiniteAdeleUnits K).comp continuous_snd) + exact (Homeomorph.prodUnits.symm.continuous.comp hprod).congr + (fun _ => rfl) + +/-- The full restricted-product idèle group is canonically isomorphic to +Mathlib's adele-unit idèle group as a topological group. -/ +noncomputable def equivAdeleRingUnitsContinuousMulEquiv : + IdeleGroup K ≃ₜ* (NumberField.AdeleRing (𝓞 K) K)ˣ := by + let e := finiteEquivFiniteAdeleUnitsContinuousMulEquiv K + refine + { toMulEquiv := equivAdeleRingUnits (K := K) + continuous_toFun := continuous_equivAdeleRingUnits K + continuous_invFun := ?_ } + have hprod : Continuous (fun a : (NumberField.AdeleRing (𝓞 K) K)ˣ => + ((Homeomorph.prodUnits a).1, + e.symm (Homeomorph.prodUnits a).2)) := + (Homeomorph.prodUnits.continuous.fst).prodMk + (e.symm.continuous.comp Homeomorph.prodUnits.continuous.snd) + exact hprod.congr (fun _ => rfl) + +end IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FinitePrime.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FinitePrime.lean new file mode 100644 index 0000000000..017bc759cd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FinitePrime.lean @@ -0,0 +1,111 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +/-! +# Normalized finite-prime ideles + +This file defines the idele supported at one finite place with normalized +local order one, and computes its associated fractional ideal and ideal +class. These constructions are independent of class field theory. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace IdeleGroup + +open NumberField IsDedekindDomain + +variable {K : Type*} [Field K] [NumberField K] + +/-- The idele supported at `v` whose normalized local order is one. -/ +def finitePrimeIdele + (v : HeightOneSpectrum (𝓞 K)) : + IdeleGroup K := + finitePlaceIdele v (FiniteIdeleGroup.chosenLocalOrderSection v 1) + +/-- The fractional ideal of the normalized one-place prime idele is the +corresponding prime ideal. -/ +@[simp] +theorem fractionalIdeal_finitePrimeIdele + (v : HeightOneSpectrum (𝓞 K)) : + fractionalIdeal (finitePrimeIdele v) = + FractionalIdealGroup.prime v := by + apply FractionalIdealGroup.ext_count + intro w + change + FractionalIdeal.count K w + ((FiniteIdeleGroup.fractionalIdeal + (finitePrimeIdele v).2 : + FractionalIdealGroup K) : + FractionalIdeal + (nonZeroDivisors (𝓞 K)) K) = + FractionalIdeal.count K w + ((FractionalIdealGroup.prime v : + FractionalIdealGroup K) : + FractionalIdeal + (nonZeroDivisors (𝓞 K)) K) + rw [FiniteIdeleGroup.fractionalIdeal] + change + FractionalIdeal.count K w + (((FractionalIdealGroup.factorization + (FiniteIdeleGroup.valuationVector + (finitePrimeIdele v).2) : + FractionalIdealGroup K) : + FractionalIdeal + (nonZeroDivisors (𝓞 K)) K)) = + FractionalIdeal.count K w + (v.asIdeal : + FractionalIdeal + (nonZeroDivisors (𝓞 K)) K) + rw [FractionalIdealGroup.count_factorization, + FiniteIdeleGroup.valuationVector_apply] + by_cases hw : w = v + · subst w + rw [← finiteComponent_apply, finitePrimeIdele, + finitePlaceIdele_finiteComponent_same, + FiniteIdeleGroup.localOrder_chosenLocalOrderSection, + FractionalIdeal.count_self] + · rw [← finiteComponent_apply, finitePrimeIdele, + finitePlaceIdele_finiteComponent_of_ne + v w (FiniteIdeleGroup.chosenLocalOrderSection v 1) hw, + map_one] + change + 0 = + FractionalIdeal.count K w + (v.asIdeal : + FractionalIdeal + (nonZeroDivisors (𝓞 K)) K) + rw [FractionalIdeal.count_maximal_coprime K w (Ne.symm hw)] + +/-- The ordinary ideal class of the normalized one-place prime idele is the +class of the corresponding prime ideal. -/ +@[simp] +theorem idealClass_finitePrimeIdele + (v : HeightOneSpectrum (𝓞 K)) : + idealClass (finitePrimeIdele v) = + ClassGroup.mk K (FractionalIdealGroup.prime v) := by + change + ClassGroup.mk K (fractionalIdeal (finitePrimeIdele v)) = + ClassGroup.mk K (FractionalIdealGroup.prime v) + rw [fractionalIdeal_finitePrimeIdele] + +end IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdealMap.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdealMap.lean new file mode 100644 index 0000000000..53a7a4921b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdealMap.lean @@ -0,0 +1,424 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Basic +public import Mathlib.RingTheory.DedekindDomain.Factorization +public import Mathlib.RingTheory.ClassGroup.Basic +/-! +# The ideal attached to an idele + +This file formalizes the ideal map from ideles. Its construction +is explicit: local discrete valuations form a finitely supported integer +vector, and unique factorization of fractional ideals identifies that vector +with a nonzero fractional ideal. We prove both stages surjective and identify +the kernel with the ideles integral at every finite place. +-/ + +@[expose] public section + +open scoped NumberField RestrictedProduct WithZero +open NumberField IsDedekindDomain + +noncomputable +section + + +variable {K : Type*} [Field K] [NumberField K] + +namespace FiniteIdeleGroup + +/-- The exponent of a local multiplicative element, normalized so that a +uniformizer has exponent one. -/ +def localOrder (v : HeightOneSpectrum (𝓞 K)) : + (v.adicCompletion K)ˣ →* Multiplicative ℤ := + MonoidHom.mk' + (fun x => Multiplicative.ofAdd (-WithZero.log (Valued.v (x : v.adicCompletion K)))) + fun x y => by + apply Multiplicative.ext + simp [WithZero.log_mul, add_comm] + +@[simp] +theorem localOrder_apply (v : HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) : + (localOrder v x).toAdd = + -WithZero.log (Valued.v (x : v.adicCompletion K)) := + rfl + +theorem localOrder_eq_zero_iff (v : HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) : + (localOrder v x).toAdd = 0 ↔ + x ∈ (v.adicCompletionIntegers K).units := by + rw [localOrder_apply] + rw [HeightOneSpectrum.adicCompletionIntegers.mem_units_iff_valued_eq_one] + change -WithZero.log (Valued.v (x : v.adicCompletion K)) = 0 ↔ + Valued.v (x : v.adicCompletion K) = 1 + rw [neg_eq_zero] + let z : ℤᵐ⁰ := Valued.v (x : v.adicCompletion K) + have hz : z ≠ 0 := by + dsimp [z] + simp + constructor + · intro h + have h' : + WithZero.logEquiv (Units.mk0 z hz) = + WithZero.logEquiv (1 : (ℤᵐ⁰)ˣ) := by + simpa [WithZero.logEquiv_apply] using h + have hu := (WithZero.logEquiv (G := ℤ)).injective h' + simpa [z] using congrArg Units.val hu + · intro h + rw [h] + rfl + +/-- The set of finite places where a finite idele is not an integral unit is +finite. -/ +theorem finite_nonLocalUnits (a : FiniteIdeleGroup K) : + {v : HeightOneSpectrum (𝓞 K) | + a v ∉ (v.adicCompletionIntegers K).units}.Finite := + Filter.eventually_cofinite.mp a.2 + +/-- The finitely supported family of normalized local orders of a finite +idele. -/ +def valuationVectorAdd (a : FiniteIdeleGroup K) : + HeightOneSpectrum (𝓞 K) →₀ ℤ := + Finsupp.onFinset (finite_nonLocalUnits a).toFinset + (fun v => (localOrder v (a v)).toAdd) (fun v hv => by + rw [Set.Finite.mem_toFinset] + intro hmem + exact hv ((localOrder_eq_zero_iff v (a v)).2 hmem)) + +@[simp] +theorem valuationVectorAdd_apply (a : FiniteIdeleGroup K) + (v : HeightOneSpectrum (𝓞 K)) : + valuationVectorAdd a v = (localOrder v (a v)).toAdd := + rfl + +/-- The finite valuation vector is a homomorphism from finite ideles to the +free abelian group on finite places. -/ +def valuationVector : + FiniteIdeleGroup K →* Multiplicative + (HeightOneSpectrum (𝓞 K) →₀ ℤ) := + MonoidHom.mk' (fun a => Multiplicative.ofAdd (valuationVectorAdd a)) + fun a b => by + apply Multiplicative.ext + ext v + exact congrArg Multiplicative.toAdd + (map_mul (localOrder v) (a v) (b v)) + +@[simp] +theorem valuationVector_apply (a : FiniteIdeleGroup K) + (v : HeightOneSpectrum (𝓞 K)) : + (valuationVector a).toAdd v = + (localOrder v (a v)).toAdd := + rfl + +/-- A chosen local element of prescribed normalized order. -/ +def chosenLocalOrderSection (v : HeightOneSpectrum (𝓞 K)) (n : ℤ) : + (v.adicCompletion K)ˣ := + let x := Classical.choose + (HeightOneSpectrum.valuedAdicCompletion_surjective K v + (WithZero.exp (-n))) + Units.mk0 x (by + intro hx + have hval := Classical.choose_spec + (HeightOneSpectrum.valuedAdicCompletion_surjective K v + (WithZero.exp (-n))) + change Valued.v x = WithZero.exp (-n) at hval + rw [hx, map_zero] at hval + exact WithZero.exp_ne_zero hval.symm) + +theorem localOrder_chosenLocalOrderSection + (v : HeightOneSpectrum (𝓞 K)) (n : ℤ) : + (localOrder v (chosenLocalOrderSection v n)).toAdd = n := by + rw [localOrder_apply] + change -WithZero.log + (Valued.v (Classical.choose + (HeightOneSpectrum.valuedAdicCompletion_surjective K v + (WithZero.exp (-n))))) = n + rw [Classical.choose_spec + (HeightOneSpectrum.valuedAdicCompletion_surjective K v + (WithZero.exp (-n)))] + simp + +/-- A finite idele with a prescribed finitely supported valuation vector. -/ +def valuationVectorSection + (e : HeightOneSpectrum (𝓞 K) →₀ ℤ) : + FiniteIdeleGroup K := + ⟨fun v => chosenLocalOrderSection v (e v), by + filter_upwards [e.support.eventually_cofinite_notMem] with v hv + apply (localOrder_eq_zero_iff v _).1 + rw [localOrder_chosenLocalOrderSection, Finsupp.notMem_support_iff.mp hv]⟩ + +@[simp] +theorem valuationVector_valuationVectorSection + (e : HeightOneSpectrum (𝓞 K) →₀ ℤ) : + valuationVector (valuationVectorSection e) = + Multiplicative.ofAdd e := by + apply Multiplicative.ext + ext v + rw [valuationVector_apply] + change (localOrder v (chosenLocalOrderSection v (e v))).toAdd = e v + rw [localOrder_chosenLocalOrderSection] + +theorem valuationVector_surjective : + Function.Surjective (valuationVector (K := K)) := by + intro e + refine ⟨valuationVectorSection e.toAdd, ?_⟩ + exact valuationVector_valuationVectorSection e.toAdd + +end FiniteIdeleGroup + +/-- The group of nonzero fractional ideals of a number field. -/ +abbrev FractionalIdealGroup (K : Type*) [Field K] := + (FractionalIdeal (nonZeroDivisors (𝓞 K)) K)ˣ + +namespace FractionalIdealGroup + +/-- The fractional ideal represented by a finite prime. -/ +def prime (v : HeightOneSpectrum (𝓞 K)) : + FractionalIdealGroup K := + Units.mk0 (v.asIdeal : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) + (FractionalIdeal.coeIdeal_ne_zero.mpr v.ne_bot) + +/-- The homomorphism sending an integer exponent to the corresponding +power of a finite prime. -/ +def primePowerHom (v : HeightOneSpectrum (𝓞 K)) : + Multiplicative ℤ →* FractionalIdealGroup K := + MonoidHom.mk' (fun n => prime v ^ n.toAdd) fun m n => by + simp [zpow_add] + +/-- Reconstruct a fractional ideal from its finitely supported vector +of prime exponents. -/ +def factorization : + Multiplicative (HeightOneSpectrum (𝓞 K) →₀ ℤ) →* + FractionalIdealGroup K := + MonoidHom.mk' (fun exps => + exps.toAdd.prod fun v n => primePowerHom v (Multiplicative.ofAdd n)) + fun a b => by + exact Finsupp.prod_hom_add_index (fun v => primePowerHom v) + +@[simp] +theorem factorization_val (exps : + Multiplicative (HeightOneSpectrum (𝓞 K) →₀ ℤ)) : + ((factorization exps : FractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = + exps.toAdd.prod fun v n => + (v.asIdeal : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) ^ n := by + classical + simp [factorization, primePowerHom, prime, Finsupp.prod] + +theorem finite_count_support (I : FractionalIdealGroup K) : + {v : HeightOneSpectrum (𝓞 K) | + FractionalIdeal.count K v + (I : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) ≠ 0}.Finite := + Filter.eventually_cofinite.mp + (FractionalIdeal.finite_factors + (I : FractionalIdeal (nonZeroDivisors (𝓞 K)) K)) + +/-- The finitely supported vector of prime exponents of a nonzero +fractional ideal. -/ +def countVector (I : FractionalIdealGroup K) : + HeightOneSpectrum (𝓞 K) →₀ ℤ := + Finsupp.onFinset (finite_count_support I).toFinset + (fun v => FractionalIdeal.count K v + (I : FractionalIdeal (nonZeroDivisors (𝓞 K)) K)) + (fun v hv => by + rw [Set.Finite.mem_toFinset] + exact hv) + +@[simp] +theorem countVector_apply (I : FractionalIdealGroup K) + (v : HeightOneSpectrum (𝓞 K)) : + countVector I v = + FractionalIdeal.count K v + (I : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) := + rfl + +theorem count_factorization (exps : + Multiplicative (HeightOneSpectrum (𝓞 K) →₀ ℤ)) + (v : HeightOneSpectrum (𝓞 K)) : + FractionalIdeal.count K v + ((factorization exps : FractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = + exps.toAdd v := by + rw [factorization_val] + exact FractionalIdeal.count_finsuppProd K v exps.toAdd + +theorem ext_count {I J : FractionalIdealGroup K} + (h : ∀ v : HeightOneSpectrum (𝓞 K), + FractionalIdeal.count K v + (I : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = + FractionalIdeal.count K v + (J : FractionalIdeal (nonZeroDivisors (𝓞 K)) K)) : + I = J := by + apply Units.ext + rw [← FractionalIdeal.finprod_heightOneSpectrum_factorization' + K (Units.ne_zero I), + ← FractionalIdeal.finprod_heightOneSpectrum_factorization' + K (Units.ne_zero J)] + exact finprod_congr fun v => congrArg + (fun n : ℤ => + (v.asIdeal : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) ^ n) (h v) + +theorem factorization_injective : + Function.Injective (factorization (K := K)) := by + intro a b hab + apply Multiplicative.ext + ext v + rw [← count_factorization a v, ← count_factorization b v, hab] + +theorem factorization_surjective : + Function.Surjective (factorization (K := K)) := by + intro I + refine ⟨Multiplicative.ofAdd (countVector I), ?_⟩ + apply ext_count + intro v + rw [count_factorization] + change countVector I v = + FractionalIdeal.count K v + (I : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) + exact countVector_apply I v + +/-- Multiplicative unique factorization of nonzero fractional ideals by +finite primes. -/ +def factorizationEquiv : + Multiplicative (HeightOneSpectrum (𝓞 K) →₀ ℤ) ≃* + FractionalIdealGroup K := + MulEquiv.ofBijective (factorization (K := K)) + ⟨factorization_injective, factorization_surjective⟩ + +end FractionalIdealGroup + +namespace FiniteIdeleGroup + +/-- The fractional ideal attached to a finite idele. -/ +def fractionalIdeal : + FiniteIdeleGroup K →* FractionalIdealGroup K := + (FractionalIdealGroup.factorizationEquiv (K := K)).toMonoidHom.comp + (valuationVector (K := K)) + +theorem fractionalIdeal_surjective : + Function.Surjective (fractionalIdeal (K := K)) := + (FractionalIdealGroup.factorizationEquiv (K := K)).surjective.comp + valuationVector_surjective + +/-- Finite ideles integral at every finite place. -/ +def integralSubgroup : Subgroup (FiniteIdeleGroup K) where + carrier := {a | ∀ v : HeightOneSpectrum (𝓞 K), + a v ∈ (v.adicCompletionIntegers K).units} + one_mem' v := (v.adicCompletionIntegers K).units.one_mem + mul_mem' ha hb v := + (v.adicCompletionIntegers K).units.mul_mem (ha v) (hb v) + inv_mem' ha v := + (v.adicCompletionIntegers K).units.inv_mem (ha v) + +@[simp] +theorem mem_integralSubgroup_iff (a : FiniteIdeleGroup K) : + a ∈ integralSubgroup ↔ + ∀ v : HeightOneSpectrum (𝓞 K), + a v ∈ (v.adicCompletionIntegers K).units := + Iff.rfl + +theorem fractionalIdeal_ker : + (fractionalIdeal (K := K)).ker = integralSubgroup := by + ext a + constructor + · intro ha v + have hv : + valuationVector a = + (1 : Multiplicative + (HeightOneSpectrum (𝓞 K) →₀ ℤ)) := by + apply (FractionalIdealGroup.factorizationEquiv + (K := K)).injective + simpa [fractionalIdeal] using ha + apply (localOrder_eq_zero_iff v (a v)).1 + rw [← valuationVector_apply a v, hv] + rfl + · intro ha + have hv : + valuationVector a = + (1 : Multiplicative + (HeightOneSpectrum (𝓞 K) →₀ ℤ)) := by + apply Multiplicative.ext + ext v + rw [valuationVector_apply] + exact (localOrder_eq_zero_iff v (a v)).2 (ha v) + simp [fractionalIdeal, hv] + +/-- The ideal group as the quotient of finite ideles by the everywhere +integral finite ideles. -/ +def quotientIntegralEquiv : + FiniteIdeleGroup K ⧸ integralSubgroup ≃* + FractionalIdealGroup K := by + rw [← fractionalIdeal_ker] + exact QuotientGroup.quotientKerEquivOfSurjective + fractionalIdeal fractionalIdeal_surjective + +end FiniteIdeleGroup + +namespace IdeleGroup + +/-- The fractional ideal attached to an idele. The archimedean components +do not contribute. -/ +def fractionalIdeal : + IdeleGroup K →* FractionalIdealGroup K := + (FiniteIdeleGroup.fractionalIdeal (K := K)).comp + (MonoidHom.snd _ _) + +theorem fractionalIdeal_surjective : + Function.Surjective (fractionalIdeal (K := K)) := by + intro I + obtain ⟨a, rfl⟩ := + FiniteIdeleGroup.fractionalIdeal_surjective (K := K) I + exact ⟨(1, a), rfl⟩ + +/-- Ideles integral at every finite place; this is the subgroup +`I_K^{S∞}`. -/ +def integralAtFinitePlaces : Subgroup (IdeleGroup K) := + Subgroup.comap (MonoidHom.snd _ _) + (FiniteIdeleGroup.integralSubgroup (K := K)) + +theorem fractionalIdeal_ker : + (fractionalIdeal (K := K)).ker = integralAtFinitePlaces := by + ext a + change FiniteIdeleGroup.fractionalIdeal a.2 = 1 ↔ + a.2 ∈ FiniteIdeleGroup.integralSubgroup + rw [← MonoidHom.mem_ker, + FiniteIdeleGroup.fractionalIdeal_ker] + +/-- The ideal group as the quotient of all ideles by those integral at +every finite place. -/ +def quotientIntegralEquiv : + IdeleGroup K ⧸ integralAtFinitePlaces ≃* + FractionalIdealGroup K := by + rw [← fractionalIdeal_ker] + exact QuotientGroup.quotientKerEquivOfSurjective + fractionalIdeal fractionalIdeal_surjective + +/-- The canonical surjection from ideles to the ordinary ideal class +group. -/ +def idealClass : + IdeleGroup K →* ClassGroup (𝓞 K) := + (ClassGroup.mk K).comp (fractionalIdeal (K := K)) + +theorem idealClass_surjective : + Function.Surjective (idealClass (K := K)) := by + intro c + induction c using ClassGroup.induction (R := 𝓞 K) K with + | h I => + obtain ⟨a, ha⟩ := fractionalIdeal_surjective (K := K) I + exact ⟨a, by simp [idealClass, ha]⟩ + +/-- A quotient form of the ideal-class map. The following results identify +this kernel with `I_K^{S∞} Kˣ`. -/ +def quotientIdealClassKernelEquiv : + IdeleGroup K ⧸ (idealClass (K := K)).ker ≃* + ClassGroup (𝓞 K) := + QuotientGroup.quotientKerEquivOfSurjective + idealClass idealClass_surjective + +end IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdentityComponent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdentityComponent.lean new file mode 100644 index 0000000000..2e993b4539 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdentityComponent.lean @@ -0,0 +1,251 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormOneCompact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PositiveArchimedeanSection +public import LeanPool.ClassFieldTheory.GaloisCohomology.Topology.TotallyDisconnectedQuotients +/-! +# The identity component of the idele class group + +This module packages the connected component of the identity in the idele +class group as a closed normal subgroup and names the corresponding quotient. +-/ + +@[expose] public section + +open scoped NNReal NumberField Topology + +noncomputable +section + +variable (K : Type*) [Field K] [NumberField K] + +/-- The connected component of the identity in the idele class group. -/ +def ideleClassIdentityComponent : Subgroup (IdeleClassGroup K) := + Subgroup.connectedComponentOfOne (IdeleClassGroup K) + +@[simp] +theorem coe_ideleClassIdentityComponent : + (ideleClassIdentityComponent K : Set (IdeleClassGroup K)) = + connectedComponent (1 : IdeleClassGroup K) := + rfl + +/-- The identity component of the idele class group is closed. -/ +theorem ideleClassIdentityComponent_isClosed : + IsClosed (ideleClassIdentityComponent K : Set (IdeleClassGroup K)) := by + rw [coe_ideleClassIdentityComponent] + exact isClosed_connectedComponent + +instance ideleClassIdentityComponent_normal : + (ideleClassIdentityComponent K).Normal := by + change (Subgroup.connectedComponentOfOne (IdeleClassGroup K)).Normal + exact + QuotientGroup.Subgroup.Normal.connectedComponentOfOne + (IdeleClassGroup K) + +/-- The idele class group modulo its identity component. -/ +abbrev ideleClassComponentQuotient := + IdeleClassGroup K ⧸ ideleClassIdentityComponent K + +noncomputable instance ideleClassComponentQuotientT2Space : + T2Space (ideleClassComponentQuotient K) := by + let : IsClosed + (ideleClassIdentityComponent K : Set (IdeleClassGroup K)) := + ideleClassIdentityComponent_isClosed K + infer_instance + +noncomputable instance ideleClassComponentQuotientTotallyDisconnectedSpace : + TotallyDisconnectedSpace (ideleClassComponentQuotient K) := + QuotientGroup.totallyDisconnectedSpace_quotient_connectedComponentOfOne + +/-- The positive archimedean norm section, passed to the idele class group. -/ +noncomputable def ideleClassPositiveArchimedeanSection : + ℝ≥0ˣ →* IdeleClassGroup K := + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K)).comp + (IdeleGroup.positiveArchimedeanSection K) + +/-- The positive archimedean section of the idele class group, with its +natural continuity. -/ +noncomputable def ideleClassPositiveArchimedeanSectionContinuous : + ℝ≥0ˣ →ₜ* IdeleClassGroup K where + __ := ideleClassPositiveArchimedeanSection K + continuous_toFun := + QuotientGroup.continuous_mk.comp + (IdeleGroup.positiveArchimedeanSectionContinuous K).continuous_toFun + +@[simp] +theorem ideleClassPositiveArchimedeanSectionContinuous_apply + (r : ℝ≥0ˣ) : + ideleClassPositiveArchimedeanSectionContinuous K r = + ideleClassPositiveArchimedeanSection K r := + rfl + +/-- A positive real number, viewed as a nonnegative-real unit. -/ +private def positiveRealNNRealUnit + (x : Set.Ioi (0 : ℝ)) : ℝ≥0ˣ := + Units.mk0 (Real.toNNReal x.1) + (Real.toNNReal_pos.mpr x.2).ne' + +/-- The parametrization of nonnegative-real units by positive reals is +continuous. -/ +private theorem continuous_positiveRealNNRealUnit : + Continuous positiveRealNNRealUnit := by + apply Units.continuous_iff.mpr + constructor + · change Continuous + (fun x : Set.Ioi (0 : ℝ) ↦ Real.toNNReal x.1) + exact continuous_real_toNNReal.comp continuous_subtype_val + · change Continuous + (fun x : Set.Ioi (0 : ℝ) ↦ + (Real.toNNReal x.1)⁻¹) + exact + (continuous_real_toNNReal.comp continuous_subtype_val).inv₀ + (fun x ↦ (Real.toNNReal_pos.mpr x.2).ne') + +/-- The multiplicative group of positive nonnegative reals is connected. -/ +private theorem nnrealUnits_connectedSpace : + ConnectedSpace ℝ≥0ˣ := by + let : ConnectedSpace (Set.Ioi (0 : ℝ)) := + isConnected_iff_connectedSpace.mp isConnected_Ioi + apply Function.Surjective.connectedSpace + (f := positiveRealNNRealUnit) + · intro r + let x : Set.Ioi (0 : ℝ) := + ⟨((r : ℝ≥0) : ℝ), + NNReal.coe_pos.mpr + (pos_iff_ne_zero.mpr r.ne_zero)⟩ + refine ⟨x, ?_⟩ + apply Units.ext + simp [positiveRealNNRealUnit, x] + · exact continuous_positiveRealNNRealUnit + +/-- Every value of the positive archimedean class section lies in the +identity component. -/ +theorem ideleClassPositiveArchimedeanSection_mem_identityComponent + (r : ℝ≥0ˣ) : + ideleClassPositiveArchimedeanSection K r ∈ + ideleClassIdentityComponent K := by + change + ideleClassPositiveArchimedeanSection K r ∈ + connectedComponent (1 : IdeleClassGroup K) + let : ConnectedSpace ℝ≥0ˣ := + nnrealUnits_connectedSpace + have hr : r ∈ connectedComponent (1 : ℝ≥0ˣ) := by + rw [PreconnectedSpace.connectedComponent_eq_univ] + exact Set.mem_univ r + have himage : + ideleClassPositiveArchimedeanSectionContinuous K r ∈ + connectedComponent + (ideleClassPositiveArchimedeanSectionContinuous K 1) := + Continuous.mapsTo_connectedComponent + (ideleClassPositiveArchimedeanSectionContinuous K).continuous_toFun + (1 : ℝ≥0ˣ) hr + simpa using himage + +@[simp] +theorem ideleClassPositiveArchimedeanSection_absoluteNorm + (r : ℝ≥0ˣ) : + IdeleClassGroup.absoluteNorm + (ideleClassPositiveArchimedeanSection K r) = + r⁻¹ := by + rw [ideleClassPositiveArchimedeanSection, MonoidHom.comp_apply, + IdeleClassGroup.absoluteNorm_mk, + IdeleGroup.positiveArchimedeanSection_absoluteNorm] + +/-- The norm-one factor of an idele-class representative after removing its +positive archimedean norm component. -/ +noncomputable def ideleClassNormOneCorrection + (a : IdeleGroup K) : + IdeleClassGroup.normOneSubgroup (K := K) := + let correction : IdeleGroup.normOneSubgroup (K := K) := + IdeleGroup.positiveArchimedeanNormOneCorrection K a + ⟨QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (correction : IdeleGroup K), + (IdeleClassGroup.mk_mem_normOneSubgroup_iff + (K := K) (correction : IdeleGroup K)).2 correction.property⟩ + +@[simp] +theorem coe_ideleClassNormOneCorrection (a : IdeleGroup K) : + (ideleClassNormOneCorrection K a : IdeleClassGroup K) = + QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.positiveArchimedeanNormOneCorrection K a) := + rfl + +/-- Every idele class is the product of a norm-one class and the inverse of +its positive archimedean norm section. -/ +theorem ideleClass_mk_eq_normOneCorrection_mul_positiveSection_inv + (a : IdeleGroup K) : + QuotientGroup.mk' (IdeleGroup.principalSubgroup K) a = + (ideleClassNormOneCorrection K a : IdeleClassGroup K) * + (ideleClassPositiveArchimedeanSection K + (IdeleGroup.absoluteNorm a))⁻¹ := by + rw [coe_ideleClassNormOneCorrection, + ideleClassPositiveArchimedeanSection, MonoidHom.comp_apply] + simpa only [map_mul, map_inv] using + congrArg + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K)) + (IdeleGroup.eq_positiveArchimedeanNormOneCorrection_mul_section_inv + (K := K) a) + +/-- The norm-one idele classes map continuously onto the component quotient. -/ +noncomputable def ideleClassNormOneToComponentQuotient : + IdeleClassGroup.normOneSubgroup (K := K) →ₜ* + ideleClassComponentQuotient K where + __ := + (QuotientGroup.mk' (ideleClassIdentityComponent K)).comp + (IdeleClassGroup.normOneSubgroup (K := K)).subtype + continuous_toFun := + QuotientGroup.continuous_mk.comp continuous_subtype_val + +/-- Every connected-component class has a norm-one representative. -/ +theorem ideleClassNormOneToComponentQuotient_surjective : + Function.Surjective (ideleClassNormOneToComponentQuotient K) := by + intro z + obtain ⟨c, rfl⟩ := + QuotientGroup.mk'_surjective (ideleClassIdentityComponent K) z + obtain ⟨a, rfl⟩ := + QuotientGroup.mk'_surjective (IdeleGroup.principalSubgroup K) c + let n : IdeleClassGroup.normOneSubgroup (K := K) := + ideleClassNormOneCorrection K a + refine ⟨n, ?_⟩ + have hsection : + QuotientGroup.mk' (ideleClassIdentityComponent K) + (ideleClassPositiveArchimedeanSection K + (IdeleGroup.absoluteNorm a)) = 1 := + (QuotientGroup.eq_one_iff + (ideleClassPositiveArchimedeanSection K + (IdeleGroup.absoluteNorm a))).2 + (ideleClassPositiveArchimedeanSection_mem_identityComponent K _) + change + QuotientGroup.mk' (ideleClassIdentityComponent K) + (n : IdeleClassGroup K) = + QuotientGroup.mk' (ideleClassIdentityComponent K) + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) a) + symm + rw [ideleClass_mk_eq_normOneCorrection_mul_positiveSection_inv] + rw [map_mul, map_inv, hsection] + simp only [inv_one, mul_one] + rfl + +/-- The idele-class component quotient is compact. -/ +noncomputable instance ideleClassComponentQuotientCompactSpace : + CompactSpace (ideleClassComponentQuotient K) := + Function.Surjective.compactSpace + (ideleClassNormOneToComponentQuotient K).continuous_toFun + (ideleClassNormOneToComponentQuotient_surjective K) + +/-- Every continuous homomorphism from the idele class group to a totally +disconnected topological group kills the identity component. -/ +theorem ideleClassIdentityComponent_le_ker + {H : Type*} + [Group H] [TopologicalSpace H] [IsTopologicalGroup H] + [TotallyDisconnectedSpace H] + (f : IdeleClassGroup K →ₜ* H) : + ideleClassIdentityComponent K ≤ f.ker := + f.connectedComponentOfOne_le_ker diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/LocallyCompact.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/LocallyCompact.lean new file mode 100644 index 0000000000..b9e3404f6d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/LocallyCompact.lean @@ -0,0 +1,299 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology +public import Mathlib.LinearAlgebra.FreeModule.IdealQuotient +public import Mathlib.Topology.Algebra.Valued.LocallyCompact +/-! +# Local compactness of the idele group + +The topology on the finite ideles is the restricted-product topology from +`AlgebraicNumberTheory.Idele.Topology`. We prove local compactness by showing +that every finite completion is proper, that its integral unit group is +compact, and then applying the restricted-product theorem. +-/ + +@[expose] public section + +open scoped NumberField RestrictedProduct Valued +open NumberField IsDedekindDomain + +noncomputable +section + + +variable (K : Type*) [Field K] [NumberField K] + +/-- An element integral at a finite place can be approximated by an +algebraic integer to positive valuation. -/ +theorem exists_ringOfIntegers_approximation + (v : HeightOneSpectrum (𝓞 K)) (y : K) + (hy : v.valuation K y ≤ 1) : + ∃ r : 𝓞 K, v.valuation K (y - algebraMap (𝓞 K) K r) < 1 := by + let : Field (𝓞 K ⧸ v.asIdeal) := Ideal.Quotient.field v.asIdeal + have hy' : y ∈ v.valuationSubringAtPrime K := by + rw [v.valuationSubringAtPrime_eq_valuationSubring] + exact hy + let y' : v.valuationSubringAtPrime K := ⟨y, hy'⟩ + obtain ⟨⟨a, d⟩, had⟩ := IsLocalization.surj v.asIdeal.primeCompl y' + have hd : d.1 ∉ v.asIdeal := d.2 + have hdmk : Ideal.Quotient.mk v.asIdeal d.1 ≠ 0 := by + simpa only [ne_eq, Ideal.Quotient.eq_zero_iff_mem] + obtain ⟨r, hr⟩ := Ideal.Quotient.mk_surjective + (Ideal.Quotient.mk v.asIdeal a / + Ideal.Quotient.mk v.asIdeal d.1) + refine ⟨r, ?_⟩ + have hard : a - r * d.1 ∈ v.asIdeal := by + rw [← Ideal.Quotient.eq_zero_iff_mem] + rw [map_sub, map_mul, hr] + field_simp + simp + have hvalard : + v.valuation K (algebraMap (𝓞 K) K (a - r * d.1)) < 1 := + (v.valuation_lt_one_iff_mem (K := K) (a - r * d.1)).2 hard + have hdval : v.valuation K (algebraMap (𝓞 K) K d.1) = 1 := by + exact le_antisymm (v.valuation_le_one d.1) + (not_lt.mp ((v.valuation_lt_one_iff_mem (K := K) d.1).not.mpr hd)) + have hadK : y * algebraMap (𝓞 K) K d.1 = algebraMap (𝓞 K) K a := + congrArg Subtype.val had + rw [← mul_lt_mul_iff_right₀ (show + 0 < v.valuation K (algebraMap (𝓞 K) K d.1) by simp [hdval])] + rw [← map_mul, mul_sub, mul_comm _ y, hadK, mul_comm _ (algebraMap (𝓞 K) K r), + ← map_mul, ← map_sub, hdval, mul_one] + exact hvalard + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +universe u + +variable {K : Type u} [Field K] [NumberField K] + +/-- The residue field of the adic completion at `v` is the global +ring-of-integers quotient by `v`. -/ +noncomputable def ringOfIntegersQuotientEquivAdicResidueField + (v : HeightOneSpectrum (𝓞 K)) : + (𝓞 K ⧸ v.asIdeal) ≃+* + Valued.ResidueField (v.adicCompletion K) := by + let integerMap : + 𝓞 K →+* Valued.integer (v.adicCompletion K) := { + toFun r := + ⟨algebraMap (𝓞 K) (v.adicCompletion K) r, by + change + Valued.v + (algebraMap + (𝓞 K) (v.adicCompletion K) r) ≤ 1 + rw [show + Valued.v + (algebraMap + (𝓞 K) (v.adicCompletion K) r) = + v.valuation K + (algebraMap (𝓞 K) K r) from + HeightOneSpectrum.valuedAdicCompletion_eq_valuation + (v := v) r] + exact v.valuation_le_one r⟩ + map_one' := by + ext + simp + map_mul' _ _ := by + ext + simp + map_zero' := by + ext + simp + map_add' _ _ := by + ext + simp + } + let residueMap : + 𝓞 K →+* + Valued.ResidueField (v.adicCompletion K) := + (IsLocalRing.residue + (Valued.integer + (v.adicCompletion K))).comp integerMap + have hker : + RingHom.ker residueMap = v.asIdeal := by + ext r + change residueMap r = 0 ↔ r ∈ v.asIdeal + change + IsLocalRing.residue + (Valued.integer (v.adicCompletion K)) + (integerMap r) = 0 ↔ + r ∈ v.asIdeal + rw [IsLocalRing.residue_eq_zero_iff] + rw [IsLocalRing.mem_maximalIdeal] + change ¬ IsUnit (integerMap r) ↔ r ∈ v.asIdeal + rw [Valuation.Integer.not_isUnit_iff_valuation_lt_one] + change + Valued.v + (algebraMap + (𝓞 K) (v.adicCompletion K) r) < 1 ↔ + r ∈ v.asIdeal + rw [show + Valued.v + (algebraMap + (𝓞 K) (v.adicCompletion K) r) = + v.valuation K + (algebraMap (𝓞 K) K r) from + HeightOneSpectrum.valuedAdicCompletion_eq_valuation + (v := v) r] + exact v.valuation_lt_one_iff_mem (K := K) r + have hsur : Function.Surjective residueMap := by + intro z + obtain ⟨x, hx⟩ := + (IsLocalRing.residue_surjective + (R := + Valued.integer + (v.adicCompletion K))) z + obtain ⟨y, hy⟩ := + (v.denseRange_algebraMap K).exists_dist_lt + (x : v.adicCompletion K) zero_lt_one + have hxy : + Valued.v + ((x : v.adicCompletion K) - + algebraMap K + (v.adicCompletion K) y) < 1 := by + rw [← Valued.toNormedField.norm_lt_one_iff] + simpa only [dist_eq_norm] using hy + have hy_integral : v.valuation K y ≤ 1 := by + rw [show + v.valuation K y = + Valued.v + (algebraMap K + (v.adicCompletion K) y) from + (HeightOneSpectrum.valuedAdicCompletion_eq_valuation' + (v := v) y).symm] + rw [show + algebraMap K (v.adicCompletion K) y = + (x : v.adicCompletion K) - + ((x : v.adicCompletion K) - + algebraMap K + (v.adicCompletion K) y) by + ring] + exact Valued.v.map_sub_le x.2 hxy.le + obtain ⟨r, hyr⟩ := + _root_.exists_ringOfIntegers_approximation + K v y hy_integral + have hyr' : + Valued.v + (algebraMap K + (v.adicCompletion K) y - + algebraMap (𝓞 K) + (v.adicCompletion K) r) < 1 := by + rw [IsScalarTower.algebraMap_apply + (𝓞 K) K, ← map_sub] + rw [show + Valued.v + (algebraMap K + (v.adicCompletion K) + (y - algebraMap (𝓞 K) K r)) = + v.valuation K + (y - algebraMap (𝓞 K) K r) from + HeightOneSpectrum.valuedAdicCompletion_eq_valuation' + (v := v) + (y - algebraMap (𝓞 K) K r)] + exact hyr + have hxr : + Valued.v + ((x : v.adicCompletion K) - + algebraMap (𝓞 K) + (v.adicCompletion K) r) < 1 := by + rw [show + (x : v.adicCompletion K) - + algebraMap (𝓞 K) + (v.adicCompletion K) r = + ((x : v.adicCompletion K) - + algebraMap K + (v.adicCompletion K) y) + + (algebraMap K + (v.adicCompletion K) y - + algebraMap (𝓞 K) + (v.adicCompletion K) r) by + ring] + exact Valued.v.map_add_lt hxy hyr' + refine ⟨r, ?_⟩ + rw [← hx] + change + IsLocalRing.residue + (Valued.integer + (v.adicCompletion K)) + (integerMap r) = + IsLocalRing.residue + (Valued.integer + (v.adicCompletion K)) x + apply sub_eq_zero.mp + rw [← map_sub, IsLocalRing.residue_eq_zero_iff] + rw [IsLocalRing.mem_maximalIdeal] + change ¬ IsUnit (integerMap r - x) + rw [Valuation.Integer.not_isUnit_iff_valuation_lt_one] + change + Valued.v + ((integerMap r : v.adicCompletion K) - + (x : v.adicCompletion K)) < 1 + rw [Valued.v.map_sub_swap] + exact hxr + exact + (Ideal.quotEquivOfEq hker).symm.trans + (RingHom.quotientKerEquivOfSurjective hsur) + +end GlobalClassFieldTheory.ClassFieldAxiom + +/-- The residue field of a number-field completion at a finite place is +finite. -/ +theorem finite_adicCompletion_residueField + (v : HeightOneSpectrum (𝓞 K)) : + Finite (Valued.ResidueField (v.adicCompletion K)) := by + let : Finite (𝓞 K ⧸ v.asIdeal) := + Ideal.finiteQuotientOfFreeOfNeBot v.asIdeal v.ne_bot + exact Finite.of_equiv (𝓞 K ⧸ v.asIdeal) + (GlobalClassFieldTheory.ClassFieldAxiom.ringOfIntegersQuotientEquivAdicResidueField + (K := K) v).toEquiv + +open Valued.integer renaming + properSpace_iff_completeSpace_and_isDiscreteValuationRing_integer_and_finite_residueField → + properSpace_iff_complete_discrete_finite_residue in +/-- Every nonarchimedean completion of a number field is a proper metric +space. -/ +instance adicCompletionProperSpace + (v : HeightOneSpectrum (𝓞 K)) : + ProperSpace (v.adicCompletion K) := by + apply + properSpace_iff_complete_discrete_finite_residue.mpr + refine ⟨inferInstance, ?_, finite_adicCompletion_residueField K v⟩ + change IsDiscreteValuationRing (v.adicCompletionIntegers K) + infer_instance + +/-- The integral unit group in a finite completion is compact. -/ +theorem isCompact_finiteLocalUnits + (v : HeightOneSpectrum (𝓞 K)) : + IsCompact + ((v.adicCompletionIntegers K).units : + Set (v.adicCompletion K)ˣ) := by + apply Submonoid.units_isCompact + change IsCompact + ((Valued.integer (v.adicCompletion K)) : + Set (v.adicCompletion K)) + exact isCompact_iff_compactSpace.mpr + (Valued.integer.properSpace_iff_compactSpace_integer.mp inferInstance) + +/-- The correctly topologized finite idele group is locally compact. -/ +instance finiteIdeleGroupLocallyCompactSpace : + LocallyCompactSpace (FiniteIdeleGroup K) := by + apply RestrictedProduct.locallyCompactSpace_of_group + (fun v : HeightOneSpectrum (𝓞 K) ↦ (v.adicCompletion K)ˣ) + exact Filter.Eventually.of_forall (isCompact_finiteLocalUnits K) + +/-- The archimedean factor of the idele group is locally compact. -/ +instance infiniteIdeleGroupLocallyCompactSpace : + LocallyCompactSpace (InfiniteIdeleGroup K) := + inferInstance + +/-- The idele group, with its restricted-product topology, is +locally compact. -/ +instance ideleGroupLocallyCompactSpace : + LocallyCompactSpace (IdeleGroup K) := + inferInstance diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Norm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Norm.lean new file mode 100644 index 0000000000..0ff2515d73 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Norm.lean @@ -0,0 +1,245 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.BaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FiniteIntegralNormPreimage +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces +/-! +# Absolute and relative norms of ideles + +This module exposes the absolute norm on the idele group and assembles +compatible local determinant-norm preimages into a global relative idele. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct RestrictedProduct +open NumberField IsDedekindDomain + +noncomputable +section + + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +omit [NumberField L] [IsGalois K L] in +/-- Assemble compatible local determinant-norm preimages into an actual +relative idele. The only restricted-product input is simultaneous +basis-integrality of the finite preimage and its inverse at almost every +finite place. -/ +theorem exists_relativeIdele_norm_eq_of_localTensorPreimages + (a : IdeleGroup K) + (zInfinite : + ∀ w : InfinitePlace K, + (w.Completion ⊗[K] L)ˣ) + (zFinite : + ∀ w : HeightOneSpectrum (𝓞 K), + (w.adicCompletion K ⊗[K] L)ˣ) + (hInfinite : + ∀ w : InfinitePlace K, + infiniteTensorDetNorm (K := K) (L := L) w + (zInfinite w) = + IdeleGroup.infiniteComponent w a) + (hFinite : + ∀ w : HeightOneSpectrum (𝓞 K), + _root_.localTensorNorm + (K := K) (L := L) w (zFinite w) = + IdeleGroup.finiteComponent w a) + (hIntegral : + ∀ᶠ w : HeightOneSpectrum (𝓞 K) in Filter.cofinite, + RelativeBasisIntegralUnitAt + (K := K) (L := L) w (zFinite w)) : + ∃ z : RelativeIdeleGroup K L, + RelativeIdeleGroup.norm K L z = a := by + let d : RelativeLocalIdeleData (K := K) (L := L) := + { infinite := zInfinite + finite := zFinite + eventually_integral := fun i => + hIntegral.mono fun w hw => + relativeBasisIntegralAt_repr_mem + (K := K) (L := L) w _ hw.1 i + eventually_inverse_integral := fun i => + hIntegral.mono fun w hw => + relativeBasisIntegralAt_repr_mem + (K := K) (L := L) w _ hw.2 i } + refine + ⟨relativeIdeleOfLocalData (K := K) (L := L) d, ?_⟩ + apply Prod.ext + · apply ContinuousMulEquiv.piUnits.injective + funext w + change + IdeleGroup.infiniteComponent w + (RelativeIdeleGroup.norm K L + (relativeIdeleOfLocalData + (K := K) (L := L) d)) = + IdeleGroup.infiniteComponent w a + rw [RelativeIdeleGroup.infiniteComponent_norm, + relativeIdeleOfLocalData_infiniteComponent] + exact hInfinite w + · apply RestrictedProduct.ext + intro w + change + IdeleGroup.finiteComponent w + (RelativeIdeleGroup.norm K L + (relativeIdeleOfLocalData + (K := K) (L := L) d)) = + IdeleGroup.finiteComponent w a + rw [RelativeIdeleGroup.finiteComponent_norm, + relativeIdeleOfLocalData_finiteComponent] + exact hFinite w + +omit [NumberField L] [IsGalois K L] in +/-- Membership in every local norm image, together with a restricted +choice of finite local preimages, implies membership in the image of the +global relative-idele norm. -/ +theorem idele_mem_relativeNorm_range_of_localNorms_with_integralPreimages + (a : IdeleGroup K) + (hInfinite : + ∀ w : InfinitePlace K, + IdeleGroup.infiniteComponent w a ∈ + infiniteTensorNormSubgroup + (K := K) (L := L) w) + (zFinite : + ∀ w : HeightOneSpectrum (𝓞 K), + (w.adicCompletion K ⊗[K] L)ˣ) + (hFinite : + ∀ w : HeightOneSpectrum (𝓞 K), + _root_.localTensorNorm + (K := K) (L := L) w (zFinite w) = + IdeleGroup.finiteComponent w a) + (hIntegral : + ∀ᶠ w : HeightOneSpectrum (𝓞 K) in Filter.cofinite, + RelativeBasisIntegralUnitAt + (K := K) (L := L) w (zFinite w)) : + a ∈ (RelativeIdeleGroup.norm K L).range := by + have hInfinite' : + ∀ w : InfinitePlace K, + ∃ z : (w.Completion ⊗[K] L)ˣ, + infiniteTensorDetNorm (K := K) (L := L) w z = + IdeleGroup.infiniteComponent w a := by + intro w + simpa [infiniteTensorNormSubgroup] using hInfinite w + choose zInfinite hNorm using hInfinite' + obtain ⟨z, hz⟩ := + exists_relativeIdele_norm_eq_of_localTensorPreimages + (K := K) (L := L) a zInfinite zFinite hNorm hFinite hIntegral + exact ⟨z, hz⟩ + +omit [NumberField L] [IsGalois K L] in +/-- Every global relative-idele norm belongs to each finite local +determinant-norm image. -/ +theorem finiteComponent_mem_localTensorNorm_range_of_mem_relativeNorm_range + (a : IdeleGroup K) + (ha : a ∈ (RelativeIdeleGroup.norm K L).range) + (w : HeightOneSpectrum (𝓞 K)) : + IdeleGroup.finiteComponent w a ∈ + (_root_.localTensorNorm + (K := K) (L := L) w).range := by + obtain ⟨z, rfl⟩ := ha + exact + ⟨RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w z, + (RelativeIdeleGroup.finiteComponent_norm + (K := K) (L := L) w z).symm⟩ + +omit [NumberField L] [IsGalois K L] in +/-- Every global relative-idele norm belongs to each infinite local +determinant-norm image. -/ +theorem infiniteComponent_mem_infiniteTensorNormSubgroup_of_mem_relativeNorm_range + (a : IdeleGroup K) + (ha : a ∈ (RelativeIdeleGroup.norm K L).range) + (w : InfinitePlace K) : + IdeleGroup.infiniteComponent w a ∈ + infiniteTensorNormSubgroup + (K := K) (L := L) w := by + obtain ⟨z, rfl⟩ := ha + exact + ⟨RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) w z, + (RelativeIdeleGroup.infiniteComponent_norm + (K := K) (L := L) w z).symm⟩ + +/-- **Local-to-global norm criterion for ideles.** An idele is an +actual global relative-idele norm if and only if all of its finite and +infinite components belong to the corresponding determinant-norm +images. The restrictedness of the global preimage is automatic: at the +cofinitely many places where the given idele is a local integer unit, the +finite local preimage is chosen valuation-integral and is therefore +basis-integral away from the fixed discriminant support. -/ +theorem mem_relativeIdeleNorm_range_iff_localTensorNorms + (a : IdeleGroup K) : + a ∈ (RelativeIdeleGroup.norm K L).range ↔ + (∀ w : InfinitePlace K, + IdeleGroup.infiniteComponent w a ∈ + infiniteTensorNormSubgroup + (K := K) (L := L) w) ∧ + (∀ w : HeightOneSpectrum (𝓞 K), + IdeleGroup.finiteComponent w a ∈ + (_root_.localTensorNorm + (K := K) (L := L) w).range) := by + constructor + · intro ha + exact + ⟨fun w => + infiniteComponent_mem_infiniteTensorNormSubgroup_of_mem_relativeNorm_range + (K := K) (L := L) a ha w, + fun w => + finiteComponent_mem_localTensorNorm_range_of_mem_relativeNorm_range + (K := K) (L := L) a ha w⟩ + · rintro ⟨hInfinite, hFinite⟩ + have hChoice : + ∀ w : HeightOneSpectrum (𝓞 K), + ∃ z : (w.adicCompletion K ⊗[K] L)ˣ, + _root_.localTensorNorm + (K := K) (L := L) w z = + IdeleGroup.finiteComponent w a ∧ + (IdeleGroup.finiteComponent w a ∈ + (w.adicCompletionIntegers K).units → + RelativeLocalTensorDecompositionIntegralUnitAt + (K := K) (L := L) w z) := by + intro w + by_cases hwUnit : + IdeleGroup.finiteComponent w a ∈ + (w.adicCompletionIntegers K).units + · obtain ⟨z, hz, hzIntegral⟩ := + exists_localTensorDecompositionIntegralUnit_localTensorNorm_eq + (K := K) (L := L) w + (IdeleGroup.finiteComponent w a) + (hFinite w) hwUnit + exact ⟨z, hz, fun _ => hzIntegral⟩ + · obtain ⟨z, hz⟩ := hFinite w + exact ⟨z, hz, fun h => (hwUnit h).elim⟩ + choose zFinite hFiniteNorm hFiniteIntegral using hChoice + have hEventuallyUnit : + ∀ᶠ w : HeightOneSpectrum (𝓞 K) in Filter.cofinite, + IdeleGroup.finiteComponent w a ∈ + (w.adicCompletionIntegers K).units := by + simpa [IdeleGroup.finiteComponent_apply] using + FiniteIdeleGroup.eventually_mem_localUnits a.2 + have hIntegral : + ∀ᶠ w : HeightOneSpectrum (𝓞 K) in Filter.cofinite, + RelativeBasisIntegralUnitAt + (K := K) (L := L) w (zFinite w) := by + filter_upwards [ + hEventuallyUnit, + (integralTensorComparisonBadPlaces + (K := K) (L := L)).eventually_cofinite_notMem] with + w hwUnit hwBad + exact + localTensorDecompositionIntegralUnit_imp_relativeBasisIntegralUnitAt_of_notMem + (K := K) (L := L) w hwBad + (hFiniteIntegral w hwUnit) + exact + idele_mem_relativeNorm_range_of_localNorms_with_integralPreimages + (K := K) (L := L) a hInfinite zFinite hFiniteNorm hIntegral diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation.lean new file mode 100644 index 0000000000..a136538015 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/All.lean new file mode 100644 index 0000000000..41ef4c6b3a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/All.lean @@ -0,0 +1,12 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces +/-! # Norm approximation at finite and infinite places -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/FinitePlaces.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/FinitePlaces.lean new file mode 100644 index 0000000000..4b734c5444 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/FinitePlaces.lean @@ -0,0 +1,555 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionFactorClassification +/-! +# Weak approximation for actual local norm quotients + +For a finite Galois extension `L / K` and a finite set `S` of finite +places of `K`, this file chooses an actual extension of every `v ∈ S`, +forms the corresponding algebraic localization `L_w / K_v`, and +transports its local norm subgroup to mathlib's concrete adic +completion. These transported norm subgroups are open. Multiplicative +weak approximation therefore gives a surjection + +`Kˣ → ∏ v ∈ S, K_vˣ / N(L_wˣ)`. + +All choices are made from the extension theorem for absolute values; +none of the local conclusions is included as input data. +-/ + +@[expose] public section + +open scoped NumberField NNReal +open NumberField IsDedekindDomain + +noncomputable +section + +open LocalClassFieldTheory + + +open AlgebraicNumberTheory.Valuations +open LocalClassFieldTheory +open LocalFieldTheory + +variable {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +open scoped Classical in +/-- The canonical dense embedding used to compare the absolute-value +completion at `v` with the concrete adic completion. -/ +noncomputable def finitePlaceCompletionBaseMap + (v : HeightOneSpectrum (𝓞 K)) : + WithAbs (NumberField.HeightOneSpectrum.adicAbv K v) →+* + v.adicCompletion K := + (FinitePlace.embedding v).comp + (WithAbs.equiv + (NumberField.HeightOneSpectrum.adicAbv K v)).toRingHom + +open scoped Classical in +@[simp] +theorem finitePlaceCompletionBaseMap_apply + (v : HeightOneSpectrum (𝓞 K)) + (x : WithAbs + (NumberField.HeightOneSpectrum.adicAbv K v)) : + finitePlaceCompletionBaseMap v x = + FinitePlace.embedding v + (WithAbs.equiv + (NumberField.HeightOneSpectrum.adicAbv K v) x) := + rfl + +open scoped Classical in +theorem finitePlaceCompletionBaseMap_norm + (v : HeightOneSpectrum (𝓞 K)) + (x : WithAbs + (NumberField.HeightOneSpectrum.adicAbv K v)) : + ‖finitePlaceCompletionBaseMap v x‖ = ‖x‖ := by + rw [finitePlaceCompletionBaseMap_apply, + FinitePlace.norm_embedding] + rfl + +open scoped Classical in +/-- The base embedding is an isometry. -/ +theorem finitePlaceCompletionBaseMap_isometry + (v : HeightOneSpectrum (𝓞 K)) : + Isometry (finitePlaceCompletionBaseMap v) := + AddMonoidHomClass.isometry_of_norm _ + (finitePlaceCompletionBaseMap_norm v) + +open scoped Classical in +/-- Extension of the base embedding to the absolute-value completion. -/ +noncomputable def finitePlaceCompletionRingHom + (v : HeightOneSpectrum (𝓞 K)) : + (NumberField.HeightOneSpectrum.adicAbv K v).Completion →+* + v.adicCompletion K := + UniformSpace.Completion.extensionHom + (finitePlaceCompletionBaseMap v) + (finitePlaceCompletionBaseMap_isometry v).continuous + +open scoped Classical in +@[simp] +theorem finitePlaceCompletionRingHom_coe + (v : HeightOneSpectrum (𝓞 K)) + (x : WithAbs + (NumberField.HeightOneSpectrum.adicAbv K v)) : + finitePlaceCompletionRingHom v + (x : + (NumberField.HeightOneSpectrum.adicAbv K v).Completion) = + finitePlaceCompletionBaseMap v x := + UniformSpace.Completion.extensionHom_coe + (finitePlaceCompletionBaseMap v) + (finitePlaceCompletionBaseMap_isometry v).continuous x + +open scoped Classical in +theorem finitePlaceCompletionRingHom_isometry + (v : HeightOneSpectrum (𝓞 K)) : + Isometry (finitePlaceCompletionRingHom v) := + (finitePlaceCompletionBaseMap_isometry v).completion_extension + +open scoped Classical in +/-- The completed comparison map is onto the concrete adic +completion. -/ +theorem finitePlaceCompletionRingHom_surjective + (v : HeightOneSpectrum (𝓞 K)) : + Function.Surjective (finitePlaceCompletionRingHom v) := by + let f := finitePlaceCompletionRingHom v + have hrangeClosed : IsClosed (Set.range f) := + (finitePlaceCompletionRingHom_isometry v).isClosedEmbedding.isClosed_range + have hdense : + DenseRange (algebraMap K (v.adicCompletion K)) := + v.denseRange_algebraMap K + have hrange : + Set.range (algebraMap K (v.adicCompletion K)) ⊆ + Set.range f := by + rintro _ ⟨x, rfl⟩ + let x' : WithAbs + (NumberField.HeightOneSpectrum.adicAbv K v) := + (WithAbs.equiv + (NumberField.HeightOneSpectrum.adicAbv K v)).symm x + refine + ⟨(x' : + (NumberField.HeightOneSpectrum.adicAbv K v).Completion), + ?_⟩ + rw [finitePlaceCompletionRingHom_coe] + rfl + intro x + have hx : + x ∈ closure + (Set.range (algebraMap K (v.adicCompletion K))) := by + rw [hdense.closure_range] + trivial + exact closure_minimal hrange hrangeClosed hx + +open scoped Classical in +/-- The two concrete models of `K_v` are canonically isomorphic. -/ +noncomputable def finitePlaceCompletionRingEquiv + (v : HeightOneSpectrum (𝓞 K)) : + (NumberField.HeightOneSpectrum.adicAbv K v).Completion ≃+* + v.adicCompletion K := + RingEquiv.ofBijective (finitePlaceCompletionRingHom v) + ⟨(finitePlaceCompletionRingHom_isometry v).injective, + finitePlaceCompletionRingHom_surjective v⟩ + +open scoped Classical in +/-- The preceding ring equivalence, with its native topologies. -/ +noncomputable def finitePlaceCompletionContinuousMulEquiv + (v : HeightOneSpectrum (𝓞 K)) : + (NumberField.HeightOneSpectrum.adicAbv K v).Completion ≃ₜ* + v.adicCompletion K where + __ := (finitePlaceCompletionRingEquiv v).toMulEquiv + continuous_toFun := + (finitePlaceCompletionRingHom_isometry v).continuous + continuous_invFun := + ((finitePlaceCompletionRingHom_isometry v).right_inv + (finitePlaceCompletionRingEquiv v).right_inv).continuous + +open scoped Classical in +/-- The induced topological multiplicative equivalence on unit +groups. -/ +noncomputable def finitePlaceCompletionUnitsContinuousMulEquiv + (v : HeightOneSpectrum (𝓞 K)) : + (NumberField.HeightOneSpectrum.adicAbv K v).Completionˣ ≃ₜ* + (v.adicCompletion K)ˣ := + Units.mapContinuousMulEquiv + (finitePlaceCompletionContinuousMulEquiv v) + +open scoped Classical in +/-- The chosen extension of the `v`-adic absolute value to `L`. +The embedding is supplied by algebraic closedness of the completion's +algebraic closure. -/ +noncomputable def chosenFinitePlaceExtension + (v : HeightOneSpectrum (𝓞 K)) : + AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L := + pullbackAbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (RayClass.adicAbv_isNontrivial v) + IsAlgClosed.lift + +open scoped Classical in +/-- The chosen actual localization `L_w` above the finite place `v`. -/ +abbrev ChosenFinitePlaceLocalizedCompletion + (v : HeightOneSpectrum (𝓞 K)) := + LocalizedCompletion + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenFinitePlaceExtension (L := L) v) + +open scoped Classical in +/-- The concrete local norm subgroup at `v`. It is first formed in the +absolute-value completion model and then transported to the adic +completion used by the idele library. -/ +noncomputable def chosenFinitePlaceLocalNormSubgroup + (v : HeightOneSpectrum (𝓞 K)) : + Subgroup (v.adicCompletion K)ˣ := by + let vK := + NumberField.HeightOneSpectrum.adicAbv K v + let w := chosenFinitePlaceExtension (L := L) v + letI hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := LocalizedCompletion vK w + let e : + vK.Completionˣ ≃ₜ* (v.adicCompletion K)ˣ := + finitePlaceCompletionUnitsContinuousMulEquiv v + exact + (localNormSubgroup vK.Completion E).map + e.toMonoidHom + +open scoped Classical in +/-- The local norm subgroup transported to the actual finite idele +coordinate is open. -/ +theorem chosenFinitePlaceLocalNormSubgroup_isOpen + (v : HeightOneSpectrum (𝓞 K)) : + IsOpen + (chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v : + Set (v.adicCompletion K)ˣ) := by + let vK := + NumberField.HeightOneSpectrum.adicAbv K v + let w := chosenFinitePlaceExtension (L := L) v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let := localizedCompletionGlobalAlgebra vK w + let := localizedCompletionIsScalarTower vK w + let E := LocalizedCompletion vK w + let : FiniteDimensional vK.Completion E := + localizedCompletionModuleFinite vK hvK w + let : IsGalois vK.Completion E := + HilbertRamification.algebraicLocalization_isGalois vK w + let : NontriviallyNormedField vK.Completion := + absoluteValueExtensionCompletionNontriviallyNormedField + vK hvK + let : LocallyCompactSpace vK.Completion := + AbsoluteValue.Completion.locallyCompactSpace + (finitePlaceCompletionBaseMap_isometry v) + let : IsUltrametricDist vK.Completion := + IsUltrametricDist.isUltrametricDist_of_isNonarchimedean_norm + (AbsoluteValue.completionAbsoluteValue_isNonarchimedean + vK + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv + K v)) + let : Valued vK.Completion ℝ≥0 := + NormedField.toValued + let vC : Valuation vK.Completion ℝ≥0 := Valued.v + let : vC.IsNontrivial := + (inferInstance : + (NormedField.valuation + (K := vK.Completion)).IsNontrivial) + let : ValuativeRel vK.Completion := + ValuativeRel.ofValuation vC + let : vC.Compatible := + Valuation.Compatible.ofValuation vC + let : ValuativeRel.IsNontrivial vK.Completion := + (ValuativeRel.isNontrivial_iff_isNontrivial vC).2 + inferInstance + let : IsValuativeTopology vK.Completion := + isValuativeTopology_of_valued_ofValuation + vK.Completion ℝ≥0 + let : IsNonarchimedeanLocalField vK.Completion := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + let e : + vK.Completionˣ ≃ₜ* (v.adicCompletion K)ˣ := + finitePlaceCompletionUnitsContinuousMulEquiv v + have hN : + IsOpen + (localNormSubgroup vK.Completion E : + Set vK.Completionˣ) := + LocalClassFieldTheory.localNormSubgroup_isOpen + vK.Completion E + change IsOpen + (e '' (localNormSubgroup vK.Completion E : + Set vK.Completionˣ)) + exact e.isOpenMap _ hN + +open scoped Classical in +/-- The actual local norm quotient in the concrete finite-place +completion used by ideles. -/ +abbrev ChosenFinitePlaceNormQuotient + (v : HeightOneSpectrum (𝓞 K)) := + (v.adicCompletion K)ˣ ⧸ + chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v + +open scoped Classical in +/-- The same local quotient in the absolute-value completion and +`LocalizedCompletion` model used by local class field theory. -/ +noncomputable def ChosenFinitePlaceIntrinsicNormQuotient + (v : HeightOneSpectrum (𝓞 K)) : Type := by + let vK := + NumberField.HeightOneSpectrum.adicAbv K v + let w := chosenFinitePlaceExtension (L := L) v + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + exact + NormQuotient vK.Completion + (LocalizedCompletion vK w) + +open scoped Classical in +noncomputable instance + chosenFinitePlaceIntrinsicNormQuotientCommGroup + (v : HeightOneSpectrum (𝓞 K)) : + CommGroup + (ChosenFinitePlaceIntrinsicNormQuotient + (K := K) (L := L) v) := by + unfold ChosenFinitePlaceIntrinsicNormQuotient + infer_instance + +open scoped Classical in +/-- Comparison between the intrinsic local-class-field norm quotient +and the concrete quotient occurring in the finite idele coordinate. -/ +noncomputable def chosenFinitePlaceNormQuotientEquiv + (v : HeightOneSpectrum (𝓞 K)) : + ChosenFinitePlaceIntrinsicNormQuotient + (K := K) (L := L) v ≃* + ChosenFinitePlaceNormQuotient + (K := K) (L := L) v := by + let vK := + NumberField.HeightOneSpectrum.adicAbv K v + let w := chosenFinitePlaceExtension (L := L) v + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := LocalizedCompletion vK w + let e : + vK.Completionˣ ≃* (v.adicCompletion K)ˣ := + finitePlaceCompletionUnitsContinuousMulEquiv v + let N := localNormSubgroup vK.Completion E + have heq : + N.map e.toMonoidHom = + chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := + rfl + exact + (normQuotientConcreteEquiv vK.Completion E).trans + (QuotientGroup.congr N + (chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v) + e heq) + +omit [FiniteDimensional K L] in +open scoped Classical in +@[simp] +theorem chosenFinitePlaceNormQuotientEquiv_normClass + (v : HeightOneSpectrum (𝓞 K)) + (x : + (NumberField.HeightOneSpectrum.adicAbv K v).Completionˣ) : + let vK := + NumberField.HeightOneSpectrum.adicAbv K v + let w := chosenFinitePlaceExtension (L := L) v + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + chosenFinitePlaceNormQuotientEquiv + (K := K) (L := L) v + (normClass vK.Completion + (LocalizedCompletion vK w) x) = + QuotientGroup.mk' + (chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v) + (finitePlaceCompletionUnitsContinuousMulEquiv v x) := by + let vK := + NumberField.HeightOneSpectrum.adicAbv K v + let w := chosenFinitePlaceExtension (L := L) v + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + rfl + +open scoped Classical in +/-- Product comparison over a finite set of places. -/ +noncomputable def chosenFinitePlaceNormQuotientFamilyEquiv + (S : Finset (HeightOneSpectrum (𝓞 K))) : + (∀ v : ↥S, + ChosenFinitePlaceIntrinsicNormQuotient + (K := K) (L := L) v.1) ≃* + (∀ v : ↥S, + ChosenFinitePlaceNormQuotient + (K := K) (L := L) v.1) := + MulEquiv.piCongrRight fun v ↦ + chosenFinitePlaceNormQuotientEquiv + (K := K) (L := L) v.1 + +open scoped Classical in +/-- The diagonal map from global units to the chosen finite family of +actual local norm quotients. -/ +noncomputable def principalLocalNormQuotientMap + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Kˣ →* + (∀ v : ↥S, + ChosenFinitePlaceNormQuotient + (K := K) (L := L) v.1) := + IdeleGroup.principalLocalQuotientMap S + (fun v ↦ chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v.1) + +omit [FiniteDimensional K L] in +open scoped Classical in +@[simp] +theorem principalLocalNormQuotientMap_apply + (S : Finset (HeightOneSpectrum (𝓞 K))) + (x : Kˣ) (v : ↥S) : + principalLocalNormQuotientMap + (K := K) (L := L) S x v = + QuotientGroup.mk' + (chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v.1) + ((IdeleGroup.principalIdele K x).2 v.1) := + rfl + +open scoped Classical in +/-- Actual multiplicative local norm approximation: every prescribed +finite family of classes modulo `N(L_wˣ)` is represented by one global +element of `Kˣ`. -/ +theorem principalLocalNormQuotientMap_surjective + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Function.Surjective + (principalLocalNormQuotientMap + (K := K) (L := L) S) := + IdeleGroup.principalLocalQuotientMap_surjective + S + (fun v ↦ chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v.1) + (fun v ↦ + chosenFinitePlaceLocalNormSubgroup_isOpen + (K := K) (L := L) v.1) + +open scoped Classical in +/-- The same diagonal approximation map with target written directly as +a product of `LocalFieldTheory.NormQuotient`s. -/ +noncomputable def principalIntrinsicLocalNormQuotientMap + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Kˣ →* + (∀ v : ↥S, + ChosenFinitePlaceIntrinsicNormQuotient + (K := K) (L := L) v.1) := + (chosenFinitePlaceNormQuotientFamilyEquiv + (K := K) (L := L) S).symm.toMonoidHom.comp + (principalLocalNormQuotientMap + (K := K) (L := L) S) + +open scoped Classical in +/-- Surjectivity in the intrinsic `NormQuotient` model. -/ +theorem principalIntrinsicLocalNormQuotientMap_surjective + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Function.Surjective + (principalIntrinsicLocalNormQuotientMap + (K := K) (L := L) S) := by + intro q + let E := + chosenFinitePlaceNormQuotientFamilyEquiv + (K := K) (L := L) S + obtain ⟨x, hx⟩ := + principalLocalNormQuotientMap_surjective + (K := K) (L := L) S (E q) + refine ⟨x, ?_⟩ + change E.symm + (principalLocalNormQuotientMap + (K := K) (L := L) S x) = q + rw [hx, E.symm_apply_apply] + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- Kernel membership has the expected simultaneous local-norm +description. -/ +theorem mem_ker_principalLocalNormQuotientMap_iff + (S : Finset (HeightOneSpectrum (𝓞 K))) + (x : Kˣ) : + x ∈ + (principalLocalNormQuotientMap + (K := K) (L := L) S).ker ↔ + ∀ v : ↥S, + (IdeleGroup.principalIdele K x).2 v.1 ∈ + chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v.1 := by + rw [MonoidHom.mem_ker] + constructor + · intro hx v + exact + (QuotientGroup.eq_one_iff _).mp + (congrFun hx v) + · intro hx + funext v + exact + (QuotientGroup.eq_one_iff _).mpr + (hx v) + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- The kernel is the intersection of the pullbacks of the actual local +norm subgroups. -/ +theorem principalLocalNormQuotientMap_ker + (S : Finset (HeightOneSpectrum (𝓞 K))) : + (principalLocalNormQuotientMap + (K := K) (L := L) S).ker = + ⨅ v : ↥S, + (chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v.1).comap + ((IdeleGroup.finiteComponent v.1).comp + (IdeleGroup.principalIdele K)) := by + ext x + rw [mem_ker_principalLocalNormQuotientMap_iff] + simp only [Subgroup.mem_iInf, Subgroup.mem_comap] + rfl diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/InfinitePlaces.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/InfinitePlaces.lean new file mode 100644 index 0000000000..0a8c27455e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/InfinitePlaces.lean @@ -0,0 +1,270 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.TensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization +public import Mathlib.Analysis.SpecialFunctions.Pow.Real +public import Mathlib.FieldTheory.IsAlgClosed.Basic +/-! +# Archimedean norm approximation + +This file supplies the archimedean source used in the norm-approximation +argument. At a real place the positive units have +an `n`-th root, while at a complex place every unit has one. Consequently +the standard positive subgroup is contained in the determinant-norm image +of every scalar extension of positive degree. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain +open LocalFieldTheory + +noncomputable +section + +open LocalClassFieldTheory + +universe u v + +section ArchimedeanNorm + +variable {K : Type u} [Field K] [NumberField K] + +omit [NumberField K] in +/-- Every element of the archimedean positive subgroup has an `n`-th +root for `n > 0`. At complex places the positivity condition is +vacuous and algebraic closedness supplies the root. -/ +theorem exists_infinitePositiveSubgroup_nthRoot + (v : InfinitePlace K) + (n : ℕ) (hn : 0 < n) + (x : v.Completionˣ) + (hx : x ∈ RayClass.infinitePositiveSubgroup v) : + ∃ y : v.Completionˣ, y ^ n = x := by + by_cases hv : v.IsReal + · let e : v.Completion ≃+* ℝ := + InfinitePlace.Completion.ringEquivRealOfIsReal hv + let eu : v.Completionˣ ≃* ℝˣ := + Units.mapEquiv e.toMulEquiv + have hxpos : 0 < ((eu x : ℝˣ) : ℝ) := by + exact + ((RayClass.mem_infinitePositiveSubgroup_iff v x).mp hx) hv + let yr : ℝ := + ((eu x : ℝˣ) : ℝ) ^ ((n : ℝ)⁻¹) + have hyrpow : + yr ^ n = ((eu x : ℝˣ) : ℝ) := by + exact Real.rpow_inv_natCast_pow hxpos.le hn.ne' + have hyrne : yr ≠ 0 := by + intro hyr + rw [hyr, zero_pow hn.ne'] at hyrpow + exact (eu x).ne_zero hyrpow.symm + let yu : ℝˣ := Units.mk0 yr hyrne + refine ⟨eu.symm yu, ?_⟩ + apply eu.injective + simp only [map_pow, eu.apply_symm_apply] + apply Units.ext + exact hyrpow + · have hvc : v.IsComplex := + InfinitePlace.not_isReal_iff_isComplex.mp hv + let e : v.Completion ≃+* ℂ := + InfinitePlace.Completion.ringEquivComplexOfIsComplex hvc + let eu : v.Completionˣ ≃* ℂˣ := + Units.mapEquiv e.toMulEquiv + obtain ⟨z, hz⟩ := + IsAlgClosed.exists_pow_nat_eq + ((eu x : ℂˣ) : ℂ) hn + have hz0 : z ≠ 0 := by + intro hzero + rw [hzero, zero_pow hn.ne'] at hz + exact (eu x).ne_zero hz.symm + let zu : ℂˣ := Units.mk0 z hz0 + refine ⟨eu.symm zu, ?_⟩ + apply eu.injective + simp only [map_pow, eu.apply_symm_apply] + apply Units.ext + exact hz + +variable {L : Type v} [Field L] [Algebra K L] + [FiniteDimensional K L] + +/-- Determinant norm on the actual tensor factor used by the infinite +component of the relative adele ring. -/ +def infiniteTensorDetNorm + (v : InfinitePlace K) : + (v.Completion ⊗[K] L)ˣ →* v.Completionˣ := + Units.map (Algebra.norm v.Completion) + +/-- Image of the determinant norm on an infinite tensor factor. -/ +def infiniteTensorNormSubgroup + (v : InfinitePlace K) : + Subgroup v.Completionˣ := + (infiniteTensorDetNorm (K := K) (L := L) v).range + +/-- The positive subgroup at an infinite place lies in the determinant +norm image of the corresponding local tensor algebra. -/ +theorem infinitePositiveSubgroup_le_infiniteTensorNormSubgroup + (v : InfinitePlace K) : + RayClass.infinitePositiveSubgroup v ≤ + infiniteTensorNormSubgroup (K := K) (L := L) v := by + intro x hx + let n := Module.finrank K L + have hn : 0 < n := + Module.finrank_pos + obtain ⟨y, hy⟩ := + exists_infinitePositiveSubgroup_nthRoot + v n hn x hx + let z : (v.Completion ⊗[K] L)ˣ := + Units.map + (algebraMap v.Completion + (v.Completion ⊗[K] L)).toMonoidHom y + refine ⟨z, ?_⟩ + apply Units.ext + change + Algebra.norm v.Completion + (algebraMap v.Completion + (v.Completion ⊗[K] L) + (y : v.Completion)) = + (x : v.Completion) + rw [Algebra.norm_algebraMap, + Module.finrank_baseChange] + exact congrArg Units.val hy + +end ArchimedeanNorm + +variable {K : Type} [Field K] [NumberField K] +variable {L : Type} [Field L] [Algebra K L] + [FiniteDimensional K L] + +/-- Complete splitting at a finite place makes the chosen local norm +subgroup the whole multiplicative group. -/ +theorem chosenFinitePlaceLocalNormSubgroup_eq_top_of_splitsCompletely + [IsGalois K L] + (v : HeightOneSpectrum (𝓞 K)) + (hsplit : + FinitePlaceSplitsCompletely + (K := K) (L := L) v) : + chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v = ⊤ := by + apply top_unique + intro x _ + let vK := + NumberField.HeightOneSpectrum.adicAbv K v + let w := chosenFinitePlaceExtension (L := L) v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := + AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let : FiniteDimensional vK.Completion E := + AlgebraicNumberTheory.Valuations.localizedCompletionModuleFinite + vK hvK w + have hdegree : + Module.finrank vK.Completion E = 1 := by + simpa [finitePlaceLocalDegree, vK, w, E] using + (finitePlaceSplitsCompletely_iff_localDegree_eq_one + (K := K) (L := L) v).mp hsplit + let e : + vK.Completionˣ ≃ₜ* (v.adicCompletion K)ˣ := + finitePlaceCompletionUnitsContinuousMulEquiv v + change x ∈ + (localNormSubgroup vK.Completion E).map e.toMonoidHom + refine ⟨e.symm x, ?_, e.apply_symm_apply x⟩ + refine + ⟨LocalFieldTheory.IsNonarchimedeanLocalField.mapBaseUnitsToExtensionUnits + vK.Completion E (e.symm x), ?_⟩ + change + LocalFieldTheory.normUnits + vK.Completion E + (LocalFieldTheory.IsNonarchimedeanLocalField.mapBaseUnitsToExtensionUnits + vK.Completion E (e.symm x)) = + e.symm x + simpa [hdegree] using + (LocalFieldTheory.IsNonarchimedeanLocalField.normUnits_algebraMap_base + (K := vK.Completion) (L := E) (e.symm x)) + +/-- Simultaneous weak approximation into the concrete finite local norm +subgroups and into the archimedean tensor-norm images. -/ +theorem exists_principal_quotient_mem_localNormSubgroups + [IsGalois K L] + (S : Finset (HeightOneSpectrum (𝓞 K))) + (a : IdeleGroup K) : + ∃ x : Kˣ, + (∀ v : ↥S, + IdeleGroup.finiteComponent v.1 a * + (IdeleGroup.finiteComponent v.1 + (IdeleGroup.principalIdele K x))⁻¹ ∈ + chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v.1) ∧ + (∀ w : InfinitePlace K, + IdeleGroup.infiniteComponent w a * + (IdeleGroup.infiniteComponent w + (IdeleGroup.principalIdele K x))⁻¹ ∈ + infiniteTensorNormSubgroup + (K := K) (L := L) w) := by + obtain ⟨x, hfinite, hinfinite⟩ := + IdeleGroup.exists_principal_quotient_mem_openAllLocalSubgroups_finset + S a + (fun v => + chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v.1) + (fun w => RayClass.infinitePositiveSubgroup w) + (fun v => + chosenFinitePlaceLocalNormSubgroup_isOpen + (K := K) (L := L) v.1) + (fun w => RayClass.isOpen_infinitePositiveSubgroup w) + refine ⟨x, hfinite, ?_⟩ + intro w + exact + infinitePositiveSubgroup_le_infiniteTensorNormSubgroup + (K := K) (L := L) w (hinfinite w) + +/-- If all finite places outside a finite set split completely, one +principal correction makes a given idele a determinant norm locally at +every finite and infinite place. -/ +theorem exists_principal_quotient_locallyNormEverywhere_of_splitsOutside + [IsGalois K L] + (S : Finset (HeightOneSpectrum (𝓞 K))) + (hsplit : + ∀ v : HeightOneSpectrum (𝓞 K), v ∉ S → + FinitePlaceSplitsCompletely + (K := K) (L := L) v) + (a : IdeleGroup K) : + ∃ x : Kˣ, + (∀ v : HeightOneSpectrum (𝓞 K), + IdeleGroup.finiteComponent v a * + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele K x))⁻¹ ∈ + chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v) ∧ + (∀ w : InfinitePlace K, + IdeleGroup.infiniteComponent w a * + (IdeleGroup.infiniteComponent w + (IdeleGroup.principalIdele K x))⁻¹ ∈ + infiniteTensorNormSubgroup + (K := K) (L := L) w) := by + obtain ⟨x, hfinite, hinfinite⟩ := + exists_principal_quotient_mem_localNormSubgroups + (K := K) (L := L) S a + refine ⟨x, ?_, hinfinite⟩ + intro v + by_cases hv : v ∈ S + · exact hfinite ⟨v, hv⟩ + · rw [ + chosenFinitePlaceLocalNormSubgroup_eq_top_of_splitsCompletely + (K := K) (L := L) v (hsplit v hv)] + exact Subgroup.mem_top _ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormCore.lean new file mode 100644 index 0000000000..6b4f60dca8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormCore.lean @@ -0,0 +1,125 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal +public import Mathlib.NumberTheory.NumberField.ProductFormula +/-! +# The absolute norm of an idele + +This file constructs the homomorphism `𝓝 : I_K → ℝ₊ˣ`. At a finite place a uniformizer + contributes the norm +of its prime ideal; at infinity we divide by the normalized archimedean +norm. This is the convention for which principal ideles have norm one. +-/ + +@[expose] public section + +open scoped NumberField RestrictedProduct NNReal +open NumberField IsDedekindDomain + +noncomputable +section + + +variable {K : Type*} [Field K] [NumberField K] + +/-- The norm of a unit in a normed field, as a positive real unit. -/ +def nnnormUnitHom (F : Type*) [NormedField F] : + Fˣ →* ℝ≥0ˣ := + Units.map (nnnormHom : F →*₀ ℝ≥0).toMonoidHom + +@[simp] +theorem nnnormUnitHom_val (F : Type*) [NormedField F] (x : Fˣ) : + ((nnnormUnitHom F x : ℝ≥0ˣ) : ℝ≥0) = ‖(x : F)‖₊ := + rfl + +namespace InfiniteIdeleGroup + +/-- The product of the normalized norms of all archimedean components. -/ +def archimedeanNorm : + InfiniteIdeleGroup K →* ℝ≥0ˣ where + toFun a := ∏ w : InfinitePlace K, + nnnormUnitHom w.Completion (component w a) ^ w.mult + map_one' := by + apply Finset.prod_eq_one + intro w _ + rw [map_one, map_one, one_pow] + map_mul' a b := by + simp only [map_mul, Finset.prod_mul_distrib, mul_pow] + +@[simp] +theorem archimedeanNorm_apply (a : InfiniteIdeleGroup K) : + archimedeanNorm a = + ∏ w : InfinitePlace K, + nnnormUnitHom w.Completion (component w a) ^ w.mult := + rfl + +end InfiniteIdeleGroup + +namespace FiniteIdeleGroup + +/-- The positive real unit given by the absolute norm of a finite prime. -/ +def primeNorm (v : HeightOneSpectrum (𝓞 K)) : ℝ≥0ˣ := + Units.mk0 (v.asIdeal.absNorm : ℝ≥0) + (HeightOneSpectrum.absNorm_ne_zero v) + +/-- The homomorphism sending an integer exponent to the corresponding +power of the absolute norm of a finite prime. -/ +def primeNormPowerHom (v : HeightOneSpectrum (𝓞 K)) : + Multiplicative ℤ →* ℝ≥0ˣ := + MonoidHom.mk' (fun n => primeNorm v ^ n.toAdd) + fun m n => by simp [zpow_add] + +/-- The norm of a finitely supported divisor. -/ +def divisorNorm : + Multiplicative (HeightOneSpectrum (𝓞 K) →₀ ℤ) →* ℝ≥0ˣ := + MonoidHom.mk' (fun exps => + exps.toAdd.prod fun v n => + primeNormPowerHom v (Multiplicative.ofAdd n)) + fun _ _ => Finsupp.prod_hom_add_index + (fun v => primeNormPowerHom v) + +/-- The finite part of the absolute idele norm. -/ +def absoluteNorm : + FiniteIdeleGroup K →* ℝ≥0ˣ := + (divisorNorm (K := K)).comp (valuationVector (K := K)) + +@[simp] +theorem absoluteNorm_apply (a : FiniteIdeleGroup K) : + absoluteNorm a = + (valuationVector a).toAdd.prod fun v n => + primeNorm v ^ n := by + rfl + +end FiniteIdeleGroup + +namespace IdeleGroup + +/-- The absolute norm on the idele group. -/ +def absoluteNorm : + IdeleGroup K →* ℝ≥0ˣ := + MonoidHom.mk' + (fun a => FiniteIdeleGroup.absoluteNorm a.2 * + (InfiniteIdeleGroup.archimedeanNorm a.1)⁻¹) + fun a b => by + simp only [map_mul, Prod.fst_mul, Prod.snd_mul, mul_inv_rev] + ac_rfl + +@[simp] +theorem absoluteNorm_apply (a : IdeleGroup K) : + absoluteNorm a = + FiniteIdeleGroup.absoluteNorm a.2 * + (InfiniteIdeleGroup.archimedeanNorm a.1)⁻¹ := + rfl + +/-- The norm-one ideles. -/ +def normOneSubgroup : Subgroup (IdeleGroup K) := + (absoluteNorm (K := K)).ker + +end IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormOneCompact.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormOneCompact.lean new file mode 100644 index 0000000000..10254ea2e7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormOneCompact.lean @@ -0,0 +1,863 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalTopology +public import Mathlib.Algebra.Module.ZLattice.Basic +public import Mathlib.Analysis.Normed.Field.ProperSpace +public import Mathlib.NumberTheory.NumberField.ClassNumber +public import Mathlib.NumberTheory.NumberField.Units.DirichletTheorem +/-! +# Compactness of norm-one idele classes + +This module combines local compactness, the logarithmic unit lattice, and the +principal-idele norm formula to prove compactness of the norm-one subgroup of +the idele class group. +-/ + +@[expose] public section + +open scoped NumberField Pointwise RestrictedProduct NNReal +open NumberField IsDedekindDomain +open NumberField.Units.dirichletUnitTheorem + +noncomputable +section + + +variable {K : Type*} [Field K] [NumberField K] + +namespace FiniteIdeleGroup + +open scoped Classical in +/-- The product of all local integral-unit groups, embedded in the finite +idele group. -/ +def integralStructureMap : + (∀ v : HeightOneSpectrum (𝓞 K), + (v.adicCompletionIntegers K).units) → FiniteIdeleGroup K := + RestrictedProduct.structureMap + (fun v : HeightOneSpectrum (𝓞 K) ↦ (v.adicCompletion K)ˣ) + (fun v : HeightOneSpectrum (𝓞 K) ↦ + (v.adicCompletionIntegers K).units) + Filter.cofinite + +open scoped Classical in +theorem range_integralStructureMap : + Set.range (integralStructureMap (K := K)) = + (integralSubgroup (K := K) : Set (FiniteIdeleGroup K)) := by + ext a + constructor + · rintro ⟨u, rfl⟩ v + exact (u v).property + · intro ha + let u : ∀ v : HeightOneSpectrum (𝓞 K), + (v.adicCompletionIntegers K).units := + fun v ↦ ⟨a v, ha v⟩ + exact ⟨u, rfl⟩ + +open scoped Classical in +/-- The everywhere integral finite ideles form a compact group. -/ +theorem isCompact_integralSubgroup : + IsCompact + ((integralSubgroup (K := K) : + Subgroup (FiniteIdeleGroup K)) : Set (FiniteIdeleGroup K)) := by + have hlocal : + ∀ v : HeightOneSpectrum (𝓞 K), + CompactSpace (v.adicCompletionIntegers K).units := by + intro v + exact isCompact_iff_compactSpace.mp + (isCompact_finiteLocalUnits K v) + let (v : HeightOneSpectrum (𝓞 K)) : + CompactSpace (v.adicCompletionIntegers K).units := + hlocal v + have hdomain : + IsCompact + (Set.univ : Set (∀ v : HeightOneSpectrum (𝓞 K), + (v.adicCompletionIntegers K).units)) := + isCompact_univ + rw [← range_integralStructureMap (K := K)] + unfold integralStructureMap + simpa only [Set.image_univ] using + hdomain.image + (RestrictedProduct.isEmbedding_structureMap.continuous : + Continuous (integralStructureMap (K := K))) + +end FiniteIdeleGroup + +namespace InfiniteIdeleGroup + +open scoped Classical in +/-- A compact annulus in one archimedean local multiplicative group. -/ +def localAnnulus (w : InfinitePlace K) (B : ℝ) : + Set w.Completionˣ := + {x | Real.exp (-B) ≤ ‖(x : w.Completion)‖ ∧ + ‖(x : w.Completion)‖ ≤ Real.exp B} + +omit [NumberField K] in +open scoped Classical in +theorem isCompact_localAnnulus (w : InfinitePlace K) (B : ℝ) : + IsCompact (localAnnulus w B) := by + have hnorm_two : ‖(2 : w.Completion)‖ = 2 := by + calc + ‖(2 : w.Completion)‖ = + ‖NumberField.InfinitePlace.Completion.extensionEmbedding w + (2 : w.Completion)‖ := + (Isometry.norm_map_of_map_zero + (NumberField.InfinitePlace.Completion.isometry_extensionEmbedding w) + (map_zero _) _).symm + _ = 2 := by + rw [map_ofNat] + norm_num + let : NontriviallyNormedField w.Completion := + NontriviallyNormedField.ofNormNeOne + ⟨2, by + intro h + have hz : ‖(2 : w.Completion)‖ = 0 := by rw [h, norm_zero] + rw [hnorm_two] at hz + norm_num at hz, + by rw [hnorm_two]; norm_num⟩ + let : ProperSpace w.Completion := + ProperSpace.of_nontriviallyNormedField_of_weaklyLocallyCompactSpace + w.Completion + let A : Set w.Completion := + {x | Real.exp (-B) ≤ ‖x‖ ∧ ‖x‖ ≤ Real.exp B} + have hAclosed : IsClosed A := by + change IsClosed + ((fun x : w.Completion ↦ ‖x‖) ⁻¹' + Set.Icc (Real.exp (-B)) (Real.exp B)) + exact isClosed_Icc.preimage continuous_norm + have hAbounded : Bornology.IsBounded A := by + rw [isBounded_iff_forall_norm_le] + exact ⟨Real.exp B, fun x hx ↦ hx.2⟩ + have hAcompact : IsCompact A := + Metric.isCompact_iff_isClosed_bounded.mpr + ⟨hAclosed, hAbounded⟩ + have hArange : A ⊆ Set.range (Units.val : w.Completionˣ → w.Completion) := by + intro x hx + have hx0 : x ≠ 0 := by + intro h + subst x + have hnonpos : Real.exp (-B) ≤ 0 := by + simpa using hx.1 + exact (not_lt_of_ge hnonpos) (Real.exp_pos (-B)) + exact ⟨Units.mk0 x hx0, rfl⟩ + change IsCompact (Units.val ⁻¹' A) + exact + (Units.isEmbedding_val₀.isInducing.isCompact_preimage_iff hArange).mpr + hAcompact + +open scoped Classical in +/-- A compact product of local archimedean annuli. -/ +def annulus (B : ℝ) : Set (InfiniteIdeleGroup K) := + ContinuousMulEquiv.piUnits.symm '' + Set.univ.pi (fun w : InfinitePlace K ↦ localAnnulus w B) + +omit [NumberField K] in +open scoped Classical in +theorem isCompact_annulus (B : ℝ) : + IsCompact (annulus (K := K) B) := by + apply IsCompact.image + · exact isCompact_univ_pi fun w ↦ isCompact_localAnnulus w B + · exact ContinuousMulEquiv.piUnits.symm.continuous + +omit [NumberField K] in +open scoped Classical in +theorem mem_annulus_iff (a : InfiniteIdeleGroup K) (B : ℝ) : + a ∈ annulus (K := K) B ↔ + ∀ w : InfinitePlace K, + Real.exp (-B) ≤ + ‖((component w a : w.Completionˣ) : w.Completion)‖ ∧ + ‖((component w a : w.Completionˣ) : w.Completion)‖ ≤ + Real.exp B := by + constructor + · rintro ⟨u, hu, rfl⟩ w + change Real.exp (-B) ≤ ‖(u w : w.Completion)‖ ∧ + ‖(u w : w.Completion)‖ ≤ Real.exp B + exact hu w (Set.mem_univ w) + · intro ha + refine ⟨ContinuousMulEquiv.piUnits a, ?_, ?_⟩ + · intro w _ + exact ha w + · exact ContinuousMulEquiv.piUnits.symm_apply_apply a + +open scoped Classical in +/-- The archimedean norm is continuous. -/ +theorem continuous_archimedeanNorm : + Continuous (archimedeanNorm (K := K)) := by + classical + rw [show (archimedeanNorm (K := K) : + InfiniteIdeleGroup K → ℝ≥0ˣ) = + fun a ↦ ∏ w : InfinitePlace K, + nnnormUnitHom w.Completion (component w a) ^ w.mult by + rfl] + apply continuous_finsetProd + intro w _ + apply Continuous.pow + exact (continuous_nnnorm.units_map _).comp + ((continuous_apply w).comp + ContinuousMulEquiv.piUnits.continuous) + +open scoped Classical in +/-- The logarithms of the normalized archimedean absolute values, with the +distinguished place omitted as in Dirichlet's unit theorem. -/ +def logNorm (a : InfiniteIdeleGroup K) : + logSpace K := + fun w ↦ w.1.mult * + Real.log ‖((component w.1 a : w.1.Completionˣ) : w.1.Completion)‖ + +open scoped Classical in +@[simp] +theorem logNorm_mul (a b : InfiniteIdeleGroup K) : + logNorm (a * b) = logNorm a + logNorm b := by + ext w + have ha : + ‖((component w.1 a : w.1.Completionˣ) : + w.1.Completion)‖ ≠ 0 := + norm_ne_zero_iff.mpr (component w.1 a).ne_zero + have hb : + ‖((component w.1 b : w.1.Completionˣ) : + w.1.Completion)‖ ≠ 0 := + norm_ne_zero_iff.mpr (component w.1 b).ne_zero + simp only [logNorm, Pi.add_apply, map_mul, Units.val_mul, norm_mul, + Real.log_mul ha hb, mul_add] + +open scoped Classical in +/-- Ring-of-integers units, viewed as units of the number field. -/ +def ringUnitToFieldUnit : + (𝓞 K)ˣ →* Kˣ := + Units.map (algebraMap (𝓞 K) K) + +open scoped Classical in +theorem norm_infiniteComponent_principalIdele (x : Kˣ) + (w : InfinitePlace K) : + ‖((component w (IdeleGroup.principalIdele K x).1 : + w.Completionˣ) : w.Completion)‖ = + w (x : K) := by + change ‖(((WithAbs.equiv w.1).symm (x : K) : + WithAbs w.1) : w.Completion)‖ = w (x : K) + rw [NumberField.InfinitePlace.Completion.norm_coe, + (WithAbs.equiv w.1).apply_symm_apply] + +open scoped Classical in +/-- On an algebraic integer unit, the archimedean idele log is exactly +Dirichlet's logarithmic embedding. -/ +theorem logNorm_principalRingUnit (u : (𝓞 K)ˣ) : + logNorm (IdeleGroup.principalIdele K + (ringUnitToFieldUnit (K := K) u)).1 = + NumberField.Units.logEmbedding K (Additive.ofMul u) := by + ext w + rw [logNorm, logEmbedding_component, + norm_infiniteComponent_principalIdele] + rfl + +open scoped Classical in +theorem logNorm_component_le {r : ℝ} (a : InfiniteIdeleGroup K) + (h : ‖logNorm a‖ ≤ r) + (w : {w : InfinitePlace K // + w ≠ w₀ (K := K)}) : + |logNorm a w| ≤ r := by + simpa only [Real.norm_eq_abs] using + (norm_le_pi_norm (logNorm a) w).trans h + +open scoped Classical in +/-- If the total archimedean norm is one, the omitted logarithmic coordinate +is the negative sum of all the other coordinates. -/ +theorem sum_logNorm_eq_neg_distinguished + (a : InfiniteIdeleGroup K) + (ha : archimedeanNorm a = 1) : + ∑ w, logNorm a w = + -(w₀ (K := K)).mult * + Real.log + ‖((component (w₀ (K := K)) a : + (w₀ (K := K)).Completionˣ) : + (w₀ (K := K)).Completion)‖ := by + have hprod : + ∏ w : InfinitePlace K, + ‖((component w a : w.Completionˣ) : w.Completion)‖ ^ w.mult = + 1 := by + have h := congrArg + (fun z : ℝ≥0ˣ ↦ (((z : ℝ≥0) : ℝ))) ha + simpa only [archimedeanNorm_apply, Units.coe_prod, + Units.val_pow_eq_pow_val, nnnormUnitHom_val, NNReal.coe_prod, + NNReal.coe_pow, coe_nnnorm, Units.val_one, NNReal.coe_one] using h + have hsum : + ∑ w : InfinitePlace K, + w.mult * + Real.log + ‖((component w a : w.Completionˣ) : + w.Completion)‖ = 0 := by + calc + ∑ w : InfinitePlace K, + w.mult * + Real.log + ‖((component w a : w.Completionˣ) : + w.Completion)‖ = + Real.log + (∏ w : InfinitePlace K, + ‖((component w a : w.Completionˣ) : + w.Completion)‖ ^ w.mult) := by + rw [Real.log_prod] + · apply Finset.sum_congr rfl + intro w _ + rw [Real.log_pow] + · intro w _ + exact pow_ne_zero _ <| + norm_ne_zero_iff.mpr (component w a).ne_zero + _ = 0 := by rw [hprod, Real.log_one] + rw [Fintype.sum_eq_add_sum_subtype_ne _ (w₀ (K := K))] at hsum + have hsum' : + (∑ w : {w : InfinitePlace K // w ≠ w₀ (K := K)}, + w.1.mult * + Real.log + ‖((component w.1 a : w.1.Completionˣ) : + w.1.Completion)‖) = + -(w₀ (K := K)).mult * + Real.log + ‖((component (w₀ (K := K)) a : + (w₀ (K := K)).Completionˣ) : + (w₀ (K := K)).Completion)‖ := by + simpa only [neg_mul] using + (eq_neg_of_add_eq_zero_right hsum) + simpa only [logNorm] using hsum' + +open scoped Classical in +/-- A norm bound in the logarithmic space bounds every local logarithm. +The harmless factor `#S∞` also covers the omitted coordinate. -/ +theorem abs_log_norm_component_le + {r : ℝ} (hr : 0 ≤ r) (a : InfiniteIdeleGroup K) + (hlog : ‖logNorm a‖ ≤ r) + (hnorm : archimedeanNorm a = 1) + (w : InfinitePlace K) : + |Real.log + ‖((component w a : w.Completionˣ) : w.Completion)‖| ≤ + (Fintype.card (InfinitePlace K) : ℝ) * r := by + have hmult : + ∀ x : ℝ, 0 ≤ x → x ≤ w.mult * x := by + intro x hx + nth_rw 1 [← one_mul x] + refine mul_le_mul ?_ le_rfl hx ?_ + all_goals + rw [NumberField.InfinitePlace.mult] + split_ifs <;> norm_num + by_cases hw : w = w₀ (K := K) + · have h := congrArg (‖·‖) + (sum_logNorm_eq_neg_distinguished a hnorm).symm + replace h := (le_of_eq h).trans (norm_sum_le _ _) + simp_rw [norm_mul, norm_neg, Real.norm_eq_abs, Nat.abs_cast] at h + refine (le_trans ?_ h).trans ?_ + · rw [← hw] + exact hmult _ (abs_nonneg _) + · refine (Finset.sum_le_card_nsmul _ _ _ + (fun v _ ↦ logNorm_component_le a hlog v)).trans ?_ + rw [nsmul_eq_mul] + apply mul_le_mul_of_nonneg_right _ hr + exact_mod_cast + (Fintype.card_subtype_le + (fun w : InfinitePlace K ↦ w ≠ w₀ (K := K))) + · have h := logNorm_component_le a hlog ⟨w, hw⟩ + rw [logNorm, abs_mul, Nat.abs_cast] at h + refine (le_trans ?_ h).trans ?_ + · exact hmult _ (abs_nonneg _) + · nth_rw 1 [← one_mul r] + exact mul_le_mul + (Nat.one_le_cast.mpr Fintype.card_pos) + le_rfl hr (Nat.cast_nonneg _) + +open scoped Classical in +/-- Exponentiating the preceding logarithmic estimate gives a compact +annulus containing the idele. -/ +theorem mem_annulus_of_logNorm_le + {r : ℝ} (hr : 0 ≤ r) (a : InfiniteIdeleGroup K) + (hlog : ‖logNorm a‖ ≤ r) + (hnorm : archimedeanNorm a = 1) : + a ∈ annulus (K := K) + ((Fintype.card (InfinitePlace K) : ℝ) * r) := by + rw [mem_annulus_iff] + intro w + let B := (Fintype.card (InfinitePlace K) : ℝ) * r + have h := + abs_log_norm_component_le hr a hlog hnorm w + have hnpos : + 0 < + ‖((component w a : w.Completionˣ) : + w.Completion)‖ := + norm_pos_iff.mpr (component w a).ne_zero + have habs : + -B ≤ + Real.log + ‖((component w a : w.Completionˣ) : + w.Completion)‖ ∧ + Real.log + ‖((component w a : w.Completionˣ) : + w.Completion)‖ ≤ B := by + simpa only [B] using (abs_le.mp h) + constructor + · calc + Real.exp (-B) ≤ + Real.exp + (Real.log + ‖((component w a : w.Completionˣ) : + w.Completion)‖) := + Real.exp_le_exp.mpr habs.1 + _ = ‖((component w a : w.Completionˣ) : + w.Completion)‖ := + Real.exp_log hnpos + · calc + ‖((component w a : w.Completionˣ) : + w.Completion)‖ = + Real.exp + (Real.log + ‖((component w a : w.Completionˣ) : + w.Completion)‖) := + (Real.exp_log hnpos).symm + _ ≤ Real.exp B := Real.exp_le_exp.mpr habs.2 + +open scoped Classical in +/-- A real basis obtained from the full unit lattice. -/ +def unitLatticeRealBasis : + Module.Basis + (Module.Free.ChooseBasisIndex ℤ + (NumberField.Units.unitLattice K)) + ℝ (logSpace K) := + (Module.Free.chooseBasis ℤ + (NumberField.Units.unitLattice K)).ofZLatticeBasis + ℝ (NumberField.Units.unitLattice K) + +open scoped Classical in +/-- An explicit uniform logarithmic bound for representatives modulo the +ordinary unit lattice. -/ +def logFundamentalBound : ℝ := + ∑ i, ‖unitLatticeRealBasis (K := K) i‖ + +open scoped Classical in +theorem logFundamentalBound_nonneg : + 0 ≤ logFundamentalBound (K := K) := + Finset.sum_nonneg fun _ _ ↦ norm_nonneg _ + +open scoped Classical in +/-- Every archimedean idele can be multiplied by an algebraic integer unit +so that its logarithmic vector lies in a fixed bounded fundamental +parallelepiped. -/ +theorem exists_ringUnit_logNorm_le (a : InfiniteIdeleGroup K) : + ∃ u : (𝓞 K)ˣ, + ‖logNorm + (a * (IdeleGroup.principalIdele K + (ringUnitToFieldUnit (K := K) u)).1)‖ ≤ + logFundamentalBound (K := K) := by + let b := unitLatticeRealBasis (K := K) + let f := ZSpan.floor b (logNorm a) + have hf : + (f : logSpace K) ∈ NumberField.Units.unitLattice K := by + have hspan : + Submodule.span ℤ (Set.range (b : + Module.Free.ChooseBasisIndex ℤ + (NumberField.Units.unitLattice K) → + logSpace K)) = + NumberField.Units.unitLattice K := by + dsimp [b, unitLatticeRealBasis] + exact (Module.Free.chooseBasis ℤ + (NumberField.Units.unitLattice K)).ofZLatticeBasis_span + ℝ (NumberField.Units.unitLattice K) + exact hspan.le f.property + change (f : logSpace K) ∈ + Submodule.map + (NumberField.Units.logEmbedding K).toIntLinearMap ⊤ at hf + obtain ⟨u, -, hu⟩ := hf + refine ⟨u.toMul⁻¹, ?_⟩ + have hinv : + NumberField.Units.logEmbedding K + (Additive.ofMul u.toMul⁻¹) = + -(f : logSpace K) := by + calc + NumberField.Units.logEmbedding K + (Additive.ofMul u.toMul⁻¹) = + -NumberField.Units.logEmbedding K u := by + rw [← map_neg] + rfl + _ = -(f : logSpace K) := congrArg Neg.neg hu + rw [logNorm_mul, logNorm_principalRingUnit, hinv, + ← sub_eq_add_neg, ← ZSpan.fract_apply] + exact ZSpan.norm_fract_le b (logNorm a) + +end InfiniteIdeleGroup + +namespace IdeleGroup + +open scoped Classical in +/-- A principal idele coming from a unit of the ring of integers is integral +at every finite place. -/ +theorem principalRingUnit_mem_integralAtFinitePlaces + (u : (𝓞 K)ˣ) : + principalIdele K + (InfiniteIdeleGroup.ringUnitToFieldUnit (K := K) u) ∈ + integralAtFinitePlaces (K := K) := by + rw [← fractionalIdeal_ker, MonoidHom.mem_ker, + fractionalIdeal_principalIdele] + apply Units.ext + rw [coe_toPrincipalIdeal] + change + FractionalIdeal.spanSingleton (nonZeroDivisors (𝓞 K)) + (algebraMap (𝓞 K) K (u : 𝓞 K)) = + (1 : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) + rw [← FractionalIdeal.coeIdeal_span_singleton, + Ideal.span_singleton_eq_top.mpr u.isUnit, + FractionalIdeal.coeIdeal_top] + +open scoped Classical in +theorem finite_absoluteNorm_eq_one_of_integral + (a : FiniteIdeleGroup K) + (ha : a ∈ FiniteIdeleGroup.integralSubgroup (K := K)) : + FiniteIdeleGroup.absoluteNorm a = 1 := by + rw [FiniteIdeleGroup.absoluteNorm_eq_fractionalIdealAbsoluteNorm] + have hfrac : + FiniteIdeleGroup.fractionalIdeal a = 1 := by + rw [← MonoidHom.mem_ker, + FiniteIdeleGroup.fractionalIdeal_ker] + exact ha + rw [hfrac, map_one] + +open scoped Classical in +/-- For an idele which is integral at all finite places, the global norm-one +condition is exactly the archimedean norm-one condition. -/ +theorem archimedeanNorm_eq_one_of_normOne_integral + (a : IdeleGroup K) + (hnorm : a ∈ normOneSubgroup (K := K)) + (hintegral : + a.2 ∈ FiniteIdeleGroup.integralSubgroup (K := K)) : + InfiniteIdeleGroup.archimedeanNorm a.1 = 1 := by + have hfin := + finite_absoluteNorm_eq_one_of_integral a.2 hintegral + change absoluteNorm a = 1 at hnorm + rw [absoluteNorm_apply, hfin, one_mul] at hnorm + exact inv_eq_one.mp hnorm + +open scoped Classical in +/-- The fixed compact set of norm-one ideles which are integral at every +finite place and logarithmically reduced modulo the ordinary units. -/ +def compactIntegralNormOneSet : Set (IdeleGroup K) := + (InfiniteIdeleGroup.annulus (K := K) + ((Fintype.card (InfinitePlace K) : ℝ) * + InfiniteIdeleGroup.logFundamentalBound (K := K)) ×ˢ + (FiniteIdeleGroup.integralSubgroup (K := K) : + Set (FiniteIdeleGroup K))) ∩ + {a | InfiniteIdeleGroup.archimedeanNorm a.1 = 1} + +open scoped Classical in +theorem isCompact_compactIntegralNormOneSet : + IsCompact (compactIntegralNormOneSet (K := K)) := by + apply IsCompact.inter_right + · exact + (InfiniteIdeleGroup.isCompact_annulus + ((Fintype.card (InfinitePlace K) : ℝ) * + InfiniteIdeleGroup.logFundamentalBound (K := K))).prod + (FiniteIdeleGroup.isCompact_integralSubgroup (K := K)) + · exact isClosed_singleton.preimage + (InfiniteIdeleGroup.continuous_archimedeanNorm.comp continuous_fst) + +open scoped Classical in +theorem mem_compactIntegralNormOneSet_iff (a : IdeleGroup K) : + a ∈ compactIntegralNormOneSet (K := K) ↔ + a.1 ∈ InfiniteIdeleGroup.annulus (K := K) + ((Fintype.card (InfinitePlace K) : ℝ) * + InfiniteIdeleGroup.logFundamentalBound (K := K)) ∧ + a.2 ∈ FiniteIdeleGroup.integralSubgroup (K := K) ∧ + InfiniteIdeleGroup.archimedeanNorm a.1 = 1 := by + change + ((a.1 ∈ InfiniteIdeleGroup.annulus (K := K) + ((Fintype.card (InfinitePlace K) : ℝ) * + InfiniteIdeleGroup.logFundamentalBound (K := K)) ∧ + a.2 ∈ FiniteIdeleGroup.integralSubgroup (K := K)) ∧ + InfiniteIdeleGroup.archimedeanNorm a.1 = 1) ↔ _ + tauto + +open scoped Classical in +/-- A norm-one idele integral at every finite place is principal-equivalent +to an element of the fixed compact representative set. -/ +theorem exists_compactIntegralNormOneSet_representative + (a : IdeleGroup K) + (hnorm : a ∈ normOneSubgroup (K := K)) + (hintegral : + a.2 ∈ FiniteIdeleGroup.integralSubgroup (K := K)) : + ∃ b ∈ compactIntegralNormOneSet (K := K), + QuotientGroup.mk' (principalSubgroup K) b = + QuotientGroup.mk' (principalSubgroup K) a := by + obtain ⟨u, hu⟩ := + InfiniteIdeleGroup.exists_ringUnit_logNorm_le a.1 + let p : IdeleGroup K := + principalIdele K + (InfiniteIdeleGroup.ringUnitToFieldUnit (K := K) u) + let b : IdeleGroup K := a * p + have hpIntegral : + p ∈ integralAtFinitePlaces (K := K) := by + exact principalRingUnit_mem_integralAtFinitePlaces u + have hbIntegral : + b.2 ∈ FiniteIdeleGroup.integralSubgroup (K := K) := by + exact (integralAtFinitePlaces (K := K)).mul_mem hintegral + hpIntegral + have hpNorm : + p ∈ normOneSubgroup (K := K) := by + exact principalSubgroup_le_normOneSubgroup + ⟨InfiniteIdeleGroup.ringUnitToFieldUnit (K := K) u, rfl⟩ + have hbNorm : + b ∈ normOneSubgroup (K := K) := + (normOneSubgroup (K := K)).mul_mem hnorm hpNorm + have hbArch : + InfiniteIdeleGroup.archimedeanNorm b.1 = 1 := + archimedeanNorm_eq_one_of_normOne_integral b hbNorm hbIntegral + have hbLog : + ‖InfiniteIdeleGroup.logNorm b.1‖ ≤ + InfiniteIdeleGroup.logFundamentalBound (K := K) := by + exact hu + have hbAnnulus : + b.1 ∈ InfiniteIdeleGroup.annulus (K := K) + ((Fintype.card (InfinitePlace K) : ℝ) * + InfiniteIdeleGroup.logFundamentalBound (K := K)) := + InfiniteIdeleGroup.mem_annulus_of_logNorm_le + InfiniteIdeleGroup.logFundamentalBound_nonneg b.1 hbLog hbArch + refine ⟨b, + (mem_compactIntegralNormOneSet_iff b).mpr + ⟨hbAnnulus, hbIntegral, hbArch⟩, ?_⟩ + change + (QuotientGroup.mk' (principalSubgroup K)) (a * p) = + (QuotientGroup.mk' (principalSubgroup K)) a + rw [map_mul] + have hpOne : + QuotientGroup.mk' (principalSubgroup K) p = 1 := by + apply (QuotientGroup.eq_one_iff p).mpr + exact + ⟨InfiniteIdeleGroup.ringUnitToFieldUnit (K := K) u, rfl⟩ + rw [hpOne] + exact mul_one + (QuotientGroup.mk' (principalSubgroup K) a) + +open scoped Classical in +/-- For every ordinary ideal class which occurs on a norm-one idele, choose +one such representative; use `1` for the (irrelevant) remaining classes. -/ +def normOneIdealClassRepresentative + (c : ClassGroup (𝓞 K)) : IdeleGroup K := + if h : ∃ a : IdeleGroup K, + a ∈ normOneSubgroup (K := K) ∧ idealClass a = c then + Classical.choose h + else + 1 + +open scoped Classical in +private theorem normOneIdealClassRepresentative_mem + (c : ClassGroup (𝓞 K)) : + normOneIdealClassRepresentative (K := K) c ∈ + normOneSubgroup (K := K) := by + rw [normOneIdealClassRepresentative] + split_ifs with h + · exact (Classical.choose_spec h).1 + · exact (normOneSubgroup (K := K)).one_mem + +open scoped Classical in +private theorem idealClass_normOneIdealClassRepresentative + (c : ClassGroup (𝓞 K)) + (h : ∃ a : IdeleGroup K, + a ∈ normOneSubgroup (K := K) ∧ idealClass a = c) : + idealClass (normOneIdealClassRepresentative (K := K) c) = c := by + rw [normOneIdealClassRepresentative, dite_eq_left h] + exact (Classical.choose_spec h).2 + +open scoped Classical in +/-- The finite set of chosen norm-one representatives of ordinary ideal +classes. -/ +def normOneIdealClassRepresentativeSet : Set (IdeleGroup K) := + Set.range (normOneIdealClassRepresentative (K := K)) + +open scoped Classical in +theorem isCompact_normOneIdealClassRepresentativeSet : + IsCompact (normOneIdealClassRepresentativeSet (K := K)) := by + apply Set.Finite.isCompact + exact Set.finite_range _ + +open scoped Classical in +theorem normOneIdealClassRepresentativeSet_subset_normOne : + normOneIdealClassRepresentativeSet (K := K) ⊆ + (normOneSubgroup (K := K) : Set (IdeleGroup K)) := by + rintro _ ⟨c, rfl⟩ + exact normOneIdealClassRepresentative_mem c + +open scoped Classical in +/-- Remove the ordinary ideal class of a norm-one idele. The result is +integral at every finite place, and multiplying back by the chosen +representative recovers the original idele class. -/ +theorem exists_integral_normOne_reduction + (a : IdeleGroup K) + (ha : a ∈ normOneSubgroup (K := K)) : + ∃ b : IdeleGroup K, + b.2 ∈ FiniteIdeleGroup.integralSubgroup (K := K) ∧ + b ∈ normOneSubgroup (K := K) ∧ + QuotientGroup.mk' (principalSubgroup K) + (b * normOneIdealClassRepresentative + (K := K) (idealClass a)) = + QuotientGroup.mk' (principalSubgroup K) a := by + let r := + normOneIdealClassRepresentative (K := K) (idealClass a) + have hrNorm : r ∈ normOneSubgroup (K := K) := + normOneIdealClassRepresentative_mem (idealClass a) + have hrClass : idealClass r = idealClass a := + idealClass_normOneIdealClassRepresentative + (idealClass a) ⟨a, ha, rfl⟩ + let d : IdeleGroup K := a * r⁻¹ + have hdClass : idealClass d = 1 := by + dsimp [d] + rw [map_mul, map_inv, hrClass] + exact mul_inv_cancel _ + have hdPrincipal : + fractionalIdeal d ∈ + (toPrincipalIdeal (𝓞 K) K).range := by + change ClassGroup.mk K (fractionalIdeal d) = 1 at hdClass + exact (classGroup_mk_eq_one_iff (fractionalIdeal d)).mp hdClass + obtain ⟨x, hx⟩ := hdPrincipal + let p : IdeleGroup K := principalIdele K x + let b : IdeleGroup K := d * p⁻¹ + have hbIntegral : + b.2 ∈ FiniteIdeleGroup.integralSubgroup (K := K) := by + change b ∈ integralAtFinitePlaces (K := K) + rw [← fractionalIdeal_ker, MonoidHom.mem_ker] + dsimp [b, p] + rw [map_mul, map_inv, fractionalIdeal_principalIdele, + hx, mul_inv_cancel] + have hdNorm : + d ∈ normOneSubgroup (K := K) := + (normOneSubgroup (K := K)).mul_mem ha + ((normOneSubgroup (K := K)).inv_mem hrNorm) + have hpNorm : + p ∈ normOneSubgroup (K := K) := + principalSubgroup_le_normOneSubgroup ⟨x, rfl⟩ + have hbNorm : + b ∈ normOneSubgroup (K := K) := + (normOneSubgroup (K := K)).mul_mem hdNorm + ((normOneSubgroup (K := K)).inv_mem hpNorm) + refine ⟨b, hbIntegral, hbNorm, ?_⟩ + apply QuotientGroup.eq_iff_div_mem.mpr + change b * r * a⁻¹ ∈ principalSubgroup K + refine ⟨x⁻¹, ?_⟩ + dsimp [b, d, p] + rw [map_inv] + symm + calc + a * r⁻¹ * (principalIdele K x)⁻¹ * r * a⁻¹ = + (a * a⁻¹) * (r⁻¹ * r) * (principalIdele K x)⁻¹ := by + ac_rfl + _ = (principalIdele K x)⁻¹ := by simp + +open scoped Classical in +/-- A compact set of ideles meeting every norm-one idele class. -/ +def compactNormOneClassCover : Set (IdeleGroup K) := + compactIntegralNormOneSet (K := K) * + normOneIdealClassRepresentativeSet (K := K) + +open scoped Classical in +theorem isCompact_compactNormOneClassCover : + IsCompact (compactNormOneClassCover (K := K)) := + by + simpa [compactNormOneClassCover] using + (isCompact_compactIntegralNormOneSet (K := K)).mul + (isCompact_normOneIdealClassRepresentativeSet (K := K)) + +open scoped Classical in +theorem compactIntegralNormOneSet_subset_normOne : + compactIntegralNormOneSet (K := K) ⊆ + (normOneSubgroup (K := K) : Set (IdeleGroup K)) := by + intro a ha + rw [mem_compactIntegralNormOneSet_iff] at ha + have hfin := + finite_absoluteNorm_eq_one_of_integral a.2 ha.2.1 + change absoluteNorm a = 1 + rw [absoluteNorm_apply, hfin, ha.2.2, inv_one, mul_one] + +open scoped Classical in +theorem compactNormOneClassCover_subset_normOne : + compactNormOneClassCover (K := K) ⊆ + (normOneSubgroup (K := K) : Set (IdeleGroup K)) := by + rintro z ⟨b, hb, r, hr, rfl⟩ + exact (normOneSubgroup (K := K)).mul_mem + (compactIntegralNormOneSet_subset_normOne hb) + (normOneIdealClassRepresentativeSet_subset_normOne hr) + +end IdeleGroup + +namespace IdeleClassGroup + +open scoped Classical in +/-- The image of the compact idele cover is exactly the group of norm-one +idele classes. -/ +theorem image_compactNormOneClassCover : + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K)) '' + IdeleGroup.compactNormOneClassCover (K := K) = + (normOneSubgroup (K := K) : Set (IdeleClassGroup K)) := by + ext q + constructor + · rintro ⟨a, ha, rfl⟩ + exact (mk_mem_normOneSubgroup_iff (K := K) a).mpr + (IdeleGroup.compactNormOneClassCover_subset_normOne ha) + · intro hq + obtain ⟨a, rfl⟩ := + QuotientGroup.mk'_surjective + (IdeleGroup.principalSubgroup K) q + have ha : + a ∈ IdeleGroup.normOneSubgroup (K := K) := + (mk_mem_normOneSubgroup_iff a).mp hq + obtain ⟨b, hbIntegral, hbNorm, hbClass⟩ := + IdeleGroup.exists_integral_normOne_reduction a ha + obtain ⟨c, hcCompact, hcClass⟩ := + IdeleGroup.exists_compactIntegralNormOneSet_representative + b hbNorm hbIntegral + let r : IdeleGroup K := + IdeleGroup.normOneIdealClassRepresentative + (K := K) (IdeleGroup.idealClass a) + refine ⟨c * r, ?_, ?_⟩ + · exact + ⟨c, hcCompact, r, + ⟨IdeleGroup.idealClass a, rfl⟩, rfl⟩ + · calc + QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (c * r) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) c * + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) r := by + rw [map_mul] + _ = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) b * + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) r := by + rw [hcClass] + _ = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) (b * r) := by + rw [map_mul] + _ = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a := hbClass + +open scoped Classical in +/-- The norm-one idele class group is compact. -/ +theorem normOneSubgroup_isCompact : + IsCompact + ((normOneSubgroup (K := K) : + Subgroup (IdeleClassGroup K)) : Set (IdeleClassGroup K)) := by + rw [← image_compactNormOneClassCover (K := K)] + exact + (IdeleGroup.isCompact_compactNormOneClassCover (K := K)).image + QuotientGroup.continuous_mk + +open scoped Classical in +/-- Compact-space form of the compactness theorem for norm-one idele classes. -/ +instance normOneSubgroupCompactSpace : + CompactSpace (normOneSubgroup (K := K)) := + isCompact_iff_compactSpace.mp + (normOneSubgroup_isCompact (K := K)) + +end IdeleClassGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology.lean new file mode 100644 index 0000000000..9113a7a663 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ArchimedeanNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.Continuity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ExtensionBehavior +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.FiniteNormArithmetic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.IdeleClassNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.NormOne + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/All.lean new file mode 100644 index 0000000000..6522fec314 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/All.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ArchimedeanNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.Continuity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ExtensionBehavior +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.FiniteNormArithmetic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.IdeleClassNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.NormOne +/-! # Topological properties of idele norms -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ArchimedeanNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ArchimedeanNorm.lean new file mode 100644 index 0000000000..39adef7651 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ArchimedeanNorm.lean @@ -0,0 +1,367 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.FiniteNormArithmetic +/-! +# Archimedean behavior of idele norms + +The positive archimedean norm, and consequently the absolute idele norm, is +preserved by the ordinary norm in a finite number-field extension. +-/ + +@[expose] public section + +open scoped BigOperators NumberField NumberField.LiesOver +open NumberField IsDedekindDomain + +noncomputable +section + +namespace IdeleGroup + +universe u v + +variable + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] + [Algebra K L] [FiniteDimensional K L] + +private theorem nnnormUnitHom_map_ringEquiv_of_isometry + {F E : Type*} + [NormedField F] [NormedField E] + (e : F ≃+* E) (he : Isometry e) (x : Fˣ) : + nnnormUnitHom E + (Units.mapEquiv e.toMulEquiv x) = + nnnormUnitHom F x := by + apply Units.ext + apply NNReal.eq + exact + he.norm_map_of_map_zero (map_zero e) (x : F) + +/-- The ordinary norm from `ℂ` to `ℝ` squares the positive norm. -/ +private theorem nnnormUnitHom_real_normUnits_complex + (x : ℂˣ) : + nnnormUnitHom ℝ + (LocalFieldTheory.normUnits ℝ ℂ x) = + nnnormUnitHom ℂ x ^ 2 := by + apply Units.ext + apply NNReal.eq + change ‖Algebra.norm ℝ (x : ℂ)‖ = + ‖(x : ℂ)‖ ^ 2 + rw [Algebra.norm_complex_apply, Real.norm_eq_abs, + abs_of_nonneg (Complex.normSq_nonneg _), + Complex.normSq_eq_norm_sq] + +/-- Compatible isometric identifications with one field make the local norm preserve norm. -/ +private theorem nnnormUnitHom_normUnits_of_isometric_identifications + {F E B : Type*} [NormedField F] [NormedField E] [NormedField B] [Algebra F E] + (eBase : F ≃+* B) (eExtension : E ≃+* B) + (hBase : Isometry eBase) (hExtension : Isometry eExtension) + (hCompatible : (algebraMap B B).comp eBase.toRingHom = + eExtension.toRingHom.comp (algebraMap F E)) (x : Eˣ) : + nnnormUnitHom F (LocalFieldTheory.normUnits F E x) = nnnormUnitHom E x := by + have hNorm := LocalClassFieldTheory.normUnits_map_ringEquiv eBase eExtension hCompatible x + calc + nnnormUnitHom F (LocalFieldTheory.normUnits F E x) = + nnnormUnitHom B (Units.mapEquiv eBase.toMulEquiv + (LocalFieldTheory.normUnits F E x)) := + (nnnormUnitHom_map_ringEquiv_of_isometry eBase hBase _).symm + _ = nnnormUnitHom B (LocalFieldTheory.normUnits B B + (Units.mapEquiv eExtension.toMulEquiv x)) := congrArg _ hNorm + _ = nnnormUnitHom B (Units.mapEquiv eExtension.toMulEquiv x) := by + simp [LocalFieldTheory.normUnits] + _ = nnnormUnitHom E x := + nnnormUnitHom_map_ringEquiv_of_isometry eExtension hExtension x + +omit [NumberField K] [NumberField L] [FiniteDimensional K L] in +/-- At an infinite place, the positive norm of a local field norm, with +the base multiplicity, is the positive norm upstairs with the upstairs +multiplicity. -/ +private theorem nnnormUnitHom_normUnits_infinitePlace + (v₀ : InfinitePlace K) + (W : InfinitePlace L) + (hW : W ∈ v₀.placesOver L) + (x : W.Completionˣ) : + letI : W.1.LiesOver v₀.1 := hW + nnnormUnitHom v₀.Completion + (LocalFieldTheory.normUnits + v₀.Completion W.Completion x) ^ v₀.mult = + nnnormUnitHom W.Completion x ^ W.mult := by + let : W.1.LiesOver v₀.1 := hW + rcases v₀.isReal_or_isComplex with hvReal | hvComplex + · rcases W.isReal_or_isComplex with hWReal | hWComplex + · let eBase := + InfinitePlace.Completion.ringEquivRealOfIsReal hvReal + let eExtension := + InfinitePlace.Completion.ringEquivRealOfIsReal hWReal + let : + NumberField.ComplexEmbedding.LiesOver + (InfinitePlace.Completion.extensionEmbedding W) + (InfinitePlace.Completion.extensionEmbedding v₀) := + InfinitePlace.LiesOver.extensionEmbedding_liesOver_of_isReal + W hvReal + have hCompatible : + RingHom.comp (algebraMap ℝ ℝ) eBase.toRingHom = + RingHom.comp eExtension.toRingHom + (algebraMap v₀.Completion W.Completion) := by + ext z + change + InfinitePlace.Completion.extensionEmbeddingOfIsReal + hvReal z = + InfinitePlace.Completion.extensionEmbeddingOfIsReal + hWReal ((algebraMap v₀.Completion W.Completion) z) + apply Complex.ofReal_injective + simpa only [ + InfinitePlace.Completion.extensionEmbeddingOfIsReal_apply] using + (InfinitePlace.Completion.liesOver_extensionEmbedding_apply + W (v := v₀)).symm + rw [InfinitePlace.mult_isReal ⟨v₀, hvReal⟩, + InfinitePlace.mult_isReal ⟨W, hWReal⟩, pow_one, pow_one] + exact nnnormUnitHom_normUnits_of_isometric_identifications eBase eExtension + (InfinitePlace.Completion.isometryEquivRealOfIsReal hvReal).isometry + (InfinitePlace.Completion.isometryEquivRealOfIsReal hWReal).isometry hCompatible x + · let eBase := + InfinitePlace.Completion.ringEquivRealOfIsReal hvReal + let eExtension := + InfinitePlace.Completion.ringEquivComplexOfIsComplex hWComplex + let : + NumberField.ComplexEmbedding.LiesOver + (InfinitePlace.Completion.extensionEmbedding W) + (InfinitePlace.Completion.extensionEmbedding v₀) := + InfinitePlace.LiesOver.extensionEmbedding_liesOver_of_isReal + W hvReal + have hCompatible : + RingHom.comp (algebraMap ℝ ℂ) eBase.toRingHom = + RingHom.comp eExtension.toRingHom + (algebraMap v₀.Completion W.Completion) := by + ext z + simp [eBase, eExtension] + have hNorm := + LocalClassFieldTheory.normUnits_map_ringEquiv + eBase eExtension + hCompatible x + rw [InfinitePlace.mult_isReal ⟨v₀, hvReal⟩, + InfinitePlace.mult_isComplex ⟨W, hWComplex⟩, + pow_one] + calc + nnnormUnitHom v₀.Completion + (LocalFieldTheory.normUnits + v₀.Completion W.Completion x) = + nnnormUnitHom ℝ + (Units.mapEquiv eBase.toMulEquiv + (LocalFieldTheory.normUnits + v₀.Completion W.Completion x)) := by + symm + exact + nnnormUnitHom_map_ringEquiv_of_isometry + eBase + (InfinitePlace.Completion.isometryEquivRealOfIsReal + hvReal).isometry _ + _ = + nnnormUnitHom ℝ + (LocalFieldTheory.normUnits ℝ ℂ + (Units.mapEquiv eExtension.toMulEquiv x)) := by + rw [hNorm] + _ = + nnnormUnitHom ℂ + (Units.mapEquiv eExtension.toMulEquiv x) ^ 2 := + nnnormUnitHom_real_normUnits_complex + (Units.mapEquiv eExtension.toMulEquiv x) + _ = nnnormUnitHom W.Completion x ^ 2 := by + rw [nnnormUnitHom_map_ringEquiv_of_isometry + eExtension + (InfinitePlace.Completion.isometryEquivComplexOfIsComplex + hWComplex).isometry] + · have hWComplex : + W.IsComplex := + InfinitePlace.LiesOver.isComplex_of_isComplex_under + W hvComplex + let eBase := + InfinitePlace.Completion.ringEquivComplexOfIsComplex hvComplex + have hCore + (eExtension : W.Completion ≃+* ℂ) + (hCompatible : (algebraMap ℂ ℂ).comp eBase.toRingHom = + eExtension.toRingHom.comp (algebraMap v₀.Completion W.Completion)) + (hExtensionIsometry : Isometry eExtension) : + nnnormUnitHom v₀.Completion (LocalFieldTheory.normUnits v₀.Completion W.Completion x) = + nnnormUnitHom W.Completion x := + nnnormUnitHom_normUnits_of_isometric_identifications eBase eExtension + (InfinitePlace.Completion.isometryEquivComplexOfIsComplex hvComplex).isometry + hExtensionIsometry hCompatible x + rw [InfinitePlace.mult_isComplex ⟨v₀, hvComplex⟩, + InfinitePlace.mult_isComplex ⟨W, hWComplex⟩] + congr 1 + rcases + InfinitePlace.LiesOver.embedding_comp_eq_or_conjugate_embedding_comp_eq + W v₀ with hEmbedding | hConjugate + · let eExtension := + InfinitePlace.Completion.ringEquivComplexOfIsComplex hWComplex + let : + NumberField.ComplexEmbedding.LiesOver W.embedding v₀.embedding := + ⟨hEmbedding⟩ + let : + NumberField.ComplexEmbedding.LiesOver + (InfinitePlace.Completion.extensionEmbedding W) + (InfinitePlace.Completion.extensionEmbedding v₀) := + InfinitePlace.Completion.liesOver_extensionEmbedding W v₀ + have hCompatible : + RingHom.comp (algebraMap ℂ ℂ) eBase.toRingHom = + RingHom.comp eExtension.toRingHom + (algebraMap v₀.Completion W.Completion) := by + ext z + change + InfinitePlace.Completion.extensionEmbedding v₀ z = + InfinitePlace.Completion.extensionEmbedding W + ((algebraMap v₀.Completion W.Completion) z) + exact + (InfinitePlace.Completion.liesOver_extensionEmbedding_apply + W (v := v₀)).symm + exact + hCore eExtension hCompatible + (InfinitePlace.Completion.isometryEquivComplexOfIsComplex + hWComplex).isometry + · let eExtension := + (InfinitePlace.Completion.ringEquivComplexOfIsComplex hWComplex).trans + (starRingAut (R := ℂ)) + let : + NumberField.ComplexEmbedding.LiesOver + (ComplexEmbedding.conjugate W.embedding) v₀.embedding := + ⟨hConjugate⟩ + let : + NumberField.ComplexEmbedding.LiesOver + (ComplexEmbedding.conjugate + (InfinitePlace.Completion.extensionEmbedding W)) + (InfinitePlace.Completion.extensionEmbedding v₀) := + InfinitePlace.Completion.liesOver_conjugate_extensionEmbedding W v₀ + have hCompatible : + RingHom.comp (algebraMap ℂ ℂ) eBase.toRingHom = + RingHom.comp eExtension.toRingHom + (algebraMap v₀.Completion W.Completion) := by + ext z + simp [eBase, eExtension, ← ComplexEmbedding.conjugate_coe_eq] + have hExtensionIsometry : Isometry eExtension := by + intro y z + change + edist (star (InfinitePlace.Completion.extensionEmbedding W y)) + (star (InfinitePlace.Completion.extensionEmbedding W z)) = + edist y z + calc + edist (star (InfinitePlace.Completion.extensionEmbedding W y)) + (star (InfinitePlace.Completion.extensionEmbedding W z)) = + edist (InfinitePlace.Completion.extensionEmbedding W y) + (InfinitePlace.Completion.extensionEmbedding W z) := + star_isometry.edist_eq _ _ + _ = edist y z := + (InfinitePlace.Completion.isometry_extensionEmbedding W).edist_eq _ _ + exact hCore eExtension hCompatible hExtensionIsometry + +/-- The archimedean positive norm is preserved by the ordinary idele norm. -/ +theorem archimedeanNorm_norm + (a : IdeleGroup L) : + InfiniteIdeleGroup.archimedeanNorm + (norm K L a).1 = + InfiniteIdeleGroup.archimedeanNorm a.1 := by + classical + let : ∀ (v₀ : InfinitePlace K) + (W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀}), + W.1.1.LiesOver v₀.1 := + fun v₀ W => + ⟨congrArg (fun q : InfinitePlace K => q.1) W.2⟩ + let : ∀ (v₀ : InfinitePlace K) + (W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀}), + Algebra v₀.Completion W.1.Completion := + fun v₀ W => + (NumberField.LiesOver.completionMap + (v := v₀) (w := W.1)).toAlgebra + rw [InfiniteIdeleGroup.archimedeanNorm_apply, + InfiniteIdeleGroup.archimedeanNorm_apply] + change + (∏ v₀ : InfinitePlace K, + nnnormUnitHom v₀.Completion + (infiniteComponent v₀ (norm K L a)) ^ v₀.mult) = + ∏ W : InfinitePlace L, + nnnormUnitHom W.Completion + (infiniteComponent W a) ^ W.mult + calc + (∏ v₀ : InfinitePlace K, + nnnormUnitHom v₀.Completion + (infiniteComponent v₀ (norm K L a)) ^ v₀.mult) = + ∏ v₀ : InfinitePlace K, + ∏ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀}, + nnnormUnitHom v₀.Completion + (LocalFieldTheory.normUnits + v₀.Completion W.1.Completion + (infiniteComponent W.1 a)) ^ v₀.mult := by + apply Finset.prod_congr rfl + intro v₀ _ + rw [infiniteComponent_norm_eq_prod] + let vK := v₀.1 + let hvK : vK.IsNontrivial := v₀.isNontrivial + let := + AlgebraicNumberTheory.Valuations.completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + let eAbove := + infinitePlaceAboveEquivExtension (K := K) (L := L) v₀ + have hUniv : + @Finset.univ + {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀} + (Fintype.ofEquiv + (AlgebraicNumberTheory.Valuations.AbsoluteValueExtension vK L) + eAbove.symm) = + @Finset.univ + {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀} + (Subtype.fintype fun W => + _root_.infinitePlaceBelow (K := K) W = v₀) := by + ext W + simp + rw [hUniv] + rw [map_prod, Finset.prod_pow] + _ = + ∏ v₀ : InfinitePlace K, + ∏ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀}, + nnnormUnitHom W.1.Completion + (infiniteComponent W.1 a) ^ W.1.mult := by + apply Finset.prod_congr rfl + intro v₀ _ + apply Finset.prod_congr rfl + intro W _ + exact + nnnormUnitHom_normUnits_infinitePlace + (K := K) (L := L) v₀ W.1 + ⟨congrArg (fun q : InfinitePlace K => q.1) W.2⟩ + (infiniteComponent W.1 a) + _ = + ∏ W : InfinitePlace L, + nnnormUnitHom W.Completion + (infiniteComponent W a) ^ W.mult := by + exact + Fintype.prod_fiberwise + (_root_.infinitePlaceBelow (K := K)) + (fun W : InfinitePlace L => + nnnormUnitHom W.Completion + (infiniteComponent W a) ^ W.mult) + +/-- The absolute idele norm is preserved by the ordinary idele norm. -/ +theorem absoluteNorm_norm + (a : IdeleGroup L) : + absoluteNorm (norm K L a) = + absoluteNorm a := by + rw [absoluteNorm_apply, absoluteNorm_apply, + finiteAbsoluteNorm_norm, archimedeanNorm_norm] + + +end IdeleGroup + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/Continuity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/Continuity.lean new file mode 100644 index 0000000000..153c173f58 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/Continuity.lean @@ -0,0 +1,673 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormLocalOrder +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.IdeleSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Localization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormContinuity +/-! +# Continuity of the global idele norm + +The norm on ideles in a finite number-field extension is continuous. The +proof works first on the open chart with integral finite components and then +uses the topological-group structure to obtain continuity everywhere. +-/ + +@[expose] public section + +open scoped BigOperators NumberField NumberField.LiesOver +open NumberField IsDedekindDomain + +noncomputable +section + +namespace IdeleGroup + +open AlgebraicNumberTheory.Valuations + +universe u v w + +variable + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] + [Algebra K L] [FiniteDimensional K L] + +/-- A concrete finite-place local norm carries concrete integer units to +concrete integer units. -/ +theorem finitePlace_normUnits_mem_integerUnits + (v₀ : HeightOneSpectrum (𝓞 K)) + (W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀}) + (z : (W.1.adicCompletionIntegers L).units) : + letI : Algebra (v₀.adicCompletion K) (W.1.adicCompletion L) := + (finitePlaceAdicCompletionMap K L v₀ W).toAlgebra + LocalFieldTheory.normUnits + (v₀.adicCompletion K) (W.1.adicCompletion L) + ((W.1.adicCompletionIntegers L).units.subtype z) ∈ + (v₀.adicCompletionIntegers K).units := by + let : Algebra + (v₀.adicCompletion K) (W.1.adicCompletion L) := + (finitePlaceAdicCompletionMap K L v₀ W).toAlgebra + apply + (FiniteIdeleGroup.localOrder_eq_zero_iff v₀ + (LocalFieldTheory.normUnits + (v₀.adicCompletion K) (W.1.adicCompletion L) + ((W.1.adicCompletionIntegers L).units.subtype z))).mp + rw [FiniteIdeleGroup.localOrder_normUnits] + rw [(FiniteIdeleGroup.localOrder_eq_zero_iff W.1 + ((W.1.adicCompletionIntegers L).units.subtype z)).mpr z.property] + simp + +omit [FiniteDimensional K L] in +private theorem finitePlace_normUnits_continuous + (v₀ : HeightOneSpectrum (𝓞 K)) + (W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀}) : + letI : Algebra (v₀.adicCompletion K) (W.1.adicCompletion L) := + (finitePlaceAdicCompletionMap K L v₀ W).toAlgebra + Continuous + (LocalFieldTheory.normUnits + (v₀.adicCompletion K) (W.1.adicCompletion L)) := by + let : Algebra (v₀.adicCompletion K) (W.1.adicCompletion L) := + (finitePlaceAdicCompletionMap K L v₀ W).toAlgebra + let : IsScalarTower + K (v₀.adicCompletion K) (W.1.adicCompletion L) := + finitePlaceAdicCompletionMap_isScalarTower K L v₀ W + let : ContinuousSMul + (v₀.adicCompletion K) (W.1.adicCompletion L) := + continuousSMul_of_algebraMap _ _ (by + change Continuous (finitePlaceAdicCompletionMap K L v₀ W) + exact finitePlaceAdicCompletionMap_continuous K L v₀ W) + let : FiniteDimensional + (v₀.adicCompletion K) (W.1.adicCompletion L) := + inferInstance + let : NontriviallyNormedField (v₀.adicCompletion K) := + NontriviallyNormedField.ofNormNeOne (by + obtain ⟨ϖ, hϖ⟩ := + IsDiscreteValuationRing.exists_irreducible + (v₀.adicCompletionIntegers K) + refine ⟨(ϖ : v₀.adicCompletion K), ?_, ?_⟩ + · intro h + exact hϖ.ne_zero (Subtype.ext h) + · exact ne_of_lt (RayClass.local_irreducible_norm_lt_one v₀ hϖ)) + exact + LocalFieldTheory.normUnits_continuous_of_finiteDimensional + (v₀.adicCompletion K) (W.1.adicCompletion L) + +/-- The product of all finite local norms on the integral finite components. -/ +private noncomputable def integralFiniteNormComponents + (a : + InfiniteIdeleGroup L × + (∀ W : HeightOneSpectrum (𝓞 L), + (W.adicCompletionIntegers L).units)) : + ∀ v₀ : HeightOneSpectrum (𝓞 K), + (v₀.adicCompletionIntegers K).units := + fun v₀ => by + classical + let vK := HeightOneSpectrum.adicAbv K v₀ + let hvK0 : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v₀ + let eAbove := + finitePlaceExtensionEquivAbove + (K := K) (L := L) v₀ + letI := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK0 + letI : Fintype {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀} := + Fintype.ofEquiv (AbsoluteValueExtension vK L) eAbove + letI : ∀ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀}, + Algebra (v₀.adicCompletion K) (W.1.adicCompletion L) := + fun W => + (finitePlaceAdicCompletionMap K L v₀ W).toAlgebra + refine + ⟨∏ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀}, + LocalFieldTheory.normUnits + (v₀.adicCompletion K) (W.1.adicCompletion L) + ((W.1.adicCompletionIntegers L).units.subtype (a.2 W.1)), ?_⟩ + exact + Subgroup.prod_mem + (v₀.adicCompletionIntegers K).units + (t := Finset.univ) + (f := fun W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀} => + LocalFieldTheory.normUnits + (v₀.adicCompletion K) (W.1.adicCompletion L) + ((W.1.adicCompletionIntegers L).units.subtype (a.2 W.1))) + (fun W _ => + finitePlace_normUnits_mem_integerUnits + (K := K) (L := L) v₀ W (a.2 W.1)) + +/-- The finite local norm product is continuous on the integral-idele chart. -/ +private theorem integralFiniteNormComponents_continuous : + Continuous (integralFiniteNormComponents K L) := by + rw [continuous_pi_iff] + intro v₀ + apply continuous_induced_rng.mpr + classical + let vK := HeightOneSpectrum.adicAbv K v₀ + let hvK0 : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v₀ + let eAbove := + finitePlaceExtensionEquivAbove + (K := K) (L := L) v₀ + let := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK0 + let : Fintype {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀} := + Fintype.ofEquiv (AbsoluteValueExtension vK L) eAbove + let : ∀ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀}, + Algebra (v₀.adicCompletion K) (W.1.adicCompletion L) := + fun W => + (finitePlaceAdicCompletionMap K L v₀ W).toAlgebra + apply continuous_finsetProd Finset.univ + intro W _ + exact + (finitePlace_normUnits_continuous + (K := K) (L := L) v₀ W).comp + (continuous_subtype_val.comp + ((continuous_apply W.1).comp continuous_snd)) + +/-- The product of the archimedean local norms on the integral-idele chart. -/ +private noncomputable def integralInfiniteNormComponents + (a : + InfiniteIdeleGroup L × + (∀ W : HeightOneSpectrum (𝓞 L), + (W.adicCompletionIntegers L).units)) : + ∀ v₀ : InfinitePlace K, v₀.Completionˣ := + fun v₀ => by + classical + letI : ∀ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀}, + W.1.1.LiesOver v₀.1 := + fun W => + ⟨congrArg (fun q : InfinitePlace K => q.1) W.2⟩ + letI : ∀ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀}, + Algebra v₀.Completion W.1.Completion := + fun W => + (NumberField.LiesOver.completionMap + (v := v₀) (w := W.1)).toAlgebra + exact + ∏ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀}, + LocalFieldTheory.normUnits + v₀.Completion W.1.Completion + (ContinuousMulEquiv.piUnits a.1 W.1) + +/-- Compatible changes of fields transport continuity of the norm on units. -/ +private theorem normUnits_continuous_of_ringEquivs + {F E F' E' : Type*} [Field F] [Field E] [Field F'] [Field E'] + [TopologicalSpace F] [TopologicalSpace E] [TopologicalSpace F'] [TopologicalSpace E'] + [Algebra F E] [Algebra F' E'] (eBase : F ≃+* F') (eExtension : E ≃+* E') + (hCompatible : (algebraMap F' E').comp eBase.toRingHom = + eExtension.toRingHom.comp (algebraMap F E)) + (hBase : Continuous (Units.mapEquiv eBase.toMulEquiv).symm) + (hExtension : Continuous (Units.mapEquiv eExtension.toMulEquiv)) + (hNorm : Continuous (LocalFieldTheory.normUnits F' E')) : + Continuous (LocalFieldTheory.normUnits F E) := by + let eBaseUnits := Units.mapEquiv eBase.toMulEquiv + let eExtensionUnits := Units.mapEquiv eExtension.toMulEquiv + have hNormEq : (fun x : Eˣ => LocalFieldTheory.normUnits F E x) = + fun x => eBaseUnits.symm (LocalFieldTheory.normUnits F' E' (eExtensionUnits x)) := by + funext x + apply eBaseUnits.injective + rw [eBaseUnits.apply_symm_apply] + exact LocalClassFieldTheory.normUnits_map_ringEquiv eBase eExtension hCompatible x + change Continuous (fun x : Eˣ => LocalFieldTheory.normUnits F E x) + rw [hNormEq] + exact hBase.comp (hNorm.comp hExtension) + +omit [NumberField L] in +/-- A norm between completions at infinite places is continuous. -/ +private theorem infinitePlace_normUnits_continuous + (v₀ : InfinitePlace K) + (W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀}) : + letI : W.1.1.LiesOver v₀.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) W.2⟩ + letI : Algebra v₀.Completion W.1.Completion := + (NumberField.LiesOver.completionMap + (v := v₀) (w := W.1)).toAlgebra + Continuous + (LocalFieldTheory.normUnits v₀.Completion W.1.Completion) := by + let : W.1.1.LiesOver v₀.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) W.2⟩ + let : Algebra v₀.Completion W.1.Completion := + (NumberField.LiesOver.completionMap + (v := v₀) (w := W.1)).toAlgebra + rcases v₀.isReal_or_isComplex with hvReal | hvComplex + · rcases W.1.isReal_or_isComplex with hWReal | hWComplex + · let eBase := + InfinitePlace.Completion.ringEquivRealOfIsReal hvReal + let eExtension := + InfinitePlace.Completion.ringEquivRealOfIsReal hWReal + let eBaseUnits : v₀.Completionˣ ≃* ℝˣ := + Units.mapEquiv eBase.toMulEquiv + let eExtensionUnits : W.1.Completionˣ ≃* ℝˣ := + Units.mapEquiv eExtension.toMulEquiv + let : + NumberField.ComplexEmbedding.LiesOver + (InfinitePlace.Completion.extensionEmbedding W.1) + (InfinitePlace.Completion.extensionEmbedding v₀) := + InfinitePlace.LiesOver.extensionEmbedding_liesOver_of_isReal + W.1 hvReal + have hCompatible : + RingHom.comp (algebraMap ℝ ℝ) eBase.toRingHom = + RingHom.comp eExtension.toRingHom + (algebraMap v₀.Completion W.1.Completion) := by + ext z + change + InfinitePlace.Completion.extensionEmbeddingOfIsReal + hvReal z = + InfinitePlace.Completion.extensionEmbeddingOfIsReal + hWReal ((algebraMap v₀.Completion W.1.Completion) z) + apply Complex.ofReal_injective + simpa only [ + InfinitePlace.Completion.extensionEmbeddingOfIsReal_apply] using + (InfinitePlace.Completion.liesOver_extensionEmbedding_apply + W.1 (v := v₀)).symm + have hBaseUnitsContinuous : Continuous eBaseUnits.symm := by + change Continuous (Units.map eBase.symm.toMonoidHom) + simpa only [eBase] using + (InfinitePlace.Completion.isometryEquivRealOfIsReal hvReal).symm.continuous.units_map _ + have hExtensionUnitsContinuous : Continuous eExtensionUnits := by + change Continuous (Units.map eExtension.toMonoidHom) + refine + ((InfinitePlace.Completion.isometryEquivRealOfIsReal hWReal).continuous.units_map + _).congr ?_ + intro x + apply Units.ext + rfl + exact normUnits_continuous_of_ringEquivs eBase eExtension hCompatible + hBaseUnitsContinuous hExtensionUnitsContinuous + (LocalFieldTheory.normUnits_continuous_of_finiteDimensional ℝ ℝ) + · let eBase := + InfinitePlace.Completion.ringEquivRealOfIsReal hvReal + let eExtension := + InfinitePlace.Completion.ringEquivComplexOfIsComplex hWComplex + let eBaseUnits : v₀.Completionˣ ≃* ℝˣ := + Units.mapEquiv eBase.toMulEquiv + let eExtensionUnits : W.1.Completionˣ ≃* ℂˣ := + Units.mapEquiv eExtension.toMulEquiv + let : + NumberField.ComplexEmbedding.LiesOver + (InfinitePlace.Completion.extensionEmbedding W.1) + (InfinitePlace.Completion.extensionEmbedding v₀) := + InfinitePlace.LiesOver.extensionEmbedding_liesOver_of_isReal + W.1 hvReal + have hCompatible : + RingHom.comp (algebraMap ℝ ℂ) eBase.toRingHom = + RingHom.comp eExtension.toRingHom + (algebraMap v₀.Completion W.1.Completion) := by + ext z + simp [eBase, eExtension] + have hBaseUnitsContinuous : Continuous eBaseUnits.symm := by + change Continuous (Units.map eBase.symm.toMonoidHom) + simpa only [eBase] using + (InfinitePlace.Completion.isometryEquivRealOfIsReal hvReal).symm.continuous.units_map _ + have hExtensionUnitsContinuous : Continuous eExtensionUnits := by + change Continuous (Units.map eExtension.toMonoidHom) + refine + ((InfinitePlace.Completion.isometryEquivComplexOfIsComplex + hWComplex).continuous.units_map _).congr ?_ + intro x + apply Units.ext + rfl + exact normUnits_continuous_of_ringEquivs eBase eExtension hCompatible + hBaseUnitsContinuous hExtensionUnitsContinuous + (LocalFieldTheory.normUnits_continuous_of_finiteDimensional ℝ ℂ) + · have hWComplex : W.1.IsComplex := + InfinitePlace.LiesOver.isComplex_of_isComplex_under W.1 hvComplex + let eBase := + InfinitePlace.Completion.ringEquivComplexOfIsComplex hvComplex + let eBaseUnits : v₀.Completionˣ ≃* ℂˣ := + Units.mapEquiv eBase.toMulEquiv + have hBaseUnitsContinuous : Continuous eBaseUnits.symm := by + change Continuous (Units.map eBase.symm.toMonoidHom) + simpa only [eBase] using + (InfinitePlace.Completion.isometryEquivComplexOfIsComplex + hvComplex).symm.continuous.units_map _ + rcases + InfinitePlace.LiesOver.embedding_comp_eq_or_conjugate_embedding_comp_eq + W.1 v₀ with hEmbedding | hConjugate + · let eExtension := + InfinitePlace.Completion.ringEquivComplexOfIsComplex hWComplex + let eExtensionUnits : W.1.Completionˣ ≃* ℂˣ := + Units.mapEquiv eExtension.toMulEquiv + let : + NumberField.ComplexEmbedding.LiesOver W.1.embedding v₀.embedding := + ⟨hEmbedding⟩ + let : + NumberField.ComplexEmbedding.LiesOver + (InfinitePlace.Completion.extensionEmbedding W.1) + (InfinitePlace.Completion.extensionEmbedding v₀) := + InfinitePlace.Completion.liesOver_extensionEmbedding W.1 v₀ + have hCompatible : + RingHom.comp (algebraMap ℂ ℂ) eBase.toRingHom = + RingHom.comp eExtension.toRingHom + (algebraMap v₀.Completion W.1.Completion) := by + ext z + change + InfinitePlace.Completion.extensionEmbedding v₀ z = + InfinitePlace.Completion.extensionEmbedding W.1 + ((algebraMap v₀.Completion W.1.Completion) z) + exact + (InfinitePlace.Completion.liesOver_extensionEmbedding_apply + W.1 (v := v₀)).symm + have hExtensionUnitsContinuous : Continuous eExtensionUnits := by + change Continuous (Units.map eExtension.toMonoidHom) + refine + ((InfinitePlace.Completion.isometryEquivComplexOfIsComplex + hWComplex).continuous.units_map _).congr ?_ + intro x + apply Units.ext + rfl + exact normUnits_continuous_of_ringEquivs eBase eExtension hCompatible + hBaseUnitsContinuous hExtensionUnitsContinuous + (LocalFieldTheory.normUnits_continuous_of_finiteDimensional ℂ ℂ) + · let eExtension := + (InfinitePlace.Completion.ringEquivComplexOfIsComplex hWComplex).trans + (starRingAut (R := ℂ)) + let eExtensionUnits : W.1.Completionˣ ≃* ℂˣ := + Units.mapEquiv eExtension.toMulEquiv + let : + NumberField.ComplexEmbedding.LiesOver + (ComplexEmbedding.conjugate W.1.embedding) v₀.embedding := + ⟨hConjugate⟩ + let : + NumberField.ComplexEmbedding.LiesOver + (ComplexEmbedding.conjugate + (InfinitePlace.Completion.extensionEmbedding W.1)) + (InfinitePlace.Completion.extensionEmbedding v₀) := + InfinitePlace.Completion.liesOver_conjugate_extensionEmbedding W.1 v₀ + have hCompatible : + RingHom.comp (algebraMap ℂ ℂ) eBase.toRingHom = + RingHom.comp eExtension.toRingHom + (algebraMap v₀.Completion W.1.Completion) := by + ext z + simp [eBase, eExtension, ← ComplexEmbedding.conjugate_coe_eq] + have hExtensionContinuous : Continuous eExtension := by + refine + (InfinitePlace.Completion.isometry_extensionEmbedding W.1).continuous.star.congr ?_ + intro x + change + star (InfinitePlace.Completion.extensionEmbedding W.1 x) = + star (InfinitePlace.Completion.extensionEmbedding W.1 x) + rfl + have hExtensionUnitsContinuous : Continuous eExtensionUnits := by + change Continuous (Units.map eExtension.toMonoidHom) + exact hExtensionContinuous.units_map _ + exact normUnits_continuous_of_ringEquivs eBase eExtension hCompatible + hBaseUnitsContinuous hExtensionUnitsContinuous + (LocalFieldTheory.normUnits_continuous_of_finiteDimensional ℂ ℂ) + +/-- The archimedean local norm product is continuous on the +integral-idele chart. -/ +private theorem integralInfiniteNormComponents_continuous : + Continuous (integralInfiniteNormComponents K L) := by + rw [continuous_pi_iff] + intro v₀ + classical + let : ∀ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀}, + W.1.1.LiesOver v₀.1 := + fun W => + ⟨congrArg (fun q : InfinitePlace K => q.1) W.2⟩ + let : ∀ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀}, + Algebra v₀.Completion W.1.Completion := + fun W => + (NumberField.LiesOver.completionMap + (v := v₀) (w := W.1)).toAlgebra + apply continuous_finsetProd Finset.univ + intro W _ + exact + (infinitePlace_normUnits_continuous + (K := K) (L := L) v₀ W).comp + ((continuous_apply W.1).comp + (ContinuousMulEquiv.piUnits.continuous.comp continuous_fst)) + +/-- The open chart consisting of arbitrary infinite components and integral +finite components. -/ +private def integralIdeleEmbedding + (F : Type w) [Field F] [NumberField F] : + (InfiniteIdeleGroup F × + (∀ v₀ : HeightOneSpectrum (𝓞 F), + (v₀.adicCompletionIntegers F).units)) → + IdeleGroup F := + Prod.map id + (RestrictedProduct.structureMap + (fun v₀ : HeightOneSpectrum (𝓞 F) => + (v₀.adicCompletion F)ˣ) + (fun v₀ : HeightOneSpectrum (𝓞 F) => + ((v₀.adicCompletionIntegers F).units : + Set (v₀.adicCompletion F)ˣ)) + Filter.cofinite) + +/-- The integral-idele chart is an open subspace of the idele group. -/ +private theorem integralIdeleEmbedding_isOpenEmbedding + (F : Type w) [Field F] [NumberField F] : + Topology.IsOpenEmbedding (integralIdeleEmbedding F) := by + exact + Topology.IsOpenEmbedding.id.prodMap + (RestrictedProduct.isOpenEmbedding_structureMap + (isOpen_finiteLocalUnits F)) + +/-- The finite part of the norm on the integral chart is the restricted +product structure map of the finite local norm products. -/ +private theorem norm_integralIdeleEmbedding_finite + (a : + InfiniteIdeleGroup L × + (∀ W : HeightOneSpectrum (𝓞 L), + (W.adicCompletionIntegers L).units)) : + (norm K L (integralIdeleEmbedding L a)).2 = + RestrictedProduct.structureMap + (fun v₀ : HeightOneSpectrum (𝓞 K) => + (v₀.adicCompletion K)ˣ) + (fun v₀ : HeightOneSpectrum (𝓞 K) => + ((v₀.adicCompletionIntegers K).units : + Set (v₀.adicCompletion K)ˣ)) + Filter.cofinite + (integralFiniteNormComponents K L a) := by + classical + apply RestrictedProduct.ext + intro v₀ + let vK := HeightOneSpectrum.adicAbv K v₀ + let hvK0 : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v₀ + let eAbove := + finitePlaceExtensionEquivAbove + (K := K) (L := L) v₀ + let := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK0 + let : Fintype {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀} := + Fintype.ofEquiv (AbsoluteValueExtension vK L) eAbove + let : ∀ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀}, + Algebra (v₀.adicCompletion K) (W.1.adicCompletion L) := + fun W => + (finitePlaceAdicCompletionMap K L v₀ W).toAlgebra + change + finiteComponent v₀ + (norm K L (integralIdeleEmbedding L a)) = + ∏ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀}, + LocalFieldTheory.normUnits + (v₀.adicCompletion K) (W.1.adicCompletion L) + ((W.1.adicCompletionIntegers L).units.subtype (a.2 W.1)) + rw [finiteComponent_norm_eq_prod] + rfl + +/-- The infinite part of the norm on the integral chart is the product of +the archimedean local norms. -/ +private theorem norm_integralIdeleEmbedding_infinite + (a : + InfiniteIdeleGroup L × + (∀ W : HeightOneSpectrum (𝓞 L), + (W.adicCompletionIntegers L).units)) : + (norm K L (integralIdeleEmbedding L a)).1 = + ContinuousMulEquiv.piUnits.symm + (integralInfiniteNormComponents K L a) := by + classical + apply ContinuousMulEquiv.piUnits.injective + funext v₀ + let : ∀ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀}, + W.1.1.LiesOver v₀.1 := + fun W => + ⟨congrArg (fun q : InfinitePlace K => q.1) W.2⟩ + let vK := v₀.1 + let hvK : vK.IsNontrivial := v₀.isNontrivial + let := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + change + infiniteComponent v₀ + (norm K L (integralIdeleEmbedding L a)) = + ∏ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀}, + LocalFieldTheory.normUnits + v₀.Completion W.1.Completion + (ContinuousMulEquiv.piUnits a.1 W.1) + rw [infiniteComponent_norm_eq_prod] + let eAbove := + infinitePlaceAboveEquivExtension (K := K) (L := L) v₀ + have hUniv : + @Finset.univ + {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀} + (Fintype.ofEquiv (AbsoluteValueExtension v₀.1 L) eAbove.symm) = + @Finset.univ + {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀} + (Subtype.fintype fun W => + _root_.infinitePlaceBelow (K := K) W = v₀) := by + ext W + simp + rw [hUniv] + rfl + +/-- The actual idele norm is continuous on the open integral-idele chart. -/ +private theorem norm_comp_integralIdeleEmbedding_continuous : + Continuous + ((norm K L : IdeleGroup L → IdeleGroup K) ∘ + integralIdeleEmbedding L) := by + let target : + (InfiniteIdeleGroup L × + (∀ W : HeightOneSpectrum (𝓞 L), + (W.adicCompletionIntegers L).units)) → + IdeleGroup K := + fun a => + (ContinuousMulEquiv.piUnits.symm + (integralInfiniteNormComponents K L a), + RestrictedProduct.structureMap + (fun v₀ : HeightOneSpectrum (𝓞 K) => + (v₀.adicCompletion K)ˣ) + (fun v₀ : HeightOneSpectrum (𝓞 K) => + ((v₀.adicCompletionIntegers K).units : + Set (v₀.adicCompletion K)ˣ)) + Filter.cofinite + (integralFiniteNormComponents K L a)) + have hInfinite : + Continuous (fun a => + ContinuousMulEquiv.piUnits.symm + (integralInfiniteNormComponents K L a)) := + ContinuousMulEquiv.piUnits.symm.continuous.comp + (integralInfiniteNormComponents_continuous K L) + have hFinite : + Continuous (fun a => + RestrictedProduct.structureMap + (fun v₀ : HeightOneSpectrum (𝓞 K) => + (v₀.adicCompletion K)ˣ) + (fun v₀ : HeightOneSpectrum (𝓞 K) => + ((v₀.adicCompletionIntegers K).units : + Set (v₀.adicCompletion K)ˣ)) + Filter.cofinite + (integralFiniteNormComponents K L a)) := + (RestrictedProduct.isOpenEmbedding_structureMap + (isOpen_finiteLocalUnits K)).continuous.comp + (integralFiniteNormComponents_continuous K L) + have hTarget : Continuous target := + hInfinite.prodMk hFinite + rw [show + ((norm K L : IdeleGroup L → IdeleGroup K) ∘ + integralIdeleEmbedding L) = target by + funext a + apply Prod.ext + · exact norm_integralIdeleEmbedding_infinite K L a + · exact norm_integralIdeleEmbedding_finite K L a] + exact hTarget + +/-- The norm on the idele group of a finite extension is continuous. -/ +theorem norm_continuous : + Continuous (norm K L) := by + have hChartAt : + ContinuousAt + ((norm K L : IdeleGroup L → IdeleGroup K) ∘ + integralIdeleEmbedding L) + (1 : + InfiniteIdeleGroup L × + (∀ W : HeightOneSpectrum (𝓞 L), + (W.adicCompletionIntegers L).units)) := + (norm_comp_integralIdeleEmbedding_continuous K L).continuousAt + have hAt : + ContinuousAt (norm K L) (1 : IdeleGroup L) := by + have hAtChart : + ContinuousAt (norm K L) + (integralIdeleEmbedding L + (1 : + InfiniteIdeleGroup L × + (∀ W : HeightOneSpectrum (𝓞 L), + (W.adicCompletionIntegers L).units))) := + ((integralIdeleEmbedding_isOpenEmbedding L).continuousAt_iff + (g := (norm K L : IdeleGroup L → IdeleGroup K))).mp hChartAt + have hOne : + integralIdeleEmbedding L + (1 : + InfiniteIdeleGroup L × + (∀ W : HeightOneSpectrum (𝓞 L), + (W.adicCompletionIntegers L).units)) = + (1 : IdeleGroup L) := by + apply Prod.ext + · rfl + · apply RestrictedProduct.ext + intro W + rfl + rw [hOne] at hAtChart + exact hAtChart + exact continuous_of_continuousAt_one (norm K L) hAt + +/-- The idele norm bundled as a continuous monoid homomorphism. -/ +noncomputable def ideleNormContinuousMonoidHom : + IdeleGroup L →ₜ* IdeleGroup K where + __ := norm K L + continuous_toFun := norm_continuous K L + +@[simp] +theorem ideleNormContinuousMonoidHom_apply + (a : IdeleGroup L) : + ideleNormContinuousMonoidHom K L a = norm K L a := + rfl + +end IdeleGroup + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ExtensionBehavior.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ExtensionBehavior.lean new file mode 100644 index 0000000000..0a53770713 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ExtensionBehavior.lean @@ -0,0 +1,415 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.FiniteNormArithmetic +/-! +# Scalar-extension behavior of idele norms + +Scalar extension raises the finite, archimedean, and absolute idele norms to +the degree of the number-field extension. The rational relative-idele +base-change realization is included as the endpoint used by cyclotomic +reciprocity. +-/ + +@[expose] public section + +open scoped BigOperators NumberField NumberField.LiesOver +open NumberField IsDedekindDomain + +noncomputable +section + +namespace IdeleGroup + +universe u v + +variable + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] + [Algebra K L] [FiniteDimensional K L] + +omit [NumberField L] in +open scoped Classical in +private theorem infinitePlaceCompletionMap_isometry + (v₀ : InfinitePlace K) + (W : InfinitePlace L) + [W.1.LiesOver v₀.1] : + Isometry + (NumberField.LiesOver.completionMap + (v := v₀) (w := W)) := by + let f : v₀.Completion → W.Completion := fun x => + (InfinitePlace.Completion.isometryEquivCompletion W).symm + (UniformSpace.Completion.mapRingHom + (algebraMap (WithAbs v₀.1) (WithAbs W.1)) + (InfinitePlace.LiesOver.isometry_algebraMap W v₀).continuous + ((InfinitePlace.Completion.isometryEquivCompletion v₀) x)) + have hf : Isometry f := + (InfinitePlace.Completion.isometryEquivCompletion W).symm.isometry.comp + ((UniformSpace.Completion.isometry_mapRingHom + (InfinitePlace.LiesOver.isometry_algebraMap W v₀)).comp + (InfinitePlace.Completion.isometryEquivCompletion v₀).isometry) + have heq : + (NumberField.LiesOver.completionMap (v := v₀) (w := W) : + v₀.Completion → W.Completion) = f := by + apply (InfinitePlace.Completion.denseRange_coe v₀).equalizer + · exact NumberField.LiesOver.continuous_completionMap + · exact hf.continuous + · funext x + change NumberField.LiesOver.completionMap (x : v₀.Completion) = f (x : v₀.Completion) + rw [NumberField.LiesOver.completionMap_coe] + apply InfinitePlace.Completion.ext + exact (UniformSpace.Completion.mapRingHom_coe + (InfinitePlace.LiesOver.isometry_algebraMap W v₀).continuous x).symm + rw [heq] + exact hf + +omit [NumberField L] in +open scoped Classical in +/-- Mapping a unit along an infinite-place completion map preserves its +positive norm. -/ +private theorem nnnormUnitHom_infinitePlaceCompletionMap + (v₀ : InfinitePlace K) + (W : InfinitePlace L) + [W.1.LiesOver v₀.1] + (x : v₀.Completionˣ) : + nnnormUnitHom W.Completion + (Units.map + (NumberField.LiesOver.completionMap + (v := v₀) (w := W)) x) = + nnnormUnitHom v₀.Completion x := by + apply Units.ext + change + ‖NumberField.LiesOver.completionMap + (v := v₀) (w := W) (x : v₀.Completion)‖₊ = + ‖(x : v₀.Completion)‖₊ + apply NNReal.eq + exact + (infinitePlaceCompletionMap_isometry + (K := K) (L := L) v₀ W).norm_map_of_map_zero + (map_zero + (NumberField.LiesOver.completionMap + (v := v₀) (w := W))) + (x : v₀.Completion) + +open scoped Classical in +/-- The fiber of restriction of infinite places is the set of places +lying over the chosen base place. -/ +private noncomputable def infinitePlaceFiberEquivPlacesOver + (v₀ : InfinitePlace K) : + {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀} ≃ + {W : InfinitePlace L // W ∈ v₀.placesOver L} where + toFun W := + ⟨W.1, ⟨congrArg (fun v : InfinitePlace K => v.1) W.2⟩⟩ + invFun W := + ⟨W.1, by + change W.1.comap (algebraMap K L) = v₀ + let : W.1.1.LiesOver v₀.1 := W.2 + exact InfinitePlace.LiesOver.comap_eq W.1 v₀⟩ + left_inv W := Subtype.ext rfl + right_inv W := Subtype.ext rfl + +omit [NumberField K] [NumberField L] [FiniteDimensional K L] in +open scoped Classical in +/-- The archimedean multiplicity upstairs is the base multiplicity +times the local inertia degree. -/ +private theorem infinitePlace_mult_eq_base_mult_mul_inertiaDeg + (v₀ : InfinitePlace K) + (W : InfinitePlace L) + (hW : W ∈ v₀.placesOver L) : + W.mult = v₀.mult * v₀.inertiaDeg W := by + let : W.1.LiesOver v₀.1 := hW + rcases v₀.isReal_or_isComplex with hvReal | hvComplex + · rcases W.isReal_or_isComplex with hWReal | hWComplex + · have hUnramified : W.IsUnramified K := + InfinitePlace.isUnramified_iff.mpr (Or.inl hWReal) + rw [InfinitePlace.mult_isReal ⟨W, hWReal⟩, + InfinitePlace.mult_isReal ⟨v₀, hvReal⟩, + InfinitePlace.inertiaDeg_eq_one + ⟨hW, hUnramified⟩] + · have hComapReal : + (W.comap (algebraMap K L)).IsReal := by + rw [InfinitePlace.LiesOver.comap_eq W v₀] + exact hvReal + have hRamified : W.IsRamified K := + InfinitePlace.isRamified_iff.mpr + ⟨hWComplex, hComapReal⟩ + rw [InfinitePlace.mult_isComplex ⟨W, hWComplex⟩, + InfinitePlace.mult_isReal ⟨v₀, hvReal⟩, + InfinitePlace.inertiaDeg_eq_two + ⟨hW, hRamified⟩] + · have hWComplex : + W.IsComplex := + InfinitePlace.LiesOver.isComplex_of_isComplex_under + W hvComplex + have hComapComplex : + (W.comap (algebraMap K L)).IsComplex := by + rw [InfinitePlace.LiesOver.comap_eq W v₀] + exact hvComplex + have hUnramified : W.IsUnramified K := + InfinitePlace.isUnramified_iff.mpr + (Or.inr hComapComplex) + rw [InfinitePlace.mult_isComplex ⟨W, hWComplex⟩, + InfinitePlace.mult_isComplex ⟨v₀, hvComplex⟩, + InfinitePlace.inertiaDeg_eq_one + ⟨hW, hUnramified⟩] + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- The inertia degrees in a restriction fiber sum to the global +extension degree. -/ +private theorem infinitePlaceFiber_inertiaDeg_sum + (v₀ : InfinitePlace K) : + ∑ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀}, + v₀.inertiaDeg W.1 = + Module.finrank K L := by + classical + calc + (∑ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀}, + v₀.inertiaDeg W.1) = + ∑ W : {W : InfinitePlace L // + W ∈ v₀.placesOver L}, + v₀.inertiaDeg W.1 := + Fintype.sum_equiv + (infinitePlaceFiberEquivPlacesOver + (K := K) (L := L) v₀) + (fun W => v₀.inertiaDeg W.1) + (fun W => v₀.inertiaDeg W.1) + (fun _ => rfl) + _ = + ∑ W ∈ v₀.placesOver L, + v₀.inertiaDeg W := by + symm + apply Finset.sum_subtype + intro W + simp + _ = Module.finrank K L := by + exact + InfinitePlace.sum_inertiaDeg_eq_finrank + K L v₀ + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- The total archimedean multiplicity in a restriction fiber is the +base multiplicity times the extension degree. -/ +private theorem infinitePlaceFiber_mult_sum + (v₀ : InfinitePlace K) : + ∑ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀}, + W.1.mult = + v₀.mult * Module.finrank K L := by + classical + calc + (∑ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀}, + W.1.mult) = + ∑ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀}, + v₀.mult * v₀.inertiaDeg W.1 := by + apply Finset.sum_congr rfl + intro W _ + exact + infinitePlace_mult_eq_base_mult_mul_inertiaDeg + (K := K) (L := L) v₀ W.1 + ⟨congrArg (fun v : InfinitePlace K => v.1) W.2⟩ + _ = + v₀.mult * + ∑ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀}, + v₀.inertiaDeg W.1 := by + rw [Finset.mul_sum] + _ = v₀.mult * Module.finrank K L := by + rw [infinitePlaceFiber_inertiaDeg_sum + (K := K) (L := L) v₀] + +open scoped Classical in +/-- Scalar extension raises the archimedean idele norm to the degree of +the extension. -/ +theorem archimedeanNorm_extension + (a : IdeleGroup K) : + InfiniteIdeleGroup.archimedeanNorm + (extension K L a).1 = + InfiniteIdeleGroup.archimedeanNorm a.1 ^ + Module.finrank K L := by + classical + have hlocal (W : InfinitePlace L) : + nnnormUnitHom W.Completion + (infiniteComponent W (extension K L a)) = + nnnormUnitHom + (_root_.infinitePlaceBelow (K := K) W).Completion + (infiniteComponent + (_root_.infinitePlaceBelow (K := K) W) a) := by + let v₀ := _root_.infinitePlaceBelow (K := K) W + let : W.1.LiesOver v₀.1 := ⟨rfl⟩ + rw [extension_infiniteComponent K L a W] + exact + nnnormUnitHom_infinitePlaceCompletionMap + (K := K) (L := L) v₀ W + (infiniteComponent v₀ a) + rw [InfiniteIdeleGroup.archimedeanNorm_apply, + InfiniteIdeleGroup.archimedeanNorm_apply] + change + (∏ W : InfinitePlace L, + nnnormUnitHom W.Completion + (infiniteComponent W (extension K L a)) ^ W.mult) = + (∏ v₀ : InfinitePlace K, + nnnormUnitHom v₀.Completion + (infiniteComponent v₀ a) ^ v₀.mult) ^ + Module.finrank K L + simp_rw [hlocal] + calc + (∏ W : InfinitePlace L, + nnnormUnitHom + (_root_.infinitePlaceBelow (K := K) W).Completion + (infiniteComponent + (_root_.infinitePlaceBelow (K := K) W) a) ^ + W.mult) = + ∏ v₀ : InfinitePlace K, + ∏ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀}, + nnnormUnitHom + (_root_.infinitePlaceBelow + (K := K) W.1).Completion + (infiniteComponent + (_root_.infinitePlaceBelow + (K := K) W.1) a) ^ + W.1.mult := + (Fintype.prod_fiberwise + (_root_.infinitePlaceBelow (K := K)) + (fun W : InfinitePlace L => + nnnormUnitHom + (_root_.infinitePlaceBelow (K := K) W).Completion + (infiniteComponent + (_root_.infinitePlaceBelow (K := K) W) a) ^ + W.mult)).symm + _ = + ∏ v₀ : InfinitePlace K, + ∏ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀}, + nnnormUnitHom v₀.Completion + (infiniteComponent v₀ a) ^ + W.1.mult := by + apply Finset.prod_congr rfl + intro v₀ _ + apply Finset.prod_congr rfl + intro W _ + rw [W.2] + _ = + ∏ v₀ : InfinitePlace K, + nnnormUnitHom v₀.Completion + (infiniteComponent v₀ a) ^ + (∑ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀}, + W.1.mult) := by + apply Finset.prod_congr rfl + intro v₀ _ + exact + Finset.prod_pow_eq_pow_sum + Finset.univ + (fun W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v₀} => + W.1.mult) + (nnnormUnitHom v₀.Completion + (infiniteComponent v₀ a)) + _ = + ∏ v₀ : InfinitePlace K, + nnnormUnitHom v₀.Completion + (infiniteComponent v₀ a) ^ + (v₀.mult * Module.finrank K L) := by + apply Finset.prod_congr rfl + intro v₀ _ + rw [infinitePlaceFiber_mult_sum + (K := K) (L := L) v₀] + _ = + ∏ v₀ : InfinitePlace K, + (nnnormUnitHom v₀.Completion + (infiniteComponent v₀ a) ^ v₀.mult) ^ + Module.finrank K L := by + apply Finset.prod_congr rfl + intro v₀ _ + rw [pow_mul] + _ = + (∏ v₀ : InfinitePlace K, + nnnormUnitHom v₀.Completion + (infiniteComponent v₀ a) ^ v₀.mult) ^ + Module.finrank K L := by + exact + Finset.prod_pow + Finset.univ + (Module.finrank K L) + (fun v₀ : InfinitePlace K => + nnnormUnitHom v₀.Completion + (infiniteComponent v₀ a) ^ v₀.mult) + +open scoped Classical in +/-- Scalar extension raises the absolute idele norm to the degree of the +number-field extension. -/ +theorem absoluteNorm_extension + (a : IdeleGroup K) : + absoluteNorm (extension K L a) = + absoluteNorm a ^ Module.finrank K L := by + rw [absoluteNorm_apply, absoluteNorm_apply, + finiteAbsoluteNorm_extension, + archimedeanNorm_extension] + calc + FiniteIdeleGroup.absoluteNorm a.2 ^ Module.finrank K L * + (InfiniteIdeleGroup.archimedeanNorm a.1 ^ + Module.finrank K L)⁻¹ = + FiniteIdeleGroup.absoluteNorm a.2 ^ Module.finrank K L * + (InfiniteIdeleGroup.archimedeanNorm a.1)⁻¹ ^ + Module.finrank K L := by + rw [inv_pow] + _ = + (FiniteIdeleGroup.absoluteNorm a.2 * + (InfiniteIdeleGroup.archimedeanNorm a.1)⁻¹) ^ + Module.finrank K L := by + rw [mul_pow] + +open scoped Classical in +/-- If the finite part of a rational idele is trivial, then its scalar +extension has absolute norm equal to the extension degree power of the +original absolute norm. -/ +theorem absoluteNorm_relativeIdeleBaseChange_inclusion_of_finite_eq_one + (a : IdeleGroup ℚ) + (ha : a.2 = 1) : + absoluteNorm + (_root_.relativeIdeleBaseChangeMulEquiv + (K := ℚ) (L := L) + (RelativeIdeleGroup.inclusion ℚ L a)) = + absoluteNorm a ^ Module.finrank ℚ L := by + change + absoluteNorm (extension ℚ L a) = + absoluteNorm a ^ Module.finrank ℚ L + have hfinite : (extension ℚ L a).2 = 1 := by + apply RestrictedProduct.ext + intro W + change finiteComponent W (extension ℚ L a) = 1 + rw [extension_finiteComponent] + change + Units.map + (finitePlaceAdicCompletionMap ℚ L + (_root_.finitePlaceBelow (K := ℚ) W) + ⟨W, rfl⟩).toMonoidHom + (a.2 (_root_.finitePlaceBelow (K := ℚ) W)) = + 1 + rw [ha] + exact map_one _ + rw [absoluteNorm_apply, absoluteNorm_apply, hfinite, ha, + map_one, one_mul, + archimedeanNorm_extension (K := ℚ) (L := L)] + simpa only [map_one, one_mul] using + (inv_pow (InfiniteIdeleGroup.archimedeanNorm a.1) + (Module.finrank ℚ L)).symm + + +end IdeleGroup + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/FiniteNormArithmetic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/FiniteNormArithmetic.lean new file mode 100644 index 0000000000..59200d5cce --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/FiniteNormArithmetic.lean @@ -0,0 +1,499 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdealClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormLocalOrder +public import Mathlib.Algebra.BigOperators.Finprod +public import Mathlib.NumberTheory.NumberField.Completion.Ramification +public import Mathlib.RingTheory.Ideal.Norm.RelNorm +/-! +# Finite-place arithmetic of idele norms + +This file relates the finite components of the ordinary idele norm to local +orders and positive prime norms. It also proves the degree formula for the +finite positive norm under scalar extension. +-/ + +@[expose] public section + +open scoped BigOperators NNReal NumberField NumberField.LiesOver +open NumberField IsDedekindDomain + +noncomputable +section + +namespace IdeleGroup + +open AlgebraicNumberTheory.Valuations +open Function + +universe u v + +variable + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] + [Algebra K L] [FiniteDimensional K L] + +private theorem finprod_over_fibers + {α β G : Type*} [CommMonoid G] + (g : α → β) (f : α → G) + (hf : HasFiniteMulSupport f) : + (∏ᶠ b : β, + ∏ᶠ x : {x : α // g x = b}, f x.1) = + ∏ᶠ x : α, f x := by + classical + let s := hf.toFinset + have hFiber (b : β) : + (∏ᶠ x : {x : α // g x = b}, f x.1) = + ∏ x ∈ s with g x = b, f x := by + rw [finprod_eq_prod_of_mulSupport_subset + (fun x : {x : α // g x = b} => f x.1) + (s := s.subtype fun x => g x = b)] + · simp only [Finset.prod_subtype_eq_prod_filter] + · intro x hx + change x ∈ s.subtype (fun x => g x = b) + change f x.1 ≠ 1 at hx + exact Finset.mem_subtype.mpr (hf.mem_toFinset.2 hx) + calc + (∏ᶠ b : β, + ∏ᶠ x : {x : α // g x = b}, f x.1) = + ∏ᶠ b : β, + ∏ x ∈ s with g x = b, f x := + finprod_congr hFiber + _ = ∏ x ∈ s, f x := by + rw [finprod_eq_prod_of_mulSupport_subset _ + (s.mulSupport_of_fiberwise_prod_subset_image f g)] + exact + Finset.prod_fiberwise_of_maps_to + (t := s.image g) + (fun x hx => Finset.mem_image_of_mem g hx) f + _ = ∏ᶠ x : α, f x := + (finprod_eq_prod f hf).symm + +/-- A finite idele norm is its finitely supported product of local prime +norms raised to the corresponding local orders. -/ +private theorem finiteAbsoluteNorm_eq_finprod + (a : FiniteIdeleGroup K) : + FiniteIdeleGroup.absoluteNorm a = + ∏ᶠ v : HeightOneSpectrum (𝓞 K), + FiniteIdeleGroup.primeNorm v ^ + (FiniteIdeleGroup.localOrder v (a v)).toAdd := by + classical + let e := (FiniteIdeleGroup.valuationVector a).toAdd + have heval (v : HeightOneSpectrum (𝓞 K)) : + e v = + (FiniteIdeleGroup.localOrder v (a v)).toAdd := by + simpa only [e] using + FiniteIdeleGroup.valuationVector_apply a v + have hsupport : + mulSupport + (fun v : HeightOneSpectrum (𝓞 K) => + FiniteIdeleGroup.primeNorm v ^ e v) ⊆ + e.support := by + intro v hv + by_contra hmem + have hev : e v = 0 := + Finsupp.notMem_support_iff.mp hmem + exact hv (by simp [hev]) + rw [FiniteIdeleGroup.absoluteNorm_apply] + change + e.prod + (fun v n => FiniteIdeleGroup.primeNorm v ^ n) = + ∏ᶠ v : HeightOneSpectrum (𝓞 K), + FiniteIdeleGroup.primeNorm v ^ + (FiniteIdeleGroup.localOrder v (a v)).toAdd + calc + e.prod + (fun v n => FiniteIdeleGroup.primeNorm v ^ n) = + ∏ v ∈ e.support, + FiniteIdeleGroup.primeNorm v ^ e v := rfl + _ = + ∏ᶠ v : HeightOneSpectrum (𝓞 K), + FiniteIdeleGroup.primeNorm v ^ e v := + (finprod_eq_prod_of_mulSupport_subset _ hsupport).symm + _ = + ∏ᶠ v : HeightOneSpectrum (𝓞 K), + FiniteIdeleGroup.primeNorm v ^ + (FiniteIdeleGroup.localOrder v (a v)).toAdd := + finprod_congr fun v => by rw [heval] + +omit [FiniteDimensional K L] in +/-- The positive prime norm upstairs is the inertia-degree power of the +positive prime norm below. -/ +theorem primeNorm_above + (v₀ : HeightOneSpectrum (𝓞 K)) + (W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀}) : + FiniteIdeleGroup.primeNorm W.1 = + FiniteIdeleGroup.primeNorm v₀ ^ + W.1.asIdeal.inertiaDeg (𝓞 K) := by + let : W.1.asIdeal.LiesOver v₀.asIdeal := by + constructor + exact congrArg HeightOneSpectrum.asIdeal W.2.symm + apply Units.ext + apply NNReal.eq + change + (Ideal.absNorm W.1.asIdeal : ℝ) = + (Ideal.absNorm v₀.asIdeal : ℝ) ^ + W.1.asIdeal.inertiaDeg (𝓞 K) + exact_mod_cast + (Ideal.absNorm_pow_inertiaDeg + v₀.asIdeal W.1.asIdeal).symm + +/-- An integer power of a commutative-group element carries a finite sum +of exponents to the corresponding finite product. -/ +private theorem zpow_finset_sum + {G : Type*} [CommGroup G] + {ι : Type*} (g : G) (s : Finset ι) (e : ι → ℤ) : + g ^ (∑ i ∈ s, e i) = + ∏ i ∈ s, g ^ e i := by + classical + induction s using Finset.induction_on with + | empty => + simp + | @insert i s hi ih => + simp [hi, ih, zpow_add] + +/-- The order of a finite component of the ordinary idele norm is the sum +of the upstairs orders weighted by their inertia degrees. -/ +theorem finiteComponentOrder_norm + (v₀ : HeightOneSpectrum (𝓞 K)) + (a : IdeleGroup L) : + let vK := HeightOneSpectrum.adicAbv K v₀ + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v₀ + letI := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + let eAbove := + finitePlaceExtensionEquivAbove + (K := K) (L := L) v₀ + letI : Fintype {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀} := + Fintype.ofEquiv (AbsoluteValueExtension vK L) eAbove + letI : ∀ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀}, + Algebra (v₀.adicCompletion K) (W.1.adicCompletion L) := + fun W => + (finitePlaceAdicCompletionMap + K L v₀ W).toAlgebra + (FiniteIdeleGroup.localOrder v₀ + (finiteComponent v₀ (norm K L a))).toAdd = + ∑ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀}, + (W.1.asIdeal.inertiaDeg (𝓞 K) : ℤ) * + (FiniteIdeleGroup.localOrder W.1 + (finiteComponent W.1 a)).toAdd := by + classical + dsimp only + let vK := HeightOneSpectrum.adicAbv K v₀ + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v₀ + let := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + let eAbove := + finitePlaceExtensionEquivAbove + (K := K) (L := L) v₀ + let : Fintype {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀} := + Fintype.ofEquiv (AbsoluteValueExtension vK L) eAbove + let : ∀ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀}, + Algebra (v₀.adicCompletion K) (W.1.adicCompletion L) := + fun W => + (finitePlaceAdicCompletionMap + K L v₀ W).toAlgebra + have hcomponent : + finiteComponent v₀ (norm K L a) = + ∏ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀}, + LocalFieldTheory.normUnits + (v₀.adicCompletion K) (W.1.adicCompletion L) + (finiteComponent W.1 a) := by + simpa only using + finiteComponent_norm_eq_prod (K := K) (L := L) v₀ a + rw [hcomponent] + rw [map_prod] + change + (∑ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀}, + (FiniteIdeleGroup.localOrder v₀ + (LocalFieldTheory.normUnits + (v₀.adicCompletion K) (W.1.adicCompletion L) + (finiteComponent W.1 a))).toAdd) = + ∑ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀}, + (W.1.asIdeal.inertiaDeg (𝓞 K) : ℤ) * + (FiniteIdeleGroup.localOrder W.1 + (finiteComponent W.1 a)).toAdd + apply Finset.sum_congr rfl + intro W _ + exact + FiniteIdeleGroup.localOrder_normUnits + K L v₀ W (finiteComponent W.1 a) + +/-- The finite positive idele norm is preserved by the ordinary idele +norm. -/ +theorem finiteAbsoluteNorm_norm + (a : IdeleGroup L) : + FiniteIdeleGroup.absoluteNorm (norm K L a).2 = + FiniteIdeleGroup.absoluteNorm a.2 := by + classical + rw [finiteAbsoluteNorm_eq_finprod + (K := K) ((norm K L a).2), + finiteAbsoluteNorm_eq_finprod + (K := L) a.2] + have hfinite : + HasFiniteMulSupport + (fun W : HeightOneSpectrum (𝓞 L) => + FiniteIdeleGroup.primeNorm W ^ + (FiniteIdeleGroup.localOrder W + (finiteComponent W a)).toAdd) := by + refine + ((FiniteIdeleGroup.valuationVector a.2).toAdd.support.finite_toSet).subset + ?_ + intro W hW + by_contra hmem + have hzero : + (FiniteIdeleGroup.localOrder W + (finiteComponent W a)).toAdd = 0 := by + change (FiniteIdeleGroup.valuationVector a.2).toAdd W = 0 + exact Finsupp.notMem_support_iff.mp hmem + apply hW + change FiniteIdeleGroup.primeNorm W ^ + (FiniteIdeleGroup.localOrder W (finiteComponent W a)).toAdd = 1 + rw [hzero, zpow_zero] + calc + (∏ᶠ v₀ : HeightOneSpectrum (𝓞 K), + FiniteIdeleGroup.primeNorm v₀ ^ + (FiniteIdeleGroup.localOrder v₀ + (finiteComponent v₀ (norm K L a))).toAdd) = + ∏ᶠ v₀ : HeightOneSpectrum (𝓞 K), + ∏ᶠ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀}, + FiniteIdeleGroup.primeNorm W.1 ^ + (FiniteIdeleGroup.localOrder W.1 + (finiteComponent W.1 a)).toAdd := by + apply finprod_congr + intro v₀ + let vK := HeightOneSpectrum.adicAbv K v₀ + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v₀ + let := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + let eAbove := + finitePlaceExtensionEquivAbove + (K := K) (L := L) v₀ + let : Fintype {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀} := + Fintype.ofEquiv (AbsoluteValueExtension vK L) eAbove + let : ∀ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀}, + Algebra (v₀.adicCompletion K) (W.1.adicCompletion L) := + fun W => + (finitePlaceAdicCompletionMap + K L v₀ W).toAlgebra + calc + FiniteIdeleGroup.primeNorm v₀ ^ + (FiniteIdeleGroup.localOrder v₀ + (finiteComponent v₀ (norm K L a))).toAdd = + FiniteIdeleGroup.primeNorm v₀ ^ + (∑ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀}, + (W.1.asIdeal.inertiaDeg (𝓞 K) : ℤ) * + (FiniteIdeleGroup.localOrder W.1 + (finiteComponent W.1 a)).toAdd) := by + rw [finiteComponentOrder_norm K L v₀ a] + _ = + ∏ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀}, + FiniteIdeleGroup.primeNorm v₀ ^ + ((W.1.asIdeal.inertiaDeg (𝓞 K) : ℤ) * + (FiniteIdeleGroup.localOrder W.1 + (finiteComponent W.1 a)).toAdd) := by + simpa using + zpow_finset_sum + (FiniteIdeleGroup.primeNorm v₀) + Finset.univ + (fun W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀} => + (W.1.asIdeal.inertiaDeg (𝓞 K) : ℤ) * + (FiniteIdeleGroup.localOrder W.1 + (finiteComponent W.1 a)).toAdd) + _ = + ∏ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀}, + FiniteIdeleGroup.primeNorm W.1 ^ + (FiniteIdeleGroup.localOrder W.1 + (finiteComponent W.1 a)).toAdd := by + apply Finset.prod_congr rfl + intro W _ + rw [zpow_mul, zpow_natCast, + ← primeNorm_above (K := K) (L := L) v₀ W] + _ = + ∏ᶠ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀}, + FiniteIdeleGroup.primeNorm W.1 ^ + (FiniteIdeleGroup.localOrder W.1 + (finiteComponent W.1 a)).toAdd := + (finprod_eq_prod_of_fintype _).symm + _ = + ∏ᶠ W : HeightOneSpectrum (𝓞 L), + FiniteIdeleGroup.primeNorm W ^ + (FiniteIdeleGroup.localOrder W + (finiteComponent W a)).toAdd := + finprod_over_fibers + (_root_.finitePlaceBelow (K := K)) + (fun W : HeightOneSpectrum (𝓞 L) => + FiniteIdeleGroup.primeNorm W ^ + (FiniteIdeleGroup.localOrder W + (finiteComponent W a)).toAdd) + hfinite + +omit [FiniteDimensional K L] in +/-- Extending a prime fractional ideal raises its positive absolute norm +to the degree of the number-field extension. -/ +theorem fractionalIdealAbsoluteNorm_extension_prime + (v₀ : HeightOneSpectrum (𝓞 K)) : + FractionalIdealGroup.absoluteNorm + (FractionalIdealGroup.extension K L + (FractionalIdealGroup.prime v₀)) = + FractionalIdealGroup.absoluteNorm + (FractionalIdealGroup.prime v₀) ^ + Module.finrank K L := by + let : Algebra + (FractionRing (𝓞 K)) (FractionRing (𝓞 L)) := + FractionRing.liftAlgebra _ _ + have hfinrank : + Module.finrank + (FractionRing (𝓞 K)) (FractionRing (𝓞 L)) = + Module.finrank K L := by + exact + Algebra.finrank_eq_of_equiv_equiv + (FractionRing.algEquiv (𝓞 K) K).toRingEquiv + (FractionRing.algEquiv (𝓞 L) L).toRingEquiv + (by + ext x + exact IsFractionRing.algEquiv_commutes + (FractionRing.algEquiv (𝓞 K) K) + (FractionRing.algEquiv (𝓞 L) L) x) + have hIdeal : + Ideal.absNorm + (v₀.asIdeal.map + (algebraMap (𝓞 K) (𝓞 L))) = + Ideal.absNorm v₀.asIdeal ^ Module.finrank K L := by + simpa only [ + ← IsFractionRing.finrank_eq + (𝓞 K) (FractionRing (𝓞 K)) + (𝓞 L) (FractionRing (𝓞 L)), + hfinrank] using + (Ideal.absNorm_algebraMap + (𝓞 K) (𝓞 L) v₀.asIdeal) + have hFractional : + FractionalIdeal.absNorm + ((FractionalIdealGroup.extension K L + (FractionalIdealGroup.prime v₀) : + FractionalIdealGroup L) : + FractionalIdeal (nonZeroDivisors (𝓞 L)) L) = + FractionalIdeal.absNorm + ((FractionalIdealGroup.prime v₀ : + FractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) ^ + Module.finrank K L := by + have hprime : + ((FractionalIdealGroup.prime v₀ : FractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = + (v₀.asIdeal : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) := rfl + rw [FractionalIdealGroup.extension_prime_val, + FractionalIdeal.coeIdeal_absNorm, hprime, + FractionalIdeal.coeIdeal_absNorm] + exact_mod_cast hIdeal + apply Units.ext + apply NNReal.eq + change + ((FractionalIdeal.absNorm + ((FractionalIdealGroup.extension K L + (FractionalIdealGroup.prime v₀) : + FractionalIdealGroup L) : + FractionalIdeal (nonZeroDivisors (𝓞 L)) L) : ℚ) : ℝ) = + ((FractionalIdeal.absNorm + ((FractionalIdealGroup.prime v₀ : + FractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) : ℚ) : ℝ) ^ + Module.finrank K L + exact_mod_cast hFractional + +omit [FiniteDimensional K L] in +/-- Extension of a nonzero fractional ideal raises its positive absolute +norm to the degree of the number-field extension. -/ +private theorem fractionalIdealAbsoluteNorm_extension + (I : FractionalIdealGroup K) : + FractionalIdealGroup.absoluteNorm + (FractionalIdealGroup.extension K L I) = + FractionalIdealGroup.absoluteNorm I ^ + Module.finrank K L := by + let left : + FractionalIdealGroup K →* ℝ≥0ˣ := + (FractionalIdealGroup.absoluteNorm (K := L)).comp + (FractionalIdealGroup.extension K L) + let right : + FractionalIdealGroup K →* ℝ≥0ˣ := + (powMonoidHom (Module.finrank K L) : + ℝ≥0ˣ →* ℝ≥0ˣ).comp + (FractionalIdealGroup.absoluteNorm (K := K)) + have hprime (v₀ : HeightOneSpectrum (𝓞 K)) : + left (FractionalIdealGroup.prime v₀) = + right (FractionalIdealGroup.prime v₀) := by + simpa only [left, right, MonoidHom.comp_apply, + powMonoidHom_apply] using + fractionalIdealAbsoluteNorm_extension_prime + (K := K) (L := L) v₀ + obtain ⟨e, rfl⟩ := + FractionalIdealGroup.factorization_surjective + (K := K) I + change + left (FractionalIdealGroup.factorization e) = + right (FractionalIdealGroup.factorization e) + rw [FractionalIdealGroup.factorization, + MonoidHom.mk'_apply, map_finsuppProd, + map_finsuppProd] + apply Finsupp.prod_congr + intro v₀ _ + simpa only [FractionalIdealGroup.primePowerHom, + MonoidHom.mk'_apply, toAdd_ofAdd, map_zpow] using + congrArg + (fun z : ℝ≥0ˣ => z ^ e.toAdd v₀) + (hprime v₀) + +/-- Scalar extension raises the finite positive idele norm to the degree +of the number-field extension. -/ +theorem finiteAbsoluteNorm_extension + (a : IdeleGroup K) : + FiniteIdeleGroup.absoluteNorm + (extension K L a).2 = + FiniteIdeleGroup.absoluteNorm a.2 ^ + Module.finrank K L := by + rw [FiniteIdeleGroup.absoluteNorm_eq_fractionalIdealAbsoluteNorm, + show FiniteIdeleGroup.fractionalIdeal (extension K L a).2 = + FractionalIdealGroup.extension K L + (FiniteIdeleGroup.fractionalIdeal a.2) by + change IdeleGroup.fractionalIdeal (extension K L a) = + FractionalIdealGroup.extension K L + (IdeleGroup.fractionalIdeal a) + exact IdeleGroup.fractionalIdeal_extension K L a, + fractionalIdealAbsoluteNorm_extension, + ← FiniteIdeleGroup.absoluteNorm_eq_fractionalIdealAbsoluteNorm] + +end IdeleGroup + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/IdeleClassNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/IdeleClassNorm.lean new file mode 100644 index 0000000000..44ae4624d4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/IdeleClassNorm.lean @@ -0,0 +1,92 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ArchimedeanNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdealClass +/-! +# The ordinary norm on idele classes + +The ordinary idele-class norm preserves the absolute norm and restricts to +the norm-one idele-class subgroups. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace IdeleClassGroup + +universe u v + +variable + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] + [Algebra K L] [FiniteDimensional K L] + +/-- The ordinary idèle-class norm preserves the absolute idèle norm. -/ +theorem absoluteNorm_ideleClassNorm + (c : IdeleClassGroup L) : + absoluteNorm (_root_.ideleClassNorm K L c) = + absoluteNorm c := by + refine QuotientGroup.induction_on c ?_ + intro a + change + absoluteNorm + (_root_.ideleClassNorm K L + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup L) a)) = + absoluteNorm + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup L) a) + rw [_root_.ideleClassNorm_mk, + absoluteNorm_mk, absoluteNorm_mk, + IdeleGroup.absoluteNorm_norm] + +/-- The ordinary idele-class norm carries norm-one idele classes to +norm-one idele classes. -/ +theorem ideleClassNorm_mem_normOneSubgroup + (c : IdeleClassGroup L) + (hc : c ∈ normOneSubgroup (K := L)) : + _root_.ideleClassNorm K L c ∈ + normOneSubgroup (K := K) := by + change + absoluteNorm (_root_.ideleClassNorm K L c) = 1 + change absoluteNorm c = 1 at hc + rw [absoluteNorm_ideleClassNorm] + exact hc + +/-- The ordinary idele-class norm restricted to the norm-one idele-class +groups. -/ +noncomputable def normOneNorm : + normOneSubgroup (K := L) →* + normOneSubgroup (K := K) := + ((_root_.ideleClassNorm K L).comp + (normOneSubgroup (K := L)).subtype).codRestrict + (normOneSubgroup (K := K)) + (fun c => + ideleClassNorm_mem_normOneSubgroup + K L c.1 c.2) + +/-- Coercing the restricted norm-one map recovers the ordinary idèle-class norm. -/ +@[simp] +theorem normOneNorm_apply + (c : normOneSubgroup (K := L)) : + (normOneNorm K L c : IdeleClassGroup K) = + _root_.ideleClassNorm K L c.1 := + rfl + + +end IdeleClassGroup + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/NormOne.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/NormOne.lean new file mode 100644 index 0000000000..25ebb31a09 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/NormOne.lean @@ -0,0 +1,69 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ArchimedeanNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm +/-! +# Norms on norm-one idele groups + +The ordinary idele norm restricts to a homomorphism between the actual +norm-one idele subgroups. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace IdeleGroup + +universe u v + +variable + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] + [Algebra K L] [FiniteDimensional K L] + +/-- The ordinary idèle norm carries norm-one idèles to norm-one idèles. -/ +theorem norm_mem_normOneSubgroup + (a : IdeleGroup L) + (ha : a ∈ normOneSubgroup (K := L)) : + norm K L a ∈ normOneSubgroup (K := K) := by + change absoluteNorm (norm K L a) = 1 + change absoluteNorm a = 1 at ha + rw [absoluteNorm_norm] + exact ha + +/-- The ordinary idele norm restricted to the norm-one idele groups. -/ +noncomputable def normOneNorm : + normOneSubgroup (K := L) →* + normOneSubgroup (K := K) := + ((norm K L).comp + (normOneSubgroup (K := L)).subtype).codRestrict + (normOneSubgroup (K := K)) + (fun a => + norm_mem_normOneSubgroup K L a.1 a.2) + +/-- Coercing the restricted norm-one map recovers the ordinary idèle norm. -/ +@[simp] +theorem normOneNorm_apply + (a : normOneSubgroup (K := L)) : + (normOneNorm K L a : IdeleGroup K) = + norm K L a.1 := + rfl + +/- The canonical map between completions at infinite places is an +isometry. This is the metric form of the `LiesOver` condition. -/ + +end IdeleGroup + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PositiveArchimedeanSection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PositiveArchimedeanSection.lean new file mode 100644 index 0000000000..35e30208bc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PositiveArchimedeanSection.lean @@ -0,0 +1,470 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +public import Mathlib.Analysis.SpecialFunctions.Pow.Continuity +/-! +# Positive archimedean section of the idele norm + +This module constructs an idele supported at one infinite place whose absolute +norm is a prescribed inverse. Its finite components are trivial and all of +its infinite components lie in the standard positive subgroups. +-/ + +@[expose] public section + +open scoped IsMulCommutative NNReal NumberField Topology +open NumberField IsDedekindDomain +open NumberField.Units.dirichletUnitTheorem + +noncomputable +section + +universe u + +namespace IdeleGroup + +variable {K : Type u} [Field K] [NumberField K] + +open scoped Classical in +/-- A positive real unit placed in an archimedean completion. At a complex +place it is first regarded as a complex unit. -/ +noncomputable def positiveArchimedeanLocalComponent + (v : InfinitePlace K) : + ℝ≥0ˣ →* v.Completionˣ := by + by_cases hv : v.IsReal + · exact + (Units.mapEquiv + (InfinitePlace.Completion.ringEquivRealOfIsReal + hv).symm.toMulEquiv).toMonoidHom.comp + (Units.map NNReal.toRealHom.toMonoidHom) + · have hvc : v.IsComplex := + InfinitePlace.not_isReal_iff_isComplex.mp hv + exact + (Units.mapEquiv + (InfinitePlace.Completion.ringEquivComplexOfIsComplex + hvc).symm.toMulEquiv).toMonoidHom.comp + ((Units.map Complex.ofRealHom.toMonoidHom).comp + (Units.map NNReal.toRealHom.toMonoidHom)) + +open scoped Classical in +/-- The positive local archimedean component, with its natural continuity. -/ +noncomputable def positiveArchimedeanLocalComponentContinuous + (v : InfinitePlace K) : + ℝ≥0ˣ →ₜ* v.Completionˣ where + __ := positiveArchimedeanLocalComponent v + continuous_toFun := by + by_cases hv : v.IsReal + · have hcompletion : + Continuous + (Units.mapEquiv + (InfinitePlace.Completion.ringEquivRealOfIsReal + hv).symm.toMulEquiv) := by + exact + (RayClass.realCompletionContinuousMulEquiv v hv).symm.continuous.units_map + (InfinitePlace.Completion.ringEquivRealOfIsReal + hv).symm.toMonoidHom + apply + (hcompletion.comp + (NNReal.continuous_coe.units_map + NNReal.toRealHom.toMonoidHom)).congr + intro r + simp only [positiveArchimedeanLocalComponent, + dite_eq_left hv] + congr 2 + · have hvc : v.IsComplex := + InfinitePlace.not_isReal_iff_isComplex.mp hv + have hcompletion : + Continuous + (Units.mapEquiv + (InfinitePlace.Completion.ringEquivComplexOfIsComplex + hvc).symm.toMulEquiv) := by + exact + (RayClass.complexCompletionContinuousMulEquiv v hvc).symm.continuous.units_map + (InfinitePlace.Completion.ringEquivComplexOfIsComplex + hvc).symm.toMonoidHom + apply + (hcompletion.comp + ((Complex.continuous_ofReal.units_map + Complex.ofRealHom.toMonoidHom).comp + (NNReal.continuous_coe.units_map + NNReal.toRealHom.toMonoidHom))).congr + intro r + simp only [positiveArchimedeanLocalComponent, + dite_eq_right hv] + congr 2 + +omit [NumberField K] in +open scoped Classical in +@[simp] +private theorem positiveArchimedeanLocalComponentContinuous_apply + (v : InfinitePlace K) (r : ℝ≥0ˣ) : + positiveArchimedeanLocalComponentContinuous v r = + positiveArchimedeanLocalComponent v r := + rfl + +omit [NumberField K] in +open scoped Classical in +private theorem positiveArchimedeanLocalComponent_nnnorm + (v : InfinitePlace K) (r : ℝ≥0ˣ) : + ‖((positiveArchimedeanLocalComponent v r : + v.Completionˣ) : v.Completion)‖₊ = + (r : ℝ≥0) := by + by_cases hv : v.IsReal + · let e : v.Completion ≃+* ℝ := + InfinitePlace.Completion.ringEquivRealOfIsReal hv + have hcomponent : + Units.mapEquiv e.toMulEquiv + (positiveArchimedeanLocalComponent v r) = + Units.map NNReal.toRealHom.toMonoidHom r := by + simp only [positiveArchimedeanLocalComponent, + dite_eq_left hv, MonoidHom.comp_apply] + change + Units.mapEquiv e.toMulEquiv + (Units.mapEquiv e.symm.toMulEquiv + (Units.map NNReal.toRealHom.toMonoidHom r)) = + Units.map NNReal.toRealHom.toMonoidHom r + exact + (Units.mapEquiv e.toMulEquiv).apply_symm_apply + (Units.map NNReal.toRealHom.toMonoidHom r) + have hvalue : + e + ((positiveArchimedeanLocalComponent v r : + v.Completionˣ) : v.Completion) = + ((r : ℝ≥0ˣ) : ℝ) := by + simpa [e] using congrArg Units.val hcomponent + apply NNReal.eq + simp only [coe_nnnorm] + calc + ‖((positiveArchimedeanLocalComponent v r : + v.Completionˣ) : v.Completion)‖ = + ‖e + ((positiveArchimedeanLocalComponent v r : + v.Completionˣ) : v.Completion)‖ := + ((InfinitePlace.Completion.isometryEquivRealOfIsReal + hv).isometry.norm_map_of_map_zero + (map_zero e) _).symm + _ = ‖((r : ℝ≥0ˣ) : ℝ)‖ := by rw [hvalue] + _ = ((r : ℝ≥0ˣ) : ℝ) := + Real.norm_of_nonneg (r : ℝ≥0).coe_nonneg + · have hvc : v.IsComplex := + InfinitePlace.not_isReal_iff_isComplex.mp hv + let e : v.Completion ≃+* ℂ := + InfinitePlace.Completion.ringEquivComplexOfIsComplex hvc + have hcomponent : + Units.mapEquiv e.toMulEquiv + (positiveArchimedeanLocalComponent v r) = + Units.map Complex.ofRealHom.toMonoidHom + (Units.map NNReal.toRealHom.toMonoidHom r) := by + simp only [positiveArchimedeanLocalComponent, + dite_eq_right hv, MonoidHom.comp_apply] + change + Units.mapEquiv e.toMulEquiv + (Units.mapEquiv e.symm.toMulEquiv + (Units.map Complex.ofRealHom.toMonoidHom + (Units.map NNReal.toRealHom.toMonoidHom r))) = + Units.map Complex.ofRealHom.toMonoidHom + (Units.map NNReal.toRealHom.toMonoidHom r) + exact + (Units.mapEquiv e.toMulEquiv).apply_symm_apply + (Units.map Complex.ofRealHom.toMonoidHom + (Units.map NNReal.toRealHom.toMonoidHom r)) + have hvalue : + e + ((positiveArchimedeanLocalComponent v r : + v.Completionˣ) : v.Completion) = + (((r : ℝ≥0ˣ) : ℝ) : ℂ) := by + simpa [e] using congrArg Units.val hcomponent + apply NNReal.eq + simp only [coe_nnnorm] + calc + ‖((positiveArchimedeanLocalComponent v r : + v.Completionˣ) : v.Completion)‖ = + ‖e + ((positiveArchimedeanLocalComponent v r : + v.Completionˣ) : v.Completion)‖ := + ((InfinitePlace.Completion.isometryEquivComplexOfIsComplex + hvc).isometry.norm_map_of_map_zero + (map_zero e) _).symm + _ = ‖(((r : ℝ≥0ˣ) : ℝ) : ℂ)‖ := by rw [hvalue] + _ = ‖((r : ℝ≥0ˣ) : ℝ)‖ := Complex.norm_real _ + _ = ((r : ℝ≥0ˣ) : ℝ) := + Real.norm_of_nonneg (r : ℝ≥0).coe_nonneg + +omit [NumberField K] in +open scoped Classical in +private theorem positiveArchimedeanLocalComponent_mem_positive + (v : InfinitePlace K) (r : ℝ≥0ˣ) : + positiveArchimedeanLocalComponent v r ∈ + RayClass.infinitePositiveSubgroup v := by + rw [RayClass.mem_infinitePositiveSubgroup_iff] + intro hv + let e : v.Completion ≃+* ℝ := + InfinitePlace.Completion.ringEquivRealOfIsReal hv + have hcomponent : + Units.mapEquiv e.toMulEquiv + (positiveArchimedeanLocalComponent v r) = + Units.map NNReal.toRealHom.toMonoidHom r := by + simp only [positiveArchimedeanLocalComponent, + dite_eq_left hv, MonoidHom.comp_apply] + change + Units.mapEquiv e.toMulEquiv + (Units.mapEquiv e.symm.toMulEquiv + (Units.map NNReal.toRealHom.toMonoidHom r)) = + Units.map NNReal.toRealHom.toMonoidHom r + exact + (Units.mapEquiv e.toMulEquiv).apply_symm_apply + (Units.map NNReal.toRealHom.toMonoidHom r) + have hvalue : + e + ((positiveArchimedeanLocalComponent v r : + v.Completionˣ) : v.Completion) = + ((r : ℝ≥0ˣ) : ℝ) := by + simpa [e] using congrArg Units.val hcomponent + change + 0 < e + ((positiveArchimedeanLocalComponent v r : + v.Completionˣ) : v.Completion) + rw [hvalue] + exact NNReal.coe_pos.mpr + (pos_iff_ne_zero.mpr r.ne_zero) + +open scoped Classical in +/-- The positive root needed to compensate for the multiplicity of the +chosen infinite place. -/ +noncomputable def positiveArchimedeanRoot : + ℝ≥0ˣ →* ℝ≥0ˣ := + Units.map + (NNReal.rpowMonoidHom + (((w₀ (K := K)).mult : ℝ)⁻¹)) + +open scoped Classical in +/-- The positive root map used in the archimedean section is continuous. -/ +noncomputable def positiveArchimedeanRootContinuous : + ℝ≥0ˣ →ₜ* ℝ≥0ˣ where + __ := positiveArchimedeanRoot (K := K) + continuous_toFun := + (NNReal.continuous_rpow_const + (inv_nonneg.mpr (Nat.cast_nonneg _))).units_map + (NNReal.rpowMonoidHom + (((w₀ (K := K)).mult : ℝ)⁻¹)) + +open scoped Classical in +/-- The positive archimedean idele over a number field. Its finite part is +one, and its sole nontrivial infinite component has been normalized so that +the total archimedean norm is the input. -/ +noncomputable def positiveArchimedeanSection + (K : Type u) [Field K] [NumberField K] : + ℝ≥0ˣ →* IdeleGroup K := + (IdeleGroup.infinitePlaceIdele + (w₀ (K := K))).comp + ((positiveArchimedeanLocalComponent + (w₀ (K := K))).comp + (positiveArchimedeanRoot (K := K))) + +open scoped Classical in +/-- The positive archimedean section as a continuous homomorphism. -/ +noncomputable def positiveArchimedeanSectionContinuous + (K : Type u) [Field K] [NumberField K] : + ℝ≥0ˣ →ₜ* IdeleGroup K := + (IdeleGroup.infinitePlaceIdeleContinuous + (w₀ (K := K))).comp + ((positiveArchimedeanLocalComponentContinuous + (w₀ (K := K))).comp + (positiveArchimedeanRootContinuous (K := K))) + +open scoped Classical in +@[simp] +theorem positiveArchimedeanSectionContinuous_apply + (r : ℝ≥0ˣ) : + positiveArchimedeanSectionContinuous K r = + positiveArchimedeanSection K r := + rfl + +open scoped Classical in +/-- The positive archimedean section is continuous. -/ +theorem continuous_positiveArchimedeanSection : + Continuous (positiveArchimedeanSection K) := + (positiveArchimedeanSectionContinuous K).continuous_toFun + +open scoped Classical in +private theorem positiveArchimedeanSection_infiniteComponent_same + (r : ℝ≥0ˣ) : + IdeleGroup.infiniteComponent (w₀ (K := K)) + (positiveArchimedeanSection K r) = + positiveArchimedeanLocalComponent + (w₀ (K := K)) + (positiveArchimedeanRoot (K := K) r) := by + change + IdeleGroup.infiniteComponent (w₀ (K := K)) + (IdeleGroup.infinitePlaceIdele + (w₀ (K := K)) + (positiveArchimedeanLocalComponent + (w₀ (K := K)) + (positiveArchimedeanRoot (K := K) r))) = _ + rw [IdeleGroup.infinitePlaceIdele_infiniteComponent_same] + +open scoped Classical in +private theorem positiveArchimedeanSection_infiniteComponent_of_ne + (r : ℝ≥0ˣ) (v : InfinitePlace K) + (hv : v ≠ w₀ (K := K)) : + IdeleGroup.infiniteComponent v + (positiveArchimedeanSection K r) = + 1 := by + change + IdeleGroup.infiniteComponent v + (IdeleGroup.infinitePlaceIdele + (w₀ (K := K)) + (positiveArchimedeanLocalComponent + (w₀ (K := K)) + (positiveArchimedeanRoot (K := K) r))) = 1 + exact + IdeleGroup.infinitePlaceIdele_infiniteComponent_of_ne + (w₀ (K := K)) v _ hv + +open scoped Classical in +/-- Every finite component of the positive archimedean idele is one. -/ +theorem positiveArchimedeanSection_finiteComponent + (r : ℝ≥0ˣ) + (v : HeightOneSpectrum (𝓞 K)) : + IdeleGroup.finiteComponent v + (positiveArchimedeanSection K r) = + 1 := by + change + IdeleGroup.finiteComponent v + (IdeleGroup.infinitePlaceIdele + (w₀ (K := K)) + (positiveArchimedeanLocalComponent + (w₀ (K := K)) + (positiveArchimedeanRoot (K := K) r))) = 1 + rw [IdeleGroup.infinitePlaceIdele_finiteComponent] + +open scoped Classical in +/-- Every infinite component of the positive archimedean idele lies in the +standard positive subgroup. -/ +theorem positiveArchimedeanSection_infiniteComponent_mem_positive + (r : ℝ≥0ˣ) (v : InfinitePlace K) : + IdeleGroup.infiniteComponent v + (positiveArchimedeanSection K r) ∈ + RayClass.infinitePositiveSubgroup v := by + by_cases hv : v = w₀ (K := K) + · subst v + rw [positiveArchimedeanSection_infiniteComponent_same] + exact + positiveArchimedeanLocalComponent_mem_positive + (w₀ (K := K)) + (positiveArchimedeanRoot (K := K) r) + · rw [positiveArchimedeanSection_infiniteComponent_of_ne + r v hv] + exact Subgroup.one_mem _ + +open scoped Classical in +/-- The positive archimedean idele has absolute idele norm `r⁻¹`. -/ +theorem positiveArchimedeanSection_absoluteNorm + (r : ℝ≥0ˣ) : + IdeleGroup.absoluteNorm + (positiveArchimedeanSection K r) = + r⁻¹ := by + have hlocal := + positiveArchimedeanLocalComponent_nnnorm + (w₀ (K := K)) + (positiveArchimedeanRoot (K := K) r) + have hlocal' : + ‖((positiveArchimedeanLocalComponent + (w₀ (K := K)) + (positiveArchimedeanRoot (K := K) r) : + (w₀ (K := K)).Completionˣ) : + (w₀ (K := K)).Completion)‖₊ = + (r : ℝ≥0) ^ + (((w₀ (K := K)).mult : ℝ)⁻¹) := by + simpa [positiveArchimedeanRoot] using hlocal + have hinfinite : + InfiniteIdeleGroup.archimedeanNorm + (positiveArchimedeanSection K r).1 = + r := by + rw [InfiniteIdeleGroup.archimedeanNorm_apply] + classical + rw [Finset.prod_eq_single (w₀ (K := K))] + · apply Units.ext + change + ‖((IdeleGroup.infiniteComponent (w₀ (K := K)) + (positiveArchimedeanSection K r) : + (w₀ (K := K)).Completionˣ) : + (w₀ (K := K)).Completion)‖₊ ^ + (w₀ (K := K)).mult = + (r : ℝ≥0) + rw [positiveArchimedeanSection_infiniteComponent_same, + hlocal'] + exact + NNReal.rpow_inv_natCast_pow + (r : ℝ≥0) InfinitePlace.mult_ne_zero + · intro v _ hv + have hcomponent : + InfiniteIdeleGroup.component v + (positiveArchimedeanSection K r).1 = + 1 := by + change + IdeleGroup.infiniteComponent v + (positiveArchimedeanSection K r) = 1 + exact + positiveArchimedeanSection_infiniteComponent_of_ne + r v hv + rw [hcomponent, map_one, one_pow] + · intro h + exact (h (Finset.mem_univ _)).elim + rw [IdeleGroup.absoluteNorm_apply] + change + FiniteIdeleGroup.absoluteNorm (1 : FiniteIdeleGroup K) * + (InfiniteIdeleGroup.archimedeanNorm + (positiveArchimedeanSection K r).1)⁻¹ = + r⁻¹ + rw [map_one, hinfinite, one_mul] + +open scoped Classical in +/-- Multiplying an idele by its positive archimedean correction produces an +idele of absolute norm one. -/ +noncomputable def positiveArchimedeanNormOneCorrection + (K : Type u) [Field K] [NumberField K] + (a : IdeleGroup K) : + IdeleGroup.normOneSubgroup (K := K) := + ⟨a * positiveArchimedeanSection K (IdeleGroup.absoluteNorm a), by + change + IdeleGroup.absoluteNorm + (a * positiveArchimedeanSection K + (IdeleGroup.absoluteNorm a)) = + 1 + rw [map_mul, positiveArchimedeanSection_absoluteNorm] + exact mul_inv_cancel (IdeleGroup.absoluteNorm a)⟩ + +open scoped Classical in +/-- The underlying idele of the norm-one correction is its defining product. -/ +@[simp] +theorem positiveArchimedeanNormOneCorrection_coe + (a : IdeleGroup K) : + (positiveArchimedeanNormOneCorrection K a : IdeleGroup K) = + a * positiveArchimedeanSection K (IdeleGroup.absoluteNorm a) := + rfl + +open scoped Classical in +/-- Every idele is its norm-one correction multiplied by the inverse of the +positive archimedean section. -/ +theorem eq_positiveArchimedeanNormOneCorrection_mul_section_inv + (a : IdeleGroup K) : + a = + (positiveArchimedeanNormOneCorrection K a : IdeleGroup K) * + (positiveArchimedeanSection K + (IdeleGroup.absoluteNorm a))⁻¹ := by + rw [positiveArchimedeanNormOneCorrection_coe] + exact (mul_inv_cancel_right a + (positiveArchimedeanSection K + (IdeleGroup.absoluteNorm a))).symm + + +end IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Principal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Principal.lean new file mode 100644 index 0000000000..5ed7d9ecf5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Principal.lean @@ -0,0 +1,216 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalCore +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.EquivariantEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation +/-! +# Principal ideles and their Galois module structure + +This module exposes the diagonal embedding and idele class group, identifies +field units with principal relative ideles, and transports low-degree Tate +cohomology across that identification. +-/ + +@[expose] public section + +noncomputable +section + +open RelativeIdeleGroup.Cohomology + + +open LocalClassFieldTheory +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology + +variable + (K L : Type) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- The field-unit group is multiplicatively equivalent to the actual +subgroup of principal relative ideles. -/ +noncomputable def fieldUnitsEquivPrincipalIdeles : + Lˣ ≃* + RelativeIdeleGroup.principalSubgroup K L := + MulEquiv.ofBijective + (RelativeIdeleGroup.principalIdele K L).rangeRestrict + ⟨fun _ _ h ↦ + RelativeIdeleGroup.principalIdele_injective K L + (congrArg Subtype.val h), + (RelativeIdeleGroup.principalIdele K L).rangeRestrict_surjective⟩ + +omit [NumberField L] [FiniteDimensional K L] [IsGalois K L] in +@[simp] +theorem fieldUnitsEquivPrincipalIdeles_coe + (x : Lˣ) : + ((fieldUnitsEquivPrincipalIdeles K L x : + RelativeIdeleGroup.principalSubgroup K L) : + RelativeIdeleGroup K L) = + RelativeIdeleGroup.principalIdele K L x := + rfl + +omit [NumberField L] [FiniteDimensional K L] [IsGalois K L] in +/-- The identification of field units with principal ideles is equivariant +for the genuine Galois actions. -/ +theorem fieldUnitsEquivPrincipalIdeles_smul + (σ : L ≃ₐ[K] L) (x : Lˣ) : + letI := + galoisGroupFieldUnitsMulDistribMulAction K L + letI := + relativeIdeleMulDistribMulAction K L + letI := + principalIdeleMulDistribMulAction K L + fieldUnitsEquivPrincipalIdeles K L (σ • x) = + σ • fieldUnitsEquivPrincipalIdeles K L x := by + let _ := + galoisGroupFieldUnitsMulDistribMulAction K L + let _ := + relativeIdeleMulDistribMulAction K L + let _ := + principalIdeleMulDistribMulAction K L + apply Subtype.ext + change + RelativeIdeleGroup.principalIdele K L + (Units.mapEquiv σ.toMulEquiv x) = + σ • RelativeIdeleGroup.principalIdele K L x + exact + (RelativeIdeleGroup.smul_principalIdele + K L σ x).symm + +/-- Degree-zero Tate cohomology of principal ideles is the actual +degree-zero cohomology of `Lˣ`. -/ +noncomputable def fieldUnitsHerbrandH0EquivPrincipalIdeles : + letI := + galoisGroupFieldUnitsMulDistribMulAction K L + letI := + relativeIdeleMulDistribMulAction K L + letI := + principalIdeleMulDistribMulAction K L + HerbrandH0 (L ≃ₐ[K] L) Lˣ ≃* + HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L) := by + letI := + galoisGroupFieldUnitsMulDistribMulAction K L + letI := + relativeIdeleMulDistribMulAction K L + letI := + principalIdeleMulDistribMulAction K L + exact + herbrandH0EquivariantMulEquiv + (fieldUnitsEquivPrincipalIdeles K L) + (fieldUnitsEquivPrincipalIdeles_smul K L) + +/-- Degree-minus-one Tate cohomology of principal ideles is the actual +degree-minus-one cohomology of `Lˣ`. -/ +noncomputable def fieldUnitsHerbrandHMinusOneEquivPrincipalIdeles + (σ : L ≃ₐ[K] L) : + letI := + galoisGroupFieldUnitsMulDistribMulAction K L + letI := + relativeIdeleMulDistribMulAction K L + letI := + principalIdeleMulDistribMulAction K L + HerbrandHMinusOne (L ≃ₐ[K] L) Lˣ σ ≃* + HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L) σ := by + letI := + galoisGroupFieldUnitsMulDistribMulAction K L + letI := + relativeIdeleMulDistribMulAction K L + letI := + principalIdeleMulDistribMulAction K L + exact + herbrandHMinusOneEquivariantMulEquiv + (fieldUnitsEquivPrincipalIdeles K L) + (fieldUnitsEquivPrincipalIdeles_smul K L) σ +omit [NumberField L] [IsGalois K L] in +/-- A defined Herbrand quotient for field units supplies the corresponding +defined quotient for the actual principal-idele subgroup. -/ +theorem principalIdelesHerbrandQuotientDefined + (σ : L ≃ₐ[K] L) + (h : + letI := + galoisGroupFieldUnitsMulDistribMulAction K L + HerbrandQuotientDefined + (L ≃ₐ[K] L) Lˣ σ) : + letI := + relativeIdeleMulDistribMulAction K L + letI := + principalIdeleMulDistribMulAction K L + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L) σ := by + let _ := + galoisGroupFieldUnitsMulDistribMulAction K L + let _ := + relativeIdeleMulDistribMulAction K L + let _ := + principalIdeleMulDistribMulAction K L + let _ : Finite + (HerbrandH0 (L ≃ₐ[K] L) Lˣ) := + h.1 + let _ : Finite + (HerbrandHMinusOne + (L ≃ₐ[K] L) Lˣ σ) := + h.2 + exact + ⟨herbrandH0Finite_of_equivariantMulEquiv + (fieldUnitsEquivPrincipalIdeles K L) + (fieldUnitsEquivPrincipalIdeles_smul K L), + herbrandHMinusOneFinite_of_equivariantMulEquiv + (fieldUnitsEquivPrincipalIdeles K L) + (fieldUnitsEquivPrincipalIdeles_smul K L) σ⟩ + +omit [NumberField L] [IsGalois K L] in +/-- The field-unit and principal-idele Herbrand quotients agree. -/ +theorem fieldUnits_herbrandQuotient_eq_principalIdeles + (σ : L ≃ₐ[K] L) + (h : + letI := + galoisGroupFieldUnitsMulDistribMulAction K L + HerbrandQuotientDefined + (L ≃ₐ[K] L) Lˣ σ) : + letI _fieldAction := + galoisGroupFieldUnitsMulDistribMulAction K L + letI _relativeAction := + relativeIdeleMulDistribMulAction K L + letI _principalAction := + principalIdeleMulDistribMulAction K L + let _ := + principalIdelesHerbrandQuotientDefined + K L σ h + @herbrandQuotient + (L ≃ₐ[K] L) Lˣ _ _ _ + (galoisGroupFieldUnitsMulDistribMulAction K L) + σ = + @herbrandQuotient + (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L) + _ _ _ + (principalIdeleMulDistribMulAction K L) + σ := by + let _ := + galoisGroupFieldUnitsMulDistribMulAction K L + let _ := + relativeIdeleMulDistribMulAction K L + let _ := + principalIdeleMulDistribMulAction K L + let _ : Finite + (HerbrandH0 (L ≃ₐ[K] L) Lˣ) := + h.1 + let _ : Finite + (HerbrandHMinusOne + (L ≃ₐ[K] L) Lˣ σ) := + h.2 + exact + herbrandQuotient_eq_of_equivariantMulEquiv + (fieldUnitsEquivPrincipalIdeles K L) + (fieldUnitsEquivPrincipalIdeles_smul K L) σ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalCore.lean new file mode 100644 index 0000000000..18f66c2420 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalCore.lean @@ -0,0 +1,80 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Basic +/-! +# Principal ideles and the idele class group + +This file formalizes the diagonal +embedding of `Kˣ` into the idele group and the resulting idele class group. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + + +variable (K : Type*) [Field K] [NumberField K] + +namespace IdeleGroup + +/-- The diagonal embedding of `Kˣ` into the idele group. -/ +def principalIdele : Kˣ →* IdeleGroup K := + (equivAdeleRingUnits (K := K)).symm.toMonoidHom.comp + (Units.map (algebraMap K (NumberField.AdeleRing (𝓞 K) K))) + +variable {K} + +/-- The finite component of a principal idele is the image of the +underlying field element in the corresponding completion. -/ +theorem finiteComponent_principalIdele + (x : Kˣ) (v : HeightOneSpectrum (𝓞 K)) : + ((finiteComponent v (principalIdele K x) : + (v.adicCompletion K)ˣ) : v.adicCompletion K) = (x : K) := + rfl + +/-- The infinite component of a principal idele is the image of the +underlying field element in the corresponding completion. -/ +theorem infiniteComponent_principalIdele + (x : Kˣ) (w : InfinitePlace K) : + ((infiniteComponent w (principalIdele K x) : + w.Completionˣ) : w.Completion) = (x : K) := + rfl + +variable (K) + +/-- The diagonal map from field units to ideles is injective. -/ +theorem principalIdele_injective : + Function.Injective (principalIdele K) := by + apply (equivAdeleRingUnits (K := K)).symm.injective.comp + exact Units.map_injective + (NumberField.AdeleRing.algebraMap_injective (R := 𝓞 K) (K := K)) + +/-- The subgroup of principal ideles. -/ +def principalSubgroup : Subgroup (IdeleGroup K) := + (principalIdele K).range + +/-- The multiplicative group `Kˣ`, identified with the subgroup of principal +ideles. -/ +def principalEquiv : Kˣ ≃* principalSubgroup K := + MonoidHom.ofInjective (principalIdele_injective K) + +@[simp] +theorem coe_principalEquiv (x : Kˣ) : + (principalEquiv K x : IdeleGroup K) = principalIdele K x := + MonoidHom.ofInjective_apply (principalIdele_injective K) + +end IdeleGroup + +/-- The idele class group `C_K = I_K / Kˣ`. -/ +abbrev IdeleClassGroup := + IdeleGroup K ⧸ IdeleGroup.principalSubgroup K diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalNorm.lean new file mode 100644 index 0000000000..675dbf274e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalNorm.lean @@ -0,0 +1,307 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormCore +public import Mathlib.RingTheory.FractionalIdeal.Norm +/-! +# The product formula for principal ideles + +This file proves that the absolute idele norm is trivial on the diagonal +copy of `Kˣ`, and hence descends to the idele class group. +-/ + +@[expose] public section + +open scoped NumberField RestrictedProduct NNReal WithZero +open NumberField IsDedekindDomain + +noncomputable +section + + +variable {K : Type*} [Field K] [NumberField K] + +namespace InfiniteIdeleGroup + +/-- The archimedean norm of a principal idele is the absolute field norm. -/ +theorem archimedeanNorm_principalIdele (x : Kˣ) : + ((archimedeanNorm + (IdeleGroup.principalIdele K x).1 : ℝ≥0ˣ) : ℝ≥0) = + ⟨|(Algebra.norm ℚ) (x : K)|, abs_nonneg _⟩ := by + rw [archimedeanNorm_apply] + simp only [Units.coe_prod, Units.val_pow_eq_pow_val, + nnnormUnitHom_val] + apply NNReal.eq + simp only [NNReal.coe_prod, NNReal.coe_pow, coe_nnnorm] + change (∏ w : InfinitePlace K, + ‖((InfiniteIdeleGroup.component w + (IdeleGroup.principalIdele K x).1 : w.Completionˣ) : + w.Completion)‖ ^ w.mult) = + |((Algebra.norm ℚ) (x : K) : ℝ)| + simp_rw [show ∀ w : InfinitePlace K, + ((InfiniteIdeleGroup.component w + (IdeleGroup.principalIdele K x).1 : w.Completionˣ) : + w.Completion) = (x : K) by + intro w + exact IdeleGroup.infiniteComponent_principalIdele x w] + have hnorm (w : InfinitePlace K) : + ‖((x : K) : w.Completion)‖ = w (x : K) := by + change ‖(((WithAbs.equiv w.1).symm (x : K) : + WithAbs w.1) : w.Completion)‖ = w (x : K) + rw [InfinitePlace.Completion.norm_coe, + (WithAbs.equiv w.1).apply_symm_apply] + simp_rw [hnorm] + have hproduct := + NumberField.prod_abs_eq_one (Units.ne_zero x) + have hfinite := + FinitePlace.prod_eq_inv_abs_norm (Units.ne_zero x) + rw [hfinite] at hproduct + have hnorm_ne_zero : + (Algebra.norm ℚ) (x : K) ≠ 0 := + Algebra.norm_ne_zero_iff.mpr (Units.ne_zero x) + have habs_ne_zero : + (|(Algebra.norm ℚ) (x : K)| : ℚ) ≠ 0 := + abs_ne_zero.mpr hnorm_ne_zero + have hcast_ne_zero : + ((|(Algebra.norm ℚ) (x : K)| : ℚ) : ℝ) ≠ 0 := by + exact_mod_cast habs_ne_zero + have hproduct' : + (∏ w : InfinitePlace K, w (x : K) ^ w.mult) * + ((|(Algebra.norm ℚ) (x : K)| : ℚ) : ℝ)⁻¹ = 1 := by + simpa only [Rat.cast_inv] using hproduct + have hresult := + (mul_inv_eq_one₀ hcast_ne_zero).mp hproduct' + simpa only [Rat.cast_abs] using hresult + +end InfiniteIdeleGroup + +namespace FractionalIdealGroup + +/-- The positive absolute norm of a nonzero fractional ideal. -/ +def absoluteNorm : + FractionalIdealGroup K →* ℝ≥0ˣ where + toFun I := + Units.mk0 + ⟨(FractionalIdeal.absNorm + (I : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) : ℝ), + Rat.cast_nonneg.mpr + (FractionalIdeal.absNorm_nonneg + (I : FractionalIdeal (nonZeroDivisors (𝓞 K)) K))⟩ + (by + intro h + have hr := congrArg (fun z : ℝ≥0 => z.1) h + change + ((FractionalIdeal.absNorm + (I : FractionalIdeal + (nonZeroDivisors (𝓞 K)) K) : ℚ) : ℝ) = 0 at hr + have hq : FractionalIdeal.absNorm + (I : FractionalIdeal + (nonZeroDivisors (𝓞 K)) K) = 0 := by + exact_mod_cast hr + exact Units.ne_zero I + (FractionalIdeal.absNorm_eq_zero_iff.mp hq)) + map_one' := by + apply Units.ext + apply NNReal.eq + change + ((FractionalIdeal.absNorm + (1 : FractionalIdeal + (nonZeroDivisors (𝓞 K)) K) : ℚ) : ℝ) = 1 + rw [FractionalIdeal.absNorm_one] + norm_num + map_mul' I J := by + apply Units.ext + change + (⟨(FractionalIdeal.absNorm + ((I * J : FractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) : ℝ), + Rat.cast_nonneg.mpr + (FractionalIdeal.absNorm_nonneg + ((I * J : FractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K))⟩ : ℝ≥0) = + ⟨(FractionalIdeal.absNorm + (I : FractionalIdeal + (nonZeroDivisors (𝓞 K)) K) : ℝ), + Rat.cast_nonneg.mpr + (FractionalIdeal.absNorm_nonneg + (I : FractionalIdeal + (nonZeroDivisors (𝓞 K)) K))⟩ * + ⟨(FractionalIdeal.absNorm + (J : FractionalIdeal + (nonZeroDivisors (𝓞 K)) K) : ℝ), + Rat.cast_nonneg.mpr + (FractionalIdeal.absNorm_nonneg + (J : FractionalIdeal + (nonZeroDivisors (𝓞 K)) K))⟩ + apply NNReal.eq + change + ((FractionalIdeal.absNorm + ((I * J : FractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) : ℚ) : ℝ) = + ((FractionalIdeal.absNorm + (I : FractionalIdeal + (nonZeroDivisors (𝓞 K)) K) : ℚ) : ℝ) * + ((FractionalIdeal.absNorm + (J : FractionalIdeal + (nonZeroDivisors (𝓞 K)) K) : ℚ) : ℝ) + norm_cast + simpa only [Units.val_mul] using + (map_mul FractionalIdeal.absNorm + (I : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) + (J : FractionalIdeal (nonZeroDivisors (𝓞 K)) K)) + +@[simp] +theorem absoluteNorm_prime (v : HeightOneSpectrum (𝓞 K)) : + absoluteNorm (prime v) = FiniteIdeleGroup.primeNorm v := by + apply Units.ext + apply NNReal.eq + change + ((FractionalIdeal.absNorm + (v.asIdeal : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) : ℚ) : ℝ) = + (v.asIdeal.absNorm : ℝ) + rw [FractionalIdeal.coeIdeal_absNorm] + norm_cast + +/-- The explicit prime-factor norm commutes with the factorization of a +fractional ideal. -/ +theorem absoluteNorm_factorization + (e : Multiplicative + (HeightOneSpectrum (𝓞 K) →₀ ℤ)) : + absoluteNorm (factorization e) = + FiniteIdeleGroup.divisorNorm e := by + change absoluteNorm + (e.toAdd.prod fun v n => primePowerHom v + (Multiplicative.ofAdd n)) = + e.toAdd.prod fun v n => + FiniteIdeleGroup.primeNormPowerHom v + (Multiplicative.ofAdd n) + rw [map_finsuppProd] + apply Finsupp.prod_congr + intro v hv + change absoluteNorm (prime v ^ e.toAdd v) = + FiniteIdeleGroup.primeNorm v ^ e.toAdd v + rw [map_zpow, absoluteNorm_prime] + +/-- The norm of the principal fractional ideal `(x)` is the absolute field +norm of `x`. -/ +theorem absoluteNorm_toPrincipalIdeal (x : Kˣ) : + ((absoluteNorm + (toPrincipalIdeal (𝓞 K) K x) : ℝ≥0ˣ) : ℝ≥0) = + ⟨|((Algebra.norm ℚ) (x : K) : ℝ)|, abs_nonneg _⟩ := by + apply NNReal.eq + change + ((FractionalIdeal.absNorm + ((toPrincipalIdeal (𝓞 K) K x : + FractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) : ℚ) : ℝ) = + |((Algebra.norm ℚ) (x : K) : ℝ)| + rw [coe_toPrincipalIdeal, + FractionalIdeal.absNorm_span_singleton, Rat.cast_abs] + +end FractionalIdealGroup + +namespace FiniteIdeleGroup + +/-- The finite idele norm is the absolute norm of its associated fractional +ideal. -/ +theorem absoluteNorm_eq_fractionalIdealAbsoluteNorm + (a : FiniteIdeleGroup K) : + absoluteNorm a = + FractionalIdealGroup.absoluteNorm (fractionalIdeal a) := by + change divisorNorm (valuationVector a) = + FractionalIdealGroup.absoluteNorm + (FractionalIdealGroup.factorization (valuationVector a)) + exact (FractionalIdealGroup.absoluteNorm_factorization + (valuationVector a)).symm + +/-- The finite norm of a principal idele is the absolute field norm. -/ +theorem absoluteNorm_principalIdele (x : Kˣ) : + ((absoluteNorm + (IdeleGroup.principalIdele K x).2 : ℝ≥0ˣ) : ℝ≥0) = + ⟨|((Algebra.norm ℚ) (x : K) : ℝ)|, abs_nonneg _⟩ := by + rw [absoluteNorm_eq_fractionalIdealAbsoluteNorm] + have h : + fractionalIdeal (IdeleGroup.principalIdele K x).2 = + toPrincipalIdeal (𝓞 K) K x := + IdeleGroup.fractionalIdeal_principalIdele x + rw [h, FractionalIdealGroup.absoluteNorm_toPrincipalIdeal] + +end FiniteIdeleGroup + +namespace IdeleGroup + +/-- The finite and archimedean norm factors agree on a principal idele. -/ +theorem finite_absoluteNorm_eq_archimedeanNorm_principalIdele + (x : Kˣ) : + FiniteIdeleGroup.absoluteNorm (principalIdele K x).2 = + InfiniteIdeleGroup.archimedeanNorm + (principalIdele K x).1 := by + apply Units.ext + exact (FiniteIdeleGroup.absoluteNorm_principalIdele x).trans + (InfiniteIdeleGroup.archimedeanNorm_principalIdele x).symm + +/-- The number-field product formula in idelic form: every principal idele +has global absolute norm one. -/ +theorem absoluteNorm_principalIdele (x : Kˣ) : + absoluteNorm (principalIdele K x) = 1 := by + rw [absoluteNorm_apply, + finite_absoluteNorm_eq_archimedeanNorm_principalIdele] + exact mul_inv_cancel _ + +/-- Principal ideles lie in the norm-one subgroup. -/ +theorem principalSubgroup_le_normOneSubgroup : + principalSubgroup K ≤ normOneSubgroup (K := K) := by + rintro a ⟨x, rfl⟩ + exact absoluteNorm_principalIdele x + +end IdeleGroup + +namespace IdeleClassGroup + +/-- The absolute idele norm descended through `C_K = I_K / Kˣ`. -/ +def absoluteNorm : + IdeleClassGroup K →* ℝ≥0ˣ := + QuotientGroup.lift (IdeleGroup.principalSubgroup K) + (IdeleGroup.absoluteNorm (K := K)) + (IdeleGroup.principalSubgroup_le_normOneSubgroup (K := K)) + +theorem absoluteNorm_mk (a : IdeleGroup K) : + absoluteNorm + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) a) = + IdeleGroup.absoluteNorm a := + QuotientGroup.lift_mk _ _ _ + +/-- The norm-one idele classes. -/ +def normOneSubgroup : Subgroup (IdeleClassGroup K) := + (absoluteNorm (K := K)).ker + +/-- Pulling the norm-one idele classes back to the idele group recovers +exactly the norm-one ideles. -/ +theorem comap_normOneSubgroup : + Subgroup.comap + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K)) + (normOneSubgroup (K := K)) = + IdeleGroup.normOneSubgroup (K := K) := by + ext a + change absoluteNorm + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) a) = 1 ↔ + IdeleGroup.absoluteNorm a = 1 + rw [absoluteNorm_mk] + +theorem mk_mem_normOneSubgroup_iff (a : IdeleGroup K) : + QuotientGroup.mk' (IdeleGroup.principalSubgroup K) a ∈ + normOneSubgroup (K := K) ↔ + a ∈ IdeleGroup.normOneSubgroup (K := K) := by + change absoluteNorm + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) a) = 1 ↔ + IdeleGroup.absoluteNorm a = 1 + rw [absoluteNorm_mk] + +end IdeleClassGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalTopology.lean new file mode 100644 index 0000000000..39a4b56832 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalTopology.lean @@ -0,0 +1,231 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces +public import Mathlib.Topology.Algebra.IsUniformGroup.Basic +/-! +# The topology of the principal ideles + +This file proves that the principal ideles form a discrete, +and hence closed, subgroup of the idele group. + +The proof uses the same arithmetic separation as the classical argument. +The finite-place condition forces a principal idele into the ring of +integers. Its infinite component then lies in the Minkowski integer lattice, +whose topology is discrete. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + + +variable {K : Type*} [Field K] [NumberField K] + +namespace IdeleGroup + +/-- The infinite component of an idele, written in Minkowski space. -/ +def infiniteMixedEmbedding (a : IdeleGroup K) : + NumberField.mixedEmbedding.mixedSpace K := + NumberField.InfiniteAdeleRing.ringEquiv_mixedSpace K + (a.1 : NumberField.InfiniteAdeleRing K) + +theorem continuous_infiniteMixedEmbedding : + Continuous (infiniteMixedEmbedding (K := K)) := by + rw [show infiniteMixedEmbedding (K := K) = fun a => + (fun v : {w : InfinitePlace K // w.IsReal} => + NumberField.InfinitePlace.Completion.extensionEmbeddingOfIsReal + v.2 ((a.1 : NumberField.InfiniteAdeleRing K) v), + fun v : {w : InfinitePlace K // w.IsComplex} => + NumberField.InfinitePlace.Completion.extensionEmbedding v.1 + ((a.1 : NumberField.InfiniteAdeleRing K) v)) by + funext a + exact NumberField.InfiniteAdeleRing.ringEquiv_mixedSpace_apply K _] + apply Continuous.prodMk + · apply continuous_pi + intro v + have hcomponent : + Continuous (fun a : IdeleGroup K => + ((a.1 : NumberField.InfiniteAdeleRing K) + (v : InfinitePlace K))) := by + exact + Units.continuous_val.comp + (infiniteComponentContinuous + (v : InfinitePlace K)).continuous + exact + (NumberField.InfinitePlace.Completion.isometry_extensionEmbeddingOfIsReal + v.2).continuous.comp hcomponent + · apply continuous_pi + intro v + have hcomponent : + Continuous (fun a : IdeleGroup K => + ((a.1 : NumberField.InfiniteAdeleRing K) + (v : InfinitePlace K))) := by + exact + Units.continuous_val.comp + (infiniteComponentContinuous + (v : InfinitePlace K)).continuous + exact + (NumberField.InfinitePlace.Completion.isometry_extensionEmbedding + v.1).continuous.comp hcomponent + +@[simp] +theorem infiniteMixedEmbedding_principal (x : Kˣ) : + infiniteMixedEmbedding (principalIdele K x) = + NumberField.mixedEmbedding K (x : K) := by + rw [infiniteMixedEmbedding, + NumberField.InfiniteAdeleRing.mixedEmbedding_eq_algebraMap_comp] + rfl + +omit [NumberField K] in +theorem mixedEmbedding_one_mem_integerLattice : + NumberField.mixedEmbedding K (1 : K) ∈ + NumberField.mixedEmbedding.integerLattice K := by + change _ ∈ LinearMap.range _ + refine ⟨1, ?_⟩ + simp + +/-- A principal idele that is a unit at every finite place has infinite +component in the Minkowski integer lattice. -/ +theorem principal_infiniteMixedEmbedding_mem_integerLattice + (x : Kˣ) + (hx : principalIdele K x ∈ + integralAtFinitePlaces (K := K)) : + infiniteMixedEmbedding (principalIdele K x) ∈ + NumberField.mixedEmbedding.integerLattice K := by + have hker : + fractionalIdeal (principalIdele K x) = 1 := by + rw [← MonoidHom.mem_ker, fractionalIdeal_ker] + exact hx + have hprincipal : + toPrincipalIdeal (𝓞 K) K x = 1 := by + rw [← fractionalIdeal_principalIdele] + exact hker + have hxmem : + (x : K) ∈ + (1 : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) := by + rw [← show + ((toPrincipalIdeal (𝓞 K) K x : + FractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = 1 by + exact congrArg Units.val hprincipal, + coe_toPrincipalIdeal] + exact FractionalIdeal.mem_spanSingleton_self _ _ + obtain ⟨y, hy⟩ := + (FractionalIdeal.mem_one_iff + (nonZeroDivisors (𝓞 K))).mp hxmem + rw [infiniteMixedEmbedding_principal] + change _ ∈ LinearMap.range _ + refine ⟨y, ?_⟩ + change NumberField.mixedEmbedding K + (algebraMap (𝓞 K) K y) = + NumberField.mixedEmbedding K (x : K) + rw [hy] + +/-- The principal ideles have the discrete subspace +topology. -/ +instance principalSubgroupDiscreteTopology : + DiscreteTopology (principalSubgroup K) := by + rw [discreteTopology_iff_isOpen_singleton_one] + let z : NumberField.mixedEmbedding.integerLattice K := + ⟨NumberField.mixedEmbedding K (1 : K), + mixedEmbedding_one_mem_integerLattice (K := K)⟩ + have hzOpen : + IsOpen ({z} : + Set (NumberField.mixedEmbedding.integerLattice K)) := + isOpen_discrete _ + rw [isOpen_induced_iff] at hzOpen + obtain ⟨U, hU, hUeq⟩ := hzOpen + have hzU : + (z : NumberField.mixedEmbedding.mixedSpace K) ∈ U := by + have hz : + z ∈ Subtype.val ⁻¹' U := + hUeq.symm ▸ Set.mem_singleton z + exact hz + let V : Set (IdeleGroup K) := + (integralAtFinitePlaces (K := K) : Set (IdeleGroup K)) ∩ + infiniteMixedEmbedding ⁻¹' U + have hIntegralOpen : + IsOpen + ((integralAtFinitePlaces (K := K) : + Subgroup (IdeleGroup K)) : Set (IdeleGroup K)) := by + have h := + isOpen_supportedAt (K := K) + (∅ : Finset (HeightOneSpectrum (𝓞 K))) + simpa only [Finset.coe_empty, supportedAt_empty (K := K)] using h + have hVOpen : IsOpen V := + hIntegralOpen.inter + (hU.preimage continuous_infiniteMixedEmbedding) + have hpreOpen : + IsOpen + (Subtype.val ⁻¹' V : + Set (principalSubgroup K)) := + hVOpen.preimage continuous_subtype_val + have hpre : + (Subtype.val ⁻¹' V : + Set (principalSubgroup K)) = {1} := by + ext p + constructor + · intro hp + change (p : IdeleGroup K) ∈ V at hp + obtain ⟨x, hx⟩ := p.property + have hxIntegral : + principalIdele K x ∈ + integralAtFinitePlaces (K := K) := by + rw [hx] + exact hp.1 + let y : NumberField.mixedEmbedding.integerLattice K := + ⟨infiniteMixedEmbedding (principalIdele K x), + principal_infiniteMixedEmbedding_mem_integerLattice x hxIntegral⟩ + have hyU : + (y : NumberField.mixedEmbedding.mixedSpace K) ∈ U := by + change infiniteMixedEmbedding (principalIdele K x) ∈ U + rw [hx] + exact hp.2 + have hySingleton : y ∈ ({z} : + Set (NumberField.mixedEmbedding.integerLattice K)) := by + rw [← hUeq] + exact hyU + have hyz : y = z := Set.mem_singleton_iff.mp hySingleton + have hmix : + NumberField.mixedEmbedding K (x : K) = + NumberField.mixedEmbedding K (1 : K) := by + simpa [y, z] using congrArg Subtype.val hyz + have hxOne : x = 1 := by + apply Units.ext + exact NumberField.mixedEmbedding_injective K hmix + apply Set.mem_singleton_iff.mpr + apply Subtype.ext + rw [← hx, hxOne, map_one] + rfl + · intro hp + have hpOne : p = 1 := Set.mem_singleton_iff.mp hp + subst p + change (1 : IdeleGroup K) ∈ V + constructor + · exact (integralAtFinitePlaces (K := K)).one_mem + · change infiniteMixedEmbedding (1 : IdeleGroup K) ∈ U + rw [← map_one (principalIdele K), + infiniteMixedEmbedding_principal] + exact hzU + rw [← hpre] + exact hpreOpen + +/-- The principal ideles form a closed subgroup. -/ +theorem principalSubgroup_isClosed : + IsClosed + ((principalSubgroup K : + Subgroup (IdeleGroup K)) : Set (IdeleGroup K)) := + Subgroup.isClosed_of_discreteTopology + +end IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative.lean new file mode 100644 index 0000000000..32489fb35b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FiniteIntegralNormPreimage +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.InfinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.SPlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.Support + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/All.lean new file mode 100644 index 0000000000..fc7593b268 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/All.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FiniteIntegralNormPreimage +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.InfinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.SPlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.Support +/-! # Relative ideles, tensor norms, and support -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FiniteIntegralNormPreimage.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FiniteIntegralNormPreimage.lean new file mode 100644 index 0000000000..cc27af332b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FiniteIntegralNormPreimage.lean @@ -0,0 +1,882 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.SeparableNormValuation +/-! +# Integral finite-place preimages of local tensor norms + +If a finite local component is both a determinant norm and a local +integer unit, its determinant-norm preimage can be chosen integral in +every factor of the canonical local tensor decomposition. This is the local restricted-product +input needed to assemble pointwise local norm preimages globally. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct ValuativeRel NNReal +open NumberField IsDedekindDomain + +noncomputable +section + + +open AlgebraicNumberTheory.Valuations +open LocalClassFieldTheory +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField +open ValuationTheory.Completion + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +universe u + +omit [NumberField L] [IsGalois K L] in +/-- The finite-place completion comparison restricts to an inclusion of +integer-unit groups: an integral unit on the adic-completion side has an +integer-unit preimage on the absolute-value-completion side. -/ +theorem exists_finitePlaceCompletionIntegerUnit_of_unitsEquiv_eq + (v₀ : HeightOneSpectrum (𝓞 K)) + (x₀ : + (HeightOneSpectrum.adicAbv K v₀).Completionˣ) + (x : (v₀.adicCompletion K)ˣ) + (hx : + finitePlaceCompletionUnitsContinuousMulEquiv v₀ x₀ = x) + (hxUnit : + x ∈ (v₀.adicCompletionIntegers K).units) : + let vK := HeightOneSpectrum.adicAbv K v₀ + let hvKna : IsNonarchimedean (vK : K → ℝ) := + HeightOneSpectrum.isNonarchimedean_adicAbv K v₀ + letI : Valued vK.Completion ℝ≥0 := + finitePlaceCompletionValued vK hvKna + letI : ValuativeRel vK.Completion := + finitePlaceCompletionValuativeRel vK hvKna + ∃ x₀O : 𝒪[vK.Completion]ˣ, + integerUnitsToFieldUnits vK.Completion x₀O = x₀ := by + let vK := HeightOneSpectrum.adicAbv K v₀ + let hvKna : IsNonarchimedean (vK : K → ℝ) := + HeightOneSpectrum.isNonarchimedean_adicAbv K v₀ + let : Valued vK.Completion ℝ≥0 := + finitePlaceCompletionValued vK hvKna + let : ValuativeRel vK.Completion := + finitePlaceCompletionValuativeRel vK hvKna + rw [Submonoid.mem_units_iff] at hxUnit + have hx₀norm : + ‖(x₀ : vK.Completion)‖ ≤ 1 := by + have hval := + congrArg + (fun q : (v₀.adicCompletion K)ˣ => + (q : v₀.adicCompletion K)) hx + have hnorm : + ‖finitePlaceCompletionRingHom v₀ + (x₀ : vK.Completion)‖ = + ‖(x₀ : vK.Completion)‖ := + (finitePlaceCompletionRingHom_isometry v₀).norm_map_of_map_zero + (map_zero (finitePlaceCompletionRingHom v₀)) _ + rw [← hnorm] + rw [show finitePlaceCompletionRingHom v₀ + (x₀ : vK.Completion) = (x : v₀.adicCompletion K) by + exact hval] + exact norm_le_one_of_mem_adicCompletionIntegers v₀ hxUnit.1 + have hx₀invnorm : + ‖((x₀⁻¹ : vK.Completionˣ) : vK.Completion)‖ ≤ 1 := by + have hval := + congrArg + (fun q : (v₀.adicCompletion K)ˣ => + (q : v₀.adicCompletion K)) + (congrArg Inv.inv hx) + have hnorm : + ‖finitePlaceCompletionRingHom v₀ + ((x₀⁻¹ : vK.Completionˣ) : vK.Completion)‖ = + ‖((x₀⁻¹ : vK.Completionˣ) : vK.Completion)‖ := + (finitePlaceCompletionRingHom_isometry v₀).norm_map_of_map_zero + (map_zero (finitePlaceCompletionRingHom v₀)) _ + rw [← hnorm] + rw [show finitePlaceCompletionRingHom v₀ + ((x₀⁻¹ : vK.Completionˣ) : vK.Completion) = + ((x⁻¹ : (v₀.adicCompletion K)ˣ) : + v₀.adicCompletion K) by + exact hval] + exact norm_le_one_of_mem_adicCompletionIntegers v₀ hxUnit.2 + let x₀O : 𝒪[vK.Completion]ˣ := + { val := + ⟨x₀, + (finitePlaceCompletion_mem_integers_iff_norm_le_one + vK hvKna (x₀ : vK.Completion)).2 hx₀norm⟩ + inv := + ⟨x₀⁻¹, + by + simpa using + (finitePlaceCompletion_mem_integers_iff_norm_le_one + vK hvKna + ((x₀⁻¹ : vK.Completionˣ) : + vK.Completion)).2 hx₀invnorm⟩ + val_inv := by + apply Subtype.ext + simp + inv_val := by + apply Subtype.ext + simp } + refine ⟨x₀O, ?_⟩ + apply Units.ext + rfl + +/-- If the norm of an extension-field unit comes from a base valuation-ring +unit, then the extension-field unit has normalized valuation zero. -/ +theorem v_eq_zero_of_normUnits_eq_integerUnitsToFieldUnits + (F E : Type u) + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [ValuativeRel E] [TopologicalSpace E] + [IsNonarchimedeanLocalField E] + [Algebra F E] [FiniteDimensional F E] [IsGalois F E] + [Valuation.HasExtension + (ValuativeRel.valuation F) (ValuativeRel.valuation E)] + [IsIntegralClosure 𝒪[E] 𝒪[F] E] + (xO : 𝒪[F]ˣ) + (y : Eˣ) + (hy : + LocalFieldTheory.normUnits F E y = + integerUnitsToFieldUnits F xO) : + v E (Additive.ofMul y) = 0 := by + have hNormValuation := + v_normUnits_eq_residue_finrank_mul_of_isGalois F E y + rw [hy, v_integerUnitsToFieldUnits] at hNormValuation + have hf : + (Module.finrank 𝓀[F] 𝓀[E] : Int) ≠ 0 := by + exact_mod_cast + (Module.finrank_pos : + 0 < Module.finrank 𝓀[F] 𝓀[E]).ne' + exact + (mul_eq_zero.mp hNormValuation.symm).resolve_left hf + +omit [NumberField K] [NumberField L] [IsGalois K L] in +/-- A unit of a localized completion whose underlying element and inverse +have norm at most one determines an integer unit in the full completion. -/ +theorem exists_absoluteValueCompletionIntegerUnit_of_localizedCompletion_norm_bounds + (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) + (hvKna : IsNonarchimedean (vK : K → ℝ)) + (w : AbsoluteValueExtension vK L) + (y : (LocalizedCompletion vK w)ˣ) + (hy : ‖(y : LocalizedCompletion vK w)‖ ≤ 1) + (hyInv : + ‖((y⁻¹ : (LocalizedCompletion vK w)ˣ) : + LocalizedCompletion vK w)‖ ≤ 1) : + ∃ yO : + (absoluteValueCompletionIntegers w.1 + (absoluteValueExtension_isNonarchimedean + vK hvKna w))ˣ, + ((Units.map + (absoluteValueCompletionIntegers w.1 + (absoluteValueExtension_isNonarchimedean + vK hvKna w)).subtype yO : + w.1.Completionˣ) : + w.1.Completion) = + ((y : LocalizedCompletion vK w) : + w.1.Completion) := by + let hK := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let eW := + localizedCompletionEquivCompletion vK hvK w + let yW : w.1.Completionˣ := + Units.mapEquiv eW.toMulEquiv y + have hyWMem : + (yW : w.1.Completion) ∈ + absoluteValueCompletionIntegers w.1 + (absoluteValueExtension_isNonarchimedean + vK hvKna w) := by + rw [mem_absoluteValueCompletionIntegers_iff] + change ‖eW (y : LocalizedCompletion vK w)‖ ≤ 1 + change ‖(y : LocalizedCompletion vK w)‖ ≤ 1 + exact hy + have hyWInvMem : + ((yW⁻¹ : w.1.Completionˣ) : w.1.Completion) ∈ + absoluteValueCompletionIntegers w.1 + (absoluteValueExtension_isNonarchimedean + vK hvKna w) := by + rw [mem_absoluteValueCompletionIntegers_iff] + change + ‖eW + (((y⁻¹ : (LocalizedCompletion vK w)ˣ) : + LocalizedCompletion vK w))‖ ≤ 1 + change + ‖((y⁻¹ : (LocalizedCompletion vK w)ˣ) : + LocalizedCompletion vK w)‖ ≤ 1 + exact hyInv + let yO : + (absoluteValueCompletionIntegers w.1 + (absoluteValueExtension_isNonarchimedean + vK hvKna w))ˣ := + { val := ⟨yW, hyWMem⟩ + inv := ⟨yW⁻¹, by simpa using hyWInvMem⟩ + val_inv := by + apply Subtype.ext + simp + inv_val := by + apply Subtype.ext + simp } + refine ⟨yO, ?_⟩ + rfl + +/-- A family of completion-integer units supported at one extension of a +finite place. -/ +noncomputable def singleFinitePlaceIntegralUnitFamily + (v₀ : HeightOneSpectrum (𝓞 K)) + (w : + AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v₀) L) + (y : + (absoluteValueCompletionIntegers w.1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K v₀) + (HeightOneSpectrum.isNonarchimedean_adicAbv K v₀) + w))ˣ) : + ∀ u : + AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v₀) L, + (absoluteValueCompletionIntegers u.1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K v₀) + (HeightOneSpectrum.isNonarchimedean_adicAbv K v₀) + u))ˣ := by + classical + exact fun u => + dite (w = u) + (fun h => h ▸ y) + (fun _ => 1) + +/-- The integral local tensor unit represented by a unit in one completion +factor and by one in every other factor. -/ +noncomputable def singleRelativeLocalTensorDecompositionIntegralUnit + (v₀ : HeightOneSpectrum (𝓞 K)) + (w : + AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v₀) L) + (y : + (absoluteValueCompletionIntegers w.1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K v₀) + (HeightOneSpectrum.isNonarchimedean_adicAbv K v₀) + w))ˣ) : + relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) v₀ := + (relativeLocalTensorDecompositionIntegralUnitSubgroupEquivPiUnits + (K := K) (L := L) v₀).symm + (singleFinitePlaceIntegralUnitFamily + (K := K) (L := L) v₀ w y) + +omit [NumberField L] [IsGalois K L] in +/-- The component of a singly supported integral tensor unit is the +corresponding member of its defining completion-unit family. -/ +theorem finitePlaceLocalTensorDecompositionUnitsComponent_single + (v₀ : HeightOneSpectrum (𝓞 K)) + (w : + AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v₀) L) + (y : + (absoluteValueCompletionIntegers w.1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K v₀) + (HeightOneSpectrum.isNonarchimedean_adicAbv K v₀) + w))ˣ) + (u : + AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v₀) L) : + finitePlaceLocalTensorDecompositionUnitsComponent + (K := K) (L := L) v₀ u + (singleRelativeLocalTensorDecompositionIntegralUnit + (K := K) (L := L) v₀ w y) = + Units.map + (absoluteValueCompletionIntegers u.1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K v₀) + (HeightOneSpectrum.isNonarchimedean_adicAbv K v₀) + u)).subtype + (singleFinitePlaceIntegralUnitFamily + (K := K) (L := L) v₀ w y u) := by + have h := + congrFun + ((relativeLocalTensorDecompositionIntegralUnitSubgroupEquivPiUnits + (K := K) (L := L) v₀).apply_symm_apply + (singleFinitePlaceIntegralUnitFamily + (K := K) (L := L) v₀ w y)) u + apply Units.ext + exact congrArg Subtype.val + (congrArg Units.val h) + +omit [NumberField L] [IsGalois K L] in +/-- A singly supported integral tensor unit is integral in every completion +factor, together with its inverse. -/ +theorem singleRelativeLocalTensorDecompositionIntegralUnit_isIntegral + (v₀ : HeightOneSpectrum (𝓞 K)) + (w : + AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v₀) L) + (y : + (absoluteValueCompletionIntegers w.1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K v₀) + (HeightOneSpectrum.isNonarchimedean_adicAbv K v₀) + w))ˣ) : + RelativeLocalTensorDecompositionIntegralUnitAt + (K := K) (L := L) v₀ + (singleRelativeLocalTensorDecompositionIntegralUnit + (K := K) (L := L) v₀ w y) := + (mem_relativeLocalTensorDecompositionIntegralUnitSubgroup_iff + (K := K) (L := L) v₀ + (singleRelativeLocalTensorDecompositionIntegralUnit + (K := K) (L := L) v₀ w y)).1 + (singleRelativeLocalTensorDecompositionIntegralUnit + (K := K) (L := L) v₀ w y).property + +omit [NumberField L] [IsGalois K L] in +/-- The product of component norms of a singly supported integral tensor +unit is the norm of its supported component. -/ +theorem prod_norm_finitePlaceLocalTensorDecompositionUnitsComponent_single_eq + (v₀ : HeightOneSpectrum (𝓞 K)) + (w : + AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v₀) L) + (y : + (absoluteValueCompletionIntegers w.1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K v₀) + (HeightOneSpectrum.isNonarchimedean_adicAbv K v₀) + w))ˣ) + (x₀ : + (HeightOneSpectrum.adicAbv K v₀).Completionˣ) + [Fintype + (AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v₀) L)] + [∀ u : + AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v₀) L, + Algebra + (HeightOneSpectrum.adicAbv K v₀).Completion + u.1.Completion] + (hNorm : + Algebra.norm + (HeightOneSpectrum.adicAbv K v₀).Completion + ((Units.map + (absoluteValueCompletionIntegers w.1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K v₀) + (HeightOneSpectrum.isNonarchimedean_adicAbv K v₀) + w)).subtype y : + w.1.Completionˣ) : + w.1.Completion) = + (x₀ : (HeightOneSpectrum.adicAbv K v₀).Completion)) : + (∏ u : + AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v₀) L, + Algebra.norm + (HeightOneSpectrum.adicAbv K v₀).Completion + (finitePlaceLocalTensorDecompositionUnitsComponent + (K := K) (L := L) v₀ u + (singleRelativeLocalTensorDecompositionIntegralUnit + (K := K) (L := L) v₀ w y) : + u.1.Completion)) = + (x₀ : (HeightOneSpectrum.adicAbv K v₀).Completion) := by + classical + let vK := HeightOneSpectrum.adicAbv K v₀ + let hvKna : IsNonarchimedean (vK : K → ℝ) := + HeightOneSpectrum.isNonarchimedean_adicAbv K v₀ + let z : + (v₀.adicCompletion K ⊗[K] L)ˣ := + singleRelativeLocalTensorDecompositionIntegralUnit + (K := K) (L := L) v₀ w y + have hComponents : + ∀ u : AbsoluteValueExtension vK L, + finitePlaceLocalTensorDecompositionUnitsComponent + (K := K) (L := L) v₀ u z = + Units.map + (absoluteValueCompletionIntegers u.1 + (absoluteValueExtension_isNonarchimedean + vK hvKna u)).subtype + (singleFinitePlaceIntegralUnitFamily + (K := K) (L := L) v₀ w y u) := + finitePlaceLocalTensorDecompositionUnitsComponent_single + (K := K) (L := L) v₀ w y + rw [Finset.prod_eq_single w] + · rw [hComponents] + have hSelf : + singleFinitePlaceIntegralUnitFamily + (K := K) (L := L) v₀ w y w = + y := by + change + dite (w = w) + (fun h => h ▸ y) + (fun _ => 1) = + y + rw [dite_eq_left rfl] + rw [hSelf] + exact hNorm + · intro u _ hu + rw [hComponents] + have hwu : w ≠ u := Ne.symm hu + have hAway : + singleFinitePlaceIntegralUnitFamily + (K := K) (L := L) v₀ w y u = + 1 := by + change + dite (w = u) + (fun h => h ▸ y) + (fun _ => 1) = + 1 + rw [dite_eq_right hwu] + rw [hAway] + simp + · intro hw + exact (hw (Finset.mem_univ w)).elim + +omit [NumberField L] in +/-- The determinant norm of a singly supported integral tensor unit is the +norm of its unique nontrivial completion component. -/ +theorem localTensorDetNorm_singleRelativeLocalTensorDecompositionIntegralUnit_eq + (v₀ : HeightOneSpectrum (𝓞 K)) + (w : + AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v₀) L) + (y : + (absoluteValueCompletionIntegers w.1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K v₀) + (HeightOneSpectrum.isNonarchimedean_adicAbv K v₀) + w))ˣ) + (x₀ : + (HeightOneSpectrum.adicAbv K v₀).Completionˣ) + (hNorm : + let vK := HeightOneSpectrum.adicAbv K v₀ + letI hK := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + Algebra.norm vK.Completion + ((Units.map + (absoluteValueCompletionIntegers w.1 + (absoluteValueExtension_isNonarchimedean + vK + (HeightOneSpectrum.isNonarchimedean_adicAbv K v₀) + w)).subtype y : + w.1.Completionˣ) : + w.1.Completion) = + (x₀ : vK.Completion)) : + localTensorDetNorm + (K := K) (L := L) + (HeightOneSpectrum.adicAbv K v₀) + ((finitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) v₀).symm + (singleRelativeLocalTensorDecompositionIntegralUnit + (K := K) (L := L) v₀ w y)) = + x₀ := by + classical + let vK := HeightOneSpectrum.adicAbv K v₀ + let hvK := RayClass.adicAbv_isNontrivial v₀ + let hK := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + dsimp only at hNorm + let := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + let : ∀ u : AbsoluteValueExtension vK L, + Algebra vK.Completion u.1.Completion := + fun u => + AbsoluteValue.completionAlgebra vK u.1 u.2 + let : ∀ u : AbsoluteValueExtension vK L, + Module.Finite vK.Completion u.1.Completion := + fun u => + completionModuleFinite vK hvK u + let z : + (v₀.adicCompletion K ⊗[K] L)ˣ := + singleRelativeLocalTensorDecompositionIntegralUnit + (K := K) (L := L) v₀ w y + let zA : + (LocalTensorAlgebra (L := L) vK)ˣ := + (finitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) v₀).symm z + have hNormProduct := + RelativeIdeleGroup.localNorm_units_eq_prod + vK hvK zA + have hProduct : + (∏ u : AbsoluteValueExtension vK L, + Algebra.norm vK.Completion + (finitePlaceLocalTensorDecompositionUnitsComponent + (K := K) (L := L) v₀ u z : + u.1.Completion)) = + (x₀ : vK.Completion) := + prod_norm_finitePlaceLocalTensorDecompositionUnitsComponent_single_eq + (K := K) (L := L) v₀ w y x₀ hNorm + apply Units.ext + change + ((Units.map (Algebra.norm vK.Completion) zA : + vK.Completionˣ) : vK.Completion) = + (x₀ : vK.Completion) + rw [hNormProduct] + have hComponentEq : + ∀ u : AbsoluteValueExtension vK L, + completionTensorDecompositionLeft + (K := K) (L := L) vK hvK + (zA : LocalTensorAlgebra (L := L) vK) u = + (finitePlaceLocalTensorDecompositionUnitsComponent + (K := K) (L := L) v₀ u z : + u.1.Completion) := by + intro u + rfl + simpa only [hComponentEq] using hProduct + +omit [NumberField L] in +private theorem exists_localizedCompletionNormPreimage_with_norm_bounds + (v₀ : HeightOneSpectrum (𝓞 K)) + (x : (v₀.adicCompletion K)ˣ) + (hxNorm : + x ∈ (_root_.localTensorNorm + (K := K) (L := L) v₀).range) + (hxUnit : + x ∈ (v₀.adicCompletionIntegers K).units) : + let vK := HeightOneSpectrum.adicAbv K v₀ + let w := chosenFinitePlaceExtension (L := L) v₀ + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := LocalizedCompletion vK w + ∃ x₀ : vK.Completionˣ, + ∃ y : Eˣ, + LocalFieldTheory.normUnits vK.Completion E y = x₀ ∧ + finitePlaceCompletionUnitsContinuousMulEquiv v₀ x₀ = x ∧ + ‖(y : E)‖ ≤ 1 ∧ + ‖((y⁻¹ : Eˣ) : E)‖ ≤ 1 := by + classical + let vK := HeightOneSpectrum.adicAbv K v₀ + let w := chosenFinitePlaceExtension (L := L) v₀ + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v₀ + let hvKna : IsNonarchimedean (vK : K → ℝ) := + HeightOneSpectrum.isNonarchimedean_adicAbv K v₀ + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := LocalizedCompletion vK w + let : FiniteDimensional vK.Completion E := + localizedCompletionModuleFinite vK hvK w + let : IsGalois vK.Completion E := + HilbertRamification.algebraicLocalization_isGalois vK w + let : NontriviallyNormedField vK.Completion := + absoluteValueExtensionCompletionNontriviallyNormedField vK hvK + let : LocallyCompactSpace vK.Completion := + AbsoluteValue.Completion.locallyCompactSpace + (finitePlaceCompletionBaseMap_isometry v₀) + let : IsUltrametricDist vK.Completion := + completionIsUltrametricDist vK hvKna + let : Valued vK.Completion ℝ≥0 := + finitePlaceCompletionValued vK hvKna + let vC : Valuation vK.Completion ℝ≥0 := Valued.v + let : vC.IsNontrivial := + (inferInstance : + (NormedField.valuation (K := vK.Completion)).IsNontrivial) + let : ValuativeRel vK.Completion := + finitePlaceCompletionValuativeRel vK hvKna + let : vC.Compatible := + Valuation.Compatible.ofValuation vC + let : ValuativeRel.IsNontrivial vK.Completion := + (ValuativeRel.isNontrivial_iff_isNontrivial vC).2 inferInstance + let vB := ValuativeRel.valuation vK.Completion + let : vB.IsNontrivial := inferInstance + let : IsValuativeTopology vK.Completion := + isValuativeTopology_of_valued_ofValuation + vK.Completion ℝ≥0 + let : IsNonarchimedeanLocalField vK.Completion := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + let : FiniteDimensional vK.Completion w.1.Completion := + completionModuleFinite vK hvK w + let : ContinuousSMul vK.Completion w.1.Completion := + continuousSMul_of_algebraMap _ _ + (AbsoluteValue.completionMap_isometry vK w.1 w.2).continuous + let : LocallyCompactSpace w.1.Completion := + LocallyCompactSpace.of_finiteDimensional_of_complete + vK.Completion w.1.Completion + let eE : E ≃ᵢ w.1.Completion := + { toEquiv := + (localizedCompletionEquivCompletion vK hvK w).toEquiv + isometry_toFun := Isometry.of_dist_eq fun _ _ => rfl } + let : LocallyCompactSpace E := + (eE.toHomeomorph.locallyCompactSpace_iff).2 inferInstance + let : IsUltrametricDist E := + localizedCompletionIsUltrametricDist vK w hvKna + let : Valued E ℝ≥0 := + localizedCompletionFinitePlaceValued vK w hvKna + let : ValuativeRel E := + localizedCompletionFinitePlaceValuativeRel vK w hvKna + let vENorm : Valuation E ℝ≥0 := Valued.v + let : vENorm.Compatible := + Valuation.Compatible.ofValuation vENorm + let vE := ValuativeRel.valuation E + let : Valuation.HasExtension vB vE := + localizedCompletionValuationHasExtension vK w hvKna + let : vE.IsNontrivial := + Valuation.IsNontrivial.of_hasExtension vB vE + let : ValuativeRel.IsNontrivial E := + (ValuativeRel.isNontrivial_iff_isNontrivial vE).2 inferInstance + let : IsValuativeTopology E := + isValuativeTopology_of_valued_ofValuation E ℝ≥0 + let : IsNonarchimedeanLocalField E := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + let : Algebra 𝒪[vK.Completion] E := + Algebra.ofSubsemiring 𝒪[vK.Completion] + let : IsIntegralClosure 𝒪[E] 𝒪[vK.Completion] E := + localizedCompletionIsIntegralClosureWithExtension + vK w hvK hvKna + let : Module.Finite 𝒪[vK.Completion] 𝒪[E] := + integerRing_moduleFinite_of_isIntegralClosure + vK.Completion E + let e := + finitePlaceCompletionUnitsContinuousMulEquiv v₀ + have hxChosen : + x ∈ chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v₀ := by + rw [← finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup + (K := K) (L := L) v₀] + exact hxNorm + change + x ∈ (localNormSubgroup vK.Completion E).map + e.toMonoidHom at hxChosen + rcases hxChosen with ⟨x₀, hx₀, hx₀map⟩ + have hx₀' : + x₀ ∈ localNormSubgroup vK.Completion E := + hx₀ + rcases + MonoidHom.mem_range.mp hx₀' with + ⟨y, hy⟩ + have hx₀val : + e x₀ = x := + hx₀map + obtain ⟨x₀O, hx₀O⟩ := + exists_finitePlaceCompletionIntegerUnit_of_unitsEquiv_eq + (K := K) v₀ x₀ x hx₀val hxUnit + have hyValuation : + v E (Additive.ofMul y) = 0 := by + apply + v_eq_zero_of_normUnits_eq_integerUnitsToFieldUnits + vK.Completion E x₀O y + exact hy.trans hx₀O.symm + have hyValuationMap : + valuationMap E (Additive.ofMul y) = 0 := + hyValuation + let yO : 𝒪[E]ˣ := + integerUnitOfValuationMapZero E y hyValuationMap + have hyO : + integerUnitsToFieldUnits E yO = y := + integerUnitOfValuationMapZero_spec E y hyValuationMap + have hyMem : (y : E) ∈ 𝒪[E] := by + have hval := + congrArg (fun q : Eˣ => (q : E)) hyO + rw [← hval] + exact yO.val.property + have hyInvMem : + ((y⁻¹ : Eˣ) : E) ∈ 𝒪[E] := by + have hInv : + integerUnitsToFieldUnits E (yO⁻¹) = y⁻¹ := by + rw [map_inv, hyO] + have hval := + congrArg (fun q : Eˣ => (q : E)) hInv + rw [← hval] + exact (yO⁻¹).val.property + have hyNorm : ‖(y : E)‖ ≤ 1 := + (localizedCompletion_mem_integers_iff_norm_le_one + vK w hvKna (y : E)).1 hyMem + have hyInvNorm : ‖((y⁻¹ : Eˣ) : E)‖ ≤ 1 := + (localizedCompletion_mem_integers_iff_norm_le_one + vK w hvKna _).1 hyInvMem + exact ⟨x₀, y, hy, hx₀val, hyNorm, hyInvNorm⟩ + +omit [NumberField L] in +private theorem exists_singleFinitePlaceIntegralUnit_norm_eq + (v₀ : HeightOneSpectrum (𝓞 K)) + (x : (v₀.adicCompletion K)ˣ) + (hxNorm : + x ∈ (_root_.localTensorNorm + (K := K) (L := L) v₀).range) + (hxUnit : + x ∈ (v₀.adicCompletionIntegers K).units) : + let vK := HeightOneSpectrum.adicAbv K v₀ + let w := chosenFinitePlaceExtension (L := L) v₀ + let hvKna : IsNonarchimedean (vK : K → ℝ) := + HeightOneSpectrum.isNonarchimedean_adicAbv K v₀ + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + ∃ x₀ : vK.Completionˣ, + ∃ yO : + (absoluteValueCompletionIntegers w.1 + (absoluteValueExtension_isNonarchimedean + vK hvKna w))ˣ, + Algebra.norm vK.Completion + ((Units.map + (absoluteValueCompletionIntegers w.1 + (absoluteValueExtension_isNonarchimedean + vK hvKna w)).subtype yO : + w.1.Completionˣ) : + w.1.Completion) = + (x₀ : vK.Completion) ∧ + finitePlaceCompletionUnitsContinuousMulEquiv v₀ x₀ = x := by + classical + let vK := HeightOneSpectrum.adicAbv K v₀ + let w := chosenFinitePlaceExtension (L := L) v₀ + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v₀ + let hvKna : IsNonarchimedean (vK : K → ℝ) := + HeightOneSpectrum.isNonarchimedean_adicAbv K v₀ + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := LocalizedCompletion vK w + obtain ⟨x₀, y, hy, hx₀val, hyNorm, hyInvNorm⟩ := + exists_localizedCompletionNormPreimage_with_norm_bounds + (K := K) (L := L) v₀ x hxNorm hxUnit + obtain ⟨yO, hyO⟩ := + exists_absoluteValueCompletionIntegerUnit_of_localizedCompletion_norm_bounds + (K := K) (L := L) vK hvK hvKna w y hyNorm hyInvNorm + let eW := + localizedCompletionEquivCompletion vK hvK w + have hNormTransport : + Algebra.norm vK.Completion + ((y : E) : w.1.Completion) = + (x₀ : vK.Completion) := by + change + Algebra.norm vK.Completion + (eW (y : E)) = + (x₀ : vK.Completion) + rw [Algebra.norm_eq_of_algEquiv eW] + exact congrArg Units.val hy + have hNorm : + Algebra.norm vK.Completion + ((Units.map + (absoluteValueCompletionIntegers w.1 + (absoluteValueExtension_isNonarchimedean + vK hvKna w)).subtype yO : + w.1.Completionˣ) : + w.1.Completion) = + (x₀ : vK.Completion) := by + calc + _ = Algebra.norm vK.Completion + ((y : E) : w.1.Completion) := + congrArg (Algebra.norm vK.Completion) hyO + _ = (x₀ : vK.Completion) := hNormTransport + exact ⟨x₀, yO, hNorm, hx₀val⟩ + +omit [NumberField L] in +/-- A local integer unit in the finite tensor-norm image has a preimage +which is integral, together with its inverse, in every factor of the +canonical local tensor decomposition. -/ +theorem exists_localTensorDecompositionIntegralUnit_localTensorNorm_eq + (v₀ : HeightOneSpectrum (𝓞 K)) + (x : (v₀.adicCompletion K)ˣ) + (hxNorm : + x ∈ (_root_.localTensorNorm + (K := K) (L := L) v₀).range) + (hxUnit : + x ∈ (v₀.adicCompletionIntegers K).units) : + ∃ z : (v₀.adicCompletion K ⊗[K] L)ˣ, + _root_.localTensorNorm + (K := K) (L := L) v₀ z = x ∧ + RelativeLocalTensorDecompositionIntegralUnitAt + (K := K) (L := L) v₀ z := by + classical + let vK := HeightOneSpectrum.adicAbv K v₀ + let w := chosenFinitePlaceExtension (L := L) v₀ + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v₀ + let hvKna : IsNonarchimedean (vK : K → ℝ) := + HeightOneSpectrum.isNonarchimedean_adicAbv K v₀ + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + obtain ⟨x₀, yWO, hNorm, hx₀val⟩ := + exists_singleFinitePlaceIntegralUnit_norm_eq + (K := K) (L := L) v₀ x hxNorm hxUnit + let z : (v₀.adicCompletion K ⊗[K] L)ˣ := + singleRelativeLocalTensorDecompositionIntegralUnit + (K := K) (L := L) v₀ w yWO + have hzIntegral : + RelativeLocalTensorDecompositionIntegralUnitAt + (K := K) (L := L) v₀ z := + singleRelativeLocalTensorDecompositionIntegralUnit_isIntegral + (K := K) (L := L) v₀ w yWO + refine ⟨z, ?_, hzIntegral⟩ + let zA : + (LocalTensorAlgebra (L := L) vK)ˣ := + (finitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) v₀).symm z + have hTensorNormSingle : + localTensorDetNorm + (K := K) (L := L) vK + ((finitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) v₀).symm + (singleRelativeLocalTensorDecompositionIntegralUnit + (K := K) (L := L) v₀ w yWO)) = + x₀ := + localTensorDetNorm_singleRelativeLocalTensorDecompositionIntegralUnit_eq + (K := K) (L := L) v₀ w yWO x₀ hNorm + have hTensorNorm : + localTensorDetNorm + (K := K) (L := L) vK zA = x₀ := by + simpa only [zA, z] using hTensorNormSingle + let e := + finitePlaceCompletionUnitsContinuousMulEquiv v₀ + calc + _root_.localTensorNorm + (K := K) (L := L) v₀ z = + _root_.localTensorNorm + (K := K) (L := L) v₀ + (finitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) v₀ zA) := by + congr 1 + exact + ((finitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) v₀).apply_symm_apply z).symm + _ = + e + (localTensorDetNorm + (K := K) (L := L) vK zA) := + (finitePlaceLocalTensorNorm_commutes + (K := K) (L := L) v₀ zA).symm + _ = e x₀ := congrArg e hTensorNorm + _ = x := hx₀val diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FinitePlaceTensorNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FinitePlaceTensorNorm.lean new file mode 100644 index 0000000000..459eb792aa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FinitePlaceTensorNorm.lean @@ -0,0 +1,303 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.TensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent +/-! +# Tensor norm images at actual finite places + +This file specializes the local tensor norm calculation to a height-one +prime of a number field. The canonical comparison + +`(K, |·|_v)^∧ ≃ K_v` + +identifies the determinant norm on +`(K, |·|_v)^∧ ⊗[K] L` with the determinant norm on the concrete tensor +factor `K_v ⊗[K] L` used by relative ideles. Consequently its image is +the chosen open local norm subgroup from `LocalNormApproximation`. + +The finite component of every global relative-idele norm therefore lies +in that subgroup, and its corresponding local quotient class is one. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + +open LocalClassFieldTheory + + +open AlgebraicNumberTheory.Valuations +open LocalFieldTheory + +variable {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- The canonical completion comparison as a `K`-algebra +equivalence. -/ +noncomputable def finitePlaceCompletionAlgEquiv + (v : HeightOneSpectrum (𝓞 K)) : + (NumberField.HeightOneSpectrum.adicAbv K v).Completion ≃ₐ[K] + v.adicCompletion K where + __ := finitePlaceCompletionRingEquiv v + commutes' x := by + change + finitePlaceCompletionRingHom v + (((WithAbs.equiv + (NumberField.HeightOneSpectrum.adicAbv K v)).symm x : + WithAbs + (NumberField.HeightOneSpectrum.adicAbv K v)) : + (NumberField.HeightOneSpectrum.adicAbv K v).Completion) = + algebraMap K (v.adicCompletion K) x + rw [finitePlaceCompletionRingHom_coe] + rfl + +/-- Base change of the first tensor factor gives the concrete tensor +algebra at `v`. -/ +noncomputable def finitePlaceLocalTensorAlgEquiv + (v : HeightOneSpectrum (𝓞 K)) : + LocalTensorAlgebra (L := L) + (NumberField.HeightOneSpectrum.adicAbv K v) ≃ₐ[K] + v.adicCompletion K ⊗[K] L := + Algebra.TensorProduct.congr + (finitePlaceCompletionAlgEquiv v) + (AlgEquiv.refl : L ≃ₐ[K] L) + +/-- The induced equivalence on tensor-algebra unit groups. -/ +noncomputable def finitePlaceLocalTensorUnitsEquiv + (v : HeightOneSpectrum (𝓞 K)) : + (LocalTensorAlgebra (L := L) + (NumberField.HeightOneSpectrum.adicAbv K v))ˣ ≃* + (v.adicCompletion K ⊗[K] L)ˣ := + Units.mapEquiv + (finitePlaceLocalTensorAlgEquiv + (K := K) (L := L) v).toMulEquiv + +omit [NumberField L] [IsGalois K L] in +/-- The completed-base comparison intertwines the two determinant norm +maps. -/ +theorem finitePlaceLocalTensorNorm_commutes + (v : HeightOneSpectrum (𝓞 K)) + (z : + (LocalTensorAlgebra (L := L) + (NumberField.HeightOneSpectrum.adicAbv K v))ˣ) : + finitePlaceCompletionUnitsContinuousMulEquiv v + (localTensorDetNorm + (K := K) (L := L) + (NumberField.HeightOneSpectrum.adicAbv K v) z) = + _root_.localTensorNorm + (K := K) (L := L) v + (finitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) v z) := by + apply Units.ext + exact + _root_.map_norm_tensorProduct_baseChange + (K := K) (L := L) + (finitePlaceCompletionAlgEquiv v).toAlgHom + (z : LocalTensorAlgebra (L := L) + (NumberField.HeightOneSpectrum.adicAbv K v)) + +omit [NumberField L] [IsGalois K L] in +/-- Before choosing a localization, the concrete determinant-norm +image is the transport of the absolute-value tensor norm image. -/ +theorem finitePlaceLocalTensorNorm_range_eq_transport + (v : HeightOneSpectrum (𝓞 K)) : + (_root_.localTensorNorm + (K := K) (L := L) v).range = + (localTensorNormSubgroup + (K := K) (L := L) + (NumberField.HeightOneSpectrum.adicAbv K v)).map + (finitePlaceCompletionUnitsContinuousMulEquiv + v).toMonoidHom := by + let T := + finitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) v + let e := + finitePlaceCompletionUnitsContinuousMulEquiv v + ext x + constructor + · rintro ⟨z, hz⟩ + refine + ⟨localTensorDetNorm + (K := K) (L := L) + (NumberField.HeightOneSpectrum.adicAbv K v) + (T.symm z), + ⟨T.symm z, rfl⟩, ?_⟩ + calc + e + (localTensorDetNorm + (K := K) (L := L) + (NumberField.HeightOneSpectrum.adicAbv K v) + (T.symm z)) = + _root_.localTensorNorm + (K := K) (L := L) v + (T (T.symm z)) := + finitePlaceLocalTensorNorm_commutes + (K := K) (L := L) v (T.symm z) + _ = + _root_.localTensorNorm + (K := K) (L := L) v z := by + rw [T.apply_symm_apply] + _ = x := hz + · rintro ⟨y, ⟨z, hz⟩, hy⟩ + refine ⟨T z, ?_⟩ + calc + _root_.localTensorNorm + (K := K) (L := L) v (T z) = + e + (localTensorDetNorm + (K := K) (L := L) + (NumberField.HeightOneSpectrum.adicAbv K v) z) := + (finitePlaceLocalTensorNorm_commutes + (K := K) (L := L) v z).symm + _ = e y := congrArg e hz + _ = x := hy + +omit [NumberField L] in +/-- **Actual finite-place tensor norm image.** The image of the +determinant norm on `K_v ⊗[K] L` is exactly the chosen local field-norm +subgroup in the concrete finite idele coordinate. -/ +theorem finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup + (v : HeightOneSpectrum (𝓞 K)) : + (_root_.localTensorNorm + (K := K) (L := L) v).range = + chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := by + let vK := + NumberField.HeightOneSpectrum.adicAbv K v + let w := chosenFinitePlaceExtension (L := L) v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := LocalizedCompletion vK w + let : Module.Finite vK.Completion E := + localizedCompletionModuleFinite vK hvK w + rw [finitePlaceLocalTensorNorm_range_eq_transport + (K := K) (L := L) v] + change + (localTensorNormSubgroup + (K := K) (L := L) vK).map + (finitePlaceCompletionUnitsContinuousMulEquiv + v).toMonoidHom = + (localNormSubgroup vK.Completion E).map + (finitePlaceCompletionUnitsContinuousMulEquiv + v).toMonoidHom + rw [localTensorNormSubgroup_eq_localNormSubgroup + (K := K) (L := L) vK w hvK] + +omit [NumberField L] in +/-- The quotient projection whose kernel is the finite-place tensor +norm image. -/ +noncomputable def finitePlaceTensorNormClass + (v : HeightOneSpectrum (𝓞 K)) : + (v.adicCompletion K)ˣ →* + ChosenFinitePlaceNormQuotient + (K := K) (L := L) v := + QuotientGroup.mk' + (chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v) + +omit [NumberField L] in +/-- A concrete local class is trivial exactly when its representative +is a determinant norm from `K_v ⊗[K] L`. -/ +theorem finitePlaceTensorNormClass_eq_one_iff + (v : HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) : + finitePlaceTensorNormClass + (K := K) (L := L) v x = 1 ↔ + ∃ z : (v.adicCompletion K ⊗[K] L)ˣ, + _root_.localTensorNorm + (K := K) (L := L) v z = x := by + change + QuotientGroup.mk' + (chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v) x = 1 ↔ _ + constructor + · intro hx + have hxmem : + x ∈ chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := + (QuotientGroup.eq_one_iff + (N := chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v) + (x := x)).mp hx + rw [← finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup + (K := K) (L := L) v] at hxmem + exact hxmem + · intro hx + apply + (QuotientGroup.eq_one_iff + (N := chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v) + (x := x)).mpr + rw [← finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup + (K := K) (L := L) v] + exact hx + +omit [NumberField L] in +/-- The kernel of the concrete quotient projection is precisely the +finite-place determinant norm image. -/ +theorem finitePlaceTensorNormClass_ker + (v : HeightOneSpectrum (𝓞 K)) : + (finitePlaceTensorNormClass + (K := K) (L := L) v).ker = + (_root_.localTensorNorm + (K := K) (L := L) v).range := by + ext x + rw [MonoidHom.mem_ker, + finitePlaceTensorNormClass_eq_one_iff + (K := K) (L := L) v] + rfl + +omit [NumberField L] in +/-- Every finite component of a global relative-idele norm lies in the +chosen local norm subgroup. -/ +theorem relativeIdeleNorm_finiteComponent_mem_chosenLocalNormSubgroup + (v : HeightOneSpectrum (𝓞 K)) + (a : RelativeIdeleGroup K L) : + IdeleGroup.finiteComponent v + (RelativeIdeleGroup.norm K L a) ∈ + chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := by + rw [← finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup + (K := K) (L := L) v] + exact + ⟨RelativeIdeleGroup.finiteComponent + (K := K) (L := L) v a, + (RelativeIdeleGroup.finiteComponent_norm + (K := K) (L := L) v a).symm⟩ + +omit [NumberField L] in +/-- Hence the local tensor-norm class of every finite component of a +global relative-idele norm is trivial. -/ +theorem finitePlaceTensorNormClass_relativeIdeleNorm + (v : HeightOneSpectrum (𝓞 K)) + (a : RelativeIdeleGroup K L) : + finitePlaceTensorNormClass + (K := K) (L := L) v + (IdeleGroup.finiteComponent v + (RelativeIdeleGroup.norm K L a)) = 1 := by + rw [finitePlaceTensorNormClass_eq_one_iff + (K := K) (L := L) v] + exact + ⟨RelativeIdeleGroup.finiteComponent + (K := K) (L := L) v a, + (RelativeIdeleGroup.finiteComponent_norm + (K := K) (L := L) v a).symm⟩ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/InfinitePlaceTensorNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/InfinitePlaceTensorNorm.lean new file mode 100644 index 0000000000..a84de42b95 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/InfinitePlaceTensorNorm.lean @@ -0,0 +1,213 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent +/-! +# The norm image of an archimedean tensor factor + +For a finite Galois extension `L / K`, the determinant-norm image on +`K_v ⊗[K] L` is the field-norm subgroup of any completion of `L` above +the infinite place `v`. This is the archimedean counterpart of the +finite-place tensor-norm comparison. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct NumberField.LiesOver +open NumberField + +noncomputable +section + +open LocalClassFieldTheory + +open LocalFieldTheory + +variable {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsGalois K L] + +/-- The determinant-norm image on the actual archimedean tensor factor +is the field-norm subgroup of any completion above the base place. -/ +theorem infiniteTensorNormSubgroup_eq_localNormSubgroup + (v : InfinitePlace K) (w : InfinitePlace L) + (hw : w.comap (algebraMap K L) = v) : + let : w.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) hw⟩ + infiniteTensorNormSubgroup (K := K) (L := L) v = + localNormSubgroup v.Completion w.Completion := by + let : w.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) hw⟩ + let u := + infinitePlaceAbsoluteValueExtension v w hw + let hL := + AbsoluteValue.extensionCompletionAlgebra + (K := K) u.1 + let : SMul K u.1.Completion := + hL.toSMul + let : Algebra v.1.Completion u.1.Completion := + AbsoluteValue.completionAlgebra v.1 u.1 u.2 + let : Algebra v.1.Completion w.1.Completion := + AbsoluteValue.completionAlgebra v.1 w.1 + (infinitePlaceAbsoluteValueExtension v w hw).2 + let E := + AlgebraicNumberTheory.Valuations.LocalizedCompletion v.1 u + let : Module.Finite v.1.Completion E := + AlgebraicNumberTheory.Valuations.localizedCompletionModuleFinite + v.1 v.isNontrivial u + let eVField : + v.Completion ≃+* v.1.Completion := + (infinitePlaceCompletionAlgEquiv + (K := K) v).toRingEquiv + let eWField : + w.Completion ≃+* w.1.Completion := + (infinitePlaceCompletionAlgEquiv + (K := L) w).toRingEquiv + let eVUnits : + v.Completionˣ ≃* v.1.Completionˣ := + Units.mapEquiv eVField.toMulEquiv + let eTensorUnits : + (v.Completion ⊗[K] L)ˣ ≃* + (LocalTensorAlgebra (L := L) v.1)ˣ := + infinitePlaceLocalTensorUnitsEquiv + (K := K) (L := L) v + have hTensorNorm + (z : (v.Completion ⊗[K] L)ˣ) : + eVUnits + (infiniteTensorDetNorm + (K := K) (L := L) v z) = + localTensorDetNorm + (K := K) (L := L) v.1 + (eTensorUnits z) := by + apply Units.ext + change + eVField + (Algebra.norm v.Completion + (z : v.Completion ⊗[K] L)) = + Algebra.norm v.1.Completion + (infinitePlaceLocalTensorAlgEquiv + (K := K) (L := L) v + (z : v.Completion ⊗[K] L)) + exact + _root_.map_norm_tensorProduct_baseChange + (K := K) (L := L) + (infinitePlaceCompletionAlgEquiv + (K := K) v).toAlgHom + (z : v.Completion ⊗[K] L) + have hTensorTransport : + infiniteTensorNormSubgroup + (K := K) (L := L) v = + (localTensorNormSubgroup + (K := K) (L := L) v.1).map + eVUnits.symm.toMonoidHom := by + ext x + constructor + · rintro ⟨z, rfl⟩ + refine + ⟨localTensorDetNorm + (K := K) (L := L) v.1 + (eTensorUnits z), + ⟨eTensorUnits z, rfl⟩, ?_⟩ + apply eVUnits.injective + change + eVUnits + (eVUnits.symm + (localTensorDetNorm + (K := K) (L := L) v.1 + (eTensorUnits z))) = + eVUnits + (infiniteTensorDetNorm + (K := K) (L := L) v z) + rw [eVUnits.apply_symm_apply] + exact (hTensorNorm z).symm + · rintro ⟨_, ⟨z, rfl⟩, rfl⟩ + refine ⟨eTensorUnits.symm z, ?_⟩ + apply eVUnits.injective + change + eVUnits + (infiniteTensorDetNorm + (K := K) (L := L) v + (eTensorUnits.symm z)) = + eVUnits + (eVUnits.symm + (localTensorDetNorm + (K := K) (L := L) v.1 z)) + rw [hTensorNorm, eTensorUnits.apply_symm_apply, + eVUnits.apply_symm_apply] + let eLocalized : + E ≃ₐ[v.1.Completion] w.1.Completion := + AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + v.1 v.isNontrivial u + let eBase : + v.1.Completion ≃+* v.Completion := + eVField.symm + let eExtension : + E ≃+* w.Completion := + eLocalized.toRingEquiv.trans eWField.symm + have hCompatible : + RingHom.comp + (algebraMap v.Completion w.Completion) + eBase = + RingHom.comp eExtension + (algebraMap v.1.Completion E) := by + have hWrapperCompletionSymm := + ringEquiv_compat_symm + eVField eWField (by + simpa [u, infinitePlaceAbsoluteValueExtension, + eVField, eWField] using + (infinitePlaceCompletionAlgEquiv_algebraMap + (K := K) (L := L) v w hw)) + apply RingHom.ext + intro x + change + algebraMap v.Completion w.Completion + (eVField.symm x) = + eWField.symm + (eLocalized + (algebraMap v.1.Completion E x)) + rw [eLocalized.commutes] + exact + DFunLike.congr_fun hWrapperCompletionSymm x + have hNormTransport : + (localNormSubgroup + v.1.Completion E).map + eVUnits.symm.toMonoidHom = + localNormSubgroup + v.Completion w.Completion := by + ext x + constructor + · rintro ⟨_, ⟨z, rfl⟩, rfl⟩ + refine + ⟨Units.mapEquiv + eExtension.toMulEquiv z, ?_⟩ + simpa [eBase, eVUnits] using + (normUnits_map_ringEquiv + eBase eExtension hCompatible z).symm + · rintro ⟨z, rfl⟩ + refine + ⟨normUnits v.1.Completion E + ((Units.mapEquiv + eExtension.toMulEquiv).symm z), + ⟨(Units.mapEquiv + eExtension.toMulEquiv).symm z, rfl⟩, + ?_⟩ + have hTransport := + normUnits_map_ringEquiv + eBase eExtension hCompatible + ((Units.mapEquiv + eExtension.toMulEquiv).symm z) + rw [(Units.mapEquiv + eExtension.toMulEquiv).apply_symm_apply] at hTransport + simpa [eBase, eVUnits] using hTransport + rw [hTensorTransport, + localTensorNormSubgroup_eq_localNormSubgroup + (K := K) (L := L) v.1 u v.isNontrivial] + exact hNormTransport diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/SPlaces.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/SPlaces.lean new file mode 100644 index 0000000000..037a4aa106 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/SPlaces.lean @@ -0,0 +1,797 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.IdeleSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Localization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralLocalFactor +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Product +/-! +# Finite-place support for relative ideles + +This file packages a restricted-product assertion for relative ideles. At +every finite place outside a finite +set, a relative idele belongs to the actual product of valuation-ring +unit groups supplied by the completion decomposition. The resulting supported +subgroups are stable under the Galois action and exhaust the full +relative idele group. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + +open CyclicCohomology + + +open AlgebraicNumberTheory.Valuations + +universe u v + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- Relative ideles that are integral units in every local tensor +factor outside the finite set `S`. -/ +noncomputable def relativeIdeleLocalTensorDecompositionSupportedSubgroup + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Subgroup (RelativeIdeleGroup K L) := + ⨅ w : HeightOneSpectrum (𝓞 K), + ⨅ (_ : w ∉ S), + (relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w).comap + (RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w) + +omit [NumberField L] [IsGalois K L] in +/-- Membership in the supported relative-idele subgroup is exactly +valuation-ring integrality at every finite place outside `S`. -/ +@[simp] +theorem mem_relativeIdeleLocalTensorDecompositionSupportedSubgroup_iff + (S : Finset (HeightOneSpectrum (𝓞 K))) + (z : RelativeIdeleGroup K L) : + z ∈ relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S ↔ + ∀ w : HeightOneSpectrum (𝓞 K), w ∉ S → + RelativeLocalTensorDecompositionIntegralUnitAt + (K := K) (L := L) w + (RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w z) := by + simp only [relativeIdeleLocalTensorDecompositionSupportedSubgroup, + Subgroup.mem_iInf, Subgroup.mem_comap, + mem_relativeLocalTensorDecompositionIntegralUnitSubgroup_iff] + +omit [NumberField L] [IsGalois K L] in +/-- Enlarging the exceptional set enlarges the supported subgroup. -/ +theorem relativeIdeleLocalTensorDecompositionSupportedSubgroup_mono + {S T : Finset (HeightOneSpectrum (𝓞 K))} + (hST : S ⊆ T) : + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S ≤ + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) T := by + intro z hz + rw [mem_relativeIdeleLocalTensorDecompositionSupportedSubgroup_iff] at hz ⊢ + intro w hw + exact hz w (fun hws => hw (hST hws)) + +omit [IsGalois K L] in +/-- The explicit coefficient-and-lattice support of a relative idele +is an exceptional set witnessing restricted-product integrality. -/ +theorem relativeIdele_mem_localTensorDecompositionSupportedSubgroup + (z : RelativeIdeleGroup K L) : + z ∈ relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) + (relativeIdeleLocalTensorDecompositionSupport + (K := K) (L := L) z) := by + rw [mem_relativeIdeleLocalTensorDecompositionSupportedSubgroup_iff] + intro w hw + exact + relativeIdele_finiteComponent_localTensorDecompositionIntegralUnit_of_notMem + (K := K) (L := L) z w hw + +omit [IsGalois K L] in +/-- The finite-support subgroups exhaust the complete relative idele +group. -/ +theorem iSup_relativeIdeleLocalTensorDecompositionSupportedSubgroup_eq_top : + ⨆ S : Finset (HeightOneSpectrum (𝓞 K)), + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S = + (⊤ : Subgroup (RelativeIdeleGroup K L)) := by + apply top_unique + intro z hz + exact + (le_iSup + (fun S : Finset (HeightOneSpectrum (𝓞 K)) => + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) + (relativeIdeleLocalTensorDecompositionSupport + (K := K) (L := L) z)) + (relativeIdele_mem_localTensorDecompositionSupportedSubgroup + (K := K) (L := L) z) + +/-- The finite local factors of a relative `S`-idele: unrestricted +tensor units on `S`, and actual local tensor integral units away +from `S`. -/ +abbrev RelativeFiniteSPlaceFactors + (S : Finset (HeightOneSpectrum (𝓞 K))) := + (∀ w : {w : HeightOneSpectrum (𝓞 K) // w ∈ S}, + (w.1.adicCompletion K ⊗[K] L)ˣ) × + (∀ w : {w : HeightOneSpectrum (𝓞 K) // w ∉ S}, + relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w.1) + +/-- The complete local-factor model attached to a finite support. -/ +abbrev RelativeIdeleSPlaceFactors + (S : Finset (HeightOneSpectrum (𝓞 K))) := + (∀ w : InfinitePlace K, (w.Completion ⊗[K] L)ˣ) × + RelativeFiniteSPlaceFactors (K := K) (L := L) S + +/-- The same local-factor model after applying the local tensor decomposition at +every finite place. -/ +abbrev RelativeIdeleSPlaceLocalTensorDecompositionFactors + (S : Finset (HeightOneSpectrum (𝓞 K))) := + (∀ w : InfinitePlace K, (w.Completion ⊗[K] L)ˣ) × + ((∀ w : {w : HeightOneSpectrum (𝓞 K) // w ∈ S}, + ∀ wL : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w.1) L, + wL.1.Completionˣ) × + (∀ w : {w : HeightOneSpectrum (𝓞 K) // w ∉ S}, + ∀ wL : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K w.1) L, + (absoluteValueCompletionIntegers wL.1 + (absoluteValueExtension_isNonarchimedean + (HeightOneSpectrum.adicAbv K w.1) + (HeightOneSpectrum.isNonarchimedean_adicAbv + K w.1) wL))ˣ)) + +/-- The componentwise local tensor decomposition identifies the finite tensor-unit +factors with products of the actual completion unit groups, retaining +valuation-ring units away from `S`. -/ +noncomputable def + relativeIdeleSPlaceFactorsEquivLocalTensorDecomposition + (S : Finset (HeightOneSpectrum (𝓞 K))) : + RelativeIdeleSPlaceFactors (K := K) (L := L) S ≃* + RelativeIdeleSPlaceLocalTensorDecompositionFactors + (K := K) (L := L) S := + (MulEquiv.refl + (∀ w : InfinitePlace K, + (w.Completion ⊗[K] L)ˣ)).prodCongr + ((MulEquiv.piCongrRight fun w : + {w : HeightOneSpectrum (𝓞 K) // w ∈ S} => + finitePlaceLocalTensorDecompositionUnitsEquiv + (K := K) (L := L) w.1).prodCongr + (MulEquiv.piCongrRight fun w : + {w : HeightOneSpectrum (𝓞 K) // w ∉ S} => + relativeLocalTensorDecompositionIntegralUnitSubgroupEquivPiUnits + (K := K) (L := L) w.1)) + +omit [NumberField L] [IsGalois K L] in +/-- Membership in the chosen basis lattice is exactly the coefficient +integrality needed by the restricted local-product model. -/ +theorem relativeBasisIntegralAt_repr_mem + (w : HeightOneSpectrum (𝓞 K)) + (x : w.adicCompletion K ⊗[K] L) + (hx : RelativeBasisIntegralAt + (K := K) (L := L) w x) + (i : RelativeAdeleBasisIndex (K := K) (L := L)) : + (Algebra.TensorProduct.basis + (w.adicCompletion K) + (relativeExtensionBasis + (K := K) (L := L))).repr x i ∈ + w.adicCompletionIntegers K := by + classical + rcases hx with ⟨c, rfl⟩ + simp only [map_sum, Algebra.TensorProduct.basis_repr_tmul, Module.Basis.repr_self, + Finsupp.mapRange_single, map_one, Finsupp.smul_single, smul_eq_mul, mul_one, + Finsupp.coe_finsetSum, Finset.sum_apply] + rw [Finset.sum_eq_single i] + · simpa only [Finsupp.single_eq_same] using (c i).property + · intro j _ hji + simp [hji] + · simp + +/-- Extract all local factors from an integrally supported +relative idele. -/ +noncomputable def relativeIdeleSupportedComponents + (S : Finset (HeightOneSpectrum (𝓞 K))) : + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S →* + RelativeIdeleSPlaceFactors (K := K) (L := L) S where + toFun z := + ⟨fun w => + RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) w z, + ⟨fun w => + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w.1 z, + fun w => + ⟨RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w.1 z, + (mem_relativeLocalTensorDecompositionIntegralUnitSubgroup_iff + (K := K) (L := L) w.1 _).2 + ((mem_relativeIdeleLocalTensorDecompositionSupportedSubgroup_iff + (K := K) (L := L) S z).1 z.property + w.1 w.2)⟩⟩⟩ + map_one' := by + apply Prod.ext + · funext w + exact + map_one + (RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) w) + · apply Prod.ext + · funext w + exact + map_one + (RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w.1) + · funext w + apply Subtype.ext + exact + map_one + (RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w.1) + map_mul' x y := by + apply Prod.ext + · funext w + exact + map_mul + (RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) w) + (x : RelativeIdeleGroup K L) + (y : RelativeIdeleGroup K L) + · apply Prod.ext + · funext w + exact + map_mul + (RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w.1) + (x : RelativeIdeleGroup K L) + (y : RelativeIdeleGroup K L) + · funext w + apply Subtype.ext + exact + map_mul + (RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w.1) + (x : RelativeIdeleGroup K L) + (y : RelativeIdeleGroup K L) + +omit [NumberField L] [IsGalois K L] in +/-- The infinite component of the displayed supported-factor map is the +original infinite component of the relative idele. -/ +@[simp] +theorem relativeIdeleSupportedComponents_infinite + (S : Finset (HeightOneSpectrum (𝓞 K))) + (z : relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) + (w : InfinitePlace K) : + (relativeIdeleSupportedComponents + (K := K) (L := L) S z).1 w = + RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) w z := + rfl + +omit [NumberField L] [IsGalois K L] in +/-- At a finite place in `S`, the displayed supported-factor map is the +unrestricted finite component. -/ +@[simp] +theorem relativeIdeleSupportedComponents_inside + (S : Finset (HeightOneSpectrum (𝓞 K))) + (z : relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) + (w : {w : HeightOneSpectrum (𝓞 K) // w ∈ S}) : + (relativeIdeleSupportedComponents + (K := K) (L := L) S z).2.1 w = + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w.1 z := + rfl + +omit [NumberField L] [IsGalois K L] in +/-- Outside `S`, coercing the integral factor back to tensor units recovers +the original finite component. -/ +@[simp] +theorem relativeIdeleSupportedComponents_outside_coe + (S : Finset (HeightOneSpectrum (𝓞 K))) + (z : relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) + (w : {w : HeightOneSpectrum (𝓞 K) // w ∉ S}) : + ((relativeIdeleSupportedComponents + (K := K) (L := L) S z).2.2 w : + (w.1.adicCompletion K ⊗[K] L)ˣ) = + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w.1 z := + rfl + +omit [NumberField L] [IsGalois K L] in +/-- All local components determine a supported relative idele. -/ +theorem relativeIdeleSupportedComponents_injective + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Function.Injective + (relativeIdeleSupportedComponents + (K := K) (L := L) S) := by + intro x y hxy + apply Subtype.ext + apply relativeIdeleLocalComponents_injective + apply Prod.ext + · funext w + exact congrArg (fun q => q.1 w) hxy + · funext w + by_cases hw : w ∈ S + · exact + congrArg + (fun q => q.2.1 + (⟨w, hw⟩ : + {w : HeightOneSpectrum (𝓞 K) // w ∈ S})) + hxy + · exact + congrArg Subtype.val + (congrArg + (fun q => q.2.2 + (⟨w, hw⟩ : + {w : HeightOneSpectrum (𝓞 K) // w ∉ S})) + hxy) + +/-- Assemble the complete `S`-place factor family as restricted local +idele data. Away from `S` and the finite discriminant set, the converse +part of the local tensor decomposition supplies the required coefficient integrality. -/ +noncomputable def relativeLocalIdeleDataOfSPlaceFactors + (S : Finset (HeightOneSpectrum (𝓞 K))) + (x : RelativeIdeleSPlaceFactors (K := K) (L := L) S) : + RelativeLocalIdeleData (K := K) (L := L) := by + classical + let f : + ∀ w : HeightOneSpectrum (𝓞 K), + (w.adicCompletion K ⊗[K] L)ˣ := + fun w => + if hw : w ∈ S then + x.2.1 ⟨w, hw⟩ + else + (x.2.2 ⟨w, hw⟩ : + (w.adicCompletion K ⊗[K] L)ˣ) + refine + { infinite := x.1 + finite := f + eventually_integral := ?_ + eventually_inverse_integral := ?_ } + · intro i + refine + (S ∪ integralTensorComparisonBadPlaces + (K := K) (L := L)).eventually_cofinite_notMem.mono ?_ + intro w hw + have hwS : w ∉ S := by + intro h + exact hw (Finset.mem_union_left _ h) + have hwBad : + w ∉ integralTensorComparisonBadPlaces + (K := K) (L := L) := by + intro h + exact hw (Finset.mem_union_right _ h) + have hProp : + RelativeLocalTensorDecompositionIntegralUnitAt + (K := K) (L := L) w (f w) := by + rw [show f w = + (x.2.2 ⟨w, hwS⟩ : + (w.adicCompletion K ⊗[K] L)ˣ) by + simp [f, hwS]] + exact + (mem_relativeLocalTensorDecompositionIntegralUnitSubgroup_iff + (K := K) (L := L) w _).1 + (x.2.2 ⟨w, hwS⟩).property + have hBasis : + RelativeBasisIntegralUnitAt + (K := K) (L := L) w (f w) := + localTensorDecompositionIntegralUnit_imp_relativeBasisIntegralUnitAt_of_notMem + (K := K) (L := L) w hwBad hProp + exact + relativeBasisIntegralAt_repr_mem + (K := K) (L := L) w (f w : _) + hBasis.1 i + · intro i + refine + (S ∪ integralTensorComparisonBadPlaces + (K := K) (L := L)).eventually_cofinite_notMem.mono ?_ + intro w hw + have hwS : w ∉ S := by + intro h + exact hw (Finset.mem_union_left _ h) + have hwBad : + w ∉ integralTensorComparisonBadPlaces + (K := K) (L := L) := by + intro h + exact hw (Finset.mem_union_right _ h) + have hProp : + RelativeLocalTensorDecompositionIntegralUnitAt + (K := K) (L := L) w (f w) := by + rw [show f w = + (x.2.2 ⟨w, hwS⟩ : + (w.adicCompletion K ⊗[K] L)ˣ) by + simp [f, hwS]] + exact + (mem_relativeLocalTensorDecompositionIntegralUnitSubgroup_iff + (K := K) (L := L) w _).1 + (x.2.2 ⟨w, hwS⟩).property + have hBasis : + RelativeBasisIntegralUnitAt + (K := K) (L := L) w (f w) := + localTensorDecompositionIntegralUnit_imp_relativeBasisIntegralUnitAt_of_notMem + (K := K) (L := L) w hwBad hProp + exact + relativeBasisIntegralAt_repr_mem + (K := K) (L := L) w + (((f w)⁻¹ : (w.adicCompletion K ⊗[K] L)ˣ) : + w.adicCompletion K ⊗[K] L) + hBasis.2 i + +omit [IsGalois K L] in +/-- The assembled local-idele data has the prescribed infinite component. -/ +@[simp] +theorem relativeLocalIdeleDataOfSPlaceFactors_infinite + (S : Finset (HeightOneSpectrum (𝓞 K))) + (x : RelativeIdeleSPlaceFactors (K := K) (L := L) S) + (w : InfinitePlace K) : + (relativeLocalIdeleDataOfSPlaceFactors + (K := K) (L := L) S x).infinite w = x.1 w := + rfl + +omit [IsGalois K L] in +/-- At a finite place in `S`, the assembled local-idele data has the +prescribed unrestricted component. -/ +@[simp] +theorem relativeLocalIdeleDataOfSPlaceFactors_finite_inside + (S : Finset (HeightOneSpectrum (𝓞 K))) + (x : RelativeIdeleSPlaceFactors (K := K) (L := L) S) + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∈ S) : + (relativeLocalIdeleDataOfSPlaceFactors + (K := K) (L := L) S x).finite w = + x.2.1 ⟨w, hw⟩ := by + simp [relativeLocalIdeleDataOfSPlaceFactors, hw] + +omit [IsGalois K L] in +/-- At a finite place outside `S`, the assembled local-idele data is the +coercion of the prescribed integral component. -/ +@[simp] +theorem relativeLocalIdeleDataOfSPlaceFactors_finite_outside + (S : Finset (HeightOneSpectrum (𝓞 K))) + (x : RelativeIdeleSPlaceFactors (K := K) (L := L) S) + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ S) : + (relativeLocalIdeleDataOfSPlaceFactors + (K := K) (L := L) S x).finite w = + (x.2.2 ⟨w, hw⟩ : + (w.adicCompletion K ⊗[K] L)ˣ) := by + simp [relativeLocalIdeleDataOfSPlaceFactors, hw] + +/-- Assemble prescribed local factors into the actual supported +relative idele. -/ +noncomputable def relativeIdeleOfSPlaceFactors + (S : Finset (HeightOneSpectrum (𝓞 K))) + (x : RelativeIdeleSPlaceFactors (K := K) (L := L) S) : + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S := by + refine + ⟨relativeIdeleOfLocalData + (K := K) (L := L) + (relativeLocalIdeleDataOfSPlaceFactors + (K := K) (L := L) S x), ?_⟩ + rw [mem_relativeIdeleLocalTensorDecompositionSupportedSubgroup_iff] + intro w hw + rw [relativeIdeleOfLocalData_finiteComponent, + relativeLocalIdeleDataOfSPlaceFactors_finite_outside + (K := K) (L := L) S x w hw] + exact + (mem_relativeLocalTensorDecompositionIntegralUnitSubgroup_iff + (K := K) (L := L) w _).1 + (x.2.2 ⟨w, hw⟩).property + +omit [IsGalois K L] in +/-- The relative idele assembled from displayed `S`-place factors has the +prescribed infinite component. -/ +@[simp] +theorem relativeIdeleOfSPlaceFactors_infiniteComponent + (S : Finset (HeightOneSpectrum (𝓞 K))) + (x : RelativeIdeleSPlaceFactors (K := K) (L := L) S) + (w : InfinitePlace K) : + RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) w + (relativeIdeleOfSPlaceFactors + (K := K) (L := L) S x) = + x.1 w := by + rw [relativeIdeleOfSPlaceFactors, + relativeIdeleOfLocalData_infiniteComponent] + rfl + +omit [IsGalois K L] in +/-- At a finite place in `S`, the assembled relative idele has the +prescribed unrestricted component. -/ +@[simp] +theorem relativeIdeleOfSPlaceFactors_finiteComponent_inside + (S : Finset (HeightOneSpectrum (𝓞 K))) + (x : RelativeIdeleSPlaceFactors (K := K) (L := L) S) + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∈ S) : + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w + (relativeIdeleOfSPlaceFactors + (K := K) (L := L) S x) = + x.2.1 ⟨w, hw⟩ := by + rw [relativeIdeleOfSPlaceFactors, + relativeIdeleOfLocalData_finiteComponent, + relativeLocalIdeleDataOfSPlaceFactors_finite_inside + (K := K) (L := L) S x w hw] + +omit [IsGalois K L] in +/-- At a finite place outside `S`, the assembled relative idele has the +coercion of the prescribed integral component. -/ +@[simp] +theorem relativeIdeleOfSPlaceFactors_finiteComponent_outside + (S : Finset (HeightOneSpectrum (𝓞 K))) + (x : RelativeIdeleSPlaceFactors (K := K) (L := L) S) + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ S) : + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w + (relativeIdeleOfSPlaceFactors + (K := K) (L := L) S x) = + (x.2.2 ⟨w, hw⟩ : + (w.adicCompletion K ⊗[K] L)ˣ) := by + rw [relativeIdeleOfSPlaceFactors, + relativeIdeleOfLocalData_finiteComponent, + relativeLocalIdeleDataOfSPlaceFactors_finite_outside + (K := K) (L := L) S x w hw] + +omit [IsGalois K L] in +/-- Every complete family of local factors is realized by a supported +relative idele. -/ +theorem relativeIdeleSupportedComponents_surjective + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Function.Surjective + (relativeIdeleSupportedComponents + (K := K) (L := L) S) := by + intro x + refine + ⟨relativeIdeleOfSPlaceFactors + (K := K) (L := L) S x, ?_⟩ + apply Prod.ext + · funext w + exact + relativeIdeleOfSPlaceFactors_infiniteComponent + (K := K) (L := L) S x w + · apply Prod.ext + · funext w + exact + relativeIdeleOfSPlaceFactors_finiteComponent_inside + (K := K) (L := L) S x w.1 w.2 + · funext w + apply Subtype.ext + exact + relativeIdeleOfSPlaceFactors_finiteComponent_outside + (K := K) (L := L) S x w.1 w.2 + +/-- The exact relative finite-support decomposition: + +`I_{L/K}^S` is the product of all archimedean tensor-unit factors, +the unrestricted finite tensor-unit factors over `S`, and the genuine +valuation-ring unit factors away from `S`. -/ +noncomputable def relativeIdeleSupportedEquivSPlaceFactors + (S : Finset (HeightOneSpectrum (𝓞 K))) : + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S ≃* + RelativeIdeleSPlaceFactors (K := K) (L := L) S := + MulEquiv.ofBijective + (relativeIdeleSupportedComponents + (K := K) (L := L) S) + ⟨relativeIdeleSupportedComponents_injective + (K := K) (L := L) S, + relativeIdeleSupportedComponents_surjective + (K := K) (L := L) S⟩ + +/-- The natural Galois action restricts to every finite-support +subgroup. -/ +@[reducible] +noncomputable def + relativeIdeleLocalTensorDecompositionSupportedSubgroupAction + (S : Finset (HeightOneSpectrum (𝓞 K))) : + MulDistribMulAction + (L ≃ₐ[K] L) + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) := by + letI := + relativeIdeleRestrictedMulDistribMulAction + (K := K) (L := L) + exact + { smul := fun σ z => + ⟨σ • (z : RelativeIdeleGroup K L), by + rw [mem_relativeIdeleLocalTensorDecompositionSupportedSubgroup_iff] + intro w hw + let := + scalarTensorUnitsAction + (K := K) (L := L) + (A := w.adicCompletion K) + rw [RelativeIdeleGroup.finiteComponent_smul] + exact + relativeLocalTensorDecompositionIntegralUnitAt_smul + (K := K) (L := L) w σ + (RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w z) + ((mem_relativeIdeleLocalTensorDecompositionSupportedSubgroup_iff + (K := K) (L := L) S z).1 z.property w hw)⟩ + one_smul := by + intro z + apply Subtype.ext + change + (1 : L ≃ₐ[K] L) • + (z : RelativeIdeleGroup K L) = + (z : RelativeIdeleGroup K L) + exact one_smul (L ≃ₐ[K] L) _ + mul_smul := by + intro σ τ z + apply Subtype.ext + exact + mul_smul σ τ + (z : RelativeIdeleGroup K L) + smul_one := by + intro σ + apply Subtype.ext + change + σ • (1 : RelativeIdeleGroup K L) = 1 + exact smul_one σ + smul_mul := by + intro σ x y + apply Subtype.ext + exact + smul_mul' σ + (x : RelativeIdeleGroup K L) + (y : RelativeIdeleGroup K L) } + +omit [NumberField L] [IsGalois K L] in +/-- Coercing the supported-subgroup action to the relative idele group +recovers the ambient Galois action. -/ +@[simp] +theorem + relativeIdeleLocalTensorDecompositionSupportedSubgroupAction_coe + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) + (z : relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) : + letI := + relativeIdeleLocalTensorDecompositionSupportedSubgroupAction + (K := K) (L := L) S + ((σ • z : + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) : + RelativeIdeleGroup K L) = + letI := + relativeIdeleRestrictedMulDistribMulAction + (K := K) (L := L) + σ • (z : RelativeIdeleGroup K L) := + rfl + +/-- Coordinatewise Galois action on the complete local-factor model. -/ +@[reducible] +noncomputable def relativeIdeleSPlaceFactorsAction + (S : Finset (HeightOneSpectrum (𝓞 K))) : + MulDistribMulAction + (L ≃ₐ[K] L) + (RelativeIdeleSPlaceFactors + (K := K) (L := L) S) := by + letI : ∀ w : InfinitePlace K, + MulDistribMulAction + (L ≃ₐ[K] L) (w.Completion ⊗[K] L)ˣ := + fun w => + scalarTensorUnitsAction + (K := K) (L := L) (A := w.Completion) + letI : MulDistribMulAction + (L ≃ₐ[K] L) + (∀ w : InfinitePlace K, + (w.Completion ⊗[K] L)ˣ) := + piMulDistribMulAction + (L ≃ₐ[K] L) + (fun w : InfinitePlace K => + (w.Completion ⊗[K] L)ˣ) + letI : ∀ w : + {w : HeightOneSpectrum (𝓞 K) // w ∈ S}, + MulDistribMulAction + (L ≃ₐ[K] L) + (w.1.adicCompletion K ⊗[K] L)ˣ := + fun w => + scalarTensorUnitsAction + (K := K) (L := L) + (A := w.1.adicCompletion K) + letI : MulDistribMulAction + (L ≃ₐ[K] L) + (∀ w : {w : HeightOneSpectrum (𝓞 K) // w ∈ S}, + (w.1.adicCompletion K ⊗[K] L)ˣ) := + piMulDistribMulAction + (L ≃ₐ[K] L) + (fun w : + {w : HeightOneSpectrum (𝓞 K) // w ∈ S} => + (w.1.adicCompletion K ⊗[K] L)ˣ) + letI : ∀ w : + {w : HeightOneSpectrum (𝓞 K) // w ∉ S}, + MulDistribMulAction + (L ≃ₐ[K] L) + (relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w.1) := + fun w => + relativeLocalTensorDecompositionIntegralUnitSubgroupAction + (K := K) (L := L) w.1 + letI : MulDistribMulAction + (L ≃ₐ[K] L) + (∀ w : {w : HeightOneSpectrum (𝓞 K) // w ∉ S}, + relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w.1) := + piMulDistribMulAction + (L ≃ₐ[K] L) + (fun w : + {w : HeightOneSpectrum (𝓞 K) // w ∉ S} => + relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w.1) + exact inferInstance + +omit [NumberField L] [IsGalois K L] in +/-- The complete local-component map is equivariant. -/ +theorem relativeIdeleSupportedComponents_smul + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) + (z : relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) : + letI := + relativeIdeleLocalTensorDecompositionSupportedSubgroupAction + (K := K) (L := L) S + letI := + relativeIdeleSPlaceFactorsAction + (K := K) (L := L) S + relativeIdeleSupportedComponents + (K := K) (L := L) S (σ • z) = + σ • relativeIdeleSupportedComponents + (K := K) (L := L) S z := by + let := + relativeIdeleLocalTensorDecompositionSupportedSubgroupAction + (K := K) (L := L) S + let := + relativeIdeleSPlaceFactorsAction + (K := K) (L := L) S + apply Prod.ext + · funext w + let := + scalarTensorUnitsAction + (K := K) (L := L) (A := w.Completion) + exact + RelativeIdeleGroup.infiniteComponent_smul + (K := K) (L := L) w σ z + · apply Prod.ext + · funext w + let := + scalarTensorUnitsAction + (K := K) (L := L) + (A := w.1.adicCompletion K) + exact + RelativeIdeleGroup.finiteComponent_smul + (K := K) (L := L) w.1 σ z + · funext w + apply Subtype.ext + let := + scalarTensorUnitsAction + (K := K) (L := L) + (A := w.1.adicCompletion K) + exact + RelativeIdeleGroup.finiteComponent_smul + (K := K) (L := L) w.1 σ z diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/Support.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/Support.lean new file mode 100644 index 0000000000..a89a188731 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/Support.lean @@ -0,0 +1,485 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent +/-! +# Finite coefficient support for relative ideles + +This file supplies the finite-support input for the actual scalar-extension model + +`𝔸_K ⊗[K] L`. + +Fixing the canonical chosen `K`-basis of `L`, every relative adele has +finitely many base-adele coefficients. For a relative idele we take +the union of the nonintegral finite places of the coefficients of the +idele and of its inverse. Outside this finite set both local tensor +components therefore lie in the lattice spanned by that basis over +the local valuation ring. + +This produces the finite support from a basis lattice. Passing from +that lattice to the product of local integer rings additionally requires +integral compatibility of the relative tensor decomposition. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + + +universe u v + +variable + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +/-- The finite index type of the canonical chosen `K`-basis of `L`. -/ +abbrev RelativeAdeleBasisIndex := + Module.Free.ChooseBasisIndex K L + +/-- The canonical chosen `K`-basis used to extract base-adele +coefficients. -/ +noncomputable def relativeExtensionBasis : + Module.Basis (RelativeAdeleBasisIndex (K := K) (L := L)) K L := + Module.Free.chooseBasis K L + +/-- Scalar extension of the chosen basis from `K` to `𝔸_K`. -/ +noncomputable def relativeAdeleBasis : + Module.Basis (RelativeAdeleBasisIndex (K := K) (L := L)) + (NumberField.AdeleRing (𝓞 K) K) + (RelativeAdeleRing K L) := + Algebra.TensorProduct.basis + (NumberField.AdeleRing (𝓞 K) K) + (relativeExtensionBasis (K := K) (L := L)) + +/-- The `i`-th base-adele coefficient of a relative adele. -/ +noncomputable def relativeAdeleCoefficient + (z : RelativeAdeleRing K L) + (i : RelativeAdeleBasisIndex (K := K) (L := L)) : + NumberField.AdeleRing (𝓞 K) K := + (relativeAdeleBasis (K := K) (L := L)).repr z i + +omit [NumberField L] in +/-- Expansion of a relative adele in the chosen extension basis. -/ +theorem relativeAdele_eq_sum_tmul_coefficients + (z : RelativeAdeleRing K L) : + z = + ∑ i : RelativeAdeleBasisIndex (K := K) (L := L), + relativeAdeleCoefficient + (K := K) (L := L) z i ⊗ₜ[K] + relativeExtensionBasis (K := K) (L := L) i := by + symm + simpa [relativeAdeleCoefficient, relativeAdeleBasis, + relativeExtensionBasis, Algebra.TensorProduct.basis_apply, + Algebra.TensorProduct.algebraMap_apply, + Algebra.TensorProduct.tmul_mul_tmul, Algebra.smul_def] using + (relativeAdeleBasis (K := K) (L := L)).sum_repr z + +omit [NumberField L] in +/-- Evaluation at a finite place is coefficientwise in the chosen +basis expansion. -/ +theorem relativeAdeleFiniteComponent_eq_sum_tmul_coefficients + (z : RelativeAdeleRing K L) + (w : HeightOneSpectrum (𝓞 K)) : + relativeAdeleFiniteComponent + (K := K) (L := L) w z = + ∑ i : RelativeAdeleBasisIndex (K := K) (L := L), + (relativeAdeleCoefficient + (K := K) (L := L) z i).2 w ⊗ₜ[K] + relativeExtensionBasis (K := K) (L := L) i := by + have h := + congrArg + (relativeAdeleFiniteComponent + (K := K) (L := L) w) + (relativeAdele_eq_sum_tmul_coefficients + (K := K) (L := L) z) + simpa only [map_sum, + relativeAdeleFiniteComponent_tmul] using h + +omit [NumberField L] in +/-- Evaluation at an infinite place is coefficientwise in the chosen +basis expansion. -/ +theorem relativeAdeleInfiniteComponent_eq_sum_tmul_coefficients + (z : RelativeAdeleRing K L) + (w : InfinitePlace K) : + relativeAdeleInfiniteComponent + (K := K) (L := L) w z = + ∑ i : RelativeAdeleBasisIndex (K := K) (L := L), + (relativeAdeleCoefficient + (K := K) (L := L) z i).1 w ⊗ₜ[K] + relativeExtensionBasis (K := K) (L := L) i := by + have h := + congrArg + (relativeAdeleInfiniteComponent + (K := K) (L := L) w) + (relativeAdele_eq_sum_tmul_coefficients + (K := K) (L := L) z) + simpa only [map_sum, + relativeAdeleInfiniteComponent_tmul] using h + +/-- The set of places at which a base adele is not in the local +valuation ring is finite. -/ +theorem finite_adeleNonIntegralPlaces + (a : NumberField.AdeleRing (𝓞 K) K) : + {w : HeightOneSpectrum (𝓞 K) | + a.2 w ∉ w.adicCompletionIntegers K}.Finite := + Filter.eventually_cofinite.mp a.2.2 + +/-- The exceptional finite places at which a base adele is not in the +local valuation ring. -/ +noncomputable def adeleNonIntegralPlaces + (a : NumberField.AdeleRing (𝓞 K) K) : + Finset (HeightOneSpectrum (𝓞 K)) := + (finite_adeleNonIntegralPlaces (K := K) a).toFinset + +@[simp] +theorem mem_adeleNonIntegralPlaces_iff + (a : NumberField.AdeleRing (𝓞 K) K) + (w : HeightOneSpectrum (𝓞 K)) : + w ∈ adeleNonIntegralPlaces (K := K) a ↔ + a.2 w ∉ w.adicCompletionIntegers K := by + exact + Set.Finite.mem_toFinset + (finite_adeleNonIntegralPlaces (K := K) a) + +/-- Away from its exact exceptional finset, a base adele has integral +finite component. -/ +theorem adele_component_mem_integers_of_notMem + (a : NumberField.AdeleRing (𝓞 K) K) + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ adeleNonIntegralPlaces (K := K) a) : + a.2 w ∈ w.adicCompletionIntegers K := by + contrapose! hw + exact + (mem_adeleNonIntegralPlaces_iff + (K := K) a w).2 hw + +/-- Exact union of all exceptional coefficient places of a relative +adele. -/ +noncomputable def relativeAdeleCoefficientSupport + (z : RelativeAdeleRing K L) : + Finset (HeightOneSpectrum (𝓞 K)) := by + classical + exact Finset.univ.biUnion fun i => + adeleNonIntegralPlaces + (K := K) + (relativeAdeleCoefficient + (K := K) (L := L) z i) + +omit [NumberField L] in +@[simp] +theorem mem_relativeAdeleCoefficientSupport_iff + (z : RelativeAdeleRing K L) + (w : HeightOneSpectrum (𝓞 K)) : + w ∈ relativeAdeleCoefficientSupport + (K := K) (L := L) z ↔ + ∃ i : RelativeAdeleBasisIndex (K := K) (L := L), + (relativeAdeleCoefficient + (K := K) (L := L) z i).2 w ∉ + w.adicCompletionIntegers K := by + classical + simp [relativeAdeleCoefficientSupport] + +/-- The exact coefficient support of a relative idele contains the +exceptional places of the idele and its inverse. -/ +noncomputable def relativeIdeleCoefficientSupport + (z : RelativeIdeleGroup K L) : + Finset (HeightOneSpectrum (𝓞 K)) := by + classical + exact + relativeAdeleCoefficientSupport + (K := K) (L := L) + (z : RelativeAdeleRing K L) ∪ + relativeAdeleCoefficientSupport + (K := K) (L := L) + ((z⁻¹ : RelativeIdeleGroup K L) : + RelativeAdeleRing K L) + +omit [NumberField L] in +@[simp] +theorem mem_relativeIdeleCoefficientSupport_iff + (z : RelativeIdeleGroup K L) + (w : HeightOneSpectrum (𝓞 K)) : + w ∈ relativeIdeleCoefficientSupport + (K := K) (L := L) z ↔ + (∃ i : RelativeAdeleBasisIndex (K := K) (L := L), + (relativeAdeleCoefficient + (K := K) (L := L) + (z : RelativeAdeleRing K L) i).2 w ∉ + w.adicCompletionIntegers K) ∨ + (∃ i : RelativeAdeleBasisIndex (K := K) (L := L), + (relativeAdeleCoefficient + (K := K) (L := L) + ((z⁻¹ : RelativeIdeleGroup K L) : + RelativeAdeleRing K L) i).2 w ∉ + w.adicCompletionIntegers K) := by + classical + simp [relativeIdeleCoefficientSupport] + +omit [NumberField L] in +/-- Outside the exact coefficient support, every coefficient of both +the relative idele and its inverse is integral at the given finite +place. -/ +theorem relativeIdele_coefficients_integral_of_notMem + (z : RelativeIdeleGroup K L) + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ relativeIdeleCoefficientSupport + (K := K) (L := L) z) : + (∀ i : RelativeAdeleBasisIndex (K := K) (L := L), + (relativeAdeleCoefficient + (K := K) (L := L) + (z : RelativeAdeleRing K L) i).2 w ∈ + w.adicCompletionIntegers K) ∧ + (∀ i : RelativeAdeleBasisIndex (K := K) (L := L), + (relativeAdeleCoefficient + (K := K) (L := L) + ((z⁻¹ : RelativeIdeleGroup K L) : + RelativeAdeleRing K L) i).2 w ∈ + w.adicCompletionIntegers K) := by + constructor + · intro i + by_contra hi + apply hw + exact + (mem_relativeIdeleCoefficientSupport_iff + (K := K) (L := L) z w).2 + (Or.inl ⟨i, hi⟩) + · intro i + by_contra hi + apply hw + exact + (mem_relativeIdeleCoefficientSupport_iff + (K := K) (L := L) z w).2 + (Or.inr ⟨i, hi⟩) + +omit [NumberField L] in +/-- The exact support is the least finset outside which all +coefficients of the idele and its inverse are integral. -/ +theorem relativeIdeleCoefficientSupport_minimal + (z : RelativeIdeleGroup K L) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (hS : + ∀ w, w ∉ S → + (∀ i : RelativeAdeleBasisIndex (K := K) (L := L), + (relativeAdeleCoefficient + (K := K) (L := L) + (z : RelativeAdeleRing K L) i).2 w ∈ + w.adicCompletionIntegers K) ∧ + (∀ i : RelativeAdeleBasisIndex (K := K) (L := L), + (relativeAdeleCoefficient + (K := K) (L := L) + ((z⁻¹ : RelativeIdeleGroup K L) : + RelativeAdeleRing K L) i).2 w ∈ + w.adicCompletionIntegers K)) : + relativeIdeleCoefficientSupport + (K := K) (L := L) z ⊆ S := by + intro w hw + by_contra hwS + obtain hbad | hbad := + (mem_relativeIdeleCoefficientSupport_iff + (K := K) (L := L) z w).1 hw + · obtain ⟨i, hi⟩ := hbad + exact hi ((hS w hwS).1 i) + · obtain ⟨i, hi⟩ := hbad + exact hi ((hS w hwS).2 i) + +omit [NumberField L] in +/-- Basis-lattice integrality in the local tensor algebra: all +coordinates in the fixed extension basis belong to the valuation +ring of `K_w`. -/ +def RelativeBasisIntegralAt + (w : HeightOneSpectrum (𝓞 K)) + (x : w.adicCompletion K ⊗[K] L) : Prop := + ∃ c : + RelativeAdeleBasisIndex (K := K) (L := L) → + w.adicCompletionIntegers K, + x = + ∑ i : RelativeAdeleBasisIndex (K := K) (L := L), + ((c i : w.adicCompletionIntegers K) : + w.adicCompletion K) ⊗ₜ[K] + relativeExtensionBasis (K := K) (L := L) i + +omit [NumberField L] in +/-- A local tensor unit is basis-integral when both it and its inverse +belong to the local valuation-ring coefficient lattice. -/ +def RelativeBasisIntegralUnitAt + (w : HeightOneSpectrum (𝓞 K)) + (x : (w.adicCompletion K ⊗[K] L)ˣ) : Prop := + RelativeBasisIntegralAt + (K := K) (L := L) w + (x : w.adicCompletion K ⊗[K] L) ∧ + RelativeBasisIntegralAt + (K := K) (L := L) w + ((x⁻¹ : (w.adicCompletion K ⊗[K] L)ˣ) : + w.adicCompletion K ⊗[K] L) + +omit [NumberField L] in +/-- The finite component of a relative idele is given by the evaluated +base-adele coefficients. -/ +theorem relativeIdele_finiteComponent_eq_sum_tmul_coefficients + (z : RelativeIdeleGroup K L) + (w : HeightOneSpectrum (𝓞 K)) : + ((RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w z : + (w.adicCompletion K ⊗[K] L)ˣ) : + w.adicCompletion K ⊗[K] L) = + ∑ i : RelativeAdeleBasisIndex (K := K) (L := L), + (relativeAdeleCoefficient + (K := K) (L := L) + (z : RelativeAdeleRing K L) i).2 w ⊗ₜ[K] + relativeExtensionBasis (K := K) (L := L) i := by + rw [RelativeIdeleGroup.finiteComponent_coe] + exact + relativeAdeleFiniteComponent_eq_sum_tmul_coefficients + (K := K) (L := L) + (z : RelativeAdeleRing K L) w + +omit [NumberField L] in +/-- Outside the coefficient support, the actual finite component lies +in the local lattice spanned by the chosen extension basis. -/ +theorem relativeIdele_finiteComponent_basisIntegral_of_notMem + (z : RelativeIdeleGroup K L) + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ relativeIdeleCoefficientSupport + (K := K) (L := L) z) : + RelativeBasisIntegralAt + (K := K) (L := L) w + ((RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w z : + (w.adicCompletion K ⊗[K] L)ˣ) : + w.adicCompletion K ⊗[K] L) := by + let c : + ∀ i : RelativeAdeleBasisIndex (K := K) (L := L), + w.adicCompletionIntegers K := + fun i => + ⟨(relativeAdeleCoefficient + (K := K) (L := L) + (z : RelativeAdeleRing K L) i).2 w, + (relativeIdele_coefficients_integral_of_notMem + (K := K) (L := L) z w hw).1 i⟩ + refine ⟨c, ?_⟩ + simpa only [c, Subtype.coe_mk] using + relativeIdele_finiteComponent_eq_sum_tmul_coefficients + (K := K) (L := L) z w + +omit [NumberField L] in +/-- Outside the same support, the actual finite component of the +inverse lies in the same local basis lattice. -/ +theorem relativeIdele_inverse_finiteComponent_basisIntegral_of_notMem + (z : RelativeIdeleGroup K L) + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ relativeIdeleCoefficientSupport + (K := K) (L := L) z) : + RelativeBasisIntegralAt + (K := K) (L := L) w + ((RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w + (z⁻¹ : RelativeIdeleGroup K L) : + (w.adicCompletion K ⊗[K] L)ˣ) : + w.adicCompletion K ⊗[K] L) := by + let c : + ∀ i : RelativeAdeleBasisIndex (K := K) (L := L), + w.adicCompletionIntegers K := + fun i => + ⟨(relativeAdeleCoefficient + (K := K) (L := L) + ((z⁻¹ : RelativeIdeleGroup K L) : + RelativeAdeleRing K L) i).2 w, + (relativeIdele_coefficients_integral_of_notMem + (K := K) (L := L) z w hw).2 i⟩ + refine ⟨c, ?_⟩ + simpa only [c, Subtype.coe_mk] using + relativeIdele_finiteComponent_eq_sum_tmul_coefficients + (K := K) (L := L) + (z⁻¹ : RelativeIdeleGroup K L) w + +omit [NumberField L] in +/-- Equivalently, the inverse of the actual local unit component lies +in the same basis lattice outside the coefficient support. -/ +theorem relativeIdele_finiteComponent_inv_basisIntegral_of_notMem + (z : RelativeIdeleGroup K L) + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ relativeIdeleCoefficientSupport + (K := K) (L := L) z) : + RelativeBasisIntegralAt + (K := K) (L := L) w + ((((RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w z)⁻¹ : + (w.adicCompletion K ⊗[K] L)ˣ) : + w.adicCompletion K ⊗[K] L)) := by + simpa using + relativeIdele_inverse_finiteComponent_basisIntegral_of_notMem + (K := K) (L := L) z w hw + +omit [NumberField L] in +/-- Thus the actual local unit component is basis-integral outside the +explicit coefficient support. -/ +theorem relativeIdele_finiteComponent_basisIntegralUnit_of_notMem + (z : RelativeIdeleGroup K L) + (w : HeightOneSpectrum (𝓞 K)) + (hw : w ∉ relativeIdeleCoefficientSupport + (K := K) (L := L) z) : + RelativeBasisIntegralUnitAt + (K := K) (L := L) w + (RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w z) := + ⟨relativeIdele_finiteComponent_basisIntegral_of_notMem + (K := K) (L := L) z w hw, + relativeIdele_finiteComponent_inv_basisIntegral_of_notMem + (K := K) (L := L) z w hw⟩ + +omit [NumberField L] in +/-- A source-producing finite-support theorem: one explicit +minimal finset simultaneously controls the local basis integrality of +the relative idele and its inverse. -/ +theorem exists_relativeIdele_coefficientSupport + (z : RelativeIdeleGroup K L) : + ∃ S : Finset (HeightOneSpectrum (𝓞 K)), + (∀ w, w ∉ S → + (∀ i : RelativeAdeleBasisIndex (K := K) (L := L), + (relativeAdeleCoefficient + (K := K) (L := L) + (z : RelativeAdeleRing K L) i).2 w ∈ + w.adicCompletionIntegers K) ∧ + (∀ i : RelativeAdeleBasisIndex (K := K) (L := L), + (relativeAdeleCoefficient + (K := K) (L := L) + ((z⁻¹ : RelativeIdeleGroup K L) : + RelativeAdeleRing K L) i).2 w ∈ + w.adicCompletionIntegers K)) ∧ + (∀ w, w ∉ S → + RelativeBasisIntegralAt + (K := K) (L := L) w + ((RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w z : + (w.adicCompletion K ⊗[K] L)ˣ) : + w.adicCompletion K ⊗[K] L) ∧ + RelativeBasisIntegralAt + (K := K) (L := L) w + ((((RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w z)⁻¹ : + (w.adicCompletion K ⊗[K] L)ˣ) : + w.adicCompletion K ⊗[K] L))) := by + refine + ⟨relativeIdeleCoefficientSupport + (K := K) (L := L) z, ?_, ?_⟩ + · intro w hw + exact + relativeIdele_coefficients_integral_of_notMem + (K := K) (L := L) z w hw + · intro w hw + exact + ⟨relativeIdele_finiteComponent_basisIntegral_of_notMem + (K := K) (L := L) z w hw, + relativeIdele_finiteComponent_inv_basisIntegral_of_notMem + (K := K) (L := L) z w hw⟩ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/RestrictedProductUnitsTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/RestrictedProductUnitsTopology.lean new file mode 100644 index 0000000000..2e7bdfba3b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/RestrictedProductUnitsTopology.lean @@ -0,0 +1,153 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Topology.Algebra.Group.Units +public import Mathlib.Topology.Algebra.RestrictedProduct.TopologicalSpace +public import Mathlib.Topology.Algebra.RestrictedProduct.Units +/-! +# Topology on units of a restricted product + +For the cofinite restricted product, Mathlib's algebraic `unitsEquiv` +is a topological group equivalence when each distinguished local submonoid +is open. The units on the left carry their graph topology; the right side +has the restricted-product topology of the local unit groups. +-/ + +@[expose] public section + +open Filter +open scoped RestrictedProduct + +noncomputable +section + +namespace RestrictedProduct + +universe u v w + +variable {ι : Type u} {R : ι → Type v} + [∀ i, Monoid (R i)] [∀ i, TopologicalSpace (R i)] +variable {S : ι → Type w} + [∀ i, SetLike (S i) (R i)] [∀ i, SubmonoidClass (S i) (R i)] +variable {B : ∀ i, S i} + +private def inclusionMonoidHom {𝓕 𝓖 : Filter ι} (h : 𝓕 ≤ 𝓖) : + (Πʳ i, [R i, B i]_[𝓖]) →* (Πʳ i, [R i, B i]_[𝓕]) where + toFun := inclusion R (fun i => (B i : Set (R i))) h + map_one' := rfl + map_mul' _ _ := rfl + +/-- At a principal filter, the algebraic equivalence of units is already a +topological group equivalence; no openness assumption is needed. -/ +private noncomputable def unitsEquivPrincipal (T : Set ι) : + (Πʳ i, [R i, B i]_[𝓟 T])ˣ ≃ₜ* + (Πʳ i, [(R i)ˣ, (Submonoid.ofClass (B i)).units]_[𝓟 T]) := by + let e := unitsEquiv (B := B) (𝓕 := 𝓟 T) R + refine { toMulEquiv := e, continuous_toFun := ?_, continuous_invFun := ?_ } + · apply (isEmbedding_coe_of_principal + (R := fun i => (R i)ˣ) + (A := fun i => ((Submonoid.ofClass (B i)).units : Set (R i)ˣ))).continuous_iff.mpr + have hmap : Continuous + (Units.map (coeMonoidHom (B := B) (𝓕 := 𝓟 T))) := + (continuous_coe (R := R) (A := fun i => (B i : Set (R i)))).units_map _ + have h : Continuous (fun x : (Πʳ i, [R i, B i]_[𝓟 T])ˣ => + ContinuousMulEquiv.piUnits + (Units.map (coeMonoidHom (B := B) (𝓕 := 𝓟 T)) x)) := + ContinuousMulEquiv.piUnits.continuous.comp hmap + refine h.congr ?_ + intro x + funext i + rfl + · have hCoe : Topology.IsEmbedding + (coeMonoidHom (B := B) (𝓕 := 𝓟 T) : + (Πʳ i, [R i, B i]_[𝓟 T]) →* Π i, R i) := + isEmbedding_coe_of_principal + have hEmbedding : Topology.IsEmbedding + (Units.map (coeMonoidHom (B := B) (𝓕 := 𝓟 T))) := + hCoe.units_map + apply hEmbedding.continuous_iff.mpr + have h : Continuous (fun y : + (Πʳ i, [(R i)ˣ, (Submonoid.ofClass (B i)).units]_[𝓟 T]) => + ContinuousMulEquiv.piUnits.symm (y : Π i, (R i)ˣ)) := + ContinuousMulEquiv.piUnits.symm.continuous.comp continuous_coe + refine h.congr ?_ + intro y + apply Units.ext + funext i + rfl + +/-- The principal-stage inclusion of ring restricted products induces an +open embedding of their unit groups when the distinguished submonoids are open. -/ +private theorem isOpenEmbedding_units_inclusion + (hBopen : ∀ i, IsOpen (B i : Set (R i))) + {T : Set ι} (hT : cofinite ≤ 𝓟 T) : + Topology.IsOpenEmbedding (Units.map (inclusionMonoidHom (B := B) hT)) := by + have hRing : Topology.IsOpenEmbedding + (inclusion R (fun i => (B i : Set (R i))) hT) := + isOpenEmbedding_inclusion_principal hBopen hT + exact Topology.IsOpenEmbedding.of_continuous_injective_isOpenMap + (hRing.continuous.units_map _) + (Units.map_injective hRing.injective) + (Units.isOpenMap_map hRing.injective hRing.isOpenMap) + +/-- For open distinguished local submonoids, Mathlib's restricted-product +unit equivalence is an equivalence of topological groups. -/ +noncomputable def unitsContinuousMulEquiv + (hBopen : ∀ i, IsOpen (B i : Set (R i))) : + (Πʳ i, [R i, B i])ˣ ≃ₜ* + (Πʳ i, [(R i)ˣ, (Submonoid.ofClass (B i)).units]) := by + let e := unitsEquiv (B := B) (𝓕 := cofinite) R + refine { toMulEquiv := e, continuous_toFun := ?_, continuous_invFun := ?_ } + · exact (by + rw [continuous_iff_continuousAt] + intro x + let T : Set ι := {i | e x i ∈ (Submonoid.ofClass (B i)).units} + have hT : cofinite ≤ 𝓟 T := le_principal_iff.mpr (e x).2 + let y : Πʳ i, [(R i)ˣ, (Submonoid.ofClass (B i)).units]_[𝓟 T] := + ⟨(e x).1, fun i hi => hi⟩ + let x' : (Πʳ i, [R i, B i]_[𝓟 T])ˣ := + (unitsEquivPrincipal (B := B) T).symm y + have hx : Units.map (inclusionMonoidHom (B := B) hT) x' = x := by + apply Units.ext + apply RestrictedProduct.ext + intro i + rfl + have hLocal : Continuous (fun z : (Πʳ i, [R i, B i]_[𝓟 T])ˣ => + e (Units.map (inclusionMonoidHom (B := B) hT) z)) := by + have h := (continuous_inclusion (R := fun i => (R i)ˣ) + (A := fun i => ((Submonoid.ofClass (B i)).units : Set (R i)ˣ)) hT).comp + (unitsEquivPrincipal (B := B) T).continuous + refine h.congr ?_ + intro z + apply RestrictedProduct.ext + intro i + rfl + rw [← hx] + exact (isOpenEmbedding_units_inclusion (B := B) hBopen hT).continuousAt_iff.mp + hLocal.continuousAt + ) + · exact (by + apply (continuous_dom (R := fun i => (R i)ˣ) + (A := fun i => ((Submonoid.ofClass (B i)).units : Set (R i)ˣ))).mpr + intro T hT + have h : Continuous (fun y : + (Πʳ i, [(R i)ˣ, (Submonoid.ofClass (B i)).units]_[𝓟 T]) => + Units.map (inclusionMonoidHom (B := B) hT) + ((unitsEquivPrincipal (B := B) T).symm y)) := + ((continuous_inclusion (R := R) + (A := fun i => (B i : Set (R i))) hT).units_map _).comp + (unitsEquivPrincipal (B := B) T).symm.continuous + refine h.congr ?_ + intro y + apply Units.ext + apply RestrictedProduct.ext + intro i + rfl + ) + +end RestrictedProduct diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SPlaces.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SPlaces.lean new file mode 100644 index 0000000000..d6483965e6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SPlaces.lean @@ -0,0 +1,179 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology +public import Mathlib.RingTheory.DedekindDomain.SInteger +/-! +# Ideles and units with finite support + +This file formalizes finite-support objects for ideles and units. Since every +archimedean place is always included, a finite set +`S` below records only its finite places. +-/ + +@[expose] public section + +open scoped NumberField RestrictedProduct +open NumberField IsDedekindDomain + +noncomputable +section + + +variable {K : Type*} [Field K] [NumberField K] + +namespace FiniteIdeleGroup + +/-- The finite ideles that are integral units away from `S`. -/ +def supportedAt (S : Set (HeightOneSpectrum (𝓞 K))) : + Subgroup (FiniteIdeleGroup K) where + carrier := {a | ∀ v, v ∉ S → + a v ∈ (v.adicCompletionIntegers K).units} + one_mem' _ _ := Submonoid.one_mem _ + mul_mem' ha hb v hv := Submonoid.mul_mem _ + (ha v hv) (hb v hv) + inv_mem' ha v hv := Subgroup.inv_mem _ + (ha v hv) + +@[simp] +theorem mem_supportedAt_iff + (S : Set (HeightOneSpectrum (𝓞 K))) + (a : FiniteIdeleGroup K) : + a ∈ supportedAt (K := K) S ↔ + ∀ v, v ∉ S → + a v ∈ (v.adicCompletionIntegers K).units := + Iff.rfl + +theorem supportedAt_mono {S T : Set (HeightOneSpectrum (𝓞 K))} + (hST : S ⊆ T) : + supportedAt (K := K) S ≤ supportedAt (K := K) T := by + intro a ha v hv + exact ha v (fun h => hv (hST h)) + +theorem mem_supportedAt_nonLocalUnits + (a : FiniteIdeleGroup K) : + a ∈ supportedAt (K := K) + {v | a v ∉ (v.adicCompletionIntegers K).units} := by + intro v hv + simpa using hv + +/-- Every finite idele is supported at some finite set of finite places. -/ +theorem exists_finset_supportedAt (a : FiniteIdeleGroup K) : + ∃ S : Finset (HeightOneSpectrum (𝓞 K)), + a ∈ supportedAt (K := K) (S : Set _) := by + let T : Set (HeightOneSpectrum (𝓞 K)) := + {v | a v ∉ (v.adicCompletionIntegers K).units} + have hT : T.Finite := Filter.eventually_cofinite.mp a.2 + exact ⟨hT.toFinset, by + rw [Set.Finite.coe_toFinset] + exact mem_supportedAt_nonLocalUnits a⟩ + +/-- The union of the finite-support subgroups is the full finite idele +group. -/ +theorem iSup_finset_supportedAt : + ⨆ S : Finset (HeightOneSpectrum (𝓞 K)), + supportedAt (K := K) (S : Set _) = ⊤ := by + apply top_unique + intro a _ + obtain ⟨S, ha⟩ := exists_finset_supportedAt a + exact Subgroup.mem_iSup_of_mem S ha + +/-- The everywhere-integral subgroup is the subgroup supported at the empty +set. -/ +theorem supportedAt_empty : + supportedAt (K := K) + (∅ : Set (HeightOneSpectrum (𝓞 K))) = + integralSubgroup (K := K) := + by + ext a + simp only [mem_supportedAt_iff, Set.mem_empty_iff_false, + not_false_eq_true, forall_const, mem_integralSubgroup_iff] + +/-- For a finite set `S`, the `S`-finite-ideles form an open subgroup. -/ +theorem isOpen_supportedAt (S : Finset (HeightOneSpectrum (𝓞 K))) : + IsOpen + ((supportedAt (K := K) (S : Set _) : + Subgroup (FiniteIdeleGroup K)) : Set (FiniteIdeleGroup K)) := by + change IsOpen {a : FiniteIdeleGroup K | ∀ v, v ∉ (S : Set _) → + a v ∈ (v.adicCompletionIntegers K).units} + exact RestrictedProduct.isOpen_forall_imp_mem + (fun v => isOpen_finiteLocalUnits K v) + +end FiniteIdeleGroup + +namespace IdeleGroup + +/-- The group `I_K^S`, with all infinite places included and finite +components integral away from `S`. -/ +def supportedAt (S : Set (HeightOneSpectrum (𝓞 K))) : + Subgroup (IdeleGroup K) := + Subgroup.comap (MonoidHom.snd _ _) + (FiniteIdeleGroup.supportedAt S) + +@[simp] +theorem mem_supportedAt_iff + (S : Set (HeightOneSpectrum (𝓞 K))) + (a : IdeleGroup K) : + a ∈ supportedAt (K := K) S ↔ + ∀ v, v ∉ S → + a.2 v ∈ (v.adicCompletionIntegers K).units := + Iff.rfl + +theorem supportedAt_mono {S T : Set (HeightOneSpectrum (𝓞 K))} + (hST : S ⊆ T) : + supportedAt (K := K) S ≤ supportedAt (K := K) T := + Subgroup.comap_mono + (FiniteIdeleGroup.supportedAt_mono hST) + +/-- Every idele lies in `I_K^S` for some finite set `S`. -/ +theorem exists_finset_supportedAt (a : IdeleGroup K) : + ∃ S : Finset (HeightOneSpectrum (𝓞 K)), + a ∈ supportedAt (K := K) (S : Set _) := + FiniteIdeleGroup.exists_finset_supportedAt a.2 + +theorem iSup_finset_supportedAt : + ⨆ S : Finset (HeightOneSpectrum (𝓞 K)), + supportedAt (K := K) (S : Set _) = ⊤ := by + apply top_unique + intro a _ + obtain ⟨S, ha⟩ := exists_finset_supportedAt a + exact Subgroup.mem_iSup_of_mem S ha + +theorem supportedAt_empty : + supportedAt (K := K) + (∅ : Set (HeightOneSpectrum (𝓞 K))) = + integralAtFinitePlaces (K := K) := + by + ext a + simp only [mem_supportedAt_iff, Set.mem_empty_iff_false, + not_false_eq_true, forall_const] + rfl + +theorem isOpen_supportedAt + (S : Finset (HeightOneSpectrum (𝓞 K))) : + IsOpen + ((supportedAt (K := K) (S : Set _) : + Subgroup (IdeleGroup K)) : Set (IdeleGroup K)) := + (FiniteIdeleGroup.isOpen_supportedAt S).preimage continuous_snd + +end IdeleGroup + +/-- The group of `S`-units of `K`, for a finite set of finite places. +All infinite places are understood to lie in `S`. -/ +abbrev SUnitGroup + (S : Finset (HeightOneSpectrum (𝓞 K))) := + (S : Set (HeightOneSpectrum (𝓞 K))).unit K + +@[simp] +theorem mem_SUnitGroup_iff + (S : Finset (HeightOneSpectrum (𝓞 K))) (x : Kˣ) : + x ∈ SUnitGroup (K := K) S ↔ + ∀ v : HeightOneSpectrum (𝓞 K), v ∉ S → + v.valuation K x = 1 := + Iff.rfl diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SinglePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SinglePlace.lean new file mode 100644 index 0000000000..245804c992 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SinglePlace.lean @@ -0,0 +1,593 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation +/-! +# Ideles supported at one place + +Local-to-global diagrams use the canonical embedding of a local multiplicative +group into the idele group. This file constructs +that embedding at finite places and the corresponding one-component +relative idele. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + +namespace IdeleGroup + +variable {K : Type*} [Field K] [NumberField K] + +open scoped Classical in +/-- The dependent archimedean value which is `x` at `v` and `1` +elsewhere. -/ +def infinitePlaceValue + (v : InfinitePlace K) + (x : v.Completionˣ) : + (w : InfinitePlace K) → w.Completionˣ := + Pi.mulSingle + (M := fun u : InfinitePlace K ↦ u.Completionˣ) + v x + +omit [NumberField K] in +open scoped Classical in +@[simp] +private theorem infinitePlaceValue_same + (v : InfinitePlace K) + (x : v.Completionˣ) : + infinitePlaceValue v x v = x := by + exact Pi.mulSingle_eq_same + (M := fun u : InfinitePlace K ↦ u.Completionˣ) v x + +omit [NumberField K] in +open scoped Classical in +@[simp] +private theorem infinitePlaceValue_of_ne + (v w : InfinitePlace K) + (x : v.Completionˣ) + (h : w ≠ v) : + infinitePlaceValue v x w = 1 := by + exact Pi.mulSingle_eq_of_ne + (M := fun u : InfinitePlace K ↦ u.Completionˣ) h x + +open scoped Classical in +/-- The idele whose `v`-component is prescribed and whose other +components are `1`, for an archimedean place `v`. -/ +def infinitePlaceIdele + (v : InfinitePlace K) : + v.Completionˣ →* IdeleGroup K where + toFun x := + (ContinuousMulEquiv.piUnits.symm + (infinitePlaceValue v x), 1) + map_one' := by + have hvalue : infinitePlaceValue v 1 = 1 := by + funext w + by_cases hw : w = v + · subst w + exact infinitePlaceValue_same v 1 + · exact infinitePlaceValue_of_ne v w 1 hw + apply Prod.ext + · change + ContinuousMulEquiv.piUnits.symm + (infinitePlaceValue v 1) = 1 + rw [hvalue, map_one] + · simp + map_mul' x y := by + have hvalue : + infinitePlaceValue v (x * y) = + infinitePlaceValue v x * infinitePlaceValue v y := by + funext w + by_cases hw : w = v + · subst w + simp + · simp [infinitePlaceValue_of_ne v w x hw, + infinitePlaceValue_of_ne v w y hw, + infinitePlaceValue_of_ne v w (x * y) hw] + apply Prod.ext + · change + ContinuousMulEquiv.piUnits.symm + (infinitePlaceValue v (x * y)) = + ContinuousMulEquiv.piUnits.symm + (infinitePlaceValue v x) * + ContinuousMulEquiv.piUnits.symm + (infinitePlaceValue v y) + rw [hvalue, map_mul] + · simp + +open scoped Classical in +/-- Inserting a unit at one archimedean place is continuous. -/ +theorem continuous_infinitePlaceIdele + (v : InfinitePlace K) : + Continuous (infinitePlaceIdele v) := by + change Continuous + (fun x : v.Completionˣ ↦ + (ContinuousMulEquiv.piUnits.symm + (infinitePlaceValue v x), 1)) + have hvalue : + Continuous + (fun x : v.Completionˣ ↦ + infinitePlaceValue v x) := by + simpa only [infinitePlaceValue] using + (continuous_mulSingle + (A := fun u : InfinitePlace K ↦ u.Completionˣ) v) + exact + (ContinuousMulEquiv.piUnits.symm.continuous.comp + hvalue).prodMk continuous_const + +open scoped Classical in +/-- The continuous homomorphism inserting a unit at one archimedean place. -/ +def infinitePlaceIdeleContinuous + (v : InfinitePlace K) : + v.Completionˣ →ₜ* IdeleGroup K where + __ := infinitePlaceIdele v + continuous_toFun := continuous_infinitePlaceIdele v + +open scoped Classical in +@[simp] +theorem infinitePlaceIdeleContinuous_apply + (v : InfinitePlace K) (x : v.Completionˣ) : + infinitePlaceIdeleContinuous v x = + infinitePlaceIdele v x := + rfl + +open scoped Classical in +/-- An archimedean one-place idele recovers its prescribed component +at the supporting place. -/ +theorem infinitePlaceIdele_infiniteComponent_same + (v : InfinitePlace K) + (x : v.Completionˣ) : + IdeleGroup.infiniteComponent v + (infinitePlaceIdele v x) = x := by + change + ContinuousMulEquiv.piUnits + (ContinuousMulEquiv.piUnits.symm + (infinitePlaceValue v x)) v = x + rw [ContinuousMulEquiv.piUnits.apply_symm_apply] + exact infinitePlaceValue_same v x + +open scoped Classical in +/-- An archimedean one-place idele has component one at every other +archimedean place. -/ +theorem infinitePlaceIdele_infiniteComponent_of_ne + (v w : InfinitePlace K) + (x : v.Completionˣ) + (h : w ≠ v) : + IdeleGroup.infiniteComponent w + (infinitePlaceIdele v x) = 1 := by + change + ContinuousMulEquiv.piUnits + (ContinuousMulEquiv.piUnits.symm + (infinitePlaceValue v x)) w = 1 + rw [ContinuousMulEquiv.piUnits.apply_symm_apply] + exact infinitePlaceValue_of_ne v w x h + +open scoped Classical in +/-- An archimedean one-place idele has component one at every finite +place. -/ +theorem infinitePlaceIdele_finiteComponent + (v : InfinitePlace K) + (w : HeightOneSpectrum (𝓞 K)) + (x : v.Completionˣ) : + IdeleGroup.finiteComponent w + (infinitePlaceIdele v x) = 1 := by + rfl + +open scoped Classical in +/-- Insert one archimedean-place element and then pass to the idele +class group. -/ +def infinitePlaceIdeleClass + (v : InfinitePlace K) : + v.Completionˣ →* IdeleClassGroup K := + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K)).comp + (infinitePlaceIdele v) + +open scoped Classical in +/-- The dependent local value which is `x` at `v` and `1` elsewhere. -/ +def finitePlaceValue + (v : HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) + (w : HeightOneSpectrum (𝓞 K)) : + (w.adicCompletion K)ˣ := + if h : w = v then h.symm ▸ x else 1 + +open scoped Classical in +@[simp] +private theorem finitePlaceValue_same + (v : HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) : + finitePlaceValue v x v = x := by + simp [finitePlaceValue] + +open scoped Classical in +@[simp] +private theorem finitePlaceValue_of_ne + (v w : HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) + (h : w ≠ v) : + finitePlaceValue v x w = 1 := by + simp [finitePlaceValue, h] + +open scoped Classical in +/-- The idele whose `v`-component is prescribed and whose other +components are `1`. -/ +def finitePlaceIdele + (v : HeightOneSpectrum (𝓞 K)) : + (v.adicCompletion K)ˣ →* IdeleGroup K where + toFun x := + (1, + ⟨finitePlaceValue v x, by + have hAway : + ∀ᶠ w : HeightOneSpectrum (𝓞 K) in Filter.cofinite, + w ≠ v := by + rw [Filter.eventually_cofinite] + simp + filter_upwards [hAway] with w hw + rw [finitePlaceValue_of_ne v w x hw] + exact Subgroup.one_mem _⟩) + map_one' := by + apply Prod.ext + · rfl + · apply RestrictedProduct.ext + intro w + change finitePlaceValue v 1 w = (1 : (w.adicCompletion K)ˣ) + by_cases hw : w = v + · subst w + simp + · simp [finitePlaceValue_of_ne v w 1 hw] + map_mul' x y := by + apply Prod.ext + · simp + · apply RestrictedProduct.ext + intro w + change finitePlaceValue v (x * y) w = + finitePlaceValue v x w * finitePlaceValue v y w + by_cases hw : w = v + · subst w + simp + · simp [finitePlaceValue_of_ne v w x hw, + finitePlaceValue_of_ne v w y hw, + finitePlaceValue_of_ne v w (x * y) hw] + +open scoped Classical in +/-- A finite-place idele recovers its prescribed component at the +supporting place. -/ +theorem finitePlaceIdele_finiteComponent_same + (v : HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) : + IdeleGroup.finiteComponent v + (finitePlaceIdele v x) = x := + finitePlaceValue_same v x + +open scoped Classical in +/-- A finite-place idele has component one at every other finite place. -/ +theorem finitePlaceIdele_finiteComponent_of_ne + (v w : HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) + (h : w ≠ v) : + IdeleGroup.finiteComponent w + (finitePlaceIdele v x) = 1 := + finitePlaceValue_of_ne v w x h + +open scoped Classical in +/-- A finite-place idele has component one at every infinite place. -/ +theorem finitePlaceIdele_infiniteComponent + (v : HeightOneSpectrum (𝓞 K)) + (w : InfinitePlace K) + (x : (v.adicCompletion K)ˣ) : + IdeleGroup.infiniteComponent w + (finitePlaceIdele v x) = 1 := by + rfl + +open scoped Classical in +/-- Insert one finite-place element and then pass to the idele class +group. -/ +def finitePlaceIdeleClass + (v : HeightOneSpectrum (𝓞 K)) : + (v.adicCompletion K)ˣ →* IdeleClassGroup K := + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K)).comp + (finitePlaceIdele v) + +end IdeleGroup + +namespace RelativeIdeleGroup + +section Relative + +variable + {K : Type*} [Field K] [NumberField K] + {L : Type*} [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +open scoped Classical in +/-- The dependent archimedean tensor value which is `z` at `v` and +`1` elsewhere. -/ +def relativeInfinitePlaceValue + (v : InfinitePlace K) + (z : (v.Completion ⊗[K] L)ˣ) + (w : InfinitePlace K) : + (w.Completion ⊗[K] L)ˣ := + if h : w = v then h.symm ▸ z else 1 + +omit [NumberField K] [NumberField L] [FiniteDimensional K L] in +open scoped Classical in +@[simp] +private theorem relativeInfinitePlaceValue_same + (v : InfinitePlace K) + (z : (v.Completion ⊗[K] L)ˣ) : + relativeInfinitePlaceValue (L := L) v z v = z := by + simp [relativeInfinitePlaceValue] + +omit [NumberField K] [NumberField L] [FiniteDimensional K L] in +open scoped Classical in +@[simp] +private theorem relativeInfinitePlaceValue_of_ne + (v w : InfinitePlace K) + (z : (v.Completion ⊗[K] L)ˣ) + (h : w ≠ v) : + relativeInfinitePlaceValue (L := L) v z w = 1 := by + simp [relativeInfinitePlaceValue, h] + +open scoped Classical in +/-- Restricted local tensor data supported at one archimedean place. -/ +noncomputable def relativeInfinitePlaceData + (v : InfinitePlace K) + (z : (v.Completion ⊗[K] L)ˣ) : + RelativeLocalIdeleData (K := K) (L := L) where + infinite w := relativeInfinitePlaceValue (L := L) v z w + finite _ := 1 + eventually_integral i := by + have hBase := + (relativeIdeleToLocalData + (K := K) (L := L) + (1 : RelativeIdeleGroup K L)).eventually_integral i + filter_upwards [hBase] with w hw + have hOne : + (relativeIdeleToLocalData + (K := K) (L := L) + (1 : RelativeIdeleGroup K L)).finite w = 1 := by + change + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w + (1 : RelativeIdeleGroup K L) = 1 + exact map_one _ + rw [hOne] at hw + exact hw + eventually_inverse_integral i := by + have hBase := + (relativeIdeleToLocalData + (K := K) (L := L) + (1 : RelativeIdeleGroup K L)).eventually_inverse_integral i + filter_upwards [hBase] with w hw + have hOne : + (relativeIdeleToLocalData + (K := K) (L := L) + (1 : RelativeIdeleGroup K L)).finite w = 1 := by + change + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w + (1 : RelativeIdeleGroup K L) = 1 + exact map_one _ + rw [hOne] at hw + exact hw + +open scoped Classical in +/-- A relative idele supported at the single archimedean place `v`. -/ +def relativeInfinitePlaceIdele + (v : InfinitePlace K) + (z : (v.Completion ⊗[K] L)ˣ) : + RelativeIdeleGroup K L := + relativeIdeleOfLocalData + (K := K) (L := L) + (relativeInfinitePlaceData (K := K) (L := L) v z) + +omit [NumberField L] in +open scoped Classical in +/-- A relative archimedean one-place idele recovers its prescribed +tensor component at the supporting place. -/ +@[simp] +theorem relativeInfinitePlaceIdele_infiniteComponent_same + (v : InfinitePlace K) + (z : (v.Completion ⊗[K] L)ˣ) : + RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) v + (relativeInfinitePlaceIdele (K := K) (L := L) v z) = + z := by + rw [relativeInfinitePlaceIdele, + relativeIdeleOfLocalData_infiniteComponent] + exact relativeInfinitePlaceValue_same (L := L) v z + +omit [NumberField L] in +open scoped Classical in +/-- A relative archimedean one-place idele has component one at every +other archimedean place. -/ +@[simp] +theorem relativeInfinitePlaceIdele_infiniteComponent_of_ne + (v w : InfinitePlace K) + (z : (v.Completion ⊗[K] L)ˣ) + (h : w ≠ v) : + RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) w + (relativeInfinitePlaceIdele (K := K) (L := L) v z) = + 1 := by + rw [relativeInfinitePlaceIdele, + relativeIdeleOfLocalData_infiniteComponent] + exact relativeInfinitePlaceValue_of_ne (L := L) v w z h + +omit [NumberField L] in +open scoped Classical in +/-- A relative archimedean one-place idele has component one at every +finite place. -/ +@[simp] +theorem relativeInfinitePlaceIdele_finiteComponent + (v : InfinitePlace K) + (w : HeightOneSpectrum (𝓞 K)) + (z : (v.Completion ⊗[K] L)ˣ) : + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w + (relativeInfinitePlaceIdele (K := K) (L := L) v z) = + 1 := by + rw [relativeInfinitePlaceIdele, + relativeIdeleOfLocalData_finiteComponent] + rfl + +open scoped Classical in +/-- The dependent local tensor value which is `z` at `v` and `1` +elsewhere. -/ +def relativeFinitePlaceValue + (v : HeightOneSpectrum (𝓞 K)) + (z : (v.adicCompletion K ⊗[K] L)ˣ) + (w : HeightOneSpectrum (𝓞 K)) : + (w.adicCompletion K ⊗[K] L)ˣ := + if h : w = v then h.symm ▸ z else 1 + +omit [NumberField L] [FiniteDimensional K L] in +open scoped Classical in +@[simp] +private theorem relativeFinitePlaceValue_same + (v : HeightOneSpectrum (𝓞 K)) + (z : (v.adicCompletion K ⊗[K] L)ˣ) : + relativeFinitePlaceValue (L := L) v z v = z := by + simp [relativeFinitePlaceValue] + +omit [NumberField L] [FiniteDimensional K L] in +open scoped Classical in +@[simp] +private theorem relativeFinitePlaceValue_of_ne + (v w : HeightOneSpectrum (𝓞 K)) + (z : (v.adicCompletion K ⊗[K] L)ˣ) + (h : w ≠ v) : + relativeFinitePlaceValue (L := L) v z w = 1 := by + simp [relativeFinitePlaceValue, h] + +open scoped Classical in +/-- Restricted local data supported at one finite place. -/ +noncomputable def relativeFinitePlaceData + (v : HeightOneSpectrum (𝓞 K)) + (z : (v.adicCompletion K ⊗[K] L)ˣ) : + RelativeLocalIdeleData (K := K) (L := L) where + infinite _ := 1 + finite w := relativeFinitePlaceValue (L := L) v z w + eventually_integral i := by + have hBase := + (relativeIdeleToLocalData + (K := K) (L := L) + (1 : RelativeIdeleGroup K L)).eventually_integral i + have hAway : + ∀ᶠ w : HeightOneSpectrum (𝓞 K) in Filter.cofinite, + w ≠ v := by + rw [Filter.eventually_cofinite] + simp + filter_upwards [hBase, hAway] with w hw hne + have hOne : + (relativeIdeleToLocalData + (K := K) (L := L) + (1 : RelativeIdeleGroup K L)).finite w = 1 := by + change + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w + (1 : RelativeIdeleGroup K L) = 1 + exact map_one _ + rw [hOne] at hw + simpa [relativeFinitePlaceValue_of_ne + (L := L) v w z hne] using hw + eventually_inverse_integral i := by + have hBase := + (relativeIdeleToLocalData + (K := K) (L := L) + (1 : RelativeIdeleGroup K L)).eventually_inverse_integral i + have hAway : + ∀ᶠ w : HeightOneSpectrum (𝓞 K) in Filter.cofinite, + w ≠ v := by + rw [Filter.eventually_cofinite] + simp + filter_upwards [hBase, hAway] with w hw hne + have hOne : + (relativeIdeleToLocalData + (K := K) (L := L) + (1 : RelativeIdeleGroup K L)).finite w = 1 := by + change + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w + (1 : RelativeIdeleGroup K L) = 1 + exact map_one _ + rw [hOne] at hw + simpa [relativeFinitePlaceValue_of_ne + (L := L) v w z hne] using hw + +open scoped Classical in +/-- A relative idele supported at the single finite place `v`. -/ +def relativeFinitePlaceIdele + (v : HeightOneSpectrum (𝓞 K)) + (z : (v.adicCompletion K ⊗[K] L)ˣ) : + RelativeIdeleGroup K L := + relativeIdeleOfLocalData + (K := K) (L := L) + (relativeFinitePlaceData (K := K) (L := L) v z) + +omit [NumberField L] in +open scoped Classical in +/-- A relative finite-place idele recovers its prescribed tensor component +at the supporting place. -/ +@[simp] +theorem relativeFinitePlaceIdele_finiteComponent_same + (v : HeightOneSpectrum (𝓞 K)) + (z : (v.adicCompletion K ⊗[K] L)ˣ) : + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) v + (relativeFinitePlaceIdele (K := K) (L := L) v z) = + z := by + rw [relativeFinitePlaceIdele, + relativeIdeleOfLocalData_finiteComponent] + exact relativeFinitePlaceValue_same (L := L) v z + +omit [NumberField L] in +open scoped Classical in +/-- A relative finite-place idele has component one at every other finite +place. -/ +@[simp] +theorem relativeFinitePlaceIdele_finiteComponent_of_ne + (v w : HeightOneSpectrum (𝓞 K)) + (z : (v.adicCompletion K ⊗[K] L)ˣ) + (h : w ≠ v) : + RelativeIdeleGroup.finiteComponent + (K := K) (L := L) w + (relativeFinitePlaceIdele (K := K) (L := L) v z) = + 1 := by + rw [relativeFinitePlaceIdele, + relativeIdeleOfLocalData_finiteComponent] + exact relativeFinitePlaceValue_of_ne (L := L) v w z h + +omit [NumberField L] in +open scoped Classical in +/-- A relative finite-place idele has component one at every infinite +place. -/ +@[simp] +theorem relativeFinitePlaceIdele_infiniteComponent + (v : HeightOneSpectrum (𝓞 K)) + (w : InfinitePlace K) + (z : (v.adicCompletion K ⊗[K] L)ˣ) : + RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) w + (relativeFinitePlaceIdele (K := K) (L := L) v z) = + 1 := by + rw [relativeFinitePlaceIdele, + relativeIdeleOfLocalData_infiniteComponent] + rfl + +end Relative + +end RelativeIdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SufficientlyLarge.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SufficientlyLarge.lean new file mode 100644 index 0000000000..496f9d484e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SufficientlyLarge.lean @@ -0,0 +1,147 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces +public import Mathlib.NumberTheory.NumberField.ClassNumber +/-! +# A sufficiently large finite set of places + +Finiteness of the ordinary ideal +class group lets us choose one idele representing each ideal class. The +union of the (finite) supports of those representatives is a finite set +`S` for which + +`I_K = I_K^S Kˣ`. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + + +variable {K : Type*} [Field K] [NumberField K] + +namespace IdeleGroup + +/-- A chosen idele representing an ordinary ideal class. -/ +def classRepresentative (c : ClassGroup (𝓞 K)) : + IdeleGroup K := + Classical.choose (idealClass_surjective (K := K) c) + +@[simp] +private theorem idealClass_classRepresentative + (c : ClassGroup (𝓞 K)) : + idealClass (classRepresentative (K := K) c) = c := + Classical.choose_spec (idealClass_surjective (K := K) c) + +/-- A finite set outside which the chosen representative of `c` is +integral. -/ +def classRepresentativeSupport (c : ClassGroup (𝓞 K)) : + Finset (HeightOneSpectrum (𝓞 K)) := + Classical.choose + (exists_finset_supportedAt + (classRepresentative (K := K) c)) + +private theorem classRepresentative_mem_support + (c : ClassGroup (𝓞 K)) : + classRepresentative (K := K) c ∈ + supportedAt (K := K) + (classRepresentativeSupport (K := K) c : Set _) := + Classical.choose_spec + (exists_finset_supportedAt + (classRepresentative (K := K) c)) + +/-- The union of the supports of one representative of every ordinary +ideal class. It is finite because the ideal class group is finite. -/ +def sufficientlyLargeFiniteSet : + Finset (HeightOneSpectrum (𝓞 K)) := by + classical + exact Finset.univ.biUnion (classRepresentativeSupport (K := K)) + +private theorem classRepresentative_mem_sufficientlyLarge + (c : ClassGroup (𝓞 K)) : + classRepresentative (K := K) c ∈ + supportedAt (K := K) + (sufficientlyLargeFiniteSet (K := K) : Set _) := by + classical + apply supportedAt_mono + (S := (classRepresentativeSupport (K := K) c : Set _)) + · intro v hv + exact Finset.mem_biUnion.mpr + ⟨c, Finset.mem_univ c, hv⟩ + · exact classRepresentative_mem_support (K := K) c + +/-- The ideles supported at `sufficientlyLargeFiniteSet` already map +surjectively to the ordinary ideal class group. -/ +theorem idealClass_surjective_on_sufficientlyLarge : + ∀ c : ClassGroup (𝓞 K), + ∃ a ∈ supportedAt (K := K) + (sufficientlyLargeFiniteSet (K := K) : Set _), + idealClass a = c := by + intro c + exact ⟨classRepresentative (K := K) c, + classRepresentative_mem_sufficientlyLarge (K := K) c, + idealClass_classRepresentative (K := K) c⟩ + +/-- For a sufficiently large finite set `S` of +finite places, every idele is the product of an idele integral away from +`S` and a principal idele. -/ +theorem supportedAt_sup_principalSubgroup_eq_top : + supportedAt (K := K) + (sufficientlyLargeFiniteSet (K := K) : Set _) ⊔ + principalSubgroup K = ⊤ := by + let S : Set (HeightOneSpectrum (𝓞 K)) := + (sufficientlyLargeFiniteSet (K := K) : Set _) + have hintegral : + integralAtFinitePlaces (K := K) ≤ supportedAt (K := K) S := by + rw [← supportedAt_empty (K := K)] + exact supportedAt_mono (K := K) (Set.empty_subset S) + have hkernel : + (idealClass (K := K)).ker ≤ + supportedAt (K := K) S ⊔ principalSubgroup K := by + rw [← ordinaryIdealClassSubgroup_eq_ker (K := K)] + exact sup_le + (hintegral.trans le_sup_left) + le_sup_right + apply top_unique + intro a _ + obtain ⟨r, hrS, hr⟩ := + idealClass_surjective_on_sufficientlyLarge + (K := K) (idealClass a) + have hquot : a * r⁻¹ ∈ (idealClass (K := K)).ker := by + rw [MonoidHom.mem_ker, map_mul, map_inv, hr] + simp + have hquot' : + a * r⁻¹ ∈ supportedAt (K := K) S ⊔ principalSubgroup K := + hkernel hquot + have hr' : + r ∈ supportedAt (K := K) S ⊔ principalSubgroup K := + Subgroup.mem_sup_left hrS + convert Subgroup.mul_mem _ hquot' hr' using 1 + group + +/-- Existential form of the sufficiently-large support theorem. -/ +theorem exists_finset_supportedAt_sup_principalSubgroup_eq_top : + ∃ S : Finset (HeightOneSpectrum (𝓞 K)), + supportedAt (K := K) (S : Set _) ⊔ principalSubgroup K = ⊤ := + ⟨sufficientlyLargeFiniteSet (K := K), + supportedAt_sup_principalSubgroup_eq_top (K := K)⟩ + +end IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Topology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Topology.lean new file mode 100644 index 0000000000..5349bf41ed --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Topology.lean @@ -0,0 +1,101 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Basic +/-! +# The idele topology + +The idele group `I_K` carries the restricted-product topology. This file records +the topological-group structure and the continuity of every local +component map. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + + +variable (K : Type*) [Field K] [NumberField K] + +/-- The local integral-unit subgroup is open in the multiplicative group of a +finite completion. -/ +theorem isOpen_finiteLocalUnits (v : HeightOneSpectrum (𝓞 K)) : + IsOpen + ((v.adicCompletionIntegers K).units : + Set (v.adicCompletion K)ˣ) := + Submonoid.isOpen_units (Valued.isOpen_valuationSubring _) + +instance finiteLocalUnitsOpen : + Fact (∀ v : HeightOneSpectrum (𝓞 K), + IsOpen + ((v.adicCompletionIntegers K).units : + Set (v.adicCompletion K)ˣ)) := + ⟨isOpen_finiteLocalUnits K⟩ + +instance finiteIdeleGroupIsTopologicalGroup : + IsTopologicalGroup (FiniteIdeleGroup K) := + inferInstance + +instance ideleGroupIsTopologicalGroup : + IsTopologicalGroup (IdeleGroup K) := + inferInstance + +instance finiteIdeleGroupT2Space : + T2Space (FiniteIdeleGroup K) := + inferInstance + +instance infiniteAdeleRingT2Space : + T2Space (NumberField.InfiniteAdeleRing K) := by + change T2Space ((v : InfinitePlace K) → v.Completion) + infer_instance + +instance infiniteIdeleGroupT2Space : + T2Space (InfiniteIdeleGroup K) := + inferInstance + +instance ideleGroupT2Space : + T2Space (IdeleGroup K) := + inferInstance + +namespace IdeleGroup + +variable {K} + +/-- Evaluation at an archimedean place is a continuous homomorphism. -/ +def infiniteComponentContinuous (v : InfinitePlace K) : + IdeleGroup K →ₜ* v.Completionˣ where + __ := infiniteComponent v + continuous_toFun := + (continuous_apply v).comp + (ContinuousMulEquiv.piUnits.continuous.comp continuous_fst) + +/-- Evaluation at a finite place is a continuous homomorphism. -/ +def finiteComponentContinuous (v : HeightOneSpectrum (𝓞 K)) : + IdeleGroup K →ₜ* (v.adicCompletion K)ˣ where + __ := finiteComponent v + continuous_toFun := + (RestrictedProduct.continuous_eval v).comp continuous_snd + +@[simp] +theorem infiniteComponentContinuous_apply + (a : IdeleGroup K) (v : InfinitePlace K) : + infiniteComponentContinuous v a = + ContinuousMulEquiv.piUnits a.1 v := + rfl + +@[simp] +theorem finiteComponentContinuous_apply + (a : IdeleGroup K) (v : HeightOneSpectrum (𝓞 K)) : + finiteComponentContinuous v a = a.2 v := + rfl + +end IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NormalClosure.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NormalClosure.lean new file mode 100644 index 0000000000..8764af78ce --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NormalClosure.lean @@ -0,0 +1,145 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import Mathlib.FieldTheory.Normal.Closure +public import Mathlib.NumberTheory.NumberField.Basic +/-! +# A finite normal closure of a number-field extension + +This file places the normal-closure construction used throughout the +global theory below the adelic and splitting developments that consume +it. The closure is formed inside mathlib's fixed algebraic closure, and +the original field is embedded by the canonical chosen lift. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +variable + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + +/-- The normal closure of `L / K`, constructed inside a fixed +algebraic closure of `K`. -/ +abbrev finiteNormalClosure := + IntermediateField.normalClosure K L (AlgebraicClosure K) + +noncomputable instance finiteNormalClosure_numberField : + NumberField (finiteNormalClosure K L) := + NumberField.of_module_finite K (finiteNormalClosure K L) + +noncomputable instance finiteNormalClosure_isGalois : + IsGalois K (finiteNormalClosure K L) := by + let f : L →ₐ[K] AlgebraicClosure K := + IsAlgClosed.lift + let : Algebra L (AlgebraicClosure K) := + f.toRingHom.toAlgebra + let : IsScalarTower K L (AlgebraicClosure K) := + IsScalarTower.of_algebraMap_eq' + f.comp_algebraMap.symm + infer_instance + +/-- A fixed embedding of `L` into its normal closure. -/ +noncomputable def finiteNormalClosureEmbedding : + L →ₐ[K] finiteNormalClosure K L := + let f : L →ₐ[K] AlgebraicClosure K := IsAlgClosed.lift + f.codRestrict + (IntermediateField.normalClosure K L + (AlgebraicClosure K)).toSubalgebra + (fun x => + f.fieldRange_le_normalClosure + (show f x ∈ f.fieldRange from ⟨x, rfl⟩)) + +/-- The distinguished copy of `L` in its finite normal closure. -/ +noncomputable def finiteNormalClosureOriginalField : + IntermediateField K (finiteNormalClosure K L) := + (finiteNormalClosureEmbedding K L).fieldRange + +/-- The original extension is canonically equivalent to its +distinguished copy in the finite normal closure. -/ +noncomputable def finiteNormalClosureOriginalFieldEquiv : + L ≃ₐ[K] finiteNormalClosureOriginalField K L := + (finiteNormalClosureEmbedding K L).equivFieldRange + +omit [NumberField K] [NumberField L] in +/-- Normal closure is invariant under replacing its source by an +isomorphic field. -/ +theorem normalClosure_eq_top_of_source_algEquiv + {M E : Type*} + [Field M] [Algebra K M] + [Field E] [Algebra K E] + (e : L ≃ₐ[K] E) + (hclosure : + IntermediateField.normalClosure K L M = ⊤) : + IntermediateField.normalClosure K E M = ⊤ := by + apply top_unique + rw [← hclosure] + apply + (normalClosure_le_iff + (K := L)).2 + intro f + let g : E →ₐ[K] M := + f.comp e.symm.toAlgHom + have hRange : + f.fieldRange = g.fieldRange := by + ext x + constructor + · rintro ⟨y, rfl⟩ + exact ⟨e y, by simp [g]⟩ + · rintro ⟨y, rfl⟩ + exact ⟨e.symm y, by simp [g]⟩ + rw [hRange] + exact g.fieldRange_le_normalClosure + +/-- The distinguished copy of `L` generates its finite normal closure +under its `K`-conjugates. -/ +theorem finiteNormalClosureOriginalField_normalClosure_eq_top : + IntermediateField.normalClosure K + (finiteNormalClosureOriginalField K L) + (finiteNormalClosure K L) = + ⊤ := by + let : Nonempty (L →ₐ[K] AlgebraicClosure K) := + ⟨IsAlgClosed.lift⟩ + have hAbstract : + IntermediateField.normalClosure K L + (finiteNormalClosure K L) = + ⊤ := + (Algebra.IsAlgebraic.isNormalClosure_iff.mp + (show IsNormalClosure K L + (finiteNormalClosure K L) from inferInstance)).2 + exact + normalClosure_eq_top_of_source_algEquiv + (K := K) (L := L) + (finiteNormalClosureOriginalFieldEquiv K L) + hAbstract + +/-- The degree of the original extension is bounded by the degree of +its finite normal closure. -/ +theorem finrank_le_finiteNormalClosure : + Module.finrank K L ≤ + Module.finrank K (finiteNormalClosure K L) := by + exact + (finiteNormalClosureEmbedding K L).toLinearMap + |>.finrank_le_finrank_of_injective + (finiteNormalClosureEmbedding K L).injective + +/-- A degree-one finite field extension is the base field as an +algebra. -/ +noncomputable def algEquivBaseOfFinrankEqOne + (hdegree : Module.finrank K L = 1) : + L ≃ₐ[K] K := + (AlgEquiv.ofBijective + (Algebra.ofId K L) + ((Algebra.finrank_eq_one_iff_bijective_algebraMap).mp + hdegree)).symm diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField.lean new file mode 100644 index 0000000000..826aa8bfc7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField.lean @@ -0,0 +1,28 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitFinset +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimesModFour +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.DegreeOnePrimes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.EverywhereUnramifiedTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedEtaleBridge +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.GaloisDifferentBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.IntegralPrimitiveElement +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.MathlibUnramifiedInterface +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.PlaceEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.RootDiscriminantBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SchurPrimeDivisors +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SmallModel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SupportedDiscriminantBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.TameDifferentTrace + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/All.lean new file mode 100644 index 0000000000..d55f552bf9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/All.lean @@ -0,0 +1,26 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimesModFour +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.DegreeOnePrimes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.IntegralPrimitiveElement +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.PlaceEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SchurPrimeDivisors +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.EverywhereUnramifiedTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedEtaleBridge +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.MathlibUnramifiedInterface +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitFinset +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.GaloisDifferentBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.RootDiscriminantBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SmallModel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SupportedDiscriminantBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.TameDifferentTrace +/-! # Finite and everywhere-unramified towers of number fields -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitFinset.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitFinset.lean new file mode 100644 index 0000000000..152e86e0ec --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitFinset.lean @@ -0,0 +1,90 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.GaloisAction +public import Mathlib.RingTheory.DedekindDomain.Ideal.Lemmas +public import Mathlib.RingTheory.Ideal.Maps +public import Mathlib.Data.Finset.Card +/-! +# A finite set of primes witnessing complete splitting + +The Galois orbit of the centre of one actual extended finite place is free +when the rational prime splits completely. Its prime ideals form a finite +set of cardinality equal to the number-field degree. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +namespace AlgebraicNumberTheory.PrimeSelection + +/-- A completely split rational prime gives exactly a field-degree-sized +finite set of distinct maximal ideals containing that rational prime. -/ +theorem exists_finset_maximalIdeals_of_finitePlaceSplitsCompletely + (F : Type) [Field F] [NumberField F] [IsGalois ℚ F] + (q : Nat.Primes) + (hsplit : FinitePlaceSplitsCompletely (K := ℚ) (L := F) + ((Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).symm q)) : + ∃ factors : Finset (Ideal (𝓞 F)), + factors.card = Module.finrank ℚ F ∧ + ∀ P ∈ factors, P.IsMaximal ∧ (q.val : 𝓞 F) ∈ P := by + classical + let v : HeightOneSpectrum (𝓞 ℚ) := + (Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).symm q + let w := chosenFinitePlaceExtension (L := F) v + let W : HeightOneSpectrum (𝓞 F) := + finitePlaceExtensionCentre (K := ℚ) (L := F) v w + let := finitePlaceMulAction ℚ F + have hStab : MulAction.stabilizer (F ≃ₐ[ℚ] F) W = ⊥ := + (finitePlaceSplitsCompletely_iff_centre_stabilizer_eq_bot + (K := ℚ) (L := F) v w).mp hsplit + have hOrbit : Function.Injective (fun σ : F ≃ₐ[ℚ] F => + finitePlaceEquiv ℚ F σ W) := by + intro σ τ h + change finitePlaceEquiv ℚ F σ W = finitePlaceEquiv ℚ F τ W at h + have hFix : σ⁻¹ * τ ∈ MulAction.stabilizer (F ≃ₐ[ℚ] F) W := by + change finitePlaceEquiv ℚ F (σ⁻¹ * τ) W = W + rw [finitePlaceEquiv_mul, h.symm, ← finitePlaceEquiv_mul] + simp + have hOne : σ⁻¹ * τ = 1 := by + simpa only [hStab, Subgroup.mem_bot] using hFix + exact inv_mul_eq_one.mp hOne + have hIdealOrbit : Function.Injective (fun σ : F ≃ₐ[ℚ] F => + (finitePlaceEquiv ℚ F σ W).asIdeal) := by + intro σ τ h + exact hOrbit (HeightOneSpectrum.ext h) + have hBelow : finitePlaceBelow (K := ℚ) W = v := + finitePlaceBelow_finitePlaceExtensionCentre v w + have hBase : (q.val : 𝓞 ℚ) ∈ v.asIdeal := by + rw [rationalPrimePlace_asIdeal q] + exact Ideal.subset_span (Set.mem_singleton _) + have hUnder : (q.val : 𝓞 ℚ) ∈ + (finitePlaceBelow (K := ℚ) W).asIdeal := by + simpa only [hBelow] using hBase + have hWq : (q.val : 𝓞 F) ∈ W.asIdeal := by + change algebraMap (𝓞 ℚ) (𝓞 F) (q.val : 𝓞 ℚ) ∈ W.asIdeal at hUnder + simpa only [map_natCast] using hUnder + let : Fintype (F ≃ₐ[ℚ] F) := Fintype.ofFinite _ + refine ⟨Finset.univ.image (fun σ : F ≃ₐ[ℚ] F => + (finitePlaceEquiv ℚ F σ W).asIdeal), ?_, ?_⟩ + · rw [Finset.card_image_of_injective _ hIdealOrbit, Finset.card_univ, + Fintype.card_eq_nat_card, IsGalois.card_aut_eq_finrank ℚ F] + · intro P hP + obtain ⟨σ, _, rfl⟩ := Finset.mem_image.mp hP + refine ⟨(finitePlaceEquiv ℚ F σ W).isMaximal, ?_⟩ + rw [finitePlaceEquiv_asIdeal] + simpa only [map_natCast] using + Ideal.mem_map_of_mem + (NumberField.RingOfIntegers.mapAlgEquiv σ).toRingEquiv hWq + +end AlgebraicNumberTheory.PrimeSelection diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitPrimes.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitPrimes.lean new file mode 100644 index 0000000000..6d61a644a6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitPrimes.lean @@ -0,0 +1,112 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.DegreeOnePrimes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic +public import Mathlib.FieldTheory.Galois.IsGaloisGroup +public import Mathlib.NumberTheory.Padics.HeightOneSpectrum +public import Mathlib.RingTheory.RamificationInertia.Ramification +public import Mathlib.Algebra.Group.Subgroup.Finite + +/-! # Completely Split Primes -/ + +@[expose] public section +open scoped NumberField Pointwise +open NumberField IsDedekindDomain HilbertRamification.Dedekind + +namespace AlgebraicNumberTheory.PrimeSelection + +/-- The canonical place of a rational prime is the principal prime ideal +in the actual ring of integers of ℚ. -/ +theorem rationalPrimePlace_asIdeal (q : Nat.Primes) : + ((Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).symm q).asIdeal = + Ideal.span ({(q.val : 𝓞 ℚ)} : Set (𝓞 ℚ)) := by + change (Ideal.span ({(q.val : ℤ)} : Set ℤ)).map + (Rat.IsIntegralClosure.intEquiv (𝓞 ℚ)).symm = _ + simp only [Ideal.map_span, Set.image_singleton, map_natCast] + +private theorem under_rational_prime_eq_span + (K : Type*) [Field K] [NumberField K] (q : ℕ) + (W : HeightOneSpectrum (𝓞 K)) + (hOver : W.asIdeal.LiesOver (Ideal.span ({(q : ℤ)} : Set ℤ))) : + W.asIdeal.under (𝓞 ℚ) = Ideal.span ({(q : 𝓞 ℚ)} : Set (𝓞 ℚ)) := by + have : W.asIdeal.LiesOver (Ideal.span ({(q : ℤ)} : Set ℤ)) := hOver + apply Ideal.comap_injective_of_surjective (algebraMap ℤ (𝓞 ℚ)) + (Rat.int_algebraMap_surjective (𝓞 ℚ)) + change (W.asIdeal.under (𝓞 ℚ)).under ℤ = + (Ideal.span ({(q : 𝓞 ℚ)} : Set (𝓞 ℚ))).under ℤ + rw [Ideal.under_under, ← Ideal.over_def W.asIdeal (Ideal.span ({(q : ℤ)} : Set ℤ))] + have hMap : (Ideal.span ({(q : ℤ)} : Set ℤ)).map (algebraMap ℤ (𝓞 ℚ)) = + Ideal.span ({(q : 𝓞 ℚ)} : Set (𝓞 ℚ)) := by + simp only [Ideal.map_span, Set.image_singleton, map_natCast] + rw [← hMap, Ideal.under_def, + Ideal.comap_map_of_surjective _ (Rat.int_algebraMap_surjective (𝓞 ℚ)), + Ideal.comap_bot_of_injective (f := algebraMap ℤ (𝓞 ℚ)) + (Rat.int_algebraMap_injective (𝓞 ℚ)), sup_bot_eq] + +/-- A prime above q in a number field lies above the canonical rational +finite place of q. -/ +theorem finitePlaceBelow_eq_rationalPrimePlace + (K : Type*) [Field K] [NumberField K] (q : Nat.Primes) + (W : HeightOneSpectrum (𝓞 K)) + (hOver : W.asIdeal.LiesOver (Ideal.span ({(q.val : ℤ)} : Set ℤ))) : + finitePlaceBelow (K := ℚ) W = + (Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).symm q := by + apply HeightOneSpectrum.ext + exact (under_rational_prime_eq_span K q.val W hOver).trans + (rationalPrimePlace_asIdeal q).symm + +/-- For a finite Galois number field, an unramified degree-one prime +has trivial decomposition group, hence gives complete splitting. -/ +theorem finitePlaceSplitsCompletely_of_unramified_degree_one + (K : Type) [Field K] [NumberField K] [IsGalois ℚ K] + (q : Nat.Primes) (W : HeightOneSpectrum (𝓞 K)) + (hOver : W.asIdeal.LiesOver (Ideal.span ({(q.val : ℤ)} : Set ℤ))) + (hf : W.asIdeal.inertiaDeg ℤ = 1) + (hU : Algebra.IsUnramifiedAt ℤ W.asIdeal) : + FinitePlaceSplitsCompletely (K := ℚ) (L := K) + ((Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).symm q) := by + have : Fact q.val.Prime := ⟨q.prop⟩ + have : W.asIdeal.LiesOver (Ideal.span ({(q.val : ℤ)} : Set ℤ)) := hOver + have : Algebra.IsUnramifiedAt ℤ W.asIdeal := hU + have hq0 : Ideal.span ({(q.val : ℤ)} : Set ℤ) ≠ ⊥ := by + exact mt Ideal.span_singleton_eq_bot.mp (Int.natCast_ne_zero.mpr q.prop.ne_zero) + have hCard : Nat.card (decompositionGroup W.asIdeal Gal(K/ℚ)) = 1 := by + rw [dedekindRamification_decomposition_card_eq_ramificationIdxIn_mul_inertiaDegIn + (Ideal.span ({(q.val : ℤ)} : Set ℤ)) hq0 W.asIdeal Gal(K/ℚ), + Ideal.ramificationIdxIn_eq_ramificationIdx + (Ideal.span ({(q.val : ℤ)} : Set ℤ)) W.asIdeal Gal(K/ℚ), + Ideal.inertiaDegIn_eq_inertiaDeg + (Ideal.span ({(q.val : ℤ)} : Set ℤ)) W.asIdeal Gal(K/ℚ), + Ideal.ramificationIdx_eq_one, hf, one_mul] + have hBot : decompositionGroup W.asIdeal Gal(K/ℚ) = ⊥ := + Subgroup.eq_bot_of_card_eq _ hCard + rw [finitePlaceSplitsCompletely_iff_stabilizer_eq_bot _ W + (finitePlaceBelow_eq_rationalPrimePlace K q W hOver)] + let := finitePlaceMulAction ℚ K + apply le_antisymm ?_ bot_le + intro σ hσ + have hFix : finitePlaceEquiv ℚ K σ W = W := hσ + have hIdeal := congrArg HeightOneSpectrum.asIdeal hFix + rw [finitePlaceEquiv_asIdeal] at hIdeal + have hmem : σ ∈ decompositionGroup W.asIdeal Gal(K/ℚ) := hIdeal + simpa only [hBot] using hmem + +/-- There is a completely split rational prime outside every finite set. -/ +theorem exists_completelySplitPrime_not_mem + (K : Type) [Field K] [NumberField K] [IsGalois ℚ K] (bad : Finset ℕ) : + ∃ q : Nat.Primes, q.val ∉ bad ∧ + FinitePlaceSplitsCompletely (K := ℚ) (L := K) + ((Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).symm q) := by + obtain ⟨q, hq, hqBad, W, hOver, hf, hU⟩ := + exists_unramified_degreeOnePrime_not_mem K bad + exact ⟨⟨q, hq⟩, hqBad, + finitePlaceSplitsCompletely_of_unramified_degree_one K ⟨q, hq⟩ W hOver hf hU⟩ + +end AlgebraicNumberTheory.PrimeSelection diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitPrimesModFour.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitPrimesModFour.lean new file mode 100644 index 0000000000..ef94b212a4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitPrimesModFour.lean @@ -0,0 +1,103 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.DegreeOnePrimes +public import Mathlib.FieldTheory.IsAlgClosed.AlgebraicClosure +public import Mathlib.FieldTheory.IntermediateField.Adjoin.Basic +public import Mathlib.NumberTheory.RamificationInertia.Unramified +public import Mathlib.NumberTheory.LegendreSymbol.Basic +public import Mathlib.LinearAlgebra.Dimension.FreeAndStrongRankCondition +public import Mathlib.RingTheory.RamificationInertia.Inertia +public import Mathlib.RingTheory.Ideal.Quotient.Operations +public import Mathlib.Data.Nat.ModEq + +/-! # Completely Split Primes Mod Four -/ + +@[expose] public section +open scoped NumberField +open NumberField IsDedekindDomain + +namespace AlgebraicNumberTheory.PrimeSelection + +/-- At an odd degree-one prime in a field containing i, reduction of i +makes -1 a square in the prime field, forcing q ≡ 1 mod 4. -/ +theorem modFour_eq_one_of_degreeOnePrime_sq_neg_one + (K : Type*) [Field K] [NumberField K] + (q : ℕ) [Fact q.Prime] (hqTwo : q ≠ 2) + (W : HeightOneSpectrum (𝓞 K)) + (hOver : W.asIdeal.LiesOver (Ideal.span ({(q : ℤ)} : Set ℤ))) + (hf : W.asIdeal.inertiaDeg ℤ = 1) + (j : 𝓞 K) (hj : j ^ 2 = -1) : q % 4 = 1 := by + let p : Ideal ℤ := Ideal.span ({(q : ℤ)} : Set ℤ) + have : W.asIdeal.LiesOver p := hOver + have : p.IsMaximal := Int.ideal_span_isMaximal_of_prime q + let : Field (ℤ ⧸ p) := Ideal.Quotient.field p + let : Field ((𝓞 K) ⧸ W.asIdeal) := Ideal.Quotient.field W.asIdeal + have hRank : Module.finrank (ℤ ⧸ p) ((𝓞 K) ⧸ W.asIdeal) = 1 := + (Ideal.inertiaDeg_eq_of_isMaximal p W.asIdeal).symm.trans hf + have hSurj : Function.Surjective + (algebraMap (ℤ ⧸ p) ((𝓞 K) ⧸ W.asIdeal)) := + (Algebra.finrank_eq_one_iff_bijective_algebraMap.mp hRank).2 + obtain ⟨a, ha⟩ := hSurj (Ideal.Quotient.mk W.asIdeal j) + have haSq : a ^ 2 = -1 := by + apply (algebraMap (ℤ ⧸ p) ((𝓞 K) ⧸ W.asIdeal)).injective + rw [map_pow, ha, ← map_pow, hj, map_neg, map_one, map_neg, map_one] + have hRoot : ((Int.quotientSpanNatEquivZMod q) a) ^ 2 = (-1 : ZMod q) := by + rw [← map_pow, haSq, map_neg, map_one] + have hNeThree : q % 4 ≠ 3 := ZMod.mod_four_ne_three_of_sq_eq_neg_one hRoot + have hOdd : q % 2 = 1 := Nat.odd_iff.mp ((Fact.out : q.Prime).odd_of_ne_two hqTwo) + exact (Nat.odd_mod_four_iff.mp hOdd).resolve_right hNeThree + +/-- Prime selection with complete splitting, the congruence q ≡ 1 mod 4, +and avoidance of an arbitrary finite set. The proof applies the elementary +polynomial prime-divisor argument to K(i), then contracts its degree-one +unramified prime to K. -/ +theorem exists_completelySplitPrime_modFour_one_not_mem + (K : Type) [Field K] [NumberField K] [IsGalois ℚ K] (bad : Finset ℕ) : + ∃ q : Nat.Primes, q.val ∉ bad ∧ q.val % 4 = 1 ∧ + FinitePlaceSplitsCompletely (K := ℚ) (L := K) + ((Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).symm q) := by + classical + obtain ⟨a, ha⟩ := IsAlgClosed.exists_pow_nat_eq + (-1 : AlgebraicClosure K) (by decide : 0 < 2) + have haInt : IsIntegral K a := IsIntegral.of_pow (by decide : 0 < 2) (by + rw [ha] + exact isIntegral_one.neg) + let L := IntermediateField.adjoin K ({a} : Set (AlgebraicClosure K)) + have : FiniteDimensional K L := IntermediateField.adjoin.finiteDimensional haInt + have : NumberField L := NumberField.of_module_finite K L + let j : L := ⟨a, IntermediateField.mem_adjoin_simple_self K a⟩ + have hj : j ^ 2 = -1 := Subtype.ext ha + have hjInt : IsIntegral ℤ j := IsIntegral.of_pow (by decide : 0 < 2) (by + rw [hj] + exact isIntegral_one.neg) + let jO : 𝓞 L := ⟨j, hjInt⟩ + have hjO : jO ^ 2 = -1 := NumberField.RingOfIntegers.ext hj + obtain ⟨q, hq, hqBad, W, hOver, hf, hU⟩ := + exists_unramified_degreeOnePrime_not_mem L (insert 2 bad) + have : Fact q.Prime := ⟨hq⟩ + have hqTwo : q ≠ 2 := fun h => hqBad (h ▸ Finset.mem_insert_self _ _) + have hqFour : q % 4 = 1 := + modFour_eq_one_of_degreeOnePrime_sq_neg_one L q hqTwo W hOver hf jO hjO + let V : HeightOneSpectrum (𝓞 K) := finitePlaceBelow (K := K) W + have : W.asIdeal.LiesOver V.asIdeal := ⟨rfl⟩ + have : W.asIdeal.LiesOver (Ideal.span ({(q : ℤ)} : Set ℤ)) := hOver + have hVOver : V.asIdeal.LiesOver (Ideal.span ({(q : ℤ)} : Set ℤ)) := + Ideal.LiesOver.tower_bot W.asIdeal V.asIdeal (Ideal.span ({(q : ℤ)} : Set ℤ)) + have hVf : V.asIdeal.inertiaDeg ℤ = 1 := by + apply Nat.dvd_one.mp + rw [← hf] + exact Ideal.inertiaDeg_below_dvd (R := ℤ) V.asIdeal W.asIdeal + have : Algebra.IsUnramifiedAt ℤ W.asIdeal := hU + have hVU : Algebra.IsUnramifiedAt ℤ V.asIdeal := + Algebra.IsUnramifiedAt.of_liesOver ℤ V.asIdeal W.asIdeal + exact ⟨⟨q, hq⟩, (fun h => hqBad (Finset.mem_insert_of_mem h)), hqFour, + finitePlaceSplitsCompletely_of_unramified_degree_one K ⟨q, hq⟩ V hVOver hVf hVU⟩ + +end AlgebraicNumberTheory.PrimeSelection diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/DegreeOnePrimes.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/DegreeOnePrimes.lean new file mode 100644 index 0000000000..ee3f117318 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/DegreeOnePrimes.lean @@ -0,0 +1,99 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SchurPrimeDivisors +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.IntegralPrimitiveElement +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes +public import Mathlib.NumberTheory.NumberField.Ideal.KummerDedekind +public import Mathlib.NumberTheory.Divisors +public import Mathlib.Data.ZMod.Basic + +/-! # Degree One Primes -/ + +@[expose] public section +open scoped NumberField +open NumberField IsDedekindDomain Polynomial + +namespace AlgebraicNumberTheory.PrimeSelection + +/-- A good prime divisor of a primitive polynomial value gives an actual +prime ideal whose residue degree is one. -/ +theorem exists_degreeOnePrime_of_dvd_minpoly_eval + (K : Type*) [Field K] [NumberField K] + (θ : 𝓞 K) (q : ℕ) [Fact q.Prime] + (hGood : ¬ q ∣ RingOfIntegers.exponent θ) + (n : ℤ) (hn : (q : ℤ) ∣ (minpoly ℤ θ).eval n) : + ∃ P : Ideal (𝓞 K), P.IsPrime ∧ + P.LiesOver (Ideal.span ({(q : ℤ)} : Set ℤ)) ∧ + P.inertiaDeg ℤ = 1 := by + classical + let f : (ZMod q)[X] := (minpoly ℤ θ).map (Int.castRingHom (ZMod q)) + have hf : f ≠ 0 := Polynomial.map_monic_ne_zero (minpoly.monic θ.isIntegral) + have hn0 : f.eval (n : ZMod q) = 0 := by + dsimp only [f] + rw [Polynomial.eval_map] + change (minpoly ℤ θ).eval₂ (Int.castRingHom (ZMod q)) + ((Int.castRingHom (ZMod q)) n) = 0 + rw [Polynomial.eval₂_at_apply] + exact (ZMod.intCast_zmod_eq_zero_iff_dvd _ _).mpr hn + have hFactor : X - C (n : ZMod q) ∈ RingOfIntegers.monicFactorsMod θ q := by + change X - C (n : ZMod q) ∈ (UniqueFactorizationMonoid.normalizedFactors f).toFinset + rw [Multiset.mem_toFinset, Polynomial.mem_normalizedFactors_iff hf] + exact ⟨Polynomial.irreducible_X_sub_C _, Polynomial.monic_X_sub_C _, + Polynomial.dvd_iff_isRoot.mpr hn0⟩ + let P := (NumberField.Ideal.primesOverSpanEquivMonicFactorsMod hGood).symm + ⟨X - C (n : ZMod q), hFactor⟩ + refine ⟨P, P.prop.1, P.prop.2, ?_⟩ + simpa only [Polynomial.natDegree_X_sub_C] using + NumberField.Ideal.inertiaDeg_primesOverSpanEquivMonicFactorsMod_symm_apply' + hGood hFactor + +/-- Every number field has an unramified prime of residue degree one above a +new rational prime, outside an arbitrary finite set. -/ +theorem exists_unramified_degreeOnePrime_not_mem + (K : Type*) [Field K] [NumberField K] (bad : Finset ℕ) : + ∃ q : ℕ, q.Prime ∧ q ∉ bad ∧ + ∃ W : HeightOneSpectrum (𝓞 K), + W.asIdeal.LiesOver (Ideal.span ({(q : ℤ)} : Set ℤ)) ∧ + W.asIdeal.inertiaDeg ℤ = 1 ∧ Algebra.IsUnramifiedAt ℤ W.asIdeal := by + classical + obtain ⟨θ, hθ⟩ := exists_integral_primitive_element K + have hExp : RingOfIntegers.exponent θ ≠ 0 := integralPrimitive_exponent_ne_zero K θ hθ + let : Algebra (FractionRing ℤ) (FractionRing (𝓞 K)) := + FractionRing.liftAlgebra ℤ (FractionRing (𝓞 K)) + have hRam := AlgebraicNumberTheory.Ramification.finite_ramified_heightOne_primes ℤ (𝓞 K) + have hRamFinite := hRam.image + (fun W : HeightOneSpectrum (𝓞 K) => Ideal.absNorm (W.asIdeal.under ℤ)) + let ram : Finset ℕ := hRamFinite.toFinset + obtain ⟨q, hq, hqBad, n, _, hqn⟩ := exists_prime_not_mem_dvd_eval + (minpoly ℤ θ) (minpoly.natDegree_pos θ.isIntegral).ne' + (bad ∪ (RingOfIntegers.exponent θ).divisors ∪ ram) + have : Fact q.Prime := ⟨hq⟩ + have hGood : ¬ q ∣ RingOfIntegers.exponent θ := by + intro hdiv + apply hqBad + exact Finset.mem_union_left _ (Finset.mem_union_right _ (Nat.mem_divisors.mpr ⟨hdiv, hExp⟩)) + obtain ⟨P, hP, hOver, hf⟩ := exists_degreeOnePrime_of_dvd_minpoly_eval K θ q hGood n hqn + have : P.IsPrime := hP + have : P.LiesOver (Ideal.span ({(q : ℤ)} : Set ℤ)) := hOver + have : (Ideal.span ({(q : ℤ)} : Set ℤ)).IsMaximal := Int.ideal_span_isMaximal_of_prime q + have : P.IsMaximal := Ideal.IsMaximal.of_liesOver_isMaximal P (Ideal.span ({(q : ℤ)} : Set ℤ)) + let W : HeightOneSpectrum (𝓞 K) := ⟨P, hP, NeZero.ne P⟩ + refine ⟨q, hq, ?_, W, hOver, hf, ?_⟩ + · intro hqb + exact hqBad (Finset.mem_union_left _ (Finset.mem_union_left _ hqb)) + · by_contra hU + apply hqBad + apply Finset.mem_union_right + apply hRamFinite.mem_toFinset.mpr + refine ⟨W, hU, ?_⟩ + change Ideal.absNorm (P.under ℤ) = q + rw [← Ideal.over_def P (Ideal.span ({(q : ℤ)} : Set ℤ)), + Ideal.absNorm_span_natCast, Module.finrank_self, pow_one] + +end AlgebraicNumberTheory.PrimeSelection diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/EverywhereUnramifiedTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/EverywhereUnramifiedTower.lean new file mode 100644 index 0000000000..fe8f81065a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/EverywhereUnramifiedTower.lean @@ -0,0 +1,98 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedTower +public import Mathlib.NumberTheory.NumberField.InfinitePlace.Ramification +/-! +# Everywhere-unramified towers of number fields + +This file combines finite-prime and infinite-place unramifiedness and +records its tower and intermediate-field properties. +-/ + +@[expose] public section + +open scoped NumberField + +universe u v w + +/-- A number-field extension is everywhere unramified when it is +unramified at every finite prime and at every infinite place. -/ +structure IsEverywhereUnramified + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] : Prop where + /-- The extension is unramified at every finite prime. -/ + finitePlaces : IsUnramifiedAtFinitePlaces K L + /-- The extension is unramified at every infinite place. -/ + infinitePlaces : IsUnramifiedAtInfinitePlaces K L + +namespace IsEverywhereUnramified + +/-- The identity extension is everywhere unramified. -/ +theorem refl + (K : Type u) [Field K] [NumberField K] : + IsEverywhereUnramified K K where + finitePlaces := + IsUnramifiedAtFinitePlaces.refl K + infinitePlaces := + inferInstance + +variable + {k : Type u} {K : Type v} {F : Type w} + [Field k] [NumberField k] + [Field K] [NumberField K] + [Field F] [NumberField F] + [Algebra k K] [Algebra k F] [Algebra K F] + [IsScalarTower k K F] + +/-- Everywhere-unramified extensions are transitive in towers. -/ +theorem trans + (hkK : IsEverywhereUnramified k K) + (hKF : IsEverywhereUnramified K F) : + IsEverywhereUnramified k F where + finitePlaces := + IsUnramifiedAtFinitePlaces.trans + hkK.finitePlaces hKF.finitePlaces + infinitePlaces := by + let : IsUnramifiedAtInfinitePlaces k K := + hkK.infinitePlaces + let : IsUnramifiedAtInfinitePlaces K F := + hKF.infinitePlaces + exact + IsUnramifiedAtInfinitePlaces.trans k K F + +/-- If the top of a number-field tower is everywhere unramified over +the bottom, then it is everywhere unramified over the intermediate +field. -/ +theorem top + (hkF : IsEverywhereUnramified k F) : + IsEverywhereUnramified K F where + finitePlaces := + IsUnramifiedAtFinitePlaces.top hkF.finitePlaces + infinitePlaces := by + let : IsUnramifiedAtInfinitePlaces k F := + hkF.infinitePlaces + exact + IsUnramifiedAtInfinitePlaces.top k K F + +/-- If the top of a number-field tower is everywhere unramified over +the bottom, then the intermediate field is everywhere unramified over +the bottom. -/ +theorem bot + (hkF : IsEverywhereUnramified k F) : + IsEverywhereUnramified k K where + finitePlaces := + IsUnramifiedAtFinitePlaces.bot hkF.finitePlaces + infinitePlaces := by + let : IsUnramifiedAtInfinitePlaces k F := + hkF.infinitePlaces + exact + IsUnramifiedAtInfinitePlaces.bot k K F + +end IsEverywhereUnramified diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedEtaleBridge.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedEtaleBridge.lean new file mode 100644 index 0000000000..1093b89678 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedEtaleBridge.lean @@ -0,0 +1,87 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedTower +public import Mathlib.RingTheory.Etale.Basic +/-! +# Finite-place unramifiedness bridges for number fields + +This file transports finite-place unramifiedness across an equivalence of top +fields and connects the number-theoretic predicate to the commutative-algebra +notions of formal unramifiedness and étaleness for rings of integers. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +universe u v w + +namespace ClassFieldTower.Martinet + +/-- Finite-place unramifiedness is preserved when the top number field is +replaced by an equivalent algebra over the base field. -/ +theorem finitePlaceUnramifiedness_congrTop + {K : Type u} {L : Type v} {M : Type w} + [Field K] [NumberField K] + [Field L] [NumberField L] + [Field M] [NumberField M] + [Algebra K L] [Algebra K M] + (e : L ≃ₐ[K] M) + (h : IsUnramifiedAtFinitePlaces K L) : + IsUnramifiedAtFinitePlaces K M := by + let hAlgebra : Algebra L M := + e.toRingHom.toAlgebra + let _ := hAlgebra + let hScalarTower : IsScalarTower K L M := + IsScalarTower.of_algebraMap_eq' (by + apply RingHom.ext + intro x + exact (e.commutes x).symm) + let _ := hScalarTower + let eLM : L ≃ₐ[L] M := + AlgEquiv.ofRingEquiv (f := e.toRingEquiv) (fun _ => rfl) + let eOLM : (𝓞 L) ≃ₐ[𝓞 L] (𝓞 M) := + NumberField.RingOfIntegers.mapAlgEquiv eLM + let hFormallyUnramified : + Algebra.FormallyUnramified (𝓞 L) (𝓞 M) := + Algebra.FormallyUnramified.of_equiv eOLM + let _ := hFormallyUnramified + have hLM : IsUnramifiedAtFinitePlaces L M := by + intro P + infer_instance + exact IsUnramifiedAtFinitePlaces.trans h hLM + +/-- A formally unramified extension of rings of integers is unramified at +every finite place of the top number field. -/ +theorem finitePlaceUnramifiedness_of_formallyUnramified + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] + [Algebra K L] + [Algebra.FormallyUnramified (𝓞 K) (𝓞 L)] : + IsUnramifiedAtFinitePlaces K L := by + intro P + infer_instance + +/-- An étale extension of rings of integers is unramified at every finite +place. In particular, this applies to finite étale ring-of-integers +extensions. -/ +theorem finitePlaceUnramifiedness_of_etale + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] + [Algebra K L] + [Algebra.Etale (𝓞 K) (𝓞 L)] : + IsUnramifiedAtFinitePlaces K L := + finitePlaceUnramifiedness_of_formallyUnramified + +end ClassFieldTower.Martinet diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedTower.lean new file mode 100644 index 0000000000..50bab5ed19 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedTower.lean @@ -0,0 +1,179 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +public import Mathlib.NumberTheory.RamificationInertia.Unramified +/-! +# Finite-prime unramifiedness in towers of number fields + +This file records the tower properties of being unramified at every +finite prime. The transitivity and intermediate-field arguments are +proved from multiplicativity of ramification indices. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +attribute [local instance] Ideal.Quotient.field + +universe u v w + +/-- A number-field extension is unramified at finite places when every +height-one prime of the top ring of integers is unramified over the +base ring of integers. -/ +def IsUnramifiedAtFinitePlaces + (K : Type u) (L : Type v) + [Field K] + [Field L] [Algebra K L] : Prop := + ∀ P : HeightOneSpectrum (𝓞 L), + Algebra.IsUnramifiedAt (𝓞 K) P.asIdeal + +namespace IsUnramifiedAtFinitePlaces + +/-- The identity extension is unramified at every finite place. -/ +theorem refl + (K : Type u) [Field K] [NumberField K] : + IsUnramifiedAtFinitePlaces K K := by + intro P + change Algebra.FormallyUnramified (𝓞 K) (Localization P.asIdeal.primeCompl) + infer_instance + +variable + {k : Type u} {K : Type v} {F : Type w} + [Field k] [NumberField k] + [Field K] [NumberField K] + [Field F] [NumberField F] + [Algebra k K] [Algebra k F] [Algebra K F] + [IsScalarTower k K F] + +/-- Finite-prime unramifiedness is transitive in a tower of number +fields. -/ +theorem trans + (hkK : IsUnramifiedAtFinitePlaces k K) + (hKF : IsUnramifiedAtFinitePlaces K F) : + IsUnramifiedAtFinitePlaces k F := by + intro P + let p : HeightOneSpectrum (𝓞 K) := + finitePlaceBelow (K := K) P + let hPp : P.asIdeal.LiesOver p.asIdeal := ⟨rfl⟩ + let : Module.Finite (𝓞 k) (𝓞 K) := + HilbertRamification.Dedekind.ringOfIntegers_moduleFinite + (K := k) (L := K) + let : Module.Finite (𝓞 K) (𝓞 F) := + HilbertRamification.Dedekind.ringOfIntegers_moduleFinite + (K := K) (L := F) + let : Module.Finite (𝓞 k) (𝓞 F) := + HilbertRamification.Dedekind.ringOfIntegers_moduleFinite + (K := k) (L := F) + let hkKp : + Algebra.IsUnramifiedAt (𝓞 k) p.asIdeal := + hkK p + let hKFP : + Algebra.IsUnramifiedAt (𝓞 K) P.asIdeal := + hKF P + have hLower : + p.asIdeal.ramificationIdx (𝓞 k) = 1 := + Ideal.ramificationIdx_eq_one p.asIdeal (𝓞 k) + have hUpper : + P.asIdeal.ramificationIdx (𝓞 K) = 1 := + Ideal.ramificationIdx_eq_one P.asIdeal (𝓞 K) + have hTower : + P.asIdeal.ramificationIdx (𝓞 k) = + p.asIdeal.ramificationIdx (𝓞 k) * + P.asIdeal.ramificationIdx (𝓞 K) := + Ideal.ramificationIdx_tower + (R := 𝓞 k) p.asIdeal P.asIdeal + have hTop : + P.asIdeal.ramificationIdx (𝓞 k) = 1 := by + rw [hTower, hLower, hUpper, one_mul] + have hBasePrime : + P.asIdeal.under (𝓞 k) ≠ ⊥ := by + simpa only [finitePlaceBelow_asIdeal] using + (finitePlaceBelow (K := k) P).ne_bot + let : Finite ((𝓞 k) ⧸ P.asIdeal.under (𝓞 k)) := + Ring.HasFiniteQuotients.finiteQuotient hBasePrime + let : + PerfectField (P.asIdeal.under (𝓞 k)).ResidueField := + PerfectField.ofFinite + exact + (Ideal.ramificationIdx_eq_one_iff + (R := 𝓞 k) (S := 𝓞 F) (q := P.asIdeal)).1 hTop + +omit [NumberField k] [NumberField K] [NumberField F] in +/-- If the top of a number-field tower is unramified over the bottom, +then it is unramified over the intermediate field. -/ +theorem top + (hkF : IsUnramifiedAtFinitePlaces k F) : + IsUnramifiedAtFinitePlaces K F := by + intro P + let : + Algebra.IsUnramifiedAt (𝓞 k) P.asIdeal := + hkF P + exact + Algebra.IsUnramifiedAt.of_restrictScalars + (𝓞 k) P.asIdeal + +/-- If the top of a number-field tower is unramified over the bottom, +then the intermediate field is unramified over the bottom. -/ +theorem bot + (hkF : IsUnramifiedAtFinitePlaces k F) : + IsUnramifiedAtFinitePlaces k K := by + intro p + let : Module.Finite (𝓞 k) (𝓞 K) := + HilbertRamification.Dedekind.ringOfIntegers_moduleFinite + (K := k) (L := K) + let : Module.Finite (𝓞 K) (𝓞 F) := + HilbertRamification.Dedekind.ringOfIntegers_moduleFinite + (K := K) (L := F) + let : Module.Finite (𝓞 k) (𝓞 F) := + HilbertRamification.Dedekind.ringOfIntegers_moduleFinite + (K := k) (L := F) + obtain ⟨⟨P, hPprime, hPp⟩⟩ := + p.asIdeal.nonempty_primesOver (S := 𝓞 F) + let : P.IsPrime := hPprime + let : P.LiesOver p.asIdeal := hPp + have hPne : P ≠ ⊥ := + Ideal.ne_bot_of_liesOver_of_ne_bot p.ne_bot P + let P' : HeightOneSpectrum (𝓞 F) := + { asIdeal := P + isPrime := hPprime + ne_bot := hPne } + let : + Algebra.IsUnramifiedAt (𝓞 k) P := + hkF P' + have hTop : + P.ramificationIdx (𝓞 k) = 1 := + Ideal.ramificationIdx_eq_one P (𝓞 k) + have hTower : + P.ramificationIdx (𝓞 k) = + p.asIdeal.ramificationIdx (𝓞 k) * + P.ramificationIdx (𝓞 K) := + Ideal.ramificationIdx_tower + (R := 𝓞 k) p.asIdeal P + have hLower : + p.asIdeal.ramificationIdx (𝓞 k) = 1 := + (mul_eq_one.mp (hTower.symm.trans hTop)).1 + have hBasePrime : + p.asIdeal.under (𝓞 k) ≠ ⊥ := by + simpa only [finitePlaceBelow_asIdeal] using + (finitePlaceBelow (K := k) p).ne_bot + let : Finite ((𝓞 k) ⧸ p.asIdeal.under (𝓞 k)) := + Ring.HasFiniteQuotients.finiteQuotient hBasePrime + let : + PerfectField (p.asIdeal.under (𝓞 k)).ResidueField := + PerfectField.ofFinite + exact + (Ideal.ramificationIdx_eq_one_iff + (R := 𝓞 k) (S := 𝓞 K) (q := p.asIdeal)).1 hLower + +end IsUnramifiedAtFinitePlaces diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/GaloisDifferentBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/GaloisDifferentBound.lean new file mode 100644 index 0000000000..985745cb57 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/GaloisDifferentBound.lean @@ -0,0 +1,70 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.TameDifferentTrace +public import Mathlib.NumberTheory.RamificationInertia.Galois +public import Mathlib.RingTheory.RamificationInertia.Ramification +public import Mathlib.RingTheory.DedekindDomain.Ideal.Lemmas +public import Mathlib.RingTheory.RamificationInertia.Inertia +public import Mathlib.FieldTheory.Galois.Basic +/-! +# The different at a prime not dividing a Galois degree + +The local factor P^e of q times the integer ring has absolute norm +q^(e*f). The Galois fundamental identity makes e*f a divisor of the +extension degree, so it is prime to q. The literal CRT trace witness then +proves that P^e does not divide the different. No completion comparison or +an assumed different-exponent formula is used. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace AlgebraicNumberTheory.Discriminant + +/-- A full ramification power cannot divide the different at a rational +prime that does not divide the finite Galois degree. -/ +theorem ramification_power_not_dvd_differentIdeal_of_not_dvd_degree + (L : Type*) [Field L] [NumberField L] [IsGalois ℚ L] + (q : ℕ) (hq : q.Prime) (P : Ideal (𝓞 L)) [P.IsMaximal] + [P.LiesOver (Ideal.span {(q : ℤ)})] + (hDegree : ¬ q ∣ Module.finrank ℚ L) : + ¬ P ^ P.ramificationIdx ℤ ∣ differentIdeal ℤ (𝓞 L) := by + classical + let p : Ideal ℤ := Ideal.span {(q : ℤ)} + have : Fact q.Prime := ⟨hq⟩ + have hp0 : p ≠ ⊥ := by + exact mt Ideal.span_singleton_eq_bot.mp (Int.natCast_ne_zero.mpr hq.ne_zero) + have hpMap0 : p.map (algebraMap ℤ (𝓞 L)) ≠ ⊥ := + Ideal.map_ne_bot_of_ne_bot hp0 + obtain ⟨Q, hPQ, hFactor⟩ := Ideal.eq_prime_pow_mul_coprime hpMap0 P + rw [← Ideal.IsDedekindDomain.ramificationIdx_eq_normalizedFactors_count p P hpMap0] + at hFactor + have hNorm : (P ^ P.ramificationIdx ℤ).absNorm = + q ^ (P.ramificationIdx ℤ * P.inertiaDeg ℤ) := by + rw [map_pow, ← Ideal.pow_inertiaDeg q P, ← pow_mul, Nat.mul_comm] + have hFundamental := + Ideal.ncard_primesOver_mul_ramificationIdxIn_mul_inertiaDegIn p (𝓞 L) Gal(L/ℚ) + rw [Ideal.ramificationIdxIn_eq_ramificationIdx p P Gal(L/ℚ), + Ideal.inertiaDegIn_eq_inertiaDeg p P Gal(L/ℚ), + IsGalois.card_aut_eq_finrank] at hFundamental + have hEF : P.ramificationIdx ℤ * P.inertiaDeg ℤ ∣ Module.finrank ℚ L := by + refine ⟨(Ideal.primesOver p (𝓞 L)).ncard, ?_⟩ + simpa only [Nat.mul_comm] using hFundamental.symm + exact not_dvd_differentIdeal_of_coprime_norm_exponent L q + (P.ramificationIdx ℤ * P.inertiaDeg ℤ) hq + (P ^ P.ramificationIdx ℤ) Q + (IsCoprime.pow_left (Ideal.isCoprime_iff_sup_eq.mpr hPQ)) + hFactor.symm hNorm (fun h ↦ hDegree (h.trans hEF)) + +end AlgebraicNumberTheory.Discriminant diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/IntegralPrimitiveElement.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/IntegralPrimitiveElement.lean new file mode 100644 index 0000000000..f8e2b95f97 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/IntegralPrimitiveElement.lean @@ -0,0 +1,105 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.PrimitiveElement +public import Mathlib.FieldTheory.Minpoly.IsIntegrallyClosed +public import Mathlib.NumberTheory.NumberField.Ideal.KummerDedekind +public import Mathlib.LinearAlgebra.FreeModule.Finite.Quotient +public import Mathlib.RingTheory.Algebraic.Integral +public import Mathlib.GroupTheory.Index +/-! +# Integral primitive elements and their finite index + +Every number field has an integral primitive element. Its order has full +integer rank, so its additive index is nonzero and lies in its conductor. +Consequently the exponent used in Kummer--Dedekind is nonzero. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField Module Polynomial + +namespace AlgebraicNumberTheory.PrimeSelection + +/-- A number field has a primitive element in its actual ring of integers. -/ +theorem exists_integral_primitive_element + (K : Type*) [Field K] [NumberField K] : + ∃ θ : 𝓞 K, IntermediateField.adjoin ℚ ({(θ : K)} : Set K) = ⊤ := by + obtain ⟨α, hα⟩ := Field.exists_primitive_element ℚ K + have : Algebra.IsAlgebraic ℤ K := + IsFractionRing.comap_isAlgebraic_iff.mpr + (inferInstance : Algebra.IsAlgebraic ℚ K) + obtain ⟨m, hm, hmα⟩ := + (Algebra.IsAlgebraic.isAlgebraic α : IsAlgebraic ℤ α).exists_integral_multiple + let θ : 𝓞 K := ⟨m • α, hmα⟩ + refine ⟨θ, top_le_iff.mp ?_⟩ + rw [← hα, IntermediateField.adjoin_simple_le_iff] + have hθ : (θ : K) ∈ IntermediateField.adjoin ℚ ({(θ : K)} : Set K) := + IntermediateField.mem_adjoin_simple_self ℚ (θ : K) + have hmQ : (m : ℚ) ≠ 0 := Int.cast_ne_zero.mpr hm + have hmul := + (IntermediateField.adjoin ℚ ({(θ : K)} : Set K)).smul_mem hθ + (x := (m : ℚ)⁻¹) + convert hmul using 1 + change α = (m : ℚ)⁻¹ • (m • α) + rw [← Int.cast_smul_eq_zsmul ℚ, smul_smul, inv_mul_cancel₀ hmQ, one_smul] + +/-- The order of an integral primitive element has full integer rank. -/ +theorem integralPrimitiveOrder_finrank + (K : Type*) [Field K] [NumberField K] + (θ : 𝓞 K) + (hθ : IntermediateField.adjoin ℚ ({(θ : K)} : Set K) = ⊤) : + Module.finrank ℤ (Algebra.adjoin ℤ ({θ} : Set (𝓞 K))) = + Module.finrank ℤ (𝓞 K) := by + have hpoly : minpoly ℚ (θ : K) = (minpoly ℤ θ).map (algebraMap ℤ ℚ) := + minpoly.isIntegrallyClosed_eq_field_fractions ℚ K θ.isIntegral + calc + Module.finrank ℤ (Algebra.adjoin ℤ ({θ} : Set (𝓞 K))) = + (minpoly ℤ θ).natDegree := (Algebra.adjoin.powerBasis' θ.isIntegral).finrank + _ = (minpoly ℚ (θ : K)).natDegree := by + rw [hpoly, (minpoly.monic θ.isIntegral).natDegree_map] + _ = Module.finrank ℚ (IntermediateField.adjoin ℚ ({(θ : K)} : Set K)) := + (IntermediateField.adjoin.finrank + (Algebra.IsSeparable.isIntegral ℚ (θ : K))).symm + _ = Module.finrank ℚ K := by + rw [hθ] + exact IntermediateField.topEquiv.toLinearEquiv.finrank_eq + _ = Module.finrank ℤ (𝓞 K) := (NumberField.RingOfIntegers.rank K).symm + +/-- The Kummer--Dedekind exponent of an integral primitive element is nonzero. -/ +theorem integralPrimitive_exponent_ne_zero + (K : Type*) [Field K] [NumberField K] + (θ : 𝓞 K) + (hθ : IntermediateField.adjoin ℚ ({(θ : K)} : Set K) = ⊤) : + RingOfIntegers.exponent θ ≠ 0 := by + let N : Submodule ℤ (𝓞 K) := (Algebra.adjoin ℤ ({θ} : Set (𝓞 K))).toSubmodule + have hRank : Module.finrank ℤ N = Module.finrank ℤ (𝓞 K) := + integralPrimitiveOrder_finrank K θ hθ + have : Finite ((𝓞 K) ⧸ N) := Submodule.finiteQuotientOfFreeOfRankEq N hRank + have : Finite ((𝓞 K) ⧸ N.toAddSubgroup) := by + change Finite ((𝓞 K) ⧸ N) + infer_instance + have hIndex : N.toAddSubgroup.index ≠ 0 := + N.toAddSubgroup.index_ne_zero_of_finite + have hmem : (N.toAddSubgroup.index : 𝓞 K) ∈ conductor ℤ θ := by + rw [mem_conductor_iff] + intro x + simpa only [N, Submodule.mem_toAddSubgroup, Subalgebra.mem_toSubmodule, + nsmul_eq_mul] using N.toAddSubgroup.nsmul_index_mem x + change Ideal.absNorm (Ideal.under ℤ (conductor ℤ θ)) ≠ 0 + apply Ideal.absNorm_eq_zero_iff.not.mpr + intro hbot + have hm : (N.toAddSubgroup.index : ℤ) ∈ + Ideal.under ℤ (conductor ℤ θ) := by + change algebraMap ℤ (𝓞 K) (N.toAddSubgroup.index : ℤ) ∈ conductor ℤ θ + simpa only [map_natCast] using hmem + rw [hbot, Ideal.mem_bot] at hm + exact hIndex (Int.natCast_eq_zero.mp hm) + +end AlgebraicNumberTheory.PrimeSelection diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/MathlibUnramifiedInterface.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/MathlibUnramifiedInterface.lean new file mode 100644 index 0000000000..0474c3858e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/MathlibUnramifiedInterface.lean @@ -0,0 +1,161 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.EverywhereUnramifiedTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsEverywhereUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsUnramifiedAtFinitePlaces +/-! +# Finite-place unramifiedness comparison + +The implementation quantifies over primes of the extension, while the public +definition quantifies over primes of the base. These are equivalent because +every prime above a nonzero base prime is itself nonzero. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +namespace ClassFieldTheory + +/-- A number-field equivalence over `K` restricts to an equivalence of +integer rings over the integer ring of `K`. -/ +noncomputable def ringOfIntegersEquivOfAlgEquiv + (K L E : Type) + [Field K] + [Field L] [Algebra K L] + [Field E] [Algebra K E] + (e : L ≃ₐ[K] E) : 𝓞 L ≃ₐ[𝓞 K] 𝓞 E := by + let eℤ : L ≃ₐ[ℤ] E := e.restrictScalars ℤ + let e𝓞 : 𝓞 L ≃ₐ[ℤ] 𝓞 E := eℤ.mapIntegralClosure + exact AlgEquiv.ofRingEquiv (f := e𝓞.toRingEquiv) (fun x => by + apply Subtype.ext + change e (algebraMap (𝓞 K) L x) = algebraMap (𝓞 K) E x + rw [IsScalarTower.algebraMap_apply (𝓞 K) K L x, + IsScalarTower.algebraMap_apply (𝓞 K) K E x] + exact e.commutes (algebraMap (𝓞 K) K x)) + +/-- Unramifiedness at all nonzero primes is equivalent to formal +unramifiedness of the entire integer-ring extension; the zero prime is +automatically unramified in characteristic zero. -/ +theorem isUnramifiedAtFinitePlaces_iff_formallyUnramified + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] : + _root_.IsUnramifiedAtFinitePlaces K L ↔ + Algebra.FormallyUnramified (𝓞 K) (𝓞 L) := by + rw [Algebra.formallyUnramified_iff_forall] + constructor + · intro h q + by_cases hq : q.asIdeal = ⊥ + · simpa only [hq] using + (Algebra.isUnramifiedAt_bot (R := 𝓞 K) (S := 𝓞 L)) + · exact h ⟨q.asIdeal, q.isPrime, hq⟩ + · intro h W + exact h ⟨W.asIdeal, W.isPrime⟩ + +/-- The base-prime and extension-prime formulations of finite-place +unramifiedness agree. -/ +theorem isUnramifiedAtFinitePlaces_iff_original + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] : + ClassFieldTheory.IsUnramifiedAtFinitePlaces K L ↔ + _root_.IsUnramifiedAtFinitePlaces K L := by + constructor + · intro h W + let v := finitePlaceBelow (K := K) W + exact h v W.asIdeal W.isPrime ⟨rfl⟩ + · intro h v P hP hOver + let W : HeightOneSpectrum (𝓞 L) := + ⟨P, hP, + @Ideal.ne_bot_of_liesOver_of_ne_bot + (𝓞 K) (𝓞 L) _ _ _ _ v.asIdeal v.ne_bot P hOver⟩ + exact h W + +/-- Finite-place unramifiedness is invariant under a number-field +equivalence over the base. -/ +theorem isUnramifiedAtFinitePlaces_iff_of_algEquiv + (K L E : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [Field E] [NumberField E] [Algebra K E] + (e : L ≃ₐ[K] E) : + ClassFieldTheory.IsUnramifiedAtFinitePlaces K L ↔ + ClassFieldTheory.IsUnramifiedAtFinitePlaces K E := by + rw [isUnramifiedAtFinitePlaces_iff_original, + isUnramifiedAtFinitePlaces_iff_original, + isUnramifiedAtFinitePlaces_iff_formallyUnramified, + isUnramifiedAtFinitePlaces_iff_formallyUnramified] + exact Algebra.FormallyUnramified.iff_of_equiv + (ringOfIntegersEquivOfAlgEquiv K L E e) + +/-- Unramifiedness at infinite places is also invariant under a +number-field equivalence over the base. -/ +theorem isUnramifiedAtInfinitePlaces_iff_of_algEquiv + (K L E : Type) + [Field K] + [Field L] [Algebra K L] + [Field E] [Algebra K E] + (e : L ≃ₐ[K] E) : + IsUnramifiedAtInfinitePlaces K L ↔ + IsUnramifiedAtInfinitePlaces K E := by + constructor + · intro h + refine ⟨fun w => ?_⟩ + have hw := (h.isUnramified (w.comap (e : L →+* E))).comap_algHom + e.symm.toAlgHom + have hcomp : + (e : L →+* E).comp (e.symm.toAlgHom : E →+* L) = RingHom.id E := by + ext x + exact e.apply_symm_apply x + simpa only [← InfinitePlace.comap_comp, hcomp, + InfinitePlace.comap_id] using hw + · intro h + refine ⟨fun w => ?_⟩ + have hw := (h.isUnramified (w.comap (e.symm : E →+* L))).comap_algHom + e.toAlgHom + have hcomp : + (e.symm : E →+* L).comp (e.toAlgHom : L →+* E) = RingHom.id L := by + ext x + exact e.symm_apply_apply x + simpa only [← InfinitePlace.comap_comp, hcomp, + InfinitePlace.comap_id] using hw + +/-- The public conjunction and the implementation's bundled predicate for +unramifiedness at all places agree. -/ +theorem isEverywhereUnramified_iff_original + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] : + ClassFieldTheory.IsEverywhereUnramified K L ↔ + _root_.IsEverywhereUnramified K L := by + constructor + · rintro ⟨hfinite, hinfinite⟩ + exact ⟨(isUnramifiedAtFinitePlaces_iff_original K L).mp hfinite, hinfinite⟩ + · intro h + exact ⟨(isUnramifiedAtFinitePlaces_iff_original K L).mpr h.finitePlaces, + h.infinitePlaces⟩ + +/-- Everywhere-unramifiedness is invariant under a number-field +equivalence over the base. -/ +theorem isEverywhereUnramified_iff_of_algEquiv + (K L E : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [Field E] [NumberField E] [Algebra K E] + (e : L ≃ₐ[K] E) : + ClassFieldTheory.IsEverywhereUnramified K L ↔ + ClassFieldTheory.IsEverywhereUnramified K E := by + exact and_congr + (isUnramifiedAtFinitePlaces_iff_of_algEquiv K L E e) + (isUnramifiedAtInfinitePlaces_iff_of_algEquiv K L E e) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/PlaceEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/PlaceEquiv.lean new file mode 100644 index 0000000000..f4caded7f5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/PlaceEquiv.lean @@ -0,0 +1,62 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.NumberField.Basic +public import Mathlib.NumberTheory.NumberField.InfinitePlace.Ramification +public import Mathlib.RingTheory.DedekindDomain.Ideal.Lemmas +/-! +# Places under a number-field equivalence + +A field equivalence bijects both the finite and infinite places. These +equivalences reindex placewise products without changing their mathematics. +-/ + +@[expose] public section + +noncomputable +section + +open scoped NumberField +open NumberField IsDedekindDomain + +namespace ClassFieldTheory + +universe u v + +/-- Finite places correspond via the induced equivalence of rings of integers. -/ +def finitePlaceEquivOfRingEquiv + {F : Type u} {G : Type v} [Field F] [Field G] + (e : F ≃+* G) : + HeightOneSpectrum (𝓞 F) ≃ HeightOneSpectrum (𝓞 G) := + IsDedekindDomain.HeightOneSpectrum.equivOfRingEquiv + (NumberField.RingOfIntegers.mapRingEquiv e) + +/-- Infinite places correspond by pulling embeddings back along the inverse +field equivalence. -/ +def infinitePlaceEquivOfRingEquiv + {F : Type u} {G : Type v} [Field F] [Field G] + (e : F ≃+* G) : + NumberField.InfinitePlace F ≃ NumberField.InfinitePlace G where + toFun w := w.comap e.symm.toRingHom + invFun w := w.comap e.toRingHom + left_inv w := by + change (w.comap e.symm.toRingHom).comap e.toRingHom = w + rw [← NumberField.InfinitePlace.comap_comp] + have hcomp : e.symm.toRingHom.comp e.toRingHom = RingHom.id F := by + ext x + simp + rw [hcomp, NumberField.InfinitePlace.comap_id] + right_inv w := by + change (w.comap e.toRingHom).comap e.symm.toRingHom = w + rw [← NumberField.InfinitePlace.comap_comp] + have hcomp : e.toRingHom.comp e.symm.toRingHom = RingHom.id G := by + ext x + simp + rw [hcomp, NumberField.InfinitePlace.comap_id] + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/RootDiscriminantBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/RootDiscriminantBound.lean new file mode 100644 index 0000000000..48532fb90f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/RootDiscriminantBound.lean @@ -0,0 +1,40 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.NumberField.Discriminant.Basic +public import Mathlib.Analysis.SpecialFunctions.Pow.Real +public import Mathlib.Tactic.Positivity +public import Mathlib.Tactic.NormNum +/-! +# From an integral discriminant bound to a root discriminant bound +-/ + +@[expose] public section + +namespace AlgebraicNumberTheory.DiscriminantBounds + +/-- A degree-power bound on the absolute discriminant gives a uniform +bound on the usual real root discriminant. -/ +theorem rootDiscr_le_of_natAbs_discr_le_pow + (F : Type*) [Field F] [NumberField F] (C : ℕ) + (h : (NumberField.discr F).natAbs ≤ C ^ Module.finrank ℚ F) : + NumberField.rootDiscr F ≤ (C : ℝ) := by + have hn : Module.finrank ℚ F ≠ 0 := ne_of_gt Module.finrank_pos + have hc : ((NumberField.discr F).natAbs : ℝ) ≤ + (C : ℝ) ^ Module.finrank ℚ F := by exact_mod_cast h + have hd : |(NumberField.discr F : ℝ)| ≤ + (C : ℝ) ^ Module.finrank ℚ F := by + simpa only [Nat.cast_natAbs, Int.cast_abs] using hc + rw [NumberField.rootDiscr_def, Int.cast_abs] + calc + |(NumberField.discr F : ℝ)| ^ (Module.finrank ℚ F : ℝ)⁻¹ ≤ + ((C : ℝ) ^ Module.finrank ℚ F) ^ (Module.finrank ℚ F : ℝ)⁻¹ := + Real.rpow_le_rpow (abs_nonneg _) hd (by positivity) + _ = (C : ℝ) := Real.pow_rpow_inv_natCast (by positivity) hn + +end AlgebraicNumberTheory.DiscriminantBounds diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SchurPrimeDivisors.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SchurPrimeDivisors.lean new file mode 100644 index 0000000000..4e408ca187 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SchurPrimeDivisors.lean @@ -0,0 +1,117 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Polynomial.Roots +public import Mathlib.Algebra.Polynomial.Div +public import Mathlib.Algebra.BigOperators.Group.Finset.Piecewise +public import Mathlib.Algebra.BigOperators.GroupWithZero.Finset +public import Mathlib.Order.Filter.TendstoCofinite +public import Mathlib.Data.Nat.Prime.Defs +public import Mathlib.Data.Int.Basic +public import Mathlib.Data.Set.Finite.Basic +public import Mathlib.Tactic.Ring +/-! +# New prime divisors of integer-polynomial values + +A nonconstant integer polynomial has a nonzero value A. On any progression +through that argument with step A times the product P of forbidden primes, +its values have shape A * (1 + P*b). Finite fibres allow a value different +from 0, A and -A. A prime divisor of the second factor is therefore new. +This is the elementary Schur argument and does not invoke prime density. +-/ + +@[expose] public section + +open scoped BigOperators + +namespace AlgebraicNumberTheory.PrimeSelection + +/-- A nonconstant integer polynomial has a nonzero value with a prime factor +outside any prescribed finite set of natural numbers. -/ +theorem exists_prime_not_mem_dvd_eval + (f : Polynomial ℤ) (hf : f.natDegree ≠ 0) (S : Finset ℕ) : + ∃ q : ℕ, q.Prime ∧ q ∉ S ∧ + ∃ n : ℤ, f.eval n ≠ 0 ∧ (q : ℤ) ∣ f.eval n := by + classical + let : Filter.TendstoCofinite f.eval := + f.tendstoCofinite_of_natDegree_ne_zero hf + obtain ⟨a, ha⟩ : ∃ a : ℤ, f.eval a ≠ 0 := by + by_contra! h + exact hf (by rw [Polynomial.zero_of_eval_zero f h]; rfl) + let A := f.eval a + let P : ℕ := ∏ q ∈ S.filter Nat.Prime, q + have hP : P ≠ 0 := by + apply Finset.prod_ne_zero_iff.mpr + intro q hq + exact (Finset.mem_filter.mp hq).2.ne_zero + have hAP : A * (P : ℤ) ≠ 0 := mul_ne_zero ha (Int.natCast_ne_zero.mpr hP) + have hInjective : Function.Injective (fun t : ℤ => a + A * (P : ℤ) * t) := by + intro s t h + exact (mul_left_cancel₀ hAP) (add_left_cancel h) + have hBad : (f.eval ⁻¹' ({0, A, -A} : Set ℤ)).Finite := + Filter.TendstoCofinite.finite_preimage f.eval (by simp) + obtain ⟨x, ⟨t, rfl⟩, hx⟩ := + (Set.infinite_range_of_injective hInjective).exists_notMem_finite hBad + have hx0 : f.eval (a + A * (P : ℤ) * t) ≠ 0 := by + intro h + exact hx (by simp only [Set.mem_preimage, h, Set.mem_insert_iff, Set.mem_singleton_iff, + true_or]) + have hxA : f.eval (a + A * (P : ℤ) * t) ≠ A := by + intro h + exact hx (by simp only [Set.mem_preimage, h, Set.mem_insert_iff, Set.mem_singleton_iff, + true_or, or_true]) + have hxNegA : f.eval (a + A * (P : ℤ) * t) ≠ -A := by + intro h + exact hx (by simp only [Set.mem_preimage, h, Set.mem_insert_iff, Set.mem_singleton_iff, + or_true]) + have hdifference : A * (P : ℤ) ∣ f.eval (a + A * (P : ℤ) * t) - A := by + apply dvd_trans (show A * (P : ℤ) ∣ (a + A * (P : ℤ) * t) - a from + ⟨t, by ring⟩) + exact Polynomial.sub_dvd_eval_sub _ a f + obtain ⟨b, hb⟩ := hdifference + let y : ℤ := 1 + (P : ℤ) * b + have hy : f.eval (a + A * (P : ℤ) * t) = A * y := by + calc + f.eval (a + A * (P : ℤ) * t) = + A + (f.eval (a + A * (P : ℤ) * t) - A) := by ring + _ = A + A * (P : ℤ) * b := congrArg (A + ·) hb + _ = A * y := by dsimp only [y]; ring + have hyAbs : y.natAbs ≠ 1 := by + intro h + rcases Int.natAbs_eq_natAbs_iff.mp + (show y.natAbs = (1 : ℤ).natAbs from h) with hyOne | hyNegOne + · apply hxA + rw [hy, hyOne, mul_one] + · apply hxNegA + rw [hy, hyNegOne, mul_neg_one] + obtain ⟨q, hq, hqy⟩ := Nat.exists_prime_and_dvd hyAbs + have hqyInt : (q : ℤ) ∣ y := Int.natCast_dvd.mpr hqy + have hqS : q ∉ S := by + intro hqS + have hqP : q ∣ P := Finset.dvd_prod_of_mem (fun r : ℕ => r) + (Finset.mem_filter.mpr ⟨hqS, hq⟩) + have hqPb : (q : ℤ) ∣ (P : ℤ) * b := + dvd_mul_of_dvd_left (Int.natCast_dvd_natCast.mpr hqP) b + have hqOne : (q : ℤ) ∣ 1 := by + simpa only [y, add_sub_cancel_right] using dvd_sub hqyInt hqPb + exact hq.not_dvd_one (Int.natCast_dvd_natCast.mp hqOne) + refine ⟨q, hq, hqS, a + A * (P : ℤ) * t, hx0, ?_⟩ + rw [hy] + exact dvd_mul_of_dvd_right hqyInt A + +/-- The prime divisors of nonzero values of a nonconstant integer polynomial +form an infinite set. -/ +theorem infinite_primes_dvd_nonzero_eval + (f : Polynomial ℤ) (hf : f.natDegree ≠ 0) : + Set.Infinite {q : ℕ | q.Prime ∧ ∃ n : ℤ, f.eval n ≠ 0 ∧ (q : ℤ) ∣ f.eval n} := by + intro hFinite + obtain ⟨q, hq, hqS, n, hn, hqn⟩ := + exists_prime_not_mem_dvd_eval f hf hFinite.toFinset + exact hqS (hFinite.mem_toFinset.mpr ⟨hq, n, hn, hqn⟩) + +end AlgebraicNumberTheory.PrimeSelection diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SmallModel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SmallModel.lean new file mode 100644 index 0000000000..fe3fa69222 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SmallModel.lean @@ -0,0 +1,42 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Field.Shrink +public import Mathlib.Algebra.Ring.Shrink +public import Mathlib.Basic.Countable.Small +public import Mathlib.Data.Rat.Encodable +public import Mathlib.LinearAlgebra.Countable +public import Mathlib.NumberTheory.NumberField.Basic +/-! +# Small models of number fields + +A number field has finite dimension over the countable field `ℚ`, so its +underlying type has a representative in the lowest universe. The ring +equivalence to that representative preserves the number-field structure. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- Every number field can be represented by a type in universe zero. -/ +theorem numberField_small (F : Type u) [Field F] [NumberField F] : + Small.{0} F := by + let : Countable F := Finsupp.Countable.of_moduleFinite (R := ℚ) + infer_instance + +/-- The shrunk model of a number field remains a number field. -/ +theorem numberField_shrink (F : Type u) [Field F] [NumberField F] : + letI : Small.{0} F := numberField_small F + NumberField (Shrink.{0} F) := by + let : Small.{0} F := numberField_small F + exact NumberField.of_ringEquiv F (Shrink.{0} F) (Shrink.ringEquiv F).symm + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SupportedDiscriminantBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SupportedDiscriminantBound.lean new file mode 100644 index 0000000000..d85291aafd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SupportedDiscriminantBound.lean @@ -0,0 +1,114 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.GaloisDifferentBound +public import Mathlib.RingTheory.UniqueFactorizationDomain.NormalizedFactors +public import Mathlib.Data.Multiset.Count +public import Mathlib.NumberTheory.NumberField.Discriminant.Different +public import Mathlib.RingTheory.DedekindDomain.Ideal.Lemmas +public import Mathlib.RingTheory.Ideal.Norm.AbsNorm +public import Mathlib.RingTheory.KrullDimension.Basic +public import Mathlib.RingTheory.RamificationInertia.Ramification +/-! +# A discriminant bound from a prime-to-degree ramification support + +Every prime factor of the different lies above a rational divisor of the +discriminant. The CRT trace bound controls its exponent by the exponent +in the corresponding rational prime ideal. Hence the different divides +(c), and taking the absolute ideal norm gives |disc(L)| <= c^[L:Q]. +The Galois hypothesis is retained: it is what makes each e*f divide the +whole extension degree. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField UniqueFactorizationMonoid + +noncomputable +section + +namespace AlgebraicNumberTheory.Discriminant + +/-- The different divides a supported rational integer prime to the +Galois degree. -/ +theorem differentIdeal_dvd_span_of_coprime_support + (L : Type*) [Field L] [NumberField L] [IsGalois ℚ L] + (c : ℕ) (hc : 0 < c) (hcn : Nat.Coprime c (Module.finrank ℚ L)) + (hSupport : ∀ q : Nat.Primes, (q : ℤ) ∣ NumberField.discr L → (q : ℕ) ∣ c) : + differentIdeal ℤ (𝓞 L) ∣ Ideal.span {(c : 𝓞 L)} := by + classical + let D : Ideal (𝓞 L) := differentIdeal ℤ (𝓞 L) + let J : Ideal (𝓞 L) := Ideal.span {(c : 𝓞 L)} + have hD : D ≠ 0 := differentIdeal_ne_bot + have hJ : J ≠ 0 := by + exact mt Ideal.span_singleton_eq_bot.mp (Nat.cast_ne_zero.mpr hc.ne') + apply (dvd_iff_normalizedFactors_le_normalizedFactors hD hJ).mpr + apply Multiset.le_iff_count.mpr + intro P + by_cases hPmem : P ∈ normalizedFactors D + · have hPrime : Prime P := prime_of_normalized_factor P hPmem + have : P.IsPrime := Ideal.isPrime_of_prime hPrime + have : P.IsMaximal := (Ideal.isPrime_of_prime hPrime).isMaximal hPrime.ne_zero + have hPD : P ∣ D := dvd_of_mem_normalizedFactors hPmem + obtain ⟨q, f, hf, hqP, hq, hPNorm⟩ := Ideal.exists_prime_and_absNorm_eq_pow P + have hqAbs : q ∣ (NumberField.discr L).natAbs := by + have hN := Ideal.absNorm_dvd_absNorm_of_le (Ideal.dvd_iff_le.mp hPD) + rw [hPNorm, NumberField.absNorm_differentIdeal L (𝓞 L)] at hN + exact (dvd_pow_self q hf.ne').trans hN + have hqDiscr : (q : ℤ) ∣ NumberField.discr L := + Int.natAbs_dvd_natAbs.mp hqAbs + have hqc : q ∣ c := hSupport ⟨q, hq⟩ hqDiscr + have hqDegree : ¬ q ∣ Module.finrank ℚ L := + hq.coprime_iff_not_dvd.mp (hcn.of_dvd_left hqc) + have : Fact q.Prime := ⟨hq⟩ + let p : Ideal ℤ := Ideal.span {(q : ℤ)} + have : P.LiesOver p := + (Ideal.liesOver_span_iff (show P.IsPrime from inferInstance).ne_top + (Nat.prime_iff_prime_int.mp hq)).mpr (by simpa only [map_natCast] using hqP) + have hp0 : p ≠ ⊥ := by + exact mt Ideal.span_singleton_eq_bot.mp (Int.natCast_ne_zero.mpr hq.ne_zero) + have hpMap0 : p.map (algebraMap ℤ (𝓞 L)) ≠ 0 := + Ideal.map_ne_bot_of_ne_bot hp0 + obtain ⟨Q, _, hFactorD⟩ := Ideal.eq_prime_pow_mul_coprime hD P + have hCount : (normalizedFactors D).count P < P.ramificationIdx ℤ := by + apply Nat.lt_of_not_ge + intro he + apply ramification_power_not_dvd_differentIdeal_of_not_dvd_degree L q hq P hqDegree + exact (pow_dvd_pow P he).trans ⟨Q, hFactorD⟩ + have hMap : p.map (algebraMap ℤ (𝓞 L)) ∣ J := by + rw [Ideal.dvd_iff_le] + change Ideal.span {(c : 𝓞 L)} ≤ _ + rw [Ideal.map_span, Set.image_singleton] + apply Ideal.span_singleton_le_span_singleton.mpr + rcases hqc with ⟨k, hk⟩ + refine ⟨(k : 𝓞 L), ?_⟩ + simp only [hk, Nat.cast_mul, map_natCast] + have hFactors := + (dvd_iff_normalizedFactors_le_normalizedFactors hpMap0 hJ).mp hMap + have hCountMap := Multiset.le_iff_count.mp hFactors P + rw [← Ideal.IsDedekindDomain.ramificationIdx_eq_normalizedFactors_count p P hpMap0] + at hCountMap + exact hCount.le.trans hCountMap + · rw [Multiset.count_eq_zero.mpr hPmem] + exact Nat.zero_le _ + +/-- A supported integer prime to a finite Galois degree bounds the root +scale of its absolute discriminant. -/ +theorem natAbs_discr_le_pow_of_coprime_support + (L : Type*) [Field L] [NumberField L] [IsGalois ℚ L] + (c : ℕ) (hc : 0 < c) (hcn : Nat.Coprime c (Module.finrank ℚ L)) + (hSupport : ∀ q : Nat.Primes, (q : ℤ) ∣ NumberField.discr L → (q : ℕ) ∣ c) : + (NumberField.discr L).natAbs ≤ c ^ Module.finrank ℚ L := by + have h := Ideal.absNorm_dvd_absNorm_of_le (Ideal.dvd_iff_le.mp + (differentIdeal_dvd_span_of_coprime_support L c hc hcn hSupport)) + rw [NumberField.absNorm_differentIdeal L (𝓞 L), + Ideal.absNorm_span_natCast, NumberField.RingOfIntegers.rank] at h + exact Nat.le_of_dvd (pow_pos hc _) h + +end AlgebraicNumberTheory.Discriminant diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/TameDifferentTrace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/TameDifferentTrace.lean new file mode 100644 index 0000000000..716f97c183 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/TameDifferentTrace.lean @@ -0,0 +1,99 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.NumberField.Discriminant.Different +public import Mathlib.RingTheory.Ideal.Int +public import Mathlib.FieldTheory.Finiteness +public import Mathlib.RingTheory.DedekindDomain.Different +public import Mathlib.RingTheory.Ideal.Quotient.Operations +public import Mathlib.RingTheory.Ideal.Norm.AbsNorm +public import Mathlib.RingTheory.Trace.Defs +public import Mathlib.RingTheory.Trace.Basic +/-! +# A trace witness bounds a primary factor of the different + +For a coprime factorization of q times the integer ring, the Chinese +remainder idempotent (1, 0) has trace equal to the dimension of the first +factor. If that factor has norm q^m and q does not divide m, its trace is +nonzero modulo q. Mathlib's trace-dual criterion then shows that the first +factor cannot divide the different. The factor need not be prime. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace AlgebraicNumberTheory.Discriminant + +/-- A primary factor whose residue dimension is prime to q cannot divide +an entire additional power into the different. -/ +theorem not_dvd_differentIdeal_of_coprime_norm_exponent + (L : Type*) [Field L] [NumberField L] + (q m : ℕ) (hq : q.Prime) + (R Q : Ideal (𝓞 L)) (hRQ : IsCoprime R Q) + (hMul : R * Q = (Ideal.span {(q : ℤ)}).map (algebraMap ℤ (𝓞 L))) + (hNorm : R.absNorm = q ^ m) (hm : ¬ q ∣ m) : + ¬ R ∣ differentIdeal ℤ (𝓞 L) := by + classical + let p : Ideal ℤ := Ideal.span {(q : ℤ)} + let : Fact q.Prime := ⟨hq⟩ + let : Field (ℤ ⧸ p) := Ideal.Quotient.field p + let : Algebra (ℤ ⧸ p) (𝓞 L ⧸ R) := + Ideal.Quotient.algebraQuotientOfLEComap (by + rw [← Ideal.map_le_iff_le_comap, ← hMul] + exact Ideal.mul_le_left) + let : Algebra (ℤ ⧸ p) (𝓞 L ⧸ Q) := + Ideal.Quotient.algebraQuotientOfLEComap (by + rw [← Ideal.map_le_iff_le_comap, ← hMul] + exact Ideal.mul_le_right) + have : IsScalarTower ℤ (ℤ ⧸ p) (𝓞 L ⧸ R) := .of_algebraMap_eq' rfl + have : IsScalarTower ℤ (ℤ ⧸ p) (𝓞 L ⧸ Q) := .of_algebraMap_eq' rfl + have : Module.Finite (ℤ ⧸ p) (𝓞 L ⧸ R) := + Module.Finite.of_restrictScalars_finite ℤ (ℤ ⧸ p) (𝓞 L ⧸ R) + have : Module.Finite (ℤ ⧸ p) (𝓞 L ⧸ Q) := + Module.Finite.of_restrictScalars_finite ℤ (ℤ ⧸ p) (𝓞 L ⧸ Q) + have hpCard : Nat.card (ℤ ⧸ p) = q := Int.card_ideal_quot q + have hRCard : Nat.card (𝓞 L ⧸ R) = q ^ m := by + simpa only [Ideal.absNorm_apply, Submodule.cardQuot_apply] using hNorm + have hDim : Module.finrank (ℤ ⧸ p) (𝓞 L ⧸ R) = m := by + apply Nat.pow_right_injective hq.two_le + have hCard := Module.natCard_eq_pow_finrank (K := ℤ ⧸ p) (V := 𝓞 L ⧸ R) + rw [hpCard, hRCard] at hCard + exact hCard.symm + have hCast : (m : ℤ ⧸ p) ≠ 0 := by + intro h + have hz : (m : ZMod q) = 0 := by + simpa using congrArg (Int.quotientSpanNatEquivZMod q) h + exact hm ((ZMod.natCast_eq_zero_iff m q).mp hz) + let e : (𝓞 L ⧸ p.map (algebraMap ℤ (𝓞 L))) ≃ₐ[ℤ ⧸ p] + ((𝓞 L ⧸ R) × (𝓞 L ⧸ Q)) := + { __ := (Ideal.quotEquivOfEq hMul.symm).trans + (Ideal.quotientMulEquivQuotientProd R Q hRQ) + commutes' := Quotient.ind fun _ ↦ rfl } + obtain ⟨x, hx⟩ := Ideal.Quotient.mk_surjective (e.symm (1, 0)) + refine not_dvd_differentIdeal_of_intTrace_not_mem ℤ R Q hMul x ?_ ?_ + · have h := congr((e $hx).2) + simp only [algebraMap_int_eq, AlgEquiv.apply_symm_apply] at h + change Ideal.Quotient.mk Q x = 0 at h + exact Ideal.Quotient.eq_zero_iff_mem.mp h + · rw [← Ideal.Quotient.eq_zero_iff_mem, + ← Algebra.trace_quotient_eq_of_isDedekindDomain, hx, + Algebra.trace_eq_of_algEquiv, Algebra.trace_prod_apply] + have ht : Algebra.trace (ℤ ⧸ p) (𝓞 L ⧸ R) 1 = (m : ℤ ⧸ p) := by + simpa only [map_one, nsmul_one, hDim] using + (Algebra.trace_algebraMap (R := ℤ ⧸ p) (S := 𝓞 L ⧸ R) (1 : ℤ ⧸ p)) + change Algebra.trace (ℤ ⧸ p) (𝓞 L ⧸ R) 1 + + Algebra.trace (ℤ ⧸ p) (𝓞 L ⧸ Q) 0 ≠ 0 + rw [ht, map_zero, add_zero] + exact hCast + +end AlgebraicNumberTheory.Discriminant diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols.lean new file mode 100644 index 0000000000..9873c99588 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.FiniteField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.Ideal + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/All.lean new file mode 100644 index 0000000000..c6f03ad5e4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/All.lean @@ -0,0 +1,12 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.FiniteField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.Ideal +/-! # Power residue symbols over finite fields and ideals -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/FiniteField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/FiniteField.lean new file mode 100644 index 0000000000..2a33d83fad --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/FiniteField.lean @@ -0,0 +1,114 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Group.Subgroup.Finite +public import Mathlib.FieldTheory.Finite.Basic +/-! +# Power-residue symbols over finite fields + +For a finite field `k` of cardinality `q` and `n ∣ q - 1`, the tame +power-residue symbol is + +`u ↦ u ^ ((q - 1) / n)`. + +Its kernel is exactly the subgroup of `n`-th powers. +-/ + +@[expose] public section + +namespace AlgebraicNumberTheory +namespace PowerResidueSymbols + +variable (k : Type*) [Field k] [Fintype k] + +/-- The finite-field `n`-th power-residue symbol. -/ +def finiteFieldPowerResidueSymbol + (n : ℕ+) (hn : (n : ℕ) ∣ Fintype.card k - 1) : + kˣ →* rootsOfUnity (n : ℕ) k where + toFun u := + ⟨u ^ ((Fintype.card k - 1) / (n : ℕ)), by + change (u ^ ((Fintype.card k - 1) / (n : ℕ))) ^ (n : ℕ) = 1 + rw [← pow_mul, Nat.div_mul_cancel hn] + apply Units.ext + exact FiniteField.pow_card_sub_one_eq_one + (u : k) (Units.ne_zero u)⟩ + map_one' := by + apply Subtype.ext + simp + map_mul' u v := by + apply Subtype.ext + simp [mul_pow] + +@[simp] +theorem finiteFieldPowerResidueSymbol_apply + (n : ℕ+) (hn : (n : ℕ) ∣ Fintype.card k - 1) (u : kˣ) : + ((finiteFieldPowerResidueSymbol k n hn u : + rootsOfUnity (n : ℕ) k) : kˣ) = + u ^ ((Fintype.card k - 1) / (n : ℕ)) := + rfl + +/-- The finite-field symbol is trivial exactly on `n`-th powers. -/ +theorem finiteFieldPowerResidueSymbol_eq_one_iff + (n : ℕ+) (hn : (n : ℕ) ∣ Fintype.card k - 1) (u : kˣ) : + finiteFieldPowerResidueSymbol k n hn u = 1 ↔ + ∃ v : kˣ, v ^ (n : ℕ) = u := by + classical + let m := (Fintype.card k - 1) / (n : ℕ) + let powerN : kˣ →* kˣ := powMonoidHom (n : ℕ) + let powerM : kˣ →* kˣ := powMonoidHom m + have hRange_le_ker : powerN.range ≤ powerM.ker := by + rintro _ ⟨v, rfl⟩ + rw [MonoidHom.mem_ker] + change (v ^ (n : ℕ)) ^ m = 1 + rw [← pow_mul] + have hnm : (n : ℕ) * m = Fintype.card k - 1 := by + rw [Nat.mul_comm] + exact Nat.div_mul_cancel hn + rw [hnm] + apply Units.ext + exact FiniteField.pow_card_sub_one_eq_one + (v : k) (Units.ne_zero v) + have hCard : Nat.card powerM.ker ≤ Nat.card powerN.range := by + have hm : m ∣ Fintype.card k - 1 := + Nat.div_dvd_of_dvd hn + have hUnitsCard : Nat.card kˣ = Fintype.card k - 1 := by + rw [Nat.card_eq_fintype_card, Fintype.card_units] + dsimp only [powerM, powerN] + rw [IsCyclic.card_powMonoidHom_ker, + IsCyclic.card_powMonoidHom_range, hUnitsCard, + Nat.gcd_eq_right hm, Nat.gcd_eq_right hn] + have hRange_eq_ker : powerN.range = powerM.ker := + Subgroup.eq_of_le_of_card_ge hRange_le_ker hCard + constructor + · intro hsymbol + have huPow : u ^ m = 1 := by + have hval := congrArg + (fun z : rootsOfUnity (n : ℕ) k => (z : kˣ)) hsymbol + change + u ^ ((Fintype.card k - 1) / (n : ℕ)) = (1 : kˣ) at hval + simpa only [m] using hval + have huKer : u ∈ powerM.ker := by + rw [MonoidHom.mem_ker] + exact huPow + have huRange : u ∈ powerN.range := by + rw [hRange_eq_ker] + exact huKer + rcases huRange with ⟨v, hv⟩ + exact ⟨v, hv⟩ + · rintro ⟨v, hv⟩ + have huRange : u ∈ powerN.range := ⟨v, hv⟩ + have huKer : u ∈ powerM.ker := by + rw [← hRange_eq_ker] + exact huRange + apply Subtype.ext + change u ^ m = 1 + simpa only [powerM, powMonoidHom_apply] using + (MonoidHom.mem_ker.mp huKer) + +end PowerResidueSymbols +end AlgebraicNumberTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/Ideal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/Ideal.lean new file mode 100644 index 0000000000..5ff4a6db24 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/Ideal.lean @@ -0,0 +1,638 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.FiniteField +public import Mathlib.NumberTheory.NumberField.Ideal.Basic +public import Mathlib.RingTheory.DedekindDomain.Factorization +/-! +# Power-residue symbols at prime ideals and integral ideals + +Let `K` contain the `n`-th roots of unity and let `P` be a prime ideal +whose absolute norm is coprime to `n`. Reduction identifies +`μₙ(𝓞 K)` with `μₙ(𝓞 K / P)`. Pulling the finite-field symbol back along +this identification gives `(a/P)`. + +For a nonzero integral ideal `I`, `(a/I)` is the finite product of +`(a/P)` raised to the multiplicity of `P` in `I`. +-/ + +@[expose] public section + +open scoped NumberField BigOperators +open NumberField IsDedekindDomain + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace PowerResidueSymbols + +attribute [local instance] Ideal.Quotient.field + +variable (K : Type*) [Field K] [NumberField K] + +open scoped Classical in +/-- The residue field at a nonzero prime ideal of a number field has a finite enumeration. -/ +noncomputable local instance primeIdealResidueFintype + (P : HeightOneSpectrum (𝓞 K)) : + Fintype (𝓞 K ⧸ P.asIdeal) := + Fintype.ofFinite _ + +attribute [local instance] primeIdealResidueFintype + +open scoped Classical in +/-- Reduction of `n`-th roots of unity modulo an integral prime ideal. -/ +def rootsOfUnityReduction + (P : HeightOneSpectrum (𝓞 K)) (n : ℕ) : + rootsOfUnity n (𝓞 K) →* + rootsOfUnity n (𝓞 K ⧸ P.asIdeal) where + toFun z := + ⟨Ideal.rootsOfUnityMapQuot P.asIdeal n z, by + change Ideal.rootsOfUnityMapQuot P.asIdeal n (z ^ n) = 1 + rw [show z ^ n = 1 by exact Subtype.ext z.2, map_one]⟩ + map_one' := by + apply Subtype.ext + exact map_one (Ideal.rootsOfUnityMapQuot P.asIdeal n) + map_mul' z w := by + apply Subtype.ext + exact map_mul (Ideal.rootsOfUnityMapQuot P.asIdeal n) z w + +open scoped Classical in +/-- Reduction on `μₙ` is injective away from `n`. -/ +theorem rootsOfUnityReduction_injective + (P : HeightOneSpectrum (𝓞 K)) (n : ℕ+) + (hcoprime : (Ideal.absNorm P.asIdeal).Coprime (n : ℕ)) : + Function.Injective (rootsOfUnityReduction K P (n : ℕ)) := by + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + intro z w hzw + exact + Ideal.rootsOfUnityMapQuot_injective + (I := P.asIdeal) (n : ℕ) + (Ideal.absNorm_eq_one_iff.not.mpr P.isPrime.ne_top) + hcoprime + (congrArg Subtype.val hzw) + +open scoped Classical in +/-- If `K` contains `μₙ`, then `n` divides `N(P)-1` at every prime +`P ∤ n`. -/ +theorem dvd_absNorm_sub_one_of_primitiveRoots + (P : HeightOneSpectrum (𝓞 K)) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hcoprime : (Ideal.absNorm P.asIdeal).Coprime (n : ℕ)) : + (n : ℕ) ∣ Ideal.absNorm P.asIdeal - 1 := by + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + obtain ⟨zeta, hzeta⟩ := hmu + have hzetaK : IsPrimitiveRoot zeta (n : ℕ) := + (mem_primitiveRoots n.pos).1 hzeta + have hcard : + Nat.card (rootsOfUnity (n : ℕ) (𝓞 K)) = (n : ℕ) := + hzetaK.toInteger_isPrimitiveRoot.card_rootsOfUnity + have hinjective : + Function.Injective + (Ideal.rootsOfUnityMapQuot P.asIdeal (n : ℕ)) := + Ideal.rootsOfUnityMapQuot_injective + (I := P.asIdeal) (n : ℕ) + (Ideal.absNorm_eq_one_iff.not.mpr P.isPrime.ne_top) + hcoprime + have hdvd := + Subgroup.card_dvd_of_injective + (Ideal.rootsOfUnityMapQuot P.asIdeal (n : ℕ)) hinjective + rw [hcard, Nat.card_units] at hdvd + rw [Ideal.absNorm_apply, Submodule.cardQuot_apply] + exact hdvd + +open scoped Classical in +/-- Away from `n`, reduction identifies the global integral `n`-th roots +of unity with the residue-field `n`-th roots of unity. -/ +noncomputable def rootsOfUnityReductionEquiv + (P : HeightOneSpectrum (𝓞 K)) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hcoprime : (Ideal.absNorm P.asIdeal).Coprime (n : ℕ)) : + rootsOfUnity (n : ℕ) (𝓞 K) ≃* + rootsOfUnity (n : ℕ) (𝓞 K ⧸ P.asIdeal) := by + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + letI : Fintype (rootsOfUnity (n : ℕ) (𝓞 K)) := + Fintype.ofFinite _ + let f := rootsOfUnityReduction K P (n : ℕ) + have hinjective : Function.Injective f := + rootsOfUnityReduction_injective K P n hcoprime + let zeta := Classical.choose hmu + have hzeta := Classical.choose_spec hmu + have hzetaK : IsPrimitiveRoot zeta (n : ℕ) := + (mem_primitiveRoots n.pos).1 hzeta + have hsource : + Fintype.card (rootsOfUnity (n : ℕ) (𝓞 K)) = (n : ℕ) := by + rw [← Nat.card_eq_fintype_card] + exact hzetaK.toInteger_isPrimitiveRoot.card_rootsOfUnity + have htarget_le : + Fintype.card (rootsOfUnity (n : ℕ) (𝓞 K ⧸ P.asIdeal)) ≤ + (n : ℕ) := by + rw [← Nat.card_eq_fintype_card] + exact card_rootsOfUnity (𝓞 K ⧸ P.asIdeal) (n : ℕ) + have hsource_le_target : + Fintype.card (rootsOfUnity (n : ℕ) (𝓞 K)) ≤ + Fintype.card (rootsOfUnity (n : ℕ) (𝓞 K ⧸ P.asIdeal)) := + Fintype.card_le_of_injective f hinjective + have htarget : + Fintype.card (rootsOfUnity (n : ℕ) (𝓞 K ⧸ P.asIdeal)) = + (n : ℕ) := + Nat.le_antisymm htarget_le (by simpa [hsource] using hsource_le_target) + exact MulEquiv.ofBijective f + ((Fintype.bijective_iff_injective_and_card f).2 + ⟨hinjective, hsource.trans htarget.symm⟩) + +open scoped Classical in +/-- The reduction equivalence acts by the canonical reduction homomorphism. -/ +@[simp] +theorem rootsOfUnityReductionEquiv_apply + (P : HeightOneSpectrum (𝓞 K)) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hcoprime : (Ideal.absNorm P.asIdeal).Coprime (n : ℕ)) + (zeta : rootsOfUnity (n : ℕ) (𝓞 K)) : + rootsOfUnityReductionEquiv K P n hmu hcoprime zeta = + rootsOfUnityReduction K P (n : ℕ) zeta := + rfl + +open scoped Classical in +/-- The cardinality of the residue field is the absolute norm of the +prime ideal. -/ +theorem card_primeIdealResidueField + (P : HeightOneSpectrum (𝓞 K)) : + Fintype.card (𝓞 K ⧸ P.asIdeal) = Ideal.absNorm P.asIdeal := by + rw [← Nat.card_eq_fintype_card, Ideal.absNorm_apply, + Submodule.cardQuot_apply] + +open scoped Classical in +/-- An algebraic integer prime to `P`, regarded as a unit of the residue +field. -/ +def primeIdealResidueUnit + (P : HeightOneSpectrum (𝓞 K)) + (a : 𝓞 K) (ha : a ∉ P.asIdeal) : + (𝓞 K ⧸ P.asIdeal)ˣ := + Units.mk0 (Ideal.Quotient.mk P.asIdeal a) + (by + rw [ne_eq, Ideal.Quotient.eq_zero_iff_mem] + exact ha) + +open scoped Classical in +@[simp] +theorem primeIdealResidueUnit_mul + (P : HeightOneSpectrum (𝓞 K)) + (a b : 𝓞 K) (ha : a ∉ P.asIdeal) (hb : b ∉ P.asIdeal) + (hab : a * b ∉ P.asIdeal) : + primeIdealResidueUnit K P (a * b) hab = + primeIdealResidueUnit K P a ha * + primeIdealResidueUnit K P b hb := by + apply Units.ext + rfl + +open scoped Classical in +/-- The `n`-th power-residue symbol `(a/P)`, valued in the common group +`μₙ(𝓞 K)`. -/ +noncomputable def primeIdealPowerResidueSymbol + (P : HeightOneSpectrum (𝓞 K)) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hcoprime : (Ideal.absNorm P.asIdeal).Coprime (n : ℕ)) + (a : 𝓞 K) (ha : a ∉ P.asIdeal) : + rootsOfUnity (n : ℕ) (𝓞 K) := + let hn : (n : ℕ) ∣ Fintype.card (𝓞 K ⧸ P.asIdeal) - 1 := by + rw [card_primeIdealResidueField K P] + exact dvd_absNorm_sub_one_of_primitiveRoots K P n hmu hcoprime + (rootsOfUnityReductionEquiv K P n hmu hcoprime).symm + (finiteFieldPowerResidueSymbol + (𝓞 K ⧸ P.asIdeal) n hn + (primeIdealResidueUnit K P a ha)) + +open scoped Classical in +/-- Reduction sends `(a/P)` to the finite-field formula +`a^((N(P)-1)/n)`. -/ +theorem rootsOfUnityReductionEquiv_primeIdealPowerResidueSymbol + (P : HeightOneSpectrum (𝓞 K)) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hcoprime : (Ideal.absNorm P.asIdeal).Coprime (n : ℕ)) + (a : 𝓞 K) (ha : a ∉ P.asIdeal) : + let hn : (n : ℕ) ∣ Fintype.card (𝓞 K ⧸ P.asIdeal) - 1 := by + rw [card_primeIdealResidueField K P] + exact dvd_absNorm_sub_one_of_primitiveRoots K P n hmu hcoprime + rootsOfUnityReductionEquiv K P n hmu hcoprime + (primeIdealPowerResidueSymbol K P n hmu hcoprime a ha) = + finiteFieldPowerResidueSymbol + (𝓞 K ⧸ P.asIdeal) n hn + (primeIdealResidueUnit K P a ha) := by + dsimp only [primeIdealPowerResidueSymbol] + exact (rootsOfUnityReductionEquiv K P n hmu hcoprime).apply_symm_apply _ + +open scoped Classical in +/-- The prime-ideal symbol is one exactly when `a` is an `n`-th power +modulo `P`. -/ +theorem primeIdealPowerResidueSymbol_eq_one_iff + (P : HeightOneSpectrum (𝓞 K)) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hcoprime : (Ideal.absNorm P.asIdeal).Coprime (n : ℕ)) + (a : 𝓞 K) (ha : a ∉ P.asIdeal) : + primeIdealPowerResidueSymbol K P n hmu hcoprime a ha = 1 ↔ + ∃ u : (𝓞 K ⧸ P.asIdeal)ˣ, + u ^ (n : ℕ) = primeIdealResidueUnit K P a ha := by + let hn : (n : ℕ) ∣ Fintype.card (𝓞 K ⧸ P.asIdeal) - 1 := by + rw [card_primeIdealResidueField K P] + exact dvd_absNorm_sub_one_of_primitiveRoots K P n hmu hcoprime + constructor + · intro h + have hred := congrArg + (rootsOfUnityReductionEquiv K P n hmu hcoprime) h + rw [rootsOfUnityReductionEquiv_primeIdealPowerResidueSymbol, + map_one] at hred + exact + (finiteFieldPowerResidueSymbol_eq_one_iff + (𝓞 K ⧸ P.asIdeal) n hn + (primeIdealResidueUnit K P a ha)).1 hred + · intro h + apply (rootsOfUnityReductionEquiv K P n hmu hcoprime).injective + rw [rootsOfUnityReductionEquiv_primeIdealPowerResidueSymbol, map_one] + exact + (finiteFieldPowerResidueSymbol_eq_one_iff + (𝓞 K ⧸ P.asIdeal) n hn + (primeIdealResidueUnit K P a ha)).2 h + +open scoped Classical in +/-- Multiplicativity of `(a/P)` in the numerator. -/ +theorem primeIdealPowerResidueSymbol_mul + (P : HeightOneSpectrum (𝓞 K)) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hcoprime : (Ideal.absNorm P.asIdeal).Coprime (n : ℕ)) + (a b : 𝓞 K) (ha : a ∉ P.asIdeal) (hb : b ∉ P.asIdeal) : + primeIdealPowerResidueSymbol K P n hmu hcoprime (a * b) + (by + intro hab + exact (P.isPrime.mem_or_mem hab).elim ha hb) = + primeIdealPowerResidueSymbol K P n hmu hcoprime a ha * + primeIdealPowerResidueSymbol K P n hmu hcoprime b hb := by + let hab : a * b ∉ P.asIdeal := by + intro h + exact (P.isPrime.mem_or_mem h).elim ha hb + let hn : (n : ℕ) ∣ Fintype.card (𝓞 K ⧸ P.asIdeal) - 1 := by + rw [card_primeIdealResidueField K P] + exact dvd_absNorm_sub_one_of_primitiveRoots K P n hmu hcoprime + apply (rootsOfUnityReductionEquiv K P n hmu hcoprime).injective + rw [map_mul] + rw [rootsOfUnityReductionEquiv_primeIdealPowerResidueSymbol, + rootsOfUnityReductionEquiv_primeIdealPowerResidueSymbol, + rootsOfUnityReductionEquiv_primeIdealPowerResidueSymbol] + rw [primeIdealResidueUnit_mul K P a b ha hb hab, map_mul] + +open scoped Classical in +/-- Multiplicity of `P` in the prime factorization of a nonzero integral +ideal. -/ +def idealPrimeMultiplicity + (P : HeightOneSpectrum (𝓞 K)) (I : Ideal (𝓞 K)) : ℕ := + (Associates.mk P.asIdeal).count (Associates.mk I).factors + +open scoped Classical in +/-- Prime-ideal multiplicities add under multiplication of nonzero +integral ideals. -/ +theorem idealPrimeMultiplicity_mul + (P : HeightOneSpectrum (𝓞 K)) + (I J : Ideal (𝓞 K)) (hI : I ≠ 0) (hJ : J ≠ 0) : + idealPrimeMultiplicity K P (I * J) = + idealPrimeMultiplicity K P I + + idealPrimeMultiplicity K P J := by + unfold idealPrimeMultiplicity + rw [← Associates.mk_mul_mk] + exact + Associates.count_mul + (Associates.mk_ne_zero.mpr hI) + (Associates.mk_ne_zero.mpr hJ) + P.associates_irreducible + +open scoped Classical in +/-- A prime not dividing a nonzero ideal has multiplicity zero in its +factorization. -/ +theorem idealPrimeMultiplicity_eq_zero_of_not_dvd + (P : HeightOneSpectrum (𝓞 K)) + (I : Ideal (𝓞 K)) (hI : I ≠ 0) + (hP : ¬ P.asIdeal ∣ I) : + idealPrimeMultiplicity K P I = 0 := by + by_contra hne + exact hP + ((Associates.count_ne_zero_iff_dvd hI P.irreducible).mp hne) + +open scoped Classical in +/-- The finite set of height-one primes dividing a nonzero denominator ideal. + +Naming this set keeps every finite-product presentation on the same subtype, +instead of asking typeclass inference to reconstruct definitionally equal +subtypes from separate predicate expressions. -/ +def idealPrimeDivisors (I : Ideal (𝓞 K)) : + Set (HeightOneSpectrum (𝓞 K)) := + {P | P.asIdeal ∣ I} + +omit [NumberField K] in +open scoped Classical in +/-- Membership in the named prime-divisor set is ordinary ideal divisibility. -/ +@[simp] +theorem mem_idealPrimeDivisors + (I : Ideal (𝓞 K)) (P : HeightOneSpectrum (𝓞 K)) : + P ∈ idealPrimeDivisors K I ↔ P.asIdeal ∣ I := + Iff.rfl + +open scoped Classical in +/-- The prime divisors of a nonzero ideal form a finite set. -/ +theorem idealPrimeDivisors_finite + (I : Ideal (𝓞 K)) (hI : I ≠ 0) : + (idealPrimeDivisors K I).Finite := + Ideal.finite_factors hI + +open scoped Classical in +/-- **Ideal power residue symbol.** For `I = ∏ P ^ v_P(I)`, define + +`(a/I) = ∏ (a/P) ^ v_P(I)`. + +The hypotheses only concern the finitely many primes dividing `I`. -/ +noncomputable def idealPowerResidueSymbol + (I : Ideal (𝓞 K)) (hI : I ≠ 0) + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a : 𝓞 K) + (hcoprime : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ I → + (Ideal.absNorm P.asIdeal).Coprime (n : ℕ)) + (ha : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ I → a ∉ P.asIdeal) : + rootsOfUnity (n : ℕ) (𝓞 K) := by + letI : Fintype + (idealPrimeDivisors K I) := + (idealPrimeDivisors_finite K I hI).fintype + exact + ∏ P : idealPrimeDivisors K I, + primeIdealPowerResidueSymbol K P.1 n hmu + (hcoprime P.1 ((mem_idealPrimeDivisors K I P.1).mp P.2)) a + (ha P.1 ((mem_idealPrimeDivisors K I P.1).mp P.2)) ^ + idealPrimeMultiplicity K P.1 I + +open scoped Classical in +/-- The prime-by-prime factor of the ideal power-residue symbol, extended +by `1` away from the prime divisors of the denominator. -/ +noncomputable def idealPowerResidueFactor + (I : Ideal (𝓞 K)) + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a : 𝓞 K) + (hcoprime : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ I → + (Ideal.absNorm P.asIdeal).Coprime (n : ℕ)) + (ha : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ I → a ∉ P.asIdeal) + (P : HeightOneSpectrum (𝓞 K)) : + rootsOfUnity (n : ℕ) (𝓞 K) := + if hP : P.asIdeal ∣ I then + primeIdealPowerResidueSymbol K P n hmu + (hcoprime P hP) a (ha P hP) ^ + idealPrimeMultiplicity K P I + else + 1 + +open scoped Classical in +/-- Only prime divisors of the denominator can contribute a nontrivial +factor. -/ +theorem idealPowerResidueFactor_hasFiniteMulSupport + (I : Ideal (𝓞 K)) (hI : I ≠ 0) + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a : 𝓞 K) + (hcoprime : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ I → + (Ideal.absNorm P.asIdeal).Coprime (n : ℕ)) + (ha : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ I → a ∉ P.asIdeal) : + Function.HasFiniteMulSupport + (idealPowerResidueFactor K I n hmu a hcoprime ha) := by + apply (Ideal.finite_factors hI).subset + intro P hP + by_contra hdiv + have hnot : ¬ P.asIdeal ∣ I := by + simpa using hdiv + exact hP (by simp [idealPowerResidueFactor, hnot]) + +open scoped Classical in +/-- Prime-by-prime multiplicativity in the denominator. -/ +theorem idealPowerResidueFactor_mul + (I J : Ideal (𝓞 K)) (hI : I ≠ 0) (hJ : J ≠ 0) + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a : 𝓞 K) + (hcoprime : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ I ∨ P.asIdeal ∣ J → + (Ideal.absNorm P.asIdeal).Coprime (n : ℕ)) + (ha : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ I ∨ P.asIdeal ∣ J → a ∉ P.asIdeal) + (P : HeightOneSpectrum (𝓞 K)) : + let hcoprimeI := + fun P hP => hcoprime P (Or.inl hP) + let hcoprimeJ := + fun P hP => hcoprime P (Or.inr hP) + let hcoprimeIJ := + fun P hP => hcoprime P (P.prime.dvd_mul.mp hP) + let haI := + fun P hP => ha P (Or.inl hP) + let haJ := + fun P hP => ha P (Or.inr hP) + let haIJ := + fun P hP => ha P (P.prime.dvd_mul.mp hP) + idealPowerResidueFactor K (I * J) n hmu a + hcoprimeIJ haIJ P = + idealPowerResidueFactor K I n hmu a + hcoprimeI haI P * + idealPowerResidueFactor K J n hmu a + hcoprimeJ haJ P := by + dsimp only + by_cases hPI : P.asIdeal ∣ I + · have hPIJ : P.asIdeal ∣ I * J := + dvd_mul_of_dvd_left hPI J + by_cases hPJ : P.asIdeal ∣ J + · rw [idealPowerResidueFactor, dite_eq_left hPIJ, + idealPowerResidueFactor, dite_eq_left hPI, + idealPowerResidueFactor, dite_eq_left hPJ, + idealPrimeMultiplicity_mul K P I J hI hJ, + pow_add] + · have hmJ : + idealPrimeMultiplicity K P J = 0 := + idealPrimeMultiplicity_eq_zero_of_not_dvd + K P J hJ hPJ + rw [idealPowerResidueFactor, dite_eq_left hPIJ, + idealPowerResidueFactor, dite_eq_left hPI, + idealPowerResidueFactor, dite_eq_right hPJ, + idealPrimeMultiplicity_mul K P I J hI hJ, + hmJ, add_zero, mul_one] + · by_cases hPJ : P.asIdeal ∣ J + · have hPIJ : P.asIdeal ∣ I * J := + dvd_mul_of_dvd_right hPJ I + have hmI : + idealPrimeMultiplicity K P I = 0 := + idealPrimeMultiplicity_eq_zero_of_not_dvd + K P I hI hPI + rw [idealPowerResidueFactor, dite_eq_left hPIJ, + idealPowerResidueFactor, dite_eq_right hPI, + idealPowerResidueFactor, dite_eq_left hPJ, + idealPrimeMultiplicity_mul K P I J hI hJ, + hmI, zero_add, one_mul] + · have hPIJ : ¬ P.asIdeal ∣ I * J := by + intro h + exact (P.prime.dvd_mul.mp h).elim hPI hPJ + rw [idealPowerResidueFactor, dite_eq_right hPIJ, + idealPowerResidueFactor, dite_eq_right hPI, + idealPowerResidueFactor, dite_eq_right hPJ, one_mul] + +open scoped Classical in +/-- The subtype product defining the ideal symbol is equivalently the finite product +over all finite primes, with factor `1` away from the denominator. -/ +theorem idealPowerResidueSymbol_eq_finprod + (I : Ideal (𝓞 K)) (hI : I ≠ 0) + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a : 𝓞 K) + (hcoprime : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ I → + (Ideal.absNorm P.asIdeal).Coprime (n : ℕ)) + (ha : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ I → a ∉ P.asIdeal) : + idealPowerResidueSymbol K I hI n hmu a hcoprime ha = + ∏ᶠ P : HeightOneSpectrum (𝓞 K), + idealPowerResidueFactor K I n hmu a hcoprime ha P := by + classical + let : Fintype + (idealPrimeDivisors K I) := + (idealPrimeDivisors_finite K I hI).fintype + calc + idealPowerResidueSymbol K I hI n hmu a hcoprime ha = + ∏ P : idealPrimeDivisors K I, + idealPowerResidueFactor K I n hmu a hcoprime ha P := by + unfold idealPowerResidueSymbol + apply Finset.prod_congr rfl + intro P _ + have hP := (mem_idealPrimeDivisors K I P.1).mp P.2 + simp [idealPowerResidueFactor, hP] + _ = ∏ᶠ P : idealPrimeDivisors K I, + idealPowerResidueFactor K I n hmu a hcoprime ha P := + (finprod_eq_prod_of_fintype _).symm + _ = ∏ᶠ (P : HeightOneSpectrum (𝓞 K)) + (_ : P.asIdeal ∣ I), + idealPowerResidueFactor K I n hmu a hcoprime ha P := + finprod_subtype_eq_finprod_cond _ + _ = ∏ᶠ P : HeightOneSpectrum (𝓞 K), + idealPowerResidueFactor K I n hmu a hcoprime ha P := by + apply finprod_congr + intro P + by_cases hP : P.asIdeal ∣ I + · simp [hP] + · simp [idealPowerResidueFactor, hP] + +open scoped Classical in +/-- Multiplicativity of the ideal power residue symbol in the denominator ideal. -/ +theorem idealPowerResidueSymbol_mul_denominator + (I J : Ideal (𝓞 K)) (hI : I ≠ 0) (hJ : J ≠ 0) + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a : 𝓞 K) + (hcoprime : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ I ∨ P.asIdeal ∣ J → + (Ideal.absNorm P.asIdeal).Coprime (n : ℕ)) + (ha : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ I ∨ P.asIdeal ∣ J → a ∉ P.asIdeal) : + let hcoprimeI := + fun P hP => hcoprime P (Or.inl hP) + let hcoprimeJ := + fun P hP => hcoprime P (Or.inr hP) + let hcoprimeIJ := + fun P hP => hcoprime P (P.prime.dvd_mul.mp hP) + let haI := + fun P hP => ha P (Or.inl hP) + let haJ := + fun P hP => ha P (Or.inr hP) + let haIJ := + fun P hP => ha P (P.prime.dvd_mul.mp hP) + idealPowerResidueSymbol K (I * J) (mul_ne_zero hI hJ) + n hmu a hcoprimeIJ haIJ = + idealPowerResidueSymbol K I hI n hmu a hcoprimeI haI * + idealPowerResidueSymbol K J hJ n hmu a hcoprimeJ haJ := by + dsimp only + rw [idealPowerResidueSymbol_eq_finprod, + idealPowerResidueSymbol_eq_finprod, + idealPowerResidueSymbol_eq_finprod] + rw [← finprod_mul_distrib + (idealPowerResidueFactor_hasFiniteMulSupport + K I hI n hmu a _ _) + (idealPowerResidueFactor_hasFiniteMulSupport + K J hJ n hmu a _ _)] + apply finprod_congr + intro P + exact idealPowerResidueFactor_mul + K I J hI hJ n hmu a hcoprime ha P + +open scoped Classical in +/-- Unfolded finite-product form of the ideal power residue symbol. -/ +theorem idealPowerResidueSymbol_eq_prod + (I : Ideal (𝓞 K)) (hI : I ≠ 0) + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a : 𝓞 K) + (hcoprime : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ I → + (Ideal.absNorm P.asIdeal).Coprime (n : ℕ)) + (ha : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ I → a ∉ P.asIdeal) : + letI : Fintype + (idealPrimeDivisors K I) := + (idealPrimeDivisors_finite K I hI).fintype + idealPowerResidueSymbol K I hI n hmu a hcoprime ha = + ∏ P : idealPrimeDivisors K I, + primeIdealPowerResidueSymbol K P.1 n hmu + (hcoprime P.1 ((mem_idealPrimeDivisors K I P.1).mp P.2)) a + (ha P.1 ((mem_idealPrimeDivisors K I P.1).mp P.2)) ^ + idealPrimeMultiplicity K P.1 I := + rfl + +open scoped Classical in +/-- Multiplicativity of the ideal power residue symbol in the numerator. -/ +theorem idealPowerResidueSymbol_mul + (I : Ideal (𝓞 K)) (hI : I ≠ 0) + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a b : 𝓞 K) + (hcoprime : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ I → + (Ideal.absNorm P.asIdeal).Coprime (n : ℕ)) + (ha : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ I → a ∉ P.asIdeal) + (hb : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ I → b ∉ P.asIdeal) : + idealPowerResidueSymbol K I hI n hmu (a * b) hcoprime + (fun P hP hab => + (P.isPrime.mem_or_mem hab).elim (ha P hP) (hb P hP)) = + idealPowerResidueSymbol K I hI n hmu a hcoprime ha * + idealPowerResidueSymbol K I hI n hmu b hcoprime hb := by + classical + let : Fintype + (idealPrimeDivisors K I) := + (idealPrimeDivisors_finite K I hI).fintype + unfold idealPowerResidueSymbol + rw [← Finset.prod_mul_distrib] + apply Finset.prod_congr rfl + intro P _ + rw [primeIdealPowerResidueSymbol_mul, mul_pow] + +end PowerResidueSymbols +end AlgebraicNumberTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/QuadraticReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/QuadraticReciprocity.lean new file mode 100644 index 0000000000..4540d3c743 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/QuadraticReciprocity.lean @@ -0,0 +1,246 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.LegendreSymbol.JacobiSymbol +/-! +# Gauss reciprocity and its supplementary laws + +This file proves Gauss reciprocity and its supplementary laws. Mathlib's Jacobi symbol has a + natural-number +denominator, so an integer denominator `b` is written canonically as +`jacobiSym a b.natAbs`, as is forced by the principal ideal `(b)`. +-/ + +@[expose] public section + +open scoped NumberTheorySymbols + +namespace AlgebraicNumberTheory +namespace PowerResidueSymbols + +/-- Positive form of Gauss reciprocity for arbitrary coprime odd natural +numbers (not only primes). -/ +theorem gaussReciprocity_nat + {a b : ℕ} (ha : Odd a) (hb : Odd b) (hab : a.Coprime b) : + J((a : ℤ) | b) * J((b : ℤ) | a) = + (-1 : ℤ) ^ (a / 2 * (b / 2)) := by + rw [jacobiSym.quadratic_reciprocity ha hb, mul_assoc] + have hsq : J((b : ℤ) | a) ^ 2 = 1 := by + apply jacobiSym.sq_one + simpa [Int.gcd_eq_natAbs] using hab.symm.gcd_eq_one + rw [← pow_two, hsq, mul_one] + +/-- **Gauss reciprocity.** This signed formulation +applies to all odd, relatively prime integers. -/ +theorem gaussReciprocity + {a b : ℤ} (ha : Odd a) (hb : Odd b) + (hab : a.natAbs.Coprime b.natAbs) : + J(a | b.natAbs) * J(b | a.natAbs) = + (-1 : ℤ) ^ + (a.natAbs / 2 * (b.natAbs / 2) + + (if a < 0 then b.natAbs / 2 else 0) + + (if b < 0 then a.natAbs / 2 else 0)) := by + have ha' : Odd a.natAbs := ha.natAbs + have hb' : Odd b.natAbs := hb.natAbs + have hpos := + gaussReciprocity_nat ha' hb' hab + have hchiA : + ZMod.χ₄ a.natAbs = (-1 : ℤ) ^ (a.natAbs / 2) := + ZMod.χ₄_eq_neg_one_pow (Nat.odd_iff.mp ha') + have hchiB : + ZMod.χ₄ b.natAbs = (-1 : ℤ) ^ (b.natAbs / 2) := + ZMod.χ₄_eq_neg_one_pow (Nat.odd_iff.mp hb') + by_cases hna : a < 0 + · have ha_cast : a = -(a.natAbs : ℤ) := by + rw [Int.natCast_natAbs, abs_of_neg hna, neg_neg] + by_cases hnb : b < 0 + · have hb_cast : b = -(b.natAbs : ℤ) := by + rw [Int.natCast_natAbs, abs_of_neg hnb, neg_neg] + rw [ite_eq_left hna, ite_eq_left hnb] + rw [ha_cast, hb_cast] + simp only [Int.natAbs_neg, Int.natAbs_natCast] + rw [jacobiSym.neg _ hb', jacobiSym.neg _ ha', hchiA, hchiB] + calc + ((-1 : ℤ) ^ (b.natAbs / 2) * + J((a.natAbs : ℤ) | b.natAbs)) * + ((-1 : ℤ) ^ (a.natAbs / 2) * + J((b.natAbs : ℤ) | a.natAbs)) = + ((-1 : ℤ) ^ (a.natAbs / 2 * (b.natAbs / 2))) * + ((-1 : ℤ) ^ (b.natAbs / 2)) * + ((-1 : ℤ) ^ (a.natAbs / 2)) := by + rw [← hpos] + ring + _ = (-1 : ℤ) ^ + (a.natAbs / 2 * (b.natAbs / 2) + + b.natAbs / 2 + a.natAbs / 2) := by + rw [pow_add, pow_add] + · have hb_nonneg : 0 ≤ b := le_of_not_gt hnb + have hb_cast : (b.natAbs : ℤ) = b := + Int.natAbs_of_nonneg hb_nonneg + rw [ite_eq_left hna, ite_eq_right hnb] + rw [ha_cast, ← hb_cast] + simp only [Int.natAbs_neg, Int.natAbs_natCast] + rw [jacobiSym.neg _ hb', hchiB] + calc + ((-1 : ℤ) ^ (b.natAbs / 2) * + J((a.natAbs : ℤ) | b.natAbs)) * + J((b.natAbs : ℤ) | a.natAbs) = + ((-1 : ℤ) ^ (b.natAbs / 2)) * + ((-1 : ℤ) ^ + (a.natAbs / 2 * (b.natAbs / 2))) := by + rw [mul_assoc, hpos] + _ = (-1 : ℤ) ^ + (a.natAbs / 2 * (b.natAbs / 2) + + b.natAbs / 2 + 0) := by + rw [add_zero, pow_add, mul_comm] + · have ha_nonneg : 0 ≤ a := le_of_not_gt hna + have ha_cast : (a.natAbs : ℤ) = a := + Int.natAbs_of_nonneg ha_nonneg + by_cases hnb : b < 0 + · have hb_cast : b = -(b.natAbs : ℤ) := by + rw [Int.natCast_natAbs, abs_of_neg hnb, neg_neg] + rw [ite_eq_right hna, ite_eq_left hnb] + rw [← ha_cast, hb_cast] + simp only [Int.natAbs_neg, Int.natAbs_natCast] + rw [jacobiSym.neg _ ha', hchiA] + calc + J((a.natAbs : ℤ) | b.natAbs) * + ((-1 : ℤ) ^ (a.natAbs / 2) * + J((b.natAbs : ℤ) | a.natAbs)) = + ((-1 : ℤ) ^ + (a.natAbs / 2 * (b.natAbs / 2))) * + ((-1 : ℤ) ^ (a.natAbs / 2)) := by + rw [← hpos] + ring + _ = (-1 : ℤ) ^ + (a.natAbs / 2 * (b.natAbs / 2) + 0 + + a.natAbs / 2) := by + rw [add_zero, pow_add] + · have hb_nonneg : 0 ≤ b := le_of_not_gt hnb + have hb_cast : (b.natAbs : ℤ) = b := + Int.natAbs_of_nonneg hb_nonneg + rw [ite_eq_right hna, ite_eq_right hnb] + rw [← ha_cast, ← hb_cast] + simp only [Int.natAbs_natCast, add_zero] + exact hpos + +/-- The first supplementary law, expressed by its parity exponent. -/ +theorem gaussSupplement_neg_one + {b : ℕ} (hb : Odd b) : + J((-1 : ℤ) | b) = (-1 : ℤ) ^ ((b - 1) / 2) := by + rw [jacobiSym.at_neg_one hb, + ZMod.χ₄_eq_neg_one_pow (Nat.odd_iff.mp hb)] + congr 1 + obtain ⟨k, rfl⟩ := hb + omega + +/-- The second supplementary law in residue-class form. -/ +theorem gaussSupplement_two + {b : ℕ} (hb : Odd b) : + J((2 : ℤ) | b) = + if b % 8 = 1 ∨ b % 8 = 7 then 1 else -1 := by + have hbne : b % 2 ≠ 0 := by + rw [Nat.odd_iff.mp hb] + decide + rw [jacobiSym.at_two hb, ZMod.χ₈_nat_eq_if_mod_eight, + ite_eq_right hbne] + +/-- For odd `b`, the mod-eight sign is the classical exponent +`(-1)^((b²-1)/8)`. -/ +theorem twoSupplementSign_eq_neg_one_pow + {b : ℕ} (hb : Odd b) : + (if b % 8 = 1 ∨ b % 8 = 7 then (1 : ℤ) else -1) = + (-1 : ℤ) ^ ((b ^ 2 - 1) / 8) := by + have hbmod : b % 2 = 1 := Nat.odd_iff.mp hb + have hresidue : + b % 8 = 1 ∨ b % 8 = 3 ∨ b % 8 = 5 ∨ b % 8 = 7 := by + have hlt : b % 8 < 8 := Nat.mod_lt b (by decide) + have hparity : (b % 8) % 2 = 1 := by + rw [Nat.mod_mod_of_dvd b (by decide : 2 ∣ 8)] + exact hbmod + omega + rcases hresidue with h1 | h3 | h5 | h7 + · let q := b / 8 + have hbq : b = 8 * q + 1 := by + dsimp [q] + have hdiv := Nat.mod_add_div b 8 + omega + have hsquare : + (8 * q + 1) ^ 2 = + 8 * (8 * q ^ 2 + 2 * q) + 1 := by + ring + have hexponent : + (b ^ 2 - 1) / 8 = 8 * q ^ 2 + 2 * q := by + rw [hbq, hsquare, Nat.add_sub_cancel, Nat.mul_div_right] + decide + have heven : Even (8 * q ^ 2 + 2 * q) := by + refine ⟨4 * q ^ 2 + q, ?_⟩ + ring + rw [ite_eq_left (Or.inl h1), hexponent, heven.neg_one_pow] + · let q := b / 8 + have hbq : b = 8 * q + 3 := by + dsimp [q] + have hdiv := Nat.mod_add_div b 8 + omega + have hsquare : + (8 * q + 3) ^ 2 = + 8 * (8 * q ^ 2 + 6 * q + 1) + 1 := by + ring + have hexponent : + (b ^ 2 - 1) / 8 = 8 * q ^ 2 + 6 * q + 1 := by + rw [hbq, hsquare, Nat.add_sub_cancel, Nat.mul_div_right] + decide + have hodd : Odd (8 * q ^ 2 + 6 * q + 1) := by + refine ⟨4 * q ^ 2 + 3 * q, ?_⟩ + ring + rw [ite_eq_right, hexponent, hodd.neg_one_pow] + omega + · let q := b / 8 + have hbq : b = 8 * q + 5 := by + dsimp [q] + have hdiv := Nat.mod_add_div b 8 + omega + have hsquare : + (8 * q + 5) ^ 2 = + 8 * (8 * q ^ 2 + 10 * q + 3) + 1 := by + ring + have hexponent : + (b ^ 2 - 1) / 8 = 8 * q ^ 2 + 10 * q + 3 := by + rw [hbq, hsquare, Nat.add_sub_cancel, Nat.mul_div_right] + decide + have hodd : Odd (8 * q ^ 2 + 10 * q + 3) := by + refine ⟨4 * q ^ 2 + 5 * q + 1, ?_⟩ + ring + rw [ite_eq_right, hexponent, hodd.neg_one_pow] + omega + · let q := b / 8 + have hbq : b = 8 * q + 7 := by + dsimp [q] + have hdiv := Nat.mod_add_div b 8 + omega + have hsquare : + (8 * q + 7) ^ 2 = + 8 * (8 * q ^ 2 + 14 * q + 6) + 1 := by + ring + have hexponent : + (b ^ 2 - 1) / 8 = 8 * q ^ 2 + 14 * q + 6 := by + rw [hbq, hsquare, Nat.add_sub_cancel, Nat.mul_div_right] + decide + have heven : Even (8 * q ^ 2 + 14 * q + 6) := by + refine ⟨4 * q ^ 2 + 7 * q + 3, ?_⟩ + ring + rw [ite_eq_left (Or.inr h7), hexponent, heven.neg_one_pow] + +/-- The second supplementary law, expressed by its parity exponent. -/ +theorem gaussSupplement_two_pow + {b : ℕ} (hb : Odd b) : + J((2 : ℤ) | b) = (-1 : ℤ) ^ ((b ^ 2 - 1) / 8) := by + rw [gaussSupplement_two hb, twoSupplementSign_eq_neg_one_pow hb] + +end PowerResidueSymbols +end AlgebraicNumberTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification.lean new file mode 100644 index 0000000000..ae22a11fca --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeFromChosenPrimes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.RationalPrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.UnramifiedRationals + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/All.lean new file mode 100644 index 0000000000..ef937a4e90 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/All.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeFromChosenPrimes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.RationalPrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.UnramifiedRationals +/-! +# Ramification of number fields + +Public aggregate for finite ramification support, rational prime ideals, +everywhere-unramified rational extensions, and global degree bounds. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeFromChosenPrimes.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeFromChosenPrimes.lean new file mode 100644 index 0000000000..1eaafde4e9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeFromChosenPrimes.lean @@ -0,0 +1,62 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.ChosenInertiaCoverage +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.InertiaGeneration +/-! +# Global degree bound from chosen finite-prime inertia groups + +This combines three generic steps in the global degree estimate: coverage by one +prime over each member of `S`, generation of the full Galois group by all +finite-prime inertia, and the finite abelian product bound. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory.Ramification + +open NumberField +open HilbertRamification.Dedekind +open scoped NumberField IsMulCommutative + +/-- The generic global degree estimate used by the concrete inertia-field +compositum. -/ +theorem finrank_le_totient_prod_primePowers_of_chosen_primes + (M : Type) [Field M] [NumberField M] [IsAbelianGalois ℚ M] + (S : Finset Nat.Primes) (e : Nat.Primes → ℕ) + (chosen : ∀ p : Nat.Primes, + Ideal.primesOver (rationalPrimeIdeal p) (𝓞 M)) + (hunramifiedOutside : + ∀ (Q : Ideal (𝓞 M)) [Q.IsPrime] [Q.IsMaximal], + (¬ ∃ p ∈ S, rationalPrimeIdeal p = Q.under ℤ) → + Algebra.IsUnramifiedAt ℤ Q) + (hcard : ∀ p ∈ S, + Nat.card + (inertiaGroup (chosen p).1 (M ≃ₐ[ℚ] M)) ≤ + Nat.totient (p.1 ^ e p)) : + Module.finrank ℚ M ≤ + Nat.totient (∏ p ∈ S, p.1 ^ e p) := by + let I : Nat.Primes → Subgroup (M ≃ₐ[ℚ] M) := + fun p ↦ inertiaGroup (chosen p).1 (M ≃ₐ[ℚ] M) + have hcoverage : + ∀ (Q : Ideal (𝓞 M)) [Q.IsPrime] [Q.IsMaximal], + inertiaGroup Q (M ≃ₐ[ℚ] M) ≤ S.sup I := + inertiaGroup_le_finsetSup_chosen_of_unramified_outside + S chosen hunramifiedOutside + have hgenerate : S.sup I = ⊤ := + subgroup_eq_top_of_forall_inertiaGroup_le (S.sup I) hcoverage + exact finrank_le_totient_prod_primePowers_of_inertia_bounds + M S e I hgenerate hcard + +end AlgebraicNumberTheory.Ramification + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeProduct.lean new file mode 100644 index 0000000000..ae7fc3081e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeProduct.lean @@ -0,0 +1,78 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.GaloisClosure +public import Mathlib.NumberTheory.Cyclotomic.PrimitiveRoots +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.InertiaCardinality +/-! +# A finite-group degree product + +Once the chosen inertia groups generate the full abelian Galois group and +their orders satisfy the local prime-power bounds, the global degree is at +most the totient of the conductor candidate. This file isolates that finite +group calculation from the arithmetic construction of the chosen primes. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory.Ramification + +open RamificationTheory +open scoped BigOperators IsMulCommutative + +/-- Euler's totient is multiplicative on a finite product of powers of +distinct primes. -/ +theorem totient_prod_primePowers + (S : Finset Nat.Primes) (e : Nat.Primes → ℕ) : + Nat.totient (∏ p ∈ S, p.1 ^ e p) = + ∏ p ∈ S, Nat.totient (p.1 ^ e p) := by + classical + induction S using Finset.induction_on with + | empty => simp + | @insert p S hp ih => + have hcoprime : Nat.Coprime (p.1 ^ e p) (∏ q ∈ S, q.1 ^ e q) := by + rw [Nat.coprime_prod_right_iff] + intro q hq + apply Nat.Coprime.pow_left + apply Nat.Coprime.pow_right + exact (Nat.coprime_primes p.2 q.2).2 + (Subtype.coe_ne_coe.mpr fun hpq => hp (hpq.symm ▸ hq)) + rw [Finset.prod_insert hp, Finset.prod_insert hp, + Nat.totient_mul hcoprime, ih] + +/-- The finite-group degree bound obtained from the inertia subgroups. -/ +theorem finrank_le_totient_prod_primePowers_of_inertia_bounds + (M : Type) [Field M] [Algebra ℚ M] + [FiniteDimensional ℚ M] [IsAbelianGalois ℚ M] + (S : Finset Nat.Primes) (e : Nat.Primes → ℕ) + (I : Nat.Primes → Subgroup (M ≃ₐ[ℚ] M)) + (hgenerate : S.sup I = ⊤) + (hcard : ∀ p ∈ S, Nat.card (I p) ≤ Nat.totient (p.1 ^ e p)) : + Module.finrank ℚ M ≤ + Nat.totient (∏ p ∈ S, p.1 ^ e p) := by + let : Finite (M ≃ₐ[ℚ] M) := inferInstance + calc + Module.finrank ℚ M = Nat.card (M ≃ₐ[ℚ] M) := + (IsGalois.card_aut_eq_finrank ℚ M).symm + _ = Nat.card (S.sup I : Subgroup (M ≃ₐ[ℚ] M)) := by + rw [hgenerate] + simp + _ ≤ ∏ p ∈ S, Nat.card (I p) := + natCard_finsetSup_le_prod_natCard + (G := M ≃ₐ[ℚ] M) (ι := Nat.Primes) S I + _ ≤ ∏ p ∈ S, Nat.totient (p.1 ^ e p) := by + exact Finset.prod_le_prod (fun p hp => hcard p hp) + _ = Nat.totient (∏ p ∈ S, p.1 ^ e p) := + (totient_prod_primePowers S e).symm + +end AlgebraicNumberTheory.Ramification + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/FiniteRamifiedPrimes.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/FiniteRamifiedPrimes.lean new file mode 100644 index 0000000000..19232d48c6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/FiniteRamifiedPrimes.lean @@ -0,0 +1,76 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RingTheory.DedekindDomain.Different +public import Mathlib.RingTheory.DedekindDomain.Factorization +/-! +# Finiteness of ramified primes in Dedekind extensions + +In a finite separable extension of Dedekind domains, only finitely many +height-one primes of either the extension ring or the base ring ramify. +-/ + +@[expose] public section + +noncomputable +section + +attribute [local instance] FractionRing.liftAlgebra FractionRing.isScalarTower_liftAlgebra + +namespace AlgebraicNumberTheory.Ramification + +variable (A B : Type*) +variable [CommRing A] [CommRing B] [Algebra A B] +variable [IsDedekindDomain A] [IsDedekindDomain B] +variable [Module.IsTorsionFree A B] [Module.Finite A B] +variable [Algebra.IsSeparable (FractionRing A) (FractionRing B)] + +variable {A B} + +/-- The height-one prime of the base lying below a height-one prime of a +finite Dedekind extension. -/ +def heightOnePrimeBelow (w : IsDedekindDomain.HeightOneSpectrum B) : + IsDedekindDomain.HeightOneSpectrum A where + asIdeal := w.asIdeal.under A + isPrime := inferInstance + ne_bot := by + have : Algebra.IsIntegral A B := Algebra.IsIntegral.of_finite A B + exact mt Ideal.eq_bot_of_under_eq_bot w.ne_bot + +variable (A B) + +/-- Only finitely many height-one primes of a finite separable Dedekind +extension ramify over the base. -/ +theorem finite_ramified_heightOne_primes : + {v : IsDedekindDomain.HeightOneSpectrum B | + ¬ Algebra.IsUnramifiedAt A v.asIdeal}.Finite := by + exact + (Ideal.finite_factors (R := B) (I := differentIdeal A B) + (differentIdeal_ne_bot (A := A) (B := B))).subset (by + intro v hv + exact (dvd_differentIdeal_iff (A := A) (B := B) (P := v.asIdeal)).mpr hv) + +/-- Only finitely many height-one primes of the base ramify in a finite +separable Dedekind extension. -/ +theorem finite_ramified_base_heightOne_primes : + {v : IsDedekindDomain.HeightOneSpectrum A | + ∃ w : IsDedekindDomain.HeightOneSpectrum B, + w.asIdeal.LiesOver v.asIdeal ∧ ¬ Algebra.IsUnramifiedAt A w.asIdeal}.Finite := by + let f : IsDedekindDomain.HeightOneSpectrum B → + IsDedekindDomain.HeightOneSpectrum A := + heightOnePrimeBelow (A := A) (B := B) + refine (finite_ramified_heightOne_primes A B).image f |>.subset ?_ + intro v hv + rcases hv with ⟨w, hlie, hram⟩ + refine ⟨w, hram, ?_⟩ + apply IsDedekindDomain.HeightOneSpectrum.ext + dsimp [f, heightOnePrimeBelow] + let : w.asIdeal.LiesOver v.asIdeal := hlie + exact (Ideal.over_def w.asIdeal v.asIdeal).symm + +end AlgebraicNumberTheory.Ramification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/RationalPrime.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/RationalPrime.lean new file mode 100644 index 0000000000..9e19bb988a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/RationalPrime.lean @@ -0,0 +1,55 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.Padics.HeightOneSpectrum +public import Mathlib.NumberTheory.NumberField.Ideal.Basic +/-! +# Rational prime ideals + +This file identifies the height-one ideal of `ℤ` attached to a positive +rational prime with its usual principal ideal. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory.Ramification + +/-- The height-one ideal of `ℤ` corresponding to a positive rational prime. -/ +abbrev rationalPrimeIdeal (p : Nat.Primes) : Ideal ℤ := + (Rat.HeightOneSpectrum.primesEquiv.symm p).asIdeal + +/-- The height-one ideal represented by a positive rational prime is its +usual principal ideal. -/ +theorem rationalPrimeIdeal_eq_span (p : Nat.Primes) : + rationalPrimeIdeal p = Ideal.span {(p.1 : ℤ)} := by + let v : IsDedekindDomain.HeightOneSpectrum ℤ := + Rat.HeightOneSpectrum.primesEquiv.symm p + have hgen : Rat.HeightOneSpectrum.natGenerator v = p.1 := by + have h := congrArg Subtype.val + ((Rat.HeightOneSpectrum.primesEquiv (R := ℤ)).apply_symm_apply p) + exact h + have he : Rat.IsIntegralClosure.intEquiv ℤ = RingEquiv.refl ℤ := by + ext z + simp + change v.asIdeal = Ideal.span {(p.1 : ℤ)} + symm + calc + Ideal.span {(p.1 : ℤ)} = + Ideal.span + {(Rat.HeightOneSpectrum.natGenerator v : ℤ)} := by rw [hgen] + _ = v.asIdeal.map (Rat.IsIntegralClosure.intEquiv ℤ) := + Rat.HeightOneSpectrum.span_natGenerator v + _ = v.asIdeal := by + rw [he] + change v.asIdeal.map (RingHom.id ℤ) = v.asIdeal + exact Ideal.map_id _ + +end AlgebraicNumberTheory.Ramification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting.lean new file mode 100644 index 0000000000..71172b9799 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.NormalClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.PrimeOrderFixedField + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/All.lean new file mode 100644 index 0000000000..47d3fdc111 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/All.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.NormalClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.PrimeOrderFixedField +/-! # Splitting of finite places in field extensions -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlace.lean new file mode 100644 index 0000000000..663f714ecb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlace.lean @@ -0,0 +1,373 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Finite +/-! +# Decomposition groups and complete splitting at finite places + +For a finite Galois extension of number fields `L / K`, this file +attaches an actual decomposition subgroup to every finite place of +`K`. The extension of the adic absolute value is the one constructed +in `LocalNormApproximation`; no place above `v` is supplied as an +additional hypothesis. + +The stabilizer is identified with the automorphism group of the algebraic +localization. The finite-localization theorem supplies finite dimensionality, +so the order of +the decomposition group is exactly the local degree. Consequently +complete splitting is equivalent both to cardinality one and to local +degree one. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory + +variable {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +open scoped Classical in +/-- The actual decomposition subgroup at the chosen extension of the +finite place `v`. -/ +noncomputable def finitePlaceDecompositionGroup + (v : HeightOneSpectrum (𝓞 K)) : + Subgroup (L ≃ₐ[K] L) := + absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := L) v).1 + +open scoped Classical in +/-- A finite place splits completely when its chosen decomposition +subgroup is trivial. Conjugacy of extensions makes this independent +of the chosen extension, but the chosen representative gives a +concrete subgroup for subsequent constructions. -/ +def FinitePlaceSplitsCompletely + (v : HeightOneSpectrum (𝓞 K)) : Prop := + finitePlaceDecompositionGroup + (K := K) (L := L) v = ⊥ + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- Membership in the finite-place decomposition group is exactly +stabilization of the chosen extension of the absolute value. -/ +@[simp] +theorem mem_finitePlaceDecompositionGroup_iff + (v : HeightOneSpectrum (𝓞 K)) + (σ : L ≃ₐ[K] L) : + σ ∈ finitePlaceDecompositionGroup + (K := K) (L := L) v ↔ + absoluteValueExtensionConjugate + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenFinitePlaceExtension (L := L) v) σ = + chosenFinitePlaceExtension (L := L) v := by + exact + mem_absoluteValueDecompositionGroup_iff_extensionConjugate_eq + (NumberField.HeightOneSpectrum.adicAbv K v) + (RayClass.adicAbv_isNontrivial v) + (chosenFinitePlaceExtension (L := L) v) σ + +open scoped Classical in +/-- The local degree at `v`, defined using the actual algebraic +localization selected above. -/ +noncomputable def finitePlaceLocalDegree + (v : HeightOneSpectrum (𝓞 K)) : ℕ := by + let vK := + NumberField.HeightOneSpectrum.adicAbv K v + let w := + chosenFinitePlaceExtension (L := L) v + letI hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + exact + Module.finrank vK.Completion + (LocalizedCompletion vK w) + +open scoped Classical in +/-- The decomposition-group localization equivalence together with the finite-localization theorem +the finite-localization theorem: the order of the decomposition group equals the local +degree. -/ +theorem finitePlaceDecompositionGroup_card_eq_localDegree + (v : HeightOneSpectrum (𝓞 K)) : + Nat.card + (finitePlaceDecompositionGroup + (K := K) (L := L) v) = + finitePlaceLocalDegree + (K := K) (L := L) v := by + let vK := + NumberField.HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let w := + chosenFinitePlaceExtension (L := L) v + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let := + localizedCompletionGlobalAlgebra vK w + let := + localizedCompletionIsScalarTower vK w + let E := + LocalizedCompletion vK w + let : FiniteDimensional vK.Completion E := + localizedCompletionModuleFinite vK hvK w + let : IsGalois vK.Completion E := + HilbertRamification.algebraicLocalization_isGalois vK w + calc + Nat.card + (finitePlaceDecompositionGroup + (K := K) (L := L) v) = + Nat.card + (E ≃ₐ[vK.Completion] E) := + Nat.card_congr + (decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w).toEquiv + _ = Module.finrank vK.Completion E := + IsGalois.card_aut_eq_finrank + vK.Completion E + _ = finitePlaceLocalDegree + (K := K) (L := L) v := rfl + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- A finite place splits completely exactly when its decomposition +group has one element. -/ +theorem finitePlaceSplitsCompletely_iff_card_eq_one + (v : HeightOneSpectrum (𝓞 K)) : + FinitePlaceSplitsCompletely + (K := K) (L := L) v ↔ + Nat.card + (finitePlaceDecompositionGroup + (K := K) (L := L) v) = 1 := by + unfold FinitePlaceSplitsCompletely + exact + (finitePlaceDecompositionGroup + (K := K) (L := L) v).eq_bot_iff_card + +open scoped Classical in +/-- Complete splitting is equivalent to local degree one. -/ +theorem finitePlaceSplitsCompletely_iff_localDegree_eq_one + (v : HeightOneSpectrum (𝓞 K)) : + FinitePlaceSplitsCompletely + (K := K) (L := L) v ↔ + finitePlaceLocalDegree + (K := K) (L := L) v = 1 := by + rw [finitePlaceSplitsCompletely_iff_card_eq_one, + finitePlaceDecompositionGroup_card_eq_localDegree] + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- A finite place fails to split completely exactly when its +decomposition group contains a nonidentity automorphism. -/ +theorem finitePlace_not_splitsCompletely_iff_exists_nontrivial_stabilizer + (v : HeightOneSpectrum (𝓞 K)) : + ¬ FinitePlaceSplitsCompletely + (K := K) (L := L) v ↔ + ∃ σ : L ≃ₐ[K] L, + absoluteValueExtensionConjugate + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenFinitePlaceExtension (L := L) v) σ = + chosenFinitePlaceExtension (L := L) v ∧ + σ ≠ 1 := by + constructor + · intro hsplit + have hne : + finitePlaceDecompositionGroup + (K := K) (L := L) v ≠ ⊥ := + hsplit + obtain ⟨σ, hσ⟩ := + Subgroup.ne_bot_iff_exists_ne_one.mp hne + refine + ⟨σ.1, + (mem_finitePlaceDecompositionGroup_iff + (K := K) (L := L) v σ.1).mp σ.2, + ?_⟩ + intro hσOne + apply hσ + apply Subtype.ext + exact hσOne + · rintro ⟨σ, hσ, hσOne⟩ hsplit + have hmem : + σ ∈ finitePlaceDecompositionGroup + (K := K) (L := L) v := + (mem_finitePlaceDecompositionGroup_iff + (K := K) (L := L) v σ).mpr hσ + have hbot : σ ∈ + (⊥ : Subgroup (L ≃ₐ[K] L)) := by + rw [← hsplit] + exact hmem + exact hσOne (Subgroup.mem_bot.mp hbot) + +open scoped Classical in +/-- Nonsplitting is equivalently strict positivity above one of the +decomposition-group order. -/ +theorem finitePlace_not_splitsCompletely_iff_one_lt_card + (v : HeightOneSpectrum (𝓞 K)) : + ¬ FinitePlaceSplitsCompletely + (K := K) (L := L) v ↔ + 1 < Nat.card + (finitePlaceDecompositionGroup + (K := K) (L := L) v) := by + unfold FinitePlaceSplitsCompletely + exact + (finitePlaceDecompositionGroup + (K := K) (L := L) v).one_lt_card_iff_ne_bot.symm + +open scoped Classical in +/-- Nonsplitting is equivalently local degree greater than one. -/ +theorem finitePlace_not_splitsCompletely_iff_one_lt_localDegree + (v : HeightOneSpectrum (𝓞 K)) : + ¬ FinitePlaceSplitsCompletely + (K := K) (L := L) v ↔ + 1 < finitePlaceLocalDegree + (K := K) (L := L) v := by + rw [finitePlace_not_splitsCompletely_iff_one_lt_card, + finitePlaceDecompositionGroup_card_eq_localDegree] + +open scoped Classical in +/-- In a nontrivial finite Galois extension, a place whose +decomposition group is the whole Galois group cannot split +completely. This bridges the cyclic prime-power criterion, where +"nonsplit" means full decomposition group, and the normal-closure criterion. -/ +theorem finitePlace_not_splitsCompletely_of_decompositionGroup_eq_top + (hdegree : 1 < Module.finrank K L) + (v : HeightOneSpectrum (𝓞 K)) + (hfull : + finitePlaceDecompositionGroup + (K := K) (L := L) v = ⊤) : + ¬ FinitePlaceSplitsCompletely + (K := K) (L := L) v := by + intro hsplit + have htopbot : + (⊤ : Subgroup (L ≃ₐ[K] L)) = ⊥ := by + rw [← hfull] + exact hsplit + have hcard : Nat.card (L ≃ₐ[K] L) = 1 := by + have h := + congrArg + (fun H : Subgroup (L ≃ₐ[K] L) => Nat.card H) + htopbot + simpa using h + rw [IsGalois.card_aut_eq_finrank] at hcard + omega + +section IntermediateField + +variable {M : Type} + [Field M] [Algebra K M] [Algebra M L] + [IsScalarTower K M L] + +omit [NumberField K] [FiniteDimensional K L] [IsGalois K L] in +open scoped Classical in +/-- Complete splitting of a valuation over `K` remains complete +after enlarging the base to an intermediate field `M`. + +This is the subgroup-intersection criterion, +combined with injectivity of scalar restriction. -/ +theorem absoluteValueDecompositionGroup_eq_bot_over_intermediate + (w : AbsoluteValue L ℝ) + (hsplit : + absoluteValueDecompositionGroup K w = ⊥) : + absoluteValueDecompositionGroup M w = ⊥ := by + apply + ((absoluteValueDecompositionGroup M w).map_eq_bot_iff_of_injective + (decompositionGroupRestriction_restrictAutomorphismScalars_injective + (K := K) (M := M) (L := L))).mp + rw [decompositionGroupRestriction_absoluteValueDecompositionGroup_range_eq_inf + (K := K) (M := M) w] + simp [hsplit] + +end IntermediateField + +section Quotient + +open scoped Classical in +/-- The image of the finite-place decomposition subgroup in a group +quotient. In the Galois correspondence this is the decomposition +group in the corresponding intermediate extension. -/ +noncomputable def finitePlaceDecompositionGroupInQuotient + (v : HeightOneSpectrum (𝓞 K)) + (P : Subgroup (L ≃ₐ[K] L)) + [P.Normal] : + Subgroup ((L ≃ₐ[K] L) ⧸ P) := + (finitePlaceDecompositionGroup + (K := K) (L := L) v).map + (QuotientGroup.mk' P) + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- The quotient decomposition group is trivial exactly when the +original decomposition group is contained in the quotient kernel. -/ +theorem finitePlaceDecompositionGroupInQuotient_eq_bot_iff + (v : HeightOneSpectrum (𝓞 K)) + (P : Subgroup (L ≃ₐ[K] L)) + [P.Normal] : + finitePlaceDecompositionGroupInQuotient + (K := K) (L := L) v P = ⊥ ↔ + finitePlaceDecompositionGroup + (K := K) (L := L) v ≤ P := by + rw [finitePlaceDecompositionGroupInQuotient, + Subgroup.map_eq_bot_iff, + QuotientGroup.ker_mk'] + +open scoped Classical in +/-- In a cyclic extension of prime-power degree, every proper +finite-place decomposition group is contained in a normal subgroup +of index `p`; the resulting order-`p` quotient has trivial +decomposition image. This is the group/prime bridge used in +the cyclic prime-power splitting argument. -/ +theorem finitePlace_exists_index_prime_quotient_of_decompositionGroup_ne_top + [IsCyclic (L ≃ₐ[K] L)] + {p exponent : ℕ} + (hp : p.Prime) + (hexponent : 0 < exponent) + (hcard : + Nat.card (L ≃ₐ[K] L) = + p ^ exponent) + (v : HeightOneSpectrum (𝓞 K)) + (hproper : + finitePlaceDecompositionGroup + (K := K) (L := L) v ≠ ⊤) : + ∃ P : Subgroup (L ≃ₐ[K] L), + finitePlaceDecompositionGroup + (K := K) (L := L) v ≤ P ∧ + P.index = p ∧ + P.Normal ∧ + Nat.card ((L ≃ₐ[K] L) ⧸ P) = p ∧ + finitePlaceDecompositionGroupInQuotient + (K := K) (L := L) v P = ⊥ := by + obtain + ⟨P, hDP, hPindex, hPnormal, hPquotient⟩ := + cyclic_exists_normal_index_prime_supergroup + hp hexponent hcard + (finitePlaceDecompositionGroup + (K := K) (L := L) v) + hproper + refine + ⟨P, hDP, hPindex, hPnormal, + hPquotient, ?_⟩ + exact + (finitePlaceDecompositionGroupInQuotient_eq_bot_iff + (K := K) (L := L) v P).mpr hDP + +end Quotient diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean new file mode 100644 index 0000000000..55aaed458b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean @@ -0,0 +1,296 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension +/-! +# Finite-place splitting through prime ideals + +For a finite Galois extension of number fields, an exact extension of a +normalized finite absolute value and its centre prime ideal have the same +decomposition group. This file makes that comparison independent of the +chosen extension and records the finiteness of the fibres of contraction. +These are the place-theoretic ingredients used in the cyclic prime-power and +normal-closure splitting reductions. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +omit [FiniteDimensional K L] [IsGalois K L] in +open scoped Classical in +/-- The decomposition group of an exact finite-place extension is the +stabilizer of its centre prime. -/ +theorem absoluteValueDecompositionGroup_eq_finitePlaceStabilizer + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + letI := finitePlaceMulAction K L + absoluteValueDecompositionGroup K w.1 = + MulAction.stabilizer (L ≃ₐ[K] L) + (finitePlaceExtensionCentre (K := K) (L := L) v w) := by + let := finitePlaceMulAction K L + ext σ + rw [mem_absoluteValueDecompositionGroup_iff_extensionConjugate_eq + (HeightOneSpectrum.adicAbv K v) + (RayClass.adicAbv_isNontrivial v) w σ] + simp only [MulAction.mem_stabilizer_iff] + change + absoluteValueExtensionConjugate + (HeightOneSpectrum.adicAbv K v) w σ = w ↔ + finitePlaceEquiv K L σ + (finitePlaceExtensionCentre (K := K) (L := L) v w) = + finitePlaceExtensionCentre (K := K) (L := L) v w + constructor + · intro h + have hc := congrArg + (finitePlaceExtensionCentre (K := K) (L := L) v) h + rw [finitePlaceExtensionCentre_conjugate] at hc + calc + finitePlaceEquiv K L σ + (finitePlaceExtensionCentre (K := K) (L := L) v w) = + finitePlaceEquiv K L σ + (finitePlaceEquiv K L σ⁻¹ + (finitePlaceExtensionCentre (K := K) (L := L) v w)) := + congrArg (finitePlaceEquiv K L σ) hc.symm + _ = finitePlaceExtensionCentre (K := K) (L := L) v w := by + rw [← finitePlaceEquiv_mul] + simp + · intro h + apply finitePlaceExtensionCentre_injective + (K := K) (L := L) v + rw [finitePlaceExtensionCentre_conjugate] + calc + finitePlaceEquiv K L σ⁻¹ + (finitePlaceExtensionCentre (K := K) (L := L) v w) = + finitePlaceEquiv K L σ⁻¹ + (finitePlaceEquiv K L σ + (finitePlaceExtensionCentre (K := K) (L := L) v w)) := + congrArg (finitePlaceEquiv K L σ⁻¹) h.symm + _ = finitePlaceExtensionCentre (K := K) (L := L) v w := by + rw [← finitePlaceEquiv_mul] + simp + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- Complete splitting can be tested at the centre of any exact extension +of the normalized absolute value. -/ +theorem finitePlaceSplitsCompletely_iff_centre_stabilizer_eq_bot + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) : + FinitePlaceSplitsCompletely (K := K) (L := L) v ↔ + letI := finitePlaceMulAction K L + MulAction.stabilizer (L ≃ₐ[K] L) + (finitePlaceExtensionCentre (K := K) (L := L) v w) = ⊥ := by + let := finitePlaceMulAction K L + unfold FinitePlaceSplitsCompletely finitePlaceDecompositionGroup + constructor + · intro h + have hw : + absoluteValueDecompositionGroup K w.1 = ⊥ := + absoluteValueDecompositionGroup_eq_bot_independent_extension + (HeightOneSpectrum.adicAbv K v) + (RayClass.adicAbv_isNontrivial v) + (chosenFinitePlaceExtension (L := L) v) w h + rwa [absoluteValueDecompositionGroup_eq_finitePlaceStabilizer + (K := K) (L := L) v w] at hw + · intro h + have hw : + absoluteValueDecompositionGroup K w.1 = ⊥ := by + rwa [absoluteValueDecompositionGroup_eq_finitePlaceStabilizer + (K := K) (L := L) v w] + exact + absoluteValueDecompositionGroup_eq_bot_independent_extension + (HeightOneSpectrum.adicAbv K v) + (RayClass.adicAbv_isNontrivial v) + w (chosenFinitePlaceExtension (L := L) v) hw + +open scoped Classical in +/-- Complete splitting can equivalently be tested at any finite place +above the base place. -/ +theorem finitePlaceSplitsCompletely_iff_stabilizer_eq_bot + (v : HeightOneSpectrum (𝓞 K)) + (W : HeightOneSpectrum (𝓞 L)) + (hW : finitePlaceBelow (K := K) W = v) : + FinitePlaceSplitsCompletely (K := K) (L := L) v ↔ + letI := finitePlaceMulAction K L + MulAction.stabilizer (L ≃ₐ[K] L) W = ⊥ := by + let := finitePlaceMulAction K L + let Wv : + {W : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) W = v} := + ⟨W, hW⟩ + let w := + (finitePlaceExtensionEquivAbove (K := K) (L := L) v).symm Wv + have hw : + finitePlaceExtensionCentre (K := K) (L := L) v w = W := by + have happ := + (finitePlaceExtensionEquivAbove (K := K) (L := L) v).apply_symm_apply Wv + exact congrArg Subtype.val happ + rw [finitePlaceSplitsCompletely_iff_centre_stabilizer_eq_bot + (K := K) (L := L) v w, hw] + +omit [FiniteDimensional K L] [IsGalois K L] in +open scoped Classical in +/-- There are finitely many finite places of `L` above a fixed finite +place of `K`. -/ +theorem finite_finitePlaceBelow_fibre + (v : HeightOneSpectrum (𝓞 K)) : + Set.Finite + {W : HeightOneSpectrum (𝓞 L) | + finitePlaceBelow (K := K) W = v} := by + apply Set.Finite.of_finite_image + · apply + (Algebra.QuasiFinite.finite_primesOver + (R := 𝓞 K) (S := 𝓞 L) v.asIdeal).subset + · rintro I ⟨W, hW, rfl⟩ + exact + ⟨W.isPrime, ⟨(congrArg HeightOneSpectrum.asIdeal hW).symm⟩⟩ + · intro W₁ _ W₂ _ h + apply HeightOneSpectrum.ext + exact h + +omit [FiniteDimensional K L] [IsGalois K L] in +open scoped Classical in +/-- The inverse image of a finite set of base finite places under +contraction is finite. -/ +theorem Set.Finite.preimage_finitePlaceBelow + {S : Set (HeightOneSpectrum (𝓞 K))} + (hS : S.Finite) : + {W : HeightOneSpectrum (𝓞 L) | + finitePlaceBelow (K := K) W ∈ S}.Finite := by + change + ((finitePlaceBelow (K := K)) ⁻¹' S).Finite + exact hS.preimage' + (fun v _ => finite_finitePlaceBelow_fibre + (K := K) (L := L) v) + +section IntermediateField + +variable {M : Type} + [Field M] [NumberField M] + [Algebra K M] [Algebra M L] + [IsScalarTower K M L] + [IsGalois M L] + +omit [NumberField K] [NumberField M] [NumberField L] + [FiniteDimensional K L] [IsGalois K L] [IsGalois M L] in +open scoped Classical in +/-- Restricting the scalars of a Galois automorphism does not change +its action on the finite primes of the top field. -/ +theorem finitePlaceEquiv_restrictAutomorphismScalars + (σ : L ≃ₐ[M] L) + (W : HeightOneSpectrum (𝓞 L)) : + finitePlaceEquiv K L + (RamificationTheory.HilbertRamification.ValuationSubring.restrictAutomorphismScalars + (K := K) (M := M) σ) W = + finitePlaceEquiv M L σ W := by + apply HeightOneSpectrum.ext + ext x + rfl + +open scoped Classical in +/-- If a finite place splits completely in `L / K`, then every finite +place of an intermediate field above it splits completely in `L / M`. +The relation "above" is expressed canonically by ideal contraction, +so no comparison of differently normalized absolute values is needed. -/ +theorem finitePlaceSplitsCompletely_over_intermediate_of_below + (v' : HeightOneSpectrum (𝓞 M)) + (hsplit : + FinitePlaceSplitsCompletely + (K := K) (L := L) + (finitePlaceBelow (K := K) v')) : + FinitePlaceSplitsCompletely + (K := M) (L := L) v' := by + let w := + chosenFinitePlaceExtension (L := L) v' + let W := + finitePlaceExtensionCentre + (K := M) (L := L) v' w + have hWM : + finitePlaceBelow (K := M) W = v' := + finitePlaceBelow_finitePlaceExtensionCentre + (K := M) (L := L) v' w + have hWK : + finitePlaceBelow (K := K) W = + finitePlaceBelow (K := K) v' := by + rw [← finitePlaceBelow_finitePlaceBelow + (K := K) (M := M) (L := L) W, hWM] + let := finitePlaceMulAction K L + have hKbot : + MulAction.stabilizer (L ≃ₐ[K] L) W = ⊥ := + (finitePlaceSplitsCompletely_iff_stabilizer_eq_bot + (K := K) (L := L) + (finitePlaceBelow (K := K) v') W hWK).mp hsplit + let := finitePlaceMulAction M L + apply + (finitePlaceSplitsCompletely_iff_stabilizer_eq_bot + (K := M) (L := L) v' W hWM).mpr + apply le_bot_iff.mp + intro σ hσ + rw [Subgroup.mem_bot] + let ρ : L ≃ₐ[K] L := + RamificationTheory.HilbertRamification.ValuationSubring.restrictAutomorphismScalars + (K := K) (M := M) σ + have hρ : + ρ ∈ MulAction.stabilizer (L ≃ₐ[K] L) W := by + simp only [MulAction.mem_stabilizer_iff] at hσ ⊢ + change finitePlaceEquiv M L σ W = W at hσ + change finitePlaceEquiv K L ρ W = W + unfold ρ + rw [finitePlaceEquiv_restrictAutomorphismScalars + (K := K) (M := M) (L := L)] + exact hσ + have hρOne : ρ = 1 := + Subgroup.mem_bot.mp (hKbot ▸ hρ) + ext x + have hx := DFunLike.congr_fun hρOne x + change σ x = x + change σ x = x at hx + exact hx + +open scoped Classical in +/-- Finiteness of the nonsplitting finite places ascends from `K` to +an intermediate field `M`. -/ +theorem finite_nonsplittingPlaces_over_intermediate + (hfinite : + {v : HeightOneSpectrum (𝓞 K) | + ¬ FinitePlaceSplitsCompletely + (K := K) (L := L) v}.Finite) : + {v' : HeightOneSpectrum (𝓞 M) | + ¬ FinitePlaceSplitsCompletely + (K := M) (L := L) v'}.Finite := by + apply + (Set.Finite.preimage_finitePlaceBelow + (K := K) (L := M) hfinite).subset + intro v' hv' + change + ¬ FinitePlaceSplitsCompletely + (K := K) (L := L) + (finitePlaceBelow (K := K) v') + intro hsplit + exact hv' + (finitePlaceSplitsCompletely_over_intermediate_of_below + (K := K) (M := M) (L := L) v' hsplit) + +end IntermediateField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/NormalClosure.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/NormalClosure.lean new file mode 100644 index 0000000000..4c947d9a13 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/NormalClosure.lean @@ -0,0 +1,983 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure +public import Mathlib.FieldTheory.Normal.Closure +/-! +# Complete splitting and normal closures + +This file formalizes the normal-closure reduction for complete splitting. +For a finite Galois extension `M / K`, an intermediate field `L`, a +nontrivial absolute value `v` of `K`, and an extension `w` to `M`, put + +* `G = Gal(M / K)`, +* `H = Gal(M / L)`, and +* `D = D(w / v)`. + +Restriction of the conjugates of `w` gives an equivalence + +`H \ G / D ≃ { extensions of v to L }`. + +Thus the intrinsic complete-splitting condition for the possibly +non-Galois extension `L / K` is exactly the equality between the number +of double cosets and the number of left cosets. If `M` is generated by +the `K`-conjugates of `L`, then `H` has trivial normal core. +`SplittingGroupTheory` consequently forces `D = 1`, so the place splits +completely already in `M`. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification + +section AbsoluteValueExtensions + +variable {K M : Type} + [Field K] [Field M] [Algebra K M] + +open scoped Classical in +/-- Extend an actual extension of `v` from an intermediate field to the +ambient finite Galois extension. The source is the absolute-value +extension theorem, applied to the algebraic extension `M / L`. -/ +noncomputable def extendAbsoluteValueExtensionFromIntermediate + [FiniteDimensional K M] + (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) + (L : IntermediateField K M) + (u : AbsoluteValueExtension vK L) : + AbsoluteValueExtension vK M := by + let : Module.IsTorsionFree L + (absoluteValueExtensionAlgebraicCompletionClosure u.1) := + DivisionSemiring.to_moduleIsTorsionFree + let hu : u.1.IsNontrivial := + u.isNontrivial hvK + let wL : AbsoluteValueExtension u.1 M := + pullbackAbsoluteValueExtension + u.1 hu IsAlgClosed.lift + exact + { val := wL.1 + property := by + intro x + rw [IsScalarTower.algebraMap_apply K L M, + wL.2, u.2] } + +open scoped Classical in +@[simp] +theorem extendAbsoluteValueExtensionFromIntermediate_apply + [FiniteDimensional K M] + (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) + (L : IntermediateField K M) + (u : AbsoluteValueExtension vK L) + (x : L) : + (extendAbsoluteValueExtensionFromIntermediate + vK hvK L u).1 x = u.1 x := by + let : Module.IsTorsionFree L + (absoluteValueExtensionAlgebraicCompletionClosure u.1) := + DivisionSemiring.to_moduleIsTorsionFree + change + (pullbackAbsoluteValueExtension + u.1 (u.isNontrivial hvK) + IsAlgClosed.lift).1 + (algebraMap L M x) = u.1 x + exact + (pullbackAbsoluteValueExtension + u.1 (u.isNontrivial hvK) + IsAlgClosed.lift).2 x + +variable (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK M) + (L : IntermediateField K M) + +local notation "G" => M ≃ₐ[K] M +local notation "H" => L.fixingSubgroup +local notation "D" => absoluteValueDecompositionGroup K w.val + +open scoped Classical in +/-- The extension of `v` to `L` attached to a representative of +`H \ G / D`. Inversion changes the natural `D \ G / H` convention for +the right action `w ↦ w ∘ σ` into the convention used for the normal-closure reduction. -/ +noncomputable def doubleCosetExtension : + DoubleCoset.Quotient (H : Set G) D → + AbsoluteValueExtension vK L := + Quotient.lift + (fun g : G ↦ + restrictAbsoluteValueExtensionToIntermediate + vK + (absoluteValueExtensionConjugate + vK w g⁻¹) + L) + (by + intro g r hgr + change + DoubleCoset.setoid (H : Set G) (D : Set G) g r + at hgr + rw [DoubleCoset.rel_iff] at hgr + obtain ⟨h, hh, d, hd, rfl⟩ := hgr + apply Subtype.ext + ext x + change + w.1 (g⁻¹ (x : M)) = + w.1 (d⁻¹ (g⁻¹ (h⁻¹ (x : M)))) + have hhInv : h⁻¹ ∈ H := + L.fixingSubgroup.inv_mem hh + have hfix : h⁻¹ (x : M) = (x : M) := + hhInv x + rw [hfix] + have hdInv : d⁻¹ ∈ D := + (absoluteValueDecompositionGroup K w.val).inv_mem hd + have hdEq := + (mem_absoluteValueDecompositionGroup_iff_extensionConjugate_eq + vK hvK w d⁻¹).mp hdInv + have hvalue := + congrArg + (fun z : AbsoluteValueExtension vK M ↦ + z.1 (g⁻¹ (x : M))) + hdEq + exact hvalue.symm) + +open scoped Classical in +@[simp] +theorem doubleCosetExtension_mk + (g : G) : + doubleCosetExtension vK hvK w L + (DoubleCoset.mk H D g) = + restrictAbsoluteValueExtensionToIntermediate + vK + (absoluteValueExtensionConjugate + vK w g⁻¹) + L := + rfl + +open scoped Classical in +/-- Every extension of `v` to the intermediate field occurs by +restricting a conjugate of `w`. -/ +theorem doubleCosetExtension_surjective + [FiniteDimensional K M] [IsGalois K M] : + Function.Surjective + (doubleCosetExtension vK hvK w L) := by + intro u + let w' : AbsoluteValueExtension vK M := + extendAbsoluteValueExtensionFromIntermediate + vK hvK L u + obtain ⟨g : G, hg⟩ := + absoluteValueConjugacy vK hvK w w' + refine + ⟨DoubleCoset.mk H D g⁻¹, ?_⟩ + rw [doubleCosetExtension_mk] + apply Subtype.ext + ext x + change w.1 (g (x : M)) = u.1 x + have hvalue := + congrArg + (fun z : AbsoluteValueExtension vK M ↦ + z.1 (x : M)) + hg + change w'.1 (x : M) = w.1 (g (x : M)) + at hvalue + rw [← hvalue] + exact + extendAbsoluteValueExtensionFromIntermediate_apply + vK hvK L u x + +open scoped Classical in +/-- Equality after restriction to `L` is precisely equality of the +corresponding double cosets. The proof applies valuation-extension counting over +`L` and then reads the resulting `L`-automorphism as an element of +`H = Gal(M / L)`. -/ +theorem doubleCosetExtension_injective + [IsGalois K M] : + Function.Injective + (doubleCosetExtension vK hvK w L) := by + intro q r hqr + let g : G := q.out + let s : G := r.out + have hrestr : + restrictAbsoluteValueExtensionToIntermediate + vK + (absoluteValueExtensionConjugate + vK w g⁻¹) + L = + restrictAbsoluteValueExtensionToIntermediate + vK + (absoluteValueExtensionConjugate + vK w s⁻¹) + L := by + calc + _ = doubleCosetExtension vK hvK w L q := by + rw [← DoubleCoset.out_eq' q] + exact + (doubleCosetExtension_mk + vK hvK w L g).symm + _ = doubleCosetExtension vK hvK w L r := + hqr + _ = _ := by + rw [← DoubleCoset.out_eq' r] + exact + doubleCosetExtension_mk + vK hvK w L s + let u : + AbsoluteValueExtension vK L := + restrictAbsoluteValueExtensionToIntermediate + vK + (absoluteValueExtensionConjugate + vK w g⁻¹) + L + let wG : AbsoluteValueExtension u.1 M := + absoluteValueExtensionOverIntermediate + vK + (absoluteValueExtensionConjugate + vK w g⁻¹) + L + let wS : AbsoluteValueExtension u.1 M := + { val := + (absoluteValueExtensionConjugate + vK w s⁻¹).1 + property := by + intro x + have hx := + congrArg + (fun z : AbsoluteValueExtension vK L ↦ + z.1 x) + hrestr + change + w.1 (s⁻¹ (x : M)) = + w.1 (g⁻¹ (x : M)) + exact hx.symm } + let hu : u.1.IsNontrivial := + u.isNontrivial hvK + obtain ⟨η : M ≃ₐ[L] M, hη⟩ := + absoluteValueConjugacy u.1 hu wG wS + let h : G := + η.restrictScalars K + have hh : h ∈ H := by + intro x + exact η.commutes x + let d : G := + s⁻¹ * h⁻¹ * g + have hdEq : + absoluteValueExtensionConjugate + vK w d = w := by + apply Subtype.ext + ext x + have hx := + congrArg + (fun z : AbsoluteValueExtension u.1 M ↦ + z.1 (η⁻¹ (g x))) + hη + change + w.1 (s⁻¹ (η⁻¹ (g x))) = + w.1 (g⁻¹ (η (η⁻¹ (g x)))) + at hx + change + w.1 (s⁻¹ (η⁻¹ (g x))) = w.1 x + simpa using hx + have hd : d ∈ D := + (mem_absoluteValueDecompositionGroup_iff_extensionConjugate_eq + vK hvK w d).mpr hdEq + rw [← DoubleCoset.out_eq' q, + ← DoubleCoset.out_eq' r, + DoubleCoset.eq] + refine + ⟨h⁻¹, L.fixingSubgroup.inv_mem hh, + d⁻¹, + (absoluteValueDecompositionGroup K w.val).inv_mem hd, + ?_⟩ + simp [d, g, s, mul_assoc] + +open scoped Classical in +/-- The place-counting equivalence in the orientation needed for the +normal-closure reduction. -/ +noncomputable def doubleCosetExtensionEquiv + [FiniteDimensional K M] [IsGalois K M] : + DoubleCoset.Quotient (H : Set G) D ≃ + AbsoluteValueExtension vK L := + Equiv.ofBijective + (doubleCosetExtension vK hvK w L) + ⟨doubleCosetExtension_injective + vK hvK w L, + doubleCosetExtension_surjective + vK hvK w L⟩ + +end AbsoluteValueExtensions + +section CompleteSplitting + +variable {K E : Type} + [Field K] [Field E] [Algebra K E] + [FiniteDimensional K E] + +open scoped Classical in +/-- Intrinsic complete splitting for an arbitrary finite extension: +the number of actual extensions of the absolute value is the full +degree. Unlike a decomposition-group definition, this remains correct +when `E / K` is not Galois. -/ +def AbsoluteValueSplitsCompletelyInExtension + (vK : AbsoluteValue K ℝ) : Prop := + Nat.card (AbsoluteValueExtension vK E) = + Module.finrank K E + +variable [NumberField K] + +open scoped Classical in +/-- Intrinsic complete splitting of a finite place in a possibly +non-Galois finite extension. -/ +def FinitePlaceSplitsCompletelyInExtension + (v : HeightOneSpectrum (𝓞 K)) : Prop := + AbsoluteValueSplitsCompletelyInExtension + (E := E) + (NumberField.HeightOneSpectrum.adicAbv K v) + +end CompleteSplitting + +section DoubleCosetCount + +variable {K M : Type} + [Field K] [Field M] [Algebra K M] + [IsGalois K M] + +local notation "G" => M ≃ₐ[K] M + +open scoped Classical in +/-- The left-coset space `H \ G = H \ G / 1` has cardinality +`[L : K]` for `H = Gal(M / L)`. -/ +theorem leftCosetDoubleCoset_card_eq_finrank + (L : IntermediateField K M) : + Nat.card + (DoubleCoset.Quotient + (L.fixingSubgroup : Set G) + (⊥ : Subgroup G)) = + Module.finrank K L := by + calc + Nat.card + (DoubleCoset.Quotient + (L.fixingSubgroup : Set G) + (⊥ : Subgroup G)) = + Nat.card + (Quotient + (QuotientGroup.rightRel + L.fixingSubgroup)) := by + rw [DoubleCoset.right_bot_eq_right_quot] + _ = Nat.card (G ⧸ L.fixingSubgroup) := + Nat.card_congr + (QuotientGroup.quotientRightRelEquivQuotientLeftRel + L.fixingSubgroup) + _ = L.fixingSubgroup.index := + L.fixingSubgroup.index_eq_card.symm + _ = Module.finrank K L := + (IntermediateField.finrank_eq_fixingSubgroup_index + (F := K) (E' := M) L).symm + +variable [FiniteDimensional K M] + +variable (vK : AbsoluteValue K ℝ) + (w : AbsoluteValueExtension vK M) + (L : IntermediateField K M) + +open scoped Classical in +/-- Place counting plus the definition of complete +splitting: `v` splits completely in `L` exactly when the double-coset +count equals the left-coset count. -/ +theorem absoluteValueSplitsCompletelyInExtension_iff_doubleCoset_card_eq + (hvK : vK.IsNontrivial) : + AbsoluteValueSplitsCompletelyInExtension + (E := L) vK ↔ + Nat.card + (DoubleCoset.Quotient + (L.fixingSubgroup : Set G) + (absoluteValueDecompositionGroup K w.1)) = + Nat.card + (DoubleCoset.Quotient + (L.fixingSubgroup : Set G) + (⊥ : Subgroup G)) := by + unfold AbsoluteValueSplitsCompletelyInExtension + rw [Nat.card_congr + (doubleCosetExtensionEquiv + vK hvK w L), + leftCosetDoubleCoset_card_eq_finrank] + +open scoped Classical in +/-- The actual decomposition group is trivial as soon as an +intermediate field with core-free fixing subgroup is completely split. +This is the reusable source-producing form of the normal-closure +normal-closure splitting argument. -/ +theorem absoluteValueDecompositionGroup_eq_bot_of_splitsCompletelyInIntermediate + (hvK : vK.IsNontrivial) + (hcore : + L.fixingSubgroup.normalCore = ⊥) + (hsplit : + AbsoluteValueSplitsCompletelyInExtension + (E := L) vK) : + absoluteValueDecompositionGroup K w.1 = ⊥ := by + have hcard := + (absoluteValueSplitsCompletelyInExtension_iff_doubleCoset_card_eq + vK w L hvK).mp hsplit + exact + (doubleCoset_card_eq_leftCoset_iff_of_normalCore_eq_bot + L.fixingSubgroup + (absoluteValueDecompositionGroup K w.1) + hcore).mp hcard + +open scoped Classical in +/-- Fixed-field spelling of the preceding source theorem. This is the +literal `L = M^H` formulation used in the normal-closure reduction. -/ +theorem absoluteValueDecompositionGroup_eq_bot_of_splitsCompletelyInFixedField + (hvK : vK.IsNontrivial) + (H : Subgroup G) + (hcore : H.normalCore = ⊥) + (hsplit : + AbsoluteValueSplitsCompletelyInExtension + (E := IntermediateField.fixedField H) vK) : + absoluteValueDecompositionGroup K w.1 = ⊥ := by + apply + absoluteValueDecompositionGroup_eq_bot_of_splitsCompletelyInIntermediate + vK w (IntermediateField.fixedField H) + hvK + · simpa only + [IntermediateField.fixingSubgroup_fixedField H] + using hcore + · exact hsplit + +end DoubleCosetCount + +section NormalClosure + +variable {K M : Type} + [Field K] [Field M] [Algebra K M] + [FiniteDimensional K M] [IsGalois K M] + +open scoped Classical in +/-- If the conjugates of `L` generate the ambient Galois extension, +then `Gal(M / L)` is core-free. This derives the group-theoretic +normal-closure condition from the actual field-theoretic normal +closure, rather than taking it as an additional hypothesis. -/ +theorem fixingSubgroup_normalCore_eq_bot_of_normalClosure_eq_top + (L : IntermediateField K M) + (hclosure : + IntermediateField.normalClosure K L M = ⊤) : + L.fixingSubgroup.normalCore = ⊥ := by + let N : Subgroup (M ≃ₐ[K] M) := + L.fixingSubgroup.normalCore + let : N.Normal := + L.fixingSubgroup.normalCore_normal + have hLle : + L ≤ IntermediateField.fixedField N := by + rw [← IsGalois.fixedField_fixingSubgroup L] + exact + IntermediateField.fixedField_le + L.fixingSubgroup.normalCore_le + let : + IsGalois K (IntermediateField.fixedField N) := + IsGalois.of_fixedField_normal_subgroup N + have hclosureLe : + IntermediateField.normalClosure K L M ≤ + IntermediateField.fixedField N := + (IntermediateField.normalClosure_le_iff_of_normal).2 + hLle + have htop : + IntermediateField.fixedField N = ⊤ := + top_unique (hclosure ▸ hclosureLe) + change N = ⊥ + rw [← IntermediateField.fixingSubgroup_fixedField N, + htop, IntermediateField.fixingSubgroup_top] + +open scoped Classical in +/-- Class-valued normal-closure form of the preceding theorem. -/ +theorem fixingSubgroup_normalCore_eq_bot_of_isNormalClosure + (L : IntermediateField K M) + [IsNormalClosure K L M] : + L.fixingSubgroup.normalCore = ⊥ := by + apply + fixingSubgroup_normalCore_eq_bot_of_normalClosure_eq_top + L + exact + (Algebra.IsAlgebraic.isNormalClosure_iff.mp + (show IsNormalClosure K L M from inferInstance)).2 + +end NormalClosure + +section FinitePlaces + +variable {K M : Type} + [Field K] [NumberField K] + [Field M] [Algebra K M] + [FiniteDimensional K M] [IsGalois K M] + +local notation "G" => M ≃ₐ[K] M + +open scoped Classical in +/-- The double-coset criterion for an actual finite place and +the decomposition group attached to the standard chosen extension to +`M`. -/ +theorem finitePlaceSplitsCompletelyInExtension_iff_doubleCoset_card_eq + (L : IntermediateField K M) + (v : HeightOneSpectrum (𝓞 K)) : + FinitePlaceSplitsCompletelyInExtension + (K := K) (E := L) v ↔ + Nat.card + (DoubleCoset.Quotient + (L.fixingSubgroup : Set G) + (finitePlaceDecompositionGroup + (K := K) (L := M) v)) = + Nat.card + (DoubleCoset.Quotient + (L.fixingSubgroup : Set G) + (⊥ : Subgroup G)) := by + exact + absoluteValueSplitsCompletelyInExtension_iff_doubleCoset_card_eq + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenFinitePlaceExtension (L := M) v) + L + (RayClass.adicAbv_isNontrivial v) + +open scoped Classical in +/-- Literal fixed-field form: if `H` is core-free and the finite place +splits completely in `M^H`, then it splits completely in `M`. -/ +theorem finitePlaceSplitsCompletely_in_ambient_of_fixedField + (H : Subgroup G) + (hcore : H.normalCore = ⊥) + (v : HeightOneSpectrum (𝓞 K)) + (hsplit : + FinitePlaceSplitsCompletelyInExtension + (K := K) + (E := IntermediateField.fixedField H) v) : + FinitePlaceSplitsCompletely + (K := K) (L := M) v := by + exact + absoluteValueDecompositionGroup_eq_bot_of_splitsCompletelyInFixedField + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenFinitePlaceExtension (L := M) v) + (RayClass.adicAbv_isNontrivial v) + H hcore hsplit + +open scoped Classical in +/-- Source-producing normal-closure reduction for a finite place. + +The hypothesis says that `M` is generated by the `K`-conjugates of +`L`. Complete splitting in the possibly non-Galois intermediate +extension gives the double-coset cardinality equality, the normal +closure makes the fixing subgroup core-free, and the actual chosen +decomposition group in `M / K` is therefore trivial. -/ +theorem finitePlaceSplitsCompletely_in_normalClosure + (L : IntermediateField K M) + (hclosure : + IntermediateField.normalClosure K L M = ⊤) + (v : HeightOneSpectrum (𝓞 K)) + (hsplit : + FinitePlaceSplitsCompletelyInExtension + (K := K) (E := L) v) : + FinitePlaceSplitsCompletely + (K := K) (L := M) v := by + apply + absoluteValueDecompositionGroup_eq_bot_of_splitsCompletelyInIntermediate + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenFinitePlaceExtension (L := M) v) + L + (RayClass.adicAbv_isNontrivial v) + (fixingSubgroup_normalCore_eq_bot_of_normalClosure_eq_top + L hclosure) + exact hsplit + +open scoped Classical in +/-- Complete splitting ascends to an ambient field carrying the actual +`IsNormalClosure` instance. -/ +theorem finitePlaceSplitsCompletely_in_isNormalClosure + (L : IntermediateField K M) + [IsNormalClosure K L M] + (v : HeightOneSpectrum (𝓞 K)) + (hsplit : + FinitePlaceSplitsCompletelyInExtension + (K := K) (E := L) v) : + FinitePlaceSplitsCompletely + (K := K) (L := M) v := by + apply + finitePlaceSplitsCompletely_in_normalClosure + L + ((Algebra.IsAlgebraic.isNormalClosure_iff.mp + (show IsNormalClosure K L M from + inferInstance)).2) + v + exact hsplit + +open scoped Classical in +/-- The same result displayed together with the intermediate +double-coset equality that drives the proof. -/ +theorem finitePlace_normalClosure_doubleCoset_source + (L : IntermediateField K M) + (hclosure : + IntermediateField.normalClosure K L M = ⊤) + (v : HeightOneSpectrum (𝓞 K)) + (hsplit : + FinitePlaceSplitsCompletelyInExtension + (K := K) (E := L) v) : + (Nat.card + (DoubleCoset.Quotient + (L.fixingSubgroup : Set G) + (finitePlaceDecompositionGroup + (K := K) (L := M) v)) = + Nat.card + (DoubleCoset.Quotient + (L.fixingSubgroup : Set G) + (⊥ : Subgroup G))) ∧ + FinitePlaceSplitsCompletely + (K := K) (L := M) v := by + exact + ⟨(finitePlaceSplitsCompletelyInExtension_iff_doubleCoset_card_eq + L v).mp hsplit, + finitePlaceSplitsCompletely_in_normalClosure + L hclosure v hsplit⟩ + +end FinitePlaces + +section SplittingTransport + +variable + {K E E' : Type} + [Field K] + [Field E] [Algebra K E] + [Field E'] [Algebra K E'] + +open scoped Classical in +/-- Transport extensions of an absolute value through an algebra +equivalence of finite extensions. -/ +noncomputable def absoluteValueExtensionEquivOfAlgEquiv + (v : AbsoluteValue K ℝ) + (e : E ≃ₐ[K] E') : + AbsoluteValueExtension v E ≃ + AbsoluteValueExtension v E' where + toFun w := + { val := + w.1.comp (f := e.symm.toRingHom) + e.symm.injective + property := by + intro x + change w.1 (e.symm (algebraMap K E' x)) = v x + rw [e.symm.commutes] + exact w.2 x } + invFun w := + { val := + w.1.comp (f := e.toRingHom) + e.injective + property := by + intro x + change w.1 (e (algebraMap K E x)) = v x + rw [e.commutes] + exact w.2 x } + left_inv w := by + apply Subtype.ext + ext x + change w.1 (e.symm (e x)) = w.1 x + rw [e.symm_apply_apply] + right_inv w := by + apply Subtype.ext + ext x + change w.1 (e (e.symm x)) = w.1 x + rw [e.apply_symm_apply] + +variable [FiniteDimensional K E] + [FiniteDimensional K E'] + +omit [FiniteDimensional K E] [FiniteDimensional K E'] in +open scoped Classical in +/-- Intrinsic complete splitting is invariant under replacing the +extension by an isomorphic `K`-algebra. -/ +theorem absoluteValueSplitsCompletelyInExtension_algEquiv + (v : AbsoluteValue K ℝ) + (e : E ≃ₐ[K] E') : + AbsoluteValueSplitsCompletelyInExtension + (E := E) v ↔ + AbsoluteValueSplitsCompletelyInExtension + (E := E') v := by + unfold AbsoluteValueSplitsCompletelyInExtension + rw [Nat.card_congr + (absoluteValueExtensionEquivOfAlgEquiv v e), + e.toLinearEquiv.finrank_eq] + +variable [NumberField K] + +omit [FiniteDimensional K E] [FiniteDimensional K E'] in +open scoped Classical in +/-- Finite-place complete splitting is invariant under a +`K`-algebra equivalence. -/ +theorem finitePlaceSplitsCompletelyInExtension_algEquiv + (e : E ≃ₐ[K] E') + (v : HeightOneSpectrum (𝓞 K)) : + FinitePlaceSplitsCompletelyInExtension + (K := K) (E := E) v ↔ + FinitePlaceSplitsCompletelyInExtension + (K := K) (E := E') v := + absoluteValueSplitsCompletelyInExtension_algEquiv + (NumberField.HeightOneSpectrum.adicAbv K v) e + +end SplittingTransport + +section GaloisSplittingBridge + +variable + {K E : Type} + [Field K] [NumberField K] + [Field E] [Algebra K E] + [FiniteDimensional K E] + [IsGalois K E] + +open scoped Classical in +/-- For a finite Galois extension, complete splitting defined by the +chosen decomposition group is equivalent to intrinsic complete +splitting by the number of extensions of the place. -/ +theorem finitePlaceSplitsCompletely_iff_inExtension + (v : HeightOneSpectrum (𝓞 K)) : + FinitePlaceSplitsCompletely + (K := K) (L := E) v ↔ + FinitePlaceSplitsCompletelyInExtension + (K := K) (E := E) v := by + let T : IntermediateField K E := ⊤ + let e : T ≃ₐ[K] E := by + simpa only [T] using + (IntermediateField.topEquiv : + (⊤ : IntermediateField K E) ≃ₐ[K] E) + have htransport : + FinitePlaceSplitsCompletelyInExtension + (K := K) (E := T) v ↔ + FinitePlaceSplitsCompletelyInExtension + (K := K) (E := E) v := + finitePlaceSplitsCompletelyInExtension_algEquiv e v + constructor + · intro hsplit + apply htransport.mp + apply + (finitePlaceSplitsCompletelyInExtension_iff_doubleCoset_card_eq + (K := K) (M := E) T v).2 + rw [hsplit] + · intro hsplit + have hcard := + (finitePlaceSplitsCompletelyInExtension_iff_doubleCoset_card_eq + (K := K) (M := E) T v).mp + (htransport.mpr hsplit) + change + finitePlaceDecompositionGroup + (K := K) (L := E) v = + ⊥ + exact + (doubleCoset_card_eq_leftCoset_iff_of_normalCore_eq_bot + T.fixingSubgroup + (finitePlaceDecompositionGroup + (K := K) (L := E) v) + (by + simpa only + [T, IntermediateField.fixingSubgroup_top] + using + (Subgroup.normalCore_eq_self + (⊥ : Subgroup (E ≃ₐ[K] E))))).mp hcard + +end GaloisSplittingBridge + +section SplittingThroughRestriction + +variable + {K E N : Type} + [Field K] [NumberField K] + [Field E] [Algebra K E] + [FiniteDimensional K E] [IsGalois K E] + [Field N] [Algebra K N] [Algebra E N] + [IsScalarTower K E N] + [FiniteDimensional K N] [IsGalois K N] + +omit [FiniteDimensional K N] in +open scoped Classical in +/-- If the decomposition group upstairs acts trivially on a normal +subextension, then the finite place splits completely in that +subextension. -/ +theorem + finitePlaceSplitsCompletely_of_decompositionGroup_le_restrictNormalHom_ker + (v : HeightOneSpectrum (𝓞 K)) + (h : + finitePlaceDecompositionGroup (K := K) (L := N) v ≤ + (AlgEquiv.restrictNormalHom + (F := K) (K₁ := N) (E := E)).ker) : + FinitePlaceSplitsCompletely (K := K) (L := E) v := by + let M : IntermediateField K N := + (IsScalarTower.toAlgHom K E N).fieldRange + let e : E ≃ₐ[K] M := + (IsScalarTower.toAlgHom K E N).equivFieldRange + let : FiniteDimensional K M := + e.toLinearEquiv.finiteDimensional + let : IsGalois K M := + IsGalois.of_algEquiv e + let vK := + NumberField.HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let wN := + chosenFinitePlaceExtension (L := N) v + let wM := + restrictAbsoluteValueExtensionToIntermediate + vK wN M + have hFix : + finitePlaceDecompositionGroup (K := K) (L := N) v ≤ + M.fixingSubgroup := by + intro sigma hsigma + rw [IntermediateField.mem_fixingSubgroup_iff] + intro y hy + rcases hy with ⟨x, rfl⟩ + have hsigmaKer : + AlgEquiv.restrictNormalHom + (F := K) (K₁ := N) (E := E) sigma = + 1 := + MonoidHom.mem_ker.mp (h hsigma) + have hx : + sigma.restrictNormal E x = x := by + change + (AlgEquiv.restrictNormalHom + (F := K) (K₁ := N) (E := E) sigma) x = + (1 : Gal(E/K)) x + rw [hsigmaKer] + calc + sigma (algebraMap E N x) = + algebraMap E N (sigma.restrictNormal E x) := + (AlgEquiv.restrictNormal_commutes sigma E x).symm + _ = algebraMap E N x := + congrArg (algebraMap E N) hx + have hMap : + (finitePlaceDecompositionGroup + (K := K) (L := N) v).map + (AlgEquiv.restrictNormalHom + (F := K) (K₁ := N) M) = + ⊥ := by + rw [Subgroup.map_eq_bot_iff, + IntermediateField.restrictNormalHom_ker] + exact hFix + have hwMbot : + absoluteValueDecompositionGroup K wM.1 = ⊥ := by + change + absoluteValueDecompositionGroup K + (wN.1.comp (f := algebraMap M N) + (algebraMap M N).injective) = ⊥ + rw [← absoluteValueDecompositionGroup_map_restrictNormalHom + (M := M) vK hvK wN] + exact hMap + have hM : + FinitePlaceSplitsCompletely + (K := K) (L := M) v := by + change + absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := M) v).1 = + ⊥ + exact + absoluteValueDecompositionGroup_eq_bot_independent_extension + vK hvK wM + (chosenFinitePlaceExtension (L := M) v) + hwMbot + have hMIntrinsic : + FinitePlaceSplitsCompletelyInExtension + (K := K) (E := M) v := + (finitePlaceSplitsCompletely_iff_inExtension + (K := K) (E := M) v).mp hM + have hEIntrinsic : + FinitePlaceSplitsCompletelyInExtension + (K := K) (E := E) v := + (finitePlaceSplitsCompletelyInExtension_algEquiv e v).mpr + hMIntrinsic + exact + (finitePlaceSplitsCompletely_iff_inExtension + (K := K) (E := E) v).mpr hEIntrinsic + +end SplittingThroughRestriction + +section FiniteNormalClosure + +variable + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + +open scoped Classical in +/-- The fixing subgroup of the distinguished copy of `L` is +core-free in the Galois group of its finite normal closure. -/ +theorem finiteNormalClosureOriginalField_fixingSubgroup_normalCore : + (finiteNormalClosureOriginalField K L).fixingSubgroup.normalCore = + ⊥ := by + exact + fixingSubgroup_normalCore_eq_bot_of_normalClosure_eq_top + (finiteNormalClosureOriginalField K L) + (finiteNormalClosureOriginalField_normalClosure_eq_top K L) + +open scoped Classical in +/-- Complete splitting in the original extension forces complete +splitting in its finite normal closure. -/ +theorem finitePlaceSplitsCompletely_in_finiteNormalClosure + (v : HeightOneSpectrum (𝓞 K)) + (hsplit : + FinitePlaceSplitsCompletelyInExtension + (K := K) + (E := finiteNormalClosureOriginalField K L) v) : + FinitePlaceSplitsCompletely + (K := K) (L := finiteNormalClosure K L) v := by + exact + finitePlaceSplitsCompletely_in_normalClosure + (finiteNormalClosureOriginalField K L) + (finiteNormalClosureOriginalField_normalClosure_eq_top K L) + v hsplit + +open scoped Classical in +/-- If only finitely many finite places fail to split completely in +`L`, the same is true in the finite normal closure. -/ +theorem finite_nonSplittingPlaces_finiteNormalClosure + (hfinite : + {v : HeightOneSpectrum (𝓞 K) | + ¬ FinitePlaceSplitsCompletelyInExtension + (K := K) + (E := finiteNormalClosureOriginalField K L) v}.Finite) : + {v : HeightOneSpectrum (𝓞 K) | + ¬ FinitePlaceSplitsCompletely + (K := K) (L := finiteNormalClosure K L) v}.Finite := by + apply hfinite.subset + intro v hv hsplit + exact hv + (finitePlaceSplitsCompletely_in_finiteNormalClosure + K L v hsplit) + +open scoped Classical in +/-- Finiteness of the nonsplitting set in the original field +transports to its distinguished copy in the finite normal closure. -/ +theorem finite_nonSplittingPlaces_originalField + (hfinite : + {v : HeightOneSpectrum (𝓞 K) | + ¬ FinitePlaceSplitsCompletelyInExtension + (K := K) (E := L) v}.Finite) : + {v : HeightOneSpectrum (𝓞 K) | + ¬ FinitePlaceSplitsCompletelyInExtension + (K := K) + (E := finiteNormalClosureOriginalField K L) v}.Finite := by + simpa only [ + finitePlaceSplitsCompletelyInExtension_algEquiv + (finiteNormalClosureOriginalFieldEquiv K L)] using hfinite + +open scoped Classical in +/-- Finiteness of the nonsplitting set in `L / K` implies finiteness +of the nonsplitting set in its finite normal closure. -/ +theorem finite_nonSplittingPlaces_normalClosure_of_original + (hfinite : + {v : HeightOneSpectrum (𝓞 K) | + ¬ FinitePlaceSplitsCompletelyInExtension + (K := K) (E := L) v}.Finite) : + {v : HeightOneSpectrum (𝓞 K) | + ¬ FinitePlaceSplitsCompletely + (K := K) (L := finiteNormalClosure K L) v}.Finite := + finite_nonSplittingPlaces_finiteNormalClosure K L + (finite_nonSplittingPlaces_originalField K L hfinite) + +end FiniteNormalClosure diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/PrimeOrderFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/PrimeOrderFixedField.lean new file mode 100644 index 0000000000..a2dd44f7d6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/PrimeOrderFixedField.lean @@ -0,0 +1,326 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.NormalClosure +/-! +# Prime-order fixed fields and complete splitting + +This file formalizes a prime-order fixed-field reduction. +From a nontrivial finite Galois extension `L / K` we choose an +automorphism `σ` of prime order `p` and form + +`K' = L ^ ⟨σ⟩`. + +The extension `L / K'` is an actual cyclic Galois extension of prime +degree. We also prove the finite-place bridge used immediately before +applying the cyclic prime-power splitting criterion: if a finite place of `K` splits completely + in `L` +and a finite place of `K'` lies above it, then the latter splits +completely in `L / K'`. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification + +section PrimeOrderConstruction + +variable {K L : Type} + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +local notation "G" => L ≃ₐ[K] L + +open scoped Classical in +/-- A nontrivial finite Galois extension has an automorphism of prime +order. Nontriviality is supplied by the actual degree inequality. -/ +theorem exists_prime_order_automorphism_of_one_lt_finrank + (hdegree : 1 < Module.finrank K L) : + ∃ (p : ℕ) (σ : G), + p.Prime ∧ orderOf σ = p := by + have hcard : 1 < Nat.card G := by + rw [IsGalois.card_aut_eq_finrank K L] + exact hdegree + let : Nontrivial G := + Finite.one_lt_card_iff_nontrivial.mp hcard + exact exists_element_of_prime_order G + +open scoped Classical in +/-- The chosen prime order in the nontrivial Galois group. -/ +noncomputable def fixedFieldPrime + (hdegree : 1 < Module.finrank K L) : ℕ := + (exists_prime_order_automorphism_of_one_lt_finrank + (K := K) (L := L) hdegree).choose + +open scoped Classical in +/-- The chosen automorphism of prime order. -/ +noncomputable def primeOrderAutomorphism + (hdegree : 1 < Module.finrank K L) : G := + (exists_prime_order_automorphism_of_one_lt_finrank + (K := K) (L := L) hdegree).choose_spec.choose + +open scoped Classical in +theorem fixedFieldPrime_prime + (hdegree : 1 < Module.finrank K L) : + (fixedFieldPrime + (K := K) (L := L) hdegree).Prime := + (exists_prime_order_automorphism_of_one_lt_finrank + (K := K) (L := L) hdegree).choose_spec.choose_spec.1 + +open scoped Classical in +theorem primeOrderAutomorphism_orderOf + (hdegree : 1 < Module.finrank K L) : + orderOf + (primeOrderAutomorphism + (K := K) (L := L) hdegree) = + fixedFieldPrime + (K := K) (L := L) hdegree := + (exists_prime_order_automorphism_of_one_lt_finrank + (K := K) (L := L) hdegree).choose_spec.choose_spec.2 + +open scoped Classical in +/-- The cyclic subgroup generated by the chosen prime-order +automorphism. -/ +noncomputable def primeOrderSubgroup + (hdegree : 1 < Module.finrank K L) : + Subgroup G := + Subgroup.zpowers + (primeOrderAutomorphism + (K := K) (L := L) hdegree) + +open scoped Classical in +theorem primeOrderSubgroup_card + (hdegree : 1 < Module.finrank K L) : + Nat.card + (primeOrderSubgroup + (K := K) (L := L) hdegree) = + fixedFieldPrime + (K := K) (L := L) hdegree := by + rw [primeOrderSubgroup, Nat.card_zpowers, + primeOrderAutomorphism_orderOf] + +open scoped Classical in +/-- The actual intermediate field `K' = L ^ ⟨σ⟩`. -/ +noncomputable def primeOrderFixedField + (hdegree : 1 < Module.finrank K L) : + IntermediateField K L := + IntermediateField.fixedField + (primeOrderSubgroup + (K := K) (L := L) hdegree) + +open scoped Classical in +/-- The ambient field is Galois over the fixed field of the chosen +finite subgroup. -/ +noncomputable instance primeOrderFixedField_isGalois + (hdegree : 1 < Module.finrank K L) : + IsGalois + (primeOrderFixedField + (K := K) (L := L) hdegree) + L := by + unfold primeOrderFixedField + exact + IsGalois.of_fixed_field L + (primeOrderSubgroup + (K := K) (L := L) hdegree) + +open scoped Classical in +/-- The constructed relative extension has prime degree `p`. -/ +theorem primeOrderFixedField_finrank + (hdegree : 1 < Module.finrank K L) : + Module.finrank + (primeOrderFixedField + (K := K) (L := L) hdegree) + L = + fixedFieldPrime + (K := K) (L := L) hdegree := by + unfold primeOrderFixedField + rw [IntermediateField.finrank_fixedField_eq_card, + primeOrderSubgroup_card] + +open scoped Classical in +/-- The relative Galois group is cyclic, transported from the +generating subgroup through the finite Galois correspondence. -/ +noncomputable instance primeOrderFixedField_isCyclic + (hdegree : 1 < Module.finrank K L) : + IsCyclic + (L ≃ₐ[primeOrderFixedField + (K := K) (L := L) hdegree] L) := by + let P := + primeOrderSubgroup + (K := K) (L := L) hdegree + have hP : IsCyclic P := by + dsimp [P, primeOrderSubgroup] + exact + Subgroup.isCyclic_zpowers + (primeOrderAutomorphism + (K := K) (L := L) hdegree) + exact + (IntermediateField.subgroupEquivAlgEquiv P).isCyclic.mp + hP + +open scoped Classical in +/-- The order of the relative Galois group is the chosen prime. In +particular it is a prime-power order with exponent one, exactly the +input expected by the cyclic prime-power splitting criterion. -/ +theorem primeOrderFixedField_card_aut + (hdegree : 1 < Module.finrank K L) : + Nat.card + (L ≃ₐ[primeOrderFixedField + (K := K) (L := L) hdegree] L) = + fixedFieldPrime + (K := K) (L := L) hdegree := by + rw [IsGalois.card_aut_eq_finrank, + primeOrderFixedField_finrank] + +end PrimeOrderConstruction + +section FinitePlaceAscent + +variable {K M : Type} + [Field K] [NumberField K] + [Field M] [NumberField M] + [Algebra K M] + +open scoped Classical in +/-- A finite place of `M` lies above a finite place of `K` when its +normalized adic absolute value is an exact extension. -/ +def FinitePlaceLiesAbove + (v : HeightOneSpectrum (𝓞 K)) + (v' : HeightOneSpectrum (𝓞 M)) : Prop := + AbsoluteValue.Extends + (NumberField.HeightOneSpectrum.adicAbv K v) + (NumberField.HeightOneSpectrum.adicAbv M v') + +variable {L : Type} + [Field L] [NumberField L] + [Algebra K L] [Algebra M L] + [IsScalarTower K M L] + [FiniteDimensional K L] [IsGalois K L] + [IsGalois M L] + +omit [NumberField L] [FiniteDimensional K L] in +open scoped Classical in +/-- Complete splitting ascends from a base finite place to every +finite place of an intermediate field lying above it. + +The proof uses the chosen extension above `v'`, regards it as an +extension above `v`, changes from the standard chosen extension over +`K` by valuation-extension counting, and finally restricts the trivial +decomposition group from `K` to `M`. -/ +theorem finitePlaceSplitsCompletely_over_intermediate_of_liesAbove + (v : HeightOneSpectrum (𝓞 K)) + (v' : HeightOneSpectrum (𝓞 M)) + (hAbove : FinitePlaceLiesAbove (K := K) (M := M) v v') + (hsplit : + FinitePlaceSplitsCompletely + (K := K) (L := L) v) : + FinitePlaceSplitsCompletely + (K := M) (L := L) v' := by + let vK := + NumberField.HeightOneSpectrum.adicAbv K v + let vM := + NumberField.HeightOneSpectrum.adicAbv M v' + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let wM : AbsoluteValueExtension vM L := + chosenFinitePlaceExtension (L := L) v' + let wK : AbsoluteValueExtension vK L := + { val := wM.1 + property := by + intro x + rw [IsScalarTower.algebraMap_apply K M L, + wM.2] + exact hAbove x } + have hKbot : + absoluteValueDecompositionGroup K wK.1 = ⊥ := by + exact + absoluteValueDecompositionGroup_eq_bot_independent_extension + vK hvK + (chosenFinitePlaceExtension (L := L) v) + wK hsplit + change + absoluteValueDecompositionGroup M wM.1 = ⊥ + exact + absoluteValueDecompositionGroup_eq_bot_over_intermediate + (K := K) (M := M) (L := L) + wM.1 hKbot + +end FinitePlaceAscent + +section PrimeOrderFinitePlaces + +variable {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] + [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +omit [NumberField K] [NumberField L] in +open scoped Classical in +/-- The chosen fixed field supplies all algebraic data needed to apply +the cyclic prime-power case with exponent one. -/ +theorem primeOrderFixedField_threeSeven_data + (hdegree : 1 < Module.finrank K L) : + let K' := + primeOrderFixedField + (K := K) (L := L) hdegree + let p := + fixedFieldPrime + (K := K) (L := L) hdegree + p.Prime ∧ + IsGalois K' L ∧ + IsCyclic (L ≃ₐ[K'] L) ∧ + Nat.card (L ≃ₐ[K'] L) = p := by + dsimp + exact + ⟨fixedFieldPrime_prime + (K := K) (L := L) hdegree, + inferInstance, + inferInstance, + primeOrderFixedField_card_aut + (K := K) (L := L) hdegree⟩ + +open scoped Classical in +/-- The finite-place ascent bridge specialized to the chosen +prime-order fixed field `K'`. -/ +theorem finitePlaceSplitsCompletely_over_primeOrderFixedField_of_liesAbove + (hdegree : 1 < Module.finrank K L) + (v : HeightOneSpectrum (𝓞 K)) + (v' : + HeightOneSpectrum + (𝓞 (primeOrderFixedField + (K := K) (L := L) hdegree))) + (hAbove : + FinitePlaceLiesAbove + (K := K) + (M := primeOrderFixedField + (K := K) (L := L) hdegree) + v v') + (hsplit : + FinitePlaceSplitsCompletely + (K := K) (L := L) v) : + FinitePlaceSplitsCompletely + (K := primeOrderFixedField + (K := K) (L := L) hdegree) + (L := L) v' := by + exact + finitePlaceSplitsCompletely_over_intermediate_of_liesAbove + (K := K) + (M := primeOrderFixedField + (K := K) (L := L) hdegree) + (L := L) + v v' hAbove hsplit + +end PrimeOrderFinitePlaces diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/UnramifiedRationals.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/UnramifiedRationals.lean new file mode 100644 index 0000000000..2e6b23cf76 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/UnramifiedRationals.lean @@ -0,0 +1,64 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.NumberField.Discriminant.Different +/-! +# No nontrivial everywhere-unramified extension of ℚ + +The global Kronecker--Weber argument forms a fixed field which is unramified +at every finite prime. Minkowski's +discriminant bound to show that this field is ℚ. This file records that +source theorem directly in terms of the local unramified predicates on the +prime ideals of the ring of integers. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory.Ramification + +open NumberField + +/-- A number field unramified at every prime over ℤ has degree one over ℚ. + +The proof first shows that its different ideal is the unit ideal. Its +absolute discriminant therefore has absolute value one, while the +Hermite--Minkowski bound says that every number field of degree greater than +one has absolute discriminant greater than two. -/ +theorem numberField_finrank_eq_one_of_forall_isUnramifiedAt + (K : Type*) [Field K] [NumberField K] + (hunramified : ∀ (P : Ideal (𝓞 K)) [P.IsPrime], + Algebra.IsUnramifiedAt ℤ P) : + Module.finrank ℚ K = 1 := by + have hdiff : differentIdeal ℤ (𝓞 K) = ⊤ := by + by_contra hne + obtain ⟨P, hPmax, hle⟩ := Ideal.exists_le_maximal + (differentIdeal ℤ (𝓞 K)) hne + let : P.IsPrime := hPmax.isPrime + have hdvd : P ∣ differentIdeal ℤ (𝓞 K) := + Ideal.dvd_iff_le.mpr hle + have hramified : ¬ Algebra.IsUnramifiedAt ℤ P := + dvd_differentIdeal_iff.mp hdvd + exact hramified (hunramified P) + have hdiscr : (discr K).natAbs = 1 := by + rw [← absNorm_differentIdeal K (𝓞 K), hdiff] + exact Ideal.absNorm_top + have hle : Module.finrank ℚ K ≤ 1 := by + by_contra hnot + have hgt := abs_discr_gt_two (K := K) (by omega) + have habs : |discr K| = 1 := by + rcases Int.natAbs_eq_iff.mp hdiscr with h | h + · simp [h] + · simp [h] + omega + have hpos : 0 < Module.finrank ℚ K := Module.finrank_pos + omega + +end AlgebraicNumberTheory.Ramification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass.lean new file mode 100644 index 0000000000..7a30b7d344 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass.lean @@ -0,0 +1,24 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.FullModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.IdealNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.LocalConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Narrow +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.OrdinaryClassGroupComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PublicHigherUnitComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/All.lean new file mode 100644 index 0000000000..5aa54ea5d4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/All.lean @@ -0,0 +1,27 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.FullModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.IdealNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.LocalConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Narrow +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.OrdinaryClassGroupComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PublicHigherUnitComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +/-! +# Ray class groups + +Public aggregate for approximation, congruence subgroups, and ray class +groups of number fields. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Approximation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Approximation.lean new file mode 100644 index 0000000000..0073f6d5d2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Approximation.lean @@ -0,0 +1,517 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal +/-! +# Multiplicative weak approximation for ideles + +This file extracts the simultaneous approximation statement needed for ray +class groups. At finitely many +finite places one may prescribe an arbitrary open multiplicative coset and +move a given idele into all of those cosets by a single principal idele. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + + +variable {K : Type*} [Field K] [NumberField K] + +namespace IdeleGroup + +open scoped Classical in +/-- The full modulus whose finite part has exponent one exactly at the places +of a finite set and whose infinite part is empty. It lets the ray-class +approximation space serve as an arbitrary finite-place approximation space. -/ +noncomputable def modulusOfFinset + (S : Finset (HeightOneSpectrum (𝓞 K))) : + RayClass.Modulus K := by + classical + exact RayClass.Modulus.ofFinite + (Finsupp.onFinset S + (fun v => if v ∈ S then 1 else 0) + (by + intro v hv + simpa using hv)) + +open scoped Classical in +@[simp] +theorem modulusOfFinset_apply + (S : Finset (HeightOneSpectrum (𝓞 K))) + (v : HeightOneSpectrum (𝓞 K)) : + (modulusOfFinset S).finitePart v = if v ∈ S then 1 else 0 := by + classical + rfl + +open scoped Classical in +@[simp] +theorem modulusOfFinset_support + (S : Finset (HeightOneSpectrum (𝓞 K))) : + (modulusOfFinset S).finitePart.support = S := by + classical + ext v + simp [modulusOfFinset, RayClass.Modulus.ofFinite] + +open scoped Classical in +/-- The product of the prescribed finite local cosets and harmless +nonzero cosets at the infinite places. The latter ensure that the global +approximating element is nonzero. -/ +def openLocalCosetTarget + (m : RayClass.Modulus K) (a : IdeleGroup K) + (U : ∀ v : ↥m.finitePart.support, + Subgroup (v.1.adicCompletion K)ˣ) : + ∀ i : RayClass.ApproximationPlace m, + Set (RayClass.approximationCompletion m i) + | Sum.inl v => RayClass.unitRatioSet (a.2 v.1) (U v) + | Sum.inr w => + RayClass.unitRatioSet + (ContinuousMulEquiv.piUnits a.1 w) ⊤ + +open scoped Classical in +/-- Every coordinate of `openLocalCosetTarget` is open. -/ +theorem isOpen_openLocalCosetTarget + (m : RayClass.Modulus K) (a : IdeleGroup K) + (U : ∀ v : ↥m.finitePart.support, + Subgroup (v.1.adicCompletion K)ˣ) + (hU : ∀ v, IsOpen (U v : Set (v.1.adicCompletion K)ˣ)) : + ∀ i, IsOpen (openLocalCosetTarget m a U i) + | Sum.inl v => by + change IsOpen (RayClass.unitRatioSet (a.2 v.1) (U v)) + exact RayClass.isOpen_unitRatioSet _ _ (hU v) + | Sum.inr w => by + change IsOpen + (RayClass.unitRatioSet + (ContinuousMulEquiv.piUnits a.1 w) ⊤) + exact RayClass.isOpen_unitRatioSet _ _ isOpen_univ + +open scoped Classical in +/-- The given idele supplies a point in the product of the prescribed +local cosets. -/ +def openLocalCosetTargetPoint + (m : RayClass.Modulus K) (a : IdeleGroup K) : + (i : RayClass.ApproximationPlace m) → + RayClass.approximationCompletion m i + | Sum.inl v => (a.2 v.1 : v.1.adicCompletion K) + | Sum.inr w => + (ContinuousMulEquiv.piUnits a.1 w : w.Completion) + +open scoped Classical in +/-- The target product used for multiplicative weak approximation is +nonempty. -/ +theorem openLocalCosetTargetPoint_mem + (m : RayClass.Modulus K) (a : IdeleGroup K) + (U : ∀ v : ↥m.finitePart.support, + Subgroup (v.1.adicCompletion K)ˣ) : + openLocalCosetTargetPoint m a ∈ + Set.univ.pi (openLocalCosetTarget m a U) := by + intro i _hi + cases i with + | inl v => + exact RayClass.val_mem_unitRatioSet _ _ + | inr w => + exact RayClass.val_mem_unitRatioSet _ _ + +open scoped Classical in +/-- Multiplicative weak approximation at finitely many finite places. + +For arbitrary open subgroups `U_v ≤ K_vˣ` and an idele `a`, a single +global element `x ∈ Kˣ` makes every local quotient `a_v / x` lie in +`U_v`. This is the precise approximation input in the proof of +the cyclic prime-power norm argument, and it is also used in roots-of-unity descent. -/ +theorem exists_principal_quotient_mem_openLocalSubgroups + (m : RayClass.Modulus K) (a : IdeleGroup K) + (U : ∀ v : ↥m.finitePart.support, + Subgroup (v.1.adicCompletion K)ˣ) + (hU : ∀ v, IsOpen (U v : Set (v.1.adicCompletion K)ˣ)) : + ∃ x : Kˣ, ∀ v : ↥m.finitePart.support, + a.2 v.1 * + ((principalIdele K x).2 v.1)⁻¹ ∈ U v := by + let W : Set + ((i : RayClass.ApproximationPlace m) → + RayClass.approximationCompletion m i) := + Set.univ.pi (openLocalCosetTarget m a U) + have hWOpen : IsOpen W := by + exact isOpen_set_pi Set.finite_univ fun i _hi => + isOpen_openLocalCosetTarget m a U hU i + have hWNonempty : W.Nonempty := + ⟨openLocalCosetTargetPoint m a, + openLocalCosetTargetPoint_mem m a U⟩ + obtain ⟨x, hx⟩ := + (RayClass.denseRange_approximationEmbedding m).exists_mem_open + hWOpen hWNonempty + let w₀ : InfinitePlace K := Classical.choice inferInstance + have hxw₀ := + hx (Sum.inr w₀) (Set.mem_univ (Sum.inr w₀)) + change + (x : w₀.Completion) ∈ + RayClass.unitRatioSet + (ContinuousMulEquiv.piUnits a.1 w₀) ⊤ at hxw₀ + obtain ⟨y₀, _hy₀, hy₀x⟩ := hxw₀ + have hx0 : x ≠ 0 := by + intro hxzero + apply Units.ne_zero y₀ + rw [hy₀x, hxzero, + NumberField.InfinitePlace.Completion.coe_zero] + let xu : Kˣ := Units.mk0 x hx0 + refine ⟨xu, ?_⟩ + intro v + have hvx := + hx (Sum.inl v) (Set.mem_univ (Sum.inl v)) + change + FinitePlace.embedding v.1 x ∈ + RayClass.unitRatioSet (a.2 v.1) (U v) at hvx + obtain ⟨y, hy, hyx⟩ := hvx + have hprincipal : + (principalIdele K xu).2 v.1 = y := by + apply Units.ext + calc + (((principalIdele K xu).2 v.1 : + (v.1.adicCompletion K)ˣ) : + v.1.adicCompletion K) = + (xu : K) := + finiteComponent_principalIdele xu v.1 + _ = (x : K) := rfl + _ = (y : v.1.adicCompletion K) := hyx.symm + rw [hprincipal] + exact hy + +open scoped Classical in +/-- Finset-indexed form of multiplicative weak approximation. -/ +theorem exists_principal_quotient_mem_openLocalSubgroups_finset + (S : Finset (HeightOneSpectrum (𝓞 K))) (a : IdeleGroup K) + (U : ∀ v : ↥S, Subgroup (v.1.adicCompletion K)ˣ) + (hU : ∀ v, IsOpen (U v : Set (v.1.adicCompletion K)ˣ)) : + ∃ x : Kˣ, ∀ v : ↥S, + a.2 v.1 * + ((principalIdele K x).2 v.1)⁻¹ ∈ U v := by + let m : RayClass.Modulus K := modulusOfFinset S + have hm : m.finitePart.support = S := by + simp [m] + let U' : ∀ v : ↥m.finitePart.support, + Subgroup (v.1.adicCompletion K)ˣ := + fun v => U ⟨v.1, hm ▸ v.2⟩ + have hU' : + ∀ v, IsOpen (U' v : Set (v.1.adicCompletion K)ˣ) := + fun v => hU ⟨v.1, hm ▸ v.2⟩ + obtain ⟨x, hx⟩ := + exists_principal_quotient_mem_openLocalSubgroups + m a U' hU' + refine ⟨x, ?_⟩ + intro v + have hv : v.1 ∈ m.finitePart.support := hm.symm ▸ v.2 + exact hx ⟨v.1, hv⟩ + +open scoped Classical in +/-- The product of prescribed open multiplicative cosets at every +archimedean place and at the finite places in a modulus. -/ +def openAllLocalCosetTarget + (m : RayClass.Modulus K) (a : IdeleGroup K) + (U : ∀ v : ↥m.finitePart.support, + Subgroup (v.1.adicCompletion K)ˣ) + (V : ∀ w : InfinitePlace K, + Subgroup w.Completionˣ) : + ∀ i : RayClass.ApproximationPlace m, + Set (RayClass.approximationCompletion m i) + | Sum.inl v => RayClass.unitRatioSet (a.2 v.1) (U v) + | Sum.inr w => + RayClass.unitRatioSet + (IdeleGroup.infiniteComponent w a) (V w) + +open scoped Classical in +/-- Every coordinate of the all-place multiplicative target is open. -/ +theorem isOpen_openAllLocalCosetTarget + (m : RayClass.Modulus K) (a : IdeleGroup K) + (U : ∀ v : ↥m.finitePart.support, + Subgroup (v.1.adicCompletion K)ˣ) + (V : ∀ w : InfinitePlace K, + Subgroup w.Completionˣ) + (hU : ∀ v, IsOpen + (U v : Set (v.1.adicCompletion K)ˣ)) + (hV : ∀ w, IsOpen + (V w : Set w.Completionˣ)) : + ∀ i, IsOpen + (openAllLocalCosetTarget m a U V i) + | Sum.inl v => by + change IsOpen + (RayClass.unitRatioSet (a.2 v.1) (U v)) + exact RayClass.isOpen_unitRatioSet _ _ (hU v) + | Sum.inr w => by + change IsOpen + (RayClass.unitRatioSet + (IdeleGroup.infiniteComponent w a) (V w)) + exact RayClass.isOpen_unitRatioSet _ _ (hV w) + +open scoped Classical in +/-- The given idele supplies a point in the simultaneous all-place +multiplicative target. -/ +theorem openLocalCosetTargetPoint_mem_all + (m : RayClass.Modulus K) (a : IdeleGroup K) + (U : ∀ v : ↥m.finitePart.support, + Subgroup (v.1.adicCompletion K)ˣ) + (V : ∀ w : InfinitePlace K, + Subgroup w.Completionˣ) : + openLocalCosetTargetPoint m a ∈ + Set.univ.pi + (openAllLocalCosetTarget m a U V) := by + intro i _hi + cases i with + | inl v => + exact RayClass.val_mem_unitRatioSet _ _ + | inr w => + exact RayClass.val_mem_unitRatioSet _ _ + +open scoped Classical in +/-- Multiplicative weak approximation simultaneously at all +archimedean places and at the finite support of a modulus. + +For prescribed open subgroups `U_v ≤ K_vˣ` and +`V_w ≤ K_wˣ`, one global `x ∈ Kˣ` makes every quotient +`a_v / x` lie in the corresponding subgroup. -/ +theorem exists_principal_quotient_mem_openAllLocalSubgroups + (m : RayClass.Modulus K) (a : IdeleGroup K) + (U : ∀ v : ↥m.finitePart.support, + Subgroup (v.1.adicCompletion K)ˣ) + (V : ∀ w : InfinitePlace K, + Subgroup w.Completionˣ) + (hU : ∀ v, IsOpen + (U v : Set (v.1.adicCompletion K)ˣ)) + (hV : ∀ w, IsOpen + (V w : Set w.Completionˣ)) : + ∃ x : Kˣ, + (∀ v : ↥m.finitePart.support, + a.2 v.1 * + ((principalIdele K x).2 v.1)⁻¹ ∈ U v) ∧ + (∀ w : InfinitePlace K, + IdeleGroup.infiniteComponent w a * + (IdeleGroup.infiniteComponent w + (principalIdele K x))⁻¹ ∈ V w) := by + let W : Set + ((i : RayClass.ApproximationPlace m) → + RayClass.approximationCompletion m i) := + Set.univ.pi (openAllLocalCosetTarget m a U V) + have hWOpen : IsOpen W := by + exact isOpen_set_pi Set.finite_univ fun i _hi => + isOpen_openAllLocalCosetTarget + m a U V hU hV i + have hWNonempty : W.Nonempty := + ⟨openLocalCosetTargetPoint m a, + openLocalCosetTargetPoint_mem_all m a U V⟩ + obtain ⟨x, hx⟩ := + (RayClass.denseRange_approximationEmbedding m).exists_mem_open + hWOpen hWNonempty + let w₀ : InfinitePlace K := Classical.choice inferInstance + have hxw₀ := + hx (Sum.inr w₀) (Set.mem_univ (Sum.inr w₀)) + change + (x : w₀.Completion) ∈ + RayClass.unitRatioSet + (IdeleGroup.infiniteComponent w₀ a) + (V w₀) at hxw₀ + obtain ⟨y₀, _hy₀, hy₀x⟩ := hxw₀ + have hx0 : x ≠ 0 := by + intro hxzero + apply Units.ne_zero y₀ + rw [hy₀x, hxzero, + NumberField.InfinitePlace.Completion.coe_zero] + let xu : Kˣ := Units.mk0 x hx0 + refine ⟨xu, ?_, ?_⟩ + · intro v + have hvx := + hx (Sum.inl v) (Set.mem_univ (Sum.inl v)) + change + FinitePlace.embedding v.1 x ∈ + RayClass.unitRatioSet (a.2 v.1) (U v) at hvx + obtain ⟨y, hy, hyx⟩ := hvx + have hprincipal : + (principalIdele K xu).2 v.1 = y := by + apply Units.ext + calc + (((principalIdele K xu).2 v.1 : + (v.1.adicCompletion K)ˣ) : + v.1.adicCompletion K) = + (xu : K) := + finiteComponent_principalIdele xu v.1 + _ = (x : K) := rfl + _ = (y : v.1.adicCompletion K) := hyx.symm + rw [hprincipal] + exact hy + · intro w + have hwx := + hx (Sum.inr w) (Set.mem_univ (Sum.inr w)) + change + (x : w.Completion) ∈ + RayClass.unitRatioSet + (IdeleGroup.infiniteComponent w a) + (V w) at hwx + obtain ⟨y, hy, hyx⟩ := hwx + have hprincipal : + IdeleGroup.infiniteComponent w + (principalIdele K xu) = y := by + apply Units.ext + calc + ((IdeleGroup.infiniteComponent w + (principalIdele K xu) : w.Completionˣ) : + w.Completion) = + (xu : K) := + infiniteComponent_principalIdele xu w + _ = (x : K) := rfl + _ = (y : w.Completion) := hyx.symm + rw [hprincipal] + exact hy + +open scoped Classical in +/-- Finset-indexed simultaneous finite-and-infinite multiplicative weak +approximation. -/ +theorem exists_principal_quotient_mem_openAllLocalSubgroups_finset + (S : Finset (HeightOneSpectrum (𝓞 K))) + (a : IdeleGroup K) + (U : ∀ v : ↥S, + Subgroup (v.1.adicCompletion K)ˣ) + (V : ∀ w : InfinitePlace K, + Subgroup w.Completionˣ) + (hU : ∀ v, IsOpen + (U v : Set (v.1.adicCompletion K)ˣ)) + (hV : ∀ w, IsOpen + (V w : Set w.Completionˣ)) : + ∃ x : Kˣ, + (∀ v : ↥S, + a.2 v.1 * + ((principalIdele K x).2 v.1)⁻¹ ∈ U v) ∧ + (∀ w : InfinitePlace K, + IdeleGroup.infiniteComponent w a * + (IdeleGroup.infiniteComponent w + (principalIdele K x))⁻¹ ∈ V w) := by + let m : RayClass.Modulus K := modulusOfFinset S + have hm : m.finitePart.support = S := by + simp [m] + let U' : ∀ v : ↥m.finitePart.support, + Subgroup (v.1.adicCompletion K)ˣ := + fun v => U ⟨v.1, hm ▸ v.2⟩ + have hU' : + ∀ v, IsOpen (U' v : Set (v.1.adicCompletion K)ˣ) := + fun v => hU ⟨v.1, hm ▸ v.2⟩ + obtain ⟨x, hfinite, hinfinite⟩ := + exists_principal_quotient_mem_openAllLocalSubgroups + m a U' V hU' hV + refine ⟨x, ?_, hinfinite⟩ + intro v + have hv : v.1 ∈ m.finitePart.support := hm.symm ▸ v.2 + exact hfinite ⟨v.1, hv⟩ + +open scoped Classical in +/-- A finite local family, extended by `1`, is a finite idele. -/ +def finiteIdeleOfFinset + (S : Finset (HeightOneSpectrum (𝓞 K))) + (a : ∀ v : ↥S, (v.1.adicCompletion K)ˣ) : + FiniteIdeleGroup K := by + let f : ∀ v : HeightOneSpectrum (𝓞 K), + (v.adicCompletion K)ˣ := + fun v => if hv : v ∈ S then a ⟨v, hv⟩ else 1 + refine ⟨f, ?_⟩ + have haway : + ∀ᶠ v : HeightOneSpectrum (𝓞 K) in Filter.cofinite, + v ∉ S := by + rw [Filter.eventually_cofinite] + convert S.finite_toSet using 1 + ext v + simp + filter_upwards [haway] with v hv + change f v ∈ (v.adicCompletionIntegers K).units + simp [f, hv] + +open scoped Classical in +@[simp] +theorem finiteIdeleOfFinset_apply_mem + (S : Finset (HeightOneSpectrum (𝓞 K))) + (a : ∀ v : ↥S, (v.1.adicCompletion K)ˣ) + (v : ↥S) : + finiteIdeleOfFinset S a v.1 = a v := by + classical + change (if hv : v.1 ∈ S then a ⟨v.1, hv⟩ else 1) = a v + exact dite_eq_left v.2 + +open scoped Classical in +@[simp] +theorem finiteIdeleOfFinset_apply_notMem + (S : Finset (HeightOneSpectrum (𝓞 K))) + (a : ∀ v : ↥S, (v.1.adicCompletion K)ˣ) + (v : HeightOneSpectrum (𝓞 K)) (hv : v ∉ S) : + finiteIdeleOfFinset S a v = 1 := by + classical + change (if hmem : v ∈ S then a ⟨v, hmem⟩ else 1) = + (1 : (v.adicCompletion K)ˣ) + exact dite_eq_right hv + +open scoped Classical in +/-- The idele whose prescribed finite components are `a` and whose other +finite and all infinite components are `1`. -/ +def ideleOfFiniteLocalFamily + (S : Finset (HeightOneSpectrum (𝓞 K))) + (a : ∀ v : ↥S, (v.1.adicCompletion K)ˣ) : + IdeleGroup K := + (1, finiteIdeleOfFinset S a) + +open scoped Classical in +@[simp] +theorem ideleOfFiniteLocalFamily_finiteComponent + (S : Finset (HeightOneSpectrum (𝓞 K))) + (a : ∀ v : ↥S, (v.1.adicCompletion K)ˣ) + (v : ↥S) : + (ideleOfFiniteLocalFamily S a).2 v.1 = a v := + finiteIdeleOfFinset_apply_mem S a v + +open scoped Classical in +/-- The diagonal map from `Kˣ` to a finite product of local multiplicative +quotients. -/ +def principalLocalQuotientMap + (S : Finset (HeightOneSpectrum (𝓞 K))) + (U : ∀ v : ↥S, Subgroup (v.1.adicCompletion K)ˣ) : + Kˣ →* (∀ v : ↥S, (v.1.adicCompletion K)ˣ ⧸ U v) := + MonoidHom.pi fun v => + (QuotientGroup.mk' (U v)).comp + ((finiteComponent v.1).comp (principalIdele K)) + +open scoped Classical in +@[simp] +theorem principalLocalQuotientMap_apply + (S : Finset (HeightOneSpectrum (𝓞 K))) + (U : ∀ v : ↥S, Subgroup (v.1.adicCompletion K)ˣ) + (x : Kˣ) (v : ↥S) : + principalLocalQuotientMap S U x v = + QuotientGroup.mk' (U v) ((principalIdele K x).2 v.1) := + rfl + +open scoped Classical in +/-- Multiplicative weak approximation is equivalently surjectivity of the +diagonal map to every finite product of quotients by open local subgroups. -/ +theorem principalLocalQuotientMap_surjective + (S : Finset (HeightOneSpectrum (𝓞 K))) + (U : ∀ v : ↥S, Subgroup (v.1.adicCompletion K)ˣ) + (hU : ∀ v, IsOpen (U v : Set (v.1.adicCompletion K)ˣ)) : + Function.Surjective (principalLocalQuotientMap S U) := by + intro q + choose a ha using fun v : ↥S => + QuotientGroup.mk_surjective (q v) + let α : IdeleGroup K := + ideleOfFiniteLocalFamily S a + obtain ⟨x, hx⟩ := + exists_principal_quotient_mem_openLocalSubgroups_finset + S α U hU + refine ⟨x, ?_⟩ + funext v + rw [principalLocalQuotientMap_apply, ← ha v] + apply Eq.symm + apply (QuotientGroup.eq_iff_div_mem).2 + simpa [α, div_eq_mul_inv] using hx v + +end IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Basic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Basic.lean new file mode 100644 index 0000000000..98f5690d5a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Basic.lean @@ -0,0 +1,164 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalTopology +public import Mathlib.RingTheory.Ideal.Quotient.Operations +/-! +# Finite ray-modulus data + +This file contains the finite local data used by ray congruence subgroups. +A full modulus, including a selected set of real places, is defined in +`AlgebraicNumberTheory.RayClass.FullModulus`. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + + +variable {K : Type*} [Field K] [NumberField K] + +namespace RayClass + +/-- A finite ray modulus. Its finite support records the prime powers +dividing the modulus. -/ +abbrev FiniteModulus (K : Type*) [Field K] := + HeightOneSpectrum (𝓞 K) →₀ ℕ + +/-- Reduction of local integral units modulo the `n`-th power of the maximal +ideal. -/ +def localHigherUnitMap + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ) : + (v.adicCompletionIntegers K).units →* + ((v.adicCompletionIntegers K) ⧸ + (IsLocalRing.maximalIdeal + (v.adicCompletionIntegers K)) ^ n)ˣ := + (Units.map + (Ideal.Quotient.mk + ((IsLocalRing.maximalIdeal + (v.adicCompletionIntegers K)) ^ n)).toMonoidHom).comp + (v.adicCompletionIntegers K).toSubmonoid.unitsEquivUnitsType.toMonoidHom + +/-- The local higher unit group `U_v^(n)`. -/ +def localHigherUnitGroup + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ) : + Subgroup (v.adicCompletion K)ˣ := + Subgroup.map + (v.adicCompletionIntegers K).units.subtype + (localHigherUnitMap v n).ker + +theorem mem_localHigherUnitGroup_iff + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ) + (x : (v.adicCompletion K)ˣ) : + x ∈ localHigherUnitGroup v n ↔ + ∃ y : (v.adicCompletionIntegers K).units, + (y : (v.adicCompletion K)ˣ) = x ∧ + localHigherUnitMap v n y = 1 := by + rw [localHigherUnitGroup, Subgroup.mem_map] + constructor + · rintro ⟨y, hy, rfl⟩ + exact ⟨y, rfl, MonoidHom.mem_ker.mp hy⟩ + · rintro ⟨y, rfl, hy⟩ + exact ⟨y, MonoidHom.mem_ker.mpr hy, rfl⟩ + +/-- The zeroth higher unit group is the full group of local integral +units. -/ +theorem localHigherUnitGroup_zero + (v : HeightOneSpectrum (𝓞 K)) : + localHigherUnitGroup v 0 = + (v.adicCompletionIntegers K).units := by + ext x + rw [mem_localHigherUnitGroup_iff] + constructor + · rintro ⟨y, rfl, _hy⟩ + exact y.property + · intro hx + let y : (v.adicCompletionIntegers K).units := ⟨x, hx⟩ + refine ⟨y, rfl, ?_⟩ + change Units.map + (Ideal.Quotient.mk + ((IsLocalRing.maximalIdeal + (v.adicCompletionIntegers K)) ^ 0)).toMonoidHom + ((v.adicCompletionIntegers K).toSubmonoid.unitsEquivUnitsType y) = + 1 + let : Subsingleton + ((v.adicCompletionIntegers K) ⧸ + (IsLocalRing.maximalIdeal + (v.adicCompletionIntegers K)) ^ 0) := + Ideal.Quotient.subsingleton_iff.mpr (by simp) + apply Units.ext + exact Subsingleton.elim _ _ + +/-- Positivity at a real infinite place. At a complex place the condition +is vacuous, so this is the whole local multiplicative group. -/ +def infinitePositiveSubgroup (v : InfinitePlace K) : + Subgroup v.Completionˣ where + carrier := {x | ∀ hv : v.IsReal, + 0 < NumberField.InfinitePlace.Completion.extensionEmbeddingOfIsReal + hv (x : v.Completion)} + one_mem' hv := by simp + mul_mem' {x y} hx hy hv := by + change 0 < + NumberField.InfinitePlace.Completion.extensionEmbeddingOfIsReal + hv ((x : v.Completion) * (y : v.Completion)) + rw [map_mul] + exact mul_pos (hx hv) (hy hv) + inv_mem' {x} hx hv := by + rw [Units.val_inv_eq_inv_val, map_inv₀] + exact inv_pos.mpr (hx hv) + +omit [NumberField K] in +@[simp] +theorem mem_infinitePositiveSubgroup_iff + (v : InfinitePlace K) (x : v.Completionˣ) : + x ∈ infinitePositiveSubgroup v ↔ + ∀ hv : v.IsReal, + 0 < NumberField.InfinitePlace.Completion.extensionEmbeddingOfIsReal + hv (x : v.Completion) := + Iff.rfl + +/-- The finite idele congruence subgroup attached to a modulus. -/ +def finiteCongruenceSubgroup (m : FiniteModulus K) : + Subgroup (FiniteIdeleGroup K) where + carrier := {a | ∀ v, a v ∈ localHigherUnitGroup v (m v)} + one_mem' v := (localHigherUnitGroup v (m v)).one_mem + mul_mem' ha hb v := + (localHigherUnitGroup v (m v)).mul_mem (ha v) (hb v) + inv_mem' ha v := + (localHigherUnitGroup v (m v)).inv_mem (ha v) + +@[simp] +theorem mem_finiteCongruenceSubgroup_iff + (m : FiniteModulus K) (a : FiniteIdeleGroup K) : + a ∈ finiteCongruenceSubgroup m ↔ + ∀ v, a v ∈ localHigherUnitGroup v (m v) := + Iff.rfl + +/-- Ideles positive at every real infinite place. -/ +def narrowInfiniteCongruenceSubgroup : + Subgroup (InfiniteIdeleGroup K) := + Subgroup.comap ContinuousMulEquiv.piUnits.toMonoidHom + (Subgroup.pi Set.univ (fun v => infinitePositiveSubgroup v)) + +omit [NumberField K] in +@[simp] +theorem mem_narrowInfiniteCongruenceSubgroup_iff + (a : InfiniteIdeleGroup K) : + a ∈ narrowInfiniteCongruenceSubgroup (K := K) ↔ + ∀ v, ContinuousMulEquiv.piUnits a v ∈ + infinitePositiveSubgroup v := by + change ContinuousMulEquiv.piUnits a ∈ + Subgroup.pi Set.univ (fun v => infinitePositiveSubgroup v) ↔ _ + rw [Subgroup.mem_pi] + simp only [Set.mem_univ, true_implies] + +end RayClass diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/FullModulus.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/FullModulus.lean new file mode 100644 index 0000000000..d1f15acc1b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/FullModulus.lean @@ -0,0 +1,412 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Basic +/-! +# Ray moduli with selected real places + +A ray modulus consists of a finite modulus together with the real places at +which positivity is imposed. This file defines the corresponding idèle and +idèle-class congruence subgroups without fixing an archimedean convention. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +variable {K : Type*} [Field K] [NumberField K] + +namespace RayClass + +open scoped Classical in +/-- A real infinite place of a number field. -/ +abbrev RealPlace (K : Type*) [Field K] := + {v : InfinitePlace K // v.IsReal} + +open scoped Classical in +/-- A ray modulus consists of its finite part and the selected real places +at which the positivity condition is imposed. -/ +structure Modulus (K : Type*) [Field K] [NumberField K] where + /-- The finite prime-power part of the modulus. -/ + finitePart : FiniteModulus K + /-- The real places at which positivity is imposed. -/ + infinitePart : Finset (RealPlace K) + +namespace Modulus + +open scoped Classical in +/-- The full modulus with a prescribed finite part and no archimedean +positivity condition. -/ +def ofFinite (m : FiniteModulus K) : Modulus K where + finitePart := m + infinitePart := ∅ + +open scoped Classical in +/-- The full modulus with a prescribed finite part and positivity at every +real place. -/ +noncomputable def narrowOfFinite (m : FiniteModulus K) : Modulus K where + finitePart := m + infinitePart := Finset.univ + +open scoped Classical in +instance : Zero (Modulus K) where + zero := ofFinite 0 + +open scoped Classical in +@[simp] +theorem finitePart_ofFinite (m : FiniteModulus K) : + (ofFinite m).finitePart = m := + rfl + +open scoped Classical in +@[simp] +theorem infinitePart_ofFinite (m : FiniteModulus K) : + (ofFinite m).infinitePart = ∅ := + rfl + +open scoped Classical in +@[simp] +theorem finitePart_narrowOfFinite (m : FiniteModulus K) : + (narrowOfFinite m).finitePart = m := + rfl + +open scoped Classical in +@[simp] +theorem infinitePart_narrowOfFinite (m : FiniteModulus K) : + (narrowOfFinite m).infinitePart = Finset.univ := + rfl + +open scoped Classical in +@[simp] +theorem finitePart_zero : + (0 : Modulus K).finitePart = 0 := + rfl + +open scoped Classical in +@[simp] +theorem infinitePart_zero : + (0 : Modulus K).infinitePart = ∅ := + rfl + +open scoped Classical in +theorem ext {m n : Modulus K} + (hfinite : m.finitePart = n.finitePart) + (hinfinite : m.infinitePart = n.infinitePart) : + m = n := by + cases m + cases n + cases hfinite + cases hinfinite + rfl + +open scoped Classical in +instance : LE (Modulus K) where + le m n := + m.finitePart ≤ n.finitePart ∧ m.infinitePart ⊆ n.infinitePart + +open scoped Classical in +@[simp] +theorem le_iff {m n : Modulus K} : + m ≤ n ↔ + m.finitePart ≤ n.finitePart ∧ m.infinitePart ⊆ n.infinitePart := + Iff.rfl + +open scoped Classical in +instance : PartialOrder (Modulus K) where + le_refl m := ⟨le_rfl, fun _ hx => hx⟩ + le_trans m n p hmn hnp := + ⟨hmn.1.trans hnp.1, fun x hx => hnp.2 (hmn.2 hx)⟩ + le_antisymm m n hmn hnm := + ext (le_antisymm hmn.1 hnm.1) (by + apply Finset.ext + intro x + exact ⟨fun hx => hmn.2 hx, fun hx => hnm.2 hx⟩) +open scoped Classical in +noncomputable instance : SemilatticeInf (Modulus K) where + inf m n := + { finitePart := m.finitePart ⊓ n.finitePart + infinitePart := m.infinitePart ∩ n.infinitePart } + inf_le_left _ _ := + ⟨inf_le_left, fun _ hx => (Finset.mem_inter.mp hx).1⟩ + inf_le_right _ _ := + ⟨inf_le_right, fun _ hx => (Finset.mem_inter.mp hx).2⟩ + le_inf _ _ _ hmn hmp := + ⟨le_inf hmn.1 hmp.1, + fun _ hx => Finset.mem_inter.mpr ⟨hmn.2 hx, hmp.2 hx⟩⟩ + +open scoped Classical in +noncomputable instance : SemilatticeSup (Modulus K) where + sup m n := + { finitePart := m.finitePart ⊔ n.finitePart + infinitePart := m.infinitePart ∪ n.infinitePart } + le_sup_left _ _ := + ⟨le_sup_left, fun _ hx => Finset.mem_union.mpr (Or.inl hx)⟩ + le_sup_right _ _ := + ⟨le_sup_right, fun _ hx => Finset.mem_union.mpr (Or.inr hx)⟩ + sup_le _ _ _ hmp hnp := + ⟨sup_le hmp.1 hnp.1, fun _ hx => by + rcases Finset.mem_union.mp hx with hx | hx + · exact hmp.2 hx + · exact hnp.2 hx⟩ + +open scoped Classical in +instance : Bot (Modulus K) where + bot := 0 + +open scoped Classical in +instance : OrderBot (Modulus K) where + bot_le _ := ⟨bot_le, Finset.empty_subset _⟩ + +open scoped Classical in +/-- Replace the finite part of a full modulus while retaining exactly its +selected real places. -/ +def replaceFinitePart + (m : Modulus K) (f : FiniteModulus K) : Modulus K where + finitePart := f + infinitePart := m.infinitePart + +open scoped Classical in +@[simp] +theorem finitePart_replaceFinitePart + (m : Modulus K) (f : FiniteModulus K) : + (m.replaceFinitePart f).finitePart = f := + rfl + +open scoped Classical in +@[simp] +theorem infinitePart_replaceFinitePart + (m : Modulus K) (f : FiniteModulus K) : + (m.replaceFinitePart f).infinitePart = m.infinitePart := + rfl + +open scoped Classical in +/-- Remove the positivity condition at one real place. -/ +noncomputable def eraseRealPlace + (m : Modulus K) (v : RealPlace K) : Modulus K where + finitePart := m.finitePart + infinitePart := m.infinitePart.erase v + +open scoped Classical in +@[simp] +theorem finitePart_eraseRealPlace + (m : Modulus K) (v : RealPlace K) : + (m.eraseRealPlace v).finitePart = m.finitePart := + rfl + +open scoped Classical in +@[simp] +theorem infinitePart_eraseRealPlace + (m : Modulus K) (v : RealPlace K) : + (m.eraseRealPlace v).infinitePart = m.infinitePart.erase v := + rfl + +open scoped Classical in +/-- Remove the positivity conditions at a finite set of real places. -/ +noncomputable def eraseRealPlaces + (m : Modulus K) (s : Finset (RealPlace K)) : Modulus K where + finitePart := m.finitePart + infinitePart := m.infinitePart \ s + +open scoped Classical in +@[simp] +theorem finitePart_eraseRealPlaces + (m : Modulus K) (s : Finset (RealPlace K)) : + (m.eraseRealPlaces s).finitePart = m.finitePart := + rfl + +open scoped Classical in +@[simp] +theorem infinitePart_eraseRealPlaces + (m : Modulus K) (s : Finset (RealPlace K)) : + (m.eraseRealPlaces s).infinitePart = m.infinitePart \ s := + rfl + +open scoped Classical in +@[simp] +theorem eraseRealPlaces_empty (m : Modulus K) : + m.eraseRealPlaces ∅ = m := by + apply ext + · rfl + · exact Finset.sdiff_empty + +open scoped Classical in +@[simp] +theorem eraseRealPlaces_insert + (m : Modulus K) (s : Finset (RealPlace K)) (v : RealPlace K) : + m.eraseRealPlaces (insert v s) = + (m.eraseRealPlaces s).eraseRealPlace v := by + apply ext + · rfl + · exact Finset.sdiff_insert _ _ _ + +open scoped Classical in +/-- The local infinite congruence condition at an infinite place. It is the +positive subgroup exactly at a real place selected by the modulus, and the +whole local group otherwise. -/ +noncomputable def localInfiniteCongruenceSubgroup (m : Modulus K) + (w : InfinitePlace K) : Subgroup w.Completionˣ := by + classical + exact if hw : w.IsReal then + if hmem : (⟨w, hw⟩ : RealPlace K) ∈ m.infinitePart then + infinitePositiveSubgroup w + else ⊤ + else ⊤ + +open scoped Classical in +@[simp] +theorem localInfiniteCongruenceSubgroup_replaceFinitePart + (m : Modulus K) (f : FiniteModulus K) (w : InfinitePlace K) : + (m.replaceFinitePart f).localInfiniteCongruenceSubgroup w = + m.localInfiniteCongruenceSubgroup w := by + rfl + +open scoped Classical in +@[simp] +theorem localInfiniteCongruenceSubgroup_of_mem + (m : Modulus K) (v : RealPlace K) (hv : v ∈ m.infinitePart) : + m.localInfiniteCongruenceSubgroup v.1 = infinitePositiveSubgroup v.1 := by + simp [localInfiniteCongruenceSubgroup, v.property, hv] + +open scoped Classical in +@[simp] +theorem localInfiniteCongruenceSubgroup_of_not_mem + (m : Modulus K) (v : RealPlace K) (hv : v ∉ m.infinitePart) : + m.localInfiniteCongruenceSubgroup v.1 = ⊤ := by + simp [localInfiniteCongruenceSubgroup, v.property, hv] + +open scoped Classical in +@[simp] +theorem localInfiniteCongruenceSubgroup_of_not_isReal + (m : Modulus K) (w : InfinitePlace K) (hw : ¬ w.IsReal) : + m.localInfiniteCongruenceSubgroup w = ⊤ := by + simp [localInfiniteCongruenceSubgroup, hw] + +open scoped Classical in +/-- The subgroup of infinite idèles positive at the real places selected by +the modulus. -/ +def infiniteCongruenceSubgroup (m : Modulus K) : + Subgroup (InfiniteIdeleGroup K) := + Subgroup.comap ContinuousMulEquiv.piUnits.toMonoidHom + (Subgroup.pi Set.univ (fun w => m.localInfiniteCongruenceSubgroup w)) + +open scoped Classical in +@[simp] +theorem mem_infiniteCongruenceSubgroup_iff_local + (m : Modulus K) (a : InfiniteIdeleGroup K) : + a ∈ m.infiniteCongruenceSubgroup ↔ + ∀ w, ContinuousMulEquiv.piUnits a w ∈ m.localInfiniteCongruenceSubgroup w := by + change ContinuousMulEquiv.piUnits a ∈ + Subgroup.pi Set.univ (fun w => m.localInfiniteCongruenceSubgroup w) ↔ _ + rw [Subgroup.mem_pi] + simp only [Set.mem_univ, true_implies] + +open scoped Classical in +theorem mem_infiniteCongruenceSubgroup_iff + (m : Modulus K) (a : InfiniteIdeleGroup K) : + a ∈ m.infiniteCongruenceSubgroup ↔ + ∀ v : RealPlace K, v ∈ m.infinitePart → + ContinuousMulEquiv.piUnits a v.1 ∈ infinitePositiveSubgroup v.1 := + by + rw [mem_infiniteCongruenceSubgroup_iff_local] + constructor + · intro ha v hv + have hlocal := ha v.1 + rw [localInfiniteCongruenceSubgroup_of_mem m v hv] at hlocal + exact hlocal + · intro ha w + by_cases hw : w.IsReal + · by_cases hmem : (⟨w, hw⟩ : RealPlace K) ∈ m.infinitePart + · simpa [localInfiniteCongruenceSubgroup, hw, hmem] using + ha ⟨w, hw⟩ hmem + · simp [localInfiniteCongruenceSubgroup, hw, hmem] + · simp [localInfiniteCongruenceSubgroup, hw] + +open scoped Classical in +/-- Selecting every real place recovers the narrow infinite congruence +subgroup. -/ +theorem infiniteCongruenceSubgroup_narrowOfFinite (f : FiniteModulus K) : + (narrowOfFinite f).infiniteCongruenceSubgroup = + narrowInfiniteCongruenceSubgroup (K := K) := by + ext a + rw [mem_infiniteCongruenceSubgroup_iff, + mem_narrowInfiniteCongruenceSubgroup_iff] + simp only [infinitePart_narrowOfFinite, Finset.mem_univ, true_implies] + constructor + · intro ha w + by_cases hw : w.IsReal + · exact ha ⟨w, hw⟩ + · rw [mem_infinitePositiveSubgroup_iff] + exact fun hreal => (hw hreal).elim + · intro ha v + exact ha v.1 + +open scoped Classical in +/-- The idèle congruence subgroup attached to a full ray modulus. -/ +def ideleCongruenceSubgroup (m : Modulus K) : + Subgroup (IdeleGroup K) := + m.infiniteCongruenceSubgroup.prod + (finiteCongruenceSubgroup m.finitePart) + +open scoped Classical in +@[simp] +theorem mem_ideleCongruenceSubgroup_iff + (m : Modulus K) (a : IdeleGroup K) : + a ∈ m.ideleCongruenceSubgroup ↔ + a.1 ∈ m.infiniteCongruenceSubgroup ∧ + a.2 ∈ finiteCongruenceSubgroup m.finitePart := + Iff.rfl + +open scoped Classical in +/-- Selecting every real place recovers the narrow idèle congruence subgroup. -/ +theorem ideleCongruenceSubgroup_narrowOfFinite (f : FiniteModulus K) : + (narrowOfFinite f).ideleCongruenceSubgroup = + (narrowInfiniteCongruenceSubgroup (K := K)).prod + (finiteCongruenceSubgroup f) := by + simp only [ideleCongruenceSubgroup, finitePart_narrowOfFinite] + rw [infiniteCongruenceSubgroup_narrowOfFinite] + +open scoped Classical in +/-- The ray congruence subgroup of the idèle class group attached to a full +modulus. -/ +def congruenceSubgroup (m : Modulus K) : + Subgroup (IdeleClassGroup K) := + Subgroup.map + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K)) + (m.ideleCongruenceSubgroup ⊔ IdeleGroup.principalSubgroup K) + +open scoped Classical in +/-- The full ray congruence subgroup is normal in the idèle class group. -/ +instance congruenceSubgroup_normal (m : Modulus K) : + m.congruenceSubgroup.Normal := by + let : IsMulCommutative (IdeleClassGroup K) := ⟨⟨fun a b => mul_comm a b⟩⟩ + exact Subgroup.normal_of_isMulCommutative _ + +end Modulus + +open scoped Classical in +/-- The ray class group attached to a full modulus. -/ +abbrev RayClassGroup (m : Modulus K) := + IdeleClassGroup K ⧸ m.congruenceSubgroup + +open scoped Classical in +/-- The ray class group is equivalently the idèle group modulo the product +of its congruence subgroup with the principal idèles. -/ +def rayClassGroupEquivIdeleQuotient (m : Modulus K) : + RayClassGroup m ≃* + IdeleGroup K ⧸ + (m.ideleCongruenceSubgroup ⊔ IdeleGroup.principalSubgroup K) := + QuotientGroup.quotientQuotientEquivQuotient + (IdeleGroup.principalSubgroup K) + (m.ideleCongruenceSubgroup ⊔ IdeleGroup.principalSubgroup K) + le_sup_right + +end RayClass diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Ideal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Ideal.lean new file mode 100644 index 0000000000..044dc9128d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Ideal.lean @@ -0,0 +1,1041 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.AbsoluteValues +public import Mathlib.NumberTheory.NumberField.Completion.InfinitePlace +public import Mathlib.Topology.Algebra.IsOpenUnits +public import Mathlib.Topology.Algebra.Ring.Compact +/-! +# Ideals prime to a ray-class modulus + +This file defines the subgroup of fractional ideals prime to a modulus, +connects it with the corresponding finite-idele higher-unit conditions, and +develops the approximation maps used in ray-class ideal constructions. +-/ + +@[expose] public section + +open scoped NumberField WithZero +open NumberField IsDedekindDomain + +noncomputable +section + + +variable {K : Type*} [Field K] [NumberField K] + +namespace RayClass + +open scoped Classical in +/-- Fractional ideals having valuation zero at every finite prime in the +support of the modulus. -/ +def primeToModulusIdeals (m : Modulus K) : + Subgroup (FractionalIdealGroup K) where + carrier := {I | ∀ v, v ∈ m.finitePart.support → + FractionalIdeal.count K v + (I : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = 0} + one_mem' v _ := FractionalIdeal.count_one K v + mul_mem' {I J} hI hJ v hv := by + rw [Units.val_mul, + FractionalIdeal.count_mul K v (Units.ne_zero I) (Units.ne_zero J), + hI v hv, hJ v hv, add_zero] + inv_mem' {I} hI v hv := by + rw [Units.val_inv_eq_inv_val, FractionalIdeal.count_inv K v, + hI v hv, neg_zero] + +open scoped Classical in +@[simp] +theorem mem_primeToModulusIdeals_iff + (m : Modulus K) (I : FractionalIdealGroup K) : + I ∈ primeToModulusIdeals m ↔ + ∀ v, v ∈ m.finitePart.support → + FractionalIdeal.count K v + (I : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = 0 := + Iff.rfl + +open scoped Classical in +/-- A finite prime outside the support of `m`, regarded as an element of +the group of fractional ideals prime to `m`. -/ +def primeToModulusIdeal + (m : Modulus K) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : + primeToModulusIdeals m := + ⟨FractionalIdealGroup.prime v, by + intro w hw + have hwv : w ≠ v := by + intro h + exact hv (h ▸ hw) + change + FractionalIdeal.count K w + (v.asIdeal : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = + 0 + exact + FractionalIdeal.count_maximal_coprime + K w hwv.symm⟩ + +open scoped Classical in +/-- Coercing a prime outside the modulus support recovers its prime +fractional ideal. -/ +@[simp] +theorem primeToModulusIdeal_coe + (m : Modulus K) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : + (primeToModulusIdeal m v hv : + FractionalIdealGroup K) = + FractionalIdealGroup.prime v := + rfl + +open scoped Classical in +/-- Finite ideles satisfying the higher-unit condition at every prime in +the support of the modulus. -/ +def finitePrimeToModulusSubgroup (m : Modulus K) : + Subgroup (FiniteIdeleGroup K) where + carrier := {a | ∀ v, v ∈ m.finitePart.support → + a v ∈ localHigherUnitGroup v (m.finitePart v)} + one_mem' v _ := (localHigherUnitGroup v (m.finitePart v)).one_mem + mul_mem' ha hb v hv := + (localHigherUnitGroup v (m.finitePart v)).mul_mem (ha v hv) (hb v hv) + inv_mem' ha v hv := + (localHigherUnitGroup v (m.finitePart v)).inv_mem (ha v hv) + +open scoped Classical in +/-- Ideles satisfying the infinite positivity and finite higher-unit +conditions of a modulus. -/ +def idelePrimeToModulusSubgroup (m : Modulus K) : + Subgroup (IdeleGroup K) := + m.infiniteCongruenceSubgroup.prod + (finitePrimeToModulusSubgroup m) + +open scoped Classical in +theorem localHigherUnitGroup_le_integralUnits + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ) : + localHigherUnitGroup v n ≤ + (v.adicCompletionIntegers K).units := by + intro x hx + rw [mem_localHigherUnitGroup_iff] at hx + obtain ⟨y, rfl, _⟩ := hx + exact y.property + +open scoped Classical in +theorem fractionalIdeal_mem_primeToModulusIdeals + (m : Modulus K) (a : IdeleGroup K) + (ha : a ∈ idelePrimeToModulusSubgroup m) : + IdeleGroup.fractionalIdeal a ∈ primeToModulusIdeals m := by + intro v hv + change FractionalIdeal.count K v + (((FractionalIdealGroup.factorization (K := K)) + (FiniteIdeleGroup.valuationVector a.2) : + FractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = 0 + rw [FractionalIdealGroup.count_factorization, + FiniteIdeleGroup.valuationVector_apply] + apply (FiniteIdeleGroup.localOrder_eq_zero_iff v (a.2 v)).2 + exact localHigherUnitGroup_le_integralUnits v (m.finitePart v) (ha.2 v hv) + +open scoped Classical in +/-- The fractional-ideal map restricted to ideles prime to a modulus. -/ +def primeToIdealMap (m : Modulus K) : + idelePrimeToModulusSubgroup m →* + primeToModulusIdeals m where + toFun a := + ⟨IdeleGroup.fractionalIdeal a, + fractionalIdeal_mem_primeToModulusIdeals m a a.property⟩ + map_one' := by + apply Subtype.ext + exact map_one _ + map_mul' a b := by + apply Subtype.ext + exact map_mul _ _ _ + +open scoped Classical in +/-- A finite idele with a prescribed valuation vector away from the +support of a modulus and value one on its support. -/ +def valuationVectorSectionPrimeTo + (m : Modulus K) + (e : HeightOneSpectrum (𝓞 K) →₀ ℤ) : + FiniteIdeleGroup K := + ⟨fun v => + if v ∈ m.finitePart.support then 1 + else FiniteIdeleGroup.chosenLocalOrderSection v (e v), by + filter_upwards + [m.finitePart.support.eventually_cofinite_notMem, + e.support.eventually_cofinite_notMem] with v hvm he + simp only [hvm, ↓reduceIte] + apply (FiniteIdeleGroup.localOrder_eq_zero_iff v _).1 + rw [FiniteIdeleGroup.localOrder_chosenLocalOrderSection, + Finsupp.notMem_support_iff.mp he]⟩ + +open scoped Classical in +theorem valuationVector_valuationVectorSectionPrimeTo + (m : Modulus K) + (e : HeightOneSpectrum (𝓞 K) →₀ ℤ) + (he : ∀ v, v ∈ m.finitePart.support → e v = 0) : + FiniteIdeleGroup.valuationVector + (valuationVectorSectionPrimeTo m e) = + Multiplicative.ofAdd e := by + apply Multiplicative.ext + ext v + rw [FiniteIdeleGroup.valuationVector_apply] + by_cases hv : v ∈ m.finitePart.support + · change + (FiniteIdeleGroup.localOrder v + (if v ∈ m.finitePart.support then 1 + else FiniteIdeleGroup.chosenLocalOrderSection v (e v))).toAdd = + e v + rw [ite_eq_left hv, map_one] + exact (he v hv).symm + · change + (FiniteIdeleGroup.localOrder v + (if v ∈ m.finitePart.support then 1 + else FiniteIdeleGroup.chosenLocalOrderSection v (e v))).toAdd = + e v + rw [ite_eq_right hv, + FiniteIdeleGroup.localOrder_chosenLocalOrderSection] + +open scoped Classical in +theorem primeToIdealMap_surjective (m : Modulus K) : + Function.Surjective (primeToIdealMap m) := by + intro I + let e : HeightOneSpectrum (𝓞 K) →₀ ℤ := + FractionalIdealGroup.countVector (I : FractionalIdealGroup K) + have he : ∀ v, v ∈ m.finitePart.support → e v = 0 := by + intro v hv + exact I.property v hv + let a : IdeleGroup K := + (1, valuationVectorSectionPrimeTo m e) + have ha : a ∈ idelePrimeToModulusSubgroup m := by + constructor + · exact m.infiniteCongruenceSubgroup.one_mem + · intro v hv + change + (if v ∈ m.finitePart.support then 1 + else FiniteIdeleGroup.chosenLocalOrderSection v (e v)) ∈ + localHigherUnitGroup v (m.finitePart v) + rw [ite_eq_left hv] + exact (localHigherUnitGroup v (m.finitePart v)).one_mem + refine ⟨⟨a, ha⟩, ?_⟩ + apply Subtype.ext + apply FractionalIdealGroup.ext_count + intro v + change FractionalIdeal.count K v + (((FractionalIdealGroup.factorization (K := K)) + (FiniteIdeleGroup.valuationVector + (valuationVectorSectionPrimeTo m e)) : + FractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = + FractionalIdeal.count K v + ((I : FractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) + rw [valuationVector_valuationVectorSectionPrimeTo m e he, + FractionalIdealGroup.count_factorization] + exact FractionalIdealGroup.countVector_apply I v + +open scoped Classical in +theorem ideleCongruenceSubgroup_le_primeTo + (m : Modulus K) : + m.ideleCongruenceSubgroup ≤ + idelePrimeToModulusSubgroup m := by + intro a ha + exact ⟨ha.1, fun v _ => ha.2 v⟩ + +open scoped Classical in +/-- The congruence subgroup, viewed inside the subgroup of ideles prime +to the modulus. -/ +def congruenceSubgroupInPrimeTo (m : Modulus K) : + Subgroup (idelePrimeToModulusSubgroup m) := + m.ideleCongruenceSubgroup.subgroupOf + (idelePrimeToModulusSubgroup m) + +open scoped Classical in +theorem primeToIdealMap_ker (m : Modulus K) : + (primeToIdealMap m).ker = + congruenceSubgroupInPrimeTo m := by + ext a + constructor + · intro ha + have hintegral : + (a : IdeleGroup K) ∈ + IdeleGroup.integralAtFinitePlaces (K := K) := by + rw [← IdeleGroup.fractionalIdeal_ker, + MonoidHom.mem_ker] + exact congrArg Subtype.val + (MonoidHom.mem_ker.mp ha) + constructor + · exact a.property.1 + · intro v + by_cases hv : v ∈ m.finitePart.support + · exact a.property.2 v hv + · rw [Finsupp.notMem_support_iff.mp hv, + localHigherUnitGroup_zero] + exact hintegral v + · intro ha + apply MonoidHom.mem_ker.mpr + apply Subtype.ext + change IdeleGroup.fractionalIdeal (a : IdeleGroup K) = 1 + rw [← MonoidHom.mem_ker, + IdeleGroup.fractionalIdeal_ker] + intro v + exact localHigherUnitGroup_le_integralUnits v (m.finitePart v) (ha.2 v) + +open scoped Classical in +/-- The quotient of ideles prime to a modulus by the congruence subgroup, +identified with fractional ideals prime to the modulus. -/ +def quotientCongruenceEquivPrimeToIdeals (m : Modulus K) : + idelePrimeToModulusSubgroup m ⧸ + congruenceSubgroupInPrimeTo m ≃* + primeToModulusIdeals m := by + rw [← primeToIdealMap_ker m] + exact QuotientGroup.quotientKerEquivOfSurjective + (primeToIdealMap m) (primeToIdealMap_surjective m) + +open scoped Classical in +/-- Principal ideles satisfying the modulus conditions, considered inside +`I_K^(m)`. -/ +def principalSubgroupInPrimeTo (m : Modulus K) : + Subgroup (idelePrimeToModulusSubgroup m) := + Subgroup.comap (idelePrimeToModulusSubgroup m).subtype + (IdeleGroup.principalSubgroup K) + +open scoped Classical in +/-- Principal ideals generated by a totally positive element congruent to +one modulo the finite modulus. -/ +def principalRayIdealSubgroup (m : Modulus K) : + Subgroup (primeToModulusIdeals m) := + Subgroup.map (primeToIdealMap m) + (principalSubgroupInPrimeTo m) + +open scoped Classical in +theorem mem_principalRayIdealSubgroup_iff + (m : Modulus K) (I : primeToModulusIdeals m) : + I ∈ principalRayIdealSubgroup m ↔ + ∃ x : Kˣ, + ∃ _hx : IdeleGroup.principalIdele K x ∈ + idelePrimeToModulusSubgroup m, + toPrincipalIdeal (𝓞 K) K x = + (I : FractionalIdealGroup K) := by + constructor + · rintro ⟨a, ha, hmap⟩ + obtain ⟨x, hx⟩ := ha + refine ⟨x, ?_, ?_⟩ + · rw [hx] + exact a.property + · have hval := congrArg Subtype.val hmap + change IdeleGroup.fractionalIdeal (a : IdeleGroup K) = + (I : FractionalIdealGroup K) at hval + rw [← IdeleGroup.fractionalIdeal_principalIdele] + exact (congrArg (IdeleGroup.fractionalIdeal (K := K)) hx).trans hval + · rintro ⟨x, hx, hideal⟩ + let a : idelePrimeToModulusSubgroup m := + ⟨IdeleGroup.principalIdele K x, hx⟩ + have ha : a ∈ principalSubgroupInPrimeTo m := by + change IdeleGroup.principalIdele K x ∈ + IdeleGroup.principalSubgroup K + exact ⟨x, rfl⟩ + refine ⟨a, ha, ?_⟩ + apply Subtype.ext + change IdeleGroup.fractionalIdeal + (IdeleGroup.principalIdele K x) = + (I : FractionalIdealGroup K) + rw [IdeleGroup.fractionalIdeal_principalIdele, hideal] + +open scoped Classical in +/-- The ideal-theoretic ray class group `J_K^m / P_K^m`. -/ +abbrev IdealRayClassGroup (m : Modulus K) := + primeToModulusIdeals m ⧸ principalRayIdealSubgroup m + +open scoped Classical in +/-- The canonical projection from ideles prime to the modulus to the +ideal-theoretic ray class group. -/ +def idealRayProjection (m : Modulus K) : + idelePrimeToModulusSubgroup m →* + IdealRayClassGroup m := + (QuotientGroup.mk' (principalRayIdealSubgroup m)).comp + (primeToIdealMap m) + +open scoped Classical in +/-- The subgroup generated by congruence ideles and principal ideles +inside the ideles prime to a modulus. -/ +def raySubgroupInPrimeTo (m : Modulus K) : + Subgroup (idelePrimeToModulusSubgroup m) := + congruenceSubgroupInPrimeTo m ⊔ + principalSubgroupInPrimeTo m + +open scoped Classical in +theorem idealRayProjection_surjective (m : Modulus K) : + Function.Surjective (idealRayProjection m) := by + intro c + obtain ⟨I, rfl⟩ := + QuotientGroup.mk'_surjective + (principalRayIdealSubgroup m) c + obtain ⟨a, rfl⟩ := primeToIdealMap_surjective m I + exact ⟨a, rfl⟩ + +open scoped Classical in +theorem idealRayProjection_ker (m : Modulus K) : + (idealRayProjection m).ker = + raySubgroupInPrimeTo m := by + ext a + constructor + · intro ha + change QuotientGroup.mk' + (principalRayIdealSubgroup m) + (primeToIdealMap m a) = 1 at ha + rw [QuotientGroup.mk'_apply, + QuotientGroup.eq_one_iff] at ha + obtain ⟨p, hp, hpa⟩ := ha + let n : idelePrimeToModulusSubgroup m := a * p⁻¹ + have hn : n ∈ congruenceSubgroupInPrimeTo m := by + rw [← primeToIdealMap_ker m, MonoidHom.mem_ker] + change primeToIdealMap m (a * p⁻¹) = 1 + rw [map_mul, map_inv, hpa] + simp + rw [raySubgroupInPrimeTo, Subgroup.mem_sup] + refine ⟨n, hn, p, hp, ?_⟩ + dsimp [n] + group + · intro ha + rw [raySubgroupInPrimeTo, Subgroup.mem_sup] at ha + obtain ⟨n, hn, p, hp, rfl⟩ := ha + change QuotientGroup.mk' + (principalRayIdealSubgroup m) + (primeToIdealMap m (n * p)) = 1 + rw [map_mul] + have hn' : primeToIdealMap m n = 1 := + MonoidHom.mem_ker.mp + ((primeToIdealMap_ker m).symm ▸ hn) + rw [hn', one_mul] + rw [QuotientGroup.mk'_apply, + QuotientGroup.eq_one_iff] + exact ⟨p, hp, rfl⟩ + +open scoped Classical in +/-- The quotient of ideles prime to the modulus by the full ray subgroup, +identified with the ideal-theoretic ray class group. -/ +def quotientRaySubgroupEquivIdealRayClassGroup + (m : Modulus K) : + idelePrimeToModulusSubgroup m ⧸ + raySubgroupInPrimeTo m ≃* + IdealRayClassGroup m := + (QuotientGroup.quotientMulEquivOfEq + (idealRayProjection_ker m).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (idealRayProjection m) + (idealRayProjection_surjective m)) + +open scoped Classical in +/-- The quotient equivalence induced by the ideal-ray projection evaluates on +the class of a prime-to-modulus idele as the original projection. -/ +theorem quotientRaySubgroupEquivIdealRayClassGroup_mk + (m : Modulus K) (a : idelePrimeToModulusSubgroup m) : + quotientRaySubgroupEquivIdealRayClassGroup m + (QuotientGroup.mk' (raySubgroupInPrimeTo m) a) = + idealRayProjection m a := by + rw [quotientRaySubgroupEquivIdealRayClassGroup, + MulEquiv.trans_apply, QuotientGroup.mk'_apply, + QuotientGroup.quotientMulEquivOfEq_mk] + exact QuotientGroup.kerLift_mk (idealRayProjection m) a + +/-! ### Simultaneous approximation at the places in a modulus -/ + +open scoped Classical in +/-- The finite primes in `m`, together with all infinite places. -/ +abbrev ApproximationPlace (m : Modulus K) := + (↥m.finitePart.support) ⊕ InfinitePlace K + +open scoped Classical in +/-- The absolute value represented by an approximation place. -/ +abbrev approximationAbsoluteValue (m : Modulus K) : + ApproximationPlace m → AbsoluteValue K ℝ + | Sum.inl v => NumberField.HeightOneSpectrum.adicAbv K v.1 + | Sum.inr w => w.1 + +open scoped Classical in +theorem adicAbv_isNontrivial + (v : HeightOneSpectrum (𝓞 K)) : + (NumberField.HeightOneSpectrum.adicAbv K v).IsNontrivial := by + obtain ⟨x, hxv, hx0⟩ := + Submodule.exists_mem_ne_zero_of_ne_bot v.ne_bot + refine ⟨algebraMap (𝓞 K) K x, ?_, ?_⟩ + · exact (FaithfulSMul.algebraMap_eq_zero_iff (𝓞 K) K).not.mpr hx0 + · apply ne_of_lt + rw [← FinitePlace.norm_embedding] + exact (FinitePlace.norm_lt_one_iff_mem (K := K) v x).2 hxv + +open scoped Classical in +theorem adicAbv_not_isEquiv_of_ne + {v w : HeightOneSpectrum (𝓞 K)} (hvw : v ≠ w) : + ¬ (NumberField.HeightOneSpectrum.adicAbv K v).IsEquiv + (NumberField.HeightOneSpectrum.adicAbv K w) := by + intro h + have hnotle : ¬ v.asIdeal ≤ w.asIdeal := by + intro hvw_le + have htop_le : (⊤ : Ideal (𝓞 K)) ≤ w.asIdeal := by + rw [← (v.isCoprime_of_ne w hvw).sup_eq] + exact sup_le hvw_le le_rfl + exact w.isPrime.ne_top (top_unique htop_le) + obtain ⟨x, hxv, hxw⟩ := Set.not_subset.mp hnotle + have hvlt : + NumberField.HeightOneSpectrum.adicAbv K v + (algebraMap (𝓞 K) K x) < 1 := by + rw [← FinitePlace.norm_embedding] + exact (FinitePlace.norm_lt_one_iff_mem (K := K) v x).2 hxv + have hweq : + NumberField.HeightOneSpectrum.adicAbv K w + (algebraMap (𝓞 K) K x) = 1 := by + rw [← FinitePlace.norm_embedding] + exact (FinitePlace.norm_eq_one_iff_notMem (K := K) w x).2 hxw + exact (ne_of_lt hvlt) (h.eq_one_iff.mpr hweq) + +open scoped Classical in +theorem adicAbv_not_isEquiv_infinitePlace + (v : HeightOneSpectrum (𝓞 K)) (w : InfinitePlace K) : + ¬ (NumberField.HeightOneSpectrum.adicAbv K v).IsEquiv w.1 := by + intro h + have hle : + w.1 ((2 : ℕ) : K) ≤ 1 := + h.le_one_iff.mp + (NumberField.HeightOneSpectrum.adicAbv_natCast_le_one K v 2) + have hw : + w.1 ((2 : ℕ) : K) = (2 : ℝ) := + NumberField.InfinitePlace.map_natCast w 2 + have hfalse : (2 : ℝ) ≤ 1 := hw ▸ hle + norm_num at hfalse + +open scoped Classical in +theorem approximationAbsoluteValue_isNontrivial + (m : Modulus K) : + ∀ i, (approximationAbsoluteValue m i).IsNontrivial + | Sum.inl v => by + change + (NumberField.HeightOneSpectrum.adicAbv K v.1).IsNontrivial + exact adicAbv_isNontrivial v.1 + | Sum.inr w => by + change w.1.IsNontrivial + exact w.isNontrivial + +open scoped Classical in +theorem approximationAbsoluteValue_pairwise + (m : Modulus K) : + Pairwise fun i j => + ¬ (approximationAbsoluteValue m i).IsEquiv + (approximationAbsoluteValue m j) := by + intro i j hij + cases i with + | inl v => + cases j with + | inl w => + apply adicAbv_not_isEquiv_of_ne + intro hvw + apply hij + exact congrArg Sum.inl (Subtype.ext hvw) + | inr w => + exact adicAbv_not_isEquiv_infinitePlace v.1 w + | inr v => + cases j with + | inl w => + exact fun h => + adicAbv_not_isEquiv_infinitePlace w.1 v h.symm + | inr w => + intro h + apply hij + congr + change v.1.IsEquiv w.1 at h + exact + (InfinitePlace.eq_iff_isEquiv (K := K)).mpr h + +open scoped Classical in +/-- The corresponding product of local completions. -/ +abbrev approximationCompletion (m : Modulus K) : + ApproximationPlace m → Type _ + | Sum.inl v => v.1.adicCompletion K + | Sum.inr w => w.Completion + +open scoped Classical in +noncomputable instance approximationCompletionTopologicalSpace + (m : Modulus K) (i : ApproximationPlace m) : + TopologicalSpace (approximationCompletion m i) := by + cases i <;> simp only [approximationCompletion] <;> infer_instance + +open scoped Classical in +/-- Coordinatewise completion of the valued copies of `K`. -/ +def approximationCompletionMap (m : Modulus K) : + ∀ i : ApproximationPlace m, + WithAbs (approximationAbsoluteValue m i) → + approximationCompletion m i + | Sum.inl v => + fun x => + FinitePlace.embedding v.1 + (WithAbs.equiv + (NumberField.HeightOneSpectrum.adicAbv K v.1) x) + | Sum.inr w => fun x => (x : w.Completion) + +open scoped Classical in +theorem denseRange_finiteApproximationCompletionMap + (v : HeightOneSpectrum (𝓞 K)) : + DenseRange + (fun x : + WithAbs (NumberField.HeightOneSpectrum.adicAbv K v) => + FinitePlace.embedding v + (WithAbs.equiv + (NumberField.HeightOneSpectrum.adicAbv K v) x)) := by + have hrange : + Set.range + (fun x : + WithAbs (NumberField.HeightOneSpectrum.adicAbv K v) => + FinitePlace.embedding v + (WithAbs.equiv + (NumberField.HeightOneSpectrum.adicAbv K v) x)) = + Set.range (algebraMap K (v.adicCompletion K)) := by + ext y + constructor + · rintro ⟨x, rfl⟩ + exact + ⟨WithAbs.equiv + (NumberField.HeightOneSpectrum.adicAbv K v) x, rfl⟩ + · rintro ⟨x, rfl⟩ + refine + ⟨(WithAbs.equiv + (NumberField.HeightOneSpectrum.adicAbv K v)).symm x, ?_⟩ + rfl + rw [DenseRange, hrange] + exact v.denseRange_algebraMap K + +open scoped Classical in +theorem continuous_finiteApproximationCompletionMap + (v : HeightOneSpectrum (𝓞 K)) : + Continuous + (fun x : + WithAbs (NumberField.HeightOneSpectrum.adicAbv K v) => + FinitePlace.embedding v + (WithAbs.equiv + (NumberField.HeightOneSpectrum.adicAbv K v) x)) := by + apply Isometry.continuous + apply Isometry.of_dist_eq + intro x y + rw [dist_eq_norm, dist_eq_norm, ← map_sub, + FinitePlace.norm_embedding] + rfl + +open scoped Classical in +theorem denseRange_approximationCompletionMap + (m : Modulus K) : + ∀ i, DenseRange (approximationCompletionMap m i) + | Sum.inl v => denseRange_finiteApproximationCompletionMap v.1 + | Sum.inr w => + NumberField.InfinitePlace.Completion.denseRange_coe w + +open scoped Classical in +theorem continuous_approximationCompletionMap + (m : Modulus K) : + ∀ i, Continuous (approximationCompletionMap m i) + | Sum.inl v => continuous_finiteApproximationCompletionMap v.1 + | Sum.inr w => + NumberField.InfinitePlace.Completion.continuous_coe w + +open scoped Classical in +/-- The diagonal embedding into the finite product of the relevant +completions. -/ +def approximationEmbedding (m : Modulus K) : + K → (i : ApproximationPlace m) → approximationCompletion m i := + (Pi.map (approximationCompletionMap m)) ∘ + algebraMap K + ((i : ApproximationPlace m) → + WithAbs (approximationAbsoluteValue m i)) + +open scoped Classical in +@[simp] +theorem approximationEmbedding_finite + (m : Modulus K) (x : K) (v : ↥m.finitePart.support) : + approximationEmbedding m x (Sum.inl v) = + FinitePlace.embedding v.1 x := + rfl + +open scoped Classical in +@[simp] +theorem approximationEmbedding_infinite + (m : Modulus K) (x : K) (w : InfinitePlace K) : + approximationEmbedding m x (Sum.inr w) = + (x : w.Completion) := + rfl + +open scoped Classical in +theorem denseRange_approximationEmbedding (m : Modulus K) : + DenseRange (approximationEmbedding m) := by + exact + (DenseRange.piMap + (denseRange_approximationCompletionMap m)).comp + (AbsoluteValue.denseRange_algebraMap_pi + (approximationAbsoluteValue_isNontrivial m) + (approximationAbsoluteValue_pairwise m)) + (.piMap (continuous_approximationCompletionMap m)) + +open scoped Classical in +/-- The open set of field elements whose ratio with a fixed unit lies in +a prescribed open unit set. -/ +def unitRatioSet + {F : Type*} [Field F] (a : Fˣ) (U : Subgroup Fˣ) : + Set F := + Units.val '' (fun y : Fˣ => a * y⁻¹) ⁻¹' (U : Set Fˣ) + +open scoped Classical in +/-- The unit-ratio set associated to an open set of units is open. -/ +theorem isOpen_unitRatioSet + {F : Type*} [Field F] [TopologicalSpace F] + [IsTopologicalRing F] [ContinuousInv₀ F] [T1Space F] + (a : Fˣ) (U : Subgroup Fˣ) + (hU : IsOpen (U : Set Fˣ)) : + IsOpen (unitRatioSet a U) := by + apply IsOpenUnits.isOpenEmbedding_unitsVal.isOpenMap + exact hU.preimage (continuous_const.mul continuous_inv) + +open scoped Classical in +/-- The value of the distinguished unit belongs to its unit-ratio set. -/ +theorem val_mem_unitRatioSet + {F : Type*} [Field F] (a : Fˣ) (U : Subgroup Fˣ) : + (a : F) ∈ unitRatioSet a U := by + exact ⟨a, by simp, rfl⟩ + +open scoped Classical in +/-- The open local conditions that make `a / x` prime to `m`. -/ +def approximationTarget (m : Modulus K) (a : IdeleGroup K) : + ∀ i : ApproximationPlace m, Set (approximationCompletion m i) + | Sum.inl v => + unitRatioSet (a.2 v.1) + (localHigherUnitGroup v.1 (m.finitePart v.1)) + | Sum.inr w => + unitRatioSet + (ContinuousMulEquiv.piUnits a.1 w) + (m.localInfiniteCongruenceSubgroup w) + +open scoped Classical in +theorem isOpen_approximationTarget + (m : Modulus K) (a : IdeleGroup K) : + ∀ i, IsOpen (approximationTarget m a i) + | Sum.inl v => by + change IsOpen + (unitRatioSet (a.2 v.1) + (localHigherUnitGroup v.1 (m.finitePart v.1))) + exact isOpen_unitRatioSet _ _ + (isOpen_localHigherUnitGroup v.1 (m.finitePart v.1)) + | Sum.inr w => by + change IsOpen + (unitRatioSet + (ContinuousMulEquiv.piUnits a.1 w) + (m.localInfiniteCongruenceSubgroup w)) + apply isOpen_unitRatioSet _ _ + classical + by_cases hw : w.IsReal + · by_cases hmem : (⟨w, hw⟩ : RealPlace K) ∈ m.infinitePart + · rw [Modulus.localInfiniteCongruenceSubgroup, + dite_eq_left hw, dite_eq_left hmem] + exact isOpen_infinitePositiveSubgroup w + · rw [Modulus.localInfiniteCongruenceSubgroup, + dite_eq_left hw, dite_eq_right hmem] + exact isOpen_univ + · rw [Modulus.localInfiniteCongruenceSubgroup, dite_eq_right hw] + exact isOpen_univ + +open scoped Classical in +/-- The given idele itself lies in the product of its approximation +neighborhoods. -/ +def approximationTargetPoint + (m : Modulus K) (a : IdeleGroup K) : + (i : ApproximationPlace m) → approximationCompletion m i + | Sum.inl v => (a.2 v.1 : v.1.adicCompletion K) + | Sum.inr w => + (ContinuousMulEquiv.piUnits a.1 w : w.Completion) + +open scoped Classical in +theorem approximationTargetPoint_mem + (m : Modulus K) (a : IdeleGroup K) : + approximationTargetPoint m a ∈ + Set.univ.pi (approximationTarget m a) := by + intro i _hi + cases i with + | inl v => + exact val_mem_unitRatioSet _ _ + | inr w => + exact val_mem_unitRatioSet _ _ + +open scoped Classical in +/-- Weak approximation in the precise open local cosets required by the +modulus. -/ +theorem exists_principal_quotient_mem_primeTo + (m : Modulus K) (a : IdeleGroup K) : + ∃ x : Kˣ, + a * (IdeleGroup.principalIdele K x)⁻¹ ∈ + idelePrimeToModulusSubgroup m := by + let U : Set + ((i : ApproximationPlace m) → approximationCompletion m i) := + Set.univ.pi (approximationTarget m a) + have hUOpen : IsOpen U := by + exact isOpen_set_pi Set.finite_univ fun i _hi => + isOpen_approximationTarget m a i + have hUNonempty : U.Nonempty := + ⟨approximationTargetPoint m a, + approximationTargetPoint_mem m a⟩ + obtain ⟨x, hx⟩ := + (denseRange_approximationEmbedding m).exists_mem_open + hUOpen hUNonempty + let w₀ : InfinitePlace K := Classical.choice inferInstance + have hxw₀ := + hx (Sum.inr w₀) (Set.mem_univ (Sum.inr w₀)) + change + (x : w₀.Completion) ∈ + unitRatioSet + (ContinuousMulEquiv.piUnits a.1 w₀) + (m.localInfiniteCongruenceSubgroup w₀) at hxw₀ + obtain ⟨y₀, _hy₀, hy₀x⟩ := hxw₀ + have hx0 : x ≠ 0 := by + intro hxzero + apply Units.ne_zero y₀ + rw [hy₀x, hxzero, + NumberField.InfinitePlace.Completion.coe_zero] + let xu : Kˣ := Units.mk0 x hx0 + refine ⟨xu, ?_⟩ + constructor + · apply + (Modulus.mem_infiniteCongruenceSubgroup_iff_local m + (a * (IdeleGroup.principalIdele K xu)⁻¹).1).2 + intro w + have hw := + hx (Sum.inr w) (Set.mem_univ (Sum.inr w)) + change + (x : w.Completion) ∈ + unitRatioSet + (ContinuousMulEquiv.piUnits a.1 w) + (m.localInfiniteCongruenceSubgroup w) at hw + obtain ⟨y, hy, hyx⟩ := hw + have hprincipal : + ContinuousMulEquiv.piUnits + (IdeleGroup.principalIdele K xu).1 w = + y := by + apply Units.ext + calc + ((ContinuousMulEquiv.piUnits + (IdeleGroup.principalIdele K xu).1 w : + w.Completionˣ) : w.Completion) = + (xu : K) := + IdeleGroup.infiniteComponent_principalIdele xu w + _ = (x : K) := rfl + _ = (y : w.Completion) := hyx.symm + change + ContinuousMulEquiv.piUnits a.1 w * + (ContinuousMulEquiv.piUnits + (IdeleGroup.principalIdele K xu).1 w)⁻¹ ∈ + m.localInfiniteCongruenceSubgroup w + rw [hprincipal] + exact hy + · intro v hv + let vm : ↥m.finitePart.support := ⟨v, hv⟩ + have hvx := + hx (Sum.inl vm) (Set.mem_univ (Sum.inl vm)) + change + FinitePlace.embedding v x ∈ + unitRatioSet (a.2 v) + (localHigherUnitGroup v (m.finitePart v)) at hvx + obtain ⟨y, hy, hyx⟩ := hvx + have hprincipal : + (IdeleGroup.principalIdele K xu).2 v = y := by + apply Units.ext + calc + (((IdeleGroup.principalIdele K xu).2 v : + (v.adicCompletion K)ˣ) : v.adicCompletion K) = + (xu : K) := + IdeleGroup.finiteComponent_principalIdele xu v + _ = (x : K) := rfl + _ = (y : v.adicCompletion K) := hyx.symm + change + a.2 v * + ((IdeleGroup.principalIdele K xu).2 v)⁻¹ ∈ + localHigherUnitGroup v (m.finitePart v) + rw [hprincipal] + exact hy + +open scoped Classical in +/-- Approximation identifies the idele group as +`I_K = I_K^(m) Kˣ`. -/ +theorem idelePrimeToModulusSubgroup_sup_principalSubgroup + (m : Modulus K) : + idelePrimeToModulusSubgroup m ⊔ + IdeleGroup.principalSubgroup K = + ⊤ := by + apply top_unique + intro a _ha + obtain ⟨x, hx⟩ := + exists_principal_quotient_mem_primeTo m a + rw [Subgroup.mem_sup] + refine + ⟨a * (IdeleGroup.principalIdele K x)⁻¹, hx, + IdeleGroup.principalIdele K x, ⟨x, rfl⟩, ?_⟩ + group + +open scoped Classical in +/-- The natural map from the prime-to-`m` ideles to the full idelic +ray-class quotient. -/ +def primeToRayClassProjection (m : Modulus K) : + idelePrimeToModulusSubgroup m →* + IdeleGroup K ⧸ + (m.ideleCongruenceSubgroup ⊔ + IdeleGroup.principalSubgroup K) := + (QuotientGroup.mk' + (m.ideleCongruenceSubgroup ⊔ + IdeleGroup.principalSubgroup K)).comp + (idelePrimeToModulusSubgroup m).subtype + +open scoped Classical in +theorem primeToRayClassProjection_ker (m : Modulus K) : + (primeToRayClassProjection m).ker = + raySubgroupInPrimeTo m := by + ext a + constructor + · intro ha + have hN : + (a : IdeleGroup K) ∈ + m.ideleCongruenceSubgroup ⊔ + IdeleGroup.principalSubgroup K := by + rw [← QuotientGroup.eq_one_iff] + exact MonoidHom.mem_ker.mp ha + rw [Subgroup.mem_sup] at hN + obtain ⟨c, hc, p, hp, hcp⟩ := hN + have hcA : + c ∈ idelePrimeToModulusSubgroup m := + ideleCongruenceSubgroup_le_primeTo m hc + have hpA : + p ∈ idelePrimeToModulusSubgroup m := by + have haA : + (a : IdeleGroup K) ∈ + idelePrimeToModulusSubgroup m := + a.property + have hmul : + c⁻¹ * (a : IdeleGroup K) ∈ + idelePrimeToModulusSubgroup m := + (idelePrimeToModulusSubgroup m).mul_mem + ((idelePrimeToModulusSubgroup m).inv_mem hcA) haA + rw [← hcp] at hmul + simpa using hmul + rw [raySubgroupInPrimeTo, Subgroup.mem_sup] + refine + ⟨⟨c, hcA⟩, ?_, ⟨p, hpA⟩, ?_, ?_⟩ + · exact hc + · exact hp + · apply Subtype.ext + exact hcp + · intro ha + apply MonoidHom.mem_ker.mpr + change + QuotientGroup.mk' + (m.ideleCongruenceSubgroup ⊔ + IdeleGroup.principalSubgroup K) + (a : IdeleGroup K) = + 1 + rw [QuotientGroup.mk'_apply, + QuotientGroup.eq_one_iff] + rw [raySubgroupInPrimeTo, Subgroup.mem_sup] at ha + obtain ⟨c, hc, p, hp, rfl⟩ := ha + apply + (m.ideleCongruenceSubgroup ⊔ + IdeleGroup.principalSubgroup K).mul_mem + · exact + (show m.ideleCongruenceSubgroup ≤ + m.ideleCongruenceSubgroup ⊔ + IdeleGroup.principalSubgroup K from le_sup_left) hc + · exact + (show IdeleGroup.principalSubgroup K ≤ + m.ideleCongruenceSubgroup ⊔ + IdeleGroup.principalSubgroup K from le_sup_right) hp + +open scoped Classical in +theorem primeToRayClassProjection_surjective (m : Modulus K) : + Function.Surjective (primeToRayClassProjection m) := by + intro q + refine q.inductionOn' ?_ + intro g + have hg : + g ∈ idelePrimeToModulusSubgroup m ⊔ + IdeleGroup.principalSubgroup K := by + rw [idelePrimeToModulusSubgroup_sup_principalSubgroup m] + exact Subgroup.mem_top g + rw [Subgroup.mem_sup] at hg + obtain ⟨a, ha, p, hp, hap⟩ := hg + refine ⟨⟨a, ha⟩, ?_⟩ + change + QuotientGroup.mk' + (m.ideleCongruenceSubgroup ⊔ + IdeleGroup.principalSubgroup K) a = + QuotientGroup.mk' + (m.ideleCongruenceSubgroup ⊔ + IdeleGroup.principalSubgroup K) g + rw [← hap, map_mul] + have hpN : + p ∈ m.ideleCongruenceSubgroup ⊔ + IdeleGroup.principalSubgroup K := + (show IdeleGroup.principalSubgroup K ≤ + m.ideleCongruenceSubgroup ⊔ + IdeleGroup.principalSubgroup K from le_sup_right) hp + have hmkp : + QuotientGroup.mk' + (m.ideleCongruenceSubgroup ⊔ + IdeleGroup.principalSubgroup K) p = + 1 := by + rw [QuotientGroup.mk'_apply, + QuotientGroup.eq_one_iff] + exact hpN + rw [hmkp] + exact + (mul_one + (QuotientGroup.mk' + (m.ideleCongruenceSubgroup ⊔ + IdeleGroup.principalSubgroup K) a)).symm + +open scoped Classical in +/-- Restricting the full idelic ray-class quotient to prime-to-`m` +ideles is an equivalence. -/ +def quotientRaySubgroupEquivIdeleRayQuotient + (m : Modulus K) : + idelePrimeToModulusSubgroup m ⧸ + raySubgroupInPrimeTo m ≃* + IdeleGroup K ⧸ + (m.ideleCongruenceSubgroup ⊔ + IdeleGroup.principalSubgroup K) := + (QuotientGroup.quotientMulEquivOfEq + (primeToRayClassProjection_ker m).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (primeToRayClassProjection m) + (primeToRayClassProjection_surjective m)) + +open scoped Classical in +/-- The quotient equivalence induced by the idelic ray projection evaluates +on a prime-to-modulus idele class as the original projection. -/ +theorem quotientRaySubgroupEquivIdeleRayQuotient_mk + (m : Modulus K) (a : idelePrimeToModulusSubgroup m) : + quotientRaySubgroupEquivIdeleRayQuotient m + (QuotientGroup.mk' (raySubgroupInPrimeTo m) a) = + primeToRayClassProjection m a := by + rw [quotientRaySubgroupEquivIdeleRayQuotient, + MulEquiv.trans_apply, QuotientGroup.mk'_apply, + QuotientGroup.quotientMulEquivOfEq_mk] + exact QuotientGroup.kerLift_mk (primeToRayClassProjection m) a + +open scoped Classical in +/-- The idelic and ideal-theoretic ray class +groups are canonically multiplicatively equivalent. -/ +def rayClassGroupEquivIdealRayClassGroup + (m : Modulus K) : + RayClassGroup m ≃* IdealRayClassGroup m := + (rayClassGroupEquivIdeleQuotient m).trans + ((quotientRaySubgroupEquivIdeleRayQuotient m).symm.trans + (quotientRaySubgroupEquivIdealRayClassGroup m)) + +end RayClass diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/IdealNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/IdealNorm.lean new file mode 100644 index 0000000000..bfc600428b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/IdealNorm.lean @@ -0,0 +1,670 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormLocalOrder +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormContinuity +public import Mathlib.Algebra.BigOperators.Finsupp.Basic +/-! +# Norms of ideals prime to a modulus + +For a finite extension `L / K`, the norm of a prime of `L` +above `v` is `v` raised to the inertia degree. Extending this rule +multiplicatively gives the genuine norm on nonzero fractional ideals. + +If `m` is a modulus of `K`, a modulus upstairs is chosen deeply enough +at every prime above `m` that local norms preserve the prescribed +higher-unit conditions. The norm therefore restricts to the groups of +fractional ideals prime to these moduli. Its image, together with the +principal ray ideals, is the norm-defined ideal group +`N_{L/K} J_L^m P_K^m`. +-/ + +@[expose] public section + +open scoped BigOperators NumberField Topology +open NumberField IsDedekindDomain + +noncomputable +section + +namespace RayClass + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- At a prime `W` above `v`, a sufficiently deep higher-unit group +has norm contained in the higher-unit group prescribed by `m` at `v`. +This is the source of the lifted modulus used for ideal norms. -/ +theorem exists_localHigherUnitGroup_le_norm_preimage + (m : Modulus K) + (W : HeightOneSpectrum (𝓞 L)) : + let v := _root_.finitePlaceBelow (K := K) W + letI : Algebra (v.adicCompletion K) (W.adicCompletion L) := + (_root_.finitePlaceAdicCompletionMap K L v ⟨W, rfl⟩).toAlgebra + ∃ n : ℕ, + localHigherUnitGroup W n ≤ + (localHigherUnitGroup v (m.finitePart v)).comap + (LocalFieldTheory.normUnits + (v.adicCompletion K) (W.adicCompletion L)) := by + classical + let v := _root_.finitePlaceBelow (K := K) W + let : Algebra (v.adicCompletion K) (W.adicCompletion L) := + (_root_.finitePlaceAdicCompletionMap K L v ⟨W, rfl⟩).toAlgebra + let : IsScalarTower + K (v.adicCompletion K) (W.adicCompletion L) := + _root_.finitePlaceAdicCompletionMap_isScalarTower K L v ⟨W, rfl⟩ + let : ContinuousSMul + (v.adicCompletion K) (W.adicCompletion L) := + continuousSMul_of_algebraMap _ _ (by + change Continuous + (_root_.finitePlaceAdicCompletionMap K L v ⟨W, rfl⟩) + exact + _root_.finitePlaceAdicCompletionMap_continuous + K L v ⟨W, rfl⟩) + let : FiniteDimensional + (v.adicCompletion K) (W.adicCompletion L) := + inferInstance + let : NontriviallyNormedField (v.adicCompletion K) := + NontriviallyNormedField.ofNormNeOne (by + obtain ⟨ϖ, hϖ⟩ := + IsDiscreteValuationRing.exists_irreducible + (v.adicCompletionIntegers K) + refine ⟨(ϖ : v.adicCompletion K), ?_, ?_⟩ + · intro h + exact hϖ.ne_zero (Subtype.ext h) + · exact ne_of_lt (local_irreducible_norm_lt_one v hϖ)) + let U : Set (W.adicCompletion L)ˣ := + (LocalFieldTheory.normUnits + (v.adicCompletion K) (W.adicCompletion L)) ⁻¹' + (localHigherUnitGroup v (m.finitePart v) : + Set (v.adicCompletion K)ˣ) + have hTarget : + (localHigherUnitGroup v (m.finitePart v) : + Set (v.adicCompletion K)ˣ) ∈ + 𝓝 (1 : (v.adicCompletion K)ˣ) := + (isOpen_localHigherUnitGroup v (m.finitePart v)).mem_nhds + (localHigherUnitGroup v (m.finitePart v)).one_mem + have hU : U ∈ 𝓝 (1 : (W.adicCompletion L)ˣ) := by + have hcont := + LocalFieldTheory.normUnits_continuous_of_finiteDimensional + (v.adicCompletion K) (W.adicCompletion L) + have hTarget' : + (localHigherUnitGroup v (m.finitePart v) : + Set (v.adicCompletion K)ˣ) ∈ + 𝓝 (LocalFieldTheory.normUnits + (v.adicCompletion K) (W.adicCompletion L) 1) := by + simpa using hTarget + simpa [U] using hcont.continuousAt hTarget' + obtain ⟨n, hn⟩ := + exists_localHigherUnitGroup_subset W hU + refine ⟨n, ?_⟩ + intro x hx + exact hn hx + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- The positive local depth used at `W` in the lifted modulus. It is +zero precisely away from the inverse image of the support of `m`. -/ +noncomputable def idealNormLiftedModulusExponent + (m : Modulus K) + (W : HeightOneSpectrum (𝓞 L)) : ℕ := + if _ : + _root_.finitePlaceBelow (K := K) W ∈ m.finitePart.support then + Nat.find + (exists_localHigherUnitGroup_le_norm_preimage + (K := K) (L := L) m W) + 1 + else + 0 + +omit [FiniteDimensional K L] in +open scoped Classical in +theorem idealNormLiftedModulusExponent_pos + (m : Modulus K) + (W : HeightOneSpectrum (𝓞 L)) + (hW : + _root_.finitePlaceBelow (K := K) W ∈ m.finitePart.support) : + 0 < idealNormLiftedModulusExponent + (K := K) (L := L) m W := by + rw [idealNormLiftedModulusExponent, dite_eq_left hW] + exact Nat.zero_lt_succ _ + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- The chosen positive depth still has the required local norm +property. -/ +theorem localHigherUnitGroup_idealNormLiftedModulusExponent_le + (m : Modulus K) + (W : HeightOneSpectrum (𝓞 L)) + (hW : + _root_.finitePlaceBelow (K := K) W ∈ m.finitePart.support) : + let v := _root_.finitePlaceBelow (K := K) W + letI : Algebra (v.adicCompletion K) (W.adicCompletion L) := + (_root_.finitePlaceAdicCompletionMap K L v ⟨W, rfl⟩).toAlgebra + localHigherUnitGroup W + (idealNormLiftedModulusExponent + (K := K) (L := L) m W) ≤ + (localHigherUnitGroup v (m.finitePart v)).comap + (LocalFieldTheory.normUnits + (v.adicCompletion K) (W.adicCompletion L)) := by + classical + let v := _root_.finitePlaceBelow (K := K) W + let : Algebra (v.adicCompletion K) (W.adicCompletion L) := + (_root_.finitePlaceAdicCompletionMap K L v ⟨W, rfl⟩).toAlgebra + rw [idealNormLiftedModulusExponent, dite_eq_left hW] + exact + (localHigherUnitGroup_antitone W (Nat.le_succ _)).trans + (Nat.find_spec + (exists_localHigherUnitGroup_le_norm_preimage + (K := K) (L := L) m W)) + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- At a prime above the support, the selected positive depth is at most the +successor of every depth having the required local norm property. -/ +theorem idealNormLiftedModulusExponent_min + (m : Modulus K) + (W : HeightOneSpectrum (𝓞 L)) + (hW : + _root_.finitePlaceBelow (K := K) W ∈ m.finitePart.support) + (r : ℕ) + (hr : + let v := _root_.finitePlaceBelow (K := K) W + letI : Algebra (v.adicCompletion K) (W.adicCompletion L) := + (_root_.finitePlaceAdicCompletionMap K L v ⟨W, rfl⟩).toAlgebra + localHigherUnitGroup W r ≤ + (localHigherUnitGroup v (m.finitePart v)).comap + (LocalFieldTheory.normUnits + (v.adicCompletion K) (W.adicCompletion L))) : + idealNormLiftedModulusExponent (K := K) (L := L) m W ≤ r + 1 := by + classical + let v := _root_.finitePlaceBelow (K := K) W + let : Algebra (v.adicCompletion K) (W.adicCompletion L) := + (_root_.finitePlaceAdicCompletionMap K L v ⟨W, rfl⟩).toAlgebra + rw [idealNormLiftedModulusExponent, dite_eq_left hW] + exact Nat.add_le_add_right + (Nat.find_min' + (exists_localHigherUnitGroup_le_norm_preimage + (K := K) (L := L) m W) hr) 1 + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- Away from the pulled-back support, the lifted exponent is zero. -/ +@[simp] +theorem idealNormLiftedModulusExponent_eq_zero_of_not_mem + (m : Modulus K) + (W : HeightOneSpectrum (𝓞 L)) + (hW : + _root_.finitePlaceBelow (K := K) W ∉ m.finitePart.support) : + idealNormLiftedModulusExponent (K := K) (L := L) m W = 0 := by + rw [idealNormLiftedModulusExponent, dite_eq_right hW] + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- The finite set of primes upstairs lying over the support of `m`. -/ +def idealNormLiftedSupport (m : Modulus K) : + Set (HeightOneSpectrum (𝓞 L)) := + {W | + _root_.finitePlaceBelow (K := K) W ∈ m.finitePart.support} + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- The inverse image of the finite support of a modulus is finite. -/ +theorem idealNormLiftedSupport_finite (m : Modulus K) : + (idealNormLiftedSupport (K := K) (L := L) m).Finite := by + exact + _root_.Set.Finite.preimage_finitePlaceBelow + (K := K) (L := L) m.finitePart.support.finite_toSet + +open scoped Classical in +/-- A modulus upstairs whose local higher-unit conditions are carried +by the field norm into the conditions of `m`. -/ +noncomputable def idealNormLiftedModulus + (m : Modulus K) : Modulus L := + Modulus.ofFinite <| + Finsupp.onFinset + (idealNormLiftedSupport_finite + (K := K) (L := L) m).toFinset + (idealNormLiftedModulusExponent + (K := K) (L := L) m) + (by + intro W hW + rw [Set.Finite.mem_toFinset] + by_contra hbelow + apply hW + rw [idealNormLiftedModulusExponent, dite_eq_right] + exact hbelow) + +omit [FiniteDimensional K L] in +open scoped Classical in +@[simp] +theorem idealNormLiftedModulus_apply + (m : Modulus K) + (W : HeightOneSpectrum (𝓞 L)) : + (idealNormLiftedModulus (K := K) (L := L) m).finitePart W = + idealNormLiftedModulusExponent + (K := K) (L := L) m W := + rfl + +omit [FiniteDimensional K L] in +open scoped Classical in +theorem mem_idealNormLiftedModulus_support_iff + (m : Modulus K) + (W : HeightOneSpectrum (𝓞 L)) : + W ∈ (idealNormLiftedModulus + (K := K) (L := L) m).finitePart.support ↔ + _root_.finitePlaceBelow (K := K) W ∈ m.finitePart.support := by + rw [Finsupp.mem_support_iff, idealNormLiftedModulus_apply] + by_cases hW : + _root_.finitePlaceBelow (K := K) W ∈ m.finitePart.support + · rw [idealNormLiftedModulusExponent, dite_eq_left hW] + exact ⟨fun _ => hW, fun _ => Nat.succ_ne_zero _⟩ + · simp [idealNormLiftedModulusExponent, hW] + +open scoped Classical in +/-- Pushforward of the prime-exponent vector under ideal norm. A +prime `W` contributes its exponent multiplied by the inertia degree +to the prime below it. -/ +noncomputable def idealNormExponentMap : + (HeightOneSpectrum (𝓞 L) →₀ ℤ) →+ + (HeightOneSpectrum (𝓞 K) →₀ ℤ) := + Finsupp.liftAddHom fun W => + (Finsupp.singleAddHom + (_root_.finitePlaceBelow (K := K) W)).comp + (AddMonoidHom.mulLeft + (W.asIdeal.inertiaDeg (𝓞 K) : ℤ)) + +omit [FiniteDimensional K L] in +open scoped Classical in +@[simp] +theorem idealNormExponentMap_apply + (e : HeightOneSpectrum (𝓞 L) →₀ ℤ) + (v : HeightOneSpectrum (𝓞 K)) : + idealNormExponentMap (K := K) (L := L) e v = + e.sum fun W n => + if _root_.finitePlaceBelow (K := K) W = v then + (W.asIdeal.inertiaDeg (𝓞 K) : ℤ) * n + else + 0 := by + classical + simp [idealNormExponentMap, Finsupp.single_apply, eq_comm] + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- The exponent pushforward can equivalently be written as the finite +sum over the primes above one fixed base prime. -/ +theorem idealNormExponentMap_apply_eq_sum_above + (e : HeightOneSpectrum (𝓞 L) →₀ ℤ) + (v : HeightOneSpectrum (𝓞 K)) + [Fintype {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v}] : + idealNormExponentMap (K := K) (L := L) e v = + ∑ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v}, + (W.1.asIdeal.inertiaDeg (𝓞 K) : ℤ) * e W.1 := by + classical + let p : HeightOneSpectrum (𝓞 L) → Prop := + fun W => _root_.finitePlaceBelow (K := K) W = v + let eAbove : {W : HeightOneSpectrum (𝓞 L) // p W} →₀ ℤ := + e.subtypeDomain p + rw [idealNormExponentMap_apply] + calc + e.sum + (fun W n => + if _root_.finitePlaceBelow (K := K) W = v then + (W.asIdeal.inertiaDeg (𝓞 K) : ℤ) * n + else 0) = + eAbove.sum + (fun W n => + (W.1.asIdeal.inertiaDeg (𝓞 K) : ℤ) * n) := by + simp only [eAbove, p, Finsupp.sum, Finsupp.support_subtypeDomain, + Finsupp.subtypeDomain_apply] + calc + (∑ W ∈ e.support, + if _root_.finitePlaceBelow (K := K) W = v then + (W.asIdeal.inertiaDeg (𝓞 K) : ℤ) * e W + else 0) = + ∑ W ∈ e.support.filter + (fun W => _root_.finitePlaceBelow (K := K) W = v), + (W.asIdeal.inertiaDeg (𝓞 K) : ℤ) * e W := + (Finset.sum_filter _ _).symm + _ = + ∑ W ∈ Finset.subtype + (fun W => _root_.finitePlaceBelow (K := K) W = v) + e.support, + (W.1.asIdeal.inertiaDeg (𝓞 K) : ℤ) * e W.1 := + (Finset.sum_subtype_eq_sum_filter + (fun W => (W.asIdeal.inertiaDeg (𝓞 K) : ℤ) * e W)).symm + _ = + ∑ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v}, + (W.1.asIdeal.inertiaDeg (𝓞 K) : ℤ) * e W.1 := by + rw [Finsupp.sum_fintype] + · rfl + · intro W + simp + +open scoped Classical in +private theorem factorizationEquiv_symm_toAdd + (I : FractionalIdealGroup L) : + ((FractionalIdealGroup.factorizationEquiv + (K := L)).symm I).toAdd = + FractionalIdealGroup.countVector I := by + ext W + have h := FractionalIdealGroup.count_factorization + ((FractionalIdealGroup.factorizationEquiv + (K := L)).symm I) W + have hfac := + (FractionalIdealGroup.factorizationEquiv + (K := L)).apply_symm_apply I + change + FractionalIdealGroup.factorization + ((FractionalIdealGroup.factorizationEquiv + (K := L)).symm I) = I at hfac + rw [hfac] at h + exact h.symm.trans (FractionalIdealGroup.countVector_apply I W).symm + +open scoped Classical in +/-- The genuine relative norm on nonzero fractional ideals. -/ +noncomputable def fractionalIdealNorm : + FractionalIdealGroup L →* FractionalIdealGroup K := + (FractionalIdealGroup.factorizationEquiv + (K := K)).toMonoidHom.comp + ((idealNormExponentMap + (K := K) (L := L)).toMultiplicative.comp + (FractionalIdealGroup.factorizationEquiv + (K := L)).symm.toMonoidHom) + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- The exponent of the norm at `v` is the inertia-degree weighted +pushforward of the upstairs prime exponents. -/ +theorem count_fractionalIdealNorm + (I : FractionalIdealGroup L) + (v : HeightOneSpectrum (𝓞 K)) : + FractionalIdeal.count K v + (fractionalIdealNorm (K := K) (L := L) I : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = + idealNormExponentMap (K := K) (L := L) + (FractionalIdealGroup.countVector I) v := by + change + FractionalIdeal.count K v + ((FractionalIdealGroup.factorization + ((idealNormExponentMap + (K := K) (L := L)).toMultiplicative + ((FractionalIdealGroup.factorizationEquiv + (K := L)).symm I)) : FractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = + _ + rw [FractionalIdealGroup.count_factorization] + change + idealNormExponentMap (K := K) (L := L) + ((FractionalIdealGroup.factorizationEquiv + (K := L)).symm I).toAdd v = + _ + rw [factorizationEquiv_symm_toAdd] + +omit [FiniteDimensional K L] in +open scoped Classical in +private theorem fractionalIdealNormPrimeBelow_eq_finitePlaceBelow + (W : HeightOneSpectrum (𝓞 L)) : + ClassFieldTheory.fractionalIdealNormPrimeBelow K L W = + _root_.finitePlaceBelow (K := K) W := by + ext + rfl + +omit [FiniteDimensional K L] in +open scoped Classical in +private theorem idealNormExponentMap_eq_public : + idealNormExponentMap (K := K) (L := L) = + ClassFieldTheory.fractionalIdealNormExponentMap K L := by + unfold idealNormExponentMap ClassFieldTheory.fractionalIdealNormExponentMap + simp only [fractionalIdealNormPrimeBelow_eq_finitePlaceBelow] + +open scoped Classical in +private theorem factorizationEquiv_eq_public + (F : Type) [Field F] [NumberField F] : + FractionalIdealGroup.factorizationEquiv (K := F) = + ClassFieldTheory.NumberFieldFractionalIdealGroup.factorizationEquiv + (K := F) := by + apply MulEquiv.ext + intro exps + apply FractionalIdealGroup.ext_count + intro v + change FractionalIdeal.count F v + ((FractionalIdealGroup.factorization exps : FractionalIdealGroup F) : + FractionalIdeal (nonZeroDivisors (𝓞 F)) F) = + FractionalIdeal.count F v + ((ClassFieldTheory.NumberFieldFractionalIdealGroup.factorization exps : + FractionalIdealGroup F) : + FractionalIdeal (nonZeroDivisors (𝓞 F)) F) + rw [FractionalIdealGroup.count_factorization, + ClassFieldTheory.NumberFieldFractionalIdealGroup.count_factorization] + +open scoped Classical in +/-- The Mathlib-level public fractional-ideal norm agrees with the norm used +by the idelic and ray-class constructions. -/ +theorem fractionalIdealNorm_eq_public : + fractionalIdealNorm (K := K) (L := L) = + ClassFieldTheory.fractionalIdealNorm K L := by + unfold fractionalIdealNorm ClassFieldTheory.fractionalIdealNorm + rw [factorizationEquiv_eq_public K, + factorizationEquiv_eq_public L, + idealNormExponentMap_eq_public] + +open scoped Classical in +/-- The exponent of the fractional ideal attached to an idèle is its +finite local order. -/ +@[simp] +theorem _root_.IdeleGroup.count_fractionalIdeal + (a : IdeleGroup K) + (v : HeightOneSpectrum (𝓞 K)) : + FractionalIdeal.count K v + (IdeleGroup.fractionalIdeal a : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = + (FiniteIdeleGroup.localOrder v + (IdeleGroup.finiteComponent v a)).toAdd := by + change + FractionalIdeal.count K v + (((FractionalIdealGroup.factorization (K := K)) + (FiniteIdeleGroup.valuationVector a.2) : + FractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = + _ + rw [FractionalIdealGroup.count_factorization] + rfl + +open scoped Classical in +/-- The genuine ideal norm is the fractional-ideal image of the +ordinary idèle norm. -/ +theorem _root_.IdeleGroup.fractionalIdeal_ideleNorm + (a : IdeleGroup L) : + IdeleGroup.fractionalIdeal (IdeleGroup.norm K L a) = + fractionalIdealNorm (K := K) (L := L) + (IdeleGroup.fractionalIdeal a) := by + classical + apply FractionalIdealGroup.ext_count + intro v + let vK := HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + adicAbv_isNontrivial v + let eAbove := + finitePlaceExtensionEquivAbove + (K := K) (L := L) v + let := + AlgebraicNumberTheory.Valuations.completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + let : Fintype {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v} := + Fintype.ofEquiv + (AlgebraicNumberTheory.Valuations.AbsoluteValueExtension vK L) eAbove + let : ∀ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v}, + Algebra (v.adicCompletion K) (W.1.adicCompletion L) := + fun W => + (_root_.finitePlaceAdicCompletionMap K L v W).toAlgebra + rw [IdeleGroup.count_fractionalIdeal, + count_fractionalIdealNorm] + rw [IdeleGroup.finiteComponent_norm_eq_prod] + rw [map_prod, toAdd_prod] + change + (∑ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v}, + (FiniteIdeleGroup.localOrder v + (LocalFieldTheory.normUnits + (v.adicCompletion K) (W.1.adicCompletion L) + (IdeleGroup.finiteComponent W.1 a))).toAdd) = + _ + rw [idealNormExponentMap_apply_eq_sum_above] + apply Finset.sum_congr rfl + intro W _hW + rw [FiniteIdeleGroup.localOrder_normUnits K L v W] + rw [FractionalIdealGroup.countVector_apply, + IdeleGroup.count_fractionalIdeal] + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- The fractional ideal norm preserves coprimality with a modulus +after passing to the lifted modulus upstairs. -/ +theorem fractionalIdealNorm_mem_primeToModulusIdeals + (m : Modulus K) + (I : primeToModulusIdeals + (idealNormLiftedModulus (K := K) (L := L) m)) : + fractionalIdealNorm (K := K) (L := L) + (I : FractionalIdealGroup L) ∈ + primeToModulusIdeals m := by + intro v hv + rw [count_fractionalIdealNorm, + idealNormExponentMap_apply] + classical + simp only [Finsupp.sum] + apply Finset.sum_eq_zero + intro W hW + by_cases hbelow : + _root_.finitePlaceBelow (K := K) W = v + · rw [ite_eq_left hbelow] + have hLifted : + W ∈ (idealNormLiftedModulus + (K := K) (L := L) m).finitePart.support := by + rw [mem_idealNormLiftedModulus_support_iff, hbelow] + exact hv + rw [FractionalIdealGroup.countVector_apply, I.property W hLifted] + simp + · rw [ite_eq_right hbelow] + +open scoped Classical in +/-- The ideal norm restricted to fractional ideals prime to the +corresponding moduli. -/ +noncomputable def primeToModulusIdealNorm + (m : Modulus K) : + primeToModulusIdeals + (idealNormLiftedModulus (K := K) (L := L) m) →* + primeToModulusIdeals m where + toFun I := + ⟨fractionalIdealNorm (K := K) (L := L) + (I : FractionalIdealGroup L), + fractionalIdealNorm_mem_primeToModulusIdeals + (K := K) (L := L) m I⟩ + map_one' := by + apply Subtype.ext + exact map_one _ + map_mul' I J := by + apply Subtype.ext + exact map_mul _ _ _ + +omit [FiniteDimensional K L] in +open scoped Classical in +@[simp] +theorem primeToModulusIdealNorm_coe + (m : Modulus K) + (I : primeToModulusIdeals + (idealNormLiftedModulus (K := K) (L := L) m)) : + (primeToModulusIdealNorm + (K := K) (L := L) m I : + FractionalIdealGroup K) = + fractionalIdealNorm (K := K) (L := L) + (I : FractionalIdealGroup L) := + rfl + +open scoped Classical in +/-- The finite component of an idèle prime to the lifted modulus has +norm satisfying the finite prime-to conditions of the base modulus. -/ +theorem finite_norm_mem_finitePrimeToModulusSubgroup + (m : Modulus K) + (a : idelePrimeToModulusSubgroup + (idealNormLiftedModulus (K := K) (L := L) m)) : + (IdeleGroup.norm K L (a : IdeleGroup L)).2 ∈ + finitePrimeToModulusSubgroup m := by + classical + intro v hv + let vK := HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + adicAbv_isNontrivial v + let eAbove := + finitePlaceExtensionEquivAbove + (K := K) (L := L) v + let := + AlgebraicNumberTheory.Valuations.completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + let : Fintype {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v} := + Fintype.ofEquiv + (AlgebraicNumberTheory.Valuations.AbsoluteValueExtension vK L) eAbove + let : ∀ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v}, + Algebra (v.adicCompletion K) (W.1.adicCompletion L) := + fun W => + (_root_.finitePlaceAdicCompletionMap K L v W).toAlgebra + change IdeleGroup.finiteComponent v + (IdeleGroup.norm K L (a : IdeleGroup L)) ∈ + localHigherUnitGroup v (m.finitePart v) + rw [IdeleGroup.finiteComponent_norm_eq_prod] + apply Subgroup.prod_mem + rintro ⟨W, rfl⟩ _ + have hnorm := + localHigherUnitGroup_idealNormLiftedModulusExponent_le + (K := K) (L := L) m W hv + have hmem := hnorm + (a.property.2 W + ((mem_idealNormLiftedModulus_support_iff + (K := K) (L := L) m W).2 hv)) + let : Algebra + ((_root_.finitePlaceBelow (K := K) W).adicCompletion K) + (W.adicCompletion L) := + (_root_.finitePlaceAdicCompletionMap K L + (_root_.finitePlaceBelow (K := K) W) ⟨W, rfl⟩).toAlgebra + change + LocalFieldTheory.normUnits + ((_root_.finitePlaceBelow (K := K) W).adicCompletion K) + (W.adicCompletion L) + (IdeleGroup.finiteComponent W (a : IdeleGroup L)) ∈ + localHigherUnitGroup + (_root_.finitePlaceBelow (K := K) W) + (m.finitePart (_root_.finitePlaceBelow (K := K) W)) at hmem + exact hmem + +open scoped Classical in +/-- The genuine norm-defined subgroup +`N_{L/K} J_L^m P_K^m` of ideals prime to `m`. -/ +noncomputable def idealNormSubgroup + (m : Modulus K) : + Subgroup (primeToModulusIdeals m) := + (primeToModulusIdealNorm + (K := K) (L := L) m).range ⊔ + principalRayIdealSubgroup m + +end RayClass diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/LocalConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/LocalConductor.lean new file mode 100644 index 0000000000..76b7622151 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/LocalConductor.lean @@ -0,0 +1,76 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.FullModulus +/-! +# Local conductor subgroups in the idele class group + +This file records the one-place higher-unit subgroups used to compare +ray-class moduli with local conductors. The constructions are +idele- and ray-class data and do not depend on the existence of a +global class field. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace RayClass + +open NumberField IsDedekindDomain + +variable {K : Type*} [Field K] [NumberField K] + +/-- The image in `C_K` of the `n`-th higher-unit group at `v`. -/ +def localHigherUnitClassSubgroup + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ) : + Subgroup (IdeleClassGroup K) := + (localHigherUnitGroup v n).map + (IdeleGroup.finitePlaceIdeleClass v) + +/-- A one-place higher-unit condition is contained in the corresponding +global ray congruence subgroup. -/ +theorem localHigherUnitClassSubgroup_le_congruenceSubgroup + (m : Modulus K) + (v : HeightOneSpectrum (𝓞 K)) : + localHigherUnitClassSubgroup v (m.finitePart v) ≤ + m.congruenceSubgroup := by + rintro _ ⟨x, hx, rfl⟩ + change + IdeleGroup.finitePlaceIdeleClass v x ∈ + m.congruenceSubgroup + rw [Modulus.congruenceSubgroup] + refine ⟨IdeleGroup.finitePlaceIdele v x, ?_, rfl⟩ + apply Subgroup.mem_sup_left + rw [Modulus.mem_ideleCongruenceSubgroup_iff] + refine + ⟨m.infiniteCongruenceSubgroup.one_mem, ?_⟩ + rw [mem_finiteCongruenceSubgroup_iff] + intro w + change + IdeleGroup.finiteComponent w + (IdeleGroup.finitePlaceIdele v x) ∈ + localHigherUnitGroup w (m.finitePart w) + by_cases hw : w = v + · subst w + rw [IdeleGroup.finitePlaceIdele_finiteComponent_same] + change + x ∈ + (localHigherUnitGroup v (m.finitePart v) : + Set (v.adicCompletion K)ˣ) + exact hx + · rw [ + IdeleGroup.finitePlaceIdele_finiteComponent_of_ne + v w x hw] + exact (localHigherUnitGroup w (m.finitePart w)).one_mem + +end RayClass diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Narrow.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Narrow.lean new file mode 100644 index 0000000000..ad83142902 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Narrow.lean @@ -0,0 +1,572 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.FullModulus +/-! +# Narrow ideal classes + +This file proves the exact sequence from +global unit signs through the narrow and ordinary class groups. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + + +variable {K : Type*} [Field K] [NumberField K] + +namespace RayClass + +open scoped Classical in +theorem finiteCongruenceSubgroup_zero : + finiteCongruenceSubgroup (0 : FiniteModulus K) = + FiniteIdeleGroup.integralSubgroup (K := K) := by + ext a + simp only [mem_finiteCongruenceSubgroup_iff, + Finsupp.zero_apply, localHigherUnitGroup_zero, + FiniteIdeleGroup.mem_integralSubgroup_iff] + +open scoped Classical in +theorem narrowIdeleCongruenceSubgroup_zero_le_integral : + (Modulus.narrowOfFinite (0 : FiniteModulus K)).ideleCongruenceSubgroup ≤ + IdeleGroup.integralAtFinitePlaces (K := K) := by + rw [Modulus.ideleCongruenceSubgroup_narrowOfFinite] + intro a ha + change a.2 ∈ FiniteIdeleGroup.integralSubgroup (K := K) + rw [← finiteCongruenceSubgroup_zero (K := K)] + exact ha.2 + +open scoped Classical in +/-- The subgroup generated by the zero-modulus congruence subgroup and +the principal ideles; its quotient is the narrow class group. -/ +def narrowDenominator : + Subgroup (IdeleGroup K) := + (Modulus.narrowOfFinite (0 : FiniteModulus K)).ideleCongruenceSubgroup ⊔ + IdeleGroup.principalSubgroup K + +open scoped Classical in +/-- The narrow class group realized as an idele quotient. -/ +abbrev NarrowClassGroup + (K : Type*) [Field K] [NumberField K] := + IdeleGroup K ⧸ narrowDenominator (K := K) + +open scoped Classical in +/-- The ray class group with zero finite part and every real place selected is +the narrow class group. -/ +def rayClassGroupNarrowZeroEquivNarrowClassGroup : + RayClassGroup (Modulus.narrowOfFinite (0 : FiniteModulus K)) ≃* + NarrowClassGroup K := + rayClassGroupEquivIdeleQuotient + (Modulus.narrowOfFinite (0 : FiniteModulus K)) + +open scoped Classical in +/-- The canonical map from the narrow class group to the ordinary ideal +class group. -/ +def narrowToClassGroup : + NarrowClassGroup K →* ClassGroup (𝓞 K) := + QuotientGroup.lift (narrowDenominator (K := K)) + (IdeleGroup.idealClass (K := K)) (by + intro a ha + rw [narrowDenominator, Subgroup.mem_sup] at ha + obtain ⟨u, hu, p, hp, rfl⟩ := ha + obtain ⟨x, rfl⟩ := hp + rw [MonoidHom.mem_ker] + rw [map_mul, IdeleGroup.idealClass_principalIdele, mul_one] + change ClassGroup.mk K (IdeleGroup.fractionalIdeal u) = 1 + have hu' : + u ∈ IdeleGroup.integralAtFinitePlaces (K := K) := + narrowIdeleCongruenceSubgroup_zero_le_integral hu + rw [← IdeleGroup.fractionalIdeal_ker, + MonoidHom.mem_ker] at hu' + rw [hu', map_one]) + +open scoped Classical in +theorem narrowToClassGroup_mk (a : IdeleGroup K) : + narrowToClassGroup + (QuotientGroup.mk' (narrowDenominator (K := K)) a) = + IdeleGroup.idealClass a := + QuotientGroup.lift_mk _ _ _ + +open scoped Classical in +theorem narrowToClassGroup_surjective : + Function.Surjective + (narrowToClassGroup (K := K)) := by + intro c + obtain ⟨a, rfl⟩ := + IdeleGroup.idealClass_surjective (K := K) c + exact ⟨QuotientGroup.mk' + (narrowDenominator (K := K)) a, + narrowToClassGroup_mk a⟩ + +open scoped Classical in +/-- The quotient of infinite ideles by the positive congruence +subgroup. -/ +abbrev realSignGroup + (K : Type*) [Field K] := + InfiniteIdeleGroup K ⧸ narrowInfiniteCongruenceSubgroup (K := K) + +open scoped Classical in +/-- Embed an infinite idele as an idele with trivial finite component. -/ +def infiniteToIdele : + InfiniteIdeleGroup K →* IdeleGroup K where + toFun a := (a, 1) + map_one' := rfl + map_mul' _ _ := by simp + +open scoped Classical in +/-- Map an infinite idele to its narrow ideal class. -/ +def infiniteToNarrow : + InfiniteIdeleGroup K →* NarrowClassGroup K := + (QuotientGroup.mk' (narrowDenominator (K := K))).comp + (infiniteToIdele (K := K)) + +open scoped Classical in +theorem narrowInfiniteCongruenceSubgroup_le_infiniteToNarrow_ker : + narrowInfiniteCongruenceSubgroup (K := K) ≤ + (infiniteToNarrow (K := K)).ker := by + intro a ha + rw [MonoidHom.mem_ker] + change ((infiniteToIdele (K := K) a : + IdeleGroup K) : NarrowClassGroup K) = 1 + rw [QuotientGroup.eq_one_iff] + apply Subgroup.mem_sup_left + rw [Modulus.ideleCongruenceSubgroup_narrowOfFinite] + exact ⟨ha, by + rw [finiteCongruenceSubgroup_zero] + exact (FiniteIdeleGroup.integralSubgroup (K := K)).one_mem⟩ + +open scoped Classical in +/-- The homomorphism from real sign classes to the narrow class group. -/ +def signToNarrow : + realSignGroup K →* NarrowClassGroup K := + QuotientGroup.lift (narrowInfiniteCongruenceSubgroup (K := K)) + (infiniteToNarrow (K := K)) + (narrowInfiniteCongruenceSubgroup_le_infiniteToNarrow_ker (K := K)) + +open scoped Classical in +theorem signToNarrow_mk (a : InfiniteIdeleGroup K) : + signToNarrow + (QuotientGroup.mk' + (narrowInfiniteCongruenceSubgroup (K := K)) a) = + QuotientGroup.mk' (narrowDenominator (K := K)) + (infiniteToIdele (K := K) a) := + QuotientGroup.lift_mk _ _ _ + +open scoped Classical in +theorem signToNarrow_range_eq_narrowToClassGroup_ker : + (signToNarrow (K := K)).range = + (narrowToClassGroup (K := K)).ker := by + apply le_antisymm + · rintro z ⟨s, rfl⟩ + obtain ⟨a, rfl⟩ := + QuotientGroup.mk'_surjective + (narrowInfiniteCongruenceSubgroup (K := K)) s + rw [MonoidHom.mem_ker, signToNarrow_mk, + narrowToClassGroup_mk] + change ClassGroup.mk K + (FiniteIdeleGroup.fractionalIdeal (1 : + FiniteIdeleGroup K)) = 1 + simp + · intro z hz + obtain ⟨a, rfl⟩ := + QuotientGroup.mk'_surjective + (narrowDenominator (K := K)) z + rw [MonoidHom.mem_ker, narrowToClassGroup_mk] at hz + have ha : + a ∈ IdeleGroup.ordinaryIdealClassSubgroup (K := K) := by + rw [IdeleGroup.ordinaryIdealClassSubgroup_eq_ker] + exact hz + rw [IdeleGroup.ordinaryIdealClassSubgroup, + Subgroup.mem_sup] at ha + obtain ⟨u, hu, p, hp, rfl⟩ := ha + have hfinite : + (1, u.2) ∈ + (Modulus.narrowOfFinite (0 : FiniteModulus K)).ideleCongruenceSubgroup := by + rw [Modulus.ideleCongruenceSubgroup_narrowOfFinite] + refine ⟨?_, ?_⟩ + · exact (narrowInfiniteCongruenceSubgroup (K := K)).one_mem + · rw [finiteCongruenceSubgroup_zero] + exact hu + have hfiniteDen : + (1, u.2) ∈ narrowDenominator (K := K) := + Subgroup.mem_sup_left hfinite + have hpDen : + p ∈ narrowDenominator (K := K) := + Subgroup.mem_sup_right hp + have huDecomp : + u = (u.1, 1) * (1, u.2) := by + ext <;> simp + have hfiniteQuot : + QuotientGroup.mk' (narrowDenominator (K := K)) + (1, u.2) = 1 := + (QuotientGroup.eq_one_iff _).mpr hfiniteDen + have hpQuot : + QuotientGroup.mk' (narrowDenominator (K := K)) p = 1 := + (QuotientGroup.eq_one_iff _).mpr hpDen + refine ⟨QuotientGroup.mk' + (narrowInfiniteCongruenceSubgroup (K := K)) u.1, ?_⟩ + rw [signToNarrow_mk] + change + QuotientGroup.mk' (narrowDenominator (K := K)) + (u.1, 1) = + QuotientGroup.mk' (narrowDenominator (K := K)) + (u * p) + calc + QuotientGroup.mk' (narrowDenominator (K := K)) + (u.1, 1) = + QuotientGroup.mk' (narrowDenominator (K := K)) u := by + calc + QuotientGroup.mk' (narrowDenominator (K := K)) + (u.1, 1) = + QuotientGroup.mk' (narrowDenominator (K := K)) + ((u.1, 1) * (1, u.2)) := by + rw [map_mul, hfiniteQuot] + exact (mul_one + (QuotientGroup.mk' (narrowDenominator (K := K)) + (u.1, 1))).symm + _ = QuotientGroup.mk' + (narrowDenominator (K := K)) u := + congrArg + (QuotientGroup.mk' + (narrowDenominator (K := K))) + huDecomp.symm + _ = QuotientGroup.mk' (narrowDenominator (K := K)) + (u * p) := by + rw [map_mul, hpQuot] + exact (mul_one + (QuotientGroup.mk' (narrowDenominator (K := K)) u)).symm + +open scoped Classical in +/-- The inclusion of global integral units into the field units. -/ +def integralUnitToFieldUnit : + (𝓞 K)ˣ →* Kˣ := + Units.map (algebraMap (𝓞 K) K) + +open scoped Classical in +/-- A field unit generates the unit fractional ideal exactly when it comes +from a global integral unit. -/ +theorem toPrincipalIdeal_eq_one_iff_mem_integralUnits + (x : Kˣ) : + toPrincipalIdeal (𝓞 K) K x = 1 ↔ + x ∈ (integralUnitToFieldUnit (K := K)).range := by + constructor + · intro hx + have hx' : + FractionalIdeal.spanSingleton + (nonZeroDivisors (𝓞 K)) (x : K) = + FractionalIdeal.spanSingleton + (nonZeroDivisors (𝓞 K)) (1 : K) := by + simpa only [coe_toPrincipalIdeal, + Units.val_one, FractionalIdeal.spanSingleton_one] using + congrArg Units.val hx + obtain ⟨u, hu⟩ := + (FractionalIdeal.spanSingleton_eq_spanSingleton).mp hx' + refine ⟨u⁻¹, ?_⟩ + apply Units.ext + change algebraMap (𝓞 K) K (↑(u⁻¹) : 𝓞 K) = (x : K) + change algebraMap (𝓞 K) K (u : 𝓞 K) * (x : K) = 1 at hu + simpa using (eq_inv_of_mul_eq_one_right hu).symm + · rintro ⟨u, rfl⟩ + apply Units.ext + rw [coe_toPrincipalIdeal] + change FractionalIdeal.spanSingleton + (nonZeroDivisors (𝓞 K)) + (algebraMap (𝓞 K) K (u : 𝓞 K)) = + (1 : FractionalIdeal + (nonZeroDivisors (𝓞 K)) K) + rw [← FractionalIdeal.spanSingleton_one] + apply + (FractionalIdeal.spanSingleton_eq_spanSingleton).mpr + refine ⟨u⁻¹, ?_⟩ + change algebraMap (𝓞 K) K (↑(u⁻¹) : 𝓞 K) * + algebraMap (𝓞 K) K (u : 𝓞 K) = 1 + rw [← map_mul] + simp + +open scoped Classical in +/-- The archimedean image of a global integral unit. -/ +def integralUnitToInfiniteIdele : + (𝓞 K)ˣ →* InfiniteIdeleGroup K := + (MonoidHom.fst _ _).comp + ((IdeleGroup.principalIdele K).comp + (integralUnitToFieldUnit (K := K))) + +open scoped Classical in +/-- The totally positive global units. -/ +def totallyPositiveUnitSubgroup : + Subgroup ((𝓞 K)ˣ) := + Subgroup.comap (integralUnitToInfiniteIdele (K := K)) + (narrowInfiniteCongruenceSubgroup (K := K)) + +open scoped Classical in +/-- The sign classes of global integral units. -/ +abbrev IntegralUnitSignGroup := + (𝓞 K)ˣ ⧸ totallyPositiveUnitSubgroup (K := K) + +open scoped Classical in +/-- Send a global integral unit to its real sign class. -/ +def integralUnitToRealSign : + (𝓞 K)ˣ →* realSignGroup K := + (QuotientGroup.mk' + (narrowInfiniteCongruenceSubgroup (K := K))).comp + (integralUnitToInfiniteIdele (K := K)) + +open scoped Classical in +theorem totallyPositiveUnitSubgroup_le_integralUnitToRealSign_ker : + totallyPositiveUnitSubgroup (K := K) ≤ + (integralUnitToRealSign (K := K)).ker := by + intro u hu + rw [MonoidHom.mem_ker] + exact (QuotientGroup.eq_one_iff _).mpr hu + +open scoped Classical in +/-- The induced map from integral-unit sign classes to real sign +classes. -/ +def integralUnitSignToRealSign : + IntegralUnitSignGroup (K := K) →* realSignGroup K := + QuotientGroup.lift + (totallyPositiveUnitSubgroup (K := K)) + (integralUnitToRealSign (K := K)) + (totallyPositiveUnitSubgroup_le_integralUnitToRealSign_ker + (K := K)) + +open scoped Classical in +theorem integralUnitSignToRealSign_mk (u : (𝓞 K)ˣ) : + integralUnitSignToRealSign + (QuotientGroup.mk' + (totallyPositiveUnitSubgroup (K := K)) u) = + QuotientGroup.mk' + (narrowInfiniteCongruenceSubgroup (K := K)) + (integralUnitToInfiniteIdele (K := K) u) := + QuotientGroup.lift_mk _ _ _ + +open scoped Classical in +theorem integralUnitSignToRealSign_injective : + Function.Injective + (integralUnitSignToRealSign (K := K)) := by + intro x y hxy + obtain ⟨u, rfl⟩ := + QuotientGroup.mk'_surjective + (totallyPositiveUnitSubgroup (K := K)) x + obtain ⟨v, rfl⟩ := + QuotientGroup.mk'_surjective + (totallyPositiveUnitSubgroup (K := K)) y + rw [integralUnitSignToRealSign_mk, + integralUnitSignToRealSign_mk] at hxy + have hxy' : + integralUnitToInfiniteIdele (K := K) u / + integralUnitToInfiniteIdele (K := K) v ∈ + narrowInfiniteCongruenceSubgroup (K := K) := + (QuotientGroup.eq_iff_div_mem + (N := narrowInfiniteCongruenceSubgroup (K := K)) + (x := integralUnitToInfiniteIdele (K := K) u) + (y := integralUnitToInfiniteIdele (K := K) v)).mp hxy + apply + (QuotientGroup.eq_iff_div_mem + (N := totallyPositiveUnitSubgroup (K := K)) + (x := u) (y := v)).mpr + change integralUnitToInfiniteIdele (K := K) (u / v) ∈ + narrowInfiniteCongruenceSubgroup (K := K) + simpa using hxy' + +open scoped Classical in +theorem principalIdele_integralUnit_finite_integral + (u : (𝓞 K)ˣ) : + (IdeleGroup.principalIdele K + (integralUnitToFieldUnit (K := K) u)).2 ∈ + FiniteIdeleGroup.integralSubgroup (K := K) := by + rw [← FiniteIdeleGroup.fractionalIdeal_ker, + MonoidHom.mem_ker] + change IdeleGroup.fractionalIdeal + (IdeleGroup.principalIdele K + (integralUnitToFieldUnit (K := K) u)) = 1 + rw [IdeleGroup.fractionalIdeal_principalIdele] + exact + (toPrincipalIdeal_eq_one_iff_mem_integralUnits + (integralUnitToFieldUnit (K := K) u)).mpr + ⟨u, rfl⟩ + +open scoped Classical in +theorem signToNarrow_integralUnit (u : (𝓞 K)ˣ) : + signToNarrow + (QuotientGroup.mk' + (narrowInfiniteCongruenceSubgroup (K := K)) + (integralUnitToInfiniteIdele (K := K) u)) = 1 := by + rw [signToNarrow_mk] + let p : IdeleGroup K := + IdeleGroup.principalIdele K + (integralUnitToFieldUnit (K := K) u) + have hp : + p ∈ IdeleGroup.principalSubgroup K := + ⟨integralUnitToFieldUnit (K := K) u, rfl⟩ + have hfinite : + (1, p.2) ∈ + (Modulus.narrowOfFinite (0 : FiniteModulus K)).ideleCongruenceSubgroup := by + rw [Modulus.ideleCongruenceSubgroup_narrowOfFinite] + refine ⟨(narrowInfiniteCongruenceSubgroup (K := K)).one_mem, ?_⟩ + rw [finiteCongruenceSubgroup_zero] + exact principalIdele_integralUnit_finite_integral u + have hfiniteDen : + (1, p.2) ∈ narrowDenominator (K := K) := + Subgroup.mem_sup_left hfinite + have hpDen : + p ∈ narrowDenominator (K := K) := + Subgroup.mem_sup_right hp + have hpDecomp : + p = (p.1, 1) * (1, p.2) := by + ext <;> simp + have hfiniteQuot : + QuotientGroup.mk' (narrowDenominator (K := K)) + (1, p.2) = 1 := + (QuotientGroup.eq_one_iff _).mpr hfiniteDen + have hpQuot : + QuotientGroup.mk' (narrowDenominator (K := K)) p = 1 := + (QuotientGroup.eq_one_iff _).mpr hpDen + change QuotientGroup.mk' (narrowDenominator (K := K)) + (p.1, 1) = 1 + calc + QuotientGroup.mk' (narrowDenominator (K := K)) + (p.1, 1) = + QuotientGroup.mk' (narrowDenominator (K := K)) + ((p.1, 1) * (1, p.2)) := by + rw [map_mul, hfiniteQuot] + exact (mul_one + (QuotientGroup.mk' (narrowDenominator (K := K)) + (p.1, 1))).symm + _ = QuotientGroup.mk' (narrowDenominator (K := K)) p := + congrArg + (QuotientGroup.mk' (narrowDenominator (K := K))) + hpDecomp.symm + _ = 1 := hpQuot + +open scoped Classical in +theorem integralUnitSignToRealSign_range_eq_signToNarrow_ker : + (integralUnitSignToRealSign (K := K)).range = + (signToNarrow (K := K)).ker := by + apply le_antisymm + · rintro s ⟨q, rfl⟩ + obtain ⟨u, rfl⟩ := + QuotientGroup.mk'_surjective + (totallyPositiveUnitSubgroup (K := K)) q + rw [MonoidHom.mem_ker, + integralUnitSignToRealSign_mk] + exact signToNarrow_integralUnit u + · intro s hs + obtain ⟨a, rfl⟩ := + QuotientGroup.mk'_surjective + (narrowInfiniteCongruenceSubgroup (K := K)) s + rw [MonoidHom.mem_ker, signToNarrow_mk] at hs + have hs' : + infiniteToIdele (K := K) a ∈ + narrowDenominator (K := K) := + (QuotientGroup.eq_one_iff _).mp hs + rw [narrowDenominator, Subgroup.mem_sup] at hs' + obtain ⟨c, hc, p, hp, hcp⟩ := hs' + obtain ⟨x, rfl⟩ := hp + have hcIntegral : + c ∈ IdeleGroup.integralAtFinitePlaces (K := K) := + narrowIdeleCongruenceSubgroup_zero_le_integral hc + have hcFractionalIdeal : + IdeleGroup.fractionalIdeal c = 1 := by + rw [← MonoidHom.mem_ker, + IdeleGroup.fractionalIdeal_ker] + exact hcIntegral + have hxIdeal : + toPrincipalIdeal (𝓞 K) K x = 1 := by + calc + toPrincipalIdeal (𝓞 K) K x = + IdeleGroup.fractionalIdeal + (IdeleGroup.principalIdele K x) := + (IdeleGroup.fractionalIdeal_principalIdele x).symm + _ = IdeleGroup.fractionalIdeal c * + IdeleGroup.fractionalIdeal + (IdeleGroup.principalIdele K x) := by + rw [hcFractionalIdeal, one_mul] + _ = IdeleGroup.fractionalIdeal + (c * IdeleGroup.principalIdele K x) := by + rw [map_mul] + _ = IdeleGroup.fractionalIdeal + (infiniteToIdele (K := K) a) := + congrArg (IdeleGroup.fractionalIdeal (K := K)) hcp + _ = 1 := by + change FiniteIdeleGroup.fractionalIdeal + (1 : FiniteIdeleGroup K) = 1 + simp + obtain ⟨u, hu⟩ := + (toPrincipalIdeal_eq_one_iff_mem_integralUnits x).mp + hxIdeal + have hcInfinite : + c.1 ∈ narrowInfiniteCongruenceSubgroup (K := K) := + by + rw [← Modulus.infiniteCongruenceSubgroup_narrowOfFinite] + exact hc.1 + have hcInfiniteQuot : + QuotientGroup.mk' + (narrowInfiniteCongruenceSubgroup (K := K)) c.1 = 1 := + (QuotientGroup.eq_one_iff _).mpr hcInfinite + have hcpInfinite : + c.1 * (IdeleGroup.principalIdele K x).1 = a := + congrArg Prod.fst hcp + refine ⟨QuotientGroup.mk' + (totallyPositiveUnitSubgroup (K := K)) u, ?_⟩ + rw [integralUnitSignToRealSign_mk] + have huInfinite : + integralUnitToInfiniteIdele (K := K) u = + (IdeleGroup.principalIdele K x).1 := by + change + (IdeleGroup.principalIdele K + (integralUnitToFieldUnit (K := K) u)).1 = + (IdeleGroup.principalIdele K x).1 + rw [hu] + rw [huInfinite] + calc + QuotientGroup.mk' + (narrowInfiniteCongruenceSubgroup (K := K)) + (IdeleGroup.principalIdele K x).1 = + QuotientGroup.mk' + (narrowInfiniteCongruenceSubgroup (K := K)) + (c.1 * (IdeleGroup.principalIdele K x).1) := by + rw [map_mul, hcInfiniteQuot] + exact (one_mul + (QuotientGroup.mk' + (narrowInfiniteCongruenceSubgroup (K := K)) + (IdeleGroup.principalIdele K x).1)).symm + _ = QuotientGroup.mk' + (narrowInfiniteCongruenceSubgroup (K := K)) a := + congrArg + (QuotientGroup.mk' + (narrowInfiniteCongruenceSubgroup (K := K))) + hcpInfinite + +open scoped Classical in +/-- The exact sequence + +`1 → 𝓞_Kˣ / 𝓞_{K,+}ˣ → ∏_{v real} ℝˣ / ℝ_{>0}ˣ + → Cl_K¹ → Cl_K → 1`. + +Here complex places contribute a trivial sign quotient, so `realSignGroup` +may uniformly be defined using all infinite places. -/ +theorem narrowClassGroup_exact_sequence : + Function.Injective + (integralUnitSignToRealSign (K := K)) ∧ + (integralUnitSignToRealSign (K := K)).range = + (signToNarrow (K := K)).ker ∧ + (signToNarrow (K := K)).range = + (narrowToClassGroup (K := K)).ker ∧ + Function.Surjective (narrowToClassGroup (K := K)) := by + exact ⟨integralUnitSignToRealSign_injective, + integralUnitSignToRealSign_range_eq_signToNarrow_ker, + signToNarrow_range_eq_narrowToClassGroup_ker, + narrowToClassGroup_surjective⟩ + +end RayClass diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/OrdinaryClassGroupComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/OrdinaryClassGroupComparison.lean new file mode 100644 index 0000000000..31aa8ceddb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/OrdinaryClassGroupComparison.lean @@ -0,0 +1,115 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup +public import Mathlib.RingTheory.ClassGroup.Basic +/-! +# The ordinary ray class group and the ideal class group + +The ray modulus with zero finite part and no real conditions gives precisely +the ordinary ideal class group. The equivalence below also identifies their +finite-prime classes. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +variable {K : Type} [Field K] [NumberField K] + +private theorem ordinary_rayClassPrimeToIdeals_eq_top : + rayClassPrimeToIdeals (ordinaryRayClassModulus K) = ⊤ := by + ext I + simp [rayClassPrimeToIdeals, ordinaryRayClassModulus] + +private theorem ordinary_rayPrincipalIdealSubgroup_eq_range : + rayPrincipalIdealSubgroup (ordinaryRayClassModulus K) = + (toPrincipalIdeal (𝓞 K) K).range := by + have hSet : + {I : NumberFieldFractionalIdealGroup K | + ∃ x : Kˣ, + IsRayCongruent (ordinaryRayClassModulus K) x ∧ + toPrincipalIdeal (𝓞 K) K x = I} = + ((toPrincipalIdeal (𝓞 K) K).range : Set _) := by + ext I + simp [IsRayCongruent, ordinaryRayClassModulus] + calc + rayPrincipalIdealSubgroup (ordinaryRayClassModulus K) = + Subgroup.closure ((toPrincipalIdeal (𝓞 K) K).range : Set _) := by + rw [rayPrincipalIdealSubgroup, hSet] + _ = _ := Subgroup.closure_eq _ + +/-- For the trivial modulus, every fractional ideal is prime to the modulus. -/ +noncomputable def ordinaryRayIdealsEquiv : + rayClassPrimeToIdeals (ordinaryRayClassModulus K) ≃* + NumberFieldFractionalIdealGroup K := + (MulEquiv.subgroupCongr (by exact ordinary_rayClassPrimeToIdeals_eq_top)).trans + Subgroup.topEquiv + +private theorem ordinaryRayIdealsEquiv_apply + (I : rayClassPrimeToIdeals (ordinaryRayClassModulus K)) : + ordinaryRayIdealsEquiv I = I.1 := rfl + +private theorem ordinary_rayPrincipalIdealSubgroup_map : + (rayPrincipalIdealSubgroupInPrimeTo + (ordinaryRayClassModulus K)).map + (ordinaryRayIdealsEquiv (K := K) : _ →* _) = + (toPrincipalIdeal (𝓞 K) K).range := by + ext I + constructor + · rintro ⟨J, hJ, rfl⟩ + change J.1 ∈ rayPrincipalIdealSubgroup (ordinaryRayClassModulus K) at hJ + rw [ordinary_rayPrincipalIdealSubgroup_eq_range (K := K)] at hJ + change ordinaryRayIdealsEquiv J ∈ (toPrincipalIdeal (𝓞 K) K).range + rw [ordinaryRayIdealsEquiv_apply] + exact hJ + · intro hI + let J : rayClassPrimeToIdeals (ordinaryRayClassModulus K) := + ⟨I, by rw [ordinary_rayClassPrimeToIdeals_eq_top]; trivial⟩ + refine ⟨J, ?_, ?_⟩ + · change I ∈ rayPrincipalIdealSubgroup (ordinaryRayClassModulus K) + rw [ordinary_rayPrincipalIdealSubgroup_eq_range (K := K)] + exact hI + · exact ordinaryRayIdealsEquiv_apply J + +/-- The ideal-theoretic ray class group at the trivial modulus is the +ordinary ideal class group. -/ +noncomputable def ordinaryRayClassGroupEquivClassGroup : + RayClassGroup (ordinaryRayClassModulus K) ≃* ClassGroup (𝓞 K) := + (QuotientGroup.congr + (rayPrincipalIdealSubgroupInPrimeTo (ordinaryRayClassModulus K)) + (toPrincipalIdeal (𝓞 K) K).range + ordinaryRayIdealsEquiv + (by exact ordinary_rayPrincipalIdealSubgroup_map)).trans + (ClassGroup.equiv K).symm + +/-- The equivalence takes the ordinary ray class of a finite prime to the +usual prime ideal class. -/ +theorem ordinaryRayClassGroupEquivClassGroup_prime + (v : HeightOneSpectrum (𝓞 K)) : + ordinaryRayClassGroupEquivClassGroup + (ordinaryRayClassOfFinitePrime v) = + ClassGroup.mk K (finitePrimeFractionalIdeal v) := by + apply (ClassGroup.equiv K).injective + simp only [ordinaryRayClassGroupEquivClassGroup, MulEquiv.trans_apply, + MulEquiv.apply_symm_apply, ordinaryRayClassOfFinitePrime, + rayClassOfFinitePrime, ClassGroup.equiv_mk] + rw [QuotientGroup.congr_mk'] + simp only [ordinaryRayIdealsEquiv_apply] + simp only [FractionalIdeal.canonicalEquiv_self, RingEquiv.coe_mulEquiv_refl] + congr 1 + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PrimeGeneration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PrimeGeneration.lean new file mode 100644 index 0000000000..3c1e15cba1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PrimeGeneration.lean @@ -0,0 +1,92 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal +/-! +# Prime generation of ray ideal classes + +The fractional ideals prime to a modulus are generated by their prime ideals +away from the modulus. This is the algebraic input for comparing +Frobenius-normalized ray reciprocity maps. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace RayClass + +universe u v + +open scoped Classical in +/-- Two homomorphisms out of the prime-to-modulus fractional ideal group +agree if they agree on each prime ideal away from the modulus. -/ +theorem primeToModulusIdeals_hom_ext + {K : Type u} [Field K] [NumberField K] + (m : RayClass.Modulus K) + {G : Type v} [CommGroup G] + (f g : RayClass.primeToModulusIdeals m →* G) + (hprime : ∀ (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support), + f (RayClass.primeToModulusIdeal m v hv) = + g (RayClass.primeToModulusIdeal m v hv)) : + f = g := by + let P := RayClass.primeToModulusIdeals m + let p (v : HeightOneSpectrum (𝓞 K)) : P := + if hv : v ∉ m.finitePart.support then + RayClass.primeToModulusIdeal m v hv else 1 + have hp (v : HeightOneSpectrum (𝓞 K)) : f (p v) = g (p v) := by + by_cases hv : v ∉ m.finitePart.support + · simpa only [p, dite_eq_left hv] using hprime v hv + · simp only [p, dite_eq_right hv, map_one] + apply MonoidHom.ext + intro I + let c := FractionalIdealGroup.countVector (I : FractionalIdealGroup K) + have hfactor : + FractionalIdealGroup.factorization (Multiplicative.ofAdd c) = + (I : FractionalIdealGroup K) := by + apply FractionalIdealGroup.ext_count + intro v + rw [FractionalIdealGroup.count_factorization] + exact FractionalIdealGroup.countVector_apply (I : FractionalIdealGroup K) v + have hI : I = c.prod (fun v e => p v ^ e) := by + apply Subtype.ext + change (I : FractionalIdealGroup K) = + (P.subtype : P →* FractionalIdealGroup K) + (c.prod (fun v e => p v ^ e)) + rw [← hfactor] + change FractionalIdealGroup.factorization (Multiplicative.ofAdd c) = + (P.subtype : P →* FractionalIdealGroup K) + (c.support.prod (fun v => p v ^ c v)) + rw [map_prod] + change c.support.prod + (fun v => FractionalIdealGroup.prime v ^ c v) = + c.support.prod + (fun v => (P.subtype : P →* FractionalIdealGroup K) (p v ^ c v)) + apply Finset.prod_congr rfl + intro v hv + have hv' : v ∉ m.finitePart.support := by + intro hvm + exact (Finsupp.mem_support_iff.mp hv) (I.property v hvm) + rw [map_zpow] + change FractionalIdealGroup.prime v ^ c v = + (p v : FractionalIdealGroup K) ^ c v + simp only [p, dite_eq_left hv', RayClass.primeToModulusIdeal_coe] + rw [hI] + change f (c.support.prod (fun v => p v ^ c v)) = + g (c.support.prod (fun v => p v ^ c v)) + rw [map_prod, map_prod] + apply Finset.prod_congr rfl + intro v _ + rw [map_zpow, map_zpow, hp] + +end RayClass diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PublicHigherUnitComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PublicHigherUnitComparison.lean new file mode 100644 index 0000000000..538d7344be --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PublicHigherUnitComparison.lean @@ -0,0 +1,37 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Basic +/-! +# Comparison of public and idelic higher-unit groups + +The reader-facing higher-unit group agrees with the group used in the +existing ray-class and idelic implementation. Keep this definitional +comparison at the boundary between the two APIs. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +/-- The public local higher-unit group is the same subgroup as the one used +by the existing ray-class implementation. -/ +theorem rayLocalHigherUnitGroup_eq_rayClass + {K : Type} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ) : + rayLocalHigherUnitGroup v n = RayClass.localHigherUnitGroup v n := by + rfl + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean new file mode 100644 index 0000000000..d7dbba0082 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean @@ -0,0 +1,1388 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal +public import Mathlib.Data.Nat.Factorization.Basic +public import Mathlib.Data.Nat.GCD.BigOperators +public import Mathlib.Data.ZMod.Units +public import Mathlib.NumberTheory.NumberField.Units.Basic +public import Mathlib.NumberTheory.Padics.HeightOneSpectrum +public import Mathlib.NumberTheory.Padics.RingHoms +/-! +# Ray class groups of the rational numbers + +This file computes ray class groups of the rational numbers. A positive integer +`m` determines a full narrow ray modulus: its finite part has exponent +`m.factorization p` at `p`, and its real place imposes positivity. The +positive generator of an ideal prime to this modulus gives the explicit +isomorphism with `(ZMod m)ˣ`. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + + +namespace RayClass + +open scoped Classical in +local instance rationalRingOfIntegersIsPrincipalIdealRing : + IsPrincipalIdealRing (𝓞 ℚ) := + IsPrincipalIdealRing.of_surjective + Rat.ringOfIntegersEquiv.symm + Rat.ringOfIntegersEquiv.symm.surjective + +attribute [local instance] rationalRingOfIntegersIsPrincipalIdealRing + +open scoped Classical in +local instance rationalNatGeneratorPrimeFact + (v : HeightOneSpectrum (𝓞 ℚ)) : + Fact (Nat.Prime (Rat.HeightOneSpectrum.natGenerator v)) := + ⟨Rat.HeightOneSpectrum.prime_natGenerator v⟩ + +attribute [local instance] rationalNatGeneratorPrimeFact + +open scoped Classical in +local instance rationalPrimesEquivPrimeFact + (v : HeightOneSpectrum (𝓞 ℚ)) : + Fact + (Nat.Prime + ((Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ) v : Nat.Primes) : ℕ)) := + ⟨(Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ) v).property⟩ + +attribute [local instance] rationalPrimesEquivPrimeFact + +open scoped Classical in +/-- The height-one prime of `𝓞 ℚ` associated with a natural prime. -/ +noncomputable abbrev rationalPrime (p : Nat.Primes) : + HeightOneSpectrum (𝓞 ℚ) := + (Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).symm p + +open scoped Classical in +@[simp] +theorem natGenerator_rationalPrime (p : Nat.Primes) : + Rat.HeightOneSpectrum.natGenerator (rationalPrime p) = p := by + exact congrArg Subtype.val + ((Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).apply_symm_apply p) + +open scoped Classical in +theorem rational_natGenerator_injective : + Function.Injective + (Rat.HeightOneSpectrum.natGenerator : + HeightOneSpectrum (𝓞 ℚ) → ℕ) := by + intro v w hvw + apply (Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).injective + exact Subtype.ext hvw + +open scoped Classical in +/-- The finite part of the modulus `(m)` of `ℚ`. At the prime over `p` it has +exponent `m.factorization p`. The later equivalences use the hypothesis +`0 < m`; the definition itself is harmless at `m = 0`. +-/ +noncomputable def rationalFiniteModulus (m : ℕ) : FiniteModulus ℚ := + Finsupp.comapDomain + Rat.HeightOneSpectrum.natGenerator + m.factorization + rational_natGenerator_injective.injOn + +open scoped Classical in +@[simp] +theorem rationalFiniteModulus_apply + (m : ℕ) (v : HeightOneSpectrum (𝓞 ℚ)) : + rationalFiniteModulus m v = + m.factorization (Rat.HeightOneSpectrum.natGenerator v) := by + rw [rationalFiniteModulus, Finsupp.comapDomain_apply] + +open scoped Classical in +/-- The full rational ray modulus has the finite part `(m)` and positivity +at the unique real place. -/ +noncomputable def rationalModulus (m : ℕ) : Modulus ℚ := + Modulus.narrowOfFinite (rationalFiniteModulus m) + +open scoped Classical in +@[simp] +theorem rationalModulus_finitePart_apply + (m : ℕ) (v : HeightOneSpectrum (𝓞 ℚ)) : + (rationalModulus m).finitePart v = + m.factorization (Rat.HeightOneSpectrum.natGenerator v) := by + rw [rationalModulus, Modulus.finitePart_narrowOfFinite, + rationalFiniteModulus_apply] + +open scoped Classical in +theorem mem_rationalFiniteModulus_support_iff + {m : ℕ} (hm : m ≠ 0) (v : HeightOneSpectrum (𝓞 ℚ)) : + v ∈ (rationalFiniteModulus m).support ↔ + Rat.HeightOneSpectrum.natGenerator v ∣ m := by + rw [Finsupp.mem_support_iff, rationalFiniteModulus_apply] + constructor + · exact Nat.dvd_of_factorization_pos + · intro hdiv + exact (Rat.HeightOneSpectrum.prime_natGenerator v).factorization_pos_of_dvd hm hdiv |>.ne' + +open scoped Classical in +/-- The fractional ideal underlying a rational fractional-ideal unit. -/ +abbrev rationalFractionalIdeal (I : FractionalIdealGroup ℚ) : + FractionalIdeal (nonZeroDivisors (𝓞 ℚ)) ℚ := + I + +open scoped Classical in +/-- An arbitrary principal generator of a nonzero rational fractional +ideal, before choosing its sign. -/ +noncomputable def rawRationalIdealGenerator + (I : FractionalIdealGroup ℚ) : ℚ := + Submodule.IsPrincipal.generator + ((rationalFractionalIdeal I : FractionalIdeal + (nonZeroDivisors (𝓞 ℚ)) ℚ) : Submodule (𝓞 ℚ) ℚ) + +open scoped Classical in +private theorem rawRationalIdealGenerator_ne_zero + (I : FractionalIdealGroup ℚ) : + rawRationalIdealGenerator I ≠ 0 := by + apply mt + (Submodule.IsPrincipal.eq_bot_iff_generator_eq_zero + ((rationalFractionalIdeal I : FractionalIdeal + (nonZeroDivisors (𝓞 ℚ)) ℚ) : Submodule (𝓞 ℚ) ℚ)).2 + exact FractionalIdeal.coeToSubmodule_ne_bot.mpr (Units.ne_zero I) + +open scoped Classical in +/-- The unique positive generator of a nonzero rational fractional ideal. -/ +noncomputable def positiveRationalIdealGenerator + (I : FractionalIdealGroup ℚ) : ℚ := + if 0 < rawRationalIdealGenerator I then + rawRationalIdealGenerator I + else + -rawRationalIdealGenerator I + +open scoped Classical in +theorem positiveRationalIdealGenerator_pos + (I : FractionalIdealGroup ℚ) : + 0 < positiveRationalIdealGenerator I := by + rw [positiveRationalIdealGenerator] + split_ifs with h + · exact h + · exact neg_pos.mpr + (lt_of_le_of_ne (not_lt.mp h) + (rawRationalIdealGenerator_ne_zero I)) + +open scoped Classical in +theorem rationalFractionalIdeal_eq_span_positiveGenerator + (I : FractionalIdealGroup ℚ) : + rationalFractionalIdeal I = + FractionalIdeal.spanSingleton (nonZeroDivisors (𝓞 ℚ)) + (positiveRationalIdealGenerator I) := by + calc + rationalFractionalIdeal I = + FractionalIdeal.spanSingleton (nonZeroDivisors (𝓞 ℚ)) + (rawRationalIdealGenerator I) := + FractionalIdeal.eq_spanSingleton_of_principal _ + _ = FractionalIdeal.spanSingleton (nonZeroDivisors (𝓞 ℚ)) + (positiveRationalIdealGenerator I) := by + rw [positiveRationalIdealGenerator] + split_ifs with h + · rfl + · apply + (FractionalIdeal.spanSingleton_eq_spanSingleton + (S := nonZeroDivisors (𝓞 ℚ))).2 + refine ⟨-1, ?_⟩ + simp + +open scoped Classical in +/-- Positive rational generators of the same principal fractional ideal +are equal. -/ +theorem eq_of_spanSingleton_eq_of_pos + {x y : ℚ} (hx : 0 < x) (hy : 0 < y) + (h : + FractionalIdeal.spanSingleton (nonZeroDivisors (𝓞 ℚ)) x = + FractionalIdeal.spanSingleton (nonZeroDivisors (𝓞 ℚ)) y) : + x = y := by + obtain ⟨u, hu⟩ := + (FractionalIdeal.spanSingleton_eq_spanSingleton + (S := nonZeroDivisors (𝓞 ℚ))).1 h + rcases Rat.RingOfIntegers.isUnit_iff.mp u.isUnit with hu1 | hu1 + · simpa [Units.smul_def, Algebra.smul_def, hu1] using hu + · have hxy : -x = y := by + simpa [Units.smul_def, Algebra.smul_def, hu1] using hu + linarith + +open scoped Classical in +@[simp] +theorem positiveRationalIdealGenerator_one : + positiveRationalIdealGenerator (1 : FractionalIdealGroup ℚ) = 1 := by + apply eq_of_spanSingleton_eq_of_pos + (positiveRationalIdealGenerator_pos 1) zero_lt_one + rw [← rationalFractionalIdeal_eq_span_positiveGenerator] + exact FractionalIdeal.spanSingleton_one.symm + +open scoped Classical in +theorem positiveRationalIdealGenerator_mul + (I J : FractionalIdealGroup ℚ) : + positiveRationalIdealGenerator (I * J) = + positiveRationalIdealGenerator I * + positiveRationalIdealGenerator J := by + apply eq_of_spanSingleton_eq_of_pos + (positiveRationalIdealGenerator_pos (I * J)) + (mul_pos (positiveRationalIdealGenerator_pos I) + (positiveRationalIdealGenerator_pos J)) + rw [← rationalFractionalIdeal_eq_span_positiveGenerator, + ← FractionalIdeal.spanSingleton_mul_spanSingleton, + ← rationalFractionalIdeal_eq_span_positiveGenerator, + ← rationalFractionalIdeal_eq_span_positiveGenerator] + rfl + +open scoped Classical in +/-- The positive generator, regarded as a nonzero rational number. -/ +noncomputable def positiveRationalIdealGeneratorUnit + (I : FractionalIdealGroup ℚ) : ℚˣ := + Units.mk0 (positiveRationalIdealGenerator I) + (ne_of_gt (positiveRationalIdealGenerator_pos I)) + +open scoped Classical in +@[simp] +theorem positiveRationalIdealGeneratorUnit_val + (I : FractionalIdealGroup ℚ) : + (positiveRationalIdealGeneratorUnit I : ℚ) = + positiveRationalIdealGenerator I := + rfl + +open scoped Classical in +theorem toPrincipalIdeal_positiveRationalIdealGeneratorUnit + (I : FractionalIdealGroup ℚ) : + toPrincipalIdeal (𝓞 ℚ) ℚ + (positiveRationalIdealGeneratorUnit I) = I := by + apply Units.ext + rw [coe_toPrincipalIdeal] + change + FractionalIdeal.spanSingleton (nonZeroDivisors (𝓞 ℚ)) + (positiveRationalIdealGenerator I) = + rationalFractionalIdeal I + exact (rationalFractionalIdeal_eq_span_positiveGenerator I).symm + +open scoped Classical in +@[simp] +theorem positiveRationalIdealGeneratorUnit_one : + positiveRationalIdealGeneratorUnit + (1 : FractionalIdealGroup ℚ) = 1 := by + apply Units.ext + exact positiveRationalIdealGenerator_one + +open scoped Classical in +theorem positiveRationalIdealGeneratorUnit_mul + (I J : FractionalIdealGroup ℚ) : + positiveRationalIdealGeneratorUnit (I * J) = + positiveRationalIdealGeneratorUnit I * + positiveRationalIdealGeneratorUnit J := by + apply Units.ext + exact positiveRationalIdealGenerator_mul I J + +open scoped Classical in +/-- An element of `WithZero (Multiplicative ℤ)` with logarithm zero is +one. -/ +theorem withZero_eq_one_of_log_eq_zero + {x : WithZero (Multiplicative ℤ)} (hx : x ≠ 0) + (hlog : WithZero.log x = 0) : + x = 1 := by + calc + x = WithZero.exp (WithZero.log x) := + (WithZero.exp_log hx).symm + _ = WithZero.exp 0 := congrArg WithZero.exp hlog + _ = 1 := rfl + +open scoped Classical in +/-- Zero principal-ideal exponent at a rational finite place forces +valuation one. -/ +theorem valuation_eq_one_of_principal_count_eq_zero + (x : ℚˣ) (v : HeightOneSpectrum (𝓞 ℚ)) + (hcount : + FractionalIdeal.count ℚ v + (toPrincipalIdeal (𝓞 ℚ) ℚ x : + FractionalIdeal (nonZeroDivisors (𝓞 ℚ)) ℚ) = 0) : + v.valuation ℚ (x : ℚ) = 1 := by + rw [IdeleGroup.count_toPrincipalIdeal] at hcount + have hlog : + WithZero.log (v.valuation ℚ (x : ℚ)) = 0 := + neg_eq_zero.mp hcount + have hvne : v.valuation ℚ (x : ℚ) ≠ 0 := + (v.valuation ℚ).ne_zero_of_unit x + exact withZero_eq_one_of_log_eq_zero hvne hlog + +open scoped Classical in +/-- A rational prime with zero principal-ideal exponent does not divide +the denominator. -/ +theorem not_dvd_den_of_principal_count_eq_zero + (x : ℚˣ) (v : HeightOneSpectrum (𝓞 ℚ)) + (hcount : + FractionalIdeal.count ℚ v + (toPrincipalIdeal (𝓞 ℚ) ℚ x : + FractionalIdeal (nonZeroDivisors (𝓞 ℚ)) ℚ) = 0) : + ¬ Rat.HeightOneSpectrum.natGenerator v ∣ (x : ℚ).den := by + let p := Rat.HeightOneSpectrum.natGenerator v + let : Fact p.Prime := + ⟨Rat.HeightOneSpectrum.prime_natGenerator v⟩ + have hequiv := + Rat.HeightOneSpectrum.valuation_equiv_padicValuation v + have hpval : Rat.padicValuation p (x : ℚ) = 1 := + hequiv.eq_one_iff_eq_one.mp + (valuation_eq_one_of_principal_count_eq_zero x v hcount) + apply Rat.padicValuation_le_one_iff.mp + exact le_of_eq hpval + +open scoped Classical in +/-- A rational prime with zero principal-ideal exponent does not divide +the numerator. -/ +theorem not_dvd_num_of_principal_count_eq_zero + (x : ℚˣ) (v : HeightOneSpectrum (𝓞 ℚ)) + (hcount : + FractionalIdeal.count ℚ v + (toPrincipalIdeal (𝓞 ℚ) ℚ x : + FractionalIdeal (nonZeroDivisors (𝓞 ℚ)) ℚ) = 0) : + ¬ Rat.HeightOneSpectrum.natGenerator v ∣ (x : ℚ).num.natAbs := by + let p := Rat.HeightOneSpectrum.natGenerator v + let : Fact p.Prime := + ⟨Rat.HeightOneSpectrum.prime_natGenerator v⟩ + have hpval : + Rat.padicValuation p (x : ℚ) = 1 := + (Rat.HeightOneSpectrum.valuation_equiv_padicValuation v).eq_one_iff_eq_one.mp + (valuation_eq_one_of_principal_count_eq_zero x v hcount) + have hden : ¬ p ∣ (x : ℚ).den := + not_dvd_den_of_principal_count_eq_zero x v hcount + have hdenval : + Int.padicValuation p ((x : ℚ).den : ℤ) = 1 := + Int.padicValuation_eq_one_iff.mpr + (by simpa only [Int.natCast_dvd_natCast] using hden) + rw [← (x : ℚ).num_div_den, map_div₀, + Rat.padicValuation_cast, ← Int.cast_natCast, + Rat.padicValuation_cast, hdenval, div_one] at hpval + exact fun hpdiv => + (Int.padicValuation_eq_one_iff.mp hpval) + (Int.natCast_dvd.mpr hpdiv) + +open scoped Classical in +theorem positiveGenerator_den_coprime + {m : ℕ} (hm : m ≠ 0) + (I : primeToModulusIdeals (rationalModulus m)) : + Nat.Coprime + (positiveRationalIdealGenerator (I : FractionalIdealGroup ℚ)).den m := by + rw [Nat.coprime_comm] + by_contra hcop + obtain ⟨p, hp, hpm, hpden⟩ := + Nat.Prime.not_coprime_iff_dvd.mp hcop + let v := rationalPrime ⟨p, hp⟩ + have hvgen : Rat.HeightOneSpectrum.natGenerator v = p := + natGenerator_rationalPrime ⟨p, hp⟩ + have hv : v ∈ (rationalModulus m).finitePart.support := by + rw [rationalModulus, Modulus.finitePart_narrowOfFinite] + rw [mem_rationalFiniteModulus_support_iff hm] + rw [hvgen] + exact hpm + have hcount := I.property v hv + rw [← toPrincipalIdeal_positiveRationalIdealGeneratorUnit + (I : FractionalIdealGroup ℚ)] at hcount + exact + (not_dvd_den_of_principal_count_eq_zero + (positiveRationalIdealGeneratorUnit + (I : FractionalIdealGroup ℚ)) v hcount) + (by + rw [hvgen] + exact hpden) + +open scoped Classical in +theorem positiveGenerator_num_coprime + {m : ℕ} (hm : m ≠ 0) + (I : primeToModulusIdeals (rationalModulus m)) : + Nat.Coprime + (positiveRationalIdealGenerator + (I : FractionalIdealGroup ℚ)).num.natAbs m := by + rw [Nat.coprime_comm] + by_contra hcop + obtain ⟨p, hp, hpm, hpnum⟩ := + Nat.Prime.not_coprime_iff_dvd.mp hcop + let v := rationalPrime ⟨p, hp⟩ + have hvgen : Rat.HeightOneSpectrum.natGenerator v = p := + natGenerator_rationalPrime ⟨p, hp⟩ + have hv : v ∈ (rationalModulus m).finitePart.support := by + rw [rationalModulus, Modulus.finitePart_narrowOfFinite] + rw [mem_rationalFiniteModulus_support_iff hm] + rw [hvgen] + exact hpm + have hcount := I.property v hv + rw [← toPrincipalIdeal_positiveRationalIdealGeneratorUnit + (I : FractionalIdealGroup ℚ)] at hcount + exact + (not_dvd_num_of_principal_count_eq_zero + (positiveRationalIdealGeneratorUnit + (I : FractionalIdealGroup ℚ)) v hcount) + (by + rw [hvgen] + exact hpnum) + +open scoped Classical in +/-- The numerator of a rational number as a residue-class unit. -/ +def rationalNumeratorResidueUnit + (m : ℕ) (q : ℚ) (hq : Nat.Coprime q.num.natAbs m) : + (ZMod m)ˣ := + ZMod.unitOfIsCoprime q.num <| by + simpa [Int.isCoprime_iff_nat_coprime] using hq + +open scoped Classical in +/-- The denominator of a rational number as a residue-class unit. -/ +def rationalDenominatorResidueUnit + (m : ℕ) (q : ℚ) (hq : Nat.Coprime q.den m) : + (ZMod m)ˣ := + ZMod.unitOfIsCoprime (q.den : ℤ) <| by + simpa [Int.isCoprime_iff_nat_coprime] using hq + +open scoped Classical in +/-- Reduction of a rational number whose numerator and denominator are +both prime to `m`. -/ +def rationalResidueUnit + (m : ℕ) (q : ℚ) + (hnum : Nat.Coprime q.num.natAbs m) + (hden : Nat.Coprime q.den m) : + (ZMod m)ˣ := + rationalNumeratorResidueUnit m q hnum * + (rationalDenominatorResidueUnit m q hden)⁻¹ + +open scoped Classical in +/-- Rational residue units are independent of the chosen equality proof. -/ +theorem rationalResidueUnit_congr + (m : ℕ) {q r : ℚ} (hqr : q = r) + (hqnum : Nat.Coprime q.num.natAbs m) + (hqden : Nat.Coprime q.den m) + (hrnum : Nat.Coprime r.num.natAbs m) + (hrden : Nat.Coprime r.den m) : + rationalResidueUnit m q hqnum hqden = + rationalResidueUnit m r hrnum hrden := by + subst r + rfl + +open scoped Classical in +/-- Reduction of rational numbers prime to a modulus is multiplicative. -/ +theorem rationalResidueUnit_mul + (m : ℕ) (q r : ℚ) + (hqnum : Nat.Coprime q.num.natAbs m) + (hqden : Nat.Coprime q.den m) + (hrnum : Nat.Coprime r.num.natAbs m) + (hrden : Nat.Coprime r.den m) + (hqrnum : Nat.Coprime (q * r).num.natAbs m) + (hqrden : Nat.Coprime (q * r).den m) : + rationalResidueUnit m (q * r) hqrnum hqrden = + rationalResidueUnit m q hqnum hqden * + rationalResidueUnit m r hrnum hrden := by + let Nq := rationalNumeratorResidueUnit m q hqnum + let Dq := rationalDenominatorResidueUnit m q hqden + let Nr := rationalNumeratorResidueUnit m r hrnum + let Dr := rationalDenominatorResidueUnit m r hrden + let Nqr := rationalNumeratorResidueUnit m (q * r) hqrnum + let Dqr := rationalDenominatorResidueUnit m (q * r) hqrden + have hcross : Nqr * Dq * Dr = Nq * Nr * Dqr := by + apply Units.ext + have h := + congrArg (Int.castRingHom (ZMod m)) (Rat.mul_num_den' q r) + simpa [Nq, Dq, Nr, Dr, Nqr, Dqr, + rationalNumeratorResidueUnit, + rationalDenominatorResidueUnit, map_mul] using h + change Nqr * Dqr⁻¹ = (Nq * Dq⁻¹) * (Nr * Dr⁻¹) + calc + Nqr * Dqr⁻¹ = + (Nqr * Dq * Dr) * (Dq⁻¹ * Dr⁻¹ * Dqr⁻¹) := by + simp [mul_comm, mul_left_comm, mul_assoc] + _ = (Nq * Nr * Dqr) * (Dq⁻¹ * Dr⁻¹ * Dqr⁻¹) := by + rw [hcross] + _ = (Nq * Dq⁻¹) * (Nr * Dr⁻¹) := by + simp [mul_comm, mul_left_comm, mul_assoc] + +open scoped Classical in +/-- The rational residue unit of one is one. -/ +theorem rationalResidueUnit_one (m : ℕ) : + rationalResidueUnit m 1 (by simp) (by simp) = 1 := by + apply Units.ext + simp [rationalResidueUnit, rationalNumeratorResidueUnit, + rationalDenominatorResidueUnit] + +open scoped Classical in +/-- A rational residue unit is one exactly when its numerator and +denominator are congruent modulo the modulus. -/ +theorem rationalResidueUnit_eq_one_iff_modEq + (m : ℕ) (q : ℚ) + (hnum : Nat.Coprime q.num.natAbs m) + (hden : Nat.Coprime q.den m) : + rationalResidueUnit m q hnum hden = 1 ↔ + q.num ≡ (q.den : ℤ) [ZMOD m] := by + let N := rationalNumeratorResidueUnit m q hnum + let D := rationalDenominatorResidueUnit m q hden + rw [← ZMod.intCast_eq_intCast_iff] + constructor + · intro h + have hND : N = D := by + calc + N = (N * D⁻¹) * D := by simp + _ = (1 : (ZMod m)ˣ) * D := by + rw [show N * D⁻¹ = 1 by + simpa only [N, D, rationalResidueUnit] using h] + _ = D := one_mul D + exact congrArg Units.val hND + · intro hND + have hND' : N = D := by + apply Units.ext + exact hND + change N * D⁻¹ = 1 + rw [hND'] + exact mul_inv_cancel D + +open scoped Classical in +/-- Send an ideal prime to `(m)` to the residue class of its positive +generator. -/ +noncomputable def primeToIdealResidueHom + (m : ℕ) (hm : m ≠ 0) : + primeToModulusIdeals (rationalModulus m) →* (ZMod m)ˣ where + toFun I := + rationalResidueUnit m + (positiveRationalIdealGenerator (I : FractionalIdealGroup ℚ)) + (positiveGenerator_num_coprime hm I) + (positiveGenerator_den_coprime hm I) + map_one' := by + change rationalResidueUnit m + (positiveRationalIdealGenerator + (1 : FractionalIdealGroup ℚ)) _ _ = 1 + calc + rationalResidueUnit m + (positiveRationalIdealGenerator + (1 : FractionalIdealGroup ℚ)) _ _ = + rationalResidueUnit m 1 (by simp) (by simp) := + rationalResidueUnit_congr m + positiveRationalIdealGenerator_one _ _ _ _ + _ = 1 := rationalResidueUnit_one m + map_mul' I J := by + let q := + positiveRationalIdealGenerator (I : FractionalIdealGroup ℚ) + let r := + positiveRationalIdealGenerator (J : FractionalIdealGroup ℚ) + have hprodnum : Nat.Coprime (q * r).num.natAbs m := by + rw [← positiveRationalIdealGenerator_mul] + exact positiveGenerator_num_coprime hm (I * J) + have hprodden : Nat.Coprime (q * r).den m := by + rw [← positiveRationalIdealGenerator_mul] + exact positiveGenerator_den_coprime hm (I * J) + change rationalResidueUnit m + (positiveRationalIdealGenerator + ((I : FractionalIdealGroup ℚ) * + (J : FractionalIdealGroup ℚ))) _ _ = + rationalResidueUnit m q _ _ * rationalResidueUnit m r _ _ + calc + rationalResidueUnit m + (positiveRationalIdealGenerator + ((I : FractionalIdealGroup ℚ) * + (J : FractionalIdealGroup ℚ))) _ _ = + rationalResidueUnit m (q * r) hprodnum hprodden := + rationalResidueUnit_congr m + (positiveRationalIdealGenerator_mul I J) _ _ _ _ + _ = rationalResidueUnit m q + (positiveGenerator_num_coprime hm I) + (positiveGenerator_den_coprime hm I) * + rationalResidueUnit m r + (positiveGenerator_num_coprime hm J) + (positiveGenerator_den_coprime hm J) := + rationalResidueUnit_mul m q r + (positiveGenerator_num_coprime hm I) + (positiveGenerator_den_coprime hm I) + (positiveGenerator_num_coprime hm J) + (positiveGenerator_den_coprime hm J) + hprodnum hprodden + +open scoped Classical in +@[simp] +theorem primeToIdealResidueHom_apply + (m : ℕ) (hm : m ≠ 0) + (I : primeToModulusIdeals (rationalModulus m)) : + primeToIdealResidueHom m hm I = + rationalResidueUnit m + (positiveRationalIdealGenerator + (I : FractionalIdealGroup ℚ)) + (positiveGenerator_num_coprime hm I) + (positiveGenerator_den_coprime hm I) := + rfl + +open scoped Classical in +/-- A positive integer prime to the modulus defines a principal ideal in +the prime-to-modulus ideal group. -/ +theorem principalNat_mem_primeToModulusIdeals + {m a : ℕ} (hm : m ≠ 0) (ha : a ≠ 0) + (hcop : Nat.Coprime a m) : + toPrincipalIdeal (𝓞 ℚ) ℚ + (Units.mk0 (a : ℚ) (by exact_mod_cast ha)) ∈ + primeToModulusIdeals (rationalModulus m) := by + intro v hv + let p := Rat.HeightOneSpectrum.natGenerator v + have hp : p.Prime := + Rat.HeightOneSpectrum.prime_natGenerator v + have hpm : p ∣ m := + (by + rw [rationalModulus, Modulus.finitePart_narrowOfFinite] at hv + exact (mem_rationalFiniteModulus_support_iff hm v).mp hv) + have hpa : ¬ p ∣ a := + hp.coprime_iff_not_dvd.mp + (hcop.coprime_dvd_right hpm).symm + let : Fact p.Prime := ⟨hp⟩ + have hpval : Rat.padicValuation p (a : ℚ) = 1 := by + rw [← Int.cast_natCast, Rat.padicValuation_cast] + exact Int.padicValuation_eq_one_iff.mpr + (by simpa only [Int.natCast_dvd_natCast] using hpa) + have hequiv := + Rat.HeightOneSpectrum.valuation_equiv_padicValuation v + have hvval : v.valuation ℚ (a : ℚ) = 1 := + hequiv.eq_one_iff_eq_one.mpr hpval + rw [IdeleGroup.count_toPrincipalIdeal] + change -WithZero.log (v.valuation ℚ (a : ℚ)) = 0 + rw [hvval] + rfl + +open scoped Classical in +/-- The positive generator of the principal ideal of a positive integer is +that integer. -/ +theorem positiveGenerator_toPrincipalIdeal_nat + {a : ℕ} (ha : 0 < a) : + positiveRationalIdealGenerator + (toPrincipalIdeal (𝓞 ℚ) ℚ + (Units.mk0 (a : ℚ) (by exact_mod_cast ha.ne'))) = + (a : ℚ) := by + let x : ℚˣ := + Units.mk0 (a : ℚ) (by exact_mod_cast ha.ne') + apply eq_of_spanSingleton_eq_of_pos + (positiveRationalIdealGenerator_pos _) + (by exact_mod_cast ha) + rw [← rationalFractionalIdeal_eq_span_positiveGenerator] + calc + rationalFractionalIdeal + (toPrincipalIdeal (𝓞 ℚ) ℚ x) = + FractionalIdeal.spanSingleton (nonZeroDivisors (𝓞 ℚ)) + (x : ℚ) := by + simpa only [rationalFractionalIdeal] using + (coe_toPrincipalIdeal (R := 𝓞 ℚ) (K := ℚ) x) + _ = FractionalIdeal.spanSingleton + (nonZeroDivisors (𝓞 ℚ)) (a : ℚ) := rfl + +open scoped Classical in +/-- The numerator residue unit of a positive natural cast is its residue +unit. -/ +theorem rationalNumeratorResidueUnit_natCast + (m a : ℕ) (hcop : Nat.Coprime a m) : + (rationalNumeratorResidueUnit m (a : ℚ) + (by simpa using hcop) : ZMod m) = + (a : ZMod m) := by + simp [rationalNumeratorResidueUnit] + +open scoped Classical in +/-- The denominator residue unit of a positive natural cast is one. -/ +theorem rationalDenominatorResidueUnit_natCast + (m a : ℕ) (hden : Nat.Coprime ((a : ℚ).den) m) : + rationalDenominatorResidueUnit m (a : ℚ) hden = 1 := by + apply Units.ext + simp [rationalDenominatorResidueUnit] + +open scoped Classical in +/-- Rational reduction of a positive natural cast agrees with ordinary +residue reduction. -/ +theorem rationalResidueUnit_natCast + (m a : ℕ) (hcop : Nat.Coprime a m) : + (rationalResidueUnit m (a : ℚ) + (by simpa using hcop) (by simp) : ZMod m) = + (a : ZMod m) := by + have hden : + rationalDenominatorResidueUnit m (a : ℚ) (by simp) = 1 := + rationalDenominatorResidueUnit_natCast m a (by simp) + change + (rationalNumeratorResidueUnit m (a : ℚ) _ * + (rationalDenominatorResidueUnit m (a : ℚ) _)⁻¹ : + (ZMod m)ˣ) = + (a : ZMod m) + rw [hden, inv_one, mul_one] + exact rationalNumeratorResidueUnit_natCast m a hcop + +open scoped Classical in +theorem primeToIdealResidueHom_surjective + (m : ℕ) (hm : m ≠ 0) : + Function.Surjective (primeToIdealResidueHom m hm) := by + intro u + let a : ℕ := (u : ZMod m).val + m + have ha : 0 < a := + Nat.add_pos_right _ (Nat.pos_of_ne_zero hm) + have hcop : Nat.Coprime a m := by + change Nat.Coprime ((u : ZMod m).val + m) m + rw [Nat.coprime_add_self_left] + exact ZMod.val_coe_unit_coprime u + let x : ℚˣ := + Units.mk0 (a : ℚ) (by exact_mod_cast ha.ne') + let I : primeToModulusIdeals (rationalModulus m) := + ⟨toPrincipalIdeal (𝓞 ℚ) ℚ x, + principalNat_mem_primeToModulusIdeals hm ha.ne' hcop⟩ + refine ⟨I, ?_⟩ + have hgen : + positiveRationalIdealGenerator + (I : FractionalIdealGroup ℚ) = (a : ℚ) := by + exact positiveGenerator_toPrincipalIdeal_nat ha + have hanum : + Nat.Coprime ((a : ℚ).num.natAbs) m := by + simpa using hcop + have haden : Nat.Coprime ((a : ℚ).den) m := by + simp + apply Units.ext + change + (rationalResidueUnit m + (positiveRationalIdealGenerator + (I : FractionalIdealGroup ℚ)) _ _ : ZMod m) = + (u : ZMod m) + calc + (rationalResidueUnit m + (positiveRationalIdealGenerator + (I : FractionalIdealGroup ℚ)) _ _ : ZMod m) = + (rationalResidueUnit m (a : ℚ) hanum haden : ZMod m) := + congrArg Units.val + (rationalResidueUnit_congr m hgen _ _ hanum haden) + _ = (a : ZMod m) := rationalResidueUnit_natCast m a hcop + _ = (u : ZMod m) := by + let : NeZero m := ⟨hm⟩ + change (((u : ZMod m).val + m : ℕ) : ZMod m) = + (u : ZMod m) + rw [Nat.cast_add, ZMod.natCast_self, add_zero, + ZMod.natCast_zmod_val] + +/-! ### The local congruence condition over `ℚ` -/ + +open scoped Classical in +/-- The integral local unit attached to a rational principal idele +component. -/ +def principalLocalIntegralUnit + (v : HeightOneSpectrum (𝓞 ℚ)) (x : ℚˣ) + (hx : v.valuation ℚ (x : ℚ) = 1) : + (v.adicCompletionIntegers ℚ).units := + ⟨(IdeleGroup.principalIdele ℚ x).2 v, by + rw [HeightOneSpectrum.adicCompletionIntegers.mem_units_iff_valued_eq_one] + have hcomp := + IdeleGroup.finiteComponent_principalIdele x v + rw [IdeleGroup.finiteComponent_apply] at hcomp + rw [hcomp] + rw [HeightOneSpectrum.valuedAdicCompletion_eq_valuation', hx]⟩ + +open scoped Classical in +/-- The integral value underlying a rational principal local unit. -/ +def rationalLocalIntegralValue + (v : HeightOneSpectrum (𝓞 ℚ)) + (y : (v.adicCompletionIntegers ℚ).units) : + v.adicCompletionIntegers ℚ := + ((v.adicCompletionIntegers ℚ).toSubmonoid.unitsEquivUnitsType y : + (v.adicCompletionIntegers ℚ)ˣ).1 + +open scoped Classical in +/-- The residue criterion for a rational principal local unit to lie in a +higher-unit group. -/ +theorem rationalLocalHigherUnitMap_eq_one_iff + (v : HeightOneSpectrum (𝓞 ℚ)) (n : ℕ) + (y : (v.adicCompletionIntegers ℚ).units) : + localHigherUnitMap v n y = 1 ↔ + rationalLocalIntegralValue v y - 1 ∈ + (IsLocalRing.maximalIdeal + (v.adicCompletionIntegers ℚ)) ^ n := by + let M := + (IsLocalRing.maximalIdeal + (v.adicCompletionIntegers ℚ)) ^ n + change + Units.map (Ideal.Quotient.mk M).toMonoidHom + ((v.adicCompletionIntegers ℚ).toSubmonoid.unitsEquivUnitsType y) = + 1 ↔ _ + rw [Units.ext_iff] + change + Ideal.Quotient.mk M (rationalLocalIntegralValue v y) = + Ideal.Quotient.mk M 1 ↔ _ + exact Ideal.Quotient.mk_eq_mk_iff_sub_mem + (I := M) (rationalLocalIntegralValue v y) 1 + +open scoped Classical in +/-- Coercing the integral local value recovers the principal finite +component. -/ +theorem principalLocalIntegralValue_coe + (v : HeightOneSpectrum (𝓞 ℚ)) (x : ℚˣ) + (hx : v.valuation ℚ (x : ℚ) = 1) : + (rationalLocalIntegralValue v + (principalLocalIntegralUnit v x hx) : + v.adicCompletion ℚ) = + NumberField.FinitePlace.embedding v (x : ℚ) := by + change + ((((IdeleGroup.principalIdele ℚ x).2 v : + (v.adicCompletion ℚ)ˣ) : v.adicCompletion ℚ)) = + NumberField.FinitePlace.embedding v (x : ℚ) + have hcomp := + IdeleGroup.finiteComponent_principalIdele x v + rw [IdeleGroup.finiteComponent_apply] at hcomp + exact hcomp + +open scoped Classical in +/-- The rational adic-completion equivalence maps powers of maximal +ideals to the corresponding powers in the padic integers. -/ +theorem map_maximalIdeal_pow_padicIntEquiv + (v : HeightOneSpectrum (𝓞 ℚ)) (n : ℕ) : + ((IsLocalRing.maximalIdeal + (v.adicCompletionIntegers ℚ)) ^ n).map + (Rat.HeightOneSpectrum.adicCompletionIntegers.padicIntEquiv v).toRingEquiv = + Ideal.span + {(((Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ) v : Nat.Primes) : ℕ) : + ℤ_[((Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ) v : Nat.Primes) : ℕ)]) ^ n} := by + rw [Ideal.map_pow, IsLocalRing.map_ringEquiv_maximalIdeal, + PadicInt.maximalIdeal_eq_span_p, Ideal.span_singleton_pow] + +open scoped Classical in +/-- Membership of the local integral difference in a maximal-ideal power +is equivalent to the corresponding padic divisibility condition. -/ +theorem rationalLocalIntegralValue_sub_mem_iff + (v : HeightOneSpectrum (𝓞 ℚ)) (n : ℕ) + (z : v.adicCompletionIntegers ℚ) : + z - 1 ∈ + (IsLocalRing.maximalIdeal + (v.adicCompletionIntegers ℚ)) ^ n ↔ + PadicInt.toZModPow n + (Rat.HeightOneSpectrum.adicCompletionIntegers.padicIntEquiv v z) = + 1 := by + let e := + Rat.HeightOneSpectrum.adicCompletionIntegers.padicIntEquiv v + let M := + (IsLocalRing.maximalIdeal + (v.adicCompletionIntegers ℚ)) ^ n + constructor + · intro hz + have hez : e (z - 1) ∈ M.map e.toRingEquiv := + (Ideal.apply_mem_of_equiv_iff + (I := M) (f := e.toRingEquiv) (x := z - 1)).2 hz + rw [map_maximalIdeal_pow_padicIntEquiv, + ← PadicInt.ker_toZModPow n] at hez + have hzero : + PadicInt.toZModPow n (e (z - 1)) = 0 := + (RingHom.mem_ker).1 hez + simpa only [map_sub, map_one, sub_eq_zero] using hzero + · intro hz + have hzero : + PadicInt.toZModPow n (e (z - 1)) = 0 := by + simpa only [map_sub, map_one, sub_eq_zero] using hz + have hez : + e (z - 1) ∈ RingHom.ker (PadicInt.toZModPow n) := + (RingHom.mem_ker).2 hzero + rw [PadicInt.ker_toZModPow, + ← map_maximalIdeal_pow_padicIntEquiv] at hez + exact + (Ideal.apply_mem_of_equiv_iff + (I := M) (f := e.toRingEquiv) (x := z - 1)).1 hez + +open scoped Classical in +/-- The rational-prime equivalence identifies the local prime value with +the natural prime generator. -/ +@[simp] +theorem primesEquiv_val_eq_natGenerator + (v : HeightOneSpectrum (𝓞 ℚ)) : + ((Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ) v : Nat.Primes) : ℕ) = + Rat.HeightOneSpectrum.natGenerator v := + rfl + +open scoped Classical in +/-- A rational principal finite component lies in a higher-unit group +exactly when its numerator and denominator satisfy the local congruence. -/ +theorem principalFiniteComponent_mem_localHigherUnitGroup_iff + (v : HeightOneSpectrum (𝓞 ℚ)) (n : ℕ) (x : ℚˣ) + (hx : v.valuation ℚ (x : ℚ) = 1) : + (IdeleGroup.principalIdele ℚ x).2 v ∈ + localHigherUnitGroup v n ↔ + localHigherUnitMap v n + (principalLocalIntegralUnit v x hx) = 1 := by + rw [mem_localHigherUnitGroup_iff] + constructor + · rintro ⟨y, hy, hymap⟩ + have hy' : + y = principalLocalIntegralUnit v x hx := by + apply Subtype.ext + exact hy + simpa only [hy'] using hymap + · intro hmap + exact ⟨principalLocalIntegralUnit v x hx, rfl, hmap⟩ + +open scoped Classical in +/-- Multiplying a rational number by its denominator gives its numerator. -/ +theorem rational_den_mul_self_eq_num (q : ℚ) : + (q.den : ℚ) * q = q.num := by + have hden : (q.den : ℚ) ≠ 0 := by + exact_mod_cast q.den_ne_zero + have h := (div_eq_iff hden).mp q.num_div_den + simpa only [mul_comm] using h.symm + +open scoped Classical in +/-- Multiplying the principal local integral value by the denominator +gives the numerator in the completion. -/ +theorem principalLocalIntegralValue_den_mul + (v : HeightOneSpectrum (𝓞 ℚ)) (x : ℚˣ) + (hx : v.valuation ℚ (x : ℚ) = 1) : + algebraMap ℤ (v.adicCompletionIntegers ℚ) (x : ℚ).den * + rationalLocalIntegralValue v + (principalLocalIntegralUnit v x hx) = + algebraMap ℤ (v.adicCompletionIntegers ℚ) (x : ℚ).num := by + apply Subtype.ext + simp only [algebraMap_int_eq, map_natCast, MulMemClass.coe_mul, + SubringClass.coe_natCast, principalLocalIntegralValue_coe, + eq_ratCast, eq_intCast, SubringClass.coe_intCast] + simpa only [map_mul, map_natCast, map_intCast, + NumberField.FinitePlace.embedding_apply, eq_ratCast] using + congrArg (NumberField.FinitePlace.embedding v) + (rational_den_mul_self_eq_num (x : ℚ)) + +open scoped Classical in +/-- The positive rational prime attached to a finite place. -/ +abbrev rationalPadicPrime + (v : HeightOneSpectrum (𝓞 ℚ)) : ℕ := + ((Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ) v : Nat.Primes) : ℕ) + +open scoped Classical in +/-- In the local residue ring, the denominator times the principal value +equals the numerator. -/ +theorem principalLocalResidue_den_mul + (v : HeightOneSpectrum (𝓞 ℚ)) (n : ℕ) (x : ℚˣ) + (hx : v.valuation ℚ (x : ℚ) = 1) : + ((x : ℚ).den : ZMod (rationalPadicPrime v ^ n)) * + PadicInt.toZModPow n + (Rat.HeightOneSpectrum.adicCompletionIntegers.padicIntEquiv v + (rationalLocalIntegralValue v + (principalLocalIntegralUnit v x hx))) = + ((x : ℚ).num : ZMod (rationalPadicPrime v ^ n)) := by + let e := + Rat.HeightOneSpectrum.adicCompletionIntegers.padicIntEquiv v + have he := + congrArg e + (principalLocalIntegralValue_den_mul v x hx) + have hden : + e (algebraMap ℤ (v.adicCompletionIntegers ℚ) + ((x : ℚ).den : ℤ)) = + algebraMap ℤ _ ((x : ℚ).den : ℤ) := by + change e.toAlgEquiv + (algebraMap ℤ (v.adicCompletionIntegers ℚ) + ((x : ℚ).den : ℤ)) = + algebraMap ℤ _ ((x : ℚ).den : ℤ) + exact e.commutes ((x : ℚ).den : ℤ) + have hnum : + e (algebraMap ℤ (v.adicCompletionIntegers ℚ) + (x : ℚ).num) = + algebraMap ℤ _ (x : ℚ).num := by + change e.toAlgEquiv + (algebraMap ℤ (v.adicCompletionIntegers ℚ) + (x : ℚ).num) = + algebraMap ℤ _ (x : ℚ).num + exact e.commutes (x : ℚ).num + have he' := he + rw [map_mul, hden, hnum] at he' + have hz := + congrArg (PadicInt.toZModPow n) he' + have hnumZ : + PadicInt.toZModPow n + (algebraMap ℤ ℤ_[rationalPadicPrime v] (x : ℚ).num) = + ((x : ℚ).num : ZMod (rationalPadicPrime v ^ n)) := by + have hcomp : + (PadicInt.toZModPow n).comp + (algebraMap ℤ ℤ_[rationalPadicPrime v]) = + algebraMap ℤ (ZMod (rationalPadicPrime v ^ n)) := + RingHom.ext_int _ _ + exact DFunLike.congr_fun hcomp (x : ℚ).num + rw [hnumZ] at hz + dsimp only [e] at hz + simpa only [algebraMap_int_eq, map_mul, map_natCast, map_intCast, + Int.cast_natCast] using hz + +open scoped Classical in +/-- Valuation one at a rational finite place implies that its prime does +not divide the denominator. -/ +theorem not_dvd_den_of_valuation_eq_one + (v : HeightOneSpectrum (𝓞 ℚ)) (x : ℚˣ) + (hx : v.valuation ℚ (x : ℚ) = 1) : + ¬ Rat.HeightOneSpectrum.natGenerator v ∣ (x : ℚ).den := by + let p := Rat.HeightOneSpectrum.natGenerator v + let : Fact p.Prime := + ⟨Rat.HeightOneSpectrum.prime_natGenerator v⟩ + have hpval : Rat.padicValuation p (x : ℚ) = 1 := + (Rat.HeightOneSpectrum.valuation_equiv_padicValuation v).eq_one_iff_eq_one.mp hx + exact Rat.padicValuation_le_one_iff.mp (le_of_eq hpval) + +open scoped Classical in +/-- Rational principal higher-unit membership is equivalent to a +prime-power congruence of numerator and denominator. -/ +theorem principalLocalHigherUnit_iff_modEq + (v : HeightOneSpectrum (𝓞 ℚ)) (n : ℕ) (x : ℚˣ) + (hx : v.valuation ℚ (x : ℚ) = 1) : + (IdeleGroup.principalIdele ℚ x).2 v ∈ + localHigherUnitGroup v n ↔ + (x : ℚ).num ≡ ((x : ℚ).den : ℤ) + [ZMOD (Rat.HeightOneSpectrum.natGenerator v) ^ n] := by + rw [principalFiniteComponent_mem_localHigherUnitGroup_iff v n x hx, + rationalLocalHigherUnitMap_eq_one_iff, + rationalLocalIntegralValue_sub_mem_iff] + have hp : Nat.Prime (rationalPadicPrime v) := + (Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ) v).property + have hnot : + ¬ rationalPadicPrime v ∣ (x : ℚ).den := by + simpa only [primesEquiv_val_eq_natGenerator] using + not_dvd_den_of_valuation_eq_one v x hx + have hcop : + Nat.Coprime (x : ℚ).den (rationalPadicPrime v ^ n) := + Nat.Coprime.pow_right n + (hp.coprime_iff_not_dvd.mpr hnot).symm + have hunit : + IsUnit + ((x : ℚ).den : + ZMod (rationalPadicPrime v ^ n)) := + (ZMod.isUnit_iff_coprime _ _).mpr hcop + have hrel := + principalLocalResidue_den_mul v n x hx + rw [← primesEquiv_val_eq_natGenerator v, + ← Int.natCast_pow, ← ZMod.intCast_eq_intCast_iff] + constructor + · intro hw + calc + ((x : ℚ).num : + ZMod (rationalPadicPrime v ^ n)) = + ((x : ℚ).den : + ZMod (rationalPadicPrime v ^ n)) := by + rw [← hrel, hw, mul_one] + _ = (((x : ℚ).den : ℤ) : + ZMod (rationalPadicPrime v ^ n)) := by + simp only [Int.cast_natCast] + · intro hnd + apply hunit.mul_left_cancel + rw [hrel, mul_one] + simpa only [Int.cast_natCast] using hnd + +open scoped Classical in +/-- Congruences modulo pairwise coprime moduli combine to a congruence +modulo their finite product. -/ +theorem intModEq_finset_prod_of_pairwise_coprime + {ι : Type*} + (s : Finset ι) (f : ι → ℕ) + (hpair : + ∀ i ∈ s, ∀ j ∈ s, i ≠ j → + Nat.Coprime (f i) (f j)) + {a b : ℤ} + (hmod : ∀ i ∈ s, a ≡ b [ZMOD f i]) : + a ≡ b [ZMOD ∏ i ∈ s, f i] := by + classical + let : DecidableEq ι := Classical.decEq ι + induction s using Finset.induction_on with + | empty => + exact Int.modEq_of_dvd (one_dvd (b - a)) + | @insert i s hi ih => + have hcop : + Nat.Coprime (f i) (∏ j ∈ s, f j) := by + apply Nat.Coprime.prod_right + intro j hj + exact hpair i (Finset.mem_insert_self i s) j + (Finset.mem_insert_of_mem hj) + (fun hij => hi (hij ▸ hj)) + have hcopInt : + ((f i : ℤ).natAbs).Coprime + ((∏ j ∈ s, (f j : ℤ)).natAbs) := by + rw [show (∏ j ∈ s, (f j : ℤ)) = + ((∏ j ∈ s, f j : ℕ) : ℤ) by norm_cast] + simpa only [Int.natAbs_natCast] using hcop + rw [Finset.prod_insert hi] + apply + (Int.modEq_and_modEq_iff_modEq_mul hcopInt).mp + constructor + · exact hmod i (Finset.mem_insert_self i s) + · apply ih + · intro j hj k hk hjk + exact hpair j (Finset.mem_insert_of_mem hj) k + (Finset.mem_insert_of_mem hk) hjk + · intro j hj + exact hmod j (Finset.mem_insert_of_mem hj) + +open scoped Classical in +/-- Congruences modulo every prime-power factor of a natural number +combine to a congruence modulo that number. -/ +theorem intModEq_of_primePower_modEq + {m : ℕ} (hm : m ≠ 0) {a b : ℤ} + (h : + ∀ p : m.primeFactors, + a ≡ b [ZMOD (p : ℕ) ^ m.factorization p]) : + a ≡ b [ZMOD m] := by + let f : m.primeFactors → ℕ := + fun p => (p : ℕ) ^ m.factorization p + have hprod : + a ≡ b [ZMOD ∏ p : m.primeFactors, f p] := by + apply intModEq_finset_prod_of_pairwise_coprime + (Finset.univ : Finset m.primeFactors) f + · intro p _ q _ hpq + exact + Nat.pairwise_coprime_pow_primeFactors_factorization hpq + · intro p _ + exact h p + have hmprod : + (m : ℤ) = ∏ p : m.primeFactors, (f p : ℤ) := by + exact_mod_cast + Nat.prod_primeFactors_coe_pow_factorization hm + rw [hmprod] + exact hprod + +open scoped Classical in +/-- Every prime-power factor determined by a factorization divides the +original natural number. -/ +theorem primePower_factorization_dvd + {m p : ℕ} (hm : m ≠ 0) (hp : p.Prime) : + p ^ m.factorization p ∣ m := + (hp.pow_dvd_iff_le_factorization hm).2 le_rfl + +open scoped Classical in +/-- The infinite component of a rational principal idele is positive +exactly when the rational number is positive. -/ +theorem principalIdele_infinite_mem_iff_pos + (x : ℚˣ) : + (IdeleGroup.principalIdele ℚ x).1 ∈ + narrowInfiniteCongruenceSubgroup (K := ℚ) ↔ + 0 < (x : ℚ) := by + rw [mem_narrowInfiniteCongruenceSubgroup_iff] + constructor + · intro hx + have hpos := + (mem_infinitePositiveSubgroup_iff + Rat.infinitePlace + (ContinuousMulEquiv.piUnits + (IdeleGroup.principalIdele ℚ x).1 + Rat.infinitePlace)).1 + (hx Rat.infinitePlace) + Rat.isReal_infinitePlace + change + 0 < + NumberField.InfinitePlace.Completion.extensionEmbeddingOfIsReal + Rat.isReal_infinitePlace + ((WithAbs.toAbs Rat.infinitePlace.1 (x : ℚ) : + WithAbs Rat.infinitePlace.1) : + Rat.infinitePlace.Completion) at hpos + rw [NumberField.InfinitePlace.Completion.extensionEmbeddingOfIsReal_coe] + at hpos + have hpos' : (0 : ℝ) < ((x : ℚ) : ℝ) := by + simpa only [WithAbs.equiv_apply, WithAbs.ofAbs_toAbs, + eq_ratCast] using hpos + exact_mod_cast hpos' + · intro hx v + rw [mem_infinitePositiveSubgroup_iff] + intro hv + change + 0 < + NumberField.InfinitePlace.Completion.extensionEmbeddingOfIsReal + hv + ((WithAbs.toAbs v.1 (x : ℚ) : WithAbs v.1) : + v.Completion) + rw [NumberField.InfinitePlace.Completion.extensionEmbeddingOfIsReal_coe] + simpa only [WithAbs.equiv_apply, WithAbs.ofAbs_toAbs, + eq_ratCast] using (show + (0 : ℝ) < ((x : ℚ) : ℝ) by exact_mod_cast hx) + +open scoped Classical in +/-- The principal idele of the positive generator satisfies the +prime-to-modulus congruence condition exactly when its rational residue is +one. -/ +theorem principalIdele_positiveGenerator_mem_primeTo_iff_modEq + {m : ℕ} (hm : m ≠ 0) + (I : primeToModulusIdeals (rationalModulus m)) : + IdeleGroup.principalIdele ℚ + (positiveRationalIdealGeneratorUnit + (I : FractionalIdealGroup ℚ)) ∈ + idelePrimeToModulusSubgroup (rationalModulus m) ↔ + (positiveRationalIdealGenerator + (I : FractionalIdealGroup ℚ)).num ≡ + (positiveRationalIdealGenerator + (I : FractionalIdealGroup ℚ)).den + [ZMOD m] := by + let x := + positiveRationalIdealGeneratorUnit + (I : FractionalIdealGroup ℚ) + constructor + · intro hx + apply intModEq_of_primePower_modEq hm + intro p + let v : HeightOneSpectrum (𝓞 ℚ) := + rationalPrime + ⟨p, (Nat.mem_primeFactors.mp p.2).1⟩ + have hvgen : Rat.HeightOneSpectrum.natGenerator v = (p : ℕ) := + natGenerator_rationalPrime + ⟨p, (Nat.mem_primeFactors.mp p.2).1⟩ + have hv : v ∈ (rationalModulus m).finitePart.support := by + rw [rationalModulus, Modulus.finitePart_narrowOfFinite] + rw [mem_rationalFiniteModulus_support_iff hm] + rw [hvgen] + exact (Nat.mem_primeFactors.mp p.2).2.1 + have hcount := I.property v hv + rw [← toPrincipalIdeal_positiveRationalIdealGeneratorUnit + (I : FractionalIdealGroup ℚ)] at hcount + have hxval : v.valuation ℚ (x : ℚ) = 1 := + valuation_eq_one_of_principal_count_eq_zero x v hcount + have hlocal := + (principalLocalHigherUnit_iff_modEq v + ((rationalModulus m).finitePart v) x hxval).1 + (hx.2 v hv) + rw [rationalModulus_finitePart_apply, hvgen] at hlocal + simpa only [x, positiveRationalIdealGeneratorUnit_val] using hlocal + · intro hmod + constructor + · change + (IdeleGroup.principalIdele ℚ x).1 ∈ + (Modulus.narrowOfFinite + (rationalFiniteModulus m)).infiniteCongruenceSubgroup + rw [Modulus.infiniteCongruenceSubgroup_narrowOfFinite] + exact + (principalIdele_infinite_mem_iff_pos x).2 + (positiveRationalIdealGenerator_pos + (I : FractionalIdealGroup ℚ)) + · intro v hv + have hcount := I.property v hv + rw [← toPrincipalIdeal_positiveRationalIdealGeneratorUnit + (I : FractionalIdealGroup ℚ)] at hcount + have hxval : v.valuation ℚ (x : ℚ) = 1 := + valuation_eq_one_of_principal_count_eq_zero x v hcount + apply + (principalLocalHigherUnit_iff_modEq v + ((rationalModulus m).finitePart v) x hxval).2 + rw [rationalModulus_finitePart_apply] + have hpow : + Rat.HeightOneSpectrum.natGenerator v ^ + m.factorization + (Rat.HeightOneSpectrum.natGenerator v) ∣ + m := + primePower_factorization_dvd hm + (Rat.HeightOneSpectrum.prime_natGenerator v) + simpa only [x, positiveRationalIdealGeneratorUnit_val, + Int.natCast_pow] using + hmod.of_dvd (Int.natCast_dvd_natCast.mpr hpow) + +open scoped Classical in +/-- Over `ℚ`, the ideal-theoretic ray subgroup consists precisely of the +positive principal generators congruent to one modulo `m`. -/ +theorem mem_principalRayIdealSubgroup_iff_modEq + {m : ℕ} (hm : m ≠ 0) + (I : primeToModulusIdeals (rationalModulus m)) : + I ∈ principalRayIdealSubgroup (rationalModulus m) ↔ + (positiveRationalIdealGenerator + (I : FractionalIdealGroup ℚ)).num ≡ + (positiveRationalIdealGenerator + (I : FractionalIdealGroup ℚ)).den + [ZMOD m] := by + constructor + · intro hI + obtain ⟨x, hx, hideal⟩ := + (mem_principalRayIdealSubgroup_iff + (rationalModulus m) I).1 hI + have hxinf : + (IdeleGroup.principalIdele ℚ x).1 ∈ + narrowInfiniteCongruenceSubgroup (K := ℚ) := by + have hxinf' := hx.1 + change + (IdeleGroup.principalIdele ℚ x).1 ∈ + (Modulus.narrowOfFinite + (rationalFiniteModulus m)).infiniteCongruenceSubgroup at hxinf' + rw [Modulus.infiniteCongruenceSubgroup_narrowOfFinite] at hxinf' + exact hxinf' + have hxpos : 0 < (x : ℚ) := + (principalIdele_infinite_mem_iff_pos x).1 hxinf + have hxgen : + (x : ℚ) = + positiveRationalIdealGenerator + (I : FractionalIdealGroup ℚ) := by + apply eq_of_spanSingleton_eq_of_pos hxpos + (positiveRationalIdealGenerator_pos + (I : FractionalIdealGroup ℚ)) + calc + FractionalIdeal.spanSingleton + (nonZeroDivisors (𝓞 ℚ)) (x : ℚ) = + rationalFractionalIdeal + (toPrincipalIdeal (𝓞 ℚ) ℚ x) := by + exact + (coe_toPrincipalIdeal + (R := 𝓞 ℚ) (K := ℚ) x).symm + _ = rationalFractionalIdeal + (I : FractionalIdealGroup ℚ) := + congrArg rationalFractionalIdeal hideal + _ = FractionalIdeal.spanSingleton + (nonZeroDivisors (𝓞 ℚ)) + (positiveRationalIdealGenerator + (I : FractionalIdealGroup ℚ)) := + rationalFractionalIdeal_eq_span_positiveGenerator + (I : FractionalIdealGroup ℚ) + have hxu : + x = positiveRationalIdealGeneratorUnit + (I : FractionalIdealGroup ℚ) := by + apply Units.ext + exact hxgen + apply + (principalIdele_positiveGenerator_mem_primeTo_iff_modEq + hm I).1 + simpa only [← hxu] using hx + · intro hmod + apply + (mem_principalRayIdealSubgroup_iff + (rationalModulus m) I).2 + exact + ⟨positiveRationalIdealGeneratorUnit + (I : FractionalIdealGroup ℚ), + (principalIdele_positiveGenerator_mem_primeTo_iff_modEq + hm I).2 hmod, + toPrincipalIdeal_positiveRationalIdealGeneratorUnit + (I : FractionalIdealGroup ℚ)⟩ + +open scoped Classical in +/-- The residue map on ideals prime to `(m)` has exactly the ray-principal +ideals as its kernel. -/ +theorem primeToIdealResidueHom_ker + (m : ℕ) (hm : m ≠ 0) : + (primeToIdealResidueHom m hm).ker = + principalRayIdealSubgroup (rationalModulus m) := by + ext I + rw [MonoidHom.mem_ker, + mem_principalRayIdealSubgroup_iff_modEq hm I, + primeToIdealResidueHom_apply] + exact + rationalResidueUnit_eq_one_iff_modEq m + (positiveRationalIdealGenerator + (I : FractionalIdealGroup ℚ)) + (positiveGenerator_num_coprime hm I) + (positiveGenerator_den_coprime hm I) + +open scoped Classical in +/-- In ideal-theoretic form, +the ray ideal class group of `ℚ` modulo `(m)` is `(ℤ/mℤ)ˣ`. -/ +noncomputable def idealRayClassGroupEquivZModUnits + (m : ℕ) (hm : m ≠ 0) : + IdealRayClassGroup (rationalModulus m) ≃* + (ZMod m)ˣ := by + exact + (QuotientGroup.quotientMulEquivOfEq + (primeToIdealResidueHom_ker m hm).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (primeToIdealResidueHom m hm) + (primeToIdealResidueHom_surjective m hm)) + +open scoped Classical in +/-- In idelic form, +the idelic ray class group of `ℚ` modulo `(m)` is `(ℤ/mℤ)ˣ`. -/ +noncomputable def rationalRayClassGroupEquivZModUnits + (m : ℕ) (hm : m ≠ 0) : + RayClassGroup (rationalModulus m) ≃* + (ZMod m)ˣ := + (rayClassGroupEquivIdealRayClassGroup + (rationalModulus m)).trans + (idealRayClassGroupEquivZModUnits m hm) + +end RayClass diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Topology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Topology.lean new file mode 100644 index 0000000000..de4f89218f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Topology.lean @@ -0,0 +1,1145 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.FullModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormOneCompact +public import Mathlib.Analysis.Complex.Convex +public import Mathlib.Basic.Sign.Basic +public import Mathlib.Topology.Algebra.Ring.Compact +public import Mathlib.Topology.Connected.Clopen +public import Mathlib.Topology.Instances.Sign +/-! +# The congruence topology on the idele class group + +The local higher-unit groups are open, +the ray congruence subgroups are open (and hence closed) of finite index, and +the congruence subgroups are cofinal among the closed finite-index subgroups +of the idele class group. +-/ + +@[expose] public section + +open scoped NumberField RestrictedProduct WithZero +open NumberField IsDedekindDomain +open Topology + +noncomputable +section + + +variable {K : Type*} [Field K] [NumberField K] + +namespace RayClass + +open scoped Classical in +/-- The integral representative of a unit in a finite completion. -/ +def localIntegralValue + (v : HeightOneSpectrum (𝓞 K)) + (y : (v.adicCompletionIntegers K).units) : + v.adicCompletionIntegers K := + ((v.adicCompletionIntegers K).toSubmonoid.unitsEquivUnitsType y : + (v.adicCompletionIntegers K)ˣ).1 + +open scoped Classical in +/-- A local integral unit maps to one modulo the `n`-th maximal-ideal +power exactly when its difference from one belongs to that power. -/ +theorem localHigherUnitMap_eq_one_iff + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ) + (y : (v.adicCompletionIntegers K).units) : + localHigherUnitMap v n y = 1 ↔ + localIntegralValue v y - 1 ∈ + (IsLocalRing.maximalIdeal + (v.adicCompletionIntegers K)) ^ n := by + let I := + (IsLocalRing.maximalIdeal + (v.adicCompletionIntegers K)) ^ n + change + Units.map (Ideal.Quotient.mk I).toMonoidHom + ((v.adicCompletionIntegers K).toSubmonoid.unitsEquivUnitsType y) = + 1 ↔ _ + rw [Units.ext_iff] + change Ideal.Quotient.mk I (localIntegralValue v y) = + Ideal.Quotient.mk I 1 ↔ _ + exact Ideal.Quotient.mk_eq_mk_iff_sub_mem + (I := I) (localIntegralValue v y) + (1 : v.adicCompletionIntegers K) + +open scoped Classical in +/-- Local higher-unit groups are contravariant in their depth. -/ +theorem localHigherUnitGroup_antitone + (v : HeightOneSpectrum (𝓞 K)) + {m n : ℕ} (hmn : m ≤ n) : + localHigherUnitGroup v n ≤ localHigherUnitGroup v m := by + intro x hx + rw [mem_localHigherUnitGroup_iff] at hx ⊢ + obtain ⟨y, rfl, hy⟩ := hx + refine ⟨y, rfl, ?_⟩ + rw [localHigherUnitMap_eq_one_iff] at hy ⊢ + exact Ideal.pow_le_pow_right hmn hy + +open scoped Classical in +/-- Every local higher-unit group is open in the multiplicative group of the +finite completion. -/ +theorem isOpen_localHigherUnitGroup + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ) : + IsOpen + ((localHigherUnitGroup v n : + Subgroup (v.adicCompletion K)ˣ) : + Set (v.adicCompletion K)ˣ) := by + let D : Subgroup (v.adicCompletion K)ˣ := + (v.adicCompletionIntegers K).units + let I : Ideal (v.adicCompletionIntegers K) := + (IsLocalRing.maximalIdeal + (v.adicCompletionIntegers K)) ^ n + let toInteger : D → v.adicCompletionIntegers K := + fun y ↦ localIntegralValue v y + have htoInteger : Continuous toInteger := by + apply continuous_induced_rng.mpr + exact Units.continuous_val.comp continuous_subtype_val + let W : Set D := {y | toInteger y - 1 ∈ I} + have : CompactSpace (v.adicCompletionIntegers K) := + Valued.integer.properSpace_iff_compactSpace_integer.mp inferInstance + have hIOpen : IsOpen (I : Set (v.adicCompletionIntegers K)) := by + exact IsLocalRing.isOpen_maximalIdeal_pow + (v.adicCompletionIntegers K) n + have hWOpen : IsOpen W := by + exact hIOpen.preimage (htoInteger.sub continuous_const) + have hDOpen : IsOpen (D : Set (v.adicCompletion K)ˣ) := by + exact isOpen_finiteLocalUnits K v + have himageOpen : + IsOpen (Subtype.val '' W : Set (v.adicCompletion K)ˣ) := + hDOpen.isOpenEmbedding_subtypeVal.isOpenMap W hWOpen + have heq : + (localHigherUnitGroup v n : + Set (v.adicCompletion K)ˣ) = + Subtype.val '' W := by + ext x + constructor + · intro hx + obtain ⟨y, rfl, hy⟩ := + (mem_localHigherUnitGroup_iff v n x).1 hx + refine ⟨y, ?_, rfl⟩ + exact (localHigherUnitMap_eq_one_iff v n y).1 hy + · rintro ⟨y, hyW, rfl⟩ + let y' : (v.adicCompletionIntegers K).units := y + apply (mem_localHigherUnitGroup_iff v n y).2 + refine ⟨y', rfl, ?_⟩ + exact (localHigherUnitMap_eq_one_iff v n y').2 hyW + rw [heq] + exact himageOpen + +open scoped Classical in +/-- The local higher-unit group lies in the local integral-unit group. -/ +theorem localHigherUnitGroup_le_finiteLocalUnits + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ) : + localHigherUnitGroup v n ≤ + (v.adicCompletionIntegers K).units := by + intro x hx + rw [mem_localHigherUnitGroup_iff] at hx + obtain ⟨y, rfl, _⟩ := hx + exact y.property + +open scoped Classical in +/-- The finite idele congruence subgroup is open. -/ +theorem isOpen_finiteCongruenceSubgroup (m : FiniteModulus K) : + IsOpen + ((finiteCongruenceSubgroup m : + Subgroup (FiniteIdeleGroup K)) : + Set (FiniteIdeleGroup K)) := by + let T := m.support + let U : Set (FiniteIdeleGroup K) := + (FiniteIdeleGroup.integralSubgroup (K := K) : + Set (FiniteIdeleGroup K)) ∩ + ⋂ v ∈ T, + (fun a : FiniteIdeleGroup K ↦ a v) ⁻¹' + (localHigherUnitGroup v (m v) : + Set (v.adicCompletion K)ˣ) + have hIntegralOpen : + IsOpen + ((FiniteIdeleGroup.integralSubgroup (K := K) : + Subgroup (FiniteIdeleGroup K)) : + Set (FiniteIdeleGroup K)) := by + change IsOpen {a : FiniteIdeleGroup K | + ∀ v, a v ∈ (v.adicCompletionIntegers K).units} + exact RestrictedProduct.isOpen_forall_mem + (fun v ↦ isOpen_finiteLocalUnits K v) + have hUOpen : IsOpen U := by + apply hIntegralOpen.inter + apply isOpen_biInter_finset + intro v hv + exact (isOpen_localHigherUnitGroup v (m v)).preimage + (RestrictedProduct.continuous_eval v) + have heq : + (finiteCongruenceSubgroup m : Set (FiniteIdeleGroup K)) = U := by + ext a + constructor + · intro ha + have ha' := + (mem_finiteCongruenceSubgroup_iff m a).1 ha + constructor + · exact fun v ↦ + localHigherUnitGroup_le_finiteLocalUnits v (m v) (ha' v) + · apply Set.mem_iInter.mpr + intro v + apply Set.mem_iInter.mpr + intro _hv + exact ha' v + · rintro ⟨haIntegral, haT⟩ + apply (mem_finiteCongruenceSubgroup_iff m a).2 + intro v + by_cases hv : v ∈ T + · have h₁ := Set.mem_iInter.mp haT v + exact Set.mem_iInter.mp h₁ hv + · have hmv : m v = 0 := by + by_contra hne + exact hv (Finsupp.mem_support_iff.mpr hne) + rw [hmv, localHigherUnitGroup_zero] + exact haIntegral v + rw [heq] + exact hUOpen + +omit [NumberField K] in +open scoped Classical in +/-- At a real place the positivity subgroup is open; at a complex place it +is the whole local multiplicative group. -/ +theorem isOpen_infinitePositiveSubgroup (v : InfinitePlace K) : + IsOpen + ((infinitePositiveSubgroup v : Subgroup v.Completionˣ) : + Set v.Completionˣ) := by + by_cases hv : v.IsReal + · rw [show + (infinitePositiveSubgroup v : Set v.Completionˣ) = + {x : v.Completionˣ | + 0 < + InfinitePlace.Completion.extensionEmbeddingOfIsReal + hv (x : v.Completion)} by + ext x + simp only [Set.mem_ofPred_eq] + constructor + · intro h + exact h hv + · intro h hv' + simpa only [Subsingleton.elim hv' hv] using h] + exact isOpen_Ioi.preimage + ((InfinitePlace.Completion.isometry_extensionEmbeddingOfIsReal hv).continuous.comp + Units.continuous_val) + · have htop : + infinitePositiveSubgroup v = ⊤ := by + ext x + simp [mem_infinitePositiveSubgroup_iff, hv] + rw [htop] + exact isOpen_univ + +open scoped Classical in +/-- The positivity subgroup in the product of all infinite local groups is +open. -/ +theorem isOpen_infinitePositivePiSubgroup : + IsOpen + ((Subgroup.pi Set.univ (fun v : InfinitePlace K ↦ + infinitePositiveSubgroup v) : + Subgroup ((v : InfinitePlace K) → v.Completionˣ)) : + Set ((v : InfinitePlace K) → v.Completionˣ)) := by + change IsOpen + (Set.univ.pi fun v : InfinitePlace K ↦ + (infinitePositiveSubgroup v : Set v.Completionˣ)) + exact isOpen_set_pi Set.finite_univ fun v _ ↦ + isOpen_infinitePositiveSubgroup v + +open scoped Classical in +/-- The narrow archimedean congruence subgroup is open. -/ +theorem isOpen_narrowInfiniteCongruenceSubgroup : + IsOpen + ((narrowInfiniteCongruenceSubgroup (K := K) : + Subgroup (InfiniteIdeleGroup K)) : + Set (InfiniteIdeleGroup K)) := + isOpen_infinitePositivePiSubgroup.preimage + ContinuousMulEquiv.piUnits.continuous + +open scoped Classical in +/-- The archimedean congruence subgroup selected by a full modulus is open. -/ +theorem isOpen_infiniteCongruenceSubgroup (m : Modulus K) : + IsOpen + ((m.infiniteCongruenceSubgroup : + Subgroup (InfiniteIdeleGroup K)) : + Set (InfiniteIdeleGroup K)) := by + let U : Set (InfiniteIdeleGroup K) := + ⋂ v ∈ m.infinitePart, + (fun a : InfiniteIdeleGroup K ↦ ContinuousMulEquiv.piUnits a v.1) ⁻¹' + (infinitePositiveSubgroup v.1 : Set v.1.Completionˣ) + have hUOpen : IsOpen U := by + apply isOpen_biInter_finset + intro v hv + have hEval : Continuous + (fun a : InfiniteIdeleGroup K ↦ ContinuousMulEquiv.piUnits a v.1) := + (continuous_apply v.1).comp ContinuousMulEquiv.piUnits.continuous + exact (isOpen_infinitePositiveSubgroup v.1).preimage hEval + have hU : + (m.infiniteCongruenceSubgroup : Set (InfiniteIdeleGroup K)) = U := by + ext a + change a ∈ m.infiniteCongruenceSubgroup ↔ a ∈ U + rw [Modulus.mem_infiniteCongruenceSubgroup_iff] + constructor + · intro ha + apply Set.mem_iInter.mpr + intro v + apply Set.mem_iInter.mpr + intro hv + exact ha v hv + · intro ha v hv + exact Set.mem_iInter.mp (Set.mem_iInter.mp ha v) hv + rw [hU] + exact hUOpen + +open scoped Classical in +/-- The idele congruence subgroup `I_K^m` is open. -/ +theorem isOpen_ideleCongruenceSubgroup (m : Modulus K) : + IsOpen + ((m.ideleCongruenceSubgroup : + Subgroup (IdeleGroup K)) : + Set (IdeleGroup K)) := + (isOpen_infiniteCongruenceSubgroup m).prod + (isOpen_finiteCongruenceSubgroup m.finitePart) + +open scoped Classical in +/-- Membership in the `n`-th local higher-unit group bounds the norm of +the difference from one by the `n`-th power of a uniformizer norm. -/ +theorem localHigherUnit_norm_sub_one_le + (v : HeightOneSpectrum (𝓞 K)) + (ϖ : v.adicCompletionIntegers K) (hϖ : Irreducible ϖ) + (n : ℕ) {x : (v.adicCompletion K)ˣ} + (hx : x ∈ localHigherUnitGroup v n) : + ‖(x : v.adicCompletion K) - 1‖ ≤ ‖ϖ‖ ^ n := by + obtain ⟨y, rfl, hy⟩ := + (mem_localHigherUnitGroup_iff v n x).1 hx + have hyIdeal : + localIntegralValue v y - 1 ∈ + (IsLocalRing.maximalIdeal + (v.adicCompletionIntegers K)) ^ n := + (localHigherUnitMap_eq_one_iff v n y).1 hy + have hIdealSet := + Valuation.Integers.maximalIdeal_pow_eq_setOfPred_le_v_algebraMap_pow + (IsDedekindDomain.HeightOneSpectrum.adicCompletionIntegers.integers + K v) hϖ n + have hyVal : + (Valued.v : Valuation (v.adicCompletion K) ℤᵐ⁰) + (algebraMap (v.adicCompletionIntegers K) + (v.adicCompletion K) (localIntegralValue v y - 1)) ≤ + (Valued.v : Valuation (v.adicCompletion K) ℤᵐ⁰) + (algebraMap (v.adicCompletionIntegers K) + (v.adicCompletion K) ϖ) ^ n := by + exact (Set.ext_iff.mp hIdealSet + (localIntegralValue v y - 1)).mp hyIdeal + have hcoe : + (((y : (v.adicCompletionIntegers K).units) : + (v.adicCompletion K)ˣ) : v.adicCompletion K) = + ((localIntegralValue v y : + v.adicCompletionIntegers K) : v.adicCompletion K) := + rfl + rw [hcoe] + change + ‖((localIntegralValue v y : + v.adicCompletionIntegers K) : v.adicCompletion K) - 1‖ ≤ + ‖((ϖ : v.adicCompletionIntegers K) : + v.adicCompletion K)‖ ^ n + rw [← norm_pow] + apply Valued.toNormedField.norm_le_iff.mpr + have hyVal' : + @LE.le ℤᵐ⁰ WithZero.instPreorder.toLE + ((Valued.v : Valuation (v.adicCompletion K) ℤᵐ⁰) + (((localIntegralValue v y : + v.adicCompletionIntegers K) : + v.adicCompletion K) - 1)) + ((Valued.v : Valuation (v.adicCompletion K) ℤᵐ⁰) + (((ϖ : v.adicCompletionIntegers K) : + v.adicCompletion K) ^ n)) := by + have hAlgebraMap : + ∀ z : v.adicCompletionIntegers K, + algebraMap (v.adicCompletionIntegers K) + (v.adicCompletion K) z = + (z : v.adicCompletion K) := + fun _ ↦ rfl + simpa [hAlgebraMap] using hyVal + have withZeroPreorder_le : + ∀ a b : ℤᵐ⁰, + @LE.le ℤᵐ⁰ WithZero.instPreorder.toLE a b → + a ≤ b := by + intro a b hab + cases a <;> cases b <;> + simp_all + exact withZeroPreorder_le _ _ hyVal' + +open scoped Classical in +/-- An irreducible element of the valuation ring of a finite completion +has norm strictly less than one. -/ +theorem local_irreducible_norm_lt_one + (v : HeightOneSpectrum (𝓞 K)) + {ϖ : v.adicCompletionIntegers K} (hϖ : Irreducible ϖ) : + ‖ϖ‖ < 1 := by + change + ‖((ϖ : v.adicCompletionIntegers K) : + v.adicCompletion K)‖ < 1 + apply Valued.toNormedField.norm_lt_one_iff.mpr + simpa only using! + ((IsDedekindDomain.HeightOneSpectrum.adicCompletionIntegers.integers + K v).valuation_irreducible_lt_one hϖ) + +open scoped Classical in +/-- The higher-unit groups form a neighborhood basis of `1` in a finite +local multiplicative group. -/ +theorem exists_localHigherUnitGroup_subset + (v : HeightOneSpectrum (𝓞 K)) + {U : Set (v.adicCompletion K)ˣ} + (hU : U ∈ 𝓝 (1 : (v.adicCompletion K)ˣ)) : + ∃ n : ℕ, + (localHigherUnitGroup v n : + Set (v.adicCompletion K)ˣ) ⊆ U := by + have hU' : + U ∈ Filter.comap + (Units.val : (v.adicCompletion K)ˣ → + v.adicCompletion K) + (𝓝 (1 : v.adicCompletion K)) := by + have heq : + 𝓝 (1 : (v.adicCompletion K)ˣ) = + Filter.comap + (Units.val : (v.adicCompletion K)ˣ → + v.adicCompletion K) + (𝓝 (1 : v.adicCompletion K)) := by + simpa using + Units.isEmbedding_val₀.nhds_eq_comap + (1 : (v.adicCompletion K)ˣ) + rw [← heq] + exact hU + obtain ⟨V, hV, hVU⟩ := Filter.mem_comap.mp hU' + obtain ⟨ε, hε, hball⟩ := Metric.mem_nhds_iff.mp hV + obtain ⟨ϖ, hϖ⟩ := + IsDiscreteValuationRing.exists_irreducible + (v.adicCompletionIntegers K) + have hϖlt : ‖ϖ‖ < 1 := + local_irreducible_norm_lt_one v hϖ + obtain ⟨n, hn⟩ : + ∃ n : ℕ, ‖ϖ‖ ^ n < ε := + exists_pow_lt_of_lt_one hε hϖlt + refine ⟨n, ?_⟩ + intro x hx + apply hVU + apply hball + change dist + (((x : (v.adicCompletion K)ˣ) : + v.adicCompletion K)) + 1 < ε + rw [dist_eq_norm] + exact (localHigherUnit_norm_sub_one_le v ϖ hϖ n hx).trans_lt hn + +open scoped Classical in +/-- Every identity neighborhood in the finite ideles contains a finite +congruence subgroup. -/ +theorem exists_finiteCongruenceSubgroup_subset + {U : Set (FiniteIdeleGroup K)} + (hUopen : IsOpen U) (hUone : (1 : FiniteIdeleGroup K) ∈ U) : + ∃ m : FiniteModulus K, + (finiteCongruenceSubgroup m : + Set (FiniteIdeleGroup K)) ⊆ U := by + let D := + fun v : HeightOneSpectrum (𝓞 K) ↦ + (v.adicCompletionIntegers K).units + let s : (∀ v, D v) → FiniteIdeleGroup K := + FiniteIdeleGroup.integralStructureMap + let V : Set (∀ v, D v) := s ⁻¹' U + have hs : Continuous s := by + exact RestrictedProduct.isEmbedding_structureMap.continuous + have hVopen : IsOpen V := + hUopen.preimage hs + have hVone : (1 : ∀ v, D v) ∈ V := by + change s 1 ∈ U + have hsone : s 1 = 1 := by + ext v + rfl + rw [hsone] + exact hUone + obtain ⟨T, u, hu, hTu⟩ := + isOpen_pi_iff.mp hVopen (1 : ∀ v, D v) hVone + let W : + ∀ v : T, Set (v.1.adicCompletion K)ˣ := + fun v ↦ Subtype.val '' u v.1 + have hWopen (v : T) : IsOpen (W v) := by + exact + (isOpen_finiteLocalUnits K v.1).isOpenEmbedding_subtypeVal.isOpenMap + (u v.1) (hu v.1 v.2).1 + have hWone (v : T) : + (1 : (v.1.adicCompletion K)ˣ) ∈ W v := by + exact ⟨1, (hu v.1 v.2).2, rfl⟩ + have hWnhds (v : T) : + W v ∈ 𝓝 (1 : (v.1.adicCompletion K)ˣ) := + (hWopen v).mem_nhds (hWone v) + choose n hn using fun v : T ↦ + exists_localHigherUnitGroup_subset v.1 (hWnhds v) + let exponent : HeightOneSpectrum (𝓞 K) → ℕ := + fun v ↦ if hv : v ∈ T then n ⟨v, hv⟩ else 0 + have hexponent : + ∀ v, exponent v ≠ 0 → v ∈ T := by + intro v hv + by_contra hvT + exact hv (by simp [exponent, hvT]) + let m : FiniteModulus K := + Finsupp.onFinset T exponent hexponent + refine ⟨m, ?_⟩ + intro a ha + have ha' : + ∀ v, a v ∈ localHigherUnitGroup v (m v) := + (mem_finiteCongruenceSubgroup_iff m a).1 ha + have haIntegral : + ∀ v, a v ∈ (v.adicCompletionIntegers K).units := + fun v ↦ localHigherUnitGroup_le_finiteLocalUnits v (m v) (ha' v) + let d : ∀ v, D v := + fun v ↦ ⟨a v, haIntegral v⟩ + have hdTu : d ∈ (T : Set _).pi u := by + intro v hv + have hv' : v ∈ T := + Finset.mem_coe.mp hv + let vt : T := ⟨v, hv'⟩ + have hmv : m v = n vt := by + simp [m, exponent, hv', vt] + have hav : + a v ∈ localHigherUnitGroup v (n vt) := by + simpa only [hmv] using ha' v + obtain ⟨z, hzu, hza⟩ := hn vt hav + have hzd : z = d v := + Subtype.ext hza + rwa [← hzd] + have hdV : d ∈ V := + hTu hdTu + have hsd : s d = a := by + ext v + rfl + change s d ∈ U at hdV + rwa [hsd] at hdV + +open scoped Classical in +/-- The multiplicative topological equivalence between a real infinite +completion and `ℝ`. -/ +def realCompletionContinuousMulEquiv + (v : InfinitePlace K) (hv : v.IsReal) : + v.Completion ≃ₜ* ℝ where + __ := + (InfinitePlace.Completion.ringEquivRealOfIsReal hv).toMulEquiv + continuous_toFun := + (InfinitePlace.Completion.isometryEquivRealOfIsReal hv).continuous + continuous_invFun := + (InfinitePlace.Completion.isometryEquivRealOfIsReal hv).symm.continuous + +open scoped Classical in +/-- The multiplicative topological equivalence between a complex infinite +completion and `ℂ`. -/ +def complexCompletionContinuousMulEquiv + (v : InfinitePlace K) (hv : v.IsComplex) : + v.Completion ≃ₜ* ℂ where + __ := + (InfinitePlace.Completion.ringEquivComplexOfIsComplex hv).toMulEquiv + continuous_toFun := + (InfinitePlace.Completion.isometryEquivComplexOfIsComplex hv).continuous + continuous_invFun := + (InfinitePlace.Completion.isometryEquivComplexOfIsComplex hv).symm.continuous + +open scoped Classical in +/-- A positive real number regarded as a unit. -/ +def positiveRealUnit (x : Set.Ioi (0 : ℝ)) : ℝˣ := + Units.mk0 x.1 x.2.ne' + +open scoped Classical in +/-- The map from positive real numbers to real units is continuous. -/ +theorem continuous_positiveRealUnit : + Continuous positiveRealUnit := by + apply Units.continuous_iff.mpr + constructor + · change Continuous + (fun x : Set.Ioi (0 : ℝ) ↦ (x : ℝ)) + exact continuous_subtype_val + · change Continuous + (fun x : Set.Ioi (0 : ℝ) ↦ ((x : ℝ)⁻¹)) + exact continuous_subtype_val.inv₀ + (fun x : Set.Ioi (0 : ℝ) ↦ x.2.ne') + +omit [NumberField K] in +open scoped Classical in +/-- The positive local multiplicative group at an infinite place is +connected. -/ +theorem isConnected_infinitePositiveSubgroup + (v : InfinitePlace K) : + IsConnected + ((infinitePositiveSubgroup v : Subgroup v.Completionˣ) : + Set v.Completionˣ) := by + rw [isConnected_iff_connectedSpace] + by_cases hv : v.IsReal + · let e : v.Completionˣ ≃ₜ* ℝˣ := + Units.mapContinuousMulEquiv + (realCompletionContinuousMulEquiv v hv) + let f : Set.Ioi (0 : ℝ) → infinitePositiveSubgroup v := + fun x ↦ + ⟨e.symm (positiveRealUnit x), by + apply (mem_infinitePositiveSubgroup_iff v _).2 + intro hv' + have heq : hv' = hv := + Subsingleton.elim _ _ + subst hv' + change + 0 < ((e (e.symm (positiveRealUnit x)) : ℝˣ) : ℝ) + rw [e.apply_symm_apply] + exact x.2⟩ + let : ConnectedSpace (Set.Ioi (0 : ℝ)) := + isConnected_iff_connectedSpace.mp isConnected_Ioi + apply Function.Surjective.connectedSpace (f := f) + · intro z + have hzpos : + 0 < ((e z.1 : ℝˣ) : ℝ) := by + change 0 < + InfinitePlace.Completion.extensionEmbeddingOfIsReal + hv (z.1 : v.Completion) + exact + ((mem_infinitePositiveSubgroup_iff v z.1).1 z.2 hv) + let x : Set.Ioi (0 : ℝ) := + ⟨((e z.1 : ℝˣ) : ℝ), hzpos⟩ + refine ⟨x, ?_⟩ + apply Subtype.ext + change e.symm (positiveRealUnit x) = z.1 + apply e.injective + simp [x, positiveRealUnit] + · apply continuous_induced_rng.mpr + exact e.symm.continuous.comp continuous_positiveRealUnit + · have hvc : v.IsComplex := + InfinitePlace.not_isReal_iff_isComplex.mp hv + let e : v.Completionˣ ≃ₜ* ℂˣ := + Units.mapContinuousMulEquiv + (complexCompletionContinuousMulEquiv v hvc) + let f : ℂˣ → infinitePositiveSubgroup v := + fun x ↦ + ⟨e.symm x, by + apply (mem_infinitePositiveSubgroup_iff v _).2 + intro hv' + exact (hv hv').elim⟩ + apply Function.Surjective.connectedSpace (f := f) + · intro z + refine ⟨e z.1, ?_⟩ + apply Subtype.ext + exact e.symm_apply_apply z.1 + · apply continuous_induced_rng.mpr + exact e.symm.continuous + +omit [NumberField K] in +open scoped Classical in +/-- The narrow archimedean positivity subgroup is connected. -/ +theorem isConnected_narrowInfiniteCongruenceSubgroup : + IsConnected + ((narrowInfiniteCongruenceSubgroup (K := K) : + Subgroup (InfiniteIdeleGroup K)) : + Set (InfiniteIdeleGroup K)) := by + rw [isConnected_iff_connectedSpace] + let (v : InfinitePlace K) : + ConnectedSpace (infinitePositiveSubgroup v) := + isConnected_iff_connectedSpace.mp + (isConnected_infinitePositiveSubgroup v) + let f : + (∀ v : InfinitePlace K, infinitePositiveSubgroup v) → + narrowInfiniteCongruenceSubgroup (K := K) := + fun x ↦ + ⟨ContinuousMulEquiv.piUnits.symm + (fun v ↦ (x v : v.Completionˣ)), by + apply (mem_narrowInfiniteCongruenceSubgroup_iff _).2 + intro v + exact (x v).2⟩ + apply Function.Surjective.connectedSpace (f := f) + · intro a + let x : ∀ v : InfinitePlace K, infinitePositiveSubgroup v := + fun v ↦ + ⟨ContinuousMulEquiv.piUnits a.1 v, + (mem_narrowInfiniteCongruenceSubgroup_iff a.1).1 a.2 v⟩ + refine ⟨x, ?_⟩ + apply Subtype.ext + change ContinuousMulEquiv.piUnits.symm + (fun v ↦ (x v : v.Completionˣ)) = a.1 + apply ContinuousMulEquiv.piUnits.injective + simp [x] + · apply continuous_induced_rng.mpr + apply ContinuousMulEquiv.piUnits.symm.continuous.comp + exact continuous_pi fun v ↦ + continuous_subtype_val.comp (continuous_apply v) + +open scoped Classical in +/-- The sign of a unit at a real infinite place. -/ +def realPlaceSign + (v : {w : InfinitePlace K // w.IsReal}) : + v.1.Completionˣ →* SignTypeˣ := + (Units.map signHom.toMonoidHom).comp + (Units.map + (InfinitePlace.Completion.extensionEmbeddingOfIsReal + v.2).toMonoidHom) + +open scoped Classical in +/-- The tuple of signs of an infinite idele at all real places. -/ +def infiniteSign : + InfiniteIdeleGroup K →* + ((v : {w : InfinitePlace K // w.IsReal}) → SignTypeˣ) := + MonoidHom.pi fun v ↦ + (realPlaceSign v).comp (InfiniteIdeleGroup.component v.1) + +omit [NumberField K] in +open scoped Classical in +/-- Positivity at all real places is exactly the kernel of the infinite sign +map. -/ +theorem infiniteSign_ker_eq_narrowInfiniteCongruenceSubgroup : + (infiniteSign (K := K)).ker = + narrowInfiniteCongruenceSubgroup (K := K) := by + ext a + constructor + · intro ha + have ha' : infiniteSign (K := K) a = 1 := + MonoidHom.mem_ker.mp ha + apply (mem_narrowInfiniteCongruenceSubgroup_iff a).2 + intro v + apply (mem_infinitePositiveSubgroup_iff v + (ContinuousMulEquiv.piUnits a v)).2 + intro hv + have hsign := + congrArg Units.val (congrFun ha' ⟨v, hv⟩) + change + SignType.sign + (InfinitePlace.Completion.extensionEmbeddingOfIsReal hv + ((InfiniteIdeleGroup.component v a : + v.Completionˣ) : v.Completion)) = + 1 at hsign + exact sign_eq_one_iff.mp hsign + · intro ha + apply MonoidHom.mem_ker.mpr + funext v + apply Units.ext + change + SignType.sign + (InfinitePlace.Completion.extensionEmbeddingOfIsReal v.2 + ((InfiniteIdeleGroup.component v.1 a : + v.1.Completionˣ) : v.1.Completion)) = + 1 + rw [sign_eq_one_iff] + exact + ((mem_narrowInfiniteCongruenceSubgroup_iff a).1 ha v.1) v.2 + +open scoped Classical in +/-- The infinite positivity subgroup has finite index (its quotient is +detected by the finitely many real signs). -/ +instance narrowInfiniteCongruenceSubgroupFiniteIndex : + (narrowInfiniteCongruenceSubgroup (K := K)).FiniteIndex := by + rw [← infiniteSign_ker_eq_narrowInfiniteCongruenceSubgroup (K := K)] + exact Subgroup.finiteIndex_ker (infiniteSign (K := K)) + +open scoped Classical in +/-- Every selected-real-place congruence subgroup has finite index, because +it contains the narrow positivity subgroup. -/ +instance Modulus.infiniteCongruenceSubgroupFiniteIndex + (m : Modulus K) : + m.infiniteCongruenceSubgroup.FiniteIndex := by + apply Subgroup.finiteIndex_of_le + (H := narrowInfiniteCongruenceSubgroup (K := K)) + (K := m.infiniteCongruenceSubgroup) + intro a ha + rw [Modulus.mem_infiniteCongruenceSubgroup_iff] + intro v _ + exact (mem_narrowInfiniteCongruenceSubgroup_iff a).1 ha v.1 + +open scoped Classical in +/-- The finite idele congruence subgroup lies in the everywhere-integral +finite ideles. -/ +theorem finiteCongruenceSubgroup_le_integralSubgroup + (m : FiniteModulus K) : + finiteCongruenceSubgroup m ≤ + FiniteIdeleGroup.integralSubgroup (K := K) := by + intro a ha v + exact localHigherUnitGroup_le_finiteLocalUnits v (m v) (ha v) + +open scoped Classical in +/-- Within the compact group of everywhere-integral finite ideles, every +finite congruence subgroup has finite index. -/ +instance finiteCongruenceSubgroupFiniteRelIndex + (m : FiniteModulus K) : + (finiteCongruenceSubgroup m).IsFiniteRelIndex + (FiniteIdeleGroup.integralSubgroup (K := K)) := by + rw [Subgroup.isFiniteRelIndex_iff_finiteIndex] + let U := FiniteIdeleGroup.integralSubgroup (K := K) + let J := finiteCongruenceSubgroup m + have hJU : J ≤ U := + finiteCongruenceSubgroup_le_integralSubgroup m + let J' : Subgroup U := J.subgroupOf U + have : CompactSpace U := + isCompact_iff_compactSpace.mp + (FiniteIdeleGroup.isCompact_integralSubgroup (K := K)) + have hJOpen : IsOpen (J' : Set U) := by + exact Subgroup.subgroupOf_isOpen U J + (isOpen_finiteCongruenceSubgroup m) + have : Finite (U ⧸ J') := + J'.quotient_finite_of_isOpen hJOpen + exact Subgroup.finiteIndex_of_finite_quotient + +open scoped Classical in +/-- Finite congruence subgroups are contravariant in the finite modulus. -/ +theorem finiteCongruenceSubgroup_antitone + {m n : FiniteModulus K} (hmn : m ≤ n) : + finiteCongruenceSubgroup n ≤ finiteCongruenceSubgroup m := by + intro a ha + rw [mem_finiteCongruenceSubgroup_iff] at ha ⊢ + intro v + exact localHigherUnitGroup_antitone v (hmn v) (ha v) + +open scoped Classical in +/-- Infinite congruence subgroups are contravariant in the selected real +places of a full modulus. -/ +theorem Modulus.infiniteCongruenceSubgroup_antitone + {m n : Modulus K} (hmn : m ≤ n) : + n.infiniteCongruenceSubgroup ≤ m.infiniteCongruenceSubgroup := by + intro a ha + rw [Modulus.mem_infiniteCongruenceSubgroup_iff] at ha ⊢ + intro v hv + exact ha v (hmn.2 hv) + +open scoped Classical in +/-- Idèle congruence subgroups are contravariant in a full modulus. -/ +theorem Modulus.ideleCongruenceSubgroup_antitone + {m n : Modulus K} (hmn : m ≤ n) : + n.ideleCongruenceSubgroup ≤ m.ideleCongruenceSubgroup := by + intro a ha + rw [Modulus.mem_ideleCongruenceSubgroup_iff] at ha ⊢ + exact ⟨Modulus.infiniteCongruenceSubgroup_antitone hmn ha.1, + finiteCongruenceSubgroup_antitone hmn.1 ha.2⟩ + +open scoped Classical in +/-- Ray congruence subgroups are contravariant in a full modulus. -/ +theorem Modulus.congruenceSubgroup_antitone + {m n : Modulus K} (hmn : m ≤ n) : + n.congruenceSubgroup ≤ m.congruenceSubgroup := by + unfold Modulus.congruenceSubgroup + apply Subgroup.map_mono + exact sup_le + ((Modulus.ideleCongruenceSubgroup_antitone hmn).trans le_sup_left) + le_sup_right + +open scoped Classical in +/-- Ideles integral at all finite places split as the infinite ideles times +the compact group of integral finite ideles. -/ +def integralIdeleEquiv : + IdeleGroup.integralAtFinitePlaces (K := K) ≃* + InfiniteIdeleGroup K × + FiniteIdeleGroup.integralSubgroup (K := K) where + toFun a := (a.1.1, ⟨a.1.2, a.2⟩) + invFun a := ⟨(a.1, a.2.1), a.2.2⟩ + left_inv a := by + apply Subtype.ext + rfl + right_inv a := rfl + map_mul' a b := rfl + +open scoped Classical in +/-- Under `integralIdeleEquiv`, the idele congruence subgroup maps to the +product of its infinite and finite congruence factors. -/ +theorem map_ideleCongruenceSubgroup_subgroupOf_integral (m : Modulus K) : + ((m.ideleCongruenceSubgroup).subgroupOf + (IdeleGroup.integralAtFinitePlaces (K := K))).map + (integralIdeleEquiv (K := K)).toMonoidHom = + m.infiniteCongruenceSubgroup.prod + ((finiteCongruenceSubgroup m.finitePart).subgroupOf + (FiniteIdeleGroup.integralSubgroup (K := K))) := by + ext a + constructor + · rintro ⟨x, hx, rfl⟩ + exact ⟨hx.1, hx.2⟩ + · rintro ⟨ha, hb⟩ + refine ⟨⟨(a.1, a.2.1), a.2.2⟩, ⟨ha, hb⟩, rfl⟩ + +open scoped Classical in +/-- The idele congruence subgroup has finite relative index in the ideles +which are integral at every finite place. -/ +instance ideleCongruenceSubgroupFiniteRelIndex + (m : Modulus K) : + m.ideleCongruenceSubgroup.IsFiniteRelIndex + (IdeleGroup.integralAtFinitePlaces (K := K)) := by + rw [Subgroup.isFiniteRelIndex_iff_finiteIndex, + Subgroup.finiteIndex_iff] + rw [← Subgroup.index_map_equiv + ((m.ideleCongruenceSubgroup).subgroupOf + (IdeleGroup.integralAtFinitePlaces (K := K))) + (integralIdeleEquiv (K := K))] + change + (((m.ideleCongruenceSubgroup).subgroupOf + (IdeleGroup.integralAtFinitePlaces (K := K))).map + (integralIdeleEquiv (K := K)).toMonoidHom).index ≠ 0 + rw [map_ideleCongruenceSubgroup_subgroupOf_integral] + let : + ((finiteCongruenceSubgroup m.finitePart).subgroupOf + (FiniteIdeleGroup.integralSubgroup (K := K))).FiniteIndex := + Subgroup.IsFiniteRelIndex.to_finiteIndex_subgroupOf + rw [Subgroup.index_prod] + exact mul_ne_zero + (Subgroup.FiniteIndex.index_ne_zero : + m.infiniteCongruenceSubgroup.index ≠ 0) + (Subgroup.FiniteIndex.index_ne_zero : + ((finiteCongruenceSubgroup m.finitePart).subgroupOf + (FiniteIdeleGroup.integralSubgroup (K := K))).index ≠ 0) + +open scoped Classical in +/-- The subgroup defining the ordinary ideal class group has finite index. -/ +instance ordinaryIdealClassSubgroupFiniteIndex : + (IdeleGroup.integralAtFinitePlaces (K := K) ⊔ + IdeleGroup.principalSubgroup K).FiniteIndex := by + let : Finite + (IdeleGroup K ⧸ + (IdeleGroup.integralAtFinitePlaces (K := K) ⊔ + IdeleGroup.principalSubgroup K)) := + Finite.of_equiv (ClassGroup (𝓞 K)) + (IdeleGroup.quotientIntegralSupPrincipalEquiv + (K := K)).symm.toEquiv + exact Subgroup.finiteIndex_of_finite_quotient + +open scoped Classical in +/-- The subgroup `I_K^m Kˣ` has finite index in the idele group. -/ +instance ideleCongruenceSupPrincipalFiniteIndex + (m : Modulus K) : + (m.ideleCongruenceSubgroup ⊔ + IdeleGroup.principalSubgroup K).FiniteIndex := by + let J := m.ideleCongruenceSubgroup + let P := IdeleGroup.principalSubgroup K + let U := IdeleGroup.integralAtFinitePlaces (K := K) + let H := J ⊔ P + let V := U ⊔ P + have hJU : J ≤ U := by + intro a ha + exact finiteCongruenceSubgroup_le_integralSubgroup m.finitePart ha.2 + have hHV : H ≤ V := + sup_le (hJU.trans le_sup_left) le_sup_right + have hJUfinite : J.IsFiniteRelIndex U := + ideleCongruenceSubgroupFiniteRelIndex m + have hHUfinite : H.IsFiniteRelIndex U := + Subgroup.isFiniteRelIndex_of_le_left U le_sup_left + have hsup : U ⊔ H = V := by + dsimp only [H, V] + calc + U ⊔ (J ⊔ P) = (U ⊔ J) ⊔ P := (sup_assoc U J P).symm + _ = U ⊔ P := by rw [sup_eq_left.mpr hJU] + have hrel : H.relIndex V ≠ 0 := by + rw [← hsup, Subgroup.relIndex_sup_right] + exact Subgroup.relIndex_ne_zero + have hVindex : V.index ≠ 0 := + Subgroup.FiniteIndex.index_ne_zero + change H.FiniteIndex + rw [Subgroup.finiteIndex_iff, + ← Subgroup.relIndex_mul_index hHV] + exact mul_ne_zero hrel hVindex + +open scoped Classical in +/-- The ray congruence subgroup in the idele class group is open. -/ +theorem isOpen_congruenceSubgroup (m : Modulus K) : + IsOpen + ((m.congruenceSubgroup : + Subgroup (IdeleClassGroup K)) : + Set (IdeleClassGroup K)) := by + let J := m.ideleCongruenceSubgroup + let P := IdeleGroup.principalSubgroup K + have hsupOpen : IsOpen ((J ⊔ P : Subgroup (IdeleGroup K)) : + Set (IdeleGroup K)) := + Subgroup.isOpen_mono le_sup_left + (isOpen_ideleCongruenceSubgroup m) + rw [Modulus.congruenceSubgroup, Subgroup.coe_map] + exact QuotientGroup.isOpenMap_coe _ hsupOpen + +open scoped Classical in +/-- Every ray congruence subgroup is closed. -/ +theorem isClosed_congruenceSubgroup (m : Modulus K) : + IsClosed + ((m.congruenceSubgroup : + Subgroup (IdeleClassGroup K)) : + Set (IdeleClassGroup K)) := + (m.congruenceSubgroup).isClosed_of_isOpen + (isOpen_congruenceSubgroup m) + +open scoped Classical in +/-- Every ray congruence subgroup has finite index. -/ +instance congruenceSubgroupFiniteIndex (m : Modulus K) : + m.congruenceSubgroup.FiniteIndex := by + let : Finite (RayClassGroup m) := + Finite.of_equiv + (IdeleGroup K ⧸ + (m.ideleCongruenceSubgroup ⊔ + IdeleGroup.principalSubgroup K)) + (rayClassGroupEquivIdeleQuotient m).symm.toEquiv + exact Subgroup.finiteIndex_of_finite_quotient + +open scoped Classical in +/-- The image of the connected narrow archimedean positivity subgroup lies in +every open subgroup of the idele class group. -/ +theorem narrowInfiniteCongruenceSubgroup_mapsTo_openSubgroup + (H : Subgroup (IdeleClassGroup K)) + (hH : IsOpen (H : Set (IdeleClassGroup K))) + {a : InfiniteIdeleGroup K} + (ha : a ∈ narrowInfiniteCongruenceSubgroup (K := K)) : + (((a, (1 : FiniteIdeleGroup K)) : IdeleGroup K) : + IdeleClassGroup K) ∈ H := by + let : ConnectedSpace + (narrowInfiniteCongruenceSubgroup (K := K)) := + isConnected_iff_connectedSpace.mp + isConnected_narrowInfiniteCongruenceSubgroup + let f : + narrowInfiniteCongruenceSubgroup (K := K) → + IdeleClassGroup K := + fun x ↦ + (((x.1, (1 : FiniteIdeleGroup K)) : IdeleGroup K) : + IdeleClassGroup K) + have hf : Continuous f := by + apply QuotientGroup.continuous_mk.comp + exact continuous_subtype_val.prodMk continuous_const + have hf_one : f 1 = 1 := by + change + ((QuotientGroup.mk' + (IdeleGroup.principalSubgroup K)) + ((1 : InfiniteIdeleGroup K), + (1 : FiniteIdeleGroup K))) = 1 + exact map_one _ + have hinter : + (Set.range f ∩ (H : Set (IdeleClassGroup K))).Nonempty := by + refine ⟨1, ?_, H.one_mem⟩ + exact ⟨1, hf_one⟩ + have hsubset : Set.range f ⊆ (H : Set (IdeleClassGroup K)) := + (isConnected_range hf).isPreconnected.subset_isClopen + ⟨H.isClosed_of_isOpen hH, hH⟩ hinter + exact hsubset ⟨⟨a, ha⟩, rfl⟩ + +open scoped Classical in +/-- Congruence subgroups are cofinal among the open subgroups of the idele +class group. -/ +theorem exists_congruenceSubgroup_le_of_isOpen + (H : Subgroup (IdeleClassGroup K)) + (hH : IsOpen (H : Set (IdeleClassGroup K))) : + ∃ m : Modulus K, m.congruenceSubgroup ≤ H := by + let P := IdeleGroup.principalSubgroup K + let q : IdeleGroup K →* IdeleClassGroup K := + QuotientGroup.mk' P + let g : FiniteIdeleGroup K → IdeleClassGroup K := + fun b ↦ q ((1 : InfiniteIdeleGroup K), b) + let U : Set (FiniteIdeleGroup K) := g ⁻¹' (H : Set _) + have hq : Continuous q := + QuotientGroup.continuous_mk + have hg : Continuous g := by + exact hq.comp (continuous_const.prodMk continuous_id) + have hUopen : IsOpen U := + hH.preimage hg + have hUone : (1 : FiniteIdeleGroup K) ∈ U := by + change g 1 ∈ H + have hg_one : g 1 = 1 := by + change q + ((1 : InfiniteIdeleGroup K), + (1 : FiniteIdeleGroup K)) = 1 + exact map_one q + rw [hg_one] + exact H.one_mem + obtain ⟨f, hf⟩ := + exists_finiteCongruenceSubgroup_subset hUopen hUone + let m : Modulus K := Modulus.narrowOfFinite f + have hJ : + m.ideleCongruenceSubgroup ≤ Subgroup.comap q H := by + intro x hx + have hx' := (Modulus.mem_ideleCongruenceSubgroup_iff m x).1 hx + have hinf : + q (x.1, (1 : FiniteIdeleGroup K)) ∈ H := by + apply narrowInfiniteCongruenceSubgroup_mapsTo_openSubgroup H hH + rw [← Modulus.infiniteCongruenceSubgroup_narrowOfFinite f] + simpa [m] using hx'.1 + have hfin : + q ((1 : InfiniteIdeleGroup K), x.2) ∈ H := by + have hfinite : x.2 ∈ finiteCongruenceSubgroup f := by + simpa [m] using hx'.2 + have := hf hfinite + change g x.2 ∈ H at this + exact this + have hmul := H.mul_mem hinf hfin + have hqx : + q x = + q (x.1, (1 : FiniteIdeleGroup K)) * + q ((1 : InfiniteIdeleGroup K), x.2) := by + rw [← map_mul] + apply congrArg q + apply Prod.ext + · exact (mul_one x.1).symm + · exact (one_mul x.2).symm + rw [← hqx] at hmul + exact hmul + refine ⟨m, ?_⟩ + rw [Modulus.congruenceSubgroup, Subgroup.map_le_iff_le_comap] + apply sup_le + · exact hJ + · intro x hx + change q x ∈ H + have hxone : q x = 1 := by + exact QuotientGroup.eq_one_iff x |>.2 hx + rw [hxone] + exact H.one_mem + +open scoped Classical in +/-- A modulus whose ray congruence subgroup lies in the given open +subgroup. -/ +noncomputable def chosenModulusInside + (H : Subgroup (IdeleClassGroup K)) + (hH : IsOpen (H : Set (IdeleClassGroup K))) : + Modulus K := + Classical.choose + (exists_congruenceSubgroup_le_of_isOpen H hH) + +open scoped Classical in +/-- The chosen modulus has the required subgroup +inclusion. -/ +theorem chosenModulusInside_spec + (H : Subgroup (IdeleClassGroup K)) + (hH : IsOpen (H : Set (IdeleClassGroup K))) : + (chosenModulusInside H hH).congruenceSubgroup ≤ H := + Classical.choose_spec + (exists_congruenceSubgroup_le_of_isOpen H hH) + +open scoped Classical in +/-- Closed finite-index subgroups are open, hence also contain a chosen ray +congruence subgroup. -/ +noncomputable def modulusInsideClosedFiniteIndex + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + Modulus K := + chosenModulusInside H + (H.isOpen_of_isClosed_of_finiteIndex hclosed) + +open scoped Classical in +/-- Specification of the modulus selected for a closed finite-index +subgroup. -/ +theorem modulusInsideClosedFiniteIndex_spec + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + (modulusInsideClosedFiniteIndex H hclosed).congruenceSubgroup ≤ H := + chosenModulusInside_spec H + (H.isOpen_of_isClosed_of_finiteIndex hclosed) + +open scoped Classical in +/-- A subgroup of the idele class group is closed of +finite index exactly when it contains a ray congruence subgroup. -/ +theorem isClosed_and_finiteIndex_iff_exists_congruenceSubgroup_le + (H : Subgroup (IdeleClassGroup K)) : + (IsClosed (H : Set (IdeleClassGroup K)) ∧ H.FiniteIndex) ↔ + ∃ m : Modulus K, m.congruenceSubgroup ≤ H := by + constructor + · rintro ⟨hHclosed, hHfinite⟩ + let : H.FiniteIndex := hHfinite + exact exists_congruenceSubgroup_le_of_isOpen H + (H.isOpen_of_isClosed_of_finiteIndex hHclosed) + · rintro ⟨m, hm⟩ + have hHopen : IsOpen (H : Set (IdeleClassGroup K)) := + Subgroup.isOpen_mono hm (isOpen_congruenceSubgroup m) + have : H.FiniteIndex := + Subgroup.finiteIndex_of_le hm + exact ⟨H.isClosed_of_isOpen hHopen, inferInstance⟩ + +end RayClass diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit.lean new file mode 100644 index 0000000000..45e187840c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.GaloisAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Herbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.LogLattice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Rank + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/All.lean new file mode 100644 index 0000000000..6a7593e2a5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/All.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.GaloisAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Herbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.LogLattice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Rank +/-! +# S-units of number fields + +Public aggregate for the rank and logarithmic-lattice theory of S-units. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean new file mode 100644 index 0000000000..bde082597e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean @@ -0,0 +1,1240 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.LogLattice +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.LatticeHerbrand +public import Mathlib.NumberTheory.NumberField.InfinitePlace.Ramification +/-! +# Galois actions on `S`-units and their logarithmic lattice + +This file supplies the equivariant input for the `S`-unit calculation. A Galois +automorphism acts on finite places through its restriction to the ring of +integers, on infinite places by precomposition, and on field units in the +usual way. For a stable finite set of finite places these actions restrict +to the actual `S`-unit group. +-/ + +@[expose] public section + +open scoped BigOperators NumberField nonZeroDivisors +open IsDedekindDomain Module +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology + +noncomputable +section + +variable + (K L : Type*) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + +open scoped Classical in +/-- The permutation of finite places induced by a Galois automorphism. -/ +noncomputable def finitePlaceEquiv + (σ : L ≃ₐ[K] L) : + HeightOneSpectrum (𝓞 L) ≃ + HeightOneSpectrum (𝓞 L) := + HeightOneSpectrum.equivOfRingEquiv + (NumberField.RingOfIntegers.mapAlgEquiv σ).toRingEquiv + +open scoped Classical in +/-- Transport of ideals along a ring automorphism, as a multiplicative +equivalence. -/ +noncomputable def idealMapMulEquiv + {R : Type*} [CommRing R] + (e : R ≃+* R) : Ideal R ≃* Ideal R where + toFun I := I.map e + invFun I := I.map e.symm + left_inv _ := Ideal.map_of_equiv e + right_inv _ := Ideal.map_of_equiv e.symm + map_mul' I J := Ideal.map_mul e I J + +open scoped Classical in +@[simp] +theorem idealMapMulEquiv_apply + {R : Type*} [CommRing R] + (e : R ≃+* R) (I : Ideal R) : + idealMapMulEquiv e I = I.map e := + rfl + +omit [NumberField K] [NumberField L] in +open scoped Classical in +@[simp] +theorem finitePlaceEquiv_asIdeal + (σ : L ≃ₐ[K] L) + (v : HeightOneSpectrum (𝓞 L)) : + (finitePlaceEquiv K L σ v).asIdeal = + v.asIdeal.map + (NumberField.RingOfIntegers.mapAlgEquiv σ).toRingEquiv := by + ext x + exact Ideal.symm_apply_mem_of_equiv_iff + +omit [NumberField K] [NumberField L] in +open scoped Classical in +@[simp] +theorem finitePlaceEquiv_one + (v : HeightOneSpectrum (𝓞 L)) : + finitePlaceEquiv K L (1 : L ≃ₐ[K] L) v = v := by + apply HeightOneSpectrum.ext + ext x + change + NumberField.RingOfIntegers.mapRingHom (1 : L ≃ₐ[K] L).symm.toRingHom x ∈ + v.asIdeal ↔ + x ∈ v.asIdeal + have hx : + NumberField.RingOfIntegers.mapRingHom (1 : L ≃ₐ[K] L).symm.toRingHom x = + x := by + apply NumberField.RingOfIntegers.ext + rfl + rw [hx] + +omit [NumberField K] [NumberField L] in +open scoped Classical in +@[simp] +theorem finitePlaceEquiv_mul + (σ τ : L ≃ₐ[K] L) + (v : HeightOneSpectrum (𝓞 L)) : + finitePlaceEquiv K L (σ * τ) v = + finitePlaceEquiv K L σ + (finitePlaceEquiv K L τ v) := by + apply HeightOneSpectrum.ext + ext x + change + NumberField.RingOfIntegers.mapRingHom (σ * τ).symm.toRingHom x ∈ + v.asIdeal ↔ + NumberField.RingOfIntegers.mapRingHom τ.symm.toRingHom + (NumberField.RingOfIntegers.mapRingHom σ.symm.toRingHom x) ∈ + v.asIdeal + have hx : + NumberField.RingOfIntegers.mapRingHom (σ * τ).symm.toRingHom x = + NumberField.RingOfIntegers.mapRingHom τ.symm.toRingHom + (NumberField.RingOfIntegers.mapRingHom σ.symm.toRingHom x) := by + apply NumberField.RingOfIntegers.ext + rfl + rw [hx] + +omit [NumberField K] [NumberField L] in +open scoped Classical in +@[simp] +theorem finitePlaceEquiv_inv_apply + (σ : L ≃ₐ[K] L) + (v : HeightOneSpectrum (𝓞 L)) : + finitePlaceEquiv K L σ + (finitePlaceEquiv K L σ⁻¹ v) = v := by + rw [← finitePlaceEquiv_mul] + simp + +open scoped Classical in +/-- The actual Galois action on finite places of `L`. -/ +@[reducible] +noncomputable def finitePlaceMulAction : + MulAction (L ≃ₐ[K] L) + (HeightOneSpectrum (𝓞 L)) where + smul σ v := finitePlaceEquiv K L σ v + one_smul := finitePlaceEquiv_one K L + mul_smul := finitePlaceEquiv_mul K L + +omit [NumberField K] in +open scoped Classical in +/-- The integral adic valuation is invariant under simultaneous transport +of the finite place and the integer. -/ +theorem intValuation_finitePlaceEquiv + (σ : L ≃ₐ[K] L) + (v : HeightOneSpectrum (𝓞 L)) + (r : 𝓞 L) : + (finitePlaceEquiv K L σ v).intValuation + (NumberField.RingOfIntegers.mapAlgEquiv σ r) = + v.intValuation r := by + let e := (NumberField.RingOfIntegers.mapAlgEquiv σ).toRingEquiv + by_cases hr : r = 0 + · subst r + simp + change + (finitePlaceEquiv K L σ v).intValuation (e r) = + v.intValuation r + have her : e r ≠ 0 := by + simpa using e.injective.ne hr + rw [HeightOneSpectrum.intValuation_eq_exp_neg_multiplicity + (finitePlaceEquiv K L σ v) her, + HeightOneSpectrum.intValuation_eq_exp_neg_multiplicity v hr] + congr 2 + have hspan : + Ideal.span ({e r} : Set (𝓞 L)) = + idealMapMulEquiv e (Ideal.span ({r} : Set (𝓞 L))) := by + simp [idealMapMulEquiv, Ideal.map_span] + rw [finitePlaceEquiv_asIdeal, hspan] + norm_cast + exact multiplicity_map_eq (idealMapMulEquiv e) + (a := v.asIdeal) (b := Ideal.span ({r} : Set (𝓞 L))) + +omit [NumberField K] in +open scoped Classical in +/-- The field-valued adic valuation is invariant under simultaneous +transport of the finite place and the field element. -/ +theorem valuation_finitePlaceEquiv + (σ : L ≃ₐ[K] L) + (v : HeightOneSpectrum (𝓞 L)) + (x : L) : + (finitePlaceEquiv K L σ v).valuation L (σ x) = + v.valuation L x := by + obtain ⟨r, d, hrd⟩ := + IsLocalization.exists_mk'_eq (𝓞 L)⁰ x + rw [← hrd, IsFractionRing.mk'_eq_div, map_div₀, + map_div₀, map_div₀] + have hσr : + σ ((algebraMap (𝓞 L) L) r) = + (algebraMap (𝓞 L) L) + (NumberField.RingOfIntegers.mapAlgEquiv σ r) := + rfl + have hσd : + σ ((algebraMap (𝓞 L) L) (d : 𝓞 L)) = + (algebraMap (𝓞 L) L) + (NumberField.RingOfIntegers.mapAlgEquiv σ (d : 𝓞 L)) := + rfl + rw [hσr, hσd] + simp only [HeightOneSpectrum.valuation_of_algebraMap] + rw [intValuation_finitePlaceEquiv, intValuation_finitePlaceEquiv] + +open scoped Classical in +/-- Absolute ideal norms are invariant under a ring automorphism. -/ +theorem absNorm_map_ringEquiv + {R : Type*} [CommRing R] [IsDedekindDomain R] + [Infinite R] + (e : R ≃+* R) (I : Ideal R) : + Ideal.absNorm (I.map e) = Ideal.absNorm I := by + rw [Ideal.absNorm_apply, Ideal.absNorm_apply, + Submodule.cardQuot_apply, Submodule.cardQuot_apply] + exact Nat.card_congr + (Ideal.quotientEquiv I (I.map e) e rfl).toEquiv.symm + +open scoped Classical in +private theorem toNNReal_apply_congr + {e f : NNReal} (he : e ≠ 0) (hf : f ≠ 0) + (hef : e = f) (q : WithZero (Multiplicative ℤ)) : + ((WithZeroMulInt.toNNReal he q : NNReal) : ℝ) = + ((WithZeroMulInt.toNNReal hf q : NNReal) : ℝ) := by + subst f + rfl + +omit [NumberField K] in +open scoped Classical in +/-- The normalized finite absolute value is invariant under simultaneous +transport of its finite place and its field element. -/ +theorem adicAbv_finitePlaceEquiv + (σ : L ≃ₐ[K] L) + (v : HeightOneSpectrum (𝓞 L)) + (x : L) : + NumberField.HeightOneSpectrum.adicAbv L + (finitePlaceEquiv K L σ v) (σ x) = + NumberField.HeightOneSpectrum.adicAbv L v x := by + rw [NumberField.HeightOneSpectrum.adicAbv_def, + NumberField.HeightOneSpectrum.adicAbv_def, + valuation_finitePlaceEquiv] + have hnorm : + Ideal.absNorm (finitePlaceEquiv K L σ v).asIdeal = + Ideal.absNorm v.asIdeal := by + rw [finitePlaceEquiv_asIdeal, absNorm_map_ringEquiv] + have hnorm_nnreal : + (Ideal.absNorm + (finitePlaceEquiv K L σ v).asIdeal : NNReal) = + (Ideal.absNorm v.asIdeal : NNReal) := by + exact_mod_cast hnorm + exact toNNReal_apply_congr + (NumberField.HeightOneSpectrum.absNorm_ne_zero + (finitePlaceEquiv K L σ v)) + (NumberField.HeightOneSpectrum.absNorm_ne_zero v) + hnorm_nnreal (v.valuation L x) + +omit [NumberField K] [NumberField L] in +open scoped Classical in +/-- Archimedean multiplicities are constant on Galois orbits. -/ +@[simp] +theorem infinitePlace_mult_smul + (σ : L ≃ₐ[K] L) + (w : NumberField.InfinitePlace L) : + (σ • w).mult = w.mult := by + unfold NumberField.InfinitePlace.mult + rw [NumberField.InfinitePlace.isReal_smul_iff] + +open scoped Classical in +/-- The usual action of the relative Galois group on field units. -/ +@[reducible] +noncomputable def fieldUnitsMulDistribMulAction : + MulDistribMulAction (L ≃ₐ[K] L) Lˣ where + smul σ x := Units.mapEquiv σ.toMulEquiv x + one_smul x := by + ext + rfl + mul_smul σ τ x := by + ext + rfl + smul_one σ := map_one (Units.mapEquiv σ.toMulEquiv) + smul_mul σ x y := map_mul (Units.mapEquiv σ.toMulEquiv) x y + +section FinitePlaceAction + +open scoped Classical in +/-- Galois automorphisms permute the finite places of the extension field. -/ +local instance sUnitPlaceGaloisMulAction : + MulAction (L ≃ₐ[K] L) + (HeightOneSpectrum (𝓞 L)) := + finitePlaceMulAction K L + +attribute [local instance] sUnitPlaceGaloisMulAction + +open scoped Classical in +/-- Galois automorphisms act multiplicatively on units of the extension field. -/ +local instance sUnitGaloisMulDistribMulAction : + MulDistribMulAction (L ≃ₐ[K] L) Lˣ := + fieldUnitsMulDistribMulAction K L + +attribute [local instance] sUnitGaloisMulDistribMulAction + +omit [NumberField K] [NumberField L] in +open scoped Classical in +@[simp] +theorem finitePlace_smul_def + (σ : L ≃ₐ[K] L) + (v : HeightOneSpectrum (𝓞 L)) : + σ • v = finitePlaceEquiv K L σ v := + rfl + +open scoped Classical in +/-- A finite set of finite places is Galois-stable when it is invariant +under the concrete place permutation. -/ +def IsGaloisStableFinitePlaces + (S : Finset (HeightOneSpectrum (𝓞 L))) : Prop := + ∀ (σ : L ≃ₐ[K] L) + (v : HeightOneSpectrum (𝓞 L)), + v ∈ S ↔ σ • v ∈ S + +omit [NumberField K] [NumberField L] in +open scoped Classical in +theorem IsGaloisStableFinitePlaces.smul_mem + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) + (σ : L ≃ₐ[K] L) {v : HeightOneSpectrum (𝓞 L)} + (hv : v ∈ S) : + σ • v ∈ S := + (hS σ v).mp hv + +omit [NumberField K] [NumberField L] in +open scoped Classical in +theorem IsGaloisStableFinitePlaces.smul_not_mem + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) + (σ : L ≃ₐ[K] L) {v : HeightOneSpectrum (𝓞 L)} + (hv : v ∉ S) : + σ • v ∉ S := by + intro hmem + exact hv ((hS σ v).mpr hmem) + +omit [NumberField K] in +open scoped Classical in +/-- Galois automorphisms preserve the concrete `S`-unit subgroup when +the finite-place set is stable. -/ +theorem sUnit_smul_mem + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) + (σ : L ≃ₐ[K] L) (x : Lˣ) + (hx : x ∈ SUnitGroup (K := L) S) : + σ • x ∈ SUnitGroup (K := L) S := by + intro v hv + let w : HeightOneSpectrum (𝓞 L) := σ⁻¹ • v + have hw : w ∉ S := by + intro hwmem + exact hv ((hS σ⁻¹ v).mpr hwmem) + have hxw : w.valuation L (x : L) = 1 := + hx w hw + have htransport := + valuation_finitePlaceEquiv K L σ w (x : L) + have hvw : finitePlaceEquiv K L σ w = v := by + change + finitePlaceEquiv K L σ + (finitePlaceEquiv K L σ⁻¹ v) = v + rw [← finitePlaceEquiv_mul] + simp + rw [hvw] at htransport + change v.valuation L (σ (x : L)) = 1 + exact htransport.trans hxw + +open scoped Classical in +/-- The actual Galois action on the `S`-unit group. -/ +@[reducible] +noncomputable def sUnitMulDistribMulAction + (S : Finset (HeightOneSpectrum (𝓞 L))) + (hS : IsGaloisStableFinitePlaces K L S) : + MulDistribMulAction (L ≃ₐ[K] L) + (SUnitGroup (K := L) S) := + stableSubgroupMulDistribMulAction + (SUnitGroup (K := L) S) + (sUnit_smul_mem K L hS) + +omit [NumberField K] in +open scoped Classical in +theorem sUnit_smul_coe + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) + (σ : L ≃ₐ[K] L) + (x : SUnitGroup (K := L) S) : + letI := sUnitMulDistribMulAction K L S hS + ((σ • x : SUnitGroup (K := L) S) : Lˣ) = + Units.mapEquiv σ.toMulEquiv (x : Lˣ) := + rfl + +open scoped Classical in +/-- The action on the finite set `S` obtained by restricting the +finite-place permutation. -/ +@[reducible] +noncomputable def stableFinitePlaceMulAction + (S : Finset (HeightOneSpectrum (𝓞 L))) + (hS : IsGaloisStableFinitePlaces K L S) : + MulAction (L ≃ₐ[K] L) S where + smul σ v := + ⟨σ • (v : HeightOneSpectrum (𝓞 L)), + IsGaloisStableFinitePlaces.smul_mem K L hS σ + v.property⟩ + one_smul v := by + apply Subtype.ext + exact one_smul _ (v : HeightOneSpectrum (𝓞 L)) + mul_smul σ τ v := by + apply Subtype.ext + exact mul_smul σ τ (v : HeightOneSpectrum (𝓞 L)) + +open scoped Classical in +/-- The permutation action on all logarithmic places +`InfinitePlace L ⊕ S`. -/ +@[reducible] +noncomputable def logPlaceMulAction + (S : Finset (HeightOneSpectrum (𝓞 L))) + (hS : IsGaloisStableFinitePlaces K L S) : + MulAction (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S) := by + letI : MulAction (L ≃ₐ[K] L) S := + stableFinitePlaceMulAction K L S hS + exact + { smul := fun σ p => + match p with + | Sum.inl w => Sum.inl (σ • w) + | Sum.inr v => Sum.inr (σ • v) + one_smul := by + intro p + cases p with + | inl w => + change Sum.inl ((1 : L ≃ₐ[K] L) • w) = + Sum.inl w + rw [one_smul] + | inr v => + change Sum.inr ((1 : L ≃ₐ[K] L) • v) = + Sum.inr v + rw [one_smul] + mul_smul := by + intro σ τ p + cases p with + | inl w => + change Sum.inl ((σ * τ) • w) = + Sum.inl (σ • (τ • w)) + rw [mul_smul] + | inr v => + change Sum.inr ((σ * τ) • v) = + Sum.inr (σ • (τ • v)) + rw [mul_smul] } + +open scoped Classical in +/-- The additive action on the additive form of the `S`-unit group. -/ +@[reducible] +noncomputable def additiveSUnitDistribMulAction + (S : Finset (HeightOneSpectrum (𝓞 L))) + (hS : IsGaloisStableFinitePlaces K L S) : + DistribMulAction (L ≃ₐ[K] L) + (Additive (SUnitGroup (K := L) S)) := by + letI := sUnitMulDistribMulAction K L S hS + exact + { smul := fun σ x => + Additive.ofMul + (σ • (Additive.toMul x : + SUnitGroup (K := L) S)) + one_smul := by + intro x + apply Additive.toMul.injective + exact one_smul (L ≃ₐ[K] L) (Additive.toMul x : + SUnitGroup (K := L) S) + mul_smul := by + intro σ τ x + apply Additive.toMul.injective + exact mul_smul σ τ (Additive.toMul x : + SUnitGroup (K := L) S) + smul_zero := by + intro σ + apply Additive.toMul.injective + change σ • (1 : SUnitGroup (K := L) S) = 1 + exact MulDistribMulAction.smul_one σ + smul_add := by + intro σ x y + apply Additive.toMul.injective + exact MulDistribMulAction.smul_mul σ + (Additive.toMul x : SUnitGroup (K := L) S) + (Additive.toMul y : SUnitGroup (K := L) S) } + +open scoped Classical in +/-- The contragredient coordinate-permutation action on the full +logarithmic coordinate space. -/ +@[reducible] +noncomputable def fullLogSpaceDistribMulAction + (S : Finset (HeightOneSpectrum (𝓞 L))) + (hS : IsGaloisStableFinitePlaces K L S) : + DistribMulAction (L ≃ₐ[K] L) + (SUnitGroup.FullLogSpace (K := L) S) := by + letI := logPlaceMulAction K L S hS + exact + { smul := fun σ z p => z (σ⁻¹ • p) + one_smul := by + intro z + funext p + change z ((1 : L ≃ₐ[K] L)⁻¹ • p) = z p + rw [inv_one, one_smul] + mul_smul := by + intro σ τ z + funext p + change z ((σ * τ)⁻¹ • p) = + z (τ⁻¹ • (σ⁻¹ • p)) + rw [mul_inv_rev, mul_smul] + smul_zero := by + intro σ + rfl + smul_add := by + intro σ z z' + rfl } + +omit [NumberField K] [NumberField L] in +open scoped Classical in +@[simp] +theorem fullLogSpace_smul_apply + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) + (σ : L ≃ₐ[K] L) + (z : SUnitGroup.FullLogSpace (K := L) S) + (p : SUnitGroup.LogPlace (K := L) S) : + letI := logPlaceMulAction K L S hS + letI := fullLogSpaceDistribMulAction K L S hS + (σ • z) p = z (σ⁻¹ • p) := + rfl + +open scoped Classical in +/-- The permutation representation on the set of logarithmic places. -/ +noncomputable def logPlacePermutationHom + (S : Finset (HeightOneSpectrum (𝓞 L))) + (hS : IsGaloisStableFinitePlaces K L S) : + (L ≃ₐ[K] L) →* + Equiv.Perm (SUnitGroup.LogPlace (K := L) S) := by + letI := logPlaceMulAction K L S hS + exact MulAction.toPermHom + (L ≃ₐ[K] L) (SUnitGroup.LogPlace (K := L) S) + +omit [NumberField K] [NumberField L] in +open scoped Classical in +@[simp] +theorem logPlacePermutationHom_apply + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) + (σ : L ≃ₐ[K] L) + (p : SUnitGroup.LogPlace (K := L) S) : + letI := logPlaceMulAction K L S hS + logPlacePermutationHom K L S hS σ p = σ • p := + rfl + +omit [NumberField K] [NumberField L] in +open scoped Classical in +/-- The concrete contragredient action is the coordinate permutation +representation associated to the action on logarithmic places. -/ +theorem permutationRepresentation_logPlace + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) + (σ : L ≃ₐ[K] L) + (z : SUnitGroup.FullLogSpace (K := L) S) : + letI := logPlaceMulAction K L S hS + letI := fullLogSpaceDistribMulAction K L S hS + permutationRepresentation + (logPlacePermutationHom K L S hS) σ z = + σ • z := by + let := logPlaceMulAction K L S hS + let := fullLogSpaceDistribMulAction K L S hS + ext p + rfl + +omit [NumberField K] in +open scoped Classical in +/-- Coordinate sum is invariant under the place permutation. -/ +theorem coordinateSum_smul + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) + (σ : L ≃ₐ[K] L) + (z : SUnitGroup.FullLogSpace (K := L) S) : + letI := logPlaceMulAction K L S hS + letI := fullLogSpaceDistribMulAction K L S hS + SUnitGroup.coordinateSum (K := L) S (σ • z) = + SUnitGroup.coordinateSum (K := L) S z := by + let := logPlaceMulAction K L S hS + let := fullLogSpaceDistribMulAction K L S hS + change + (∑ p : SUnitGroup.LogPlace (K := L) S, + z (σ⁻¹ • p)) = ∑ p, z p + exact + Fintype.sum_equiv (MulAction.toPerm σ⁻¹) + (fun p : SUnitGroup.LogPlace (K := L) S => + z (σ⁻¹ • p)) + z (fun _ => rfl) + +open scoped Classical in +/-- The constant vector whose coordinate sum is one. -/ +noncomputable def normalizedLogDiagonal + (S : Finset (HeightOneSpectrum (𝓞 L))) : + SUnitGroup.FullLogSpace (K := L) S := + fun _ => + (Fintype.card + (SUnitGroup.LogPlace (K := L) S) : ℝ)⁻¹ + +open scoped Classical in +@[simp] +theorem coordinateSum_normalizedLogDiagonal + (S : Finset (HeightOneSpectrum (𝓞 L))) : + SUnitGroup.coordinateSum (K := L) S + (normalizedLogDiagonal L S) = 1 := by + change + (∑ _ : SUnitGroup.LogPlace (K := L) S, + (Fintype.card + (SUnitGroup.LogPlace (K := L) S) : ℝ)⁻¹) = 1 + rw [Finset.sum_const, Finset.card_univ, nsmul_eq_mul] + exact mul_inv_cancel₀ + (by exact_mod_cast + (Fintype.card_ne_zero : + Fintype.card (SUnitGroup.LogPlace (K := L) S) ≠ 0)) + +open scoped Classical in +/-- Splitting of the full coordinate space into the sum-zero +hyperplane and its coordinate sum. -/ +noncomputable def fullLogSpaceSplit + (S : Finset (HeightOneSpectrum (𝓞 L))) : + SUnitGroup.FullLogSpace (K := L) S →ₗ[ℝ] + (SUnitGroup.LogHyperplane (K := L) S × ℝ) where + toFun z := + (⟨z - + SUnitGroup.coordinateSum (K := L) S z • + normalizedLogDiagonal L S, by + apply LinearMap.mem_ker.mpr + rw [map_sub, map_smul, + coordinateSum_normalizedLogDiagonal] + simp⟩, + SUnitGroup.coordinateSum (K := L) S z) + map_add' z z' := by + apply Prod.ext + · ext p + simp only [Pi.add_apply, Pi.sub_apply, Pi.smul_apply, map_add, + Prod.fst_add, Submodule.coe_add] + module + · exact map_add + (SUnitGroup.coordinateSum (K := L) S) z z' + map_smul' c z := by + apply Prod.ext + · ext p + simp only [Pi.smul_apply, Pi.sub_apply, map_smul, + Prod.smul_fst, RingHom.id_apply, Submodule.coe_smul] + module + · exact map_smul + (SUnitGroup.coordinateSum (K := L) S) c z + +open scoped Classical in +theorem fullLogSpaceSplit_injective + (S : Finset (HeightOneSpectrum (𝓞 L))) : + Function.Injective (fullLogSpaceSplit L S) := by + intro z z' h + have hfirst : + z - + SUnitGroup.coordinateSum (K := L) S z • + normalizedLogDiagonal L S = + z' - + SUnitGroup.coordinateSum (K := L) S z' • + normalizedLogDiagonal L S := + congrArg + (fun q => + ((q.1 : + SUnitGroup.LogHyperplane (K := L) S) : + SUnitGroup.FullLogSpace (K := L) S)) h + have hsecond : + SUnitGroup.coordinateSum (K := L) S z = + SUnitGroup.coordinateSum (K := L) S z' := + congrArg Prod.snd h + calc + z = + (z - + SUnitGroup.coordinateSum (K := L) S z • + normalizedLogDiagonal L S) + + SUnitGroup.coordinateSum (K := L) S z • + normalizedLogDiagonal L S := by + symm + exact sub_add_cancel _ _ + _ = + (z' - + SUnitGroup.coordinateSum (K := L) S z' • + normalizedLogDiagonal L S) + + SUnitGroup.coordinateSum (K := L) S z' • + normalizedLogDiagonal L S := by + rw [hfirst, hsecond] + _ = z' := sub_add_cancel _ _ + +open scoped Classical in +theorem fullLogSpaceSplit_surjective + (S : Finset (HeightOneSpectrum (𝓞 L))) : + Function.Surjective (fullLogSpaceSplit L S) := by + intro q + let z : SUnitGroup.FullLogSpace (K := L) S := + (q.1 : SUnitGroup.FullLogSpace (K := L) S) + + q.2 • normalizedLogDiagonal L S + refine ⟨z, ?_⟩ + apply Prod.ext + · apply Subtype.ext + change + z - + SUnitGroup.coordinateSum (K := L) S z • + normalizedLogDiagonal L S = + (q.1 : SUnitGroup.FullLogSpace (K := L) S) + have hq : + SUnitGroup.coordinateSum (K := L) S + (q.1 : SUnitGroup.FullLogSpace (K := L) S) = 0 := + LinearMap.mem_ker.mp q.1.property + simp [z, hq, coordinateSum_normalizedLogDiagonal] + · change + SUnitGroup.coordinateSum (K := L) S z = q.2 + have hq : + SUnitGroup.coordinateSum (K := L) S + (q.1 : SUnitGroup.FullLogSpace (K := L) S) = 0 := + LinearMap.mem_ker.mp q.1.property + simp [z, hq, coordinateSum_normalizedLogDiagonal] + +open scoped Classical in +/-- Linear coordinate splitting used to adjoin one invariant diagonal +direction to the logarithmic lattice. -/ +noncomputable def fullLogSpaceEquivHyperplaneProd + (S : Finset (HeightOneSpectrum (𝓞 L))) : + SUnitGroup.FullLogSpace (K := L) S ≃ₗ[ℝ] + (SUnitGroup.LogHyperplane (K := L) S × ℝ) := + LinearEquiv.ofBijective + (fullLogSpaceSplit L S) + ⟨fullLogSpaceSplit_injective L S, + fullLogSpaceSplit_surjective L S⟩ + +open scoped Classical in +/-- The coordinate splitting as a continuous linear equivalence. -/ +noncomputable def fullLogSpaceContinuousEquivHyperplaneProd + (S : Finset (HeightOneSpectrum (𝓞 L))) : + SUnitGroup.FullLogSpace (K := L) S ≃L[ℝ] + (SUnitGroup.LogHyperplane (K := L) S × ℝ) := + (fullLogSpaceEquivHyperplaneProd L S).toContinuousLinearEquiv + +open scoped Classical in +/-- A real basis of the logarithmic hyperplane obtained from an +integral basis of the complete logarithmic lattice. -/ +noncomputable def fullLogLatticeRealBasis + (S : Finset (HeightOneSpectrum (𝓞 L))) : + Basis + (Module.Free.ChooseBasisIndex ℤ + (SUnitGroup.fullLogLattice (K := L) S)) + ℝ (SUnitGroup.LogHyperplane (K := L) S) := + (Module.Free.chooseBasis ℤ + (SUnitGroup.fullLogLattice (K := L) S)).ofZLatticeBasis + ℝ (SUnitGroup.fullLogLattice (K := L) S) + +open scoped Classical in +/-- A basis of the product of the logarithmic hyperplane with the +one-dimensional diagonal direction. -/ +noncomputable def fullLogHyperplaneDiagonalBasis + (S : Finset (HeightOneSpectrum (𝓞 L))) : + Basis + (Module.Free.ChooseBasisIndex ℤ + (SUnitGroup.fullLogLattice (K := L) S) ⊕ Unit) + ℝ (SUnitGroup.LogHyperplane (K := L) S × ℝ) := + (fullLogLatticeRealBasis L S).prod (Basis.singleton Unit ℝ) + +open scoped Classical in +/-- The product lattice formed from the logarithmic lattice and one +integral diagonal direction. -/ +noncomputable def fullLogHyperplaneDiagonalLattice + (S : Finset (HeightOneSpectrum (𝓞 L))) : + Submodule ℤ + (SUnitGroup.LogHyperplane (K := L) S × ℝ) := + Submodule.span ℤ + (Set.range (fullLogHyperplaneDiagonalBasis L S)) + +open scoped Classical in +/-- The complete lattice in the full logarithmic coordinate space +obtained by adjoining an integral invariant diagonal direction. -/ +noncomputable def extendedFullLogLattice + (S : Finset (HeightOneSpectrum (𝓞 L))) : + Submodule ℤ (SUnitGroup.FullLogSpace (K := L) S) := + ZLattice.comap ℝ + (fullLogHyperplaneDiagonalLattice L S) + (fullLogSpaceContinuousEquivHyperplaneProd L S).toLinearMap + +open scoped Classical in +instance instDiscreteTopology_extendedFullLogLattice + (S : Finset (HeightOneSpectrum (𝓞 L))) : + DiscreteTopology (extendedFullLogLattice L S) := by + let : Module.Finite ℤ + (SUnitGroup.fullLogLattice (K := L) S) := + ZLattice.module_finite ℝ + (SUnitGroup.fullLogLattice (K := L) S) + let : Module.Free ℤ + (SUnitGroup.fullLogLattice (K := L) S) := + ZLattice.module_free ℝ + (SUnitGroup.fullLogLattice (K := L) S) + let : + DiscreteTopology + (fullLogHyperplaneDiagonalLattice L S) := by + unfold fullLogHyperplaneDiagonalLattice + infer_instance + let e := fullLogSpaceContinuousEquivHyperplaneProd L S + change + DiscreteTopology + (ZLattice.comap ℝ + (fullLogHyperplaneDiagonalLattice L S) + e.toLinearMap) + exact + ZLattice.comap_discreteTopology ℝ + (fullLogHyperplaneDiagonalLattice L S) + e.continuous e.injective + +open scoped Classical in +instance instIsZLattice_extendedFullLogLattice + (S : Finset (HeightOneSpectrum (𝓞 L))) : + IsZLattice ℝ (extendedFullLogLattice L S) := by + let : Module.Finite ℤ + (SUnitGroup.fullLogLattice (K := L) S) := + ZLattice.module_finite ℝ + (SUnitGroup.fullLogLattice (K := L) S) + let : Module.Free ℤ + (SUnitGroup.fullLogLattice (K := L) S) := + ZLattice.module_free ℝ + (SUnitGroup.fullLogLattice (K := L) S) + let : + DiscreteTopology + (fullLogHyperplaneDiagonalLattice L S) := by + unfold fullLogHyperplaneDiagonalLattice + infer_instance + let : + IsZLattice ℝ + (fullLogHyperplaneDiagonalLattice L S) := by + unfold fullLogHyperplaneDiagonalLattice + infer_instance + let e := fullLogSpaceContinuousEquivHyperplaneProd L S + change + IsZLattice ℝ + (ZLattice.comap ℝ + (fullLogHyperplaneDiagonalLattice L S) + e.toLinearMap) + exact inferInstance + +omit [NumberField K] in +open scoped Classical in +/-- The normalized all-place logarithm is equivariant for the actual +`S`-unit and place-permutation actions. -/ +theorem fullLogAmbient_smul + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) + (σ : L ≃ₐ[K] L) + (x : Additive (SUnitGroup (K := L) S)) : + letI := sUnitMulDistribMulAction K L S hS + letI := additiveSUnitDistribMulAction K L S hS + letI := logPlaceMulAction K L S hS + letI := fullLogSpaceDistribMulAction K L S hS + SUnitGroup.fullLogAmbient (K := L) S (σ • x) = + σ • SUnitGroup.fullLogAmbient (K := L) S x := by + let := sUnitMulDistribMulAction K L S hS + let := additiveSUnitDistribMulAction K L S hS + let := logPlaceMulAction K L S hS + let := fullLogSpaceDistribMulAction K L S hS + let y : L := + (((Additive.toMul x : + SUnitGroup (K := L) S) : Lˣ) : L) + funext p + cases p with + | inl w => + change + w.mult * + Real.log (w (σ y)) = + (σ⁻¹ • w).mult * + Real.log ((σ⁻¹ • w) y) + rw [infinitePlace_mult_smul] + rfl + | inr v => + change + Real.log + (NumberField.HeightOneSpectrum.adicAbv L + (v : HeightOneSpectrum (𝓞 L)) + (σ y)) = + Real.log + (NumberField.HeightOneSpectrum.adicAbv L + (finitePlaceEquiv K L σ⁻¹ + (v : HeightOneSpectrum (𝓞 L))) + y) + congr 1 + have h := + adicAbv_finitePlaceEquiv K L σ + (finitePlaceEquiv K L σ⁻¹ + (v : HeightOneSpectrum (𝓞 L))) + y + simpa using h + +open scoped Classical in +/-- The coordinate-permutation action restricted to the +coordinate-sum-zero hyperplane. -/ +@[reducible] +noncomputable def logHyperplaneDistribMulAction + (S : Finset (HeightOneSpectrum (𝓞 L))) + (hS : IsGaloisStableFinitePlaces K L S) : + DistribMulAction (L ≃ₐ[K] L) + (SUnitGroup.LogHyperplane (K := L) S) := by + letI := logPlaceMulAction K L S hS + letI := fullLogSpaceDistribMulAction K L S hS + exact + { smul := fun σ z => + ⟨σ • (z : + SUnitGroup.FullLogSpace (K := L) S), by + apply LinearMap.mem_ker.mpr + rw [coordinateSum_smul K L hS] + exact LinearMap.mem_ker.mp z.property⟩ + one_smul := by + intro z + apply Subtype.ext + exact one_smul (L ≃ₐ[K] L) + (z : SUnitGroup.FullLogSpace (K := L) S) + mul_smul := by + intro σ τ z + apply Subtype.ext + exact mul_smul σ τ + (z : SUnitGroup.FullLogSpace (K := L) S) + smul_zero := by + intro σ + apply Subtype.ext + exact DistribMulAction.smul_zero σ + smul_add := by + intro σ z z' + apply Subtype.ext + exact DistribMulAction.smul_add σ + (z : SUnitGroup.FullLogSpace (K := L) S) + (z' : SUnitGroup.FullLogSpace (K := L) S) } + +omit [NumberField K] in +open scoped Classical in +/-- Equivariance of the logarithmic map after restricting its codomain +to the coordinate-sum-zero hyperplane. -/ +theorem fullLog_smul + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) + (σ : L ≃ₐ[K] L) + (x : Additive (SUnitGroup (K := L) S)) : + letI := sUnitMulDistribMulAction K L S hS + letI := additiveSUnitDistribMulAction K L S hS + letI := logPlaceMulAction K L S hS + letI := fullLogSpaceDistribMulAction K L S hS + letI := logHyperplaneDistribMulAction K L S hS + SUnitGroup.fullLog (K := L) S (σ • x) = + σ • SUnitGroup.fullLog (K := L) S x := by + let := sUnitMulDistribMulAction K L S hS + let := additiveSUnitDistribMulAction K L S hS + let := logPlaceMulAction K L S hS + let := fullLogSpaceDistribMulAction K L S hS + let := logHyperplaneDistribMulAction K L S hS + apply Subtype.ext + exact fullLogAmbient_smul K L hS σ x + +open scoped Classical in +/-- The kernel of `fullLog`, stated as an equality of additive +subgroups. -/ +theorem fullLog_ker_eq_torsion + (S : Finset (HeightOneSpectrum (𝓞 L))) : + (SUnitGroup.fullLog (K := L) S).ker = + AddCommGroup.torsion + (Additive (SUnitGroup (K := L) S)) := by + ext x + change + SUnitGroup.fullLog (K := L) S x = 0 ↔ + x ∈ AddCommGroup.torsion + (Additive (SUnitGroup (K := L) S)) + exact SUnitGroup.fullLog_eq_zero_iff (K := L) S x + +open scoped Classical in +/-- The first-isomorphism identification of `S`-units modulo torsion +with the actual logarithmic lattice. -/ +noncomputable def + additiveSUnitQuotientTorsionEquivFullLogLattice + (S : Finset (HeightOneSpectrum (𝓞 L))) : + (Additive (SUnitGroup (K := L) S) ⧸ + AddCommGroup.torsion + (Additive (SUnitGroup (K := L) S))) ≃+ + SUnitGroup.fullLogLattice (K := L) S := by + let f := + SUnitGroup.fullLog (K := L) S + have hker : + f.ker = + AddCommGroup.torsion + (Additive (SUnitGroup (K := L) S)) := + fullLog_ker_eq_torsion L S + have hrange : + f.range = + (SUnitGroup.fullLogLattice + (K := L) S).toAddSubgroup := by + rw [SUnitGroup.fullLogLattice_eq_range] + ext z + constructor + · rintro ⟨x, rfl⟩ + exact ⟨x, rfl⟩ + · rintro ⟨x, rfl⟩ + exact ⟨x, rfl⟩ + exact + (QuotientAddGroup.quotientAddEquivOfEq hker.symm).trans + ((QuotientAddGroup.quotientKerEquivRange f).trans + (AddEquiv.addSubgroupCongr hrange)) + +omit [NumberField K] in +open scoped Classical in +/-- The complete logarithmic lattice is stable under the concrete +Galois action. -/ +theorem fullLogLattice_smul_mem + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) + (σ : L ≃ₐ[K] L) + (z : SUnitGroup.LogHyperplane (K := L) S) + (hz : z ∈ SUnitGroup.fullLogLattice (K := L) S) : + letI := sUnitMulDistribMulAction K L S hS + letI := additiveSUnitDistribMulAction K L S hS + letI := logPlaceMulAction K L S hS + letI := fullLogSpaceDistribMulAction K L S hS + letI := logHyperplaneDistribMulAction K L S hS + σ • z ∈ SUnitGroup.fullLogLattice (K := L) S := by + let := sUnitMulDistribMulAction K L S hS + let := additiveSUnitDistribMulAction K L S hS + let := logPlaceMulAction K L S hS + let := fullLogSpaceDistribMulAction K L S hS + let := logHyperplaneDistribMulAction K L S hS + rw [SUnitGroup.fullLogLattice_eq_range] at hz ⊢ + obtain ⟨x, hx⟩ := hz + change SUnitGroup.fullLog (K := L) S x = z at hx + refine ⟨σ • x, ?_⟩ + change + SUnitGroup.fullLog (K := L) S (σ • x) = σ • z + rw [fullLog_smul K L hS, hx] + +omit [NumberField K] in +open scoped Classical in +/-- Under the coordinate splitting, the hyperplane component transforms +by the restricted Galois action. -/ +theorem fullLogSpaceSplit_fst_smul + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) + (σ : L ≃ₐ[K] L) + (z : SUnitGroup.FullLogSpace (K := L) S) : + letI := logPlaceMulAction K L S hS + letI := fullLogSpaceDistribMulAction K L S hS + letI := logHyperplaneDistribMulAction K L S hS + (fullLogSpaceSplit L S (σ • z)).1 = + σ • (fullLogSpaceSplit L S z).1 := by + let := logPlaceMulAction K L S hS + let := fullLogSpaceDistribMulAction K L S hS + let := logHyperplaneDistribMulAction K L S hS + apply Subtype.ext + change + σ • z - + SUnitGroup.coordinateSum (K := L) S (σ • z) • + normalizedLogDiagonal L S = + σ • + (z - + SUnitGroup.coordinateSum (K := L) S z • + normalizedLogDiagonal L S) + rw [coordinateSum_smul K L hS] + ext p + rfl + +omit [NumberField K] in +open scoped Classical in +/-- Under the coordinate splitting, the diagonal coordinate is +Galois-invariant. -/ +theorem fullLogSpaceSplit_snd_smul + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) + (σ : L ≃ₐ[K] L) + (z : SUnitGroup.FullLogSpace (K := L) S) : + letI := logPlaceMulAction K L S hS + letI := fullLogSpaceDistribMulAction K L S hS + (fullLogSpaceSplit L S (σ • z)).2 = + (fullLogSpaceSplit L S z).2 := by + let := logPlaceMulAction K L S hS + let := fullLogSpaceDistribMulAction K L S hS + exact coordinateSum_smul K L hS σ z + +omit [NumberField K] in +open scoped Classical in +/-- The full logarithmic lattice with its adjoined diagonal direction is +stable under the place-permutation representation. -/ +theorem extendedFullLogLattice_permutation_stable + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) : + ∀ (σ : L ≃ₐ[K] L) + (z : SUnitGroup.FullLogSpace (K := L) S), + z ∈ extendedFullLogLattice L S → + permutationRepresentation + (logPlacePermutationHom K L S hS) σ z ∈ + extendedFullLogLattice L S := by + let := sUnitMulDistribMulAction K L S hS + let := additiveSUnitDistribMulAction K L S hS + let := logPlaceMulAction K L S hS + let := fullLogSpaceDistribMulAction K L S hS + let := logHyperplaneDistribMulAction K L S hS + intro σ z hz + rw [permutationRepresentation_logPlace K L hS] + change + fullLogSpaceSplit L S z ∈ + fullLogHyperplaneDiagonalLattice L S at hz + change + fullLogSpaceSplit L S (σ • z) ∈ + fullLogHyperplaneDiagonalLattice L S + let b := + fullLogHyperplaneDiagonalBasis L S + have hzrepr : + ∀ i, b.repr (fullLogSpaceSplit L S z) i ∈ + Set.range (algebraMap ℤ ℝ) := by + apply (b.mem_span_iff_repr_mem ℤ _).mp + exact hz + apply (b.mem_span_iff_repr_mem ℤ _).mpr + intro i + cases i with + | inl j => + have hzfirst : + (fullLogSpaceSplit L S z).1 ∈ + SUnitGroup.fullLogLattice (K := L) S := by + rw [← + (Module.Free.chooseBasis ℤ + (SUnitGroup.fullLogLattice + (K := L) S)).ofZLatticeBasis_span ℝ] + apply + ((fullLogLatticeRealBasis L S).mem_span_iff_repr_mem + ℤ _).mpr + intro k + simpa only [b, fullLogHyperplaneDiagonalBasis, + Basis.prod_repr_inl] using hzrepr (Sum.inl k) + have hstable := + fullLogLattice_smul_mem K L hS σ + (fullLogSpaceSplit L S z).1 hzfirst + have hspanstable : + σ • (fullLogSpaceSplit L S z).1 ∈ + Submodule.span ℤ + (Set.range (fullLogLatticeRealBasis L S)) := by + simpa only [fullLogLatticeRealBasis, + (Module.Free.chooseBasis ℤ + (SUnitGroup.fullLogLattice + (K := L) S)).ofZLatticeBasis_span ℝ] using hstable + have hcoord := + ((fullLogLatticeRealBasis L S).mem_span_iff_repr_mem + ℤ _).mp hspanstable j + simpa only [b, fullLogHyperplaneDiagonalBasis, + Basis.prod_repr_inl, + fullLogSpaceSplit_fst_smul K L hS] using hcoord + | inr j => + simpa only [b, fullLogHyperplaneDiagonalBasis, + Basis.prod_repr_inr, + fullLogSpaceSplit_snd_smul K L hS] using + hzrepr (Sum.inr j) + +open scoped Classical in +/-- The canonical complete permutation sublattice of the extended +logarithmic lattice has finite index. -/ +theorem extendedFullLogPermutationSublattice_finite_quotient + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) : + Finite + (extendedFullLogLattice L S ⧸ + (permutationSublattice + (logPlacePermutationHom K L S hS) + (extendedFullLogLattice L S) + (extendedFullLogLattice_permutation_stable K L hS)).comap + (extendedFullLogLattice L S).subtype) := + permutationSublattice_finite_quotient + (logPlacePermutationHom K L S hS) + (extendedFullLogLattice L S) + (extendedFullLogLattice_permutation_stable K L hS) + +open scoped Classical in +/-- For the actual full logarithmic `S`-unit +lattice. The Herbrand quotient is the product of the orders of the +stabilizers of the Galois orbits of logarithmic places. -/ +theorem + extendedFullLogLattice_herbrandQuotient_eq_stabilizerProduct + (K L : Type) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + let ρ := + logPlacePermutationHom K L S hS + letI _indexAction : + MulAction (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S) := + permutationMulAction ρ + letI _ambientAction : + DistribMulAction (L ≃ₐ[K] L) + (extendedFullLogLattice L S) := + completePermutationLatticeDistribMulAction + ρ (extendedFullLogLattice L S) + (extendedFullLogLattice_permutation_stable + K L hS) + letI _ambientMultiplicativeAction : + MulDistribMulAction (L ≃ₐ[K] L) + (Multiplicative + (extendedFullLogLattice L S)) := + multiplicativeDistribMulAction + letI _orbitFintype : + Fintype + (MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S)) := + Fintype.ofFinite _ + letI _stabilizerFintype : + ∀ ω : + MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S), + Fintype (permutationOrbitStabilizer ω) := + fun _ => Fintype.ofFinite _ + ∃ _ : + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (Multiplicative + (extendedFullLogLattice L S)) σ, + @herbrandQuotient + (L ≃ₐ[K] L) + (Multiplicative + (extendedFullLogLattice L S)) + _ _ _ _ σ = + ∏ ω : + MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S), + (Fintype.card + (permutationOrbitStabilizer ω) : ℚ) := by + let ρ := + logPlacePermutationHom K L S hS + exact + completePermutationLattice_herbrandQuotient_eq_stabilizerProduct + (G := L ≃ₐ[K] L) + (ι := SUnitGroup.LogPlace (K := L) S) + ρ (extendedFullLogLattice L S) + (extendedFullLogLattice_permutation_stable + K L hS) σ hgen + +end FinitePlaceAction diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean new file mode 100644 index 0000000000..aabd0a164f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean @@ -0,0 +1,1822 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.GaloisAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace +public import Mathlib.RingTheory.Ideal.Quotient.HasFiniteQuotients.Basic +public import Mathlib.RingTheory.Ideal.Quotient.HasFiniteQuotients.Norm +/-! +# The Herbrand quotient of the global S-unit group + +This file computes the Herbrand quotient of the global `S`-unit group. It connects the actual +`S`-unit group to its logarithmic lattice, adds the invariant diagonal +integer direction, and combines the resulting exact sequences with the +permutation-lattice calculation. +-/ + +@[expose] public section + +open scoped BigOperators NumberField nonZeroDivisors Pointwise +open IsDedekindDomain Module + +noncomputable +section + +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology + +variable + (K L : Type*) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + +section LogarithmicQuotient + +open scoped Classical in +/-- The additive Galois action restricted to the actual full +logarithmic lattice. -/ +@[reducible] +noncomputable def fullLogLatticeDistribMulAction + (S : Finset (HeightOneSpectrum (𝓞 L))) + (hS : IsGaloisStableFinitePlaces K L S) : + DistribMulAction (L ≃ₐ[K] L) + (SUnitGroup.fullLogLattice (K := L) S) := by + letI := sUnitMulDistribMulAction K L S hS + letI := additiveSUnitDistribMulAction K L S hS + letI := logPlaceMulAction K L S hS + letI := fullLogSpaceDistribMulAction K L S hS + letI := logHyperplaneDistribMulAction K L S hS + exact + { smul := fun σ z => + ⟨σ • (z : + SUnitGroup.LogHyperplane (K := L) S), + fullLogLattice_smul_mem K L hS + σ z.1 z.2⟩ + one_smul := by + intro z + apply Subtype.ext + exact one_smul (L ≃ₐ[K] L) + (z : SUnitGroup.LogHyperplane (K := L) S) + mul_smul := by + intro σ τ z + apply Subtype.ext + exact mul_smul σ τ + (z : SUnitGroup.LogHyperplane (K := L) S) + smul_zero := by + intro σ + apply Subtype.ext + exact DistribMulAction.smul_zero σ + smul_add := by + intro σ z z' + apply Subtype.ext + exact DistribMulAction.smul_add σ + (z : SUnitGroup.LogHyperplane (K := L) S) + (z' : SUnitGroup.LogHyperplane (K := L) S) } + +open scoped Classical in +/-- The full logarithm as a surjective multiplicative homomorphism +from `S`-units onto the multiplicative logarithmic lattice. -/ +noncomputable def sUnitFullLogMulHom + (S : Finset (HeightOneSpectrum (𝓞 L))) : + SUnitGroup (K := L) S →* + Multiplicative + (SUnitGroup.fullLogLattice (K := L) S) where + toFun x := + Multiplicative.ofAdd + ⟨SUnitGroup.fullLog (K := L) S + (Additive.ofMul x), by + rw [SUnitGroup.fullLogLattice_eq_range] + exact ⟨Additive.ofMul x, rfl⟩⟩ + map_one' := by + apply Multiplicative.toAdd.injective + apply Subtype.ext + exact map_zero + (SUnitGroup.fullLog (K := L) S) + map_mul' x y := by + apply Multiplicative.toAdd.injective + apply Subtype.ext + exact map_add + (SUnitGroup.fullLog (K := L) S) + (Additive.ofMul x) (Additive.ofMul y) + +open scoped Classical in +/-- The multiplicative full logarithm is onto its defining lattice. -/ +theorem sUnitFullLogMulHom_surjective + (S : Finset (HeightOneSpectrum (𝓞 L))) : + Function.Surjective + (sUnitFullLogMulHom L S) := by + intro z + have hz : + (Multiplicative.toAdd z : + SUnitGroup.fullLogLattice (K := L) S).1 ∈ + LinearMap.range + (SUnitGroup.fullLog (K := L) S).toIntLinearMap := by + rw [← SUnitGroup.fullLogLattice_eq_range] + exact + (Multiplicative.toAdd z : + SUnitGroup.fullLogLattice (K := L) S).2 + obtain ⟨x, hx⟩ := hz + refine ⟨Additive.toMul x, ?_⟩ + apply Multiplicative.toAdd.injective + apply Subtype.ext + change + SUnitGroup.fullLog (K := L) S x = + (Multiplicative.toAdd z : + SUnitGroup.fullLogLattice (K := L) S).1 + exact hx + +open scoped Classical in +/-- The kernel of the multiplicative full logarithm is exactly the +torsion subgroup of the `S`-unit group. -/ +theorem sUnitFullLogMulHom_ker + (S : Finset (HeightOneSpectrum (𝓞 L))) : + (sUnitFullLogMulHom L S).ker = + CommGroup.torsion + (SUnitGroup (K := L) S) := by + ext x + rw [MonoidHom.mem_ker] + constructor + · intro hx + have hxlog : + SUnitGroup.fullLog (K := L) S + (Additive.ofMul x) = 0 := by + have hx' := + congrArg + (fun z : + Multiplicative + (SUnitGroup.fullLogLattice + (K := L) S) => + ((Multiplicative.toAdd z : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S)) + hx + exact hx' + have hxt := + (SUnitGroup.fullLog_eq_zero_iff + (K := L) S (Additive.ofMul x)).mp hxlog + change IsOfFinOrder x + exact isOfFinAddOrder_ofMul_iff.mp hxt + · intro hxt + apply Multiplicative.toAdd.injective + apply Subtype.ext + apply + (SUnitGroup.fullLog_eq_zero_iff + (K := L) S (Additive.ofMul x)).mpr + change IsOfFinAddOrder (Additive.ofMul x) + exact isOfFinAddOrder_ofMul_iff.mpr hxt + +omit [NumberField K] in +open scoped Classical in +/-- The multiplicative full logarithm is equivariant for the actual +Galois actions. -/ +theorem sUnitFullLogMulHom_equivariant + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) : + letI _sUnitAction := + sUnitMulDistribMulAction K L S hS + letI _latticeAction := + fullLogLatticeDistribMulAction K L S hS + letI _multiplicativeLatticeAction : + MulDistribMulAction (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S)) := + multiplicativeDistribMulAction + ∀ (σ : L ≃ₐ[K] L) + (x : SUnitGroup (K := L) S), + sUnitFullLogMulHom L S (σ • x) = + σ • sUnitFullLogMulHom L S x := by + let sUnitAction := + sUnitMulDistribMulAction K L S hS + let additiveSUnitAction := + additiveSUnitDistribMulAction K L S hS + let logPlaceAction := + logPlaceMulAction K L S hS + let fullLogSpaceAction := + fullLogSpaceDistribMulAction K L S hS + let logHyperplaneAction := + logHyperplaneDistribMulAction K L S hS + let latticeAction := + fullLogLatticeDistribMulAction K L S hS + let multiplicativeLatticeAction : + MulDistribMulAction (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S)) := + multiplicativeDistribMulAction + intro σ x + apply Multiplicative.toAdd.injective + apply Subtype.ext + exact fullLog_smul K L hS σ (Additive.ofMul x) + +open scoped Classical in +/-- Ordinary roots of unity identify with the torsion subgroup of the +`S`-unit group. -/ +noncomputable def rootsOfUnityEquivSUnitTorsion + (S : Finset (HeightOneSpectrum (𝓞 L))) : + NumberField.Units.torsion L ≃* + CommGroup.torsion + (SUnitGroup (K := L) S) := + ((NumberField.Units.torsion L).equivMapOfInjective + (SUnitGroup.fromNumberFieldUnits (K := L) S) + (SUnitGroup.fromNumberFieldUnits_injective + (K := L) S)).trans + (MulEquiv.subgroupCongr + (SUnitGroup.torsion_eq_rootsOfUnity_range + (K := L) S).symm) + +open scoped Classical in +/-- Torsion in an `S`-unit group over a number field is finite. -/ +theorem sUnitTorsionFinite + (S : Finset (HeightOneSpectrum (𝓞 L))) : + Finite + (CommGroup.torsion + (SUnitGroup (K := L) S)) := + Finite.of_equiv + (NumberField.Units.torsion L) + (rootsOfUnityEquivSUnitTorsion L S).toEquiv + +omit [NumberField K] in +open scoped Classical in +/-- The torsion subgroup is stable under Galois automorphisms. -/ +theorem sUnitTorsion_stable + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) : + letI _sUnitAction := + sUnitMulDistribMulAction K L S hS + ∀ (σ : L ≃ₐ[K] L) + (x : SUnitGroup (K := L) S), + x ∈ CommGroup.torsion + (SUnitGroup (K := L) S) → + σ • x ∈ CommGroup.torsion + (SUnitGroup (K := L) S) := by + let sUnitAction := + sUnitMulDistribMulAction K L S hS + intro σ x hx + exact + CommGroup.le_comap_torsion + (MulDistribMulAction.toMonoidHom + (SUnitGroup (K := L) S) σ) hx + +open scoped Classical in +/-- Exactness of torsion inclusion followed by the full logarithm. -/ +theorem sUnitTorsion_fullLog_exact + (S : Finset (HeightOneSpectrum (𝓞 L))) : + ∀ x : SUnitGroup (K := L) S, + sUnitFullLogMulHom L S x = 1 ↔ + ∃ t : + CommGroup.torsion + (SUnitGroup (K := L) S), + (CommGroup.torsion + (SUnitGroup (K := L) S)).subtype t = x := by + intro x + constructor + · intro hx + have hxt : + x ∈ CommGroup.torsion + (SUnitGroup (K := L) S) := by + rw [← sUnitFullLogMulHom_ker L S] + exact hx + exact ⟨⟨x, hxt⟩, rfl⟩ + · rintro ⟨t, rfl⟩ + have ht : + ((t : + CommGroup.torsion + (SUnitGroup (K := L) S)) : + SUnitGroup (K := L) S) ∈ + (sUnitFullLogMulHom L S).ker := by + rw [sUnitFullLogMulHom_ker L S] + exact t.2 + exact ht + +end LogarithmicQuotient + +section DiagonalExtension + +open scoped Classical in +/-- Membership in the product lattice is exactly integrality in the +logarithmic lattice and in the diagonal coordinate. -/ +theorem mem_fullLogHyperplaneDiagonalLattice_iff + (S : Finset (HeightOneSpectrum (𝓞 L))) + (z : + SUnitGroup.LogHyperplane (K := L) S × ℝ) : + z ∈ fullLogHyperplaneDiagonalLattice L S ↔ + z.1 ∈ SUnitGroup.fullLogLattice (K := L) S ∧ + ∃ n : ℤ, (n : ℝ) = z.2 := by + let b := + fullLogHyperplaneDiagonalBasis L S + constructor + · intro hz + have hzrepr : + ∀ i, b.repr z i ∈ + Set.range (algebraMap ℤ ℝ) := + (b.mem_span_iff_repr_mem ℤ _).mp hz + have hzfirst : + z.1 ∈ + SUnitGroup.fullLogLattice (K := L) S := by + rw [← + (Module.Free.chooseBasis ℤ + (SUnitGroup.fullLogLattice + (K := L) S)).ofZLatticeBasis_span ℝ] + apply + ((fullLogLatticeRealBasis L S).mem_span_iff_repr_mem + ℤ _).mpr + intro j + simpa only [b, fullLogHyperplaneDiagonalBasis, + Basis.prod_repr_inl] using hzrepr (Sum.inl j) + have hzsecond := + hzrepr (Sum.inr ()) + simp only [b, fullLogHyperplaneDiagonalBasis, + Basis.prod_repr_inr, Basis.singleton_repr] at hzsecond + exact ⟨hzfirst, hzsecond⟩ + · rintro ⟨hzfirst, ⟨n, hn⟩⟩ + apply (b.mem_span_iff_repr_mem ℤ _).mpr + intro i + cases i with + | inl j => + have hzspan : + z.1 ∈ + Submodule.span ℤ + (Set.range (fullLogLatticeRealBasis L S)) := by + simpa only [fullLogLatticeRealBasis, + (Module.Free.chooseBasis ℤ + (SUnitGroup.fullLogLattice + (K := L) S)).ofZLatticeBasis_span ℝ] using + hzfirst + have hzcoord := + ((fullLogLatticeRealBasis L S).mem_span_iff_repr_mem + ℤ _).mp hzspan j + simpa only [b, fullLogHyperplaneDiagonalBasis, + Basis.prod_repr_inl] using hzcoord + | inr j => + refine ⟨n, ?_⟩ + simpa [b, fullLogHyperplaneDiagonalBasis, + Basis.prod_repr_inr, Basis.singleton_repr, + RingHom.id_apply] using hn + +open scoped Classical in +/-- The natural integral-linear map from the logarithmic lattice and +one diagonal integer coordinate to the extended full logarithmic +lattice. -/ +noncomputable def fullLogLatticeProdIntToExtended + (S : Finset (HeightOneSpectrum (𝓞 L))) : + (SUnitGroup.fullLogLattice (K := L) S × ℤ) →ₗ[ℤ] + extendedFullLogLattice L S := by + let e := + fullLogSpaceEquivHyperplaneProd L S + refine + { toFun := fun z => + ⟨e.symm + (((z.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (z.2 : ℝ)), ?_⟩ + map_add' := ?_ + map_smul' := ?_ } + · change + fullLogSpaceSplit L S + (e.symm + (((z.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (z.2 : ℝ))) ∈ + fullLogHyperplaneDiagonalLattice L S + rw [show + fullLogSpaceSplit L S + (e.symm + (((z.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (z.2 : ℝ))) = + (((z.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (z.2 : ℝ)) by + exact e.apply_symm_apply _] + exact + (mem_fullLogHyperplaneDiagonalLattice_iff + L S _).mpr ⟨z.1.2, ⟨z.2, rfl⟩⟩ + · intro x y + apply Subtype.ext + change + e.symm + (((((x + y).1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S)), + (((x + y).2 : ℤ) : ℝ)) = + e.symm + ((((x.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (x.2 : ℝ))) + + e.symm + ((((y.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (y.2 : ℝ))) + rw [← e.symm.map_add] + congr 1 + ext <;> simp + · intro n x + apply Subtype.ext + change + e.symm + (((((n • x).1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S)), + ((((n • x).2 : ℤ) : ℝ))) = + n • + e.symm + ((((x.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (x.2 : ℝ))) + rw [← map_zsmul] + congr 1 + ext <;> simp + +open scoped Classical in +/-- The preceding map is bijective. -/ +theorem fullLogLatticeProdIntToExtended_bijective + (S : Finset (HeightOneSpectrum (𝓞 L))) : + Function.Bijective + (fullLogLatticeProdIntToExtended L S) := by + let e := + fullLogSpaceEquivHyperplaneProd L S + constructor + · intro x y hxy + have hxy' := + congrArg + (fun z : extendedFullLogLattice L S => + e (z : + SUnitGroup.FullLogSpace (K := L) S)) + hxy + have hpairs : + (((x.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (x.2 : ℝ)) = + (((y.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (y.2 : ℝ)) := by + change + e (e.symm + (((x.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (x.2 : ℝ))) = + e (e.symm + (((y.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (y.2 : ℝ))) at hxy' + simpa only [e, LinearEquiv.apply_symm_apply] using hxy' + apply Prod.ext + · apply Subtype.ext + exact congrArg Prod.fst hpairs + · have hs : + (x.2 : ℝ) = (y.2 : ℝ) := + congrArg Prod.snd hpairs + exact Int.cast_injective hs + · intro y + have hy : + fullLogSpaceSplit L S + (y : + SUnitGroup.FullLogSpace (K := L) S) ∈ + fullLogHyperplaneDiagonalLattice L S := + y.2 + obtain ⟨hyfirst, n, hn⟩ := + (mem_fullLogHyperplaneDiagonalLattice_iff + L S _).mp hy + let x : + SUnitGroup.fullLogLattice (K := L) S × ℤ := + (⟨(fullLogSpaceSplit L S + (y : + SUnitGroup.FullLogSpace (K := L) S)).1, + hyfirst⟩, n) + refine ⟨x, ?_⟩ + apply Subtype.ext + apply e.injective + change + e (e.symm + (((x.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (x.2 : ℝ))) = + e (y : + SUnitGroup.FullLogSpace (K := L) S) + rw [e.apply_symm_apply] + change + ((fullLogSpaceSplit L S + (y : + SUnitGroup.FullLogSpace (K := L) S)).1, + (n : ℝ)) = + fullLogSpaceSplit L S + (y : + SUnitGroup.FullLogSpace (K := L) S) + exact Prod.ext rfl hn + +open scoped Classical in +/-- Integral-linear decomposition of the extended lattice into the +logarithmic lattice and one integer diagonal direction. -/ +noncomputable def extendedFullLogLatticeEquivProdInt + (S : Finset (HeightOneSpectrum (𝓞 L))) : + extendedFullLogLattice L S ≃ₗ[ℤ] + (SUnitGroup.fullLogLattice (K := L) S × ℤ) := + (LinearEquiv.ofBijective + (fullLogLatticeProdIntToExtended L S) + (fullLogLatticeProdIntToExtended_bijective L S)).symm + +open scoped Classical in +/-- The componentwise action on the logarithmic lattice paired with +the invariant integer diagonal. -/ +@[reducible] +noncomputable def fullLogLatticeProdIntDistribMulAction + (S : Finset (HeightOneSpectrum (𝓞 L))) + (hS : IsGaloisStableFinitePlaces K L S) : + DistribMulAction (L ≃ₐ[K] L) + (SUnitGroup.fullLogLattice (K := L) S × ℤ) := by + letI := + fullLogLatticeDistribMulAction K L S hS + exact + { smul := fun σ z => (σ • z.1, z.2) + one_smul := by + intro z + apply Prod.ext + · exact one_smul (L ≃ₐ[K] L) z.1 + · rfl + mul_smul := by + intro σ τ z + apply Prod.ext + · exact mul_smul σ τ z.1 + · rfl + smul_zero := by + intro σ + apply Prod.ext + · exact DistribMulAction.smul_zero σ + · rfl + smul_add := by + intro σ z z' + apply Prod.ext + · exact DistribMulAction.smul_add σ z.1 z'.1 + · rfl } + +omit [NumberField K] in +open scoped Classical in +/-- The map from logarithmic-plus-diagonal coordinates into the +extended lattice is equivariant. -/ +theorem fullLogLatticeProdIntToExtended_equivariant + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) : + let ρ := + logPlacePermutationHom K L S hS + letI _indexAction : + MulAction (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S) := + permutationMulAction ρ + letI _extendedAction : + DistribMulAction (L ≃ₐ[K] L) + (extendedFullLogLattice L S) := + completePermutationLatticeDistribMulAction + ρ (extendedFullLogLattice L S) + (extendedFullLogLattice_permutation_stable + K L hS) + letI _productAction : + DistribMulAction (L ≃ₐ[K] L) + (SUnitGroup.fullLogLattice (K := L) S × ℤ) := + fullLogLatticeProdIntDistribMulAction K L S hS + ∀ (σ : L ≃ₐ[K] L) + (z : + SUnitGroup.fullLogLattice (K := L) S × ℤ), + fullLogLatticeProdIntToExtended L S + (_productAction.toMulAction.toSemigroupAction.toSMul.smul + σ z) = + _extendedAction.toMulAction.toSemigroupAction.toSMul.smul + σ (fullLogLatticeProdIntToExtended L S z) := by + dsimp only + let ρ := + logPlacePermutationHom K L S hS + let indexAction : + MulAction (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S) := + permutationMulAction ρ + let sUnitAction := + sUnitMulDistribMulAction K L S hS + let additiveSUnitAction := + additiveSUnitDistribMulAction K L S hS + let logPlaceAction := + logPlaceMulAction K L S hS + let fullLogSpaceAction := + fullLogSpaceDistribMulAction K L S hS + let logHyperplaneAction := + logHyperplaneDistribMulAction K L S hS + let fullLogLatticeAction := + fullLogLatticeDistribMulAction K L S hS + let extendedAction : + DistribMulAction (L ≃ₐ[K] L) + (extendedFullLogLattice L S) := + completePermutationLatticeDistribMulAction + ρ (extendedFullLogLattice L S) + (extendedFullLogLattice_permutation_stable + K L hS) + let productAction : + DistribMulAction (L ≃ₐ[K] L) + (SUnitGroup.fullLogLattice (K := L) S × ℤ) := + fullLogLatticeProdIntDistribMulAction K L S hS + intro σ z + apply Subtype.ext + apply fullLogSpaceSplit_injective L S + apply Prod.ext + · change + (fullLogSpaceSplit L S + ((fullLogSpaceEquivHyperplaneProd L S).symm + (((σ • z.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (z.2 : ℝ)))).1 = + (fullLogSpaceSplit L S + (permutationRepresentation ρ σ + ((fullLogSpaceEquivHyperplaneProd L S).symm + (((z.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (z.2 : ℝ))))).1 + rw [permutationRepresentation_logPlace K L hS, + fullLogSpaceSplit_fst_smul K L hS] + rw [show + fullLogSpaceSplit L S + ((fullLogSpaceEquivHyperplaneProd L S).symm + (((σ • z.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (z.2 : ℝ))) = + (((σ • z.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (z.2 : ℝ)) by + exact + (fullLogSpaceEquivHyperplaneProd L S).apply_symm_apply _] + rw [show + fullLogSpaceSplit L S + ((fullLogSpaceEquivHyperplaneProd L S).symm + (((z.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (z.2 : ℝ))) = + (((z.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (z.2 : ℝ)) by + exact + (fullLogSpaceEquivHyperplaneProd L S).apply_symm_apply _] + change + σ • (z.1 : + SUnitGroup.LogHyperplane (K := L) S) = + σ • (z.1 : + SUnitGroup.LogHyperplane (K := L) S) + rfl + · change + (fullLogSpaceSplit L S + ((fullLogSpaceEquivHyperplaneProd L S).symm + (((σ • z.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (z.2 : ℝ)))).2 = + (fullLogSpaceSplit L S + (permutationRepresentation ρ σ + ((fullLogSpaceEquivHyperplaneProd L S).symm + (((z.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (z.2 : ℝ))))).2 + rw [permutationRepresentation_logPlace K L hS, + fullLogSpaceSplit_snd_smul K L hS] + rw [show + fullLogSpaceSplit L S + ((fullLogSpaceEquivHyperplaneProd L S).symm + (((σ • z.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (z.2 : ℝ))) = + (((σ • z.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (z.2 : ℝ)) by + exact + (fullLogSpaceEquivHyperplaneProd L S).apply_symm_apply _] + rw [show + fullLogSpaceSplit L S + ((fullLogSpaceEquivHyperplaneProd L S).symm + (((z.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (z.2 : ℝ))) = + (((z.1 : + SUnitGroup.fullLogLattice + (K := L) S) : + SUnitGroup.LogHyperplane (K := L) S), + (z.2 : ℝ)) by + exact + (fullLogSpaceEquivHyperplaneProd L S).apply_symm_apply _] + +omit [NumberField K] in +open scoped Classical in +/-- The integral decomposition of the extended lattice is equivariant. -/ +theorem extendedFullLogLatticeEquivProdInt_equivariant + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) : + let ρ := + logPlacePermutationHom K L S hS + letI _indexAction : + MulAction (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S) := + permutationMulAction ρ + letI _extendedAction : + DistribMulAction (L ≃ₐ[K] L) + (extendedFullLogLattice L S) := + completePermutationLatticeDistribMulAction + ρ (extendedFullLogLattice L S) + (extendedFullLogLattice_permutation_stable + K L hS) + letI _productAction : + DistribMulAction (L ≃ₐ[K] L) + (SUnitGroup.fullLogLattice (K := L) S × ℤ) := + fullLogLatticeProdIntDistribMulAction K L S hS + ∀ (σ : L ≃ₐ[K] L) + (x : extendedFullLogLattice L S), + extendedFullLogLatticeEquivProdInt L S + (_extendedAction.toMulAction.toSemigroupAction.toSMul.smul + σ x) = + _productAction.toMulAction.toSemigroupAction.toSMul.smul + σ (extendedFullLogLatticeEquivProdInt L S x) := by + dsimp only + let ρ := + logPlacePermutationHom K L S hS + let indexAction : + MulAction (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S) := + permutationMulAction ρ + let sUnitAction := + sUnitMulDistribMulAction K L S hS + let additiveSUnitAction := + additiveSUnitDistribMulAction K L S hS + let logPlaceAction := + logPlaceMulAction K L S hS + let fullLogSpaceAction := + fullLogSpaceDistribMulAction K L S hS + let logHyperplaneAction := + logHyperplaneDistribMulAction K L S hS + let fullLogLatticeAction := + fullLogLatticeDistribMulAction K L S hS + let extendedAction : + DistribMulAction (L ≃ₐ[K] L) + (extendedFullLogLattice L S) := + completePermutationLatticeDistribMulAction + ρ (extendedFullLogLattice L S) + (extendedFullLogLattice_permutation_stable + K L hS) + let productAction : + DistribMulAction (L ≃ₐ[K] L) + (SUnitGroup.fullLogLattice (K := L) S × ℤ) := + fullLogLatticeProdIntDistribMulAction K L S hS + intro σ x + let e := + extendedFullLogLatticeEquivProdInt L S + apply e.symm.injective + have hmap := + fullLogLatticeProdIntToExtended_equivariant + K L hS σ (e x) + change + e.symm + (productAction.toMulAction.toSemigroupAction.toSMul.smul + σ (e x)) = + extendedAction.toMulAction.toSemigroupAction.toSMul.smul + σ (e.symm (e x)) at hmap + rw [e.symm_apply_apply, hmap, + e.symm_apply_apply] + +end DiagonalExtension + +section LogLatticeHerbrand + +open scoped Classical in +/-- Inclusion of the logarithmic lattice as the first factor of the +logarithmic-plus-diagonal lattice, in multiplicative notation. -/ +def fullLogLatticeProdIntIncl + (S : Finset (HeightOneSpectrum (𝓞 L))) : + Multiplicative + (SUnitGroup.fullLogLattice (K := L) S) →* + Multiplicative + (SUnitGroup.fullLogLattice (K := L) S × ℤ) where + toFun z := + Multiplicative.ofAdd + (Multiplicative.toAdd z, 0) + map_one' := rfl + map_mul' _ _ := rfl + +open scoped Classical in +/-- Projection from the logarithmic-plus-diagonal lattice to its +integer diagonal coordinate, in multiplicative notation. -/ +def fullLogLatticeProdIntProj + (S : Finset (HeightOneSpectrum (𝓞 L))) : + Multiplicative + (SUnitGroup.fullLogLattice (K := L) S × ℤ) →* + Multiplicative ℤ where + toFun z := + Multiplicative.ofAdd + (Multiplicative.toAdd z).2 + map_one' := rfl + map_mul' _ _ := rfl + +open scoped Classical in +/-- The multiplicative equivalence induced by the integral +decomposition of the extended lattice. -/ +noncomputable def extendedFullLogLatticeMulEquivProdInt + (S : Finset (HeightOneSpectrum (𝓞 L))) : + Multiplicative (extendedFullLogLattice L S) ≃* + Multiplicative + (SUnitGroup.fullLogLattice (K := L) S × ℤ) := + (extendedFullLogLatticeEquivProdInt L S).toAddEquiv.toMultiplicative + +omit [NumberField K] in +open scoped Classical in +/-- The multiplicative form of the integral decomposition is +Galois-equivariant. -/ +theorem extendedFullLogLatticeMulEquivProdInt_equivariant + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) : + let ρ := + logPlacePermutationHom K L S hS + letI _indexAction : + MulAction (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S) := + permutationMulAction ρ + letI _extendedAction : + DistribMulAction (L ≃ₐ[K] L) + (extendedFullLogLattice L S) := + completePermutationLatticeDistribMulAction + ρ (extendedFullLogLattice L S) + (extendedFullLogLattice_permutation_stable + K L hS) + letI _extendedMultiplicativeAction : + MulDistribMulAction (L ≃ₐ[K] L) + (Multiplicative + (extendedFullLogLattice L S)) := + multiplicativeDistribMulAction + letI _productAction : + DistribMulAction (L ≃ₐ[K] L) + (SUnitGroup.fullLogLattice (K := L) S × ℤ) := + fullLogLatticeProdIntDistribMulAction K L S hS + letI _productMultiplicativeAction : + MulDistribMulAction (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S × ℤ)) := + multiplicativeDistribMulAction + ∀ (σ : L ≃ₐ[K] L) + (x : Multiplicative (extendedFullLogLattice L S)), + extendedFullLogLatticeMulEquivProdInt L S + (_extendedMultiplicativeAction.toMulAction.toSemigroupAction.toSMul.smul + σ x) = + _productMultiplicativeAction.toMulAction.toSemigroupAction.toSMul.smul + σ (extendedFullLogLatticeMulEquivProdInt L S x) := by + dsimp only + let ρ := + logPlacePermutationHom K L S hS + let indexAction : + MulAction (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S) := + permutationMulAction ρ + let sUnitAction := + sUnitMulDistribMulAction K L S hS + let additiveSUnitAction := + additiveSUnitDistribMulAction K L S hS + let logPlaceAction := + logPlaceMulAction K L S hS + let fullLogSpaceAction := + fullLogSpaceDistribMulAction K L S hS + let logHyperplaneAction := + logHyperplaneDistribMulAction K L S hS + let fullLogLatticeAction := + fullLogLatticeDistribMulAction K L S hS + let extendedAction : + DistribMulAction (L ≃ₐ[K] L) + (extendedFullLogLattice L S) := + completePermutationLatticeDistribMulAction + ρ (extendedFullLogLattice L S) + (extendedFullLogLattice_permutation_stable + K L hS) + let extendedMultiplicativeAction : + MulDistribMulAction (L ≃ₐ[K] L) + (Multiplicative + (extendedFullLogLattice L S)) := + multiplicativeDistribMulAction + let productAction : + DistribMulAction (L ≃ₐ[K] L) + (SUnitGroup.fullLogLattice (K := L) S × ℤ) := + fullLogLatticeProdIntDistribMulAction K L S hS + let productMultiplicativeAction : + MulDistribMulAction (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S × ℤ)) := + multiplicativeDistribMulAction + intro σ x + apply Multiplicative.toAdd.injective + change + extendedFullLogLatticeEquivProdInt L S + (extendedAction.toMulAction.toSemigroupAction.toSMul.smul + σ (Multiplicative.toAdd x)) = + productAction.toMulAction.toSemigroupAction.toSMul.smul + σ + (extendedFullLogLatticeEquivProdInt L S + (Multiplicative.toAdd x)) + exact + extendedFullLogLatticeEquivProdInt_equivariant + K L hS σ (Multiplicative.toAdd x) + +omit [NumberField K] in +open scoped Classical in +/-- The first-factor inclusion is Galois-equivariant. -/ +theorem fullLogLatticeProdIntIncl_equivariant + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) : + letI _latticeAction : + DistribMulAction (L ≃ₐ[K] L) + (SUnitGroup.fullLogLattice (K := L) S) := + fullLogLatticeDistribMulAction K L S hS + letI _latticeMultiplicativeAction : + MulDistribMulAction (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S)) := + multiplicativeDistribMulAction + letI _productAction : + DistribMulAction (L ≃ₐ[K] L) + (SUnitGroup.fullLogLattice (K := L) S × ℤ) := + fullLogLatticeProdIntDistribMulAction K L S hS + letI _productMultiplicativeAction : + MulDistribMulAction (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S × ℤ)) := + multiplicativeDistribMulAction + ∀ (σ : L ≃ₐ[K] L) + (z : + Multiplicative + (SUnitGroup.fullLogLattice (K := L) S)), + fullLogLatticeProdIntIncl L S (σ • z) = + σ • fullLogLatticeProdIntIncl L S z := by + let latticeAction := + fullLogLatticeDistribMulAction K L S hS + let latticeMultiplicativeAction : + MulDistribMulAction (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S)) := + multiplicativeDistribMulAction + let productAction : + DistribMulAction (L ≃ₐ[K] L) + (SUnitGroup.fullLogLattice (K := L) S × ℤ) := + fullLogLatticeProdIntDistribMulAction K L S hS + let productMultiplicativeAction : + MulDistribMulAction (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S × ℤ)) := + multiplicativeDistribMulAction + intro σ z + rfl + +omit [NumberField K] in +open scoped Classical in +/-- The diagonal projection is Galois-equivariant for the trivial +action on its integer target. -/ +theorem fullLogLatticeProdIntProj_equivariant + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) : + letI _latticeAction : + DistribMulAction (L ≃ₐ[K] L) + (SUnitGroup.fullLogLattice (K := L) S) := + fullLogLatticeDistribMulAction K L S hS + letI _productAction : + DistribMulAction (L ≃ₐ[K] L) + (SUnitGroup.fullLogLattice (K := L) S × ℤ) := + fullLogLatticeProdIntDistribMulAction K L S hS + letI _productMultiplicativeAction : + MulDistribMulAction (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S × ℤ)) := + multiplicativeDistribMulAction + letI _integerAction : + MulDistribMulAction (L ≃ₐ[K] L) + (Multiplicative ℤ) := + trivialIntMulDistribMulAction (L ≃ₐ[K] L) + ∀ (σ : L ≃ₐ[K] L) + (z : + Multiplicative + (SUnitGroup.fullLogLattice (K := L) S × ℤ)), + fullLogLatticeProdIntProj L S (σ • z) = + σ • fullLogLatticeProdIntProj L S z := by + let latticeAction := + fullLogLatticeDistribMulAction K L S hS + let productAction : + DistribMulAction (L ≃ₐ[K] L) + (SUnitGroup.fullLogLattice (K := L) S × ℤ) := + fullLogLatticeProdIntDistribMulAction K L S hS + let productMultiplicativeAction : + MulDistribMulAction (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S × ℤ)) := + multiplicativeDistribMulAction + let integerAction : + MulDistribMulAction (L ≃ₐ[K] L) + (Multiplicative ℤ) := + trivialIntMulDistribMulAction (L ≃ₐ[K] L) + intro σ z + rfl + +open scoped Classical in +/-- Exactness of the first-factor inclusion followed by the diagonal +projection. -/ +theorem fullLogLatticeProdInt_exact + (S : Finset (HeightOneSpectrum (𝓞 L))) : + ∀ z : + Multiplicative + (SUnitGroup.fullLogLattice (K := L) S × ℤ), + fullLogLatticeProdIntProj L S z = 1 ↔ + ∃ x : + Multiplicative + (SUnitGroup.fullLogLattice (K := L) S), + fullLogLatticeProdIntIncl L S x = z := by + intro z + constructor + · intro hz + refine + ⟨Multiplicative.ofAdd + (Multiplicative.toAdd z).1, ?_⟩ + apply Multiplicative.toAdd.injective + apply Prod.ext + · rfl + · exact (congrArg Multiplicative.toAdd hz).symm + · rintro ⟨x, rfl⟩ + rfl + +open scoped Classical in +/-- The first-factor inclusion is injective. -/ +theorem fullLogLatticeProdIntIncl_injective + (S : Finset (HeightOneSpectrum (𝓞 L))) : + Function.Injective + (fullLogLatticeProdIntIncl L S) := by + intro x y hxy + apply Multiplicative.toAdd.injective + exact + congrArg + (fun z : + Multiplicative + (SUnitGroup.fullLogLattice (K := L) S × ℤ) => + (Multiplicative.toAdd z).1) hxy + +open scoped Classical in +/-- The diagonal projection is surjective. -/ +theorem fullLogLatticeProdIntProj_surjective + (S : Finset (HeightOneSpectrum (𝓞 L))) : + Function.Surjective + (fullLogLatticeProdIntProj L S) := by + intro z + exact + ⟨Multiplicative.ofAdd + (0, Multiplicative.toAdd z), rfl⟩ + +open scoped Classical in +/-- For the genuine sum-zero logarithmic lattice, adjoining +the invariant diagonal multiplies the Herbrand quotient by `|G|`. -/ +theorem fullLogLattice_herbrandQuotient_eq_stabilizerProduct_div_card + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + let ρ := + logPlacePermutationHom K L S hS + letI _indexAction : + MulAction (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S) := + permutationMulAction ρ + letI _latticeAction : + DistribMulAction (L ≃ₐ[K] L) + (SUnitGroup.fullLogLattice (K := L) S) := + fullLogLatticeDistribMulAction K L S hS + letI _latticeMultiplicativeAction : + MulDistribMulAction (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S)) := + multiplicativeDistribMulAction + letI _orbitFintype : + Fintype + (MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S)) := + Fintype.ofFinite _ + letI _stabilizerFintype : + ∀ ω : + MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S), + Fintype (permutationOrbitStabilizer ω) := + fun _ => Fintype.ofFinite _ + ∃ _ : + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S)) σ, + @herbrandQuotient + (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S)) + _ _ _ _ σ = + (∏ ω : + MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S), + (Fintype.card + (permutationOrbitStabilizer ω) : ℚ)) / + (Fintype.card (L ≃ₐ[K] L) : ℚ) := by + dsimp only + let ρ := + logPlacePermutationHom K L S hS + let indexAction : + MulAction (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S) := + permutationMulAction ρ + let latticeAction : + DistribMulAction (L ≃ₐ[K] L) + (SUnitGroup.fullLogLattice (K := L) S) := + fullLogLatticeDistribMulAction K L S hS + let latticeMultiplicativeAction : + MulDistribMulAction (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S)) := + multiplicativeDistribMulAction + let productAction : + DistribMulAction (L ≃ₐ[K] L) + (SUnitGroup.fullLogLattice (K := L) S × ℤ) := + fullLogLatticeProdIntDistribMulAction K L S hS + let productMultiplicativeAction : + MulDistribMulAction (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S × ℤ)) := + multiplicativeDistribMulAction + let integerAction : + MulDistribMulAction (L ≃ₐ[K] L) + (Multiplicative ℤ) := + trivialIntMulDistribMulAction (L ≃ₐ[K] L) + let extendedAction : + DistribMulAction (L ≃ₐ[K] L) + (extendedFullLogLattice L S) := + completePermutationLatticeDistribMulAction + ρ (extendedFullLogLattice L S) + (extendedFullLogLattice_permutation_stable + K L hS) + let extendedMultiplicativeAction : + MulDistribMulAction (L ≃ₐ[K] L) + (Multiplicative + (extendedFullLogLattice L S)) := + multiplicativeDistribMulAction + let orbitFintype : + Fintype + (MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S)) := + Fintype.ofFinite _ + let stabilizerFintype : + ∀ ω : + MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S), + Fintype (permutationOrbitStabilizer ω) := + fun _ => Fintype.ofFinite _ + obtain ⟨hExtended, hExtendedValue⟩ := + extendedFullLogLattice_herbrandQuotient_eq_stabilizerProduct + K L hS σ hgen + let extendedH0Finite := hExtended.1 + let extendedHMinusOneFinite := hExtended.2 + let e := + extendedFullLogLatticeMulEquivProdInt L S + have he : + ∀ (τ : L ≃ₐ[K] L) + (x : Multiplicative (extendedFullLogLattice L S)), + e (τ • x) = τ • e x := + extendedFullLogLatticeMulEquivProdInt_equivariant + K L hS + let hProduct : + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S × ℤ)) σ := + ⟨herbrandH0Finite_of_equivariantMulEquiv e he, + herbrandHMinusOneFinite_of_equivariantMulEquiv + e he σ⟩ + let productH0Finite := hProduct.1 + let productHMinusOneFinite := hProduct.2 + let hInteger : + HerbrandQuotientDefined + (L ≃ₐ[K] L) (Multiplicative ℤ) σ := + ⟨trivialIntHerbrandH0Finite, + trivialIntHerbrandHMinusOneFinite σ⟩ + let integerH0Finite := hInteger.1 + let integerHMinusOneFinite := hInteger.2 + let hLattice := + herbrandQuotientDefined_left_of_middle_right + (fullLogLatticeProdIntIncl L S) + (fullLogLatticeProdIntProj L S) + (fullLogLatticeProdIntIncl_equivariant K L hS) + (fullLogLatticeProdIntProj_equivariant K L hS) + (fullLogLatticeProdInt_exact L S) + (fullLogLatticeProdIntIncl_injective L S) + (fullLogLatticeProdIntProj_surjective L S) + σ hgen hProduct hInteger + let latticeH0Finite := hLattice.1 + let latticeHMinusOneFinite := hLattice.2 + have hMultiplicative := + herbrandQuotient_multiplicative_of_shortExact + (fullLogLatticeProdIntIncl L S) + (fullLogLatticeProdIntProj L S) + (fullLogLatticeProdIntIncl_equivariant K L hS) + (fullLogLatticeProdIntProj_equivariant K L hS) + (fullLogLatticeProdInt_exact L S) + (fullLogLatticeProdIntIncl_injective L S) + (fullLogLatticeProdIntProj_surjective L S) + σ hgen + have hIntegerValue := trivialInt_herbrandQuotient_eq_card (G := L ≃ₐ[K] L) σ + have hExtendedProduct := herbrandQuotient_eq_of_equivariantMulEquiv e he σ + refine ⟨hLattice, ?_⟩ + have hcard : + (Fintype.card (L ≃ₐ[K] L) : ℚ) ≠ 0 := by + exact_mod_cast + (Fintype.card_ne_zero : + Fintype.card (L ≃ₐ[K] L) ≠ 0) + rw [eq_div_iff hcard] + calc + @herbrandQuotient + (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S)) + _ _ _ _ σ * + (Fintype.card (L ≃ₐ[K] L) : ℚ) = + @herbrandQuotient + (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S × ℤ)) + _ _ _ _ σ := by + rw [← hIntegerValue] + exact hMultiplicative.symm + _ = + @herbrandQuotient + (L ≃ₐ[K] L) + (Multiplicative + (extendedFullLogLattice L S)) + _ _ _ _ σ := + hExtendedProduct.symm + _ = + ∏ ω : + MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S), + (Fintype.card + (permutationOrbitStabilizer ω) : ℚ) := + hExtendedValue + +end LogLatticeHerbrand + +section ActualSUnitHerbrand + +open scoped Classical in +/-- For the actual `S`-unit group, the finite +roots-of-unity kernel has Herbrand quotient one, so the logarithmic +lattice formula transfers unchanged. -/ +theorem sUnit_herbrandQuotient_eq_stabilizerProduct_div_card + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + let ρ := + logPlacePermutationHom K L S hS + letI _indexAction : + MulAction (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S) := + permutationMulAction ρ + letI _sUnitAction : + MulDistribMulAction (L ≃ₐ[K] L) + (SUnitGroup (K := L) S) := + sUnitMulDistribMulAction K L S hS + letI _orbitFintype : + Fintype + (MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S)) := + Fintype.ofFinite _ + letI _stabilizerFintype : + ∀ ω : + MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S), + Fintype (permutationOrbitStabilizer ω) := + fun _ => Fintype.ofFinite _ + ∃ _ : + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (SUnitGroup (K := L) S) σ, + @herbrandQuotient + (L ≃ₐ[K] L) + (SUnitGroup (K := L) S) + _ _ _ _ σ = + (∏ ω : + MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S), + (Fintype.card + (permutationOrbitStabilizer ω) : ℚ)) / + (Fintype.card (L ≃ₐ[K] L) : ℚ) := by + dsimp only + let ρ := + logPlacePermutationHom K L S hS + let indexAction : + MulAction (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S) := + permutationMulAction ρ + let sUnitAction : + MulDistribMulAction (L ≃ₐ[K] L) + (SUnitGroup (K := L) S) := + sUnitMulDistribMulAction K L S hS + let latticeAction : + DistribMulAction (L ≃ₐ[K] L) + (SUnitGroup.fullLogLattice (K := L) S) := + fullLogLatticeDistribMulAction K L S hS + let latticeMultiplicativeAction : + MulDistribMulAction (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S)) := + multiplicativeDistribMulAction + let orbitFintype : + Fintype + (MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S)) := + Fintype.ofFinite _ + let stabilizerFintype : + ∀ ω : + MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S), + Fintype (permutationOrbitStabilizer ω) := + fun _ => Fintype.ofFinite _ + let torsionAction : + MulDistribMulAction (L ≃ₐ[K] L) + (CommGroup.torsion + (SUnitGroup (K := L) S)) := + stableSubgroupMulDistribMulAction + (CommGroup.torsion + (SUnitGroup (K := L) S)) + (sUnitTorsion_stable K L hS) + let torsionFinite : + Finite + (CommGroup.torsion + (SUnitGroup (K := L) S)) := + sUnitTorsionFinite L S + obtain ⟨hLattice, hLatticeValue⟩ := + fullLogLattice_herbrandQuotient_eq_stabilizerProduct_div_card + K L hS σ hgen + let latticeH0Finite := hLattice.1 + let latticeHMinusOneFinite := hLattice.2 + let hTorsion : + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (CommGroup.torsion + (SUnitGroup (K := L) S)) σ := + ⟨inferInstance, inferInstance⟩ + let torsionH0Finite := hTorsion.1 + let torsionHMinusOneFinite := hTorsion.2 + let hSUnit := + herbrandQuotientDefined_middle_of_left_right + (CommGroup.torsion + (SUnitGroup (K := L) S)).subtype + (sUnitFullLogMulHom L S) + (stableSubgroup_subtype_equivariant + (CommGroup.torsion + (SUnitGroup (K := L) S)) + (sUnitTorsion_stable K L hS)) + (sUnitFullLogMulHom_equivariant K L hS) + (sUnitTorsion_fullLog_exact L S) + (CommGroup.torsion + (SUnitGroup (K := L) S)).subtype_injective + (sUnitFullLogMulHom_surjective L S) + σ hgen hTorsion hLattice + let sUnitH0Finite := hSUnit.1 + let sUnitHMinusOneFinite := hSUnit.2 + have hMultiplicative : + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := SUnitGroup (K := L) S) σ = + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := CommGroup.torsion + (SUnitGroup (K := L) S)) σ * + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := Multiplicative + (SUnitGroup.fullLogLattice (K := L) S)) σ := + herbrandQuotient_multiplicative_of_shortExact + (CommGroup.torsion + (SUnitGroup (K := L) S)).subtype + (sUnitFullLogMulHom L S) + (stableSubgroup_subtype_equivariant + (CommGroup.torsion + (SUnitGroup (K := L) S)) + (sUnitTorsion_stable K L hS)) + (sUnitFullLogMulHom_equivariant K L hS) + (sUnitTorsion_fullLog_exact L S) + (CommGroup.torsion + (SUnitGroup (K := L) S)).subtype_injective + (sUnitFullLogMulHom_surjective L S) + σ hgen + have hTorsionValue : + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := CommGroup.torsion + (SUnitGroup (K := L) S)) σ = 1 := + herbrandQuotient_eq_one_of_finite_module + σ hgen + refine ⟨hSUnit, ?_⟩ + calc + @herbrandQuotient + (L ≃ₐ[K] L) + (SUnitGroup (K := L) S) + _ _ _ _ σ = + @herbrandQuotient + (L ≃ₐ[K] L) + (CommGroup.torsion + (SUnitGroup (K := L) S)) + _ _ _ _ σ * + @herbrandQuotient + (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S)) + _ _ _ _ σ := + hMultiplicative + _ = + @herbrandQuotient + (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S)) + _ _ _ _ σ := by + rw [hTorsionValue, one_mul] + _ = + (∏ ω : + MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S), + (Fintype.card + (permutationOrbitStabilizer ω) : ℚ)) / + (Fintype.card (L ≃ₐ[K] L) : ℚ) := + hLatticeValue + +end ActualSUnitHerbrand + +section LocalDegreeInterpretation + +omit [NumberField K] [NumberField L] in +open scoped Classical in +/-- Stabilizing a finite place is equivalent to stabilizing its +underlying prime ideal. -/ +theorem finitePlace_stabilizer_eq_idealStabilizer + (P : HeightOneSpectrum (𝓞 L)) : + letI _finitePlaceAction := + finitePlaceMulAction K L + MulAction.stabilizer (L ≃ₐ[K] L) P = + MulAction.stabilizer (L ≃ₐ[K] L) P.asIdeal := by + let finitePlaceAction := + finitePlaceMulAction K L + ext σ + simp only [MulAction.mem_stabilizer_iff] + change + finitePlaceEquiv K L σ P = P ↔ + σ • P.asIdeal = P.asIdeal + rw [HeightOneSpectrum.ext_iff, + finitePlaceEquiv_asIdeal, + Ideal.pointwise_smul_def] + change + Ideal.map + (NumberField.RingOfIntegers.mapAlgEquiv + σ).toRingEquiv.toRingHom P.asIdeal = + P.asIdeal ↔ + Ideal.map + (MulSemiringAction.toRingHom + (L ≃ₐ[K] L) (𝓞 L) σ) P.asIdeal = + P.asIdeal + have hhom : + (NumberField.RingOfIntegers.mapAlgEquiv + σ).toRingEquiv.toRingHom = + MulSemiringAction.toRingHom + (L ≃ₐ[K] L) (𝓞 L) σ := by + ext x + rfl + rw [hhom] + +open scoped Classical in +/-- The finite local degree at the place `P`, in the standard +ramification-index times inertia-degree form +`[L_P : K_p] = e(P/p) f(P/p)`. -/ +noncomputable def finiteLogPlaceLocalDegree + (P : HeightOneSpectrum (𝓞 L)) : ℕ := + let p := P.asIdeal.under (𝓞 K) + p.ramificationIdxIn (𝓞 L) * + p.inertiaDegIn (𝓞 L) + +open scoped Classical in +/-- The stabilizer of a finite place has order equal to its local +degree. -/ +theorem finitePlace_stabilizer_card_eq_localDegree + [IsGalois K L] + (P : HeightOneSpectrum (𝓞 L)) : + letI _finitePlaceAction := + finitePlaceMulAction K L + Nat.card + (MulAction.stabilizer (L ≃ₐ[K] L) P) = + finiteLogPlaceLocalDegree K L P := by + let finitePlaceAction := + finitePlaceMulAction K L + rw [finitePlace_stabilizer_eq_idealStabilizer K L P] + unfold finiteLogPlaceLocalDegree + let p := P.asIdeal.under (𝓞 K) + have hp : p ≠ ⊥ := + Ideal.under_ne_bot (𝓞 K) P.ne_bot + let quotientFinite : Finite ((𝓞 K) ⧸ p) := + Ring.HasFiniteQuotients.finiteQuotient hp + let residueFinite : Finite p.ResidueField := + inferInstance + let residuePerfect : PerfectField p.ResidueField := + inferInstance + exact + Ideal.card_stabilizer_eq p P.asIdeal + +open scoped Classical in +/-- Passing to a stable finite set does not change the stabilizer or +the finite local degree of one of its places. -/ +theorem stableFinitePlace_stabilizer_card_eq_localDegree + [IsGalois K L] + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) + (v : S) : + letI _stableAction := + stableFinitePlaceMulAction K L S hS + Nat.card + (MulAction.stabilizer (L ≃ₐ[K] L) v) = + finiteLogPlaceLocalDegree K L v := by + let stableAction := + stableFinitePlaceMulAction K L S hS + let finitePlaceAction := + finitePlaceMulAction K L + rw [show + MulAction.stabilizer (L ≃ₐ[K] L) v = + MulAction.stabilizer + (L ≃ₐ[K] L) + (v : HeightOneSpectrum (𝓞 L)) by + ext σ + simp only [MulAction.mem_stabilizer_iff] + change + (⟨finitePlaceEquiv K L σ v, _⟩ : S) = v ↔ + finitePlaceEquiv K L σ v = v + exact Subtype.ext_iff] + exact + finitePlace_stabilizer_card_eq_localDegree + K L v + +open scoped Classical in +/-- The local degree attached to a logarithmic place. At an +archimedean place it is `1` or `2`; at a finite place it is +`e(P/p) f(P/p)`. -/ +noncomputable def logPlaceLocalDegree + (S : Finset (HeightOneSpectrum (𝓞 L))) + (q : SUnitGroup.LogPlace (K := L) S) : ℕ := + match q with + | Sum.inl w => + if NumberField.InfinitePlace.IsUnramified K w + then 1 else 2 + | Sum.inr v => + finiteLogPlaceLocalDegree K L v + +open scoped Classical in +/-- For every actual logarithmic place, the order of its Galois +stabilizer is its local degree. -/ +theorem logPlace_stabilizer_card_eq_localDegree + [IsGalois K L] + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) + (q : SUnitGroup.LogPlace (K := L) S) : + letI _logPlaceAction := + logPlaceMulAction K L S hS + Nat.card + (MulAction.stabilizer (L ≃ₐ[K] L) q) = + logPlaceLocalDegree K L S q := by + let stableAction := + stableFinitePlaceMulAction K L S hS + let logPlaceAction := + logPlaceMulAction K L S hS + cases q with + | inl w => + unfold logPlaceLocalDegree + rw [show + MulAction.stabilizer + (L ≃ₐ[K] L) + (Sum.inl w : + SUnitGroup.LogPlace (K := L) S) = + MulAction.stabilizer (L ≃ₐ[K] L) w by + ext σ + simp only [MulAction.mem_stabilizer_iff] + change Sum.inl (σ • w) = Sum.inl w ↔ + σ • w = w + simp] + exact + NumberField.InfinitePlace.card_stabilizer + | inr v => + unfold logPlaceLocalDegree + rw [show + MulAction.stabilizer + (L ≃ₐ[K] L) + (Sum.inr v : + SUnitGroup.LogPlace (K := L) S) = + MulAction.stabilizer (L ≃ₐ[K] L) v by + ext σ + simp only [MulAction.mem_stabilizer_iff] + change Sum.inr (σ • v) = Sum.inr v ↔ + σ • v = v + simp] + exact + stableFinitePlace_stabilizer_card_eq_localDegree + K L hS v + +open scoped Classical in +/-- The canonical representative of every logarithmic-place orbit has +stabilizer order equal to its local degree. -/ +theorem permutationOrbitStabilizer_card_eq_logPlaceLocalDegree + [IsGalois K L] + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) : + let ρ := + logPlacePermutationHom K L S hS + letI _indexAction : + MulAction (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S) := + permutationMulAction ρ + ∀ ω : + MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S), + Nat.card (permutationOrbitStabilizer ω) = + logPlaceLocalDegree K L S ω.out := by + dsimp only + intro ω + exact + logPlace_stabilizer_card_eq_localDegree + K L hS ω.out + +open scoped Classical in +/-- The Herbrand quotient in local-degree form: +`h(G, L^S) = |G|⁻¹ ∏_{p ∈ S} [L_P : K_p]`, with the +archimedean places included in the logarithmic place set. -/ +theorem sUnit_herbrandQuotient_eq_localDegreeProduct_div_card + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsGalois K L] + {S : Finset (HeightOneSpectrum (𝓞 L))} + (hS : IsGaloisStableFinitePlaces K L S) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + let ρ := + logPlacePermutationHom K L S hS + letI _indexAction : + MulAction (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S) := + permutationMulAction ρ + letI _sUnitAction : + MulDistribMulAction (L ≃ₐ[K] L) + (SUnitGroup (K := L) S) := + sUnitMulDistribMulAction K L S hS + letI _orbitFintype : + Fintype + (MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S)) := + Fintype.ofFinite _ + letI _stabilizerFintype : + ∀ ω : + MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S), + Fintype (permutationOrbitStabilizer ω) := + fun _ => Fintype.ofFinite _ + ∃ _ : + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (SUnitGroup (K := L) S) σ, + @herbrandQuotient + (L ≃ₐ[K] L) + (SUnitGroup (K := L) S) + _ _ _ _ σ = + (∏ ω : + MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S), + (logPlaceLocalDegree K L S ω.out : ℚ)) / + (Fintype.card (L ≃ₐ[K] L) : ℚ) := by + dsimp only + let ρ := + logPlacePermutationHom K L S hS + let indexAction : + MulAction (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S) := + permutationMulAction ρ + let sUnitAction : + MulDistribMulAction (L ≃ₐ[K] L) + (SUnitGroup (K := L) S) := + sUnitMulDistribMulAction K L S hS + let orbitFintype : + Fintype + (MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S)) := + Fintype.ofFinite _ + let stabilizerFintype : + ∀ ω : + MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S), + Fintype (permutationOrbitStabilizer ω) := + fun _ => Fintype.ofFinite _ + obtain ⟨hSUnit, hSUnitValue⟩ := + sUnit_herbrandQuotient_eq_stabilizerProduct_div_card + K L hS σ hgen + refine ⟨hSUnit, ?_⟩ + calc + @herbrandQuotient + (L ≃ₐ[K] L) + (SUnitGroup (K := L) S) + _ _ _ _ σ = + (∏ ω : + MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S), + (Fintype.card + (permutationOrbitStabilizer ω) : ℚ)) / + (Fintype.card (L ≃ₐ[K] L) : ℚ) := + hSUnitValue + _ = + (∏ ω : + MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S), + (logPlaceLocalDegree K L S ω.out : ℚ)) / + (Fintype.card (L ≃ₐ[K] L) : ℚ) := by + congr 1 + apply Finset.prod_congr rfl + intro ω _ + norm_cast + rw [← Nat.card_eq_fintype_card] + exact + permutationOrbitStabilizer_card_eq_logPlaceLocalDegree + K L hS ω + +end LocalDegreeInterpretation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/LogLattice.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/LogLattice.lean new file mode 100644 index 0000000000..5a1376d8a5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/LogLattice.lean @@ -0,0 +1,1300 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Rank +public import Mathlib.Algebra.Module.PID +public import Mathlib.Algebra.Module.ZLattice.Basic +public import Mathlib.NumberTheory.NumberField.ProductFormula +/-! +# The logarithmic lattice of `S`-units + +This file develops the logarithmic lattice of `S`-units. The +finite set `S` consists of the finite places; all infinite places are +understood to belong to the set of places used in the theorem. + +The first construction uses the usual reduced archimedean logarithmic +space (one infinite coordinate is omitted) together with the integral +principal-divisor coordinates at `S`. Its image is proved directly to +be a complete `ℤ`-lattice. The normalized, all-place logarithmic map +and its coordinate-sum-zero hyperplane are constructed below from this +lattice. +-/ + +@[expose] public section + +noncomputable +section + +open IsDedekindDomain Module +open scoped NumberField nonZeroDivisors + + +variable {K : Type*} [Field K] [NumberField K] + +namespace SUnitGroup + +variable (S : Finset (HeightOneSpectrum (𝓞 K))) + +open scoped Classical in +/-- The reduced logarithmic space for `S`-units. It consists of the +Dirichlet logarithmic space and one real divisor coordinate for every +finite place in `S`. -/ +abbrev ReducedLogSpace := + NumberField.Units.dirichletUnitTheorem.logSpace K × (S → ℝ) + +open scoped Classical in +/-- The reduced logarithmic embedding. At an infinite place it is the +usual multiplicity-weighted logarithm. At a finite place it is the +integer exponent of the principal fractional ideal, regarded as a real +number. -/ +noncomputable def reducedLog : + Additive (SUnitGroup (K := K) S) →+ + ReducedLogSpace (K := K) S where + toFun x := + (fun w => + w.1.mult * + Real.log + (w.1 + (((Additive.toMul x : + SUnitGroup (K := K) S) : Kˣ) : K)), + fun v => + (divisorCoordinate (K := K) S + (Additive.toMul x) v : ℝ)) + map_zero' := by + apply Prod.ext + · ext w + simp + · ext v + change + (divisorCoordinate (K := K) S 1 v : ℝ) = 0 + exact_mod_cast divisorCoordinate_one (K := K) S v + map_add' x y := by + apply Prod.ext + · ext w + simp [Real.log_mul, mul_add] + · ext v + change + (divisorCoordinate (K := K) S + (Additive.toMul x * Additive.toMul y) v : ℝ) = + (divisorCoordinate (K := K) S + (Additive.toMul x) v : ℝ) + + (divisorCoordinate (K := K) S + (Additive.toMul y) v : ℝ) + exact_mod_cast + divisorCoordinate_mul (K := K) S + (Additive.toMul x) (Additive.toMul y) v + +open scoped Classical in +/-- The normalized finite absolute value is the norm of the prime +raised to minus the corresponding principal-divisor exponent. -/ +theorem adicAbv_eq_zpow_neg_divisorCoordinate + (x : SUnitGroup (K := K) S) (v : S) : + NumberField.HeightOneSpectrum.adicAbv K + (v : HeightOneSpectrum (𝓞 K)) (((x : Kˣ) : K)) = + (Ideal.absNorm + (v : HeightOneSpectrum (𝓞 K)).asIdeal : ℝ) ^ + (-divisorCoordinate (K := K) S x v) := by + rw [NumberField.HeightOneSpectrum.adicAbv_def, + valuation_eq_exp_neg_count (K := K)] + rw [WithZeroMulInt.toNNReal_neg_apply] + · norm_cast + · simp + +open scoped Classical in +/-- The logarithm of a normalized finite absolute value is the divisor +coordinate times `-log Nv`. -/ +theorem log_adicAbv_eq_neg_divisorCoordinate_mul_log_absNorm + (x : SUnitGroup (K := K) S) (v : S) : + Real.log + (NumberField.HeightOneSpectrum.adicAbv K + (v : HeightOneSpectrum (𝓞 K)) (((x : Kˣ) : K))) = + -(divisorCoordinate (K := K) S x v : ℝ) * + Real.log + (Ideal.absNorm + (v : HeightOneSpectrum (𝓞 K)).asIdeal : ℝ) := by + rw [adicAbv_eq_zpow_neg_divisorCoordinate (K := K) S, + Real.log_zpow] + push_cast + ring + +open scoped Classical in +/-- The `ℤ`-linear form of the reduced logarithmic embedding. -/ +noncomputable def reducedLogLinearMap : + Additive (SUnitGroup (K := K) S) →ₗ[ℤ] + ReducedLogSpace (K := K) S := + (reducedLog (K := K) S).toIntLinearMap + +open scoped Classical in +@[simp] +theorem reducedLog_fst_fromNumberFieldUnits + (u : (𝓞 K)ˣ) : + (reducedLog (K := K) S + (Additive.ofMul + (fromNumberFieldUnits (K := K) S u))).1 = + NumberField.Units.logEmbedding K (Additive.ofMul u) := by + ext w + rfl + +open scoped Classical in +@[simp] +theorem reducedLog_snd_fromNumberFieldUnits + (u : (𝓞 K)ˣ) : + (reducedLog (K := K) S + (Additive.ofMul + (fromNumberFieldUnits (K := K) S u))).2 = 0 := by + ext v + change + (divisorCoordinate (K := K) S + (fromNumberFieldUnits (K := K) S u) v : ℝ) = 0 + norm_cast + have hrange : + fromNumberFieldUnitsLinearMap (K := K) S + (Additive.ofMul u) ∈ + LinearMap.range + (fromNumberFieldUnitsLinearMap (K := K) S) := + LinearMap.mem_range_self _ _ + rw [range_fromNumberFieldUnitsLinearMap_eq_ker_divisorLinearMap + (K := K) S] at hrange + have hzero := + congrFun + (LinearMap.mem_ker.mp hrange) v + simpa [divisorLinearMap, divisor, + fromNumberFieldUnitsLinearMap] using hzero + +open scoped Classical in +/-- The reduced logarithm vanishes precisely on the roots of unity. -/ +theorem reducedLog_eq_zero_iff + (x : Additive (SUnitGroup (K := K) S)) : + reducedLog (K := K) S x = 0 ↔ + x ∈ AddCommGroup.torsion + (Additive (SUnitGroup (K := K) S)) := by + constructor + · intro hx + have hxdiv : + x ∈ LinearMap.ker + (divisorLinearMap (K := K) S) := by + apply LinearMap.mem_ker.mpr + ext v + have hv := congrFun (congrArg Prod.snd hx) v + simpa [reducedLog, divisorLinearMap, divisor] using + (show + (divisorCoordinate (K := K) S + (Additive.toMul x) v : ℝ) = 0 from hv) + rw [← range_fromNumberFieldUnitsLinearMap_eq_ker_divisorLinearMap + (K := K) S] at hxdiv + obtain ⟨u, hu⟩ := hxdiv + have hxu : + x = + fromNumberFieldUnitsLinearMap (K := K) S u := + hu.symm + have hlog : + NumberField.Units.logEmbedding K u = 0 := by + have hfst := congrArg Prod.fst hx + rw [hxu] at hfst + simpa [fromNumberFieldUnitsLinearMap] using hfst + have hutors : + Additive.toMul u ∈ NumberField.Units.torsion K := by + exact + NumberField.Units.dirichletUnitTheorem.logEmbedding_eq_zero_iff.mp + hlog + change + Additive.toMul x ∈ + CommGroup.torsion (SUnitGroup (K := K) S) + rw [torsion_eq_rootsOfUnity_range (K := K) S] + refine ⟨Additive.toMul u, hutors, ?_⟩ + exact (congrArg Additive.toMul hxu).symm + · intro hx + change + Additive.toMul x ∈ + CommGroup.torsion (SUnitGroup (K := K) S) at hx + rw [torsion_eq_rootsOfUnity_range (K := K) S] at hx + obtain ⟨u, hu, hux⟩ := hx + have hxadd : + x = + Additive.ofMul + (fromNumberFieldUnits (K := K) S u) := by + apply Additive.toMul.injective + exact hux.symm + rw [hxadd] + apply Prod.ext + · simpa using + (NumberField.Units.dirichletUnitTheorem.logEmbedding_eq_zero_iff.mpr + hu) + · exact reducedLog_snd_fromNumberFieldUnits + (K := K) S u + +open scoped Classical in +/-- The kernel of the reduced logarithmic map is the additive torsion +submodule. -/ +theorem reducedLogLinearMap_ker : + LinearMap.ker (reducedLogLinearMap (K := K) S) = + (AddCommGroup.torsion + (Additive (SUnitGroup (K := K) S))).toIntSubmodule := by + ext x + rw [LinearMap.mem_ker] + exact reducedLog_eq_zero_iff (K := K) S x + +open scoped Classical in +/-- The reduced `S`-unit lattice. -/ +noncomputable def reducedLogLattice : + Submodule ℤ (ReducedLogSpace (K := K) S) := + LinearMap.range (reducedLogLinearMap (K := K) S) + +open scoped Classical in +/-- A reduced logarithmic vector in the lattice vanishes when all of its +finite coordinates have norm less than one. -/ +theorem norm_reducedLog_finite_lt_one_implies_zero + {x : Additive (SUnitGroup (K := K) S)} + (hx : + ‖reducedLog (K := K) S x‖ < 1) : + (reducedLog (K := K) S x).2 = 0 := by + ext v + have hv : + ‖(reducedLog (K := K) S x).2 v‖ < 1 := by + exact + (norm_le_pi_norm _ v).trans_lt + ((norm_snd_le + (reducedLog (K := K) S x)).trans_lt hx) + change + (divisorCoordinate (K := K) S + (Additive.toMul x) v : ℝ) = 0 + change + |(divisorCoordinate (K := K) S + (Additive.toMul x) v : ℝ)| < 1 at hv + rw [← Int.cast_abs, ← Int.cast_one, Int.cast_lt] at hv + exact_mod_cast Int.abs_lt_one_iff.mp hv + +open scoped Classical in +/-- The reduced logarithmic image is discrete. Near the origin the +integral finite coordinates must vanish, reducing the assertion to the +ordinary Dirichlet unit lattice. -/ +instance instDiscreteTopology_reducedLogLattice : + DiscreteTopology (reducedLogLattice (K := K) S) := by + classical + let : + DiscreteTopology + {x : + NumberField.Units.dirichletUnitTheorem.logSpace K // + x ∈ NumberField.Units.unitLattice K} := by + infer_instance + obtain ⟨ε, hεpos, hε⟩ := + Metric.exists_ball_inter_eq_singleton_of_mem_discrete + (s := (NumberField.Units.unitLattice K : + Set + (NumberField.Units.dirichletUnitTheorem.logSpace K))) + DiscreteTopology.isDiscrete + (show + (0 : + NumberField.Units.dirichletUnitTheorem.logSpace K) ∈ + NumberField.Units.unitLattice K by simp) + let δ : ℝ := min ε 1 + have hδpos : 0 < δ := lt_min hεpos zero_lt_one + refine discreteTopology_iff_isOpen_singleton_zero.mpr + ⟨Metric.ball 0 δ, Metric.isOpen_ball, ?_⟩ + ext z + constructor + · intro hz + have hzlt : ‖(z : ReducedLogSpace (K := K) S)‖ < δ := by + simpa [Metric.mem_ball, dist_eq_norm] using hz + obtain ⟨x, hx⟩ := z.property + have hxlog : + reducedLog (K := K) S x = + (z : ReducedLogSpace (K := K) S) := hx + have hfin : + (reducedLog (K := K) S x).2 = 0 := by + apply norm_reducedLog_finite_lt_one_implies_zero + (K := K) S + rw [hxlog] + exact hzlt.trans_le (min_le_right _ _) + have hxdiv : + x ∈ LinearMap.ker + (divisorLinearMap (K := K) S) := by + apply LinearMap.mem_ker.mpr + ext v + have hv := congrFun hfin v + change + divisorCoordinate (K := K) S + (Additive.toMul x) v = 0 + have hvreal : + (divisorCoordinate (K := K) S + (Additive.toMul x) v : ℝ) = 0 := by + simpa [reducedLog] using hv + exact_mod_cast hvreal + rw [← range_fromNumberFieldUnitsLinearMap_eq_ker_divisorLinearMap + (K := K) S] at hxdiv + obtain ⟨u, hu⟩ := hxdiv + have hinf : + NumberField.Units.logEmbedding K u = + (z : ReducedLogSpace (K := K) S).1 := by + rw [← hxlog, ← hu] + simp [fromNumberFieldUnitsLinearMap] + have hunitmem : + NumberField.Units.logEmbedding K u ∈ + NumberField.Units.unitLattice K := by + exact ⟨u, trivial, rfl⟩ + have hunitball : + NumberField.Units.logEmbedding K u ∈ + Metric.ball 0 ε := by + rw [Metric.mem_ball, dist_zero_right] + rw [hinf] + exact + (norm_fst_le + (z : ReducedLogSpace (K := K) S)).trans_lt + (hzlt.trans_le (min_le_left _ _)) + have hunitzero : + NumberField.Units.logEmbedding K u = 0 := by + have : + NumberField.Units.logEmbedding K u ∈ + Metric.ball 0 ε ∩ + (NumberField.Units.unitLattice K : + Set + (NumberField.Units.dirichletUnitTheorem.logSpace K)) := + ⟨hunitball, hunitmem⟩ + rw [hε] at this + exact this + apply Subtype.ext + rw [← hxlog] + apply Prod.ext + · rw [← hu] + simpa [fromNumberFieldUnitsLinearMap] using hunitzero + · exact hfin + · intro hz + have hz0 : z = 0 := by + simpa using hz + subst z + simp [Metric.mem_ball, hδpos] + +open scoped Classical in +/-- The integral rank of the reduced logarithmic lattice is the +Dirichlet unit rank plus the number of finite places in `S`. -/ +theorem finrank_reducedLogLattice : + Module.finrank ℤ (reducedLogLattice (K := K) S) = + NumberField.Units.rank K + S.card := by + let f := reducedLogLinearMap (K := K) S + calc + Module.finrank ℤ (reducedLogLattice (K := K) S) = + Module.finrank ℤ + (Additive (SUnitGroup (K := K) S) ⧸ + LinearMap.ker f) := + f.quotKerEquivRange.symm.finrank_eq + _ = Module.finrank ℤ + (Additive (SUnitGroup (K := K) S) ⧸ + (AddCommGroup.torsion + (Additive + (SUnitGroup (K := K) S))).toIntSubmodule) := by + rw [show LinearMap.ker f = + (AddCommGroup.torsion + (Additive + (SUnitGroup (K := K) S))).toIntSubmodule from + reducedLogLinearMap_ker (K := K) S] + _ = Module.finrank ℤ + (Additive (SUnitGroup (K := K) S)) := by + exact finrank_quotient_torsion_eq + _ = NumberField.Units.rank K + S.card := + finrank (K := K) S + +open scoped Classical in +/-- The reduced logarithmic space has dimension equal to the Dirichlet +unit rank plus the number of finite places in `S`. -/ +theorem finrank_reducedLogSpace : + Module.finrank ℝ (ReducedLogSpace (K := K) S) = + NumberField.Units.rank K + S.card := by + classical + simp [NumberField.Units.rank] + +open scoped Classical in +/-- The reduced logarithmic lattice spans its whole real ambient +space. -/ +theorem reducedLogLattice_span_eq_top : + Submodule.span ℝ + (reducedLogLattice (K := K) S : + Set (ReducedLogSpace (K := K) S)) = ⊤ := by + classical + let : + DiscreteTopology + (Submodule.span ℤ + (reducedLogLattice (K := K) S : + Set (ReducedLogSpace (K := K) S))) := by + rw [Submodule.span_eq] + infer_instance + apply Submodule.eq_top_of_finrank_eq + change + Set.finrank ℝ + (reducedLogLattice (K := K) S : + Set (ReducedLogSpace (K := K) S)) = + Module.finrank ℝ (ReducedLogSpace (K := K) S) + calc + Set.finrank ℝ + (reducedLogLattice (K := K) S : + Set (ReducedLogSpace (K := K) S)) = + Set.finrank ℤ + (reducedLogLattice (K := K) S : + Set (ReducedLogSpace (K := K) S)) := + Real.finrank_eq_int_finrank_of_discrete inferInstance + _ = Module.finrank ℤ + (reducedLogLattice (K := K) S) := by + rw [Set.finrank, Submodule.span_eq] + _ = NumberField.Units.rank K + S.card := + finrank_reducedLogLattice (K := K) S + _ = Module.finrank ℝ + (ReducedLogSpace (K := K) S) := + (finrank_reducedLogSpace (K := K) S).symm + +open scoped Classical in +/-- The reduced logarithmic image of the `S`-units is a complete +`ℤ`-lattice. -/ +instance instIsZLattice_reducedLogLattice : + IsZLattice ℝ (reducedLogLattice (K := K) S) where + span_top := reducedLogLattice_span_eq_top (K := K) S + +section FullLogarithmicSpace + +open scoped Classical in +/-- The places occurring in the `S`-unit theorem: every infinite place +and the finite places belonging to `S`. -/ +abbrev LogPlace := + NumberField.InfinitePlace K ⊕ S + +open scoped Classical in +/-- The ambient real coordinate space indexed by all places occurring +in the `S`-unit theorem. -/ +abbrev FullLogSpace := + LogPlace (K := K) S → ℝ + +open scoped Classical in +/-- Sum of all logarithmic coordinates. -/ +noncomputable def coordinateSum : + FullLogSpace (K := K) S →ₗ[ℝ] ℝ where + toFun z := ∑ p, z p + map_add' x y := by + simp [Finset.sum_add_distrib] + map_smul' c x := by + change + (∑ p : LogPlace (K := K) S, c * x p) = + c * ∑ p : LogPlace (K := K) S, x p + rw [Finset.mul_sum] + +open scoped Classical in +/-- The coordinate-sum-zero hyperplane in the full logarithmic +space. -/ +abbrev LogHyperplane := + LinearMap.ker (coordinateSum (K := K) S) + +open scoped Classical in +/-- The normalized logarithmic absolute-value map at all places in the +`S`-unit theorem. -/ +noncomputable def fullLogAmbient : + Additive (SUnitGroup (K := K) S) →+ + FullLogSpace (K := K) S where + toFun x p := + match p with + | Sum.inl w => + w.mult * + Real.log + (w + (((Additive.toMul x : + SUnitGroup (K := K) S) : Kˣ) : K)) + | Sum.inr v => + Real.log + (NumberField.HeightOneSpectrum.adicAbv K + (v : HeightOneSpectrum (𝓞 K)) + (((Additive.toMul x : + SUnitGroup (K := K) S) : Kˣ) : K)) + map_zero' := by + ext p + cases p <;> simp + map_add' x y := by + ext p + cases p <;> simp [Real.log_mul, mul_add] + +open scoped Classical in +@[simp] +theorem fullLogAmbient_infinite + (x : Additive (SUnitGroup (K := K) S)) + (w : NumberField.InfinitePlace K) : + fullLogAmbient (K := K) S x (Sum.inl w) = + w.mult * + Real.log + (w + (((Additive.toMul x : + SUnitGroup (K := K) S) : Kˣ) : K)) := + rfl + +open scoped Classical in +@[simp] +theorem fullLogAmbient_finite + (x : Additive (SUnitGroup (K := K) S)) (v : S) : + fullLogAmbient (K := K) S x (Sum.inr v) = + Real.log + (NumberField.HeightOneSpectrum.adicAbv K + (v : HeightOneSpectrum (𝓞 K)) + (((Additive.toMul x : + SUnitGroup (K := K) S) : Kˣ) : K)) := + rfl + +open scoped Classical in +/-- An `S`-unit has normalized finite absolute value one outside `S`. -/ +theorem adicAbv_eq_one_of_not_mem + (x : SUnitGroup (K := K) S) + (v : HeightOneSpectrum (𝓞 K)) (hv : v ∉ S) : + NumberField.HeightOneSpectrum.adicAbv K v + (((x : Kˣ) : K)) = 1 := by + rw [NumberField.HeightOneSpectrum.adicAbv_def, + x.property v hv] + simp + +open scoped Classical in +/-- For an `S`-unit the finite part of the global product formula is +the product over the finite places in `S`. -/ +theorem finprod_finitePlace_eq_prod_adicAbv + (x : SUnitGroup (K := K) S) : + (∏ᶠ w : NumberField.FinitePlace K, + w (((x : Kˣ) : K))) = + ∏ v : S, + NumberField.HeightOneSpectrum.adicAbv K + (v : HeightOneSpectrum (𝓞 K)) + (((x : Kˣ) : K)) := by + rw [← finprod_comp_equiv + NumberField.FinitePlace.equivHeightOneSpectrum.symm] + simp_rw + [NumberField.FinitePlace.equivHeightOneSpectrum_symm_apply, + NumberField.FinitePlace.norm_embedding, + NumberField.HeightOneSpectrum.adicAbv_def] + rw [finprod_eq_prod_of_mulSupport_subset + (s := S)] + · exact + (Finset.prod_coe_sort + (s := S) + (f := fun v : HeightOneSpectrum (𝓞 K) => + (NumberField.HeightOneSpectrum.adicAbv K v + (((x : Kˣ) : K))))).symm + · intro v hv + by_contra hnot + apply hv + simp [x.property v hnot] + +open scoped Classical in +/-- Logarithmic form of the product formula, restricted to the places +of the `S`-unit theorem. -/ +theorem sum_log_absoluteValues_eq_zero + (x : SUnitGroup (K := K) S) : + (∑ w : NumberField.InfinitePlace K, + w.mult * Real.log (w (((x : Kˣ) : K)))) + + ∑ v : S, + Real.log + (NumberField.HeightOneSpectrum.adicAbv K + (v : HeightOneSpectrum (𝓞 K)) + (((x : Kˣ) : K))) = 0 := by + have hx0 : (((x : Kˣ) : K)) ≠ 0 := + Units.ne_zero (x : Kˣ) + have hprod := NumberField.prod_abs_eq_one hx0 + rw [finprod_finitePlace_eq_prod_adicAbv + (K := K) S x] at hprod + calc + (∑ w : NumberField.InfinitePlace K, + w.mult * Real.log (w (((x : Kˣ) : K)))) + + ∑ v : S, + Real.log + (NumberField.HeightOneSpectrum.adicAbv K + (v : HeightOneSpectrum (𝓞 K)) + (((x : Kˣ) : K))) = + Real.log + (∏ w : NumberField.InfinitePlace K, + w (((x : Kˣ) : K)) ^ w.mult) + + Real.log + (∏ v : S, + NumberField.HeightOneSpectrum.adicAbv K + (v : HeightOneSpectrum (𝓞 K)) + (((x : Kˣ) : K))) := by + congr 1 + · rw [Real.log_prod] + · apply Finset.sum_congr rfl + intro w _ + rw [Real.log_pow] + · intro w _ + exact pow_ne_zero _ ((w.pos_iff.mpr hx0).ne') + · rw [Real.log_prod] + intro v _ + exact + ((NumberField.HeightOneSpectrum.adicAbv K + (v : HeightOneSpectrum (𝓞 K))).pos_iff.mpr hx0).ne' + _ = Real.log + ((∏ w : NumberField.InfinitePlace K, + w (((x : Kˣ) : K)) ^ w.mult) * + ∏ v : S, + NumberField.HeightOneSpectrum.adicAbv K + (v : HeightOneSpectrum (𝓞 K)) + (((x : Kˣ) : K))) := by + rw [Real.log_mul] + · exact Finset.prod_ne_zero_iff.mpr fun w _ ↦ + pow_ne_zero _ ((w.pos_iff.mpr hx0).ne') + · exact Finset.prod_ne_zero_iff.mpr fun v _ ↦ + ((NumberField.HeightOneSpectrum.adicAbv K + (v : HeightOneSpectrum (𝓞 K))).pos_iff.mpr hx0).ne' + _ = 0 := by + rw [hprod, Real.log_one] + +open scoped Classical in +theorem fullLogAmbient_mem_logHyperplane + (x : Additive (SUnitGroup (K := K) S)) : + fullLogAmbient (K := K) S x ∈ + LogHyperplane (K := K) S := by + apply LinearMap.mem_ker.mpr + change + ∑ p : LogPlace (K := K) S, + fullLogAmbient (K := K) S x p = 0 + rw [Fintype.sum_sum_type] + exact + sum_log_absoluteValues_eq_zero (K := K) S + (Additive.toMul x) + +open scoped Classical in +/-- The normalized all-place logarithmic map with codomain restricted +to the coordinate-sum-zero hyperplane. -/ +noncomputable def fullLog : + Additive (SUnitGroup (K := K) S) →+ + LogHyperplane (K := K) S := + (fullLogAmbient (K := K) S).codRestrict + (LogHyperplane (K := K) S) + (fullLogAmbient_mem_logHyperplane (K := K) S) + +open scoped Classical in +/-- The nonzero scale converting an integral divisor coordinate into +the logarithm of the corresponding normalized finite absolute value. -/ +noncomputable def finiteLogWeight (v : S) : ℝ := + -Real.log + (Ideal.absNorm + (v : HeightOneSpectrum (𝓞 K)).asIdeal : ℝ) + +open scoped Classical in +theorem finiteLogWeight_ne_zero (v : S) : + finiteLogWeight (K := K) S v ≠ 0 := by + have hNv : + (1 : ℝ) < + (Ideal.absNorm + (v : HeightOneSpectrum (𝓞 K)).asIdeal : ℝ) := by + exact_mod_cast + NumberField.HeightOneSpectrum.one_lt_absNorm + (v : HeightOneSpectrum (𝓞 K)) + exact neg_ne_zero.mpr (ne_of_gt (Real.log_pos hNv)) + +open scoped Classical in +/-- Forget the distinguished infinite coordinate and divide the finite +logarithmic coordinates by their nonzero normalizing weights. -/ +noncomputable def forgetDistinguishedLog : + LogHyperplane (K := K) S →ₗ[ℝ] + ReducedLogSpace (K := K) S where + toFun z := + (fun w => (z : FullLogSpace (K := K) S) (Sum.inl w.1), + fun v => + (z : FullLogSpace (K := K) S) (Sum.inr v) / + finiteLogWeight (K := K) S v) + map_add' x y := by + apply Prod.ext + · ext w + rfl + · ext v + simp [add_div] + map_smul' c x := by + apply Prod.ext + · ext w + rfl + · ext v + change + (c * + (x : FullLogSpace (K := K) S) (Sum.inr v)) / + finiteLogWeight (K := K) S v = + c * + ((x : FullLogSpace (K := K) S) (Sum.inr v) / + finiteLogWeight (K := K) S v) + ring + +open scoped Classical in +/-- Forgetting the distinguished logarithmic coordinate is injective on +the product-formula hyperplane. -/ +theorem forgetDistinguishedLog_injective : + Function.Injective (forgetDistinguishedLog (K := K) S) := by + intro x y hxy + have hinf : + ∀ w : + {w : NumberField.InfinitePlace K // + w ≠ + NumberField.Units.dirichletUnitTheorem.w₀}, + (x : FullLogSpace (K := K) S) (Sum.inl w.1) = + (y : FullLogSpace (K := K) S) (Sum.inl w.1) := by + intro w + exact congrFun (congrArg Prod.fst hxy) w + have hfin : + ∀ v : S, + (x : FullLogSpace (K := K) S) (Sum.inr v) = + (y : FullLogSpace (K := K) S) (Sum.inr v) := by + intro v + have hv := congrFun (congrArg Prod.snd hxy) v + exact + (div_left_inj' + (finiteLogWeight_ne_zero (K := K) S v)).mp hv + apply Subtype.ext + funext p + cases p with + | inr v => exact hfin v + | inl w => + by_cases hw : + w = + NumberField.Units.dirichletUnitTheorem.w₀ + · subst w + have hxsum : + (x : FullLogSpace (K := K) S) + (Sum.inl + NumberField.Units.dirichletUnitTheorem.w₀) + + (∑ v : + {w : NumberField.InfinitePlace K // + w ≠ + NumberField.Units.dirichletUnitTheorem.w₀}, + (x : FullLogSpace (K := K) S) + (Sum.inl v.1)) + + ∑ v : S, + (x : FullLogSpace (K := K) S) + (Sum.inr v) = 0 := by + have hxker := LinearMap.mem_ker.mp x.property + change + ∑ p : LogPlace (K := K) S, + (x : FullLogSpace (K := K) S) p = 0 at hxker + rw [Fintype.sum_sum_type, + Fintype.sum_eq_add_sum_subtype_ne _ + NumberField.Units.dirichletUnitTheorem.w₀] at hxker + exact hxker + have hysum : + (y : FullLogSpace (K := K) S) + (Sum.inl + NumberField.Units.dirichletUnitTheorem.w₀) + + (∑ v : + {w : NumberField.InfinitePlace K // + w ≠ + NumberField.Units.dirichletUnitTheorem.w₀}, + (y : FullLogSpace (K := K) S) + (Sum.inl v.1)) + + ∑ v : S, + (y : FullLogSpace (K := K) S) + (Sum.inr v) = 0 := by + have hyker := LinearMap.mem_ker.mp y.property + change + ∑ p : LogPlace (K := K) S, + (y : FullLogSpace (K := K) S) p = 0 at hyker + rw [Fintype.sum_sum_type, + Fintype.sum_eq_add_sum_subtype_ne _ + NumberField.Units.dirichletUnitTheorem.w₀] at hyker + exact hyker + have hsuminf : + (∑ v : + {w : NumberField.InfinitePlace K // + w ≠ + NumberField.Units.dirichletUnitTheorem.w₀}, + (x : FullLogSpace (K := K) S) + (Sum.inl v.1)) = + ∑ v : + {w : NumberField.InfinitePlace K // + w ≠ + NumberField.Units.dirichletUnitTheorem.w₀}, + (y : FullLogSpace (K := K) S) + (Sum.inl v.1) := by + apply Finset.sum_congr rfl + intro v _ + exact hinf v + have hsumfin : + (∑ v : S, + (x : FullLogSpace (K := K) S) + (Sum.inr v)) = + ∑ v : S, + (y : FullLogSpace (K := K) S) + (Sum.inr v) := by + apply Finset.sum_congr rfl + intro v _ + exact hfin v + linarith + · exact hinf ⟨w, hw⟩ + +open scoped Classical in +/-- Every reduced logarithmic vector has a lift to the product-formula +hyperplane. -/ +theorem forgetDistinguishedLog_surjective : + Function.Surjective (forgetDistinguishedLog (K := K) S) := by + intro z + let completed : FullLogSpace (K := K) S := + fun p => + match p with + | Sum.inl w => + if hw : + w = + NumberField.Units.dirichletUnitTheorem.w₀ then + -(∑ v : + {w : NumberField.InfinitePlace K // + w ≠ + NumberField.Units.dirichletUnitTheorem.w₀}, + z.1 v) - + ∑ v : S, + finiteLogWeight (K := K) S v * z.2 v + else + z.1 ⟨w, hw⟩ + | Sum.inr v => + finiteLogWeight (K := K) S v * z.2 v + have hcompleted : + completed ∈ LogHyperplane (K := K) S := by + apply LinearMap.mem_ker.mpr + change + ∑ p : LogPlace (K := K) S, completed p = 0 + rw [Fintype.sum_sum_type, + Fintype.sum_eq_add_sum_subtype_ne _ + NumberField.Units.dirichletUnitTheorem.w₀] + have hw0 : + completed + (Sum.inl + NumberField.Units.dirichletUnitTheorem.w₀) = + -(∑ v : + {w : NumberField.InfinitePlace K // + w ≠ + NumberField.Units.dirichletUnitTheorem.w₀}, + z.1 v) - + ∑ v : S, + finiteLogWeight (K := K) S v * z.2 v := by + simp [completed] + have hinf : + (∑ v : + {w : NumberField.InfinitePlace K // + w ≠ + NumberField.Units.dirichletUnitTheorem.w₀}, + completed (Sum.inl v.1)) = + ∑ v : + {w : NumberField.InfinitePlace K // + w ≠ + NumberField.Units.dirichletUnitTheorem.w₀}, + z.1 v := by + apply Finset.sum_congr rfl + intro v _ + simp [completed, v.property] + have hfin : + (∑ v : S, completed (Sum.inr v)) = + ∑ v : S, + finiteLogWeight (K := K) S v * z.2 v := by + rfl + rw [hw0, hinf, hfin] + ring + let y : LogHyperplane (K := K) S := + ⟨completed, hcompleted⟩ + refine ⟨y, ?_⟩ + apply Prod.ext + · ext w + simp [forgetDistinguishedLog, y, completed, w.property] + · ext v + simp [forgetDistinguishedLog, y, completed, + finiteLogWeight_ne_zero (K := K) S v] + +open scoped Classical in +/-- Removing the distinguished infinite coordinate and rescaling the +finite coordinates is a real linear equivalence. -/ +noncomputable def logHyperplaneEquivReduced : + LogHyperplane (K := K) S ≃ₗ[ℝ] + ReducedLogSpace (K := K) S := + LinearEquiv.ofBijective + (forgetDistinguishedLog (K := K) S) + ⟨forgetDistinguishedLog_injective (K := K) S, + forgetDistinguishedLog_surjective (K := K) S⟩ + +open scoped Classical in +/-- Under the coordinate equivalence, the normalized all-place +logarithm is exactly the reduced logarithm. -/ +theorem logHyperplaneEquivReduced_fullLog + (x : Additive (SUnitGroup (K := K) S)) : + logHyperplaneEquivReduced (K := K) S + (fullLog (K := K) S x) = + reducedLog (K := K) S x := by + apply Prod.ext + · ext w + rfl + · ext v + have hlog : + Real.log + (Ideal.absNorm + (v : HeightOneSpectrum (𝓞 K)).asIdeal : ℝ) ≠ 0 := + neg_ne_zero.mp + (finiteLogWeight_ne_zero (K := K) S v) + change + Real.log + (NumberField.HeightOneSpectrum.adicAbv K + (v : HeightOneSpectrum (𝓞 K)) + (((Additive.toMul x : + SUnitGroup (K := K) S) : Kˣ) : K)) / + finiteLogWeight (K := K) S v = + (divisorCoordinate (K := K) S + (Additive.toMul x) v : ℝ) + rw [log_adicAbv_eq_neg_divisorCoordinate_mul_log_absNorm + (K := K) S] + dsimp [finiteLogWeight] + field_simp [hlog] + +open scoped Classical in +/-- The kernel of the normalized all-place logarithm is the group of +roots of unity. -/ +theorem fullLog_eq_zero_iff + (x : Additive (SUnitGroup (K := K) S)) : + fullLog (K := K) S x = 0 ↔ + x ∈ AddCommGroup.torsion + (Additive (SUnitGroup (K := K) S)) := by + rw [← reducedLog_eq_zero_iff (K := K) S] + constructor + · intro hx + have := congrArg + (logHyperplaneEquivReduced (K := K) S) hx + simpa [logHyperplaneEquivReduced_fullLog] using this + · intro hx + apply (logHyperplaneEquivReduced (K := K) S).injective + rw [logHyperplaneEquivReduced_fullLog, hx, map_zero] + +open scoped Classical in +/-- The coordinate equivalence as a continuous linear equivalence +(both spaces are finite-dimensional). -/ +noncomputable def logHyperplaneContinuousEquivReduced : + LogHyperplane (K := K) S ≃L[ℝ] + ReducedLogSpace (K := K) S := + (logHyperplaneEquivReduced (K := K) S).toContinuousLinearEquiv + +open scoped Classical in +/-- The complete lattice in the coordinate-sum-zero hyperplane. -/ +noncomputable def fullLogLattice : + Submodule ℤ (LogHyperplane (K := K) S) := + ZLattice.comap ℝ + (reducedLogLattice (K := K) S) + (logHyperplaneContinuousEquivReduced + (K := K) S).toLinearMap + +open scoped Classical in +/-- The complete lattice just defined is exactly the image of the +normalized all-place logarithmic map. -/ +theorem fullLogLattice_eq_range : + fullLogLattice (K := K) S = + LinearMap.range + (fullLog (K := K) S).toIntLinearMap := by + ext z + constructor + · intro hz + change + logHyperplaneEquivReduced (K := K) S z ∈ + reducedLogLattice (K := K) S at hz + obtain ⟨x, hx⟩ := hz + refine ⟨x, ?_⟩ + apply (logHyperplaneEquivReduced (K := K) S).injective + change + logHyperplaneEquivReduced (K := K) S + (fullLog (K := K) S x) = + logHyperplaneEquivReduced (K := K) S z + rw [logHyperplaneEquivReduced_fullLog] + exact hx + · rintro ⟨x, rfl⟩ + change + logHyperplaneEquivReduced (K := K) S + (fullLog (K := K) S x) ∈ + reducedLogLattice (K := K) S + rw [logHyperplaneEquivReduced_fullLog] + exact LinearMap.mem_range_self _ x + +open scoped Classical in +instance instDiscreteTopology_fullLogLattice : + DiscreteTopology (fullLogLattice (K := K) S) := + by + change + DiscreteTopology + (ZLattice.comap ℝ + (reducedLogLattice (K := K) S) + (logHyperplaneContinuousEquivReduced + (K := K) S).toLinearMap) + infer_instance + +open scoped Classical in +/-- The image of the normalized all-place logarithmic embedding is a +complete `ℤ`-lattice in the coordinate-sum-zero hyperplane. -/ +instance instIsZLattice_fullLogLattice : + IsZLattice ℝ (fullLogLattice (K := K) S) := + by + change + IsZLattice ℝ + (ZLattice.comap ℝ + (reducedLogLattice (K := K) S) + (logHyperplaneContinuousEquivReduced + (K := K) S).toLinearMap) + infer_instance + +end FullLogarithmicSpace + +section Decomposition + +open scoped Classical in +/-- The logarithmic rank: the number of places in the +`S`-unit theorem minus one. -/ +def logRank : ℕ := + Fintype.card (NumberField.InfinitePlace K) + S.card - 1 + +open scoped Classical in +/-- The additive realization of the roots of unity of `K`. -/ +abbrev RootsOfUnityAdditive := + (NumberField.Units.torsion K).toAddSubgroup.toIntSubmodule + +open scoped Classical in +/-- The additive torsion submodule of the `S`-unit group. -/ +abbrev TorsionAdditive := + Submodule.torsion ℤ + (Additive (SUnitGroup (K := K) S)) + +open scoped Classical in +theorem torsionAdditive_eq : + TorsionAdditive (K := K) S = + (AddCommGroup.torsion + (Additive + (SUnitGroup (K := K) S))).toIntSubmodule := by + apply Submodule.toAddSubgroup_injective + rw [Submodule.torsion_int, + AddSubgroup.toIntSubmodule_toAddSubgroup] + +open scoped Classical in +/-- The torsion-free quotient of the additive `S`-unit group. -/ +abbrev FreeQuotient := + Additive (SUnitGroup (K := K) S) ⧸ + TorsionAdditive (K := K) S + +open scoped Classical in +local instance instModuleFinite_additiveSUnit : + Module.Finite ℤ (Additive (SUnitGroup (K := K) S)) := + moduleFinite (K := K) S + +attribute [local instance] instModuleFinite_additiveSUnit + +open scoped Classical in +/-- The quotient of the additive S-unit group by torsion carries its induced integer module +structure. -/ +local instance instModuleFreeQuotient : + Module ℤ (FreeQuotient (K := K) S) := + Submodule.Quotient.module + (TorsionAdditive (K := K) S) + +attribute [local instance] instModuleFreeQuotient + +open scoped Classical in +local instance instModuleFinite_freeQuotient : + Module.Finite ℤ (FreeQuotient (K := K) S) := + Module.Finite.quotient ℤ + (TorsionAdditive (K := K) S) + +attribute [local instance] instModuleFinite_freeQuotient + +open scoped Classical in +local instance instModuleFree_freeQuotient : + Module.Free ℤ (FreeQuotient (K := K) S) := + Module.free_of_finite_type_torsion_free' + +attribute [local instance] instModuleFree_freeQuotient + +open scoped Classical in +/-- The free quotient has rank `#S - 1`, where `S` here includes all +infinite places. -/ +theorem finrank_freeQuotient : + Module.finrank ℤ (FreeQuotient (K := K) S) = + logRank (K := K) S := by + calc + Module.finrank ℤ (FreeQuotient (K := K) S) = + Module.finrank ℤ + (Additive (SUnitGroup (K := K) S)) := by + exact finrank_quotient_eq_of_le_torsion le_rfl + _ = NumberField.Units.rank K + S.card := + finrank (K := K) S + _ = logRank (K := K) S := by + rw [NumberField.Units.rank] + dsimp [logRank] + have hpos : + 0 < + Fintype.card + (NumberField.InfinitePlace K) := + Fintype.card_pos + omega + +open scoped Classical in +/-- A basis of the free quotient, indexed by its logarithmic rank. -/ +noncomputable def basisFreeQuotient : + Basis (Fin (logRank (K := K) S)) ℤ + (FreeQuotient (K := K) S) := + Basis.reindex + (Module.Free.chooseBasis ℤ + (FreeQuotient (K := K) S)) + (Fintype.equivOfCardEq <| by + rw [← Module.finrank_eq_card_chooseBasisIndex, + finrank_freeQuotient (K := K) S, + Fintype.card_fin]) + +open scoped Classical in +/-- The ordinary roots of unity map linearly and bijectively onto the +torsion in the `S`-unit group. -/ +noncomputable def rootsOfUnityEquivTorsion : + RootsOfUnityAdditive (K := K) ≃ₗ[ℤ] + TorsionAdditive (K := K) S := by + let f : + RootsOfUnityAdditive (K := K) →ₗ[ℤ] + TorsionAdditive (K := K) S := + ((fromNumberFieldUnitsLinearMap (K := K) S).domRestrict + (RootsOfUnityAdditive (K := K))).codRestrict + (TorsionAdditive (K := K) S) fun u => by + rw [torsionAdditive_eq (K := K) S] + change + Additive.toMul + (fromNumberFieldUnitsLinearMap (K := K) S + (u : + Additive (𝓞 K)ˣ)) ∈ + CommGroup.torsion + (SUnitGroup (K := K) S) + rw [torsion_eq_rootsOfUnity_range (K := K) S] + refine + ⟨Additive.toMul + (u : Additive (𝓞 K)ˣ), ?_, rfl⟩ + exact u.property + apply LinearEquiv.ofBijective f + constructor + · intro x y hxy + apply Subtype.ext + apply fromNumberFieldUnitsLinearMap_injective + (K := K) S + exact congrArg Subtype.val hxy + · intro y + have hyadd : + (y : + Additive (SUnitGroup (K := K) S)) ∈ + AddCommGroup.torsion + (Additive (SUnitGroup (K := K) S)) := by + have hy' : + (y : + Additive (SUnitGroup (K := K) S)) ∈ + (AddCommGroup.torsion + (Additive + (SUnitGroup (K := K) S))).toIntSubmodule := by + rw [← torsionAdditive_eq (K := K) S] + exact y.property + exact hy' + have hy : + Additive.toMul + (y : + Additive (SUnitGroup (K := K) S)) ∈ + CommGroup.torsion + (SUnitGroup (K := K) S) := + hyadd + rw [torsion_eq_rootsOfUnity_range (K := K) S] at hy + obtain ⟨u, hu, huy⟩ := hy + let x : RootsOfUnityAdditive (K := K) := + ⟨Additive.ofMul u, hu⟩ + refine ⟨x, ?_⟩ + apply Subtype.ext + apply Additive.toMul.injective + exact huy + +open scoped Classical in +/-- A linear section of the quotient by torsion. It exists because +the quotient is a free, hence projective, `ℤ`-module. -/ +noncomputable def torsionQuotientSection : + FreeQuotient (K := K) S →ₗ[ℤ] + Additive (SUnitGroup (K := K) S) := + (Module.projective_lifting_property + (TorsionAdditive (K := K) S).mkQ + LinearMap.id + (TorsionAdditive (K := K) S).mkQ_surjective).choose + +open scoped Classical in +private theorem torsionQuotientSection_spec : + (TorsionAdditive (K := K) S).mkQ.comp + (torsionQuotientSection (K := K) S) = + LinearMap.id := + (Module.projective_lifting_property + (TorsionAdditive (K := K) S).mkQ + LinearMap.id + (TorsionAdditive (K := K) S).mkQ_surjective).choose_spec + +open scoped Classical in +/-- Splitting the exact sequence consisting of torsion, the `S`-unit +group, and its torsion-free quotient. -/ +noncomputable def torsionProdFreeQuotientEquiv : + Additive (SUnitGroup (K := K) S) ≃ₗ[ℤ] + TorsionAdditive (K := K) S × + FreeQuotient (K := K) S := + (lequivProdOfRightSplitExact + (TorsionAdditive (K := K) S).injective_subtype + (by + rw [Submodule.range_subtype, Submodule.ker_mkQ]) + (show (TorsionAdditive (K := K) S).mkQ.comp + (torsionQuotientSection (K := K) S) = LinearMap.id from + by exact torsionQuotientSection_spec (K := K) S)).symm + +open scoped Classical in +/-- **`S`-unit theorem, decomposition form.** Additively, the +`S`-unit group is the product of the roots of unity and a free +`ℤ`-module of rank `#S - 1`. -/ +noncomputable def decompositionLinearEquiv : + Additive (SUnitGroup (K := K) S) ≃ₗ[ℤ] + RootsOfUnityAdditive (K := K) × + (Fin (logRank (K := K) S) →₀ ℤ) := + (torsionProdFreeQuotientEquiv (K := K) S).trans + ((rootsOfUnityEquivTorsion (K := K) S).symm.prodCongr + (basisFreeQuotient (K := K) S).repr) + +open scoped Classical in +/-- The multiplicative realization of the additive roots-of-unity +submodule is canonically the usual group `μ(K)`. -/ +noncomputable def multiplicativeRootsOfUnityEquiv : + Multiplicative (RootsOfUnityAdditive (K := K)) ≃* + NumberField.Units.torsion K where + toFun x := + ⟨Additive.toMul + ((Multiplicative.toAdd x : + RootsOfUnityAdditive (K := K)) : + Additive (𝓞 K)ˣ), + (Multiplicative.toAdd x : + RootsOfUnityAdditive (K := K)).property⟩ + invFun u := + Multiplicative.ofAdd + (⟨Additive.ofMul (u : (𝓞 K)ˣ), u.property⟩ : + RootsOfUnityAdditive (K := K)) + left_inv x := by + rfl + right_inv u := by + rfl + map_mul' x y := by + rfl + +open scoped Classical in +/-- **`S`-unit theorem, group form.** + +Writing `S` for all infinite places together with the supplied finite +places, the `S`-unit group is `μ(K) × ℤ^(#S-1)`. -/ +noncomputable def decomposition : + SUnitGroup (K := K) S ≃* + NumberField.Units.torsion K × + Multiplicative + (Fin (logRank (K := K) S) →₀ ℤ) := + (AddEquiv.toMultiplicativeRight + (decompositionLinearEquiv + (K := K) S).toAddEquiv).trans + (((MulEquiv.prodMultiplicative + (RootsOfUnityAdditive (K := K)) + (Fin (logRank (K := K) S) →₀ ℤ)) : + Multiplicative + (RootsOfUnityAdditive (K := K) × + (Fin (logRank (K := K) S) →₀ ℤ)) ≃* + Multiplicative (RootsOfUnityAdditive (K := K)) × + Multiplicative + (Fin (logRank (K := K) S) →₀ ℤ)).trans + ((multiplicativeRootsOfUnityEquiv + (K := K)).prodCongr + (MulEquiv.refl + (Multiplicative + (Fin (logRank (K := K) S) →₀ ℤ))))) + +end Decomposition + +end SUnitGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Rank.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Rank.lean new file mode 100644 index 0000000000..137dd31d39 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Rank.lean @@ -0,0 +1,666 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces +public import Mathlib.Algebra.Exact.Basic +public import Mathlib.LinearAlgebra.Dimension.Torsion.Finite +public import Mathlib.LinearAlgebra.StdBasis +public import Mathlib.NumberTheory.NumberField.ClassNumber +public import Mathlib.NumberTheory.NumberField.Units.Regulator +public import Mathlib.RingTheory.DedekindDomain.Factorization +/-! +# Torsion and rank sources for `S`-units + +This file supplies the algebraic rank and torsion input for `S`-units. +The finite set `S` contains the finite places; all infinite places are +understood to be present. +-/ + +@[expose] public section + +noncomputable +section + +open IsDedekindDomain +open scoped NumberField nonZeroDivisors + + +variable {K : Type*} [Field K] [NumberField K] + +namespace SUnitGroup + +/-- The group of ordinary units, expressed as `S`-units for the empty set. -/ +noncomputable def emptyEquivNumberFieldUnits : + ((∅ : Set (HeightOneSpectrum (𝓞 K))).unit K) ≃* (𝓞 K)ˣ := + let eInteger : + ((∅ : Set (HeightOneSpectrum (𝓞 K))).integer K)ˣ ≃* + (⊥ : Subalgebra (𝓞 K) K)ˣ := + Units.mapEquiv + ((Subalgebra.equivOfEq + ((∅ : Set (HeightOneSpectrum (𝓞 K))).integer K) + (⊥ : Subalgebra (𝓞 K) K) + (IsDedekindDomain.integer_empty (𝓞 K) K) : _ ≃ₐ[𝓞 K] _) : _ ≃* _) + let eBot : + (⊥ : Subalgebra (𝓞 K) K)ˣ ≃* (𝓞 K)ˣ := + Units.mapEquiv + ((Algebra.botEquivOfInjective + (IsFractionRing.injective (𝓞 K) K) : _ ≃ₐ[𝓞 K] _) : _ ≃* _) + (Set.unitEquivUnitsInteger + (∅ : Set (HeightOneSpectrum (𝓞 K))) K).trans + (eInteger.trans eBot) + +/-- The canonical embedding of ordinary units into the `S`-unit group. -/ +noncomputable def fromNumberFieldUnits + (S : Finset (HeightOneSpectrum (𝓞 K))) : + (𝓞 K)ˣ →* SUnitGroup (K := K) S where + toFun u := + ⟨((emptyEquivNumberFieldUnits (K := K)).symm u : Kˣ), + fun v _ => + Set.unit_valuation_eq_one + (∅ : Set (HeightOneSpectrum (𝓞 K))) K + ((emptyEquivNumberFieldUnits (K := K)).symm u) (by simp)⟩ + map_one' := by + ext + simp + map_mul' u v := by + ext + simp + +theorem fromNumberFieldUnits_injective + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Function.Injective (fromNumberFieldUnits (K := K) S) := by + intro u v huv + apply (emptyEquivNumberFieldUnits (K := K)).symm.injective + ext + exact congrArg (fun x : SUnitGroup (K := K) S => ((x : Kˣ) : K)) huv + +/-- Torsion in an `S`-unit group consists exactly of the ordinary roots of +unity. -/ +theorem torsion_eq_rootsOfUnity_range + (S : Finset (HeightOneSpectrum (𝓞 K))) : + CommGroup.torsion (SUnitGroup (K := K) S) = + Subgroup.map (fromNumberFieldUnits (K := K) S) + (NumberField.Units.torsion K) := by + ext x + constructor + · intro hx + have hxfin : IsOfFinOrder x := + (CommGroup.mem_torsion (G := SUnitGroup (K := K) S) x).mp hx + obtain ⟨n, hnpos, hxpow⟩ := hxfin.exists_pow_eq_one + have hxK : (((x : Kˣ) : K) ^ n) = 1 := by + simpa using congrArg + (fun y : SUnitGroup (K := K) S => ((y : Kˣ) : K)) hxpow + let y : ((∅ : Set (HeightOneSpectrum (𝓞 K))).unit K) := + ⟨(x : Kˣ), fun v _ => by + have hvpow : + (v.valuation K ((x : Kˣ) : K)) ^ n = 1 := by + rw [← map_pow, hxK, map_one] + exact (pow_eq_one_iff_left + (a := v.valuation K ((x : Kˣ) : K)) + (Nat.ne_of_gt hnpos)).mp hvpow⟩ + let u : (𝓞 K)ˣ := emptyEquivNumberFieldUnits y + have hufin : IsOfFinOrder u := by + exact (emptyEquivNumberFieldUnits (K := K)).toMonoidHom.isOfFinOrder + ((show IsOfFinOrder y from by + refine isOfFinOrder_iff_pow_eq_one.mpr ⟨n, hnpos, ?_⟩ + ext + exact hxK)) + refine ⟨u, ?_, ?_⟩ + · exact (CommGroup.mem_torsion (G := (𝓞 K)ˣ) u).2 hufin + · ext + change + (((emptyEquivNumberFieldUnits (K := K)).symm + (emptyEquivNumberFieldUnits (K := K) y) : Kˣ) : K) = + ((x : Kˣ) : K) + rw [MulEquiv.symm_apply_apply] + · rintro ⟨u, hu, rfl⟩ + exact (CommGroup.mem_torsion + (G := SUnitGroup (K := K) S) + (fromNumberFieldUnits (K := K) S u)).2 + ((fromNumberFieldUnits (K := K) S).isOfFinOrder + ((CommGroup.mem_torsion (G := (𝓞 K)ˣ) u).1 hu)) + +section DivisorMap + +variable (S : Finset (HeightOneSpectrum (𝓞 K))) + +/-- The exponent of the principal fractional ideal of an `S`-unit at a +finite place in `S`. -/ +noncomputable def divisorCoordinate + (x : SUnitGroup (K := K) S) (v : S) : ℤ := + FractionalIdeal.count K (v : HeightOneSpectrum (𝓞 K)) + (FractionalIdeal.spanSingleton (𝓞 K)⁰ ((x : Kˣ) : K)) + +/-- The valuation of a localization fraction is the exponential of the +negative exponent of its principal fractional ideal. -/ +theorem valuation_mk'_eq_exp_neg_count + (v : HeightOneSpectrum (𝓞 K)) {n : 𝓞 K} (hn : n ≠ 0) + (d : (𝓞 K)⁰) : + v.valuation K (IsLocalization.mk' K n d) = + WithZero.exp + (-FractionalIdeal.count K v + (FractionalIdeal.spanSingleton (𝓞 K)⁰ + (IsLocalization.mk' K n d))) := by + classical + have hI : + FractionalIdeal.spanSingleton (𝓞 K)⁰ (IsLocalization.mk' K n d) = + FractionalIdeal.spanSingleton (𝓞 K)⁰ + ((algebraMap (𝓞 K) K) (d : 𝓞 K))⁻¹ * + ↑(Ideal.span {n} : Ideal (𝓞 K)) := by + rw [FractionalIdeal.coeIdeal_span_singleton, + FractionalIdeal.spanSingleton_mul_spanSingleton] + apply congr_arg + rw [IsFractionRing.mk'_eq_div, div_eq_mul_inv, mul_comm] + have hx : + FractionalIdeal.spanSingleton (𝓞 K)⁰ + (IsLocalization.mk' K n d) ≠ 0 := by + rw [FractionalIdeal.spanSingleton_ne_zero_iff, + IsFractionRing.mk'_eq_div, ne_eq, div_eq_zero_iff, not_or] + exact + ⟨(map_ne_zero_iff (algebraMap (𝓞 K) K) + (IsFractionRing.injective (𝓞 K) K)).mpr hn, + map_ne_zero_of_mem_nonZeroDivisors _ + (IsFractionRing.injective (𝓞 K) K) d.property⟩ + have hcount : + FractionalIdeal.count K v + (FractionalIdeal.spanSingleton (𝓞 K)⁰ + (IsLocalization.mk' K n d)) = + ((Associates.mk v.asIdeal).count + (Associates.mk (Ideal.span {n} : Ideal (𝓞 K))).factors - + (Associates.mk v.asIdeal).count + (Associates.mk + (Ideal.span {(d : 𝓞 K)} : Ideal (𝓞 K))).factors : ℤ) := by + exact FractionalIdeal.count_well_defined (K := K) v hx hI + rw [v.valuation_of_mk', v.intValuation_if_neg hn, + v.intValuation_if_neg (nonZeroDivisors.coe_ne_zero d), hcount] + rw [div_eq_mul_inv, ← WithZero.exp_neg, ← WithZero.exp_add] + congr + simp [sub_eq_add_neg, add_comm] + +/-- The adic valuation of a field unit is the exponential of the +negative exponent of its principal fractional ideal. -/ +theorem valuation_eq_exp_neg_count + (x : Kˣ) (v : HeightOneSpectrum (𝓞 K)) : + v.valuation K (x : K) = + WithZero.exp + (-FractionalIdeal.count K v + (FractionalIdeal.spanSingleton (𝓞 K)⁰ (x : K))) := by + obtain ⟨n, d, hnd⟩ := + IsLocalization.exists_mk'_eq (𝓞 K)⁰ (x : K) + have hn : n ≠ 0 := by + intro hn0 + apply Units.ne_zero x + rw [← hnd, hn0, IsFractionRing.mk'_eq_div, map_zero, zero_div] + rw [← hnd] + exact valuation_mk'_eq_exp_neg_count (K := K) v hn d + +/-- A field unit has valuation one exactly when its principal fractional +ideal has exponent zero at the place. -/ +theorem valuation_eq_one_iff_count_eq_zero + (x : Kˣ) (v : HeightOneSpectrum (𝓞 K)) : + v.valuation K (x : K) = 1 ↔ + FractionalIdeal.count K v + (FractionalIdeal.spanSingleton (𝓞 K)⁰ (x : K)) = 0 := by + rw [valuation_eq_exp_neg_count (K := K) x v] + constructor + · intro h + exact neg_eq_zero.mp (WithZero.exp_eq_one.mp h) + · intro h + simp [h] + +theorem divisorCoordinate_eq_zero_iff + (x : SUnitGroup (K := K) S) (v : S) : + divisorCoordinate (K := K) S x v = 0 ↔ + (v : HeightOneSpectrum (𝓞 K)).valuation K ((x : Kˣ) : K) = 1 := by + exact (valuation_eq_one_iff_count_eq_zero + (K := K) (x : Kˣ) (v : HeightOneSpectrum (𝓞 K))).symm + +theorem divisorCoordinate_mul + (x y : SUnitGroup (K := K) S) (v : S) : + divisorCoordinate (K := K) S (x * y) v = + divisorCoordinate (K := K) S x v + + divisorCoordinate (K := K) S y v := by + change + FractionalIdeal.count K (v : HeightOneSpectrum (𝓞 K)) + (FractionalIdeal.spanSingleton (𝓞 K)⁰ + ((((x : Kˣ) : K) * ((y : Kˣ) : K)))) = + FractionalIdeal.count K (v : HeightOneSpectrum (𝓞 K)) + (FractionalIdeal.spanSingleton (𝓞 K)⁰ ((x : Kˣ) : K)) + + FractionalIdeal.count K (v : HeightOneSpectrum (𝓞 K)) + (FractionalIdeal.spanSingleton (𝓞 K)⁰ ((y : Kˣ) : K)) + rw [← FractionalIdeal.spanSingleton_mul_spanSingleton, + FractionalIdeal.count_mul] + · exact FractionalIdeal.spanSingleton_ne_zero_iff.mpr + (Units.ne_zero (x : Kˣ)) + · exact FractionalIdeal.spanSingleton_ne_zero_iff.mpr + (Units.ne_zero (y : Kˣ)) + +theorem divisorCoordinate_one (v : S) : + divisorCoordinate (K := K) S 1 v = 0 := by + simp [divisorCoordinate, FractionalIdeal.count_one] + +/-- The additive principal-divisor map on `S`-units. -/ +noncomputable def divisor : + Additive (SUnitGroup (K := K) S) →+ + (S → ℤ) where + toFun x v := divisorCoordinate (K := K) S (Additive.toMul x) v + map_zero' := by + ext v + exact divisorCoordinate_one (K := K) S v + map_add' x y := by + ext v + exact divisorCoordinate_mul (K := K) S + (Additive.toMul x) (Additive.toMul y) v + +/-- The `ℤ`-linear principal-divisor map on `S`-units. -/ +noncomputable def divisorLinearMap : + Additive (SUnitGroup (K := K) S) →ₗ[ℤ] (S → ℤ) := + (divisor (K := K) S).toIntLinearMap + +/-- The additive linearization of the ordinary-unit embedding. -/ +noncomputable def fromNumberFieldUnitsLinearMap : + Additive (𝓞 K)ˣ →ₗ[ℤ] + Additive (SUnitGroup (K := K) S) := + (MonoidHom.toAdditive + (fromNumberFieldUnits (K := K) S)).toIntLinearMap + +theorem fromNumberFieldUnitsLinearMap_injective : + Function.Injective (fromNumberFieldUnitsLinearMap (K := K) S) := by + intro x y hxy + apply Additive.toMul.injective + exact fromNumberFieldUnits_injective (K := K) S + (congrArg Additive.toMul hxy) + +/-- An `S`-unit in the kernel of the divisor map has valuation one at every +finite place. -/ +theorem valuation_eq_one_of_mem_ker_divisorLinearMap + {x : Additive (SUnitGroup (K := K) S)} + (hx : x ∈ LinearMap.ker (divisorLinearMap (K := K) S)) + (v : HeightOneSpectrum (𝓞 K)) : + v.valuation K + ((((Additive.toMul x : + SUnitGroup (K := K) S) : Kˣ) : K)) = 1 := by + by_cases hv : v ∈ S + · let vv : S := ⟨v, hv⟩ + apply (divisorCoordinate_eq_zero_iff (K := K) S + (Additive.toMul x) vv).1 + have hxzero : + divisorLinearMap (K := K) S x = 0 := + LinearMap.mem_ker.mp hx + simpa [divisorLinearMap, divisor] using congrFun hxzero vv + · exact (Additive.toMul x : + SUnitGroup (K := K) S).property v hv + +/-- An `S`-unit in the divisor kernel, regarded as an `S`-unit for the +empty set. -/ +noncomputable def kerDivisorToEmptySUnits + (x : LinearMap.ker (divisorLinearMap (K := K) S)) : + ((∅ : Set (HeightOneSpectrum (𝓞 K))).unit K) := + ⟨((Additive.toMul (x : Additive (SUnitGroup (K := K) S)) : + SUnitGroup (K := K) S) : Kˣ), + fun v _ => + valuation_eq_one_of_mem_ker_divisorLinearMap + (K := K) S x.property v⟩ + +/-- Ordinary units are exactly the kernel of the `S`-unit divisor map. -/ +theorem range_fromNumberFieldUnitsLinearMap_eq_ker_divisorLinearMap : + LinearMap.range (fromNumberFieldUnitsLinearMap (K := K) S) = + LinearMap.ker (divisorLinearMap (K := K) S) := by + ext x + constructor + · rintro ⟨u, rfl⟩ + apply LinearMap.mem_ker.mpr + ext v + apply (divisorCoordinate_eq_zero_iff (K := K) S + (fromNumberFieldUnits (K := K) S (Additive.toMul u)) v).2 + exact Set.unit_valuation_eq_one + (∅ : Set (HeightOneSpectrum (𝓞 K))) K + ((emptyEquivNumberFieldUnits (K := K)).symm (Additive.toMul u)) + (by simp) + · intro hx + let y := kerDivisorToEmptySUnits (K := K) S ⟨x, hx⟩ + let u : (𝓞 K)ˣ := emptyEquivNumberFieldUnits y + refine ⟨Additive.ofMul u, ?_⟩ + apply Additive.toMul.injective + change + fromNumberFieldUnits (K := K) S u = Additive.toMul x + apply Subtype.ext + change + ((emptyEquivNumberFieldUnits (K := K)).symm u : Kˣ) = + ((Additive.toMul x : SUnitGroup (K := K) S) : Kˣ) + dsimp [u] + rw [MulEquiv.symm_apply_apply] + rfl + +end DivisorMap + +section PrimePowerSources + +variable (S : Finset (HeightOneSpectrum (𝓞 K))) + +/-- The class-number power of a prime ideal is principal. -/ +theorem primeIdealPower_classNumber_isPrincipal (v : S) : + ((v : HeightOneSpectrum (𝓞 K)).asIdeal ^ + NumberField.classNumber K).IsPrincipal := by + have hv0 : + (v : HeightOneSpectrum (𝓞 K)).asIdeal ^ + NumberField.classNumber K ≠ 0 := + pow_ne_zero _ (v : HeightOneSpectrum (𝓞 K)).ne_bot + apply (ClassGroup.mk0_eq_one_iff + (mem_nonZeroDivisors_iff_ne_zero.mpr hv0)).mp + have hpow : + (ClassGroup.mk0 + ⟨(v : HeightOneSpectrum (𝓞 K)).asIdeal, + mem_nonZeroDivisors_iff_ne_zero.mpr + (v : HeightOneSpectrum (𝓞 K)).ne_bot⟩) ^ + Fintype.card (ClassGroup (𝓞 K)) = 1 := + pow_card_eq_one + (x := ClassGroup.mk0 + ⟨(v : HeightOneSpectrum (𝓞 K)).asIdeal, + mem_nonZeroDivisors_iff_ne_zero.mpr + (v : HeightOneSpectrum (𝓞 K)).ne_bot⟩) + let I : (Ideal (𝓞 K))⁰ := + ⟨(v : HeightOneSpectrum (𝓞 K)).asIdeal, + mem_nonZeroDivisors_iff_ne_zero.mpr + (v : HeightOneSpectrum (𝓞 K)).ne_bot⟩ + have hsub : + (⟨(v : HeightOneSpectrum (𝓞 K)).asIdeal ^ + NumberField.classNumber K, + mem_nonZeroDivisors_iff_ne_zero.mpr hv0⟩ : + (Ideal (𝓞 K))⁰) = + I ^ NumberField.classNumber K := by + rfl + rw [hsub, map_pow] + exact hpow + +/-- A generator of the principal `classNumber K`-th power of a prime ideal. -/ +private noncomputable def primePowerGenerator (v : S) : 𝓞 K := + let I := + (v : HeightOneSpectrum (𝓞 K)).asIdeal ^ + NumberField.classNumber K + letI : I.IsPrincipal := + primeIdealPower_classNumber_isPrincipal (K := K) S v + Submodule.IsPrincipal.generator I + +private theorem span_primePowerGenerator (v : S) : + Ideal.span {primePowerGenerator (K := K) S v} = + (v : HeightOneSpectrum (𝓞 K)).asIdeal ^ + NumberField.classNumber K := by + let I := + (v : HeightOneSpectrum (𝓞 K)).asIdeal ^ + NumberField.classNumber K + let : I.IsPrincipal := + primeIdealPower_classNumber_isPrincipal (K := K) S v + simp [primePowerGenerator] + +private theorem primePowerGenerator_ne_zero (v : S) : + primePowerGenerator (K := K) S v ≠ 0 := by + intro hzero + have hv0 : + (v : HeightOneSpectrum (𝓞 K)).asIdeal ^ + NumberField.classNumber K ≠ 0 := + pow_ne_zero _ (v : HeightOneSpectrum (𝓞 K)).ne_bot + apply hv0 + rw [← span_primePowerGenerator (K := K) S v, hzero] + simp + +private theorem spanSingleton_primePowerGenerator (v : S) : + FractionalIdeal.spanSingleton (𝓞 K)⁰ + (algebraMap (𝓞 K) K (primePowerGenerator (K := K) S v)) = + ((v : HeightOneSpectrum (𝓞 K)).asIdeal : + FractionalIdeal (𝓞 K)⁰ K) ^ NumberField.classNumber K := by + rw [← FractionalIdeal.coeIdeal_span_singleton, + span_primePowerGenerator (K := K) S v, + FractionalIdeal.coeIdeal_pow] + +/-- An `S`-unit whose divisor is `classNumber K` times the basis divisor at +`v`. -/ +private noncomputable def primePowerSUnit (v : S) : + SUnitGroup (K := K) S := + ⟨Units.mk0 + (algebraMap (𝓞 K) K (primePowerGenerator (K := K) S v)) + ((map_ne_zero_iff (algebraMap (𝓞 K) K) + (IsFractionRing.injective (𝓞 K) K)).mpr + (primePowerGenerator_ne_zero (K := K) S v)), + fun w hw => by + apply (valuation_eq_one_iff_count_eq_zero (K := K) + (Units.mk0 + (algebraMap (𝓞 K) K (primePowerGenerator (K := K) S v)) + ((map_ne_zero_iff (algebraMap (𝓞 K) K) + (IsFractionRing.injective (𝓞 K) K)).mpr + (primePowerGenerator_ne_zero (K := K) S v))) w).2 + change + FractionalIdeal.count K w + (FractionalIdeal.spanSingleton (𝓞 K)⁰ + (algebraMap (𝓞 K) K + (primePowerGenerator (K := K) S v))) = 0 + rw [spanSingleton_primePowerGenerator (K := K) S v, + FractionalIdeal.count_pow] + have hwv : + (v : HeightOneSpectrum (𝓞 K)) ≠ w := by + intro hvw + exact hw (hvw ▸ v.property) + rw [FractionalIdeal.count_maximal_coprime K w hwv] + simp⟩ + +private noncomputable def classNumberBasisVector (v : S) : S → ℤ := by + classical + exact fun w => + if w = v then (NumberField.classNumber K : ℤ) else 0 + +private theorem divisorCoordinate_primePowerSUnit + (v w : S) : + divisorCoordinate (K := K) S (primePowerSUnit (K := K) S v) w = + classNumberBasisVector (K := K) S v w := by + classical + change + FractionalIdeal.count K (w : HeightOneSpectrum (𝓞 K)) + (FractionalIdeal.spanSingleton (𝓞 K)⁰ + (algebraMap (𝓞 K) K + (primePowerGenerator (K := K) S v))) = + classNumberBasisVector (K := K) S v w + simp only [classNumberBasisVector] + rw [spanSingleton_primePowerGenerator (K := K) S v] + split_ifs with hwv + · subst w + simpa using + FractionalIdeal.count_pow_self K + (v : HeightOneSpectrum (𝓞 K)) + (NumberField.classNumber K) + · rw [FractionalIdeal.count_pow] + have hvw : + (v : HeightOneSpectrum (𝓞 K)) ≠ + (w : HeightOneSpectrum (𝓞 K)) := by + intro h + exact hwv (Subtype.ext h.symm) + rw [FractionalIdeal.count_maximal_coprime K + (w : HeightOneSpectrum (𝓞 K)) hvw] + simp + +end PrimePowerSources + +section Rank + +variable (S : Finset (HeightOneSpectrum (𝓞 K))) + +private noncomputable def divisorRangeVector (v : S) : + LinearMap.range (divisorLinearMap (K := K) S) := + ⟨classNumberBasisVector (K := K) S v, + ⟨Additive.ofMul (primePowerSUnit (K := K) S v), by + ext w + exact divisorCoordinate_primePowerSUnit (K := K) S v w⟩⟩ + +private theorem divisorRangeVector_linearIndependent : + LinearIndependent ℤ (divisorRangeVector (K := K) S) := by + classical + rw [Fintype.linearIndependent_iff] + intro g hg v + have hv := congrArg + (fun z : LinearMap.range (divisorLinearMap (K := K) S) => + ((z : S → ℤ) v)) hg + simp [divisorRangeVector, classNumberBasisVector] at hv + exact hv.resolve_right (NumberField.classNumber_ne_zero K) + +/-- The divisor-map range on `S`-units has rank equal to the number of +places in `S`. -/ +theorem finrank_divisor_range : + Module.finrank ℤ + (LinearMap.range (divisorLinearMap (K := K) S)) = + S.card := by + let : Module.Finite ℤ (S → ℤ) := inferInstance + let : Module.Finite ℤ + (LinearMap.range (divisorLinearMap (K := K) S)) := + Module.Finite.of_fg + (IsNoetherian.noetherian + (LinearMap.range (divisorLinearMap (K := K) S))) + apply le_antisymm + · calc + Module.finrank ℤ + (LinearMap.range (divisorLinearMap (K := K) S)) ≤ + Module.finrank ℤ (S → ℤ) := + Submodule.finrank_le + (LinearMap.range (divisorLinearMap (K := K) S)) + _ = S.card := by simp + · simpa using + (divisorRangeVector_linearIndependent (K := K) S).fintype_card_le_finrank + +/-- The additive group of `S`-units is finitely generated over `ℤ`. -/ +theorem moduleFinite : + Module.Finite ℤ (Additive (SUnitGroup (K := K) S)) := by + let : Module.Finite ℤ (S → ℤ) := inferInstance + have : Module.Finite ℤ + (LinearMap.range (divisorLinearMap (K := K) S)) := + Module.Finite.of_fg + (IsNoetherian.noetherian + (LinearMap.range (divisorLinearMap (K := K) S))) + rw [Module.finite_def] + refine Submodule.fg_of_fg_map_of_fg_inf_ker + (divisorLinearMap (K := K) S) ?_ ?_ + · rw [Submodule.map_top] + exact IsNoetherian.noetherian + (LinearMap.range (divisorLinearMap (K := K) S)) + · rw [inf_of_le_right le_top, + ← range_fromNumberFieldUnitsLinearMap_eq_ker_divisorLinearMap + (K := K) S] + exact Submodule.fg_range + (fromNumberFieldUnitsLinearMap (K := K) S) + +/-- The kernel of the `S`-unit divisor map has the ordinary unit rank. -/ +theorem finrank_divisor_ker : + Module.finrank ℤ + (LinearMap.ker (divisorLinearMap (K := K) S)) = + NumberField.Units.rank K := by + calc + Module.finrank ℤ + (LinearMap.ker (divisorLinearMap (K := K) S)) = + Module.finrank ℤ + (LinearMap.range + (fromNumberFieldUnitsLinearMap (K := K) S)) := + (LinearEquiv.ofEq _ _ + (range_fromNumberFieldUnitsLinearMap_eq_ker_divisorLinearMap + (K := K) S).symm).finrank_eq + _ = Module.finrank ℤ (Additive (𝓞 K)ˣ) := + (LinearEquiv.ofInjective + (fromNumberFieldUnitsLinearMap (K := K) S) + (fromNumberFieldUnitsLinearMap_injective (K := K) S)).symm.finrank_eq + _ = NumberField.Units.rank K := + NumberField.Units.finrank_eq K + +/-- The free rank of the `S`-unit group is the ordinary Dirichlet rank plus +the number of finite places in `S`. -/ +theorem finrank : + Module.finrank ℤ (Additive (SUnitGroup (K := K) S)) = + NumberField.Units.rank K + S.card := by + let : Module.Finite ℤ + (Additive (SUnitGroup (K := K) S)) := + moduleFinite (K := K) S + let : Module.Finite ℤ (S → ℤ) := inferInstance + let : Module.Finite ℤ + (LinearMap.range (divisorLinearMap (K := K) S)) := + Module.Finite.of_fg + (IsNoetherian.noetherian + (LinearMap.range (divisorLinearMap (K := K) S))) + let : Module.Finite ℤ + (LinearMap.ker (divisorLinearMap (K := K) S)) := + Module.Finite.of_fg + (IsNoetherian.noetherian + (LinearMap.ker (divisorLinearMap (K := K) S))) + have hrank : + Module.rank ℤ (Additive (SUnitGroup (K := K) S)) = + Module.rank ℤ + (LinearMap.range (divisorLinearMap (K := K) S)) + + Module.rank ℤ + (LinearMap.ker (divisorLinearMap (K := K) S)) := by + have h := + LinearMap.rank_eq_of_surjective + (f := (divisorLinearMap (K := K) S).rangeRestrict) + (divisorLinearMap (K := K) S).surjective_rangeRestrict + rw [LinearMap.ker_rangeRestrict] at h + exact h + have hcard : + (Module.finrank ℤ + (Additive (SUnitGroup (K := K) S)) : Cardinal) = + (Module.finrank ℤ + (LinearMap.range (divisorLinearMap (K := K) S)) : Cardinal) + + (Module.finrank ℤ + (LinearMap.ker (divisorLinearMap (K := K) S)) : Cardinal) := by + rw [Module.finrank_eq_rank, Module.finrank_eq_rank, + (LinearMap.ker (divisorLinearMap (K := K) S)).finrank_eq_rank] + exact hrank + rw [← Nat.cast_inj (R := Cardinal), Nat.cast_add] + calc + (Module.finrank ℤ + (Additive (SUnitGroup (K := K) S)) : Cardinal) = + (Module.finrank ℤ + (LinearMap.range (divisorLinearMap (K := K) S)) : Cardinal) + + (Module.finrank ℤ + (LinearMap.ker (divisorLinearMap (K := K) S)) : Cardinal) := + hcard + _ = (S.card : Cardinal) + + (NumberField.Units.rank K : Cardinal) := by + rw [finrank_divisor_range (K := K) S, + finrank_divisor_ker (K := K) S] + _ = (NumberField.Units.rank K : Cardinal) + + (S.card : Cardinal) := by rw [add_comm] + +/-- The `S`-unit rank in quotient-by-torsion form. -/ +theorem finrank_modTorsion : + Module.finrank ℤ + (Additive + (SUnitGroup (K := K) S ⧸ + CommGroup.torsion (SUnitGroup (K := K) S))) = + NumberField.Units.rank K + S.card := by + calc + Module.finrank ℤ + (Additive + (SUnitGroup (K := K) S ⧸ + CommGroup.torsion (SUnitGroup (K := K) S))) = + Module.finrank ℤ (Additive (SUnitGroup (K := K) S)) := by + simpa using! + (finrank_quotient_torsion_eq + (M := Additive (SUnitGroup (K := K) S))) + _ = NumberField.Units.rank K + S.card := + finrank (K := K) S + +/-- Cardinality form of the `S`-unit rank: +`#S_infinite + #S_finite - 1`. -/ +theorem finrank_modTorsion_eq_card_infinitePlaces_add_card_sub_one : + Module.finrank ℤ + (Additive + (SUnitGroup (K := K) S ⧸ + CommGroup.torsion (SUnitGroup (K := K) S))) = + Fintype.card (NumberField.InfinitePlace K) + S.card - 1 := by + rw [finrank_modTorsion (K := K) S, NumberField.Units.rank] + have hpos : + 0 < Fintype.card (NumberField.InfinitePlace K) := + Fintype.card_pos + omega + +end Rank + +end SUnitGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SeparableClosureEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SeparableClosureEmbedding.lean new file mode 100644 index 0000000000..33d4af16c5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SeparableClosureEmbedding.lean @@ -0,0 +1,96 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.IsSepClosed +public import Mathlib.FieldTheory.KrullTopology +public import Mathlib.NumberTheory.NumberField.Basic +/-! +# Embeddings into a separable closure + +This file provides the common realization of a separable extension inside the +chosen separable closure of its base field. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory + +universe u v + +/-- Conjugation by a field equivalence is continuous on automorphism +groups equipped with the Krull topology. -/ +theorem continuous_algEquiv_autCongr + {F E E' : Type*} + [Field F] [Field E] [Field E'] + [Algebra F E] [Algebra F E'] + (e : E ≃ₐ[F] E') : + Continuous (AlgEquiv.autCongr e) := by + apply continuous_of_continuousAt_one _ + rw [continuousAt_def] + intro s hs + rw [map_one, krullTopology_mem_nhds_one_iff] at hs + obtain ⟨M, hMfinite, hMs⟩ := hs + let : FiniteDimensional F M := hMfinite + let N : IntermediateField F E := + M.map e.symm.toAlgHom + let : FiniteDimensional F N := + (M.equivMap e.symm.toAlgHom).toLinearEquiv.finiteDimensional + rw [krullTopology_mem_nhds_one_iff] + refine ⟨N, inferInstance, ?_⟩ + intro σ hσ + apply hMs + apply (IntermediateField.mem_fixingSubgroup_iff M + (AlgEquiv.autCongr e σ)).2 + intro x hx + have hxN : e.symm x ∈ N := + ⟨x, hx, rfl⟩ + have hfix := + (IntermediateField.mem_fixingSubgroup_iff N σ).1 hσ + (e.symm x) hxN + change e (σ (e.symm x)) = x + rw [hfix, e.apply_symm_apply] + +variable (K : Type u) (L : Type v) [Field K] [Field L] [Algebra K L] + [Algebra.IsSeparable K L] + +/-- A chosen embedding of a separable extension into the separable closure of +its base field. -/ +noncomputable def separableEmbeddingIntoSeparableClosure : + L →ₐ[K] SeparableClosure K := + IsSepClosed.lift + +variable (K : Type*) [Field K] [NumberField K] + +/-- A chosen `ℚ`-embedding of a number field into mathlib's fixed +separable closure of `ℚ`. -/ +noncomputable def numberFieldSeparableClosureEmbedding : + K →ₐ[ℚ] SeparableClosure ℚ := + IsSepClosed.lift + +/-- The actual copy of `K` cut out by the chosen embedding into +`SeparableClosure ℚ`. -/ +def numberFieldInRationalSeparableClosure : + IntermediateField ℚ (SeparableClosure ℚ) := + (numberFieldSeparableClosureEmbedding K).fieldRange + +noncomputable instance + numberFieldInRationalSeparableClosure_finiteDimensional : + FiniteDimensional ℚ + (numberFieldInRationalSeparableClosure K) := + ((numberFieldSeparableClosureEmbedding K).equivFieldRange.toLinearEquiv).finiteDimensional + +noncomputable instance + numberFieldInRationalSeparableClosure_numberField : + NumberField (numberFieldInRationalSeparableClosure K) where + to_charZero := inferInstance + to_finiteDimensional := inferInstance + +end AlgebraicNumberTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/TensorProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/TensorProduct.lean new file mode 100644 index 0000000000..f97a1fd60a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/TensorProduct.lean @@ -0,0 +1,153 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.LinearDisjoint +public import Mathlib.LinearAlgebra.Dimension.Constructions +public import Mathlib.LinearAlgebra.TensorProduct.Basis +/-! +# Coprime tensor-product base change of a Galois extension + +The roots-of-unity descent uses the following concrete fact. If finite field +extensions `M / K` and `L / K` have +coprime degrees, then `M ⊗[K] L` is a field. If `L / K` is Galois, +the resulting extension over `M` is Galois of the same degree. + +The proof constructs the field structure from linear disjointness. +For Galoisness, every automorphism of `L / K` is extended by +`id_M ⊗ σ`; these distinct automorphisms already account for the full +dimension of the tensor product. +-/ + +@[expose] public section + +open scoped TensorProduct + +noncomputable +section + +universe u + +variable + (K M L : Type u) + [Field K] [Field M] [Field L] + [Algebra K M] [Algebra K L] + [hKM : FiniteDimensional K M] + [hKL : FiniteDimensional K L] + +/-- Coprime finite field extensions are linearly disjoint, hence their +tensor product is a field. -/ +theorem tensorProduct_isField_of_finrank_coprime + (hcoprime : + (Module.finrank K M).Coprime + (Module.finrank K L)) : + IsField (M ⊗[K] L) := by + let Ω := AlgebraicClosure K + let iM : M →ₐ[K] Ω := IsAlgClosed.lift + let iL : L →ₐ[K] Ω := IsAlgClosed.lift + let eM : M ≃ₐ[K] iM.fieldRange := + AlgEquiv.ofInjectiveField iM + let eL : L ≃ₐ[K] iL.fieldRange := + AlgEquiv.ofInjectiveField iL + have hdegrees : + (Module.finrank K iM.fieldRange).Coprime + (Module.finrank K iL.fieldRange) := by + rw [← eM.toLinearEquiv.finrank_eq, + ← eL.toLinearEquiv.finrank_eq] + exact hcoprime + have hdisjoint : + iM.fieldRange.LinearDisjoint iL.fieldRange := + IntermediateField.LinearDisjoint.of_finrank_coprime + hdegrees + exact + IntermediateField.LinearDisjoint.isField_of_isAlgebraic' + hdisjoint + (Or.inl (Algebra.IsAlgebraic.of_finite K M)) + +section TensorAutomorphisms + +variable [hGalois : IsGalois K L] + +/-- Extend a `K`-automorphism of `L` to the coprime tensor base +change, fixing the left factor `M`. -/ +def tensorBaseChangeAut + (σ : L ≃ₐ[K] L) : + (M ⊗[K] L) ≃ₐ[M] (M ⊗[K] L) := + { (Algebra.TensorProduct.congr + (AlgEquiv.refl : M ≃ₐ[K] M) σ).toRingEquiv with + commutes' := by + intro m + simp [Algebra.TensorProduct.algebraMap_apply] } + +omit hKM hKL hGalois in +@[simp] +theorem tensorBaseChangeAut_tmul + (σ : L ≃ₐ[K] L) + (m : M) (x : L) : + tensorBaseChangeAut K M L σ (m ⊗ₜ[K] x) = + m ⊗ₜ[K] σ x := by + simp [tensorBaseChangeAut] + +omit hKM hKL hGalois in +/-- Distinct automorphisms remain distinct after tensor base change. -/ +theorem tensorBaseChangeAut_injective : + Function.Injective (tensorBaseChangeAut K M L) := by + intro σ τ hστ + apply AlgEquiv.ext + intro x + have hx := + DFunLike.congr_fun hστ + ((1 : M) ⊗ₜ[K] x) + have htensor : + (1 : M) ⊗ₜ[K] σ x = + (1 : M) ⊗ₜ[K] τ x := by + simpa using hx + exact + (Algebra.TensorProduct.includeRight + (R := K) (A := M) (B := L)).injective + htensor + +/-- Galoisness survives the coprime tensor-product base change. -/ +theorem tensorProduct_isGalois_of_finrank_coprime + (hcoprime : + (Module.finrank K M).Coprime + (Module.finrank K L)) : + letI : Field (M ⊗[K] L) := + (tensorProduct_isField_of_finrank_coprime + K M L hcoprime).toField + IsGalois M (M ⊗[K] L) := by + let N := M ⊗[K] L + let : Field N := + (tensorProduct_isField_of_finrank_coprime + K M L hcoprime).toField + have hfinite : FiniteDimensional M N := by + exact Module.Finite.of_restrictScalars_finite K M N + let : FiniteDimensional M N := hfinite + have hlow : + Nat.card (L ≃ₐ[K] L) ≤ + Nat.card (N ≃ₐ[M] N) := + Nat.card_le_card_of_injective + (tensorBaseChangeAut K M L) + (tensorBaseChangeAut_injective K M L) + have hdim : + Module.finrank M N = Module.finrank K L := by + exact Module.finrank_baseChange + have hlow' : + Module.finrank M N ≤ + Nat.card (N ≃ₐ[M] N) := by + rw [hdim, ← IsGalois.card_aut_eq_finrank K L] + exact hlow + have hupp : + Nat.card (N ≃ₐ[M] N) ≤ + Module.finrank M N := by + rw [Nat.card_eq_fintype_card] + exact AlgEquiv.card_le + exact + IsGalois.of_card_aut_eq_finrank M N + (Nat.le_antisymm hupp hlow') + +end TensorAutomorphisms diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/All.lean new file mode 100644 index 0000000000..112b4d697a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/All.lean @@ -0,0 +1,38 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.All +/-! +# Class field theory + +This is the canonical entry point for the class field theory library. +Its import closure is the complete production-library inventory. + +The library contains local class field theory and global class field theory +for number fields, including the Hilbert product formula, general +power-residue reciprocity, and Gauss quadratic reciprocity, together with the +Hasse--Arf and Kronecker--Weber theorems. Shared valuation, ramification, +cohomology, Kummer, local-field, and Lubin--Tate infrastructure lives beside +those theories rather than under a theorem-specific directory. + +For a smaller production dependency closure, import +`LocalClassFieldTheory`, `GlobalClassFieldTheory`, `HasseArf`, or +`KroneckerWeber` directly. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions.lean new file mode 100644 index 0000000000..6350ab8a81 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions.lean @@ -0,0 +1,19 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/All.lean new file mode 100644 index 0000000000..a15c06360c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/All.lean @@ -0,0 +1,24 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.All +/-! +# Class field theory definitions + +Reader-facing vocabulary used by the headline theorem modules. Primitive +leaves import Mathlib only; derived leaves import only the prerequisite +definition leaves. Topic-level `All` modules and this root module are +aggregation-only, and no public definition imports an implementation module. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields.lean new file mode 100644 index 0000000000..7dbde4630f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields.lean @@ -0,0 +1,33 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.EmbedsInRayClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNormExponentMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealModulusProjection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassPrimeToIdeals +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/All.lean new file mode 100644 index 0000000000..9f420859fc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/All.lean @@ -0,0 +1,32 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.EmbedsInRayClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNormExponentMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealModulusProjection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassPrimeToIdeals +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup + +/-! # All -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/EmbedsInRayClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/EmbedsInRayClassField.lean new file mode 100644 index 0000000000..64cdcf2a61 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/EmbedsInRayClassField.lean @@ -0,0 +1,29 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +/-! +# Embedding into a ray class field +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u v + +/-- A finite extension embeds into a ray class field for `m`. The existential +formulation avoids making a global choice of ray class field. -/ +def EmbedsInRayClassField + (K : Type u) [Field K] [NumberField K] + (L : Type v) [Field L] [Algebra K L] + (m : RayClassModulus K) : Prop := + ∃ R : RayClassFieldRealization K m, + Nonempty (L →ₐ[K] R.extension) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNorm.lean new file mode 100644 index 0000000000..e7cd3ea152 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNorm.lean @@ -0,0 +1,46 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNormExponentMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealFactorization +/-! +# Relative norm of nonzero fractional ideals + +The norm sends a finite-prime factor upstairs to the prime below it, with +exponent multiplied by the inertia degree. Prime factorization extends this +rule to a multiplicative map on all nonzero fractional ideals. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- The relative norm of nonzero fractional ideals of number fields, +defined by its inertia-degree-weighted action on prime exponents. -/ +def fractionalIdealNorm + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] : + NumberFieldFractionalIdealGroup L →* + NumberFieldFractionalIdealGroup K := + (NumberFieldFractionalIdealGroup.factorizationEquiv + (K := K)).toMonoidHom.comp + ((fractionalIdealNormExponentMap K L).toMultiplicative.comp + (NumberFieldFractionalIdealGroup.factorizationEquiv + (K := L)).symm.toMonoidHom) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNormExponentMap.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNormExponentMap.lean new file mode 100644 index 0000000000..240ff9aa94 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNormExponentMap.lean @@ -0,0 +1,64 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.BigOperators.Finsupp.Basic +public import Mathlib.NumberTheory.NumberField.Basic +public import Mathlib.RingTheory.DedekindDomain.Factorization +public import Mathlib.RingTheory.Ideal.GoingUp +public import Mathlib.RingTheory.Ideal.Norm.RelNorm +/-! +# Norm of a fractional-ideal exponent vector + +A finite prime of an extension contracts to a finite prime of the base. +The norm sends its exponent to the prime below, multiplied by the inertia +degree. The resulting map on finitely supported exponent vectors is additive. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +open scoped Classical in +/-- The finite prime below a finite prime in an extension of number fields. -/ +def fractionalIdealNormPrimeBelow + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + (W : HeightOneSpectrum (𝓞 L)) : + HeightOneSpectrum (𝓞 K) where + asIdeal := W.asIdeal.under (𝓞 K) + isPrime := inferInstance + ne_bot := + Ring.ne_bot_of_isMaximal_of_not_isField + (M := W.asIdeal.under (𝓞 K)) inferInstance + (RingOfIntegers.not_isField K) + +open scoped Classical in +/-- The relative ideal norm on formal finite-prime exponent vectors. The +coefficient at an upstairs prime is transferred to its contracted prime and +multiplied by the inertia degree. -/ +def fractionalIdealNormExponentMap + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + : + (HeightOneSpectrum (𝓞 L) →₀ ℤ) →+ + (HeightOneSpectrum (𝓞 K) →₀ ℤ) := + Finsupp.liftAddHom fun W => + (Finsupp.singleAddHom (fractionalIdealNormPrimeBelow K L W)).comp + (AddMonoidHom.mulLeft (W.asIdeal.inertiaDeg (𝓞 K) : ℤ)) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsAbelianConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsAbelianConductor.lean new file mode 100644 index 0000000000..cad4b9dd58 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsAbelianConductor.lean @@ -0,0 +1,29 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.EmbedsInRayClassField +/-! +# Conductors of finite abelian extensions +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u v + +/-- A modulus is the conductor of a finite abelian extension when it is +exactly the least modulus whose ray class field contains the extension. -/ +def IsAbelianConductor + (K : Type u) [Field K] [NumberField K] + (L : Type v) [Field L] [NumberField L] [Algebra K L] + (c : RayClassModulus K) : Prop := + ∀ m : RayClassModulus K, + EmbedsInRayClassField K L m ↔ c ≤ m + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsRayCongruent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsRayCongruent.lean new file mode 100644 index 0000000000..a4695342e6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsRayCongruent.lean @@ -0,0 +1,81 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +/-! +# Ray congruences +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- The diagonal embedding of field units into a finite completion. -/ +def finitePlaceUnitEmbedding + {K : Type u} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) : + Kˣ →* (v.adicCompletion K)ˣ := + Units.map (algebraMap K (v.adicCompletion K)).toMonoidHom + +/-- A field unit satisfies the finite congruences and real positivity +conditions specified by a ray modulus. -/ +def IsRayCongruent + {K : Type u} [Field K] [NumberField K] + (m : RayClassModulus K) (x : Kˣ) : Prop := + (∀ v, v ∈ m.finitePart.support → + finitePlaceUnitEmbedding v x ∈ + rayLocalHigherUnitGroup v (m.finitePart v)) ∧ + (∀ v, v ∈ m.infinitePart → + 0 < v.1.embedding_of_isReal v.2 (x : K)) + +namespace IsRayCongruent + +/-- The identity satisfies every ray congruence. -/ +theorem one {K : Type u} [Field K] [NumberField K] + (m : RayClassModulus K) : IsRayCongruent m 1 := by + constructor + · intro v _ + simpa only [map_one] using (rayLocalHigherUnitGroup v (m.finitePart v)).one_mem + · intro v _ + simp + +/-- Ray-congruent nonzero elements are closed under multiplication. -/ +theorem mul {K : Type u} [Field K] [NumberField K] + {m : RayClassModulus K} {x y : Kˣ} + (hx : IsRayCongruent m x) (hy : IsRayCongruent m y) : + IsRayCongruent m (x * y) := by + constructor + · intro v hv + simpa only [map_mul] using + (rayLocalHigherUnitGroup v (m.finitePart v)).mul_mem (hx.1 v hv) (hy.1 v hv) + · intro v hv + simpa only [Units.val_mul, map_mul] using mul_pos (hx.2 v hv) (hy.2 v hv) + +/-- Ray-congruent nonzero elements are closed under inversion. -/ +theorem inv {K : Type u} [Field K] [NumberField K] + {m : RayClassModulus K} {x : Kˣ} + (hx : IsRayCongruent m x) : IsRayCongruent m x⁻¹ := by + constructor + · intro v hv + simpa only [map_inv] using + (rayLocalHigherUnitGroup v (m.finitePart v)).inv_mem (hx.1 v hv) + · intro v hv + simpa only [Units.val_inv_eq_inv_val, map_inv₀] using inv_pos.mpr (hx.2 v hv) + +end IsRayCongruent + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsUnramifiedOutsideModulus.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsUnramifiedOutsideModulus.lean new file mode 100644 index 0000000000..d71bcffb03 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsUnramifiedOutsideModulus.lean @@ -0,0 +1,39 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus +public import Mathlib.NumberTheory.NumberField.InfinitePlace.Ramification +public import Mathlib.RingTheory.Unramified.Locus +/-! +# Unramifiedness outside the support of a ray modulus +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +namespace ClassFieldTheory + +universe u v + +/-- A number-field extension is unramified away from the finite primes and +real places occurring in a ray modulus. Only the support of the finite part +is used; this predicate does not bound conductor exponents. -/ +def IsUnramifiedOutsideModulus + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [Algebra K L] + (m : RayClassModulus K) : Prop := + (∀ v : HeightOneSpectrum (𝓞 K), v ∉ m.finitePart.support → + Algebra.IsUnramifiedIn (𝓞 L) v.asIdeal) ∧ + ∀ (v : InfinitePlace K) (hv : v.IsReal), + (⟨v, hv⟩ : RayClassRealPlace K) ∉ m.infinitePart → + v.IsUnramifiedIn L + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowClassGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowClassGroup.lean new file mode 100644 index 0000000000..bfda24181d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowClassGroup.lean @@ -0,0 +1,58 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealGroup +public import Mathlib.RingTheory.ClassGroup.Basic +/-! +# Narrow ideal classes + +The narrow class group is the group of nonzero fractional ideals modulo +principal ideals generated by elements positive at every real place. This +ideal-theoretic definition does not depend on the ray class group. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- Nonzero field elements positive at every real place. -/ +def totallyPositiveFieldUnits + (K : Type u) [Field K] [NumberField K] : Subgroup Kˣ where + carrier := {x | ∀ v : RayClassRealPlace K, + 0 < v.1.embedding_of_isReal v.2 (x : K)} + one_mem' := by + intro v + simp + mul_mem' := by + intro x y hx hy v + simpa only [Units.val_mul, map_mul] using mul_pos (hx v) (hy v) + inv_mem' := by + intro x hx v + simpa only [Units.val_inv_eq_inv_val, map_inv₀] using inv_pos.mpr (hx v) + +/-- Principal fractional ideals with a totally positive generator. -/ +def narrowPrincipalIdealSubgroup + (K : Type u) [Field K] [NumberField K] : + Subgroup (NumberFieldFractionalIdealGroup K) := + (totallyPositiveFieldUnits K).map (toPrincipalIdeal (𝓞 K) K) + +/-- The ideal-theoretic narrow class group of a number field. -/ +abbrev NarrowClassGroup + (K : Type u) [Field K] [NumberField K] := + NumberFieldFractionalIdealGroup K ⧸ narrowPrincipalIdealSubgroup K + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowRayClassModulus.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowRayClassModulus.lean new file mode 100644 index 0000000000..cb553b2c5d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowRayClassModulus.lean @@ -0,0 +1,34 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus +public import Mathlib.NumberTheory.NumberField.InfinitePlace.Ramification +/-! +# The narrow class-group modulus +-/ + +@[expose] public section + +noncomputable +section + + + +namespace ClassFieldTheory + +universe u + +open scoped Classical in +/-- The modulus with no finite exponent and positivity at every real place. +Its ray class group is the narrow ideal class group. -/ +def narrowRayClassModulus + (K : Type u) [Field K] [NumberField K] : RayClassModulus K where + finitePart := 0 + infinitePart := Finset.univ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/OrdinaryRayClassModulus.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/OrdinaryRayClassModulus.lean new file mode 100644 index 0000000000..b5ae7183ba --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/OrdinaryRayClassModulus.lean @@ -0,0 +1,37 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus +/-! +# The ordinary class-group modulus +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- The modulus with no finite exponent and no positivity condition. Its ray +class group is the ordinary ideal class group. -/ +def ordinaryRayClassModulus + (K : Type u) [Field K] [NumberField K] : RayClassModulus K where + finitePart := 0 + infinitePart := ∅ + +/-- The ordinary class-group modulus is below every ray modulus. -/ +theorem ordinaryRayClassModulus_le + (K : Type u) [Field K] [NumberField K] + (m : RayClassModulus K) : + ordinaryRayClassModulus K ≤ m := by + constructor + · change ∀ v, 0 ≤ m.finitePart v + exact fun _ => Nat.zero_le _ + · exact Finset.empty_subset _ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayArtin.lean new file mode 100644 index 0000000000..9a150d4fb4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayArtin.lean @@ -0,0 +1,31 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +/-! +# The ray Artin map +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory.RayClassFieldRealization + +universe u + +/-- The Frobenius-normalized ray Artin map. -/ +def rayArtin + {K : Type u} [Field K] [NumberField K] + {m : RayClassModulus K} + (R : RayClassFieldRealization K m) : + RayClassGroup m →* (R.extension ≃ₐ[K] R.extension) := + R.artinEquiv.toMonoidHom + +end ClassFieldTheory.RayClassFieldRealization diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassFieldRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassFieldRealization.lean new file mode 100644 index 0000000000..2130227b2b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassFieldRealization.lean @@ -0,0 +1,47 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +/-! +# Ray class fields +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +namespace ClassFieldTheory + +universe u + +/-- A finite abelian extension realizing the ray class group through a +Frobenius-normalized Artin isomorphism. -/ +structure RayClassFieldRealization + (K : Type u) [Field K] [NumberField K] + (m : RayClassModulus K) where + /-- The ray class field. -/ + extension : FiniteAbelianExtension K + /-- The extension is unramified away from the modulus. -/ + unramifiedOutsideModulus : + IsUnramifiedOutsideModulus K extension m + /-- The Artin isomorphism for the ray class field. -/ + artinEquiv : RayClassGroup m ≃* (extension ≃ₐ[K] extension) + /-- A prime class maps to arithmetic Frobenius. -/ + artin_frobenius : + ∀ (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) + (w : HeightOneSpectrum (𝓞 extension)), + w.asIdeal.LiesOver v.asIdeal → + artinEquiv (rayClassOfFinitePrime m v hv) = + arithmeticFrobeniusAt (K := K) w + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassGroup.lean new file mode 100644 index 0000000000..c31b88698a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassGroup.lean @@ -0,0 +1,34 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassPrimeToIdeals +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup +public import Mathlib.GroupTheory.QuotientGroup.Basic +/-! +# Ideal-theoretic ray class groups +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- The ideal-theoretic ray class group of a modulus. -/ +abbrev RayClassGroup + {K : Type u} [Field K] [NumberField K] + (m : RayClassModulus K) := + rayClassPrimeToIdeals m ⧸ rayPrincipalIdealSubgroupInPrimeTo m + +/-- Ray class groups are multiplicatively commutative. -/ +instance instIsMulCommutativeRayClassGroup + {K : Type u} [Field K] [NumberField K] + (m : RayClassModulus K) : IsMulCommutative (RayClassGroup m) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealModulusProjection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealModulusProjection.lean new file mode 100644 index 0000000000..4dabe97258 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealModulusProjection.lean @@ -0,0 +1,138 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +public import Mathlib.Data.Finsupp.Order +public import Mathlib.GroupTheory.QuotientGroup.Basic +/-! +# Projection between ideal-theoretic ray class groups + +Enlarging a modulus strengthens its finite congruences and real positivity +conditions. The induced inclusions of prime-to-modulus ideals and ray-principal +ideals give the canonical quotient map from the larger modulus to the smaller. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +open scoped Classical in +private def rayLocalIntegralValue + {K : Type u} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) + (y : (v.adicCompletionIntegers K).units) : + v.adicCompletionIntegers K := + ((v.adicCompletionIntegers K).toSubmonoid.unitsEquivUnitsType y : + (v.adicCompletionIntegers K)ˣ).1 + +open scoped Classical in +private theorem rayLocalHigherUnitMap_eq_one_iff + {K : Type u} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ) + (y : (v.adicCompletionIntegers K).units) : + rayLocalHigherUnitMap v n y = 1 ↔ + rayLocalIntegralValue v y - 1 ∈ + (IsLocalRing.maximalIdeal (v.adicCompletionIntegers K)) ^ n := by + let I := (IsLocalRing.maximalIdeal (v.adicCompletionIntegers K)) ^ n + change Units.map (Ideal.Quotient.mk I).toMonoidHom + ((v.adicCompletionIntegers K).toSubmonoid.unitsEquivUnitsType y) = + 1 ↔ _ + rw [Units.ext_iff] + change Ideal.Quotient.mk I (rayLocalIntegralValue v y) = + Ideal.Quotient.mk I 1 ↔ _ + exact Ideal.Quotient.mk_eq_mk_iff_sub_mem + (I := I) (rayLocalIntegralValue v y) + (1 : v.adicCompletionIntegers K) + +open scoped Classical in +private theorem rayLocalHigherUnitGroup_antitone + {K : Type u} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) + {m n : ℕ} (hmn : m ≤ n) : + rayLocalHigherUnitGroup v n ≤ rayLocalHigherUnitGroup v m := by + intro x hx + change x ∈ Subgroup.map + (v.adicCompletionIntegers K).units.subtype + (rayLocalHigherUnitMap v n).ker at hx + change x ∈ Subgroup.map + (v.adicCompletionIntegers K).units.subtype + (rayLocalHigherUnitMap v m).ker + rw [Subgroup.mem_map] at hx ⊢ + obtain ⟨y, hy, rfl⟩ := hx + refine ⟨y, ?_, rfl⟩ + change rayLocalHigherUnitMap v n y = 1 at hy + change rayLocalHigherUnitMap v m y = 1 + rw [rayLocalHigherUnitMap_eq_one_iff] at hy ⊢ + exact Ideal.pow_le_pow_right hmn hy + +open scoped Classical in +private theorem rayCongruent_of_le + {K : Type u} [Field K] [NumberField K] + {m n : RayClassModulus K} (hmn : m ≤ n) + {x : Kˣ} (hx : IsRayCongruent n x) : + IsRayCongruent m x := by + constructor + · intro v hv + have hvn : v ∈ n.finitePart.support := by + apply Finsupp.mem_support_iff.mpr + have hpos : 0 < m.finitePart v := + Nat.pos_of_ne_zero (Finsupp.mem_support_iff.mp hv) + exact Nat.ne_of_gt (lt_of_lt_of_le hpos (hmn.1 v)) + exact rayLocalHigherUnitGroup_antitone v (hmn.1 v) (hx.1 v hvn) + · intro v hv + exact hx.2 v (hmn.2 hv) + +open scoped Classical in +private theorem rayPrimeToIdeals_antitone + {K : Type u} [Field K] [NumberField K] + {m n : RayClassModulus K} (hmn : m ≤ n) : + rayClassPrimeToIdeals n ≤ rayClassPrimeToIdeals m := by + intro I hI v hv + exact hI v (Finsupp.support_mono hmn.1 hv) + +open scoped Classical in +private theorem rayPrincipalIdeals_antitone + {K : Type u} [Field K] [NumberField K] + {m n : RayClassModulus K} (hmn : m ≤ n) : + rayPrincipalIdealSubgroup n ≤ rayPrincipalIdealSubgroup m := by + apply Subgroup.closure_mono + rintro I ⟨x, hx, hIx⟩ + exact ⟨x, rayCongruent_of_le hmn hx, hIx⟩ + +open scoped Classical in +/-- The ideal-theoretic ray class group modulo a larger modulus projects to +the ray class group modulo a smaller modulus. -/ +def rayClassIdealModulusProjection + (K : Type u) [Field K] [NumberField K] + {m n : RayClassModulus K} (hmn : m ≤ n) : + RayClassGroup n →* RayClassGroup m := by + let hI : rayClassPrimeToIdeals n ≤ rayClassPrimeToIdeals m := + by exact rayPrimeToIdeals_antitone hmn + letI : (rayPrincipalIdealSubgroupInPrimeTo m).Normal := + Subgroup.normal_of_isMulCommutative _ + refine QuotientGroup.map + (rayPrincipalIdealSubgroupInPrimeTo n) + (rayPrincipalIdealSubgroupInPrimeTo m) + (Subgroup.inclusion hI) ?_ + intro I hI' + change (I : NumberFieldFractionalIdealGroup K) ∈ + rayPrincipalIdealSubgroup n at hI' + change (I : NumberFieldFractionalIdealGroup K) ∈ + rayPrincipalIdealSubgroup m + exact (by exact rayPrincipalIdeals_antitone hmn hI') + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealNorm.lean new file mode 100644 index 0000000000..b0583b6bcb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealNorm.lean @@ -0,0 +1,156 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +public import Mathlib.Algebra.BigOperators.Finsupp.Basic +/-! +# Ideal norms in an ideal-theoretic ray class group + +The domain consists of fractional ideals of `L` with zero valuation at every +prime lying above the finite support of `m`. The relative ideal norm maps +this group into the fractional ideals of `K` prime to `m`; composing with the +ray quotient gives its genuine ideal-norm image. This construction does not +identify ideal norms with idèle-class norms. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +open scoped Classical in +/-- Fractional ideals upstairs prime to the primes above a base ray modulus. -/ +def rayClassPrimeToIdealNormDomain + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + (m : RayClassModulus K) : + Subgroup (NumberFieldFractionalIdealGroup L) where + carrier := {I | ∀ W, fractionalIdealNormPrimeBelow K L W ∈ + m.finitePart.support → + FractionalIdeal.count L W + (I : FractionalIdeal (nonZeroDivisors (𝓞 L)) L) = 0} + one_mem' W _ := FractionalIdeal.count_one L W + mul_mem' {I J} hI hJ W hW := by + rw [Units.val_mul, + FractionalIdeal.count_mul L W (Units.ne_zero I) (Units.ne_zero J), + hI W hW, hJ W hW, add_zero] + inv_mem' {I} hI W hW := by + rw [Units.val_inv_eq_inv_val, FractionalIdeal.count_inv L W, + hI W hW, neg_zero] + +open scoped Classical in +/-- The exponent of a relative fractional-ideal norm at a finite prime is +the inertia-degree-weighted sum of the exponents at the primes above it. -/ +theorem fractionalIdealNorm_count + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + (I : NumberFieldFractionalIdealGroup L) + (w : HeightOneSpectrum (𝓞 K)) : + FractionalIdeal.count K w + ((fractionalIdealNorm K L I : NumberFieldFractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = + (NumberFieldFractionalIdealGroup.countVector I).sum fun W n => + if fractionalIdealNormPrimeBelow K L W = w then + (W.asIdeal.inertiaDeg (𝓞 K) : ℤ) * n else 0 := by + let e := (NumberFieldFractionalIdealGroup.factorizationEquiv + (K := L)).symm I + have he : e.toAdd = NumberFieldFractionalIdealGroup.countVector I := by + ext W + have h := NumberFieldFractionalIdealGroup.count_factorization + (K := L) e W + have hI : NumberFieldFractionalIdealGroup.factorization + (K := L) e = I := by + change NumberFieldFractionalIdealGroup.factorizationEquiv + (K := L) e = I + exact MulEquiv.apply_symm_apply _ I + rw [hI] at h + exact h.symm.trans + (NumberFieldFractionalIdealGroup.countVector_apply I W).symm + change FractionalIdeal.count K w + ((NumberFieldFractionalIdealGroup.factorization (K := K) + (Multiplicative.ofAdd + (fractionalIdealNormExponentMap K L e.toAdd)) : + NumberFieldFractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = _ + rw [NumberFieldFractionalIdealGroup.count_factorization] + change fractionalIdealNormExponentMap K L e.toAdd w = _ + rw [he] + simp [fractionalIdealNormExponentMap, Finsupp.single_apply, eq_comm] + +open scoped Classical in +/-- The genuine fractional-ideal norm, restricted to ideals prime to the +finite support of a base ray modulus. -/ +def rayClassPrimeToIdealNorm + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + (m : RayClassModulus K) : + rayClassPrimeToIdealNormDomain K L m →* + rayClassPrimeToIdeals m where + toFun I := ⟨fractionalIdealNorm K L I, by + intro w hw + rw [fractionalIdealNorm_count K L I w] + apply Finset.sum_eq_zero + intro W _ + by_cases hbelow : fractionalIdealNormPrimeBelow K L W = w + · dsimp only + rw [ite_eq_left hbelow, + NumberFieldFractionalIdealGroup.countVector_apply, + I.property W (hbelow ▸ hw)] + simp only [mul_zero] + · dsimp only + rw [ite_eq_right hbelow]⟩ + map_one' := by + apply Subtype.ext + change fractionalIdealNorm K L 1 = 1 + exact map_one (fractionalIdealNorm K L) + map_mul' I J := by + apply Subtype.ext + change fractionalIdealNorm K L + ((I : NumberFieldFractionalIdealGroup L) * J) = + fractionalIdealNorm K L I * fractionalIdealNorm K L J + exact map_mul (fractionalIdealNorm K L) + (I : NumberFieldFractionalIdealGroup L) + (J : NumberFieldFractionalIdealGroup L) + +open scoped Classical in +/-- The relative ideal norm followed by the ideal-theoretic ray quotient. -/ +def rayClassIdealNorm + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + (m : RayClassModulus K) : + rayClassPrimeToIdealNormDomain K L m →* RayClassGroup m := + (QuotientGroup.mk' (rayPrincipalIdealSubgroupInPrimeTo m)).comp + (rayClassPrimeToIdealNorm K L m) + +open scoped Classical in +/-- The actual ideal-norm subgroup of the ray class group. Its equality +with an Artin kernel is a separate reciprocity theorem. -/ +def rayClassIdealNormImage + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + (m : RayClassModulus K) : Subgroup (RayClassGroup m) := + (rayClassIdealNorm K L m).range + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassModulus.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassModulus.lean new file mode 100644 index 0000000000..87d3d9cae1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassModulus.lean @@ -0,0 +1,144 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.FiniteSupport.Defs +public import Mathlib.Order.Preorder.Finsupp +public import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +public import Mathlib.NumberTheory.NumberField.InfinitePlace.Basic +public import Mathlib.RingTheory.DedekindDomain.Factorization +/-! +# Ray class moduli + +A modulus consists of finite-prime exponents and a finite set of real places. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- A real infinite place of a number field. -/ +abbrev RayClassRealPlace + (K : Type u) [Field K] := + {v : InfinitePlace K // v.IsReal} + +/-- A ray modulus: finite prime exponents together with the real places at +which positivity is imposed. -/ +structure RayClassModulus + (K : Type u) [Field K] [NumberField K] where + /-- The finite prime-power part. -/ + finitePart : HeightOneSpectrum (𝓞 K) →₀ ℕ + /-- The selected real places. -/ + infinitePart : Finset (RayClassRealPlace K) + +namespace RayClassModulus + +/-- Ray moduli are equal when their finite exponents and real-place sets agree. -/ +@[ext] theorem ext + {K : Type u} [Field K] [NumberField K] + {m n : RayClassModulus K} + (hfinite : m.finitePart = n.finitePart) + (hinfinite : m.infinitePart = n.infinitePart) : m = n := by + cases m + cases n + cases hfinite + cases hinfinite + rfl + +instance {K : Type u} [Field K] [NumberField K] : LE (RayClassModulus K) where + le m n := + m.finitePart ≤ n.finitePart ∧ m.infinitePart ⊆ n.infinitePart + +instance {K : Type u} [Field K] [NumberField K] : + PartialOrder (RayClassModulus K) where + le_refl m := ⟨le_rfl, fun _ hx => hx⟩ + le_trans _ _ _ hmn hnp := + ⟨hmn.1.trans hnp.1, fun _ hx => hnp.2 (hmn.2 hx)⟩ + le_antisymm m n hmn hnm := by + cases m with + | mk mfinite minfinite => + cases n with + | mk nfinite ninfinite => + have hfinite : mfinite = nfinite := + le_antisymm hmn.1 hnm.1 + have hinfinite : minfinite = ninfinite := by + apply Finset.ext + intro x + exact ⟨fun hx => hmn.2 hx, fun hx => hnm.2 hx⟩ + cases hfinite + cases hinfinite + rfl + +/-- Modulus divisibility is exponentwise at finite primes and inclusion at +real places. -/ +@[simp] theorem le_iff + {K : Type u} [Field K] [NumberField K] + (m n : RayClassModulus K) : + m ≤ n ↔ + (∀ v, m.finitePart v ≤ n.finitePart v) ∧ + m.infinitePart ⊆ n.infinitePart := by + rfl + +/-- Meet takes the minimum finite-prime exponent and intersects the real +places; join takes the maximum exponent and unions the real places. -/ +instance {K : Type u} [Field K] [NumberField K] : + Lattice (RayClassModulus K) := by + classical + exact { + inf := fun m n => + ⟨m.finitePart ⊓ n.finitePart, m.infinitePart ∩ n.infinitePart⟩ + inf_le_left := fun _ _ => ⟨inf_le_left, Finset.inter_subset_left⟩ + inf_le_right := fun _ _ => ⟨inf_le_right, Finset.inter_subset_right⟩ + le_inf := fun _ _ _ hmn hmp => + ⟨le_inf hmn.1 hmp.1, Finset.subset_inter hmn.2 hmp.2⟩ + sup := fun m n => + ⟨m.finitePart ⊔ n.finitePart, m.infinitePart ∪ n.infinitePart⟩ + le_sup_left := fun _ _ => ⟨le_sup_left, Finset.subset_union_left⟩ + le_sup_right := fun _ _ => ⟨le_sup_right, Finset.subset_union_right⟩ + sup_le := fun _ _ _ hmp hnp => + ⟨sup_le hmp.1 hnp.1, Finset.union_subset hmp.2 hnp.2⟩ + } + +@[simp] theorem finitePart_inf + {K : Type u} [Field K] [NumberField K] + (m n : RayClassModulus K) : + (m ⊓ n).finitePart = m.finitePart ⊓ n.finitePart := rfl + +@[simp] theorem mem_infinitePart_inf + {K : Type u} [Field K] [NumberField K] + (m n : RayClassModulus K) (v : RayClassRealPlace K) : + v ∈ (m ⊓ n).infinitePart ↔ + v ∈ m.infinitePart ∧ v ∈ n.infinitePart := by + classical + change v ∈ m.infinitePart ∩ n.infinitePart ↔ _ + exact Finset.mem_inter + +@[simp] theorem finitePart_sup + {K : Type u} [Field K] [NumberField K] + (m n : RayClassModulus K) : + (m ⊔ n).finitePart = m.finitePart ⊔ n.finitePart := rfl + +@[simp] theorem mem_infinitePart_sup + {K : Type u} [Field K] [NumberField K] + (m n : RayClassModulus K) (v : RayClassRealPlace K) : + v ∈ (m ⊔ n).infinitePart ↔ + v ∈ m.infinitePart ∨ v ∈ n.infinitePart := by + classical + change v ∈ m.infinitePart ∪ n.infinitePart ↔ _ + exact Finset.mem_union + +end RayClassModulus + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassOfFinitePrime.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassOfFinitePrime.lean new file mode 100644 index 0000000000..32c5fad159 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassOfFinitePrime.lean @@ -0,0 +1,64 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal +/-! +# Prime classes in ray class groups +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +private lemma finitePrimeFractionalIdeal_mem_primeTo + {K : Type u} [Field K] [NumberField K] + (m : RayClassModulus K) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : + finitePrimeFractionalIdeal v ∈ rayClassPrimeToIdeals m := by + intro w hw + exact FractionalIdeal.count_maximal_coprime K w fun h => (h ▸ hv) hw + +/-- The class in the ray class group represented by a finite prime away from +the modulus. -/ +def rayClassOfFinitePrime + {K : Type u} [Field K] [NumberField K] + (m : RayClassModulus K) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : RayClassGroup m := + QuotientGroup.mk' (rayPrincipalIdealSubgroupInPrimeTo m) + ⟨finitePrimeFractionalIdeal v, by exact finitePrimeFractionalIdeal_mem_primeTo m v hv⟩ + +/-- The ordinary ideal class represented by a finite prime. -/ +def ordinaryRayClassOfFinitePrime + {K : Type u} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) : + RayClassGroup (ordinaryRayClassModulus K) := + rayClassOfFinitePrime (ordinaryRayClassModulus K) v (by + simp [ordinaryRayClassModulus]) + +/-- The narrow ideal class represented by a finite prime. -/ +def narrowRayClassOfFinitePrime + {K : Type u} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) : + RayClassGroup (narrowRayClassModulus K) := + rayClassOfFinitePrime (narrowRayClassModulus K) v (by + simp [narrowRayClassModulus]) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassPrimeToIdeals.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassPrimeToIdeals.lean new file mode 100644 index 0000000000..fc375f552a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassPrimeToIdeals.lean @@ -0,0 +1,43 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealGroup +public import Mathlib.RingTheory.DedekindDomain.Factorization +/-! +# Fractional ideals prime to a ray modulus +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +namespace ClassFieldTheory + +universe u + +/-- The subgroup of nonzero fractional ideals prime to the finite part of a +ray modulus. -/ +def rayClassPrimeToIdeals + {K : Type u} [Field K] [NumberField K] + (m : RayClassModulus K) : + Subgroup (NumberFieldFractionalIdealGroup K) where + carrier := {I | ∀ v, v ∈ m.finitePart.support → + FractionalIdeal.count K v + (I : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = 0} + one_mem' v _ := FractionalIdeal.count_one K v + mul_mem' {I J} hI hJ v hv := by + rw [Units.val_mul, + FractionalIdeal.count_mul K v (Units.ne_zero I) (Units.ne_zero J), + hI v hv, hJ v hv, add_zero] + inv_mem' {I} hI v hv := by + rw [Units.val_inv_eq_inv_val, FractionalIdeal.count_inv K v, + hI v hv, neg_zero] + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquiv.lean new file mode 100644 index 0000000000..9b154703c6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquiv.lean @@ -0,0 +1,39 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +public import Mathlib.GroupTheory.QuotientGroup.Basic +/-! +# The quotient induced by a ray-class Artin map + +The prescribed subgroup is identified with the Artin kernel before applying +the first isomorphism theorem. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- The isomorphism induced by the Artin map of a ray-class realization. -/ +def rayClassSubgroupQuotientEquiv + (K : Type u) [Field K] [NumberField K] + (m : RayClassModulus K) (H : Subgroup (RayClassGroup m)) + (R : RayClassSubgroupRealization K m H) : + (RayClassGroup m ⧸ H) ≃* (R.extension ≃ₐ[K] R.extension) := + (QuotientGroup.quotientMulEquivOfEq R.artin_ker.symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + R.artin R.artin_surjective) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassSubgroupRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassSubgroupRealization.lean new file mode 100644 index 0000000000..ed89a4772c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassSubgroupRealization.lean @@ -0,0 +1,53 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +/-! +# Class fields attached to ray class subgroups +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +namespace ClassFieldTheory + +universe u + +/-- A finite abelian class field realizing a subgroup of a ray class group. + +The Artin map has exactly the prescribed kernel and is normalized on prime +classes by arithmetic Frobenius. -/ +structure RayClassSubgroupRealization + (K : Type u) [Field K] [NumberField K] + (m : RayClassModulus K) (H : Subgroup (RayClassGroup m)) where + /-- The corresponding finite abelian extension. -/ + extension : FiniteAbelianExtension K + /-- The extension is unramified away from the modulus. -/ + unramifiedOutsideModulus : + IsUnramifiedOutsideModulus K extension m + /-- The Artin map attached to the extension. -/ + artin : RayClassGroup m →* (extension ≃ₐ[K] extension) + /-- The Artin map is onto. -/ + artin_surjective : Function.Surjective artin + /-- The prescribed subgroup is exactly the Artin kernel. -/ + artin_ker : artin.ker = H + /-- A prime class maps to arithmetic Frobenius. -/ + artin_frobenius : + ∀ (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) + (w : HeightOneSpectrum (𝓞 extension)), + w.asIdeal.LiesOver v.asIdeal → + artin (rayClassOfFinitePrime m v hv) = + arithmeticFrobeniusAt (K := K) w + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayLocalHigherUnitGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayLocalHigherUnitGroup.lean new file mode 100644 index 0000000000..3a766ab245 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayLocalHigherUnitGroup.lean @@ -0,0 +1,50 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +public import Mathlib.RingTheory.Ideal.Quotient.Operations +/-! +# Higher-unit subgroups at finite places +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- Reduction of a local integral unit modulo the `n`-th power of the maximal +ideal. -/ +def rayLocalHigherUnitMap + {K : Type u} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ) : + (v.adicCompletionIntegers K).units →* + ((v.adicCompletionIntegers K) ⧸ + (IsLocalRing.maximalIdeal (v.adicCompletionIntegers K)) ^ n)ˣ := + (Units.map + (Ideal.Quotient.mk + ((IsLocalRing.maximalIdeal + (v.adicCompletionIntegers K)) ^ n)).toMonoidHom).comp + (v.adicCompletionIntegers K).toSubmonoid.unitsEquivUnitsType.toMonoidHom + +/-- The `n`-th higher-unit subgroup at a finite place. -/ +def rayLocalHigherUnitGroup + {K : Type u} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ) : + Subgroup (v.adicCompletion K)ˣ := + Subgroup.map + (v.adicCompletionIntegers K).units.subtype + (rayLocalHigherUnitMap v n).ker + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayPrincipalIdealSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayPrincipalIdealSubgroup.lean new file mode 100644 index 0000000000..9dde1cce48 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayPrincipalIdealSubgroup.lean @@ -0,0 +1,44 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassPrimeToIdeals +public import Mathlib.RingTheory.ClassGroup.Basic +/-! +# Ray-principal ideals +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +namespace ClassFieldTheory + +universe u + +/-- The subgroup generated by principal fractional ideals whose generators +satisfy the ray congruence. -/ +def rayPrincipalIdealSubgroup + {K : Type u} [Field K] [NumberField K] + (m : RayClassModulus K) : + Subgroup (NumberFieldFractionalIdealGroup K) := + Subgroup.closure + {I | ∃ x : Kˣ, + IsRayCongruent m x ∧ toPrincipalIdeal (𝓞 K) K x = I} + +/-- Ray-principal ideals, restricted to the group of ideals prime to the +modulus. -/ +def rayPrincipalIdealSubgroupInPrimeTo + {K : Type u} [Field K] [NumberField K] + (m : RayClassModulus K) : + Subgroup (rayClassPrimeToIdeals m) := + Subgroup.comap (rayClassPrimeToIdeals m).subtype + (rayPrincipalIdealSubgroup m) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields.lean new file mode 100644 index 0000000000..c6355f8221 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsEverywhereUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsUnramifiedAtFinitePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealFactorization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealGroup + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/All.lean new file mode 100644 index 0000000000..9fe4445457 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/All.lean @@ -0,0 +1,20 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsEverywhereUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsUnramifiedAtFinitePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealFactorization + +/-! # All -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAt.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAt.lean new file mode 100644 index 0000000000..d42e591a56 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAt.lean @@ -0,0 +1,40 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +public import Mathlib.NumberTheory.RamificationInertia.Galois +public import Mathlib.RingTheory.Frobenius +/-! +# Arithmetic Frobenius at a finite prime +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +open scoped Classical in +/-- Mathlib's chosen arithmetic Frobenius lift at a finite prime of the +extension field. At a ramified prime such a lift need not be unique. -/ +def arithmeticFrobeniusAt + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + (w : HeightOneSpectrum (𝓞 L)) : L ≃ₐ[K] L := + arithFrobAt (𝓞 K) (L ≃ₐ[K] L) w.asIdeal + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeFractionalIdeal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeFractionalIdeal.lean new file mode 100644 index 0000000000..454c0ea13a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeFractionalIdeal.lean @@ -0,0 +1,37 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealGroup +public import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +public import Mathlib.RingTheory.DedekindDomain.Factorization +/-! +# Fractional ideal represented by a finite prime +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- The nonzero fractional ideal represented by a finite prime. -/ +def finitePrimeFractionalIdeal + {K : Type u} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) : + NumberFieldFractionalIdealGroup K := + Units.mk0 + (v.asIdeal : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) + (FractionalIdeal.coeIdeal_ne_zero.mpr v.ne_bot) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeSplitsCompletely.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeSplitsCompletely.lean new file mode 100644 index 0000000000..a795daddaa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeSplitsCompletely.lean @@ -0,0 +1,36 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +public import Mathlib.NumberTheory.RamificationInertia.Galois +/-! +# Complete splitting of a finite prime +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +namespace ClassFieldTheory + +universe u v + +/-- A finite prime splits completely when every prime above it has +ramification index and inertia degree equal to one. -/ +def FinitePrimeSplitsCompletely + (K : Type u) (L : Type v) + [Field K] + [Field L] [Algebra K L] + (v : HeightOneSpectrum (𝓞 K)) : Prop := + ∀ w : HeightOneSpectrum (𝓞 L), + w.asIdeal.LiesOver v.asIdeal → + w.asIdeal.ramificationIdx (𝓞 K) = 1 ∧ + w.asIdeal.inertiaDeg (𝓞 K) = 1 + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsBigHilbertClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsBigHilbertClassField.lean new file mode 100644 index 0000000000..db947c3bff --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsBigHilbertClassField.lean @@ -0,0 +1,31 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsUnramifiedAtFinitePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +/-! +# Big Hilbert class fields +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- A big Hilbert class field is a finite-prime-unramified finite abelian +extension containing every finite abelian extension unramified at the finite +places. Ramification at real places is allowed. -/ +def IsBigHilbertClassField + {K : Type u} [Field K] [NumberField K] + (E : FiniteAbelianExtension K) : Prop := + IsUnramifiedAtFinitePlaces K E ∧ + ∀ F : FiniteAbelianExtension K, + IsUnramifiedAtFinitePlaces K F → Nonempty (F →ₐ[K] E) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsEverywhereUnramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsEverywhereUnramified.lean new file mode 100644 index 0000000000..64ea2ce3e5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsEverywhereUnramified.lean @@ -0,0 +1,28 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsUnramifiedAtFinitePlaces +public import Mathlib.NumberTheory.NumberField.InfinitePlace.Ramification +/-! +# Unramifiedness at every place +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u v + +/-- A number-field extension is unramified at all finite and infinite places. -/ +def IsEverywhereUnramified + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] : Prop := + IsUnramifiedAtFinitePlaces K L ∧ IsUnramifiedAtInfinitePlaces K L + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsSmallHilbertClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsSmallHilbertClassField.lean new file mode 100644 index 0000000000..647abb54ca --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsSmallHilbertClassField.lean @@ -0,0 +1,30 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsEverywhereUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +/-! +# Small Hilbert class fields +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- A small Hilbert class field is an everywhere-unramified finite abelian +extension containing every other such extension. -/ +def IsSmallHilbertClassField + {K : Type u} [Field K] [NumberField K] + (E : FiniteAbelianExtension K) : Prop := + IsEverywhereUnramified K E ∧ + ∀ F : FiniteAbelianExtension K, + IsEverywhereUnramified K F → Nonempty (F →ₐ[K] E) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsUnramifiedAtFinitePlaces.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsUnramifiedAtFinitePlaces.lean new file mode 100644 index 0000000000..2e18a87802 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsUnramifiedAtFinitePlaces.lean @@ -0,0 +1,32 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +public import Mathlib.RingTheory.Unramified.Locus +/-! +# Unramifiedness at all finite places +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +namespace ClassFieldTheory + +universe u v + +/-- A number-field extension is unramified at every finite prime of the base. -/ +def IsUnramifiedAtFinitePlaces + (K : Type u) (L : Type v) + [Field K] + [Field L] [Algebra K L] : Prop := + ∀ v : HeightOneSpectrum (𝓞 K), + Algebra.IsUnramifiedIn (𝓞 L) v.asIdeal + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealFactorization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealFactorization.lean new file mode 100644 index 0000000000..6e9e7811ce --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealFactorization.lean @@ -0,0 +1,160 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealGroup +public import Mathlib.Algebra.BigOperators.Finsupp.Basic +public import Mathlib.RingTheory.DedekindDomain.Factorization +/-! +# Prime factorization of nonzero fractional ideals + +Mathlib's `FractionalIdeal.count` and unique-factorization theorems identify +the multiplicative group of nonzero fractional ideals with the finitely +supported integer exponents of finite primes. This equivalence is formulated +entirely in Mathlib and public Definitions vocabulary. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +namespace NumberFieldFractionalIdealGroup + +variable {K : Type u} [Field K] [NumberField K] + +open scoped Classical in +/-- The integer exponent of one finite prime, viewed multiplicatively. -/ +def primePowerHom (v : HeightOneSpectrum (𝓞 K)) : + Multiplicative ℤ →* NumberFieldFractionalIdealGroup K := + MonoidHom.mk' + (fun n => finitePrimeFractionalIdeal v ^ n.toAdd) + (fun m n => by simp only [toAdd_mul, zpow_add]) + +open scoped Classical in +/-- Reconstruct a nonzero fractional ideal from finitely many prime +exponents. -/ +def factorization : + Multiplicative (HeightOneSpectrum (𝓞 K) →₀ ℤ) →* + NumberFieldFractionalIdealGroup K := + MonoidHom.mk' + (fun exps => + exps.toAdd.prod fun v n => primePowerHom v (Multiplicative.ofAdd n)) + (fun a b => by + exact Finsupp.prod_hom_add_index (fun v => primePowerHom v)) + +open scoped Classical in +@[simp] +theorem factorization_val + (exps : Multiplicative (HeightOneSpectrum (𝓞 K) →₀ ℤ)) : + ((factorization exps : NumberFieldFractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = + exps.toAdd.prod fun v n => + (v.asIdeal : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) ^ n := by + classical + simp [factorization, primePowerHom, finitePrimeFractionalIdeal, Finsupp.prod] + +open scoped Classical in +/-- Only finitely many finite primes occur with nonzero exponent in a +nonzero fractional ideal. -/ +theorem finite_count_support (I : NumberFieldFractionalIdealGroup K) : + {v : HeightOneSpectrum (𝓞 K) | + FractionalIdeal.count K v + (I : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) ≠ 0}.Finite := + Filter.eventually_cofinite.mp + (FractionalIdeal.finite_factors + (I : FractionalIdeal (nonZeroDivisors (𝓞 K)) K)) + +open scoped Classical in +/-- The finitely supported prime-exponent vector of a nonzero fractional +ideal. -/ +def countVector (I : NumberFieldFractionalIdealGroup K) : + HeightOneSpectrum (𝓞 K) →₀ ℤ := + Finsupp.onFinset (finite_count_support I).toFinset + (fun v => FractionalIdeal.count K v + (I : FractionalIdeal (nonZeroDivisors (𝓞 K)) K)) + (fun v hv => by + rw [Set.Finite.mem_toFinset] + exact hv) + +open scoped Classical in +@[simp] +theorem countVector_apply (I : NumberFieldFractionalIdealGroup K) + (v : HeightOneSpectrum (𝓞 K)) : + countVector I v = + FractionalIdeal.count K v + (I : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) := + rfl + +open scoped Classical in +theorem count_factorization + (exps : Multiplicative (HeightOneSpectrum (𝓞 K) →₀ ℤ)) + (v : HeightOneSpectrum (𝓞 K)) : + FractionalIdeal.count K v + ((factorization exps : NumberFieldFractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = + exps.toAdd v := by + rw [factorization_val] + exact FractionalIdeal.count_finsuppProd K v exps.toAdd + +open scoped Classical in +theorem ext_count {I J : NumberFieldFractionalIdealGroup K} + (h : ∀ v : HeightOneSpectrum (𝓞 K), + FractionalIdeal.count K v + (I : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = + FractionalIdeal.count K v + (J : FractionalIdeal (nonZeroDivisors (𝓞 K)) K)) : + I = J := by + apply Units.ext + rw [← FractionalIdeal.finprod_heightOneSpectrum_factorization' + K (Units.ne_zero I), + ← FractionalIdeal.finprod_heightOneSpectrum_factorization' + K (Units.ne_zero J)] + exact finprod_congr fun v => congrArg + (fun n : ℤ => + (v.asIdeal : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) ^ n) (h v) + +open scoped Classical in +theorem factorization_injective : + Function.Injective (factorization (K := K)) := by + intro a b hab + apply Multiplicative.ext + ext v + rw [← count_factorization a v, ← count_factorization b v, hab] + +open scoped Classical in +theorem factorization_surjective : + Function.Surjective (factorization (K := K)) := by + intro I + refine ⟨Multiplicative.ofAdd (countVector I), ?_⟩ + apply ext_count + intro v + rw [count_factorization] + change countVector I v = + FractionalIdeal.count K v + (I : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) + exact countVector_apply I v + +open scoped Classical in +/-- Multiplicative prime factorization of nonzero fractional ideals. -/ +def factorizationEquiv : + Multiplicative (HeightOneSpectrum (𝓞 K) →₀ ℤ) ≃* + NumberFieldFractionalIdealGroup K := + MulEquiv.ofBijective (factorization (K := K)) + ⟨factorization_injective, factorization_surjective⟩ + +end NumberFieldFractionalIdealGroup + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealGroup.lean new file mode 100644 index 0000000000..876e971f84 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealGroup.lean @@ -0,0 +1,29 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.NumberField.Basic +public import Mathlib.RingTheory.ClassGroup.Basic +/-! +# Fractional-ideal group of a number field +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +namespace ClassFieldTheory + +universe u + +/-- The group of nonzero fractional ideals of a number field. -/ +abbrev NumberFieldFractionalIdealGroup + (K : Type u) [Field K] := + (FractionalIdeal (nonZeroDivisors (𝓞 K)) K)ˣ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory.lean new file mode 100644 index 0000000000..62c0aca3e9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IdeleClassConnectedQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IsMaximalAbelianGlobalArtin + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/All.lean new file mode 100644 index 0000000000..972c84ba48 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/All.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IdeleClassConnectedQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IsMaximalAbelianGlobalArtin +/-! +# Global class field theory definitions + +This module collects the reader-facing finite and topological vocabulary. +It imports definitions only; assertions are in the corresponding `Theorems` module. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianExtension.lean new file mode 100644 index 0000000000..19dcc1bd3f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianExtension.lean @@ -0,0 +1,63 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.FieldTheory.IsSepClosed +public import Mathlib.NumberTheory.NumberField.Basic +/-! +# Finite abelian extensions of number fields + +This module packages finite abelian extensions inside Mathlib's chosen +separable closure. It contains no class-field-theory implementation. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- A finite abelian extension of a number field inside Mathlib's chosen +separable closure. The inherited order is inclusion of intermediate fields. -/ +abbrev FiniteAbelianExtension + (K : Type u) [Field K] := + { E : IntermediateField K (SeparableClosure K) // + FiniteDimensional K E ∧ IsAbelianGalois K E } + +namespace FiniteAbelianExtension + +instance {K : Type u} [Field K] [NumberField K] : + CoeSort (FiniteAbelianExtension K) (Type u) where + coe E := E.1 + +instance {K : Type u} [Field K] [NumberField K] + (E : FiniteAbelianExtension K) : Field E := + inferInstance + +instance {K : Type u} [Field K] [NumberField K] + (E : FiniteAbelianExtension K) : FiniteDimensional K E := + E.2.1 + +instance {K : Type u} [Field K] [NumberField K] + (E : FiniteAbelianExtension K) : Algebra K E := + inferInstance + +instance {K : Type u} [Field K] [NumberField K] + (E : FiniteAbelianExtension K) : NumberField E := + NumberField.of_module_finite K E + +instance {K : Type u} [Field K] [NumberField K] + (E : FiniteAbelianExtension K) : IsAbelianGalois K E := + E.2.2 + +end FiniteAbelianExtension + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianReciprocityData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianReciprocityData.lean new file mode 100644 index 0000000000..aa23fb79da --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianReciprocityData.lean @@ -0,0 +1,51 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +/-! +# Finite abelian global reciprocity data + +The interface is ideal-theoretic: a ray-class Artin map is normalized by +arithmetic Frobenius away from its modulus. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +namespace ClassFieldTheory + +universe u v + +/-- Finite abelian global-reciprocity data in ideal-theoretic form. -/ +structure FiniteAbelianReciprocityData + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] where + /-- A modulus through which the finite Artin map factors. -/ + modulus : RayClassModulus K + /-- The extension is unramified away from the modulus. -/ + unramifiedOutsideModulus : IsUnramifiedOutsideModulus K L modulus + /-- The finite Artin map on the ray class group. -/ + artin : RayClassGroup modulus →* (L ≃ₐ[K] L) + /-- The finite Artin map is onto. -/ + artin_surjective : Function.Surjective artin + /-- A prime class maps to arithmetic Frobenius. -/ + artin_frobenius : + ∀ (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ modulus.finitePart.support) + (w : HeightOneSpectrum (𝓞 L)), + w.asIdeal.LiesOver v.asIdeal → + artin (rayClassOfFinitePrime modulus v hv) = + arithmeticFrobeniusAt (K := K) w + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquiv.lean new file mode 100644 index 0000000000..229a15f88b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquiv.lean @@ -0,0 +1,39 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +public import Mathlib.GroupTheory.QuotientGroup.Basic +/-! +# The quotient induced by a finite Artin map + +This is the specific isomorphism induced by the Artin map in +`FiniteAbelianReciprocityData`, not an arbitrarily chosen isomorphism. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- The first-isomorphism-theorem map induced by a finite Artin map. -/ +def finiteAbelianReciprocityQuotientEquiv + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + (D : FiniteAbelianReciprocityData K L) : + (RayClassGroup D.modulus ⧸ D.artin.ker) ≃* (L ≃ₐ[K] L) := + QuotientGroup.quotientKerEquivOfSurjective D.artin D.artin_surjective + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FinitePlaceTensorNormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FinitePlaceTensorNormSubgroup.lean new file mode 100644 index 0000000000..75f33a0949 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FinitePlaceTensorNormSubgroup.lean @@ -0,0 +1,44 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +public import Mathlib.RingTheory.Norm.Basic +public import Mathlib.RingTheory.TensorProduct.Basic +/-! +# Finite-place tensor-norm subgroup + +The local algebra of `L / K` at a finite place `v` is +`K_v ⊗[K] L`. Its determinant norm on units defines a subgroup of +`K_vˣ`. This definition retains the whole tensor algebra, including all +factors above `v`; it does not choose a single completion of `L`. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- The image of the determinant norm from the unit group of the finite-place +tensor algebra `K_v ⊗[K] L` into `K_vˣ`. -/ +def finitePlaceTensorNormSubgroup + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [Algebra K L] + (v : HeightOneSpectrum (𝓞 K)) : + Subgroup (v.adicCompletion K)ˣ := + (Units.map (Algebra.norm (v.adicCompletion K) : + (v.adicCompletion K ⊗[K] L) →* v.adicCompletion K)).range + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/IdeleClassConnectedQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/IdeleClassConnectedQuotient.lean new file mode 100644 index 0000000000..d73ba44442 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/IdeleClassConnectedQuotient.lean @@ -0,0 +1,45 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.NumberField.AdeleRing +public import Mathlib.Topology.Algebra.Group.Quotient +public import Mathlib.Topology.Algebra.Group.Subgroup +public import Mathlib.Topology.Algebra.Group.Units +/-! +# The connected-component quotient of the idèle class group + +For a number field `K`, Mathlib's idèle class group is the unit group of +the adele ring modulo principal idèles. Its quotient by the connected +component of `1` is the group appearing in topological global reciprocity. +-/ + +@[expose] public section + +open scoped NumberField + +namespace ClassFieldTheory + +universe u + +/-- The identity component is normal because the idèle class group is abelian. -/ +instance instNormalIdeleClassConnectedComponent + (K : Type u) [Field K] [NumberField K] : + (Subgroup.connectedComponentOfOne (NumberField.IdeleClassGroup (𝓞 K) K)).Normal := by + constructor + intro n hn g + have h : g * n * g⁻¹ = n := by + rw [mul_comm g n, mul_assoc, mul_inv_cancel, mul_one] + rw [h] + exact hn + +/-- The idèle class group modulo its identity component. -/ +abbrev IdeleClassConnectedQuotient (K : Type u) [Field K] [NumberField K] := + NumberField.IdeleClassGroup (𝓞 K) K ⧸ + Subgroup.connectedComponentOfOne (NumberField.IdeleClassGroup (𝓞 K) K) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/IsMaximalAbelianGlobalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/IsMaximalAbelianGlobalArtin.lean new file mode 100644 index 0000000000..3076c16ac3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/IsMaximalAbelianGlobalArtin.lean @@ -0,0 +1,38 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IdeleClassConnectedQuotient +public import Mathlib.FieldTheory.AbsoluteGaloisGroup +/-! +# A maximal-abelian reciprocity-map property + +This predicate records surjectivity and kernel equal to the identity +component of the idèle class group. These properties alone do not determine +the normalized Artin map: finite-level Frobenius compatibility is a separate +assertion. Existence is asserted in `Theorems`. +-/ + +@[expose] public section + +open scoped NumberField + +namespace ClassFieldTheory + +universe u + +/-- A continuous map to the abelianized Galois group with the expected +image and kernel; normalization is not part of this predicate. -/ +def IsMaximalAbelianGlobalArtin + (K : Type u) [Field K] [NumberField K] + (artin : NumberField.IdeleClassGroup (𝓞 K) K →ₜ* + Field.absoluteGaloisGroupAbelianization K) : Prop := + Function.Surjective artin ∧ + artin.ker = + Subgroup.connectedComponentOfOne (NumberField.IdeleClassGroup (𝓞 K) K) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf.lean new file mode 100644 index 0000000000..b79e6c7244 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf.lean @@ -0,0 +1,20 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsLowerRamificationJump +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsUpperRamificationJump +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/All.lean new file mode 100644 index 0000000000..d499a6e1c1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/All.lean @@ -0,0 +1,19 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsUpperRamificationJump +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsLowerRamificationJump +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup + +/-! # All -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunction.lean new file mode 100644 index 0000000000..a1c3e49a67 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunction.lean @@ -0,0 +1,45 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex +public import Mathlib.Algebra.Order.Floor.Ring +public import Mathlib.Algebra.Order.Archimedean.Real.Basic +public import Mathlib.Basic.Real.Basic +/-! +# The real Herbrand function from integral lower groups + +Between consecutive nonnegative integers, the function interpolates linearly +between the rational Herbrand values. On the negative half-line it is the +identity. Its slope on `(m, m + 1)` is `|G_(m+1)| / |G_0|`. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- The piecewise-linear Herbrand function attached to the lower ramification +groups of a valuation subring. This definition itself does not require the +extension to be finite. -/ +def herbrandFunction + (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + (A : ValuationSubring L) (s : ℝ) : ℝ := + if 0 ≤ s then + let m := ⌊s⌋₊ + (herbrandFunctionAtLowerIndex K A m : ℝ) + + (s - (m : ℝ)) * + ((Nat.card (lowerRamificationGroup K A (m + 1)) : ℝ) / + Nat.card (lowerRamificationGroup K A 0)) + else + s + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunctionAtLowerIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunctionAtLowerIndex.lean new file mode 100644 index 0000000000..a779406472 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunctionAtLowerIndex.lean @@ -0,0 +1,39 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup +public import Mathlib.Algebra.BigOperators.Group.Finset.Basic +public import Mathlib.Algebra.Field.Rat +public import Mathlib.Data.Finset.Interval +public import Mathlib.SetTheory.Cardinal.Finite +/-! +# The Herbrand function at integral lower indices +-/ + +@[expose] public section + +open scoped BigOperators + +noncomputable +section + +namespace ClassFieldTheory + +variable (K : Type*) {L : Type*} [Field K] [Field L] [Algebra K L] + +/-- The Herbrand value at a nonnegative integral lower index: +`φ(n) = (1 / |G₀|) · ∑_{i=1}^{n} |Gᵢ|`. + +Its ramification-theoretic interpretation requires the lower groups to be +finite. The definition alone does not impose that hypothesis. -/ +def herbrandFunctionAtLowerIndex (A : ValuationSubring L) (n : ℕ) : ℚ := + (∑ i ∈ Finset.Icc 1 n, + (Nat.card (lowerRamificationGroup K A i) : ℚ)) / + (Nat.card (lowerRamificationGroup K A 0) : ℚ) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean new file mode 100644 index 0000000000..087188eab8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean @@ -0,0 +1,40 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.Logic.Function.Basic +public import Mathlib.NumberTheory.LocalField.Basic +public import Mathlib.RingTheory.Valuation.Extension +/-! +# The inverse Herbrand function for a canonical local extension + +The defining choice is verified to be a two-sided inverse for finite Abelian +local extensions in the theorem layer. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- The inverse of the public real Herbrand function for the canonical +valuation ring of a finite Abelian local extension. -/ +def inverseHerbrandFunction + (K : Type u) (L : Type v) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] + [ValuativeRel L] [TopologicalSpace L] + (t : ℝ) : ℝ := + Function.invFun + (herbrandFunction K (ValuativeRel.valuation L).valuationSubring) t + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/IsLowerRamificationJump.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/IsLowerRamificationJump.lean new file mode 100644 index 0000000000..25a2aee2be --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/IsLowerRamificationJump.lean @@ -0,0 +1,25 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup +/-! +# Lower ramification jumps +-/ + +@[expose] public section + +namespace ClassFieldTheory + +variable (K : Type*) {L : Type*} [Field K] [Field L] [Algebra K L] + +/-- A nonnegative integer `n` is a lower ramification jump when the lower +ramification filtration strictly changes after index `n`. -/ +def IsLowerRamificationJump (A : ValuationSubring L) (n : ℕ) : Prop := + lowerRamificationGroup K A n ≠ lowerRamificationGroup K A (n + 1) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/IsUpperRamificationJump.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/IsUpperRamificationJump.lean new file mode 100644 index 0000000000..31a84a89b3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/IsUpperRamificationJump.lean @@ -0,0 +1,53 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup +/-! +# Upper ramification jumps + +The right-limit group is the supremum of upper groups at strictly larger +indices. A jump occurs exactly when that right limit differs from the group +at the index itself. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- The upper ramification group immediately after a real index. -/ +def upperRamificationGroupAfter + (K : Type u) (L : Type v) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (t : ℝ) : + Subgroup (((ValuativeRel.valuation L).valuationSubring).decompositionSubgroup K) := + ⨆ s : {s : ℝ // t < s}, upperRamificationGroup K L s + +/-- A real upper index is a jump when the upper filtration changes +immediately to its right. -/ +def IsUpperRamificationJump + (K : Type u) (L : Type v) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (t : ℝ) : Prop := + upperRamificationGroup K L t ≠ upperRamificationGroupAfter K L t + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/LowerRamificationGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/LowerRamificationGroup.lean new file mode 100644 index 0000000000..3628205f05 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/LowerRamificationGroup.lean @@ -0,0 +1,52 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RingTheory.Valuation.RamificationGroup +/-! +# Lower ramification groups +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +variable (K : Type*) {L : Type*} [Field K] [Field L] [Algebra K L] + +private lemma smul_mem_maximalIdeal_pow + (A : ValuationSubring L) (n : ℕ) + (σ : A.decompositionSubgroup K) {x : A} + (hx : x ∈ (IsLocalRing.maximalIdeal A) ^ n) : + σ • x ∈ (IsLocalRing.maximalIdeal A) ^ n := by + let e : A ≃+* A := + MulSemiringAction.toRingAut (A.decompositionSubgroup K) A σ + have hx' : e x ∈ ((IsLocalRing.maximalIdeal A) ^ n).map e := + Ideal.mem_map_of_mem e hx + rwa [Ideal.map_pow, IsLocalRing.map_ringEquiv_maximalIdeal] at hx' + +/-- The `n`-th ramification group in lower numbering for the valuation +subring `A`. Its elements act trivially on `A / m^(n + 1)`. -/ +def lowerRamificationGroup (A : ValuationSubring L) (n : ℕ) : + Subgroup (A.decompositionSubgroup K) where + carrier := {σ | ∀ x : A, + σ • x - x ∈ (IsLocalRing.maximalIdeal A) ^ (n + 1)} + one_mem' := by simp + mul_mem' := by + intro σ τ hσ hτ x + have hτ' := smul_mem_maximalIdeal_pow K A (n + 1) σ (hτ x) + have hsum := + (IsLocalRing.maximalIdeal A ^ (n + 1)).add_mem hτ' (hσ x) + simpa [mul_smul, smul_sub, sub_eq_add_neg, add_assoc] using hsum + inv_mem' := by + intro σ hσ x + simpa [smul_smul] using + (IsLocalRing.maximalIdeal A ^ (n + 1)).neg_mem (hσ (σ⁻¹ • x)) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/RealLowerRamificationGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/RealLowerRamificationGroup.lean new file mode 100644 index 0000000000..3769f86b27 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/RealLowerRamificationGroup.lean @@ -0,0 +1,81 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup +public import Mathlib.Algebra.Order.Archimedean.Real.Basic +public import Mathlib.Algebra.Order.Floor.Ring +public import Mathlib.Basic.Real.Basic +/-! +# Real-index lower ramification groups + +The ideal exponent at a real index `s` is `max(0, ceil(s + 1))`. +Consequently, indices at or below `-1` give the whole decomposition group, +and natural indices recover the usual `m^(n+1)` displacement condition. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +variable (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + +private lemma smul_mem_maximalIdeal_pow_real + (A : ValuationSubring L) (k : ℕ) + (σ : A.decompositionSubgroup K) {x : A} + (hx : x ∈ (IsLocalRing.maximalIdeal A) ^ k) : + σ • x ∈ (IsLocalRing.maximalIdeal A) ^ k := by + let e : A ≃+* A := + MulSemiringAction.toRingAut (A.decompositionSubgroup K) A σ + have hx' : e x ∈ ((IsLocalRing.maximalIdeal A) ^ k).map e := + Ideal.mem_map_of_mem e hx + rwa [Ideal.map_pow, IsLocalRing.map_ringEquiv_maximalIdeal] at hx' + +/-- The real-index lower ramification group of a valuation subring. Its +elements act trivially modulo `m ^ max(0, ceil(s + 1))`. -/ +def realLowerRamificationGroup (A : ValuationSubring L) (s : ℝ) : + Subgroup (A.decompositionSubgroup K) where + carrier := {σ | ∀ x : A, + σ • x - x ∈ + (IsLocalRing.maximalIdeal A) ^ (Int.ceil (s + 1)).toNat} + one_mem' := by simp + mul_mem' := by + intro σ τ hσ hτ x + have hτ' := smul_mem_maximalIdeal_pow_real K A + (Int.ceil (s + 1)).toNat σ (hτ x) + have hsum := + (IsLocalRing.maximalIdeal A ^ (Int.ceil (s + 1)).toNat).add_mem + hτ' (hσ x) + simpa [mul_smul, smul_sub, sub_eq_add_neg, add_assoc] using hsum + inv_mem' := by + intro σ hσ x + simpa [smul_smul] using + (IsLocalRing.maximalIdeal A ^ (Int.ceil (s + 1)).toNat).neg_mem + (hσ (σ⁻¹ • x)) + +/-- At or below index `-1`, the real lower ramification group is the full +decomposition group. -/ +theorem realLowerRamificationGroup_eq_top_of_le_neg_one + (A : ValuationSubring L) {s : ℝ} (hs : s ≤ -1) : + realLowerRamificationGroup K A s = ⊤ := by + have hzero : (Int.ceil (s + 1)).toNat = 0 := by + rw [Int.toNat_eq_zero] + exact Int.ceil_nonpos.mpr (by linarith) + apply (Subgroup.eq_top_iff' _).2 + intro σ + change ∀ x : A, + σ • x - x ∈ (IsLocalRing.maximalIdeal A) ^ (Int.ceil (s + 1)).toNat + intro x + rw [hzero, pow_zero, Ideal.one_eq_top] + exact Submodule.mem_top + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/UpperRamificationGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/UpperRamificationGroup.lean new file mode 100644 index 0000000000..513fc89050 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/UpperRamificationGroup.lean @@ -0,0 +1,43 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup +/-! +# Real-index upper ramification groups + +The upper group at `t` is the public real lower group at the inverse +Herbrand index `ψ(t)`. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- The upper ramification group of the canonical valuation ring of a +finite Abelian local extension, using the inverse public Herbrand function. -/ +def upperRamificationGroup + (K : Type u) (L : Type v) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (t : ℝ) : + Subgroup (((ValuativeRel.valuation L).valuationSubring).decompositionSubgroup K) := + realLowerRamificationGroup K + (ValuativeRel.valuation L).valuationSubring + (inverseHerbrandFunction K L t) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols.lean new file mode 100644 index 0000000000..3cc92a2560 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols.lean @@ -0,0 +1,27 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.FinitePlaceHilbertBadSet +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFamily +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalInfinitePlaceHilbertSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingLaws +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingNormResidueCriterion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsKummerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebraNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClassGroup + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/All.lean new file mode 100644 index 0000000000..a2dbf6ae70 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/All.lean @@ -0,0 +1,26 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFamily +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalInfinitePlaceHilbertSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.FinitePlaceHilbertBadSet +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingLaws +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingNormResidueCriterion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsKummerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebraNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClassGroup + +/-! # All -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/FinitePlaceHilbertBadSet.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/FinitePlaceHilbertBadSet.lean new file mode 100644 index 0000000000..0a945396a5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/FinitePlaceHilbertBadSet.lean @@ -0,0 +1,35 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +/-! +# Possible nontrivial finite-place Hilbert factors + +This set depends on the two nonzero global arguments and the exponent. A +finite place is excluded exactly when all three have valuation one there. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +namespace ClassFieldTheory + +universe u + +/-- The places where `a`, `b`, or the exponent is not a valuation-ring unit. +This is the precise finite-place bound for global Hilbert factors. -/ +def finitePlaceHilbertBadSet + (F : Type u) [Field F] [NumberField F] + (n : ℕ+) (a b : Fˣ) : Set (HeightOneSpectrum (𝓞 F)) := + {v | v.valuation F (a : F) ≠ 1 ∨ + v.valuation F (b : F) ≠ 1 ∨ + v.valuation F ((n : ℕ) : F) ≠ 1} + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingFamily.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingFamily.lean new file mode 100644 index 0000000000..a1abd19880 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingFamily.lean @@ -0,0 +1,30 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairing +public import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +/-! +# Families of finite-place Hilbert pairings +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +namespace ClassFieldTheory + +universe u + +/-- A choice of power-class pairing on the completion of `F` at every finite +place. No reciprocity law is hidden in this data type. -/ +abbrev GlobalHilbertPairingFamily + (F : Type u) [Field F] [NumberField F] (n : ℕ+) := + ∀ v : HeightOneSpectrum (𝓞 F), HilbertPairing (v.adicCompletion F) n + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingFiniteFactor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingFiniteFactor.lean new file mode 100644 index 0000000000..be4c954230 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingFiniteFactor.lean @@ -0,0 +1,47 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFamily +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +public import Mathlib.RingTheory.RootsOfUnity.PrimitiveRoots +/-! +# Finite-place factors of a global Hilbert pairing family +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory.GlobalHilbertPairingFamily + +universe u + +/-- Evaluate a local pairing on two nonzero elements of the number field and +transport the resulting root of unity back to the number field. -/ +def finiteFactor + (F : Type u) [Field F] [NumberField F] + {n : ℕ+} (B : GlobalHilbertPairingFamily F n) + (hmu : (primitiveRoots (n : ℕ) F).Nonempty) + (v : HeightOneSpectrum (𝓞 F)) (a b : Fˣ) : + rootsOfUnity (n : ℕ) F := by + letI : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + let e : rootsOfUnity (n : ℕ) F ≃* rootsOfUnity (n : ℕ) (v.adicCompletion F) := + rootsOfUnityEquivOfPrimitiveRoots + (algebraMap F (v.adicCompletion F)).injective hmu + exact e.symm + (B v + (powerClass (v.adicCompletion F) n + (Units.map (algebraMap F (v.adicCompletion F)).toMonoidHom a)) + (powerClass (v.adicCompletion F) n + (Units.map (algebraMap F (v.adicCompletion F)).toMonoidHom b))) + +end ClassFieldTheory.GlobalHilbertPairingFamily diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingProperties.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingProperties.lean new file mode 100644 index 0000000000..2f4d5d242c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingProperties.lean @@ -0,0 +1,41 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +/-! +# Locality and support conditions for global Hilbert pairing families +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +namespace ClassFieldTheory.GlobalHilbertPairingFamily + +universe u + +/-- Every finite-place member of the family is a local Hilbert pairing. -/ +def IsLocallyHilbert + (F : Type u) [Field F] [NumberField F] + {n : ℕ+} (B : GlobalHilbertPairingFamily F n) : Prop := + ∀ v : HeightOneSpectrum (𝓞 F), + HilbertPairing.IsLocalHilbertPairing (B v) + +/-- For each pair of nonzero elements of the number field, only finitely many +finite-place factors are nontrivial. -/ +def HasFiniteSupport + (F : Type u) [Field F] [NumberField F] + {n : ℕ+} (B : GlobalHilbertPairingFamily F n) + (hmu : (primitiveRoots (n : ℕ) F).Nonempty) : Prop := + ∀ a b : Fˣ, + Function.HasFiniteMulSupport (fun v : HeightOneSpectrum (𝓞 F) ↦ + finiteFactor F B hmu v a b) + +end ClassFieldTheory.GlobalHilbertPairingFamily diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalInfinitePlaceHilbertSymbol.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalInfinitePlaceHilbertSymbol.lean new file mode 100644 index 0000000000..4cbffb6290 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalInfinitePlaceHilbertSymbol.lean @@ -0,0 +1,50 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.NumberField.InfinitePlace.Basic +public import Mathlib.RingTheory.RootsOfUnity.PrimitiveRoots +/-! +# Infinite-place Hilbert factors +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- The Hilbert factor at an infinite place. It is nontrivial only at a real +place for the quadratic exponent, when both arguments are negative. + +In the product-formula theorem the field contains a primitive `n`-th root of +unity; under that hypothesis real places occur only in the cases covered by +this formula. -/ +def globalInfinitePlaceHilbertSymbol + (F : Type u) [Field F] + (n : ℕ+) (v : InfinitePlace F) (a b : Fˣ) : + rootsOfUnity (n : ℕ) F := by + by_cases hn : (n : ℕ) = 2 + · by_cases hv : v.IsReal + · by_cases ha : InfinitePlace.embedding_of_isReal hv (a : F) < 0 + · by_cases hb : InfinitePlace.embedding_of_isReal hv (b : F) < 0 + · refine ⟨(-1 : Fˣ), ?_⟩ + change (-1 : Fˣ) ^ (n : ℕ) = 1 + rw [hn] + simp + · exact 1 + · exact 1 + · exact 1 + · exact 1 + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairing.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairing.lean new file mode 100644 index 0000000000..e766166a68 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairing.lean @@ -0,0 +1,27 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClassGroup +public import Mathlib.RingTheory.RootsOfUnity.PrimitiveRoots +/-! +# Pairings on power classes +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- Multiplicative pairings on `n`-th power classes with values in the +`n`-th roots of unity. -/ +abbrev HilbertPairing (K : Type u) [Field K] (n : ℕ+) := + PowerClassGroup K n →* + (PowerClassGroup K n →* rootsOfUnity (n : ℕ) K) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingLaws.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingLaws.lean new file mode 100644 index 0000000000..36640fca65 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingLaws.lean @@ -0,0 +1,42 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol +/-! +# Algebraic laws for Hilbert pairings +-/ + +@[expose] public section + +namespace ClassFieldTheory.HilbertPairing + +universe u + +/-- The Steinberg relation for a pairing on power classes. -/ +def IsSteinberg + {K : Type u} [Field K] {n : ℕ+} + (B : HilbertPairing K n) : Prop := + ∀ (a : Kˣ) (ha : 1 - (a : K) ≠ 0), + B.symbol a (Units.mk0 (1 - (a : K)) ha) = 1 + +/-- Skew-symmetry of a pairing on power classes. -/ +def IsSkewSymmetric + {K : Type u} [Field K] {n : ℕ+} + (B : HilbertPairing K n) : Prop := + ∀ a b : PowerClassGroup K n, B a b = (B b a)⁻¹ + +/-- Nondegeneracy in both variables of a pairing on power classes. -/ +def IsNondegenerate + {K : Type u} [Field K] {n : ℕ+} + (B : HilbertPairing K n) : Prop := + (∀ a : PowerClassGroup K n, + (∀ b : PowerClassGroup K n, B a b = 1) → a = 1) ∧ + (∀ b : PowerClassGroup K n, + (∀ a : PowerClassGroup K n, B a b = 1) → b = 1) + +end ClassFieldTheory.HilbertPairing diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingNormResidueCriterion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingNormResidueCriterion.lean new file mode 100644 index 0000000000..58fe95ce00 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingNormResidueCriterion.lean @@ -0,0 +1,28 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsKummerNorm +/-! +# The norm-residue criterion +-/ + +@[expose] public section + +namespace ClassFieldTheory.HilbertPairing + +universe u + +/-- The symbol of `a` and `b` is one exactly when `b` is a norm from the +Kummer algebra of `a`. -/ +def SatisfiesNormResidueCriterion + {K : Type u} [Field K] {n : ℕ+} + (B : HilbertPairing K n) : Prop := + ∀ a b : Kˣ, B.symbol a b = 1 ↔ IsKummerNorm K n a b + +end ClassFieldTheory.HilbertPairing diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingSymbol.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingSymbol.lean new file mode 100644 index 0000000000..26f759c74a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingSymbol.lean @@ -0,0 +1,28 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +/-! +# Evaluation of a Hilbert pairing on representatives +-/ + +@[expose] public section + +namespace ClassFieldTheory.HilbertPairing + +universe u + +/-- Evaluate a power-class pairing on representatives in `Kˣ`. -/ +def symbol + {K : Type u} [Field K] {n : ℕ+} + (B : HilbertPairing K n) (a b : Kˣ) : + rootsOfUnity (n : ℕ) K := + B (powerClass K n a) (powerClass K n b) + +end ClassFieldTheory.HilbertPairing diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/IsKummerNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/IsKummerNorm.lean new file mode 100644 index 0000000000..44739f5aa8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/IsKummerNorm.lean @@ -0,0 +1,28 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +public import Mathlib.RingTheory.Norm.Basic +/-! +# Norms from Kummer algebras +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- A nonzero element `b` is a norm from the Kummer algebra +`K[X] / (X^n - a)`. -/ +def IsKummerNorm + (K : Type u) [Field K] (n : ℕ+) (a b : Kˣ) : Prop := + ∃ y : (KummerAlgebra K n a)ˣ, + Algebra.norm K (y : KummerAlgebra K n a) = (b : K) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/IsLocalHilbertPairing.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/IsLocalHilbertPairing.lean new file mode 100644 index 0000000000..ac2ab45a59 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/IsLocalHilbertPairing.lean @@ -0,0 +1,30 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingLaws +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingNormResidueCriterion +/-! +# Local Hilbert pairings +-/ + +@[expose] public section + +namespace ClassFieldTheory.HilbertPairing + +universe u + +/-- The algebraic laws and Kummer norm-residue criterion required of a local +Hilbert pairing. These properties do not fix the value normalization of the +symbol; that requires a comparison with a normalized Artin map. -/ +def IsLocalHilbertPairing + {K : Type u} [Field K] {n : ℕ+} + (B : HilbertPairing K n) : Prop := + B.IsSteinberg ∧ B.IsSkewSymmetric ∧ B.IsNondegenerate ∧ + B.SatisfiesNormResidueCriterion + +end ClassFieldTheory.HilbertPairing diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/KummerAlgebra.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/KummerAlgebra.lean new file mode 100644 index 0000000000..9717c90304 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/KummerAlgebra.lean @@ -0,0 +1,26 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.KummerExtension +/-! +# Canonical Kummer algebras +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- The Kummer algebra `K[X] / (X^n - a)`. It remains canonical when the +polynomial is reducible, so no root in a chosen closure is required. -/ +abbrev KummerAlgebra + (K : Type u) [Field K] (n : ℕ+) (a : Kˣ) := + AdjoinRoot (Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K)) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/KummerAlgebraNormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/KummerAlgebraNormSubgroup.lean new file mode 100644 index 0000000000..809bf61406 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/KummerAlgebraNormSubgroup.lean @@ -0,0 +1,33 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +public import Mathlib.RingTheory.Norm.Basic +/-! +# Norm subgroup of a Kummer algebra + +This is the image of the determinant norm on units of `K[X] / (X^n - a)`. +The algebra need not be a field, so this subgroup is defined without any +irreducibility assumption on the polynomial. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- The unit-norm image of the possibly reducible Kummer algebra. -/ +def kummerAlgebraNormSubgroup + (K : Type u) [Field K] (n : ℕ+) (a : Kˣ) : Subgroup Kˣ := + (Units.map (Algebra.norm K : KummerAlgebra K n a →* K)).range + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/PowerClass.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/PowerClass.lean new file mode 100644 index 0000000000..286657d6e6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/PowerClass.lean @@ -0,0 +1,25 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClassGroup +/-! +# Canonical power classes +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- The canonical class of a nonzero field element modulo `n`-th powers. -/ +def powerClass (K : Type u) [Field K] (n : ℕ+) : Kˣ →* PowerClassGroup K n := by + unfold PowerClassGroup + exact QuotientGroup.mk' (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/PowerClassGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/PowerClassGroup.lean new file mode 100644 index 0000000000..1f421c9561 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/PowerClassGroup.lean @@ -0,0 +1,30 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Field.Basic +public import Mathlib.GroupTheory.QuotientGroup.Basic +/-! +# Multiplicative power-class groups +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- The multiplicative group of a field modulo its `n`-th powers. -/ +def PowerClassGroup (K : Type u) [Field K] (n : ℕ+) : Type u := + Kˣ ⧸ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range + +instance instCommGroupPowerClassGroup + (K : Type u) [Field K] (n : ℕ+) : CommGroup (PowerClassGroup K n) := by + unfold PowerClassGroup + infer_instance + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory.lean new file mode 100644 index 0000000000..327c0e8957 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormHom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.OpenFiniteIndexSubgroup + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/All.lean new file mode 100644 index 0000000000..7a95c674ab --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/All.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormHom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.OpenFiniteIndexSubgroup + +/-! # All -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormHom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormHom.lean new file mode 100644 index 0000000000..21469708b8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormHom.lean @@ -0,0 +1,30 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RingTheory.Norm.Basic +/-! +# The field norm on multiplicative groups +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- The field norm as a homomorphism on multiplicative groups. -/ +def fieldNormHom + (K : Type u) (L : Type v) + [Field K] [Field L] [Algebra K L] : + Lˣ →* Kˣ := + Units.map (Algebra.norm K) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormQuotient.lean new file mode 100644 index 0000000000..ad10f4e692 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormQuotient.lean @@ -0,0 +1,30 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +public import Mathlib.GroupTheory.QuotientGroup.Basic +/-! +# The field-norm quotient +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- The norm quotient `Kˣ / N_{L/K}(Lˣ)`. -/ +abbrev FieldNormQuotient + (K : Type u) (L : Type v) + [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] := + Kˣ ⧸ fieldNormSubgroup K L + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormSubgroup.lean new file mode 100644 index 0000000000..d837c2652a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormSubgroup.lean @@ -0,0 +1,30 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormHom +/-! +# The subgroup of field norms +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- The subgroup `N_{L/K}(Lˣ)` of nonzero field norms. -/ +def fieldNormSubgroup + (K : Type u) (L : Type v) + [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] : + Subgroup Kˣ := + (fieldNormHom K L).range + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FiniteAbelianLocalExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FiniteAbelianLocalExtension.lean new file mode 100644 index 0000000000..8455ea1ec1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FiniteAbelianLocalExtension.lean @@ -0,0 +1,52 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.FieldTheory.IsSepClosed +/-! +# Finite abelian local extensions +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- A finite abelian extension of `K` inside Mathlib's chosen separable +closure. The inherited order is field inclusion. -/ +abbrev FiniteAbelianLocalExtension + (K : Type u) [Field K] := + { E : IntermediateField K (SeparableClosure K) // + FiniteDimensional K E ∧ IsAbelianGalois K E } + +namespace FiniteAbelianLocalExtension + +variable {K : Type u} [Field K] + +/-- The packaged intermediate field is finite-dimensional over the base. -/ +instance finiteDimensional (E : FiniteAbelianLocalExtension K) : + FiniteDimensional K E.1 := + E.2.1 + +/-- The packaged intermediate field is abelian Galois over the base. -/ +instance isAbelianGalois (E : FiniteAbelianLocalExtension K) : + IsAbelianGalois K E.1 := + E.2.2 + +/-- The norm subgroup belonging to a packaged finite abelian extension. -/ +def normSubgroup (E : FiniteAbelianLocalExtension K) : Subgroup Kˣ := + fieldNormSubgroup K E.1 + +end FiniteAbelianLocalExtension + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/IsFieldNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/IsFieldNorm.lean new file mode 100644 index 0000000000..39a56ebbe9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/IsFieldNorm.lean @@ -0,0 +1,30 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +/-! +# Predicate for field norms +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- A nonzero element of `K` is a field norm from `L`. -/ +def IsFieldNorm + (K : Type u) (L : Type v) + [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] + (x : Kˣ) : Prop := + x ∈ fieldNormSubgroup K L + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/OpenFiniteIndexSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/OpenFiniteIndexSubgroup.lean new file mode 100644 index 0000000000..992711e110 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/OpenFiniteIndexSubgroup.lean @@ -0,0 +1,27 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.GroupTheory.Index +public import Mathlib.Topology.Algebra.Group.Units +/-! +# Open finite-index subgroups of a field's multiplicative group +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- An open finite-index subgroup of the multiplicative group `Kˣ`. The +inherited order is ordinary subgroup inclusion. -/ +abbrev OpenFiniteIndexSubgroup + (K : Type u) [Field K] [TopologicalSpace K] := + { H : Subgroup Kˣ // IsOpen (H : Set Kˣ) ∧ H.FiniteIndex } + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems.lean new file mode 100644 index 0000000000..2807dcb61a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsEverywhereLocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtFinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/All.lean new file mode 100644 index 0000000000..26cb431c64 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/All.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsEverywhereLocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtFinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace + +/-! # All -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/ExtendingAbsoluteValue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/ExtendingAbsoluteValue.lean new file mode 100644 index 0000000000..ec1fc2a00f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/ExtendingAbsoluteValue.lean @@ -0,0 +1,31 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Algebra.Basic +public import Mathlib.Basic.Real.Basic +public import Mathlib.Topology.UniformSpace.AbsoluteValue +/-! +# Absolute values above a fixed absolute value + +This index type uses only Mathlib's absolute values and algebra map. Its +elements are precisely the absolute values on `L` extending `v` on `K`. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u v + +/-- An absolute value on `L` whose restriction along `K → L` is `v`. -/ +abbrev ExtendingAbsoluteValue + {K : Type u} [Field K] (v : AbsoluteValue K ℝ) + (L : Type v) [Field L] [Algebra K L] := + { w : AbsoluteValue L ℝ // ∀ a : K, w (algebraMap K L a) = v a } + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsEverywhereLocalNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsEverywhereLocalNorm.lean new file mode 100644 index 0000000000..082132ffdd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsEverywhereLocalNorm.lean @@ -0,0 +1,34 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtFinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace +/-! +# Everywhere local norms +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +namespace ClassFieldTheory + +universe u v + +/-- A unit is an everywhere local norm if it is a determinant norm after +base change to every finite and every infinite completion of `K`. -/ +def IsEverywhereLocalNorm + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [Algebra K L] [FiniteDimensional K L] + (x : Kˣ) : Prop := + (∀ w : HeightOneSpectrum (𝓞 K), IsNormAtFinitePlace K L w x) ∧ + ∀ w : InfinitePlace K, IsNormAtInfinitePlace K L w x + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtFinitePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtFinitePlace.lean new file mode 100644 index 0000000000..d7ead6c453 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtFinitePlace.lean @@ -0,0 +1,37 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +public import Mathlib.RingTheory.Norm.Basic +public import Mathlib.RingTheory.TensorProduct.Basic +/-! +# Norms at finite places +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +namespace ClassFieldTheory + +universe u v + +/-- A unit of `K` is a norm at a finite place `w` if its image in `K_w` is a +determinant norm from `K_w ⊗_K L`. -/ +def IsNormAtFinitePlace + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [Algebra K L] + (w : HeightOneSpectrum (𝓞 K)) (x : Kˣ) : Prop := + ∃ y : (w.adicCompletion K ⊗[K] L)ˣ, + Algebra.norm (w.adicCompletion K) + (y : w.adicCompletion K ⊗[K] L) = + algebraMap K (w.adicCompletion K) (x : K) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtInfinitePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtInfinitePlace.lean new file mode 100644 index 0000000000..c44dbb29a8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtInfinitePlace.lean @@ -0,0 +1,36 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.NumberField.Completion.InfinitePlace +public import Mathlib.RingTheory.Norm.Basic +public import Mathlib.RingTheory.TensorProduct.Basic +/-! +# Norms at infinite places +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField + +namespace ClassFieldTheory + +universe u v + +/-- A unit of `K` is a norm at an infinite place `w` if its image in the +completion `K_w` is a determinant norm from `K_w ⊗_K L`. -/ +def IsNormAtInfinitePlace + (K : Type u) (L : Type v) + [Field K] + [Field L] [Algebra K L] + (w : InfinitePlace K) (x : Kˣ) : Prop := + ∃ y : (w.Completion ⊗[K] L)ˣ, + Algebra.norm w.Completion (y : w.Completion ⊗[K] L) = + algebraMap K w.Completion (x : K) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory.lean new file mode 100644 index 0000000000..7cdbc7c9ae --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/All.lean new file mode 100644 index 0000000000..3d88cd7c39 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/All.lean @@ -0,0 +1,22 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.All +/-! +# Global class field theory + +This aggregate imports the implementation modules for global Artin reciprocity, +the class-field correspondence, Hilbert and power-residue reciprocity, ideal +Artin maps, decomposition, and principalization. Reader-facing statements are +collected in `ClassFieldTheory.Theorems.GlobalClassFieldTheory.All`. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom.lean new file mode 100644 index 0000000000..e3ae1152c5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom.lean @@ -0,0 +1,23 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.HasseNormPrinciple +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitNormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.KummerLocalNormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.MathlibNormInterface +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitLocalPowerMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SupportedIdelePowerLocalUnitQuotient + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/All.lean new file mode 100644 index 0000000000..8436693e7b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/All.lean @@ -0,0 +1,26 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.HasseNormPrinciple +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.MathlibNormInterface +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitNormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.KummerLocalNormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitLocalPowerMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SupportedIdelePowerLocalUnitQuotient +/-! +# The global class-field axiom and its arithmetic consequences + +This aggregate exports the cyclic idele-class norm-index calculation, the +Hasse norm principle, and the rational idele-class formation. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/CyclicIdeleClassNormIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/CyclicIdeleClassNormIndex.lean new file mode 100644 index 0000000000..fcd88f0720 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/CyclicIdeleClassNormIndex.lean @@ -0,0 +1,1200 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.PrimePowerKummerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.CyclotomicPrimeBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeDegreeSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.IdeleClassHerbrandSupportedFinal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.PrimeOrderFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.CohomologyBridge +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Hilbert90 +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.TateComparison +/-! +# The global class-field axiom + +This file proves the cyclic idele-class norm-index formula. The first +input is the `H⁻¹` calculation for the principal-idele term in + +`1 → Lˣ → I_L → C_L → 1`. + +For a cyclic extension this term vanishes by Hilbert 90. The result below +is transported through the actual low-degree Tate comparison and then +through the equivariant identification of `Lˣ` with the subgroup of +principal relative ideles. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +open CyclicCohomology +open CyclicCohomology.ProfiniteCohomology.Herbrand + +/-- Every degree-zero Tate class is annihilated by the order of the +acting group. For a fixed representative `a`, its group norm is +`a ^ |G|`. This exponent observation drives the prime-degree descent +step. -/ +theorem herbrandH0_pow_card_eq_one + {G A : Type} + [Group G] [Fintype G] + [CommGroup A] [MulDistribMulAction G A] + (q : HerbrandH0 G A) : + q ^ Fintype.card G = 1 := by + refine HerbrandH0.inductionOn + (motive := fun q : HerbrandH0 G A => + q ^ Fintype.card G = 1) + q ?_ + intro a + rw [← map_pow, HerbrandH0.mk_eq_one_iff] + refine ⟨(a : A), ?_⟩ + change (∏ g : G, g • (a : A)) = + (a : A) ^ Fintype.card G + calc + (∏ g : G, g • (a : A)) = + ∏ _g : G, (a : A) := by + apply Finset.prod_congr rfl + intro g _hg + exact a.property g + _ = (a : A) ^ Fintype.card G := by + rw [Finset.prod_const, Finset.card_univ] + +/-- Specialization of the exponent calculation to the actual relative +idele class group. -/ +theorem ideleClassHerbrandH0_pow_finrank_eq_one + (K L : Type) + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (q : + letI := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) : + letI := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + q ^ Module.finrank K L = 1 := by + let := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + rw [← IsGalois.card_aut_eq_finrank, + Nat.card_eq_fintype_card] + exact herbrandH0_pow_card_eq_one q + +section NormQuotientCommutativity + +local instance cyclicNormBase_isMulCommutative + (A : Type) [Field A] [NumberField A] : + IsMulCommutative (IdeleClassGroup A) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +/-- The concrete class-norm quotient `C_K / N C_L` has exponent dividing +`[L:K]`. -/ +theorem ideleClassNormQuotient_pow_finrank_eq_one + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (q : RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K L) : + q ^ Module.finrank K L = 1 := by + let := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + let e := + RelativeIdeleGroup.Cohomology.ideleClassHerbrandH0EquivNormQuotient K L + have h := + ideleClassHerbrandH0_pow_finrank_eq_one K L (e.symm q) + simpa only [map_pow, e.apply_symm_apply, map_one] using + congrArg e h + +/-- If a commutative group has exponent dividing `p`, then every +`d`-power map with `d` coprime to `p` is injective. In the prime-degree +argument, `p` is the extension degree and `d` is the roots-of-unity +base-change degree. -/ +theorem pow_injective_of_exponent_of_coprime + {A : Type} [CommGroup A] + (p d : ℕ) + (hexponent : ∀ x : A, x ^ p = 1) + (hcoprime : d.Coprime p) : + Function.Injective (fun x : A => x ^ d) := by + intro x y hxy + change x ^ d = y ^ d at hxy + have hdpow : (x * y⁻¹) ^ d = 1 := by + calc + (x * y⁻¹) ^ d = x ^ d * (y ^ d)⁻¹ := by + rw [mul_pow, inv_pow] + _ = 1 := by rw [hxy, mul_inv_cancel] + have horder_d : orderOf (x * y⁻¹) ∣ d := + orderOf_dvd_of_pow_eq_one hdpow + have horder_p : orderOf (x * y⁻¹) ∣ p := + orderOf_dvd_of_pow_eq_one (hexponent (x * y⁻¹)) + have horder_gcd : + orderOf (x * y⁻¹) ∣ Nat.gcd d p := + Nat.dvd_gcd horder_d horder_p + rw [hcoprime.gcd_eq_one] at horder_gcd + have hxy_one : x * y⁻¹ = 1 := + orderOf_eq_one_iff.mp (Nat.dvd_one.mp horder_gcd) + exact mul_inv_eq_one.mp hxy_one + +/-- On the actual class-norm quotient, every power coprime to the +extension degree is injective. -/ +theorem ideleClassNormQuotient_pow_injective_of_coprime + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (d : ℕ) + (hd : d.Coprime (Module.finrank K L)) : + Function.Injective + (fun q : RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K L => q ^ d) := by + let := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + let e := + RelativeIdeleGroup.Cohomology.ideleClassHerbrandH0EquivNormQuotient K L + have hpow : + Function.Injective + (fun x : HerbrandH0 (L ≃ₐ[K] L) (RelativeIdeleGroup.ClassGroup K L) => + x ^ d) := + pow_injective_of_exponent_of_coprime + (A := HerbrandH0 (L ≃ₐ[K] L) (RelativeIdeleGroup.ClassGroup K L)) + (Module.finrank K L) d + (ideleClassHerbrandH0_pow_finrank_eq_one K L) hd + intro x y hxy + apply e.symm.injective + apply hpow + exact + ((map_pow e.symm x d).symm.trans (congrArg e.symm hxy)).trans + (map_pow e.symm y d) + +/-- Source-producing form of the roots-of-unity base-change step. For a +pushout square `N = M ⊗[K] L`, if `[M:K]` is coprime +to `[L:K]`, the induced map + +`C_K / N_{L/K}C_L → C_M / N_{N/M}C_N` + +is injective. The target is expressed in the fixed-bottom-field tower +model, so no unproved identification `𝔸_K ⊗_K M ≃ 𝔸_M` is assumed. -/ +theorem pushoutNormQuotientMap_injective_of_coprime + (K M L N : Type) + [Field K] [NumberField K] + [Field M] + [Field L] [NumberField L] + [Field N] [NumberField N] + [Algebra K M] [Algebra K L] + [Algebra M N] [Algebra L N] [Algebra K N] + [IsScalarTower K M N] [IsScalarTower K L N] + [Algebra.IsPushout K M L N] + [FiniteDimensional K M] [FiniteDimensional K L] + [FiniteDimensional M N] [FiniteDimensional L N] + [IsGalois K L] + (hcoprime : + (Module.finrank K M).Coprime + (Module.finrank K L)) : + Function.Injective + (pushoutNormQuotientMap K M L N) := + pushoutNormQuotientMap_injective_of_pow_injective + K M L N + (ideleClassNormQuotient_pow_injective_of_coprime + K L (Module.finrank K M) hcoprime) + +section IntermediateNormQuotientCommutativity + +local instance cyclicNormRelative_isMulCommutative + (A B : Type) [Field A] [NumberField A] [Field B] [Algebra A B] : + IsMulCommutative (RelativeIdeleGroup.ClassGroup A B) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +/-- The pushout map with its target changed from the fixed-bottom tower +presentation to the actual norm quotient `C_M / N_{N/M} C_N`. + +Only the Galois hypothesis on the auxiliary extension `M/K` is needed +for this last comparison. -/ +noncomputable def actualPushoutNormQuotientMap + (K M L N : Type) + [Field K] [NumberField K] + [Field M] [NumberField M] + [Field L] + [Field N] + [Algebra K M] [Algebra K L] + [Algebra M N] [Algebra L N] [Algebra K N] + [IsScalarTower K M N] [IsScalarTower K L N] + [Algebra.IsPushout K M L N] + [FiniteDimensional K M] [FiniteDimensional K L] + [FiniteDimensional M N] + : + RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K L → + RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient M N := + fun q => + intermediateClassNormQuotientBaseChangeMulEquiv + K M N (pushoutNormQuotientMap K M L N q) + +/-- The actual pushout norm-quotient map sends a quotient representative +to the corresponding base-changed representative. -/ +theorem actualPushoutNormQuotientMap_mk + (K M L N : Type) + [Field K] [NumberField K] + [Field M] [NumberField M] + [Field L] [NumberField L] + [Field N] [NumberField N] + [Algebra K M] [Algebra K L] + [Algebra M N] [Algebra L N] [Algebra K N] + [IsScalarTower K M N] [IsScalarTower K L N] + [Algebra.IsPushout K M L N] + [FiniteDimensional K M] [FiniteDimensional K L] + [FiniteDimensional M N] [FiniteDimensional L N] + [IsGalois K M] + (c : IdeleClassGroup K) : + actualPushoutNormQuotientMap K M L N + (QuotientGroup.mk' + (RelativeIdeleGroup.Cohomology.ideleClassNorm K L).range c) = + QuotientGroup.mk' + (RelativeIdeleGroup.Cohomology.ideleClassNorm M N).range + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := M) + (RelativeIdeleGroup.classInclusion K M c)) := by + change + intermediateClassNormQuotientBaseChangeMulEquiv + K M N + (pushoutNormQuotientMap K M L N + (QuotientGroup.mk' + (RelativeIdeleGroup.classNorm K L).range c)) = + QuotientGroup.mk' + (RelativeIdeleGroup.classNorm M N).range + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := M) + (RelativeIdeleGroup.classInclusion K M c)) + rw [pushoutNormQuotientMap_mk, + intermediateClassNormQuotientBaseChangeMulEquiv_mk] + +/-- Actual-target form of the injective roots-of-unity base-change +step. -/ +theorem actualPushoutNormQuotientMap_injective_of_coprime + (K M L N : Type) + [Field K] [NumberField K] + [Field M] [NumberField M] + [Field L] [NumberField L] + [Field N] [NumberField N] + [Algebra K M] [Algebra K L] + [Algebra M N] [Algebra L N] [Algebra K N] + [IsScalarTower K M N] [IsScalarTower K L N] + [Algebra.IsPushout K M L N] + [FiniteDimensional K M] [FiniteDimensional K L] + [FiniteDimensional M N] [FiniteDimensional L N] + [IsGalois K L] [IsGalois K M] + (hcoprime : + (Module.finrank K M).Coprime + (Module.finrank K L)) : + Function.Injective + (actualPushoutNormQuotientMap K M L N) := by + intro x y hxy + apply + pushoutNormQuotientMap_injective_of_coprime + K M L N hcoprime + apply + (intermediateClassNormQuotientBaseChangeMulEquiv K M N).injective + exact hxy + +/-- Cardinal consequence with the actual `N/M` norm quotient as +target. -/ +theorem ideleClassNormQuotient_card_le_actualPushout + (K M L N : Type) + [Field K] [NumberField K] + [Field M] [NumberField M] + [Field L] [NumberField L] + [Field N] [NumberField N] + [Algebra K M] [Algebra K L] + [Algebra M N] [Algebra L N] [Algebra K N] + [IsScalarTower K M N] [IsScalarTower K L N] + [Algebra.IsPushout K M L N] + [FiniteDimensional K M] [FiniteDimensional K L] + [FiniteDimensional M N] [FiniteDimensional L N] + [IsGalois K L] [IsGalois K M] + [Finite (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient M N)] + (hcoprime : + (Module.finrank K M).Coprime + (Module.finrank K L)) : + Nat.card (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K L) ≤ + Nat.card (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient M N) := + Nat.card_le_card_of_injective + (actualPushoutNormQuotientMap K M L N) + (actualPushoutNormQuotientMap_injective_of_coprime + K M L N hcoprime) + +/-- Prime-degree upper bound. After adjoining the `p`-th roots of unity, +the prime-power Kummer calculation gives norm index `p` for the concrete +cyclotomic pushout. Coprimality of the cyclotomic degree then makes the +actual pushout map on norm quotients injective. -/ +theorem ideleClassNorm_index_le_prime_of_finrank_eq + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (p : ℕ) (hp : p.Prime) + (hdegree : Module.finrank K L = p) : + (RelativeIdeleGroup.Cohomology.ideleClassNorm K L).range.index ≤ p := by + let : NeZero p := ⟨hp.ne_zero⟩ + let M := KummerTheory.PrimeCyclotomicBase K p + let N := KummerTheory.PrimeCyclotomicPushout K L p + let : Field N := + KummerTheory.primeCyclotomicPushoutField + K L p hp hdegree + let : Algebra L N := + Algebra.TensorProduct.rightAlgebra + let : Algebra M N := + KummerTheory.primeCyclotomicPushoutAlgebra + K L p hp hdegree + let : FiniteDimensional M N := + Module.Finite.of_restrictScalars_finite K M N + let : FiniteDimensional L N := + Module.Finite.of_restrictScalars_finite K L N + let : NumberField N := + KummerTheory.primeCyclotomicPushout_numberField + K L p hp hdegree + let : IsGalois M N := + KummerTheory.primeCyclotomicPushout_isGalois + K L p hp hdegree + let n : ℕ+ := ⟨p, hp.pos⟩ + have hTargetIndex : + (RelativeIdeleGroup.Cohomology.ideleClassNorm M N).range.index = p := by + calc + (RelativeIdeleGroup.Cohomology.ideleClassNorm M N).range.index = + Module.finrank M N := by + simpa only [M, N, n] using + (ideleClassNorm_index_eq_finrank_primePowerKummer + (K := M) (E := N) n + (KummerTheory.primeCyclotomicBase_primitiveRoots_nonempty + (K := K) p hp) + p 1 hp (by omega) (by simp [n]) + (KummerTheory.primeCyclotomicPushoutGalEquivPiZMod + K L p hp hdegree)) + _ = p := + KummerTheory.primeCyclotomicPushout_finrank + K L p hp hdegree + have hTargetCard : + Nat.card + (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient M N) = + p := by + rw [← Subgroup.index_eq_card] + exact hTargetIndex + let : + Finite (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient M N) := + Nat.finite_of_card_ne_zero (by + rw [hTargetCard] + exact hp.ne_zero) + rw [Subgroup.index_eq_card] + calc + Nat.card (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K L) ≤ + Nat.card + (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient M N) := + ideleClassNormQuotient_card_le_actualPushout + K M L N + (KummerTheory.primeCyclotomicBase_finrank_coprime + (K := K) (L := L) p hp hdegree) + _ = p := hTargetCard + +/-- Actual tower form of the cardinal bound: + +`#(C_K / N_{L/K}C_L) ≤ + #(C_M / N_{L/M}C_L) · #(C_K / N_{M/K}C_M)`. -/ +theorem ideleClassNormQuotient_card_le_actual_tower_mul + (K M L : Type) + [Field K] [NumberField K] + [Field M] [NumberField M] + [Field L] [NumberField L] + [Algebra K M] [Algebra M L] [Algebra K L] + [IsScalarTower K M L] + [FiniteDimensional K M] [FiniteDimensional M L] + [Finite (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient M L)] + [Finite (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K M)] : + Nat.card (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K L) ≤ + Nat.card (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient M L) * + Nat.card (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K M) := by + let : Finite (RelativeIdeleGroup.ClassNormQuotient M L) := by + change + Finite + (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient M L) + infer_instance + let : Finite (RelativeIdeleGroup.ClassNormQuotient K M) := by + change + Finite + (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K M) + infer_instance + change + Nat.card (RelativeIdeleGroup.ClassNormQuotient K L) ≤ + Nat.card (RelativeIdeleGroup.ClassNormQuotient M L) * + Nat.card (RelativeIdeleGroup.ClassNormQuotient K M) + let e := + intermediateClassNormQuotientBaseChangeMulEquiv + K M L + let : + Finite + (IntermediateClassNormQuotient K M L) := + Finite.of_injective e e.injective + calc + Nat.card (RelativeIdeleGroup.ClassNormQuotient K L) ≤ + Nat.card + (IntermediateClassNormQuotient K M L) * + Nat.card + (RelativeIdeleGroup.ClassNormQuotient K M) := + ideleClassNormQuotient_card_le_mul K M L + _ = + Nat.card (RelativeIdeleGroup.ClassNormQuotient M L) * + Nat.card + (RelativeIdeleGroup.ClassNormQuotient K M) := by + rw [Nat.card_congr e.toEquiv] + +end IntermediateNormQuotientCommutativity + +/-- Relative-coordinate source for the norm-index calculation. -/ +theorem relativeIdeleClassNorm_index_eq_finrank_cyclic + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [IsCyclic (L ≃ₐ[K] L)] : + (RelativeIdeleGroup.Cohomology.ideleClassNorm K L).range.index = + Module.finrank K L := by + classical + induction hfinrank : Module.finrank K L using + Nat.strong_induction_on generalizing K L with + | h degree ih => + by_cases hdegreeOne : Module.finrank K L = 1 + · have hsurjective : + Function.Surjective + (RelativeIdeleGroup.Cohomology.ideleClassNorm K L) := by + intro c + refine + ⟨RelativeIdeleGroup.classInclusion K L c, ?_⟩ + calc + RelativeIdeleGroup.Cohomology.ideleClassNorm K L + (RelativeIdeleGroup.classInclusion K L c) = + c ^ Module.finrank K L := + ideleClassNorm_classInclusion K L c + _ = c := by rw [hdegreeOne, pow_one] + have hRange : + (RelativeIdeleGroup.Cohomology.ideleClassNorm K L).range = ⊤ := + MonoidHom.range_eq_top.mpr hsurjective + rw [hRange, Subgroup.index_top, ← hfinrank, hdegreeOne] + · have hdegreeLarge : + 1 < Module.finrank K L := by + have hpositive : 0 < Module.finrank K L := + Module.finrank_pos + omega + let p := + cyclicDegreePrime + (K := K) (L := L) hdegreeLarge + let M := + cyclicPrimeDegreeIntermediate + (K := K) (L := L) hdegreeLarge + let : IsGalois K M := + cyclicPrimeDegreeIntermediate_isGalois + (K := K) (L := L) hdegreeLarge + let : IsGalois M L := + cyclicPrimeDegreeIntermediate_top_isGalois + (K := K) (L := L) hdegreeLarge + let : IsCyclic (M ≃ₐ[K] M) := + cyclicPrimeDegreeIntermediate_base_isCyclic + (K := K) (L := L) hdegreeLarge + let : IsCyclic (L ≃ₐ[M] L) := + cyclicPrimeDegreeIntermediate_top_isCyclic + (K := K) (L := L) hdegreeLarge + let : NumberField M := + NumberField.of_module_finite K M + have hp : p.Prime := by + simpa only [p] using + cyclicDegreePrime_prime + (K := K) (L := L) hdegreeLarge + have hBaseDegree : + Module.finrank K M = p := by + simpa only [M, p] using + cyclicPrimeDegreeIntermediate_finrank + (K := K) (L := L) hdegreeLarge + have hTopDegree : + Module.finrank M L = + Module.finrank K L / p := by + simpa only [M, p] using + cyclicPrimeDegreeIntermediate_top_finrank + (K := K) (L := L) hdegreeLarge + have hTopLt : + Module.finrank M L < + Module.finrank K L := by + rw [hTopDegree] + exact + Nat.div_lt_self Module.finrank_pos hp.one_lt + have hTopLtDegree : + Module.finrank M L < degree := by + exact hTopLt.trans_eq hfinrank + have hTopIndex : + (RelativeIdeleGroup.Cohomology.ideleClassNorm M L).range.index = + Module.finrank M L := + ih (Module.finrank M L) hTopLtDegree M L rfl + have hBaseUpper : + (RelativeIdeleGroup.Cohomology.ideleClassNorm K M).range.index ≤ + Module.finrank K M := by + rw [hBaseDegree] + exact + ideleClassNorm_index_le_prime_of_finrank_eq + K M p hp hBaseDegree + obtain ⟨sigmaM, hsigmaM⟩ := + IsCyclic.exists_generator (α := M ≃ₐ[K] M) + have hBaseLower : + Module.finrank K M ≤ + (RelativeIdeleGroup.Cohomology.ideleClassNorm K M).range.index := + _root_.GlobalClassFieldTheory.Cohomology.finrank_le_ideleClassNorm_index + (K := K) (L := M) sigmaM hsigmaM + have hBaseIndex : + (RelativeIdeleGroup.Cohomology.ideleClassNorm K M).range.index = + Module.finrank K M := + le_antisymm hBaseUpper hBaseLower + have hTopCard : + Nat.card + (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient M L) = + Module.finrank M L := by + rw [← Subgroup.index_eq_card] + exact hTopIndex + have hBaseCard : + Nat.card + (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K M) = + Module.finrank K M := by + rw [← Subgroup.index_eq_card] + exact hBaseIndex + let : + Finite (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient M L) := + Nat.finite_of_card_ne_zero (by + rw [hTopCard] + exact Nat.ne_of_gt Module.finrank_pos) + let : + Finite (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K M) := + Nat.finite_of_card_ne_zero (by + rw [hBaseCard] + exact Nat.ne_of_gt Module.finrank_pos) + have hUpperCard : + Nat.card + (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K L) ≤ + Module.finrank K L := by + calc + Nat.card + (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K L) ≤ + Nat.card + (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient M L) * + Nat.card + (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K M) := + ideleClassNormQuotient_card_le_actual_tower_mul + K M L + _ = + Module.finrank M L * + Module.finrank K M := by + rw [hTopCard, hBaseCard] + _ = Module.finrank K L := by + rw [Nat.mul_comm, + Module.finrank_mul_finrank K M L] + have hUpper : + (RelativeIdeleGroup.Cohomology.ideleClassNorm K L).range.index ≤ + Module.finrank K L := by + rw [Subgroup.index_eq_card] + exact hUpperCard + obtain ⟨sigma, hsigma⟩ := + IsCyclic.exists_generator (α := L ≃ₐ[K] L) + have hLower : + Module.finrank K L ≤ + (RelativeIdeleGroup.Cohomology.ideleClassNorm K L).range.index := + _root_.GlobalClassFieldTheory.Cohomology.finrank_le_ideleClassNorm_index + (K := K) (L := L) sigma hsigma + exact (le_antisymm hUpper hLower).trans hfinrank + +/-- The ordinary idele-class norm has index equal to the degree for every +finite cyclic extension. -/ +theorem ideleClassNorm_index_eq_finrank_cyclic + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [IsCyclic (L ≃ₐ[K] L)] : + (_root_.ideleClassNorm K L).range.index = + Module.finrank K L := by + rw [ordinaryIdeleClassNorm_range_eq_relative] + exact + relativeIdeleClassNorm_index_eq_finrank_cyclic K L + +/-- Finiteness propagation through the actual tower norm-quotient +sequence. -/ +theorem relativeIdeleClassNormQuotient_finite_of_actual_tower + (K M L : Type) + [Field K] [NumberField K] + [Field M] [NumberField M] + [Field L] [NumberField L] + [Algebra K M] [Algebra M L] [Algebra K L] + [IsScalarTower K M L] + [FiniteDimensional K M] [FiniteDimensional M L] + [Finite (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient M L)] + [Finite (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K M)] : + Finite (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K L) := by + let : IsMulCommutative (RelativeIdeleGroup.ClassGroup K M) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + let : Finite (RelativeIdeleGroup.ClassNormQuotient M L) := by + change + Finite + (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient M L) + infer_instance + let : Finite (RelativeIdeleGroup.ClassNormQuotient K M) := by + change + Finite + (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K M) + infer_instance + change Finite (RelativeIdeleGroup.ClassNormQuotient K L) + let e := + intermediateClassNormQuotientBaseChangeMulEquiv + K M L + let : + Finite + (IntermediateClassNormQuotient K M L) := + Finite.of_injective e e.injective + let f := + intermediateToCompositeNormQuotient K M L + let g := + compositeToBaseNormQuotient K M L + let : + Fintype + (IntermediateClassNormQuotient K M L) := + Fintype.ofFinite _ + let : + Fintype (RelativeIdeleGroup.ClassNormQuotient K M) := + Fintype.ofFinite _ + let : + Fintype + (TowerCompositeClassNormQuotient K M L) := + Group.fintypeOfKerEqRange f g + (_root_.intermediateToCompositeNormQuotient_range_eq_ker + K M L).symm + exact + Finite.of_equiv + (TowerCompositeClassNormQuotient K M L) + (towerCompositeClassNormQuotientEquiv + K M L).toEquiv + +/-- The relative-coordinate presentation of the idele-class norm quotient +is finite and has cardinality at most +the extension degree for every finite abelian Galois extension. -/ +theorem + relativeIdeleClassNormQuotient_finite_and_card_le_finrank_abelian + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] : + Finite (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K L) ∧ + Nat.card (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K L) ≤ + Module.finrank K L := by + classical + induction hfinrank : Module.finrank K L using + Nat.strong_induction_on generalizing K L with + | h degree ih => + by_cases hdegreeOne : Module.finrank K L = 1 + · have hAutCard : + Nat.card (L ≃ₐ[K] L) = 1 := by + rw [IsGalois.card_aut_eq_finrank K L, hdegreeOne] + let : Subsingleton (L ≃ₐ[K] L) := + (Nat.card_eq_one_iff_unique.mp hAutCard).1 + let : IsCyclic (L ≃ₐ[K] L) := inferInstance + have hCard : + Nat.card + (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K L) = + 1 := by + rw [← Subgroup.index_eq_card, + relativeIdeleClassNorm_index_eq_finrank_cyclic K L, + hdegreeOne] + let : + Finite + (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K L) := + Nat.finite_of_card_ne_zero (by + rw [hCard] + exact one_ne_zero) + exact + ⟨inferInstance, by + rw [hCard, ← hfinrank, hdegreeOne]⟩ + · have hdegreeLarge : + 1 < Module.finrank K L := by + have hpositive : 0 < Module.finrank K L := + Module.finrank_pos + omega + let M := + primeOrderFixedField + (K := K) (L := L) hdegreeLarge + let : NumberField M := + NumberField.of_module_finite K M + let : IsAbelianGalois K M := inferInstance + let : IsAbelianGalois M L := inferInstance + let : IsCyclic (L ≃ₐ[M] L) := + primeOrderFixedField_isCyclic + (K := K) (L := L) hdegreeLarge + have hp : + (fixedFieldPrime + (K := K) (L := L) hdegreeLarge).Prime := + fixedFieldPrime_prime + (K := K) (L := L) hdegreeLarge + have hTopDegree : + Module.finrank M L = + fixedFieldPrime + (K := K) (L := L) hdegreeLarge := by + simpa only [M] using + (primeOrderFixedField_finrank + (K := K) (L := L) hdegreeLarge) + have hTopLarge : + 1 < Module.finrank M L := by + rw [hTopDegree] + exact hp.one_lt + have hBaseLt : + Module.finrank K M < Module.finrank K L := by + calc + Module.finrank K M < + Module.finrank K M * Module.finrank M L := + (Nat.lt_mul_iff_one_lt_right + Module.finrank_pos).2 hTopLarge + _ = Module.finrank K L := + Module.finrank_mul_finrank K M L + have hBaseLtDegree : + Module.finrank K M < degree := + hBaseLt.trans_eq hfinrank + have hBaseData : + Finite (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K M) ∧ + Nat.card + (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K M) ≤ + Module.finrank K M := + ih (Module.finrank K M) hBaseLtDegree K M rfl + let : + Finite + (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K M) := + hBaseData.1 + have hTopCard : + Nat.card + (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient M L) = + Module.finrank M L := by + rw [← Subgroup.index_eq_card] + exact relativeIdeleClassNorm_index_eq_finrank_cyclic M L + let : + Finite + (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient M L) := + Nat.finite_of_card_ne_zero (by + rw [hTopCard] + exact Nat.ne_of_gt Module.finrank_pos) + let : + Finite + (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K L) := + relativeIdeleClassNormQuotient_finite_of_actual_tower + K M L + refine ⟨inferInstance, ?_⟩ + calc + Nat.card + (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K L) ≤ + Nat.card + (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient M L) * + Nat.card + (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K M) := + ideleClassNormQuotient_card_le_actual_tower_mul + K M L + _ = + Module.finrank M L * + Nat.card + (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K M) := by + rw [hTopCard] + _ ≤ Module.finrank M L * Module.finrank K M := + Nat.mul_le_mul_left _ hBaseData.2 + _ = Module.finrank K L := by + rw [Nat.mul_comm, + Module.finrank_mul_finrank K M L] + _ = degree := hfinrank + +/-- Finiteness of the actual ordinary idele-class norm quotient of a finite +abelian Galois extension. -/ +theorem ideleClassNormQuotient_finite_abelian + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] : + Finite + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + rw [ordinaryIdeleClassNorm_range_eq_relative] + exact + (relativeIdeleClassNormQuotient_finite_and_card_le_finrank_abelian + K L).1 + +/-- Degree upper bound for the cardinality of the actual ordinary +idele-class norm quotient of a finite abelian Galois +extension. -/ +theorem ideleClassNormQuotient_card_le_finrank_abelian + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] : + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≤ + Module.finrank K L := by + rw [ordinaryIdeleClassNorm_range_eq_relative] + exact + (relativeIdeleClassNormQuotient_finite_and_card_le_finrank_abelian + K L).2 + +open _root_.GlobalClassFieldTheory.Cohomology renaming + ideleClass_herbrandQuotient_eq_card_of_supported_local_calculation → + ideleClass_herbrandQuotient_eq_card_of_supported_local_calculation in +open _root_.GlobalClassFieldTheory.Cohomology renaming + chosenFinitePlaceIsUnramified_of_notMem_ideleClassHerbrandSupport → + chosenFinitePlaceIsUnramified_of_notMem_ideleClassHerbrandSupport in +/-- The cardinalities of the actual Herbrand models of the low Tate groups +for a finite cyclic extension. The canonical Herbrand support +gives the Herbrand quotient `|G|`; the norm-index theorem supplies the +matching upper bound for `H⁰`, so the standard low-degree cardinal lemma +forces `H⁻¹` to have one element. -/ +theorem ideleClass_lowDegree_card_eq_finrank_cyclic + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (sigma : L ≃ₐ[K] L) + (hsigma : + ∀ tau : L ≃ₐ[K] L, + tau ∈ Subgroup.zpowers sigma) : + letI := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + Nat.card + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) = + Module.finrank K L ∧ + Nat.card + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) sigma) = + 1 := by + let := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + let : IsCyclic (L ≃ₐ[K] L) := + ⟨⟨sigma, hsigma⟩⟩ + obtain ⟨hC, hCvalue⟩ := + ideleClass_herbrandQuotient_eq_card_of_supported_local_calculation + (K := K) (L := L) + (_root_.ideleClassHerbrandSupport + (K := K) (L := L)) + sigma hsigma + (_root_.relativeSupportedAboveHerbrandSupport_sup_principal_eq_top + (K := K) (L := L)) + (chosenFinitePlaceIsUnramified_of_notMem_ideleClassHerbrandSupport + (K := K) (L := L)) + let : + Finite + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) := + hC.1 + let : + Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) sigma) := + hC.2 + have hQuotient : + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup.ClassGroup K L) + sigma = + (Module.finrank K L : ℚ) := by + simpa only [Fintype.card_eq_nat_card, + IsGalois.card_aut_eq_finrank K L] using + hCvalue + have hH0 : + Nat.card + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) = + Module.finrank K L := by + calc + Nat.card + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) = + (RelativeIdeleGroup.Cohomology.ideleClassNorm K L).range.index := + (RelativeIdeleGroup.Cohomology.ideleClassNorm_index_eq_herbrandH0_card + K L).symm + _ = Module.finrank K L := + relativeIdeleClassNorm_index_eq_finrank_cyclic K L + exact + CyclicCohomology.lowDegree_card_eq_of_herbrandQuotient_eq_nat_of_le + sigma (Module.finrank K L) Module.finrank_pos + hQuotient hH0.le + +/-- Finiteness and cardinalities of the actual low-degree Tate cohomology +groups of the relative idele class representation. -/ +theorem ideleClass_tate_lowDegree_finite_card_eq_finrank_cyclic + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (sigma : L ≃ₐ[K] L) + (hsigma : + ∀ tau : L ≃ₐ[K] L, + tau ∈ Subgroup.zpowers sigma) : + letI := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + Finite + (tateCohomology + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) 0) ∧ + Finite + (tateCohomology + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) (-1)) ∧ + Nat.card + (tateCohomology + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) 0) = + Module.finrank K L ∧ + Nat.card + (tateCohomology + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) (-1)) = + 1 := by + let := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + have hHerbrand := + ideleClass_lowDegree_card_eq_finrank_cyclic + K L sigma hsigma + let : + Finite + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) := + Nat.finite_of_card_ne_zero (by + rw [hHerbrand.1] + exact Nat.ne_of_gt Module.finrank_pos) + let : + Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) sigma) := + Nat.finite_of_card_ne_zero (by + rw [hHerbrand.2] + exact one_ne_zero) + let e0 : + tateCohomology + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) 0 ≃ + Additive + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) := + (tateH0IsoHerbrandH0 + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup.ClassGroup K L)).toLinearEquiv.toEquiv + let em : + tateCohomology + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) (-1) ≃ + Additive + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) sigma) := + (tateHMinusOneIsoHerbrandHMinusOne + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup.ClassGroup K L) + sigma hsigma).toLinearEquiv.toEquiv + let : + Finite + (tateCohomology + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) 0) := + Finite.of_injective e0 e0.injective + let : + Finite + (tateCohomology + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) (-1)) := + Finite.of_injective em em.injective + refine ⟨inferInstance, inferInstance, ?_, ?_⟩ + · calc + Nat.card + (tateCohomology + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) 0) = + Nat.card + (Additive + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L))) := + Nat.card_congr e0 + _ = Module.finrank K L := by + change + Nat.card + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) = + Module.finrank K L + exact hHerbrand.1 + · calc + Nat.card + (tateCohomology + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) (-1)) = + Nat.card + (Additive + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) sigma)) := + Nat.card_congr em + _ = 1 := by + change + Nat.card + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) sigma) = + 1 + exact hHerbrand.2 + +/-- The degree-minus-one vanishing conclusion in the exact multiplicative +form consumed by the Hasse norm principle. -/ +theorem ideleClass_tateHMinusOne_subsingleton_cyclic + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (sigma : L ≃ₐ[K] L) + (hsigma : + ∀ tau : L ≃ₐ[K] L, + tau ∈ Subgroup.zpowers sigma) : + letI := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + Subsingleton + (Multiplicative + (tateCohomology + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) (-1))) := by + let := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + have h := + ideleClass_tate_lowDegree_finite_card_eq_finrank_cyclic + K L sigma hsigma + change + Subsingleton + (tateCohomology + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) (-1)) + exact (Nat.card_eq_one_iff_unique.mp h.2.2.2).1 + +/-- Hilbert 90 makes the actual multiplicative `H⁻¹(G,Lˣ)` a +subsingleton for a supplied cyclic generator. -/ +theorem fieldUnitsHerbrandHMinusOne_subsingleton + (K L : Type) + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (σ : L ≃ₐ[K] L) + (hσ : ∀ τ : L ≃ₐ[K] L, τ ∈ Subgroup.zpowers σ) : + letI := + LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L + Subsingleton (HerbrandHMinusOne (L ≃ₐ[K] L) Lˣ σ) := by + let := + LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L + let e := + LocalClassFieldTheory.herbrandHminusOneEquivUnitsTateHminusOne + K L σ hσ + constructor + intro x y + apply e.injective + have hTateSubsingleton : + Subsingleton + (tateCohomology + (Rep.ofAlgebraAutOnUnits K L) (-1)) := + (Nat.card_eq_one_iff_unique.mp + (LocalClassFieldTheory.unitsTateHminusOne_card_eq_one + K L σ hσ)).1 + exact hTateSubsingleton.elim (e x) (e y) + +/-- Cardinal form of the Hilbert-90 calculation. -/ +theorem fieldUnitsHerbrandHMinusOne_card_eq_one + (K L : Type) + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (σ : L ≃ₐ[K] L) + (hσ : ∀ τ : L ≃ₐ[K] L, τ ∈ Subgroup.zpowers σ) : + letI := + LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L + Nat.card (HerbrandHMinusOne (L ≃ₐ[K] L) Lˣ σ) = 1 := by + let := + LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L + let : + Subsingleton + (HerbrandHMinusOne (L ≃ₐ[K] L) Lˣ σ) := + fieldUnitsHerbrandHMinusOne_subsingleton K L σ hσ + exact Nat.card_eq_one_iff_unique.mpr + ⟨inferInstance, ⟨1⟩⟩ + +/-- Transport Hilbert 90 from field units to the actual subgroup of +principal relative ideles. -/ +theorem principalIdelesHerbrandHMinusOne_subsingleton + (K L : Type) + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] + (σ : L ≃ₐ[K] L) + (hσ : ∀ τ : L ≃ₐ[K] L, τ ∈ Subgroup.zpowers σ) : + letI := + LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L + letI := + RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction K L + letI := + RelativeIdeleGroup.Cohomology.principalIdeleMulDistribMulAction K L + Subsingleton + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L) σ) := by + let := + LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L + let := + RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction K L + let := + RelativeIdeleGroup.Cohomology.principalIdeleMulDistribMulAction K L + let e := + fieldUnitsHerbrandHMinusOneEquivPrincipalIdeles + K L σ + let : + Subsingleton + (HerbrandHMinusOne (L ≃ₐ[K] L) Lˣ σ) := + fieldUnitsHerbrandHMinusOne_subsingleton K L σ hσ + constructor + intro x y + apply e.symm.injective + exact Subsingleton.elim (e.symm x) (e.symm y) + +/-- Cardinal form for the principal-idele term in the class-group exact +sequence. -/ +theorem principalIdelesHerbrandHMinusOne_card_eq_one + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (σ : L ≃ₐ[K] L) + (hσ : ∀ τ : L ≃ₐ[K] L, τ ∈ Subgroup.zpowers σ) : + letI := + RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction K L + letI := + RelativeIdeleGroup.Cohomology.principalIdeleMulDistribMulAction K L + Nat.card + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L) σ) = 1 := by + let := + LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L + let := + RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction K L + let := + RelativeIdeleGroup.Cohomology.principalIdeleMulDistribMulAction K L + let : + Subsingleton + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L) σ) := + principalIdelesHerbrandHMinusOne_subsingleton K L σ hσ + exact Nat.card_eq_one_iff_unique.mpr + ⟨inferInstance, ⟨1⟩⟩ + +end NormQuotientCommutativity + +end GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean new file mode 100644 index 0000000000..60af3ee84f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean @@ -0,0 +1,1346 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitNormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormProperties +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Cardinality +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.TateComparison +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Main +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.CohomologyBridge +/-! +# The Hasse norm principle: the concrete local-global map + +This file proves the Hasse norm principle on the actual idele and field norm +maps. The local condition is expressed canonically: +at a place `v` it is the image of the determinant norm on +`K_v ⊗[K] L`. At finite places this is the chosen completion norm +subgroup by +`_root_.finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup`. + +The resulting homomorphism + +`Kˣ / N(Lˣ) ⟶ I_K / I_K,loc-norm` + +is the concrete diagonal local-norm map. Its injectivity is exactly the +Hasse norm principle. The global-to-local inclusion and this equivalence +are independent of the global class-field axiom; the reverse inclusion +follows from degree-minus-one Tate-cohomology vanishing. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +open CategoryTheory +open CyclicCohomology.ProfiniteCohomology.Herbrand + +private theorem mulExact_transport_mulEquiv + {A B C B' C' : Type*} + [Monoid A] [Monoid B] [Monoid C] [Monoid B'] [Monoid C'] + (f : A →* B) (g : B →* C) + (eB : B ≃* B') (eC : C ≃* C') + (h : Function.MulExact f g) : + Function.MulExact + (eB.toMonoidHom.comp f) + (eC.toMonoidHom.comp (g.comp eB.symm.toMonoidHom)) := by + intro y + change + eC (g (eB.symm y)) = 1 ↔ + ∃ x, eB (f x) = y + constructor + · intro hy + have hy' : g (eB.symm y) = 1 := + eC.map_eq_one_iff.mp hy + obtain ⟨x, hx⟩ := (h (eB.symm y)).mp hy' + refine ⟨x, ?_⟩ + simpa only [eB.apply_symm_apply] using congrArg eB hx + · rintro ⟨x, hx⟩ + apply eC.map_eq_one_iff.mpr + apply (h (eB.symm y)).mpr + refine ⟨x, ?_⟩ + apply eB.injective + simpa only [eB.apply_symm_apply] using hx + +private noncomputable def tateH0FixedCycle + {G A : Type} + [Group G] [Fintype G] [CommGroup A] + [MulDistribMulAction G A] + (a : fixedSubgroup G A) : + (tateComplex (Rep.ofMulDistribMulAction G A)).cycles 0 := by + let M := Rep.ofMulDistribMulAction G A + let S : ShortComplex (ModuleCat ℤ) := + ShortComplex.mk M.norm.toModuleCatHom (groupCohomology.d₀₁ M) + (Rep.norm_comp_d_eq_zero M) + let eS : (tateComplex M).sc' (-1) 0 1 ≅ S := + ShortComplex.isoMk + (by exact groupHomology.chainsIso₀ M) + (groupCohomology.cochainsIso₀ M) + (groupCohomology.cochainsIso₁ M) + (by + change + (groupHomology.chainsIso₀ M).hom ≫ M.norm.toModuleCatHom = + M.tateNorm ≫ (groupCohomology.cochainsIso₀ M).hom + rw [Rep.tateNorm] + simp) + (groupCohomology.comp_d₀₁_eq M) + let x : S.moduleCatLeftHomologyData.K := by + change LinearMap.ker + (groupCohomology.d₀₁ (Rep.ofMulDistribMulAction G A)).hom + exact ⟨Additive.ofMul a.1, by + rw [groupCohomology.d₀₁_ker_eq_invariants] + intro g + apply Additive.ofMul.injective + exact a.2 g⟩ + exact + ((tateComplex M).cyclesIsoSc' (-1) 0 1 (by simp) (by simp)).inv + ((ShortComplex.cyclesMapIso eS).inv + (S.moduleCatCyclesIso.inv x)) + +private theorem tateH0FixedCycle_iCycles + {G A : Type} + [Group G] [Fintype G] [CommGroup A] + [MulDistribMulAction G A] + (a : fixedSubgroup G A) : + let M := Rep.ofMulDistribMulAction G A + (tateComplex M).iCycles 0 (tateH0FixedCycle a) = + (groupCohomology.cochainsIso₀ M).inv + (by + change Additive A + exact Additive.ofMul a.1) := by + let M := Rep.ofMulDistribMulAction G A + let S : ShortComplex (ModuleCat ℤ) := + ShortComplex.mk M.norm.toModuleCatHom (groupCohomology.d₀₁ M) + (Rep.norm_comp_d_eq_zero M) + let eS : (tateComplex M).sc' (-1) 0 1 ≅ S := + ShortComplex.isoMk + (by exact groupHomology.chainsIso₀ M) + (groupCohomology.cochainsIso₀ M) + (groupCohomology.cochainsIso₁ M) + (by + change + (groupHomology.chainsIso₀ M).hom ≫ M.norm.toModuleCatHom = + M.tateNorm ≫ (groupCohomology.cochainsIso₀ M).hom + rw [Rep.tateNorm] + simp) + (groupCohomology.comp_d₀₁_eq M) + let x : S.moduleCatLeftHomologyData.K := by + change LinearMap.ker + (groupCohomology.d₀₁ (Rep.ofMulDistribMulAction G A)).hom + exact ⟨Additive.ofMul a.1, by + rw [groupCohomology.d₀₁_ker_eq_invariants] + intro g + apply Additive.ofMul.injective + exact a.2 g⟩ + change + (((((tateComplex M).cyclesIsoSc' + (-1) 0 1 (by simp) (by simp)).inv ≫ + (tateComplex M).iCycles 0).hom + ((ShortComplex.cyclesMapIso eS).inv + (S.moduleCatCyclesIso.inv x)))) = + (groupCohomology.cochainsIso₀ M).inv + (by + change Additive A + exact Additive.ofMul a.1) + rw [HomologicalComplex.cyclesIsoSc'_inv_iCycles] + change + (((ShortComplex.cyclesMap eS.inv ≫ + ((tateComplex M).sc' (-1) 0 1).iCycles).hom + (S.moduleCatCyclesIso.inv x))) = + (groupCohomology.cochainsIso₀ M).inv + (by + change Additive A + exact Additive.ofMul a.1) + rw [ShortComplex.cyclesMap_i] + change + (((S.moduleCatCyclesIso.inv ≫ S.iCycles ≫ eS.inv.τ₂).hom x)) = + (groupCohomology.cochainsIso₀ M).inv + (by + change Additive A + exact Additive.ofMul a.1) + rw [ShortComplex.moduleCatCyclesIso_inv_iCycles_assoc] + change + (groupCohomology.cochainsIso₀ + (Rep.ofMulDistribMulAction G A)).inv (Additive.ofMul a.1) = + (groupCohomology.cochainsIso₀ + (Rep.ofMulDistribMulAction G A)).inv (Additive.ofMul a.1) + rfl + +private theorem tateH0FixedCycle_map + {G A B : Type} + [Group G] [Fintype G] [CommGroup A] [CommGroup B] + [MulDistribMulAction G A] [MulDistribMulAction G B] + (f : A →* B) (hf : ∀ (g : G) (a : A), f (g • a) = g • f a) + (a : fixedSubgroup G A) : + let φ := equivariantRepHom f hf + let b : fixedSubgroup G B := + ⟨f a, fun g ↦ by rw [← hf g a, a.2 g]⟩ + HomologicalComplex.cyclesMap (tateComplex.map φ) 0 + (tateH0FixedCycle a) = + tateH0FixedCycle b := by + let MA := Rep.ofMulDistribMulAction G A + let MB := Rep.ofMulDistribMulAction G B + let φ := equivariantRepHom f hf + let b : fixedSubgroup G B := + ⟨f a, fun g ↦ by rw [← hf g a, a.2 g]⟩ + apply + (ModuleCat.mono_iff_injective ((tateComplex MB).iCycles 0)).1 + inferInstance + change + (((HomologicalComplex.cyclesMap (tateComplex.map φ) 0 ≫ + (tateComplex MB).iCycles 0).hom + (tateH0FixedCycle a))) = + (tateComplex MB).iCycles 0 (tateH0FixedCycle b) + rw [HomologicalComplex.cyclesMap_i] + simp only [ModuleCat.comp_apply] + rw [tateH0FixedCycle_iCycles a, tateH0FixedCycle_iCycles b] + apply + (ModuleCat.mono_iff_injective + (groupCohomology.cochainsIso₀ MB).hom).1 inferInstance + change + (((groupCohomology.cochainsMap (.id G) φ).f 0 ≫ + (groupCohomology.cochainsIso₀ MB).hom).hom + ((groupCohomology.cochainsIso₀ MA).inv + (by + change Additive A + exact Additive.ofMul a.1))) = + (groupCohomology.cochainsIso₀ MB).hom + ((groupCohomology.cochainsIso₀ MB).inv + (Additive.ofMul b.1)) + rw [groupCohomology.cochainsMap_f_0_comp_cochainsIso₀] + rfl + +private theorem isoZeroBoundary_fixedCycle + {G A : Type} + [Group G] [Fintype G] [CommGroup A] + [MulDistribMulAction G A] + (a : fixedSubgroup G A) : + let M := Rep.ofMulDistribMulAction G A + let S : ShortComplex (ModuleCat ℤ) := + ShortComplex.mk M.norm.toModuleCatHom (groupCohomology.d₀₁ M) + (Rep.norm_comp_d_eq_zero M) + (TateCohomology.isoZeroBoundary M).hom + ((tateComplex M).homologyπ 0 (tateH0FixedCycle a)) = + S.homologyπ + (S.moduleCatCyclesIso.inv + (by + change LinearMap.ker + (groupCohomology.d₀₁ + (Rep.ofMulDistribMulAction G A)).hom + exact ⟨Additive.ofMul a.1, by + rw [groupCohomology.d₀₁_ker_eq_invariants] + intro g + apply Additive.ofMul.injective + exact a.2 g⟩)) := by + dsimp only + let M := Rep.ofMulDistribMulAction G A + let S : ShortComplex (ModuleCat ℤ) := + ShortComplex.mk M.norm.toModuleCatHom (groupCohomology.d₀₁ M) + (Rep.norm_comp_d_eq_zero M) + let eSc : + (tateComplex M).sc 0 ≅ (tateComplex M).sc' (-1) 0 1 := + (tateComplex M).isoSc' (-1) 0 1 (by simp) (by simp) + let eS : (tateComplex M).sc' (-1) 0 1 ≅ S := + ShortComplex.isoMk + (by exact groupHomology.chainsIso₀ M) + (groupCohomology.cochainsIso₀ M) + (groupCohomology.cochainsIso₁ M) + (by + change + (groupHomology.chainsIso₀ M).hom ≫ M.norm.toModuleCatHom = + M.tateNorm ≫ (groupCohomology.cochainsIso₀ M).hom + rw [Rep.tateNorm] + simp) + (groupCohomology.comp_d₀₁_eq M) + let x : S.moduleCatLeftHomologyData.K := by + change LinearMap.ker + (groupCohomology.d₀₁ (Rep.ofMulDistribMulAction G A)).hom + exact ⟨Additive.ofMul a.1, by + rw [groupCohomology.d₀₁_ker_eq_invariants] + intro g + apply Additive.ofMul.injective + exact a.2 g⟩ + let y : S.cycles := S.moduleCatCyclesIso.inv x + have hcycle : + ShortComplex.cyclesMap eS.hom + (((tateComplex M).cyclesIsoSc' + (-1) 0 1 (by simp) (by simp)).hom + (tateH0FixedCycle a)) = + y := by + rw [show + tateH0FixedCycle a = + ((tateComplex M).cyclesIsoSc' + (-1) 0 1 (by simp) (by simp)).inv + ((ShortComplex.cyclesMapIso eS).inv y) by + rfl] + change + (ShortComplex.cyclesMapIso eS).hom + (((tateComplex M).cyclesIsoSc' + (-1) 0 1 (by simp) (by simp)).hom + (((tateComplex M).cyclesIsoSc' + (-1) 0 1 (by simp) (by simp)).inv + ((ShortComplex.cyclesMapIso eS).inv y))) = + y + rw [Iso.inv_hom_id_apply, Iso.inv_hom_id_apply] + have hIso : + (TateCohomology.isoZeroBoundary M).hom = + ((tateComplex M).homologyIsoSc' + (-1) 0 1 (by simp) (by simp)).hom ≫ + ShortComplex.homologyMap eS.hom := by + change + ShortComplex.homologyMap ((eSc ≪≫ eS).hom) = + ShortComplex.homologyMap eSc.hom ≫ + ShortComplex.homologyMap eS.hom + rw [Iso.trans_hom, ShortComplex.homologyMap_comp] + rw [hIso] + change + ((((tateComplex M).homologyπ 0 ≫ + ((tateComplex M).homologyIsoSc' + (-1) 0 1 (by simp) (by simp)).hom) ≫ + ShortComplex.homologyMap eS.hom).hom + (tateH0FixedCycle a)) = + S.homologyπ y + rw [HomologicalComplex.π_homologyIsoSc'_hom] + rw [Category.assoc, ShortComplex.homologyπ_naturality] + simp only [ModuleCat.comp_apply] + exact congrArg (fun z : S.cycles ↦ S.homologyπ z) hcycle + +private theorem tateH0IsoHerbrandH0_fixedCycle + {G A : Type} + [Group G] [Fintype G] [CommGroup A] + [MulDistribMulAction G A] + (a : fixedSubgroup G A) : + (tateH0IsoHerbrandH0 (G := G) (A := A)).hom + ((tateComplex (Rep.ofMulDistribMulAction G A)).homologyπ 0 + (tateH0FixedCycle a)) = + Additive.ofMul (HerbrandH0.mk a) := by + let M := Rep.ofMulDistribMulAction G A + let S : ShortComplex (ModuleCat ℤ) := + ShortComplex.mk M.norm.toModuleCatHom (groupCohomology.d₀₁ M) + (Rep.norm_comp_d_eq_zero M) + let x : S.moduleCatLeftHomologyData.K := by + change LinearMap.ker + (groupCohomology.d₀₁ (Rep.ofMulDistribMulAction G A)).hom + exact ⟨Additive.ofMul a.1, by + rw [groupCohomology.d₀₁_ker_eq_invariants] + intro g + apply Additive.ofMul.injective + exact a.2 g⟩ + let y : S.cycles := S.moduleCatCyclesIso.inv x + have hz : + (TateCohomology.isoZeroBoundary M).hom + ((tateComplex M).homologyπ 0 (tateH0FixedCycle a)) = + S.homologyπ y := by + exact isoZeroBoundary_fixedCycle a + change + (tateH0IsoHerbrandH0 (G := G) (A := A)).hom + (show tateCohomology M 0 from + (tateComplex M).homologyπ 0 (tateH0FixedCycle a)) = + Additive.ofMul (HerbrandH0.mk a) + have hy : + S.moduleCatHomologyIso.hom (S.homologyπ y) = + S.moduleCatLeftHomologyData.π x := by + rw [ShortComplex.π_moduleCatCyclesIso_hom_apply] + rw [show y = S.moduleCatCyclesIso.inv x by rfl, + Iso.inv_hom_id_apply] + have hPresentation : + ∃ eQ : S.moduleCatLeftHomologyData.H ≅ + ModuleCat.of ℤ (Additive (HerbrandH0 G A)), + tateH0IsoHerbrandH0 (G := G) (A := A) = + TateCohomology.isoZeroBoundary M ≪≫ + S.moduleCatHomologyIso ≪≫ eQ ∧ + eQ.hom (S.moduleCatLeftHomologyData.π x) = + Additive.ofMul (HerbrandH0.mk a) := by + exact ⟨_, rfl, rfl⟩ + obtain ⟨eQ, hIso, hQ⟩ := hPresentation + calc + (tateH0IsoHerbrandH0 (G := G) (A := A)).hom + ((tateComplex M).homologyπ 0 (tateH0FixedCycle a)) = + (TateCohomology.isoZeroBoundary M ≪≫ + S.moduleCatHomologyIso ≪≫ eQ).hom + ((tateComplex M).homologyπ 0 (tateH0FixedCycle a)) := + congrArg + (fun e ↦ e.hom + ((tateComplex M).homologyπ 0 (tateH0FixedCycle a))) hIso + _ = eQ.hom + (S.moduleCatHomologyIso.hom + ((TateCohomology.isoZeroBoundary M).hom + ((tateComplex M).homologyπ 0 (tateH0FixedCycle a)))) := rfl + _ = eQ.hom (S.moduleCatHomologyIso.hom (S.homologyπ y)) := + congrArg (fun z ↦ eQ.hom (S.moduleCatHomologyIso.hom z)) hz + _ = eQ.hom (S.moduleCatLeftHomologyData.π x) := + congrArg (fun z ↦ eQ.hom z) hy + _ = Additive.ofMul (HerbrandH0.mk a) := hQ + +/-- Ideles whose component at every infinite place lies in the image of +the determinant norm on the corresponding archimedean local tensor +algebra. -/ +def allInfinitePlaceLocalNormCondition + {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + : + Subgroup (IdeleGroup K) := + ⨅ v : InfinitePlace K, + (Units.map + (Algebra.norm v.Completion : + (v.Completion ⊗[K] L) →* v.Completion)).range.comap + (IdeleGroup.infiniteComponent v) + +/-- The simultaneous determinant-norm condition at every finite and +infinite place. -/ +def allPlaceLocalNormCondition + {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] : + Subgroup (IdeleGroup K) := + allFinitePlaceLocalNormCondition (K := K) (L := L) ⊓ + allInfinitePlaceLocalNormCondition (K := K) (L := L) + +/-- Every global relative-idele norm is a local determinant norm at every +place. -/ +theorem relativeIdeleNorm_range_le_allPlaceLocalNormCondition + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] : + (RelativeIdeleGroup.norm K L).range ≤ + allPlaceLocalNormCondition (K := K) (L := L) := by + intro a ha + refine ⟨relativeIdeleNorm_range_le_allFinitePlaceLocalNormCondition + (K := K) (L := L) ha, ?_⟩ + rcases ha with ⟨b, rfl⟩ + rw [allInfinitePlaceLocalNormCondition] + apply Subgroup.mem_iInf.mpr + intro v + exact + ⟨RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) v b, + (RelativeIdeleGroup.infiniteComponent_norm + (K := K) (L := L) v b).symm⟩ + +/-- An idele is a relative-idele norm exactly when every one of its +finite and infinite components is a determinant norm. The nontrivial +reverse inclusion uses the restricted-product preimage construction: +integral local preimages are chosen at almost every finite place. -/ +theorem relativeIdeleNorm_range_eq_allPlaceLocalNormCondition + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] : + (RelativeIdeleGroup.norm K L).range = + allPlaceLocalNormCondition (K := K) (L := L) := by + apply le_antisymm + · exact + relativeIdeleNorm_range_le_allPlaceLocalNormCondition + (K := K) (L := L) + · intro a ha + apply + (_root_.mem_relativeIdeleNorm_range_iff_localTensorNorms + (K := K) (L := L) a).2 + constructor + · intro v + have hv : + IdeleGroup.infiniteComponent v a ∈ + (Units.map + (Algebra.norm v.Completion : + (v.Completion ⊗[K] L) →* v.Completion)).range := by + exact + Subgroup.mem_iInf.mp + (show + a ∈ allInfinitePlaceLocalNormCondition + (K := K) (L := L) from ha.2) v + simpa [_root_.infiniteTensorNormSubgroup, + _root_.infiniteTensorDetNorm] using hv + · intro v + have hv : + IdeleGroup.finiteComponent v a ∈ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := by + exact + Subgroup.mem_iInf.mp + (show + a ∈ allFinitePlaceLocalNormCondition + (K := K) (L := L) from ha.1) v + rw [ + _root_.finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup] + exact hv + +/-- The actual global field-norm subgroup `N_{L/K}(Lˣ)` of `Kˣ`. -/ +def globalFieldNormSubgroup + (K L : Type) + [Field K] [Field L] [Algebra K L] + : + Subgroup Kˣ := + (Units.map + (Algebra.norm K : L →* K)).range + +/-- Base-field units that are determinant norms at every completion. -/ +def everywhereLocalFieldNormSubgroup + (K L : Type) + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] : + Subgroup Kˣ := + (allPlaceLocalNormCondition (K := K) (L := L)).comap + (IdeleGroup.principalIdele K) + +/-- A global field norm is a local norm at every place. This is the +unconditional direction of the Hasse norm principle. -/ +theorem globalFieldNormSubgroup_le_everywhereLocalFieldNormSubgroup + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] : + globalFieldNormSubgroup K L ≤ + everywhereLocalFieldNormSubgroup K L := by + rintro x ⟨y, rfl⟩ + change + IdeleGroup.principalIdele K + (Units.map + (Algebra.norm K : L →* K) y) ∈ + allPlaceLocalNormCondition (K := K) (L := L) + rw [← RelativeIdeleGroup.norm_principalIdele K L y] + exact + relativeIdeleNorm_range_le_allPlaceLocalNormCondition + (K := K) (L := L) ⟨_, rfl⟩ + +/-- The map +`H⁰(G, P_L) → H⁰(G, I_L)` induced by the actual inclusion of principal +relative ideles. -/ +noncomputable def principalIdeleHerbrandH0Map + (K L : Type) + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] : + letI := + RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction K L + letI := + RelativeIdeleGroup.Cohomology.principalIdeleMulDistribMulAction K L + HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L) →* + HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup K L) := by + letI := + RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction K L + letI := + RelativeIdeleGroup.Cohomology.principalIdeleMulDistribMulAction K L + let f := + equivariantRepHom + (RelativeIdeleGroup.principalSubgroup K L).subtype + (RelativeIdeleGroup.Cohomology.principalIdeleSubtype_equivariant K L) + let eP := + (tateH0IsoHerbrandH0 + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup.principalSubgroup K L)).toLinearEquiv + |>.toAddEquiv.toMultiplicative + let eI := + (tateH0IsoHerbrandH0 + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup K L)).toLinearEquiv + |>.toAddEquiv.toMultiplicative + exact eI.toMonoidHom.comp <| + ((tateCohomologyFunctor 0).map f).hom.toAddMonoidHom.toMultiplicative.comp + eP.symm.toMonoidHom + +private theorem principalIdeleHerbrandH0Map_mk + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] : + letI := + RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction K L + letI := + RelativeIdeleGroup.Cohomology.principalIdeleMulDistribMulAction K L + ∀ a : fixedSubgroup (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L), + principalIdeleHerbrandH0Map K L (HerbrandH0.mk a) = + HerbrandH0.mk + (⟨(RelativeIdeleGroup.principalSubgroup K L).subtype a, + fun σ ↦ by + rw [← RelativeIdeleGroup.Cohomology.principalIdeleSubtype_equivariant + K L σ a, a.2 σ]⟩ : + fixedSubgroup (L ≃ₐ[K] L) (RelativeIdeleGroup K L)) := by + let := + RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction K L + let := + RelativeIdeleGroup.Cohomology.principalIdeleMulDistribMulAction K L + intro a + let aI : + fixedSubgroup (L ≃ₐ[K] L) (RelativeIdeleGroup K L) := + ⟨(RelativeIdeleGroup.principalSubgroup K L).subtype a, fun σ ↦ by + rw [← RelativeIdeleGroup.Cohomology.principalIdeleSubtype_equivariant + K L σ a, a.2 σ]⟩ + let f := + equivariantRepHom + (RelativeIdeleGroup.principalSubgroup K L).subtype + (RelativeIdeleGroup.Cohomology.principalIdeleSubtype_equivariant K L) + let eP := + (tateH0IsoHerbrandH0 + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup.principalSubgroup K L)).toLinearEquiv.toAddEquiv + let eI := + (tateH0IsoHerbrandH0 + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup K L)).toLinearEquiv.toAddEquiv + let cP : + tateCohomology + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L)) 0 := + (tateComplex + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L))).homologyπ 0 + (tateH0FixedCycle a) + let cI : + tateCohomology + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup K L)) 0 := + (tateComplex + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup K L))).homologyπ 0 + (tateH0FixedCycle aI) + have hPe : eP cP = Additive.ofMul (HerbrandH0.mk a) := + tateH0IsoHerbrandH0_fixedCycle a + have hIe : eI cI = Additive.ofMul (HerbrandH0.mk aI) := + tateH0IsoHerbrandH0_fixedCycle aI + have hc : + ((tateCohomologyFunctor 0).map f).hom cP = cI := by + dsimp only [cP, cI] + change + ((((tateComplex + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L))).homologyπ 0) ≫ + HomologicalComplex.homologyMap (tateComplex.map f) 0).hom + (tateH0FixedCycle a)) = + (tateComplex + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup K L))).homologyπ 0 + (tateH0FixedCycle aI) + rw [HomologicalComplex.homologyπ_naturality] + simp only [ModuleCat.comp_apply] + exact congrArg + (fun z ↦ + (tateComplex + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup K L))).homologyπ 0 z) + (by + simpa only [f, aI] using + tateH0FixedCycle_map + (G := L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L).subtype + (RelativeIdeleGroup.Cohomology.principalIdeleSubtype_equivariant + K L) + a) + have hadd : + eI + (((tateCohomologyFunctor 0).map f).hom + (eP.symm + (Additive.ofMul (HerbrandH0.mk a) : + Additive + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L))))) = + (Additive.ofMul (HerbrandH0.mk aI) : + Additive (HerbrandH0 (L ≃ₐ[K] L) (RelativeIdeleGroup K L))) := by + rw [← hPe, eP.symm_apply_apply, ← hIe] + exact congrArg eI hc + change + Additive.toMul + (eI (((tateCohomologyFunctor 0).map f).hom + (eP.symm + (Additive.ofMul (HerbrandH0.mk a) : + Additive + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L)))))) = + HerbrandH0.mk aI + exact congrArg Additive.toMul hadd + +section IdeleClassConnecting + +attribute [local instance] + RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction + RelativeIdeleGroup.Cohomology.principalIdeleMulDistribMulAction + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction + +/-- The low-degree connecting homomorphism +`H⁻¹(G, C_L) → H⁰(G, P_L)` attached to +`1 → P_L → I_L → C_L → 1`. -/ +noncomputable def ideleClassToPrincipalConnecting + (K L : Type) + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] : + letI := + RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction K L + letI := + RelativeIdeleGroup.Cohomology.principalIdeleMulDistribMulAction K L + letI := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + Multiplicative + (tateCohomology + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) (-1)) →* + HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L) := by + let q : + RelativeIdeleGroup K L →* + RelativeIdeleGroup.ClassGroup K L := + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) + have hqEquivariant : + ∀ (τ : L ≃ₐ[K] L) (a : RelativeIdeleGroup K L), + q (τ • a) = τ • q a := + RelativeIdeleGroup.Cohomology.ideleClassQuotientMap_equivariant K L + have hqExact : + ∀ a : RelativeIdeleGroup K L, + q a = 1 ↔ + ∃ p : RelativeIdeleGroup.principalSubgroup K L, + (RelativeIdeleGroup.principalSubgroup K L).subtype p = a := + RelativeIdeleGroup.Cohomology.principalIdele_ideleClass_exact K L + have hqSurjective : Function.Surjective q := + QuotientGroup.mk'_surjective + (RelativeIdeleGroup.principalSubgroup K L) + let S := + equivariantShortComplex + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup.principalSubgroup K L) + (B := RelativeIdeleGroup K L) + (C := RelativeIdeleGroup.ClassGroup K L) + (i := (RelativeIdeleGroup.principalSubgroup K L).subtype) + (j := q) + (hi := RelativeIdeleGroup.Cohomology.principalIdeleSubtype_equivariant K L) + (hj := hqEquivariant) + (hker := hqExact) + have hS : S.ShortExact := + equivariantShortComplex_shortExact + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup.principalSubgroup K L) + (B := RelativeIdeleGroup K L) + (C := RelativeIdeleGroup.ClassGroup K L) + (i := (RelativeIdeleGroup.principalSubgroup K L).subtype) + (j := q) + (hi := RelativeIdeleGroup.Cohomology.principalIdeleSubtype_equivariant K L) + (hj := hqEquivariant) + (hker := hqExact) + (hinj := (RelativeIdeleGroup.principalSubgroup K L).subtype_injective) + (hsurj := hqSurjective) + let eP := + (tateH0IsoHerbrandH0 + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup.principalSubgroup K L)).toLinearEquiv + |>.toAddEquiv.toMultiplicative + exact eP.toMonoidHom.comp <| + (TateCohomology.δ hS (-1)).hom.toAddMonoidHom.toMultiplicative + +/-- Exactness of the concrete low-degree sequence: the image of +`H⁻¹(G,C_L)` is precisely the kernel of +`H⁰(G,P_L) → H⁰(G,I_L)`. -/ +theorem ideleClassToPrincipalConnecting_range_eq_ker + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] : + letI := + RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction K L + letI := + RelativeIdeleGroup.Cohomology.principalIdeleMulDistribMulAction K L + letI := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + MonoidHom.range (ideleClassToPrincipalConnecting K L) = + MonoidHom.ker (principalIdeleHerbrandH0Map K L) := by + let q : + RelativeIdeleGroup K L →* + RelativeIdeleGroup.ClassGroup K L := + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) + have hqEquivariant : + ∀ (τ : L ≃ₐ[K] L) (a : RelativeIdeleGroup K L), + q (τ • a) = τ • q a := + RelativeIdeleGroup.Cohomology.ideleClassQuotientMap_equivariant K L + have hqExact : + ∀ a : RelativeIdeleGroup K L, + q a = 1 ↔ + ∃ p : RelativeIdeleGroup.principalSubgroup K L, + (RelativeIdeleGroup.principalSubgroup K L).subtype p = a := + RelativeIdeleGroup.Cohomology.principalIdele_ideleClass_exact K L + have hqSurjective : Function.Surjective q := + QuotientGroup.mk'_surjective + (RelativeIdeleGroup.principalSubgroup K L) + let S := + equivariantShortComplex + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup.principalSubgroup K L) + (B := RelativeIdeleGroup K L) + (C := RelativeIdeleGroup.ClassGroup K L) + (i := (RelativeIdeleGroup.principalSubgroup K L).subtype) + (j := q) + (hi := RelativeIdeleGroup.Cohomology.principalIdeleSubtype_equivariant K L) + (hj := hqEquivariant) + (hker := hqExact) + have hS : S.ShortExact := + equivariantShortComplex_shortExact + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup.principalSubgroup K L) + (B := RelativeIdeleGroup K L) + (C := RelativeIdeleGroup.ClassGroup K L) + (i := (RelativeIdeleGroup.principalSubgroup K L).subtype) + (j := q) + (hi := RelativeIdeleGroup.Cohomology.principalIdeleSubtype_equivariant K L) + (hj := hqEquivariant) + (hker := hqExact) + (hinj := (RelativeIdeleGroup.principalSubgroup K L).subtype_injective) + (hsurj := hqSurjective) + let δm := + (TateCohomology.δ hS (-1)).hom.toAddMonoidHom.toMultiplicative + let fm := + ((tateCohomologyFunctor 0).map S.f).hom.toAddMonoidHom.toMultiplicative + let eP := + (tateH0IsoHerbrandH0 + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup.principalSubgroup K L)).toLinearEquiv + |>.toAddEquiv.toMultiplicative + let eI := + (tateH0IsoHerbrandH0 + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup K L)).toLinearEquiv + |>.toAddEquiv.toMultiplicative + let connecting := eP.toMonoidHom.comp δm + let principal := + eI.toMonoidHom.comp (fm.comp eP.symm.toMonoidHom) + have hbase : Function.MulExact δm fm := by + apply + CyclicCohomology.ProfiniteCohomology.Herbrand.mulExact_of_moduleCat_shortComplex_exact + · simpa using TateCohomology.exact₁ hS (-1) + have htarget : Function.MulExact connecting principal := by + exact + mulExact_transport_mulEquiv δm fm eP eI hbase + change MonoidHom.range connecting = MonoidHom.ker principal + exact htarget.monoidHom_ker_eq.symm + +end IdeleClassConnecting + +/-- Degree-zero Tate cohomology of the actual field-unit action is the +concrete global norm quotient `Kˣ / N_{L/K}(Lˣ)`. -/ +noncomputable def fieldUnitsHerbrandH0EquivGlobalNormQuotient + (K L : Type) + [Field K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] : + letI := + LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L + HerbrandH0 (L ≃ₐ[K] L) Lˣ ≃* + Kˣ ⧸ globalFieldNormSubgroup K L := by + letI := + LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L + let eTate : + (CyclicCohomology.unitsInvariantSubmodule K L ⧸ + CyclicCohomology.unitsTateH0NormSubmodule K L) ≃+ + tateCohomology + (Rep.ofAlgebraAutOnUnits K L) 0 := + (CyclicCohomology.tateUnitsH0IsoInvariantsQuotient + K L).symm.toLinearEquiv.toAddEquiv + let e₀ := + (LocalClassFieldTheory.herbrandH0MulEquivInvariantsNormQuotient + K L).trans eTate.toMultiplicative + let e₁ : + tateCohomology + (Rep.ofAlgebraAutOnUnits K L) 0 ≃+ + Additive (LocalFieldTheory.NormQuotient K L) := + (CyclicCohomology.H0TateUnitsIsoNormQuotient + K L).toLinearEquiv.toAddEquiv + exact + e₀.trans <| + e₁.toMultiplicative.trans <| + (MulEquiv.multiplicativeAdditive + (LocalFieldTheory.NormQuotient K L)).trans <| + LocalFieldTheory.normQuotientEquivOfSubgroupEq + K L (globalFieldNormSubgroup K L) rfl + +/-- The map on degree-zero Tate cohomology induced by the actual diagonal +embedding `Lˣ → I_L`. -/ +noncomputable def fieldUnitsToRelativeIdeleHerbrandH0 + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] : + letI := + LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L + letI := + RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction K L + HerbrandH0 (L ≃ₐ[K] L) Lˣ →* + HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup K L) := by + letI := + LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L + letI := + RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction K L + letI := + RelativeIdeleGroup.Cohomology.principalIdeleMulDistribMulAction K L + exact + (principalIdeleHerbrandH0Map K L).comp + (fieldUnitsHerbrandH0EquivPrincipalIdeles + K L).toMonoidHom + +/-- A base-field unit, regarded as a Galois-fixed unit of the extension +field. -/ +noncomputable def baseFieldUnitAsFixedUnit + (K L : Type) + [Field K] + [Field L] [Algebra K L] + (x : Kˣ) : + letI := + LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L + fixedSubgroup (L ≃ₐ[K] L) Lˣ := by + letI := + LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L + refine + ⟨Units.map (algebraMap K L) x, ?_⟩ + intro σ + apply Units.ext + simp + +/-- If the principal idele of a base-field unit is an actual relative +idele norm, its field-unit Tate class maps trivially to relative-idele +Tate cohomology. -/ +theorem fieldUnitsHerbrandH0_map_baseFieldUnit_eq_one_of_mem_norm + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (x : Kˣ) + (hx : + IdeleGroup.principalIdele K x ∈ + (RelativeIdeleGroup.norm K L).range) : + letI := + LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L + letI := + RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction K L + fieldUnitsToRelativeIdeleHerbrandH0 K L + (HerbrandH0.mk (baseFieldUnitAsFixedUnit K L x)) = 1 := by + let := + LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L + let := + RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction K L + let := + RelativeIdeleGroup.Cohomology.principalIdeleMulDistribMulAction K L + let aP : + fixedSubgroup (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L) := + CyclicCohomology.fixedSubgroupEquivariantMulEquiv + (fieldUnitsEquivPrincipalIdeles K L) + (fieldUnitsEquivPrincipalIdeles_smul K L) + (baseFieldUnitAsFixedUnit K L x) + let aI : + fixedSubgroup (L ≃ₐ[K] L) (RelativeIdeleGroup K L) := + ⟨(RelativeIdeleGroup.principalSubgroup K L).subtype aP, fun σ ↦ by + rw [← RelativeIdeleGroup.Cohomology.principalIdeleSubtype_equivariant + K L σ aP, aP.2 σ]⟩ + have hmk : HerbrandH0.mk aI = 1 := by + apply (HerbrandH0.mk_eq_one_iff aI).2 + obtain ⟨z, hz⟩ := hx + refine ⟨z, ?_⟩ + change + tateNorm (L ≃ₐ[K] L) (RelativeIdeleGroup K L) z = + (aI : RelativeIdeleGroup K L) + dsimp only [aP, + aI, + CyclicCohomology.fixedSubgroupEquivariantMulEquiv, + fieldUnitsEquivPrincipalIdeles] + rw [RelativeIdeleGroup.Cohomology.relativeIdele_tateNorm_eq_inclusion_norm, + hz, RelativeIdeleGroup.inclusion_principalIdele] + rfl + have hmap : + fieldUnitsToRelativeIdeleHerbrandH0 K L + (HerbrandH0.mk (baseFieldUnitAsFixedUnit K L x)) = + HerbrandH0.mk aI := by + have hfield : + fieldUnitsHerbrandH0EquivPrincipalIdeles K L + (HerbrandH0.mk (baseFieldUnitAsFixedUnit K L x)) = + HerbrandH0.mk aP := by + simpa only [fieldUnitsHerbrandH0EquivPrincipalIdeles, aP] using + CyclicCohomology.herbrandH0EquivariantMulEquiv_mk + (fieldUnitsEquivPrincipalIdeles K L) + (fieldUnitsEquivPrincipalIdeles_smul K L) + (baseFieldUnitAsFixedUnit K L x) + change + principalIdeleHerbrandH0Map K L + (fieldUnitsHerbrandH0EquivPrincipalIdeles K L + (HerbrandH0.mk (baseFieldUnitAsFixedUnit K L x))) = + HerbrandH0.mk aI + rw [hfield] + simpa only [aI] using + principalIdeleHerbrandH0Map_mk K L aP + exact hmap.trans hmk + +/-- The connecting map in the low-degree sequence, with its target +transported from principal ideles back to the actual field-unit +cohomology. -/ +noncomputable def ideleClassToFieldUnitsConnecting + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] : + letI := + LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L + letI := + RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction K L + letI := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + Multiplicative + (tateCohomology + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) (-1)) →* + HerbrandH0 (L ≃ₐ[K] L) Lˣ := by + letI := + LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L + letI := + RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction K L + letI := + RelativeIdeleGroup.Cohomology.principalIdeleMulDistribMulAction K L + letI := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + exact + (fieldUnitsHerbrandH0EquivPrincipalIdeles + K L).symm.toMonoidHom.comp + (ideleClassToPrincipalConnecting K L) + +/-- Exactness after replacing `H⁰(G,P_L)` by the canonically equivalent +field-unit cohomology `H⁰(G,Lˣ)`. -/ +theorem ideleClassToFieldUnitsConnecting_range_eq_ker + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] : + letI := + LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L + letI := + RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction K L + letI := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + MonoidHom.range + (ideleClassToFieldUnitsConnecting K L) = + MonoidHom.ker + (fieldUnitsToRelativeIdeleHerbrandH0 K L) := by + let := + LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L + let := + RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction K L + let := + RelativeIdeleGroup.Cohomology.principalIdeleMulDistribMulAction K L + let := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + let e := + fieldUnitsHerbrandH0EquivPrincipalIdeles K L + ext q + constructor + · rintro ⟨c, rfl⟩ + change + principalIdeleHerbrandH0Map K L + (e (e.symm + (ideleClassToPrincipalConnecting K L c))) = 1 + rw [e.apply_symm_apply] + exact + (ideleClassToPrincipalConnecting_range_eq_ker + K L).le + ⟨c, rfl⟩ + · intro hq + change + principalIdeleHerbrandH0Map K L (e q) = 1 at hq + have heq : + e q ∈ + MonoidHom.range + (ideleClassToPrincipalConnecting K L) := by + rw [ideleClassToPrincipalConnecting_range_eq_ker K L] + exact hq + obtain ⟨c, hc⟩ := heq + refine ⟨c, ?_⟩ + change e.symm + (ideleClassToPrincipalConnecting K L c) = q + rw [hc, e.symm_apply_apply] + +/-- Vanishing of `H⁻¹(G,C_L)` makes the diagonal map from field-unit +cohomology to idele cohomology injective. -/ +theorem fieldUnitsToRelativeIdeleHerbrandH0_injective_of_subsingleton + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [Subsingleton + (letI := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + Multiplicative + (tateCohomology + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) (-1)))] : + letI := + LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L + letI := + RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction K L + Function.Injective + (fieldUnitsToRelativeIdeleHerbrandH0 K L) := by + let := + LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L + let := + RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction K L + let := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + rw [← MonoidHom.ker_eq_bot_iff] + rw [← ideleClassToFieldUnitsConnecting_range_eq_ker K L] + ext q + constructor + · rintro ⟨c, rfl⟩ + have hc : c = 1 := Subsingleton.elim c 1 + subst c + simp + · intro hq + have hqOne : q = 1 := Subgroup.mem_bot.mp hq + subst q + exact ⟨1, map_one _⟩ + +/-- Vanishing of `H⁻¹(G,C_L)` gives the reverse inclusion in the Hasse norm +principle through the concrete low-degree sequence. -/ +theorem everywhereLocalFieldNormSubgroup_le_global_of_subsingleton + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [Subsingleton + (letI := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + Multiplicative + (tateCohomology + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) (-1)))] : + everywhereLocalFieldNormSubgroup K L ≤ + globalFieldNormSubgroup K L := by + let := + LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L + let := + RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction K L + let := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + intro x hx + have hxNorm : + IdeleGroup.principalIdele K x ∈ + (RelativeIdeleGroup.norm K L).range := by + rw [ + relativeIdeleNorm_range_eq_allPlaceLocalNormCondition + (K := K) (L := L)] + exact hx + let q : HerbrandH0 (L ≃ₐ[K] L) Lˣ := + HerbrandH0.mk (baseFieldUnitAsFixedUnit K L x) + have hqMap : + fieldUnitsToRelativeIdeleHerbrandH0 K L q = 1 := + fieldUnitsHerbrandH0_map_baseFieldUnit_eq_one_of_mem_norm + K L x hxNorm + have hq : q = 1 := by + apply + fieldUnitsToRelativeIdeleHerbrandH0_injective_of_subsingleton + K L + simpa using hqMap + have hxTate : + (baseFieldUnitAsFixedUnit K L x : Lˣ) ∈ + tateNormSubgroup (L ≃ₐ[K] L) Lˣ := + (HerbrandH0.mk_eq_one_iff + (baseFieldUnitAsFixedUnit K L x)).1 hq + obtain ⟨y, hy⟩ := hxTate + refine ⟨y, ?_⟩ + apply Units.ext + apply FaithfulSMul.algebraMap_injective K L + change + algebraMap K L + ((Units.map (Algebra.norm K : L →* K) y : Kˣ) : K) = + algebraMap K L (x : K) + have hUnits : + Units.map (algebraMap K L).toMonoidHom + (Units.map (Algebra.norm K : L →* K) y) = + Units.map (algebraMap K L).toMonoidHom x := by + calc + Units.map (algebraMap K L).toMonoidHom + (Units.map (Algebra.norm K : L →* K) y) = + ∏ τ : L ≃ₐ[K] L, + Units.map τ.toRingEquiv.toMonoidHom y := + RelativeIdeleGroup.fieldNormUnits_eq_prod_conjugates K L y + _ = tateNorm (L ≃ₐ[K] L) Lˣ y := rfl + _ = (baseFieldUnitAsFixedUnit K L x : Lˣ) := hy + _ = Units.map (algebraMap K L).toMonoidHom x := rfl + exact congrArg Units.val hUnits + +/-- The concrete diagonal local-norm map. Its source is the global norm +quotient, while its target kills precisely those ideles satisfying every +local norm condition. -/ +noncomputable def hasseNormDiagonal + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] : + Kˣ ⧸ globalFieldNormSubgroup K L →* + IdeleGroup K ⧸ allPlaceLocalNormCondition (K := K) (L := L) := + QuotientGroup.map + (globalFieldNormSubgroup K L) + (allPlaceLocalNormCondition (K := K) (L := L)) + (IdeleGroup.principalIdele K) + globalFieldNormSubgroup_le_everywhereLocalFieldNormSubgroup + +/-- The Hasse norm diagonal sends the class of a field unit to the class +of its principal idele. -/ +theorem hasseNormDiagonal_mk + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (x : Kˣ) : + hasseNormDiagonal K L + (QuotientGroup.mk' (globalFieldNormSubgroup K L) x) = + QuotientGroup.mk' + (allPlaceLocalNormCondition (K := K) (L := L)) + (IdeleGroup.principalIdele K x) := + rfl + +/-- Injectivity of the concrete diagonal is exactly the missing +local-to-global inclusion. -/ +theorem hasseNormDiagonal_injective_iff + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] : + Function.Injective (hasseNormDiagonal K L) ↔ + everywhereLocalFieldNormSubgroup K L ≤ + globalFieldNormSubgroup K L := by + constructor + · intro hinj x hx + have hdiag : + hasseNormDiagonal K L + (QuotientGroup.mk' + (globalFieldNormSubgroup K L) x) = + hasseNormDiagonal K L 1 := by + rw [map_one, hasseNormDiagonal_mk] + exact + (QuotientGroup.eq_one_iff + (IdeleGroup.principalIdele K x)).2 hx + have hq : + QuotientGroup.mk' (globalFieldNormSubgroup K L) x = 1 := + hinj hdiag + exact (QuotientGroup.eq_one_iff x).1 hq + · intro hlocal + rw [← MonoidHom.ker_eq_bot_iff] + apply le_antisymm + · intro q hq + refine QuotientGroup.induction_on q ?_ hq + intro x hx + have hxlocal : + x ∈ everywhereLocalFieldNormSubgroup K L := by + exact + (QuotientGroup.eq_one_iff + (IdeleGroup.principalIdele K x)).1 hx + change + QuotientGroup.mk' + (globalFieldNormSubgroup K L) x = 1 + exact (QuotientGroup.eq_one_iff x).2 (hlocal hxlocal) + · exact bot_le + +/-- Equivalent subgroup formulation of the Hasse norm principle. -/ +theorem hasseNormDiagonal_injective_iff_subgroup_eq + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] : + Function.Injective (hasseNormDiagonal K L) ↔ + globalFieldNormSubgroup K L = + everywhereLocalFieldNormSubgroup K L := by + rw [hasseNormDiagonal_injective_iff] + exact + ⟨fun h => le_antisymm + globalFieldNormSubgroup_le_everywhereLocalFieldNormSubgroup h, + fun h => h ▸ le_rfl⟩ + +/-- Degree-minus-one Tate-cohomology vanishing makes the concrete diagonal +local-norm map injective. -/ +theorem hasseNormDiagonal_injective_of_subsingleton + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [Subsingleton + (letI := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + Multiplicative + (tateCohomology + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) (-1)))] : + Function.Injective (hasseNormDiagonal K L) := + hasseNormDiagonal_injective_iff.mpr + (everywhereLocalFieldNormSubgroup_le_global_of_subsingleton + K L) + +/-- Hasse's norm theorem as equality of the actual global norm subgroup +and the subgroup of elements that are norms at every place. -/ +theorem hasseNormPrinciple_of_subsingleton + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [Subsingleton + (letI := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + Multiplicative + (tateCohomology + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) (-1)))] : + globalFieldNormSubgroup K L = + everywhereLocalFieldNormSubgroup K L := + (hasseNormDiagonal_injective_iff_subgroup_eq.mp + (hasseNormDiagonal_injective_of_subsingleton K L)) + +/-- For a finite cyclic extension, the concrete diagonal from the global +field-norm quotient to the simultaneous local norm quotient is injective. +The cyclic idele-class calculation supplies the required degree-minus-one +Tate-cohomology vanishing. -/ +theorem hasseNormDiagonal_injective_cyclic + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [IsCyclic (L ≃ₐ[K] L)] : + Function.Injective (hasseNormDiagonal K L) := by + obtain ⟨sigma, hsigma⟩ := + IsCyclic.exists_generator (α := L ≃ₐ[K] L) + let := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K L + let : + Subsingleton + (Multiplicative + (tateCohomology + (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L)) (-1))) := + ideleClass_tateHMinusOne_subsingleton_cyclic + K L sigma hsigma + exact hasseNormDiagonal_injective_of_subsingleton K L + +/-- Hasse's norm theorem for a finite cyclic extension: an element of +`Kˣ` is a global norm from `L` exactly when it is a norm at every place. -/ +theorem hasseNormPrinciple_cyclic + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [IsCyclic (L ≃ₐ[K] L)] : + globalFieldNormSubgroup K L = + everywhereLocalFieldNormSubgroup K L := + hasseNormDiagonal_injective_iff_subgroup_eq.mp + (hasseNormDiagonal_injective_cyclic K L) + +end GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassFormation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassFormation.lean new file mode 100644 index 0000000000..8d90939dc6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassFormation.lean @@ -0,0 +1,158 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits +/-! +# The rational idele-class formation + +This module identifies the fixed-field idele-class representation with +concrete relative idele class groups and transfers the cyclic low-degree Tate +cohomology calculation to prove the abstract class-field axiom. +-/ + +@[expose] public section + +namespace GlobalClassFieldTheory + +open scoped NumberField TensorProduct +open NumberField +open CyclicCohomology ClassFormation +open LocalClassFieldTheory + +noncomputable +section + +open CategoryTheory + +namespace Reciprocity + +/-- The rational absolute idele-class representation satisfies the +abstract class-field axiom. -/ +theorem rationalIdeleClassRepresentation_satisfiesClassFieldAxiom : + SatisfiesClassFieldAxiom rationalIdeleClassRepresentation := by + rintro ⟨K, hKfinite⟩ + rintro ⟨L, hLK, hnormal, hfinite, g, hg⟩ + let := hKfinite + let := hnormal + let := hfinite + let Q := K.toSubgroup ⧸ extensionSubgroup K L hLK + let : Fintype Q := Fintype.ofFinite Q + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + let : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + let : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' rfl + let : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + let : NumberField F := NumberField.of_module_finite ℚ F + let : NumberField E := NumberField.of_module_finite ℚ E + let : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L hLK hnormal + let eQ : Q ≃* Gal(E/F) := + abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) K L hLK hnormal + let g' : Gal(E/F) := eQ g + have hg' : ∀ σ : Gal(E/F), + σ ∈ Subgroup.zpowers g' := + map_cyclicGenerator eQ g hg + let := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction F E + have hIdeleClassTateCard := + ClassFieldAxiom.ideleClass_tate_lowDegree_finite_card_eq_finrank_cyclic + F E g' hg' + let : IsCyclic Q := + CyclicCohomology.isCyclic_of_generator g hg + let : CommGroup Q := IsCyclic.commGroup + let : IsCyclic (Gal(E/F)) := + CyclicCohomology.isCyclic_of_generator g' hg' + let : CommGroup (Gal(E/F)) := IsCyclic.commGroup + let M := + extensionFixedRepresentation rationalIdeleClassRepresentation + K L hLK hnormal + let U := + Rep.ofMulDistribMulAction (E ≃ₐ[F] E) + (RelativeIdeleGroup.ClassGroup F E) + let eM : M ≅ Rep.res eQ.toMonoidHom U := by + let e := + rationalAbstractExtensionIdeleClassEquiv K L hLK hnormal + refine Rep.mkIso (Representation.Equiv.mk e.toIntLinearEquiv ?_) + intro q + apply LinearMap.ext + intro x + exact + rationalAbstractExtensionIdeleClassEquiv_action + K L hLK hnormal q x + let eH0 : + (Rep.FiniteCyclicGroup.normHomCompSub M g).homology ≅ + (Rep.FiniteCyclicGroup.normHomCompSub U g').homology := + (normHomCompSubHomologyIsoOfRepIso eM g) ≪≫ + normHomCompSubHomologyResEquivIso eQ U g + let eHm1 : + (Rep.FiniteCyclicGroup.subCompNormHom M g).homology ≅ + (Rep.FiniteCyclicGroup.subCompNormHom U g').homology := + (subCompNormHomHomologyIsoOfRepIso eM g) ≪≫ + subCompNormHomHomologyResEquivIso eQ U g + let eTateH0 : + tateCohomology M 0 ≅ tateCohomology U 0 := + TateCohomology.isoFiniteCyclicZero M g hg ≪≫ eH0 ≪≫ + (TateCohomology.isoFiniteCyclicZero U g' hg').symm + let eTateHm1 : + tateCohomology M (-1) ≅ tateCohomology U (-1) := + TateCohomology.isoFiniteCyclicNegOne M g hg ≪≫ eHm1 ≪≫ + (TateCohomology.isoFiniteCyclicNegOne U g' hg').symm + let : Finite (tateCohomology U 0) := hIdeleClassTateCard.1 + let : Finite (tateCohomology U (-1)) := hIdeleClassTateCard.2.1 + let : Finite (tateCohomology M 0) := + Finite.of_equiv + (tateCohomology U 0) eTateH0.symm.toLinearEquiv.toEquiv + let : Finite (tateCohomology M (-1)) := + Finite.of_equiv + (tateCohomology U (-1)) eTateHm1.symm.toLinearEquiv.toEquiv + refine + { finiteTateHZero := by + change Finite (tateCohomology M 0) + infer_instance + finiteTateHMinusOne := by + change Finite (tateCohomology M (-1)) + infer_instance + tateHZero_card := ?_ + tateHMinusOne_card := ?_ } + · change Nat.card (tateCohomology M 0) = + ((DegreeData.FiniteAbstractExtension.ofInclusion + L K hLK).degree : ℕ) + calc + Nat.card (tateCohomology M 0) = + Nat.card (tateCohomology U 0) := + Nat.card_congr eTateH0.toLinearEquiv.toEquiv + _ = Module.finrank F E := hIdeleClassTateCard.2.2.1 + _ = + ((DegreeData.FiniteAbstractExtension.ofInclusion + L K hLK).degree : ℕ) := + (finiteAbstractExtension_degree_eq_finrank + ℚ (SeparableClosure ℚ) K L hLK hnormal + hKfinite hfinite).symm + · change Nat.card (tateCohomology M (-1)) = 1 + calc + Nat.card (tateCohomology M (-1)) = + Nat.card (tateCohomology U (-1)) := + Nat.card_congr eTateHm1.toLinearEquiv.toEquiv + _ = 1 := hIdeleClassTateCard.2.2.2 + +end Reciprocity + +end +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient.lean new file mode 100644 index 0000000000..99e08a8669 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient.lean @@ -0,0 +1,20 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.PrimePowerKummerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/All.lean new file mode 100644 index 0000000000..626e3a83ea --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/All.lean @@ -0,0 +1,23 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.PrimePowerKummerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient +/-! +# Idele-class power-local-unit quotient + +This aggregate preserves the public import path while the implementation is +organized by the mathematical stages of the norm-index argument. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/ArchimedeanPowerIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/ArchimedeanPowerIndex.lean new file mode 100644 index 0000000000..e74e94ef78 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/ArchimedeanPowerIndex.lean @@ -0,0 +1,329 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces +public import Mathlib.Algebra.Group.Equiv.Basic +public import Mathlib.Basic.Sign.Basic +public import Mathlib.NumberTheory.NumberField.ProductFormula +/-! +# Archimedean power indices in idele class quotients + +This file defines the concrete idele-class subgroup attached to local power +conditions and computes its archimedean local indices. +-/ + +@[expose] public section + +open scoped NumberField NNReal ValuativeRel TensorProduct +open NumberField IsDedekindDomain +open KummerTheory + +noncomputable +section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- The subgroup `C_K(S,T) = h(S,T)Kˣ/Kˣ` inside the idele class +group. -/ +def ideleClassPowerLocalUnitSubgroup + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + Subgroup (IdeleClassGroup K) := + (idelePowerLocalUnitSubgroup (K := K) n S T).map + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K)) + +open scoped Classical in +/-- Elementwise form of `C_K(S,T)=h(S,T)Kˣ/Kˣ`. -/ +theorem mem_ideleClassPowerLocalUnitSubgroup_iff + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) + (c : IdeleClassGroup K) : + c ∈ ideleClassPowerLocalUnitSubgroup (K := K) n S T ↔ + ∃ a : IdeleGroup K, + a ∈ idelePowerLocalUnitSubgroup (K := K) n S T ∧ + QuotientGroup.mk' (IdeleGroup.principalSubgroup K) a = c := by + rfl + +open scoped Classical in +/-- The quotient whose cardinality is the index +`[C_K : C_K(S,T)]`. -/ +abbrev IdeleClassPowerLocalUnitQuotient + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) := + IdeleClassGroup K ⧸ + ideleClassPowerLocalUnitSubgroup (K := K) n S T + +omit [NumberField K] in +open scoped Classical in +/-- If the exponent is even, or the place is complex, every local +`n`-th power is positive in the archimedean sense. -/ +theorem nthPowerSubgroup_le_infinitePositiveSubgroup + (n : ℕ+) + (w : InfinitePlace K) + (harch : Even (n : ℕ) ∨ ¬ w.IsReal) : + (powMonoidHom (n : ℕ) : + w.Completionˣ →* w.Completionˣ).range ≤ + RayClass.infinitePositiveSubgroup w := by + intro x hx + obtain ⟨y, hy⟩ := + (MonoidHom.mem_range + (G := w.Completionˣ)).mp hx + rw [powMonoidHom_apply] at hy + subst x + rw [RayClass.mem_infinitePositiveSubgroup_iff] + intro hw + rcases harch with hnEven | hwNotReal + · rcases hnEven with ⟨m, hm⟩ + let emb := + NumberField.InfinitePlace.Completion.extensionEmbeddingOfIsReal hw + have hyne : emb (y : w.Completion) ≠ 0 := by + intro hzero + apply y.ne_zero + apply emb.injective + simp at hzero + change 0 < emb (((y ^ (n : ℕ) : w.Completionˣ) : w.Completion)) + rw [Units.val_pow_eq_pow_val, map_pow, hm, pow_add, ← pow_two] + exact sq_pos_of_ne_zero (pow_ne_zero m hyne) + · exact False.elim (hwNotReal hw) + +open scoped Classical in +/-- The sign of a unit at a real infinite place. -/ +def realInfinitePlaceSignHom + (w : InfinitePlace K) + (hw : w.IsReal) : + w.Completionˣ →* SignTypeˣ := + (Units.map + (signHom : ℝ →*₀ SignType).toMonoidHom).comp + (Units.mapEquiv + (NumberField.InfinitePlace.Completion.ringEquivRealOfIsReal + hw).toMulEquiv).toMonoidHom + +omit [NumberField K] in +open scoped Classical in +/-- The positive subgroup at a real infinite place is exactly the kernel +of the sign homomorphism. -/ +theorem realInfinitePlaceSignHom_ker + (w : InfinitePlace K) + (hw : w.IsReal) : + (realInfinitePlaceSignHom w hw).ker = + RayClass.infinitePositiveSubgroup w := by + ext x + change + realInfinitePlaceSignHom w hw x = 1 ↔ + x ∈ RayClass.infinitePositiveSubgroup w + rw [RayClass.mem_infinitePositiveSubgroup_iff] + constructor + · intro hx hw' + have hxval := congrArg Units.val hx + have hxsign : + SignType.sign + (NumberField.InfinitePlace.Completion.extensionEmbeddingOfIsReal + hw (x : w.Completion)) = + 1 := by + simpa [realInfinitePlaceSignHom] using hxval + have hproof : hw' = hw := Subsingleton.elim _ _ + subst hproof + exact sign_eq_one_iff.mp hxsign + · intro hx + have hxsign : + SignType.sign + (NumberField.InfinitePlace.Completion.extensionEmbeddingOfIsReal + hw (x : w.Completion)) = + 1 := + sign_eq_one_iff.mpr (hx hw) + apply Units.ext + simpa [realInfinitePlaceSignHom] using hxsign + +omit [NumberField K] in +open scoped Classical in +/-- Both signs occur at a real infinite place. -/ +theorem realInfinitePlaceSignHom_surjective + (w : InfinitePlace K) + (hw : w.IsReal) : + Function.Surjective (realInfinitePlaceSignHom w hw) := by + let eu : w.Completionˣ ≃* ℝˣ := + Units.mapEquiv + (NumberField.InfinitePlace.Completion.ringEquivRealOfIsReal + hw).toMulEquiv + intro s + cases hs : (s : SignType) with + | zero => + exact False.elim (s.ne_zero hs) + | neg => + refine ⟨eu.symm (-1), ?_⟩ + apply Units.ext + simp [realInfinitePlaceSignHom, eu, hs] + | pos => + refine ⟨eu.symm 1, ?_⟩ + apply Units.ext + simp [realInfinitePlaceSignHom, eu, hs] + +open scoped Classical in +/-- The quotient by positive units at a real place is its two-element +sign group. -/ +noncomputable def realInfinitePositiveQuotientEquivSign + (w : InfinitePlace K) + (hw : w.IsReal) : + w.Completionˣ ⧸ RayClass.infinitePositiveSubgroup w ≃* + SignTypeˣ := by + rw [← realInfinitePlaceSignHom_ker w hw] + exact + QuotientGroup.quotientKerEquivOfSurjective + (realInfinitePlaceSignHom w hw) + (realInfinitePlaceSignHom_surjective w hw) + +omit [NumberField K] in +open scoped Classical in +/-- The positive-unit quotient at a real place has order two. -/ +theorem card_realInfinitePositiveQuotient + (w : InfinitePlace K) + (hw : w.IsReal) : + Nat.card + (w.Completionˣ ⧸ + RayClass.infinitePositiveSubgroup w) = + 2 := by + calc + Nat.card + (w.Completionˣ ⧸ + RayClass.infinitePositiveSubgroup w) = + Nat.card SignTypeˣ := + Nat.card_congr + (realInfinitePositiveQuotientEquivSign w hw).toEquiv + _ = 2 := by + rw [Nat.card_eq_fintype_card] + decide + +omit [NumberField K] in +open scoped Classical in +/-- In the even-real or complex cases, the local power subgroup is +exactly the usual archimedean positive subgroup. -/ +theorem nthPowerSubgroup_eq_infinitePositiveSubgroup + (n : ℕ+) + (w : InfinitePlace K) + (harch : Even (n : ℕ) ∨ ¬ w.IsReal) : + (powMonoidHom (n : ℕ) : + w.Completionˣ →* w.Completionˣ).range = + RayClass.infinitePositiveSubgroup w := by + apply le_antisymm + · exact + nthPowerSubgroup_le_infinitePositiveSubgroup + n w harch + · intro x hx + obtain ⟨y, hy⟩ := + _root_.exists_infinitePositiveSubgroup_nthRoot + w (n : ℕ) n.pos x hx + exact + (MonoidHom.mem_range + (G := w.Completionˣ)).mpr ⟨y, by + rw [powMonoidHom_apply] + exact hy⟩ + +omit [NumberField K] in +open scoped Classical in +/-- At a real place an odd power map on local units is surjective. -/ +theorem nthPowerSubgroup_eq_top_of_real_odd + (n : ℕ+) + (w : InfinitePlace K) + (hw : w.IsReal) + (hn : Odd (n : ℕ)) : + (powMonoidHom (n : ℕ) : + w.Completionˣ →* w.Completionˣ).range = + ⊤ := by + apply top_unique + intro x hx + apply + (MonoidHom.mem_range + (G := w.Completionˣ)).mpr + let emb := + NumberField.InfinitePlace.Completion.extensionEmbeddingOfIsReal hw + have hx0 : emb (x : w.Completion) ≠ 0 := by + intro hzero + apply x.ne_zero + simp at hzero + by_cases hxpos : 0 < emb (x : w.Completion) + · have hxPositive : + x ∈ RayClass.infinitePositiveSubgroup w := by + rw [RayClass.mem_infinitePositiveSubgroup_iff] + intro hw' + have hproof : hw' = hw := Subsingleton.elim _ _ + subst hproof + exact hxpos + obtain ⟨y, hy⟩ := + _root_.exists_infinitePositiveSubgroup_nthRoot + w (n : ℕ) n.pos x hxPositive + exact ⟨y, by + rw [powMonoidHom_apply] + exact hy⟩ + · have hxneg : emb (x : w.Completion) < 0 := + lt_of_le_of_ne (le_of_not_gt hxpos) hx0 + have hnegPositive : + -x ∈ RayClass.infinitePositiveSubgroup w := by + rw [RayClass.mem_infinitePositiveSubgroup_iff] + intro hw' + have hproof : hw' = hw := Subsingleton.elim _ _ + subst hproof + change 0 < emb ((-x : w.Completionˣ) : w.Completion) + simp [hxneg] + obtain ⟨y, hy⟩ := + _root_.exists_infinitePositiveSubgroup_nthRoot + w (n : ℕ) n.pos (-x) hnegPositive + refine ⟨-y, ?_⟩ + rw [powMonoidHom_apply, hn.neg_pow, hy] + simp + +omit [NumberField K] in +open scoped Classical in +/-- The archimedean factor in the local power-index product: it is `2` +exactly for an even exponent at a real place, and `1` otherwise. -/ +theorem card_infinitePlace_nthPowerQuotient + (n : ℕ+) + (w : InfinitePlace K) : + Nat.card + (w.Completionˣ ⧸ + (powMonoidHom (n : ℕ) : + w.Completionˣ →* w.Completionˣ).range) = + if w.IsReal ∧ Even (n : ℕ) then 2 else 1 := by + classical + by_cases hw : w.IsReal + · by_cases hn : Even (n : ℕ) + · rw [ + nthPowerSubgroup_eq_infinitePositiveSubgroup + n w (Or.inl hn)] + simpa [hw, hn] using + card_realInfinitePositiveQuotient w hw + · have hodd : Odd (n : ℕ) := + (Nat.even_or_odd (n : ℕ)).resolve_left hn + rw [nthPowerSubgroup_eq_top_of_real_odd n w hw hodd] + let : + Subsingleton + (w.Completionˣ ⧸ (⊤ : Subgroup w.Completionˣ)) := + QuotientGroup.subsingleton_quotient_top + simp [hw, hn] + · have hpower : + (powMonoidHom (n : ℕ) : + w.Completionˣ →* w.Completionˣ).range = + RayClass.infinitePositiveSubgroup w := + nthPowerSubgroup_eq_infinitePositiveSubgroup + n w (Or.inr hw) + have hpositive : + RayClass.infinitePositiveSubgroup w = ⊤ := by + ext x + simp [RayClass.mem_infinitePositiveSubgroup_iff, hw] + rw [hpower, hpositive] + let : + Subsingleton + (w.Completionˣ ⧸ (⊤ : Subgroup w.Completionˣ)) := + QuotientGroup.subsingleton_quotient_top + simp [hw] + + +end GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlaceCompletionInstances.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlaceCompletionInstances.lean new file mode 100644 index 0000000000..e6b37ffbeb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlaceCompletionInstances.lean @@ -0,0 +1,64 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.ValuedAdicComplete +public import Mathlib.NumberTheory.NumberField.ProductFormula +/-! +# Canonical structures on finite completions + +This module installs the complete discrete valuation, characteristic-zero, +and finite residue-field structures used by finite-place class-field +arithmetic. +-/ + +@[expose] public section + +open scoped NumberField ValuativeRel +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +variable {K : Type} [Field K] [NumberField K] + +/-- The distinguished valuation on a finite completion of a number field is +complete discrete. -/ +noncomputable instance finitePlaceAdicCompletion_isCompleteDiscrete + (v₀ : HeightOneSpectrum (𝓞 K)) : + ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete + (Valued.v : + Valuation (v₀.adicCompletion K) + (WithZero (Multiplicative ℤ))) where + isRankOneDiscrete := inferInstance + isAdicComplete := + ValuationTheory.Valuations.rankOneDiscreteValuationSubring_isAdicComplete + +/-- A finite completion of a number field has characteristic zero. -/ +noncomputable instance finitePlaceAdicCompletion_charZero + (v₀ : HeightOneSpectrum (𝓞 K)) : + CharZero (v₀.adicCompletion K) := + charZero_of_injective_algebraMap + (algebraMap K (v₀.adicCompletion K)).injective + +/-- The residue field of a finite completion of a number field is finite. -/ +noncomputable instance finitePlaceAdicCompletion_residueFinite + (v₀ : HeightOneSpectrum (𝓞 K)) : + Finite + (IsLocalRing.ResidueField + (Valued.v : + Valuation (v₀.adicCompletion K) + (WithZero (Multiplicative ℤ))).valuationSubring) := by + change Finite (Valued.ResidueField (v₀.adicCompletion K)) + exact _root_.finite_adicCompletion_residueField K v₀ + +end GlobalClassFieldTheory.ClassFieldAxiom + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlacePowerIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlacePowerIndex.lean new file mode 100644 index 0000000000..f03e95be85 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlacePowerIndex.lean @@ -0,0 +1,333 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitPowerIndexFormulas +public import Mathlib.NumberTheory.NumberField.ProductFormula +/-! +# Finite-place power indices + +This file supplies the completion instances and local cardinality formulas used +to evaluate finite-place factors in idele power quotients. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.LocalField renaming + chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation → + chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation + +open _root_.LocalFieldTheory.DiscreteValuationField.LocalField renaming + valuation_natCast_eq_exp_neg_ramificationIndex_mul_padicValNat → + valuation_natCast_eq_exp_neg_ramificationIndex_mul_padicValNat + +open _root_.LocalFieldTheory.DiscreteValuationField renaming + finite_fieldUnits_nthPowerQuotient_of_finite_principalUnits → + finite_fieldUnits_nthPowerQuotient_of_finite_principalUnits + + +open scoped NumberField NNReal ValuativeRel TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- The finite-place local power index in the integral form used before +applying the global product formula. The two copies of `n` are +respectively the uniformizer direction and the `n`-th roots of unity +already contained in `K`. -/ +theorem card_finitePlace_nthPowerQuotient + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v₀ : HeightOneSpectrum (𝓞 K)) : + let ν : + Valuation (v₀.adicCompletion K) + (WithZero (Multiplicative ℤ)) := + Valued.v + let F := + LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation ν + letI : + LocalFieldTheory.DiscreteValuationField.LocalField.MixedWithZeroValuationContext + ν := + LocalFieldTheory.DiscreteValuationField.LocalField.mixedWithZeroValuationContext ν + letI : + Valued (v₀.adicCompletion K) + (WithZero (Multiplicative ℤ)) := + Valued.mk' ν + let d := + Module.finrank ℚ_[F.residueCharacteristic] + (v₀.adicCompletion K) + Nat.card + ((v₀.adicCompletion K)ˣ ⧸ + (powMonoidHom (n : ℕ) : + (v₀.adicCompletion K)ˣ →* + (v₀.adicCompletion K)ˣ).range) = + (n : ℕ) * + ((n : ℕ) * + F.residueCharacteristic ^ + (d * + padicValNat F.residueCharacteristic (n : ℕ))) := by + let ν : + Valuation (v₀.adicCompletion K) + (WithZero (Multiplicative ℤ)) := + Valued.v + let F := + LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation ν + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + have hν : Function.Surjective ν := + v₀.valuedAdicCompletion_surjective K + let : + LocalFieldTheory.DiscreteValuationField.LocalField.MixedWithZeroValuationContext + ν := + LocalFieldTheory.DiscreteValuationField.LocalField.mixedWithZeroValuationContext ν + let : + Valued (v₀.adicCompletion K) + (WithZero (Multiplicative ℤ)) := + Valued.mk' ν + let d := + Module.finrank ℚ_[F.residueCharacteristic] + (v₀.adicCompletion K) + obtain ⟨a, e⟩ := + chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation + ν hν + let U := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF 1 + let A := + ZMod (F.residueCharacteristic ^ a) × + (Fin d → ℤ_[F.residueCharacteristic]) + let : Finite + (A ⧸ LocalFieldTheory.nsmulAddSubgroup A (n : ℕ)) := by + infer_instance + let emul : U ≃* Multiplicative A := by + let direct : + Valued (v₀.adicCompletion K) + (WithZero (Multiplicative ℤ)) := + Valued.mk' ν + letI : TopologicalSpace (v₀.adicCompletion K) := + direct.toTopologicalSpace + exact e.symm.toMulEquiv + let : Finite + (U ⧸ + (powMonoidHom (n : ℕ) : U →* U).range) := + LocalFieldTheory.finite_nthPowerQuotient_of_mulEquiv + U (Multiplicative A) (n : ℕ) emul + let hex := F.toCompleteDVF.exists_uniformizer + let π := Classical.choose hex + have hπ : + F.toCompleteDVF.valuation.IsUniformizer + (π : v₀.adicCompletion K) := + Classical.choose_spec hex + let : Finite + ((v₀.adicCompletion K)ˣ ⧸ + (powMonoidHom (n : ℕ) : + (v₀.adicCompletion K)ˣ →* + (v₀.adicCompletion K)ˣ).range) := + finite_fieldUnits_nthPowerQuotient_of_finite_principalUnits + F.toCompleteDVF hπ (n : ℕ) + have hindex := + LocalFieldTheory.DiscreteValuationField.LocalField.mixed_fieldIndex + ν hν (n := (n : ℕ)) + have hroots : + Nat.card + ((powMonoidHom (n : ℕ) : + (v₀.adicCompletion K)ˣ →* + (v₀.adicCompletion K)ˣ).ker) = + (n : ℕ) := by + rw [ + LocalFieldTheory.powMonoidHom_ker_units_eq_rootsOfUnity] + obtain ⟨ζ, hζ⟩ := hmu + have hζprim : IsPrimitiveRoot ζ (n : ℕ) := + (mem_primitiveRoots n.pos).mp hζ + exact + (hζprim.map_of_injective + (algebraMap K (v₀.adicCompletion K)).injective).card_rootsOfUnity + simpa only [hroots] using hindex + +open scoped Classical in +/-- The residue-characteristic contribution in the finite local +power-index formula. Keeping this contribution as a named natural +number makes the subsequent product-formula calculation visible. -/ +noncomputable def finitePlaceNthPowerDefect + (n : ℕ+) + (v₀ : HeightOneSpectrum (𝓞 K)) : ℕ := + let ν : + Valuation (v₀.adicCompletion K) + (WithZero (Multiplicative ℤ)) := + Valued.v + let F := + LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation ν + letI : + LocalFieldTheory.DiscreteValuationField.LocalField.MixedWithZeroValuationContext + ν := + LocalFieldTheory.DiscreteValuationField.LocalField.mixedWithZeroValuationContext ν + letI : + Valued (v₀.adicCompletion K) + (WithZero (Multiplicative ℤ)) := + Valued.mk' ν + let d := + Module.finrank ℚ_[F.residueCharacteristic] + (v₀.adicCompletion K) + F.residueCharacteristic ^ + (d * padicValNat F.residueCharacteristic (n : ℕ)) + +open scoped Classical in +/-- The local defect is the norm of the exact prime-power factor of +the principal ideal `(n)` at `v`. -/ +theorem finitePlaceNthPowerDefect_eq_absNorm_maxPowDividing + (n : ℕ+) + (v : HeightOneSpectrum (𝓞 K)) : + finitePlaceNthPowerDefect (K := K) n v = + Ideal.absNorm + (v.maxPowDividing + (Ideal.span {((n : ℕ) : 𝓞 K)})) := by + let ν : + Valuation + (v.adicCompletion K) + (WithZero (Multiplicative ℤ)) := + Valued.v + let F := + LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation + ν + let : + LocalFieldTheory.DiscreteValuationField.LocalField.MixedWithZeroValuationContext + ν := + LocalFieldTheory.DiscreteValuationField.LocalField.mixedWithZeroValuationContext + ν + let : + Valued + (v.adicCompletion K) + (WithZero (Multiplicative ℤ)) := + Valued.mk' ν + let p := F.residueCharacteristic + let d := + Module.finrank ℚ_[p] (v.adicCompletion K) + let e := + LocalFieldTheory.DiscreteValuationField.LocalField.ramificationIndexOfWithZeroValuation + ν + let f := + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).toDVF + F.toCompleteDVF.toDVF + let k := padicValNat p (n : ℕ) + let x : 𝓞 K := ((n : ℕ) : 𝓞 K) + have hx : x ≠ 0 := by + exact Nat.cast_ne_zero.mpr n.ne_zero + have hI : + Ideal.span {x} ≠ 0 := + Submodule.span_singleton_eq_bot.mp.mt hx + have hd : d = e * f := by + simpa [F, p, d, e, f] using + finrank_qp_eq_ramificationIndex_mul_residueDegree + ν (v.valuedAdicCompletion_surjective K) + have hq : Ideal.absNorm v.asIdeal = p ^ f := by + simpa [ν, F, p, f] using + absNorm_eq_residueCharacteristic_pow_residueDegree + (K := K) v + have hcomp : + ν ((n : ℕ) : v.adicCompletion K) = + WithZero.exp + (-((e : ℤ) * (k : ℤ))) := by + simpa [F, e, k] using + valuation_natCast_eq_exp_neg_ramificationIndex_mul_padicValNat + ν (n : ℕ) n.ne_zero + have hval : + v.intValuation x = + WithZero.exp + (-((e : ℤ) * (k : ℤ))) := by + calc + v.intValuation x = + v.valuation K x := + (v.valuation_of_algebraMap + (K := K) x).symm + _ = + Valued.v + (x : v.adicCompletion K) := + (HeightOneSpectrum.valuedAdicCompletion_eq_valuation + (v := v) x).symm + _ = + ν ((n : ℕ) : v.adicCompletion K) := by + apply congrArg ν + change + algebraMap K (v.adicCompletion K) (x : K) = + ((n : ℕ) : v.adicCompletion K) + simp [x] + _ = _ := hcomp + have hexp : + WithZero.exp + (-(multiplicity v.asIdeal + (Ideal.span {x}) : ℤ)) = + WithZero.exp + (-((e : ℤ) * (k : ℤ))) := by + rw [← v.intValuation_eq_exp_neg_multiplicity hx] + exact hval + have hmult : + multiplicity v.asIdeal + (Ideal.span {x}) = + e * k := by + exact_mod_cast + neg_injective + (WithZero.exp_injective hexp) + change + p ^ (d * k) = + Ideal.absNorm + (v.maxPowDividing + (Ideal.span {x})) + calc + p ^ (d * k) = + p ^ ((e * f) * k) := by + rw [hd] + _ = p ^ (f * (e * k)) := by + congr 1 + ac_rfl + _ = (p ^ f) ^ (e * k) := by + rw [pow_mul] + _ = + Ideal.absNorm v.asIdeal ^ (e * k) := by + rw [hq] + _ = + Ideal.absNorm + (v.asIdeal ^ (e * k)) := by + rw [map_pow] + _ = + Ideal.absNorm + (v.maxPowDividing + (Ideal.span {x})) := by + rw [ + HeightOneSpectrum.maxPowDividing_eq_pow_multiplicity + hI, + hmult] + +open scoped Classical in +/-- The finite local power-index formula with the +residue-characteristic contribution packaged as +`finitePlaceNthPowerDefect`. -/ +theorem card_finitePlace_nthPowerQuotient_eq_defect + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v₀ : HeightOneSpectrum (𝓞 K)) : + Nat.card + ((v₀.adicCompletion K)ˣ ⧸ + (powMonoidHom (n : ℕ) : + (v₀.adicCompletion K)ˣ →* + (v₀.adicCompletion K)ˣ).range) = + (n : ℕ) * + ((n : ℕ) * + finitePlaceNthPowerDefect (K := K) n v₀) := by + simpa [finitePlaceNthPowerDefect] using + card_finitePlace_nthPowerQuotient + (K := K) n hmu v₀ + + +end GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/LocalResidueArithmetic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/LocalResidueArithmetic.lean new file mode 100644 index 0000000000..38952c6bcf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/LocalResidueArithmetic.lean @@ -0,0 +1,370 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitPowerIndexFormulas +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.PrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.ValuedAdicComplete +public import Mathlib.NumberTheory.NumberField.ProductFormula +/-! +# Residue arithmetic for finite-place power indices + +This file relates global ideal norms to the residue fields and ramification +invariants of the corresponding finite completions. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.LocalField renaming + valuation_residueCharacteristic_eq_exp_neg_ramificationIndex → + valuation_residueCharacteristic_eq_exp_neg_ramificationIndex + +open _root_.LocalFieldTheory.DiscreteValuationField.ValuedExtension renaming + degree_eq_ramificationIndex_mul_residueDegree_of_finite_separable → + degree_eq_ramificationIndex_mul_residueDegree_of_finite_separable + +open _root_.LocalFieldTheory.DiscreteValuationField.ValuedExtension renaming + exists_unit_mul_target_uniformizer_pow_eq_base_uniformizer_image → + exists_unit_mul_target_uniformizer_pow_eq_base_uniformizer_image + +open _root_.LocalFieldTheory.DiscreteValuationField.WithZeroValuation renaming + exists_valuationSubring_valuation_eq_exp_neg_one_of_surjective → + exists_valuationSubring_valuation_eq_exp_neg_one_of_surjective + +open _root_.LocalFieldTheory.DiscreteValuationField.WithZeroValuation renaming + isUniformizer_of_valuation_eq_exp_neg_one → + isUniformizer_of_valuation_eq_exp_neg_one + + +open scoped NumberField NNReal ValuativeRel +open NumberField IsDedekindDomain +open LocalFieldTheory + +noncomputable +section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +variable {K : Type} [Field K] [NumberField K] + + +open scoped Classical in +/-- The ideal norm is the cardinality of the residue field of the +corresponding adic completion. -/ +theorem absNorm_eq_card_adicResidueField + (v : HeightOneSpectrum (𝓞 K)) : + Ideal.absNorm v.asIdeal = + Nat.card + (Valued.ResidueField (v.adicCompletion K)) := by + rw [Ideal.absNorm_apply] + exact + Nat.card_congr + (ringOfIntegersQuotientEquivAdicResidueField + v).toEquiv + +open scoped Classical in +/-- The valuation-theoretic ramification index used by the local field +formula agrees with the extension ramification index. -/ +theorem ramificationIndexOfWithZeroValuation_eq_extensionRamificationIndex + {E : Type*} [Field E] + (ν : Valuation E (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete ν] + [Finite + (IsLocalRing.ResidueField ν.valuationSubring)] + [CharZero E] + (hν : Function.Surjective ν) : + let F := + LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation + ν + letI : + LocalFieldTheory.DiscreteValuationField.LocalField.MixedQPadicContext + F := + LocalFieldTheory.DiscreteValuationField.LocalField.mixedQPadicContext + F + LocalFieldTheory.DiscreteValuationField.LocalField.ramificationIndexOfWithZeroValuation + ν = + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + F.residueCharacteristic).toDVF + F.toCompleteDVF.toDVF := by + let F := + LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation + ν + let p := F.residueCharacteristic + let : + LocalFieldTheory.DiscreteValuationField.LocalField.MixedQPadicContext + F := + LocalFieldTheory.DiscreteValuationField.LocalField.mixedQPadicContext + F + let : Fact p.Prime := + ⟨F.residueCharacteristic_prime⟩ + let base := + LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p + let target := F.toCompleteDVF + let : + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p).IsRankOneDiscrete := + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).instCompleteDiscrete.isRankOneDiscrete + let ϖ : base.valuationSubring := + LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicIntEquivValuationSubring + p (p : ℤ_[p]) + have hϖval : + base.valuation (ϖ : ℚ_[p]) = + WithZero.exp (-1 : ℤ) := by + dsimp [base, ϖ] + exact LocalFieldTheory.Padic.padicDVR_valuation_p p + have hϖ : + base.valuation.IsUniformizer + (ϖ : ℚ_[p]) := by + dsimp [base, ϖ] at hϖval ⊢ + exact + isUniformizer_of_valuation_eq_exp_neg_one + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p) + ((LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicIntEquivValuationSubring + p (p : ℤ_[p]) : + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).valuationSubring) : ℚ_[p]) + hϖval + obtain ⟨π, hπval⟩ := + exists_valuationSubring_valuation_eq_exp_neg_one_of_surjective + ν hν + have hπ : + target.valuation.IsUniformizer (π : E) := + isUniformizer_of_valuation_eq_exp_neg_one + ν (π : E) hπval + obtain ⟨u, hu⟩ := + exists_unit_mul_target_uniformizer_pow_eq_base_uniformizer_image + base target hϖ hπ + have huval : + ν ((u : target.valuationSubring) : E) = 1 := by + change + ν (algebraMap target.valuationSubring E + (u : target.valuationSubring)) = 1 + exact + (Valuation.Integers.isUnit_iff_valuation_eq_one + (Valuation.integer.integers ν) + (x := (u : target.valuationSubring))).mp + u.isUnit + have hfield : + ((ValuationTheory.DiscreteValuationField.ValuedExtension.integerMap + base.toDVF target.toDVF ϖ : + target.valuationSubring) : E) = + ((u : target.valuationSubring) : E) * + (π : E) ^ + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF := + congrArg Subtype.val hu + have hval := congrArg ν hfield + have hpval : + ν (p : E) = + WithZero.exp + (-(ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF : ℤ)) := by + rw [ν.map_mul, ν.map_pow, huval, hπval, + one_mul] at hval + calc + ν (p : E) = + WithZero.exp (-1 : ℤ) ^ + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF := by + have himage : + ((ValuationTheory.DiscreteValuationField.ValuedExtension.integerMap + base.toDVF target.toDVF ϖ : target.valuationSubring) : E) = + (p : E) := by + change algebraMap ℚ_[p] E (p : ℚ_[p]) = (p : E) + exact map_natCast _ _ + exact (congrArg ν himage).symm.trans hval + _ = + WithZero.exp + (ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF • + (-1 : ℤ)) := + (WithZero.exp_nsmul _ _).symm + _ = + WithZero.exp + (-(ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF : ℤ)) := by + congr 1 + simp + have hcustom := + valuation_residueCharacteristic_eq_exp_neg_ramificationIndex + ν + have hexp : + WithZero.exp + (-(LocalFieldTheory.DiscreteValuationField.LocalField.ramificationIndexOfWithZeroValuation + ν : ℤ)) = + WithZero.exp + (-(ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF : ℤ)) := + hcustom.symm.trans + (by + simpa [F, p] using hpval) + have hint : + -(LocalFieldTheory.DiscreteValuationField.LocalField.ramificationIndexOfWithZeroValuation + ν : ℤ) = + -(ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF : ℤ) := + WithZero.exp_injective hexp + exact_mod_cast neg_injective hint + +open scoped Classical in +/-- The cardinality of a mixed-characteristic local residue field is +`p` to the residue degree. -/ +theorem card_localField_residueField_eq_pow_residueDegree + {E : Type*} [Field E] + (ν : Valuation E (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete ν] + [Finite + (IsLocalRing.ResidueField ν.valuationSubring)] + [CharZero E] : + let F := + LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation + ν + letI : + LocalFieldTheory.DiscreteValuationField.LocalField.MixedQPadicContext + F := + LocalFieldTheory.DiscreteValuationField.LocalField.mixedQPadicContext + F + Nat.card F.residueField = + F.residueCharacteristic ^ + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + F.residueCharacteristic).toDVF + F.toCompleteDVF.toDVF := by + let F := + LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation + ν + let p := F.residueCharacteristic + let : + LocalFieldTheory.DiscreteValuationField.LocalField.MixedQPadicContext + F := + LocalFieldTheory.DiscreteValuationField.LocalField.mixedQPadicContext + F + let base := + LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p + let target := F.toCompleteDVF + let : Finite base.residueField := + LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF_residueField_finite p + change + Nat.card target.residueField = + p ^ + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + base.toDVF target.toDVF + have hfinrank : + Module.finrank base.residueField target.residueField = + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + base.toDVF target.toDVF := by + rw [ + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree_eq_finrank_quotient + base target] + rfl + calc + Nat.card target.residueField = + Nat.card base.residueField ^ + Module.finrank base.residueField target.residueField := + Module.natCard_eq_pow_finrank + _ = p ^ + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + base.toDVF target.toDVF := by + rw [hfinrank, + LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF_residueField_card] + +open scoped Classical in +/-- Degree over `ℚ_p` is ramification index times residue degree. -/ +theorem finrank_qp_eq_ramificationIndex_mul_residueDegree + {E : Type*} [Field E] + (ν : Valuation E (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete ν] + [Finite + (IsLocalRing.ResidueField ν.valuationSubring)] + [CharZero E] + (hν : Function.Surjective ν) : + let F := + LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation + ν + letI : + LocalFieldTheory.DiscreteValuationField.LocalField.MixedQPadicContext + F := + LocalFieldTheory.DiscreteValuationField.LocalField.mixedQPadicContext + F + Module.finrank ℚ_[F.residueCharacteristic] E = + LocalFieldTheory.DiscreteValuationField.LocalField.ramificationIndexOfWithZeroValuation + ν * + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + F.residueCharacteristic).toDVF + F.toCompleteDVF.toDVF := by + let F := + LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation + ν + let : + LocalFieldTheory.DiscreteValuationField.LocalField.MixedQPadicContext + F := + LocalFieldTheory.DiscreteValuationField.LocalField.mixedQPadicContext + F + let base := + LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + F.residueCharacteristic + let target := F.toCompleteDVF + rw [ + ramificationIndexOfWithZeroValuation_eq_extensionRamificationIndex + ν hν] + exact + degree_eq_ramificationIndex_mul_residueDegree_of_finite_separable + base target + +open scoped Classical in +/-- The absolute norm of `v` is `p^f`, with `p` the residue +characteristic and `f` the local residue degree. -/ +theorem absNorm_eq_residueCharacteristic_pow_residueDegree + (v : HeightOneSpectrum (𝓞 K)) : + let ν : + Valuation + (v.adicCompletion K) + (WithZero (Multiplicative ℤ)) := + Valued.v + let F := + LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation + ν + letI : + LocalFieldTheory.DiscreteValuationField.LocalField.MixedQPadicContext + F := + LocalFieldTheory.DiscreteValuationField.LocalField.mixedQPadicContext + F + Ideal.absNorm v.asIdeal = + F.residueCharacteristic ^ + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + F.residueCharacteristic).toDVF + F.toCompleteDVF.toDVF := by + let ν : + Valuation + (v.adicCompletion K) + (WithZero (Multiplicative ℤ)) := + Valued.v + let F := + LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation + ν + let : + LocalFieldTheory.DiscreteValuationField.LocalField.MixedQPadicContext + F := + LocalFieldTheory.DiscreteValuationField.LocalField.mixedQPadicContext + F + rw [absNorm_eq_card_adicResidueField] + change + Nat.card F.residueField = + F.residueCharacteristic ^ + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + F.residueCharacteristic).toDVF + F.toCompleteDVF.toDVF + exact card_localField_residueField_eq_pow_residueDegree ν + + +end GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/NormContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/NormContainment.lean new file mode 100644 index 0000000000..e00fafa990 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/NormContainment.lean @@ -0,0 +1,124 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitNormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion +/-! +# Norm containment for idele power-local-unit subgroups + +This file proves that the concrete local-condition subgroup lies in the global +idele norm range, and descends that inclusion to idele classes. +-/ + +@[expose] public section + +open scoped NumberField NNReal ValuativeRel TensorProduct +open NumberField IsDedekindDomain +open AlgebraicNumberTheory.Valuations +open KummerTheory +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +noncomputable +section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +variable {K L : Type} [Field K] [NumberField K] [Field L] [NumberField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + +open scoped Classical in +/-- The idele norm inclusion `h(S,T) ⊆ N_{L/K} I_L`. -/ +theorem idelePowerLocalUnitSubgroup_le_relativeIdeleNorm_range + (n : ℕ+) (r : ℕ) + (eG : + (L ≃ₐ[K] L) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S T : Finset (HeightOneSpectrum (𝓞 K))) + (harch : + Even (n : ℕ) ∨ + ∀ w : InfinitePlace K, ¬ w.IsReal) + (hT : + ∀ v, v ∈ T → + _root_.FinitePlaceSplitsCompletely + (K := K) (L := L) v) + (hAway : + ∀ v, v ∉ S ∪ T → + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + idelePowerLocalUnitSubgroup (K := K) n S T ≤ + (RelativeIdeleGroup.norm K L).range := by + intro a ha + rw [_root_.mem_relativeIdeleNorm_range_iff_localTensorNorms] + constructor + · intro w + apply + _root_.infinitePositiveSubgroup_le_infiniteTensorNormSubgroup + (K := K) (L := L) w + apply + nthPowerSubgroup_le_infinitePositiveSubgroup + (K := K) n w + · exact harch.imp_right (fun h => h w) + · exact + ((mem_idelePowerLocalUnitSubgroup_iff + (K := K) n S T a).mp ha).1 w + · intro v + rw [ + _root_.finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup] + have hall := + idelePowerLocalUnitSubgroup_le_allFinitePlaceLocalNormCondition + (K := K) (L := L) n r eG S T hT hAway ha + exact Subgroup.mem_iInf.mp hall v + +open scoped Classical in +/-- The induced norm inclusion on idele class groups: +`N_{L/K} C_L ⊇ C_K(S,T)`. -/ +theorem ideleClassPowerLocalUnitSubgroup_le_ideleClassNorm_range + (n : ℕ+) (r : ℕ) + (eG : + (L ≃ₐ[K] L) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S T : Finset (HeightOneSpectrum (𝓞 K))) + (harch : + Even (n : ℕ) ∨ + ∀ w : InfinitePlace K, ¬ w.IsReal) + (hT : + ∀ v, v ∈ T → + _root_.FinitePlaceSplitsCompletely + (K := K) (L := L) v) + (hAway : + ∀ v, v ∉ S ∪ T → + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + ideleClassPowerLocalUnitSubgroup (K := K) n S T ≤ + (RelativeIdeleGroup.Cohomology.ideleClassNorm K L).range := by + rintro c ⟨a, ha, rfl⟩ + obtain ⟨b, hb⟩ := + idelePowerLocalUnitSubgroup_le_relativeIdeleNorm_range + (K := K) (L := L) n r eG S T harch hT hAway ha + refine + ⟨QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) b, ?_⟩ + rw [RelativeIdeleGroup.Cohomology.ideleClassNorm_mk, hb] + + +end GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean new file mode 100644 index 0000000000..f828d785cb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean @@ -0,0 +1,524 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.IdeleClassHerbrandSupportedFinal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge +public import Mathlib.FieldTheory.IsSepClosed +/-! +# Prime-power Kummer norm index + +This file combines the supported local index, principal-ideles exact sequence, +and norm containment to prove the prime-power Kummer norm-index theorem. +-/ + +@[expose] public section + +open scoped NumberField NNReal ValuativeRel TensorProduct +open NumberField IsDedekindDomain +open AlgebraicNumberTheory.Valuations +open KummerTheory +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +noncomputable +section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- The actual exact-sequence product after evaluating the middle local +power quotient as `n^(2s)`. -/ +theorem card_sUnitPrincipalQuotient_mul_card_ideleClassQuotient_eq_power_two_totalPlaceCard + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S T : Finset (HeightOneSpectrum (𝓞 K))) + (hS : + ∀ v : HeightOneSpectrum (𝓞 K), + v.asIdeal ∣ + Ideal.span {((n : ℕ) : 𝓞 K)} → + v ∈ S) + (hLarge : + IdeleGroup.supportedAt + (K := K) + (S ∪ T : + Set (HeightOneSpectrum (𝓞 K))) ⊔ + IdeleGroup.principalSubgroup K = + ⊤) : + Nat.card + (SUnitGroup (K := K) (S ∪ T) ⧸ + sUnitPrincipalIdelePowerSubgroup + (K := K) n S T) * + Nat.card + (IdeleClassPowerLocalUnitQuotient + (K := K) n S T) = + (n : ℕ) ^ + (2 * totalPlaceCard (K := K) S) := by + rw [ + card_sUnitPrincipalQuotient_mul_card_ideleClassQuotient + (K := K) n S T hLarge, + card_supportedIdeleQuotient_eq_power_two_totalPlaceCard + (K := K) n hmu S T hS] + +/-- Every place with nonunit valuation lies in the chosen finite support of a unit. -/ +private theorem mem_chosenUnitFiniteSupport_of_valuation_ne_one + (b : Kˣ) (w : HeightOneSpectrum (𝓞 K)) (hw : w.valuation K (b : K) ≠ 1) : + w ∈ chosenUnitFiniteSupport (K := K) b := by + classical + by_contra hnot + exact hw ((mem_SUnitGroup_iff + (K := K) (chosenUnitFiniteSupport (K := K) b) b).mp + (mem_sUnitGroup_chosenUnitFiniteSupport (K := K) b) w hnot) + +open scoped Classical in +/-- The class-quotient calculation for the Kummer-selected prime set. +The localization equality identifies the left term of the exact sequence +with the canonical `n`-th-power quotient of the `(S' ∪ T)`-unit group; +all support and divisibility hypotheses are derived from the prescribed +seed `S`. -/ +theorem + card_ideleClassPowerLocalUnitQuotient_eq_finrank_sUnitKummerPrimeSet + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + let hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let nUnit : Kˣ := + Units.mk0 ((n : ℕ) : K) hnK + let S₀ := + (S ∪ IdeleGroup.sufficientlyLargeFiniteSet (K := K)) ∪ + chosenUnitFiniteSupport (K := K) nUnit + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S₀ + let T := + sUnitKummerPrimeSet + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S₀ + Nat.card + (IdeleClassPowerLocalUnitQuotient + (K := K) n S' T) = + Module.finrank K E := by + classical + dsimp only + let hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let nUnit : Kˣ := Units.mk0 ((n : ℕ) : K) hnK + let S₀ := + (S ∪ IdeleGroup.sufficientlyLargeFiniteSet (K := K)) ∪ + chosenUnitFiniteSupport (K := K) nUnit + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S₀ + let T := + sUnitKummerPrimeSet + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S₀ + let hST : Disjoint S' T := + (sUnitKummerPrimeSet_disjoint_enlargeByFiniteKummerRadicalSupport + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S₀).symm + change + Nat.card + (IdeleClassPowerLocalUnitQuotient + (K := K) n S' T) = + Module.finrank K E + have hnOne : 1 < (n : ℕ) := by + rw [hn] + exact one_lt_pow₀ hp.one_lt hv.ne' + have hr : + r ≤ totalPlaceCard (K := K) S' := by + simpa only [S'] using + galoisRank_le_totalPlaceCard_enlargedS + (K := K) (Omega := Omega) E n hnOne hmu + r eG S₀ + have hTcard : + T.card = + totalPlaceCard (K := K) S' - r := by + simpa only [T, S', sUnitKummerPrimeCount] using + sUnitKummerPrimeSet_card + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S₀ + have hDoubleSub : + 2 * totalPlaceCard (K := K) S' - r = + totalPlaceCard (K := K) S' + + (totalPlaceCard (K := K) S' - r) := by + rw [two_mul] + exact Nat.add_sub_assoc hr _ + have hTotal : + totalPlaceCard (K := K) (S' ∪ T) = + 2 * totalPlaceCard (K := K) S' - r := by + change + Fintype.card (InfinitePlace K) + (S' ∪ T).card = + 2 * totalPlaceCard (K := K) S' - r + rw [Finset.card_union_of_disjoint hST, hTcard, hDoubleSub] + unfold totalPlaceCard + simp only [Nat.add_assoc] + have hPrincipal := + principalIdelePowerLocalUnitSubgroup_eq_sUnitNthPowersInField_sUnitKummerPrimeSet + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S + dsimp only at hPrincipal + change + principalIdelePowerLocalUnitSubgroup + (K := K) n S' T = + sUnitNthPowersInField + (K := K) n (S' ∪ T) at hPrincipal + have hDen : + sUnitPrincipalIdelePowerSubgroup + (K := K) n S' T = + (powMonoidHom (n : ℕ) : + SUnitGroup (K := K) (S' ∪ T) →* + SUnitGroup (K := K) (S' ∪ T)).range := by + rw [sUnitPrincipalIdelePowerSubgroup, hPrincipal, + sUnitNthPowersInField] + exact + Subgroup.comap_map_eq_self_of_injective + (SUnitGroup + (K := K) (S' ∪ T)).subtype_injective _ + have hLeft : + Nat.card + (SUnitGroup (K := K) (S' ∪ T) ⧸ + sUnitPrincipalIdelePowerSubgroup + (K := K) n S' T) = + (n : ℕ) ^ + (2 * totalPlaceCard (K := K) S' - r) := by + rw [hDen, + card_sUnit_nthPowerQuotient + (K := K) (S' ∪ T) n hmu, + hTotal] + have hDiv : + ∀ w : HeightOneSpectrum (𝓞 K), + w.asIdeal ∣ + Ideal.span {((n : ℕ) : 𝓞 K)} → + w ∈ S' := by + intro w hwDvd + have hnValLt : + w.valuation K ((n : ℕ) : K) < 1 := by + simpa using + (IsDedekindDomain.HeightOneSpectrum.valuation_lt_one_iff_dvd + (K := K) w ((n : ℕ) : 𝓞 K)).2 hwDvd + have hwSupport := mem_chosenUnitFiniteSupport_of_valuation_ne_one + nUnit w (ne_of_lt hnValLt) + exact + subset_enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S₀ + (Finset.mem_union_right _ hwSupport) + have hCanonical : + (IdeleGroup.sufficientlyLargeFiniteSet (K := K) : + Set (HeightOneSpectrum (𝓞 K))) ⊆ + (S₀ : Set (HeightOneSpectrum (𝓞 K))) := by + intro w hw + exact Finset.mem_union_left _ (Finset.mem_union_right _ hw) + have hS₀ : + IdeleGroup.supportedAt + (K := K) (S₀ : Set (HeightOneSpectrum (𝓞 K))) ⊔ + IdeleGroup.principalSubgroup K = + ⊤ := by + apply top_unique + rw [ + ← IdeleGroup.supportedAt_sup_principalSubgroup_eq_top + (K := K)] + exact + sup_le_sup + (IdeleGroup.supportedAt_mono + (K := K) hCanonical) + le_rfl + have hLargeS' : + IdeleGroup.supportedAt + (K := K) (S' : Set (HeightOneSpectrum (𝓞 K))) ⊔ + IdeleGroup.principalSubgroup K = + ⊤ := by + simpa only [S'] using + supportedAt_sup_principalSubgroup_eq_top_of_enlargeByRadicalSupport + (K := K) (L := E) n hmu S₀ hS₀ + have hLarge : + IdeleGroup.supportedAt + (K := K) + (S' ∪ T : Set (HeightOneSpectrum (𝓞 K))) ⊔ + IdeleGroup.principalSubgroup K = + ⊤ := by + apply top_unique + rw [← hLargeS'] + exact + sup_le_sup + (IdeleGroup.supportedAt_mono + (K := K) (by + intro w hw + exact Or.inl hw)) + le_rfl + have hProduct := + card_sUnitPrincipalQuotient_mul_card_ideleClassQuotient_eq_power_two_totalPlaceCard + (K := K) n hmu S' T hDiv hLarge + rw [hLeft] at hProduct + have hr2 : + r ≤ 2 * totalPlaceCard (K := K) S' := by + omega + have hPow : + (n : ℕ) ^ + (2 * totalPlaceCard (K := K) S') = + (n : ℕ) ^ + (2 * totalPlaceCard (K := K) S' - r) * + (n : ℕ) ^ r := by + rw [← pow_add, Nat.sub_add_cancel hr2] + have hClassCard := Nat.eq_of_mul_eq_mul_left + (pow_pos n.pos (2 * totalPlaceCard (K := K) S' - r)) (hProduct.trans hPow) + calc + Nat.card + (IdeleClassPowerLocalUnitQuotient + (K := K) n S' T) = + (n : ℕ) ^ r := + hClassCard + _ = Nat.card Gal(E/K) := by + symm + rw [Nat.card_congr eG.toEquiv, Nat.card_pi] + simp + _ = Module.finrank K E := + IsGalois.card_aut_eq_finrank K E + +open scoped Classical in +open _root_.GlobalClassFieldTheory.Cohomology renaming + chosenFinitePlaceIsUnramified_of_notMem_ideleClassHerbrandSupport → + chosenFinitePlaceIsUnramified_of_notMem_ideleClassHerbrandSupport in +/-- Separable-closure realization of the norm-index calculation for a +prime-power Kummer extension presented as an intermediate field. This +form is useful when the extension is already constructed inside a fixed +separable closure. -/ +theorem + ideleClassNorm_index_eq_finrank_primePowerKummer_intermediateField + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (eG : + Gal(E/K) ≃* + (Fin 1 → Multiplicative (ZMod (n : ℕ)))) : + letI : NumberField E := + NumberField.of_module_finite K E + (RelativeIdeleGroup.Cohomology.ideleClassNorm K E).range.index = + Module.finrank K E := by + classical + let _ : NumberField E := + NumberField.of_module_finite K E + let eCyclic : + Gal(E/K) ≃* Multiplicative (ZMod (n : ℕ)) := + eG.trans + (MulEquiv.piUnique + (fun _ : Fin 1 => + Multiplicative (ZMod (n : ℕ)))) + let : IsCyclic Gal(E/K) := + eCyclic.isCyclic.mpr inferInstance + let S : Finset (HeightOneSpectrum (𝓞 K)) := + _root_.ideleClassHerbrandSupport + (K := K) (L := E) + let hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let nUnit : Kˣ := Units.mk0 ((n : ℕ) : K) hnK + let S₀ := + (S ∪ IdeleGroup.sufficientlyLargeFiniteSet (K := K)) ∪ + chosenUnitFiniteSupport (K := K) nUnit + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S₀ + let T := + sUnitKummerPrimeSet + (K := K) (Omega := Omega) E n hmu + p v hp hv hn 1 eG S₀ + have hClassCard := + card_ideleClassPowerLocalUnitQuotient_eq_finrank_sUnitKummerPrimeSet + (K := K) (Omega := Omega) E n hmu + p v hp hv hn 1 eG S + dsimp only at hClassCard + change + Nat.card + (IdeleClassPowerLocalUnitQuotient + (K := K) n S' T) = + Module.finrank K E at hClassCard + have hT : + ∀ w, w ∈ T → + _root_.FinitePlaceSplitsCompletely + (K := K) (L := E) w := by + intro w hw + apply + finitePlaceSplitsCompletely_of_mem_sUnitKummerPrimeSet + (K := K) (Omega := Omega) E n hmu + p v hp hv hn 1 eG S₀ w + simpa only [T] using hw + have hAway : + ∀ w, w ∉ S' ∪ T → + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := E) w := by + intro w hwAway + apply + chosenFinitePlaceIsUnramified_of_notMem_ideleClassHerbrandSupport + intro hwSupport + have hwS : w ∈ S := by + simpa only [S] using hwSupport + have hwS₀ : w ∈ S₀ := + Finset.mem_union_left _ + (Finset.mem_union_left _ hwS) + have hwS' : w ∈ S' := + subset_enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S₀ hwS₀ + exact hwAway (Finset.mem_union_left T hwS') + have hnOne : 1 < (n : ℕ) := by + rw [hn] + calc + 1 < p := hp.one_lt + _ = p ^ 1 := (pow_one p).symm + _ ≤ p ^ v := + Nat.pow_le_pow_right hp.pos + (Nat.succ_le_iff.mpr hv) + have harch : + Even (n : ℕ) ∨ + ∀ w : InfinitePlace K, ¬ w.IsReal := by + by_cases hnEven : Even (n : ℕ) + · exact Or.inl hnEven + · refine Or.inr ?_ + have hnNeTwo : (n : ℕ) ≠ 2 := by + intro hnTwo + apply hnEven + rw [hnTwo] + decide + have hnLarge : 2 < (n : ℕ) := by + omega + obtain ⟨ζ, hζ⟩ := hmu + have hζPrim : IsPrimitiveRoot ζ (n : ℕ) := + (mem_primitiveRoots n.pos).mp hζ + have hRealZero : + InfinitePlace.nrRealPlaces K = 0 := + InfinitePlace.IsPrimitiveRoot.nrRealPlaces_eq_zero_of_two_lt + hnLarge hζPrim + intro w hwReal + have hRealPos : + 0 < InfinitePlace.nrRealPlaces K := + Fintype.card_pos_iff.mpr ⟨⟨w, hwReal⟩⟩ + omega + have hSub : + ideleClassPowerLocalUnitSubgroup + (K := K) n S' T ≤ + (RelativeIdeleGroup.Cohomology.ideleClassNorm K E).range := + ideleClassPowerLocalUnitSubgroup_le_ideleClassNorm_range + (K := K) (L := E) n 1 eG S' T + harch hT hAway + have hPowerIndex : + (ideleClassPowerLocalUnitSubgroup + (K := K) n S' T).index = + Module.finrank K E := by + rw [Subgroup.index_eq_card] + change + Nat.card + (IdeleClassPowerLocalUnitQuotient + (K := K) n S' T) = + Module.finrank K E + exact hClassCard + have hIndexDvd : + (RelativeIdeleGroup.Cohomology.ideleClassNorm K E).range.index ∣ + (ideleClassPowerLocalUnitSubgroup + (K := K) n S' T).index := + Subgroup.index_dvd_of_le hSub + have hDvd : + (RelativeIdeleGroup.Cohomology.ideleClassNorm K E).range.index ∣ + Module.finrank K E := by + simpa only [hPowerIndex] using hIndexDvd + have hUpper : + (RelativeIdeleGroup.Cohomology.ideleClassNorm K E).range.index ≤ + Module.finrank K E := + Nat.le_of_dvd Module.finrank_pos hDvd + obtain ⟨sigma, hsigma⟩ := + IsCyclic.exists_generator (α := Gal(E/K)) + have hLower : + Module.finrank K E ≤ + (RelativeIdeleGroup.Cohomology.ideleClassNorm K E).range.index := + Cohomology.finrank_le_ideleClassNorm_index + (K := K) (L := E) sigma hsigma + exact le_antisymm hUpper hLower + +open scoped Classical in +/-- The norm subgroup has index `[E : K]` for an arbitrary prime-power +Kummer extension. The proof realizes `E` as its field range in a fixed +separable closure, applies the intermediate-field calculation there, +and transports both the norm index and the degree back across the +resulting `K`-algebra equivalence. -/ +theorem ideleClassNorm_index_eq_finrank_primePowerKummer + {E : Type} [Field E] [Algebra K E] + [FiniteDimensional K E] [IsGalois K E] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (eG : + Gal(E/K) ≃* + (Fin 1 → Multiplicative (ZMod (n : ℕ)))) : + letI : NumberField E := + NumberField.of_module_finite K E + (RelativeIdeleGroup.Cohomology.ideleClassNorm K E).range.index = + Module.finrank K E := by + classical + let : NumberField E := + NumberField.of_module_finite K E + let i : E →ₐ[K] SeparableClosure K := + IsSepClosed.lift + let R : IntermediateField K (SeparableClosure K) := + AlgHom.fieldRange i + let e : E ≃ₐ[K] R := + AlgHom.equivFieldRange i + let _ : FiniteDimensional K R := + e.toLinearEquiv.finiteDimensional + let _ : IsGalois K R := + IsGalois.of_algEquiv e + let _ : NumberField R := + NumberField.of_module_finite K R + let _ : (RelativeIdeleGroup.principalSubgroup K R).Normal := + ⟨fun n hn g => by + have hconj : g * n * g⁻¹ = n := by + rw [mul_comm g n, mul_assoc, mul_inv_cancel, mul_one] + rwa [hconj]⟩ + let _ : Group (RelativeIdeleGroup.ClassGroup K R) := + QuotientGroup.Quotient.group + (RelativeIdeleGroup.principalSubgroup K R) + let eG' : + Gal(R/K) ≃* + (Fin 1 → Multiplicative (ZMod (n : ℕ))) := + (AlgEquiv.autCongr e).symm.trans eG + have hR := + ideleClassNorm_index_eq_finrank_primePowerKummer_intermediateField + (K := K) (Omega := SeparableClosure K) R n hmu + p v hp hv hn eG' + calc + (RelativeIdeleGroup.Cohomology.ideleClassNorm K E).range.index = + (RelativeIdeleGroup.Cohomology.ideleClassNorm K R).range.index := + (ideleClassNorm_index_algEquiv + (K := K) e).symm + _ = Module.finrank K R := hR + _ = Module.finrank K E := + e.toLinearEquiv.finrank_eq.symm + + +end GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedIdeleIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedIdeleIndex.lean new file mode 100644 index 0000000000..a4103ce841 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedIdeleIndex.lean @@ -0,0 +1,349 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SupportedIdelePowerLocalUnitQuotient +/-! +# Supported idele power quotient + +This file expresses the supported idele quotient as the product of its local +archimedean and finite-place power indices and evaluates its cardinality. +-/ + +@[expose] public section + +open scoped NumberField NNReal ValuativeRel TensorProduct +open NumberField IsDedekindDomain +open AlgebraicNumberTheory.Valuations +open KummerTheory +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +noncomputable +section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- The middle term in the supported exact sequence, evaluated as the +product of its actual local power indices. The archimedean factors are +the sign indices, while each finite factor is the finite local +power index. The following product-formula step evaluates the remaining +finite defect product. -/ +theorem card_supportedIdeleQuotient_eq_localPowerIndexProduct + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + Nat.card + (IdeleGroup.supportedAt + (K := K) (S ∪ T : + Set (HeightOneSpectrum (𝓞 K))) ⧸ + supportedIdelePowerLocalUnitSubgroup (K := K) n S T) = + (∏ w : InfinitePlace K, + if w.IsReal ∧ Even (n : ℕ) then 2 else 1) * + ∏ v : ↥S, + (n : ℕ) * + ((n : ℕ) * + finitePlaceNthPowerDefect (K := K) n v.1) := by + classical + rw [ + card_supportedIdeleQuotient_eq_localPowerClasses + (K := K) n S T, + Nat.card_prod, + Nat.card_pi, + Nat.card_pi] + congr 1 + · apply Finset.prod_congr rfl + intro w _ + exact card_infinitePlace_nthPowerQuotient (K := K) n w + · apply Finset.prod_congr rfl + intro v _ + exact + card_finitePlace_nthPowerQuotient_eq_defect + (K := K) n hmu v.1 + +open scoped Classical in +/-- The finite-place product-formula calculation, stated directly for +the prime-ideal factors of the principal ideal `(n)`. +The hypothesis says exactly that `S` contains every finite place +dividing `n`; places added to `S` contribute the factor `1`. -/ +theorem prod_absNorm_maxPowDividing_natCast + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (hS : + ∀ v : HeightOneSpectrum (𝓞 K), + v.asIdeal ∣ Ideal.span {((n : ℕ) : 𝓞 K)} → + v ∈ S) : + (∏ v : ↥S, + Ideal.absNorm + (v.1.maxPowDividing + (Ideal.span {((n : ℕ) : 𝓞 K)}))) = + (n : ℕ) ^ Module.finrank ℚ K := by + classical + let I : Ideal (𝓞 K) := + Ideal.span {((n : ℕ) : 𝓞 K)} + have hI : I ≠ 0 := by + simp [I, n.ne_zero] + let f : HeightOneSpectrum (𝓞 K) → ℕ := + fun v => Ideal.absNorm (v.maxPowDividing I) + have hsupport : Function.mulSupport f ⊆ (S : Set _) := by + intro v hv + apply hS v + have hcount : + (Associates.mk v.asIdeal).count + (Associates.mk I).factors ≠ 0 := by + intro hzero + apply hv + simp [f, IsDedekindDomain.HeightOneSpectrum.maxPowDividing, + hzero] + exact + (Associates.count_ne_zero_iff_dvd + hI v.irreducible).mp hcount + have hmap : + Ideal.absNorm + (∏ᶠ v : HeightOneSpectrum (𝓞 K), + v.maxPowDividing I) = + ∏ᶠ v : HeightOneSpectrum (𝓞 K), + Ideal.absNorm (v.maxPowDividing I) := + Ideal.absNorm.map_finprod + (Ideal.hasFiniteMulSupport hI) + calc + (∏ v : ↥S, + Ideal.absNorm + (v.1.maxPowDividing + (Ideal.span {((n : ℕ) : 𝓞 K)}))) = + ∏ v ∈ S, f v := by + simpa [f, I] using Finset.prod_coe_sort S f + _ = ∏ᶠ v : HeightOneSpectrum (𝓞 K), f v := + (finprod_eq_prod_of_mulSupport_subset f hsupport).symm + _ = + Ideal.absNorm + (∏ᶠ v : HeightOneSpectrum (𝓞 K), + v.maxPowDividing I) := hmap.symm + _ = Ideal.absNorm I := by + rw [Ideal.finprod_heightOneSpectrum_factorization hI] + _ = (n : ℕ) ^ Module.finrank ℚ K := by + change + Ideal.absNorm + (Ideal.span {(((n : ℕ) : ℕ) : 𝓞 K)}) = + (n : ℕ) ^ Module.finrank ℚ K + rw [Ideal.absNorm_span_natCast, + NumberField.RingOfIntegers.rank] + +open scoped Classical in +/-- Product of the actual finite-place power defects. -/ +theorem prod_finitePlaceNthPowerDefect + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (hS : + ∀ v : HeightOneSpectrum (𝓞 K), + v.asIdeal ∣ + Ideal.span {((n : ℕ) : 𝓞 K)} → + v ∈ S) : + (∏ v : ↥S, + finitePlaceNthPowerDefect + (K := K) n v.1) = + (n : ℕ) ^ Module.finrank ℚ K := by + calc + (∏ v : ↥S, + finitePlaceNthPowerDefect + (K := K) n v.1) = + ∏ v : ↥S, + Ideal.absNorm + (v.1.maxPowDividing + (Ideal.span + {((n : ℕ) : 𝓞 K)})) := by + apply Finset.prod_congr rfl + intro v _ + exact + finitePlaceNthPowerDefect_eq_absNorm_maxPowDividing + (K := K) n v.1 + _ = _ := + prod_absNorm_maxPowDividing_natCast + (K := K) n S hS + +open scoped Classical in +/-- The product of the archimedean local power indices. Only real +places and an even exponent contribute a factor `2`. -/ +theorem prod_infinitePlace_nthPowerIndex + (n : ℕ+) : + (∏ w : InfinitePlace K, + if w.IsReal ∧ Even (n : ℕ) then 2 else 1) = + if Even (n : ℕ) then + 2 ^ InfinitePlace.nrRealPlaces K + else 1 := by + classical + by_cases hn : Even (n : ℕ) + · rw [ite_eq_left hn] + rw [InfinitePlace.prod_eq_prod_mul_prod] + simp only [hn, and_true] + have hr : + (∏ w : {w : InfinitePlace K // w.IsReal}, + if w.1.IsReal then 2 else 1) = + ∏ _w : {w : InfinitePlace K // w.IsReal}, 2 := by + apply Finset.prod_congr rfl + intro w _ + rw [ite_eq_left w.2] + have hc : + (∏ w : {w : InfinitePlace K // w.IsComplex}, + if w.1.IsReal then 2 else 1) = + ∏ _w : {w : InfinitePlace K // w.IsComplex}, 1 := by + apply Finset.prod_congr rfl + intro w _ + rw [ite_eq_right + (InfinitePlace.not_isReal_iff_isComplex.mpr w.2)] + rw [hr, hc] + simp [InfinitePlace.nrRealPlaces] + · simp [hn] + +open scoped Classical in +/-- The archimedean signature calculation used together with the finite +product formula. If `K` contains a primitive `n`-th root with `n > 2`, +it has no real places; the remaining cases are `n = 1, 2`. -/ +theorem prod_infinitePlace_nthPowerIndex_mul_natDegree + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + (∏ w : InfinitePlace K, + if w.IsReal ∧ Even (n : ℕ) then 2 else 1) * + (n : ℕ) ^ Module.finrank ℚ K = + (n : ℕ) ^ + (2 * Fintype.card (InfinitePlace K)) := by + classical + have harch := + prod_infinitePlace_nthPowerIndex (K := K) n + obtain ⟨ζ, hζ⟩ := hmu + have hζprim : IsPrimitiveRoot ζ (n : ℕ) := + (mem_primitiveRoots n.pos).mp hζ + have hsignature := + InfinitePlace.card_add_two_mul_card_eq_rank K + have hplaces := + InfinitePlace.card_eq_nrRealPlaces_add_nrComplexPlaces K + by_cases hlarge : 2 < (n : ℕ) + · have hreal : + InfinitePlace.nrRealPlaces K = 0 := + InfinitePlace.IsPrimitiveRoot.nrRealPlaces_eq_zero_of_two_lt + hlarge hζprim + rw [hreal, zero_add] at hsignature hplaces + have hdegree : + Module.finrank ℚ K = + 2 * Fintype.card (InfinitePlace K) := by + omega + rw [harch, hreal, hdegree] + simp + · have hnle : (n : ℕ) ≤ 2 := + Nat.le_of_not_gt hlarge + have hnpos : 0 < (n : ℕ) := n.pos + have hone_or_two : + (n : ℕ) = 1 ∨ (n : ℕ) = 2 := by + omega + rcases hone_or_two with hone | htwo + · have hn : n = (1 : ℕ+) := Subtype.ext hone + subst n + rw [harch] + simp + · have hn : n = (2 : ℕ+) := Subtype.ext htwo + subst n + rw [harch] + rw [ite_eq_left (by decide : + Even (((2 : ℕ+) : ℕ)))] + change + 2 ^ InfinitePlace.nrRealPlaces K * + 2 ^ Module.finrank ℚ K = + 2 ^ (2 * Fintype.card (InfinitePlace K)) + rw [← pow_add] + congr 1 + omega + +open scoped Classical in +/-- The middle term of the supported exact sequence has cardinality +`n^(2s)`, where `s` is the number of infinite places plus the number of +finite places in `S`. -/ +theorem card_supportedIdeleQuotient_eq_power_two_totalPlaceCard + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S T : Finset (HeightOneSpectrum (𝓞 K))) + (hS : + ∀ v : HeightOneSpectrum (𝓞 K), + v.asIdeal ∣ + Ideal.span {((n : ℕ) : 𝓞 K)} → + v ∈ S) : + Nat.card + (IdeleGroup.supportedAt + (K := K) + (S ∪ T : + Set (HeightOneSpectrum (𝓞 K))) ⧸ + supportedIdelePowerLocalUnitSubgroup + (K := K) n S T) = + (n : ℕ) ^ + (2 * totalPlaceCard (K := K) S) := by + have hfinite : + (∏ v : ↥S, + (n : ℕ) * + ((n : ℕ) * + finitePlaceNthPowerDefect + (K := K) n v.1)) = + (n : ℕ) ^ (2 * S.card) * + (n : ℕ) ^ Module.finrank ℚ K := by + calc + (∏ v : ↥S, + (n : ℕ) * + ((n : ℕ) * + finitePlaceNthPowerDefect + (K := K) n v.1)) = + ∏ v : ↥S, + (n : ℕ) ^ 2 * + finitePlaceNthPowerDefect + (K := K) n v.1 := by + apply Finset.prod_congr rfl + intro v _ + ring + _ = + (∏ _v : ↥S, (n : ℕ) ^ 2) * + ∏ v : ↥S, + finitePlaceNthPowerDefect + (K := K) n v.1 := by + rw [Finset.prod_mul_distrib] + _ = _ := by + rw [ + prod_finitePlaceNthPowerDefect + (K := K) n S hS] + simp [pow_mul] + rw [ + card_supportedIdeleQuotient_eq_localPowerIndexProduct + (K := K) n hmu S T, + hfinite] + calc + ((∏ w : InfinitePlace K, + if w.IsReal ∧ Even (n : ℕ) then 2 else 1) * + ((n : ℕ) ^ (2 * S.card) * + (n : ℕ) ^ Module.finrank ℚ K)) = + ((∏ w : InfinitePlace K, + if w.IsReal ∧ Even (n : ℕ) then 2 else 1) * + (n : ℕ) ^ Module.finrank ℚ K) * + (n : ℕ) ^ (2 * S.card) := by + ac_rfl + _ = + (n : ℕ) ^ + (2 * Fintype.card (InfinitePlace K)) * + (n : ℕ) ^ (2 * S.card) := by + rw [ + prod_infinitePlace_nthPowerIndex_mul_natDegree + (K := K) n hmu] + _ = + (n : ℕ) ^ + (2 * totalPlaceCard (K := K) S) := by + rw [← pow_add] + congr 1 + unfold totalPlaceCard + omega + + +end GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedPrincipalQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedPrincipalQuotient.lean new file mode 100644 index 0000000000..48f960908c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedPrincipalQuotient.lean @@ -0,0 +1,555 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SupportedIdelePowerLocalUnitQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge +public import Mathlib.Algebra.Group.Equiv.Basic +public import Mathlib.Algebra.Group.Subgroup.Ker +/-! +# Supported principal ideles and the idele-class quotient + +This file identifies supported principal ideles with the corresponding +`S`-unit group and derives the exact-sequence cardinal identities. +-/ + +@[expose] public section + +open scoped NumberField NNReal ValuativeRel TensorProduct +open NumberField IsDedekindDomain +open AlgebraicNumberTheory.Valuations +open KummerTheory +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +noncomputable +section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- Principal ideles lying in `I_K^{S ∪ T}`, expressed as a subgroup of +the supported idele group. -/ +def supportedPrincipalIdeleSubgroup + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + Subgroup + (IdeleGroup.supportedAt + (K := K) (S ∪ T : Set (HeightOneSpectrum (𝓞 K)))) := + (IdeleGroup.principalSubgroup K).comap + (IdeleGroup.supportedAt + (K := K) (S ∪ T : Set (HeightOneSpectrum (𝓞 K)))).subtype + +open scoped Classical in +/-- The diagonal map identifies the `(S ∪ T)`-units with the principal +ideles lying in `I_K^{S ∪ T}`. -/ +noncomputable def sUnitEquivSupportedPrincipalIdeleSubgroup + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + SUnitGroup (K := K) (S ∪ T) ≃* + supportedPrincipalIdeleSubgroup (K := K) S T := by + let f : + SUnitGroup (K := K) (S ∪ T) →* + supportedPrincipalIdeleSubgroup (K := K) S T := + { toFun := fun x => by + have hsupp : + IdeleGroup.principalIdele K (x : Kˣ) ∈ + IdeleGroup.supportedAt + (K := K) + (S ∪ T : Set (HeightOneSpectrum (𝓞 K))) := by + simpa only [Finset.coe_union] using + (_root_.principalIdele_mem_supportedAt_iff_sUnit + (L := K) (S ∪ T) (x : Kˣ)).2 x.property + refine ⟨⟨IdeleGroup.principalIdele K (x : Kˣ), hsupp⟩, ?_⟩ + exact ⟨(x : Kˣ), rfl⟩ + map_one' := by + apply Subtype.ext + apply Subtype.ext + simp + map_mul' := by + intro x y + apply Subtype.ext + apply Subtype.ext + simp } + apply MulEquiv.ofBijective f + constructor + · intro x y hxy + apply Subtype.ext + apply IdeleGroup.principalIdele_injective K + have h := + congrArg + (fun z : + supportedPrincipalIdeleSubgroup (K := K) S T => + ((z : + IdeleGroup.supportedAt + (K := K) + (S ∪ T : + Set (HeightOneSpectrum (𝓞 K)))) : + IdeleGroup K)) + hxy + exact h + · intro y + obtain ⟨x, hx⟩ := y.property + have hsupp : + IdeleGroup.principalIdele K x ∈ + IdeleGroup.supportedAt + (K := K) + (S ∪ T : Set (HeightOneSpectrum (𝓞 K))) := by + rw [hx] + exact y.1.property + have hxS : x ∈ SUnitGroup (K := K) (S ∪ T) := by + apply + (_root_.principalIdele_mem_supportedAt_iff_sUnit + (L := K) (S ∪ T) x).1 + simpa only [Finset.coe_union] using hsupp + refine ⟨⟨x, hxS⟩, ?_⟩ + apply Subtype.ext + apply Subtype.ext + exact hx + +open scoped Classical in +/-- The supported-principal-idele equivalence has underlying idele equal +to the principal idele of the original `S`-unit. -/ +@[simp] +theorem sUnitEquivSupportedPrincipalIdeleSubgroup_coe + (S T : Finset (HeightOneSpectrum (𝓞 K))) + (x : SUnitGroup (K := K) (S ∪ T)) : + (((sUnitEquivSupportedPrincipalIdeleSubgroup + (K := K) S T x : + supportedPrincipalIdeleSubgroup (K := K) S T) : + IdeleGroup.supportedAt + (K := K) + (S ∪ T : Set (HeightOneSpectrum (𝓞 K)))) : + IdeleGroup K) = + IdeleGroup.principalIdele K (x : Kˣ) := + rfl + +open scoped Classical in +/-- Under the preceding diagonal equivalence, this is the subgroup of +`(S ∪ T)`-units whose principal ideles belong to `h(S,T)`. -/ +def sUnitPrincipalIdelePowerSubgroup + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + Subgroup (SUnitGroup (K := K) (S ∪ T)) := + (principalIdelePowerLocalUnitSubgroup (K := K) n S T).comap + (SUnitGroup (K := K) (S ∪ T)).subtype + +open scoped Classical in +/-- The diagonal equivalence carries the principal part of `h(S,T)` +to the intersection of `h(S,T)` with the supported principal ideles. -/ +theorem sUnitPrincipalIdelePowerSubgroup_map + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + (sUnitPrincipalIdelePowerSubgroup (K := K) n S T).map + (sUnitEquivSupportedPrincipalIdeleSubgroup + (K := K) S T).toMonoidHom = + (supportedIdelePowerLocalUnitSubgroup + (K := K) n S T).subgroupOf + (supportedPrincipalIdeleSubgroup (K := K) S T) := by + ext x + constructor + · rintro ⟨y, hy, rfl⟩ + have hy' : + IdeleGroup.principalIdele K (y : Kˣ) ∈ + idelePowerLocalUnitSubgroup (K := K) n S T := by + exact hy + change + (((sUnitEquivSupportedPrincipalIdeleSubgroup + (K := K) S T y : + supportedPrincipalIdeleSubgroup (K := K) S T) : + IdeleGroup.supportedAt + (K := K) + (S ∪ T : Set (HeightOneSpectrum (𝓞 K)))) : + IdeleGroup K) ∈ + idelePowerLocalUnitSubgroup (K := K) n S T + rw [sUnitEquivSupportedPrincipalIdeleSubgroup_coe] + exact hy' + · intro hx + let e := + sUnitEquivSupportedPrincipalIdeleSubgroup + (K := K) S T + refine ⟨e.symm x, ?_, e.apply_symm_apply x⟩ + have hx' : + e (e.symm x) ∈ + (supportedIdelePowerLocalUnitSubgroup + (K := K) n S T).subgroupOf + (supportedPrincipalIdeleSubgroup (K := K) S T) := by + rw [e.apply_symm_apply] + exact hx + change + IdeleGroup.principalIdele K ((e.symm x : _) : Kˣ) ∈ + idelePowerLocalUnitSubgroup (K := K) n S T + have hxIdele : + (((e (e.symm x) : + supportedPrincipalIdeleSubgroup (K := K) S T) : + IdeleGroup.supportedAt + (K := K) + (S ∪ T : Set (HeightOneSpectrum (𝓞 K)))) : + IdeleGroup K) ∈ + idelePowerLocalUnitSubgroup (K := K) n S T := by + exact hx' + rw [sUnitEquivSupportedPrincipalIdeleSubgroup_coe] at hxIdele + exact hxIdele + +open scoped Classical in +/-- The left term in the supported exact sequence, expressed as the +actual quotient of `(S ∪ T)`-units satisfying the principal +`h(S,T)`-condition. -/ +noncomputable def + sUnitPrincipalIdelePowerQuotientEquivSupportedPrincipalQuotient + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + SUnitGroup (K := K) (S ∪ T) ⧸ + sUnitPrincipalIdelePowerSubgroup (K := K) n S T ≃* + supportedPrincipalIdeleSubgroup (K := K) S T ⧸ + (supportedIdelePowerLocalUnitSubgroup + (K := K) n S T).subgroupOf + (supportedPrincipalIdeleSubgroup (K := K) S T) := + QuotientGroup.congr + (sUnitPrincipalIdelePowerSubgroup (K := K) n S T) + ((supportedIdelePowerLocalUnitSubgroup + (K := K) n S T).subgroupOf + (supportedPrincipalIdeleSubgroup (K := K) S T)) + (sUnitEquivSupportedPrincipalIdeleSubgroup + (K := K) S T) + (sUnitPrincipalIdelePowerSubgroup_map + (K := K) n S T) + +open scoped Classical in +/-- Cardinal form of the diagonal identification of the left term in +the supported exact sequence. -/ +theorem card_supportedPrincipalQuotient_eq_sUnitPrincipalQuotient + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + Nat.card + (supportedPrincipalIdeleSubgroup (K := K) S T ⧸ + (supportedIdelePowerLocalUnitSubgroup + (K := K) n S T).subgroupOf + (supportedPrincipalIdeleSubgroup (K := K) S T)) = + Nat.card + (SUnitGroup (K := K) (S ∪ T) ⧸ + sUnitPrincipalIdelePowerSubgroup (K := K) n S T) := + Nat.card_congr + (sUnitPrincipalIdelePowerQuotientEquivSupportedPrincipalQuotient + (K := K) n S T).symm.toEquiv + +open scoped Classical in +/-- The denominator in the supported realization of +`C_K/C_K(S,T)`: it is generated by `h(S,T)` and the principal ideles +which are supported at `S ∪ T`. -/ +def supportedIdeleClassPowerDenominator + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + Subgroup + (IdeleGroup.supportedAt + (K := K) (S ∪ T : Set (HeightOneSpectrum (𝓞 K)))) := + supportedIdelePowerLocalUnitSubgroup (K := K) n S T ⊔ + supportedPrincipalIdeleSubgroup (K := K) S T + +section SupportedClassQuotient + +open scoped Classical in +local instance supportedClassQuotient_isMulCommutative : + IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] supportedClassQuotient_isMulCommutative + +open scoped Classical in +/-- The natural map from supported ideles to +`C_K/C_K(S,T)`. -/ +def supportedIdeleToClassPowerQuotient + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + IdeleGroup.supportedAt + (K := K) (S ∪ T : Set (HeightOneSpectrum (𝓞 K))) →* + IdeleClassPowerLocalUnitQuotient (K := K) n S T := + (QuotientGroup.mk' + (ideleClassPowerLocalUnitSubgroup (K := K) n S T)).comp + ((QuotientGroup.mk' + (IdeleGroup.principalSubgroup K)).comp + (IdeleGroup.supportedAt + (K := K) (S ∪ T : Set (HeightOneSpectrum (𝓞 K)))).subtype) + +open scoped Classical in +/-- The kernel of the supported class-quotient map is precisely the +subgroup generated by `h(S,T)` and the supported principal ideles. -/ +theorem supportedIdeleToClassPowerQuotient_ker + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + (supportedIdeleToClassPowerQuotient + (K := K) n S T).ker = + supportedIdeleClassPowerDenominator (K := K) n S T := by + let U := + IdeleGroup.supportedAt + (K := K) (S ∪ T : Set (HeightOneSpectrum (𝓞 K))) + let H := + supportedIdelePowerLocalUnitSubgroup (K := K) n S T + let P := supportedPrincipalIdeleSubgroup (K := K) S T + ext x + rw [MonoidHom.mem_ker] + change + QuotientGroup.mk' + (ideleClassPowerLocalUnitSubgroup (K := K) n S T) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) (x : IdeleGroup K)) = 1 ↔ + x ∈ H ⊔ P + constructor + · intro hx + have hxClass : + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (x : IdeleGroup K) ∈ + ideleClassPowerLocalUnitSubgroup (K := K) n S T := + (QuotientGroup.eq_one_iff _).mp hx + rcases hxClass with ⟨h, hh, heq⟩ + have hhU : + h ∈ U := + idelePowerLocalUnitSubgroup_le_supportedAt + (K := K) n S T hh + let hU : U := ⟨h, hhU⟩ + have hpDiv : + (x : IdeleGroup K) / h ∈ + IdeleGroup.principalSubgroup K := by + have hpInv : + h / (x : IdeleGroup K) ∈ + IdeleGroup.principalSubgroup K := + (QuotientGroup.eq_iff_div_mem).mp heq + simpa [div_eq_mul_inv, mul_comm] using + (IdeleGroup.principalSubgroup K).inv_mem hpInv + let pU : U := x / hU + have hpU : pU ∈ P := by + exact hpDiv + apply Subgroup.mem_sup.mpr + refine ⟨hU, hh, pU, hpU, ?_⟩ + simp [pU] + · intro hx + apply (QuotientGroup.eq_one_iff _).mpr + rcases Subgroup.mem_sup.mp hx with + ⟨h, hh, p, hp, rfl⟩ + have hhClass : + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (h : IdeleGroup K) ∈ + ideleClassPowerLocalUnitSubgroup (K := K) n S T := by + exact ⟨(h : IdeleGroup K), hh, rfl⟩ + have hpOne : + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (p : IdeleGroup K) = 1 := + (QuotientGroup.eq_one_iff _).mpr hp + have hmul : + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + ((h * p : U) : IdeleGroup K) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (h : IdeleGroup K) * + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (p : IdeleGroup K) := by + simp + rw [hmul, hpOne] + exact + (ideleClassPowerLocalUnitSubgroup (K := K) n S T).mul_mem + hhClass + (ideleClassPowerLocalUnitSubgroup (K := K) n S T).one_mem + +open scoped Classical in +/-- If `S ∪ T` is sufficiently large, every class modulo `C_K(S,T)` +has a supported representative. -/ +theorem supportedIdeleToClassPowerQuotient_surjective + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) + (hLarge : + IdeleGroup.supportedAt + (K := K) (S ∪ T : Set (HeightOneSpectrum (𝓞 K))) ⊔ + IdeleGroup.principalSubgroup K = + ⊤) : + Function.Surjective + (supportedIdeleToClassPowerQuotient + (K := K) n S T) := by + intro q + refine q.inductionOn' ?_ + intro c + refine c.inductionOn' ?_ + intro a + have ha : + a ∈ + IdeleGroup.supportedAt + (K := K) (S ∪ T : + Set (HeightOneSpectrum (𝓞 K))) ⊔ + IdeleGroup.principalSubgroup K := by + rw [hLarge] + exact Subgroup.mem_top a + rcases Subgroup.mem_sup.mp ha with + ⟨u, hu, p, hp, hup⟩ + refine ⟨⟨u, hu⟩, ?_⟩ + change + QuotientGroup.mk' + (ideleClassPowerLocalUnitSubgroup (K := K) n S T) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) u) = + QuotientGroup.mk' + (ideleClassPowerLocalUnitSubgroup (K := K) n S T) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) + rw [← hup, map_mul] + have hpOne : + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) p = 1 := + (QuotientGroup.eq_one_iff _).mpr hp + rw [hpOne] + simp + +open scoped Classical in +/-- Supported realization of the idele-class index quotient. -/ +noncomputable def + supportedIdeleClassPowerQuotientEquiv + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) + (hLarge : + IdeleGroup.supportedAt + (K := K) (S ∪ T : Set (HeightOneSpectrum (𝓞 K))) ⊔ + IdeleGroup.principalSubgroup K = + ⊤) : + IdeleGroup.supportedAt + (K := K) (S ∪ T : Set (HeightOneSpectrum (𝓞 K))) ⧸ + supportedIdeleClassPowerDenominator (K := K) n S T ≃* + IdeleClassPowerLocalUnitQuotient (K := K) n S T := + (QuotientGroup.quotientMulEquivOfEq + (supportedIdeleToClassPowerQuotient_ker + (K := K) n S T).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (supportedIdeleToClassPowerQuotient + (K := K) n S T) + (supportedIdeleToClassPowerQuotient_surjective + (K := K) n S T hLarge)) + +open scoped Classical in +/-- Cardinal form of the supported realization of +`[C_K:C_K(S,T)]`. -/ +theorem card_ideleClassPowerLocalUnitQuotient_eq_supported + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) + (hLarge : + IdeleGroup.supportedAt + (K := K) (S ∪ T : Set (HeightOneSpectrum (𝓞 K))) ⊔ + IdeleGroup.principalSubgroup K = + ⊤) : + Nat.card + (IdeleClassPowerLocalUnitQuotient (K := K) n S T) = + Nat.card + (IdeleGroup.supportedAt + (K := K) (S ∪ T : + Set (HeightOneSpectrum (𝓞 K))) ⧸ + supportedIdeleClassPowerDenominator (K := K) n S T) := + Nat.card_congr + (supportedIdeleClassPowerQuotientEquiv + (K := K) n S T hLarge).symm.toEquiv + +end SupportedClassQuotient + +open scoped Classical in +/-- The cardinal identity furnished by the supported exact sequence: + +`1 → (I_K^{S∪T} ∩ Kˣ)/(h(S,T) ∩ Kˣ) + → I_K^{S∪T}/h(S,T) + → I_K^{S∪T}Kˣ/h(S,T)Kˣ → 1`. + +The first factor is written intrinsically as the relative index of +`h(S,T)` in the supported principal ideles. -/ +theorem card_supportedPrincipalQuotient_mul_card_supportedClassQuotient + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + Nat.card + (supportedPrincipalIdeleSubgroup (K := K) S T ⧸ + (supportedIdelePowerLocalUnitSubgroup (K := K) n S T).subgroupOf + (supportedPrincipalIdeleSubgroup (K := K) S T)) * + Nat.card + (IdeleGroup.supportedAt + (K := K) (S ∪ T : + Set (HeightOneSpectrum (𝓞 K))) ⧸ + supportedIdeleClassPowerDenominator (K := K) n S T) = + Nat.card + (IdeleGroup.supportedAt + (K := K) (S ∪ T : + Set (HeightOneSpectrum (𝓞 K))) ⧸ + supportedIdelePowerLocalUnitSubgroup (K := K) n S T) := by + let U := + IdeleGroup.supportedAt + (K := K) (S ∪ T : Set (HeightOneSpectrum (𝓞 K))) + let H := + supportedIdelePowerLocalUnitSubgroup (K := K) n S T + let P := supportedPrincipalIdeleSubgroup (K := K) S T + change + (H.subgroupOf P).index * (H ⊔ P).index = H.index + have h := + Subgroup.relIndex_mul_index + (H := H) (K := H ⊔ P) le_sup_left + rw [Subgroup.relIndex_sup_left P H] at h + exact h + +open scoped Classical in +/-- The exact-sequence cardinal identity with the right-hand term +identified with the actual idele-class quotient `C_K/C_K(S,T)`. -/ +theorem card_supportedPrincipalQuotient_mul_card_ideleClassQuotient + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) + (hLarge : + IdeleGroup.supportedAt + (K := K) (S ∪ T : Set (HeightOneSpectrum (𝓞 K))) ⊔ + IdeleGroup.principalSubgroup K = + ⊤) : + Nat.card + (supportedPrincipalIdeleSubgroup (K := K) S T ⧸ + (supportedIdelePowerLocalUnitSubgroup (K := K) n S T).subgroupOf + (supportedPrincipalIdeleSubgroup (K := K) S T)) * + Nat.card + (IdeleClassPowerLocalUnitQuotient (K := K) n S T) = + Nat.card + (IdeleGroup.supportedAt + (K := K) (S ∪ T : + Set (HeightOneSpectrum (𝓞 K))) ⧸ + supportedIdelePowerLocalUnitSubgroup (K := K) n S T) := by + rw [ + card_ideleClassPowerLocalUnitQuotient_eq_supported + (K := K) n S T hLarge] + exact + card_supportedPrincipalQuotient_mul_card_supportedClassQuotient + (K := K) n S T + +open scoped Classical in +/-- The exact-sequence identity in intrinsic `S`-unit notation. -/ +theorem card_sUnitPrincipalQuotient_mul_card_ideleClassQuotient + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) + (hLarge : + IdeleGroup.supportedAt + (K := K) (S ∪ T : Set (HeightOneSpectrum (𝓞 K))) ⊔ + IdeleGroup.principalSubgroup K = + ⊤) : + Nat.card + (SUnitGroup (K := K) (S ∪ T) ⧸ + sUnitPrincipalIdelePowerSubgroup (K := K) n S T) * + Nat.card + (IdeleClassPowerLocalUnitQuotient (K := K) n S T) = + Nat.card + (IdeleGroup.supportedAt + (K := K) (S ∪ T : + Set (HeightOneSpectrum (𝓞 K))) ⧸ + supportedIdelePowerLocalUnitSubgroup (K := K) n S T) := by + rw [ + ← card_supportedPrincipalQuotient_eq_sUnitPrincipalQuotient + (K := K) n S T] + exact + card_supportedPrincipalQuotient_mul_card_ideleClassQuotient + (K := K) n S T hLarge + + +end GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean new file mode 100644 index 0000000000..e0245be181 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean @@ -0,0 +1,712 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitLocalPowerMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.KummerLocalNormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.IdeleClassHerbrandSupportedFinal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm +/-! +# Norm containment for idele power-local-unit subgroups + +This module packages the finite-place local norm conditions and proves the +global norm containment and principal-intersection identity used in the +idele-class norm-index argument. +-/ + +@[expose] public section + +open scoped NumberField NNReal IsMulCommutative +open NumberField IsDedekindDomain +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open KummerTheory +open LocalFieldTheory + +noncomputable +section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +variable {K : Type*} [Field K] [NumberField K] + +open scoped Classical in +/-- Ideles whose components at the finite places of `S` are local norms +from the chosen localizations of `L / K`. -/ +def finitePlaceLocalNormCondition + {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [IsGalois K L] + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Subgroup (IdeleGroup K) := + ⨅ v : ↥S, + (_root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v.1).comap + (IdeleGroup.finiteComponent v.1) + +open scoped Classical in +/-- Elementwise form of the finite family of local norm conditions. -/ +theorem mem_finitePlaceLocalNormCondition_iff + {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (S : Finset (HeightOneSpectrum (𝓞 K))) + (a : IdeleGroup K) : + a ∈ finitePlaceLocalNormCondition + (K := K) (L := L) S ↔ + ∀ v : ↥S, + IdeleGroup.finiteComponent v.1 a ∈ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v.1 := by + simp [finitePlaceLocalNormCondition] + +open scoped Classical in +/-- At every finite place in `S`, the `n`-power condition defining +`h(S,T)` implies the actual local norm condition for an exponent-`n` +Kummer extension. -/ +theorem idelePowerLocalUnitSubgroup_le_finitePlaceLocalNormCondition + {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (n : ℕ+) (r : ℕ) + (eG : + (L ≃ₐ[K] L) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + idelePowerLocalUnitSubgroup (K := K) n S T ≤ + finitePlaceLocalNormCondition + (K := K) (L := L) S := by + intro a ha + rw [mem_finitePlaceLocalNormCondition_iff] + intro v + apply + nthPowerSubgroup_le_chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) n r eG v.1 + exact + ((mem_idelePowerLocalUnitSubgroup_iff + (K := K) n S T a).mp ha).2.1 v.1 v.2 + +open scoped Classical in +/-- The finite components of `h(S,T)` at `S ∪ T` are actual local norms: +at `S` this follows from the exponent-`n` Galois structure, while at `T` +it follows from complete splitting. -/ +theorem idelePowerLocalUnitSubgroup_le_unionLocalNormCondition + {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (n : ℕ+) (r : ℕ) + (eG : + (L ≃ₐ[K] L) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S T : Finset (HeightOneSpectrum (𝓞 K))) + (hT : + ∀ v, v ∈ T → + _root_.FinitePlaceSplitsCompletely + (K := K) (L := L) v) : + idelePowerLocalUnitSubgroup (K := K) n S T ≤ + finitePlaceLocalNormCondition + (K := K) (L := L) (S ∪ T) := by + intro a ha + rw [mem_finitePlaceLocalNormCondition_iff] + intro v + rcases Finset.mem_union.mp v.2 with hvS | hvT + · apply + nthPowerSubgroup_le_chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) n r eG v.1 + exact + ((mem_idelePowerLocalUnitSubgroup_iff + (K := K) n S T a).mp ha).2.1 v.1 hvS + · rw [ + _root_.chosenFinitePlaceLocalNormSubgroup_eq_top_of_splitsCompletely + (K := K) (L := L) v.1 (hT v.1 hvT)] + exact Subgroup.mem_top _ + +open scoped Classical in +/-- The simultaneous local norm condition at every finite place. -/ +def allFinitePlaceLocalNormCondition + {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [IsGalois K L] : + Subgroup (IdeleGroup K) := + ⨅ v : HeightOneSpectrum (𝓞 K), + (_root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v).comap + (IdeleGroup.finiteComponent v) + +open scoped Classical in +/-- Under the concrete splitting and unramifiedness conditions, every finite +component of `h(S,T)` is an actual local norm. -/ +theorem idelePowerLocalUnitSubgroup_le_allFinitePlaceLocalNormCondition + {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (n : ℕ+) (r : ℕ) + (eG : + (L ≃ₐ[K] L) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S T : Finset (HeightOneSpectrum (𝓞 K))) + (hT : + ∀ v, v ∈ T → + _root_.FinitePlaceSplitsCompletely + (K := K) (L := L) v) + (hAway : + ∀ v, v ∉ S ∪ T → + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + idelePowerLocalUnitSubgroup (K := K) n S T ≤ + allFinitePlaceLocalNormCondition + (K := K) (L := L) := by + intro a ha + rw [allFinitePlaceLocalNormCondition] + apply Subgroup.mem_iInf.mpr + intro v + by_cases hv : v ∈ S ∪ T + · rcases Finset.mem_union.mp hv with hvS | hvT + · apply + nthPowerSubgroup_le_chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) n r eG v + exact + ((mem_idelePowerLocalUnitSubgroup_iff + (K := K) n S T a).mp ha).2.1 v hvS + · rw [ + _root_.chosenFinitePlaceLocalNormSubgroup_eq_top_of_splitsCompletely + (K := K) (L := L) v (hT v hvT)] + exact Subgroup.mem_top _ + · apply + _root_.adicCompletionIntegerUnits_le_chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v (hAway v hv) + exact + ((mem_idelePowerLocalUnitSubgroup_iff + (K := K) n S T a).mp ha).2.2 v hv + +open scoped Classical in +/-- Every global relative-idele norm satisfies all of the actual +finite-place local norm conditions. -/ +theorem relativeIdeleNorm_range_le_allFinitePlaceLocalNormCondition + {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] : + (RelativeIdeleGroup.norm K L).range ≤ + allFinitePlaceLocalNormCondition + (K := K) (L := L) := by + rintro a ⟨b, rfl⟩ + rw [allFinitePlaceLocalNormCondition] + apply Subgroup.mem_iInf.mpr + intro v + exact + _root_.relativeIdeleNorm_finiteComponent_mem_chosenLocalNormSubgroup + (K := K) (L := L) v b + +private theorem exists_supported_idele_same_class_local_powers + {K : Type} [Field K] [NumberField K] + (n : ℕ+) (S' T : Finset (HeightOneSpectrum (𝓞 K))) (hST : Disjoint S' T) + (hSurj : Function.Surjective (sUnitLocalUnitPowerMap (K := K) n S' T hST)) + (u : IdeleGroup K) + (hu : u ∈ IdeleGroup.supportedAt (K := K) (S' : Set (HeightOneSpectrum (𝓞 K)))) : + ∃ d : IdeleGroup K, + d ∈ IdeleGroup.supportedAt (K := K) (S' : Set (HeightOneSpectrum (𝓞 K))) ∧ + (∀ w : T, IdeleGroup.finiteComponent w.1 d ∈ + (powMonoidHom (n : ℕ) : (w.1.adicCompletion K)ˣ →* (w.1.adicCompletion K)ˣ).range) ∧ + QuotientGroup.mk' (IdeleGroup.principalSubgroup K) d = + QuotientGroup.mk' (IdeleGroup.principalSubgroup K) u := by + classical + have hT_not_mem_S (w : T) : w.1 ∉ S' := by + intro hwS + exact (Finset.disjoint_left.mp hST) hwS w.2 + let uLocalUnit (w : T) : + (w.1.adicCompletionIntegers K)ˣ := + (w.1.adicCompletionIntegers K).toSubmonoid.unitsEquivUnitsType + ⟨IdeleGroup.finiteComponent w.1 u, + (IdeleGroup.mem_supportedAt_iff + (K := K) + (S' : Set (HeightOneSpectrum (𝓞 K))) u).mp + hu w.1 (by simpa using hT_not_mem_S w)⟩ + let target : + ∀ w : T, + (w.1.adicCompletionIntegers K)ˣ ⧸ + (powMonoidHom (n : ℕ) : + (w.1.adicCompletionIntegers K)ˣ →* + (w.1.adicCompletionIntegers K)ˣ).range := + fun w => + QuotientGroup.mk' + (powMonoidHom (n : ℕ) : + (w.1.adicCompletionIntegers K)ˣ →* + (w.1.adicCompletionIntegers K)ˣ).range + (uLocalUnit w) + obtain ⟨s, hs⟩ := hSurj target + have hsSupported : + IdeleGroup.principalIdele K (s : Kˣ) ∈ + IdeleGroup.supportedAt + (K := K) + (S' : Set (HeightOneSpectrum (𝓞 K))) := + (_root_.principalIdele_mem_supportedAt_iff_sUnit + (L := K) S' (s : Kˣ)).2 s.2 + let sLocalUnit (w : T) : + (w.1.adicCompletionIntegers K)ˣ := + (w.1.adicCompletionIntegers K).toSubmonoid.unitsEquivUnitsType + ⟨IdeleGroup.finiteComponent w.1 + (IdeleGroup.principalIdele K (s : Kˣ)), + (IdeleGroup.mem_supportedAt_iff + (K := K) + (S' : Set (HeightOneSpectrum (𝓞 K))) + (IdeleGroup.principalIdele K (s : Kˣ))).mp + hsSupported w.1 (by simpa using hT_not_mem_S w)⟩ + let d : IdeleGroup K := + u * (IdeleGroup.principalIdele K (s : Kˣ))⁻¹ + have hdSupported : + d ∈ + IdeleGroup.supportedAt + (K := K) + (S' : Set (HeightOneSpectrum (𝓞 K))) := by + dsimp only [d] + exact + (IdeleGroup.supportedAt + (K := K) + (S' : Set (HeightOneSpectrum (𝓞 K)))).mul_mem + hu + ((IdeleGroup.supportedAt + (K := K) + (S' : Set (HeightOneSpectrum (𝓞 K)))).inv_mem + hsSupported) + have hTpower (w : T) : + IdeleGroup.finiteComponent w.1 d ∈ + (powMonoidHom (n : ℕ) : + (w.1.adicCompletion K)ˣ →* + (w.1.adicCompletion K)ˣ).range := by + have hw := congrFun hs w + change + QuotientGroup.mk' + (powMonoidHom (n : ℕ) : + (w.1.adicCompletionIntegers K)ˣ →* + (w.1.adicCompletionIntegers K)ˣ).range + (sLocalUnit w) = + QuotientGroup.mk' + (powMonoidHom (n : ℕ) : + (w.1.adicCompletionIntegers K)ˣ →* + (w.1.adicCompletionIntegers K)ˣ).range + (uLocalUnit w) at hw + have hIntegerPower : + uLocalUnit w / sLocalUnit w ∈ + (powMonoidHom (n : ℕ) : + (w.1.adicCompletionIntegers K)ˣ →* + (w.1.adicCompletionIntegers K)ˣ).range := + (QuotientGroup.eq_iff_div_mem).mp hw.symm + let toField : + (w.1.adicCompletionIntegers K)ˣ →* + (w.1.adicCompletion K)ˣ := + Units.map + (w.1.adicCompletionIntegers K).subtype.toMonoidHom + obtain ⟨z, hz⟩ := hIntegerPower + have hFieldPower : + toField (uLocalUnit w / sLocalUnit w) ∈ + (powMonoidHom (n : ℕ) : + (w.1.adicCompletion K)ˣ →* + (w.1.adicCompletion K)ˣ).range := by + refine ⟨toField z, ?_⟩ + change + (toField z) ^ (n : ℕ) = + toField (uLocalUnit w / sLocalUnit w) + simpa only [powMonoidHom_apply, map_pow] using + congrArg toField hz + have huToField : + toField (uLocalUnit w) = + IdeleGroup.finiteComponent w.1 u := by + apply Units.ext + rfl + have hsToField : + toField (sLocalUnit w) = + IdeleGroup.finiteComponent w.1 + (IdeleGroup.principalIdele K (s : Kˣ)) := by + apply Units.ext + rfl + simpa only [d, div_eq_mul_inv, map_mul, map_inv, + huToField, hsToField] using hFieldPower + refine ⟨d, hdSupported, hTpower, ?_⟩ + have hsOne : QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.principalIdele K (s : Kˣ)) = 1 := + (QuotientGroup.eq_one_iff _).mpr ⟨(s : Kˣ), rfl⟩ + simp only [d, map_mul, map_inv, hsOne, inv_one] + exact mul_one (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) u) + +open scoped Classical in +private theorem ideleClassNorm_range_eq_top_of_local_power_surjectivity + {K M : Type} [Field K] [NumberField K] [Field M] [NumberField M] + [Algebra K M] [FiniteDimensional K M] [IsAbelianGalois K M] + [(RelativeIdeleGroup.principalSubgroup K M).Normal] + (n : ℕ+) (S' T : Finset (HeightOneSpectrum (𝓞 K))) (hST : Disjoint S' T) + (hSurj : Function.Surjective (sUnitLocalUnitPowerMap (K := K) n S' T hST)) + (hLarge : IdeleGroup.supportedAt (K := K) (S' : Set (HeightOneSpectrum (𝓞 K))) ⊔ + IdeleGroup.principalSubgroup K = ⊤) + (hSplitS : ∀ w : HeightOneSpectrum (𝓞 K), w ∈ S' → + _root_.FinitePlaceSplitsCompletely (K := K) (L := M) w) + (hInfiniteTop : ∀ w : InfinitePlace K, + _root_.infiniteTensorNormSubgroup (K := K) (L := M) w = ⊤) + (hAway : ∀ w : HeightOneSpectrum (𝓞 K), w ∉ S' ∪ T → + _root_.ChosenFinitePlaceIsUnramified (K := K) (L := M) w) + (hPower : ∀ w : HeightOneSpectrum (𝓞 K), + (powMonoidHom (n : ℕ) : (w.adicCompletion K)ˣ →* (w.adicCompletion K)ˣ).range ≤ + _root_.chosenFinitePlaceLocalNormSubgroup (K := K) (L := M) w) : + (RelativeIdeleGroup.Cohomology.ideleClassNorm K M).range = ⊤ := by + classical + apply top_unique + intro c _ + obtain ⟨a, rfl⟩ := + QuotientGroup.mk'_surjective + (IdeleGroup.principalSubgroup K) c + have ha : + a ∈ + IdeleGroup.supportedAt + (K := K) + (S' : Set (HeightOneSpectrum (𝓞 K))) ⊔ + IdeleGroup.principalSubgroup K := by + rw [hLarge] + exact Subgroup.mem_top a + rcases Subgroup.mem_sup.mp ha with + ⟨u, hu, q, hq, huq⟩ + obtain ⟨d, hdSupported, hTpower, hdClass⟩ := + exists_supported_idele_same_class_local_powers n S' T hST hSurj u hu + have hInfinite : + ∀ w : InfinitePlace K, + IdeleGroup.infiniteComponent w d ∈ + _root_.infiniteTensorNormSubgroup + (K := K) (L := M) w := by + intro w + rw [hInfiniteTop w] + exact Subgroup.mem_top _ + have hFinite : + ∀ w : HeightOneSpectrum (𝓞 K), + IdeleGroup.finiteComponent w d ∈ + (localTensorNorm + (K := K) (L := M) w).range := by + intro w + rw [ + _root_.finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup + (K := K) (L := M) w] + by_cases hwS : w ∈ S' + · rw [ + _root_.chosenFinitePlaceLocalNormSubgroup_eq_top_of_splitsCompletely + (K := K) (L := M) w (hSplitS w hwS)] + exact Subgroup.mem_top _ + · by_cases hwT : w ∈ T + · exact hPower w (hTpower ⟨w, hwT⟩) + · have hwAway : w ∉ S' ∪ T := by + intro hw + rcases Finset.mem_union.mp hw with hw | hw + · exact hwS hw + · exact hwT hw + apply + _root_.adicCompletionIntegerUnits_le_chosenFinitePlaceLocalNormSubgroup + (K := K) (L := M) w (hAway w hwAway) + exact + (IdeleGroup.mem_supportedAt_iff + (K := K) + (S' : Set (HeightOneSpectrum (𝓞 K))) d).mp + hdSupported w (by simpa using hwS) + have hdNorm : + d ∈ (RelativeIdeleGroup.norm K M).range := + (_root_.mem_relativeIdeleNorm_range_iff_localTensorNorms + (K := K) (L := M) d).2 + ⟨hInfinite, hFinite⟩ + obtain ⟨z, hz⟩ := hdNorm + refine + ⟨QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K M) z, ?_⟩ + rw [RelativeIdeleGroup.Cohomology.ideleClassNorm_mk, hz] + change + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) d = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a + have hqOne : QuotientGroup.mk' (IdeleGroup.principalSubgroup K) q = 1 := + (QuotientGroup.eq_one_iff q).mpr hq + rw [hdClass, ← huq, map_mul, hqOne] + exact (mul_one (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) u)).symm + +private theorem unit_mem_power_range_of_ideleClassNorm_top + {K M : Type} [Field K] [NumberField K] [Field M] [NumberField M] + [Algebra K M] [FiniteDimensional K M] [IsAbelianGalois K M] + [(RelativeIdeleGroup.principalSubgroup K M).Normal] [IsCyclic Gal(M/K)] + (n : ℕ+) (b : Kˣ) (beta : Mˣ) + (hbeta : beta ^ (n : ℕ) = Units.map (algebraMap K M).toMonoidHom b) + (hNormTop : (RelativeIdeleGroup.Cohomology.ideleClassNorm K M).range = ⊤) : + b ∈ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range := by + classical + obtain ⟨sigma, hsigma⟩ := + IsCyclic.exists_generator (α := M ≃ₐ[K] M) + have hLower : + Module.finrank K M ≤ + (RelativeIdeleGroup.Cohomology.ideleClassNorm K M).range.index := + Cohomology.finrank_le_ideleClassNorm_index + (K := K) (L := M) sigma hsigma + have hDegreeLe : + Module.finrank K M ≤ 1 := by + simpa only [hNormTop, Subgroup.index_top] using hLower + have hDegree : + Module.finrank K M = 1 := + le_antisymm hDegreeLe Module.finrank_pos + have hAlgMap : + Function.Bijective (algebraMap K M) := + (Algebra.finrank_eq_one_iff_bijective_algebraMap).mp + hDegree + obtain ⟨x, hx⟩ := + hAlgMap.2 (beta : M) + have hx_ne : x ≠ 0 := by + intro hx_zero + apply beta.ne_zero + calc + (beta : M) = algebraMap K M x := hx.symm + _ = 0 := by rw [hx_zero, map_zero] + let xUnit : Kˣ := + Units.mk0 x hx_ne + apply + (MonoidHom.mem_range + (G := Kˣ)).mpr + refine ⟨xUnit, ?_⟩ + rw [powMonoidHom_apply] + apply Units.ext + apply (algebraMap K M).injective + change + algebraMap K M (x ^ (n : ℕ)) = + algebraMap K M (b : K) + calc + algebraMap K M (x ^ (n : ℕ)) = + (beta : M) ^ (n : ℕ) := by + rw [map_pow, hx] + _ = algebraMap K M (b : K) := by + simpa using congrArg Units.val hbeta + +open scoped Classical in +open _root_.KummerTheory + (chosenSimpleKummerExtension_infiniteTensorNormSubgroup_eq_top_of_mem_nthPowerSubgroup) in +/-- Equality between the power/local-unit subgroup and the everywhere-local +norm condition for the Kummer-selected prime set. Starting from an arbitrary +prescribed finite set `S`, the construction first adjoins a sufficiently large +idelic support and the support of the exponent, then performs the chosen +finite Kummer-radical enlargement before choosing `T`. -/ +theorem + principalIdelePowerLocalUnitSubgroup_eq_sUnitNthPowersInField_sUnitKummerPrimeSet + {K : Type} [Field K] [NumberField K] + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + let hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let nUnit : Kˣ := + Units.mk0 ((n : ℕ) : K) hnK + let S₀ := + (S ∪ IdeleGroup.sufficientlyLargeFiniteSet (K := K)) ∪ + chosenUnitFiniteSupport (K := K) nUnit + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S₀ + let T := + sUnitKummerPrimeSet + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S₀ + principalIdelePowerLocalUnitSubgroup (K := K) n S' T = + sUnitNthPowersInField (K := K) n (S' ∪ T) := by + classical + dsimp only + let hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let nUnit : Kˣ := + Units.mk0 ((n : ℕ) : K) hnK + let S₀ := + (S ∪ IdeleGroup.sufficientlyLargeFiniteSet (K := K)) ∪ + chosenUnitFiniteSupport (K := K) nUnit + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S₀ + let T := + sUnitKummerPrimeSet + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S₀ + let hST : Disjoint S' T := + (sUnitKummerPrimeSet_disjoint_enlargeByFiniteKummerRadicalSupport + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S₀).symm + change + principalIdelePowerLocalUnitSubgroup (K := K) n S' T = + sUnitNthPowersInField (K := K) n (S' ∪ T) + have hSurj : + Function.Surjective + (sUnitLocalUnitPowerMap (K := K) n S' T hST) := by + simpa only [S', T, hST] using + sUnitLocalUnitPowerMap_sUnitKummerPrimeSet_surjective + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S₀ + have hCanonical : + (IdeleGroup.sufficientlyLargeFiniteSet (K := K) : + Set (HeightOneSpectrum (𝓞 K))) ⊆ + (S₀ : Set (HeightOneSpectrum (𝓞 K))) := by + intro w hw + exact + Finset.mem_union_left _ + (Finset.mem_union_right _ hw) + have hS₀ : + IdeleGroup.supportedAt + (K := K) (S₀ : Set (HeightOneSpectrum (𝓞 K))) ⊔ + IdeleGroup.principalSubgroup K = + ⊤ := by + apply top_unique + rw [ + ← IdeleGroup.supportedAt_sup_principalSubgroup_eq_top + (K := K)] + exact + sup_le_sup + (IdeleGroup.supportedAt_mono + (K := K) hCanonical) + le_rfl + have hLarge : + IdeleGroup.supportedAt + (K := K) (S' : Set (HeightOneSpectrum (𝓞 K))) ⊔ + IdeleGroup.principalSubgroup K = + ⊤ := by + simpa only [S'] using + supportedAt_sup_principalSubgroup_eq_top_of_enlargeByRadicalSupport + (K := K) (L := E) n hmu S₀ hS₀ + apply le_antisymm + · intro b hb + have hbData := + (mem_idelePowerLocalUnitSubgroup_iff + (K := K) n S' T + (IdeleGroup.principalIdele K b)).mp hb + have hbSUnit : + b ∈ SUnitGroup (K := K) (S' ∪ T) := + principalIdelePowerLocalUnitSubgroup_le_sUnitGroup + (K := K) n S' T hb + let M := + KummerTheory.chosenSimpleKummerExtension K n hnK b + let : FiniteDimensional K M := + KummerTheory.chosenSimpleKummerExtension_finiteDimensional + K n hnK b + let : IsAbelianGalois K M := + KummerTheory.chosenSimpleKummerExtension_isAbelianGalois + K n hnK hmu b + let : NumberField M := + NumberField.of_module_finite K M + let : (RelativeIdeleGroup.principalSubgroup K M).Normal := + ⟨fun n hn g => by + have hconj : g * n * g⁻¹ = n := by + rw [mul_comm g n, mul_assoc, mul_inv_cancel, mul_one] + rwa [hconj]⟩ + have hSplitS : + ∀ w : HeightOneSpectrum (𝓞 K), w ∈ S' → + _root_.FinitePlaceSplitsCompletely + (K := K) (L := M) w := by + intro w hw + have hbLocal := hbData.2.1 w hw + have hprincipal : + IdeleGroup.finiteComponent w + (IdeleGroup.principalIdele K b) = + Units.map + (algebraMap K (w.adicCompletion K)).toMonoidHom b := by + apply Units.ext + rfl + rw [hprincipal] at hbLocal + simpa only [M] using + KummerTheory.chosenSimpleKummerExtension_finitePlaceSplitsCompletely_of_mem_nthPowerSubgroup + (K := K) n hnK hmu b w hbLocal + have hInfiniteTop : + ∀ w : InfinitePlace K, + _root_.infiniteTensorNormSubgroup + (K := K) (L := M) w = ⊤ := by + intro w + have hbLocal := hbData.1 w + have hprincipal : + IdeleGroup.infiniteComponent w + (IdeleGroup.principalIdele K b) = + Units.map + (algebraMap K w.Completion).toMonoidHom b := by + apply Units.ext + rfl + rw [hprincipal] at hbLocal + simpa only [M] using + chosenSimpleKummerExtension_infiniteTensorNormSubgroup_eq_top_of_mem_nthPowerSubgroup + (K := K) n hnK hmu b w hbLocal + have hAway : + ∀ w : HeightOneSpectrum (𝓞 K), w ∉ S' ∪ T → + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := M) w := by + intro w hw + have hbVal : + w.valuation K (b : K) = 1 := + (mem_SUnitGroup_iff + (K := K) (S' ∪ T) b).mp hbSUnit w hw + have hwS' : w ∉ S' := by + intro hwS' + exact hw (Finset.mem_union_left T hwS') + have hwSupport : + w ∉ chosenUnitFiniteSupport (K := K) nUnit := by + intro hwSupport + apply hwS' + exact + subset_enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S₀ + (Finset.mem_union_right _ hwSupport) + have hnUnitVal : + w.valuation K (nUnit : K) = 1 := + (mem_SUnitGroup_iff + (K := K) + (chosenUnitFiniteSupport (K := K) nUnit) nUnit).mp + (mem_sUnitGroup_chosenUnitFiniteSupport + (K := K) nUnit) + w hwSupport + have hnVal : + w.valuation K ((n : ℕ) : K) = 1 := by + change w.valuation K ((n : ℕ) : K) = 1 at hnUnitVal + exact hnUnitVal + simpa only [M] using + KummerTheory.chosenSimpleKummerExtension_chosenFinitePlaceIsUnramified_of_valuation_eq_one + (K := K) n hnK hmu b w hbVal hnVal + have hNormTop : (RelativeIdeleGroup.Cohomology.ideleClassNorm K M).range = ⊤ := + ideleClassNorm_range_eq_top_of_local_power_surjectivity + n S' T hST hSurj hLarge hSplitS hInfiniteTop hAway + (fun w => chosenSimpleKummerNthPowerSubgroup_le_chosenFinitePlaceLocalNormSubgroup + (K := K) n hnK hmu b w) + let : IsCyclic (M ≃ₐ[K] M) := by + simpa only [M] using + KummerTheory.chosenSimpleKummerExtension_isCyclic + K n hnK hmu b + let beta : Mˣ := + KummerTheory.chosenSimpleKummerRootUnit K n hnK b + have hbeta : + beta ^ (n : ℕ) = + Units.map (algebraMap K M).toMonoidHom b := by + simpa only [M, beta] using + KummerTheory.chosenSimpleKummerRootUnit_pow K n hnK b + have hbPower := unit_mem_power_range_of_ideleClassNorm_top n b beta hbeta hNormTop + exact + (mem_sUnitNthPowersInField_iff + (K := K) n (S' ∪ T) b).2 + ⟨hbSUnit, hbPower⟩ + · exact + sUnitNthPowersInField_le_principalIdelePowerLocalUnitSubgroup + (K := K) n S' T + + +end GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitSubgroup.lean new file mode 100644 index 0000000000..b1b5ba6ecd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitSubgroup.lean @@ -0,0 +1,216 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitPowerQuotient +/-! +# Power-local-unit subgroups of the idele group + +This module defines the subgroup of ideles that are local powers at selected +places and integral units elsewhere, together with its intersection with +principal ideles and the corresponding subgroup of S-unit powers. +-/ + +@[expose] public section + +open scoped NumberField NNReal IsMulCommutative +open NumberField IsDedekindDomain +open KummerTheory + +noncomputable +section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +variable {K : Type*} [Field K] [NumberField K] + +open scoped Classical in +/-- Ideles that are local `n`-th powers at the prescribed places and +integral units away from `S ∪ T`. -/ +def idelePowerLocalUnitSubgroup + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + Subgroup (IdeleGroup K) := + (⨅ w : InfinitePlace K, + ((powMonoidHom (n : ℕ) : + w.Completionˣ →* w.Completionˣ).range).comap + (IdeleGroup.infiniteComponent w)) ⊓ + (⨅ v : HeightOneSpectrum (𝓞 K), + ⨅ (_ : v ∈ S), + (powMonoidHom (n : ℕ) : + (v.adicCompletion K)ˣ →* + (v.adicCompletion K)ˣ).range.comap + (IdeleGroup.finiteComponent v)) ⊓ + (⨅ v : HeightOneSpectrum (𝓞 K), + ⨅ (_ : v ∉ S ∪ T), + (v.adicCompletionIntegers K).units.comap + (IdeleGroup.finiteComponent v)) + +open scoped Classical in +/-- Membership in `idelePowerLocalUnitSubgroup` expressed componentwise. -/ +theorem mem_idelePowerLocalUnitSubgroup_iff + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) + (a : IdeleGroup K) : + a ∈ idelePowerLocalUnitSubgroup (K := K) n S T ↔ + (∀ w : InfinitePlace K, + IdeleGroup.infiniteComponent w a ∈ + (powMonoidHom (n : ℕ) : + w.Completionˣ →* w.Completionˣ).range) ∧ + (∀ v : HeightOneSpectrum (𝓞 K), v ∈ S → + IdeleGroup.finiteComponent v a ∈ + (powMonoidHom (n : ℕ) : + (v.adicCompletion K)ˣ →* + (v.adicCompletion K)ˣ).range) ∧ + (∀ v : HeightOneSpectrum (𝓞 K), v ∉ S ∪ T → + IdeleGroup.finiteComponent v a ∈ + (v.adicCompletionIntegers K).units) := by + simp only [idelePowerLocalUnitSubgroup, Subgroup.mem_inf, + Subgroup.mem_iInf, Subgroup.mem_comap, and_assoc] + +open scoped Classical in +/-- Field units whose principal ideles lie in the local power-unit +subgroup. -/ +def principalIdelePowerLocalUnitSubgroup + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + Subgroup Kˣ := + (idelePowerLocalUnitSubgroup (K := K) n S T).comap + (IdeleGroup.principalIdele K) + +open scoped Classical in +/-- The subgroup of field units obtained as `n`-th powers of `U`-units. -/ +def sUnitNthPowersInField + (n : ℕ+) + (U : Finset (HeightOneSpectrum (𝓞 K))) : + Subgroup Kˣ := + ((powMonoidHom (n : ℕ) : + SUnitGroup (K := K) U →* + SUnitGroup (K := K) U).range).map + (SUnitGroup (K := K) U).subtype + +open scoped Classical in +/-- A field unit is an `n`-th power of an `U`-unit exactly when it is +simultaneously an `U`-unit and an `n`-th power in the field. The reverse +direction uses the valuation-theoretic saturation of `SUnitGroup`. -/ +theorem mem_sUnitNthPowersInField_iff + (n : ℕ+) + (U : Finset (HeightOneSpectrum (𝓞 K))) + (x : Kˣ) : + x ∈ sUnitNthPowersInField (K := K) n U ↔ + x ∈ SUnitGroup (K := K) U ∧ + x ∈ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range := by + constructor + · rintro ⟨y, hy, rfl⟩ + refine ⟨y.property, ?_⟩ + obtain ⟨z, hz⟩ := + (MonoidHom.mem_range + (G := SUnitGroup (K := K) U)).mp hy + rw [powMonoidHom_apply] at hz + subst y + exact + (MonoidHom.mem_range + (G := Kˣ)).mpr ⟨(z : Kˣ), by + rw [powMonoidHom_apply] + rfl⟩ + · rintro ⟨hxU, hxPow⟩ + obtain ⟨z, hz⟩ := + (MonoidHom.mem_range + (G := Kˣ)).mp hxPow + rw [powMonoidHom_apply] at hz + subst x + have hzU : z ∈ SUnitGroup (K := K) U := + mem_sUnitGroup_of_pow_mem (K := K) U n z hxU + let zU : SUnitGroup (K := K) U := ⟨z, hzU⟩ + refine ⟨zU ^ (n : ℕ), ?_, ?_⟩ + · exact + (MonoidHom.mem_range + (G := SUnitGroup (K := K) U)).mpr + ⟨zU, by rw [powMonoidHom_apply]⟩ + · simp [zU] + +open scoped Classical in +/-- An `n`-th power of an `(S ∪ T)`-unit satisfies all local +power-unit conditions. -/ +theorem sUnitNthPowersInField_le_principalIdelePowerLocalUnitSubgroup + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + sUnitNthPowersInField (K := K) n (S ∪ T) ≤ + principalIdelePowerLocalUnitSubgroup (K := K) n S T := by + intro y hy + obtain ⟨z, hz, rfl⟩ := hy + obtain ⟨x, hx⟩ := + (MonoidHom.mem_range + (G := SUnitGroup (K := K) (S ∪ T))).mp hz + rw [powMonoidHom_apply] at hx + subst z + rw [principalIdelePowerLocalUnitSubgroup, + Subgroup.mem_comap, + mem_idelePowerLocalUnitSubgroup_iff] + refine ⟨?_, ?_, ?_⟩ + · intro w + apply + (MonoidHom.mem_range + (G := w.Completionˣ)).mpr + refine + ⟨IdeleGroup.infiniteComponent w + (IdeleGroup.principalIdele K (x : Kˣ)), ?_⟩ + simp only [powMonoidHom_apply, map_pow] + have hxcoe : + (SUnitGroup (K := K) (S ∪ T)).subtype x = (x : Kˣ) := + rfl + rw [hxcoe] + · intro v _ + apply + (MonoidHom.mem_range + (G := (v.adicCompletion K)ˣ)).mpr + refine + ⟨IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele K (x : Kˣ)), ?_⟩ + simp only [powMonoidHom_apply, map_pow] + have hxcoe : + (SUnitGroup (K := K) (S ∪ T)).subtype x = (x : Kˣ) := + rfl + rw [hxcoe] + · intro v hv + have hxUnit : + v.valuation K ((x : Kˣ) : K) = 1 := + (mem_SUnitGroup_iff (K := K) (S ∪ T) x).mp x.2 v hv + rw [HeightOneSpectrum.adicCompletionIntegers.mem_units_iff_valued_eq_one] + rw [IdeleGroup.finiteComponent_principalIdele, + HeightOneSpectrum.valuedAdicCompletion_eq_valuation'] + have hxcoe : + (SUnitGroup (K := K) (S ∪ T)).subtype x = (x : Kˣ) := + rfl + rw [map_pow, hxcoe] + change + v.valuation K (((x : Kˣ) : K) ^ (n : ℕ)) = 1 + rw [map_pow, hxUnit, one_pow] + +open scoped Classical in +/-- A principal idele satisfying the local power-unit conditions comes +from an `(S ∪ T)`-unit. -/ +theorem principalIdelePowerLocalUnitSubgroup_le_sUnitGroup + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + principalIdelePowerLocalUnitSubgroup (K := K) n S T ≤ + SUnitGroup (K := K) (S ∪ T) := by + intro y hy + rw [mem_SUnitGroup_iff] + intro v hv + have hAway := + ((mem_idelePowerLocalUnitSubgroup_iff + (K := K) n S T + (IdeleGroup.principalIdele K y)).mp hy).2.2 v hv + rw [HeightOneSpectrum.adicCompletionIntegers.mem_units_iff_valued_eq_one] + at hAway + rw [IdeleGroup.finiteComponent_principalIdele, + HeightOneSpectrum.valuedAdicCompletion_eq_valuation'] at hAway + exact hAway + +end GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/KummerLocalNormContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/KummerLocalNormContainment.lean new file mode 100644 index 0000000000..6d54c95d04 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/KummerLocalNormContainment.lean @@ -0,0 +1,240 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SimpleExtensionLocalBehavior +/-! +# Local norm containment for Kummer extensions + +This module proves that local powers, and then the concrete simple-Kummer +power subgroup, lie in the norm subgroup at a chosen finite place. +-/ + +@[expose] public section + +open scoped NumberField NNReal IsMulCommutative +open NumberField IsDedekindDomain +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open KummerTheory +open LocalFieldTheory + +noncomputable +section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +variable {K : Type*} [Field K] [NumberField K] + +omit [NumberField K] in +open scoped Classical in +/-- Coordinates in `(Z/nZ)^r` show that every Galois automorphism has +exponent dividing `n`. -/ +theorem galois_pow_eq_one_of_field_equiv_pi_zmod + {L : Type*} [Field L] [Algebra K L] + (n : ℕ+) (r : ℕ) + (eG : + (L ≃ₐ[K] L) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) : + ∀ sigma : L ≃ₐ[K] L, sigma ^ (n : ℕ) = 1 := by + intro sigma + apply eG.injective + rw [map_pow, map_one] + ext i + apply Multiplicative.toAdd.injective + change (n : ℕ) • Multiplicative.toAdd (eG sigma i) = 0 + simp + +open scoped Classical in +/-- Local `n`-th powers are norms from the chosen finite-place +completion when every global Galois automorphism has exponent dividing +`n`. This is the shared local-field core used by the coordinate and +simple-Kummer wrappers below. -/ +private theorem + nthPowerSubgroup_le_chosenFinitePlaceLocalNormSubgroup_of_galois_pow_eq_one + {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (n : ℕ+) + (hGlobal : + ∀ sigma : L ≃ₐ[K] L, + sigma ^ (n : ℕ) = 1) + (v : HeightOneSpectrum (𝓞 K)) : + (powMonoidHom (n : ℕ) : + (v.adicCompletion K)ˣ →* + (v.adicCompletion K)ˣ).range ≤ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := by + let vK := + NumberField.HeightOneSpectrum.adicAbv K v + let w := _root_.chosenFinitePlaceExtension (L := L) v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let := + LocalClassFieldTheory.localizedCompletionGlobalAlgebra vK w + let := + LocalClassFieldTheory.localizedCompletionIsScalarTower vK w + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let : FiniteDimensional vK.Completion E := + AlgebraicNumberTheory.Valuations.localizedCompletionModuleFinite vK hvK w + let : IsGalois vK.Completion E := + HilbertRamification.algebraicLocalization_isGalois vK w + let : NontriviallyNormedField vK.Completion := + absoluteValueExtensionCompletionNontriviallyNormedField + vK hvK + let : LocallyCompactSpace vK.Completion := + AbsoluteValue.Completion.locallyCompactSpace + (_root_.finitePlaceCompletionBaseMap_isometry v) + let : IsUltrametricDist vK.Completion := + IsUltrametricDist.isUltrametricDist_of_isNonarchimedean_norm + (AbsoluteValue.completionAbsoluteValue_isNonarchimedean + vK + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv + K v)) + let : Valued vK.Completion ℝ≥0 := + NormedField.toValued + let vC : Valuation vK.Completion ℝ≥0 := Valued.v + let : vC.IsNontrivial := + (inferInstance : + (NormedField.valuation + (K := vK.Completion)).IsNontrivial) + let : ValuativeRel vK.Completion := + ValuativeRel.ofValuation vC + let : vC.Compatible := + Valuation.Compatible.ofValuation vC + let : ValuativeRel.IsNontrivial vK.Completion := + (ValuativeRel.isNontrivial_iff_isNontrivial vC).2 + inferInstance + let : IsValuativeTopology vK.Completion := + isValuativeTopology_of_valued_ofValuation + vK.Completion ℝ≥0 + let : IsNonarchimedeanLocalField vK.Completion := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + let eLocal : + absoluteValueDecompositionGroup K w.1 ≃* + (E ≃ₐ[vK.Completion] E) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w + have hLocal : + ∀ tau : E ≃ₐ[vK.Completion] E, + tau ^ (n : ℕ) = 1 := by + intro tau + apply eLocal.symm.injective + rw [map_pow, map_one] + apply Subtype.ext + exact hGlobal (eLocal.symm tau).1 + have hAbelianized : + ∀ a : Abelianization (E ≃ₐ[vK.Completion] E), + a ^ (n : ℕ) = 1 := by + intro a + refine QuotientGroup.induction_on a ?_ + intro tau + change (Abelianization.of tau) ^ (n : ℕ) = 1 + rw [← map_pow, hLocal tau, map_one] + intro x hx + obtain ⟨y, hy⟩ := + (MonoidHom.mem_range + (G := (v.adicCompletion K)ˣ)).mp hx + rw [powMonoidHom_apply] at hy + subst x + let e : + vK.Completionˣ ≃ₜ* (v.adicCompletion K)ˣ := + _root_.finitePlaceCompletionUnitsContinuousMulEquiv v + change + y ^ (n : ℕ) ∈ + (localNormSubgroup + vK.Completion E).map e.toMonoidHom + refine ⟨(e.symm y) ^ (n : ℕ), ?_, ?_⟩ + · rw [← LocalClassFieldTheory.localArtinMonoidHom_ker] + change + LocalClassFieldTheory.localArtinMonoidHom + vK.Completion E ((e.symm y) ^ (n : ℕ)) = 1 + rw [map_pow] + exact hAbelianized + (LocalClassFieldTheory.localArtinMonoidHom + vK.Completion E (e.symm y)) + · change e ((e.symm y) ^ (n : ℕ)) = y ^ (n : ℕ) + rw [map_pow, e.apply_symm_apply] + +open scoped Classical in +/-- Local `n`-th powers are norms from the chosen finite-place +completion when the global Galois group has exponent dividing `n`. -/ +theorem nthPowerSubgroup_le_chosenFinitePlaceLocalNormSubgroup + {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (n : ℕ+) (r : ℕ) + (eG : + (L ≃ₐ[K] L) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (v : HeightOneSpectrum (𝓞 K)) : + (powMonoidHom (n : ℕ) : + (v.adicCompletion K)ˣ →* + (v.adicCompletion K)ˣ).range ≤ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := by + exact + nthPowerSubgroup_le_chosenFinitePlaceLocalNormSubgroup_of_galois_pow_eq_one + (K := K) (L := L) n + (galois_pow_eq_one_of_field_equiv_pi_zmod n r eG) v + +open scoped Classical in +/-- For the actual simple Kummer extension `K(ⁿ√b)/K`, every local +`n`-th power is a norm at every finite place. The exponent input is +produced by the concrete Kummer character, rather than supplied as a +hypothesis. -/ +theorem chosenSimpleKummerNthPowerSubgroup_le_chosenFinitePlaceLocalNormSubgroup + {K : Type} [Field K] [NumberField K] + (n : ℕ+) + (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (b : Kˣ) + (v : HeightOneSpectrum (𝓞 K)) : + let E := + KummerTheory.chosenSimpleKummerExtension K n hnK b + letI : FiniteDimensional K E := + KummerTheory.chosenSimpleKummerExtension_finiteDimensional + K n hnK b + letI : IsAbelianGalois K E := + KummerTheory.chosenSimpleKummerExtension_isAbelianGalois + K n hnK hmu b + (powMonoidHom (n : ℕ) : + (v.adicCompletion K)ˣ →* + (v.adicCompletion K)ˣ).range ≤ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := E) v := by + let E := + KummerTheory.chosenSimpleKummerExtension K n hnK b + let : FiniteDimensional K E := + KummerTheory.chosenSimpleKummerExtension_finiteDimensional + K n hnK b + let : IsAbelianGalois K E := + KummerTheory.chosenSimpleKummerExtension_isAbelianGalois + K n hnK hmu b + exact + nthPowerSubgroup_le_chosenFinitePlaceLocalNormSubgroup_of_galois_pow_eq_one + (K := K) (L := E) n + (KummerTheory.chosenSimpleKummerExtension_galois_pow_eq_one + K n hnK hmu b) v + + +end GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/MathlibNormInterface.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/MathlibNormInterface.lean new file mode 100644 index 0000000000..55eb72a150 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/MathlibNormInterface.lean @@ -0,0 +1,209 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.HasseNormPrinciple +/-! +# Mathlib-facing Hasse norm theorem + +This module translates the idele-theoretic implementation of the cyclic +Hasse norm theorem into the implementation-independent predicates in +`ClassFieldTheory.Definitions.NormTheorems`. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +private theorem isFieldNorm_iff_mem_globalFieldNormSubgroup + (K L : Type) + [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] + (x : Kˣ) : + ClassFieldTheory.IsFieldNorm K L x ↔ + x ∈ GlobalClassFieldTheory.ClassFieldAxiom.globalFieldNormSubgroup K L := by + change x ∈ (ClassFieldTheory.fieldNormHom K L).range ↔ + x ∈ (Units.map (Algebra.norm K)).range + rfl + +private theorem isNormAtFinitePlace_iff + (K L : Type) + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (w : HeightOneSpectrum (𝓞 K)) (x : Kˣ) : + ClassFieldTheory.IsNormAtFinitePlace K L w x ↔ + IdeleGroup.finiteComponent w (IdeleGroup.principalIdele K x) ∈ + chosenFinitePlaceLocalNormSubgroup (K := K) (L := L) w := by + rw [← finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup + (K := K) (L := L) w] + constructor + · rintro ⟨y, hy⟩ + refine ⟨y, ?_⟩ + apply Units.ext + calc + Algebra.norm (w.adicCompletion K) + (y : w.adicCompletion K ⊗[K] L) = + algebraMap K (w.adicCompletion K) (x : K) := hy + _ = (IdeleGroup.finiteComponent w + (IdeleGroup.principalIdele K x) : w.adicCompletion K) := + (IdeleGroup.finiteComponent_principalIdele x w).symm + · rintro ⟨y, hy⟩ + refine ⟨y, ?_⟩ + calc + Algebra.norm (w.adicCompletion K) + (y : w.adicCompletion K ⊗[K] L) = + (IdeleGroup.finiteComponent w + (IdeleGroup.principalIdele K x) : w.adicCompletion K) := + congrArg Units.val hy + _ = algebraMap K (w.adicCompletion K) (x : K) := + IdeleGroup.finiteComponent_principalIdele x w + +private theorem isNormAtInfinitePlace_iff + (K L : Type) + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] + (w : InfinitePlace K) (x : Kˣ) : + ClassFieldTheory.IsNormAtInfinitePlace K L w x ↔ + IdeleGroup.infiniteComponent w (IdeleGroup.principalIdele K x) ∈ + (Units.map + (Algebra.norm w.Completion : + (w.Completion ⊗[K] L) →* w.Completion)).range := by + constructor + · rintro ⟨y, hy⟩ + refine ⟨y, ?_⟩ + apply Units.ext + calc + Algebra.norm w.Completion (y : w.Completion ⊗[K] L) = + algebraMap K w.Completion (x : K) := hy + _ = (IdeleGroup.infiniteComponent w + (IdeleGroup.principalIdele K x) : w.Completion) := + (IdeleGroup.infiniteComponent_principalIdele x w).symm + · rintro ⟨y, hy⟩ + refine ⟨y, ?_⟩ + calc + Algebra.norm w.Completion (y : w.Completion ⊗[K] L) = + (IdeleGroup.infiniteComponent w + (IdeleGroup.principalIdele K x) : w.Completion) := + congrArg Units.val hy + _ = algebraMap K w.Completion (x : K) := + IdeleGroup.infiniteComponent_principalIdele x w + +private theorem isEverywhereLocalNorm_iff_mem_everywhereLocalFieldNormSubgroup + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (x : Kˣ) : + ClassFieldTheory.IsEverywhereLocalNorm K L x ↔ + x ∈ GlobalClassFieldTheory.ClassFieldAxiom.everywhereLocalFieldNormSubgroup K L := by + constructor + · rintro ⟨hfinite, hinfinite⟩ + change IdeleGroup.principalIdele K x ∈ + GlobalClassFieldTheory.ClassFieldAxiom.allPlaceLocalNormCondition + (K := K) (L := L) + constructor + · rw [GlobalClassFieldTheory.ClassFieldAxiom.allFinitePlaceLocalNormCondition] + apply Subgroup.mem_iInf.mpr + intro w + exact (isNormAtFinitePlace_iff K L w x).mp (hfinite w) + · rw [GlobalClassFieldTheory.ClassFieldAxiom.allInfinitePlaceLocalNormCondition] + apply Subgroup.mem_iInf.mpr + intro w + exact (isNormAtInfinitePlace_iff K L w x).mp (hinfinite w) + · intro hx + change IdeleGroup.principalIdele K x ∈ + GlobalClassFieldTheory.ClassFieldAxiom.allPlaceLocalNormCondition + (K := K) (L := L) at hx + constructor + · intro w + apply (isNormAtFinitePlace_iff K L w x).mpr + exact Subgroup.mem_iInf.mp + (show IdeleGroup.principalIdele K x ∈ + GlobalClassFieldTheory.ClassFieldAxiom.allFinitePlaceLocalNormCondition + (K := K) (L := L) from hx.1) w + · intro w + apply (isNormAtInfinitePlace_iff K L w x).mpr + exact Subgroup.mem_iInf.mp + (show IdeleGroup.principalIdele K x ∈ + GlobalClassFieldTheory.ClassFieldAxiom.allInfinitePlaceLocalNormCondition + (K := K) (L := L) from hx.2) w + +private theorem norm_includeRight + (K L A : Type) + [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] + [CommRing A] [Algebra K A] + (y : L) : + Algebra.norm A + (Algebra.TensorProduct.includeRight (R := K) (A := A) (B := L) y) = + algebraMap K A (Algebra.norm K y) := by + classical + let b := Module.Free.chooseBasis K L + let bA := b.baseChange A + rw [Algebra.norm_eq_matrix_det bA, + Algebra.norm_eq_matrix_det b, (algebraMap K A).map_det] + congr 1 + ext i j + simp [bA, b, Algebra.TensorProduct.includeRight, + Algebra.smul_def, Algebra.leftMulMatrix_eq_repr_mul, + Algebra.TensorProduct.tmul_mul_tmul] + +/-- A global determinant norm remains a determinant norm after scalar +extension to any completion. No Galois hypothesis is needed. -/ +theorem globalNorm_isEverywhereLocalNorm + (K L : Type) + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] + (x : Kˣ) : + ClassFieldTheory.IsFieldNorm K L x → + ClassFieldTheory.IsEverywhereLocalNorm K L x := by + rintro ⟨y, rfl⟩ + constructor + · intro w + refine ⟨Units.map + (Algebra.TensorProduct.includeRight + (R := K) (A := w.adicCompletion K) (B := L)).toRingHom y, ?_⟩ + change Algebra.norm (w.adicCompletion K) + (Algebra.TensorProduct.includeRight + (R := K) (A := w.adicCompletion K) (B := L) (y : L)) = + algebraMap K (w.adicCompletion K) (Algebra.norm K (y : L)) + exact norm_includeRight K L (w.adicCompletion K) y + · intro w + refine ⟨Units.map + (Algebra.TensorProduct.includeRight + (R := K) (A := w.Completion) (B := L)).toRingHom y, ?_⟩ + change Algebra.norm w.Completion + (Algebra.TensorProduct.includeRight + (R := K) (A := w.Completion) (B := L) (y : L)) = + algebraMap K w.Completion (Algebra.norm K (y : L)) + exact norm_includeRight K L w.Completion y + +/-- Implementation bridge for Hasse's norm theorem for finite cyclic +extensions. -/ +theorem cyclicHasseNormTheorem + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [IsCyclic (L ≃ₐ[K] L)] + (x : Kˣ) : + ClassFieldTheory.IsFieldNorm K L x ↔ + ClassFieldTheory.IsEverywhereLocalNorm K L x := by + rw [isFieldNorm_iff_mem_globalFieldNormSubgroup, + isEverywhereLocalNorm_iff_mem_everywhereLocalFieldNormSubgroup, + GlobalClassFieldTheory.ClassFieldAxiom.hasseNormPrinciple_cyclic K L] + +end GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection.lean new file mode 100644 index 0000000000..a54b70954f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection.lean @@ -0,0 +1,19 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.BasePlaceSelection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.Conclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.CoordinatePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.DecompositionFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.FinitePlaceDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.PrimeSet +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.RestrictionKernel + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/All.lean new file mode 100644 index 0000000000..de4afd9a65 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/All.lean @@ -0,0 +1,23 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.BasePlaceSelection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.Conclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.CoordinatePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.DecompositionFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.FinitePlaceDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.PrimeSet +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.RestrictionKernel +/-! +# S-unit Kummer prime selection + +This aggregate module exposes the restriction-kernel construction, prime +selection, decomposition-field identifications, and the final local-power +kernel theorem. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/BasePlaceSelection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/BasePlaceSelection.lean new file mode 100644 index 0000000000..a745247674 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/BasePlaceSelection.lean @@ -0,0 +1,487 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Combinatorics.Hall.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.RestrictionKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CyclicPrimePowerFullDecomposition +/-! +# Base-place selection for S-unit Kummer extensions + +This file constructs infinite full-decomposition candidate sets and chooses +pairwise distinct base places outside the finite avoidance set. Distinctness +is obtained from Mathlib's Hall marriage theorem. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative +open NumberField IsDedekindDomain +open KummerTheory + +noncomputable +section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +section FinitePlaces + +variable {K : Type} [Field K] + [NumberField K] + +open scoped Classical in +/-- Base finite places lying below a full-decomposition place for the +cyclic coordinate extension `N/N_i`. -/ +noncomputable def sUnitKummerCoordinateBasePlaceCandidates + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (i : Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S)) : + Set (HeightOneSpectrum (𝓞 K)) := by + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + have hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + letI : FiniteDimensional K N := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S' + let Ni := + enlargedSUnitKummerCyclicFixedField + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S + (sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) + letI : NumberField Ni := + NumberField.of_module_finite K Ni + let _ : IsGalois Ni N := + enlargedSUnitKummerCyclicFixedField_isGalois + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S + (sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) + exact + {w | ∃ q : HeightOneSpectrum (𝓞 Ni), + _root_.finitePlaceBelow (K := K) q = w ∧ + _root_.finitePlaceDecompositionGroup + (K := Ni) (L := N) q = ⊤} + +open scoped Classical in +/-- Each cyclic coordinate extension supplies infinitely many base +finite places below completely decomposed places. -/ +theorem sUnitKummerCoordinateBasePlaceCandidates_infinite + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (i : Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S)) : + (sUnitKummerCoordinateBasePlaceCandidates + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i).Infinite := by + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + have hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let : FiniteDimensional K N := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S' + let : NumberField N := + NumberField.of_module_finite K N + let Ni := + sUnitKummerCoordinateFixedField + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i + let : NumberField Ni := + NumberField.of_module_finite K Ni + let : IsGalois Ni N := + enlargedSUnitKummerCyclicFixedField_isGalois + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S + (sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) + let : IsCyclic (N ≃ₐ[Ni] N) := + enlargedSUnitKummerCyclicFixedField_isCyclic + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S + (sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) + have hdegree : Module.finrank Ni N = (n : ℕ) := by + simpa only [Ni, N, S'] using + sUnitKummerCoordinateFixedField_finrank + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i + have hcard : Nat.card (N ≃ₐ[Ni] N) = p ^ v := by + calc + Nat.card (N ≃ₐ[Ni] N) = Module.finrank Ni N := + IsGalois.card_aut_eq_finrank Ni N + _ = (n : ℕ) := hdegree + _ = p ^ v := hn + have hfull := + Cohomology.cyclic_prime_power_infinite_fullDecompositionPlaces + (K := Ni) (L := N) hp hv hcard + intro hfinite + have hpre := + _root_.Set.Finite.preimage_finitePlaceBelow + (K := K) (L := Ni) hfinite + apply hfull + apply hpre.subset + intro q hq + change _root_.finitePlaceBelow (K := K) q ∈ + sUnitKummerCoordinateBasePlaceCandidates + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i + change ∃ q' : HeightOneSpectrum (𝓞 Ni), + _root_.finitePlaceBelow (K := K) q' = + _root_.finitePlaceBelow (K := K) q ∧ + _root_.finitePlaceDecompositionGroup + (K := Ni) (L := N) q' = ⊤ + exact ⟨q, rfl, hq⟩ + +open scoped Classical in +/-- The finite set avoided in the prime choice: the enlarged support, +all base primes ramified in the full Kummer extension, and the support of +the exponent `n`. -/ +noncomputable def sUnitKummerAvoidedBasePlaces + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Finset (HeightOneSpectrum (𝓞 K)) := by + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + have hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + letI : FiniteDimensional K N := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S' + letI : IsGalois K N := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S' + letI : NumberField N := + NumberField.of_module_finite K N + exact + (S' ∪ + _root_.ramifiedBaseFinitePlaces + (K := K) (L := N)) ∪ + chosenUnitFiniteSupport (K := K) + (Units.mk0 ((n : ℕ) : K) hnK) + +open scoped Classical in +/-- The enlarged support is contained in the finite avoidance set. -/ +theorem + enlargeByFiniteKummerRadicalSupport_subset_sUnitKummerAvoidedBasePlaces + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S ⊆ + sUnitKummerAvoidedBasePlaces + (K := K) (Omega := Omega) E n hmu S := by + unfold sUnitKummerAvoidedBasePlaces + dsimp only + intro w hw + exact + Finset.mem_union_left _ + (Finset.mem_union_left _ hw) + +open scoped Classical in +/-- Simultaneously choose distinct full-decomposition candidates outside +the enlarged support, the ramified primes of `N/K`, and the support of `n`. -/ +theorem exists_sUnitKummerChosenBasePlaces + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + ∃ f : + Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S) → + HeightOneSpectrum (𝓞 K), + Function.Injective f ∧ + ∀ i, + f i ∈ + sUnitKummerCoordinateBasePlaceCandidates + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i ∧ + f i ∉ + sUnitKummerAvoidedBasePlaces + (K := K) (Omega := Omega) E n hmu S := by + let q := + sUnitKummerPrimeCount + (K := K) E n hmu r S + let A : + Fin q → Set (HeightOneSpectrum (𝓞 K)) := + fun i => + sUnitKummerCoordinateBasePlaceCandidates + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i \ + (sUnitKummerAvoidedBasePlaces + (K := K) (Omega := Omega) E n hmu S : Set _) + have hA : ∀ i, (A i).Infinite := by + intro i + exact + (sUnitKummerCoordinateBasePlaceCandidates_infinite + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i).sdiff + (sUnitKummerAvoidedBasePlaces + (K := K) (Omega := Omega) E n hmu S).finite_toSet + classical + choose B hBsub hBcard using + fun i => (hA i).exists_subset_card_eq q + have hHall : + ∀ t : Finset (Fin q), + t.card ≤ (t.biUnion B).card := by + intro t + by_cases ht : t.Nonempty + · obtain ⟨i, hi⟩ := ht + calc + t.card ≤ q := by + simpa using t.card_le_univ + _ = (B i).card := (hBcard i).symm + _ ≤ (t.biUnion B).card := + Finset.card_le_card + (Finset.subset_biUnion_of_mem B hi) + · simp [Finset.not_nonempty_iff_eq_empty.mp ht] + obtain ⟨f, hf, hfB⟩ := + (Finset.all_card_le_biUnion_card_iff_existsInjective' B).mp + hHall + refine ⟨f, hf, ?_⟩ + intro i + exact hBsub i (hfB i) + +open scoped Classical in +/-- The chosen ordered family of base primes. -/ +noncomputable def sUnitKummerChosenBasePlaces + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S) → + HeightOneSpectrum (𝓞 K) := + Classical.choose + (exists_sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S) + +open scoped Classical in +/-- The chosen base primes are pairwise distinct. -/ +theorem sUnitKummerChosenBasePlaces_injective + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Function.Injective + (sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S) := + (Classical.choose_spec + (exists_sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S)).1 + +open scoped Classical in +/-- Each chosen base prime lies below a completely decomposed place in +its coordinate fixed field. -/ +theorem + sUnitKummerChosenBasePlaces_mem_coordinateBasePlaceCandidates + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (i : Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S)) : + sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i ∈ + sUnitKummerCoordinateBasePlaceCandidates + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i := + ((Classical.choose_spec + (exists_sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S)).2 i).1 + +open scoped Classical in +/-- Every chosen base prime avoids the enlarged support, the ramified +primes of the full Kummer extension, and the support of `n`. -/ +theorem sUnitKummerChosenBasePlaces_not_mem_avoided + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (i : Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S)) : + sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i ∉ + sUnitKummerAvoidedBasePlaces + (K := K) (Omega := Omega) E n hmu S := + ((Classical.choose_spec + (exists_sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S)).2 i).2 + +open scoped Classical in +/-- The exponent `n` is a unit at every chosen base prime. -/ +theorem sUnitKummerChosenBasePlaces_valuation_natCast_eq_one + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (i : Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S)) : + (sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i).valuation K + ((n : ℕ) : K) = + 1 := by + have hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let nUnit : Kˣ := + Units.mk0 ((n : ℕ) : K) hnK + have hnotSupport : + sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i ∉ + chosenUnitFiniteSupport (K := K) nUnit := by + intro hmem + apply + sUnitKummerChosenBasePlaces_not_mem_avoided + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i + unfold sUnitKummerAvoidedBasePlaces + dsimp only + exact Finset.mem_union_right _ hmem + have hunit := + (mem_SUnitGroup_iff + (K := K) (chosenUnitFiniteSupport (K := K) nUnit) nUnit).mp + (mem_sUnitGroup_chosenUnitFiniteSupport (K := K) nUnit) + (sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) + hnotSupport + simpa [nUnit] using hunit + +end FinitePlaces + +end GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/Conclusion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/Conclusion.lean new file mode 100644 index 0000000000..41feee1439 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/Conclusion.lean @@ -0,0 +1,355 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.DecompositionFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.FinitePlaceDecomposition +/-! +# The conclusion of S-unit Kummer prime selection + +This file proves that the selected local power conditions cut out exactly +the finite Kummer radical and records the support-enlargement consequence +used by the global reciprocity argument. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative +open NumberField IsDedekindDomain +open KummerTheory + +noncomputable +section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +section FinitePlaces + +variable {K : Type} [Field K] + [NumberField K] + +omit [NumberField K] in +private theorem mem_fixedField_of_subgroup_generators + {L : Type*} [Field L] [Algebra K L] {ι : Type*} + (R : Subgroup Gal(L/K)) (g : ι → R) + (hgen : (⨆ i, Subgroup.zpowers (g i)) = ⊤) (x : L) + (hx : ∀ i, x ∈ IntermediateField.fixedField (Subgroup.zpowers (g i).1)) : + x ∈ IntermediateField.fixedField R := by + let H := MulAction.stabilizer R x + have htop : H = ⊤ := by + apply top_unique + rw [← hgen] + refine iSup_le fun i => Subgroup.zpowers_le.mpr ?_ + have hi := hx i + rw [IntermediateField.mem_fixedField_iff] at hi + have hfix := hi (g i).1 (Subgroup.mem_zpowers (g i).1) + exact MulAction.mem_stabilizer_iff.mpr hfix + rw [IntermediateField.mem_fixedField_iff] + intro σ hσ + have hmem : (⟨σ, hσ⟩ : R) ∈ H := htop ▸ Subgroup.mem_top _ + exact MulAction.mem_stabilizer_iff.mp hmem + +omit [NumberField K] in +private theorem exists_unit_root_of_mem_algebraMap_range + {E N : Type*} [Field E] [Field N] [Algebra K E] [Algebra K N] + [Algebra E N] [IsScalarTower K E N] + (n : ℕ) (x : Kˣ) (beta : Nˣ) + (hbeta : beta ^ n = Units.map (algebraMap K N).toMonoidHom x) + (hrange : (beta : N) ∈ Set.range (algebraMap E N)) : + ∃ gamma : Eˣ, gamma ^ n = Units.map (algebraMap K E).toMonoidHom x := by + obtain ⟨gamma, hgamma⟩ := hrange + have hgamma_ne : gamma ≠ 0 := by + intro hzero + apply beta.ne_zero + rw [← hgamma, hzero, map_zero] + refine ⟨Units.mk0 gamma hgamma_ne, ?_⟩ + apply Units.ext + apply (algebraMap E N).injective + change algebraMap E N (gamma ^ n) = algebraMap E N (algebraMap K E (x : K)) + rw [map_pow, hgamma, ← IsScalarTower.algebraMap_apply K E N] + exact congrArg Units.val hbeta + +omit [NumberField K] in +private theorem unit_root_map_tower + {E N : Type*} [Field E] [Field N] [Algebra K E] [Algebra K N] + [Algebra E N] [IsScalarTower K E N] + (n : ℕ) (x : Kˣ) (beta : Eˣ) + (hbeta : beta ^ n = Units.map (algebraMap K E).toMonoidHom x) : + (Units.map (algebraMap E N).toMonoidHom beta) ^ n = + Units.map (algebraMap K N).toMonoidHom x := by + rw [← map_pow, hbeta] + apply Units.ext + exact (IsScalarTower.algebraMap_apply K E N (x : K)).symm + +open scoped Classical in +private theorem local_power_iff_coordinate_fixedField + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + let S' := enlargeByFiniteKummerRadicalSupport (K := K) (L := E) n hmu S + let N := fullSUnitKummerExtension (K := K) (Omega := Omega) n S' + ∀ (i : Fin (sUnitKummerPrimeCount (K := K) E n hmu r S)) (x : Kˣ) (beta : Nˣ), + beta ^ (n : ℕ) = Units.map (algebraMap K N).toMonoidHom x → + let wi := sUnitKummerChosenBasePlaces (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i + Units.map (algebraMap K (wi.adicCompletion K)).toMonoidHom x ∈ + (powMonoidHom (n : ℕ) : (wi.adicCompletion K)ˣ →* (wi.adicCompletion K)ˣ).range ↔ + (beta : N) ∈ sUnitKummerCoordinateFixedField (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i := by + dsimp only + let S' := enlargeByFiniteKummerRadicalSupport (K := K) (L := E) n hmu S + let N := fullSUnitKummerExtension (K := K) (Omega := Omega) n S' + have hnK : ((n : ℕ) : K) ≠ 0 := by exact_mod_cast n.ne_zero + let : FiniteDimensional K N := fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S' + let : IsGalois K N := fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S' + intro i x beta hbeta + let wi := sUnitKummerChosenBasePlaces (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i + have h := + KummerTheory.finitePlaceKummerRadicand_mem_nthPowerSubgroup_iff_root_mem_decompositionFixedField + (K := K) (L := N) wi n hmu x beta hbeta + change _ ↔ (beta : N) ∈ IntermediateField.fixedField + (_root_.finitePlaceDecompositionGroup (K := K) (L := N) wi) at h + rw [sUnitKummerChosenDecompositionField_eq_coordinateFixedField + (K := K) (Omega := Omega) E n hmu p v hp hv hn r eG S i] at h + exact h + +open scoped Classical in +/-- The chosen primes cut out exactly the Kummer radical of `E / K`: an +enlarged `S`-unit is a local `n`-th power at every chosen +prime if and only if it has an `n`-th root in `E`. -/ +theorem + sUnitLocalPowerKernel_sUnitKummerPrimeSet_eq_comap_sUnitFiniteKummerRadical + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let T := + sUnitKummerPrimeSet + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S + sUnitLocalPowerKernel (K := K) n S' T = + (sUnitFiniteKummerRadical + (K := K) (L := E) n S').comap + (SUnitGroup (K := K) S').subtype := by + dsimp only + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let T := + sUnitKummerPrimeSet + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + have hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let : FiniteDimensional K N := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S' + let : IsGalois K N := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S' + let : Algebra E N := + enlargedSUnitKummerAlgebra + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S + let : IsScalarTower K E N := by + infer_instance + change + sUnitLocalPowerKernel (K := K) n S' T = + (sUnitFiniteKummerRadical + (K := K) (L := E) n S').comap + (SUnitGroup (K := K) S').subtype + ext x + constructor + · intro hx + have hxLocal : + ∀ w : T, + Units.map + (algebraMap K + ((w : HeightOneSpectrum (𝓞 K)).adicCompletion K)).toMonoidHom + (x : Kˣ) ∈ + (powMonoidHom (n : ℕ) : + ((w : HeightOneSpectrum (𝓞 K)).adicCompletion K)ˣ →* + ((w : HeightOneSpectrum (𝓞 K)).adicCompletion K)ˣ).range := + (mem_sUnitLocalPowerKernel_iff + (K := K) n S' T x).mp hx + let aFull : + (fullSUnitKummerSubgroup (K := K) n S').1 := + sUnitToFullSUnitKummerSubgroup + (K := K) n S' x + have haN : + (x : Kˣ) ∈ + KummerTheory.finiteKummerRadicalSubgroup + (K := K) (L := N) n := + KummerTheory.le_finiteKummerRadicalSubgroup_kummerRadicalExtension + (K := K) (Omega := Omega) n hnK + (fullSUnitKummerSubgroup (K := K) n S').1 + aFull.property + obtain ⟨beta, hbeta⟩ := + (KummerTheory.mem_finiteKummerRadicalSubgroup_iff + (K := K) (L := N) n).mp haN + have hbetaCoordinate + (i : Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S)) : + (beta : N) ∈ + sUnitKummerCoordinateFixedField + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i := by + apply (local_power_iff_coordinate_fixedField E n hmu p v hp hv hn r eG S + i (x : Kˣ) beta hbeta).mp + exact hxLocal ⟨sUnitKummerChosenBasePlaces (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i, Finset.mem_image.mpr ⟨i, Finset.mem_univ i, rfl⟩⟩ + let R := + (enlargedSUnitKummerRestrictionHom + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S).ker + have hbetaKernel : (beta : N) ∈ IntermediateField.fixedField R := + mem_fixedField_of_subgroup_generators R + (sUnitKummerKernelGenerator (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S) + (iSup_zpowers_sUnitKummerKernelGenerator_eq_top + (K := K) (Omega := Omega) E n hmu p v hp hv hn r eG S) beta hbetaCoordinate + have hbetaEmbedded : + (beta : N) ∈ + enlargedSUnitKummerEmbeddedExtension + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S := by + rw [ + ← fixedField_enlargedSUnitKummerRestrictionHom_ker + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S] + exact hbetaKernel + change + (beta : N) ∈ Set.range (algebraMap E N) + at hbetaEmbedded + obtain ⟨gamma, hgamma⟩ := exists_unit_root_of_mem_algebraMap_range + (n : ℕ) (x : Kˣ) beta hbeta hbetaEmbedded + exact (mem_sUnitFiniteKummerRadical_iff (K := K) (L := E) n S' (x : Kˣ)).mpr + ⟨x.property, gamma, hgamma⟩ + · intro hx + change + (x : Kˣ) ∈ + sUnitFiniteKummerRadical + (K := K) (L := E) n S' at hx + obtain ⟨_hxS, betaE, hbetaE⟩ := + (mem_sUnitFiniteKummerRadical_iff + (K := K) (L := E) n S' (x : Kˣ)).mp hx + let betaN : Nˣ := + Units.map (algebraMap E N).toMonoidHom betaE + have hbetaN : betaN ^ (n : ℕ) = + Units.map (algebraMap K N).toMonoidHom (x : Kˣ) := + unit_root_map_tower (n : ℕ) (x : Kˣ) betaE hbetaE + apply + (mem_sUnitLocalPowerKernel_iff + (K := K) n S' T x).mpr + intro w + have hw : + (w : HeightOneSpectrum (𝓞 K)) ∈ + sUnitKummerPrimeSet + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S := + w.property + rw [sUnitKummerPrimeSet, Finset.mem_image] at hw + obtain ⟨i, _hi, hwi⟩ := hw + have hbetaEmbedded : + (betaN : N) ∈ + enlargedSUnitKummerEmbeddedExtension + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S := by + change + (betaN : N) ∈ Set.range (algebraMap E N) + exact ⟨(betaE : E), rfl⟩ + have hbetaCoordinate : + (betaN : N) ∈ + sUnitKummerCoordinateFixedField + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i := by + exact + enlargedSUnitKummerEmbeddedExtension_le_cyclicFixedField + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S + (sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) + hbetaEmbedded + have hlocal := (local_power_iff_coordinate_fixedField E n hmu p v hp hv hn r eG S + i (x : Kˣ) betaN hbetaN).mpr hbetaCoordinate + rw [← hwi] + exact hlocal + +open scoped Classical in +/-- Enlarging `S` by the radical supports preserves the idelic +factorization `I_K = I_K^S Kˣ`. -/ +theorem supportedAt_sup_principalSubgroup_eq_top_of_enlargeByRadicalSupport + {L : Type*} [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (hS : + IdeleGroup.supportedAt (K := K) (S : Set _) ⊔ + IdeleGroup.principalSubgroup K = ⊤) : + IdeleGroup.supportedAt + (K := K) + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := L) n hmu S : Set _) ⊔ + IdeleGroup.principalSubgroup K = + ⊤ := by + apply top_unique + rw [← hS] + apply sup_le + · exact + (IdeleGroup.supportedAt_mono + (K := K) + (show + (S : Set (HeightOneSpectrum (𝓞 K))) ⊆ + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := L) n hmu S : Set _) by + intro v hv + exact subset_enlargeByFiniteKummerRadicalSupport + (K := K) (L := L) n hmu S hv)).trans le_sup_left + · exact le_sup_right + +end FinitePlaces + +end GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/CoordinatePlaces.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/CoordinatePlaces.lean new file mode 100644 index 0000000000..53367847d3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/CoordinatePlaces.lean @@ -0,0 +1,411 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.BasePlaceSelection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.FinitePlaceDecomposition +/-! +# Coordinate places in an S-unit Kummer extension + +This file lifts the chosen base places to coordinate places in the full +Kummer extension and proves the required decomposition and unramifiedness +properties. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative +open NumberField IsDedekindDomain +open KummerTheory + +noncomputable +section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +section FinitePlaces + +variable {K : Type} [Field K] + [NumberField K] + +open scoped Classical in +/-- A completely decomposed coordinate place above the `i`-th chosen +base prime. -/ +theorem exists_sUnitKummerCoordinatePlace + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (i : Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S)) : + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + let hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + letI : FiniteDimensional K N := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S' + let Ni := + enlargedSUnitKummerCyclicFixedField + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S + (sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) + letI : NumberField Ni := + NumberField.of_module_finite K Ni + letI : IsGalois Ni N := + enlargedSUnitKummerCyclicFixedField_isGalois + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S + (sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) + ∃ q : HeightOneSpectrum (𝓞 Ni), + _root_.finitePlaceBelow (K := K) q = + sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i ∧ + _root_.finitePlaceDecompositionGroup + (K := Ni) (L := N) q = + ⊤ := by + dsimp only + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + have hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let : FiniteDimensional K N := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S' + let Ni := + enlargedSUnitKummerCyclicFixedField + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S + (sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) + let : NumberField Ni := + NumberField.of_module_finite K Ni + let : IsGalois Ni N := + enlargedSUnitKummerCyclicFixedField_isGalois + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S + (sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) + have h := + sUnitKummerChosenBasePlaces_mem_coordinateBasePlaceCandidates + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i + change ∃ q : HeightOneSpectrum (𝓞 Ni), + _root_.finitePlaceBelow (K := K) q = + sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i ∧ + _root_.finitePlaceDecompositionGroup + (K := Ni) (L := N) q = + ⊤ at h + exact h + +open scoped Classical in +/-- The selected coordinate place above the `i`-th chosen base prime. -/ +noncomputable def sUnitKummerCoordinatePlace + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (i : Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S)) := + Classical.choose + (exists_sUnitKummerCoordinatePlace + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) + +open scoped Classical in +/-- The selected coordinate place lies over the corresponding chosen +base prime. -/ +@[simp] +theorem sUnitKummerCoordinatePlace_below + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (i : Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S)) : + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + let hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + letI : FiniteDimensional K N := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S' + let Ni := + enlargedSUnitKummerCyclicFixedField + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S + (sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) + letI : NumberField Ni := + NumberField.of_module_finite K Ni + _root_.finitePlaceBelow (K := K) + (sUnitKummerCoordinatePlace + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) = + sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i := + (Classical.choose_spec + (exists_sUnitKummerCoordinatePlace + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i)).1 + +open scoped Classical in +/-- The selected coordinate place is completely decomposed in the full +Kummer extension over its coordinate fixed field. -/ +@[simp] +theorem sUnitKummerCoordinatePlace_decompositionGroup + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (i : Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S)) : + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + let hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + letI : FiniteDimensional K N := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S' + let Ni := + enlargedSUnitKummerCyclicFixedField + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S + (sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) + letI : NumberField Ni := + NumberField.of_module_finite K Ni + letI : IsGalois Ni N := + enlargedSUnitKummerCyclicFixedField_isGalois + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S + (sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) + _root_.finitePlaceDecompositionGroup + (K := Ni) (L := N) + (sUnitKummerCoordinatePlace + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) = + ⊤ := + (Classical.choose_spec + (exists_sUnitKummerCoordinatePlace + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i)).2 + +open scoped Classical in +/-- The `i`-th selected base prime is unramified in the full Kummer +extension. -/ +theorem sUnitKummerChosenBasePlace_not_mem_ramified + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (i : Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S)) : + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + let hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + letI : FiniteDimensional K N := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S' + letI : IsGalois K N := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S' + letI : NumberField N := + NumberField.of_module_finite K N + sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i ∉ + _root_.ramifiedBaseFinitePlaces + (K := K) (L := N) := by + dsimp only + intro hram + apply + sUnitKummerChosenBasePlaces_not_mem_avoided + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i + unfold sUnitKummerAvoidedBasePlaces + dsimp only + exact + Finset.mem_union_left _ + (Finset.mem_union_right _ hram) + +open scoped Classical in +/-- The chosen completed place at `p_i` is unramified in `N/K`. -/ +theorem sUnitKummerChosenBasePlace_isUnramified + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (i : Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S)) : + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + let hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + letI : FiniteDimensional K N := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S' + letI : IsGalois K N := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S' + letI : NumberField N := + NumberField.of_module_finite K N + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := N) + (sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) := by + dsimp only + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + have hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let : FiniteDimensional K N := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S' + let : IsGalois K N := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S' + let : NumberField N := + NumberField.of_module_finite K N + apply + _root_.chosenFinitePlaceIsUnramified_of_isUnramifiedAt + by_contra hram + apply + sUnitKummerChosenBasePlace_not_mem_ramified + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i + rw [_root_.mem_ramifiedBaseFinitePlaces_iff] + exact + ⟨_, + _root_.finitePlaceExtensionCentre_liesOver + (K := K) + (L := N) + _ + (_root_.chosenFinitePlaceExtension + (L := N) _), + hram⟩ + +end FinitePlaces + +end GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/DecompositionFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/DecompositionFields.lean new file mode 100644 index 0000000000..b527bf2c35 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/DecompositionFields.lean @@ -0,0 +1,444 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.NormalClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.CoordinatePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.PrimeSet +/-! +# Decomposition groups and fields for S-unit Kummer prime selection + +This file identifies the chosen decomposition groups with the cyclic +coordinate subgroups, proves complete splitting in the prescribed extension, +and identifies the associated decomposition fields. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative +open NumberField IsDedekindDomain +open KummerTheory + +noncomputable +section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +section FinitePlaces + +variable {K : Type} [Field K] + [NumberField K] + +open scoped Classical in +/-- The coordinate generator lies in the chosen global decomposition +group. -/ +theorem sUnitKummerKernelGenerator_mem_decompositionGroup + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (i : Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S)) : + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + let hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + letI : FiniteDimensional K N := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S' + letI : IsGalois K N := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S' + letI : NumberField N := + NumberField.of_module_finite K N + ((sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i : + (enlargedSUnitKummerRestrictionHom + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S).ker) : + Gal(N/K)) ∈ + _root_.finitePlaceDecompositionGroup + (K := K) (L := N) + (sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) := by + dsimp only + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + have hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let : FiniteDimensional K N := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S' + let _ : IsGalois K N := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S' + let : NumberField N := + NumberField.of_module_finite K N + let sigmaKer := + sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i + let sigma : Gal(N/K) := + sigmaKer.1 + let P : Subgroup Gal(N/K) := + Subgroup.zpowers sigma + let Ni := IntermediateField.fixedField P + let : NumberField Ni := + NumberField.of_module_finite K Ni + let : IsGalois Ni N := + enlargedSUnitKummerCyclicFixedField_isGalois + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) + S sigmaKer + let : IsScalarTower K Ni N := + IntermediateField.isScalarTower_mid Ni + let : IsMulCommutative Gal(N/K) := + KummerTheory.kummerRadicalExtension_isMulCommutative + n hmu (fullSUnitKummerSubgroup (K := K) n S').1 + let q : HeightOneSpectrum (𝓞 Ni) := + sUnitKummerCoordinatePlace + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i + let tau : N ≃ₐ[Ni] N := + IntermediateField.subgroupEquivAlgEquiv P + ⟨sigma, Subgroup.mem_zpowers sigma⟩ + have hq : + _root_.finitePlaceBelow (K := K) q = + sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i := + sUnitKummerCoordinatePlace_below + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i + have hfull : + _root_.finitePlaceDecompositionGroup + (K := Ni) (L := N) q = + ⊤ := + sUnitKummerCoordinatePlace_decompositionGroup + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i + have hmem := + restrictAutomorphismScalars_mem_finitePlaceDecompositionGroup_of_relative_eq_top + (F := K) (M := Ni) (L := N) + _ q hq hfull tau + have htau : + sigma = + RamificationTheory.HilbertRamification.ValuationSubring.restrictAutomorphismScalars + (K := K) (M := Ni) tau := by + apply AlgEquiv.ext + intro x + rfl + change + sigma ∈ finitePlaceDecompositionGroup + (sUnitKummerChosenBasePlaces E n hmu p v hp hv hn r eG S i) + rw [htau] + exact hmem + +open scoped Classical in +/-- The chosen global decomposition group is exactly the cyclic +coordinate subgroup generated by `σᵢ`. -/ +theorem sUnitKummerChosenDecompositionGroup_eq_zpowers + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (i : Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S)) : + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + let hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + letI : FiniteDimensional K N := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S' + letI : IsGalois K N := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S' + letI : NumberField N := + NumberField.of_module_finite K N + _root_.finitePlaceDecompositionGroup + (K := K) (L := N) + (sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) = + Subgroup.zpowers + ((sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i : + (enlargedSUnitKummerRestrictionHom + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S).ker) : + Gal(N/K)) := by + dsimp only + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + have hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let : FiniteDimensional K N := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S' + let _ : IsGalois K N := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S' + let : NumberField N := + NumberField.of_module_finite K N + let D := + _root_.finitePlaceDecompositionGroup + (K := K) (L := N) + (sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) + let sigmaKer := + sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i + let sigma : Gal(N/K) := + sigmaKer.1 + let : Finite Gal(N/K) := + finite_fullSUnitKummerExtension_galois + (K := K) (Omega := Omega) n + (by + exact_mod_cast n.ne_zero) + hmu S' + let : IsCyclic D := + finitePlaceDecompositionGroup_isCyclic_of_chosenUnramified + (F := K) (L := N) + _ + (sUnitKummerChosenBasePlace_isUnramified + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) + have hsigma : sigma ∈ D := + sUnitKummerKernelGenerator_mem_decompositionGroup + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i + let sigmaD : D := ⟨sigma, hsigma⟩ + have horderD : orderOf sigmaD = (n : ℕ) := by + calc + orderOf sigmaD = orderOf sigma := by + simpa only [sigmaD] using + Subgroup.orderOf_mk sigma hsigma + _ = orderOf sigmaKer := by + simpa only [sigma] using + Subgroup.orderOf_coe sigmaKer + _ = (n : ℕ) := + orderOf_sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i + have hlower : (n : ℕ) ≤ Nat.card D := by + rw [← horderD] + exact orderOf_le_card + let := Fintype.ofFinite D + have hpow (g : D) : g ^ (n : ℕ) = 1 := by + apply Subtype.ext + exact + fullSUnitKummerExtension_galois_pow_eq_one + (K := K) (Omega := Omega) n hmu S' g.1 + have hupper : Nat.card D ≤ (n : ℕ) := by + rw [Nat.card_eq_fintype_card] + calc + Fintype.card D = + (Finset.univ.filter + (fun g : D => g ^ (n : ℕ) = 1)).card := by + simp only [hpow, Finset.filter_true, Finset.card_univ] + _ ≤ (n : ℕ) := + IsCyclic.card_pow_eq_one_le n.pos + have hcard : Nat.card D = (n : ℕ) := + le_antisymm hupper hlower + have hgen : + Subgroup.zpowers sigmaD = ⊤ := by + apply Subgroup.eq_top_of_card_eq + rw [Nat.card_zpowers, horderD, hcard] + calc + D = (⊤ : Subgroup D).map D.subtype := by + rw [← MonoidHom.range_eq_map, Subgroup.range_subtype] + _ = (Subgroup.zpowers sigmaD).map D.subtype := by + rw [hgen] + _ = Subgroup.zpowers sigma := by + rw [MonoidHom.map_zpowers] + congr 1 + +open scoped Classical in +/-- Every prime selected by the Kummer construction splits completely in the +prescribed extension `E / K`. The selected decomposition group +upstairs is generated by an element of the kernel of restriction to +`E`, so complete splitting follows from the actual tower restriction +formula. -/ +theorem finitePlaceSplitsCompletely_of_mem_sUnitKummerPrimeSet + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + ∀ w, + w ∈ sUnitKummerPrimeSet + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S → + _root_.FinitePlaceSplitsCompletely + (K := K) (L := E) w := by + intro w hw + rw [sUnitKummerPrimeSet, Finset.mem_image] at hw + obtain ⟨i, -, rfl⟩ := hw + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + let hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let : FiniteDimensional K N := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S' + let _ : IsGalois K N := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S' + let _ : NumberField N := + NumberField.of_module_finite K N + let : Algebra E N := + enlargedSUnitKummerAlgebra + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S + let : IsScalarTower K E N := by + infer_instance + apply + finitePlaceSplitsCompletely_of_decompositionGroup_le_restrictNormalHom_ker + (K := K) (E := E) (N := N) + rw [ + sUnitKummerChosenDecompositionGroup_eq_zpowers + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i] + apply Subgroup.zpowers_le.mpr + simpa only [enlargedSUnitKummerRestrictionHom, N, S'] using + (sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i).property + +open scoped Classical in +/-- The decomposition field of the chosen base place is the coordinate fixed +field used in the Kummer prime-selection construction. -/ +theorem sUnitKummerChosenDecompositionField_eq_coordinateFixedField + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (i : Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S)) : + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + let hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + letI : FiniteDimensional K N := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S' + letI : IsGalois K N := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S' + letI : NumberField N := + NumberField.of_module_finite K N + IntermediateField.fixedField + (_root_.finitePlaceDecompositionGroup + (K := K) (L := N) + (sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i)) = + sUnitKummerCoordinateFixedField + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i := by + dsimp only + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + have hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let : FiniteDimensional K N := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S' + let _ : IsGalois K N := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S' + let : NumberField N := + NumberField.of_module_finite K N + rw [ + sUnitKummerChosenDecompositionGroup_eq_zpowers + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i] + rfl + +end FinitePlaces + +end GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean new file mode 100644 index 0000000000..efe5f36b5d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean @@ -0,0 +1,191 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +/-! +# Finite-place decomposition groups in Galois towers + +This file relates relative and absolute finite-place decomposition groups and +proves cyclicity for the decomposition group at a chosen unramified place. +The results are independent of the S-unit Kummer construction. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +open scoped Classical in +open _root_.HilbertRamification + (decompositionGroupRestriction_mem_absoluteValueDecompositionGroup_restrictScalars_iff) in +/-- Full relative decomposition above `q` puts every +`M`-automorphism inside the global chosen decomposition group below +`q`. -/ +theorem + restrictAutomorphismScalars_mem_finitePlaceDecompositionGroup_of_relative_eq_top + {F M L : Type} + [Field F] [NumberField F] + [Field M] [NumberField M] + [Field L] [NumberField L] + [Algebra F M] [Algebra M L] [Algebra F L] + [IsScalarTower F M L] + [FiniteDimensional F L] + [IsGalois F L] [IsGalois M L] + [IsMulCommutative (L ≃ₐ[F] L)] + (p : HeightOneSpectrum (𝓞 F)) + (q : HeightOneSpectrum (𝓞 M)) + (hq : + _root_.finitePlaceBelow (K := F) q = p) + (hfull : + _root_.finitePlaceDecompositionGroup + (K := M) (L := L) q = + ⊤) + (tau : L ≃ₐ[M] L) : + RamificationTheory.HilbertRamification.ValuationSubring.restrictAutomorphismScalars + (K := F) (M := M) tau ∈ + _root_.finitePlaceDecompositionGroup + (K := F) (L := L) p := by + let wM := + _root_.chosenFinitePlaceExtension + (L := L) q + let W := + _root_.finitePlaceExtensionCentre + (K := M) (L := L) q wM + have hWM : + _root_.finitePlaceBelow (K := M) W = + q := + _root_.finitePlaceBelow_finitePlaceExtensionCentre + (K := M) (L := L) q wM + have hWF : + _root_.finitePlaceBelow (K := F) W = + p := by + rw [ + ← _root_.finitePlaceBelow_finitePlaceBelow + (K := F) (M := M) (L := L) W, + hWM, hq] + let Wp : + {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := F) W = p} := + ⟨W, hWF⟩ + let wF := + (_root_.finitePlaceExtensionEquivAbove + (K := F) (L := L) p).symm Wp + have hwFcentre : + _root_.finitePlaceExtensionCentre + (K := F) (L := L) p wF = + W := by + have hh := + (_root_.finitePlaceExtensionEquivAbove + (K := F) (L := L) p).apply_symm_apply Wp + simpa only [wF, Wp, finitePlaceExtensionEquivAbove_coe] using + congrArg + (fun T : + {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := F) W = p} => + (T : HeightOneSpectrum (𝓞 L))) hh + have hequiv : wM.1.IsEquiv wF.1 := by + apply + _root_.finitePlaceExtensions_isEquiv_of_centres_eq + (F := M) (M := F) q p wM wF + simpa [W] using hwFcentre.symm + have hDvalue : + HilbertRamification.absoluteValueDecompositionGroup + F wM.1 = + HilbertRamification.absoluteValueDecompositionGroup + F wF.1 := + absoluteValueDecompositionGroup_eq_of_absoluteValue_isEquiv + wM.1 wF.1 hequiv + have hDchosen : + HilbertRamification.absoluteValueDecompositionGroup + F wF.1 = + HilbertRamification.absoluteValueDecompositionGroup + F + (_root_.chosenFinitePlaceExtension + (L := L) p).1 := + absoluteValueDecompositionGroup_eq_of_exactExtensions_of_isMulCommutative + (HeightOneSpectrum.adicAbv F p) + (RayClass.adicAbv_isNontrivial p) + wF + (_root_.chosenFinitePlaceExtension + (L := L) p) + have htauM : + tau ∈ + HilbertRamification.absoluteValueDecompositionGroup + M wM.1 := by + change + tau ∈ + _root_.finitePlaceDecompositionGroup + (K := M) (L := L) q + rw [hfull] + exact Subgroup.mem_top tau + let rho := + RamificationTheory.HilbertRamification.ValuationSubring.restrictAutomorphismScalars + (K := F) (M := M) tau + have hrho : + rho ∈ + HilbertRamification.absoluteValueDecompositionGroup + F wM.1 := by + exact + (decompositionGroupRestriction_mem_absoluteValueDecompositionGroup_restrictScalars_iff + (K := F) (M := M) wM.1 tau).mpr htauM + change + rho ∈ + HilbertRamification.absoluteValueDecompositionGroup + F + (_root_.chosenFinitePlaceExtension + (L := L) p).1 + rw [← hDchosen, ← hDvalue] + exact hrho + +open scoped Classical in +/-- An unramified chosen finite-place decomposition group is cyclic. -/ +theorem finitePlaceDecompositionGroup_isCyclic_of_chosenUnramified + {F L : Type} + [Field F] [NumberField F] + [Field L] [Algebra F L] + [FiniteDimensional F L] [IsGalois F L] + (v : HeightOneSpectrum (𝓞 F)) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := F) (L := L) v) : + IsCyclic + (_root_.finitePlaceDecompositionGroup + (K := F) (L := L) v) := by + let Fv := + _root_.ChosenFinitePlaceBaseCompletion + (K := F) v + let Lv := + _root_.ChosenFinitePlaceLocalizedCompletion + (K := F) (L := L) v + let : + LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + Fv Lv := by + simpa [Fv, Lv, _root_.ChosenFinitePlaceIsUnramified] using hunram + let eLocal : + _root_.finitePlaceDecompositionGroup + (K := F) (L := L) v ≃* + (Lv ≃ₐ[Fv] Lv) := + HilbertRamification.decompositionGroupEquivAlgebraicLocalizationAut + (HeightOneSpectrum.adicAbv F v) + (RayClass.adicAbv_isNontrivial v) + (_root_.chosenFinitePlaceExtension + (L := L) v) + exact + eLocal.isCyclic.mpr + (LocalFieldTheory.isCyclic_galoisGroup_of_unramifiedValuation + Fv Lv) + +end GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/PrimeSet.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/PrimeSet.lean new file mode 100644 index 0000000000..7e418af82b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/PrimeSet.lean @@ -0,0 +1,124 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.BasePlaceSelection +/-! +# The finite prime set for an S-unit Kummer extension + +This file packages the chosen base places as a finite set and proves its +cardinality and disjointness properties. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative +open NumberField IsDedekindDomain +open KummerTheory + +noncomputable +section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +section FinitePlaces + +variable {K : Type} [Field K] + [NumberField K] + +open scoped Classical in +/-- The finite set `T` of primes chosen for the coordinate cyclic extensions +that detect the enlarged `S`-unit Kummer radical. -/ +noncomputable def sUnitKummerPrimeSet + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Finset (HeightOneSpectrum (𝓞 K)) := + Finset.univ.image + (sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S) + +open scoped Classical in +/-- The chosen prime set has the required cardinality `s-r`. -/ +@[simp] +theorem sUnitKummerPrimeSet_card + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + (sUnitKummerPrimeSet + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S).card = + sUnitKummerPrimeCount + (K := K) E n hmu r S := by + rw [sUnitKummerPrimeSet, + Finset.card_image_of_injective Finset.univ + (sUnitKummerChosenBasePlaces_injective + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S), + Finset.card_univ, Fintype.card_fin] + +open scoped Classical in +/-- The chosen prime set is disjoint from the enlarged finite Kummer-radical support. -/ +theorem sUnitKummerPrimeSet_disjoint_enlargeByFiniteKummerRadicalSupport + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Disjoint + (sUnitKummerPrimeSet + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S) + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S) := by + rw [Finset.disjoint_left] + intro w hwT hwS + rw [sUnitKummerPrimeSet, Finset.mem_image] at hwT + obtain ⟨i, -, hi⟩ := hwT + subst w + exact + sUnitKummerChosenBasePlaces_not_mem_avoided + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i + (enlargeByFiniteKummerRadicalSupport_subset_sUnitKummerAvoidedBasePlaces + (K := K) (Omega := Omega) E n hmu S hwS) + +end FinitePlaces + +end GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/RestrictionKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/RestrictionKernel.lean new file mode 100644 index 0000000000..dbd63a9a28 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/RestrictionKernel.lean @@ -0,0 +1,293 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.Core +/-! +# Restriction kernels of S-unit Kummer extensions + +This file specializes the chosen restriction-kernel coordinates of an +enlarged S-unit Kummer extension to coordinate generators, their required +number, and their cyclic fixed fields. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative +open NumberField IsDedekindDomain +open KummerTheory + +noncomputable +section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +section GeneralKummer + +variable {K : Type*} [Field K] + [NumberField K] + +open scoped Classical in +/-- The number `s-r` of finite places required to detect the restriction +kernel for the chosen source-produced enlargement of `S`. -/ +def sUnitKummerPrimeCount + {Omega : Type*} [Field Omega] [Algebra K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (r : ℕ) + (S : Finset (HeightOneSpectrum (𝓞 K))) : ℕ := + totalPlaceCard (K := K) + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S) - r + +open scoped Classical in +/-- The `i`-th standard generator of the actual restriction kernel +`Gal(N/E)`. -/ +noncomputable def sUnitKummerKernelGenerator + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (i : Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S)) := + (chosenEnlargedSUnitKummerRestrictionKernelEquivPiZMod + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S).symm + (Pi.mulSingle i + (Multiplicative.ofAdd (1 : ZMod (n : ℕ)))) + +open scoped Classical in +/-- The standard coordinate generators span the actual restriction kernel +`Gal(N / E)`. -/ +theorem iSup_zpowers_sUnitKummerKernelGenerator_eq_top + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + (⨆ i : + Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S), + Subgroup.zpowers + (sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i)) = + ⊤ := by + let e := + chosenEnlargedSUnitKummerRestrictionKernelEquivPiZMod + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S + let P : + Subgroup + (enlargedSUnitKummerRestrictionHom + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S).ker := + ⨆ i, + Subgroup.zpowers + (sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) + change P = ⊤ + apply top_unique + intro sigma _ + have hsingle + (i : + Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S)) + (z : Multiplicative (ZMod (n : ℕ))) : + e.symm (Pi.mulSingle i z) ∈ P := by + obtain ⟨m, hm⟩ := + ZMod.natCast_zmod_surjective z.toAdd + have hz : + z = + (Multiplicative.ofAdd + (1 : ZMod (n : ℕ))) ^ m := by + apply Multiplicative.toAdd.injective + rw [toAdd_pow] + simpa using hm.symm + have hpower : e.symm (Pi.mulSingle i z) = + (sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) ^ m := + (congrArg (fun t : Multiplicative (ZMod (n : ℕ)) => + e.symm (Pi.mulSingle i t)) hz).trans + ((congrArg e.symm + (Pi.mulSingle_pow i (Multiplicative.ofAdd (1 : ZMod (n : ℕ))) m)).trans + (map_pow e.symm + (Pi.mulSingle i (Multiplicative.ofAdd (1 : ZMod (n : ℕ)))) m)) + have hmem := + P.pow_mem + ((le_iSup + (fun i => + Subgroup.zpowers + (sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i)) i) + (Subgroup.mem_zpowers + (sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i))) + m + exact hpower.symm ▸ hmem + have hesigma : + e sigma ∈ P.map e.toMonoidHom := by + apply Subgroup.pi_mem_of_mulSingle_mem (e sigma) + intro i + refine + ⟨e.symm (Pi.mulSingle i (e sigma i)), + hsingle i (e sigma i), ?_⟩ + exact e.apply_symm_apply _ + obtain ⟨tau, htau, htauSigma⟩ := hesigma + have htauEq : tau = sigma := + e.injective htauSigma + exact show sigma ∈ (P : Set _) from htauEq ▸ htau + +open scoped Classical in +/-- Every standard restriction-kernel generator has exact order `n`. -/ +theorem orderOf_sUnitKummerKernelGenerator + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (i : Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S)) : + orderOf + (sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) = + (n : ℕ) := by + let e := + chosenEnlargedSUnitKummerRestrictionKernelEquivPiZMod + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S + let I := Fin + (totalPlaceCard (K := K) + (enlargeByFiniteKummerRadicalSupport (K := K) (L := E) n hmu S) - r) + let j : I := i + let c : I → Multiplicative (ZMod (n : ℕ)) := + Pi.mulSingle j (Multiplicative.ofAdd (1 : ZMod (n : ℕ))) + change orderOf (e.symm c) = (n : ℕ) + have hone : orderOf (Multiplicative.ofAdd (1 : ZMod (n : ℕ))) = (n : ℕ) := + (orderOf_ofAdd_eq_addOrderOf (1 : ZMod (n : ℕ))).trans + (ZMod.addOrderOf_one (n : ℕ)) + have hc : orderOf c = (n : ℕ) := + (orderOf_piMulSingle + (M := fun _ : I => Multiplicative (ZMod (n : ℕ))) + j (Multiplicative.ofAdd (1 : ZMod (n : ℕ)))).trans hone + exact (e.symm.orderOf_eq c).trans hc + +open scoped Classical in +/-- The cyclic fixed field attached to the `i`-th coordinate of the +actual relative Galois group `Gal(N/E)`. -/ +noncomputable def sUnitKummerCoordinateFixedField + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (i : Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S)) := + enlargedSUnitKummerCyclicFixedField + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S + (sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) + +open scoped Classical in +/-- Each coordinate fixed field has relative degree exactly `n` in +the full `S`-unit Kummer field. -/ +theorem sUnitKummerCoordinateFixedField_finrank + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (i : Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S)) : + Module.finrank + (sUnitKummerCoordinateFixedField + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) + (fullSUnitKummerExtension + (K := K) (Omega := Omega) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S)) = + (n : ℕ) := by + unfold sUnitKummerCoordinateFixedField + rw [enlargedSUnitKummerCyclicFixedField_finrank + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S + (sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i), + Subgroup.orderOf_coe, + orderOf_sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i] + +end GeneralKummer + +end GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitLocalPowerMap.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitLocalPowerMap.lean new file mode 100644 index 0000000000..efc9dad3ae --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitLocalPowerMap.lean @@ -0,0 +1,754 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.FinitePlaceDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.RestrictionKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.BasePlaceSelection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.CoordinatePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.PrimeSet +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.DecompositionFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.Conclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitPowerIndexFormulas +public import Mathlib.Algebra.Group.Subgroup.Finite +public import Mathlib.GroupTheory.Index +/-! +# S-unit localization modulo local powers + +This module constructs the localization map from an S-unit group to the +finite product of local unit power classes and proves its kernel and +surjectivity properties for the Kummer prime set. +-/ + +@[expose] public section + +open scoped NumberField NNReal IsMulCommutative +open NumberField IsDedekindDomain +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open KummerTheory +open LocalFieldTheory + +noncomputable +section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- The unit-valued localization map +`Kˢ → ∏ v ∈ T, U_v / U_vⁿ`. Disjointness makes every `S`-unit an +integral unit at the places in `T`. -/ +def sUnitLocalUnitPowerMap + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) + (hST : Disjoint S T) : + SUnitGroup (K := K) S →* + ∀ v : T, + (v.1.adicCompletionIntegers K)ˣ ⧸ + (powMonoidHom (n : ℕ) : + (v.1.adicCompletionIntegers K)ˣ →* + (v.1.adicCompletionIntegers K)ˣ).range := + MonoidHom.pi fun v => + let localPrincipal : + SUnitGroup (K := K) S →* (v.1.adicCompletion K)ˣ := + ((IdeleGroup.finiteComponent v.1).comp + (IdeleGroup.principalIdele K)).comp + (SUnitGroup (K := K) S).subtype + let localPrincipalUnit : + SUnitGroup (K := K) S →* + (v.1.adicCompletionIntegers K).units := + localPrincipal.codRestrict + (v.1.adicCompletionIntegers K).units + (fun x => by + have hvS : v.1 ∉ S := by + intro hvS + exact (Finset.disjoint_left.mp hST) hvS v.2 + rw [ + HeightOneSpectrum.adicCompletionIntegers.mem_units_iff_valued_eq_one] + change + Valued.v + (((IdeleGroup.finiteComponent v.1 + (IdeleGroup.principalIdele K (x : Kˣ)) : + (v.1.adicCompletion K)ˣ) : + v.1.adicCompletion K)) = + 1 + rw [IdeleGroup.finiteComponent_principalIdele, + HeightOneSpectrum.valuedAdicCompletion_eq_valuation'] + exact + (mem_SUnitGroup_iff (K := K) S x).mp + x.2 v.1 hvS) + (QuotientGroup.mk' + (powMonoidHom (n : ℕ) : + (v.1.adicCompletionIntegers K)ˣ →* + (v.1.adicCompletionIntegers K)ˣ).range).comp + ((v.1.adicCompletionIntegers K).toSubmonoid.unitsEquivUnitsType.toMonoidHom.comp + localPrincipalUnit) + +open scoped Classical in +/-- An integral unit in an adic completion is an `n`-th power among +integral units exactly when it is an `n`-th power among field units. -/ +theorem mem_powMonoidHom_range_adicCompletionIntegers_iff + (v : HeightOneSpectrum (𝓞 K)) + (n : ℕ+) + (x : (v.adicCompletionIntegers K)ˣ) : + x ∈ (powMonoidHom (n : ℕ) : + (v.adicCompletionIntegers K)ˣ →* + (v.adicCompletionIntegers K)ˣ).range ↔ + Units.map + (algebraMap (v.adicCompletionIntegers K) + (v.adicCompletion K)).toMonoidHom x ∈ + (powMonoidHom (n : ℕ) : + (v.adicCompletion K)ˣ →* + (v.adicCompletion K)ˣ).range := by + constructor + · intro hx + obtain ⟨y, hy⟩ := + (MonoidHom.mem_range + (G := (v.adicCompletionIntegers K)ˣ)).mp hx + apply + (MonoidHom.mem_range + (G := (v.adicCompletion K)ˣ)).mpr + refine ⟨Units.map + (algebraMap (v.adicCompletionIntegers K) + (v.adicCompletion K)).toMonoidHom y, ?_⟩ + rw [powMonoidHom_apply] at hy ⊢ + rw [← map_pow, hy] + · intro hx + obtain ⟨y, hy⟩ := + (MonoidHom.mem_range + (G := (v.adicCompletion K)ˣ)).mp hx + rw [powMonoidHom_apply] at hy + have hxVal : + Valued.v + (((Units.map + (algebraMap (v.adicCompletionIntegers K) + (v.adicCompletion K)).toMonoidHom x : + (v.adicCompletion K)ˣ) : + v.adicCompletion K)) = + 1 := + (HeightOneSpectrum.adicCompletionIntegers.isUnit_iff_valued_eq_one + (K := K) (v := v)).mp x.isUnit + have hyValPow : + Valued.v (((y ^ (n : ℕ) : (v.adicCompletion K)ˣ) : + v.adicCompletion K)) = 1 := by + rw [hy] + exact hxVal + have hyValPow' : + Valued.v ((y : (v.adicCompletion K)ˣ) : + v.adicCompletion K) ^ (n : ℕ) = 1 := by + rw [Units.val_pow_eq_pow_val] at hyValPow + rw [map_pow] at hyValPow + exact hyValPow + have hyVal : + Valued.v ((y : (v.adicCompletion K)ˣ) : + v.adicCompletion K) = 1 := + (pow_left_injective + (M := WithZero (Multiplicative ℤ)) + (n := (n : ℕ)) n.ne_zero) + (by simpa only [one_pow] using hyValPow') + let yO : v.adicCompletionIntegers K := + ⟨(y : v.adicCompletion K), hyVal.le⟩ + have hyOUnit : IsUnit yO := + Valuation.Integers.isUnit_of_one' + (HeightOneSpectrum.adicCompletionIntegers.integers K v) (by + change + Valued.v ((y : (v.adicCompletion K)ˣ) : + v.adicCompletion K) = 1 + exact hyVal) + obtain ⟨z, hz⟩ := hyOUnit + have hzField : + Units.map + (algebraMap (v.adicCompletionIntegers K) + (v.adicCompletion K)).toMonoidHom z = + y := by + apply Units.ext + change ((z : v.adicCompletionIntegers K) : + v.adicCompletion K) = (y : v.adicCompletion K) + rw [hz] + apply + (MonoidHom.mem_range + (G := (v.adicCompletionIntegers K)ˣ)).mpr + refine ⟨z, ?_⟩ + rw [powMonoidHom_apply] + apply Units.map_injective + (f := (algebraMap (v.adicCompletionIntegers K) + (v.adicCompletion K)).toMonoidHom) + (FaithfulSMul.algebraMap_injective + (v.adicCompletionIntegers K) + (v.adicCompletion K)) + rw [map_pow, hzField, hy] + +open scoped Classical in +/-- The unit-valued localization map and the field-valued localization map +defining `Δ` have the same kernel. -/ +theorem sUnitLocalUnitPowerMap_ker + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) + (hST : Disjoint S T) : + (sUnitLocalUnitPowerMap (K := K) n S T hST).ker = + sUnitLocalPowerKernel (K := K) n S T := by + ext x + let localUnit (v : T) : + (v.1.adicCompletionIntegers K)ˣ := + (v.1.adicCompletionIntegers K).toSubmonoid.unitsEquivUnitsType + ⟨IdeleGroup.finiteComponent v.1 + (IdeleGroup.principalIdele K (x : Kˣ)), by + have hvS : v.1 ∉ S := by + intro hvS + exact (Finset.disjoint_left.mp hST) hvS v.2 + rw [ + HeightOneSpectrum.adicCompletionIntegers.mem_units_iff_valued_eq_one] + rw [IdeleGroup.finiteComponent_principalIdele, + HeightOneSpectrum.valuedAdicCompletion_eq_valuation'] + exact + (mem_SUnitGroup_iff (K := K) S x).mp + x.2 v.1 hvS⟩ + have localUnit_toField (v : T) : + Units.map + (algebraMap (v.1.adicCompletionIntegers K) + (v.1.adicCompletion K)).toMonoidHom (localUnit v) = + Units.map + (algebraMap K (v.1.adicCompletion K)).toMonoidHom + (x : Kˣ) := by + apply Units.ext + rfl + rw [mem_sUnitLocalPowerKernel_iff, MonoidHom.mem_ker] + constructor + · intro hx v + have hv := congrFun hx v + rw [Pi.one_apply] at hv + change QuotientGroup.mk' _ (localUnit v) = 1 at hv + have hvInteger := + (QuotientGroup.eq_one_iff (localUnit v)).mp hv + have hvField := + (mem_powMonoidHom_range_adicCompletionIntegers_iff + v.1 n (localUnit v)).mp hvInteger + rw [localUnit_toField v] at hvField + exact hvField + · intro hx + funext v + rw [Pi.one_apply] + change QuotientGroup.mk' _ (localUnit v) = 1 + apply (QuotientGroup.eq_one_iff (localUnit v)).mpr + apply + (mem_powMonoidHom_range_adicCompletionIntegers_iff + v.1 n (localUnit v)).mpr + rw [localUnit_toField v] + exact hx v + +/-- At a finite place where the exponent is a unit, the integral-unit power quotient +has the expected cardinality when the base contains all roots of unity. -/ +private theorem card_adicIntegralUnitPowerQuotient + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (w : HeightOneSpectrum (𝓞 K)) (hnGlobal : w.valuation K ((n : ℕ) : K) = 1) : + Nat.card ((w.adicCompletionIntegers K)ˣ ⧸ + (powMonoidHom (n : ℕ) : (w.adicCompletionIntegers K)ˣ →* + (w.adicCompletionIntegers K)ˣ).range) = (n : ℕ) := by + classical + let F := + LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation + (Valued.v : + Valuation (w.adicCompletion K) + (WithZero (Multiplicative ℤ))) + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + have hnu : Function.Surjective + (Valued.v : + Valuation (w.adicCompletion K) + (WithZero (Multiplicative ℤ))) := + w.valuedAdicCompletion_surjective K + have hnatCast : + (((n : ℕ) : K) : w.adicCompletion K) = + ((n : ℕ) : w.adicCompletion K) := by + change + algebraMap K (w.adicCompletion K) ((n : ℕ) : K) = + ((n : ℕ) : w.adicCompletion K) + rw [map_natCast] + have hnuN : + Valued.v ((n : ℕ) : w.adicCompletion K) = 1 := by + rw [← hnatCast, + HeightOneSpectrum.valuedAdicCompletion_eq_valuation'] + exact hnGlobal + have hnuNF : + F.valuation ((n : ℕ) : w.adicCompletion K) = 1 := by + dsimp only [F] + unfold + LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation + unfold + LocalFieldTheory.DiscreteValuationField.LocalField.coherentWithZeroMultiplicativeIntGroup + exact hnuN + have hpnd : + ¬ F.residueCharacteristic ∣ (n : ℕ) := by + rw [← + F.valuation_natCast_lt_one_iff_residueCharacteristic_dvd] + rw [hnuNF] + exact lt_irrefl 1 + let : + Fact + (Nat.Coprime (n : ℕ) + F.residueCharacteristic) := + ⟨(F.residueCharacteristic_prime.coprime_iff_not_dvd.mpr + hpnd).symm⟩ + let eValuationSubringUnits : + F.valuationSubringˣ ≃* + (w.adicCompletionIntegers K)ˣ := by + exact MulEquiv.refl ((w.adicCompletionIntegers K)ˣ) + have hindexPackaged : + Nat.card + (F.valuationSubringˣ ⧸ + (powMonoidHom (n : ℕ) : + F.valuationSubringˣ →* F.valuationSubringˣ).range) = + Nat.card + ((powMonoidHom (n : ℕ) : + (w.adicCompletion K)ˣ →* + (w.adicCompletion K)ˣ).ker) := by + simpa only [F] using + LocalFieldTheory.DiscreteValuationField.LocalField.mixed_unitIndex_of_coprime + (Valued.v : + Valuation (w.adicCompletion K) + (WithZero (Multiplicative ℤ))) + hnu (n := (n : ℕ)) + have hindex : + Nat.card + ((w.adicCompletionIntegers K)ˣ ⧸ + (powMonoidHom (n : ℕ) : + (w.adicCompletionIntegers K)ˣ →* + (w.adicCompletionIntegers K)ˣ).range) = + Nat.card + ((powMonoidHom (n : ℕ) : + (w.adicCompletion K)ˣ →* + (w.adicCompletion K)ˣ).ker) := by + calc + Nat.card + ((w.adicCompletionIntegers K)ˣ ⧸ + (powMonoidHom (n : ℕ) : + (w.adicCompletionIntegers K)ˣ →* + (w.adicCompletionIntegers K)ˣ).range) = + Nat.card + (F.valuationSubringˣ ⧸ + (powMonoidHom (n : ℕ) : + F.valuationSubringˣ →* F.valuationSubringˣ).range) := by + exact Nat.card_congr + (LocalFieldTheory.nthPowerQuotientEquivOfMulEquiv + (w.adicCompletionIntegers K)ˣ + F.valuationSubringˣ + (n : ℕ) + eValuationSubringUnits.symm).toEquiv + _ = Nat.card + ((powMonoidHom (n : ℕ) : + (w.adicCompletion K)ˣ →* + (w.adicCompletion K)ˣ).ker) := + hindexPackaged + have hroots : + Nat.card + ((powMonoidHom (n : ℕ) : + (w.adicCompletion K)ˣ →* + (w.adicCompletion K)ˣ).ker) = + (n : ℕ) := by + rw [ + LocalFieldTheory.powMonoidHom_ker_units_eq_rootsOfUnity] + obtain ⟨zeta, hzeta⟩ := hmu + have hzetaPrimitive : + IsPrimitiveRoot zeta (n : ℕ) := + (mem_primitiveRoots n.pos).mp hzeta + exact + (hzetaPrimitive.map_of_injective + (algebraMap K + (w.adicCompletion K)).injective).card_rootsOfUnity + simpa only [hroots] using hindex + +/-- The localization kernel modulo powers has the cardinality of the Kummer Galois group. -/ +private theorem card_sUnitLocalPowerKernel_on_kummerPrimeSet + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let T := + sUnitKummerPrimeSet + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S + Nat.card (sUnitLocalPowerKernel (K := K) n S' T ⧸ + sUnitLocalPowerKernelNthPowers (K := K) n S' T) = (n : ℕ) ^ r := by + classical + dsimp only + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let T := + sUnitKummerPrimeSet + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S + let SU : Subgroup Kˣ := + SUnitGroup (K := K) S' + let Delta : Subgroup SU := + sUnitLocalPowerKernel (K := K) n S' T + let P : Subgroup SU := + (powMonoidHom (n : ℕ) : SU →* SU).range + let H : Subgroup Kˣ := + sUnitFiniteKummerRadical + (K := K) (L := E) n S' + let Npow : Subgroup Kˣ := + KummerTheory.unitNthPowersSubgroup K n + let D := + KummerTheory.chosenFiniteKummerRadicalDatum + (K := K) (L := E) n + have hDeltaEq : + Delta = H.subgroupOf SU := by + change + sUnitLocalPowerKernel (K := K) n S' T = + (sUnitFiniteKummerRadical + (K := K) (L := E) n S').comap + (SUnitGroup (K := K) S').subtype + exact + sUnitLocalPowerKernel_sUnitKummerPrimeSet_eq_comap_sUnitFiniteKummerRadical + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S + have hP : + P = Npow.subgroupOf SU := by + ext x + constructor + · intro hx + obtain ⟨y, hy⟩ := + (MonoidHom.mem_range + (G := SU)).mp hx + rw [powMonoidHom_apply] at hy + change (x : Kˣ) ∈ Npow + apply + (KummerTheory.mem_unitNthPowersSubgroup_iff n).mpr + refine ⟨(y : Kˣ), ?_⟩ + exact congrArg (fun z : SU => (z : Kˣ)) hy + · intro hx + change (x : Kˣ) ∈ Npow at hx + obtain ⟨y, hy⟩ := + (KummerTheory.mem_unitNthPowersSubgroup_iff n).mp hx + have hySU : y ∈ SU := + mem_sUnitGroup_of_pow_mem + (K := K) S' n y (by + rw [hy] + exact x.property) + let ySU : SU := ⟨y, hySU⟩ + apply + (MonoidHom.mem_range + (G := SU)).mpr + refine ⟨ySU, ?_⟩ + rw [powMonoidHom_apply] + apply Subtype.ext + exact hy + have hHle : H ≤ SU := by + exact inf_le_left + have hsup : + H ⊔ Npow = D.carrier := by + change + (sUnitKummerSubgroup + (K := K) (L := E) n S').1 = + KummerTheory.finiteKummerRadicalSubgroup + (K := K) (L := E) n + exact + enlargedSUnitKummerSubgroup_eq_finiteKummerRadicalSubgroup + (K := K) (L := E) n hmu S + let eDelta : + Delta ⧸ P.subgroupOf Delta ≃* + H.subgroupOf SU ⧸ + P.subgroupOf (H.subgroupOf SU) := + QuotientGroup.equivQuotientSubgroupOfOfEq + rfl hDeltaEq + let ePower : + H.subgroupOf SU ⧸ + P.subgroupOf (H.subgroupOf SU) ≃* + H.subgroupOf SU ⧸ + (Npow.subgroupOf SU).subgroupOf + (H.subgroupOf SU) := + QuotientGroup.equivQuotientSubgroupOfOfEq + hP rfl + let eH := + Subgroup.subgroupOfEquivOfLe hHle + have hmap : + ((Npow.subgroupOf SU).subgroupOf + (H.subgroupOf SU)).map eH = + Npow.subgroupOf H := by + rw [Subgroup.map_equiv_eq_comap_symm] + rfl + let eInside := + QuotientGroup.congr _ _ eH hmap + let eSecond := + QuotientGroup.quotientInfEquivProdNormalQuotient + H Npow + let eRadicalCarrier : + (H ⊔ Npow : Subgroup Kˣ) ⧸ + Npow.subgroupOf (H ⊔ Npow) ≃* + D.carrier ⧸ Npow.subgroupOf D.carrier := + QuotientGroup.equivQuotientSubgroupOfOfEq + rfl hsup + have hden : + Npow.subgroupOf D.carrier = + D.ambientNthPowersSubgroup := by + rfl + let eNamedRadical := + (QuotientGroup.quotientMulEquivOfEq hden).trans + D.radicalQuotientMulEquiv.symm + let : CommGroup Gal(E/K) := by + infer_instance + have hexponentE : + ∀ sigma : Gal(E/K), sigma ^ (n : ℕ) = 1 := + galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG + let hbase : + KummerTheory.NthRootsOfUnityInBase + (K := K) (L := E) n := + KummerTheory.nthRootsOfUnityInBase_of_primitiveRoots + (K := K) (L := E) n hmu + let eKummer := + KummerTheory.finiteKummerCharacterEquiv + n hbase + let eDual := + Classical.choice <| + KummerTheory.finiteNthRootsCharacterDuality + (G := Gal(E/K)) (K := K) (L := E) + n hmu hexponentE + let eQuotient := + eDelta.trans + (ePower.trans + (eInside.trans + (eSecond.trans + (eRadicalCarrier.trans + (eNamedRadical.trans + (eKummer.trans eDual)))))) + have hDeltaCard : + Nat.card + (Delta ⧸ + sUnitLocalPowerKernelNthPowers + (K := K) n S' T) = + (n : ℕ) ^ r := by + change + Nat.card (Delta ⧸ P.subgroupOf Delta) = + (n : ℕ) ^ r + calc + Nat.card (Delta ⧸ P.subgroupOf Delta) = + Nat.card Gal(E/K) := + Nat.card_congr eQuotient.toEquiv + _ = (n : ℕ) ^ r := by + rw [Nat.card_congr eG.toEquiv, Nat.card_pi] + simp + exact hDeltaCard + +open scoped Classical in +/-- For the Kummer-selected primes, localization from the enlarged `S`-unit +group onto the product of integral-unit power quotients is +surjective. The proof compares the actual Kummer radical quotient with +`Gal(E/K)` and uses the local unit-index formula only at the end. -/ +theorem sUnitLocalUnitPowerMap_sUnitKummerPrimeSet_surjective + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let T := + sUnitKummerPrimeSet + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S + let hST : Disjoint S' T := + (sUnitKummerPrimeSet_disjoint_enlargeByFiniteKummerRadicalSupport + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S).symm + Function.Surjective + (sUnitLocalUnitPowerMap (K := K) n S' T hST) := by + classical + dsimp only + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let T := + sUnitKummerPrimeSet + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S + let hST : Disjoint S' T := + (sUnitKummerPrimeSet_disjoint_enlargeByFiniteKummerRadicalSupport + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S).symm + let LocalPowerTarget : Type := + ∀ w : T, + (w.1.adicCompletionIntegers K)ˣ ⧸ + (powMonoidHom (n : ℕ) : + (w.1.adicCompletionIntegers K)ˣ →* + (w.1.adicCompletionIntegers K)ˣ).range + let f : SUnitGroup (K := K) S' →* LocalPowerTarget := + sUnitLocalUnitPowerMap (K := K) n S' T hST + let rangeF : Subgroup LocalPowerTarget := + MonoidHom.range + (G := SUnitGroup (K := K) S') (N := LocalPowerTarget) f + let SU : Subgroup Kˣ := + SUnitGroup (K := K) S' + let Delta : Subgroup SU := + sUnitLocalPowerKernel (K := K) n S' T + let P : Subgroup SU := + (powMonoidHom (n : ℕ) : SU →* SU).range + change Function.Surjective f + have hnOne : 1 < (n : ℕ) := by + rw [hn] + calc + 1 < p := hp.one_lt + _ = p ^ 1 := (pow_one p).symm + _ ≤ p ^ v := + Nat.pow_le_pow_right hp.pos + (Nat.succ_le_iff.mpr hv) + have hDeltaCard := card_sUnitLocalPowerKernel_on_kummerPrimeSet + (K := K) E n hmu p v hp hv hn r eG S + have hPLe : P ≤ Delta := + nthPowerSubgroup_le_sUnitLocalPowerKernel + (K := K) n S' T + have hRel : + P.relIndex Delta = (n : ℕ) ^ r := by + change + Nat.card + (Delta ⧸ + sUnitLocalPowerKernelNthPowers + (K := K) n S' T) = + (n : ℕ) ^ r + exact hDeltaCard + have hPIndex : + P.index = + (n : ℕ) ^ totalPlaceCard (K := K) S' := by + change + Nat.card + (SUnitGroup (K := K) S' ⧸ + (powMonoidHom (n : ℕ) : + SUnitGroup (K := K) S' →* + SUnitGroup (K := K) S').range) = + (n : ℕ) ^ totalPlaceCard (K := K) S' + exact + card_sUnit_nthPowerQuotient + (K := K) S' n hmu + have hIndexFactor : + (n : ℕ) ^ r * Delta.index = + (n : ℕ) ^ totalPlaceCard (K := K) S' := by + rw [← hRel, ← hPIndex] + exact Subgroup.relIndex_mul_index hPLe + have hr : + r ≤ totalPlaceCard (K := K) S' := + galoisRank_le_totalPlaceCard_enlargedS + (K := K) (Omega := Omega) E n hnOne hmu + r eG S + have hsplit : + (n : ℕ) ^ totalPlaceCard (K := K) S' = + (n : ℕ) ^ r * + (n : ℕ) ^ + (totalPlaceCard (K := K) S' - r) := by + rw [← pow_add, Nat.add_sub_of_le hr] + have hDeltaIndex : + Delta.index = + (n : ℕ) ^ + (totalPlaceCard (K := K) S' - r) := by + have hcancel : + (n : ℕ) ^ r * Delta.index = + (n : ℕ) ^ r * + (n : ℕ) ^ + (totalPlaceCard (K := K) S' - r) := + hIndexFactor.trans hsplit + exact + Nat.eq_of_mul_eq_mul_left + (pow_pos n.pos r) hcancel + have hfker : + f.ker = Delta := by + change + (sUnitLocalUnitPowerMap + (K := K) n S' T hST).ker = + sUnitLocalPowerKernel (K := K) n S' T + exact + sUnitLocalUnitPowerMap_ker + (K := K) n S' T hST + have hRangeCard : + Nat.card rangeF = + (n : ℕ) ^ + (totalPlaceCard (K := K) S' - r) := by + rw [← Subgroup.index_ker + (G := SUnitGroup (K := K) S') (G' := LocalPowerTarget) f, hfker] + exact hDeltaIndex + have hLocalCard (w : T) := card_adicIntegralUnitPowerQuotient n hmu w.1 (by + have hw := w.2 + change w.1 ∈ sUnitKummerPrimeSet + (K := K) (Omega := Omega) E n hmu p v hp hv hn r eG S at hw + rw [sUnitKummerPrimeSet, Finset.mem_image] at hw + obtain ⟨i, _hi, hi⟩ := hw + rw [← hi] + exact sUnitKummerChosenBasePlaces_valuation_natCast_eq_one + (K := K) (Omega := Omega) E n hmu p v hp hv hn r eG S i) + have hTcard : + T.card = + sUnitKummerPrimeCount + (K := K) E n hmu r S := + sUnitKummerPrimeSet_card + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S + have hTargetCard : + Nat.card + (∀ w : T, + (w.1.adicCompletionIntegers K)ˣ ⧸ + (powMonoidHom (n : ℕ) : + (w.1.adicCompletionIntegers K)ˣ →* + (w.1.adicCompletionIntegers K)ˣ).range) = + (n : ℕ) ^ + (totalPlaceCard (K := K) S' - r) := by + rw [Nat.card_pi] + calc + (∏ w : T, + Nat.card + ((w.1.adicCompletionIntegers K)ˣ ⧸ + (powMonoidHom (n : ℕ) : + (w.1.adicCompletionIntegers K)ˣ →* + (w.1.adicCompletionIntegers K)ˣ).range)) = + ∏ _w : T, (n : ℕ) := by + apply Finset.prod_congr rfl + intro w _ + exact hLocalCard w + _ = (n : ℕ) ^ T.card := by + simp + _ = + (n : ℕ) ^ + (totalPlaceCard (K := K) S' - r) := by + rw [hTcard] + rfl + let : Finite rangeF := + Nat.finite_of_card_ne_zero (by + rw [hRangeCard] + exact pow_ne_zero _ n.ne_zero) + have hRangeTop : + rangeF = ⊤ := + Subgroup.eq_top_of_card_eq rangeF + (hRangeCard.trans hTargetCard.symm) + exact + (MonoidHom.range_eq_top + (G := SUnitGroup (K := K) S') (N := LocalPowerTarget) (f := f)).mp hRangeTop + +end GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SupportedIdelePowerLocalUnitQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SupportedIdelePowerLocalUnitQuotient.lean new file mode 100644 index 0000000000..4b553d41dd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SupportedIdelePowerLocalUnitQuotient.lean @@ -0,0 +1,315 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation +/-! +# Supported idele power-local-unit quotient + +This module restricts the power-local-unit subgroup to ideles supported at +the prescribed finite places and identifies the resulting quotient with the +product of its archimedean and finite local power-class groups. +-/ + +@[expose] public section + +open scoped NumberField NNReal IsMulCommutative +open NumberField IsDedekindDomain +open KummerTheory + +noncomputable +section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +variable {K : Type*} [Field K] [NumberField K] + +open scoped Classical in +/-- A surjective homomorphism identifies the quotient by its specified kernel with the target. -/ +noncomputable def quotientEquivOfSurjectiveWithKernel + {G H : Type*} [Group G] [Group H] + (f : G →* H) + (N : Subgroup G) [N.Normal] + (hf : Function.Surjective f) + (hker : f.ker = N) : + G ⧸ N ≃* H := + (QuotientGroup.quotientMulEquivOfEq hker.symm).trans + (QuotientGroup.quotientKerEquivOfSurjective f hf) + +open scoped Classical in +/-- The power/local-unit subgroup `h(S,T)`, regarded inside +`I_K^{S ∪ T}`. -/ +def supportedIdelePowerLocalUnitSubgroup + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + Subgroup + (IdeleGroup.supportedAt + (K := K) (S ∪ T : Set (HeightOneSpectrum (𝓞 K)))) := + (idelePowerLocalUnitSubgroup (K := K) n S T).comap + (IdeleGroup.supportedAt + (K := K) (S ∪ T : Set (HeightOneSpectrum (𝓞 K)))).subtype + +open scoped Classical in +/-- Membership in `h(S,T)` automatically supplies the restricted-product +condition defining `I_K^{S ∪ T}`. -/ +theorem idelePowerLocalUnitSubgroup_le_supportedAt + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + idelePowerLocalUnitSubgroup (K := K) n S T ≤ + IdeleGroup.supportedAt + (K := K) (S ∪ T : Set (HeightOneSpectrum (𝓞 K))) := by + intro a ha + rw [IdeleGroup.mem_supportedAt_iff] + intro v hv + apply + ((mem_idelePowerLocalUnitSubgroup_iff + (K := K) n S T a).mp ha).2.2 v + simpa using hv + +open scoped Classical in +/-- Reduction modulo local `n`-th powers at all infinite places and at the +finite places in `S`. The coordinates in `T` and the integral coordinates +away from `S ∪ T` disappear in the supported-idele index calculation. -/ +def supportedIdelePowerClassMap + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + IdeleGroup.supportedAt + (K := K) (S ∪ T : Set (HeightOneSpectrum (𝓞 K))) →* + (( + ∀ w : InfinitePlace K, + w.Completionˣ ⧸ + (powMonoidHom (n : ℕ) : + w.Completionˣ →* w.Completionˣ).range) × + (∀ v : ↥S, + (v.1.adicCompletion K)ˣ ⧸ + (powMonoidHom (n : ℕ) : + (v.1.adicCompletion K)ˣ →* + (v.1.adicCompletion K)ˣ).range)) where + toFun a := + (fun w => + QuotientGroup.mk' + (powMonoidHom (n : ℕ) : + w.Completionˣ →* w.Completionˣ).range + (IdeleGroup.infiniteComponent w a.1), + fun v => + QuotientGroup.mk' + (powMonoidHom (n : ℕ) : + (v.1.adicCompletion K)ˣ →* + (v.1.adicCompletion K)ˣ).range + (IdeleGroup.finiteComponent v.1 a.1)) + map_one' := by + apply Prod.ext + · funext w + apply (QuotientGroup.eq_one_iff _).mpr + apply + (MonoidHom.mem_range + (G := w.Completionˣ)).mpr + refine ⟨1, ?_⟩ + rw [powMonoidHom_apply, one_pow] + exact (IdeleGroup.infiniteComponent w).map_one.symm + · funext v + simp + map_mul' a b := by + apply Prod.ext + · funext w + change + QuotientGroup.mk' + (powMonoidHom (n : ℕ) : + w.Completionˣ →* w.Completionˣ).range + (IdeleGroup.infiniteComponent w (a.1 * b.1)) = + QuotientGroup.mk' + (powMonoidHom (n : ℕ) : + w.Completionˣ →* w.Completionˣ).range + (IdeleGroup.infiniteComponent w a.1) * + QuotientGroup.mk' + (powMonoidHom (n : ℕ) : + w.Completionˣ →* w.Completionˣ).range + (IdeleGroup.infiniteComponent w b.1) + rw [map_mul, map_mul] + · funext v + simp + +open scoped Classical in +/-- The kernel of the local-power class map is precisely `h(S,T)` inside +`I_K^{S ∪ T}`. -/ +theorem supportedIdelePowerClassMap_ker + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + (supportedIdelePowerClassMap (K := K) n S T).ker = + supportedIdelePowerLocalUnitSubgroup (K := K) n S T := by + ext a + rw [MonoidHom.mem_ker] + constructor + · intro ha + rw [supportedIdelePowerLocalUnitSubgroup, + Subgroup.mem_comap, + mem_idelePowerLocalUnitSubgroup_iff] + refine ⟨?_, ?_, ?_⟩ + · intro w + have hw := congrArg (fun q => q.1 w) ha + rw [Prod.fst_one, Pi.one_apply] at hw + exact (QuotientGroup.eq_one_iff _).mp hw + · intro v hv + let vS : ↥S := ⟨v, hv⟩ + have hvq := congrArg (fun q => q.2 vS) ha + rw [Prod.snd_one, Pi.one_apply] at hvq + exact (QuotientGroup.eq_one_iff _).mp hvq + · intro v hv + have hv' : + v ∉ (S ∪ T : Set (HeightOneSpectrum (𝓞 K))) := by + simpa using hv + exact + (IdeleGroup.mem_supportedAt_iff + (K := K) + (S ∪ T : Set (HeightOneSpectrum (𝓞 K))) a.1).mp + a.2 v hv' + · intro ha + rw [supportedIdelePowerLocalUnitSubgroup, + Subgroup.mem_comap, + mem_idelePowerLocalUnitSubgroup_iff] at ha + apply Prod.ext + · funext w + exact (QuotientGroup.eq_one_iff _).mpr (ha.1 w) + · funext v + exact (QuotientGroup.eq_one_iff _).mpr + (ha.2.1 v.1 v.2) + +open scoped Classical in +/-- The local-power class map is onto: choose representatives independently +at the finitely many constrained finite places and at all archimedean +places, then extend the finite family by `1`. -/ +theorem supportedIdelePowerClassMap_surjective + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + Function.Surjective + (supportedIdelePowerClassMap (K := K) n S T) := by + intro q + choose aInf hInf using fun w : InfinitePlace K => + QuotientGroup.mk_surjective (q.1 w) + choose aS hS using fun v : ↥S => + QuotientGroup.mk_surjective (q.2 v) + let alpha : IdeleGroup K := + (ContinuousMulEquiv.piUnits.symm aInf, + IdeleGroup.finiteIdeleOfFinset S aS) + have hAlpha : + alpha ∈ + IdeleGroup.supportedAt + (K := K) (S ∪ T : Set (HeightOneSpectrum (𝓞 K))) := by + rw [IdeleGroup.mem_supportedAt_iff] + intro v hv + have hvS : v ∉ S := by + intro hvS + apply hv + exact Or.inl hvS + change + IdeleGroup.finiteIdeleOfFinset S aS v ∈ + (v.adicCompletionIntegers K).units + rw [IdeleGroup.finiteIdeleOfFinset_apply_notMem S aS v hvS] + exact Subgroup.one_mem _ + refine ⟨⟨alpha, hAlpha⟩, ?_⟩ + apply Prod.ext + · funext w + calc + QuotientGroup.mk' + (powMonoidHom (n : ℕ) : + w.Completionˣ →* w.Completionˣ).range + (IdeleGroup.infiniteComponent w alpha) = + QuotientGroup.mk' + (powMonoidHom (n : ℕ) : + w.Completionˣ →* w.Completionˣ).range + (aInf w) := by + apply congrArg + change + ContinuousMulEquiv.piUnits + (ContinuousMulEquiv.piUnits.symm aInf) w = + aInf w + exact congrFun + (ContinuousMulEquiv.piUnits.apply_symm_apply aInf) w + _ = q.1 w := hInf w + · funext v + calc + QuotientGroup.mk' + (powMonoidHom (n : ℕ) : + (v.1.adicCompletion K)ˣ →* + (v.1.adicCompletion K)ˣ).range + (IdeleGroup.finiteComponent v.1 alpha) = + QuotientGroup.mk' + (powMonoidHom (n : ℕ) : + (v.1.adicCompletion K)ˣ →* + (v.1.adicCompletion K)ˣ).range + (aS v) := by + apply congrArg + exact IdeleGroup.finiteIdeleOfFinset_apply_mem S aS v + _ = q.2 v := hS v + +open scoped Classical in +/-- The algebraic supported-idele index decomposition: + +`I_K^{S ∪ T} / h(S,T)` is the product of the local `n`-power class +groups at all infinite places and at the finite places in `S`. -/ +noncomputable def supportedIdeleQuotientEquivLocalPowerClasses + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + IdeleGroup.supportedAt + (K := K) (S ∪ T : Set (HeightOneSpectrum (𝓞 K))) ⧸ + supportedIdelePowerLocalUnitSubgroup (K := K) n S T ≃* + (( + ∀ w : InfinitePlace K, + w.Completionˣ ⧸ + (powMonoidHom (n : ℕ) : + w.Completionˣ →* w.Completionˣ).range) × + (∀ v : ↥S, + (v.1.adicCompletion K)ˣ ⧸ + (powMonoidHom (n : ℕ) : + (v.1.adicCompletion K)ˣ →* + (v.1.adicCompletion K)ˣ).range)) := + quotientEquivOfSurjectiveWithKernel + (H := + (( + ∀ w : InfinitePlace K, + w.Completionˣ ⧸ + (powMonoidHom (n : ℕ) : + w.Completionˣ →* w.Completionˣ).range) × + (∀ v : ↥S, + (v.1.adicCompletion K)ˣ ⧸ + (powMonoidHom (n : ℕ) : + (v.1.adicCompletion K)ˣ →* + (v.1.adicCompletion K)ˣ).range))) + (supportedIdelePowerClassMap (K := K) n S T) + (supportedIdelePowerLocalUnitSubgroup (K := K) n S T) + (supportedIdelePowerClassMap_surjective (K := K) n S T) + (supportedIdelePowerClassMap_ker (K := K) n S T) + +open scoped Classical in +/-- Cardinal form of the supported-idele index decomposition. The subsequent +local power-index and product-formula calculation evaluates the right-hand +side. -/ +theorem card_supportedIdeleQuotient_eq_localPowerClasses + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + Nat.card + (IdeleGroup.supportedAt + (K := K) (S ∪ T : Set (HeightOneSpectrum (𝓞 K))) ⧸ + supportedIdelePowerLocalUnitSubgroup (K := K) n S T) = + Nat.card + (( + ∀ w : InfinitePlace K, + w.Completionˣ ⧸ + (powMonoidHom (n : ℕ) : + w.Completionˣ →* w.Completionˣ).range) × + (∀ v : ↥S, + (v.1.adicCompletion K)ˣ ⧸ + (powMonoidHom (n : ℕ) : + (v.1.adicCompletion K)ˣ →* + (v.1.adicCompletion K)ˣ).range)) := + Nat.card_congr + (supportedIdeleQuotientEquivLocalPowerClasses + (K := K) n S T).toEquiv + + +end GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology.lean new file mode 100644 index 0000000000..9971dd26a7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CofinitelySplitFiniteExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CyclicPrimePowerFullDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.IdeleClassHerbrandSupportedFinal + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/All.lean new file mode 100644 index 0000000000..070e1bc320 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/All.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CofinitelySplitFiniteExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CyclicPrimePowerFullDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.IdeleClassHerbrandSupportedFinal +/-! +# Cohomological tools for global class field theory +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CofinitelySplitFiniteExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CofinitelySplitFiniteExtension.lean new file mode 100644 index 0000000000..eba59f1d1d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CofinitelySplitFiniteExtension.lean @@ -0,0 +1,143 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.NormalClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.PrimeOrderFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CyclicPrimePowerFullDecomposition +/-! +# Cofinitely split finite extensions are trivial + +For a finite extension of number fields `L / K`, if all but finitely +many finite places of `K` split completely in `L`, then `L / K` has +degree one. The normal-closure and splitting-transport constructions +used in the proof live in their general algebraic-number-theory +modules; this file contains only the global class-field-theoretic +conclusion. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Cohomology + +variable + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + +open scoped Classical in +/-- If all but finitely many finite places of `K` split completely in +the finite extension `L / K`, then the extension has degree one. + +The proof passes to the finite normal closure `M`. If `M / K` were +nontrivial, a prime-order automorphism would give an intermediate field +`K'` for which `M / K'` is cyclic of prime degree. The infinitude of +full-decomposition places in cyclic prime-degree extensions then supplies +infinitely many nonsplitting places of `K'`, contradicting the finiteness +transported from `M / K`. -/ +theorem finrank_eq_one_of_finite_nonSplittingPlaces + (hfinite : + {v : HeightOneSpectrum (𝓞 K) | + ¬ FinitePlaceSplitsCompletelyInExtension + (K := K) (E := L) v}.Finite) : + Module.finrank K L = 1 := by + let M := finiteNormalClosure K L + let : NumberField M := + finiteNormalClosure_numberField K L + let : IsGalois K M := + finiteNormalClosure_isGalois K L + have hfiniteM : + {v : HeightOneSpectrum (𝓞 K) | + ¬ FinitePlaceSplitsCompletely + (K := K) (L := M) v}.Finite := by + simpa only [M] using + finite_nonSplittingPlaces_normalClosure_of_original + K L hfinite + have hdegreeM : Module.finrank K M = 1 := by + by_contra hne + have hgt : 1 < Module.finrank K M := by + have hpos : 0 < Module.finrank K M := + Module.finrank_pos + omega + let K' := + primeOrderFixedField + (K := K) (L := M) hgt + let p := + fixedFieldPrime + (K := K) (L := M) hgt + have hp : p.Prime := by + simpa only [p] using + fixedFieldPrime_prime + (K := K) (L := M) hgt + have hrelativeDegree : + Module.finrank K' M = p := by + simpa only [K', p] using + primeOrderFixedField_finrank + (K := K) (L := M) hgt + have hrelativeNontrivial : + 1 < Module.finrank K' M := by + rw [hrelativeDegree] + exact hp.one_lt + have hcard : + Nat.card (M ≃ₐ[K'] M) = p ^ 1 := by + calc + Nat.card (M ≃ₐ[K'] M) = p := by + simpa only [K', p] using + primeOrderFixedField_card_aut + (K := K) (L := M) hgt + _ = p ^ 1 := by simp + have hinfinite : + Set.Infinite + {v : HeightOneSpectrum (𝓞 K') | + finitePlaceDecompositionGroup + (K := K') (L := M) v = ⊤} := + cyclic_prime_power_infinite_fullDecompositionPlaces + (K := K') (L := M) + hp (by omega) hcard + have hfiniteRelative : + {v : HeightOneSpectrum (𝓞 K') | + ¬ FinitePlaceSplitsCompletely + (K := K') (L := M) v}.Finite := + finite_nonsplittingPlaces_over_intermediate + (K := K) (M := K') (L := M) hfiniteM + apply hinfinite + apply hfiniteRelative.subset + intro v hv + exact + finitePlace_not_splitsCompletely_of_decompositionGroup_eq_top + (K := K') (L := M) + hrelativeNontrivial v hv + have hle : + Module.finrank K L ≤ Module.finrank K M := by + simpa only [M] using finrank_le_finiteNormalClosure K L + have hpos : 0 < Module.finrank K L := + Module.finrank_pos + omega + +open scoped Classical in +/-- Algebra-equivalence form of the degree-one conclusion, expressing +that `L` is the base field without identifying the two Lean types +definitionally. -/ +noncomputable def algEquivBaseOfFiniteNonSplittingPlaces + (hfinite : + {v : HeightOneSpectrum (𝓞 K) | + ¬ FinitePlaceSplitsCompletelyInExtension + (K := K) (E := L) v}.Finite) : + L ≃ₐ[K] K := + algEquivBaseOfFinrankEqOne K L + (finrank_eq_one_of_finite_nonSplittingPlaces K L hfinite) + +end Cohomology +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CyclicPrimePowerFullDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CyclicPrimePowerFullDecomposition.lean new file mode 100644 index 0000000000..1d9864a7fb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CyclicPrimePowerFullDecomposition.lean @@ -0,0 +1,414 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.IdeleClassHerbrandSupportedFinal +/-! +# Full decomposition places in cyclic prime-power extensions + +This file proves the infinitude of full-decomposition places in cyclic +prime-power extensions. For a cyclic group of prime-power order, every +proper subgroup is contained in the +chosen subgroup of index `p`. Consequently every finite place whose +decomposition group is proper splits completely in the chosen +degree-`p` subextension. + +The second part records the idelic approximation argument: if all +finite places outside a finite set split completely, then the idele +class norm is surjective. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +open RelativeIdeleGroup.Cohomology + +namespace GlobalClassFieldTheory +namespace Cohomology + +open AlgebraicNumberTheory.Valuations +open HilbertRamification + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [IsCyclic (L ≃ₐ[K] L)] + +omit [NumberField L] in +open scoped Classical in +/-- A proper decomposition group in the original cyclic +prime-power extension becomes trivial in the chosen degree-`p` +subextension. -/ +theorem + cyclicPrimeSubextensionDecompositionGroup_eq_bot_of_ne_top + {p exponent : ℕ} + (hp : p.Prime) + (hexponent : 0 < exponent) + (hcard : Nat.card (L ≃ₐ[K] L) = p ^ exponent) + (v : HeightOneSpectrum (𝓞 K)) + (hproper : + finitePlaceDecompositionGroup + (K := K) (L := L) v ≠ ⊤) : + cyclicPrimeSubextensionDecompositionGroup + (K := K) (L := L) + hp hexponent hcard v = ⊥ := by + let P := + cyclicPrimeIndexSubgroup + (K := K) (L := L) + hp hexponent hcard + let : P.Normal := + cyclicPrimeIndexSubgroup_normal + (K := K) (L := L) + hp hexponent hcard + have hDP : + finitePlaceDecompositionGroup + (K := K) (L := L) v ≤ P := + subgroup_le_index_prime_subgroup_of_ne_top_cyclic_prime_power + hp hcard P + (finitePlaceDecompositionGroup + (K := K) (L := L) v) + (cyclicPrimeIndexSubgroup_index + (K := K) (L := L) + hp hexponent hcard) + hproper + have hquot : + finitePlaceDecompositionGroupInQuotient + (K := K) (L := L) v P = ⊥ := + (finitePlaceDecompositionGroupInQuotient_eq_bot_iff + (K := K) (L := L) v P).2 hDP + rw [ + cyclicPrimeSubextensionDecompositionGroup_eq_quotient_image + (K := K) (L := L) hp hexponent hcard v, + hquot] + exact Subgroup.map_bot _ + +omit [NumberField L] in +open scoped Classical in +/-- Every place with proper decomposition group in `L / K` splits +completely, in the standard chosen-extension sense, in the actual +degree-`p` fixed subextension. -/ +theorem + finitePlaceSplitsCompletely_in_cyclicPrimeSubextension_of_decompositionGroup_ne_top + {p exponent : ℕ} + (hp : p.Prime) + (hexponent : 0 < exponent) + (hcard : Nat.card (L ≃ₐ[K] L) = p ^ exponent) + (v : HeightOneSpectrum (𝓞 K)) + (hproper : + finitePlaceDecompositionGroup + (K := K) (L := L) v ≠ ⊤) : + FinitePlaceSplitsCompletely + (K := K) + (L := cyclicPrimeSubextension + (K := K) (L := L) + hp hexponent hcard) v := by + let M := + cyclicPrimeSubextension + (K := K) (L := L) + hp hexponent hcard + let : IsGalois K M := + cyclicPrimeSubextension_isGalois + (K := K) (L := L) + hp hexponent hcard + let vK := + NumberField.HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let w := + chosenFinitePlaceExtension (L := L) v + let wM := + restrictAbsoluteValueExtensionToIntermediate + vK w M + have hcustom : + cyclicPrimeSubextensionDecompositionGroup + (K := K) (L := L) + hp hexponent hcard v = ⊥ := + cyclicPrimeSubextensionDecompositionGroup_eq_bot_of_ne_top + (K := K) (L := L) + hp hexponent hcard v hproper + have hwMbot : + absoluteValueDecompositionGroup K wM.1 = ⊥ := by + change + absoluteValueDecompositionGroup K + (w.1.comp (f := algebraMap M L) + (algebraMap M L).injective) = ⊥ + rw [← absoluteValueDecompositionGroup_map_restrictNormalHom + (M := M) vK hvK w] + exact hcustom + change + absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension + (L := M) v).1 = ⊥ + exact + absoluteValueDecompositionGroup_eq_bot_independent_extension + vK hvK wM + (chosenFinitePlaceExtension (L := M) v) + hwMbot + +open scoped Classical in +/-- If every finite place outside a finite set splits completely, then +idelic approximation shows that every idele class is a norm. -/ +theorem ideleClassNorm_range_eq_top_of_splitsCompletely_outside + {E : Type} + [Field E] [NumberField E] [Algebra K E] + [FiniteDimensional K E] [IsGalois K E] + (S : Finset (HeightOneSpectrum (𝓞 K))) + (hsplit : + ∀ v : HeightOneSpectrum (𝓞 K), v ∉ S → + FinitePlaceSplitsCompletely + (K := K) (L := E) v) : + (RelativeIdeleGroup.Cohomology.ideleClassNorm K E).range = ⊤ := by + apply top_unique + intro c _ + obtain ⟨a, rfl⟩ := + QuotientGroup.mk'_surjective + (IdeleGroup.principalSubgroup K) c + obtain ⟨x, hfinite, hinfinite⟩ := + exists_principal_quotient_locallyNormEverywhere_of_splitsOutside + (K := K) (L := E) S hsplit a + let b : IdeleGroup K := + a * (IdeleGroup.principalIdele K x)⁻¹ + have hInfinite : + ∀ w : InfinitePlace K, + IdeleGroup.infiniteComponent w b ∈ + infiniteTensorNormSubgroup + (K := K) (L := E) w := by + intro w + change + IdeleGroup.infiniteComponent w + (a * (IdeleGroup.principalIdele K x)⁻¹) ∈ + infiniteTensorNormSubgroup + (K := K) (L := E) w + rw [map_mul, map_inv] + exact hinfinite w + have hFinite : + ∀ v : HeightOneSpectrum (𝓞 K), + IdeleGroup.finiteComponent v b ∈ + (_root_.localTensorNorm + (K := K) (L := E) v).range := by + intro v + rw [ + finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup + (K := K) (L := E) v] + simpa [b] using hfinite v + have hb : + b ∈ (RelativeIdeleGroup.norm K E).range := + (mem_relativeIdeleNorm_range_iff_localTensorNorms + (K := K) (L := E) b).2 ⟨hInfinite, hFinite⟩ + obtain ⟨z, hz⟩ := hb + refine + ⟨QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K E) z, ?_⟩ + rw [RelativeIdeleGroup.Cohomology.ideleClassNorm_mk, hz] + change + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) b = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a + have hp : + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (IdeleGroup.principalIdele K x) = 1 := + (QuotientGroup.eq_one_iff + (IdeleGroup.principalIdele K x)).2 ⟨x, rfl⟩ + change + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (a * (IdeleGroup.principalIdele K x)⁻¹) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a + rw [map_mul, map_inv, hp] + exact + mul_one + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) + +open scoped Classical in +/-- The preceding surjectivity says that the idele-class norm index is +one. -/ +theorem ideleClassNorm_index_eq_one_of_splitsCompletely_outside + {E : Type} + [Field E] [NumberField E] [Algebra K E] + [FiniteDimensional K E] [IsGalois K E] + (S : Finset (HeightOneSpectrum (𝓞 K))) + (hsplit : + ∀ v : HeightOneSpectrum (𝓞 K), v ∉ S → + FinitePlaceSplitsCompletely + (K := K) (L := E) v) : + (RelativeIdeleGroup.Cohomology.ideleClassNorm K E).range.index = 1 := by + rw [ + ideleClassNorm_range_eq_top_of_splitsCompletely_outside + (K := K) (E := E) S hsplit, + Subgroup.index_top] + +open scoped Classical in +/-- Assuming the norm-index lower bound for the chosen prime-degree +subextension, the set of finite places whose decomposition group is the +whole Galois group is infinite. -/ +theorem + cyclic_prime_power_fullDecompositionPlaces_infinite_of_primeSubextension_normIndex + {p exponent : ℕ} + (hp : p.Prime) + (hexponent : 0 < exponent) + (hcard : Nat.card (L ≃ₐ[K] L) = p ^ exponent) + (hLower : + p ≤ + (RelativeIdeleGroup.Cohomology.ideleClassNorm K + (cyclicPrimeSubextension + (K := K) (L := L) + hp hexponent hcard)).range.index) : + Set.Infinite + {v : HeightOneSpectrum (𝓞 K) | + finitePlaceDecompositionGroup + (K := K) (L := L) v = ⊤} := by + intro hfinite + let S : Finset (HeightOneSpectrum (𝓞 K)) := + hfinite.toFinset + have hsplit : + ∀ v : HeightOneSpectrum (𝓞 K), v ∉ S → + FinitePlaceSplitsCompletely + (K := K) + (L := cyclicPrimeSubextension + (K := K) (L := L) + hp hexponent hcard) v := by + intro v hv + apply + finitePlaceSplitsCompletely_in_cyclicPrimeSubextension_of_decompositionGroup_ne_top + (K := K) (L := L) + hp hexponent hcard v + intro htop + apply hv + simp [S, htop] + have hindex : + (RelativeIdeleGroup.Cohomology.ideleClassNorm K + (cyclicPrimeSubextension + (K := K) (L := L) + hp hexponent hcard)).range.index = 1 := + ideleClassNorm_index_eq_one_of_splitsCompletely_outside + (K := K) + (E := cyclicPrimeSubextension + (K := K) (L := L) + hp hexponent hcard) + S hsplit + have hp_le_one : p ≤ 1 := by + simpa [hindex] using hLower + exact (Nat.not_lt_of_ge hp_le_one) hp.one_lt + +open scoped Classical in +/-- In a cyclic extension of prime-power degree, infinitely many finite +places have full decomposition group. The norm-index input in the +preceding theorem is supplied by the unconditional lower bound for the +chosen degree-`p` subextension. -/ +theorem cyclic_prime_power_infinite_fullDecompositionPlaces + {p exponent : ℕ} + (hp : p.Prime) + (hexponent : 0 < exponent) + (hcard : Nat.card (L ≃ₐ[K] L) = p ^ exponent) : + Set.Infinite + {v : HeightOneSpectrum (𝓞 K) | + finitePlaceDecompositionGroup + (K := K) (L := L) v = ⊤} := by + let M := + cyclicPrimeSubextension + (K := K) (L := L) + hp hexponent hcard + let : IsGalois K M := + cyclicPrimeSubextension_isGalois + (K := K) (L := L) + hp hexponent hcard + let : IsCyclic (M ≃ₐ[K] M) := by + simpa [M] using + cyclicPrimeSubextension_isCyclic + (K := K) (L := L) + hp hexponent hcard + obtain ⟨σ, hσ⟩ := + IsCyclic.exists_generator (α := M ≃ₐ[K] M) + have hLowerM : + Module.finrank K M ≤ + (RelativeIdeleGroup.Cohomology.ideleClassNorm K M).range.index := + finrank_le_ideleClassNorm_index + (K := K) (L := M) σ hσ + have hDegree : Module.finrank K M = p := by + simpa [M] using + cyclicPrimeSubextension_finrank + (K := K) (L := L) + hp hexponent hcard + apply + cyclic_prime_power_fullDecompositionPlaces_infinite_of_primeSubextension_normIndex + (K := K) (L := L) + hp hexponent hcard + simpa [M, hDegree] using hLowerM + +open scoped Classical in +/-- Finset-avoidance form of the conditional full-decomposition +infinitude result, convenient for recursively choosing new places. -/ +theorem + exists_fullDecompositionPlace_outside_finset_of_primeSubextension_normIndex + {p exponent : ℕ} + (hp : p.Prime) + (hexponent : 0 < exponent) + (hcard : Nat.card (L ≃ₐ[K] L) = p ^ exponent) + (hLower : + p ≤ + (RelativeIdeleGroup.Cohomology.ideleClassNorm K + (cyclicPrimeSubextension + (K := K) (L := L) + hp hexponent hcard)).range.index) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + ∃ v : HeightOneSpectrum (𝓞 K), + v ∉ S ∧ + finitePlaceDecompositionGroup + (K := K) (L := L) v = ⊤ := by + have hinfinite := + cyclic_prime_power_fullDecompositionPlaces_infinite_of_primeSubextension_normIndex + (K := K) (L := L) + hp hexponent hcard hLower + by_contra hexists + push Not at hexists + apply hinfinite + apply S.finite_toSet.subset + intro v hv + by_contra hvS + exact (hexists v hvS) hv + +open scoped Classical in +/-- Finset-avoidance form of the unconditional full-decomposition +infinitude theorem. -/ +theorem exists_fullDecompositionPlace_outside_finset + {p exponent : ℕ} + (hp : p.Prime) + (hexponent : 0 < exponent) + (hcard : Nat.card (L ≃ₐ[K] L) = p ^ exponent) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + ∃ v : HeightOneSpectrum (𝓞 K), + v ∉ S ∧ + finitePlaceDecompositionGroup + (K := K) (L := L) v = ⊤ := by + have hinfinite := + cyclic_prime_power_infinite_fullDecompositionPlaces + (K := K) (L := L) + hp hexponent hcard + by_contra hexists + push Not at hexists + apply hinfinite + apply S.finite_toSet.subset + intro v hv + by_contra hvS + exact (hexists v hvS) hv + +end Cohomology +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean new file mode 100644 index 0000000000..3543e997b5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean @@ -0,0 +1,1593 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Local +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyFinite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyCardinality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Factors +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Herbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.HerbrandExactSequence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +public import Mathlib.Algebra.BigOperators.GroupWithZero.Finset +/-! +# Supported ideles and the idele-class norm index + +This file joins the unrestricted local calculation, the vanishing of +the unramified integral factors outside the support, and the exact +sequence from `S`-units to supported ideles and idele classes. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + +open RelativeIdeleGroup.Cohomology + +namespace GlobalClassFieldTheory +namespace Cohomology + +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +open scoped Classical in +/-- Outside the canonical Herbrand support, the chosen completed local +extension is unramified. -/ +theorem + chosenFinitePlaceIsUnramified_of_notMem_ideleClassHerbrandSupport + (v : HeightOneSpectrum (𝓞 K)) + (hv : + v ∉ ideleClassHerbrandSupport (K := K) (L := L)) : + ChosenFinitePlaceIsUnramified + (K := K) (L := L) v := by + apply chosenFinitePlaceIsUnramified_of_isUnramifiedAt + (K := K) (L := L) v + apply isUnramifiedAt_of_notMem_ideleClassHerbrandSupport + (K := K) (L := L) v hv + exact + finitePlaceBelow_finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v) + +omit [NumberField L] in +open scoped Classical in +/-- If every chosen finite extension outside `S` is unramified, both +low-degree Tate cohomology groups of the product of its integral +factors are singletons. -/ +theorem + relativeOutsideSPlaceFactors_unramifiedHerbrand_subsingleton + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) + (hUnram : ∀ w : HeightOneSpectrum (𝓞 K), + w ∉ S → + ChosenFinitePlaceIsUnramified + (K := K) (L := L) w) : + letI := + relativeOutsideSPlaceFactorsAction + (K := K) (L := L) S + Subsingleton + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeOutsideSPlaceFactors + (K := K) (L := L) S)) ∧ + Subsingleton + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeOutsideSPlaceFactors + (K := K) (L := L) S) σ) := by + let componentAction : + ∀ w : {w : HeightOneSpectrum (𝓞 K) // w ∉ S}, + MulDistribMulAction (L ≃ₐ[K] L) + (relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w.1) := + fun w => + relativeLocalTensorDecompositionIntegralUnitSubgroupAction + (K := K) (L := L) w.1 + let outsideAction := + relativeOutsideSPlaceFactorsAction + (K := K) (L := L) S + let e0 : + HerbrandH0 (L ≃ₐ[K] L) + (RelativeOutsideSPlaceFactors + (K := K) (L := L) S) ≃* + ∀ w : {w : HeightOneSpectrum (𝓞 K) // w ∉ S}, + HerbrandH0 (L ≃ₐ[K] L) + (relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w.1) := + herbrandH0PiEquiv + (G := L ≃ₐ[K] L) + (fun w : {w : HeightOneSpectrum (𝓞 K) // w ∉ S} => + relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w.1) + let em : + HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeOutsideSPlaceFactors + (K := K) (L := L) S) σ ≃* + ∀ w : {w : HeightOneSpectrum (𝓞 K) // w ∉ S}, + HerbrandHMinusOne (L ≃ₐ[K] L) + (relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w.1) σ := + herbrandHMinusOnePiEquiv + (G := L ≃ₐ[K] L) + (fun w : {w : HeightOneSpectrum (𝓞 K) // w ∉ S} => + relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w.1) σ + constructor + · constructor + intro x y + apply e0.injective + funext w + let : + Subsingleton + (HerbrandH0 (L ≃ₐ[K] L) + (relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w.1)) := + relativeLocalTensorDecompositionIntegralUnitSubgroup_unramifiedHerbrandH0_subsingleton + (K := K) (L := L) w.1 σ hgen (hUnram w.1 w.2) + exact Subsingleton.elim _ _ + · constructor + intro x y + apply em.injective + funext w + let : + Subsingleton + (HerbrandHMinusOne (L ≃ₐ[K] L) + (relativeLocalTensorDecompositionIntegralUnitSubgroup + (K := K) (L := L) w.1) σ) := + relativeLocalTensorDecompositionIntegralUnitSubgroup_unramifiedHerbrandHMinusOne_subsingleton + (K := K) (L := L) w.1 σ hgen (hUnram w.1 w.2) + exact Subsingleton.elim _ _ + +omit [NumberField L] in +open scoped Classical in +/-- The product of integral factors outside an unramified support has +Herbrand quotient one. -/ +theorem + relativeOutsideSPlaceFactors_unramifiedHerbrandQuotient_eq_one + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) + (hUnram : ∀ w : HeightOneSpectrum (𝓞 K), + w ∉ S → + ChosenFinitePlaceIsUnramified + (K := K) (L := L) w) : + letI := + relativeOutsideSPlaceFactorsAction + (K := K) (L := L) S + ∃ _h : + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (RelativeOutsideSPlaceFactors + (K := K) (L := L) S) σ, + @herbrandQuotient + (L ≃ₐ[K] L) + (RelativeOutsideSPlaceFactors + (K := K) (L := L) S) + _ _ _ _ σ = 1 := by + let outsideAction := + relativeOutsideSPlaceFactorsAction + (K := K) (L := L) S + have hsub := + relativeOutsideSPlaceFactors_unramifiedHerbrand_subsingleton + (K := K) (L := L) S σ hgen hUnram + let h0Subsingleton := hsub.1 + let hmSubsingleton := hsub.2 + let h : + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (RelativeOutsideSPlaceFactors + (K := K) (L := L) S) σ := + ⟨Finite.of_subsingleton, Finite.of_subsingleton⟩ + refine ⟨h, ?_⟩ + let h0Finite := h.1 + let hmFinite := h.2 + let : Inhabited + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeOutsideSPlaceFactors + (K := K) (L := L) S)) := + ⟨1⟩ + let : Inhabited + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeOutsideSPlaceFactors + (K := K) (L := L) S) σ) := + ⟨1⟩ + let : Unique + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeOutsideSPlaceFactors + (K := K) (L := L) S)) := + Unique.mk' _ + let : Unique + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeOutsideSPlaceFactors + (K := K) (L := L) S) σ) := + Unique.mk' _ + rw [herbrandQuotient_eq_card_ratio, + Nat.card_unique, + Nat.card_unique] + norm_num + +open scoped Classical in +/-- After the unramified outside factors have been removed, the supported +relative ideles have Herbrand quotient equal to the product of the local +degrees at the unrestricted factors. -/ +theorem + relativeIdeleSupported_herbrandQuotient_eq_localDegreeProduct + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) + (hUnram : ∀ w : HeightOneSpectrum (𝓞 K), + w ∉ S → + ChosenFinitePlaceIsUnramified + (K := K) (L := L) w) : + letI := + relativeIdeleLocalTensorDecompositionSupportedSubgroupAction + (K := K) (L := L) S + ∃ _h : + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) σ, + @herbrandQuotient + (L ≃ₐ[K] L) + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) + _ _ _ _ σ = + ∏ i, + (relativeUnrestrictedSPlaceLocalDegree + (K := K) (L := L) S i : ℚ) := by + let supportedAction := + relativeIdeleLocalTensorDecompositionSupportedSubgroupAction + (K := K) (L := L) S + let unrestrictedAction := + relativeUnrestrictedSPlaceFactorsAction + (K := K) (L := L) S + let outsideAction := + relativeOutsideSPlaceFactorsAction + (K := K) (L := L) S + let hU : + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S) σ := + ⟨relativeUnrestrictedSPlaceFactorsHerbrandH0Finite + S σ hgen, + relativeUnrestrictedSPlaceFactorsHerbrandHMinusOneFinite + S σ hgen⟩ + obtain ⟨hO, hOq⟩ := + relativeOutsideSPlaceFactors_unramifiedHerbrandQuotient_eq_one + (K := K) (L := L) S σ hgen hUnram + let hU0 := hU.1 + let hUm := hU.2 + let hO0 := hO.1 + let hOm := hO.2 + let hProd0 : + Finite + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S × + RelativeOutsideSPlaceFactors + (K := K) (L := L) S)) := + herbrandH0ProdFinite _ _ + let hProdm : + Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S × + RelativeOutsideSPlaceFactors + (K := K) (L := L) S) σ) := + herbrandHMinusOneProdFinite _ _ σ + let e0 : + HerbrandH0 (L ≃ₐ[K] L) + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) ≃* + HerbrandH0 (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S × + RelativeOutsideSPlaceFactors + (K := K) (L := L) S) := + relativeIdeleSupportedHerbrandH0EquivUnrestrictedProdOutside + (K := K) (L := L) S + let em : + HerbrandHMinusOne (L ≃ₐ[K] L) + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) σ ≃* + HerbrandHMinusOne (L ≃ₐ[K] L) + (RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S × + RelativeOutsideSPlaceFactors + (K := K) (L := L) S) σ := + relativeIdeleSupportedHerbrandHMinusOneEquivUnrestrictedProdOutside + (K := K) (L := L) S σ + let hSupported : + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) σ := + ⟨Finite.of_equiv _ e0.symm.toEquiv, + Finite.of_equiv _ em.symm.toEquiv⟩ + refine ⟨hSupported, ?_⟩ + let hS0 := hSupported.1 + let hSm := hSupported.2 + calc + @herbrandQuotient + (L ≃ₐ[K] L) + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) + _ _ _ _ σ = + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := + RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S × + RelativeOutsideSPlaceFactors + (K := K) (L := L) S) σ := + herbrandQuotient_eq_of_equivariantMulEquiv + (relativeIdeleSupportedEquivUnrestrictedProdOutside + (K := K) (L := L) S) + (relativeIdeleSupportedEquivUnrestrictedProdOutside_smul + (K := K) (L := L) S) σ + _ = + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := RelativeUnrestrictedSPlaceFactors + (K := K) (L := L) S) σ * + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := RelativeOutsideSPlaceFactors + (K := K) (L := L) S) σ := + herbrandQuotient_prod _ _ σ + _ = + (∏ i, + (relativeUnrestrictedSPlaceLocalDegree + (K := K) (L := L) S i : ℚ)) * 1 := by + rw [ + relativeUnrestrictedSPlaceFactors_herbrandQuotient + (K := K) (L := L) S σ hgen, + hOq] + _ = + ∏ i, + (relativeUnrestrictedSPlaceLocalDegree + (K := K) (L := L) S i : ℚ) := mul_one _ + +open scoped Classical in +/-- The diagonal map from extension-field `S`-units directly into the +supported relative ideles. -/ +noncomputable def sUnitToRelativeIdeleSupported + (S : Finset (HeightOneSpectrum (𝓞 K))) : + SUnitGroup (K := L) + (finitePlacesAbove (K := K) (L := L) S) →* + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S := + ((RelativeIdeleGroup.principalSubgroup K L).subgroupOf + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S)).subtype.comp + (sUnitToRelativePrincipalSupportedIntersection + (K := K) (L := L) S) + +open scoped Classical in +/-- The restriction of the idele-class quotient map to the supported +relative ideles. -/ +noncomputable def relativeIdeleSupportedToClass + (S : Finset (HeightOneSpectrum (𝓞 K))) : + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S →* + RelativeIdeleGroup.ClassGroup K L := + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L)).comp + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S).subtype + +omit [IsGalois K L] in +open scoped Classical in +/-- Equivariance of the diagonal `S`-unit map into supported relative +ideles. -/ +theorem sUnitToRelativeIdeleSupported_equivariant + (S : Finset (HeightOneSpectrum (𝓞 K))) : + letI := + sUnitMulDistribMulAction K L + (finitePlacesAbove (K := K) (L := L) S) + (finitePlacesAbove_isGaloisStable + (K := K) (L := L) S) + letI := + relativeIdeleLocalTensorDecompositionSupportedSubgroupAction + (K := K) (L := L) S + ∀ (σ : L ≃ₐ[K] L) + (x : + SUnitGroup (K := L) + (finitePlacesAbove (K := K) (L := L) S)), + sUnitToRelativeIdeleSupported + (K := K) (L := L) S (σ • x) = + σ • + sUnitToRelativeIdeleSupported + (K := K) (L := L) S x := by + let sUnitAction := + sUnitMulDistribMulAction K L + (finitePlacesAbove (K := K) (L := L) S) + (finitePlacesAbove_isGaloisStable + (K := K) (L := L) S) + let supportedAction := + relativeIdeleLocalTensorDecompositionSupportedSubgroupAction + (K := K) (L := L) S + intro σ x + apply Subtype.ext + change + RelativeIdeleGroup.principalIdele K L + (((σ • x : + SUnitGroup (K := L) + (finitePlacesAbove (K := K) (L := L) S)) : + Lˣ)) = + σ • RelativeIdeleGroup.principalIdele K L (x : Lˣ) + rw [sUnit_smul_coe] + exact + (RelativeIdeleGroup.smul_principalIdele + K L σ (x : Lˣ)).symm + +omit [NumberField L] [IsGalois K L] in +open scoped Classical in +/-- Equivariance of the supported-idele quotient map. -/ +theorem relativeIdeleSupportedToClass_equivariant + (S : Finset (HeightOneSpectrum (𝓞 K))) : + letI := + relativeIdeleLocalTensorDecompositionSupportedSubgroupAction + (K := K) (L := L) S + letI := ideleClassMulDistribMulAction K L + ∀ (σ : L ≃ₐ[K] L) + (z : + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S), + relativeIdeleSupportedToClass + (K := K) (L := L) S (σ • z) = + σ • + relativeIdeleSupportedToClass + (K := K) (L := L) S z := by + let supportedAction := + relativeIdeleLocalTensorDecompositionSupportedSubgroupAction + (K := K) (L := L) S + let classAction := ideleClassMulDistribMulAction K L + intro σ z + change + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) + ((σ • z : + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) : + RelativeIdeleGroup K L) = + σ • + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) + (z : RelativeIdeleGroup K L) + rw [ + relativeIdeleLocalTensorDecompositionSupportedSubgroupAction_coe] + exact ideleClassQuotientMap_equivariant K L σ z + +omit [IsGalois K L] in +open scoped Classical in +/-- The diagonal `S`-unit map into supported relative ideles is +injective. -/ +theorem sUnitToRelativeIdeleSupported_injective + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Function.Injective + (sUnitToRelativeIdeleSupported + (K := K) (L := L) S) := by + intro x y hxy + apply + (sUnitEquivRelativePrincipalSupportedIntersection + (K := K) (L := L) S).injective + apply + ((RelativeIdeleGroup.principalSubgroup K L).subgroupOf + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S)).subtype_injective + exact hxy + +omit [NumberField L] [IsGalois K L] in +open scoped Classical in +/-- If the supported and principal relative ideles generate all +relative ideles, the restricted map to idele classes is surjective. -/ +theorem relativeIdeleSupportedToClass_surjective + (S : Finset (HeightOneSpectrum (𝓞 K))) + (hSP : + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S ⊔ + RelativeIdeleGroup.principalSubgroup K L = + ⊤) : + Function.Surjective + (relativeIdeleSupportedToClass + (K := K) (L := L) S) := by + intro q + refine q.inductionOn' ?_ + intro g + have hg : + g ∈ + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S ⊔ + RelativeIdeleGroup.principalSubgroup K L := by + rw [hSP] + exact Subgroup.mem_top g + rw [Subgroup.mem_sup] at hg + obtain ⟨s, hs, p, hp, hsp⟩ := hg + refine ⟨⟨s, hs⟩, ?_⟩ + change + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) s = + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) g + rw [← hsp, map_mul] + have hpone : + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) p = + 1 := + (QuotientGroup.eq_one_iff + (N := RelativeIdeleGroup.principalSubgroup K L) + (x := p)).2 hp + rw [hpone] + exact + (mul_one + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) s)).symm + +omit [IsGalois K L] in +open scoped Classical in +/-- Exactness at the supported relative ideles of +`S`-units → supported ideles → idele classes. -/ +theorem sUnit_supportedIdele_ideleClass_exact + (S : Finset (HeightOneSpectrum (𝓞 K))) : + ∀ z : + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S, + relativeIdeleSupportedToClass + (K := K) (L := L) S z = 1 ↔ + ∃ x : + SUnitGroup (K := L) + (finitePlacesAbove (K := K) (L := L) S), + sUnitToRelativeIdeleSupported + (K := K) (L := L) S x = + z := by + intro z + constructor + · intro hz + have hzPrincipal : + (z : RelativeIdeleGroup K L) ∈ + RelativeIdeleGroup.principalSubgroup K L := by + exact + (QuotientGroup.eq_one_iff + (N := RelativeIdeleGroup.principalSubgroup K L) + (x := (z : RelativeIdeleGroup K L))).1 hz + let y : + (RelativeIdeleGroup.principalSubgroup K L).subgroupOf + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) := + ⟨z, hzPrincipal⟩ + obtain ⟨x, hx⟩ := + (sUnitEquivRelativePrincipalSupportedIntersection + (K := K) (L := L) S).surjective y + refine ⟨x, ?_⟩ + apply Subtype.ext + have hcoerce := + congrArg + (fun a : + (RelativeIdeleGroup.principalSubgroup K L).subgroupOf + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) => + (a : + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S)) + hx + exact congrArg Subtype.val hcoerce + · rintro ⟨x, rfl⟩ + change + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K L) + (RelativeIdeleGroup.principalIdele K L (x : Lˣ)) = + 1 + exact + (QuotientGroup.eq_one_iff + (N := RelativeIdeleGroup.principalSubgroup K L) + (x := + RelativeIdeleGroup.principalIdele K L (x : Lˣ))).2 + ⟨(x : Lˣ), rfl⟩ + +open scoped Classical in +/-- Finiteness of the low Tate groups of the `S`-unit module for the +support pulled back from `K`. -/ +def AboveSUnitHerbrandQuotientDefined + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) : Prop := + letI := + sUnitMulDistribMulAction K L + (finitePlacesAbove (K := K) (L := L) S) + (finitePlacesAbove_isGaloisStable + (K := K) (L := L) S) + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (SUnitGroup (K := L) + (finitePlacesAbove (K := K) (L := L) S)) σ + +open scoped Classical in +/-- Finiteness of the low Tate groups of the supported relative-idele +module. -/ +def RelativeIdeleSupportedHerbrandQuotientDefined + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) : Prop := + letI := + relativeIdeleLocalTensorDecompositionSupportedSubgroupAction + (K := K) (L := L) S + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) σ + +open scoped Classical in +/-- The permutation-representation presentation of the action on +logarithmic places above a base support. This is the presentation used +by the `S`-unit Herbrand theorem. -/ +@[reducible] +noncomputable def aboveSLogPlaceMulAction + (S : Finset (HeightOneSpectrum (𝓞 K))) : + MulAction (L ≃ₐ[K] L) + (SUnitGroup.LogPlace + (K := L) + (finitePlacesAbove (K := K) (L := L) S)) := + permutationMulAction + (logPlacePermutationHom K L + (finitePlacesAbove (K := K) (L := L) S) + (finitePlacesAbove_isGaloisStable + (K := K) (L := L) S)) + +open scoped Classical in +/-- Send a logarithmic place of `L` lying over the pulled-back support +to its underlying unrestricted place of `K`. -/ +noncomputable def logPlaceBelowRelativeUnrestrictedIndex + (S : Finset (HeightOneSpectrum (𝓞 K))) : + SUnitGroup.LogPlace + (K := L) + (finitePlacesAbove (K := K) (L := L) S) → + RelativeUnrestrictedSPlaceIndex (K := K) S + | Sum.inl W => + Sum.inl (W.comap (algebraMap K L)) + | Sum.inr W => + Sum.inr + ⟨finitePlaceBelow (K := K) W.1, + (mem_finitePlacesAbove_iff + (K := K) (L := L) S W.1).1 W.2⟩ + +omit [FiniteDimensional K L] [IsGalois K L] in +open scoped Classical in +/-- The place-below map is constant on Galois orbits of logarithmic +places. -/ +theorem logPlaceBelowRelativeUnrestrictedIndex_smul + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) + (q : + SUnitGroup.LogPlace + (K := L) + (finitePlacesAbove (K := K) (L := L) S)) : + letI := + aboveSLogPlaceMulAction + (K := K) (L := L) S + logPlaceBelowRelativeUnrestrictedIndex + (K := K) (L := L) S (σ • q) = + logPlaceBelowRelativeUnrestrictedIndex + (K := K) (L := L) S q := by + let logAction := + aboveSLogPlaceMulAction + (K := K) (L := L) S + cases q with + | inl W => + change + logPlaceBelowRelativeUnrestrictedIndex + (K := K) (L := L) S + (logPlacePermutationHom K L + (finitePlacesAbove (K := K) (L := L) S) + (finitePlacesAbove_isGaloisStable + (K := K) (L := L) S) σ (Sum.inl W)) = + logPlaceBelowRelativeUnrestrictedIndex + (K := K) (L := L) S (Sum.inl W) + rw [logPlacePermutationHom_apply] + change + Sum.inl ((σ • W).comap (algebraMap K L)) = + Sum.inl (W.comap (algebraMap K L)) + congr 1 + rw [NumberField.InfinitePlace.comap_smul] + congr 1 + ext x + exact σ.symm.commutes x + | inr W => + change + logPlaceBelowRelativeUnrestrictedIndex + (K := K) (L := L) S + (logPlacePermutationHom K L + (finitePlacesAbove (K := K) (L := L) S) + (finitePlacesAbove_isGaloisStable + (K := K) (L := L) S) σ (Sum.inr W)) = + logPlaceBelowRelativeUnrestrictedIndex + (K := K) (L := L) S (Sum.inr W) + rw [logPlacePermutationHom_apply] + change + Sum.inr + (⟨finitePlaceBelow (K := K) + (finitePlaceEquiv K L σ W.1), _⟩ : + {v : HeightOneSpectrum (𝓞 K) // v ∈ S}) = + Sum.inr + (⟨finitePlaceBelow (K := K) W.1, _⟩ : + {v : HeightOneSpectrum (𝓞 K) // v ∈ S}) + congr 1 + apply Subtype.ext + exact + finitePlaceBelow_finitePlaceEquiv + (K := K) (L := L) σ W.1 + +open scoped Classical in +/-- The map on Galois orbits induced by taking the place below. -/ +noncomputable def logPlaceOrbitBelowRelativeUnrestrictedIndex + (S : Finset (HeightOneSpectrum (𝓞 K))) : + letI := + aboveSLogPlaceMulAction + (K := K) (L := L) S + MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace + (K := L) + (finitePlacesAbove (K := K) (L := L) S)) → + RelativeUnrestrictedSPlaceIndex (K := K) S := by + letI logAction := + aboveSLogPlaceMulAction + (K := K) (L := L) S + exact + Quotient.lift + (logPlaceBelowRelativeUnrestrictedIndex + (K := K) (L := L) S) + (by + intro a b hab + rcases hab with ⟨σ, hσ⟩ + rw [← hσ] + exact + logPlaceBelowRelativeUnrestrictedIndex_smul + (K := K) (L := L) S σ b) + +omit [FiniteDimensional K L] [IsGalois K L] in +open scoped Classical in +/-- Evaluating the orbit-descended log-place map on a quotient class gives +the original map on any representative. -/ +@[simp] +theorem logPlaceOrbitBelowRelativeUnrestrictedIndex_mk + (S : Finset (HeightOneSpectrum (𝓞 K))) + (q : + SUnitGroup.LogPlace + (K := L) + (finitePlacesAbove (K := K) (L := L) S)) : + letI := + aboveSLogPlaceMulAction + (K := K) (L := L) S + logPlaceOrbitBelowRelativeUnrestrictedIndex + (K := K) (L := L) S (Quotient.mk'' q) = + logPlaceBelowRelativeUnrestrictedIndex + (K := K) (L := L) S q := + rfl + +open scoped Classical in +/-- Galois orbits of logarithmic places of `L` above `S` are +canonically indexed by all infinite places of `K` and the finite +places in `S`. -/ +noncomputable def + logPlaceOrbitEquivRelativeUnrestrictedSPlaceIndex + (S : Finset (HeightOneSpectrum (𝓞 K))) : + letI := + aboveSLogPlaceMulAction + (K := K) (L := L) S + MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace + (K := L) + (finitePlacesAbove (K := K) (L := L) S)) ≃ + RelativeUnrestrictedSPlaceIndex (K := K) S := by + letI stableFiniteAction := + stableFinitePlaceMulAction K L + (finitePlacesAbove (K := K) (L := L) S) + (finitePlacesAbove_isGaloisStable + (K := K) (L := L) S) + letI logAction := + aboveSLogPlaceMulAction + (K := K) (L := L) S + let f := + logPlaceOrbitBelowRelativeUnrestrictedIndex + (K := K) (L := L) S + apply Equiv.ofBijective f + constructor + · intro x y hxy + induction x using Quotient.inductionOn' with + | _ a => + induction y using Quotient.inductionOn' with + | _ b => + apply Quotient.sound + change a ∈ MulAction.orbit (L ≃ₐ[K] L) b + cases a with + | inl W₁ => + cases b with + | inl W₂ => + have hbelow : + W₁.comap (algebraMap K L) = + W₂.comap (algebraMap K L) := by + exact Sum.inl.inj hxy + obtain ⟨σ, hσ⟩ := + NumberField.InfinitePlace.exists_smul_eq_of_comap_eq + hbelow + refine ⟨σ⁻¹, ?_⟩ + change + logPlacePermutationHom K L + (finitePlacesAbove (K := K) (L := L) S) + (finitePlacesAbove_isGaloisStable + (K := K) (L := L) S) σ⁻¹ + (Sum.inl W₂) = + Sum.inl W₁ + rw [logPlacePermutationHom_apply] + change Sum.inl (σ⁻¹ • W₂) = Sum.inl W₁ + rw [← hσ, inv_smul_smul] + | inr W₂ => + change + Sum.inl (W₁.comap (algebraMap K L)) = + Sum.inr + (⟨finitePlaceBelow (K := K) W₂.1, _⟩ : + {v : HeightOneSpectrum (𝓞 K) // v ∈ S}) + at hxy + exact (Sum.inl_ne_inr hxy).elim + | inr W₁ => + cases b with + | inl W₂ => + change + Sum.inr + (⟨finitePlaceBelow (K := K) W₁.1, _⟩ : + {v : HeightOneSpectrum (𝓞 K) // v ∈ S}) = + Sum.inl (W₂.comap (algebraMap K L)) + at hxy + exact (Sum.inr_ne_inl hxy).elim + | inr W₂ => + have hbelow : + finitePlaceBelow (K := K) W₁.1 = + finitePlaceBelow (K := K) W₂.1 := by + exact congrArg Subtype.val (Sum.inr.inj hxy) + let v := + finitePlaceBelow (K := K) W₁.1 + let : Finite (L ≃ₐ[K] L) := + IsGaloisGroup.finite (L ≃ₐ[K] L) K L + let : + IsGaloisGroup + (L ≃ₐ[K] L) (𝓞 K) (𝓞 L) := + IsGaloisGroup.of_isFractionRing + (L ≃ₐ[K] L) (𝓞 K) (𝓞 L) K L + let : W₁.1.asIdeal.LiesOver v.asIdeal := + ⟨by + simp only [v, finitePlaceBelow_asIdeal]⟩ + let : W₂.1.asIdeal.LiesOver v.asIdeal := + ⟨by + have h := + congrArg HeightOneSpectrum.asIdeal hbelow + simpa only [v, finitePlaceBelow_asIdeal] + using h⟩ + obtain ⟨σ, hσ⟩ := + HilbertRamification.Dedekind.exists_smul_eq_of_isGaloisGroup + v.asIdeal W₁.1.asIdeal W₂.1.asIdeal + (L ≃ₐ[K] L) + have hplace : + finitePlaceEquiv K L σ W₁.1 = W₂.1 := by + apply HeightOneSpectrum.ext + rw [finitePlaceEquiv_asIdeal] + exact hσ + have hsubtype : σ • W₁ = W₂ := by + apply Subtype.ext + exact hplace + refine ⟨σ⁻¹, ?_⟩ + change + logPlacePermutationHom K L + (finitePlacesAbove (K := K) (L := L) S) + (finitePlacesAbove_isGaloisStable + (K := K) (L := L) S) σ⁻¹ + (Sum.inr W₂) = + Sum.inr W₁ + rw [logPlacePermutationHom_apply] + change Sum.inr (σ⁻¹ • W₂) = Sum.inr W₁ + rw [← hsubtype, inv_smul_smul] + · intro i + cases i with + | inl v => + refine + ⟨Quotient.mk'' + (Sum.inl + (chosenInfinitePlaceAbove (L := L) v)), ?_⟩ + exact + congrArg Sum.inl + (chosenInfinitePlaceAbove_comap + (L := L) v) + | inr v => + let w := + chosenFinitePlaceExtension (L := L) v.1 + let W := + finitePlaceExtensionCentre + (K := K) (L := L) v.1 w + have hWbelow : + finitePlaceBelow (K := K) W = v.1 := + finitePlaceBelow_finitePlaceExtensionCentre + (K := K) (L := L) v.1 w + have hWmem : + W ∈ finitePlacesAbove + (K := K) (L := L) S := + (mem_finitePlacesAbove_iff + (K := K) (L := L) S W).2 + (hWbelow ▸ v.2) + refine + ⟨Quotient.mk'' + (Sum.inr + (⟨W, hWmem⟩ : + finitePlacesAbove + (K := K) (L := L) S)), ?_⟩ + apply congrArg Sum.inr + apply Subtype.ext + exact hWbelow + +open scoped Classical in +/-- The local degree attached to a logarithmic place agrees with the +local degree attached to its place below. -/ +theorem + relativeUnrestrictedSPlaceLocalDegree_logPlaceBelow + (S : Finset (HeightOneSpectrum (𝓞 K))) + (q : + SUnitGroup.LogPlace + (K := L) + (finitePlacesAbove (K := K) (L := L) S)) : + relativeUnrestrictedSPlaceLocalDegree + (K := K) (L := L) S + (logPlaceBelowRelativeUnrestrictedIndex + (K := K) (L := L) S q) = + logPlaceLocalDegree K L + (finitePlacesAbove (K := K) (L := L) S) q := by + cases q with + | inl W => + let W₀ := + chosenInfinitePlaceAbove + (L := L) (W.comap (algebraMap K L)) + change + Nat.card (absoluteValueDecompositionGroup K W₀.1) = + if NumberField.InfinitePlace.IsUnramified K W + then 1 else 2 + rw [ + absoluteValueDecompositionGroup_eq_infinitePlaceStabilizer W₀, + NumberField.InfinitePlace.card_stabilizer] + have hcomap : + W₀.comap (algebraMap K L) = + W.comap (algebraMap K L) := + chosenInfinitePlaceAbove_comap + (L := L) (W.comap (algebraMap K L)) + obtain ⟨τ, hτ⟩ := + NumberField.InfinitePlace.exists_smul_eq_of_comap_eq + hcomap + rw [← hτ, + NumberField.InfinitePlace.isUnramified_smul_iff] + | inr W => + let v := + finitePlaceBelow (K := K) W.1 + let w := + chosenFinitePlaceExtension (L := L) v + let W₀ := + finitePlaceExtensionCentre + (K := K) (L := L) v w + let finiteAction := finitePlaceMulAction K L + let : Finite (L ≃ₐ[K] L) := + IsGaloisGroup.finite (L ≃ₐ[K] L) K L + let : + IsGaloisGroup + (L ≃ₐ[K] L) (𝓞 K) (𝓞 L) := + IsGaloisGroup.of_isFractionRing + (L ≃ₐ[K] L) (𝓞 K) (𝓞 L) K L + let : W₀.asIdeal.LiesOver v.asIdeal := + ⟨(finitePlaceExtensionCentreIdeal_under + (K := K) (L := L) v w).symm⟩ + let : W.1.asIdeal.LiesOver v.asIdeal := + ⟨by + simp only [v, finitePlaceBelow_asIdeal]⟩ + obtain ⟨τ, hτ⟩ := + HilbertRamification.Dedekind.exists_smul_eq_of_isGaloisGroup + v.asIdeal W₀.asIdeal W.1.asIdeal + (L ≃ₐ[K] L) + have hplace : + finitePlaceEquiv K L τ W₀ = W.1 := by + apply HeightOneSpectrum.ext + rw [finitePlaceEquiv_asIdeal] + exact hτ + have hcard : + Nat.card + (MulAction.stabilizer (L ≃ₐ[K] L) W₀) = + Nat.card + (MulAction.stabilizer (L ≃ₐ[K] L) W.1) := + Nat.card_congr + (MulAction.stabilizerEquivStabilizer + hplace.symm).toEquiv + change + Nat.card (absoluteValueDecompositionGroup K w.1) = + finiteLogPlaceLocalDegree K L W.1 + rw [ + absoluteValueDecompositionGroup_eq_finitePlaceStabilizer + (K := K) (L := L) v w] + exact + hcard.trans + (finitePlace_stabilizer_card_eq_localDegree + K L W.1) + +open scoped Classical in +/-- The local-degree product occurring in the supported-idele +calculation is exactly the orbit-indexed local-degree product occurring +in the `S`-unit calculation. -/ +theorem + relativeUnrestrictedSPlaceLocalDegree_product_eq_logPlaceOrbitProduct + (S : Finset (HeightOneSpectrum (𝓞 K))) : + letI := + aboveSLogPlaceMulAction + (K := K) (L := L) S + letI : + Fintype + (MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace + (K := L) + (finitePlacesAbove + (K := K) (L := L) S))) := + Fintype.ofFinite _ + (∏ i, + (relativeUnrestrictedSPlaceLocalDegree + (K := K) (L := L) S i : ℚ)) = + ∏ ω : + MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace + (K := L) + (finitePlacesAbove + (K := K) (L := L) S)), + (logPlaceLocalDegree K L + (finitePlacesAbove (K := K) (L := L) S) + ω.out : ℚ) := by + let logAction := + aboveSLogPlaceMulAction + (K := K) (L := L) S + let orbitFintype : + Fintype + (MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace + (K := L) + (finitePlacesAbove + (K := K) (L := L) S))) := + Fintype.ofFinite _ + let e := + logPlaceOrbitEquivRelativeUnrestrictedSPlaceIndex + (K := K) (L := L) S + calc + (∏ i, + (relativeUnrestrictedSPlaceLocalDegree + (K := K) (L := L) S i : ℚ)) = + ∏ ω, + (relativeUnrestrictedSPlaceLocalDegree + (K := K) (L := L) S (e ω) : ℚ) := + (e.prod_comp + (fun i => + (relativeUnrestrictedSPlaceLocalDegree + (K := K) (L := L) S i : ℚ))).symm + _ = + ∏ ω : + MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace + (K := L) + (finitePlacesAbove + (K := K) (L := L) S)), + (logPlaceLocalDegree K L + (finitePlacesAbove (K := K) (L := L) S) + ω.out : ℚ) := by + apply Finset.prod_congr rfl + intro ω hω + have he : + e ω = + logPlaceBelowRelativeUnrestrictedIndex + (K := K) (L := L) S ω.out := by + calc + e ω = e (Quotient.mk'' ω.out) := + congrArg e (Quotient.out_eq' ω).symm + _ = + logPlaceBelowRelativeUnrestrictedIndex + (K := K) (L := L) S ω.out := rfl + rw [he] + exact_mod_cast + relativeUnrestrictedSPlaceLocalDegree_logPlaceBelow + (K := K) (L := L) S ω.out + +omit [IsGalois K L] in +open scoped Classical in +/-- Cancellation on the supported short exact sequence: if supported +ideles and `S`-units have quotients `q` and `q / |G|`, respectively, +then the idele-class quotient is `|G|`. -/ +theorem + ideleClass_herbrandQuotient_eq_card_of_sUnit_supported_values + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) + (hSP : + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S ⊔ + RelativeIdeleGroup.principalSubgroup K L = + ⊤) + (hUnitDefined : + AboveSUnitHerbrandQuotientDefined + (K := K) (L := L) S σ) + (hSupportedDefined : + RelativeIdeleSupportedHerbrandQuotientDefined + (K := K) (L := L) S σ) + (q : ℚ) (hq : q ≠ 0) + (hSupported : + letI := + relativeIdeleLocalTensorDecompositionSupportedSubgroupAction + (K := K) (L := L) S + letI : Finite + (HerbrandH0 (L ≃ₐ[K] L) + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S)) := + hSupportedDefined.1 + letI : Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) σ) := + hSupportedDefined.2 + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) σ = q) + (hUnit : + letI := + sUnitMulDistribMulAction K L + (finitePlacesAbove (K := K) (L := L) S) + (finitePlacesAbove_isGaloisStable + (K := K) (L := L) S) + letI : Finite + (HerbrandH0 (L ≃ₐ[K] L) + (SUnitGroup (K := L) + (finitePlacesAbove + (K := K) (L := L) S))) := + hUnitDefined.1 + letI : Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (SUnitGroup (K := L) + (finitePlacesAbove + (K := K) (L := L) S)) σ) := + hUnitDefined.2 + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := SUnitGroup (K := L) + (finitePlacesAbove (K := K) (L := L) S)) σ = + q / (Fintype.card (L ≃ₐ[K] L) : ℚ)) : + letI := ideleClassMulDistribMulAction K L + ∃ _hC : + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) σ, + @herbrandQuotient + (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) + _ _ _ _ σ = + (Fintype.card (L ≃ₐ[K] L) : ℚ) := by + let sUnitAction := + sUnitMulDistribMulAction K L + (finitePlacesAbove (K := K) (L := L) S) + (finitePlacesAbove_isGaloisStable + (K := K) (L := L) S) + let supportedAction := + relativeIdeleLocalTensorDecompositionSupportedSubgroupAction + (K := K) (L := L) S + let classAction := ideleClassMulDistribMulAction K L + let hU0 := hUnitDefined.1 + let hUm := hUnitDefined.2 + let hS0 := hSupportedDefined.1 + let hSm := hSupportedDefined.2 + let i : + SUnitGroup (K := L) + (finitePlacesAbove (K := K) (L := L) S) →* + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S := + sUnitToRelativeIdeleSupported + (K := K) (L := L) S + let j : + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S →* + RelativeIdeleGroup.ClassGroup K L := + relativeIdeleSupportedToClass + (K := K) (L := L) S + have hi : + ∀ (τ : L ≃ₐ[K] L) + (x : + SUnitGroup (K := L) + (finitePlacesAbove (K := K) (L := L) S)), + i (τ • x) = τ • i x := by + simpa [i] using + (sUnitToRelativeIdeleSupported_equivariant + (K := K) (L := L) S) + have hj : + ∀ (τ : L ≃ₐ[K] L) + (z : + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S), + j (τ • z) = τ • j z := by + simpa [j] using + (relativeIdeleSupportedToClass_equivariant + (K := K) (L := L) S) + have hker : + ∀ z : + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S, + j z = 1 ↔ + ∃ x : + SUnitGroup (K := L) + (finitePlacesAbove (K := K) (L := L) S), + i x = z := by + simpa [i, j] using + (sUnit_supportedIdele_ideleClass_exact + (K := K) (L := L) S) + have hinj : Function.Injective i := by + simpa [i] using + (sUnitToRelativeIdeleSupported_injective + (K := K) (L := L) S) + have hsurj : Function.Surjective j := by + simpa [j] using + (relativeIdeleSupportedToClass_surjective + (K := K) (L := L) S hSP) + let hC : + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) σ := + @herbrandQuotientDefined_right_of_left_middle + (L ≃ₐ[K] L) + (SUnitGroup (K := L) + (finitePlacesAbove (K := K) (L := L) S)) + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) + (RelativeIdeleGroup.ClassGroup K L) + inferInstance inferInstance inferInstance inferInstance + inferInstance inferInstance inferInstance inferInstance + i j hi hj hker hinj hsurj + σ hgen hUnitDefined hSupportedDefined + let hC0 := hC.1 + let hCm := hC.2 + have hmul : + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) σ = + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := SUnitGroup (K := L) + (finitePlacesAbove (K := K) (L := L) S)) σ * + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup.ClassGroup K L) σ := + @herbrandQuotient_multiplicative_of_shortExact + (L ≃ₐ[K] L) + (SUnitGroup (K := L) + (finitePlacesAbove (K := K) (L := L) S)) + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) + (RelativeIdeleGroup.ClassGroup K L) + inferInstance inferInstance inferInstance inferInstance + inferInstance inferInstance inferInstance inferInstance + i j hi hj hker hinj hsurj σ hgen + inferInstance inferInstance inferInstance + inferInstance inferInstance inferInstance + have hcard : + (Fintype.card (L ≃ₐ[K] L) : ℚ) ≠ 0 := + Nat.cast_ne_zero.mpr Fintype.card_ne_zero + have hfactor : + q / (Fintype.card (L ≃ₐ[K] L) : ℚ) ≠ 0 := + div_ne_zero hq hcard + refine ⟨hC, ?_⟩ + apply mul_left_cancel₀ hfactor + calc + (q / (Fintype.card (L ≃ₐ[K] L) : ℚ)) * + @herbrandQuotient + (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) + _ _ _ _ σ = + q := by + rw [← hUnit, ← hmul, hSupported] + _ = + (q / (Fintype.card (L ≃ₐ[K] L) : ℚ)) * + (Fintype.card (L ≃ₐ[K] L) : ℚ) := by + rw [div_mul_cancel₀ q hcard] + +open scoped Classical in +/-- The norm-index lower bound obtained from the supported short exact +sequence. -/ +theorem + card_le_ideleClassNorm_index_of_sUnit_supported_values + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) + (hSP : + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S ⊔ + RelativeIdeleGroup.principalSubgroup K L = + ⊤) + (hUnitDefined : + AboveSUnitHerbrandQuotientDefined + (K := K) (L := L) S σ) + (hSupportedDefined : + RelativeIdeleSupportedHerbrandQuotientDefined + (K := K) (L := L) S σ) + (q : ℚ) (hq : q ≠ 0) + (hSupported : + letI := + relativeIdeleLocalTensorDecompositionSupportedSubgroupAction + (K := K) (L := L) S + letI : Finite + (HerbrandH0 (L ≃ₐ[K] L) + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S)) := + hSupportedDefined.1 + letI : Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) σ) := + hSupportedDefined.2 + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) σ = q) + (hUnit : + letI := + sUnitMulDistribMulAction K L + (finitePlacesAbove (K := K) (L := L) S) + (finitePlacesAbove_isGaloisStable + (K := K) (L := L) S) + letI : Finite + (HerbrandH0 (L ≃ₐ[K] L) + (SUnitGroup (K := L) + (finitePlacesAbove + (K := K) (L := L) S))) := + hUnitDefined.1 + letI : Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (SUnitGroup (K := L) + (finitePlacesAbove + (K := K) (L := L) S)) σ) := + hUnitDefined.2 + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := SUnitGroup (K := L) + (finitePlacesAbove (K := K) (L := L) S)) σ = + q / (Fintype.card (L ≃ₐ[K] L) : ℚ)) : + Fintype.card (L ≃ₐ[K] L) ≤ + (RelativeIdeleGroup.Cohomology.ideleClassNorm K L).range.index := by + let classAction := ideleClassMulDistribMulAction K L + obtain ⟨hC, hCvalue⟩ := + ideleClass_herbrandQuotient_eq_card_of_sUnit_supported_values + (K := K) (L := L) S σ hgen hSP + hUnitDefined hSupportedDefined q hq hSupported hUnit + let hC0 := hC.1 + let hCm := hC.2 + rw [ideleClassNorm_index_eq_herbrandH0_card K L] + apply + le_herbrandH0_card_of_herbrandQuotient_eq_nat + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup.ClassGroup K L) + σ (Fintype.card (L ≃ₐ[K] L)) + simpa using hCvalue + +open scoped Classical in +/-- With all local and `S`-unit calculations substituted, an unramified +sufficiently large support gives an idele-class Herbrand quotient equal +to the order of the Galois group. -/ +theorem + ideleClass_herbrandQuotient_eq_card_of_supported_local_calculation + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) + (hSP : + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S ⊔ + RelativeIdeleGroup.principalSubgroup K L = + ⊤) + (hUnram : ∀ w : HeightOneSpectrum (𝓞 K), + w ∉ S → + ChosenFinitePlaceIsUnramified + (K := K) (L := L) w) : + letI := ideleClassMulDistribMulAction K L + ∃ _hC : + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) σ, + @herbrandQuotient + (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) + _ _ _ _ σ = + (Fintype.card (L ≃ₐ[K] L) : ℚ) := by + let T := + finitePlacesAbove (K := K) (L := L) S + let hT : + IsGaloisStableFinitePlaces K L T := + finitePlacesAbove_isGaloisStable + (K := K) (L := L) S + let ρ := + logPlacePermutationHom K L T hT + let indexAction : + MulAction (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) T) := + permutationMulAction ρ + let sUnitAction : + MulDistribMulAction (L ≃ₐ[K] L) + (SUnitGroup (K := L) T) := + sUnitMulDistribMulAction K L T hT + let orbitFintype : + Fintype + (MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) T)) := + Fintype.ofFinite _ + let stabilizerFintype : + ∀ ω : + MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) T), + Fintype (permutationOrbitStabilizer ω) := + fun _ => Fintype.ofFinite _ + obtain ⟨hUnit, hUnitValue⟩ := + sUnit_herbrandQuotient_eq_localDegreeProduct_div_card + (K := K) (L := L) hT σ hgen + let supportedAction := + relativeIdeleLocalTensorDecompositionSupportedSubgroupAction + (K := K) (L := L) S + obtain ⟨hSupported, hSupportedValue⟩ := + relativeIdeleSupported_herbrandQuotient_eq_localDegreeProduct + (K := K) (L := L) S σ hgen hUnram + let q : ℚ := + ∏ i, + (relativeUnrestrictedSPlaceLocalDegree + (K := K) (L := L) S i : ℚ) + have hq : q ≠ 0 := by + apply Finset.prod_ne_zero_iff.mpr + intro i hi + exact + Nat.cast_ne_zero.mpr + (show + relativeUnrestrictedSPlaceLocalDegree + (K := K) (L := L) S i ≠ 0 by + unfold relativeUnrestrictedSPlaceLocalDegree + exact Nat.card_pos.ne') + have hProducts : + q = + ∏ ω : + MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) T), + (logPlaceLocalDegree K L T ω.out : ℚ) := by + simpa [q, T, hT, ρ] using + (relativeUnrestrictedSPlaceLocalDegree_product_eq_logPlaceOrbitProduct + (K := K) (L := L) S) + have hUnitValue' : + @herbrandQuotient + (L ≃ₐ[K] L) + (SUnitGroup (K := L) T) + _ _ _ _ σ = + q / (Fintype.card (L ≃ₐ[K] L) : ℚ) := by + rw [hProducts] + simpa only [indexAction, ρ, T, hT] using hUnitValue + have hSupportedValue' : + @herbrandQuotient + (L ≃ₐ[K] L) + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) + _ _ _ _ σ = + q := by + exact hSupportedValue + exact + ideleClass_herbrandQuotient_eq_card_of_sUnit_supported_values + (K := K) (L := L) S σ hgen hSP + hUnit hSupported q hq + hSupportedValue' hUnitValue' + +open scoped Classical in +/-- The corresponding norm-index lower bound with all supported local +calculations substituted. -/ +theorem + card_le_ideleClassNorm_index_of_supported_local_calculation + (S : Finset (HeightOneSpectrum (𝓞 K))) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) + (hSP : + relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S ⊔ + RelativeIdeleGroup.principalSubgroup K L = + ⊤) + (hUnram : ∀ w : HeightOneSpectrum (𝓞 K), + w ∉ S → + ChosenFinitePlaceIsUnramified + (K := K) (L := L) w) : + Fintype.card (L ≃ₐ[K] L) ≤ + (RelativeIdeleGroup.Cohomology.ideleClassNorm K L).range.index := by + let classAction := ideleClassMulDistribMulAction K L + obtain ⟨hC, hCvalue⟩ := + ideleClass_herbrandQuotient_eq_card_of_supported_local_calculation + (K := K) (L := L) S σ hgen hSP hUnram + let hC0 := hC.1 + let hCm := hC.2 + rw [ideleClassNorm_index_eq_herbrandH0_card K L] + apply + le_herbrandH0_card_of_herbrandQuotient_eq_nat + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup.ClassGroup K L) + σ (Fintype.card (L ≃ₐ[K] L)) + simpa using hCvalue + +open scoped Classical in +/-- Unconditional norm-index lower bound for a cyclic extension, in +Galois-group-order form. -/ +theorem card_le_ideleClassNorm_index + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + Fintype.card (L ≃ₐ[K] L) ≤ + (RelativeIdeleGroup.Cohomology.ideleClassNorm K L).range.index := + card_le_ideleClassNorm_index_of_supported_local_calculation + (K := K) (L := L) + (ideleClassHerbrandSupport (K := K) (L := L)) + σ hgen + (relativeSupportedAboveHerbrandSupport_sup_principal_eq_top + (K := K) (L := L)) + (chosenFinitePlaceIsUnramified_of_notMem_ideleClassHerbrandSupport + (K := K) (L := L)) + +open scoped Classical in +/-- Unconditional norm-index lower bound in extension-degree form. -/ +theorem finrank_le_ideleClassNorm_index + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + Module.finrank K L ≤ + (RelativeIdeleGroup.Cohomology.ideleClassNorm K L).range.index := by + simpa only [Fintype.card_eq_nat_card, + IsGalois.card_aut_eq_finrank K L] using + card_le_ideleClassNorm_index + (K := K) (L := L) σ hgen + +end Cohomology +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields.lean new file mode 100644 index 0000000000..9aaba28960 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields.lean @@ -0,0 +1,89 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianLocalConductorComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianNormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticClassFieldCorrespondence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticHilbertClassFieldReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticRayClassFieldReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldMathlibArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldOverOriginalBase +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldConstruction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldNormRange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldOriginalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.Conductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorInfinitePart +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLattice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLocalComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorRayClassMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicConductorUniqueness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicRayClassMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclotomicKummerNormDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.EmbeddedAbelianSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondenceTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteIndexNormClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FinitePlaceArtinQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FullConductorRayClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximalSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldPrimeSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldUnramifiedMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertNormCharacterization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.InfiniteAbelianClassFieldCorrespondence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.KummerNormDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibGlobalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormLimitation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormRayClassMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormTowerConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.OrdinaryNormClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PowerCongruenceCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealArtinKernelComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormArtinKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormQuotientComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RationalRayPrimeClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassModulusProjection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupFieldAntitone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayPrimeGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMathlibArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMaximalSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldOverOriginalBase +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertNormCharacterization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeNormClass + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean new file mode 100644 index 0000000000..264fe27559 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean @@ -0,0 +1,591 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianLocalConductorComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorInfinitePart +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertNormCharacterization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteLocalGlobalArtinCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.SeparableClosurePadicLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicCyclicData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicAuxiliaryField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization +/-! +# Exact finite ramification loci for abelian norm data + +For a finite abelian extension, the modulus constructed from the +actual chosen local norm groups has support exactly the ramified finite +places. At the archimedean places, the determinant-norm image is the +whole local multiplicative group exactly when the extension is +unramified at infinity. + +The finite statement is deliberately about the locally constructed +norm modulus. Identifying it with the minimal narrow finite conductor also +requires the compatibility between the actual global norm-residue map +and the chosen local Artin map on one-place ideles. +-/ + +@[expose] public section + +open scoped NumberField NumberField.LiesOver + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open LocalClassFieldTheory LocalFieldTheory +open NumberField IsDedekindDomain + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + +open scoped Classical in +private theorem + finitePlaceIdeleClass_mem_normRange_of_mem_narrowFiniteHigherUnit + (v : HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) + (hx : + x ∈ RayClass.localHigherUnitGroup v + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L) v)) : + IdeleGroup.finitePlaceIdeleClass v x ∈ + (_root_.ideleClassNorm K L).range := by + apply + ideleClassNorm_narrowFiniteConductor_isDefiningModulus + (K := K) (L := L) + apply + RayClass.localHigherUnitClassSubgroup_le_congruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L))) v + refine ⟨x, ?_, rfl⟩ + change + x ∈ RayClass.localHigherUnitGroup v + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L) v) + exact hx + +open scoped Classical in +private theorem + narrowFiniteHigherUnitGroup_le_chosenFinitePlaceLocalNormSubgroup + (v : HeightOneSpectrum (𝓞 K)) : + RayClass.localHigherUnitGroup v + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L) v) ≤ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := by + intro x hx + apply + (Reciprocity.chosenFinitePlaceArtinMonoidHom_eq_one_iff_chosenLocalNorm + (K := K) (L := L) v x).1 + have hglobal : + Reciprocity.globalNormResidueMonoidHom K L + (IdeleGroup.finitePlaceIdeleClass v x) = 1 := + (Reciprocity.globalNormResidueMonoidHom_eq_one_iff + K L (IdeleGroup.finitePlaceIdeleClass v x)).2 + (finitePlaceIdeleClass_mem_normRange_of_mem_narrowFiniteHigherUnit + (K := K) (L := L) v x hx) + have hcompat : + Reciprocity.globalNormResidueMonoidHom K L + (IdeleGroup.finitePlaceIdeleClass v x) = + Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x := + DFunLike.congr_fun + (Reciprocity.globalNormResidueMonoidHom_comp_finitePlaceIdeleClass + (K := K) (L := L) v) x + exact hcompat.symm.trans hglobal + +open scoped Classical in +/-- The modulus obtained from the actual chosen local norm groups is +bounded by the minimal narrow finite conductor. The substantive input is the +finite-place local--global compatibility theorem: a one-place idele +class is a global class norm exactly when its local component is a norm +from the chosen completion. -/ +theorem ideleClassNormDefiningModulus_le_narrowFiniteConductor : + ideleClassNormDefiningModulus (K := K) (L := L) ≤ + ideleClassNormNarrowFiniteConductor (K := K) (L := L) := by + exact + ideleClassNormDefiningModulus_le_of_localHigherUnitGroup_le + (K := K) (L := L) + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)) + (narrowFiniteHigherUnitGroup_le_chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L)) + +open scoped Classical in +/-- The minimal narrow finite conductor of an actual finite abelian extension +is exactly the modulus obtained from its actual chosen local norm +groups. -/ +theorem ideleClassNorm_narrowFiniteConductor_eq_normDefiningModulus : + ideleClassNormNarrowFiniteConductor (K := K) (L := L) = + ideleClassNormDefiningModulus (K := K) (L := L) := + le_antisymm + (ideleClassNorm_narrowFiniteConductor_le_normDefiningModulus + (K := K) (L := L)) + (ideleClassNormDefiningModulus_le_narrowFiniteConductor + (K := K) (L := L)) + +open scoped Classical in +/-- At every finite place, the corresponding exponent of the minimal +narrow finite conductor is exactly the local conductor exponent of the +genuine chosen localized extension. Thus the narrow finite conductor is +the finite product of its actual local conductors, encoded pointwise in +`RayClass.Modulus`. -/ +theorem + ideleClassNorm_narrowFiniteConductor_apply_eq_chosenLocalConductorExponent + (v : HeightOneSpectrum (𝓞 K)) : + ideleClassNormNarrowFiniteConductor (K := K) (L := L) v = + ideleClassNormChosenFinitePlaceLocalConductorExponent + (K := K) (L := L) v := by + calc + ideleClassNormNarrowFiniteConductor (K := K) (L := L) v = + ideleClassNormDefiningModulus (K := K) (L := L) v := by + rw [ideleClassNorm_narrowFiniteConductor_eq_normDefiningModulus] + _ = + ideleClassNormLocalHigherUnitExponent + (K := K) (L := L) v := + ideleClassNormDefiningModulus_apply + (K := K) (L := L) v + _ = + ideleClassNormChosenFinitePlaceLocalConductorExponent + (K := K) (L := L) v := + ideleClassNormLocalHigherUnitExponent_eq_localConductorExponent + (K := K) (L := L) v + +open scoped Classical in +/-- For a finite abelian extension, the support of the modulus obtained +from the actual chosen local norm subgroups is precisely the set of +ramified finite places of the base field. -/ +theorem + ideleClassNormDefiningModulus_support_eq_ramifiedBaseFinitePlaces : + (ideleClassNormDefiningModulus + (K := K) (L := L)).support = + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) := by + ext v + rw [ + mem_ideleClassNormDefiningModulus_support_iff_not_chosenFinitePlaceIsUnramified, + _root_.mem_ramifiedBaseFinitePlaces_iff] + constructor + · intro hramified + let w := + _root_.chosenFinitePlaceExtension + (L := L) v + let W := + _root_.finitePlaceExtensionCentre + (K := K) (L := L) v w + refine + ⟨W, + _root_.finitePlaceExtensionCentre_liesOver + (K := K) (L := L) v w, ?_⟩ + intro hW + exact + hramified + (_root_.chosenFinitePlaceIsUnramified_of_isUnramifiedAt + (K := K) (L := L) v hW) + · rintro ⟨P, hP, hP_ramified⟩ hchosen + apply hP_ramified + apply + _root_.isUnramifiedAt_at_finitePlaceAbove_of_chosenFinitePlaceIsUnramified + (K := K) (L := L) v P + · apply HeightOneSpectrum.ext + exact hP.over.symm + · exact hchosen + +open scoped Classical in +/-- The actual local norm modulus vanishes exactly when no finite base +place ramifies. -/ +theorem + ideleClassNormDefiningModulus_eq_zero_iff_ramifiedBaseFinitePlaces_eq_empty : + ideleClassNormDefiningModulus (K := K) (L := L) = 0 ↔ + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅ := by + rw [ + ← Finsupp.support_eq_empty, + ideleClassNormDefiningModulus_support_eq_ramifiedBaseFinitePlaces] + +open scoped Classical in +/-- The actual local norm modulus vanishes exactly when the extension +is unramified at every finite place upstairs. -/ +theorem + ideleClassNormDefiningModulus_eq_zero_iff_all_finitePlaces_unramified : + ideleClassNormDefiningModulus (K := K) (L := L) = 0 ↔ + ∀ P : HeightOneSpectrum (𝓞 L), + Algebra.IsUnramifiedAt (𝓞 K) P.asIdeal := by + rw [ + ideleClassNormDefiningModulus_eq_zero_iff_ramifiedBaseFinitePlaces_eq_empty] + constructor + · intro hempty P + by_contra hP + have hramified : + _root_.finitePlaceBelow (K := K) P ∈ + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) := by + rw [_root_.mem_ramifiedBaseFinitePlaces_iff] + refine ⟨P, ?_, hP⟩ + exact ⟨by simp only [_root_.finitePlaceBelow_asIdeal]⟩ + exact + (Finset.eq_empty_iff_forall_notMem.mp hempty + (_root_.finitePlaceBelow (K := K) P)) hramified + · intro hunramified + apply Finset.eq_empty_iff_forall_notMem.mpr + intro v hv + rw [_root_.mem_ramifiedBaseFinitePlaces_iff] at hv + obtain ⟨P, _hP, hP_ramified⟩ := hv + exact hP_ramified (hunramified P) + +open scoped Classical in +/-- The support of the minimal narrow finite conductor of a finite abelian +extension is exactly its finite ramification locus. -/ +theorem + ideleClassNorm_narrowFiniteConductor_support_eq_ramifiedBaseFinitePlaces : + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)).support = + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) := by + rw [ + ideleClassNorm_narrowFiniteConductor_eq_normDefiningModulus, + ideleClassNormDefiningModulus_support_eq_ramifiedBaseFinitePlaces] + +open scoped Classical in +/-- The minimal narrow finite conductor vanishes exactly when the extension +is unramified at every finite place upstairs. -/ +theorem + ideleClassNorm_narrowFiniteConductor_eq_zero_iff_all_finitePlaces_unramified : + ideleClassNormNarrowFiniteConductor (K := K) (L := L) = 0 ↔ + ∀ P : HeightOneSpectrum (𝓞 L), + Algebra.IsUnramifiedAt (𝓞 K) P.asIdeal := by + rw [ + ideleClassNorm_narrowFiniteConductor_eq_normDefiningModulus, + ideleClassNormDefiningModulus_eq_zero_iff_all_finitePlaces_unramified] + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- A ramified real-to-complex completion makes the corresponding +archimedean tensor norm subgroup proper. -/ +private theorem infiniteTensorNormSubgroup_ne_top_of_isRamified + (v : InfinitePlace K) + (w : InfinitePlace L) + (hw : w.comap (algebraMap K L) = v) + (hramified : w.IsRamified K) : + _root_.infiniteTensorNormSubgroup + (K := K) (L := L) v ≠ ⊤ := by + let : w.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) hw⟩ + rw [ + _root_.infiniteTensorNormSubgroup_eq_localNormSubgroup + (K := K) (L := L) v w hw] + have hvReal : v.IsReal := by + rw [← hw] + exact hramified.isReal + let eRealField : + v.Completion ≃+* ℝ := + InfinitePlace.Completion.ringEquivRealOfIsReal + hvReal + let eRealUnits : + v.Completionˣ ≃* ℝˣ := + Units.mapEquiv eRealField.toMulEquiv + have hwComplex : w.IsComplex := + hramified.isComplex + let eComplexField : + w.Completion ≃+* ℂ := + InfinitePlace.Completion.ringEquivComplexOfIsComplex + hwComplex + let eComplexUnits : + w.Completionˣ ≃* ℂˣ := + Units.mapEquiv eComplexField.toMulEquiv + let : + NumberField.ComplexEmbedding.LiesOver + (InfinitePlace.Completion.extensionEmbedding w) + (InfinitePlace.Completion.extensionEmbedding v) := + InfinitePlace.LiesOver.extensionEmbedding_liesOver_of_isReal + w hvReal + have hCompletionCompatible : + RingHom.comp (algebraMap ℝ ℂ) eRealField = + RingHom.comp eComplexField + (algebraMap v.Completion w.Completion) := by + ext x + change + (InfinitePlace.Completion.extensionEmbeddingOfIsReal hvReal x : ℂ) = + InfinitePlace.Completion.extensionEmbedding w + ((algebraMap v.Completion w.Completion) x) + rw [InfinitePlace.Completion.extensionEmbeddingOfIsReal_apply] + exact + (InfinitePlace.Completion.liesOver_extensionEmbedding_apply + w (v := v)).symm + have hCompletionCompatibleSymm := + LocalClassFieldTheory.ringEquiv_compat_symm + eRealField eComplexField hCompletionCompatible + have hRealComplexNormTransport : + (localNormSubgroup ℝ ℂ).map + eRealUnits.symm.toMonoidHom = + localNormSubgroup + v.Completion w.Completion := by + ext x + constructor + · rintro ⟨_, ⟨z, rfl⟩, rfl⟩ + refine ⟨eComplexUnits.symm z, ?_⟩ + exact + (LocalClassFieldTheory.normUnits_map_ringEquiv + eRealField.symm eComplexField.symm + hCompletionCompatibleSymm z).symm + · rintro ⟨z, rfl⟩ + refine + ⟨normUnits ℝ ℂ (eComplexUnits z), + ⟨eComplexUnits z, rfl⟩, ?_⟩ + calc + eRealUnits.symm + (normUnits ℝ ℂ (eComplexUnits z)) = + normUnits v.Completion w.Completion + (eComplexUnits.symm (eComplexUnits z)) := by + exact + LocalClassFieldTheory.normUnits_map_ringEquiv + eRealField.symm eComplexField.symm + hCompletionCompatibleSymm + (eComplexUnits z) + _ = normUnits v.Completion w.Completion z := by + rw [eComplexUnits.symm_apply_apply] + have hNegativeOne : + (-1 : ℝˣ) ∉ localNormSubgroup ℝ ℂ := by + rw [ + ← LocalClassFieldTheory.realUnitsSign_ker_eq_complexNormSubgroup, + LocalClassFieldTheory.mem_realUnitsSign_ker_iff] + norm_num + intro htop + have hx : + eRealUnits.symm (-1 : ℝˣ) ∈ + localNormSubgroup v.Completion w.Completion := by + rw [htop] + exact Subgroup.mem_top _ + rw [← hRealComplexNormTransport] at hx + obtain ⟨z, hz, hzEq⟩ := hx + have hzNegativeOne : z = (-1 : ℝˣ) := + eRealUnits.symm.injective hzEq + exact hNegativeOne (hzNegativeOne ▸ hz) + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- At a base infinite place, the determinant-norm image is the whole +local multiplicative group exactly when the extension is unramified +above that place. -/ +theorem infiniteTensorNormSubgroup_eq_top_iff_isUnramifiedIn + (v : InfinitePlace K) : + _root_.infiniteTensorNormSubgroup + (K := K) (L := L) v = ⊤ ↔ + v.IsUnramifiedIn L := by + obtain ⟨w, hw⟩ := + InfinitePlace.comap_surjective + (K := L) v + have hUnramified : + v.IsUnramifiedIn L ↔ w.IsUnramified K := by + rw [← hw, InfinitePlace.isUnramifiedIn_comap] + rw [hUnramified] + constructor + · intro htop + by_contra hramified + have hRamified : w.IsRamified K := + hramified + exact + (infiniteTensorNormSubgroup_ne_top_of_isRamified + (K := K) (L := L) v w hw hRamified) + htop + · intro hunramified + let : w.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) hw⟩ + rw [ + _root_.infiniteTensorNormSubgroup_eq_localNormSubgroup + (K := K) (L := L) v w hw] + apply top_unique + intro x _ + refine + ⟨Units.map + (algebraMap + v.Completion w.Completion).toMonoidHom x, ?_⟩ + apply Units.ext + change + Algebra.norm v.Completion + (algebraMap v.Completion w.Completion + (x : v.Completion)) = + (x : v.Completion) + rw [ + Algebra.norm_algebraMap, + InfinitePlace.IsUnramified.finrank_eq_one + v hunramified, + pow_one] + +open scoped Classical in +/-- The infinite part of the full conductor of an idèle-class norm range is +exactly the set of ramified real places. -/ +theorem ideleClassNormFullConductor_infinitePart_eq_realRamificationLocus : + (ideleClassNormConductorialSubgroup + (K := K) (L := L)).fullConductor.infinitePart = + (Finset.univ.filter fun v : RayClass.RealPlace K => + ¬ v.1.IsUnramifiedIn L) := by + classical + ext v + change + v ∈ (ideleClassNormConductorialSubgroup + (K := K) (L := L)).fullConductorInfinitePart ↔ + v ∈ (Finset.univ.filter fun w : RayClass.RealPlace K => + ¬ w.1.IsUnramifiedIn L) + rw [ConductorialSubgroup.mem_fullConductorInfinitePart_iff, + Finset.mem_filter] + simp only [Finset.mem_univ, true_and] + change + (¬ (IdeleGroup.infinitePlaceIdeleClass v.1).range ≤ + (_root_.ideleClassNorm K L).range) ↔ + ¬ v.1.IsUnramifiedIn L + apply not_congr + calc + (IdeleGroup.infinitePlaceIdeleClass v.1).range ≤ + (_root_.ideleClassNorm K L).range ↔ + _root_.infiniteTensorNormSubgroup + (K := K) (L := L) v.1 = ⊤ := by + constructor + · intro hRange + apply top_unique + intro x _hx + apply + (Reciprocity.infinitePlaceIdeleClass_mem_ideleClassNorm_range_iff + (K := K) (L := L) v.1 x).1 + exact hRange ⟨x, rfl⟩ + · intro hTop + rintro _ ⟨x, rfl⟩ + apply + (Reciprocity.infinitePlaceIdeleClass_mem_ideleClassNorm_range_iff + (K := K) (L := L) v.1 x).2 + rw [hTop] + exact Subgroup.mem_top x + _ ↔ v.1.IsUnramifiedIn L := + infiniteTensorNormSubgroup_eq_top_iff_isUnramifiedIn + (K := K) (L := L) v.1 + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- A finite abelian number-field extension is unramified at every +infinite place exactly when every archimedean tensor determinant-norm +image is the whole local multiplicative group. -/ +theorem + infiniteTensorNormSubgroups_eq_top_iff_isUnramifiedAtInfinitePlaces : + (∀ v : InfinitePlace K, + _root_.infiniteTensorNormSubgroup + (K := K) (L := L) v = ⊤) ↔ + IsUnramifiedAtInfinitePlaces K L := by + constructor + · intro htop + exact + ⟨fun w => + (infiniteTensorNormSubgroup_eq_top_iff_isUnramifiedIn + (K := K) (L := L) + (w.comap (algebraMap K L))).1 + (htop (w.comap (algebraMap K L))) w rfl⟩ + · intro hunramified + let : IsUnramifiedAtInfinitePlaces K L := + hunramified + exact fun v => + infiniteTensorNormSubgroup_eq_top_of_isUnramifiedAtInfinitePlaces + (K := K) (L := L) v + +open scoped Classical in +/-- In the repository's modulus convention, the finite conductor is +zero and every archimedean determinant-norm image is the full local +group exactly when the extension is unramified at every finite and +infinite place. + +This combines the finite support of the narrow finite conductor with the +separate archimedean clause, so no ramification place is omitted by +the fact that `RayClass.Modulus` records only finite exponents. -/ +theorem + ideleClassNorm_everywhereUnramified_iff_conductor_zero_and_infiniteNorms_top : + ((∀ P : HeightOneSpectrum (𝓞 L), + Algebra.IsUnramifiedAt (𝓞 K) P.asIdeal) ∧ + IsUnramifiedAtInfinitePlaces K L) ↔ + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L) = 0 ∧ + ∀ v : InfinitePlace K, + _root_.infiniteTensorNormSubgroup + (K := K) (L := L) v = ⊤) := by + rw [ + ideleClassNorm_narrowFiniteConductor_eq_zero_iff_all_finitePlaces_unramified, + infiniteTensorNormSubgroups_eq_top_iff_isUnramifiedAtInfinitePlaces] + +end GlobalClassFields +end GlobalClassFieldTheory + +namespace ClassFieldTheory + +open NumberField IsDedekindDomain + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + +open scoped Classical in + +open _root_.GlobalClassFieldTheory.GlobalClassFields + (ideleClassNorm_narrowFiniteConductor_apply_eq_chosenLocalConductorExponent) in +/-- The finite exponent of the full norm conductor is the local conductor +exponent at the chosen completion above the place. -/ +theorem abelianFullConductor_finiteExponent_eq_localConductorExponent + (v : HeightOneSpectrum (𝓞 K)) : + (GlobalClassFieldTheory.GlobalClassFields.ideleClassNormConductorialSubgroup + (K := K) (L := L)).fullConductor.finitePart v = + GlobalClassFieldTheory.GlobalClassFields.ideleClassNormChosenFinitePlaceLocalConductorExponent + (K := K) (L := L) v := by + change + GlobalClassFieldTheory.GlobalClassFields.ideleClassNormNarrowFiniteConductor + (K := K) (L := L) v = _ + exact + ideleClassNorm_narrowFiniteConductor_apply_eq_chosenLocalConductorExponent + (K := K) (L := L) v + +open scoped Classical in +open GlobalClassFieldTheory.GlobalClassFields renaming + ideleClassNormLocalHigherUnitExponent_eq_localConductorExponent → + ideleClassNormLocalHigherUnitExponent_eq_localConductorExponent in +open GlobalClassFieldTheory.GlobalClassFields renaming + ideleClassNormLocalHigherUnitExponent_eq_zero_iff_chosenFinitePlaceIsUnramified → + localHigherUnitExponent_eq_zero_iff_unramified in +/-- A finite place has conductor exponent zero precisely when the chosen +local extension is unramified. -/ +theorem abelianFullConductor_finiteExponent_eq_zero_iff_unramified + (v : HeightOneSpectrum (𝓞 K)) : + (GlobalClassFieldTheory.GlobalClassFields.ideleClassNormConductorialSubgroup + (K := K) (L := L)).fullConductor.finitePart v = 0 ↔ + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v := by + rw [abelianFullConductor_finiteExponent_eq_localConductorExponent] + rw [← + ideleClassNormLocalHigherUnitExponent_eq_localConductorExponent + (K := K) (L := L) v] + exact + localHigherUnitExponent_eq_zero_iff_unramified + (K := K) (L := L) v + +open scoped Classical in + +open _root_.GlobalClassFieldTheory.GlobalClassFields + (ideleClassNormFullConductor_infinitePart_eq_realRamificationLocus) in +/-- A real place belongs to the full norm conductor exactly when it +ramifies, equivalently complexifies, in the extension. -/ +theorem abelianFullConductor_mem_infinitePart_iff_realRamified + (v : RayClass.RealPlace K) : + v ∈ + (GlobalClassFieldTheory.GlobalClassFields.ideleClassNormConductorialSubgroup + (K := K) (L := L)).fullConductor.infinitePart ↔ + ¬ v.1.IsUnramifiedIn L := by + rw [ideleClassNormFullConductor_infinitePart_eq_realRamificationLocus] + simp only [Finset.mem_filter, Finset.mem_univ, true_and] + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorRamification.lean new file mode 100644 index 0000000000..31ead1e4e7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorRamification.lean @@ -0,0 +1,118 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianNormConductor +/-! +# Ramification support of abelian narrow finite norm conductors + +For a finite abelian extension, the modulus constructed from the actual +local norm groups is zero exactly when every chosen finite completion is +unramified. Its support therefore gives the exact chosen-completion +ramification locus, while the minimal narrow finite conductor has support +contained in that locus. +-/ + +@[expose] public section + +open scoped NumberField +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + +open scoped Classical in +/-- The locally constructed norm modulus vanishes exactly when every +chosen completed extension is unramified. -/ +theorem + ideleClassNormDefiningModulus_eq_zero_iff_all_chosenFinitePlaces_unramified : + ideleClassNormDefiningModulus (K := K) (L := L) = 0 ↔ + ∀ v : HeightOneSpectrum (𝓞 K), + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v := by + constructor + · intro hzero v + apply + (ideleClassNormLocalHigherUnitExponent_eq_zero_iff_chosenFinitePlaceIsUnramified + (K := K) (L := L) v).1 + rw [← ideleClassNormDefiningModulus_apply + (K := K) (L := L) v, hzero] + rfl + · intro hunramified + ext v + rw [ideleClassNormDefiningModulus_apply, + (ideleClassNormLocalHigherUnitExponent_eq_zero_iff_chosenFinitePlaceIsUnramified + (K := K) (L := L) v).2 + (hunramified v)] + rfl + +open scoped Classical in +/-- The locally constructed norm modulus is nonzero exactly when some +chosen completed extension is ramified. -/ +theorem + ideleClassNormDefiningModulus_ne_zero_iff_exists_chosenFinitePlace_ramified : + ideleClassNormDefiningModulus (K := K) (L := L) ≠ 0 ↔ + ∃ v : HeightOneSpectrum (𝓞 K), + ¬ _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v := by + rw [ne_eq, + ideleClassNormDefiningModulus_eq_zero_iff_all_chosenFinitePlaces_unramified] + push Not + rfl + +open scoped Classical in +/-- Every prime in the minimal narrow finite norm conductor is ramified +in the chosen completed extension above that prime. -/ +theorem + mem_ideleClassNorm_narrowFiniteConductor_support_imp_chosenFinitePlace_ramified + (v : HeightOneSpectrum (𝓞 K)) + (hv : + v ∈ (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)).support) : + ¬ _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v := by + have hvLocal : + v ∈ (ideleClassNormDefiningModulus + (K := K) (L := L)).support := + ideleClassNorm_narrowFiniteConductor_support_subset_normDefiningModulus_support + (K := K) (L := L) hv + exact + (mem_ideleClassNormDefiningModulus_support_iff_not_chosenFinitePlaceIsUnramified + (K := K) (L := L) v).1 hvLocal + +open scoped Classical in +/-- If every chosen finite completion is unramified, then the minimal +narrow finite conductor of the actual idèle-class norm subgroup is zero. -/ +theorem + ideleClassNorm_narrowFiniteConductor_eq_zero_of_all_chosenFinitePlaces_unramified + (hunramified : + ∀ v : HeightOneSpectrum (𝓞 K), + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + ideleClassNormNarrowFiniteConductor (K := K) (L := L) = 0 := by + have hmodulus : + ideleClassNormDefiningModulus + (K := K) (L := L) = 0 := + (ideleClassNormDefiningModulus_eq_zero_iff_all_chosenFinitePlaces_unramified + (K := K) (L := L)).2 hunramified + apply le_antisymm + · simpa only [hmodulus] using + (ideleClassNorm_narrowFiniteConductor_le_normDefiningModulus + (K := K) (L := L)) + · exact bot_le + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianLocalConductorComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianLocalConductorComparison.lean new file mode 100644 index 0000000000..2edfb60e5e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianLocalConductorComparison.lean @@ -0,0 +1,439 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianNormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction +/-! +# Comparison of global and local conductor exponents + +At a finite place, the absolute-value completion used by local class field +theory is canonically equivalent to the adic completion used by the idèle and +ray-class libraries. This file proves that the equivalence identifies their +principal-unit filtrations. For a finite abelian extension, it then identifies +the local exponent occurring in the idèle-class norm conductor with the +conductor exponent of the chosen localized extension. +-/ + +@[expose] public section + +open scoped NumberField NNReal ValuativeRel + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- The canonical comparison between the two finite-place completion models +identifies the field principal-unit filtration with the ray-class higher-unit +filtration. -/ +theorem finitePlaceFieldPrincipalUnits_map_eq_localHigherUnitGroup + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ) : + let vK := HeightOneSpectrum.adicAbv K v + let hvKna : IsNonarchimedean (vK : K → ℝ) := + HeightOneSpectrum.isNonarchimedean_adicAbv K v + letI : Valued vK.Completion ℝ≥0 := + _root_.GlobalClassFieldTheory.Reciprocity.finitePlaceArtinCompletionValued + vK hvKna + letI : ValuativeRel vK.Completion := + _root_.GlobalClassFieldTheory.Reciprocity.finitePlaceLocalArtinCompletionValuativeRel v + (LocalFieldTheory.fieldPrincipalUnits vK.Completion n).map + (_root_.finitePlaceCompletionUnitsContinuousMulEquiv v).toMonoidHom = + RayClass.localHigherUnitGroup v n := by + let vK := HeightOneSpectrum.adicAbv K v + let hvKna : IsNonarchimedean (vK : K → ℝ) := + HeightOneSpectrum.isNonarchimedean_adicAbv K v + let : Valued vK.Completion ℝ≥0 := + _root_.GlobalClassFieldTheory.Reciprocity.finitePlaceArtinCompletionValued + vK hvKna + let : ValuativeRel vK.Completion := + _root_.GlobalClassFieldTheory.Reciprocity.finitePlaceLocalArtinCompletionValuativeRel v + let eField : vK.Completion ≃+* v.adicCompletion K := + _root_.finitePlaceCompletionRingEquiv v + let eIntegers : + 𝒪[vK.Completion] ≃+* v.adicCompletionIntegers K := + _root_.finitePlaceCompletionIntegerRingEquiv v + let eIntegralUnits : + 𝒪[vK.Completion]ˣ ≃* + (v.adicCompletionIntegers K).units := + (Units.mapEquiv eIntegers.toMulEquiv).trans + (v.adicCompletionIntegers K).toSubmonoid.unitsEquivUnitsType.symm + let e : + vK.Completionˣ ≃ₜ* (v.adicCompletion K)ˣ := + _root_.finitePlaceCompletionUnitsContinuousMulEquiv v + have heField (u : 𝒪[vK.Completion]ˣ) : + (eIntegralUnits u : (v.adicCompletion K)ˣ) = + e (LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits + vK.Completion u) := by + apply Units.ext + change + eField ((u : 𝒪[vK.Completion]) : vK.Completion) = + eField ((u : 𝒪[vK.Completion]) : vK.Completion) + rfl + have hePrincipal (u : 𝒪[vK.Completion]ˣ) : + RayClass.localHigherUnitMap v n (eIntegralUnits u) = 1 ↔ + u ∈ LocalFieldTheory.principalUnits vK.Completion n := by + rw [RayClass.localHigherUnitMap_eq_one_iff, + LocalFieldTheory.mem_principalUnits_iff] + have hvalue : + RayClass.localIntegralValue v (eIntegralUnits u) = + eIntegers (u : 𝒪[vK.Completion]) := by + change + ((v.adicCompletionIntegers K).toSubmonoid.unitsEquivUnitsType + (eIntegralUnits u) : + (v.adicCompletionIntegers K)ˣ).1 = + eIntegers (u : 𝒪[vK.Completion]) + simp [eIntegralUnits] + rw [hvalue, ← eIntegers.map_one, ← eIntegers.map_sub] + exact + ValuationTheory.ringEquiv_mem_maximalIdeal_pow_iff + eIntegers n ((u : 𝒪[vK.Completion]) - 1) + ext x + constructor + · rintro ⟨z, ⟨u, hu, rfl⟩, rfl⟩ + apply (RayClass.mem_localHigherUnitGroup_iff v n _).2 + exact ⟨eIntegralUnits u, heField u, (hePrincipal u).2 hu⟩ + · intro hx + obtain ⟨y, hyx, hy⟩ := + (RayClass.mem_localHigherUnitGroup_iff v n x).1 hx + let u : 𝒪[vK.Completion]ˣ := eIntegralUnits.symm y + have huy : eIntegralUnits u = y := + eIntegralUnits.apply_symm_apply y + refine + ⟨LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits + vK.Completion u, + ⟨u, ?_, rfl⟩, ?_⟩ + · apply (hePrincipal u).1 + simpa only [huy] using hy + · calc + e (LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits + vK.Completion u) = + (eIntegralUnits u : (v.adicCompletion K)ˣ) := + (heField u).symm + _ = y := congrArg Subtype.val huy + _ = x := hyx + +open scoped Classical in +open _root_.GlobalClassFieldTheory.Reciprocity renaming + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField → + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField in +/-- A ray-class higher unit has valuation zero after transport to the +absolute-value completion used by the finite-place Artin map. This is the +pointwise endpoint of +`finitePlaceFieldPrincipalUnits_map_eq_localHigherUnitGroup`; consumers need +not reopen the transported principal-unit subgroup. -/ +theorem finitePlaceCompletion_valuationMap_eq_zero_of_mem_localHigherUnitGroup + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ) + (x : (v.adicCompletion K)ˣ) + (hx : x ∈ RayClass.localHigherUnitGroup v n) : + let vK := HeightOneSpectrum.adicAbv K v + letI : ValuativeRel vK.Completion := + _root_.GlobalClassFieldTheory.Reciprocity.finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField vK.Completion := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + IsNonarchimedeanLocalField.valuationMap vK.Completion + (Additive.ofMul + ((_root_.finitePlaceCompletionUnitsContinuousMulEquiv v).symm x)) = + 0 := by + let vK := HeightOneSpectrum.adicAbv K v + let : ValuativeRel vK.Completion := + _root_.GlobalClassFieldTheory.Reciprocity.finitePlaceLocalArtinCompletionValuativeRel v + let : IsNonarchimedeanLocalField vK.Completion := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + have hxMap : + x ∈ + (LocalFieldTheory.fieldPrincipalUnits vK.Completion n).map + (_root_.finitePlaceCompletionUnitsContinuousMulEquiv v).toMonoidHom := by + dsimp only [vK] + rw [finitePlaceFieldPrincipalUnits_map_eq_localHigherUnitGroup v n] + exact hx + have hxPrincipal : + (_root_.finitePlaceCompletionUnitsContinuousMulEquiv v).symm x ∈ + LocalFieldTheory.fieldPrincipalUnits vK.Completion n := + (Subgroup.mem_map_equiv + (f := (_root_.finitePlaceCompletionUnitsContinuousMulEquiv v).toMulEquiv)).mp + hxMap + change + (_root_.finitePlaceCompletionUnitsContinuousMulEquiv v).symm x ∈ + (LocalFieldTheory.principalUnits vK.Completion n).map + (IsNonarchimedeanLocalField.integerUnitsToFieldUnits + vK.Completion) at hxPrincipal + rcases hxPrincipal with ⟨u, _hu, hu⟩ + rw [← hu] + dsimp only + rw [IsNonarchimedeanLocalField.valuationMap_apply] + exact + IsNonarchimedeanLocalField.v_integerUnitsToFieldUnits + vK.Completion u + +variable + {L : Type} + [Field L] [NumberField L] [Algebra K L] + +section Galois + +variable [IsGalois K L] + +open scoped Classical in +/-- At a chosen finite place, containment of the ray-class higher-unit group +in the transported local norm subgroup is equivalent to containment of the +corresponding field principal-unit group in the local norm subgroup. -/ +theorem + localHigherUnitGroup_le_normSubgroup_iff_fieldPrincipalUnits_le_normSubgroup + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ) : + let vK := HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let hvKna : IsNonarchimedean (vK : K → ℝ) := + HeightOneSpectrum.isNonarchimedean_adicAbv K v + let w := _root_.chosenFinitePlaceExtension (L := L) v + letI hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := + LocalClassFieldTheory.localizedCompletionGlobalAlgebra vK w + letI := + LocalClassFieldTheory.localizedCompletionIsScalarTower vK w + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + letI : FiniteDimensional vK.Completion E := + AlgebraicNumberTheory.Valuations.localizedCompletionModuleFinite vK hvK w + letI : Valued vK.Completion ℝ≥0 := + _root_.finitePlaceCompletionValued vK hvKna + letI : ValuativeRel vK.Completion := + _root_.finitePlaceCompletionValuativeRel vK hvKna + RayClass.localHigherUnitGroup v n ≤ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v ↔ + LocalFieldTheory.fieldPrincipalUnits vK.Completion n ≤ + LocalFieldTheory.localNormSubgroup vK.Completion E := by + let vK := HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let hvKna : IsNonarchimedean (vK : K → ℝ) := + HeightOneSpectrum.isNonarchimedean_adicAbv K v + let w := _root_.chosenFinitePlaceExtension (L := L) v + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let := + LocalClassFieldTheory.localizedCompletionGlobalAlgebra vK w + let := + LocalClassFieldTheory.localizedCompletionIsScalarTower vK w + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let : FiniteDimensional vK.Completion E := + AlgebraicNumberTheory.Valuations.localizedCompletionModuleFinite vK hvK w + let : Valued vK.Completion ℝ≥0 := + _root_.finitePlaceCompletionValued vK hvKna + let : ValuativeRel vK.Completion := + _root_.finitePlaceCompletionValuativeRel vK hvKna + let e : + vK.Completionˣ ≃ₜ* (v.adicCompletion K)ˣ := + _root_.finitePlaceCompletionUnitsContinuousMulEquiv v + have hprincipal : + (LocalFieldTheory.fieldPrincipalUnits vK.Completion n).map + e.toMonoidHom = + RayClass.localHigherUnitGroup v n := by + simpa [vK, hvKna, e] using + (finitePlaceFieldPrincipalUnits_map_eq_localHigherUnitGroup + (K := K) v n) + rw [← hprincipal] + change + (LocalFieldTheory.fieldPrincipalUnits vK.Completion n).map + e.toMonoidHom ≤ + (LocalFieldTheory.localNormSubgroup + vK.Completion E).map e.toMonoidHom ↔ + LocalFieldTheory.fieldPrincipalUnits vK.Completion n ≤ + LocalFieldTheory.localNormSubgroup vK.Completion E + constructor + · intro h x hx + have hex : + e x ∈ + (LocalFieldTheory.localNormSubgroup + vK.Completion E).map e.toMonoidHom := + h ⟨x, hx, rfl⟩ + obtain ⟨y, hy, hyx⟩ := hex + exact (e.injective hyx) ▸ hy + · rintro h _ ⟨x, hx, rfl⟩ + exact ⟨x, h hx, rfl⟩ + +end Galois + +section Abelian + +variable [IsAbelianGalois K L] + +open scoped Classical in +/-- The conductor exponent of the chosen localized extension at `v`, with the +completion and valuation instance tower confined to this definition body. -/ +noncomputable def ideleClassNormChosenFinitePlaceLocalConductorExponent + (v : HeightOneSpectrum (𝓞 K)) : ℕ := by + let vK := HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let hvKna : IsNonarchimedean (vK : K → ℝ) := + HeightOneSpectrum.isNonarchimedean_adicAbv K v + let w := _root_.chosenFinitePlaceExtension (L := L) v + letI hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := + LocalClassFieldTheory.localizedCompletionGlobalAlgebra vK w + letI := + LocalClassFieldTheory.localizedCompletionIsScalarTower vK w + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + letI : FiniteDimensional vK.Completion E := + AlgebraicNumberTheory.Valuations.localizedCompletionModuleFinite vK hvK w + letI : IsAbelianGalois vK.Completion E := + LocalClassFieldTheory.localizedCompletion_isAbelianGalois + vK hvK w + letI : NontriviallyNormedField vK.Completion := + _root_.AlgebraicNumberTheory.Valuations.absoluteValueExtensionCompletionNontriviallyNormedField + vK hvK + letI : LocallyCompactSpace vK.Completion := + AbsoluteValue.Completion.locallyCompactSpace + (_root_.finitePlaceCompletionBaseMap_isometry v) + letI : IsUltrametricDist vK.Completion := + completionIsUltrametricDist vK hvKna + letI : Valued vK.Completion ℝ≥0 := + _root_.finitePlaceCompletionValued vK hvKna + let vBase : Valuation vK.Completion ℝ≥0 := Valued.v + letI : vBase.IsNontrivial := + (inferInstance : + (NormedField.valuation + (K := vK.Completion)).IsNontrivial) + letI : ValuativeRel vK.Completion := + _root_.finitePlaceCompletionValuativeRel vK hvKna + letI : vBase.Compatible := + Valuation.Compatible.ofValuation vBase + letI : ValuativeRel.IsNontrivial vK.Completion := + (ValuativeRel.isNontrivial_iff_isNontrivial vBase).2 + inferInstance + letI : IsValuativeTopology vK.Completion := + isValuativeTopology_of_valued_ofValuation + vK.Completion ℝ≥0 + letI : IsNonarchimedeanLocalField vK.Completion := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + exact LocalClassFieldTheory.localConductorExponent + vK.Completion E + +open scoped Classical in +/-- For a finite abelian extension, the local exponent selected by the +idèle-class norm conductor equals the local conductor exponent of the chosen +localized extension. -/ +theorem ideleClassNormLocalHigherUnitExponent_eq_localConductorExponent + (v : HeightOneSpectrum (𝓞 K)) : + ideleClassNormLocalHigherUnitExponent + (K := K) (L := L) v = + ideleClassNormChosenFinitePlaceLocalConductorExponent + (K := K) (L := L) v := by + let vK := HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let hvKna : IsNonarchimedean (vK : K → ℝ) := + HeightOneSpectrum.isNonarchimedean_adicAbv K v + let w := _root_.chosenFinitePlaceExtension (L := L) v + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let := + LocalClassFieldTheory.localizedCompletionGlobalAlgebra vK w + let := + LocalClassFieldTheory.localizedCompletionIsScalarTower vK w + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let : FiniteDimensional vK.Completion E := + AlgebraicNumberTheory.Valuations.localizedCompletionModuleFinite vK hvK w + let : IsAbelianGalois vK.Completion E := + LocalClassFieldTheory.localizedCompletion_isAbelianGalois + vK hvK w + let : NontriviallyNormedField vK.Completion := + _root_.AlgebraicNumberTheory.Valuations.absoluteValueExtensionCompletionNontriviallyNormedField + vK hvK + let : LocallyCompactSpace vK.Completion := + AbsoluteValue.Completion.locallyCompactSpace + (_root_.finitePlaceCompletionBaseMap_isometry v) + let : IsUltrametricDist vK.Completion := + completionIsUltrametricDist vK hvKna + let : Valued vK.Completion ℝ≥0 := + _root_.finitePlaceCompletionValued vK hvKna + let vBase : Valuation vK.Completion ℝ≥0 := Valued.v + let : vBase.IsNontrivial := + (inferInstance : + (NormedField.valuation + (K := vK.Completion)).IsNontrivial) + let : ValuativeRel vK.Completion := + _root_.finitePlaceCompletionValuativeRel vK hvKna + let : vBase.Compatible := + Valuation.Compatible.ofValuation vBase + let : ValuativeRel.IsNontrivial vK.Completion := + (ValuativeRel.isNontrivial_iff_isNontrivial vBase).2 + inferInstance + let : IsValuativeTopology vK.Completion := + isValuativeTopology_of_valued_ofValuation + vK.Completion ℝ≥0 + let : IsNonarchimedeanLocalField vK.Completion := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + change + ideleClassNormLocalHigherUnitExponent (K := K) (L := L) v = + LocalClassFieldTheory.localConductorExponent vK.Completion E + have hbridge (n : ℕ) : + RayClass.localHigherUnitGroup v n ≤ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v ↔ + LocalFieldTheory.fieldPrincipalUnits vK.Completion n ≤ + LocalFieldTheory.localNormSubgroup + vK.Completion E := by + simpa [vK, hvK, hvKna, w, E] using + (localHigherUnitGroup_le_normSubgroup_iff_fieldPrincipalUnits_le_normSubgroup + (K := K) (L := L) v n) + apply le_antisymm + · apply + ideleClassNormLocalHigherUnitExponent_min + (K := K) (L := L) v + exact + (hbridge + (LocalClassFieldTheory.localConductorExponent + vK.Completion E)).2 + (LocalClassFieldTheory.localConductorExponent_spec + vK.Completion E) + · apply + LocalClassFieldTheory.localConductorExponent_min + vK.Completion E + exact + (hbridge + (ideleClassNormLocalHigherUnitExponent + (K := K) (L := L) v)).1 + (ideleClassNormLocalHigherUnitExponent_spec + (K := K) (L := L) v) + +end Abelian + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianNormConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianNormConductor.lean new file mode 100644 index 0000000000..307bde63c5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianNormConductor.lean @@ -0,0 +1,276 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FiniteRestrictedProductBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.UnramifiedConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +/-! +# Unramified finite places and abelian norm conductors + +For a finite abelian extension of number fields, the selected local +higher-unit exponent of the actual idèle-class norm subgroup vanishes +exactly at the finite places where the chosen completed extension is +unramified. + +The converse to the general unramifiedness implication uses finite local +reciprocity. Integral units are transported from the adic completion +used by the idèle library to the absolute-value completion used by local +class field theory, and the local conductor-zero criterion then detects +unramifiedness. +-/ + +@[expose] public section + +open scoped NumberField NNReal ValuativeRel + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain +open AlgebraicNumberTheory.Valuations +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + +omit [NumberField L] in +open scoped Classical in +/-- For a finite abelian extension, the chosen finite-place norm +conductor has exponent zero exactly when the chosen completed extension +is unramified. -/ +theorem + ideleClassNormLocalHigherUnitExponent_eq_zero_iff_chosenFinitePlaceIsUnramified + (v : HeightOneSpectrum (𝓞 K)) : + ideleClassNormLocalHigherUnitExponent + (K := K) (L := L) v = 0 ↔ + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v := by + constructor + · intro hzero + have hadic : + (v.adicCompletionIntegers K).units ≤ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := + (ideleClassNormLocalHigherUnitExponent_eq_zero_iff + (K := K) (L := L) v).1 hzero + let vK := HeightOneSpectrum.adicAbv K v + let w := _root_.chosenFinitePlaceExtension (L := L) v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let hvKna : IsNonarchimedean (vK : K → ℝ) := + HeightOneSpectrum.isNonarchimedean_adicAbv K v + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let := + LocalClassFieldTheory.localizedCompletionGlobalAlgebra vK w + let := + LocalClassFieldTheory.localizedCompletionIsScalarTower vK w + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let : FiniteDimensional vK.Completion E := + AlgebraicNumberTheory.Valuations.localizedCompletionModuleFinite vK hvK w + let : IsAbelianGalois vK.Completion E := + LocalClassFieldTheory.localizedCompletion_isAbelianGalois + vK hvK w + let : NontriviallyNormedField vK.Completion := + absoluteValueExtensionCompletionNontriviallyNormedField + vK hvK + let : LocallyCompactSpace vK.Completion := + AbsoluteValue.Completion.locallyCompactSpace + (_root_.finitePlaceCompletionBaseMap_isometry v) + let : IsUltrametricDist vK.Completion := + completionIsUltrametricDist vK hvKna + let : Valued vK.Completion ℝ≥0 := + _root_.finitePlaceCompletionValued vK hvKna + let vBase : Valuation vK.Completion ℝ≥0 := Valued.v + let : vBase.IsNontrivial := + (inferInstance : + (NormedField.valuation + (K := vK.Completion)).IsNontrivial) + let : ValuativeRel vK.Completion := + _root_.finitePlaceCompletionValuativeRel vK hvKna + let : vBase.Compatible := + Valuation.Compatible.ofValuation vBase + let : ValuativeRel.IsNontrivial vK.Completion := + (ValuativeRel.isNontrivial_iff_isNontrivial vBase).2 + inferInstance + let : IsValuativeTopology vK.Completion := + isValuativeTopology_of_valued_ofValuation + vK.Completion ℝ≥0 + let : IsNonarchimedeanLocalField vK.Completion := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + let : FiniteDimensional vK.Completion w.1.Completion := + AlgebraicNumberTheory.Valuations.completionModuleFinite + vK hvK w + let : ContinuousSMul vK.Completion w.1.Completion := + continuousSMul_of_algebraMap _ _ + (AbsoluteValue.completionMap_isometry + vK w.1 w.2).continuous + let : LocallyCompactSpace w.1.Completion := + LocallyCompactSpace.of_finiteDimensional_of_complete + vK.Completion w.1.Completion + let eCompletion : E ≃ᵢ w.1.Completion := + { toEquiv := + (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + vK hvK w).toEquiv + isometry_toFun := Isometry.of_dist_eq fun _ _ => rfl } + let : LocallyCompactSpace E := + (eCompletion.toHomeomorph.locallyCompactSpace_iff).2 + inferInstance + let : IsUltrametricDist E := + _root_.localizedCompletionIsUltrametricDist + vK w hvKna + let : Valued E ℝ≥0 := + _root_.localizedCompletionFinitePlaceValued + vK w hvKna + let : ValuativeRel E := + _root_.localizedCompletionFinitePlaceValuativeRel + vK w hvKna + let vExtension : Valuation E ℝ≥0 := Valued.v + let : vExtension.Compatible := + Valuation.Compatible.ofValuation vExtension + let vExtensionRel := ValuativeRel.valuation E + let : Valuation.HasExtension + (ValuativeRel.valuation vK.Completion) + vExtensionRel := + _root_.localizedCompletionValuationHasExtension + vK w hvKna + let : vExtensionRel.IsNontrivial := + Valuation.IsNontrivial.of_hasExtension + (ValuativeRel.valuation vK.Completion) + vExtensionRel + let : ValuativeRel.IsNontrivial E := + (ValuativeRel.isNontrivial_iff_isNontrivial + vExtensionRel).2 inferInstance + let : IsValuativeTopology E := + isValuativeTopology_of_valued_ofValuation E ℝ≥0 + let : IsNonarchimedeanLocalField E := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + let : Algebra 𝒪[vK.Completion] E := + Algebra.ofSubsemiring 𝒪[vK.Completion] + let : + IsIntegralClosure 𝒪[E] 𝒪[vK.Completion] E := + _root_.localizedCompletionIsIntegralClosureWithExtension + vK w hvK hvKna + let : Module.Finite 𝒪[vK.Completion] 𝒪[E] := + integerRing_moduleFinite_of_isIntegralClosure + vK.Completion E + let eField : + vK.Completion ≃+* v.adicCompletion K := + _root_.finitePlaceCompletionRingEquiv v + have hmem (x : vK.Completion) : + eField x ∈ v.adicCompletionIntegers K ↔ + x ∈ 𝒪[vK.Completion] := by + simpa [vK, eField] using + (_root_.finitePlaceCompletionRingEquiv_mem_integers_iff + v x) + let e : + vK.Completionˣ ≃ₜ* (v.adicCompletion K)ˣ := + _root_.finitePlaceCompletionUnitsContinuousMulEquiv v + have hfield : + LocalFieldTheory.fieldPrincipalUnits + vK.Completion 0 ≤ + LocalFieldTheory.localNormSubgroup + vK.Completion E := by + intro x hx + change + x ∈ + (LocalFieldTheory.principalUnits + vK.Completion 0).map + (LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits + vK.Completion) at hx + rcases hx with ⟨u, _hu, rfl⟩ + have hxIntegral : + LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits + vK.Completion u ∈ + (𝒪[vK.Completion]).units := by + rw [Submonoid.mem_units_iff] + exact ⟨u.1.2, u.2.2⟩ + have heIntegral : + e (LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits + vK.Completion u) ∈ + (v.adicCompletionIntegers K).units := by + change + Units.mapEquiv eField.toMulEquiv + (LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits + vK.Completion u) ∈ + (v.adicCompletionIntegers K).units + exact + (_root_.unitsMapEquiv_mem_units_iff + eField.toMulEquiv + (𝒪[vK.Completion]).toSubmonoid + (v.adicCompletionIntegers K).toSubmonoid + hmem + (LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits + vK.Completion u)).2 hxIntegral + have heNorm := hadic heIntegral + change + e (LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits + vK.Completion u) ∈ + (LocalFieldTheory.localNormSubgroup + vK.Completion E).map e.toMonoidHom at heNorm + rcases heNorm with ⟨z, hz, hze⟩ + have hzEq : + z = + LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits + vK.Completion u := + e.injective hze + exact hzEq ▸ hz + have hlocalConductor : + LocalClassFieldTheory.localConductorExponent + vK.Completion E = 0 := + (LocalClassFieldTheory.localConductorExponent_eq_zero_iff + vK.Completion E).2 hfield + have hunramified : + IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + vK.Completion E := + (LocalClassFieldTheory.isUnramifiedValuedExtension_iff_localConductorExponent_eq_zero + vK.Completion E).2 hlocalConductor + simpa [_root_.ChosenFinitePlaceIsUnramified] using + hunramified + · intro hunramified + exact + ideleClassNormLocalHigherUnitExponent_eq_zero_of_chosenUnramified + (K := K) (L := L) v hunramified + +open scoped Classical in +/-- For a finite abelian extension, the constructed norm modulus is +supported at exactly the finite places where the chosen completed +extension is ramified. -/ +theorem + mem_ideleClassNormDefiningModulus_support_iff_not_chosenFinitePlaceIsUnramified + (v : HeightOneSpectrum (𝓞 K)) : + v ∈ + (ideleClassNormDefiningModulus + (K := K) (L := L)).support ↔ + ¬ _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v := by + rw [mem_ideleClassNormDefiningModulus_support_iff] + exact + not_congr + ((ideleClassNormLocalHigherUnitExponent_eq_zero_iff + (K := K) (L := L) v).symm.trans + (ideleClassNormLocalHigherUnitExponent_eq_zero_iff_chosenFinitePlaceIsUnramified + (K := K) (L := L) v)) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/All.lean new file mode 100644 index 0000000000..2ddb201804 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/All.lean @@ -0,0 +1,94 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianLocalConductorComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianNormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticClassFieldCorrespondence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticHilbertClassFieldReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticRayClassFieldReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldMathlibArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldOverOriginalBase +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldConstruction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldNormRange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldOriginalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.Conductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorInfinitePart +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLattice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLocalComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorRayClassMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicConductorUniqueness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicRayClassMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclotomicKummerNormDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.EmbeddedAbelianSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondenceTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteIndexNormClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FinitePlaceArtinQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FullConductorRayClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximalSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldPrimeSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldUnramifiedMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertNormCharacterization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.InfiniteAbelianClassFieldCorrespondence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.KummerNormDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibGlobalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormLimitation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormRayClassMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormTowerConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.OrdinaryNormClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PowerCongruenceCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealArtinKernelComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormArtinKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormQuotientComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RationalRayPrimeClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassModulusProjection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupFieldAntitone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayPrimeGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMaximalSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldOverOriginalBase +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMathlibArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertNormCharacterization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeNormClass +/-! +# Global class fields + +This public root exports the finite abelian class-field correspondence for +closed finite-index idèle-class subgroups, exact conductor and ramification +theory, and the actual big and small Hilbert class fields with their maximality +and reciprocity characterizations. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticClassFieldCorrespondence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticClassFieldCorrespondence.lean new file mode 100644 index 0000000000..909f10c37b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticClassFieldCorrespondence.lean @@ -0,0 +1,185 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Evaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.GlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +/-! +# Arithmetic topological class-field correspondence + +For a closed finite-index subgroup `H ≤ C_K`, the selected actual +class field has norm range exactly `H`. This module records the +canonical arithmetic reciprocity homeomorphism +`Gal(L/K) ≃ₜ* C_K/H`, so both the field and the topological group map +are fixed rather than merely asserted to exist. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- Fix the commutative idèle-class instance path used by every quotient in +this module, so the norm quotient and the literal quotient share one normality +construction during elaboration. -/ +local instance + arithmeticClassFieldCorrespondenceIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] arithmeticClassFieldCorrespondenceIdeleClassGroupIsMulCommutative + +open scoped Classical in +private noncomputable def + arithmeticClosedFiniteIndexClassFieldReciprocityData + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + {e : Gal((closedFiniteIndexClassField + (K := K) H hclosed)/K) ≃ₜ* + IdeleClassGroup K ⧸ H // + ∀ c : IdeleClassGroup K, + e (arithmeticGlobalNormResidueMonoidHom K + (closedFiniteIndexClassField + (K := K) H hclosed) c) = + QuotientGroup.mk' H c} := by + letI : DiscreteTopology + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K + (closedFiniteIndexClassField + (K := K) H hclosed)).range) := + ideleClassNormQuotient_discreteTopology K + (closedFiniteIndexClassField + (K := K) H hclosed) + letI : DiscreteTopology + (IdeleClassGroup K ⧸ H) := + QuotientGroup.discreteTopology + (Subgroup.isOpen_of_isClosed_of_finiteIndex H hclosed) + let quotientTransport : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K + (closedFiniteIndexClassField + (K := K) H hclosed)).range) ≃ₜ* + IdeleClassGroup K ⧸ H := + { QuotientGroup.quotientMulEquivOfEq + (closedFiniteIndexClassField_ideleClassNorm_range + (K := K) H hclosed) with + continuous_toFun := continuous_of_discreteTopology + continuous_invFun := continuous_of_discreteTopology } + refine + ⟨(arithmeticGlobalReciprocityContinuousMulEquiv + K (closedFiniteIndexClassField + (K := K) H hclosed)).trans quotientTransport, ?_⟩ + intro c + calc + ((arithmeticGlobalReciprocityContinuousMulEquiv + K (closedFiniteIndexClassField + (K := K) H hclosed)).trans quotientTransport) + (arithmeticGlobalNormResidueMonoidHom K + (closedFiniteIndexClassField + (K := K) H hclosed) c) = + quotientTransport + (arithmeticGlobalReciprocityContinuousMulEquiv K + (closedFiniteIndexClassField + (K := K) H hclosed) + (arithmeticGlobalNormResidueMonoidHom K + (closedFiniteIndexClassField + (K := K) H hclosed) c)) := rfl + _ = quotientTransport + (QuotientGroup.mk' + (_root_.ideleClassNorm K + (closedFiniteIndexClassField + (K := K) H hclosed)).range c) := + congrArg quotientTransport + (arithmeticGlobalReciprocityContinuousMulEquiv_globalNormResidue + K (closedFiniteIndexClassField + (K := K) H hclosed) c) + _ = QuotientGroup.mk' H c := + QuotientGroup.quotientMulEquivOfEq_mk + (closedFiniteIndexClassField_ideleClassNorm_range + (K := K) H hclosed) c + +open scoped Classical in +/-- Arithmetic global reciprocity for the actual class field selected +by a closed finite-index idèle-class subgroup. -/ +noncomputable def + arithmeticClosedFiniteIndexClassFieldGaloisContinuousMulEquivNormQuotient + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + Gal((closedFiniteIndexClassField + (K := K) H hclosed)/K) ≃ₜ* + IdeleClassGroup K ⧸ H := + (arithmeticClosedFiniteIndexClassFieldReciprocityData + (K := K) H hclosed).1 + +open scoped Classical in +/-- The arithmetic norm-residue symbol of an idèle class maps to its +literal class modulo the defining subgroup. -/ +theorem + arithmeticClosedFiniteIndexClassFieldGaloisContinuousMulEquivNormQuotient_globalNormResidue + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] + (c : IdeleClassGroup K) : + arithmeticClosedFiniteIndexClassFieldGaloisContinuousMulEquivNormQuotient + (K := K) H hclosed + (arithmeticGlobalNormResidueMonoidHom K + (closedFiniteIndexClassField + (K := K) H hclosed) c) = + QuotientGroup.mk' H c := by + exact + (arithmeticClosedFiniteIndexClassFieldReciprocityData + (K := K) H hclosed).2 c + +open scoped Classical in +/-- The inverse correspondence sends a represented class modulo `H` +to its actual arithmetic global norm-residue automorphism. -/ +theorem + arithmeticClosedFiniteIndexClassFieldGaloisContinuousMulEquivNormQuotient_symm_mk + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] + (c : IdeleClassGroup K) : + (arithmeticClosedFiniteIndexClassFieldGaloisContinuousMulEquivNormQuotient + (K := K) H hclosed).symm + (QuotientGroup.mk' H c) = + arithmeticGlobalNormResidueMonoidHom K + (closedFiniteIndexClassField + (K := K) H hclosed) c := by + let d := + arithmeticClosedFiniteIndexClassFieldReciprocityData + (K := K) H hclosed + change + d.1.symm (QuotientGroup.mk' H c) = + arithmeticGlobalNormResidueMonoidHom K + (closedFiniteIndexClassField + (K := K) H hclosed) c + exact d.1.symm_apply_eq.mpr (d.2 c).symm + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticHilbertClassFieldReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticHilbertClassFieldReciprocity.lean new file mode 100644 index 0000000000..e88ff144d9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticHilbertClassFieldReciprocity.lean @@ -0,0 +1,260 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.Transport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigActual +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallActual +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigOriginal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallOriginal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +/-! +# Arithmetic reciprocity for the actual Hilbert class fields + +The canonical ideal-theoretic Artin map uses arithmetic Frobenius. +Accordingly, these equivalences use arithmetic global reciprocity +before identifying the intrinsic Hilbert norm quotient with the narrow +or ordinary ideal class group. The class groups in the current API +carry no native topological structure, so the mathematically correct +public bundle here is `MulEquiv`; the preceding Galois/norm-quotient +factor remains a `ContinuousMulEquiv`. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- Fix the commutative idèle-class instance path shared by the norm quotient +and its transported literal quotient throughout this module. -/ +local instance + arithmeticHilbertClassFieldIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] arithmeticHilbertClassFieldIdeleClassGroupIsMulCommutative + +open scoped Classical in +/-- Arithmetic reciprocity followed by transport between equal norm +quotients sends a norm-residue symbol to its represented quotient class. -/ +private theorem + arithmeticReciprocity_quotientTransport_globalNormResidue + {F E : Type} [Field F] [NumberField F] + [Field E] [NumberField E] [Algebra F E] + [FiniteDimensional F E] [IsAbelianGalois F E] + (H : Subgroup (IdeleClassGroup F)) + (h : (_root_.ideleClassNorm F E).range = H) + (c : IdeleClassGroup F) : + QuotientGroup.quotientMulEquivOfEq h + (arithmeticGlobalReciprocityContinuousMulEquiv F E + (arithmeticGlobalNormResidueMonoidHom F E c)) = + QuotientGroup.mk' H c := by + let e := arithmeticGlobalReciprocityContinuousMulEquiv F E + let q := + QuotientGroup.mk' + (_root_.ideleClassNorm F E).range c + have hsymm : + e.symm q = arithmeticGlobalNormResidueMonoidHom F E c := + arithmeticGlobalReciprocityContinuousMulEquiv_symm_mk F E c + have he : + e (arithmeticGlobalNormResidueMonoidHom F E c) = q := by + calc + e (arithmeticGlobalNormResidueMonoidHom F E c) = + e (e.symm q) := + congrArg (fun σ => e σ) hsymm.symm + _ = q := e.apply_symm_apply q + calc + QuotientGroup.quotientMulEquivOfEq h + (arithmeticGlobalReciprocityContinuousMulEquiv F E + (arithmeticGlobalNormResidueMonoidHom F E c)) = + QuotientGroup.quotientMulEquivOfEq h q := + congrArg + (fun x => QuotientGroup.quotientMulEquivOfEq h x) he + _ = QuotientGroup.mk' H c := + QuotientGroup.quotientMulEquivOfEq_mk h c + +open scoped Classical in +/-- Postcomposing transported arithmetic reciprocity with any quotient +equivalence preserves the represented quotient class formula. -/ +private theorem + arithmeticReciprocity_quotientTransport_trans_globalNormResidue + {F E A : Type} [Field F] [NumberField F] + [Field E] [NumberField E] [Algebra F E] + [FiniteDimensional F E] [IsAbelianGalois F E] + [Group A] + (H : Subgroup (IdeleClassGroup F)) + (h : (_root_.ideleClassNorm F E).range = H) + (f : (IdeleClassGroup F ⧸ H) ≃* A) + (c : IdeleClassGroup F) : + ((arithmeticGlobalReciprocityContinuousMulEquiv F E).toMulEquiv.trans + ((QuotientGroup.quotientMulEquivOfEq h).trans f)) + (arithmeticGlobalNormResidueMonoidHom F E c) = + f (QuotientGroup.mk' H c) := by + calc + ((arithmeticGlobalReciprocityContinuousMulEquiv F E).toMulEquiv.trans + ((QuotientGroup.quotientMulEquivOfEq h).trans f)) + (arithmeticGlobalNormResidueMonoidHom F E c) = + f + (QuotientGroup.quotientMulEquivOfEq h + (arithmeticGlobalReciprocityContinuousMulEquiv F E + (arithmeticGlobalNormResidueMonoidHom F E c))) := rfl + _ = f (QuotientGroup.mk' H c) := + congrArg f + (arithmeticReciprocity_quotientTransport_globalNormResidue + H h c) + +open scoped Classical in +private noncomputable def arithmeticBigHilbertClassFieldReciprocityData + (K : Type) [Field K] [NumberField K] : + { e : Gal((bigHilbertClassField K)/K) ≃* + RayClass.NarrowClassGroup K // + ∀ c : IdeleClassGroup K, + e (arithmeticGlobalNormResidueMonoidHom + K (bigHilbertClassField K) c) = + bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K) + (QuotientGroup.mk' + (bigHilbertClassFieldNormSubgroup (K := K)) c) } := + ⟨(arithmeticGlobalReciprocityContinuousMulEquiv + K (bigHilbertClassField K)).toMulEquiv.trans + ((QuotientGroup.quotientMulEquivOfEq + (bigHilbertClassField_ideleClassNorm_range_over_original + (K := K))).trans + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K))), + arithmeticReciprocity_quotientTransport_trans_globalNormResidue + (bigHilbertClassFieldNormSubgroup (K := K)) + (bigHilbertClassField_ideleClassNorm_range_over_original + (K := K)) + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K))⟩ + +open scoped Classical in +private noncomputable def arithmeticSmallHilbertClassFieldReciprocityData + (K : Type) [Field K] [NumberField K] : + { e : Gal((smallHilbertClassField K)/K) ≃* + ClassGroup (𝓞 K) // + ∀ c : IdeleClassGroup K, + e (arithmeticGlobalNormResidueMonoidHom + K (smallHilbertClassField K) c) = + smallHilbertClassFieldQuotientEquivClassGroup + (K := K) + (QuotientGroup.mk' + (smallHilbertClassFieldNormSubgroup (K := K)) c) } := + ⟨(arithmeticGlobalReciprocityContinuousMulEquiv + K (smallHilbertClassField K)).toMulEquiv.trans + ((QuotientGroup.quotientMulEquivOfEq + (smallHilbertClassField_ideleClassNorm_range_over_original + (K := K))).trans + (smallHilbertClassFieldQuotientEquivClassGroup + (K := K))), + arithmeticReciprocity_quotientTransport_trans_globalNormResidue + (smallHilbertClassFieldNormSubgroup (K := K)) + (smallHilbertClassField_ideleClassNorm_range_over_original + (K := K)) + (smallHilbertClassFieldQuotientEquivClassGroup + (K := K))⟩ + +open scoped Classical in +/-- Arithmetic global reciprocity for the selected big Hilbert class +field over the original number field. -/ +noncomputable def + arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroupOverOriginal : + Gal((bigHilbertClassField K)/K) ≃* + RayClass.NarrowClassGroup K := + (arithmeticBigHilbertClassFieldReciprocityData K).1 + +open scoped Classical in +/-- The arithmetic global norm-residue symbol maps to its genuine +narrow ideal class. -/ +theorem + arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroupOverOriginal_globalNormResidue + (c : IdeleClassGroup K) : + arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroupOverOriginal + (K := K) + (arithmeticGlobalNormResidueMonoidHom + K (bigHilbertClassField K) c) = + bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K) + (QuotientGroup.mk' + (bigHilbertClassFieldNormSubgroup (K := K)) c) := by + exact (arithmeticBigHilbertClassFieldReciprocityData K).2 c + +open scoped Classical in +/-- On an actual idèle, arithmetic big-Hilbert reciprocity is its +narrow ideal class. -/ +theorem + arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroupOverOriginal_idele + (a : IdeleGroup K) : + arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroupOverOriginal + (K := K) + (arithmeticGlobalNormResidueMonoidHom + K (bigHilbertClassField K) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a)) = + QuotientGroup.mk' + (RayClass.narrowDenominator (K := K)) a := by + rw [ + arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroupOverOriginal_globalNormResidue, + bigHilbertClassFieldQuotientEquivNarrowClassGroup_mk] + +open scoped Classical in +/-- Arithmetic global reciprocity for the selected small Hilbert class +field over the original number field. -/ +noncomputable def + arithmeticSmallHilbertClassFieldGaloisEquivClassGroupOverOriginal : + Gal((smallHilbertClassField K)/K) ≃* + ClassGroup (𝓞 K) := + (arithmeticSmallHilbertClassFieldReciprocityData K).1 + +open scoped Classical in +/-- The arithmetic global norm-residue symbol maps to its genuine +ordinary ideal class. -/ +theorem + arithmeticSmallHilbertClassFieldGaloisEquivClassGroupOverOriginal_globalNormResidue + (c : IdeleClassGroup K) : + arithmeticSmallHilbertClassFieldGaloisEquivClassGroupOverOriginal + (K := K) + (arithmeticGlobalNormResidueMonoidHom + K (smallHilbertClassField K) c) = + smallHilbertClassFieldQuotientEquivClassGroup + (K := K) + (QuotientGroup.mk' + (smallHilbertClassFieldNormSubgroup (K := K)) c) := by + exact (arithmeticSmallHilbertClassFieldReciprocityData K).2 c + +open scoped Classical in +/-- On an actual idèle, arithmetic small-Hilbert reciprocity is its +ordinary ideal class. -/ +theorem + arithmeticSmallHilbertClassFieldGaloisEquivClassGroupOverOriginal_idele + (a : IdeleGroup K) : + arithmeticSmallHilbertClassFieldGaloisEquivClassGroupOverOriginal + (K := K) + (arithmeticGlobalNormResidueMonoidHom + K (smallHilbertClassField K) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a)) = + IdeleGroup.idealClass a := by + rw [ + arithmeticSmallHilbertClassFieldGaloisEquivClassGroupOverOriginal_globalNormResidue, + smallHilbertClassFieldQuotientEquivClassGroup_mk] + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean new file mode 100644 index 0000000000..430c0e545c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean @@ -0,0 +1,196 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +/-! +# Arithmetic reciprocity for actual ray class fields + +This is the canonical topological isomorphism +`Gal(Kᵐ/K) ≃ₜ* C_K/C_Kᵐ` with arithmetic Frobenius +normalization. It uses the actual selected ray class field, its exact +idèle norm range, the finite Krull topology, and the native ray-class +quotient topology. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField +open Reciprocity + +open scoped Classical in +private theorem arithmeticRayClassIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] arithmeticRayClassIdeleClassGroupIsMulCommutative + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- Arithmetic reciprocity followed by transport between equal norm +quotients sends a norm-residue symbol to its represented quotient class. -/ +private theorem + arithmeticReciprocity_quotientMulEquivOfEq_globalNormResidue + {F E : Type} [Field F] [NumberField F] + [Field E] [NumberField E] [Algebra F E] + [FiniteDimensional F E] [IsAbelianGalois F E] + (H : Subgroup (IdeleClassGroup F)) + (h : (_root_.ideleClassNorm F E).range = H) + (c : IdeleClassGroup F) : + QuotientGroup.quotientMulEquivOfEq h + (arithmeticGlobalReciprocityContinuousMulEquiv F E + (arithmeticGlobalNormResidueMonoidHom F E c)) = + QuotientGroup.mk' H c := by + let e := arithmeticGlobalReciprocityContinuousMulEquiv F E + let q := + QuotientGroup.mk' + (_root_.ideleClassNorm F E).range c + have hsymm : + e.symm q = arithmeticGlobalNormResidueMonoidHom F E c := + arithmeticGlobalReciprocityContinuousMulEquiv_symm_mk F E c + have he : + e (arithmeticGlobalNormResidueMonoidHom F E c) = q := by + calc + e (arithmeticGlobalNormResidueMonoidHom F E c) = + e (e.symm q) := + congrArg (fun σ => e σ) hsymm.symm + _ = q := e.apply_symm_apply q + calc + QuotientGroup.quotientMulEquivOfEq h + (arithmeticGlobalReciprocityContinuousMulEquiv F E + (arithmeticGlobalNormResidueMonoidHom F E c)) = + QuotientGroup.quotientMulEquivOfEq h q := + congrArg (fun x => QuotientGroup.quotientMulEquivOfEq h x) he + _ = QuotientGroup.mk' H c := + QuotientGroup.quotientMulEquivOfEq_mk h c + +open scoped Classical in +/-- Arithmetic global reciprocity for the actual selected ray class +field, bundled with both native topologies. -/ +noncomputable def + arithmeticRayClassFieldGaloisContinuousMulEquivRayClassGroup + (m : RayClass.Modulus K) : + Gal((rayClassField K m)/K) ≃ₜ* + RayClass.RayClassGroup m := by + letI normQuotientDiscreteTopology : DiscreteTopology + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm + K (rayClassField K m)).range) := + ideleClassNormQuotient_discreteTopology + K (rayClassField K m) + letI rayClassGroupDiscreteTopology : DiscreteTopology + (RayClass.RayClassGroup m) := + QuotientGroup.discreteTopology + (RayClass.isOpen_congruenceSubgroup m) + let quotientTransport : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm + K (rayClassField K m)).range) ≃ₜ* + RayClass.RayClassGroup m := + { QuotientGroup.quotientMulEquivOfEq + (rayClassField_ideleClassNorm_range_over_original + (K := K) m) with + continuous_toFun := continuous_of_discreteTopology + continuous_invFun := continuous_of_discreteTopology } + exact + (arithmeticGlobalReciprocityContinuousMulEquiv + K (rayClassField K m)).trans + quotientTransport + +open scoped Classical in +/-- Pointwise evaluation of arithmetic ray-class reciprocity separates +global reciprocity from the transport between the equal norm quotients. -/ +private theorem + arithmeticRayClassFieldGaloisContinuousMulEquivRayClassGroup_apply + (m : RayClass.Modulus K) + (σ : Gal((rayClassField K m)/K)) : + arithmeticRayClassFieldGaloisContinuousMulEquivRayClassGroup + (K := K) m σ = + QuotientGroup.quotientMulEquivOfEq + (rayClassField_ideleClassNorm_range_over_original + (K := K) m) + (arithmeticGlobalReciprocityContinuousMulEquiv + K (rayClassField K m) σ) := by + rfl + +open scoped Classical in +/-- Arithmetic ray-class reciprocity sends the arithmetic global +norm-residue symbol of an idèle class to its literal ray class. -/ +theorem + arithmeticRayClassFieldGaloisContinuousMulEquivRayClassGroup_globalNormResidue + (m : RayClass.Modulus K) + (c : IdeleClassGroup K) : + arithmeticRayClassFieldGaloisContinuousMulEquivRayClassGroup + (K := K) m + (arithmeticGlobalNormResidueMonoidHom + K (rayClassField K m) c) = + QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup m) c := by + calc + arithmeticRayClassFieldGaloisContinuousMulEquivRayClassGroup + (K := K) m + (arithmeticGlobalNormResidueMonoidHom + K (rayClassField K m) c) = + QuotientGroup.quotientMulEquivOfEq + (rayClassField_ideleClassNorm_range_over_original + (K := K) m) + (arithmeticGlobalReciprocityContinuousMulEquiv + K (rayClassField K m) + (arithmeticGlobalNormResidueMonoidHom + K (rayClassField K m) c)) := + arithmeticRayClassFieldGaloisContinuousMulEquivRayClassGroup_apply + (K := K) m _ + _ = QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup m) c := + arithmeticReciprocity_quotientMulEquivOfEq_globalNormResidue + (RayClass.Modulus.congruenceSubgroup m) + (rayClassField_ideleClassNorm_range_over_original + (K := K) m) c + +open scoped Classical in +/-- Inverse arithmetic ray reciprocity sends a represented ray class +back to the arithmetic global norm-residue symbol. -/ +theorem + arithmeticRayClassFieldGaloisContinuousMulEquivRayClassGroup_symm_mk + (m : RayClass.Modulus K) + (c : IdeleClassGroup K) : + (arithmeticRayClassFieldGaloisContinuousMulEquivRayClassGroup + (K := K) m).symm + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup m) c) = + arithmeticGlobalNormResidueMonoidHom + K (rayClassField K m) c := by + let e := + arithmeticRayClassFieldGaloisContinuousMulEquivRayClassGroup + (K := K) m + apply e.injective + calc + e (e.symm + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup m) c)) = + QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup m) c := + e.apply_symm_apply _ + _ = e + (arithmeticGlobalNormResidueMonoidHom + K (rayClassField K m) c) := + (arithmeticRayClassFieldGaloisContinuousMulEquivRayClassGroup_globalNormResidue + (K := K) m c).symm + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticUnramifiedPrimeArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticUnramifiedPrimeArtin.lean new file mode 100644 index 0000000000..62b21ce274 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticUnramifiedPrimeArtin.lean @@ -0,0 +1,165 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.UnramifiedNormalization +/-! +# Arithmetic Frobenius at an unramified finite place + +The pre-existing local class-formation coordinate has geometric +Frobenius normalization. This file supplies the canonical prime Artin +element used in the ideal-theoretic formulation: the ordinary normalized +prime idèle maps to arithmetic Frobenius. +-/ + +@[expose] public section + +open scoped NumberField +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain IdeleGroup + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + +open scoped Classical in +/-- The arithmetic global Artin element of the ordinary normalized +one-place prime idèle. -/ +noncomputable def arithmeticFinitePlacePrimeArtin + (v : HeightOneSpectrum (𝓞 K)) : + L ≃ₐ[K] L := + Reciprocity.arithmeticGlobalArtinMonoidHom K L + (finitePrimeIdele v) + +open scoped Classical in +/-- The arithmetic prime Artin element is the arithmetic chosen local +Artin value of the normalized order-one element. -/ +@[simp] +theorem arithmeticFinitePlacePrimeArtin_eq_arithmeticChosenFinitePlaceArtin + (v : HeightOneSpectrum (𝓞 K)) : + arithmeticFinitePlacePrimeArtin (K := K) (L := L) v = + Reciprocity.arithmeticChosenFinitePlaceArtinMonoidHom + K L v (FiniteIdeleGroup.chosenLocalOrderSection v 1) := by + rw [arithmeticFinitePlacePrimeArtin, finitePrimeIdele, + Reciprocity.arithmeticGlobalArtinMonoidHom_finitePlaceIdele] + +open scoped Classical in +/-- Arithmetic and geometric prime Artin elements are inverse +automorphisms. -/ +theorem arithmeticFinitePlacePrimeArtin_eq_inv + (v : HeightOneSpectrum (𝓞 K)) : + arithmeticFinitePlacePrimeArtin (K := K) (L := L) v = + (finitePlacePrimeArtin (K := K) (L := L) v)⁻¹ := by + rw [arithmeticFinitePlacePrimeArtin, + Reciprocity.arithmeticGlobalArtinMonoidHom_apply, + finitePlacePrimeArtin] + +open scoped Classical in +/-- The arithmetic Frobenius of the actual chosen completed extension, +transported through its decomposition group into the global Galois group. +The unramifiedness hypothesis concerns this chosen extension, not an +unrelated abstract local field. -/ +noncomputable def chosenFinitePlaceArithmeticFrobenius + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + L ≃ₐ[K] L := by + let w := chosenFinitePlaceExtension (L := L) v + exact Reciprocity.finitePlaceLocalToGlobalMonoidHom + (K := K) (L := L) v w + (Reciprocity.chosenFinitePlaceLocalArithmeticFrobenius + (K := K) (L := L) v hunram) + +open scoped Classical in +/-- At an unramified chosen finite place, the arithmetic prime Artin +element really is the global decomposition-group transport of local +arithmetic Frobenius. The local input has valuation `-1` in the +construction's convention, and arithmetic global reciprocity inverts +that geometric local Artin value. -/ +theorem arithmeticFinitePlacePrimeArtin_eq_chosenFinitePlaceArithmeticFrobenius + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + arithmeticFinitePlacePrimeArtin (K := K) (L := L) v = + chosenFinitePlaceArithmeticFrobenius + (K := K) (L := L) v hunram := by + let w := chosenFinitePlaceExtension (L := L) v + let x : (v.adicCompletion K)ˣ := + FiniteIdeleGroup.chosenLocalOrderSection v 1 + have hgeometric : + Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x = + (chosenFinitePlaceArithmeticFrobenius + (K := K) (L := L) v hunram)⁻¹ := by + change Reciprocity.finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v w x = _ + rw [Reciprocity.finitePlaceArtinMonoidHomOfExtension_factor] + change Reciprocity.finitePlaceLocalToGlobalMonoidHom + (K := K) (L := L) v w + (Reciprocity.finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v w x) = _ + rw [Reciprocity.chosenFinitePlaceLocalArtin_eq_arithmeticFrobenius_inv_of_unramified + (K := K) (L := L) v hunram, map_inv] + rfl + rw [arithmeticFinitePlacePrimeArtin_eq_arithmeticChosenFinitePlaceArtin, + Reciprocity.arithmeticChosenFinitePlaceArtinMonoidHom_apply] + rw [hgeometric, inv_inv] + +open scoped Classical in +/-- At an unramified chosen place, the arithmetic prime Artin element +has order equal to the local extension degree. -/ +theorem + orderOf_arithmeticFinitePlacePrimeArtin_eq_finitePlaceLocalDegree_of_chosenUnramified + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + orderOf + (arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v) = + _root_.finitePlaceLocalDegree + (K := K) (L := L) v := by + rw [arithmeticFinitePlacePrimeArtin_eq_inv, + orderOf_inv] + exact + orderOf_finitePlacePrimeArtin_eq_finitePlaceLocalDegree_of_chosenUnramified + (K := K) (L := L) v hunram + +open scoped Classical in +/-- An unramified finite place splits completely exactly when its +arithmetic Frobenius is trivial. -/ +theorem + arithmeticFinitePlacePrimeArtin_eq_one_iff_splitsCompletely_of_chosenUnramified + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v = + 1 ↔ + _root_.FinitePlaceSplitsCompletely + (K := K) (L := L) v := by + rw [arithmeticFinitePlacePrimeArtin_eq_inv, inv_eq_one] + exact + finitePlacePrimeArtin_eq_one_iff_splitsCompletely_of_chosenUnramified + (K := K) (L := L) v hunram + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassField.lean new file mode 100644 index 0000000000..101da29740 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassField.lean @@ -0,0 +1,119 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Narrow +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLattice +/-! +# The big Hilbert class field + +The big Hilbert class field is the ray class field of modulus one (the +zero finite modulus in the exponent-valued representation). This file +identifies its defining norm quotient with the narrow class group. The +maximal-unramified field statement follows from this input together with +the narrow finite conductor/ramification criterion. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField + +variable {K : Type*} [Field K] [NumberField K] + +/-- The norm subgroup defining the big Hilbert class field. -/ +def bigHilbertClassFieldNormSubgroup : + Subgroup (IdeleClassGroup K) := + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)).congruenceSubgroup + +instance bigHilbertClassFieldNormSubgroup_normal : + (bigHilbertClassFieldNormSubgroup (K := K)).Normal := by + let : IsMulCommutative (IdeleClassGroup K) := + IsMulCommutative.of_comm (fun a b => mul_comm a b) + exact Subgroup.normal_of_isMulCommutative _ + +/-- The norm subgroup defining the big Hilbert class field is closed. -/ +theorem bigHilbertClassFieldNormSubgroup_isClosed : + IsClosed + ((bigHilbertClassFieldNormSubgroup (K := K) : + Subgroup (IdeleClassGroup K)) : + Set (IdeleClassGroup K)) := + RayClass.isClosed_congruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)) + +/-- The reciprocity quotient for the big Hilbert class field is the narrow +ideal class group. -/ +def bigHilbertClassFieldQuotientEquivNarrowClassGroup : + IdeleClassGroup K ⧸ + bigHilbertClassFieldNormSubgroup (K := K) ≃* + RayClass.NarrowClassGroup K := + RayClass.rayClassGroupNarrowZeroEquivNarrowClassGroup + +/-- The narrow modulus with zero finite part is a defining modulus for the +big-Hilbert norm subgroup. -/ +theorem bigHilbertClassFieldNormSubgroup_isDefiningModulus : + IsDefiningModulus + (bigHilbertClassFieldNormSubgroup (K := K)) + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)) := by + exact le_rfl + +/-- The conductorial subgroup supplied by the intrinsic big-Hilbert norm +subgroup and its narrow zero-finite defining modulus. -/ +noncomputable def bigHilbertClassFieldConductorialSubgroup : + ConductorialSubgroup K := + ⟨bigHilbertClassFieldNormSubgroup (K := K), + ⟨RayClass.Modulus.narrowOfFinite (0 : RayClass.FiniteModulus K), + bigHilbertClassFieldNormSubgroup_isDefiningModulus (K := K)⟩⟩ + +/-- Among conductorial idèle-class subgroups, containing the big-Hilbert +norm subgroup is equivalent to having narrow finite conductor zero. -/ +theorem + bigHilbertClassFieldNormSubgroup_le_iff_narrowFiniteConductor_eq_zero + (H : ConductorialSubgroup K) : + bigHilbertClassFieldNormSubgroup (K := K) ≤ H.1 ↔ + H.narrowFiniteConductor = 0 := by + constructor + · intro hH + have hdef : + IsDefiningModulus H.1 + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)) := by + simpa only [IsDefiningModulus, + bigHilbertClassFieldNormSubgroup] using hH + apply le_antisymm + · exact H.narrowFiniteConductor_le hdef + · exact bot_le + · intro hconductor + have hdef := H.narrowFiniteConductor_isDefiningModulus + rw [hconductor] at hdef + simpa only [IsDefiningModulus, + bigHilbertClassFieldNormSubgroup] using hdef + +/-- The narrow finite conductor of the big-Hilbert norm subgroup is zero. -/ +@[simp] +theorem bigHilbertClassField_narrowFiniteConductor : + (bigHilbertClassFieldConductorialSubgroup + (K := K)).narrowFiniteConductor = 0 := by + apply le_antisymm + · exact + (bigHilbertClassFieldConductorialSubgroup + (K := K)).narrowFiniteConductor_le + (bigHilbertClassFieldNormSubgroup_isDefiningModulus (K := K)) + · exact bot_le + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean new file mode 100644 index 0000000000..3c65e5e16f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean @@ -0,0 +1,203 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigOriginal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +/-! +# Arithmetic Artin reciprocity for any big Hilbert class field + +The maximal finite-prime-unramified abelian extension has the same idèle-class +norm subgroup as the selected big Hilbert class field. Arithmetic global +reciprocity therefore gives its narrow-class-group Artin isomorphism. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory.GlobalClassFieldComparison + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +local instance bigHilbertArtinIdeleClassGroupIsMulCommutative : + IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] bigHilbertArtinIdeleClassGroupIsMulCommutative + +open scoped Classical in +open GlobalClassFieldTheory.GlobalClassFields renaming + finiteUnramifiedAbelianExtension_nonempty_algHom_bigHilbertClassField → + finiteUnramifiedAbelianExtension_nonempty_algHom_bigHilbertClassField in +/-- An intrinsic big Hilbert class field is equivalent over `K` to the +selected realization. -/ +noncomputable def bigHilbertClassFieldEquivOfIsBig + (E : FiniteAbelianExtension K) (hE : IsBigHilbertClassField E) : + E ≃ₐ[K] GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassField K := by + let H := GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassField K + let f := Classical.choice + (finiteUnramifiedAbelianExtension_nonempty_algHom_bigHilbertClassField + K E ((isUnramifiedAtFinitePlaces_iff_original K E).mp hE.1)) + have hdim : Module.finrank K E = Module.finrank K H := + (GlobalClassFieldComparison.bigHilbertClassField_degree_eq_narrowClassGroup_card_of_isBig K + E hE).trans + (GlobalClassFieldComparison.bigHilbertClassField_degree_eq_narrowClassGroup_card K).symm + have hsurj : Function.Surjective f := + (LinearMap.injective_iff_surjective_of_finrank_eq_finrank + (f := f.toLinearMap) hdim).mp f.injective + exact AlgEquiv.ofBijective f ⟨f.injective, hsurj⟩ + +open scoped Classical in +open GlobalClassFieldTheory.GlobalClassFields renaming + bigHilbertClassField_ideleClassNorm_range_over_original → + bigHilbertClassField_ideleClassNorm_range_over_original in +/-- Every intrinsic big Hilbert class field has the selected field's +idèle-class norm subgroup. -/ +theorem bigHilbertClassField_ideleClassNorm_range_of_isBig + (E : FiniteAbelianExtension K) (hE : IsBigHilbertClassField E) : + (_root_.ideleClassNorm K E).range = + GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassFieldNormSubgroup + (K := K) := by + let H := GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassField K + let e : E ≃ₐ[K] H := bigHilbertClassFieldEquivOfIsBig E hE + calc + (_root_.ideleClassNorm K E).range = (_root_.ideleClassNorm K H).range := + ordinaryIdeleClassNorm_range_algEquiv e + _ = _ := + bigHilbertClassField_ideleClassNorm_range_over_original + (K := K) + +open scoped Classical in +/-- The arithmetic Artin isomorphism for an intrinsic big Hilbert class +field, with target the narrow ideal class group. -/ +noncomputable def arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroupOfIsBig + (E : FiniteAbelianExtension K) (hE : IsBigHilbertClassField E) : + (E ≃ₐ[K] E) ≃* RayClass.NarrowClassGroup K := by + let reciprocity : (E ≃ₐ[K] E) ≃* + (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K E).range) := + (GlobalClassFieldTheory.Reciprocity.arithmeticGlobalReciprocityContinuousMulEquiv + K E).toMulEquiv + let transport : + (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K E).range) ≃* + (IdeleClassGroup K ⧸ + GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassFieldNormSubgroup + (K := K)) := + QuotientGroup.quotientMulEquivOfEq + (bigHilbertClassField_ideleClassNorm_range_of_isBig E hE) + let narrow : + (IdeleClassGroup K ⧸ + GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassFieldNormSubgroup + (K := K)) ≃* RayClass.NarrowClassGroup K := + GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K) + exact (reciprocity.trans transport).trans narrow + +open scoped Classical in +open GlobalClassFieldTheory.Reciprocity renaming + arithmeticGlobalReciprocityContinuousMulEquiv_globalNormResidue → + arithmeticGlobalReciprocityContinuousMulEquiv_globalNormResidue in +/-- The intrinsic arithmetic reciprocity equivalence sends a global +norm-residue symbol to the represented big-Hilbert norm class. -/ +theorem arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroup_globalNormResidue + (E : FiniteAbelianExtension K) (hE : IsBigHilbertClassField E) + (c : IdeleClassGroup K) : + arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroupOfIsBig E hE + (GlobalClassFieldTheory.Reciprocity.arithmeticGlobalNormResidueMonoidHom + K E c) = + GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K) + (QuotientGroup.mk' + (GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassFieldNormSubgroup + (K := K)) c) := by + change + GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K) + (QuotientGroup.quotientMulEquivOfEq + (bigHilbertClassField_ideleClassNorm_range_of_isBig E hE) + (GlobalClassFieldTheory.Reciprocity.arithmeticGlobalReciprocityContinuousMulEquiv + K E + (GlobalClassFieldTheory.Reciprocity.arithmeticGlobalNormResidueMonoidHom + K E c))) = _ + have hReciprocity := + arithmeticGlobalReciprocityContinuousMulEquiv_globalNormResidue + (K := K) (L := E) c + calc + _ = GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K) + (QuotientGroup.quotientMulEquivOfEq + (bigHilbertClassField_ideleClassNorm_range_of_isBig E hE) + (QuotientGroup.mk' (_root_.ideleClassNorm K E).range c)) := + congrArg + (fun q => + GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K) + (QuotientGroup.quotientMulEquivOfEq + (bigHilbertClassField_ideleClassNorm_range_of_isBig E hE) q)) + hReciprocity + _ = _ := rfl + +open scoped Classical in +open GlobalClassFieldTheory.Reciprocity renaming + arithmeticGlobalNormResidueMonoidHom_comp_ideleClassQuotient_eq_globalArtin → + arithmeticGlobalNormResidueMonoidHom_comp_ideleClassQuotient_eq_globalArtin in +/-- The intrinsic arithmetic Artin symbol of a finite prime is represented +by its one-place prime idèle in the narrow class group. -/ +theorem arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroup_prime + (E : FiniteAbelianExtension K) (hE : IsBigHilbertClassField E) + (v : HeightOneSpectrum (𝓞 K)) : + arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroupOfIsBig E hE + (GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := E) v) = + QuotientGroup.mk' (RayClass.narrowDenominator (K := K)) + (IdeleGroup.finitePrimeIdele v) := by + let c : IdeleClassGroup K := + QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v) + have hArtin : + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := E) v = + GlobalClassFieldTheory.Reciprocity.arithmeticGlobalNormResidueMonoidHom + K E c := by + rw [GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin] + exact (DFunLike.congr_fun + (arithmeticGlobalNormResidueMonoidHom_comp_ideleClassQuotient_eq_globalArtin + (K := K) (L := E)) + (IdeleGroup.finitePrimeIdele v)).symm + rw [hArtin] + rw [arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroup_globalNormResidue] + exact + GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassFieldQuotientEquivNarrowClassGroup_mk + (IdeleGroup.finitePrimeIdele v) + +open scoped Classical in +/-- The public narrow ideal ray class of a finite prime is its normalized +one-place prime idèle class. -/ +theorem narrowRayClassGroupEquivNarrowClassGroup_prime + (v : HeightOneSpectrum (𝓞 K)) : + narrowRayClassGroupEquivNarrowClassGroup K + (narrowRayClassOfFinitePrime v) = + QuotientGroup.mk' (RayClass.narrowDenominator (K := K)) + (IdeleGroup.finitePrimeIdele v) := by + change (RayClass.rayClassGroupNarrowZeroEquivNarrowClassGroup (K := K)) + (rayClassGroupEquivOriginalIdele K (narrowRayClassModulus K) + (narrowRayClassOfFinitePrime v)) = _ + rw [narrowRayClassOfFinitePrime, + rayClassGroupEquivOriginalIdele_prime] + rfl + +end ClassFieldTheory.GlobalClassFieldComparison diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldNaturality.lean new file mode 100644 index 0000000000..b499f156e8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldNaturality.lean @@ -0,0 +1,629 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassField +/-! +# Naturality of the big Hilbert class field + +An equivalence of number fields preserves both finite integrality and +positivity at the real infinite places. Consequently the actual +idele-class transport carries the big-Hilbert norm subgroup exactly onto +the corresponding subgroup of the target field. This gives canonical +transport on the big-Hilbert reciprocity quotient and on the narrow class +group, with formulas on genuine idele representatives. +-/ + +@[expose] public section + +open scoped NumberField NumberField.LiesOver TensorProduct + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField + +variable + {K M : Type*} + [Field K] [NumberField K] + [Field M] [NumberField M] + +open scoped Classical in +private theorem bigHilbertClassFieldQuotientEquivNarrowClassGroup_mk + (a : IdeleGroup K) : + bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K) + (QuotientGroup.mk' + (bigHilbertClassFieldNormSubgroup (K := K)) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a)) = + QuotientGroup.mk' + (RayClass.narrowDenominator (K := K)) a := + rfl + +open scoped Classical in +private noncomputable def infinitePlaceCompletionCongrHom + (e : K ≃ₐ[ℚ] M) + (W : InfinitePlace M) : + (W.comap e.toRingHom).Completion →+* + W.Completion := by + letI : Algebra K M := + e.toRingHom.toAlgebra + let v := + W.comap e.toRingHom + letI : W.1.LiesOver v.1 := + ⟨rfl⟩ + exact + NumberField.LiesOver.completionMap + (v := v) (w := W) + +open scoped Classical in +private theorem infinitePlaceCompletionCongrHom_algebraMap + (e : K ≃ₐ[ℚ] M) + (W : InfinitePlace M) + (x : K) : + infinitePlaceCompletionCongrHom e W + (algebraMap K (W.comap e.toRingHom).Completion x) = + algebraMap M W.Completion (e x) := by + let : Algebra K M := + e.toRingHom.toAlgebra + let v : InfinitePlace K := + W.comap e.toRingHom + let : W.1.LiesOver v.1 := + ⟨rfl⟩ + change + NumberField.LiesOver.completionMap + (v := v) (w := W) + (algebraMap K v.Completion x) = + algebraMap M W.Completion + (algebraMap K M x) + have hx : + algebraMap K v.Completion x = + ((WithAbs.toAbs v.1 x : WithAbs v.1) : + v.Completion) := + rfl + rw [hx, + NumberField.LiesOver.completionMap_coe + (v := v) (w := W)] + apply InfinitePlace.Completion.ext + rw [ + InfinitePlace.Completion.algebraMap_toCompletion, + UniformSpace.Completion.algebraMap_def] + simp only [WithAbs.algebraMap_left_apply, + WithAbs.algebraMap_right_apply, + Algebra.algebraMap_self_apply] + +open scoped Classical in +private theorem + relativeAdeleBaseChangeRingEquiv_relativeAdeleCongr_infiniteComponent_tmul + (e : K ≃ₐ[ℚ] M) + (b : NumberField.AdeleRing (𝓞 ℚ) ℚ) + (x : K) + (W : InfinitePlace M) : + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := M) (b ⊗ₜ[ℚ] e x)).1 W = + infinitePlaceCompletionCongrHom e W + ((relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K) (b ⊗ₜ[ℚ] x)).1 + (W.comap e.toRingHom)) := by + let : Algebra K M := + e.toRingHom.toAlgebra + let v : InfinitePlace K := + W.comap e.toRingHom + let : W.1.LiesOver v.1 := + ⟨rfl⟩ + change + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := M) (b ⊗ₜ[ℚ] e x)).1 W = + NumberField.LiesOver.completionMap + (v := v) (w := W) + ((relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K) (b ⊗ₜ[ℚ] x)).1 v) + let qv := + infinitePlaceBelow (K := ℚ) v + let qW := + infinitePlaceBelow (K := ℚ) W + have hW : + infinitePlaceBelow (K := K) W = v := + rfl + have hq : qv = qW := by + dsimp only [qv, qW] + rw [← hW] + exact + infinitePlaceBelow_infinitePlaceBelow + (K := ℚ) (M := K) (L := M) W + let : v.1.LiesOver qv.1 := + ⟨rfl⟩ + let : W.1.LiesOver qW.1 := + ⟨rfl⟩ + let : W.1.LiesOver qv.1 := + ⟨congrArg (fun q : InfinitePlace ℚ => q.1) hq.symm⟩ + have hxMap : + NumberField.LiesOver.completionMap + (v := v) (w := W) + (algebraMap K v.Completion x) = + algebraMap M W.Completion (e x) := by + simpa only [infinitePlaceCompletionCongrHom] using + infinitePlaceCompletionCongrHom_algebraMap e W x + have hcomponent + (qv' : InfinitePlace ℚ) + (h : qv' = qW) + [v.1.LiesOver qv'.1] : + NumberField.LiesOver.completionMap + (v := qW) (w := W) (b.1 qW) * + algebraMap M W.Completion (e x) = + NumberField.LiesOver.completionMap + (v := v) (w := W) + (NumberField.LiesOver.completionMap + (v := qv') (w := v) (b.1 qv') * + algebraMap K v.Completion x) := by + subst qv' + have hcomp : + NumberField.LiesOver.completionMap + (v := v) (w := W) + (NumberField.LiesOver.completionMap + (v := qW) (w := v) (b.1 qW)) = + NumberField.LiesOver.completionMap + (v := qW) (w := W) (b.1 qW) := by + convert + (infinitePlaceCompletionMap_comp_apply + (K := ℚ) (M := K) (L := M) W (b.1 qW)) using 1 + rfl + rw [map_mul, hcomp, hxMap] + rw [relativeAdeleBaseChangeRingEquiv_infiniteComponent_tmul, + relativeAdeleBaseChangeRingEquiv_infiniteComponent_tmul] + exact hcomponent qv hq + +open scoped Classical in +private theorem adeleCongr_infiniteComponent + (e : K ≃ₐ[ℚ] M) + (a : NumberField.AdeleRing (𝓞 K) K) + (W : InfinitePlace M) : + (adeleCongr e a).1 W = + infinitePlaceCompletionCongrHom e W + (a.1 (W.comap e.toRingHom)) := by + let v : InfinitePlace K := + W.comap e.toRingHom + let componentK := + (infiniteAdeleComponentAlgHom v).toAddMonoidHom + let componentM := + (infiniteAdeleComponentAlgHom W).toAddMonoidHom + change + componentM (adeleCongr e a) = + infinitePlaceCompletionCongrHom e W (componentK a) + let z := + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K)).symm a + have ha : + relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K) z = a := + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K)).apply_symm_apply a + have htransport : + componentM + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := M) + (relativeAdeleCongr (K := ℚ) e z)) = + componentM + (adeleCongr e + (relativeAdeleBaseChangeRingEquiv + (K := ℚ) (L := K) z)) := + congrArg componentM + (relativeAdeleBaseChangeRingEquiv_relativeAdeleCongr e z) + rw [← ha, ← htransport] + induction z using TensorProduct.inductionOn with + | add x y hx hy => + simpa only [map_add, Prod.fst_add, Pi.add_apply] using + congrArg₂ (· + ·) hx hy + | tmul b x => + exact + relativeAdeleBaseChangeRingEquiv_relativeAdeleCongr_infiniteComponent_tmul + e b x W + +open scoped Classical in +private theorem ideleCongr_infiniteComponent + (e : K ≃ₐ[ℚ] M) + (a : IdeleGroup K) + (W : InfinitePlace M) : + IdeleGroup.infiniteComponent W (ideleCongr e a) = + Units.map + (infinitePlaceCompletionCongrHom e W).toMonoidHom + (IdeleGroup.infiniteComponent + (W.comap e.toRingHom) a) := by + apply Units.ext + exact + adeleCongr_infiniteComponent e + (((IdeleGroup.equivAdeleRingUnits + (K := K) a : + (NumberField.AdeleRing (𝓞 K) K)ˣ) : + NumberField.AdeleRing (𝓞 K) K)) W + +open scoped Classical in +private theorem + infinitePlaceCompletionCongrHom_extensionEmbeddingOfIsReal + (e : K ≃ₐ[ℚ] M) + (W : InfinitePlace M) + (hW : W.IsReal) + (x : (W.comap e.toRingHom).Completion) : + InfinitePlace.Completion.extensionEmbeddingOfIsReal hW + (infinitePlaceCompletionCongrHom e W x) = + InfinitePlace.Completion.extensionEmbeddingOfIsReal + (hW.comap e.toRingHom) x := by + let : Algebra K M := + e.toRingHom.toAlgebra + let v := + W.comap e.toRingHom + let : W.1.LiesOver v.1 := + ⟨rfl⟩ + let : + NumberField.ComplexEmbedding.LiesOver + (InfinitePlace.Completion.extensionEmbedding W) + (InfinitePlace.Completion.extensionEmbedding v) := + InfinitePlace.LiesOver.extensionEmbedding_liesOver_of_isReal + W (hW.comap e.toRingHom) + have hComplex : + InfinitePlace.Completion.extensionEmbedding W + (NumberField.LiesOver.completionMap + (v := v) (w := W) x) = + InfinitePlace.Completion.extensionEmbedding v x := by + exact + InfinitePlace.Completion.liesOver_extensionEmbedding_apply + (v := v) (w := W) + apply Complex.ofReal_injective + simpa only [ + InfinitePlace.Completion.extensionEmbeddingOfIsReal_apply, + infinitePlaceCompletionCongrHom] using hComplex + +open scoped Classical in +private theorem + infinitePlaceCompletionCongrHom_mem_infinitePositiveSubgroup_iff + (e : K ≃ₐ[ℚ] M) + (W : InfinitePlace M) + (x : (W.comap e.toRingHom).Completionˣ) : + Units.map + (infinitePlaceCompletionCongrHom e W).toMonoidHom x ∈ + RayClass.infinitePositiveSubgroup W ↔ + x ∈ + RayClass.infinitePositiveSubgroup + (W.comap e.toRingHom) := by + rw [RayClass.mem_infinitePositiveSubgroup_iff, + RayClass.mem_infinitePositiveSubgroup_iff] + constructor + · intro h hv + have hW : + W.IsReal := + (InfinitePlace.isReal_comap_iff + e.toRingEquiv).1 hv + have hpos := + h hW + change + 0 < + InfinitePlace.Completion.extensionEmbeddingOfIsReal hW + (infinitePlaceCompletionCongrHom e W + (x : (W.comap e.toRingHom).Completion)) at hpos + rw [ + infinitePlaceCompletionCongrHom_extensionEmbeddingOfIsReal + e W hW] at hpos + simpa only using hpos + · intro h hW + have hv : + (W.comap e.toRingHom).IsReal := + hW.comap e.toRingHom + have hpos := + h hv + change + 0 < + InfinitePlace.Completion.extensionEmbeddingOfIsReal hW + (infinitePlaceCompletionCongrHom e W + (x : (W.comap e.toRingHom).Completion)) + rw [ + infinitePlaceCompletionCongrHom_extensionEmbeddingOfIsReal + e W hW] + simpa only using hpos + +open scoped Classical in +private theorem ideleCongr_mem_infiniteCongruenceSubgroup_iff + (e : K ≃ₐ[ℚ] M) + (a : IdeleGroup K) : + (ideleCongr e a).1 ∈ + RayClass.narrowInfiniteCongruenceSubgroup (K := M) ↔ + a.1 ∈ + RayClass.narrowInfiniteCongruenceSubgroup (K := K) := by + rw [RayClass.mem_narrowInfiniteCongruenceSubgroup_iff, + RayClass.mem_narrowInfiniteCongruenceSubgroup_iff] + constructor + · intro h v + let W : InfinitePlace M := + v.comap e.symm.toRingHom + have hcomap : + W.comap e.toRingHom = v := by + change + (v.comap e.symm.toRingHom).comap e.toRingHom = v + rw [← InfinitePlace.comap_comp] + convert InfinitePlace.comap_id v using 1 + ext x + change v.1 (e.symm (e x)) = v.1 x + exact congrArg v.1 (e.symm_apply_apply x) + have hW : + IdeleGroup.infiniteComponent W (ideleCongr e a) ∈ + RayClass.infinitePositiveSubgroup W := by + simpa only [IdeleGroup.infiniteComponent_apply] using h W + rw [ideleCongr_infiniteComponent] at hW + have hv := + (infinitePlaceCompletionCongrHom_mem_infinitePositiveSubgroup_iff + e W + (IdeleGroup.infiniteComponent + (W.comap e.toRingHom) a)).1 hW + rw [hcomap] at hv + simpa only [IdeleGroup.infiniteComponent_apply] using hv + · intro h W + have hW : + IdeleGroup.infiniteComponent W (ideleCongr e a) ∈ + RayClass.infinitePositiveSubgroup W := by + rw [ideleCongr_infiniteComponent] + apply + (infinitePlaceCompletionCongrHom_mem_infinitePositiveSubgroup_iff + e W + (IdeleGroup.infiniteComponent + (W.comap e.toRingHom) a)).2 + simpa only [IdeleGroup.infiniteComponent_apply] using + h (W.comap e.toRingHom) + simpa only [IdeleGroup.infiniteComponent_apply] using hW + +open scoped Classical in +private theorem ideleCongr_mem_ideleCongruenceSubgroup_zero_iff + (e : K ≃ₐ[ℚ] M) + (a : IdeleGroup K) : + ideleCongr e a ∈ + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus M)).ideleCongruenceSubgroup ↔ + a ∈ + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)).ideleCongruenceSubgroup := by + have hfinite := + ideleCongr_mem_integralAtFinitePlaces_iff e a + change + (ideleCongr e a).2 ∈ + FiniteIdeleGroup.integralSubgroup (K := M) ↔ + a.2 ∈ + FiniteIdeleGroup.integralSubgroup (K := K) at hfinite + have hfiniteZero : + (ideleCongr e a).2 ∈ + RayClass.finiteCongruenceSubgroup + (0 : RayClass.FiniteModulus M) ↔ + a.2 ∈ + RayClass.finiteCongruenceSubgroup + (0 : RayClass.FiniteModulus K) := by + simpa only [RayClass.finiteCongruenceSubgroup_zero] using + hfinite + rw [RayClass.Modulus.ideleCongruenceSubgroup_narrowOfFinite, + RayClass.Modulus.ideleCongruenceSubgroup_narrowOfFinite] + exact + and_congr + (ideleCongr_mem_infiniteCongruenceSubgroup_iff e a) + hfiniteZero + +open scoped Classical in +private theorem ideleCongruenceSubgroup_zero_map_ideleCongr + (e : K ≃ₐ[ℚ] M) : + ((RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)).ideleCongruenceSubgroup).map + (ideleCongr e).toMonoidHom = + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus M)).ideleCongruenceSubgroup := by + ext b + constructor + · rintro ⟨a, ha, rfl⟩ + exact + (ideleCongr_mem_ideleCongruenceSubgroup_zero_iff + e a).2 ha + · intro hb + let a : IdeleGroup K := + (ideleCongr e).symm b + refine ⟨a, ?_, ?_⟩ + · apply + (ideleCongr_mem_ideleCongruenceSubgroup_zero_iff + e a).1 + simpa only [a, (ideleCongr e).apply_symm_apply] using hb + · exact + (ideleCongr e).apply_symm_apply b + +open scoped Classical in +private theorem narrowDenominator_map_ideleCongr + (e : K ≃ₐ[ℚ] M) : + (RayClass.narrowDenominator (K := K)).map + (ideleCongr e).toMonoidHom = + RayClass.narrowDenominator (K := M) := by + rw [RayClass.narrowDenominator, + RayClass.narrowDenominator, + Subgroup.map_sup, + ideleCongruenceSubgroup_zero_map_ideleCongr] + apply congrArg + (fun H => + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus M)).ideleCongruenceSubgroup ⊔ H) + change + (IdeleGroup.principalSubgroup K).map + (ideleCongr e) = + IdeleGroup.principalSubgroup M + exact idelePrincipalSubgroup_map_congr e + +open scoped Classical in +/-- Transport of actual idele classes along a number-field equivalence +carries the big-Hilbert norm subgroup exactly onto the big-Hilbert norm +subgroup of the target field. -/ +theorem bigHilbertClassFieldNormSubgroup_map_ideleClassCongr + (e : K ≃ₐ[ℚ] M) : + (bigHilbertClassFieldNormSubgroup (K := K)).map + (ideleClassCongr e).toMonoidHom = + bigHilbertClassFieldNormSubgroup (K := M) := by + have hcomp : + (ideleClassCongr e).toMonoidHom.comp + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K)) = + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup M)).comp + (ideleCongr e).toMonoidHom := by + ext a + exact ideleClassCongr_mk e a + rw [bigHilbertClassFieldNormSubgroup, + bigHilbertClassFieldNormSubgroup, + RayClass.Modulus.congruenceSubgroup, + RayClass.Modulus.congruenceSubgroup, + Subgroup.map_map, hcomp, + ← Subgroup.map_map] + rw [show + ((RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)).ideleCongruenceSubgroup ⊔ + IdeleGroup.principalSubgroup K).map + (ideleCongr e).toMonoidHom = + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus M)).ideleCongruenceSubgroup ⊔ + IdeleGroup.principalSubgroup M by + simpa only [RayClass.narrowDenominator] using + narrowDenominator_map_ideleCongr e] + +open scoped Classical in +/-- The canonical equivalence of big-Hilbert reciprocity quotients +induced by an equivalence of number fields. -/ +noncomputable def bigHilbertClassFieldQuotientCongr + (e : K ≃ₐ[ℚ] M) : + (IdeleClassGroup K ⧸ + bigHilbertClassFieldNormSubgroup (K := K)) ≃* + (IdeleClassGroup M ⧸ + bigHilbertClassFieldNormSubgroup (K := M)) := + QuotientGroup.congr + (bigHilbertClassFieldNormSubgroup (K := K)) + (bigHilbertClassFieldNormSubgroup (K := M)) + (ideleClassCongr e) + (bigHilbertClassFieldNormSubgroup_map_ideleClassCongr e) + +open scoped Classical in +/-- The big-Hilbert quotient equivalence is induced on representatives +by the actual transport of idele classes. -/ +theorem bigHilbertClassFieldQuotientCongr_mk + (e : K ≃ₐ[ℚ] M) + (c : IdeleClassGroup K) : + bigHilbertClassFieldQuotientCongr e + (QuotientGroup.mk' + (bigHilbertClassFieldNormSubgroup (K := K)) c) = + QuotientGroup.mk' + (bigHilbertClassFieldNormSubgroup (K := M)) + (ideleClassCongr e c) := + rfl + +open scoped Classical in +/-- Canonical transport of narrow ideal classes determined by the +big-Hilbert reciprocity quotient. -/ +noncomputable def bigHilbertNarrowClassGroupCongr + (e : K ≃ₐ[ℚ] M) : + RayClass.NarrowClassGroup K ≃* + RayClass.NarrowClassGroup M := + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).symm |>.trans + ((bigHilbertClassFieldQuotientCongr e).trans + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := M))) + +open scoped Classical in +/-- Naturality of the canonical identification of the big-Hilbert +reciprocity quotient with the narrow class group. -/ +@[simp] +theorem bigHilbertClassFieldQuotientEquivNarrowClassGroup_naturality + (e : K ≃ₐ[ℚ] M) + (q : IdeleClassGroup K ⧸ + bigHilbertClassFieldNormSubgroup (K := K)) : + bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := M) + (bigHilbertClassFieldQuotientCongr e q) = + bigHilbertNarrowClassGroupCongr e + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K) q) := by + simp only [bigHilbertNarrowClassGroupCongr, + MulEquiv.trans_apply, MulEquiv.symm_apply_apply] + +open scoped Classical in +/-- Homomorphism form of naturality for the big-Hilbert +quotient--narrow-class-group identification. -/ +theorem + bigHilbertClassFieldQuotientEquivNarrowClassGroup_naturality_hom + (e : K ≃ₐ[ℚ] M) : + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := M)).toMonoidHom.comp + (bigHilbertClassFieldQuotientCongr + (K := K) (M := M) e).toMonoidHom = + (bigHilbertNarrowClassGroupCongr + (K := K) (M := M) e).toMonoidHom.comp + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).toMonoidHom := by + ext q + exact + bigHilbertClassFieldQuotientEquivNarrowClassGroup_naturality + (K := K) (M := M) e q + +open scoped Classical in +/-- On an idele representative, canonical transport of narrow ideal +classes is represented by the transported idele itself. -/ +theorem bigHilbertNarrowClassGroupCongr_mk + (e : K ≃ₐ[ℚ] M) + (a : IdeleGroup K) : + bigHilbertNarrowClassGroupCongr e + (QuotientGroup.mk' + (RayClass.narrowDenominator (K := K)) a) = + QuotientGroup.mk' + (RayClass.narrowDenominator (K := M)) + (ideleCongr e a) := by + let q : + IdeleClassGroup K ⧸ + bigHilbertClassFieldNormSubgroup (K := K) := + QuotientGroup.mk' + (bigHilbertClassFieldNormSubgroup (K := K)) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) + calc + bigHilbertNarrowClassGroupCongr e + (QuotientGroup.mk' + (RayClass.narrowDenominator (K := K)) a) = + bigHilbertNarrowClassGroupCongr e + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K) q) := by + simp only [q, + bigHilbertClassFieldQuotientEquivNarrowClassGroup_mk] + _ = + bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := M) + (bigHilbertClassFieldQuotientCongr e q) := + (bigHilbertClassFieldQuotientEquivNarrowClassGroup_naturality + e q).symm + _ = + QuotientGroup.mk' + (RayClass.narrowDenominator (K := M)) + (ideleCongr e a) := by + simp only [q, bigHilbertClassFieldQuotientCongr_mk, + ideleClassCongr_mk, + bigHilbertClassFieldQuotientEquivNarrowClassGroup_mk] + +open scoped Classical in +/-- Homomorphism form of naturality for narrow ideal classes under the +big-Hilbert narrow-class-group transport. -/ +theorem bigHilbertNarrowClassGroupCongr_naturality + (e : K ≃ₐ[ℚ] M) : + (bigHilbertNarrowClassGroupCongr e).toMonoidHom.comp + (QuotientGroup.mk' + (RayClass.narrowDenominator (K := K))) = + (QuotientGroup.mk' + (RayClass.narrowDenominator (K := M))).comp + (ideleCongr e).toMonoidHom := by + ext a + exact bigHilbertNarrowClassGroupCongr_mk e a + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldOverOriginalBase.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldOverOriginalBase.lean new file mode 100644 index 0000000000..0b776e7b70 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldOverOriginalBase.lean @@ -0,0 +1,182 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldRealization +/-! +# The big Hilbert class field over the original number field + +The selected big Hilbert class field is constructed over a canonical +fixed-field copy of the input number field. The canonical equivalence +with the original field supplies the actual scalar map used here. Thus +the selected field is a finite abelian Galois extension of the original +number field, with degree equal to the narrow class number. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +variable (K : Type) [Field K] [NumberField K] + +open scoped Classical in +/-- The canonical base fixed field of the big Hilbert realization, +regarded as an algebra over the original number field. -/ +noncomputable instance bigHilbertClassFieldBaseAlgebraOverOriginal : + Algebra K (bigHilbertClassFieldBase K) := + (bigHilbertClassFieldBaseEquiv (K := K)).toRingHom.toAlgebra + +open scoped Classical in +/-- The canonical base-field identification as an equivalence of +algebras over the original number field. -/ +noncomputable def bigHilbertClassFieldBaseEquivOverOriginal : + K ≃ₐ[K] bigHilbertClassFieldBase K := + AlgEquiv.ofRingEquiv + (f := + (bigHilbertClassFieldBaseEquiv (K := K)).toRingEquiv) + (fun _ => rfl) + +open scoped Classical in +/-- The selected big Hilbert class field as an algebra over the +original number field. -/ +noncomputable instance bigHilbertClassFieldAlgebraOverOriginal : + Algebra K (bigHilbertClassField K) := + ((algebraMap + (bigHilbertClassFieldBase K) + (bigHilbertClassField K)).comp + (algebraMap K + (bigHilbertClassFieldBase K))).toAlgebra + +open scoped Classical in +/-- The scalar map into the selected big Hilbert class field is the +canonical base equivalence followed by fixed-field inclusion. -/ +@[simp] +theorem bigHilbertClassField_algebraMap_original + (x : K) : + algebraMap K (bigHilbertClassField K) x = + algebraMap + (bigHilbertClassFieldBase K) + (bigHilbertClassField K) + (bigHilbertClassFieldBaseEquiv (K := K) x) := + rfl + +open scoped Classical in +/-- The canonical base fixed field has degree one over the original +number field. -/ +noncomputable instance + bigHilbertClassFieldBaseFiniteDimensionalOverOriginal : + FiniteDimensional K (bigHilbertClassFieldBase K) := + (bigHilbertClassFieldBaseEquivOverOriginal K) + |>.toLinearEquiv.finiteDimensional + +open scoped Classical in +/-- The original field, its fixed-field copy, and the selected big +Hilbert class field form the literal scalar tower. -/ +noncomputable instance bigHilbertClassFieldScalarTowerOverOriginal : + IsScalarTower K + (bigHilbertClassFieldBase K) + (bigHilbertClassField K) := + IsScalarTower.of_algebraMap_eq' rfl + +open scoped Classical in +/-- The selected big Hilbert class field is finite-dimensional over +the original number field. -/ +noncomputable instance + bigHilbertClassFieldFiniteDimensionalOverOriginal : + FiniteDimensional K (bigHilbertClassField K) := + FiniteDimensional.trans K + (bigHilbertClassFieldBase K) + (bigHilbertClassField K) + +open scoped Classical in +/-- The canonical base fixed field has relative degree one. -/ +@[simp] +theorem bigHilbertClassFieldBase_finrank_over_original : + Module.finrank K (bigHilbertClassFieldBase K) = 1 := by + simpa only [Module.finrank_self] using + (LinearEquiv.finrank_eq + (bigHilbertClassFieldBaseEquivOverOriginal K).toLinearEquiv).symm + +open scoped Classical in +/-- The degree of the selected big Hilbert class field over the +original number field is the order of the narrow class group. -/ +theorem bigHilbertClassField_finrank_over_original_eq_narrowClassGroup_card : + Module.finrank K (bigHilbertClassField K) = + Nat.card (RayClass.NarrowClassGroup K) := by + calc + Module.finrank K (bigHilbertClassField K) = + (bigHilbertClassFieldNormSubgroup (K := K)).index := + closedFiniteIndexClassField_finrank_eq_index + (bigHilbertClassFieldNormSubgroup (K := K)) + (bigHilbertClassFieldNormSubgroup_isClosed (K := K)) + _ = Nat.card + (IdeleClassGroup K ⧸ + bigHilbertClassFieldNormSubgroup (K := K)) := + Subgroup.index_eq_card + (bigHilbertClassFieldNormSubgroup (K := K)) + _ = Nat.card (RayClass.NarrowClassGroup K) := + Nat.card_congr + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).toEquiv + +open scoped Classical in +/-- The selected big Hilbert class field is Galois over the original +number field. -/ +noncomputable instance bigHilbertClassFieldIsGaloisOverOriginal : + IsGalois K (bigHilbertClassField K) := by + let e := + bigHilbertClassFieldBaseEquiv (K := K) + apply IsGalois.of_equiv_equiv + (F := bigHilbertClassFieldBase K) + (E := bigHilbertClassField K) + (f := e.symm.toRingEquiv) + (g := RingEquiv.refl (bigHilbertClassField K)) + apply RingHom.ext + intro x + calc + ((algebraMap K (bigHilbertClassField K)).comp + e.symm.toRingEquiv) x = + algebraMap K (bigHilbertClassField K) (e.symm x) := rfl + _ = algebraMap + (bigHilbertClassFieldBase K) + (bigHilbertClassField K) + (bigHilbertClassFieldBaseEquiv (K := K) (e.symm x)) := + bigHilbertClassField_algebraMap_original + (K := K) (e.symm x) + _ = algebraMap + (bigHilbertClassFieldBase K) + (bigHilbertClassField K) x := by + simpa only [e] using + congrArg + (algebraMap + (bigHilbertClassFieldBase K) + (bigHilbertClassField K)) + ((bigHilbertClassFieldBaseEquiv + (K := K)).apply_symm_apply x) + _ = ((RingEquiv.refl + (bigHilbertClassField K)).toRingHom.comp + (algebraMap + (bigHilbertClassFieldBase K) + (bigHilbertClassField K))) x := rfl + +open scoped Classical in +/-- The selected big Hilbert class field is an abelian Galois +extension of the original number field. -/ +noncomputable instance bigHilbertClassFieldIsAbelianGaloisOverOriginal : + IsAbelianGalois K (bigHilbertClassField K) := + IsAbelianGalois.of_base_equiv + (bigHilbertClassFieldBaseEquiv (K := K)).toRingEquiv + (bigHilbertClassField_algebraMap_original (K := K)) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean new file mode 100644 index 0000000000..878aab1c5f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean @@ -0,0 +1,136 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField +public import Mathlib.FieldTheory.Galois.Abelian +/-! +# Concrete realization of finite abelian subextensions + +A finite abelian subextension in the abstract class-formation lattice is +represented by two nested closed subgroups of an ambient Galois group. Its +upper relative fixed field is an actual finite extension of the lower fixed +field. The quotient-to-Galois-group equivalence transports the commutativity +carried by the abstract package, so this actual extension is abelian Galois. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open ClassFormation +open LocalClassFieldTheory +open CyclicCohomology +open scoped IsMulCommutative + +universe u v w + +private theorem algEquiv_commutes_algebraMap_of_base_equiv + {K : Type u} {K' : Type v} {L : Type w} + [Field K] [Field K'] [Field L] + [Algebra K L] [Algebra K' L] + (e : K ≃+* K') + (h : ∀ x : K, + algebraMap K L x = + algebraMap K' L (e x)) + (f : L ≃ₐ[K] L) + (x : K') : + f (algebraMap K' L x) = + algebraMap K' L x := by + have hbase : + algebraMap K L (e.symm x) = + algebraMap K' L x := by + calc + algebraMap K L (e.symm x) = + algebraMap K' L (e (e.symm x)) := + h (e.symm x) + _ = algebraMap K' L x := + congrArg (algebraMap K' L) (e.apply_symm_apply x) + calc + f (algebraMap K' L x) = + f (algebraMap K L (e.symm x)) := + congrArg f hbase.symm + _ = algebraMap K L (e.symm x) := + f.commutes (e.symm x) + _ = algebraMap K' L x := hbase + +/-- Abelian Galois structure transports across an equivalence of base fields +when the two scalar maps into the common top field commute with that +equivalence. The Galois part is supplied separately, typically by Mathlib's +`IsGalois.of_equiv_equiv`; this theorem transports commutativity of the actual +automorphism group. -/ +theorem IsAbelianGalois.of_base_equiv + {K : Type u} {K' : Type v} {L : Type w} + [Field K] [Field K'] [Field L] + [Algebra K L] [Algebra K' L] + [IsGalois K L] [IsAbelianGalois K' L] + (e : K ≃+* K') + (h : ∀ x : K, + algebraMap K L x = + algebraMap K' L (e x)) : + IsAbelianGalois K L := by + refine + { is_comm.comm := fun σ τ => ?_ } + let σ' : L ≃ₐ[K'] L := + AlgEquiv.ofRingEquiv (f := σ.toRingEquiv) + (algEquiv_commutes_algebraMap_of_base_equiv e h σ) + let τ' : L ≃ₐ[K'] L := + AlgEquiv.ofRingEquiv (f := τ.toRingEquiv) + (algEquiv_commutes_algebraMap_of_base_equiv e h τ) + apply AlgEquiv.ext + intro x + exact DFunLike.congr_fun (mul_comm σ' τ') x + +variable + {k Ω : Type} + [Field k] [Field Ω] [Algebra k Ω] [IsGalois k Ω] + {K : ClosedSubgroup (Gal(Ω/k))} + +/-- The relative fixed field represented by a finite abelian subextension is +finite-dimensional over the fixed field represented by its base subgroup. -/ +noncomputable instance + finiteAbelianSubextensionAbstractRelativeFixedFieldFiniteDimensional + [hKfinite : Finite + ((baseField Gal(Ω/k)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(Ω/k)) K (le_baseField K))] + (L : FiniteAbelianSubextension K) : + FiniteDimensional + (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω L.below) := + abstractRelativeFixedField_finiteDimensional + k Ω K L.field L.below hKfinite L.finite + +/-- The actual relative fixed field represented by a finite abelian +subextension is an abelian Galois extension of the actual base fixed field. -/ +noncomputable instance + finiteAbelianSubextensionAbstractRelativeFixedFieldIsAbelianGalois + (L : FiniteAbelianSubextension K) : + IsAbelianGalois + (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω L.below) := by + let F := abstractFixedField k Ω K + let E := abstractRelativeFixedField k Ω L.below + let : IsGalois F E := + abstractRelativeFixedField_isGalois + k Ω K L.field L.below L.normal + let e : L.extensionQuotient ≃* Gal(E/F) := + L.extensionQuotientMulEquiv.trans + (abstractExtensionQuotientEquivGaloisGroup + k Ω K L.field L.below L.normal) + refine { is_comm.comm := fun σ τ ↦ ?_ } + exact e.symm.injective (by + simpa only [map_mul] using + mul_comm (e.symm σ) (e.symm τ)) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldConstruction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldConstruction.lean new file mode 100644 index 0000000000..7d82ebfedd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldConstruction.lean @@ -0,0 +1,138 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondenceTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteIndexNormClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.OrdinaryNormClassField +/-! +# Construction of a closed finite-index class field + +This leaf fixes the finite Galois norm neighbourhood, abstract subextension, +and canonical fixed-field presentation attached to a closed finite-index +idèle-class subgroup. Norm-range and reciprocity statements live in later +leaves so their elaboration environments do not remain resident here. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- The concrete finite Galois norm neighbourhood used to construct +the class field of `H`. -/ +noncomputable abbrev closedFiniteIndexClassFieldNormAmbient + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : Type := + closedFiniteIndexNormAmbient (K := K) H hclosed + +open scoped Classical in +/-- The named norm-neighbourhood containment used by the selected +ordinary class-field construction. -/ +theorem closedFiniteIndexClassFieldNormAmbient_normRange_le + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + (_root_.ideleClassNorm K + (closedFiniteIndexClassFieldNormAmbient + (K := K) H hclosed)).range ≤ H := by + simpa only [closedFiniteIndexClassFieldNormAmbient] using + (closedFiniteIndexSubgroup_has_finiteGaloisNormNeighborhood + (K := K) H hclosed) + +open scoped Classical in +/-- The compatible abstract base subgroup used by the selected class +field of `H`. -/ +noncomputable abbrev closedFiniteIndexClassFieldBaseSubgroup + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] := + numberFieldTowerBaseSubgroup K + (closedFiniteIndexClassFieldNormAmbient + (K := K) H hclosed) + +open scoped Classical in +/-- A reducible finite-abstract-field package whose field projection is +definitionally the selected base subgroup. Keeping this presentation +transparent avoids dependent quotient transports through the opaque tower +package in reciprocity consumers. -/ +noncomputable abbrev + closedFiniteIndexClassFieldReciprocityFiniteAbstractField + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + ClassFormation.FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) := + numberFieldTowerReciprocityFiniteAbstractField K + (closedFiniteIndexClassFieldNormAmbient + (K := K) H hclosed) + +open scoped Classical in +/-- The finite abelian subextension selected by a closed finite-index +idèle-class subgroup. -/ +noncomputable abbrev closedFiniteIndexClassFieldSubextension + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + ClassFormation.FiniteAbelianSubextension + (closedFiniteIndexClassFieldBaseSubgroup + (K := K) H hclosed) := + ordinaryNormClassFieldSubextension K + (closedFiniteIndexClassFieldNormAmbient + (K := K) H hclosed) H + (closedFiniteIndexClassFieldNormAmbient_normRange_le + (K := K) H hclosed) + +open scoped Classical in +/-- The canonical fixed-field copy of the original number field used +by the selected class field of `H`. -/ +noncomputable abbrev closedFiniteIndexClassFieldBase + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : Type := + ordinaryNormClassFieldBase K + (closedFiniteIndexClassFieldNormAmbient + (K := K) H hclosed) + +open scoped Classical in +/-- The actual finite abelian class field selected by `H`. -/ +noncomputable abbrev closedFiniteIndexClassField + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : Type := + ordinaryNormClassFieldExtension K + (closedFiniteIndexClassFieldNormAmbient + (K := K) H hclosed) H + (closedFiniteIndexClassFieldNormAmbient_normRange_le + (K := K) H hclosed) + +open scoped Classical in +/-- The canonical equivalence from the original number field to the +fixed-field base of its selected class field. -/ +noncomputable abbrev closedFiniteIndexClassFieldBaseEquiv + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + K ≃ₐ[ℚ] + closedFiniteIndexClassFieldBase + (K := K) H hclosed := + ordinaryNormClassFieldBaseEquiv K + (closedFiniteIndexClassFieldNormAmbient + (K := K) H hclosed) +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldNormRange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldNormRange.lean new file mode 100644 index 0000000000..d10de7dad2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldNormRange.lean @@ -0,0 +1,219 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldConstruction +/-! +# Norm range over the canonical fixed-field base + +This leaf compares the selected abstract norm subgroup with the actual +idèle-class norm range over the canonical fixed-field base. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- Opaque bridge from multiplicative subgroup transport to its additive +presentation. Keeping this generic prevents concrete fixed-field endpoints +from being unfolded by `rw` while comparing the two presentations. -/ +private theorem subgroup_map_toAddSubgroup_mulEquiv + {G G₂ : Type*} [Group G] [Group G₂] + (S : Subgroup G) (e : G ≃* G₂) : + (S.map e.toMonoidHom).toAddSubgroup = + S.toAddSubgroup.map + (MulEquiv.toAdditive e).toAddMonoidHom := by + exact (MonoidHom.coe_toAdditive_map e.toMonoidHom S).symm + +open scoped Classical in +/-- The idèle-class transport attached to the selected base equivalence. +Naming this endpoint once keeps the fixed-field instance tower out of +downstream definitional-equality checks. -/ +private noncomputable def closedFiniteIndexClassFieldIdeleClassEquiv + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + IdeleClassGroup K ≃* + IdeleClassGroup + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) := + ideleClassCongr + (closedFiniteIndexClassFieldBaseEquiv + (K := K) H hclosed) + +open scoped Classical in +/-- Additive form of the selected class-field norm-range computation, with +the concrete idèle-class endpoint hidden behind one typed definition. -/ +private theorem closedFiniteIndexClassField_ideleClassNorm_range_toAddSubgroup + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + (_root_.ideleClassNorm + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) + (closedFiniteIndexClassField + (K := K) H hclosed)).range.toAddSubgroup = + H.toAddSubgroup.map + (MulEquiv.toAdditive + (closedFiniteIndexClassFieldIdeleClassEquiv + (K := K) H hclosed)).toAddMonoidHom := by + simpa only [closedFiniteIndexClassFieldIdeleClassEquiv, + closedFiniteIndexClassField, + closedFiniteIndexClassFieldBase, + closedFiniteIndexClassFieldBaseEquiv] using + (ordinaryNormClassField_ideleClassNorm_range K + (closedFiniteIndexClassFieldNormAmbient + (K := K) H hclosed) H + (closedFiniteIndexClassFieldNormAmbient_normRange_le + (K := K) H hclosed)) + +open scoped Classical in +/-- The represented abstract norm subgroup as the same named actual norm +range. This wrapper uses the lightweight named-field API, avoiding the +dependent `letI` tower in the raw fixed-field comparison theorem. -/ +private theorem + ordinaryIdeleClassNormSubgroup_closedFiniteIndexClassField_eq_range + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + ordinaryIdeleClassNormSubgroup + (closedFiniteIndexClassFieldReciprocityFiniteAbstractField + (K := K) H hclosed) + (closedFiniteIndexClassFieldSubextension + (K := K) H hclosed) = + (_root_.ideleClassNorm + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) + (closedFiniteIndexClassField + (K := K) H hclosed)).range.toAddSubgroup := by + simpa only [closedFiniteIndexClassFieldBaseSubgroup, + closedFiniteIndexClassFieldBase, + closedFiniteIndexClassField] using + (ordinaryIdeleClassNormSubgroup_eq_namedNormRange + (closedFiniteIndexClassFieldReciprocityFiniteAbstractField + (K := K) H hclosed) + (closedFiniteIndexClassFieldSubextension + (K := K) H hclosed)) + +open scoped Classical in +/-- Over the canonical fixed-field base, the determinant-norm range of +the selected class field is the transport of `H`. -/ +theorem closedFiniteIndexClassField_ideleClassNorm_range_over_base + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + (_root_.ideleClassNorm + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) + (closedFiniteIndexClassField + (K := K) H hclosed)).range = + H.map + (ideleClassCongr + (closedFiniteIndexClassFieldBaseEquiv + (K := K) H hclosed)).toMonoidHom := by + change + (_root_.ideleClassNorm + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) + (closedFiniteIndexClassField + (K := K) H hclosed)).range = + H.map + (closedFiniteIndexClassFieldIdeleClassEquiv + (K := K) H hclosed).toMonoidHom + apply + (Subgroup.toAddSubgroup : + Subgroup + (IdeleClassGroup + (closedFiniteIndexClassFieldBase + (K := K) H hclosed)) ≃o + AddSubgroup + (Additive + (IdeleClassGroup + (closedFiniteIndexClassFieldBase + (K := K) H hclosed)))).injective + calc + (_root_.ideleClassNorm + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) + (closedFiniteIndexClassField + (K := K) H hclosed)).range.toAddSubgroup = + H.toAddSubgroup.map + (MulEquiv.toAdditive + (closedFiniteIndexClassFieldIdeleClassEquiv + (K := K) H hclosed)).toAddMonoidHom := + closedFiniteIndexClassField_ideleClassNorm_range_toAddSubgroup + (K := K) H hclosed + _ = + (H.map + (closedFiniteIndexClassFieldIdeleClassEquiv + (K := K) H hclosed).toMonoidHom).toAddSubgroup := + (subgroup_map_toAddSubgroup_mulEquiv H + (closedFiniteIndexClassFieldIdeleClassEquiv + (K := K) H hclosed)).symm + +open scoped Classical in +/-- The selected subextension is a literal preimage of the transported +closed finite-index subgroup under the ordinary norm-subgroup +correspondence. -/ +theorem + ordinaryIdeleClassNormSubgroup_closedFiniteIndexClassFieldSubextension + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + ordinaryIdeleClassNormSubgroup + (closedFiniteIndexClassFieldReciprocityFiniteAbstractField + (K := K) H hclosed) + (closedFiniteIndexClassFieldSubextension + (K := K) H hclosed) = + H.toAddSubgroup.map + (MulEquiv.toAdditive + (ideleClassCongr + (closedFiniteIndexClassFieldBaseEquiv + (K := K) H hclosed))).toAddMonoidHom := by + change + ordinaryIdeleClassNormSubgroup + (closedFiniteIndexClassFieldReciprocityFiniteAbstractField + (K := K) H hclosed) + (closedFiniteIndexClassFieldSubextension + (K := K) H hclosed) = + H.toAddSubgroup.map + (MulEquiv.toAdditive + (closedFiniteIndexClassFieldIdeleClassEquiv + (K := K) H hclosed)).toAddMonoidHom + calc + ordinaryIdeleClassNormSubgroup + (closedFiniteIndexClassFieldReciprocityFiniteAbstractField + (K := K) H hclosed) + (closedFiniteIndexClassFieldSubextension + (K := K) H hclosed) = + (_root_.ideleClassNorm + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) + (closedFiniteIndexClassField + (K := K) H hclosed)).range.toAddSubgroup := + ordinaryIdeleClassNormSubgroup_closedFiniteIndexClassField_eq_range + (K := K) H hclosed + _ = + H.toAddSubgroup.map + (MulEquiv.toAdditive + (closedFiniteIndexClassFieldIdeleClassEquiv + (K := K) H hclosed)).toAddMonoidHom := + closedFiniteIndexClassField_ideleClassNorm_range_toAddSubgroup + (K := K) H hclosed +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldOriginalField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldOriginalField.lean new file mode 100644 index 0000000000..de83b54dd2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldOriginalField.lean @@ -0,0 +1,262 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldNormRange +/-! +# Transport to the original number field + +This leaf installs the original-field algebra tower and transports the +canonical norm-range computation back to the original idèle class group. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- The canonical fixed-field copy, regarded as an algebra over the +original number field. -/ +noncomputable instance closedFiniteIndexClassFieldBaseAlgebraOverOriginal + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + Algebra K + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) := + (closedFiniteIndexClassFieldBaseEquiv + (K := K) H hclosed).toRingHom.toAlgebra + +open scoped Classical in +/-- The base-field identification as an equivalence of algebras over +the original number field. -/ +noncomputable def closedFiniteIndexClassFieldBaseEquivOverOriginal + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + K ≃ₐ[K] + closedFiniteIndexClassFieldBase + (K := K) H hclosed := + AlgEquiv.ofRingEquiv + (f := (closedFiniteIndexClassFieldBaseEquiv + (K := K) H hclosed).toRingEquiv) + (fun _ => rfl) + +open scoped Classical in +/-- The selected class field, regarded as an algebra over the original +number field through its canonical fixed-field copy. -/ +noncomputable instance closedFiniteIndexClassFieldAlgebraOverOriginal + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + Algebra K + (closedFiniteIndexClassField + (K := K) H hclosed) := + ((algebraMap + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) + (closedFiniteIndexClassField + (K := K) H hclosed)).comp + (algebraMap K + (closedFiniteIndexClassFieldBase + (K := K) H hclosed))).toAlgebra + +open scoped Classical in +/-- The scalar map into the selected class field is the canonical base +equivalence followed by fixed-field inclusion. -/ +@[simp] +theorem closedFiniteIndexClassField_algebraMap_original + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] + (x : K) : + algebraMap K + (closedFiniteIndexClassField + (K := K) H hclosed) x = + algebraMap + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) + (closedFiniteIndexClassField + (K := K) H hclosed) + (closedFiniteIndexClassFieldBaseEquiv + (K := K) H hclosed x) := + rfl + +open scoped Classical in +noncomputable instance + closedFiniteIndexClassFieldBaseFiniteDimensionalOverOriginal + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + FiniteDimensional K + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) := + (closedFiniteIndexClassFieldBaseEquivOverOriginal + (K := K) H hclosed).toLinearEquiv.finiteDimensional + +open scoped Classical in +noncomputable instance closedFiniteIndexClassFieldScalarTowerOverOriginal + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + IsScalarTower K + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) + (closedFiniteIndexClassField + (K := K) H hclosed) := + IsScalarTower.of_algebraMap_eq' rfl + +open scoped Classical in +noncomputable instance + closedFiniteIndexClassFieldFiniteDimensionalOverOriginal + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + FiniteDimensional K + (closedFiniteIndexClassField + (K := K) H hclosed) := + FiniteDimensional.trans K + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) + (closedFiniteIndexClassField + (K := K) H hclosed) + +open scoped Classical in +noncomputable instance closedFiniteIndexClassFieldIsGaloisOverOriginal + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + IsGalois K + (closedFiniteIndexClassField + (K := K) H hclosed) := by + let e := + closedFiniteIndexClassFieldBaseEquiv + (K := K) H hclosed + apply IsGalois.of_equiv_equiv + (F := closedFiniteIndexClassFieldBase + (K := K) H hclosed) + (E := closedFiniteIndexClassField + (K := K) H hclosed) + (f := e.symm.toRingEquiv) + (g := RingEquiv.refl + (closedFiniteIndexClassField + (K := K) H hclosed)) + apply RingHom.ext + intro x + calc + ((algebraMap K + (closedFiniteIndexClassField + (K := K) H hclosed)).comp e.symm.toRingEquiv) x = + algebraMap K + (closedFiniteIndexClassField + (K := K) H hclosed) (e.symm x) := rfl + _ = algebraMap + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) + (closedFiniteIndexClassField + (K := K) H hclosed) + (closedFiniteIndexClassFieldBaseEquiv + (K := K) H hclosed (e.symm x)) := + closedFiniteIndexClassField_algebraMap_original + (K := K) H hclosed (e.symm x) + _ = algebraMap + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) + (closedFiniteIndexClassField + (K := K) H hclosed) x := by + simpa only [e] using + congrArg + (algebraMap + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) + (closedFiniteIndexClassField + (K := K) H hclosed)) + ((closedFiniteIndexClassFieldBaseEquiv + (K := K) H hclosed).apply_symm_apply x) + _ = ((RingEquiv.refl + (closedFiniteIndexClassField + (K := K) H hclosed)).toRingHom.comp + (algebraMap + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) + (closedFiniteIndexClassField + (K := K) H hclosed))) x := rfl + +open scoped Classical in +noncomputable instance + closedFiniteIndexClassFieldIsAbelianGaloisOverOriginal + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + IsAbelianGalois K + (closedFiniteIndexClassField + (K := K) H hclosed) := + IsAbelianGalois.of_base_equiv + (closedFiniteIndexClassFieldBaseEquiv + (K := K) H hclosed).toRingEquiv + (closedFiniteIndexClassField_algebraMap_original + (K := K) H hclosed) + +open scoped Classical in +/-- The selected class field has determinant-norm range exactly `H` +in the idèle class group of the original number field. -/ +theorem closedFiniteIndexClassField_ideleClassNorm_range + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + (_root_.ideleClassNorm K + (closedFiniteIndexClassField + (K := K) H hclosed)).range = H := by + let e := + closedFiniteIndexClassFieldBaseEquiv + (K := K) H hclosed + let g := (ideleClassCongr e).toMonoidHom + have hCanonical : + (_root_.ideleClassNorm + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) + (closedFiniteIndexClassField + (K := K) H hclosed)).range = + H.map g := by + simpa only [e, g] using + (closedFiniteIndexClassField_ideleClassNorm_range_over_base + (K := K) H hclosed) + apply + Subgroup.map_injective + (f := g) (ideleClassCongr e).injective + calc + ((_root_.ideleClassNorm K + (closedFiniteIndexClassField + (K := K) H hclosed)).range).map g = + (_root_.ideleClassNorm + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) + (closedFiniteIndexClassField + (K := K) H hclosed)).range := by + exact + ordinaryIdeleClassNorm_range_map_congrOfAlgEquiv + e + (AlgEquiv.refl + (R := ℚ) + (A₁ := closedFiniteIndexClassField + (K := K) H hclosed)) + (fun x => by + exact closedFiniteIndexClassField_algebraMap_original + (K := K) H hclosed x) + _ = H.map g := hCanonical +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity.lean new file mode 100644 index 0000000000..609b42fcdf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.GlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic.lean new file mode 100644 index 0000000000..5ca71b129b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Evaluation + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/All.lean new file mode 100644 index 0000000000..927e005f09 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/All.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Evaluation +/-! +# Algebraic reciprocity for a closed finite-index class field + +This facade exports the underlying multiplicative equivalence of the already +compiled topological reciprocity provider and its evaluation formula. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Construction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Construction.lean new file mode 100644 index 0000000000..67aeca153f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Construction.lean @@ -0,0 +1,57 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation +/-! +# Underlying algebraic closed finite-index reciprocity + +The algebraic equivalence is obtained by forgetting topology from the named +continuous provider. This avoids a second specialization of the full finite +global reciprocity instance tower. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open scoped Classical in +/-- Canonical class-group commutativity supplies normality of the defining subgroup. -/ +private theorem closedFiniteIndexAlgebraicClassGroupIsMulCommutative + (F : Type) [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + IsMulCommutative.of_comm (fun a b => mul_comm a b) + +attribute [local instance] closedFiniteIndexAlgebraicClassGroupIsMulCommutative + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- Global reciprocity for the selected class field, stated over the original +number field and directly modulo its defining subgroup. -/ +noncomputable abbrev closedFiniteIndexClassFieldGaloisEquivNormQuotient + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + Gal((closedFiniteIndexClassField + (K := K) H hclosed)/K) ≃* + IdeleClassGroup K ⧸ H := + (closedFiniteIndexClassFieldGaloisContinuousEquivNormQuotient + (K := K) H hclosed).toMulEquiv + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Evaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Evaluation.lean new file mode 100644 index 0000000000..543fb8455e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Evaluation.lean @@ -0,0 +1,46 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction +/-! +# Evaluation of algebraic closed finite-index reciprocity + +Since the algebraic equivalence is definitionally the underlying +multiplicative equivalence of the continuous provider, its evaluation theorem +is inherited without reconstructing the selected class-field instance tower. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- Evaluation of the direct non-topological reciprocity equivalence. -/ +theorem closedFiniteIndexClassFieldGaloisEquivNormQuotient_apply + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] + (σ : Gal((closedFiniteIndexClassField + (K := K) H hclosed)/K)) : + closedFiniteIndexClassFieldGaloisEquivNormQuotient + (K := K) H hclosed σ = + closedFiniteIndexClassFieldReciprocityValue + (K := K) H hclosed σ := + closedFiniteIndexClassFieldGaloisContinuousEquivNormQuotient_apply + (K := K) H hclosed σ + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/All.lean new file mode 100644 index 0000000000..a346bde406 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/All.lean @@ -0,0 +1,22 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.GlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.All +/-! +# Reciprocity for a closed finite-index class field + +This facade exports the degree formula and the topological and algebraic +reciprocity equivalences after their command-sized leaves have elaborated. +Keeping the expensive equivalence constructions in separate compiled leaves +prevents downstream ray-class-field consumers from rebuilding the entire +reciprocity layer as one declaration block. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Degree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Degree.lean new file mode 100644 index 0000000000..d570a6db4f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Degree.lean @@ -0,0 +1,59 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldOriginalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidue +/-! +# Degree of a closed finite-index class field + +This leaf derives the degree of the selected class field from its exact +idèle-class norm range. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- The degree of the selected class field over the original number +field is the index of its defining idèle-class subgroup. -/ +theorem closedFiniteIndexClassField_finrank_eq_index + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + Module.finrank K + (closedFiniteIndexClassField + (K := K) H hclosed) = + H.index := by + calc + Module.finrank K + (closedFiniteIndexClassField + (K := K) H hclosed) = + (_root_.ideleClassNorm K + (closedFiniteIndexClassField + (K := K) H hclosed)).range.index := + (ideleClassNorm_index_eq_finrank_abelian K + (closedFiniteIndexClassField + (K := K) H hclosed)).symm + _ = H.index := + congrArg Subgroup.index + (closedFiniteIndexClassField_ideleClassNorm_range + (K := K) H hclosed) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/GlobalNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/GlobalNormResidue.lean new file mode 100644 index 0000000000..fb84c130d2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/GlobalNormResidue.lean @@ -0,0 +1,149 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Evaluation +/-! +# Norm-residue evaluation for a closed finite-index class field + +This leaf proves that the selected class-field reciprocity equivalence sends +the global norm-residue symbol to the corresponding quotient class. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open Reciprocity + +open scoped Classical in +/-- Canonical class-group commutativity supplies normality for quotient evaluation. -/ +private theorem closedFiniteIndexNormResidueClassGroupIsMulCommutative + (F : Type) [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + IsMulCommutative.of_comm (fun a b => mul_comm a b) + +attribute [local instance] closedFiniteIndexNormResidueClassGroupIsMulCommutative + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +private theorem quotientTransport_inverse_apply + {G A : Type*} [Group G] [Group A] + (N H : Subgroup G) [N.Normal] [H.Normal] + (e : Additive (G ⧸ N) ≃+ Additive A) + (h : N = H) (c : G) : + QuotientGroup.quotientMulEquivOfEq h + (Additive.toMul + (e.symm + (e (Additive.ofMul (QuotientGroup.mk' N c))))) = + QuotientGroup.mk' H c := by + calc + _ = QuotientGroup.quotientMulEquivOfEq h + (Additive.toMul + (Additive.ofMul (QuotientGroup.mk' N c))) := + congrArg + (fun z => QuotientGroup.quotientMulEquivOfEq h + (Additive.toMul z)) + (e.symm_apply_apply _) + _ = QuotientGroup.mk' H c := + QuotientGroup.quotientMulEquivOfEq_mk h c + +open scoped Classical in +/-- Under the direct class-field reciprocity equivalence, the global +norm-residue symbol of an idèle class is its quotient class modulo +`H`. -/ +theorem + closedFiniteIndexClassFieldGaloisEquivNormQuotient_globalNormResidue + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] + (c : IdeleClassGroup K) : + closedFiniteIndexClassFieldGaloisEquivNormQuotient + (K := K) H hclosed + (globalNormResidueMonoidHom K + (closedFiniteIndexClassField + (K := K) H hclosed) c) = + QuotientGroup.mk' H c := by + have hNormResidue : + Additive.ofMul + (globalNormResidueMonoidHom K + (closedFiniteIndexClassField + (K := K) H hclosed) c) = + globalNormResidueEquiv K + (closedFiniteIndexClassField + (K := K) H hclosed) + (Additive.ofMul + (QuotientGroup.mk' + (_root_.ideleClassNorm K + (closedFiniteIndexClassField + (K := K) H hclosed)).range c)) := + congrArg (fun σ => Additive.ofMul σ) + (globalNormResidueMonoidHom_apply K + (closedFiniteIndexClassField + (K := K) H hclosed) c) + calc + _ = QuotientGroup.quotientMulEquivOfEq + (closedFiniteIndexClassField_ideleClassNorm_range + (K := K) H hclosed) + (Additive.toMul + ((globalNormResidueEquiv K + (closedFiniteIndexClassField + (K := K) H hclosed)).symm + (Additive.ofMul + (globalNormResidueMonoidHom K + (closedFiniteIndexClassField + (K := K) H hclosed) c)))) := + closedFiniteIndexClassFieldGaloisEquivNormQuotient_apply + (K := K) H hclosed _ + _ = QuotientGroup.quotientMulEquivOfEq + (closedFiniteIndexClassField_ideleClassNorm_range + (K := K) H hclosed) + (Additive.toMul + ((globalNormResidueEquiv K + (closedFiniteIndexClassField + (K := K) H hclosed)).symm + (globalNormResidueEquiv K + (closedFiniteIndexClassField + (K := K) H hclosed) + (Additive.ofMul + (QuotientGroup.mk' + (_root_.ideleClassNorm K + (closedFiniteIndexClassField + (K := K) H hclosed)).range c))))) := + congrArg + (fun τ => + QuotientGroup.quotientMulEquivOfEq + (closedFiniteIndexClassField_ideleClassNorm_range + (K := K) H hclosed) + (Additive.toMul + ((globalNormResidueEquiv K + (closedFiniteIndexClassField + (K := K) H hclosed)).symm τ))) + hNormResidue + _ = QuotientGroup.mk' H c := + quotientTransport_inverse_apply + ((_root_.ideleClassNorm K + (closedFiniteIndexClassField + (K := K) H hclosed)).range) + H + (globalNormResidueEquiv K + (closedFiniteIndexClassField + (K := K) H hclosed)) + (closedFiniteIndexClassField_ideleClassNorm_range + (K := K) H hclosed) + c + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological.lean new file mode 100644 index 0000000000..724d96e998 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/All.lean new file mode 100644 index 0000000000..6008568202 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/All.lean @@ -0,0 +1,20 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport +/-! +# Topological reciprocity for a closed finite-index class field + +This facade exports the generic norm-range transport, the continuous +reciprocity composite, and its evaluation law. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Construction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Construction.lean new file mode 100644 index 0000000000..e160c76374 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Construction.lean @@ -0,0 +1,61 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport +/-! +# Continuous closed finite-index class-field reciprocity + +The final equivalence composes finite global reciprocity with the generic +continuous transport induced by the exact norm-range equality. Equality +elimination preserves the native quotient topology, so no discrete topology +instances are reconstructed here. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open Reciprocity + +open scoped Classical in +/-- Canonical class-group commutativity supplies normality for the two quotients. -/ +private theorem closedFiniteIndexTopologicalClassGroupIsMulCommutative + (F : Type) [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + IsMulCommutative.of_comm (fun a b => mul_comm a b) + +attribute [local instance] closedFiniteIndexTopologicalClassGroupIsMulCommutative + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- Global reciprocity for the selected class field as a homeomorphic +multiplicative equivalence `Gal(L / K) ≃ₜ* C_K / H`. -/ +noncomputable def + closedFiniteIndexClassFieldGaloisContinuousEquivNormQuotient + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + Gal((closedFiniteIndexClassField + (K := K) H hclosed)/K) ≃ₜ* + IdeleClassGroup K ⧸ H := + (globalReciprocityContinuousMulEquiv K + (closedFiniteIndexClassField + (K := K) H hclosed)).trans + (QuotientGroup.quotientContinuousMulEquivOfEq + (closedFiniteIndexClassField_ideleClassNorm_range + (K := K) H hclosed)) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Evaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Evaluation.lean new file mode 100644 index 0000000000..0f52ffa6bf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Evaluation.lean @@ -0,0 +1,51 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore +/-! +# Evaluation of continuous closed finite-index reciprocity + +The public theorem uses the named reducible value provider and specializes +the generic transported-reciprocity calculation. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- Evaluation of the selected class-field equivalence is the named inverse +global norm-residue value in the quotient by the defining subgroup. -/ +@[simp] +theorem + closedFiniteIndexClassFieldGaloisContinuousEquivNormQuotient_apply + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] + (σ : Gal((closedFiniteIndexClassField + (K := K) H hclosed)/K)) : + closedFiniteIndexClassFieldGaloisContinuousEquivNormQuotient + (K := K) H hclosed σ = + closedFiniteIndexClassFieldReciprocityValue + (K := K) H hclosed σ := + globalReciprocityContinuousMulEquiv_trans_quotientOfEq_apply + H + (closedFiniteIndexClassField_ideleClassNorm_range + (K := K) H hclosed) + σ + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationCore.lean new file mode 100644 index 0000000000..8aeaa50d86 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationCore.lean @@ -0,0 +1,67 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue +/-! +# Generic evaluation core for transported reciprocity + +This theorem works for an arbitrary finite abelian extension and subgroup +equality. It proves the composition formula once without unfolding a +domain-specific selected-field construction. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open Reciprocity + +/-- Canonical class-group commutativity supplies normality in the transport formula. -/ +private theorem closedFiniteIndexEvaluationCoreClassGroupIsMulCommutative + (F : Type) [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + IsMulCommutative.of_comm (fun a b => mul_comm a b) + +attribute [local instance] closedFiniteIndexEvaluationCoreClassGroupIsMulCommutative + +variable + {K L : Type} [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + +/-- Evaluation of global reciprocity after continuous transport along an +equality between the actual norm range and a target subgroup. -/ +theorem globalReciprocityContinuousMulEquiv_trans_quotientOfEq_apply + (H : Subgroup (IdeleClassGroup K)) + (hNorm : (_root_.ideleClassNorm K L).range = H) + (σ : Gal(L/K)) : + ((globalReciprocityContinuousMulEquiv K L).trans + (QuotientGroup.quotientContinuousMulEquivOfEq hNorm)) σ = + QuotientGroup.quotientMulEquivOfEq hNorm + (Additive.toMul + ((globalNormResidueEquiv K L).symm + (Additive.ofMul σ))) := by + calc + _ = QuotientGroup.quotientContinuousMulEquivOfEq hNorm + (globalReciprocityContinuousMulEquiv K L σ) := rfl + _ = QuotientGroup.quotientMulEquivOfEq hNorm + (globalReciprocityContinuousMulEquiv K L σ) := + QuotientGroup.quotientContinuousMulEquivOfEq_apply _ _ + _ = _ := + congrArg + (QuotientGroup.quotientMulEquivOfEq hNorm) + (globalReciprocityContinuousMulEquiv_apply K L σ) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationValue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationValue.lean new file mode 100644 index 0000000000..01a5708949 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationValue.lean @@ -0,0 +1,62 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction +/-! +# Named value of closed finite-index reciprocity + +The expanded inverse norm-residue expression is kept behind one reducible +value provider. Public evaluation statements can therefore mention the +selected class-field instance tower once while remaining definitionally +equivalent to the historical formula. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open Reciprocity + +open scoped Classical in +/-- Canonical class-group commutativity supplies normality for norm-range transport. -/ +private theorem closedFiniteIndexEvaluationValueClassGroupIsMulCommutative + (F : Type) [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + IsMulCommutative.of_comm (fun a b => mul_comm a b) + +attribute [local instance] closedFiniteIndexEvaluationValueClassGroupIsMulCommutative + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- The quotient value prescribed by inverse global norm-residue reciprocity +for a Galois element of the selected closed finite-index class field. -/ +noncomputable abbrev closedFiniteIndexClassFieldReciprocityValue + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] + (σ : Gal((closedFiniteIndexClassField + (K := K) H hclosed)/K)) : + IdeleClassGroup K ⧸ H := + QuotientGroup.quotientMulEquivOfEq + (closedFiniteIndexClassField_ideleClassNorm_range + (K := K) H hclosed) + (Additive.toMul + ((globalNormResidueEquiv K + (closedFiniteIndexClassField + (K := K) H hclosed)).symm + (Additive.ofMul σ))) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/QuotientTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/QuotientTransport.lean new file mode 100644 index 0000000000..b966e8d861 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/QuotientTransport.lean @@ -0,0 +1,52 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree +/-! +# Continuous transport between equal quotient groups + +Equality of normal subgroups identifies their quotient groups with the same +native quotient topology. Eliminating the equality therefore gives the +continuous multiplicative equivalence directly; no discrete-topology +instances or domain-specific class-field tower are required. +-/ + +@[expose] public section + +noncomputable +section + +namespace QuotientGroup + +variable {G : Type*} [Group G] [TopologicalSpace G] + +/-- Equal normal subgroups induce a continuous multiplicative equivalence +between their quotient groups with their native quotient topologies. -/ +noncomputable def quotientContinuousMulEquivOfEq + {N H : Subgroup G} [N.Normal] [H.Normal] + (h : N = H) : + G ⧸ N ≃ₜ* G ⧸ H := by + subst H + exact ContinuousMulEquiv.refl _ + +/-- Forgetting topology from `quotientContinuousMulEquivOfEq` recovers the +canonical multiplicative equivalence induced by the same equality. -/ +@[simp] +theorem quotientContinuousMulEquivOfEq_apply + {N H : Subgroup G} [N.Normal] [H.Normal] + (h : N = H) (x : G ⧸ N) : + quotientContinuousMulEquivOfEq h x = + QuotientGroup.quotientMulEquivOfEq h x := by + subst H + refine QuotientGroup.induction_on x ?_ + intro g + exact + (QuotientGroup.quotientMulEquivOfEq_mk + (G := G) (M := N) (N := N) rfl g).symm + +end QuotientGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/Conductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/Conductor.lean new file mode 100644 index 0000000000..05b319724b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/Conductor.lean @@ -0,0 +1,269 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +/-! +# Narrow finite conductors + +This file constructs the finite part of the conductor in the convention +where every real place has the positive ray condition. It is therefore a +*narrow finite conductor*, not yet the full global conductor of an +arbitrary modulus with an archimedean component. + +The narrow finite conductor is the gcd of all finite moduli whose ray +class fields contain the given class field. On norm subgroups, those are +exactly the moduli `m` for which `C_K^m ≤ H`. + +We construct the gcd rather than postulating it. At each finite prime its +exponent is the least exponent occurring among all defining moduli. A +single defining modulus bounds the support, so these pointwise minima +assemble into a genuine finitely supported modulus. +-/ + +@[expose] public section + +open scoped NumberField +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain + +variable {K : Type*} [Field K] [NumberField K] + +open scoped Classical in +/-- A modulus defines a ray class field containing the class field +corresponding to `H` exactly when its congruence subgroup lies in `H`. -/ +def IsDefiningModulus + (H : Subgroup (IdeleClassGroup K)) + (m : RayClass.Modulus K) : Prop := + m.congruenceSubgroup ≤ H + +open scoped Classical in +/-- An idèle-class subgroup for which a finite ray-class defining modulus +exists. This is precisely the domain on which the narrow finite conductor +is defined. -/ +abbrev ConductorialSubgroup + (K : Type*) [Field K] [NumberField K] := + {H : Subgroup (IdeleClassGroup K) // + ∃ m : RayClass.Modulus K, IsDefiningModulus H m} + +open scoped Classical in +/-- At every finite place, some defining full modulus supplies a finite +defining exponent. This is the nonemptiness input for the pointwise finite +conductor minimum. -/ +theorem exists_definingFiniteExponent + (H : Subgroup (IdeleClassGroup K)) + (h : ∃ m, IsDefiningModulus H m) + (v : HeightOneSpectrum (𝓞 K)) : + ∃ n : ℕ, ∃ m : RayClass.Modulus K, + IsDefiningModulus H m ∧ m.finitePart v = n := by + let m := Classical.choose h + exact ⟨m.finitePart v, m, Classical.choose_spec h, rfl⟩ + +namespace ConductorialSubgroup + +open scoped Classical in +/-- A chosen full modulus defining a conductorial subgroup. -/ +noncomputable def chosenDefiningModulus + (H : ConductorialSubgroup K) : + RayClass.Modulus K := + Classical.choose H.2 + +open scoped Classical in +/-- The chosen full defining modulus has the advertised defining property. -/ +theorem chosenDefiningModulus_spec + (H : ConductorialSubgroup K) : + IsDefiningModulus H.1 H.chosenDefiningModulus := + Classical.choose_spec H.2 + +open scoped Classical in +/-- The finite part of one chosen defining modulus, used to bound the +support of the narrow finite conductor. -/ +noncomputable def narrowFiniteConductorBoundingModulus + (H : ConductorialSubgroup K) : + RayClass.FiniteModulus K := + H.chosenDefiningModulus.finitePart + +open scoped Classical in +/-- The finite bounding modulus comes from an actual defining full modulus. -/ +theorem narrowFiniteConductorBoundingModulus_spec + (H : ConductorialSubgroup K) : + ∃ m : RayClass.Modulus K, + IsDefiningModulus H.1 m ∧ + m.finitePart = H.narrowFiniteConductorBoundingModulus := + ⟨H.chosenDefiningModulus, H.chosenDefiningModulus_spec, rfl⟩ + +open scoped Classical in +/-- The least narrow finite conductor exponent at `v` among all defining +moduli. -/ +noncomputable def narrowFiniteConductorExponent + (H : ConductorialSubgroup K) + (v : HeightOneSpectrum (𝓞 K)) : ℕ := + Nat.find (exists_definingFiniteExponent H.1 H.2 v) + +open scoped Classical in +/-- The least narrow finite conductor exponent is attained by an actual +defining modulus. -/ +theorem narrowFiniteConductorExponent_spec + (H : ConductorialSubgroup K) + (v : HeightOneSpectrum (𝓞 K)) : + ∃ m : RayClass.Modulus K, + IsDefiningModulus H.1 m ∧ + m.finitePart v = H.narrowFiniteConductorExponent v := + Nat.find_spec (exists_definingFiniteExponent H.1 H.2 v) + +open scoped Classical in +/-- The narrow finite conductor exponent is no larger than the exponent in +any defining modulus. -/ +theorem narrowFiniteConductorExponent_le + (H : ConductorialSubgroup K) + {m : RayClass.Modulus K} + (hm : IsDefiningModulus H.1 m) + (v : HeightOneSpectrum (𝓞 K)) : + H.narrowFiniteConductorExponent v ≤ m.finitePart v := by + exact Nat.find_min' + (exists_definingFiniteExponent H.1 H.2 v) + ⟨m, hm, rfl⟩ + +open scoped Classical in +/-- The finite part of the conductor in the all-real-positive (narrow) +convention. -/ +noncomputable def narrowFiniteConductor + (H : ConductorialSubgroup K) : + RayClass.FiniteModulus K where + toFun := H.narrowFiniteConductorExponent + support := + H.narrowFiniteConductorBoundingModulus.support.filter + (fun v => H.narrowFiniteConductorExponent v ≠ 0) + mem_support_toFun := by + intro v + simp only [Finset.mem_filter, Finsupp.mem_support_iff] + constructor + · exact fun hv => hv.2 + · intro hv + refine ⟨?_, hv⟩ + intro hbound + have hle : + H.narrowFiniteConductorExponent v ≤ + H.narrowFiniteConductorBoundingModulus v := by + simpa only [narrowFiniteConductorBoundingModulus] using + H.narrowFiniteConductorExponent_le + H.chosenDefiningModulus_spec v + rw [hbound] at hle + exact hv (Nat.eq_zero_of_le_zero hle) + +open scoped Classical in +/-- Evaluating the narrow finite conductor returns its finite local +conductor exponent. -/ +@[simp] +theorem narrowFiniteConductor_apply + (H : ConductorialSubgroup K) + (v : HeightOneSpectrum (𝓞 K)) : + H.narrowFiniteConductor v = H.narrowFiniteConductorExponent v := + rfl + +open scoped Classical in +/-- The narrow finite conductor divides every defining modulus +(equivalently, its exponents are pointwise no larger). -/ +theorem narrowFiniteConductor_le + (H : ConductorialSubgroup K) + {m : RayClass.Modulus K} + (hm : IsDefiningModulus H.1 m) : + H.narrowFiniteConductor ≤ m.finitePart := by + intro v + exact H.narrowFiniteConductorExponent_le hm v + +open scoped Classical in +/-- Universal gcd characterization of the narrow finite conductor. -/ +theorem le_narrowFiniteConductor_iff + (H : ConductorialSubgroup K) + (d : RayClass.FiniteModulus K) : + d ≤ H.narrowFiniteConductor ↔ + ∀ m, IsDefiningModulus H.1 m → d ≤ m.finitePart := by + constructor + · intro hd m hm + exact hd.trans (H.narrowFiniteConductor_le hm) + · intro hd v + obtain ⟨m, hm, hmv⟩ := + H.narrowFiniteConductorExponent_spec v + change d v ≤ H.narrowFiniteConductorExponent v + rw [← hmv] + exact hd m hm v + +open scoped Classical in +/-- A conductorial subgroup is open because it contains a ray congruence +subgroup. -/ +theorem isOpen + (H : ConductorialSubgroup K) : + IsOpen ((H.1 : Subgroup (IdeleClassGroup K)) : Set (IdeleClassGroup K)) := by + obtain ⟨m, hm⟩ := H.2 + exact Subgroup.isOpen_mono hm (RayClass.isOpen_congruenceSubgroup m) + +open scoped Classical in +/-- A conductorial subgroup is closed. -/ +theorem isClosed + (H : ConductorialSubgroup K) : + IsClosed ((H.1 : Subgroup (IdeleClassGroup K)) : Set (IdeleClassGroup K)) := + H.1.isClosed_of_isOpen H.isOpen + +open scoped Classical in +/-- A conductorial subgroup has finite index. -/ +instance finiteIndex + (H : ConductorialSubgroup K) : + H.1.FiniteIndex := by + obtain ⟨m, hm⟩ := H.2 + exact Subgroup.finiteIndex_of_le hm + +open scoped Classical in +/-- The narrow finite conductor is the gcd of the finite parts of the +defining full moduli. -/ +theorem narrowFiniteConductor_is_gcd + (H : ConductorialSubgroup K) : + (∀ m, IsDefiningModulus H.1 m → H.narrowFiniteConductor ≤ m.finitePart) ∧ + (∀ d, (∀ m, IsDefiningModulus H.1 m → d ≤ m.finitePart) → + d ≤ H.narrowFiniteConductor) := by + constructor + · intro m hm + exact H.narrowFiniteConductor_le hm + · intro d hd + exact (H.le_narrowFiniteConductor_iff d).2 hd + +end ConductorialSubgroup + +open scoped Classical in +/-- A closed finite-index subgroup always has at least one defining +modulus. -/ +theorem exists_definingModulus_of_isClosed_finiteIndex + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + ∃ m, IsDefiningModulus H m := + ⟨RayClass.modulusInsideClosedFiniteIndex H hclosed, + by + simpa only [IsDefiningModulus] using + RayClass.modulusInsideClosedFiniteIndex_spec H hclosed⟩ + +namespace ConductorialSubgroup + +open scoped Classical in +/-- The conductorial subgroup canonically associated to a closed +finite-index idèle-class subgroup. -/ +noncomputable def ofClosedFiniteIndex + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + ConductorialSubgroup K := + ⟨H, exists_definingModulus_of_isClosed_finiteIndex H hclosed⟩ + +end ConductorialSubgroup + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorFrobenius.lean new file mode 100644 index 0000000000..e00d34a7ec --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorFrobenius.lean @@ -0,0 +1,589 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicRayClassMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealFrobenius +/-! +# Prime classes at the narrow finite norm conductor + +The one-place idèle of normalized order one defines two compatible +prime classes: one in the ray class group at the exact narrow finite norm +conductor, and one in the actual idele-class norm quotient. The +canonical narrow-finite-conductor ray-class map sends the former to the latter. + +For cyclic extensions the order of the norm-quotient class divides the +extension degree. Complete splitting forces this class to be trivial; +when the narrow-finite-conductor ray-class presentation is maximal, it also +forces the narrow finite conductor ray prime class itself to be trivial. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain IdeleGroup + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +-- Reuse the normality witness embedded in the imported ideal-Artin maps. +-- Without it, every occurrence of the norm quotient repeats an expensive +-- unsuccessful instance search and builds a non-definitional witness. +attribute [local instance] + IdealClassFieldTheory.ideleClassSubgroupNormal + +/-- The class of the normalized one-place prime idèle in the ray class +group at the exact narrow finite conductor of the actual norm subgroup. -/ +def narrowFiniteConductorRayPrimeClass + (v : HeightOneSpectrum (𝓞 K)) : + RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) := + QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)))) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (finitePrimeIdele v)) + +/-- The class of the normalized one-place prime idèle in the actual +idele-class norm quotient. -/ +def ideleClassNormFrobeniusClass + (v : HeightOneSpectrum (𝓞 K)) : + IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range := + QuotientGroup.mk' + ((_root_.ideleClassNorm K L).range) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (finitePrimeIdele v)) + +/-- At a prime outside the exact narrow finite norm conductor, the ideal-theoretic +Frobenius class agrees with the class of the normalized one-place idèle +in the actual norm quotient. -/ +theorem + narrowFiniteConductorIdealFrobeniusClass_eq_ideleClassNormFrobeniusClass + (v : HeightOneSpectrum (𝓞 K)) + (hv : + v ∉ + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)).support) : + IdealClassFieldTheory.idealFrobeniusClass + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) + ((_root_.ideleClassNorm K L).range) + (ideleClassNorm_narrowFiniteConductor_isDefiningModulus + (K := K) (L := L)) + v hv = + ideleClassNormFrobeniusClass + (K := K) (L := L) v := by + let m : RayClass.Modulus K := + RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)) + let N := (_root_.ideleClassNorm K L).range + let hm : RayClass.Modulus.congruenceSubgroup m ≤ N := + ideleClassNorm_narrowFiniteConductor_isDefiningModulus + (K := K) (L := L) + let a : RayClass.idelePrimeToModulusSubgroup m := + ⟨finitePrimeIdele v, + finitePrimeIdele_mem_idelePrimeToModulusSubgroup m v hv⟩ + have hIdeal : + RayClass.primeToIdealMap m a = + RayClass.primeToModulusIdeal m v hv := + primeToIdealMap_finitePrimeIdele m v hv + have hArtin : + IdealClassFieldTheory.idealArtinMap m N hm + (RayClass.primeToIdealMap m a) = + QuotientGroup.mk' N + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (a : IdeleGroup K)) := + idealArtinMap_primeToIdealMap m N hm a + change + IdealClassFieldTheory.idealArtinMap m N hm + (RayClass.primeToModulusIdeal m v hv) = + QuotientGroup.mk' N + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (finitePrimeIdele v)) + calc + _ = IdealClassFieldTheory.idealArtinMap m N hm + (RayClass.primeToIdealMap m a) := + congrArg (IdealClassFieldTheory.idealArtinMap m N hm) hIdeal.symm + _ = QuotientGroup.mk' N + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (a : IdeleGroup K)) := hArtin + _ = QuotientGroup.mk' N + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (finitePrimeIdele v)) := rfl + +/-- The order of a Frobenius class in the actual norm quotient is the +order of its prime ideal modulo the ideal Artin kernel at the exact narrow +finite norm conductor. -/ +theorem + orderOf_ideleClassNormFrobeniusClass_eq_orderOf_idealArtinPrimeClass + (v : HeightOneSpectrum (𝓞 K)) + (hv : + v ∉ + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)).support) : + orderOf + (ideleClassNormFrobeniusClass + (K := K) (L := L) v) = + orderOf + (QuotientGroup.mk' + (IdealClassFieldTheory.idealArtinKernel + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) + ((_root_.ideleClassNorm K L).range) + (ideleClassNorm_narrowFiniteConductor_isDefiningModulus + (K := K) (L := L))) + (RayClass.primeToModulusIdeal + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) + v hv)) := by + rw [← + narrowFiniteConductorIdealFrobeniusClass_eq_ideleClassNormFrobeniusClass + (K := K) (L := L) v hv] + exact + IdealClassFieldTheory.orderOf_idealFrobeniusClass + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) + ((_root_.ideleClassNorm K L).range) + (ideleClassNorm_narrowFiniteConductor_isDefiningModulus + (K := K) (L := L)) + v hv + +/-- Triviality of the actual norm-quotient Frobenius class is equivalent +to membership of the corresponding prime ideal in the ideal Artin kernel at +the exact narrow finite conductor. -/ +theorem + ideleClassNormFrobeniusClass_eq_one_iff_narrowFiniteConductorPrimeIdeal_mem_idealArtinKernel + (v : HeightOneSpectrum (𝓞 K)) + (hv : + v ∉ + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)).support) : + ideleClassNormFrobeniusClass + (K := K) (L := L) v = + 1 ↔ + RayClass.primeToModulusIdeal + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) + v hv ∈ + IdealClassFieldTheory.idealArtinKernel + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) + ((_root_.ideleClassNorm K L).range) + (ideleClassNorm_narrowFiniteConductor_isDefiningModulus + (K := K) (L := L)) := by + rw [← + narrowFiniteConductorIdealFrobeniusClass_eq_ideleClassNormFrobeniusClass + (K := K) (L := L) v hv] + rfl + +/-- The canonical narrow-finite-conductor ray-class map sends the narrow +finite conductor ray prime class to the corresponding actual norm-quotient +Frobenius class. -/ +@[simp] +theorem + narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_rayPrimeClass + (v : HeightOneSpectrum (𝓞 K)) : + narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient + (K := K) (L := L) + (narrowFiniteConductorRayPrimeClass + (K := K) (L := L) v) = + ideleClassNormFrobeniusClass + (K := K) (L := L) v := + rfl + +/-- The order of the actual norm-quotient Frobenius class divides the order +of its lift to the exact narrow-finite-conductor ray class group. -/ +theorem + orderOf_ideleClassNormFrobeniusClass_dvd_orderOf_narrowFiniteConductorRayPrimeClass + (v : HeightOneSpectrum (𝓞 K)) : + orderOf + (ideleClassNormFrobeniusClass + (K := K) (L := L) v) ∣ + orderOf + (narrowFiniteConductorRayPrimeClass + (K := K) (L := L) v) := by + rw [← + narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_rayPrimeClass + (K := K) (L := L) v] + exact + orderOf_map_dvd + (narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient + (K := K) (L := L)) + (narrowFiniteConductorRayPrimeClass + (K := K) (L := L) v) + +/-- Equal source and target orders make triviality of the narrow finite +conductor ray prime class equivalent to triviality of its actual norm-quotient +Frobenius class. -/ +theorem + narrowFiniteConductorRayPrimeClass_eq_one_iff_ideleClassNormFrobeniusClass_eq_one + (hcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)))) = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range)) + (v : HeightOneSpectrum (𝓞 K)) : + narrowFiniteConductorRayPrimeClass + (K := K) (L := L) v = 1 ↔ + ideleClassNormFrobeniusClass + (K := K) (L := L) v = 1 := by + let f := + narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient + (K := K) (L := L) + have hfInjective : Function.Injective f := + (rayClassToNormQuotient_injective_iff_card_eq_normQuotient_card + (K := K) (L := L)).2 hcard + constructor + · intro hprime + calc + ideleClassNormFrobeniusClass + (K := K) (L := L) v = + f (narrowFiniteConductorRayPrimeClass + (K := K) (L := L) v) := by + rw [ + narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_rayPrimeClass] + _ = f 1 := + congrArg f hprime + _ = 1 := + map_one f + · intro hnorm + apply hfInjective + rw [ + narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_rayPrimeClass, + hnorm, map_one] + +/-- Equal source and target orders make the narrow finite conductor ray prime class +and its actual norm-quotient image have the same order. -/ +theorem + orderOf_narrowFiniteConductorRayPrimeClass_eq_orderOf_ideleClassNormFrobeniusClass + (hcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)))) = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range)) + (v : HeightOneSpectrum (𝓞 K)) : + orderOf + (narrowFiniteConductorRayPrimeClass + (K := K) (L := L) v) = + orderOf + (ideleClassNormFrobeniusClass + (K := K) (L := L) v) := by + let f := + narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient + (K := K) (L := L) + have hfInjective : Function.Injective f := + (rayClassToNormQuotient_injective_iff_card_eq_normQuotient_card + (K := K) (L := L)).2 hcard + have horder := + orderOf_injective f hfInjective + (narrowFiniteConductorRayPrimeClass + (K := K) (L := L) v) + rw [ + narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_rayPrimeClass + (K := K) (L := L) v] at horder + exact horder.symm + +/-- When the exact narrow-finite-conductor ray presentation has the same order as +the actual norm quotient, triviality of its ray prime class is +equivalent to membership of the prime ideal in the ideal Artin kernel. -/ +theorem + rayPrimeClass_eq_one_iff_primeIdeal_mem_idealArtinKernel + (hcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)))) = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range)) + (v : HeightOneSpectrum (𝓞 K)) + (hv : + v ∉ + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)).support) : + narrowFiniteConductorRayPrimeClass + (K := K) (L := L) v = + 1 ↔ + RayClass.primeToModulusIdeal + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) + v hv ∈ + IdealClassFieldTheory.idealArtinKernel + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) + ((_root_.ideleClassNorm K L).range) + (ideleClassNorm_narrowFiniteConductor_isDefiningModulus + (K := K) (L := L)) := by + rw [ + narrowFiniteConductorRayPrimeClass_eq_one_iff_ideleClassNormFrobeniusClass_eq_one + (K := K) (L := L) hcard v, + ideleClassNormFrobeniusClass_eq_one_iff_narrowFiniteConductorPrimeIdeal_mem_idealArtinKernel + (K := K) (L := L) v hv] + +/-- Complete splitting at a finite place forces the corresponding +actual norm-quotient Frobenius class to be trivial. -/ +theorem + finitePlaceSplitsCompletely_imp_ideleClassNormFrobeniusClass_eq_one + (v : HeightOneSpectrum (𝓞 K)) + (hsplit : + _root_.FinitePlaceSplitsCompletely + (K := K) (L := L) v) : + ideleClassNormFrobeniusClass + (K := K) (L := L) v = 1 := by + apply (QuotientGroup.eq_one_iff _).2 + change + IdeleGroup.finitePlaceIdeleClass v + (FiniteIdeleGroup.chosenLocalOrderSection v 1) ∈ + (_root_.ideleClassNorm K L).range + apply + finitePlaceIdeleClass_range_le_ideleClassNorm_range_of_splitsCompletely + (K := K) (L := L) v hsplit + exact + ⟨FiniteIdeleGroup.chosenLocalOrderSection v 1, rfl⟩ + +/-- Complete splitting at a finite place makes its ideal Frobenius class at +the exact narrow finite norm conductor trivial. -/ +theorem + finitePlaceSplitsCompletely_imp_narrowFiniteConductorIdealFrobeniusClass_eq_one + (v : HeightOneSpectrum (𝓞 K)) + (hsplit : + _root_.FinitePlaceSplitsCompletely + (K := K) (L := L) v) : + IdealClassFieldTheory.idealFrobeniusClass + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) + ((_root_.ideleClassNorm K L).range) + (ideleClassNorm_narrowFiniteConductor_isDefiningModulus + (K := K) (L := L)) + v + (not_mem_ideleClassNorm_narrowFiniteConductor_support_of_splitsCompletely + (K := K) (L := L) v hsplit) = + 1 := by + rw [ + narrowFiniteConductorIdealFrobeniusClass_eq_ideleClassNormFrobeniusClass, + finitePlaceSplitsCompletely_imp_ideleClassNormFrobeniusClass_eq_one + (K := K) (L := L) v hsplit] + +/-- A finite prime which splits completely belongs to the ideal Artin kernel +at the exact narrow finite norm conductor. -/ +theorem + finitePlaceSplitsCompletely_imp_narrowFiniteConductorPrimeIdeal_mem_idealArtinKernel + (v : HeightOneSpectrum (𝓞 K)) + (hsplit : + _root_.FinitePlaceSplitsCompletely + (K := K) (L := L) v) : + RayClass.primeToModulusIdeal + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) + v + (not_mem_ideleClassNorm_narrowFiniteConductor_support_of_splitsCompletely + (K := K) (L := L) v hsplit) ∈ + IdealClassFieldTheory.idealArtinKernel + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) + ((_root_.ideleClassNorm K L).range) + (ideleClassNorm_narrowFiniteConductor_isDefiningModulus + (K := K) (L := L)) := by + apply + (ideleClassNormFrobeniusClass_eq_one_iff_narrowFiniteConductorPrimeIdeal_mem_idealArtinKernel + (K := K) (L := L) v + (not_mem_ideleClassNorm_narrowFiniteConductor_support_of_splitsCompletely + (K := K) (L := L) v hsplit)).1 + exact + finitePlaceSplitsCompletely_imp_ideleClassNormFrobeniusClass_eq_one + (K := K) (L := L) v hsplit + +section Cyclic + +variable [IsCyclic (L ≃ₐ[K] L)] + +/-- For a finite cyclic extension, the order of every actual +norm-quotient Frobenius class divides the extension degree. -/ +theorem orderOf_ideleClassNormFrobeniusClass_dvd_extensionDegree + (v : HeightOneSpectrum (𝓞 K)) : + orderOf + (ideleClassNormFrobeniusClass + (K := K) (L := L) v) ∣ + Module.finrank K L := by + simpa only [ + ← Subgroup.index_eq_card, + ClassFieldAxiom.ideleClassNorm_index_eq_finrank_cyclic K L] using + orderOf_dvd_natCard + (ideleClassNormFrobeniusClass + (K := K) (L := L) v) + +/-- For a finite cyclic extension, the order of every ideal Frobenius class +outside the exact narrow finite norm conductor divides the extension degree. -/ +theorem + orderOf_narrowFiniteConductorIdealFrobeniusClass_dvd_extensionDegree + (v : HeightOneSpectrum (𝓞 K)) + (hv : + v ∉ + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)).support) : + orderOf + (IdealClassFieldTheory.idealFrobeniusClass + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) + ((_root_.ideleClassNorm K L).range) + (ideleClassNorm_narrowFiniteConductor_isDefiningModulus + (K := K) (L := L)) + v hv) ∣ + Module.finrank K L := by + rw [ + narrowFiniteConductorIdealFrobeniusClass_eq_ideleClassNormFrobeniusClass] + exact + orderOf_ideleClassNormFrobeniusClass_dvd_extensionDegree + (K := K) (L := L) v + +/-- For a finite cyclic extension, the order of the prime ideal class modulo +the ideal Artin kernel at the exact narrow finite conductor divides the +extension degree. -/ +theorem + orderOf_narrowFiniteConductorPrimeIdealArtinClass_dvd_extensionDegree + (v : HeightOneSpectrum (𝓞 K)) + (hv : + v ∉ + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)).support) : + orderOf + (QuotientGroup.mk' + (IdealClassFieldTheory.idealArtinKernel + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) + ((_root_.ideleClassNorm K L).range) + (ideleClassNorm_narrowFiniteConductor_isDefiningModulus + (K := K) (L := L))) + (RayClass.primeToModulusIdeal + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) + v hv)) ∣ + Module.finrank K L := by + rw [← + orderOf_ideleClassNormFrobeniusClass_eq_orderOf_idealArtinPrimeClass + (K := K) (L := L) v hv] + exact + orderOf_ideleClassNormFrobeniusClass_dvd_extensionDegree + (K := K) (L := L) v + +/-- At maximal cyclic ray-class cardinality, triviality of the exact narrow +finite conductor ray prime class is equivalent to membership of the prime +ideal in the ideal Artin kernel. -/ +theorem + rayPrimeClass_eq_one_iff_primeIdeal_mem_idealArtinKernel_of_card_eq_extensionDegree + (hcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)))) = + Module.finrank K L) + (v : HeightOneSpectrum (𝓞 K)) + (hv : + v ∉ + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)).support) : + narrowFiniteConductorRayPrimeClass + (K := K) (L := L) v = + 1 ↔ + RayClass.primeToModulusIdeal + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) + v hv ∈ + IdealClassFieldTheory.idealArtinKernel + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) + ((_root_.ideleClassNorm K L).range) + (ideleClassNorm_narrowFiniteConductor_isDefiningModulus + (K := K) (L := L)) := by + have hNormCard : + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) = + Module.finrank K L := by + rw [← Subgroup.index_eq_card] + exact + ClassFieldAxiom.ideleClassNorm_index_eq_finrank_cyclic K L + exact + rayPrimeClass_eq_one_iff_primeIdeal_mem_idealArtinKernel + (K := K) (L := L) + (hcard.trans hNormCard.symm) v hv + +/-- If a cyclic extension reaches the full ray class number at its exact +narrow finite conductor, complete splitting forces the corresponding ray +prime class to be trivial. -/ +theorem + splitsCompletely_imp_rayPrimeClass_eq_one_of_card_eq_extensionDegree + (hcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)))) = + Module.finrank K L) + (v : HeightOneSpectrum (𝓞 K)) + (hsplit : + _root_.FinitePlaceSplitsCompletely + (K := K) (L := L) v) : + narrowFiniteConductorRayPrimeClass + (K := K) (L := L) v = 1 := by + have hfInjective : + Function.Injective + (narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient + (K := K) (L := L)) := + (rayClassToNormQuotient_injective_iff_card_eq_extensionDegree + (K := K) (L := L)).2 hcard + apply hfInjective + rw [ + narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_rayPrimeClass, + finitePlaceSplitsCompletely_imp_ideleClassNormFrobeniusClass_eq_one + (K := K) (L := L) v hsplit, + map_one] + +end Cyclic + +/-- Under the maximal narrow-finite-conductor ray-class cardinality +condition, the order of every corresponding ray prime class divides the +extension degree. -/ +theorem + orderOf_narrowFiniteConductorRayPrimeClass_dvd_extensionDegree_of_card_eq + (hcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)))) = + Module.finrank K L) + (v : HeightOneSpectrum (𝓞 K)) : + orderOf + (narrowFiniteConductorRayPrimeClass + (K := K) (L := L) v) ∣ + Module.finrank K L := by + simpa only [hcard] using + orderOf_dvd_natCard + (narrowFiniteConductorRayPrimeClass + (K := K) (L := L) v) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorInfinitePart.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorInfinitePart.lean new file mode 100644 index 0000000000..ee135a90c2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorInfinitePart.lean @@ -0,0 +1,313 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLocalComparison +/-! +# Removing one real place from a defining modulus + +This file gives the one-place archimedean step toward the full conductor. +Removing the positivity condition at a real place preserves the defining +property exactly when the whole one-place idèle-class image is already +contained in the target subgroup. +-/ + +@[expose] public section + +open scoped NumberField +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain + +variable {K : Type*} [Field K] [NumberField K] + +open scoped Classical in +/-- Erasing a selected real place can only decrease a full modulus. -/ +theorem eraseRealPlace_le + (m : RayClass.Modulus K) (v : RayClass.RealPlace K) : + m.eraseRealPlace v ≤ m := + ⟨le_rfl, Finset.erase_subset v m.infinitePart⟩ + +open scoped Classical in +/-- If a real place is not selected by a modulus, its whole one-place +idèle-class image lies in the corresponding ray congruence subgroup. -/ +theorem infinitePlaceIdeleClass_range_le_congruenceSubgroup_of_not_mem + (m : RayClass.Modulus K) (v : RayClass.RealPlace K) + (hv : v ∉ m.infinitePart) : + (IdeleGroup.infinitePlaceIdeleClass v.1).range ≤ + m.congruenceSubgroup := by + rintro _ ⟨x, rfl⟩ + rw [RayClass.Modulus.congruenceSubgroup] + refine ⟨IdeleGroup.infinitePlaceIdele v.1 x, ?_, rfl⟩ + apply Subgroup.mem_sup_left + rw [RayClass.Modulus.mem_ideleCongruenceSubgroup_iff] + refine ⟨?_, ?_⟩ + · rw [RayClass.Modulus.mem_infiniteCongruenceSubgroup_iff] + intro w hw + have hwv : w ≠ v := by + intro hwv + subst w + exact hv hw + have hwv' : w.1 ≠ v.1 := by + intro h + exact hwv (Subtype.ext h) + change + IdeleGroup.infiniteComponent w.1 + (IdeleGroup.infinitePlaceIdele v.1 x) ∈ + RayClass.infinitePositiveSubgroup w.1 + rw [IdeleGroup.infinitePlaceIdele_infiniteComponent_of_ne + v.1 w.1 x hwv'] + exact Subgroup.one_mem _ + · rw [RayClass.mem_finiteCongruenceSubgroup_iff] + intro w + change + IdeleGroup.finiteComponent w + (IdeleGroup.infinitePlaceIdele v.1 x) ∈ + RayClass.localHigherUnitGroup w (m.finitePart w) + rw [IdeleGroup.infinitePlaceIdele_finiteComponent] + exact Subgroup.one_mem _ + +open scoped Classical in +private theorem eraseRealPlace_isDefiningModulus_of_range_le + (H : Subgroup (IdeleClassGroup K)) + (m : RayClass.Modulus K) + (hm : IsDefiningModulus H m) + (v : RayClass.RealPlace K) + (hvH : (IdeleGroup.infinitePlaceIdeleClass v.1).range ≤ H) : + IsDefiningModulus H (m.eraseRealPlace v) := by + let m' : RayClass.Modulus K := m.eraseRealPlace v + change IsDefiningModulus H m' + let q : IdeleGroup K →* IdeleClassGroup K := + QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + rw [IsDefiningModulus, RayClass.Modulus.congruenceSubgroup, + Subgroup.map_le_iff_le_comap] + apply sup_le + · intro a ha + have ha' := + (RayClass.Modulus.mem_ideleCongruenceSubgroup_iff m' a).1 ha + let s : IdeleGroup K := + IdeleGroup.infinitePlaceIdele v.1 + (IdeleGroup.infiniteComponent v.1 a) + let b : IdeleGroup K := a * s⁻¹ + have hsH : q s ∈ H := by + change + IdeleGroup.infinitePlaceIdeleClass v.1 + (IdeleGroup.infiniteComponent v.1 a) ∈ H + apply hvH + exact ⟨IdeleGroup.infiniteComponent v.1 a, rfl⟩ + have hbCong : b ∈ m.ideleCongruenceSubgroup := by + rw [RayClass.Modulus.mem_ideleCongruenceSubgroup_iff] + refine ⟨?_, ?_⟩ + · rw [RayClass.Modulus.mem_infiniteCongruenceSubgroup_iff] + intro w hw + by_cases hwv : w = v + · subst w + change + IdeleGroup.infiniteComponent v.1 b ∈ + RayClass.infinitePositiveSubgroup v.1 + dsimp only [b] + rw [map_mul, map_inv] + dsimp only [s] + rw [IdeleGroup.infinitePlaceIdele_infiniteComponent_same, + mul_inv_cancel] + exact Subgroup.one_mem _ + · have hw' : w ∈ m'.infinitePart := by + change w ∈ m.infinitePart.erase v + exact Finset.mem_erase.mpr ⟨hwv, hw⟩ + have haw := + (RayClass.Modulus.mem_infiniteCongruenceSubgroup_iff + m' a.1).1 ha'.1 w hw' + have hwv' : w.1 ≠ v.1 := by + intro h + exact hwv (Subtype.ext h) + change + IdeleGroup.infiniteComponent w.1 b ∈ + RayClass.infinitePositiveSubgroup w.1 + dsimp only [b] + rw [map_mul, map_inv] + dsimp only [s] + rw [IdeleGroup.infinitePlaceIdele_infiniteComponent_of_ne + v.1 w.1 _ hwv', + inv_one, mul_one] + exact haw + · rw [RayClass.mem_finiteCongruenceSubgroup_iff] + intro w + have haw : + a.2 w ∈ RayClass.localHigherUnitGroup w (m.finitePart w) := by + simpa [m'] using ha'.2 w + change + IdeleGroup.finiteComponent w b ∈ + RayClass.localHigherUnitGroup w (m.finitePart w) + dsimp only [b] + rw [map_mul, map_inv] + dsimp only [s] + rw [IdeleGroup.infinitePlaceIdele_finiteComponent, + inv_one, mul_one, IdeleGroup.finiteComponent_apply] + exact haw + have hbH : q b ∈ H := by + apply hm + rw [RayClass.Modulus.congruenceSubgroup] + exact ⟨b, Subgroup.mem_sup_left hbCong, rfl⟩ + have hab : a = b * s := by + dsimp [b] + group + change q a ∈ H + rw [hab, map_mul] + exact H.mul_mem hbH hsH + · intro a ha + change q a ∈ H + have hqa : q a = 1 := + (QuotientGroup.eq_one_iff a).2 ha + rw [hqa] + exact H.one_mem + +open scoped Classical in +/-- Removing the positivity condition at one real place preserves the +defining-modulus property exactly when the whole one-place idèle-class +image is already contained in the target subgroup. -/ +theorem eraseRealPlace_isDefiningModulus_iff + (H : Subgroup (IdeleClassGroup K)) + (m : RayClass.Modulus K) + (v : RayClass.RealPlace K) : + IsDefiningModulus H (m.eraseRealPlace v) ↔ + IsDefiningModulus H m ∧ + (IdeleGroup.infinitePlaceIdeleClass v.1).range ≤ H := by + constructor + · intro hm' + refine ⟨?_, ?_⟩ + · exact + (RayClass.Modulus.congruenceSubgroup_antitone + (eraseRealPlace_le m v)).trans hm' + · exact + (infinitePlaceIdeleClass_range_le_congruenceSubgroup_of_not_mem + (m.eraseRealPlace v) v (by simp)).trans hm' + · rintro ⟨hm, hvH⟩ + exact eraseRealPlace_isDefiningModulus_of_range_le H m hm v hvH + +open scoped Classical in +/-- Erasing finitely many real places preserves the defining-modulus +property when every corresponding one-place idèle-class image is contained +in the target subgroup. -/ +theorem eraseRealPlaces_isDefiningModulus_of_ranges_le + (H : Subgroup (IdeleClassGroup K)) + (m : RayClass.Modulus K) + (hm : IsDefiningModulus H m) + (s : Finset (RayClass.RealPlace K)) + (hs : ∀ v ∈ s, + (IdeleGroup.infinitePlaceIdeleClass v.1).range ≤ H) : + IsDefiningModulus H (m.eraseRealPlaces s) := by + classical + revert hs + induction s using Finset.induction_on with + | empty => + intro _hs + simpa only [RayClass.Modulus.eraseRealPlaces_empty] using hm + | @insert v s _ ih => + intro hs + rw [RayClass.Modulus.eraseRealPlaces_insert] + exact + (eraseRealPlace_isDefiningModulus_iff H + (m.eraseRealPlaces s) v).2 + ⟨ih (fun w hw => hs w (Finset.mem_insert_of_mem hw)), + hs v (Finset.mem_insert_self v s)⟩ + +namespace ConductorialSubgroup + +open scoped Classical in +/-- The real places whose one-place idèle-class image is not contained in +the target subgroup. -/ +noncomputable def fullConductorInfinitePart + (H : ConductorialSubgroup K) : Finset (RayClass.RealPlace K) := + (Finset.univ : Finset (RayClass.RealPlace K)).filter fun v => + ¬ (IdeleGroup.infinitePlaceIdeleClass v.1).range ≤ H.1 + +open scoped Classical in +/-- Membership in the infinite part of the full conductor is the failure of +the corresponding one-place idèle-class image to lie in the target subgroup. -/ +@[simp] +theorem mem_fullConductorInfinitePart_iff + (H : ConductorialSubgroup K) (v : RayClass.RealPlace K) : + v ∈ H.fullConductorInfinitePart ↔ + ¬ (IdeleGroup.infinitePlaceIdeleClass v.1).range ≤ H.1 := by + simp only [fullConductorInfinitePart, Finset.mem_filter, + Finset.mem_univ, true_and] + +open scoped Classical in +/-- Every defining modulus contains the infinite part of the full conductor. -/ +theorem fullConductorInfinitePart_subset_of_isDefiningModulus + (H : ConductorialSubgroup K) {m : RayClass.Modulus K} + (hm : IsDefiningModulus H.1 m) : + H.fullConductorInfinitePart ⊆ m.infinitePart := by + intro v hv + have hvNot := (H.mem_fullConductorInfinitePart_iff v).1 hv + by_contra hvm + exact hvNot + ((infinitePlaceIdeleClass_range_le_congruenceSubgroup_of_not_mem + m v hvm).trans hm) + +open scoped Classical in +/-- The full conductor, with the narrow finite conductor as finite part and +exactly the required real places as infinite part. -/ +noncomputable def fullConductor + (H : ConductorialSubgroup K) : RayClass.Modulus K where + finitePart := H.narrowFiniteConductor + infinitePart := H.fullConductorInfinitePart + +open scoped Classical in +/-- The full conductor is itself a defining modulus. -/ +theorem fullConductor_isDefiningModulus + (H : ConductorialSubgroup K) : + IsDefiningModulus H.1 H.fullConductor := by + obtain ⟨m, hm, hfinite⟩ := + H.exists_definingModulus_finitePart_eq_narrowFiniteConductor + let s : Finset (RayClass.RealPlace K) := + m.infinitePart \ H.fullConductorInfinitePart + have hs : ∀ v ∈ s, + (IdeleGroup.infinitePlaceIdeleClass v.1).range ≤ H.1 := by + intro v hv + have hvNot : v ∉ H.fullConductorInfinitePart := + (Finset.mem_sdiff.mp hv).2 + by_contra hvRange + exact hvNot (H.mem_fullConductorInfinitePart_iff v |>.2 hvRange) + have hmErase : + IsDefiningModulus H.1 (m.eraseRealPlaces s) := + eraseRealPlaces_isDefiningModulus_of_ranges_le H.1 m hm s hs + have hsubset : H.fullConductorInfinitePart ⊆ m.infinitePart := + H.fullConductorInfinitePart_subset_of_isDefiningModulus hm + have hmod : m.eraseRealPlaces s = H.fullConductor := by + apply RayClass.Modulus.ext + · simpa only [RayClass.Modulus.finitePart_eraseRealPlaces, + fullConductor] using hfinite + · simpa only [RayClass.Modulus.infinitePart_eraseRealPlaces, + fullConductor, s] using + Finset.sdiff_sdiff_eq_self hsubset + rw [← hmod] + exact hmErase + +open scoped Classical in +/-- A modulus is defining exactly when it is at least the full conductor. -/ +theorem isDefiningModulus_iff_fullConductor_le + (H : ConductorialSubgroup K) (m : RayClass.Modulus K) : + IsDefiningModulus H.1 m ↔ H.fullConductor ≤ m := by + constructor + · intro hm + exact + ⟨H.narrowFiniteConductor_le hm, + H.fullConductorInfinitePart_subset_of_isDefiningModulus hm⟩ + · intro hm + exact + (RayClass.Modulus.congruenceSubgroup_antitone hm).trans + H.fullConductor_isDefiningModulus + +end ConductorialSubgroup + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLattice.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLattice.lean new file mode 100644 index 0000000000..cdb65b22a6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLattice.lean @@ -0,0 +1,199 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLocalComparison +/-! +# Lattice operations on narrow finite conductors + +Increasing a modulus decreases its ray congruence subgroup. This +contravariance makes the narrow finite conductor of an intersection of +norm subgroups the pointwise maximum of their narrow finite conductors. +Under class-field correspondence, this is the finite-part lcm formula +for a compositum. For a generated subgroup one obtains the +complementary divisibility by the pointwise minimum. +-/ + +@[expose] public section + +open scoped NumberField +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain + +variable {K : Type*} [Field K] [NumberField K] + +open scoped Classical in +/-- Finite idèle congruence subgroups are contravariant in the modulus. -/ +theorem rayClassFiniteCongruenceSubgroup_antitone + {m n : RayClass.FiniteModulus K} (hmn : m ≤ n) : + RayClass.finiteCongruenceSubgroup n ≤ + RayClass.finiteCongruenceSubgroup m := by + intro a ha v + exact + RayClass.localHigherUnitGroup_antitone + (K := K) v (hmn v) (ha v) + +open scoped Classical in +/-- Infinite idèle congruence subgroups are contravariant in the full +modulus: selecting more real places imposes more positivity conditions. -/ +theorem rayClassInfiniteCongruenceSubgroup_antitone + {m n : RayClass.Modulus K} (hmn : m ≤ n) : + n.infiniteCongruenceSubgroup ≤ + m.infiniteCongruenceSubgroup := by + intro a ha + rw [RayClass.Modulus.mem_infiniteCongruenceSubgroup_iff] at ha ⊢ + intro v hv + exact ha v (hmn.2 hv) + +open scoped Classical in +/-- Idèle congruence subgroups are contravariant in the modulus. -/ +theorem rayClassIdeleCongruenceSubgroup_antitone + {m n : RayClass.Modulus K} (hmn : m ≤ n) : + n.ideleCongruenceSubgroup ≤ + m.ideleCongruenceSubgroup := by + rintro a ⟨haInfinite, haFinite⟩ + exact + ⟨rayClassInfiniteCongruenceSubgroup_antitone + (K := K) hmn haInfinite, + rayClassFiniteCongruenceSubgroup_antitone + (K := K) hmn.1 haFinite⟩ + +open scoped Classical in +/-- Ray congruence subgroups in the idèle class group are +contravariant in the modulus. -/ +theorem rayClassCongruenceSubgroup_antitone + {m n : RayClass.Modulus K} (hmn : m ≤ n) : + n.congruenceSubgroup ≤ + m.congruenceSubgroup := by + unfold RayClass.Modulus.congruenceSubgroup + apply Subgroup.map_mono + exact + sup_le + ((rayClassIdeleCongruenceSubgroup_antitone + (K := K) hmn).trans le_sup_left) + le_sup_right + +open scoped Classical in +/-- Once a modulus defines a subgroup, every larger modulus also +defines it. -/ +theorem isDefiningModulus_mono + (H : Subgroup (IdeleClassGroup K)) + {m n : RayClass.Modulus K} + (hm : IsDefiningModulus H m) + (hmn : m ≤ n) : + IsDefiningModulus H n := + (rayClassCongruenceSubgroup_antitone + (K := K) hmn).trans hm + +namespace ConductorialSubgroup + +open scoped Classical in +/-- The exact narrow finite conductor, interpreted as a full modulus with +positivity at every real place, is a defining modulus. -/ +theorem narrowFiniteConductor_isDefiningModulus + (H : ConductorialSubgroup K) : + IsDefiningModulus H.1 + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor) := by + obtain ⟨m, hm, hfinite⟩ := + H.exists_definingModulus_finitePart_eq_narrowFiniteConductor + apply isDefiningModulus_mono H.1 hm + exact ⟨hfinite.le, Finset.subset_univ _⟩ + +open scoped Classical in +/-- The join of the narrow finite conductors defines the intersection of +the two underlying subgroups. -/ +theorem inf_narrowFiniteConductor_isDefiningModulus + (H J : ConductorialSubgroup K) : + IsDefiningModulus (H.1 ⊓ J.1) + (RayClass.Modulus.narrowOfFinite + (H.narrowFiniteConductor ⊔ J.narrowFiniteConductor)) := by + apply le_inf + · exact + isDefiningModulus_mono H.1 H.narrowFiniteConductor_isDefiningModulus + ⟨le_sup_left, Finset.subset_univ _⟩ + · exact + isDefiningModulus_mono J.1 J.narrowFiniteConductor_isDefiningModulus + ⟨le_sup_right, Finset.subset_univ _⟩ + +open scoped Classical in +/-- The intersection of two conductorial subgroups, with its defining +modulus obtained from the two actual narrow finite conductors. -/ +noncomputable def inf + (H J : ConductorialSubgroup K) : + ConductorialSubgroup K := + ⟨H.1 ⊓ J.1, + ⟨RayClass.Modulus.narrowOfFinite + (H.narrowFiniteConductor ⊔ J.narrowFiniteConductor), + H.inf_narrowFiniteConductor_isDefiningModulus J⟩⟩ + +open scoped Classical in +/-- The subgroup generated by two conductorial subgroups. -/ +noncomputable def sup + (H J : ConductorialSubgroup K) : + ConductorialSubgroup K := + ⟨H.1 ⊔ J.1, + ⟨RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor, + H.narrowFiniteConductor_isDefiningModulus.trans le_sup_left⟩⟩ + +open scoped Classical in +/-- The narrow finite conductor of an intersection is the pointwise +maximum of the two narrow finite conductors. -/ +theorem narrowFiniteConductor_inf + (H J : ConductorialSubgroup K) : + (H.inf J).narrowFiniteConductor = + H.narrowFiniteConductor ⊔ J.narrowFiniteConductor := by + apply le_antisymm + · exact + (H.inf J).narrowFiniteConductor_le + (H.inf_narrowFiniteConductor_isDefiningModulus J) + · apply sup_le + · exact + (H.inf J).narrowFiniteConductor_antitone H (by + change H.1 ⊓ J.1 ≤ H.1 + exact inf_le_left) + · exact + (H.inf J).narrowFiniteConductor_antitone J (by + change H.1 ⊓ J.1 ≤ J.1 + exact inf_le_right) + +open scoped Classical in +/-- The finite-prime support of the narrow finite conductor of an +intersection is the union of the two conductor supports. -/ +theorem narrowFiniteConductor_inf_support + (H J : ConductorialSubgroup K) : + (H.inf J).narrowFiniteConductor.support = + H.narrowFiniteConductor.support ∪ + J.narrowFiniteConductor.support := by + rw [H.narrowFiniteConductor_inf J, Finsupp.support_sup] + +open scoped Classical in +/-- The narrow finite conductor of the subgroup generated by two +conductorial subgroups divides the pointwise minimum of their conductors. -/ +theorem narrowFiniteConductor_sup_le_inf + (H J : ConductorialSubgroup K) : + (H.sup J).narrowFiniteConductor ≤ + H.narrowFiniteConductor ⊓ J.narrowFiniteConductor := by + apply le_inf + · exact + H.narrowFiniteConductor_antitone (H.sup J) (by + change H.1 ≤ H.1 ⊔ J.1 + exact le_sup_left) + · exact + J.narrowFiniteConductor_antitone (H.sup J) (by + change J.1 ≤ H.1 ⊔ J.1 + exact le_sup_right) + +end ConductorialSubgroup + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLocalComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLocalComparison.lean new file mode 100644 index 0000000000..923e7ce8f9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLocalComparison.lean @@ -0,0 +1,344 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.Conductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.LocalConductor +/-! +# Narrow finite and local conductor exponents + +The narrow finite conductor is the finite component of the conductor in +the all-real-positive convention. We formulate its local condition +directly inside the idele class group: insert a higher unit at one finite +place and `1` at every other place, then pass to the idele class group. + +The proof is constructive. One inequality follows by restricting any +global defining modulus to one place. For the reverse inequality, replace +one exponent of a fixed defining modulus by the local minimum and split an +idele into its one-place component and the remaining defining-modulus +component. +-/ + +@[expose] public section + +open scoped NumberField +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain + +variable {K : Type*} [Field K] [NumberField K] + +open scoped Classical in +/-- If a global defining modulus exists, then at every finite place some +higher-unit class subgroup is already contained in the given subgroup. -/ +theorem exists_localDefiningExponent + (H : Subgroup (IdeleClassGroup K)) + (h : ∃ m, IsDefiningModulus H m) + (v : HeightOneSpectrum (𝓞 K)) : + ∃ n : ℕ, + RayClass.localHigherUnitClassSubgroup v n ≤ H := by + let m := Classical.choose h + refine ⟨m.finitePart v, ?_⟩ + exact + (RayClass.localHigherUnitClassSubgroup_le_congruenceSubgroup + m v).trans (Classical.choose_spec h) + +namespace ConductorialSubgroup + +open scoped Classical in +/-- The finite local conductor exponent seen by a conductorial subgroup. -/ +noncomputable def narrowFiniteLocalConductorExponent + (H : ConductorialSubgroup K) + (v : HeightOneSpectrum (𝓞 K)) : ℕ := + Nat.find (exists_localDefiningExponent H.1 H.2 v) + +open scoped Classical in +/-- The finite local conductor exponent has its defining higher-unit +inclusion. -/ +theorem narrowFiniteLocalConductorExponent_spec + (H : ConductorialSubgroup K) + (v : HeightOneSpectrum (𝓞 K)) : + RayClass.localHigherUnitClassSubgroup v + (H.narrowFiniteLocalConductorExponent v) ≤ H.1 := + Nat.find_spec (exists_localDefiningExponent H.1 H.2 v) + +open scoped Classical in +/-- Minimality of the finite local conductor exponent. -/ +theorem narrowFiniteLocalConductorExponent_le + (H : ConductorialSubgroup K) + (v : HeightOneSpectrum (𝓞 K)) + {n : ℕ} + (hn : RayClass.localHigherUnitClassSubgroup v n ≤ H.1) : + H.narrowFiniteLocalConductorExponent v ≤ n := by + exact Nat.find_min' + (exists_localDefiningExponent H.1 H.2 v) hn + +open scoped Classical in +/-- The finite local conductor exponent vanishes exactly when the full +finite-place integral-unit class subgroup lies in the subgroup. -/ +theorem narrowFiniteLocalConductorExponent_eq_zero_iff + (H : ConductorialSubgroup K) + (v : HeightOneSpectrum (𝓞 K)) : + H.narrowFiniteLocalConductorExponent v = 0 ↔ + RayClass.localHigherUnitClassSubgroup v 0 ≤ H.1 := by + constructor + · intro hzero + simpa only [hzero] using + H.narrowFiniteLocalConductorExponent_spec v + · intro hlocal + exact Nat.eq_zero_of_le_zero + (H.narrowFiniteLocalConductorExponent_le v hlocal) + +end ConductorialSubgroup + +open scoped Classical in +/-- Replacing one finite exponent of a defining modulus, while retaining its +selected real places, again gives a defining modulus. -/ +theorem replaceFiniteExponent_definingModulus + (H : Subgroup (IdeleClassGroup K)) + (m : RayClass.Modulus K) + (hm : IsDefiningModulus H m) + (v : HeightOneSpectrum (𝓞 K)) + (n : ℕ) + (hn : RayClass.localHigherUnitClassSubgroup v n ≤ H) : + IsDefiningModulus H + (m.replaceFinitePart (m.finitePart.update v n)) := by + let m' : RayClass.Modulus K := + m.replaceFinitePart (m.finitePart.update v n) + change IsDefiningModulus H m' + let q : IdeleGroup K →* IdeleClassGroup K := + QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + rw [IsDefiningModulus, RayClass.Modulus.congruenceSubgroup, + Subgroup.map_le_iff_le_comap] + apply sup_le + · intro a ha + have ha' := (RayClass.Modulus.mem_ideleCongruenceSubgroup_iff m' a).1 ha + let s : IdeleGroup K := + IdeleGroup.finitePlaceIdele v (a.2 v) + let b : IdeleGroup K := a * s⁻¹ + have hav : + a.2 v ∈ RayClass.localHigherUnitGroup v n := by + simpa [m', RayClass.Modulus.replaceFinitePart] using ha'.2 v + have hsH : q s ∈ H := by + apply hn + exact ⟨a.2 v, hav, rfl⟩ + have hbCong : b ∈ m.ideleCongruenceSubgroup := by + rw [RayClass.Modulus.mem_ideleCongruenceSubgroup_iff] + refine ⟨?_, ?_⟩ + · rw [RayClass.Modulus.mem_infiniteCongruenceSubgroup_iff_local] + intro w + have haw := + (RayClass.Modulus.mem_infiniteCongruenceSubgroup_iff_local + m' a.1).1 ha'.1 w + have hlocal : + m'.localInfiniteCongruenceSubgroup w = + m.localInfiniteCongruenceSubgroup w := by + simp [m'] + rw [hlocal] at haw + change IdeleGroup.infiniteComponent w b ∈ + m.localInfiniteCongruenceSubgroup w + dsimp only [b] + rw [map_mul, map_inv] + dsimp only [s] + rw [IdeleGroup.finitePlaceIdele_infiniteComponent, + inv_one, mul_one] + exact haw + · rw [RayClass.mem_finiteCongruenceSubgroup_iff] + intro w + by_cases hw : w = v + · subst w + change IdeleGroup.finiteComponent v b ∈ + RayClass.localHigherUnitGroup v (m.finitePart v) + dsimp only [b] + rw [map_mul, map_inv] + dsimp only [s] + rw [IdeleGroup.finitePlaceIdele_finiteComponent_same, + IdeleGroup.finiteComponent_apply, + mul_inv_cancel] + exact Subgroup.one_mem _ + · have haw := ha'.2 w + have hupdate : (m'.finitePart w) = m.finitePart w := by + simp [m', RayClass.Modulus.replaceFinitePart, hw] + rw [hupdate] at haw + change IdeleGroup.finiteComponent w b ∈ + RayClass.localHigherUnitGroup w (m.finitePart w) + dsimp only [b] + rw [map_mul, map_inv] + dsimp only [s] + rw [IdeleGroup.finitePlaceIdele_finiteComponent_of_ne + v w (a.2 v) hw, + inv_one, mul_one, + IdeleGroup.finiteComponent_apply] + exact haw + have hbH : q b ∈ H := by + apply hm + rw [RayClass.Modulus.congruenceSubgroup] + exact ⟨b, Subgroup.mem_sup_left hbCong, rfl⟩ + have hab : a = b * s := by + dsimp [b] + group + change q a ∈ H + rw [hab, map_mul] + exact H.mul_mem hbH hsH + · intro a ha + change q a ∈ H + have hqa : q a = 1 := + (QuotientGroup.eq_one_iff a).2 ha + rw [hqa] + exact H.one_mem + +namespace ConductorialSubgroup + +open scoped Classical in +/-- The narrow finite conductor exponent equals the independently defined +finite local conductor exponent at every finite place. -/ +theorem narrowFiniteConductorExponent_eq_narrowFiniteLocalConductorExponent + (H : ConductorialSubgroup K) + (v : HeightOneSpectrum (𝓞 K)) : + H.narrowFiniteConductorExponent v = + H.narrowFiniteLocalConductorExponent v := by + apply le_antisymm + · let m := H.chosenDefiningModulus + have hm : IsDefiningModulus H.1 m := + H.chosenDefiningModulus_spec + have hlocal : + RayClass.localHigherUnitClassSubgroup v + (H.narrowFiniteLocalConductorExponent v) ≤ H.1 := + H.narrowFiniteLocalConductorExponent_spec v + have hupdate : + IsDefiningModulus H.1 + (m.replaceFinitePart + (m.finitePart.update v + (H.narrowFiniteLocalConductorExponent v))) := + replaceFiniteExponent_definingModulus H.1 m hm v + (H.narrowFiniteLocalConductorExponent v) hlocal + have hle := + H.narrowFiniteConductorExponent_le hupdate v + simpa [m, RayClass.Modulus.replaceFinitePart] using hle + · obtain ⟨m, hm, hmv⟩ := + H.narrowFiniteConductorExponent_spec v + have hlocal : + RayClass.localHigherUnitClassSubgroup v (m.finitePart v) ≤ H.1 := + (RayClass.localHigherUnitClassSubgroup_le_congruenceSubgroup + m v).trans hm + exact (H.narrowFiniteLocalConductorExponent_le v hlocal).trans_eq hmv + +open scoped Classical in +/-- The exponent of the narrow finite conductor at every finite place is +its finite local conductor exponent. -/ +theorem narrowFiniteConductor_apply_eq_narrowFiniteLocalConductorExponent + (H : ConductorialSubgroup K) + (v : HeightOneSpectrum (𝓞 K)) : + H.narrowFiniteConductor v = + H.narrowFiniteLocalConductorExponent v := by + rw [H.narrowFiniteConductor_apply, + H.narrowFiniteConductorExponent_eq_narrowFiniteLocalConductorExponent v] + +open scoped Classical in +/-- A defining modulus can be chosen to agree with the narrow finite +conductor on any prescribed finite set of finite places and with the +fixed bounding modulus away from that set. -/ +theorem exists_definingModulus_finitePart_agrees_on_finset + (H : ConductorialSubgroup K) + (s : Finset (HeightOneSpectrum (𝓞 K))) : + ∃ m : RayClass.Modulus K, + IsDefiningModulus H.1 m ∧ + (∀ v ∈ s, m.finitePart v = H.narrowFiniteConductor v) ∧ + (∀ v ∉ s, m.finitePart v = H.narrowFiniteConductorBoundingModulus v) := by + classical + induction s using Finset.induction_on with + | empty => + refine + ⟨H.chosenDefiningModulus, + H.chosenDefiningModulus_spec, ?_, ?_⟩ + · intro v hv + simp at hv + · intro v _hv + rfl + | @insert v s hv ih => + obtain ⟨m, hm, hmOn, hmOff⟩ := ih + let m' : RayClass.Modulus K := + m.replaceFinitePart + (m.finitePart.update v (H.narrowFiniteConductor v)) + have hlocal : + RayClass.localHigherUnitClassSubgroup v + (H.narrowFiniteConductor v) ≤ H.1 := by + rw [H.narrowFiniteConductor_apply, + H.narrowFiniteConductorExponent_eq_narrowFiniteLocalConductorExponent v] + exact H.narrowFiniteLocalConductorExponent_spec v + have hm' : IsDefiningModulus H.1 m' := + replaceFiniteExponent_definingModulus H.1 m hm v + (H.narrowFiniteConductor v) hlocal + refine ⟨m', hm', ?_, ?_⟩ + · intro w hw + rcases Finset.mem_insert.mp hw with rfl | hws + · simp [m', RayClass.Modulus.replaceFinitePart] + · by_cases hwv : w = v + · subst w + simp [m', RayClass.Modulus.replaceFinitePart] + · simpa [m', RayClass.Modulus.replaceFinitePart, hwv] using hmOn w hws + · intro w hw + have hwv : w ≠ v := by + intro hwv + subst w + exact hw (Finset.mem_insert_self v s) + have hws : w ∉ s := by + intro hws + exact hw (Finset.mem_insert_of_mem hws) + simpa [m', RayClass.Modulus.replaceFinitePart, hwv] using hmOff w hws + +open scoped Classical in +/-- A defining full modulus can be chosen whose finite part is exactly the +narrow finite conductor. -/ +theorem exists_definingModulus_finitePart_eq_narrowFiniteConductor + (H : ConductorialSubgroup K) : + ∃ m : RayClass.Modulus K, + IsDefiningModulus H.1 m ∧ + m.finitePart = H.narrowFiniteConductor := by + classical + obtain ⟨m, hm, hmOn, hmOff⟩ := + H.exists_definingModulus_finitePart_agrees_on_finset + H.narrowFiniteConductorBoundingModulus.support + refine ⟨m, hm, ?_⟩ + ext v + by_cases hv : v ∈ H.narrowFiniteConductorBoundingModulus.support + · exact hmOn v hv + · have hbound : H.narrowFiniteConductorBoundingModulus v = 0 := by + exact Finsupp.notMem_support_iff.mp hv + have hmzero : m.finitePart v = 0 := + (hmOff v hv).trans hbound + have hfinite_le : + H.narrowFiniteConductor v ≤ + H.narrowFiniteConductorBoundingModulus v := by + simpa only [ConductorialSubgroup.narrowFiniteConductorBoundingModulus] using + H.narrowFiniteConductor_le H.chosenDefiningModulus_spec v + rw [hbound] at hfinite_le + have hfinite_zero : H.narrowFiniteConductor v = 0 := + Nat.eq_zero_of_le_zero hfinite_le + exact hmzero.trans hfinite_zero.symm + +open scoped Classical in +/-- The narrow finite conductor reverses inclusions of conductorial +subgroups. -/ +theorem narrowFiniteConductor_antitone + (H J : ConductorialSubgroup K) + (hHJ : H.1 ≤ J.1) : + J.narrowFiniteConductor ≤ H.narrowFiniteConductor := by + intro v + rw [J.narrowFiniteConductor_apply_eq_narrowFiniteLocalConductorExponent v, + H.narrowFiniteConductor_apply_eq_narrowFiniteLocalConductorExponent v] + apply J.narrowFiniteLocalConductorExponent_le v + exact (H.narrowFiniteLocalConductorExponent_spec v).trans hHJ + +end ConductorialSubgroup + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorPrimeArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorPrimeArtin.lean new file mode 100644 index 0000000000..2c0052f7d6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorPrimeArtin.lean @@ -0,0 +1,274 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorRayClassMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele +/-! +# Prime Artin classes at an exact narrow finite conductor + +For a conductorial idèle-class subgroup `H`, a normalized one-place prime +idèle determines compatible classes in the ray class group at +`H.narrowFiniteConductor`, in `C_K / H`, and—away from that finite +conductor—in the ideal Artin quotient. This file proves their +compatibility, order relations, and maximal ray-class criteria. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain IdeleGroup + +variable {K : Type} [Field K] [NumberField K] + +-- Keep quotient witnesses definitionally aligned with the imported +-- ideal-Artin construction and avoid repeating generic normality search. +attribute [local instance] + IdealClassFieldTheory.ideleClassSubgroupNormal + +/-- The class of a normalized one-place prime idèle in an arbitrary +idèle-class quotient. -/ +def subgroupQuotientPrimeClass + (H : Subgroup (IdeleClassGroup K)) + (v : HeightOneSpectrum (𝓞 K)) : + IdeleClassGroup K ⧸ H := + QuotientGroup.mk' H + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (finitePrimeIdele v)) + +namespace ConductorialSubgroup + +/-- The ray class of a normalized one-place prime idèle at the exact +narrow finite conductor of `H`. -/ +def narrowFiniteConductorRayPrimeClass + (H : ConductorialSubgroup K) + (v : HeightOneSpectrum (𝓞 K)) : + RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor) := + QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor)) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (finitePrimeIdele v)) + +/-- The exact narrow finite conductor ray-class map sends the ray prime +class to the corresponding class in `C_K / H`. -/ +@[simp] +theorem narrowFiniteConductorRayClassGroupToQuotient_rayPrimeClass + (H : ConductorialSubgroup K) + (v : HeightOneSpectrum (𝓞 K)) : + H.narrowFiniteConductorRayClassGroupToQuotient + (H.narrowFiniteConductorRayPrimeClass v) = + subgroupQuotientPrimeClass H.1 v := + rfl + +/-- Under maximal exact narrow finite conductor cardinality, the canonical +ray-class equivalence sends the ray prime class to its class in `C_K / H`. +-/ +@[simp] +theorem narrowFiniteConductorRayClassGroupEquivQuotientOfCardEq_rayPrimeClass + (H : ConductorialSubgroup K) + (hcard : + Nat.card (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor)) = + Nat.card (IdeleClassGroup K ⧸ H.1)) + (v : HeightOneSpectrum (𝓞 K)) : + H.narrowFiniteConductorRayClassGroupEquivQuotientOfCardEq + hcard + (H.narrowFiniteConductorRayPrimeClass v) = + subgroupQuotientPrimeClass H.1 v := + rfl + +/-- Away from the exact narrow finite conductor of `H`, the ideal Artin +Frobenius class equals the normalized prime idèle class in `C_K / H`. -/ +theorem narrowFiniteConductorIdealFrobeniusClass_eq_quotientPrimeClass + (H : ConductorialSubgroup K) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ H.narrowFiniteConductor.support) : + IdealClassFieldTheory.idealFrobeniusClass + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor) H.1 + H.narrowFiniteConductor_isDefiningModulus + v hv = + subgroupQuotientPrimeClass H.1 v := by + let m : RayClass.Modulus K := + RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor + let hm : RayClass.Modulus.congruenceSubgroup m ≤ H.1 := + H.narrowFiniteConductor_isDefiningModulus + let a : RayClass.idelePrimeToModulusSubgroup m := + ⟨finitePrimeIdele v, + finitePrimeIdele_mem_idelePrimeToModulusSubgroup + m v hv⟩ + have hIdeal : + RayClass.primeToIdealMap m a = + RayClass.primeToModulusIdeal m v hv := + primeToIdealMap_finitePrimeIdele m v hv + have hArtin : + IdealClassFieldTheory.idealArtinMap m H.1 hm + (RayClass.primeToIdealMap m a) = + QuotientGroup.mk' H.1 + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (a : IdeleGroup K)) := + idealArtinMap_primeToIdealMap m H.1 hm a + change + IdealClassFieldTheory.idealArtinMap m H.1 hm + (RayClass.primeToModulusIdeal m v hv) = + QuotientGroup.mk' H.1 + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (finitePrimeIdele v)) + calc + _ = IdealClassFieldTheory.idealArtinMap m H.1 hm + (RayClass.primeToIdealMap m a) := + congrArg + (IdealClassFieldTheory.idealArtinMap m H.1 hm) + hIdeal.symm + _ = QuotientGroup.mk' H.1 + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (a : IdeleGroup K)) := hArtin + _ = QuotientGroup.mk' H.1 + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (finitePrimeIdele v)) := rfl + +/-- Triviality of the prime class in `C_K / H` is equivalent to +membership of its prime ideal in the ideal Artin kernel. -/ +theorem subgroupQuotientPrimeClass_eq_one_iff_primeIdeal_mem_idealArtinKernel + (H : ConductorialSubgroup K) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ H.narrowFiniteConductor.support) : + subgroupQuotientPrimeClass H.1 v = 1 ↔ + RayClass.primeToModulusIdeal + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor) + v hv ∈ + IdealClassFieldTheory.idealArtinKernel + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor) H.1 + H.narrowFiniteConductor_isDefiningModulus := by + rw [← H.narrowFiniteConductorIdealFrobeniusClass_eq_quotientPrimeClass v hv] + rfl + +/-- The order of the prime class in `C_K / H` is the order of its prime +ideal modulo the ideal Artin kernel. -/ +theorem orderOf_subgroupQuotientPrimeClass_eq_orderOf_idealArtinPrimeClass + (H : ConductorialSubgroup K) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ H.narrowFiniteConductor.support) : + orderOf (subgroupQuotientPrimeClass H.1 v) = + orderOf + (QuotientGroup.mk' + (IdealClassFieldTheory.idealArtinKernel + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor) H.1 + H.narrowFiniteConductor_isDefiningModulus) + (RayClass.primeToModulusIdeal + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor) + v hv)) := by + rw [← H.narrowFiniteConductorIdealFrobeniusClass_eq_quotientPrimeClass v hv] + exact + IdealClassFieldTheory.orderOf_idealFrobeniusClass + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor) H.1 + H.narrowFiniteConductor_isDefiningModulus + v hv + +/-- The order of the prime class in `C_K / H` divides the order of its +lift to the exact narrow finite conductor ray class group. -/ +theorem orderOf_subgroupQuotientPrimeClass_dvd_orderOf_narrowFiniteConductorRayPrimeClass + (H : ConductorialSubgroup K) + (v : HeightOneSpectrum (𝓞 K)) : + orderOf (subgroupQuotientPrimeClass H.1 v) ∣ + orderOf (H.narrowFiniteConductorRayPrimeClass v) := by + rw [← H.narrowFiniteConductorRayClassGroupToQuotient_rayPrimeClass v] + exact + orderOf_map_dvd H.narrowFiniteConductorRayClassGroupToQuotient + (H.narrowFiniteConductorRayPrimeClass v) + +/-- Under maximal exact narrow finite conductor ray-class cardinality, +triviality of the ray prime class is equivalent to triviality of its class +in `C_K / H`. -/ +theorem narrowFiniteConductorRayPrimeClass_eq_one_iff_quotientPrimeClass_eq_one + (H : ConductorialSubgroup K) + (hcard : + Nat.card (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor)) = + Nat.card (IdeleClassGroup K ⧸ H.1)) + (v : HeightOneSpectrum (𝓞 K)) : + H.narrowFiniteConductorRayPrimeClass v = 1 ↔ + subgroupQuotientPrimeClass H.1 v = 1 := by + let f := H.narrowFiniteConductorRayClassGroupToQuotient + have hfInjective : Function.Injective f := + H.narrowFiniteConductorRayClassGroupToQuotient_injective_iff_card_eq.2 + hcard + constructor + · intro hprime + calc + subgroupQuotientPrimeClass H.1 v = + f (H.narrowFiniteConductorRayPrimeClass v) := by + rw [H.narrowFiniteConductorRayClassGroupToQuotient_rayPrimeClass] + _ = f 1 := congrArg f hprime + _ = 1 := map_one f + · intro hquotient + apply hfInjective + rw [H.narrowFiniteConductorRayClassGroupToQuotient_rayPrimeClass, + hquotient, map_one] + +/-- Under maximal exact narrow finite conductor ray-class cardinality, the +ray prime class and its image in `C_K / H` have the same order. -/ +theorem orderOf_narrowFiniteConductorRayPrimeClass_eq_orderOf_quotientPrimeClass + (H : ConductorialSubgroup K) + (hcard : + Nat.card (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor)) = + Nat.card (IdeleClassGroup K ⧸ H.1)) + (v : HeightOneSpectrum (𝓞 K)) : + orderOf (H.narrowFiniteConductorRayPrimeClass v) = + orderOf (subgroupQuotientPrimeClass H.1 v) := by + let f := H.narrowFiniteConductorRayClassGroupToQuotient + have hfInjective : Function.Injective f := + H.narrowFiniteConductorRayClassGroupToQuotient_injective_iff_card_eq.2 + hcard + have horder := + orderOf_injective f hfInjective + (H.narrowFiniteConductorRayPrimeClass v) + rw [H.narrowFiniteConductorRayClassGroupToQuotient_rayPrimeClass v] at horder + exact horder.symm + +/-- Under maximal exact narrow finite conductor ray-class cardinality, +triviality of the ray prime class is equivalent to membership of the +corresponding prime ideal in the ideal Artin kernel. -/ +theorem narrowFiniteConductorRayPrimeClass_eq_one_iff_primeIdeal_mem_idealArtinKernel + (H : ConductorialSubgroup K) + (hcard : + Nat.card (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor)) = + Nat.card (IdeleClassGroup K ⧸ H.1)) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ H.narrowFiniteConductor.support) : + H.narrowFiniteConductorRayPrimeClass v = 1 ↔ + RayClass.primeToModulusIdeal + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor) + v hv ∈ + IdealClassFieldTheory.idealArtinKernel + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor) H.1 + H.narrowFiniteConductor_isDefiningModulus := by + rw [H.narrowFiniteConductorRayPrimeClass_eq_one_iff_quotientPrimeClass_eq_one + hcard v, + H.subgroupQuotientPrimeClass_eq_one_iff_primeIdeal_mem_idealArtinKernel v hv] + +end ConductorialSubgroup + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorRayClassMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorRayClassMaximality.lean new file mode 100644 index 0000000000..286e345227 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorRayClassMaximality.lean @@ -0,0 +1,358 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLattice +/-! +# Exact narrow finite conductor ray-class presentations + +For a conductorial subgroup `H` of the idèle class group, the ray class +group at its exact narrow finite conductor maps canonically onto `C_K / H`. +This file characterizes injectivity of that map by equality of the two +finite orders and proves uniqueness of subgroups whose exact narrow finite +conductor ray-class presentations are maximal. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField + +variable {K : Type} [Field K] [NumberField K] + +/-- Fix the canonical commutative structure used to infer normality of +subgroups of the idèle class group in this module. -/ +local instance + conductorRayClassMaximality_ideleClassGroupIsMulCommutative : + IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +namespace ConductorialSubgroup + +/-- The canonical quotient map from the ray class group at the exact +narrow finite conductor of `H` onto `C_K / H`. -/ +noncomputable def narrowFiniteConductorRayClassGroupToQuotient + (H : ConductorialSubgroup K) : + RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor) →* + IdeleClassGroup K ⧸ H.1 := + QuotientGroup.map + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor)) + H.1 + (MonoidHom.id _) + (show + RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor) ≤ + Subgroup.comap (MonoidHom.id _) H.1 from by + intro x hx + change x ∈ H.1 + exact H.narrowFiniteConductor_isDefiningModulus hx) + +/-- The exact narrow finite conductor quotient map preserves every +idèle-class representative. -/ +theorem narrowFiniteConductorRayClassGroupToQuotient_mk + (H : ConductorialSubgroup K) + (c : IdeleClassGroup K) : + H.narrowFiniteConductorRayClassGroupToQuotient + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor)) c) = + QuotientGroup.mk' H.1 c := + rfl + +/-- The exact narrow finite conductor ray-class map onto `C_K / H` is +surjective. -/ +theorem narrowFiniteConductorRayClassGroupToQuotient_surjective + (H : ConductorialSubgroup K) : + Function.Surjective H.narrowFiniteConductorRayClassGroupToQuotient := by + intro q + obtain ⟨c, rfl⟩ := + QuotientGroup.mk'_surjective H.1 q + exact + ⟨QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor)) c, + rfl⟩ + +/-- The kernel of the exact narrow finite conductor ray-class map is the +image of `H` modulo the conductor congruence subgroup. -/ +theorem narrowFiniteConductorRayClassGroupToQuotient_ker + (H : ConductorialSubgroup K) : + MonoidHom.ker H.narrowFiniteConductorRayClassGroupToQuotient = + Subgroup.map + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor))) + H.1 := by + unfold narrowFiniteConductorRayClassGroupToQuotient + let N := + RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor) + let M := H.1 + change + (QuotientGroup.map N M (MonoidHom.id (IdeleClassGroup K)) _).ker = + Subgroup.map (QuotientGroup.mk' N) M + simpa only [Subgroup.comap_id] using + (QuotientGroup.ker_map (N := N) M + (MonoidHom.id (IdeleClassGroup K)) + (show N ≤ Subgroup.comap (MonoidHom.id (IdeleClassGroup K)) M from + fun _ hx => H.narrowFiniteConductor_isDefiningModulus hx)) + +/-- Quotienting the exact narrow finite conductor ray class group by the +image of `H` recovers `C_K / H`. -/ +noncomputable def + narrowFiniteConductorRayClassSubgroupQuotientEquivIdeleClassQuotient + (H : ConductorialSubgroup K) : + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor) ⧸ + Subgroup.map + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor))) + H.1) ≃* + IdeleClassGroup K ⧸ H.1 := + (QuotientGroup.quotientMulEquivOfEq + H.narrowFiniteConductorRayClassGroupToQuotient_ker.symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + H.narrowFiniteConductorRayClassGroupToQuotient + H.narrowFiniteConductorRayClassGroupToQuotient_surjective) + +/-- The exact narrow finite conductor ray class number factors as the +order of the image of `H` modulo conductor congruence times the order of +`C_K / H`. -/ +theorem + narrowFiniteConductorRayClassGroup_card_eq_subgroupImage_card_mul_quotient_card + (H : ConductorialSubgroup K) : + Nat.card (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor)) = + Nat.card + (Subgroup.map + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor))) + H.1) * + Nat.card (IdeleClassGroup K ⧸ H.1) := by + let f := H.narrowFiniteConductorRayClassGroupToQuotient + have hf : Function.Surjective f := + H.narrowFiniteConductorRayClassGroupToQuotient_surjective + calc + Nat.card (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor)) = + Nat.card (MonoidHom.ker f) * + (MonoidHom.ker f).index := + (Subgroup.card_mul_index (MonoidHom.ker f)).symm + _ = Nat.card (MonoidHom.ker f) * Nat.card f.range := by + rw [Subgroup.index_ker f] + _ = Nat.card (MonoidHom.ker f) * + Nat.card (IdeleClassGroup K ⧸ H.1) := by + rw [f.range_eq_top_of_surjective hf, Subgroup.card_top] + _ = + Nat.card + (Subgroup.map + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor))) + H.1) * + Nat.card (IdeleClassGroup K ⧸ H.1) := by + rw [H.narrowFiniteConductorRayClassGroupToQuotient_ker] + +/-- The order of `C_K / H` divides the ray class number at the exact +narrow finite conductor of `H`. -/ +theorem ideleClassQuotient_card_dvd_narrowFiniteConductorRayClassGroup_card + (H : ConductorialSubgroup K) : + Nat.card (IdeleClassGroup K ⧸ H.1) ∣ + Nat.card (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor)) := by + simpa only [Subgroup.index_eq_card] using + Subgroup.index_dvd_of_le H.narrowFiniteConductor_isDefiningModulus + +/-- The exact narrow finite conductor ray-class map is injective exactly +when its finite source and target have the same order. -/ +theorem narrowFiniteConductorRayClassGroupToQuotient_injective_iff_card_eq + (H : ConductorialSubgroup K) : + Function.Injective H.narrowFiniteConductorRayClassGroupToQuotient ↔ + Nat.card (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor)) = + Nat.card (IdeleClassGroup K ⧸ H.1) := by + let f := H.narrowFiniteConductorRayClassGroupToQuotient + have hfSurjective : Function.Surjective f := + H.narrowFiniteConductorRayClassGroupToQuotient_surjective + constructor + · intro hfInjective + exact + Nat.card_congr + (Equiv.ofBijective f + ⟨hfInjective, hfSurjective⟩) + · intro hcard + exact + (hfSurjective.bijective_of_nat_card_le hcard.le).1 + +/-- When the exact narrow finite conductor ray class group and `C_K / H` +have the same order, the canonical quotient map is a multiplicative +equivalence. -/ +noncomputable def narrowFiniteConductorRayClassGroupEquivQuotientOfCardEq + (H : ConductorialSubgroup K) + (hcard : + Nat.card (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor)) = + Nat.card (IdeleClassGroup K ⧸ H.1)) : + RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor) ≃* + IdeleClassGroup K ⧸ H.1 := + MulEquiv.ofBijective + H.narrowFiniteConductorRayClassGroupToQuotient + ⟨H.narrowFiniteConductorRayClassGroupToQuotient_injective_iff_card_eq.2 + hcard, + H.narrowFiniteConductorRayClassGroupToQuotient_surjective⟩ + +/-- The maximal exact narrow finite conductor equivalence preserves every +idèle-class representative. -/ +theorem narrowFiniteConductorRayClassGroupEquivQuotientOfCardEq_mk + (H : ConductorialSubgroup K) + (hcard : + Nat.card (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor)) = + Nat.card (IdeleClassGroup K ⧸ H.1)) + (c : IdeleClassGroup K) : + H.narrowFiniteConductorRayClassGroupEquivQuotientOfCardEq + hcard + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor)) c) = + QuotientGroup.mk' H.1 c := + rfl + +/-- A conductorial subgroup is exactly the congruence subgroup at its +narrow finite conductor precisely when its quotient has the full exact +narrow finite conductor ray class number. -/ +theorem + subgroup_eq_conductorCongruenceSubgroup_iff_rayClass_card_eq_quotient_card + (H : ConductorialSubgroup K) : + H.1 = RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor) ↔ + Nat.card (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor)) = + Nat.card (IdeleClassGroup K ⧸ H.1) := by + constructor + · intro hH + calc + Nat.card (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor)) = + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor)).index := + (Subgroup.index_eq_card _).symm + _ = H.1.index := by + rw [← hH] + _ = Nat.card (IdeleClassGroup K ⧸ H.1) := + Subgroup.index_eq_card H.1 + · intro hcard + let f := H.narrowFiniteConductorRayClassGroupToQuotient + have hfInjective : Function.Injective f := + H.narrowFiniteConductorRayClassGroupToQuotient_injective_iff_card_eq.2 + hcard + apply le_antisymm + · intro c hc + have hfc : + f + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor)) c) = + 1 := by + change QuotientGroup.mk' H.1 c = 1 + exact (QuotientGroup.eq_one_iff _).2 hc + have hcOne : + QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor)) c = + 1 := + hfInjective (hfc.trans (map_one f).symm) + exact (QuotientGroup.eq_one_iff _).1 hcOne + · exact H.narrowFiniteConductor_isDefiningModulus + +/-- Conductorial subgroups with the same exact narrow finite conductor +and maximal exact-conductor ray-class presentations have equal underlying +subgroups. -/ +theorem + subgroups_eq_of_narrowFiniteConductors_eq_of_rayClassGroup_cards_eq_quotient_cards + (H J : ConductorialSubgroup K) + (hconductor : H.narrowFiniteConductor = J.narrowFiniteConductor) + (hHcard : + Nat.card (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor)) = + Nat.card (IdeleClassGroup K ⧸ H.1)) + (hJcard : + Nat.card (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite J.narrowFiniteConductor)) = + Nat.card (IdeleClassGroup K ⧸ J.1)) : + H.1 = J.1 := by + calc + H.1 = RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor) := + H.subgroup_eq_conductorCongruenceSubgroup_iff_rayClass_card_eq_quotient_card.2 + hHcard + _ = RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite J.narrowFiniteConductor) := + congrArg + (fun f => RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite f)) + hconductor + _ = J.1 := + (J.subgroup_eq_conductorCongruenceSubgroup_iff_rayClass_card_eq_quotient_card.2 + hJcard).symm + +/-- The quotients by two maximal exact narrow finite conductor subgroups +with the same conductor are canonically equivalent. -/ +def ideleClassQuotientEquivOfNarrowFiniteConductorsEqOfRayClassGroupCardsEqQuotientCards + (H J : ConductorialSubgroup K) + (hconductor : H.narrowFiniteConductor = J.narrowFiniteConductor) + (hHcard : + Nat.card (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor)) = + Nat.card (IdeleClassGroup K ⧸ H.1)) + (hJcard : + Nat.card (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite J.narrowFiniteConductor)) = + Nat.card (IdeleClassGroup K ⧸ J.1)) : + (IdeleClassGroup K ⧸ H.1) ≃* + (IdeleClassGroup K ⧸ J.1) := + QuotientGroup.quotientMulEquivOfEq + (H.subgroups_eq_of_narrowFiniteConductors_eq_of_rayClassGroup_cards_eq_quotient_cards + J hconductor hHcard hJcard) + +/-- The canonical equivalence between maximal exact narrow finite +conductor quotients preserves every idèle-class representative. -/ +theorem + ideleClassQuotientEquivOfNarrowFiniteConductorsEqOfRayClassGroupCardsEqQuotientCards_mk + (H J : ConductorialSubgroup K) + (hconductor : H.narrowFiniteConductor = J.narrowFiniteConductor) + (hHcard : + Nat.card (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor)) = + Nat.card (IdeleClassGroup K ⧸ H.1)) + (hJcard : + Nat.card (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite J.narrowFiniteConductor)) = + Nat.card (IdeleClassGroup K ⧸ J.1)) + (c : IdeleClassGroup K) : + H.ideleClassQuotientEquivOfNarrowFiniteConductorsEqOfRayClassGroupCardsEqQuotientCards + J hconductor hHcard hJcard + (QuotientGroup.mk' H.1 c) = + QuotientGroup.mk' J.1 c := + rfl + +end ConductorialSubgroup + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorSupport.lean new file mode 100644 index 0000000000..b228f6a126 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorSupport.lean @@ -0,0 +1,137 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLocalComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace +/-! +# Support of the narrow finite conductor + +There are two source statements in the ramification criterion: + +* a prime belongs to the support of the narrow finite conductor exactly + when its one-place finite local conductor exponent is nonzero; +* a finite abelian local extension is ramified exactly when its concrete + local conductor exponent is nonzero. + +The local conductor criterion itself is public in +`LocalClassFieldTheory.Finite.UnramifiedConductor`. The global +reciprocity identity `N(C_L) ∩ K_vˣ = N(L_vˣ)` identifies the two +exponents for a global extension, yielding the global conductor-support +corollary. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain + +variable {K : Type} [Field K] [NumberField K] + +namespace ConductorialSubgroup + +/-- A finite prime divides the narrow finite conductor exactly when its +finite local conductor exponent is nonzero. -/ +theorem mem_narrowFiniteConductor_support_iff_narrowFiniteLocalConductorExponent_ne_zero + (H : ConductorialSubgroup K) + (v : HeightOneSpectrum (𝓞 K)) : + v ∈ H.narrowFiniteConductor.support ↔ + H.narrowFiniteLocalConductorExponent v ≠ 0 := by + rw [Finsupp.mem_support_iff, + H.narrowFiniteConductor_apply_eq_narrowFiniteLocalConductorExponent v] + +/-- A finite prime divides the narrow finite conductor exactly when its full +integral-unit class subgroup is not contained in the defining subgroup. -/ +theorem + mem_narrowFiniteConductor_support_iff_not_localHigherUnitClassSubgroup_zero_le + (H : ConductorialSubgroup K) + (v : HeightOneSpectrum (𝓞 K)) : + v ∈ H.narrowFiniteConductor.support ↔ + ¬ RayClass.localHigherUnitClassSubgroup v 0 ≤ H.1 := by + rw [H.mem_narrowFiniteConductor_support_iff_narrowFiniteLocalConductorExponent_ne_zero + v, + ne_eq, + H.narrowFiniteLocalConductorExponent_eq_zero_iff v] + +end ConductorialSubgroup + +/-- At an unramified chosen completion, the zeroth local higher-unit +class subgroup consists of global idele-class norms. -/ +theorem localHigherUnitClassSubgroup_zero_le_ideleClassNorm_range_of_chosenUnramified + {L : Type} + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + RayClass.localHigherUnitClassSubgroup v 0 ≤ + (_root_.ideleClassNorm K L).range := by + rintro _ ⟨x, hx, rfl⟩ + apply + Reciprocity.finitePlaceIdeleClass_mem_ideleClassNorm_range_of_mem_chosenLocalNorm + (K := K) (L := L) v x + apply + _root_.adicCompletionIntegerUnits_le_chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v hunram + rw [← RayClass.localHigherUnitGroup_zero] + exact hx + +/-- Algebraic unramifiedness at a finite prime forces the zeroth local +higher-unit class subgroup into the global norm subgroup. -/ +theorem localHigherUnitClassSubgroup_zero_le_ideleClassNorm_range_of_isUnramifiedAt + {L : Type} + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + Algebra.IsUnramifiedAt (𝓞 K) + (_root_.finitePlaceExtensionCentre + (K := K) (L := L) v + (_root_.chosenFinitePlaceExtension (L := L) v)).asIdeal) : + RayClass.localHigherUnitClassSubgroup v 0 ≤ + (_root_.ideleClassNorm K L).range := + localHigherUnitClassSubgroup_zero_le_ideleClassNorm_range_of_chosenUnramified + (K := K) (L := L) v + (_root_.chosenFinitePlaceIsUnramified_of_isUnramifiedAt + (K := K) (L := L) v hunram) + +/-- Complete splitting at a finite prime puts the whole one-place idele +class image inside the global norm subgroup. -/ +theorem finitePlaceIdeleClass_range_le_ideleClassNorm_range_of_splitsCompletely + {L : Type} + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (v : HeightOneSpectrum (𝓞 K)) + (hsplit : + _root_.FinitePlaceSplitsCompletely + (K := K) (L := L) v) : + (IdeleGroup.finitePlaceIdeleClass v).range ≤ + (_root_.ideleClassNorm K L).range := by + rintro _ ⟨x, rfl⟩ + apply + Reciprocity.finitePlaceIdeleClass_mem_ideleClassNorm_range_of_mem_chosenLocalNorm + (K := K) (L := L) v x + rw [ + _root_.chosenFinitePlaceLocalNormSubgroup_eq_top_of_splitsCompletely + (K := K) (L := L) v hsplit] + exact Subgroup.mem_top x + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicConductorUniqueness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicConductorUniqueness.lean new file mode 100644 index 0000000000..714e8e7c3f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicConductorUniqueness.lean @@ -0,0 +1,233 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicRayClassMaximality +/-! +# Uniqueness of maximal cyclic norm subgroups at a narrow finite conductor + +Two finite cyclic extensions whose exact narrow finite conductors agree and +whose degrees exhaust the corresponding ray class number determine the same +actual idèle-class norm subgroup. Thus their concrete norm quotients are +canonically equivalent. This is the norm-subgroup uniqueness part of the +cyclic class-field correspondence at a fixed narrow finite conductor. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField + +private theorem cyclicConductorUniquenessIdeleClassIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] cyclicConductorUniquenessIdeleClassIsMulCommutative + +variable + {K L M : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [Field M] [NumberField M] [Algebra K M] + [FiniteDimensional K L] [IsGalois K L] + [FiniteDimensional K M] [IsGalois K M] + [IsCyclic (L ≃ₐ[K] L)] + [IsCyclic (M ≃ₐ[K] M)] + +/-- Maximal cyclic extensions with the same exact narrow finite conductor +have the same actual idèle-class norm subgroup. -/ +theorem + cyclicIdeleClassNorm_ranges_eq_of_conductors_eq_of_rayClassGroup_cards_eq_extensionDegrees + (hconductor : + ideleClassNormNarrowFiniteConductor (K := K) (L := L) = + ideleClassNormNarrowFiniteConductor (K := K) (L := M)) + (hLcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)))) = + Module.finrank K L) + (hMcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := M)))) = + Module.finrank K M) : + (_root_.ideleClassNorm K L).range = + (_root_.ideleClassNorm K M).range := by + calc + (_root_.ideleClassNorm K L).range = + RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) := + (ideleClassNorm_range_eq_congruenceSubgroup_iff_rayClassGroup_card_eq_extensionDegree + (K := K) (L := L)).2 hLcard + _ = + RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := M))) := + congrArg + (fun f => RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite f)) + hconductor + _ = (_root_.ideleClassNorm K M).range := + ((ideleClassNorm_range_eq_congruenceSubgroup_iff_rayClassGroup_card_eq_extensionDegree + (K := K) (L := M)).2 hMcard).symm + +/-- The actual norm quotients of two maximal cyclic extensions with the +same exact narrow finite conductor are canonically equivalent. -/ +def cyclicNormQuotientEquivOfNarrowFiniteConductorsEqOfRayClassGroupCardsEqExtensionDegrees + (hconductor : + ideleClassNormNarrowFiniteConductor (K := K) (L := L) = + ideleClassNormNarrowFiniteConductor (K := K) (L := M)) + (hLcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)))) = + Module.finrank K L) + (hMcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := M)))) = + Module.finrank K M) : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≃* + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K M).range) := + QuotientGroup.quotientMulEquivOfEq + (cyclicIdeleClassNorm_ranges_eq_of_conductors_eq_of_rayClassGroup_cards_eq_extensionDegrees + (K := K) (L := L) (M := M) + hconductor hLcard hMcard) + +/-- The canonical equivalence between the two maximal cyclic norm quotients +preserves every idèle-class representative. -/ +theorem + cyclicNormQuotientEquivOfNarrowFiniteConductorsEqOfRayClassGroupCardsEqExtensionDegrees_mk + (hconductor : + ideleClassNormNarrowFiniteConductor (K := K) (L := L) = + ideleClassNormNarrowFiniteConductor (K := K) (L := M)) + (hLcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)))) = + Module.finrank K L) + (hMcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := M)))) = + Module.finrank K M) + (c : IdeleClassGroup K) : + cyclicNormQuotientEquivOfNarrowFiniteConductorsEqOfRayClassGroupCardsEqExtensionDegrees + (K := K) (L := L) (M := M) + hconductor hLcard hMcard + (QuotientGroup.mk' + ((_root_.ideleClassNorm K L).range) c) = + QuotientGroup.mk' + ((_root_.ideleClassNorm K M).range) c := + rfl + +/-- If two nested cyclic extensions have the same exact narrow finite +conductor and both exhaust its ray class group, then the upper extension +has relative degree one. Thus a maximal cyclic class field at a fixed +narrow finite conductor has no proper nested cyclic overextension with the +same conductor. -/ +theorem + nestedMaximalCyclicExtensions_sameNarrowFiniteConductor_relativeDegree_eq_one + [Algebra M L] [IsScalarTower K M L] + [FiniteDimensional M L] + (hconductor : + ideleClassNormNarrowFiniteConductor (K := K) (L := L) = + ideleClassNormNarrowFiniteConductor (K := K) (L := M)) + (hLcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)))) = + Module.finrank K L) + (hMcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := M)))) = + Module.finrank K M) : + Module.finrank M L = 1 := by + have hnorm : + (_root_.ideleClassNorm K L).range = + (_root_.ideleClassNorm K M).range := + cyclicIdeleClassNorm_ranges_eq_of_conductors_eq_of_rayClassGroup_cards_eq_extensionDegrees + (K := K) (L := L) (M := M) + hconductor hLcard hMcard + have hdegree : + Module.finrank K L = Module.finrank K M := by + calc + Module.finrank K L = + (_root_.ideleClassNorm K L).range.index := + (ClassFieldAxiom.ideleClassNorm_index_eq_finrank_cyclic + K L).symm + _ = (_root_.ideleClassNorm K M).range.index := + congrArg + (fun H : Subgroup (IdeleClassGroup K) => H.index) + hnorm + _ = Module.finrank K M := + ClassFieldAxiom.ideleClassNorm_index_eq_finrank_cyclic K M + have hmul : + Module.finrank K M * Module.finrank M L = + Module.finrank K M := by + calc + Module.finrank K M * Module.finrank M L = + Module.finrank K L := + Module.finrank_mul_finrank K M L + _ = Module.finrank K M := hdegree + apply + Nat.mul_left_cancel + (show 0 < Module.finrank K M from Module.finrank_pos) + simpa only [mul_one] using hmul + +/-- A proper nested cyclic overextension cannot remain maximal at the +same exact narrow finite conductor. Hence maximal cyclic class fields in a +proper tower have distinct narrow finite conductors. -/ +theorem + nestedMaximalCyclicExtensions_narrowFiniteConductors_ne_of_relativeDegree_ne_one + [Algebra M L] [IsScalarTower K M L] + [FiniteDimensional M L] + (hLcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)))) = + Module.finrank K L) + (hMcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := M)))) = + Module.finrank K M) + (hrelativeDegree : + Module.finrank M L ≠ 1) : + ideleClassNormNarrowFiniteConductor (K := K) (L := L) ≠ + ideleClassNormNarrowFiniteConductor (K := K) (L := M) := by + intro hconductor + exact + hrelativeDegree + (nestedMaximalCyclicExtensions_sameNarrowFiniteConductor_relativeDegree_eq_one + (K := K) (L := L) (M := M) + hconductor hLcard hMcard) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormConductor.lean new file mode 100644 index 0000000000..c61717ded4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormConductor.lean @@ -0,0 +1,82 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex +/-! +# Narrow finite conductors of cyclic class-norm subgroups + +For a finite cyclic extension, the actual idele-class norm quotient has +order equal to the extension degree. Substituting this norm-index +theorem into the narrow finite conductor ray-class factorization identifies +the ray class number at the exact narrow finite conductor as the product of the +residual norm-subgroup image order and the extension degree. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [IsCyclic (L ≃ₐ[K] L)] + +/-- For a finite cyclic extension, the ray class number at the exact +narrow finite norm conductor is the order of the norm-subgroup image modulo +the conductor congruence subgroup times the extension degree. -/ +theorem + narrowFiniteConductorRayClassGroup_card_eq_normSubgroupImage_card_mul_extensionDegree : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)))) = + Nat.card + (Subgroup.map + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L))))) + ((_root_.ideleClassNorm K L).range)) * + Module.finrank K L := by + simpa only [ + ← Subgroup.index_eq_card, + ClassFieldAxiom.ideleClassNorm_index_eq_finrank_cyclic K L] using + narrowFiniteConductorRayClassGroup_card_eq_normSubgroupImage_card_mul_normQuotient_card + (K := K) (L := L) + +/-- The degree of a finite cyclic extension divides the ray class +number at the exact narrow finite conductor of its idèle-class norm +subgroup. -/ +theorem cyclicExtensionDegree_dvd_narrowFiniteConductorRayClassGroup_card : + Module.finrank K L ∣ + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)))) := by + simpa only [ + ← Subgroup.index_eq_card, + ClassFieldAxiom.ideleClassNorm_index_eq_finrank_cyclic K L] using + ideleClassNormQuotient_card_dvd_narrowFiniteConductorRayClassGroup_card + (K := K) (L := L) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormTower.lean new file mode 100644 index 0000000000..4c31c15633 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormTower.lean @@ -0,0 +1,242 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex +/-! +# Exact norm quotients in a cyclic tower + +For a tower of cyclic Galois extensions, the first map in the concrete +idele-class norm-quotient sequence is injective. Together with the +already available right exactness, this gives the short exact norm +sequence and its exact cardinal factorization. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField +open RelativeIdeleGroup.Cohomology + +private theorem cyclicNormTower_relativeClassGroupIsMulCommutative + (A B : Type) [Field A] [NumberField A] [Field B] [Algebra A B] : + IsMulCommutative (RelativeIdeleGroup.ClassGroup A B) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] cyclicNormTower_relativeClassGroupIsMulCommutative + +private theorem cyclicNormTower_ideleClassGroupIsMulCommutative + (A : Type) [Field A] [NumberField A] : + IsMulCommutative (IdeleClassGroup A) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] cyclicNormTower_ideleClassGroupIsMulCommutative + +variable + (K M L : Type) + [Field K] [NumberField K] + [Field M] [NumberField M] + [Field L] [NumberField L] + [Algebra K M] [Algebra M L] [Algebra K L] + [IsScalarTower K M L] + [FiniteDimensional K M] [FiniteDimensional M L] + [IsGalois K M] [IsGalois M L] [IsGalois K L] + [IsCyclic (M ≃ₐ[K] M)] + [IsCyclic (L ≃ₐ[M] L)] + [IsCyclic (L ≃ₐ[K] L)] + +/-- In a cyclic Galois tower, the norm-induced map + +`C_M / N_{L/M} C_L → C_K / N_{L/K} C_L` + +is injective. -/ +theorem intermediateToCompositeNormQuotient_injective_of_cyclicTower : + Function.Injective + (intermediateToCompositeNormQuotient K M L) := by + let A := IntermediateClassNormQuotient K M L + let B := TowerCompositeClassNormQuotient K M L + let C := IdeleClassNormQuotient K M + let f : A →* B := + intermediateToCompositeNormQuotient K M L + let g : B →* C := + compositeToBaseNormQuotient K M L + have hA : + Nat.card A = Module.finrank M L := by + calc + Nat.card A = + Nat.card (IdeleClassNormQuotient M L) := + Nat.card_congr + (intermediateClassNormQuotientBaseChangeMulEquiv + K M L).toEquiv + _ = + (RelativeIdeleGroup.Cohomology.ideleClassNorm + M L).range.index := by + rw [Subgroup.index_eq_card] + _ = Module.finrank M L := + GlobalClassFieldTheory.ClassFieldAxiom.relativeIdeleClassNorm_index_eq_finrank_cyclic + M L + have hB : + Nat.card B = Module.finrank K L := by + calc + Nat.card B = + Nat.card (IdeleClassNormQuotient K L) := + Nat.card_congr + (towerCompositeClassNormQuotientEquiv + K M L).toEquiv + _ = + (RelativeIdeleGroup.Cohomology.ideleClassNorm + K L).range.index := by + rw [Subgroup.index_eq_card] + _ = Module.finrank K L := + GlobalClassFieldTheory.ClassFieldAxiom.relativeIdeleClassNorm_index_eq_finrank_cyclic + K L + have hC : + Nat.card C = Module.finrank K M := by + calc + Nat.card C = + (RelativeIdeleGroup.Cohomology.ideleClassNorm + K M).range.index := by + rw [Subgroup.index_eq_card] + _ = Module.finrank K M := + GlobalClassFieldTheory.ClassFieldAxiom.relativeIdeleClassNorm_index_eq_finrank_cyclic + K M + let : Finite A := + Nat.finite_of_card_ne_zero (by + rw [hA] + exact Nat.ne_of_gt Module.finrank_pos) + let : Finite B := + Nat.finite_of_card_ne_zero (by + rw [hB] + exact Nat.ne_of_gt Module.finrank_pos) + let : Finite C := + Nat.finite_of_card_ne_zero (by + rw [hC] + exact Nat.ne_of_gt Module.finrank_pos) + have hgSurjective : Function.Surjective g := + compositeToBaseNormQuotient_surjective K M L + have hquotient : + Nat.card (B ⧸ g.ker) = Nat.card C := + Nat.card_congr + (QuotientGroup.quotientKerEquivOfSurjective + g hgSurjective).toEquiv + have hfactor : + Nat.card B = + Nat.card C * Nat.card f.range := by + calc + Nat.card B = + Nat.card (B ⧸ g.ker) * + Nat.card g.ker := + Subgroup.card_eq_card_quotient_mul_card_subgroup + g.ker + _ = Nat.card C * Nat.card f.range := by + rw [hquotient] + change + Nat.card C * + Nat.card (compositeToBaseNormQuotient K M L).ker = + Nat.card C * + Nat.card (intermediateToCompositeNormQuotient K M L).range + rw [← intermediateToCompositeNormQuotient_range_eq_ker K M L] + have hmul : + Module.finrank K M * Nat.card f.range = + Module.finrank K M * Module.finrank M L := by + calc + Module.finrank K M * Nat.card f.range = + Nat.card C * Nat.card f.range := by + rw [hC] + _ = Nat.card B := hfactor.symm + _ = Module.finrank K L := hB + _ = + Module.finrank K M * Module.finrank M L := + (Module.finrank_mul_finrank K M L).symm + have hRangeDegree : + Nat.card f.range = Module.finrank M L := + Nat.mul_left_cancel Module.finrank_pos hmul + have hRangeCard : + Nat.card f.range = Nat.card A := + hRangeDegree.trans hA.symm + have hfRangeBijective : + Function.Bijective f.rangeRestrict := + f.rangeRestrict_surjective.bijective_of_nat_card_le + hRangeCard.symm.le + intro x y hxy + apply hfRangeBijective.1 + apply Subtype.ext + exact hxy + +/-- The concrete norm-quotient sequence of a cyclic Galois tower is +short exact: its first map is injective, its middle image is the final +kernel, and its last map is surjective. -/ +theorem cyclicTowerNormQuotient_shortExact : + Function.Injective + (intermediateToCompositeNormQuotient K M L) ∧ + MonoidHom.range + (intermediateToCompositeNormQuotient K M L) = + MonoidHom.ker + (compositeToBaseNormQuotient K M L) ∧ + Function.Surjective + (compositeToBaseNormQuotient K M L) := by + exact + ⟨intermediateToCompositeNormQuotient_injective_of_cyclicTower + K M L, + intermediateToCompositeNormQuotient_range_eq_ker + K M L, + compositeToBaseNormQuotient_surjective K M L⟩ + +/-- Orders in the cyclic tower norm sequence multiply exactly. -/ +theorem cyclicTowerNormQuotient_card_eq_mul : + Nat.card (TowerCompositeClassNormQuotient K M L) = + Nat.card (IntermediateClassNormQuotient K M L) * + Nat.card (IdeleClassNormQuotient K M) := by + calc + Nat.card (TowerCompositeClassNormQuotient K M L) = + Nat.card (IdeleClassNormQuotient K L) := + Nat.card_congr + (towerCompositeClassNormQuotientEquiv + K M L).toEquiv + _ = + (RelativeIdeleGroup.Cohomology.ideleClassNorm + K L).range.index := by + rw [Subgroup.index_eq_card] + _ = Module.finrank K L := + GlobalClassFieldTheory.ClassFieldAxiom.relativeIdeleClassNorm_index_eq_finrank_cyclic + K L + _ = + Module.finrank K M * Module.finrank M L := + (Module.finrank_mul_finrank K M L).symm + _ = + Nat.card (IdeleClassNormQuotient K M) * + Nat.card (IdeleClassNormQuotient M L) := by + rw [← + GlobalClassFieldTheory.ClassFieldAxiom.relativeIdeleClassNorm_index_eq_finrank_cyclic + K M, + ← + GlobalClassFieldTheory.ClassFieldAxiom.relativeIdeleClassNorm_index_eq_finrank_cyclic + M L, + Subgroup.index_eq_card, + Subgroup.index_eq_card] + _ = + Nat.card (IdeleClassNormQuotient M L) * + Nat.card (IdeleClassNormQuotient K M) := by + rw [Nat.mul_comm] + _ = + Nat.card (IntermediateClassNormQuotient K M L) * + Nat.card (IdeleClassNormQuotient K M) := by + rw [Nat.card_congr + (intermediateClassNormQuotientBaseChangeMulEquiv + K M L).toEquiv] + rfl + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicRayClassMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicRayClassMaximality.lean new file mode 100644 index 0000000000..dd466c7b1c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicRayClassMaximality.lean @@ -0,0 +1,124 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormRayClassMaximality +/-! +# Maximal cyclic quotients at the narrow finite conductor + +For a finite cyclic extension, the actual idèle-class norm quotient has +order equal to the extension degree. The ray class group at the exact +narrow finite conductor surjects onto this norm quotient. This file +identifies the case in which that surjection is an isomorphism: precisely +when the ray class number already equals the extension degree. + +Equivalently, the actual norm subgroup is then exactly the ray congruence +subgroup at its narrow finite conductor. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField + +/-- The canonical idèle-class multiplication makes every subgroup normal. -/ +private theorem cyclicRayClassMaximalityClassGroupIsMulCommutative + (F : Type) [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + IsMulCommutative.of_comm (fun a b => mul_comm a b) + +attribute [local instance] cyclicRayClassMaximalityClassGroupIsMulCommutative + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [IsCyclic (L ≃ₐ[K] L)] + +/-- The actual idèle-class norm subgroup of a finite cyclic extension is +the congruence subgroup at its exact narrow finite conductor precisely when +the corresponding ray class number equals the extension degree. -/ +theorem + ideleClassNorm_range_eq_congruenceSubgroup_iff_rayClassGroup_card_eq_extensionDegree : + (_root_.ideleClassNorm K L).range = + RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) ↔ + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)))) = + Module.finrank K L := by + simpa only [ + ← Subgroup.index_eq_card, + ClassFieldAxiom.ideleClassNorm_index_eq_finrank_cyclic K L] using + (ideleClassNorm_range_eq_congruenceSubgroup_iff_rayClassGroup_card_eq_normQuotient_card + (K := K) (L := L)) + +/-- The canonical map from the ray class group at the exact narrow finite +norm conductor to the actual norm quotient is injective precisely when the +ray class number equals the extension degree. -/ +theorem + rayClassToNormQuotient_injective_iff_card_eq_extensionDegree : + Function.Injective + (narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient + (K := K) (L := L)) ↔ + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)))) = + Module.finrank K L := by + simpa only [ + ← Subgroup.index_eq_card, + ClassFieldAxiom.ideleClassNorm_index_eq_finrank_cyclic K L] using + (rayClassToNormQuotient_injective_iff_card_eq_normQuotient_card + (K := K) (L := L)) + +/-- When the ray class number at the exact narrow finite norm conductor +equals the degree of a finite cyclic extension, its actual norm quotient is +canonically the full ray class group at that conductor. -/ +def cyclicNormQuotientEquivNarrowFiniteConductorRayClassGroup + (hcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)))) = + Module.finrank K L) : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≃* + RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) := + normQuotientEquivNarrowFiniteConductorRayClassGroup + (K := K) (L := L) <| by + calc + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)))) = + Module.finrank K L := + hcard + _ = ((_root_.ideleClassNorm K L).range).index := + (ClassFieldAxiom.ideleClassNorm_index_eq_finrank_cyclic + K L).symm + _ = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + Subgroup.index_eq_card ((_root_.ideleClassNorm K L).range) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclotomicKummerNormDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclotomicKummerNormDescent.lean new file mode 100644 index 0000000000..e119aeba51 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclotomicKummerNormDescent.lean @@ -0,0 +1,529 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.KummerNormDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm +public import Mathlib.NumberTheory.Cyclotomic.Basic +/-! +# Cyclotomic descent for full S-unit Kummer norms + +This file implements the roots-of-unity descent in the existence proof of +global class field theory. Starting from a finite seed of finite places of +`K`, it enlarges the seed just enough that its full inverse image in +`CyclotomicField n K` is a chosen Kummer norm support. Thus the full +S-unit Kummer extension over the cyclotomic field has its concrete norm +subgroup described by Kummer theory, while the support is still exactly a +full inverse image and hence descends through the cyclotomic norm. + +The final normal-closure step turns the resulting finite extension of `K` +into a genuine finite Galois extension without enlarging its norm subgroup. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain +open KummerTheory + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open GlobalClassFieldTheory.ClassFieldAxiom + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +local instance cyclotomicKummerNormDescent_neZero + (n : ℕ+) : NeZero (n : ℕ) := + ⟨n.ne_zero⟩ + +attribute [local instance] cyclotomicKummerNormDescent_neZero + +open scoped Classical in +noncomputable local instance + cyclotomicKummerNormDescent_cyclotomicFiniteDimensional + (n : ℕ+) : + FiniteDimensional K (CyclotomicField (n : ℕ) K) := + IsCyclotomicExtension.finiteDimensional + {(n : ℕ)} K (CyclotomicField (n : ℕ) K) + +attribute [local instance] cyclotomicKummerNormDescent_cyclotomicFiniteDimensional + +open scoped Classical in +noncomputable local instance + cyclotomicKummerNormDescent_cyclotomicIsGalois + (n : ℕ+) : + IsGalois K (CyclotomicField (n : ℕ) K) := + IsCyclotomicExtension.isGalois + {(n : ℕ)} K (CyclotomicField (n : ℕ) K) + +attribute [local instance] cyclotomicKummerNormDescent_cyclotomicIsGalois + +open scoped Classical in +private theorem cyclotomicKummerNormDescent_primitiveRoots_nonempty + (n : ℕ+) : + (primitiveRoots (n : ℕ) + (CyclotomicField (n : ℕ) K)).Nonempty := by + obtain ⟨ζ, hζ⟩ := + (CyclotomicField.isCyclotomicExtension (n : ℕ) K).exists_isPrimitiveRoot + (Set.mem_singleton (n : ℕ)) n.ne_zero + exact ⟨ζ, (mem_primitiveRoots n.pos).2 hζ⟩ + +open scoped Classical in +private theorem cyclotomicKummerNormDescent_natCast_ne_zero + (n : ℕ+) : + ((n : ℕ) : CyclotomicField (n : ℕ) K) ≠ 0 := by + exact Nat.cast_ne_zero.mpr n.ne_zero + +open scoped Classical in +/-- A finite support on `K` whose full inverse image in +`CyclotomicField n K` contains the chosen Kummer norm support upstairs. + +The construction first forms the chosen support above the prescribed +seed and then adds the places below it. Taking all places above this enlarged +base support saturates every fibre without losing the largeness and exponent +support required by the full S-unit Kummer calculation. -/ +noncomputable def cyclotomicKummerNormSupport + (n : ℕ+) + (seed : Finset (HeightOneSpectrum (𝓞 K))) : + Finset (HeightOneSpectrum (𝓞 K)) := by + classical + let C := CyclotomicField (n : ℕ) K + let seedAbove := + finitePlacesAbove (K := K) (L := C) seed + let canonicalAbove := + sUnitKummerNormSupport (K := C) n seedAbove + exact seed ∪ canonicalAbove.image + (fun W => finitePlaceBelow (K := K) W) + +open scoped Classical in +/-- The prescribed finite seed is contained in its cyclotomic Kummer norm +support. -/ +theorem subset_cyclotomicKummerNormSupport + (n : ℕ+) + (seed : Finset (HeightOneSpectrum (𝓞 K))) : + seed ⊆ cyclotomicKummerNormSupport (K := K) n seed := by + classical + intro v hv + simp only [cyclotomicKummerNormSupport] + exact Finset.mem_union_left _ hv + +open scoped Classical in +/-- All finite places of the cyclotomic field above the enlarged base +support. This is the fibre-saturated support used by norm descent. -/ +noncomputable def cyclotomicKummerNormSupportAbove + (n : ℕ+) + (seed : Finset (HeightOneSpectrum (𝓞 K))) : + Finset + (HeightOneSpectrum + (𝓞 (CyclotomicField (n : ℕ) K))) := by + let C := CyclotomicField (n : ℕ) K + exact finitePlacesAbove (K := K) (L := C) + (cyclotomicKummerNormSupport (K := K) n seed) + +open scoped Classical in +/-- Membership in the upstairs support is exactly membership of the place +below in the enlarged base support. -/ +@[simp] +theorem mem_cyclotomicKummerNormSupportAbove_iff + (n : ℕ+) + (seed : Finset (HeightOneSpectrum (𝓞 K))) + (W : + HeightOneSpectrum + (𝓞 (CyclotomicField (n : ℕ) K))) : + W ∈ cyclotomicKummerNormSupportAbove (K := K) n seed ↔ + finitePlaceBelow (K := K) W ∈ + cyclotomicKummerNormSupport (K := K) n seed := by + let C := CyclotomicField (n : ℕ) K + simpa only [cyclotomicKummerNormSupportAbove] using + (mem_finitePlacesAbove_iff + (K := K) (L := C) + (cyclotomicKummerNormSupport (K := K) n seed) W) + +open scoped Classical in +/-- The fibre-saturated support upstairs is already fixed by the chosen +Kummer-support enlargement. -/ +theorem sUnitKummerNormSupport_cyclotomicKummerNormSupportAbove + (n : ℕ+) + (seed : Finset (HeightOneSpectrum (𝓞 K))) : + sUnitKummerNormSupport + (K := CyclotomicField (n : ℕ) K) n + (cyclotomicKummerNormSupportAbove (K := K) n seed) = + cyclotomicKummerNormSupportAbove (K := K) n seed := by + classical + let C := CyclotomicField (n : ℕ) K + let seedAbove := + finitePlacesAbove (K := K) (L := C) seed + let canonicalAbove := + sUnitKummerNormSupport (K := C) n seedAbove + let baseSupport := + cyclotomicKummerNormSupport (K := K) n seed + let saturatedAbove := + cyclotomicKummerNormSupportAbove (K := K) n seed + have hcanonical : + canonicalAbove ⊆ saturatedAbove := by + intro W hW + rw [show saturatedAbove = + finitePlacesAbove (K := K) (L := C) baseSupport by + rfl] + rw [mem_finitePlacesAbove_iff] + change finitePlaceBelow (K := K) W ∈ + seed ∪ canonicalAbove.image + (fun V => finitePlaceBelow (K := K) V) + exact Finset.mem_union_right _ + (Finset.mem_image.mpr ⟨W, hW, rfl⟩) + apply Finset.Subset.antisymm + · intro W hW + have hW' : + (W ∈ saturatedAbove ∨ + W ∈ IdeleGroup.sufficientlyLargeFiniteSet (K := C)) ∨ + W ∈ chosenUnitFiniteSupport + (K := C) + (Units.mk0 ((n : ℕ) : C) + (cyclotomicKummerNormDescent_natCast_ne_zero + (K := K) n)) := by + simpa only [sUnitKummerNormSupport, Finset.mem_union] using hW + rcases hW' with (hWsat | hWlarge) | hWexp + · exact hWsat + · apply hcanonical + simp only [canonicalAbove, sUnitKummerNormSupport, + Finset.mem_union] + exact Or.inl (Or.inr hWlarge) + · apply hcanonical + simp only [canonicalAbove, sUnitKummerNormSupport, + Finset.mem_union] + exact Or.inr hWexp + · exact subset_sUnitKummerNormSupport + (K := C) n saturatedAbove + +open scoped Classical in +/-- Enlarging a support by the cyclotomic Kummer requirements is +idempotent. In particular, downstream neighbourhood arguments may choose a +support containing these requirements from the outset without a second +change of support. -/ +@[simp] +theorem cyclotomicKummerNormSupport_idem + (n : ℕ+) + (seed : Finset (HeightOneSpectrum (𝓞 K))) : + cyclotomicKummerNormSupport (K := K) n + (cyclotomicKummerNormSupport (K := K) n seed) = + cyclotomicKummerNormSupport (K := K) n seed := by + classical + let C := CyclotomicField (n : ℕ) K + let S := cyclotomicKummerNormSupport (K := K) n seed + let SAbove := + cyclotomicKummerNormSupportAbove (K := K) n seed + have hstable : + sUnitKummerNormSupport (K := C) n SAbove = SAbove := by + simpa only [C, SAbove] using + sUnitKummerNormSupport_cyclotomicKummerNormSupportAbove + (K := K) n seed + apply Finset.Subset.antisymm + · intro v hv + change v ∈ + S ∪ + (sUnitKummerNormSupport (K := C) n SAbove).image + (fun W => finitePlaceBelow (K := K) W) at hv + rcases Finset.mem_union.mp hv with hvS | hvAbove + · exact hvS + · rw [hstable] at hvAbove + obtain ⟨W, hW, rfl⟩ := Finset.mem_image.mp hvAbove + exact + (mem_cyclotomicKummerNormSupportAbove_iff + (K := K) n seed W).mp hW + · exact subset_cyclotomicKummerNormSupport (K := K) n S + +open scoped Classical in +/-- The actual full S-unit Kummer extension over the cyclotomic base, +formed inside its fixed separable closure and using the chosen enlargement +of the fibre-saturated support above `K`. The preceding stability theorem +shows that this enlargement is equal to the fibre-saturated support; retaining +it in the definition keeps the extension definitionally aligned with the +exact Kummer norm-realization theorem. -/ +noncomputable abbrev cyclotomicFullSUnitKummerExtension + (n : ℕ+) + (seed : Finset (HeightOneSpectrum (𝓞 K))) : + IntermediateField + (CyclotomicField (n : ℕ) K) + (SeparableClosure (CyclotomicField (n : ℕ) K)) := + KummerTheory.fullSUnitKummerExtension + (K := CyclotomicField (n : ℕ) K) + (Omega := SeparableClosure (CyclotomicField (n : ℕ) K)) + n (sUnitKummerNormSupport + (K := CyclotomicField (n : ℕ) K) n + (cyclotomicKummerNormSupportAbove (K := K) n seed)) + +open scoped Classical in +/-- The cyclotomic full S-unit Kummer extension is Galois over the +cyclotomic base. -/ +theorem cyclotomicFullSUnitKummerExtension_isGalois + (n : ℕ+) + (seed : Finset (HeightOneSpectrum (𝓞 K))) : + IsGalois + (CyclotomicField (n : ℕ) K) + (cyclotomicFullSUnitKummerExtension (K := K) n seed) := by + simpa only [cyclotomicFullSUnitKummerExtension] using + (KummerTheory.fullSUnitKummerExtension_isGalois + (K := CyclotomicField (n : ℕ) K) + (Omega := SeparableClosure (CyclotomicField (n : ℕ) K)) + n (sUnitKummerNormSupport + (K := CyclotomicField (n : ℕ) K) n + (cyclotomicKummerNormSupportAbove (K := K) n seed))) + +open scoped Classical in +/-- The cyclotomic full S-unit Kummer extension is finite over the +cyclotomic base. -/ +theorem cyclotomicFullSUnitKummerExtension_finiteDimensional + (n : ℕ+) + (seed : Finset (HeightOneSpectrum (𝓞 K))) : + FiniteDimensional + (CyclotomicField (n : ℕ) K) + (cyclotomicFullSUnitKummerExtension (K := K) n seed) := by + let C := CyclotomicField (n : ℕ) K + have hmu : (primitiveRoots (n : ℕ) C).Nonempty := + cyclotomicKummerNormDescent_primitiveRoots_nonempty + (K := K) n + have hnC : ((n : ℕ) : C) ≠ 0 := + cyclotomicKummerNormDescent_natCast_ne_zero + (K := K) n + simpa only [C, cyclotomicFullSUnitKummerExtension] using + (KummerTheory.fullSUnitKummerExtension_finiteDimensional + (K := C) (Omega := SeparableClosure C) + n hnC hmu + (sUnitKummerNormSupport (K := C) n + (cyclotomicKummerNormSupportAbove (K := K) n seed))) + +open scoped Classical in +noncomputable local instance + cyclotomicKummerNormDescent_kummerFiniteDimensional + (n : ℕ+) + (seed : Finset (HeightOneSpectrum (𝓞 K))) : + FiniteDimensional + (CyclotomicField (n : ℕ) K) + (cyclotomicFullSUnitKummerExtension (K := K) n seed) := + cyclotomicFullSUnitKummerExtension_finiteDimensional + (K := K) n seed + +attribute [local instance] cyclotomicKummerNormDescent_kummerFiniteDimensional + +open scoped Classical in +/-- The Kummer layer is a number field via its finite extension of the +cyclotomic number field. This is deliberately a named, non-instance boundary: +downstream base-tower instances must not make every `NumberField` search unfold +the full S-unit Kummer construction. -/ +private theorem cyclotomicKummerNormDescent_kummerNumberField + (n : ℕ+) + (seed : Finset (HeightOneSpectrum (𝓞 K))) : + NumberField + (cyclotomicFullSUnitKummerExtension (K := K) n seed) := + NumberField.of_module_finite + (CyclotomicField (n : ℕ) K) + (cyclotomicFullSUnitKummerExtension (K := K) n seed) + +open scoped Classical in +/-- The expensive Kummer norm computation over the cyclotomic base, isolated +before the `K`-to-Kummer-field instance tower is introduced. -/ +private theorem + cyclotomicFullSUnitKummerExtension_cyclotomicNormRange + (n : ℕ+) + (hn : 1 < (n : ℕ)) + (seed : Finset (HeightOneSpectrum (𝓞 K))) : + let C := CyclotomicField (n : ℕ) K + let S' := cyclotomicKummerNormSupportAbove (K := K) n seed + let E := cyclotomicFullSUnitKummerExtension (K := K) n seed + letI : NumberField E := + cyclotomicKummerNormDescent_kummerNumberField (K := K) n seed + (_root_.ideleClassNorm C E).range = + ideleClassPowerLocalUnitSubgroup (K := C) n S' ∅ := by + classical + dsimp only + let C := CyclotomicField (n : ℕ) K + let S' := cyclotomicKummerNormSupportAbove (K := K) n seed + let E := cyclotomicFullSUnitKummerExtension (K := K) n seed + let : NumberField E := + cyclotomicKummerNormDescent_kummerNumberField (K := K) n seed + have hmu : (primitiveRoots (n : ℕ) C).Nonempty := + cyclotomicKummerNormDescent_primitiveRoots_nonempty + (K := K) n + have hstable : + sUnitKummerNormSupport (K := C) n S' = S' := by + simpa only [C, S'] using + sUnitKummerNormSupport_cyclotomicKummerNormSupportAbove + (K := K) n seed + have hNormCanonical : + (_root_.ideleClassNorm C E).range = + ideleClassPowerLocalUnitSubgroup (K := C) n + (sUnitKummerNormSupport (K := C) n S') ∅ := by + simpa only [C, S', E, cyclotomicFullSUnitKummerExtension] using + (fullSUnitKummerExtension_ideleClassNormRange_eq_powerLocalUnit + (K := C) (Omega := SeparableClosure C) + n hn hmu S') + exact hNormCanonical.trans + (congrArg + (fun T => ideleClassPowerLocalUnitSubgroup (K := C) n T ∅) + hstable) + +open scoped Classical in +/-- The cyclotomic S-unit Kummer extension is an algebra over the original base field. -/ +@[reducible] +noncomputable local instance + cyclotomicKummerNormDescentKummerAlgebraOverBase + (n : ℕ+) + (seed : Finset (HeightOneSpectrum (𝓞 K))) : + Algebra K + (cyclotomicFullSUnitKummerExtension (K := K) n seed) := + ((algebraMap + (CyclotomicField (n : ℕ) K) + (cyclotomicFullSUnitKummerExtension (K := K) n seed)).comp + (algebraMap K (CyclotomicField (n : ℕ) K))).toAlgebra + +attribute [local instance] cyclotomicKummerNormDescentKummerAlgebraOverBase + +open scoped Classical in +@[reducible] +private noncomputable def + cyclotomicKummerNormDescent_kummerSMulOverBase + (n : ℕ+) + (seed : Finset (HeightOneSpectrum (𝓞 K))) : + SMul K + (cyclotomicFullSUnitKummerExtension (K := K) n seed) := + Algebra.toSMul + (self := cyclotomicKummerNormDescentKummerAlgebraOverBase + (K := K) n seed) + +open scoped Classical in +@[reducible] +private noncomputable def + cyclotomicKummerNormDescent_kummerModuleOverBase + (n : ℕ+) + (seed : Finset (HeightOneSpectrum (𝓞 K))) : + Module K + (cyclotomicFullSUnitKummerExtension (K := K) n seed) := + Algebra.toModule + +open scoped Classical in +private theorem + cyclotomicKummerNormDescent_kummerScalarTower + (n : ℕ+) + (seed : Finset (HeightOneSpectrum (𝓞 K))) : + IsScalarTower K + (CyclotomicField (n : ℕ) K) + (cyclotomicFullSUnitKummerExtension (K := K) n seed) := + IsScalarTower.of_algebraMap_eq' rfl + +open scoped Classical in +noncomputable local instance + cyclotomicKummerNormDescent_kummerFiniteDimensionalOverBase + (n : ℕ+) + (seed : Finset (HeightOneSpectrum (𝓞 K))) : + FiniteDimensional K + (cyclotomicFullSUnitKummerExtension (K := K) n seed) := + by + let : IsScalarTower K + (CyclotomicField (n : ℕ) K) + (cyclotomicFullSUnitKummerExtension (K := K) n seed) := + cyclotomicKummerNormDescent_kummerScalarTower (K := K) n seed + exact FiniteDimensional.trans K + (CyclotomicField (n : ℕ) K) + (cyclotomicFullSUnitKummerExtension (K := K) n seed) + +attribute [local instance] cyclotomicKummerNormDescent_kummerFiniteDimensionalOverBase + +open scoped Classical in +/-- The norm range of the actual cyclotomic full S-unit Kummer extension, +viewed as a finite extension of `K`, lies in the power-local-unit subgroup +on the enlarged base support. This is the pointwise tower-norm step in the +roots-of-unity descent. -/ +theorem + cyclotomicFullSUnitKummerExtension_ideleClassNormRange_le_powerLocalUnit + (n : ℕ+) + (hn : 1 < (n : ℕ)) + (seed : Finset (HeightOneSpectrum (𝓞 K))) : + let E := cyclotomicFullSUnitKummerExtension (K := K) n seed + letI : NumberField E := + cyclotomicKummerNormDescent_kummerNumberField (K := K) n seed + (_root_.ideleClassNorm K E).range ≤ + ideleClassPowerLocalUnitSubgroup + (K := K) n + (cyclotomicKummerNormSupport (K := K) n seed) ∅ := by + classical + dsimp only + let C := CyclotomicField (n : ℕ) K + let S := cyclotomicKummerNormSupport (K := K) n seed + let S' := cyclotomicKummerNormSupportAbove (K := K) n seed + let E := cyclotomicFullSUnitKummerExtension (K := K) n seed + let : IsScalarTower K C E := + cyclotomicKummerNormDescent_kummerScalarTower (K := K) n seed + let : NumberField E := + cyclotomicKummerNormDescent_kummerNumberField (K := K) n seed + have hNormC : + (_root_.ideleClassNorm C E).range = + ideleClassPowerLocalUnitSubgroup (K := C) n S' ∅ := + cyclotomicFullSUnitKummerExtension_cyclotomicNormRange + (K := K) n hn seed + have hSupport : + ∀ W : HeightOneSpectrum (𝓞 C), + W ∈ S' ↔ finitePlaceBelow (K := K) W ∈ S := by + intro W + simpa only [C, S, S'] using + (mem_cyclotomicKummerNormSupportAbove_iff + (K := K) n seed W) + rintro _ ⟨c, rfl⟩ + rw [← ordinaryIdeleClassNorm_tower + (K := K) (M := C) (L := E) c] + apply + (ideleClassNorm_map_powerLocalUnitSubgroup_le_of_supports_above + (K := K) (L := C) n S S' hSupport) + refine ⟨_root_.ideleClassNorm C E c, ?_, rfl⟩ + rw [← hNormC] + exact ⟨c, rfl⟩ + +open scoped Classical in +/-- Passing to the finite normal closure produces an actual finite Galois +extension of `K` whose norm range is still contained in the prescribed +power-local-unit subgroup. This is the finite Galois norm neighbourhood +constructed in the roots-of-unity-free case. -/ +theorem + cyclotomicFullSUnitKummerFiniteNormalClosure_ideleClassNormRange_le_powerLocalUnit + (n : ℕ+) + (hn : 1 < (n : ℕ)) + (seed : Finset (HeightOneSpectrum (𝓞 K))) : + let E := cyclotomicFullSUnitKummerExtension (K := K) n seed + letI : NumberField E := + cyclotomicKummerNormDescent_kummerNumberField (K := K) n seed + let F := finiteNormalClosure K E + (_root_.ideleClassNorm K F).range ≤ + ideleClassPowerLocalUnitSubgroup + (K := K) n + (cyclotomicKummerNormSupport (K := K) n seed) ∅ := by + classical + dsimp only + let E := cyclotomicFullSUnitKummerExtension (K := K) n seed + let : NumberField E := + cyclotomicKummerNormDescent_kummerNumberField (K := K) n seed + let F := finiteNormalClosure K E + calc + (_root_.ideleClassNorm K F).range ≤ + (_root_.ideleClassNorm K E).range := by + simpa only [F] using + (finiteNormalClosure_ideleClassNorm_range_le_source + (K := K) (L := E)) + _ ≤ ideleClassPowerLocalUnitSubgroup + (K := K) n + (cyclotomicKummerNormSupport (K := K) n seed) ∅ := by + simpa only [E] using + (cyclotomicFullSUnitKummerExtension_ideleClassNormRange_le_powerLocalUnit + (K := K) n hn seed) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/EmbeddedAbelianSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/EmbeddedAbelianSubextension.lean new file mode 100644 index 0000000000..94e8587a23 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/EmbeddedAbelianSubextension.lean @@ -0,0 +1,88 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueNaturality +public import Mathlib.FieldTheory.Galois.Abelian +/-! +# Embedded finite abelian subextensions + +An embedding of an actual finite abelian extension into the rational +separable closure determines a finite abelian subextension of the fixing +subgroup of the embedded base field. This file also allows that base fixing +subgroup to be replaced by a propositionally equal selected subgroup, as is +needed by concrete class-field realizations. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open ClassFormation +open Reciprocity + +/-- An actual finite abelian extension embedded in the rational separable +closure, represented as a finite abelian subextension of a selected base +subgroup equal to the fixing subgroup of the embedded base field. -/ +noncomputable def numberFieldEmbeddedAbelianSubextension + (K E : Type) + [Field K] [NumberField K] + [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] + [IsAbelianGalois K E] + (j : E →ₐ[ℚ] SeparableClosure ℚ) + (B : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hbase : numberFieldEmbeddedBaseSubgroup K E j = B) : + FiniteAbelianSubextension B := by + subst B + exact + { toFiniteGaloisExtension := + numberFieldEmbeddedFiniteGaloisSubextension K E j + commutative := by + let e : + (numberFieldEmbeddedFiniteGaloisSubextension K E j).extensionQuotient ≃* + Gal(E/K) := by + exact + numberFieldEmbeddedExtensionQuotientEquivGaloisGroup + K E j + exact + { is_comm.comm := fun x y => by + apply e.injective + simpa only [map_mul] using + (inferInstance : + IsMulCommutative + (Gal(E/K))).is_comm.comm + (e x) (e y) } } + +/-- The top subgroup of the embedded abelian subextension is the fixing +subgroup of the embedded top field. -/ +@[simp] +theorem numberFieldEmbeddedAbelianSubextension_field + (K E : Type) + [Field K] [NumberField K] + [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] + [IsAbelianGalois K E] + (j : E →ₐ[ℚ] SeparableClosure ℚ) + (B : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hbase : numberFieldEmbeddedBaseSubgroup K E j = B) : + (numberFieldEmbeddedAbelianSubextension K E j B hbase).field = + numberFieldEmbeddedTopSubgroup K E j := by + subst B + rfl + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldContainment.lean new file mode 100644 index 0000000000..b4f0f7a203 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldContainment.lean @@ -0,0 +1,854 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Evaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.GlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.EmbeddedAbelianSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormTowerConductor +/-! +# Containment of finite abelian class fields + +For actual finite abelian extensions of a number field, containment is +exactly reverse containment of their genuine idèle-class norm ranges. + +The proof first realizes an arbitrary extension in the same rational +separable closure as the class field selected by a closed finite-index +subgroup. The abstract finite-abelian classification then gives a +literal inclusion of fixing subgroups, which restricts the chosen +ambient embedding to an actual algebra embedding into the selected +class field. Applying this construction to the norm range of a second +extension yields the intrinsic containment criterion over the original +number field. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open ClassFormation +open LocalClassFieldTheory +open NumberField +open RamificationTheory +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +private theorem subgroup_map_toAddSubgroup_mulEquiv_eq + {G G₂ : Type*} [Group G] [Group G₂] + (S : Subgroup G) (T : Subgroup G₂) (e : G ≃* G₂) + (hmap : S.map e.toMonoidHom = T) : + T.toAddSubgroup = + S.toAddSubgroup.map + (MulEquiv.toAdditive e).toAddMonoidHom := by + rw [← hmap] + exact (MonoidHom.coe_toAdditive_map e.toMonoidHom S).symm + +open scoped Classical in +private theorem subgroup_toAddSubgroup_map_mono_mulEquiv + {G G₂ : Type*} [Group G] [Group G₂] + (S T : Subgroup G) (e : G ≃* G₂) + (h : S ≤ T) : + S.toAddSubgroup.map + (MulEquiv.toAdditive e).toAddMonoidHom ≤ + T.toAddSubgroup.map + (MulEquiv.toAdditive e).toAddMonoidHom := + AddSubgroup.map_mono h + +open scoped Classical in +/-- The distinguished embedding of the original number field into the +rational separable closure underlying the class field selected by +`H`. -/ +noncomputable def closedFiniteIndexClassFieldBaseEmbedding + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + K →ₐ[ℚ] SeparableClosure ℚ := + numberFieldTowerLowerEmbedding K + (closedFiniteIndexClassFieldNormAmbient + (K := K) H hclosed) + +open scoped Classical in +/-- The canonical fixed-field equivalence has the distinguished base +embedding as its underlying map into the rational separable closure. -/ +@[simp] +theorem closedFiniteIndexClassFieldBaseEquiv_coe + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] + (x : K) : + ((closedFiniteIndexClassFieldBaseEquiv + (K := K) H hclosed x : + closedFiniteIndexClassFieldBase + (K := K) H hclosed) : + SeparableClosure ℚ) = + closedFiniteIndexClassFieldBaseEmbedding + (K := K) H hclosed x := by + rfl + +open scoped Classical in +private noncomputable def + finiteAbelianClassFieldContainmentIdeleClassEquiv + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + IdeleClassGroup K ≃* + IdeleClassGroup + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) := + ideleClassCongr + (closedFiniteIndexClassFieldBaseEquiv + (K := K) H hclosed) + +open scoped Classical in +/-- An actual finite extension of `K`, embedded into the rational +separable closure compatibly with the selected class-field copy of +`K`. -/ +noncomputable def closedFiniteIndexClassFieldCompatibleEmbedding + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] + (E : Type) [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] : + E →ₐ[ℚ] SeparableClosure ℚ := + Classical.choose + (IsAlgClosed.surjective_domRestrict_of_isAlgebraic + (K := ℚ) (L := K) (E := E) + (M := SeparableClosure ℚ) + (closedFiniteIndexClassFieldBaseEmbedding + (K := K) H hclosed)) + +open scoped Classical in +/-- The compatible top embedding restricts to the distinguished +embedding of the original base field. -/ +@[simp] +theorem + closedFiniteIndexClassFieldCompatibleEmbedding_restrictDomain + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] + (E : Type) [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] : + (closedFiniteIndexClassFieldCompatibleEmbedding + (K := K) H hclosed E).domRestrict K = + closedFiniteIndexClassFieldBaseEmbedding + (K := K) H hclosed := + Classical.choose_spec + (IsAlgClosed.surjective_domRestrict_of_isAlgebraic + (K := ℚ) (L := K) (E := E) + (M := SeparableClosure ℚ) + (closedFiniteIndexClassFieldBaseEmbedding + (K := K) H hclosed)) + +open scoped Classical in +/-- Evaluation on the original scalar map agrees with the +distinguished base embedding. -/ +@[simp] +theorem closedFiniteIndexClassFieldCompatibleEmbedding_algebraMap + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] + (E : Type) [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] + (x : K) : + closedFiniteIndexClassFieldCompatibleEmbedding + (K := K) H hclosed E + (algebraMap K E x) = + closedFiniteIndexClassFieldBaseEmbedding + (K := K) H hclosed x := by + have h := + DFunLike.congr_fun + (closedFiniteIndexClassFieldCompatibleEmbedding_restrictDomain + (K := K) H hclosed E) x + exact h + +open scoped Classical in +/-- The fixing subgroup of the compatible embedded copy of `K` is the +base subgroup used by the selected class field. -/ +@[simp] +theorem closedFiniteIndexClassFieldCompatibleEmbedding_baseSubgroup + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] + (E : Type) [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] : + numberFieldEmbeddedBaseSubgroup K E + (closedFiniteIndexClassFieldCompatibleEmbedding + (K := K) H hclosed E) = + closedFiniteIndexClassFieldBaseSubgroup + (K := K) H hclosed := by + change + closedFixingSubgroup ℚ (SeparableClosure ℚ) + ((closedFiniteIndexClassFieldCompatibleEmbedding + (K := K) H hclosed E).domRestrict K).fieldRange = + closedFixingSubgroup ℚ (SeparableClosure ℚ) + (closedFiniteIndexClassFieldBaseEmbedding + (K := K) H hclosed).fieldRange + rw [ + closedFiniteIndexClassFieldCompatibleEmbedding_restrictDomain + (K := K) H hclosed E] + +open scoped Classical in +/-- An actual finite abelian extension, represented inside the same +rational absolute Galois group as the class field selected by `H`. -/ +noncomputable def + closedFiniteIndexClassFieldEmbeddedAbelianSubextension + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] + (E : Type) [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] + [IsAbelianGalois K E] : + FiniteAbelianSubextension + (closedFiniteIndexClassFieldBaseSubgroup + (K := K) H hclosed) := + numberFieldEmbeddedAbelianSubextension K E + (closedFiniteIndexClassFieldCompatibleEmbedding + (K := K) H hclosed E) + (closedFiniteIndexClassFieldBaseSubgroup + (K := K) H hclosed) + (closedFiniteIndexClassFieldCompatibleEmbedding_baseSubgroup + (K := K) H hclosed E) + +open scoped Classical in +/-- The top subgroup of the embedded abelian subextension is exactly +the fixing subgroup of the compatible embedded copy of `E`. -/ +@[simp] +theorem + closedFiniteIndexClassFieldEmbeddedAbelianSubextension_field + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] + (E : Type) [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] + [IsAbelianGalois K E] : + (closedFiniteIndexClassFieldEmbeddedAbelianSubextension + (K := K) H hclosed E).field = + numberFieldEmbeddedTopSubgroup K E + (closedFiniteIndexClassFieldCompatibleEmbedding + (K := K) H hclosed E) := by + exact + numberFieldEmbeddedAbelianSubextension_field K E + (closedFiniteIndexClassFieldCompatibleEmbedding + (K := K) H hclosed E) + (closedFiniteIndexClassFieldBaseSubgroup + (K := K) H hclosed) + (closedFiniteIndexClassFieldCompatibleEmbedding_baseSubgroup + (K := K) H hclosed E) + +open scoped Classical in +/-- The abstract norm subgroup of the compatibly embedded extension is +the genuine idèle-class norm range of the original extension, +transported through the selected base-field equivalence. -/ +private theorem + ordinaryIdeleClassNormSubgroup_embeddedAbelianSubextension_named + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] + (E : Type) [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] + [IsAbelianGalois K E] : + ordinaryIdeleClassNormSubgroup + (numberFieldTowerFiniteAbstractField K + (closedFiniteIndexClassFieldNormAmbient + (K := K) H hclosed)) + (closedFiniteIndexClassFieldEmbeddedAbelianSubextension + (K := K) H hclosed E) = + (_root_.ideleClassNorm K E).range.toAddSubgroup.map + (MulEquiv.toAdditive + (finiteAbelianClassFieldContainmentIdeleClassEquiv + (K := K) H hclosed)).toAddMonoidHom := by + let Q := + numberFieldTowerFiniteAbstractField K + (closedFiniteIndexClassFieldNormAmbient + (K := K) H hclosed) + let P := + closedFiniteIndexClassFieldEmbeddedAbelianSubextension + (K := K) H hclosed E + let A := + ordinaryIdeleClassNormExtension Q P + let j := + closedFiniteIndexClassFieldCompatibleEmbedding + (K := K) H hclosed E + let eK := + closedFiniteIndexClassFieldBaseEquiv + (K := K) H hclosed + let hANumberField : NumberField A := + ordinaryIdeleClassNormExtensionNumberField Q P + let eQ := + numberFieldEmbeddedAbstractTopFieldEquiv K E j + have hPField : + P.field = numberFieldEmbeddedTopSubgroup K E j := by + simpa only [P, j] using + (closedFiniteIndexClassFieldEmbeddedAbelianSubextension_field + (K := K) H hclosed E) + let RawField := + abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K E j) + let eRestrict : (RawField.restrictScalars ℚ) ≃+* A := + { toFun := fun x => + ⟨x.1, by + change x.1 ∈ + abstractFixedField ℚ (SeparableClosure ℚ) P.field + rw [hPField] + exact x.2⟩ + invFun := fun x => + ⟨x.1, by + change x.1 ∈ + abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedTopSubgroup K E j) + rw [← hPField] + exact x.2⟩ + left_inv := fun x => Subtype.ext rfl + right_inv := fun x => Subtype.ext rfl + map_mul' := fun x y => Subtype.ext rfl + map_add' := fun x y => Subtype.ext rfl } + let eERing : E ≃+* A := by + exact eQ.toRingEquiv.trans eRestrict + let eE : E ≃ₐ[ℚ] A := + AlgEquiv.ofRingEquiv (f := eERing) + (fun x => DFunLike.congr_fun + (RingHom.ext_rat + (eERing.toRingHom.comp (algebraMap ℚ E)) + (algebraMap ℚ A)) x) + have hcompat : + ∀ x : K, + eE (algebraMap K E x) = + algebraMap + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) A (eK x) := by + intro x + apply Subtype.ext + change + ((eERing (algebraMap K E x) : A) : SeparableClosure ℚ) = + ((eK x : closedFiniteIndexClassFieldBase + (K := K) H hclosed) : SeparableClosure ℚ) + calc + ((eERing (algebraMap K E x) : A) : SeparableClosure ℚ) = + j (algebraMap K E x) := by + rfl + _ = ((eK x : closedFiniteIndexClassFieldBase + (K := K) H hclosed) : SeparableClosure ℚ) := by + rw [ + closedFiniteIndexClassFieldCompatibleEmbedding_algebraMap + (K := K) H hclosed E, + closedFiniteIndexClassFieldBaseEquiv_coe + (K := K) H hclosed] + have hRange : + (_root_.ideleClassNorm K E).range.map + (finiteAbelianClassFieldContainmentIdeleClassEquiv + (K := K) H hclosed).toMonoidHom = + (_root_.ideleClassNorm + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) A).range := by + change + (_root_.ideleClassNorm K E).range.map + (ideleClassCongr eK).toMonoidHom = + (_root_.ideleClassNorm + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) A).range + exact + ordinaryIdeleClassNorm_range_map_congrOfAlgEquiv + eK eE hcompat + calc + ordinaryIdeleClassNormSubgroup Q P = + (_root_.ideleClassNorm + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) A).range.toAddSubgroup := + ordinaryIdeleClassNormSubgroup_eq_namedNormRange Q P + _ = + (_root_.ideleClassNorm K E).range.toAddSubgroup.map + (MulEquiv.toAdditive + (finiteAbelianClassFieldContainmentIdeleClassEquiv + (K := K) H hclosed)).toAddMonoidHom := + subgroup_map_toAddSubgroup_mulEquiv_eq + (_root_.ideleClassNorm K E).range + (_root_.ideleClassNorm + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) A).range + (finiteAbelianClassFieldContainmentIdeleClassEquiv + (K := K) H hclosed) hRange + +open scoped Classical in +/-- The abstract norm subgroup of the compatibly embedded extension is +the genuine idèle-class norm range of the original extension, expressed at +the concrete selected base-field endpoint. -/ +theorem + ordinaryIdeleClassNormSubgroup_embeddedAbelianSubextension + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] + (E : Type) [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] + [IsAbelianGalois K E] : + ordinaryIdeleClassNormSubgroup + (numberFieldTowerFiniteAbstractField K + (closedFiniteIndexClassFieldNormAmbient + (K := K) H hclosed)) + (closedFiniteIndexClassFieldEmbeddedAbelianSubextension + (K := K) H hclosed E) = + (_root_.ideleClassNorm K E).range.toAddSubgroup.map + (MulEquiv.toAdditive + (ideleClassCongr + (closedFiniteIndexClassFieldBaseEquiv + (K := K) H hclosed))).toAddMonoidHom := by + change + ordinaryIdeleClassNormSubgroup + (numberFieldTowerFiniteAbstractField K + (closedFiniteIndexClassFieldNormAmbient + (K := K) H hclosed)) + (closedFiniteIndexClassFieldEmbeddedAbelianSubextension + (K := K) H hclosed E) = + (_root_.ideleClassNorm K E).range.toAddSubgroup.map + (MulEquiv.toAdditive + (finiteAbelianClassFieldContainmentIdeleClassEquiv + (K := K) H hclosed)).toAddMonoidHom + exact + ordinaryIdeleClassNormSubgroup_embeddedAbelianSubextension_named + (K := K) H hclosed E + +open scoped Classical in +private theorem + ordinaryIdeleClassNormSubgroup_closedFiniteIndexClassFieldSubextension_named + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + ordinaryIdeleClassNormSubgroup + (numberFieldTowerFiniteAbstractField K + (closedFiniteIndexClassFieldNormAmbient + (K := K) H hclosed)) + (closedFiniteIndexClassFieldSubextension + (K := K) H hclosed) = + H.toAddSubgroup.map + (MulEquiv.toAdditive + (finiteAbelianClassFieldContainmentIdeleClassEquiv + (K := K) H hclosed)).toAddMonoidHom := by + change + ordinaryIdeleClassNormSubgroup + (closedFiniteIndexClassFieldReciprocityFiniteAbstractField + (K := K) H hclosed) + (closedFiniteIndexClassFieldSubextension + (K := K) H hclosed) = + H.toAddSubgroup.map + (MulEquiv.toAdditive + (ideleClassCongr + (closedFiniteIndexClassFieldBaseEquiv + (K := K) H hclosed))).toAddMonoidHom + exact + ordinaryIdeleClassNormSubgroup_closedFiniteIndexClassFieldSubextension + (K := K) H hclosed + +open scoped Classical in +/-- If `H` is contained in the genuine norm range of an actual finite +abelian extension, its compatible embedded subextension lies below the +finite abelian subextension selected by `H`. -/ +theorem + embeddedAbelianSubextension_le_closedFiniteIndexClassFieldSubextension + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] + (E : Type) [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] + [IsAbelianGalois K E] + (hH : + H ≤ (_root_.ideleClassNorm K E).range) : + closedFiniteIndexClassFieldEmbeddedAbelianSubextension + (K := K) H hclosed E ≤ + closedFiniteIndexClassFieldSubextension + (K := K) H hclosed := by + apply + (le_iff_ordinaryIdeleClassNormSubgroup_le + (numberFieldTowerFiniteAbstractField K + (closedFiniteIndexClassFieldNormAmbient + (K := K) H hclosed)) + (closedFiniteIndexClassFieldEmbeddedAbelianSubextension + (K := K) H hclosed E) + (closedFiniteIndexClassFieldSubextension + (K := K) H hclosed)).2 + calc + ordinaryIdeleClassNormSubgroup + (numberFieldTowerFiniteAbstractField K + (closedFiniteIndexClassFieldNormAmbient + (K := K) H hclosed)) + (closedFiniteIndexClassFieldSubextension + (K := K) H hclosed) = + H.toAddSubgroup.map + (MulEquiv.toAdditive + (finiteAbelianClassFieldContainmentIdeleClassEquiv + (K := K) H hclosed)).toAddMonoidHom := + ordinaryIdeleClassNormSubgroup_closedFiniteIndexClassFieldSubextension_named + (K := K) H hclosed + _ ≤ + (_root_.ideleClassNorm K E).range.toAddSubgroup.map + (MulEquiv.toAdditive + (finiteAbelianClassFieldContainmentIdeleClassEquiv + (K := K) H hclosed)).toAddMonoidHom := + subgroup_toAddSubgroup_map_mono_mulEquiv + H (_root_.ideleClassNorm K E).range + (finiteAbelianClassFieldContainmentIdeleClassEquiv + (K := K) H hclosed) + hH + _ = + ordinaryIdeleClassNormSubgroup + (numberFieldTowerFiniteAbstractField K + (closedFiniteIndexClassFieldNormAmbient + (K := K) H hclosed)) + (closedFiniteIndexClassFieldEmbeddedAbelianSubextension + (K := K) H hclosed E) := + (ordinaryIdeleClassNormSubgroup_embeddedAbelianSubextension_named + (K := K) H hclosed E).symm + +open scoped Classical in +/-- The compatible ambient embedding agrees with the selected base +equivalence on scalars from the original number field. -/ +private theorem + finiteAbelianExtensionEmbedding_ambient_algebraMap_eq_baseEquiv + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] + (E : Type) [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] + (x : K) : + closedFiniteIndexClassFieldCompatibleEmbedding + (K := K) H hclosed E (algebraMap K E x) = + ((closedFiniteIndexClassFieldBaseEquiv + (K := K) H hclosed x : + closedFiniteIndexClassFieldBase + (K := K) H hclosed) : + SeparableClosure ℚ) := by + rw [ + closedFiniteIndexClassFieldCompatibleEmbedding_algebraMap + (K := K) H hclosed E, + closedFiniteIndexClassFieldBaseEquiv_coe + (K := K) H hclosed] + +open scoped Classical in +/-- A point of a compatibly embedded subextension belongs to the +selected class field whenever the corresponding finite abelian +subextension lies below the selected one. -/ +private theorem + finiteAbelianExtensionEmbedding_codRestrict_mem + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] + (E : Type) [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] + [IsAbelianGalois K E] + (hcontain : + closedFiniteIndexClassFieldEmbeddedAbelianSubextension + (K := K) H hclosed E ≤ + closedFiniteIndexClassFieldSubextension + (K := K) H hclosed) + (x : E) : + closedFiniteIndexClassFieldCompatibleEmbedding + (K := K) H hclosed E x ∈ + abstractFixedField ℚ (SeparableClosure ℚ) + (closedFiniteIndexClassFieldSubextension + (K := K) H hclosed).field := by + have hxP : + closedFiniteIndexClassFieldCompatibleEmbedding + (K := K) H hclosed E x ∈ + abstractFixedField ℚ (SeparableClosure ℚ) + (closedFiniteIndexClassFieldEmbeddedAbelianSubextension + (K := K) H hclosed E).field := by + rw [closedFiniteIndexClassFieldEmbeddedAbelianSubextension_field] + change + closedFiniteIndexClassFieldCompatibleEmbedding + (K := K) H hclosed E x ∈ + IntermediateField.fixedField + (closedFiniteIndexClassFieldCompatibleEmbedding + (K := K) H hclosed E).fieldRange.fixingSubgroup + rw [InfiniteGalois.fixedField_fixingSubgroup] + exact ⟨x, rfl⟩ + have hsubgroup : + (closedFiniteIndexClassFieldSubextension + (K := K) H hclosed).field.toSubgroup ≤ + (closedFiniteIndexClassFieldEmbeddedAbelianSubextension + (K := K) H hclosed E).field.toSubgroup := + hcontain + exact + (abstractFixedField_le + ℚ (SeparableClosure ℚ) hsubgroup) hxP + +open scoped Classical in +/-- Every finite abelian extension whose genuine norm range contains +`H` admits an actual `K`-algebra embedding into the class field selected +by `H`. -/ +noncomputable def + finiteAbelianExtensionEmbeddingIntoClosedFiniteIndexClassField + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] + (E : Type) [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] + [IsAbelianGalois K E] + (hH : + H ≤ (_root_.ideleClassNorm K E).range) : + E →ₐ[K] + closedFiniteIndexClassField + (K := K) H hclosed := by + let j := + closedFiniteIndexClassFieldCompatibleEmbedding + (K := K) H hclosed E + have hcontain : + closedFiniteIndexClassFieldEmbeddedAbelianSubextension + (K := K) H hclosed E ≤ + closedFiniteIndexClassFieldSubextension + (K := K) H hclosed := + embeddedAbelianSubextension_le_closedFiniteIndexClassFieldSubextension + (K := K) H hclosed E hH + let jClassField : + E →+* + closedFiniteIndexClassField + (K := K) H hclosed := + j.toRingHom.codRestrict + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (closedFiniteIndexClassFieldSubextension + (K := K) H hclosed).below).toSubring + (finiteAbelianExtensionEmbedding_codRestrict_mem + (K := K) H hclosed E hcontain) + exact + { jClassField with + commutes' := fun x => + Subtype.ext + (finiteAbelianExtensionEmbedding_ambient_algebraMap_eq_baseEquiv + (K := K) H hclosed E x) } + +open scoped Classical in +/-- Containment in a selected finite abelian class field, stated as +existence of an actual algebra embedding over the original base. -/ +theorem + finiteAbelianExtension_nonempty_algHom_closedFiniteIndexClassField + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] + (E : Type) [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] + [IsAbelianGalois K E] + (hH : + H ≤ (_root_.ideleClassNorm K E).range) : + Nonempty + (E →ₐ[K] + closedFiniteIndexClassField + (K := K) H hclosed) := + ⟨finiteAbelianExtensionEmbeddingIntoClosedFiniteIndexClassField + (K := K) H hclosed E hH⟩ + +open scoped Classical in +/-- A finite abelian extension is isomorphic over the original base to +the class field selected by its own genuine idèle-class norm range. -/ +noncomputable def + finiteAbelianExtensionEquivClosedFiniteIndexNormClassField + (E : Type) [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] + [IsAbelianGalois K E] : + E ≃ₐ[K] + closedFiniteIndexClassField + (K := K) + (_root_.ideleClassNorm K E).range + (ideleClassNorm_range_isClosed + (K := K) (L := E)) := by + let H := + (_root_.ideleClassNorm K E).range + let hclosed : + IsClosed (H : Set (IdeleClassGroup K)) := + ideleClassNorm_range_isClosed + (K := K) (L := E) + let f : + E →ₐ[K] + closedFiniteIndexClassField + (K := K) H hclosed := + finiteAbelianExtensionEmbeddingIntoClosedFiniteIndexClassField + (K := K) H hclosed E le_rfl + have hdim : + Module.finrank K E = + Module.finrank K + (closedFiniteIndexClassField + (K := K) H hclosed) := by + calc + Module.finrank K E = + H.index := + (ideleClassNorm_index_eq_finrank_abelian K E).symm + _ = + Module.finrank K + (closedFiniteIndexClassField + (K := K) H hclosed) := + (closedFiniteIndexClassField_finrank_eq_index + (K := K) H hclosed).symm + have hsurjective : + Function.Surjective f := + (LinearMap.injective_iff_surjective_of_finrank_eq_finrank + hdim (f := f.toLinearMap)).mp f.injective + simpa only [H, hclosed] using + AlgEquiv.ofBijective f + ⟨f.injective, hsurjective⟩ + +open scoped Classical in +/-- An algebra embedding of finite extensions reverses inclusion of +their genuine idèle-class norm ranges. -/ +theorem ideleClassNorm_range_le_of_algHom + (L₁ L₂ : Type) + [Field L₁] [NumberField L₁] + [Field L₂] [NumberField L₂] + [Algebra K L₁] [Algebra K L₂] + [FiniteDimensional K L₁] [FiniteDimensional K L₂] + (f : L₁ →ₐ[K] L₂) : + (_root_.ideleClassNorm K L₂).range ≤ + (_root_.ideleClassNorm K L₁).range := by + let : Algebra L₁ L₂ := + f.toRingHom.toAlgebra + let : IsScalarTower K L₁ L₂ := + IsScalarTower.of_algebraMap_eq fun x => by + exact (f.commutes x).symm + let : FiniteDimensional L₁ L₂ := + FiniteDimensional.right K L₁ L₂ + exact + ideleClassNorm_range_le_of_tower + (K := K) (M := L₁) (L := L₂) + +open scoped Classical in +/-- Reverse inclusion of genuine idèle-class norm ranges constructs an +actual algebra embedding of the corresponding finite abelian +extensions over the original base field. -/ +noncomputable def finiteAbelianExtensionEmbeddingOfNormRangeLE + (L₁ L₂ : Type) + [Field L₁] [NumberField L₁] + [Field L₂] [NumberField L₂] + [Algebra K L₁] [Algebra K L₂] + [FiniteDimensional K L₁] [FiniteDimensional K L₂] + [IsAbelianGalois K L₁] [IsAbelianGalois K L₂] + (h : + (_root_.ideleClassNorm K L₂).range ≤ + (_root_.ideleClassNorm K L₁).range) : + L₁ →ₐ[K] L₂ := by + let H := + (_root_.ideleClassNorm K L₂).range + let hclosed : + IsClosed (H : Set (IdeleClassGroup K)) := + ideleClassNorm_range_isClosed + (K := K) (L := L₂) + let f₁ : + L₁ →ₐ[K] + closedFiniteIndexClassField + (K := K) H hclosed := + finiteAbelianExtensionEmbeddingIntoClosedFiniteIndexClassField + (K := K) H hclosed L₁ h + let e₂ : + L₂ ≃ₐ[K] + closedFiniteIndexClassField + (K := K) H hclosed := by + simpa only [H, hclosed] using + finiteAbelianExtensionEquivClosedFiniteIndexNormClassField + (K := K) L₂ + exact + e₂.symm.toAlgHom.comp f₁ + +open scoped Classical in +/-- Reverse norm-range inclusion implies actual field containment over +the original number field. -/ +theorem finiteAbelianExtension_nonempty_algHom_of_normRange_le + (L₁ L₂ : Type) + [Field L₁] [NumberField L₁] + [Field L₂] [NumberField L₂] + [Algebra K L₁] [Algebra K L₂] + [FiniteDimensional K L₁] [FiniteDimensional K L₂] + [IsAbelianGalois K L₁] [IsAbelianGalois K L₂] + (h : + (_root_.ideleClassNorm K L₂).range ≤ + (_root_.ideleClassNorm K L₁).range) : + Nonempty (L₁ →ₐ[K] L₂) := + ⟨finiteAbelianExtensionEmbeddingOfNormRangeLE + (K := K) L₁ L₂ h⟩ + +open scoped Classical in +/-- Actual containment of finite abelian extensions is equivalent to +reverse inclusion of their genuine idèle-class norm ranges. -/ +theorem nonempty_algHom_iff_ideleClassNorm_range_le + (L₁ L₂ : Type) + [Field L₁] [NumberField L₁] + [Field L₂] [NumberField L₂] + [Algebra K L₁] [Algebra K L₂] + [FiniteDimensional K L₁] [FiniteDimensional K L₂] + [IsAbelianGalois K L₁] [IsAbelianGalois K L₂] : + Nonempty (L₁ →ₐ[K] L₂) ↔ + (_root_.ideleClassNorm K L₂).range ≤ + (_root_.ideleClassNorm K L₁).range := by + constructor + · rintro ⟨f⟩ + exact + ideleClassNorm_range_le_of_algHom + (K := K) L₁ L₂ f + · exact + finiteAbelianExtension_nonempty_algHom_of_normRange_le + (K := K) L₁ L₂ + +open scoped Classical in +/-- Equality of genuine norm ranges characterizes isomorphism of +finite abelian extensions over the original number field. -/ +theorem nonempty_algEquiv_iff_ideleClassNorm_range_eq + (L₁ L₂ : Type) + [Field L₁] [NumberField L₁] + [Field L₂] [NumberField L₂] + [Algebra K L₁] [Algebra K L₂] + [FiniteDimensional K L₁] [FiniteDimensional K L₂] + [IsAbelianGalois K L₁] [IsAbelianGalois K L₂] : + Nonempty (L₁ ≃ₐ[K] L₂) ↔ + (_root_.ideleClassNorm K L₁).range = + (_root_.ideleClassNorm K L₂).range := by + constructor + · rintro ⟨e⟩ + apply le_antisymm + · exact + ideleClassNorm_range_le_of_algHom + (K := K) L₂ L₁ e.symm.toAlgHom + · exact + ideleClassNorm_range_le_of_algHom + (K := K) L₁ L₂ e.toAlgHom + · intro h + let f : + L₁ →ₐ[K] L₂ := + finiteAbelianExtensionEmbeddingOfNormRangeLE + (K := K) L₁ L₂ h.symm.le + have hdim : + Module.finrank K L₁ = + Module.finrank K L₂ := by + calc + Module.finrank K L₁ = + (_root_.ideleClassNorm K L₁).range.index := + (ideleClassNorm_index_eq_finrank_abelian + K L₁).symm + _ = + (_root_.ideleClassNorm K L₂).range.index := + congrArg Subgroup.index h + _ = + Module.finrank K L₂ := + ideleClassNorm_index_eq_finrank_abelian + K L₂ + have hsurjective : + Function.Surjective f := + (LinearMap.injective_iff_surjective_of_finrank_eq_finrank + hdim (f := f.toLinearMap)).mp f.injective + exact + ⟨AlgEquiv.ofBijective f + ⟨f.injective, hsurjective⟩⟩ + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondence.lean new file mode 100644 index 0000000000..38ce165ed0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondence.lean @@ -0,0 +1,336 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation +/-! +# The ordinary finite abelian class-field correspondence + +The abstract finite abelian classification is formulated on the fixed +parts of the rational absolute idele-class representation. For a finite +abstract base field, the canonical fixed-field comparison transports its +norm subgroups to the ordinary idele class group of the actual fixed +number field. + +This file records that transported correspondence. In particular, the +two lattice formulas are now equalities of ordinary determinant-norm +subgroups: composita correspond to intersections and intersection fields +correspond to products. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open ClassFormation +open KummerTheory +open LocalClassFieldTheory +open Reciprocity + +/-- Fix the rational algebra structure used by every occurrence of the +absolute Galois group in this module. -/ +noncomputable local instance + finiteAbelianClassFieldCorrespondenceSeparableClosureAlgebra : + Algebra ℚ (SeparableClosure ℚ) := + rationalSeparableClosureAlgebra + +variable + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + +local instance ordinaryFixedFieldBaseQuotientFinite : + Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K.field (le_baseField K.field)) := + K.finite + +noncomputable local instance ordinaryFixedFieldFiniteDimensional : + FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K.field K.finite + +noncomputable local instance ordinaryFixedFieldNumberField : + NumberField + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) := + NumberField.of_module_finite ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) + +/-- The ordinary idele-class norm subgroup represented by a finite +abelian subextension of a rational absolute fixed field. + +The definition transports the abstract norm subgroup through the +canonical equivalence from the ordinary idele class group of the actual +fixed field. The theorem +`ordinaryIdeleClassNormSubgroup_eq_actualNormRange` below identifies it +with the genuine determinant-norm range of the represented extension. -/ +noncomputable def ordinaryIdeleClassNormSubgroup + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + AddSubgroup + (Additive + (IdeleClassGroup + (abstractFixedField + ℚ (SeparableClosure ℚ) K.field))) := by + exact + (L.normSubgroup rationalIdeleClassRepresentation).map + (rationalAbstractFixedFieldIdeleClassEquivFixed + K.field).symm.toAddMonoidHom + +private theorem ordinaryIdeleClassNormSubgroup_eq_map + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + ordinaryIdeleClassNormSubgroup K L = + (L.normSubgroup rationalIdeleClassRepresentation).map + (rationalAbstractFixedFieldIdeleClassEquivFixed + K.field).symm.toAddMonoidHom := + rfl + +/-- The transported subgroup is the genuine ordinary +determinant-norm range of the actual relative fixed-field extension. -/ +theorem ordinaryIdeleClassNormSubgroup_eq_actualNormRange + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + let F := + abstractFixedField ℚ (SeparableClosure ℚ) K.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + letI hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K.field (le_baseField K.field)) := + K.finite + letI hLfinite : Finite + (K.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup K.field L.field L.below) := + L.finite + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K.field hKfinite + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + K.field L.field L.below hKfinite hLfinite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' rfl + letI : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + letI : NumberField F := + NumberField.of_module_finite ℚ F + letI : NumberField E := + NumberField.of_module_finite ℚ E + letI : IsAbelianGalois F E := + finiteAbelianSubextensionAbstractRelativeFixedFieldIsAbelianGalois L + ordinaryIdeleClassNormSubgroup K L = + (_root_.ideleClassNorm F E).range.toAddSubgroup := by + exact + (ordinaryIdeleClassNormSubgroup_eq_map K L).trans + (map_rationalFiniteNormSubgroup_eq_ordinaryIdeleClassNormRange_concrete + (hKfinite := K.finite) (hfinite := L.finite) + K.field L.field L.below L.normal) + +/-- Field inclusion is exactly reverse inclusion of the represented +ordinary determinant-norm subgroups. -/ +theorem le_iff_ordinaryIdeleClassNormSubgroup_le + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L₁ L₂ : FiniteAbelianSubextension K.field) : + L₁ ≤ L₂ ↔ + ordinaryIdeleClassNormSubgroup K L₂ ≤ + ordinaryIdeleClassNormSubgroup K L₁ := by + let e : + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K.field ≃+ + Additive (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) K.field)) := + (rationalAbstractFixedFieldIdeleClassEquivFixed + (hfinite := K.finite) K.field).symm + let f : + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K.field →+ + Additive (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) K.field)) := + e.toAddMonoidHom + have hf : Function.Injective f := e.injective + let S₂ := L₂.normSubgroup rationalIdeleClassRepresentation + let S₁ := L₁.normSubgroup rationalIdeleClassRepresentation + have h₂ : ordinaryIdeleClassNormSubgroup K L₂ = S₂.map f := + ordinaryIdeleClassNormSubgroup_eq_map K L₂ + have h₁ : ordinaryIdeleClassNormSubgroup K L₁ = S₁.map f := + ordinaryIdeleClassNormSubgroup_eq_map K L₁ + have htransport : + (S₂.map f ≤ S₁.map f) ↔ + (ordinaryIdeleClassNormSubgroup K L₂ ≤ + ordinaryIdeleClassNormSubgroup K L₁) := + Iff.of_eq (congrArg₂ + (fun A B : AddSubgroup (Additive (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) K.field))) => A ≤ B) + h₂.symm h₁.symm) + exact + (FiniteAbelianSubextension.le_iff_normSubgroup_le + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + K L₁ L₂).trans + ((AddSubgroup.map_le_map_iff_of_injective hf).symm.trans htransport) + +/-- A finite abelian subextension is uniquely determined by its +ordinary idele-class norm subgroup. -/ +theorem ordinaryIdeleClassNormSubgroup_injective + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + Function.Injective + (ordinaryIdeleClassNormSubgroup K) := by + intro L₁ L₂ h + apply le_antisymm + · exact + (le_iff_ordinaryIdeleClassNormSubgroup_le + K L₁ L₂).2 h.ge + · exact + (le_iff_ordinaryIdeleClassNormSubgroup_le + K L₂ L₁).2 h.le + +/-- The ordinary norm subgroup of a compositum is the intersection of +the two ordinary norm subgroups. -/ +theorem ordinaryIdeleClassNormSubgroup_compositum + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L₁ L₂ : FiniteAbelianSubextension K.field) : + ordinaryIdeleClassNormSubgroup K (L₁.compositum L₂) = + ordinaryIdeleClassNormSubgroup K L₁ ⊓ + ordinaryIdeleClassNormSubgroup K L₂ := by + let e : + Additive (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) K.field)) ≃+ + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K.field := + rationalAbstractFixedFieldIdeleClassEquivFixed K.field + let f : + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K.field →+ + Additive (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) K.field)) := + e.symm.toAddMonoidHom + have hf : Function.Injective f := e.symm.injective + calc + ordinaryIdeleClassNormSubgroup K (L₁.compositum L₂) = + ((L₁.compositum L₂).normSubgroup + rationalIdeleClassRepresentation).map + f := + ordinaryIdeleClassNormSubgroup_eq_map K (L₁.compositum L₂) + _ = ((L₁.normSubgroup rationalIdeleClassRepresentation) ⊓ + (L₂.normSubgroup rationalIdeleClassRepresentation)).map + f := + congrArg + (fun H : AddSubgroup + (KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K.field) => + AddSubgroup.map + (N := Additive (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) K.field))) f H) + (FiniteAbelianSubextension.normSubgroup_compositum + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + K L₁ L₂) + _ = (L₁.normSubgroup rationalIdeleClassRepresentation).map + f ⊓ + (L₂.normSubgroup rationalIdeleClassRepresentation).map + f := + AddSubgroup.map_inf + (G := KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K.field) + (N := Additive (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) K.field))) + (H := L₁.normSubgroup rationalIdeleClassRepresentation) + (K := L₂.normSubgroup rationalIdeleClassRepresentation) + (f := f) (hf := hf) + _ = ordinaryIdeleClassNormSubgroup K L₁ ⊓ + ordinaryIdeleClassNormSubgroup K L₂ := + congrArg₂ (fun A B => A ⊓ B) + (ordinaryIdeleClassNormSubgroup_eq_map K L₁).symm + (ordinaryIdeleClassNormSubgroup_eq_map K L₂).symm + +/-- The ordinary norm subgroup of an intersection field is the product +of the two ordinary norm subgroups. -/ +theorem ordinaryIdeleClassNormSubgroup_intersection + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L₁ L₂ : FiniteAbelianSubextension K.field) : + ordinaryIdeleClassNormSubgroup K (L₁.intersection L₂) = + ordinaryIdeleClassNormSubgroup K L₁ ⊔ + ordinaryIdeleClassNormSubgroup K L₂ := by + let e : + Additive (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) K.field)) ≃+ + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K.field := + rationalAbstractFixedFieldIdeleClassEquivFixed K.field + let f : + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K.field →+ + Additive (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) K.field)) := + e.symm.toAddMonoidHom + calc + ordinaryIdeleClassNormSubgroup K (L₁.intersection L₂) = + ((L₁.intersection L₂).normSubgroup + rationalIdeleClassRepresentation).map + f := + ordinaryIdeleClassNormSubgroup_eq_map K (L₁.intersection L₂) + _ = ((L₁.normSubgroup rationalIdeleClassRepresentation) ⊔ + (L₂.normSubgroup rationalIdeleClassRepresentation)).map + f := + congrArg + (fun H : AddSubgroup + (KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K.field) => + AddSubgroup.map + (N := Additive (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) K.field))) f H) + (FiniteAbelianSubextension.normSubgroup_intersection + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + K L₁ L₂) + _ = (L₁.normSubgroup rationalIdeleClassRepresentation).map + f ⊔ + (L₂.normSubgroup rationalIdeleClassRepresentation).map + f := + AddSubgroup.map_sup + (G := KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K.field) + (N := Additive (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) K.field))) + (H := L₁.normSubgroup rationalIdeleClassRepresentation) + (K := L₂.normSubgroup rationalIdeleClassRepresentation) + (f := f) + _ = ordinaryIdeleClassNormSubgroup K L₁ ⊔ + ordinaryIdeleClassNormSubgroup K L₂ := + congrArg₂ (fun A B => A ⊔ B) + (ordinaryIdeleClassNormSubgroup_eq_map K L₁).symm + (ordinaryIdeleClassNormSubgroup_eq_map K L₂).symm + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondenceTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondenceTopology.lean new file mode 100644 index 0000000000..98206c417f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondenceTopology.lean @@ -0,0 +1,227 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +/-! +# Ordinary topology in the finite abelian class-field correspondence + +The ordinary norm subgroup attached to a finite abelian subextension is +the genuine determinant-norm range on its canonical actual fixed fields. +Consequently it is open and closed in the ordinary idele-class topology +and has finite index. + +The actual fixed fields are exposed below through named carriers with +canonical instances. This keeps the public topology statements free of +local-instance towers. The selected class field of a closed finite-index +subgroup, together with its norm-range and degree-index theorems, is provided +by `ClosedFiniteIndexClassField`. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open ClassFormation +open LocalClassFieldTheory +open Reciprocity + +open scoped Classical in +/-- Use the same rational algebra structure as the ordinary correspondence +when constructing all named fixed-field carriers below. -/ +noncomputable local instance + finiteAbelianClassFieldCorrespondenceTopologySeparableClosureAlgebra : + Algebra ℚ (SeparableClosure ℚ) := + rationalSeparableClosureAlgebra + +attribute [local instance] finiteAbelianClassFieldCorrespondenceTopologySeparableClosureAlgebra + +open scoped Classical in +/-- The actual fixed-field base represented by a finite abstract field. -/ +abbrev ordinaryIdeleClassNormBase + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : Type := + abstractFixedField ℚ (SeparableClosure ℚ) K.field + +open scoped Classical in +/-- The actual relative fixed field represented by a finite abelian +subextension. -/ +abbrev ordinaryIdeleClassNormExtension + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : Type := + abstractRelativeFixedField ℚ (SeparableClosure ℚ) L.below + +open scoped Classical in +noncomputable instance ordinaryIdeleClassNormBaseFiniteDimensional + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + FiniteDimensional ℚ (ordinaryIdeleClassNormBase K) := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K.field K.finite + +open scoped Classical in +noncomputable instance ordinaryIdeleClassNormExtensionFiniteDimensional + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + FiniteDimensional + (ordinaryIdeleClassNormBase K) + (ordinaryIdeleClassNormExtension K L) := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + K.field L.field L.below K.finite L.finite + +open scoped Classical in +noncomputable instance ordinaryIdeleClassNormScalarTower + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + IsScalarTower ℚ + (ordinaryIdeleClassNormBase K) + (ordinaryIdeleClassNormExtension K L) := + IsScalarTower.of_algebraMap_eq' rfl + +open scoped Classical in +noncomputable instance ordinaryIdeleClassNormExtensionAbsoluteFiniteDimensional + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + FiniteDimensional ℚ + (ordinaryIdeleClassNormExtension K L) := + FiniteDimensional.trans ℚ + (ordinaryIdeleClassNormBase K) + (ordinaryIdeleClassNormExtension K L) + +open scoped Classical in +noncomputable instance ordinaryIdeleClassNormBaseNumberField + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + NumberField (ordinaryIdeleClassNormBase K) := + NumberField.of_module_finite ℚ (ordinaryIdeleClassNormBase K) + +open scoped Classical in +noncomputable instance ordinaryIdeleClassNormExtensionNumberField + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + NumberField (ordinaryIdeleClassNormExtension K L) := + NumberField.of_module_finite ℚ + (ordinaryIdeleClassNormExtension K L) + +open scoped Classical in +noncomputable instance ordinaryIdeleClassNormExtensionIsAbelianGalois + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + IsAbelianGalois + (ordinaryIdeleClassNormBase K) + (ordinaryIdeleClassNormExtension K L) := + finiteAbelianSubextensionAbstractRelativeFixedFieldIsAbelianGalois L + +open scoped Classical in +/-- The represented ordinary norm subgroup is the determinant-norm range on +the named actual fixed fields. -/ +theorem ordinaryIdeleClassNormSubgroup_eq_namedNormRange + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + ordinaryIdeleClassNormSubgroup K L = + (_root_.ideleClassNorm + (ordinaryIdeleClassNormBase K) + (ordinaryIdeleClassNormExtension K L)).range.toAddSubgroup := by + simpa only [ordinaryIdeleClassNormBase, + ordinaryIdeleClassNormExtension] using + (ordinaryIdeleClassNormSubgroup_eq_actualNormRange K L) + +open scoped Classical in +/-- The ordinary norm subgroup represented by a finite abelian +subextension is open in the natural topology of the idele class group of +the canonical actual fixed field. -/ +theorem ordinaryIdeleClassNormSubgroup_isOpen + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + IsOpen + (ordinaryIdeleClassNormSubgroup K L : + Set + (Additive + (IdeleClassGroup + (ordinaryIdeleClassNormBase K)))) := by + rw [ordinaryIdeleClassNormSubgroup_eq_namedNormRange K L] + exact ideleClassNorm_range_isOpen + (K := ordinaryIdeleClassNormBase K) + (L := ordinaryIdeleClassNormExtension K L) + +open scoped Classical in +/-- The ordinary norm subgroup represented by a finite abelian +subextension is closed in the natural idele-class topology. -/ +theorem ordinaryIdeleClassNormSubgroup_isClosed + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + IsClosed + (ordinaryIdeleClassNormSubgroup K L : + Set + (Additive + (IdeleClassGroup + (ordinaryIdeleClassNormBase K)))) := by + rw [ordinaryIdeleClassNormSubgroup_eq_namedNormRange K L] + exact ideleClassNorm_range_isClosed + (K := ordinaryIdeleClassNormBase K) + (L := ordinaryIdeleClassNormExtension K L) + +open scoped Classical in +/-- The ordinary norm subgroup represented by a finite abelian +subextension has finite index. -/ +theorem ordinaryIdeleClassNormSubgroup_finiteIndex + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + (ordinaryIdeleClassNormSubgroup K L).FiniteIndex := by + rw [ordinaryIdeleClassNormSubgroup_eq_namedNormRange K L] + exact + (Subgroup.finiteIndex_toAddSubgroup_iff + (H := (_root_.ideleClassNorm + (ordinaryIdeleClassNormBase K) + (ordinaryIdeleClassNormExtension K L)).range)).2 + (ideleClassNorm_rangeFiniteIndex + (K := ordinaryIdeleClassNormBase K) + (L := ordinaryIdeleClassNormExtension K L)) + +open scoped Classical in +/-- The index of the ordinary norm subgroup represented by a finite +abelian subextension is the degree of its actual relative fixed-field +extension. -/ +theorem ordinaryIdeleClassNormSubgroup_index_eq_finrank + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + (ordinaryIdeleClassNormSubgroup K L).index = + Module.finrank + (ordinaryIdeleClassNormBase K) + (ordinaryIdeleClassNormExtension K L) := by + rw [ordinaryIdeleClassNormSubgroup_eq_namedNormRange K L] + exact + (Subgroup.index_toAddSubgroup + (H := (_root_.ideleClassNorm + (ordinaryIdeleClassNormBase K) + (ordinaryIdeleClassNormExtension K L)).range)).trans + (ideleClassNorm_index_eq_finrank_abelian + (ordinaryIdeleClassNormBase K) + (ordinaryIdeleClassNormExtension K L)) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteIndexNormClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteIndexNormClassField.lean new file mode 100644 index 0000000000..cfc4f5d31c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteIndexNormClassField.lean @@ -0,0 +1,360 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PowerCongruenceCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclotomicKummerNormDescent +/-! +# Class fields of closed finite-index idele-class subgroups + +For a closed finite-index subgroup `H` of the idele class group, the +canonical ray modulus inside `H` supplies the finite seed for the full +S-unit Kummer construction. When `H` is proper, the Kummer exponent is +the index of `H`; when `H` is the whole group, exponent two gives a +uniform finite Galois norm neighbourhood and the required containment is +automatic. + +The finite normal closure of the cyclotomic full S-unit Kummer extension +therefore has ordinary idele-class norm range contained in `H`. +Finite-abelian classification applied to that actual norm neighbourhood +then realizes `H`, transported to the canonical embedded copy of the base +field, as an exact determinant-norm subgroup. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain +open GlobalClassFieldTheory.ClassFieldAxiom + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- The Kummer exponent attached to a closed finite-index idele-class +subgroup. A proper subgroup uses its exact index. The top subgroup uses +exponent two, so the same concrete finite Galois construction also covers +the trivial class field case. -/ +noncomputable def closedFiniteIndexNormExponent + (H : Subgroup (IdeleClassGroup K)) + [H.FiniteIndex] : + ℕ+ := + if H = ⊤ then 2 + else + ⟨H.index, + Nat.pos_of_ne_zero Subgroup.FiniteIndex.index_ne_zero⟩ + +open scoped Classical in +/-- For a proper finite-index subgroup, its norm exponent is its index. -/ +theorem closedFiniteIndexNormExponent_eq_index + (H : Subgroup (IdeleClassGroup K)) + [H.FiniteIndex] + (hH : H ≠ ⊤) : + closedFiniteIndexNormExponent (K := K) H = + ⟨H.index, + Nat.pos_of_ne_zero Subgroup.FiniteIndex.index_ne_zero⟩ := by + change + (if H = ⊤ then (2 : ℕ+) else + H.index.toPNat (Nat.pos_of_ne_zero Subgroup.FiniteIndex.index_ne_zero)) = + H.index.toPNat (Nat.pos_of_ne_zero Subgroup.FiniteIndex.index_ne_zero) + exact ite_eq_right hH + +open scoped Classical in +/-- The Kummer exponent attached to a finite-index subgroup is always +strictly larger than one. -/ +theorem one_lt_closedFiniteIndexNormExponent + (H : Subgroup (IdeleClassGroup K)) + [H.FiniteIndex] : + 1 < (closedFiniteIndexNormExponent (K := K) H : ℕ) := by + by_cases hH : H = ⊤ + · have hexponent : closedFiniteIndexNormExponent (K := K) H = (2 : ℕ+) := by + change + (if H = ⊤ then (2 : ℕ+) else + H.index.toPNat (Nat.pos_of_ne_zero Subgroup.FiniteIndex.index_ne_zero)) = + (2 : ℕ+) + exact ite_eq_left hH + have hvalue : (closedFiniteIndexNormExponent (K := K) H : ℕ) = 2 := + congrArg PNat.val hexponent + rw [hvalue] + decide + · have hindex : (closedFiniteIndexNormExponent (K := K) H : ℕ) = H.index := + congrArg PNat.val (closedFiniteIndexNormExponent_eq_index (K := K) H hH) + rw [hindex] + exact Subgroup.one_lt_index_of_ne_top hH + +open scoped Classical in +/-- The finite seed used in the norm-neighbourhood construction is the +support of the canonical ray modulus whose congruence subgroup lies in +`H`. -/ +noncomputable def closedFiniteIndexNormSeed + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + Finset (HeightOneSpectrum (𝓞 K)) := + (RayClass.modulusInsideClosedFiniteIndex H hclosed).finitePart.support + +open scoped Classical in +/-- The cyclotomic layer used by the finite-index norm construction. -/ +noncomputable abbrev closedFiniteIndexNormCyclotomicField + (H : Subgroup (IdeleClassGroup K)) + [H.FiniteIndex] : Type := + CyclotomicField + (closedFiniteIndexNormExponent (K := K) H : ℕ) K + +open scoped Classical in +instance closedFiniteIndexNormExponentNeZero + (H : Subgroup (IdeleClassGroup K)) + [H.FiniteIndex] : + NeZero (closedFiniteIndexNormExponent (K := K) H : ℕ) := + ⟨(closedFiniteIndexNormExponent (K := K) H).ne_zero⟩ + +open scoped Classical in +noncomputable instance + closedFiniteIndexNormCyclotomicFieldIsCyclotomicExtension + (H : Subgroup (IdeleClassGroup K)) [H.FiniteIndex] : + IsCyclotomicExtension + {(closedFiniteIndexNormExponent (K := K) H : ℕ)} K + (closedFiniteIndexNormCyclotomicField (K := K) H) := by + unfold closedFiniteIndexNormCyclotomicField + exact + CyclotomicField.isCyclotomicExtension + (closedFiniteIndexNormExponent (K := K) H : ℕ) K + +open scoped Classical in +noncomputable instance + closedFiniteIndexNormCyclotomicFieldFiniteDimensional + (H : Subgroup (IdeleClassGroup K)) [H.FiniteIndex] : + FiniteDimensional K + (closedFiniteIndexNormCyclotomicField (K := K) H) := + IsCyclotomicExtension.finiteDimensional + {(closedFiniteIndexNormExponent (K := K) H : ℕ)} K + (closedFiniteIndexNormCyclotomicField (K := K) H) + +open scoped Classical in +noncomputable instance closedFiniteIndexNormCyclotomicFieldNumberField + (H : Subgroup (IdeleClassGroup K)) [H.FiniteIndex] : + NumberField + (closedFiniteIndexNormCyclotomicField (K := K) H) := + NumberField.of_module_finite K + (closedFiniteIndexNormCyclotomicField (K := K) H) + +open scoped Classical in +noncomputable instance closedFiniteIndexNormCyclotomicFieldIsGalois + (H : Subgroup (IdeleClassGroup K)) [H.FiniteIndex] : + IsGalois K + (closedFiniteIndexNormCyclotomicField (K := K) H) := + IsCyclotomicExtension.isGalois + {(closedFiniteIndexNormExponent (K := K) H : ℕ)} K + (closedFiniteIndexNormCyclotomicField (K := K) H) + +open scoped Classical in +/-- The full S-unit Kummer layer used by the finite-index norm +construction. -/ +noncomputable abbrev closedFiniteIndexNormKummerField + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : Type := + cyclotomicFullSUnitKummerExtension + (K := K) (closedFiniteIndexNormExponent (K := K) H) + (closedFiniteIndexNormSeed (K := K) H hclosed) + +open scoped Classical in +noncomputable instance closedFiniteIndexNormKummerFieldFiniteDimensional + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + FiniteDimensional + (closedFiniteIndexNormCyclotomicField (K := K) H) + (closedFiniteIndexNormKummerField (K := K) H hclosed) := by + unfold closedFiniteIndexNormCyclotomicField + closedFiniteIndexNormKummerField + exact + cyclotomicFullSUnitKummerExtension_finiteDimensional + (K := K) (closedFiniteIndexNormExponent (K := K) H) + (closedFiniteIndexNormSeed (K := K) H hclosed) + +open scoped Classical in +noncomputable instance closedFiniteIndexNormKummerFieldIsGalois + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + IsGalois (closedFiniteIndexNormCyclotomicField (K := K) H) + (closedFiniteIndexNormKummerField (K := K) H hclosed) := by + unfold closedFiniteIndexNormCyclotomicField + closedFiniteIndexNormKummerField + exact + cyclotomicFullSUnitKummerExtension_isGalois + (K := K) (closedFiniteIndexNormExponent (K := K) H) + (closedFiniteIndexNormSeed (K := K) H hclosed) + +open scoped Classical in +noncomputable instance closedFiniteIndexNormKummerFieldNumberField + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + NumberField (closedFiniteIndexNormKummerField (K := K) H hclosed) := + NumberField.of_module_finite + (closedFiniteIndexNormCyclotomicField (K := K) H) + (closedFiniteIndexNormKummerField (K := K) H hclosed) + +open scoped Classical in +@[reducible] +noncomputable instance closedFiniteIndexNormKummerFieldAlgebraOverBase + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + Algebra K (closedFiniteIndexNormKummerField (K := K) H hclosed) := + ((algebraMap + (closedFiniteIndexNormCyclotomicField (K := K) H) + (closedFiniteIndexNormKummerField (K := K) H hclosed)).comp + (algebraMap K + (closedFiniteIndexNormCyclotomicField (K := K) H))).toAlgebra + +open scoped Classical in +@[reducible] +noncomputable instance closedFiniteIndexNormKummerFieldSMulOverBase + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + SMul K (closedFiniteIndexNormKummerField (K := K) H hclosed) := + Algebra.toSMul + (self := closedFiniteIndexNormKummerFieldAlgebraOverBase H hclosed) + +open scoped Classical in +@[reducible] +noncomputable instance closedFiniteIndexNormKummerFieldModuleOverBase + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + Module K (closedFiniteIndexNormKummerField (K := K) H hclosed) := + Algebra.toModule + +open scoped Classical in +noncomputable instance closedFiniteIndexNormKummerFieldScalarTower + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + IsScalarTower K + (closedFiniteIndexNormCyclotomicField (K := K) H) + (closedFiniteIndexNormKummerField (K := K) H hclosed) := by + exact IsScalarTower.of_algebraMap_eq' rfl + +open scoped Classical in +noncomputable instance + closedFiniteIndexNormKummerFieldFiniteDimensionalOverBase + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + FiniteDimensional K + (closedFiniteIndexNormKummerField (K := K) H hclosed) := + FiniteDimensional.trans K + (closedFiniteIndexNormCyclotomicField (K := K) H) + (closedFiniteIndexNormKummerField (K := K) H hclosed) + +open scoped Classical in +/-- The finite normal closure which is the actual Galois norm +neighbourhood attached to `H`. -/ +noncomputable abbrev closedFiniteIndexNormAmbient + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : Type := + finiteNormalClosure K + (closedFiniteIndexNormKummerField (K := K) H hclosed) + +open scoped Classical in +noncomputable instance closedFiniteIndexNormAmbientFiniteDimensional + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + FiniteDimensional K + (closedFiniteIndexNormAmbient (K := K) H hclosed) := by + unfold closedFiniteIndexNormAmbient + infer_instance + +open scoped Classical in +noncomputable instance closedFiniteIndexNormAmbientNumberField + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + NumberField (closedFiniteIndexNormAmbient (K := K) H hclosed) := by + unfold closedFiniteIndexNormAmbient + exact + finiteNormalClosure_numberField K + (closedFiniteIndexNormKummerField (K := K) H hclosed) + +open scoped Classical in +noncomputable instance closedFiniteIndexNormAmbientIsGalois + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + IsGalois K (closedFiniteIndexNormAmbient (K := K) H hclosed) := by + unfold closedFiniteIndexNormAmbient + exact + finiteNormalClosure_isGalois K + (closedFiniteIndexNormKummerField (K := K) H hclosed) + +open scoped Classical in +/-- The finite normal closure of the cyclotomic full S-unit Kummer +extension attached to a closed finite-index subgroup is an actual finite +Galois norm neighbourhood contained in that subgroup. -/ +theorem closedFiniteIndexSubgroup_has_finiteGaloisNormNeighborhood + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + (_root_.ideleClassNorm K + (closedFiniteIndexNormAmbient (K := K) H hclosed)).range ≤ H := by + classical + let n := closedFiniteIndexNormExponent (K := K) H + let seed := closedFiniteIndexNormSeed (K := K) H hclosed + have hNormPower : + (_root_.ideleClassNorm K + (closedFiniteIndexNormAmbient (K := K) H hclosed)).range ≤ + ideleClassPowerLocalUnitSubgroup + (K := K) n + (cyclotomicKummerNormSupport (K := K) n seed) ∅ := by + simpa only [n, seed, closedFiniteIndexNormAmbient, + closedFiniteIndexNormKummerField, + closedFiniteIndexNormCyclotomicField] using + (cyclotomicFullSUnitKummerFiniteNormalClosure_ideleClassNormRange_le_powerLocalUnit + (K := K) n + (one_lt_closedFiniteIndexNormExponent (K := K) H) seed) + have hPower : + ideleClassPowerLocalUnitSubgroup + (K := K) n + (cyclotomicKummerNormSupport (K := K) n seed) ∅ ≤ + H := by + by_cases hH : H = ⊤ + · simpa only [hH] using + (le_top : + ideleClassPowerLocalUnitSubgroup + (K := K) n + (cyclotomicKummerNormSupport (K := K) n seed) ∅ ≤ + (⊤ : Subgroup (IdeleClassGroup K))) + · have hSeed : + (RayClass.modulusInsideClosedFiniteIndex H hclosed).finitePart.support ⊆ + cyclotomicKummerNormSupport (K := K) n seed := by + simpa only [seed, closedFiniteIndexNormSeed] using + (subset_cyclotomicKummerNormSupport + (K := K) n seed) + have hIndexPower := + ideleClassPowerLocalUnitSubgroup_le_closedFiniteIndexSubgroup + (K := K) H hclosed + (cyclotomicKummerNormSupport (K := K) n seed) hSeed + simpa only [n, + closedFiniteIndexNormExponent_eq_index (K := K) H hH + ] using hIndexPower + exact hNormPower.trans hPower + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FinitePlaceArtinQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FinitePlaceArtinQuotient.lean new file mode 100644 index 0000000000..ea71cf6cd9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FinitePlaceArtinQuotient.lean @@ -0,0 +1,149 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core +/-! +# Finite-place Artin quotients + +For a finite abelian extension of number fields, the chosen local +Artin homomorphism has image equal to the actual decomposition group +and kernel equal to the chosen local norm subgroup. Restricting its +codomain and applying the first isomorphism theorem therefore +identifies the concrete local norm quotient with the decomposition +group. +-/ + +@[expose] public section + +open scoped NumberField +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + +open scoped Classical in +/-- The chosen finite-place Artin homomorphism with codomain restricted +to the actual decomposition group at the chosen place above `v`. -/ +noncomputable def chosenFinitePlaceArtinToDecompositionGroup + (v : HeightOneSpectrum (𝓞 K)) : + (v.adicCompletion K)ˣ →* + _root_.finitePlaceDecompositionGroup + (K := K) (L := L) v := + (Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).codRestrict + (_root_.finitePlaceDecompositionGroup + (K := K) (L := L) v) + (fun x => by + rw [ + ← Reciprocity.chosenFinitePlaceArtinMonoidHom_range + (K := K) (L := L) v] + exact ⟨x, rfl⟩) + +open scoped Classical in +/-- The decomposition-group-valued finite-place Artin homomorphism is +surjective. -/ +theorem chosenFinitePlaceArtinToDecompositionGroup_surjective + (v : HeightOneSpectrum (𝓞 K)) : + Function.Surjective + (chosenFinitePlaceArtinToDecompositionGroup + (K := K) (L := L) v) := by + intro g + have hg : + (g : L ≃ₐ[K] L) ∈ + (Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).range := by + rw [ + Reciprocity.chosenFinitePlaceArtinMonoidHom_range + (K := K) (L := L) v] + exact g.property + obtain ⟨x, hx⟩ := hg + refine ⟨x, ?_⟩ + exact Subtype.ext hx + +open scoped Classical in +/-- The kernel of the decomposition-group-valued finite-place Artin +homomorphism is exactly the chosen local norm subgroup. -/ +theorem chosenFinitePlaceArtinToDecompositionGroup_ker + (v : HeightOneSpectrum (𝓞 K)) : + MonoidHom.ker + (chosenFinitePlaceArtinToDecompositionGroup + (K := K) (L := L) v) = + _root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := by + rw [chosenFinitePlaceArtinToDecompositionGroup, + MonoidHom.ker_codRestrict, + Reciprocity.chosenFinitePlaceArtinMonoidHom_ker] + +open scoped Classical in +/-- The first-isomorphism identification of the chosen local norm +quotient with the actual finite-place decomposition group. -/ +noncomputable def chosenFinitePlaceNormQuotientEquivDecompositionGroup + (v : HeightOneSpectrum (𝓞 K)) : + _root_.ChosenFinitePlaceNormQuotient + (K := K) (L := L) v ≃* + _root_.finitePlaceDecompositionGroup + (K := K) (L := L) v := + QuotientGroup.liftEquiv + (_root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v) + (chosenFinitePlaceArtinToDecompositionGroup_surjective + (K := K) (L := L) v) + (chosenFinitePlaceArtinToDecompositionGroup_ker + (K := K) (L := L) v).symm + +open scoped Classical in +/-- On a quotient representative, the finite-place first-isomorphism +equivalence is the decomposition-group-valued Artin map. -/ +@[simp] +theorem chosenFinitePlaceNormQuotientEquivDecompositionGroup_mk + (v : HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) : + chosenFinitePlaceNormQuotientEquivDecompositionGroup + (K := K) (L := L) v + (QuotientGroup.mk x) = + chosenFinitePlaceArtinToDecompositionGroup + (K := K) (L := L) v x := by + rfl + +open scoped Classical in +/-- The order of the chosen finite-place norm quotient is the actual +local extension degree. -/ +theorem chosenFinitePlaceNormQuotient_card_eq_finitePlaceLocalDegree + (v : HeightOneSpectrum (𝓞 K)) : + Nat.card + (_root_.ChosenFinitePlaceNormQuotient + (K := K) (L := L) v) = + _root_.finitePlaceLocalDegree + (K := K) (L := L) v := by + calc + Nat.card + (_root_.ChosenFinitePlaceNormQuotient + (K := K) (L := L) v) = + Nat.card + (_root_.finitePlaceDecompositionGroup + (K := K) (L := L) v) := + Nat.card_congr + (chosenFinitePlaceNormQuotientEquivDecompositionGroup + (K := K) (L := L) v).toEquiv + _ = + _root_.finitePlaceLocalDegree + (K := K) (L := L) v := + _root_.finitePlaceDecompositionGroup_card_eq_localDegree + (K := K) (L := L) v + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FullConductorRayClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FullConductorRayClassField.lean new file mode 100644 index 0000000000..6b3b0aa7df --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FullConductorRayClassField.lean @@ -0,0 +1,51 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorInfinitePart +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization +/-! +# Full conductors and ray class field containment + +This module identifies the full conductor of a finite abelian extension +as the least modulus of a selected ray class field into which the extension +embeds. The proof combines the ray-field embedding criterion with the +minimality theorem for the full conductor. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- A finite abelian extension embeds in the selected ray class field +exactly when the modulus is at least its full conductor. -/ +theorem nonempty_algHom_to_rayClassField_iff_fullConductor_le + (L : Type) [Field L] [NumberField L] + [Algebra K L] [FiniteDimensional K L] + [IsAbelianGalois K L] + (m : RayClass.Modulus K) : + Nonempty (L →ₐ[K] rayClassField K m) ↔ + (ideleClassNormConductorialSubgroup + (K := K) (L := L)).fullConductor ≤ m := by + rw [nonempty_algHom_to_rayClassField_iff_isDefiningModulus] + exact + (ideleClassNormConductorialSubgroup + (K := K) (L := L)).isDefiningModulus_iff_fullConductor_le m + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldComparison.lean new file mode 100644 index 0000000000..2f076afdca --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldComparison.lean @@ -0,0 +1,433 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassField +/-! +# Comparison of the big and small Hilbert class fields + +This file identifies the canonical transition from the big-Hilbert +reciprocity quotient to the small-Hilbert reciprocity quotient with the +canonical map from the narrow class group to the ordinary class group. +It then transports the archimedean sign exact sequence to a precise +description of the kernel of that transition. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField + +variable {K : Type*} [Field K] [NumberField K] + +/-- Fix the canonical commutativity needed for Hilbert norm-subgroup +quotients in this module. -/ +private theorem hilbertClassFieldComparison_ideleClassGroupIsMulCommutative : + IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] hilbertClassFieldComparison_ideleClassGroupIsMulCommutative + +/-- Keep the real-sign quotient normality instance stable across declarations. -/ +local instance + hilbertClassFieldComparison_realSignGroupIsMulCommutative : + IsMulCommutative (RayClass.realSignGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +/-- On an idele representative, the big-Hilbert quotient equivalence is +the canonical representative in the narrow class group. -/ +theorem bigHilbertClassFieldQuotientEquivNarrowClassGroup_mk + (a : IdeleGroup K) : + bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K) + (QuotientGroup.mk' + (bigHilbertClassFieldNormSubgroup (K := K)) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a)) = + QuotientGroup.mk' + (RayClass.narrowDenominator (K := K)) a := by + rfl + +/-- On an idele representative, the small-Hilbert quotient equivalence is +the ordinary ideal-class map. -/ +theorem smallHilbertClassFieldQuotientEquivClassGroup_mk + (a : IdeleGroup K) : + smallHilbertClassFieldQuotientEquivClassGroup + (K := K) + (QuotientGroup.mk' + (smallHilbertClassFieldNormSubgroup (K := K)) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a)) = + IdeleGroup.idealClass a := by + rfl + +/-- Under the canonical quotient equivalences, the big-to-small Hilbert +transition is the map from the narrow class group to the ordinary class +group. -/ +theorem bigToSmallHilbertQuotient_compatible_with_narrowToClassGroup + (q : IdeleClassGroup K ⧸ + bigHilbertClassFieldNormSubgroup (K := K)) : + smallHilbertClassFieldQuotientEquivClassGroup + (K := K) + (bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient + (K := K) q) = + RayClass.narrowToClassGroup + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K) q) := by + obtain ⟨x, rfl⟩ := + QuotientGroup.mk'_surjective + (bigHilbertClassFieldNormSubgroup (K := K)) q + obtain ⟨a, rfl⟩ := + QuotientGroup.mk'_surjective + (IdeleGroup.principalSubgroup K) x + rw [bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient_mk, + smallHilbertClassFieldQuotientEquivClassGroup_mk, + bigHilbertClassFieldQuotientEquivNarrowClassGroup_mk, + RayClass.narrowToClassGroup_mk] + +/-- Homomorphism form of the compatibility between the Hilbert quotient +transition and the narrow-to-ordinary class-group map. -/ +theorem bigToSmallHilbertQuotient_compatibility : + (smallHilbertClassFieldQuotientEquivClassGroup + (K := K)).toMonoidHom.comp + (bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient + (K := K)) = + (RayClass.narrowToClassGroup (K := K)).comp + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).toMonoidHom := by + ext q + exact + bigToSmallHilbertQuotient_compatible_with_narrowToClassGroup + (K := K) q + +/-- The canonical map from real sign classes to the big-Hilbert +reciprocity quotient. -/ +def realSignToBigHilbertClassFieldQuotient : + RayClass.realSignGroup K →* + (IdeleClassGroup K ⧸ + bigHilbertClassFieldNormSubgroup (K := K)) := + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).symm.toMonoidHom.comp + (RayClass.signToNarrow (K := K)) + +/-- The real-sign map to the big-Hilbert quotient is the composite used in +its definition. -/ +@[simp] +theorem realSignToBigHilbertClassFieldQuotient_apply + (s : RayClass.realSignGroup K) : + realSignToBigHilbertClassFieldQuotient (K := K) s = + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).symm + (RayClass.signToNarrow (K := K) s) := + rfl + +/-- The kernel of the real-sign map to the big-Hilbert quotient is the +image of the sign classes of global integral units. -/ +theorem + integralUnitSign_range_eq_realSignToBigHilbertClassFieldQuotient_ker : + (RayClass.integralUnitSignToRealSign (K := K)).range = + (realSignToBigHilbertClassFieldQuotient (K := K)).ker := by + calc + (RayClass.integralUnitSignToRealSign (K := K)).range = + (RayClass.signToNarrow (K := K)).ker := + RayClass.integralUnitSignToRealSign_range_eq_signToNarrow_ker + (K := K) + _ = (realSignToBigHilbertClassFieldQuotient (K := K)).ker := by + ext s + rw [MonoidHom.mem_ker, MonoidHom.mem_ker] + change + RayClass.signToNarrow (K := K) s = 1 ↔ + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).symm + (RayClass.signToNarrow (K := K) s) = 1 + constructor + · intro hs + rw [hs, map_one] + · intro hs + apply + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).symm.injective + simpa only [map_one] using hs + +private theorem + realSignToBigHilbertClassFieldQuotient_range_le_bigToSmallHilbertKernel : + (realSignToBigHilbertClassFieldQuotient (K := K)).range ≤ + MonoidHom.ker + (bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient + (K := K)) := by + rintro q ⟨s, rfl⟩ + rw [MonoidHom.mem_ker] + apply + (smallHilbertClassFieldQuotientEquivClassGroup + (K := K)).injective + rw [ + bigToSmallHilbertQuotient_compatible_with_narrowToClassGroup, + realSignToBigHilbertClassFieldQuotient_apply, + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).apply_symm_apply, + map_one] + apply MonoidHom.mem_ker.mp + rw [← RayClass.signToNarrow_range_eq_narrowToClassGroup_ker] + exact ⟨s, rfl⟩ + +private theorem + bigToSmallHilbertKernel_le_realSignToBigHilbertClassFieldQuotient_range : + MonoidHom.ker + (bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient + (K := K)) ≤ + (realSignToBigHilbertClassFieldQuotient (K := K)).range := by + intro q hq + have hnarrow : + bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K) q ∈ + (RayClass.narrowToClassGroup (K := K)).ker := by + rw [MonoidHom.mem_ker] + rw [← + bigToSmallHilbertQuotient_compatible_with_narrowToClassGroup + (K := K) q] + rw [MonoidHom.mem_ker.mp hq, map_one] + have hsign : + bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K) q ∈ + (RayClass.signToNarrow (K := K)).range := by + rw [RayClass.signToNarrow_range_eq_narrowToClassGroup_ker] + exact hnarrow + obtain ⟨s, hs⟩ := hsign + refine ⟨s, ?_⟩ + change + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).symm + (RayClass.signToNarrow (K := K) s) = q + rw [hs, + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).symm_apply_apply] + +/-- The image of the real-sign map in the big-Hilbert quotient is +exactly the kernel of the transition to the small-Hilbert quotient. -/ +theorem + realSignToBigHilbertClassFieldQuotient_range_eq_bigToSmallHilbertKernel : + (realSignToBigHilbertClassFieldQuotient (K := K)).range = + MonoidHom.ker + (bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient + (K := K)) := by + exact le_antisymm + (realSignToBigHilbertClassFieldQuotient_range_le_bigToSmallHilbertKernel + (K := K)) + (bigToSmallHilbertKernel_le_realSignToBigHilbertClassFieldQuotient_range + (K := K)) + +/-- The archimedean sign exact sequence written directly on the big and +small Hilbert reciprocity quotients: + +`1 → unit signs → real signs → big Hilbert quotient + → small Hilbert quotient → 1`. -/ +theorem hilbertClassFieldSign_exact_sequence : + Function.Injective + (RayClass.integralUnitSignToRealSign (K := K)) ∧ + (RayClass.integralUnitSignToRealSign (K := K)).range = + (realSignToBigHilbertClassFieldQuotient (K := K)).ker ∧ + (realSignToBigHilbertClassFieldQuotient (K := K)).range = + MonoidHom.ker + (bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient + (K := K)) ∧ + Function.Surjective + (bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient + (K := K)) := by + exact + ⟨RayClass.integralUnitSignToRealSign_injective, + integralUnitSign_range_eq_realSignToBigHilbertClassFieldQuotient_ker + (K := K), + realSignToBigHilbertClassFieldQuotient_range_eq_bigToSmallHilbertKernel + (K := K), + bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient_surjective + (K := K)⟩ + +private theorem bigHilbertQuotientEquiv_mem_narrowClassKernel + (q : MonoidHom.ker + (bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient + (K := K))) : + bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K) q.1 ∈ + MonoidHom.ker (RayClass.narrowToClassGroup (K := K)) := by + rw [MonoidHom.mem_ker] + rw [← + bigToSmallHilbertQuotient_compatible_with_narrowToClassGroup + (K := K) q.1] + rw [MonoidHom.mem_ker.mp q.2, map_one] + +private theorem bigHilbertQuotientEquiv_symm_mem_bigToSmallKernel + (c : MonoidHom.ker + (RayClass.narrowToClassGroup (K := K))) : + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).symm c.1 ∈ + MonoidHom.ker + (bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient + (K := K)) := by + rw [MonoidHom.mem_ker] + apply + (smallHilbertClassFieldQuotientEquivClassGroup + (K := K)).injective + rw [ + bigToSmallHilbertQuotient_compatible_with_narrowToClassGroup, + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).apply_symm_apply, + MonoidHom.mem_ker.mp c.2, map_one] + +/-- The kernel of the big-to-small Hilbert quotient transition is +canonically the kernel of the map from narrow to ordinary ideal classes. -/ +def bigToSmallHilbertKernelEquivNarrowClassKernel : + MonoidHom.ker + (bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient + (K := K)) ≃* + MonoidHom.ker (RayClass.narrowToClassGroup (K := K)) where + toFun q := + ⟨bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K) q.1, + by exact bigHilbertQuotientEquiv_mem_narrowClassKernel (K := K) q⟩ + invFun c := + ⟨(bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).symm c.1, + by exact bigHilbertQuotientEquiv_symm_mem_bigToSmallKernel (K := K) c⟩ + left_inv q := by + apply Subtype.ext + exact + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).symm_apply_apply q.1 + right_inv c := by + apply Subtype.ext + exact + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).apply_symm_apply c.1 + map_mul' q r := by + apply Subtype.ext + exact + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).map_mul q.1 r.1 + +private theorem signToNarrow_mem_narrowClassKernel + (s : RayClass.realSignGroup K) : + RayClass.signToNarrow (K := K) s ∈ + MonoidHom.ker (RayClass.narrowToClassGroup (K := K)) := by + rw [← + RayClass.signToNarrow_range_eq_narrowToClassGroup_ker + (K := K)] + exact ⟨s, rfl⟩ + +/-- The real-sign map with codomain restricted to the kernel of the +narrow-to-ordinary class-group map. -/ +def realSignToNarrowClassKernel : + RayClass.realSignGroup K →* + MonoidHom.ker (RayClass.narrowToClassGroup (K := K)) where + toFun s := + ⟨RayClass.signToNarrow (K := K) s, + by exact signToNarrow_mem_narrowClassKernel (K := K) s⟩ + map_one' := by + apply Subtype.ext + exact map_one (RayClass.signToNarrow (K := K)) + map_mul' s t := by + apply Subtype.ext + exact map_mul (RayClass.signToNarrow (K := K)) s t + +/-- The restricted real-sign map has the same underlying narrow ideal class +as `RayClass.signToNarrow`. -/ +@[simp] +theorem realSignToNarrowClassKernel_apply + (s : RayClass.realSignGroup K) : + (realSignToNarrowClassKernel (K := K) s : + RayClass.NarrowClassGroup K) = + RayClass.signToNarrow (K := K) s := + rfl + +/-- Every narrow ideal class mapping trivially to the ordinary class +group is represented by a real sign class. -/ +theorem realSignToNarrowClassKernel_surjective : + Function.Surjective + (realSignToNarrowClassKernel (K := K)) := by + intro c + have hc : + c.1 ∈ (RayClass.signToNarrow (K := K)).range := by + rw [RayClass.signToNarrow_range_eq_narrowToClassGroup_ker] + exact c.2 + obtain ⟨s, hs⟩ := hc + refine ⟨s, ?_⟩ + apply Subtype.ext + exact hs + +/-- Restricting the codomain of the real-sign map does not change its +kernel. -/ +theorem realSignToNarrowClassKernel_ker : + (realSignToNarrowClassKernel (K := K)).ker = + (RayClass.signToNarrow (K := K)).ker := by + ext s + rw [MonoidHom.mem_ker, MonoidHom.mem_ker] + constructor + · intro hs + exact congrArg Subtype.val hs + · intro hs + apply Subtype.ext + exact hs + +/-- The kernel of the narrow-to-ordinary class-group map is the quotient +of real sign classes by the sign classes of global integral units. -/ +def realSignModuloIntegralUnitSignsEquivNarrowClassKernel : + RayClass.realSignGroup K ⧸ + (RayClass.integralUnitSignToRealSign (K := K)).range ≃* + MonoidHom.ker (RayClass.narrowToClassGroup (K := K)) := by + let f := realSignToNarrowClassKernel (K := K) + have hf : Function.Surjective f := + realSignToNarrowClassKernel_surjective (K := K) + have hker : + (RayClass.integralUnitSignToRealSign (K := K)).range = + f.ker := by + calc + (RayClass.integralUnitSignToRealSign (K := K)).range = + (RayClass.signToNarrow (K := K)).ker := + RayClass.integralUnitSignToRealSign_range_eq_signToNarrow_ker + (K := K) + _ = f.ker := + (realSignToNarrowClassKernel_ker (K := K)).symm + exact + (QuotientGroup.quotientMulEquivOfEq hker).trans + (QuotientGroup.quotientKerEquivOfSurjective + (φ := f) hf) + +/-- The relative big/small Hilbert kernel is exactly the quotient of real +sign classes by the sign classes contributed by global integral units. -/ +def realSignModuloIntegralUnitSignsEquivBigToSmallHilbertKernel : + RayClass.realSignGroup K ⧸ + (RayClass.integralUnitSignToRealSign (K := K)).range ≃* + MonoidHom.ker + (bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient + (K := K)) := + (realSignModuloIntegralUnitSignsEquivNarrowClassKernel + (K := K)).trans + (bigToSmallHilbertKernelEquivNarrowClassKernel + (K := K)).symm + +/-- The order of the relative big/small Hilbert kernel is the order of +the real-sign quotient modulo signs of global integral units. -/ +theorem bigToSmallHilbertKernel_card_eq_realSignQuotient_card : + Nat.card + (MonoidHom.ker + (bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient + (K := K))) = + Nat.card + (RayClass.realSignGroup K ⧸ + (RayClass.integralUnitSignToRealSign (K := K)).range) := + (Nat.card_congr + (realSignModuloIntegralUnitSignsEquivBigToSmallHilbertKernel + (K := K)).toEquiv).symm + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximalSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximalSubextension.lean new file mode 100644 index 0000000000..0d1a29fba1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximalSubextension.lean @@ -0,0 +1,898 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.EmbeddedAbelianSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldUnramifiedMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertNormCharacterization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation +public import Mathlib.NumberTheory.NumberField.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.ClosedFixingSubgroup +/-! +# The maximal finite-unramified abelian subextension + +The selected big Hilbert class field is characterized here in actual +field order. Its abstract norm subgroup in the rational absolute +idele-class formation is identified exactly with the intrinsic +big-Hilbert subgroup of its fixed-field base. Every finite abelian +subextension whose actual fixed-field extension is unramified at all +finite places has a larger norm subgroup, hence lies below the selected +big Hilbert class field by the order-reversing finite classification. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open ClassFormation KummerTheory +open LocalClassFieldTheory NumberField Reciprocity + +private structure BigHilbertTransportedAddSubgroupData + {A B : Type} [AddGroup A] [AddGroup B] + (e : A ≃+ B) (H : AddSubgroup A) where + subgroup : AddSubgroup B + map_symm : subgroup.map e.symm.toAddMonoidHom = H + mem_iff (x : B) : x ∈ subgroup ↔ e.symm x ∈ H + +private def bigHilbertTransportedAddSubgroupData + {A B : Type} [AddGroup A] [AddGroup B] + (e : A ≃+ B) (H : AddSubgroup A) : + BigHilbertTransportedAddSubgroupData e H where + subgroup := H.map e.toAddMonoidHom + map_symm := + (AddSubgroup.map_symm_eq_iff_map_eq + (K := H) (H := H.map e.toAddMonoidHom) (e := e)).2 rfl + mem_iff := by + intro x + constructor + · rintro ⟨y, hy, rfl⟩ + simpa using hy + · intro hx + exact ⟨e.symm x, hx, e.apply_symm_apply x⟩ + +private theorem bigHilbertAddSubgroup_eq_of_map_symm_eq + {A B : Type} [AddGroup A] [AddGroup B] + (e : A ≃+ B) (H J : AddSubgroup B) + (h : H.map e.symm.toAddMonoidHom = + J.map e.symm.toAddMonoidHom) : + H = J := by + exact AddSubgroup.map_injective e.symm.injective h + +/-- The intrinsic big-Hilbert norm subgroup of an actual rational fixed +field, transported into the rational absolute idele-class formation. -/ +noncomputable def bigHilbertNormSubgroupInRationalClassFormation + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + AddSubgroup + (ambientFixedAddSubgroup + rationalIdeleClassRepresentation K.field) := + (bigHilbertClassFieldNormSubgroup + (K := abstractFixedField + ℚ (SeparableClosure ℚ) K.field)).toAddSubgroup.map + (rationalAbstractFixedFieldIdeleClassEquivFixed + K.field).toAddMonoidHom + +private noncomputable def finiteAbstractBigHilbertIntrinsicNormSubgroup + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + AddSubgroup + (Additive + (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) K.field))) := + (bigHilbertClassFieldNormSubgroup + (K := abstractFixedField ℚ (SeparableClosure ℚ) K.field)).toAddSubgroup + +private noncomputable def finiteAbstractBigHilbertTransportData + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + BigHilbertTransportedAddSubgroupData + (rationalAbstractFixedFieldIdeleClassEquivFixed K.field) + (finiteAbstractBigHilbertIntrinsicNormSubgroup K) := + bigHilbertTransportedAddSubgroupData + (rationalAbstractFixedFieldIdeleClassEquivFixed K.field) + (finiteAbstractBigHilbertIntrinsicNormSubgroup K) + +private theorem bigHilbertNormSubgroupInRationalClassFormation_mem_iff + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (x : ambientFixedAddSubgroup rationalIdeleClassRepresentation K.field) : + x ∈ bigHilbertNormSubgroupInRationalClassFormation K ↔ + (rationalAbstractFixedFieldIdeleClassEquivFixed K.field).symm x ∈ + finiteAbstractBigHilbertIntrinsicNormSubgroup K := + (finiteAbstractBigHilbertTransportData K).mem_iff x + +/-- The fixed-field idele-class equivalence at the selected big-Hilbert +base, named once so later subgroup comparisons do not reconstruct it. -/ +private noncomputable def bigHilbertClassFieldMaximalIdeleClassEquiv + (K : Type) [Field K] [NumberField K] : + Additive (IdeleClassGroup (bigHilbertClassFieldBase K)) ≃+ + ambientFixedAddSubgroup rationalIdeleClassRepresentation + (bigHilbertClassFieldBaseSubgroup K) := + rationalAbstractFixedFieldIdeleClassEquivFixed + (bigHilbertClassFieldBaseSubgroup K) + +/-- The intrinsic ordinary norm subgroup at the selected base, with its +additive carrier fixed in the declaration type. -/ +private noncomputable def bigHilbertClassFieldMaximalIntrinsicNormSubgroup + (K : Type) [Field K] [NumberField K] : + AddSubgroup (Additive (IdeleClassGroup (bigHilbertClassFieldBase K))) := + (bigHilbertClassFieldNormSubgroup + (K := bigHilbertClassFieldBase K)).toAddSubgroup + +/-- The selected abstract norm subgroup, with its ambient additive carrier +fixed once in the declaration type. -/ +private noncomputable def bigHilbertClassFieldMaximalActualNormEndpoint + (K : Type) [Field K] [NumberField K] : + AddSubgroup + (ambientFixedAddSubgroup rationalIdeleClassRepresentation + (bigHilbertClassFieldBaseSubgroup K)) := + (bigHilbertClassFieldSubextension K).normSubgroup + rationalIdeleClassRepresentation + +private noncomputable def bigHilbertClassFieldMaximalTransportData + (K : Type) [Field K] [NumberField K] : + BigHilbertTransportedAddSubgroupData + (bigHilbertClassFieldMaximalIdeleClassEquiv K) + (bigHilbertClassFieldMaximalIntrinsicNormSubgroup K) := + bigHilbertTransportedAddSubgroupData + (bigHilbertClassFieldMaximalIdeleClassEquiv K) + (bigHilbertClassFieldMaximalIntrinsicNormSubgroup K) + +/-- A short typed name for the transported intrinsic subgroup used below. -/ +private noncomputable def bigHilbertClassFieldMaximalNormEndpoint + (K : Type) [Field K] [NumberField K] : + AddSubgroup + (ambientFixedAddSubgroup rationalIdeleClassRepresentation + (bigHilbertClassFieldBaseSubgroup K)) := + (bigHilbertClassFieldMaximalTransportData K).subgroup + +private theorem bigHilbertClassFieldMaximalNormEndpoint_map_symm + (K : Type) [Field K] [NumberField K] : + (bigHilbertClassFieldMaximalNormEndpoint K).map + (bigHilbertClassFieldMaximalIdeleClassEquiv K).symm.toAddMonoidHom = + bigHilbertClassFieldMaximalIntrinsicNormSubgroup K := + (bigHilbertClassFieldMaximalTransportData K).map_symm + +private theorem bigHilbertClassFieldMaximalNormEndpoint_mem_iff + (K : Type) [Field K] [NumberField K] + (x : ambientFixedAddSubgroup rationalIdeleClassRepresentation + (bigHilbertClassFieldBaseSubgroup K)) : + x ∈ bigHilbertClassFieldMaximalNormEndpoint K ↔ + (bigHilbertClassFieldMaximalIdeleClassEquiv K).symm x ∈ + bigHilbertClassFieldMaximalIntrinsicNormSubgroup K := + (bigHilbertClassFieldMaximalTransportData K).mem_iff x + +private theorem bigHilbertClassFieldMaximalNormEndpoint_eq_public + (K : Type) [Field K] [NumberField K] : + bigHilbertClassFieldMaximalNormEndpoint K = + bigHilbertNormSubgroupInRationalClassFormation + (numberFieldTowerFiniteAbstractField K + (bigHilbertClassFieldNormAmbient K)) := by + rfl + +/-- Mapping the selected abstract norm subgroup back to the ordinary +idele-class group gives the named intrinsic subgroup. -/ +private theorem bigHilbertClassFieldMaximalNormSubgroup_map_symm + (K : Type) [Field K] [NumberField K] : + (bigHilbertClassFieldMaximalActualNormEndpoint K).map + (bigHilbertClassFieldMaximalIdeleClassEquiv K).symm.toAddMonoidHom = + bigHilbertClassFieldMaximalIntrinsicNormSubgroup K := by + let L := + bigHilbertClassFieldSubextension K + let F := + bigHilbertClassFieldBase K + let e := + rationalAbstractFixedFieldIdeleClassEquivFixed + (bigHilbertClassFieldBaseSubgroup K) + let hLfinite : Finite + ((bigHilbertClassFieldBaseSubgroup K).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (bigHilbertClassFieldBaseSubgroup K) + L.field L.below) := + L.finite + calc + (L.normSubgroup rationalIdeleClassRepresentation).map + e.symm.toAddMonoidHom = + (_root_.ideleClassNorm + F (bigHilbertClassField K)).range.toAddSubgroup := by + change + (finiteNormSubgroup rationalIdeleClassRepresentation + (bigHilbertClassFieldBaseSubgroup K) + L.field L.below).map + e.symm.toAddMonoidHom = + (_root_.ideleClassNorm + F (bigHilbertClassField K)).range.toAddSubgroup + simpa only [L, F, e, bigHilbertClassField, + bigHilbertClassFieldBase, + bigHilbertClassFieldMaximalIdeleClassEquiv] using + (map_rationalFiniteNormSubgroup_eq_ordinaryIdeleClassNormRange_concrete + (bigHilbertClassFieldBaseSubgroup K) + (bigHilbertClassFieldSubextension K).field + (bigHilbertClassFieldSubextension K).below + (bigHilbertClassFieldSubextension K).normal) + _ = bigHilbertClassFieldMaximalIntrinsicNormSubgroup K := by + exact + congrArg Subgroup.toAddSubgroup + (bigHilbertClassField_ideleClassNorm_range_eq_intrinsic + (K := K)) + +/-- Membership in the selected abstract norm subgroup is detected after +applying the named inverse fixed-field equivalence. -/ +private theorem bigHilbertClassFieldMaximalActualNormEndpoint_mem_iff + (K : Type) [Field K] [NumberField K] : + ∀ x : ambientFixedAddSubgroup rationalIdeleClassRepresentation + (bigHilbertClassFieldBaseSubgroup K), + x ∈ bigHilbertClassFieldMaximalActualNormEndpoint K ↔ + (bigHilbertClassFieldMaximalIdeleClassEquiv K).symm x ∈ + bigHilbertClassFieldMaximalIntrinsicNormSubgroup K := by + intro x + have hmem := + congrArg + (fun S => + (bigHilbertClassFieldMaximalIdeleClassEquiv K).symm x ∈ S) + (bigHilbertClassFieldMaximalNormSubgroup_map_symm K) + constructor + · intro hx + exact hmem.mp ⟨x, hx, rfl⟩ + · intro hx + obtain ⟨y, hy, hyx⟩ := hmem.mpr hx + have hxy : y = x := + (bigHilbertClassFieldMaximalIdeleClassEquiv K).symm.injective hyx + subst y + exact hy + +private theorem bigHilbertClassFieldMaximalNormSubgroup_eq_endpoint + (K : Type) [Field K] [NumberField K] : + bigHilbertClassFieldMaximalActualNormEndpoint K = + bigHilbertClassFieldMaximalNormEndpoint K := by + apply AddSubgroup.ext + intro x + exact + (bigHilbertClassFieldMaximalActualNormEndpoint_mem_iff K x).trans + (bigHilbertClassFieldMaximalNormEndpoint_mem_iff K x).symm + +/-- The selected big Hilbert class-field subextension realizes exactly +the intrinsic big-Hilbert norm subgroup in the rational absolute class +formation. -/ +@[simp] +theorem bigHilbertClassFieldSubextension_normSubgroup + (K : Type) [Field K] [NumberField K] : + (bigHilbertClassFieldSubextension K).normSubgroup + rationalIdeleClassRepresentation = + bigHilbertNormSubgroupInRationalClassFormation + (numberFieldTowerFiniteAbstractField K + (bigHilbertClassFieldNormAmbient K)) := by + calc + (bigHilbertClassFieldSubextension K).normSubgroup + rationalIdeleClassRepresentation = + bigHilbertClassFieldMaximalActualNormEndpoint K := by + rfl + _ = + bigHilbertClassFieldMaximalNormEndpoint K := + bigHilbertClassFieldMaximalNormSubgroup_eq_endpoint K + _ = bigHilbertNormSubgroupInRationalClassFormation + (numberFieldTowerFiniteAbstractField K + (bigHilbertClassFieldNormAmbient K)) := + bigHilbertClassFieldMaximalNormEndpoint_eq_public K + +section GeneralFixedFieldContainment + +variable + (K₀ : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P₀ : FiniteAbelianSubextension K₀.field) + +local instance maximalSubextensionBaseQuotientFinite : + Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K₀.field (le_baseField K₀.field)) := + K₀.finite + +local instance maximalSubextensionRelativeQuotientFinite : + Finite + (K₀.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + K₀.field P₀.field P₀.below) := + P₀.finite + +noncomputable local instance maximalSubextensionBaseFiniteDimensional : + FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) K₀.field) := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K₀.field K₀.finite + +noncomputable local instance maximalSubextensionRelativeFiniteDimensional : + FiniteDimensional + (abstractFixedField ℚ (SeparableClosure ℚ) K₀.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P₀.below) := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + K₀.field P₀.field P₀.below K₀.finite P₀.finite + +local instance maximalSubextensionRelativeScalarTower : + IsScalarTower ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) K₀.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P₀.below) := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + +noncomputable local instance maximalSubextensionTopFiniteDimensional : + FiniteDimensional ℚ + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P₀.below) := + FiniteDimensional.trans ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) K₀.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P₀.below) + +noncomputable local instance maximalSubextensionBaseNumberField : + NumberField + (abstractFixedField ℚ (SeparableClosure ℚ) K₀.field) := + NumberField.of_module_finite ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) K₀.field) + +noncomputable local instance maximalSubextensionTopNumberField : + NumberField + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P₀.below) := + NumberField.of_module_finite ℚ + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P₀.below) + +noncomputable local instance maximalSubextensionRelativeIsGalois : + IsGalois + (abstractFixedField ℚ (SeparableClosure ℚ) K₀.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P₀.below) := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) + K₀.field P₀.field P₀.below P₀.normal + +/-- The intrinsic big-Hilbert norm subgroup is contained in the norm +subgroup of the specified finite abelian subextension. -/ +def bigHilbertNormSubgroupContainedInRationalClassFormation + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension K.field) : Prop := + bigHilbertNormSubgroupInRationalClassFormation K ≤ + P.normSubgroup rationalIdeleClassRepresentation + +/-- The actual fixed-field extension represented by a finite abelian +subextension is unramified at every finite place. -/ +def finiteAbelianSubextensionIsUnramifiedAtFinitePlaces + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension K.field) : Prop := + IsUnramifiedAtFinitePlaces + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) + +/-- Finite-prime unramifiedness of an actual finite abelian fixed-field +extension forces its abstract norm subgroup to contain the intrinsic +big-Hilbert subgroup. -/ +theorem + bigHilbertNormSubgroupInRationalClassFormation_le_normSubgroup_of_unramifiedAtFinitePlaces + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension K.field) : + finiteAbelianSubextensionIsUnramifiedAtFinitePlaces K P → + bigHilbertNormSubgroupContainedInRationalClassFormation K P := by + classical + intro hunramified + unfold finiteAbelianSubextensionIsUnramifiedAtFinitePlaces at hunramified + let F := + abstractFixedField ℚ (SeparableClosure ℚ) K.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let e := + rationalAbstractFixedFieldIdeleClassEquivFixed K.field + have hnormMap : + (P.normSubgroup rationalIdeleClassRepresentation).map + e.symm.toAddMonoidHom = + (_root_.ideleClassNorm F E).range.toAddSubgroup := by + change + (finiteNormSubgroup rationalIdeleClassRepresentation + K.field P.field P.below).map + e.symm.toAddMonoidHom = + (_root_.ideleClassNorm F E).range.toAddSubgroup + exact + map_rationalFiniteNormSubgroup_eq_ordinaryIdeleClassNormRange_concrete + K.field P.field P.below P.normal + have hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := F) (L := E) = ∅ := by + apply Finset.eq_empty_iff_forall_notMem.mpr + intro v hv + rw [_root_.mem_ramifiedBaseFinitePlaces_iff] at hv + obtain ⟨Q, _hQ, hQramified⟩ := hv + exact hQramified (hunramified Q) + have hordinary : + bigHilbertClassFieldNormSubgroup (K := F) ≤ + (_root_.ideleClassNorm F E).range := + bigHilbertClassFieldNormSubgroup_le_ideleClassNorm_range_of_no_ramifiedFinitePlaces + (K := F) (L := E) hunramifiedFinite + unfold bigHilbertNormSubgroupContainedInRationalClassFormation + intro x hx + have hxIntrinsic := + (bigHilbertNormSubgroupInRationalClassFormation_mem_iff K x).mp hx + have hmem := + congrArg (fun S => e.symm x ∈ S) hnormMap + have hxMap := hmem.mpr (hordinary hxIntrinsic) + obtain ⟨y, hy, hyx⟩ := hxMap + have hxy : y = x := e.symm.injective hyx + subst y + exact hy + +end GeneralFixedFieldContainment + +/-- A finite abelian subextension of the selected rational fixed-field base +is unramified at every finite place. -/ +def bigHilbertFiniteAbelianSubextensionIsUnramifiedAtFinitePlaces + (K : Type) [Field K] [NumberField K] + (P : FiniteAbelianSubextension + (bigHilbertClassFieldBaseSubgroup K)) : Prop := + finiteAbelianSubextensionIsUnramifiedAtFinitePlaces + (numberFieldTowerFiniteAbstractField K + (bigHilbertClassFieldNormAmbient K)) P + +section FixedFieldMaximalityInstances + +variable + (K : Type) [Field K] [NumberField K] + (P : FiniteAbelianSubextension + (bigHilbertClassFieldBaseSubgroup K)) + +local instance bigHilbertMaximalRelativeQuotientFinite : + Finite + ((bigHilbertClassFieldBaseSubgroup K).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (bigHilbertClassFieldBaseSubgroup K) + P.field P.below) := + P.finite + +noncomputable local instance bigHilbertMaximalRelativeFiniteDimensional : + FiniteDimensional + (bigHilbertClassFieldBase K) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + (bigHilbertClassFieldBaseSubgroup K) + P.field P.below inferInstance P.finite + +local instance bigHilbertMaximalRelativeScalarTower : + IsScalarTower ℚ + (bigHilbertClassFieldBase K) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + +noncomputable local instance bigHilbertMaximalTopFiniteDimensional : + FiniteDimensional ℚ + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) := + FiniteDimensional.trans ℚ + (bigHilbertClassFieldBase K) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) + +noncomputable local instance bigHilbertMaximalTopNumberField : + NumberField + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) := + NumberField.of_module_finite ℚ + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) + +noncomputable local instance bigHilbertMaximalRelativeIsGalois : + IsGalois + (bigHilbertClassFieldBase K) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) + (bigHilbertClassFieldBaseSubgroup K) + P.field P.below P.normal + +/-- Every finite abelian subextension of the same rational fixed-field +base which is unramified at all finite places is contained in the +selected big Hilbert class-field subextension. -/ +theorem + finiteUnramifiedAbelianSubextension_le_bigHilbertClassFieldSubextension + (K : Type) [Field K] [NumberField K] + (P : FiniteAbelianSubextension + (bigHilbertClassFieldBaseSubgroup K)) : + bigHilbertFiniteAbelianSubextensionIsUnramifiedAtFinitePlaces K P → + P ≤ bigHilbertClassFieldSubextension K := by + intro hunramified + let KF := + numberFieldTowerFiniteAbstractField K + (bigHilbertClassFieldNormAmbient K) + apply + (FiniteAbelianSubextension.le_iff_normSubgroup_le + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + KF P (bigHilbertClassFieldSubextension K)).2 + have hSelected : + (bigHilbertClassFieldSubextension K).normSubgroup + rationalIdeleClassRepresentation = + bigHilbertNormSubgroupInRationalClassFormation KF := + bigHilbertClassFieldSubextension_normSubgroup K + have hOther : + bigHilbertNormSubgroupContainedInRationalClassFormation KF P := + bigHilbertNormSubgroupInRationalClassFormation_le_normSubgroup_of_unramifiedAtFinitePlaces + KF P (by + simpa only [KF, + bigHilbertFiniteAbelianSubextensionIsUnramifiedAtFinitePlaces] using + hunramified) + unfold bigHilbertNormSubgroupContainedInRationalClassFormation at hOther + calc + (bigHilbertClassFieldSubextension K).normSubgroup + rationalIdeleClassRepresentation = + bigHilbertNormSubgroupInRationalClassFormation KF := hSelected + _ ≤ P.normSubgroup rationalIdeleClassRepresentation := hOther + +end FixedFieldMaximalityInstances + +/-- The selected big Hilbert class field is genuinely finite-unramified, +and its finite abelian subextension is maximal among all actual +finite-unramified abelian subextensions of the same rational fixed-field +base. -/ +theorem + bigHilbertClassFieldSubextension_isFiniteUnramifiedAndMaximalAbelian + (K : Type) [Field K] [NumberField K] : + IsUnramifiedAtFinitePlaces K (bigHilbertClassField K) ∧ + ∀ P : FiniteAbelianSubextension + (bigHilbertClassFieldBaseSubgroup K), + bigHilbertFiniteAbelianSubextensionIsUnramifiedAtFinitePlaces K P → + P ≤ bigHilbertClassFieldSubextension K := by + constructor + · exact bigHilbertClassField_isUnramifiedAtFinitePlaces K + · intro P + exact + finiteUnramifiedAbelianSubextension_le_bigHilbertClassFieldSubextension + K P + +/-! +## Maximality over the original number field + +The preceding order statement lives over the fixed-field copy of the +base used by the rational absolute class formation. We now embed an +arbitrary actual finite abelian extension `E / K` compatibly with that +copy, apply the fixed-field maximality theorem there, and restrict its +ambient embedding to the selected big Hilbert class field. +-/ + +/-- The distinguished embedding of the original number field into the +rational separable closure underlying the selected big Hilbert class +field. -/ +noncomputable def bigHilbertClassFieldBaseEmbedding + (K : Type) [Field K] [NumberField K] : + K →ₐ[ℚ] SeparableClosure ℚ := + numberFieldTowerLowerEmbedding K + (bigHilbertClassFieldNormAmbient K) + +/-- The canonical fixed-field equivalence has the distinguished base +embedding as its underlying map into the rational separable closure. -/ +theorem bigHilbertClassFieldBaseEquiv_coe + (K : Type) [Field K] [NumberField K] + (x : K) : + ((bigHilbertClassFieldBaseEquiv (K := K) x : + bigHilbertClassFieldBase K) : + SeparableClosure ℚ) = + bigHilbertClassFieldBaseEmbedding K x := by + rfl + +/-- An actual finite extension of `K`, embedded into the rational +separable closure so that its restriction to `K` is exactly the base +embedding used by the selected big Hilbert class field. -/ +noncomputable def bigHilbertClassFieldCompatibleEmbedding + (K E : Type) + [Field K] [NumberField K] + [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] : + E →ₐ[ℚ] SeparableClosure ℚ := + Classical.choose + (IsAlgClosed.surjective_domRestrict_of_isAlgebraic + (K := ℚ) (L := K) (E := E) + (M := SeparableClosure ℚ) + (bigHilbertClassFieldBaseEmbedding K)) + +/-- Compatibility of the chosen ambient embedding with the selected +copy of the original base field. -/ +@[simp] +theorem bigHilbertClassFieldCompatibleEmbedding_restrictDomain + (K E : Type) + [Field K] [NumberField K] + [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] : + (bigHilbertClassFieldCompatibleEmbedding K E).domRestrict K = + bigHilbertClassFieldBaseEmbedding K := + Classical.choose_spec + (IsAlgClosed.surjective_domRestrict_of_isAlgebraic + (K := ℚ) (L := K) (E := E) + (M := SeparableClosure ℚ) + (bigHilbertClassFieldBaseEmbedding K)) + +/-- Evaluation on the original scalar map agrees with the distinguished +base embedding. -/ +@[simp] +theorem bigHilbertClassFieldCompatibleEmbedding_algebraMap + (K E : Type) + [Field K] [NumberField K] + [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] + (x : K) : + bigHilbertClassFieldCompatibleEmbedding K E + (algebraMap K E x) = + bigHilbertClassFieldBaseEmbedding K x := by + have h := + DFunLike.congr_fun + (bigHilbertClassFieldCompatibleEmbedding_restrictDomain K E) x + exact h + +/-- The fixing subgroup of the compatible embedded copy of `K` is the +base subgroup of the selected big Hilbert class field. -/ +@[simp] +theorem bigHilbertClassFieldCompatibleEmbedding_baseSubgroup + (K E : Type) + [Field K] [NumberField K] + [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] : + numberFieldEmbeddedBaseSubgroup K E + (bigHilbertClassFieldCompatibleEmbedding K E) = + bigHilbertClassFieldBaseSubgroup K := by + change + RamificationTheory.closedFixingSubgroup ℚ (SeparableClosure ℚ) + ((bigHilbertClassFieldCompatibleEmbedding K E).domRestrict K).fieldRange = + RamificationTheory.closedFixingSubgroup ℚ (SeparableClosure ℚ) + (bigHilbertClassFieldBaseEmbedding K).fieldRange + exact + congrArg + (fun i : K →ₐ[ℚ] SeparableClosure ℚ => + RamificationTheory.closedFixingSubgroup ℚ + (SeparableClosure ℚ) i.fieldRange) + (bigHilbertClassFieldCompatibleEmbedding_restrictDomain K E) + +/-- The actual finite abelian extension `E / K`, represented inside the +same rational absolute Galois group as the selected big Hilbert class +field. -/ +noncomputable def bigHilbertClassFieldEmbeddedAbelianSubextension + (K E : Type) + [Field K] [NumberField K] + [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] + [IsAbelianGalois K E] : + FiniteAbelianSubextension + (bigHilbertClassFieldBaseSubgroup K) := + numberFieldEmbeddedAbelianSubextension K E + (bigHilbertClassFieldCompatibleEmbedding K E) + (bigHilbertClassFieldBaseSubgroup K) + (bigHilbertClassFieldCompatibleEmbedding_baseSubgroup K E) + +/-- The top subgroup of the embedded abelian subextension is exactly +the fixing subgroup of the compatible embedded copy of `E`. -/ +@[simp] +theorem bigHilbertClassFieldEmbeddedAbelianSubextension_field + (K E : Type) + [Field K] [NumberField K] + [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] + [IsAbelianGalois K E] : + (bigHilbertClassFieldEmbeddedAbelianSubextension K E).field = + numberFieldEmbeddedTopSubgroup K E + (bigHilbertClassFieldCompatibleEmbedding K E) := by + exact + numberFieldEmbeddedAbelianSubextension_field K E + (bigHilbertClassFieldCompatibleEmbedding K E) + (bigHilbertClassFieldBaseSubgroup K) + (bigHilbertClassFieldCompatibleEmbedding_baseSubgroup K E) + +/-- Finite-prime unramifiedness is preserved when the top number field +is replaced by an equivalent `K`-algebra. -/ +theorem finitePlaceUnramifiedness_congrTop + {K L M : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] + [Field M] [NumberField M] + [Algebra K L] [Algebra K M] + (e : L ≃ₐ[K] M) + (h : IsUnramifiedAtFinitePlaces K L) : + IsUnramifiedAtFinitePlaces K M := by + let hAlgebra : Algebra L M := + e.toRingHom.toAlgebra + let hScalarTower : IsScalarTower K L M := + IsScalarTower.of_algebraMap_eq' (by + apply RingHom.ext + intro x + exact (e.commutes x).symm) + let eLM : L ≃ₐ[L] M := + AlgEquiv.ofRingEquiv (f := e.toRingEquiv) (fun _ => rfl) + let eOLM : (𝓞 L) ≃ₐ[𝓞 L] (𝓞 M) := + NumberField.RingOfIntegers.mapAlgEquiv eLM + let hFormallyUnramified : + Algebra.FormallyUnramified (𝓞 L) (𝓞 M) := + Algebra.FormallyUnramified.of_equiv eOLM + have hLM : + IsUnramifiedAtFinitePlaces L M := by + intro P + infer_instance + exact + IsUnramifiedAtFinitePlaces.trans h hLM + +/-- Any actual finite unramified abelian extension of `K` embeds over +`K` into the selected big Hilbert class field. -/ +noncomputable def + finiteUnramifiedAbelianExtensionEmbeddingIntoBigHilbertClassField + (K E : Type) + [Field K] [NumberField K] + [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] + [IsAbelianGalois K E] + (hunramified : IsUnramifiedAtFinitePlaces K E) : + E →ₐ[K] bigHilbertClassField K := by + let j := + bigHilbertClassFieldCompatibleEmbedding K E + let P := + bigHilbertClassFieldEmbeddedAbelianSubextension K E + let F := + bigHilbertClassFieldBase K + let A := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + letI hBaseAlgebra : Algebra K A := + ((algebraMap F A).comp + (algebraMap K F)).toAlgebra + letI hBaseScalarTower : IsScalarTower K F A := + IsScalarTower.of_algebraMap_eq' rfl + let eQ := + numberFieldEmbeddedAbstractTopFieldEquiv K E j + have hPField : + P.field = numberFieldEmbeddedTopSubgroup K E j := by + simpa only [P, j] using + (bigHilbertClassFieldEmbeddedAbelianSubextension_field K E) + let RawField := + abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K E j) + let eRestrict : (RawField.restrictScalars ℚ) ≃+* A := + { toFun := fun x => + ⟨x.1, by + change x.1 ∈ + abstractFixedField ℚ (SeparableClosure ℚ) P.field + rw [hPField] + exact x.2⟩ + invFun := fun x => + ⟨x.1, by + change x.1 ∈ + abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedTopSubgroup K E j) + rw [← hPField] + exact x.2⟩ + left_inv := fun x => Subtype.ext rfl + right_inv := fun x => Subtype.ext rfl + map_mul' := fun x y => Subtype.ext rfl + map_add' := fun x y => Subtype.ext rfl } + let eTopRing : E ≃+* A := by + exact eQ.toRingEquiv.trans eRestrict + let eTop : E ≃ₐ[K] A := + AlgEquiv.ofRingEquiv (f := eTopRing) (fun x => by + apply Subtype.ext + change + j (algebraMap K E x) = + ((bigHilbertClassFieldBaseEquiv (K := K) x : + F) : + SeparableClosure ℚ) + rw [bigHilbertClassFieldCompatibleEmbedding_algebraMap, + bigHilbertClassFieldBaseEquiv_coe]) + letI hAFiniteDimensional : FiniteDimensional K A := + FiniteDimensional.of_surjective eTop.toLinearMap eTop.surjective + letI hANumberField : NumberField A := + NumberField.of_module_finite K A + have hKA : + IsUnramifiedAtFinitePlaces K A := + finitePlaceUnramifiedness_congrTop eTop hunramified + have hFA : + IsUnramifiedAtFinitePlaces F A := + IsUnramifiedAtFinitePlaces.top + (k := K) (K := F) (F := A) hKA + have hcontain : + P ≤ bigHilbertClassFieldSubextension K := + finiteUnramifiedAbelianSubextension_le_bigHilbertClassFieldSubextension + K P (by + simpa only [bigHilbertFiniteAbelianSubextensionIsUnramifiedAtFinitePlaces, + finiteAbelianSubextensionIsUnramifiedAtFinitePlaces, F, A] using hFA) + let jH : E →+* bigHilbertClassField K := + j.toRingHom.codRestrict + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (bigHilbertClassFieldSubextension K).below).toSubring + (fun x => by + change + j x ∈ + abstractFixedField ℚ (SeparableClosure ℚ) + (bigHilbertClassFieldSubextension K).field + have hxP : + j x ∈ + abstractFixedField ℚ (SeparableClosure ℚ) + P.field := by + rw [bigHilbertClassFieldEmbeddedAbelianSubextension_field] + change + j x ∈ + IntermediateField.fixedField j.fieldRange.fixingSubgroup + rw [InfiniteGalois.fixedField_fixingSubgroup] + exact ⟨x, rfl⟩ + have hsubgroup : + (bigHilbertClassFieldSubextension K).field.toSubgroup ≤ + P.field.toSubgroup := + hcontain + exact + (abstractFixedField_le + ℚ (SeparableClosure ℚ) hsubgroup) hxP) + exact + { jH with + commutes' := fun x => by + apply Subtype.ext + change + j (algebraMap K E x) = + ((bigHilbertClassFieldBaseEquiv (K := K) x : + F) : + SeparableClosure ℚ) + rw [bigHilbertClassFieldCompatibleEmbedding_algebraMap, + bigHilbertClassFieldBaseEquiv_coe] } + +/-- Containment form of maximality: every finite unramified abelian +extension of `K` has a `K`-embedding into the selected big Hilbert +class field. -/ +theorem + finiteUnramifiedAbelianExtension_nonempty_algHom_bigHilbertClassField + (K E : Type) + [Field K] [NumberField K] + [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] + [IsAbelianGalois K E] + (hunramified : IsUnramifiedAtFinitePlaces K E) : + Nonempty (E →ₐ[K] bigHilbertClassField K) := + ⟨finiteUnramifiedAbelianExtensionEmbeddingIntoBigHilbertClassField + K E hunramified⟩ + +/-- The selected big Hilbert class field is the actual maximal finite +unramified abelian extension of the original number field: it is finite, +abelian Galois and unramified at every finite prime, and it contains +every other finite unramified abelian extension over the same base. -/ +theorem bigHilbertClassField_isMaximalUnramifiedAbelianExtension + (K : Type) [Field K] [NumberField K] : + FiniteDimensional K (bigHilbertClassField K) ∧ + IsAbelianGalois K (bigHilbertClassField K) ∧ + IsUnramifiedAtFinitePlaces K (bigHilbertClassField K) ∧ + ∀ (E : Type) [Field E] [NumberField E] + [Algebra K E] [FiniteDimensional K E] + [IsAbelianGalois K E], + IsUnramifiedAtFinitePlaces K E → + Nonempty (E →ₐ[K] bigHilbertClassField K) := by + refine ⟨inferInstance, inferInstance, + bigHilbertClassField_isUnramifiedAtFinitePlaces K, ?_⟩ + intro E _ _ _ _ _ + exact + finiteUnramifiedAbelianExtension_nonempty_algHom_bigHilbertClassField + K E + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximality.lean new file mode 100644 index 0000000000..08eacc9559 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximality.lean @@ -0,0 +1,567 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertNormCharacterization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertNormCharacterization +/-! +# Maximality criteria for Hilbert class fields + +An unramified cyclic extension reaches the big or small Hilbert norm +subgroup exactly when its degree reaches the corresponding narrow or +ordinary class number. Thus a maximal-degree unramified cyclic +extension has the canonical Hilbert reciprocity quotient. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField + +private theorem hilbertClassFieldMaximalityIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] hilbertClassFieldMaximalityIdeleClassGroupIsMulCommutative + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [IsCyclic (L ≃ₐ[K] L)] + +private instance narrowClassGroup_finite : + Finite (RayClass.NarrowClassGroup K) := + Finite.of_equiv + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K))) + (RayClass.rayClassGroupNarrowZeroEquivNarrowClassGroup + (K := K)).toEquiv + +private instance bigHilbertNormQuotient_finite : + Finite + (IdeleClassGroup K ⧸ + bigHilbertClassFieldNormSubgroup (K := K)) := + Finite.of_equiv + (RayClass.NarrowClassGroup K) + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).symm.toEquiv + +private instance bigHilbertNormSubgroup_finiteIndex : + (bigHilbertClassFieldNormSubgroup + (K := K)).FiniteIndex := + Subgroup.finiteIndex_of_finite_quotient + +/-- A cyclic extension unramified at all finite places has the big +Hilbert norm subgroup exactly when its degree is the order of the +narrow class group. -/ +theorem + ideleClassNorm_range_eq_bigHilbertNormSubgroup_iff_finrank_eq_narrowClass_card + (hunramified : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + (_root_.ideleClassNorm K L).range = + bigHilbertClassFieldNormSubgroup (K := K) ↔ + Module.finrank K L = + Nat.card (RayClass.NarrowClassGroup K) := by + constructor + · intro hnorm + calc + Module.finrank K L = + ((_root_.ideleClassNorm K L).range).index := + (ClassFieldAxiom.ideleClassNorm_index_eq_finrank_cyclic + K L).symm + _ = + (bigHilbertClassFieldNormSubgroup + (K := K)).index := by + rw [hnorm] + _ = + Nat.card + (IdeleClassGroup K ⧸ + bigHilbertClassFieldNormSubgroup + (K := K)) := + Subgroup.index_eq_card + (bigHilbertClassFieldNormSubgroup (K := K)) + _ = Nat.card (RayClass.NarrowClassGroup K) := + Nat.card_congr + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).toEquiv + · intro hdegree + have hcard : + Nat.card + (IdeleClassGroup K ⧸ + bigHilbertClassFieldNormSubgroup + (K := K)) = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + calc + Nat.card + (IdeleClassGroup K ⧸ + bigHilbertClassFieldNormSubgroup + (K := K)) = + Nat.card (RayClass.NarrowClassGroup K) := + Nat.card_congr + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).toEquiv + _ = Module.finrank K L := hdegree.symm + _ = + ((_root_.ideleClassNorm K L).range).index := + (ClassFieldAxiom.ideleClassNorm_index_eq_finrank_cyclic + K L).symm + _ = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + Subgroup.index_eq_card + ((_root_.ideleClassNorm K L).range) + refine + (eq_of_le_of_not_lt + (bigHilbertClassFieldNormSubgroup_le_ideleClassNorm_range_of_no_ramifiedFinitePlaces + (K := K) (L := L) hunramified) + ?_).symm + intro hlt + have hstrict := Subgroup.index_strictAnti hlt + rw [Subgroup.index_eq_card + ((_root_.ideleClassNorm K L).range)] at hstrict + rw [Subgroup.index_eq_card + (bigHilbertClassFieldNormSubgroup (K := K))] at hstrict + rw [hcard] at hstrict + exact (lt_irrefl _ hstrict) + +/-- The canonical narrow-class reciprocity map for a finite-unramified +cyclic extension is injective exactly at maximal possible degree. -/ +theorem + narrowClassGroupToIdeleClassNormQuotient_injective_iff_finrank_eq_narrowClassGroup_card + (hunramified : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + Function.Injective + (narrowClassGroupToIdeleClassNormQuotient + (K := K) (L := L) hunramified) ↔ + Module.finrank K L = + Nat.card (RayClass.NarrowClassGroup K) := by + let f := + narrowClassGroupToIdeleClassNormQuotient + (K := K) (L := L) hunramified + have hfSurjective : Function.Surjective f := + narrowClassGroupToIdeleClassNormQuotient_surjective + (K := K) (L := L) hunramified + have hNormCard : + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) = + Module.finrank K L := by + rw [← Subgroup.index_eq_card] + exact + ClassFieldAxiom.ideleClassNorm_index_eq_finrank_cyclic + K L + constructor + · intro hfInjective + have hcard : + Nat.card (RayClass.NarrowClassGroup K) = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + Nat.card_congr + (Equiv.ofBijective f + ⟨hfInjective, hfSurjective⟩) + exact hNormCard.symm.trans hcard.symm + · intro hdegree + have hcard : + Nat.card (RayClass.NarrowClassGroup K) = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + rw [hNormCard] + exact hdegree.symm + exact + (hfSurjective.bijective_of_nat_card_le + hcard.le).1 + +/-- At maximal narrow-class degree, the actual norm quotient of an +unramified cyclic extension is canonically the narrow class group. -/ +def maximalFiniteUnramifiedCyclicNormQuotientEquivNarrowClassGroup + (hunramified : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (hdegree : + Module.finrank K L = + Nat.card (RayClass.NarrowClassGroup K)) : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≃* + RayClass.NarrowClassGroup K := + (QuotientGroup.quotientMulEquivOfEq + ((ideleClassNorm_range_eq_bigHilbertNormSubgroup_iff_finrank_eq_narrowClass_card + (K := K) (L := L) hunramified).2 hdegree)).trans + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)) + +/-- A cyclic extension unramified at every finite and infinite place +has the small Hilbert norm subgroup exactly when its degree is the +ordinary class number. -/ +theorem + ideleClassNorm_range_eq_smallHilbertClassFieldNormSubgroup_iff_finrank_eq_classNumber + [IsUnramifiedAtInfinitePlaces K L] + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + (_root_.ideleClassNorm K L).range = + smallHilbertClassFieldNormSubgroup (K := K) ↔ + Module.finrank K L = + NumberField.classNumber K := by + constructor + · intro hnorm + calc + Module.finrank K L = + ((_root_.ideleClassNorm K L).range).index := + (ClassFieldAxiom.ideleClassNorm_index_eq_finrank_cyclic + K L).symm + _ = + (smallHilbertClassFieldNormSubgroup + (K := K)).index := by + rw [hnorm] + _ = + Nat.card + (IdeleClassGroup K ⧸ + smallHilbertClassFieldNormSubgroup + (K := K)) := + Subgroup.index_eq_card + (smallHilbertClassFieldNormSubgroup (K := K)) + _ = NumberField.classNumber K := + smallHilbertClassFieldQuotient_card_eq_classNumber + (K := K) + · intro hdegree + have hcard : + Nat.card + (IdeleClassGroup K ⧸ + smallHilbertClassFieldNormSubgroup + (K := K)) = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + calc + Nat.card + (IdeleClassGroup K ⧸ + smallHilbertClassFieldNormSubgroup + (K := K)) = + NumberField.classNumber K := + smallHilbertClassFieldQuotient_card_eq_classNumber + (K := K) + _ = Module.finrank K L := hdegree.symm + _ = + ((_root_.ideleClassNorm K L).range).index := + (ClassFieldAxiom.ideleClassNorm_index_eq_finrank_cyclic + K L).symm + _ = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + Subgroup.index_eq_card + ((_root_.ideleClassNorm K L).range) + refine + (eq_of_le_of_not_lt + (smallHilbertClassFieldNormSubgroup_le_ideleClassNorm_range_of_everywhereUnramified + (K := K) (L := L) hunramifiedFinite) + ?_).symm + intro hlt + have hstrict := Subgroup.index_strictAnti hlt + rw [Subgroup.index_eq_card + ((_root_.ideleClassNorm K L).range)] at hstrict + rw [Subgroup.index_eq_card + (smallHilbertClassFieldNormSubgroup (K := K))] at hstrict + rw [hcard] at hstrict + exact (lt_irrefl _ hstrict) + +/-- The canonical ordinary class-group reciprocity map for an +everywhere-unramified cyclic extension is injective exactly at maximal +possible degree. -/ +theorem + classGroupToIdeleClassNormQuotient_injective_iff_finrank_eq_classNumber + [IsUnramifiedAtInfinitePlaces K L] + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + Function.Injective + (classGroupToIdeleClassNormQuotient + (K := K) (L := L) hunramifiedFinite) ↔ + Module.finrank K L = + NumberField.classNumber K := by + let f := + classGroupToIdeleClassNormQuotient + (K := K) (L := L) hunramifiedFinite + have hfSurjective : Function.Surjective f := + classGroupToIdeleClassNormQuotient_surjective + (K := K) (L := L) hunramifiedFinite + have hClassCard : + Nat.card (ClassGroup (𝓞 K)) = + NumberField.classNumber K := by + rw [NumberField.classNumber, + ← Nat.card_eq_fintype_card] + have hNormCard : + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) = + Module.finrank K L := by + rw [← Subgroup.index_eq_card] + exact + ClassFieldAxiom.ideleClassNorm_index_eq_finrank_cyclic + K L + constructor + · intro hfInjective + have hcard : + Nat.card (ClassGroup (𝓞 K)) = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + Nat.card_congr + (Equiv.ofBijective f + ⟨hfInjective, hfSurjective⟩) + calc + Module.finrank K L = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + hNormCard.symm + _ = Nat.card (ClassGroup (𝓞 K)) := + hcard.symm + _ = NumberField.classNumber K := + hClassCard + · intro hdegree + have hcard : + Nat.card (ClassGroup (𝓞 K)) = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + rw [hClassCard, hNormCard] + exact hdegree.symm + exact + (hfSurjective.bijective_of_nat_card_le + hcard.le).1 + +/-- At maximal ordinary-class degree, the actual norm quotient of an +everywhere-unramified cyclic extension is canonically the ordinary +ideal class group. -/ +def maximalEverywhereUnramifiedCyclicNormQuotientEquivClassGroup + [IsUnramifiedAtInfinitePlaces K L] + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (hdegree : + Module.finrank K L = + NumberField.classNumber K) : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≃* + ClassGroup (𝓞 K) := + (QuotientGroup.quotientMulEquivOfEq + ((ideleClassNorm_range_eq_smallHilbertClassFieldNormSubgroup_iff_finrank_eq_classNumber + (K := K) (L := L) hunramifiedFinite).2 hdegree)).trans + (smallHilbertClassFieldQuotientEquivClassGroup + (K := K)) + +/-- Any two finite-unramified cyclic extensions attaining the narrow +class number determine the same idèle-class norm subgroup. This is +uniqueness of the big Hilbert class field at the norm-subgroup level. -/ +theorem maximalFiniteUnramifiedCyclicNormRanges_eq + {M : Type} + [Field M] [NumberField M] [Algebra K M] + [FiniteDimensional K M] [IsGalois K M] + [IsCyclic (M ≃ₐ[K] M)] + (hLunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (hMunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := M) = ∅) + (hLdegree : + Module.finrank K L = + Nat.card (RayClass.NarrowClassGroup K)) + (hMdegree : + Module.finrank K M = + Nat.card (RayClass.NarrowClassGroup K)) : + (_root_.ideleClassNorm K L).range = + (_root_.ideleClassNorm K M).range := by + calc + (_root_.ideleClassNorm K L).range = + bigHilbertClassFieldNormSubgroup (K := K) := + (ideleClassNorm_range_eq_bigHilbertNormSubgroup_iff_finrank_eq_narrowClass_card + (K := K) (L := L) hLunramifiedFinite).2 hLdegree + _ = (_root_.ideleClassNorm K M).range := + ((ideleClassNorm_range_eq_bigHilbertNormSubgroup_iff_finrank_eq_narrowClass_card + (K := K) (L := M) hMunramifiedFinite).2 hMdegree).symm + +/-- Any two everywhere-unramified cyclic extensions attaining the +ordinary class number determine the same idèle-class norm subgroup. +This is uniqueness of the small Hilbert class field at the +norm-subgroup level. -/ +theorem maximalEverywhereUnramifiedCyclicNormRanges_eq + {M : Type} + [Field M] [NumberField M] [Algebra K M] + [FiniteDimensional K M] [IsGalois K M] + [IsCyclic (M ≃ₐ[K] M)] + [IsUnramifiedAtInfinitePlaces K L] + [IsUnramifiedAtInfinitePlaces K M] + (hLunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (hMunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := M) = ∅) + (hLdegree : + Module.finrank K L = + NumberField.classNumber K) + (hMdegree : + Module.finrank K M = + NumberField.classNumber K) : + (_root_.ideleClassNorm K L).range = + (_root_.ideleClassNorm K M).range := by + calc + (_root_.ideleClassNorm K L).range = + smallHilbertClassFieldNormSubgroup (K := K) := + (ideleClassNorm_range_eq_smallHilbertClassFieldNormSubgroup_iff_finrank_eq_classNumber + (K := K) (L := L) hLunramifiedFinite).2 hLdegree + _ = (_root_.ideleClassNorm K M).range := + ((ideleClassNorm_range_eq_smallHilbertClassFieldNormSubgroup_iff_finrank_eq_classNumber + (K := K) (L := M) hMunramifiedFinite).2 hMdegree).symm + +omit [IsCyclic (L ≃ₐ[K] L)] in +/-- A finite-unramified cyclic extension whose degree is the narrow +class number has no proper nested finite-unramified cyclic +overextension over the same base field. -/ +theorem + maximalFiniteUnramifiedCyclicExtension_relativeDegree_eq_one + {M : Type} + [Field M] [NumberField M] + [Algebra L M] [Algebra K M] [IsScalarTower K L M] + [FiniteDimensional L M] [FiniteDimensional K M] + [IsGalois K M] [IsCyclic (M ≃ₐ[K] M)] + (hLdegree : + Module.finrank K L = + Nat.card (RayClass.NarrowClassGroup K)) + (hMunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := M) = ∅) : + Module.finrank L M = 1 := by + have hdiv : + Module.finrank K M ∣ + Nat.card (RayClass.NarrowClassGroup K) := + cyclicExtensionDegree_dvd_narrowClassGroup_card_of_no_ramifiedFinitePlaces + (K := K) (L := M) hMunramifiedFinite + have hdiv' : + Module.finrank K L * Module.finrank L M ∣ + Module.finrank K L := by + rw [Module.finrank_mul_finrank K L M, hLdegree] + exact hdiv + obtain ⟨c, hc⟩ := hdiv' + have hone : + 1 = Module.finrank L M * c := by + apply + Nat.mul_left_cancel + (show 0 < Module.finrank K L from Module.finrank_pos) + simpa only [mul_one, mul_assoc] using hc + exact Nat.dvd_one.mp ⟨c, hone⟩ + +omit [IsCyclic (L ≃ₐ[K] L)] in +/-- An everywhere-unramified cyclic extension whose degree is the +ordinary class number has no proper nested everywhere-unramified cyclic +overextension over the same base field. -/ +theorem + maximalEverywhereUnramifiedCyclicExtension_relativeDegree_eq_one + {M : Type} + [Field M] [NumberField M] + [Algebra L M] [Algebra K M] [IsScalarTower K L M] + [FiniteDimensional L M] [FiniteDimensional K M] + [IsGalois K M] [IsCyclic (M ≃ₐ[K] M)] + [IsUnramifiedAtInfinitePlaces K M] + (hLdegree : + Module.finrank K L = + NumberField.classNumber K) + (hMunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := M) = ∅) : + Module.finrank L M = 1 := by + have hdiv : + Module.finrank K M ∣ + NumberField.classNumber K := + cyclicEverywhereUnramifiedExtensionDegree_dvd_classNumber + (K := K) (L := M) hMunramifiedFinite + have hdiv' : + Module.finrank K L * Module.finrank L M ∣ + Module.finrank K L := by + rw [Module.finrank_mul_finrank K L M, hLdegree] + exact hdiv + obtain ⟨c, hc⟩ := hdiv' + have hone : + 1 = Module.finrank L M * c := by + apply + Nat.mul_left_cancel + (show 0 < Module.finrank K L from Module.finrank_pos) + simpa only [mul_one, mul_assoc] using hc + exact Nat.dvd_one.mp ⟨c, hone⟩ + +omit [IsCyclic (L ≃ₐ[K] L)] in +/-- A proper cyclic overextension of a narrow-class-degree extension +must ramify at some finite place of the base field. -/ +theorem + properCyclicOverextension_of_maximalFiniteUnramifiedExtension_has_ramifiedFinitePlace + {M : Type} + [Field M] [NumberField M] + [Algebra L M] [Algebra K M] [IsScalarTower K L M] + [FiniteDimensional L M] [FiniteDimensional K M] + [IsGalois K M] [IsCyclic (M ≃ₐ[K] M)] + (hLdegree : + Module.finrank K L = + Nat.card (RayClass.NarrowClassGroup K)) + (hrelativeDegree : + Module.finrank L M ≠ 1) : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := M) ≠ ∅ := by + intro hMunramifiedFinite + exact + hrelativeDegree + (maximalFiniteUnramifiedCyclicExtension_relativeDegree_eq_one + (K := K) (L := L) (M := M) + hLdegree hMunramifiedFinite) + +omit [IsCyclic (L ≃ₐ[K] L)] in +/-- A proper cyclic overextension which is unramified at every infinite +place and lies above an ordinary-class-degree extension must ramify at +some finite place of the base field. -/ +theorem + properCyclicOverextension_of_maximalEverywhereUnramifiedExtension_has_ramifiedFinitePlace + {M : Type} + [Field M] [NumberField M] + [Algebra L M] [Algebra K M] [IsScalarTower K L M] + [FiniteDimensional L M] [FiniteDimensional K M] + [IsGalois K M] [IsCyclic (M ≃ₐ[K] M)] + [IsUnramifiedAtInfinitePlaces K M] + (hLdegree : + Module.finrank K L = + NumberField.classNumber K) + (hrelativeDegree : + Module.finrank L M ≠ 1) : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := M) ≠ ∅ := by + intro hMunramifiedFinite + exact + hrelativeDegree + (maximalEverywhereUnramifiedCyclicExtension_relativeDegree_eq_one + (K := K) (L := L) (M := M) + hLdegree hMunramifiedFinite) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldPrimeSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldPrimeSplitting.lean new file mode 100644 index 0000000000..6106eb300a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldPrimeSplitting.lean @@ -0,0 +1,741 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertSplitting +/-! +# Prime splitting for a maximal everywhere-unramified cyclic norm quotient + +Suppose a cyclic extension is unramified at every finite and infinite +place and its degree is the ordinary class number. Its actual +idèle-class norm quotient is then the small-Hilbert reciprocity quotient. +This file transports prime Frobenius classes across that identification +and proves that trivial Frobenius is equivalent to principality of the +prime ideal. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain IdeleGroup + +/-- The canonical idèle-class multiplication makes every subgroup normal. -/ +private theorem hilbertPrimeSplittingClassGroupIsMulCommutative + (F : Type) [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + IsMulCommutative.of_comm (fun a b => mul_comm a b) + +attribute [local instance] hilbertPrimeSplittingClassGroupIsMulCommutative + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [IsCyclic (L ≃ₐ[K] L)] + [IsUnramifiedAtInfinitePlaces K L] + +/-- The prime Frobenius class in the big-Hilbert reciprocity quotient. -/ +def bigHilbertFrobeniusClass + (v : HeightOneSpectrum (𝓞 K)) : + IdeleClassGroup K ⧸ + bigHilbertClassFieldNormSubgroup (K := K) := + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).symm + (QuotientGroup.mk' + (RayClass.narrowDenominator (K := K)) + (finitePrimeIdele v)) + +private theorem mulEquiv_symm_apply_eq_one_iff + {G H : Type} [Group G] [Group H] + (e : G ≃* H) (x : H) : + e.symm x = 1 ↔ x = 1 := by + constructor + · intro hx + apply e.symm.injective + exact hx.trans (map_one e.symm).symm + · intro hx + calc + e.symm x = e.symm 1 := congrArg e.symm hx + _ = 1 := map_one e.symm + +private theorem mulEquiv_apply_trans_symm + {G H I : Type} [Group G] [Group H] [Group I] + (e : G ≃* H) (f : H ≃* I) (x : I) : + e ((e.trans f).symm x) = f.symm x := + e.apply_symm_apply (f.symm x) + +private theorem quotientMulEquivOfEq_trans_apply_mk + {G I : Type} [Group G] [Group I] + (M N : Subgroup G) [M.Normal] [N.Normal] + (h : M = N) (e : G ⧸ N ≃* I) (x : G) : + ((QuotientGroup.quotientMulEquivOfEq h).trans e) + (QuotientGroup.mk' M x) = + e (QuotientGroup.mk' N x) := by + exact + congrArg e + (QuotientGroup.quotientMulEquivOfEq_mk h x) + +private def primeHasTotallyPositiveGenerator + (v : HeightOneSpectrum (𝓞 K)) : Prop := + ∃ x : Kˣ, + IdeleGroup.principalIdele K x ∈ + RayClass.idelePrimeToModulusSubgroup + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)) ∧ + toPrincipalIdeal (𝓞 K) K x = + FractionalIdealGroup.prime v + +private theorem + finitePrimeIdele_mem_narrowDenominator_imp_primeHasTotallyPositiveGenerator + (v : HeightOneSpectrum (𝓞 K)) + (hv : finitePrimeIdele v ∈ + RayClass.narrowDenominator (K := K)) : + primeHasTotallyPositiveGenerator v := by + have hvSup : + finitePrimeIdele v ∈ + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)).ideleCongruenceSubgroup ⊔ + IdeleGroup.principalSubgroup K := by + simpa only [RayClass.narrowDenominator] using hv + obtain ⟨c, hc, p, hp, hcp⟩ := (Subgroup.mem_sup).1 hvSup + obtain ⟨x, rfl⟩ := hp + refine ⟨x, ?_, ?_⟩ + · refine ⟨?_, ?_⟩ + · have hproduct : + c.1 * (IdeleGroup.principalIdele K x).1 = 1 := by + calc + c.1 * (IdeleGroup.principalIdele K x).1 = + (c * IdeleGroup.principalIdele K x).1 := + rfl + _ = (finitePrimeIdele v).1 := + congrArg Prod.fst hcp + _ = 1 := rfl + have hinfinite : + (IdeleGroup.principalIdele K x).1 = c.1⁻¹ := + eq_inv_of_mul_eq_one_right hproduct + rw [hinfinite] + change + c.1⁻¹ ∈ + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)).infiniteCongruenceSubgroup + exact + ((RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)).infiniteCongruenceSubgroup).inv_mem + hc.1 + · intro w hw + exact ((Finsupp.mem_support_iff.mp hw) rfl).elim + · have hcIdeal : + IdeleGroup.fractionalIdeal c = 1 := by + rw [← MonoidHom.mem_ker, + IdeleGroup.fractionalIdeal_ker] + exact + RayClass.narrowIdeleCongruenceSubgroup_zero_le_integral hc + calc + toPrincipalIdeal (𝓞 K) K x = + IdeleGroup.fractionalIdeal + (IdeleGroup.principalIdele K x) := + (IdeleGroup.fractionalIdeal_principalIdele x).symm + _ = + IdeleGroup.fractionalIdeal c * + IdeleGroup.fractionalIdeal + (IdeleGroup.principalIdele K x) := by + rw [hcIdeal, one_mul] + _ = + IdeleGroup.fractionalIdeal + (c * IdeleGroup.principalIdele K x) := by + rw [map_mul] + _ = IdeleGroup.fractionalIdeal (finitePrimeIdele v) := + congrArg (IdeleGroup.fractionalIdeal (K := K)) hcp + _ = FractionalIdealGroup.prime v := + fractionalIdeal_finitePrimeIdele v + +private theorem + primeHasTotallyPositiveGenerator_imp_finitePrimeIdele_mem_narrowDenominator + (v : HeightOneSpectrum (𝓞 K)) + (hgenerator : primeHasTotallyPositiveGenerator v) : + finitePrimeIdele v ∈ + RayClass.narrowDenominator (K := K) := by + obtain ⟨x, hxPositive, hxIdeal⟩ := hgenerator + let c : IdeleGroup K := + finitePrimeIdele v * + (IdeleGroup.principalIdele K x)⁻¹ + have hcIdeal : + IdeleGroup.fractionalIdeal c = 1 := by + dsimp [c] + rw [map_mul, map_inv, + fractionalIdeal_finitePrimeIdele, + IdeleGroup.fractionalIdeal_principalIdele, + hxIdeal, mul_inv_cancel] + have hcIntegral : + c ∈ IdeleGroup.integralAtFinitePlaces (K := K) := by + rw [← IdeleGroup.fractionalIdeal_ker, + MonoidHom.mem_ker] + exact hcIdeal + have hcCongruence : + c ∈ + RayClass.Modulus.ideleCongruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)) := by + refine ⟨?_, ?_⟩ + · change + (finitePrimeIdele v).1 * + ((IdeleGroup.principalIdele K x).1)⁻¹ ∈ + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)).infiniteCongruenceSubgroup + change + 1 * ((IdeleGroup.principalIdele K x).1)⁻¹ ∈ + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)).infiniteCongruenceSubgroup + simpa only [one_mul] using + ((RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)).infiniteCongruenceSubgroup).inv_mem + hxPositive.1 + · rw [RayClass.Modulus.finitePart_narrowOfFinite, + RayClass.finiteCongruenceSubgroup_zero] + exact hcIntegral + have hvSup : + finitePrimeIdele v ∈ + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)).ideleCongruenceSubgroup ⊔ + IdeleGroup.principalSubgroup K := by + apply (Subgroup.mem_sup).2 + refine + ⟨c, hcCongruence, + IdeleGroup.principalIdele K x, + ⟨x, rfl⟩, ?_⟩ + dsimp [c] + group + simpa only [RayClass.narrowDenominator] using hvSup + +private theorem + finitePrimeIdele_mem_narrowDenominator_iff_primeHasTotallyPositiveGenerator + (v : HeightOneSpectrum (𝓞 K)) : + finitePrimeIdele v ∈ + RayClass.narrowDenominator (K := K) ↔ + primeHasTotallyPositiveGenerator v := + ⟨finitePrimeIdele_mem_narrowDenominator_imp_primeHasTotallyPositiveGenerator v, + primeHasTotallyPositiveGenerator_imp_finitePrimeIdele_mem_narrowDenominator v⟩ + +/-- The big-Hilbert Frobenius class is trivial exactly when the prime +has a generator whose principal idèle is positive at every real +infinite place. -/ +theorem + bigHilbertFrobeniusClass_eq_one_iff_exists_totallyPositiveGenerator + (v : HeightOneSpectrum (𝓞 K)) : + bigHilbertFrobeniusClass v = 1 ↔ + ∃ x : Kˣ, + IdeleGroup.principalIdele K x ∈ + RayClass.idelePrimeToModulusSubgroup + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)) ∧ + toPrincipalIdeal (𝓞 K) K x = + FractionalIdealGroup.prime v := by + exact + (mulEquiv_symm_apply_eq_one_iff + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)) + (QuotientGroup.mk' + (RayClass.narrowDenominator (K := K)) + (finitePrimeIdele v))).trans + ((QuotientGroup.eq_one_iff (finitePrimeIdele v)).trans + (finitePrimeIdele_mem_narrowDenominator_iff_primeHasTotallyPositiveGenerator + v)) + +omit [IsUnramifiedAtInfinitePlaces K L] in +/-- The prime Frobenius class in the actual norm quotient of a maximal +finite-unramified cyclic extension. -/ +def maximalFiniteUnramifiedCyclicFrobeniusClass + (hunramified : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (hdegree : + Module.finrank K L = + Nat.card (RayClass.NarrowClassGroup K)) + (v : HeightOneSpectrum (𝓞 K)) : + IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range := + (maximalFiniteUnramifiedCyclicNormQuotientEquivNarrowClassGroup + (K := K) (L := L) hunramified hdegree).symm + (QuotientGroup.mk' + (RayClass.narrowDenominator (K := K)) + (finitePrimeIdele v)) + +omit [IsUnramifiedAtInfinitePlaces K L] in +/-- The maximal finite-unramified norm-quotient Frobenius class is +represented by the one-place prime idèle class. -/ +theorem + maximalFiniteUnramifiedCyclicFrobeniusClass_eq_finitePrimeIdeleClass + (hunramified : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (hdegree : + Module.finrank K L = + Nat.card (RayClass.NarrowClassGroup K)) + (v : HeightOneSpectrum (𝓞 K)) : + maximalFiniteUnramifiedCyclicFrobeniusClass + (K := K) (L := L) hunramified hdegree v = + QuotientGroup.mk' + ((_root_.ideleClassNorm K L).range) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (finitePrimeIdele v)) := by + apply + (maximalFiniteUnramifiedCyclicNormQuotientEquivNarrowClassGroup + (K := K) (L := L) hunramified hdegree).injective + calc + _ = QuotientGroup.mk' + (RayClass.narrowDenominator (K := K)) + (finitePrimeIdele v) := + (maximalFiniteUnramifiedCyclicNormQuotientEquivNarrowClassGroup + (K := K) (L := L) hunramified hdegree).apply_symm_apply _ + _ = bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K) + (QuotientGroup.mk' + (bigHilbertClassFieldNormSubgroup (K := K)) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (finitePrimeIdele v))) := + (bigHilbertClassFieldQuotientEquivNarrowClassGroup_mk + (K := K) (finitePrimeIdele v)).symm + _ = maximalFiniteUnramifiedCyclicNormQuotientEquivNarrowClassGroup + (K := K) (L := L) hunramified hdegree + (QuotientGroup.mk' + ((_root_.ideleClassNorm K L).range) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (finitePrimeIdele v))) := + (quotientMulEquivOfEq_trans_apply_mk + ((_root_.ideleClassNorm K L).range) + (bigHilbertClassFieldNormSubgroup (K := K)) + ((ideleClassNorm_range_eq_bigHilbertNormSubgroup_iff_finrank_eq_narrowClass_card + (K := K) (L := L) hunramified).2 hdegree) + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (finitePrimeIdele v))).symm + +omit [IsUnramifiedAtInfinitePlaces K L] in +/-- The order of the actual maximal finite-unramified Frobenius class +is the order of its narrow ideal class. -/ +theorem orderOf_maximalFiniteUnramifiedCyclicFrobeniusClass + (hunramified : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (hdegree : + Module.finrank K L = + Nat.card (RayClass.NarrowClassGroup K)) + (v : HeightOneSpectrum (𝓞 K)) : + orderOf + (maximalFiniteUnramifiedCyclicFrobeniusClass + (K := K) (L := L) hunramified hdegree v) = + orderOf + (QuotientGroup.mk' + (RayClass.narrowDenominator (K := K)) + (finitePrimeIdele v)) := by + exact + (maximalFiniteUnramifiedCyclicNormQuotientEquivNarrowClassGroup + (K := K) (L := L) hunramified hdegree).symm.orderOf_eq + (QuotientGroup.mk' + (RayClass.narrowDenominator (K := K)) + (finitePrimeIdele v)) + +omit [IsUnramifiedAtInfinitePlaces K L] in +/-- The Frobenius class in the actual maximal finite-unramified norm +quotient is trivial exactly when the prime has a totally positive +generator. -/ +theorem + maximalFiniteUnramifiedCyclicFrobeniusClass_eq_one_iff_exists_totallyPositiveGenerator + (hunramified : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (hdegree : + Module.finrank K L = + Nat.card (RayClass.NarrowClassGroup K)) + (v : HeightOneSpectrum (𝓞 K)) : + maximalFiniteUnramifiedCyclicFrobeniusClass + (K := K) (L := L) hunramified hdegree v = 1 ↔ + ∃ x : Kˣ, + IdeleGroup.principalIdele K x ∈ + RayClass.idelePrimeToModulusSubgroup + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)) ∧ + toPrincipalIdeal (𝓞 K) K x = + FractionalIdealGroup.prime v := by + exact + (mulEquiv_symm_apply_eq_one_iff + (maximalFiniteUnramifiedCyclicNormQuotientEquivNarrowClassGroup + (K := K) (L := L) hunramified hdegree) + (QuotientGroup.mk' + (RayClass.narrowDenominator (K := K)) + (finitePrimeIdele v))).trans + ((QuotientGroup.eq_one_iff (finitePrimeIdele v)).trans + (finitePrimeIdele_mem_narrowDenominator_iff_primeHasTotallyPositiveGenerator + v)) + +omit [IsCyclic (L ≃ₐ[K] L)] [IsUnramifiedAtInfinitePlaces K L] in +private theorem finitePrimeIdeleClass_eq_one_of_splitsCompletely + (v : HeightOneSpectrum (𝓞 K)) + (hsplit : + _root_.FinitePlaceSplitsCompletely + (K := K) (L := L) v) : + QuotientGroup.mk' + ((_root_.ideleClassNorm K L).range) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (finitePrimeIdele v)) = 1 := by + apply (QuotientGroup.eq_one_iff _).2 + change + IdeleGroup.finitePlaceIdeleClass v + (FiniteIdeleGroup.chosenLocalOrderSection v 1) ∈ + (_root_.ideleClassNorm K L).range + apply + finitePlaceIdeleClass_range_le_ideleClassNorm_range_of_splitsCompletely + (K := K) (L := L) v hsplit + exact + ⟨FiniteIdeleGroup.chosenLocalOrderSection v 1, rfl⟩ + +omit [IsUnramifiedAtInfinitePlaces K L] in +/-- Actual complete splitting in a maximal finite-unramified cyclic +extension forces triviality of the corresponding norm-quotient +Frobenius class. -/ +theorem + finitePlaceSplitsCompletely_imp_maximalFiniteUnramifiedCyclicFrobeniusClass_eq_one + (hunramified : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (hdegree : + Module.finrank K L = + Nat.card (RayClass.NarrowClassGroup K)) + (v : HeightOneSpectrum (𝓞 K)) + (hsplit : + _root_.FinitePlaceSplitsCompletely + (K := K) (L := L) v) : + maximalFiniteUnramifiedCyclicFrobeniusClass + (K := K) (L := L) hunramified hdegree v = 1 := by + exact + (maximalFiniteUnramifiedCyclicFrobeniusClass_eq_finitePrimeIdeleClass + (K := K) (L := L) hunramified hdegree v).trans + (finitePrimeIdeleClass_eq_one_of_splitsCompletely + (K := K) (L := L) v hsplit) + +omit [IsUnramifiedAtInfinitePlaces K L] in +/-- Every prime which actually splits completely in a maximal +finite-unramified cyclic extension has a totally positive generator. -/ +theorem + finitePlaceSplitsCompletely_imp_exists_totallyPositiveGenerator_of_maximalFiniteUnramifiedCyclic + (hunramified : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (hdegree : + Module.finrank K L = + Nat.card (RayClass.NarrowClassGroup K)) + (v : HeightOneSpectrum (𝓞 K)) + (hsplit : + _root_.FinitePlaceSplitsCompletely + (K := K) (L := L) v) : + ∃ x : Kˣ, + IdeleGroup.principalIdele K x ∈ + RayClass.idelePrimeToModulusSubgroup + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)) ∧ + toPrincipalIdeal (𝓞 K) K x = + FractionalIdealGroup.prime v := + (maximalFiniteUnramifiedCyclicFrobeniusClass_eq_one_iff_exists_totallyPositiveGenerator + (K := K) (L := L) hunramified hdegree v).1 + (finitePlaceSplitsCompletely_imp_maximalFiniteUnramifiedCyclicFrobeniusClass_eq_one + (K := K) (L := L) hunramified hdegree v hsplit) + +/-- At maximal everywhere-unramified cyclic degree, the actual norm +quotient is canonically the small-Hilbert reciprocity quotient. -/ +def maximalEverywhereUnramifiedCyclicNormQuotientEquivSmallHilbertQuotient + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (hdegree : + Module.finrank K L = + NumberField.classNumber K) : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≃* + (IdeleClassGroup K ⧸ + smallHilbertClassFieldNormSubgroup (K := K)) := + QuotientGroup.quotientMulEquivOfEq + ((ideleClassNorm_range_eq_smallHilbertClassFieldNormSubgroup_iff_finrank_eq_classNumber + (K := K) (L := L) hunramifiedFinite).2 hdegree) + +/-- The prime Frobenius class in the actual norm quotient of a maximal +everywhere-unramified cyclic extension. -/ +def maximalEverywhereUnramifiedCyclicFrobeniusClass + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (hdegree : + Module.finrank K L = + NumberField.classNumber K) + (v : HeightOneSpectrum (𝓞 K)) : + IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range := + (maximalEverywhereUnramifiedCyclicNormQuotientEquivClassGroup + (K := K) (L := L) hunramifiedFinite hdegree).symm + (ClassGroup.mk K (FractionalIdealGroup.prime v)) + +/-- The actual maximal norm-quotient Frobenius class corresponds to the +small-Hilbert Frobenius class. -/ +theorem + maximalEverywhereUnramifiedCyclicNormQuotientEquivSmallHilbertQuotient_frobeniusClass + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (hdegree : + Module.finrank K L = + NumberField.classNumber K) + (v : HeightOneSpectrum (𝓞 K)) : + maximalEverywhereUnramifiedCyclicNormQuotientEquivSmallHilbertQuotient + (K := K) (L := L) hunramifiedFinite hdegree + (maximalEverywhereUnramifiedCyclicFrobeniusClass + (K := K) (L := L) hunramifiedFinite hdegree v) = + IdealClassFieldTheory.smallHilbertFrobeniusClass v := by + exact + mulEquiv_apply_trans_symm + (maximalEverywhereUnramifiedCyclicNormQuotientEquivSmallHilbertQuotient + (K := K) (L := L) hunramifiedFinite hdegree) + (smallHilbertClassFieldQuotientEquivClassGroup (K := K)) + (ClassGroup.mk K (FractionalIdealGroup.prime v)) + +/-- The maximal norm-quotient Frobenius class is represented by the +one-place prime idèle class. -/ +theorem + maximalEverywhereUnramifiedCyclicFrobeniusClass_eq_finitePrimeIdeleClass + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (hdegree : + Module.finrank K L = + NumberField.classNumber K) + (v : HeightOneSpectrum (𝓞 K)) : + maximalEverywhereUnramifiedCyclicFrobeniusClass + (K := K) (L := L) hunramifiedFinite hdegree v = + QuotientGroup.mk' + ((_root_.ideleClassNorm K L).range) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (finitePrimeIdele v)) := by + apply + (maximalEverywhereUnramifiedCyclicNormQuotientEquivClassGroup + (K := K) (L := L) hunramifiedFinite hdegree).injective + calc + _ = ClassGroup.mk K (FractionalIdealGroup.prime v) := + (maximalEverywhereUnramifiedCyclicNormQuotientEquivClassGroup + (K := K) (L := L) hunramifiedFinite hdegree).apply_symm_apply _ + _ = IdeleGroup.idealClass (finitePrimeIdele v) := + (IdeleGroup.idealClass_finitePrimeIdele v).symm + _ = smallHilbertClassFieldQuotientEquivClassGroup + (K := K) + (QuotientGroup.mk' + (smallHilbertClassFieldNormSubgroup (K := K)) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (finitePrimeIdele v))) := + (smallHilbertClassFieldQuotientEquivClassGroup_mk + (K := K) (finitePrimeIdele v)).symm + _ = maximalEverywhereUnramifiedCyclicNormQuotientEquivClassGroup + (K := K) (L := L) hunramifiedFinite hdegree + (QuotientGroup.mk' + ((_root_.ideleClassNorm K L).range) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (finitePrimeIdele v))) := + (quotientMulEquivOfEq_trans_apply_mk + ((_root_.ideleClassNorm K L).range) + (smallHilbertClassFieldNormSubgroup (K := K)) + ((ideleClassNorm_range_eq_smallHilbertClassFieldNormSubgroup_iff_finrank_eq_classNumber + (K := K) (L := L) hunramifiedFinite).2 hdegree) + (smallHilbertClassFieldQuotientEquivClassGroup + (K := K)) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (finitePrimeIdele v))).symm + +/-- The order of the actual norm-quotient Frobenius class is the order +of the corresponding ordinary ideal class. -/ +theorem orderOf_maximalEverywhereUnramifiedCyclicFrobeniusClass + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (hdegree : + Module.finrank K L = + NumberField.classNumber K) + (v : HeightOneSpectrum (𝓞 K)) : + orderOf + (maximalEverywhereUnramifiedCyclicFrobeniusClass + (K := K) (L := L) hunramifiedFinite hdegree v) = + orderOf + (ClassGroup.mk K (FractionalIdealGroup.prime v)) := by + exact + (maximalEverywhereUnramifiedCyclicNormQuotientEquivClassGroup + (K := K) (L := L) hunramifiedFinite hdegree).symm.orderOf_eq + (ClassGroup.mk K (FractionalIdealGroup.prime v)) + +/-- Under the canonical quotient identification, complete splitting in +the small Hilbert class field is equivalent to triviality of the +corresponding Frobenius class in the actual maximal norm quotient. -/ +theorem + unramifiedCyclicFrobeniusClass_eq_one_iff_smallHilbertSplitsCompletely + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (hdegree : + Module.finrank K L = + NumberField.classNumber K) + (v : HeightOneSpectrum (𝓞 K)) : + maximalEverywhereUnramifiedCyclicFrobeniusClass + (K := K) (L := L) hunramifiedFinite hdegree v = 1 ↔ + IdealClassFieldTheory.SplitsCompletelyInSmallHilbertClassField v := by + let e := + maximalEverywhereUnramifiedCyclicNormQuotientEquivSmallHilbertQuotient + (K := K) (L := L) hunramifiedFinite hdegree + constructor + · intro hv + calc + IdealClassFieldTheory.smallHilbertFrobeniusClass v = + e (maximalEverywhereUnramifiedCyclicFrobeniusClass + (K := K) (L := L) hunramifiedFinite hdegree v) := + (maximalEverywhereUnramifiedCyclicNormQuotientEquivSmallHilbertQuotient_frobeniusClass + (K := K) (L := L) hunramifiedFinite hdegree v).symm + _ = e 1 := congrArg e hv + _ = 1 := map_one e + · intro hv + apply e.injective + calc + e (maximalEverywhereUnramifiedCyclicFrobeniusClass + (K := K) (L := L) hunramifiedFinite hdegree v) = + IdealClassFieldTheory.smallHilbertFrobeniusClass v := + maximalEverywhereUnramifiedCyclicNormQuotientEquivSmallHilbertQuotient_frobeniusClass + (K := K) (L := L) hunramifiedFinite hdegree v + _ = 1 := hv + _ = e 1 := (map_one e).symm + +/-- The Frobenius class in the actual maximal norm quotient is trivial +exactly when the corresponding prime ideal is principal. -/ +theorem + maximalEverywhereUnramifiedCyclicFrobeniusClass_eq_one_iff_principal + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (hdegree : + Module.finrank K L = + NumberField.classNumber K) + (v : HeightOneSpectrum (𝓞 K)) : + maximalEverywhereUnramifiedCyclicFrobeniusClass + (K := K) (L := L) hunramifiedFinite hdegree v = 1 ↔ + FractionalIdealGroup.prime v ∈ + (toPrincipalIdeal (𝓞 K) K).range := by + exact + (unramifiedCyclicFrobeniusClass_eq_one_iff_smallHilbertSplitsCompletely + (K := K) (L := L) hunramifiedFinite hdegree v).trans + (IdealClassFieldTheory.splitsCompletelyInSmallHilbertClassField_iff_principal + v) + +/-- Existential generator form of the trivial-Frobenius criterion in +the actual maximal norm quotient. -/ +theorem + maximalEverywhereUnramifiedCyclicFrobeniusClass_eq_one_iff_exists_generator + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (hdegree : + Module.finrank K L = + NumberField.classNumber K) + (v : HeightOneSpectrum (𝓞 K)) : + maximalEverywhereUnramifiedCyclicFrobeniusClass + (K := K) (L := L) hunramifiedFinite hdegree v = 1 ↔ + ∃ x : Kˣ, + toPrincipalIdeal (𝓞 K) K x = + FractionalIdealGroup.prime v := by + exact + (maximalEverywhereUnramifiedCyclicFrobeniusClass_eq_one_iff_principal + (K := K) (L := L) hunramifiedFinite hdegree v).trans Iff.rfl + +/-- If a finite prime actually splits completely in the maximal +everywhere-unramified cyclic extension, then its norm-quotient +Frobenius class is trivial. -/ +theorem + finitePlaceSplitsCompletely_imp_maximalEverywhereUnramifiedCyclicFrobeniusClass_eq_one + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (hdegree : + Module.finrank K L = + NumberField.classNumber K) + (v : HeightOneSpectrum (𝓞 K)) + (hsplit : + _root_.FinitePlaceSplitsCompletely + (K := K) (L := L) v) : + maximalEverywhereUnramifiedCyclicFrobeniusClass + (K := K) (L := L) hunramifiedFinite hdegree v = 1 := by + exact + (maximalEverywhereUnramifiedCyclicFrobeniusClass_eq_finitePrimeIdeleClass + (K := K) (L := L) hunramifiedFinite hdegree v).trans + (finitePrimeIdeleClass_eq_one_of_splitsCompletely + (K := K) (L := L) v hsplit) + +/-- In a maximal everywhere-unramified cyclic extension, every prime +which actually splits completely is principal. -/ +theorem + finitePlaceSplitsCompletely_imp_prime_principal_of_maximalEverywhereUnramifiedCyclic + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (hdegree : + Module.finrank K L = + NumberField.classNumber K) + (v : HeightOneSpectrum (𝓞 K)) + (hsplit : + _root_.FinitePlaceSplitsCompletely + (K := K) (L := L) v) : + FractionalIdealGroup.prime v ∈ + (toPrincipalIdeal (𝓞 K) K).range := + (maximalEverywhereUnramifiedCyclicFrobeniusClass_eq_one_iff_principal + (K := K) (L := L) hunramifiedFinite hdegree v).1 + (finitePlaceSplitsCompletely_imp_maximalEverywhereUnramifiedCyclicFrobeniusClass_eq_one + (K := K) (L := L) hunramifiedFinite hdegree v hsplit) + +/-- A nonprincipal prime cannot split completely in a maximal +everywhere-unramified cyclic extension. -/ +theorem + not_finitePlaceSplitsCompletely_of_prime_not_principal_of_maximalEverywhereUnramifiedCyclic + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (hdegree : + Module.finrank K L = + NumberField.classNumber K) + (v : HeightOneSpectrum (𝓞 K)) + (hprincipal : + FractionalIdealGroup.prime v ∉ + (toPrincipalIdeal (𝓞 K) K).range) : + ¬ _root_.FinitePlaceSplitsCompletely + (K := K) (L := L) v := by + intro hsplit + exact + hprincipal + (finitePlaceSplitsCompletely_imp_prime_principal_of_maximalEverywhereUnramifiedCyclic + (K := K) (L := L) hunramifiedFinite hdegree v hsplit) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldRealization.lean new file mode 100644 index 0000000000..9cb0bc1363 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldRealization.lean @@ -0,0 +1,318 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Evaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.GlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +/-! +# Actual realizations of the Hilbert class fields + +The big and small Hilbert norm subgroups are closed and have finite +index. The finite-index class-field construction therefore supplies +genuine finite abelian subextensions of the rational separable closure. +This file fixes those subextensions once and for all, names their actual +relative fixed fields, and identifies their determinant-norm ranges. + +The resulting degrees are the orders of the corresponding reciprocity +quotients: the narrow class number for the big Hilbert class field and +the ordinary class number for the small Hilbert class field. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open ClassFormation +open LocalClassFieldTheory +open NumberField +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- The big-Hilbert congruence subgroup has finite index, registered at +the realization layer where the closed finite-index construction uses it. -/ +instance bigHilbertClassFieldNormSubgroupFiniteIndex : + (bigHilbertClassFieldNormSubgroup (K := K)).FiniteIndex := by + unfold bigHilbertClassFieldNormSubgroup + infer_instance + +open scoped Classical in +/-- The concrete finite Galois norm neighbourhood used to realize the +big Hilbert class field. -/ +noncomputable abbrev bigHilbertClassFieldNormAmbient (K : Type) + [Field K] [NumberField K] : Type := + closedFiniteIndexClassFieldNormAmbient + (K := K) + (bigHilbertClassFieldNormSubgroup (K := K)) + (bigHilbertClassFieldNormSubgroup_isClosed (K := K)) + +open scoped Classical in +/-- The concrete finite Galois norm neighbourhood used to realize the +small Hilbert class field. -/ +noncomputable abbrev smallHilbertClassFieldNormAmbient (K : Type) + [Field K] [NumberField K] : Type := + closedFiniteIndexClassFieldNormAmbient + (K := K) + (smallHilbertClassFieldNormSubgroup (K := K)) + (smallHilbertClassFieldNormSubgroup_isClosed (K := K)) + +open scoped Classical in +/-- The compatible abstract base subgroup for the actual big Hilbert +class-field realization. -/ +noncomputable abbrev bigHilbertClassFieldBaseSubgroup (K : Type) + [Field K] [NumberField K] := + closedFiniteIndexClassFieldBaseSubgroup + (K := K) (bigHilbertClassFieldNormSubgroup (K := K)) + (bigHilbertClassFieldNormSubgroup_isClosed (K := K)) + +open scoped Classical in +/-- The finite abelian subextension selected by the big-Hilbert norm +subgroup. This is the actual class-field witness, rather than merely an +existence proposition. -/ +noncomputable abbrev bigHilbertClassFieldSubextension (K : Type) + [Field K] [NumberField K] : + FiniteAbelianSubextension + (bigHilbertClassFieldBaseSubgroup K) := + closedFiniteIndexClassFieldSubextension + (K := K) (bigHilbertClassFieldNormSubgroup (K := K)) + (bigHilbertClassFieldNormSubgroup_isClosed (K := K)) + +open scoped Classical in +/-- The compatible actual copy of the original number field occurring +as the base fixed field in the big-Hilbert realization. -/ +noncomputable abbrev bigHilbertClassFieldBase (K : Type) + [Field K] [NumberField K] : Type := + closedFiniteIndexClassFieldBase + (K := K) (bigHilbertClassFieldNormSubgroup (K := K)) + (bigHilbertClassFieldNormSubgroup_isClosed (K := K)) + +open scoped Classical in +/-- The actual big Hilbert class field selected inside the rational +separable closure. -/ +noncomputable abbrev bigHilbertClassField (K : Type) + [Field K] [NumberField K] : Type := + closedFiniteIndexClassField + (K := K) (bigHilbertClassFieldNormSubgroup (K := K)) + (bigHilbertClassFieldNormSubgroup_isClosed (K := K)) + +open scoped Classical in +/-- The canonical equivalence from `K` to the actual base fixed field +used by the selected big Hilbert class field. -/ +noncomputable abbrev bigHilbertClassFieldBaseEquiv : + K ≃ₐ[ℚ] bigHilbertClassFieldBase K := + closedFiniteIndexClassFieldBaseEquiv + (K := K) (bigHilbertClassFieldNormSubgroup (K := K)) + (bigHilbertClassFieldNormSubgroup_isClosed (K := K)) + +open scoped Classical in +/-- The big-Hilbert norm subgroup transported to the actual base fixed +field of the selected realization. -/ +def bigHilbertClassFieldTransportedNormSubgroup : + Subgroup (IdeleClassGroup (bigHilbertClassFieldBase K)) := + (bigHilbertClassFieldNormSubgroup (K := K)).map + (ideleClassCongr + (bigHilbertClassFieldBaseEquiv (K := K))).toMonoidHom + +open scoped Classical in +/-- The determinant-norm range of the actual big Hilbert class field is +exactly the transported big-Hilbert norm subgroup. -/ +theorem bigHilbertClassField_ideleClassNorm_range : + (_root_.ideleClassNorm + (bigHilbertClassFieldBase K) + (bigHilbertClassField K)).range = + bigHilbertClassFieldTransportedNormSubgroup (K := K) := by + simpa only [bigHilbertClassFieldTransportedNormSubgroup, + bigHilbertClassFieldBaseEquiv, bigHilbertClassField, + bigHilbertClassFieldBase] using + (closedFiniteIndexClassField_ideleClassNorm_range_over_base + (K := K) (bigHilbertClassFieldNormSubgroup (K := K)) + (bigHilbertClassFieldNormSubgroup_isClosed (K := K))) + +open scoped Classical in +private theorem + closedFiniteIndexClassField_finrank_over_base_eq_index + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + Module.finrank + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) + (closedFiniteIndexClassField + (K := K) H hclosed) = + H.index := by + calc + Module.finrank + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) + (closedFiniteIndexClassField + (K := K) H hclosed) = + (_root_.ideleClassNorm + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) + (closedFiniteIndexClassField + (K := K) H hclosed)).range.index := + (ideleClassNorm_index_eq_finrank_abelian + (closedFiniteIndexClassFieldBase + (K := K) H hclosed) + (closedFiniteIndexClassField + (K := K) H hclosed)).symm + _ = (H.map + (ideleClassCongr + (closedFiniteIndexClassFieldBaseEquiv + (K := K) H hclosed)).toMonoidHom).index := + congrArg Subgroup.index + (closedFiniteIndexClassField_ideleClassNorm_range_over_base + (K := K) H hclosed) + _ = H.index := + Subgroup.index_map_equiv H + (ideleClassCongr + (closedFiniteIndexClassFieldBaseEquiv + (K := K) H hclosed)) + +open scoped Classical in +/-- The degree of the actual big Hilbert class field is the narrow +class number. -/ +theorem bigHilbertClassField_finrank_eq_narrowClassGroup_card : + Module.finrank + (bigHilbertClassFieldBase K) + (bigHilbertClassField K) = + Nat.card (RayClass.NarrowClassGroup K) := by + calc + Module.finrank + (bigHilbertClassFieldBase K) + (bigHilbertClassField K) = + (bigHilbertClassFieldNormSubgroup (K := K)).index := + closedFiniteIndexClassField_finrank_over_base_eq_index + (bigHilbertClassFieldNormSubgroup (K := K)) + (bigHilbertClassFieldNormSubgroup_isClosed (K := K)) + _ = + Nat.card + (IdeleClassGroup K ⧸ + bigHilbertClassFieldNormSubgroup (K := K)) := + Subgroup.index_eq_card + (bigHilbertClassFieldNormSubgroup (K := K)) + _ = Nat.card (RayClass.NarrowClassGroup K) := + Nat.card_congr + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).toEquiv + +open scoped Classical in +/-- The compatible abstract base subgroup for the actual small Hilbert +class-field realization. -/ +noncomputable abbrev smallHilbertClassFieldBaseSubgroup (K : Type) + [Field K] [NumberField K] := + closedFiniteIndexClassFieldBaseSubgroup + (K := K) (smallHilbertClassFieldNormSubgroup (K := K)) + (smallHilbertClassFieldNormSubgroup_isClosed (K := K)) + +open scoped Classical in +/-- The finite abelian subextension selected by the small-Hilbert norm +subgroup. This named witness is the input used by principalization. -/ +noncomputable abbrev smallHilbertClassFieldSubextension (K : Type) + [Field K] [NumberField K] : + FiniteAbelianSubextension + (smallHilbertClassFieldBaseSubgroup K) := + closedFiniteIndexClassFieldSubextension + (K := K) (smallHilbertClassFieldNormSubgroup (K := K)) + (smallHilbertClassFieldNormSubgroup_isClosed (K := K)) + +open scoped Classical in +/-- The compatible actual copy of the original number field occurring +as the base fixed field in the small-Hilbert realization. -/ +noncomputable abbrev smallHilbertClassFieldBase (K : Type) + [Field K] [NumberField K] : Type := + closedFiniteIndexClassFieldBase + (K := K) (smallHilbertClassFieldNormSubgroup (K := K)) + (smallHilbertClassFieldNormSubgroup_isClosed (K := K)) + +open scoped Classical in +/-- The actual small Hilbert class field selected inside the rational +separable closure. -/ +noncomputable abbrev smallHilbertClassField (K : Type) + [Field K] [NumberField K] : Type := + closedFiniteIndexClassField + (K := K) (smallHilbertClassFieldNormSubgroup (K := K)) + (smallHilbertClassFieldNormSubgroup_isClosed (K := K)) + +open scoped Classical in +/-- The canonical equivalence from `K` to the actual base fixed field +used by the selected small Hilbert class field. -/ +noncomputable abbrev smallHilbertClassFieldBaseEquiv : + K ≃ₐ[ℚ] smallHilbertClassFieldBase K := + closedFiniteIndexClassFieldBaseEquiv + (K := K) (smallHilbertClassFieldNormSubgroup (K := K)) + (smallHilbertClassFieldNormSubgroup_isClosed (K := K)) + +open scoped Classical in +/-- The small-Hilbert norm subgroup transported to the actual base fixed +field of the selected realization. -/ +def smallHilbertClassFieldTransportedNormSubgroup : + Subgroup (IdeleClassGroup (smallHilbertClassFieldBase K)) := + (smallHilbertClassFieldNormSubgroup (K := K)).map + (ideleClassCongr + (smallHilbertClassFieldBaseEquiv (K := K))).toMonoidHom + +open scoped Classical in +/-- The determinant-norm range of the actual small Hilbert class field +is exactly the transported small-Hilbert norm subgroup. -/ +theorem smallHilbertClassField_ideleClassNorm_range : + (_root_.ideleClassNorm + (smallHilbertClassFieldBase K) + (smallHilbertClassField K)).range = + smallHilbertClassFieldTransportedNormSubgroup (K := K) := by + simpa only [smallHilbertClassFieldTransportedNormSubgroup, + smallHilbertClassFieldBaseEquiv, smallHilbertClassField, + smallHilbertClassFieldBase] using + (closedFiniteIndexClassField_ideleClassNorm_range_over_base + (K := K) (smallHilbertClassFieldNormSubgroup (K := K)) + (smallHilbertClassFieldNormSubgroup_isClosed (K := K))) + +open scoped Classical in +/-- The degree of the actual small Hilbert class field is the ordinary +class number. -/ +theorem smallHilbertClassField_finrank_eq_classNumber : + Module.finrank + (smallHilbertClassFieldBase K) + (smallHilbertClassField K) = + NumberField.classNumber K := by + calc + Module.finrank + (smallHilbertClassFieldBase K) + (smallHilbertClassField K) = + (smallHilbertClassFieldNormSubgroup (K := K)).index := + closedFiniteIndexClassField_finrank_over_base_eq_index + (smallHilbertClassFieldNormSubgroup (K := K)) + (smallHilbertClassFieldNormSubgroup_isClosed (K := K)) + _ = + Nat.card + (IdeleClassGroup K ⧸ + smallHilbertClassFieldNormSubgroup (K := K)) := + Subgroup.index_eq_card + (smallHilbertClassFieldNormSubgroup (K := K)) + _ = NumberField.classNumber K := + smallHilbertClassFieldQuotient_card_eq_classNumber + (K := K) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity.lean new file mode 100644 index 0000000000..dfd7ff09b3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigActual +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigOriginal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallActual +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallOriginal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.Transport + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/All.lean new file mode 100644 index 0000000000..cffe26db20 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/All.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigActual +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigOriginal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallActual +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallOriginal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.Transport +/-! +# Reciprocity for the actual Hilbert class fields + +This compatibility facade exports the generic transport core and the +independently compiled big/small, realized-base/original-base reciprocity +specializations. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean new file mode 100644 index 0000000000..7dea118eb1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean @@ -0,0 +1,152 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.Transport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison +/-! +# Big Hilbert reciprocity over the realized base field + +This leaf specializes the shared reciprocity transport to the actual base +field of the selected big Hilbert class field. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +local instance + bigHilbertClassFieldReciprocityIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + hilbertClassFieldReciprocityIdeleClassGroupIsMulCommutative + +attribute [local instance] bigHilbertClassFieldReciprocityIdeleClassGroupIsMulCommutative + +open scoped Classical in +/-- The actual norm range of the selected big Hilbert class field is +the intrinsic big-Hilbert norm subgroup of its actual base field. -/ +theorem bigHilbertClassField_ideleClassNorm_range_eq_intrinsic : + (_root_.ideleClassNorm + (bigHilbertClassFieldBase K) + (bigHilbertClassField K)).range = + bigHilbertClassFieldNormSubgroup + (K := bigHilbertClassFieldBase K) := by + rw [bigHilbertClassField_ideleClassNorm_range] + exact + bigHilbertClassFieldNormSubgroup_map_ideleClassCongr + (bigHilbertClassFieldBaseEquiv (K := K)) + +open scoped Classical in +/-- Global reciprocity identifies the genuine Galois group of the +selected big Hilbert class field with the narrow ideal class group of +the original number field. -/ +noncomputable def bigHilbertClassFieldReciprocityData : + {e : Gal((bigHilbertClassField K)/(bigHilbertClassFieldBase K)) ≃* + RayClass.NarrowClassGroup K // + ∀ c : IdeleClassGroup (bigHilbertClassFieldBase K), + e (globalNormResidueMonoidHom + (bigHilbertClassFieldBase K) + (bigHilbertClassField K) c) = + bigHilbertNarrowClassGroupCongr + (bigHilbertClassFieldBaseEquiv (K := K)).symm + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := bigHilbertClassFieldBase K) + (QuotientGroup.mk' + (bigHilbertClassFieldNormSubgroup + (K := bigHilbertClassFieldBase K)) c))} := by + let d := hilbertClassFieldGlobalReciprocityTransportData + (bigHilbertClassFieldNormSubgroup + (K := bigHilbertClassFieldBase K)) + (bigHilbertClassField_ideleClassNorm_range_eq_intrinsic + (K := K)) + ((bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := bigHilbertClassFieldBase K)).trans + (bigHilbertNarrowClassGroupCongr + (bigHilbertClassFieldBaseEquiv (K := K)).symm)) + refine ⟨d.1, ?_⟩ + intro c + exact d.2 c + +open scoped Classical in +/-- The reciprocity equivalence from the actual big Hilbert Galois group +to the narrow class group of the original number field. -/ +noncomputable def bigHilbertClassFieldGaloisEquivNarrowClassGroup : + Gal((bigHilbertClassField K)/(bigHilbertClassFieldBase K)) ≃* + RayClass.NarrowClassGroup K := + (bigHilbertClassFieldReciprocityData (K := K)).1 + +open scoped Classical in +/-- Under big-Hilbert reciprocity, the actual global norm-residue +symbol is the narrow ideal class of its idèle-class representative, +transported back to the original number field. -/ +theorem bigHilbertClassFieldGaloisEquivNarrowClassGroup_globalNormResidue + (c : IdeleClassGroup (bigHilbertClassFieldBase K)) : + bigHilbertClassFieldGaloisEquivNarrowClassGroup (K := K) + (globalNormResidueMonoidHom + (bigHilbertClassFieldBase K) + (bigHilbertClassField K) c) = + bigHilbertNarrowClassGroupCongr + (bigHilbertClassFieldBaseEquiv (K := K)).symm + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := bigHilbertClassFieldBase K) + (QuotientGroup.mk' + (bigHilbertClassFieldNormSubgroup + (K := bigHilbertClassFieldBase K)) c)) := by + exact (bigHilbertClassFieldReciprocityData (K := K)).2 c + +open scoped Classical in +/-- Representative form of big-Hilbert reciprocity: the global +norm-residue symbol of an actual idèle maps to its narrow ideal +class, with only the canonical base-field transport remaining. -/ +theorem bigHilbertClassFieldGaloisEquivNarrowClassGroup_idele + (a : IdeleGroup (bigHilbertClassFieldBase K)) : + bigHilbertClassFieldGaloisEquivNarrowClassGroup (K := K) + (globalNormResidueMonoidHom + (bigHilbertClassFieldBase K) + (bigHilbertClassField K) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup + (bigHilbertClassFieldBase K)) a)) = + bigHilbertNarrowClassGroupCongr + (bigHilbertClassFieldBaseEquiv (K := K)).symm + (QuotientGroup.mk' + (RayClass.narrowDenominator + (K := bigHilbertClassFieldBase K)) a) := by + calc + _ = bigHilbertNarrowClassGroupCongr + (bigHilbertClassFieldBaseEquiv (K := K)).symm + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := bigHilbertClassFieldBase K) + (QuotientGroup.mk' + (bigHilbertClassFieldNormSubgroup + (K := bigHilbertClassFieldBase K)) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup + (bigHilbertClassFieldBase K)) a))) := + (bigHilbertClassFieldReciprocityData (K := K)).2 _ + _ = _ := + congrArg + (bigHilbertNarrowClassGroupCongr + (bigHilbertClassFieldBaseEquiv (K := K)).symm) + (bigHilbertClassFieldQuotientEquivNarrowClassGroup_mk + (K := bigHilbertClassFieldBase K) a) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigOriginal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigOriginal.lean new file mode 100644 index 0000000000..f632442433 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigOriginal.lean @@ -0,0 +1,150 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigActual +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldOverOriginalBase +/-! +# Big Hilbert reciprocity over the original number field + +The original-base specialization is compiled separately from the realized-base +specialization and reuses the shared reciprocity transport provider. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +local instance + bigHilbertClassFieldReciprocityOverOriginalIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + hilbertClassFieldReciprocityIdeleClassGroupIsMulCommutative + +attribute [local instance] bigHilbertClassFieldReciprocityOverOriginalIsMulCommutative + +open scoped Classical in +/-- Over the original number field scalar structure, the actual norm +range of the selected big Hilbert class field is exactly the intrinsic +big-Hilbert norm subgroup. -/ +theorem bigHilbertClassField_ideleClassNorm_range_over_original : + (_root_.ideleClassNorm K (bigHilbertClassField K)).range = + bigHilbertClassFieldNormSubgroup (K := K) := by + let e := + bigHilbertClassFieldBaseEquiv (K := K) + let g := + (ideleClassCongr e).toMonoidHom + apply + Subgroup.map_injective + (f := g) + (ideleClassCongr e).injective + calc + ((_root_.ideleClassNorm K + (bigHilbertClassField K)).range).map g = + (_root_.ideleClassNorm + (bigHilbertClassFieldBase K) + (bigHilbertClassField K)).range := by + exact + ordinaryIdeleClassNorm_range_map_congrOfAlgEquiv + e + (AlgEquiv.refl + (R := ℚ) (A₁ := bigHilbertClassField K)) + (fun x => by + exact bigHilbertClassField_algebraMap_original K x) + _ = + bigHilbertClassFieldNormSubgroup + (K := bigHilbertClassFieldBase K) := + bigHilbertClassField_ideleClassNorm_range_eq_intrinsic + (K := K) + _ = + (bigHilbertClassFieldNormSubgroup (K := K)).map g := + (bigHilbertClassFieldNormSubgroup_map_ideleClassCongr e).symm + +open scoped Classical in +/-- Global reciprocity for the selected big Hilbert class field over +the original number field gives the narrow ideal class group directly, +without a residual fixed-field transport. -/ +private noncomputable def + bigHilbertClassFieldReciprocityOverOriginalData : + {e : Gal((bigHilbertClassField K)/K) ≃* + RayClass.NarrowClassGroup K // + ∀ c : IdeleClassGroup K, + e (globalNormResidueMonoidHom K + (bigHilbertClassField K) c) = + bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K) + (QuotientGroup.mk' + (bigHilbertClassFieldNormSubgroup (K := K)) c)} := by + let d := hilbertClassFieldGlobalReciprocityTransportData + (bigHilbertClassFieldNormSubgroup (K := K)) + (bigHilbertClassField_ideleClassNorm_range_over_original + (K := K)) + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)) + refine ⟨d.1, ?_⟩ + intro c + exact d.2 c + +open scoped Classical in +/-- The direct reciprocity equivalence for the big Hilbert class field, +using the original number field as the scalar base. -/ +noncomputable def + bigHilbertClassFieldGaloisEquivNarrowClassGroupOverOriginal : + Gal((bigHilbertClassField K)/K) ≃* + RayClass.NarrowClassGroup K := + (bigHilbertClassFieldReciprocityOverOriginalData (K := K)).1 + +open scoped Classical in +/-- The direct big-Hilbert reciprocity equivalence sends the genuine +global norm-residue symbol to its narrow ideal class. -/ +theorem + bigHilbertClassFieldGaloisEquivNarrowClassGroupOverOriginal_globalNormResidue + (c : IdeleClassGroup K) : + bigHilbertClassFieldGaloisEquivNarrowClassGroupOverOriginal + (K := K) + (globalNormResidueMonoidHom K + (bigHilbertClassField K) c) = + bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K) + (QuotientGroup.mk' + (bigHilbertClassFieldNormSubgroup (K := K)) c) := by + exact + (bigHilbertClassFieldReciprocityOverOriginalData (K := K)).2 c + +open scoped Classical in +/-- On an actual idèle, direct big-Hilbert reciprocity is its narrow +ideal class. -/ +theorem bigHilbertClassFieldGaloisEquivNarrowClassGroupOverOriginal_idele + (a : IdeleGroup K) : + bigHilbertClassFieldGaloisEquivNarrowClassGroupOverOriginal + (K := K) + (globalNormResidueMonoidHom K + (bigHilbertClassField K) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a)) = + QuotientGroup.mk' + (RayClass.narrowDenominator (K := K)) a := by + exact + ((bigHilbertClassFieldReciprocityOverOriginalData (K := K)).2 + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) a)).trans + (bigHilbertClassFieldQuotientEquivNarrowClassGroup_mk + (K := K) a) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean new file mode 100644 index 0000000000..7d2a2bc50a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean @@ -0,0 +1,151 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.Transport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldNaturality +/-! +# Small Hilbert reciprocity over the realized base field + +This leaf specializes the shared reciprocity transport to the actual base +field of the selected small Hilbert class field. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +local instance + smallHilbertClassFieldReciprocityIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + hilbertClassFieldReciprocityIdeleClassGroupIsMulCommutative + +attribute [local instance] smallHilbertClassFieldReciprocityIdeleClassGroupIsMulCommutative + +open scoped Classical in +/-- The actual norm range of the selected small Hilbert class field is +the intrinsic small-Hilbert norm subgroup of its actual base field. -/ +theorem smallHilbertClassField_ideleClassNorm_range_eq_intrinsic : + (_root_.ideleClassNorm + (smallHilbertClassFieldBase K) + (smallHilbertClassField K)).range = + smallHilbertClassFieldNormSubgroup + (K := smallHilbertClassFieldBase K) := by + rw [smallHilbertClassField_ideleClassNorm_range] + exact + smallHilbertClassFieldNormSubgroup_map_ideleClassCongr + (smallHilbertClassFieldBaseEquiv (K := K)) + +open scoped Classical in +/-- Global reciprocity identifies the genuine Galois group of the +selected small Hilbert class field with the ordinary ideal class group +of the original number field. -/ +noncomputable def smallHilbertClassFieldReciprocityData : + {e : Gal((smallHilbertClassField K)/(smallHilbertClassFieldBase K)) ≃* + ClassGroup (𝓞 K) // + ∀ c : IdeleClassGroup (smallHilbertClassFieldBase K), + e (globalNormResidueMonoidHom + (smallHilbertClassFieldBase K) + (smallHilbertClassField K) c) = + smallHilbertClassGroupCongr + (smallHilbertClassFieldBaseEquiv (K := K)).symm + (smallHilbertClassFieldQuotientEquivClassGroup + (K := smallHilbertClassFieldBase K) + (QuotientGroup.mk' + (smallHilbertClassFieldNormSubgroup + (K := smallHilbertClassFieldBase K)) c))} := by + let d := hilbertClassFieldGlobalReciprocityTransportData + (smallHilbertClassFieldNormSubgroup + (K := smallHilbertClassFieldBase K)) + (smallHilbertClassField_ideleClassNorm_range_eq_intrinsic + (K := K)) + ((smallHilbertClassFieldQuotientEquivClassGroup + (K := smallHilbertClassFieldBase K)).trans + (smallHilbertClassGroupCongr + (smallHilbertClassFieldBaseEquiv (K := K)).symm)) + refine ⟨d.1, ?_⟩ + intro c + exact d.2 c + +open scoped Classical in +/-- The reciprocity equivalence from the actual small Hilbert Galois group +to the ordinary ideal class group of the original number field. -/ +noncomputable def smallHilbertClassFieldGaloisEquivClassGroup : + Gal((smallHilbertClassField K)/(smallHilbertClassFieldBase K)) ≃* + ClassGroup (𝓞 K) := + (smallHilbertClassFieldReciprocityData (K := K)).1 + +open scoped Classical in +/-- Under the small-Hilbert reciprocity equivalence, the actual global +norm-residue symbol of an idèle class is its ordinary ideal class, +transported back from the concrete base fixed field to the original +number field. -/ +theorem smallHilbertClassFieldGaloisEquivClassGroup_globalNormResidue + (c : IdeleClassGroup (smallHilbertClassFieldBase K)) : + smallHilbertClassFieldGaloisEquivClassGroup (K := K) + (globalNormResidueMonoidHom + (smallHilbertClassFieldBase K) + (smallHilbertClassField K) c) = + smallHilbertClassGroupCongr + (smallHilbertClassFieldBaseEquiv (K := K)).symm + (smallHilbertClassFieldQuotientEquivClassGroup + (K := smallHilbertClassFieldBase K) + (QuotientGroup.mk' + (smallHilbertClassFieldNormSubgroup + (K := smallHilbertClassFieldBase K)) c)) := by + exact (smallHilbertClassFieldReciprocityData (K := K)).2 c + +open scoped Classical in +/-- Representative form of small-Hilbert reciprocity: the global +norm-residue symbol of an actual idèle maps to its ordinary ideal +class, with only the canonical base-field transport remaining. -/ +theorem smallHilbertClassFieldGaloisEquivClassGroup_idele + (a : IdeleGroup (smallHilbertClassFieldBase K)) : + smallHilbertClassFieldGaloisEquivClassGroup (K := K) + (globalNormResidueMonoidHom + (smallHilbertClassFieldBase K) + (smallHilbertClassField K) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup + (smallHilbertClassFieldBase K)) a)) = + smallHilbertClassGroupCongr + (smallHilbertClassFieldBaseEquiv (K := K)).symm + (IdeleGroup.idealClass a) := by + calc + _ = smallHilbertClassGroupCongr + (smallHilbertClassFieldBaseEquiv (K := K)).symm + (smallHilbertClassFieldQuotientEquivClassGroup + (K := smallHilbertClassFieldBase K) + (QuotientGroup.mk' + (smallHilbertClassFieldNormSubgroup + (K := smallHilbertClassFieldBase K)) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup + (smallHilbertClassFieldBase K)) a))) := + (smallHilbertClassFieldReciprocityData (K := K)).2 _ + _ = _ := + congrArg + (smallHilbertClassGroupCongr + (smallHilbertClassFieldBaseEquiv (K := K)).symm) + (smallHilbertClassFieldQuotientEquivClassGroup_mk + (K := smallHilbertClassFieldBase K) a) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallOriginal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallOriginal.lean new file mode 100644 index 0000000000..b7ca3b8f43 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallOriginal.lean @@ -0,0 +1,148 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallActual +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldOverOriginalBase +/-! +# Small Hilbert reciprocity over the original number field + +The original-base specialization is compiled separately from the realized-base +specialization and reuses the shared reciprocity transport provider. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +local instance + smallHilbertClassFieldReciprocityOverOriginalIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + hilbertClassFieldReciprocityIdeleClassGroupIsMulCommutative + +attribute [local instance] smallHilbertClassFieldReciprocityOverOriginalIsMulCommutative + +open scoped Classical in +/-- Over the original number field scalar structure, the actual norm +range of the selected small Hilbert class field is exactly the +intrinsic small-Hilbert norm subgroup. -/ +theorem smallHilbertClassField_ideleClassNorm_range_over_original : + (_root_.ideleClassNorm K (smallHilbertClassField K)).range = + smallHilbertClassFieldNormSubgroup (K := K) := by + let e := + smallHilbertClassFieldBaseEquiv (K := K) + let g := + (ideleClassCongr e).toMonoidHom + apply + Subgroup.map_injective + (f := g) + (ideleClassCongr e).injective + calc + ((_root_.ideleClassNorm K + (smallHilbertClassField K)).range).map g = + (_root_.ideleClassNorm + (smallHilbertClassFieldBase K) + (smallHilbertClassField K)).range := by + exact + ordinaryIdeleClassNorm_range_map_congrOfAlgEquiv + e + (AlgEquiv.refl + (R := ℚ) (A₁ := smallHilbertClassField K)) + (fun x => by + exact smallHilbertClassField_algebraMap_original K x) + _ = + smallHilbertClassFieldNormSubgroup + (K := smallHilbertClassFieldBase K) := + smallHilbertClassField_ideleClassNorm_range_eq_intrinsic + (K := K) + _ = + (smallHilbertClassFieldNormSubgroup (K := K)).map g := + (smallHilbertClassFieldNormSubgroup_map_ideleClassCongr e).symm + +open scoped Classical in +/-- Global reciprocity for the selected small Hilbert class field over +the original number field gives the ordinary ideal class group +directly. -/ +private noncomputable def + smallHilbertClassFieldReciprocityOverOriginalData : + {e : Gal((smallHilbertClassField K)/K) ≃* + ClassGroup (𝓞 K) // + ∀ c : IdeleClassGroup K, + e (globalNormResidueMonoidHom K + (smallHilbertClassField K) c) = + smallHilbertClassFieldQuotientEquivClassGroup + (K := K) + (QuotientGroup.mk' + (smallHilbertClassFieldNormSubgroup (K := K)) c)} := by + let d := hilbertClassFieldGlobalReciprocityTransportData + (smallHilbertClassFieldNormSubgroup (K := K)) + (smallHilbertClassField_ideleClassNorm_range_over_original + (K := K)) + (smallHilbertClassFieldQuotientEquivClassGroup + (K := K)) + refine ⟨d.1, ?_⟩ + intro c + exact d.2 c + +open scoped Classical in +/-- The direct reciprocity equivalence for the small Hilbert class field, +using the original number field as the scalar base. -/ +noncomputable def smallHilbertClassFieldGaloisEquivClassGroupOverOriginal : + Gal((smallHilbertClassField K)/K) ≃* + ClassGroup (𝓞 K) := + (smallHilbertClassFieldReciprocityOverOriginalData (K := K)).1 + +open scoped Classical in +/-- The direct small-Hilbert reciprocity equivalence sends the genuine +global norm-residue symbol to its ordinary ideal class. -/ +theorem + smallHilbertClassFieldGaloisEquivClassGroupOverOriginal_globalNormResidue + (c : IdeleClassGroup K) : + smallHilbertClassFieldGaloisEquivClassGroupOverOriginal + (K := K) + (globalNormResidueMonoidHom K + (smallHilbertClassField K) c) = + smallHilbertClassFieldQuotientEquivClassGroup + (K := K) + (QuotientGroup.mk' + (smallHilbertClassFieldNormSubgroup (K := K)) c) := by + exact + (smallHilbertClassFieldReciprocityOverOriginalData (K := K)).2 c + +open scoped Classical in +/-- On an actual idèle, direct small-Hilbert reciprocity is its +ordinary ideal class. -/ +theorem smallHilbertClassFieldGaloisEquivClassGroupOverOriginal_idele + (a : IdeleGroup K) : + smallHilbertClassFieldGaloisEquivClassGroupOverOriginal + (K := K) + (globalNormResidueMonoidHom K + (smallHilbertClassField K) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a)) = + IdeleGroup.idealClass a := by + exact + ((smallHilbertClassFieldReciprocityOverOriginalData (K := K)).2 + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) a)).trans + (smallHilbertClassFieldQuotientEquivClassGroup_mk + (K := K) a) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/Transport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/Transport.lean new file mode 100644 index 0000000000..6ffb3167f7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/Transport.lean @@ -0,0 +1,157 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldRealization +/-! +# Generic transport core for Hilbert class-field reciprocity + +The quotient transport and its norm-residue evaluation are compiled once in +this leaf. Big/small and actual/original Hilbert reciprocity specializations +reuse the named data provider without rebuilding the generic reciprocity +composite. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open Reciprocity + +open scoped Classical in +/-- The shared commutativity provider used by the Hilbert reciprocity leaves. -/ +theorem hilbertClassFieldReciprocityIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +open scoped Classical in +local instance + hilbertClassFieldReciprocityIdeleClassGroupIsMulCommutativeLocal + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + hilbertClassFieldReciprocityIdeleClassGroupIsMulCommutative + +attribute [local instance] hilbertClassFieldReciprocityIdeleClassGroupIsMulCommutativeLocal + +open scoped Classical in +/-- Inverse norm-residue evaluation transported through a subgroup equality +and then through an arbitrary multiplicative equivalence. -/ +theorem hilbertClassFieldQuotientTransport_inverse_apply_with + {G A I : Type} [Group G] [Group A] [Group I] + (N H : Subgroup G) [N.Normal] [H.Normal] + (e : Additive (G ⧸ N) ≃+ Additive A) + (h : N = H) (f : G ⧸ H ≃* I) (c : G) : + f (QuotientGroup.quotientMulEquivOfEq h + (Additive.toMul + (e.symm (e + (Additive.ofMul (QuotientGroup.mk' N c)))))) = + f (QuotientGroup.mk' H c) := by + apply congrArg f + calc + _ = QuotientGroup.quotientMulEquivOfEq h + (Additive.toMul + (Additive.ofMul (QuotientGroup.mk' N c))) := + congrArg + (fun z => QuotientGroup.quotientMulEquivOfEq h + (Additive.toMul z)) + (e.symm_apply_apply _) + _ = QuotientGroup.mk' H c := + QuotientGroup.quotientMulEquivOfEq_mk h c + +open scoped Classical in +/-- Global reciprocity followed by subgroup-equality transport and a chosen +quotient equivalence. -/ +noncomputable def hilbertClassFieldGlobalReciprocityTransportEquiv + {F E I : Type} + [Field F] [NumberField F] + [Field E] [NumberField E] [Algebra F E] + [FiniteDimensional F E] [IsAbelianGalois F E] + [Group I] + (H : Subgroup (IdeleClassGroup F)) + (h : (_root_.ideleClassNorm F E).range = H) + (f : IdeleClassGroup F ⧸ H ≃* I) : + Gal(E/F) ≃* I := + (AddEquiv.toMultiplicative + (globalReciprocityEquiv F E)).trans + ((QuotientGroup.quotientMulEquivOfEq h).trans f) + +open scoped Classical in +/-- Evaluation of the shared transported reciprocity equivalence on the +global norm-residue symbol. -/ +theorem hilbertClassFieldGlobalReciprocityTransport_globalNormResidue + {F E I : Type} + [Field F] [NumberField F] + [Field E] [NumberField E] [Algebra F E] + [FiniteDimensional F E] [IsAbelianGalois F E] + [Group I] + (H : Subgroup (IdeleClassGroup F)) + (h : (_root_.ideleClassNorm F E).range = H) + (f : IdeleClassGroup F ⧸ H ≃* I) + (c : IdeleClassGroup F) : + hilbertClassFieldGlobalReciprocityTransportEquiv H h f + (globalNormResidueMonoidHom F E c) = + f (QuotientGroup.mk' H c) := by + have hNormResidue : + Additive.ofMul (globalNormResidueMonoidHom F E c) = + globalNormResidueEquiv F E + (Additive.ofMul + (QuotientGroup.mk' + (_root_.ideleClassNorm F E).range c)) := + congrArg (fun σ => Additive.ofMul σ) + (globalNormResidueMonoidHom_apply F E c) + calc + _ = f (QuotientGroup.quotientMulEquivOfEq h + (Additive.toMul + ((globalNormResidueEquiv F E).symm + (Additive.ofMul + (globalNormResidueMonoidHom F E c))))) := rfl + _ = f (QuotientGroup.quotientMulEquivOfEq h + (Additive.toMul + ((globalNormResidueEquiv F E).symm + (globalNormResidueEquiv F E + (Additive.ofMul + (QuotientGroup.mk' + (_root_.ideleClassNorm F E).range c)))))) := + congrArg + (fun τ => + f (QuotientGroup.quotientMulEquivOfEq h + (Additive.toMul + ((globalNormResidueEquiv F E).symm τ)))) + hNormResidue + _ = f (QuotientGroup.mk' H c) := + hilbertClassFieldQuotientTransport_inverse_apply_with + ((_root_.ideleClassNorm F E).range) H + (globalNormResidueEquiv F E) h f c + +open scoped Classical in +/-- The transported equivalence and its evaluation theorem, packaged once for +all four Hilbert class-field specializations. -/ +noncomputable def hilbertClassFieldGlobalReciprocityTransportData + {F E I : Type} + [Field F] [NumberField F] + [Field E] [NumberField E] [Algebra F E] + [FiniteDimensional F E] [IsAbelianGalois F E] + [Group I] + (H : Subgroup (IdeleClassGroup F)) + (h : (_root_.ideleClassNorm F E).range = H) + (f : IdeleClassGroup F ⧸ H ≃* I) : + {e : Gal(E/F) ≃* I // + ∀ c : IdeleClassGroup F, + e (globalNormResidueMonoidHom F E c) = + f (QuotientGroup.mk' H c)} := + ⟨hilbertClassFieldGlobalReciprocityTransportEquiv H h f, + hilbertClassFieldGlobalReciprocityTransport_globalNormResidue H h f⟩ + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldUnramifiedMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldUnramifiedMaximality.lean new file mode 100644 index 0000000000..6ccb1ccb44 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldUnramifiedMaximality.lean @@ -0,0 +1,202 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.EverywhereUnramifiedTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.Transport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigActual +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallActual +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigOriginal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallOriginal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteLocalGlobalArtinCompatibility +/-! +# Unramifiedness and maximality of Hilbert class fields + +The selected big and small Hilbert class fields have the prescribed +idele-class norm ranges. Exact local--global narrow finite conductor +compatibility therefore turns the vanishing of their intrinsic finite conductors into actual +unramifiedness at every finite prime. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + +/-- Any actual finite abelian realization of the intrinsic big-Hilbert +norm subgroup is unramified at every finite prime. -/ +theorem isUnramifiedAtFinitePlaces_of_normRange_eq_bigHilbertNormSubgroup + (hnorm : + (_root_.ideleClassNorm K L).range = + bigHilbertClassFieldNormSubgroup (K := K)) : + IsUnramifiedAtFinitePlaces K L := by + apply + (ideleClassNorm_narrowFiniteConductor_eq_zero_iff_all_finitePlaces_unramified + (K := K) (L := L)).1 + change + (ideleClassNormConductorialSubgroup + (K := K) (L := L)).narrowFiniteConductor = 0 + have hsub : + ideleClassNormConductorialSubgroup (K := K) (L := L) = + bigHilbertClassFieldConductorialSubgroup (K := K) := + Subtype.ext hnorm + rw [hsub] + exact bigHilbertClassField_narrowFiniteConductor (K := K) + +/-- Any actual finite abelian realization of the intrinsic +small-Hilbert norm subgroup is unramified at every finite prime. -/ +theorem isUnramifiedAtFinitePlaces_of_normRange_eq_smallHilbertNormSubgroup + (hnorm : + (_root_.ideleClassNorm K L).range = + smallHilbertClassFieldNormSubgroup (K := K)) : + IsUnramifiedAtFinitePlaces K L := by + apply + (ideleClassNorm_narrowFiniteConductor_eq_zero_iff_all_finitePlaces_unramified + (K := K) (L := L)).1 + change + (ideleClassNormConductorialSubgroup + (K := K) (L := L)).narrowFiniteConductor = 0 + have hsub : + ideleClassNormConductorialSubgroup (K := K) (L := L) = + smallHilbertClassFieldConductorialSubgroup (K := K) := + Subtype.ext hnorm + rw [hsub] + exact smallHilbertClassField_narrowFiniteConductor (K := K) + +/-- Any actual finite abelian realization of the intrinsic +small-Hilbert norm subgroup splits every infinite place completely. -/ +theorem isUnramifiedAtInfinitePlaces_of_normRange_eq_smallHilbertNormSubgroup + (hnorm : + (_root_.ideleClassNorm K L).range = + smallHilbertClassFieldNormSubgroup (K := K)) : + IsUnramifiedAtInfinitePlaces K L := by + apply + (infiniteTensorNormSubgroups_eq_top_iff_isUnramifiedAtInfinitePlaces + (K := K) (L := L)).1 + intro v + apply top_unique + intro x _hx + apply + (Reciprocity.infinitePlaceIdeleClass_mem_ideleClassNorm_range_iff + (K := K) (L := L) v x).1 + have hxSmall : + IdeleGroup.infinitePlaceIdeleClass v x ∈ + smallHilbertClassFieldNormSubgroup (K := K) := by + refine + ⟨IdeleGroup.infinitePlaceIdele v x, ?_, rfl⟩ + apply Subgroup.mem_sup_left + refine + (FiniteIdeleGroup.mem_integralSubgroup_iff + (IdeleGroup.infinitePlaceIdele v x).2).2 ?_ + intro w + exact + (IdeleGroup.infinitePlaceIdele_finiteComponent v w x).symm ▸ + (w.adicCompletionIntegers K).units.one_mem + rw [hnorm] + exact hxSmall + +/-- Any actual finite abelian realization of the intrinsic +small-Hilbert norm subgroup is everywhere unramified. -/ +theorem isEverywhereUnramified_of_normRange_eq_smallHilbertNormSubgroup + (hnorm : + (_root_.ideleClassNorm K L).range = + smallHilbertClassFieldNormSubgroup (K := K)) : + IsEverywhereUnramified K L where + finitePlaces := + isUnramifiedAtFinitePlaces_of_normRange_eq_smallHilbertNormSubgroup + hnorm + infinitePlaces := + isUnramifiedAtInfinitePlaces_of_normRange_eq_smallHilbertNormSubgroup + hnorm + +omit [FiniteDimensional K L] [IsAbelianGalois K L] in +private theorem ramifiedBaseFinitePlaces_eq_empty_of_isUnramifiedAtFinitePlaces + (hunramified : IsUnramifiedAtFinitePlaces K L) : + _root_.ramifiedBaseFinitePlaces (K := K) (L := L) = ∅ := by + apply Finset.eq_empty_iff_forall_notMem.mpr + intro v hv + obtain ⟨P, _hP, hP⟩ := + (_root_.mem_ramifiedBaseFinitePlaces_iff + (K := K) (L := L) v).1 hv + exact hP (hunramified P) + +variable (K : Type) [Field K] [NumberField K] + +/-- The selected big Hilbert class field is unramified at every finite +prime of the original number field. -/ +theorem bigHilbertClassField_isUnramifiedAtFinitePlaces : + IsUnramifiedAtFinitePlaces K (bigHilbertClassField K) := by + apply + isUnramifiedAtFinitePlaces_of_normRange_eq_bigHilbertNormSubgroup + (K := K) (L := bigHilbertClassField K) + exact bigHilbertClassField_ideleClassNorm_range_over_original + +/-- The selected small Hilbert class field is unramified at every +finite prime of the original number field. -/ +theorem smallHilbertClassField_isUnramifiedAtFinitePlaces : + IsUnramifiedAtFinitePlaces K (smallHilbertClassField K) := by + apply + isUnramifiedAtFinitePlaces_of_normRange_eq_smallHilbertNormSubgroup + (K := K) (L := smallHilbertClassField K) + exact smallHilbertClassField_ideleClassNorm_range_over_original + +/-- Every infinite place splits completely in the selected small +Hilbert class field. Indeed, an idele supported at an infinite place +is integral at every finite place, hence belongs to the intrinsic +small-Hilbert norm subgroup; infinite-place local--global compatibility +then identifies its component with an actual local norm. -/ +theorem smallHilbertClassField_isUnramifiedAtInfinitePlaces : + IsUnramifiedAtInfinitePlaces K (smallHilbertClassField K) := by + apply + isUnramifiedAtInfinitePlaces_of_normRange_eq_smallHilbertNormSubgroup + (K := K) (L := smallHilbertClassField K) + exact smallHilbertClassField_ideleClassNorm_range_over_original + +/-- The selected small Hilbert class field is everywhere unramified +over the original number field. -/ +theorem smallHilbertClassField_isEverywhereUnramified : + IsEverywhereUnramified K (smallHilbertClassField K) := + isEverywhereUnramified_of_normRange_eq_smallHilbertNormSubgroup + (smallHilbertClassField_ideleClassNorm_range_over_original + (K := K)) + +/-- Equivalently, the actual finite ramification set of the selected +big Hilbert class field is empty. -/ +theorem bigHilbertClassField_ramifiedBaseFinitePlaces_eq_empty : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := bigHilbertClassField K) = ∅ := by + exact + ramifiedBaseFinitePlaces_eq_empty_of_isUnramifiedAtFinitePlaces + (K := K) (L := bigHilbertClassField K) + (bigHilbertClassField_isUnramifiedAtFinitePlaces K) + +/-- Equivalently, the actual finite ramification set of the selected +small Hilbert class field is empty. -/ +theorem smallHilbertClassField_ramifiedBaseFinitePlaces_eq_empty : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := smallHilbertClassField K) = ∅ := by + exact + ramifiedBaseFinitePlaces_eq_empty_of_isUnramifiedAtFinitePlaces + (K := K) (L := smallHilbertClassField K) + (smallHilbertClassField_isUnramifiedAtFinitePlaces K) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertNormCharacterization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertNormCharacterization.lean new file mode 100644 index 0000000000..d9624b5a10 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertNormCharacterization.lean @@ -0,0 +1,316 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex +/-! +# Hilbert norm subgroups and unramified extensions + +For a finite Galois extension with no ramified finite prime, the actual +idele-class narrow finite conductor is zero. Consequently its norm subgroup +contains the big-Hilbert norm subgroup. This is the norm-subgroup form +of the maximality of the big Hilbert class field. + +The inclusion yields a canonical surjection from the narrow class group +onto the actual norm quotient, together with the exact kernel +factorization and the resulting divisibility of orders. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- Keep norm-range quotient normality out of exported declaration types. -/ +local instance + hilbertNormCharacterization_ideleClassGroupIsMulCommutative : + IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +/-- If no finite prime of the base ramifies in the extension, then the +narrow finite conductor of the actual idele-class norm subgroup is zero. -/ +theorem ideleClassNorm_narrowFiniteConductor_eq_zero_of_no_ramifiedFinitePlaces + (hunramified : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + ideleClassNormNarrowFiniteConductor (K := K) (L := L) = 0 := by + ext v + rw [Finsupp.zero_apply] + apply Finsupp.notMem_support_iff.mp + intro hv + have hramified := + ideleClassNorm_narrowFiniteConductor_support_subset_ramifiedBaseFinitePlaces + (K := K) (L := L) hv + rw [hunramified] at hramified + simp at hramified + +/-- The norm subgroup of every finite Galois extension unramified at all +finite primes contains the big-Hilbert norm subgroup. -/ +theorem + bigHilbertClassFieldNormSubgroup_le_ideleClassNorm_range_of_no_ramifiedFinitePlaces + (hunramified : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + bigHilbertClassFieldNormSubgroup (K := K) ≤ + (_root_.ideleClassNorm K L).range := by + apply + (bigHilbertClassFieldNormSubgroup_le_iff_narrowFiniteConductor_eq_zero + (ideleClassNormConductorialSubgroup (K := K) (L := L))).2 + exact + ideleClassNorm_narrowFiniteConductor_eq_zero_of_no_ramifiedFinitePlaces + (K := K) (L := L) hunramified + +/-- The canonical transition from the big-Hilbert reciprocity quotient +to the actual norm quotient of an everywhere finite-unramified +extension. -/ +def bigHilbertClassFieldQuotientToIdeleClassNormQuotient + (hunramified : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + (IdeleClassGroup K ⧸ + bigHilbertClassFieldNormSubgroup (K := K)) →* + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + QuotientGroup.map + (bigHilbertClassFieldNormSubgroup (K := K)) + ((_root_.ideleClassNorm K L).range) + (MonoidHom.id _) + (fun _ hx => + bigHilbertClassFieldNormSubgroup_le_ideleClassNorm_range_of_no_ramifiedFinitePlaces + (K := K) (L := L) hunramified hx) + +/-- The big-Hilbert quotient transition sends an idele class to the +same class modulo the actual norm subgroup. -/ +theorem bigHilbertClassFieldQuotientToIdeleClassNormQuotient_mk + (hunramified : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (x : IdeleClassGroup K) : + bigHilbertClassFieldQuotientToIdeleClassNormQuotient + (K := K) (L := L) hunramified + (QuotientGroup.mk' + (bigHilbertClassFieldNormSubgroup (K := K)) x) = + QuotientGroup.mk' + ((_root_.ideleClassNorm K L).range) x := + rfl + +/-- The transition from the big-Hilbert quotient to an everywhere +finite-unramified actual norm quotient is surjective. -/ +theorem + bigHilbertClassFieldQuotientToIdeleClassNormQuotient_surjective + (hunramified : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + Function.Surjective + (bigHilbertClassFieldQuotientToIdeleClassNormQuotient + (K := K) (L := L) hunramified) := by + intro q + obtain ⟨x, rfl⟩ := + QuotientGroup.mk'_surjective + ((_root_.ideleClassNorm K L).range) q + exact + ⟨QuotientGroup.mk' + (bigHilbertClassFieldNormSubgroup (K := K)) x, + rfl⟩ + +/-- The kernel of the big-Hilbert quotient transition is the image of +the actual norm subgroup modulo the big-Hilbert norm subgroup. -/ +theorem + bigHilbertClassFieldQuotientToIdeleClassNormQuotient_ker + (hunramified : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + MonoidHom.ker + (bigHilbertClassFieldQuotientToIdeleClassNormQuotient + (K := K) (L := L) hunramified) = + Subgroup.map + (QuotientGroup.mk' + (bigHilbertClassFieldNormSubgroup (K := K))) + ((_root_.ideleClassNorm K L).range) := by + unfold bigHilbertClassFieldQuotientToIdeleClassNormQuotient + exact + (QuotientGroup.ker_map + (N := bigHilbertClassFieldNormSubgroup (K := K)) + ((_root_.ideleClassNorm K L).range) + (MonoidHom.id (IdeleClassGroup K)) + (fun _ hx => + bigHilbertClassFieldNormSubgroup_le_ideleClassNorm_range_of_no_ramifiedFinitePlaces + (K := K) (L := L) hunramified hx)).trans + (congrArg + (Subgroup.map + (QuotientGroup.mk' (bigHilbertClassFieldNormSubgroup (K := K)))) + (Subgroup.comap_id ((_root_.ideleClassNorm K L).range))) + +/-- For an everywhere finite-unramified extension, quotienting the +big-Hilbert reciprocity quotient by the image of its actual norm +subgroup recovers the actual norm quotient. -/ +def bigHilbertNormImageQuotientEquivIdeleClassNormQuotient + (hunramified : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + ((IdeleClassGroup K ⧸ + bigHilbertClassFieldNormSubgroup (K := K)) ⧸ + Subgroup.map + (QuotientGroup.mk' + (bigHilbertClassFieldNormSubgroup (K := K))) + ((_root_.ideleClassNorm K L).range)) ≃* + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + (QuotientGroup.quotientMulEquivOfEq + (bigHilbertClassFieldQuotientToIdeleClassNormQuotient_ker + (K := K) (L := L) hunramified).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (bigHilbertClassFieldQuotientToIdeleClassNormQuotient + (K := K) (L := L) hunramified) + (bigHilbertClassFieldQuotientToIdeleClassNormQuotient_surjective + (K := K) (L := L) hunramified)) + +/-- The narrow class group maps canonically onto the actual norm +quotient of every everywhere finite-unramified extension. -/ +def narrowClassGroupToIdeleClassNormQuotient + (hunramified : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + RayClass.NarrowClassGroup K →* + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + (bigHilbertClassFieldQuotientToIdeleClassNormQuotient + (K := K) (L := L) hunramified).comp + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).symm.toMonoidHom + +/-- The canonical map from the narrow class group to an everywhere +finite-unramified actual norm quotient is surjective. -/ +theorem narrowClassGroupToIdeleClassNormQuotient_surjective + (hunramified : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + Function.Surjective + (narrowClassGroupToIdeleClassNormQuotient + (K := K) (L := L) hunramified) := + (bigHilbertClassFieldQuotientToIdeleClassNormQuotient_surjective + (K := K) (L := L) hunramified).comp + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).symm.surjective + +/-- The actual norm quotient of an everywhere finite-unramified +extension has order dividing the narrow class number. -/ +theorem + ideleClassNormQuotient_card_dvd_narrowClassGroup_card_of_no_ramifiedFinitePlaces + (hunramified : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ∣ + Nat.card (RayClass.NarrowClassGroup K) := by + calc + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ∣ + Nat.card + (IdeleClassGroup K ⧸ + bigHilbertClassFieldNormSubgroup (K := K)) := by + simpa only [Subgroup.index_eq_card] using + Subgroup.index_dvd_of_le + (bigHilbertClassFieldNormSubgroup_le_ideleClassNorm_range_of_no_ramifiedFinitePlaces + (K := K) (L := L) hunramified) + _ = Nat.card (RayClass.NarrowClassGroup K) := + Nat.card_congr + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).toEquiv + +/-- The narrow class number factors as the kernel order of the canonical +map times the order of an everywhere finite-unramified actual norm +quotient. -/ +theorem + narrowClassGroup_card_eq_unramifiedNormKernel_card_mul_normQuotient_card + (hunramified : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + Nat.card (RayClass.NarrowClassGroup K) = + Nat.card + (MonoidHom.ker + (narrowClassGroupToIdeleClassNormQuotient + (K := K) (L := L) hunramified)) * + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + let f := + narrowClassGroupToIdeleClassNormQuotient + (K := K) (L := L) hunramified + have hf : Function.Surjective f := + narrowClassGroupToIdeleClassNormQuotient_surjective + (K := K) (L := L) hunramified + calc + Nat.card (RayClass.NarrowClassGroup K) = + Nat.card (MonoidHom.ker f) * + (MonoidHom.ker f).index := + (Subgroup.card_mul_index (MonoidHom.ker f)).symm + _ = Nat.card (MonoidHom.ker f) * + Nat.card f.range := by + rw [Subgroup.index_ker f] + _ = Nat.card (MonoidHom.ker f) * + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + rw [f.range_eq_top_of_surjective hf, Subgroup.card_top] + +/-- The degree of every finite cyclic extension unramified at all +finite places divides the order of the narrow class group. -/ +theorem + cyclicExtensionDegree_dvd_narrowClassGroup_card_of_no_ramifiedFinitePlaces + [IsCyclic (L ≃ₐ[K] L)] + (hunramified : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + Module.finrank K L ∣ + Nat.card (RayClass.NarrowClassGroup K) := by + simpa only [ + ← Subgroup.index_eq_card, + ClassFieldAxiom.ideleClassNorm_index_eq_finrank_cyclic K L] using + ideleClassNormQuotient_card_dvd_narrowClassGroup_card_of_no_ramifiedFinitePlaces + (K := K) (L := L) hunramified + +/-- For a finite cyclic extension unramified at all finite places, the +narrow class number is the kernel order of the canonical reciprocity +map times the extension degree. -/ +theorem + narrowClassGroup_card_eq_unramifiedCyclicNormKernel_card_mul_extensionDegree + [IsCyclic (L ≃ₐ[K] L)] + (hunramified : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + Nat.card (RayClass.NarrowClassGroup K) = + Nat.card + (MonoidHom.ker + (narrowClassGroupToIdeleClassNormQuotient + (K := K) (L := L) hunramified)) * + Module.finrank K L := by + simpa only [ + ← Subgroup.index_eq_card, + ClassFieldAxiom.ideleClassNorm_index_eq_finrank_cyclic K L] using + narrowClassGroup_card_eq_unramifiedNormKernel_card_mul_normQuotient_card + (K := K) (L := L) hunramified + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/InfiniteAbelianClassFieldCorrespondence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/InfiniteAbelianClassFieldCorrespondence.lean new file mode 100644 index 0000000000..281010aec1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/InfiniteAbelianClassFieldCorrespondence.lean @@ -0,0 +1,195 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianKernel +/-! +# Infinite abelian class-field correspondence + +Maximal abelian reciprocity transports closed subgroups of the idele-class +component quotient to closed subgroups of the maximal abelian Galois group. +Composing this transport with the infinite Galois correspondence gives the +order-reversing infinite abelian class-field correspondence. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClosedSubgroup + +variable {G H : Type*} + [Group G] [TopologicalSpace G] + [Group H] [TopologicalSpace H] + +open scoped Classical in +/-- Transport a closed subgroup along a continuous multiplicative +equivalence. -/ +noncomputable def mapContinuousMulEquiv + (e : G ≃ₜ* H) (S : ClosedSubgroup G) : ClosedSubgroup H where + toSubgroup := e.toMulEquiv.mapSubgroup S.toSubgroup + isClosed' := by + change IsClosed (e '' (S : Set G)) + exact e.toHomeomorph.isClosedMap (S : Set G) S.isClosed' + +open scoped Classical in +/-- A continuous multiplicative equivalence induces an order equivalence on +closed subgroups. -/ +noncomputable def orderIsoMapContinuousMulEquiv + (e : G ≃ₜ* H) : ClosedSubgroup G ≃o ClosedSubgroup H where + toFun := mapContinuousMulEquiv e + invFun := mapContinuousMulEquiv e.symm + left_inv S := by + apply ClosedSubgroup.toSubgroup_injective + change + e.symm.toMulEquiv.mapSubgroup + (e.toMulEquiv.mapSubgroup S.toSubgroup) = + S.toSubgroup + exact e.toMulEquiv.mapSubgroup.left_inv S.toSubgroup + right_inv T := by + apply ClosedSubgroup.toSubgroup_injective + change + e.toMulEquiv.mapSubgroup + (e.symm.toMulEquiv.mapSubgroup T.toSubgroup) = + T.toSubgroup + exact e.toMulEquiv.mapSubgroup.right_inv T.toSubgroup + map_rel_iff' {S T} := by + change + e.toMulEquiv.mapSubgroup S.toSubgroup ≤ + e.toMulEquiv.mapSubgroup T.toSubgroup ↔ + S.toSubgroup ≤ T.toSubgroup + exact e.toMulEquiv.mapSubgroup.le_iff_le + +open scoped Classical in +/-- The order-dual form of closed-subgroup transport. -/ +noncomputable def orderDualIsoMapContinuousMulEquiv + (e : G ≃ₜ* H) : + (ClosedSubgroup G)ᵒᵈ ≃o (ClosedSubgroup H)ᵒᵈ where + toFun S := OrderDual.toDual + (mapContinuousMulEquiv e (OrderDual.ofDual S)) + invFun T := OrderDual.toDual + (mapContinuousMulEquiv e.symm (OrderDual.ofDual T)) + left_inv S := by + exact congrArg OrderDual.toDual + ((orderIsoMapContinuousMulEquiv e).left_inv (OrderDual.ofDual S)) + right_inv T := by + exact congrArg OrderDual.toDual + ((orderIsoMapContinuousMulEquiv e).right_inv (OrderDual.ofDual T)) + map_rel_iff' {S T} := by + change + mapContinuousMulEquiv e (OrderDual.ofDual T) ≤ + mapContinuousMulEquiv e (OrderDual.ofDual S) ↔ + OrderDual.ofDual T ≤ OrderDual.ofDual S + exact (orderIsoMapContinuousMulEquiv e).le_iff_le + +open scoped Classical in +@[simp] +theorem coe_mapContinuousMulEquiv + (e : G ≃ₜ* H) (S : ClosedSubgroup G) : + (mapContinuousMulEquiv e S : Set H) = e '' (S : Set G) := by + change + (↑(Subgroup.map e.toMonoidHom S.toSubgroup) : Set H) = + e.toMonoidHom '' (S : Set G) + exact Subgroup.coe_map e.toMonoidHom S.toSubgroup + +end ClosedSubgroup + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open Reciprocity + +variable (K : Type) [Field K] [NumberField K] + +open scoped Classical in +/-- The infinite abelian class-field correspondence. The order dual in the +domain records that larger closed idele-class subgroups correspond to smaller +intermediate fields. -/ +noncomputable def infiniteAbelianClassFieldCorrespondence : + (ClosedSubgroup (ideleClassComponentQuotient K))ᵒᵈ ≃o + IntermediateField K (maximalAbelianExtension K) := + (ClosedSubgroup.orderDualIsoMapContinuousMulEquiv + (ideleClassComponentQuotientEquivMaximalAbelianGalois K)).trans + (InfiniteGalois.IntermediateFieldEquivClosedSubgroup + (k := K) (K := maximalAbelianExtension K)).symm + +open scoped Classical in +/-- Forward evaluation is the fixed field of the transported closed +idele-class subgroup. -/ +@[simp] +theorem infiniteAbelianClassFieldCorrespondence_apply + (H : ClosedSubgroup (ideleClassComponentQuotient K)) : + infiniteAbelianClassFieldCorrespondence K (OrderDual.toDual H) = + IntermediateField.fixedField + (ClosedSubgroup.mapContinuousMulEquiv + (ideleClassComponentQuotientEquivMaximalAbelianGalois K) H) := + rfl + +open scoped Classical in +/-- The inverse correspondence is the fixing subgroup transported back to +the idele-class component quotient. -/ +@[simp] +theorem infiniteAbelianClassFieldCorrespondence_symm_apply + (L : IntermediateField K (maximalAbelianExtension K)) : + (infiniteAbelianClassFieldCorrespondence K).symm L = + OrderDual.toDual + (ClosedSubgroup.mapContinuousMulEquiv + (ideleClassComponentQuotientEquivMaximalAbelianGalois K).symm + { toSubgroup := L.fixingSubgroup + isClosed' := InfiniteGalois.fixingSubgroup_isClosed L }) := + rfl + +open scoped Classical in +/-- The fixing subgroup of the field corresponding to `H` is exactly the +transport of `H` by maximal abelian reciprocity. -/ +theorem infiniteAbelianClassFieldCorrespondence_fixingSubgroup + (H : ClosedSubgroup (ideleClassComponentQuotient K)) : + (infiniteAbelianClassFieldCorrespondence K + (OrderDual.toDual H)).fixingSubgroup = + (ClosedSubgroup.mapContinuousMulEquiv + (ideleClassComponentQuotientEquivMaximalAbelianGalois K) H).toSubgroup := by + rw [infiniteAbelianClassFieldCorrespondence_apply] + exact InfiniteGalois.fixingSubgroup_fixedField _ + +open scoped Classical in +/-- A field in the infinite abelian correspondence is finite over the base +exactly when the corresponding closed idele-class subgroup is open. -/ +theorem infiniteAbelianClassFieldCorrespondence_finite_iff_open + (H : ClosedSubgroup (ideleClassComponentQuotient K)) : + FiniteDimensional K + (infiniteAbelianClassFieldCorrespondence K + (OrderDual.toDual H)) ↔ + IsOpen (H : Set (ideleClassComponentQuotient K)) := by + let L := + infiniteAbelianClassFieldCorrespondence K (OrderDual.toDual H) + let e := ideleClassComponentQuotientEquivMaximalAbelianGalois K + let T := ClosedSubgroup.mapContinuousMulEquiv e H + have hfix : L.fixingSubgroup = T.toSubgroup := by + simpa only [L, T, e] using + infiniteAbelianClassFieldCorrespondence_fixingSubgroup K H + calc + FiniteDimensional K L ↔ + IsOpen (L.fixingSubgroup : Set + Gal(maximalAbelianExtension K/K)) := + (InfiniteGalois.isOpen_iff_finite L).symm + _ ↔ IsOpen (T : Set Gal(maximalAbelianExtension K/K)) := by + rw [hfix] + change + IsOpen (T : Set Gal(maximalAbelianExtension K/K)) ↔ + IsOpen (T : Set Gal(maximalAbelianExtension K/K)) + exact Iff.rfl + _ ↔ IsOpen (H : Set (ideleClassComponentQuotient K)) := by + change + IsOpen (e '' (H : Set (ideleClassComponentQuotient K))) ↔ + IsOpen (H : Set (ideleClassComponentQuotient K)) + exact e.toHomeomorph.isOpen_image + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/KummerNormDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/KummerNormDescent.lean new file mode 100644 index 0000000000..11c8df0971 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/KummerNormDescent.lean @@ -0,0 +1,190 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.PrimePowerKummerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.Continuity +/-! +# Descent of power-local-unit idèle subgroups + +For a finite extension `L / K`, the norm of a local `n`-th power is again +an `n`-th power. At a finite place outside a prescribed support, the norm +of an integral unit is an integral unit. Combining these statements over +all places above a place of `K` shows that the ordinary idèle norm carries +the power-local-unit subgroup for the full inverse-image support on `L` +into the corresponding subgroup on `K`. + +Passing to principal-idèle quotients gives the idèle-class norm descent +needed when a Kummer extension is first constructed after a finite base +extension and then viewed over the original number field. +-/ + +@[expose] public section + +open scoped BigOperators NumberField NumberField.LiesOver +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open AlgebraicNumberTheory.Valuations +open GlobalClassFieldTheory.ClassFieldAxiom + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] + [Algebra K L] [FiniteDimensional K L] + +/-- If `S'` is exactly the set of finite places of `L` above `S`, the +ordinary idèle norm carries the power-local-unit subgroup over `L` into +the corresponding subgroup over `K`. -/ +theorem ideleNorm_mem_powerLocalUnitSubgroup_of_supports_above + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (S' : Finset (HeightOneSpectrum (𝓞 L))) + (hS : ∀ W : HeightOneSpectrum (𝓞 L), + W ∈ S' ↔ _root_.finitePlaceBelow (K := K) W ∈ S) + {a : IdeleGroup L} + (ha : + a ∈ idelePowerLocalUnitSubgroup (K := L) n S' ∅) : + IdeleGroup.norm K L a ∈ + idelePowerLocalUnitSubgroup (K := K) n S ∅ := by + classical + rw [mem_idelePowerLocalUnitSubgroup_iff] at ha ⊢ + obtain ⟨haInfinite, haSupported, haAway⟩ := ha + refine ⟨?_, ?_, ?_⟩ + · intro w + let : ∀ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = w}, + W.1.1.LiesOver w.1 := + fun W => + ⟨congrArg (fun q : InfinitePlace K => q.1) W.2⟩ + rw [IdeleGroup.infiniteComponent_norm_eq_prod] + apply Subgroup.prod_mem + intro W _ + obtain ⟨x, hx⟩ := + (MonoidHom.mem_range + (G := W.1.Completionˣ)).mp + (haInfinite W.1) + apply + (MonoidHom.mem_range + (G := w.Completionˣ)).mpr + refine + ⟨LocalFieldTheory.normUnits + w.Completion W.1.Completion x, ?_⟩ + rw [powMonoidHom_apply] at hx ⊢ + rw [← hx, map_pow] + · intro v₀ hv₀ + let vK := HeightOneSpectrum.adicAbv K v₀ + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v₀ + let eAbove := + finitePlaceExtensionEquivAbove + (K := K) (L := L) v₀ + let := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + let : Fintype {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀} := + Fintype.ofEquiv (AbsoluteValueExtension vK L) eAbove + let : ∀ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀}, + Algebra (v₀.adicCompletion K) (W.1.adicCompletion L) := + fun W => + (finitePlaceAdicCompletionMap K L v₀ W).toAlgebra + rw [IdeleGroup.finiteComponent_norm_eq_prod] + apply Subgroup.prod_mem + intro W _ + have hWS : W.1 ∈ S' := + (hS W.1).2 (by simpa only [W.2] using hv₀) + obtain ⟨x, hx⟩ := + (MonoidHom.mem_range + (G := (W.1.adicCompletion L)ˣ)).mp + (haSupported W.1 hWS) + apply + (MonoidHom.mem_range + (G := (v₀.adicCompletion K)ˣ)).mpr + refine + ⟨LocalFieldTheory.normUnits + (v₀.adicCompletion K) (W.1.adicCompletion L) x, ?_⟩ + rw [powMonoidHom_apply] at hx ⊢ + rw [← hx, map_pow] + · intro v₀ hv₀ + simp only [Finset.union_empty] at hv₀ + let vK := HeightOneSpectrum.adicAbv K v₀ + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v₀ + let eAbove := + finitePlaceExtensionEquivAbove + (K := K) (L := L) v₀ + let := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + let : Fintype {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀} := + Fintype.ofEquiv (AbsoluteValueExtension vK L) eAbove + let : ∀ W : {W : HeightOneSpectrum (𝓞 L) // + _root_.finitePlaceBelow (K := K) W = v₀}, + Algebra (v₀.adicCompletion K) (W.1.adicCompletion L) := + fun W => + (finitePlaceAdicCompletionMap K L v₀ W).toAlgebra + rw [IdeleGroup.finiteComponent_norm_eq_prod] + apply Subgroup.prod_mem + intro W _ + have hWaway : W.1 ∉ S' := by + intro hWS + have hbelow := (hS W.1).1 hWS + exact hv₀ (by simpa only [W.2] using hbelow) + have hWunit : + IdeleGroup.finiteComponent W.1 a ∈ + (W.1.adicCompletionIntegers L).units := + haAway W.1 (by + simpa only [Finset.union_empty] using hWaway) + let z : (W.1.adicCompletionIntegers L).units := + ⟨IdeleGroup.finiteComponent W.1 a, hWunit⟩ + simpa only [z, Subgroup.coe_subtype] using + IdeleGroup.finitePlace_normUnits_mem_integerUnits + (K := K) (L := L) v₀ W z + +/-- Under exact compatibility of the finite supports, the ordinary +idèle-class norm maps the power-local-unit idèle-class subgroup over `L` +into the corresponding subgroup over `K`. -/ +theorem ideleClassNorm_map_powerLocalUnitSubgroup_le_of_supports_above + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (S' : Finset (HeightOneSpectrum (𝓞 L))) + (hS : ∀ W : HeightOneSpectrum (𝓞 L), + W ∈ S' ↔ _root_.finitePlaceBelow (K := K) W ∈ S) : + (ideleClassPowerLocalUnitSubgroup (K := L) n S' ∅).map + (_root_.ideleClassNorm K L) ≤ + ideleClassPowerLocalUnitSubgroup (K := K) n S ∅ := by + rintro _ ⟨c, hc, rfl⟩ + obtain ⟨a, ha, rfl⟩ := + (mem_ideleClassPowerLocalUnitSubgroup_iff + (K := L) n S' ∅ c).mp hc + rw [_root_.ideleClassNorm_mk] + exact + (mem_ideleClassPowerLocalUnitSubgroup_iff + (K := K) n S ∅ _).2 + ⟨IdeleGroup.norm K L a, + ideleNorm_mem_powerLocalUnitSubgroup_of_supports_above + (K := K) (L := L) n S S' hS ha, + rfl⟩ + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibFrobeniusHilbertComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibFrobeniusHilbertComparison.lean new file mode 100644 index 0000000000..1c81dbe364 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibFrobeniusHilbertComparison.lean @@ -0,0 +1,842 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticHilbertClassFieldReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.IntegerRingComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.GaloisAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldOverOriginalBase +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximalSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldPrimeSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldUnramifiedMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMaximalSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldOverOriginalBase +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealDecompositionLaw +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertPrincipalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.NormalClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Herbrand +public import Mathlib.NumberTheory.RamificationInertia.Unramified +public import Mathlib.FieldTheory.Finite.Basic +public import Mathlib.RingTheory.Frobenius +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.MathlibUnramifiedInterface +/-! +# Frobenius and Hilbert class fields implementation + +This module supplies the implementation proofs for the compact public +statements in `ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields`. + +The prime element exposed below is the arithmetic-normalized prime Artin +element. Its residue action identifies it with Mathlib's arithmetic +Frobenius at every unramified finite prime. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory.GlobalClassFieldComparison + +open NumberField IsDedekindDomain +open LocalFieldTheory +open scoped ValuativeRel + +section PrimeArtin + +open scoped Pointwise +open AlgebraicNumberTheory.Valuations + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + +/-- Convert Mathlib's ideal-theoretic unramifiedness of a base prime into the +chosen-completion formulation used by the current Artin implementation. -/ +private theorem chosenFinitePlaceIsUnramified_of_isUnramifiedIn + (v : HeightOneSpectrum (𝓞 K)) + (hunram : Algebra.IsUnramifiedIn (𝓞 L) v.asIdeal) : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v := by + let w := _root_.chosenFinitePlaceExtension (L := L) v + let W := + _root_.finitePlaceExtensionCentre + (K := K) (L := L) v w + have hW : W.asIdeal.LiesOver v.asIdeal := + _root_.finitePlaceExtensionCentre_liesOver + (K := K) (L := L) v w + apply + _root_.chosenFinitePlaceIsUnramified_of_isUnramifiedAt + (K := K) (L := L) v + exact hunram W.asIdeal inferInstance hW + +/-- The arithmetic-normalized prime Artin element is the inverse of the +geometric-normalized prime Artin element. This fixes the relation between the +two reciprocity conventions. -/ +theorem arithmeticPrimeArtin_eq_inverse + (v : HeightOneSpectrum (𝓞 K)) : + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v = + (GlobalClassFieldTheory.GlobalClassFields.finitePlacePrimeArtin + (K := K) (L := L) v)⁻¹ := + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin_eq_inv + (K := K) (L := L) v + +/-- The arithmetic prime Artin element preserves the chosen prime above the +base prime. This is the decomposition-group part of its Frobenius property; +the residue-field congruence is a separate comparison. -/ +theorem arithmeticPrimeArtin_stabilizes_chosenPrime + (v : HeightOneSpectrum (𝓞 K)) : + let w := chosenFinitePlaceExtension (L := L) v + let W := finitePlaceExtensionCentre (K := K) (L := L) v w + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v ∈ + MulAction.stabilizer (L ≃ₐ[K] L) W.asIdeal := by + let w := chosenFinitePlaceExtension (L := L) v + let W := finitePlaceExtensionCentre (K := K) (L := L) v w + let σ := GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v + have hgeo : + GlobalClassFieldTheory.GlobalClassFields.finitePlacePrimeArtin + (K := K) (L := L) v ∈ + finitePlaceDecompositionGroup (K := K) (L := L) v := by + rw [GlobalClassFieldTheory.GlobalClassFields.finitePlacePrimeArtin_eq_chosenFinitePlaceArtin] + rw [← GlobalClassFieldTheory.Reciprocity.chosenFinitePlaceArtinMonoidHom_range] + exact ⟨FiniteIdeleGroup.chosenLocalOrderSection v 1, rfl⟩ + have hσ : σ ∈ finitePlaceDecompositionGroup (K := K) (L := L) v := by + change GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v ∈ + finitePlaceDecompositionGroup (K := K) (L := L) v + rw [GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin_eq_inv] + exact Subgroup.inv_mem _ hgeo + have hσinv : σ⁻¹ ∈ finitePlaceDecompositionGroup (K := K) (L := L) v := + Subgroup.inv_mem _ hσ + have hw : + absoluteValueExtensionConjugate + (HeightOneSpectrum.adicAbv K v) w σ⁻¹ = w := + (mem_finitePlaceDecompositionGroup_iff v σ⁻¹).mp hσinv + have hW : finitePlaceEquiv K L σ W = W := by + have hcentre := finitePlaceExtensionCentre_conjugate + (K := K) (L := L) v w σ⁻¹ + rw [hw] at hcentre + simpa only [inv_inv] using hcentre.symm + have hIdeal := congrArg HeightOneSpectrum.asIdeal hW + have hIdeal' : + W.asIdeal.map + (NumberField.RingOfIntegers.mapAlgEquiv σ).toRingEquiv = W.asIdeal := by + simpa only [finitePlaceEquiv_asIdeal] using hIdeal + change σ ∈ MulAction.stabilizer (L ≃ₐ[K] L) W.asIdeal + rw [MulAction.mem_stabilizer_iff, Ideal.pointwise_smul_def] + exact hIdeal' + +/-- In an abelian extension, the arithmetic prime Artin element preserves +every prime above the base prime, not only the chosen one. -/ +theorem arithmeticPrimeArtin_stabilizes_prime + (v : HeightOneSpectrum (𝓞 K)) + (w : HeightOneSpectrum (𝓞 L)) + (hw : w.asIdeal.LiesOver v.asIdeal) : + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v ∈ + MulAction.stabilizer (L ≃ₐ[K] L) w.asIdeal := by + let W := finitePlaceExtensionCentre (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v) + have hWover : W.asIdeal.LiesOver v.asIdeal := + finitePlaceExtensionCentre_liesOver (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v) + obtain ⟨τ, hτ⟩ := + Algebra.IsInvariant.exists_smul_of_under_eq + (𝓞 K) (𝓞 L) (L ≃ₐ[K] L) + W.asIdeal w.asIdeal (hWover.over.symm.trans hw.over) + have hW := arithmeticPrimeArtin_stabilizes_chosenPrime + (K := K) (L := L) v + rw [MulAction.mem_stabilizer_iff] at hW ⊢ + rw [hτ] + calc + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v • (τ • W.asIdeal) = + τ • (GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v • W.asIdeal) := by + simp only [← mul_smul] + exact congrArg (fun γ : L ≃ₐ[K] L => γ • W.asIdeal) + (IsMulCommutative.is_comm.comm + (GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v) τ) + _ = τ • W.asIdeal := by rw [hW] + +open GlobalClassFieldTheory.GlobalClassFields renaming + orderOf_arithmeticFinitePlacePrimeArtin_eq_finitePlaceLocalDegree_of_chosenUnramified → + orderOf_primeArtin_eq_localDegree_of_unramified in +open GlobalClassFieldTheory.IdealClassFieldTheory renaming + finitePlaceLocalDegree_eq_inertiaDegree_of_chosenUnramified → + finitePlaceLocalDegree_eq_inertiaDegree_of_chosenUnramified in +/-- At an ideal-theoretically unramified finite prime, the order of the +arithmetic-normalized prime Artin element is the common inertia degree of the +prime ideals above the base prime. -/ +theorem orderOf_arithmeticPrimeArtin_eq_inertiaDegree + (v : HeightOneSpectrum (𝓞 K)) + (hunram : Algebra.IsUnramifiedIn (𝓞 L) v.asIdeal) : + orderOf + (GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v) = + Ideal.inertiaDegIn v.asIdeal (𝓞 L) := by + calc + orderOf + (GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v) = + _root_.finitePlaceLocalDegree (K := K) (L := L) v := + orderOf_primeArtin_eq_localDegree_of_unramified + (K := K) (L := L) v + (chosenFinitePlaceIsUnramified_of_isUnramifiedIn + (K := K) (L := L) v hunram) + _ = Ideal.inertiaDegIn v.asIdeal (𝓞 L) := + finitePlaceLocalDegree_eq_inertiaDegree_of_chosenUnramified + (K := K) (L := L) v + (chosenFinitePlaceIsUnramified_of_isUnramifiedIn + (K := K) (L := L) v hunram) + +open GlobalClassFieldTheory.GlobalClassFields renaming + arithmeticFinitePlacePrimeArtin_eq_one_iff_splitsCompletely_of_chosenUnramified → + primeArtin_eq_one_iff_splitsCompletely_of_unramified in +/-- At an ideal-theoretically unramified finite prime, the arithmetic-normalized prime +Artin element is trivial exactly when the finite place actually splits +completely. -/ +theorem arithmeticPrimeArtin_eq_one_iff_splitsCompletely + (v : HeightOneSpectrum (𝓞 K)) + (hunram : Algebra.IsUnramifiedIn (𝓞 L) v.asIdeal) : + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v = + 1 ↔ + _root_.FinitePlaceSplitsCompletely + (K := K) (L := L) v := + primeArtin_eq_one_iff_splitsCompletely_of_unramified + (K := K) (L := L) v + (chosenFinitePlaceIsUnramified_of_isUnramifiedIn + (K := K) (L := L) v hunram) + +end PrimeArtin + +section ArithmeticFrobenius + +open scoped Pointwise + +/-- Mathlib's arithmetic Frobenius has order equal to the residue degree +at an unramified prime. The proof compares its residue action with the +finite-field Frobenius and uses the decomposition-group cardinality. -/ +theorem orderOf_arithmeticFrobeniusAt_eq_inertiaDegree + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + (v : HeightOneSpectrum (𝓞 K)) + (w : HeightOneSpectrum (𝓞 L)) + (hw : w.asIdeal.LiesOver v.asIdeal) + (hunram : Algebra.IsUnramifiedAt (𝓞 K) w.asIdeal) : + orderOf (arithmeticFrobeniusAt (K := K) w) = + w.asIdeal.inertiaDeg (𝓞 K) := by + classical + let P : Ideal (𝓞 K) := v.asIdeal + let Q : Ideal (𝓞 L) := w.asIdeal + let G := L ≃ₐ[K] L + let g : G := arithmeticFrobeniusAt (K := K) w + let : Q.LiesOver P := hw + let : Algebra.IsUnramifiedAt (𝓞 K) Q := hunram + let : Field ((𝓞 K) ⧸ P) := Ideal.Quotient.field P + let : Field ((𝓞 L) ⧸ Q) := Ideal.Quotient.field Q + let : Finite ((𝓞 K) ⧸ P) := Ring.HasFiniteQuotients.finiteQuotient v.ne_bot + let : Finite ((𝓞 L) ⧸ Q) := Ring.HasFiniteQuotients.finiteQuotient w.ne_bot + let : Fintype ((𝓞 K) ⧸ P) := Fintype.ofFinite _ + have hF : IsArithFrobAt (𝓞 K) g Q := by + change IsArithFrobAt (𝓞 K) (arithFrobAt (𝓞 K) G Q) Q + exact IsArithFrobAt.arithFrobAt (𝓞 K) G Q + let gs : MulAction.stabilizer G Q := ⟨g, hF.mem_stabilizer⟩ + have hImage : + Ideal.Quotient.stabilizerHom Q P G gs = + FiniteField.frobeniusAlgEquivOfAlgebraic ((𝓞 K) ⧸ P) ((𝓞 L) ⧸ Q) := by + apply AlgEquiv.ext + intro x + obtain ⟨y, rfl⟩ := Ideal.Quotient.mk_surjective x + rw [Ideal.Quotient.stabilizerHom_apply] + simp only [FiniteField.coe_frobeniusAlgEquivOfAlgebraic] + have h := hF.mk_apply y + have hQP : Q.under (𝓞 K) = P := hw.over.symm + rw [hQP, Nat.card_eq_fintype_card] at h + exact h + have hImageOrder : + orderOf (Ideal.Quotient.stabilizerHom Q P G gs) = + Q.inertiaDeg (𝓞 K) := by + rw [hImage, FiniteField.orderOf_frobeniusAlgEquivOfAlgebraic] + exact (Ideal.inertiaDeg_eq_of_isMaximal P Q).symm + have hCard : Nat.card (MulAction.stabilizer G Q) = + Q.inertiaDeg (𝓞 K) := by + rw [Ideal.card_stabilizer_eq (G := G) P Q, + Ideal.ramificationIdxIn_eq_ramificationIdx P Q G, + Ideal.inertiaDegIn_eq_inertiaDeg P Q G, + Ideal.ramificationIdx_eq_one Q (𝓞 K), one_mul] + have hUpper : orderOf gs ∣ Q.inertiaDeg (𝓞 K) := by + rw [← hCard] + exact orderOf_dvd_natCard gs + have hLower : Q.inertiaDeg (𝓞 K) ∣ orderOf gs := by + rw [← hImageOrder] + exact orderOf_map_dvd (Ideal.Quotient.stabilizerHom Q P G) gs + change orderOf g = Q.inertiaDeg (𝓞 K) + exact (Subgroup.orderOf_coe gs).trans (Nat.dvd_antisymm hUpper hLower) + +end ArithmeticFrobenius + +/-- In an abelian extension, Mathlib's chosen arithmetic Frobenius is +independent of the prime above a fixed base prime. Mathlib chooses +conjugate lifts, and conjugacy is equality in the abelian Galois group. -/ +theorem arithmeticFrobeniusAt_eq_of_liesOver + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + (v : HeightOneSpectrum (𝓞 K)) + (w w' : HeightOneSpectrum (𝓞 L)) + (hw : w.asIdeal.LiesOver v.asIdeal) + (hw' : w'.asIdeal.LiesOver v.asIdeal) : + arithmeticFrobeniusAt (K := K) w = + arithmeticFrobeniusAt (K := K) w' := by + obtain ⟨τ, hτ⟩ := isConj_iff.mp + (isConj_arithFrobAt (𝓞 K) (L ≃ₐ[K] L) + w.asIdeal w'.asIdeal (hw.over.symm.trans hw'.over)) + calc + arithmeticFrobeniusAt (K := K) w = + τ * arithmeticFrobeniusAt (K := K) w * τ⁻¹ := by + rw [IsMulCommutative.is_comm.comm τ + (arithmeticFrobeniusAt (K := K) w), mul_assoc, + mul_inv_cancel, mul_one] + _ = arithmeticFrobeniusAt (K := K) w' := hτ + +open GlobalClassFieldTheory.GlobalClassFields renaming + arithmeticFinitePlacePrimeArtin_eq_chosenFinitePlaceArithmeticFrobenius → + arithmeticFinitePlacePrimeArtin_eq_chosenFinitePlaceArithmeticFrobenius in +/-- At an unramified finite prime, the arithmetic-normalized prime Artin +element is Mathlib's arithmetic Frobenius, independently of the chosen prime +above the base prime. -/ +theorem arithmeticPrimeArtin_eq_arithmeticFrobeniusAt + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + (v : HeightOneSpectrum (𝓞 K)) + (w : HeightOneSpectrum (𝓞 L)) + (hw : w.asIdeal.LiesOver v.asIdeal) + (hunram : Algebra.IsUnramifiedAt (𝓞 K) w.asIdeal) : + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v = + arithmeticFrobeniusAt (K := K) w := by + classical + let w₀ := chosenFinitePlaceExtension (L := L) v + let W := finitePlaceExtensionCentre (K := K) (L := L) v w₀ + let P : Ideal (𝓞 K) := v.asIdeal + let Q : Ideal (𝓞 L) := W.asIdeal + let G := L ≃ₐ[K] L + let C := ChosenFinitePlaceBaseCompletion (K := K) v + let E := ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v + let : Algebra C E := + GlobalClassFieldTheory.Reciprocity.finitePlaceLocalArtinLocalizedAlgebra v w₀ + have hW : Q.LiesOver P := + finitePlaceExtensionCentre_liesOver (K := K) (L := L) v w₀ + let : Q.LiesOver P := hW + let : w.asIdeal.LiesOver P := hw + let : Finite G := IsGaloisGroup.finite G K L + let : IsGaloisGroup G (𝓞 K) (𝓞 L) := + IsGaloisGroup.of_isFractionRing G (𝓞 K) (𝓞 L) K L + have hEw : w.asIdeal.ramificationIdx (𝓞 K) = 1 := + (Ideal.ramificationIdx_eq_one_iff).mpr hunram + have hEQ : Q.ramificationIdx (𝓞 K) = + w.asIdeal.ramificationIdx (𝓞 K) := + Ideal.ramificationIdx_eq_of_isGaloisGroup P Q w.asIdeal G + have hunramQ : Algebra.IsUnramifiedAt (𝓞 K) Q := + (Ideal.ramificationIdx_eq_one_iff).mp (hEQ.trans hEw) + have hChosen : ChosenFinitePlaceIsUnramified + (K := K) (L := L) v := + chosenFinitePlaceIsUnramified_of_isUnramifiedAt + (K := K) (L := L) v hunramQ + let : IsNonarchimedeanLocalField.IsUnramifiedValuedExtension C E := hChosen + let vK := HeightOneSpectrum.adicAbv K v + let eD : HilbertRamification.absoluteValueDecompositionGroup K w₀.1 ≃* + (E ≃ₐ[C] E) := + HilbertRamification.decompositionGroupEquivAlgebraicLocalizationAut + vK (RayClass.adicAbv_isNontrivial v) w₀ + let f : E ≃ₐ[C] E := arithmeticFrobeniusOfUnramifiedValuation C E + let δ : HilbertRamification.absoluteValueDecompositionGroup K w₀.1 := + eD.symm f + have heDδ : eD δ = f := eD.apply_symm_apply f + have hδ : (δ : G) = + GlobalClassFieldTheory.GlobalClassFields.chosenFinitePlaceArithmeticFrobenius + (K := K) (L := L) v hChosen := by + change (eD.symm f : G) = + GlobalClassFieldTheory.Reciprocity.finitePlaceLocalToGlobalMonoidHom + (K := K) (L := L) v w₀ f + rfl + let e : (𝓞 L ⧸ Q) ≃+* 𝓀[E] := + chosenFinitePlaceLocalizedResidueEquiv (K := K) (L := L) v + have hCard : Nat.card 𝓀[C] = + Nat.card (𝓞 K ⧸ Q.under (𝓞 K)) := by + rw [finitePlaceCompletion_residueField_card (K := K) v, + hW.over.symm] + have hResidue (x : 𝓞 L) : + Ideal.Quotient.mk Q + (NumberField.RingOfIntegers.mapAlgEquiv (δ : G) x) = + (Ideal.Quotient.mk Q x) ^ + Nat.card (𝓞 K ⧸ Q.under (𝓞 K)) := by + apply e.injective + calc + e (Ideal.Quotient.mk Q + (NumberField.RingOfIntegers.mapAlgEquiv (δ : G) x)) = + LocalFieldTheory.galoisGroupResidueAlgEquivOfIsIntegralClosure C E + (eD δ) (e (Ideal.Quotient.mk Q x)) := + chosenFinitePlaceLocalizedResidueEquiv_equivariant + (K := K) (L := L) v δ x + _ = LocalFieldTheory.galoisGroupResidueAlgEquivOfIsIntegralClosure C E + f (e (Ideal.Quotient.mk Q x)) := by + simp only [heDδ] + _ = (e (Ideal.Quotient.mk Q x)) ^ Nat.card 𝓀[C] := + galoisGroupResidueAlgEquivOfIsIntegralClosure_arithmeticFrobenius_apply + C E (e (Ideal.Quotient.mk Q x)) + _ = e ((Ideal.Quotient.mk Q x) ^ + Nat.card (𝓞 K ⧸ Q.under (𝓞 K))) := by + exact (congrArg + (fun n : ℕ => (e (Ideal.Quotient.mk Q x)) ^ n) hCard).trans + (map_pow e (Ideal.Quotient.mk Q x) _).symm + have hArith : IsArithFrobAt (𝓞 K) (δ : G) Q := by + intro x + change NumberField.RingOfIntegers.mapAlgEquiv (δ : G) x - + x ^ Nat.card (𝓞 K ⧸ Q.under (𝓞 K)) ∈ Q + rw [← Ideal.Quotient.eq, map_pow] + exact hResidue x + have hMath : IsArithFrobAt (𝓞 K) + (arithmeticFrobeniusAt (K := K) W) Q := by + change IsArithFrobAt (𝓞 K) (arithFrobAt (𝓞 K) G Q) Q + exact IsArithFrobAt.arithFrobAt (𝓞 K) G Q + have hInertiaCard : Nat.card (Q.inertia G) = 1 := by + calc + Nat.card (Q.inertia G) = P.ramificationIdxIn (𝓞 L) := + Ideal.card_inertia_eq_ramificationIdxIn (G := G) P Q + _ = Q.ramificationIdx (𝓞 K) := + Ideal.ramificationIdxIn_eq_ramificationIdx P Q G + _ = 1 := hEQ.trans hEw + have hInertiaBot : Q.inertia G = ⊥ := + (Subgroup.eq_bot_iff_card (Q.inertia G)).mpr hInertiaCard + have hDiff : (δ : G) * (arithmeticFrobeniusAt (K := K) W)⁻¹ ∈ + Q.inertia G := hArith.mul_inv_mem_inertia hMath + have hDiffEq : (δ : G) * (arithmeticFrobeniusAt (K := K) W)⁻¹ = 1 := by + simpa only [hInertiaBot, Subgroup.mem_bot] using hDiff + have hδEq : (δ : G) = arithmeticFrobeniusAt (K := K) W := + mul_inv_eq_one.mp hDiffEq + calc + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v = + GlobalClassFieldTheory.GlobalClassFields.chosenFinitePlaceArithmeticFrobenius + (K := K) (L := L) v hChosen := + arithmeticFinitePlacePrimeArtin_eq_chosenFinitePlaceArithmeticFrobenius + (K := K) (L := L) v hChosen + _ = (δ : G) := hδ.symm + _ = arithmeticFrobeniusAt (K := K) W := hδEq + _ = arithmeticFrobeniusAt (K := K) w := + arithmeticFrobeniusAt_eq_of_liesOver + (K := K) (L := L) v W w hW hw + +/-- Ideal-theoretic complete splitting at every prime above a finite place +agrees with the decomposition-group definition used by the existing library. -/ +theorem finitePrimeSplitsCompletely_iff_original + (K L : Type) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (v : HeightOneSpectrum (𝓞 K)) : + FinitePrimeSplitsCompletely K L v ↔ + _root_.FinitePlaceSplitsCompletely (K := K) (L := L) v := by + let : Finite (L ≃ₐ[K] L) := IsGaloisGroup.finite (L ≃ₐ[K] L) K L + let : IsGaloisGroup (L ≃ₐ[K] L) (𝓞 K) (𝓞 L) := + IsGaloisGroup.of_isFractionRing (L ≃ₐ[K] L) (𝓞 K) (𝓞 L) K L + let := _root_.finitePlaceMulAction K L + have hlocal (W : HeightOneSpectrum (𝓞 L)) + (hW : W.asIdeal.LiesOver v.asIdeal) : + Nat.card (MulAction.stabilizer (L ≃ₐ[K] L) W) = + W.asIdeal.ramificationIdx (𝓞 K) * + W.asIdeal.inertiaDeg (𝓞 K) := by + let : W.asIdeal.LiesOver v.asIdeal := hW + calc + _ = _root_.finiteLogPlaceLocalDegree K L W := + _root_.finitePlace_stabilizer_card_eq_localDegree K L W + _ = v.asIdeal.ramificationIdxIn (𝓞 L) * + v.asIdeal.inertiaDegIn (𝓞 L) := by + unfold _root_.finiteLogPlaceLocalDegree + rw [hW.over.symm] + _ = _ := by + rw [Ideal.ramificationIdxIn_eq_ramificationIdx v.asIdeal W.asIdeal (L ≃ₐ[K] L), + Ideal.inertiaDegIn_eq_inertiaDeg v.asIdeal W.asIdeal (L ≃ₐ[K] L)] + constructor + · intro h + let w := _root_.chosenFinitePlaceExtension (L := L) v + let W := _root_.finitePlaceExtensionCentre (K := K) (L := L) v w + have hW : W.asIdeal.LiesOver v.asIdeal := + _root_.finitePlaceExtensionCentre_liesOver (K := K) (L := L) v w + have hb := h W hW + have hCard : Nat.card (MulAction.stabilizer (L ≃ₐ[K] L) W) = 1 := by + rw [hlocal W hW, hb.1, hb.2] + have hBot : MulAction.stabilizer (L ≃ₐ[K] L) W = ⊥ := + (Subgroup.eq_bot_iff_card _).mpr hCard + have hBelow : _root_.finitePlaceBelow (K := K) W = v := + _root_.finitePlaceBelow_finitePlaceExtensionCentre (K := K) (L := L) v w + exact (_root_.finitePlaceSplitsCompletely_iff_stabilizer_eq_bot + (K := K) (L := L) v W hBelow).mpr hBot + · intro h W hW + have hBelow : _root_.finitePlaceBelow (K := K) W = v := by + apply HeightOneSpectrum.ext + exact hW.over.symm + have hBot := (_root_.finitePlaceSplitsCompletely_iff_stabilizer_eq_bot + (K := K) (L := L) v W hBelow).mp h + have hCard : Nat.card (MulAction.stabilizer (L ≃ₐ[K] L) W) = 1 := + (Subgroup.eq_bot_iff_card _).mp hBot + rw [hlocal W hW] at hCard + have he : W.asIdeal.ramificationIdx (𝓞 K) ∣ 1 := + ⟨W.asIdeal.inertiaDeg (𝓞 K), hCard.symm⟩ + have hf : W.asIdeal.inertiaDeg (𝓞 K) ∣ 1 := + ⟨W.asIdeal.ramificationIdx (𝓞 K), by + simpa only [mul_comm] using hCard.symm⟩ + exact ⟨Nat.dvd_one.mp he, Nat.dvd_one.mp hf⟩ + +section HilbertClassFields + +variable (K : Type) [Field K] [NumberField K] + +/-- Embed the selected big Hilbert class field in the separable closure of +its original base field. -/ +private noncomputable def bigHilbertClassFieldEmbedding : + GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassField K →ₐ[K] + SeparableClosure K := + IsSepClosed.lift + +/-- The selected big Hilbert class field, represented in the public type of +finite abelian subextensions of the separable closure. -/ +private noncomputable def bigHilbertClassFieldFiniteAbelianExtension : + FiniteAbelianExtension K := by + let j := bigHilbertClassFieldEmbedding K + exact ⟨j.fieldRange, + j.equivFieldRange.toLinearEquiv.finiteDimensional, + IsAbelianGalois.of_algHom j.equivFieldRange.symm.toAlgHom⟩ + +/-- The original selected field and its public separable-closure +realization are equivalent over the base. -/ +private noncomputable def bigHilbertClassFieldEquiv : + GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassField K ≃ₐ[K] + bigHilbertClassFieldFiniteAbelianExtension K := + (bigHilbertClassFieldEmbedding K).equivFieldRange + +/-- The selected small Hilbert class field in the separable closure. -/ +private noncomputable def smallHilbertClassFieldEmbedding : + GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField K →ₐ[K] + SeparableClosure K := + IsSepClosed.lift + +private noncomputable def smallHilbertClassFieldFiniteAbelianExtension : + FiniteAbelianExtension K := by + let j := smallHilbertClassFieldEmbedding K + exact ⟨j.fieldRange, + j.equivFieldRange.toLinearEquiv.finiteDimensional, + IsAbelianGalois.of_algHom j.equivFieldRange.symm.toAlgHom⟩ + +private noncomputable def smallHilbertClassFieldEquiv : + GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField K ≃ₐ[K] + smallHilbertClassFieldFiniteAbelianExtension K := + (smallHilbertClassFieldEmbedding K).equivFieldRange + +open GlobalClassFieldTheory.GlobalClassFields renaming + bigHilbertClassField_finrank_over_original_eq_narrowClassGroup_card → + bigHilbertClassField_finrank_over_original_eq_narrowClassGroup_card in +/-- The selected big Hilbert class field has degree equal to the order of the +narrow class group of the original number field. -/ +theorem bigHilbertClassField_degree_eq_narrowClassGroup_card : + Module.finrank K + (GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassField K) = + Nat.card (RayClass.NarrowClassGroup K) := + bigHilbertClassField_finrank_over_original_eq_narrowClassGroup_card + K + +open GlobalClassFieldTheory.GlobalClassFields renaming + smallHilbertClassField_finrank_over_original_eq_classNumber → + smallHilbertClassField_finrank_over_original_eq_classNumber in +/-- The selected small Hilbert class field has degree equal to the ordinary +class number of the original number field. -/ +theorem smallHilbertClassField_degree_eq_classNumber : + Module.finrank K + (GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField K) = + NumberField.classNumber K := + smallHilbertClassField_finrank_over_original_eq_classNumber + K + +/-- The selected big Hilbert class field is unramified at every finite +place. -/ +theorem bigHilbertClassField_unramifiedAtFinitePlaces : + _root_.IsUnramifiedAtFinitePlaces K + (GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassField K) := + GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassField_isUnramifiedAtFinitePlaces + K + +open GlobalClassFieldTheory.GlobalClassFields renaming + finiteUnramifiedAbelianExtension_nonempty_algHom_bigHilbertClassField → + finiteUnramifiedAbelianExtension_nonempty_algHom_bigHilbertClassField in +/-- Every publicly represented finite-prime-unramified abelian extension +embeds into the selected big Hilbert class field. -/ +private theorem nonempty_algHom_to_selectedBigHilbertClassField + (F : FiniteAbelianExtension K) + (hF : IsUnramifiedAtFinitePlaces K F) : + Nonempty (F →ₐ[K] + GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassField K) := by + obtain ⟨f⟩ := + finiteUnramifiedAbelianExtension_nonempty_algHom_bigHilbertClassField + K F ((isUnramifiedAtFinitePlaces_iff_original K F).mp hF) + exact ⟨f⟩ + +/-- The intrinsic big Hilbert class field exists inside the chosen +separable closure of the base. -/ +theorem exists_bigHilbertClassField : + ∃ E : FiniteAbelianExtension K, IsBigHilbertClassField E := by + let E := bigHilbertClassFieldFiniteAbelianExtension K + let e : GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassField K ≃ₐ[K] E := + bigHilbertClassFieldEquiv K + refine ⟨E, ?_, ?_⟩ + · exact + (isUnramifiedAtFinitePlaces_iff_of_algEquiv K + (GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassField K) E e).mp + ((isUnramifiedAtFinitePlaces_iff_original K + (GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassField K)).mpr + (bigHilbertClassField_unramifiedAtFinitePlaces K)) + · intro F hF + obtain ⟨f⟩ := nonempty_algHom_to_selectedBigHilbertClassField K F hF + exact ⟨e.toAlgHom.comp f⟩ + +/-- Every intrinsic big Hilbert class field has the degree of the selected +implementation, hence the narrow class number. -/ +theorem bigHilbertClassField_degree_eq_narrowClassGroup_card_of_isBig + (E : FiniteAbelianExtension K) + (hE : IsBigHilbertClassField E) : + Module.finrank K E = Nat.card (RayClass.NarrowClassGroup K) := by + let H := GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassField K + let F := bigHilbertClassFieldFiniteAbelianExtension K + let e : H ≃ₐ[K] F := bigHilbertClassFieldEquiv K + have hF : IsUnramifiedAtFinitePlaces K F := + (isUnramifiedAtFinitePlaces_iff_of_algEquiv K H F e).mp + ((isUnramifiedAtFinitePlaces_iff_original K H).mpr + (bigHilbertClassField_unramifiedAtFinitePlaces K)) + obtain ⟨f⟩ := nonempty_algHom_to_selectedBigHilbertClassField K E hE.1 + obtain ⟨g⟩ := hE.2 F hF + have hEH : Module.finrank K E ≤ Module.finrank K H := + f.toLinearMap.finrank_le_finrank_of_injective f.injective + have hHF : Module.finrank K H = Module.finrank K F := + LinearEquiv.finrank_eq e.toLinearEquiv + have hFE : Module.finrank K F ≤ Module.finrank K E := + g.toLinearMap.finrank_le_finrank_of_injective g.injective + have hHE : Module.finrank K H ≤ Module.finrank K E := by + rw [hHF] + exact hFE + exact (Nat.le_antisymm hEH hHE).trans + (bigHilbertClassField_degree_eq_narrowClassGroup_card K) + +/-- The selected small Hilbert class field is unramified at all finite and +infinite places. -/ +theorem smallHilbertClassField_everywhereUnramified : + _root_.IsEverywhereUnramified K + (GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField K) := + GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField_isEverywhereUnramified + K + +open GlobalClassFieldTheory.GlobalClassFields renaming + finiteAbelianExtension_nonempty_algHom_to_smallHilbertClassField_of_everywhereUnramified → + nonempty_algHom_smallHilbertClassField_of_unramified in +/-- Any publicly represented everywhere-unramified abelian extension +embeds into the selected small Hilbert class field. -/ +private theorem nonempty_algHom_to_selectedSmallHilbertClassField + (F : FiniteAbelianExtension K) + (hF : IsEverywhereUnramified K F) : + Nonempty (F →ₐ[K] + GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField K) := by + have hFinite : _root_.IsUnramifiedAtFinitePlaces K F := + (isUnramifiedAtFinitePlaces_iff_original K F).mp hF.1 + have hRamifiedEmpty : + _root_.ramifiedBaseFinitePlaces (K := K) (L := F) = ∅ := by + apply Finset.eq_empty_iff_forall_notMem.mpr + intro v hv + obtain ⟨P, _hP, hP⟩ := + (_root_.mem_ramifiedBaseFinitePlaces_iff + (K := K) (L := F) v).1 hv + exact hP (hFinite P) + exact + @nonempty_algHom_smallHilbertClassField_of_unramified + K F inferInstance inferInstance inferInstance inferInstance + inferInstance inferInstance inferInstance hF.2 hRamifiedEmpty + +/-- The intrinsic small Hilbert class field exists inside the chosen +separable closure of the base. -/ +theorem exists_smallHilbertClassField : + ∃ E : FiniteAbelianExtension K, IsSmallHilbertClassField E := by + let E := smallHilbertClassFieldFiniteAbelianExtension K + let e : GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField K ≃ₐ[K] E := + smallHilbertClassFieldEquiv K + refine ⟨E, ?_, ?_⟩ + · exact + (isEverywhereUnramified_iff_of_algEquiv K + (GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField K) E e).mp + ((isEverywhereUnramified_iff_original K + (GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField K)).mpr + (smallHilbertClassField_everywhereUnramified K)) + · intro F hF + obtain ⟨f⟩ := nonempty_algHom_to_selectedSmallHilbertClassField K F hF + exact ⟨e.toAlgHom.comp f⟩ + +/-- Every intrinsic small Hilbert class field has the degree of the +selected implementation, hence the class number. -/ +theorem smallHilbertClassField_degree_eq_classNumber_of_isSmall + (E : FiniteAbelianExtension K) + (hE : IsSmallHilbertClassField E) : + Module.finrank K E = NumberField.classNumber K := by + let H := GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField K + let F := smallHilbertClassFieldFiniteAbelianExtension K + let e : H ≃ₐ[K] F := smallHilbertClassFieldEquiv K + have hF : IsEverywhereUnramified K F := + (isEverywhereUnramified_iff_of_algEquiv K H F e).mp + ((isEverywhereUnramified_iff_original K H).mpr + (smallHilbertClassField_everywhereUnramified K)) + obtain ⟨f⟩ := nonempty_algHom_to_selectedSmallHilbertClassField K E hE.1 + obtain ⟨g⟩ := hE.2 F hF + have hEH : Module.finrank K E ≤ Module.finrank K H := + f.toLinearMap.finrank_le_finrank_of_injective f.injective + have hHF : Module.finrank K H = Module.finrank K F := + LinearEquiv.finrank_eq e.toLinearEquiv + have hFE : Module.finrank K F ≤ Module.finrank K E := + g.toLinearMap.finrank_le_finrank_of_injective g.injective + have hHE : Module.finrank K H ≤ Module.finrank K E := by + rw [hHF] + exact hFE + exact (Nat.le_antisymm hEH hHE).trans + (smallHilbertClassField_degree_eq_classNumber K) + +/-- Every intrinsic small Hilbert class field is isomorphic over the base to +the selected implementation. -/ +noncomputable def smallHilbertClassFieldEquivOfIsSmall + (E : FiniteAbelianExtension K) + (hE : IsSmallHilbertClassField E) : + E ≃ₐ[K] + GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField K := by + let H := GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField K + let f : E →ₐ[K] H := Classical.choice (by + exact nonempty_algHom_to_selectedSmallHilbertClassField K E hE.1) + have hdim : Module.finrank K E = Module.finrank K H := + (smallHilbertClassField_degree_eq_classNumber_of_isSmall K E hE).trans + (smallHilbertClassField_degree_eq_classNumber K).symm + have hsurj : Function.Surjective f := + (LinearMap.injective_iff_surjective_of_finrank_eq_finrank + (f := f.toLinearMap) hdim).mp f.injective + exact AlgEquiv.ofBijective f ⟨f.injective, hsurj⟩ + +open GlobalClassFieldTheory.IdealClassFieldTheory renaming + finitePlaceSplitsCompletelyInSmallHilbertClassField_iff_principal → + finitePlaceSplitsCompletelyInSmallHilbertClassField_iff_principal in +/-- A finite prime actually splits completely in the selected small Hilbert +class field exactly when its prime fractional ideal is principal. -/ +theorem finitePrime_splitsCompletelyInSmallHilbertClassField_iff_principal + (v : HeightOneSpectrum (𝓞 K)) : + _root_.FinitePlaceSplitsCompletely + (K := K) + (L := GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField K) + v ↔ + FractionalIdealGroup.prime v ∈ + (toPrincipalIdeal (𝓞 K) K).range := + finitePlaceSplitsCompletelyInSmallHilbertClassField_iff_principal + (K := K) v + +/-- The complete-splitting criterion transfers from the selected small +Hilbert class field to every intrinsic one. -/ +theorem finitePrime_splitsCompletelyInSmallHilbertClassField_iff_principal_of_isSmall + (E : FiniteAbelianExtension K) + (hE : IsSmallHilbertClassField E) + (v : HeightOneSpectrum (𝓞 K)) : + FinitePrimeSplitsCompletely K E v ↔ + finitePrimeFractionalIdeal v ∈ + (toPrincipalIdeal (𝓞 K) K).range := by + let H := GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField K + let e : E ≃ₐ[K] H := smallHilbertClassFieldEquivOfIsSmall K E hE + have hTransport : + _root_.FinitePlaceSplitsCompletely (K := K) (L := E) v ↔ + _root_.FinitePlaceSplitsCompletely (K := K) (L := H) v := + (_root_.finitePlaceSplitsCompletely_iff_inExtension + (K := K) (E := E) v).trans + ((_root_.finitePlaceSplitsCompletelyInExtension_algEquiv e v).trans + (_root_.finitePlaceSplitsCompletely_iff_inExtension + (K := K) (E := H) v).symm) + exact (finitePrimeSplitsCompletely_iff_original K E v).trans + (hTransport.trans + (finitePrime_splitsCompletelyInSmallHilbertClassField_iff_principal K v)) + +/-- Every integral ideal becomes principal after extension to the selected +small Hilbert class field. -/ +theorem ideals_becomePrincipalInSmallHilbertClassField : + ∀ I : Ideal (𝓞 K), + (I.map + (algebraMap + (𝓞 K) + (𝓞 (GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField K)))).IsPrincipal := + GlobalClassFieldTheory.IdealClassFieldTheory.allIdealsBecomePrincipalInSmallHilbertClassField + (K := K) + +/-- Principalization transfers from the selected small Hilbert class field +to every intrinsic one. -/ +theorem ideals_becomePrincipalInSmallHilbertClassField_of_isSmall + (E : FiniteAbelianExtension K) + (hE : IsSmallHilbertClassField E) : + ∀ I : Ideal (𝓞 K), + (I.map (algebraMap (𝓞 K) (𝓞 E))).IsPrincipal := by + intro I + let H := GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField K + let e : E ≃ₐ[K] H := smallHilbertClassFieldEquivOfIsSmall K E hE + let e𝓞 : 𝓞 E ≃ₐ[𝓞 K] 𝓞 H := ringOfIntegersEquivOfAlgEquiv K E H e + have hSelected : + (I.map (algebraMap (𝓞 K) (𝓞 H))).IsPrincipal := + ideals_becomePrincipalInSmallHilbertClassField K I + have hBack : + ((I.map (algebraMap (𝓞 K) (𝓞 H))).map + e𝓞.symm.toRingHom).IsPrincipal := by + obtain ⟨x, hx⟩ := hSelected.principal + refine ⟨e𝓞.symm x, ?_⟩ + change + (I.map (algebraMap (𝓞 K) (𝓞 H))).map e𝓞.symm.toRingHom = + Ideal.span {e𝓞.symm x} + rw [hx, Ideal.map_span, Set.image_singleton] + rfl + have hMap : + (I.map (algebraMap (𝓞 K) (𝓞 H))).map e𝓞.symm.toRingHom = + I.map (algebraMap (𝓞 K) (𝓞 E)) := by + rw [Ideal.map_map] + congr 1 + apply RingHom.ext + intro x + exact e𝓞.symm.commutes x + rw [← hMap] + exact hBack + +end HilbertClassFields + +end ClassFieldTheory.GlobalClassFieldComparison diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibGlobalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibGlobalReciprocity.lean new file mode 100644 index 0000000000..056c36b394 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibGlobalReciprocity.lean @@ -0,0 +1,313 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticClassFieldCorrespondence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.InfiniteAbelianClassFieldCorrespondence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidueAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison + +/-! # Mathlib Global Reciprocity -/ + +@[expose] public section +open scoped NumberField +open NumberField IsDedekindDomain + +/-! +# Global class field theory implementation + +This is the implementation layer for the reader-facing global CFT module. +It collects the existing finite reciprocity, maximal abelian reciprocity, +class-field existence, and infinite correspondence modules without adding +parallel names or existence wrappers. +-/ + +noncomputable +section + +namespace ClassFieldTheory.GlobalClassFieldComparison + +private instance ideleClassGroupIsMulCommutative + (K : Type) [Field K] [NumberField K] : + IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +/-- The ramified finite primes form a finite set. Adding every real place +produces a public modulus outside which a number-field extension is +unramified, independently of any Artin-map construction. -/ +theorem exists_unramifiedOutsideModulus + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] : + ∃ m : RayClassModulus K, IsUnramifiedOutsideModulus K L m := by + classical + let T : Set (IsDedekindDomain.HeightOneSpectrum (𝓞 K)) := + {v | ∃ w : IsDedekindDomain.HeightOneSpectrum (𝓞 L), + w.asIdeal.LiesOver v.asIdeal ∧ + ¬ Algebra.IsUnramifiedAt (𝓞 K) w.asIdeal} + have hT : T.Finite := + AlgebraicNumberTheory.Ramification.finite_ramified_base_heightOne_primes + (𝓞 K) (𝓞 L) + let S := hT.toFinset + let f : IsDedekindDomain.HeightOneSpectrum (𝓞 K) → ℕ := + fun v => if v ∈ S then 1 else 0 + have hf : ∀ v, f v ≠ 0 → v ∈ S := by + intro v hv + by_contra hnot + exact hv (by simp [f, hnot]) + let m : RayClassModulus K := + { finitePart := Finsupp.onFinset S f hf + infinitePart := Finset.univ } + refine ⟨m, ?_⟩ + constructor + · intro v hv Q hQ hlie + by_contra hram + have hQne : Q ≠ ⊥ := by + intro hbot + have hunder := hlie.over + rw [hbot, Ideal.under_bot] at hunder + exact v.ne_bot hunder + let w : IsDedekindDomain.HeightOneSpectrum (𝓞 L) := + ⟨Q, hQ, hQne⟩ + have hvT : v ∈ T := ⟨w, hlie, hram⟩ + have hvS : v ∈ S := hT.mem_toFinset.mpr hvT + apply hv + apply Finsupp.mem_support_iff.mpr + change (Finsupp.onFinset S f hf) v ≠ 0 + rw [Finsupp.onFinset_apply] + simpa only [f, hvS, ite_true] using (one_ne_zero : (1 : ℕ) ≠ 0) + · intro v hv hnot + exact (hnot (Finset.mem_univ _)).elim + +/-- The public narrow modulus whose finite part is the actual norm conductor. -/ +noncomputable def normConductorRayClassModulus + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] : RayClassModulus K := by + classical + exact + { finitePart := + GlobalClassFieldTheory.GlobalClassFields.ideleClassNormNarrowFiniteConductor + (K := K) (L := L) + infinitePart := Finset.univ } + +/-- The public norm-conductor modulus is the original narrow modulus. -/ +theorem normConductorRayClassModulus_original + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] : + rayClassModulusToOriginal K (normConductorRayClassModulus K L) = + RayClass.Modulus.narrowOfFinite + (GlobalClassFieldTheory.GlobalClassFields.ideleClassNormNarrowFiniteConductor + (K := K) (L := L)) := by + classical + apply RayClass.Modulus.ext + · rfl + · rfl + +open GlobalClassFieldTheory.GlobalClassFields renaming + ideleClassNorm_narrowFiniteConductor_support_eq_ramifiedBaseFinitePlaces → + ideleClassNorm_conductor_support_eq_ramifiedPlaces in +/-- The actual narrow finite norm conductor, together with every real place, +is a public modulus outside which a finite abelian extension is unramified. -/ +theorem normConductorRayClassModulus_unramifiedOutside + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] : + IsUnramifiedOutsideModulus K L (normConductorRayClassModulus K L) := by + classical + have hs := + ideleClassNorm_conductor_support_eq_ramifiedPlaces + (K := K) (L := L) + constructor + · intro v hv Q hQ hlie + by_contra hram + have hQne : Q ≠ ⊥ := by + intro hbot + have hunder := hlie.over + rw [hbot, Ideal.under_bot] at hunder + exact v.ne_bot hunder + let w : IsDedekindDomain.HeightOneSpectrum (𝓞 L) := + ⟨Q, hQ, hQne⟩ + have hvram : v ∈ _root_.ramifiedBaseFinitePlaces (K := K) (L := L) := by + rw [_root_.mem_ramifiedBaseFinitePlaces_iff] + exact ⟨w, hlie, hram⟩ + apply hv + change v ∈ + (GlobalClassFieldTheory.GlobalClassFields.ideleClassNormNarrowFiniteConductor + (K := K) (L := L)).support + rw [hs] + exact hvram + · intro v hv hnot + change (⟨v, hv⟩ : RayClassRealPlace K) ∉ Finset.univ at hnot + exact (hnot (Finset.mem_univ _)).elim + +/-- The norm conductor yields a public modulus outside which the extension +is unramified. -/ +theorem unramifiedOutside_normConductorModulus + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] : + ∃ m : RayClassModulus K, + m.finitePart = + GlobalClassFieldTheory.GlobalClassFields.ideleClassNormNarrowFiniteConductor + (K := K) (L := L) ∧ + IsUnramifiedOutsideModulus K L m := by + refine ⟨normConductorRayClassModulus K L, ?_, + normConductorRayClassModulus_unramifiedOutside K L⟩ + rfl + +/-- The public norm-conductor modulus is a defining modulus for the actual +idèle-class norm subgroup. -/ +private theorem normConductorRayClassModulus_isDefining + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] : + RayClass.Modulus.congruenceSubgroup + (rayClassModulusToOriginal K (normConductorRayClassModulus K L)) ≤ + (_root_.ideleClassNorm K L).range := by + rw [normConductorRayClassModulus_original K L] + exact + GlobalClassFieldTheory.GlobalClassFields.ideleClassNorm_narrowFiniteConductor_isDefiningModulus + (K := K) (L := L) + +/-- Arithmetic global reciprocity, descended to the public ray class group +at the actual narrow norm conductor. -/ +noncomputable def normConductorArtin + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] : + RayClassGroup (normConductorRayClassModulus K L) →* (L ≃ₐ[K] L) := by + let m := normConductorRayClassModulus K L + let m' := rayClassModulusToOriginal K m + have hm : RayClass.Modulus.congruenceSubgroup m' ≤ + (_root_.ideleClassNorm K L).range := by + exact normConductorRayClassModulus_isDefining K L + exact (GlobalClassFieldTheory.Reciprocity.arithmeticGlobalNormResidueContinuousMulEquiv + K L).toMulEquiv.toMonoidHom.comp + ((GlobalClassFieldTheory.IdealClassFieldTheory.idealRayClassArtinMap + m' ((_root_.ideleClassNorm K L).range) hm).comp + (rayClassGroupEquivOriginal K m).toMonoidHom) + +/-- The conductor ray-class Artin map is onto the finite abelian Galois group. -/ +theorem normConductorArtin_surjective + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] : + Function.Surjective (normConductorArtin K L) := by + unfold normConductorArtin + exact (GlobalClassFieldTheory.Reciprocity.arithmeticGlobalNormResidueContinuousMulEquiv + K L).surjective.comp + ((GlobalClassFieldTheory.IdealClassFieldTheory.idealRayClassArtinMap_surjective + (rayClassModulusToOriginal K (normConductorRayClassModulus K L)) + ((_root_.ideleClassNorm K L).range) + (normConductorRayClassModulus_isDefining K L)).comp + (rayClassGroupEquivOriginal K (normConductorRayClassModulus K L)).surjective) + +open GlobalClassFieldTheory.IdealClassFieldTheory renaming + arithmeticIdealArtinGaloisMap_primeIdeal_eq_arithmeticFinitePlacePrimeArtin → + arithmeticIdealArtinGaloisMap_primeIdeal_eq_arithmeticFinitePlacePrimeArtin in +/-- At a prime away from the norm conductor, the public Artin map agrees +with the arithmetic prime Artin element of the original idèle theory. -/ +theorem normConductorArtin_prime + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ (normConductorRayClassModulus K L).finitePart.support) : + normConductorArtin K L + (rayClassOfFinitePrime (normConductorRayClassModulus K L) v hv) = + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v := by + let m := normConductorRayClassModulus K L + let m' := rayClassModulusToOriginal K m + have hm : RayClass.Modulus.congruenceSubgroup m' ≤ + (_root_.ideleClassNorm K L).range := by + exact normConductorRayClassModulus_isDefining K L + have hv' : v ∉ m'.finitePart.support := hv + change + (GlobalClassFieldTheory.Reciprocity.arithmeticGlobalNormResidueContinuousMulEquiv K L) + (GlobalClassFieldTheory.IdealClassFieldTheory.idealRayClassArtinMap + m' ((_root_.ideleClassNorm K L).range) hm + (rayClassGroupEquivOriginal K m (rayClassOfFinitePrime m v hv))) = _ + rw [rayClassGroupEquivOriginal_prime K m v hv] + change GlobalClassFieldTheory.IdealClassFieldTheory.arithmeticIdealArtinGaloisMap + (K := K) (L := L) m' hm + (RayClass.primeToModulusIdeal m' v hv') = _ + exact + arithmeticIdealArtinGaloisMap_primeIdeal_eq_arithmeticFinitePlacePrimeArtin + (K := K) (L := L) m' hm v hv' + +/-- The class field selected from a closed finite-index idèle-class subgroup +has exactly that subgroup as its norm group. -/ +theorem classFieldExistence_normSubgroup + (K : Type) [Field K] [NumberField K] + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + (_root_.ideleClassNorm K + (GlobalClassFieldTheory.GlobalClassFields.closedFiniteIndexClassField + (K := K) H hclosed)).range = H := + GlobalClassFieldTheory.GlobalClassFields.closedFiniteIndexClassField_ideleClassNorm_range + H hclosed + +/-- The degree of the selected class field is the index of its defining +idèle-class subgroup. -/ +theorem classFieldExistence_degree + (K : Type) [Field K] [NumberField K] + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] : + Module.finrank K + (GlobalClassFieldTheory.GlobalClassFields.closedFiniteIndexClassField + (K := K) H hclosed) = H.index := + GlobalClassFieldTheory.GlobalClassFields.closedFiniteIndexClassField_finrank_eq_index + H hclosed + +/-- The implemented arithmetic norm-residue isomorphism proves finite +abelian global reciprocity in quotient form. -/ +theorem finiteAbelianGlobalReciprocity + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] : + Nonempty + ((IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃ₜ* + (L ≃ₐ[K] L)) := by + exact + ⟨GlobalClassFieldTheory.Reciprocity.arithmeticGlobalNormResidueContinuousMulEquiv K L⟩ + +/-- Maximal abelian reciprocity after quotienting by the identity +component. -/ +theorem maximalAbelianGlobalReciprocity + (K : Type) [Field K] [NumberField K] : + Nonempty + (ideleClassComponentQuotient K ≃ₜ* + (maximalAbelianExtension K ≃ₐ[K] maximalAbelianExtension K)) := by + exact + ⟨GlobalClassFieldTheory.Reciprocity.ideleClassComponentQuotientEquivMaximalAbelianGalois K⟩ + +end ClassFieldTheory.GlobalClassFieldComparison diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormConductor.lean new file mode 100644 index 0000000000..8ad13c14c1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormConductor.lean @@ -0,0 +1,781 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorRayClassMaximality +/-! +# Narrow finite conductors of actual idele-class norm subgroups + +For a finite Galois extension of number fields, the image of the +idele-class norm contains an explicitly constructed ray congruence +subgroup. At a ramified finite place we choose a sufficiently deep +higher-unit group inside the open local norm subgroup. Outside the +finite ramification set, the full local unit group already consists of +norms. The archimedean positive subgroup is always contained in the +corresponding tensor-norm image. + +This produces a defining modulus directly from the actual extension. In +particular, the idele-class norm range is open, closed, and of finite +index. Its narrow finite conductor can only be supported at ramified +finite places. The full conductor, including an archimedean component, +is deliberately not defined here. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain Topology + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +open scoped Classical in +/-- Fix the canonical commutative idèle-class structure used by the norm +quotients in this module. -/ +local instance normConductorIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] normConductorIdeleClassGroupIsMulCommutative + +omit [NumberField L] in +open scoped Classical in +/-- Every chosen finite-place norm subgroup contains a local +higher-unit group. This is the local source used to construct an +actual defining modulus. -/ +theorem exists_localHigherUnitGroup_le_chosenFinitePlaceLocalNormSubgroup + (v : HeightOneSpectrum (𝓞 K)) : + ∃ n : ℕ, + RayClass.localHigherUnitGroup v n ≤ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := by + have hnormOne : + (1 : (v.adicCompletion K)ˣ) ∈ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := + (_root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v).one_mem + have hnormNhds : + (_root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v : + Set (v.adicCompletion K)ˣ) ∈ + 𝓝 (1 : (v.adicCompletion K)ˣ) := + (_root_.chosenFinitePlaceLocalNormSubgroup_isOpen + (K := K) (L := L) v).mem_nhds hnormOne + obtain ⟨n, hn⟩ := + RayClass.exists_localHigherUnitGroup_subset v hnormNhds + exact ⟨n, fun _ hx => hn hx⟩ + +open scoped Classical in +/-- The least higher-unit exponent whose group lies in the chosen +finite-place norm subgroup. -/ +noncomputable def ideleClassNormLocalHigherUnitExponent + (v : HeightOneSpectrum (𝓞 K)) : ℕ := + Nat.find + (exists_localHigherUnitGroup_le_chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v) + +omit [NumberField L] in +open scoped Classical in +/-- The local higher-unit group at the selected exponent lies in the +chosen local norm subgroup. -/ +theorem ideleClassNormLocalHigherUnitExponent_spec + (v : HeightOneSpectrum (𝓞 K)) : + RayClass.localHigherUnitGroup v + (ideleClassNormLocalHigherUnitExponent + (K := K) (L := L) v) ≤ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := + Nat.find_spec + (exists_localHigherUnitGroup_le_chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v) + +omit [NumberField L] in +open scoped Classical in +/-- The selected local higher-unit exponent is minimal among all +exponents whose higher-unit group lies in the chosen local norm +subgroup. -/ +theorem ideleClassNormLocalHigherUnitExponent_min + (v : HeightOneSpectrum (𝓞 K)) + {n : ℕ} + (hn : + RayClass.localHigherUnitGroup v n ≤ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v) : + ideleClassNormLocalHigherUnitExponent + (K := K) (L := L) v ≤ n := + Nat.find_min' + (exists_localHigherUnitGroup_le_chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v) + hn + +omit [NumberField L] in +open scoped Classical in +/-- The selected local exponent is zero exactly when every integral unit +of the finite-place completion is a norm from the chosen localized +extension. -/ +theorem ideleClassNormLocalHigherUnitExponent_eq_zero_iff + (v : HeightOneSpectrum (𝓞 K)) : + ideleClassNormLocalHigherUnitExponent + (K := K) (L := L) v = 0 ↔ + (v.adicCompletionIntegers K).units ≤ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := by + constructor + · intro hzero + simpa only [hzero, RayClass.localHigherUnitGroup_zero] using + ideleClassNormLocalHigherUnitExponent_spec + (K := K) (L := L) v + · intro hunits + apply Nat.eq_zero_of_le_zero + apply + ideleClassNormLocalHigherUnitExponent_min + (K := K) (L := L) v + simpa only [RayClass.localHigherUnitGroup_zero] using hunits + +omit [NumberField L] in +open scoped Classical in +/-- At an unramified chosen completion, the selected local exponent is +zero because the whole local integral-unit group consists of norms. -/ +theorem ideleClassNormLocalHigherUnitExponent_eq_zero_of_chosenUnramified + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + ideleClassNormLocalHigherUnitExponent + (K := K) (L := L) v = 0 := by + apply Nat.eq_zero_of_le_zero + apply Nat.find_min' + (exists_localHigherUnitGroup_le_chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v) + rw [RayClass.localHigherUnitGroup_zero] + exact + _root_.adicCompletionIntegerUnits_le_chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v hunram + +open scoped Classical in +/-- Outside the finite set of ramified base places, the selected local +higher-unit exponent is zero. -/ +theorem ideleClassNormLocalHigherUnitExponent_eq_zero_of_not_mem_ramified + (v : HeightOneSpectrum (𝓞 K)) + (hv : + v ∉ _root_.ramifiedBaseFinitePlaces + (K := K) (L := L)) : + ideleClassNormLocalHigherUnitExponent + (K := K) (L := L) v = 0 := by + apply + ideleClassNormLocalHigherUnitExponent_eq_zero_of_chosenUnramified + (K := K) (L := L) v + apply + _root_.chosenFinitePlaceIsUnramified_of_isUnramifiedAt + (K := K) (L := L) v + by_contra hram + apply hv + rw [_root_.mem_ramifiedBaseFinitePlaces_iff] + exact + ⟨_root_.finitePlaceExtensionCentre + (K := K) (L := L) v + (_root_.chosenFinitePlaceExtension (L := L) v), + _root_.finitePlaceExtensionCentre_liesOver + (K := K) (L := L) v + (_root_.chosenFinitePlaceExtension (L := L) v), + hram⟩ + +open scoped Classical in +/-- A finite modulus built from the actual local norm subgroups. Its +support is contained in the finite set of ramified base places. -/ +noncomputable def ideleClassNormDefiningModulus : + RayClass.FiniteModulus K := + Finsupp.onFinset + (_root_.ramifiedBaseFinitePlaces (K := K) (L := L)) + (ideleClassNormLocalHigherUnitExponent (K := K) (L := L)) + (by + intro v hv + by_contra hvRamified + exact + hv + (ideleClassNormLocalHigherUnitExponent_eq_zero_of_not_mem_ramified + (K := K) (L := L) v hvRamified)) + +open scoped Classical in +/-- Evaluation of the actual norm defining modulus is the selected local +higher-unit exponent. -/ +@[simp] +theorem ideleClassNormDefiningModulus_apply + (v : HeightOneSpectrum (𝓞 K)) : + ideleClassNormDefiningModulus (K := K) (L := L) v = + ideleClassNormLocalHigherUnitExponent + (K := K) (L := L) v := + Finsupp.onFinset_apply + +open scoped Classical in +/-- The local higher-unit group prescribed by the actual norm defining +modulus lies in the chosen local norm subgroup at every finite place. -/ +theorem ideleClassNormDefiningModulus_local_spec + (v : HeightOneSpectrum (𝓞 K)) : + RayClass.localHigherUnitGroup v + (ideleClassNormDefiningModulus (K := K) (L := L) v) ≤ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := by + rw [ideleClassNormDefiningModulus_apply] + exact + ideleClassNormLocalHigherUnitExponent_spec + (K := K) (L := L) v + +open scoped Classical in +/-- The norm defining modulus is pointwise minimal among all moduli whose +prescribed local higher-unit groups consist of chosen local norms. -/ +theorem ideleClassNormDefiningModulus_le_of_localHigherUnitGroup_le + (m : RayClass.FiniteModulus K) + (hm : + ∀ v : HeightOneSpectrum (𝓞 K), + RayClass.localHigherUnitGroup v (m v) ≤ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v) : + ideleClassNormDefiningModulus (K := K) (L := L) ≤ m := by + intro v + rw [ideleClassNormDefiningModulus_apply] + exact + ideleClassNormLocalHigherUnitExponent_min + (K := K) (L := L) v (hm v) + +open scoped Classical in +/-- A finite place occurs in the constructed norm modulus exactly when +some integral unit at that place is not a norm from the chosen localized +extension. -/ +theorem mem_ideleClassNormDefiningModulus_support_iff + (v : HeightOneSpectrum (𝓞 K)) : + v ∈ + (ideleClassNormDefiningModulus + (K := K) (L := L)).support ↔ + ¬ (v.adicCompletionIntegers K).units ≤ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := by + rw [Finsupp.mem_support_iff, + ideleClassNormDefiningModulus_apply] + exact + not_congr + (ideleClassNormLocalHigherUnitExponent_eq_zero_iff + (K := K) (L := L) v) + +open scoped Classical in +/-- The constructed defining modulus is supported only at ramified +finite places of the base field. -/ +theorem ideleClassNormDefiningModulus_support_subset_ramifiedBaseFinitePlaces : + (ideleClassNormDefiningModulus + (K := K) (L := L)).support ⊆ + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) := by + intro v hv + by_contra hvRamified + have hne : + ideleClassNormDefiningModulus + (K := K) (L := L) v ≠ 0 := + Finsupp.mem_support_iff.mp hv + rw [ideleClassNormDefiningModulus_apply, + ideleClassNormLocalHigherUnitExponent_eq_zero_of_not_mem_ramified + (K := K) (L := L) v hvRamified] at hne + exact hne rfl + +open scoped Classical in +/-- The raw idele congruence subgroup of the constructed modulus lies +in the image of the actual relative-idele norm. -/ +theorem + ideleCongruenceSubgroup_normDefiningModulus_le_relativeIdeleNorm_range : + (RayClass.Modulus.narrowOfFinite + (ideleClassNormDefiningModulus + (K := K) (L := L))).ideleCongruenceSubgroup ≤ + (RelativeIdeleGroup.norm K L).range := by + intro a ha + rw [RayClass.Modulus.ideleCongruenceSubgroup_narrowOfFinite] at ha + refine + (_root_.mem_relativeIdeleNorm_range_iff_localTensorNorms + (K := K) (L := L) a).2 ⟨?_, ?_⟩ + · intro w + apply + _root_.infinitePositiveSubgroup_le_infiniteTensorNormSubgroup + (K := K) (L := L) w + have hw := + (RayClass.mem_narrowInfiniteCongruenceSubgroup_iff a.1).1 ha.1 w + simpa only [IdeleGroup.infiniteComponent_apply] using hw + · intro v + rw [ + _root_.finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup] + apply + ideleClassNormDefiningModulus_local_spec + (K := K) (L := L) v + have hv := + (RayClass.mem_finiteCongruenceSubgroup_iff + (ideleClassNormDefiningModulus (K := K) (L := L)) a.2).1 + ha.2 v + simpa only [IdeleGroup.finiteComponent_apply] using hv + +open scoped Classical in +/-- The explicitly constructed modulus is a defining modulus for the +actual idele-class norm subgroup. -/ +theorem ideleClassNormDefiningModulus_isDefiningModulus : + IsDefiningModulus + ((_root_.ideleClassNorm K L).range) + (RayClass.Modulus.narrowOfFinite + (ideleClassNormDefiningModulus (K := K) (L := L))) := by + rw [IsDefiningModulus, RayClass.Modulus.congruenceSubgroup, + Subgroup.map_le_iff_le_comap] + apply sup_le + · intro a ha + change + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a ∈ + (_root_.ideleClassNorm K L).range + obtain ⟨z, hz⟩ := + ideleCongruenceSubgroup_normDefiningModulus_le_relativeIdeleNorm_range + (K := K) (L := L) ha + refine + ⟨QuotientGroup.mk' + (IdeleGroup.principalSubgroup L) + (_root_.relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) z), ?_⟩ + change + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (IdeleGroup.norm K L + (_root_.relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) z)) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a + rw [IdeleGroup.norm_relativeIdeleBaseChangeMulEquiv, hz] + · intro a ha + change + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a ∈ + (_root_.ideleClassNorm K L).range + have haOne : + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a = 1 := + (QuotientGroup.eq_one_iff a).2 ha + rw [haOne] + exact ((_root_.ideleClassNorm K L).range).one_mem + +open scoped Classical in +/-- The conductorial subgroup supplied by the actual idèle-class norm +range and its explicitly constructed defining modulus. -/ +noncomputable def ideleClassNormConductorialSubgroup : + ConductorialSubgroup K := + ⟨(_root_.ideleClassNorm K L).range, + ⟨RayClass.Modulus.narrowOfFinite + (ideleClassNormDefiningModulus (K := K) (L := L)), + ideleClassNormDefiningModulus_isDefiningModulus + (K := K) (L := L)⟩⟩ + +open scoped Classical in +/-- The narrow finite conductor of the actual idèle-class norm range. -/ +noncomputable def ideleClassNormNarrowFiniteConductor : + RayClass.FiniteModulus K := + (ideleClassNormConductorialSubgroup + (K := K) (L := L)).narrowFiniteConductor + +open scoped Classical in +/-- The actual idele-class norm subgroup is open in the ordinary +idele-class topology. -/ +theorem ideleClassNorm_range_isOpen : + IsOpen + (((_root_.ideleClassNorm K L).range : + Subgroup (IdeleClassGroup K)) : + Set (IdeleClassGroup K)) := by + exact + (ideleClassNormConductorialSubgroup + (K := K) (L := L)).isOpen + +open scoped Classical in +/-- The actual idele-class norm subgroup is closed. -/ +theorem ideleClassNorm_range_isClosed : + IsClosed + (((_root_.ideleClassNorm K L).range : + Subgroup (IdeleClassGroup K)) : + Set (IdeleClassGroup K)) := + (ideleClassNormConductorialSubgroup + (K := K) (L := L)).isClosed + +open scoped Classical in +/-- The actual idele-class norm subgroup has finite index. -/ +instance ideleClassNorm_rangeFiniteIndex : + ((_root_.ideleClassNorm K L).range).FiniteIndex := + ConductorialSubgroup.finiteIndex + (ideleClassNormConductorialSubgroup (K := K) (L := L)) + +open scoped Classical in +/-- The narrow finite conductor itself is a defining modulus for the actual +idele-class norm subgroup. -/ +theorem ideleClassNorm_narrowFiniteConductor_isDefiningModulus : + IsDefiningModulus + ((_root_.ideleClassNorm K L).range) + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) := + (ideleClassNormConductorialSubgroup + (K := K) (L := L)).narrowFiniteConductor_isDefiningModulus + +open scoped Classical in +/-- The canonical quotient map from the ray class group at the actual +narrow finite norm conductor onto the actual idèle-class norm quotient. -/ +noncomputable def + narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient : + RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) →* + IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range := + QuotientGroup.map + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)))) + ((_root_.ideleClassNorm K L).range) + (MonoidHom.id _) + (fun _ hx => + ideleClassNorm_narrowFiniteConductor_isDefiningModulus + (K := K) (L := L) hx) + +open scoped Classical in +/-- The narrow finite conductor ray-class quotient map sends an idèle class to its +class modulo the actual norm subgroup. -/ +theorem narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_mk + (x : IdeleClassGroup K) : + narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient + (K := K) (L := L) + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)))) x) = + QuotientGroup.mk' + ((_root_.ideleClassNorm K L).range) x := + rfl + +open scoped Classical in +/-- The canonical map from the conductor ray class group to the actual +idele-class norm quotient is surjective. -/ +theorem + narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_surjective : + Function.Surjective + (narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient + (K := K) (L := L)) := by + intro q + obtain ⟨x, rfl⟩ := + QuotientGroup.mk'_surjective + ((_root_.ideleClassNorm K L).range) q + exact + ⟨QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)))) x, + rfl⟩ + +open scoped Classical in +/-- The kernel of the conductor ray-class quotient map is the image of +the actual norm subgroup modulo the conductor congruence subgroup. -/ +theorem + narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_ker : + MonoidHom.ker + (narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient + (K := K) (L := L)) = + Subgroup.map + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L))))) + ((_root_.ideleClassNorm K L).range) := by + unfold narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient + let N := + RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) + let M := (_root_.ideleClassNorm K L).range + change + (QuotientGroup.map N M (MonoidHom.id (IdeleClassGroup K)) _).ker = + Subgroup.map (QuotientGroup.mk' N) M + simpa only [Subgroup.comap_id] using + (QuotientGroup.ker_map (N := N) M + (MonoidHom.id (IdeleClassGroup K)) + (show N ≤ Subgroup.comap (MonoidHom.id (IdeleClassGroup K)) M from + fun _ hx => + ideleClassNorm_narrowFiniteConductor_isDefiningModulus + (K := K) (L := L) hx)) + +open scoped Classical in +/-- Quotienting the conductor ray class group by the image of the actual +norm subgroup recovers the actual idele-class norm quotient. -/ +noncomputable def + narrowFiniteConductorRayClassNormSubgroupQuotientEquivIdeleClassNormQuotient : + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L))) ⧸ + Subgroup.map + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L))))) + ((_root_.ideleClassNorm K L).range)) ≃* + IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range := + (QuotientGroup.quotientMulEquivOfEq + (narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_ker + (K := K) (L := L)).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient + (K := K) (L := L)) + (narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_surjective + (K := K) (L := L))) + +open scoped Classical in +/-- The conductor ray class number factors as the order of the norm +subgroup modulo conductor congruence times the order of the actual +idele-class norm quotient. -/ +theorem + narrowFiniteConductorRayClassGroup_card_eq_normSubgroupImage_card_mul_normQuotient_card : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)))) = + Nat.card + (Subgroup.map + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L))))) + ((_root_.ideleClassNorm K L).range)) * + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + let f := + narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient + (K := K) (L := L) + have hf : Function.Surjective f := + narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_surjective + (K := K) (L := L) + calc + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)))) = + Nat.card (MonoidHom.ker f) * + (MonoidHom.ker f).index := + (Subgroup.card_mul_index (MonoidHom.ker f)).symm + _ = Nat.card (MonoidHom.ker f) * + Nat.card f.range := by + rw [Subgroup.index_ker f] + _ = Nat.card (MonoidHom.ker f) * + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + rw [f.range_eq_top_of_surjective hf, Subgroup.card_top] + _ = Nat.card + (Subgroup.map + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L))))) + ((_root_.ideleClassNorm K L).range)) * + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + rw [ + narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_ker + (K := K) (L := L)] + +open scoped Classical in +/-- The order of the actual idèle-class norm quotient divides the order of +the ray class group at its narrow finite conductor. -/ +theorem + ideleClassNormQuotient_card_dvd_narrowFiniteConductorRayClassGroup_card : + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ∣ + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)))) := by + simpa only [Subgroup.index_eq_card] using + Subgroup.index_dvd_of_le + (ideleClassNorm_narrowFiniteConductor_isDefiningModulus + (K := K) (L := L)) + +open scoped Classical in +/-- The narrow finite conductor of the actual norm subgroup is bounded by +the modulus obtained from the chosen local norm subgroups. -/ +theorem ideleClassNorm_narrowFiniteConductor_le_normDefiningModulus : + ideleClassNormNarrowFiniteConductor (K := K) (L := L) ≤ + ideleClassNormDefiningModulus (K := K) (L := L) := + (ideleClassNormConductorialSubgroup + (K := K) (L := L)).narrowFiniteConductor_le + (ideleClassNormDefiningModulus_isDefiningModulus + (K := K) (L := L)) + +open scoped Classical in +/-- At every finite place, the exponent of the narrow finite conductor of +the actual norm subgroup is bounded by the least higher-unit depth already +contained in the chosen local norm subgroup. -/ +theorem ideleClassNorm_narrowFiniteConductor_apply_le_localHigherUnitExponent + (v : HeightOneSpectrum (𝓞 K)) : + ideleClassNormNarrowFiniteConductor (K := K) (L := L) v ≤ + ideleClassNormLocalHigherUnitExponent + (K := K) (L := L) v := by + have hle := + (ideleClassNormConductorialSubgroup + (K := K) (L := L)).narrowFiniteConductor_le + (ideleClassNormDefiningModulus_isDefiningModulus + (K := K) (L := L)) + simpa only [ideleClassNormNarrowFiniteConductor, + RayClass.Modulus.finitePart_narrowOfFinite, + ideleClassNormDefiningModulus_apply] using hle v + +open scoped Classical in +/-- Every finite prime occurring in the narrow finite conductor of the +actual norm subgroup already occurs in the modulus constructed from the +chosen local norm subgroups. -/ +theorem + ideleClassNorm_narrowFiniteConductor_support_subset_normDefiningModulus_support : + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)).support ⊆ + (ideleClassNormDefiningModulus + (K := K) (L := L)).support := by + intro v hv + have hfinite_ne : + ideleClassNormNarrowFiniteConductor + (K := K) (L := L) v ≠ 0 := + Finsupp.mem_support_iff.mp hv + apply Finsupp.mem_support_iff.mpr + intro hlocal_zero + apply hfinite_ne + exact Nat.eq_zero_of_le_zero + ((ideleClassNorm_narrowFiniteConductor_le_normDefiningModulus + (K := K) (L := L) v).trans_eq hlocal_zero) + +open scoped Classical in +/-- If the zeroth one-place higher-unit class subgroup lies in the +actual idèle-class norm range, then that finite place is absent from +the narrow finite conductor support. -/ +theorem + not_mem_ideleClassNorm_narrowFiniteConductor_support_of_localHigherUnitClassSubgroup_zero_le + (v : HeightOneSpectrum (𝓞 K)) + (hlocal : + RayClass.localHigherUnitClassSubgroup v 0 ≤ + (_root_.ideleClassNorm K L).range) : + v ∉ + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)).support := by + change v ∉ + (ideleClassNormConductorialSubgroup + (K := K) (L := L)).narrowFiniteConductor.support + rw [Finsupp.notMem_support_iff, + (ideleClassNormConductorialSubgroup + (K := K) (L := L)).narrowFiniteConductor_apply_eq_narrowFiniteLocalConductorExponent v] + exact + Nat.eq_zero_of_le_zero + ((ideleClassNormConductorialSubgroup + (K := K) (L := L)).narrowFiniteLocalConductorExponent_le v hlocal) + +open scoped Classical in +/-- If the chosen prime of `L` above `v` is algebraically unramified, +then `v` does not occur in the conductor of the actual idele-class norm +subgroup. -/ +theorem + not_mem_ideleClassNorm_narrowFiniteConductor_support_of_isUnramifiedAt + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + Algebra.IsUnramifiedAt (𝓞 K) + (_root_.finitePlaceExtensionCentre + (K := K) (L := L) v + (_root_.chosenFinitePlaceExtension (L := L) v)).asIdeal) : + v ∉ + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)).support := by + apply + not_mem_ideleClassNorm_narrowFiniteConductor_support_of_localHigherUnitClassSubgroup_zero_le + (K := K) (L := L) v + exact + localHigherUnitClassSubgroup_zero_le_ideleClassNorm_range_of_isUnramifiedAt + (K := K) (L := L) v hunram + +open scoped Classical in +/-- A finite place which splits completely does not occur in the narrow +finite conductor of the actual idèle-class norm subgroup. -/ +theorem + not_mem_ideleClassNorm_narrowFiniteConductor_support_of_splitsCompletely + (v : HeightOneSpectrum (𝓞 K)) + (hsplit : + _root_.FinitePlaceSplitsCompletely + (K := K) (L := L) v) : + v ∉ + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)).support := by + apply + not_mem_ideleClassNorm_narrowFiniteConductor_support_of_localHigherUnitClassSubgroup_zero_le + (K := K) (L := L) v + intro c hc + obtain ⟨x, hx, rfl⟩ := hc + apply + finitePlaceIdeleClass_range_le_ideleClassNorm_range_of_splitsCompletely + (K := K) (L := L) v hsplit + exact ⟨x, rfl⟩ + +open scoped Classical in +/-- The narrow finite conductor of an actual finite Galois idèle-class norm +subgroup is supported only at ramified finite places of the base field. -/ +theorem ideleClassNorm_narrowFiniteConductor_support_subset_ramifiedBaseFinitePlaces : + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)).support ⊆ + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) := by + intro v hv + by_contra hvRamified + have hunram : + Algebra.IsUnramifiedAt (𝓞 K) + (_root_.finitePlaceExtensionCentre + (K := K) (L := L) v + (_root_.chosenFinitePlaceExtension (L := L) v)).asIdeal := by + by_contra hram + apply hvRamified + rw [_root_.mem_ramifiedBaseFinitePlaces_iff] + exact + ⟨_root_.finitePlaceExtensionCentre + (K := K) (L := L) v + (_root_.chosenFinitePlaceExtension (L := L) v), + _root_.finitePlaceExtensionCentre_liesOver + (K := K) (L := L) v + (_root_.chosenFinitePlaceExtension (L := L) v), + hram⟩ + exact + (not_mem_ideleClassNorm_narrowFiniteConductor_support_of_isUnramifiedAt + (K := K) (L := L) v hunram) hv + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormLimitation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormLimitation.lean new file mode 100644 index 0000000000..c0eddaf621 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormLimitation.lean @@ -0,0 +1,165 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MaximalAbelianSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IntermediateNormAbelianization +/-! +# The norm limitation theorem + +For an arbitrary finite extension `L / K`, let `N` be its chosen finite +normal closure, let `E` be the distinguished copy of `L` in `N`, and let +`A` be the largest abelian Galois intermediate field contained in `E`. +This file proves + +`N_{L/K} C_L = N_{A/K} C_A`. + +The proof applies finite reciprocity over `N / K` to `E` and `A`. Their +Artin preimages agree because the fixing subgroup of `A` is obtained from +the fixing subgroup of `E` by adjoining the commutator subgroup, which is +killed by abelianization. The final step transports the norm range from +the distinguished copy `E` back to the original field `L`. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +variable + (K : Type) (L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +/-- The fixing subgroup of the maximal abelian subfield and the fixing +subgroup of the original field copy have the same image in the +abelianization of the normal-closure Galois group. -/ +theorem + maximalAbelianSubfield_fixingSubgroup_image_eq_original_image : + (finiteNormalClosureMaximalAbelianSubfield K L).fixingSubgroup.map + (Abelianization.of : + Gal(finiteNormalClosure K L/K) →* + Abelianization Gal(finiteNormalClosure K L/K)) = + (finiteNormalClosureOriginalFixingSubgroup K L).map + (Abelianization.of : + Gal(finiteNormalClosure K L/K) →* + Abelianization Gal(finiteNormalClosure K L/K)) := by + let N := finiteNormalClosure K L + let G := Gal(N/K) + let H : Subgroup G := finiteNormalClosureOriginalFixingSubgroup K L + change + (IntermediateField.fixedField + (H ⊔ _root_.commutator G)).fixingSubgroup.map + (Abelianization.of : G →* Abelianization G) = + H.map (Abelianization.of : G →* Abelianization G) + rw [IntermediateField.fixingSubgroup_fixedField] + apply le_antisymm + · rintro z ⟨sigma, hsigma, rfl⟩ + change sigma ∈ + (H.map (Abelianization.of : G →* Abelianization G)).comap + (Abelianization.of : G →* Abelianization G) + rw [H.comap_map_abelianization_eq_sup_commutator] + exact hsigma + · exact Subgroup.map_mono le_sup_left + +/-- The distinguished original field copy and its maximal abelian +subfield have the same idèle-class norm subgroup. -/ +theorem + finiteNormalClosureOriginalField_ideleClassNorm_range_eq_maximalAbelianSubfield : + (_root_.ideleClassNorm K + (finiteNormalClosureOriginalField K L)).range = + (_root_.ideleClassNorm K + (finiteNormalClosureMaximalAbelianSubfield K L)).range := by + calc + (_root_.ideleClassNorm K + (finiteNormalClosureOriginalField K L)).range = + ((finiteNormalClosureOriginalField K L).fixingSubgroup.map + (Abelianization.of : + Gal(finiteNormalClosure K L/K) →* + Abelianization Gal(finiteNormalClosure K L/K))).comap + (Reciprocity.globalNormResidueAbelianizationMonoidHom K + (finiteNormalClosure K L)) := + Reciprocity.ideleClassNorm_range_eq_artin_preimage_abelianizedFixingSubgroup + (K := K) (N := finiteNormalClosure K L) + (finiteNormalClosureOriginalField K L) + _ = + ((finiteNormalClosureMaximalAbelianSubfield K L).fixingSubgroup.map + (Abelianization.of : + Gal(finiteNormalClosure K L/K) →* + Abelianization Gal(finiteNormalClosure K L/K))).comap + (Reciprocity.globalNormResidueAbelianizationMonoidHom K + (finiteNormalClosure K L)) := by + change + ((finiteNormalClosureOriginalFixingSubgroup K L).map + (Abelianization.of : + Gal(finiteNormalClosure K L/K) →* + Abelianization Gal(finiteNormalClosure K L/K))).comap + (Reciprocity.globalNormResidueAbelianizationMonoidHom K + (finiteNormalClosure K L)) = _ + rw [ + maximalAbelianSubfield_fixingSubgroup_image_eq_original_image] + _ = + (_root_.ideleClassNorm K + (finiteNormalClosureMaximalAbelianSubfield K L)).range := + (Reciprocity.ideleClassNorm_range_eq_artin_preimage_abelianizedFixingSubgroup + (K := K) (N := finiteNormalClosure K L) + (finiteNormalClosureMaximalAbelianSubfield K L)).symm + +/-- Norm limitation: an arbitrary finite extension and its maximal abelian +Galois subextension inside the chosen normal closure have the same actual +idèle-class norm subgroup in the base field. -/ +theorem ideleClassNorm_range_eq_maximalAbelianSubfield : + (_root_.ideleClassNorm K L).range = + (_root_.ideleClassNorm K + (finiteNormalClosureMaximalAbelianSubfield K L)).range := by + calc + (_root_.ideleClassNorm K L).range = + (_root_.ideleClassNorm K + (finiteNormalClosureOriginalField K L)).range := by + simpa only [ordinaryIdeleClassNorm_range_eq_relative] using + (ideleClassNorm_range_algEquiv + (K := K) (finiteNormalClosureOriginalFieldEquiv K L)).symm + _ = + (_root_.ideleClassNorm K + (finiteNormalClosureMaximalAbelianSubfield K L)).range := + finiteNormalClosureOriginalField_ideleClassNorm_range_eq_maximalAbelianSubfield + K L + +/-- Membership form of the norm limitation theorem. -/ +theorem normLimitation (c : IdeleClassGroup K) : + c ∈ (_root_.ideleClassNorm K L).range ↔ + c ∈ (_root_.ideleClassNorm K + (finiteNormalClosureMaximalAbelianSubfield K L)).range := by + rw [ideleClassNorm_range_eq_maximalAbelianSubfield K L] + +omit [FiniteDimensional K L] in +/-- If the original extension is already abelian Galois, its distinguished +copy is the maximal abelian subfield selected by norm limitation. -/ +theorem + finiteNormalClosureMaximalAbelianSubfield_eq_originalField_of_isAbelianGalois + [IsAbelianGalois K L] : + finiteNormalClosureMaximalAbelianSubfield K L = + finiteNormalClosureOriginalField K L := by + let : IsAbelianGalois K (finiteNormalClosureOriginalField K L) := + IsAbelianGalois.of_algHom + (finiteNormalClosureOriginalFieldEquiv K L).symm.toAlgHom + apply le_antisymm + · exact finiteNormalClosureMaximalAbelianSubfield_le_originalField K L + · exact + finiteNormalClosureMaximalAbelianSubfield_greatest K L + (finiteNormalClosureOriginalField K L) le_rfl + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean new file mode 100644 index 0000000000..21631232e0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean @@ -0,0 +1,285 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +/-! +# Exact narrow finite ray-class presentations of norm quotients + +For every finite Galois extension, the ray class group at the exact narrow +finite conductor surjects onto the actual idèle-class norm quotient. This +file characterizes when that presentation has no residual kernel: the norm +subgroup is then exactly the congruence subgroup at its narrow finite +conductor, equivalently the two finite quotient groups have the same order. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField + +/-- Canonical class-group commutativity supplies normality for the quotient. -/ +private theorem normRayClassMaximalityClassGroupIsMulCommutative + (F : Type*) [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + IsMulCommutative.of_comm (fun a b => mul_comm a b) + +attribute [local instance] normRayClassMaximalityClassGroupIsMulCommutative + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- The actual idèle-class norm subgroup is exactly the ray congruence +subgroup at its narrow finite conductor if and only if the conductor ray +class group and the actual norm quotient have the same order. -/ +theorem + ideleClassNorm_range_eq_congruenceSubgroup_iff_rayClassGroup_card_eq_normQuotient_card : + (_root_.ideleClassNorm K L).range = + RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) ↔ + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)))) = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + constructor + · intro hnorm + calc + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)))) = + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)))).index := + (Subgroup.index_eq_card _).symm + _ = ((_root_.ideleClassNorm K L).range).index := by + rw [← hnorm] + _ = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + Subgroup.index_eq_card _ + · intro hcard + refine + (eq_of_le_of_not_lt + (ideleClassNorm_narrowFiniteConductor_isDefiningModulus + (K := K) (L := L)) + ?_).symm + intro hlt + have hstrict := Subgroup.index_strictAnti hlt + have hstrict' : + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) < + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)))) := by + simpa only [Subgroup.index_eq_card] using hstrict + rw [hcard] at hstrict' + exact lt_irrefl _ hstrict' + +/-- The canonical narrow finite conductor ray-class map to the actual +idèle-class norm quotient is injective if and only if its finite source and +target have the same order. -/ +theorem + rayClassToNormQuotient_injective_iff_card_eq_normQuotient_card : + Function.Injective + (narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient + (K := K) (L := L)) ↔ + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)))) = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + let f := + narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient + (K := K) (L := L) + change Function.Injective f ↔ _ + have hfSurjective : Function.Surjective f := + narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_surjective + (K := K) (L := L) + constructor + · intro hfInjective + exact + Nat.card_congr + (Equiv.ofBijective f + ⟨hfInjective, hfSurjective⟩) + · intro hcard + exact + (hfSurjective.bijective_of_nat_card_le hcard.le).1 + +/-- If the narrow finite conductor ray class group and the actual +idèle-class norm quotient have the same order, the latter is canonically +the full ray class group at its narrow finite conductor. -/ +def normQuotientEquivNarrowFiniteConductorRayClassGroup + (hcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)))) = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range)) : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≃* + RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) := + QuotientGroup.quotientMulEquivOfEq + ((ideleClassNorm_range_eq_congruenceSubgroup_iff_rayClassGroup_card_eq_normQuotient_card + (K := K) (L := L)).2 hcard) + +/-- Two finite Galois extensions with the same exact narrow finite +conductor and maximal ray-class presentations have the same actual +idèle-class norm subgroup. -/ +theorem + ideleClassNorm_ranges_eq_of_conductors_eq_of_rayClass_cards_eq_normQuotient_cards + {M : Type} + [Field M] [NumberField M] [Algebra K M] + [FiniteDimensional K M] [IsGalois K M] + (hconductor : + ideleClassNormNarrowFiniteConductor (K := K) (L := L) = + ideleClassNormNarrowFiniteConductor (K := K) (L := M)) + (hLcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)))) = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range)) + (hMcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := M)))) = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K M).range)) : + (_root_.ideleClassNorm K L).range = + (_root_.ideleClassNorm K M).range := by + calc + (_root_.ideleClassNorm K L).range = + RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) := + (ideleClassNorm_range_eq_congruenceSubgroup_iff_rayClassGroup_card_eq_normQuotient_card + (K := K) (L := L)).2 hLcard + _ = + RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := M))) := + congrArg + (fun f => RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite f)) + hconductor + _ = (_root_.ideleClassNorm K M).range := + ((ideleClassNorm_range_eq_congruenceSubgroup_iff_rayClassGroup_card_eq_normQuotient_card + (K := K) (L := M)).2 hMcard).symm + +/-- The actual norm quotients of two maximal narrow finite conductor +ray-class presentations with the same conductor are canonically equivalent. +-/ +def normQuotientEquivOfNarrowFiniteConductorsEqOfRayClassGroupCardsEqNormQuotientCards + {M : Type} + [Field M] [NumberField M] [Algebra K M] + [FiniteDimensional K M] [IsGalois K M] + (hconductor : + ideleClassNormNarrowFiniteConductor (K := K) (L := L) = + ideleClassNormNarrowFiniteConductor (K := K) (L := M)) + (hLcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)))) = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range)) + (hMcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := M)))) = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K M).range)) : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≃* + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K M).range) := + QuotientGroup.quotientMulEquivOfEq + (ideleClassNorm_ranges_eq_of_conductors_eq_of_rayClass_cards_eq_normQuotient_cards + (K := K) (L := L) (M := M) + hconductor hLcard hMcard) + +/-- The canonical equivalence between maximal narrow finite conductor +ray-class norm quotients preserves every idèle-class representative. -/ +theorem + normQuotientEquivOfNarrowFiniteConductorsEqOfRayClassGroupCardsEqNormQuotientCards_mk + {M : Type} + [Field M] [NumberField M] [Algebra K M] + [FiniteDimensional K M] [IsGalois K M] + (hconductor : + ideleClassNormNarrowFiniteConductor (K := K) (L := L) = + ideleClassNormNarrowFiniteConductor (K := K) (L := M)) + (hLcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)))) = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range)) + (hMcard : + Nat.card + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := M)))) = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K M).range)) + (c : IdeleClassGroup K) : + normQuotientEquivOfNarrowFiniteConductorsEqOfRayClassGroupCardsEqNormQuotientCards + (K := K) (L := L) (M := M) + hconductor hLcard hMcard + (QuotientGroup.mk' + ((_root_.ideleClassNorm K L).range) c) = + QuotientGroup.mk' + ((_root_.ideleClassNorm K M).range) c := + rfl + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormTowerConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormTowerConductor.lean new file mode 100644 index 0000000000..e81158472f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormTowerConductor.lean @@ -0,0 +1,402 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +/-! +# Norm quotients and narrow finite conductors in a field tower + +For a finite tower `K ⊂ M ⊂ L`, norm transitivity places the actual +idele-class norms from `L` inside those from `M`. This produces the +canonical quotient transition + +`C_K / N_{L/K} C_L → C_K / N_{M/K} C_M`. + +The transition is surjective, its kernel is the image of +`N_{M/K} C_M` modulo `N_{L/K} C_L`, and its orders satisfy the +corresponding exact factorization. When both extensions over `K` are +Galois, the narrow finite conductor is contravariant under this +inclusion and the conductor support of the intermediate extension is +contained in that of the top extension. This is the finite part in the +all-real-positive convention, not a claim about the full archimedean +conductor. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField + +/-- The canonical commutativity witness used to form ordinary norm quotients. -/ +private theorem normTowerIdeleClassIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] normTowerIdeleClassIsMulCommutative + +/-- Quotient commutativity follows by lifting representatives through the +canonical quotient map, without constructing another group dictionary. -/ +private theorem normTowerQuotientIsMulCommutative + {G : Type*} [Group G] [IsMulCommutative G] + (N : Subgroup G) : IsMulCommutative (G ⧸ N) := by + refine IsMulCommutative.of_comm ?_ + intro a b + obtain ⟨x, rfl⟩ := QuotientGroup.mk'_surjective N a + obtain ⟨y, rfl⟩ := QuotientGroup.mk'_surjective N b + calc + QuotientGroup.mk' N x * QuotientGroup.mk' N y = + QuotientGroup.mk' N (x * y) := + ((QuotientGroup.mk' N).map_mul x y).symm + _ = QuotientGroup.mk' N (y * x) := + congrArg (QuotientGroup.mk' N) (mul_comm' x y) + _ = QuotientGroup.mk' N y * QuotientGroup.mk' N x := + (QuotientGroup.mk' N).map_mul y x + +/-- A quotient of the idele class group is commutative, so its norm-image +subgroups are normal when forming the second quotient. -/ +private theorem normTowerIdeleClassQuotientIsMulCommutative + {F : Type} [Field F] [NumberField F] + (N : Subgroup (IdeleClassGroup F)) : + IsMulCommutative (IdeleClassGroup F ⧸ N) := + normTowerQuotientIsMulCommutative N + +attribute [local instance] normTowerIdeleClassQuotientIsMulCommutative + +variable {K : Type} [Field K] [NumberField K] + +section Tower + +variable + {M L : Type} + [Field M] [NumberField M] + [Field L] [NumberField L] + [Algebra K M] [Algebra M L] [Algebra K L] + [IsScalarTower K M L] + [FiniteDimensional K M] [FiniteDimensional M L] + [IsGalois K M] [IsGalois K L] + +omit [IsGalois K M] [IsGalois K L] in +/-- Norm transitivity puts every idele-class norm from the top field +inside the idele-class norm subgroup of the intermediate field. -/ +theorem ideleClassNorm_range_le_of_tower : + (_root_.ideleClassNorm K L).range ≤ + (_root_.ideleClassNorm K M).range := by + calc + (_root_.ideleClassNorm K L).range = + (RelativeIdeleGroup.classNorm K L).range := + ordinaryIdeleClassNorm_range_eq_relative + (K := K) (L := L) + _ ≤ + (RelativeIdeleGroup.classNorm K M).range := by + rw [← towerCompositeClassNorm_range_eq K M L] + rintro _ ⟨c, rfl⟩ + exact + ⟨TowerRelativeIdeleGroup.classNorm K M L c, rfl⟩ + _ = (_root_.ideleClassNorm K M).range := + (ordinaryIdeleClassNorm_range_eq_relative + (K := K) (L := M)).symm + +/-- The quotient transition induced by norm transitivity in a finite +field tower. -/ +def ideleClassNormQuotientTowerMap : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) →* + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K M).range) := + QuotientGroup.map + ((_root_.ideleClassNorm K L).range) + ((_root_.ideleClassNorm K M).range) + (MonoidHom.id _) + (fun _ hx => + ideleClassNorm_range_le_of_tower + (K := K) (M := M) (L := L) hx) + +omit [IsGalois K M] [IsGalois K L] in +/-- The tower norm-quotient transition sends an idele class to the same +class modulo the intermediate norm subgroup. -/ +theorem ideleClassNormQuotientTowerMap_mk + (x : IdeleClassGroup K) : + ideleClassNormQuotientTowerMap + (K := K) (M := M) (L := L) + (QuotientGroup.mk' + ((_root_.ideleClassNorm K L).range) x) = + QuotientGroup.mk' + ((_root_.ideleClassNorm K M).range) x := + rfl + +omit [IsGalois K M] [IsGalois K L] in +/-- The tower norm-quotient transition is surjective. -/ +theorem ideleClassNormQuotientTowerMap_surjective : + Function.Surjective + (ideleClassNormQuotientTowerMap + (K := K) (M := M) (L := L)) := by + intro q + obtain ⟨x, rfl⟩ := + QuotientGroup.mk'_surjective + ((_root_.ideleClassNorm K M).range) q + exact + ⟨QuotientGroup.mk' + ((_root_.ideleClassNorm K L).range) x, rfl⟩ + +/-- The narrow-finite-conductor ray class group of the top extension maps +canonically onto the norm quotient of the intermediate extension. -/ +noncomputable def + narrowFiniteConductorRayClassGroupToIntermediateIdeleClassNormQuotient : + RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) →* + IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K M).range := + (ideleClassNormQuotientTowerMap + (K := K) (M := M) (L := L)).comp + (narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient + (K := K) (L := L)) + +omit [IsGalois K M] in +/-- The narrow-finite-conductor ray-class map to the intermediate norm quotient sends +an idele class to the same class modulo the intermediate norm +subgroup. -/ +theorem + narrowFiniteConductorRayClassGroupToIntermediateIdeleClassNormQuotient_mk + (x : IdeleClassGroup K) : + narrowFiniteConductorRayClassGroupToIntermediateIdeleClassNormQuotient + (K := K) (M := M) (L := L) + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)))) x) = + QuotientGroup.mk' + ((_root_.ideleClassNorm K M).range) x := by + change + ideleClassNormQuotientTowerMap + (K := K) (M := M) (L := L) + (narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient + (K := K) (L := L) + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)))) x)) = + _ + rw [ + narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_mk, + ideleClassNormQuotientTowerMap_mk] + +omit [IsGalois K M] in +/-- The narrow-finite-conductor ray-class map to the intermediate norm quotient is +surjective. -/ +theorem + narrowFiniteConductorRayClassGroupToIntermediateIdeleClassNormQuotient_surjective : + Function.Surjective + (narrowFiniteConductorRayClassGroupToIntermediateIdeleClassNormQuotient + (K := K) (M := M) (L := L)) := + (ideleClassNormQuotientTowerMap_surjective + (K := K) (M := M) (L := L)).comp + (narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_surjective + (K := K) (L := L)) + +omit [IsGalois K M] [IsGalois K L] in +/-- The kernel of the tower norm-quotient transition is the image of +the intermediate norm subgroup modulo the top norm subgroup. -/ +theorem ideleClassNormQuotientTowerMap_ker : + MonoidHom.ker + (ideleClassNormQuotientTowerMap + (K := K) (M := M) (L := L)) = + Subgroup.map + (QuotientGroup.mk' + ((_root_.ideleClassNorm K L).range)) + ((_root_.ideleClassNorm K M).range) := by + unfold ideleClassNormQuotientTowerMap + exact + (QuotientGroup.ker_map + (N := ((_root_.ideleClassNorm K L).range)) + ((_root_.ideleClassNorm K M).range) + (MonoidHom.id (IdeleClassGroup K)) + (fun _ hx => + ideleClassNorm_range_le_of_tower + (K := K) (M := M) (L := L) hx)).trans + (congrArg + (Subgroup.map + (QuotientGroup.mk' ((_root_.ideleClassNorm K L).range))) + (Subgroup.comap_id ((_root_.ideleClassNorm K M).range))) + +/-- Quotienting the top norm quotient by the image of the intermediate +norm subgroup gives the intermediate norm quotient. -/ +def ideleClassNormQuotientModuloIntermediateEquiv : + ((IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ⧸ + Subgroup.map + (QuotientGroup.mk' + ((_root_.ideleClassNorm K L).range)) + ((_root_.ideleClassNorm K M).range)) ≃* + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K M).range) := + (QuotientGroup.quotientMulEquivOfEq + (ideleClassNormQuotientTowerMap_ker + (K := K) (M := M) (L := L)).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (ideleClassNormQuotientTowerMap + (K := K) (M := M) (L := L)) + (ideleClassNormQuotientTowerMap_surjective + (K := K) (M := M) (L := L))) + +/-- The tower norm-quotient transition transported to the +narrow-finite-conductor ray-class norm-subgroup quotient presentations. -/ +noncomputable def + narrowFiniteConductorRayClassNormSubgroupQuotientTowerMap : + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L))) ⧸ + Subgroup.map + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L))))) + ((_root_.ideleClassNorm K L).range)) →* + (RayClass.RayClassGroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := M))) ⧸ + Subgroup.map + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := M))))) + ((_root_.ideleClassNorm K M).range)) := + (narrowFiniteConductorRayClassNormSubgroupQuotientEquivIdeleClassNormQuotient + (K := K) (L := M)).symm.toMonoidHom.comp + ((ideleClassNormQuotientTowerMap + (K := K) (M := M) (L := L)).comp + (narrowFiniteConductorRayClassNormSubgroupQuotientEquivIdeleClassNormQuotient + (K := K) (L := L)).toMonoidHom) + +/-- Transporting the tower transition to narrow-finite-conductor ray-class quotient +presentations commutes with the canonical identifications with actual +norm quotients. -/ +theorem + narrowFiniteConductorRayClassNormSubgroupQuotientTowerMap_commutes : + (narrowFiniteConductorRayClassNormSubgroupQuotientEquivIdeleClassNormQuotient + (K := K) (L := M)).toMonoidHom.comp + (narrowFiniteConductorRayClassNormSubgroupQuotientTowerMap + (K := K) (M := M) (L := L)) = + (ideleClassNormQuotientTowerMap + (K := K) (M := M) (L := L)).comp + (narrowFiniteConductorRayClassNormSubgroupQuotientEquivIdeleClassNormQuotient + (K := K) (L := L)).toMonoidHom := by + ext q + simp [narrowFiniteConductorRayClassNormSubgroupQuotientTowerMap] + +omit [IsGalois K M] [IsGalois K L] in +/-- The order of the top norm quotient factors into the relative kernel +order and the order of the intermediate norm quotient. -/ +theorem + ideleClassNormQuotient_card_eq_intermediateNormImage_card_mul_baseNormQuotient_card : + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) = + Nat.card + (Subgroup.map + (QuotientGroup.mk' + ((_root_.ideleClassNorm K L).range)) + ((_root_.ideleClassNorm K M).range)) * + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K M).range) := by + let f := + ideleClassNormQuotientTowerMap + (K := K) (M := M) (L := L) + have hf : Function.Surjective f := + ideleClassNormQuotientTowerMap_surjective + (K := K) (M := M) (L := L) + calc + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) = + Nat.card (MonoidHom.ker f) * + (MonoidHom.ker f).index := + (Subgroup.card_mul_index (MonoidHom.ker f)).symm + _ = Nat.card (MonoidHom.ker f) * + Nat.card f.range := by + rw [Subgroup.index_ker f] + _ = Nat.card (MonoidHom.ker f) * + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K M).range) := by + rw [f.range_eq_top_of_surjective hf, Subgroup.card_top] + _ = Nat.card + (Subgroup.map + (QuotientGroup.mk' + ((_root_.ideleClassNorm K L).range)) + ((_root_.ideleClassNorm K M).range)) * + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K M).range) := by + rw [ideleClassNormQuotientTowerMap_ker + (K := K) (M := M) (L := L)] + +omit [IsGalois K M] [IsGalois K L] in +/-- The intermediate norm quotient order divides the top norm quotient +order. -/ +theorem ideleClassNormQuotient_card_dvd_of_tower : + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K M).range) ∣ + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + simpa only [Subgroup.index_eq_card] using + Subgroup.index_dvd_of_le + (ideleClassNorm_range_le_of_tower + (K := K) (M := M) (L := L)) + +/-- In a finite Galois tower, the narrow finite conductor of the intermediate +norm subgroup is bounded by that of the top norm subgroup. -/ +theorem ideleClassNorm_narrowFiniteConductor_le_of_tower : + ideleClassNormNarrowFiniteConductor (K := K) (L := M) ≤ + ideleClassNormNarrowFiniteConductor (K := K) (L := L) := by + exact + ConductorialSubgroup.narrowFiniteConductor_antitone + (ideleClassNormConductorialSubgroup (K := K) (L := L)) + (ideleClassNormConductorialSubgroup (K := K) (L := M)) + (ideleClassNorm_range_le_of_tower + (K := K) (M := M) (L := L)) + +/-- In a finite Galois tower, every prime in the narrow finite conductor +support of the intermediate norm subgroup also occurs in that of the top +norm subgroup. -/ +theorem ideleClassNorm_narrowFiniteConductor_support_subset_of_tower : + (ideleClassNormNarrowFiniteConductor (K := K) (L := M)).support ⊆ + (ideleClassNormNarrowFiniteConductor (K := K) (L := L)).support := by + intro v hv + have hne : + ideleClassNormNarrowFiniteConductor (K := K) (L := M) v ≠ 0 := + Finsupp.mem_support_iff.mp hv + apply Finsupp.mem_support_iff.mpr + intro htopZero + apply hne + exact Nat.eq_zero_of_le_zero + ((ideleClassNorm_narrowFiniteConductor_le_of_tower + (K := K) (M := M) (L := L) v).trans_eq htopZero) + +end Tower + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/OrdinaryNormClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/OrdinaryNormClassField.lean new file mode 100644 index 0000000000..fc1b8d6a45 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/OrdinaryNormClassField.lean @@ -0,0 +1,482 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassNormTopology +/-! +# Class fields from ordinary idele-class norm neighbourhoods + +An actual finite Galois norm subgroup contained in an ordinary +idele-class subgroup makes the transported subgroup norm-open in the +rational absolute class formation. Finite abelian classification then +constructs its class field. The final theorem below transports the +result back to the ordinary idele class group of the actual fixed field, +so its conclusion is an equality of genuine determinant-norm ranges. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open ClassFormation +open LocalClassFieldTheory +open Reciprocity + +/-- Fix the canonical quotient group before converting fixed-field +equivalences to additive homomorphisms. -/ +@[instance_reducible] +private noncomputable def ordinaryNormClassFieldIdeleClassCommGroup + (F : Type) [Field F] [NumberField F] : + CommGroup (IdeleClassGroup F) := + QuotientGroup.Quotient.commGroup (IdeleGroup.principalSubgroup F) + +attribute [local instance] ordinaryNormClassFieldIdeleClassCommGroup + +private theorem addSubgroup_map_map_eq_of_comp_eq + {A B C : Type*} [AddGroup A] [AddGroup B] [AddGroup C] + (S : AddSubgroup A) (f : A →+ B) (g : B →+ C) (h : A →+ C) + (hcomp : g.comp f = h) : + (S.map f).map g = S.map h := by + rw [AddSubgroup.map_map, hcomp] + +variable + (K L : Type) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/- The fixed-field typeclass data used by the topology comparison are kept +behind named constants. This prevents every consumer from rebuilding the +same finite-dimensional and number-field proof terms while reducing the +dependent fixed-field type. -/ +omit [FiniteDimensional K L] [IsGalois K L] in +private theorem numberFieldTowerFixedBaseFiniteDimensionalPackage : + FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L)) := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerBaseSubgroupAbsoluteQuotientFinite K L) + +omit [FiniteDimensional K L] [IsGalois K L] in +private theorem numberFieldTowerFixedBaseNumberFieldPackage : + NumberField + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L)) := by + let hFiniteDimensional : FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L)) := + numberFieldTowerFixedBaseFiniteDimensionalPackage K L + exact + NumberField.of_module_finite ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L)) + +omit [FiniteDimensional K L] [IsGalois K L] in +noncomputable local instance + numberFieldTowerFixedBaseFiniteDimensional : + FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L)) := + numberFieldTowerFixedBaseFiniteDimensionalPackage K L + +omit [FiniteDimensional K L] [IsGalois K L] in +noncomputable local instance numberFieldTowerFixedBaseNumberField : + NumberField + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L)) := + numberFieldTowerFixedBaseNumberFieldPackage K L + +/- The norm-open subgroup and its openness proof form one opaque value. Both +the classification theorem and the topology comparison consume projections +of this same package. -/ +private noncomputable def ordinaryNormOpenSubgroup + (H : Subgroup (IdeleClassGroup K)) + (hLH : (_root_.ideleClassNorm K L).range ≤ H) : + ClassFormation.FiniteAbelianSubextension.NormOpenAddSubgroup + rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) := by + let f : Additive (IdeleClassGroup K) →+ + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation (numberFieldTowerBaseSubgroup K L) := + (numberFieldTowerIdeleClassEquivAmbientFixed K L).toAddMonoidHom + refine ⟨H.toAddSubgroup.map f, ?_⟩ + exact numberFieldTowerTransport_isNormOpen_of_normRange_le K L H hLH + +private theorem ordinaryNormOpenSubgroup_val + (H : Subgroup (IdeleClassGroup K)) + (hLH : (_root_.ideleClassNorm K L).range ≤ H) : + (ordinaryNormOpenSubgroup K L H hLH).1 = + H.toAddSubgroup.map + (numberFieldTowerIdeleClassEquivAmbientFixed K L).toAddMonoidHom := + rfl + +section FixedBaseTransport + +omit [FiniteDimensional K L] [IsGalois K L] in +private theorem numberFieldTowerIdeleClassEquivAmbientFixed_symm_apply + (c : Additive (IdeleClassGroup K)) : + (rationalAbstractFixedFieldIdeleClassEquivFixed + (numberFieldTowerBaseSubgroup K L)).symm + (numberFieldTowerIdeleClassEquivAmbientFixed K L c) = + MulEquiv.toAdditive + (ideleClassCongr + (numberFieldTowerAbstractBaseFieldEquiv K L)) c := by + let eFixed := + rationalAbstractFixedFieldIdeleClassEquivFixed + (numberFieldTowerBaseSubgroup K L) + let eBase := + MulEquiv.toAdditive + (ideleClassCongr + (numberFieldTowerAbstractBaseFieldEquiv K L)) + simpa only [numberFieldTowerIdeleClassEquivAmbientFixed, + AddEquiv.trans_apply] using + eFixed.symm_apply_apply (eBase c) + +omit [FiniteDimensional K L] [IsGalois K L] in +private theorem numberFieldTowerIdeleClassEquivAmbientFixed_comp : + (rationalAbstractFixedFieldIdeleClassEquivFixed + (numberFieldTowerBaseSubgroup K L)).symm.toAddMonoidHom.comp + (numberFieldTowerIdeleClassEquivAmbientFixed K L).toAddMonoidHom = + (MulEquiv.toAdditive + (ideleClassCongr + (numberFieldTowerAbstractBaseFieldEquiv K L))) := by + apply AddMonoidHom.ext + intro c + exact + numberFieldTowerIdeleClassEquivAmbientFixed_symm_apply + K L (c : Additive (IdeleClassGroup K)) + +private theorem numberFieldTowerBaseTransport_isOpen_of_normRange_le_core + (H : Subgroup (IdeleClassGroup K)) + (hLH : (_root_.ideleClassNorm K L).range ≤ H) : + IsOpen + (((H.toAddSubgroup).map + (MulEquiv.toAdditive + (ideleClassCongr + (numberFieldTowerAbstractBaseFieldEquiv + K L))).toAddMonoidHom : + AddSubgroup + (Additive + (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L))))) : + Set + (Additive + (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L))))) := by + let B := numberFieldTowerBaseSubgroup K L + let F := abstractFixedField ℚ (SeparableClosure ℚ) B + let eFixed : + Additive (IdeleClassGroup F) ≃+ + KummerTheory.ambientFixedAddSubgroup rationalIdeleClassRepresentation B := + rationalAbstractFixedFieldIdeleClassEquivFixed B + let eBase : Additive (IdeleClassGroup K) ≃+ Additive (IdeleClassGroup F) := + MulEquiv.toAdditive + (ideleClassCongr + (numberFieldTowerAbstractBaseFieldEquiv K L)) + let eTower : + Additive (IdeleClassGroup K) ≃+ + KummerTheory.ambientFixedAddSubgroup rationalIdeleClassRepresentation B := + numberFieldTowerIdeleClassEquivAmbientFixed K L + let N : AddSubgroup + (KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation B) := + (ordinaryNormOpenSubgroup K L H hLH).1 + have hN : + IsNormOpen rationalIdeleClassRepresentation B N := + (ordinaryNormOpenSubgroup K L H hLH).2 + have hopen := + rationalNormOpenSubgroup_isOpen B N hN + have hcomp : + eFixed.symm.toAddMonoidHom.comp + eTower.toAddMonoidHom = + eBase.toAddMonoidHom := + numberFieldTowerIdeleClassEquivAmbientFixed_comp K L + have hmap : + rationalTransportedNormSubgroup B N = + H.toAddSubgroup.map eBase.toAddMonoidHom := by + simpa only [rationalTransportedNormSubgroup, N, + ordinaryNormOpenSubgroup_val, AddSubgroup.map_map] using + congrArg + (fun f : Additive (IdeleClassGroup K) →+ + Additive (IdeleClassGroup F) => + AddSubgroup.map (N := Additive (IdeleClassGroup F)) f H.toAddSubgroup) + hcomp + exact + (congrArg + (fun S : AddSubgroup (Additive (IdeleClassGroup F)) => + IsOpen (S : Set (Additive (IdeleClassGroup F)))) + hmap).mp hopen + +end FixedBaseTransport + +/-- A finite Galois norm neighbourhood inside an ordinary idele-class +subgroup produces a finite abelian subextension whose abstract norm +subgroup is exactly the transported ordinary subgroup. -/ +theorem exists_finiteAbelianSubextension_normSubgroup_eq_of_normRange_le + (H : Subgroup (IdeleClassGroup K)) + (hLH : (_root_.ideleClassNorm K L).range ≤ H) : + ∃ M : FiniteAbelianSubextension + (numberFieldTowerBaseSubgroup K L), + M.normSubgroup rationalIdeleClassRepresentation = + (H.toAddSubgroup).map + (numberFieldTowerIdeleClassEquivAmbientFixed + K L).toAddMonoidHom := by + let := + numberFieldTowerBaseSubgroupAbsoluteQuotientFinite K L + let B : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) := + { field := numberFieldTowerBaseSubgroup K L + finite := numberFieldTowerBaseSubgroupAbsoluteQuotientFinite K L } + let N := ordinaryNormOpenSubgroup K L H hLH + obtain ⟨M, hM⟩ : + ∃ M : FiniteAbelianSubextension + (numberFieldTowerBaseSubgroup K L), + FiniteAbelianSubextension.normSubgroupMap + rationalIdeleClassRepresentation M = N := + FiniteAbelianSubextension.normSubgroupMap_surjective + Reciprocity.rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom B N + refine ⟨M, ?_⟩ + rw [← FiniteAbelianSubextension.normSubgroupMap_val] + rw [congrArg Subtype.val hM] + exact ordinaryNormOpenSubgroup_val K L H hLH + +/-- The ordinary subgroup transported from `K` to its compatible +embedded fixed-field copy is open whenever it contains an actual finite +Galois norm subgroup. This is the concrete comparison between the norm +topology and the usual idele-class topology at the chosen realization. -/ +theorem numberFieldTowerBaseTransport_isOpen_of_normRange_le + (H : Subgroup (IdeleClassGroup K)) + (hLH : (_root_.ideleClassNorm K L).range ≤ H) : + let B := numberFieldTowerBaseSubgroup K L + let F := abstractFixedField ℚ (SeparableClosure ℚ) B + IsOpen + (((H.toAddSubgroup).map + (MulEquiv.toAdditive + (ideleClassCongr + (numberFieldTowerAbstractBaseFieldEquiv + K L))).toAddMonoidHom : + AddSubgroup (Additive (IdeleClassGroup F))) : + Set (Additive (IdeleClassGroup F))) := by + exact + numberFieldTowerBaseTransport_isOpen_of_normRange_le_core + K L H hLH + +/-- The finite abelian subextension selected from an ordinary norm +neighbourhood. This is the unique choice point for the realization API +below. -/ +noncomputable def ordinaryNormClassFieldSubextension + (H : Subgroup (IdeleClassGroup K)) + (hLH : (_root_.ideleClassNorm K L).range ≤ H) : + FiniteAbelianSubextension (numberFieldTowerBaseSubgroup K L) := + Classical.choose + (exists_finiteAbelianSubextension_normSubgroup_eq_of_normRange_le + K L H hLH) + +/-- The selected subextension has the prescribed abstract norm subgroup. -/ +theorem ordinaryNormClassFieldSubextension_normSubgroup + (H : Subgroup (IdeleClassGroup K)) + (hLH : (_root_.ideleClassNorm K L).range ≤ H) : + (ordinaryNormClassFieldSubextension K L H hLH).normSubgroup + rationalIdeleClassRepresentation = + H.toAddSubgroup.map + (numberFieldTowerIdeleClassEquivAmbientFixed + K L).toAddMonoidHom := + Classical.choose_spec + (exists_finiteAbelianSubextension_normSubgroup_eq_of_normRange_le + K L H hLH) + +/-- The canonical fixed-field copy of the base used by every ordinary +norm-neighbourhood realization in the ambient extension `L / K`. -/ +noncomputable abbrev ordinaryNormClassFieldBase : Type := + abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L) + +omit [FiniteDimensional K L] [IsGalois K L] in +noncomputable instance ordinaryNormClassFieldBaseFiniteDimensional : + FiniteDimensional ℚ (ordinaryNormClassFieldBase K L) := + numberFieldTowerFixedBaseFiniteDimensionalPackage K L + +omit [FiniteDimensional K L] [IsGalois K L] in +noncomputable instance ordinaryNormClassFieldBaseNumberField : + NumberField (ordinaryNormClassFieldBase K L) := + numberFieldTowerFixedBaseNumberFieldPackage K L + +/-- The actual relative fixed field of the selected ordinary class-field +subextension. -/ +noncomputable abbrev ordinaryNormClassFieldExtension + (H : Subgroup (IdeleClassGroup K)) + (hLH : (_root_.ideleClassNorm K L).range ≤ H) : Type := + abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (ordinaryNormClassFieldSubextension K L H hLH).below + +noncomputable instance ordinaryNormClassFieldExtensionFiniteDimensional + (H : Subgroup (IdeleClassGroup K)) + (hLH : (_root_.ideleClassNorm K L).range ≤ H) : + FiniteDimensional (ordinaryNormClassFieldBase K L) + (ordinaryNormClassFieldExtension K L H hLH) := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L) + (ordinaryNormClassFieldSubextension K L H hLH).field + (ordinaryNormClassFieldSubextension K L H hLH).below + (numberFieldTowerBaseSubgroupAbsoluteQuotientFinite K L) + (ordinaryNormClassFieldSubextension K L H hLH).finite + +noncomputable instance ordinaryNormClassFieldScalarTower + (H : Subgroup (IdeleClassGroup K)) + (hLH : (_root_.ideleClassNorm K L).range ≤ H) : + IsScalarTower ℚ (ordinaryNormClassFieldBase K L) + (ordinaryNormClassFieldExtension K L H hLH) := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + +noncomputable instance ordinaryNormClassFieldAbsoluteFiniteDimensional + (H : Subgroup (IdeleClassGroup K)) + (hLH : (_root_.ideleClassNorm K L).range ≤ H) : + FiniteDimensional ℚ + (ordinaryNormClassFieldExtension K L H hLH) := + FiniteDimensional.trans ℚ (ordinaryNormClassFieldBase K L) + (ordinaryNormClassFieldExtension K L H hLH) + +noncomputable instance ordinaryNormClassFieldExtensionNumberField + (H : Subgroup (IdeleClassGroup K)) + (hLH : (_root_.ideleClassNorm K L).range ≤ H) : + NumberField (ordinaryNormClassFieldExtension K L H hLH) := + NumberField.of_module_finite ℚ + (ordinaryNormClassFieldExtension K L H hLH) + +noncomputable instance ordinaryNormClassFieldExtensionIsGalois + (H : Subgroup (IdeleClassGroup K)) + (hLH : (_root_.ideleClassNorm K L).range ≤ H) : + IsGalois (ordinaryNormClassFieldBase K L) + (ordinaryNormClassFieldExtension K L H hLH) := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L) + (ordinaryNormClassFieldSubextension K L H hLH).field + (ordinaryNormClassFieldSubextension K L H hLH).below + (ordinaryNormClassFieldSubextension K L H hLH).normal + +noncomputable instance ordinaryNormClassFieldExtensionIsAbelianGalois + (H : Subgroup (IdeleClassGroup K)) + (hLH : (_root_.ideleClassNorm K L).range ≤ H) : + IsAbelianGalois (ordinaryNormClassFieldBase K L) + (ordinaryNormClassFieldExtension K L H hLH) := + finiteAbelianSubextensionAbstractRelativeFixedFieldIsAbelianGalois + (ordinaryNormClassFieldSubextension K L H hLH) + +/-- The canonical equivalence from the original base to the selected +fixed-field base. -/ +noncomputable abbrev ordinaryNormClassFieldBaseEquiv : + K ≃ₐ[ℚ] ordinaryNormClassFieldBase K L := + numberFieldTowerAbstractBaseFieldEquiv K L + +omit [FiniteDimensional K L] [IsGalois K L] in +private theorem ordinaryNormClassFieldBaseIdeleClassTransport_comp : + let B := numberFieldTowerBaseSubgroup K L + let eFixed := rationalAbstractFixedFieldIdeleClassEquivFixed B + let eBase := + MulEquiv.toAdditive + (ideleClassCongr (ordinaryNormClassFieldBaseEquiv K L)) + let eTower := numberFieldTowerIdeleClassEquivAmbientFixed K L + eFixed.symm.toAddMonoidHom.comp eTower.toAddMonoidHom = + eBase.toAddMonoidHom := by + exact numberFieldTowerIdeleClassEquivAmbientFixed_comp K L + +/-- The determinant-norm range of the selected ordinary class field is +the original subgroup transported to the canonical fixed-field base. -/ +theorem ordinaryNormClassField_ideleClassNorm_range + (H : Subgroup (IdeleClassGroup K)) + (hLH : (_root_.ideleClassNorm K L).range ≤ H) : + (_root_.ideleClassNorm + (ordinaryNormClassFieldBase K L) + (ordinaryNormClassFieldExtension K L H hLH)).range.toAddSubgroup = + H.toAddSubgroup.map + (MulEquiv.toAdditive + (ideleClassCongr + (ordinaryNormClassFieldBaseEquiv K L))).toAddMonoidHom := by + let M := ordinaryNormClassFieldSubextension K L H hLH + let B := numberFieldTowerBaseSubgroup K L + let hRelativeQuotientFinite : Finite + (B.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup B M.field M.below) := + M.finite + let eFixed := rationalAbstractFixedFieldIdeleClassEquivFixed B + let eTower := numberFieldTowerIdeleClassEquivAmbientFixed K L + let f : Additive (IdeleClassGroup K) →+ + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation B := + eTower.toAddMonoidHom + let g : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation B →+ + Additive (IdeleClassGroup (ordinaryNormClassFieldBase K L)) := + eFixed.symm.toAddMonoidHom + let h : Additive (IdeleClassGroup K) →+ + Additive (IdeleClassGroup (ordinaryNormClassFieldBase K L)) := + (MulEquiv.toAdditive + (ideleClassCongr + (ordinaryNormClassFieldBaseEquiv K L))).toAddMonoidHom + have hnorm : + (M.normSubgroup rationalIdeleClassRepresentation).map + g = + (_root_.ideleClassNorm + (ordinaryNormClassFieldBase K L) + (ordinaryNormClassFieldExtension K L H hLH)).range.toAddSubgroup := by + simpa only [FiniteAbelianSubextension.normSubgroup, + M, B, ordinaryNormClassFieldBase, + ordinaryNormClassFieldExtension] using + (map_rationalFiniteNormSubgroup_eq_ordinaryIdeleClassNormRange_concrete + B M.field M.below M.normal) + have hcomp : + g.comp f = h := by + simpa only [f, g, h, eFixed, eTower] using + (ordinaryNormClassFieldBaseIdeleClassTransport_comp K L) + calc + (_root_.ideleClassNorm + (ordinaryNormClassFieldBase K L) + (ordinaryNormClassFieldExtension K L H hLH)).range.toAddSubgroup = + (M.normSubgroup rationalIdeleClassRepresentation).map + g := hnorm.symm + _ = + (H.toAddSubgroup.map f).map g := by + exact + congrArg + (fun S : AddSubgroup + (KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation B) => + AddSubgroup.map + (N := Additive (IdeleClassGroup (ordinaryNormClassFieldBase K L))) g S) + (ordinaryNormClassFieldSubextension_normSubgroup + K L H hLH) + _ = H.toAddSubgroup.map h := by + exact + addSubgroup_map_map_eq_of_comp_eq + (A := Additive (IdeleClassGroup K)) + (B := KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation B) + (C := Additive + (IdeleClassGroup (ordinaryNormClassFieldBase K L))) + (S := H.toAddSubgroup) + (f := f) (g := g) (h := h) + (hcomp := hcomp) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PowerCongruenceCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PowerCongruenceCore.lean new file mode 100644 index 0000000000..ddf8cb7fa6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PowerCongruenceCore.lean @@ -0,0 +1,201 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.PrimePowerKummerIndex +/-! +# Power congruence subgroups inside finite-index idele-class subgroups + +Let `H` be a closed finite-index subgroup of the idele class group and let +`n = [C_K : H]`. Every `n`-th power belongs to `H`. If a finite set of +finite places contains the support of a congruence subgroup lying in `H`, +the ideles which are local `n`-th powers on that set and integral units +away from it therefore also map into `H`. + +This is the concrete power-congruence core used in the existence proof for +global class fields. +-/ + +@[expose] public section + +open scoped NumberField +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain +open GlobalClassFieldTheory.ClassFieldAxiom + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- Let `n = [C_K : H]`. If `S` contains the support of the canonical +congruence subgroup lying in a closed finite-index subgroup `H`, then the +idele-class power-congruence subgroup `C_K(n, S, ∅)` is contained in `H`. + +The proof assembles the finitely many prescribed local `n`-th roots into +one idele. Dividing by its `n`-th power leaves an idele in the canonical +ray congruence subgroup. -/ +theorem ideleClassPowerLocalUnitSubgroup_le_closedFiniteIndexSubgroup + (H : Subgroup (IdeleClassGroup K)) + (hclosed : IsClosed (H : Set (IdeleClassGroup K))) + [H.FiniteIndex] + (S : Finset (HeightOneSpectrum (𝓞 K))) + (hS : + (RayClass.modulusInsideClosedFiniteIndex H hclosed).finitePart.support ⊆ S) : + ideleClassPowerLocalUnitSubgroup + (K := K) + ⟨H.index, + Nat.pos_of_ne_zero Subgroup.FiniteIndex.index_ne_zero⟩ + S ∅ ≤ + H := by + let n : ℕ+ := + ⟨H.index, + Nat.pos_of_ne_zero Subgroup.FiniteIndex.index_ne_zero⟩ + let m : RayClass.Modulus K := + RayClass.modulusInsideClosedFiniteIndex H hclosed + let q : IdeleGroup K →* IdeleClassGroup K := + QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + rintro _ ⟨a, ha, rfl⟩ + have ha' := + (mem_idelePowerLocalUnitSubgroup_iff + (K := K) n S ∅ a).1 ha + choose bInf hbInf using ha'.1 + choose bS hbS using + fun v : ↥S => ha'.2.1 v.1 v.2 + let b : IdeleGroup K := + (ContinuousMulEquiv.piUnits.symm bInf, + IdeleGroup.finiteIdeleOfFinset S bS) + let u : IdeleGroup K := + a * (b ^ (n : ℕ))⁻¹ + have hbInfComponent (w : InfinitePlace K) : + IdeleGroup.infiniteComponent w b = bInf w := by + change + ContinuousMulEquiv.piUnits + (ContinuousMulEquiv.piUnits.symm bInf) w = + bInf w + exact congrFun + (ContinuousMulEquiv.piUnits.apply_symm_apply bInf) w + have hbInfPow (w : InfinitePlace K) : + (bInf w) ^ (n : ℕ) = + IdeleGroup.infiniteComponent w a := by + exact hbInf w + have hbFiniteComponent + (v : ↥S) : + IdeleGroup.finiteComponent v.1 b = bS v := by + exact IdeleGroup.finiteIdeleOfFinset_apply_mem S bS v + have hbFinitePow + (v : ↥S) : + (bS v) ^ (n : ℕ) = + IdeleGroup.finiteComponent v.1 a := by + exact hbS v + have huInfinite : + u.1 ∈ m.infiniteCongruenceSubgroup := by + rw [RayClass.Modulus.mem_infiniteCongruenceSubgroup_iff_local] + intro w + have huComponent : + IdeleGroup.infiniteComponent w u = 1 := by + calc + IdeleGroup.infiniteComponent w u = + IdeleGroup.infiniteComponent w a * + (IdeleGroup.infiniteComponent w b ^ + (n : ℕ))⁻¹ := by + simp only [u, map_mul, map_inv, map_pow] + _ = 1 := by + rw [hbInfComponent, hbInfPow] + simp + change IdeleGroup.infiniteComponent w u ∈ + m.localInfiniteCongruenceSubgroup w + rw [huComponent] + exact Subgroup.one_mem _ + have huFinite : + u.2 ∈ RayClass.finiteCongruenceSubgroup m.finitePart := by + rw [RayClass.mem_finiteCongruenceSubgroup_iff] + intro v + by_cases hv : v ∈ S + · let vS : ↥S := ⟨v, hv⟩ + have huComponent : + IdeleGroup.finiteComponent v u = 1 := by + calc + IdeleGroup.finiteComponent v u = + IdeleGroup.finiteComponent v a * + (IdeleGroup.finiteComponent v b ^ + (n : ℕ))⁻¹ := by + simp only [u, map_mul, map_inv, map_pow] + _ = 1 := by + change + IdeleGroup.finiteComponent vS.1 a * + (IdeleGroup.finiteComponent vS.1 b ^ + (n : ℕ))⁻¹ = 1 + rw [hbFiniteComponent vS, hbFinitePow vS] + simp + change IdeleGroup.finiteComponent v u ∈ + RayClass.localHigherUnitGroup v (m.finitePart v) + rw [huComponent] + exact Subgroup.one_mem _ + · have hmv : m.finitePart v = 0 := by + by_contra hmv + exact hv (hS (Finsupp.mem_support_iff.mpr hmv)) + have hbComponent : + IdeleGroup.finiteComponent v b = 1 := by + exact + IdeleGroup.finiteIdeleOfFinset_apply_notMem + S bS v hv + have huComponent : + IdeleGroup.finiteComponent v u = + IdeleGroup.finiteComponent v a := by + simp only [u, map_mul, map_inv, map_pow, + hbComponent, one_pow, inv_one, mul_one] + change IdeleGroup.finiteComponent v u ∈ + RayClass.localHigherUnitGroup v (m.finitePart v) + rw [hmv, RayClass.localHigherUnitGroup_zero, + huComponent] + exact ha'.2.2 v (by simpa only [Finset.union_empty] using hv) + have huCongruence : + u ∈ RayClass.Modulus.ideleCongruenceSubgroup m := + ⟨huInfinite, huFinite⟩ + have hquCongruence : + q u ∈ RayClass.Modulus.congruenceSubgroup m := by + exact + ⟨u, Subgroup.mem_sup_left huCongruence, rfl⟩ + have hquH : q u ∈ H := by + apply + RayClass.modulusInsideClosedFiniteIndex_spec + H hclosed + simpa only [m] using hquCongruence + have hbPowH : q (b ^ (n : ℕ)) ∈ H := by + change q (b ^ H.index) ∈ H + rw [map_pow] + let : IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun x y => mul_comm x y⟩⟩ + let : H.Normal := H.normal_of_isMulCommutative + exact H.pow_index_mem (q b) + have haDecomposition : + a = b ^ (n : ℕ) * u := by + dsimp only [u] + calc + a = a * + ((b ^ (n : ℕ)) * (b ^ (n : ℕ))⁻¹) := by + simp + _ = b ^ (n : ℕ) * + (a * (b ^ (n : ℕ))⁻¹) := by + ac_rfl + rw [haDecomposition, map_mul] + exact H.mul_mem hbPowH hquH + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealArtinKernelComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealArtinKernelComparison.lean new file mode 100644 index 0000000000..801f86a879 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealArtinKernelComparison.lean @@ -0,0 +1,207 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinMap +/-! +# Comparing the public and ideal-theoretic Artin kernels + +The public finite ray-class Artin map is normalized on all primes away from +its modulus. Frobenius rigidity identifies its kernel with the genuine +idèle-class norm kernel. We then compare that kernel with the established +ideal-theoretic Artin map on the same ray modulus. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory.GlobalClassFieldComparison + +open scoped Classical in +private theorem finiteAbelianReciprocity_primeArtin_eq_original + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + (D : FiniteAbelianReciprocityData K L) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ D.modulus.finitePart.support) : + D.artin (rayClassOfFinitePrime D.modulus v hv) = + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v := by + let w₀ := _root_.chosenFinitePlaceExtension (L := L) v + let w := _root_.finitePlaceExtensionCentre (K := K) (L := L) v w₀ + have hw : w.asIdeal.LiesOver v.asIdeal := + _root_.finitePlaceExtensionCentre_liesOver + (K := K) (L := L) v w₀ + have hunram : Algebra.IsUnramifiedAt (𝓞 K) w.asIdeal := + (D.unramifiedOutsideModulus.1 v hv) w.asIdeal inferInstance hw + calc + D.artin (rayClassOfFinitePrime D.modulus v hv) = + arithmeticFrobeniusAt (K := K) w := + D.artin_frobenius v hv w hw + _ = GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v := + (arithmeticPrimeArtin_eq_arithmeticFrobeniusAt + (K := K) (L := L) v w hw hunram).symm + +open scoped Classical in +private theorem finiteAbelianReciprocity_originalPrimeNormalization + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + (D : FiniteAbelianReciprocityData K L) : + let m := rayClassModulusToOriginal K D.modulus + let e := rayClassGroupEquivOriginalIdele K D.modulus + let a : RayClass.RayClassGroup m →* (L ≃ₐ[K] L) := + D.artin.comp e.symm.toMonoidHom + ∀ (v : HeightOneSpectrum (𝓞 K)) + (_hv : v ∉ m.finitePart.support), + a (QuotientGroup.mk' m.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v))) = + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v := by + intro m e a v hv + have hvm : v ∉ D.modulus.finitePart.support := hv + change D.artin (e.symm (QuotientGroup.mk' m.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v)))) = _ + rw [← rayClassGroupEquivOriginalIdele_prime K D.modulus v hvm] + simpa only [e, MulEquiv.symm_apply_apply] using + finiteAbelianReciprocity_primeArtin_eq_original K L D v hvm + +open scoped Classical in +/-- The modulus of public finite abelian reciprocity data defines the +extension's genuine idèle-class norm subgroup. This follows from prime +normalization, rather than being an additional field of the data. -/ +theorem finiteAbelianReciprocity_modulus_isDefining + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + (D : FiniteAbelianReciprocityData K L) : + (rayClassModulusToOriginal K D.modulus).congruenceSubgroup ≤ + (_root_.ideleClassNorm K L).range := by + let m := rayClassModulusToOriginal K D.modulus + let e := rayClassGroupEquivOriginalIdele K D.modulus + let a : RayClass.RayClassGroup m →* (L ≃ₐ[K] L) := + D.artin.comp e.symm.toMonoidHom + have hprime := finiteAbelianReciprocity_originalPrimeNormalization K L D + have hnorm := + GlobalClassFieldTheory.GlobalClassFields.rayModulus_normSubgroup_eq_artinKer_preimage + m a hprime + intro x hx + rw [hnorm] + change a (QuotientGroup.mk' m.congruenceSubgroup x) = 1 + have hmk : QuotientGroup.mk' m.congruenceSubgroup x = 1 := by + rw [QuotientGroup.mk'_apply, QuotientGroup.eq_one_iff] + exact hx + rw [hmk, map_one] + +open scoped Classical in +/-- On a fractional ideal prime to the modulus, the public Artin map is +trivial exactly when the original ideal Artin map is trivial. -/ +theorem publicArtinKer_iff_idealArtinKernel + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + (D : FiniteAbelianReciprocityData K L) + (I : rayClassPrimeToIdeals D.modulus) : + (QuotientGroup.mk' (rayPrincipalIdealSubgroupInPrimeTo D.modulus) I) ∈ + D.artin.ker ↔ + I ∈ GlobalClassFieldTheory.IdealClassFieldTheory.idealArtinKernel + (rayClassModulusToOriginal K D.modulus) + (_root_.ideleClassNorm K L).range + (finiteAbelianReciprocity_modulus_isDefining K L D) := by + let : IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun x y => mul_comm x y⟩⟩ + let : ((_root_.ideleClassNorm K L).range).Normal := + Subgroup.normal_of_isMulCommutative _ + let m := rayClassModulusToOriginal K D.modulus + let G := RayClass.primeToModulusIdeals m + let hComm : IsMulCommutative G := + IsMulCommutative.of_comm (fun x y => Subtype.ext (mul_comm x.1 y.1)) + let M : Subgroup G := rayPrincipalIdealSubgroupInPrimeTo D.modulus + let N : Subgroup G := RayClass.principalRayIdealSubgroup m + let hMN : M = N := rayPrincipalIdealSubgroup_eq K D.modulus + let hM : M.Normal := + @Subgroup.normal_of_isMulCommutative G _ hComm M + let hN : N.Normal := + @Subgroup.normal_of_isMulCommutative G _ hComm N + let e := rayClassGroupEquivOriginalIdele K D.modulus + let a : RayClass.RayClassGroup m →* (L ≃ₐ[K] L) := + D.artin.comp e.symm.toMonoidHom + have hprime := finiteAbelianReciprocity_originalPrimeNormalization K L D + have hnorm := + GlobalClassFieldTheory.GlobalClassFields.rayModulus_normSubgroup_eq_artinKer_preimage + m a hprime + let q : RayClass.RayClassGroup m := + (RayClass.rayClassGroupEquivIdealRayClassGroup m).symm + (QuotientGroup.mk' + (RayClass.principalRayIdealSubgroup m) I) + have he : e (QuotientGroup.mk' + (rayPrincipalIdealSubgroupInPrimeTo D.modulus) I) = q := by + change (rayClassGroupEquivOriginal K D.modulus).trans + (RayClass.rayClassGroupEquivIdealRayClassGroup m).symm + (QuotientGroup.mk' + (rayPrincipalIdealSubgroupInPrimeTo D.modulus) I) = q + rw [MulEquiv.trans_apply] + change (RayClass.rayClassGroupEquivIdealRayClassGroup m).symm + ((rayClassGroupEquivOriginal K D.modulus) + (QuotientGroup.mk' + (rayPrincipalIdealSubgroupInPrimeTo D.modulus) I)) = q + have hideal : (rayClassGroupEquivOriginal K D.modulus) + (QuotientGroup.mk' + (rayPrincipalIdealSubgroupInPrimeTo D.modulus) I) = + QuotientGroup.mk' + (RayClass.principalRayIdealSubgroup m) I := by + change (@QuotientGroup.quotientMulEquivOfEq G _ M N + hM hN hMN) (QuotientGroup.mk' M I) = + QuotientGroup.mk' N I + rfl + rw [hideal] + obtain ⟨x, hx⟩ := QuotientGroup.mk'_surjective m.congruenceSubgroup q + have hArtin : D.artin (QuotientGroup.mk' + (rayPrincipalIdealSubgroupInPrimeTo D.modulus) I) = 1 ↔ + x ∈ (_root_.ideleClassNorm K L).range := by + rw [hnorm] + change _ ↔ a (QuotientGroup.mk' m.congruenceSubgroup x) = 1 + rw [hx, ← he] + change _ ↔ D.artin + (e.symm (e (QuotientGroup.mk' + (rayPrincipalIdealSubgroupInPrimeTo D.modulus) I))) = 1 + rw [e.symm_apply_apply] + have hIdealArtin : + GlobalClassFieldTheory.IdealClassFieldTheory.idealArtinMap m + (_root_.ideleClassNorm K L).range + (finiteAbelianReciprocity_modulus_isDefining K L D) I = + QuotientGroup.mk' (_root_.ideleClassNorm K L).range x := by + change GlobalClassFieldTheory.IdealClassFieldTheory.rayClassToNormQuotient + m (_root_.ideleClassNorm K L).range + (finiteAbelianReciprocity_modulus_isDefining K L D) q = _ + rw [← hx] + rfl + change D.artin (QuotientGroup.mk' + (rayPrincipalIdealSubgroupInPrimeTo D.modulus) I) = 1 ↔ + GlobalClassFieldTheory.IdealClassFieldTheory.idealArtinMap m + (_root_.ideleClassNorm K L).range + (finiteAbelianReciprocity_modulus_isDefining K L D) I = 1 + rw [hIdealArtin] + exact hArtin.trans (QuotientGroup.eq_one_iff x).symm + +end ClassFieldTheory.GlobalClassFieldComparison diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormArtinKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormArtinKernel.lean new file mode 100644 index 0000000000..367b2074ef --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormArtinKernel.lean @@ -0,0 +1,217 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.IdealNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +/-! +# Ideal norms lie in the normalized Artin kernel + +The forward inclusion of the ideal-theoretic norm-kernel formula follows +prime by prime. The reverse inclusion needs a separate approximation +argument and is not asserted here. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory.GlobalClassFieldComparison + +open scoped Classical in +private theorem publicIdealNormDomain_eq_source + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + (m : RayClassModulus K) : + rayClassPrimeToIdealNormDomain K L m = + RayClass.primeToModulusIdeals + (RayClass.idealNormLiftedModulus (K := K) (L := L) + (rayClassModulusToOriginal K m)) := by + apply Subgroup.ext + intro I + change (∀ W, fractionalIdealNormPrimeBelow K L W ∈ + m.finitePart.support → + FractionalIdeal.count L W + (I : FractionalIdeal (nonZeroDivisors (𝓞 L)) L) = 0) ↔ + (∀ W, W ∈ (RayClass.idealNormLiftedModulus + (K := K) (L := L) (rayClassModulusToOriginal K m)).finitePart.support → + FractionalIdeal.count L W + (I : FractionalIdeal (nonZeroDivisors (𝓞 L)) L) = 0) + have hbelow (W : HeightOneSpectrum (𝓞 L)) : + fractionalIdealNormPrimeBelow K L W = + _root_.finitePlaceBelow (K := K) W := by + ext + rfl + constructor + · intro h W hW + apply h W + rw [hbelow] + exact (RayClass.mem_idealNormLiftedModulus_support_iff + (K := K) (L := L) (rayClassModulusToOriginal K m) W).mp hW + · intro h W hW + apply h W + rw [RayClass.mem_idealNormLiftedModulus_support_iff, ← hbelow] + exact hW + +open scoped Classical in +private theorem fractionalIdealNorm_prime + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + (W : HeightOneSpectrum (𝓞 L)) : + fractionalIdealNorm K L (finitePrimeFractionalIdeal W) = + finitePrimeFractionalIdeal (fractionalIdealNormPrimeBelow K L W) ^ + (W.asIdeal.inertiaDeg (𝓞 K) : ℤ) := by + apply NumberFieldFractionalIdealGroup.ext_count + intro v + rw [fractionalIdealNorm_count] + have hcount : NumberFieldFractionalIdealGroup.countVector + (finitePrimeFractionalIdeal W) = Finsupp.single W 1 := by + ext V + rw [NumberFieldFractionalIdealGroup.countVector_apply] + change FractionalIdeal.count L V + (W.asIdeal : FractionalIdeal (nonZeroDivisors (𝓞 L)) L) = _ + classical + simp only [FractionalIdeal.count_maximal, Finsupp.single_apply] + rw [hcount] + change (Finsupp.single W (1 : ℤ)).sum + (fun U n => if fractionalIdealNormPrimeBelow K L U = v then + (U.asIdeal.inertiaDeg (𝓞 K) : ℤ) * n else 0) = + FractionalIdeal.count K v + ((finitePrimeFractionalIdeal (fractionalIdealNormPrimeBelow K L W) ^ + (W.asIdeal.inertiaDeg (𝓞 K) : ℤ) : + NumberFieldFractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) + rw [Finsupp.sum_single_index] + · rw [Units.val_zpow_eq_zpow_val, FractionalIdeal.count_zpow] + change (if fractionalIdealNormPrimeBelow K L W = v then + (W.asIdeal.inertiaDeg (𝓞 K) : ℤ) * 1 else 0) = + (W.asIdeal.inertiaDeg (𝓞 K) : ℤ) * + FractionalIdeal.count K v + ((fractionalIdealNormPrimeBelow K L W).asIdeal : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) + classical + rw [FractionalIdeal.count_maximal] + split_ifs with h + · simp only [mul_one] + · simp only [mul_zero] + · split_ifs <;> simp only [mul_zero] + +open scoped Classical in +/-- Every ideal norm prime to a modulus is killed by the Frobenius-normalized +Artin map. This is the forward half of the ideal-theoretic norm-kernel +formula, with no idèle norm substituted for an ideal norm. -/ +theorem idealNormImage_le_finiteAbelianReciprocityArtinKer + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + (D : FiniteAbelianReciprocityData K L) : + rayClassIdealNormImage K L D.modulus ≤ D.artin.ker := by + let mL := RayClass.idealNormLiftedModulus (K := K) (L := L) + (rayClassModulusToOriginal K D.modulus) + have hdomain := publicIdealNormDomain_eq_source K L D.modulus + let ι : RayClass.primeToModulusIdeals mL →* + rayClassPrimeToIdealNormDomain K L D.modulus := by + let h : RayClass.primeToModulusIdeals mL ≤ + rayClassPrimeToIdealNormDomain K L D.modulus := by + rw [hdomain] + exact Subgroup.inclusion h + have hι : Function.Surjective ι := by + intro I + refine ⟨⟨I, ?_⟩, ?_⟩ + · rw [← hdomain] + exact I.property + · exact Subtype.ext rfl + have hzero : D.artin.comp (rayClassIdealNorm K L D.modulus |>.comp ι) = + 1 := by + apply RayClass.primeToModulusIdeals_hom_ext mL + intro W hW + let v := fractionalIdealNormPrimeBelow K L W + have hv : v ∉ D.modulus.finitePart.support := by + intro hv + have hbelow : v = _root_.finitePlaceBelow (K := K) W := by + ext + rfl + apply hW + rw [RayClass.mem_idealNormLiftedModulus_support_iff, ← hbelow] + exact hv + have hw : W.asIdeal.LiesOver v.asIdeal := by + change W.asIdeal.LiesOver (W.asIdeal.under (𝓞 K)) + infer_instance + have hunram : Algebra.IsUnramifiedAt (𝓞 K) W.asIdeal := + (D.unramifiedOutsideModulus.1 v hv) W.asIdeal inferInstance hw + have horder := GlobalClassFieldComparison.orderOf_arithmeticFrobeniusAt_eq_inertiaDegree + v W hw hunram + change D.artin (rayClassIdealNorm K L D.modulus + (ι (RayClass.primeToModulusIdeal mL W hW))) = 1 + have hprime : (ι (RayClass.primeToModulusIdeal mL W hW) : + NumberFieldFractionalIdealGroup L) = finitePrimeFractionalIdeal W := rfl + change D.artin (QuotientGroup.mk' + (rayPrincipalIdealSubgroupInPrimeTo D.modulus) + (rayClassPrimeToIdealNorm K L D.modulus + (ι (RayClass.primeToModulusIdeal mL W hW)))) = 1 + have hnorm : + (rayClassPrimeToIdealNorm K L D.modulus + (ι (RayClass.primeToModulusIdeal mL W hW)) : + NumberFieldFractionalIdealGroup K) = + finitePrimeFractionalIdeal v ^ + (W.asIdeal.inertiaDeg (𝓞 K) : ℤ) := by + change fractionalIdealNorm K L + (ι (RayClass.primeToModulusIdeal mL W hW) : + NumberFieldFractionalIdealGroup L) = _ + rw [hprime] + exact fractionalIdealNorm_prime K L W + have hclass : QuotientGroup.mk' + (rayPrincipalIdealSubgroupInPrimeTo D.modulus) + (rayClassPrimeToIdealNorm K L D.modulus + (ι (RayClass.primeToModulusIdeal mL W hW))) = + rayClassOfFinitePrime D.modulus v hv ^ + (W.asIdeal.inertiaDeg (𝓞 K) : ℤ) := by + let p : rayClassPrimeToIdeals D.modulus := + ⟨finitePrimeFractionalIdeal v, by + intro w hw + exact FractionalIdeal.count_maximal_coprime K w + (fun h => hv (h ▸ hw))⟩ + have hp : QuotientGroup.mk' + (rayPrincipalIdealSubgroupInPrimeTo D.modulus) p = + rayClassOfFinitePrime D.modulus v hv := rfl + calc + _ = QuotientGroup.mk' + (rayPrincipalIdealSubgroupInPrimeTo D.modulus) + (p ^ (W.asIdeal.inertiaDeg (𝓞 K) : ℤ)) := by + congr 1 + apply Subtype.ext + exact hnorm + _ = (QuotientGroup.mk' + (rayPrincipalIdealSubgroupInPrimeTo D.modulus) p) ^ + (W.asIdeal.inertiaDeg (𝓞 K) : ℤ) := + map_zpow + (QuotientGroup.mk' + (rayPrincipalIdealSubgroupInPrimeTo D.modulus)) + p (W.asIdeal.inertiaDeg (𝓞 K) : ℤ) + _ = _ := by rw [hp] + rw [hclass, map_zpow, D.artin_frobenius v hv W hw] + rw [← horder] + simp only [zpow_natCast, pow_orderOf_eq_one] + intro x hx + obtain ⟨I, rfl⟩ := hx + obtain ⟨J, hJ⟩ := hι I + rw [← hJ] + change D.artin ((rayClassIdealNorm K L D.modulus |>.comp ι) J) = 1 + exact DFunLike.congr_fun hzero J + +end ClassFieldTheory.GlobalClassFieldComparison diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormQuotientComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormQuotientComparison.lean new file mode 100644 index 0000000000..db9fdd4c2e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormQuotientComparison.lean @@ -0,0 +1,118 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.IdealNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +/-! +# Comparing source and public ideal-norm subgroups + +The source ideal norm is defined before quotienting by principal ray ideals. +The public ideal-norm image is its image in the ideal ray class group. This +file records the exact comparison, including the principal-ray kernel. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory.GlobalClassFieldComparison + +open scoped Classical in +private theorem publicIdealNormDomain_eq_source' + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + (m : RayClassModulus K) : + rayClassPrimeToIdealNormDomain K L m = + RayClass.primeToModulusIdeals + (RayClass.idealNormLiftedModulus (K := K) (L := L) + (rayClassModulusToOriginal K m)) := by + apply Subgroup.ext + intro I + change (∀ W, fractionalIdealNormPrimeBelow K L W ∈ + m.finitePart.support → + FractionalIdeal.count L W + (I : FractionalIdeal (nonZeroDivisors (𝓞 L)) L) = 0) ↔ + (∀ W, W ∈ (RayClass.idealNormLiftedModulus + (K := K) (L := L) (rayClassModulusToOriginal K m)).finitePart.support → + FractionalIdeal.count L W + (I : FractionalIdeal (nonZeroDivisors (𝓞 L)) L) = 0) + have hbelow (W : HeightOneSpectrum (𝓞 L)) : + fractionalIdealNormPrimeBelow K L W = + _root_.finitePlaceBelow (K := K) W := by + ext + rfl + constructor + · intro h W hW + apply h W + rw [hbelow] + exact (RayClass.mem_idealNormLiftedModulus_support_iff + (K := K) (L := L) (rayClassModulusToOriginal K m) W).mp hW + · intro h W hW + apply h W + rw [RayClass.mem_idealNormLiftedModulus_support_iff, ← hbelow] + exact hW + +open scoped Classical in +/-- The preimage of the public ideal-norm image under the ray quotient is +exactly the original norm subgroup, including principal ray ideals. -/ +theorem publicIdealNormImage_comap_rayQuotient + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + (m : RayClassModulus K) : + (rayClassIdealNormImage K L m).comap + (QuotientGroup.mk' (rayPrincipalIdealSubgroupInPrimeTo m)) = + RayClass.idealNormSubgroup (K := K) (L := L) + (rayClassModulusToOriginal K m) := by + let m' := rayClassModulusToOriginal K m + let q : RayClass.primeToModulusIdeals m' →* RayClassGroup m := + QuotientGroup.mk' (rayPrincipalIdealSubgroupInPrimeTo m) + let N := (RayClass.primeToModulusIdealNorm (K := K) (L := L) m').range + have hdomain := publicIdealNormDomain_eq_source' K L m + have hnorm : rayClassIdealNormImage K L m = N.map q := by + apply Subgroup.ext + intro x + constructor + · rintro ⟨I, rfl⟩ + let J : RayClass.primeToModulusIdeals + (RayClass.idealNormLiftedModulus (K := K) (L := L) m') := + ⟨I, by rw [← hdomain]; exact I.property⟩ + refine ⟨RayClass.primeToModulusIdealNorm (K := K) (L := L) m' J, + ⟨J, rfl⟩, ?_⟩ + apply congrArg (QuotientGroup.mk' (rayPrincipalIdealSubgroupInPrimeTo m)) + apply Subtype.ext + change RayClass.fractionalIdealNorm (K := K) (L := L) (J : _) = + fractionalIdealNorm K L (I : _) + exact congrArg (fun f => f (I : _)) + (RayClass.fractionalIdealNorm_eq_public (K := K) (L := L)) + · rintro ⟨I, ⟨J, rfl⟩, rfl⟩ + let J' : rayClassPrimeToIdealNormDomain K L m := + ⟨J, by rw [hdomain]; exact J.property⟩ + refine ⟨J', ?_⟩ + apply congrArg (QuotientGroup.mk' (rayPrincipalIdealSubgroupInPrimeTo m)) + apply Subtype.ext + change fractionalIdealNorm K L (J' : _) = + RayClass.fractionalIdealNorm (K := K) (L := L) (J : _) + exact (congrArg (fun f => f (J : _)) + (RayClass.fractionalIdealNorm_eq_public (K := K) (L := L))).symm + rw [hnorm] + change (N.map q).comap q = N ⊔ + RayClass.principalRayIdealSubgroup m' + rw [Subgroup.comap_map_eq] + rw [show q.ker = rayPrincipalIdealSubgroupInPrimeTo m by + exact QuotientGroup.ker_mk' (rayPrincipalIdealSubgroupInPrimeTo m)] + rw [rayPrincipalIdealSubgroup_eq] + +end ClassFieldTheory.GlobalClassFieldComparison diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicRayClassComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicRayClassComparison.lean new file mode 100644 index 0000000000..de365156e9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicRayClassComparison.lean @@ -0,0 +1,647 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticRayClassFieldReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FullConductorRayClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Narrow +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison +public import Mathlib.Data.Finsupp.Order +/-! +# Conductors and ray class fields implementation + +This module supplies the implementation proofs for the compact conductor and +ray-class-field statements in the parent `Theorems` directory. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory.GlobalClassFieldComparison + +universe u + +open scoped Classical in +/-- Interpret a public ray modulus in the existing idèle-theoretic ray-class +library, preserving both its finite exponents and selected real places. -/ +def rayClassModulusToOriginal + (K : Type u) [Field K] [NumberField K] + (m : RayClassModulus K) : RayClass.Modulus K where + finitePart := m.finitePart + infinitePart := m.infinitePart + +open scoped Classical in +/-- At a real place, positivity of a principal idele component is exactly +positivity of its field generator under the corresponding real embedding. -/ +private theorem principalIdele_mem_infinitePositiveSubgroup_iff + (K : Type u) [Field K] [NumberField K] (x : Kˣ) + (v : {v : InfinitePlace K // v.IsReal}) : + IdeleGroup.infiniteComponent v.1 (IdeleGroup.principalIdele K x) ∈ + RayClass.infinitePositiveSubgroup v.1 ↔ + 0 < v.1.embedding_of_isReal v.2 (x : K) := by + rw [RayClass.mem_infinitePositiveSubgroup_iff] + have hcoe (hv : v.1.IsReal) : + NumberField.InfinitePlace.Completion.extensionEmbeddingOfIsReal hv + ((IdeleGroup.infiniteComponent v.1 + (IdeleGroup.principalIdele K x) : v.1.Completionˣ) : + v.1.Completion) = + v.1.embedding_of_isReal hv (x : K) := by + rw [IdeleGroup.infiniteComponent_principalIdele, + NumberField.InfinitePlace.Completion.extensionEmbeddingOfIsReal_coe] + rfl + constructor + · intro h + simpa only [hcoe] using h v.2 + · intro h hv + simpa only [hcoe] using h + +open scoped Classical in +/-- A principal idèle satisfies the existing prime-to-modulus condition +exactly when its generator satisfies the public ray congruence. -/ +theorem principalIdele_mem_primeTo_iff_isRayCongruent + (K : Type u) [Field K] [NumberField K] + (m : RayClassModulus K) (x : Kˣ) : + IdeleGroup.principalIdele K x ∈ + RayClass.idelePrimeToModulusSubgroup + (rayClassModulusToOriginal K m) ↔ + IsRayCongruent m x := by + have hinfinite : + (IdeleGroup.principalIdele K x).1 ∈ + (rayClassModulusToOriginal K m).infiniteCongruenceSubgroup ↔ + ∀ v : RayClassRealPlace K, v ∈ m.infinitePart → + 0 < v.1.embedding_of_isReal v.2 (x : K) := by + rw [RayClass.Modulus.mem_infiniteCongruenceSubgroup_iff] + exact ⟨fun h v hv => + (principalIdele_mem_infinitePositiveSubgroup_iff K x v).mp (h v hv), + fun h v hv => + (principalIdele_mem_infinitePositiveSubgroup_iff K x v).mpr (h v hv)⟩ + have hfinite : + (IdeleGroup.principalIdele K x).2 ∈ + RayClass.finitePrimeToModulusSubgroup + (rayClassModulusToOriginal K m) ↔ + ∀ v, v ∈ m.finitePart.support → + finitePlaceUnitEmbedding v x ∈ + rayLocalHigherUnitGroup v (m.finitePart v) := by + change (∀ v, v ∈ m.finitePart.support → + (IdeleGroup.principalIdele K x).2 v ∈ + RayClass.localHigherUnitGroup v (m.finitePart v)) ↔ _ + constructor + · intro h v hv + have h' := h v hv + change finitePlaceUnitEmbedding v x ∈ + rayLocalHigherUnitGroup v (m.finitePart v) at h' + exact h' + · intro h v hv + have h' := h v hv + change (IdeleGroup.principalIdele K x).2 v ∈ + RayClass.localHigherUnitGroup v (m.finitePart v) at h' + exact h' + change ((IdeleGroup.principalIdele K x).1 ∈ + (rayClassModulusToOriginal K m).infiniteCongruenceSubgroup ∧ + (IdeleGroup.principalIdele K x).2 ∈ + RayClass.finitePrimeToModulusSubgroup + (rayClassModulusToOriginal K m)) ↔ _ + exact ⟨fun h => ⟨hfinite.mp h.2, hinfinite.mp h.1⟩, + fun h => ⟨hinfinite.mpr h.2, hfinite.mpr h.1⟩⟩ + +open scoped Classical in +/-- At narrow modulus zero, the older idele-theoretic prime-to condition on +a principal idele agrees with the public generator congruence. -/ +theorem principalIdele_mem_narrowPrimeTo_iff_isRayCongruent + (K : Type u) [Field K] [NumberField K] (x : Kˣ) : + IdeleGroup.principalIdele K x ∈ + RayClass.idelePrimeToModulusSubgroup + (RayClass.Modulus.narrowOfFinite (0 : RayClass.FiniteModulus K)) ↔ + IsRayCongruent (narrowRayClassModulus K) x := by + change IdeleGroup.principalIdele K x ∈ + RayClass.idelePrimeToModulusSubgroup + (rayClassModulusToOriginal K (narrowRayClassModulus K)) ↔ + IsRayCongruent (narrowRayClassModulus K) x + exact principalIdele_mem_primeTo_iff_isRayCongruent K + (narrowRayClassModulus K) x + +open scoped Classical in +/-- The public ray-principal subgroup equals the existing ideal-theoretic +ray-principal subgroup for every finite and infinite modulus. -/ +theorem rayPrincipalIdealSubgroup_eq + (K : Type u) [Field K] [NumberField K] + (m : RayClassModulus K) : + rayPrincipalIdealSubgroupInPrimeTo m = + RayClass.principalRayIdealSubgroup + (rayClassModulusToOriginal K m) := by + classical + let m' := rayClassModulusToOriginal K m + let P := rayClassPrimeToIdeals m + let T : Subgroup (NumberFieldFractionalIdealGroup K) := + Subgroup.map P.subtype (RayClass.principalRayIdealSubgroup m') + have hCarrier : + {I : NumberFieldFractionalIdealGroup K | + ∃ x : Kˣ, + IsRayCongruent m x ∧ + toPrincipalIdeal (𝓞 K) K x = I} = (T : Set _) := by + ext I + constructor + · rintro ⟨x, hx, hIx⟩ + have hi : IdeleGroup.principalIdele K x ∈ + RayClass.idelePrimeToModulusSubgroup m' := + (principalIdele_mem_primeTo_iff_isRayCongruent K m x).2 hx + have hI : I ∈ P := by + change I ∈ RayClass.primeToModulusIdeals m' + rw [← hIx, ← IdeleGroup.fractionalIdeal_principalIdele] + exact RayClass.fractionalIdeal_mem_primeToModulusIdeals + m' (IdeleGroup.principalIdele K x) hi + let J : P := ⟨I, hI⟩ + have hJ : J ∈ RayClass.principalRayIdealSubgroup m' := + (RayClass.mem_principalRayIdealSubgroup_iff m' J).2 + ⟨x, hi, hIx⟩ + exact ⟨J, hJ, rfl⟩ + · rintro ⟨J, hJ, hIJ⟩ + obtain ⟨x, hx, hEq⟩ := + (RayClass.mem_principalRayIdealSubgroup_iff m' J).1 hJ + exact ⟨x, + (principalIdele_mem_primeTo_iff_isRayCongruent K m x).1 hx, + hEq.trans hIJ⟩ + have hUnrestricted : rayPrincipalIdealSubgroup m = T := by + unfold rayPrincipalIdealSubgroup + rw [hCarrier, Subgroup.closure_eq] + apply Subgroup.ext + intro I + change (I : NumberFieldFractionalIdealGroup K) ∈ + rayPrincipalIdealSubgroup m ↔ + I ∈ RayClass.principalRayIdealSubgroup m' + rw [hUnrestricted] + constructor + · rintro ⟨J, hJ, hIJ⟩ + have hJI : J = I := Subtype.ext hIJ + exact hJI ▸ hJ + · intro hI + exact ⟨I, hI, rfl⟩ + +open scoped Classical in +/-- The zero-finite-part narrow case of the general principal-ideal +comparison. -/ +theorem narrowRayPrincipalIdealSubgroup_eq + (K : Type u) [Field K] [NumberField K] : + rayPrincipalIdealSubgroupInPrimeTo (narrowRayClassModulus K) = + RayClass.principalRayIdealSubgroup + (RayClass.Modulus.narrowOfFinite (0 : RayClass.FiniteModulus K)) := by + change rayPrincipalIdealSubgroupInPrimeTo (narrowRayClassModulus K) = + RayClass.principalRayIdealSubgroup + (rayClassModulusToOriginal K (narrowRayClassModulus K)) + exact rayPrincipalIdealSubgroup_eq K (narrowRayClassModulus K) + +open scoped Classical in +/-- The public ideal-theoretic ray class group is the existing ideal ray +class group for the same modulus. -/ +noncomputable def rayClassGroupEquivOriginal + (K : Type u) [Field K] [NumberField K] + (m : RayClassModulus K) : + RayClassGroup m ≃* + RayClass.IdealRayClassGroup (rayClassModulusToOriginal K m) := by + let G := RayClass.primeToModulusIdeals (rayClassModulusToOriginal K m) + let M : Subgroup G := rayPrincipalIdealSubgroupInPrimeTo m + let N : Subgroup G := + RayClass.principalRayIdealSubgroup (rayClassModulusToOriginal K m) + have hMN : M = N := rayPrincipalIdealSubgroup_eq K m + let hComm : IsMulCommutative G := + IsMulCommutative.of_comm (fun a b => Subtype.ext (mul_comm a.1 b.1)) + have hM : M.Normal := @Subgroup.normal_of_isMulCommutative G _ hComm M + have hN : N.Normal := @Subgroup.normal_of_isMulCommutative G _ hComm N + exact @QuotientGroup.quotientMulEquivOfEq G _ M N hM hN hMN + +open scoped Classical in +/-- The comparison preserves the class of each prime away from the +modulus. -/ +theorem rayClassGroupEquivOriginal_prime + (K : Type u) [Field K] [NumberField K] + (m : RayClassModulus K) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : + rayClassGroupEquivOriginal K m (rayClassOfFinitePrime m v hv) = + QuotientGroup.mk' + (RayClass.principalRayIdealSubgroup (rayClassModulusToOriginal K m)) + (RayClass.primeToModulusIdeal + (rayClassModulusToOriginal K m) v hv) := by + let G := RayClass.primeToModulusIdeals (rayClassModulusToOriginal K m) + let M : Subgroup G := rayPrincipalIdealSubgroupInPrimeTo m + let N : Subgroup G := + RayClass.principalRayIdealSubgroup (rayClassModulusToOriginal K m) + have hMN : M = N := rayPrincipalIdealSubgroup_eq K m + let hComm : IsMulCommutative G := + IsMulCommutative.of_comm (fun a b => Subtype.ext (mul_comm a.1 b.1)) + have hM : M.Normal := @Subgroup.normal_of_isMulCommutative G _ hComm M + have hN : N.Normal := @Subgroup.normal_of_isMulCommutative G _ hComm N + change (@QuotientGroup.quotientMulEquivOfEq G _ M N hM hN hMN) + (QuotientGroup.mk' M + (⟨finitePrimeFractionalIdeal v, by + intro w hw + exact FractionalIdeal.count_maximal_coprime K w + (fun h => (h ▸ hv) hw)⟩ : G)) = + QuotientGroup.mk' N + (RayClass.primeToModulusIdeal + (rayClassModulusToOriginal K m) v hv) + rfl + +open scoped Classical in +/-- Compare the public ideal ray class group directly with the original +idèle-class ray class group. This is the composite of the ideal comparison +above and the original idelic-to-ideal equivalence. -/ +noncomputable def rayClassGroupEquivOriginalIdele + (K : Type u) [Field K] [NumberField K] + (m : RayClassModulus K) : + RayClassGroup m ≃* + RayClass.RayClassGroup (rayClassModulusToOriginal K m) := + (rayClassGroupEquivOriginal K m).trans + (RayClass.rayClassGroupEquivIdealRayClassGroup + (rayClassModulusToOriginal K m)).symm + +open scoped Classical in +open GlobalClassFieldTheory.GlobalClassFields renaming + finitePrimeIdele_mem_idelePrimeToModulusSubgroup → + finitePrimeIdele_mem_idelePrimeToModulusSubgroup in +/-- A public prime ray class corresponds to the original normalized prime +idèle class, with the same finite and infinite modulus. -/ +theorem rayClassGroupEquivOriginalIdele_prime + (K : Type u) [Field K] [NumberField K] + (m : RayClassModulus K) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : + rayClassGroupEquivOriginalIdele K m (rayClassOfFinitePrime m v hv) = + QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup (rayClassModulusToOriginal K m)) + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v)) := by + let m' := rayClassModulusToOriginal K m + have hv' : v ∉ m'.finitePart.support := hv + let a : RayClass.idelePrimeToModulusSubgroup m' := + ⟨IdeleGroup.finitePrimeIdele v, + finitePrimeIdele_mem_idelePrimeToModulusSubgroup + m' v hv'⟩ + let e := RayClass.rayClassGroupEquivIdealRayClassGroup m' + apply e.injective + calc + e (rayClassGroupEquivOriginalIdele K m (rayClassOfFinitePrime m v hv)) = + rayClassGroupEquivOriginal K m (rayClassOfFinitePrime m v hv) := by + change e (e.symm (rayClassGroupEquivOriginal K m + (rayClassOfFinitePrime m v hv))) = _ + exact e.apply_symm_apply _ + _ = QuotientGroup.mk' + (RayClass.principalRayIdealSubgroup m') + (RayClass.primeToModulusIdeal m' v hv) := + rayClassGroupEquivOriginal_prime K m v hv + _ = RayClass.idealRayProjection m' a := by + change QuotientGroup.mk' + (RayClass.principalRayIdealSubgroup m') + (RayClass.primeToModulusIdeal m' v hv') = + RayClass.idealRayProjection m' + ⟨IdeleGroup.finitePrimeIdele v, + finitePrimeIdele_mem_idelePrimeToModulusSubgroup + m' v hv'⟩ + exact (GlobalClassFieldTheory.GlobalClassFields.idealRayProjection_finitePrimeIdele + m' v hv').symm + _ = e (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup m') + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) (a : IdeleGroup K))) := by + exact + (GlobalClassFieldTheory.GlobalClassFields.rayClassGroupEquivIdealRayClassGroup_mk_primeTo + m' a).symm + +open scoped Classical in +/-- The public ideal-theoretic narrow ray class group agrees with the +existing narrow class group used by global class field theory. -/ +noncomputable def narrowRayClassGroupEquivNarrowClassGroup + (K : Type) [Field K] [NumberField K] : + RayClassGroup (narrowRayClassModulus K) ≃* + RayClass.NarrowClassGroup K := by + let m : RayClass.Modulus K := RayClass.Modulus.narrowOfFinite 0 + let e₀ : RayClassGroup (narrowRayClassModulus K) ≃* + RayClass.IdealRayClassGroup m := by + exact rayClassGroupEquivOriginal K (narrowRayClassModulus K) + exact e₀.trans + ((RayClass.rayClassGroupEquivIdealRayClassGroup m).symm.trans + (RayClass.rayClassGroupNarrowZeroEquivNarrowClassGroup (K := K))) + +open scoped Classical in +/-- The norm subgroup of the selected ray class field is the ray +congruence subgroup. -/ +theorem rayClassField_normSubgroup + (K : Type) [Field K] [NumberField K] + (m : RayClass.Modulus K) : + (_root_.ideleClassNorm K + (GlobalClassFieldTheory.GlobalClassFields.rayClassField K m)).range = + RayClass.Modulus.congruenceSubgroup m := + GlobalClassFieldTheory.GlobalClassFields.rayClassField_ideleClassNorm_range_over_original m + +open scoped Classical in +open GlobalClassFieldTheory.GlobalClassFields renaming + ideleClassNorm_narrowFiniteConductor_support_eq_ramifiedBaseFinitePlaces → + ideleClassNorm_conductor_support_eq_ramifiedPlaces in +open GlobalClassFieldTheory.GlobalClassFields renaming + ideleClassNormFullConductor_infinitePart_eq_realRamificationLocus → + ideleClassNormFullConductor_infinitePart_eq_realRamificationLocus in +/-- Any finite abelian extension whose norm group contains the ray +congruence subgroup is unramified outside that modulus. -/ +theorem unramifiedOutsideModulus_of_definingModulus + (K E : Type) [Field K] [NumberField K] + [Field E] [NumberField E] [Algebra K E] + [FiniteDimensional K E] [IsAbelianGalois K E] + (m : RayClassModulus K) + (hm : RayClass.Modulus.congruenceSubgroup + (rayClassModulusToOriginal K m) ≤ + (_root_.ideleClassNorm K E).range) : + IsUnramifiedOutsideModulus K E m := by + classical + let m' := rayClassModulusToOriginal K m + let H := + GlobalClassFieldTheory.GlobalClassFields.ideleClassNormConductorialSubgroup + (K := K) (L := E) + have hDefining : GlobalClassFieldTheory.GlobalClassFields.IsDefiningModulus H.1 m' := by + change m'.congruenceSubgroup ≤ (_root_.ideleClassNorm K E).range + exact hm + have hfinite := H.narrowFiniteConductor_le hDefining + have hinfinite := H.fullConductorInfinitePart_subset_of_isDefiningModulus hDefining + have hfiniteSupport := + ideleClassNorm_conductor_support_eq_ramifiedPlaces + (K := K) (L := E) + have hinfiniteSupport := + ideleClassNormFullConductor_infinitePart_eq_realRamificationLocus + (K := K) (L := E) + constructor + · intro v hv Q hQ hlie + by_contra hram + have hQne : Q ≠ ⊥ := by + intro hbot + have hunder := hlie.over + rw [hbot, Ideal.under_bot] at hunder + exact v.ne_bot hunder + let w : HeightOneSpectrum (𝓞 E) := ⟨Q, hQ, hQne⟩ + have hvram : v ∈ _root_.ramifiedBaseFinitePlaces (K := K) (L := E) := by + rw [_root_.mem_ramifiedBaseFinitePlaces_iff] + exact ⟨w, hlie, hram⟩ + have hvcond : v ∈ + (GlobalClassFieldTheory.GlobalClassFields.ideleClassNormNarrowFiniteConductor + (K := K) (L := E)).support := by + rw [hfiniteSupport] + exact hvram + apply hv + change v ∈ m'.finitePart.support + exact (Finsupp.support_mono hfinite) hvcond + · intro v hv hnot + by_contra hram + have hvcond : (⟨v, hv⟩ : RayClass.RealPlace K) ∈ + H.fullConductorInfinitePart := by + change (⟨v, hv⟩ : RayClass.RealPlace K) ∈ H.fullConductor.infinitePart + rw [hinfiniteSupport] + exact Finset.mem_filter.mpr ⟨Finset.mem_univ _, hram⟩ + exact hnot (hinfinite hvcond) + +open scoped Classical in +/-- The selected ray class field is unramified away from the finite and real +places selected by the public modulus. -/ +theorem rayClassField_unramifiedOutsideModulus + (K : Type) [Field K] [NumberField K] + (m : RayClassModulus K) : + IsUnramifiedOutsideModulus K + (GlobalClassFieldTheory.GlobalClassFields.rayClassField K + (rayClassModulusToOriginal K m)) m := by + let m' := rayClassModulusToOriginal K m + let E := GlobalClassFieldTheory.GlobalClassFields.rayClassField K m' + have hnorm : (_root_.ideleClassNorm K E).range = m'.congruenceSubgroup := + GlobalClassFieldTheory.GlobalClassFields.rayClassField_ideleClassNorm_range_over_original m' + exact unramifiedOutsideModulus_of_definingModulus K E m (le_of_eq hnorm.symm) + +open scoped Classical in +/-- Ray class reciprocity identifies the Galois group of the selected ray +class field with the corresponding ray class group. -/ +theorem rayClassField_reciprocity + (K : Type) [Field K] [NumberField K] + (m : RayClass.Modulus K) : + Nonempty + ((GlobalClassFieldTheory.GlobalClassFields.rayClassField K m ≃ₐ[K] + GlobalClassFieldTheory.GlobalClassFields.rayClassField K m) ≃* + RayClass.RayClassGroup m) := + ⟨GlobalClassFieldTheory.GlobalClassFields.rayClassFieldGaloisEquivRayClassGroup m⟩ + +open scoped Classical in +/-- The selected ray class field has degree equal to the order of its ray +class group. -/ +theorem rayClassField_degree + (K : Type) [Field K] [NumberField K] + (m : RayClass.Modulus K) : + Module.finrank K + (GlobalClassFieldTheory.GlobalClassFields.rayClassField K m) = + Nat.card (RayClass.RayClassGroup m) := + GlobalClassFieldTheory.GlobalClassFields.rayClassField_finrank_eq_rayClassGroup_card m + +open scoped Classical in +/-- The full conductor is the least modulus whose ray class field contains +the given finite abelian extension. -/ +theorem embedsInRayClassField_iff_conductor_le + {K : Type} [Field K] [NumberField K] + (L : Type) [Field L] [NumberField L] + [Algebra K L] [FiniteDimensional K L] + [IsAbelianGalois K L] + (m : RayClass.Modulus K) : + Nonempty + (L →ₐ[K] + GlobalClassFieldTheory.GlobalClassFields.rayClassField K m) ↔ + (GlobalClassFieldTheory.GlobalClassFields.ideleClassNormConductorialSubgroup + (K := K) (L := L)).fullConductor ≤ m := + GlobalClassFieldTheory.GlobalClassFields.nonempty_algHom_to_rayClassField_iff_fullConductor_le L m + +open scoped Classical in +/-- Build the public Frobenius-normalized realization attached to a ray-class subgroup. -/ +theorem rayClassSubgroup_existence + (K : Type) [Field K] [NumberField K] + (m : RayClassModulus K) (H : Subgroup (RayClassGroup m)) : + Nonempty (RayClassSubgroupRealization K m H) := by + let m' := rayClassModulusToOriginal K m + let e := rayClassGroupEquivOriginalIdele K m + let H' : Subgroup (RayClass.RayClassGroup m') := H.map e.toMonoidHom + let E := + GlobalClassFieldTheory.GlobalClassFields.rayClassSubgroupSubextension + (K := K) m' H' + let artin : RayClassGroup m →* (E ≃ₐ[K] E) := + (GlobalClassFieldTheory.GlobalClassFields.rayClassSubgroupArtin + (K := K) m' H').comp e.toMonoidHom + let hram : IsUnramifiedOutsideModulus K E m := + unramifiedOutsideModulus_of_definingModulus K E m + (GlobalClassFieldTheory.GlobalClassFields.rayClassSubgroupSubextension_norm_range + (K := K) m' H') + refine ⟨{ + extension := E + unramifiedOutsideModulus := hram + artin := artin + artin_surjective := ?_ + artin_ker := ?_ + artin_frobenius := ?_ + }⟩ + · exact + (GlobalClassFieldTheory.GlobalClassFields.rayClassSubgroupArtin_surjective + (K := K) m' H').comp e.surjective + · ext x + change e x ∈ + (GlobalClassFieldTheory.GlobalClassFields.rayClassSubgroupArtin + (K := K) m' H').ker ↔ x ∈ H + rw [GlobalClassFieldTheory.GlobalClassFields.rayClassSubgroupArtin_ker] + constructor + · rintro ⟨y, hy, hxy⟩ + exact (e.injective hxy) ▸ hy + · intro hx + exact ⟨x, hx, rfl⟩ + · intro v hv w hw + calc + artin (rayClassOfFinitePrime m v hv) = + GlobalClassFieldTheory.GlobalClassFields.rayClassSubgroupArtin + (K := K) m' H' + (QuotientGroup.mk' m'.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v))) := by + change GlobalClassFieldTheory.GlobalClassFields.rayClassSubgroupArtin + (K := K) m' H' + (e (rayClassOfFinitePrime m v hv)) = _ + rw [rayClassGroupEquivOriginalIdele_prime K m v hv] + _ = GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := E) v := + GlobalClassFieldTheory.GlobalClassFields.rayClassSubgroupArtin_finitePrimeIdele + (K := K) m' H' v + _ = arithmeticFrobeniusAt (K := K) w := + arithmeticPrimeArtin_eq_arithmeticFrobeniusAt + (K := K) (L := E) v w hw (hram.1 v hv w.asIdeal inferInstance hw) + +end ClassFieldTheory.GlobalClassFieldComparison + +namespace ClassFieldTheory + +open scoped Classical in +open GlobalClassFieldTheory.GlobalClassFields renaming + rayModulus_normSubgroup_eq_of_arithmeticPrimeArtinEquiv → + rayModulus_normSubgroup_eq_of_arithmeticPrimeArtinEquiv in +open GlobalClassFieldTheory.GlobalClassFields renaming + finiteAbelianExtension_nonempty_algHom_of_normRange_le → + finiteAbelianExtension_nonempty_algHom_of_normRange_le in +/-- The concrete full norm conductor is the least public modulus whose ray +class field contains the finite abelian extension. This implementation theorem +uses the original idelic full conductor in its statement. -/ +theorem normFullConductor_isAbelianConductor + (K : Type) [Field K] [NumberField K] + (L : Type) [Field L] [NumberField L] + [Algebra K L] [IsAbelianGalois K L] : + IsAbelianConductor K L + { finitePart := + (GlobalClassFieldTheory.GlobalClassFields.ideleClassNormConductorialSubgroup + (K := K) (L := L)).fullConductor.finitePart + infinitePart := + (GlobalClassFieldTheory.GlobalClassFields.ideleClassNormConductorialSubgroup + (K := K) (L := L)).fullConductor.infinitePart } := by + let H := GlobalClassFieldTheory.GlobalClassFields.ideleClassNormConductorialSubgroup + (K := K) (L := L) + let c : RayClassModulus K := + { finitePart := H.fullConductor.finitePart + infinitePart := H.fullConductor.infinitePart } + intro m + let m' := GlobalClassFieldComparison.rayClassModulusToOriginal K m + have hnorm (R : RayClassFieldRealization K m) : + (_root_.ideleClassNorm K R.extension).range = m'.congruenceSubgroup := by + let E := R.extension + let r : RayClassGroup m ≃* (E ≃ₐ[K] E) := R.artinEquiv + let e : RayClass.RayClassGroup m' ≃* (E ≃ₐ[K] E) := + (GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m).symm.trans r + apply + rayModulus_normSubgroup_eq_of_arithmeticPrimeArtinEquiv + m' e + intro v hv + have hvm : v ∉ m.finitePart.support := hv + let w₀ := _root_.chosenFinitePlaceExtension (L := E) v + let w := _root_.finitePlaceExtensionCentre (K := K) (L := E) v w₀ + have hw : w.asIdeal.LiesOver v.asIdeal := + _root_.finitePlaceExtensionCentre_liesOver (K := K) (L := E) v w₀ + have hunram : Algebra.IsUnramifiedAt (𝓞 K) w.asIdeal := + (R.unramifiedOutsideModulus.1 v hvm) w.asIdeal inferInstance hw + calc + e (QuotientGroup.mk' m'.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v))) = + R.artinEquiv (rayClassOfFinitePrime m v hvm) := by + change R.artinEquiv + ((GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m).symm + (QuotientGroup.mk' m'.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v)))) = _ + rw [← GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele_prime K m v hvm] + exact congrArg R.artinEquiv + ((GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m).symm_apply_apply _) + _ = arithmeticFrobeniusAt (K := K) w := + R.artin_frobenius v hvm w hw + _ = GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := E) v := + (GlobalClassFieldComparison.arithmeticPrimeArtin_eq_arithmeticFrobeniusAt + (K := K) (L := E) v w hw hunram).symm + change EmbedsInRayClassField K L m ↔ c ≤ m + constructor + · rintro ⟨R, ⟨f⟩⟩ + have hR := hnorm R + have hnormLE : + (_root_.ideleClassNorm K R.extension).range ≤ + (_root_.ideleClassNorm K L).range := + GlobalClassFieldTheory.GlobalClassFields.ideleClassNorm_range_le_of_algHom + (K := K) L R.extension f + have hdef : m'.congruenceSubgroup ≤ + (_root_.ideleClassNorm K L).range := by + rw [← hR] + exact hnormLE + have hc : H.fullConductor ≤ m' := + (H.isDefiningModulus_iff_fullConductor_le m').mp hdef + exact hc + · intro hc + obtain ⟨S⟩ := GlobalClassFieldComparison.rayClassSubgroup_existence K m ⊥ + have hinj : Function.Injective S.artin := + (MonoidHom.ker_eq_bot_iff S.artin).mp S.artin_ker + let e : RayClassGroup m ≃* (S.extension ≃ₐ[K] S.extension) := + MulEquiv.ofBijective S.artin ⟨hinj, S.artin_surjective⟩ + let R : RayClassFieldRealization K m := + { extension := S.extension + unramifiedOutsideModulus := S.unramifiedOutsideModulus + artinEquiv := e + artin_frobenius := by + intro v hv w hlie + exact S.artin_frobenius v hv w hlie } + have hR := hnorm R + have hc' : H.fullConductor ≤ m' := hc + have hdef : m'.congruenceSubgroup ≤ + (_root_.ideleClassNorm K L).range := + (H.isDefiningModulus_iff_fullConductor_le m').mpr hc' + have hnormLE : + (_root_.ideleClassNorm K R.extension).range ≤ + (_root_.ideleClassNorm K L).range := by + rw [hR] + exact hdef + exact ⟨R, + finiteAbelianExtension_nonempty_algHom_of_normRange_le + (K := K) L R.extension hnormLE⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RationalRayPrimeClass.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RationalRayPrimeClass.lean new file mode 100644 index 0000000000..aa46d27c86 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RationalRayPrimeClass.lean @@ -0,0 +1,287 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.RationalPrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele +/-! +# Rational prime classes in rational ray class groups + +For a prime `q` away from a rational modulus `(m)`, the normalized +one-place prime idèle represents the direct residue unit `q` in +`(ZMod m)ˣ`. This is the ideal-theoretic arithmetic input needed to +compare rational ray reciprocity with the cyclotomic character. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain IdeleGroup + +open scoped Classical in +/-- The canonical rational ray-class identification, with the native +quotient topology on the idèle-class quotient and the finite discrete +topology on `(ZMod m)ˣ`. Thus this is the topological form of the +rational ray-class computation, not only an abstract finite-group +isomorphism. -/ +noncomputable def rationalRayClassGroupContinuousMulEquivZModUnits + (m : ℕ) (hm : m ≠ 0) : + RayClass.RayClassGroup (RayClass.rationalModulus m) ≃ₜ* + (ZMod m)ˣ := by + letI : DiscreteTopology + (RayClass.RayClassGroup + (RayClass.rationalModulus m)) := + QuotientGroup.discreteTopology + (RayClass.isOpen_congruenceSubgroup + (RayClass.rationalModulus m)) + exact + { RayClass.rationalRayClassGroupEquivZModUnits m hm with + continuous_toFun := continuous_of_discreteTopology + continuous_invFun := continuous_of_discreteTopology } + +open scoped Classical in +/-- Forgetting topology from the canonical rational ray-class +identification recovers the standard residue-class equivalence +literally. -/ +@[simp] +theorem rationalRayClassGroupContinuousMulEquivZModUnits_apply + (m : ℕ) (hm : m ≠ 0) + (c : RayClass.RayClassGroup + (RayClass.rationalModulus m)) : + rationalRayClassGroupContinuousMulEquivZModUnits m hm c = + RayClass.rationalRayClassGroupEquivZModUnits m hm c := by + rfl + +open scoped Classical in +/-- A rational prime not dividing `m` is outside the finite support of +the rational modulus `(m)`. -/ +theorem rationalPrime_not_mem_rationalModulus_support + (m : ℕ) (hm : m ≠ 0) + (q : Nat.Primes) (hq : ¬ q.1 ∣ m) : + RayClass.rationalPrime q ∉ + (RayClass.rationalModulus m).finitePart.support := by + intro hmem + apply hq + have hdiv := + (RayClass.mem_rationalFiniteModulus_support_iff + hm (RayClass.rationalPrime q)).mp (by + simpa only [RayClass.rationalModulus, + RayClass.Modulus.finitePart_narrowOfFinite] using hmem) + simpa only [RayClass.natGenerator_rationalPrime] using hdiv + +open scoped Classical in +/-- The height-one prime of `𝓞 ℚ` indexed by `q` is generated by the +integer `q`, transported through the canonical equivalence +`𝓞 ℚ ≃+* ℤ`. -/ +theorem rationalPrime_asIdeal_eq_span_integerGenerator + (q : Nat.Primes) : + (RayClass.rationalPrime q).asIdeal = + Ideal.span + {Rat.ringOfIntegersEquiv.symm (q.1 : ℤ)} := by + let v : HeightOneSpectrum (𝓞 ℚ) := + RayClass.rationalPrime q + have hIntEquiv : + Rat.IsIntegralClosure.intEquiv (𝓞 ℚ) = + Rat.ringOfIntegersEquiv := by + ext x + exact + Rat.IsIntegralClosure.intEquiv_apply_eq_ringOfIntegersEquiv x + have hspan : + Ideal.span {(q.1 : ℤ)} = + v.asIdeal.map Rat.ringOfIntegersEquiv := by + simpa only [v, RayClass.natGenerator_rationalPrime, + hIntEquiv] using + Rat.HeightOneSpectrum.span_natGenerator v + apply + ((RingEquiv.idealComapOrderIso + Rat.ringOfIntegersEquiv).symm).injective + simp only [RingEquiv.idealComapOrderIso_symm_apply] + calc + (RayClass.rationalPrime q).asIdeal.map + Rat.ringOfIntegersEquiv = + Ideal.span {(q.1 : ℤ)} := by + simpa only [v] using hspan.symm + _ = + (Ideal.span + {Rat.ringOfIntegersEquiv.symm (q.1 : ℤ)}).map + Rat.ringOfIntegersEquiv := by + rw [Ideal.map_span, Set.image_singleton, + Rat.ringOfIntegersEquiv.apply_symm_apply] + +open scoped Classical in +/-- The fractional prime ideal indexed by `q` is literally the +principal fractional ideal generated by the positive rational integer +`q`. -/ +theorem rationalPrime_fractionalIdeal_eq_toPrincipalIdeal + (q : Nat.Primes) : + FractionalIdealGroup.prime (RayClass.rationalPrime q) = + toPrincipalIdeal (𝓞 ℚ) ℚ + (Units.mk0 (q.1 : ℚ) + (by exact_mod_cast q.2.ne_zero)) := by + apply Units.ext + rw [coe_toPrincipalIdeal] + change + ((RayClass.rationalPrime q).asIdeal : + FractionalIdeal + (nonZeroDivisors (𝓞 ℚ)) ℚ) = + FractionalIdeal.spanSingleton + (nonZeroDivisors (𝓞 ℚ)) (q.1 : ℚ) + rw [rationalPrime_asIdeal_eq_span_integerGenerator, + FractionalIdeal.coeIdeal_span_singleton] + congr 1 + exact Rat.ringOfIntegersEquiv_symm_apply_coe (q.1 : ℤ) + +open scoped Classical in +/-- The rational prime ideal, regarded as prime to `(m)`, written using +its positive principal generator `q`. -/ +noncomputable def rationalPrimePrincipalPrimeToModulusIdeal + (m : ℕ) (hm : m ≠ 0) + (q : Nat.Primes) (hq : ¬ q.1 ∣ m) : + RayClass.primeToModulusIdeals + (RayClass.rationalModulus m) := + ⟨toPrincipalIdeal (𝓞 ℚ) ℚ + (Units.mk0 (q.1 : ℚ) + (by exact_mod_cast q.2.ne_zero)), + RayClass.principalNat_mem_primeToModulusIdeals + hm q.2.ne_zero + (q.2.coprime_iff_not_dvd.mpr hq)⟩ + +open scoped Classical in +/-- The canonical prime-to-modulus ideal at `q` agrees with the +principal ideal represented by the positive integer `q`. -/ +theorem primeToModulusIdeal_rationalPrime_eq_principal + (m : ℕ) (hm : m ≠ 0) + (q : Nat.Primes) (hq : ¬ q.1 ∣ m) : + RayClass.primeToModulusIdeal + (RayClass.rationalModulus m) + (RayClass.rationalPrime q) + (rationalPrime_not_mem_rationalModulus_support + m hm q hq) = + rationalPrimePrincipalPrimeToModulusIdeal + m hm q hq := by + apply Subtype.ext + exact rationalPrime_fractionalIdeal_eq_toPrincipalIdeal q + +open scoped Classical in +/-- The ideal residue homomorphism sends the rational prime ideal at +`q ∤ m` to the direct residue unit `q`. -/ +theorem primeToIdealResidueHom_rationalPrime + (m : ℕ) (hm : m ≠ 0) + (q : Nat.Primes) (hq : ¬ q.1 ∣ m) : + RayClass.primeToIdealResidueHom m hm + (RayClass.primeToModulusIdeal + (RayClass.rationalModulus m) + (RayClass.rationalPrime q) + (rationalPrime_not_mem_rationalModulus_support + m hm q hq)) = + ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr hq) := by + rw [primeToModulusIdeal_rationalPrime_eq_principal m hm q hq] + rw [RayClass.primeToIdealResidueHom_apply] + apply Units.ext + change + (RayClass.rationalResidueUnit m + (RayClass.positiveRationalIdealGenerator + (toPrincipalIdeal (𝓞 ℚ) ℚ + (Units.mk0 (q.1 : ℚ) + (by exact_mod_cast q.2.ne_zero)))) _ _ : + ZMod m) = + (ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr hq) : ZMod m) + have hgen : + RayClass.positiveRationalIdealGenerator + (toPrincipalIdeal (𝓞 ℚ) ℚ + (Units.mk0 (q.1 : ℚ) + (by exact_mod_cast q.2.ne_zero))) = + (q.1 : ℚ) := + RayClass.positiveGenerator_toPrincipalIdeal_nat q.2.pos + have hcop : Nat.Coprime q.1 m := + q.2.coprime_iff_not_dvd.mpr hq + have hnum : Nat.Coprime ((q.1 : ℚ).num.natAbs) m := by + simpa only [Rat.num_natCast, Int.natAbs_natCast] using hcop + have hden : Nat.Coprime ((q.1 : ℚ).den) m := by + simpa only [Rat.den_natCast] using Nat.coprime_one_left m + calc + (RayClass.rationalResidueUnit m + (RayClass.positiveRationalIdealGenerator + (toPrincipalIdeal (𝓞 ℚ) ℚ + (Units.mk0 (q.1 : ℚ) + (by exact_mod_cast q.2.ne_zero)))) _ _ : ZMod m) = + (RayClass.rationalResidueUnit m (q.1 : ℚ) + hnum hden : ZMod m) := + congrArg Units.val + (RayClass.rationalResidueUnit_congr + m hgen _ _ hnum hden) + _ = (ZMod.unitOfCoprime q.1 hcop : ZMod m) := by + simpa only [ZMod.coe_unitOfCoprime] using + RayClass.rationalResidueUnit_natCast m q.1 hcop + +open scoped Classical in +/-- The canonical normalized finite prime idèle class at `q ∤ m` has +direct residue `q` under the rational ray-class equivalence with +`(ZMod m)ˣ`. -/ +theorem rationalRayClassGroupEquivZModUnits_finitePrimeIdeleClass + (m : ℕ) (hm : m ≠ 0) + (q : Nat.Primes) (hq : ¬ q.1 ∣ m) : + RayClass.rationalRayClassGroupEquivZModUnits m hm + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.rationalModulus m)) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup ℚ) + (finitePrimeIdele + (RayClass.rationalPrime q)))) = + ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr hq) := by + let hv : + RayClass.rationalPrime q ∉ + (RayClass.rationalModulus m).finitePart.support := + rationalPrime_not_mem_rationalModulus_support + m hm q hq + let a : + RayClass.idelePrimeToModulusSubgroup + (RayClass.rationalModulus m) := + ⟨finitePrimeIdele (RayClass.rationalPrime q), + finitePrimeIdele_mem_idelePrimeToModulusSubgroup + (RayClass.rationalModulus m) + (RayClass.rationalPrime q) hv⟩ + change + RayClass.idealRayClassGroupEquivZModUnits m hm + (RayClass.rayClassGroupEquivIdealRayClassGroup + (RayClass.rationalModulus m) + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.rationalModulus m)) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup ℚ) + (a : IdeleGroup ℚ)))) = + ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr hq) + rw [ + rayClassGroupEquivIdealRayClassGroup_mk_primeTo, + idealRayProjection_finitePrimeIdele] + change + RayClass.primeToIdealResidueHom m hm + (RayClass.primeToModulusIdeal + (RayClass.rationalModulus m) + (RayClass.rationalPrime q) hv) = + ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr hq) + exact primeToIdealResidueHom_rationalPrime m hm q hq + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean new file mode 100644 index 0000000000..136c0c24e3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean @@ -0,0 +1,737 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.NormalFieldRange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLattice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Evaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.GlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidue +/-! +# Actual ray class fields + +For a modulus `m` of a number field `K`, its ray congruence subgroup +`C_K^m` is closed and has finite index. The finite-index class-field +construction therefore selects an actual finite abelian extension whose +determinant-norm range is exactly `C_K^m`. + +The construction first occurs over the canonical fixed-field copy of `K` +inside the rational separable closure. We then install the canonical +scalar structure from the original field, identify the norm range over +that original field, and obtain the genuine reciprocity equivalence + +`Gal(K^m / K) ≃ C_K / C_K^m`. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open ClassFormation +open LocalClassFieldTheory +open NumberField +open Reciprocity +open CyclicCohomology + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- The concrete finite Galois norm neighbourhood used to select the +ray class field attached to `m`. -/ +noncomputable abbrev rayClassFieldNormAmbient + (K : Type) [Field K] [NumberField K] + (m : RayClass.Modulus K) : Type := + closedFiniteIndexClassFieldNormAmbient + (K := K) (RayClass.Modulus.congruenceSubgroup m) + (RayClass.isClosed_congruenceSubgroup m) + +open scoped Classical in +/-- The compatible abstract base subgroup used by the selected ray +class-field realization. -/ +noncomputable abbrev rayClassFieldBaseSubgroup + (K : Type) [Field K] [NumberField K] + (m : RayClass.Modulus K) := + closedFiniteIndexClassFieldBaseSubgroup + (K := K) (RayClass.Modulus.congruenceSubgroup m) + (RayClass.isClosed_congruenceSubgroup m) + +open scoped Classical in +/-- The finite abelian subextension selected by the ray congruence +subgroup `C_K^m`. -/ +noncomputable abbrev rayClassFieldSubextension + (K : Type) [Field K] [NumberField K] + (m : RayClass.Modulus K) : + FiniteAbelianSubextension + (rayClassFieldBaseSubgroup K m) := + closedFiniteIndexClassFieldSubextension + (K := K) (RayClass.Modulus.congruenceSubgroup m) + (RayClass.isClosed_congruenceSubgroup m) + +open scoped Classical in +/-- The canonical fixed-field copy of the original number field in the +selected ray class-field realization. -/ +noncomputable abbrev rayClassFieldBase + (K : Type) [Field K] [NumberField K] + (m : RayClass.Modulus K) : Type := + closedFiniteIndexClassFieldBase + (K := K) (RayClass.Modulus.congruenceSubgroup m) + (RayClass.isClosed_congruenceSubgroup m) + +open scoped Classical in +/-- A chosen finite ray-class-field realization attached to `m`, selected +inside the rational separable closure. Its intrinsic realization in the +fixed separable closure of `K` is `rayClassFieldSubfield`. -/ +noncomputable abbrev rayClassField + (K : Type) [Field K] [NumberField K] + (m : RayClass.Modulus K) : Type := + closedFiniteIndexClassField + (K := K) (RayClass.Modulus.congruenceSubgroup m) + (RayClass.isClosed_congruenceSubgroup m) + +open scoped Classical in +/-- The canonical equivalence from `K` to the fixed-field base of its +selected ray class field. -/ +noncomputable abbrev rayClassFieldBaseEquiv + (m : RayClass.Modulus K) : + K ≃ₐ[ℚ] rayClassFieldBase K m := + closedFiniteIndexClassFieldBaseEquiv + (K := K) (RayClass.Modulus.congruenceSubgroup m) + (RayClass.isClosed_congruenceSubgroup m) + +open scoped Classical in +/-- The ray congruence subgroup transported to the fixed-field base of +the selected realization. -/ +def rayClassFieldTransportedCongruenceSubgroup + (m : RayClass.Modulus K) : + Subgroup + (IdeleClassGroup (rayClassFieldBase K m)) := + (RayClass.Modulus.congruenceSubgroup m).map + (ideleClassCongr + (rayClassFieldBaseEquiv (K := K) m)).toMonoidHom + +open scoped Classical in +/-- The determinant-norm range over the fixed-field base of the +selected ray class field is the transported ray congruence subgroup. -/ +theorem rayClassField_ideleClassNorm_range + (m : RayClass.Modulus K) : + (_root_.ideleClassNorm + (rayClassFieldBase K m) + (rayClassField K m)).range = + rayClassFieldTransportedCongruenceSubgroup + (K := K) m := by + simpa only [rayClassFieldTransportedCongruenceSubgroup, + rayClassFieldBaseEquiv, rayClassField, rayClassFieldBase] using + (closedFiniteIndexClassField_ideleClassNorm_range_over_base + (K := K) (RayClass.Modulus.congruenceSubgroup m) + (RayClass.isClosed_congruenceSubgroup m)) + +open scoped Classical in +/-- The fixed-field base of the selected ray class field, regarded as +an algebra over the original number field. -/ +noncomputable abbrev rayClassFieldBaseAlgebraOverOriginal + (m : RayClass.Modulus K) : + Algebra K (rayClassFieldBase K m) := + closedFiniteIndexClassFieldBaseAlgebraOverOriginal + (K := K) (RayClass.Modulus.congruenceSubgroup m) + (RayClass.isClosed_congruenceSubgroup m) + +open scoped Classical in +/-- The canonical fixed-field identification as an equivalence over +the original number field. -/ +noncomputable abbrev rayClassFieldBaseEquivOverOriginal + (m : RayClass.Modulus K) : + K ≃ₐ[K] rayClassFieldBase K m := + closedFiniteIndexClassFieldBaseEquivOverOriginal + (K := K) (RayClass.Modulus.congruenceSubgroup m) + (RayClass.isClosed_congruenceSubgroup m) + +open scoped Classical in +/-- The selected ray class field as an algebra over the original +number field. -/ +noncomputable abbrev rayClassFieldAlgebraOverOriginal + (m : RayClass.Modulus K) : + Algebra K (rayClassField K m) := + closedFiniteIndexClassFieldAlgebraOverOriginal + (K := K) (RayClass.Modulus.congruenceSubgroup m) + (RayClass.isClosed_congruenceSubgroup m) + +open scoped Classical in +/-- The scalar map into the ray class field is the canonical base +equivalence followed by fixed-field inclusion. -/ +@[simp] +theorem rayClassField_algebraMap_original + (m : RayClass.Modulus K) (x : K) : + algebraMap K (rayClassField K m) x = + algebraMap + (rayClassFieldBase K m) + (rayClassField K m) + (rayClassFieldBaseEquiv (K := K) m x) := by + simpa only [rayClassField, rayClassFieldBase, + rayClassFieldBaseEquiv] using + (closedFiniteIndexClassField_algebraMap_original + (K := K) (RayClass.Modulus.congruenceSubgroup m) + (RayClass.isClosed_congruenceSubgroup m) x) + +open scoped Classical in +/-- A chosen embedding of the finite ray-class-field realization into the +fixed separable closure of its original base field. -/ +noncomputable def rayClassFieldEmbedding + (K : Type) [Field K] [NumberField K] + (m : RayClass.Modulus K) : + rayClassField K m →ₐ[K] SeparableClosure K := + IsSepClosed.lift + +open scoped Classical in +/-- The intrinsic ray class field as an intermediate field of the fixed +separable closure of `K`. -/ +noncomputable def rayClassFieldSubfield + (K : Type) [Field K] [NumberField K] + (m : RayClass.Modulus K) : + IntermediateField K (SeparableClosure K) := + (rayClassFieldEmbedding K m).fieldRange + +open scoped Classical in +/-- Every embedding of the chosen finite ray-class-field realization into +the fixed separable closure has the intrinsic ray-class-field range. -/ +theorem rayClassFieldSubfield_eq_fieldRange + (m : RayClass.Modulus K) + (f : rayClassField K m →ₐ[K] SeparableClosure K) : + rayClassFieldSubfield K m = f.fieldRange := + AlgHom.fieldRange_eq_of_normal + (rayClassFieldEmbedding K m) f + +open scoped Classical in +/-- Over the original number field, the determinant-norm range of the +selected ray class field is exactly `C_K^m`. -/ +theorem rayClassField_ideleClassNorm_range_over_original + (m : RayClass.Modulus K) : + (_root_.ideleClassNorm K (rayClassField K m)).range = + RayClass.Modulus.congruenceSubgroup m := by + simpa only [rayClassField] using + (closedFiniteIndexClassField_ideleClassNorm_range + (K := K) (RayClass.Modulus.congruenceSubgroup m) + (RayClass.isClosed_congruenceSubgroup m)) + +open scoped Classical in +/-- A finite abelian extension is isomorphic over `K` to the selected +ray class field of modulus `m` exactly when its genuine idèle-class +norm range is `C_K^m`. This is the actual-field uniqueness statement +for ray class fields. -/ +theorem + nonempty_algEquiv_rayClassField_iff_ideleClassNorm_range_eq + (L : Type) [Field L] [NumberField L] + [Algebra K L] [FiniteDimensional K L] + [IsAbelianGalois K L] + (m : RayClass.Modulus K) : + Nonempty (L ≃ₐ[K] rayClassField K m) ↔ + (_root_.ideleClassNorm K L).range = + RayClass.Modulus.congruenceSubgroup m := by + rw [ + nonempty_algEquiv_iff_ideleClassNorm_range_eq, + rayClassField_ideleClassNorm_range_over_original] + +open scoped Classical in +/-- Increasing the modulus decreases the actual determinant-norm +range of the selected ray class field. This is the norm-subgroup +form of the contravariant inclusion of ray class fields. -/ +theorem rayClassField_ideleClassNorm_range_antitone + {m n : RayClass.Modulus K} + (hmn : m ≤ n) : + (_root_.ideleClassNorm K (rayClassField K n)).range ≤ + (_root_.ideleClassNorm K (rayClassField K m)).range := by + calc + (_root_.ideleClassNorm K (rayClassField K n)).range = + RayClass.Modulus.congruenceSubgroup n := + rayClassField_ideleClassNorm_range_over_original + (K := K) n + _ ≤ RayClass.Modulus.congruenceSubgroup m := + rayClassCongruenceSubgroup_antitone + (K := K) hmn + _ = (_root_.ideleClassNorm K (rayClassField K m)).range := + (rayClassField_ideleClassNorm_range_over_original + (K := K) m).symm + +open scoped Classical in +/-- Divisibility of moduli produces an embedding between the selected +ray-class-field types over the original number field. Literal containment +inside the fixed separable closure is instead stated by +`rayClassFieldSubfield_mono`. -/ +theorem rayClassField_nonempty_algHom_of_le + {m n : RayClass.Modulus K} + (hmn : m ≤ n) : + Nonempty + (rayClassField K m →ₐ[K] + rayClassField K n) := + finiteAbelianExtension_nonempty_algHom_of_normRange_le + (K := K) + (rayClassField K m) + (rayClassField K n) + (rayClassField_ideleClassNorm_range_antitone + (K := K) hmn) + +open scoped Classical in +/-- Divisibility of moduli gives literal inclusion of the corresponding +intrinsic ray class fields inside the fixed separable closure. -/ +theorem rayClassFieldSubfield_mono + {m n : RayClass.Modulus K} + (hmn : m ≤ n) : + rayClassFieldSubfield K m ≤ rayClassFieldSubfield K n := by + let f : rayClassField K m →ₐ[K] rayClassField K n := + Classical.choice + (rayClassField_nonempty_algHom_of_le (K := K) hmn) + calc + rayClassFieldSubfield K m = + ((rayClassFieldEmbedding K n).comp f).fieldRange := + rayClassFieldSubfield_eq_fieldRange + (K := K) m ((rayClassFieldEmbedding K n).comp f) + _ ≤ (rayClassFieldEmbedding K n).fieldRange := by + intro x hx + rcases AlgHom.mem_fieldRange.mp hx with ⟨y, rfl⟩ + exact AlgHom.mem_fieldRange.mpr ⟨f y, rfl⟩ + _ = rayClassFieldSubfield K n := rfl + +open scoped Classical in +/-- A finite abelian extension embeds in the selected ray class field +of modulus `m` exactly when `m` is a defining modulus for its genuine +idèle-class norm subgroup. -/ +theorem + nonempty_algHom_to_rayClassField_iff_isDefiningModulus + (L : Type) [Field L] [NumberField L] + [Algebra K L] [FiniteDimensional K L] + [IsAbelianGalois K L] + (m : RayClass.Modulus K) : + Nonempty (L →ₐ[K] rayClassField K m) ↔ + IsDefiningModulus + ((_root_.ideleClassNorm K L).range) m := by + change + Nonempty (L →ₐ[K] rayClassField K m) ↔ + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range + rw [ + nonempty_algHom_iff_ideleClassNorm_range_le, + rayClassField_ideleClassNorm_range_over_original] + +open scoped Classical in +/-- Actual containment in a narrow ray class field is equivalent to +divisibility by the exact narrow finite conductor. -/ +theorem + nonempty_algHom_to_rayClassField_narrowOfFinite_iff_narrowFiniteConductor_le + (L : Type) [Field L] [NumberField L] + [Algebra K L] [FiniteDimensional K L] + [IsAbelianGalois K L] + (n : RayClass.FiniteModulus K) : + Nonempty + (L →ₐ[K] + rayClassField K (RayClass.Modulus.narrowOfFinite n)) ↔ + ideleClassNormNarrowFiniteConductor (K := K) (L := L) ≤ n := by + rw [nonempty_algHom_to_rayClassField_iff_isDefiningModulus] + constructor + · intro hm + simpa only [ideleClassNormNarrowFiniteConductor, + RayClass.Modulus.finitePart_narrowOfFinite] using + (ideleClassNormConductorialSubgroup + (K := K) (L := L)).narrowFiniteConductor_le hm + · intro hn + exact + isDefiningModulus_mono + ((_root_.ideleClassNorm K L).range) + (ideleClassNorm_narrowFiniteConductor_isDefiningModulus + (K := K) (L := L)) + ⟨hn, Finset.subset_univ _⟩ + +open scoped Classical in +/-- The ray class field of the exact narrow finite conductor genuinely +contains the given finite abelian extension. -/ +theorem + finiteAbelianExtension_nonempty_algHom_to_conductorRayClassField + (L : Type) [Field L] [NumberField L] + [Algebra K L] [FiniteDimensional K L] + [IsAbelianGalois K L] : + Nonempty + (L →ₐ[K] + rayClassField K + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)))) := + (nonempty_algHom_to_rayClassField_iff_isDefiningModulus + (K := K) L + (RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)))).2 + (ideleClassNorm_narrowFiniteConductor_isDefiningModulus + (K := K) (L := L)) + +open scoped Classical in +/-- Every finite abelian extension is genuinely contained in a ray +class field over the original base. -/ +theorem finiteAbelianExtension_exists_rayClassFieldEmbedding + (L : Type) [Field L] [NumberField L] + [Algebra K L] [FiniteDimensional K L] + [IsAbelianGalois K L] : + ∃ m : RayClass.Modulus K, + Nonempty (L →ₐ[K] rayClassField K m) := + ⟨RayClass.Modulus.narrowOfFinite + (ideleClassNormNarrowFiniteConductor + (K := K) (L := L)), + finiteAbelianExtension_nonempty_algHom_to_conductorRayClassField + (K := K) L⟩ + +open scoped Classical in +/-- The exact narrow finite conductor is the greatest common divisor +of the finite parts of the moduli of the actual ray class fields +containing a finite abelian extension. -/ +theorem + ideleClassNorm_narrowFiniteConductor_is_gcd_of_rayClassField_embeddings + (L : Type) [Field L] [NumberField L] + [Algebra K L] [FiniteDimensional K L] + [IsAbelianGalois K L] : + (∀ m : RayClass.Modulus K, + Nonempty (L →ₐ[K] rayClassField K m) → + ideleClassNormNarrowFiniteConductor + (K := K) (L := L) ≤ m.finitePart) ∧ + (∀ d : RayClass.FiniteModulus K, + (∀ m : RayClass.Modulus K, + Nonempty (L →ₐ[K] rayClassField K m) → + d ≤ m.finitePart) → + d ≤ ideleClassNormNarrowFiniteConductor + (K := K) (L := L)) := by + have hgcd := + (ideleClassNormConductorialSubgroup + (K := K) (L := L)).narrowFiniteConductor_is_gcd + constructor + · intro m hm + simpa only [ideleClassNormNarrowFiniteConductor] using + hgcd.1 m + ((nonempty_algHom_to_rayClassField_iff_isDefiningModulus + (K := K) L m).1 hm) + · intro d hd + simpa only [ideleClassNormNarrowFiniteConductor] using + hgcd.2 d (fun m hm => + hd m + ((nonempty_algHom_to_rayClassField_iff_isDefiningModulus + (K := K) L m).2 hm)) + +open scoped Classical in +/-- Global reciprocity for the selected ray class field as a +homeomorphic multiplicative equivalence + +`Gal(K^m / K) ≃ₜ* C_K / C_K^m`. + +The topology is the genuine finite Krull topology on the Galois group +and the native quotient topology on the ray class group. -/ +noncomputable def + rayClassFieldGaloisContinuousMulEquivRayClassGroup + (m : RayClass.Modulus K) : + Gal((rayClassField K m)/K) ≃ₜ* + RayClass.RayClassGroup m := by + letI : DiscreteTopology (RayClass.RayClassGroup m) := + QuotientGroup.discreteTopology + (RayClass.isOpen_congruenceSubgroup m) + exact + { closedFiniteIndexClassFieldGaloisEquivNormQuotient + (K := K) (RayClass.Modulus.congruenceSubgroup m) + (RayClass.isClosed_congruenceSubgroup m) with + continuous_toFun := continuous_of_discreteTopology + continuous_invFun := continuous_of_discreteTopology } + +open scoped Classical in +/-- The underlying map of topological ray-class reciprocity is the +general closed-finite-index reciprocity equivalence. -/ +@[simp] +theorem + rayClassFieldGaloisContinuousMulEquivRayClassGroup_apply + (m : RayClass.Modulus K) + (σ : Gal((rayClassField K m)/K)) : + rayClassFieldGaloisContinuousMulEquivRayClassGroup + (K := K) m σ = + closedFiniteIndexClassFieldGaloisEquivNormQuotient + (K := K) (RayClass.Modulus.congruenceSubgroup m) + (RayClass.isClosed_congruenceSubgroup m) σ := by + rfl + +open scoped Classical in +/-- On an idèle-class representative, topological ray-class +reciprocity sends its genuine global norm-residue symbol to its ray +class modulo `C_K^m`. -/ +theorem + rayClassFieldGaloisContinuousMulEquivRayClassGroup_globalNormResidue + (m : RayClass.Modulus K) + (c : IdeleClassGroup K) : + rayClassFieldGaloisContinuousMulEquivRayClassGroup + (K := K) m + (Reciprocity.globalNormResidueMonoidHom + K (rayClassField K m) c) = + QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup m) c := by + rw [rayClassFieldGaloisContinuousMulEquivRayClassGroup_apply] + simpa only [rayClassField] using + (closedFiniteIndexClassFieldGaloisEquivNormQuotient_globalNormResidue + (K := K) (RayClass.Modulus.congruenceSubgroup m) + (RayClass.isClosed_congruenceSubgroup m) c) + +open scoped Classical in +/-- The degree of the selected ray class field is the order of the ray +class group. -/ +theorem rayClassField_finrank_eq_rayClassGroup_card + (m : RayClass.Modulus K) : + Module.finrank K (rayClassField K m) = + Nat.card (RayClass.RayClassGroup m) := by + calc + Module.finrank K (rayClassField K m) = + (RayClass.Modulus.congruenceSubgroup m).index := + by + simpa only [rayClassField] using + (closedFiniteIndexClassField_finrank_eq_index + (K := K) (RayClass.Modulus.congruenceSubgroup m) + (RayClass.isClosed_congruenceSubgroup m)) + _ = + Nat.card + (IdeleClassGroup K ⧸ + RayClass.Modulus.congruenceSubgroup m) := + Subgroup.index_eq_card + (RayClass.Modulus.congruenceSubgroup m) + _ = + Nat.card (RayClass.RayClassGroup m) := + rfl + +open scoped Classical in +/-- Global reciprocity identifies the genuine Galois group of the +selected ray class field with the ray class group `C_K / C_K^m`. -/ +noncomputable abbrev rayClassFieldGaloisEquivRayClassGroup + (m : RayClass.Modulus K) : + Gal((rayClassField K m)/K) ≃* + RayClass.RayClassGroup m := + closedFiniteIndexClassFieldGaloisEquivNormQuotient + (K := K) (RayClass.Modulus.congruenceSubgroup m) + (RayClass.isClosed_congruenceSubgroup m) + +open scoped Classical in +/-- The subfield of the ray class field fixed by a prescribed ray-class +subgroup, transported through the genuine reciprocity equivalence. -/ +noncomputable def rayClassSubgroupFixedField + (m : RayClass.Modulus K) + (H : Subgroup (RayClass.RayClassGroup m)) : + IntermediateField K (rayClassField K m) := + IntermediateField.fixedField + (H.map (rayClassFieldGaloisEquivRayClassGroup (K := K) m).symm.toMonoidHom) + +open scoped Classical in +/-- The fixed field, embedded in the chosen separable closure of the original +number field. -/ +noncomputable def rayClassSubgroupSubfield + (m : RayClass.Modulus K) + (H : Subgroup (RayClass.RayClassGroup m)) : + IntermediateField K (SeparableClosure K) := + (rayClassSubgroupFixedField (K := K) m H).map + (rayClassFieldEmbedding K m) + +open scoped Classical in +/-- The fixed field is a finite abelian extension of the original field. -/ +noncomputable def rayClassSubgroupSubextension + (m : RayClass.Modulus K) + (H : Subgroup (RayClass.RayClassGroup m)) : + ClassFieldTheory.FiniteAbelianExtension K := by + let F := rayClassSubgroupFixedField (K := K) m H + let j := rayClassFieldEmbedding K m + let E := F.map j + have hfin : FiniteDimensional K E := + (IntermediateField.equivMap F j).toLinearEquiv.finiteDimensional + have hab : IsAbelianGalois K E := + IsAbelianGalois.of_algHom + (IntermediateField.equivMap F j).symm.toAlgHom + exact ⟨E, hfin, hab⟩ + +open scoped Classical in +/-- The ray class group acts on the subfield fixed by `H` by restricting +the reciprocity action on the full ray class field. -/ +noncomputable def rayClassSubgroupFixedFieldArtin + (m : RayClass.Modulus K) + (H : Subgroup (RayClass.RayClassGroup m)) : + RayClass.RayClassGroup m →* + (rayClassSubgroupFixedField (K := K) m H ≃ₐ[K] + rayClassSubgroupFixedField (K := K) m H) := + (AlgEquiv.restrictNormalHom + (rayClassSubgroupFixedField (K := K) m H)).comp + (rayClassFieldGaloisEquivRayClassGroup (K := K) m).symm.toMonoidHom + +open scoped Classical in +/-- The restricted reciprocity action reaches every automorphism of +the fixed field. -/ +theorem rayClassSubgroupFixedFieldArtin_surjective + (m : RayClass.Modulus K) + (H : Subgroup (RayClass.RayClassGroup m)) : + Function.Surjective (rayClassSubgroupFixedFieldArtin (K := K) m H) := by + intro τ + obtain ⟨σ, hσ⟩ := + AlgEquiv.restrictNormalHom_surjective (E := rayClassField K m) τ + refine ⟨rayClassFieldGaloisEquivRayClassGroup (K := K) m σ, ?_⟩ + simpa [rayClassSubgroupFixedFieldArtin] using hσ + +open scoped Classical in +/-- The exact kernel of the fixed-field reciprocity action is `H`. -/ +theorem rayClassSubgroupFixedFieldArtin_ker + (m : RayClass.Modulus K) + (H : Subgroup (RayClass.RayClassGroup m)) : + (rayClassSubgroupFixedFieldArtin (K := K) m H).ker = H := by + let e := rayClassFieldGaloisEquivRayClassGroup (K := K) m + let F := rayClassSubgroupFixedField (K := K) m H + have hfix : F.fixingSubgroup = H.map e.symm.toMonoidHom := by + exact IntermediateField.fixingSubgroup_fixedField + (H.map e.symm.toMonoidHom) + ext x + change e.symm x ∈ (AlgEquiv.restrictNormalHom F).ker ↔ x ∈ H + rw [F.restrictNormalHom_ker, hfix] + constructor + · rintro ⟨y, hy, hxy⟩ + exact (e.symm.injective hxy) ▸ hy + · intro hx + exact ⟨x, hx, rfl⟩ + +open scoped Classical in +private theorem rayClassGroup_mul_comm + (m : RayClass.Modulus K) + (x y : RayClass.RayClassGroup m) : x * y = y * x := by + refine QuotientGroup.induction_on x ?_ + intro a + refine QuotientGroup.induction_on y ?_ + intro b + simpa only [← QuotientGroup.mk_mul, QuotientGroup.mk'_apply] using + congrArg (QuotientGroup.mk' (RayClass.Modulus.congruenceSubgroup m)) + (mul_comm a b) + +open scoped Classical in +/-- Inversion of ray classes is a homomorphism because idèle classes +commute. This form does not require a commutative-group instance on the +quotient presentation. -/ +def rayClassGroupInvHom (m : RayClass.Modulus K) : + RayClass.RayClassGroup m →* RayClass.RayClassGroup m where + toFun := Inv.inv + map_one' := inv_one + map_mul' x y := by + rw [mul_inv_rev] + exact rayClassGroup_mul_comm (K := K) m y⁻¹ x⁻¹ + +open scoped Classical in +/-- Arithmetic reciprocity on the fixed field, transported to the chosen +subextension of the separable closure of `K`. The ambient ray-class +equivalence is geometrically normalized, so its input is inverted. -/ +noncomputable def rayClassSubgroupArtin + (m : RayClass.Modulus K) + (H : Subgroup (RayClass.RayClassGroup m)) : + RayClass.RayClassGroup m →* + (rayClassSubgroupSubextension (K := K) m H ≃ₐ[K] + rayClassSubgroupSubextension (K := K) m H) := + (AlgEquiv.autCongr + (IntermediateField.equivMap + (rayClassSubgroupFixedField (K := K) m H) + (rayClassFieldEmbedding K m))).toMonoidHom.comp + ((rayClassSubgroupFixedFieldArtin (K := K) m H).comp + (rayClassGroupInvHom (K := K) m)) + +open scoped Classical in +/-- The transported reciprocity map is surjective. -/ +theorem rayClassSubgroupArtin_surjective + (m : RayClass.Modulus K) + (H : Subgroup (RayClass.RayClassGroup m)) : + Function.Surjective (rayClassSubgroupArtin (K := K) m H) := by + let F := rayClassSubgroupFixedField (K := K) m H + let j := rayClassFieldEmbedding K m + let α := AlgEquiv.autCongr (IntermediateField.equivMap F j) + change Function.Surjective + (α.toMonoidHom.comp + ((rayClassSubgroupFixedFieldArtin (K := K) m H).comp + (rayClassGroupInvHom (K := K) m))) + exact (α.surjective.comp + (rayClassSubgroupFixedFieldArtin_surjective (K := K) m H)).comp + (fun x => ⟨x⁻¹, inv_inv x⟩) + +open scoped Classical in +/-- The transported reciprocity map has exactly the prescribed kernel. -/ +theorem rayClassSubgroupArtin_ker + (m : RayClass.Modulus K) + (H : Subgroup (RayClass.RayClassGroup m)) : + (rayClassSubgroupArtin (K := K) m H).ker = H := by + let F := rayClassSubgroupFixedField (K := K) m H + let j := rayClassFieldEmbedding K m + let α := AlgEquiv.autCongr (IntermediateField.equivMap F j) + let a := rayClassSubgroupFixedFieldArtin (K := K) m H + ext x + change α (a x⁻¹) = 1 ↔ x ∈ H + have hx : a x⁻¹ = 1 ↔ x⁻¹ ∈ H := by + change x⁻¹ ∈ a.ker ↔ x⁻¹ ∈ H + rw [rayClassSubgroupFixedFieldArtin_ker (K := K) m H] + constructor + · intro h + exact H.inv_mem_iff.mp + (hx.mp (α.injective (h.trans (map_one α).symm))) + · intro h + simp only [hx.mpr (H.inv_mem_iff.mpr h), map_one] + +open scoped Classical in +/-- The fixed subextension has a norm subgroup containing the ray +congruence subgroup. This is the defining-modulus input for its +unramifiedness away from the modulus. -/ +theorem rayClassSubgroupSubextension_norm_range + (m : RayClass.Modulus K) + (H : Subgroup (RayClass.RayClassGroup m)) : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K + (rayClassSubgroupSubextension (K := K) m H)).range := by + let F := rayClassSubgroupFixedField (K := K) m H + let j := rayClassFieldEmbedding K m + let E := rayClassSubgroupSubextension (K := K) m H + let f : E →ₐ[K] rayClassField K m := + (IntermediateField.val F).comp + (IntermediateField.equivMap F j).symm.toAlgHom + have hle : + (_root_.ideleClassNorm K (rayClassField K m)).range ≤ + (_root_.ideleClassNorm K E).range := + ideleClassNorm_range_le_of_algHom (K := K) E (rayClassField K m) f + calc + RayClass.Modulus.congruenceSubgroup m = + (_root_.ideleClassNorm K (rayClassField K m)).range := + (rayClassField_ideleClassNorm_range_over_original m).symm + _ ≤ (_root_.ideleClassNorm K E).range := hle + _ = (_root_.ideleClassNorm K + (rayClassSubgroupSubextension (K := K) m H)).range := rfl + +open scoped Classical in +/-- Under ray-class reciprocity, the actual global norm-residue symbol +is the ray class of its idèle-class representative. -/ +theorem rayClassFieldGaloisEquivRayClassGroup_globalNormResidue + (m : RayClass.Modulus K) + (c : IdeleClassGroup K) : + rayClassFieldGaloisEquivRayClassGroup + (K := K) m + (globalNormResidueMonoidHom K + (rayClassField K m) c) = + QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup m) c := by + simpa only [rayClassField, rayClassFieldGaloisEquivRayClassGroup] using + (closedFiniteIndexClassFieldGaloisEquivNormQuotient_globalNormResidue + (K := K) (RayClass.Modulus.congruenceSubgroup m) + (RayClass.isClosed_congruenceSubgroup m) c) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassModulusProjection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassModulusProjection.lean new file mode 100644 index 0000000000..68d60739f7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassModulusProjection.lean @@ -0,0 +1,174 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +public import Mathlib.Data.Finsupp.Order +/-! +# Projection between ray class groups + +The idèle-class quotient gives the canonical map from a larger ray modulus +to a smaller one. The public ray-class groups use the comparison equivalence +to transport this map. +-/ + +@[expose] public section + +open scoped NumberField +noncomputable +section + +namespace ClassFieldTheory + +open NumberField IsDedekindDomain + +variable (K : Type) [Field K] [NumberField K] + +open scoped Classical in +local instance ideleClassIsMulCommutative : + IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] ideleClassIsMulCommutative + +open scoped Classical in +local instance rayCongruenceNormal (m : RayClass.Modulus K) : + (RayClass.Modulus.congruenceSubgroup m).Normal := + Subgroup.normal_of_isMulCommutative _ + +attribute [local instance] rayCongruenceNormal + +open scoped Classical in +/-- The quotient projection between the original idèle-class ray groups. -/ +def originalRayClassModulusProjection + {m n : RayClass.Modulus K} (hmn : m ≤ n) : + RayClass.RayClassGroup n →* RayClass.RayClassGroup m := + QuotientGroup.map + (RayClass.Modulus.congruenceSubgroup n) + (RayClass.Modulus.congruenceSubgroup m) + (MonoidHom.id (IdeleClassGroup K)) + (RayClass.Modulus.congruenceSubgroup_antitone hmn) + +open scoped Classical in +/-- The projection of the original idèle-class ray groups is onto. -/ +theorem originalRayClassModulusProjection_surjective + {m n : RayClass.Modulus K} (hmn : m ≤ n) : + Function.Surjective (originalRayClassModulusProjection K hmn) := by + intro q + obtain ⟨c, rfl⟩ := + QuotientGroup.mk'_surjective (RayClass.Modulus.congruenceSubgroup m) q + exact + ⟨QuotientGroup.mk' (RayClass.Modulus.congruenceSubgroup n) c, rfl⟩ + +open scoped Classical in +/-- For `m ≤ n`, the natural quotient map from the ray class group modulo +`n` onto the ray class group modulo `m`. -/ +noncomputable def rayClassModulusProjection + {m n : RayClassModulus K} (hmn : m ≤ n) : + RayClassGroup n →* RayClassGroup m := by + let m' := GlobalClassFieldComparison.rayClassModulusToOriginal K m + let n' := GlobalClassFieldComparison.rayClassModulusToOriginal K n + have hmn' : m' ≤ n' := hmn + exact + (GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m).symm.toMonoidHom.comp + ((originalRayClassModulusProjection K hmn').comp + (GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K n).toMonoidHom) + +open scoped Classical in +/-- Evaluate the public projection through the original idèle-class quotient. -/ +theorem rayClassModulusProjection_apply + {m n : RayClassModulus K} (hmn : m ≤ n) + (a : RayClassGroup n) : + rayClassModulusProjection K hmn a = + (GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m).symm + (originalRayClassModulusProjection K + (show GlobalClassFieldComparison.rayClassModulusToOriginal K m ≤ + GlobalClassFieldComparison.rayClassModulusToOriginal K n from hmn) + (GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K n a)) := + rfl + +open scoped Classical in +/-- The modulus-change projection is onto. -/ +theorem rayClassModulusProjection_surjective + {m n : RayClassModulus K} (hmn : m ≤ n) : + Function.Surjective (rayClassModulusProjection K hmn) := by + let m' := GlobalClassFieldComparison.rayClassModulusToOriginal K m + let n' := GlobalClassFieldComparison.rayClassModulusToOriginal K n + have hmn' : m' ≤ n' := hmn + intro y + obtain ⟨z, hz⟩ := + originalRayClassModulusProjection_surjective K hmn' + (GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m y) + refine ⟨(GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K n).symm z, ?_⟩ + calc + rayClassModulusProjection K hmn + ((GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K n).symm z) = + (GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m).symm + (originalRayClassModulusProjection K hmn' + (GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K n + ((GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K n).symm z))) := + rayClassModulusProjection_apply K hmn _ + _ = + (GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m).symm + (originalRayClassModulusProjection K hmn' z) := by + rw [(GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K n).apply_symm_apply] + _ = + (GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m).symm + (GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m y) := + congrArg + (GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m).symm hz + _ = y := + (GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m).symm_apply_apply y + +open scoped Classical in +/-- The image of a prime ray class under modulus change is the same prime +ray class, provided the prime is outside the larger modulus. -/ +theorem rayClassModulusProjection_prime + {m n : RayClassModulus K} (hmn : m ≤ n) + (v : HeightOneSpectrum (𝓞 K)) + (hvn : v ∉ n.finitePart.support) : + rayClassModulusProjection K hmn + (rayClassOfFinitePrime n v hvn) = + rayClassOfFinitePrime m v + (by + intro hvm + exact hvn (Finsupp.support_mono hmn.1 hvm)) := by + have hvm : v ∉ m.finitePart.support := by + intro hv + exact hvn (Finsupp.support_mono hmn.1 hv) + let m' := GlobalClassFieldComparison.rayClassModulusToOriginal K m + let n' := GlobalClassFieldComparison.rayClassModulusToOriginal K n + have hmn' : m' ≤ n' := hmn + apply (GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m).injective + change + (GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m) + ((GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m).symm + (originalRayClassModulusProjection K hmn' + (GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K n + (rayClassOfFinitePrime n v hvn)))) = + GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m + (rayClassOfFinitePrime m v hvm) + rw [(GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m).apply_symm_apply] + rw [GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele_prime K n v hvn] + rw [GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele_prime K m v hvm] + rfl + +open scoped Classical in +/-- Enlarging the public modulus gives literal containment of the selected +ray class fields inside the fixed separable closure. -/ +theorem chosenRayClassFieldSubfield_mono + {m n : RayClassModulus K} (hmn : m ≤ n) : + GlobalClassFieldTheory.GlobalClassFields.rayClassFieldSubfield K + (GlobalClassFieldComparison.rayClassModulusToOriginal K m) ≤ + GlobalClassFieldTheory.GlobalClassFields.rayClassFieldSubfield K + (GlobalClassFieldComparison.rayClassModulusToOriginal K n) := by + apply GlobalClassFieldTheory.GlobalClassFields.rayClassFieldSubfield_mono + exact hmn + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassPrimeIdele.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassPrimeIdele.lean new file mode 100644 index 0000000000..b07dc95d74 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassPrimeIdele.lean @@ -0,0 +1,363 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldPrimeSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealFrobenius +/-! +# Prime idèles and ideal ray classes + +A normalized one-place prime idèle is prime to every modulus whose +finite support omits that prime. Its fractional ideal is the +corresponding prime ideal, so the idelic and ideal-theoretic ray-class +constructions use exactly the same prime representative. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain IdeleGroup + +universe u + +private theorem rayClassPrimeIdeleClassGroupIsMulCommutative + (F : Type u) [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + IsMulCommutative.of_comm (fun a b => mul_comm a b) + +attribute [local instance] rayClassPrimeIdeleClassGroupIsMulCommutative + +section GenericPrimeIdele + +variable {K : Type u} [Field K] [NumberField K] + +/-- A normalized one-place prime idèle is prime to a modulus whenever +the supporting prime does not occur in the modulus. -/ +theorem finitePrimeIdele_mem_idelePrimeToModulusSubgroup + (m : RayClass.Modulus K) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : + finitePrimeIdele v ∈ + RayClass.idelePrimeToModulusSubgroup m := by + constructor + · change + 1 ∈ + m.infiniteCongruenceSubgroup + exact + m.infiniteCongruenceSubgroup.one_mem + · intro w hw + have hwv : w ≠ v := by + intro h + exact hv (h ▸ hw) + change + IdeleGroup.finiteComponent w + (finitePrimeIdele v) ∈ + RayClass.localHigherUnitGroup w (m.finitePart w) + rw [finitePrimeIdele, + IdeleGroup.finitePlaceIdele_finiteComponent_of_ne + v w (FiniteIdeleGroup.chosenLocalOrderSection v 1) hwv] + exact + (RayClass.localHigherUnitGroup w (m.finitePart w)).one_mem + +/-- The fractional-ideal image of a normalized one-place prime idèle, +viewed as prime to a modulus, is the corresponding prime-to-modulus +prime ideal. -/ +@[simp] +theorem primeToIdealMap_finitePrimeIdele + (m : RayClass.Modulus K) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : + RayClass.primeToIdealMap m + ⟨finitePrimeIdele v, + finitePrimeIdele_mem_idelePrimeToModulusSubgroup + m v hv⟩ = + RayClass.primeToModulusIdeal m v hv := by + apply Subtype.ext + exact + fractionalIdeal_finitePrimeIdele v + +/-- The ideal-ray projection of a normalized one-place prime idèle is +the ideal ray class of the corresponding prime ideal. -/ +@[simp] +theorem idealRayProjection_finitePrimeIdele + (m : RayClass.Modulus K) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : + RayClass.idealRayProjection m + ⟨finitePrimeIdele v, + finitePrimeIdele_mem_idelePrimeToModulusSubgroup + m v hv⟩ = + QuotientGroup.mk' + (RayClass.principalRayIdealSubgroup m) + (RayClass.primeToModulusIdeal m v hv) := by + rw [RayClass.idealRayProjection, + MonoidHom.comp_apply, + primeToIdealMap_finitePrimeIdele] + +/-- The idèle-class/full-idèle ray-class equivalence evaluates on a +double quotient representative by forgetting the intermediate +principal-idèle quotient. -/ +theorem rayClassGroupEquivIdeleQuotient_mk_mk + (m : RayClass.Modulus K) + (a : IdeleGroup K) : + RayClass.rayClassGroupEquivIdeleQuotient m + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup m) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a)) = + QuotientGroup.mk' + (RayClass.Modulus.ideleCongruenceSubgroup m ⊔ + IdeleGroup.principalSubgroup K) a := by + exact + QuotientGroup.quotientQuotientEquivQuotientAux_mk_mk + (IdeleGroup.principalSubgroup K) + (RayClass.Modulus.ideleCongruenceSubgroup m ⊔ + IdeleGroup.principalSubgroup K) + le_sup_right a + +/-- The canonical idelic-to-ideal ray-class equivalence sends a +prime-to-modulus idèle class to the ideal ray class of its fractional +ideal. -/ +theorem rayClassGroupEquivIdealRayClassGroup_mk_primeTo + (m : RayClass.Modulus K) + (a : RayClass.idelePrimeToModulusSubgroup m) : + RayClass.rayClassGroupEquivIdealRayClassGroup m + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup m) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (a : IdeleGroup K))) = + RayClass.idealRayProjection m a := by + change + RayClass.quotientRaySubgroupEquivIdealRayClassGroup m + ((RayClass.quotientRaySubgroupEquivIdeleRayQuotient m).symm + (RayClass.rayClassGroupEquivIdeleQuotient m + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup m) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (a : IdeleGroup K))))) = + RayClass.idealRayProjection m a + rw [rayClassGroupEquivIdeleQuotient_mk_mk] + change + RayClass.quotientRaySubgroupEquivIdealRayClassGroup m + ((RayClass.quotientRaySubgroupEquivIdeleRayQuotient m).symm + (RayClass.primeToRayClassProjection m a)) = + RayClass.idealRayProjection m a + rw [← RayClass.quotientRaySubgroupEquivIdeleRayQuotient_mk m a, + MulEquiv.symm_apply_apply, + RayClass.quotientRaySubgroupEquivIdealRayClassGroup_mk] + +end GenericPrimeIdele + +variable {K : Type} [Field K] [NumberField K] + +/-- The ideal Artin map of the fractional ideal attached to a +prime-to-modulus idèle is its direct class in the idèle-class +quotient. This is the commuting square between the idelic and +ideal-theoretic ray-class constructions. -/ +theorem idealArtinMap_primeToIdealMap + (m : RayClass.Modulus K) + (N : Subgroup (IdeleClassGroup K)) + (hm : RayClass.Modulus.congruenceSubgroup m ≤ N) + (a : RayClass.idelePrimeToModulusSubgroup m) : + IdealClassFieldTheory.idealArtinMap m N hm + (RayClass.primeToIdealMap m a) = + QuotientGroup.mk' N + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (a : IdeleGroup K)) := by + let e := + RayClass.rayClassGroupEquivIdealRayClassGroup m + let c : RayClass.RayClassGroup m := + QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup m) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (a : IdeleGroup K)) + have he : + e c = RayClass.idealRayProjection m a := by + exact rayClassGroupEquivIdealRayClassGroup_mk_primeTo m a + have he' : + e.symm (RayClass.idealRayProjection m a) = c := by + rw [← he, e.symm_apply_apply] + change + IdealClassFieldTheory.rayClassToNormQuotient m N hm + (e.symm (RayClass.idealRayProjection m a)) = + QuotientGroup.mk' N + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (a : IdeleGroup K)) + rw [he', IdealClassFieldTheory.rayClassToNormQuotient_mk] + +/-- Outside a defining modulus, the ideal-theoretic Frobenius class is +the quotient class of the normalized one-place prime idèle. -/ +@[simp] +theorem idealFrobeniusClass_eq_finitePrimeIdeleClass + (m : RayClass.Modulus K) + (N : Subgroup (IdeleClassGroup K)) + (hm : RayClass.Modulus.congruenceSubgroup m ≤ N) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : + IdealClassFieldTheory.idealFrobeniusClass + m N hm v hv = + QuotientGroup.mk' N + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (finitePrimeIdele v)) := by + rw [IdealClassFieldTheory.idealFrobeniusClass, + ← primeToIdealMap_finitePrimeIdele m v hv, + idealArtinMap_primeToIdealMap] + +/-- The ideal Artin Frobenius class for the big Hilbert norm subgroup is +the canonical big-Hilbert Frobenius class. -/ +theorem bigHilbertIdealFrobeniusClass_eq_bigHilbertFrobeniusClass + (v : HeightOneSpectrum (𝓞 K)) : + IdealClassFieldTheory.idealFrobeniusClass + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)) + (bigHilbertClassFieldNormSubgroup (K := K)) + (bigHilbertClassFieldNormSubgroup_isDefiningModulus + (K := K)) + v (by simp) = + bigHilbertFrobeniusClass v := by + have hm : + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)).congruenceSubgroup ≤ + bigHilbertClassFieldNormSubgroup (K := K) := by + simpa only [IsDefiningModulus] using + (bigHilbertClassFieldNormSubgroup_isDefiningModulus (K := K)) + rw [idealFrobeniusClass_eq_finitePrimeIdeleClass (hm := hm)] + apply + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).injective + simpa only [bigHilbertFrobeniusClass, MulEquiv.apply_symm_apply] using + (bigHilbertClassFieldQuotientEquivNarrowClassGroup_mk + (K := K) (finitePrimeIdele v)) + +/-- The order of the big-Hilbert ideal Artin Frobenius is the order of +the corresponding narrow ideal class. -/ +theorem orderOf_bigHilbertIdealFrobeniusClass + (v : HeightOneSpectrum (𝓞 K)) : + orderOf + (IdealClassFieldTheory.idealFrobeniusClass + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)) + (bigHilbertClassFieldNormSubgroup (K := K)) + (bigHilbertClassFieldNormSubgroup_isDefiningModulus + (K := K)) + v (by simp)) = + orderOf + (QuotientGroup.mk' + (RayClass.narrowDenominator (K := K)) + (finitePrimeIdele v)) := by + rw [bigHilbertIdealFrobeniusClass_eq_bigHilbertFrobeniusClass] + exact + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).symm.orderOf_eq + (QuotientGroup.mk' + (RayClass.narrowDenominator (K := K)) + (finitePrimeIdele v)) + +/-- The big-Hilbert ideal Artin Frobenius is trivial exactly when its +prime ideal has a totally positive generator. -/ +theorem + bigHilbertIdealFrobeniusClass_eq_one_iff_exists_totallyPositiveGenerator + (v : HeightOneSpectrum (𝓞 K)) : + IdealClassFieldTheory.idealFrobeniusClass + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)) + (bigHilbertClassFieldNormSubgroup (K := K)) + (bigHilbertClassFieldNormSubgroup_isDefiningModulus + (K := K)) + v (by simp) = + 1 ↔ + ∃ x : Kˣ, + IdeleGroup.principalIdele K x ∈ + RayClass.idelePrimeToModulusSubgroup + (RayClass.Modulus.narrowOfFinite + (0 : RayClass.FiniteModulus K)) ∧ + toPrincipalIdeal (𝓞 K) K x = + FractionalIdealGroup.prime v := by + rw [ + bigHilbertIdealFrobeniusClass_eq_bigHilbertFrobeniusClass, + bigHilbertFrobeniusClass_eq_one_iff_exists_totallyPositiveGenerator] + +/-- The ideal Artin Frobenius class for the small Hilbert norm subgroup +is the canonical small-Hilbert Frobenius class. -/ +theorem smallHilbertIdealFrobeniusClass_eq_smallHilbertFrobeniusClass + (v : HeightOneSpectrum (𝓞 K)) : + IdealClassFieldTheory.idealFrobeniusClass + (0 : RayClass.Modulus K) + (smallHilbertClassFieldNormSubgroup (K := K)) + (smallHilbertClassFieldNormSubgroup_isDefiningModulus + (K := K)) + v (by simp) = + IdealClassFieldTheory.smallHilbertFrobeniusClass v := by + have hm : + (0 : RayClass.Modulus K).congruenceSubgroup ≤ + smallHilbertClassFieldNormSubgroup (K := K) := by + simpa only [IsDefiningModulus] using + (smallHilbertClassFieldNormSubgroup_isDefiningModulus (K := K)) + rw [idealFrobeniusClass_eq_finitePrimeIdeleClass (hm := hm)] + apply + (smallHilbertClassFieldQuotientEquivClassGroup + (K := K)).injective + simpa only [IdealClassFieldTheory.smallHilbertFrobeniusClass, + MulEquiv.apply_symm_apply, + smallHilbertClassFieldQuotientEquivClassGroup_mk] using + IdeleGroup.idealClass_finitePrimeIdele v + +/-- The order of the small-Hilbert ideal Artin Frobenius is the order of +the corresponding ordinary ideal class. -/ +theorem orderOf_smallHilbertIdealFrobeniusClass + (v : HeightOneSpectrum (𝓞 K)) : + orderOf + (IdealClassFieldTheory.idealFrobeniusClass + (0 : RayClass.Modulus K) + (smallHilbertClassFieldNormSubgroup (K := K)) + (smallHilbertClassFieldNormSubgroup_isDefiningModulus + (K := K)) + v (by simp)) = + orderOf + (ClassGroup.mk K + (FractionalIdealGroup.prime v)) := by + rw [smallHilbertIdealFrobeniusClass_eq_smallHilbertFrobeniusClass] + exact + (smallHilbertClassFieldQuotientEquivClassGroup + (K := K)).symm.orderOf_eq + (ClassGroup.mk K + (FractionalIdealGroup.prime v)) + +/-- The small-Hilbert ideal Artin Frobenius is trivial exactly when its +prime ideal is principal. -/ +theorem smallHilbertIdealFrobeniusClass_eq_one_iff_principal + (v : HeightOneSpectrum (𝓞 K)) : + IdealClassFieldTheory.idealFrobeniusClass + (0 : RayClass.Modulus K) + (smallHilbertClassFieldNormSubgroup (K := K)) + (smallHilbertClassFieldNormSubgroup_isDefiningModulus + (K := K)) + v (by simp) = + 1 ↔ + FractionalIdealGroup.prime v ∈ + (toPrincipalIdeal (𝓞 K) K).range := by + rw [smallHilbertIdealFrobeniusClass_eq_smallHilbertFrobeniusClass] + exact + IdealClassFieldTheory.splitsCompletelyInSmallHilbertClassField_iff_principal v + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupFieldAntitone.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupFieldAntitone.lean new file mode 100644 index 0000000000..bd942c1109 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupFieldAntitone.lean @@ -0,0 +1,54 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization +/-! +# Subgroup order and chosen ray class fields + +The selected field of a larger ray-class subgroup is contained in that of +a smaller subgroup, as actual subfields of the fixed separable closure. +-/ + +@[expose] public section + +open scoped NumberField +noncomputable +section + +namespace ClassFieldTheory + +open scoped Classical in +/-- For one modulus, inclusion of ray-class subgroups reverses inclusion of +their selected class fields inside the fixed separable closure. -/ +theorem chosenRayClassSubgroupSubfield_antitone + (K : Type) [Field K] [NumberField K] + (m : RayClassModulus K) + {H J : Subgroup (RayClassGroup m)} (hHJ : H ≤ J) : + GlobalClassFieldTheory.GlobalClassFields.rayClassSubgroupSubfield + (K := K) (GlobalClassFieldComparison.rayClassModulusToOriginal K m) + (J.map (GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m).toMonoidHom) ≤ + GlobalClassFieldTheory.GlobalClassFields.rayClassSubgroupSubfield + (K := K) (GlobalClassFieldComparison.rayClassModulusToOriginal K m) + (H.map (GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m).toMonoidHom) := by + let m' := GlobalClassFieldComparison.rayClassModulusToOriginal K m + let e := GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m + have hmap : H.map e.toMonoidHom ≤ J.map e.toMonoidHom := + Subgroup.map_mono hHJ + have hfixed : + GlobalClassFieldTheory.GlobalClassFields.rayClassSubgroupFixedField + (K := K) m' (J.map e.toMonoidHom) ≤ + GlobalClassFieldTheory.GlobalClassFields.rayClassSubgroupFixedField + (K := K) m' (H.map e.toMonoidHom) := by + exact IntermediateField.fixedField_le (Subgroup.map_mono hmap) + exact + IntermediateField.map_mono + (GlobalClassFieldTheory.GlobalClassFields.rayClassFieldEmbedding K m') + hfixed + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupPrimeArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupPrimeArtin.lean new file mode 100644 index 0000000000..c1d785ea83 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupPrimeArtin.lean @@ -0,0 +1,185 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin +/-! +# Arithmetic prime Artin symbols on ray-class fixed fields + +Arithmetic reciprocity on a ray-class fixed field agrees, at each ordinary +prime idèle, with the arithmetic global Artin symbol of that field. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain IdeleGroup Reciprocity + +open scoped Classical in +private theorem arithmeticFinitePlacePrimeArtin_restrict_tower + (K L E : Type) [Field K] [Field L] [Field E] + [NumberField K] [NumberField L] [NumberField E] + [Algebra K L] [Algebra K E] [Algebra E L] [IsScalarTower K E L] + [IsAbelianGalois K L] [IsAbelianGalois K E] + (v : HeightOneSpectrum (𝓞 K)) : + AlgEquiv.restrictNormalHom E + (arithmeticFinitePlacePrimeArtin (K := K) (L := L) v) = + arithmeticFinitePlacePrimeArtin (K := K) (L := E) v := by + rw [arithmeticFinitePlacePrimeArtin_eq_inv (K := K) (L := L) v, + arithmeticFinitePlacePrimeArtin_eq_inv (K := K) (L := E) v, map_inv] + simpa only [finitePlacePrimeArtin, MonoidHom.comp_apply] using + congrArg Inv.inv + (DFunLike.congr_fun + (Reciprocity.globalArtinMonoidHom_restrict_tower + (K := K) (L := L) (E := E)) + (IdeleGroup.finitePrimeIdele v)) + +open scoped Classical in +private theorem rayClassFieldGaloisEquivRayClassGroup_symm_mk + {K : Type} [Field K] [NumberField K] + (m : RayClass.Modulus K) (c : IdeleClassGroup K) : + (rayClassFieldGaloisEquivRayClassGroup (K := K) m).symm + (QuotientGroup.mk' m.congruenceSubgroup c) = + globalNormResidueMonoidHom K (rayClassField K m) c := by + apply (rayClassFieldGaloisEquivRayClassGroup (K := K) m).symm_apply_eq.mpr + exact (rayClassFieldGaloisEquivRayClassGroup_globalNormResidue + (K := K) m c).symm + +open scoped Classical in +private theorem rayClassField_arithmeticFinitePlacePrimeArtin + {K : Type} [Field K] [NumberField K] + (m : RayClass.Modulus K) + (v : HeightOneSpectrum (𝓞 K)) : + (rayClassFieldGaloisEquivRayClassGroup (K := K) m).symm + ((QuotientGroup.mk' m.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v)))⁻¹) = + arithmeticFinitePlacePrimeArtin (K := K) (L := rayClassField K m) v := by + let c : IdeleClassGroup K := + QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v) + have hgeo := rayClassFieldGaloisEquivRayClassGroup_symm_mk m c + have hnormprime : + Reciprocity.arithmeticGlobalNormResidueMonoidHom K (rayClassField K m) c = + arithmeticFinitePlacePrimeArtin (K := K) (L := rayClassField K m) v := by + simpa only [c, arithmeticFinitePlacePrimeArtin, MonoidHom.comp_apply] using + DFunLike.congr_fun + (Reciprocity.arithmeticGlobalNormResidueMonoidHom_comp_ideleClassQuotient_eq_globalArtin + (K := K) (L := rayClassField K m)) + (IdeleGroup.finitePrimeIdele v) + change (rayClassFieldGaloisEquivRayClassGroup (K := K) m).symm + ((QuotientGroup.mk' m.congruenceSubgroup c)⁻¹) = _ + rw [map_inv, hgeo] + exact (Reciprocity.arithmeticGlobalNormResidueMonoidHom_apply + K (rayClassField K m) c).symm.trans hnormprime + +open scoped Classical in +private theorem rayClassSubgroup_restrict_transport + {K : Type} [Field K] [NumberField K] + (m : RayClass.Modulus K) + (H : Subgroup (RayClass.RayClassGroup m)) + (σ : rayClassField K m ≃ₐ[K] rayClassField K m) : + let F := rayClassSubgroupFixedField (K := K) m H + let E := rayClassSubgroupSubextension (K := K) m H + let α : F ≃ₐ[K] E := + IntermediateField.equivMap F (rayClassFieldEmbedding K m) + let f : E →ₐ[K] rayClassField K m := + (IntermediateField.val F).comp α.symm.toAlgHom + let _ : Algebra E (rayClassField K m) := f.toRingHom.toAlgebra + let _ : IsScalarTower K E (rayClassField K m) := + IsScalarTower.of_algebraMap_eq fun x => (f.commutes x).symm + (AlgEquiv.autCongr α) (AlgEquiv.restrictNormalHom F σ) = + AlgEquiv.restrictNormalHom E σ := by + let F := rayClassSubgroupFixedField (K := K) m H + let L := rayClassField K m + let E := rayClassSubgroupSubextension (K := K) m H + let α : F ≃ₐ[K] E := + IntermediateField.equivMap F (rayClassFieldEmbedding K m) + let f : E →ₐ[K] L := + (IntermediateField.val F).comp α.symm.toAlgHom + let : Algebra E L := f.toRingHom.toAlgebra + let : IsScalarTower K E L := + IsScalarTower.of_algebraMap_eq fun x => (f.commutes x).symm + change (AlgEquiv.autCongr α) (AlgEquiv.restrictNormalHom F σ) = + AlgEquiv.restrictNormalHom E σ + apply AlgEquiv.ext + intro x + apply f.injective + change f (α ((AlgEquiv.restrictNormalHom F σ) (α.symm x))) = + f ((AlgEquiv.restrictNormalHom E σ) x) + calc + f (α ((AlgEquiv.restrictNormalHom F σ) (α.symm x))) = + F.val ((AlgEquiv.restrictNormalHom F σ) (α.symm x)) := by + simp [f] + _ = σ (F.val (α.symm x)) := + AlgEquiv.restrictNormalHom_apply F σ (α.symm x) + _ = f ((AlgEquiv.restrictNormalHom E σ) x) := by + exact (AlgEquiv.restrictNormal_commutes σ E x).symm + +open scoped Classical in +/-- The fixed-field ray-class Artin map sends the ray class of an ordinary +prime idèle to the arithmetic global Artin element of the fixed field. -/ +theorem rayClassSubgroupArtin_finitePrimeIdele + {K : Type} [Field K] [NumberField K] + (m : RayClass.Modulus K) + (H : Subgroup (RayClass.RayClassGroup m)) + (v : HeightOneSpectrum (𝓞 K)) : + rayClassSubgroupArtin (K := K) m H + (QuotientGroup.mk' m.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v))) = + arithmeticFinitePlacePrimeArtin (K := K) + (L := rayClassSubgroupSubextension (K := K) m H) v := by + let F := rayClassSubgroupFixedField (K := K) m H + let L := rayClassField K m + let E := rayClassSubgroupSubextension (K := K) m H + let α : F ≃ₐ[K] E := + IntermediateField.equivMap F (rayClassFieldEmbedding K m) + let e := rayClassFieldGaloisEquivRayClassGroup (K := K) m + let c : IdeleClassGroup K := + QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v) + let q : RayClass.RayClassGroup m := + QuotientGroup.mk' m.congruenceSubgroup c + let f : E →ₐ[K] L := + (IntermediateField.val F).comp α.symm.toAlgHom + let : Algebra E L := f.toRingHom.toAlgebra + let : IsScalarTower K E L := + IsScalarTower.of_algebraMap_eq fun x => (f.commutes x).symm + have hprime : + e.symm q⁻¹ = arithmeticFinitePlacePrimeArtin (K := K) (L := L) v := by + simpa only [e, q, c, L] using + rayClassField_arithmeticFinitePlacePrimeArtin m v + change (AlgEquiv.autCongr α) + (AlgEquiv.restrictNormalHom F (e.symm q⁻¹)) = + arithmeticFinitePlacePrimeArtin (K := K) (L := E) v + calc + (AlgEquiv.autCongr α) + (AlgEquiv.restrictNormalHom F (e.symm q⁻¹)) = + (AlgEquiv.autCongr α) + (AlgEquiv.restrictNormalHom F + (arithmeticFinitePlacePrimeArtin (K := K) (L := L) v)) := + congrArg (fun σ : L ≃ₐ[K] L => + (AlgEquiv.autCongr α) (AlgEquiv.restrictNormalHom F σ)) hprime + _ = AlgEquiv.restrictNormalHom E + (arithmeticFinitePlacePrimeArtin (K := K) (L := L) v) := + rayClassSubgroup_restrict_transport m H + (arithmeticFinitePlacePrimeArtin (K := K) (L := L) v) + _ = arithmeticFinitePlacePrimeArtin (K := K) (L := E) v := + arithmeticFinitePlacePrimeArtin_restrict_tower K L E v + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayFrobeniusRigidity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayFrobeniusRigidity.lean new file mode 100644 index 0000000000..cfc2ecb3bf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayFrobeniusRigidity.lean @@ -0,0 +1,258 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorInfinitePart +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayPrimeGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +/-! +# Rigidity of Frobenius-normalized ray reciprocity + +An isomorphism from a ray class group to the Galois group of a finite abelian +extension which sends every prime class to its genuine arithmetic Artin +symbol forces the ray modulus to be defining for that extension. The proof +compares the given map and genuine global reciprocity at a common multiple +of the given modulus and the extension's full conductor. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory.GlobalClassFields + +open scoped Classical in +private theorem rayRigidity_ideleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] rayRigidity_ideleClassGroupIsMulCommutative + +open scoped Classical in +/-- Frobenius normalization on all primes away from a modulus forces that +modulus to define the genuine norm subgroup of a finite abelian extension. -/ +theorem rayModulus_isDefining_of_arithmeticPrimeArtinEquiv + {K L : Type} [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + (m : RayClass.Modulus K) + (e : RayClass.RayClassGroup m ≃* (L ≃ₐ[K] L)) + (hprime : ∀ (v : HeightOneSpectrum (𝓞 K)) + (_ : v ∉ m.finitePart.support), + e (QuotientGroup.mk' m.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v))) = + arithmeticFinitePlacePrimeArtin (K := K) (L := L) v) : + m.congruenceSubgroup ≤ (_root_.ideleClassNorm K L).range := by + let H := ideleClassNormConductorialSubgroup (K := K) (L := L) + let c := H.fullConductor + let n := c ⊔ m + have hcn : c ≤ n := le_sup_left + have hmn : m ≤ n := le_sup_right + have hnNorm : n.congruenceSubgroup ≤ + (_root_.ideleClassNorm K L).range := + (RayClass.Modulus.congruenceSubgroup_antitone hcn).trans + H.fullConductor_isDefiningModulus + have hnm : n.congruenceSubgroup ≤ m.congruenceSubgroup := + RayClass.Modulus.congruenceSubgroup_antitone hmn + let qNorm : RayClass.RayClassGroup n →* + IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range := + QuotientGroup.map n.congruenceSubgroup + ((_root_.ideleClassNorm K L).range) + (MonoidHom.id (IdeleClassGroup K)) + (fun _ hx => hnNorm hx) + let qRay : RayClass.RayClassGroup n →* RayClass.RayClassGroup m := + QuotientGroup.map n.congruenceSubgroup m.congruenceSubgroup + (MonoidHom.id (IdeleClassGroup K)) + (fun _ hx => hnm hx) + let genuine : RayClass.RayClassGroup n →* (L ≃ₐ[K] L) := + (Reciprocity.arithmeticGlobalNormResidueContinuousMulEquiv K L).toMulEquiv.toMonoidHom.comp + qNorm + let proposed : RayClass.RayClassGroup n →* (L ≃ₐ[K] L) := + e.toMonoidHom.comp qRay + have hEq : genuine = proposed := by + apply rayClassGroup_hom_ext_finitePrime n + intro v hvn + have hvm : v ∉ m.finitePart.support := by + intro hv + exact hvn ((Finsupp.support_mono hmn.1) hv) + change Reciprocity.arithmeticGlobalNormResidueMonoidHom K L + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v)) = + e (QuotientGroup.mk' m.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v))) + rw [hprime v hvm] + exact DFunLike.congr_fun + (Reciprocity.arithmeticGlobalNormResidueMonoidHom_comp_ideleClassQuotient_eq_globalArtin + (K := K) (L := L)) (IdeleGroup.finitePrimeIdele v) + intro x hx + have hRay : qRay (QuotientGroup.mk' n.congruenceSubgroup x) = 1 := by + change QuotientGroup.mk' m.congruenceSubgroup x = 1 + rw [QuotientGroup.mk'_apply, QuotientGroup.eq_one_iff] + exact hx + have hArtin : Reciprocity.arithmeticGlobalNormResidueMonoidHom K L x = 1 := by + have h := DFunLike.congr_fun hEq + (QuotientGroup.mk' n.congruenceSubgroup x) + change Reciprocity.arithmeticGlobalNormResidueMonoidHom K L x = + e (qRay (QuotientGroup.mk' n.congruenceSubgroup x)) at h + rw [hRay, map_one] at h + exact h + rw [← MonoidHom.mem_ker, + Reciprocity.arithmeticGlobalNormResidueMonoidHom_ker] at hArtin + exact hArtin + +open scoped Classical in +/-- A Frobenius-normalized ray-class *isomorphism* also identifies the +extension's genuine norm subgroup exactly with the ray congruence subgroup. +The reverse inclusion follows because the induced quotient map is a +surjection between finite groups of the same order. -/ +theorem rayModulus_normSubgroup_eq_of_arithmeticPrimeArtinEquiv + {K L : Type} [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + (m : RayClass.Modulus K) + (e : RayClass.RayClassGroup m ≃* (L ≃ₐ[K] L)) + (hprime : ∀ (v : HeightOneSpectrum (𝓞 K)) + (_ : v ∉ m.finitePart.support), + e (QuotientGroup.mk' m.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v))) = + arithmeticFinitePlacePrimeArtin (K := K) (L := L) v) : + (_root_.ideleClassNorm K L).range = m.congruenceSubgroup := by + have hle : m.congruenceSubgroup ≤ + (_root_.ideleClassNorm K L).range := + rayModulus_isDefining_of_arithmeticPrimeArtinEquiv m e hprime + let q : RayClass.RayClassGroup m →* + IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range := + QuotientGroup.map m.congruenceSubgroup + ((_root_.ideleClassNorm K L).range) + (MonoidHom.id (IdeleClassGroup K)) + (fun _ hx => hle hx) + have hqSurj : Function.Surjective q := by + intro y + obtain ⟨x, rfl⟩ := + QuotientGroup.mk'_surjective ((_root_.ideleClassNorm K L).range) y + exact ⟨QuotientGroup.mk' m.congruenceSubgroup x, rfl⟩ + have hcard : Nat.card (RayClass.RayClassGroup m) = + Nat.card (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) := + (Nat.card_congr e.toEquiv).trans + (Nat.card_congr + (Reciprocity.arithmeticGlobalNormResidueContinuousMulEquiv K L).toEquiv.symm) + have hqInj : Function.Injective q := + (hqSurj.bijective_of_nat_card_le hcard.le).1 + apply le_antisymm + · intro x hx + have hqx : q (QuotientGroup.mk' m.congruenceSubgroup x) = 1 := by + change QuotientGroup.mk' ((_root_.ideleClassNorm K L).range) x = 1 + rw [QuotientGroup.mk'_apply, QuotientGroup.eq_one_iff] + exact hx + have hx' : QuotientGroup.mk' m.congruenceSubgroup x = 1 := + hqInj (hqx.trans (map_one q).symm) + rw [QuotientGroup.mk'_apply, QuotientGroup.eq_one_iff] at hx' + exact hx' + · exact hle + +open scoped Classical in +/-- Frobenius normalization away from the modulus determines the value of +the ray Artin map on every idèle class, including classes supported at a +ramified place. The normalization here is arithmetic Frobenius. -/ +theorem rayArtin_comp_ideleClass_eq_arithmeticGlobalNormResidue + {K L : Type} [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + (m : RayClass.Modulus K) + (artin : RayClass.RayClassGroup m →* (L ≃ₐ[K] L)) + (hprime : ∀ (v : HeightOneSpectrum (𝓞 K)) + (_ : v ∉ m.finitePart.support), + artin (QuotientGroup.mk' m.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v))) = + arithmeticFinitePlacePrimeArtin (K := K) (L := L) v) + (x : IdeleClassGroup K) : + artin (QuotientGroup.mk' m.congruenceSubgroup x) = + Reciprocity.arithmeticGlobalNormResidueMonoidHom K L x := by + let H := ideleClassNormConductorialSubgroup (K := K) (L := L) + let c := H.fullConductor + let n := c ⊔ m + have hcn : c ≤ n := le_sup_left + have hmn : m ≤ n := le_sup_right + have hnNorm : n.congruenceSubgroup ≤ + (_root_.ideleClassNorm K L).range := + (RayClass.Modulus.congruenceSubgroup_antitone hcn).trans + H.fullConductor_isDefiningModulus + have hnm : n.congruenceSubgroup ≤ m.congruenceSubgroup := + RayClass.Modulus.congruenceSubgroup_antitone hmn + let qNorm : RayClass.RayClassGroup n →* + IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range := + QuotientGroup.map n.congruenceSubgroup + ((_root_.ideleClassNorm K L).range) + (MonoidHom.id (IdeleClassGroup K)) + (fun _ hx => hnNorm hx) + let qRay : RayClass.RayClassGroup n →* RayClass.RayClassGroup m := + QuotientGroup.map n.congruenceSubgroup m.congruenceSubgroup + (MonoidHom.id (IdeleClassGroup K)) + (fun _ hx => hnm hx) + let genuine : RayClass.RayClassGroup n →* (L ≃ₐ[K] L) := + (Reciprocity.arithmeticGlobalNormResidueContinuousMulEquiv K L).toMulEquiv.toMonoidHom.comp + qNorm + let proposed : RayClass.RayClassGroup n →* (L ≃ₐ[K] L) := + artin.comp qRay + have hEq : genuine = proposed := by + apply rayClassGroup_hom_ext_finitePrime n + intro v hvn + have hvm : v ∉ m.finitePart.support := by + intro hv + exact hvn ((Finsupp.support_mono hmn.1) hv) + change Reciprocity.arithmeticGlobalNormResidueMonoidHom K L + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v)) = + artin (QuotientGroup.mk' m.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v))) + rw [hprime v hvm] + exact DFunLike.congr_fun + (Reciprocity.arithmeticGlobalNormResidueMonoidHom_comp_ideleClassQuotient_eq_globalArtin + (K := K) (L := L)) (IdeleGroup.finitePrimeIdele v) + have hx := DFunLike.congr_fun hEq + (QuotientGroup.mk' n.congruenceSubgroup x) + change Reciprocity.arithmeticGlobalNormResidueMonoidHom K L x = + artin (QuotientGroup.mk' m.congruenceSubgroup x) at hx + exact hx.symm + +open scoped Classical in +/-- A Frobenius-normalized ray Artin homomorphism has kernel precisely the +image of the genuine idèle-class norm subgroup in the ray quotient. Unlike +the ray-class-field case, the homomorphism need not be injective. -/ +theorem rayModulus_normSubgroup_eq_artinKer_preimage + {K L : Type} [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + (m : RayClass.Modulus K) + (artin : RayClass.RayClassGroup m →* (L ≃ₐ[K] L)) + (hprime : ∀ (v : HeightOneSpectrum (𝓞 K)) + (_ : v ∉ m.finitePart.support), + artin (QuotientGroup.mk' m.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v))) = + arithmeticFinitePlacePrimeArtin (K := K) (L := L) v) : + (_root_.ideleClassNorm K L).range = + artin.ker.comap (QuotientGroup.mk' m.congruenceSubgroup) := by + ext x + rw [← Reciprocity.arithmeticGlobalNormResidueMonoidHom_ker] + change Reciprocity.arithmeticGlobalNormResidueMonoidHom K L x = 1 ↔ + artin (QuotientGroup.mk' m.congruenceSubgroup x) = 1 + rw [rayArtin_comp_ideleClass_eq_arithmeticGlobalNormResidue + m artin hprime x] + +end GlobalClassFieldTheory.GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayPrimeGeneration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayPrimeGeneration.lean new file mode 100644 index 0000000000..dd00a919e9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayPrimeGeneration.lean @@ -0,0 +1,88 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele +/-! +# Frobenius generation of ray class groups + +Prime idèle classes away from a modulus determine homomorphisms out of the +ray class group. This follows from factorization of prime-to-modulus +fractional ideals and the idelic-to-ideal ray-class equivalence. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory.GlobalClassFields + +universe u v + +open scoped Classical in +/-- Two homomorphisms out of a ray class group agree if they agree on the +normalized prime idèle classes away from its modulus. -/ +theorem rayClassGroup_hom_ext_finitePrime + {K : Type u} [Field K] [NumberField K] + (m : RayClass.Modulus K) + {G : Type v} [CommGroup G] + (f g : RayClass.RayClassGroup m →* G) + (hprime : ∀ (v : HeightOneSpectrum (𝓞 K)) + (_ : v ∉ m.finitePart.support), + f (QuotientGroup.mk' m.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v))) = + g (QuotientGroup.mk' m.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v)))) : + f = g := by + let e := RayClass.rayClassGroupEquivIdealRayClassGroup m + let q : RayClass.primeToModulusIdeals m →* + RayClass.IdealRayClassGroup m := + QuotientGroup.mk' (RayClass.principalRayIdealSubgroup m) + have hprimeIdeal (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : + e.symm (q (RayClass.primeToModulusIdeal m v hv)) = + QuotientGroup.mk' m.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v)) := by + apply e.injective + rw [e.apply_symm_apply] + calc + q (RayClass.primeToModulusIdeal m v hv) = + RayClass.idealRayProjection m + ⟨IdeleGroup.finitePrimeIdele v, + finitePrimeIdele_mem_idelePrimeToModulusSubgroup m v hv⟩ := + (idealRayProjection_finitePrimeIdele m v hv).symm + _ = e (QuotientGroup.mk' m.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v))) := + (rayClassGroupEquivIdealRayClassGroup_mk_primeTo m + ⟨IdeleGroup.finitePrimeIdele v, + finitePrimeIdele_mem_idelePrimeToModulusSubgroup m v hv⟩).symm + have hcomp : + f.comp (e.symm.toMonoidHom.comp q) = + g.comp (e.symm.toMonoidHom.comp q) := by + apply RayClass.primeToModulusIdeals_hom_ext m + intro v hv + change f (e.symm (q (RayClass.primeToModulusIdeal m v hv))) = + g (e.symm (q (RayClass.primeToModulusIdeal m v hv))) + rw [hprimeIdeal v hv] + exact hprime v hv + apply MonoidHom.ext + intro x + obtain ⟨y, rfl⟩ := e.symm.surjective x + obtain ⟨I, rfl⟩ := QuotientGroup.mk'_surjective + (RayClass.principalRayIdealSubgroup m) y + exact DFunLike.congr_fun hcomp I + +end GlobalClassFieldTheory.GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean new file mode 100644 index 0000000000..e1f6a9db16 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean @@ -0,0 +1,533 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.PrimePowerKummerIndex +/-! +# The full S-unit Kummer norm core + +Starting from a prescribed finite set of finite places, we enlarge it by +a fixed idelic support and by a chosen support of the exponent. For this +enlarged set, a principal idele satisfies the local power conditions exactly +when it is the power of an `S`-unit. Consequently the associated idele-class +power quotient has the same cardinality as the Galois group of the full +`S`-unit Kummer extension. + +These are the two concrete cardinal ingredients in the class-field existence +argument. +-/ + +@[expose] public section + +open scoped NumberField BigOperators + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain +open GlobalClassFieldTheory.ClassFieldAxiom +open KummerTheory + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- If `K` contains the `n`-th roots of unity and `n > 1`, then either +`n` is even or `K` has no real infinite places. This is exactly the +archimedean condition needed to place all local `n`-th powers in the +infinite norm subgroup. -/ +theorem even_or_no_realInfinitePlace_of_primitiveRoots + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hn : 1 < (n : ℕ)) : + Even (n : ℕ) ∨ + ∀ w : InfinitePlace K, ¬ w.IsReal := by + by_cases hnEven : Even (n : ℕ) + · exact Or.inl hnEven + · refine Or.inr ?_ + have hnNeTwo : (n : ℕ) ≠ 2 := by + intro hnTwo + apply hnEven + rw [hnTwo] + exact ⟨1, by omega⟩ + have hnLarge : 2 < (n : ℕ) := by + omega + obtain ⟨zeta, hzeta⟩ := hmu + have hzetaPrimitive : + IsPrimitiveRoot zeta (n : ℕ) := + (mem_primitiveRoots n.pos).mp hzeta + have hRealZero : + InfinitePlace.nrRealPlaces K = 0 := + InfinitePlace.IsPrimitiveRoot.nrRealPlaces_eq_zero_of_two_lt + hnLarge hzetaPrimitive + intro w hwReal + have hRealPos : + 0 < InfinitePlace.nrRealPlaces K := + Fintype.card_pos_iff.mpr ⟨⟨w, hwReal⟩⟩ + omega + +open scoped Classical in +/-- The chosen finite support used for the full `S`-unit Kummer +construction: it contains the prescribed seed, a support large enough to +represent every idele class, and the finite support of the exponent. -/ +noncomputable def sUnitKummerNormSupport + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Finset (HeightOneSpectrum (𝓞 K)) := + let hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let nUnit : Kˣ := Units.mk0 ((n : ℕ) : K) hnK + (S ∪ IdeleGroup.sufficientlyLargeFiniteSet (K := K)) ∪ + chosenUnitFiniteSupport (K := K) nUnit + +open scoped Classical in +/-- The prescribed seed is contained in the chosen Kummer norm +support. -/ +theorem subset_sUnitKummerNormSupport + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + S ⊆ sUnitKummerNormSupport (K := K) n S := by + intro v hv + exact Finset.mem_union_left _ + (Finset.mem_union_left _ hv) + +open scoped Classical in +/-- Away from the chosen Kummer norm support, the exponent is a local +unit. This is the local input needed for the unramifiedness of the full +`S`-unit Kummer extension. -/ +theorem valuation_natCast_eq_one_of_not_mem_sUnitKummerNormSupport + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) + {w : HeightOneSpectrum (𝓞 K)} + (hw : w ∉ sUnitKummerNormSupport (K := K) n S) : + w.valuation K ((n : ℕ) : K) = 1 := by + let hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let nUnit : Kˣ := Units.mk0 ((n : ℕ) : K) hnK + have hwSupport : + w ∉ chosenUnitFiniteSupport (K := K) nUnit := by + intro hwSupport + apply hw + exact Finset.mem_union_right _ hwSupport + have hnUnitVal : + w.valuation K (nUnit : K) = 1 := + (mem_SUnitGroup_iff + (K := K) + (chosenUnitFiniteSupport (K := K) nUnit) nUnit).mp + (mem_sUnitGroup_chosenUnitFiniteSupport + (K := K) nUnit) + w hwSupport + change w.valuation K ((n : ℕ) : K) = 1 at hnUnitVal + exact hnUnitVal + +open scoped Classical in +/-- Every finite place dividing the exponent belongs to the chosen +Kummer norm support. -/ +theorem mem_sUnitKummerNormSupport_of_asIdeal_dvd_natCast + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) + {w : HeightOneSpectrum (𝓞 K)} + (hw : w.asIdeal ∣ Ideal.span {((n : ℕ) : 𝓞 K)}) : + w ∈ sUnitKummerNormSupport (K := K) n S := by + by_contra hwSupport + have hnValLt : + w.valuation K ((n : ℕ) : K) < 1 := by + simpa using + (IsDedekindDomain.HeightOneSpectrum.valuation_lt_one_iff_dvd + (K := K) w ((n : ℕ) : 𝓞 K)).2 hw + exact + (ne_of_lt hnValLt) + (valuation_natCast_eq_one_of_not_mem_sUnitKummerNormSupport + (K := K) n S hwSupport) + +open scoped Classical in +/-- The chosen Kummer norm support is large enough to represent every +idele class by an idele supported on it. -/ +theorem supportedAt_sUnitKummerNormSupport_sup_principalSubgroup_eq_top + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + IdeleGroup.supportedAt + (K := K) + (sUnitKummerNormSupport (K := K) n S : Set _) ⊔ + IdeleGroup.principalSubgroup K = + ⊤ := by + apply top_unique + rw [ + ← IdeleGroup.supportedAt_sup_principalSubgroup_eq_top + (K := K)] + apply sup_le_sup + · apply IdeleGroup.supportedAt_mono + intro v hv + exact Finset.mem_union_left _ + (Finset.mem_union_right _ hv) + · exact le_rfl + +/-- A root of a unit descends along a surjective field homomorphism. -/ +private theorem unit_mem_power_range_of_surjective + {F E : Type*} [Field F] [Field E] (f : F →+* E) + (hf : Function.Surjective f) (n : ℕ) (b : Fˣ) (beta : Eˣ) + (hbeta : beta ^ n = Units.map f.toMonoidHom b) : + b ∈ (powMonoidHom n : Fˣ →* Fˣ).range := by + obtain ⟨x, hx⟩ := hf (beta : E) + have hx_ne : x ≠ 0 := by + intro hzero + apply beta.ne_zero + rw [← hx, hzero, map_zero] + refine ⟨Units.mk0 x hx_ne, ?_⟩ + apply Units.ext + apply f.injective + change f (x ^ n) = f (b : F) + rw [map_pow, hx] + exact congrArg Units.val hbeta + +open scoped Classical in +open _root_.KummerTheory + (chosenSimpleKummerExtension_infiniteTensorNormSubgroup_eq_top_of_mem_nthPowerSubgroup) in +/-- On the chosen Kummer norm support, the principal part of the +local power subgroup consists exactly of powers of `S`-units. -/ +theorem + principalIdelePowerLocalUnitSubgroup_eq_sUnitNthPowers_on_kummerNormSupport + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + let S' := sUnitKummerNormSupport (K := K) n S + principalIdelePowerLocalUnitSubgroup (K := K) n S' ∅ = + sUnitNthPowersInField (K := K) n S' := by + classical + dsimp only + let hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let S' := sUnitKummerNormSupport (K := K) n S + change + principalIdelePowerLocalUnitSubgroup (K := K) n S' ∅ = + sUnitNthPowersInField (K := K) n S' + have hLarge := supportedAt_sUnitKummerNormSupport_sup_principalSubgroup_eq_top + (K := K) n S + apply le_antisymm + · intro b hb + have hbData := + (mem_idelePowerLocalUnitSubgroup_iff + (K := K) n S' ∅ + (IdeleGroup.principalIdele K b)).mp hb + have hbSUnit : + b ∈ SUnitGroup (K := K) S' := by + simpa only [Finset.union_empty] using + (principalIdelePowerLocalUnitSubgroup_le_sUnitGroup + (K := K) n S' ∅ hb) + let M := KummerTheory.chosenSimpleKummerExtension K n hnK b + let : FiniteDimensional K M := + KummerTheory.chosenSimpleKummerExtension_finiteDimensional + K n hnK b + let : IsAbelianGalois K M := + KummerTheory.chosenSimpleKummerExtension_isAbelianGalois + K n hnK hmu b + let : NumberField M := + NumberField.of_module_finite K M + let : (RelativeIdeleGroup.principalSubgroup K M).Normal := + ⟨fun x hx g => by + have hconj : g * x * g⁻¹ = x := by + rw [mul_comm g x, mul_assoc, mul_inv_cancel, mul_one] + rwa [hconj]⟩ + have hSplitS : + ∀ w : HeightOneSpectrum (𝓞 K), w ∈ S' → + _root_.FinitePlaceSplitsCompletely + (K := K) (L := M) w := by + intro w hw + have hbLocal := hbData.2.1 w hw + have hprincipal : + IdeleGroup.finiteComponent w + (IdeleGroup.principalIdele K b) = + Units.map + (algebraMap K (w.adicCompletion K)).toMonoidHom b := by + apply Units.ext + rfl + rw [hprincipal] at hbLocal + simpa only [M] using + KummerTheory.chosenSimpleKummerExtension_finitePlaceSplitsCompletely_of_mem_nthPowerSubgroup + (K := K) n hnK hmu b w hbLocal + have hInfiniteTop : + ∀ w : InfinitePlace K, + _root_.infiniteTensorNormSubgroup + (K := K) (L := M) w = ⊤ := by + intro w + have hbLocal := hbData.1 w + have hprincipal : + IdeleGroup.infiniteComponent w + (IdeleGroup.principalIdele K b) = + Units.map + (algebraMap K w.Completion).toMonoidHom b := by + apply Units.ext + rfl + rw [hprincipal] at hbLocal + simpa only [M] using + chosenSimpleKummerExtension_infiniteTensorNormSubgroup_eq_top_of_mem_nthPowerSubgroup + (K := K) n hnK hmu b w hbLocal + have hAway : + ∀ w : HeightOneSpectrum (𝓞 K), w ∉ S' → + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := M) w := by + intro w hw + have hbVal : + w.valuation K (b : K) = 1 := + (mem_SUnitGroup_iff + (K := K) S' b).mp hbSUnit w hw + have hnVal : + w.valuation K ((n : ℕ) : K) = 1 := by + exact + valuation_natCast_eq_one_of_not_mem_sUnitKummerNormSupport + (K := K) n S hw + simpa only [M] using + KummerTheory.chosenSimpleKummerExtension_chosenFinitePlaceIsUnramified_of_valuation_eq_one + (K := K) n hnK hmu b w hbVal hnVal + have hNormTop : + (RelativeIdeleGroup.Cohomology.ideleClassNorm K M).range = + ⊤ := by + apply top_unique + intro c _ + obtain ⟨a, rfl⟩ := + QuotientGroup.mk'_surjective + (IdeleGroup.principalSubgroup K) c + have ha : + a ∈ + IdeleGroup.supportedAt + (K := K) + (S' : Set (HeightOneSpectrum (𝓞 K))) ⊔ + IdeleGroup.principalSubgroup K := by + rw [hLarge] + exact Subgroup.mem_top a + rcases Subgroup.mem_sup.mp ha with + ⟨u, hu, q, hq, huq⟩ + have hInfinite : + ∀ w : InfinitePlace K, + IdeleGroup.infiniteComponent w u ∈ + _root_.infiniteTensorNormSubgroup + (K := K) (L := M) w := by + intro w + rw [hInfiniteTop w] + exact Subgroup.mem_top _ + have hFinite : + ∀ w : HeightOneSpectrum (𝓞 K), + IdeleGroup.finiteComponent w u ∈ + (localTensorNorm + (K := K) (L := M) w).range := by + intro w + rw [ + _root_.finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup + (K := K) (L := M) w] + by_cases hwS : w ∈ S' + · rw [ + _root_.chosenFinitePlaceLocalNormSubgroup_eq_top_of_splitsCompletely + (K := K) (L := M) w (hSplitS w hwS)] + exact Subgroup.mem_top _ + · apply + _root_.adicCompletionIntegerUnits_le_chosenFinitePlaceLocalNormSubgroup + (K := K) (L := M) w (hAway w hwS) + exact + (IdeleGroup.mem_supportedAt_iff + (K := K) + (S' : Set (HeightOneSpectrum (𝓞 K))) u).mp + hu w (by simpa using hwS) + have huNorm : + u ∈ (RelativeIdeleGroup.norm K M).range := + (_root_.mem_relativeIdeleNorm_range_iff_localTensorNorms + (K := K) (L := M) u).2 + ⟨hInfinite, hFinite⟩ + obtain ⟨z, hz⟩ := huNorm + refine + ⟨QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K M) z, ?_⟩ + rw [RelativeIdeleGroup.Cohomology.ideleClassNorm_mk, hz] + change + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) u = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a + have hqOne : + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) q = 1 := + (QuotientGroup.eq_one_iff q).mpr hq + rw [← huq, map_mul, hqOne] + exact + (mul_one + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) u : + IdeleClassGroup K)).symm + let : IsCyclic (M ≃ₐ[K] M) := by + simpa only [M] using + KummerTheory.chosenSimpleKummerExtension_isCyclic + K n hnK hmu b + obtain ⟨sigma, hsigma⟩ := + IsCyclic.exists_generator (α := M ≃ₐ[K] M) + have hLower : + Module.finrank K M ≤ + (RelativeIdeleGroup.Cohomology.ideleClassNorm K M).range.index := + Cohomology.finrank_le_ideleClassNorm_index + (K := K) (L := M) sigma hsigma + have hDegreeLe : + Module.finrank K M ≤ 1 := by + simpa only [hNormTop, Subgroup.index_top] using hLower + have hDegree : + Module.finrank K M = 1 := + le_antisymm hDegreeLe Module.finrank_pos + have hAlgMap : + Function.Bijective (algebraMap K M) := + (Algebra.finrank_eq_one_iff_bijective_algebraMap).mp + hDegree + let beta : Mˣ := + KummerTheory.chosenSimpleKummerRootUnit K n hnK b + have hbeta : + beta ^ (n : ℕ) = + Units.map (algebraMap K M).toMonoidHom b := by + simpa only [M, beta] using + KummerTheory.chosenSimpleKummerRootUnit_pow K n hnK b + have hbPower := unit_mem_power_range_of_surjective + (algebraMap K M) hAlgMap.2 (n : ℕ) b beta hbeta + exact + (mem_sUnitNthPowersInField_iff + (K := K) n S' b).2 + ⟨hbSUnit, hbPower⟩ + · simpa only [Finset.union_empty] using + sUnitNthPowersInField_le_principalIdelePowerLocalUnitSubgroup + (K := K) n S' ∅ + +open scoped Classical in +/-- The idele-class power quotient attached to the chosen Kummer norm +support has cardinality `n` to the number of supported places. -/ +theorem card_ideleClassPowerLocalUnitQuotient_on_kummerNormSupport + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + let S' := sUnitKummerNormSupport (K := K) n S + Nat.card + (IdeleClassPowerLocalUnitQuotient + (K := K) n S' ∅) = + (n : ℕ) ^ totalPlaceCard (K := K) S' := by + classical + dsimp only + let S' := sUnitKummerNormSupport (K := K) n S + change + Nat.card + (IdeleClassPowerLocalUnitQuotient + (K := K) n S' ∅) = + (n : ℕ) ^ totalPlaceCard (K := K) S' + have hPrincipal : + principalIdelePowerLocalUnitSubgroup + (K := K) n S' ∅ = + sUnitNthPowersInField (K := K) n S' := by + simpa only [S'] using + principalIdelePowerLocalUnitSubgroup_eq_sUnitNthPowers_on_kummerNormSupport + (K := K) n hmu S + have hDen : + sUnitPrincipalIdelePowerSubgroup + (K := K) n S' ∅ = + (powMonoidHom (n : ℕ) : + SUnitGroup (K := K) (S' ∪ ∅) →* + SUnitGroup (K := K) (S' ∪ ∅)).range := by + unfold sUnitPrincipalIdelePowerSubgroup + rw [Finset.union_empty] + rw [hPrincipal, sUnitNthPowersInField] + exact + Subgroup.comap_map_eq_self_of_injective + (SUnitGroup (K := K) S').subtype_injective _ + have hDiv : + ∀ w : HeightOneSpectrum (𝓞 K), + w.asIdeal ∣ + Ideal.span {((n : ℕ) : 𝓞 K)} → + w ∈ S' := by + intro w hwDvd + exact + mem_sUnitKummerNormSupport_of_asIdeal_dvd_natCast + (K := K) n S hwDvd + have hLarge : + IdeleGroup.supportedAt + (K := K) (S' : Set (HeightOneSpectrum (𝓞 K))) ⊔ + IdeleGroup.principalSubgroup K = + ⊤ := by + simpa only [S'] using + supportedAt_sUnitKummerNormSupport_sup_principalSubgroup_eq_top + (K := K) n S + have hProduct := + card_sUnitPrincipalQuotient_mul_card_ideleClassQuotient_eq_power_two_totalPlaceCard + (K := K) n hmu S' ∅ hDiv + (by + simpa only [Finset.coe_empty, Set.union_empty] using hLarge) + rw [hDen, + card_sUnit_nthPowerQuotient + (K := K) (S' ∪ ∅) n hmu] at hProduct + simp only [Finset.union_empty] at hProduct + have hPower : + (n : ℕ) ^ (2 * totalPlaceCard (K := K) S') = + (n : ℕ) ^ totalPlaceCard (K := K) S' * + (n : ℕ) ^ totalPlaceCard (K := K) S' := by + rw [two_mul, pow_add] + exact + Nat.eq_of_mul_eq_mul_left + (pow_pos n.pos (totalPlaceCard (K := K) S')) + (hProduct.trans hPower) + +open scoped Classical in +/-- The power quotient on the chosen support has the same cardinality +as the degree of the full `S`-unit Kummer extension. -/ +theorem + card_ideleClassPowerLocalUnitQuotient_eq_finrank_fullSUnitKummerExtension + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + let S' := sUnitKummerNormSupport (K := K) n S + let E := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + letI : FiniteDimensional K E := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n + (by exact_mod_cast n.ne_zero) hmu S' + Nat.card + (IdeleClassPowerLocalUnitQuotient + (K := K) n S' ∅) = + Module.finrank K E := by + classical + dsimp only + let S' := sUnitKummerNormSupport (K := K) n S + let E := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + let hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let : FiniteDimensional K E := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S' + let : IsGalois K E := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S' + calc + Nat.card + (IdeleClassPowerLocalUnitQuotient + (K := K) n S' ∅) = + (n : ℕ) ^ totalPlaceCard (K := K) S' := by + simpa only [S'] using + card_ideleClassPowerLocalUnitQuotient_on_kummerNormSupport + (K := K) n hmu S + _ = Nat.card Gal(E/K) := by + symm + simpa only [E] using + card_fullSUnitKummerExtension_galois + (K := K) (Omega := Omega) n hnK hmu S' + _ = Module.finrank K E := + IsGalois.card_aut_eq_finrank K E + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormRealization.lean new file mode 100644 index 0000000000..f43a929f45 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormRealization.lean @@ -0,0 +1,153 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitKummerUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardSubgroupIndex +/-! +# Exact norm realization by the full S-unit Kummer extension + +When the base field contains the required roots of unity, the full +S-unit Kummer extension realizes the canonical power-local-unit +subgroup exactly as its ordinary idele-class norm subgroup. The forward +inclusion is the local norm theorem, using the actual unramifiedness of +the Kummer extension away from the canonical support. Equality follows +from the independently computed quotient cardinal and the global +norm-residue index formula. +-/ + +@[expose] public section + +open scoped NumberField +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain +open GlobalClassFieldTheory.ClassFieldAxiom +open KummerTheory + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- The full S-unit Kummer extension has ordinary idele-class norm range +equal to the canonical power-local-unit subgroup. -/ +theorem fullSUnitKummerExtension_ideleClassNormRange_eq_powerLocalUnit + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (n : ℕ+) + (hn : 1 < (n : ℕ)) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (seed : Finset (HeightOneSpectrum (𝓞 K))) : + let S := sUnitKummerNormSupport (K := K) n seed + let E := + KummerTheory.fullSUnitKummerExtension + (K := K) (Omega := Omega) n S + letI : FiniteDimensional K E := + KummerTheory.fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n + (by exact_mod_cast n.ne_zero) hmu S + letI : IsGalois K E := + KummerTheory.fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S + letI : NumberField E := + NumberField.of_module_finite K E + (_root_.ideleClassNorm K E).range = + ideleClassPowerLocalUnitSubgroup (K := K) n S ∅ := by + classical + dsimp only + let S := sUnitKummerNormSupport (K := K) n seed + let E := + KummerTheory.fullSUnitKummerExtension + (K := K) (Omega := Omega) n S + let hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let : FiniteDimensional K E := + KummerTheory.fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S + let : IsGalois K E := + KummerTheory.fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S + let : NumberField E := + NumberField.of_module_finite K E + let r := totalPlaceCard (K := K) S + let eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ))) := by + simpa only [E, r] using + (KummerTheory.fullSUnitKummerExtensionGaloisEquivPiZMod + (K := K) (Omega := Omega) n hnK hmu S) + let : IsAbelianGalois K E := + { is_comm.comm := fun σ τ => by + apply eG.injective + simpa only [map_mul] using + mul_comm (eG σ) (eG τ) } + have harch : + Even (n : ℕ) ∨ + ∀ w : InfinitePlace K, ¬ w.IsReal := + even_or_no_realInfinitePlace_of_primitiveRoots + (K := K) n hmu hn + have hAway : + ∀ v, v ∉ S ∪ (∅ : + Finset (HeightOneSpectrum (𝓞 K))) → + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := E) v := by + intro v hv + have hvS : v ∉ S := by + simpa only [Finset.union_empty] using hv + have hnv : + v.valuation K ((n : ℕ) : K) = 1 := by + simpa only [S] using + valuation_natCast_eq_one_of_not_mem_sUnitKummerNormSupport + (K := K) n seed hvS + simpa only [E] using + (KummerTheory.fullSUnitKummerExtension_chosenFinitePlaceIsUnramified_of_not_mem + (K := K) (Omega := Omega) + n hnK hmu S v hvS hnv) + have hPowerLeRelative : + ideleClassPowerLocalUnitSubgroup + (K := K) n S ∅ ≤ + (RelativeIdeleGroup.Cohomology.ideleClassNorm K E).range := by + apply + ideleClassPowerLocalUnitSubgroup_le_ideleClassNorm_range + (K := K) (L := E) n r eG S ∅ harch + · intro v hv + simp at hv + · exact hAway + have hPowerLe : + ideleClassPowerLocalUnitSubgroup + (K := K) n S ∅ ≤ + (_root_.ideleClassNorm K E).range := by + rw [ + ordinaryIdeleClassNorm_range_eq_relative + (K := K) (L := E)] + exact hPowerLeRelative + have hPowerIndex : + (ideleClassPowerLocalUnitSubgroup + (K := K) n S ∅).index = + Module.finrank K E := by + rw [Subgroup.index_eq_card] + simpa only [S, E] using + (card_ideleClassPowerLocalUnitQuotient_eq_finrank_fullSUnitKummerExtension + (K := K) (Omega := Omega) n hmu seed) + have hNormIndex : + (_root_.ideleClassNorm K E).range.index = + Module.finrank K E := + Reciprocity.ideleClassNorm_index_eq_finrank_abelian K E + apply + (LubinTate.subgroup_eq_of_le_of_index_eq_of_ne_zero + hPowerLe (hPowerIndex.trans hNormIndex.symm) + (by + rw [hPowerIndex] + exact Nat.ne_of_gt Module.finrank_pos)).symm + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassField.lean new file mode 100644 index 0000000000..b3e5f0fe03 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassField.lean @@ -0,0 +1,339 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Narrow +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +public import Mathlib.NumberTheory.NumberField.ClassNumber +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassField +/-! +# The small Hilbert class field + +The small Hilbert class field corresponds to the image in the idele class +group of the ideles integral at every finite place. Its reciprocity +quotient is canonically the ordinary ideal class group; consequently its +order is the class number. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField + +variable {K : Type*} [Field K] [NumberField K] + +/-- Fix the canonical commutative idèle-class structure used by the Hilbert +class-field quotients in this module. -/ +local instance smallHilbertClassFieldIdeleClassGroupIsMulCommutative + {F : Type*} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +/-- The norm subgroup defining the small Hilbert class field. The +principal subgroup is included before passing to the idele class group so +that the third-isomorphism equivalence applies literally. -/ +def smallHilbertClassFieldNormSubgroup : + Subgroup (IdeleClassGroup K) := + Subgroup.map + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K)) + (IdeleGroup.integralAtFinitePlaces (K := K) ⊔ + IdeleGroup.principalSubgroup K) + +/-- The quotient by the small-Hilbert norm subgroup is the ordinary ideal +class group. -/ +def smallHilbertClassFieldQuotientEquivClassGroup : + IdeleClassGroup K ⧸ + smallHilbertClassFieldNormSubgroup (K := K) ≃* + ClassGroup (𝓞 K) := + (QuotientGroup.quotientQuotientEquivQuotient + (IdeleGroup.principalSubgroup K) + (IdeleGroup.integralAtFinitePlaces (K := K) ⊔ + IdeleGroup.principalSubgroup K) + le_sup_right).trans + (IdeleGroup.quotientIntegralSupPrincipalEquiv (K := K)) + +/-- The small-Hilbert norm subgroup is open. -/ +theorem smallHilbertClassFieldNormSubgroup_isOpen : + IsOpen + ((smallHilbertClassFieldNormSubgroup (K := K) : + Subgroup (IdeleClassGroup K)) : + Set (IdeleClassGroup K)) := by + have hzero : + (0 : RayClass.Modulus K).ideleCongruenceSubgroup ≤ + IdeleGroup.integralAtFinitePlaces (K := K) := + by + intro a ha + change a.2 ∈ FiniteIdeleGroup.integralSubgroup (K := K) + rw [← RayClass.finiteCongruenceSubgroup_zero (K := K)] + exact ha.2 + have hden : + (0 : RayClass.Modulus K).ideleCongruenceSubgroup ≤ + IdeleGroup.integralAtFinitePlaces (K := K) ⊔ + IdeleGroup.principalSubgroup K := + hzero.trans le_sup_left + have hopen : + IsOpen + (((IdeleGroup.integralAtFinitePlaces (K := K) ⊔ + IdeleGroup.principalSubgroup K) : + Subgroup (IdeleGroup K)) : + Set (IdeleGroup K)) := + Subgroup.isOpen_mono hden + (RayClass.isOpen_ideleCongruenceSubgroup 0) + rw [smallHilbertClassFieldNormSubgroup, Subgroup.coe_map] + exact QuotientGroup.isOpenMap_coe _ hopen + +/-- The small-Hilbert norm subgroup is closed. -/ +theorem smallHilbertClassFieldNormSubgroup_isClosed : + IsClosed + ((smallHilbertClassFieldNormSubgroup (K := K) : + Subgroup (IdeleClassGroup K)) : + Set (IdeleClassGroup K)) := + (smallHilbertClassFieldNormSubgroup (K := K)).isClosed_of_isOpen + smallHilbertClassFieldNormSubgroup_isOpen + +/-- The small-Hilbert norm subgroup has finite index. -/ +instance smallHilbertClassFieldNormSubgroupFiniteIndex : + (smallHilbertClassFieldNormSubgroup (K := K)).FiniteIndex := by + let : Finite + (IdeleClassGroup K ⧸ + smallHilbertClassFieldNormSubgroup (K := K)) := + Finite.of_equiv (ClassGroup (𝓞 K)) + (smallHilbertClassFieldQuotientEquivClassGroup + (K := K)).symm.toEquiv + exact Subgroup.finiteIndex_of_finite_quotient + +/-- The order of the small-Hilbert reciprocity quotient is the class +number of `K`. -/ +theorem smallHilbertClassFieldQuotient_card_eq_classNumber : + Nat.card + (IdeleClassGroup K ⧸ + smallHilbertClassFieldNormSubgroup (K := K)) = + NumberField.classNumber K := by + rw [NumberField.classNumber] + rw [← Nat.card_eq_fintype_card] + exact Nat.card_congr + (smallHilbertClassFieldQuotientEquivClassGroup (K := K)).toEquiv + +/-- The big-Hilbert norm subgroup is contained in the small-Hilbert +norm subgroup. Under class-field duality this is the inclusion of the +small Hilbert class field into the big Hilbert class field. -/ +theorem + bigHilbertClassFieldNormSubgroup_le_smallHilbertClassFieldNormSubgroup : + bigHilbertClassFieldNormSubgroup (K := K) ≤ + smallHilbertClassFieldNormSubgroup (K := K) := by + rw [bigHilbertClassFieldNormSubgroup, + RayClass.Modulus.congruenceSubgroup, + smallHilbertClassFieldNormSubgroup] + apply Subgroup.map_mono + exact sup_le + ((RayClass.narrowIdeleCongruenceSubgroup_zero_le_integral + (K := K)).trans le_sup_left) + le_sup_right + +/-- Modulus zero is a defining modulus for the small-Hilbert norm +subgroup. -/ +theorem smallHilbertClassFieldNormSubgroup_isDefiningModulus : + IsDefiningModulus + (smallHilbertClassFieldNormSubgroup (K := K)) + (0 : RayClass.Modulus K) := by + have hzero : + (0 : RayClass.Modulus K).ideleCongruenceSubgroup ≤ + IdeleGroup.integralAtFinitePlaces (K := K) := by + intro a ha + change a.2 ∈ FiniteIdeleGroup.integralSubgroup (K := K) + rw [← RayClass.finiteCongruenceSubgroup_zero (K := K)] + exact ha.2 + rw [IsDefiningModulus, + RayClass.Modulus.congruenceSubgroup, + smallHilbertClassFieldNormSubgroup] + exact Subgroup.map_mono (sup_le (hzero.trans le_sup_left) le_sup_right) + +/-- The conductorial subgroup supplied by the intrinsic small-Hilbert norm +subgroup and its zero defining modulus. -/ +noncomputable def smallHilbertClassFieldConductorialSubgroup : + ConductorialSubgroup K := + ⟨smallHilbertClassFieldNormSubgroup (K := K), + ⟨0, smallHilbertClassFieldNormSubgroup_isDefiningModulus (K := K)⟩⟩ + +/-- The canonical quotient transition from the big-Hilbert reciprocity +quotient onto the small-Hilbert reciprocity quotient. -/ +noncomputable def + bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient : + (IdeleClassGroup K ⧸ + bigHilbertClassFieldNormSubgroup (K := K)) →* + (IdeleClassGroup K ⧸ + smallHilbertClassFieldNormSubgroup (K := K)) := + QuotientGroup.map + (bigHilbertClassFieldNormSubgroup (K := K)) + (smallHilbertClassFieldNormSubgroup (K := K)) + (MonoidHom.id _) + (show + bigHilbertClassFieldNormSubgroup (K := K) ≤ + Subgroup.comap (MonoidHom.id _) + (smallHilbertClassFieldNormSubgroup (K := K)) from by + intro x hx + change x ∈ smallHilbertClassFieldNormSubgroup (K := K) + exact + bigHilbertClassFieldNormSubgroup_le_smallHilbertClassFieldNormSubgroup + (K := K) hx) + +/-- The big-to-small Hilbert quotient transition sends the class of an +idele class to the same class modulo the larger norm subgroup. -/ +theorem bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient_mk + (x : IdeleClassGroup K) : + bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient + (K := K) + (QuotientGroup.mk' + (bigHilbertClassFieldNormSubgroup (K := K)) x) = + QuotientGroup.mk' + (smallHilbertClassFieldNormSubgroup (K := K)) x := + rfl + +/-- The canonical transition from the big-Hilbert quotient to the +small-Hilbert quotient is surjective. -/ +theorem + bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient_surjective : + Function.Surjective + (bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient + (K := K)) := by + intro q + obtain ⟨x, rfl⟩ := + QuotientGroup.mk'_surjective + (smallHilbertClassFieldNormSubgroup (K := K)) q + exact + ⟨QuotientGroup.mk' + (bigHilbertClassFieldNormSubgroup (K := K)) x, rfl⟩ + +/-- The kernel of the canonical big-to-small Hilbert quotient transition +is the image of the small-Hilbert norm subgroup modulo the big-Hilbert +norm subgroup. -/ +theorem + bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient_ker : + MonoidHom.ker + (bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient + (K := K)) = + Subgroup.map + (QuotientGroup.mk' + (bigHilbertClassFieldNormSubgroup (K := K))) + (smallHilbertClassFieldNormSubgroup (K := K)) := by + unfold bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient + rw [QuotientGroup.ker_map, Subgroup.comap_id] + +/-- The order of the small-Hilbert reciprocity quotient divides the +order of the big-Hilbert reciprocity quotient. -/ +theorem smallHilbertClassFieldQuotient_card_dvd_bigHilbertClassFieldQuotient_card : + Nat.card + (IdeleClassGroup K ⧸ + smallHilbertClassFieldNormSubgroup (K := K)) ∣ + Nat.card + (IdeleClassGroup K ⧸ + bigHilbertClassFieldNormSubgroup (K := K)) := by + simpa only [Subgroup.index_eq_card] using + Subgroup.index_dvd_of_le + (bigHilbertClassFieldNormSubgroup_le_smallHilbertClassFieldNormSubgroup + (K := K)) + +/-- The class number divides the order of the narrow class group. -/ +theorem classNumber_dvd_narrowClassGroup_card : + NumberField.classNumber K ∣ + Nat.card (RayClass.NarrowClassGroup K) := by + calc + NumberField.classNumber K = + Nat.card + (IdeleClassGroup K ⧸ + smallHilbertClassFieldNormSubgroup (K := K)) := + (smallHilbertClassFieldQuotient_card_eq_classNumber + (K := K)).symm + _ ∣ + Nat.card + (IdeleClassGroup K ⧸ + bigHilbertClassFieldNormSubgroup (K := K)) := + smallHilbertClassFieldQuotient_card_dvd_bigHilbertClassFieldQuotient_card + (K := K) + _ = Nat.card (RayClass.NarrowClassGroup K) := + Nat.card_congr + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).toEquiv + +/-- The kernel of the big-to-small Hilbert quotient transition measures +the exact difference between the narrow and ordinary class numbers. -/ +theorem narrowClassGroup_card_eq_bigToSmallKernel_card_mul_classNumber : + Nat.card (RayClass.NarrowClassGroup K) = + Nat.card + (MonoidHom.ker + (bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient + (K := K))) * + NumberField.classNumber K := by + let f := + bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient + (K := K) + change + Nat.card (RayClass.NarrowClassGroup K) = + Nat.card (MonoidHom.ker f) * + NumberField.classNumber K + have hf : Function.Surjective f := + bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient_surjective + (K := K) + calc + Nat.card (RayClass.NarrowClassGroup K) = + Nat.card + (IdeleClassGroup K ⧸ + bigHilbertClassFieldNormSubgroup (K := K)) := + (Nat.card_congr + (bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).toEquiv).symm + _ = Nat.card (MonoidHom.ker f) * + (MonoidHom.ker f).index := + (Subgroup.card_mul_index (MonoidHom.ker f)).symm + _ = Nat.card (MonoidHom.ker f) * + Nat.card f.range := by + rw [Subgroup.index_ker f] + _ = Nat.card (MonoidHom.ker f) * + Nat.card + (IdeleClassGroup K ⧸ + smallHilbertClassFieldNormSubgroup (K := K)) := by + rw [f.range_eq_top_of_surjective hf, Subgroup.card_top] + _ = Nat.card (MonoidHom.ker f) * + NumberField.classNumber K := by + rw [smallHilbertClassFieldQuotient_card_eq_classNumber] + +/-- The exact difference between the narrow and ordinary class numbers +is the order of the image of the small-Hilbert norm subgroup in the +big-Hilbert reciprocity quotient. -/ +theorem + narrowClassGroup_card_eq_smallHilbertNormImage_card_mul_classNumber : + Nat.card (RayClass.NarrowClassGroup K) = + Nat.card + (Subgroup.map + (QuotientGroup.mk' + (bigHilbertClassFieldNormSubgroup (K := K))) + (smallHilbertClassFieldNormSubgroup (K := K))) * + NumberField.classNumber K := by + rw [narrowClassGroup_card_eq_bigToSmallKernel_card_mul_classNumber, + bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient_ker] + +/-- The narrow finite conductor of the small-Hilbert norm subgroup is zero. -/ +@[simp] +theorem smallHilbertClassField_narrowFiniteConductor : + (smallHilbertClassFieldConductorialSubgroup + (K := K)).narrowFiniteConductor = 0 := by + apply le_antisymm + · exact + (smallHilbertClassFieldConductorialSubgroup + (K := K)).narrowFiniteConductor_le + (smallHilbertClassFieldNormSubgroup_isDefiningModulus (K := K)) + · exact bot_le + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean new file mode 100644 index 0000000000..e34dcd1f29 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean @@ -0,0 +1,174 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.OrdinaryClassGroupComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallOriginal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +/-! +# Arithmetic Artin reciprocity for any small Hilbert class field + +The intrinsic small Hilbert class field is unique up to a base-field +equivalence. Therefore its actual idèle-class norm subgroup is the same as +that of the selected class field. Arithmetic global reciprocity then gives +the Artin map, with its prime normalization obtained from the prime idèle. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory.SmallHilbertClassFieldComparison + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +local instance smallHilbertArtinIdeleClassGroupIsMulCommutative : + IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] smallHilbertArtinIdeleClassGroupIsMulCommutative + +open scoped Classical in +open GlobalClassFieldTheory.GlobalClassFields renaming + smallHilbertClassField_ideleClassNorm_range_over_original → + smallHilbertClassField_ideleClassNorm_range_over_original in +/-- All intrinsic small Hilbert class fields have the selected field's +actual idèle-class norm subgroup. -/ +theorem smallHilbertClassField_ideleClassNorm_range_of_isSmall + (E : FiniteAbelianExtension K) (hE : IsSmallHilbertClassField E) : + (_root_.ideleClassNorm K E).range = + GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassFieldNormSubgroup + (K := K) := by + let H := GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField K + let e : E ≃ₐ[K] H := GlobalClassFieldComparison.smallHilbertClassFieldEquivOfIsSmall K E hE + calc + (_root_.ideleClassNorm K E).range = (_root_.ideleClassNorm K H).range := + ordinaryIdeleClassNorm_range_algEquiv e + _ = _ := + smallHilbertClassField_ideleClassNorm_range_over_original + (K := K) + +open scoped Classical in +/-- Arithmetic reciprocity identifies the Galois group with the ordinary ideal class group +when the extension has the small Hilbert norm subgroup. -/ +noncomputable def arithmeticHilbertClassGroupEquivOfNormRange + (E : FiniteAbelianExtension K) + (hNorm : (_root_.ideleClassNorm K E).range = + GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassFieldNormSubgroup + (K := K)) : + (E ≃ₐ[K] E) ≃* ClassGroup (𝓞 K) := by + let N : Subgroup (IdeleClassGroup K) := (_root_.ideleClassNorm K E).range + let S : Subgroup (IdeleClassGroup K) := + GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassFieldNormSubgroup + (K := K) + have hNS : N = S := hNorm + let e₁ : (E ≃ₐ[K] E) ≃* (IdeleClassGroup K ⧸ N) := + (GlobalClassFieldTheory.Reciprocity.arithmeticGlobalReciprocityContinuousMulEquiv + K E).toMulEquiv + let e₂ : (IdeleClassGroup K ⧸ N) ≃* (IdeleClassGroup K ⧸ S) := + QuotientGroup.quotientMulEquivOfEq hNS + let e₃ : (IdeleClassGroup K ⧸ S) ≃* ClassGroup (𝓞 K) := + GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassFieldQuotientEquivClassGroup + (K := K) + exact (e₁.trans e₂).trans e₃ + +open scoped Classical in +/-- Arithmetic reciprocity identifies the Galois group of any intrinsic +small Hilbert class field with the ordinary ideal class group. -/ +noncomputable def arithmeticSmallHilbertClassFieldGaloisEquivClassGroupOfIsSmall + (E : FiniteAbelianExtension K) (hE : IsSmallHilbertClassField E) : + (E ≃ₐ[K] E) ≃* ClassGroup (𝓞 K) := + arithmeticHilbertClassGroupEquivOfNormRange E + (smallHilbertClassField_ideleClassNorm_range_of_isSmall E hE) + +open scoped Classical in +open GlobalClassFieldTheory.Reciprocity renaming + arithmeticGlobalReciprocityContinuousMulEquiv_globalNormResidue → + arithmeticGlobalReciprocityContinuousMulEquiv_globalNormResidue in +/-- Intrinsic arithmetic reciprocity sends a global norm-residue symbol to +its represented class in the small-Hilbert norm quotient. -/ +theorem arithmeticSmallHilbertClassFieldGaloisEquivClassGroup_globalNormResidue + (E : FiniteAbelianExtension K) (hE : IsSmallHilbertClassField E) + (c : IdeleClassGroup K) : + arithmeticSmallHilbertClassFieldGaloisEquivClassGroupOfIsSmall E hE + (GlobalClassFieldTheory.Reciprocity.arithmeticGlobalNormResidueMonoidHom + K E c) = + GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassFieldQuotientEquivClassGroup + (K := K) + (QuotientGroup.mk' + (GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassFieldNormSubgroup + (K := K)) c) := by + change + GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassFieldQuotientEquivClassGroup + (K := K) + (QuotientGroup.quotientMulEquivOfEq + (smallHilbertClassField_ideleClassNorm_range_of_isSmall E hE) + (GlobalClassFieldTheory.Reciprocity.arithmeticGlobalReciprocityContinuousMulEquiv + K E + (GlobalClassFieldTheory.Reciprocity.arithmeticGlobalNormResidueMonoidHom + K E c))) = _ + have hReciprocity := + arithmeticGlobalReciprocityContinuousMulEquiv_globalNormResidue + (K := K) (L := E) c + calc + _ = GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassFieldQuotientEquivClassGroup + (K := K) + (QuotientGroup.quotientMulEquivOfEq + (smallHilbertClassField_ideleClassNorm_range_of_isSmall E hE) + (QuotientGroup.mk' (_root_.ideleClassNorm K E).range c)) := + congrArg + (fun q => + GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassFieldQuotientEquivClassGroup + (K := K) + (QuotientGroup.quotientMulEquivOfEq + (smallHilbertClassField_ideleClassNorm_range_of_isSmall E hE) q)) + hReciprocity + _ = _ := rfl + +open scoped Classical in +open GlobalClassFieldTheory.Reciprocity renaming + arithmeticGlobalNormResidueMonoidHom_comp_ideleClassQuotient_eq_globalArtin → + arithmeticGlobalNormResidueMonoidHom_comp_ideleClassQuotient_eq_globalArtin in +/-- At every finite prime, the arithmetic Artin symbol has the usual prime +ideal class under the intrinsic Hilbert reciprocity equivalence. -/ +theorem arithmeticSmallHilbertClassFieldGaloisEquivClassGroup_prime + (E : FiniteAbelianExtension K) (hE : IsSmallHilbertClassField E) + (v : HeightOneSpectrum (𝓞 K)) : + arithmeticSmallHilbertClassFieldGaloisEquivClassGroupOfIsSmall E hE + (GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := E) v) = + ClassGroup.mk K (finitePrimeFractionalIdeal v) := by + let c : IdeleClassGroup K := + QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v) + have hArtin : + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := E) v = + GlobalClassFieldTheory.Reciprocity.arithmeticGlobalNormResidueMonoidHom + K E c := by + rw [GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin] + exact (DFunLike.congr_fun + (arithmeticGlobalNormResidueMonoidHom_comp_ideleClassQuotient_eq_globalArtin + (K := K) (L := E)) + (IdeleGroup.finitePrimeIdele v)).symm + rw [hArtin] + rw [arithmeticSmallHilbertClassFieldGaloisEquivClassGroup_globalNormResidue] + rw [GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassFieldQuotientEquivClassGroup_mk] + rw [IdeleGroup.idealClass_finitePrimeIdele] + rfl + +end ClassFieldTheory.SmallHilbertClassFieldComparison diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMaximalSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMaximalSubextension.lean new file mode 100644 index 0000000000..cddec97b22 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMaximalSubextension.lean @@ -0,0 +1,353 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldUnramifiedMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerConjugation +/-! +# The maximal everywhere-unramified abelian subextension + +The selected small Hilbert class field is characterized in actual field +order. Its rational absolute class-formation norm subgroup is exactly +the intrinsic small-Hilbert subgroup of its fixed-field base. The +order-reversing finite abelian classification then places every actual +finite abelian extension unramified at all finite and infinite places +inside the selected field. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open ClassFormation KummerTheory +open IdealClassFieldTheory LocalClassFieldTheory NumberField Reciprocity + +/-- Fix the canonical quotient structure at the boundary between ordinary +idele classes and additive fixed subgroups. -/ +@[instance_reducible] +private noncomputable def smallHilbertMaximalSubextensionIdeleClassCommGroup + (F : Type) [Field F] [NumberField F] : + CommGroup (IdeleClassGroup F) := + QuotientGroup.Quotient.commGroup (IdeleGroup.principalSubgroup F) + +attribute [local instance] smallHilbertMaximalSubextensionIdeleClassCommGroup + +private structure SmallHilbertTransportedAddSubgroupData + {A B : Type} [AddGroup A] [AddGroup B] + (e : A ≃+ B) (H : AddSubgroup A) where + subgroup : AddSubgroup B + map_symm : subgroup.map e.symm.toAddMonoidHom = H + +private def smallHilbertTransportedAddSubgroupData + {A B : Type} [AddGroup A] [AddGroup B] + (e : A ≃+ B) (H : AddSubgroup A) : + SmallHilbertTransportedAddSubgroupData e H where + subgroup := H.map e.toAddMonoidHom + map_symm := + (AddSubgroup.map_symm_eq_iff_map_eq + (K := H) (H := H.map e.toAddMonoidHom) (e := e)).2 rfl + +private theorem smallHilbertAddSubgroup_eq_of_map_symm_eq + {A B : Type} [AddGroup A] [AddGroup B] + (e : A ≃+ B) (H J : AddSubgroup B) + (h : H.map e.symm.toAddMonoidHom = + J.map e.symm.toAddMonoidHom) : + H = J := by + exact AddSubgroup.map_injective e.symm.injective h + +/-- The fixed-field idèle-class equivalence at the selected small-Hilbert +base, named once so later subgroup comparisons do not reconstruct it. -/ +private noncomputable def smallHilbertClassFieldMaximalIdeleClassEquiv + (K : Type) [Field K] [NumberField K] : + Additive (IdeleClassGroup (smallHilbertClassFieldBase K)) ≃+ + ambientFixedAddSubgroup rationalIdeleClassRepresentation + (smallHilbertClassFieldBaseSubgroup K) := + rationalAbstractFixedFieldIdeleClassEquivFixed + (smallHilbertClassFieldBaseSubgroup K) + +/-- The intrinsic ordinary norm subgroup at the selected base, with its +additive carrier fixed in the declaration type. -/ +private noncomputable def smallHilbertClassFieldMaximalIntrinsicNormSubgroup + (K : Type) [Field K] [NumberField K] : + AddSubgroup (Additive (IdeleClassGroup (smallHilbertClassFieldBase K))) := + (smallHilbertClassFieldNormSubgroup + (K := smallHilbertClassFieldBase K)).toAddSubgroup + +private noncomputable def smallHilbertClassFieldMaximalTransportData + (K : Type) [Field K] [NumberField K] : + SmallHilbertTransportedAddSubgroupData + (smallHilbertClassFieldMaximalIdeleClassEquiv K) + (smallHilbertClassFieldMaximalIntrinsicNormSubgroup K) := + smallHilbertTransportedAddSubgroupData + (smallHilbertClassFieldMaximalIdeleClassEquiv K) + (smallHilbertClassFieldMaximalIntrinsicNormSubgroup K) + +/-- A short typed name for the transported intrinsic subgroup used below. +Keeping this endpoint opaque prevents the fixed-field aliases from being +re-elaborated when the inverse transport is applied. -/ +private noncomputable def smallHilbertClassFieldMaximalNormEndpoint + (K : Type) [Field K] [NumberField K] : + AddSubgroup + (ambientFixedAddSubgroup rationalIdeleClassRepresentation + (smallHilbertClassFieldBaseSubgroup K)) := + (smallHilbertClassFieldMaximalTransportData K).subgroup + +private theorem smallHilbertClassFieldMaximalNormEndpoint_map_symm + (K : Type) [Field K] [NumberField K] : + (smallHilbertClassFieldMaximalNormEndpoint K).map + (smallHilbertClassFieldMaximalIdeleClassEquiv K).symm.toAddMonoidHom = + smallHilbertClassFieldMaximalIntrinsicNormSubgroup K := + (smallHilbertClassFieldMaximalTransportData K).map_symm + +private theorem smallHilbertClassFieldMaximalNormEndpoint_eq_public + (K : Type) [Field K] [NumberField K] : + smallHilbertClassFieldMaximalNormEndpoint K = + smallHilbertNormSubgroupInRationalClassFormation + (numberFieldTowerFiniteAbstractField K + (smallHilbertClassFieldNormAmbient K)) := by + rfl + +/-- Mapping the selected abstract norm subgroup back to the ordinary +idèle-class group gives the named intrinsic subgroup. -/ +private theorem smallHilbertClassFieldMaximalNormSubgroup_map_symm + (K : Type) [Field K] [NumberField K] : + ((smallHilbertClassFieldSubextension K).normSubgroup + rationalIdeleClassRepresentation).map + (smallHilbertClassFieldMaximalIdeleClassEquiv K).symm.toAddMonoidHom = + smallHilbertClassFieldMaximalIntrinsicNormSubgroup K := by + let L := + smallHilbertClassFieldSubextension K + let F := + smallHilbertClassFieldBase K + let e := + rationalAbstractFixedFieldIdeleClassEquivFixed + (smallHilbertClassFieldBaseSubgroup K) + let hLfinite : Finite + ((smallHilbertClassFieldBaseSubgroup K).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (smallHilbertClassFieldBaseSubgroup K) + L.field L.below) := + L.finite + calc + (L.normSubgroup rationalIdeleClassRepresentation).map + e.symm.toAddMonoidHom = + (_root_.ideleClassNorm + F (smallHilbertClassField K)).range.toAddSubgroup := by + change + (finiteNormSubgroup rationalIdeleClassRepresentation + (smallHilbertClassFieldBaseSubgroup K) + L.field L.below).map + e.symm.toAddMonoidHom = + (_root_.ideleClassNorm + F (smallHilbertClassField K)).range.toAddSubgroup + simpa only [L, F, e, smallHilbertClassField, + smallHilbertClassFieldBase, + smallHilbertClassFieldMaximalIdeleClassEquiv] using + (map_rationalFiniteNormSubgroup_eq_ordinaryIdeleClassNormRange_concrete + (smallHilbertClassFieldBaseSubgroup K) + (smallHilbertClassFieldSubextension K).field + (smallHilbertClassFieldSubextension K).below + (smallHilbertClassFieldSubextension K).normal) + _ = smallHilbertClassFieldMaximalIntrinsicNormSubgroup K := by + exact + congrArg Subgroup.toAddSubgroup + (smallHilbertClassField_ideleClassNorm_range_eq_intrinsic + (K := K)) + +/-- Both subgroups have the same inverse image under the fixed-field +idèle-class equivalence. -/ +private theorem smallHilbertClassFieldMaximalNormSubgroup_map_eq_endpoint_map + (K : Type) [Field K] [NumberField K] : + ((smallHilbertClassFieldSubextension K).normSubgroup + rationalIdeleClassRepresentation).map + (smallHilbertClassFieldMaximalIdeleClassEquiv K).symm.toAddMonoidHom = + (smallHilbertClassFieldMaximalNormEndpoint K).map + (smallHilbertClassFieldMaximalIdeleClassEquiv K).symm.toAddMonoidHom := by + calc + ((smallHilbertClassFieldSubextension K).normSubgroup + rationalIdeleClassRepresentation).map + (smallHilbertClassFieldMaximalIdeleClassEquiv K).symm.toAddMonoidHom = + smallHilbertClassFieldMaximalIntrinsicNormSubgroup K := + smallHilbertClassFieldMaximalNormSubgroup_map_symm K + _ = (smallHilbertClassFieldMaximalNormEndpoint K).map + (smallHilbertClassFieldMaximalIdeleClassEquiv K).symm.toAddMonoidHom := + (smallHilbertClassFieldMaximalNormEndpoint_map_symm K).symm + +private theorem smallHilbertClassFieldMaximalNormSubgroup_eq_endpoint + (K : Type) [Field K] [NumberField K] : + (smallHilbertClassFieldSubextension K).normSubgroup + rationalIdeleClassRepresentation = + smallHilbertClassFieldMaximalNormEndpoint K := by + exact + smallHilbertAddSubgroup_eq_of_map_symm_eq + (A := Additive (IdeleClassGroup (smallHilbertClassFieldBase K))) + (B := ambientFixedAddSubgroup rationalIdeleClassRepresentation + (smallHilbertClassFieldBaseSubgroup K)) + (e := smallHilbertClassFieldMaximalIdeleClassEquiv K) + (H := (smallHilbertClassFieldSubextension K).normSubgroup + rationalIdeleClassRepresentation) + (J := smallHilbertClassFieldMaximalNormEndpoint K) + (h := smallHilbertClassFieldMaximalNormSubgroup_map_eq_endpoint_map K) + +/-- The selected small Hilbert class-field subextension realizes exactly +the intrinsic small-Hilbert norm subgroup in the rational absolute class +formation. -/ +@[simp] +theorem smallHilbertClassFieldSubextension_normSubgroup + (K : Type) [Field K] [NumberField K] : + (smallHilbertClassFieldSubextension K).normSubgroup + rationalIdeleClassRepresentation = + smallHilbertNormSubgroupInRationalClassFormation + (numberFieldTowerFiniteAbstractField K + (smallHilbertClassFieldNormAmbient K)) := by + calc + (smallHilbertClassFieldSubextension K).normSubgroup + rationalIdeleClassRepresentation = + smallHilbertClassFieldMaximalNormEndpoint K := + smallHilbertClassFieldMaximalNormSubgroup_eq_endpoint K + _ = smallHilbertNormSubgroupInRationalClassFormation + (numberFieldTowerFiniteAbstractField K + (smallHilbertClassFieldNormAmbient K)) := + smallHilbertClassFieldMaximalNormEndpoint_eq_public K + +/-- The actual fixed-field extension represented by a finite abelian +subextension of the selected rational base is everywhere unramified. + +Naming this predicate keeps the fixed-field instance tower out of the +signatures of every theorem which uses it. -/ +def finiteAbelianSubextensionIsEverywhereUnramified + (K : Type) [Field K] [NumberField K] + (P : FiniteAbelianSubextension + (smallHilbertClassFieldBaseSubgroup K)) : Prop := + let F := + smallHilbertClassFieldBase K + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + letI hPfinite : Finite + ((smallHilbertClassFieldBaseSubgroup K).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (smallHilbertClassFieldBaseSubgroup K) + P.field P.below) := + P.finite + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + (smallHilbertClassFieldBaseSubgroup K) + P.field P.below inferInstance hPfinite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' rfl + letI : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + letI : NumberField E := + NumberField.of_module_finite ℚ E + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) + (smallHilbertClassFieldBaseSubgroup K) + P.field P.below P.normal + IsEverywhereUnramified F E + +/-- Every finite abelian subextension of the selected rational +fixed-field base which is unramified at every finite and infinite place +is contained in the selected small Hilbert class-field subextension. -/ +theorem + everywhereUnramifiedAbelianSubextension_le_smallHilbertClassFieldSubextension + (K : Type) [Field K] [NumberField K] + (P : FiniteAbelianSubextension + (smallHilbertClassFieldBaseSubgroup K)) : + finiteAbelianSubextensionIsEverywhereUnramified K P → + P ≤ smallHilbertClassFieldSubextension K := by + let F := + smallHilbertClassFieldBase K + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let hPfinite : Finite + ((smallHilbertClassFieldBaseSubgroup K).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (smallHilbertClassFieldBaseSubgroup K) + P.field P.below) := + P.finite + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + (smallHilbertClassFieldBaseSubgroup K) + P.field P.below inferInstance hPfinite + let : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' rfl + let : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + let : NumberField E := + NumberField.of_module_finite ℚ E + let : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) + (smallHilbertClassFieldBaseSubgroup K) + P.field P.below P.normal + intro hunramified + change IsEverywhereUnramified F E at hunramified + let KF := + numberFieldTowerFiniteAbstractField K + (smallHilbertClassFieldNormAmbient K) + exact + everywhereUnramifiedFiniteAbelianSubextension_le_smallHilbertClassField + KF (smallHilbertClassFieldSubextension K) P + (smallHilbertClassFieldSubextension_normSubgroup K) + hunramified + +/-- The selected small Hilbert class field is genuinely everywhere +unramified, and its finite abelian subextension is maximal among all +actual everywhere-unramified abelian subextensions of the same rational +fixed-field base. -/ +theorem + smallHilbertClassFieldSubextension_isEverywhereUnramifiedAndMaximalAbelian + (K : Type) [Field K] [NumberField K] : + IsEverywhereUnramified K (smallHilbertClassField K) ∧ + ∀ P : FiniteAbelianSubextension + (smallHilbertClassFieldBaseSubgroup K), + finiteAbelianSubextensionIsEverywhereUnramified K P → + P ≤ smallHilbertClassFieldSubextension K := by + constructor + · exact smallHilbertClassField_isEverywhereUnramified K + · intro P + exact + everywhereUnramifiedAbelianSubextension_le_smallHilbertClassFieldSubextension + K P + +/-- Every finite abelian extension of `K` which is unramified at all +finite and infinite places has a genuine `K`-embedding into the selected +small Hilbert class field of `K`. -/ +theorem + finiteAbelianExtension_nonempty_algHom_to_smallHilbertClassField_of_everywhereUnramified + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] + [Algebra K L] [FiniteDimensional K L] + [IsAbelianGalois K L] + [IsUnramifiedAtInfinitePlaces K L] + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + Nonempty (L →ₐ[K] smallHilbertClassField K) := by + apply + finiteAbelianExtension_nonempty_algHom_of_normRange_le + (K := K) L (smallHilbertClassField K) + rw [smallHilbertClassField_ideleClassNorm_range_over_original] + exact + smallHilbertClassFieldNormSubgroup_le_ideleClassNorm_range_of_everywhereUnramified + (K := K) (L := L) hunramifiedFinite + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldNaturality.lean new file mode 100644 index 0000000000..c43c142f04 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldNaturality.lean @@ -0,0 +1,177 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison +/-! +# Naturality of the small Hilbert class field + +An equivalence of number fields carries the small-Hilbert norm subgroup +exactly onto the small-Hilbert norm subgroup. Consequently it induces the +canonical equivalence of the corresponding reciprocity quotients. Transport +of ordinary ideal classes is obtained from this quotient equivalence and is +therefore compatible with the canonical quotient--class-group equivalences. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField + +/-- Supply the canonical commutativity used by both small-Hilbert quotients. -/ +private theorem smallHilbertNaturalityIdeleClassIsMulCommutative + {F : Type*} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] smallHilbertNaturalityIdeleClassIsMulCommutative + +variable + {K M : Type*} + [Field K] [NumberField K] + [Field M] [NumberField M] + +/-- Transport of ordinary idele classes along an equivalence of number +fields carries the small-Hilbert norm subgroup exactly onto the +small-Hilbert norm subgroup of the target. -/ +theorem smallHilbertClassFieldNormSubgroup_map_ideleClassCongr + (e : K ≃ₐ[ℚ] M) : + (smallHilbertClassFieldNormSubgroup (K := K)).map + (ideleClassCongr e).toMonoidHom = + smallHilbertClassFieldNormSubgroup (K := M) := by + simpa only [smallHilbertClassFieldNormSubgroup, + IdeleGroup.ordinaryIdealClassSubgroup] using + ordinaryIdealClassSubgroup_image_map_ideleClassCongr e + +/-- The canonical equivalence of small-Hilbert reciprocity quotients induced +by an equivalence of number fields. -/ +noncomputable def smallHilbertClassFieldQuotientCongr + (e : K ≃ₐ[ℚ] M) : + (IdeleClassGroup K ⧸ + smallHilbertClassFieldNormSubgroup (K := K)) ≃* + (IdeleClassGroup M ⧸ + smallHilbertClassFieldNormSubgroup (K := M)) := + QuotientGroup.congr + (smallHilbertClassFieldNormSubgroup (K := K)) + (smallHilbertClassFieldNormSubgroup (K := M)) + (ideleClassCongr e) + (smallHilbertClassFieldNormSubgroup_map_ideleClassCongr e) + +/-- On representatives, the small-Hilbert quotient transport is induced by +the existing transport of ordinary idele classes. -/ +theorem smallHilbertClassFieldQuotientCongr_mk + (e : K ≃ₐ[ℚ] M) + (c : IdeleClassGroup K) : + smallHilbertClassFieldQuotientCongr e + (QuotientGroup.mk' + (smallHilbertClassFieldNormSubgroup (K := K)) c) = + QuotientGroup.mk' + (smallHilbertClassFieldNormSubgroup (K := M)) + (ideleClassCongr e c) := + rfl + +/-- The canonical transport of ordinary ideal classes determined by the +small-Hilbert reciprocity quotient. -/ +noncomputable def smallHilbertClassGroupCongr + (e : K ≃ₐ[ℚ] M) : + ClassGroup (𝓞 K) ≃* ClassGroup (𝓞 M) := + (smallHilbertClassFieldQuotientEquivClassGroup + (K := K)).symm |>.trans + ((smallHilbertClassFieldQuotientCongr e).trans + (smallHilbertClassFieldQuotientEquivClassGroup + (K := M))) + +/-- Naturality of the canonical identification of the small-Hilbert +reciprocity quotient with the ordinary ideal class group. -/ +@[simp] +theorem smallHilbertClassFieldQuotientEquivClassGroup_naturality + (e : K ≃ₐ[ℚ] M) + (q : IdeleClassGroup K ⧸ + smallHilbertClassFieldNormSubgroup (K := K)) : + smallHilbertClassFieldQuotientEquivClassGroup + (K := M) + (smallHilbertClassFieldQuotientCongr e q) = + smallHilbertClassGroupCongr e + (smallHilbertClassFieldQuotientEquivClassGroup + (K := K) q) := by + simp [smallHilbertClassGroupCongr] + +/-- Homomorphism form of naturality for the small-Hilbert +quotient--class-group identification. -/ +theorem smallHilbertClassFieldQuotientEquivClassGroup_naturality_hom + (e : K ≃ₐ[ℚ] M) : + (smallHilbertClassFieldQuotientEquivClassGroup + (K := M)).toMonoidHom.comp + (smallHilbertClassFieldQuotientCongr + (K := K) (M := M) e).toMonoidHom = + (smallHilbertClassGroupCongr + (K := K) (M := M) e).toMonoidHom.comp + (smallHilbertClassFieldQuotientEquivClassGroup + (K := K)).toMonoidHom := by + ext q + exact + smallHilbertClassFieldQuotientEquivClassGroup_naturality + (K := K) (M := M) e q + +/-- On an idele representative, the induced transport of ordinary ideal +classes is the ideal class of the transported idele. Thus the class-group +transport above is characterized by the actual idelic transport, rather than +by a choice of representatives in the quotient. -/ +@[simp] +theorem smallHilbertClassGroupCongr_idealClass + (e : K ≃ₐ[ℚ] M) + (a : IdeleGroup K) : + smallHilbertClassGroupCongr e + (IdeleGroup.idealClass a) = + IdeleGroup.idealClass (ideleCongr e a) := by + let q : + IdeleClassGroup K ⧸ + smallHilbertClassFieldNormSubgroup (K := K) := + QuotientGroup.mk' + (smallHilbertClassFieldNormSubgroup (K := K)) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) + calc + smallHilbertClassGroupCongr e + (IdeleGroup.idealClass a) = + smallHilbertClassGroupCongr e + (smallHilbertClassFieldQuotientEquivClassGroup + (K := K) q) := by + simp only [q, + smallHilbertClassFieldQuotientEquivClassGroup_mk] + _ = + smallHilbertClassFieldQuotientEquivClassGroup + (K := M) + (smallHilbertClassFieldQuotientCongr e q) := + (smallHilbertClassFieldQuotientEquivClassGroup_naturality + e q).symm + _ = IdeleGroup.idealClass (ideleCongr e a) := by + simp only [q, smallHilbertClassFieldQuotientCongr_mk, + ideleClassCongr_mk, + smallHilbertClassFieldQuotientEquivClassGroup_mk] + +/-- Homomorphism form of naturality for ordinary ideal classes under the +small-Hilbert class-group transport. -/ +theorem smallHilbertClassGroupCongr_naturality + (e : K ≃ₐ[ℚ] M) : + (smallHilbertClassGroupCongr e).toMonoidHom.comp + (IdeleGroup.idealClass (K := K)) = + (IdeleGroup.idealClass (K := M)).comp + (ideleCongr e).toMonoidHom := by + ext a + exact smallHilbertClassGroupCongr_idealClass e a + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldOverOriginalBase.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldOverOriginalBase.lean new file mode 100644 index 0000000000..07c4d0a050 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldOverOriginalBase.lean @@ -0,0 +1,191 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldRealization +/-! +# The small Hilbert class field over the original number field + +The finite class-field construction realizes the small Hilbert class +field over a canonical fixed-field copy of the input number field. +The fixed-field copy is canonically `ℚ`-algebra equivalent to the +original field. This file uses that equivalence as the actual scalar +map, so the selected Hilbert class field becomes a finite abelian +Galois extension of the original field itself. + +This is the scalar structure used by the final extension-of-ideals map +in the principal ideal theorem. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +variable (K : Type) [Field K] [NumberField K] + +open scoped Classical in +/-- The canonical fixed-field copy underlying the selected small +Hilbert class field, regarded as an algebra over the original number +field. -/ +noncomputable instance smallHilbertClassFieldBaseAlgebraOverOriginal : + Algebra K (smallHilbertClassFieldBase K) := + (smallHilbertClassFieldBaseEquiv (K := K)).toRingHom.toAlgebra + +open scoped Classical in +/-- The canonical base-field identification, now regarded as an +equivalence of algebras over the original field. -/ +noncomputable def smallHilbertClassFieldBaseEquivOverOriginal : + K ≃ₐ[K] smallHilbertClassFieldBase K := + AlgEquiv.ofRingEquiv + (f := + (smallHilbertClassFieldBaseEquiv (K := K)).toRingEquiv) + (fun _ => rfl) + +open scoped Classical in +/-- The selected small Hilbert class field, regarded as an algebra over +the original number field through the canonical fixed-field copy. -/ +noncomputable instance smallHilbertClassFieldAlgebraOverOriginal : + Algebra K (smallHilbertClassField K) := + ((algebraMap + (smallHilbertClassFieldBase K) + (smallHilbertClassField K)).comp + (algebraMap K + (smallHilbertClassFieldBase K))).toAlgebra + +open scoped Classical in +/-- The scalar map from the original number field into the selected +small Hilbert class field is literally the canonical base equivalence +followed by the fixed-field inclusion. -/ +@[simp] +theorem smallHilbertClassField_algebraMap_original + (x : K) : + algebraMap K (smallHilbertClassField K) x = + algebraMap + (smallHilbertClassFieldBase K) + (smallHilbertClassField K) + (smallHilbertClassFieldBaseEquiv (K := K) x) := + rfl + +open scoped Classical in +/-- The canonical fixed-field copy has degree one over the original +number field. -/ +noncomputable instance + smallHilbertClassFieldBaseFiniteDimensionalOverOriginal : + FiniteDimensional K (smallHilbertClassFieldBase K) := + (smallHilbertClassFieldBaseEquivOverOriginal K) + |>.toLinearEquiv.finiteDimensional + +open scoped Classical in +/-- The original field, its canonical fixed-field copy, and the +selected small Hilbert class field form the literal scalar tower used +by extension of ideals. -/ +noncomputable instance smallHilbertClassFieldScalarTowerOverOriginal : + IsScalarTower K + (smallHilbertClassFieldBase K) + (smallHilbertClassField K) := + IsScalarTower.of_algebraMap_eq' rfl + +open scoped Classical in +/-- The selected small Hilbert class field is finite-dimensional over +the original number field. -/ +noncomputable instance + smallHilbertClassFieldFiniteDimensionalOverOriginal : + FiniteDimensional K (smallHilbertClassField K) := + FiniteDimensional.trans K + (smallHilbertClassFieldBase K) + (smallHilbertClassField K) + +open scoped Classical in +/-- The canonical fixed-field copy has relative degree one over the +original number field. -/ +@[simp] +theorem smallHilbertClassFieldBase_finrank_over_original : + Module.finrank K (smallHilbertClassFieldBase K) = 1 := by + simpa only [Module.finrank_self] using + (LinearEquiv.finrank_eq + (smallHilbertClassFieldBaseEquivOverOriginal K).toLinearEquiv).symm + +open scoped Classical in +/-- The degree of the selected small Hilbert class field over the +original number field is its ordinary class number. -/ +theorem smallHilbertClassField_finrank_over_original_eq_classNumber : + Module.finrank K (smallHilbertClassField K) = + NumberField.classNumber K := by + calc + Module.finrank K (smallHilbertClassField K) = + (smallHilbertClassFieldNormSubgroup (K := K)).index := + closedFiniteIndexClassField_finrank_eq_index + (smallHilbertClassFieldNormSubgroup (K := K)) + (smallHilbertClassFieldNormSubgroup_isClosed (K := K)) + _ = Nat.card + (IdeleClassGroup K ⧸ + smallHilbertClassFieldNormSubgroup (K := K)) := + Subgroup.index_eq_card + (smallHilbertClassFieldNormSubgroup (K := K)) + _ = NumberField.classNumber K := + smallHilbertClassFieldQuotient_card_eq_classNumber + (K := K) + +open scoped Classical in +/-- The selected small Hilbert class field is Galois over the original +number field, not only over its canonically equivalent fixed-field +copy. -/ +noncomputable instance smallHilbertClassFieldIsGaloisOverOriginal : + IsGalois K (smallHilbertClassField K) := by + let e := + smallHilbertClassFieldBaseEquiv (K := K) + apply IsGalois.of_equiv_equiv + (F := smallHilbertClassFieldBase K) + (E := smallHilbertClassField K) + (f := e.symm.toRingEquiv) + (g := RingEquiv.refl (smallHilbertClassField K)) + apply RingHom.ext + intro x + calc + ((algebraMap K (smallHilbertClassField K)).comp + e.symm.toRingEquiv) x = + algebraMap K (smallHilbertClassField K) (e.symm x) := rfl + _ = algebraMap + (smallHilbertClassFieldBase K) + (smallHilbertClassField K) + (smallHilbertClassFieldBaseEquiv (K := K) (e.symm x)) := + smallHilbertClassField_algebraMap_original + (K := K) (e.symm x) + _ = algebraMap + (smallHilbertClassFieldBase K) + (smallHilbertClassField K) x := by + simpa only [e] using + congrArg + (algebraMap + (smallHilbertClassFieldBase K) + (smallHilbertClassField K)) + ((smallHilbertClassFieldBaseEquiv + (K := K)).apply_symm_apply x) + _ = ((RingEquiv.refl + (smallHilbertClassField K)).toRingHom.comp + (algebraMap + (smallHilbertClassFieldBase K) + (smallHilbertClassField K))) x := rfl + +open scoped Classical in +/-- The selected small Hilbert class field is an abelian Galois +extension of the original number field. -/ +noncomputable instance + smallHilbertClassFieldIsAbelianGaloisOverOriginal : + IsAbelianGalois K (smallHilbertClassField K) := + IsAbelianGalois.of_base_equiv + (smallHilbertClassFieldBaseEquiv (K := K)).toRingEquiv + (smallHilbertClassField_algebraMap_original (K := K)) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertNormCharacterization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertNormCharacterization.lean new file mode 100644 index 0000000000..fcb859cbed --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertNormCharacterization.lean @@ -0,0 +1,459 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.InfinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex +/-! +# Small Hilbert norm subgroups and everywhere-unramified extensions + +For a finite Galois extension which is unramified at both finite and +infinite places, every idele integral at all finite places is an actual +relative-idele norm. It follows that the actual idele-class norm range +contains the small-Hilbert norm subgroup. + +This realizes the maximality of the small Hilbert class field on the +norm-subgroup side. The resulting quotient transition gives a canonical +surjection from the ordinary class group, its exact kernel +factorization, and the divisibility of the extension norm quotient order +by the class number. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField NumberField.LiesOver + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- Keep norm-range quotient normality out of exported declaration types. -/ +local instance + smallHilbertNormCharacterization_ideleClassGroupIsMulCommutative : + IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +omit [FiniteDimensional K L] in +/-- At an extension unramified at all infinite places, the determinant +norm image of every infinite tensor factor is the whole local +multiplicative group. -/ +theorem + infiniteTensorNormSubgroup_eq_top_of_isUnramifiedAtInfinitePlaces + [_root_.IsUnramifiedAtInfinitePlaces K L] + (v : InfinitePlace K) : + _root_.infiniteTensorNormSubgroup + (K := K) (L := L) v = ⊤ := by + obtain ⟨w, hw⟩ := + InfinitePlace.comap_surjective + (K := L) v + let : w.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) hw⟩ + rw [ + _root_.infiniteTensorNormSubgroup_eq_localNormSubgroup + (K := K) (L := L) v w hw] + apply top_unique + intro x _ + refine + ⟨Units.map + (algebraMap + v.Completion w.Completion).toMonoidHom x, + ?_⟩ + apply Units.ext + change + Algebra.norm v.Completion + (algebraMap v.Completion w.Completion + (x : v.Completion)) = + (x : v.Completion) + rw [ + Algebra.norm_algebraMap, + InfinitePlace.IsUnramified.finrank_eq_one + v (w.isUnramified K), + pow_one] + +/-- If the finite ramification support is empty, the chosen completion +above every finite base place is unramified. -/ +theorem chosenFinitePlaceIsUnramified_of_no_ramifiedFinitePlaces + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (v : HeightOneSpectrum (𝓞 K)) : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v := by + apply + _root_.chosenFinitePlaceIsUnramified_of_isUnramifiedAt + (K := K) (L := L) v + by_contra hramified + have hv : + v ∈ _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) := by + rw [_root_.mem_ramifiedBaseFinitePlaces_iff] + exact + ⟨_root_.finitePlaceExtensionCentre + (K := K) (L := L) v + (_root_.chosenFinitePlaceExtension (L := L) v), + _root_.finitePlaceExtensionCentre_liesOver + (K := K) (L := L) v + (_root_.chosenFinitePlaceExtension (L := L) v), + hramified⟩ + rw [hunramifiedFinite] at hv + simp at hv + +/-- In an extension unramified at every finite and infinite place, +every idele integral at all finite places is an actual relative-idele +norm. -/ +theorem + integralAtFinitePlaces_le_relativeIdeleNorm_range_of_everywhereUnramified + [_root_.IsUnramifiedAtInfinitePlaces K L] + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + IdeleGroup.integralAtFinitePlaces (K := K) ≤ + (RelativeIdeleGroup.norm K L).range := by + intro a ha + refine + (_root_.mem_relativeIdeleNorm_range_iff_localTensorNorms + (K := K) (L := L) a).2 ⟨?_, ?_⟩ + · intro v + rw [ + infiniteTensorNormSubgroup_eq_top_of_isUnramifiedAtInfinitePlaces + (K := K) (L := L) v] + exact Subgroup.mem_top _ + · intro v + rw [ + _root_.finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup] + apply + _root_.adicCompletionIntegerUnits_le_chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v + (chosenFinitePlaceIsUnramified_of_no_ramifiedFinitePlaces + (K := K) (L := L) hunramifiedFinite v) + change a.2 v ∈ (v.adicCompletionIntegers K).units + exact + (FiniteIdeleGroup.mem_integralSubgroup_iff a.2).1 ha v + +private theorem integralIdeleClass_mem_ideleClassNorm_range_of_everywhereUnramified + [_root_.IsUnramifiedAtInfinitePlaces K L] + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + {a : IdeleGroup K} + (ha : a ∈ IdeleGroup.integralAtFinitePlaces (K := K)) : + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a ∈ + (_root_.ideleClassNorm K L).range := by + obtain ⟨z, hz⟩ := + integralAtFinitePlaces_le_relativeIdeleNorm_range_of_everywhereUnramified + (K := K) (L := L) hunramifiedFinite ha + refine + ⟨QuotientGroup.mk' + (IdeleGroup.principalSubgroup L) + (_root_.relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) z), + ?_⟩ + change + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (IdeleGroup.norm K L + (_root_.relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) z)) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a + rw [IdeleGroup.norm_relativeIdeleBaseChangeMulEquiv, hz] + +omit [FiniteDimensional K L] [IsGalois K L] in +private theorem principalIdeleClass_mem_ideleClassNorm_range + {a : IdeleGroup K} + (ha : a ∈ IdeleGroup.principalSubgroup K) : + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a ∈ + (_root_.ideleClassNorm K L).range := by + have haOne : + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a = 1 := + (QuotientGroup.eq_one_iff a).2 ha + rw [haOne] + exact ((_root_.ideleClassNorm K L).range).one_mem + +/-- The norm subgroup of an everywhere-unramified finite Galois +extension contains the small-Hilbert norm subgroup. -/ +theorem + smallHilbertClassFieldNormSubgroup_le_ideleClassNorm_range_of_everywhereUnramified + [_root_.IsUnramifiedAtInfinitePlaces K L] + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + smallHilbertClassFieldNormSubgroup (K := K) ≤ + (_root_.ideleClassNorm K L).range := by + rw [smallHilbertClassFieldNormSubgroup, + Subgroup.map_le_iff_le_comap] + apply sup_le + · intro a ha + exact + integralIdeleClass_mem_ideleClassNorm_range_of_everywhereUnramified + (K := K) (L := L) hunramifiedFinite ha + · intro a ha + exact + principalIdeleClass_mem_ideleClassNorm_range + (K := K) (L := L) ha + +/-- The canonical transition from the small-Hilbert reciprocity +quotient to the actual norm quotient of an everywhere-unramified +extension. -/ +def smallHilbertClassFieldQuotientToIdeleClassNormQuotient + [_root_.IsUnramifiedAtInfinitePlaces K L] + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + (IdeleClassGroup K ⧸ + smallHilbertClassFieldNormSubgroup (K := K)) →* + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + QuotientGroup.map + (smallHilbertClassFieldNormSubgroup (K := K)) + ((_root_.ideleClassNorm K L).range) + (MonoidHom.id _) + (fun _ hx => + smallHilbertClassFieldNormSubgroup_le_ideleClassNorm_range_of_everywhereUnramified + (K := K) (L := L) hunramifiedFinite hx) + +/-- The small-Hilbert quotient transition sends an idele class to the +same class modulo the actual norm subgroup. -/ +theorem smallHilbertClassFieldQuotientToIdeleClassNormQuotient_mk + [_root_.IsUnramifiedAtInfinitePlaces K L] + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) + (x : IdeleClassGroup K) : + smallHilbertClassFieldQuotientToIdeleClassNormQuotient + (K := K) (L := L) hunramifiedFinite + (QuotientGroup.mk' + (smallHilbertClassFieldNormSubgroup (K := K)) x) = + QuotientGroup.mk' + ((_root_.ideleClassNorm K L).range) x := + rfl + +/-- The transition from the small-Hilbert quotient to an +everywhere-unramified actual norm quotient is surjective. -/ +theorem + smallHilbertClassFieldQuotientToIdeleClassNormQuotient_surjective + [_root_.IsUnramifiedAtInfinitePlaces K L] + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + Function.Surjective + (smallHilbertClassFieldQuotientToIdeleClassNormQuotient + (K := K) (L := L) hunramifiedFinite) := by + intro q + obtain ⟨x, rfl⟩ := + QuotientGroup.mk'_surjective + ((_root_.ideleClassNorm K L).range) q + exact + ⟨QuotientGroup.mk' + (smallHilbertClassFieldNormSubgroup (K := K)) x, + rfl⟩ + +/-- The kernel of the small-Hilbert quotient transition is the image +of the actual norm subgroup modulo the small-Hilbert norm subgroup. -/ +theorem + smallHilbertClassFieldQuotientToIdeleClassNormQuotient_ker + [_root_.IsUnramifiedAtInfinitePlaces K L] + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + MonoidHom.ker + (smallHilbertClassFieldQuotientToIdeleClassNormQuotient + (K := K) (L := L) hunramifiedFinite) = + Subgroup.map + (QuotientGroup.mk' + (smallHilbertClassFieldNormSubgroup (K := K))) + ((_root_.ideleClassNorm K L).range) := by + unfold smallHilbertClassFieldQuotientToIdeleClassNormQuotient + exact + (QuotientGroup.ker_map + (N := smallHilbertClassFieldNormSubgroup (K := K)) + ((_root_.ideleClassNorm K L).range) + (MonoidHom.id (IdeleClassGroup K)) + (fun _ hx => + smallHilbertClassFieldNormSubgroup_le_ideleClassNorm_range_of_everywhereUnramified + (K := K) (L := L) hunramifiedFinite hx)).trans + (congrArg + (Subgroup.map + (QuotientGroup.mk' (smallHilbertClassFieldNormSubgroup (K := K)))) + (Subgroup.comap_id ((_root_.ideleClassNorm K L).range))) + +/-- Quotienting the small-Hilbert reciprocity quotient by the image of +the actual norm subgroup recovers the actual norm quotient. -/ +def smallHilbertNormImageQuotientEquivIdeleClassNormQuotient + [_root_.IsUnramifiedAtInfinitePlaces K L] + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + ((IdeleClassGroup K ⧸ + smallHilbertClassFieldNormSubgroup (K := K)) ⧸ + Subgroup.map + (QuotientGroup.mk' + (smallHilbertClassFieldNormSubgroup (K := K))) + ((_root_.ideleClassNorm K L).range)) ≃* + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + (QuotientGroup.quotientMulEquivOfEq + (smallHilbertClassFieldQuotientToIdeleClassNormQuotient_ker + (K := K) (L := L) hunramifiedFinite).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (smallHilbertClassFieldQuotientToIdeleClassNormQuotient + (K := K) (L := L) hunramifiedFinite) + (smallHilbertClassFieldQuotientToIdeleClassNormQuotient_surjective + (K := K) (L := L) hunramifiedFinite)) + +/-- The ordinary class group maps canonically onto the actual norm +quotient of every everywhere-unramified finite Galois extension. -/ +def classGroupToIdeleClassNormQuotient + [_root_.IsUnramifiedAtInfinitePlaces K L] + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + ClassGroup (𝓞 K) →* + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + (smallHilbertClassFieldQuotientToIdeleClassNormQuotient + (K := K) (L := L) hunramifiedFinite).comp + (smallHilbertClassFieldQuotientEquivClassGroup + (K := K)).symm.toMonoidHom + +/-- The canonical map from the ordinary class group to the actual norm +quotient of an everywhere-unramified extension is surjective. -/ +theorem classGroupToIdeleClassNormQuotient_surjective + [_root_.IsUnramifiedAtInfinitePlaces K L] + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + Function.Surjective + (classGroupToIdeleClassNormQuotient + (K := K) (L := L) hunramifiedFinite) := + (smallHilbertClassFieldQuotientToIdeleClassNormQuotient_surjective + (K := K) (L := L) hunramifiedFinite).comp + (smallHilbertClassFieldQuotientEquivClassGroup + (K := K)).symm.surjective + +/-- The actual norm quotient of an everywhere-unramified finite Galois +extension has order dividing the class number. -/ +theorem + ideleClassNormQuotient_card_dvd_classNumber_of_everywhereUnramified + [_root_.IsUnramifiedAtInfinitePlaces K L] + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ∣ + NumberField.classNumber K := by + calc + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ∣ + Nat.card + (IdeleClassGroup K ⧸ + smallHilbertClassFieldNormSubgroup (K := K)) := by + simpa only [Subgroup.index_eq_card] using + Subgroup.index_dvd_of_le + (smallHilbertClassFieldNormSubgroup_le_ideleClassNorm_range_of_everywhereUnramified + (K := K) (L := L) hunramifiedFinite) + _ = NumberField.classNumber K := + smallHilbertClassFieldQuotient_card_eq_classNumber + (K := K) + +/-- The class number factors as the kernel order of the canonical class +group map times the order of an everywhere-unramified actual norm +quotient. -/ +theorem + classNumber_eq_unramifiedNormKernel_card_mul_normQuotient_card + [_root_.IsUnramifiedAtInfinitePlaces K L] + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + NumberField.classNumber K = + Nat.card + (MonoidHom.ker + (classGroupToIdeleClassNormQuotient + (K := K) (L := L) hunramifiedFinite)) * + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + let f := + classGroupToIdeleClassNormQuotient + (K := K) (L := L) hunramifiedFinite + have hf : Function.Surjective f := + classGroupToIdeleClassNormQuotient_surjective + (K := K) (L := L) hunramifiedFinite + calc + NumberField.classNumber K = + Nat.card (ClassGroup (𝓞 K)) := by + rw [NumberField.classNumber, ← Nat.card_eq_fintype_card] + _ = + Nat.card (MonoidHom.ker f) * + (MonoidHom.ker f).index := + (Subgroup.card_mul_index (MonoidHom.ker f)).symm + _ = Nat.card (MonoidHom.ker f) * + Nat.card f.range := by + rw [Subgroup.index_ker f] + _ = Nat.card (MonoidHom.ker f) * + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + rw [f.range_eq_top_of_surjective hf, Subgroup.card_top] + +/-- The degree of every finite cyclic extension unramified at all finite +and infinite places divides the class number. -/ +theorem cyclicEverywhereUnramifiedExtensionDegree_dvd_classNumber + [_root_.IsUnramifiedAtInfinitePlaces K L] + [IsCyclic (L ≃ₐ[K] L)] + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + Module.finrank K L ∣ + NumberField.classNumber K := by + simpa only [ + ← Subgroup.index_eq_card, + ClassFieldAxiom.ideleClassNorm_index_eq_finrank_cyclic K L] using + ideleClassNormQuotient_card_dvd_classNumber_of_everywhereUnramified + (K := K) (L := L) hunramifiedFinite + +/-- For a finite cyclic extension unramified at all finite and infinite +places, the class number is the kernel order of the canonical class +group reciprocity map times the extension degree. -/ +theorem + classNumber_eq_unramifiedCyclicNormKernel_card_mul_extensionDegree + [_root_.IsUnramifiedAtInfinitePlaces K L] + [IsCyclic (L ≃ₐ[K] L)] + (hunramifiedFinite : + _root_.ramifiedBaseFinitePlaces + (K := K) (L := L) = ∅) : + NumberField.classNumber K = + Nat.card + (MonoidHom.ker + (classGroupToIdeleClassNormQuotient + (K := K) (L := L) hunramifiedFinite)) * + Module.finrank K L := by + simpa only [ + ← Subgroup.index_eq_card, + ClassFieldAxiom.ideleClassNorm_index_eq_finrank_cyclic K L] using + classNumber_eq_unramifiedNormKernel_card_mul_normQuotient_card + (K := K) (L := L) hunramifiedFinite + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeArtin.lean new file mode 100644 index 0000000000..e825da6e14 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeArtin.lean @@ -0,0 +1,244 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin +/-! +# Prime Artin elements at unramified finite places + +For a finite abelian extension of number fields, the global Artin image +of the normalized one-place prime idèle is the chosen local Artin image +of an element of normalized order one. + +At a chosen unramified finite place, integral units lie in the local norm +group. Consequently the local Artin symbol depends only on normalized +order, the prime Artin element generates the full decomposition group, +and its order is the local degree. This gives the genuine +decomposition law: the prime Artin element is trivial exactly when the +place splits completely. +-/ + +@[expose] public section + +open scoped NumberField +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain IdeleGroup + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + +open scoped Classical in +/-- The actual global Artin element of the normalized one-place prime +idèle at a finite place. -/ +def finitePlacePrimeArtin + (v : HeightOneSpectrum (𝓞 K)) : + L ≃ₐ[K] L := + Reciprocity.globalArtinMonoidHom + (K := K) (L := L) (finitePrimeIdele v) + +open scoped Classical in +/-- The global prime Artin element is the chosen local Artin image of +the normalized order-one local element. -/ +@[simp] +theorem finitePlacePrimeArtin_eq_chosenFinitePlaceArtin + (v : HeightOneSpectrum (𝓞 K)) : + finitePlacePrimeArtin (K := K) (L := L) v = + Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v + (FiniteIdeleGroup.chosenLocalOrderSection v 1) := by + rw [finitePlacePrimeArtin, finitePrimeIdele, + Reciprocity.globalArtinMonoidHom_finitePlaceIdele] + +open scoped Classical in +/-- At a chosen unramified finite place, two local elements of equal +normalized order have the same local Artin symbol. -/ +theorem + chosenFinitePlaceArtin_eq_of_localOrder_eq_of_chosenUnramified + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) + {x y : (v.adicCompletion K)ˣ} + (hxy : + FiniteIdeleGroup.localOrder v x = + FiniteIdeleGroup.localOrder v y) : + Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x = + Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v y := by + have hunit : + x * y⁻¹ ∈ + (v.adicCompletionIntegers K).units := by + apply + (FiniteIdeleGroup.localOrder_eq_zero_iff + v (x * y⁻¹)).1 + rw [map_mul, map_inv, hxy] + simp + have hker : + x * y⁻¹ ∈ + (Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).ker := by + rw [ + Reciprocity.chosenFinitePlaceArtinMonoidHom_ker + (K := K) (L := L) v] + exact + _root_.adicCompletionIntegerUnits_le_chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v hunram hunit + exact + mul_inv_eq_one.mp + (by + simpa only [map_mul, map_inv] using + MonoidHom.mem_ker.mp hker) + +open scoped Classical in +/-- At a chosen unramified finite place, every local Artin symbol is a +power of the normalized prime Artin element, with exponent its +normalized local order. -/ +theorem + chosenFinitePlaceArtin_eq_primeArtin_zpow_of_chosenUnramified + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) + (x : (v.adicCompletion K)ˣ) : + Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x = + finitePlacePrimeArtin (K := K) (L := L) v ^ + (FiniteIdeleGroup.localOrder v x).toAdd := by + rw [finitePlacePrimeArtin_eq_chosenFinitePlaceArtin] + let n := (FiniteIdeleGroup.localOrder v x).toAdd + calc + Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x = + Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v + ((FiniteIdeleGroup.chosenLocalOrderSection v 1) ^ n) := by + apply + chosenFinitePlaceArtin_eq_of_localOrder_eq_of_chosenUnramified + (K := K) (L := L) v hunram + apply Multiplicative.ext + rw [map_zpow, Int.toAdd_zpow, + FiniteIdeleGroup.localOrder_chosenLocalOrderSection] + simp only [n, one_mul] + _ = + Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v + (FiniteIdeleGroup.chosenLocalOrderSection v 1) ^ n := by + exact map_zpow + (Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v) + (FiniteIdeleGroup.chosenLocalOrderSection v 1) n + +open scoped Classical in +/-- At a chosen unramified finite place, the prime Artin element +generates the actual decomposition group. -/ +theorem + finitePlaceDecompositionGroup_eq_zpowers_finitePlacePrimeArtin_of_chosenUnramified + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + _root_.finitePlaceDecompositionGroup + (K := K) (L := L) v = + Subgroup.zpowers + (finitePlacePrimeArtin + (K := K) (L := L) v) := by + rw [ + ← Reciprocity.chosenFinitePlaceArtinMonoidHom_range + (K := K) (L := L) v] + apply le_antisymm + · rintro σ ⟨x, rfl⟩ + rw [ + chosenFinitePlaceArtin_eq_primeArtin_zpow_of_chosenUnramified + (K := K) (L := L) v hunram x] + exact + Subgroup.zpow_mem_zpowers + (finitePlacePrimeArtin + (K := K) (L := L) v) + (FiniteIdeleGroup.localOrder v x).toAdd + · intro σ hσ + obtain ⟨n, rfl⟩ := + (Subgroup.mem_zpowers_iff.mp hσ) + refine + ⟨(FiniteIdeleGroup.chosenLocalOrderSection v 1) ^ n, ?_⟩ + rw [map_zpow, + ← finitePlacePrimeArtin_eq_chosenFinitePlaceArtin + (K := K) (L := L) v] + +open scoped Classical in +/-- At a chosen unramified finite place, the order of the actual prime +Artin element is the local extension degree. -/ +theorem + orderOf_finitePlacePrimeArtin_eq_finitePlaceLocalDegree_of_chosenUnramified + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + orderOf + (finitePlacePrimeArtin + (K := K) (L := L) v) = + _root_.finitePlaceLocalDegree + (K := K) (L := L) v := by + calc + orderOf + (finitePlacePrimeArtin + (K := K) (L := L) v) = + Nat.card + (Subgroup.zpowers + (finitePlacePrimeArtin + (K := K) (L := L) v)) := + (Nat.card_zpowers + (finitePlacePrimeArtin + (K := K) (L := L) v)).symm + _ = + Nat.card + (_root_.finitePlaceDecompositionGroup + (K := K) (L := L) v) := by + rw [ + finitePlaceDecompositionGroup_eq_zpowers_finitePlacePrimeArtin_of_chosenUnramified + (K := K) (L := L) v hunram] + _ = + _root_.finitePlaceLocalDegree + (K := K) (L := L) v := + _root_.finitePlaceDecompositionGroup_card_eq_localDegree + (K := K) (L := L) v + +open scoped Classical in +/-- At a chosen unramified finite place, the actual prime Artin element +is trivial exactly when the place splits completely. -/ +theorem + finitePlacePrimeArtin_eq_one_iff_splitsCompletely_of_chosenUnramified + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + finitePlacePrimeArtin + (K := K) (L := L) v = + 1 ↔ + _root_.FinitePlaceSplitsCompletely + (K := K) (L := L) v := by + rw [ + _root_.finitePlaceSplitsCompletely_iff_localDegree_eq_one, + ← + orderOf_finitePlacePrimeArtin_eq_finitePlaceLocalDegree_of_chosenUnramified + (K := K) (L := L) v hunram] + exact orderOf_eq_one_iff.symm + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeNormClass.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeNormClass.lean new file mode 100644 index 0000000000..7ada595426 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeNormClass.lean @@ -0,0 +1,257 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FinitePlaceArtinQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ProductFormula +/-! +# Prime norm classes at unramified finite places + +For a finite abelian extension of number fields, the normalized +order-one element at a finite place defines a class in the chosen +local norm quotient. Under local reciprocity this class is the actual +prime Artin element in the chosen decomposition group. + +At a chosen unramified place, its order is therefore the local degree, +and its triviality is equivalent to complete splitting. The +one-place local-to-global norm map sends this local class to the +corresponding prime class in the global idèle-class norm quotient, so +the order of the global class divides the local degree. +-/ + +@[expose] public section + +open scoped NumberField +noncomputable +section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain + +open scoped Classical in +private theorem unramifiedPrimeNormClassGroupIsMulCommutative + (F : Type) [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + IsMulCommutative.of_comm (fun a b => mul_comm a b) + +attribute [local instance] unramifiedPrimeNormClassGroupIsMulCommutative + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + +section FiniteGalois + +variable [IsGalois K L] + +open scoped Classical in +/-- The class of the normalized order-one local element in the chosen +finite-place norm quotient. -/ +def finitePlacePrimeNormClass + (v : HeightOneSpectrum (𝓞 K)) : + _root_.ChosenFinitePlaceNormQuotient + (K := K) (L := L) v := + _root_.finitePlaceTensorNormClass + (K := K) (L := L) v + (FiniteIdeleGroup.chosenLocalOrderSection v 1) + +open scoped Classical in +/-- The one-place local-to-global norm map sends the local prime norm +class to the corresponding prime class in the global idèle-class norm +quotient. -/ +@[simp] +theorem finitePlaceNormQuotientToGlobalClass_finitePlacePrimeNormClass + (v : HeightOneSpectrum (𝓞 K)) : + Reciprocity.finitePlaceNormQuotientToGlobalClass + (K := K) (L := L) v + (finitePlacePrimeNormClass + (K := K) (L := L) v) = + ideleClassNormFrobeniusClass + (K := K) (L := L) v := by + change + Reciprocity.finitePlaceNormQuotientToGlobalClass + (K := K) (L := L) v + (_root_.finitePlaceTensorNormClass + (K := K) (L := L) v + (FiniteIdeleGroup.chosenLocalOrderSection v 1)) = + ideleClassNormFrobeniusClass + (K := K) (L := L) v + rw [ + Reciprocity.finitePlaceNormQuotientToGlobalClass_localClass + (K := K) (L := L) v] + rfl + +end FiniteGalois + +variable [IsAbelianGalois K L] + +open scoped Classical in +/-- The local prime norm class corresponds to the actual prime Artin +element under the finite-place reciprocity equivalence. -/ +@[simp] +theorem + coe_chosenFinitePlaceNormQuotientEquivDecompositionGroup_finitePlacePrimeNormClass + (v : HeightOneSpectrum (𝓞 K)) : + ((chosenFinitePlaceNormQuotientEquivDecompositionGroup + (K := K) (L := L) v + (finitePlacePrimeNormClass + (K := K) (L := L) v) : + _root_.finitePlaceDecompositionGroup + (K := K) (L := L) v) : + L ≃ₐ[K] L) = + finitePlacePrimeArtin (K := K) (L := L) v := by + change + ((chosenFinitePlaceNormQuotientEquivDecompositionGroup + (K := K) (L := L) v + (QuotientGroup.mk + (FiniteIdeleGroup.chosenLocalOrderSection v 1)) : + _root_.finitePlaceDecompositionGroup + (K := K) (L := L) v) : + L ≃ₐ[K] L) = + finitePlacePrimeArtin (K := K) (L := L) v + rw [ + chosenFinitePlaceNormQuotientEquivDecompositionGroup_mk + (K := K) (L := L) v] + change + Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v + (FiniteIdeleGroup.chosenLocalOrderSection v 1) = + finitePlacePrimeArtin (K := K) (L := L) v + exact + (finitePlacePrimeArtin_eq_chosenFinitePlaceArtin + (K := K) (L := L) v).symm + +open scoped Classical in +/-- The order of the local prime norm class always divides the local +extension degree. -/ +theorem orderOf_finitePlacePrimeNormClass_dvd_finitePlaceLocalDegree + (v : HeightOneSpectrum (𝓞 K)) : + orderOf + (finitePlacePrimeNormClass + (K := K) (L := L) v) ∣ + _root_.finitePlaceLocalDegree + (K := K) (L := L) v := by + rw [ + ← + chosenFinitePlaceNormQuotient_card_eq_finitePlaceLocalDegree + (K := K) (L := L) v] + exact + orderOf_dvd_natCard + (finitePlacePrimeNormClass + (K := K) (L := L) v) + +open scoped Classical in +/-- At a chosen unramified finite place, the order of the local prime +norm class is the local extension degree. -/ +theorem + orderOf_finitePlacePrimeNormClass_eq_finitePlaceLocalDegree_of_chosenUnramified + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + orderOf + (finitePlacePrimeNormClass + (K := K) (L := L) v) = + _root_.finitePlaceLocalDegree + (K := K) (L := L) v := by + let e : + _root_.ChosenFinitePlaceNormQuotient + (K := K) (L := L) v ≃* + _root_.finitePlaceDecompositionGroup + (K := K) (L := L) v := + chosenFinitePlaceNormQuotientEquivDecompositionGroup + (K := K) (L := L) v + let f : + _root_.ChosenFinitePlaceNormQuotient + (K := K) (L := L) v →* + (L ≃ₐ[K] L) := + (_root_.finitePlaceDecompositionGroup + (K := K) (L := L) v).subtype.comp + e.toMonoidHom + have hf : Function.Injective f := by + intro x y hxy + apply e.injective + apply Subtype.ext + change + (e x : L ≃ₐ[K] L) = + (e y : L ≃ₐ[K] L) at hxy + exact hxy + have hprime : + f + (finitePlacePrimeNormClass + (K := K) (L := L) v) = + finitePlacePrimeArtin + (K := K) (L := L) v := by + change + (e (finitePlacePrimeNormClass + (K := K) (L := L) v) : L ≃ₐ[K] L) = + finitePlacePrimeArtin + (K := K) (L := L) v + exact + coe_chosenFinitePlaceNormQuotientEquivDecompositionGroup_finitePlacePrimeNormClass + (K := K) (L := L) v + have horder := + orderOf_injective f hf + (finitePlacePrimeNormClass + (K := K) (L := L) v) + rw [hprime] at horder + exact + horder.symm.trans + (orderOf_finitePlacePrimeArtin_eq_finitePlaceLocalDegree_of_chosenUnramified + (K := K) (L := L) v hunram) + +open scoped Classical in +/-- At a chosen unramified finite place, the local prime norm class is +trivial exactly when the place splits completely. -/ +theorem + finitePlacePrimeNormClass_eq_one_iff_splitsCompletely_of_chosenUnramified + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + finitePlacePrimeNormClass + (K := K) (L := L) v = + 1 ↔ + _root_.FinitePlaceSplitsCompletely + (K := K) (L := L) v := by + rw [ + _root_.finitePlaceSplitsCompletely_iff_localDegree_eq_one, + ← + orderOf_finitePlacePrimeNormClass_eq_finitePlaceLocalDegree_of_chosenUnramified + (K := K) (L := L) v hunram] + exact orderOf_eq_one_iff.symm + +open scoped Classical in +/-- The order of the global idèle-class norm prime class always +divides the local extension degree. -/ +theorem orderOf_ideleClassNormFrobeniusClass_dvd_finitePlaceLocalDegree + (v : HeightOneSpectrum (𝓞 K)) : + orderOf + (ideleClassNormFrobeniusClass + (K := K) (L := L) v) ∣ + _root_.finitePlaceLocalDegree + (K := K) (L := L) v := by + rw [ + ← + finitePlaceNormQuotientToGlobalClass_finitePlacePrimeNormClass + (K := K) (L := L) v] + exact + (orderOf_map_dvd + (Reciprocity.finitePlaceNormQuotientToGlobalClass + (K := K) (L := L) v) + (finitePlacePrimeNormClass + (K := K) (L := L) v)).trans + (orderOf_finitePlacePrimeNormClass_dvd_finitePlaceLocalDegree + (K := K) (L := L) v) + +end GlobalClassFields +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory.lean new file mode 100644 index 0000000000..3c3a9861d8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory.lean @@ -0,0 +1,34 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.AbstractCapitulation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealDecompositionLaw +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealDecompositionLaw +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealNormArtinExactness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationStatement +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTheorem +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTransfer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalAbstractExtensionToOrdinary +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFixedFieldBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertPrincipalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerConjugation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerUnramified + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/AbstractCapitulation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/AbstractCapitulation.lean new file mode 100644 index 0000000000..90fbdfd9d3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/AbstractCapitulation.lean @@ -0,0 +1,299 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransfer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer.Witt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient +/-! +# Transfer input for the principal ideal theorem + +The Galois correspondence realizes a subgroup `S ≤ Gal(M / K)` as an +intermediate field. The transfer construction independently realizes +`Gal(M / M^S)` as a subgroup of `Gal(M / K)`. The first theorem below +identifies these two actual subgroups. + +For `S` equal to the commutator subgroup, this identification puts the +transfer used by reciprocity in exactly the form covered by Witt's transfer +theorem. Consequently that transfer is trivial. No class-field +realization or norm-subgroup equality is assumed here. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open ClassFormation +open CyclicCohomology + +variable {G : Type u} [Group G] [TopologicalSpace G] + [IsTopologicalGroup G] +variable {K : ClosedSubgroup G} + +/-- The subgroup used by transfer for the intermediate field cut out by +`S` is exactly `S`, not merely an abstractly isomorphic copy. -/ +theorem transferIntermediateSubgroup_eq_galoisCorrespondenceSubgroup + (M : FiniteGaloisSubextension K) + (S : Subgroup M.extensionQuotient) : + transferNormNaturalityIntermediateSubgroup + K (M.intermediateField S) M.field + (M.field_le_intermediateField S) + (M.intermediateField_le_base S) = + S := by + ext q + constructor + · rintro ⟨x, rfl⟩ + refine QuotientGroup.induction_on x ?_ + intro m + rw [transferNormNaturalityIntermediateInclusion_mk] + apply (M.mem_intermediateSubgroup_iff S _).1 + rw [← M.extensionSubgroup_intermediateField_eq S] + change (m : G) ∈ M.intermediateField S + exact m.property + · intro hq + obtain ⟨k, rfl⟩ := M.extensionQuotientMk_surjective q + have hk : + k ∈ M.intermediateSubgroup S := + (M.mem_intermediateSubgroup_iff S k).2 hq + let m : (M.intermediateField S).toSubgroup := + ⟨k.1, ⟨k, hk, rfl⟩⟩ + refine ⟨QuotientGroup.mk m, ?_⟩ + rw [transferNormNaturalityIntermediateInclusion_mk] + exact + congrArg + (fun z : K.toSubgroup => + (QuotientGroup.mk z : M.extensionQuotient)) + (Subtype.ext (by rfl)) + +/-- For the maximal abelian intermediate field of `M / K`, the transfer +appearing in transfer--norm naturality is trivial. This is the precise +group-theoretic input needed for principalization. -/ +theorem commutatorIntermediateTransfer_eq_one + (M : FiniteGaloisSubextension K) : + let S := commutator M.extensionQuotient + letI : (extensionSubgroup (M.intermediateField S) M.field + (M.field_le_intermediateField S)).Normal := + M.extensionSubgroup_over_intermediate_normal S + letI : Finite (K.toSubgroup ⧸ + extensionSubgroup K M.field M.below) := + M.finite + transferNormNaturalityTransfer + K (M.intermediateField S) M.field + (M.field_le_intermediateField S) + (M.intermediateField_le_base S) = + 1 := by + dsimp only + let S := commutator M.extensionQuotient + let hLM := M.field_le_intermediateField S + let hMK := M.intermediateField_le_base S + let : (extensionSubgroup (M.intermediateField S) M.field hLM).Normal := + M.extensionSubgroup_over_intermediate_normal S + let : Finite (K.toSubgroup ⧸ + extensionSubgroup K M.field (hLM.trans hMK)) := + M.finite + let H := + transferNormNaturalityIntermediateSubgroup + K (M.intermediateField S) M.field hLM hMK + let e := + transferNormNaturalityIntermediateQuotientEquiv + K (M.intermediateField S) M.field hLM hMK + have hH : H = S := by + exact transferIntermediateSubgroup_eq_galoisCorrespondenceSubgroup M S + let hSFiniteIndex : S.FiniteIndex := + Subgroup.finiteIndex_of_finite + let _ : S.FiniteIndex := hSFiniteIndex + let hHFiniteIndex : H.FiniteIndex := + hH.symm ▸ hSFiniteIndex + let _ : H.FiniteIndex := hHFiniteIndex + let c : H ≃* S := + MulEquiv.subgroupCongr hH + change + e.symm.abelianizationCongr.toMonoidHom.comp + (Abelianization.lift + (MonoidHom.transfer + (Abelianization.of : H →* + Abelianization H))) = + 1 + have hresult : + e.symm.abelianizationCongr.toMonoidHom.comp + (Abelianization.lift + (MonoidHom.transfer + (Abelianization.of : H →* Abelianization H))) = + 1 := by + have hcongr : + c.abelianizationCongr.toMonoidHom.comp + (Abelianization.lift + (MonoidHom.transfer + (Abelianization.of : H →* Abelianization H))) = + Abelianization.lift + (MonoidHom.transfer + (Abelianization.of : S →* Abelianization S)) := by + exact @abelianization_transfer_congr_subgroup + M.extensionQuotient inferInstance H S hH + hHFiniteIndex hSFiniteIndex + apply MonoidHom.ext + intro a + change + e.symm.abelianizationCongr + (Abelianization.lift + (MonoidHom.transfer + (Abelianization.of : H →* + Abelianization H)) a) = + 1 + rw [← abelianizationCongr_symm] + apply e.abelianizationCongr.injective + simp only [e.abelianizationCongr.apply_symm_apply, map_one] + apply c.abelianizationCongr.injective + simp only [map_one] + calc + c.abelianizationCongr + (Abelianization.lift + (MonoidHom.transfer + (Abelianization.of : H →* + Abelianization H)) a) = + Abelianization.lift + (MonoidHom.transfer + (Abelianization.of : + S →* Abelianization S)) a := by + change + c.abelianizationCongr.toMonoidHom + (Abelianization.lift + (MonoidHom.transfer + (Abelianization.of : H →* + Abelianization H)) a) = + Abelianization.lift + (MonoidHom.transfer + (Abelianization.of : + S →* Abelianization S)) a + exact DFunLike.congr_fun hcongr a + _ = + GroupTheory.Transfer.Witt.commutatorTransfer + (G := M.extensionQuotient) a := rfl + _ = 1 := by + rw [ + GroupTheory.Transfer.Witt.commutatorTransfer_eq_one_of_finite_abelianization] + rfl + exact hresult + +section AbstractCapitulation + +variable {Γ : IntegralRepGroupType} + [Group Γ] [TopologicalSpace Γ] + [IsTopologicalGroup Γ] [CompactSpace Γ] [T2Space Γ] + [TotallyDisconnectedSpace Γ] + +/-- The fixed-field inclusion from a base field to the intermediate field +cut out by the commutator vanishes on the corresponding finite norm +quotients. This is the capitulation statement supplied by reciprocity and +Witt transfer, before specializing the class formation to ideles. -/ +theorem intermediateNormQuotientInclusion_commutator_eq_zero + (D : DegreeData Γ) (A : Rep ℤ Γ) + (v : ValuationData D A) + (hcf : SatisfiesClassFieldAxiom A) + (K : FiniteAbstractField Γ) + (M : FiniteGaloisSubextension K.field) : + let S := commutator M.extensionQuotient + letI : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field M.field M.below) := + M.finite + letI : Finite + ((M.intermediateField S).toSubgroup ⧸ + extensionSubgroup (M.intermediateField S) M.field + (M.field_le_intermediateField S)) := + M.extension_over_intermediate_finite S + M.intermediateNormQuotientInclusion A S = 0 := by + dsimp only + let S := commutator M.extensionQuotient + let hLM := M.field_le_intermediateField S + let hMK := M.intermediateField_le_base S + let : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field M.field M.below) := + M.finite + let : (extensionSubgroup K.field M.field M.below).Normal := + M.normal + let : Finite + ((M.intermediateField S).toSubgroup ⧸ + extensionSubgroup (M.intermediateField S) M.field hLM) := + M.extension_over_intermediate_finite S + let : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field (M.intermediateField S) hMK) := + M.intermediateField_finite S + let : + (extensionSubgroup (M.intermediateField S) M.field hLM).Normal := + M.extensionSubgroup_over_intermediate_normal S + let T : FiniteAbstractFieldExtension Γ := + FiniteAbstractFieldExtension.ofInclusion + (M.intermediateField S) K hMK + let : Finite + (T.base.field.toSubgroup ⧸ + extensionSubgroup T.base.field M.field (hLM.trans T.below)) := by + change Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field M.field M.below) + exact M.finite + let : (extensionSubgroup T.field.field M.field hLM).Normal := by + change (extensionSubgroup (M.intermediateField S) M.field hLM).Normal + exact M.extensionSubgroup_over_intermediate_normal S + let E : FiniteGaloisSubextension T.base.field := + ⟨M.field, hLM.trans T.below, inferInstance, inferInstance⟩ + let : Finite + (T.field.field.toSubgroup ⧸ + extensionSubgroup T.field.field M.field hLM) := by + change Finite + ((M.intermediateField S).toSubgroup ⧸ + extensionSubgroup (M.intermediateField S) M.field hLM) + exact M.extension_over_intermediate_finite S + let E' : FiniteGaloisSubextension T.field.field := + ⟨M.field, hLM, inferInstance, inferInstance⟩ + have hnatural := + D.normResidueNaturality_transfer_inclusion + A v hcf T M.field hLM + have htransfer : + transferNormNaturalityTransfer + K.field (M.intermediateField S) M.field hLM hMK = + 1 := + commutatorIntermediateTransfer_eq_one M + apply AddMonoidHom.ext + intro a + apply (D.normResidueSymbol A v hcf T.field E').injective + have hnatural_a : + D.normResidueSymbol A v hcf T.field E' + (M.intermediateNormQuotientInclusion A S a) = + MonoidHom.toAdditive + (transferNormNaturalityTransfer + K.field (M.intermediateField S) M.field hLM hMK) + (D.normResidueSymbol A v hcf T.base E a) := by + have hnatural_a_raw := (DFunLike.congr_fun hnatural a).symm + change + D.normResidueSymbol A v hcf T.field E' + (M.intermediateNormQuotientInclusion A S a) = + MonoidHom.toAdditive + (transferNormNaturalityTransfer + K.field (M.intermediateField S) M.field hLM hMK) + (D.normResidueSymbol A v hcf T.base E a) + at hnatural_a_raw + exact hnatural_a_raw + rw [hnatural_a, htransfer] + change 0 = D.normResidueSymbol A v hcf T.field E' 0 + rw [map_zero] + +end AbstractCapitulation + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/All.lean new file mode 100644 index 0000000000..54c05bd194 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/All.lean @@ -0,0 +1,39 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.AbstractCapitulation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealDecompositionLaw +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealDecompositionLaw +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealNormArtinExactness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationStatement +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTheorem +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTransfer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalAbstractExtensionToOrdinary +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFixedFieldBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertPrincipalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerConjugation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerUnramified +/-! +# Ideal class field theory + +This public root exports ideal Artin maps and quotients, Frobenius classes, +splitting in the small Hilbert class field, the genuine idèle-extension +transfer square, and principalization of every integral and fractional ideal +in the selected small Hilbert class field. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealArtin.lean new file mode 100644 index 0000000000..34cfcd969b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealArtin.lean @@ -0,0 +1,272 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +/-! +# The ideal Artin map in arithmetic Frobenius normalization + +For a defining modulus of a genuine finite abelian class field, this +module composes the ideal ray-class quotient with the topological +arithmetic global norm-residue equivalence. The resulting map sends an +ordinary prime ideal to arithmetic Frobenius, has the genuine idèle +norm kernel, and induces the canonical ideal class-field isomorphism. +-/ + +@[expose] public section + +open scoped NumberField +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open NumberField IsDedekindDomain + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + +attribute [local instance] + ideleClassSubgroupNormal idealArtinKernelNormal + +open scoped Classical in +/-- The genuine Galois-valued ideal Artin map in arithmetic Frobenius +normalization. -/ +noncomputable def arithmeticIdealArtinGaloisMap + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + RayClass.primeToModulusIdeals m →* + (L ≃ₐ[K] L) := + (Reciprocity.arithmeticGlobalNormResidueContinuousMulEquiv + K L).toMulEquiv.toMonoidHom.comp + (idealArtinMap m + ((_root_.ideleClassNorm K L).range) hm) + +open scoped Classical in +/-- Evaluating the arithmetic ideal Artin map is evaluation of the ideal +class map followed by arithmetic global reciprocity. -/ +@[simp] +theorem arithmeticIdealArtinGaloisMap_apply + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (a : RayClass.primeToModulusIdeals m) : + arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm a = + Reciprocity.arithmeticGlobalNormResidueContinuousMulEquiv + K L + (idealArtinMap m + ((_root_.ideleClassNorm K L).range) hm a) := + rfl + +open scoped Classical in +/-- The arithmetic ideal Artin map is exactly the inverse of the +geometrically normalized map on every ideal. -/ +theorem arithmeticIdealArtinGaloisMap_eq_inv_idealArtinGaloisMap + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (a : RayClass.primeToModulusIdeals m) : + arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm a = + (idealArtinGaloisMap + (K := K) (L := L) m hm a)⁻¹ := by + rw [arithmeticIdealArtinGaloisMap_apply, + Reciprocity.arithmeticGlobalNormResidueContinuousMulEquiv_apply, + Reciprocity.globalNormResidueContinuousMulEquiv_apply, + idealArtinGaloisMap_apply] + +open scoped Classical in +/-- The arithmetic ideal Artin map is surjective. -/ +theorem arithmeticIdealArtinGaloisMap_surjective + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + Function.Surjective + (arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm) := + (Reciprocity.arithmeticGlobalNormResidueContinuousMulEquiv + K L).surjective.comp + (idealArtinMap_surjective m + ((_root_.ideleClassNorm K L).range) hm) + +open scoped Classical in +/-- Arithmetic normalization leaves the defining ideal group +unchanged. -/ +@[simp] +theorem arithmeticIdealArtinGaloisMap_ker + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + (arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm).ker = + idealArtinKernel m + ((_root_.ideleClassNorm K L).range) hm := by + ext a + let e := + Reciprocity.arithmeticGlobalNormResidueContinuousMulEquiv K L + let x := + idealArtinMap m + ((_root_.ideleClassNorm K L).range) hm a + change + e x = 1 ↔ x = 1 + have hOne : e (1 : IdeleClassGroup K) = 1 := + e.map_one + constructor + · intro h + exact e.injective (h.trans hOne.symm) + · intro h + exact (congrArg e h).trans hOne + +open scoped Classical in +/-- The canonical ideal class-field isomorphism in arithmetic +Frobenius normalization. -/ +noncomputable def arithmeticIdealClassQuotientEquivGaloisGroup + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + RayClass.primeToModulusIdeals m ⧸ + idealArtinKernel m + ((_root_.ideleClassNorm K L).range) hm ≃* + (L ≃ₐ[K] L) := + (idealClassQuotientEquivNormQuotient m + ((_root_.ideleClassNorm K L).range) hm).trans + (Reciprocity.arithmeticGlobalNormResidueContinuousMulEquiv + K L).toMulEquiv + +open scoped Classical in +/-- The arithmetic ideal class-field equivalence sends a quotient +representative to its arithmetic ideal Artin symbol. -/ +theorem arithmeticIdealClassQuotientEquivGaloisGroup_mk + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (a : RayClass.primeToModulusIdeals m) : + arithmeticIdealClassQuotientEquivGaloisGroup + (K := K) (L := L) m hm + (QuotientGroup.mk' + (idealArtinKernel m + ((_root_.ideleClassNorm K L).range) hm) a) = + arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm a := + rfl + +open scoped Classical in +/-- The arithmetic ideal Artin map and the arithmetic idèlic Artin +map form the genuine ideal/idèle compatibility square. -/ +theorem + arithmeticIdealArtinGaloisMap_primeToIdealMap_eq_globalArtin + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (a : RayClass.idelePrimeToModulusSubgroup m) : + arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm + (RayClass.primeToIdealMap m a) = + Reciprocity.arithmeticGlobalArtinMonoidHom + K L (a : IdeleGroup K) := by + rw [arithmeticIdealArtinGaloisMap_apply] + rw [GlobalClassFields.idealArtinMap_primeToIdealMap] + change + Reciprocity.arithmeticGlobalNormResidueMonoidHom K L + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (a : IdeleGroup K)) = + Reciprocity.arithmeticGlobalArtinMonoidHom + K L (a : IdeleGroup K) + exact + DFunLike.congr_fun + (Reciprocity.arithmeticGlobalNormResidueMonoidHom_comp_ideleClassQuotient_eq_globalArtin + (K := K) (L := L)) + (a : IdeleGroup K) + +open scoped Classical in +/-- A prime ideal outside the defining modulus maps to its genuine +arithmetic prime Artin element. -/ +theorem + arithmeticIdealArtinGaloisMap_primeIdeal_eq_arithmeticFinitePlacePrimeArtin + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : + arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm + (RayClass.primeToModulusIdeal m v hv) = + GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v := by + rw [← GlobalClassFields.primeToIdealMap_finitePrimeIdele m v hv] + exact + arithmeticIdealArtinGaloisMap_primeToIdealMap_eq_globalArtin + (K := K) (L := L) m hm + ⟨IdeleGroup.finitePrimeIdele v, + GlobalClassFields.finitePrimeIdele_mem_idelePrimeToModulusSubgroup + m v hv⟩ + +open scoped Classical in +/-- Direct local form: a prime ideal outside the modulus maps to the +arithmetic chosen local Artin value of normalized order one. -/ +theorem + arithmeticIdealArtinGaloisMap_primeIdeal_eq_arithmeticChosenFinitePlaceArtin + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : + arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm + (RayClass.primeToModulusIdeal m v hv) = + Reciprocity.arithmeticChosenFinitePlaceArtinMonoidHom + K L v (FiniteIdeleGroup.chosenLocalOrderSection v 1) := by + rw [ + arithmeticIdealArtinGaloisMap_primeIdeal_eq_arithmeticFinitePlacePrimeArtin, + GlobalClassFields.arithmeticFinitePlacePrimeArtin_eq_arithmeticChosenFinitePlaceArtin] + +open scoped Classical in +/-- The arithmetic ideal class-field equivalence sends the class of a +prime ideal to its arithmetic Frobenius automorphism. -/ +theorem + arithmeticIdealClassQuotientEquivGaloisGroup_primeIdeal + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : + arithmeticIdealClassQuotientEquivGaloisGroup + (K := K) (L := L) m hm + (QuotientGroup.mk' + (idealArtinKernel m + ((_root_.ideleClassNorm K L).range) hm) + (RayClass.primeToModulusIdeal m v hv)) = + GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v := by + rw [ + arithmeticIdealClassQuotientEquivGaloisGroup_mk, + arithmeticIdealArtinGaloisMap_primeIdeal_eq_arithmeticFinitePlacePrimeArtin] + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealDecompositionLaw.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealDecompositionLaw.lean new file mode 100644 index 0000000000..7a430c7f52 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealDecompositionLaw.lean @@ -0,0 +1,141 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealDecompositionLaw +/-! +# Arithmetic ideal Artin symbols and unramified decomposition + +This module states the order calculation in the unramified +decomposition law with arithmetic Frobenius normalization. +The underlying ideal-class quotient is unchanged by inversion of the +reciprocity map, while the image of an ordinary prime ideal is the +genuine arithmetic Frobenius automorphism. +-/ + +@[expose] public section + +open scoped NumberField +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open NumberField IsDedekindDomain + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + +open scoped Classical in +open GlobalClassFields renaming + orderOf_arithmeticFinitePlacePrimeArtin_eq_finitePlaceLocalDegree_of_chosenUnramified → + orderOf_primeArtin_eq_localDegree_of_unramified in +/-- At an unramified prime outside a defining modulus, the arithmetic +ideal Artin symbol has order equal to the common inertia degree of the +primes above it. -/ +theorem + orderOf_arithmeticIdealArtin_prime_eq_inertiaDegree_of_chosenUnramified + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + orderOf + (arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm + (RayClass.primeToModulusIdeal m v hv)) = + Ideal.inertiaDegIn v.asIdeal (𝓞 L) := by + rw [ + arithmeticIdealArtinGaloisMap_primeIdeal_eq_arithmeticFinitePlacePrimeArtin, + orderOf_primeArtin_eq_localDegree_of_unramified + (K := K) (L := L) v hunram] + exact + finitePlaceLocalDegree_eq_inertiaDegree_of_chosenUnramified + (K := K) (L := L) v hunram + +open scoped Classical in +/-- The arithmetic Artin symbol of a power of an unramified prime is +trivial exactly when the common inertia degree divides the exponent. -/ +theorem + arithmeticIdealArtin_prime_pow_eq_one_iff_inertiaDegree_dvd + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) + (n : ℕ) : + arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm + ((RayClass.primeToModulusIdeal m v hv) ^ n) = + 1 ↔ + Ideal.inertiaDegIn v.asIdeal (𝓞 L) ∣ n := by + rw [ + map_pow, + ← orderOf_dvd_iff_pow_eq_one, + orderOf_arithmeticIdealArtin_prime_eq_inertiaDegree_of_chosenUnramified + (K := K) (L := L) m hm v hv hunram] + +open scoped Classical in +/-- Full unramified decomposition law expressed through the genuine +arithmetic ideal Artin symbol. The prime factors are distinct, every +factor has degree equal to the order of arithmetic Frobenius, and the +number of factors is the global degree divided by that order. -/ +theorem unramifiedPrime_arithmeticIdealDecompositionLaw + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + let f := + orderOf + (arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm + (RayClass.primeToModulusIdeal m v hv)) + Ideal.map (algebraMap (𝓞 K) (𝓞 L)) v.asIdeal = + ∏ P ∈ v.asIdeal.primesOver (𝓞 L), P ∧ + (∀ P : Ideal (𝓞 L), + P ∈ v.asIdeal.primesOver (𝓞 L) → + P.inertiaDeg (𝓞 K) = f) ∧ + (v.asIdeal.primesOver (𝓞 L)).ncard = + Module.finrank K L / f := by + dsimp only + refine + ⟨unramifiedPrime_idealMap_eq_product_primesOver + (K := K) (L := L) v hunram, ?_, ?_⟩ + · intro P hP + rw [ + orderOf_arithmeticIdealArtin_prime_eq_inertiaDegree_of_chosenUnramified + (K := K) (L := L) m hm v hv hunram] + exact + primeAbove_inertiaDegree_eq_common + (K := K) (L := L) v P hP + · rw [ + orderOf_arithmeticIdealArtin_prime_eq_inertiaDegree_of_chosenUnramified + (K := K) (L := L) m hm v hv hunram] + exact + unramifiedPrime_numberOfPrimes_eq_extensionDegree_div_inertiaDegree + (K := K) (L := L) v hunram + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinMap.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinMap.lean new file mode 100644 index 0000000000..6a64ea312d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinMap.lean @@ -0,0 +1,828 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.IdealNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfinitePlaceArtin +/-! +# The ideal-theoretic Artin map + +Let `N ≤ C_K` be a class-field norm subgroup and let `m` be a defining +modulus, so `C_K^m ≤ N`. The idelic quotient map then factors through the +ideal ray class group. Composing with the projection from ideals prime to +`m` gives the ideal-theoretic Artin map. This file proves its surjectivity, +identifies its kernel, and records the exact sequence. + +The target is kept as the concrete reciprocity quotient `C_K / N`; global +reciprocity identifies this quotient with the corresponding abelian Galois +group. +-/ + +@[expose] public section + +open scoped NumberField BigOperators NumberField.LiesOver + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open NumberField + +variable {K : Type} [Field K] [NumberField K] + +local instance + idealArtinMap_ideleClassGroupIsMulCommutative : + IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +local instance ideleClassSubgroupNormal + (N : Subgroup (IdeleClassGroup K)) : N.Normal := + N.normal_of_isMulCommutative + +/-- The quotient map from the ray class group modulo a defining modulus +to the class-field reciprocity quotient. -/ +def rayClassToNormQuotient + (m : RayClass.Modulus K) + (N : Subgroup (IdeleClassGroup K)) + (hm : RayClass.Modulus.congruenceSubgroup m ≤ N) : + RayClass.RayClassGroup m →* + IdeleClassGroup K ⧸ N := + QuotientGroup.map + (RayClass.Modulus.congruenceSubgroup m) N + (MonoidHom.id (IdeleClassGroup K)) hm + +/-- The ray-class quotient map sends the class of an idele class to its +class modulo the norm subgroup. -/ +theorem rayClassToNormQuotient_mk + (m : RayClass.Modulus K) + (N : Subgroup (IdeleClassGroup K)) + (hm : RayClass.Modulus.congruenceSubgroup m ≤ N) + (c : IdeleClassGroup K) : + rayClassToNormQuotient m N hm + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup m) c) = + QuotientGroup.mk' N c := + rfl + +/-- The quotient map attached to a defining modulus is surjective. -/ +theorem rayClassToNormQuotient_surjective + (m : RayClass.Modulus K) + (N : Subgroup (IdeleClassGroup K)) + (hm : RayClass.Modulus.congruenceSubgroup m ≤ N) : + Function.Surjective + (rayClassToNormQuotient m N hm) := by + intro q + refine QuotientGroup.induction_on q ?_ + intro c + exact + ⟨QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup m) c, rfl⟩ + +/-- The Artin map on the ideal ray class group, obtained from the +idele-theoretic reciprocity quotient. -/ +def idealRayClassArtinMap + (m : RayClass.Modulus K) + (N : Subgroup (IdeleClassGroup K)) + (hm : RayClass.Modulus.congruenceSubgroup m ≤ N) : + RayClass.IdealRayClassGroup m →* + IdeleClassGroup K ⧸ N := + (rayClassToNormQuotient m N hm).comp + (RayClass.rayClassGroupEquivIdealRayClassGroup m).symm.toMonoidHom + +/-- The ideal-ray-class Artin map is surjective. -/ +theorem idealRayClassArtinMap_surjective + (m : RayClass.Modulus K) + (N : Subgroup (IdeleClassGroup K)) + (hm : RayClass.Modulus.congruenceSubgroup m ≤ N) : + Function.Surjective + (idealRayClassArtinMap m N hm) := by + exact + (rayClassToNormQuotient_surjective m N hm).comp + (RayClass.rayClassGroupEquivIdealRayClassGroup m).symm.surjective + +/-- The Artin map on fractional ideals prime to `m`. -/ +def idealArtinMap + (m : RayClass.Modulus K) + (N : Subgroup (IdeleClassGroup K)) + (hm : RayClass.Modulus.congruenceSubgroup m ≤ N) : + RayClass.primeToModulusIdeals m →* + IdeleClassGroup K ⧸ N := + (idealRayClassArtinMap m N hm).comp + (QuotientGroup.mk' + (RayClass.principalRayIdealSubgroup m)) + +private theorem + quotientRaySubgroupEquivIdealRayClassGroup_mk + (m : RayClass.Modulus K) + (a : RayClass.idelePrimeToModulusSubgroup m) : + RayClass.quotientRaySubgroupEquivIdealRayClassGroup m + (QuotientGroup.mk' + (RayClass.raySubgroupInPrimeTo m) a) = + RayClass.idealRayProjection m a := by + exact RayClass.quotientRaySubgroupEquivIdealRayClassGroup_mk m a + +private theorem + quotientRaySubgroupEquivIdeleRayQuotient_mk + (m : RayClass.Modulus K) + (a : RayClass.idelePrimeToModulusSubgroup m) : + RayClass.quotientRaySubgroupEquivIdeleRayQuotient m + (QuotientGroup.mk' + (RayClass.raySubgroupInPrimeTo m) a) = + RayClass.primeToRayClassProjection m a := by + exact RayClass.quotientRaySubgroupEquivIdeleRayQuotient_mk m a + +private theorem rayClassGroupEquivIdeleQuotient_mk_mk + (m : RayClass.Modulus K) + (a : IdeleGroup K) : + RayClass.rayClassGroupEquivIdeleQuotient m + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup m) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a)) = + QuotientGroup.mk' + (RayClass.Modulus.ideleCongruenceSubgroup m ⊔ + IdeleGroup.principalSubgroup K) a := by + exact + QuotientGroup.quotientQuotientEquivQuotientAux_mk_mk + (IdeleGroup.principalSubgroup K) + (RayClass.Modulus.ideleCongruenceSubgroup m ⊔ + IdeleGroup.principalSubgroup K) + le_sup_right a + +private theorem + rayClassGroupEquivIdealRayClassGroup_mk_primeTo + (m : RayClass.Modulus K) + (a : RayClass.idelePrimeToModulusSubgroup m) : + RayClass.rayClassGroupEquivIdealRayClassGroup m + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup m) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (a : IdeleGroup K))) = + RayClass.idealRayProjection m a := by + change + RayClass.quotientRaySubgroupEquivIdealRayClassGroup m + ((RayClass.quotientRaySubgroupEquivIdeleRayQuotient m).symm + (RayClass.rayClassGroupEquivIdeleQuotient m + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup m) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (a : IdeleGroup K))))) = + RayClass.idealRayProjection m a + rw [rayClassGroupEquivIdeleQuotient_mk_mk] + change + RayClass.quotientRaySubgroupEquivIdealRayClassGroup m + ((RayClass.quotientRaySubgroupEquivIdeleRayQuotient m).symm + (RayClass.primeToRayClassProjection m a)) = + RayClass.idealRayProjection m a + rw [← quotientRaySubgroupEquivIdeleRayQuotient_mk m a, + MulEquiv.symm_apply_apply, + quotientRaySubgroupEquivIdealRayClassGroup_mk] + +/-- The ideal Artin map of the fractional ideal attached to a +prime-to-modulus idèle is its class in the idèle-class quotient. -/ +@[simp] +theorem idealArtinMap_primeToIdealMap + (m : RayClass.Modulus K) + (N : Subgroup (IdeleClassGroup K)) + (hm : RayClass.Modulus.congruenceSubgroup m ≤ N) + (a : RayClass.idelePrimeToModulusSubgroup m) : + idealArtinMap m N hm + (RayClass.primeToIdealMap m a) = + QuotientGroup.mk' N + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (a : IdeleGroup K)) := by + let e := + RayClass.rayClassGroupEquivIdealRayClassGroup m + let c : RayClass.RayClassGroup m := + QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup m) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (a : IdeleGroup K)) + have he : + e c = RayClass.idealRayProjection m a := by + exact + rayClassGroupEquivIdealRayClassGroup_mk_primeTo m a + have he' : + e.symm (RayClass.idealRayProjection m a) = c := by + rw [← he, e.symm_apply_apply] + change + rayClassToNormQuotient m N hm + (e.symm (RayClass.idealRayProjection m a)) = + QuotientGroup.mk' N + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (a : IdeleGroup K)) + rw [he', rayClassToNormQuotient_mk] + +/-- The ideal group `H_m` attached to `N`: precisely the ideals whose +Artin class is trivial. -/ +def idealArtinKernel + (m : RayClass.Modulus K) + (N : Subgroup (IdeleClassGroup K)) + (hm : RayClass.Modulus.congruenceSubgroup m ≤ N) : + Subgroup (RayClass.primeToModulusIdeals m) := + (idealArtinMap m N hm).ker + +/-- Principal ray ideals lie in the Artin kernel. -/ +theorem principalRayIdealSubgroup_le_idealArtinKernel + (m : RayClass.Modulus K) + (N : Subgroup (IdeleClassGroup K)) + (hm : RayClass.Modulus.congruenceSubgroup m ≤ N) : + RayClass.principalRayIdealSubgroup m ≤ + idealArtinKernel m N hm := by + intro a ha + change + idealRayClassArtinMap m N hm + (QuotientGroup.mk' + (RayClass.principalRayIdealSubgroup m) a) = + 1 + have hqa : + QuotientGroup.mk' (RayClass.principalRayIdealSubgroup m) a = 1 := + (QuotientGroup.eq_one_iff a).2 ha + rw [hqa, map_one] + +section NormDefinedFiniteKernel + +variable + {L : Type} [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +omit [FiniteDimensional K L] in +/-- For choosing idèle representatives of ideal norms, retain the finite +part of the ideal-norm lifted modulus and impose positivity at every real +place upstairs. Its prime-to ideal group is definitionally the same as the +one for `idealNormLiftedModulus`, while positivity makes its idèle norm +prime to the selected infinite part downstairs. -/ +noncomputable def normIdeleLiftedModulus + (m : RayClass.Modulus K) : RayClass.Modulus L := + RayClass.Modulus.narrowOfFinite + (RayClass.idealNormLiftedModulus + (K := K) (L := L) m).finitePart + +private theorem ideleNorm_mem_finitePrimeToModulusSubgroup_aux + (m : RayClass.Modulus K) + (a : RayClass.idelePrimeToModulusSubgroup + (normIdeleLiftedModulus (K := K) (L := L) m)) : + (IdeleGroup.norm K L (a : IdeleGroup L)).2 ∈ + RayClass.finitePrimeToModulusSubgroup m := by + let aFinite : + RayClass.idelePrimeToModulusSubgroup + (RayClass.idealNormLiftedModulus (K := K) (L := L) m) := + ⟨(a : IdeleGroup L), by + constructor + · apply + (RayClass.Modulus.mem_infiniteCongruenceSubgroup_iff + (RayClass.idealNormLiftedModulus + (K := K) (L := L) m) _).2 + intro v hv + have hNoInfinite : + (RayClass.idealNormLiftedModulus + (K := K) (L := L) m).infinitePart = ∅ := + rfl + rw [hNoInfinite] at hv + exact (Finset.notMem_empty _ hv).elim + · exact a.property.2⟩ + exact + RayClass.finite_norm_mem_finitePrimeToModulusSubgroup + (K := K) (L := L) m aFinite + +/-- The idèle norm carries idèles prime to the lifted modulus to +idèles prime to the base modulus. At real places this uses positivity +of both real-real and complex-real local norms. -/ +theorem ideleNorm_mem_idelePrimeToModulusSubgroup + (m : RayClass.Modulus K) + (a : RayClass.idelePrimeToModulusSubgroup + (normIdeleLiftedModulus + (K := K) (L := L) m)) : + IdeleGroup.norm K L (a : IdeleGroup L) ∈ + RayClass.idelePrimeToModulusSubgroup m := by + classical + constructor + · apply + (RayClass.Modulus.mem_infiniteCongruenceSubgroup_iff m + (IdeleGroup.norm K L (a : IdeleGroup L)).1).2 + intro v _hv + let : ∀ W : {W : InfinitePlace L // + _root_.infinitePlaceBelow (K := K) W = v.1}, + W.1.1.LiesOver v.1.1 := + fun W => + ⟨congrArg (fun q : InfinitePlace K => q.1) W.2⟩ + have hNormComponent : + IdeleGroup.infiniteComponent v.1 + (IdeleGroup.norm K L (a : IdeleGroup L)) ∈ + RayClass.infinitePositiveSubgroup v.1 := by + rw [IdeleGroup.infiniteComponent_norm_eq_prod] + apply Subgroup.prod_mem + intro W _hW + apply + (RayClass.mem_infinitePositiveSubgroup_iff v.1 + (LocalFieldTheory.normUnits + v.1.Completion W.1.Completion + (IdeleGroup.infiniteComponent W.1 + (a : IdeleGroup L)))).2 + intro hvReal + have hbelow : + W.1.comap (algebraMap K L) = v.1 := by + simpa only [_root_.infinitePlaceBelow] using W.2 + rcases W.1.isReal_or_isComplex with hWReal | hWComplex + · have hUpstairs : + 0 < + InfinitePlace.Completion.ringEquivRealOfIsReal + hWReal + (IdeleGroup.infiniteComponent W.1 + (a : IdeleGroup L) : + W.1.Completion) := by + have hPositive := + (RayClass.Modulus.mem_infiniteCongruenceSubgroup_iff + (normIdeleLiftedModulus + (K := K) (L := L) m) + (a : IdeleGroup L).1).1 a.property.1 + ⟨W.1, hWReal⟩ (by exact Finset.mem_univ _) + exact + (RayClass.mem_infinitePositiveSubgroup_iff W.1 + (IdeleGroup.infiniteComponent W.1 + (a : IdeleGroup L))).1 hPositive hWReal + have hNorm := + Reciprocity.infinitePlace_normUnits_real_real + (K := K) (K' := L) v.1 W.1 hbelow + hvReal hWReal + (IdeleGroup.infiniteComponent W.1 + (a : IdeleGroup L)) + have hNormVal := congrArg Units.val hNorm + change + 0 < + ((Units.mapEquiv + (InfinitePlace.Completion.ringEquivRealOfIsReal + hvReal).toMulEquiv) + (LocalFieldTheory.normUnits + v.1.Completion W.1.Completion + (IdeleGroup.infiniteComponent W.1 + (a : IdeleGroup L))) : ℝ) + rw [hNormVal] + change + 0 < + InfinitePlace.Completion.ringEquivRealOfIsReal + hWReal + (IdeleGroup.infiniteComponent W.1 + (a : IdeleGroup L) : W.1.Completion) + exact hUpstairs + · simpa only [ + InfinitePlace.Completion.ringEquivRealOfIsReal_apply] using + Reciprocity.infinitePlace_normUnits_real_complex_pos + (K := K) (K' := L) v.1 W.1 hbelow + hvReal hWComplex + (IdeleGroup.infiniteComponent W.1 + (a : IdeleGroup L)) + simpa only [IdeleGroup.infiniteComponent_apply] using hNormComponent + · exact ideleNorm_mem_finitePrimeToModulusSubgroup_aux m a + +/-- The ordinary idèle norm restricted to the prime-to-modulus +subgroups selected by the lifted modulus. -/ +noncomputable def primeToModulusIdeleNorm + (m : RayClass.Modulus K) : + RayClass.idelePrimeToModulusSubgroup + (normIdeleLiftedModulus + (K := K) (L := L) m) →* + RayClass.idelePrimeToModulusSubgroup m where + toFun a := + ⟨IdeleGroup.norm K L (a : IdeleGroup L), + ideleNorm_mem_idelePrimeToModulusSubgroup + (K := K) (L := L) m a⟩ + map_one' := by + apply Subtype.ext + exact map_one (IdeleGroup.norm K L) + map_mul' a b := by + apply Subtype.ext + exact + (IdeleGroup.norm K L).map_mul + (a : IdeleGroup L) (b : IdeleGroup L) + +/-- The restricted idèle norm and the genuine ideal norm commute with +the prime-to-modulus fractional-ideal maps. -/ +@[simp] +theorem primeToIdealMap_primeToModulusIdeleNorm + (m : RayClass.Modulus K) + (a : RayClass.idelePrimeToModulusSubgroup + (normIdeleLiftedModulus + (K := K) (L := L) m)) : + RayClass.primeToIdealMap m + (primeToModulusIdeleNorm + (K := K) (L := L) m a) = + RayClass.primeToModulusIdealNorm + (K := K) (L := L) m + (RayClass.primeToIdealMap + (normIdeleLiftedModulus + (K := K) (L := L) m) a) := by + apply Subtype.ext + exact + IdeleGroup.fractionalIdeal_ideleNorm + (K := K) (L := L) (a : IdeleGroup L) + +omit [FiniteDimensional K L] in +private theorem + exists_primeToModulusIdele_norm_class_eq_of_mem_idealArtinKernel + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + {I : RayClass.primeToModulusIdeals m} + (hI : I ∈ idealArtinKernel m + (_root_.ideleClassNorm K L).range hm) : + ∃ a : RayClass.idelePrimeToModulusSubgroup m, + RayClass.primeToIdealMap m a = I ∧ + ∃ b : RayClass.idelePrimeToModulusSubgroup + (normIdeleLiftedModulus + (K := K) (L := L) m), + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (IdeleGroup.norm K L (b : IdeleGroup L)) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (a : IdeleGroup K) := by + change + idealArtinMap m + (_root_.ideleClassNorm K L).range hm I = 1 at hI + obtain ⟨a, ha⟩ := + RayClass.primeToIdealMap_surjective m I + have haKernel : + QuotientGroup.mk' + (_root_.ideleClassNorm K L).range + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (a : IdeleGroup K)) = 1 := by + rw [← idealArtinMap_primeToIdealMap m + (_root_.ideleClassNorm K L).range hm a, ha] + exact hI + have haNormRange : + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (a : IdeleGroup K) ∈ + (_root_.ideleClassNorm K L).range := + (QuotientGroup.eq_one_iff _).1 haKernel + obtain ⟨c, hc⟩ := haNormRange + obtain ⟨b, rfl⟩ := + QuotientGroup.mk'_surjective + (IdeleGroup.principalSubgroup L) c + obtain ⟨x, hbx⟩ := + RayClass.exists_principal_quotient_mem_primeTo + (normIdeleLiftedModulus + (K := K) (L := L) m) b + let b' : + RayClass.idelePrimeToModulusSubgroup + (normIdeleLiftedModulus + (K := K) (L := L) m) := + ⟨b * (IdeleGroup.principalIdele L x)⁻¹, hbx⟩ + have hb'class : + QuotientGroup.mk' + (IdeleGroup.principalSubgroup L) + (b' : IdeleGroup L) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup L) b := by + change + QuotientGroup.mk' + (IdeleGroup.principalSubgroup L) + (b * (IdeleGroup.principalIdele L x)⁻¹) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup L) b + apply + (QuotientGroup.eq_iff_div_mem + (N := IdeleGroup.principalSubgroup L) + (x := b * (IdeleGroup.principalIdele L x)⁻¹) + (y := b)).2 + have hp : + IdeleGroup.principalIdele L x ∈ + IdeleGroup.principalSubgroup L := + ⟨x, rfl⟩ + have hdiv : + (b * (IdeleGroup.principalIdele L x)⁻¹) / b = + (IdeleGroup.principalIdele L x)⁻¹ := by + rw [div_eq_mul_inv] + calc + b * (IdeleGroup.principalIdele L x)⁻¹ * b⁻¹ = + (IdeleGroup.principalIdele L x)⁻¹ * (b * b⁻¹) := by + ac_rfl + _ = (IdeleGroup.principalIdele L x)⁻¹ := by + simp only [mul_inv_cancel, mul_one] + rw [hdiv] + exact (IdeleGroup.principalSubgroup L).inv_mem hp + refine ⟨a, ha, b', ?_⟩ + rw [← _root_.ideleClassNorm_mk, hb'class] + exact hc + +private theorem + primeToIdealMap_mem_idealNormSubgroup_of_norm_class_eq + (m : RayClass.Modulus K) + (a : RayClass.idelePrimeToModulusSubgroup m) + (b : RayClass.idelePrimeToModulusSubgroup + (normIdeleLiftedModulus + (K := K) (L := L) m)) + (hNormClass : + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (IdeleGroup.norm K L (b : IdeleGroup L)) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (a : IdeleGroup K)) : + RayClass.primeToIdealMap m a ∈ + RayClass.idealNormSubgroup + (K := K) (L := L) m := by + let nb : RayClass.idelePrimeToModulusSubgroup m := + primeToModulusIdeleNorm + (K := K) (L := L) m b + let d : RayClass.idelePrimeToModulusSubgroup m := + a * nb⁻¹ + have hdPrincipal : + (d : IdeleGroup K) ∈ + IdeleGroup.principalSubgroup K := by + rw [← QuotientGroup.eq_one_iff] + change + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + ((a : IdeleGroup K) * + (IdeleGroup.norm K L + (b : IdeleGroup L))⁻¹) = 1 + rw [map_mul, map_inv, hNormClass] + exact mul_inv_cancel _ + have hdRay : + RayClass.primeToIdealMap m d ∈ + RayClass.principalRayIdealSubgroup m := + ⟨d, hdPrincipal, rfl⟩ + let J := + RayClass.primeToIdealMap + (normIdeleLiftedModulus + (K := K) (L := L) m) b + let n := + RayClass.primeToModulusIdealNorm + (K := K) (L := L) m J + have hnRange : + n ∈ + (RayClass.primeToModulusIdealNorm + (K := K) (L := L) m).range := + ⟨J, rfl⟩ + have hnbIdeal : + RayClass.primeToIdealMap m nb = n := + primeToIdealMap_primeToModulusIdeleNorm + (K := K) (L := L) m b + have hdIdeal : + RayClass.primeToIdealMap m d = + RayClass.primeToIdealMap m a * n⁻¹ := by + change + RayClass.primeToIdealMap m (a * nb⁻¹) = + RayClass.primeToIdealMap m a * n⁻¹ + rw [map_mul, map_inv, hnbIdeal] + rw [RayClass.idealNormSubgroup, Subgroup.mem_sup] + refine + ⟨n, hnRange, RayClass.primeToIdealMap m d, + hdRay, ?_⟩ + calc + n * RayClass.primeToIdealMap m d = + n * (RayClass.primeToIdealMap m a * n⁻¹) := by + rw [hdIdeal] + _ = RayClass.primeToIdealMap m a * (n * n⁻¹) := by + ac_rfl + _ = RayClass.primeToIdealMap m a := by + rw [mul_inv_cancel, mul_one] + +private theorem idealArtinKernel_le_idealNormSubgroup + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + idealArtinKernel m + (_root_.ideleClassNorm K L).range hm ≤ + RayClass.idealNormSubgroup + (K := K) (L := L) m := by + intro I hI + obtain ⟨a, ha, b, hab⟩ := + exists_primeToModulusIdele_norm_class_eq_of_mem_idealArtinKernel + (K := K) (L := L) m hm hI + rw [← ha] + exact + primeToIdealMap_mem_idealNormSubgroup_of_norm_class_eq + (K := K) (L := L) m a b hab + +private theorem idealNormSubgroup_le_idealArtinKernel + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + RayClass.idealNormSubgroup + (K := K) (L := L) m ≤ + idealArtinKernel m + (_root_.ideleClassNorm K L).range hm := by + rw [RayClass.idealNormSubgroup] + apply sup_le + · rintro n ⟨J, rfl⟩ + obtain ⟨b, hb⟩ := + RayClass.primeToIdealMap_surjective + (normIdeleLiftedModulus + (K := K) (L := L) m) J + change + idealArtinMap m + (_root_.ideleClassNorm K L).range hm + (RayClass.primeToModulusIdealNorm + (K := K) (L := L) m J) = 1 + rw [← hb, + ← primeToIdealMap_primeToModulusIdeleNorm + (K := K) (L := L) m b, + idealArtinMap_primeToIdealMap] + apply (QuotientGroup.eq_one_iff _).2 + exact + ⟨QuotientGroup.mk' + (IdeleGroup.principalSubgroup L) + (b : IdeleGroup L), + _root_.ideleClassNorm_mk + K L (b : IdeleGroup L)⟩ + · exact + principalRayIdealSubgroup_le_idealArtinKernel + m (_root_.ideleClassNorm K L).range hm + +/-- For a finite extension and a defining modulus, the kernel of the ideal +Artin map is exactly the genuine norm-defined ideal group +`N_{L/K} J_L^m P_K^m`. -/ +theorem idealArtinKernel_eq_idealNormSubgroup_of_finiteExtension + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + idealArtinKernel m + (_root_.ideleClassNorm K L).range hm = + RayClass.idealNormSubgroup + (K := K) (L := L) m := + le_antisymm + (idealArtinKernel_le_idealNormSubgroup + (K := K) (L := L) m hm) + (idealNormSubgroup_le_idealArtinKernel + (K := K) (L := L) m hm) + +end NormDefinedFiniteKernel + +section NormDefinedKernel + +variable + {L : Type} [Field L] [NumberField L] [Algebra K L] + [IsGalois K L] + +omit [IsGalois K L] in +/-- For a defining modulus, the kernel of the ideal Artin map is exactly the +genuine norm-defined ideal group `N_{L/K} J_L^m P_K^m` for a finite Galois +extension. This preserves the original Galois-facing API while delegating to +the finite-extension theorem. -/ +theorem idealArtinKernel_eq_idealNormSubgroup + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + idealArtinKernel m + (_root_.ideleClassNorm K L).range hm = + RayClass.idealNormSubgroup + (K := K) (L := L) m := + idealArtinKernel_eq_idealNormSubgroup_of_finiteExtension + (K := K) (L := L) m hm + +end NormDefinedKernel + +/-- The Artin map on ideals is surjective. -/ +theorem idealArtinMap_surjective + (m : RayClass.Modulus K) + (N : Subgroup (IdeleClassGroup K)) + (hm : RayClass.Modulus.congruenceSubgroup m ≤ N) : + Function.Surjective (idealArtinMap m N hm) := by + exact + (idealRayClassArtinMap_surjective m N hm).comp + (QuotientGroup.mk'_surjective + (RayClass.principalRayIdealSubgroup m)) + +/-- Exactness of +`1 → H_m → J_K^m → C_K/N → 1`. -/ +theorem idealArtin_exact + (m : RayClass.Modulus K) + (N : Subgroup (IdeleClassGroup K)) + (hm : RayClass.Modulus.congruenceSubgroup m ≤ N) : + (∀ a : RayClass.primeToModulusIdeals m, + idealArtinMap m N hm a = 1 ↔ + a ∈ idealArtinKernel m N hm) ∧ + Function.Surjective (idealArtinMap m N hm) := by + exact ⟨fun _ => Iff.rfl, idealArtinMap_surjective m N hm⟩ + +section ActualGaloisArtin + +variable + {L : Type} [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + +/-- The ideal-theoretic Artin map with its actual Galois-group target. + +For a defining modulus of the genuine norm subgroup +`N_{L/K} C_L`, this is the quotient-valued ideal Artin map followed by +the global norm-residue equivalence +`C_K / N_{L/K} C_L ≃ Gal(L/K)`. -/ +noncomputable def idealArtinGaloisMap + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + RayClass.primeToModulusIdeals m →* + (L ≃ₐ[K] L) := + (AddEquiv.toMultiplicative + (Reciprocity.globalNormResidueEquiv K L)).toMonoidHom.comp + (idealArtinMap m + ((_root_.ideleClassNorm K L).range) hm) + +/-- Evaluation of the actual ideal Artin map is the global +norm-residue equivalence applied to the quotient-valued ideal Artin +class. -/ +@[simp] +theorem idealArtinGaloisMap_apply + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (a : RayClass.primeToModulusIdeals m) : + idealArtinGaloisMap (K := K) (L := L) m hm a = + Additive.toMul + (Reciprocity.globalNormResidueEquiv K L + (Additive.ofMul + (idealArtinMap m + ((_root_.ideleClassNorm K L).range) hm a))) := + rfl + +/-- The actual Galois-valued ideal Artin map is surjective. -/ +theorem idealArtinGaloisMap_surjective + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + Function.Surjective + (idealArtinGaloisMap (K := K) (L := L) m hm) := by + exact + (AddEquiv.toMultiplicative + (Reciprocity.globalNormResidueEquiv K L)).surjective.comp + (idealArtinMap_surjective m + ((_root_.ideleClassNorm K L).range) hm) + +/-- Passing from the genuine norm quotient to the actual Galois group +does not change the ideal Artin kernel. -/ +@[simp] +theorem idealArtinGaloisMap_ker + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + (idealArtinGaloisMap + (K := K) (L := L) m hm).ker = + idealArtinKernel m + ((_root_.ideleClassNorm K L).range) hm := by + ext a + let e := + AddEquiv.toMultiplicative + (Reciprocity.globalNormResidueEquiv K L) + change + e + (idealArtinMap m + ((_root_.ideleClassNorm K L).range) hm a) = + 1 ↔ + idealArtinMap m + ((_root_.ideleClassNorm K L).range) hm a = + 1 + exact e.map_eq_one_iff + +/-- Exactness of the actual ideal Artin sequence +`1 → H_m → J_K^m → Gal(L/K) → 1`. -/ +theorem idealArtinGalois_exact + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + (∀ a : RayClass.primeToModulusIdeals m, + idealArtinGaloisMap (K := K) (L := L) m hm a = 1 ↔ + a ∈ idealArtinKernel m + ((_root_.ideleClassNorm K L).range) hm) ∧ + Function.Surjective + (idealArtinGaloisMap (K := K) (L := L) m hm) := by + constructor + · intro a + change + a ∈ + (idealArtinGaloisMap + (K := K) (L := L) m hm).ker ↔ + a ∈ idealArtinKernel m + ((_root_.ideleClassNorm K L).range) hm + rw [idealArtinGaloisMap_ker] + · exact idealArtinGaloisMap_surjective m hm + +end ActualGaloisArtin + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinQuotient.lean new file mode 100644 index 0000000000..5ebeb1458f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinQuotient.lean @@ -0,0 +1,153 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinMap +/-! +# The ideal Artin quotient + +For a defining modulus `m`, the ideal-theoretic Artin map is surjective and +has kernel `H_m`. The first isomorphism theorem therefore identifies +`J_K^m / H_m` with the corresponding idelic norm quotient `C_K / N`. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open NumberField + +variable {K : Type} [Field K] [NumberField K] + +-- Reuse the normality witness embedded in the imported ideal-Artin definitions. +-- Choosing a different generic witness here makes quotient equivalences compare +-- enormous, propositionally equal but non-definitional terms. +attribute [local instance] ideleClassSubgroupNormal + +local instance idealArtinKernelNormal + (m : RayClass.Modulus K) + (N : Subgroup (IdeleClassGroup K)) + (hm : RayClass.Modulus.congruenceSubgroup m ≤ N) : + (idealArtinKernel m N hm).Normal := by + change (idealArtinMap m N hm).ker.Normal + infer_instance + +/-- The ideal class-field isomorphism +`J_K^m / H_m ≃ C_K / N`. -/ +noncomputable def idealClassQuotientEquivNormQuotient + (m : RayClass.Modulus K) + (N : Subgroup (IdeleClassGroup K)) + (hm : RayClass.Modulus.congruenceSubgroup m ≤ N) : + RayClass.primeToModulusIdeals m ⧸ + idealArtinKernel m N hm ≃* + IdeleClassGroup K ⧸ N := by + have hker : + idealArtinKernel m N hm = + (idealArtinMap m N hm).ker := + rfl + exact + (QuotientGroup.quotientMulEquivOfEq hker).trans + (QuotientGroup.quotientKerEquivOfSurjective + (idealArtinMap m N hm) + (idealArtinMap_surjective m N hm)) + +/-- The ideal class-field equivalence sends a quotient representative to +its ideal Artin image. -/ +theorem idealClassQuotientEquivNormQuotient_mk + (m : RayClass.Modulus K) + (N : Subgroup (IdeleClassGroup K)) + (hm : RayClass.Modulus.congruenceSubgroup m ≤ N) + (a : RayClass.primeToModulusIdeals m) : + idealClassQuotientEquivNormQuotient m N hm + (QuotientGroup.mk' (idealArtinKernel m N hm) a) = + idealArtinMap m N hm a := + rfl + +/-- The Artin kernel is exactly the equivalence relation defining the +ideal class-field quotient. -/ +theorem idealClassQuotient_mk_eq_one_iff + (m : RayClass.Modulus K) + (N : Subgroup (IdeleClassGroup K)) + (hm : RayClass.Modulus.congruenceSubgroup m ≤ N) + (a : RayClass.primeToModulusIdeals m) : + QuotientGroup.mk' (idealArtinKernel m N hm) a = 1 ↔ + idealArtinMap m N hm a = 1 := by + exact + (QuotientGroup.eq_one_iff a).trans + (((idealArtin_exact m N hm).1 a).symm) + +section ActualGaloisQuotient + +variable + {L : Type} [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + +/-- The ideal class-field isomorphism with the actual Galois group: +`J_K^m / H_m ≃ Gal(L/K)`. + +Its first factor is the ideal/idèle norm-quotient comparison, and its +second factor is the genuine global norm-residue equivalence. -/ +noncomputable def idealClassQuotientEquivGaloisGroup + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + RayClass.primeToModulusIdeals m ⧸ + idealArtinKernel m + ((_root_.ideleClassNorm K L).range) hm ≃* + (L ≃ₐ[K] L) := + (idealClassQuotientEquivNormQuotient m + ((_root_.ideleClassNorm K L).range) hm).trans + (AddEquiv.toMultiplicative + (Reciprocity.globalNormResidueEquiv K L)) + +/-- On a representative ideal, the actual ideal class-field +isomorphism evaluates to the genuine Galois-valued ideal Artin map. -/ +theorem idealClassQuotientEquivGaloisGroup_mk + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (a : RayClass.primeToModulusIdeals m) : + idealClassQuotientEquivGaloisGroup + (K := K) (L := L) m hm + (QuotientGroup.mk' + (idealArtinKernel m + ((_root_.ideleClassNorm K L).range) hm) a) = + idealArtinGaloisMap (K := K) (L := L) m hm a := + rfl + +/-- An ideal class is trivial in the class-field quotient exactly when +its actual Galois-valued Artin symbol is trivial. -/ +theorem idealClassQuotient_mk_eq_one_iff_galoisArtin_eq_one + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (a : RayClass.primeToModulusIdeals m) : + QuotientGroup.mk' + (idealArtinKernel m + ((_root_.ideleClassNorm K L).range) hm) a = + 1 ↔ + idealArtinGaloisMap + (K := K) (L := L) m hm a = + 1 := by + exact + (QuotientGroup.eq_one_iff a).trans + (((idealArtinGalois_exact + (K := K) (L := L) m hm).1 a).symm) + +end ActualGaloisQuotient + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealDecompositionLaw.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealDecompositionLaw.lean new file mode 100644 index 0000000000..1cfa8c9bad --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealDecompositionLaw.lean @@ -0,0 +1,581 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldUnramifiedMaximality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinCompatibility +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic +/-! +# The ideal-theoretic unramified decomposition law + +This file identifies the ideal Artin symbol of a prime with the genuine +global and local Frobenius automorphism. For an unramified prime it then +combines this identification with the Dedekind-domain fundamental identity +to give the complete decomposition law: + +* the order of the prime class modulo the defining ideal group; +* the order of the actual Frobenius automorphism; +* the common inertia degree of the primes above it; and +* the number of primes above it + +are related by the global ideal decomposition law. +-/ + +@[expose] public section + +open scoped NumberField BigOperators + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open NumberField IsDedekindDomain +open HilbertRamification + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + +attribute [local instance] idealArtinKernelNormal + +open scoped Classical in +/-- The actual idèlic and ideal-theoretic Artin maps form the +commutative square of the ideal formulation of global reciprocity. + +For every idèle prime to the defining modulus, applying the ideal +Artin map to its fractional ideal gives its genuine global Artin +automorphism. -/ +theorem idealArtinGaloisMap_primeToIdealMap_eq_globalArtin + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (a : RayClass.idelePrimeToModulusSubgroup m) : + idealArtinGaloisMap (K := K) (L := L) m hm + (RayClass.primeToIdealMap m a) = + Reciprocity.globalArtinMonoidHom + (K := K) (L := L) (a : IdeleGroup K) := by + rw [idealArtinGaloisMap_apply] + rw [GlobalClassFields.idealArtinMap_primeToIdealMap] + change + Reciprocity.globalNormResidueMonoidHom K L + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (a : IdeleGroup K)) = + Reciprocity.globalArtinMonoidHom + (K := K) (L := L) (a : IdeleGroup K) + exact + DFunLike.congr_fun + (Reciprocity.globalNormResidueMonoidHom_comp_ideleClassQuotient_eq_globalArtin + (K := K) (L := L)) + (a : IdeleGroup K) + +open scoped Classical in +/-- The Galois-valued ideal Artin map sends a prime ideal outside a +defining modulus to the actual global prime Artin element. The latter +is, by finite-place local-global compatibility, the genuine chosen +local Frobenius value of a normalized order-one element. -/ +theorem idealArtinGaloisMap_primeIdeal_eq_finitePlacePrimeArtin + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : + idealArtinGaloisMap (K := K) (L := L) m hm + (RayClass.primeToModulusIdeal m v hv) = + GlobalClassFields.finitePlacePrimeArtin + (K := K) (L := L) v := by + rw [← GlobalClassFields.primeToIdealMap_finitePrimeIdele m v hv] + exact + idealArtinGaloisMap_primeToIdealMap_eq_globalArtin + (K := K) (L := L) m hm + ⟨IdeleGroup.finitePrimeIdele v, + GlobalClassFields.finitePrimeIdele_mem_idelePrimeToModulusSubgroup + m v hv⟩ + +open scoped Classical in +/-- Direct local form of the prime-ideal Artin identification: the +ideal Artin symbol is the chosen finite-place Artin value of the +normalized order-one local element. -/ +theorem idealArtinGaloisMap_primeIdeal_eq_chosenFinitePlaceArtin + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : + idealArtinGaloisMap (K := K) (L := L) m hm + (RayClass.primeToModulusIdeal m v hv) = + Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v + (FiniteIdeleGroup.chosenLocalOrderSection v 1) := by + rw [ + idealArtinGaloisMap_primeIdeal_eq_finitePlacePrimeArtin, + GlobalClassFields.finitePlacePrimeArtin_eq_chosenFinitePlaceArtin] + +open scoped Classical in +/-- The actual ideal class-field equivalence sends the class of a prime +ideal to the genuine finite-place Frobenius automorphism. -/ +theorem idealClassQuotientEquivGaloisGroup_primeIdeal + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : + idealClassQuotientEquivGaloisGroup + (K := K) (L := L) m hm + (QuotientGroup.mk' + (idealArtinKernel m + ((_root_.ideleClassNorm K L).range) hm) + (RayClass.primeToModulusIdeal m v hv)) = + GlobalClassFields.finitePlacePrimeArtin + (K := K) (L := L) v := by + rw [ + idealClassQuotientEquivGaloisGroup_mk, + idealArtinGaloisMap_primeIdeal_eq_finitePlacePrimeArtin] + +open scoped Classical in +/-- Completed unramifiedness at the chosen place gives ramification +index one in the integral Dedekind extension. -/ +theorem ramificationIndex_eq_one_of_chosenFinitePlaceUnramified + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + Ideal.ramificationIdxIn v.asIdeal (𝓞 L) = 1 := by + let w := + _root_.chosenFinitePlaceExtension (L := L) v + let W := + _root_.finitePlaceExtensionCentre + (K := K) (L := L) v w + let : Finite (L ≃ₐ[K] L) := + IsGaloisGroup.finite (L ≃ₐ[K] L) K L + let : + IsGaloisGroup + (L ≃ₐ[K] L) (𝓞 K) (𝓞 L) := + IsGaloisGroup.of_isFractionRing + (L ≃ₐ[K] L) (𝓞 K) (𝓞 L) K L + let : W.asIdeal.LiesOver v.asIdeal := + _root_.finitePlaceExtensionCentre_liesOver + (K := K) (L := L) v w + have hUnramifiedAt : + Algebra.IsUnramifiedAt (𝓞 K) W.asIdeal := + _root_.isUnramifiedAt_of_chosenFinitePlaceIsUnramified + (K := K) (L := L) v hunram + let : Algebra.IsUnramifiedAt (𝓞 K) W.asIdeal := + hUnramifiedAt + rw [ + Ideal.ramificationIdxIn_eq_ramificationIdx + v.asIdeal W.asIdeal (L ≃ₐ[K] L)] + exact Ideal.ramificationIdx_eq_one W.asIdeal (𝓞 K) + +open scoped Classical in +/-- At an unramified finite place, the chosen completion degree equals +the common ideal-theoretic inertia degree of the primes above it. -/ +theorem finitePlaceLocalDegree_eq_inertiaDegree_of_chosenUnramified + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + _root_.finitePlaceLocalDegree + (K := K) (L := L) v = + Ideal.inertiaDegIn v.asIdeal (𝓞 L) := by + let w := + _root_.chosenFinitePlaceExtension (L := L) v + let W := + _root_.finitePlaceExtensionCentre + (K := K) (L := L) v w + let : Finite (L ≃ₐ[K] L) := + IsGaloisGroup.finite (L ≃ₐ[K] L) K L + let : + IsGaloisGroup + (L ≃ₐ[K] L) (𝓞 K) (𝓞 L) := + IsGaloisGroup.of_isFractionRing + (L ≃ₐ[K] L) (𝓞 K) (𝓞 L) K L + let : W.asIdeal.LiesOver v.asIdeal := + _root_.finitePlaceExtensionCentre_liesOver + (K := K) (L := L) v w + let := _root_.finitePlaceMulAction K L + have hGroup : + _root_.finitePlaceDecompositionGroup + (K := K) (L := L) v = + MulAction.stabilizer (L ≃ₐ[K] L) W := by + unfold _root_.finitePlaceDecompositionGroup + exact + _root_.absoluteValueDecompositionGroup_eq_finitePlaceStabilizer + (K := K) (L := L) v w + have hUnder : + W.asIdeal.under (𝓞 K) = v.asIdeal := by + have hBelow := + _root_.finitePlaceBelow_finitePlaceExtensionCentre + (K := K) (L := L) v w + have h := + congrArg HeightOneSpectrum.asIdeal hBelow + simpa only [_root_.finitePlaceBelow_asIdeal] using h + have hRamification : + Ideal.ramificationIdxIn v.asIdeal (𝓞 L) = 1 := + ramificationIndex_eq_one_of_chosenFinitePlaceUnramified + (K := K) (L := L) v hunram + calc + _root_.finitePlaceLocalDegree + (K := K) (L := L) v = + Nat.card + (_root_.finitePlaceDecompositionGroup + (K := K) (L := L) v) := + (_root_.finitePlaceDecompositionGroup_card_eq_localDegree + (K := K) (L := L) v).symm + _ = + Nat.card + (MulAction.stabilizer (L ≃ₐ[K] L) W) := by + rw [hGroup] + _ = finiteLogPlaceLocalDegree K L W := + finitePlace_stabilizer_card_eq_localDegree K L W + _ = + Ideal.ramificationIdxIn v.asIdeal (𝓞 L) * + Ideal.inertiaDegIn v.asIdeal (𝓞 L) := by + simp only [finiteLogPlaceLocalDegree, hUnder] + _ = Ideal.inertiaDegIn v.asIdeal (𝓞 L) := by + rw [hRamification, one_mul] + +open scoped Classical in +/-- For an unramified prime, the order of its class modulo the ideal +Artin kernel is the common inertia degree. Equivalently, it is the +order of the genuine global/local Frobenius automorphism. -/ +theorem orderOf_idealPrimeClass_eq_inertiaDegree_of_chosenUnramified + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + orderOf + (QuotientGroup.mk' + (idealArtinKernel m + ((_root_.ideleClassNorm K L).range) hm) + (RayClass.primeToModulusIdeal m v hv)) = + Ideal.inertiaDegIn v.asIdeal (𝓞 L) := by + calc + orderOf + (QuotientGroup.mk' + (idealArtinKernel m + ((_root_.ideleClassNorm K L).range) hm) + (RayClass.primeToModulusIdeal m v hv)) = + orderOf + (idealClassQuotientEquivGaloisGroup + (K := K) (L := L) m hm + (QuotientGroup.mk' + (idealArtinKernel m + ((_root_.ideleClassNorm K L).range) hm) + (RayClass.primeToModulusIdeal m v hv))) := + ((idealClassQuotientEquivGaloisGroup + (K := K) (L := L) m hm).orderOf_eq _).symm + _ = + orderOf + (GlobalClassFields.finitePlacePrimeArtin + (K := K) (L := L) v) := by + rw [idealClassQuotientEquivGaloisGroup_primeIdeal] + _ = + _root_.finitePlaceLocalDegree + (K := K) (L := L) v := + GlobalClassFields.orderOf_finitePlacePrimeArtin_eq_finitePlaceLocalDegree_of_chosenUnramified + (K := K) (L := L) v hunram + _ = + Ideal.inertiaDegIn v.asIdeal (𝓞 L) := + finitePlaceLocalDegree_eq_inertiaDegree_of_chosenUnramified + (K := K) (L := L) v hunram + +open scoped Classical in +/-- The ideal Artin kernel detects precisely the multiples of the +unramified inertia degree among powers of the prime ideal. -/ +theorem unramifiedPrime_pow_mem_idealArtinKernel_iff_inertiaDegree_dvd + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) + (n : ℕ) : + (RayClass.primeToModulusIdeal m v hv) ^ n ∈ + idealArtinKernel m + ((_root_.ideleClassNorm K L).range) hm ↔ + Ideal.inertiaDegIn v.asIdeal (𝓞 L) ∣ n := by + rw [ + primeIdeal_pow_mem_idealArtinKernel_iff_orderOf_dvd, + orderOf_idealPrimeClass_eq_inertiaDegree_of_chosenUnramified + (K := K) (L := L) m hm v hv hunram] + +open scoped Classical in +/-- In an unramified Galois extension, the number of primes above `v` +is the extension degree divided by their common inertia degree. -/ +theorem unramifiedPrime_numberOfPrimes_eq_extensionDegree_div_inertiaDegree + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + (v.asIdeal.primesOver (𝓞 L)).ncard = + Module.finrank K L / + Ideal.inertiaDegIn v.asIdeal (𝓞 L) := by + let : Finite (L ≃ₐ[K] L) := + IsGaloisGroup.finite (L ≃ₐ[K] L) K L + let : + IsGaloisGroup + (L ≃ₐ[K] L) (𝓞 K) (𝓞 L) := + IsGaloisGroup.of_isFractionRing + (L ≃ₐ[K] L) (𝓞 K) (𝓞 L) K L + have hRamification : + Ideal.ramificationIdxIn v.asIdeal (𝓞 L) = 1 := + ramificationIndex_eq_one_of_chosenFinitePlaceUnramified + (K := K) (L := L) v hunram + simpa only [IsGalois.card_aut_eq_finrank] using + (Dedekind.dedekindRamification_unramified_numberOfPrimes_eq_degree_div_inertiaDegree + (A := 𝓞 K) (B := 𝓞 L) + v.asIdeal v.ne_bot (L ≃ₐ[K] L) hRamification) + +open scoped Classical in +/-- In an unramified Galois extension, the extended base prime is the +product of the distinct primes above it: every exponent is one. -/ +theorem unramifiedPrime_idealMap_eq_product_primesOver + (v : HeightOneSpectrum (𝓞 K)) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + Ideal.map (algebraMap (𝓞 K) (𝓞 L)) v.asIdeal = + ∏ P ∈ v.asIdeal.primesOver (𝓞 L), P := by + let : Finite (L ≃ₐ[K] L) := + IsGaloisGroup.finite (L ≃ₐ[K] L) K L + let : + IsGaloisGroup + (L ≃ₐ[K] L) (𝓞 K) (𝓞 L) := + IsGaloisGroup.of_isFractionRing + (L ≃ₐ[K] L) (𝓞 K) (𝓞 L) K L + have hRamification : + Ideal.ramificationIdxIn v.asIdeal (𝓞 L) = 1 := + ramificationIndex_eq_one_of_chosenFinitePlaceUnramified + (K := K) (L := L) v hunram + simpa only [hRamification, pow_one] using + (Dedekind.dedekindRamification_galois_prime_decomposition + (A := 𝓞 K) (B := 𝓞 L) + v.asIdeal v.ne_bot (L ≃ₐ[K] L)) + +open scoped Classical in +/-- Every prime above an unramified base prime has the common inertia +degree `inertiaDegIn v (𝓞 L)`. -/ +theorem primeAbove_inertiaDegree_eq_common + (v : HeightOneSpectrum (𝓞 K)) + (P : Ideal (𝓞 L)) + (hP : P ∈ v.asIdeal.primesOver (𝓞 L)) : + P.inertiaDeg (𝓞 K) = + Ideal.inertiaDegIn v.asIdeal (𝓞 L) := by + let : Finite (L ≃ₐ[K] L) := + IsGaloisGroup.finite (L ≃ₐ[K] L) K L + let : + IsGaloisGroup + (L ≃ₐ[K] L) (𝓞 K) (𝓞 L) := + IsGaloisGroup.of_isFractionRing + (L ≃ₐ[K] L) (𝓞 K) (𝓞 L) K L + let : P.IsPrime := hP.1 + let : P.LiesOver v.asIdeal := hP.2 + exact + (Ideal.inertiaDegIn_eq_inertiaDeg + v.asIdeal P (L ≃ₐ[K] L)).symm + +open scoped Classical in +/-- The number of prime factors above an unramified prime is the +extension degree divided by the order of its ideal class modulo the +defining ideal group. -/ +theorem unramifiedPrime_numberOfPrimes_eq_extensionDegree_div_idealClassOrder + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + (v.asIdeal.primesOver (𝓞 L)).ncard = + Module.finrank K L / + orderOf + (QuotientGroup.mk' + (idealArtinKernel m + ((_root_.ideleClassNorm K L).range) hm) + (RayClass.primeToModulusIdeal m v hv)) := by + rw [ + orderOf_idealPrimeClass_eq_inertiaDegree_of_chosenUnramified + (K := K) (L := L) m hm v hv hunram] + exact + unramifiedPrime_numberOfPrimes_eq_extensionDegree_div_inertiaDegree + (K := K) (L := L) v hunram + +open scoped Classical in +/-- Full ideal-theoretic decomposition law for an unramified prime. + +The prime factors are distinct, all have inertia degree equal to the +order of the prime class modulo the defining ideal group, and their +number is the global degree divided by that order. -/ +theorem unramifiedPrime_idealDecompositionLaw + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + let f := + orderOf + (QuotientGroup.mk' + (idealArtinKernel m + ((_root_.ideleClassNorm K L).range) hm) + (RayClass.primeToModulusIdeal m v hv)) + Ideal.map (algebraMap (𝓞 K) (𝓞 L)) v.asIdeal = + ∏ P ∈ v.asIdeal.primesOver (𝓞 L), P ∧ + (∀ P : Ideal (𝓞 L), + P ∈ v.asIdeal.primesOver (𝓞 L) → + P.inertiaDeg (𝓞 K) = f) ∧ + (v.asIdeal.primesOver (𝓞 L)).ncard = + Module.finrank K L / f := by + dsimp only + refine + ⟨unramifiedPrime_idealMap_eq_product_primesOver + (K := K) (L := L) v hunram, ?_, ?_⟩ + · intro P hP + rw [ + orderOf_idealPrimeClass_eq_inertiaDegree_of_chosenUnramified + (K := K) (L := L) m hm v hv hunram] + exact + primeAbove_inertiaDegree_eq_common + (K := K) (L := L) v P hP + · exact + unramifiedPrime_numberOfPrimes_eq_extensionDegree_div_idealClassOrder + (K := K) (L := L) m hm v hv hunram + +section SmallHilbertPrimeSplitting + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- Under actual reciprocity for the selected small Hilbert class +field, its genuine prime Frobenius automorphism is the ordinary ideal +class of the corresponding prime. -/ +theorem + smallHilbertClassFieldGaloisEquivClassGroup_finitePlacePrimeArtin + (v : HeightOneSpectrum (𝓞 K)) : + GlobalClassFields.smallHilbertClassFieldGaloisEquivClassGroupOverOriginal + (K := K) + (GlobalClassFields.finitePlacePrimeArtin + (K := K) + (L := GlobalClassFields.smallHilbertClassField K) v) = + ClassGroup.mk K (FractionalIdealGroup.prime v) := by + rw [GlobalClassFields.finitePlacePrimeArtin] + rw [ + ← DFunLike.congr_fun + (Reciprocity.globalNormResidueMonoidHom_comp_ideleClassQuotient_eq_globalArtin + (K := K) + (L := GlobalClassFields.smallHilbertClassField K)) + (IdeleGroup.finitePrimeIdele v)] + rw [MonoidHom.comp_apply] + rw [ + GlobalClassFields.smallHilbertClassFieldGaloisEquivClassGroupOverOriginal_idele, + IdeleGroup.idealClass_finitePrimeIdele] + +open scoped Classical in +/-- Every finite place is unramified in the selected small Hilbert +class field, in the completed chosen-place formulation used by the +local Artin map. -/ +theorem smallHilbertClassField_chosenFinitePlaceIsUnramified + (v : HeightOneSpectrum (𝓞 K)) : + _root_.ChosenFinitePlaceIsUnramified + (K := K) + (L := GlobalClassFields.smallHilbertClassField K) v := by + let w := + _root_.chosenFinitePlaceExtension + (L := GlobalClassFields.smallHilbertClassField K) v + let W := + _root_.finitePlaceExtensionCentre + (K := K) + (L := GlobalClassFields.smallHilbertClassField K) v w + apply + _root_.chosenFinitePlaceIsUnramified_of_isUnramifiedAt + (K := K) + (L := GlobalClassFields.smallHilbertClassField K) v + exact + GlobalClassFields.smallHilbertClassField_isUnramifiedAtFinitePlaces + K W + +open scoped Classical in +/-- A prime of the original number field actually splits completely +in the selected small Hilbert class field exactly when its prime ideal +is principal. -/ +theorem finitePlaceSplitsCompletelyInSmallHilbertClassField_iff_principal + (v : HeightOneSpectrum (𝓞 K)) : + _root_.FinitePlaceSplitsCompletely + (K := K) + (L := GlobalClassFields.smallHilbertClassField K) v ↔ + FractionalIdealGroup.prime v ∈ + (toPrincipalIdeal (𝓞 K) K).range := by + let e := + GlobalClassFields.smallHilbertClassFieldGaloisEquivClassGroupOverOriginal + (K := K) + have hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) + (L := GlobalClassFields.smallHilbertClassField K) v := + smallHilbertClassField_chosenFinitePlaceIsUnramified + (K := K) v + have hFrobenius : + GlobalClassFields.finitePlacePrimeArtin + (K := K) + (L := GlobalClassFields.smallHilbertClassField K) v = + 1 ↔ + ClassGroup.mk K (FractionalIdealGroup.prime v) = + 1 := by + constructor + · intro h + calc + ClassGroup.mk K (FractionalIdealGroup.prime v) = + e + (GlobalClassFields.finitePlacePrimeArtin + (K := K) + (L := GlobalClassFields.smallHilbertClassField K) v) := by + rw [ + smallHilbertClassFieldGaloisEquivClassGroup_finitePlacePrimeArtin] + _ = e 1 := congrArg e h + _ = 1 := e.map_one + · intro h + apply e.injective + rw [ + smallHilbertClassFieldGaloisEquivClassGroup_finitePlacePrimeArtin, + h, e.map_one] + rw [ + ← GlobalClassFields.finitePlacePrimeArtin_eq_one_iff_splitsCompletely_of_chosenUnramified + (K := K) + (L := GlobalClassFields.smallHilbertClassField K) v hunram, + hFrobenius] + exact + IdeleGroup.classGroup_mk_eq_one_iff + (FractionalIdealGroup.prime v) + +end SmallHilbertPrimeSplitting + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealFrobenius.lean new file mode 100644 index 0000000000..343d755be3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealFrobenius.lean @@ -0,0 +1,113 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinQuotient +/-! +# Ideal Frobenius classes and the decomposition law + +This file records the ideal-class-field ingredient of the decomposition +law. A prime outside a defining modulus gives an element of the ideal +Artin quotient, and the first isomorphism theorem preserves its order. +The general unramified Galois identity `r * f = n` belongs to +`RamificationTheory.HilbertRamification.Dedekind.Basic`. +-/ + +@[expose] public section + +open scoped NumberField +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open NumberField IsDedekindDomain + +variable {K : Type} [Field K] [NumberField K] + +attribute [local instance] + ideleClassSubgroupNormal idealArtinKernelNormal + +open scoped Classical in +/-- The ideal-theoretic Frobenius class attached to a prime outside the +defining modulus. Under global reciprocity this is the usual Frobenius +automorphism. -/ +def idealFrobeniusClass + (m : RayClass.Modulus K) + (N : Subgroup (IdeleClassGroup K)) + (hm : RayClass.Modulus.congruenceSubgroup m ≤ N) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : + IdeleClassGroup K ⧸ N := + idealArtinMap m N hm + (RayClass.primeToModulusIdeal m v hv) + +open scoped Classical in +/-- The order of the Artin image of `v` is the order of `v` modulo the +ideal group `H_m`. -/ +theorem orderOf_idealFrobeniusClass + (m : RayClass.Modulus K) + (N : Subgroup (IdeleClassGroup K)) + (hm : RayClass.Modulus.congruenceSubgroup m ≤ N) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : + orderOf (idealFrobeniusClass m N hm v hv) = + orderOf + (QuotientGroup.mk' (idealArtinKernel m N hm) + (RayClass.primeToModulusIdeal m v hv)) := by + exact + (idealClassQuotientEquivNormQuotient m N hm).orderOf_eq + (QuotientGroup.mk' (idealArtinKernel m N hm) + (RayClass.primeToModulusIdeal m v hv)) + +open scoped Classical in +/-- A power of a prime ideal lies in the defining ideal group exactly +when the order of its class in `J_K^m / H_m` divides the exponent. + +This is the precise group-theoretic form of the "smallest positive +`f` with `p^f ∈ H_m`" clause in the unramified decomposition law. -/ +theorem primeIdeal_pow_mem_idealArtinKernel_iff_orderOf_dvd + (m : RayClass.Modulus K) + (N : Subgroup (IdeleClassGroup K)) + (hm : RayClass.Modulus.congruenceSubgroup m ≤ N) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) + (n : ℕ) : + (RayClass.primeToModulusIdeal m v hv) ^ n ∈ + idealArtinKernel m N hm ↔ + orderOf + (QuotientGroup.mk' (idealArtinKernel m N hm) + (RayClass.primeToModulusIdeal m v hv)) ∣ + n := by + constructor + · intro hmem + have hq : + QuotientGroup.mk' (idealArtinKernel m N hm) + ((RayClass.primeToModulusIdeal m v hv) ^ n) = 1 := + (QuotientGroup.eq_one_iff + ((RayClass.primeToModulusIdeal m v hv) ^ n)).2 hmem + apply orderOf_dvd_iff_pow_eq_one.2 + simpa only [map_pow] using hq + · intro hdvd + have hq : + (QuotientGroup.mk' (idealArtinKernel m N hm) + (RayClass.primeToModulusIdeal m v hv)) ^ n = 1 := + orderOf_dvd_iff_pow_eq_one.1 hdvd + apply + (QuotientGroup.eq_one_iff + ((RayClass.primeToModulusIdeal m v hv) ^ n)).1 + calc + QuotientGroup.mk' (idealArtinKernel m N hm) + ((RayClass.primeToModulusIdeal m v hv) ^ n) = + (QuotientGroup.mk' (idealArtinKernel m N hm) + (RayClass.primeToModulusIdeal m v hv)) ^ n := + map_pow _ _ n + _ = 1 := hq + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean new file mode 100644 index 0000000000..c5d38026a9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean @@ -0,0 +1,537 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealDecompositionLaw +/-! +# Ideal norms and arithmetic Artin exactness + +For a finite abelian extension `L / K` and a defining modulus `m`, the +genuine ideal group + +`N_{L/K} J_L^m P_K^m` + +is `RayClass.idealNormSubgroup`. This module identifies it with the +kernel of the arithmetic ideal Artin map, descends that map to the +corresponding quotient, and states the unramified decomposition law +entirely in terms of this norm-defined ideal group. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open NumberField IsDedekindDomain + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + +attribute [local instance] + ideleClassSubgroupNormal idealArtinKernelNormal + +open scoped Classical in +/-- The kernel of the arithmetic, Galois-valued ideal Artin map is the +genuine norm-defined ideal group `N_{L/K} J_L^m P_K^m`. -/ +theorem arithmeticIdealArtinGaloisMap_ker_eq_idealNormSubgroup + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + (arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm).ker = + RayClass.idealNormSubgroup + (K := K) (L := L) m := by + rw [arithmeticIdealArtinGaloisMap_ker, + idealArtinKernel_eq_idealNormSubgroup] + +open scoped Classical in +/-- An ideal prime to `m` has trivial arithmetic Artin symbol exactly +when it belongs to `N_{L/K} J_L^m P_K^m`. -/ +theorem arithmeticIdealArtinGaloisMap_eq_one_iff_mem_idealNormSubgroup + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (a : RayClass.primeToModulusIdeals m) : + arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm a = + 1 ↔ + a ∈ RayClass.idealNormSubgroup + (K := K) (L := L) m := by + change + a ∈ + (arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm).ker ↔ + a ∈ RayClass.idealNormSubgroup + (K := K) (L := L) m + rw [arithmeticIdealArtinGaloisMap_ker_eq_idealNormSubgroup] + +open scoped Classical in +/-- Exactness of the arithmetic ideal Artin sequence with its kernel +written as the actual norm-defined ideal group. -/ +theorem arithmeticIdealArtin_norm_exact + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + (arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm).ker = + RayClass.idealNormSubgroup + (K := K) (L := L) m ∧ + Function.Surjective + (arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm) := + ⟨arithmeticIdealArtinGaloisMap_ker_eq_idealNormSubgroup m hm, + arithmeticIdealArtinGaloisMap_surjective m hm⟩ + +open scoped Classical in +/-- The vertical isomorphism in the ideal/idèle Artin diagram: + +`J_K^m / (N_{L/K} J_L^{m_L} P_K^m) ≃ C_K / N_{L/K} C_L`. + +It is the first-isomorphism-theorem comparison for the ideal Artin +map, transported across the equality between its kernel and the +genuine norm-defined ideal group. -/ +noncomputable def idealNormQuotientEquivIdeleClassNormQuotient + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + RayClass.primeToModulusIdeals m ⧸ + RayClass.idealNormSubgroup + (K := K) (L := L) m ≃* + IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range := + (QuotientGroup.quotientMulEquivOfEq + (idealArtinKernel_eq_idealNormSubgroup + (K := K) (L := L) m hm).symm).trans + (idealClassQuotientEquivNormQuotient m + ((_root_.ideleClassNorm K L).range) hm) + +omit [IsAbelianGalois K L] in +open scoped Classical in +/-- The ideal-norm quotient comparison sends an ideal representative to its +class in the idèle-class norm quotient. -/ +theorem idealNormQuotientEquivIdeleClassNormQuotient_mk + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (a : RayClass.primeToModulusIdeals m) : + idealNormQuotientEquivIdeleClassNormQuotient + (K := K) (L := L) m hm + (QuotientGroup.mk' + (RayClass.idealNormSubgroup + (K := K) (L := L) m) a) = + idealArtinMap m + ((_root_.ideleClassNorm K L).range) hm a := by + let h := + (idealArtinKernel_eq_idealNormSubgroup + (K := K) (L := L) m hm).symm + change + idealClassQuotientEquivNormQuotient m + ((_root_.ideleClassNorm K L).range) hm + (QuotientGroup.quotientMulEquivOfEq h + (QuotientGroup.mk' + (RayClass.idealNormSubgroup + (K := K) (L := L) m) a)) = + idealArtinMap m + ((_root_.ideleClassNorm K L).range) hm a + calc + _ = idealClassQuotientEquivNormQuotient m + ((_root_.ideleClassNorm K L).range) hm + (QuotientGroup.mk' + (idealArtinKernel m + ((_root_.ideleClassNorm K L).range) hm) a) := + congrArg + (idealClassQuotientEquivNormQuotient m + ((_root_.ideleClassNorm K L).range) hm) + (QuotientGroup.quotientMulEquivOfEq_mk h a) + _ = idealArtinMap m + ((_root_.ideleClassNorm K L).range) hm a := + idealClassQuotientEquivNormQuotient_mk m + ((_root_.ideleClassNorm K L).range) hm a + +open scoped Classical in +/-- The arithmetic ideal Artin map descended through the concrete +norm-defined ideal group. -/ +noncomputable def arithmeticIdealNormQuotientArtinMap + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + RayClass.primeToModulusIdeals m ⧸ + RayClass.idealNormSubgroup + (K := K) (L := L) m →* + (L ≃ₐ[K] L) := + QuotientGroup.lift + (RayClass.idealNormSubgroup + (K := K) (L := L) m) + (arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm) + (by + intro a ha + rw [arithmeticIdealArtinGaloisMap_ker_eq_idealNormSubgroup] + exact ha) + +open scoped Classical in +/-- The descended arithmetic ideal Artin map evaluates on quotient +representatives as the original arithmetic ideal Artin map. -/ +theorem arithmeticIdealNormQuotientArtinMap_mk + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (a : RayClass.primeToModulusIdeals m) : + arithmeticIdealNormQuotientArtinMap + (K := K) (L := L) m hm + (QuotientGroup.mk' + (RayClass.idealNormSubgroup + (K := K) (L := L) m) a) = + arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm a := + QuotientGroup.lift_mk _ _ _ + +open scoped Classical in +/-- The arithmetic ideal Artin map on the concrete norm quotient is +injective. -/ +theorem arithmeticIdealNormQuotientArtinMap_injective + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + Function.Injective + (arithmeticIdealNormQuotientArtinMap + (K := K) (L := L) m hm) := by + intro x y hxy + obtain ⟨a, rfl⟩ := + QuotientGroup.mk'_surjective + (RayClass.idealNormSubgroup + (K := K) (L := L) m) x + obtain ⟨b, rfl⟩ := + QuotientGroup.mk'_surjective + (RayClass.idealNormSubgroup + (K := K) (L := L) m) y + rw [arithmeticIdealNormQuotientArtinMap_mk, + arithmeticIdealNormQuotientArtinMap_mk] at hxy + apply + (QuotientGroup.eq_iff_div_mem + (N := RayClass.idealNormSubgroup + (K := K) (L := L) m) + (x := a) (y := b)).2 + rw [← arithmeticIdealArtinGaloisMap_ker_eq_idealNormSubgroup] + change + arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm (a / b) = + 1 + rw [map_div, hxy] + exact div_self' _ + +open scoped Classical in +/-- The arithmetic ideal Artin map on the concrete norm quotient is +surjective. -/ +theorem arithmeticIdealNormQuotientArtinMap_surjective + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + Function.Surjective + (arithmeticIdealNormQuotientArtinMap + (K := K) (L := L) m hm) := by + intro σ + obtain ⟨a, ha⟩ := + arithmeticIdealArtinGaloisMap_surjective + (K := K) (L := L) m hm σ + refine + ⟨QuotientGroup.mk' + (RayClass.idealNormSubgroup + (K := K) (L := L) m) a, ?_⟩ + rw [arithmeticIdealNormQuotientArtinMap_mk] + exact ha + +open scoped Classical in +/-- The descended ideal Artin map is the arithmetic global +norm-residue map after the vertical ideal/idèle quotient +isomorphism. This is the commutative square in the ideal-theoretic +Artin reciprocity theorem. -/ +theorem arithmeticIdealNormQuotientArtinMap_eq_normResidue + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (q : + RayClass.primeToModulusIdeals m ⧸ + RayClass.idealNormSubgroup + (K := K) (L := L) m) : + arithmeticIdealNormQuotientArtinMap + (K := K) (L := L) m hm q = + Reciprocity.arithmeticGlobalNormResidueContinuousMulEquiv + K L + (idealNormQuotientEquivIdeleClassNormQuotient + (K := K) (L := L) m hm q) := by + obtain ⟨a, rfl⟩ := + QuotientGroup.mk'_surjective + (RayClass.idealNormSubgroup + (K := K) (L := L) m) q + rw [arithmeticIdealNormQuotientArtinMap_mk, + idealNormQuotientEquivIdeleClassNormQuotient_mk] + rfl + +open scoped Classical in +/-- The canonical arithmetic ideal class-field isomorphism + +`J_K^m / (N_{L/K} J_L^m P_K^m) ≃ Gal(L/K)`. + +Both the source subgroup and the target Galois group are the concrete +objects occurring in the extension `L / K`. -/ +noncomputable def arithmeticIdealNormQuotientEquivGaloisGroup + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + RayClass.primeToModulusIdeals m ⧸ + RayClass.idealNormSubgroup + (K := K) (L := L) m ≃* + (L ≃ₐ[K] L) := + MulEquiv.ofBijective + (arithmeticIdealNormQuotientArtinMap + (K := K) (L := L) m hm) + ⟨arithmeticIdealNormQuotientArtinMap_injective m hm, + arithmeticIdealNormQuotientArtinMap_surjective m hm⟩ + +open scoped Classical in +/-- The arithmetic ideal norm-quotient equivalence sends a quotient +representative to its arithmetic ideal Artin symbol. -/ +theorem arithmeticIdealNormQuotientEquivGaloisGroup_mk + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (a : RayClass.primeToModulusIdeals m) : + arithmeticIdealNormQuotientEquivGaloisGroup + (K := K) (L := L) m hm + (QuotientGroup.mk' + (RayClass.idealNormSubgroup + (K := K) (L := L) m) a) = + arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm a := + arithmeticIdealNormQuotientArtinMap_mk m hm a + +open scoped Classical in +/-- The canonical quotient equivalence makes the full arithmetic +ideal/idèle reciprocity diagram commute. -/ +theorem arithmeticIdealNormQuotientEquivGaloisGroup_eq_normResidue + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (q : + RayClass.primeToModulusIdeals m ⧸ + RayClass.idealNormSubgroup + (K := K) (L := L) m) : + arithmeticIdealNormQuotientEquivGaloisGroup + (K := K) (L := L) m hm q = + Reciprocity.arithmeticGlobalNormResidueContinuousMulEquiv + K L + (idealNormQuotientEquivIdeleClassNormQuotient + (K := K) (L := L) m hm q) := + arithmeticIdealNormQuotientArtinMap_eq_normResidue + (K := K) (L := L) m hm q + +open scoped Classical in +/-- For an unramified prime outside `m`, the order of its class modulo +the norm-defined ideal group is the common residue degree upstairs. -/ +theorem + orderOf_arithmeticIdealNormPrimeClass_eq_inertiaDegree_of_chosenUnramified + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + orderOf + (QuotientGroup.mk' + (RayClass.idealNormSubgroup + (K := K) (L := L) m) + (RayClass.primeToModulusIdeal m v hv)) = + Ideal.inertiaDegIn v.asIdeal (𝓞 L) := by + rw [← idealArtinKernel_eq_idealNormSubgroup + (K := K) (L := L) m hm] + exact + orderOf_idealPrimeClass_eq_inertiaDegree_of_chosenUnramified + (K := K) (L := L) m hm v hv hunram + +open scoped Classical in +/-- A power of an unramified prime lies in the norm-defined ideal +group exactly when its common residue degree divides the exponent. -/ +theorem + unramifiedPrime_pow_mem_idealNormSubgroup_iff_inertiaDegree_dvd + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) + (n : ℕ) : + (RayClass.primeToModulusIdeal m v hv) ^ n ∈ + RayClass.idealNormSubgroup + (K := K) (L := L) m ↔ + Ideal.inertiaDegIn v.asIdeal (𝓞 L) ∣ n := by + rw [← idealArtinKernel_eq_idealNormSubgroup + (K := K) (L := L) m hm] + exact + unramifiedPrime_pow_mem_idealArtinKernel_iff_inertiaDegree_dvd + (K := K) (L := L) m hm v hv hunram n + +open scoped Classical in +/-- The full unramified decomposition law, with `f` defined as the +order of the prime class modulo the genuine norm-defined ideal group. -/ +theorem unramifiedPrime_idealNormDecompositionLaw + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + let f := + orderOf + (QuotientGroup.mk' + (RayClass.idealNormSubgroup + (K := K) (L := L) m) + (RayClass.primeToModulusIdeal m v hv)) + Ideal.map (algebraMap (𝓞 K) (𝓞 L)) v.asIdeal = + ∏ P ∈ v.asIdeal.primesOver (𝓞 L), P ∧ + (∀ P : Ideal (𝓞 L), + P ∈ v.asIdeal.primesOver (𝓞 L) → + P.inertiaDeg (𝓞 K) = f) ∧ + (v.asIdeal.primesOver (𝓞 L)).ncard = + Module.finrank K L / f := by + rw [← idealArtinKernel_eq_idealNormSubgroup + (K := K) (L := L) m hm] + exact + unramifiedPrime_idealDecompositionLaw + (K := K) (L := L) m hm v hv hunram + +open scoped Classical in +open GlobalClassFields renaming + arithmeticFinitePlacePrimeArtin_eq_one_iff_splitsCompletely_of_chosenUnramified → + primeArtin_eq_one_iff_splitsCompletely_of_unramified in +/-- An unramified prime outside `m` splits completely exactly when its +ideal class belongs to `N_{L/K} J_L^m P_K^m`. -/ +theorem + finitePlaceSplitsCompletely_iff_primeIdeal_mem_idealNormSubgroup + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) + (hunram : + _root_.ChosenFinitePlaceIsUnramified + (K := K) (L := L) v) : + _root_.FinitePlaceSplitsCompletely + (K := K) (L := L) v ↔ + RayClass.primeToModulusIdeal m v hv ∈ + RayClass.idealNormSubgroup + (K := K) (L := L) m := by + calc + _root_.FinitePlaceSplitsCompletely + (K := K) (L := L) v ↔ + GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v = + 1 := + (primeArtin_eq_one_iff_splitsCompletely_of_unramified + (K := K) (L := L) v hunram).symm + _ ↔ + arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm + (RayClass.primeToModulusIdeal m v hv) = + 1 := by + rw [ + arithmeticIdealArtinGaloisMap_primeIdeal_eq_arithmeticFinitePlacePrimeArtin] + _ ↔ + RayClass.primeToModulusIdeal m v hv ∈ + RayClass.idealNormSubgroup + (K := K) (L := L) m := + arithmeticIdealArtinGaloisMap_eq_one_iff_mem_idealNormSubgroup + m hm (RayClass.primeToModulusIdeal m v hv) + +end IdealClassFieldTheory +end GlobalClassFieldTheory + +namespace ClassFieldTheory + +open NumberField IsDedekindDomain + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + +open scoped Classical in + +open _root_.GlobalClassFieldTheory.IdealClassFieldTheory + (arithmeticIdealArtinGaloisMap_ker_eq_idealNormSubgroup) in +/-- The arithmetic ideal Artin kernel is the join of the genuine ideal-norm +image with the ray-principal ideal subgroup. -/ +theorem arithmeticIdealArtin_ker_eq_norm_range_sup_ray_principal + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + (GlobalClassFieldTheory.IdealClassFieldTheory.arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm).ker = + (RayClass.primeToModulusIdealNorm + (K := K) (L := L) m).range ⊔ + RayClass.principalRayIdealSubgroup m := by + simpa only [RayClass.idealNormSubgroup] using + (arithmeticIdealArtinGaloisMap_ker_eq_idealNormSubgroup + (K := K) (L := L) m hm) + +open scoped Classical in +/-- An ideal has trivial arithmetic Artin symbol precisely when it lies in +the group generated by ideal norms and ray-principal ideals. -/ +theorem arithmeticIdealArtin_eq_one_iff_norm_range_sup_ray_principal + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) + (a : RayClass.primeToModulusIdeals m) : + GlobalClassFieldTheory.IdealClassFieldTheory.arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm a = 1 ↔ + a ∈ (RayClass.primeToModulusIdealNorm + (K := K) (L := L) m).range ⊔ + RayClass.principalRayIdealSubgroup m := by + change + a ∈ + (GlobalClassFieldTheory.IdealClassFieldTheory.arithmeticIdealArtinGaloisMap + (K := K) (L := L) m hm).ker ↔ + a ∈ (RayClass.primeToModulusIdealNorm + (K := K) (L := L) m).range ⊔ + RayClass.principalRayIdealSubgroup m + rw [arithmeticIdealArtin_ker_eq_norm_range_sup_ray_principal] + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitation.lean new file mode 100644 index 0000000000..bdca264715 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitation.lean @@ -0,0 +1,100 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationCore +/-! +# Ideal and ray consequences of norm limitation + +For a finite extension `L / K`, norm limitation identifies its idèle-class +norm range with that of the maximal abelian subfield in the chosen finite +normal closure. This leaf transports that equality to the corresponding +ideal norm group for every defining modulus and to the image of the norm +range in every ray class group. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +private theorem normLimitationIdeleClassIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] normLimitationIdeleClassIsMulCommutative + +variable + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +/-- The norm subgroup in the ray class group is the image of the actual +idèle-class norm range modulo the ray congruence subgroup. -/ +noncomputable def rayNormSubgroup (m : RayClass.Modulus K) : + Subgroup (RayClass.RayClassGroup m) := + Subgroup.map + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup m)) + ((_root_.ideleClassNorm K L).range) + +omit [FiniteDimensional K L] in +/-- For a defining modulus, the ray norm subgroup is exactly the kernel of +the canonical map from the ray class group to the idèle-class norm +quotient. -/ +theorem rayNormSubgroup_eq_rayClassToNormQuotient_ker + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + rayNormSubgroup K L m = + (rayClassToNormQuotient m + ((_root_.ideleClassNorm K L).range) hm).ker := by + unfold rayNormSubgroup rayClassToNormQuotient + let N := RayClass.Modulus.congruenceSubgroup m + let M := (_root_.ideleClassNorm K L).range + change + Subgroup.map (QuotientGroup.mk' N) M = + (QuotientGroup.map N M (MonoidHom.id (IdeleClassGroup K)) _).ker + symm + simpa only [Subgroup.comap_id] using + (QuotientGroup.ker_map (N := N) M + (MonoidHom.id (IdeleClassGroup K)) + (show N ≤ Subgroup.comap (MonoidHom.id (IdeleClassGroup K)) M from + by simpa only [N, M, Subgroup.comap_id] using hm)) + +/-- Ideal norm limitation: for every defining modulus, the genuine ideal +norm group of a finite extension equals that of its maximal abelian +subfield in the chosen finite normal closure. -/ +theorem idealNormSubgroup_eq_maximalAbelianSubfield + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + idealNormSubgroupMaximalAbelianStatement K L m hm := + idealNormSubgroupMaximalAbelianStatement_proof K L m hm + +/-- Ray norm limitation: the image of a finite extension's idèle-class norm +range in every ray class group is already the image of the norm range from +its maximal abelian subfield. -/ +theorem rayNormSubgroup_eq_maximalAbelianSubfield + (m : RayClass.Modulus K) : + rayNormSubgroup K L m = + rayNormSubgroup K + (finiteNormalClosureMaximalAbelianSubfield K L) m := by + unfold rayNormSubgroup + rw [GlobalClassFields.ideleClassNorm_range_eq_maximalAbelianSubfield K L] + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationCore.lean new file mode 100644 index 0000000000..65d1a23357 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationCore.lean @@ -0,0 +1,78 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationStatement +/-! +# Proof core for ideal norm limitation + +This leaf proves the packaged statement using the idèle-class norm-range +equality and the finite-extension ideal Artin kernel theorem. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +variable + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +private theorem idealArtinKernel_congr + (m : RayClass.Modulus K) + {N P : Subgroup (IdeleClassGroup K)} + (hN : RayClass.Modulus.congruenceSubgroup m ≤ N) + (hP : RayClass.Modulus.congruenceSubgroup m ≤ P) + (hNP : N = P) : + idealArtinKernel m N hN = idealArtinKernel m P hP := by + subst P + rfl + +/-- Core proof of the packaged ideal norm-limitation statement. -/ +theorem idealNormSubgroupMaximalAbelianStatement_proof + (m : RayClass.Modulus K) + (hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : + idealNormSubgroupMaximalAbelianStatement K L m hm := by + unfold idealNormSubgroupMaximalAbelianStatement + let A := finiteNormalClosureMaximalAbelianSubfield K L + have hRange : + (_root_.ideleClassNorm K L).range = + (_root_.ideleClassNorm K A).range := + GlobalClassFields.ideleClassNorm_range_eq_maximalAbelianSubfield K L + have hmA : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K A).range := + hRange ▸ hm + calc + RayClass.idealNormSubgroup (K := K) (L := L) m = + idealArtinKernel m + ((_root_.ideleClassNorm K L).range) hm := + (idealArtinKernel_eq_idealNormSubgroup_of_finiteExtension + (K := K) (L := L) m hm).symm + _ = idealArtinKernel m + ((_root_.ideleClassNorm K A).range) hmA := + idealArtinKernel_congr + (K := K) (m := m) + (N := (_root_.ideleClassNorm K L).range) + (P := (_root_.ideleClassNorm K A).range) + hm hmA hRange + _ = RayClass.idealNormSubgroup (K := K) (L := A) m := + idealArtinKernel_eq_idealNormSubgroup_of_finiteExtension + (K := K) (L := A) m hmA + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationStatement.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationStatement.lean new file mode 100644 index 0000000000..11a7123eaa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationStatement.lean @@ -0,0 +1,49 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormLimitation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinMap +/-! +# Statement boundary for ideal norm limitation + +This leaf packages the ideal norm-limitation equality behind a named +proposition. Keeping the expanded normal-closure expression out of later +declaration signatures avoids repeatedly normalizing the full finite tower. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +variable + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +/-- The proposition asserting ideal norm limitation for one defining +modulus. -/ +@[irreducible] noncomputable def idealNormSubgroupMaximalAbelianStatement + (m : RayClass.Modulus K) + (_hm : + RayClass.Modulus.congruenceSubgroup m ≤ + (_root_.ideleClassNorm K L).range) : Prop := + RayClass.idealNormSubgroup (K := K) (L := L) m = + RayClass.idealNormSubgroup + (K := K) + (L := finiteNormalClosureMaximalAbelianSubfield K L) + m + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTheorem.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTheorem.lean new file mode 100644 index 0000000000..fff4eabd28 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTheorem.lean @@ -0,0 +1,126 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdealClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison +public import Mathlib.RingTheory.ClassGroup.ExtendedHom +/-! +# The principal ideal theorem + +This file descends genuine idele extension to the reciprocity quotients +defining the two small Hilbert class fields and proves that the resulting +map forms the naturality square with the existing ideal-class extension +`ClassGroup.extendedHom`. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open NumberField + +/-- Canonical class-group commutativity supplies normality for the quotient. -/ +private theorem principalIdealTheoremClassGroupIsMulCommutative + (F : Type*) [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + IsMulCommutative.of_comm (fun a b => mul_comm a b) + +attribute [local instance] principalIdealTheoremClassGroupIsMulCommutative + +section SmallHilbertIdeleExtension + +variable + (K L : Type*) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +omit [IsGalois K L] in +/-- The map on small-Hilbert reciprocity quotients induced by the +concrete extension map on ideles. -/ +noncomputable def smallHilbertClassFieldIdeleExtensionMap : + (IdeleClassGroup K ⧸ + GlobalClassFields.smallHilbertClassFieldNormSubgroup) →* + (IdeleClassGroup L ⧸ + GlobalClassFields.smallHilbertClassFieldNormSubgroup) := + QuotientGroup.map + GlobalClassFields.smallHilbertClassFieldNormSubgroup + GlobalClassFields.smallHilbertClassFieldNormSubgroup + (ideleClassExtension K L) + (by + rintro _ ⟨a, ha, rfl⟩ + change + ideleClassExtension K L + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) ∈ + GlobalClassFields.smallHilbertClassFieldNormSubgroup + rw [ideleClassExtension_mk] + exact + ⟨IdeleGroup.extension K L a, + IdeleGroup.extension_mem_ordinaryIdealClassSubgroup + K L ha, + rfl⟩) + +omit [IsGalois K L] in +/-- Evaluation of the small-Hilbert idele-extension map on a quotient +representative. -/ +theorem smallHilbertClassFieldIdeleExtensionMap_mk' + (c : IdeleClassGroup K) : + smallHilbertClassFieldIdeleExtensionMap K L + (QuotientGroup.mk' + (GlobalClassFields.smallHilbertClassFieldNormSubgroup (K := K)) c) = + QuotientGroup.mk' + (GlobalClassFields.smallHilbertClassFieldNormSubgroup (K := L)) + (ideleClassExtension K L c) := by + rfl + +omit [IsGalois K L] in +/-- The concrete idele extension and extension of ideal classes form +the naturality square on the small-Hilbert quotients. -/ +theorem smallHilbertClassFieldIdeleExtensionMap_naturality + (q : IdeleClassGroup K ⧸ + GlobalClassFields.smallHilbertClassFieldNormSubgroup) : + GlobalClassFields.smallHilbertClassFieldQuotientEquivClassGroup + (K := L) + (smallHilbertClassFieldIdeleExtensionMap K L q) = + ClassGroup.extendedHom (𝓞 K) (𝓞 L) + (GlobalClassFields.smallHilbertClassFieldQuotientEquivClassGroup + (K := K) q) := by + induction q using QuotientGroup.induction_on with + | _ c => + induction c using QuotientGroup.induction_on with + | _ a => + change + GlobalClassFields.smallHilbertClassFieldQuotientEquivClassGroup + (K := L) + (QuotientGroup.mk' + GlobalClassFields.smallHilbertClassFieldNormSubgroup + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup L) + (IdeleGroup.extension K L a))) = + ClassGroup.extendedHom (𝓞 K) (𝓞 L) + (GlobalClassFields.smallHilbertClassFieldQuotientEquivClassGroup + (K := K) + (QuotientGroup.mk' + GlobalClassFields.smallHilbertClassFieldNormSubgroup + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a))) + rw [ + GlobalClassFields.smallHilbertClassFieldQuotientEquivClassGroup_mk, + GlobalClassFields.smallHilbertClassFieldQuotientEquivClassGroup_mk, + IdeleGroup.idealClass_extension] + +end SmallHilbertIdeleExtension + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTower.lean new file mode 100644 index 0000000000..94af020108 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTower.lean @@ -0,0 +1,229 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormConjugation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldCandidate +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction +/-! +# Galois structure on a conjugate-stable abelian tower + +The principal ideal theorem uses two successive finite abelian class fields. +The upper field is Galois over the original base once its absolute Galois +subgroup is stable under conjugation by the base subgroup. This file packages +that actual subgroup statement as a finite Galois subextension, so that the +commutator-intermediate-field and transfer APIs can be applied to the tower. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open ClassFormation KummerTheory + +variable {G : Type u} [Group G] [TopologicalSpace G] +variable {K : ClosedSubgroup G} + +section Conjugation + +variable [ContinuousMul G] + +/-- Conjugation by an element of a closed subgroup preserves that +subgroup. This is the subgroup form of the fact that every field +automorphism over the base fixes the base field setwise. -/ +theorem conjugateClosedSubgroup_eq_self_of_mem + (K : ClosedSubgroup G) {s : G} (hs : s ∈ K) : + conjugateClosedSubgroup K s = K := by + ext x + change x ∈ conjugateClosedSubgroup K s ↔ x ∈ K + rw [conjugateClosedSubgroup_mem] + constructor + · intro hx + have hmem := + K.mul_mem (K.mul_mem (K.inv_mem hs) hx) hs + change x ∈ K.toSubgroup + simpa [mul_assoc] using hmem + · intro hx + exact K.mul_mem (K.mul_mem hs hx) (K.inv_mem hs) + +/-- Conjugating both endpoints of a finite abelian extension produces +the actual conjugate finite abelian extension. -/ +def conjugateFiniteAbelianSubextension + (L : FiniteAbelianSubextension K) (s : G) : + FiniteAbelianSubextension (conjugateClosedSubgroup K s) where + toFiniteGaloisExtension := + { field := conjugateClosedSubgroup L.field s + below := conjugateClosedSubgroup_mono L.below s + normal := by + let : + (CyclicCohomology.extensionSubgroup K L.field L.below).Normal := + L.normal + infer_instance + finite := by + let : Finite + (K.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup K L.field L.below) := + L.finite + exact finite_conjugateExtension K L.field L.below s } + commutative := by + let : (CyclicCohomology.extensionSubgroup K L.field L.below).Normal := + L.normal + let e := + finiteReciprocityNaturalityConjugation K L.field L.below s + refine ⟨⟨?_⟩⟩ + intro x y + obtain ⟨x', rfl⟩ := e.surjective x + obtain ⟨y', rfl⟩ := e.surjective y + calc + e x' * e y' = e (x' * y') := (map_mul e x' y').symm + _ = e (y' * x') := congrArg e (L.commutative.is_comm.comm _ _) + _ = e y' * e x' := map_mul e y' x' + +@[simp] +theorem conjugateFiniteAbelianSubextension_field + (L : FiniteAbelianSubextension K) (s : G) : + (conjugateFiniteAbelianSubextension L s).field = + conjugateClosedSubgroup L.field s := + rfl + +/-- Two successive finite abelian extensions form a finite Galois extension +over the original base when the top-field subgroup is stable under conjugation +by every element of the base subgroup. -/ +def galoisSubextensionOfConjugateStableAbelianTower + (L : FiniteAbelianSubextension K) + (M : FiniteAbelianSubextension L.field) + (hstable : ∀ s : K.toSubgroup, + conjugateClosedSubgroup M.field s.1 = M.field) : + FiniteGaloisSubextension K where + field := M.field + below := M.below.trans L.below + normal := by + refine Subgroup.Normal.mk ?_ + intro q hq r + apply + (mem_extensionSubgroup_iff + K M.field (M.below.trans L.below) _).2 + have hqM : (q : G) ∈ M.field := + (mem_extensionSubgroup_iff + K M.field (M.below.trans L.below) q).1 hq + have hqConj : + (q : G) ∈ conjugateClosedSubgroup M.field (r : G) := by + rw [hstable r] + exact hqM + exact + (conjugateClosedSubgroup_mem M.field (r : G) (q : G)).1 hqConj + finite := by + let : Finite + (L.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup L.field M.field M.below) := + M.finite + let : Finite + (K.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup K L.field L.below) := + L.finite + exact + FiniteGaloisSubextension.finite_extension_trans M.below L.below + +@[simp] +theorem galoisSubextensionOfConjugateStableAbelianTower_field + (L : FiniteAbelianSubextension K) + (M : FiniteAbelianSubextension L.field) + (hstable : ∀ s : K.toSubgroup, + conjugateClosedSubgroup M.field s.1 = M.field) : + (galoisSubextensionOfConjugateStableAbelianTower + L M hstable).field = M.field := + rfl + +end Conjugation + +section MaximalAbelianIntermediate + +variable [IsTopologicalGroup G] + +/-- The intermediate field fixed by the commutator of a finite Galois +extension, bundled as the actual maximal finite abelian subextension. -/ +def maximalAbelianSubextension + (P : FiniteGaloisSubextension K) : + FiniteAbelianSubextension K := + FiniteGaloisSubextension.intermediateFiniteAbelianOfCommutatorLe + P (commutator P.extensionQuotient) le_rfl + +@[simp] +theorem maximalAbelianSubextension_field + (P : FiniteGaloisSubextension K) : + (maximalAbelianSubextension P).field = + P.abelianIntermediateField := + FiniteGaloisSubextension.intermediateFiniteAbelianOfCommutatorLe_field + P (commutator P.extensionQuotient) le_rfl + +/-- Every finite abelian intermediate extension of a finite Galois +extension is contained in the commutator-fixed intermediate field. + +In subgroup order the displayed inclusion is reversed: the subgroup +representing the maximal abelian intermediate field lies inside the +subgroup representing the given abelian intermediate field. -/ +theorem abelianIntermediateField_le_of_finiteAbelianIntermediate + (P : FiniteGaloisSubextension K) + (L : FiniteAbelianSubextension K) + (hPL : P.field.toSubgroup ≤ L.field.toSubgroup) : + P.abelianIntermediateField.toSubgroup ≤ + L.field.toSubgroup := by + let : + (CyclicCohomology.extensionSubgroup K P.field P.below).Normal := + P.normal + let : + (CyclicCohomology.extensionSubgroup K L.field L.below).Normal := + L.normal + let restriction : + P.extensionQuotient →* L.extensionQuotient := + abstractReciprocityRestriction + K L.field P.field hPL L.below + intro x hx + change + x ∈ + P.intermediateField + (commutator P.extensionQuotient) at hx + rcases hx with ⟨k, hk, rfl⟩ + have hkcomm : + P.extensionQuotientMk k ∈ + commutator P.extensionQuotient := + (P.mem_intermediateSubgroup_iff + (commutator P.extensionQuotient) k).1 hk + have hrestriction : + restriction (P.extensionQuotientMk k) = 1 := + Abelianization.commutator_subset_ker restriction hkcomm + change + (QuotientGroup.mk k : + K.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup K L.field L.below) = 1 + at hrestriction + exact + (mem_extensionSubgroup_iff K L.field L.below k).1 + ((QuotientGroup.eq_one_iff k).1 hrestriction) + +/-- In field order, every finite abelian intermediate extension lies below +the maximal abelian subextension cut out by the commutator. -/ +theorem finiteAbelianIntermediate_le_maximalAbelianSubextension + (P : FiniteGaloisSubextension K) + (L : FiniteAbelianSubextension K) + (hPL : P.field.toSubgroup ≤ L.field.toSubgroup) : + L ≤ maximalAbelianSubextension P := by + change (maximalAbelianSubextension P).field.toSubgroup ≤ L.field.toSubgroup + rw [maximalAbelianSubextension_field] + exact abelianIntermediateField_le_of_finiteAbelianIntermediate P L hPL + +end MaximalAbelianIntermediate + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean new file mode 100644 index 0000000000..fb2371d96b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean @@ -0,0 +1,679 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.AbstractCapitulation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFixedFieldBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FieldSpine +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Representatives +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Compatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Quotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.MembershipTypes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.ZeroTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FiniteNormClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerUnramified +/-! +# Transfer input for the principal ideal theorem + +At the generic level, the Galois correspondence realizes a subgroup +`S ≤ Gal(M / K)` as an intermediate field, while the transfer construction +independently realizes `Gal(M / M^S)` inside `Gal(M / K)`. Identifying these +subgroups puts the commutator transfer in the form covered by Witt's theorem. +This generic input assumes neither a class-field realization nor a +norm-subgroup equality. + +The theorems below specialize that input to the selected actual two-stage +small Hilbert tower and transport it to genuine idèle-class extension and +norm maps. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open ClassFormation +open GlobalClassFields +open KummerTheory +open LocalClassFieldTheory +open Reciprocity + +variable (K : Type) [Field K] [NumberField K] + +open scoped Classical in +local instance + principalIdealTransferIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] principalIdealTransferIdeleClassGroupIsMulCommutative + +open scoped Classical in +local instance + principalIdealTransferIdeleClassSubgroupNormal + {F : Type} [Field F] [NumberField F] + (N : Subgroup (IdeleClassGroup F)) : N.Normal := + N.normal_of_isMulCommutative + +attribute [local instance] principalIdealTransferIdeleClassSubgroupNormal + +open scoped Classical in +/-- Extension-range containment descends along the lower leg of a finite +Galois tower. -/ +private theorem ideleClassExtension_range_le_of_intermediate + (F E U : Type) + [Field F] [NumberField F] + [Field E] [NumberField E] + [Field U] [NumberField U] + [Algebra F U] [FiniteDimensional F U] [IsGalois F U] + [Algebra F E] [Algebra E U] [IsScalarTower F E U] + [FiniteDimensional F E] [FiniteDimensional E U] + [IsGalois F E] [IsGalois E U] + (N : Subgroup (IdeleClassGroup U)) + (hcontainment : (ideleClassExtension E U).range ≤ N) : + (ideleClassExtension F U).range ≤ N := by + rintro _ ⟨c, rfl⟩ + have hcomp : + ideleClassExtension E U (ideleClassExtension F E c) = + ideleClassExtension F U c := by + simpa only [MonoidHom.comp_apply] using + DFunLike.congr_fun (ideleClassExtension_comp F U E) c + rw [← hcomp] + exact hcontainment ⟨ideleClassExtension F E c, rfl⟩ + +open scoped Classical in +/-- Internal bridge from the opaque rational transfer endpoint to the +explicit relative norm range used by the selected tower. -/ +private theorem + rationalFiniteNormTransferCanonicalMembership_to_explicitNormMembership + (K H L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hHK : H.toSubgroup ≤ K.toSubgroup) + (hLH : L.toSubgroup ≤ H.toSubgroup) + (hHKnormal : (CyclicCohomology.extensionSubgroup K H hHK).Normal) + (hLHnormal : (CyclicCohomology.extensionSubgroup H L hLH).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hKHfinite : Finite + (K.toSubgroup ⧸ CyclicCohomology.extensionSubgroup K H hHK)] + [hHfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + H (le_baseField H))] + [hHLfinite : Finite + (H.toSubgroup ⧸ CyclicCohomology.extensionSubgroup H L hLH)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) + (hmembership : + rationalFiniteNormTransferCanonicalOrdinaryExtensionNormMembership + K H L hHK hLH hHKnormal hLHnormal c) : + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hHK + let U := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLH + letI : FiniteDimensional ℚ F := + RationalFiniteNormTransferInternal.fixedFiniteDimensional + (hKfinite := hKfinite) K + letI : FiniteDimensional F E := + RationalFiniteNormTransferInternal.relativeFiniteDimensional + (hKfinite := hKfinite) (hfinite := hKHfinite) + K H hHK + letI : IsScalarTower ℚ F E := + RationalFiniteNormTransferInternal.relativeScalarTower K H hHK + letI : FiniteDimensional ℚ E := + RationalFiniteNormTransferInternal.relativeAbsoluteFiniteDimensional + (hKfinite := hKfinite) (hfinite := hKHfinite) + K H hHK + letI : NumberField F := + RationalFiniteNormTransferInternal.fixedNumberField + (hKfinite := hKfinite) K + letI : NumberField E := + RationalFiniteNormTransferInternal.relativeNumberField + (hKfinite := hKfinite) (hfinite := hKHfinite) + K H hHK + letI : FiniteDimensional ℚ U := + RationalFiniteNormTransferInternal.relativeAbsoluteFiniteDimensional + (hKfinite := hHfinite) (hfinite := hHLfinite) + H L hLH + letI : NumberField U := + RationalFiniteNormTransferInternal.relativeNumberField + (hKfinite := hHfinite) (hfinite := hHLfinite) + H L hLH + letI : Algebra E U := by + change Algebra + (abstractFixedField ℚ (SeparableClosure ℚ) H) U + exact U.algebra + letI : Module E U := by + change Module + (abstractFixedField ℚ (SeparableClosure ℚ) H) U + exact + (U.algebra : Algebra + (abstractFixedField ℚ (SeparableClosure ℚ) H) U).toModule + letI : FiniteDimensional E U := by + change FiniteDimensional + (abstractFixedField ℚ (SeparableClosure ℚ) H) U + exact RationalFiniteNormTransferInternal.relativeFiniteDimensional + (hKfinite := hHfinite) (hfinite := hHLfinite) + H L hLH + letI : IsScalarTower ℚ E U := by + change IsScalarTower ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) H) U + exact RationalFiniteNormTransferInternal.relativeScalarTower H L hLH + letI : IsGalois F E := + RationalFiniteNormTransferInternal.relativeIsGalois + K H hHK hHKnormal + letI : IsGalois E U := by + change IsGalois + (abstractFixedField ℚ (SeparableClosure ℚ) H) U + exact RationalFiniteNormTransferInternal.relativeIsGalois + H L hLH hLHnormal + ideleClassExtension F E c ∈ (_root_.ideleClassNorm E U).range := by + dsimp only + unfold + rationalFiniteNormTransferCanonicalOrdinaryExtensionNormMembership + at hmembership + unfold rationalFiniteNormTransferRelativeNormMembership at hmembership + unfold + rationalFiniteNormTransferOrdinaryExtensionRepresentative + at hmembership + exact hmembership + +open scoped Classical in +/-- The commutator transfer supplies the canonical zero class used by the +rational finite-norm bridge. -/ +private theorem + rationalFiniteNormTransferCanonicalFiniteNormClassZero_of_commutator + (K₀ : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (M : FiniteGaloisSubextension K₀.field) + (H T : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hTH : T.toSubgroup ≤ H.toSubgroup) + (hHK : H.toSubgroup ≤ K₀.field.toSubgroup) + (hmiddle : M.intermediateField (commutator M.extensionQuotient) = H) + (htop : M.field = T) + [hHTfinite : Finite + (H.toSubgroup ⧸ CyclicCohomology.extensionSubgroup H T hTH)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := K₀.finite) K₀.field) : + rationalFiniteNormTransferCanonicalFiniteNormClassZero + (hKfinite := K₀.finite) (hHLfinite := hHTfinite) + K₀.field H T hHK hTH c := by + let S := commutator M.extensionQuotient + let : Finite + (K₀.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup K₀.field M.field M.below) := + M.finite + let : Finite + ((M.intermediateField S).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (M.intermediateField S) M.field + (M.field_le_intermediateField S)) := + M.extension_over_intermediate_finite S + let a : + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K₀.field := + rationalAbstractFixedFieldIdeleClassEquivFixed K₀.field + (Additive.ofMul c) + have hzeroMap : + M.intermediateNormQuotientInclusion + rationalIdeleClassRepresentation S = + 0 := + intermediateNormQuotientInclusion_commutator_eq_zero + rationalCyclotomicDegreeData rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + K₀ M + have hzero : + M.intermediateNormQuotientInclusion + rationalIdeleClassRepresentation S + (finiteNormClass rationalIdeleClassRepresentation + K₀.field M.field M.below a) = + 0 := by + rw [hzeroMap] + rfl + have hincludeRaw := + ClassFormation.FiniteGaloisSubextension.intermediateNormQuotientInclusion_finiteNormClass + rationalIdeleClassRepresentation M S a + have transportInclude + (J V : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hJ : M.intermediateField S = J) + (hV : M.field = V) + (hVJ : V.toSubgroup ≤ J.toSubgroup) + (hJK : J.toSubgroup ≤ K₀.field.toSubgroup) + [Finite + (J.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup J V hVJ)] : + (0 : FiniteNormQuotient rationalIdeleClassRepresentation + J V hVJ) = + finiteNormClass rationalIdeleClassRepresentation + J V hVJ + (fixedFieldInclusion rationalIdeleClassRepresentation + K₀.field J hJK a) := by + subst J + subst V + exact hzero.symm.trans hincludeRaw + unfold rationalFiniteNormTransferCanonicalFiniteNormClassZero + simpa only [a, S] using + (transportInclude H T hmiddle htop hTH hHK) + +open scoped Classical in +/-- The selected two-stage tower supplies a canonical zero finite-norm class +for every idele class over its base fixed field. -/ +@[irreducible] +private noncomputable def + smallHilbertClassFieldCanonicalFiniteNormClassZeroStatement : Prop := + let K₀ := + numberFieldTowerFiniteAbstractField K + (smallHilbertClassFieldNormAmbient K) + let L := smallHilbertClassFieldSubextension K + let N := smallHilbertTowerSecondSubextension K + let H := L.field + let hMH : N.field.toSubgroup ≤ H.toSubgroup := N.below + let hHK : H.toSubgroup ≤ K₀.field.toSubgroup := L.below + letI hHMfinite : Finite + (H.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H N.field hMH) := + N.finite + ∀ c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := K₀.finite) K₀.field, + rationalFiniteNormTransferCanonicalFiniteNormClassZero + (hKfinite := K₀.finite) (hHLfinite := hHMfinite) + K₀.field H N.field hHK hMH c + +open scoped Classical in +private theorem + smallHilbertClassFieldCanonicalFiniteNormClassZeroStatement_proof : + smallHilbertClassFieldCanonicalFiniteNormClassZeroStatement K := by + unfold smallHilbertClassFieldCanonicalFiniteNormClassZeroStatement + dsimp only + intro c + let K₀ := + numberFieldTowerFiniteAbstractField K + (smallHilbertClassFieldNormAmbient K) + let L := smallHilbertClassFieldSubextension K + let N := smallHilbertTowerSecondSubextension K + let M := smallHilbertTowerGaloisRealization K + let H := L.field + have hmiddle : + M.intermediateField (commutator M.extensionQuotient) = H := by + change M.abelianIntermediateField = L.field + have h := + congrArg + (fun A : FiniteAbelianSubextension K₀.field => A.field) + (smallHilbertTower_maximalAbelianSubextension_eq_firstStage K) + simpa only [M, L, maximalAbelianSubextension_field] using h + have htop : M.field = N.field := by + rfl + let hMH : N.field.toSubgroup ≤ H.toSubgroup := N.below + let hHK : H.toSubgroup ≤ K₀.field.toSubgroup := L.below + let hHMfinite : Finite + (H.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H N.field hMH) := + N.finite + change + rationalFiniteNormTransferCanonicalFiniteNormClassZero + (hKfinite := K₀.finite) (hHLfinite := hHMfinite) + K₀.field H N.field hHK hMH c + exact + rationalFiniteNormTransferCanonicalFiniteNormClassZero_of_commutator + (hHTfinite := hHMfinite) + K₀ M H N.field hMH hHK hmiddle htop c + +open scoped Classical in +/-- The canonical zero classes of the selected tower satisfy the opaque +rational relative norm-membership endpoint. -/ +@[irreducible] +private noncomputable def + smallHilbertClassFieldCanonicalNormMembershipStatement : Prop := + let K₀ := + numberFieldTowerFiniteAbstractField K + (smallHilbertClassFieldNormAmbient K) + let L := smallHilbertClassFieldSubextension K + let N := smallHilbertTowerSecondSubextension K + let H := L.field + let hMH : N.field.toSubgroup ≤ H.toSubgroup := N.below + let hHK : H.toSubgroup ≤ K₀.field.toSubgroup := L.below + let hHKnormal : + (CyclicCohomology.extensionSubgroup K₀.field H hHK).Normal := + L.normal + let hMHnormal : + (CyclicCohomology.extensionSubgroup H N.field hMH).Normal := + N.normal + letI hKHfinite : Finite + (K₀.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup K₀.field H hHK) := + L.finite + letI hHMfinite : Finite + (H.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H N.field hMH) := + N.finite + ∀ c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := K₀.finite) K₀.field, + rationalFiniteNormTransferCanonicalOrdinaryExtensionNormMembership + (hKfinite := K₀.finite) (hKHfinite := hKHfinite) + (hHLfinite := hHMfinite) + K₀.field H N.field hHK hMH hHKnormal hMHnormal c + +open scoped Classical in +private theorem + smallHilbertClassFieldCanonicalNormMembershipStatement_proof : + smallHilbertClassFieldCanonicalNormMembershipStatement K := by + unfold smallHilbertClassFieldCanonicalNormMembershipStatement + dsimp only + intro c + let K₀ := + numberFieldTowerFiniteAbstractField K + (smallHilbertClassFieldNormAmbient K) + let L := smallHilbertClassFieldSubextension K + let N := smallHilbertTowerSecondSubextension K + let H := L.field + let hMH : N.field.toSubgroup ≤ H.toSubgroup := N.below + let hHK : H.toSubgroup ≤ K₀.field.toSubgroup := L.below + let hHKnormal : + (CyclicCohomology.extensionSubgroup K₀.field H hHK).Normal := + L.normal + let hMHnormal : + (CyclicCohomology.extensionSubgroup H N.field hMH).Normal := + N.normal + let hKHfinite : Finite + (K₀.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup K₀.field H hHK) := + L.finite + let hHMfinite : Finite + (H.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H N.field hMH) := + N.finite + have hincludeAll := + smallHilbertClassFieldCanonicalFiniteNormClassZeroStatement_proof K + unfold + smallHilbertClassFieldCanonicalFiniteNormClassZeroStatement + at hincludeAll + have hincludeCanonical : + rationalFiniteNormTransferCanonicalFiniteNormClassZero + (hKfinite := K₀.finite) (hHLfinite := hHMfinite) + K₀.field H N.field hHK hMH c := by + exact hincludeAll c + change + rationalFiniteNormTransferCanonicalOrdinaryExtensionNormMembership + (hKfinite := K₀.finite) (hKHfinite := hKHfinite) + (hHLfinite := hHMfinite) + K₀.field H N.field hHK hMH hHKnormal hMHnormal c + exact + rationalFiniteNormTransferCanonicalFiniteNormClassZero_implies_normMembership + (hKfinite := K₀.finite) (hKHfinite := hKHfinite) + (hHLfinite := hHMfinite) + K₀.field H N.field hHK hMH hHKnormal hMHnormal + c hincludeCanonical + +open scoped Classical in +/-- The selected rational transfer endpoint, exposed on the explicit +relative fixed-field spine used by the tower containment. -/ +private noncomputable abbrev + smallHilbertClassFieldExplicitNormMembershipStatement : Prop := + let K₀ := + numberFieldTowerFiniteAbstractField K + (smallHilbertClassFieldNormAmbient K) + let L := smallHilbertClassFieldSubextension K + let N := smallHilbertTowerSecondSubextension K + let H := L.field + let hMH : N.field.toSubgroup ≤ H.toSubgroup := N.below + let hHK : H.toSubgroup ≤ K₀.field.toSubgroup := L.below + let hHKnormal : + (CyclicCohomology.extensionSubgroup K₀.field H hHK).Normal := + L.normal + let hMHnormal : + (CyclicCohomology.extensionSubgroup H N.field hMH).Normal := + N.normal + letI hKHfinite : Finite + (K₀.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup K₀.field H hHK) := + L.finite + letI hHMfinite : Finite + (H.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H N.field hMH) := + N.finite + letI hHfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + H (le_baseField H)) := + FiniteGaloisSubextension.finite_extension_trans + hHK (le_baseField K₀.field) + let F := abstractFixedField ℚ (SeparableClosure ℚ) K₀.field + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hHK + let U := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hMH + letI : FiniteDimensional ℚ F := + RationalFiniteNormTransferInternal.fixedFiniteDimensional + (hKfinite := K₀.finite) K₀.field + letI : FiniteDimensional F E := + RationalFiniteNormTransferInternal.relativeFiniteDimensional + (hKfinite := K₀.finite) (hfinite := hKHfinite) + K₀.field H hHK + letI : IsScalarTower ℚ F E := + RationalFiniteNormTransferInternal.relativeScalarTower K₀.field H hHK + letI : FiniteDimensional ℚ E := + RationalFiniteNormTransferInternal.relativeAbsoluteFiniteDimensional + (hKfinite := K₀.finite) (hfinite := hKHfinite) + K₀.field H hHK + letI : NumberField F := + RationalFiniteNormTransferInternal.fixedNumberField + (hKfinite := K₀.finite) K₀.field + letI : NumberField E := + RationalFiniteNormTransferInternal.relativeNumberField + (hKfinite := K₀.finite) (hfinite := hKHfinite) + K₀.field H hHK + letI : FiniteDimensional ℚ U := + RationalFiniteNormTransferInternal.relativeAbsoluteFiniteDimensional + (hKfinite := hHfinite) (hfinite := hHMfinite) + H N.field hMH + letI : NumberField U := + RationalFiniteNormTransferInternal.relativeNumberField + (hKfinite := hHfinite) (hfinite := hHMfinite) + H N.field hMH + letI : Algebra E U := by + change Algebra + (abstractFixedField ℚ (SeparableClosure ℚ) H) U + exact U.algebra + letI : Module E U := by + change Module + (abstractFixedField ℚ (SeparableClosure ℚ) H) U + exact + (U.algebra : Algebra + (abstractFixedField ℚ (SeparableClosure ℚ) H) U).toModule + letI : FiniteDimensional E U := by + change FiniteDimensional + (abstractFixedField ℚ (SeparableClosure ℚ) H) U + exact RationalFiniteNormTransferInternal.relativeFiniteDimensional + (hKfinite := hHfinite) (hfinite := hHMfinite) + H N.field hMH + letI : IsScalarTower ℚ E U := by + change IsScalarTower ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) H) U + exact RationalFiniteNormTransferInternal.relativeScalarTower + H N.field hMH + letI : IsGalois F E := + RationalFiniteNormTransferInternal.relativeIsGalois + K₀.field H hHK hHKnormal + letI : IsGalois E U := by + change IsGalois + (abstractFixedField ℚ (SeparableClosure ℚ) H) U + exact RationalFiniteNormTransferInternal.relativeIsGalois + H N.field hMH hMHnormal + ∀ c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := K₀.finite) K₀.field, + ideleClassExtension F E c ∈ (_root_.ideleClassNorm E U).range + +open scoped Classical in +private structure SmallHilbertClassFieldExplicitNormMembershipData + (K : Type) [Field K] [NumberField K] : Prop where + membership : smallHilbertClassFieldExplicitNormMembershipStatement K + +open scoped Classical in +/-- The canonical norm-membership statement realizes the literal two-stage fixed-field tower. -/ +private theorem smallHilbertClassFieldExplicitNormMembershipStatement_proof : + smallHilbertClassFieldExplicitNormMembershipStatement K := by + unfold smallHilbertClassFieldExplicitNormMembershipStatement + dsimp only + intro c + let K₀ := + numberFieldTowerFiniteAbstractField K + (smallHilbertClassFieldNormAmbient K) + let L := smallHilbertClassFieldSubextension K + let N := smallHilbertTowerSecondSubextension K + let H := L.field + let hMH : N.field.toSubgroup ≤ H.toSubgroup := N.below + let hHK : H.toSubgroup ≤ K₀.field.toSubgroup := L.below + let hHKnormal : + (CyclicCohomology.extensionSubgroup K₀.field H hHK).Normal := + L.normal + let hMHnormal : + (CyclicCohomology.extensionSubgroup H N.field hMH).Normal := + N.normal + let hKHfinite : Finite + (K₀.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup K₀.field H hHK) := + L.finite + let hHMfinite : Finite + (H.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H N.field hMH) := + N.finite + let hHfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + H (le_baseField H)) := + FiniteGaloisSubextension.finite_extension_trans + hHK (le_baseField K₀.field) + have hmembershipAll := + smallHilbertClassFieldCanonicalNormMembershipStatement_proof K + unfold + smallHilbertClassFieldCanonicalNormMembershipStatement + at hmembershipAll + have hmembership : + rationalFiniteNormTransferCanonicalOrdinaryExtensionNormMembership + (hKfinite := K₀.finite) (hKHfinite := hKHfinite) + (hHLfinite := hHMfinite) + K₀.field H N.field hHK hMH hHKnormal hMHnormal c := + hmembershipAll c + exact + rationalFiniteNormTransferCanonicalMembership_to_explicitNormMembership + (hKfinite := K₀.finite) (hKHfinite := hKHfinite) + (hHfinite := hHfinite) (hHLfinite := hHMfinite) + K₀.field H N.field hHK hMH hHKnormal hMHnormal c hmembership + +open scoped Classical in +private theorem + smallHilbertClassFieldExplicitNormMembershipData_proof : + SmallHilbertClassFieldExplicitNormMembershipData K where + membership := smallHilbertClassFieldExplicitNormMembershipStatement_proof K + +open scoped Classical in +/-- The named proposition underlying the fixed-field-base form of the +two-stage transfer containment. Keeping the dependent idele maps behind one +opaque boundary prevents every consumer from reconstructing their instance +towers while elaborating a theorem signature. -/ +@[irreducible] +noncomputable def smallHilbertClassFieldBaseSecondNormRangeContainment : Prop := + (ideleClassExtension + (smallHilbertClassFieldBase K) + (smallHilbertClassField K)).range ≤ + smallHilbertClassFieldNormSubgroup + (K := smallHilbertClassField K) + +open scoped Classical in +/-- Witt transfer for the genuine selected two-stage tower: every +idele class extended from the selected base fixed field to the first +small Hilbert class field is a norm from the actual second stage. -/ +theorem + smallHilbertClassFieldBase_ideleClassExtension_range_le_secondNormRange : + smallHilbertClassFieldBaseSecondNormRangeContainment K := by + unfold smallHilbertClassFieldBaseSecondNormRangeContainment + change + (ideleClassExtension + (smallHilbertClassFieldBase K) + (smallHilbertClassField K)).range ≤ + smallHilbertClassFieldNormSubgroup + (K := smallHilbertClassField K) + have hrawMembershipAll := + (smallHilbertClassFieldExplicitNormMembershipData_proof K).membership + unfold + smallHilbertClassFieldExplicitNormMembershipStatement + at hrawMembershipAll + rintro _ ⟨c, rfl⟩ + exact + Eq.mp + (congrArg + (fun A : Subgroup (IdeleClassGroup (smallHilbertClassField K)) => + ideleClassExtension + (smallHilbertClassFieldBase K) + (smallHilbertClassField K) c ∈ A) + (smallHilbertTowerSecondStage_ideleClassNorm_range K)) + (hrawMembershipAll c) + +open scoped Classical in +/-- The named proposition underlying the original-base form of the two-stage +transfer containment. -/ +@[irreducible] +noncomputable def smallHilbertClassFieldSecondNormRangeContainment : Prop := + (ideleClassExtension K (smallHilbertClassField K)).range ≤ + smallHilbertClassFieldNormSubgroup + (K := smallHilbertClassField K) + +open scoped Classical in +private structure SmallHilbertClassFieldSecondNormRangeContainmentData + (K : Type) [Field K] [NumberField K] : Prop where + containment : smallHilbertClassFieldSecondNormRangeContainment K + +open scoped Classical in +private theorem + smallHilbertClassFieldSecondNormRangeContainmentData_proof : + SmallHilbertClassFieldSecondNormRangeContainmentData K where + containment := by + unfold smallHilbertClassFieldSecondNormRangeContainment + let : IsGalois K (smallHilbertClassFieldBase K) := + IsGalois.of_algEquiv + (smallHilbertClassFieldBaseEquivOverOriginal K) + have hbase := + smallHilbertClassFieldBase_ideleClassExtension_range_le_secondNormRange K + unfold smallHilbertClassFieldBaseSecondNormRangeContainment at hbase + exact + ideleClassExtension_range_le_of_intermediate + K (smallHilbertClassFieldBase K) (smallHilbertClassField K) + (smallHilbertClassFieldNormSubgroup + (K := smallHilbertClassField K)) hbase + +open scoped Classical in +/-- Every idele class extended from the original number field to its +selected small Hilbert class field is a norm from the actual second +stage. This is the original-base form of the middle vertical arrow in +the principal-ideal-theorem diagram. -/ +theorem + smallHilbertClassField_ideleClassExtension_range_le_secondNormRange : + smallHilbertClassFieldSecondNormRangeContainment K := + (smallHilbertClassFieldSecondNormRangeContainmentData_proof K).containment + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalAbstractExtensionToOrdinary.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalAbstractExtensionToOrdinary.lean new file mode 100644 index 0000000000..98c5975482 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalAbstractExtensionToOrdinary.lean @@ -0,0 +1,169 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.AbstractCapitulation +/-! +# Rational abstract extension transport to ordinary idele classes + +Compatibility of abstract extension with ordinary idele classes. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open ClassFormation +open CyclicCohomology + +section RationalIdeleExtension + +open Reciprocity +open LocalClassFieldTheory + +/-- The abstract extension representation, followed by the actual +relative-to-ordinary comparison over the intermediate fixed field, is +the direct ordinary idele class represented by its upper fixed part. -/ +theorem rationalAbstractExtensionIdeleClassEquiv_to_ordinary + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (x : (extensionFixedRepresentation + rationalIdeleClassRepresentation + K L hLK hnormal).V) : + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI := hnormal + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + letI : FiniteDimensional ℚ (E.restrictScalars ℚ) := by + change FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) L) + change FiniteDimensional ℚ E + infer_instance + letI : NumberField F := + NumberField.of_module_finite ℚ F + letI : NumberField E := + NumberField.of_module_finite ℚ E + (MulEquiv.toAdditive + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := E))) + (rationalAbstractExtensionIdeleClassEquiv + K L hLK hnormal x) = + (rationalAbstractRelativeFixedFieldIdeleClassEquivFixedOfFiniteDimensional + K L hLK).symm + (extensionFixedRepresentationEquiv + rationalIdeleClassRepresentation + K L hLK hnormal x) := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + let := hnormal + let : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + let : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + let : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + let : FiniteDimensional ℚ (E.restrictScalars ℚ) := by + change FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) L) + change FiniteDimensional ℚ E + infer_instance + let : NumberField F := + NumberField.of_module_finite ℚ F + let : NumberField E := + NumberField.of_module_finite ℚ E + let eAmbient := + extensionFixedRepresentationEquiv + rationalIdeleClassRepresentation K L hLK hnormal + let eFixed : + Additive (IdeleClassGroup E) ≃+ + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation L := + rationalAbstractRelativeFixedFieldIdeleClassEquivFixedOfFiniteDimensional + K L hLK + let eRelative : + Additive (RelativeIdeleGroup.ClassGroup ℚ E) ≃+ + Additive (IdeleClassGroup E) := + MulEquiv.toAdditive + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E)) + let eTower : + Additive (RelativeIdeleGroup.ClassGroup ℚ E) ≃+ + Additive (RelativeIdeleGroup.ClassGroup F E) := + (MulEquiv.toAdditive + (TowerRelativeIdeleGroup.classGroupEquiv + ℚ F E).symm).trans + (MulEquiv.toAdditive + (towerRelativeIdeleClassBaseChangeMulEquiv + ℚ F E)) + let c : + Additive (RelativeIdeleGroup.ClassGroup ℚ E) := + eRelative.symm (eFixed.symm (eAmbient x)) + have htransport : + (MulEquiv.toAdditive + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := E))) (eTower c) = + eRelative c := by + change + Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := E) + (towerRelativeIdeleClassBaseChangeMulEquiv ℚ F E + ((TowerRelativeIdeleGroup.classGroupEquiv + ℚ F E).symm (Additive.toMul c)))) = + Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) (Additive.toMul c)) + exact + congrArg Additive.ofMul + (relativeIdeleClassBaseChangeMulEquiv_tower + ℚ F E (Additive.toMul c)) + change + (MulEquiv.toAdditive + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := E))) + (eTower + (eRelative.symm + (eFixed.symm (eAmbient x)))) = + eFixed.symm (eAmbient x) + calc + _ = eRelative c := htransport + _ = eFixed.symm (eAmbient x) := by + exact eRelative.apply_symm_apply + (eFixed.symm (eAmbient x)) + +end RationalIdeleExtension + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer.lean new file mode 100644 index 0000000000..776909f694 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer.lean @@ -0,0 +1,19 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Compatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FieldSpine +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FiniteNormClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.MembershipTypes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Quotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Representatives +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.ZeroTransport + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/All.lean new file mode 100644 index 0000000000..a6bb2a008b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/All.lean @@ -0,0 +1,23 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Compatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FieldSpine +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FiniteNormClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.MembershipTypes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Quotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Representatives +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.ZeroTransport +/-! +# Rational finite-norm transport + +This compatibility facade exports the fixed-field instance spine and the +independently compiled representative, quotient, compatibility, membership, +zero-transport, and final finite-norm-class leaves. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Compatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Compatibility.lean new file mode 100644 index 0000000000..0adaaf4afd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Compatibility.lean @@ -0,0 +1,285 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Representatives +/-! +# Compatibility of rational finite-norm representatives + +This compiled leaf preserves the original public declarations while reusing +the shared fixed-field instance providers. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open ClassFormation +open CyclicCohomology + +section RationalIdeleExtension + +open Reciprocity +open LocalClassFieldTheory + +local instance + compatibilityIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + RationalFiniteNormTransferInternal.ideleClassGroupIsMulCommutative + +local instance + compatibilityIdeleClassSubgroupNormal + {F : Type} [Field F] [NumberField F] + (N : Subgroup (IdeleClassGroup F)) : N.Normal := + RationalFiniteNormTransferInternal.ideleClassSubgroupNormal N + +/-- Named base-change comparison for the canonical ordinary input. -/ +noncomputable def + rationalFiniteNormTransferCanonicalBaseChangeCompatibility + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) : Prop := + rationalFiniteNormTransferCanonicalAbstractExtensionEndpoint + K L hLK hnormal c = + Additive.ofMul + (rationalFiniteNormTransferOrdinaryExtensionRepresentative + K L hLK hnormal c) + +/-- Named relative-to-ordinary comparison for the same canonical input. -/ +noncomputable def + rationalFiniteNormTransferCanonicalToOrdinaryCompatibility + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) : Prop := + rationalFiniteNormTransferCanonicalAbstractExtensionEndpoint + K L hLK hnormal c = + Additive.ofMul + (rationalFiniteNormTransferCanonicalFixedRepresentative + K L hLK c) + +/-- The canonical abstract endpoint is ordinary idele-class extension. -/ +theorem rationalFiniteNormTransferCanonicalBaseChangeCompatibility_proof + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) : + rationalFiniteNormTransferCanonicalBaseChangeCompatibility + K L hLK hnormal c := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + obtain ⟨relativeClass, rfl⟩ := + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F)).surjective c + change + rationalFiniteNormTransferCanonicalAbstractExtensionEndpoint + K L hLK hnormal + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) relativeClass) = + Additive.ofMul + (rationalFiniteNormTransferOrdinaryExtensionRepresentative + K L hLK hnormal + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) relativeClass)) + simpa only [rationalFiniteNormTransferCanonicalAbstractExtensionEndpoint, + rationalFiniteNormTransferOrdinaryExtensionRepresentative] using + (rationalFixedFieldInclusion_baseChange_eq_ideleClassExtension + K L hLK hnormal relativeClass) + +/-- The same abstract endpoint is represented by the canonical fixed-field +idele class. -/ +theorem rationalFiniteNormTransferCanonicalToOrdinaryCompatibility_proof + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) : + rationalFiniteNormTransferCanonicalToOrdinaryCompatibility + K L hLK hnormal c := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + let : FiniteDimensional ℚ F := + RationalFiniteNormTransferInternal.fixedFiniteDimensional K + let : FiniteDimensional F E := + RationalFiniteNormTransferInternal.relativeFiniteDimensional + K L hLK + let : IsScalarTower ℚ F E := + RationalFiniteNormTransferInternal.relativeScalarTower + K L hLK + let : FiniteDimensional ℚ E := + RationalFiniteNormTransferInternal.relativeAbsoluteFiniteDimensional + K L hLK + let : FiniteDimensional ℚ (E.restrictScalars ℚ) := by + change FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) L) + change FiniteDimensional ℚ E + infer_instance + let : NumberField F := + RationalFiniteNormTransferInternal.fixedNumberField K + let : NumberField E := + RationalFiniteNormTransferInternal.relativeNumberField + K L hLK + let : IsGalois F E := + RationalFiniteNormTransferInternal.relativeIsGalois + K L hLK hnormal + let eL := + rationalAbstractRelativeFixedFieldIdeleClassEquivFixedOfFiniteDimensional + K L hLK + let eAmbient := + extensionFixedRepresentationEquiv + rationalIdeleClassRepresentation K L hLK hnormal + let x : + (extensionFixedRepresentation + rationalIdeleClassRepresentation K L hLK hnormal).V := + eAmbient.symm + (fixedFieldInclusion rationalIdeleClassRepresentation K L hLK + (rationalAbstractFixedFieldIdeleClassEquivFixed K + (Additive.ofMul c))) + have hOrdinary := + rationalAbstractExtensionIdeleClassEquiv_to_ordinary + K L hLK hnormal x + have hx : + eAmbient x = + fixedFieldInclusion rationalIdeleClassRepresentation K L hLK + (rationalAbstractFixedFieldIdeleClassEquivFixed K + (Additive.ofMul c)) := + eAmbient.apply_symm_apply + (fixedFieldInclusion rationalIdeleClassRepresentation K L hLK + (rationalAbstractFixedFieldIdeleClassEquivFixed K + (Additive.ofMul c))) + change + rationalFiniteNormTransferCanonicalAbstractExtensionEndpoint + K L hLK hnormal c = + Additive.ofMul + (rationalFiniteNormTransferCanonicalFixedRepresentative + K L hLK c) + simpa only [rationalFiniteNormTransferCanonicalAbstractExtensionEndpoint, + rationalFiniteNormTransferCanonicalFixedRepresentative, + ofMul_toMul, eL, eAmbient, x] using + hOrdinary.trans (congrArg (fun z => eL.symm z) hx) + +/-- The named compatibility proposition between the canonical fixed-field +representative and ordinary idele-class extension. -/ +noncomputable def + rationalFiniteNormTransferCanonicalFixedRepresentativeExtensionCompatibility + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) : Prop := + rationalFiniteNormTransferCanonicalFixedRepresentative K L hLK c = + rationalFiniteNormTransferOrdinaryExtensionRepresentative + K L hLK hnormal c + +/-- Fixed-field inclusion gives exactly the ordinary idele-class extension of +the canonical base representative. -/ +theorem rationalFiniteNormTransferCanonicalFixedRepresentative_eq_extension + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) : + rationalFiniteNormTransferCanonicalFixedRepresentativeExtensionCompatibility + K L hLK hnormal c := by + change + rationalFiniteNormTransferCanonicalFixedRepresentative K L hLK c = + rationalFiniteNormTransferOrdinaryExtensionRepresentative + K L hLK hnormal c + have hBaseChange := + rationalFiniteNormTransferCanonicalBaseChangeCompatibility_proof + K L hLK hnormal c + have hToOrdinary := + rationalFiniteNormTransferCanonicalToOrdinaryCompatibility_proof + K L hLK hnormal c + change + rationalFiniteNormTransferCanonicalAbstractExtensionEndpoint + K L hLK hnormal c = + Additive.ofMul + (rationalFiniteNormTransferOrdinaryExtensionRepresentative + K L hLK hnormal c) at hBaseChange + change + rationalFiniteNormTransferCanonicalAbstractExtensionEndpoint + K L hLK hnormal c = + Additive.ofMul + (rationalFiniteNormTransferCanonicalFixedRepresentative + K L hLK c) at hToOrdinary + simpa only [toMul_ofMul] using + congrArg Additive.toMul (hToOrdinary.symm.trans hBaseChange) + + +end RationalIdeleExtension + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FieldSpine.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FieldSpine.lean new file mode 100644 index 0000000000..0ddb507b99 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FieldSpine.lean @@ -0,0 +1,384 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFixedFieldBaseChange +/-! +# Fixed-field instance spine for rational finite-norm transport + +This leaf names the finite-dimensional, scalar-tower, number-field, Galois, +and quotient instances reused by the rational finite-norm transport modules. +The public dependent type aliases are compiled once here. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open ClassFormation +open CyclicCohomology + +section RationalIdeleExtension + +open Reciprocity +open LocalClassFieldTheory + +namespace RationalFiniteNormTransferInternal + +/-- Shared commutativity proof for ordinary idèle class groups. -/ +theorem ideleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +local instance + fieldSpineIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ideleClassGroupIsMulCommutative + +/-- Shared normality proof for subgroups of ordinary idèle class groups. -/ +theorem ideleClassSubgroupNormal + {F : Type} [Field F] [NumberField F] + (N : Subgroup (IdeleClassGroup F)) : N.Normal := + N.normal_of_isMulCommutative + +local instance + fieldSpineIdeleClassSubgroupNormal + {F : Type} [Field F] [NumberField F] + (N : Subgroup (IdeleClassGroup F)) : N.Normal := + ideleClassSubgroupNormal N + +/-- The canonical absolute algebra structure on a rational relative fixed field. -/ +@[reducible] noncomputable def absoluteAlgebra + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) : + Algebra ℚ + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK) := + inferInstance + +theorem absoluteFinite + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + L (le_baseField L)) := by + let : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K)) := hKfinite + let : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := hfinite + exact FiniteGaloisSubextension.finite_extension_trans + hLK (le_baseField K) + + +/-- The finite-dimensional structure on a rational abstract fixed field. -/ +theorem fixedFiniteDimensional + (K : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] : + FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) K) := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + +/-- The relative finite-dimensional structure on the fixed-field extension +attached to an inclusion of closed subgroups. -/ +theorem relativeFiniteDimensional + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + FiniteDimensional + (abstractFixedField ℚ (SeparableClosure ℚ) K) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK) := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + +/-- The canonical scalar tower on a rational relative fixed field. -/ +theorem relativeScalarTower + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) : + IsScalarTower ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) K) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK) := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + +/-- Absolute finite-dimensionality of a rational relative fixed field. -/ +theorem relativeAbsoluteFiniteDimensional + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + FiniteDimensional ℚ + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK) := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + let : FiniteDimensional ℚ F := fixedFiniteDimensional K + let : FiniteDimensional F E := relativeFiniteDimensional K L hLK + let : IsScalarTower ℚ F E := relativeScalarTower K L hLK + exact FiniteDimensional.trans ℚ F E + +/-- The number-field structure on a rational abstract fixed field. -/ +theorem fixedNumberField + (K : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] : + NumberField (abstractFixedField ℚ (SeparableClosure ℚ) K) := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let : FiniteDimensional ℚ F := fixedFiniteDimensional K + exact NumberField.of_module_finite ℚ F + +/-- The number-field structure on a rational relative fixed field. -/ +theorem relativeNumberField + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + NumberField + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK) := by + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + let : FiniteDimensional ℚ E := + relativeAbsoluteFiniteDimensional K L hLK + exact NumberField.of_module_finite ℚ E + +/-- The Galois structure on a normal rational relative fixed field. -/ +theorem relativeIsGalois + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) : + IsGalois + (abstractFixedField ℚ (SeparableClosure ℚ) K) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK) := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L hLK hnormal + +end RationalFiniteNormTransferInternal + +local instance + fieldSpinePublicIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + RationalFiniteNormTransferInternal.ideleClassGroupIsMulCommutative + +local instance + fieldSpinePublicIdeleClassSubgroupNormal + {F : Type} [Field F] [NumberField F] + (N : Subgroup (IdeleClassGroup F)) : N.Normal := + RationalFiniteNormTransferInternal.ideleClassSubgroupNormal N + +/-- The fixed-field idele-class type used as the domain of rational +finite-norm transport. -/ +noncomputable abbrev rationalFiniteNormTransferBaseIdeleClass + (K : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] : Type := + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + letI : FiniteDimensional ℚ F := + RationalFiniteNormTransferInternal.fixedFiniteDimensional K + letI : NumberField F := + RationalFiniteNormTransferInternal.fixedNumberField K + IdeleClassGroup F + +/-- The additive ordinary idele-class norm quotient used as the target of +rational finite-norm transport. -/ +noncomputable abbrev rationalFiniteNormTransferQuotientTarget + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : Type := + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI := hnormal + letI : FiniteDimensional ℚ F := + RationalFiniteNormTransferInternal.fixedFiniteDimensional K + letI : FiniteDimensional F E := + RationalFiniteNormTransferInternal.relativeFiniteDimensional + K L hLK + letI : IsScalarTower ℚ F E := + RationalFiniteNormTransferInternal.relativeScalarTower + K L hLK + letI : FiniteDimensional ℚ E := + RationalFiniteNormTransferInternal.relativeAbsoluteFiniteDimensional + K L hLK + letI : NumberField F := + RationalFiniteNormTransferInternal.fixedNumberField K + letI : NumberField E := + RationalFiniteNormTransferInternal.relativeNumberField + K L hLK + letI : IsGalois F E := + RationalFiniteNormTransferInternal.relativeIsGalois + K L hLK hnormal + Additive (IdeleClassGroup F ⧸ (_root_.ideleClassNorm F E).range) + + +namespace RationalFiniteNormTransferInternal + +/-- The canonical additive zero on the named finite-norm transfer target. +Naming this instance prevents repeated typeclass reduction of the dependent +fixed-field quotient. -/ +@[reducible] noncomputable def quotientTargetZero + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + Zero (rationalFiniteNormTransferQuotientTarget + K L hLK hnormal) := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI : FiniteDimensional ℚ F := + RationalFiniteNormTransferInternal.fixedFiniteDimensional K + letI : FiniteDimensional F E := + RationalFiniteNormTransferInternal.relativeFiniteDimensional + K L hLK + letI : IsScalarTower ℚ F E := + RationalFiniteNormTransferInternal.relativeScalarTower + K L hLK + letI : FiniteDimensional ℚ E := + RationalFiniteNormTransferInternal.relativeAbsoluteFiniteDimensional + K L hLK + letI : NumberField F := + RationalFiniteNormTransferInternal.fixedNumberField K + letI : NumberField E := + RationalFiniteNormTransferInternal.relativeNumberField + K L hLK + letI : IsGalois F E := + RationalFiniteNormTransferInternal.relativeIsGalois + K L hLK hnormal + exact inferInstanceAs + (Zero (Additive + (IdeleClassGroup F ⧸ (_root_.ideleClassNorm F E).range))) + + +end RationalFiniteNormTransferInternal + +/-- The ordinary idele-class type of the upper fixed field in a rational +finite-norm transfer. -/ +noncomputable abbrev rationalFiniteNormTransferExtensionIdeleClass + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : Type := + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI : FiniteDimensional ℚ F := + RationalFiniteNormTransferInternal.fixedFiniteDimensional K + letI : FiniteDimensional F E := + RationalFiniteNormTransferInternal.relativeFiniteDimensional + K L hLK + letI : IsScalarTower ℚ F E := + RationalFiniteNormTransferInternal.relativeScalarTower + K L hLK + letI : FiniteDimensional ℚ E := + RationalFiniteNormTransferInternal.relativeAbsoluteFiniteDimensional + K L hLK + letI : NumberField F := + RationalFiniteNormTransferInternal.fixedNumberField K + letI : NumberField E := + RationalFiniteNormTransferInternal.relativeNumberField + K L hLK + IdeleClassGroup E + + +end RationalIdeleExtension + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FiniteNormClass.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FiniteNormClass.lean new file mode 100644 index 0000000000..1a2f92317e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FiniteNormClass.lean @@ -0,0 +1,116 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Representatives +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Quotient +/-! +# Finite norm-class evaluation after fixed-field inclusion + +This compiled leaf preserves the original public declarations while reusing +the shared fixed-field instance providers. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open ClassFormation +open CyclicCohomology + +section RationalIdeleExtension + +open Reciprocity +open LocalClassFieldTheory + +local instance + finiteNormClassIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + RationalFiniteNormTransferInternal.ideleClassGroupIsMulCommutative + +local instance + finiteNormClassIdeleClassSubgroupNormal + {F : Type} [Field F] [NumberField F] + (N : Subgroup (IdeleClassGroup F)) : N.Normal := + RationalFiniteNormTransferInternal.ideleClassSubgroupNormal N + +/-- Transporting a finite norm class after fixed-field inclusion is the +canonical norm-quotient class of its named abstract representative. The three +fields are supplied directly so clients that already have their finite-extension +context do not rebuild an intermediate-subgroup instance tower. -/ +theorem rationalFiniteNormTransferFiniteNormClass_eq_abstractRepresentative + (K H L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hHK : H.toSubgroup ≤ K.toSubgroup) + (hLH : L.toSubgroup ≤ H.toSubgroup) + (hLHnormal : (extensionSubgroup H L hLH).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hKHfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K H hHK)] + [hHfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + H (le_baseField H))] + [hHLfinite : Finite + (H.toSubgroup ⧸ extensionSubgroup H L hLH)] + (a : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K) : + rationalFiniteNormQuotientEquivIdeleClassNormQuotient + H L hLH hLHnormal + (finiteNormClass rationalIdeleClassRepresentation H L hLH + (fixedFieldInclusion rationalIdeleClassRepresentation + K H hHK a)) = + rationalFiniteNormTransferQuotientMap + H L hLH hLHnormal + (rationalFiniteNormTransferAbstractRepresentative + K H hHK a) := by + let q : + rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hHfinite) H → + rationalFiniteNormTransferQuotientTarget + (hKfinite := hHfinite) (hfinite := hHLfinite) + H L hLH hLHnormal := + fun c => Additive.ofMul (QuotientGroup.mk c) + let abstractRepresentative : + rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hHfinite) H := + rationalFiniteNormTransferAbstractRepresentative + (hKfinite := hKfinite) (hfinite := hKHfinite) + K H hHK a + have hclass : + rationalFiniteNormQuotientEquivIdeleClassNormQuotient + H L hLH hLHnormal + (finiteNormClass rationalIdeleClassRepresentation H L hLH + (fixedFieldInclusion rationalIdeleClassRepresentation + K H hHK a)) = + q abstractRepresentative := + rationalFiniteNormTransferFiniteNormClass_spec + (hKfinite := hHfinite) (hfinite := hHLfinite) + H L hLH hLHnormal + (fixedFieldInclusion rationalIdeleClassRepresentation + K H hHK a) + exact hclass + + +end RationalIdeleExtension + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/MembershipTypes.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/MembershipTypes.lean new file mode 100644 index 0000000000..d7a88ea679 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/MembershipTypes.lean @@ -0,0 +1,467 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Representatives +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Quotient +/-! +# Named membership endpoints for rational finite-norm transport + +This compiled leaf preserves the original public declarations while reusing +the shared fixed-field instance providers. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open ClassFormation +open CyclicCohomology + +section RationalIdeleExtension + +open Reciprocity +open LocalClassFieldTheory + +local instance + membershipTypesIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + RationalFiniteNormTransferInternal.ideleClassGroupIsMulCommutative + +local instance + membershipTypesIdeleClassSubgroupNormal + {F : Type} [Field F] [NumberField F] + (N : Subgroup (IdeleClassGroup F)) : N.Normal := + RationalFiniteNormTransferInternal.ideleClassSubgroupNormal N + +/-- Membership in the ordinary norm range on the relative `K/H/L` field +spine. The absolute `H` presentation used by the finite-norm quotient does +not occur in this public endpoint. -/ +noncomputable def rationalFiniteNormTransferRelativeNormMembership + (K H L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hHK : H.toSubgroup ≤ K.toSubgroup) + (hLH : L.toSubgroup ≤ H.toSubgroup) + (_hLHnormal : (extensionSubgroup H L hLH).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hKHfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K H hHK)] + [hHLfinite : Finite + (H.toSubgroup ⧸ extensionSubgroup H L hLH)] + (c : rationalFiniteNormTransferExtensionIdeleClass K H hHK) : Prop := + letI := RationalFiniteNormTransferInternal.absoluteFinite + K H hHK (hKfinite := hKfinite) (hfinite := hKHfinite) + let B := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hHK + let F := abstractFixedField ℚ (SeparableClosure ℚ) H + let U := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLH + letI : FiniteDimensional ℚ B := + RationalFiniteNormTransferInternal.fixedFiniteDimensional K + letI : FiniteDimensional B E := + RationalFiniteNormTransferInternal.relativeFiniteDimensional + K H hHK + letI : IsScalarTower ℚ B E := + RationalFiniteNormTransferInternal.relativeScalarTower + K H hHK + letI : FiniteDimensional ℚ E := + RationalFiniteNormTransferInternal.relativeAbsoluteFiniteDimensional + K H hHK + letI : NumberField E := + RationalFiniteNormTransferInternal.relativeNumberField + K H hHK + letI : FiniteDimensional ℚ F := + RationalFiniteNormTransferInternal.fixedFiniteDimensional H + letI : FiniteDimensional ℚ U := + RationalFiniteNormTransferInternal.relativeAbsoluteFiniteDimensional + H L hLH + letI : NumberField F := + RationalFiniteNormTransferInternal.fixedNumberField H + letI : NumberField U := + RationalFiniteNormTransferInternal.relativeNumberField + H L hLH + letI : Algebra E U := by + change Algebra F U + exact U.algebra + letI : Module E U := by + change Module F U + exact (U.algebra : Algebra F U).toModule + letI : FiniteDimensional E U := by + change FiniteDimensional F U + exact RationalFiniteNormTransferInternal.relativeFiniteDimensional + H L hLH + letI : IsScalarTower ℚ E U := by + change IsScalarTower ℚ F U + exact RationalFiniteNormTransferInternal.relativeScalarTower + H L hLH + letI : IsGalois E U := by + change IsGalois F U + exact RationalFiniteNormTransferInternal.relativeIsGalois + H L hLH _hLHnormal + c ∈ (_root_.ideleClassNorm E U).range + +/-- The named relative norm-membership endpoint for the canonical ordinary +extension representative. -/ +@[irreducible] +noncomputable def + rationalFiniteNormTransferCanonicalOrdinaryExtensionNormMembership + (K H L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hHK : H.toSubgroup ≤ K.toSubgroup) + (hLH : L.toSubgroup ≤ H.toSubgroup) + (hHKnormal : (extensionSubgroup K H hHK).Normal) + (hLHnormal : (extensionSubgroup H L hLH).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hKHfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K H hHK)] + [hHLfinite : Finite + (H.toSubgroup ⧸ extensionSubgroup H L hLH)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) : Prop := + rationalFiniteNormTransferRelativeNormMembership + K H L hHK hLH hLHnormal + (rationalFiniteNormTransferOrdinaryExtensionRepresentative + K H hHK hHKnormal c) + +/-- The absolute-`H` norm-membership endpoint used internally by the finite +norm quotient before transport to the relative `K/H` presentation. -/ +noncomputable def + rationalFiniteNormTransferCanonicalOrdinaryExtensionAbsoluteNormMembership + (K H L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hHK : H.toSubgroup ≤ K.toSubgroup) + (hLH : L.toSubgroup ≤ H.toSubgroup) + (hHKnormal : (extensionSubgroup K H hHK).Normal) + (hLHnormal : (extensionSubgroup H L hLH).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hKHfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K H hHK)] + [hHLfinite : Finite + (H.toSubgroup ⧸ extensionSubgroup H L hLH)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) : Prop := + letI := RationalFiniteNormTransferInternal.absoluteFinite + K H hHK (hKfinite := hKfinite) (hfinite := hKHfinite) + let F := abstractFixedField ℚ (SeparableClosure ℚ) H + let U := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLH + letI : FiniteDimensional ℚ F := + RationalFiniteNormTransferInternal.fixedFiniteDimensional H + letI : FiniteDimensional F U := + RationalFiniteNormTransferInternal.relativeFiniteDimensional + H L hLH + letI : IsScalarTower ℚ F U := + RationalFiniteNormTransferInternal.relativeScalarTower + H L hLH + letI : FiniteDimensional ℚ U := + RationalFiniteNormTransferInternal.relativeAbsoluteFiniteDimensional + H L hLH + letI : NumberField F := + RationalFiniteNormTransferInternal.fixedNumberField H + letI : NumberField U := + RationalFiniteNormTransferInternal.relativeNumberField + H L hLH + letI : IsGalois F U := + RationalFiniteNormTransferInternal.relativeIsGalois + H L hLH hLHnormal + rationalFiniteNormTransferOrdinaryExtensionRepresentative + K H hHK hHKnormal c ∈ + (_root_.ideleClassNorm F U).range + +/-- Absolute norm membership of the canonical representative produced by the +finite-norm-class comparison. -/ +noncomputable def + rationalFiniteNormTransferCanonicalFiniteNormRepresentativeAbsoluteNormMembership + (K H L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hHK : H.toSubgroup ≤ K.toSubgroup) + (hLH : L.toSubgroup ≤ H.toSubgroup) + (hLHnormal : (extensionSubgroup H L hLH).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hKHfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K H hHK)] + [hHLfinite : Finite + (H.toSubgroup ⧸ extensionSubgroup H L hLH)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) : Prop := + letI := RationalFiniteNormTransferInternal.absoluteFinite + K H hHK (hKfinite := hKfinite) (hfinite := hKHfinite) + let F := abstractFixedField ℚ (SeparableClosure ℚ) H + let U := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLH + letI : FiniteDimensional ℚ F := + RationalFiniteNormTransferInternal.fixedFiniteDimensional H + letI : FiniteDimensional F U := + RationalFiniteNormTransferInternal.relativeFiniteDimensional + H L hLH + letI : IsScalarTower ℚ F U := + RationalFiniteNormTransferInternal.relativeScalarTower + H L hLH + letI : FiniteDimensional ℚ U := + RationalFiniteNormTransferInternal.relativeAbsoluteFiniteDimensional + H L hLH + letI : NumberField F := + RationalFiniteNormTransferInternal.fixedNumberField H + letI : NumberField U := + RationalFiniteNormTransferInternal.relativeNumberField + H L hLH + letI : IsGalois F U := + RationalFiniteNormTransferInternal.relativeIsGalois + H L hLH hLHnormal + let b := + fixedFieldInclusion rationalIdeleClassRepresentation K H hHK + (rationalAbstractFixedFieldIdeleClassEquivFixed K + (Additive.ofMul c)) + Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed H).symm b) ∈ + (_root_.ideleClassNorm F U).range + +/-- Packaged absolute membership of the finite-norm representative. -/ +structure RationalFiniteNormTransferCanonicalFiniteNormRepresentativeMembershipData + (K H L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hHK : H.toSubgroup ≤ K.toSubgroup) + (hLH : L.toSubgroup ≤ H.toSubgroup) + (hLHnormal : (extensionSubgroup H L hLH).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hKHfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K H hHK)] + [hHLfinite : Finite + (H.toSubgroup ⧸ extensionSubgroup H L hLH)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) : Prop where + /-- The packaged finite-norm-representative membership proof. -/ + membership : + rationalFiniteNormTransferCanonicalFiniteNormRepresentativeAbsoluteNormMembership + K H L hHK hLH hLHnormal c + +/-- The finite-norm representative and zero have the same named ordinary +quotient value. -/ +noncomputable def + rationalFiniteNormTransferCanonicalFiniteNormRepresentativeQuotientZero + (K H L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hHK : H.toSubgroup ≤ K.toSubgroup) + (hLH : L.toSubgroup ≤ H.toSubgroup) + (hLHnormal : (extensionSubgroup H L hLH).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hKHfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K H hHK)] + [hHLfinite : Finite + (H.toSubgroup ⧸ extensionSubgroup H L hLH)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) : Prop := + letI hHfinite := RationalFiniteNormTransferInternal.absoluteFinite + K H hHK (hKfinite := hKfinite) (hfinite := hKHfinite) + let b := + fixedFieldInclusion rationalIdeleClassRepresentation K H hHK + (rationalAbstractFixedFieldIdeleClassEquivFixed K + (Additive.ofMul c)) + let finiteNormRepresentative : + rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hHfinite) H := + Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed H).symm b) + rationalFiniteNormTransferQuotientMap + (hKfinite := hHfinite) (hfinite := hHLfinite) + H L hLH hLHnormal finiteNormRepresentative = + rationalFiniteNormQuotientEquivIdeleClassNormQuotient + (hKfinite := hHfinite) (hfinite := hHLfinite) + H L hLH hLHnormal 0 + +/-- Packaged quotient-zero comparison for the finite-norm representative. -/ +structure RationalFiniteNormTransferCanonicalFiniteNormRepresentativeQuotientZeroData + (K H L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hHK : H.toSubgroup ≤ K.toSubgroup) + (hLH : L.toSubgroup ≤ H.toSubgroup) + (hLHnormal : (extensionSubgroup H L hLH).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hKHfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K H hHK)] + [hHLfinite : Finite + (H.toSubgroup ⧸ extensionSubgroup H L hLH)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) : Prop where + /-- The packaged quotient-zero equality. -/ + equality : + rationalFiniteNormTransferCanonicalFiniteNormRepresentativeQuotientZero + K H L hHK hLH hLHnormal c + +/-- The named quotient-target zero equality obtained after evaluating the +finite-norm quotient equivalence at zero. -/ +noncomputable def + rationalFiniteNormTransferCanonicalFiniteNormRepresentativeTargetZero + (K H L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hHK : H.toSubgroup ≤ K.toSubgroup) + (hLH : L.toSubgroup ≤ H.toSubgroup) + (hLHnormal : (extensionSubgroup H L hLH).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hKHfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K H hHK)] + [hHLfinite : Finite + (H.toSubgroup ⧸ extensionSubgroup H L hLH)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) : Prop := + letI hHfinite := RationalFiniteNormTransferInternal.absoluteFinite + K H hHK (hKfinite := hKfinite) (hfinite := hKHfinite) + letI : Zero + (rationalFiniteNormTransferQuotientTarget + (hKfinite := hHfinite) (hfinite := hHLfinite) + H L hLH hLHnormal) := + RationalFiniteNormTransferInternal.quotientTargetZero + (hKfinite := hHfinite) (hfinite := hHLfinite) + H L hLH hLHnormal + let b := + fixedFieldInclusion rationalIdeleClassRepresentation K H hHK + (rationalAbstractFixedFieldIdeleClassEquivFixed K + (Additive.ofMul c)) + let finiteNormRepresentative : + rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hHfinite) H := + Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed H).symm b) + rationalFiniteNormTransferQuotientMap + (hKfinite := hHfinite) (hfinite := hHLfinite) + H L hLH hLHnormal finiteNormRepresentative = 0 + +/-- Packaged quotient-target zero equality for the finite-norm +representative. -/ +structure RationalFiniteNormTransferCanonicalFiniteNormRepresentativeTargetZeroData + (K H L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hHK : H.toSubgroup ≤ K.toSubgroup) + (hLH : L.toSubgroup ≤ H.toSubgroup) + (hLHnormal : (extensionSubgroup H L hLH).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hKHfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K H hHK)] + [hHLfinite : Finite + (H.toSubgroup ⧸ extensionSubgroup H L hLH)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) : Prop where + /-- The packaged target-zero equality. -/ + equality : + rationalFiniteNormTransferCanonicalFiniteNormRepresentativeTargetZero + K H L hHK hLH hLHnormal c + +/-- Packaged absolute norm membership used to keep the provider proof's +dependent field spine out of declaration finalization. -/ +structure RationalFiniteNormTransferCanonicalAbsoluteNormMembershipData + (K H L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hHK : H.toSubgroup ≤ K.toSubgroup) + (hLH : L.toSubgroup ≤ H.toSubgroup) + (hHKnormal : (extensionSubgroup K H hHK).Normal) + (hLHnormal : (extensionSubgroup H L hLH).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hKHfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K H hHK)] + [hHLfinite : Finite + (H.toSubgroup ⧸ extensionSubgroup H L hLH)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) : Prop where + /-- The packaged absolute norm-membership proof. -/ + membership : + rationalFiniteNormTransferCanonicalOrdinaryExtensionAbsoluteNormMembership + K H L hHK hLH hHKnormal hLHnormal c + +/-- Packaged relative norm membership used as the final internal provider +boundary before exposing the canonical theorem. -/ +structure RationalFiniteNormTransferCanonicalNormMembershipData + (K H L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hHK : H.toSubgroup ≤ K.toSubgroup) + (hLH : L.toSubgroup ≤ H.toSubgroup) + (hHKnormal : (extensionSubgroup K H hHK).Normal) + (hLHnormal : (extensionSubgroup H L hLH).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hKHfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K H hHK)] + [hHLfinite : Finite + (H.toSubgroup ⧸ extensionSubgroup H L hLH)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) : Prop where + /-- The packaged relative norm-membership proof. -/ + membership : + rationalFiniteNormTransferCanonicalOrdinaryExtensionNormMembership + K H L hHK hLH hHKnormal hLHnormal c + + +end RationalIdeleExtension + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Quotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Quotient.lean new file mode 100644 index 0000000000..198e6c3a4a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Quotient.lean @@ -0,0 +1,183 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FieldSpine +/-! +# Norm quotient maps for rational finite-norm transport + +This compiled leaf preserves the original public declarations while reusing +the shared fixed-field instance providers. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open ClassFormation +open CyclicCohomology + +section RationalIdeleExtension + +open Reciprocity +open LocalClassFieldTheory + +local instance + quotientIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + RationalFiniteNormTransferInternal.ideleClassGroupIsMulCommutative + +local instance + quotientIdeleClassSubgroupNormal + {F : Type} [Field F] [NumberField F] + (N : Subgroup (IdeleClassGroup F)) : N.Normal := + RationalFiniteNormTransferInternal.ideleClassSubgroupNormal N + +/-- The canonical map from ordinary idele classes to the additive norm +quotient used by rational finite-norm transport. -/ +noncomputable def rationalFiniteNormTransferQuotientMap + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + rationalFiniteNormTransferBaseIdeleClass K → + rationalFiniteNormTransferQuotientTarget + K L hLK hnormal := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI : FiniteDimensional ℚ F := + RationalFiniteNormTransferInternal.fixedFiniteDimensional K + letI : FiniteDimensional F E := + RationalFiniteNormTransferInternal.relativeFiniteDimensional + K L hLK + letI : IsScalarTower ℚ F E := + RationalFiniteNormTransferInternal.relativeScalarTower + K L hLK + letI : FiniteDimensional ℚ E := + RationalFiniteNormTransferInternal.relativeAbsoluteFiniteDimensional + K L hLK + letI : NumberField F := + RationalFiniteNormTransferInternal.fixedNumberField K + letI : NumberField E := + RationalFiniteNormTransferInternal.relativeNumberField + K L hLK + exact fun c : IdeleClassGroup F => + Additive.ofMul (QuotientGroup.mk c) + +/-- Membership in the ordinary norm range represented by the rational +finite-norm quotient. -/ +noncomputable def rationalFiniteNormTransferNormMembership + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) : Prop := + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI : FiniteDimensional ℚ F := + RationalFiniteNormTransferInternal.fixedFiniteDimensional K + letI : FiniteDimensional F E := + RationalFiniteNormTransferInternal.relativeFiniteDimensional + K L hLK + letI : IsScalarTower ℚ F E := + RationalFiniteNormTransferInternal.relativeScalarTower + K L hLK + letI : FiniteDimensional ℚ E := + RationalFiniteNormTransferInternal.relativeAbsoluteFiniteDimensional + K L hLK + letI : NumberField F := + RationalFiniteNormTransferInternal.fixedNumberField K + letI : NumberField E := + RationalFiniteNormTransferInternal.relativeNumberField + K L hLK + letI : IsGalois F E := + RationalFiniteNormTransferInternal.relativeIsGalois + K L hLK hnormal + c ∈ (_root_.ideleClassNorm F E).range + +/-- A rational finite norm class is sent to the canonical quotient class of +its ordinary idele-class representative. -/ +theorem rationalFiniteNormTransferFiniteNormClass_spec + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (b : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K) : + rationalFiniteNormQuotientEquivIdeleClassNormQuotient + K L hLK hnormal + (finiteNormClass rationalIdeleClassRepresentation K L hLK b) = + rationalFiniteNormTransferQuotientMap + K L hLK hnormal + (Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed K).symm b)) := by + have h := + rationalFiniteNormQuotientEquivIdeleClassNormQuotient_finiteNormClass + (hKfinite := hKfinite) (hfinite := hfinite) + K L hLK hnormal b + exact h + +/-- The named zero-class input for the canonical finite-norm transfer. -/ +noncomputable def rationalFiniteNormTransferCanonicalFiniteNormClassZero + (K H L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hHK : H.toSubgroup ≤ K.toSubgroup) + (hLH : L.toSubgroup ≤ H.toSubgroup) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hHLfinite : Finite + (H.toSubgroup ⧸ extensionSubgroup H L hLH)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) : Prop := + (0 : FiniteNormQuotient rationalIdeleClassRepresentation H L hLH) = + finiteNormClass rationalIdeleClassRepresentation H L hLH + (fixedFieldInclusion rationalIdeleClassRepresentation K H hHK + (rationalAbstractFixedFieldIdeleClassEquivFixed K + (Additive.ofMul c))) + +end RationalIdeleExtension + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Representatives.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Representatives.lean new file mode 100644 index 0000000000..4f6ed79f22 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Representatives.lean @@ -0,0 +1,226 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FieldSpine +/-! +# Representatives and comparison endpoints for rational finite-norm transport + +This compiled leaf preserves the original public declarations while reusing +the shared fixed-field instance providers. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open ClassFormation +open CyclicCohomology + +section RationalIdeleExtension + +open Reciprocity +open LocalClassFieldTheory + +local instance + representativesIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + RationalFiniteNormTransferInternal.ideleClassGroupIsMulCommutative + +local instance + representativesIdeleClassSubgroupNormal + {F : Type} [Field F] [NumberField F] + (N : Subgroup (IdeleClassGroup F)) : N.Normal := + RationalFiniteNormTransferInternal.ideleClassSubgroupNormal N + +/-- The ordinary idele-class representative obtained from abstract fixed-field +inclusion. -/ +noncomputable def rationalFiniteNormTransferAbstractRepresentative + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K) := by + letI hLfinite := RationalFiniteNormTransferInternal.absoluteFinite + K L hLK (hKfinite := hKfinite) (hfinite := hfinite) + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI : Algebra ℚ E := + RationalFiniteNormTransferInternal.absoluteAlgebra K L hLK + letI : FiniteDimensional ℚ E := + RationalFiniteNormTransferInternal.fixedFiniteDimensional L + letI : NumberField E := + RationalFiniteNormTransferInternal.relativeNumberField + K L hLK + exact Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed L).symm + (fixedFieldInclusion rationalIdeleClassRepresentation + K L hLK a)) + + +/-- The canonical fixed-field representative attached to an ordinary base +idele class. -/ +noncomputable def rationalFiniteNormTransferCanonicalFixedRepresentative + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) : + rationalFiniteNormTransferExtensionIdeleClass K L hLK := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI : FiniteDimensional ℚ F := + RationalFiniteNormTransferInternal.fixedFiniteDimensional K + letI : FiniteDimensional F E := + RationalFiniteNormTransferInternal.relativeFiniteDimensional + K L hLK + letI : IsScalarTower ℚ F E := + RationalFiniteNormTransferInternal.relativeScalarTower + K L hLK + letI : FiniteDimensional ℚ E := + RationalFiniteNormTransferInternal.relativeAbsoluteFiniteDimensional + K L hLK + letI : FiniteDimensional ℚ (E.restrictScalars ℚ) := by + change FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) L) + change FiniteDimensional ℚ E + infer_instance + letI : NumberField F := + RationalFiniteNormTransferInternal.fixedNumberField K + letI : NumberField E := + RationalFiniteNormTransferInternal.relativeNumberField + K L hLK + exact Additive.toMul + ((rationalAbstractRelativeFixedFieldIdeleClassEquivFixedOfFiniteDimensional + K L hLK).symm + (fixedFieldInclusion rationalIdeleClassRepresentation K L hLK + (rationalAbstractFixedFieldIdeleClassEquivFixed K + (Additive.ofMul c)))) + +/-- The ordinary extension representative attached to the same base idele +class. -/ +noncomputable def rationalFiniteNormTransferOrdinaryExtensionRepresentative + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (_hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) : + rationalFiniteNormTransferExtensionIdeleClass K L hLK := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI : FiniteDimensional ℚ F := + RationalFiniteNormTransferInternal.fixedFiniteDimensional K + letI : FiniteDimensional F E := + RationalFiniteNormTransferInternal.relativeFiniteDimensional + K L hLK + letI : IsScalarTower ℚ F E := + RationalFiniteNormTransferInternal.relativeScalarTower + K L hLK + letI : FiniteDimensional ℚ E := + RationalFiniteNormTransferInternal.relativeAbsoluteFiniteDimensional + K L hLK + letI : NumberField F := + RationalFiniteNormTransferInternal.fixedNumberField K + letI : NumberField E := + RationalFiniteNormTransferInternal.relativeNumberField + K L hLK + letI : IsGalois F E := + RationalFiniteNormTransferInternal.relativeIsGalois + K L hLK _hnormal + exact ideleClassExtension F E c + +/-- The common additive endpoint appearing in the base-change and +relative-to-ordinary comparisons. -/ +noncomputable def rationalFiniteNormTransferCanonicalAbstractExtensionEndpoint + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (_hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) : + Additive (rationalFiniteNormTransferExtensionIdeleClass K L hLK) := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI : FiniteDimensional ℚ F := + RationalFiniteNormTransferInternal.fixedFiniteDimensional K + letI : FiniteDimensional F E := + RationalFiniteNormTransferInternal.relativeFiniteDimensional + K L hLK + letI : IsScalarTower ℚ F E := + RationalFiniteNormTransferInternal.relativeScalarTower + K L hLK + letI : FiniteDimensional ℚ E := + RationalFiniteNormTransferInternal.relativeAbsoluteFiniteDimensional + K L hLK + letI : NumberField F := + RationalFiniteNormTransferInternal.fixedNumberField K + letI : NumberField E := + RationalFiniteNormTransferInternal.relativeNumberField + K L hLK + letI : IsGalois F E := + RationalFiniteNormTransferInternal.relativeIsGalois + K L hLK _hnormal + let eK := rationalAbstractFixedFieldIdeleClassEquivFixed K + let eAmbient := + extensionFixedRepresentationEquiv + rationalIdeleClassRepresentation K L hLK _hnormal + exact + (MulEquiv.toAdditive + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := E))) + (rationalAbstractExtensionIdeleClassEquiv + K L hLK _hnormal + (eAmbient.symm + (fixedFieldInclusion rationalIdeleClassRepresentation K L hLK + (eK (Additive.ofMul c))))) + + +end RationalIdeleExtension + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/ZeroTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/ZeroTransport.lean new file mode 100644 index 0000000000..af50524f1e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/ZeroTransport.lean @@ -0,0 +1,469 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Compatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.MembershipTypes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Quotient +/-! +# Zero-class transport to norm membership + +This compiled leaf preserves the original public declarations while reusing +the shared fixed-field instance providers. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open ClassFormation +open CyclicCohomology + +section RationalIdeleExtension + +open Reciprocity +open LocalClassFieldTheory + +local instance + zeroTransportIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + RationalFiniteNormTransferInternal.ideleClassGroupIsMulCommutative + +local instance + zeroTransportIdeleClassSubgroupNormal + {F : Type} [Field F] [NumberField F] + (N : Subgroup (IdeleClassGroup F)) : N.Normal := + RationalFiniteNormTransferInternal.ideleClassSubgroupNormal N + +/-- Internal finite-norm-class-zero to quotient-zero step. -/ +private theorem + finiteNormTransferCanonicalClassZero_implies_representativeQuotientZero + (K H L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hHK : H.toSubgroup ≤ K.toSubgroup) + (hLH : L.toSubgroup ≤ H.toSubgroup) + (hLHnormal : (extensionSubgroup H L hLH).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hKHfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K H hHK)] + [hHLfinite : Finite + (H.toSubgroup ⧸ extensionSubgroup H L hLH)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) + (hincludeCanonical : + rationalFiniteNormTransferCanonicalFiniteNormClassZero + K H L hHK hLH c) : + RationalFiniteNormTransferCanonicalFiniteNormRepresentativeQuotientZeroData + K H L hHK hLH hLHnormal c := by + refine ⟨?_⟩ + let hHfinite := RationalFiniteNormTransferInternal.absoluteFinite + K H hHK (hKfinite := hKfinite) (hfinite := hKHfinite) + change + (0 : FiniteNormQuotient rationalIdeleClassRepresentation H L hLH) = + finiteNormClass rationalIdeleClassRepresentation H L hLH + (fixedFieldInclusion rationalIdeleClassRepresentation K H hHK + (rationalAbstractFixedFieldIdeleClassEquivFixed K + (Additive.ofMul c))) at hincludeCanonical + let e := + rationalFiniteNormQuotientEquivIdeleClassNormQuotient + (hKfinite := hHfinite) (hfinite := hHLfinite) + H L hLH hLHnormal + let q := + rationalFiniteNormTransferQuotientMap + (hKfinite := hHfinite) (hfinite := hHLfinite) + H L hLH hLHnormal + let b : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation H := + fixedFieldInclusion rationalIdeleClassRepresentation K H hHK + (rationalAbstractFixedFieldIdeleClassEquivFixed K + (Additive.ofMul c)) + let finiteNormRepresentative : + rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hHfinite) H := + Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed H).symm b) + change + rationalFiniteNormTransferQuotientMap + (hKfinite := hHfinite) (hfinite := hHLfinite) + H L hLH hLHnormal finiteNormRepresentative = + rationalFiniteNormQuotientEquivIdeleClassNormQuotient + (hKfinite := hHfinite) (hfinite := hHLfinite) + H L hLH hLHnormal 0 + have htransport : + e + (finiteNormClass rationalIdeleClassRepresentation H L hLH b) = + q finiteNormRepresentative := by + simpa only [e, q, b, finiteNormRepresentative] using + (rationalFiniteNormTransferFiniteNormClass_spec + (hKfinite := hHfinite) (hfinite := hHLfinite) + H L hLH hLHnormal b) + calc + q finiteNormRepresentative = + e (finiteNormClass rationalIdeleClassRepresentation H L hLH b) := + htransport.symm + _ = e 0 := by + apply congrArg e + simpa only [b] using hincludeCanonical.symm + +/-- Internal evaluation of the quotient equivalence at zero. -/ +private theorem + rationalFiniteNormTransferFiniteNormRepresentativeQuotientZero_implies_targetZero + (K H L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hHK : H.toSubgroup ≤ K.toSubgroup) + (hLH : L.toSubgroup ≤ H.toSubgroup) + (hLHnormal : (extensionSubgroup H L hLH).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hKHfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K H hHK)] + [hHLfinite : Finite + (H.toSubgroup ⧸ extensionSubgroup H L hLH)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) + (hincludeCanonical : + rationalFiniteNormTransferCanonicalFiniteNormClassZero + K H L hHK hLH c) : + RationalFiniteNormTransferCanonicalFiniteNormRepresentativeTargetZeroData + (hKfinite := hKfinite) (hKHfinite := hKHfinite) + (hHLfinite := hHLfinite) + K H L hHK hLH hLHnormal c := by + refine ⟨?_⟩ + let hHfinite := RationalFiniteNormTransferInternal.absoluteFinite + K H hHK (hKfinite := hKfinite) (hfinite := hKHfinite) + let : Zero + (rationalFiniteNormTransferQuotientTarget + (hKfinite := hHfinite) (hfinite := hHLfinite) + H L hLH hLHnormal) := + RationalFiniteNormTransferInternal.quotientTargetZero + (hKfinite := hHfinite) (hfinite := hHLfinite) + H L hLH hLHnormal + have hquotientZero := + finiteNormTransferCanonicalClassZero_implies_representativeQuotientZero + (hKfinite := hKfinite) (hKHfinite := hKHfinite) + (hHLfinite := hHLfinite) + K H L hHK hLH hLHnormal c hincludeCanonical + let e := + rationalFiniteNormQuotientEquivIdeleClassNormQuotient + (hKfinite := hHfinite) (hfinite := hHLfinite) + H L hLH hLHnormal + let q := + rationalFiniteNormTransferQuotientMap + (hKfinite := hHfinite) (hfinite := hHLfinite) + H L hLH hLHnormal + let b := + fixedFieldInclusion rationalIdeleClassRepresentation K H hHK + (rationalAbstractFixedFieldIdeleClassEquivFixed K + (Additive.ofMul c)) + let finiteNormRepresentative : + rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hHfinite) H := + Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed H).symm b) + have htransportZero := hquotientZero.equality + change q finiteNormRepresentative = e 0 at htransportZero + change q finiteNormRepresentative = 0 + exact htransportZero.trans e.map_zero + +/-- Internal quotient-target zero to absolute norm-membership step. -/ +private theorem + rationalFiniteNormTransferFiniteNormRepresentativeTargetZero_implies_membership + (K H L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hHK : H.toSubgroup ≤ K.toSubgroup) + (hLH : L.toSubgroup ≤ H.toSubgroup) + (hLHnormal : (extensionSubgroup H L hLH).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hKHfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K H hHK)] + [hHLfinite : Finite + (H.toSubgroup ⧸ extensionSubgroup H L hLH)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) + (hincludeCanonical : + rationalFiniteNormTransferCanonicalFiniteNormClassZero + K H L hHK hLH c) : + RationalFiniteNormTransferCanonicalFiniteNormRepresentativeMembershipData + (hKfinite := hKfinite) (hKHfinite := hKHfinite) + (hHLfinite := hHLfinite) + K H L hHK hLH hLHnormal c := by + refine ⟨?_⟩ + let hHfinite := RationalFiniteNormTransferInternal.absoluteFinite + K H hHK (hKfinite := hKfinite) (hfinite := hKHfinite) + let F := abstractFixedField ℚ (SeparableClosure ℚ) H + let U := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLH + let : FiniteDimensional ℚ F := + RationalFiniteNormTransferInternal.fixedFiniteDimensional H + let : FiniteDimensional F U := + RationalFiniteNormTransferInternal.relativeFiniteDimensional + H L hLH + let : IsScalarTower ℚ F U := + RationalFiniteNormTransferInternal.relativeScalarTower + H L hLH + let : FiniteDimensional ℚ U := + RationalFiniteNormTransferInternal.relativeAbsoluteFiniteDimensional + H L hLH + let : NumberField F := + RationalFiniteNormTransferInternal.fixedNumberField H + let : NumberField U := + RationalFiniteNormTransferInternal.relativeNumberField + H L hLH + let : IsGalois F U := + RationalFiniteNormTransferInternal.relativeIsGalois + H L hLH hLHnormal + let b := + fixedFieldInclusion rationalIdeleClassRepresentation K H hHK + (rationalAbstractFixedFieldIdeleClassEquivFixed K + (Additive.ofMul c)) + let finiteNormRepresentative : IdeleClassGroup F := + Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed H).symm b) + let q := + rationalFiniteNormTransferQuotientMap + (hKfinite := hHfinite) (hfinite := hHLfinite) + H L hLH hLHnormal + let : Zero + (rationalFiniteNormTransferQuotientTarget + (hKfinite := hHfinite) (hfinite := hHLfinite) + H L hLH hLHnormal) := + RationalFiniteNormTransferInternal.quotientTargetZero + (hKfinite := hHfinite) (hfinite := hHLfinite) + H L hLH hLHnormal + have htargetZero := + rationalFiniteNormTransferFiniteNormRepresentativeQuotientZero_implies_targetZero + (hKfinite := hKfinite) (hKHfinite := hKHfinite) + (hHLfinite := hHLfinite) + K H L hHK hLH hLHnormal c hincludeCanonical + have htarget := htargetZero.equality + change q finiteNormRepresentative = 0 at htarget + change finiteNormRepresentative ∈ + (_root_.ideleClassNorm F U).range + apply (QuotientGroup.eq_one_iff finiteNormRepresentative).1 + apply Additive.ofMul.injective + change q finiteNormRepresentative = 0 + exact htarget + +/-- Internal replacement of the absolute finite-norm representative by the +canonical ordinary extension representative. -/ +private theorem + rationalFiniteNormTransferFiniteNormRepresentativeMembership_implies_canonicalAbsoluteMembership + (K H L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hHK : H.toSubgroup ≤ K.toSubgroup) + (hLH : L.toSubgroup ≤ H.toSubgroup) + (hHKnormal : (extensionSubgroup K H hHK).Normal) + (hLHnormal : (extensionSubgroup H L hLH).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hKHfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K H hHK)] + [hHLfinite : Finite + (H.toSubgroup ⧸ extensionSubgroup H L hLH)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) + (hincludeCanonical : + rationalFiniteNormTransferCanonicalFiniteNormClassZero + K H L hHK hLH c) : + RationalFiniteNormTransferCanonicalAbsoluteNormMembershipData + (hKfinite := hKfinite) (hKHfinite := hKHfinite) + (hHLfinite := hHLfinite) + K H L hHK hLH hHKnormal hLHnormal c := by + refine ⟨?_⟩ + let hHfinite := RationalFiniteNormTransferInternal.absoluteFinite + K H hHK (hKfinite := hKfinite) (hfinite := hKHfinite) + let F := abstractFixedField ℚ (SeparableClosure ℚ) H + let U := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLH + let : FiniteDimensional ℚ F := + RationalFiniteNormTransferInternal.fixedFiniteDimensional H + let : FiniteDimensional F U := + RationalFiniteNormTransferInternal.relativeFiniteDimensional + H L hLH + let : IsScalarTower ℚ F U := + RationalFiniteNormTransferInternal.relativeScalarTower + H L hLH + let : FiniteDimensional ℚ U := + RationalFiniteNormTransferInternal.relativeAbsoluteFiniteDimensional + H L hLH + let : NumberField F := + RationalFiniteNormTransferInternal.fixedNumberField H + let : NumberField U := + RationalFiniteNormTransferInternal.relativeNumberField + H L hLH + let : IsGalois F U := + RationalFiniteNormTransferInternal.relativeIsGalois + H L hLH hLHnormal + have hmembership := + rationalFiniteNormTransferFiniteNormRepresentativeTargetZero_implies_membership + (hKfinite := hKfinite) (hKHfinite := hKHfinite) + (hHLfinite := hHLfinite) + K H L hHK hLH hLHnormal c hincludeCanonical + have hfixedToExtension := + rationalFiniteNormTransferCanonicalFixedRepresentative_eq_extension + K H hHK hHKnormal c + change + rationalFiniteNormTransferCanonicalFixedRepresentative K H hHK c = + rationalFiniteNormTransferOrdinaryExtensionRepresentative + K H hHK hHKnormal c at hfixedToExtension + change + rationalFiniteNormTransferOrdinaryExtensionRepresentative + K H hHK hHKnormal c ∈ + (_root_.ideleClassNorm F U).range + rw [← hfixedToExtension] + exact hmembership.membership + +/-- Internal transport of the canonical absolute norm membership to the +relative ordinary-extension field spine. -/ +private theorem + rationalFiniteNormTransferCanonicalAbsoluteMembership_implies_relativeMembership + (K H L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hHK : H.toSubgroup ≤ K.toSubgroup) + (hLH : L.toSubgroup ≤ H.toSubgroup) + (hHKnormal : (extensionSubgroup K H hHK).Normal) + (hLHnormal : (extensionSubgroup H L hLH).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hKHfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K H hHK)] + [hHLfinite : Finite + (H.toSubgroup ⧸ extensionSubgroup H L hLH)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) + (hincludeCanonical : + rationalFiniteNormTransferCanonicalFiniteNormClassZero + K H L hHK hLH c) : + rationalFiniteNormTransferCanonicalOrdinaryExtensionNormMembership + K H L hHK hLH hHKnormal hLHnormal c := by + let hHfinite := RationalFiniteNormTransferInternal.absoluteFinite + K H hHK (hKfinite := hKfinite) (hfinite := hKHfinite) + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hHK + let U := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLH + let : FiniteDimensional ℚ E := + RationalFiniteNormTransferInternal.relativeAbsoluteFiniteDimensional + K H hHK + let : NumberField E := + RationalFiniteNormTransferInternal.relativeNumberField + K H hHK + let : FiniteDimensional ℚ U := + RationalFiniteNormTransferInternal.relativeAbsoluteFiniteDimensional + H L hLH + let : NumberField U := + RationalFiniteNormTransferInternal.relativeNumberField + H L hLH + let : Algebra E U := by + change Algebra + (abstractFixedField ℚ (SeparableClosure ℚ) H) U + exact U.algebra + let : Module E U := by + change Module + (abstractFixedField ℚ (SeparableClosure ℚ) H) U + exact + (U.algebra : Algebra + (abstractFixedField ℚ (SeparableClosure ℚ) H) U).toModule + let : FiniteDimensional E U := by + change FiniteDimensional + (abstractFixedField ℚ (SeparableClosure ℚ) H) U + exact RationalFiniteNormTransferInternal.relativeFiniteDimensional + H L hLH + let : IsScalarTower ℚ E U := by + change IsScalarTower ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) H) U + exact RationalFiniteNormTransferInternal.relativeScalarTower + H L hLH + let : IsGalois E U := by + change IsGalois + (abstractFixedField ℚ (SeparableClosure ℚ) H) U + exact RationalFiniteNormTransferInternal.relativeIsGalois + H L hLH hLHnormal + have habsoluteData := + rationalFiniteNormTransferFiniteNormRepresentativeMembership_implies_canonicalAbsoluteMembership + (hKfinite := hKfinite) (hKHfinite := hKHfinite) + (hHLfinite := hHLfinite) + K H L hHK hLH hHKnormal hLHnormal c hincludeCanonical + have habsolute := habsoluteData.membership + change + rationalFiniteNormTransferOrdinaryExtensionRepresentative + K H hHK hHKnormal c ∈ + (_root_.ideleClassNorm E U).range at habsolute + unfold + rationalFiniteNormTransferCanonicalOrdinaryExtensionNormMembership + change + rationalFiniteNormTransferOrdinaryExtensionRepresentative + K H hHK hHKnormal c ∈ + (_root_.ideleClassNorm E U).range + exact habsolute + +/-- A zero canonical finite-norm class forces the ordinary idele class +extended to the intermediate fixed field to lie in the relative norm range. -/ +theorem + rationalFiniteNormTransferCanonicalFiniteNormClassZero_implies_normMembership + (K H L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hHK : H.toSubgroup ≤ K.toSubgroup) + (hLH : L.toSubgroup ≤ H.toSubgroup) + (hHKnormal : (extensionSubgroup K H hHK).Normal) + (hLHnormal : (extensionSubgroup H L hLH).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hKHfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K H hHK)] + [hHLfinite : Finite + (H.toSubgroup ⧸ extensionSubgroup H L hLH)] + (c : rationalFiniteNormTransferBaseIdeleClass + (hKfinite := hKfinite) K) + (hincludeCanonical : + rationalFiniteNormTransferCanonicalFiniteNormClassZero + K H L hHK hLH c) : + rationalFiniteNormTransferCanonicalOrdinaryExtensionNormMembership + K H L hHK hLH hHKnormal hLHnormal c := by + exact + rationalFiniteNormTransferCanonicalAbsoluteMembership_implies_relativeMembership + (hKfinite := hKfinite) (hKHfinite := hKHfinite) + (hHLfinite := hHLfinite) + K H L hHK hLH hHKnormal hLHnormal c hincludeCanonical + +end RationalIdeleExtension + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFixedFieldBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFixedFieldBaseChange.lean new file mode 100644 index 0000000000..8e0dc81c78 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFixedFieldBaseChange.lean @@ -0,0 +1,174 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalAbstractExtensionToOrdinary +/-! +# Rational fixed-field base-change transport + +Compatibility of abstract fixed-field inclusion with ordinary idele-class extension after +base change. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open ClassFormation +open CyclicCohomology + +section RationalIdeleExtension + +open Reciprocity +open LocalClassFieldTheory + +/-- Under the rational fixed-field realization, abstract fixed-field +inclusion is the actual extension map on ordinary idele classes. -/ +theorem rationalFixedFieldInclusion_baseChange_eq_ideleClassExtension + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (c : RelativeIdeleGroup.ClassGroup ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) K)) : + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI := hnormal + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + letI : NumberField F := + NumberField.of_module_finite ℚ F + letI : NumberField E := + NumberField.of_module_finite ℚ E + (MulEquiv.toAdditive + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := E))) + (rationalAbstractExtensionIdeleClassEquiv + K L hLK hnormal + ((extensionFixedRepresentationEquiv + rationalIdeleClassRepresentation + K L hLK hnormal).symm + (fixedFieldInclusion + rationalIdeleClassRepresentation K L hLK + (rationalAbstractFixedFieldIdeleClassEquivFixed K + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) c)))))) = + Additive.ofMul + (ideleClassExtension F E + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) c)) := by + dsimp only + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + let := hnormal + let : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + let : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + let : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + let : NumberField F := + NumberField.of_module_finite ℚ F + let : NumberField E := + NumberField.of_module_finite ℚ E + let q : IdeleClassGroup F := + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) c + have hInclusion := + rationalAbstractExtensionIdeleClassEquiv_fixedFieldInclusion + K L hLK hnormal c + change + rationalAbstractExtensionIdeleClassEquiv + K L hLK hnormal + ((extensionFixedRepresentationEquiv + rationalIdeleClassRepresentation + K L hLK hnormal).symm + (fixedFieldInclusion + rationalIdeleClassRepresentation K L hLK + (rationalAbstractFixedFieldIdeleClassEquivFixed K + (Additive.ofMul q)))) = + Additive.ofMul + (RelativeIdeleGroup.classInclusion F E q) + at hInclusion + have hBaseChange := + congrArg + (MulEquiv.toAdditive + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := E))) hInclusion + change + (MulEquiv.toAdditive + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := E))) + (rationalAbstractExtensionIdeleClassEquiv + K L hLK hnormal + ((extensionFixedRepresentationEquiv + rationalIdeleClassRepresentation + K L hLK hnormal).symm + (fixedFieldInclusion + rationalIdeleClassRepresentation K L hLK + (rationalAbstractFixedFieldIdeleClassEquivFixed K + (Additive.ofMul q))))) = + Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := E) + (RelativeIdeleGroup.classInclusion F E q)) + at hBaseChange + have hClassInclusion : + Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := E) + (RelativeIdeleGroup.classInclusion F E q)) = + Additive.ofMul (ideleClassExtension F E q) := + congrArg Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv_classInclusion + (K := F) (L := E) q) + change + (MulEquiv.toAdditive + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := E))) + (rationalAbstractExtensionIdeleClassEquiv + K L hLK hnormal + ((extensionFixedRepresentationEquiv + rationalIdeleClassRepresentation + K L hLK hnormal).symm + (fixedFieldInclusion + rationalIdeleClassRepresentation K L hLK + (rationalAbstractFixedFieldIdeleClassEquivFixed K + (Additive.ofMul q))))) = + Additive.ofMul (ideleClassExtension F E q) + exact hBaseChange.trans hClassInclusion + +end RationalIdeleExtension + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertPrincipalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertPrincipalization.lean new file mode 100644 index 0000000000..01bbfdca71 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertPrincipalization.lean @@ -0,0 +1,246 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTheorem +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTransfer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerUnramified +/-! +# Principalization in the selected small Hilbert class field + +The selected second small Hilbert class field is Galois over the +canonical fixed-field copy of the original base, and its maximal +abelian intermediate field is the selected first small Hilbert class +field. Witt transfer therefore places every idele class extended from +that fixed-field copy in the norm range from the second stage. +Functoriality of actual idele extension along the degree-one +identification of the original field with its fixed-field copy gives +the same range inclusion for idele classes extended from the original +field itself. + +The exact second-stage norm subgroup is the intrinsic small-Hilbert +subgroup, so the genuine map from the original field on small-Hilbert +quotients is trivial. Its naturality with extension of ideal classes +then gives the class-group, integral-ideal, and fractional-ideal forms +of principalization over the original number field. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open ClassFormation +open GlobalClassFields +open KummerTheory +open LocalClassFieldTheory +open Reciprocity + +open scoped Classical in +local instance + smallHilbertPrincipalization_ideleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] smallHilbertPrincipalization_ideleClassGroupIsMulCommutative + +open scoped Classical in +local instance + smallHilbertPrincipalization_ideleClassSubgroupNormal + {F : Type} [Field F] [NumberField F] + (N : Subgroup (IdeleClassGroup F)) : N.Normal := + N.normal_of_isMulCommutative + +attribute [local instance] smallHilbertPrincipalization_ideleClassSubgroupNormal + +open scoped Classical in +/-- The idele class quotient by the small Hilbert norm subgroup carries its quotient group +structure. -/ +local instance + smallHilbertPrincipalizationSmallHilbertQuotientGroup + {F : Type} [Field F] [NumberField F] : + Group + (IdeleClassGroup F ⧸ + smallHilbertClassFieldNormSubgroup (K := F)) := + QuotientGroup.Quotient.group + (smallHilbertClassFieldNormSubgroup (K := F)) + +attribute [local instance] smallHilbertPrincipalizationSmallHilbertQuotientGroup + +open scoped Classical in +/-- The identity in the small Hilbert norm quotient is inherited from its chosen quotient group +structure. -/ +local instance + smallHilbertPrincipalizationSmallHilbertQuotientOne + {F : Type} [Field F] [NumberField F] : + One + (IdeleClassGroup F ⧸ + smallHilbertClassFieldNormSubgroup (K := F)) := + ⟨(smallHilbertPrincipalizationSmallHilbertQuotientGroup + (F := F)).one⟩ + +attribute [local instance] smallHilbertPrincipalizationSmallHilbertQuotientOne + +variable (K : Type) [Field K] [NumberField K] + +open scoped Classical in +private theorem smallHilbertClassFieldIdeleExtensionMap_apply_eq_one + (q : IdeleClassGroup K ⧸ + smallHilbertClassFieldNormSubgroup (K := K)) : + smallHilbertClassFieldIdeleExtensionMap + K (smallHilbertClassField K) q = + (1 : IdeleClassGroup (smallHilbertClassField K) ⧸ + smallHilbertClassFieldNormSubgroup + (K := smallHilbertClassField K)) := by + induction q using QuotientGroup.induction_on with + | _ c => + change + smallHilbertClassFieldIdeleExtensionMap + K (smallHilbertClassField K) + (QuotientGroup.mk' + (smallHilbertClassFieldNormSubgroup (K := K)) c) = + 1 + have hcontainment := + smallHilbertClassField_ideleClassExtension_range_le_secondNormRange K + unfold smallHilbertClassFieldSecondNormRangeContainment at hcontainment + have hmembership : + ideleClassExtension K (smallHilbertClassField K) c ∈ + smallHilbertClassFieldNormSubgroup + (K := smallHilbertClassField K) := + hcontainment ⟨c, rfl⟩ + calc + smallHilbertClassFieldIdeleExtensionMap + K (smallHilbertClassField K) + (QuotientGroup.mk' + (smallHilbertClassFieldNormSubgroup (K := K)) c) = + QuotientGroup.mk' + (smallHilbertClassFieldNormSubgroup + (K := smallHilbertClassField K)) + (ideleClassExtension K (smallHilbertClassField K) c) := + smallHilbertClassFieldIdeleExtensionMap_mk' + K (smallHilbertClassField K) c + _ = 1 := + (QuotientGroup.eq_one_iff + (ideleClassExtension K (smallHilbertClassField K) c)).2 + hmembership + +open scoped Classical in +/-- The map induced by genuine idele extension from the original +number field on the two small-Hilbert reciprocity quotients is +trivial. -/ +theorem smallHilbertClassFieldIdeleExtensionMap_eq_one : + @Eq + ((IdeleClassGroup K ⧸ + smallHilbertClassFieldNormSubgroup (K := K)) →* + (IdeleClassGroup (smallHilbertClassField K) ⧸ + smallHilbertClassFieldNormSubgroup + (K := smallHilbertClassField K))) + (smallHilbertClassFieldIdeleExtensionMap + K (smallHilbertClassField K)) + (1 : + (IdeleClassGroup K ⧸ + smallHilbertClassFieldNormSubgroup (K := K)) →* + (IdeleClassGroup (smallHilbertClassField K) ⧸ + smallHilbertClassFieldNormSubgroup + (K := smallHilbertClassField K))) := by + apply MonoidHom.ext + intro q + simpa only [MonoidHom.one_apply] using + smallHilbertClassFieldIdeleExtensionMap_apply_eq_one K q + +open scoped Classical in +private theorem smallHilbertClassFieldClassGroupExtension_apply_eq_one + (c : ClassGroup (𝓞 K)) : + ClassGroup.extendedHom + (𝓞 K) (𝓞 (smallHilbertClassField K)) c = + (1 : ClassGroup (𝓞 (smallHilbertClassField K))) := by + obtain ⟨q, rfl⟩ := + (smallHilbertClassFieldQuotientEquivClassGroup + (K := K)).surjective c + have hidele := + smallHilbertClassFieldIdeleExtensionMap_apply_eq_one K q + have hnaturality := + smallHilbertClassFieldIdeleExtensionMap_naturality + K (smallHilbertClassField K) q + calc + ClassGroup.extendedHom + (𝓞 K) (𝓞 (smallHilbertClassField K)) + (smallHilbertClassFieldQuotientEquivClassGroup (K := K) q) = + smallHilbertClassFieldQuotientEquivClassGroup + (K := smallHilbertClassField K) + (smallHilbertClassFieldIdeleExtensionMap + K (smallHilbertClassField K) q) := + hnaturality.symm + _ = smallHilbertClassFieldQuotientEquivClassGroup + (K := smallHilbertClassField K) 1 := + congrArg + (smallHilbertClassFieldQuotientEquivClassGroup + (K := smallHilbertClassField K)) hidele + _ = 1 := + (smallHilbertClassFieldQuotientEquivClassGroup + (K := smallHilbertClassField K)).map_one + +open scoped Classical in +/-- Extension of ideal classes from a number field to its selected +small Hilbert class field is the trivial homomorphism. This follows +directly from the naturality equality identifying actual idele +extension with actual extension of ideal classes. -/ +theorem smallHilbertClassFieldClassGroupExtension_eq_one : + @Eq + (ClassGroup (𝓞 K) →* + ClassGroup (𝓞 (smallHilbertClassField K))) + (ClassGroup.extendedHom + (𝓞 K) (𝓞 (smallHilbertClassField K))) + (1 : ClassGroup (𝓞 K) →* + ClassGroup (𝓞 (smallHilbertClassField K))) := by + apply MonoidHom.ext + intro c + simpa only [MonoidHom.one_apply] using + smallHilbertClassFieldClassGroupExtension_apply_eq_one K c + +open scoped Classical in +/-- Every ideal of a number field becomes principal after extension +to the selected small Hilbert class field. -/ +theorem allIdealsBecomePrincipalInSmallHilbertClassField : + ∀ I : Ideal (𝓞 K), + (I.map + (algebraMap + (𝓞 K) + (𝓞 (smallHilbertClassField K)))).IsPrincipal := + (ClassGroup.extendedHom_eq_one_iff_forall_ideal_map_isPrincipal + (𝓞 K) (𝓞 (smallHilbertClassField K))).1 + (smallHilbertClassFieldClassGroupExtension_eq_one K) + +open scoped Classical in +/-- Every nonzero fractional ideal of a number field becomes a +principal fractional ideal after extension to the selected small +Hilbert class field. -/ +theorem allFractionalIdealsBecomePrincipalInSmallHilbertClassField : + ∀ I : FractionalIdealGroup K, + FractionalIdealGroup.extension + K (smallHilbertClassField K) I ∈ + (toPrincipalIdeal + (𝓞 (smallHilbertClassField K)) + (smallHilbertClassField K)).range := by + intro I + apply + (IdeleGroup.classGroup_mk_eq_one_iff + (FractionalIdealGroup.extension + K (smallHilbertClassField K) I)).1 + rw [ + FractionalIdealGroup.classGroup_mk_extension, + smallHilbertClassFieldClassGroupExtension_eq_one] + rfl + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertSplitting.lean new file mode 100644 index 0000000000..589a513752 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertSplitting.lean @@ -0,0 +1,91 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassField +/-! +# Splitting in the small Hilbert class field + +The small Hilbert class field has reciprocity quotient the ordinary ideal +class group. Thus the Frobenius class of a finite prime is its ordinary +ideal class, and it is trivial precisely when the prime ideal is principal. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open NumberField IsDedekindDomain + +/-- Canonical class-group commutativity supplies normality for the quotient. -/ +private theorem smallHilbertSplittingClassGroupIsMulCommutative + (F : Type*) [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + IsMulCommutative.of_comm (fun a b => mul_comm a b) + +attribute [local instance] smallHilbertSplittingClassGroupIsMulCommutative + +variable {K : Type*} [Field K] [NumberField K] + +/-- The Frobenius class of a finite prime in the reciprocity quotient of +the small Hilbert class field. -/ +noncomputable def smallHilbertFrobeniusClass + (v : HeightOneSpectrum (𝓞 K)) : + IdeleClassGroup K ⧸ + GlobalClassFields.smallHilbertClassFieldNormSubgroup := + (GlobalClassFields.smallHilbertClassFieldQuotientEquivClassGroup + (K := K)).symm + (ClassGroup.mk K (FractionalIdealGroup.prime v)) + +/-- Reciprocity formulation of complete splitting in the small Hilbert +class field: the prime Frobenius class is trivial. -/ +def SplitsCompletelyInSmallHilbertClassField + (v : HeightOneSpectrum (𝓞 K)) : Prop := + smallHilbertFrobeniusClass v = 1 + +/-- A finite prime splits completely in the small Hilbert class +field if and only if its prime ideal is principal. -/ +theorem splitsCompletelyInSmallHilbertClassField_iff_principal + (v : HeightOneSpectrum (𝓞 K)) : + SplitsCompletelyInSmallHilbertClassField v ↔ + FractionalIdealGroup.prime v ∈ + (toPrincipalIdeal (𝓞 K) K).range := by + change + (GlobalClassFields.smallHilbertClassFieldQuotientEquivClassGroup + (K := K)).symm + (ClassGroup.mk K (FractionalIdealGroup.prime v)) = + 1 ↔ + FractionalIdealGroup.prime v ∈ + (toPrincipalIdeal (𝓞 K) K).range + rw [← + (GlobalClassFields.smallHilbertClassFieldQuotientEquivClassGroup + (K := K)).symm.map_one, + (GlobalClassFields.smallHilbertClassFieldQuotientEquivClassGroup + (K := K)).symm.injective.eq_iff] + exact + IdeleGroup.classGroup_mk_eq_one_iff + (FractionalIdealGroup.prime v) + +/-- Existential generator form of the small Hilbert splitting criterion. -/ +theorem splitsCompletelyInSmallHilbertClassField_iff_exists_generator + (v : HeightOneSpectrum (𝓞 K)) : + SplitsCompletelyInSmallHilbertClassField v ↔ + ∃ x : Kˣ, + toPrincipalIdeal (𝓞 K) K x = + FractionalIdealGroup.prime v := by + rw [splitsCompletelyInSmallHilbertClassField_iff_principal] + rfl + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerConjugation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerConjugation.lean new file mode 100644 index 0000000000..cc8193d4fc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerConjugation.lean @@ -0,0 +1,1235 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.EverywhereUnramifiedTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertNormCharacterization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient +/-! +# Conjugation of the small Hilbert class-field tower + +For a finite abelian tower, conjugation by the lower base carries the +relative norm subgroup of the upper extension to the relative norm subgroup +of the conjugate extension. In the rational absolute idele-class formation, +the subgroup defining the small Hilbert class field is intrinsic under the +corresponding automorphism of its actual fixed field. Finite abelian +classification therefore identifies every conjugate of the second small +Hilbert class field with the original field. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open ClassFormation KummerTheory +open GlobalClassFields LocalClassFieldTheory Reciprocity + +private theorem addSubgroup_map_map_eq_of_comp_eq + {A B C : Type*} [AddGroup A] [AddGroup B] [AddGroup C] + (S : AddSubgroup A) (f : A →+ B) (g : B →+ C) (h : A →+ C) + (hcomp : g.comp f = h) : + (S.map f).map g = S.map h := by + rw [AddSubgroup.map_map, hcomp] + +private theorem addSubgroup_map_addEquiv_then_symm + {A B : Type*} [AddGroup A] [AddGroup B] + (S : AddSubgroup A) (e : A ≃+ B) : + (S.map e.toAddMonoidHom).map e.symm.toAddMonoidHom = S := by + have hcomp : + e.symm.toAddMonoidHom.comp e.toAddMonoidHom = + AddMonoidHom.id A := by + apply AddMonoidHom.ext + intro a + exact e.symm_apply_apply a + calc + (S.map e.toAddMonoidHom).map e.symm.toAddMonoidHom = + S.map (AddMonoidHom.id A) := + addSubgroup_map_map_eq_of_comp_eq + S e.toAddMonoidHom e.symm.toAddMonoidHom + (AddMonoidHom.id A) hcomp + _ = S := AddSubgroup.map_id S + +private theorem addSubgroup_map_le_of_le_map_symm + {A B : Type*} [AddGroup A] [AddGroup B] + (H : AddSubgroup A) (N : AddSubgroup B) (e : A ≃+ B) + (h : H ≤ N.map e.symm.toAddMonoidHom) : + H.map e.toAddMonoidHom ≤ N := by + rintro _ ⟨a, ha, rfl⟩ + have haBack : + e.symm (e a) ∈ N.map e.symm.toAddMonoidHom := by + simpa only [e.symm_apply_apply] using h ha + obtain ⟨b, hb, hba⟩ := haBack + have hb_eq : b = e a := e.symm.injective hba + rw [hb_eq] at hb + change e a ∈ N + exact hb + +private theorem addSubgroup_map_eq_of_comp_eq_of_map_eq + {A B : Type*} [AddGroup A] [AddGroup B] + (S : AddSubgroup A) (e : A →+ B) (g : A →+ A) (t : B →+ B) + (hcomp : t.comp e = e.comp g) (hg : S.map g = S) : + (S.map e).map t = S.map e := by + calc + (S.map e).map t = S.map (e.comp g) := + addSubgroup_map_map_eq_of_comp_eq S e t (e.comp g) hcomp + _ = (S.map g).map e := + (addSubgroup_map_map_eq_of_comp_eq S g e (e.comp g) rfl).symm + _ = S.map e := congrArg (fun H => H.map e) hg + +private theorem subgroup_toAddSubgroup_map_toAdditive_eq_self + {G : Type*} [Group G] + (S : Subgroup G) (f : G →* G) (hf : S.map f = S) : + S.toAddSubgroup.map (MonoidHom.toAdditive f) = + S.toAddSubgroup := by + simpa only [MonoidHom.coe_toAdditive_map] using + congrArg Subgroup.toAddSubgroup hf + +section AbstractConjugation + +variable + {G : IntegralRepGroupType} + [Group G] [TopologicalSpace G] [ContinuousMul G] + +/-- A finite Galois field in an abelian tower is stable under conjugation +by every element of its base subgroup. -/ +theorem conjugateFiniteAbelianSubextensionField_eq_self + {K : ClosedSubgroup G} + (L : FiniteAbelianSubextension K) + (s : K.toSubgroup) : + conjugateClosedSubgroup L.field s.1 = L.field := by + ext x + constructor + · intro hx + have hx' : s.1 * x * s.1⁻¹ ∈ L.field := + (conjugateClosedSubgroup_mem L.field s.1 x).1 hx + let y : L.field.toSubgroup := + ⟨s.1 * x * s.1⁻¹, hx'⟩ + let yK : K.toSubgroup := + Subgroup.inclusion L.below y + have hy : + s⁻¹ * yK * s ∈ + CyclicCohomology.extensionSubgroup K L.field L.below := by + simpa only [inv_inv] using + L.normal.conj_mem yK + ((mem_extensionSubgroup_iff + K L.field L.below yK).2 y.2) s⁻¹ + have hyL : + ((s⁻¹ * yK * s : K.toSubgroup) : G) ∈ + L.field.toSubgroup := + (mem_extensionSubgroup_iff K L.field L.below + (s⁻¹ * yK * s)).1 hy + change x ∈ L.field.toSubgroup + simpa [y, yK, mul_assoc] using hyL + · intro hx + let xK : K.toSubgroup := + ⟨x, L.below hx⟩ + have hxConj : + s * xK * s⁻¹ ∈ + CyclicCohomology.extensionSubgroup K L.field L.below := by + exact + L.normal.conj_mem xK + ((mem_extensionSubgroup_iff + K L.field L.below xK).2 hx) s + apply (conjugateClosedSubgroup_mem L.field s.1 x).2 + simpa [xK] using + (mem_extensionSubgroup_iff K L.field L.below + (s * xK * s⁻¹)).1 hxConj + +/-- Conjugation gives an additive equivalence between the two actual fixed +parts of a coefficient representation. -/ +private noncomputable def conjugateFixedAddEquiv + (A : Rep ℤ G) (K : ClosedSubgroup G) (s : G) : + ambientFixedAddSubgroup A K ≃+ + ambientFixedAddSubgroup A (conjugateClosedSubgroup K s) where + toFun := conjugateFixedElement A K s + invFun := fun b => by + refine ⟨A.ρ s b.1, ?_⟩ + intro k + let kConj : + (conjugateClosedSubgroup K s).toSubgroup := + ⟨s⁻¹ * k.1 * s, + (conjugateClosedSubgroup_mem K s _).2 (by + simp [mul_assoc])⟩ + calc + A.ρ k.1 (A.ρ s b.1) = + A.ρ (k.1 * s) b.1 := by + exact congrArg (fun φ => φ b.1) + (map_mul A.ρ k.1 s).symm + _ = A.ρ (s * kConj.1) b.1 := by + congr 2 + simp [kConj, mul_assoc] + _ = A.ρ s (A.ρ kConj.1 b.1) := by + exact congrArg (fun φ => φ b.1) + (map_mul A.ρ s kConj.1) + _ = A.ρ s b.1 := by rw [b.2 kConj] + left_inv := by + intro a + apply Subtype.ext + change A.ρ s (A.ρ s⁻¹ a.1) = a.1 + calc + A.ρ s (A.ρ s⁻¹ a.1) = + A.ρ (s * s⁻¹) a.1 := by + exact congrArg (fun φ => φ a.1) + (map_mul A.ρ s s⁻¹).symm + _ = a.1 := by simp + right_inv := by + intro b + apply Subtype.ext + change A.ρ s⁻¹ (A.ρ s b.1) = b.1 + calc + A.ρ s⁻¹ (A.ρ s b.1) = + A.ρ (s⁻¹ * s) b.1 := by + exact congrArg (fun φ => φ b.1) + (map_mul A.ρ s⁻¹ s).symm + _ = b.1 := by simp + map_add' := by + intro a b + apply Subtype.ext + exact map_add (A.ρ s⁻¹) a.1 b.1 + +/-- Relative norm images are carried exactly to the norm images of the +conjugate extension. -/ +theorem finiteNormSubgroup_map_conjugateFixed + (A : Rep ℤ G) + (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (s : G) + [Finite + (K.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup K L hLK)] : + letI : Finite + ((conjugateClosedSubgroup K s).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) := + finite_conjugateExtension K L hLK s + (finiteNormSubgroup A K L hLK).map + (conjugateFixedElementHom A K s) = + finiteNormSubgroup A + (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) := by + let : Finite + ((conjugateClosedSubgroup K s).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s)) := + finite_conjugateExtension K L hLK s + ext y + constructor + · rintro ⟨_, ⟨a, rfl⟩, rfl⟩ + refine ⟨conjugateFixedElement A L s a, ?_⟩ + exact relativeNorm_conjugate_apply A K L hLK s a + · rintro ⟨b, rfl⟩ + let a := + (conjugateFixedAddEquiv A L s).symm b + refine + ⟨relativeNorm A K L hLK a, ⟨a, rfl⟩, ?_⟩ + change + conjugateFixedElement A K s + (relativeNorm A K L hLK a) = + relativeNorm A + (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) b + calc + conjugateFixedElement A K s + (relativeNorm A K L hLK a) = + relativeNorm A + (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) + (conjugateFixedElement A L s a) := + (relativeNorm_conjugate_apply + A K L hLK s a).symm + _ = + relativeNorm A + (conjugateClosedSubgroup K s) + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) b := by + rw [show conjugateFixedElement A L s a = b by + exact + (conjugateFixedAddEquiv A L s).apply_symm_apply b] + +/-- Transport a finite abelian subextension along equality of its base subgroups. -/ +noncomputable def rebaseFiniteAbelianSubextension + {K K' : ClosedSubgroup G} (h : K = K') + (L : FiniteAbelianSubextension K) : + FiniteAbelianSubextension K' := + h ▸ L + +omit [ContinuousMul G] in +@[simp] +private theorem rebaseFiniteAbelianSubextension_field + {K K' : ClosedSubgroup G} (h : K = K') + (L : FiniteAbelianSubextension K) : + (rebaseFiniteAbelianSubextension h L).field = L.field := by + cases h + rfl + +/-- Transport an additive homomorphism to the fixed subgroup along equality of base subgroups. -/ +noncomputable def rebaseFixedCodomainHom + (A : Rep ℤ G) + {X : Type*} [AddGroup X] + {K K' : ClosedSubgroup G} (h : K = K') + (f : X →+ ambientFixedAddSubgroup A K) : + X →+ + ambientFixedAddSubgroup A K' := by + cases h + exact f + +omit [ContinuousMul G] in +@[simp] +private theorem rebaseFixedCodomainHom_coe + (A : Rep ℤ G) + {X : Type*} [AddGroup X] + {K K' : ClosedSubgroup G} (h : K = K') + (f : X →+ ambientFixedAddSubgroup A K) + (a : X) : + ((rebaseFixedCodomainHom A h f a : + ambientFixedAddSubgroup A K') : A.V) = + (f a : A.V) := by + cases h + rfl + +private noncomputable def rebaseFixedAddSubgroup + (A : Rep ℤ G) {K K' : ClosedSubgroup G} + (h : K = K') + (H : AddSubgroup (ambientFixedAddSubgroup A K)) : + AddSubgroup (ambientFixedAddSubgroup A K') := by + cases h + exact H + +omit [ContinuousMul G] in +private theorem rebaseFixedAddSubgroup_map + (A : Rep ℤ G) {K K' : ClosedSubgroup G} + (h : K = K') + {X : Type*} [AddGroup X] (H : AddSubgroup X) + (f : X →+ ambientFixedAddSubgroup A K) : + rebaseFixedAddSubgroup A h (H.map f) = + H.map (rebaseFixedCodomainHom A h f) := by + cases h + rfl + +omit [ContinuousMul G] in +private theorem rebaseFiniteAbelianSubextension_normSubgroup + (A : Rep ℤ G) {K K' : ClosedSubgroup G} + (h : K = K') (L : FiniteAbelianSubextension K) : + (rebaseFiniteAbelianSubextension h L).normSubgroup A = + rebaseFixedAddSubgroup A h (L.normSubgroup A) := by + cases h + rfl + +/-- Conjugation of the upper extension, transported back across the +conjugation-stability equality of its abelian base. -/ +noncomputable def conjugateFiniteAbelianSubextensionOverBase + {K : ClosedSubgroup G} + (L : FiniteAbelianSubextension K) + (M : FiniteAbelianSubextension L.field) + (s : K.toSubgroup) : + FiniteAbelianSubextension L.field := + rebaseFiniteAbelianSubextension + (conjugateFiniteAbelianSubextensionField_eq_self L s) + (conjugateFiniteAbelianSubextension M s.1) + +@[simp] +theorem conjugateFiniteAbelianSubextensionOverBase_field + {K : ClosedSubgroup G} + (L : FiniteAbelianSubextension K) + (M : FiniteAbelianSubextension L.field) + (s : K.toSubgroup) : + (conjugateFiniteAbelianSubextensionOverBase L M s).field = + conjugateClosedSubgroup M.field s.1 := + by + simp only [ + conjugateFiniteAbelianSubextensionOverBase, + rebaseFiniteAbelianSubextension_field, + conjugateFiniteAbelianSubextension_field] + +/-- The canonical conjugation map on the fixed part, transported along +the conjugation-stability equality of the abelian base. -/ +noncomputable def stableBaseConjugationHom + (A : Rep ℤ G) + {K : ClosedSubgroup G} + (L : FiniteAbelianSubextension K) + (s : K.toSubgroup) : + ambientFixedAddSubgroup A L.field →+ + ambientFixedAddSubgroup A L.field := + rebaseFixedCodomainHom A + (conjugateFiniteAbelianSubextensionField_eq_self L s) + (conjugateFixedElementHom A L.field s.1) + +@[simp] +theorem stableBaseConjugationHom_coe + (A : Rep ℤ G) + {K : ClosedSubgroup G} + (L : FiniteAbelianSubextension K) + (s : K.toSubgroup) + (a : ambientFixedAddSubgroup A L.field) : + ((stableBaseConjugationHom A L s a : + ambientFixedAddSubgroup A L.field) : A.V) = + A.ρ s.1⁻¹ a.1 := by + calc + ((stableBaseConjugationHom A L s a : + ambientFixedAddSubgroup A L.field) : A.V) = + ((conjugateFixedElementHom A L.field s.1 a : + ambientFixedAddSubgroup A + (conjugateClosedSubgroup L.field s.1)) : A.V) := by + exact rebaseFixedCodomainHom_coe A + (conjugateFiniteAbelianSubextensionField_eq_self L s) + (conjugateFixedElementHom A L.field s.1) a + _ = A.ρ s.1⁻¹ a.1 := + conjugateFixedElement_coe A L.field s.1 a + +/-- The norm subgroup of the conjugate upper extension is the image of +the original norm subgroup under the actual action on the fixed part of +the stable base. -/ +theorem conjugateFiniteAbelianSubextensionOverBase_normSubgroup + (A : Rep ℤ G) + {K : ClosedSubgroup G} + (L : FiniteAbelianSubextension K) + (M : FiniteAbelianSubextension L.field) + (s : K.toSubgroup) : + (conjugateFiniteAbelianSubextensionOverBase L M s).normSubgroup A = + (M.normSubgroup A).map + (stableBaseConjugationHom A L s) := by + let : Finite + (L.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + L.field M.field M.below) := + M.finite + let h := + conjugateFiniteAbelianSubextensionField_eq_self L s + let C := conjugateFiniteAbelianSubextension M s.1 + have hnorm := + finiteNormSubgroup_map_conjugateFixed + A L.field M.field M.below s.1 + have hC : + C.normSubgroup A = + (M.normSubgroup A).map + (conjugateFixedElementHom A L.field s.1) := by + simpa only [ + C, FiniteAbelianSubextension.normSubgroup, + conjugateFiniteAbelianSubextension_field] using hnorm.symm + calc + (conjugateFiniteAbelianSubextensionOverBase L M s).normSubgroup A = + rebaseFixedAddSubgroup A h (C.normSubgroup A) := by + exact rebaseFiniteAbelianSubextension_normSubgroup A h C + _ = rebaseFixedAddSubgroup A h + ((M.normSubgroup A).map + (conjugateFixedElementHom A L.field s.1)) := + congrArg (rebaseFixedAddSubgroup A h) hC + _ = (M.normSubgroup A).map + (stableBaseConjugationHom A L s) := by + exact rebaseFixedAddSubgroup_map A h + (M.normSubgroup A) + (conjugateFixedElementHom A L.field s.1) + +end AbstractConjugation + +section RationalSmallHilbert + +local instance smallHilbertTowerBaseQuotientFinite + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K.field (le_baseField K.field)) := + K.finite + +local instance smallHilbertTowerRelativeQuotientFinite + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + Finite + (K.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + K.field L.field L.below) := + L.finite + +noncomputable local instance smallHilbertTowerBaseFiniteDimensional + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K.field K.finite + +noncomputable local instance smallHilbertTowerRelativeFiniteDimensional + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + FiniteDimensional + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + K.field L.field L.below K.finite L.finite + +local instance smallHilbertTowerScalarTower + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + IsScalarTower ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + +noncomputable local instance smallHilbertTowerAbsoluteFiniteDimensional + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + FiniteDimensional ℚ + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) := + FiniteDimensional.trans ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) + +noncomputable local instance smallHilbertTowerBaseNumberField + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + NumberField + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) := + NumberField.of_module_finite ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) + +noncomputable local instance smallHilbertTowerRelativeNumberField + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + NumberField + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) := + NumberField.of_module_finite ℚ + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) + +noncomputable local instance smallHilbertTowerRelativeIsGalois + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + IsGalois + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) + K.field L.field L.below L.normal + +/-- The ordinary small-Hilbert norm subgroup of an actual fixed field, +transported into the fixed part of the rational absolute idele-class +representation. -/ +noncomputable def smallHilbertNormSubgroupInRationalClassFormation + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + AddSubgroup + (ambientFixedAddSubgroup + rationalIdeleClassRepresentation K.field) := + (smallHilbertClassFieldNormSubgroup + (K := abstractFixedField + ℚ (SeparableClosure ℚ) K.field)).toAddSubgroup.map + (rationalAbstractFixedFieldIdeleClassEquivFixed + K.field).toAddMonoidHom + +private theorem finiteAbelianNormSubgroup_map_fixedIdeleClassEquiv_symm + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + (L.normSubgroup rationalIdeleClassRepresentation).map + (rationalAbstractFixedFieldIdeleClassEquivFixed + K.field).symm.toAddMonoidHom = + (_root_.ideleClassNorm + (abstractFixedField + ℚ (SeparableClosure ℚ) K.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below)).range.toAddSubgroup := by + simpa only [ordinaryIdeleClassNormSubgroup] using + (ordinaryIdeleClassNormSubgroup_eq_actualNormRange K L) + +private theorem + smallHilbertNormSubgroupInRationalClassFormation_le_normSubgroup_of_fixedFieldNormRange + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) + (hordinary : + smallHilbertClassFieldNormSubgroup + (K := abstractFixedField + ℚ (SeparableClosure ℚ) K.field) ≤ + (_root_.ideleClassNorm + (abstractFixedField + ℚ (SeparableClosure ℚ) K.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below)).range) : + smallHilbertNormSubgroupInRationalClassFormation K ≤ + L.normSubgroup rationalIdeleClassRepresentation := by + let F := + abstractFixedField ℚ (SeparableClosure ℚ) K.field + let e := + rationalAbstractFixedFieldIdeleClassEquivFixed K.field + let H := + (smallHilbertClassFieldNormSubgroup + (K := F)).toAddSubgroup + change H.map e.toAddMonoidHom ≤ + L.normSubgroup rationalIdeleClassRepresentation + apply + addSubgroup_map_le_of_le_map_symm + H (L.normSubgroup rationalIdeleClassRepresentation) e + rw [finiteAbelianNormSubgroup_map_fixedIdeleClassEquiv_symm K L] + exact fun c hc => hordinary hc + +/-- Maximality of the intrinsic small-Hilbert norm subgroup, transported +from the actual fixed-field extension back into the rational absolute +class formation. For an extension unramified at every finite and +infinite place, the canonical small-Hilbert subgroup is contained in +its genuine abstract norm subgroup. -/ +theorem + smallHilbertNormSubgroupInRationalClassFormation_le_normSubgroup_of_everywhereUnramified + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + IsUnramifiedAtInfinitePlaces + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) → + _root_.ramifiedBaseFinitePlaces + (K := abstractFixedField + ℚ (SeparableClosure ℚ) K.field) + (L := abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) = ∅ → + smallHilbertNormSubgroupInRationalClassFormation K ≤ + L.normSubgroup rationalIdeleClassRepresentation := by + let F := + abstractFixedField ℚ (SeparableClosure ℚ) K.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + intro hunramifiedInfinite hunramifiedFinite + let : IsUnramifiedAtInfinitePlaces F E := + hunramifiedInfinite + have hordinary : + smallHilbertClassFieldNormSubgroup (K := F) ≤ + (_root_.ideleClassNorm F E).range := + smallHilbertClassFieldNormSubgroup_le_ideleClassNorm_range_of_everywhereUnramified + (K := F) (L := E) hunramifiedFinite + exact + smallHilbertNormSubgroupInRationalClassFormation_le_normSubgroup_of_fixedFieldNormRange + K L hordinary + +/-- Every finite abelian extension of the same actual base which is +unramified at all finite and infinite places lies in any realization of +the small Hilbert class field. The conclusion is a field-order statement: +it follows from the genuine fixed-field norm comparison and the +order-reversing finite abelian classification. -/ +theorem everywhereUnramifiedFiniteAbelianSubextension_le_smallHilbertClassField + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L P : FiniteAbelianSubextension K.field) + (hL : + L.normSubgroup rationalIdeleClassRepresentation = + smallHilbertNormSubgroupInRationalClassFormation K) : + IsEverywhereUnramified + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) → + P ≤ L := by + classical + have hclassification := + FiniteAbelianSubextension.le_iff_normSubgroup_le + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + K P L + let F := + abstractFixedField ℚ (SeparableClosure ℚ) K.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + intro hunramified + apply hclassification.2 + have hsmall := + smallHilbertNormSubgroupInRationalClassFormation_le_normSubgroup_of_everywhereUnramified + K P hunramified.infinitePlaces (by + apply Finset.eq_empty_iff_forall_notMem.mpr + intro v hv + rw [_root_.mem_ramifiedBaseFinitePlaces_iff] at hv + obtain ⟨Q, _hQ, hQramified⟩ := hv + exact hQramified (hunramified.finitePlaces Q)) + intro c hc + exact hsmall (hL ▸ hc) + +/-- The automorphism of the actual upper fixed field induced by the inverse +of an element of the lower base subgroup. The inverse is the one appearing +in right conjugation and in `conjugateFixedElement`. -/ +noncomputable def smallHilbertBaseConjugationAutomorphism + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) + (s : K.field.toSubgroup) : + let E := + abstractFixedField ℚ (SeparableClosure ℚ) L.field + E ≃ₐ[ℚ] E := + letI : + (CyclicCohomology.extensionSubgroup + K.field L.field L.below).Normal := + L.normal + (abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) + K.field L.field L.below L.normal + (QuotientGroup.mk' + (CyclicCohomology.extensionSubgroup + K.field L.field L.below) + s⁻¹)).restrictScalars ℚ + +/-- The fixed-field automorphism used for stable conjugation is induced by +the inverse ambient automorphism on underlying separable-closure elements. -/ +private theorem smallHilbertBaseConjugationAutomorphism_apply_val + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) + (s : K.field.toSubgroup) + (x : abstractFixedField ℚ (SeparableClosure ℚ) L.field) : + ((smallHilbertBaseConjugationAutomorphism K L s x : + abstractFixedField ℚ (SeparableClosure ℚ) L.field) : + SeparableClosure ℚ) = + s.1⁻¹ (x : SeparableClosure ℚ) := by + let : + (CyclicCohomology.extensionSubgroup + K.field L.field L.below).Normal := + L.normal + change + (((abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) + K.field L.field L.below L.normal + (QuotientGroup.mk' + (CyclicCohomology.extensionSubgroup + K.field L.field L.below) + s⁻¹)) x : + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) : + SeparableClosure ℚ) = + s.1⁻¹ (x : SeparableClosure ℚ) + exact + (abstractExtensionQuotientEquivGaloisGroup_mk_apply_val + ℚ (SeparableClosure ℚ) + K.field L.field L.below L.normal s⁻¹ x).symm + +/-- On the actual fixed part of the rational idele-class formation, +conjugation by an element of the lower base is ordinary idele-class +transport along the induced automorphism of the upper fixed field. -/ +theorem rationalSmallHilbertFixedPart_conjugation + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) + (s : K.field.toSubgroup) : + let E := + abstractFixedField ℚ (SeparableClosure ℚ) L.field + letI hLfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + L.field (le_baseField L.field)) := + (L.toFiniteGaloisExtension.toFiniteAbstractFieldExtension).field.finite + letI : FiniteDimensional ℚ E := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) L.field hLfinite + letI : NumberField E := + NumberField.of_module_finite ℚ E + ∀ c : Additive (IdeleClassGroup E), + stableBaseConjugationHom + rationalIdeleClassRepresentation L s + (rationalAbstractFixedFieldIdeleClassEquivFixed + L.field c) = + rationalAbstractFixedFieldIdeleClassEquivFixed + L.field + (Additive.ofMul + (ideleClassCongr + (smallHilbertBaseConjugationAutomorphism K L s) + (Additive.toMul c))) := by + dsimp only + let E := + abstractFixedField ℚ (SeparableClosure ℚ) L.field + let hLfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + L.field (le_baseField L.field)) := + (L.toFiniteGaloisExtension.toFiniteAbstractFieldExtension).field.finite + let : FiniteDimensional ℚ E := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) L.field hLfinite + let : NumberField E := + NumberField.of_module_finite ℚ E + intro c + let τ : E ≃ₐ[ℚ] E := + smallHilbertBaseConjugationAutomorphism K L s + have hστ : ∀ x : E, + ((τ x : E) : SeparableClosure ℚ) = + s.1⁻¹ (x : SeparableClosure ℚ) := by + intro x + exact smallHilbertBaseConjugationAutomorphism_apply_val K L s x + let cτ : Additive (IdeleClassGroup E) := + Additive.ofMul + (ideleClassCongr τ (Additive.toMul c)) + have haction : + rationalIdeleClassRepresentation.ρ s.1⁻¹ + (rationalIdeleClassEquivFixed E c).1 = + (rationalIdeleClassEquivFixed E cτ).1 := by + simpa only [cτ, ofMul_toMul] using + (rationalIdeleClassEquivFixed_ambientAlgEquiv + s.1⁻¹ τ hστ (Additive.toMul c)) + have hstable + (a : ambientFixedAddSubgroup + rationalIdeleClassRepresentation L.field) : + ((stableBaseConjugationHom + rationalIdeleClassRepresentation L s a : + ambientFixedAddSubgroup + rationalIdeleClassRepresentation L.field) : + rationalIdeleClassRepresentation.V) = + rationalIdeleClassRepresentation.ρ s.1⁻¹ a.1 := by + exact stableBaseConjugationHom_coe + rationalIdeleClassRepresentation L s a + have hcoe (z : Additive (IdeleClassGroup E)) : + (rationalAbstractFixedFieldIdeleClassEquivFixed L.field + (hfinite := hLfinite) z).1 = + (rationalIdeleClassEquivFixed E z).1 := + rationalAbstractFixedFieldIdeleClassEquivFixed_coe + L.field (hfinite := hLfinite) z + apply Subtype.ext + exact + (hstable + (rationalAbstractFixedFieldIdeleClassEquivFixed + L.field (hfinite := hLfinite) c)).trans + ((congrArg (rationalIdeleClassRepresentation.ρ s.1⁻¹) + (hcoe c)).trans + (haction.trans (hcoe cτ).symm)) + +private theorem + smallHilbertClassFieldNormSubgroup_toAddSubgroup_map_ideleClassCongr + (E : Type*) [Field E] [NumberField E] + (τ : E ≃ₐ[ℚ] E) : + (smallHilbertClassFieldNormSubgroup + (K := E)).toAddSubgroup.map + (MonoidHom.toAdditive + (ideleClassCongr τ).toMonoidHom) = + (smallHilbertClassFieldNormSubgroup + (K := E)).toAddSubgroup := by + exact + subgroup_toAddSubgroup_map_toAdditive_eq_self + (smallHilbertClassFieldNormSubgroup (K := E)) + (ideleClassCongr τ).toMonoidHom + (smallHilbertClassFieldNormSubgroup_map_ideleClassCongr τ) + +private theorem rationalSmallHilbertFixedPart_conjugation_comp + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) + (s : K.field.toSubgroup) : + let E := + abstractFixedField ℚ (SeparableClosure ℚ) L.field + letI hLfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + L.field (le_baseField L.field)) := + (L.toFiniteGaloisExtension.toFiniteAbstractFieldExtension).field.finite + letI : FiniteDimensional ℚ E := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) L.field hLfinite + letI : NumberField E := + NumberField.of_module_finite ℚ E + (stableBaseConjugationHom + rationalIdeleClassRepresentation L s).comp + (rationalAbstractFixedFieldIdeleClassEquivFixed + L.field).toAddMonoidHom = + (rationalAbstractFixedFieldIdeleClassEquivFixed + L.field).toAddMonoidHom.comp + (MonoidHom.toAdditive + (ideleClassCongr + (smallHilbertBaseConjugationAutomorphism K L s)).toMonoidHom) := by + dsimp only + let E := + abstractFixedField ℚ (SeparableClosure ℚ) L.field + let hLfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + L.field (le_baseField L.field)) := + (L.toFiniteGaloisExtension.toFiniteAbstractFieldExtension).field.finite + let : FiniteDimensional ℚ E := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) L.field hLfinite + let : NumberField E := + NumberField.of_module_finite ℚ E + apply AddMonoidHom.ext + intro c + change + stableBaseConjugationHom + rationalIdeleClassRepresentation L s + (rationalAbstractFixedFieldIdeleClassEquivFixed L.field c) = + rationalAbstractFixedFieldIdeleClassEquivFixed L.field + (Additive.ofMul + (ideleClassCongr + (smallHilbertBaseConjugationAutomorphism K L s) + (Additive.toMul c))) + exact rationalSmallHilbertFixedPart_conjugation K L s c + +private theorem + smallHilbertNormSubgroupInRationalClassFormation_map_conjugation_canonical + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) + (s : K.field.toSubgroup) : + let E := + abstractFixedField ℚ (SeparableClosure ℚ) L.field + letI hLfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + L.field (le_baseField L.field)) := + (L.toFiniteGaloisExtension.toFiniteAbstractFieldExtension).field.finite + letI : FiniteDimensional ℚ E := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) L.field hLfinite + letI : NumberField E := + NumberField.of_module_finite ℚ E + ((smallHilbertClassFieldNormSubgroup + (K := E)).toAddSubgroup.map + (rationalAbstractFixedFieldIdeleClassEquivFixed + L.field).toAddMonoidHom).map + (stableBaseConjugationHom + rationalIdeleClassRepresentation L s) = + (smallHilbertClassFieldNormSubgroup + (K := E)).toAddSubgroup.map + (rationalAbstractFixedFieldIdeleClassEquivFixed + L.field).toAddMonoidHom := by + dsimp only + let E := + abstractFixedField ℚ (SeparableClosure ℚ) L.field + let hLfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + L.field (le_baseField L.field)) := + (L.toFiniteGaloisExtension.toFiniteAbstractFieldExtension).field.finite + let : FiniteDimensional ℚ E := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) L.field hLfinite + let : NumberField E := + NumberField.of_module_finite ℚ E + exact + addSubgroup_map_eq_of_comp_eq_of_map_eq + (smallHilbertClassFieldNormSubgroup (K := E)).toAddSubgroup + (rationalAbstractFixedFieldIdeleClassEquivFixed + L.field).toAddMonoidHom + (MonoidHom.toAdditive + (ideleClassCongr + (smallHilbertBaseConjugationAutomorphism K L s)).toMonoidHom) + (stableBaseConjugationHom + rationalIdeleClassRepresentation L s) + (rationalSmallHilbertFixedPart_conjugation_comp K L s) + (smallHilbertClassFieldNormSubgroup_toAddSubgroup_map_ideleClassCongr + E (smallHilbertBaseConjugationAutomorphism K L s)) + +/-- The canonical small-Hilbert norm subgroup in the rational absolute +class formation is fixed by every lower-base conjugation. -/ +theorem smallHilbertNormSubgroupInRationalClassFormation_map_conjugation + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) + (s : K.field.toSubgroup) : + (smallHilbertNormSubgroupInRationalClassFormation + (L.toFiniteGaloisExtension.toFiniteAbstractFieldExtension).field).map + (stableBaseConjugationHom + rationalIdeleClassRepresentation L s) = + smallHilbertNormSubgroupInRationalClassFormation + (L.toFiniteGaloisExtension.toFiniteAbstractFieldExtension).field := by + exact + smallHilbertNormSubgroupInRationalClassFormation_map_conjugation_canonical + K L s + +/-- If the upper extension realizes the canonical small-Hilbert norm +subgroup of the middle field, finite abelian classification identifies +its conjugate by every element of the lower base with the original +finite abelian subextension. -/ +theorem smallHilbertClassField_conjugateSubextension_eq_self + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) + (M : FiniteAbelianSubextension L.field) + (hM : + M.normSubgroup rationalIdeleClassRepresentation = + smallHilbertNormSubgroupInRationalClassFormation + (L.toFiniteGaloisExtension.toFiniteAbstractFieldExtension).field) + (s : K.field.toSubgroup) : + conjugateFiniteAbelianSubextensionOverBase L M s = M := by + let Ms := + conjugateFiniteAbelianSubextensionOverBase L M s + have hnorm : + Ms.normSubgroup rationalIdeleClassRepresentation = + M.normSubgroup rationalIdeleClassRepresentation := by + calc + Ms.normSubgroup rationalIdeleClassRepresentation = + (M.normSubgroup + rationalIdeleClassRepresentation).map + (stableBaseConjugationHom + rationalIdeleClassRepresentation L s) := by + exact + conjugateFiniteAbelianSubextensionOverBase_normSubgroup + rationalIdeleClassRepresentation L M s + _ = M.normSubgroup rationalIdeleClassRepresentation := by + rw [hM] + exact + smallHilbertNormSubgroupInRationalClassFormation_map_conjugation + K L s + change Ms = M + apply + FiniteAbelianSubextension.normSubgroupMap_injective + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (L.toFiniteGaloisExtension.toFiniteAbstractFieldExtension).field + apply Subtype.ext + change + Ms.normSubgroup rationalIdeleClassRepresentation = + M.normSubgroup rationalIdeleClassRepresentation + exact hnorm + +/-- Field-level conjugation stability of the upper small Hilbert class +field in the two-stage tower. -/ +theorem smallHilbertClassField_conjugate_eq_self + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) + (M : FiniteAbelianSubextension L.field) + (hM : + M.normSubgroup rationalIdeleClassRepresentation = + smallHilbertNormSubgroupInRationalClassFormation + (L.toFiniteGaloisExtension.toFiniteAbstractFieldExtension).field) + (s : K.field.toSubgroup) : + conjugateClosedSubgroup M.field s.1 = M.field := by + have hMs : + conjugateFiniteAbelianSubextensionOverBase L M s = M := + smallHilbertClassField_conjugateSubextension_eq_self + K L M hM s + have hfield := + congrArg + (fun N : FiniteAbelianSubextension L.field => N.field) + hMs + simpa only [ + conjugateFiniteAbelianSubextensionOverBase_field] using hfield + +/-- The second small Hilbert class field in a finite abelian tower is +an actual finite Galois extension of the original base. -/ +noncomputable def smallHilbertClassFieldGaloisSubextension + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) + (M : FiniteAbelianSubextension L.field) + (hM : + M.normSubgroup rationalIdeleClassRepresentation = + smallHilbertNormSubgroupInRationalClassFormation + (L.toFiniteGaloisExtension.toFiniteAbstractFieldExtension).field) : + FiniteGaloisSubextension K.field := + galoisSubextensionOfConjugateStableAbelianTower + L M (smallHilbertClassField_conjugate_eq_self K L M hM) + +/-- The abelian middle field of the two-stage small-Hilbert tower is +contained in the maximal abelian intermediate field of the resulting +Galois extension over the original base. -/ +theorem smallHilbertTowerBase_le_maximalAbelianSubextension + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) + (M : FiniteAbelianSubextension L.field) + (hM : + M.normSubgroup rationalIdeleClassRepresentation = + smallHilbertNormSubgroupInRationalClassFormation + (L.toFiniteGaloisExtension.toFiniteAbstractFieldExtension).field) : + L ≤ + maximalAbelianSubextension + (smallHilbertClassFieldGaloisSubextension + K L M hM) := by + apply + finiteAbelianIntermediate_le_maximalAbelianSubextension + (smallHilbertClassFieldGaloisSubextension + K L M hM) L + simpa only [ + smallHilbertClassFieldGaloisSubextension, + galoisSubextensionOfConjugateStableAbelianTower_field] using + M.below + +/-- If an actual finite Galois extension is everywhere unramified over +its base fixed field, then its maximal abelian intermediate field lies +in every realization of the small Hilbert class field. Unramifiedness +is first descended to the genuine commutator-fixed intermediate field; +finite abelian classification then gives the field inclusion. -/ +theorem + maximalAbelianSubextension_le_smallHilbertClassField_of_everywhereUnramified + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) + (P : FiniteGaloisSubextension K.field) + (hL : + L.normSubgroup rationalIdeleClassRepresentation = + smallHilbertNormSubgroupInRationalClassFormation K) : + let F := + abstractFixedField ℚ (SeparableClosure ℚ) K.field + let T := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + letI hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K.field (le_baseField K.field)) := + K.finite + letI hPfinite : Finite + (K.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + K.field P.field P.below) := + P.finite + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K.field hKfinite + letI : FiniteDimensional F T := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + K.field P.field P.below hKfinite hPfinite + letI : IsScalarTower ℚ F T := + IsScalarTower.of_algebraMap_eq' rfl + letI : FiniteDimensional ℚ T := + FiniteDimensional.trans ℚ F T + letI : NumberField F := + NumberField.of_module_finite ℚ F + letI : NumberField T := + NumberField.of_module_finite ℚ T + IsEverywhereUnramified F T → + maximalAbelianSubextension P ≤ L := by + classical + dsimp only + let F := + abstractFixedField ℚ (SeparableClosure ℚ) K.field + let T := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let A := + maximalAbelianSubextension P + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) A.below + let hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K.field (le_baseField K.field)) := + K.finite + let hPfinite : Finite + (K.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + K.field P.field P.below) := + P.finite + let hAfinite : Finite + (K.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + K.field A.field A.below) := + A.finite + let : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K.field hKfinite + let : FiniteDimensional F T := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + K.field P.field P.below hKfinite hPfinite + let : IsScalarTower ℚ F T := + IsScalarTower.of_algebraMap_eq' rfl + let : FiniteDimensional ℚ T := + FiniteDimensional.trans ℚ F T + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + K.field A.field A.below hKfinite hAfinite + let : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' rfl + let : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + let : NumberField F := + NumberField.of_module_finite ℚ F + let : NumberField T := + NumberField.of_module_finite ℚ T + let : NumberField E := + NumberField.of_module_finite ℚ E + intro hunramifiedTop + have hPA : + P.field.toSubgroup ≤ A.field.toSubgroup := by + change + P.field.toSubgroup ≤ + P.abelianIntermediateField.toSubgroup + exact + P.field_le_intermediateField + (commutator P.extensionQuotient) + have hET : E ≤ T := by + intro x hx + change + x ∈ abstractFixedField + ℚ (SeparableClosure ℚ) A.field at hx + change + x ∈ abstractFixedField + ℚ (SeparableClosure ℚ) P.field + exact + (abstractFixedField_le + ℚ (SeparableClosure ℚ) hPA) hx + let : Algebra E T := + (IntermediateField.inclusion hET).toRingHom.toAlgebra + let : IsScalarTower F E T := + IsScalarTower.of_algebraMap_eq' rfl + have hunramifiedAbelian : + IsEverywhereUnramified F E := + IsEverywhereUnramified.bot hunramifiedTop + exact + everywhereUnramifiedFiniteAbelianSubextension_le_smallHilbertClassField + K L A hL hunramifiedAbelian + +end RationalSmallHilbert + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerRealization.lean new file mode 100644 index 0000000000..dd4d7df574 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerRealization.lean @@ -0,0 +1,953 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerConjugation +public import Mathlib.Data.Rat.Cast.Defs +/-! +# Actual realization of the two-stage small Hilbert tower + +The first small Hilbert class field is the actual finite abelian +subextension selected in `HilbertClassFieldRealization`. Over its actual +fixed field, the closed finite-index small-Hilbert norm subgroup has a +finite Galois norm neighbourhood. We embed that neighbourhood in the +rational separable closure compatibly with the already chosen first +stage. Finite abelian classification then selects the second small +Hilbert class field over the literal first-stage subgroup. + +The compatibility of the embedding is essential: an unrelated chosen +copy of the middle number field would produce a class field over a +conjugate closed subgroup rather than over the first-stage subgroup +itself. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open AlgebraicNumberTheory +open ClassFormation +open CyclicCohomology +open GlobalClassFields +open KummerTheory +open LocalClassFieldTheory +open RamificationTheory +open Reciprocity + +open scoped Classical in +/-- The ordinary idèle-class operations used by the two-stage transport, +fixed at the canonical principal-subgroup quotient. -/ +@[instance_reducible] +private noncomputable def smallHilbertTowerIdeleClassCommGroup + (F : Type) [Field F] [NumberField F] : + CommGroup (IdeleClassGroup F) := + QuotientGroup.Quotient.commGroup (IdeleGroup.principalSubgroup F) + +attribute [local instance] smallHilbertTowerIdeleClassCommGroup + +open scoped Classical in +private theorem addSubgroup_comap_symm_eq_map + {A B : Type*} [AddGroup A] [AddGroup B] + (H : AddSubgroup A) (e : A ≃+ B) : + H.comap e.symm.toAddMonoidHom = + H.map e.toAddMonoidHom := by + exact (AddSubgroup.map_equiv_eq_comap_symm e H).symm + +open scoped Classical in +private noncomputable abbrev + closedFiniteIndexNormAmbientCanonicalBaseAlgebra + (F : Type) [Field F] [NumberField F] + (H : Subgroup (IdeleClassGroup F)) + (hclosed : IsClosed (H : Set (IdeleClassGroup F))) + [H.FiniteIndex] : + Algebra F + (closedFiniteIndexClassFieldNormAmbient + (K := F) H hclosed) := + inferInstance + +section RationalFixedField + +variable + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) + +open scoped Classical in +/-- The middle field in the small Hilbert tower, as a finite abstract field +over the rational base. -/ +noncomputable abbrev smallHilbertTowerMiddleFiniteAbstractField : + FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) := + { field := L.field + finite := by + let : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K.field (le_baseField K.field)) := + K.finite + let : Finite + (K.field.toSubgroup ⧸ + extensionSubgroup K.field L.field L.below) := + L.finite + exact + FiniteGaloisSubextension.finite_extension_trans + L.below (le_baseField K.field) } + +local notation "E" => + abstractFixedField ℚ (SeparableClosure ℚ) L.field + +local notation "N" => + smallHilbertClassFieldNormAmbient E + +open scoped Classical in +private noncomputable instance + smallHilbertTowerMiddleAbstractQuotientFinite : + Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + L.field (le_baseField L.field)) := + (smallHilbertTowerMiddleFiniteAbstractField K L).finite + +open scoped Classical in +private noncomputable instance + smallHilbertTowerMiddleFiniteDimensional : + FiniteDimensional ℚ E := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) L.field inferInstance + +open scoped Classical in +private noncomputable instance + smallHilbertTowerMiddleNumberField : + NumberField E := + NumberField.of_module_finite ℚ E + +open scoped Classical in +/-- The canonical small-Hilbert subgroup over the literal middle field. +This typed endpoint avoids repeatedly reducing the finite-abstract-field +package merely to recover its `field = L.field` projection. -/ +noncomputable def smallHilbertTowerMiddleNormSubgroup : + AddSubgroup + (ambientFixedAddSubgroup + rationalIdeleClassRepresentation L.field) := + (smallHilbertClassFieldNormSubgroup (K := E)).toAddSubgroup.comap + (rationalAbstractFixedFieldIdeleClassEquivFixed + L.field + (hfinite := smallHilbertTowerMiddleAbstractQuotientFinite K L)).symm.toAddMonoidHom + +open scoped Classical in +/-- The typed `comap` endpoint is the canonical transported `map` endpoint. +This uses only the generic additive equivalence law. -/ +theorem smallHilbertTowerMiddleNormSubgroup_eq_map : + smallHilbertTowerMiddleNormSubgroup K L = + (smallHilbertClassFieldNormSubgroup (K := E)).toAddSubgroup.map + (rationalAbstractFixedFieldIdeleClassEquivFixed + L.field + (hfinite := smallHilbertTowerMiddleAbstractQuotientFinite K L)).toAddMonoidHom := by + exact addSubgroup_comap_symm_eq_map + (smallHilbertClassFieldNormSubgroup (K := E)).toAddSubgroup + (rationalAbstractFixedFieldIdeleClassEquivFixed L.field + (hfinite := smallHilbertTowerMiddleAbstractQuotientFinite K L)) + +open scoped Classical in +@[reducible] +private noncomputable def + smallHilbertTowerNormAmbientAlgebra : + Algebra E N := + closedFiniteIndexNormAmbientCanonicalBaseAlgebra E + (smallHilbertClassFieldNormSubgroup (K := E)) + (smallHilbertClassFieldNormSubgroup_isClosed (K := E)) + +attribute [local instance] smallHilbertTowerNormAmbientAlgebra + +open scoped Classical in +@[reducible] +private noncomputable def + smallHilbertTowerNormAmbientSMul : + SMul E N := + Algebra.toSMul + (self := smallHilbertTowerNormAmbientAlgebra K L) + +open scoped Classical in +@[reducible] +private noncomputable def + smallHilbertTowerNormAmbientModule : + Module E N := + @Algebra.toModule E N _ _ + (smallHilbertTowerNormAmbientAlgebra K L) + +open scoped Classical in +private theorem + smallHilbertTowerNormAmbientScalarTower : + @IsScalarTower ℚ E N + (Algebra.toSMul (R := ℚ) (A := E)) + (smallHilbertTowerNormAmbientSMul K L) + (Algebra.toSMul (R := ℚ) (A := N)) := by + exact IsScalarTower.of_algebraMap_eq' + (R := ℚ) (S := E) (A := N) + (RingHom.ext_rat (algebraMap ℚ N) + ((algebraMap E N).comp (algebraMap ℚ E))) + +open scoped Classical in +private noncomputable def + smallHilbertTowerNormAmbientAlgHom : + E →ₐ[ℚ] N := + { toRingHom := algebraMap E N + commutes' := fun r => + (RingHom.congr_fun + (RingHom.ext_rat + ((algebraMap E N).comp (algebraMap ℚ E)) + (algebraMap ℚ N)) r) } + +open scoped Classical in +private theorem smallHilbertTowerNormAmbientAlgHom_apply + (x : E) : + smallHilbertTowerNormAmbientAlgHom K L x = + algebraMap E N x := by + rfl + +open scoped Classical in +private theorem + smallHilbertTowerNormAmbientIsGalois : + IsGalois E N := by + unfold smallHilbertClassFieldNormAmbient + closedFiniteIndexClassFieldNormAmbient + exact + closedFiniteIndexNormAmbientIsGalois + (smallHilbertClassFieldNormSubgroup (K := E)) + (smallHilbertClassFieldNormSubgroup_isClosed (K := E)) + +attribute [local instance] smallHilbertTowerNormAmbientIsGalois + +open scoped Classical in +private noncomputable def + smallHilbertNormNeighborhoodForwardAlignment : + SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ := by + let j₀ : N →ₐ[ℚ] SeparableClosure ℚ := + numberFieldSeparableClosureEmbedding N + let i₀ : E →ₐ[ℚ] SeparableClosure ℚ := + j₀.comp (smallHilbertTowerNormAmbientAlgHom K L) + exact + AlgEquiv.ofBijective + (i₀.liftNormal (SeparableClosure ℚ)) + (AlgHom.normal_bijective + ℚ (SeparableClosure ℚ) (SeparableClosure ℚ) _) + +open scoped Classical in +/-- The separable-closure automorphism which aligns an arbitrary chosen +embedding of the norm-neighbourhood field with the already embedded +middle field. -/ +private noncomputable def + smallHilbertNormNeighborhoodAlignment : + SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ := + (smallHilbertNormNeighborhoodForwardAlignment K L).symm + +open scoped Classical in +@[simp] +private theorem smallHilbertNormNeighborhoodForwardAlignment_apply + (x : E) : + smallHilbertNormNeighborhoodForwardAlignment K L + (x : SeparableClosure ℚ) = + (numberFieldSeparableClosureEmbedding N) + (algebraMap E N x) := by + let j₀ : N →ₐ[ℚ] SeparableClosure ℚ := + numberFieldSeparableClosureEmbedding N + let i₀ : E →ₐ[ℚ] SeparableClosure ℚ := + j₀.comp (smallHilbertTowerNormAmbientAlgHom K L) + dsimp only [smallHilbertNormNeighborhoodForwardAlignment, + AlgEquiv.ofBijective_apply] + calc + _ = i₀ x := by + simpa only [IntermediateField.algebraMap_apply, + Algebra.algebraMap_self, RingHom.id_apply] using + i₀.liftNormal_commutes (SeparableClosure ℚ) x + _ = j₀ (algebraMap E N x) := by + change + j₀ (smallHilbertTowerNormAmbientAlgHom K L x) = + j₀ (algebraMap E N x) + exact congrArg j₀ + (smallHilbertTowerNormAmbientAlgHom_apply K L x) + +open scoped Classical in +/-- A controlled embedding of the concrete finite Galois norm +neighbourhood. Its restriction to the middle field is the literal +inclusion of that fixed field in `SeparableClosure ℚ`. -/ +private noncomputable def + smallHilbertNormNeighborhoodEmbedding : + N →ₐ[ℚ] SeparableClosure ℚ := + (smallHilbertNormNeighborhoodAlignment K L).toAlgHom.comp + (numberFieldSeparableClosureEmbedding N) + +open scoped Classical in +@[simp] +private theorem smallHilbertNormNeighborhoodEmbedding_algebraMap + (x : E) : + smallHilbertNormNeighborhoodEmbedding K L + (algebraMap E N x) = + (x : SeparableClosure ℚ) := by + change + (smallHilbertNormNeighborhoodForwardAlignment K L).symm + ((numberFieldSeparableClosureEmbedding N) + (algebraMap E N x)) = + (x : SeparableClosure ℚ) + rw [← smallHilbertNormNeighborhoodForwardAlignment_apply K L x] + exact + (smallHilbertNormNeighborhoodForwardAlignment K L).symm_apply_apply _ + +open scoped Classical in +private abbrev smallHilbertNormNeighborhoodEmbeddedBase : + ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) := + closedFixingSubgroup ℚ (SeparableClosure ℚ) + (AlgHom.fieldRange + ((smallHilbertNormNeighborhoodEmbedding K L).comp + (smallHilbertTowerNormAmbientAlgHom K L))) + +open scoped Classical in +private abbrev smallHilbertNormNeighborhoodEmbeddedField : + ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) := + closedFixingSubgroup ℚ (SeparableClosure ℚ) + (AlgHom.fieldRange + (smallHilbertNormNeighborhoodEmbedding K L)) + +open scoped Classical in +private theorem smallHilbertNormNeighborhoodEmbeddedField_le_base : + (smallHilbertNormNeighborhoodEmbeddedField K L).toSubgroup ≤ + (smallHilbertNormNeighborhoodEmbeddedBase K L).toSubgroup := by + change + (AlgHom.fieldRange + (smallHilbertNormNeighborhoodEmbedding K L)).fixingSubgroup ≤ + (AlgHom.fieldRange + ((smallHilbertNormNeighborhoodEmbedding K L).comp + (smallHilbertTowerNormAmbientAlgHom K L))).fixingSubgroup + apply + (AlgHom.fieldRange + ((smallHilbertNormNeighborhoodEmbedding K L).comp + (smallHilbertTowerNormAmbientAlgHom K L))).fixingSubgroup_le + exact + AlgHom.range_comp_le_range + (smallHilbertTowerNormAmbientAlgHom K L) + (smallHilbertNormNeighborhoodEmbedding K L) + +open scoped Classical in +private theorem smallHilbertNormNeighborhoodEmbeddedBase_eq : + smallHilbertNormNeighborhoodEmbeddedBase K L = L.field := by + have hi : + (smallHilbertNormNeighborhoodEmbedding K L).comp + (smallHilbertTowerNormAmbientAlgHom K L) = + (abstractFixedField ℚ (SeparableClosure ℚ) L.field).val := by + apply AlgHom.ext + intro x + change smallHilbertNormNeighborhoodEmbedding K L + (smallHilbertTowerNormAmbientAlgHom K L x) = (x : SeparableClosure ℚ) + rw [smallHilbertTowerNormAmbientAlgHom_apply K L x] + exact smallHilbertNormNeighborhoodEmbedding_algebraMap K L x + change + closedFixingSubgroup ℚ (SeparableClosure ℚ) + (AlgHom.fieldRange + ((smallHilbertNormNeighborhoodEmbedding K L).comp + (smallHilbertTowerNormAmbientAlgHom K L))) = + L.field + rw [hi, IntermediateField.fieldRange_val] + exact + closedFixingSubgroup_abstractFixedField_eq + ℚ (SeparableClosure ℚ) L.field + +open scoped Classical in +private noncomputable def + smallHilbertNormNeighborhoodSeparableClosureEquiv : + let j := smallHilbertNormNeighborhoodEmbedding K L + let i := j.comp (smallHilbertTowerNormAmbientAlgHom K L) + let : Algebra E (SeparableClosure ℚ) := + i.toRingHom.toAlgebra + SeparableClosure E ≃ₐ[E] SeparableClosure ℚ := by + intro j i alg + let : @IsScalarTower ℚ E (SeparableClosure ℚ) + (Algebra.toSMul (R := ℚ) (A := E)) + alg.toSMul + (Algebra.toSMul (R := ℚ) (A := SeparableClosure ℚ)) := + IsScalarTower.of_algebraMap_eq' i.comp_algebraMap.symm + let : IsSepClosure E (SeparableClosure ℚ) := + ⟨IsSepClosure.sep_closed ℚ, + Algebra.isSeparable_tower_top_of_isSeparable + ℚ E (SeparableClosure ℚ)⟩ + exact + IsSepClosure.equiv E + (SeparableClosure E) (SeparableClosure ℚ) + +open scoped Classical in +private noncomputable def + smallHilbertFiniteGaloisNormNeighborhoodRaw : + FiniteGaloisSubextension + (smallHilbertNormNeighborhoodEmbeddedBase K L) := by + let : @IsScalarTower ℚ E N + (Algebra.toSMul (R := ℚ) (A := E)) + (smallHilbertTowerNormAmbientSMul K L) + (Algebra.toSMul (R := ℚ) (A := N)) := + smallHilbertTowerNormAmbientScalarTower K L + let j : N →ₐ[ℚ] SeparableClosure ℚ := + smallHilbertNormNeighborhoodEmbedding K L + let i : E →ₐ[ℚ] SeparableClosure ℚ := + j.comp (IsScalarTower.toAlgHom ℚ E N) + let B : ClosedSubgroup (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) := + closedFixingSubgroup ℚ (SeparableClosure ℚ) i.fieldRange + let T : ClosedSubgroup (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) := + smallHilbertNormNeighborhoodEmbeddedField K L + have hTB : T.toSubgroup ≤ B.toSubgroup := by + change j.fieldRange.fixingSubgroup ≤ i.fieldRange.fixingSubgroup + apply i.fieldRange.fixingSubgroup_le + exact AlgHom.range_comp_le_range (IsScalarTower.toAlgHom ℚ E N) j + let raw : FiniteGaloisSubextension B := { + field := T + below := hTB + normal := ambientEmbeddedExtensionSubgroup_normal ℚ E N j + (smallHilbertNormNeighborhoodSeparableClosureEquiv K L) + finite := ambientEmbeddedExtensionQuotient_finite ℚ E N j + (smallHilbertNormNeighborhoodSeparableClosureEquiv K L) } + have hi : IsScalarTower.toAlgHom ℚ E N = + smallHilbertTowerNormAmbientAlgHom K L := by + apply AlgHom.ext + intro x + exact (IsScalarTower.toAlgHom_apply ℚ E N x).trans + (smallHilbertTowerNormAmbientAlgHom_apply K L x).symm + have hB : B = smallHilbertNormNeighborhoodEmbeddedBase K L := + congrArg + (fun f : E →ₐ[ℚ] N => + closedFixingSubgroup ℚ (SeparableClosure ℚ) (j.comp f).fieldRange) hi + exact hB ▸ raw + +open scoped Classical in +/-- Transport a finite Galois subextension along equality of its base subgroups. -/ +noncomputable def rebaseFiniteGaloisSubextension + {G : Type} [Group G] [TopologicalSpace G] + {B B' : ClosedSubgroup G} (h : B = B') + (P : FiniteGaloisSubextension B) : + FiniteGaloisSubextension B' := + h ▸ P + +open scoped Classical in +@[simp] +private theorem rebaseFiniteGaloisSubextension_field + {G : Type} [Group G] [TopologicalSpace G] + {B B' : ClosedSubgroup G} (h : B = B') + (P : FiniteGaloisSubextension B) : + (rebaseFiniteGaloisSubextension h P).field = P.field := by + cases h + rfl + +open scoped Classical in +private theorem + rebaseRationalFiniteGaloisSubextension_fixedField_eq + {B B' : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)} + (h : B = B') (P : FiniteGaloisSubextension B) : + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (rebaseFiniteGaloisSubextension h P).below).restrictScalars ℚ = + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + P.below).restrictScalars ℚ := by + cases h + rfl + +open scoped Classical in +/-- An actual finite Galois norm neighbourhood over the literal +first-stage subgroup. It is produced by the finite-index Kummer +construction and the controlled embedding above. -/ +noncomputable def smallHilbertFiniteGaloisNormNeighborhood : + FiniteGaloisSubextension L.field := + rebaseFiniteGaloisSubextension + (smallHilbertNormNeighborhoodEmbeddedBase_eq K L) + (smallHilbertFiniteGaloisNormNeighborhoodRaw K L) + +open scoped Classical in +/-- The abstract norm subgroup of the chosen neighbourhood, pinned to the +literal middle-field carrier. -/ +noncomputable def smallHilbertFiniteGaloisNormNeighborhoodNormSubgroup : + AddSubgroup + (ambientFixedAddSubgroup + rationalIdeleClassRepresentation L.field) := + (smallHilbertFiniteGaloisNormNeighborhood K L).normSubgroup + rationalIdeleClassRepresentation + +open scoped Classical in +private noncomputable abbrev + smallHilbertFiniteGaloisNormNeighborhoodTopField : Type := + abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (smallHilbertFiniteGaloisNormNeighborhood K L).below + +local notation "E₂" => + smallHilbertFiniteGaloisNormNeighborhoodTopField K L + +open scoped Classical in +private noncomputable instance + smallHilbertFiniteGaloisNormNeighborhoodQuotientFinite : + Finite + (L.field.toSubgroup ⧸ + extensionSubgroup L.field + (smallHilbertFiniteGaloisNormNeighborhood K L).field + (smallHilbertFiniteGaloisNormNeighborhood K L).below) := + (smallHilbertFiniteGaloisNormNeighborhood K L).finite + +open scoped Classical in +private noncomputable instance + smallHilbertFiniteGaloisNormNeighborhoodFiniteDimensional : + FiniteDimensional E E₂ := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) L.field + (smallHilbertFiniteGaloisNormNeighborhood K L).field + (smallHilbertFiniteGaloisNormNeighborhood K L).below + inferInstance inferInstance + +open scoped Classical in +private noncomputable instance + smallHilbertFiniteGaloisNormNeighborhoodScalarTower : + IsScalarTower ℚ E E₂ := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + +open scoped Classical in +private noncomputable instance + smallHilbertFiniteGaloisNormNeighborhoodAbsoluteFiniteDimensional : + FiniteDimensional ℚ E₂ := + FiniteDimensional.trans ℚ E E₂ + +open scoped Classical in +private noncomputable instance + smallHilbertFiniteGaloisNormNeighborhoodNumberField : + NumberField E₂ := + NumberField.of_module_finite ℚ E₂ + +open scoped Classical in +private noncomputable instance + smallHilbertFiniteGaloisNormNeighborhoodIsGalois : + IsGalois E E₂ := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) L.field + (smallHilbertFiniteGaloisNormNeighborhood K L).field + (smallHilbertFiniteGaloisNormNeighborhood K L).below + (smallHilbertFiniteGaloisNormNeighborhood K L).normal + +open scoped Classical in +private theorem + smallHilbertFiniteGaloisNormNeighborhood_fixedField_eq_range : + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (smallHilbertFiniteGaloisNormNeighborhood K L).below).restrictScalars ℚ = + AlgHom.fieldRange + (smallHilbertNormNeighborhoodEmbedding K L) := by + rw [show + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (smallHilbertFiniteGaloisNormNeighborhood K L).below).restrictScalars ℚ = + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (smallHilbertFiniteGaloisNormNeighborhoodRaw K L).below).restrictScalars ℚ + from + rebaseRationalFiniteGaloisSubextension_fixedField_eq + (smallHilbertNormNeighborhoodEmbeddedBase_eq K L) + (smallHilbertFiniteGaloisNormNeighborhoodRaw K L)] + exact + InfiniteGalois.fixedField_fixingSubgroup + (AlgHom.fieldRange + (smallHilbertNormNeighborhoodEmbedding K L)) + +open scoped Classical in +private noncomputable def + smallHilbertFiniteGaloisNormNeighborhoodTopEquiv : + N ≃ₐ[ℚ] + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (smallHilbertFiniteGaloisNormNeighborhood K L).below).restrictScalars ℚ := + (smallHilbertNormNeighborhoodEmbedding K L).equivFieldRange.trans + (IntermediateField.equivOfEq + (smallHilbertFiniteGaloisNormNeighborhood_fixedField_eq_range + K L).symm) + +open scoped Classical in +private theorem + smallHilbertFiniteGaloisNormNeighborhoodTopEquiv_algebraMap + (x : E) : + smallHilbertFiniteGaloisNormNeighborhoodTopEquiv K L + (algebraMap E N x) = + algebraMap E + E₂ x := by + apply Subtype.ext + change + smallHilbertNormNeighborhoodEmbedding K L + (algebraMap E N x) = + (x : SeparableClosure ℚ) + exact smallHilbertNormNeighborhoodEmbedding_algebraMap K L x + +open scoped Classical in +private noncomputable def + smallHilbertFiniteGaloisNormNeighborhoodRelativeTopEquiv : + N ≃ₐ[E] E₂ := { + smallHilbertFiniteGaloisNormNeighborhoodTopEquiv K L with + commutes' := fun x => + smallHilbertFiniteGaloisNormNeighborhoodTopEquiv_algebraMap + K L x } + +open scoped Classical in +private theorem + smallHilbertFiniteGaloisNormNeighborhood_ordinaryNorm_le : + (_root_.ideleClassNorm E N).range ≤ + smallHilbertClassFieldNormSubgroup (K := E) := by + simpa only [smallHilbertClassFieldNormAmbient] using + (closedFiniteIndexClassFieldNormAmbient_normRange_le + (K := E) (smallHilbertClassFieldNormSubgroup (K := E)) + (smallHilbertClassFieldNormSubgroup_isClosed (K := E))) + +open scoped Classical in +private theorem + smallHilbertFiniteGaloisNormNeighborhood_ordinaryNormRange_eq : + (_root_.ideleClassNorm E N).range = + (_root_.ideleClassNorm E E₂).range := by + simpa only [ordinaryIdeleClassNorm_range_eq_relative] using + (ideleClassNorm_range_algEquiv + (K := E) + (smallHilbertFiniteGaloisNormNeighborhoodRelativeTopEquiv + K L)).symm + +open scoped Classical in +private theorem + smallHilbertFiniteGaloisNormNeighborhood_abstractNormMap_eq : + ((smallHilbertFiniteGaloisNormNeighborhood K L).normSubgroup + rationalIdeleClassRepresentation).map + (rationalAbstractFixedFieldIdeleClassEquivFixed + L.field + (hfinite := smallHilbertTowerMiddleAbstractQuotientFinite K L)).symm.toAddMonoidHom = + (_root_.ideleClassNorm E E₂).range.toAddSubgroup := by + change + (finiteNormSubgroup rationalIdeleClassRepresentation + L.field + (smallHilbertFiniteGaloisNormNeighborhood K L).field + (smallHilbertFiniteGaloisNormNeighborhood K L).below).map + (rationalAbstractFixedFieldIdeleClassEquivFixed + L.field + (hfinite := smallHilbertTowerMiddleAbstractQuotientFinite K L)).symm.toAddMonoidHom = + (_root_.ideleClassNorm E E₂).range.toAddSubgroup + exact + (map_rationalFiniteNormSubgroup_eq_ordinaryIdeleClassNormRange_concrete + L.field + (smallHilbertFiniteGaloisNormNeighborhood K L).field + (smallHilbertFiniteGaloisNormNeighborhood K L).below + (smallHilbertFiniteGaloisNormNeighborhood K L).normal) + +open scoped Classical in +/-- The abstract norm map lands directly in the ordinary norm range of the +chosen neighbourhood. Composing the two named subgroup equalities here +keeps downstream membership proofs pointwise. -/ +private theorem + smallHilbertFiniteGaloisNormNeighborhood_abstractNormMap_eq_ordinaryNormRange : + ((smallHilbertFiniteGaloisNormNeighborhood K L).normSubgroup + rationalIdeleClassRepresentation).map + (rationalAbstractFixedFieldIdeleClassEquivFixed + L.field + (hfinite := smallHilbertTowerMiddleAbstractQuotientFinite K L)).symm.toAddMonoidHom = + (_root_.ideleClassNorm E N).range.toAddSubgroup := + (smallHilbertFiniteGaloisNormNeighborhood_abstractNormMap_eq K L).trans + (congrArg Subgroup.toAddSubgroup + (smallHilbertFiniteGaloisNormNeighborhood_ordinaryNormRange_eq K L).symm) + +open scoped Classical in +/-- Pointwise form of the combined norm-range equality. -/ +private theorem + smallHilbertFiniteGaloisNormNeighborhood_abstractNormMap_mem_ordinaryNormRange + (a : Additive (IdeleClassGroup E)) + (ha : + a ∈ ((smallHilbertFiniteGaloisNormNeighborhood K L).normSubgroup + rationalIdeleClassRepresentation).map + (rationalAbstractFixedFieldIdeleClassEquivFixed + L.field + (hfinite := smallHilbertTowerMiddleAbstractQuotientFinite K L)).symm.toAddMonoidHom) : + a ∈ (_root_.ideleClassNorm E N).range.toAddSubgroup := + (le_of_eq + (smallHilbertFiniteGaloisNormNeighborhood_abstractNormMap_eq_ordinaryNormRange + K L)) ha + +open scoped Classical in +/-- The actual finite Galois norm neighbourhood has abstract norm +subgroup contained in the canonical small-Hilbert subgroup of the +middle fixed field. This is the source-producing norm-topology input; +no norm-openness premise is assumed. -/ +theorem smallHilbertFiniteGaloisNormNeighborhood_normSubgroup_le : + ∀ a : ambientFixedAddSubgroup + rationalIdeleClassRepresentation L.field, + a ∈ smallHilbertFiniteGaloisNormNeighborhoodNormSubgroup K L → + a ∈ smallHilbertTowerMiddleNormSubgroup K L := by + intro a ha + change + a ∈ (smallHilbertFiniteGaloisNormNeighborhood K L).normSubgroup + rationalIdeleClassRepresentation at ha + have haMap : + (rationalAbstractFixedFieldIdeleClassEquivFixed + L.field + (hfinite := smallHilbertTowerMiddleAbstractQuotientFinite K L)).symm a ∈ + ((smallHilbertFiniteGaloisNormNeighborhood K L).normSubgroup + rationalIdeleClassRepresentation).map + (rationalAbstractFixedFieldIdeleClassEquivFixed + L.field + (hfinite := smallHilbertTowerMiddleAbstractQuotientFinite K L)).symm.toAddMonoidHom := + ⟨a, ha, rfl⟩ + have haOrdinary : + (rationalAbstractFixedFieldIdeleClassEquivFixed L.field + (hfinite := smallHilbertTowerMiddleAbstractQuotientFinite K L)).symm a ∈ + (_root_.ideleClassNorm E N).range.toAddSubgroup := + smallHilbertFiniteGaloisNormNeighborhood_abstractNormMap_mem_ordinaryNormRange + K L _ haMap + exact smallHilbertFiniteGaloisNormNeighborhood_ordinaryNorm_le K L haOrdinary + +open scoped Classical in +/-- The canonical small-Hilbert subgroup of the actual middle fixed +field is open in the genuine norm topology. -/ +theorem smallHilbertNormSubgroupInRationalClassFormation_isNormOpen : + IsNormOpen rationalIdeleClassRepresentation L.field + (smallHilbertTowerMiddleNormSubgroup K L : + Set + (ambientFixedAddSubgroup + rationalIdeleClassRepresentation L.field)) := by + rw [normTopology_addSubgroup_isOpen_iff] + refine + ⟨smallHilbertFiniteGaloisNormNeighborhood K L, ?_⟩ + change + smallHilbertFiniteGaloisNormNeighborhoodNormSubgroup K L ≤ + smallHilbertTowerMiddleNormSubgroup K L + exact smallHilbertFiniteGaloisNormNeighborhood_normSubgroup_le K L + +open scoped Classical in +/-- The second small Hilbert class field as an actual finite abelian +subextension of the literal first-stage field. -/ +noncomputable def secondSmallHilbertClassFieldSubextension : + FiniteAbelianSubextension L.field := by + let H : FiniteAbelianSubextension.NormOpenAddSubgroup + rationalIdeleClassRepresentation L.field := + ⟨smallHilbertTowerMiddleNormSubgroup K L, + smallHilbertNormSubgroupInRationalClassFormation_isNormOpen K L⟩ + exact + Classical.choose + (FiniteAbelianSubextension.normSubgroupMap_surjective + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (smallHilbertTowerMiddleFiniteAbstractField K L) H) + +open scoped Classical in +/-- The second-stage extension realizes exactly the canonical +small-Hilbert norm subgroup of the actual middle field. -/ +@[simp] +theorem secondSmallHilbertClassFieldSubextension_normSubgroup : + (secondSmallHilbertClassFieldSubextension K L).normSubgroup + rationalIdeleClassRepresentation = + smallHilbertTowerMiddleNormSubgroup K L := by + let H : FiniteAbelianSubextension.NormOpenAddSubgroup + rationalIdeleClassRepresentation L.field := + ⟨smallHilbertTowerMiddleNormSubgroup K L, + smallHilbertNormSubgroupInRationalClassFormation_isNormOpen K L⟩ + have h := + Classical.choose_spec + (FiniteAbelianSubextension.normSubgroupMap_surjective + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (smallHilbertTowerMiddleFiniteAbstractField K L) H) + exact congrArg Subtype.val h + +open scoped Classical in +private noncomputable abbrev secondSmallHilbertClassFieldTopField : Type := + abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (secondSmallHilbertClassFieldSubextension K L).below + +local notation "T₂" => secondSmallHilbertClassFieldTopField K L + +open scoped Classical in +private noncomputable instance + secondSmallHilbertClassFieldSubextensionQuotientFinite : + Finite + (L.field.toSubgroup ⧸ + extensionSubgroup L.field + (secondSmallHilbertClassFieldSubextension K L).field + (secondSmallHilbertClassFieldSubextension K L).below) := + (secondSmallHilbertClassFieldSubextension K L).finite + +open scoped Classical in +private noncomputable instance + secondSmallHilbertClassFieldTopFiniteDimensional : + FiniteDimensional E T₂ := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) L.field + (secondSmallHilbertClassFieldSubextension K L).field + (secondSmallHilbertClassFieldSubextension K L).below + inferInstance inferInstance + +open scoped Classical in +private noncomputable instance + secondSmallHilbertClassFieldTopScalarTower : + IsScalarTower ℚ E T₂ := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + +open scoped Classical in +private noncomputable instance + secondSmallHilbertClassFieldTopAbsoluteFiniteDimensional : + FiniteDimensional ℚ T₂ := + FiniteDimensional.trans ℚ E T₂ + +open scoped Classical in +private noncomputable instance + secondSmallHilbertClassFieldTopNumberField : + NumberField T₂ := + NumberField.of_module_finite ℚ T₂ + +open scoped Classical in +private noncomputable instance + secondSmallHilbertClassFieldTopIsGalois : + IsGalois E T₂ := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) L.field + (secondSmallHilbertClassFieldSubextension K L).field + (secondSmallHilbertClassFieldSubextension K L).below + (secondSmallHilbertClassFieldSubextension K L).normal + +open scoped Classical in +private theorem + secondSmallHilbertClassFieldSubextension_abstractNormMap_eq_actualNormRange : + ((secondSmallHilbertClassFieldSubextension K L).normSubgroup + rationalIdeleClassRepresentation).map + (rationalAbstractFixedFieldIdeleClassEquivFixed + L.field + (hfinite := smallHilbertTowerMiddleAbstractQuotientFinite K L)).symm.toAddMonoidHom = + (_root_.ideleClassNorm E T₂).range.toAddSubgroup := by + change + (finiteNormSubgroup rationalIdeleClassRepresentation + L.field + (secondSmallHilbertClassFieldSubextension K L).field + (secondSmallHilbertClassFieldSubextension K L).below).map + (rationalAbstractFixedFieldIdeleClassEquivFixed + L.field + (hfinite := smallHilbertTowerMiddleAbstractQuotientFinite K L)).symm.toAddMonoidHom = + (_root_.ideleClassNorm E T₂).range.toAddSubgroup + exact + map_rationalFiniteNormSubgroup_eq_ordinaryIdeleClassNormRange_concrete + L.field + (secondSmallHilbertClassFieldSubextension K L).field + (secondSmallHilbertClassFieldSubextension K L).below + (secondSmallHilbertClassFieldSubextension K L).normal + +open scoped Classical in +private theorem + secondSmallHilbertClassFieldSubextension_abstractNormMap_eq_smallHilbertNormSubgroup : + ((secondSmallHilbertClassFieldSubextension K L).normSubgroup + rationalIdeleClassRepresentation).map + (rationalAbstractFixedFieldIdeleClassEquivFixed + L.field + (hfinite := smallHilbertTowerMiddleAbstractQuotientFinite K L)).symm.toAddMonoidHom = + (smallHilbertClassFieldNormSubgroup (K := E)).toAddSubgroup := by + let e : Additive (IdeleClassGroup E) ≃+ + ambientFixedAddSubgroup rationalIdeleClassRepresentation L.field := + rationalAbstractFixedFieldIdeleClassEquivFixed L.field + (hfinite := smallHilbertTowerMiddleAbstractQuotientFinite K L) + let H : AddSubgroup (Additive (IdeleClassGroup E)) := + (smallHilbertClassFieldNormSubgroup (K := E)).toAddSubgroup + let back : AddSubgroup + (ambientFixedAddSubgroup rationalIdeleClassRepresentation L.field) → + AddSubgroup (Additive (IdeleClassGroup E)) := + fun n => n.map e.symm.toAddMonoidHom + have hNorm : + back ((secondSmallHilbertClassFieldSubextension K L).normSubgroup + rationalIdeleClassRepresentation) = + back (smallHilbertTowerMiddleNormSubgroup K L) := + congrArg back (secondSmallHilbertClassFieldSubextension_normSubgroup K L) + have hCancel : back (smallHilbertTowerMiddleNormSubgroup K L) = H := + AddSubgroup.map_comap_eq_self_of_surjective e.symm.surjective H + exact hNorm.trans hCancel + +open scoped Classical in +/-- The actual second small Hilbert class field has exactly the intrinsic +small-Hilbert norm range over the literal middle fixed field. -/ +@[simp] +theorem secondSmallHilbertClassFieldSubextension_ideleClassNorm_range : + (_root_.ideleClassNorm E T₂).range = + smallHilbertClassFieldNormSubgroup (K := E) := by + apply Subgroup.toAddSubgroup.injective + exact + (secondSmallHilbertClassFieldSubextension_abstractNormMap_eq_actualNormRange + K L).symm.trans + (secondSmallHilbertClassFieldSubextension_abstractNormMap_eq_smallHilbertNormSubgroup + K L) + +open scoped Classical in +/-- Compatibility of the typed middle endpoint with the canonical endpoint +used by the conjugation API. -/ +theorem smallHilbertTowerMiddleNormSubgroup_eq_conjugationEndpoint : + smallHilbertTowerMiddleNormSubgroup K L = + smallHilbertNormSubgroupInRationalClassFormation + (L.toFiniteGaloisExtension.toFiniteAbstractFieldExtension).field := by + have hField : + (L.toFiniteGaloisExtension.toFiniteAbstractFieldExtension).field.field = + L.field := by + rfl + unfold smallHilbertNormSubgroupInRationalClassFormation + cases hField + exact smallHilbertTowerMiddleNormSubgroup_eq_map K L + +end RationalFixedField + +section ActualTower + +variable (K : Type) [Field K] [NumberField K] + +open scoped Classical in +/-- The actual second small Hilbert class field over the selected first +small Hilbert class field of `K`. -/ +noncomputable def smallHilbertTowerSecondSubextension : + FiniteAbelianSubextension + (smallHilbertClassFieldSubextension K).field := + secondSmallHilbertClassFieldSubextension + (numberFieldTowerFiniteAbstractField K + (smallHilbertClassFieldNormAmbient K)) + (smallHilbertClassFieldSubextension K) + +open scoped Classical in +/-- Exact norm-subgroup equation for the actual second stage. -/ +@[simp] +theorem smallHilbertTowerSecondSubextension_normSubgroup : + (smallHilbertTowerSecondSubextension K).normSubgroup + rationalIdeleClassRepresentation = + smallHilbertTowerMiddleNormSubgroup + (numberFieldTowerFiniteAbstractField K + (smallHilbertClassFieldNormAmbient K)) + (smallHilbertClassFieldSubextension K) := + secondSmallHilbertClassFieldSubextension_normSubgroup + (numberFieldTowerFiniteAbstractField K + (smallHilbertClassFieldNormAmbient K)) + (smallHilbertClassFieldSubextension K) + +open scoped Classical in +/-- The actual two-stage small Hilbert tower, packaged as a finite +Galois subextension of the original selected base subgroup. -/ +noncomputable def smallHilbertTowerGaloisRealization : + FiniteGaloisSubextension + (smallHilbertClassFieldBaseSubgroup K) := + smallHilbertClassFieldGaloisSubextension + (numberFieldTowerFiniteAbstractField K + (smallHilbertClassFieldNormAmbient K)) + (smallHilbertClassFieldSubextension K) + (smallHilbertTowerSecondSubextension K) + ((smallHilbertTowerSecondSubextension_normSubgroup K).trans + (smallHilbertTowerMiddleNormSubgroup_eq_conjugationEndpoint + (numberFieldTowerFiniteAbstractField K + (smallHilbertClassFieldNormAmbient K)) + (smallHilbertClassFieldSubextension K))) + +end ActualTower + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerUnramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerUnramified.lean new file mode 100644 index 0000000000..955a372c36 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerUnramified.lean @@ -0,0 +1,331 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMaximalSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitAbstractFixedField +/-! +# Unramifiedness of the two-stage small Hilbert tower + +The second-stage class field is selected in the rational absolute class +formation. This file transports its exact abstract norm subgroup back +to the ordinary idele class group of the actual middle fixed field. +The intrinsic small-Hilbert characterization then proves genuine +unramifiedness at both finite and infinite places. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open ClassFormation +open KummerTheory +open LocalClassFieldTheory +open GlobalClassFields + +/-- Transitivity over a number field, with the relative module fixed by +the given algebra before the concrete fixed-field carriers are inserted. -/ +private theorem smallHilbertTowerAbsoluteFiniteDimensionalOfRelative + (F N : Type) [Field F] [NumberField F] [Field N] + [Algebra ℚ N] [Algebra F N] [IsScalarTower ℚ F N] + [FiniteDimensional F N] : + FiniteDimensional ℚ N := + FiniteDimensional.trans ℚ F N + +section SelectedTower + +variable (K : Type) [Field K] [NumberField K] + +/-- The actual top field in the selected two-stage small Hilbert +tower, viewed over the selected first small Hilbert class field. -/ +abbrev smallHilbertTowerTopField := + abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (smallHilbertTowerSecondSubextension K).below + +private noncomputable abbrev smallHilbertTowerFirstStageFiniteAbstractField : + FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) := + let K₀ := + Reciprocity.numberFieldTowerFiniteAbstractField K + (smallHilbertClassFieldNormAmbient K) + let L := smallHilbertClassFieldSubextension K + { field := L.field + finite := by + let : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K₀.field (le_baseField K₀.field)) := + K₀.finite + let : Finite + (K₀.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + K₀.field L.field L.below) := + L.finite + exact + FiniteGaloisSubextension.finite_extension_trans + L.below (le_baseField K₀.field) } + +private noncomputable instance + smallHilbertTowerFirstStageAbsoluteQuotientFinite : + Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (smallHilbertClassFieldSubextension K).field + (le_baseField + (smallHilbertClassFieldSubextension K).field)) := + (smallHilbertTowerFirstStageFiniteAbstractField K).finite + +/-- The relative algebra is the canonical algebra carried by the +intermediate-field presentation of the selected top field. -/ +@[reducible] +private noncomputable instance + smallHilbertTowerTopAlgebra : + Algebra + (smallHilbertClassField K) + (smallHilbertTowerTopField K) := + (smallHilbertTowerTopField K).algebra + +/-- Freeze the scalar-action owner induced by the canonical relative +algebra. -/ +@[reducible] +private noncomputable def + smallHilbertTowerTopSMul : + SMul + (smallHilbertClassField K) + (smallHilbertTowerTopField K) := + Algebra.toSMul (self := smallHilbertTowerTopAlgebra K) + +/-- Freeze the module owner induced by the same canonical relative +algebra. -/ +@[reducible] +private noncomputable def + smallHilbertTowerTopModule : + Module + (smallHilbertClassField K) + (smallHilbertTowerTopField K) := + @Algebra.toModule + (smallHilbertClassField K) + (smallHilbertTowerTopField K) + _ _ + (smallHilbertTowerTopAlgebra K) + +section + +attribute [local instance] smallHilbertTowerTopModule + +/-- The second selected stage is finite-dimensional over the first +small Hilbert class field. -/ +noncomputable instance smallHilbertTowerTopFiniteDimensional : + FiniteDimensional + (smallHilbertClassField K) + (smallHilbertTowerTopField K) := + finiteAbelianSubextensionAbstractRelativeFixedFieldFiniteDimensional + (smallHilbertTowerSecondSubextension K) + +end + +/-- The rational base, first small Hilbert class field, and second +selected stage form the actual scalar tower. -/ +noncomputable instance smallHilbertTowerTopScalarTower : + IsScalarTower ℚ + (smallHilbertClassField K) + (smallHilbertTowerTopField K) := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + +/-- The selected second stage is a finite extension of the rational +field. -/ +noncomputable instance smallHilbertTowerTopAbsoluteFiniteDimensional : + FiniteDimensional ℚ (smallHilbertTowerTopField K) := + smallHilbertTowerAbsoluteFiniteDimensionalOfRelative + (smallHilbertClassField K) + (smallHilbertTowerTopField K) + +/-- The selected second-stage fixed field is a number field. -/ +noncomputable instance smallHilbertTowerTopNumberField : + NumberField (smallHilbertTowerTopField K) := + NumberField.of_module_finite ℚ (smallHilbertTowerTopField K) + +/-- The selected second stage is an abelian Galois extension of the +first small Hilbert class field. -/ +noncomputable instance smallHilbertTowerTopIsAbelianGalois : + IsAbelianGalois + (smallHilbertClassField K) + (smallHilbertTowerTopField K) := + finiteAbelianSubextensionAbstractRelativeFixedFieldIsAbelianGalois + (smallHilbertTowerSecondSubextension K) + +end SelectedTower + +/-- The actual norm range from the selected second stage is exactly +the intrinsic small-Hilbert subgroup of the first stage. -/ +@[simp] +theorem smallHilbertTowerSecondStage_ideleClassNorm_range + (K : Type) [Field K] [NumberField K] : + (_root_.ideleClassNorm + (smallHilbertClassField K) + (smallHilbertTowerTopField K)).range = + smallHilbertClassFieldNormSubgroup + (K := smallHilbertClassField K) := by + let K₀ := + Reciprocity.numberFieldTowerFiniteAbstractField K + (smallHilbertClassFieldNormAmbient K) + let L := smallHilbertClassFieldSubextension K + let F := abstractFixedField ℚ (SeparableClosure ℚ) L.field + let T := + abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (secondSmallHilbertClassFieldSubextension K₀ L).below + have hFType : (F : Type) = smallHilbertClassField K := by + rfl + have hTType : (T : Type) = (smallHilbertTowerTopField K : Type) := by + rfl + cases hFType + cases hTType + exact secondSmallHilbertClassFieldSubextension_ideleClassNorm_range K₀ L + +/-- The actual second stage in the selected two-stage small Hilbert +tower is everywhere unramified over the first stage. -/ +theorem smallHilbertTowerSecondStage_isEverywhereUnramified + (K : Type) [Field K] [NumberField K] : + IsEverywhereUnramified + (smallHilbertClassField K) + (smallHilbertTowerTopField K) := + isEverywhereUnramified_of_normRange_eq_smallHilbertNormSubgroup + (smallHilbertTowerSecondStage_ideleClassNorm_range K) + +/-- In the selected two-stage small Hilbert tower, the maximal abelian +intermediate extension of the top over the original base is exactly +the first small Hilbert class field. -/ +theorem smallHilbertTower_maximalAbelianSubextension_eq_firstStage + (K : Type) [Field K] [NumberField K] : + maximalAbelianSubextension + (smallHilbertTowerGaloisRealization K) = + smallHilbertClassFieldSubextension K := by + classical + let K₀ := + Reciprocity.numberFieldTowerFiniteAbstractField K + (smallHilbertClassFieldNormAmbient K) + let L := smallHilbertClassFieldSubextension K + let M := smallHilbertTowerSecondSubextension K + let P := smallHilbertTowerGaloisRealization K + let F := + abstractFixedField ℚ (SeparableClosure ℚ) K₀.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + let T := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K₀.field (le_baseField K₀.field)) := + K₀.finite + let hLfinite : Finite + (K₀.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + K₀.field L.field L.below) := + L.finite + let hPfinite : Finite + (K₀.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + K₀.field P.field P.below) := + P.finite + let : NumberField F := by + let : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K₀.field hKfinite + exact NumberField.of_module_finite ℚ F + let : NumberField E := by + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + K₀.field L.field L.below hKfinite hLfinite + exact NumberField.of_module_finite F E + let : NumberField T := by + let : FiniteDimensional F T := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + K₀.field P.field P.below hKfinite hPfinite + exact NumberField.of_module_finite F T + have hPM : P.field = M.field := by + simp only [ + P, smallHilbertTowerGaloisRealization, + smallHilbertClassFieldGaloisSubextension, + galoisSubextensionOfConjugateStableAbelianTower_field, + M] + have hPL : P.field.toSubgroup ≤ L.field.toSubgroup := by + rw [hPM] + exact M.below + have hET : E ≤ T := by + intro x hx + change x ∈ abstractFixedField ℚ (SeparableClosure ℚ) L.field at hx + change x ∈ abstractFixedField ℚ (SeparableClosure ℚ) P.field + exact + (abstractFixedField_le ℚ (SeparableClosure ℚ) hPL) hx + let hETAlgebra : Algebra E T := + (IntermediateField.inclusion hET).toRingHom.toAlgebra + let hFETScalarTower : + @IsScalarTower F E T + (Algebra.toSMul (R := F) (A := E)) + hETAlgebra.toSMul + (Algebra.toSMul (R := F) (A := T)) := + IsScalarTower.of_algebraMap_eq' rfl + have hFirst : + IsEverywhereUnramified F E := by + apply + isEverywhereUnramified_of_normRange_eq_smallHilbertNormSubgroup + (K := F) (L := E) + simpa only [F, E, K₀, L] using + (smallHilbertClassField_ideleClassNorm_range_eq_intrinsic + (K := K)) + have hEType : (E : Type) = smallHilbertClassField K := by + rfl + have hTType : (T : Type) = (smallHilbertTowerTopField K : Type) := by + change + (abstractFixedField ℚ (SeparableClosure ℚ) P.field : Type) = + (abstractFixedField ℚ (SeparableClosure ℚ) M.field : Type) + rw [hPM] + have hSecond : + IsEverywhereUnramified E T := by + cases hEType + cases hTType + exact smallHilbertTowerSecondStage_isEverywhereUnramified K + have hunramifiedTop : + IsEverywhereUnramified F T := + IsEverywhereUnramified.trans hFirst hSecond + apply le_antisymm + · exact + maximalAbelianSubextension_le_smallHilbertClassField_of_everywhereUnramified + K₀ L P + (GlobalClassFields.smallHilbertClassFieldSubextension_normSubgroup + (K := K)) + hunramifiedTop + · exact + smallHilbertTowerBase_le_maximalAbelianSubextension + K₀ L M + ((smallHilbertTowerSecondSubextension_normSubgroup K).trans + (smallHilbertTowerMiddleNormSubgroup_eq_conjugationEndpoint K₀ L)) + +end IdealClassFieldTheory +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity.lean new file mode 100644 index 0000000000..3af54777a1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity.lean @@ -0,0 +1,96 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.AbstractFixedFieldGlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicAbstractFixedFieldArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValueTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicNormOneCorrection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicPrincipalIdele +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicTorsionFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedGeometricRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedLocalGlobalCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicZHatBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationFinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteLocalFamily +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertProductFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicLocalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceCyclotomicFrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinFiniteSupportApproximation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianizationNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFamilyAlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFiniteFactorNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormulaAlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitAbstractFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevelCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormProof +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormStatement +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescentCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPoints +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassNormTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinSurjectivity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteHilbertFactorNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteLocalGlobalArtinCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfinitePlaceArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IntermediateNormAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibHilbertProductFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibTopologicalGlobalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianGlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.NormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.PowerResidueReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ProductFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicArithmeticProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicCharacterRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlaceArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicLocalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalAwayProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalPrimeFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicRayNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicZHatRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrimeFactorization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrincipalLocalUnit +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalQuadraticPowerResidueReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidueAbelianization + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean new file mode 100644 index 0000000000..641afe1860 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean @@ -0,0 +1,1686 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +/-! +# Global norm residue on actual fixed fields + +An abstract finite abelian subextension of the rational absolute Galois +group determines an actual finite abelian extension between its two +fixed number fields. This file transports the abstract norm-residue +symbol directly to the ordinary idele-class norm quotient of those +fixed fields. + +Keeping this construction in one ambient separable closure is essential +for the norm--restriction diagrams: no independently chosen embedding of +either field is introduced. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open GlobalClassFields +open KummerTheory +open AlgebraicNumberTheory +open LocalClassFieldTheory +open RamificationTheory + +/-- The algebra structure on the rational separable closure induced by a +specified rational field embedding. It is deliberately not an instance: +different embeddings of the same field need not induce definitionally equal +algebra structures. -/ +@[reducible] +noncomputable def rationalEmbeddingSeparableClosureAlgebra + {F : Type} [Field F] [Algebra ℚ F] + (i : F →ₐ[ℚ] SeparableClosure ℚ) : + Algebra F (SeparableClosure ℚ) := + i.toRingHom.toAlgebra + +/-- Two rational embeddings of the same number field into the fixed +rational separable closure differ by an automorphism of that +separable closure. -/ +theorem exists_numberFieldEmbeddingComparisonAutomorphism + {F : Type} [Field F] [NumberField F] + (i j : F →ₐ[ℚ] SeparableClosure ℚ) : + ∃ σ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ, + ∀ x : F, σ (i x) = j x := by + let hAlgebra : Algebra F (SeparableClosure ℚ) := + rationalEmbeddingSeparableClosureAlgebra i + let hScalarTower : IsScalarTower ℚ F (SeparableClosure ℚ) := + IsScalarTower.of_algebraMap_eq' i.comp_algebraMap.symm + let hSeparable : Algebra.IsSeparable F (SeparableClosure ℚ) := + Algebra.isSeparable_tower_top_of_isSeparable + ℚ F (SeparableClosure ℚ) + obtain ⟨φ, hφ⟩ := + (IsSepClosed.surjective_domRestrict_of_isSeparable + (K := ℚ) (L := F) + (M := SeparableClosure ℚ) + (E := SeparableClosure ℚ)) j + let σ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ := + AlgEquiv.ofBijective φ + (Normal.toIsAlgebraic.algHom_bijective₂ + φ (AlgHom.id ℚ (SeparableClosure ℚ))).1 + refine ⟨σ, ?_⟩ + intro x + have hx := + congrArg (fun ψ : F →ₐ[ℚ] SeparableClosure ℚ => ψ x) hφ + exact hx + +/-- The canonical comparison automorphism between two rational +embeddings of one number field into the fixed separable closure. -/ +noncomputable def numberFieldEmbeddingComparisonAutomorphism + {F : Type} [Field F] [NumberField F] + (i j : F →ₐ[ℚ] SeparableClosure ℚ) : + SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ := + Classical.choose + (exists_numberFieldEmbeddingComparisonAutomorphism i j) + +/-- The comparison automorphism carries the first embedded copy of the +number field to the second one pointwise. -/ +@[simp] +theorem numberFieldEmbeddingComparisonAutomorphism_apply + {F : Type} [Field F] [NumberField F] + (i j : F →ₐ[ℚ] SeparableClosure ℚ) + (x : F) : + numberFieldEmbeddingComparisonAutomorphism i j (i x) = + j x := + Classical.choose_spec + (exists_numberFieldEmbeddingComparisonAutomorphism i j) x + +/-- Conjugating the fixing subgroup of one embedded copy of a number +field by the comparison automorphism gives the fixing subgroup of the +other embedded copy. -/ +theorem conjugateClosedFixingSubgroup_embeddingRange + {F : Type} [Field F] [NumberField F] + (i j : F →ₐ[ℚ] SeparableClosure ℚ) : + conjugateClosedSubgroup + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) i.fieldRange) + (numberFieldEmbeddingComparisonAutomorphism j i) = + RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) j.fieldRange := by + let s := + numberFieldEmbeddingComparisonAutomorphism j i + ext τ + change + τ ∈ conjugateClosedSubgroup + (closedFixingSubgroup ℚ (SeparableClosure ℚ) i.fieldRange) s ↔ + τ ∈ closedFixingSubgroup ℚ (SeparableClosure ℚ) j.fieldRange + rw [conjugateClosedSubgroup_mem] + change + s * τ * s⁻¹ ∈ i.fieldRange.fixingSubgroup ↔ + τ ∈ j.fieldRange.fixingSubgroup + rw [IntermediateField.mem_fixingSubgroup_iff, + IntermediateField.mem_fixingSubgroup_iff] + constructor + · intro h x hx + rcases hx with ⟨y, rfl⟩ + have hi := h (i y) ⟨y, rfl⟩ + have hs : + s (j y) = i y := + numberFieldEmbeddingComparisonAutomorphism_apply j i y + change s (τ (s.symm (i y))) = i y at hi + have hpre : s.symm (i y) = j y := by + rw [← hs, s.symm_apply_apply] + rw [hpre, ← hs] at hi + exact s.injective hi + · intro h x hx + rcases hx with ⟨y, rfl⟩ + have hj := h (j y) ⟨y, rfl⟩ + have hs : + s (j y) = i y := + numberFieldEmbeddingComparisonAutomorphism_apply j i y + change s (τ (s.symm (i y))) = i y + have hpre : s.symm (i y) = j y := by + rw [← hs, s.symm_apply_apply] + rw [hpre, hj, hs] + +section EmbeddedNumberFieldRealization + +local instance numberFieldEmbeddedIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] + : IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +local instance numberFieldEmbeddedIdeleClassSubgroupNormal + {F : Type} [Field F] [NumberField F] + (N : Subgroup (IdeleClassGroup F)) : N.Normal := + N.normal_of_isMulCommutative + +variable + (K L : Type) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + +/-- The lower embedding obtained by restricting an explicitly supplied +embedding of the top field into the rational separable closure. -/ +noncomputable def numberFieldEmbeddedLowerEmbedding + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + K →ₐ[ℚ] SeparableClosure ℚ := + j.comp (IsScalarTower.toAlgHom ℚ K L) + +/-- The exact algebra structure on the rational separable closure induced by +the lower embedding of an explicitly embedded number-field tower. Keeping +this as a reducible definition lets every use of the associated separable- +closure equivalence share one definitionally identical algebra structure. -/ +@[reducible] +noncomputable def numberFieldEmbeddedSeparableClosureAlgebra + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + Algebra K (SeparableClosure ℚ) := + rationalEmbeddingSeparableClosureAlgebra + (numberFieldEmbeddedLowerEmbedding K L j) + +/-- The fixing subgroup of the explicitly embedded lower field. -/ +abbrev numberFieldEmbeddedBaseSubgroup + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) := + closedFixingSubgroup ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedLowerEmbedding K L j).fieldRange + +/-- The fixing subgroup of the explicitly embedded top field. -/ +abbrev numberFieldEmbeddedTopSubgroup + (_K L : Type) [Field L] [NumberField L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) := + closedFixingSubgroup ℚ (SeparableClosure ℚ) j.fieldRange + +/-- The top fixing subgroup lies in the lower fixing subgroup. -/ +theorem numberFieldEmbeddedTopSubgroup_le_baseSubgroup + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + (numberFieldEmbeddedTopSubgroup K L j).toSubgroup ≤ + (numberFieldEmbeddedBaseSubgroup K L j).toSubgroup := by + change + j.fieldRange.fixingSubgroup ≤ + (numberFieldEmbeddedLowerEmbedding K L j).fieldRange.fixingSubgroup + apply + (numberFieldEmbeddedLowerEmbedding K L j).fieldRange.fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap K L y, rfl⟩ + +/-- The separable closure of the actual lower field, identified with +the rational separable closure carrying the algebra structure induced +by an explicit compatible embedding. -/ +noncomputable def numberFieldEmbeddedSeparableClosureEquiv + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldEmbeddedSeparableClosureAlgebra K L j + SeparableClosure K ≃ₐ[K] SeparableClosure ℚ := by + letI : Algebra K (SeparableClosure ℚ) := + numberFieldEmbeddedSeparableClosureAlgebra K L j + letI hScalarTower : IsScalarTower ℚ K (SeparableClosure ℚ) := + IsScalarTower.of_algebraMap_eq' + (numberFieldEmbeddedLowerEmbedding K L j).comp_algebraMap.symm + letI hseparable : Algebra.IsSeparable K (SeparableClosure ℚ) := + Algebra.isSeparable_tower_top_of_isSeparable + ℚ K (SeparableClosure ℚ) + letI hSepClosure : IsSepClosure K (SeparableClosure ℚ) := + ⟨IsSepClosure.sep_closed ℚ, hseparable⟩ + exact + IsSepClosure.equiv K + (SeparableClosure K) (SeparableClosure ℚ) + +/-- The relative subgroup arising from an explicit compatible +number-field embedding is normal. -/ +theorem numberFieldEmbeddedExtensionSubgroup_normal + [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + (CyclicCohomology.extensionSubgroup + (numberFieldEmbeddedBaseSubgroup K L j) + (numberFieldEmbeddedTopSubgroup K L j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j)).Normal := by + let i := numberFieldEmbeddedLowerEmbedding K L j + let hAlgebra : Algebra K (SeparableClosure ℚ) := + numberFieldEmbeddedSeparableClosureAlgebra K L j + let e := numberFieldEmbeddedSeparableClosureEquiv K L j + change + (CyclicCohomology.extensionSubgroup + (closedFixingSubgroup ℚ (SeparableClosure ℚ) + (AlgHom.fieldRange i)) + (closedFixingSubgroup ℚ (SeparableClosure ℚ) + (AlgHom.fieldRange j)) _).Normal + exact ambientEmbeddedExtensionSubgroup_normal ℚ K L j e + +/-- The normality witness for an explicitly embedded tower, registered at +the precise subgroup used by the downstream quotient constructions. -/ +noncomputable local instance + numberFieldEmbeddedExtensionSubgroupNormal + [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + (CyclicCohomology.extensionSubgroup + (numberFieldEmbeddedBaseSubgroup K L j) + (numberFieldEmbeddedTopSubgroup K L j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j)).Normal := + numberFieldEmbeddedExtensionSubgroup_normal K L j + +/-- The relative quotient arising from an explicit compatible +number-field embedding is finite. -/ +theorem numberFieldEmbeddedExtensionQuotient_finite + [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + Finite + ((numberFieldEmbeddedBaseSubgroup K L j).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (numberFieldEmbeddedBaseSubgroup K L j) + (numberFieldEmbeddedTopSubgroup K L j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j)) := by + let i := numberFieldEmbeddedLowerEmbedding K L j + let hAlgebra : Algebra K (SeparableClosure ℚ) := + numberFieldEmbeddedSeparableClosureAlgebra K L j + let e := numberFieldEmbeddedSeparableClosureEquiv K L j + change + Finite + ((closedFixingSubgroup ℚ (SeparableClosure ℚ) + (AlgHom.fieldRange i)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (closedFixingSubgroup ℚ (SeparableClosure ℚ) + (AlgHom.fieldRange i)) + (closedFixingSubgroup ℚ (SeparableClosure ℚ) + (AlgHom.fieldRange j)) _) + exact ambientEmbeddedExtensionQuotient_finite ℚ K L j e + +/-- The relative-index witness for an explicitly embedded tower, registered +at the exact quotient consumed by `FiniteNormQuotient`. -/ +noncomputable local instance + numberFieldEmbeddedExtensionQuotientFinite + [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + Finite + ((numberFieldEmbeddedBaseSubgroup K L j).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (numberFieldEmbeddedBaseSubgroup K L j) + (numberFieldEmbeddedTopSubgroup K L j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j)) := + numberFieldEmbeddedExtensionQuotient_finite K L j + +/-- The finite abstract field determined by the lower member of an +explicitly embedded number-field tower. -/ +noncomputable abbrev numberFieldEmbeddedFiniteAbstractField + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) where + field := numberFieldEmbeddedBaseSubgroup K L j + finite := by + simpa only [numberFieldEmbeddedBaseSubgroup] using + (ambientEmbeddedAbsoluteQuotientFinite + ℚ K (numberFieldEmbeddedLowerEmbedding K L j)) + +/-- The absolute-index witness for the lower member of an explicitly embedded +tower, registered at its specialized quotient type. -/ +noncomputable local instance + numberFieldEmbeddedAbsoluteQuotientFinite + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (numberFieldEmbeddedBaseSubgroup K L j) + (le_baseField + (numberFieldEmbeddedBaseSubgroup K L j))) := + (numberFieldEmbeddedFiniteAbstractField K L j).finite + +/-- The finite Galois subextension determined by an explicitly embedded +number-field tower. -/ +noncomputable abbrev numberFieldEmbeddedFiniteGaloisSubextension + [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + FiniteGaloisSubextension + (numberFieldEmbeddedBaseSubgroup K L j) where + field := numberFieldEmbeddedTopSubgroup K L j + below := numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j + normal := numberFieldEmbeddedExtensionSubgroup_normal K L j + finite := numberFieldEmbeddedExtensionQuotient_finite K L j + +/-- The embedded Galois subextension has the fixing subgroup of the original top field. -/ +theorem numberFieldEmbeddedFiniteGaloisSubextension_field + [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + (numberFieldEmbeddedFiniteGaloisSubextension K L j).field = + numberFieldEmbeddedTopSubgroup K L j := rfl + +/-- Shared finite-dimensional data for the fixed field of the lower subgroup +in an explicitly embedded number-field tower. -/ +noncomputable local instance + numberFieldEmbeddedAbstractFixedFieldFiniteDimensional + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup K L j)) := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup K L j) + (numberFieldEmbeddedAbsoluteQuotientFinite K L j) + +/-- Shared relative finite-dimensional data for the two fixed fields of an +explicitly embedded number-field tower. -/ +noncomputable local instance + numberFieldEmbeddedAbstractRelativeFixedFieldFiniteDimensional + [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + FiniteDimensional + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup K L j)) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j)) := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup K L j) + (numberFieldEmbeddedTopSubgroup K L j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j) + (numberFieldEmbeddedAbsoluteQuotientFinite K L j) + (numberFieldEmbeddedExtensionQuotientFinite K L j) + +local instance numberFieldEmbeddedAbstractFixedFieldScalarTower + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + IsScalarTower ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup K L j)) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j)) := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + +noncomputable local instance + numberFieldEmbeddedAbstractRelativeFixedFieldAbsoluteFiniteDimensional + [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + FiniteDimensional ℚ + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j)) := + FiniteDimensional.trans ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup K L j)) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j)) + +noncomputable local instance + numberFieldEmbeddedAbstractFixedFieldNumberField + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + NumberField + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup K L j)) := + NumberField.of_module_finite ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup K L j)) + +noncomputable local instance + numberFieldEmbeddedAbstractRelativeFixedFieldNumberField + [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + NumberField + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j)) := + NumberField.of_module_finite ℚ + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j)) + +noncomputable local instance + numberFieldEmbeddedAbstractRelativeFixedFieldRestrictScalarsFiniteDimensional + [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + FiniteDimensional ℚ + ((abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j)).restrictScalars ℚ) := by + change FiniteDimensional ℚ + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j)) + infer_instance + +noncomputable local instance + numberFieldEmbeddedAbstractRelativeFixedFieldRestrictScalarsNumberField + [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + NumberField + ((abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j)).restrictScalars ℚ) := + NumberField.of_module_finite ℚ _ + +/-- Inclusion of abstract fixed fields gives the scalar-restricted relative fixed field an algebra +structure over the base fixed field. -/ +noncomputable local instance + numberFieldEmbeddedAbstractRelativeFixedFieldRestrictScalarsAlgebra + + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + Algebra + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup K L j)) + ((abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j)).restrictScalars ℚ) := + (IntermediateField.inclusion + (abstractFixedField_le ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j))).toRingHom.toAlgebra + +noncomputable local instance + numberFieldEmbeddedAbstractRelativeFixedFieldIsGalois + [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + IsGalois + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup K L j)) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j)) := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup K L j) + (numberFieldEmbeddedTopSubgroup K L j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j) + (numberFieldEmbeddedExtensionSubgroupNormal K L j) + +/-- The quotient of the two explicitly embedded fixing subgroups is +the actual relative Galois group. -/ +noncomputable def + numberFieldEmbeddedExtensionQuotientEquivGaloisGroup + [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + (numberFieldEmbeddedFiniteGaloisSubextension K L j).extensionQuotient ≃* + Gal(L / K) := by + let i := numberFieldEmbeddedLowerEmbedding K L j + letI hAlgebra : Algebra K (SeparableClosure ℚ) := + numberFieldEmbeddedSeparableClosureAlgebra K L j + let e := numberFieldEmbeddedSeparableClosureEquiv K L j + let H₀ := + closedFixingSubgroup ℚ (SeparableClosure ℚ) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup ℚ (SeparableClosure ℚ) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change j.fieldRange.fixingSubgroup ≤ i.fieldRange.fixingSubgroup + apply i.fieldRange.fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap K L y, rfl⟩ + letI : (CyclicCohomology.extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal ℚ K L j e + change + (H₀.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H₀ J₀ hJH) ≃* + Gal(L / K) + exact ambientEmbeddedExtensionQuotientEquivGaloisGroup ℚ K L j e + +/-- The original lower field is canonically equivalent to the fixed +field of its explicitly embedded fixing subgroup. -/ +noncomputable def numberFieldEmbeddedAbstractBaseFieldEquiv + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + K ≃ₐ[ℚ] + abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup K L j) := + (numberFieldEmbeddedLowerEmbedding K L j).equivFieldRange.trans + (IntermediateField.equivOfEq + (InfiniteGalois.fixedField_fixingSubgroup + (numberFieldEmbeddedLowerEmbedding K L j).fieldRange).symm) + +/-- The original top field is canonically equivalent to the relative +fixed field of its explicitly embedded fixing subgroup. -/ +noncomputable def numberFieldEmbeddedAbstractTopFieldEquiv + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + L ≃ₐ[ℚ] + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup + K L j)).restrictScalars ℚ := + j.equivFieldRange.trans + (IntermediateField.equivOfEq + (InfiniteGalois.fixedField_fixingSubgroup j.fieldRange).symm) + +/-- The two explicit fixed-field equivalences commute with the tower +algebra maps. -/ +theorem numberFieldEmbeddedAbstractFieldEquiv_algebraMap + (j : L →ₐ[ℚ] SeparableClosure ℚ) + (x : K) : + numberFieldEmbeddedAbstractTopFieldEquiv K L j + (algebraMap K L x) = + algebraMap + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup K L j)) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j)) + (numberFieldEmbeddedAbstractBaseFieldEquiv K L j x) := by + apply Subtype.ext + rfl + +/-- The ordinary idele class group of the explicitly embedded lower +field, transported to the fixed part of the rational absolute +idele-class representation. -/ +noncomputable def numberFieldEmbeddedIdeleClassEquivAmbientFixed + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + Additive (IdeleClassGroup K) ≃+ + ambientFixedAddSubgroup + rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K L j) := by + let H := numberFieldEmbeddedBaseSubgroup K L j + exact + (MulEquiv.toAdditive + (ideleClassCongr + (numberFieldEmbeddedAbstractBaseFieldEquiv K L j))).trans + (rationalAbstractFixedFieldIdeleClassEquivFixed H) + +/-- The abstract finite norm quotient of an explicitly embedded tower +is its genuine ordinary idele-class norm quotient. -/ +noncomputable def + numberFieldEmbeddedFiniteNormQuotientEquivIdeleClassNormQuotient + [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K L j) + (numberFieldEmbeddedTopSubgroup K L j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j) ≃+ + Additive + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + let hnormal := + numberFieldEmbeddedExtensionSubgroupNormal K L j + let H := numberFieldEmbeddedBaseSubgroup K L j + let J := numberFieldEmbeddedTopSubgroup K L j + let hJH := + numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j + let fixedFieldEquiv := + rationalFiniteNormQuotientEquivIdeleClassNormQuotient + H J hJH hnormal + let actualFieldEquiv := + ordinaryIdeleClassNormQuotientCongrOfAlgEquiv + (numberFieldEmbeddedAbstractBaseFieldEquiv K L j) + (numberFieldEmbeddedAbstractTopFieldEquiv K L j) + (numberFieldEmbeddedAbstractFieldEquiv_algebraMap K L j) + exact + fixedFieldEquiv.trans + (MulEquiv.toAdditive actualFieldEquiv.symm) + +private theorem numberFieldEmbeddedOrdinaryNormQuotientCongr_symm_mk + {K₀ L₀ K₁ L₁ : Type} + [Field K₀] [NumberField K₀] + [Field L₀] [NumberField L₀] [Algebra K₀ L₀] + [Field K₁] [NumberField K₁] + [Field L₁] [NumberField L₁] [Algebra K₁ L₁] + (eK : K₀ ≃ₐ[ℚ] K₁) + (eL : L₀ ≃ₐ[ℚ] L₁) + (h : ∀ x : K₀, + eL (algebraMap K₀ L₀ x) = + algebraMap K₁ L₁ (eK x)) + (c : IdeleClassGroup K₁) : + (ordinaryIdeleClassNormQuotientCongrOfAlgEquiv eK eL h).symm + (QuotientGroup.mk' + (_root_.ideleClassNorm K₁ L₁).range c) = + QuotientGroup.mk' + (_root_.ideleClassNorm K₀ L₀).range + ((ideleClassCongr eK).symm c) := by + let e := ordinaryIdeleClassNormQuotientCongrOfAlgEquiv eK eL h + apply e.injective + rw [e.apply_symm_apply, + ordinaryIdeleClassNormQuotientCongrOfAlgEquiv_mk, + MulEquiv.apply_symm_apply] + +private noncomputable def numberFieldEmbeddedFiniteNormClassPublicValue + [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) + (a : ambientFixedAddSubgroup rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K L j)) : + Additive + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + numberFieldEmbeddedFiniteNormQuotientEquivIdeleClassNormQuotient + K L j + (finiteNormClass rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K L j) + (numberFieldEmbeddedTopSubgroup K L j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j) + a) + +private noncomputable def numberFieldEmbeddedFiniteNormClassExpectedValue + + (j : L →ₐ[ℚ] SeparableClosure ℚ) + (a : ambientFixedAddSubgroup rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K L j)) : + Additive + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + Additive.ofMul + (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range + (Additive.toMul + ((numberFieldEmbeddedIdeleClassEquivAmbientFixed K L j).symm a))) + +private noncomputable def + numberFieldEmbeddedFiniteNormClassDirectComparisonValue + [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) + (a : ambientFixedAddSubgroup rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K L j)) : + Additive + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + let hnormal := + numberFieldEmbeddedExtensionSubgroupNormal K L j + let H := numberFieldEmbeddedBaseSubgroup K L j + let J := numberFieldEmbeddedTopSubgroup K L j + let hJH := + numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j + let fixedFieldEquiv := + rationalFiniteNormQuotientEquivIdeleClassNormQuotient + H J hJH hnormal + let actualFieldEquiv := + ordinaryIdeleClassNormQuotientCongrOfAlgEquiv + (numberFieldEmbeddedAbstractBaseFieldEquiv K L j) + (numberFieldEmbeddedAbstractTopFieldEquiv K L j) + (numberFieldEmbeddedAbstractFieldEquiv_algebraMap K L j) + exact + MulEquiv.toAdditive actualFieldEquiv.symm + (fixedFieldEquiv + (finiteNormClass rationalIdeleClassRepresentation + H J hJH a)) + +private theorem + numberFieldEmbeddedFiniteNormClassPublicValue_eq_directComparison + [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) + (a : ambientFixedAddSubgroup rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K L j)) : + numberFieldEmbeddedFiniteNormClassPublicValue K L j a = + numberFieldEmbeddedFiniteNormClassDirectComparisonValue K L j a := by + unfold numberFieldEmbeddedFiniteNormClassPublicValue + unfold numberFieldEmbeddedFiniteNormQuotientEquivIdeleClassNormQuotient + unfold numberFieldEmbeddedFiniteNormClassDirectComparisonValue + rfl + +private noncomputable def numberFieldEmbeddedActualNormClassRepresentativeValue + [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) + (a : ambientFixedAddSubgroup rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K L j)) : + Additive + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + let H := numberFieldEmbeddedBaseSubgroup K L j + let hJH := numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j + let F := abstractFixedField ℚ (SeparableClosure ℚ) H + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hJH + let actualFieldEquiv := + ordinaryIdeleClassNormQuotientCongrOfAlgEquiv + (numberFieldEmbeddedAbstractBaseFieldEquiv K L j) + (numberFieldEmbeddedAbstractTopFieldEquiv K L j) + (numberFieldEmbeddedAbstractFieldEquiv_algebraMap K L j) + exact + Additive.ofMul + (actualFieldEquiv.symm + (QuotientGroup.mk' + (_root_.ideleClassNorm F E).range + (Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed H).symm a)))) + +private theorem + numberFieldEmbeddedFiniteNormClassDirectComparison_eq_actualValue + [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) + (a : ambientFixedAddSubgroup rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K L j)) : + numberFieldEmbeddedFiniteNormClassDirectComparisonValue K L j a = + numberFieldEmbeddedActualNormClassRepresentativeValue K L j a := by + let hnormal := numberFieldEmbeddedExtensionSubgroupNormal K L j + let H := numberFieldEmbeddedBaseSubgroup K L j + let J := numberFieldEmbeddedTopSubgroup K L j + let hJH := numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j + let actualFieldEquiv := + ordinaryIdeleClassNormQuotientCongrOfAlgEquiv + (numberFieldEmbeddedAbstractBaseFieldEquiv K L j) + (numberFieldEmbeddedAbstractTopFieldEquiv K L j) + (numberFieldEmbeddedAbstractFieldEquiv_algebraMap K L j) + have hfixed := + rationalFiniteNormQuotientEquivIdeleClassNormQuotient_finiteNormClass + H J hJH hnormal a + unfold numberFieldEmbeddedFiniteNormClassDirectComparisonValue + unfold numberFieldEmbeddedActualNormClassRepresentativeValue + exact congrArg (MulEquiv.toAdditive actualFieldEquiv.symm) hfixed + +private theorem numberFieldEmbeddedActualNormClassRepresentativeValue_eq_expected + [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) + (a : ambientFixedAddSubgroup rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K L j)) : + numberFieldEmbeddedActualNormClassRepresentativeValue K L j a = + numberFieldEmbeddedFiniteNormClassExpectedValue K L j a := by + let H := numberFieldEmbeddedBaseSubgroup K L j + let hJH := numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j + let F := abstractFixedField ℚ (SeparableClosure ℚ) H + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hJH + let actualFieldEquiv := + ordinaryIdeleClassNormQuotientCongrOfAlgEquiv + (numberFieldEmbeddedAbstractBaseFieldEquiv K L j) + (numberFieldEmbeddedAbstractTopFieldEquiv K L j) + (numberFieldEmbeddedAbstractFieldEquiv_algebraMap K L j) + let c : IdeleClassGroup F := + Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed H).symm a) + unfold numberFieldEmbeddedActualNormClassRepresentativeValue + unfold numberFieldEmbeddedFiniteNormClassExpectedValue + change + Additive.ofMul + (actualFieldEquiv.symm + (QuotientGroup.mk' + (_root_.ideleClassNorm F E).range c)) = + Additive.ofMul + (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range + ((ideleClassCongr + (numberFieldEmbeddedAbstractBaseFieldEquiv K L j)).symm c)) + exact + congrArg Additive.ofMul + (numberFieldEmbeddedOrdinaryNormQuotientCongr_symm_mk + (numberFieldEmbeddedAbstractBaseFieldEquiv K L j) + (numberFieldEmbeddedAbstractTopFieldEquiv K L j) + (numberFieldEmbeddedAbstractFieldEquiv_algebraMap K L j) c) + +/-- On a finite norm-class representative, the explicit fixed-field +comparison is the genuine ordinary idele-class quotient. -/ +@[simp] +theorem + numberFieldEmbeddedFiniteNormQuotientEquivIdeleClassNormQuotient_finiteNormClass + [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) + (a : ambientFixedAddSubgroup rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K L j)) : + numberFieldEmbeddedFiniteNormQuotientEquivIdeleClassNormQuotient K L j + (finiteNormClass rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K L j) + (numberFieldEmbeddedTopSubgroup K L j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j) a) = + Additive.ofMul + (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range + (Additive.toMul + ((numberFieldEmbeddedIdeleClassEquivAmbientFixed K L j).symm a))) := by + change + numberFieldEmbeddedFiniteNormClassPublicValue K L j a = + numberFieldEmbeddedFiniteNormClassExpectedValue K L j a + exact + (numberFieldEmbeddedFiniteNormClassPublicValue_eq_directComparison + K L j a).trans + ((numberFieldEmbeddedFiniteNormClassDirectComparison_eq_actualValue + K L j a).trans + (numberFieldEmbeddedActualNormClassRepresentativeValue_eq_expected + K L j a)) + +/-- On an ordinary idele class, the explicit fixed-part realization +followed by the abstract finite norm-class map is the genuine quotient +class modulo the ordinary idele-class norm. -/ +theorem + numberFieldEmbeddedFiniteNormQuotientEquivIdeleClassNormQuotient_ideleClass + [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) + (c : IdeleClassGroup K) : + numberFieldEmbeddedFiniteNormQuotientEquivIdeleClassNormQuotient K L j + (finiteNormClass rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K L j) + (numberFieldEmbeddedTopSubgroup K L j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j) + (numberFieldEmbeddedIdeleClassEquivAmbientFixed + K L j (Additive.ofMul c))) = + Additive.ofMul + (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range c) := by + simpa only [AddEquiv.symm_apply_apply, toMul_ofMul] using + (numberFieldEmbeddedFiniteNormQuotientEquivIdeleClassNormQuotient_finiteNormClass + K L j + (numberFieldEmbeddedIdeleClassEquivAmbientFixed + K L j (Additive.ofMul c))) + +variable [FiniteDimensional K L] [IsAbelianGalois K L] + +/-- The abelianized quotient of the explicitly embedded tower is the +actual abelian Galois group. -/ +noncomputable def + numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisGroup + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + Additive + (Abelianization + (numberFieldEmbeddedFiniteGaloisSubextension K L j).extensionQuotient) ≃+ + Additive Gal(L / K) := + MulEquiv.toAdditive + ((MulEquiv.abelianizationCongr + (numberFieldEmbeddedExtensionQuotientEquivGaloisGroup K L j)).trans + (Abelianization.equivOfComm : + Gal(L / K) ≃* + Abelianization Gal(L / K)).symm) + +/-- The actual global norm-residue equivalence constructed from an +explicit compatible embedding of a finite abelian number-field +extension into the rational separable closure. -/ +noncomputable def globalNormResidueEquivOfEmbedding + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + Additive + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≃+ + Additive Gal(L / K) := by + let eNorm : + FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K L j) + (numberFieldEmbeddedTopSubgroup K L j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j) ≃+ + Additive + (Abelianization + (numberFieldEmbeddedFiniteGaloisSubextension K L j).extensionQuotient) := + rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldEmbeddedFiniteAbstractField K L j) + (numberFieldEmbeddedFiniteGaloisSubextension K L j) + exact + (numberFieldEmbeddedFiniteNormQuotientEquivIdeleClassNormQuotient + K L j).symm.trans + (eNorm.trans + (numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisGroup + K L j)) + +/-- The explicit-embedding norm-residue equivalence on a finite norm class. -/ +theorem globalNormResidueEquivOfEmbedding_finiteNormClass + (j : L →ₐ[ℚ] SeparableClosure ℚ) + (x : FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K L j) + (numberFieldEmbeddedTopSubgroup K L j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j)) : + globalNormResidueEquivOfEmbedding K L j + (numberFieldEmbeddedFiniteNormQuotientEquivIdeleClassNormQuotient + K L j x) = + numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisGroup K L j + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldEmbeddedFiniteAbstractField K L j) + (numberFieldEmbeddedFiniteGaloisSubextension K L j) x) := by + simp only [globalNormResidueEquivOfEmbedding, AddEquiv.trans_apply, + AddEquiv.symm_apply_apply] + +/-- The global norm-residue homomorphism obtained from an explicit +compatible embedding. -/ +noncomputable def globalNormResidueMonoidHomOfEmbedding + (j : L →ₐ[ℚ] SeparableClosure ℚ) : + IdeleClassGroup K →* Gal(L / K) := by + let e : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≃* + Gal(L / K) := + AddEquiv.toMultiplicative + (globalNormResidueEquivOfEmbedding K L j) + exact + e.toMonoidHom.comp + (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range) + +/-- Evaluation of the explicit-embedding global norm-residue map is +the abstract norm-residue symbol evaluated on the corresponding genuine +fixed-part finite norm class. -/ +@[simp] +theorem globalNormResidueMonoidHomOfEmbedding_apply + (j : L →ₐ[ℚ] SeparableClosure ℚ) + (c : IdeleClassGroup K) : + globalNormResidueMonoidHomOfEmbedding K L j c = + Additive.toMul + (numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisGroup + K L j + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldEmbeddedFiniteAbstractField K L j) + (numberFieldEmbeddedFiniteGaloisSubextension K L j) + (finiteNormClass rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K L j) + (numberFieldEmbeddedTopSubgroup K L j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L j) + (numberFieldEmbeddedIdeleClassEquivAmbientFixed + K L j (Additive.ofMul c))))) := by + have hclass := + numberFieldEmbeddedFiniteNormQuotientEquivIdeleClassNormQuotient_ideleClass + K L j c + change + Additive.toMul + (numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisGroup + K L j + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldEmbeddedFiniteAbstractField K L j) + (numberFieldEmbeddedFiniteGaloisSubextension K L j) + ((numberFieldEmbeddedFiniteNormQuotientEquivIdeleClassNormQuotient + K L j).symm + (Additive.ofMul + (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range c))))) = + _ + rw [← hclass, + (numberFieldEmbeddedFiniteNormQuotientEquivIdeleClassNormQuotient + K L j).symm_apply_apply] + +omit [FiniteDimensional K L] [IsAbelianGalois K L] in +/-- The ambient-fixed idèle-class transport for the standard embedding is +the same map as the transport for an explicitly supplied embedding. This +comparison is kept at the transport boundary, before forming norm quotients +or applying reciprocity. -/ +theorem numberFieldTowerIdeleClassEquivAmbientFixed_eq_embedded_standard : + numberFieldTowerIdeleClassEquivAmbientFixed K L = + numberFieldEmbeddedIdeleClassEquivAmbientFixed K L + (numberFieldSeparableClosureEmbedding L) := by + let j := numberFieldSeparableClosureEmbedding L + have hBase : + numberFieldTowerAbstractBaseFieldEquiv K L = + numberFieldEmbeddedAbstractBaseFieldEquiv K L j := by + rfl + unfold numberFieldTowerIdeleClassEquivAmbientFixed + numberFieldEmbeddedIdeleClassEquivAmbientFixed + rw [hBase] + dsimp only + congr 1 + +/- At the chosen embedding, both constructions use the same fixed tower and +abstract reciprocity data. We compare their values on the particular fixed +idele class needed below; the two implementations of the finite norm-quotient +equivalence are deliberately not compared as dependent structures. -/ +private theorem numberFieldTowerNormResidueValue_eq_embedded_standard + (c : IdeleClassGroup K) : + numberFieldTowerAbelianizedExtensionQuotientEquivGaloisGroup K L + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldTowerReciprocityFiniteAbstractField K L) + (numberFieldTowerFiniteGaloisSubextension K L) + (finiteNormClass rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) + (numberFieldTowerIdeleClassEquivAmbientFixed K L (Additive.ofMul c)))) = + numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisGroup + K L (numberFieldSeparableClosureEmbedding L) + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldEmbeddedFiniteAbstractField K L + (numberFieldSeparableClosureEmbedding L)) + (numberFieldEmbeddedFiniteGaloisSubextension K L + (numberFieldSeparableClosureEmbedding L)) + (finiteNormClass rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K L + (numberFieldSeparableClosureEmbedding L)) + (numberFieldEmbeddedTopSubgroup K L + (numberFieldSeparableClosureEmbedding L)) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L + (numberFieldSeparableClosureEmbedding L)) + (numberFieldEmbeddedIdeleClassEquivAmbientFixed K L + (numberFieldSeparableClosureEmbedding L) (Additive.ofMul c)))) := by + have hIdeleClassEquiv : + numberFieldTowerIdeleClassEquivAmbientFixed K L = + numberFieldEmbeddedIdeleClassEquivAmbientFixed K L + (numberFieldSeparableClosureEmbedding L) := by + exact numberFieldTowerIdeleClassEquivAmbientFixed_eq_embedded_standard K L + have hFiniteAbstractField : + numberFieldTowerReciprocityFiniteAbstractField K L = + numberFieldEmbeddedFiniteAbstractField K L + (numberFieldSeparableClosureEmbedding L) := by + rfl + have hSubextension : + numberFieldTowerFiniteGaloisSubextension K L = + numberFieldEmbeddedFiniteGaloisSubextension K L + (numberFieldSeparableClosureEmbedding L) := by + rfl + have hGaloisComparison : + numberFieldTowerAbelianizedExtensionQuotientEquivGaloisGroup K L = + numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisGroup + K L (numberFieldSeparableClosureEmbedding L) := by + rfl + simp only [← hGaloisComparison] + cases hFiniteAbstractField + cases hSubextension + rw [← hIdeleClassEquiv] + rfl + +/-- At the standard embedding, the two global norm-residue equivalences +agree on the actual norm quotient. The comparison is extensional: it uses +surjectivity of the quotient map and the established evaluation formulas, +not definitional equality of the two quotient constructions. -/ +theorem globalNormResidueEquiv_eq_ofEmbedding_standard : + globalNormResidueEquiv K L = + globalNormResidueEquivOfEmbedding K L + (numberFieldSeparableClosureEmbedding L) := by + apply AddEquiv.ext + intro q + obtain ⟨c, hc⟩ := + QuotientGroup.mk'_surjective + (_root_.ideleClassNorm K L).range (Additive.toMul q) + have hq : + Additive.ofMul + (QuotientGroup.mk' (_root_.ideleClassNorm K L).range c) = q := + Additive.toMul.injective hc + rw [← hq] + have hTower := + numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient_ideleClass + K L c + have hEmbedded := + numberFieldEmbeddedFiniteNormQuotientEquivIdeleClassNormQuotient_ideleClass + K L (numberFieldSeparableClosureEmbedding L) c + conv_lhs => + rw [← hTower, globalNormResidueEquiv_finiteNormClass] + conv_rhs => + rw [← hEmbedded, globalNormResidueEquivOfEmbedding_finiteNormClass] + exact numberFieldTowerNormResidueValue_eq_embedded_standard K L c + +/-- The existing global norm-residue map is the explicit-embedding +construction for the standard chosen embedding of the top field. -/ +theorem globalNormResidueMonoidHom_eq_ofEmbedding_standard : + globalNormResidueMonoidHom K L = + globalNormResidueMonoidHomOfEmbedding K L + (numberFieldSeparableClosureEmbedding L) := by + apply MonoidHom.ext + intro c + apply Additive.toMul.injective + change + globalNormResidueEquiv K L + (Additive.ofMul + (QuotientGroup.mk' (_root_.ideleClassNorm K L).range c)) = + globalNormResidueEquivOfEmbedding K L + (numberFieldSeparableClosureEmbedding L) + (Additive.ofMul + (QuotientGroup.mk' (_root_.ideleClassNorm K L).range c)) + exact congrArg + (fun e : + Additive + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≃+ + Additive (Gal(L / K)) => + e (Additive.ofMul + (QuotientGroup.mk' (_root_.ideleClassNorm K L).range c))) + (globalNormResidueEquiv_eq_ofEmbedding_standard K L) + +end EmbeddedNumberFieldRealization + +section EmbeddedNumberFieldRestriction + +variable + (K K' L L' : Type) + [Field K] [NumberField K] + [Field K'] [NumberField K'] + [Field L] [NumberField L] + [Field L'] [NumberField L'] + [Algebra K K'] [Algebra K L] [Algebra K L'] + [Algebra K' L'] [Algebra L L'] + [IsScalarTower K K' L'] [IsScalarTower K L L'] + +/-- A compatible common embedding reverses the inclusion of the two base +fields into an inclusion of their fixing subgroups. -/ +theorem numberFieldEmbeddedBaseSubgroup_le_of_tower + (j : L' →ₐ[ℚ] SeparableClosure ℚ) : + let jLower : L →ₐ[ℚ] SeparableClosure ℚ := + j.comp (IsScalarTower.toAlgHom ℚ L L') + (numberFieldEmbeddedBaseSubgroup K' L' j).toSubgroup ≤ + (numberFieldEmbeddedBaseSubgroup K L jLower).toSubgroup := by + dsimp only + change + (numberFieldEmbeddedLowerEmbedding K' L' j).fieldRange.fixingSubgroup ≤ + (numberFieldEmbeddedLowerEmbedding K L + (j.comp (IsScalarTower.toAlgHom ℚ L L'))).fieldRange.fixingSubgroup + apply + (numberFieldEmbeddedLowerEmbedding K L + (j.comp (IsScalarTower.toAlgHom ℚ L L'))).fieldRange.fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + refine ⟨algebraMap K K' y, ?_⟩ + change + j (algebraMap K' L' (algebraMap K K' y)) = + j (algebraMap L L' (algebraMap K L y)) + rw [← IsScalarTower.algebraMap_apply K K' L', + ← IsScalarTower.algebraMap_apply K L L'] + +omit [Field K] [NumberField K] + [Field K'] [NumberField K'] + [Algebra K K'] [Algebra K L] [Algebra K L'] [Algebra K' L'] + [IsScalarTower K K' L'] [IsScalarTower K L L'] in +/-- A compatible common embedding reverses the inclusion of the two top +fields into an inclusion of their fixing subgroups. -/ +theorem numberFieldEmbeddedTopSubgroup_le_of_tower + (j : L' →ₐ[ℚ] SeparableClosure ℚ) : + let jLower : L →ₐ[ℚ] SeparableClosure ℚ := + j.comp (IsScalarTower.toAlgHom ℚ L L') + (numberFieldEmbeddedTopSubgroup K' L' j).toSubgroup ≤ + (numberFieldEmbeddedTopSubgroup K L jLower).toSubgroup := by + dsimp only + change + j.fieldRange.fixingSubgroup ≤ + (j.comp + (IsScalarTower.toAlgHom ℚ L L')).fieldRange.fixingSubgroup + apply + (j.comp + (IsScalarTower.toAlgHom ℚ L L')).fieldRange.fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap L L' y, rfl⟩ + +end EmbeddedNumberFieldRestriction + +variable + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) + +local instance abstractFixedFieldBaseQuotientFinite : + Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K.field (le_baseField K.field)) := + K.finite + +local instance abstractFixedFieldRelativeQuotientFinite : + Finite + (K.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup K.field L.field L.below) := + L.finite + +local instance abstractFixedFieldRelativeQuotientIsMulCommutative : + IsMulCommutative L.extensionQuotient := + L.commutative + +noncomputable local instance abstractFixedFieldFiniteDimensional : + FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K.field K.finite + +noncomputable local instance abstractRelativeFixedFieldFiniteDimensional : + FiniteDimensional + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + K.field L.field L.below K.finite L.finite + +local instance abstractFixedFieldRelativeScalarTower : + IsScalarTower ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + +noncomputable local instance abstractRelativeFixedFieldAbsoluteFiniteDimensional : + FiniteDimensional ℚ + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) := + FiniteDimensional.trans ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) + +noncomputable local instance abstractFixedFieldNumberField : + NumberField + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) := + NumberField.of_module_finite ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) + +/-- The lower fixed idèle-class group is commutative. Naming the mixin +before the public quotient declarations avoids delayed normality synthesis +inside their definition bodies. -/ +local instance + abstractFixedFieldIdeleClassGroupIsMulCommutative : + IsMulCommutative + (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) K.field)) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +noncomputable local instance abstractRelativeFixedFieldNumberField : + NumberField + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) := + NumberField.of_module_finite ℚ + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) + +/-- Use the same explicit Galois witness as the fixed-field quotient +comparison. Deriving it through `IsAbelianGalois` produces an equivalent +but much larger dependent instance path. -/ +noncomputable local instance + abstractRelativeFixedFieldIsGalois : + IsGalois + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) + K.field L.field L.below L.normal + +noncomputable local instance abstractRelativeFixedFieldIsAbelianGalois : + IsAbelianGalois + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) := + finiteAbelianSubextensionAbstractRelativeFixedFieldIsAbelianGalois L + +/-- Use one opaque normality witness for the actual fixed-field norm range. +This keeps every occurrence of its quotient group on the same instance path. -/ +local instance + abstractFixedFieldIdeleClassNormRangeNormal : + ((_root_.ideleClassNorm + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below)).range).Normal := by + infer_instance + +/-- The abelianized abstract extension quotient is the actual Galois +group of the corresponding pair of fixed fields. -/ +noncomputable def + abstractFixedFieldAbelianizedExtensionQuotientEquivGaloisGroup : + let F := + abstractFixedField ℚ (SeparableClosure ℚ) K.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + Additive + (Abelianization + (FiniteGaloisSubextension.extensionQuotient + L.toFiniteGaloisExtension)) ≃+ + Additive (Gal(E / F)) := by + dsimp only + let F := + abstractFixedField ℚ (SeparableClosure ℚ) K.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + let e : + L.extensionQuotient ≃* + Gal(E / F) := + L.extensionQuotientMulEquiv.trans + (abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) + K.field L.field L.below L.normal) + exact + MulEquiv.toAdditive + ((Abelianization.equivOfComm : + L.extensionQuotient ≃* + Abelianization L.extensionQuotient).symm.trans e) + +/-- The actual fixed-field global norm-residue equivalence + +`C_F / N_{E/F} C_E ≃ Gal(E/F)` + +attached to an abstract finite abelian subextension in the rational +absolute class formation. -/ +noncomputable def abstractFixedFieldGlobalNormResidueEquiv : + let F := + abstractFixedField ℚ (SeparableClosure ℚ) K.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + Additive + (IdeleClassGroup F ⧸ + (_root_.ideleClassNorm F E).range) ≃+ + Additive (Gal(E / F)) := by + dsimp only + let F := + abstractFixedField ℚ (SeparableClosure ℚ) K.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + let eNorm : + FiniteNormQuotient rationalIdeleClassRepresentation + K.field L.field L.below ≃+ + Additive + (Abelianization L.toFiniteGaloisExtension.extensionQuotient) := + rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + K L.toFiniteGaloisExtension + exact + (rationalFiniteNormQuotientEquivIdeleClassNormQuotient + K.field L.field L.below L.normal).symm.trans + (eNorm.trans + (abstractFixedFieldAbelianizedExtensionQuotientEquivGaloisGroup + K L)) + +/-- The abstract finite norm-residue equivalence with its dependent source +instance fixed to the public finite norm quotient. -/ +noncomputable def abstractFixedFieldFiniteNormResidueGaloisEquiv : + FiniteNormQuotient rationalIdeleClassRepresentation + K.field L.field L.below ≃+ + Additive + (Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) / + (abstractFixedField ℚ (SeparableClosure ℚ) K.field))) := by + letI : AddCommGroup + (FiniteNormQuotient rationalIdeleClassRepresentation + K.field L.field L.below) := + finiteNormQuotientAddCommGroup rationalIdeleClassRepresentation + K.field L.field L.below + exact + @AddEquiv.trans + (FiniteNormQuotient rationalIdeleClassRepresentation + K.field L.field L.below) + (Additive + (Abelianization + L.toFiniteGaloisExtension.extensionQuotient)) + (Additive + (Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) / + (abstractFixedField ℚ (SeparableClosure ℚ) K.field)))) + inferInstance inferInstance inferInstance + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + K L.toFiniteGaloisExtension) + (abstractFixedFieldAbelianizedExtensionQuotientEquivGaloisGroup + K L) + +/-- The finite fixed-field symbol evaluates by transporting the abstract norm-residue value. -/ +private theorem abstractFixedFieldFiniteNormResidueGaloisEquiv_apply + (a : FiniteNormQuotient rationalIdeleClassRepresentation K.field L.field L.below) : + abstractFixedFieldFiniteNormResidueGaloisEquiv K L a = + abstractFixedFieldAbelianizedExtensionQuotientEquivGaloisGroup K L + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + K L.toFiniteGaloisExtension a) := rfl + +/-- The abstract norm-residue symbol on the fixed part of the rational +absolute idele-class representation, with its value transported to the +actual Galois group of the two fixed fields. This is the form consumed +directly by the abstract norm--restriction naturality theorem. -/ +noncomputable def ambientFixedGlobalNormResidueAddMonoidHom : + let F := + abstractFixedField ℚ (SeparableClosure ℚ) K.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + ambientFixedAddSubgroup + rationalIdeleClassRepresentation K.field →+ + Additive (Gal(E / F)) := by + dsimp only + let F := + abstractFixedField ℚ (SeparableClosure ℚ) K.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + exact + (abstractFixedFieldFiniteNormResidueGaloisEquiv K L).toAddMonoidHom.comp + (finiteNormClassHom rationalIdeleClassRepresentation + K.field L.field L.below) + +/-- The ordinary idele class group of the lower fixed field, transported +to the fixed part of the rational absolute idele-class representation. -/ +noncomputable def abstractFixedFieldIdeleClassToAmbientFixedMonoidHom : + let F := + abstractFixedField ℚ (SeparableClosure ℚ) K.field + IdeleClassGroup F →* + Multiplicative + (ambientFixedAddSubgroup + rationalIdeleClassRepresentation K.field) := + (rationalAbstractFixedFieldIdeleClassEquivFixed + K.field).toAddMonoidHom.toMultiplicativeRight + +/-- The actual norm-residue homomorphism on the ordinary idele class +group of the lower fixed field, constructed without choosing a second +field embedding. -/ +noncomputable def abstractFixedFieldGlobalNormResidueMonoidHom : + let F := + abstractFixedField ℚ (SeparableClosure ℚ) K.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + IdeleClassGroup F →* Gal(E / F) := + (ambientFixedGlobalNormResidueAddMonoidHom K L).toMultiplicative.comp + (abstractFixedFieldIdeleClassToAmbientFixedMonoidHom K) + +/-- Pointwise form of the ambient fixed-part norm-residue homomorphism. -/ +private theorem ambientFixedGlobalNormResidueAddMonoidHom_apply + (a : + ambientFixedAddSubgroup + rationalIdeleClassRepresentation K.field) : + ambientFixedGlobalNormResidueAddMonoidHom K L a = + abstractFixedFieldAbelianizedExtensionQuotientEquivGaloisGroup + K L + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + K L.toFiniteGaloisExtension + (finiteNormClass rationalIdeleClassRepresentation + K.field L.field L.below a)) := by + change + abstractFixedFieldFiniteNormResidueGaloisEquiv K L + (finiteNormClass rationalIdeleClassRepresentation + K.field L.field L.below a) = _ + rfl + +/-- Pointwise form of the transported fixed-field norm-residue homomorphism. -/ +private theorem abstractFixedFieldGlobalNormResidueMonoidHom_apply : + let F := + abstractFixedField ℚ (SeparableClosure ℚ) K.field + ∀ c : IdeleClassGroup F, + abstractFixedFieldGlobalNormResidueMonoidHom K L c = + Additive.toMul + (ambientFixedGlobalNormResidueAddMonoidHom K L + ((rationalAbstractFixedFieldIdeleClassEquivFixed K.field) + (Additive.ofMul c))) := by + dsimp only + intro c + rfl + +/-- Transporting an ordinary fixed-field idele class to the ambient +fixed part and applying the abstract norm-residue map gives exactly the +actual fixed-field norm-residue value. -/ +@[simp] +theorem abstractFixedFieldGlobalNormResidueMonoidHom_fixed_apply + (a : + ambientFixedAddSubgroup + rationalIdeleClassRepresentation K.field) : + abstractFixedFieldGlobalNormResidueMonoidHom K L + (Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed + K.field).symm a)) = + Additive.toMul + (ambientFixedGlobalNormResidueAddMonoidHom K L a) := by + rw [abstractFixedFieldGlobalNormResidueMonoidHom_apply] + change + Additive.toMul + (ambientFixedGlobalNormResidueAddMonoidHom K L + ((rationalAbstractFixedFieldIdeleClassEquivFixed K.field) + ((rationalAbstractFixedFieldIdeleClassEquivFixed + K.field).symm a))) = + Additive.toMul + (ambientFixedGlobalNormResidueAddMonoidHom K L a) + rw [(rationalAbstractFixedFieldIdeleClassEquivFixed + K.field).apply_symm_apply] + +/-- The ambient fixed-part reciprocity value vanishes precisely when its +finite norm class vanishes. -/ +private theorem ambientFixedGlobalNormResidueAddMonoidHom_eq_zero_iff + (a : + ambientFixedAddSubgroup + rationalIdeleClassRepresentation K.field) : + ambientFixedGlobalNormResidueAddMonoidHom K L a = 0 ↔ + finiteNormClass rationalIdeleClassRepresentation + K.field L.field L.below a = 0 := by + rw [ambientFixedGlobalNormResidueAddMonoidHom_apply] + change + abstractFixedFieldFiniteNormResidueGaloisEquiv K L + (finiteNormClass rationalIdeleClassRepresentation + K.field L.field L.below a) = 0 ↔ + finiteNormClass rationalIdeleClassRepresentation + K.field L.field L.below a = 0 + exact + (abstractFixedFieldFiniteNormResidueGaloisEquiv K L).map_eq_zero_iff + +/-- The fixed-field idele-class comparison carries the abstract finite norm +subgroup exactly to the ordinary norm range. -/ +private theorem + rationalAbstractFixedFieldIdeleClassEquivFixed_mem_finiteNormSubgroup_iff + (c : IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) K.field)) : + (rationalAbstractFixedFieldIdeleClassEquivFixed K.field) + (Additive.ofMul c) ∈ + finiteNormSubgroup rationalIdeleClassRepresentation + K.field L.field L.below ↔ + c ∈ + (_root_.ideleClassNorm + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below)).range := by + let eK := rationalAbstractFixedFieldIdeleClassEquivFixed K.field + let S := + finiteNormSubgroup rationalIdeleClassRepresentation + K.field L.field L.below + let N := + (_root_.ideleClassNorm + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below)).range + have hmap := + map_rationalFiniteNormSubgroup_eq_ordinaryIdeleClassNormRange_concrete + K.field L.field L.below L.normal + have hmem : + Additive.ofMul c ∈ S.map eK.symm.toAddMonoidHom ↔ + Additive.ofMul c ∈ N.toAddSubgroup := + Iff.of_eq (congrArg + (fun T : AddSubgroup (Additive (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) K.field))) => + Additive.ofMul c ∈ T) hmap) + change eK (Additive.ofMul c) ∈ S ↔ Additive.ofMul c ∈ N.toAddSubgroup + constructor + · intro hc + have hmapped : + Additive.ofMul c ∈ S.map eK.symm.toAddMonoidHom := + ⟨eK (Additive.ofMul c), hc, eK.symm_apply_apply _⟩ + exact hmem.mp hmapped + · intro hc + have hmapped : + Additive.ofMul c ∈ S.map eK.symm.toAddMonoidHom := by + exact hmem.mpr hc + rcases hmapped with ⟨a, ha, hac⟩ + have hea : a = eK (Additive.ofMul c) := + (eK.apply_symm_apply a).symm.trans (congrArg eK hac) + exact hea ▸ ha + +/-- Triviality of the fixed-field norm-residue symbol is exactly +membership in the actual ordinary idele-class norm range. -/ +@[simp] +theorem abstractFixedFieldGlobalNormResidueMonoidHom_eq_one_iff + (c : IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) K.field)) : + abstractFixedFieldGlobalNormResidueMonoidHom K L c = 1 ↔ + c ∈ + (_root_.ideleClassNorm + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below)).range := by + calc + abstractFixedFieldGlobalNormResidueMonoidHom K L c = 1 + ↔ abstractFixedFieldGlobalNormResidueMonoidHom K L + (Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed K.field).symm + ((rationalAbstractFixedFieldIdeleClassEquivFixed K.field) + (Additive.ofMul c)))) = 1 := by + rw [(rationalAbstractFixedFieldIdeleClassEquivFixed + K.field).symm_apply_apply] + rfl + _ ↔ Additive.toMul + (ambientFixedGlobalNormResidueAddMonoidHom K L + ((rationalAbstractFixedFieldIdeleClassEquivFixed K.field) + (Additive.ofMul c))) = 1 := by + exact Iff.of_eq (congrArg (fun g => g = 1) + (abstractFixedFieldGlobalNormResidueMonoidHom_fixed_apply K L + ((rationalAbstractFixedFieldIdeleClassEquivFixed K.field) + (Additive.ofMul c)))) + _ ↔ ambientFixedGlobalNormResidueAddMonoidHom K L + ((rationalAbstractFixedFieldIdeleClassEquivFixed K.field) + (Additive.ofMul c)) = 0 := + toMul_eq_one + _ ↔ finiteNormClass rationalIdeleClassRepresentation + K.field L.field L.below + ((rationalAbstractFixedFieldIdeleClassEquivFixed K.field) + (Additive.ofMul c)) = 0 := + ambientFixedGlobalNormResidueAddMonoidHom_eq_zero_iff K L _ + _ ↔ (rationalAbstractFixedFieldIdeleClassEquivFixed K.field) + (Additive.ofMul c) ∈ + finiteNormSubgroup rationalIdeleClassRepresentation + K.field L.field L.below := + finiteNormClass_eq_zero_iff rationalIdeleClassRepresentation + K.field L.field L.below _ + _ ↔ c ∈ + (_root_.ideleClassNorm + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below)).range := + rationalAbstractFixedFieldIdeleClassEquivFixed_mem_finiteNormSubgroup_iff + K L c + +/-- The ambient fixed-part reciprocity homomorphism is surjective. -/ +private theorem ambientFixedGlobalNormResidueAddMonoidHom_surjective : + Function.Surjective + (ambientFixedGlobalNormResidueAddMonoidHom K L) := by + intro y + obtain ⟨z, hz⟩ := + (abstractFixedFieldFiniteNormResidueGaloisEquiv K L).surjective y + obtain ⟨a, ha⟩ := + finiteNormClass_surjective rationalIdeleClassRepresentation + K.field L.field L.below z + refine ⟨a, ?_⟩ + rw [ambientFixedGlobalNormResidueAddMonoidHom_apply, ha] + exact hz + +/-- The fixed-field global norm-residue homomorphism is surjective +onto the actual Galois group. -/ +theorem abstractFixedFieldGlobalNormResidueMonoidHom_surjective : + Function.Surjective + (abstractFixedFieldGlobalNormResidueMonoidHom K L) := by + intro y + obtain ⟨a, ha⟩ := + ambientFixedGlobalNormResidueAddMonoidHom_surjective K L + (Additive.ofMul y) + refine + ⟨Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed K.field).symm a), ?_⟩ + rw [abstractFixedFieldGlobalNormResidueMonoidHom_fixed_apply, ha] + rfl + +/-- The kernel of the fixed-field global norm-residue homomorphism is +the genuine ordinary idele-class norm range. -/ +@[simp] +theorem abstractFixedFieldGlobalNormResidueMonoidHom_ker : + (abstractFixedFieldGlobalNormResidueMonoidHom K L).ker = + (_root_.ideleClassNorm + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below)).range := by + ext c + change + abstractFixedFieldGlobalNormResidueMonoidHom K L c = 1 ↔ + c ∈ + (_root_.ideleClassNorm + (abstractFixedField ℚ (SeparableClosure ℚ) K.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below)).range + exact + abstractFixedFieldGlobalNormResidueMonoidHom_eq_one_iff + K L c + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/All.lean new file mode 100644 index 0000000000..bcaafa0967 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/All.lean @@ -0,0 +1,104 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.AbstractFixedFieldGlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicAbstractFixedFieldArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValueTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicNormOneCorrection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicPrincipalIdele +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicTorsionFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedGeometricRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedLocalGlobalCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicZHatBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationFinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteLocalFamily +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertProductFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicLocalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceCyclotomicFrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinFiniteSupportApproximation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianizationNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFiniteFactorNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFamilyAlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormulaAlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteHilbertFactorNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibHilbertProductFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitAbstractFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevelCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormProof +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormStatement +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescentCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPoints +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassNormTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinSurjectivity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteLocalGlobalArtinCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfinitePlaceArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IntermediateNormAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianGlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibTopologicalGlobalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.NormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.PowerResidueReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ProductFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicArithmeticProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicCharacterRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlaceArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicLocalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalAwayProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalPrimeFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicRayNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicZHatRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrimeFactorization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrincipalLocalUnit +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalQuadraticPowerResidueReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidueAbelianization +/-! +# Global reciprocity + +This public root exports global Artin maps, cyclotomic comparisons, local norm +kernels, the principal-idèle product formula, the concrete cyclotomic +idèle-class valuation, local--global compatibility, and the descended global +norm-residue homomorphism with its actual norm-range kernel. It also exports +the finite- and infinite-place Kummer-character comparison, the all-place +Hilbert product formula, general power-residue reciprocity with explicit +bad-place correction, and Gauss quadratic reciprocity over `ℚ`. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ArithmeticNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ArithmeticNormalization.lean new file mode 100644 index 0000000000..41f2eef116 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ArithmeticNormalization.lean @@ -0,0 +1,466 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidueAbelianization +/-! +# Arithmetic normalization of global reciprocity + +The valuation used by the local class-formation implementation is the +logarithm of the multiplicative absolute value. Consequently its +distinguished element of value `1` is the inverse of a DVR uniformizer. +The resulting field-facing reciprocity map sends a usual uniformizer to +geometric Frobenius. + +The arithmetic global norm-residue symbol uses the opposite +normalization: a DVR uniformizer maps to arithmetic Frobenius and a +ramified cyclotomic unit `u` acts by `u⁻¹`. For an abelian target the two +normalizations differ by the canonical inversion automorphism. This file +records that normalization explicitly, including its topology and its +local-global compatibility. Thus no sign convention is hidden in an +unbundled equality. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField +open NumberField IsDedekindDomain +open IdeleGroup + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +private theorem arithmeticNormIdeleClassIsMulCommutative + (K : Type) [Field K] [NumberField K] : + IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] arithmeticNormIdeleClassIsMulCommutative + +/-- Inversion as a topological multiplicative automorphism of a +commutative topological group. -/ +def commutativeGroupInversionContinuousMulEquiv + (G : Type*) [CommGroup G] [TopologicalSpace G] + [IsTopologicalGroup G] : + G ≃ₜ* G := + { MulEquiv.inv G with + continuous_toFun := continuous_inv + continuous_invFun := continuous_inv } + +section FiniteGalois + +variable + (K L : Type) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- Reuse the quotient topology chosen by topological global reciprocity. -/ +local instance + arithmeticGlobalNormResidueAbelianizationGaloisAbelianizationTopology : + TopologicalSpace (Abelianization (Gal(L/K))) := + topologicalGlobalNormResidueAbelianizationGaloisAbelianizationTopology + K L + +/-- The quotient topology above carries the quotient topological-group +structure. -/ +local instance + arithmeticGlobalNormResidueAbelianization_galoisAbelianizationIsTopologicalGroup : + IsTopologicalGroup (Abelianization (Gal(L/K))) := by + change + IsTopologicalGroup + (Gal(L/K) ⧸ commutator (Gal(L/K))) + infer_instance + +/-- The global norm-residue homomorphism with arithmetic +Frobenius normalization, for an arbitrary finite Galois extension. -/ +noncomputable def arithmeticGlobalNormResidueAbelianizationMonoidHom : + IdeleClassGroup K →* + Abelianization (Gal(L/K)) := + (MulEquiv.inv + (Abelianization (Gal(L/K)))).toMonoidHom.comp + (globalNormResidueAbelianizationMonoidHom K L) + +/-- Arithmetic normalization evaluates by inverting the geometric +norm-residue symbol. -/ +@[simp] +theorem arithmeticGlobalNormResidueAbelianizationMonoidHom_apply + (c : IdeleClassGroup K) : + arithmeticGlobalNormResidueAbelianizationMonoidHom K L c = + (globalNormResidueAbelianizationMonoidHom K L c)⁻¹ := by + rfl + +/-- Arithmetic normalization does not change the genuine norm kernel. -/ +@[simp] +theorem arithmeticGlobalNormResidueAbelianizationMonoidHom_ker : + (arithmeticGlobalNormResidueAbelianizationMonoidHom K L).ker = + (_root_.ideleClassNorm K L).range := by + ext c + simp only [MonoidHom.mem_ker, + arithmeticGlobalNormResidueAbelianizationMonoidHom_apply, + inv_eq_one] + exact globalNormResidueAbelianizationMonoidHom_eq_one_iff K L c + +/-- The arithmetic global norm-residue homomorphism is surjective. -/ +theorem arithmeticGlobalNormResidueAbelianizationMonoidHom_surjective : + Function.Surjective + (arithmeticGlobalNormResidueAbelianizationMonoidHom K L) := + (MulEquiv.inv + (Abelianization (Gal(L/K)))).surjective.comp + (globalNormResidueAbelianizationMonoidHom_surjective K L) + +/-- The arithmetic finite-Galois norm-residue isomorphism, with the +native idèle-class quotient topology and the finite Krull quotient +topology on the Galois abelianization. -/ +noncomputable def + arithmeticGlobalNormResidueAbelianizationContinuousMulEquiv : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≃ₜ* + Abelianization (Gal(L/K)) := + (globalNormResidueAbelianizationContinuousMulEquiv K L).trans + (commutativeGroupInversionContinuousMulEquiv + (Abelianization (Gal(L/K)))) + +/-- The arithmetic abelianized norm-residue equivalence is pointwise the +inverse of the geometric equivalence. -/ +@[simp] +theorem + arithmeticGlobalNormResidueAbelianizationContinuousMulEquiv_apply + (q : + IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) : + arithmeticGlobalNormResidueAbelianizationContinuousMulEquiv K L q = + (globalNormResidueAbelianizationContinuousMulEquiv K L q)⁻¹ := by + calc + arithmeticGlobalNormResidueAbelianizationContinuousMulEquiv K L q = + commutativeGroupInversionContinuousMulEquiv + (Abelianization (Gal(L/K))) + (globalNormResidueAbelianizationContinuousMulEquiv K L q) := + ContinuousMulEquiv.trans_apply + (globalNormResidueAbelianizationContinuousMulEquiv K L) + (commutativeGroupInversionContinuousMulEquiv + (Abelianization (Gal(L/K)))) q + _ = (globalNormResidueAbelianizationContinuousMulEquiv K L q)⁻¹ := + rfl + +/-- The canonical reciprocity isomorphism +`Gal(L/K)ᵃᵇ ≃ₜ* C_K / N_{L/K}(C_L)`, in the direction stated in the +global reciprocity theorem. -/ +noncomputable def + arithmeticGlobalReciprocityAbelianizationContinuousMulEquiv : + Abelianization (Gal(L/K)) ≃ₜ* + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + (arithmeticGlobalNormResidueAbelianizationContinuousMulEquiv + K L).symm + +/-- The inverse of arithmetic reciprocity is literally the arithmetic +global norm-residue symbol on every idèle class. -/ +theorem + arithmeticGlobalReciprocityAbelianizationContinuousMulEquiv_symm_mk + (c : IdeleClassGroup K) : + (arithmeticGlobalReciprocityAbelianizationContinuousMulEquiv + K L).symm + (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range c) = + arithmeticGlobalNormResidueAbelianizationMonoidHom K L c := by + let q := + QuotientGroup.mk' + (_root_.ideleClassNorm K L).range c + calc + (arithmeticGlobalReciprocityAbelianizationContinuousMulEquiv + K L).symm q = + arithmeticGlobalNormResidueAbelianizationContinuousMulEquiv + K L q := + DFunLike.congr_fun + (ContinuousMulEquiv.symm_symm + (arithmeticGlobalNormResidueAbelianizationContinuousMulEquiv + K L)) q + _ = (globalNormResidueAbelianizationContinuousMulEquiv K L q)⁻¹ := + arithmeticGlobalNormResidueAbelianizationContinuousMulEquiv_apply + K L q + _ = (globalNormResidueAbelianizationMonoidHom K L c)⁻¹ := by + rw [globalNormResidueAbelianizationContinuousMulEquiv_apply, + globalNormResidueAbelianizationMonoidHom_apply] + _ = arithmeticGlobalNormResidueAbelianizationMonoidHom K L c := + (arithmeticGlobalNormResidueAbelianizationMonoidHom_apply + K L c).symm + +end FiniteGalois + +section FiniteAbelian + +variable + (K L : Type) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + +/-- The global norm-residue homomorphism in arithmetic Frobenius +normalization for a finite abelian extension. -/ +noncomputable def arithmeticGlobalNormResidueMonoidHom : + IdeleClassGroup K →* Gal(L/K) := + (MulEquiv.inv (Gal(L/K))).toMonoidHom.comp + (globalNormResidueMonoidHom K L) + +/-- Arithmetic normalization evaluates by inverting the geometric global +norm-residue symbol. -/ +@[simp] +theorem arithmeticGlobalNormResidueMonoidHom_apply + (c : IdeleClassGroup K) : + arithmeticGlobalNormResidueMonoidHom K L c = + (globalNormResidueMonoidHom K L c)⁻¹ := by + rfl + +/-- Arithmetic normalization leaves the global norm kernel unchanged. -/ +@[simp] +theorem arithmeticGlobalNormResidueMonoidHom_ker : + (arithmeticGlobalNormResidueMonoidHom K L).ker = + (_root_.ideleClassNorm K L).range := by + ext c + simp only [MonoidHom.mem_ker, + arithmeticGlobalNormResidueMonoidHom_apply, inv_eq_one] + exact globalNormResidueMonoidHom_eq_one_iff K L c + +/-- The arithmetic global norm-residue homomorphism is surjective. -/ +theorem arithmeticGlobalNormResidueMonoidHom_surjective : + Function.Surjective + (arithmeticGlobalNormResidueMonoidHom K L) := + (MulEquiv.inv (Gal(L/K))).surjective.comp + (globalNormResidueMonoidHom_surjective K L) + +/-- The arithmetic global norm-residue map is continuous for the +ordinary idèle-class topology and the finite Krull topology. -/ +theorem arithmeticGlobalNormResidueMonoidHom_continuous : + Continuous (arithmeticGlobalNormResidueMonoidHom K L) := by + exact continuous_inv.comp + (globalNormResidueMonoidHom_continuous K L) + +/-- Arithmetic global norm-residue as a homeomorphic multiplicative +equivalence of the native norm quotient with the finite Krull Galois +group. -/ +noncomputable def arithmeticGlobalNormResidueContinuousMulEquiv : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≃ₜ* + Gal(L/K) := + (globalNormResidueContinuousMulEquiv K L).trans + (commutativeGroupInversionContinuousMulEquiv + (Gal(L/K))) + +/-- The arithmetic norm-residue equivalence is pointwise the inverse of the +geometric equivalence. -/ +@[simp] +theorem arithmeticGlobalNormResidueContinuousMulEquiv_apply + (q : + IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) : + arithmeticGlobalNormResidueContinuousMulEquiv K L q = + (globalNormResidueContinuousMulEquiv K L q)⁻¹ := by + rfl + +/-- The canonical arithmetic reciprocity isomorphism in the direction +`Gal(L/K) ≃ₜ* C_K / N_{L/K}(C_L)`. -/ +noncomputable def arithmeticGlobalReciprocityContinuousMulEquiv : + Gal(L/K) ≃ₜ* + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + (arithmeticGlobalNormResidueContinuousMulEquiv K L).symm + +/-- Applying inverse arithmetic reciprocity to a quotient representative +recovers the arithmetic norm-residue symbol. -/ +theorem arithmeticGlobalReciprocityContinuousMulEquiv_symm_mk + (c : IdeleClassGroup K) : + (arithmeticGlobalReciprocityContinuousMulEquiv K L).symm + (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range c) = + arithmeticGlobalNormResidueMonoidHom K L c := by + rfl + +/-- Arithmetic reciprocity sends the arithmetic norm-residue symbol of an +idèle class to its literal representative in the norm quotient. -/ +theorem arithmeticGlobalReciprocityContinuousMulEquiv_globalNormResidue + (c : IdeleClassGroup K) : + arithmeticGlobalReciprocityContinuousMulEquiv K L + (arithmeticGlobalNormResidueMonoidHom K L c) = + QuotientGroup.mk' + (_root_.ideleClassNorm K L).range c := by + let e := arithmeticGlobalReciprocityContinuousMulEquiv K L + calc + e (arithmeticGlobalNormResidueMonoidHom K L c) = + e + (e.symm + (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range c)) := + congrArg e + (arithmeticGlobalReciprocityContinuousMulEquiv_symm_mk + K L c).symm + _ = QuotientGroup.mk' + (_root_.ideleClassNorm K L).range c := + e.apply_symm_apply _ + +/-- The chosen finite-place Artin homomorphism in arithmetic +normalization. A usual local uniformizer therefore maps to arithmetic +Frobenius. -/ +noncomputable def arithmeticChosenFinitePlaceArtinMonoidHom + (v : HeightOneSpectrum (𝓞 K)) : + (v.adicCompletion K)ˣ →* Gal(L/K) := + (MulEquiv.inv (Gal(L/K))).toMonoidHom.comp + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v) + +omit [NumberField L] in +/-- Arithmetic finite-place Artin symbols are inverses of the geometric +chosen local symbols. -/ +@[simp] +theorem arithmeticChosenFinitePlaceArtinMonoidHom_apply + (v : HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) : + arithmeticChosenFinitePlaceArtinMonoidHom K L v x = + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x)⁻¹ := by + rfl + +/-- Finite-place local-global compatibility in arithmetic +normalization. -/ +theorem + arithmeticGlobalNormResidueMonoidHom_comp_finitePlaceIdeleClass + (v : HeightOneSpectrum (𝓞 K)) : + (arithmeticGlobalNormResidueMonoidHom K L).comp + (IdeleGroup.finitePlaceIdeleClass v) = + arithmeticChosenFinitePlaceArtinMonoidHom K L v := by + apply MonoidHom.ext + intro x + change + (globalNormResidueMonoidHom K L + (IdeleGroup.finitePlaceIdeleClass v x))⁻¹ = + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x)⁻¹ + simpa only [MonoidHom.comp_apply] using + congrArg (fun σ : Gal(L/K) => σ⁻¹) + (DFunLike.congr_fun + (globalNormResidueMonoidHom_comp_finitePlaceIdeleClass + (K := K) (L := L) v) x) + +/-- The chosen infinite-place Artin homomorphism in arithmetic +normalization. -/ +noncomputable def arithmeticChosenInfinitePlaceArtinMonoidHom + (v : InfinitePlace K) : + v.Completionˣ →* Gal(L/K) := + (MulEquiv.inv (Gal(L/K))).toMonoidHom.comp + (chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v) + +omit [NumberField K] [NumberField L] [FiniteDimensional K L] in +/-- Arithmetic infinite-place Artin symbols are inverses of the geometric +chosen local symbols. -/ +@[simp] +theorem arithmeticChosenInfinitePlaceArtinMonoidHom_apply + (v : InfinitePlace K) + (x : v.Completionˣ) : + arithmeticChosenInfinitePlaceArtinMonoidHom K L v x = + (chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v x)⁻¹ := by + rfl + +/-- Infinite-place local-global compatibility in arithmetic +normalization. -/ +theorem + arithmeticGlobalNormResidueMonoidHom_comp_infinitePlaceIdeleClass + (v : InfinitePlace K) : + (arithmeticGlobalNormResidueMonoidHom K L).comp + (IdeleGroup.infinitePlaceIdeleClass v) = + arithmeticChosenInfinitePlaceArtinMonoidHom K L v := by + apply MonoidHom.ext + intro x + change + (globalNormResidueMonoidHom K L + (IdeleGroup.infinitePlaceIdeleClass v x))⁻¹ = + (chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v x)⁻¹ + simpa only [MonoidHom.comp_apply] using + congrArg (fun σ : Gal(L/K) => σ⁻¹) + (DFunLike.congr_fun + (globalNormResidueMonoidHom_comp_infinitePlaceIdeleClass + (K := K) (L := L) v) x) + +/-- The idèle-level global Artin product in arithmetic normalization. -/ +noncomputable def arithmeticGlobalArtinMonoidHom : + IdeleGroup K →* Gal(L/K) := + (MulEquiv.inv (Gal(L/K))).toMonoidHom.comp + (globalArtinMonoidHom (K := K) (L := L)) + +omit [FiniteDimensional K L] in +/-- The arithmetic global Artin symbol is the inverse of the geometric global +Artin symbol. -/ +@[simp] +theorem arithmeticGlobalArtinMonoidHom_apply + (a : IdeleGroup K) : + arithmeticGlobalArtinMonoidHom K L a = + (globalArtinMonoidHom (K := K) (L := L) a)⁻¹ := by + rfl + +/-- The arithmetic global Artin symbol of a finite one-place idèle is +literally the arithmetic chosen local Artin symbol. -/ +theorem arithmeticGlobalArtinMonoidHom_finitePlaceIdele + (v : HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) : + arithmeticGlobalArtinMonoidHom K L + (finitePlaceIdele v x) = + arithmeticChosenFinitePlaceArtinMonoidHom K L v x := by + rw [arithmeticGlobalArtinMonoidHom_apply, + globalArtinMonoidHom_finitePlaceIdele, + arithmeticChosenFinitePlaceArtinMonoidHom_apply] + +omit [FiniteDimensional K L] in +/-- The arithmetic global Artin symbol of an infinite one-place idèle +is literally the arithmetic chosen local Artin symbol. -/ +theorem arithmeticGlobalArtinMonoidHom_infinitePlaceIdele + (v : InfinitePlace K) + (x : v.Completionˣ) : + arithmeticGlobalArtinMonoidHom K L + (infinitePlaceIdele v x) = + arithmeticChosenInfinitePlaceArtinMonoidHom K L v x := by + rw [arithmeticGlobalArtinMonoidHom_apply, + globalArtinMonoidHom_infinitePlaceIdele, + arithmeticChosenInfinitePlaceArtinMonoidHom_apply] + +/-- Arithmetic global Artin kills every principal idèle. -/ +theorem arithmeticGlobalArtinMonoidHom_principalIdele + (x : Kˣ) : + arithmeticGlobalArtinMonoidHom K L + (IdeleGroup.principalIdele K x) = + 1 := by + rw [arithmeticGlobalArtinMonoidHom_apply, + globalArtinMonoidHom_principalIdele, inv_one] + +/-- Descending the arithmetic local-product Artin map through principal +idèles gives the arithmetic global norm-residue homomorphism literally. -/ +theorem + arithmeticGlobalNormResidueMonoidHom_comp_ideleClassQuotient_eq_globalArtin : + (arithmeticGlobalNormResidueMonoidHom K L).comp + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K)) = + arithmeticGlobalArtinMonoidHom K L := by + apply MonoidHom.ext + intro a + change + (globalNormResidueMonoidHom K L + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a))⁻¹ = + (globalArtinMonoidHom (K := K) (L := L) a)⁻¹ + simpa only [MonoidHom.comp_apply] using + congrArg (fun σ : Gal(L/K) => σ⁻¹) + (DFunLike.congr_fun + (globalNormResidueMonoidHom_comp_ideleClassQuotient_eq_globalArtin + (K := K) (L := L)) a) + +end FiniteAbelian + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin.lean new file mode 100644 index 0000000000..ec97e44b18 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceOverfield +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.NumberFieldComplexification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.OverextensionArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RamifiedOverextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RationalComplexification + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/All.lean new file mode 100644 index 0000000000..c3465ee720 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/All.lean @@ -0,0 +1,23 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceOverfield +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.NumberFieldComplexification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.OverextensionArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RamifiedOverextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RationalComplexification +/-! +# Artin reciprocity for the cyclotomic complexification + +This compatibility module reexports the semantic layers constructing the +rational fourth-root complexification, its compositum with a number field, +the complex-conjugation overextension at a ramified real place, and the +resulting infinite-place local-global Artin comparison. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean new file mode 100644 index 0000000000..89d07adc4c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean @@ -0,0 +1,790 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.OverextensionArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueNaturality +/-! +# Infinite-place local-global Artin compatibility + +This module compares the real fixed place and the original ramified place, +then transports the special overextension computation through global +norm-residue naturality. +-/ + +@[expose] public section + +open scoped IsMulCommutative +open NumberField +open IdeleGroup + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +section ComplexConjugationOverextension + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + +open scoped Classical in +local instance + infinitePlaceCompatibilityIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] infinitePlaceCompatibilityIdeleClassGroupIsMulCommutative + +open scoped Classical in +/-- The real infinite place of the conjugation fixed field obtained +by restricting the concrete complex place of the overfield. -/ +noncomputable def ramifiedInfinitePlaceRealFixedPlace + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + InfinitePlace + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) := + (infinitePlaceComplexificationOverfieldComplexPlace + (K := K) (L := L) v).comap + (algebraMap + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)) + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- The fixed-field place is genuinely real: every element of the +fixed field is fixed by ambient complex conjugation. -/ +theorem ramifiedInfinitePlaceRealFixedPlace_isReal + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + (ramifiedInfinitePlaceRealFixedPlace + (K := K) (L := L) v hRamified).IsReal := by + let E := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v + let K' := + ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified + let φ : K' →+* ℂ := + E.val.toRingHom.comp (algebraMap K' E) + refine ⟨φ, ?_, ?_⟩ + · rw [ComplexEmbedding.isReal_iff] + ext x + have hx : + ∀ g ∈ + Subgroup.zpowers + (ramifiedInfinitePlaceOverfieldConjugation + (K := K) (L := L) v hRamified), + g (x : E) = (x : E) := by + exact + (IntermediateField.mem_fixedField_iff _ _).1 + x.property + have hxc := + hx + (ramifiedInfinitePlaceOverfieldConjugation + (K := K) (L := L) v hRamified) + (Subgroup.mem_zpowers + (ramifiedInfinitePlaceOverfieldConjugation + (K := K) (L := L) v hRamified)) + have hxc' := + congrArg + (fun z : E => E.val.toRingHom z) + hxc + have hconj : + E.val.toRingHom + (ramifiedInfinitePlaceOverfieldConjugation + (K := K) (L := L) v hRamified (x : E)) = + star (E.val.toRingHom (x : E)) := by + exact + ramifiedInfinitePlaceOverfieldConjugation_apply + (K := K) (L := L) v hRamified (x : E) + rw [ComplexEmbedding.conjugate_coe_eq] + change + star (E.val.toRingHom (algebraMap K' E x)) = + E.val.toRingHom (algebraMap K' E x) + rw [IntermediateField.algebraMap_apply] + exact hconj.symm.trans hxc' + · rfl + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- Restricting the concrete real fixed-field place to the original +base recovers the prescribed ramified place `v`. -/ +theorem infinitePlaceBelow_ramifiedInfinitePlaceRealFixedPlace + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + infinitePlaceBelow (K := K) + (ramifiedInfinitePlaceRealFixedPlace + (K := K) (L := L) v hRamified) = + v := by + apply InfinitePlace.ext + intro x + change + ‖((algebraMap + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (algebraMap K + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) x) : + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) : ℂ)‖ = + v x + rw [← IsScalarTower.algebraMap_apply K + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)] + change + ‖InfinitePlace.embedding + (chosenInfinitePlaceAbove (L := L) v) + (algebraMap K L x)‖ = + v x + rw [InfinitePlace.norm_embedding_eq] + exact + congrArg + (fun q : InfinitePlace K => q x) + (chosenInfinitePlaceAbove_comap (L := L) v) + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- The chosen place of the special overextension above its concrete +fixed-field place is ramified. -/ +theorem + ramifiedInfinitePlaceOverextension_chosenPlace_isRamified + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + (chosenInfinitePlaceAbove + (L := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (ramifiedInfinitePlaceRealFixedPlace + (K := K) (L := L) v hRamified)).IsRamified + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) := by + rw [InfinitePlace.isRamified_iff, + chosenInfinitePlaceAbove_comap + (L := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (ramifiedInfinitePlaceRealFixedPlace + (K := K) (L := L) v hRamified)] + exact + ⟨IsTotallyComplex.isComplex _, + ramifiedInfinitePlaceRealFixedPlace_isReal + (K := K) (L := L) v hRamified⟩ + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- At the concrete real fixed-field place, the local Artin symbol of +negative one is the distinguished ambient complex conjugation. -/ +theorem + ramifiedInfinitePlaceOverextension_localArtin_neg_one + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + chosenInfinitePlaceArtinMonoidHom + (K := + ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (L := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (ramifiedInfinitePlaceRealFixedPlace + (K := K) (L := L) v hRamified) + (-1 : + (ramifiedInfinitePlaceRealFixedPlace + (K := K) (L := L) v hRamified).Completionˣ) = + ramifiedInfinitePlaceOverextensionConjugation + (K := K) (L := L) v hRamified := by + apply + ramifiedInfinitePlaceOverextension_galois_eq_of_ne_one + (K := K) (L := L) v hRamified + · have hConj := + chosenInfinitePlaceArtinMonoidHom_neg_one_isConj_of_ramified + (K := + ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (L := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (ramifiedInfinitePlaceRealFixedPlace + (K := K) (L := L) v hRamified) + (ramifiedInfinitePlaceOverextension_chosenPlace_isRamified + (K := K) (L := L) v hRamified) + exact + (ComplexEmbedding.isConj_ne_one_iff hConj).2 + (InfinitePlace.isComplex_iff.mp + (IsTotallyComplex.isComplex + (chosenInfinitePlaceAbove + (L := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (ramifiedInfinitePlaceRealFixedPlace + (K := K) (L := L) v hRamified)))) + · intro hc + apply + ramifiedInfinitePlaceOverextensionCyclotomicRestriction_conjugation_ne_one + (K := K) (L := L) v hRamified + rw [hc, map_one] + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- The canonical global norm-residue value of the concrete +fixed-field one-place negative-one class is ambient complex +conjugation. -/ +theorem + ramifiedInfinitePlaceOverextension_globalNormResidue_neg_one + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + globalNormResidueMonoidHom + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (IdeleGroup.infinitePlaceIdeleClass + (ramifiedInfinitePlaceRealFixedPlace + (K := K) (L := L) v hRamified) + (-1 : + (ramifiedInfinitePlaceRealFixedPlace + (K := K) (L := L) v hRamified).Completionˣ)) = + ramifiedInfinitePlaceOverextensionConjugation + (K := K) (L := L) v hRamified := by + rw [ + globalNormResidueMonoidHom_ramifiedInfinitePlaceOverextension_infinitePlaceIdeleClass, + ramifiedInfinitePlaceOverextension_localArtin_neg_one] + +open scoped Classical in +/-- Restriction from the complex-conjugation overextension back to +the original finite abelian extension. -/ +noncomputable def ramifiedInfinitePlaceOverextensionRestriction + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + Gal((infinitePlaceComplexificationOverfield + (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)) →* + Gal(L/K) := + (AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K) + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- Restricting ambient complex conjugation from `L(i)` to `L` +recovers the actual chosen local Artin symbol of negative one at the +original ramified place. -/ +theorem ramifiedInfinitePlaceOverextensionRestriction_conjugation + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + ramifiedInfinitePlaceOverextensionRestriction + (K := K) (L := L) v hRamified + (ramifiedInfinitePlaceOverextensionConjugation + (K := K) (L := L) v hRamified) = + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v + (-1 : v.Completionˣ) := by + apply AlgEquiv.ext + intro x + apply + (algebraMap L + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)).injective + change + algebraMap L + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + ((AlgEquiv.restrictNormalHom L + ((ramifiedInfinitePlaceOverextensionConjugation + (K := K) (L := L) v hRamified).restrictScalars K)) x) = + algebraMap L + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v + (-1 : v.Completionˣ) x) + have hrestrict : + algebraMap L + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + ((AlgEquiv.restrictNormalHom L + ((ramifiedInfinitePlaceOverextensionConjugation + (K := K) (L := L) v hRamified).restrictScalars K)) x) = + (ramifiedInfinitePlaceOverextensionConjugation + (K := K) (L := L) v hRamified).restrictScalars K + (algebraMap L + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) x) := by + exact + AlgEquiv.restrictNormal_commutes + ((ramifiedInfinitePlaceOverextensionConjugation + (K := K) (L := L) v hRamified).restrictScalars K) + L x + rw [hrestrict] + apply Subtype.ext + change + star + (InfinitePlace.embedding + (chosenInfinitePlaceAbove (L := L) v) x) = + InfinitePlace.embedding + (chosenInfinitePlaceAbove (L := L) v) + (chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v + (-1 : v.Completionˣ) x) + exact + (chosenInfinitePlaceArtinMonoidHom_neg_one_isConj_of_ramified + (K := K) (L := L) v hRamified).eq x |>.symm + +open scoped Classical in +/-- A rational-separable-closure embedding of the complexification +overfield extending the standard embedding of its original top field. -/ +noncomputable def + infinitePlaceComplexificationOverfieldSeparableClosureEmbedding + (v : InfinitePlace K) : + infinitePlaceComplexificationOverfield + (K := K) (L := L) v →ₐ[ℚ] + SeparableClosure ℚ := + Classical.choose + (IsAlgClosed.surjective_domRestrict_of_isAlgebraic + (K := ℚ) + (L := L) + (E := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (M := SeparableClosure ℚ) + (AlgebraicNumberTheory.numberFieldSeparableClosureEmbedding L)) + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- The separable-closure embedding of the complexification overfield +restricts to the standard embedding of its original top field. -/ +theorem + infinitePlaceComplexificationOverfieldSeparableClosureEmbedding_restrictDomain + (v : InfinitePlace K) : + (infinitePlaceComplexificationOverfieldSeparableClosureEmbedding + (K := K) (L := L) v).domRestrict L = + AlgebraicNumberTheory.numberFieldSeparableClosureEmbedding L := + Classical.choose_spec + (IsAlgClosed.surjective_domRestrict_of_isAlgebraic + (K := ℚ) + (L := L) + (E := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (M := SeparableClosure ℚ) + (AlgebraicNumberTheory.numberFieldSeparableClosureEmbedding L)) + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- The explicitly embedded norm-residue map for the quadratic +overextension has the genuine idele-class norm range as its kernel. -/ +theorem + ramifiedInfinitePlaceOverextension_globalNormResidueOfEmbedding_eq_one_iff + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) + (j : + infinitePlaceComplexificationOverfield + (K := K) (L := L) v →ₐ[ℚ] + SeparableClosure ℚ) + (c : + IdeleClassGroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)) : + globalNormResidueMonoidHomOfEmbedding + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + j c = + 1 ↔ + c ∈ + (_root_.ideleClassNorm + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)).range := by + let e : + (IdeleClassGroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) ⧸ + (_root_.ideleClassNorm + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)).range) ≃* + Gal((infinitePlaceComplexificationOverfield + (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)) := + AddEquiv.toMultiplicative + (globalNormResidueEquivOfEmbedding + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + j) + change + e (QuotientGroup.mk' + (_root_.ideleClassNorm + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)).range c) = + 1 ↔ + c ∈ + (_root_.ideleClassNorm + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)).range + constructor + · intro h + have hq : + QuotientGroup.mk' + (_root_.ideleClassNorm + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)).range c = + 1 := by + apply e.injective + exact h.trans (map_one e).symm + exact (QuotientGroup.eq_one_iff c).1 hq + · intro hc + have hq : + QuotientGroup.mk' + (_root_.ideleClassNorm + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)).range c = + 1 := + (QuotientGroup.eq_one_iff c).2 hc + calc + e (QuotientGroup.mk' + (_root_.ideleClassNorm + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)).range c) = e 1 := + congrArg e hq + _ = 1 := map_one e + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- For every rational-separable-closure embedding, the norm-residue +value of the concrete upper negative-one one-place class is ambient +complex conjugation. The point is independent of the embedding +because the upper Galois group is the actual two-element group and all +these maps have the same genuine norm kernel. -/ +theorem + ramifiedInfinitePlaceOverextension_globalNormResidueOfEmbedding_neg_one + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) + (j : + infinitePlaceComplexificationOverfield + (K := K) (L := L) v →ₐ[ℚ] + SeparableClosure ℚ) : + globalNormResidueMonoidHomOfEmbedding + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + j + (IdeleGroup.infinitePlaceIdeleClass + (ramifiedInfinitePlaceRealFixedPlace + (K := K) (L := L) v hRamified) + (-1 : + (ramifiedInfinitePlaceRealFixedPlace + (K := K) (L := L) v hRamified).Completionˣ)) = + ramifiedInfinitePlaceOverextensionConjugation + (K := K) (L := L) v hRamified := by + rcases + ramifiedInfinitePlaceOverextension_eq_one_or_conjugation + (K := K) (L := L) v hRamified + (globalNormResidueMonoidHomOfEmbedding + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + j + (IdeleGroup.infinitePlaceIdeleClass + (ramifiedInfinitePlaceRealFixedPlace + (K := K) (L := L) v hRamified) + (-1 : + (ramifiedInfinitePlaceRealFixedPlace + (K := K) (L := L) v hRamified).Completionˣ))) with + htrivial | hconjugation + · exfalso + have hnorm : + IdeleGroup.infinitePlaceIdeleClass + (ramifiedInfinitePlaceRealFixedPlace + (K := K) (L := L) v hRamified) + (-1 : + (ramifiedInfinitePlaceRealFixedPlace + (K := K) (L := L) v hRamified).Completionˣ) ∈ + (_root_.ideleClassNorm + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)).range := + (ramifiedInfinitePlaceOverextension_globalNormResidueOfEmbedding_eq_one_iff + (K := K) (L := L) v hRamified j _).mp htrivial + have hstandard : + globalNormResidueMonoidHom + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (IdeleGroup.infinitePlaceIdeleClass + (ramifiedInfinitePlaceRealFixedPlace + (K := K) (L := L) v hRamified) + (-1 : + (ramifiedInfinitePlaceRealFixedPlace + (K := K) (L := L) v hRamified).Completionˣ)) = + 1 := + (globalNormResidueMonoidHom_eq_one_iff + (K := + ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (L := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + _).2 hnorm + rw [ + ramifiedInfinitePlaceOverextension_globalNormResidue_neg_one] + at hstandard + apply + ramifiedInfinitePlaceOverextensionCyclotomicRestriction_conjugation_ne_one + (K := K) (L := L) v hRamified + rw [hstandard, map_one] + · exact hconjugation + +open scoped Classical in +/-- The base global norm-residue value at the negative-one class of `v`. -/ +noncomputable def ramifiedInfinitePlaceGlobalNormResidueNegOneValue + (v : InfinitePlace K) : + Gal(L/K) := + globalNormResidueMonoidHom K L + (IdeleGroup.infinitePlaceIdeleClass v (-1 : v.Completionˣ)) + +open scoped Classical in +/-- The chosen local Artin value at negative one at `v`. -/ +noncomputable def ramifiedInfinitePlaceLocalArtinNegOneValue + (v : InfinitePlace K) : + Gal(L/K) := + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v (-1 : v.Completionˣ) + +open scoped Classical in +/-- The embedding of `L` induced by the chosen embedding of its +complexification overfield. -/ +noncomputable def + infinitePlaceComplexificationLowerSeparableClosureEmbedding + (v : InfinitePlace K) : + L →ₐ[ℚ] SeparableClosure ℚ := + (infinitePlaceComplexificationOverfieldSeparableClosureEmbedding + (K := K) (L := L) v).comp + (IsScalarTower.toAlgHom ℚ L + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)) + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- The induced lower embedding is the standard number-field embedding. -/ +theorem + infinitePlaceComplexificationLowerSeparableClosureEmbedding_eq_standard + (v : InfinitePlace K) : + infinitePlaceComplexificationLowerSeparableClosureEmbedding + (K := K) (L := L) v = + AlgebraicNumberTheory.numberFieldSeparableClosureEmbedding L := by + simpa only [ + infinitePlaceComplexificationLowerSeparableClosureEmbedding, + AlgHom.domRestrict] using + infinitePlaceComplexificationOverfieldSeparableClosureEmbedding_restrictDomain + (K := K) (L := L) v + +open scoped Classical in +/-- The upper negative-one idele class used in the overextension diamond. -/ +noncomputable def ramifiedInfinitePlaceOverextensionNegOneIdeleClass + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + IdeleClassGroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) := + IdeleGroup.infinitePlaceIdeleClass + (ramifiedInfinitePlaceRealFixedPlace + (K := K) (L := L) v hRamified) + (-1 : + (ramifiedInfinitePlaceRealFixedPlace + (K := K) (L := L) v hRamified).Completionˣ) + +open scoped Classical in +/-- The upper global norm-residue value in the overextension diamond. -/ +noncomputable def + ramifiedInfinitePlaceOverextensionGlobalNormResidueNegOneValue + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + Gal((infinitePlaceComplexificationOverfield + (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)) := + globalNormResidueMonoidHomOfEmbedding + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (infinitePlaceComplexificationOverfieldSeparableClosureEmbedding + (K := K) (L := L) v) + (ramifiedInfinitePlaceOverextensionNegOneIdeleClass + (K := K) (L := L) v hRamified) + +open scoped Classical in +/-- The upper norm-residue value after actual Galois restriction. -/ +noncomputable def + ramifiedInfinitePlaceRestrictedOverextensionNormResidueNegOneValue + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + Gal(L/K) := + ramifiedInfinitePlaceOverextensionRestriction + (K := K) (L := L) v hRamified + (ramifiedInfinitePlaceOverextensionGlobalNormResidueNegOneValue + (K := K) (L := L) v hRamified) + +open scoped Classical in +/-- The lower norm-residue value of the normed upper negative-one class. -/ +noncomputable def + ramifiedInfinitePlaceNormedOverextensionNormResidueNegOneValue + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + Gal(L/K) := + globalNormResidueMonoidHomOfEmbedding K L + (infinitePlaceComplexificationLowerSeparableClosureEmbedding + (K := K) (L := L) v) + (_root_.ideleClassNorm K + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (ramifiedInfinitePlaceOverextensionNegOneIdeleClass + (K := K) (L := L) v hRamified)) + +open scoped Classical in +private theorem ramifiedInfinitePlace_normResidueDiamond_neg_one + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + ramifiedInfinitePlaceRestrictedOverextensionNormResidueNegOneValue + (K := K) (L := L) v hRamified = + ramifiedInfinitePlaceNormedOverextensionNormResidueNegOneValue + (K := K) (L := L) v hRamified := by + exact + DFunLike.congr_fun + (globalNormResidueMonoidHomOfEmbedding_norm_restriction + (K := K) (L := L) + (K' := + ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (L' := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (infinitePlaceComplexificationOverfieldSeparableClosureEmbedding + (K := K) (L := L) v)) + (ramifiedInfinitePlaceOverextensionNegOneIdeleClass + (K := K) (L := L) v hRamified) + +omit [FiniteDimensional K L] in +open scoped Classical in +private theorem + ramifiedInfinitePlace_restrictedOverextensionNormResidue_neg_one + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + ramifiedInfinitePlaceRestrictedOverextensionNormResidueNegOneValue + (K := K) (L := L) v hRamified = + ramifiedInfinitePlaceLocalArtinNegOneValue + (K := K) (L := L) v := by + rw [ + ramifiedInfinitePlaceRestrictedOverextensionNormResidueNegOneValue, + ramifiedInfinitePlaceOverextensionGlobalNormResidueNegOneValue, + ramifiedInfinitePlaceOverextensionNegOneIdeleClass, + ramifiedInfinitePlaceLocalArtinNegOneValue, + ramifiedInfinitePlaceOverextension_globalNormResidueOfEmbedding_neg_one, + ramifiedInfinitePlaceOverextensionRestriction_conjugation] + +open scoped Classical in +private theorem ramifiedInfinitePlace_normedNormResidue_neg_one + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + ramifiedInfinitePlaceNormedOverextensionNormResidueNegOneValue + (K := K) (L := L) v hRamified = + ramifiedInfinitePlaceGlobalNormResidueNegOneValue + (K := K) (L := L) v := by + rw [ + ramifiedInfinitePlaceNormedOverextensionNormResidueNegOneValue, + infinitePlaceComplexificationLowerSeparableClosureEmbedding_eq_standard, + ← globalNormResidueMonoidHom_eq_ofEmbedding_standard, + ramifiedInfinitePlaceOverextensionNegOneIdeleClass, + IdeleGroup.ideleClassNorm_infinitePlaceIdeleClass_neg_one_of_isReal + (K := K) + (L := + ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (ramifiedInfinitePlaceRealFixedPlace + (K := K) (L := L) v hRamified) + (ramifiedInfinitePlaceRealFixedPlace_isReal + (K := K) (L := L) v hRamified), + infinitePlaceBelow_ramifiedInfinitePlaceRealFixedPlace, + ramifiedInfinitePlaceGlobalNormResidueNegOneValue] + +open scoped Classical in +/-- At every ramified real place of a finite abelian extension, the +canonical global norm-residue symbol of the one-place negative-one +idele class is the actual chosen local Artin symbol. + +The proof is the concrete complex-conjugation overextension diamond: +the upper equality is the rational fourth-root product formula, the +vertical map on idele classes is the genuine one-place norm, and the +vertical map on Galois groups is actual restriction. -/ +theorem + globalNormResidueMonoidHom_infinitePlaceIdeleClass_neg_one_of_ramified + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + ramifiedInfinitePlaceGlobalNormResidueNegOneValue + (K := K) (L := L) v = + ramifiedInfinitePlaceLocalArtinNegOneValue + (K := K) (L := L) v := by + exact + (ramifiedInfinitePlace_normedNormResidue_neg_one + (K := K) (L := L) v hRamified).symm |>.trans + ((ramifiedInfinitePlace_normResidueDiamond_neg_one + (K := K) (L := L) v hRamified).symm.trans + (ramifiedInfinitePlace_restrictedOverextensionNormResidue_neg_one + (K := K) (L := L) v hRamified)) + +end ComplexConjugationOverextension + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceOverfield.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceOverfield.lean new file mode 100644 index 0000000000..1d3d077d6a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceOverfield.lean @@ -0,0 +1,745 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RationalComplexification +/-! +# The complex-conjugation overfield at an infinite place + +This module realizes the embedded field `L(i)` inside `ℂ`, constructs its +complex place, and identifies ambient complex conjugation on that field. +-/ + +@[expose] public section + +open scoped IsMulCommutative +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +section ComplexConjugationOverextension + +variable + {K L : Type} + [Field K] + [Field L] [NumberField L] [Algebra K L] + +open scoped Classical in +/-- The field range of a complex embedding is preserved by complex +conjugation when a relative automorphism realizes that conjugation. -/ +theorem complexEmbeddingFieldRange_map_complexConjugation + (φ : L →+* ℂ) + (σ : L ≃ₐ[K] L) + (hσ : NumberField.ComplexEmbedding.IsConj φ σ) : + φ.toRatAlgHom.fieldRange.map + (Complex.conjAe.restrictScalars ℚ).toAlgHom = + φ.toRatAlgHom.fieldRange := by + rw [AlgHom.map_fieldRange] + apply SetLike.ext + intro z + constructor + · rintro ⟨x, rfl⟩ + refine ⟨σ x, ?_⟩ + exact hσ.eq x + · rintro ⟨x, rfl⟩ + refine ⟨σ.symm x, ?_⟩ + calc + (Complex.conjAe.restrictScalars ℚ) + (φ (σ.symm x)) = + φ (σ (σ.symm x)) := + (hσ.eq (σ.symm x)).symm + _ = φ x := by rw [σ.apply_symm_apply] + +variable + [NumberField K] + [FiniteDimensional K L] [IsAbelianGalois K L] + +open scoped Classical in +/-- The concrete field `L(i)` inside `ℂ`, formed using the complex +embedding belonging to the chosen place above `v`. -/ +def infinitePlaceComplexificationOverfield + (v : InfinitePlace K) : + IntermediateField ℚ ℂ := + (InfinitePlace.embedding + (chosenInfinitePlaceAbove (L := L) v)).toRatAlgHom.fieldRange ⊔ + complexFourthRootField + +open scoped Classical in +/-- The complex overfield attached to an infinite place carries its intermediate-field rational +algebra structure. -/ +@[reducible] +noncomputable local instance + infinitePlaceComplexificationOverfieldRationalAlgebra + (v : InfinitePlace K) : + Algebra ℚ + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v).algebra' + +attribute [local instance] infinitePlaceComplexificationOverfieldRationalAlgebra + +open scoped Classical in +noncomputable instance + infinitePlaceComplexificationOverfield_finiteDimensional + (v : InfinitePlace K) : + FiniteDimensional ℚ + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := by + let φ := + (InfinitePlace.embedding + (chosenInfinitePlaceAbove (L := L) v)).toRatAlgHom + let : FiniteDimensional ℚ φ.fieldRange := + φ.equivFieldRange.toLinearEquiv.finiteDimensional + exact + IntermediateField.finiteDimensional_sup + φ.fieldRange complexFourthRootField + +open scoped Classical in +noncomputable instance + infinitePlaceComplexificationOverfield_numberField + (v : InfinitePlace K) : + NumberField + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + NumberField.of_module_finite ℚ + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + +open scoped Classical in +/-- The chosen top-field embedding `L → L(i)`. -/ +noncomputable def infinitePlaceComplexificationOverfieldEmbedding + (v : InfinitePlace K) : + L →ₐ[ℚ] + infinitePlaceComplexificationOverfield + (K := K) (L := L) v := + let φ := + (InfinitePlace.embedding + (chosenInfinitePlaceAbove (L := L) v)).toRatAlgHom + φ.codRestrict + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v).toSubalgebra + (fun x => + (show + φ.fieldRange ≤ + infinitePlaceComplexificationOverfield + (K := K) (L := L) v from + le_sup_left) + (show φ x ∈ φ.fieldRange from + (AlgHom.mem_fieldRange).mpr ⟨x, rfl⟩)) + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- The chosen embedding into the complexification overfield agrees +with the original complex embedding after coercion to `ℂ`. -/ +@[simp] +theorem infinitePlaceComplexificationOverfieldEmbedding_coe + (v : InfinitePlace K) (x : L) : + ((infinitePlaceComplexificationOverfieldEmbedding + (K := K) (L := L) v x : + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) : ℂ) = + InfinitePlace.embedding + (chosenInfinitePlaceAbove (L := L) v) x := by + change + (InfinitePlace.embedding + (chosenInfinitePlaceAbove (L := L) v)).toRatAlgHom x = + InfinitePlace.embedding + (chosenInfinitePlaceAbove (L := L) v) x + rfl + +open scoped Classical in +noncomputable instance + infinitePlaceComplexificationOverfieldAlgebra + (v : InfinitePlace K) : + Algebra L + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + (infinitePlaceComplexificationOverfieldEmbedding + (K := K) (L := L) v).toRingHom.toAlgebra + +open scoped Classical in +/-- The scalar action belonging to the chosen top-field embedding. -/ +noncomputable instance + infinitePlaceComplexificationOverfieldSmul + (v : InfinitePlace K) : + SMul L + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + (infinitePlaceComplexificationOverfieldAlgebra + (K := K) (L := L) v).toSMul + +open scoped Classical in +instance + infinitePlaceComplexificationOverfield_ratScalarTower + (v : InfinitePlace K) : + IsScalarTower ℚ L + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + IsScalarTower.of_algebraMap_eq' + (infinitePlaceComplexificationOverfieldEmbedding + (K := K) (L := L) v).comp_algebraMap.symm + +open scoped Classical in +noncomputable instance + infinitePlaceComplexificationOverfieldBaseAlgebra + (v : InfinitePlace K) : + Algebra K + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + ((infinitePlaceComplexificationOverfieldEmbedding + (K := K) (L := L) v).comp + (IsScalarTower.toAlgHom ℚ K L)).toRingHom.toAlgebra + +open scoped Classical in +/-- The scalar action induced from the original base-field embedding. -/ +noncomputable instance + infinitePlaceComplexificationOverfieldBaseSmul + (v : InfinitePlace K) : + SMul K + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + (infinitePlaceComplexificationOverfieldBaseAlgebra + (K := K) (L := L) v).toSMul + +open scoped Classical in +instance + infinitePlaceComplexificationOverfield_baseRatScalarTower + (v : InfinitePlace K) : + IsScalarTower ℚ K + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + IsScalarTower.of_algebraMap_eq' + (((infinitePlaceComplexificationOverfieldEmbedding + (K := K) (L := L) v).comp + (IsScalarTower.toAlgHom ℚ K L)).comp_algebraMap).symm + +open scoped Classical in +instance + infinitePlaceComplexificationOverfield_scalarTower + (v : InfinitePlace K) : + IsScalarTower K L + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + IsScalarTower.of_algebraMap_eq' rfl + +open scoped Classical in +noncomputable instance + infinitePlaceComplexificationOverfield_finiteDimensional_over_extension + (v : InfinitePlace K) : + FiniteDimensional L + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + FiniteDimensional.right ℚ L + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + +open scoped Classical in +/-- The cyclotomic fourth-root field embeds into the concrete +overfield through its copy in `ℂ`. -/ +noncomputable def + rationalComplexificationEmbeddingInInfinitePlaceOverfield + (v : InfinitePlace K) : + rationalComplexificationCyclotomicField →ₐ[ℚ] + infinitePlaceComplexificationOverfield + (K := K) (L := L) v := + (IntermediateField.inclusion + (show + complexFourthRootField ≤ + infinitePlaceComplexificationOverfield + (K := K) (L := L) v from + le_sup_right)).comp + (rationalComplexificationComplexEquiv.toAlgHom) + +open scoped Classical in +omit [NumberField K] [FiniteDimensional K L] in +/-- The fourth-root-field embedding preserves the chosen complex value. -/ +theorem rationalComplexificationEmbeddingInInfinitePlaceOverfield_coe + (v : InfinitePlace K) (x : rationalComplexificationCyclotomicField) : + ((rationalComplexificationEmbeddingInInfinitePlaceOverfield + (K := K) (L := L) v x : + infinitePlaceComplexificationOverfield (K := K) (L := L) v) : ℂ) = + (rationalComplexificationComplexEquiv x : ℂ) := rfl + +open scoped Classical in +noncomputable instance + rationalComplexificationInfinitePlaceOverfieldAlgebra + (v : InfinitePlace K) : + Algebra rationalComplexificationCyclotomicField + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + (rationalComplexificationEmbeddingInInfinitePlaceOverfield + (K := K) (L := L) v).toRingHom.toAlgebra + +open scoped Classical in +/-- The scalar action induced by the concrete fourth-root-field +embedding. Declaring it directly keeps instance search away from +unrelated intermediate-field algebra structures. -/ +noncomputable instance + rationalComplexificationInfinitePlaceOverfieldSmul + (v : InfinitePlace K) : + SMul rationalComplexificationCyclotomicField + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + (rationalComplexificationInfinitePlaceOverfieldAlgebra + (K := K) (L := L) v).toSMul + +open scoped Classical in +instance + rationalComplexification_infinitePlaceOverfield_scalarTower + (v : InfinitePlace K) : + IsScalarTower ℚ rationalComplexificationCyclotomicField + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + IsScalarTower.of_algebraMap_eq' + (rationalComplexificationEmbeddingInInfinitePlaceOverfield + (K := K) (L := L) v).comp_algebraMap.symm + +open scoped Classical in +/-- The copy of the given abelian extension inside the concrete +complexification overfield, viewed over the original base field. -/ +noncomputable def infinitePlaceEmbeddedExtensionField + (v : InfinitePlace K) : + IntermediateField K + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + (IsScalarTower.toAlgHom K L + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)).fieldRange + +open scoped Classical in +noncomputable instance + infinitePlaceEmbeddedExtensionField_isAbelianGalois + (v : InfinitePlace K) : + IsAbelianGalois K + (infinitePlaceEmbeddedExtensionField + (K := K) (L := L) v) := + IsAbelianGalois.of_algHom + (IsScalarTower.toAlgHom K L + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)).equivFieldRange.symm.toAlgHom + +open scoped Classical in +/-- The fourth-root cyclotomic factor over the original base field, +inside the concrete complexification overfield. -/ +noncomputable def infinitePlaceBaseFourthRootField + (v : InfinitePlace K) : + IntermediateField K + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + IntermediateField.adjoin K + {z : + infinitePlaceComplexificationOverfield + (K := K) (L := L) v | + ∃ n ∈ ({4} : Set ℕ), n ≠ 0 ∧ z ^ n = 1} + +open scoped Classical in +noncomputable instance + infinitePlaceBaseFourthRootField_isCyclotomic + (v : InfinitePlace K) : + IsCyclotomicExtension {4} K + (infinitePlaceBaseFourthRootField + (K := K) (L := L) v) := by + apply + IntermediateField.isCyclotomicExtension_adjoin_of_exists_isPrimitiveRoot + ({4} : Set ℕ) K + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + intro n hn _hn0 + rw [Set.mem_singleton_iff] at hn + subst n + let C := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v + let ζ : C := + ⟨Complex.I, + (show complexFourthRootField ≤ C from le_sup_right) + (IntermediateField.subset_adjoin + ℚ + {z : ℂ | + ∃ n ∈ ({4} : Set ℕ), + n ≠ 0 ∧ z ^ n = 1} + ⟨4, Set.mem_singleton 4, by norm_num, + by norm_num [pow_succ, Complex.I_sq]⟩)⟩ + refine ⟨ζ, ?_⟩ + apply IsPrimitiveRoot.of_map_of_injective + (f := + (C.val : C →ₐ[ℚ] ℂ)) + (ζ := ζ) + (k := 4) + · change IsPrimitiveRoot Complex.I 4 + exact complexI_isPrimitiveRoot_four + · exact C.val.injective + +open scoped Classical in +noncomputable instance + infinitePlaceBaseFourthRootField_isAbelianGalois + (v : InfinitePlace K) : + IsAbelianGalois K + (infinitePlaceBaseFourthRootField + (K := K) (L := L) v) := + IsCyclotomicExtension.isAbelianGalois + ({4} : Set ℕ) K + (infinitePlaceBaseFourthRootField + (K := K) (L := L) v) + +omit [FiniteDimensional K L] in +open scoped Classical in +private noncomputable def infinitePlaceRatEmbeddedExtensionField + (v : InfinitePlace K) : + IntermediateField ℚ + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + let φ := + (InfinitePlace.embedding + (chosenInfinitePlaceAbove (L := L) v)).toRatAlgHom + φ.fieldRange.restrict + (show + φ.fieldRange ≤ + infinitePlaceComplexificationOverfield + (K := K) (L := L) v from + le_sup_left) + +omit [FiniteDimensional K L] in +open scoped Classical in +private noncomputable def infinitePlaceRatFourthRootField + (v : InfinitePlace K) : + IntermediateField ℚ + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + complexFourthRootField.restrict + (show + complexFourthRootField ≤ + infinitePlaceComplexificationOverfield + (K := K) (L := L) v from + le_sup_right) + +omit [FiniteDimensional K L] in +open scoped Classical in +private noncomputable def infinitePlaceRatComplexificationFactors + (v : InfinitePlace K) : + IntermediateField ℚ + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + (infinitePlaceEmbeddedExtensionField + (K := K) (L := L) v ⊔ + infinitePlaceBaseFourthRootField + (K := K) (L := L) v).restrictScalars ℚ + +omit [FiniteDimensional K L] in +open scoped Classical in +private theorem infinitePlaceRatEmbeddedExtensionField_le_factors + (v : InfinitePlace K) : + infinitePlaceRatEmbeddedExtensionField + (K := K) (L := L) v ≤ + infinitePlaceRatComplexificationFactors + (K := K) (L := L) v := by + let C := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v + let φ := + (InfinitePlace.embedding + (chosenInfinitePlaceAbove (L := L) v)).toRatAlgHom + let A := + infinitePlaceEmbeddedExtensionField + (K := K) (L := L) v + let B := + infinitePlaceBaseFourthRootField + (K := K) (L := L) v + intro x hx + have hx' : + (x : C).1 ∈ φ.fieldRange := + (IntermediateField.mem_restrict + (show φ.fieldRange ≤ C from le_sup_left) x).mp hx + obtain ⟨y, hy⟩ := hx' + change (x : C) ∈ A ⊔ B + apply (show A ≤ A ⊔ B from le_sup_left) + change + (x : C) ∈ + (IsScalarTower.toAlgHom K L C).fieldRange + refine ⟨y, ?_⟩ + apply Subtype.ext + calc + ((IsScalarTower.toAlgHom K L C y : C) : ℂ) = + InfinitePlace.embedding + (chosenInfinitePlaceAbove (L := L) v) y := by + change + ((infinitePlaceComplexificationOverfieldEmbedding + (K := K) (L := L) v y : C) : ℂ) = _ + exact + infinitePlaceComplexificationOverfieldEmbedding_coe + (K := K) (L := L) v y + _ = (x : C).1 := hy + +omit [FiniteDimensional K L] in +open scoped Classical in +private theorem infinitePlaceRatFourthRootField_le_factors + (v : InfinitePlace K) : + infinitePlaceRatFourthRootField + (K := K) (L := L) v ≤ + infinitePlaceRatComplexificationFactors + (K := K) (L := L) v := by + let C := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v + let A := + infinitePlaceEmbeddedExtensionField + (K := K) (L := L) v + let B := + infinitePlaceBaseFourthRootField + (K := K) (L := L) v + intro x hx + have hx' : + (x : C).1 ∈ complexFourthRootField := + (IntermediateField.mem_restrict + (show complexFourthRootField ≤ C from le_sup_right) x).mp hx + let y : complexFourthRootField := ⟨(x : C).1, hx'⟩ + let i : complexFourthRootField →ₐ[ℚ] C := + IntermediateField.inclusion + (show complexFourthRootField ≤ C from le_sup_right) + have hy : + y ∈ + Algebra.adjoin ℚ + {z : complexFourthRootField | + ∃ n ∈ ({4} : Set ℕ), + n ≠ 0 ∧ z ^ n = 1} := + IsCyclotomicExtension.adjoin_roots y + have hiy : i y ∈ B := by + refine Algebra.adjoin_induction ?_ ?_ ?_ ?_ hy + · intro z hz + change + i z ∈ + IntermediateField.adjoin K + {w : C | + ∃ n ∈ ({4} : Set ℕ), + n ≠ 0 ∧ w ^ n = 1} + apply IntermediateField.subset_adjoin K + rcases hz with ⟨n, hn, hn0, hz⟩ + exact + ⟨n, hn, hn0, by + rw [← map_pow, hz, map_one]⟩ + · intro q + rw [i.commutes, + IsScalarTower.algebraMap_apply ℚ K C] + exact B.algebraMap_mem (algebraMap ℚ K q) + · intro z w _hz _hw hiz hiw + exact B.add_mem hiz hiw + · intro z w _hz _hw hiz hiw + exact B.mul_mem hiz hiw + change (x : C) ∈ A ⊔ B + apply (show B ≤ A ⊔ B from le_sup_right) + have hiyx : i y = (x : C) := by + apply Subtype.ext + rfl + rw [← hiyx] + exact hiy + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +private theorem infinitePlaceRatComplexificationFactors_sup + (v : InfinitePlace K) : + infinitePlaceRatEmbeddedExtensionField + (K := K) (L := L) v ⊔ + infinitePlaceRatFourthRootField + (K := K) (L := L) v = + ⊤ := by + apply IntermediateField.lift_injective + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + rw [infinitePlaceRatEmbeddedExtensionField, + infinitePlaceRatFourthRootField, + IntermediateField.lift_sup, + IntermediateField.lift_restrict, + IntermediateField.lift_restrict, + IntermediateField.lift_top] + rfl + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- The embedded abelian extension and the base-changed fourth-root +factor generate the whole concrete complexification overfield. -/ +theorem infinitePlaceComplexificationFactors_sup + (v : InfinitePlace K) : + infinitePlaceEmbeddedExtensionField + (K := K) (L := L) v ⊔ + infinitePlaceBaseFourthRootField + (K := K) (L := L) v = + ⊤ := by + apply + (IntermediateField.restrictScalars_eq_top_iff + (K := ℚ)).mp + change + infinitePlaceRatComplexificationFactors + (K := K) (L := L) v = + ⊤ + apply top_unique + rw [← infinitePlaceRatComplexificationFactors_sup + (K := K) (L := L) v] + exact sup_le + (infinitePlaceRatEmbeddedExtensionField_le_factors + (K := K) (L := L) v) + (infinitePlaceRatFourthRootField_le_factors + (K := K) (L := L) v) + +open scoped Classical in +noncomputable instance + infinitePlaceComplexificationOverfield_isAbelianGalois_over_base + (v : InfinitePlace K) : + IsAbelianGalois K + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := by + let C := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v + let A := + infinitePlaceEmbeddedExtensionField + (K := K) (L := L) v + let B := + infinitePlaceBaseFourthRootField + (K := K) (L := L) v + let : FiniteDimensional K A := + (IsScalarTower.toAlgHom K L C).equivFieldRange.toLinearEquiv + |>.finiteDimensional + let : FiniteDimensional K B := + IsCyclotomicExtension.finiteDimensional + ({4} : Set ℕ) K B + let : + IsAbelianGalois K + (⊤ : IntermediateField K C) := by + rw [← infinitePlaceComplexificationFactors_sup + (K := K) (L := L) v] + exact + AlgebraicNumberTheory.isAbelianGalois_sup K A B + exact + IsAbelianGalois.of_algHom + (IntermediateField.topEquiv.symm.toAlgHom : + C →ₐ[K] (⊤ : IntermediateField K C)) + +open scoped Classical in +noncomputable instance + infinitePlaceComplexificationOverfield_isTotallyComplex + (v : InfinitePlace K) : + IsTotallyComplex + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + NumberField.isTotallyComplex_of_algebra + rationalComplexificationCyclotomicField + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + +open scoped Classical in +/-- The infinite place on the concrete overfield induced by its +inclusion into `ℂ`. -/ +noncomputable def infinitePlaceComplexificationOverfieldComplexPlace + (v : InfinitePlace K) : + InfinitePlace + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + InfinitePlace.mk + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v).val.toRingHom + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- Complex conjugation preserves the concrete overfield `L(i)` at a +ramified chosen place. Preservation of the `L`-factor is the actual +local Artin value being a conjugation; preservation of the fourth-root +factor is intrinsic. -/ +theorem infinitePlaceComplexificationOverfield_map_complexConjugation + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v).map + (Complex.conjAe.restrictScalars ℚ).toAlgHom = + infinitePlaceComplexificationOverfield + (K := K) (L := L) v := by + rw [infinitePlaceComplexificationOverfield, + IntermediateField.map_sup, + complexEmbeddingFieldRange_map_complexConjugation + (K := K) + (L := L) + (φ := + InfinitePlace.embedding + (chosenInfinitePlaceAbove (L := L) v)) + (σ := + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v + (-1 : v.Completionˣ)) + (hσ := + chosenInfinitePlaceArtinMonoidHom_neg_one_isConj_of_ramified + (K := K) (L := L) v hRamified), + complexFourthRootField_map_complexConjugation] + +open scoped Classical in +/-- Complex conjugation restricted to the actual overfield `L(i)`. -/ +noncomputable def ramifiedInfinitePlaceOverfieldConjugation + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + infinitePlaceComplexificationOverfield + (K := K) (L := L) v ≃ₐ[ℚ] + infinitePlaceComplexificationOverfield + (K := K) (L := L) v := + (IntermediateField.equivMap + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (Complex.conjAe.restrictScalars ℚ).toAlgHom).trans + (IntermediateField.equivOfEq + (infinitePlaceComplexificationOverfield_map_complexConjugation + (K := K) (L := L) v hRamified)) + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- The restricted overfield automorphism acts by ambient complex +conjugation. -/ +@[simp] +theorem ramifiedInfinitePlaceOverfieldConjugation_apply + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) + (z : + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) : + (ramifiedInfinitePlaceOverfieldConjugation + (K := K) (L := L) v hRamified z : ℂ) = + star (z : ℂ) := by + rfl + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- The restricted overfield complex conjugation is an involution. -/ +@[simp] +theorem ramifiedInfinitePlaceOverfieldConjugation_sq + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + ramifiedInfinitePlaceOverfieldConjugation + (K := K) (L := L) v hRamified * + ramifiedInfinitePlaceOverfieldConjugation + (K := K) (L := L) v hRamified = + 1 := by + apply AlgEquiv.ext + intro z + apply Subtype.ext + change + (ramifiedInfinitePlaceOverfieldConjugation + (K := K) (L := L) v hRamified + (ramifiedInfinitePlaceOverfieldConjugation + (K := K) (L := L) v hRamified z) : ℂ) = + (z : ℂ) + simp only [ramifiedInfinitePlaceOverfieldConjugation_apply, + star_star] + +end ComplexConjugationOverextension + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean new file mode 100644 index 0000000000..eedf7b3496 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean @@ -0,0 +1,494 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RationalComplexification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +public import Mathlib.FieldTheory.Galois.Abelian +/-! +# Complexification of a number field + +This module forms the actual compositum with the rational fourth-root field +and proves that restriction to the rational cyclotomic factor is faithful. +-/ + +@[expose] public section + +open scoped IsMulCommutative +open AlgebraicNumberTheory NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +attribute [local instance] + rationalComplexificationCyclotomicField_isAbelianGalois + +open scoped Classical in +/-- The rational complexification field lifted into the rational separable closure. -/ +def rationalComplexificationAmbientField : + IntermediateField ℚ (SeparableClosure ℚ) := by + letI : Algebra ℚ KummerTheory.rationalCyclotomicField := + DivisionRing.toRatAlgebra + exact IntermediateField.lift rationalComplexificationCyclotomicField + +open scoped Classical in +private noncomputable def rationalComplexificationAmbientEquiv : + rationalComplexificationCyclotomicField ≃ₐ[ℚ] + rationalComplexificationAmbientField := by + letI : Algebra ℚ KummerTheory.rationalCyclotomicField := + DivisionRing.toRatAlgebra + exact IntermediateField.liftAlgEquiv + rationalComplexificationCyclotomicField + +variable (F : Type*) [Field F] [NumberField F] + +open scoped Classical in +/-- The actual compositum of the chosen copy of `F` with the rational +complexification field inside `SeparableClosure ℚ`. -/ +def numberFieldComplexification : + IntermediateField ℚ (SeparableClosure ℚ) := + numberFieldInRationalSeparableClosure F ⊔ + rationalComplexificationAmbientField + +open scoped Classical in +/-- The complexification inside the rational separable closure carries its rational algebra +structure. -/ +@[reducible] +noncomputable local instance + numberFieldComplexificationRationalAlgebra : + Algebra ℚ (numberFieldComplexification F) := + (numberFieldComplexification F).algebra' + +attribute [local instance] numberFieldComplexificationRationalAlgebra + +open scoped Classical in +noncomputable instance numberFieldComplexification_finiteDimensional : + FiniteDimensional ℚ (numberFieldComplexification F) := by + let : + FiniteDimensional ℚ + rationalComplexificationAmbientField := + rationalComplexificationAmbientEquiv.toLinearEquiv.finiteDimensional + exact + IntermediateField.finiteDimensional_sup + (numberFieldInRationalSeparableClosure F) + rationalComplexificationAmbientField + +open scoped Classical in +noncomputable instance numberFieldComplexification_numberField : + NumberField (numberFieldComplexification F) := + NumberField.of_module_finite ℚ (numberFieldComplexification F) + +open scoped Classical in +/-- The chosen embedding of `F` into its actual complexification. -/ +noncomputable def numberFieldComplexificationEmbedding : + F →ₐ[ℚ] numberFieldComplexification F := + (numberFieldSeparableClosureEmbedding F).codRestrict + (numberFieldComplexification F).toSubalgebra + (fun x => + (show numberFieldInRationalSeparableClosure F ≤ + numberFieldComplexification F from le_sup_left) + (show numberFieldSeparableClosureEmbedding F x ∈ + numberFieldInRationalSeparableClosure F from + (AlgHom.mem_fieldRange).mpr ⟨x, rfl⟩)) + +open scoped Classical in +/-- The rational fourth-root cyclotomic field embedded into the +complexification of `F`. -/ +noncomputable def rationalComplexificationCompositumEmbedding : + rationalComplexificationCyclotomicField →ₐ[ℚ] + numberFieldComplexification F := + (IntermediateField.inclusion le_sup_right).comp + rationalComplexificationAmbientEquiv.toAlgHom + +open scoped Classical in +noncomputable instance numberFieldComplexificationAlgebra : + Algebra F (numberFieldComplexification F) := + (numberFieldComplexificationEmbedding F).toRingHom.toAlgebra + +open scoped Classical in +/-- The scalar action belonging to the chosen embedding of `F` into its +complexification. Naming it prevents typeclass search from finding a +definitionally different action through the ambient intermediate field. -/ +noncomputable instance numberFieldComplexificationSmul : + SMul F (numberFieldComplexification F) := + (numberFieldComplexificationAlgebra F).toSMul + +open scoped Classical in +noncomputable instance rationalComplexificationCompositumAlgebra : + Algebra rationalComplexificationCyclotomicField + (numberFieldComplexification F) := + (rationalComplexificationCompositumEmbedding F).toRingHom.toAlgebra + +open scoped Classical in +/-- The scalar action induced by the actual fourth-root-field embedding. +Declaring it directly prevents instance search from exploring unrelated +intermediate-field algebra structures. -/ +noncomputable instance rationalComplexificationCompositumSmul : + SMul rationalComplexificationCyclotomicField + (numberFieldComplexification F) := + (rationalComplexificationCompositumAlgebra F).toSMul + +open scoped Classical in +instance numberFieldComplexification_scalarTower : + IsScalarTower ℚ F (numberFieldComplexification F) := + IsScalarTower.of_algebraMap_eq' + (numberFieldComplexificationEmbedding F).comp_algebraMap.symm + +open scoped Classical in +instance rationalComplexificationCompositum_scalarTower : + IsScalarTower ℚ rationalComplexificationCyclotomicField + (numberFieldComplexification F) := + IsScalarTower.of_algebraMap_eq' + (rationalComplexificationCompositumEmbedding F).comp_algebraMap.symm + +open scoped Classical in +noncomputable instance + numberFieldComplexification_finiteDimensional_over_base : + FiniteDimensional F (numberFieldComplexification F) := + FiniteDimensional.right ℚ F (numberFieldComplexification F) + +open scoped Classical in +/-- Restriction from `F(μ₄)/F` to the rational fourth-root +cyclotomic factor. -/ +noncomputable def numberFieldComplexificationRestriction : + Gal(numberFieldComplexification F/F) →* + Gal(rationalComplexificationCyclotomicField/ℚ) := + IntermediateField.restrictRestrictAlgEquivMapHom + ℚ rationalComplexificationCyclotomicField F + (numberFieldComplexification F) + +open scoped Classical in +/-- The chosen copy of the base number field inside its complexification. -/ +def numberFieldComplexificationBaseLayer : + IntermediateField ℚ (numberFieldComplexification F) := + (numberFieldInRationalSeparableClosure F).restrict + (show numberFieldInRationalSeparableClosure F ≤ + numberFieldComplexification F from + le_sup_left) + +open scoped Classical in +/-- The rational complexification layer inside the complexification of a number field. -/ +def numberFieldComplexificationCyclotomicLayer : + IntermediateField ℚ (numberFieldComplexification F) := + rationalComplexificationAmbientField.restrict + (show + rationalComplexificationAmbientField ≤ + numberFieldComplexification F from + le_sup_right) + +open scoped Classical in +/-- The base layer inside the complexification carries its rational algebra structure. -/ +@[reducible] +noncomputable local instance + numberFieldComplexificationBaseLayerRationalAlgebra : + Algebra ℚ (numberFieldComplexificationBaseLayer F) := + (numberFieldComplexificationBaseLayer F).algebra' + +attribute [local instance] numberFieldComplexificationBaseLayerRationalAlgebra + +open scoped Classical in +/-- The cyclotomic layer inside the complexification carries its rational algebra structure. -/ +@[reducible] +noncomputable local instance + numberFieldComplexificationCyclotomicLayerRationalAlgebra : + Algebra ℚ (numberFieldComplexificationCyclotomicLayer F) := + (numberFieldComplexificationCyclotomicLayer F).algebra' + +attribute [local instance] numberFieldComplexificationCyclotomicLayerRationalAlgebra + +open scoped Classical in +private noncomputable def numberFieldComplexificationBaseEquiv : + F ≃ₐ[ℚ] numberFieldComplexificationBaseLayer F := + (numberFieldSeparableClosureEmbedding F).equivFieldRange.trans + (IntermediateField.restrictAlgEquiv le_sup_left) + +open scoped Classical in +private noncomputable def numberFieldComplexificationCyclotomicEquiv : + rationalComplexificationCyclotomicField ≃ₐ[ℚ] + numberFieldComplexificationCyclotomicLayer F := + rationalComplexificationAmbientEquiv.trans + (IntermediateField.restrictAlgEquiv le_sup_right) + +open scoped Classical in +private noncomputable local instance + numberFieldComplexificationCyclotomicLayer_isAbelianGalois : + IsAbelianGalois ℚ + (numberFieldComplexificationCyclotomicLayer F) := + IsAbelianGalois.of_algHom + (numberFieldComplexificationCyclotomicEquiv F).symm.toAlgHom + +attribute [local instance] numberFieldComplexificationCyclotomicLayer_isAbelianGalois + +open scoped Classical in +private noncomputable local instance + numberFieldComplexificationCyclotomicLayer_isGalois : + IsGalois ℚ (numberFieldComplexificationCyclotomicLayer F) := + (numberFieldComplexificationCyclotomicLayer_isAbelianGalois + F).toIsGalois + +attribute [local instance] numberFieldComplexificationCyclotomicLayer_isGalois + +open scoped Classical in +private noncomputable local instance + numberFieldComplexificationCyclotomicLayer_normal : + Normal ℚ (numberFieldComplexificationCyclotomicLayer F) := + (numberFieldComplexificationCyclotomicLayer_isGalois + F).to_normal + +attribute [local instance] numberFieldComplexificationCyclotomicLayer_normal + +open scoped Classical in +private theorem numberFieldComplexificationLayers_sup : + numberFieldComplexificationCyclotomicLayer F ⊔ + numberFieldComplexificationBaseLayer F = + ⊤ := by + apply IntermediateField.lift_injective + (numberFieldComplexification F) + rw [numberFieldComplexificationCyclotomicLayer, + numberFieldComplexificationBaseLayer, + IntermediateField.lift_sup, + IntermediateField.lift_restrict, + IntermediateField.lift_restrict, + IntermediateField.lift_top] + exact sup_comm _ _ + +open scoped Classical in +private theorem numberFieldComplexificationBaseEquiv_algebraMap + (x : F) : + algebraMap F (numberFieldComplexification F) x = + algebraMap (numberFieldComplexificationBaseLayer F) + (numberFieldComplexification F) + (numberFieldComplexificationBaseEquiv F x) := by + apply Subtype.ext + rfl + +open scoped Classical in +private noncomputable def numberFieldComplexificationChangeBase : + Gal(numberFieldComplexification F/F) →* + Gal(numberFieldComplexification F/numberFieldComplexificationBaseLayer F) where + toFun σ := + { σ.toRingEquiv with + commutes' := by + intro y + have hy : + algebraMap F (numberFieldComplexification F) + ((numberFieldComplexificationBaseEquiv F).symm y) = + algebraMap (numberFieldComplexificationBaseLayer F) + (numberFieldComplexification F) y := by + have hy' := + numberFieldComplexificationBaseEquiv_algebraMap F + ((numberFieldComplexificationBaseEquiv F).symm y) + rw [(numberFieldComplexificationBaseEquiv F).apply_symm_apply] + at hy' + exact hy' + rw [← hy] + change + σ (algebraMap F (numberFieldComplexification F) + ((numberFieldComplexificationBaseEquiv F).symm y)) = + algebraMap F (numberFieldComplexification F) + ((numberFieldComplexificationBaseEquiv F).symm y) + exact σ.commutes _ } + map_one' := rfl + map_mul' _ _ := rfl + +open scoped Classical in +private theorem numberFieldComplexificationChangeBase_injective : + Function.Injective (numberFieldComplexificationChangeBase F) := by + intro σ τ hστ + apply AlgEquiv.ext + intro x + exact congrArg + (fun f : + Gal(numberFieldComplexification F/numberFieldComplexificationBaseLayer F) => f x) + hστ + +open scoped Classical in +private noncomputable def numberFieldComplexificationLayerRestriction : + Gal(numberFieldComplexification F/numberFieldComplexificationBaseLayer F) →* + Gal(numberFieldComplexificationCyclotomicLayer F/ℚ) := by + letI : IsGalois ℚ (numberFieldComplexificationCyclotomicLayer F) := + numberFieldComplexificationCyclotomicLayer_isGalois F + letI : Normal ℚ (numberFieldComplexificationCyclotomicLayer F) := + numberFieldComplexificationCyclotomicLayer_normal F + exact + IntermediateField.restrictRestrictAlgEquivMapHom + ℚ (numberFieldComplexificationCyclotomicLayer F) + (numberFieldComplexificationBaseLayer F) + (numberFieldComplexification F) + +open scoped Classical in +private theorem numberFieldComplexificationLayerRestriction_injective : + Function.Injective + (numberFieldComplexificationLayerRestriction F) := by + let : IsGalois ℚ (numberFieldComplexificationCyclotomicLayer F) := + numberFieldComplexificationCyclotomicLayer_isGalois F + let : Normal ℚ (numberFieldComplexificationCyclotomicLayer F) := + numberFieldComplexificationCyclotomicLayer_normal F + exact + IntermediateField.restrictRestrictAlgEquivMapHom_injective + (numberFieldComplexificationCyclotomicLayer F) + (numberFieldComplexificationBaseLayer F) + (numberFieldComplexificationLayers_sup F) + +open scoped Classical in +private noncomputable def numberFieldComplexificationTransportCyclotomic : + Gal(rationalComplexificationCyclotomicField/ℚ) →* + Gal(numberFieldComplexificationCyclotomicLayer F/ℚ) := + (AlgEquiv.autCongr + (numberFieldComplexificationCyclotomicEquiv F)).toMonoidHom + +open scoped Classical in +private theorem numberFieldComplexificationRestriction_commutes + (σ : Gal(numberFieldComplexification F/F)) : + numberFieldComplexificationTransportCyclotomic F + (numberFieldComplexificationRestriction F σ) = + numberFieldComplexificationLayerRestriction F + (numberFieldComplexificationChangeBase F σ) := by + let : IsGalois ℚ (numberFieldComplexificationCyclotomicLayer F) := + numberFieldComplexificationCyclotomicLayer_isGalois F + let : Normal ℚ (numberFieldComplexificationCyclotomicLayer F) := + numberFieldComplexificationCyclotomicLayer_normal F + apply AlgEquiv.ext + intro x + obtain ⟨y, rfl⟩ := + (numberFieldComplexificationCyclotomicEquiv F).surjective x + apply Subtype.ext + have hraw : + (numberFieldComplexificationCyclotomicEquiv F + (numberFieldComplexificationRestriction F σ y) : + numberFieldComplexification F) = + σ (numberFieldComplexificationCyclotomicEquiv F y : + numberFieldComplexification F) := by + change + algebraMap rationalComplexificationCyclotomicField + (numberFieldComplexification F) + (numberFieldComplexificationRestriction F σ y) = + σ (algebraMap rationalComplexificationCyclotomicField + (numberFieldComplexification F) y) + change + algebraMap rationalComplexificationCyclotomicField + (numberFieldComplexification F) + ((AlgEquiv.restrictNormal + (MulSemiringAction.toAlgEquiv ℚ + (numberFieldComplexification F) σ) + rationalComplexificationCyclotomicField) y) = + (MulSemiringAction.toAlgEquiv ℚ + (numberFieldComplexification F) σ) + (algebraMap rationalComplexificationCyclotomicField + (numberFieldComplexification F) y) + exact + AlgEquiv.restrictNormal_commutes + (MulSemiringAction.toAlgEquiv ℚ + (numberFieldComplexification F) σ) + rationalComplexificationCyclotomicField y + have hrestrict : + (numberFieldComplexificationLayerRestriction F + (numberFieldComplexificationChangeBase F σ) + (numberFieldComplexificationCyclotomicEquiv F y) : + numberFieldComplexification F) = + numberFieldComplexificationChangeBase F σ + (numberFieldComplexificationCyclotomicEquiv F y : + numberFieldComplexification F) := + IntermediateField.restrictRestrictAlgEquivMapHom_apply + (numberFieldComplexificationCyclotomicLayer F) + (numberFieldComplexificationBaseLayer F) + (numberFieldComplexificationChangeBase F σ) + (numberFieldComplexificationCyclotomicEquiv F y) + calc + (numberFieldComplexificationTransportCyclotomic F + (numberFieldComplexificationRestriction F σ) + (numberFieldComplexificationCyclotomicEquiv F y) : + numberFieldComplexification F) = + (numberFieldComplexificationCyclotomicEquiv F + (numberFieldComplexificationRestriction F σ y) : + numberFieldComplexification F) := by + change + (((numberFieldComplexificationCyclotomicEquiv F).symm.trans + ((numberFieldComplexificationRestriction F σ).trans + (numberFieldComplexificationCyclotomicEquiv F))) + (numberFieldComplexificationCyclotomicEquiv F y) : + numberFieldComplexification F) = _ + simp only [AlgEquiv.trans_apply, AlgEquiv.symm_apply_apply] + _ = σ (numberFieldComplexificationCyclotomicEquiv F y : + numberFieldComplexification F) := hraw + _ = numberFieldComplexificationChangeBase F σ + (numberFieldComplexificationCyclotomicEquiv F y : + numberFieldComplexification F) := rfl + _ = (numberFieldComplexificationLayerRestriction F + (numberFieldComplexificationChangeBase F σ) + (numberFieldComplexificationCyclotomicEquiv F y) : + numberFieldComplexification F) := hrestrict.symm + +open scoped Classical in +/-- The rational cyclotomic factor generates the complexification +together with `F`, hence restriction to that factor is injective. -/ +theorem numberFieldComplexificationRestriction_injective : + Function.Injective (numberFieldComplexificationRestriction F) := by + intro σ τ hστ + apply numberFieldComplexificationChangeBase_injective F + apply numberFieldComplexificationLayerRestriction_injective F + rw [← numberFieldComplexificationRestriction_commutes F σ, + ← numberFieldComplexificationRestriction_commutes F τ, hστ] + +open scoped Classical in +noncomputable instance numberFieldComplexification_isAbelianGalois : + IsAbelianGalois F (numberFieldComplexification F) := by + let : IsGalois ℚ (numberFieldComplexificationCyclotomicLayer F) := + numberFieldComplexificationCyclotomicLayer_isGalois F + let : IsGalois (numberFieldComplexificationBaseLayer F) + (numberFieldComplexification F) := + IsGalois.sup_right + (numberFieldComplexificationCyclotomicLayer F) + (numberFieldComplexificationBaseLayer F) + (numberFieldComplexificationLayers_sup F) + let : IsGalois F (numberFieldComplexification F) := + IsGalois.of_equiv_equiv + (F := numberFieldComplexificationBaseLayer F) + (E := numberFieldComplexification F) + (M := F) (N := numberFieldComplexification F) + (f := + (numberFieldComplexificationBaseEquiv F).symm.toRingEquiv) + (g := RingEquiv.refl (numberFieldComplexification F)) + (by + apply RingHom.ext + intro y + change + algebraMap F (numberFieldComplexification F) + ((numberFieldComplexificationBaseEquiv F).symm y) = + algebraMap (numberFieldComplexificationBaseLayer F) + (numberFieldComplexification F) y + calc + algebraMap F (numberFieldComplexification F) + ((numberFieldComplexificationBaseEquiv F).symm y) = + algebraMap (numberFieldComplexificationBaseLayer F) + (numberFieldComplexification F) + (numberFieldComplexificationBaseEquiv F + ((numberFieldComplexificationBaseEquiv F).symm y)) := + numberFieldComplexificationBaseEquiv_algebraMap F _ + _ = algebraMap (numberFieldComplexificationBaseLayer F) + (numberFieldComplexification F) y := by + rw [(numberFieldComplexificationBaseEquiv F).apply_symm_apply]) + exact + { is_comm.comm := fun σ τ => by + apply numberFieldComplexificationRestriction_injective F + calc + numberFieldComplexificationRestriction F (σ * τ) = + numberFieldComplexificationRestriction F σ * + numberFieldComplexificationRestriction F τ := + map_mul (numberFieldComplexificationRestriction F) σ τ + _ = + numberFieldComplexificationRestriction F τ * + numberFieldComplexificationRestriction F σ := + IsMulCommutative.is_comm.comm _ _ + _ = numberFieldComplexificationRestriction F (τ * σ) := + (map_mul (numberFieldComplexificationRestriction F) τ σ).symm } + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean new file mode 100644 index 0000000000..e2258612c3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean @@ -0,0 +1,793 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RamifiedOverextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +/-! +# Artin reciprocity on the ramified infinite-place overextension + +This module proves principal-idele triviality, descends the chosen Artin +product to the norm quotient, and identifies it with global reciprocity. +-/ + +@[expose] public section + +open scoped IsMulCommutative +open NumberField +open IdeleGroup + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +section ComplexConjugationOverextension + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + +section + +attribute [-instance] + ramifiedInfinitePlaceRealFixedField_ratScalarTower + +open scoped Classical in +local instance + ramifiedInfinitePlaceOverextensionIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] ramifiedInfinitePlaceOverextensionIdeleClassGroupIsMulCommutative + +open scoped Classical in +private noncomputable def quotientLiftData + {A B : Type} [CommGroup A] [Group B] + (N : Subgroup A) (f : A →* B) + (hN : ∀ x, x ∈ N → f x = 1) : + {g : A ⧸ N →* B // + ∀ x, g (QuotientGroup.mk' N x) = f x} := by + refine ⟨QuotientGroup.lift N f hN, ?_⟩ + intro x + exact QuotientGroup.lift_mk _ _ _ + +open scoped Classical in +private theorem globalNormResidueEquiv_mk_one + (F E : Type) + [Field F] [NumberField F] + [Field E] [NumberField E] [Algebra F E] + [FiniteDimensional F E] [IsAbelianGalois F E] : + AddEquiv.toMultiplicative + (globalNormResidueEquiv F E) + (QuotientGroup.mk (1 : IdeleClassGroup F)) = + 1 := by + change + Additive.toMul + (globalNormResidueEquiv F E + (Additive.ofMul + (QuotientGroup.mk' + (_root_.ideleClassNorm F E).range + (1 : IdeleClassGroup F)))) = + 1 + simpa only [globalNormResidueMonoidHom_apply] using + map_one (globalNormResidueMonoidHom F E) + +open scoped Classical in +private theorem globalNormResidueEquiv_mk + (F E : Type) + [Field F] [NumberField F] + [Field E] [NumberField E] [Algebra F E] + [FiniteDimensional F E] [IsAbelianGalois F E] + (c : IdeleClassGroup F) : + AddEquiv.toMultiplicative + (globalNormResidueEquiv F E) + (QuotientGroup.mk c) = + globalNormResidueMonoidHom F E c := by + change + Additive.toMul + (globalNormResidueEquiv F E + (Additive.ofMul + (QuotientGroup.mk' + (_root_.ideleClassNorm F E).range c))) = + globalNormResidueMonoidHom F E c + exact (globalNormResidueMonoidHom_apply F E c).symm + +open scoped Classical in +private theorem globalNormResidueEquiv_ne_one_of_ne_mk_one + (F E : Type) + [Field F] [NumberField F] + [Field E] [NumberField E] [Algebra F E] + [FiniteDimensional F E] [IsAbelianGalois F E] + (q : + IdeleClassGroup F ⧸ + (_root_.ideleClassNorm F E).range) + (hq : q ≠ QuotientGroup.mk (1 : IdeleClassGroup F)) : + AddEquiv.toMultiplicative + (globalNormResidueEquiv F E) q ≠ + 1 := by + intro h + apply hq + apply + (AddEquiv.toMultiplicative + (globalNormResidueEquiv F E)).injective + exact + h.trans + (globalNormResidueEquiv_mk_one F E).symm + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- The chosen local-factor Artin product on the actual special +overextension `L(i)/K'` is trivial on principal ideles. -/ +theorem + ramifiedInfinitePlaceOverextensionGlobalArtin_principalIdele + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) + (x : + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)ˣ) : + globalArtinMonoidHom + (K := + ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (L := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (IdeleGroup.principalIdele + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) x) = + 1 := by + let : + IsAbelianGalois ℚ rationalComplexificationCyclotomicField := + rationalComplexificationCyclotomicField_isAbelianGalois + apply + ramifiedInfinitePlaceOverextensionCyclotomicRestriction_injective + (K := K) (L := L) v hRamified + have hdiamond := + DFunLike.congr_fun + (globalArtinMonoidHom_norm_restriction + (K := ℚ) + (L := rationalComplexificationCyclotomicField) + (K' := + ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (L' := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v)) + (IdeleGroup.principalIdele + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) x) + change + ramifiedInfinitePlaceOverextensionCyclotomicRestriction + (K := K) (L := L) v hRamified + (globalArtinMonoidHom + (K := + ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (L := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (IdeleGroup.principalIdele + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) x)) = + globalArtinMonoidHom + (K := ℚ) + (L := rationalComplexificationCyclotomicField) + (IdeleGroup.norm ℚ + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (IdeleGroup.principalIdele + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) x)) at hdiamond + rw [IdeleGroup.norm_principalIdele, + rationalComplexificationGlobalArtin_principalIdele] at hdiamond + simpa only [map_one] using hdiamond + +open scoped Classical in +/-- The actual local-factor product for the special overextension, +descended through principal ideles of its real fixed field. -/ +noncomputable def + ramifiedInfinitePlaceOverextensionIdeleClassArtinMonoidHom + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + IdeleClassGroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) →* + Gal((infinitePlaceComplexificationOverfield + (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)) := + QuotientGroup.lift + (IdeleGroup.principalSubgroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)) + (globalArtinMonoidHom + (K := + ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (L := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v)) + (by + rintro _ ⟨x, rfl⟩ + exact + ramifiedInfinitePlaceOverextensionGlobalArtin_principalIdele + (K := K) (L := L) v hRamified x) + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- Evaluation of the descended special-overextension Artin map on +an idele representative is the genuine product of chosen local +symbols. -/ +theorem + ramifiedInfinitePlaceOverextensionIdeleClassArtinMonoidHom_mk + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) + (a : + IdeleGroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)) : + ramifiedInfinitePlaceOverextensionIdeleClassArtinMonoidHom + (K := K) (L := L) v hRamified + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)) + a) = + globalArtinMonoidHom + (K := + ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (L := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + a := by + rw [ramifiedInfinitePlaceOverextensionIdeleClassArtinMonoidHom] + exact QuotientGroup.lift_mk _ _ _ + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- The descended special-overextension Artin map kills every +genuine idele-class norm from its top field. -/ +@[simp] +theorem + ramifiedInfinitePlaceOverextensionIdeleClassArtinMonoidHom_ideleClassNorm + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) + (c : + IdeleClassGroup + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)) : + ramifiedInfinitePlaceOverextensionIdeleClassArtinMonoidHom + (K := K) (L := L) v hRamified + (_root_.ideleClassNorm + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + c) = + 1 := by + refine QuotientGroup.induction_on c ?_ + intro a + change + ramifiedInfinitePlaceOverextensionIdeleClassArtinMonoidHom + (K := K) (L := L) v hRamified + (_root_.ideleClassNorm + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)) + a)) = + 1 + rw [_root_.ideleClassNorm_mk, + ramifiedInfinitePlaceOverextensionIdeleClassArtinMonoidHom_mk] + exact + globalArtinMonoidHom_ideleNorm_eq_one + (K := + ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (L := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + a + +open scoped Classical in +private noncomputable def + ramifiedInfinitePlaceOverextensionNormQuotientArtinData + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) := + quotientLiftData + (A := + IdeleClassGroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)) + (B := + Gal((infinitePlaceComplexificationOverfield + (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified))) + (_root_.ideleClassNorm + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)).range + (ramifiedInfinitePlaceOverextensionIdeleClassArtinMonoidHom + (K := K) (L := L) v hRamified) + (by + rintro _ ⟨c, rfl⟩ + exact + ramifiedInfinitePlaceOverextensionIdeleClassArtinMonoidHom_ideleClassNorm + (K := K) (L := L) v hRamified c) + +open scoped Classical in +/-- The chosen-local-factor Artin map on the actual norm quotient of +the special overextension. -/ +noncomputable def + ramifiedInfinitePlaceOverextensionNormQuotientArtinMonoidHom + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) := + (ramifiedInfinitePlaceOverextensionNormQuotientArtinData + (K := K) (L := L) v hRamified).1 + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- Evaluation of the norm-quotient Artin map on an idele-class +representative. -/ +@[simp] +theorem + ramifiedInfinitePlaceOverextensionNormQuotientArtinMonoidHom_mk + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + ∀ c : + IdeleClassGroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified), + ramifiedInfinitePlaceOverextensionNormQuotientArtinMonoidHom + (K := K) (L := L) v hRamified + (QuotientGroup.mk c) = + ramifiedInfinitePlaceOverextensionIdeleClassArtinMonoidHom + (K := K) (L := L) v hRamified c := + (ramifiedInfinitePlaceOverextensionNormQuotientArtinData + (K := K) (L := L) v hRamified).2 + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- The norm-quotient Artin map for the special overextension is +surjective onto its actual Galois group. -/ +theorem + ramifiedInfinitePlaceOverextensionNormQuotientArtinMonoidHom_surjective + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + Function.Surjective + (ramifiedInfinitePlaceOverextensionNormQuotientArtinMonoidHom + (K := K) (L := L) v hRamified) := by + intro σ + obtain ⟨a, ha⟩ := + globalArtinMonoidHom_surjective + (K := + ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (L := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + σ + let c : + IdeleClassGroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) := + QuotientGroup.mk' + (IdeleGroup.principalSubgroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)) + a + refine + ⟨QuotientGroup.mk c, ?_⟩ + rw [ramifiedInfinitePlaceOverextensionNormQuotientArtinMonoidHom_mk, + ramifiedInfinitePlaceOverextensionIdeleClassArtinMonoidHom_mk] + exact ha + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- The norm-quotient Artin map for the special overextension is +bijective. -/ +theorem + ramifiedInfinitePlaceOverextensionNormQuotientArtinMonoidHom_bijective + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + Function.Bijective + (ramifiedInfinitePlaceOverextensionNormQuotientArtinMonoidHom + (K := K) (L := L) v hRamified) := by + let K' := + ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified + let L' := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v + let Q := + IdeleClassGroup K' ⧸ + (_root_.ideleClassNorm K' L').range + let e : Q ≃* Gal(L'/K') := + AddEquiv.toMultiplicative + (globalNormResidueEquiv K' L') + let : Finite Q := + Finite.of_injective e e.injective + exact + (ramifiedInfinitePlaceOverextensionNormQuotientArtinMonoidHom_surjective + (K := K) (L := L) v hRamified).bijective_of_nat_card_le + (Nat.card_congr e.toEquiv).le + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- Any two nonidentity automorphisms of the quadratic overextension agree. -/ +theorem + ramifiedInfinitePlaceOverextension_galois_eq_of_ne_one + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) + {σ τ : + Gal((infinitePlaceComplexificationOverfield + (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified))} + (hσ : σ ≠ 1) + (hτ : τ ≠ 1) : + σ = τ := by + rcases + ramifiedInfinitePlaceOverextension_eq_one_or_conjugation + (K := K) (L := L) v hRamified σ with hσ1 | hσc + · exact (hσ hσ1).elim + rcases + ramifiedInfinitePlaceOverextension_eq_one_or_conjugation + (K := K) (L := L) v hRamified τ with hτ1 | hτc + · exact (hτ hτ1).elim + exact hσc.trans hτc.symm + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +private theorem + ramifiedInfinitePlaceOverextensionGlobalNormResidue_ne_one_of_ne_mk_one + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) + (q : + IdeleClassGroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) ⧸ + (_root_.ideleClassNorm + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)).range) + (hq : + q ≠ + QuotientGroup.mk + (1 : + IdeleClassGroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified))) : + AddEquiv.toMultiplicative + (globalNormResidueEquiv + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)) q ≠ + 1 := by + exact + globalNormResidueEquiv_ne_one_of_ne_mk_one + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + q hq + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +private theorem + ramifiedInfinitePlaceOverextensionGlobalNormResidue_mk + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) + (c : + IdeleClassGroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)) : + AddEquiv.toMultiplicative + (globalNormResidueEquiv + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)) + (QuotientGroup.mk c) = + globalNormResidueMonoidHom + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) c := by + exact + globalNormResidueEquiv_mk + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + c + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- At each class in the genuine norm quotient of the special +overextension, the chosen-local-factor product is the canonical +global norm-residue equivalence. -/ +theorem + ramifiedInfinitePlaceOverextensionNormQuotientArtinMonoidHom_eq_globalNormResidue_apply + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) + (q : + IdeleClassGroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) ⧸ + (_root_.ideleClassNorm + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)).range) : + ramifiedInfinitePlaceOverextensionNormQuotientArtinMonoidHom + (K := K) (L := L) v hRamified q = + AddEquiv.toMultiplicative + (globalNormResidueEquiv + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)) q := by + let K' := + ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified + let L' := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v + let N := (_root_.ideleClassNorm K' L').range + let Q := IdeleClassGroup K' ⧸ N + let : N.Normal := inferInstance + change Q at q + let qOne : Q := + QuotientGroup.mk + (1 : + IdeleClassGroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)) + have hArtinOne : + ramifiedInfinitePlaceOverextensionNormQuotientArtinMonoidHom + (K := K) (L := L) v hRamified + (QuotientGroup.mk + (1 : + IdeleClassGroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified))) = + 1 := by + rw [ramifiedInfinitePlaceOverextensionNormQuotientArtinMonoidHom_mk, + map_one] + have hResidueOne : + AddEquiv.toMultiplicative + (globalNormResidueEquiv + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)) + (QuotientGroup.mk + (1 : + IdeleClassGroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified))) = + 1 := by + exact + globalNormResidueEquiv_mk_one + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + by_cases hq : q = qOne + · subst q + dsimp only [qOne] + exact hArtinOne.trans hResidueOne.symm + · have hArtinNe : + ramifiedInfinitePlaceOverextensionNormQuotientArtinMonoidHom + (K := K) (L := L) v hRamified q ≠ + 1 := by + intro h + apply hq + apply + (ramifiedInfinitePlaceOverextensionNormQuotientArtinMonoidHom_bijective + (K := K) (L := L) v hRamified).1 + exact + h.trans + hArtinOne.symm + have hqRaw : + q ≠ + QuotientGroup.mk + (1 : + IdeleClassGroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)) := by + intro h + apply hq + exact h + have hNormResidueNe := + ramifiedInfinitePlaceOverextensionGlobalNormResidue_ne_one_of_ne_mk_one + (K := K) (L := L) v hRamified q hqRaw + exact + ramifiedInfinitePlaceOverextension_galois_eq_of_ne_one + (K := K) (L := L) v hRamified hArtinNe hNormResidueNe + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +private theorem + ramifiedInfinitePlaceOverextensionIdeleClassArtin_eq_globalNormResidueEquiv_mk + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) + (c : + IdeleClassGroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)) : + ramifiedInfinitePlaceOverextensionIdeleClassArtinMonoidHom + (K := K) (L := L) v hRamified c = + AddEquiv.toMultiplicative + (globalNormResidueEquiv + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)) + (QuotientGroup.mk c) := by + exact + (ramifiedInfinitePlaceOverextensionNormQuotientArtinMonoidHom_mk + (K := K) (L := L) v hRamified c).symm.trans + (ramifiedInfinitePlaceOverextensionNormQuotientArtinMonoidHom_eq_globalNormResidue_apply + (K := K) (L := L) v hRamified + (QuotientGroup.mk c)) + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- On idele classes of the real fixed field, the actual product of +chosen local symbols for the special overextension is the canonical +global norm-residue map. -/ +theorem + ramifiedInfinitePlaceOverextensionIdeleClassArtinMonoidHom_eq_globalNormResidue_apply + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) + (c : + IdeleClassGroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)) : + ramifiedInfinitePlaceOverextensionIdeleClassArtinMonoidHom + (K := K) (L := L) v hRamified c = + globalNormResidueMonoidHom + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) c := by + exact + (ramifiedInfinitePlaceOverextensionIdeleClassArtin_eq_globalNormResidueEquiv_mk + (K := K) (L := L) v hRamified + c).trans + (ramifiedInfinitePlaceOverextensionGlobalNormResidue_mk + (K := K) (L := L) v hRamified c) + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- On an actual idele representative of the real fixed field, the +canonical global norm-residue map for the special overextension is +the product of the chosen local Artin symbols. -/ +theorem + globalNormResidueMonoidHom_ramifiedInfinitePlaceOverextension_ideleClass_mk + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) + (a : + IdeleGroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)) : + globalNormResidueMonoidHom + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)) + a) = + globalArtinMonoidHom + (K := + ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (L := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + a := by + exact + (ramifiedInfinitePlaceOverextensionIdeleClassArtinMonoidHom_eq_globalNormResidue_apply + (K := K) (L := L) v hRamified + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)) + a)).symm.trans + (ramifiedInfinitePlaceOverextensionIdeleClassArtinMonoidHom_mk + (K := K) (L := L) v hRamified a) + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- The canonical global norm-residue symbol of an archimedean +one-place idele class in the special overextension is the chosen +infinite local Artin symbol. -/ +theorem + globalNormResidueMonoidHom_ramifiedInfinitePlaceOverextension_infinitePlaceIdeleClass + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) + (w : + InfinitePlace + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)) + (x : w.Completionˣ) : + globalNormResidueMonoidHom + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (IdeleGroup.infinitePlaceIdeleClass w x) = + chosenInfinitePlaceArtinMonoidHom + (K := + ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (L := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + w x := by + change + globalNormResidueMonoidHom + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)) + (IdeleGroup.infinitePlaceIdele w x)) = + chosenInfinitePlaceArtinMonoidHom + (K := + ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (L := + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + w x + rw [ + globalNormResidueMonoidHom_ramifiedInfinitePlaceOverextension_ideleClass_mk, + globalArtinMonoidHom_infinitePlaceIdele] + +end + +end ComplexConjugationOverextension + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean new file mode 100644 index 0000000000..eacb434957 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean @@ -0,0 +1,662 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceOverfield +/-! +# The quadratic overextension at a ramified real place + +This module constructs the real fixed field of complex conjugation, the +quadratic overextension above it, and the faithful cyclotomic restriction. +-/ + +@[expose] public section + +open scoped IsMulCommutative +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +attribute [local instance] + infinitePlaceComplexificationOverfieldRationalAlgebra + +section ComplexConjugationOverextension + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + +open scoped Classical in +/-- The base `K'` in the archimedean overextension: the fixed field +of complex conjugation in `L(i)`. -/ +def ramifiedInfinitePlaceRealFixedField + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + IntermediateField ℚ + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + IntermediateField.fixedField + (Subgroup.zpowers + (ramifiedInfinitePlaceOverfieldConjugation + (K := K) (L := L) v hRamified)) + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- Ambient complex conjugation on the overfield fixes the embedded base +field at a ramified real place. -/ +theorem ramifiedInfinitePlaceOverfieldConjugation_fixes_base + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) + (x : K) : + ramifiedInfinitePlaceOverfieldConjugation + (K := K) (L := L) v hRamified + (algebraMap K + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) x) = + algebraMap K + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) x := by + apply Subtype.ext + let w := chosenInfinitePlaceAbove (L := L) v + let σ := + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v + (-1 : v.Completionˣ) + have hσ : + NumberField.ComplexEmbedding.IsConj + (InfinitePlace.embedding w) σ := + chosenInfinitePlaceArtinMonoidHom_neg_one_isConj_of_ramified + (K := K) (L := L) v hRamified + change + star + (InfinitePlace.embedding w + (algebraMap K L x)) = + InfinitePlace.embedding w + (algebraMap K L x) + calc + star + (InfinitePlace.embedding w + (algebraMap K L x)) = + InfinitePlace.embedding w + (σ (algebraMap K L x)) := + (hσ.eq (algebraMap K L x)).symm + _ = + InfinitePlace.embedding w + (algebraMap K L x) := by + exact + congrArg (InfinitePlace.embedding w) + (σ.commutes x) + +open scoped Classical in +/-- The compatible embedding `K → K'` into the real fixed field. -/ +noncomputable def ramifiedInfinitePlaceRealFixedFieldEmbedding + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + K →ₐ[ℚ] + ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified := + (IsScalarTower.toAlgHom ℚ K + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)).codRestrict + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified).toSubalgebra + (fun x => by + apply + (IntermediateField.mem_fixedField_iff _ _).2 + intro g hg + have hc : + ramifiedInfinitePlaceOverfieldConjugation + (K := K) (L := L) v hRamified ∈ + MulAction.stabilizer + ((infinitePlaceComplexificationOverfield + (K := K) (L := L) v) ≃ₐ[ℚ] + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (algebraMap K + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) x) := by + exact + MulAction.mem_stabilizer_iff.mpr + (ramifiedInfinitePlaceOverfieldConjugation_fixes_base + (K := K) (L := L) v hRamified x) + exact + MulAction.mem_stabilizer_iff.mp + ((Subgroup.zpowers_le).2 hc hg)) + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- The fixed-field embedding agrees with the original base-field +algebra map after coercion to the overfield. -/ +@[simp] +theorem ramifiedInfinitePlaceRealFixedFieldEmbedding_coe + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) + (x : K) : + ((ramifiedInfinitePlaceRealFixedFieldEmbedding + (K := K) (L := L) v hRamified x : + ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) : + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) = + algebraMap K + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) x := by + calc + ((ramifiedInfinitePlaceRealFixedFieldEmbedding + (K := K) (L := L) v hRamified x : + ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) : + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) = + (IsScalarTower.toAlgHom ℚ K + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)) x := by + exact + AlgHom.coe_codRestrict + (IsScalarTower.toAlgHom ℚ K + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)) + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified).toSubalgebra _ x + _ = algebraMap K + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) x := + IsScalarTower.toAlgHom_apply ℚ K + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) x + +open scoped Classical in +@[reducible] +noncomputable instance + ramifiedInfinitePlaceRealFixedFieldAlgebra + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + Algebra K + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) := + (ramifiedInfinitePlaceRealFixedFieldEmbedding + (K := K) (L := L) v hRamified).toRingHom.toAlgebra + +open scoped Classical in +instance ramifiedInfinitePlaceRealFixedField_ratScalarTower + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + IsScalarTower ℚ K + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) := + IsScalarTower.of_algHom + (ramifiedInfinitePlaceRealFixedFieldEmbedding + (K := K) (L := L) v hRamified) + +open scoped Classical in +instance ramifiedInfinitePlaceRealFixedField_scalarTower + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + IsScalarTower K + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + IsScalarTower.of_algHom + { (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified).val.toRingHom with + commutes' := fun x => + ramifiedInfinitePlaceRealFixedFieldEmbedding_coe + (K := K) (L := L) v hRamified x } + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +theorem + ramifiedInfinitePlaceRealFixedField_finiteDimensional + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + FiniteDimensional ℚ + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) := + FiniteDimensional.left ℚ + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + +open scoped Classical in +noncomputable instance ramifiedInfinitePlaceRealFixedField_numberField + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + NumberField + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) := + by + let : FiniteDimensional ℚ + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) := + ramifiedInfinitePlaceRealFixedField_finiteDimensional + (K := K) (L := L) v hRamified + exact + NumberField.of_module_finite ℚ + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + +omit [FiniteDimensional K L] in +open scoped Classical in +theorem + ramifiedInfinitePlaceRealFixedField_finiteDimensional_over_base + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + FiniteDimensional K + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) := + FiniteDimensional.right ℚ K + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + +open scoped Classical in +noncomputable instance + ramifiedInfinitePlaceRealFixedField_isAbelianGalois_over_base + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + IsAbelianGalois K + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) := + IsAbelianGalois.tower_bot K + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +theorem + ramifiedInfinitePlaceOverfield_finiteDimensional_over_fixed + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + FiniteDimensional + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + FiniteDimensional.right ℚ + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +theorem ramifiedInfinitePlaceOverextension_isGalois + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + IsGalois + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := by + unfold ramifiedInfinitePlaceRealFixedField + exact + IsGalois.of_fixed_field + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (Subgroup.zpowers + (ramifiedInfinitePlaceOverfieldConjugation + (K := K) (L := L) v hRamified)) + +open scoped Classical in +noncomputable instance + ramifiedInfinitePlaceOverextension_isAbelianGalois + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + IsAbelianGalois + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := by + let : IsGalois + (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified) + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + ramifiedInfinitePlaceOverextension_isGalois + (K := K) (L := L) v hRamified + let H := + Subgroup.zpowers + (ramifiedInfinitePlaceOverfieldConjugation + (K := K) (L := L) v hRamified) + let e := + IntermediateField.subgroupEquivAlgEquiv H + let : + IsCyclic + Gal((infinitePlaceComplexificationOverfield + (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)) := + e.isCyclic.mp + (Subgroup.isCyclic_zpowers + (ramifiedInfinitePlaceOverfieldConjugation + (K := K) (L := L) v hRamified)) + exact IsAbelianGalois.of_isCyclic _ _ + +open scoped Classical in +/-- The distinguished nontrivial automorphism of the quadratic +overextension `L(i)/K'`, obtained from ambient complex conjugation. -/ +noncomputable def ramifiedInfinitePlaceOverextensionConjugation + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + Gal((infinitePlaceComplexificationOverfield + (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)) := + IntermediateField.subgroupEquivAlgEquiv + (Subgroup.zpowers + (ramifiedInfinitePlaceOverfieldConjugation + (K := K) (L := L) v hRamified)) + ⟨ramifiedInfinitePlaceOverfieldConjugation + (K := K) (L := L) v hRamified, + Subgroup.mem_zpowers + (ramifiedInfinitePlaceOverfieldConjugation + (K := K) (L := L) v hRamified)⟩ + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- The distinguished overextension automorphism is the restriction +of ambient complex conjugation. -/ +@[simp] +theorem ramifiedInfinitePlaceOverextensionConjugation_apply + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) + (z : + infinitePlaceComplexificationOverfield + (K := K) (L := L) v) : + ramifiedInfinitePlaceOverextensionConjugation + (K := K) (L := L) v hRamified z = + ramifiedInfinitePlaceOverfieldConjugation + (K := K) (L := L) v hRamified z := by + rfl + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- Every automorphism of the overextension is either the identity or +the distinguished complex conjugation. -/ +theorem ramifiedInfinitePlaceOverextension_eq_one_or_conjugation + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) + (σ : + Gal((infinitePlaceComplexificationOverfield + (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified))) : + σ = 1 ∨ + σ = + ramifiedInfinitePlaceOverextensionConjugation + (K := K) (L := L) v hRamified := by + let c := + ramifiedInfinitePlaceOverfieldConjugation + (K := K) (L := L) v hRamified + let H := Subgroup.zpowers c + let e := + IntermediateField.subgroupEquivAlgEquiv H + let cH : H := + ⟨c, Subgroup.mem_zpowers c⟩ + have hcSq : c ^ 2 = 1 := + (pow_two c).trans + (ramifiedInfinitePlaceOverfieldConjugation_sq + (K := K) (L := L) v hRamified) + have hσCases : + (e.symm σ).1 = 1 ∨ + (e.symm σ).1 = c := by + obtain ⟨n, hσ⟩ := + Subgroup.mem_zpowers_iff.mp (e.symm σ).property + have hσPower : + (e.symm σ).1 = c ^ (n % (2 : ℤ)) := + hσ.symm.trans + (zpow_eq_zpow_emod' n hcSq) + rcases Int.emod_two_eq_zero_or_one n with hn | hn + · left + exact + hσPower.trans + ((congrArg (fun m : ℤ => c ^ m) hn).trans + (zpow_zero c)) + · right + exact + hσPower.trans + ((congrArg (fun m : ℤ => c ^ m) hn).trans + (zpow_one c)) + rcases hσCases with hσ | hσ + · left + have hσSub : e.symm σ = 1 := + Subtype.ext hσ + exact + e.symm.injective + (hσSub.trans + (map_one e.symm).symm) + · right + have hσSub : e.symm σ = cH := + Subtype.ext hσ + change σ = e cH + exact + (e.apply_symm_apply σ).symm.trans + (congrArg e hσSub) + +attribute [local instance] + rationalComplexificationCyclotomicField_isAbelianGalois + +open scoped Classical in +/-- Restriction of the quadratic overextension Galois group to the +rational fourth-root factor. -/ +noncomputable def + ramifiedInfinitePlaceOverextensionCyclotomicRestriction + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + Gal((infinitePlaceComplexificationOverfield + (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v hRamified)) →* + Gal(rationalComplexificationCyclotomicField/ℚ) := + (AlgEquiv.restrictNormalHom + rationalComplexificationCyclotomicField).comp + (AlgEquiv.restrictScalarsHom ℚ) + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- The mapped primitive fourth root in the overfield is not fixed by +ambient complex conjugation. -/ +theorem ramifiedInfinitePlaceOverfieldConjugation_map_zeta_ne + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + ramifiedInfinitePlaceOverfieldConjugation + (K := K) (L := L) v hRamified + (algebraMap rationalComplexificationCyclotomicField + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (IsCyclotomicExtension.zeta + 4 ℚ rationalComplexificationCyclotomicField)) ≠ + algebraMap rationalComplexificationCyclotomicField + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (IsCyclotomicExtension.zeta + 4 ℚ rationalComplexificationCyclotomicField) := by + let ζ := + IsCyclotomicExtension.zeta + 4 ℚ rationalComplexificationCyclotomicField + let j : + infinitePlaceComplexificationOverfield + (K := K) (L := L) v := + algebraMap rationalComplexificationCyclotomicField + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) ζ + have hζ : + IsPrimitiveRoot ζ 4 := + IsCyclotomicExtension.zeta_spec + 4 ℚ rationalComplexificationCyclotomicField + have hj : + IsPrimitiveRoot j 4 := + hζ.map_of_injective + (algebraMap rationalComplexificationCyclotomicField + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)).injective + have hj2 : j ^ 2 = -1 := + (hj.pow (by norm_num : 0 < 4) + (show 4 = 2 * 2 by norm_num)).eq_neg_one_of_two_right + intro hfixed + have hfixedComplex : + star (j : ℂ) = (j : ℂ) := by + simpa only [j, + ramifiedInfinitePlaceOverfieldConjugation_apply] using + congrArg Subtype.val hfixed + have hj2Complex : (j : ℂ) ^ 2 = -1 := + congrArg Subtype.val hj2 + have hjIm : (j : ℂ).im = 0 := + Complex.conj_eq_iff_im.mp hfixedComplex + have hjRe := congrArg Complex.re hj2Complex + simp only [pow_two, Complex.mul_re, + Complex.neg_re, Complex.one_re] at hjRe + nlinarith [hjIm, sq_nonneg (j : ℂ).re] + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- The distinguished overextension conjugation restricts +nontrivially to the rational fourth-root factor. -/ +theorem + ramifiedInfinitePlaceOverextensionCyclotomicRestriction_conjugation_ne_one + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + ramifiedInfinitePlaceOverextensionCyclotomicRestriction + (K := K) (L := L) v hRamified + (ramifiedInfinitePlaceOverextensionConjugation + (K := K) (L := L) v hRamified) ≠ + 1 := by + intro h + apply + ramifiedInfinitePlaceOverfieldConjugation_map_zeta_ne + (K := K) (L := L) v hRamified + have hz := + DFunLike.congr_fun h + (IsCyclotomicExtension.zeta + 4 ℚ rationalComplexificationCyclotomicField) + change + ramifiedInfinitePlaceOverextensionCyclotomicRestriction + (K := K) (L := L) v hRamified + (ramifiedInfinitePlaceOverextensionConjugation + (K := K) (L := L) v hRamified) + (IsCyclotomicExtension.zeta + 4 ℚ rationalComplexificationCyclotomicField) = + IsCyclotomicExtension.zeta + 4 ℚ rationalComplexificationCyclotomicField at hz + have hz' := + congrArg + (algebraMap rationalComplexificationCyclotomicField + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)) + hz + change + (algebraMap rationalComplexificationCyclotomicField + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)) + (((AlgEquiv.restrictNormalHom + rationalComplexificationCyclotomicField) + ((ramifiedInfinitePlaceOverextensionConjugation + (K := K) (L := L) v hRamified).restrictScalars ℚ)) + (IsCyclotomicExtension.zeta + 4 ℚ rationalComplexificationCyclotomicField)) = + (algebraMap rationalComplexificationCyclotomicField + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)) + (IsCyclotomicExtension.zeta + 4 ℚ rationalComplexificationCyclotomicField) at hz' + calc + ramifiedInfinitePlaceOverfieldConjugation + (K := K) (L := L) v hRamified + (algebraMap rationalComplexificationCyclotomicField + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (IsCyclotomicExtension.zeta + 4 ℚ rationalComplexificationCyclotomicField)) = + (ramifiedInfinitePlaceOverextensionConjugation + (K := K) (L := L) v hRamified).restrictScalars ℚ + (algebraMap rationalComplexificationCyclotomicField + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + (IsCyclotomicExtension.zeta + 4 ℚ rationalComplexificationCyclotomicField)) := by + exact + (ramifiedInfinitePlaceOverextensionConjugation_apply + (K := K) (L := L) v hRamified _).symm + _ = + (algebraMap rationalComplexificationCyclotomicField + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)) + (((AlgEquiv.restrictNormalHom + rationalComplexificationCyclotomicField) + ((ramifiedInfinitePlaceOverextensionConjugation + (K := K) (L := L) v hRamified).restrictScalars ℚ)) + (IsCyclotomicExtension.zeta + 4 ℚ rationalComplexificationCyclotomicField)) := by + exact + (AlgEquiv.restrictNormal_commutes + ((ramifiedInfinitePlaceOverextensionConjugation + (K := K) (L := L) v hRamified).restrictScalars ℚ) + rationalComplexificationCyclotomicField + (IsCyclotomicExtension.zeta + 4 ℚ rationalComplexificationCyclotomicField)).symm + _ = + (algebraMap rationalComplexificationCyclotomicField + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v)) + (IsCyclotomicExtension.zeta + 4 ℚ rationalComplexificationCyclotomicField) := hz' + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- Restriction to the rational fourth-root factor is injective on the +quadratic overextension. -/ +theorem + ramifiedInfinitePlaceOverextensionCyclotomicRestriction_injective + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + Function.Injective + (ramifiedInfinitePlaceOverextensionCyclotomicRestriction + (K := K) (L := L) v hRamified) := by + apply + (injective_iff_map_eq_one + (ramifiedInfinitePlaceOverextensionCyclotomicRestriction + (K := K) (L := L) v hRamified)).2 + intro σ hσ + rcases + ramifiedInfinitePlaceOverextension_eq_one_or_conjugation + (K := K) (L := L) v hRamified σ with hσOne | hσConj + · exact hσOne + · subst σ + exact + (ramifiedInfinitePlaceOverextensionCyclotomicRestriction_conjugation_ne_one + (K := K) (L := L) v hRamified hσ).elim + +end ComplexConjugationOverextension + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RationalComplexification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RationalComplexification.lean new file mode 100644 index 0000000000..5774e3da19 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RationalComplexification.lean @@ -0,0 +1,520 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.InfiniteOnePlaceBaseNorm +public import Mathlib.NumberTheory.NumberField.CMField +public import Mathlib.RingTheory.RootsOfUnity.Complex +/-! +# The rational cyclotomic complexification + +This module realizes the quadratic complexification as the fourth-root +cyclotomic field and proves the rational principal-idele Artin formula. +-/ + +@[expose] public section + +open scoped BigOperators IsMulCommutative NumberField +open NumberField IsDedekindDomain +open IdeleGroup + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open scoped Classical in +/-- The rational prime used to realize the quadratic complexification +as the fourth-root cyclotomic field. -/ +def rationalComplexificationPrime : Nat.Primes := + ⟨2, Nat.prime_two⟩ + +open scoped Classical in +/-- The cyclotomic level `4` used for the rational complexification. -/ +abbrev rationalComplexificationCyclotomicOrder : ℕ+ := + ⟨rationalComplexificationPrime.1 ^ 2, + pow_pos rationalComplexificationPrime.2.pos 2⟩ + +open scoped Classical in +local instance rationalComplexificationPrimeFact : + Fact rationalComplexificationPrime.1.Prime := + ⟨rationalComplexificationPrime.2⟩ + +attribute [local instance] rationalComplexificationPrimeFact + +open scoped Classical in +local instance rationalComplexificationPrimeSquareNeZero : + NeZero (rationalComplexificationPrime.1 ^ 2) := + ⟨pow_ne_zero 2 rationalComplexificationPrime.2.ne_zero⟩ + +attribute [local instance] rationalComplexificationPrimeSquareNeZero + +open scoped Classical in +/-- The actual rational cyclotomic field generated by fourth roots of +unity, inside the rational cyclotomic closure. -/ +abbrev rationalComplexificationCyclotomicField : + IntermediateField ℚ KummerTheory.rationalCyclotomicField := + KummerTheory.rationalCyclotomicLevel + rationalComplexificationCyclotomicOrder + +open scoped Classical in +noncomputable instance + rationalComplexificationCyclotomicField_isCyclotomicFour : + IsCyclotomicExtension {4} ℚ + rationalComplexificationCyclotomicField := by + change + IsCyclotomicExtension + {(rationalComplexificationCyclotomicOrder : ℕ)} ℚ + rationalComplexificationCyclotomicField + exact + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + rationalComplexificationCyclotomicOrder + +open scoped Classical in +noncomputable instance + rationalComplexificationCyclotomicField_isCMField : + NumberField.IsCMField rationalComplexificationCyclotomicField := by + apply IsCyclotomicExtension.Rat.isCMField + rationalComplexificationCyclotomicField + (S := {4}) + exact + ⟨4, Set.mem_singleton 4, by norm_num⟩ + +open scoped Classical in +noncomputable local instance + rationalComplexificationCyclotomicField_finiteDimensional : + FiniteDimensional ℚ rationalComplexificationCyclotomicField := + rationalCyclotomicPrincipalPrimeLevelFiniteDimensional + rationalComplexificationCyclotomicOrder + +attribute [local instance] rationalComplexificationCyclotomicField_finiteDimensional + +open scoped Classical in +noncomputable local instance + rationalComplexificationCyclotomicField_numberField : + NumberField rationalComplexificationCyclotomicField := + KummerTheory.rationalCyclotomicLevel_numberField + rationalComplexificationCyclotomicOrder + +attribute [local instance] rationalComplexificationCyclotomicField_numberField + +open scoped Classical in +noncomputable local instance + rationalComplexificationCyclotomicField_isAbelianGalois : + IsAbelianGalois ℚ rationalComplexificationCyclotomicField := + rationalCyclotomicPrincipalPrimeLevelIsAbelianGalois + rationalComplexificationCyclotomicOrder + +attribute [local instance] rationalComplexificationCyclotomicField_isAbelianGalois + +open scoped Classical in +/-- The complex number `I` is a primitive fourth root of unity. -/ +theorem complexI_isPrimitiveRoot_four : + IsPrimitiveRoot Complex.I 4 := by + convert Complex.isPrimitiveRoot_exp 4 (by norm_num) using 1 + calc + Complex.I = + Complex.exp ((Real.pi : ℂ) / 2 * Complex.I) := + Complex.exp_pi_div_two_mul_I.symm + _ = Complex.exp + (2 * (Real.pi : ℂ) * Complex.I / (4 : ℂ)) := by + congr 1 + ring + +open scoped Classical in +/-- The concrete fourth-root cyclotomic field inside `ℂ`. + +It is defined by adjoining all fourth roots of unity, so it is +independent of a choice between `I` and `-I` and is visibly preserved +by complex conjugation. -/ +def complexFourthRootField : + IntermediateField ℚ ℂ := + IntermediateField.adjoin ℚ + {z : ℂ | + ∃ n ∈ ({4} : Set ℕ), n ≠ 0 ∧ z ^ n = 1} + +open scoped Classical in +noncomputable instance complexFourthRootField_isCyclotomic : + IsCyclotomicExtension {4} ℚ complexFourthRootField := by + apply + IntermediateField.isCyclotomicExtension_adjoin_of_exists_isPrimitiveRoot + ({4} : Set ℕ) ℚ ℂ + intro n hn _hn0 + rw [Set.mem_singleton_iff] at hn + subst n + exact ⟨Complex.I, complexI_isPrimitiveRoot_four⟩ + +open scoped Classical in +noncomputable instance complexFourthRootField_finiteDimensional : + FiniteDimensional ℚ complexFourthRootField := + IsCyclotomicExtension.finiteDimensional + ({4} : Set ℕ) ℚ complexFourthRootField + +open scoped Classical in +noncomputable instance complexFourthRootField_numberField : + NumberField complexFourthRootField := + IsCyclotomicExtension.numberField + ({4} : Set ℕ) ℚ complexFourthRootField + +open scoped Classical in +/-- Identification of the abstract rational fourth-root cyclotomic +field used by the rational product formula with its concrete copy in +`ℂ`. -/ +noncomputable def rationalComplexificationComplexEquiv : + rationalComplexificationCyclotomicField ≃ₐ[ℚ] + complexFourthRootField := + IsCyclotomicExtension.algEquiv + ({4} : Set ℕ) ℚ + rationalComplexificationCyclotomicField + complexFourthRootField + +open scoped Classical in +/-- The concrete fourth-root field is stable under complex +conjugation. -/ +theorem complexFourthRootField_map_complexConjugation : + complexFourthRootField.map + (Complex.conjAe.restrictScalars ℚ).toAlgHom = + complexFourthRootField := by + rw [complexFourthRootField, IntermediateField.adjoin_map] + congr 1 + ext z + constructor + · rintro ⟨x, ⟨n, hn, hn0, hx⟩, rfl⟩ + refine ⟨n, hn, hn0, ?_⟩ + rw [← map_pow, hx, map_one] + · intro hz + refine ⟨star z, ?_, ?_⟩ + · rcases hz with ⟨n, hn, hn0, hz⟩ + refine ⟨n, hn, hn0, ?_⟩ + rw [← star_pow, hz, star_one] + · change star (star z) = z + exact star_star z + +open scoped Classical in +/-- The chosen infinite place of the rational complexification is +ramified over the unique real place of `ℚ`. -/ +theorem rationalComplexification_chosenInfinitePlace_isRamified : + (chosenInfinitePlaceAbove + (L := rationalComplexificationCyclotomicField) + Rat.infinitePlace).IsRamified ℚ := by + rw [InfinitePlace.isRamified_iff, + chosenInfinitePlaceAbove_comap + (L := rationalComplexificationCyclotomicField) + Rat.infinitePlace] + exact + ⟨IsTotallyComplex.isComplex _, Rat.isReal_infinitePlace⟩ + +open scoped Classical in +/-- The rational fourth-root cyclotomic field has Galois group of order two. -/ +theorem + rationalComplexification_galoisGroup_card : + Nat.card + (rationalComplexificationCyclotomicField ≃ₐ[ℚ] + rationalComplexificationCyclotomicField) = + 2 := by + calc + Nat.card + (rationalComplexificationCyclotomicField ≃ₐ[ℚ] + rationalComplexificationCyclotomicField) = + Module.finrank ℚ rationalComplexificationCyclotomicField := + IsGalois.card_aut_eq_finrank + ℚ rationalComplexificationCyclotomicField + _ = + (rationalComplexificationCyclotomicOrder : ℕ).totient := by + exact + IsCyclotomicExtension.finrank + rationalComplexificationCyclotomicField + (Polynomial.cyclotomic.irreducible_rat (by + change 0 < 2 ^ 2 + norm_num)) + _ = 2 := by + change (2 ^ 2).totient = 2 + rw [Nat.totient_prime_pow Nat.prime_two (by norm_num : 0 < 2)] + norm_num + +open scoped Classical in +/-- The real coordinate of the infinite component of a rational principal +idele is the original rational number. -/ +theorem + rationalPrincipalInfiniteComponent_realCoordinate + (x : ℚˣ) : + InfinitePlace.Completion.ringEquivRealOfIsReal + Rat.isReal_infinitePlace + ((IdeleGroup.infiniteComponent + Rat.infinitePlace + (IdeleGroup.principalIdele ℚ x) : + Rat.infinitePlace.Completionˣ) : + Rat.infinitePlace.Completion) = + (x : ℚ) := by + rw [InfinitePlace.Completion.ringEquivRealOfIsReal_apply] + rw [IdeleGroup.infiniteComponent_principalIdele] + rw [InfinitePlace.Completion.extensionEmbeddingOfIsReal_coe] + simp only [WithAbs.equiv_apply, eq_ratCast] + +open scoped Classical in +/-- A rational principal idele with positive numerator has trivial +infinite Artin factor in the rational complexification. -/ +theorem + rationalComplexificationPrincipalInfiniteArtin_eq_one_of_num_pos + (x : ℚˣ) (hx : 0 < (x : ℚ).num) : + chosenInfinitePlaceArtinMonoidHom + (K := ℚ) + (L := rationalComplexificationCyclotomicField) + Rat.infinitePlace + (IdeleGroup.infiniteComponent + Rat.infinitePlace + (IdeleGroup.principalIdele ℚ x)) = + 1 := by + apply + chosenInfinitePlaceArtinMonoidHom_eq_one_of_real_pos + (K := ℚ) + (L := rationalComplexificationCyclotomicField) + Rat.infinitePlace Rat.isReal_infinitePlace + rw [rationalPrincipalInfiniteComponent_realCoordinate] + exact_mod_cast Rat.num_pos.mp hx + +open scoped Classical in +/-- A rational principal idele with negative numerator has nontrivial +infinite Artin factor in the rational complexification. -/ +theorem + rationalComplexificationPrincipalInfiniteArtin_ne_one_of_num_neg + (x : ℚˣ) (hx : (x : ℚ).num < 0) : + chosenInfinitePlaceArtinMonoidHom + (K := ℚ) + (L := rationalComplexificationCyclotomicField) + Rat.infinitePlace + (IdeleGroup.infiniteComponent + Rat.infinitePlace + (IdeleGroup.principalIdele ℚ x)) ≠ + 1 := by + let E := rationalComplexificationCyclotomicField + let v := Rat.infinitePlace + let w := chosenInfinitePlaceAbove (L := E) v + have hw : + w.comap (algebraMap ℚ E) = v := + chosenInfinitePlaceAbove_comap (L := E) v + let : w.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace ℚ => q.1) hw⟩ + intro htrivial + have hnorm : + IdeleGroup.infiniteComponent v + (IdeleGroup.principalIdele ℚ x) ∈ + infiniteTensorNormSubgroup + (K := ℚ) (L := E) v := by + rw [← chosenInfinitePlaceArtinMonoidHom_ker + (K := ℚ) (L := E) v] + exact htrivial + rw [infiniteTensorNormSubgroup_eq_localNormSubgroup + (K := ℚ) (L := E) v w hw] at hnorm + obtain ⟨z, hz⟩ := hnorm + have hpositive := + infinitePlace_normUnits_real_complex_pos + (K := ℚ) v w hw + Rat.isReal_infinitePlace + rationalComplexification_chosenInfinitePlace_isRamified.isComplex + z + rw [hz] at hpositive + rw [rationalPrincipalInfiniteComponent_realCoordinate] at hpositive + have hxReal : (((x : ℚ) : ℝ) ≤ 0) := by + exact_mod_cast (Rat.num_neg.mp hx).le + exact (not_lt_of_ge hxReal) hpositive + +open scoped Classical in +/-- The cyclotomic character of the rational fourth-root field. -/ +private noncomputable def rationalComplexificationCharacter : + (rationalComplexificationCyclotomicField ≃ₐ[ℚ] + rationalComplexificationCyclotomicField) ≃* + (ZMod (rationalComplexificationPrime.1 ^ 2))ˣ := + IsCyclotomicExtension.Rat.galEquivZMod + (rationalComplexificationPrime.1 ^ 2) + rationalComplexificationCyclotomicField + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + rationalComplexificationCyclotomicOrder) + +open scoped Classical in +private theorem rationalComplexificationCharacter_apply + (σ : rationalComplexificationCyclotomicField ≃ₐ[ℚ] + rationalComplexificationCyclotomicField) : + rationalComplexificationCharacter σ = + IsCyclotomicExtension.Rat.galEquivZMod + (rationalComplexificationPrime.1 ^ 2) + rationalComplexificationCyclotomicField + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + rationalComplexificationCyclotomicOrder) σ := + rfl + +open scoped Classical in +/-- The finite-place Artin product of a rational principal idele in +the fourth-root character is its rational sign unit. -/ +private theorem rationalComplexificationFiniteArtin_character + (x : ℚˣ) : + rationalComplexificationCharacter + (∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := rationalComplexificationCyclotomicField) + v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele ℚ x))) = + Units.map (PadicInt.toZModPow 2).toMonoidHom + (rationalSignPadicUnit x rationalComplexificationPrime) := by + have hmap := + MonoidHom.map_finprod + rationalComplexificationCharacter.toMonoidHom + (finitePlaceArtinFactors_hasFiniteMulSupport + (K := ℚ) + (L := rationalComplexificationCyclotomicField) + (IdeleGroup.principalIdele ℚ x)) + calc + rationalComplexificationCharacter + (∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := rationalComplexificationCyclotomicField) + v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele ℚ x))) = + ∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + rationalComplexificationCharacter + (chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := rationalComplexificationCyclotomicField) + v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele ℚ x))) := + hmap + _ = _ := by + rw [← rationalCyclotomicPrincipalFinitePlaceProduct_eq_sign + rationalComplexificationPrime 2 x] + apply finprod_congr + intro v + rw [rationalComplexificationCharacter_apply] + +open scoped Classical in +/-- A group of order two has a unique nonidentity automorphism. -/ +private theorem rationalComplexification_existsUnique_nontrivial : + ∃! σ : + rationalComplexificationCyclotomicField ≃ₐ[ℚ] + rationalComplexificationCyclotomicField, + σ ≠ 1 := by + rw [← Nat.card_eq_two_iff' (1 : + rationalComplexificationCyclotomicField ≃ₐ[ℚ] + rationalComplexificationCyclotomicField)] + exact rationalComplexification_galoisGroup_card + +open scoped Classical in +private theorem rationalComplexification_signCharacter_ne_one_of_num_neg + (x : ℚˣ) (hx : (x : ℚ).num < 0) : + Units.map (PadicInt.toZModPow 2).toMonoidHom + (rationalSignPadicUnit x rationalComplexificationPrime) ≠ + 1 := by + intro h + have hval := congrArg Units.val h + rw [rationalSignPadicUnit_toZModPow_val] at hval + rw [Int.sign_eq_neg_one_of_neg hx] at hval + norm_num [rationalComplexificationPrime] at hval + exact (by decide : (-1 : ZMod (2 ^ 2)) ≠ 1) hval + +open scoped Classical in +private theorem rationalComplexification_signCharacter_eq_one_of_num_pos + (x : ℚˣ) (hx : 0 < (x : ℚ).num) : + Units.map (PadicInt.toZModPow 2).toMonoidHom + (rationalSignPadicUnit x rationalComplexificationPrime) = + 1 := by + apply Units.ext + rw [rationalSignPadicUnit_toZModPow_val] + rw [Int.sign_eq_one_of_pos hx] + norm_num + +open scoped Classical in +/-- The chosen global Artin product for the actual rational +complexification is trivial on every rational principal idele. -/ +theorem rationalComplexificationGlobalArtin_principalIdele + (x : ℚˣ) : + globalArtinMonoidHom + (K := ℚ) + (L := rationalComplexificationCyclotomicField) + (IdeleGroup.principalIdele ℚ x) = + 1 := by + rw [globalArtinMonoidHom_apply, Fintype.prod_unique] + let u := + IdeleGroup.infiniteComponent + Rat.infinitePlace + (IdeleGroup.principalIdele ℚ x) + let infiniteFactor := + chosenInfinitePlaceArtinMonoidHom + (K := ℚ) + (L := rationalComplexificationCyclotomicField) + Rat.infinitePlace u + let finiteFactor := + ∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := rationalComplexificationCyclotomicField) + v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele ℚ x)) + change infiniteFactor * finiteFactor = 1 + let character := + rationalComplexificationCharacter + have hfiniteCharacter : + character finiteFactor = + Units.map (PadicInt.toZModPow 2).toMonoidHom + (rationalSignPadicUnit x rationalComplexificationPrime) := by + simpa only [character, finiteFactor] using + rationalComplexificationFiniteArtin_character x + have hnum : (x : ℚ).num ≠ 0 := + Rat.num_ne_zero.mpr x.ne_zero + have hunique := + rationalComplexification_existsUnique_nontrivial + rcases lt_or_gt_of_ne hnum with hnegative | hpositive + · have hinfinite : infiniteFactor ≠ 1 := by + simpa only [infiniteFactor, u] using + rationalComplexificationPrincipalInfiniteArtin_ne_one_of_num_neg + x hnegative + have hsign : + Units.map (PadicInt.toZModPow 2).toMonoidHom + (rationalSignPadicUnit x rationalComplexificationPrime) ≠ + 1 := + rationalComplexification_signCharacter_ne_one_of_num_neg + x hnegative + have hfinite : finiteFactor ≠ 1 := by + intro h + apply hsign + rw [← hfiniteCharacter, h, map_one] + have heq : infiniteFactor = finiteFactor := + hunique.unique hinfinite hfinite + have hinvNe : finiteFactor⁻¹ ≠ 1 := + inv_ne_one.mpr hfinite + have hinvEq : finiteFactor⁻¹ = finiteFactor := + hunique.unique hinvNe hfinite + calc + infiniteFactor * finiteFactor = + finiteFactor⁻¹ * finiteFactor := by + rw [heq, hinvEq] + _ = 1 := inv_mul_cancel finiteFactor + · have hinfinite : infiniteFactor = 1 := by + simpa only [infiniteFactor, u] using + rationalComplexificationPrincipalInfiniteArtin_eq_one_of_num_pos + x hpositive + have hsign : + Units.map (PadicInt.toZModPow 2).toMonoidHom + (rationalSignPadicUnit x rationalComplexificationPrime) = + 1 := + rationalComplexification_signCharacter_eq_one_of_num_pos + x hpositive + have hfinite : finiteFactor = 1 := by + apply character.injective + rw [hfiniteCharacter, hsign, map_one] + rw [hinfinite, hfinite, mul_one] + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean new file mode 100644 index 0000000000..555c810af7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean @@ -0,0 +1,2765 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedReciprocity +/-! +# Cyclotomic Artin coordinates over abstract fixed fields + +The cyclotomic degree datum on the rational absolute Galois group has +an actual maximal-unramified field over every finite abstract fixed +field. This file identifies its genuine Galois group with +`Multiplicative ZHat`, using the normalized degree map, and supplies +the abelian Galois structure needed by the actual infinite global +Artin homomorphism. + +These constructions are the source side of the comparison between +abstract finite reciprocity and the chosen local-factor product. No +reciprocity comparison is assumed in their definitions. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open KummerTheory + +/-- Keep this module on the rational algebra structures used by the +cyclotomic fixed-field API. Generic intermediate-field instances are +propositionally equal here but not definitionally interchangeable. -/ +noncomputable local instance + cyclotomicAbstractFixedFieldArtinSeparableClosureAlgebra : + Algebra ℚ (SeparableClosure ℚ) := + DivisionRing.toRatAlgebra + +/-- The rational cyclotomic field uses the canonical rational algebra structure of a division +ring. -/ +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCyclotomicZHatFieldAlgebra : + Algebra ℚ rationalCyclotomicZHatField := + DivisionRing.toRatAlgebra + +/-- Cyclotomic field inertia is contained in the original abstract +field subgroup. -/ +theorem rationalCyclotomicFieldInertia_le + (H : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + (rationalCyclotomicDegreeData.fieldInertia H).toSubgroup ≤ + H.toSubgroup := by + intro σ hσ + exact hσ.1 + +/-- Viewing cyclotomic field inertia inside its ambient field subgroup +gives exactly the kernel of normalized degree. -/ +theorem extensionSubgroup_rationalCyclotomicFieldInertia + (H : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + CyclicCohomology.extensionSubgroup H + (rationalCyclotomicDegreeData.fieldInertia H) + (rationalCyclotomicFieldInertia_le H) = + rationalCyclotomicDegreeData.fieldInertiaWithin H := by + ext σ + rw [ + mem_extensionSubgroup_iff, + rationalCyclotomicDegreeData.mem_fieldInertiaWithin_iff, + rationalCyclotomicDegreeData.mem_fieldInertia_iff] + exact and_iff_right σ.2 + +/-- The actual Galois group of the cyclotomic maximal-unramified +extension of an abstract fixed field, in its normalized `ZHat` +coordinate. -/ +noncomputable def abstractFixedFieldCyclotomicGalEquivZHat + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + let hI := + rationalCyclotomicFieldInertia_le H.field + Gal(LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI/LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) ≃* + Multiplicative ZHat := by + let hI := + rationalCyclotomicFieldInertia_le H.field + let hnormal : + (CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI).Normal := by + rw [extensionSubgroup_rationalCyclotomicFieldInertia] + infer_instance + let qField : + H.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI ≃* + Gal(LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI/LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) := + LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI hnormal + let qInertia : + H.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI ≃* + H.field.toSubgroup ⧸ + rationalCyclotomicDegreeData.fieldInertiaWithin H.field := + QuotientGroup.quotientMulEquivOfEq + (extensionSubgroup_rationalCyclotomicFieldInertia H.field) + exact + qField.symm.trans + (qInertia.trans + (rationalCyclotomicDegreeData.maximalUnramifiedDegreeEquiv + (H.toFiniteResidueAbstractField + rationalCyclotomicDegreeData))) + +/-- On an absolute-Galois representative fixing the lower field, the +actual cyclotomic Galois coordinate is its normalized degree. -/ +@[simp] +theorem abstractFixedFieldCyclotomicGalEquivZHat_extensionClass + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (σ : H.field.toSubgroup) : + let hI := + rationalCyclotomicFieldInertia_le H.field + let hnormal : + (CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI).Normal := by + rw [extensionSubgroup_rationalCyclotomicFieldInertia] + infer_instance + abstractFixedFieldCyclotomicGalEquivZHat H + (LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI hnormal + (QuotientGroup.mk σ)) = + rationalCyclotomicDegreeData.normalizedDegree + (H.toFiniteResidueAbstractField + rationalCyclotomicDegreeData) σ := by + let hI := + rationalCyclotomicFieldInertia_le H.field + let hnormal : + (CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI).Normal := by + rw [extensionSubgroup_rationalCyclotomicFieldInertia] + infer_instance + let qField := + LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI hnormal + change + (rationalCyclotomicDegreeData.maximalUnramifiedDegreeEquiv + (H.toFiniteResidueAbstractField + rationalCyclotomicDegreeData)) + (QuotientGroup.quotientMulEquivOfEq + (extensionSubgroup_rationalCyclotomicFieldInertia H.field) + (qField.symm (qField (QuotientGroup.mk σ)))) = + rationalCyclotomicDegreeData.normalizedDegree + (H.toFiniteResidueAbstractField + rationalCyclotomicDegreeData) σ + rw [qField.symm_apply_apply] + rfl + +/-- Quotient-level evaluation of the actual cyclotomic Galois +coordinate. -/ +@[simp] +theorem abstractFixedFieldCyclotomicGalEquivZHat_quotientClass + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (q : + H.field.toSubgroup ⧸ + rationalCyclotomicDegreeData.fieldInertiaWithin H.field) : + let hI := + rationalCyclotomicFieldInertia_le H.field + let hnormal : + (CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI).Normal := by + rw [extensionSubgroup_rationalCyclotomicFieldInertia] + infer_instance + let qInertia : + H.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI ≃* + H.field.toSubgroup ⧸ + rationalCyclotomicDegreeData.fieldInertiaWithin H.field := + QuotientGroup.quotientMulEquivOfEq + (extensionSubgroup_rationalCyclotomicFieldInertia H.field) + abstractFixedFieldCyclotomicGalEquivZHat H + (LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI hnormal + (qInertia.symm q)) = + rationalCyclotomicDegreeData.maximalUnramifiedDegreeEquiv + (H.toFiniteResidueAbstractField + rationalCyclotomicDegreeData) q := by + let hI := + rationalCyclotomicFieldInertia_le H.field + let hnormal : + (CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI).Normal := by + rw [extensionSubgroup_rationalCyclotomicFieldInertia] + infer_instance + let qField := + LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI hnormal + let qInertia : + H.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI ≃* + H.field.toSubgroup ⧸ + rationalCyclotomicDegreeData.fieldInertiaWithin H.field := + QuotientGroup.quotientMulEquivOfEq + (extensionSubgroup_rationalCyclotomicFieldInertia H.field) + change + (rationalCyclotomicDegreeData.maximalUnramifiedDegreeEquiv + (H.toFiniteResidueAbstractField + rationalCyclotomicDegreeData)) + (qInertia + (qField.symm + (qField (qInertia.symm q)))) = + rationalCyclotomicDegreeData.maximalUnramifiedDegreeEquiv + (H.toFiniteResidueAbstractField + rationalCyclotomicDegreeData) q + rw [qField.symm_apply_apply, qInertia.apply_symm_apply] + +/-- The extension fixed by cyclotomic field inertia is an actual +abelian Galois extension of the lower abstract fixed field. -/ +theorem abstractFixedFieldCyclotomic_isAbelianGalois + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + let hI := + rationalCyclotomicFieldInertia_le H.field + IsAbelianGalois + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI) := by + let hI := + rationalCyclotomicFieldInertia_le H.field + let hnormal : + (CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI).Normal := by + rw [extensionSubgroup_rationalCyclotomicFieldInertia] + infer_instance + let : IsGalois + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI) := + LocalClassFieldTheory.abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI hnormal + let e := + abstractFixedFieldCyclotomicGalEquivZHat H + exact + { is_comm.comm := by + intro σ τ + apply e.injective + simpa only [map_mul] using mul_comm (e σ) (e τ) } + +/-- The rational cyclotomic `ZHat`-field embedded in the actual +maximal-unramified compositum of an abstract fixed field. -/ +noncomputable def + rationalCyclotomicZHatFieldEmbeddingInAbstractFixedFieldCompositum + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + let hI := + rationalCyclotomicFieldInertia_le H.field + rationalCyclotomicZHatField →ₐ[ℚ] + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI := by + let hI := + rationalCyclotomicFieldInertia_le H.field + let J := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicDegreeData.fieldInertia H.field) + have hTJ : + rationalCyclotomicZHatField ≤ J := by + change + rationalCyclotomicZHatField ≤ + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicDegreeData.fieldInertia H.field) + rw [ + rationalCyclotomicDegreeData_fixedField_fieldInertia] + exact le_sup_right + exact IntermediateField.inclusion hTJ + +noncomputable instance + abstractFixedFieldCyclotomicCompositumAlgebra + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + let hI := + rationalCyclotomicFieldInertia_le H.field + Algebra rationalCyclotomicZHatField + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI) := + ((rationalCyclotomicZHatFieldEmbeddingInAbstractFixedFieldCompositum + H).toRingHom).toAlgebra + +instance abstractFixedFieldCyclotomicCompositum_scalarTower + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + let hI := + rationalCyclotomicFieldInertia_le H.field + IsScalarTower ℚ rationalCyclotomicZHatField + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI) := + IsScalarTower.of_algebraMap_eq' + ((rationalCyclotomicZHatFieldEmbeddingInAbstractFixedFieldCompositum + H).comp_algebraMap).symm + +instance abstractFixedFieldCyclotomicCompositum_baseScalarTower + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + let hI := + rationalCyclotomicFieldInertia_le H.field + IsScalarTower ℚ + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI) := by + let hI := + rationalCyclotomicFieldInertia_le H.field + apply IsScalarTower.of_algebraMap_eq + intro x + apply Subtype.ext + rfl + +/-- Restriction from the actual maximal-unramified compositum of an +abstract fixed field to the rational cyclotomic factor. -/ +noncomputable def abstractFixedFieldCyclotomicRestriction + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + let hI := + rationalCyclotomicFieldInertia_le H.field + Gal(LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI/LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) →* + Gal(rationalCyclotomicZHatField/ℚ) := by + let hI := + rationalCyclotomicFieldInertia_le H.field + exact + IntermediateField.restrictRestrictAlgEquivMapHom + ℚ rationalCyclotomicZHatField + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI) + +/-- On a quotient representative, cyclotomic restriction of the +actual relative automorphism is ordinary restriction of the same +ambient absolute-Galois automorphism. -/ +theorem cyclotomicAbstractFixedFieldArtin_cyclotomicZHatFieldNormal : + Normal ℚ rationalCyclotomicZHatField := + rationalCyclotomicZHatField_isNormal + +attribute [local instance] cyclotomicAbstractFixedFieldArtin_cyclotomicZHatFieldNormal + +@[simp] +theorem abstractFixedFieldCyclotomicRestriction_extensionClass + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (σ : H.field.toSubgroup) : + let hI := + rationalCyclotomicFieldInertia_le H.field + let hnormal : + (CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI).Normal := by + rw [extensionSubgroup_rationalCyclotomicFieldInertia] + infer_instance + abstractFixedFieldCyclotomicRestriction H + (LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI hnormal + (QuotientGroup.mk σ)) = + AlgEquiv.restrictNormalHom + rationalCyclotomicZHatField σ.1 := by + let hI := + rationalCyclotomicFieldInertia_le H.field + let hnormal : + (CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI).Normal := by + rw [extensionSubgroup_rationalCyclotomicFieldInertia] + infer_instance + let τ := + LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI hnormal + (QuotientGroup.mk' + (CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) hI) + σ) + apply AlgEquiv.ext + intro x + apply Subtype.ext + let U := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI + have hrestrict : + algebraMap rationalCyclotomicZHatField U + ((abstractFixedFieldCyclotomicRestriction H τ) x) = + τ (algebraMap rationalCyclotomicZHatField U x) := by + change + algebraMap rationalCyclotomicZHatField U + ((AlgEquiv.restrictNormal + (MulSemiringAction.toAlgEquiv ℚ U τ) + rationalCyclotomicZHatField) x) = + (MulSemiringAction.toAlgEquiv ℚ U τ) + (algebraMap rationalCyclotomicZHatField U x) + exact + AlgEquiv.restrictNormal_commutes + (MulSemiringAction.toAlgEquiv ℚ U τ) + rationalCyclotomicZHatField x + have halgebraMap_eq_embedding + (z : rationalCyclotomicZHatField) : + algebraMap rationalCyclotomicZHatField U z = + (rationalCyclotomicZHatFieldEmbeddingInAbstractFixedFieldCompositum + H z : U) := by + rfl + have hembedding_coe + (z : rationalCyclotomicZHatField) : + (((rationalCyclotomicZHatFieldEmbeddingInAbstractFixedFieldCompositum + H z : U) : SeparableClosure ℚ)) = + (z : SeparableClosure ℚ) := by + rfl + have halgebraMap_coe + (z : rationalCyclotomicZHatField) : + ((algebraMap rationalCyclotomicZHatField U z : U) : + SeparableClosure ℚ) = + (z : SeparableClosure ℚ) := by + rw [halgebraMap_eq_embedding] + exact hembedding_coe z + have hambient := + LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup_mk_apply_val + ℚ (SeparableClosure ℚ) H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI hnormal σ + (rationalCyclotomicZHatFieldEmbeddingInAbstractFixedFieldCompositum + H x) + calc + (((abstractFixedFieldCyclotomicRestriction H τ) x : + rationalCyclotomicZHatField) : + SeparableClosure ℚ) = + ((τ + (rationalCyclotomicZHatFieldEmbeddingInAbstractFixedFieldCompositum + H x) : + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI) : + SeparableClosure ℚ) := by + calc + (((abstractFixedFieldCyclotomicRestriction H τ) x : + rationalCyclotomicZHatField) : SeparableClosure ℚ) = + ((algebraMap rationalCyclotomicZHatField U + ((abstractFixedFieldCyclotomicRestriction H τ) x) : U) : + SeparableClosure ℚ) := + (halgebraMap_coe + ((abstractFixedFieldCyclotomicRestriction H τ) x)).symm + _ = ((τ (algebraMap rationalCyclotomicZHatField U x) : U) : + SeparableClosure ℚ) := + congrArg (fun y : U => (y : SeparableClosure ℚ)) hrestrict + _ = ((τ + (rationalCyclotomicZHatFieldEmbeddingInAbstractFixedFieldCompositum + H x) : U) : SeparableClosure ℚ) := by + rw [halgebraMap_eq_embedding] + _ = σ.1 (x : SeparableClosure ℚ) := by + calc + ((τ + (rationalCyclotomicZHatFieldEmbeddingInAbstractFixedFieldCompositum + H x) : U) : SeparableClosure ℚ) = + σ.1 + ((rationalCyclotomicZHatFieldEmbeddingInAbstractFixedFieldCompositum + H x : U) : SeparableClosure ℚ) := by + simpa only [τ, U] using hambient.symm + _ = σ.1 (x : SeparableClosure ℚ) := by + rw [hembedding_coe] + _ = + (((AlgEquiv.restrictNormalHom + rationalCyclotomicZHatField σ.1) x : + rationalCyclotomicZHatField) : + SeparableClosure ℚ) := by + exact + (AlgEquiv.restrictNormal_commutes + σ.1 rationalCyclotomicZHatField x).symm + +/-- Raw cyclotomic restriction is residue-degree multiplication of +the normalized actual Galois coordinate. -/ +theorem + abstractFixedFieldCyclotomicRestriction_coordinate + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (τ : + Gal(LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field)) : + Multiplicative.toAdd + (rationalCyclotomicZHatFieldGalEquivZHat + (abstractFixedFieldCyclotomicRestriction H τ)) = + (H.residueDegree rationalCyclotomicDegreeData : ℕ) • + Multiplicative.toAdd + (abstractFixedFieldCyclotomicGalEquivZHat H τ) := by + let hI := + rationalCyclotomicFieldInertia_le H.field + let hnormal : + (CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI).Normal := by + rw [extensionSubgroup_rationalCyclotomicFieldInertia] + infer_instance + let qField := + LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI hnormal + obtain ⟨q, rfl⟩ := qField.surjective τ + refine Quotient.inductionOn' q ?_ + intro σ + rw [ + abstractFixedFieldCyclotomicRestriction_extensionClass, + abstractFixedFieldCyclotomicGalEquivZHat_extensionClass] + exact + (rationalCyclotomicDegreeData.residueDegree_nsmul_normalizedDegree + (H.toFiniteResidueAbstractField + rationalCyclotomicDegreeData) σ).symm + +/-- The canonical compositum of an abstract fixed field with a finite +layer of the rational cyclotomic `ZHat`-extension. -/ +def abstractFixedFieldCyclotomicFiniteCompositum + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IntermediateField ℚ (SeparableClosure ℚ) := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field ⊔ + IntermediateField.lift E.toIntermediateField + +/-- The compositum of the fixed base with a finite cyclotomic layer has finite rational degree. +-/ +theorem abstractFixedFieldCyclotomicFiniteCompositum_finiteDimensional + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + FiniteDimensional ℚ + (abstractFixedFieldCyclotomicFiniteCompositum H E) := by + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + let : FiniteDimensional ℚ + (IntermediateField.lift E.toIntermediateField) := + ((IntermediateField.liftAlgEquiv + E.toIntermediateField).toLinearEquiv).finiteDimensional + exact IntermediateField.finiteDimensional_sup + F (IntermediateField.lift E.toIntermediateField) + +attribute [instance] abstractFixedFieldCyclotomicFiniteCompositum_finiteDimensional + +/-- The compositum of the fixed base with a finite cyclotomic layer is a number field. -/ +theorem abstractFixedFieldCyclotomicFiniteCompositum_numberField + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + NumberField + (abstractFixedFieldCyclotomicFiniteCompositum H E) := + NumberField.of_module_finite ℚ + (abstractFixedFieldCyclotomicFiniteCompositum H E) + +attribute [instance] abstractFixedFieldCyclotomicFiniteCompositum_numberField + +/-- The lower abstract fixed field embedded into its finite +cyclotomic compositum. -/ +noncomputable def + abstractFixedFieldCyclotomicFiniteCompositumBaseEmbedding + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field →ₐ[ℚ] + abstractFixedFieldCyclotomicFiniteCompositum H E := + IntermediateField.inclusion + (show + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field ≤ + abstractFixedFieldCyclotomicFiniteCompositum H E from + le_sup_left) + +/-- The fixed field attached to a finite abstract field is a number +field. Keeping this as the single file-local instance makes it +available while later theorem binders are elaborated. -/ +theorem abstractFixedFieldCyclotomic_numberField + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + NumberField + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) := by + let : FiniteDimensional ℚ + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + exact + NumberField.of_module_finite ℚ + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + +attribute [local instance] abstractFixedFieldCyclotomic_numberField + +/-- A finite rational cyclotomic layer embedded into its compositum +with the abstract fixed field. -/ +noncomputable def + abstractFixedFieldCyclotomicFiniteCompositumLayerEmbedding + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + E →ₐ[ℚ] + abstractFixedFieldCyclotomicFiniteCompositum H E := + (IntermediateField.inclusion + (show + IntermediateField.lift E.toIntermediateField ≤ + abstractFixedFieldCyclotomicFiniteCompositum H E from + le_sup_right)).comp + (IntermediateField.liftAlgEquiv E.toIntermediateField).toAlgHom + +noncomputable instance + abstractFixedFieldCyclotomicFiniteCompositumBaseAlgebra + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Algebra + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (abstractFixedFieldCyclotomicFiniteCompositum H E) := + RingHom.toAlgebra + (AlgHom.toRingHom + (abstractFixedFieldCyclotomicFiniteCompositumBaseEmbedding H E)) + +noncomputable instance + abstractFixedFieldCyclotomicFiniteCompositumLayerAlgebra + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Algebra E + (abstractFixedFieldCyclotomicFiniteCompositum H E) := + RingHom.toAlgebra + (AlgHom.toRingHom + (abstractFixedFieldCyclotomicFiniteCompositumLayerEmbedding H E)) + +/-- The finite-layer action induced by its explicit embedding into the +finite compositum. -/ +noncomputable instance + abstractFixedFieldCyclotomicFiniteCompositumLayerSMul + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + SMul E + (abstractFixedFieldCyclotomicFiniteCompositum H E) := + Algebra.toSMul + (self := + abstractFixedFieldCyclotomicFiniteCompositumLayerAlgebra H E) + +/-- The compositum's rational scalars factor through the fixed base embedding. -/ +theorem abstractFixedFieldCyclotomicFiniteCompositum_baseScalarTower + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsScalarTower ℚ + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (abstractFixedFieldCyclotomicFiniteCompositum H E) := + IsScalarTower.of_algebraMap_eq' + (AlgHom.comp_algebraMap + (abstractFixedFieldCyclotomicFiniteCompositumBaseEmbedding H E)).symm + +attribute [instance] abstractFixedFieldCyclotomicFiniteCompositum_baseScalarTower + +/-- The compositum's rational scalars factor through its finite cyclotomic layer embedding. -/ +theorem abstractFixedFieldCyclotomicFiniteCompositum_layerScalarTower + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsScalarTower ℚ E + (abstractFixedFieldCyclotomicFiniteCompositum H E) := + IsScalarTower.of_algebraMap_eq' + (AlgHom.comp_algebraMap + (abstractFixedFieldCyclotomicFiniteCompositumLayerEmbedding H E)).symm + +attribute [instance] abstractFixedFieldCyclotomicFiniteCompositum_layerScalarTower + +/-- Inclusion of the finite cyclotomic compositum into the actual +maximal-unramified compositum. -/ +noncomputable def + abstractFixedFieldCyclotomicFiniteCompositumInclusion + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + let hI := + rationalCyclotomicFieldInertia_le H.field + abstractFixedFieldCyclotomicFiniteCompositum H E →ₐ[ℚ] + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI := by + let hI := + rationalCyclotomicFieldInertia_le H.field + let J := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicDegreeData.fieldInertia H.field) + have hle : + abstractFixedFieldCyclotomicFiniteCompositum H E ≤ J := by + dsimp only [J] + rw [ + rationalCyclotomicDegreeData_fixedField_fieldInertia H.field] + exact + sup_le_sup le_rfl + (IntermediateField.lift_le E.toIntermediateField) + exact IntermediateField.inclusion hle + +/-- The same finite-compositum inclusion over the lower abstract fixed +field. -/ +noncomputable def + abstractFixedFieldCyclotomicFiniteCompositumInclusionOverBase + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + let hI := + rationalCyclotomicFieldInertia_le H.field + abstractFixedFieldCyclotomicFiniteCompositum H E →ₐ[ + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field] + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI := by + let f := + abstractFixedFieldCyclotomicFiniteCompositumInclusion H E + exact + { f.toRingHom with + commutes' := by + intro x + rfl } + +/-- The finite cyclotomic compositum as an intermediate field of the +actual maximal-unramified extension. -/ +noncomputable def abstractFixedFieldCyclotomicFiniteLayer + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + let hI := + rationalCyclotomicFieldInertia_le H.field + IntermediateField + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI) := + (abstractFixedFieldCyclotomicFiniteCompositumInclusionOverBase H E).fieldRange + +/-- The base algebra on the finite field range, obtained from the +explicit base embedding followed by the field-range equivalence. -/ +noncomputable instance + abstractFixedFieldCyclotomicFiniteLayerBaseAlgebra + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Algebra + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (abstractFixedFieldCyclotomicFiniteLayer H E) := + RingHom.toAlgebra + ((AlgHom.toRingHom + (AlgEquiv.toAlgHom + (AlgHom.equivFieldRange + (abstractFixedFieldCyclotomicFiniteCompositumInclusionOverBase + H E)))).comp + (AlgHom.toRingHom + (abstractFixedFieldCyclotomicFiniteCompositumBaseEmbedding H E))) + +/-- The scalar action belonging to the canonical base algebra on the +finite field range. -/ +noncomputable instance + abstractFixedFieldCyclotomicFiniteLayerBaseSMul + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + SMul + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (abstractFixedFieldCyclotomicFiniteLayer H E) := + Algebra.toSMul + (self := abstractFixedFieldCyclotomicFiniteLayerBaseAlgebra H E) + +/-- The module structure belonging to the canonical base algebra on +the finite field range. -/ +noncomputable instance + abstractFixedFieldCyclotomicFiniteLayerBaseModule + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Module + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (abstractFixedFieldCyclotomicFiniteLayer H E) := + @Algebra.toModule + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (abstractFixedFieldCyclotomicFiniteLayer H E) + _ _ + (abstractFixedFieldCyclotomicFiniteLayerBaseAlgebra H E) + +/-- The field-range equivalence rebuilt over the explicit base +algebras. Its underlying ring equivalence is the canonical one. -/ +noncomputable def + abstractFixedFieldCyclotomicFiniteCompositumEquivFiniteLayer + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + abstractFixedFieldCyclotomicFiniteCompositum H E ≃ₐ[LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field] + abstractFixedFieldCyclotomicFiniteLayer H E := + AlgEquiv.ofRingEquiv + (f := + (AlgHom.equivFieldRange + (abstractFixedFieldCyclotomicFiniteCompositumInclusionOverBase + H E)).toRingEquiv) + (fun _ => rfl) + +/-- The image of the finite cyclotomic compositum has finite degree over the fixed base. -/ +theorem abstractFixedFieldCyclotomicFiniteLayer_finiteDimensional + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + FiniteDimensional + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (abstractFixedFieldCyclotomicFiniteLayer H E) := + (abstractFixedFieldCyclotomicFiniteCompositumEquivFiniteLayer + H E).toLinearEquiv.finiteDimensional + +attribute [instance] abstractFixedFieldCyclotomicFiniteLayer_finiteDimensional + +/-- The finite layer inside the relative fixed field is a number field. -/ +theorem abstractFixedFieldCyclotomicFiniteLayer_numberField + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + NumberField + (abstractFixedFieldCyclotomicFiniteLayer H E) := + NumberField.of_module_finite + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (abstractFixedFieldCyclotomicFiniteLayer H E) + +attribute [instance] abstractFixedFieldCyclotomicFiniteLayer_numberField + +/-- The finite layer inside the relative fixed field is abelian Galois over the fixed base. -/ +theorem abstractFixedFieldCyclotomicFiniteLayer_isAbelianGalois + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsAbelianGalois + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (abstractFixedFieldCyclotomicFiniteLayer H E) := by + let hI := + rationalCyclotomicFieldInertia_le H.field + let : IsAbelianGalois + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI) := + abstractFixedFieldCyclotomic_isAbelianGalois H + exact + IsAbelianGalois.of_algHom + ((abstractFixedFieldCyclotomicFiniteCompositumInclusionOverBase + H E).comp + (AlgEquiv.toAlgHom + (AlgEquiv.symm + (abstractFixedFieldCyclotomicFiniteCompositumEquivFiniteLayer + H E)))) + +attribute [instance] abstractFixedFieldCyclotomicFiniteLayer_isAbelianGalois + +/-- Rational scalars on the finite layer factor through its fixed base field. -/ +theorem abstractFixedFieldCyclotomicFiniteLayer_baseScalarTower + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsScalarTower ℚ + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (abstractFixedFieldCyclotomicFiniteLayer H E) := by + let hI := + rationalCyclotomicFieldInertia_le H.field + apply IsScalarTower.of_algebraMap_eq + intro x + apply Subtype.ext + change + algebraMap ℚ + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI) x = + algebraMap + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI) + (algebraMap ℚ + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) x) + exact + IsScalarTower.algebraMap_apply + ℚ + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI) x + +attribute [instance] abstractFixedFieldCyclotomicFiniteLayer_baseScalarTower + +/-- The finite rational layer embedded into its corresponding +intermediate field over the abstract fixed field. -/ +noncomputable def + abstractFixedFieldCyclotomicFiniteLayerEmbedding + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + E →ₐ[ℚ] + abstractFixedFieldCyclotomicFiniteLayer H E := by + exact + (AlgEquiv.toAlgHom + (AlgEquiv.restrictScalars ℚ + (abstractFixedFieldCyclotomicFiniteCompositumEquivFiniteLayer + H E))).comp + (abstractFixedFieldCyclotomicFiniteCompositumLayerEmbedding H E) + +noncomputable instance + abstractFixedFieldCyclotomicFiniteLayerLayerAlgebra + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Algebra E + (abstractFixedFieldCyclotomicFiniteLayer H E) := + RingHom.toAlgebra + (AlgHom.toRingHom + (abstractFixedFieldCyclotomicFiniteLayerEmbedding H E)) + +/-- The finite-layer action on its actual image in the relative fixed +field. -/ +noncomputable instance + abstractFixedFieldCyclotomicFiniteLayerLayerSMul + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + SMul E + (abstractFixedFieldCyclotomicFiniteLayer H E) := + Algebra.toSMul + (self := abstractFixedFieldCyclotomicFiniteLayerLayerAlgebra H E) + +/-- Rational scalars on the finite layer factor through its chosen cyclotomic field. -/ +theorem abstractFixedFieldCyclotomicFiniteLayer_layerScalarTower + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsScalarTower ℚ E + (abstractFixedFieldCyclotomicFiniteLayer H E) := + IsScalarTower.of_algebraMap_eq' + (AlgHom.comp_algebraMap + (abstractFixedFieldCyclotomicFiniteLayerEmbedding H E)).symm + +attribute [instance] abstractFixedFieldCyclotomicFiniteLayer_layerScalarTower + +/-- The finite cyclotomic layer as an object of the finite-Galois +inverse system of the actual maximal-unramified extension. -/ +@[reducible] +noncomputable def + abstractFixedFieldCyclotomicFiniteGaloisLayer + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + FiniteGaloisIntermediateField + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field)) where + toIntermediateField := + abstractFixedFieldCyclotomicFiniteLayer H E + finiteDimensional := + abstractFixedFieldCyclotomicFiniteLayer_finiteDimensional H E + isGalois := + (abstractFixedFieldCyclotomicFiniteLayer_isAbelianGalois H E).toIsGalois + +/-- The explicit base algebra on a finite cyclotomic layer is the canonical +intermediate-field inclusion used by the finite Galois inverse system. -/ +theorem abstractFixedFieldCyclotomicFiniteLayer_baseAlgebra_eq_algebra' + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + abstractFixedFieldCyclotomicFiniteLayerBaseAlgebra H E = + (abstractFixedFieldCyclotomicFiniteGaloisLayer H E).algebra' := by + apply Algebra.algebra_ext + intro x + apply Subtype.ext + rfl + +/-- The finite Galois layer uses its canonical inclusion into the full +relative fixed field for the upper scalar action. -/ +theorem abstractFixedFieldCyclotomicFiniteGaloisLayer_scalarTower + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsScalarTower + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (abstractFixedFieldCyclotomicFiniteGaloisLayer H E).toIntermediateField + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field)) := by + let i : + (abstractFixedFieldCyclotomicFiniteGaloisLayer + H E).toIntermediateField →ₐ[ + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field] + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) := + { (abstractFixedFieldCyclotomicFiniteGaloisLayer + H E).toIntermediateField.val.toRingHom with + commutes' := by + intro x + rfl } + exact + IsScalarTower.of_algebraMap_eq' + (AlgHom.comp_algebraMap i).symm + +attribute [instance] abstractFixedFieldCyclotomicFiniteGaloisLayer_scalarTower + +/-- The canonical inclusion of the finite cyclotomic layer into the +full abstract-fixed-field compositum. -/ +private noncomputable def + abstractFixedFieldCyclotomicFiniteLayerInclusion + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + abstractFixedFieldCyclotomicFiniteLayer H E →ₐ[ + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field] + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) := + IntermediateField.val + (abstractFixedFieldCyclotomicFiniteLayer H E) + +/-- The two embeddings of a finite rational cyclotomic layer into the +full abstract-fixed-field compositum agree. -/ +private theorem + abstractFixedFieldCyclotomicFiniteLayerEmbedding_inclusion + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) + (z : E) : + abstractFixedFieldCyclotomicFiniteLayerInclusion H E + (abstractFixedFieldCyclotomicFiniteLayerEmbedding H E z) = + rationalCyclotomicZHatFieldEmbeddingInAbstractFixedFieldCompositum H + (z : rationalCyclotomicZHatField) := by + exact Subtype.ext rfl + +/-- Restriction to `E` commutes pointwise with the restriction from the +full rational cyclotomic tower. -/ +private theorem + restrictNormalHom_abstractFixedFieldCyclotomicRestriction_apply + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) + [Normal ℚ E] + (σ : + Gal(LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field)) + (z : E) : + ((AlgEquiv.restrictNormalHom E + (abstractFixedFieldCyclotomicRestriction H σ)) z : + rationalCyclotomicZHatField) = + (abstractFixedFieldCyclotomicRestriction H σ) + (z : rationalCyclotomicZHatField) := by + exact + AlgEquiv.restrictNormal_commutes + (abstractFixedFieldCyclotomicRestriction H σ) E z + +/-- The raw cyclotomic restriction commutes with the canonical embedding +of the full rational cyclotomic tower. -/ +private theorem + abstractFixedFieldCyclotomicRestriction_embedding_apply + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (σ : + Gal(LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field)) + (z : rationalCyclotomicZHatField) : + rationalCyclotomicZHatFieldEmbeddingInAbstractFixedFieldCompositum H + (abstractFixedFieldCyclotomicRestriction H σ z) = + σ + (rationalCyclotomicZHatFieldEmbeddingInAbstractFixedFieldCompositum + H z) := by + let U := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) + exact + AlgEquiv.restrictNormal_commutes + (MulSemiringAction.toAlgEquiv ℚ U σ) + rationalCyclotomicZHatField z + +/-- Restriction to the finite compositum layer commutes with its +canonical inclusion into the full compositum. -/ +private theorem + restrictNormalHom_abstractFixedFieldCyclotomicFiniteLayer_apply + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) + [Normal + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (abstractFixedFieldCyclotomicFiniteLayer H E)] + (σ : + Gal(LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field)) + (z : abstractFixedFieldCyclotomicFiniteLayer H E) : + abstractFixedFieldCyclotomicFiniteLayerInclusion H E + (AlgEquiv.restrictNormalHom + (abstractFixedFieldCyclotomicFiniteLayer H E) σ z) = + σ (abstractFixedFieldCyclotomicFiniteLayerInclusion H E z) := by + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let U := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) + let P : IntermediateField F U := + abstractFixedFieldCyclotomicFiniteLayer H E + exact + AlgEquiv.restrictNormal_commutes + (MulSemiringAction.toAlgEquiv F U σ) P z + +/-- Restricting the finite-compositum action further to `E` commutes +with the explicit embedding of `E` into that finite layer. -/ +private theorem + abstractFixedFieldCyclotomicFiniteLayerEmbedding_restrict_apply + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) + [Normal ℚ E] + [Normal + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (abstractFixedFieldCyclotomicFiniteLayer H E)] + (σ : + Gal(LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field)) + (z : E) : + abstractFixedFieldCyclotomicFiniteLayerEmbedding H E + (IntermediateField.restrictRestrictAlgEquivMapHom + ℚ E + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (abstractFixedFieldCyclotomicFiniteLayer H E) + (AlgEquiv.restrictNormalHom + (abstractFixedFieldCyclotomicFiniteLayer H E) σ) z) = + (AlgEquiv.restrictNormalHom + (abstractFixedFieldCyclotomicFiniteLayer H E) σ) + (abstractFixedFieldCyclotomicFiniteLayerEmbedding H E z) := by + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let U := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) + let P : IntermediateField F U := + abstractFixedFieldCyclotomicFiniteLayer H E + exact + AlgEquiv.restrictNormal_commutes + (MulSemiringAction.toAlgEquiv ℚ P + (AlgEquiv.restrictNormalHom P σ)) E z + +/-- The left finite-level restriction, after both canonical embeddings into +the full compositum, is the action of `σ` on the cyclotomic embedding. -/ +private theorem + restrictNormalHom_abstractFixedFieldCyclotomicRestriction_left_embedded + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) + [Normal ℚ E] + (σ : + Gal(LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field)) + (x : E) : + abstractFixedFieldCyclotomicFiniteLayerInclusion H E + (abstractFixedFieldCyclotomicFiniteLayerEmbedding H E + (AlgEquiv.restrictNormalHom E + (abstractFixedFieldCyclotomicRestriction H σ) x)) = + σ + (rationalCyclotomicZHatFieldEmbeddingInAbstractFixedFieldCompositum H + (x : rationalCyclotomicZHatField)) := by + calc + abstractFixedFieldCyclotomicFiniteLayerInclusion H E + (abstractFixedFieldCyclotomicFiniteLayerEmbedding H E + (AlgEquiv.restrictNormalHom E + (abstractFixedFieldCyclotomicRestriction H σ) x)) = + rationalCyclotomicZHatFieldEmbeddingInAbstractFixedFieldCompositum H + (((AlgEquiv.restrictNormalHom E + (abstractFixedFieldCyclotomicRestriction H σ) x) : + rationalCyclotomicZHatField)) := + abstractFixedFieldCyclotomicFiniteLayerEmbedding_inclusion H E _ + _ = rationalCyclotomicZHatFieldEmbeddingInAbstractFixedFieldCompositum H + (abstractFixedFieldCyclotomicRestriction H σ + (x : rationalCyclotomicZHatField)) := + congrArg + (rationalCyclotomicZHatFieldEmbeddingInAbstractFixedFieldCompositum H) + (restrictNormalHom_abstractFixedFieldCyclotomicRestriction_apply + H E σ x) + _ = σ + (rationalCyclotomicZHatFieldEmbeddingInAbstractFixedFieldCompositum + H (x : rationalCyclotomicZHatField)) := + abstractFixedFieldCyclotomicRestriction_embedding_apply + H σ (x : rationalCyclotomicZHatField) + +/-- The right finite-level restriction, after both canonical embeddings into +the full compositum, is the same action of `σ`. -/ +private theorem + restrictNormalHom_abstractFixedFieldCyclotomicRestriction_right_embedded + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) + [Normal ℚ E] + [Normal + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (abstractFixedFieldCyclotomicFiniteLayer H E)] + (σ : + Gal(LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field)) + (x : E) : + abstractFixedFieldCyclotomicFiniteLayerInclusion H E + (abstractFixedFieldCyclotomicFiniteLayerEmbedding H E + (IntermediateField.restrictRestrictAlgEquivMapHom + ℚ E + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (abstractFixedFieldCyclotomicFiniteLayer H E) + (AlgEquiv.restrictNormalHom + (abstractFixedFieldCyclotomicFiniteLayer H E) σ) x)) = + σ + (rationalCyclotomicZHatFieldEmbeddingInAbstractFixedFieldCompositum H + (x : rationalCyclotomicZHatField)) := by + calc + abstractFixedFieldCyclotomicFiniteLayerInclusion H E + (abstractFixedFieldCyclotomicFiniteLayerEmbedding H E + (IntermediateField.restrictRestrictAlgEquivMapHom + ℚ E + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (abstractFixedFieldCyclotomicFiniteLayer H E) + (AlgEquiv.restrictNormalHom + (abstractFixedFieldCyclotomicFiniteLayer H E) σ) x)) = + abstractFixedFieldCyclotomicFiniteLayerInclusion H E + ((AlgEquiv.restrictNormalHom + (abstractFixedFieldCyclotomicFiniteLayer H E) σ) + (abstractFixedFieldCyclotomicFiniteLayerEmbedding H E x)) := + congrArg + (abstractFixedFieldCyclotomicFiniteLayerInclusion H E) + (abstractFixedFieldCyclotomicFiniteLayerEmbedding_restrict_apply + H E σ x) + _ = σ + (abstractFixedFieldCyclotomicFiniteLayerInclusion H E + (abstractFixedFieldCyclotomicFiniteLayerEmbedding H E x)) := + restrictNormalHom_abstractFixedFieldCyclotomicFiniteLayer_apply + H E σ (abstractFixedFieldCyclotomicFiniteLayerEmbedding H E x) + _ = σ + (rationalCyclotomicZHatFieldEmbeddingInAbstractFixedFieldCompositum + H (x : rationalCyclotomicZHatField)) := + congrArg σ + (abstractFixedFieldCyclotomicFiniteLayerEmbedding_inclusion H E x) + +/-- Pointwise form of finite-layer restriction compatibility. -/ +private theorem + restrictNormalHom_abstractFixedFieldCyclotomicRestriction_pointwise + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) + [Normal ℚ E] + [Normal + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (abstractFixedFieldCyclotomicFiniteLayer H E)] + (σ : + Gal(LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field)) + (x : E) : + AlgEquiv.restrictNormalHom E + (abstractFixedFieldCyclotomicRestriction H σ) x = + IntermediateField.restrictRestrictAlgEquivMapHom + ℚ E + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (abstractFixedFieldCyclotomicFiniteLayer H E) + (AlgEquiv.restrictNormalHom + (abstractFixedFieldCyclotomicFiniteLayer H E) σ) x := by + apply + (abstractFixedFieldCyclotomicFiniteLayerEmbedding H E).injective + apply + (abstractFixedFieldCyclotomicFiniteLayerInclusion H E).injective + exact + (restrictNormalHom_abstractFixedFieldCyclotomicRestriction_left_embedded + H E σ x).trans + (restrictNormalHom_abstractFixedFieldCyclotomicRestriction_right_embedded + H E σ x).symm + +/-- Restricting through a finite layer commutes with restriction from +the full abstract-fixed-field compositum. -/ +theorem + restrictNormalHom_abstractFixedFieldCyclotomicRestriction + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) + (σ : + Gal(LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field)) : + letI : Normal ℚ E := E.isGalois.to_normal + AlgEquiv.restrictNormalHom E + (abstractFixedFieldCyclotomicRestriction H σ) = + IntermediateField.restrictRestrictAlgEquivMapHom + ℚ E + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (abstractFixedFieldCyclotomicFiniteLayer H E) + (AlgEquiv.restrictNormalHom + (abstractFixedFieldCyclotomicFiniteGaloisLayer H E) + σ) := by + let : Normal ℚ E := E.isGalois.to_normal + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let U := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) + let T := rationalCyclotomicZHatField + let P : IntermediateField F U := + abstractFixedFieldCyclotomicFiniteLayer H E + let : Algebra T U := + abstractFixedFieldCyclotomicCompositumAlgebra H + let : IsScalarTower ℚ T U := + abstractFixedFieldCyclotomicCompositum_scalarTower H + let : Algebra E P := + abstractFixedFieldCyclotomicFiniteLayerLayerAlgebra H E + let : IsScalarTower ℚ E P := + abstractFixedFieldCyclotomicFiniteLayer_layerScalarTower H E + let : IsAbelianGalois F P := by + change IsAbelianGalois F + (abstractFixedFieldCyclotomicFiniteLayer H E) + exact + abstractFixedFieldCyclotomicFiniteLayer_isAbelianGalois H E + let : Normal F P := IsGalois.to_normal + apply AlgEquiv.ext + intro x + exact + restrictNormalHom_abstractFixedFieldCyclotomicRestriction_pointwise + H E σ x + +section FiniteCoordinateHelpers + +/-- Opaque three-step equality composition used to keep large dependent +finite-level coordinates out of endpoint proof normalization. -/ +private theorem cyclotomicAbstractFixedFieldArtin_eqTransThree + {α : Type} {a b c d : α} + (hab : a = b) (hbc : b = c) (hcd : c = d) : + a = d := + hab.trans (hbc.trans hcd) + +local notation "cyclotomicAbstractFixedFieldArtinCoordinateBase" => + (fun H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) => + LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field) + +local notation "cyclotomicAbstractFixedFieldArtinCoordinateRelative" => + (fun H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) => + LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field)) + +local notation "cyclotomicAbstractFixedFieldArtinCoordinateLayer" => + abstractFixedFieldCyclotomicFiniteLayer + +/-- The base field for an abstract fixed-field Artin coordinate carries its rational algebra +structure. -/ +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateBaseAlgebra + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + Algebra ℚ + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) := + (cyclotomicAbstractFixedFieldArtinCoordinateBase H).algebra' + +/-- The fixed base field of an Artin coordinate has finite degree over the rationals. -/ +theorem cyclotomicAbstractFixedFieldArtinCoordinateBaseFiniteDimensional + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + FiniteDimensional ℚ + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + +attribute [local instance] cyclotomicAbstractFixedFieldArtinCoordinateBaseFiniteDimensional + +/-- The fixed base field of an Artin coordinate is a number field. -/ +theorem cyclotomicAbstractFixedFieldArtinCoordinateBaseNumberField + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + NumberField + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) := + NumberField.of_module_finite ℚ + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + +attribute [local instance] cyclotomicAbstractFixedFieldArtinCoordinateBaseNumberField + +/-- The rational separable closure is an algebra over the base field of an Artin coordinate. -/ +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateBaseSeparableAlgebra + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + Algebra + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (SeparableClosure ℚ) := + IntermediateField.toAlgebra + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + +/-- The relative cyclotomic field of an Artin coordinate is an algebra over its base field. -/ +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateRelativeAlgebra + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + Algebra + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (cyclotomicAbstractFixedFieldArtinCoordinateRelative H) := + (cyclotomicAbstractFixedFieldArtinCoordinateRelative H).algebra' + +/-- Rational scalars act on the relative coordinate field through its fixed base field. -/ +theorem cyclotomicAbstractFixedFieldArtinCoordinateRelativeScalarTower + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + IsScalarTower ℚ + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (cyclotomicAbstractFixedFieldArtinCoordinateRelative H) := + abstractFixedFieldCyclotomicCompositum_baseScalarTower H + +attribute [local instance] cyclotomicAbstractFixedFieldArtinCoordinateRelativeScalarTower + +/-- The relative cyclotomic coordinate field is abelian Galois over its fixed base field. -/ +theorem cyclotomicAbstractFixedFieldArtinCoordinateRelativeIsAbelianGalois + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + IsAbelianGalois + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (cyclotomicAbstractFixedFieldArtinCoordinateRelative H) := + abstractFixedFieldCyclotomic_isAbelianGalois H + +attribute [local instance] cyclotomicAbstractFixedFieldArtinCoordinateRelativeIsAbelianGalois + +/-- A finite Galois cyclotomic coordinate carries its intermediate-field rational algebra +structure. -/ +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateAlgebra + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Algebra ℚ E := + E.toIntermediateField.algebra' + +/-- Each finite rational cyclotomic coordinate is a number field. -/ +theorem cyclotomicAbstractFixedFieldArtinCoordinateNumberField + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + NumberField E := + NumberField.of_module_finite ℚ E + +attribute [local instance] cyclotomicAbstractFixedFieldArtinCoordinateNumberField + +/-- Each finite rational cyclotomic coordinate is abelian Galois over the rationals. -/ +theorem cyclotomicAbstractFixedFieldArtinCoordinateIsAbelianGalois + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsAbelianGalois ℚ E := + IsAbelianGalois.of_algHom E.toIntermediateField.val + +attribute [local instance] cyclotomicAbstractFixedFieldArtinCoordinateIsAbelianGalois + +/-- Each finite rational cyclotomic coordinate is normal over the rationals. -/ +theorem cyclotomicAbstractFixedFieldArtinCoordinateNormal + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Normal ℚ E := + E.isGalois.to_normal + +attribute [local instance] cyclotomicAbstractFixedFieldArtinCoordinateNormal + +/-- A finite cyclotomic coordinate layer is an algebra over the abstract fixed base field. -/ +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateLayerBaseAlgebra + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Algebra + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) := + (abstractFixedFieldCyclotomicFiniteGaloisLayer H E).algebra' + +/-- A finite cyclotomic coordinate layer carries its rational algebra structure. -/ +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateLayerRatAlgebra + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Algebra ℚ + (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) := + DivisionRing.toRatAlgebra + +/-- Rational scalars act on a finite coordinate layer through the fixed base field. -/ +theorem cyclotomicAbstractFixedFieldArtinCoordinateLayerBaseScalarTower + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsScalarTower ℚ + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) := by + let hI := rationalCyclotomicFieldInertia_le H.field + apply IsScalarTower.of_algebraMap_eq + intro x + apply Subtype.ext + change + algebraMap ℚ + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI) x = + algebraMap + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI) + (algebraMap ℚ + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) x) + exact + IsScalarTower.algebraMap_apply + ℚ + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI) x + +attribute [local instance] cyclotomicAbstractFixedFieldArtinCoordinateLayerBaseScalarTower + +/-- The finite Galois coordinate layer over the fixed base is a number field. -/ +theorem cyclotomicAbstractFixedFieldArtinCoordinateLayerNumberField + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + NumberField + (abstractFixedFieldCyclotomicFiniteGaloisLayer H E) := + abstractFixedFieldCyclotomicFiniteLayer_numberField H E + +attribute [local instance] cyclotomicAbstractFixedFieldArtinCoordinateLayerNumberField + +/-- A finite cyclotomic coordinate layer is an algebra over the chosen cyclotomic field. -/ +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateLayerAlgebra + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Algebra E + (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) := + abstractFixedFieldCyclotomicFiniteLayerLayerAlgebra H E + +/-- The chosen cyclotomic field acts on its finite coordinate layer through the layer algebra. -/ +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateLayerSMul + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + SMul E + (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) := + abstractFixedFieldCyclotomicFiniteLayerLayerSMul H E + +/-- Rational scalars act on a coordinate layer through its finite cyclotomic field. -/ +theorem cyclotomicAbstractFixedFieldArtinCoordinateLayerScalarTower + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsScalarTower ℚ E + (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) := + abstractFixedFieldCyclotomicFiniteLayer_layerScalarTower H E + +attribute [local instance] cyclotomicAbstractFixedFieldArtinCoordinateLayerScalarTower + +/-- The relative cyclotomic field is an algebra over each finite coordinate layer. -/ +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateLayerRelativeAlgebra + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Algebra + (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) + (cyclotomicAbstractFixedFieldArtinCoordinateRelative H) := + IntermediateField.toAlgebra + (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) + +/-- The fixed base acts on the relative coordinate field through each finite coordinate layer. +-/ +theorem cyclotomicAbstractFixedFieldArtinCoordinateLayerRelativeScalarTower + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsScalarTower + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) + (cyclotomicAbstractFixedFieldArtinCoordinateRelative H) := + abstractFixedFieldCyclotomicFiniteGaloisLayer_scalarTower H E + +attribute [local instance] cyclotomicAbstractFixedFieldArtinCoordinateLayerRelativeScalarTower + +/-- Each finite coordinate layer is abelian Galois over the fixed base field. -/ +theorem cyclotomicAbstractFixedFieldArtinCoordinateLayerIsAbelianGalois + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsAbelianGalois + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) := + abstractFixedFieldCyclotomicFiniteLayer_isAbelianGalois H E + +attribute [local instance] cyclotomicAbstractFixedFieldArtinCoordinateLayerIsAbelianGalois + +/-- The full abstract Artin symbol whose finite coordinates are compared +below. Naming this endpoint keeps its relative fixed-field data opaque. -/ +private noncomputable def + cyclotomicAbstractFixedFieldArtinAbstractEndpoint + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (a : IdeleGroup + (cyclotomicAbstractFixedFieldArtinCoordinateBase H)) : + Gal(rationalCyclotomicZHatField/ℚ) := + abstractFixedFieldCyclotomicRestriction H + (infiniteGlobalArtinMonoidHom + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (cyclotomicAbstractFixedFieldArtinCoordinateRelative H) a) + +/-- The rational norm Artin symbol serving as the other full endpoint. -/ +private noncomputable def + cyclotomicAbstractFixedFieldArtinRationalEndpoint + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (a : IdeleGroup + (cyclotomicAbstractFixedFieldArtinCoordinateBase H)) : + Gal(rationalCyclotomicZHatField/ℚ) := + rationalCyclotomicZHatGlobalArtin + (IdeleGroup.norm ℚ + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) a) + +/-- The finite restriction map packaged together with its pointwise Artin +naturality law. The map is inferred from the generic hom-level theorem, so +no concrete instance tower is compared after the opaque boundary. -/ +private noncomputable def cyclotomicAbstractFixedFieldArtinCoordinateMapData + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + {f : Gal(abstractFixedFieldCyclotomicFiniteGaloisLayer H + E/cyclotomicAbstractFixedFieldArtinCoordinateBase H) →* + Gal(E/ℚ) // + f.comp + (@globalArtinMonoidHomOfNumberField + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (abstractFixedFieldCyclotomicFiniteGaloisLayer H E) + (inferInstance : Field + (cyclotomicAbstractFixedFieldArtinCoordinateBase H)) + (cyclotomicAbstractFixedFieldArtinCoordinateBaseNumberField H) + (inferInstance : Field + (abstractFixedFieldCyclotomicFiniteGaloisLayer H E)) + (cyclotomicAbstractFixedFieldArtinCoordinateLayerBaseAlgebra H E) + (cyclotomicAbstractFixedFieldArtinCoordinateLayerIsAbelianGalois H E) + (cyclotomicAbstractFixedFieldArtinCoordinateLayerNumberField H E)) = + (globalArtinMonoidHom (K := ℚ) (L := E)).comp + (IdeleGroup.norm ℚ + (cyclotomicAbstractFixedFieldArtinCoordinateBase H))} := by + have hnat := + @globalArtinMonoidHomOfNumberField_norm_restriction + ℚ E + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (abstractFixedFieldCyclotomicFiniteGaloisLayer H E) + inferInstance inferInstance + inferInstance + (cyclotomicAbstractFixedFieldArtinCoordinateNumberField E) + (cyclotomicAbstractFixedFieldArtinCoordinateAlgebra E) + (cyclotomicAbstractFixedFieldArtinCoordinateIsAbelianGalois E) + inferInstance + (cyclotomicAbstractFixedFieldArtinCoordinateBaseNumberField H) + inferInstance + (cyclotomicAbstractFixedFieldArtinCoordinateBaseAlgebra H) + (cyclotomicAbstractFixedFieldArtinCoordinateLayerBaseAlgebra H E) + (cyclotomicAbstractFixedFieldArtinCoordinateLayerRatAlgebra H E) + (cyclotomicAbstractFixedFieldArtinCoordinateLayerBaseScalarTower H E) + (cyclotomicAbstractFixedFieldArtinCoordinateLayerAlgebra H E) + (cyclotomicAbstractFixedFieldArtinCoordinateLayerScalarTower H E) + (cyclotomicAbstractFixedFieldArtinCoordinateLayerIsAbelianGalois H E) + (cyclotomicAbstractFixedFieldArtinCoordinateLayerNumberField H E) + exact + ⟨(@AlgEquiv.restrictNormalHom + ℚ inferInstance + (abstractFixedFieldCyclotomicFiniteGaloisLayer H E) + inferInstance + (cyclotomicAbstractFixedFieldArtinCoordinateLayerRatAlgebra H E) + E inferInstance + (cyclotomicAbstractFixedFieldArtinCoordinateAlgebra E) + (cyclotomicAbstractFixedFieldArtinCoordinateLayerAlgebra H E) + (cyclotomicAbstractFixedFieldArtinCoordinateLayerScalarTower H E) + (cyclotomicAbstractFixedFieldArtinCoordinateNormal E)).comp + (@AlgEquiv.restrictScalarsHom + ℚ + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (abstractFixedFieldCyclotomicFiniteGaloisLayer H E) + inferInstance inferInstance inferInstance + (cyclotomicAbstractFixedFieldArtinCoordinateBaseAlgebra H) + (cyclotomicAbstractFixedFieldArtinCoordinateLayerBaseAlgebra H E) + (cyclotomicAbstractFixedFieldArtinCoordinateLayerRatAlgebra H E) + (cyclotomicAbstractFixedFieldArtinCoordinateLayerBaseScalarTower H E)), + hnat⟩ + +/-- The fixed restriction map from the relative finite layer to one rational +cyclotomic coordinate. -/ +private noncomputable def cyclotomicAbstractFixedFieldArtinCoordinateMap + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Gal(abstractFixedFieldCyclotomicFiniteGaloisLayer H + E/cyclotomicAbstractFixedFieldArtinCoordinateBase H) →* + Gal(E/ℚ) := + (cyclotomicAbstractFixedFieldArtinCoordinateMapData H E).1 + +/-- Naturality of the named coordinate map, kept at the hom level so later +pointwise rewrites match the opaque map without unfolding its data package. -/ +private theorem cyclotomicAbstractFixedFieldArtinCoordinateMap_naturality + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + (cyclotomicAbstractFixedFieldArtinCoordinateMap H E).comp + (globalArtinMonoidHom + (K := cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (L := abstractFixedFieldCyclotomicFiniteGaloisLayer H E)) = + (globalArtinMonoidHom (K := ℚ) (L := E)).comp + (IdeleGroup.norm ℚ + (cyclotomicAbstractFixedFieldArtinCoordinateBase H)) := + (cyclotomicAbstractFixedFieldArtinCoordinateMapData H E).2 + +/-- Pointwise identification of the named coordinate map with the concrete +two-stage restriction used by the abstract fixed-field comparison. -/ +private theorem cyclotomicAbstractFixedFieldArtinCoordinateMap_apply + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) + (σ : Gal(abstractFixedFieldCyclotomicFiniteGaloisLayer H + E/cyclotomicAbstractFixedFieldArtinCoordinateBase H)) : + cyclotomicAbstractFixedFieldArtinCoordinateMap H E σ = + @IntermediateField.restrictRestrictAlgEquivMapHom + ℚ E + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (abstractFixedFieldCyclotomicFiniteGaloisLayer H E) + inferInstance inferInstance inferInstance inferInstance + (cyclotomicAbstractFixedFieldArtinCoordinateAlgebra E) + (cyclotomicAbstractFixedFieldArtinCoordinateBaseAlgebra H) + (cyclotomicAbstractFixedFieldArtinCoordinateLayerRatAlgebra H E) + (cyclotomicAbstractFixedFieldArtinCoordinateLayerAlgebra H E) + (cyclotomicAbstractFixedFieldArtinCoordinateLayerBaseAlgebra H E) + (cyclotomicAbstractFixedFieldArtinCoordinateLayerScalarTower H E) + (cyclotomicAbstractFixedFieldArtinCoordinateLayerBaseScalarTower H E) + (cyclotomicAbstractFixedFieldArtinCoordinateNormal E) σ := + rfl + +/-- The relative projection, common rational finite value, and rational +infinite projection, with both comparison steps packaged by the generic +provider before this concrete tower becomes opaque. -/ +private noncomputable def + cyclotomicAbstractFixedFieldArtinCoordinateBridgeData + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (a : IdeleGroup + (cyclotomicAbstractFixedFieldArtinCoordinateBase H)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) := + @compRestrictNormalHomInfiniteGlobalArtinRationalCyclotomicDataOfNumberField + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (cyclotomicAbstractFixedFieldArtinCoordinateRelative H) + (inferInstance : Field + (cyclotomicAbstractFixedFieldArtinCoordinateBase H)) + (cyclotomicAbstractFixedFieldArtinCoordinateBaseNumberField H) + (inferInstance : Field + (cyclotomicAbstractFixedFieldArtinCoordinateRelative H)) + (cyclotomicAbstractFixedFieldArtinCoordinateRelativeAlgebra H) + (cyclotomicAbstractFixedFieldArtinCoordinateRelativeIsAbelianGalois H) + a + (abstractFixedFieldCyclotomicFiniteGaloisLayer H E) + (cyclotomicAbstractFixedFieldArtinCoordinateLayerNumberField H E) + E + (cyclotomicAbstractFixedFieldArtinCoordinateNumberField E) + (cyclotomicAbstractFixedFieldArtinCoordinateIsAbelianGalois E) + (cyclotomicAbstractFixedFieldArtinCoordinateMap H E) + (cyclotomicAbstractFixedFieldArtinCoordinateMap_naturality H E) + +/-- The abstract endpoint after projection to one finite coordinate. -/ +private noncomputable def + cyclotomicAbstractFixedFieldArtinAbstractCoordinate + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (a : IdeleGroup + (cyclotomicAbstractFixedFieldArtinCoordinateBase H)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Gal(E/ℚ) := + AlgEquiv.restrictNormalHom E + (cyclotomicAbstractFixedFieldArtinAbstractEndpoint H a) + +/-- The relative infinite Artin symbol, restricted to a finite layer and +then mapped to the corresponding rational coordinate. -/ +private noncomputable def + cyclotomicAbstractFixedFieldArtinRestrictedLayerCoordinate + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (a : IdeleGroup + (cyclotomicAbstractFixedFieldArtinCoordinateBase H)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Gal(E/ℚ) := + (cyclotomicAbstractFixedFieldArtinCoordinateBridgeData H a E).1.1 + +/-- The finite relative Artin symbol mapped to one rational coordinate. -/ +private noncomputable def + cyclotomicAbstractFixedFieldArtinFiniteCoordinate + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (a : IdeleGroup + (cyclotomicAbstractFixedFieldArtinCoordinateBase H)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Gal(E/ℚ) := + (cyclotomicAbstractFixedFieldArtinCoordinateBridgeData H a E).1.2.1 + +/-- The finite rational Artin coordinate of the idele norm. -/ +private noncomputable def + cyclotomicAbstractFixedFieldArtinRationalCoordinate + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (a : IdeleGroup + (cyclotomicAbstractFixedFieldArtinCoordinateBase H)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Gal(E/ℚ) := + (cyclotomicAbstractFixedFieldArtinCoordinateBridgeData H a E).1.2.1 + +/-- Naturality of the finite global Artin map at the concrete cyclotomic +coordinate. -/ +private theorem + cyclotomicAbstractFixedFieldArtinCoordinateNaturality + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (a : IdeleGroup + (cyclotomicAbstractFixedFieldArtinCoordinateBase H)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + cyclotomicAbstractFixedFieldArtinFiniteCoordinate H a E = + cyclotomicAbstractFixedFieldArtinRationalCoordinate H a E := by + rfl + +/-- The rational endpoint after projection to one finite coordinate. -/ +private noncomputable def + cyclotomicAbstractFixedFieldArtinRationalEndpointCoordinate + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (a : IdeleGroup + (cyclotomicAbstractFixedFieldArtinCoordinateBase H)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Gal(E/ℚ) := + (cyclotomicAbstractFixedFieldArtinCoordinateBridgeData H a E).1.2.2 + +/-- The abstract restriction map projected to the concrete finite layer. -/ +private theorem + cyclotomicAbstractFixedFieldArtinCoordinateRestriction + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (a : IdeleGroup + (cyclotomicAbstractFixedFieldArtinCoordinateBase H)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + cyclotomicAbstractFixedFieldArtinAbstractCoordinate H a E = + cyclotomicAbstractFixedFieldArtinRestrictedLayerCoordinate H a E := by + calc + cyclotomicAbstractFixedFieldArtinAbstractCoordinate H a E = + AlgEquiv.restrictNormalHom E + (cyclotomicAbstractFixedFieldArtinAbstractEndpoint H a) := rfl + _ = cyclotomicAbstractFixedFieldArtinCoordinateMap H E + (AlgEquiv.restrictNormalHom + (abstractFixedFieldCyclotomicFiniteGaloisLayer H E) + (infiniteGlobalArtinMonoidHom + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (cyclotomicAbstractFixedFieldArtinCoordinateRelative H) a)) := + (restrictNormalHom_abstractFixedFieldCyclotomicRestriction + H E + (infiniteGlobalArtinMonoidHom + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (cyclotomicAbstractFixedFieldArtinCoordinateRelative H) a)).trans + (cyclotomicAbstractFixedFieldArtinCoordinateMap_apply H E _).symm + _ = cyclotomicAbstractFixedFieldArtinRestrictedLayerCoordinate H a E := rfl + +/-- Restricting the infinite relative Artin symbol supplies exactly the +finite Artin coordinate. -/ +private theorem + cyclotomicAbstractFixedFieldArtinCoordinateLayerProjection + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (a : IdeleGroup + (cyclotomicAbstractFixedFieldArtinCoordinateBase H)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + cyclotomicAbstractFixedFieldArtinRestrictedLayerCoordinate H a E = + cyclotomicAbstractFixedFieldArtinFiniteCoordinate H a E := + (cyclotomicAbstractFixedFieldArtinCoordinateBridgeData H a E).2.1 + +/-- The rational cyclotomic Artin map projected to the same finite +coordinate. -/ +private theorem + cyclotomicAbstractFixedFieldArtinCoordinateRationalProjection + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (a : IdeleGroup + (cyclotomicAbstractFixedFieldArtinCoordinateBase H)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + cyclotomicAbstractFixedFieldArtinRationalEndpointCoordinate H a E = + cyclotomicAbstractFixedFieldArtinFiniteCoordinate H a E := by + exact + (cyclotomicAbstractFixedFieldArtinCoordinateBridgeData H a E).2.2.symm + +/-- Equality of the two full endpoints at one opaque finite coordinate. -/ +private theorem + cyclotomicAbstractFixedFieldArtinFiniteCoordinateComparison + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (a : IdeleGroup + (cyclotomicAbstractFixedFieldArtinCoordinateBase H)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + AlgEquiv.restrictNormalHom E + (cyclotomicAbstractFixedFieldArtinAbstractEndpoint H a) = + AlgEquiv.restrictNormalHom E + (cyclotomicAbstractFixedFieldArtinRationalEndpoint H a) := by + change + cyclotomicAbstractFixedFieldArtinAbstractCoordinate H a E = + cyclotomicAbstractFixedFieldArtinRationalEndpointCoordinate H a E + exact + cyclotomicAbstractFixedFieldArtin_eqTransThree + (cyclotomicAbstractFixedFieldArtinCoordinateRestriction H a E) + (cyclotomicAbstractFixedFieldArtinCoordinateLayerProjection H a E) + (cyclotomicAbstractFixedFieldArtinCoordinateRationalProjection + H a E).symm + +/-- The finite-coordinate comparison assembled in the rational cyclotomic +inverse limit. -/ +private theorem + abstractFixedFieldCyclotomicRestriction_infiniteGlobalArtin_inverseLimit + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (a : + IdeleGroup + (cyclotomicAbstractFixedFieldArtinCoordinateBase H)) : + cyclotomicAbstractFixedFieldArtinAbstractEndpoint H a = + cyclotomicAbstractFixedFieldArtinRationalEndpoint H a := by + apply + (InfiniteGalois.continuousMulEquivToLimit + ℚ rationalCyclotomicZHatField).injective + apply Subtype.ext + funext Eop + exact + cyclotomicAbstractFixedFieldArtinFiniteCoordinateComparison + H a Eop.unop + +end FiniteCoordinateHelpers + +/-- The actual infinite global Artin map on an abstract fixed field +restricts to the rational cyclotomic Artin map of the ordinary idele +norm. -/ +@[simp] +theorem + abstractFixedFieldCyclotomicRestriction_infiniteGlobalArtinMonoidHom + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (a : + IdeleGroup + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field)) : + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + letI : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + letI : NumberField F := + NumberField.of_module_finite ℚ F + let hI := + rationalCyclotomicFieldInertia_le H.field + let U := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI + letI : IsAbelianGalois F U := + abstractFixedFieldCyclotomic_isAbelianGalois H + abstractFixedFieldCyclotomicRestriction H + (infiniteGlobalArtinMonoidHom F U a) = + rationalCyclotomicZHatGlobalArtin + (IdeleGroup.norm ℚ F a) := by + exact + abstractFixedFieldCyclotomicRestriction_infiniteGlobalArtin_inverseLimit + H a + +/-- In the normalized actual Galois coordinate, the infinite global +Artin symbol is exactly the normalized cyclotomic idele value. -/ +theorem + abstractFixedFieldCyclotomicGalEquivZHat_infiniteGlobalArtinMonoidHom + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (a : + IdeleGroup + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field)) : + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + letI : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + letI : NumberField F := + NumberField.of_module_finite ℚ F + let hI := + rationalCyclotomicFieldInertia_le H.field + let U := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI + letI : IsAbelianGalois F U := + abstractFixedFieldCyclotomic_isAbelianGalois H + Multiplicative.toAdd + (abstractFixedFieldCyclotomicGalEquivZHat H + (infiniteGlobalArtinMonoidHom F U a)) = + normalizedCyclotomicZHatIdeleValue F + (Additive.ofMul a) := by + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + let : NumberField F := + NumberField.of_module_finite ℚ F + let hI := + rationalCyclotomicFieldInertia_le H.field + let U := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI + let : IsAbelianGalois F U := + abstractFixedFieldCyclotomic_isAbelianGalois H + apply + zHatMulNat_injective + (H.residueDegree rationalCyclotomicDegreeData).pos + calc + (H.residueDegree rationalCyclotomicDegreeData : ℕ) • + Multiplicative.toAdd + (abstractFixedFieldCyclotomicGalEquivZHat H + (infiniteGlobalArtinMonoidHom F U a)) = + Multiplicative.toAdd + (rationalCyclotomicZHatFieldGalEquivZHat + (abstractFixedFieldCyclotomicRestriction H + (infiniteGlobalArtinMonoidHom F U a))) := by + exact + (abstractFixedFieldCyclotomicRestriction_coordinate H + (infiniteGlobalArtinMonoidHom F U a)).symm + _ = + Multiplicative.toAdd + (rationalCyclotomicZHatFieldGalEquivZHat + (rationalCyclotomicZHatGlobalArtin + (IdeleGroup.norm ℚ F a))) := by + rw [ + abstractFixedFieldCyclotomicRestriction_infiniteGlobalArtinMonoidHom] + _ = + cyclotomicZHatNormComposite F + (Additive.ofMul a) := by + rfl + _ = + cyclotomicZHatIntersectionDegree F • + normalizedCyclotomicZHatIdeleValue F + (Additive.ofMul a) := by + exact + (cyclotomicZHatIntersectionDegree_nsmul_normalizedIdeleValue + F (Additive.ofMul a)).symm + _ = + (H.residueDegree rationalCyclotomicDegreeData : ℕ) • + normalizedCyclotomicZHatIdeleValue F + (Additive.ofMul a) := by + rw [ + cyclotomicZHatIntersectionDegree_abstractFixedField_eq_residueDegree + H] + +/-- Representative form of the actual cyclotomic Artin-coordinate +identity after descent of the normalized value to the idele class +group. -/ +theorem + abstractFixedFieldCyclotomicGalEquivZHat_infiniteGlobalArtinMonoidHom_mk + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (a : + IdeleGroup + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field)) : + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + letI : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + letI : NumberField F := + NumberField.of_module_finite ℚ F + let hI := + rationalCyclotomicFieldInertia_le H.field + let U := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI + letI : IsAbelianGalois F U := + abstractFixedFieldCyclotomic_isAbelianGalois H + Multiplicative.toAdd + (abstractFixedFieldCyclotomicGalEquivZHat H + (infiniteGlobalArtinMonoidHom F U a)) = + normalizedCyclotomicZHatIdeleClassValueContinuous F + (Additive.ofMul + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup F) a)) := by + have hSeparableClosureAlgebra : + cyclotomicAbstractFixedFieldArtinSeparableClosureAlgebra = + rationalSeparableClosureAlgebra := + Subsingleton.elim _ _ + cases hSeparableClosureAlgebra + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let hI := + rationalCyclotomicFieldInertia_le H.field + let U := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI + let : IsAbelianGalois F U := + abstractFixedFieldCyclotomic_isAbelianGalois H + calc + Multiplicative.toAdd + (abstractFixedFieldCyclotomicGalEquivZHat H + (infiniteGlobalArtinMonoidHom F U a)) = + normalizedCyclotomicZHatIdeleValue F + (Additive.ofMul a) := + abstractFixedFieldCyclotomicGalEquivZHat_infiniteGlobalArtinMonoidHom + H a + _ = + normalizedCyclotomicZHatIdeleClassValueContinuous F + (Additive.ofMul + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup F) a)) := + (normalizedCyclotomicZHatIdeleClassValueContinuous_mk + (K := F) a).symm + +/-- The genuine infinite global Artin symbol of the cyclotomic +maximal-unramified extension kills every principal idele of the +abstract fixed field. -/ +theorem + infiniteGlobalArtinMonoidHom_abstractFixedFieldCyclotomic_principalIdele + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (x : + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field)ˣ) : + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + letI : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + letI : NumberField F := + NumberField.of_module_finite ℚ F + let hI := + rationalCyclotomicFieldInertia_le H.field + let U := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI + letI : IsAbelianGalois F U := + abstractFixedFieldCyclotomic_isAbelianGalois H + infiniteGlobalArtinMonoidHom F U + (IdeleGroup.principalIdele F x) = + 1 := by + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + let : NumberField F := + NumberField.of_module_finite ℚ F + let hI := + rationalCyclotomicFieldInertia_le H.field + let U := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI + let : IsAbelianGalois F U := + abstractFixedFieldCyclotomic_isAbelianGalois H + have hcoord : + Multiplicative.toAdd + (abstractFixedFieldCyclotomicGalEquivZHat H + (infiniteGlobalArtinMonoidHom F U + (IdeleGroup.principalIdele F x))) = 0 := + (abstractFixedFieldCyclotomicGalEquivZHat_infiniteGlobalArtinMonoidHom + H (IdeleGroup.principalIdele F x)).trans + (normalizedCyclotomicZHatIdeleValue_principalIdele_eq_zero F x) + apply (abstractFixedFieldCyclotomicGalEquivZHat H).injective + rw [map_one] + apply Multiplicative.ext + exact hcoord.trans toAdd_one.symm + +/-- The genuine cyclotomic maximal-unramified Artin map descended to +the idele class group of an abstract fixed field. -/ +noncomputable def abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + IdeleClassGroup + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) →* + Gal(LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) := by + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + letI : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + letI : NumberField F := + NumberField.of_module_finite ℚ F + let hI := + rationalCyclotomicFieldInertia_le H.field + let U := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI + letI : IsAbelianGalois F U := + abstractFixedFieldCyclotomic_isAbelianGalois H + exact + QuotientGroup.lift + (IdeleGroup.principalSubgroup F) + (infiniteGlobalArtinMonoidHom F U).toMonoidHom + (by + rintro _ ⟨x, rfl⟩ + exact + infiniteGlobalArtinMonoidHom_abstractFixedFieldCyclotomic_principalIdele + H x) + +/-- Evaluation of the descended maximal-unramified Artin map on an +idele representative. -/ +theorem abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom_mk + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (a : + IdeleGroup + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field)) : + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + letI : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + letI : NumberField F := + NumberField.of_module_finite ℚ F + let hI := + rationalCyclotomicFieldInertia_le H.field + let U := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI + letI : IsAbelianGalois F U := + abstractFixedFieldCyclotomic_isAbelianGalois H + abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom H + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup F) a) = + infiniteGlobalArtinMonoidHom F U a := by + rw [abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom] + exact QuotientGroup.lift_mk _ _ _ + +/-- The descended genuine maximal-unramified Artin map is precisely +the normalized cyclotomic idele-class value in the actual Galois +coordinate. -/ +theorem + abstractFixedFieldCyclotomicGalEquivZHat_ideleClassArtinMonoidHom + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (c : + IdeleClassGroup + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field)) : + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + letI : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + letI : NumberField F := + NumberField.of_module_finite ℚ F + abstractFixedFieldCyclotomicGalEquivZHat H + (abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom H c) = + normalizedCyclotomicZHatIdeleClassValueContinuousMul F c := by + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + let : NumberField F := + NumberField.of_module_finite ℚ F + have hSeparableClosureAlgebra : + cyclotomicAbstractFixedFieldArtinSeparableClosureAlgebra = + rationalSeparableClosureAlgebra := + Subsingleton.elim _ _ + cases hSeparableClosureAlgebra + refine Quotient.inductionOn' c ?_ + intro a + let hI := + rationalCyclotomicFieldInertia_le H.field + let U := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI + let : IsAbelianGalois F U := + abstractFixedFieldCyclotomic_isAbelianGalois H + calc + abstractFixedFieldCyclotomicGalEquivZHat H + (abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom H + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup F) a)) = + abstractFixedFieldCyclotomicGalEquivZHat H + (infiniteGlobalArtinMonoidHom F U a) := + congrArg (abstractFixedFieldCyclotomicGalEquivZHat H) + (abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom_mk H a) + _ = + normalizedCyclotomicZHatIdeleClassValueContinuousMul F + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup F) a) := by + apply Multiplicative.ext + exact + abstractFixedFieldCyclotomicGalEquivZHat_infiniteGlobalArtinMonoidHom_mk + H a + +/-- The genuine chosen-local-factor Artin map to the cyclotomic +maximal-unramified extension is the abstract maximal-unramified +norm-residue symbol. Both sides are characterized here by their +common normalized valuation coordinate, so no finite reciprocity +comparison is assumed. -/ +theorem + abstractFixedFieldCyclotomicIdeleClassArtin_eq_maximalUnramifiedNormResidue + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (a : + ambientFixedAddSubgroup + rationalIdeleClassRepresentation H.field) : + let hI := + rationalCyclotomicFieldInertia_le H.field + let hnormal : + (CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI).Normal := by + rw [extensionSubgroup_rationalCyclotomicFieldInertia] + infer_instance + let qInertia : + H.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI ≃* + H.field.toSubgroup ⧸ + rationalCyclotomicDegreeData.fieldInertiaWithin H.field := + QuotientGroup.quotientMulEquivOfEq + (extensionSubgroup_rationalCyclotomicFieldInertia H.field) + abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom H + (Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed H.field + (hfinite := H.finite)).symm + a)) = + LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI hnormal + (qInertia.symm + (ValuationData.maximalUnramifiedNormResidueSymbol + rationalCyclotomicIdeleClassValuationData H a).toMul) := by + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + let : NumberField F := + NumberField.of_module_finite ℚ F + let hI := + rationalCyclotomicFieldInertia_le H.field + let hnormal : + (CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI).Normal := by + rw [extensionSubgroup_rationalCyclotomicFieldInertia] + infer_instance + let qInertia : + H.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI ≃* + H.field.toSubgroup ⧸ + rationalCyclotomicDegreeData.fieldInertiaWithin H.field := + QuotientGroup.quotientMulEquivOfEq + (extensionSubgroup_rationalCyclotomicFieldInertia H.field) + let c : IdeleClassGroup F := + Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed H.field + (hfinite := H.finite)).symm a) + have hvaluation : + ((rationalCyclotomicIdeleClassValuationData.valuationAt H a : + rationalCyclotomicIdeleClassValuationData.valueGroup) : ZHat) = + normalizedCyclotomicZHatIdeleClassValueContinuous F + (Additive.ofMul c) := by + simpa only [c, ofMul_toMul, + (rationalAbstractFixedFieldIdeleClassEquivFixed H.field + (hfinite := H.finite)).apply_symm_apply] using + (rationalCyclotomicIdeleClassValuationData_valuationAt_fixed_apply + H + ((rationalAbstractFixedFieldIdeleClassEquivFixed H.field + (hfinite := H.finite)).symm a)) + have hleft : + Multiplicative.toAdd + (abstractFixedFieldCyclotomicGalEquivZHat H + (abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom H c)) = + normalizedCyclotomicZHatIdeleClassValueContinuous F + (Additive.ofMul c) := + congrArg Multiplicative.toAdd + (abstractFixedFieldCyclotomicGalEquivZHat_ideleClassArtinMonoidHom H c) + have hright : + ((rationalCyclotomicIdeleClassValuationData.valuationAt H a : + rationalCyclotomicIdeleClassValuationData.valueGroup) : ZHat) = + Multiplicative.toAdd + (abstractFixedFieldCyclotomicGalEquivZHat H + (LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI hnormal + (qInertia.symm + (ValuationData.maximalUnramifiedNormResidueSymbol + rationalCyclotomicIdeleClassValuationData H a).toMul))) := by + rw [abstractFixedFieldCyclotomicGalEquivZHat_quotientClass] + exact + (ValuationData.maximalUnramifiedNormResidue_degree + rationalCyclotomicIdeleClassValuationData H a).symm + apply (abstractFixedFieldCyclotomicGalEquivZHat H).injective + apply Multiplicative.ext + exact hleft.trans (hvaluation.symm.trans hright) + +/-- A prime idele class has genuine maximal-unramified Artin symbol +equal to the arithmetic Frobenius of its abstract fixed field. -/ +theorem + abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom_prime + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (π : + ambientFixedAddSubgroup + rationalIdeleClassRepresentation H.field) + (hπ : + rationalCyclotomicIdeleClassValuationData.IsPrimeElement H π) : + let hI := + rationalCyclotomicFieldInertia_le H.field + let hnormal : + (CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI).Normal := by + rw [extensionSubgroup_rationalCyclotomicFieldInertia] + infer_instance + let qInertia : + H.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI ≃* + H.field.toSubgroup ⧸ + rationalCyclotomicDegreeData.fieldInertiaWithin H.field := + QuotientGroup.quotientMulEquivOfEq + (extensionSubgroup_rationalCyclotomicFieldInertia H.field) + abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom H + (Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed H.field + (hfinite := H.finite)).symm + π)) = + LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI hnormal + (qInertia.symm + (rationalCyclotomicDegreeData.frobenius + (H.toFiniteResidueAbstractField + rationalCyclotomicDegreeData))) := by + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + let : NumberField F := + NumberField.of_module_finite ℚ F + let hI := + rationalCyclotomicFieldInertia_le H.field + let hnormal : + (CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI).Normal := by + rw [extensionSubgroup_rationalCyclotomicFieldInertia] + infer_instance + let qInertia : + H.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI ≃* + H.field.toSubgroup ⧸ + rationalCyclotomicDegreeData.fieldInertiaWithin H.field := + QuotientGroup.quotientMulEquivOfEq + (extensionSubgroup_rationalCyclotomicFieldInertia H.field) + let c : + IdeleClassGroup F := + Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed H.field + (hfinite := H.finite)).symm π) + have hvalue : + normalizedCyclotomicZHatIdeleClassValueContinuous F + ((rationalAbstractFixedFieldIdeleClassEquivFixed H.field + (hfinite := H.finite)).symm + π) = + 1 := by + calc + normalizedCyclotomicZHatIdeleClassValueContinuous F + ((rationalAbstractFixedFieldIdeleClassEquivFixed H.field + (hfinite := H.finite)).symm + π) = + ((rationalCyclotomicIdeleClassValuationData.valuationAt H + (rationalAbstractFixedFieldIdeleClassEquivFixed H.field + (hfinite := H.finite) + ((rationalAbstractFixedFieldIdeleClassEquivFixed H.field + (hfinite := H.finite)).symm + π)) : + rationalCyclotomicIdeleClassValuationData.valueGroup) : + ZHat) := by + exact + (rationalCyclotomicIdeleClassValuationData_valuationAt_fixed_apply + H + ((rationalAbstractFixedFieldIdeleClassEquivFixed H.field + (hfinite := H.finite)).symm + π)).symm + _ = + ((rationalCyclotomicIdeleClassValuationData.oneValue : + rationalCyclotomicIdeleClassValuationData.valueGroup) : + ZHat) := by + rw [(rationalAbstractFixedFieldIdeleClassEquivFixed H.field + (hfinite := H.finite)).apply_symm_apply] + exact congrArg Subtype.val hπ + _ = 1 := + rationalCyclotomicIdeleClassValuationData.oneValue_coe + apply (abstractFixedFieldCyclotomicGalEquivZHat H).injective + calc + abstractFixedFieldCyclotomicGalEquivZHat H + (abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom H c) = + normalizedCyclotomicZHatIdeleClassValueContinuousMul F c := + abstractFixedFieldCyclotomicGalEquivZHat_ideleClassArtinMonoidHom + H c + _ = Multiplicative.ofAdd (1 : ZHat) := by + apply Multiplicative.ext + exact hvalue + _ = + abstractFixedFieldCyclotomicGalEquivZHat H + (LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI hnormal + (qInertia.symm + (rationalCyclotomicDegreeData.frobenius + (H.toFiniteResidueAbstractField + rationalCyclotomicDegreeData)))) := by + rw [ + abstractFixedFieldCyclotomicGalEquivZHat_quotientClass, + rationalCyclotomicDegreeData.maximalUnramifiedDegreeEquiv_frobenius] + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean new file mode 100644 index 0000000000..177cd58d89 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean @@ -0,0 +1,1173 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValueTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicZHatBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormOneCompact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.IdeleClassNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Valuation +/-! +# The cyclotomic valuation on idele classes + +The cyclotomic idele value is trivial on principal ideles, so it descends +to the ordinary idele class group. Its restriction to the compact +norm-one idele class group still has dense image in `ZHat`; compactness +therefore upgrades density to surjectivity. + +For a number field `K`, the defining normalization gives the exact +identity + +`f_K v_K(c) = v_ℚ(N_{K/ℚ} c)`. + +Surjectivity of `v_K` then identifies the image of the actual +idele-class norm with `f_K ZHat`. For the actual fixed field attached +to a finite abstract field, the already constructed cyclotomic +base-change theorem identifies `f_K` with the residue degree. This +supplies the norm-range field of the concrete henselian valuation data. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open KummerTheory + +/-- Fix the canonical source-group dictionary before constructing the value maps +and their additive ranges. -/ +@[instance_reducible] +private noncomputable def cyclotomicValuationIdeleClassCommGroup + (F : Type) [Field F] [NumberField F] : + CommGroup (IdeleClassGroup F) := + QuotientGroup.Quotient.commGroup (IdeleGroup.principalSubgroup F) + +attribute [local instance] cyclotomicValuationIdeleClassCommGroup + +/-- Lift a continuous multiplicative map through a quotient group once its +defining normal subgroup is contained in the kernel. Keeping the quotient-map +argument here avoids repeating the same large continuity elaboration for the +rational and number-field cyclotomic values. -/ +noncomputable def ideleClassContinuousQuotientLift + {A B : Type*} [Group A] [TopologicalSpace A] + [Group B] [TopologicalSpace B] + (N : Subgroup A) [N.Normal] (f : A →ₜ* B) + (hN : N ≤ f.toMonoidHom.ker) : (A ⧸ N) →ₜ* B := by + let φ : (A ⧸ N) →* B := QuotientGroup.lift N f.toMonoidHom hN + have hcomp : + Continuous (fun a : A => φ (QuotientGroup.mk' N a)) := by + refine f.continuous_toFun.congr (fun a => ?_) + change f.toMonoidHom a = φ (QuotientGroup.mk' N a) + exact (QuotientGroup.lift_mk N hN a).symm + exact + { toMonoidHom := φ + continuous_toFun := + (QuotientGroup.isQuotientMap_mk + (G := A) (N := N)).continuous_iff.2 hcomp } + +private theorem ideleClassContinuousQuotientLift_mk + {A B : Type*} [Group A] [TopologicalSpace A] + [Group B] [TopologicalSpace B] + (N : Subgroup A) [N.Normal] (f : A →ₜ* B) + (hN : N ≤ f.toMonoidHom.ker) (a : A) : + ideleClassContinuousQuotientLift N f hN + (QuotientGroup.mk' N a) = + f a := by + change QuotientGroup.lift N f.toMonoidHom hN + (QuotientGroup.mk' N a) = f a + exact QuotientGroup.lift_mk N hN a + +/-- Principal rational ideles lie in the kernel of the cyclotomic value. -/ +private theorem rationalCyclotomicZHatIdeleValue_principalSubgroup_le_ker : + IdeleGroup.principalSubgroup ℚ ≤ + rationalCyclotomicZHatIdeleValue.toMonoidHom.ker := by + rintro _ ⟨x, rfl⟩ + exact rationalCyclotomicZHatIdeleValue_principalIdele_eq_one x + +/-- The rational cyclotomic value descended continuously through +`C_ℚ = I_ℚ / ℚˣ`. -/ +noncomputable def rationalCyclotomicZHatIdeleClassValueContinuousMul : + IdeleClassGroup ℚ →ₜ* Multiplicative ZHat := + ideleClassContinuousQuotientLift + (IdeleGroup.principalSubgroup ℚ) + rationalCyclotomicZHatIdeleValue + rationalCyclotomicZHatIdeleValue_principalSubgroup_le_ker + +/-- Evaluation of the descended rational value on an idele class +represented by an idele. -/ +theorem rationalCyclotomicZHatIdeleClassValueContinuousMul_mk + (a : IdeleGroup ℚ) : + rationalCyclotomicZHatIdeleClassValueContinuousMul + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup ℚ) a) = + rationalCyclotomicZHatIdeleValue a := + ideleClassContinuousQuotientLift_mk + (IdeleGroup.principalSubgroup ℚ) + rationalCyclotomicZHatIdeleValue + rationalCyclotomicZHatIdeleValue_principalSubgroup_le_ker a + +/-- The rational cyclotomic value on idele classes, in continuous +additive notation. -/ +noncomputable def rationalCyclotomicZHatIdeleClassValueContinuous : + Additive (IdeleClassGroup ℚ) →ₜ+ ZHat where + __ := MonoidHom.toAdditiveLeft + rationalCyclotomicZHatIdeleClassValueContinuousMul.toMonoidHom + continuous_toFun := continuous_toAdd.comp + (rationalCyclotomicZHatIdeleClassValueContinuousMul.continuous_toFun.comp + continuous_toMul) + +/-- Evaluation of the additive rational class value on a representative. -/ +theorem rationalCyclotomicZHatIdeleClassValueContinuous_mk + (a : IdeleGroup ℚ) : + rationalCyclotomicZHatIdeleClassValueContinuous + (Additive.ofMul + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup ℚ) a)) = + Multiplicative.toAdd + (rationalCyclotomicZHatIdeleValue a) := by + change + Multiplicative.toAdd + (rationalCyclotomicZHatIdeleClassValueContinuousMul + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup ℚ) a)) = + Multiplicative.toAdd + (rationalCyclotomicZHatIdeleValue a) + rw [rationalCyclotomicZHatIdeleClassValueContinuousMul_mk] + +variable (K : Type) [Field K] [NumberField K] + +/-- Principal ideles lie in the kernel of the normalized cyclotomic value. -/ +private theorem + normalizedCyclotomicZHatIdeleValue_principalSubgroup_le_ker : + IdeleGroup.principalSubgroup K ≤ + (normalizedCyclotomicZHatIdeleValueContinuousMul K).toMonoidHom.ker := by + rintro _ ⟨x, rfl⟩ + change + normalizedCyclotomicZHatIdeleValue K + (Additive.ofMul (IdeleGroup.principalIdele K x)) = + 0 + exact normalizedCyclotomicZHatIdeleValue_principalIdele_eq_zero K x + +/-- The normalized cyclotomic value descended continuously through +`C_K = I_K / Kˣ`. -/ +noncomputable def normalizedCyclotomicZHatIdeleClassValueContinuousMul : + IdeleClassGroup K →ₜ* Multiplicative ZHat := + ideleClassContinuousQuotientLift + (IdeleGroup.principalSubgroup K) + (normalizedCyclotomicZHatIdeleValueContinuousMul K) + (normalizedCyclotomicZHatIdeleValue_principalSubgroup_le_ker K) + +/-- Evaluation of the normalized class value on an idele representative. -/ +theorem normalizedCyclotomicZHatIdeleClassValueContinuousMul_mk + (a : IdeleGroup K) : + normalizedCyclotomicZHatIdeleClassValueContinuousMul K + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) = + Multiplicative.ofAdd + (normalizedCyclotomicZHatIdeleValue K + (Additive.ofMul a)) := by + exact + ideleClassContinuousQuotientLift_mk + (IdeleGroup.principalSubgroup K) + (normalizedCyclotomicZHatIdeleValueContinuousMul K) + (normalizedCyclotomicZHatIdeleValue_principalSubgroup_le_ker K) a + +/-- The normalized cyclotomic value on idele classes, in continuous +additive notation. -/ +noncomputable def normalizedCyclotomicZHatIdeleClassValueContinuous : + Additive (IdeleClassGroup K) →ₜ+ ZHat where + __ := MonoidHom.toAdditiveLeft + (normalizedCyclotomicZHatIdeleClassValueContinuousMul K).toMonoidHom + continuous_toFun := continuous_toAdd.comp + ((normalizedCyclotomicZHatIdeleClassValueContinuousMul K).continuous_toFun.comp + continuous_toMul) + +/-- Evaluation of the normalized additive class value on a representative. -/ +theorem normalizedCyclotomicZHatIdeleClassValueContinuous_mk + (a : IdeleGroup K) : + normalizedCyclotomicZHatIdeleClassValueContinuous K + (Additive.ofMul + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a)) = + normalizedCyclotomicZHatIdeleValue K + (Additive.ofMul a) := by + change + Multiplicative.toAdd + (normalizedCyclotomicZHatIdeleClassValueContinuousMul K + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a)) = + normalizedCyclotomicZHatIdeleValue K + (Additive.ofMul a) + rw [normalizedCyclotomicZHatIdeleClassValueContinuousMul_mk] + rfl + +/-- The chosen local-factor product on the actual cyclotomic +`ZHat`-compositum kills every principal idele. This is the +number-field form of the cyclotomic principal-idele formula: after restricting +to the rational +cyclotomic factor, norm--restriction turns the assertion into the +rational principal-idele product formula, and that restriction is +injective. -/ +theorem + infiniteGlobalArtinMonoidHom_numberFieldCyclotomicZHatCompositum_principalIdele + (x : Kˣ) : + infiniteGlobalArtinMonoidHom K + (numberFieldCyclotomicZHatCompositum K) + (IdeleGroup.principalIdele K x) = + 1 := by + apply numberFieldCyclotomicZHatCompositumRestriction_injective K + rw [ + numberFieldCyclotomicZHatCompositumRestriction_infiniteGlobalArtinMonoidHom, + IdeleGroup.norm_principalIdele] + apply rationalCyclotomicZHatFieldGalEquivZHat.injective + simpa only [ + rationalCyclotomicZHatIdeleValue_apply, + map_one] using + (rationalCyclotomicZHatIdeleValue_principalIdele_eq_one + (Units.map (Algebra.norm ℚ) x)) + +/-- The genuine infinite Artin map of the cyclotomic +`ZHat`-compositum, descended to the idele class group. -/ +noncomputable def + numberFieldCyclotomicZHatCompositumIdeleClassArtinMonoidHom : + IdeleClassGroup K →* + Gal(numberFieldCyclotomicZHatCompositum K/K) := + QuotientGroup.lift + (IdeleGroup.principalSubgroup K) + (infiniteGlobalArtinMonoidHom K + (numberFieldCyclotomicZHatCompositum K)).toMonoidHom + (by + rintro _ ⟨x, rfl⟩ + exact + infiniteGlobalArtinMonoidHom_numberFieldCyclotomicZHatCompositum_principalIdele + K x) + +/-- Evaluation of the descended compositum Artin map on an idele +representative. -/ +theorem + numberFieldCyclotomicZHatCompositumIdeleClassArtinMonoidHom_mk + (a : IdeleGroup K) : + numberFieldCyclotomicZHatCompositumIdeleClassArtinMonoidHom K + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) = + infiniteGlobalArtinMonoidHom K + (numberFieldCyclotomicZHatCompositum K) a := by + rw [numberFieldCyclotomicZHatCompositumIdeleClassArtinMonoidHom] + exact QuotientGroup.lift_mk _ _ _ + +/-- In the rational cyclotomic Galois coordinate, the genuine +idele-class Artin symbol over `K` is exactly `f_K` times the normalized +cyclotomic valuation. -/ +theorem + numberFieldCyclotomicZHatCompositumIdeleClassArtin_coordinate + (c : IdeleClassGroup K) : + Multiplicative.toAdd + (rationalCyclotomicZHatFieldGalEquivZHat + (numberFieldCyclotomicZHatCompositumRestriction K + (numberFieldCyclotomicZHatCompositumIdeleClassArtinMonoidHom + K c))) = + cyclotomicZHatIntersectionDegree K • + normalizedCyclotomicZHatIdeleClassValueContinuous K + (Additive.ofMul c) := by + obtain ⟨a, rfl⟩ := + QuotientGroup.mk'_surjective + (IdeleGroup.principalSubgroup K) c + rw [ + numberFieldCyclotomicZHatCompositumIdeleClassArtinMonoidHom_mk, + numberFieldCyclotomicZHatCompositumRestriction_infiniteGlobalArtinMonoidHom, + normalizedCyclotomicZHatIdeleClassValueContinuous_mk] + change + cyclotomicZHatNormComposite K (Additive.ofMul a) = + cyclotomicZHatIntersectionDegree K • + normalizedCyclotomicZHatIdeleValue K (Additive.ofMul a) + exact + (cyclotomicZHatIntersectionDegree_nsmul_normalizedIdeleValue + K (Additive.ofMul a)).symm + +/-- The kernel of the genuine Artin map to the cyclotomic +`ZHat`-compositum is the zero fibre of the normalized cyclotomic +idele-class valuation. -/ +@[simp] +theorem + numberFieldCyclotomicZHatCompositumIdeleClassArtin_eq_one_iff + (c : IdeleClassGroup K) : + numberFieldCyclotomicZHatCompositumIdeleClassArtinMonoidHom K c = + 1 ↔ + normalizedCyclotomicZHatIdeleClassValueContinuous K + (Additive.ofMul c) = + 0 := by + constructor + · intro hc + have hcoordinate := + numberFieldCyclotomicZHatCompositumIdeleClassArtin_coordinate K c + rw [hc] at hcoordinate + have hcoordinate' : + 0 = + cyclotomicZHatIntersectionDegree K • + normalizedCyclotomicZHatIdeleClassValueContinuous K + (Additive.ofMul c) := by + simpa only [map_one, toAdd_one] using hcoordinate + apply + zHatMulNat_injective + (cyclotomicZHatIntersectionDegree_pos K) + change + cyclotomicZHatIntersectionDegree K • + normalizedCyclotomicZHatIdeleClassValueContinuous K + (Additive.ofMul c) = + cyclotomicZHatIntersectionDegree K • (0 : ZHat) + simpa only [smul_zero] using hcoordinate'.symm + · intro hc + apply numberFieldCyclotomicZHatCompositumRestriction_injective K + apply rationalCyclotomicZHatFieldGalEquivZHat.injective + apply Multiplicative.ext + have hcoordinate := + numberFieldCyclotomicZHatCompositumIdeleClassArtin_coordinate K c + rw [hc, smul_zero] at hcoordinate + simpa only [map_one, toAdd_one] using hcoordinate + +/-- Use the rational algebra structure expected by the imported finite-layer +API throughout this block. Fixing it before the first finite-layer binder +keeps the parameter and every restriction target definitionally aligned. -/ +noncomputable local instance + cyclotomicIdeleClassValuationRationalCyclotomicZHatFieldAlgebra : + Algebra ℚ rationalCyclotomicZHatField := + DivisionRing.toRatAlgebra + +/-- The canonical number-field structure used by every finite-layer +idele-class declaration below. Keeping this witness opaque prevents the +module-finiteness construction from being rebuilt along distinct paths. -/ +private theorem + numberFieldCyclotomicZHatFiniteLayerNumberField + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + NumberField + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) := + NumberField.of_module_finite K + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) + +attribute [local instance] + numberFieldCyclotomicZHatFiniteLayerNumberField + +private structure NumberFieldCyclotomicZHatFiniteLayerArtinData + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Type where + toMonoidHom : + IdeleGroup K →* + Gal(numberFieldCyclotomicZHatFiniteLayerInCompositum K E/K) + principal (x : Kˣ) : + toMonoidHom (IdeleGroup.principalIdele K x) = 1 + restriction (a : IdeleGroup K) : + AlgEquiv.restrictNormalHom + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) + (infiniteGlobalArtinMonoidHom K + (numberFieldCyclotomicZHatCompositum K) a) = + toMonoidHom a + +private theorem + rawGlobalArtinMonoidHom_numberFieldCyclotomicZHatFiniteLayer_principalIdele + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) + (x : Kˣ) : + globalArtinMonoidHom + (K := K) + (L := + numberFieldCyclotomicZHatFiniteLayerInCompositum K E) + (IdeleGroup.principalIdele K x) = + 1 := by + have hprojection : + AlgEquiv.restrictNormalHom + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) + (infiniteGlobalArtinMonoidHom K + (numberFieldCyclotomicZHatCompositum K) + (IdeleGroup.principalIdele K x)) = + globalArtinMonoidHom + (K := K) + (L := + numberFieldCyclotomicZHatFiniteLayerInCompositum K E) + (IdeleGroup.principalIdele K x) := + restrictNormalHom_infiniteGlobalArtinMonoidHom + K (numberFieldCyclotomicZHatCompositum K) + (IdeleGroup.principalIdele K x) + (numberFieldCyclotomicZHatFiniteGaloisLayerInCompositum K E) + calc + globalArtinMonoidHom + (K := K) + (L := + numberFieldCyclotomicZHatFiniteLayerInCompositum K E) + (IdeleGroup.principalIdele K x) = + AlgEquiv.restrictNormalHom + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) + (infiniteGlobalArtinMonoidHom K + (numberFieldCyclotomicZHatCompositum K) + (IdeleGroup.principalIdele K x)) := + hprojection.symm + _ = AlgEquiv.restrictNormalHom + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) 1 := by + rw [ + infiniteGlobalArtinMonoidHom_numberFieldCyclotomicZHatCompositum_principalIdele] + _ = 1 := map_one + (AlgEquiv.restrictNormalHom + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E)) + +private theorem + rawGlobalArtinMonoidHom_numberFieldCyclotomicZHatFiniteLayer_restriction + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) + (a : IdeleGroup K) : + AlgEquiv.restrictNormalHom + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) + (infiniteGlobalArtinMonoidHom K + (numberFieldCyclotomicZHatCompositum K) a) = + globalArtinMonoidHom + (K := K) + (L := + numberFieldCyclotomicZHatFiniteLayerInCompositum K E) a := + restrictNormalHom_infiniteGlobalArtinMonoidHom + K (numberFieldCyclotomicZHatCompositum K) a + (numberFieldCyclotomicZHatFiniteGaloisLayerInCompositum K E) + +private noncomputable def + numberFieldCyclotomicZHatFiniteLayerArtinData + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + NumberFieldCyclotomicZHatFiniteLayerArtinData K E where + toMonoidHom := + globalArtinMonoidHom + (K := K) + (L := numberFieldCyclotomicZHatFiniteLayerInCompositum K E) + principal := + rawGlobalArtinMonoidHom_numberFieldCyclotomicZHatFiniteLayer_principalIdele + K E + restriction := + rawGlobalArtinMonoidHom_numberFieldCyclotomicZHatFiniteLayer_restriction + K E + +/-- The chosen finite-layer global Artin map, kept opaque so every descended +idele-class declaration shares the same dependent instance data. -/ +noncomputable def + numberFieldCyclotomicZHatFiniteLayerGlobalArtinMonoidHom + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IdeleGroup K →* + Gal(numberFieldCyclotomicZHatFiniteLayerInCompositum K E/K) := + (numberFieldCyclotomicZHatFiniteLayerArtinData K E).toMonoidHom + +/-- Every finite cyclotomic layer over a number field inherits the +principal-idele product formula from the full cyclotomic +`ZHat`-compositum. -/ +@[simp] +theorem + globalArtinMonoidHom_numberFieldCyclotomicZHatFiniteLayer_principalIdele + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) + (x : Kˣ) : + numberFieldCyclotomicZHatFiniteLayerGlobalArtinMonoidHom K E + (IdeleGroup.principalIdele K x) = + 1 := by + exact + (numberFieldCyclotomicZHatFiniteLayerArtinData K E).principal x + +private theorem + numberFieldCyclotomicZHatFiniteLayer_principalSubgroup_le_ker + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IdeleGroup.principalSubgroup K ≤ + (numberFieldCyclotomicZHatFiniteLayerGlobalArtinMonoidHom K E).ker := by + rintro _ ⟨x, rfl⟩ + exact + globalArtinMonoidHom_numberFieldCyclotomicZHatFiniteLayer_principalIdele + K E x + +/-- The actual chosen-local-factor Artin map of a finite cyclotomic +layer, descended through `C_K = I_K / Kˣ`. -/ +noncomputable def + numberFieldCyclotomicZHatFiniteLayerIdeleClassArtinMonoidHom + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IdeleClassGroup K →* + Gal(numberFieldCyclotomicZHatFiniteLayerInCompositum K E/K) := by + exact + QuotientGroup.lift + (IdeleGroup.principalSubgroup K) + (numberFieldCyclotomicZHatFiniteLayerGlobalArtinMonoidHom K E) + (numberFieldCyclotomicZHatFiniteLayer_principalSubgroup_le_ker K E) + +/-- Evaluation of the descended finite-layer Artin map on an idele +representative. -/ +theorem + numberFieldCyclotomicZHatFiniteLayerIdeleClassArtinMonoidHom_mk + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) + (a : IdeleGroup K) : + numberFieldCyclotomicZHatFiniteLayerIdeleClassArtinMonoidHom K E + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) = + numberFieldCyclotomicZHatFiniteLayerGlobalArtinMonoidHom K E a := by + rw [numberFieldCyclotomicZHatFiniteLayerIdeleClassArtinMonoidHom] + exact + QuotientGroup.lift_mk + (IdeleGroup.principalSubgroup K) + (numberFieldCyclotomicZHatFiniteLayer_principalSubgroup_le_ker K E) + a + +/-- Restriction of the descended Artin map of the full cyclotomic +compositum to a finite cyclotomic layer is the descended finite-layer +chosen-local-factor Artin map. -/ +theorem + numberFieldCyclotomicZHatCompositumIdeleClassArtinMonoidHom_restrict + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + (AlgEquiv.restrictNormalHom + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E)).comp + (numberFieldCyclotomicZHatCompositumIdeleClassArtinMonoidHom K) = + numberFieldCyclotomicZHatFiniteLayerIdeleClassArtinMonoidHom K E := by + apply MonoidHom.ext + intro c + obtain ⟨a, rfl⟩ := + QuotientGroup.mk'_surjective + (IdeleGroup.principalSubgroup K) c + rw [ + MonoidHom.comp_apply, + numberFieldCyclotomicZHatCompositumIdeleClassArtinMonoidHom_mk, + numberFieldCyclotomicZHatFiniteLayerIdeleClassArtinMonoidHom_mk] + exact + (numberFieldCyclotomicZHatFiniteLayerArtinData K E).restriction a + +/-- The descended rational class value has dense image already on the +compact norm-one idele class group. -/ +theorem + rationalCyclotomicZHatIdeleClassValue_normOne_denseRange : + DenseRange + (fun c : IdeleClassGroup.normOneSubgroup (K := ℚ) => + rationalCyclotomicZHatIdeleClassValueContinuous + (Additive.ofMul (c : IdeleClassGroup ℚ))) := by + have hToAdd : + Function.Surjective + (Multiplicative.toAdd : + Multiplicative ZHat → ZHat) := + fun z => ⟨Multiplicative.ofAdd z, rfl⟩ + have hidele : + DenseRange + (fun b : IdeleGroup.normOneSubgroup (K := ℚ) => + Multiplicative.toAdd + (rationalCyclotomicZHatIdeleValue + (b : IdeleGroup ℚ))) := + hToAdd.denseRange.comp + rationalCyclotomicZHatIdeleValue_normOne_denseRange + continuous_toAdd + apply hidele.mono + rintro z ⟨b, rfl⟩ + let c : IdeleClassGroup.normOneSubgroup (K := ℚ) := + ⟨QuotientGroup.mk' + (IdeleGroup.principalSubgroup ℚ) + (b : IdeleGroup ℚ), + (IdeleClassGroup.mk_mem_normOneSubgroup_iff + (b : IdeleGroup ℚ)).2 b.2⟩ + refine ⟨c, ?_⟩ + simp only [c, + rationalCyclotomicZHatIdeleClassValueContinuous_mk] + +/-- Compactness upgrades the dense rational norm-one image to +surjectivity. -/ +theorem + rationalCyclotomicZHatIdeleClassValue_normOne_surjective : + Function.Surjective + (fun c : IdeleClassGroup.normOneSubgroup (K := ℚ) => + rationalCyclotomicZHatIdeleClassValueContinuous + (Additive.ofMul (c : IdeleClassGroup ℚ))) := by + let f := + fun c : IdeleClassGroup.normOneSubgroup (K := ℚ) => + rationalCyclotomicZHatIdeleClassValueContinuous + (Additive.ofMul (c : IdeleClassGroup ℚ)) + have hf : Continuous f := by + exact + (rationalCyclotomicZHatIdeleClassValueContinuous.continuous_toFun).comp + (continuous_ofMul.comp continuous_subtype_val) + have hclosed : IsClosed (Set.range f) := + (isCompact_range hf).isClosed + have hdense : DenseRange f := by + simpa only [f] using + rationalCyclotomicZHatIdeleClassValue_normOne_denseRange + intro z + have hz : z ∈ closure (Set.range f) := by + rw [hdense.closure_range] + trivial + rwa [hclosed.closure_eq] at hz + +/-- The rational cyclotomic idele-class value is surjective. -/ +theorem rationalCyclotomicZHatIdeleClassValue_surjective : + Function.Surjective + rationalCyclotomicZHatIdeleClassValueContinuous := by + intro z + obtain ⟨c, hc⟩ := + rationalCyclotomicZHatIdeleClassValue_normOne_surjective z + exact ⟨Additive.ofMul (c : IdeleClassGroup ℚ), hc⟩ + +/-- The normalized class value has dense image already on the compact +norm-one idele class group. -/ +theorem normalizedCyclotomicZHatIdeleClassValue_normOne_denseRange : + DenseRange + (fun c : IdeleClassGroup.normOneSubgroup (K := K) => + normalizedCyclotomicZHatIdeleClassValueContinuous K + (Additive.ofMul (c : IdeleClassGroup K))) := by + apply + (normalizedCyclotomicZHatIdeleValue_normOne_denseRange K).mono + rintro z ⟨b, rfl⟩ + let c : IdeleClassGroup.normOneSubgroup (K := K) := + ⟨QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (b : IdeleGroup K), + (IdeleClassGroup.mk_mem_normOneSubgroup_iff + (b : IdeleGroup K)).2 b.2⟩ + refine ⟨c, ?_⟩ + simp only [c, + normalizedCyclotomicZHatIdeleClassValueContinuous_mk] + +/-- Compactness upgrades the dense normalized norm-one image to +surjectivity. -/ +theorem normalizedCyclotomicZHatIdeleClassValue_normOne_surjective : + Function.Surjective + (fun c : IdeleClassGroup.normOneSubgroup (K := K) => + normalizedCyclotomicZHatIdeleClassValueContinuous K + (Additive.ofMul (c : IdeleClassGroup K))) := by + let f := + fun c : IdeleClassGroup.normOneSubgroup (K := K) => + normalizedCyclotomicZHatIdeleClassValueContinuous K + (Additive.ofMul (c : IdeleClassGroup K)) + have hf : Continuous f := by + exact + (normalizedCyclotomicZHatIdeleClassValueContinuous K).continuous_toFun.comp + (continuous_ofMul.comp continuous_subtype_val) + have hclosed : IsClosed (Set.range f) := + (isCompact_range hf).isClosed + have hdense : Dense (Set.range f) := by + change DenseRange f + simpa only [f] using + (normalizedCyclotomicZHatIdeleClassValue_normOne_denseRange K) + intro z + have hz : z ∈ closure (Set.range f) := by + rw [hdense.closure_eq] + trivial + rwa [hclosed.closure_eq] at hz + +/-- The normalized cyclotomic idele-class value is surjective. -/ +theorem normalizedCyclotomicZHatIdeleClassValue_surjective : + Function.Surjective + (normalizedCyclotomicZHatIdeleClassValueContinuous K) := by + intro z + obtain ⟨c, hc⟩ := + normalizedCyclotomicZHatIdeleClassValue_normOne_surjective K z + exact ⟨Additive.ofMul (c : IdeleClassGroup K), hc⟩ + +/-- The normalized cyclotomic class value has full value group. -/ +theorem normalizedCyclotomicZHatIdeleClassValue_range : + (normalizedCyclotomicZHatIdeleClassValueContinuous K).toAddMonoidHom.range = + (⊤ : AddSubgroup ZHat) := + AddMonoidHom.range_eq_top_of_surjective + (normalizedCyclotomicZHatIdeleClassValueContinuous K).toAddMonoidHom + (normalizedCyclotomicZHatIdeleClassValue_surjective K) + +/-- The rational cyclotomic class value has full value group. -/ +theorem rationalCyclotomicZHatIdeleClassValue_range : + rationalCyclotomicZHatIdeleClassValueContinuous.toAddMonoidHom.range = + (⊤ : AddSubgroup ZHat) := + AddMonoidHom.range_eq_top_of_surjective + rationalCyclotomicZHatIdeleClassValueContinuous.toAddMonoidHom + rationalCyclotomicZHatIdeleClassValue_surjective + +/-- The defining normalized-value identity after descent to idele +classes: + +`f_K v_K(c) = v_ℚ(N_{K/ℚ} c)`. -/ +theorem + cyclotomicZHatIntersectionDegree_nsmul_normalizedIdeleClassValue + (c : Additive (IdeleClassGroup K)) : + cyclotomicZHatIntersectionDegree K • + normalizedCyclotomicZHatIdeleClassValueContinuous K c = + rationalCyclotomicZHatIdeleClassValueContinuous + (Additive.ofMul + (_root_.ideleClassNorm ℚ K + (Additive.toMul c))) := by + obtain ⟨a, ha⟩ := + QuotientGroup.mk'_surjective + (IdeleGroup.principalSubgroup K) (Additive.toMul c) + have hc : + c = + Additive.ofMul + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) := by + apply Additive.ext + exact ha.symm + rw [hc, normalizedCyclotomicZHatIdeleClassValueContinuous_mk, + toMul_ofMul, + _root_.ideleClassNorm_mk, + rationalCyclotomicZHatIdeleClassValueContinuous_mk] + simpa only [cyclotomicZHatNormComposite_apply] using + (cyclotomicZHatIntersectionDegree_nsmul_normalizedIdeleValue + K (Additive.ofMul a)) + +/-- The rational cyclotomic value after the actual class norm +`N_{K/ℚ} : C_K → C_ℚ`. -/ +noncomputable def rationalCyclotomicZHatIdeleClassNormComposite : + Additive (IdeleClassGroup K) →+ ZHat := + (rationalCyclotomicZHatIdeleClassValueContinuous.toAddMonoidHom).comp + (MonoidHom.toAdditive (_root_.ideleClassNorm ℚ K)) + +/-- Evaluation of the rational class-norm composite. -/ +@[simp] +theorem rationalCyclotomicZHatIdeleClassNormComposite_apply + (c : Additive (IdeleClassGroup K)) : + rationalCyclotomicZHatIdeleClassNormComposite K c = + rationalCyclotomicZHatIdeleClassValueContinuous + (Additive.ofMul + (_root_.ideleClassNorm ℚ K + (Additive.toMul c))) := + rfl + +/-- Exact image of the actual idele-class norm under the rational +cyclotomic value. -/ +theorem rationalCyclotomicZHatIdeleClassNormComposite_range : + (rationalCyclotomicZHatIdeleClassNormComposite K).range = + nsmulImage (⊤ : AddSubgroup ZHat) + (cyclotomicZHatIntersectionDegree K) := by + ext z + constructor + · rintro ⟨c, rfl⟩ + rw [mem_nsmulImage_iff] + refine + ⟨normalizedCyclotomicZHatIdeleClassValueContinuous K c, + AddSubgroup.mem_top _, ?_⟩ + simpa only [ + rationalCyclotomicZHatIdeleClassNormComposite_apply] using + (cyclotomicZHatIntersectionDegree_nsmul_normalizedIdeleClassValue + K c) + · rw [mem_nsmulImage_iff] + rintro ⟨x, _hx, hx⟩ + obtain ⟨c, hc⟩ := + normalizedCyclotomicZHatIdeleClassValue_surjective K x + refine ⟨c, ?_⟩ + calc + rationalCyclotomicZHatIdeleClassNormComposite K c = + cyclotomicZHatIntersectionDegree K • + normalizedCyclotomicZHatIdeleClassValueContinuous K c := by + simpa only [ + rationalCyclotomicZHatIdeleClassNormComposite_apply] using + (cyclotomicZHatIntersectionDegree_nsmul_normalizedIdeleClassValue + K c).symm + _ = + cyclotomicZHatIntersectionDegree K • x := by + rw [hc] + _ = z := hx + +/-- Restriction of the normalized class value to the compact norm-one +idele class group. -/ +noncomputable def normalizedCyclotomicZHatNormOneIdeleClassValue : + Additive (IdeleClassGroup.normOneSubgroup (K := K)) →+ ZHat := + ((normalizedCyclotomicZHatIdeleClassValueContinuous K).toAddMonoidHom).comp + (MonoidHom.toAdditive + (IdeleClassGroup.normOneSubgroup (K := K)).subtype) + +/-- The normalized norm-one class value remains surjective. -/ +theorem normalizedCyclotomicZHatNormOneIdeleClassValue_surjective : + Function.Surjective + (normalizedCyclotomicZHatNormOneIdeleClassValue K) := by + intro z + obtain ⟨c, hc⟩ := + normalizedCyclotomicZHatIdeleClassValue_normOne_surjective K z + refine ⟨Additive.ofMul c, ?_⟩ + change + normalizedCyclotomicZHatIdeleClassValueContinuous K + (Additive.ofMul (c : IdeleClassGroup K)) = + z + exact hc + +/-- The rational class value composed with the actual class norm, +restricted to norm-one idele classes. The codomain restriction in +`normOneNorm` is supplied by preservation of the absolute idele norm. -/ +noncomputable def rationalCyclotomicZHatNormOneIdeleClassNormComposite : + Additive (IdeleClassGroup.normOneSubgroup (K := K)) →+ ZHat := + (rationalCyclotomicZHatIdeleClassValueContinuous.toAddMonoidHom).comp + (MonoidHom.toAdditive + ((IdeleClassGroup.normOneSubgroup (K := ℚ)).subtype.comp + (IdeleClassGroup.normOneNorm ℚ K))) + +/-- The normalized identity restricted to the actual norm-one class +norm. -/ +theorem + cyclotomicZHatIntersectionDegree_nsmul_normalizedNormOneIdeleClassValue + (c : Additive + (IdeleClassGroup.normOneSubgroup (K := K))) : + cyclotomicZHatIntersectionDegree K • + normalizedCyclotomicZHatNormOneIdeleClassValue K c = + rationalCyclotomicZHatNormOneIdeleClassNormComposite K c := by + change + cyclotomicZHatIntersectionDegree K • + normalizedCyclotomicZHatIdeleClassValueContinuous K + (Additive.ofMul + ((Additive.toMul c : + IdeleClassGroup.normOneSubgroup (K := K)) : + IdeleClassGroup K)) = + rationalCyclotomicZHatIdeleClassValueContinuous + (Additive.ofMul + ((IdeleClassGroup.normOneNorm ℚ K + (Additive.toMul c) : + IdeleClassGroup.normOneSubgroup (K := ℚ)) : + IdeleClassGroup ℚ)) + rw [IdeleClassGroup.normOneNorm_apply] + exact + cyclotomicZHatIntersectionDegree_nsmul_normalizedIdeleClassValue + K + (Additive.ofMul + ((Additive.toMul c : + IdeleClassGroup.normOneSubgroup (K := K)) : + IdeleClassGroup K)) + +/-- The exact cyclotomic image of the actual class norm is already +attained on norm-one idele classes. -/ +theorem + rationalCyclotomicZHatNormOneIdeleClassNormComposite_range : + (rationalCyclotomicZHatNormOneIdeleClassNormComposite K).range = + nsmulImage (⊤ : AddSubgroup ZHat) + (cyclotomicZHatIntersectionDegree K) := by + ext z + constructor + · rintro ⟨c, rfl⟩ + rw [mem_nsmulImage_iff] + refine + ⟨normalizedCyclotomicZHatNormOneIdeleClassValue K c, + AddSubgroup.mem_top _, ?_⟩ + exact + cyclotomicZHatIntersectionDegree_nsmul_normalizedNormOneIdeleClassValue + K c + · rw [mem_nsmulImage_iff] + rintro ⟨x, _hx, hx⟩ + obtain ⟨c, hc⟩ := + normalizedCyclotomicZHatNormOneIdeleClassValue_surjective K x + refine ⟨c, ?_⟩ + calc + rationalCyclotomicZHatNormOneIdeleClassNormComposite K c = + cyclotomicZHatIntersectionDegree K • + normalizedCyclotomicZHatNormOneIdeleClassValue K c := + (cyclotomicZHatIntersectionDegree_nsmul_normalizedNormOneIdeleClassValue + K c).symm + _ = + cyclotomicZHatIntersectionDegree K • x := by + rw [hc] + _ = z := hx + +/-- The rational cyclotomic class valuation transported to the +distinguished base fixed part of the absolute idele-class +representation. -/ +noncomputable def rationalCyclotomicZHatValuation : + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation + (ClassFormation.baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) →+ + ZHat := + (rationalCyclotomicZHatIdeleClassValueContinuous.toAddMonoidHom).comp + rationalIdeleClassEquivBaseFixed.symm.toAddMonoidHom + +/-- The transported rational cyclotomic valuation is surjective. -/ +theorem rationalCyclotomicZHatValuation_surjective : + Function.Surjective rationalCyclotomicZHatValuation := by + intro z + obtain ⟨c, hc⟩ := + rationalCyclotomicZHatIdeleClassValue_surjective z + refine ⟨rationalIdeleClassEquivBaseFixed c, ?_⟩ + change + rationalCyclotomicZHatIdeleClassValueContinuous + (rationalIdeleClassEquivBaseFixed.symm + (rationalIdeleClassEquivBaseFixed c)) = + z + rw [rationalIdeleClassEquivBaseFixed.symm_apply_apply] + exact hc + +/-- The value group of the transported rational valuation is all of +`ZHat`. -/ +@[simp] +theorem rationalCyclotomicZHatValuation_range : + rationalCyclotomicZHatValuation.range = + (⊤ : AddSubgroup ZHat) := + AddMonoidHom.range_eq_top_of_surjective + rationalCyclotomicZHatValuation + rationalCyclotomicZHatValuation_surjective + +/-- Every integral profinite value belongs to the transported rational +cyclotomic valuation range. -/ +theorem rationalCyclotomicZHatValuation_integer_mem_range + (m : ℤ) : + (Int.castRingHom ZHat) m ∈ + rationalCyclotomicZHatValuation.range := by + rw [rationalCyclotomicZHatValuation_range] + exact AddSubgroup.mem_top _ + +/-- The canonical quotient map for the transported rational cyclotomic +valuation is bijective at every positive level. -/ +theorem + rationalCyclotomicZHatValuation_canonicalValueQuotientMap_bijective + (n : ℕ) (hn : 0 < n) : + Function.Bijective + (canonicalValueQuotientMap + rationalCyclotomicZHatValuation.range n hn) := by + rw [rationalCyclotomicZHatValuation_range] + exact canonicalValueQuotientMap_top_bijective n hn + +section AbstractFixedFieldNormRange + +variable + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + +local instance rationalCyclotomicFiniteAbstractFieldQuotientFinite : + Finite + ((ClassFormation.baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (ClassFormation.baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + H.field (ClassFormation.le_baseField H.field)) := + H.finite + +private theorem rationalAbstractFixedFieldFiniteDimensional : + FiniteDimensional ℚ + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + +private theorem rationalAbstractFixedFieldNumberField : + NumberField + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) := by + let : FiniteDimensional ℚ + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) := + rationalAbstractFixedFieldFiniteDimensional H + exact NumberField.of_module_finite ℚ + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + +/-- For the actual number field fixed by a finite abstract field, the +actual idele-class norm has cyclotomic image equal to the +residue-degree multiples of `ZHat`. -/ +theorem + rationalCyclotomicZHatIdeleClassNormComposite_abstractFixedField_range : + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let : FiniteDimensional ℚ F := + rationalAbstractFixedFieldFiniteDimensional H + let : NumberField F := + rationalAbstractFixedFieldNumberField H + (rationalCyclotomicZHatIdeleClassNormComposite F).range = + nsmulImage (⊤ : AddSubgroup ZHat) + (H.residueDegree rationalCyclotomicDegreeData : ℕ) := by + intro F hfinite hnumberField + clear hfinite + have hdegree := + cyclotomicZHatIntersectionDegree_abstractFixedField_eq_residueDegree H + rw [rationalCyclotomicZHatIdeleClassNormComposite_range] + exact + congrArg + (fun n : ℕ => nsmulImage (⊤ : AddSubgroup ZHat) n) + hdegree + +/-- Exact norm-range identity after transport from the actual +fixed-field idele class group to the abstract fixed part. -/ +theorem rationalCyclotomicZHatValuation_normToBase_range : + (rationalCyclotomicZHatValuation.comp + (normToBase rationalIdeleClassRepresentation H.field)).range = + nsmulImage rationalCyclotomicZHatValuation.range + (H.residueDegree rationalCyclotomicDegreeData : ℕ) := by + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let : NumberField F := + rationalAbstractFixedFieldNumberField H + let eF := + rationalAbstractFixedFieldIdeleClassEquivFixed H.field + have heval + (c : Additive (IdeleClassGroup F)) : + (rationalCyclotomicZHatValuation.comp + (normToBase rationalIdeleClassRepresentation H.field)) + (eF c) = + rationalCyclotomicZHatIdeleClassNormComposite F c := by + change + rationalCyclotomicZHatIdeleClassValueContinuous + (rationalIdeleClassEquivBaseFixed.symm + (normToBase rationalIdeleClassRepresentation H.field + (eF c))) = + rationalCyclotomicZHatIdeleClassValueContinuous + (Additive.ofMul + (_root_.ideleClassNorm ℚ F + (Additive.toMul c))) + exact congrArg + rationalCyclotomicZHatIdeleClassValueContinuous + (rationalAbstractFixedFieldNormToBase_eq_ordinaryIdeleClassNorm + H c) + have htransport : + (rationalCyclotomicZHatValuation.comp + (normToBase rationalIdeleClassRepresentation H.field)).range = + (rationalCyclotomicZHatIdeleClassNormComposite F).range := by + ext z + constructor + · rintro ⟨a, rfl⟩ + obtain ⟨c, rfl⟩ := eF.surjective a + exact ⟨c, (heval c).symm⟩ + · rintro ⟨c, rfl⟩ + exact ⟨eF c, heval c⟩ + calc + (rationalCyclotomicZHatValuation.comp + (normToBase rationalIdeleClassRepresentation H.field)).range = + (rationalCyclotomicZHatIdeleClassNormComposite F).range := + htransport + _ = + nsmulImage (⊤ : AddSubgroup ZHat) + (H.residueDegree rationalCyclotomicDegreeData : ℕ) := by + simpa only [F] using + (rationalCyclotomicZHatIdeleClassNormComposite_abstractFixedField_range + H) + _ = + nsmulImage rationalCyclotomicZHatValuation.range + (H.residueDegree rationalCyclotomicDegreeData : ℕ) := by + rw [rationalCyclotomicZHatValuation_range] + +end AbstractFixedFieldNormRange + +/-- The concrete henselian valuation data on the absolute rational +idele-class representation, with cyclotomic degree data. -/ +noncomputable def rationalCyclotomicIdeleClassValuationData : + ValuationData + rationalCyclotomicDegreeData + rationalIdeleClassRepresentation where + toAddMonoidHom := + rationalCyclotomicZHatValuation + integers_mem := + rationalCyclotomicZHatValuation_integer_mem_range + canonical_value_quotient_bijective := + rationalCyclotomicZHatValuation_canonicalValueQuotientMap_bijective + norm_range := by + intro H + exact rationalCyclotomicZHatValuation_normToBase_range H + +/-- Transporting an actual fixed-field idele class into the rational +absolute representation and then taking the base norm gives its +ordinary idele-class norm cyclotomic value. -/ +theorem rationalCyclotomicZHatValuation_normToBase_fixed_apply + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (c : Additive + (IdeleClassGroup + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field))) : + rationalCyclotomicZHatValuation + (normToBase rationalIdeleClassRepresentation H.field + (rationalAbstractFixedFieldIdeleClassEquivFixed H.field c)) = + rationalCyclotomicZHatIdeleClassNormComposite + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) c := by + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let : NumberField F := + rationalAbstractFixedFieldNumberField H + change + rationalCyclotomicZHatIdeleClassValueContinuous + (rationalIdeleClassEquivBaseFixed.symm + (normToBase rationalIdeleClassRepresentation H.field + (rationalAbstractFixedFieldIdeleClassEquivFixed H.field c))) = + rationalCyclotomicZHatIdeleClassValueContinuous + (Additive.ofMul + (_root_.ideleClassNorm ℚ F + (Additive.toMul c))) + exact congrArg + rationalCyclotomicZHatIdeleClassValueContinuous + (rationalAbstractFixedFieldNormToBase_eq_ordinaryIdeleClassNorm + H c) + +/-- Under the genuine fixed-field idele-class comparison, the +valuation used by abstract reciprocity is exactly the normalized +cyclotomic idele-class value of that fixed field. -/ +theorem + rationalCyclotomicIdeleClassValuationData_valuationAt_fixed_apply + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (c : Additive + (IdeleClassGroup + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field))) : + ((rationalCyclotomicIdeleClassValuationData.valuationAt H + (rationalAbstractFixedFieldIdeleClassEquivFixed H.field c) : + rationalCyclotomicIdeleClassValuationData.valueGroup) : + ZHat) = + normalizedCyclotomicZHatIdeleClassValueContinuous + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) c := by + have hdegree := + cyclotomicZHatIntersectionDegree_abstractFixedField_eq_residueDegree + H + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let : NumberField F := + rationalAbstractFixedFieldNumberField H + apply + zHatMulNat_injective + (H.residueDegree rationalCyclotomicDegreeData).pos + calc + (H.residueDegree rationalCyclotomicDegreeData : ℕ) • + ((rationalCyclotomicIdeleClassValuationData.valuationAt H + (rationalAbstractFixedFieldIdeleClassEquivFixed H.field c) : + rationalCyclotomicIdeleClassValuationData.valueGroup) : + ZHat) = + rationalCyclotomicIdeleClassValuationData.normCompositeAt H + (rationalAbstractFixedFieldIdeleClassEquivFixed H.field c) := by + exact + rationalCyclotomicIdeleClassValuationData.residueDegree_nsmul_dividedAt + H + (rationalAbstractFixedFieldIdeleClassEquivFixed H.field c) + _ = + rationalCyclotomicZHatIdeleClassNormComposite F c := + rationalCyclotomicZHatValuation_normToBase_fixed_apply H c + _ = + cyclotomicZHatIntersectionDegree F • + normalizedCyclotomicZHatIdeleClassValueContinuous F c := by + simpa only [ + rationalCyclotomicZHatIdeleClassNormComposite_apply] using + (cyclotomicZHatIntersectionDegree_nsmul_normalizedIdeleClassValue + F c).symm + _ = + (H.residueDegree rationalCyclotomicDegreeData : ℕ) • + normalizedCyclotomicZHatIdeleClassValueContinuous F c := by + exact + congrArg + (fun n : ℕ => + n • normalizedCyclotomicZHatIdeleClassValueContinuous F c) + hdegree + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean new file mode 100644 index 0000000000..860d71d601 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean @@ -0,0 +1,945 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +/-! +# The normalized cyclotomic idele value + +For a number field `K`, the actual cyclotomic `ZHat`-extension is the +compositum of the embedded copy of `K` with the rational cyclotomic +`ZHat`-extension. Its normalization factor is the actual intersection degree + +`f_K = [K ∩ ℚ_tilde : ℚ]`, + +constructed in `CyclotomicZHatBaseChange`. + +This file first constructs the idele-level map + +`(1 / f_K) v_ℚ ∘ N_{K/ℚ} : I_K → ZHat`. + +The factor `f_K` is removed only after proving that the unnormalized +value lies in the actual subgroup `f_K ZHat`. This file stops at that +idele-level construction. Descent from `I_K` to `C_K`, together with +the resulting integer-value and norm-range identities, requires the +genuine cyclotomic principal-idele formula and is the next +source-producing frontier; no quotient projection or abstract valuation +hypothesis is substituted for it here. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Topology + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation + +/-- The rational infinite Artin homomorphism in the canonical +`Multiplicative ZHat` coordinate supplied by the cyclotomic Galois equivalence. -/ +noncomputable def rationalCyclotomicZHatIdeleValue : + IdeleGroup ℚ →ₜ* Multiplicative ZHat := + (ContinuousMonoidHom.toContinuousMonoidHom + rationalCyclotomicZHatFieldGalEquivZHat).comp + rationalCyclotomicZHatGlobalArtin + +/-- Evaluating the rational cyclotomic idele value applies the fixed +Galois-to-`ZHat` equivalence to the rational global Artin image. -/ +@[simp] +theorem rationalCyclotomicZHatIdeleValue_apply + (a : IdeleGroup ℚ) : + rationalCyclotomicZHatIdeleValue a = + rationalCyclotomicZHatFieldGalEquivZHat + (rationalCyclotomicZHatGlobalArtin a) := + rfl + +/-- The rational cyclotomic value has dense image in `ZHat`. -/ +theorem rationalCyclotomicZHatIdeleValue_denseRange : + DenseRange rationalCyclotomicZHatIdeleValue := by + change + DenseRange + (fun a => + rationalCyclotomicZHatFieldGalEquivZHat + (rationalCyclotomicZHatGlobalArtin a)) + exact + rationalCyclotomicZHatFieldGalEquivZHat.surjective.denseRange.comp + rationalCyclotomicZHatGlobalArtin_denseRange + rationalCyclotomicZHatFieldGalEquivZHat.continuous + +/-- The norm-one rational ideles already have dense image in the actual +cyclotomic `ZHat` coordinate. This is the compact source used for +surjectivity after descent to the idele class group. -/ +theorem rationalCyclotomicZHatIdeleValue_normOne_denseRange : + DenseRange + (fun b : IdeleGroup.normOneSubgroup (K := ℚ) => + rationalCyclotomicZHatIdeleValue b) := by + change + DenseRange + (fun b : IdeleGroup.normOneSubgroup (K := ℚ) => + rationalCyclotomicZHatFieldGalEquivZHat + (rationalCyclotomicZHatGlobalArtin b)) + exact + rationalCyclotomicZHatFieldGalEquivZHat.surjective.denseRange.comp + rationalCyclotomicZHatGlobalArtin_normOne_denseRange + rationalCyclotomicZHatFieldGalEquivZHat.continuous + +variable (K : Type) [Field K] [NumberField K] + +local instance + (E : FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsAbelianGalois ℚ E := + IsAbelianGalois.of_algHom E.toIntermediateField.val + +/-- On the actual cyclotomic compositum over `K`, the chosen +local-factor product restricts to the rational cyclotomic Artin symbol +of the ordinary idele norm. -/ +@[simp] +theorem + numberFieldCyclotomicZHatCompositumRestriction_infiniteGlobalArtinMonoidHom + (a : IdeleGroup K) : + numberFieldCyclotomicZHatCompositumRestriction K + (infiniteGlobalArtinMonoidHom K + (numberFieldCyclotomicZHatCompositum K) a) = + rationalCyclotomicZHatGlobalArtin + (IdeleGroup.norm ℚ K a) := by + apply + (InfiniteGalois.continuousMulEquivToLimit + ℚ rationalCyclotomicZHatField).injective + apply Subtype.ext + funext Eop + let E := Eop.unop + let : NumberField E := + NumberField.of_module_finite ℚ E + let P := + numberFieldCyclotomicZHatFiniteGaloisLayerInCompositum K E + let : NumberField P := + numberFieldCyclotomicZHatFiniteLayerInCompositum_numberField K E + let : Algebra E P := + rationalCyclotomicZHatFiniteLayerInCompositumAlgebra K E + let : SMul E P := + rationalCyclotomicZHatFiniteLayerInCompositumSmul K E + let : Module E P := Algebra.toModule + let : IsScalarTower ℚ E P := + rationalCyclotomicZHatFiniteLayerInCompositum_scalarTower K E + let : IsAbelianGalois K P := + numberFieldCyclotomicZHatFiniteLayerInCompositum_isAbelianGalois K E + have hcomm : + (IntermediateField.restrictRestrictAlgEquivMapHom + ℚ E K P).comp + (globalArtinMonoidHom + (K := K) (L := P)) = + (globalArtinMonoidHom + (K := ℚ) (L := E)).comp + (IdeleGroup.norm ℚ K) := by + have hr : + IntermediateField.restrictRestrictAlgEquivMapHom + ℚ E K P = + (AlgEquiv.restrictNormalHom E).comp + (AlgEquiv.restrictScalarsHom ℚ) := by + ext σ x + exact rfl + rw [hr] + exact + globalArtinMonoidHom_norm_restriction + (K := ℚ) (L := E) + (K' := K) + (L' := P) + have hPProjection : + AlgEquiv.restrictNormalHom P + (infiniteGlobalArtinMonoidHom K + (numberFieldCyclotomicZHatCompositum K) a) = + globalArtinMonoidHom (K := K) (L := P) a := + restrictNormalHom_infiniteGlobalArtinMonoidHom + K (numberFieldCyclotomicZHatCompositum K) a P + have hQProjection : + AlgEquiv.restrictNormalHom E + (rationalCyclotomicZHatGlobalArtin + (IdeleGroup.norm ℚ K a)) = + globalArtinMonoidHom + (K := ℚ) (L := E) (IdeleGroup.norm ℚ K a) := + restrictNormalHom_rationalCyclotomicZHatGlobalArtin + (IdeleGroup.norm ℚ K a) E + change + AlgEquiv.restrictNormalHom E + (numberFieldCyclotomicZHatCompositumRestriction K + (infiniteGlobalArtinMonoidHom K + (numberFieldCyclotomicZHatCompositum K) a)) = + AlgEquiv.restrictNormalHom E + (rationalCyclotomicZHatGlobalArtin + (IdeleGroup.norm ℚ K a)) + calc + AlgEquiv.restrictNormalHom E + (numberFieldCyclotomicZHatCompositumRestriction K + (infiniteGlobalArtinMonoidHom K + (numberFieldCyclotomicZHatCompositum K) a)) = + IntermediateField.restrictRestrictAlgEquivMapHom ℚ E K + P + (AlgEquiv.restrictNormalHom + P + (infiniteGlobalArtinMonoidHom K + (numberFieldCyclotomicZHatCompositum K) a)) := + restrictNormalHom_numberFieldCyclotomicZHatCompositumRestriction + K E + (infiniteGlobalArtinMonoidHom K + (numberFieldCyclotomicZHatCompositum K) a) + _ = IntermediateField.restrictRestrictAlgEquivMapHom ℚ E K + P + (globalArtinMonoidHom + (K := K) (L := P) a) := + congrArg + (IntermediateField.restrictRestrictAlgEquivMapHom ℚ E K P) + hPProjection + _ = globalArtinMonoidHom + (K := ℚ) (L := E) (IdeleGroup.norm ℚ K a) := + DFunLike.congr_fun hcomm a + _ = AlgEquiv.restrictNormalHom E + (rationalCyclotomicZHatGlobalArtin + (IdeleGroup.norm ℚ K a)) := by + exact hQProjection.symm + +/-- The rational normalization factor is one: +`[ℚ ∩ ℚ_tilde : ℚ] = 1`. -/ +@[simp] +theorem cyclotomicZHatIntersectionDegree_rat : + cyclotomicZHatIntersectionDegree ℚ = 1 := + Nat.dvd_one.mp (by + simpa using + (cyclotomicZHatIntersectionDegree_dvd_finrank ℚ)) + +/-- The unnormalized composite +`v_ℚ ∘ N_{K/ℚ}`, in additive notation. -/ +noncomputable def cyclotomicZHatNormComposite : + Additive (IdeleGroup K) →+ ZHat := + MonoidHom.toAdditive + (rationalCyclotomicZHatIdeleValue.toMonoidHom.comp + (IdeleGroup.norm ℚ K)) + +/-- The additive norm composite evaluates by taking the ordinary idele +norm and then the rational cyclotomic idele value. -/ +@[simp] +theorem cyclotomicZHatNormComposite_apply + (a : IdeleGroup K) : + cyclotomicZHatNormComposite K (Additive.ofMul a) = + Multiplicative.toAdd + (rationalCyclotomicZHatIdeleValue + (IdeleGroup.norm ℚ K a)) := + rfl + +/-- On the canonical inclusion of a rational idele into `I_K`, the +unnormalized value is multiplication by the absolute degree `[K : ℚ]`. +This is the determinant-norm formula for scalar extension, expressed in +the rational cyclotomic `ZHat` coordinate. -/ +theorem cyclotomicZHatNormComposite_baseIdeleInclusion + (a : IdeleGroup ℚ) : + cyclotomicZHatNormComposite K + (Additive.ofMul + (relativeIdeleBaseChangeMulEquiv + (K := ℚ) (L := K) + (RelativeIdeleGroup.inclusion ℚ K a))) = + Module.finrank ℚ K • + Multiplicative.toAdd + (rationalCyclotomicZHatIdeleValue a) := by + change + Multiplicative.toAdd + (rationalCyclotomicZHatIdeleValue + (IdeleGroup.norm ℚ K + (relativeIdeleBaseChangeMulEquiv + (K := ℚ) (L := K) + (RelativeIdeleGroup.inclusion ℚ K a)))) = + Module.finrank ℚ K • + Multiplicative.toAdd + (rationalCyclotomicZHatIdeleValue a) + rw [IdeleGroup.norm_relativeIdeleBaseChangeMulEquiv, + RelativeIdeleGroup.norm_inclusion, map_pow, + toAdd_pow] + +/-- The image of the unnormalized value contains the absolute-degree +multiple of the rational cyclotomic value group. -/ +theorem + nsmulImage_rationalCyclotomicZHatIdeleValue_range_le_normComposite_range : + nsmulImage + ((AddEquiv.additiveMultiplicative ZHat).toAddMonoidHom.comp + (MonoidHom.toAdditive + rationalCyclotomicZHatIdeleValue.toMonoidHom)).range + (Module.finrank ℚ K) ≤ + (cyclotomicZHatNormComposite K).range := by + intro z hz + rw [mem_nsmulImage_iff] at hz + obtain ⟨x, hx, rfl⟩ := hz + obtain ⟨a, rfl⟩ := hx + refine + ⟨Additive.ofMul + (relativeIdeleBaseChangeMulEquiv + (K := ℚ) (L := K) + (RelativeIdeleGroup.inclusion ℚ K + (Additive.toMul a))), + ?_⟩ + exact + cyclotomicZHatNormComposite_baseIdeleInclusion + K (Additive.toMul a) + +/-- At every finite cyclotomic layer, the Artin image of norms from +`K` is exactly the image of restriction from the actual finite +compositum over `K`. -/ +theorem finiteCyclotomicLayer_normArtin_range + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + letI : NumberField E := + NumberField.of_module_finite ℚ E + let C := + numberFieldCyclotomicZHatFiniteCompositum K E + ((globalArtinMonoidHom + (K := ℚ) (L := E)).comp + (IdeleGroup.norm ℚ K)).range = + (IntermediateField.restrictRestrictAlgEquivMapHom + ℚ E K C).range := by + let : NumberField E := + NumberField.of_module_finite ℚ E + let C := + numberFieldCyclotomicZHatFiniteCompositum K E + let r : + (C ≃ₐ[K] C) →* (E ≃ₐ[ℚ] E) := + IntermediateField.restrictRestrictAlgEquivMapHom + ℚ E K C + have hcomm : + r.comp + (globalArtinMonoidHom + (K := K) (L := C)) = + (globalArtinMonoidHom + (K := ℚ) (L := E)).comp + (IdeleGroup.norm ℚ K) := + by + have hr : + r = + (AlgEquiv.restrictNormalHom E).comp + (AlgEquiv.restrictScalarsHom ℚ) := by + ext σ x + exact rfl + rw [hr] + exact + globalArtinMonoidHom_norm_restriction + (K := ℚ) (L := E) (K' := K) (L' := C) + apply le_antisymm + · rintro σ ⟨a, rfl⟩ + refine + ⟨globalArtinMonoidHom + (K := K) (L := C) a, + ?_⟩ + exact DFunLike.congr_fun hcomm a + · rintro σ ⟨τ, rfl⟩ + obtain ⟨a, ha⟩ := + globalArtinMonoidHom_surjective + (K := K) (L := C) τ + refine ⟨a, ?_⟩ + have h := DFunLike.congr_fun hcomm a + change + r (globalArtinMonoidHom (K := K) (L := C) a) = + globalArtinMonoidHom + (K := ℚ) (L := E) (IdeleGroup.norm ℚ K a) at h + calc + globalArtinMonoidHom + (K := ℚ) (L := E) (IdeleGroup.norm ℚ K a) = + r (globalArtinMonoidHom (K := K) (L := C) a) := h.symm + _ = r τ := congrArg r ha + +/-- Finite-layer form of the norm-image calculation: the Artin image +of the norms from `K` is precisely the subgroup fixing the actual +intersection `K ∩ E`. -/ +theorem finiteCyclotomicLayer_normArtin_range_eq_fixingSubgroup + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + letI : NumberField E := + NumberField.of_module_finite ℚ E + ((globalArtinMonoidHom + (K := ℚ) (L := E)).comp + (IdeleGroup.norm ℚ K)).range = + (numberFieldCyclotomicZHatFiniteIntersection K E).fixingSubgroup := by + let : NumberField E := + NumberField.of_module_finite ℚ E + rw [finiteCyclotomicLayer_normArtin_range K E] + exact + numberFieldCyclotomicZHatFiniteCompositum_restriction_range + K E + +/-- The ordinary norm `N_{K/ℚ}` factors through the determinant norm +from the actual intersection `K ∩ ℚ_tilde`. This is determinant-norm +transitivity in the fixed-bottom-field tower presentation. -/ +theorem + ideleNorm_mem_cyclotomicZHatIntersection_relativeIdeleNorm_range + (a : IdeleGroup K) : + let hle : + numberFieldCyclotomicZHatIntersection K ≤ + rationalCyclotomicZHatField := + inf_le_right + let E := + (numberFieldCyclotomicZHatIntersection K).restrict hle + letI : FiniteDimensional ℚ E := + (IntermediateField.restrictAlgEquiv hle).toLinearEquiv.finiteDimensional + letI : NumberField E := + NumberField.of_module_finite ℚ E + IdeleGroup.norm ℚ K a ∈ + (RelativeIdeleGroup.norm ℚ E).range := by + let hle : + numberFieldCyclotomicZHatIntersection K ≤ + rationalCyclotomicZHatField := + inf_le_right + let E := + (numberFieldCyclotomicZHatIntersection K).restrict hle + let : FiniteDimensional ℚ E := + (IntermediateField.restrictAlgEquiv hle).toLinearEquiv.finiteDimensional + let : NumberField E := + NumberField.of_module_finite ℚ E + let eEK : E →ₐ[ℚ] K := + (numberFieldCyclotomicZHatIntersectionEmbedding K).comp + (IntermediateField.restrictAlgEquiv hle).symm.toAlgHom + let : Algebra E K := + eEK.toRingHom.toAlgebra + let : IsScalarTower ℚ E K := + IsScalarTower.of_algebraMap_eq' + eEK.comp_algebraMap.symm + let : FiniteDimensional E K := + FiniteDimensional.right ℚ E K + let b : RelativeIdeleGroup ℚ K := + (relativeIdeleBaseChangeMulEquiv + (K := ℚ) (L := K)).symm a + let t : TowerRelativeIdeleGroup ℚ E K := + (towerRelativeIdeleEquiv ℚ E K).symm b + refine + ⟨TowerRelativeIdeleGroup.norm ℚ E K t, + ?_⟩ + calc + RelativeIdeleGroup.norm ℚ E + (TowerRelativeIdeleGroup.norm + ℚ E K t) = + RelativeIdeleGroup.norm ℚ K + (towerRelativeIdeleEquiv + ℚ E K t) := + TowerRelativeIdeleGroup.norm_transitive_flatten ℚ E K t + _ = RelativeIdeleGroup.norm ℚ K b := by + rw [show + towerRelativeIdeleEquiv ℚ E K t = b by + simp [t]] + _ = IdeleGroup.norm ℚ K + (relativeIdeleBaseChangeMulEquiv + (K := ℚ) (L := K) b) := + (IdeleGroup.norm_relativeIdeleBaseChangeMulEquiv + ℚ K b).symm + _ = IdeleGroup.norm ℚ K a := by + rw [show + relativeIdeleBaseChangeMulEquiv + (K := ℚ) (L := K) b = a by + simp [b]] + +/-- The infinite rational Artin symbol of `N_{K/ℚ}(a)` fixes the actual +intersection `K ∩ ℚ_tilde`. -/ +theorem + rationalCyclotomicZHatGlobalArtin_norm_mem_intersection_fixingSubgroup + (a : IdeleGroup K) : + rationalCyclotomicZHatGlobalArtin + (IdeleGroup.norm ℚ K a) ∈ + ((numberFieldCyclotomicZHatIntersection K).restrict + (show + numberFieldCyclotomicZHatIntersection K ≤ + rationalCyclotomicZHatField from + inf_le_right)).fixingSubgroup := by + let hle : + numberFieldCyclotomicZHatIntersection K ≤ + rationalCyclotomicZHatField := + inf_le_right + let E₀ := + (numberFieldCyclotomicZHatIntersection K).restrict hle + let : FiniteDimensional ℚ E₀ := + (IntermediateField.restrictAlgEquiv hle).toLinearEquiv.finiteDimensional + let : NumberField E₀ := + NumberField.of_module_finite ℚ E₀ + let : IsAbelianGalois ℚ rationalCyclotomicZHatField := + rationalCyclotomicZHatField_isAbelianGalois + let inclusion : E₀ →ₐ[ℚ] rationalCyclotomicZHatField := + E₀.val.toRingHom.toRatAlgHom + let E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField := + { toIntermediateField := E₀ + finiteDimensional := inferInstance + isGalois := + (IsAbelianGalois.of_algHom (K := ℚ) (L := E₀) + (M := rationalCyclotomicZHatField) inclusion).toIsGalois } + let : NumberField E := + NumberField.of_module_finite ℚ E + have hnorm : + IdeleGroup.norm ℚ K a ∈ + (RelativeIdeleGroup.norm ℚ E).range := by + change + IdeleGroup.norm ℚ K a ∈ + (RelativeIdeleGroup.norm ℚ E₀).range + simpa only [E₀, hle] using + ideleNorm_mem_cyclotomicZHatIntersection_relativeIdeleNorm_range + K a + obtain ⟨z, hz⟩ := hnorm + let : IsAbelianGalois ℚ E := + IsAbelianGalois.of_algHom (K := ℚ) (L := E) + (M := rationalCyclotomicZHatField) + (show E →ₐ[ℚ] rationalCyclotomicZHatField from + E.toIntermediateField.val.toRingHom.toRatAlgHom) + have hfinite : + globalArtinMonoidHom + (K := ℚ) (L := E) + (IdeleGroup.norm ℚ K a) = + 1 := by + rw [← hz] + exact + globalArtinMonoidHom_relativeIdeleNorm_eq_one + (K := ℚ) (L := E) z + change + rationalCyclotomicZHatGlobalArtin + (IdeleGroup.norm ℚ K a) ∈ + E.fixingSubgroup + rw [ + FiniteGaloisIntermediateField.mem_fixingSubgroup_iff] + calc + AlgEquiv.restrictNormalHom E + (rationalCyclotomicZHatGlobalArtin + (IdeleGroup.norm ℚ K a)) = + globalArtinMonoidHom + (K := ℚ) (L := E) (IdeleGroup.norm ℚ K a) := + restrictNormalHom_rationalCyclotomicZHatGlobalArtin + (IdeleGroup.norm ℚ K a) E + _ = 1 := hfinite + +/-- The rational Artin symbols of norms from `K` are dense in the +subgroup fixing the actual intersection `K ∩ ℚ_tilde`. At each finite +cyclotomic layer this is the exact restriction-image calculation above; +the Krull neighborhood basis then gives density in the inverse limit. -/ +theorem + rationalCyclotomicZHatGlobalArtin_norm_denseRange_in_intersection_fixingSubgroup : + let hle : + numberFieldCyclotomicZHatIntersection K ≤ + rationalCyclotomicZHatField := + inf_le_right + let F := + (numberFieldCyclotomicZHatIntersection K).restrict hle + DenseRange + (fun a : IdeleGroup K => + (⟨rationalCyclotomicZHatGlobalArtin + (IdeleGroup.norm ℚ K a), + rationalCyclotomicZHatGlobalArtin_norm_mem_intersection_fixingSubgroup + K a⟩ : + F.fixingSubgroup)) := by + let hle : + numberFieldCyclotomicZHatIntersection K ≤ + rationalCyclotomicZHatField := + inf_le_right + let F := + (numberFieldCyclotomicZHatIntersection K).restrict hle + change + DenseRange + (fun a : IdeleGroup K => + (⟨rationalCyclotomicZHatGlobalArtin + (IdeleGroup.norm ℚ K a), + rationalCyclotomicZHatGlobalArtin_norm_mem_intersection_fixingSubgroup + K a⟩ : + F.fixingSubgroup)) + apply dense_iff_inter_open.mpr + rintro U hU ⟨σ, hσU⟩ + rw [isOpen_induced_iff] at hU + obtain ⟨U₀, hU₀open, hUeq⟩ := hU + have hσU₀ : + σ.1 ∈ U₀ := by + have hσpre : + σ ∈ + Subtype.val ⁻¹' U₀ := by + exact hUeq.symm ▸ hσU + exact hσpre + let V : + Set + (rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField) := + (Homeomorph.mulLeft + σ.1) ⁻¹' U₀ + have hVopen : IsOpen V := + hU₀open.preimage + (Homeomorph.mulLeft + σ.1).continuous + have hVone : ((1 : F.fixingSubgroup).1) ∈ V := by + change + σ.1 * (1 : F.fixingSubgroup).1 ∈ U₀ + rw [show + σ.1 * (1 : F.fixingSubgroup).1 = σ.1 by + exact congrArg Subtype.val (mul_one σ)] + exact hσU₀ + have hVnhds := hVopen.mem_nhds hVone + have hkrull := + InfiniteGalois.krullTopology_mem_nhds_one_iff_of_isGalois + (k := ℚ) (K := rationalCyclotomicZHatField) V + obtain ⟨E, hEV⟩ := + hkrull.mp hVnhds + let hENumberField : NumberField E := + NumberField.of_module_finite ℚ E + let : NumberField E := hENumberField + let hEAbelian : IsAbelianGalois ℚ E := + IsAbelianGalois.of_algHom E.toIntermediateField.val + let : IsAbelianGalois ℚ E := hEAbelian + have hσfix : + ∀ x : rationalCyclotomicZHatField, + x ∈ F → + σ.1 x = x := by + exact + (IntermediateField.mem_fixingSubgroup_iff F σ.1).1 + σ.property + have hrestrictFix : + AlgEquiv.restrictNormalHom E + σ.1 ∈ + (numberFieldCyclotomicZHatFiniteIntersection K E).fixingSubgroup := by + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + apply Subtype.ext + have hxF : + ((x : E) : rationalCyclotomicZHatField) ∈ F := by + apply + (IntermediateField.mem_restrict hle + ((x : E) : rationalCyclotomicZHatField)).2 + exact + numberFieldCyclotomicZHatFiniteIntersection_coe_mem_intersection + K E x hx + calc + (((AlgEquiv.restrictNormalHom E + σ.1) x : E) : + rationalCyclotomicZHatField) = + σ.1 + ((x : E) : rationalCyclotomicZHatField) := + AlgEquiv.restrictNormal_commutes + σ.1 E x + _ = ((x : E) : rationalCyclotomicZHatField) := + hσfix ((x : E) : rationalCyclotomicZHatField) hxF + have hrestrictRange : + AlgEquiv.restrictNormalHom E + σ.1 ∈ + ((globalArtinMonoidHom + (K := ℚ) (L := E)).comp + (IdeleGroup.norm ℚ K)).range := by + rw [ + finiteCyclotomicLayer_normArtin_range_eq_fixingSubgroup + K E] + exact hrestrictFix + obtain ⟨a, ha⟩ := hrestrictRange + let τ : + F.fixingSubgroup := + ⟨rationalCyclotomicZHatGlobalArtin + (IdeleGroup.norm ℚ K a), + rationalCyclotomicZHatGlobalArtin_norm_mem_intersection_fixingSubgroup + K a⟩ + let δ : F.fixingSubgroup := σ⁻¹ * τ + have hδ : + δ.1 = (σ.1)⁻¹ * τ.1 := + rfl + have hτ : + τ.1 = + rationalCyclotomicZHatGlobalArtin + (IdeleGroup.norm ℚ K a) := + rfl + have ha' : + globalArtinMonoidHom + (K := ℚ) (L := E) (IdeleGroup.norm ℚ K a) = + AlgEquiv.restrictNormalHom E σ.1 := by + simpa only [MonoidHom.comp_apply] using ha + have hτProjection : + AlgEquiv.restrictNormalHom E τ.1 = + globalArtinMonoidHom + (K := ℚ) (L := E) (IdeleGroup.norm ℚ K a) := by + rw [hτ] + change + AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom + ℚ rationalCyclotomicZHatField + (IdeleGroup.norm ℚ K a)) = + globalArtinMonoidHom + (K := ℚ) (L := E) (IdeleGroup.norm ℚ K a) + exact + restrictNormalHom_rationalCyclotomicZHatGlobalArtin_of_structures + (IdeleGroup.norm ℚ K a) E hENumberField hEAbelian + have hrestrictEq : + AlgEquiv.restrictNormalHom E τ.1 = + AlgEquiv.restrictNormalHom E σ.1 := + hτProjection.trans ha' + have hfixE : + δ.1 ∈ E.fixingSubgroup := by + apply + (IntermediateField.mem_fixingSubgroup_iff + E.toIntermediateField δ.1).2 + intro x hx + have hrestrictedValue := + congrArg + (fun f : E ≃ₐ[ℚ] E => f ⟨x, hx⟩) + hrestrictEq + have hτx : τ.1 x = σ.1 x := by + calc + τ.1 x = + ((AlgEquiv.restrictNormalHom E τ.1) + ⟨x, hx⟩ : E) := + (AlgEquiv.restrictNormal_commutes + τ.1 E ⟨x, hx⟩).symm + _ = + ((AlgEquiv.restrictNormalHom E σ.1) + ⟨x, hx⟩ : E) := + congrArg Subtype.val hrestrictedValue + _ = σ.1 x := + AlgEquiv.restrictNormal_commutes + σ.1 E ⟨x, hx⟩ + calc + δ.1 x = ((σ.1)⁻¹ * τ.1) x := + congrArg (fun f => f x) hδ + _ = (σ.1)⁻¹ (τ.1 x) := rfl + _ = (σ.1)⁻¹ (σ.1 x) := + congrArg + (fun y : rationalCyclotomicZHatField => + (σ.1)⁻¹ y) + hτx + _ = x := (σ.1).symm_apply_apply x + have hmemV : + δ.1 ∈ V := + hEV hfixE + have hτU₀ : + τ.1 ∈ U₀ := by + change σ.1 * δ.1 ∈ U₀ at hmemV + have hcancel : σ * δ = τ := by + dsimp only [δ] + exact mul_inv_cancel_left σ τ + have hcancelVal := congrArg Subtype.val hcancel + change σ.1 * δ.1 = τ.1 at hcancelVal + rw [hcancelVal] at hmemV + exact hmemV + have hτU : τ ∈ U := by + have hτpre : τ ∈ Subtype.val ⁻¹' U₀ := + hτU₀ + exact hUeq ▸ hτpre + exact ⟨τ, hτU, ⟨a, rfl⟩⟩ + +/-- The unnormalized value `v_ℚ(N_{K/ℚ}(a))` lies in the actual +subgroup `f_K ZHat`. -/ +theorem cyclotomicZHatNormComposite_mem_mulNat_range + (a : Additive (IdeleGroup K)) : + cyclotomicZHatNormComposite K a ∈ + (zHatMulNat + (cyclotomicZHatIntersectionDegree K)).toAddMonoidHom.range := by + let σ := + rationalCyclotomicZHatGlobalArtin + (IdeleGroup.norm ℚ K (Additive.toMul a)) + have hfix : + σ ∈ + ((numberFieldCyclotomicZHatIntersection K).restrict + (show + numberFieldCyclotomicZHatIntersection K ≤ + rationalCyclotomicZHatField from + inf_le_right)).fixingSubgroup := by + exact + rationalCyclotomicZHatGlobalArtin_norm_mem_intersection_fixingSubgroup + K (Additive.toMul a) + have hmap : + rationalCyclotomicZHatFieldGalEquivZHat σ ∈ + ((numberFieldCyclotomicZHatIntersection K).restrict + (show + numberFieldCyclotomicZHatIntersection K ≤ + rationalCyclotomicZHatField from + inf_le_right)).fixingSubgroup.map + rationalCyclotomicZHatFieldGalEquivZHat.toMonoidHom := + ⟨σ, hfix, rfl⟩ + have hadd : + Multiplicative.toAdd + (rationalCyclotomicZHatFieldGalEquivZHat σ) ∈ + Subgroup.toAddSubgroup' + (((numberFieldCyclotomicZHatIntersection K).restrict + (show + numberFieldCyclotomicZHatIntersection K ≤ + rationalCyclotomicZHatField from + inf_le_right)).fixingSubgroup.map + rationalCyclotomicZHatFieldGalEquivZHat.toMonoidHom) := by + rw [Subgroup.mem_toAddSubgroup'] + simpa using hmap + rw [ + rationalCyclotomicZHatFieldGal_fixingSubgroup_image_eq_mulNat_range + K] at hadd + change + Multiplicative.toAdd + (rationalCyclotomicZHatFieldGalEquivZHat σ) ∈ + (zHatMulNat + (cyclotomicZHatIntersectionDegree K)).toAddMonoidHom.range + exact hadd + +/-- Subgroup form of the upper image bound: +`v_ℚ(N_{K/ℚ}(I_K)) ⊆ f_K ZHat`. -/ +theorem cyclotomicZHatNormComposite_range_le_mulNat_range : + (cyclotomicZHatNormComposite K).range ≤ + (zHatMulNat + (cyclotomicZHatIntersectionDegree K)).toAddMonoidHom.range := by + rintro _ ⟨a, rfl⟩ + exact cyclotomicZHatNormComposite_mem_mulNat_range K a + +/-- The unnormalized composite, with codomain restricted to the actual +multiple subgroup `f_K ZHat`. -/ +noncomputable def cyclotomicZHatNormCompositeInMulNatRange : + Additive (IdeleGroup K) →+ + (zHatMulNat + (cyclotomicZHatIntersectionDegree K)).toAddMonoidHom.range := + (cyclotomicZHatNormComposite K).codRestrict + (zHatMulNat + (cyclotomicZHatIntersectionDegree K)).toAddMonoidHom.range + (cyclotomicZHatNormComposite_mem_mulNat_range K) + +/-- The unnormalized norm value is dense in its exact ambient subgroup +`f_K ℤ̂`. This is the additive-coordinate form of the Krull-density +statement for norm Artin symbols. -/ +theorem cyclotomicZHatNormCompositeInMulNatRange_denseRange : + DenseRange + (cyclotomicZHatNormCompositeInMulNatRange K) := by + let hle : + numberFieldCyclotomicZHatIntersection K ≤ + rationalCyclotomicZHatField := + inf_le_right + let F := + (numberFieldCyclotomicZHatIntersection K).restrict hle + let H := F.fixingSubgroup + let f := cyclotomicZHatIntersectionDegree K + let R := + (zHatMulNat f).toAddMonoidHom.range + let e := + rationalCyclotomicZHatFieldGalEquivZHat + have himage : + (H.map e.toMonoidHom).toAddSubgroup' = R := by + simpa only [H, F, f, R, e] using + (rationalCyclotomicZHatFieldGal_fixingSubgroup_image_eq_mulNat_range + K) + let g : H → R := + fun σ => + ⟨Multiplicative.toAdd (e σ.1), by + have hσ : + Multiplicative.toAdd (e σ.1) ∈ + (H.map e.toMonoidHom).toAddSubgroup' := by + rw [Subgroup.mem_toAddSubgroup'] + exact ⟨σ.1, σ.2, rfl⟩ + rw [himage] at hσ + exact hσ⟩ + have hgContinuous : Continuous g := by + apply Continuous.subtype_mk + change + Continuous + (fun σ : H => + e σ.1) + exact e.continuous.comp continuous_subtype_val + have hgSurjective : Function.Surjective g := by + intro z + have hz : + z.1 ∈ + (H.map e.toMonoidHom).toAddSubgroup' := by + rw [himage] + exact z.2 + rw [Subgroup.mem_toAddSubgroup'] at hz + obtain ⟨σ, hσ, hσz⟩ := hz + refine ⟨⟨σ, hσ⟩, ?_⟩ + apply Subtype.ext + exact congrArg Multiplicative.toAdd hσz + have hnormDense : + DenseRange + (fun a : IdeleGroup K => + (⟨rationalCyclotomicZHatGlobalArtin + (IdeleGroup.norm ℚ K a), + rationalCyclotomicZHatGlobalArtin_norm_mem_intersection_fixingSubgroup + K a⟩ : + H)) := by + simpa only [H, F] using + (rationalCyclotomicZHatGlobalArtin_norm_denseRange_in_intersection_fixingSubgroup + K) + have hcompDense : + DenseRange + (fun a : IdeleGroup K => + g + (⟨rationalCyclotomicZHatGlobalArtin + (IdeleGroup.norm ℚ K a), + rationalCyclotomicZHatGlobalArtin_norm_mem_intersection_fixingSubgroup + K a⟩ : + H)) := + hgSurjective.denseRange.comp + hnormDense hgContinuous + apply hcompDense.mono + rintro z ⟨a, rfl⟩ + refine ⟨Additive.ofMul a, ?_⟩ + apply Subtype.ext + rfl + +/-- The normalized cyclotomic value on ideles: +`(1 / f_K) v_ℚ ∘ N_{K/ℚ}`. -/ +noncomputable def normalizedCyclotomicZHatIdeleValue : + Additive (IdeleGroup K) →+ ZHat := + (zHatDivide + (cyclotomicZHatIntersectionDegree K) + (cyclotomicZHatIntersectionDegree_pos K)).toAddMonoidHom.comp + (cyclotomicZHatNormCompositeInMulNatRange K) + +/-- The normalized cyclotomic value has dense image in `ℤ̂`. -/ +theorem normalizedCyclotomicZHatIdeleValue_denseRange : + DenseRange (normalizedCyclotomicZHatIdeleValue K) := by + change + DenseRange + (fun a => + zHatDivide + (cyclotomicZHatIntersectionDegree K) + (cyclotomicZHatIntersectionDegree_pos K) + (cyclotomicZHatNormCompositeInMulNatRange K a)) + exact + (zHatMulNatRangeEquiv + (cyclotomicZHatIntersectionDegree K) + (cyclotomicZHatIntersectionDegree_pos K)).symm.surjective.denseRange.comp + (cyclotomicZHatNormCompositeInMulNatRange_denseRange K) + (zHatDivide + (cyclotomicZHatIntersectionDegree K) + (cyclotomicZHatIntersectionDegree_pos K)).continuous + +/-- The defining normalization identity +`f_K v_K(a) = v_ℚ(N_{K/ℚ}(a))` at the idele level. -/ +theorem cyclotomicZHatIntersectionDegree_nsmul_normalizedIdeleValue + (a : Additive (IdeleGroup K)) : + cyclotomicZHatIntersectionDegree K • + normalizedCyclotomicZHatIdeleValue K a = + cyclotomicZHatNormComposite K a := by + exact + zHatMulNat_zHatDivide + (cyclotomicZHatIntersectionDegree K) + (cyclotomicZHatIntersectionDegree_pos K) + (cyclotomicZHatNormCompositeInMulNatRange K a) + +/-- On scalar extension of a rational idele, the normalized value is +multiplication by the relative factor `[K : ℚ] / f_K`. -/ +theorem normalizedCyclotomicZHatIdeleValue_baseIdeleInclusion + (a : IdeleGroup ℚ) : + normalizedCyclotomicZHatIdeleValue K + (Additive.ofMul + (relativeIdeleBaseChangeMulEquiv + (K := ℚ) (L := K) + (RelativeIdeleGroup.inclusion ℚ K a))) = + (Module.finrank ℚ K / + cyclotomicZHatIntersectionDegree K) • + Multiplicative.toAdd + (rationalCyclotomicZHatIdeleValue a) := by + apply + zHatMulNat_injective + (cyclotomicZHatIntersectionDegree_pos K) + rw [zHatMulNat_apply, zHatMulNat_apply, + cyclotomicZHatIntersectionDegree_nsmul_normalizedIdeleValue, + cyclotomicZHatNormComposite_baseIdeleInclusion, + ← mul_nsmul, + Nat.div_mul_cancel + (cyclotomicZHatIntersectionDegree_dvd_finrank K)] + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValueTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValueTopology.lean new file mode 100644 index 0000000000..4cd4005125 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValueTopology.lean @@ -0,0 +1,287 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicNormOneCorrection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.Continuity +/-! +# Topology of the rational cyclotomic idele value + +The rational cyclotomic idele value is constructed multiplicatively in +`CyclotomicIdeleValue`. For descent to the additive idele class group and +for the valuation package, this file records its genuine continuous additive +form. Its finite reductions give the open-kernel finite quotients which form +the profinite neighbourhood system used after principal-idèle vanishing has +been proved. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation + +/-- The rational cyclotomic idele value in continuous additive notation. -/ +noncomputable def rationalCyclotomicZHatIdeleValueContinuousAdd : + Additive (IdeleGroup ℚ) →ₜ+ ZHat where + __ := + rationalCyclotomicZHatIdeleValue.toMonoidHom.toAdditiveLeft + continuous_toFun := + continuous_toAdd.comp + (rationalCyclotomicZHatIdeleValue.continuous_toFun.comp + continuous_toMul) + +/-- Evaluation of the continuous additive rational cyclotomic value agrees +with the original multiplicative value. -/ +@[simp] +theorem rationalCyclotomicZHatIdeleValueContinuousAdd_apply + (a : IdeleGroup ℚ) : + rationalCyclotomicZHatIdeleValueContinuousAdd + (Additive.ofMul a) = + Multiplicative.toAdd + (rationalCyclotomicZHatIdeleValue a) := + rfl + +/-- The continuous additive rational cyclotomic value has dense image. -/ +theorem rationalCyclotomicZHatIdeleValueContinuousAdd_denseRange : + DenseRange rationalCyclotomicZHatIdeleValueContinuousAdd := by + have hToAdd : + Function.Surjective + (Multiplicative.toAdd : + Multiplicative ZHat → ZHat) := + fun z => ⟨Multiplicative.ofAdd z, rfl⟩ + have hToMul : + Function.Surjective + (Additive.toMul : + Additive (IdeleGroup ℚ) → IdeleGroup ℚ) := + fun a => ⟨Additive.ofMul a, rfl⟩ + have hAfterToAdd : + DenseRange + (fun a : IdeleGroup ℚ => + Multiplicative.toAdd + (rationalCyclotomicZHatIdeleValue a)) := + hToAdd.denseRange.comp + rationalCyclotomicZHatIdeleValue_denseRange + continuous_toAdd + change + DenseRange + (fun a : Additive (IdeleGroup ℚ) => + Multiplicative.toAdd + (rationalCyclotomicZHatIdeleValue + (Additive.toMul a))) + exact + hAfterToAdd.comp hToMul.denseRange + (continuous_toAdd.comp + rationalCyclotomicZHatIdeleValue.continuous_toFun) + +/-- The kernel of the continuous additive rational cyclotomic value is +closed. This is the Hausdorffness input for its eventual quotient descent. -/ +theorem rationalCyclotomicZHatIdeleValueContinuousAdd_isClosed_ker : + IsClosed + (((ContinuousAddMonoidHom.toAddMonoidHom + rationalCyclotomicZHatIdeleValueContinuousAdd).ker : + AddSubgroup (Additive (IdeleGroup ℚ))) : + Set (Additive (IdeleGroup ℚ))) := by + rw [show + (((ContinuousAddMonoidHom.toAddMonoidHom + rationalCyclotomicZHatIdeleValueContinuousAdd).ker : + AddSubgroup (Additive (IdeleGroup ℚ))) : + Set (Additive (IdeleGroup ℚ))) = + rationalCyclotomicZHatIdeleValueContinuousAdd ⁻¹' + ({0} : Set ZHat) by + ext a + simp] + exact + isClosed_singleton.preimage + rationalCyclotomicZHatIdeleValueContinuousAdd.continuous_toFun + +/-- Reduction of the rational cyclotomic idele value modulo a positive +integer, as an actual continuous additive homomorphism. -/ +noncomputable def rationalCyclotomicZHatIdeleValueReduction + (n : ℕ) (hn : 0 < n) : + Additive (IdeleGroup ℚ) →ₜ+ ZMod n := + (zHatReduction n hn).comp + rationalCyclotomicZHatIdeleValueContinuousAdd + +/-- Evaluation of a finite reduction is reduction of the original +cyclotomic value. -/ +@[simp] +theorem rationalCyclotomicZHatIdeleValueReduction_apply + (n : ℕ) (hn : 0 < n) (a : IdeleGroup ℚ) : + rationalCyclotomicZHatIdeleValueReduction n hn + (Additive.ofMul a) = + zHatReduction n hn + (Multiplicative.toAdd + (rationalCyclotomicZHatIdeleValue a)) := + rfl + +/-- Every residue class modulo a positive integer occurs as a finite +reduction of the rational cyclotomic idele value. -/ +theorem rationalCyclotomicZHatIdeleValueReduction_surjective + (n : ℕ) (hn : 0 < n) : + Function.Surjective + (rationalCyclotomicZHatIdeleValueReduction n hn) := by + have hReductionSurjective : + Function.Surjective (zHatReduction n hn) := by + intro z + obtain ⟨a, rfl⟩ := ZMod.intCast_surjective z + exact ⟨(a : ZHat), zHatReduction_intCast n hn a⟩ + have hDense : + DenseRange + (rationalCyclotomicZHatIdeleValueReduction n hn) := by + exact + hReductionSurjective.denseRange.comp + rationalCyclotomicZHatIdeleValueContinuousAdd_denseRange + (zHatReduction n hn).continuous_toFun + intro z + have hz : + z ∈ closure + (Set.range + (rationalCyclotomicZHatIdeleValueReduction n hn)) := + hDense z + rw [closure_discrete] at hz + exact hz + +/-- The finite reduction kernels are open. They are the concrete open +congruence subgroups available for the later idele-class quotient map. -/ +theorem rationalCyclotomicZHatIdeleValueReduction_isOpen_ker + (n : ℕ) (hn : 0 < n) : + IsOpen + (((ContinuousAddMonoidHom.toAddMonoidHom + (rationalCyclotomicZHatIdeleValueReduction n hn)).ker : + AddSubgroup (Additive (IdeleGroup ℚ))) : + Set (Additive (IdeleGroup ℚ))) := by + rw [show + (((ContinuousAddMonoidHom.toAddMonoidHom + (rationalCyclotomicZHatIdeleValueReduction n hn)).ker : + AddSubgroup (Additive (IdeleGroup ℚ))) : + Set (Additive (IdeleGroup ℚ))) = + rationalCyclotomicZHatIdeleValueReduction n hn ⁻¹' + ({0} : Set (ZMod n)) by + ext a + simp] + exact + (isOpen_discrete ({0} : Set (ZMod n))).preimage + (rationalCyclotomicZHatIdeleValueReduction n hn).continuous_toFun + +variable (K : Type) [Field K] [NumberField K] + +/-- The unnormalized cyclotomic norm composite, bundled with its actual +continuity. Continuity here uses the global idele norm rather than a +quotient-level substitute. -/ +noncomputable def cyclotomicZHatNormCompositeContinuous : + Additive (IdeleGroup K) →ₜ+ ZHat where + __ := cyclotomicZHatNormComposite K + continuous_toFun := by + change + Continuous + (fun a : Additive (IdeleGroup K) => + Multiplicative.toAdd + (rationalCyclotomicZHatIdeleValue + (IdeleGroup.norm ℚ K (Additive.toMul a)))) + exact + continuous_toAdd.comp + (rationalCyclotomicZHatIdeleValue.continuous_toFun.comp + ((IdeleGroup.norm_continuous ℚ K).comp + continuous_toMul)) + +/-- The continuous norm composite agrees pointwise with the underlying +unnormalized cyclotomic norm composite. -/ +@[simp] +theorem cyclotomicZHatNormCompositeContinuous_apply + (a : IdeleGroup K) : + cyclotomicZHatNormCompositeContinuous K (Additive.ofMul a) = + Multiplicative.toAdd + (rationalCyclotomicZHatIdeleValue + (IdeleGroup.norm ℚ K a)) := + rfl + +/-- The unnormalized composite, continuously restricted to its actual +multiple subgroup `f_K ℤ̂`. -/ +noncomputable def cyclotomicZHatNormCompositeInMulNatRangeContinuous : + Additive (IdeleGroup K) →ₜ+ + (zHatMulNat + (cyclotomicZHatIntersectionDegree K)).toAddMonoidHom.range where + __ := cyclotomicZHatNormCompositeInMulNatRange K + continuous_toFun := by + apply Continuous.subtype_mk + exact (cyclotomicZHatNormCompositeContinuous K).continuous_toFun + +/-- Coercing the continuous range-restricted norm composite recovers the +underlying cyclotomic norm composite. -/ +theorem cyclotomicZHatNormCompositeInMulNatRangeContinuous_apply + (a : Additive (IdeleGroup K)) : + (cyclotomicZHatNormCompositeInMulNatRangeContinuous K a : + ZHat) = + cyclotomicZHatNormComposite K a := + rfl + +/-- The normalized cyclotomic value on ideles as a genuine continuous +additive homomorphism. -/ +noncomputable def normalizedCyclotomicZHatIdeleValueContinuous : + Additive (IdeleGroup K) →ₜ+ ZHat := + (zHatDivide + (cyclotomicZHatIntersectionDegree K) + (cyclotomicZHatIntersectionDegree_pos K)).comp + (cyclotomicZHatNormCompositeInMulNatRangeContinuous K) + +/-- The continuous normalized cyclotomic value agrees pointwise with its +underlying additive homomorphism. -/ +@[simp] +theorem normalizedCyclotomicZHatIdeleValueContinuous_apply + (a : Additive (IdeleGroup K)) : + normalizedCyclotomicZHatIdeleValueContinuous K a = + normalizedCyclotomicZHatIdeleValue K a := + rfl + +/-- The normalized cyclotomic value in continuous multiplicative notation. +This is the source homomorphism which descends through the principal-idèle +quotient once the rational principal product formula has been established. -/ +noncomputable def normalizedCyclotomicZHatIdeleValueContinuousMul : + IdeleGroup K →ₜ* Multiplicative ZHat where + toMonoidHom := + AddMonoidHom.toMultiplicativeRight + (normalizedCyclotomicZHatIdeleValueContinuous K).toAddMonoidHom + continuous_toFun := + continuous_ofAdd.comp + ((normalizedCyclotomicZHatIdeleValueContinuous K).continuous_toFun.comp + continuous_toAdd) + +/-- The multiplicative continuous normalized value is the multiplicative +form of the underlying additive normalized value. -/ +@[simp] +theorem normalizedCyclotomicZHatIdeleValueContinuousMul_apply + (a : IdeleGroup K) : + normalizedCyclotomicZHatIdeleValueContinuousMul K a = + Multiplicative.ofAdd + (normalizedCyclotomicZHatIdeleValue K + (Additive.ofMul a)) := + rfl + +/-- The actual norm-one ideles already have dense normalized cyclotomic +value. The source reduction uses the positive archimedean correction, +whose cyclotomic value is trivial. -/ +theorem normalizedCyclotomicZHatIdeleValue_normOne_denseRange : + DenseRange + (fun b : IdeleGroup.normOneSubgroup (K := K) => + normalizedCyclotomicZHatIdeleValue K + (Additive.ofMul (b : IdeleGroup K))) := by + apply (normalizedCyclotomicZHatIdeleValue_denseRange K).mono + rintro z ⟨a, rfl⟩ + obtain ⟨b, hb⟩ := + exists_normOneIdele_same_normalizedCyclotomicZHatIdeleValue + K (Additive.toMul a) + refine ⟨b, ?_⟩ + simpa using hb + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicNormOneCorrection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicNormOneCorrection.lean new file mode 100644 index 0000000000..7dc9f19256 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicNormOneCorrection.lean @@ -0,0 +1,111 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ExtensionBehavior +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValue +public import Mathlib.Analysis.SpecialFunctions.Pow.NNReal +/-! +# Norm-one correction for the normalized cyclotomic idele value + +The positive archimedean section over `ℚ` gives the source term in the +cyclotomic norm-one reduction. After taking a positive +`[K : ℚ]`-th root of the absolute norm of an idele, scalar extension of +that section cancels the absolute norm. Its rational cyclotomic Artin +value is trivial, so the normalized value is unchanged. +-/ + +@[expose] public section + +open scoped NNReal NumberField +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +variable (K : Type) [Field K] [NumberField K] + +/-- Every idele has the same normalized cyclotomic value as an actual +norm-one idele. -/ +theorem + exists_normOneIdele_same_normalizedCyclotomicZHatIdeleValue + (a : IdeleGroup K) : + ∃ b : IdeleGroup.normOneSubgroup (K := K), + normalizedCyclotomicZHatIdeleValue K + (Additive.ofMul (b : IdeleGroup K)) = + normalizedCyclotomicZHatIdeleValue K + (Additive.ofMul a) := by + let d := Module.finrank ℚ K + have hd : d ≠ 0 := Module.finrank_pos.ne' + let r : ℝ≥0ˣ := IdeleGroup.absoluteNorm a + have hrpos : 0 < (r : ℝ≥0) := + pos_iff_ne_zero.mpr r.ne_zero + let s0 : ℝ≥0 := (r : ℝ≥0) ^ ((d : ℝ)⁻¹) + have hs0pos : 0 < s0 := by + exact NNReal.rpow_pos hrpos + let s : ℝ≥0ˣ := Units.mk0 s0 hs0pos.ne' + have hs_pow : s ^ d = r := by + apply Units.ext + change s0 ^ d = (r : ℝ≥0) + exact NNReal.rpow_inv_natCast_pow (r : ℝ≥0) hd + let c : IdeleGroup K := + relativeIdeleBaseChangeMulEquiv + (K := ℚ) (L := K) + (RelativeIdeleGroup.inclusion ℚ K + (rationalPositiveArchimedeanIdele s)) + have hc_absoluteNorm : + IdeleGroup.absoluteNorm c = r⁻¹ := by + change + IdeleGroup.absoluteNorm + (relativeIdeleBaseChangeMulEquiv + (K := ℚ) (L := K) + (RelativeIdeleGroup.inclusion ℚ K + (rationalPositiveArchimedeanIdele s))) = + r⁻¹ + rw [ + IdeleGroup.absoluteNorm_relativeIdeleBaseChange_inclusion_of_finite_eq_one + (L := K) (rationalPositiveArchimedeanIdele s) rfl, + rationalPositiveArchimedeanIdele_absoluteNorm, + inv_pow, hs_pow] + have hs_value : + rationalCyclotomicZHatIdeleValue + (rationalPositiveArchimedeanIdele s) = + 1 := by + rw [rationalCyclotomicZHatIdeleValue_apply, + rationalCyclotomicZHatGlobalArtin_rationalPositiveArchimedeanIdele, + map_one] + have hc_value : + normalizedCyclotomicZHatIdeleValue K + (Additive.ofMul c) = + 0 := by + change + normalizedCyclotomicZHatIdeleValue K + (Additive.ofMul + (relativeIdeleBaseChangeMulEquiv + (K := ℚ) (L := K) + (RelativeIdeleGroup.inclusion ℚ K + (rationalPositiveArchimedeanIdele s)))) = + 0 + rw [normalizedCyclotomicZHatIdeleValue_baseIdeleInclusion, + hs_value] + simp + refine ⟨⟨a * c, ?_⟩, ?_⟩ + · change IdeleGroup.absoluteNorm (a * c) = 1 + rw [map_mul, hc_absoluteNorm] + simp [r] + · change + normalizedCyclotomicZHatIdeleValue K + (Additive.ofMul a + Additive.ofMul c) = + normalizedCyclotomicZHatIdeleValue K + (Additive.ofMul a) + rw [map_add, hc_value, add_zero] + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicPrincipalIdele.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicPrincipalIdele.lean new file mode 100644 index 0000000000..c605f29900 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicPrincipalIdele.lean @@ -0,0 +1,946 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValue +/-! +# Principal ideles and the rational cyclotomic value + +This file isolates the part of the rational principal-idele product +formula which follows from the existing archimedean reciprocity API. +Every rational idele is split into its archimedean and finite parts. +The archimedean part has Artin image of order at most two at every +finite layer; the actual Galois group of the rational `ZHat`-extension +is torsion-free, so its image in that extension is trivial. + +Consequently the rational cyclotomic value of a principal idele is +exactly the value of its finite part. At every finite cyclotomic layer +that remaining value is the genuine finite product of the chosen local +Artin maps. Proving that product trivial requires a pointwise +compatibility theorem between the chosen finite-place Artin map and +the explicit cyclotomic action; no such compatibility is assumed here. +-/ + +@[expose] public section + +open scoped BigOperators NumberField IsMulCommutative +open NumberField IsDedekindDomain ClassFormation + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +-- Keep the prime-power presentation explicit for canonical instance synthesis. +-- Both structures are the existing canonical cyclotomic-level instances. +open scoped Classical in +local instance rationalCyclotomicPrimePowerNumberField + (p : Nat.Primes) (k : ℕ) : + NumberField + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) := + KummerTheory.rationalCyclotomicLevel_numberField + ⟨p.1 ^ k, pow_pos p.2.pos k⟩ + +attribute [local instance] rationalCyclotomicPrimePowerNumberField + +open scoped Classical in +local instance rationalCyclotomicPrimePowerIsGalois + (p : Nat.Primes) (k : ℕ) : + IsGalois ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) := + KummerTheory.rationalCyclotomicLevel_isGalois + ⟨p.1 ^ k, pow_pos p.2.pos k⟩ + +attribute [local instance] rationalCyclotomicPrimePowerIsGalois + +open scoped Classical in +local instance rationalCyclotomicPrimePowerIsAbelianGalois + (p : Nat.Primes) (k : ℕ) : + IsAbelianGalois ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) := + IsAbelianGalois.of_algHom + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩).val + +attribute [local instance] rationalCyclotomicPrimePowerIsAbelianGalois + +open scoped Classical in +/-- The prime subtype supplies the primality instance used at this local factor. -/ +local instance cyclotomicPrincipalIdelePrimeFact (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +attribute [local instance] cyclotomicPrincipalIdelePrimeFact + +open scoped Classical in +noncomputable local instance + cyclotomicPrincipalLevelIsAbelianGalois + (m : ℕ+) : + IsAbelianGalois ℚ + (KummerTheory.rationalCyclotomicLevel m) := by + have : IsGalois ℚ + (KummerTheory.rationalCyclotomicLevel m) := + inferInstance + let e := + IsCyclotomicExtension.Rat.galEquivZMod + (m : ℕ) (KummerTheory.rationalCyclotomicLevel m) + exact + { is_comm.comm σ τ := by + apply e.injective + simp only [map_mul] + exact mul_comm _ _ } + +attribute [local instance] cyclotomicPrincipalLevelIsAbelianGalois + +open scoped Classical in +/-- Every finite subextension of the rational cyclotomic closure is +contained in one of its internal finite cyclotomic levels. The proof +uses finite generation of the intermediate field together with the +divisibility-directed presentation of `ℚ(μ∞)`. -/ +theorem finiteSubfieldOfRationalCyclotomicField_le_level + (E : + IntermediateField ℚ + KummerTheory.rationalCyclotomicField) + [FiniteDimensional ℚ E] : + ∃ n : ℕ+, + E ≤ KummerTheory.rationalCyclotomicLevel n := by + classical + have hdirected : + Directed (· ≤ ·) + (KummerTheory.rationalCyclotomicLevel : + ℕ+ → + IntermediateField ℚ + KummerTheory.rationalCyclotomicField) := by + intro m n + refine ⟨m * n, ?_, ?_⟩ + · apply KummerTheory.rationalCyclotomicLevel_mono + exact ⟨(n : ℕ), rfl⟩ + · apply KummerTheory.rationalCyclotomicLevel_mono + exact ⟨(m : ℕ), by simp [Nat.mul_comm]⟩ + have helement : + ∀ x : KummerTheory.rationalCyclotomicField, + ∃ n : ℕ+, + x ∈ KummerTheory.rationalCyclotomicLevel n := by + intro x + have hx : + x ∈ + ⋃ n : ℕ+, + (KummerTheory.rationalCyclotomicLevel n : + Set KummerTheory.rationalCyclotomicField) := by + rw [← IntermediateField.coe_iSup_of_directed hdirected, + KummerTheory.iSup_rationalCyclotomicLevel] + exact Set.mem_univ x + rcases Set.mem_iUnion.mp hx with ⟨n, hn⟩ + exact ⟨n, hn⟩ + let levelIndex : + KummerTheory.rationalCyclotomicField → ℕ+ := + fun x => Classical.choose (helement x) + have hlevelIndex + (x : KummerTheory.rationalCyclotomicField) : + x ∈ + KummerTheory.rationalCyclotomicLevel + (levelIndex x) := + Classical.choose_spec (helement x) + have hmoduleFinite : E.toSubmodule.FG := + Submodule.FG.of_finite + have hfg : E.FG := + E.fg_of_fg_toSubalgebra + (Subalgebra.fg_of_fg_toSubmodule hmoduleFinite) + obtain ⟨s, hsFinite, hsE⟩ := + IntermediateField.fg_def.mp hfg + let t : Finset KummerTheory.rationalCyclotomicField := + hsFinite.toFinset + let N : ℕ := + ∏ x ∈ t, (levelIndex x : ℕ) + have hNpos : 0 < N := by + dsimp only [N] + exact Finset.prod_pos fun x _ => (levelIndex x).property + let n : ℕ+ := ⟨N, hNpos⟩ + refine ⟨n, ?_⟩ + rw [← hsE, IntermediateField.adjoin_le_iff] + intro x hx + have hxt : x ∈ t := by + simpa only [t, Set.Finite.mem_toFinset] using hx + have hdiv : + (levelIndex x : ℕ) ∣ (n : ℕ) := by + change + (levelIndex x : ℕ) ∣ + ∏ y ∈ t, (levelIndex y : ℕ) + exact + Finset.dvd_prod_of_mem + (fun y => (levelIndex y : ℕ)) hxt + exact + KummerTheory.rationalCyclotomicLevel_mono hdiv + (hlevelIndex x) + +open scoped Classical in +/-- Every finite Galois coordinate of the rational cyclotomic +`ZHat`-extension has a canonical image inside a finite internal +cyclotomic level. The image field is retained explicitly so that +restriction of actual global Artin automorphisms can be applied in a +scalar tower. -/ +theorem finiteSubfieldOfRationalCyclotomicZHatField_mapsIntoLevel + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + ∃ (n : ℕ+) + (F : + IntermediateField ℚ + KummerTheory.rationalCyclotomicField) + (_e : E ≃ₐ[ℚ] F), + F ≤ KummerTheory.rationalCyclotomicLevel n := by + let hfull : + rationalCyclotomicZHatField ≤ + KummerTheory.rationalCyclotomicField := + IntermediateField.lift_le + KummerTheory.rationalCyclotomicTorsionFixedField + let i : + rationalCyclotomicZHatField →ₐ[ℚ] + KummerTheory.rationalCyclotomicField := + IntermediateField.inclusion hfull + let F : + IntermediateField ℚ + KummerTheory.rationalCyclotomicField := + (E : IntermediateField ℚ + rationalCyclotomicZHatField).map i + let e : E ≃ₐ[ℚ] F := + IntermediateField.equivMap + (E : IntermediateField ℚ + rationalCyclotomicZHatField) i + let _ : FiniteDimensional ℚ F := + e.toLinearEquiv.finiteDimensional + obtain ⟨n, hn⟩ := + finiteSubfieldOfRationalCyclotomicField_le_level F + exact ⟨n, F, e, hn⟩ + +open scoped Classical in +/-- Restriction to the lifted torsion-free cyclotomic field commutes with its +canonical inclusion into the full rational cyclotomic field. Keeping this +pointwise compatibility separate prevents the finite-coordinate Artin +comparison below from accumulating the cost of unfolding the lift. -/ +private theorem rationalCyclotomicFullRestrictionToZHat_commutes + (σ : KummerTheory.rationalCyclotomicField ≃ₐ[ℚ] + KummerTheory.rationalCyclotomicField) + (x : rationalCyclotomicZHatField) : + (IntermediateField.inclusion + (IntermediateField.lift_le + KummerTheory.rationalCyclotomicTorsionFixedField)) + (rationalCyclotomicFullRestrictionToZHat σ x) = + σ + ((IntermediateField.inclusion + (IntermediateField.lift_le + KummerTheory.rationalCyclotomicTorsionFixedField)) x) := by + let T := KummerTheory.rationalCyclotomicTorsionFixedField + let hTZ : IntermediateField.lift T ≤ + KummerTheory.rationalCyclotomicField := + IntermediateField.lift_le T + let φ := IntermediateField.liftAlgEquiv T + let _ : Normal ℚ T := by + dsimp only [T] + exact KummerTheory.rationalCyclotomicTorsionFixedField_normal + let rσ : T ≃ₐ[ℚ] T := + AlgEquiv.restrictNormalHom T σ + change + (IntermediateField.inclusion hTZ) (φ.autCongr rσ x) = + σ ((IntermediateField.inclusion hTZ) x) + have hlift (y : T) : + (IntermediateField.inclusion hTZ) (φ y) = y.1 := by + apply Subtype.ext + rfl + have hinv : + ((φ.symm x : T) : KummerTheory.rationalCyclotomicField) = + (IntermediateField.inclusion hTZ) x := by + apply Subtype.ext + rfl + calc + (IntermediateField.inclusion hTZ) (φ.autCongr rσ x) = + (IntermediateField.inclusion hTZ) (φ (rσ (φ.symm x))) := by + rfl + _ = (rσ (φ.symm x) : T) := hlift _ + _ = σ ((φ.symm x : T) : + KummerTheory.rationalCyclotomicField) := by + exact AlgEquiv.restrictNormalHom_apply T σ (φ.symm x) + _ = σ ((IntermediateField.inclusion hTZ) x) := + congrArg σ hinv + +open scoped Classical in +/-- Restriction along the two sides of a commuting tower square gives the +same automorphism of the finite bottom field. Keeping the field types +abstract makes this a stable interface for concrete inverse-limit fields. -/ +private theorem restrictNormalHom_eq_of_commuting_square + (K E Z Ω : Type*) + [Field K] [Field E] [Field Z] [Field Ω] + [Algebra K E] [Algebra K Z] [Algebra K Ω] + [Algebra E Z] [Algebra E Ω] [Algebra Z Ω] + [IsScalarTower K E Z] [IsScalarTower K E Ω] + [IsScalarTower E Z Ω] + [Normal K E] + (τ : Z ≃ₐ[K] Z) (σ : Ω ≃ₐ[K] Ω) + (hcommutes : ∀ z : Z, + algebraMap Z Ω (τ z) = σ (algebraMap Z Ω z)) : + AlgEquiv.restrictNormalHom E τ = + AlgEquiv.restrictNormalHom E σ := by + apply AlgEquiv.ext + intro x + apply (algebraMap E Ω).injective + calc + algebraMap E Ω ((AlgEquiv.restrictNormalHom E τ) x) = + algebraMap Z Ω + (algebraMap E Z ((AlgEquiv.restrictNormalHom E τ) x)) := + IsScalarTower.algebraMap_apply E Z Ω _ + _ = algebraMap Z Ω (τ (algebraMap E Z x)) := + congrArg (algebraMap Z Ω) + (AlgEquiv.restrictNormal_commutes τ E x) + _ = σ (algebraMap Z Ω (algebraMap E Z x)) := + hcommutes _ + _ = σ (algebraMap E Ω x) := + congrArg σ (IsScalarTower.algebraMap_apply E Z Ω x).symm + _ = algebraMap E Ω ((AlgEquiv.restrictNormalHom E σ) x) := + (AlgEquiv.restrictNormal_commutes σ E x).symm + +open scoped Classical in +/-- The infinite Artin automorphism of the actual rational +`ZHat`-field is the restriction of the infinite Artin automorphism of +the full rational cyclotomic field. The statement uses the genuine +torsion-fixed subfield and its actual lift inside `SeparableClosure ℚ`. -/ +theorem rationalCyclotomicZHatGlobalArtin_eq_fullRestriction + (a : IdeleGroup ℚ) : + rationalCyclotomicZHatGlobalArtin a = + rationalCyclotomicFullRestrictionToZHat + (infiniteGlobalArtinMonoidHom + ℚ KummerTheory.rationalCyclotomicField a) := by + let hfull : + rationalCyclotomicZHatField ≤ + KummerTheory.rationalCyclotomicField := + IntermediateField.lift_le + KummerTheory.rationalCyclotomicTorsionFixedField + let i : + rationalCyclotomicZHatField →ₐ[ℚ] + KummerTheory.rationalCyclotomicField := + IntermediateField.inclusion hfull + apply + (InfiniteGalois.continuousMulEquivToLimit + ℚ rationalCyclotomicZHatField).injective + apply Subtype.ext + funext Eop + let E := Eop.unop + let hENumberField : NumberField E := + NumberField.of_module_finite ℚ E + let hEAbelian : IsAbelianGalois ℚ E := + IsAbelianGalois.of_algHom + (E : IntermediateField ℚ + rationalCyclotomicZHatField).val + let : NumberField E := hENumberField + let : IsAbelianGalois ℚ E := hEAbelian + let σ : KummerTheory.rationalCyclotomicField ≃ₐ[ℚ] + KummerTheory.rationalCyclotomicField := + infiniteGlobalArtinMonoidHom + ℚ KummerTheory.rationalCyclotomicField a + let j : E →ₐ[ℚ] KummerTheory.rationalCyclotomicField := + i.comp + (E : IntermediateField ℚ + rationalCyclotomicZHatField).val + let algZHatFull : Algebra rationalCyclotomicZHatField + KummerTheory.rationalCyclotomicField := + i.toRingHom.toAlgebra + let _ : SMul rationalCyclotomicZHatField + KummerTheory.rationalCyclotomicField := + @Algebra.toSMul rationalCyclotomicZHatField + KummerTheory.rationalCyclotomicField _ _ algZHatFull + let _ : Algebra rationalCyclotomicZHatField + KummerTheory.rationalCyclotomicField := + algZHatFull + let _ : IsScalarTower ℚ rationalCyclotomicZHatField + KummerTheory.rationalCyclotomicField := + IsScalarTower.of_algHom i + let algEFull : Algebra E + KummerTheory.rationalCyclotomicField := + j.toRingHom.toAlgebra + let _ : SMul E KummerTheory.rationalCyclotomicField := + @Algebra.toSMul E + KummerTheory.rationalCyclotomicField _ _ algEFull + let _ : Algebra E KummerTheory.rationalCyclotomicField := + algEFull + let _ : IsScalarTower ℚ E + KummerTheory.rationalCyclotomicField := + IsScalarTower.of_algHom j + let _ : IsScalarTower E rationalCyclotomicZHatField + KummerTheory.rationalCyclotomicField := + IsScalarTower.of_algebraMap_eq fun _ => rfl + have htransport : + AlgEquiv.restrictNormalHom E + (rationalCyclotomicFullRestrictionToZHat σ) = + AlgEquiv.restrictNormalHom E σ := by + apply restrictNormalHom_eq_of_commuting_square + ℚ E rationalCyclotomicZHatField + KummerTheory.rationalCyclotomicField + intro x + exact rationalCyclotomicFullRestrictionToZHat_commutes σ x + have hfullArtin : + AlgEquiv.restrictNormalHom E σ = + globalArtinMonoidHom (K := ℚ) (L := E) a := + restrictNormalHom_infiniteGlobalArtinMonoidHom_of_scalarTower + ℚ E KummerTheory.rationalCyclotomicField a + change + AlgEquiv.restrictNormalHom E + (rationalCyclotomicZHatGlobalArtin a) = + AlgEquiv.restrictNormalHom E + (rationalCyclotomicFullRestrictionToZHat + (infiniteGlobalArtinMonoidHom + ℚ KummerTheory.rationalCyclotomicField a)) + calc + AlgEquiv.restrictNormalHom E + (rationalCyclotomicZHatGlobalArtin a) = + globalArtinMonoidHom (K := ℚ) (L := E) a := + restrictNormalHom_rationalCyclotomicZHatGlobalArtin a E + _ = AlgEquiv.restrictNormalHom E σ := + hfullArtin.symm + _ = AlgEquiv.restrictNormalHom E + (rationalCyclotomicFullRestrictionToZHat σ) := + htransport.symm + +open scoped Classical in +/-- The rational cyclotomic idele value is the genuine torsion-free +factor of the full cyclotomic character of its infinite Artin symbol. -/ +theorem rationalCyclotomicZHatIdeleValue_eq_fullCharacterFreePart + (a : IdeleGroup ℚ) : + rationalCyclotomicZHatIdeleValue a = + (KummerTheory.zHatUnitsDecomposition + (KummerTheory.rationalCyclotomicCharacterContinuousMulEquiv + (infiniteGlobalArtinMonoidHom + ℚ KummerTheory.rationalCyclotomicField a))).1 := by + rw [rationalCyclotomicZHatIdeleValue_apply, + rationalCyclotomicZHatGlobalArtin_eq_fullRestriction, + rationalCyclotomicZHatFieldGalEquivZHat_fullRestriction] + +open scoped Classical in +/-- The archimedean part of a rational idele, with all finite +components replaced by one. -/ +def rationalIdeleArchimedeanPart + (a : IdeleGroup ℚ) : + IdeleGroup ℚ := + (a.1, 1) + +open scoped Classical in +/-- The finite part of a rational idele, with its archimedean +component replaced by one. -/ +def rationalIdeleFinitePart + (a : IdeleGroup ℚ) : + IdeleGroup ℚ := + (1, a.2) + +open scoped Classical in +/-- The archimedean part preserves every infinite component. -/ +theorem rationalIdeleArchimedeanPart_infiniteComponent + (a : IdeleGroup ℚ) + (v : InfinitePlace ℚ) : + IdeleGroup.infiniteComponent v + (rationalIdeleArchimedeanPart a) = + IdeleGroup.infiniteComponent v a := + rfl + +open scoped Classical in +/-- Every finite component of the archimedean part is one. -/ +theorem rationalIdeleArchimedeanPart_finiteComponent + (a : IdeleGroup ℚ) + (v : HeightOneSpectrum (𝓞 ℚ)) : + IdeleGroup.finiteComponent v + (rationalIdeleArchimedeanPart a) = + 1 := + rfl + +open scoped Classical in +/-- Every infinite component of the finite part is one. -/ +theorem rationalIdeleFinitePart_infiniteComponent + (a : IdeleGroup ℚ) + (v : InfinitePlace ℚ) : + IdeleGroup.infiniteComponent v + (rationalIdeleFinitePart a) = + 1 := + rfl + +open scoped Classical in +/-- The finite part preserves every finite component. -/ +theorem rationalIdeleFinitePart_finiteComponent + (a : IdeleGroup ℚ) + (v : HeightOneSpectrum (𝓞 ℚ)) : + IdeleGroup.finiteComponent v + (rationalIdeleFinitePart a) = + IdeleGroup.finiteComponent v a := + rfl + +open scoped Classical in +private theorem globalArtinMonoidHom_rationalIdeleFinitePart + {L : Type} + [Field L] [NumberField L] [Algebra ℚ L] + [IsAbelianGalois ℚ L] + (a : IdeleGroup ℚ) : + globalArtinMonoidHom (K := ℚ) (L := L) + (rationalIdeleFinitePart a) = + ∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + chosenFinitePlaceArtinMonoidHom + (K := ℚ) (L := L) v + (IdeleGroup.finiteComponent v a) := by + rw [globalArtinMonoidHom_apply, Fintype.prod_unique] + have harch (v : InfinitePlace ℚ) : + chosenInfinitePlaceArtinMonoidHom + (K := ℚ) (L := L) v + (IdeleGroup.infiniteComponent v + (rationalIdeleFinitePart a)) = + 1 := by + rw [rationalIdeleFinitePart_infiniteComponent, map_one] + have hfinite : + (∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + chosenFinitePlaceArtinMonoidHom + (K := ℚ) (L := L) v + (IdeleGroup.finiteComponent v + (rationalIdeleFinitePart a))) = + ∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + chosenFinitePlaceArtinMonoidHom + (K := ℚ) (L := L) v + (IdeleGroup.finiteComponent v a) := by + apply finprod_congr + intro v + rw [rationalIdeleFinitePart_finiteComponent] + rw [harch, one_mul, hfinite] + +open scoped Classical in +/-- The archimedean and finite parts multiply back to the original +rational idele. -/ +theorem rationalIdeleArchimedeanPart_mul_finitePart + (a : IdeleGroup ℚ) : + rationalIdeleArchimedeanPart a * + rationalIdeleFinitePart a = + a := by + ext <;> simp [rationalIdeleArchimedeanPart, + rationalIdeleFinitePart] + +open scoped Classical in +/-- At a finite abelian layer, the global Artin image of the +archimedean part of a rational idele has order at most two. -/ +theorem globalArtinMonoidHom_rationalIdeleArchimedeanPart_sq + {L : Type} + [Field L] [NumberField L] [Algebra ℚ L] + [IsAbelianGalois ℚ L] + (a : IdeleGroup ℚ) : + globalArtinMonoidHom + (K := ℚ) (L := L) + (rationalIdeleArchimedeanPart a) ^ 2 = + 1 := by + rw [globalArtinMonoidHom_apply, Fintype.prod_unique] + have hfinite : + (∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + chosenFinitePlaceArtinMonoidHom + (K := ℚ) (L := L) v + (IdeleGroup.finiteComponent v + (rationalIdeleArchimedeanPart a))) = + 1 := by + apply finprod_eq_one_of_forall_eq_one + intro v + rw [rationalIdeleArchimedeanPart_finiteComponent, + map_one] + rw [hfinite, mul_one] + rw [show (default : InfinitePlace ℚ) = Rat.infinitePlace by + exact Subsingleton.elim _ _] + rw [← map_pow] + apply + chosenInfinitePlaceArtinMonoidHom_eq_one_of_real_pos + (K := ℚ) (L := L) + Rat.infinitePlace Rat.isReal_infinitePlace + have hne : + InfinitePlace.Completion.ringEquivRealOfIsReal + Rat.isReal_infinitePlace + ((IdeleGroup.infiniteComponent + Rat.infinitePlace + (rationalIdeleArchimedeanPart a) : + Rat.infinitePlace.Completionˣ) : + Rat.infinitePlace.Completion) ≠ + 0 := by + exact + (map_ne_zero + (InfinitePlace.Completion.ringEquivRealOfIsReal + Rat.isReal_infinitePlace)).2 + (Units.ne_zero + (IdeleGroup.infiniteComponent + Rat.infinitePlace + (rationalIdeleArchimedeanPart a))) + simpa only [Units.val_pow_eq_pow_val, map_pow] using + sq_pos_of_ne_zero hne + +open scoped Classical in +/-- The actual rational `ZHat` Artin homomorphism kills every idele +supported at the archimedean place. The finite-layer images have +order at most two, while the inverse-limit Galois group is +torsion-free. -/ +@[simp] +theorem + rationalCyclotomicZHatGlobalArtin_rationalIdeleArchimedeanPart + (a : IdeleGroup ℚ) : + rationalCyclotomicZHatGlobalArtin + (rationalIdeleArchimedeanPart a) = + 1 := by + let _ + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + NumberField E := + NumberField.of_module_finite ℚ E + let _ + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsAbelianGalois ℚ E := + IsAbelianGalois.of_algHom E.toIntermediateField.val + have hsq : + rationalCyclotomicZHatGlobalArtin + (rationalIdeleArchimedeanPart a) ^ 2 = + 1 := by + have happly : + InfiniteGalois.continuousMulEquivToLimit + ℚ rationalCyclotomicZHatField + (rationalCyclotomicZHatGlobalArtin + (rationalIdeleArchimedeanPart a)) = + infiniteGlobalArtinToLimit + ℚ rationalCyclotomicZHatField + (rationalIdeleArchimedeanPart a) := by + exact + (InfiniteGalois.continuousMulEquivToLimit + ℚ rationalCyclotomicZHatField).apply_symm_apply _ + apply + (InfiniteGalois.continuousMulEquivToLimit + ℚ rationalCyclotomicZHatField).injective + rw [map_pow, happly, map_one] + apply Subtype.ext + funext E + exact + globalArtinMonoidHom_rationalIdeleArchimedeanPart_sq + (L := E.unop) a + exact + (pow_left_injective + (M := + rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField) + (n := 2) (by norm_num)) + (by simpa using hsq) + +open scoped Classical in +/-- The rational cyclotomic value kills the archimedean part of every +rational idele. -/ +theorem + rationalCyclotomicZHatIdeleValue_rationalIdeleArchimedeanPart + (a : IdeleGroup ℚ) : + rationalCyclotomicZHatIdeleValue + (rationalIdeleArchimedeanPart a) = + 1 := by + rw [rationalCyclotomicZHatIdeleValue_apply, + rationalCyclotomicZHatGlobalArtin_rationalIdeleArchimedeanPart, + map_one] + +open scoped Classical in +/-- The rational cyclotomic value depends only on the finite part of +an idele. -/ +theorem rationalCyclotomicZHatIdeleValue_eq_finitePart + (a : IdeleGroup ℚ) : + rationalCyclotomicZHatIdeleValue a = + rationalCyclotomicZHatIdeleValue + (rationalIdeleFinitePart a) := by + calc + rationalCyclotomicZHatIdeleValue a = + rationalCyclotomicZHatIdeleValue + (rationalIdeleArchimedeanPart a * + rationalIdeleFinitePart a) := + congrArg rationalCyclotomicZHatIdeleValue + (rationalIdeleArchimedeanPart_mul_finitePart a).symm + _ = rationalCyclotomicZHatIdeleValue + (rationalIdeleArchimedeanPart a) * + rationalCyclotomicZHatIdeleValue + (rationalIdeleFinitePart a) := + (rationalCyclotomicZHatIdeleValue).map_mul _ _ + _ = rationalCyclotomicZHatIdeleValue + (rationalIdeleFinitePart a) := by + rw [ + rationalCyclotomicZHatIdeleValue_rationalIdeleArchimedeanPart, + one_mul] + +open scoped Classical in +/-- Restriction of the infinite Artin symbol to a concrete prime-power +cyclotomic level is its finite global Artin symbol. -/ +private theorem rationalCyclotomicGlobalArtin_restrict_primePowerLevel + (a : IdeleGroup ℚ) (p : Nat.Primes) (k : ℕ) : + AlgEquiv.restrictNormalHom + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (infiniteGlobalArtinMonoidHom + ℚ KummerTheory.rationalCyclotomicField a) = + globalArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + a := by + exact + restrictNormalHom_infiniteGlobalArtinMonoidHom_intermediateField + ℚ KummerTheory.rationalCyclotomicField a + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + +open scoped Classical in +/-- Applying the prime-power cyclotomic character to a finite projection of +the infinite Artin symbol gives the finite global Artin symbol. This is kept +separate from character evaluation so both dependent comparisons elaborate +within the default heartbeat budget. -/ +private theorem rationalCyclotomicGlobalArtin_projection_toZModPow + (a : IdeleGroup ℚ) (p : Nat.Primes) (k : ℕ) : + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + ((infiniteGlobalArtinMonoidHom + ℚ KummerTheory.rationalCyclotomicField a).restrictNormal + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩)) = + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (globalArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + a) := by + exact + congrArg + (IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨p.1 ^ k, pow_pos p.2.pos k⟩)) + (rationalCyclotomicGlobalArtin_restrict_primePowerLevel a p k) + +open scoped Classical in +/-- Evaluating the actual infinite global Artin symbol in the full +rational cyclotomic extension at the `p ^ k` cyclotomic character is +exactly the finite global Artin symbol at the internal `p ^ k`-th +cyclotomic level. This is the field-theoretic bridge from the inverse +limit Artin map to the explicit cyclotomic character. -/ +theorem rationalCyclotomicGlobalArtin_character_toZModPow + (a : IdeleGroup ℚ) (p : Nat.Primes) (k : ℕ) : + Units.map (PadicInt.toZModPow k).toMonoidHom + (KummerTheory.rationalCyclotomicCharacterPrimeProduct + (infiniteGlobalArtinMonoidHom + ℚ KummerTheory.rationalCyclotomicField a) p) = + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (globalArtinMonoidHom + (K := ℚ) + (L := + KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + a) := by + exact + (KummerTheory.rationalCyclotomicCharacterPrimeProduct_toZModPow + (infiniteGlobalArtinMonoidHom + ℚ KummerTheory.rationalCyclotomicField a) p k).trans + (rationalCyclotomicGlobalArtin_projection_toZModPow a p k) + +open scoped Classical in +/-- After removing the archimedean component, the `p ^ k` coordinate +of the full rational cyclotomic Artin character is the genuine finite +product of the chosen finite-place Artin maps. -/ +theorem rationalCyclotomicGlobalArtin_character_toZModPow_finitePart + (a : IdeleGroup ℚ) (p : Nat.Primes) (k : ℕ) : + Units.map (PadicInt.toZModPow k).toMonoidHom + (KummerTheory.rationalCyclotomicCharacterPrimeProduct + (infiniteGlobalArtinMonoidHom + ℚ KummerTheory.rationalCyclotomicField + (rationalIdeleFinitePart a)) p) = + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := + KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + v + (IdeleGroup.finiteComponent v a)) := by + rw [ + rationalCyclotomicGlobalArtin_character_toZModPow, + globalArtinMonoidHom_rationalIdeleFinitePart] + +open scoped Classical in +/-- The finite-part cyclotomic character is the `finprod` of the +actual chosen local Artin characters. This is the pointwise form into +which the p-adic unit formula and the unramified Frobenius formula +substitute directly. -/ +theorem + rationalCyclotomicGlobalArtin_character_toZModPow_finitePart_eq_finprod + (a : IdeleGroup ℚ) (p : Nat.Primes) (k : ℕ) : + Units.map (PadicInt.toZModPow k).toMonoidHom + (KummerTheory.rationalCyclotomicCharacterPrimeProduct + (infiniteGlobalArtinMonoidHom + ℚ KummerTheory.rationalCyclotomicField + (rationalIdeleFinitePart a)) p) = + ∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := + KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + v + (IdeleGroup.finiteComponent v a)) := by + rw [rationalCyclotomicGlobalArtin_character_toZModPow_finitePart] + exact + MonoidHom.map_finprod + (IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨p.1 ^ k, pow_pos p.2.pos k⟩)).toMonoidHom + (finitePlaceArtinFactors_hasFiniteMulSupport + (K := ℚ) + (L := + KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + a) + +open scoped Classical in +/-- Principal-idele evaluation reduced to its genuine finite local +part. -/ +theorem + rationalCyclotomicZHatIdeleValue_principalIdele_eq_finitePart + (x : ℚˣ) : + rationalCyclotomicZHatIdeleValue + (IdeleGroup.principalIdele ℚ x) = + rationalCyclotomicZHatIdeleValue + (rationalIdeleFinitePart + (IdeleGroup.principalIdele ℚ x)) := + rationalCyclotomicZHatIdeleValue_eq_finitePart + (IdeleGroup.principalIdele ℚ x) + +open scoped Classical in +/-- At a finite cyclotomic layer, the Artin image of the finite part +of a rational idele is exactly the finite product of the chosen local +Artin symbols. -/ +theorem + restrictNormalHom_rationalCyclotomicZHatGlobalArtin_finitePart + (a : IdeleGroup ℚ) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + letI : NumberField E := + NumberField.of_module_finite ℚ E + letI : IsAbelianGalois ℚ E := + IsAbelianGalois.of_algHom E.toIntermediateField.val + AlgEquiv.restrictNormalHom E + (rationalCyclotomicZHatGlobalArtin + (rationalIdeleFinitePart a)) = + ∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + chosenFinitePlaceArtinMonoidHom + (K := ℚ) (L := E) v + (IdeleGroup.finiteComponent v a) := by + let hE : NumberField E := + NumberField.of_module_finite ℚ E + let hAbelian : IsAbelianGalois ℚ E := + IsAbelianGalois.of_algHom E.toIntermediateField.val + let _ : NumberField E := hE + let _ : IsAbelianGalois ℚ E := hAbelian + exact + (restrictNormalHom_rationalCyclotomicZHatGlobalArtin_of_structures + (rationalIdeleFinitePart a) E hE hAbelian).trans + (globalArtinMonoidHom_rationalIdeleFinitePart + (L := E) a) + +open scoped Classical in +/-- The unnormalized value on a principal idele over a number field +is the rational cyclotomic value of the finite part of its field-norm +principal idele. -/ +theorem cyclotomicZHatNormComposite_principalIdele_eq_finitePart + (K : Type) [Field K] [NumberField K] + (x : Kˣ) : + cyclotomicZHatNormComposite K + (Additive.ofMul + (IdeleGroup.principalIdele K x)) = + Multiplicative.toAdd + (rationalCyclotomicZHatIdeleValue + (rationalIdeleFinitePart + (IdeleGroup.principalIdele ℚ + (Units.map (Algebra.norm ℚ) x)))) := by + rw [cyclotomicZHatNormComposite_apply, + IdeleGroup.norm_principalIdele, + rationalCyclotomicZHatIdeleValue_principalIdele_eq_finitePart] + +open scoped Classical in +/-- Normalized principal-idele vanishing is equivalent to the +remaining rational finite-part product formula. Thus the only missing +input for descent to the idele class group is the finite local +cyclotomic compatibility, not an archimedean calculation. -/ +theorem + normalizedCyclotomicZHatIdeleValue_principalIdele_eq_zero_iff_finitePart + (K : Type) [Field K] [NumberField K] + (x : Kˣ) : + normalizedCyclotomicZHatIdeleValue K + (Additive.ofMul + (IdeleGroup.principalIdele K x)) = + 0 ↔ + rationalCyclotomicZHatIdeleValue + (rationalIdeleFinitePart + (IdeleGroup.principalIdele ℚ + (Units.map (Algebra.norm ℚ) x))) = + 1 := by + constructor + · intro hzero + have hnormalize := + cyclotomicZHatIntersectionDegree_nsmul_normalizedIdeleValue + K + (Additive.ofMul + (IdeleGroup.principalIdele K x)) + rw [hzero, smul_zero, + cyclotomicZHatNormComposite_principalIdele_eq_finitePart] + at hnormalize + simpa using hnormalize.symm + · intro hfinite + apply + zHatMulNat_injective + (cyclotomicZHatIntersectionDegree_pos K) + rw [zHatMulNat_apply, zHatMulNat_apply, + cyclotomicZHatIntersectionDegree_nsmul_normalizedIdeleValue, + cyclotomicZHatNormComposite_principalIdele_eq_finitePart, + hfinite, smul_zero] + rfl + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicTorsionFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicTorsionFixedField.lean new file mode 100644 index 0000000000..42f6a96849 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicTorsionFixedField.lean @@ -0,0 +1,175 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicTorsionField +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacterEquiv +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Basic +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Local +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteFree +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Gather +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Swap +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Decomposition +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.DenseTorsion +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientEquiv +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientMk +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.CyclotomicQuotient +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FreeCoordinate +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteOrder +/-! +# The cyclotomic torsion fixed field + +`rationalCyclotomicField` now denotes the actual field `ℚ(μ∞)` inside +`SeparableClosure ℚ`. Its actual Galois group is therefore the standard +mathlib type +`rationalCyclotomicField ≃ₐ[ℚ] rationalCyclotomicField`; its finite +cyclotomic levels form a divisibility-directed system with supremum the +whole field. The torsion fixed field is the actual +intermediate field `rationalCyclotomicTorsionFixedField`. + +The actual continuous cyclotomic character identifies the full Galois +group with `ℤ̂ˣ`. Applying infinite Galois correspondence to the actual +torsion closure and the group-theoretic decomposition of `ℤ̂ˣ` gives the +cyclotomic `ℤ̂`-extension. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + continuousMulEquivOfCompactToT2 → + continuousMulEquivOfCompactToT2 + + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open scoped IsMulCommutative +open KummerTheory +open ClassFormation + +/-- Restriction identifies the torsion quotient of the cyclotomic Galois group with the +Galois group of its torsion fixed field, with their Krull topologies. -/ +noncomputable def rationalCyclotomicTorsionRestrictionEquiv : + (rationalCyclotomicField ≃ₐ[ℚ] + rationalCyclotomicField) ⧸ + rationalCyclotomicTorsionClosure.toSubgroup ≃ₜ* + (rationalCyclotomicTorsionFixedField ≃ₐ[ℚ] + rationalCyclotomicTorsionFixedField) := by + let _ : T2Space + (rationalCyclotomicTorsionFixedField ≃ₐ[ℚ] + rationalCyclotomicTorsionFixedField) := + krullTopology_t2 + exact + continuousMulEquivOfCompactToT2 + (InfiniteGalois.normalAutEquivQuotient + (k := ℚ) (K := rationalCyclotomicField) + rationalCyclotomicTorsionClosure) + (by + rw [← + QuotientGroup.isOpenQuotientMap_mk.continuous_comp_iff] + exact + InfiniteGalois.restrictNormalHom_continuous + rationalCyclotomicTorsionFixedField) + +/-- The Galois group of the actual torsion fixed field in +`ℚ(μ∞)` is the additive group of the profinite integers, written +multiplicatively. -/ +noncomputable def rationalCyclotomicTorsionFixedFieldGalEquivZHat : + (rationalCyclotomicTorsionFixedField ≃ₐ[ℚ] + rationalCyclotomicTorsionFixedField) ≃ₜ* + Multiplicative ZHat := by + exact rationalCyclotomicTorsionRestrictionEquiv.symm.trans <| + torsionQuotientEquivOfZHatMulDecomposition + (rationalCyclotomicField ≃ₐ[ℚ] + rationalCyclotomicField) + CyclotomicFinitePart + (rationalCyclotomicCharacterContinuousMulEquiv.trans + zHatUnitsDecomposition) + dense_torsion_cyclotomicFinitePart + +private theorem rationalCyclotomicTorsionRestrictionEquiv_apply_mk + (σ : + rationalCyclotomicField ≃ₐ[ℚ] + rationalCyclotomicField) : + rationalCyclotomicTorsionRestrictionEquiv + (QuotientGroup.mk σ) = + AlgEquiv.restrictNormalHom + rationalCyclotomicTorsionFixedField σ := by + exact + InfiniteGalois.normalAutEquivQuotient_apply + rationalCyclotomicTorsionClosure σ + +private theorem rationalCyclotomicTorsionRestrictionEquiv_symm_restrictNormal + (σ : + rationalCyclotomicField ≃ₐ[ℚ] + rationalCyclotomicField) : + rationalCyclotomicTorsionRestrictionEquiv.symm + (AlgEquiv.restrictNormalHom + rationalCyclotomicTorsionFixedField σ) = + QuotientGroup.mk σ := by + apply rationalCyclotomicTorsionRestrictionEquiv.symm_apply_eq.mpr + exact (rationalCyclotomicTorsionRestrictionEquiv_apply_mk σ).symm + +private theorem rationalCyclotomicTorsionCoordinate_restrictNormal + (σ : + rationalCyclotomicField ≃ₐ[ℚ] + rationalCyclotomicField) : + torsionQuotientEquivOfZHatMulDecomposition + (rationalCyclotomicField ≃ₐ[ℚ] + rationalCyclotomicField) + CyclotomicFinitePart + (rationalCyclotomicCharacterContinuousMulEquiv.trans + zHatUnitsDecomposition) + dense_torsion_cyclotomicFinitePart + (rationalCyclotomicTorsionRestrictionEquiv.symm + (AlgEquiv.restrictNormalHom + rationalCyclotomicTorsionFixedField σ)) = + (zHatUnitsDecomposition + (rationalCyclotomicCharacterContinuousMulEquiv σ)).1 := by + rw [rationalCyclotomicTorsionRestrictionEquiv_symm_restrictNormal] + exact + torsionQuotientEquivOfZHatMulDecomposition_mk + (rationalCyclotomicField ≃ₐ[ℚ] rationalCyclotomicField) + CyclotomicFinitePart + (rationalCyclotomicCharacterContinuousMulEquiv.trans + zHatUnitsDecomposition) + dense_torsion_cyclotomicFinitePart σ + +/-- Restriction of an actual automorphism of the full rational +cyclotomic field to the torsion fixed field is sent to the genuine +torsion-free coordinate of its cyclotomic character. -/ +@[simp] +theorem + rationalCyclotomicTorsionFixedFieldGalEquivZHat_restrictNormal + (σ : + rationalCyclotomicField ≃ₐ[ℚ] + rationalCyclotomicField) : + rationalCyclotomicTorsionFixedFieldGalEquivZHat + (AlgEquiv.restrictNormalHom + rationalCyclotomicTorsionFixedField σ) = + (zHatUnitsDecomposition + (rationalCyclotomicCharacterContinuousMulEquiv σ)).1 := by + change + torsionQuotientEquivOfZHatMulDecomposition + (rationalCyclotomicField ≃ₐ[ℚ] + rationalCyclotomicField) + CyclotomicFinitePart + (rationalCyclotomicCharacterContinuousMulEquiv.trans + zHatUnitsDecomposition) + dense_torsion_cyclotomicFinitePart + (rationalCyclotomicTorsionRestrictionEquiv.symm + (AlgEquiv.restrictNormalHom + rationalCyclotomicTorsionFixedField σ)) = + (zHatUnitsDecomposition + (rationalCyclotomicCharacterContinuousMulEquiv σ)).1 + exact rationalCyclotomicTorsionCoordinate_restrictNormal σ + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean new file mode 100644 index 0000000000..71b46b4549 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean @@ -0,0 +1,944 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedRestriction +/-! +# Geometric restriction from the cyclotomic unramified field + +An abstractly unramified finite abelian subextension is contained in the +actual cyclotomic maximal-unramified fixed field. This file realizes that +containment as an algebra tower and proves that the finite restriction +defined on quotient presentations is literally restriction of field +automorphisms. + +The field-range form of the finite layer is also bundled in the finite +Galois inverse system. Consequently the geometric restriction of the +infinite global Artin map is the ordinary finite global Artin map. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open GlobalClassFields +open KummerTheory +open LocalClassFieldTheory + +/-- The rational separable closure uses the canonical rational algebra structure of a division +ring. -/ +@[reducible] +noncomputable local instance + cyclotomicUnramifiedGeometricRationalSeparableClosureAlgebra : + Algebra ℚ (SeparableClosure ℚ) := + DivisionRing.toRatAlgebra + +local instance cyclotomicUnramifiedGeometricBaseQuotientFinite + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + H.field (le_baseField H.field)) := + H.finite + +local instance cyclotomicUnramifiedGeometricRelativeQuotientFinite + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) : + Finite + (H.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + H.field L.field L.below) := + L.finite + +noncomputable local instance + cyclotomicUnramifiedGeometricBaseFiniteDimensional + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) H.field) := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + +noncomputable local instance + cyclotomicUnramifiedGeometricRelativeFiniteDimensional + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) : + FiniteDimensional + (abstractFixedField ℚ (SeparableClosure ℚ) H.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) := + finiteAbelianSubextensionAbstractRelativeFixedFieldFiniteDimensional L + +local instance + cyclotomicUnramifiedGeometricRelativeScalarTower + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) : + IsScalarTower ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) H.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) := + IsScalarTower.of_algebraMap_eq' rfl + +noncomputable local instance + cyclotomicUnramifiedGeometricRelativeAbsoluteFiniteDimensional + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) : + FiniteDimensional ℚ + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) := + FiniteDimensional.trans ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) H.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) + +noncomputable local instance + cyclotomicUnramifiedGeometricBaseNumberField + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + NumberField + (abstractFixedField ℚ (SeparableClosure ℚ) H.field) := + NumberField.of_module_finite ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) H.field) + +noncomputable local instance + cyclotomicUnramifiedGeometricRelativeNumberField + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) : + NumberField + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) := + NumberField.of_module_finite ℚ + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) + +noncomputable local instance + cyclotomicUnramifiedGeometricRelativeIsAbelianGalois + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) : + IsAbelianGalois + (abstractFixedField ℚ (SeparableClosure ℚ) H.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) := + finiteAbelianSubextensionAbstractRelativeFixedFieldIsAbelianGalois L + +noncomputable local instance + cyclotomicUnramifiedGeometricRelativeNormal + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) : + Normal + (abstractFixedField ℚ (SeparableClosure ℚ) H.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) := + (cyclotomicUnramifiedGeometricRelativeIsAbelianGalois + H L).toIsGalois.to_normal + +noncomputable local instance + cyclotomicUnramifiedGeometricMaximalIsAbelianGalois + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + IsAbelianGalois + (abstractFixedField ℚ (SeparableClosure ℚ) H.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field)) := + abstractFixedFieldCyclotomic_isAbelianGalois H + +/-- An unramified finite fixed field lies in the cyclotomic +maximal-unramified fixed field. -/ +theorem abstractFixedFieldCyclotomicFiniteUnramifiedField_le + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) + (hUnramified : + L.toFiniteGaloisExtension.IsUnramified + rationalCyclotomicDegreeData) : + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below ≤ + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) := by + apply abstractFixedField_le + exact + (L.toFiniteGaloisExtension.isUnramified_iff_inertia_le + rationalCyclotomicDegreeData).1 hUnramified + +/-- The actual inclusion of an unramified finite fixed field into the +cyclotomic maximal-unramified field, over the common fixed base. -/ +noncomputable def + abstractFixedFieldCyclotomicFiniteUnramifiedInclusion + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) + (hUnramified : + L.toFiniteGaloisExtension.IsUnramified + rationalCyclotomicDegreeData) : + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + let U := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) + E →ₐ[F] U := by + dsimp only + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + let U := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) + let j : E →ₐ[ℚ] U := + IntermediateField.inclusion + (abstractFixedFieldCyclotomicFiniteUnramifiedField_le + H L hUnramified) + exact + { j.toRingHom with + commutes' := fun _ => by + apply Subtype.ext + rfl } + +/-- The algebra structure induced by the geometric inclusion of the +finite unramified fixed field into the cyclotomic maximal-unramified +field. -/ +@[implicit_reducible] +noncomputable def + abstractFixedFieldCyclotomicFiniteUnramifiedInclusionAlgebra + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) + (hUnramified : + L.toFiniteGaloisExtension.IsUnramified + rationalCyclotomicDegreeData) : + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + let U := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) + Algebra E U := + (abstractFixedFieldCyclotomicFiniteUnramifiedInclusion + H L hUnramified).toRingHom.toAlgebra + +/-- The scalar action belonging to the inclusion-induced algebra +structure. Naming it prevents typeclass search from exploring the +unrelated intermediate-field algebra paths. -/ +@[implicit_reducible] +noncomputable def + abstractFixedFieldCyclotomicFiniteUnramifiedInclusionSMul + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) + (hUnramified : + L.toFiniteGaloisExtension.IsUnramified + rationalCyclotomicDegreeData) : + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + let U := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) + SMul E U := + Algebra.toSMul + (self := + abstractFixedFieldCyclotomicFiniteUnramifiedInclusionAlgebra + H L hUnramified) + +/-- The scalar tower induced by the same geometric inclusion. This +single construction is reused by restriction and Artin compatibility. -/ +theorem + abstractFixedFieldCyclotomicFiniteUnramifiedInclusionScalarTower + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) + (hUnramified : + L.toFiniteGaloisExtension.IsUnramified + rationalCyclotomicDegreeData) : + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + let U := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) + letI _ : Algebra E U := + abstractFixedFieldCyclotomicFiniteUnramifiedInclusionAlgebra + H L hUnramified + letI _ : SMul E U := + abstractFixedFieldCyclotomicFiniteUnramifiedInclusionSMul + H L hUnramified + IsScalarTower F E U := by + dsimp only + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + let U := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) + let _ : Algebra E U := + abstractFixedFieldCyclotomicFiniteUnramifiedInclusionAlgebra + H L hUnramified + let _ : SMul E U := + abstractFixedFieldCyclotomicFiniteUnramifiedInclusionSMul + H L hUnramified + exact IsScalarTower.of_algHom + (abstractFixedFieldCyclotomicFiniteUnramifiedInclusion + H L hUnramified) + +/-- Normality of the extension subgroup defining the cyclotomic +maximal-unramified layer. Naming it keeps the quotient equivalence and +its evaluation lemma on the same proof parameter. -/ +private instance cyclotomicUnramifiedGeometricMaxExtensionNormal + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + (CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + (rationalCyclotomicFieldInertia_le H.field)).Normal := + (extensionSubgroup_rationalCyclotomicFieldInertia H.field).symm ▸ + DegreeData.fieldInertiaWithin_normal + rationalCyclotomicDegreeData H.field + +/-- The quotient presentation of the cyclotomic maximal-unramified +Galois group used by geometric restriction. -/ +private noncomputable abbrev + cyclotomicUnramifiedGeometricMaxQuotientEquiv + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + H.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + (rationalCyclotomicFieldInertia_le H.field) ≃* + Gal(abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field)/abstractFixedField ℚ (SeparableClosure + ℚ) H.field) := + LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + (rationalCyclotomicFieldInertia_le H.field) + (cyclotomicUnramifiedGeometricMaxExtensionNormal H) + +/-- The equality of the two inertia subgroups, bundled once as the +quotient equivalence used by geometric restriction. -/ +private noncomputable abbrev + cyclotomicUnramifiedGeometricInertiaQuotientEquiv + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + H.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + (rationalCyclotomicFieldInertia_le H.field) ≃* + H.field.toSubgroup ⧸ + rationalCyclotomicDegreeData.fieldInertiaWithin H.field := + by + letI maxExtensionNormal : + (CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + (rationalCyclotomicFieldInertia_le H.field)).Normal := + cyclotomicUnramifiedGeometricMaxExtensionNormal H + exact @QuotientGroup.quotientMulEquivOfEq + _ _ _ _ maxExtensionNormal + (DegreeData.fieldInertiaWithin_normal + rationalCyclotomicDegreeData H.field) + (extensionSubgroup_rationalCyclotomicFieldInertia H.field) + +/-- The quotient presentation of the finite fixed-field Galois group +used throughout the geometric comparison. -/ +private noncomputable abbrev + cyclotomicUnramifiedGeometricFiniteQuotientEquiv + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) : + L.toFiniteGaloisExtension.extensionQuotient ≃* + Gal(abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below/abstractFixedField ℚ (SeparableClosure ℚ) H.field) := + L.toFiniteGaloisExtension.extensionQuotientMulEquiv.trans + (LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) + H.field L.field L.below L.normal) + +/-- The finite restriction in the geometric quotient coordinate. -/ +private theorem cyclotomicUnramifiedGeometricRestriction_apply + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) + (hUnramified : + L.toFiniteGaloisExtension.IsUnramified rationalCyclotomicDegreeData) + (σ : Gal(abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field)/abstractFixedField ℚ (SeparableClosure ℚ) + H.field)) : + abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom + H L hUnramified σ = + (L.toFiniteGaloisExtension.extensionQuotientMulEquiv.trans + (LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) + H.field L.field L.below L.normal)) + (DegreeData.finiteUnramifiedRestriction + rationalCyclotomicDegreeData + (H.toFiniteResidueAbstractField rationalCyclotomicDegreeData) + L.toFiniteGaloisExtension hUnramified + ((cyclotomicUnramifiedGeometricInertiaQuotientEquiv H) + ((cyclotomicUnramifiedGeometricMaxQuotientEquiv H).symm σ))) := by + let qMax := cyclotomicUnramifiedGeometricMaxQuotientEquiv H + let qInertia := cyclotomicUnramifiedGeometricInertiaQuotientEquiv H + let degreeEquiv := + rationalCyclotomicDegreeData.maximalUnramifiedDegreeEquiv + (H.toFiniteResidueAbstractField rationalCyclotomicDegreeData) + let finiteRestriction := + DegreeData.finiteUnramifiedRestriction + rationalCyclotomicDegreeData + (H.toFiniteResidueAbstractField rationalCyclotomicDegreeData) + L.toFiniteGaloisExtension hUnramified + have hCoordinate := + abstractFixedFieldCyclotomicGalEquivZHat_quotientClass H + (qInertia (qMax.symm σ)) + have hCoordinate' : + abstractFixedFieldCyclotomicGalEquivZHat H σ = + degreeEquiv (qInertia (qMax.symm σ)) := by + change + abstractFixedFieldCyclotomicGalEquivZHat H + (qMax (qInertia.symm (qInertia (qMax.symm σ)))) = + degreeEquiv (qInertia (qMax.symm σ)) at hCoordinate + rw [qInertia.symm_apply_apply] at hCoordinate + exact (congrArg (abstractFixedFieldCyclotomicGalEquivZHat H) + (qMax.apply_symm_apply σ)).symm.trans hCoordinate + have hArg : + degreeEquiv.symm + (abstractFixedFieldCyclotomicGalEquivZHat H σ) = + qInertia (qMax.symm σ) := + (congrArg degreeEquiv.symm hCoordinate').trans + (degreeEquiv.symm_apply_apply _) + calc + _ = (L.toFiniteGaloisExtension.extensionQuotientMulEquiv.trans + (LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) + H.field L.field L.below L.normal)) + (finiteRestriction + (degreeEquiv.symm + (abstractFixedFieldCyclotomicGalEquivZHat H σ))) := + abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom_apply + H L hUnramified σ + _ = _ := + congrArg + (fun q => + (L.toFiniteGaloisExtension.extensionQuotientMulEquiv.trans + (LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) + H.field L.field L.below L.normal)) + (finiteRestriction q)) hArg + +/-- On a representative of the maximal-unramified quotient, finite +restriction is restriction of the corresponding field automorphism. -/ +private theorem cyclotomicUnramifiedGeometricRestriction_mk + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) + (hUnramified : + L.toFiniteGaloisExtension.IsUnramified rationalCyclotomicDegreeData) + (τ : H.field.toSubgroup) : + let F := abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) L.below + let U := abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) + letI _ : Algebra E U := + abstractFixedFieldCyclotomicFiniteUnramifiedInclusionAlgebra + H L hUnramified + letI _ : @IsScalarTower F E U + Algebra.toSMul Algebra.toSMul Algebra.toSMul := + IsScalarTower.of_algHom + (abstractFixedFieldCyclotomicFiniteUnramifiedInclusion + H L hUnramified) + (cyclotomicUnramifiedGeometricFiniteQuotientEquiv H L) + (DegreeData.finiteUnramifiedRestriction + rationalCyclotomicDegreeData + (H.toFiniteResidueAbstractField rationalCyclotomicDegreeData) + L.toFiniteGaloisExtension hUnramified + ((cyclotomicUnramifiedGeometricInertiaQuotientEquiv H) + (QuotientGroup.mk τ))) = + AlgEquiv.restrictNormalHom E + ((cyclotomicUnramifiedGeometricMaxQuotientEquiv H) + (QuotientGroup.mk τ)) := by + dsimp only + let F := abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) L.below + let hI := rationalCyclotomicFieldInertia_le H.field + let U := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hI + let _ : Algebra E U := + abstractFixedFieldCyclotomicFiniteUnramifiedInclusionAlgebra + H L hUnramified + let _ : @IsScalarTower F E U + Algebra.toSMul Algebra.toSMul Algebra.toSMul := + IsScalarTower.of_algHom + (abstractFixedFieldCyclotomicFiniteUnramifiedInclusion + H L hUnramified) + let qMax := cyclotomicUnramifiedGeometricMaxQuotientEquiv H + let qInertia := cyclotomicUnramifiedGeometricInertiaQuotientEquiv H + let qFinite := cyclotomicUnramifiedGeometricFiniteQuotientEquiv H L + let finiteRestriction := + DegreeData.finiteUnramifiedRestriction + rationalCyclotomicDegreeData + (H.toFiniteResidueAbstractField rationalCyclotomicDegreeData) + L.toFiniteGaloisExtension hUnramified + have hInertia : + qInertia (QuotientGroup.mk τ) = + (QuotientGroup.mk τ : + H.field.toSubgroup ⧸ + rationalCyclotomicDegreeData.fieldInertiaWithin H.field) := + QuotientGroup.quotientMulEquivOfEq_mk + (extensionSubgroup_rationalCyclotomicFieldInertia H.field) τ + refine (congrArg (fun z => qFinite (finiteRestriction z)) hInertia).trans ?_ + have hFiniteRestriction := + DegreeData.finiteUnramifiedRestriction_mk + rationalCyclotomicDegreeData + (H.toFiniteResidueAbstractField rationalCyclotomicDegreeData) + L.toFiniteGaloisExtension hUnramified τ + refine (congrArg qFinite hFiniteRestriction).trans ?_ + apply AlgEquiv.ext + intro x + apply Subtype.ext + have hE := + LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup_mk_apply_val + ℚ (SeparableClosure ℚ) + H.field L.field L.below L.normal τ x + have hU := + LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup_mk_apply_val + ℚ (SeparableClosure ℚ) + H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + hI (cyclotomicUnramifiedGeometricMaxExtensionNormal H) τ + (algebraMap E U x) + change + τ.1 ((algebraMap E U x : U).1) = + (qMax (QuotientGroup.mk τ) (algebraMap E U x)).1 at hU + have hInclusion : + ((algebraMap E U x : U) : SeparableClosure ℚ) = + (x : SeparableClosure ℚ) := + rfl + have hτ := congrArg + (fun y : SeparableClosure ℚ => τ.1 y) hInclusion.symm + have hRestrict := + AlgEquiv.restrictNormal_commutes + (qMax (QuotientGroup.mk τ)) E x + have hRestrictVal := congrArg + (fun y : U => (y : SeparableClosure ℚ)) hRestrict + exact hE.symm.trans (hτ.trans (hU.trans hRestrictVal.symm)) + +/-- Geometric restriction on an arbitrary maximal-unramified quotient class. -/ +private theorem cyclotomicUnramifiedGeometricRestriction_quotient + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) + (hUnramified : + L.toFiniteGaloisExtension.IsUnramified rationalCyclotomicDegreeData) + (q : H.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H.field + (rationalCyclotomicDegreeData.fieldInertia H.field) + (rationalCyclotomicFieldInertia_le H.field)) : + let F := abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) L.below + let U := abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) + letI _ : Algebra E U := + abstractFixedFieldCyclotomicFiniteUnramifiedInclusionAlgebra + H L hUnramified + letI _ : @IsScalarTower F E U + Algebra.toSMul Algebra.toSMul Algebra.toSMul := + IsScalarTower.of_algHom + (abstractFixedFieldCyclotomicFiniteUnramifiedInclusion + H L hUnramified) + abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom + H L hUnramified + ((cyclotomicUnramifiedGeometricMaxQuotientEquiv H) q) = + AlgEquiv.restrictNormalHom E + ((cyclotomicUnramifiedGeometricMaxQuotientEquiv H) q) := by + dsimp only + induction q using QuotientGroup.induction_on with + | _ τ => + let qMax := cyclotomicUnramifiedGeometricMaxQuotientEquiv H + let qInertia := cyclotomicUnramifiedGeometricInertiaQuotientEquiv H + let qFinite := cyclotomicUnramifiedGeometricFiniteQuotientEquiv H L + let finiteRestriction := + DegreeData.finiteUnramifiedRestriction + rationalCyclotomicDegreeData + (H.toFiniteResidueAbstractField rationalCyclotomicDegreeData) + L.toFiniteGaloisExtension hUnramified + have hProjection : + qInertia (qMax.symm (qMax (QuotientGroup.mk τ))) = + qInertia (QuotientGroup.mk τ) := + congrArg qInertia (qMax.symm_apply_apply (QuotientGroup.mk τ)) + calc + _ = qFinite + (finiteRestriction + (qInertia (qMax.symm (qMax (QuotientGroup.mk τ))))) := + cyclotomicUnramifiedGeometricRestriction_apply + H L hUnramified (qMax (QuotientGroup.mk τ)) + _ = qFinite + (finiteRestriction (qInertia (QuotientGroup.mk τ))) := + congrArg (fun z => qFinite (finiteRestriction z)) hProjection + _ = _ := + cyclotomicUnramifiedGeometricRestriction_mk H L hUnramified τ + +/-- The quotient-defined restriction to a finite unramified +subextension is the genuine restriction of automorphisms of its +cyclotomic maximal-unramified overfield. -/ +theorem + abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom_eq_restrictNormalHom + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) + (hUnramified : + L.toFiniteGaloisExtension.IsUnramified + rationalCyclotomicDegreeData) : + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + let U := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) + letI _ : Algebra E U := + abstractFixedFieldCyclotomicFiniteUnramifiedInclusionAlgebra + H L hUnramified + letI _ : @IsScalarTower F E U + Algebra.toSMul Algebra.toSMul Algebra.toSMul := + IsScalarTower.of_algHom + (abstractFixedFieldCyclotomicFiniteUnramifiedInclusion + H L hUnramified) + abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom + H L hUnramified = + (AlgEquiv.restrictNormalHom E : + (U ≃ₐ[F] U) →* (E ≃ₐ[F] E)) := by + dsimp only + apply MonoidHom.ext + intro σ + have hσ : + (cyclotomicUnramifiedGeometricMaxQuotientEquiv H) + ((cyclotomicUnramifiedGeometricMaxQuotientEquiv H).symm σ) = σ := + (cyclotomicUnramifiedGeometricMaxQuotientEquiv H).apply_symm_apply σ + exact hσ ▸ + (cyclotomicUnramifiedGeometricRestriction_quotient + H L hUnramified + ((cyclotomicUnramifiedGeometricMaxQuotientEquiv H).symm σ)) + +/-- Restriction of the infinite Artin map along a finite abelian embedding. + +The field-range coordinate is constructed only over abstract type variables. +This keeps concrete fixed-field terms out of definitional equality while the +two existing finite-coordinate compatibility theorems are composed. -/ +private theorem + restrictNormalHom_infiniteGlobalArtinMonoidHom_of_tower + (K E Ω : Type) [Field K] [NumberField K] + [Field E] [NumberField E] [Algebra K E] + [IsAbelianGalois K E] + [Field Ω] [Algebra K Ω] [Algebra E Ω] + [IsScalarTower K E Ω] [IsAbelianGalois K Ω] + (a : IdeleGroup K) : + AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom K Ω a) = + globalArtinMonoidHom (K := K) (L := E) a := by + let j : E →ₐ[K] Ω := IsScalarTower.toAlgHom K E Ω + let G : FiniteGaloisIntermediateField K Ω := + { toIntermediateField := j.fieldRange + finiteDimensional := + j.equivFieldRange.toLinearEquiv.finiteDimensional + isGalois := IsGalois.of_algEquiv j.equivFieldRange } + let _ : FiniteDimensional K G := G.finiteDimensional + let _ : NumberField G := + NumberField.of_module_finite K G + let _ : IsAbelianGalois K G := + IsAbelianGalois.of_algHom G.toIntermediateField.val + let _ : Algebra E G := + j.equivFieldRange.toRingHom.toAlgebra + let _ : SMul E G := Algebra.toSMul + let _ : IsScalarTower K E G := + IsScalarTower.of_algHom j.equivFieldRange.toAlgHom + let _ : IsScalarTower K G Ω := + IntermediateField.isScalarTower_mid G.toIntermediateField + let _ : IsScalarTower E G Ω := + IsScalarTower.of_algebraMap_eq fun _ => rfl + have hProjection : + AlgEquiv.restrictNormalHom G + (infiniteGlobalArtinMonoidHom K Ω a) = + globalArtinMonoidHom (K := K) (L := G) a := + restrictNormalHom_infiniteGlobalArtinMonoidHom K Ω a G + calc + AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom K Ω a) = + AlgEquiv.restrictNormalHom E + (AlgEquiv.restrictNormalHom G + (infiniteGlobalArtinMonoidHom K Ω a)) := + IsScalarTower.AlgEquiv.restrictNormalHom_comp_apply E G + (infiniteGlobalArtinMonoidHom K Ω a) + _ = AlgEquiv.restrictNormalHom E + (globalArtinMonoidHom (K := K) (L := G) a) := + congrArg (AlgEquiv.restrictNormalHom E) hProjection + _ = globalArtinMonoidHom (K := K) (L := E) a := + DFunLike.congr_fun + (globalArtinMonoidHom_restrict_tower + (K := K) (L := G) (E := E)) a + +/-- Pointwise form of restriction compatibility for the infinite Artin map. +This hides the equality of large automorphism structures before specializing +to concrete fixed fields. -/ +private theorem + restrictNormalHom_infiniteGlobalArtinMonoidHom_apply_of_tower + (K E Ω : Type) [Field K] [NumberField K] + [Field E] [NumberField E] [Algebra K E] + [IsAbelianGalois K E] + [Field Ω] [Algebra K Ω] [Algebra E Ω] + [IsScalarTower K E Ω] [IsAbelianGalois K Ω] + (a : IdeleGroup K) (x : E) : + AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom K Ω a) x = + globalArtinMonoidHom (K := K) (L := E) a x := by + exact DFunLike.congr_fun + (restrictNormalHom_infiniteGlobalArtinMonoidHom_of_tower K E Ω a) x + +/-- After embedding the finite field into the overfield, pointwise restriction +compatibility is an equality in the common ambient field. -/ +private theorem + algebraMap_restrictNormalHom_infiniteGlobalArtinMonoidHom_apply_of_tower + (K E Ω : Type) [Field K] [NumberField K] + [Field E] [NumberField E] [Algebra K E] + [IsAbelianGalois K E] + [Field Ω] [Algebra K Ω] [Algebra E Ω] + [IsScalarTower K E Ω] [IsAbelianGalois K Ω] + (a : IdeleGroup K) (x : E) : + algebraMap E Ω + (AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom K Ω a) x) = + algebraMap E Ω + (globalArtinMonoidHom (K := K) (L := E) a x) := by + exact congrArg (algebraMap E Ω) + (restrictNormalHom_infiniteGlobalArtinMonoidHom_apply_of_tower + K E Ω a x) + +/-- Genuine restriction from the cyclotomic unramified overfield carries the +infinite Artin symbol to the finite Artin symbol. -/ +private theorem + abstractFixedFieldCyclotomicRestrictNormalHom_infiniteGlobalArtinMonoidHom + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) + (hUnramified : + L.toFiniteGaloisExtension.IsUnramified + rationalCyclotomicDegreeData) + (a : IdeleGroup + (abstractFixedField ℚ (SeparableClosure ℚ) H.field)) : + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + let U := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) + letI _ : NumberField F := + cyclotomicUnramifiedGeometricBaseNumberField H + letI _ : NumberField E := + cyclotomicUnramifiedGeometricRelativeNumberField H L + letI _ : Algebra F E := E.algebra' + letI _ : Algebra F U := U.algebra' + letI _ : IsAbelianGalois F E := + cyclotomicUnramifiedGeometricRelativeIsAbelianGalois H L + letI _ : IsAbelianGalois F U := + cyclotomicUnramifiedGeometricMaximalIsAbelianGalois H + letI _ : Algebra E U := + abstractFixedFieldCyclotomicFiniteUnramifiedInclusionAlgebra + H L hUnramified + letI _ : @IsScalarTower F E U + Algebra.toSMul Algebra.toSMul Algebra.toSMul := + IsScalarTower.of_algHom + (abstractFixedFieldCyclotomicFiniteUnramifiedInclusion + H L hUnramified) + AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom F U a) = + globalArtinMonoidHom (K := F) (L := E) a := by + dsimp only + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + let U := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) + let fNumberField : NumberField F := + cyclotomicUnramifiedGeometricBaseNumberField H + let eNumberField : NumberField E := + cyclotomicUnramifiedGeometricRelativeNumberField H L + let fEAlgebra : Algebra F E := E.algebra' + let fUAlgebra : Algebra F U := U.algebra' + let fEIsAbelianGalois : IsAbelianGalois F E := + cyclotomicUnramifiedGeometricRelativeIsAbelianGalois H L + let fUIsAbelianGalois : IsAbelianGalois F U := + cyclotomicUnramifiedGeometricMaximalIsAbelianGalois H + let eUAlgebra : Algebra E U := + abstractFixedFieldCyclotomicFiniteUnramifiedInclusionAlgebra + H L hUnramified + let fEUTower : @IsScalarTower F E U + Algebra.toSMul Algebra.toSMul Algebra.toSMul := + IsScalarTower.of_algHom + (abstractFixedFieldCyclotomicFiniteUnramifiedInclusion + H L hUnramified) + apply AlgEquiv.ext + intro x + apply Subtype.ext + have hAmbient := + @algebraMap_restrictNormalHom_infiniteGlobalArtinMonoidHom_apply_of_tower + F E U + (inferInstance : Field F) fNumberField + (inferInstance : Field E) eNumberField fEAlgebra + fEIsAbelianGalois + (inferInstance : Field U) fUAlgebra eUAlgebra + fEUTower fUIsAbelianGalois + a x + have hAmbientVal := congrArg + (fun y : U => (y : SeparableClosure ℚ)) + hAmbient + have hLeft : + ((algebraMap E U + ((AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom F U a)) x) : U) : + SeparableClosure ℚ) = + (((AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom F U a)) x : E) : + SeparableClosure ℚ) := by + rfl + have hRight : + ((algebraMap E U + ((globalArtinMonoidHom (K := F) (L := E) a) x) : U) : + SeparableClosure ℚ) = + (((globalArtinMonoidHom (K := F) (L := E) a) x : E) : + SeparableClosure ℚ) := by + rfl + rw [← hLeft, hAmbientVal, hRight] + +/-- Applying the geometric finite restriction to the infinite global +Artin symbol gives the ordinary finite global Artin symbol. -/ +theorem + abstractFixedFieldCyclotomicFiniteRestriction_infiniteGlobalArtinMonoidHom + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) + (hUnramified : + L.toFiniteGaloisExtension.IsUnramified + rationalCyclotomicDegreeData) + (a : IdeleGroup + (abstractFixedField ℚ (SeparableClosure ℚ) H.field)) : + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + let U := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) + letI _ : NumberField F := + cyclotomicUnramifiedGeometricBaseNumberField H + letI _ : NumberField E := + cyclotomicUnramifiedGeometricRelativeNumberField H L + letI _ : Algebra F E := E.algebra' + letI _ : Algebra F U := U.algebra' + letI _ : IsAbelianGalois F E := + cyclotomicUnramifiedGeometricRelativeIsAbelianGalois H L + letI _ : IsAbelianGalois F U := + cyclotomicUnramifiedGeometricMaximalIsAbelianGalois H + letI _ : Algebra E U := + abstractFixedFieldCyclotomicFiniteUnramifiedInclusionAlgebra + H L hUnramified + letI _ : @IsScalarTower F E U + Algebra.toSMul Algebra.toSMul Algebra.toSMul := + IsScalarTower.of_algHom + (abstractFixedFieldCyclotomicFiniteUnramifiedInclusion + H L hUnramified) + abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom + H L hUnramified + (infiniteGlobalArtinMonoidHom F U a) = + globalArtinMonoidHom (K := F) (L := E) a := by + dsimp only + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + let U := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) + let fNumberField : NumberField F := + cyclotomicUnramifiedGeometricBaseNumberField H + let eNumberField : NumberField E := + cyclotomicUnramifiedGeometricRelativeNumberField H L + let fEAlgebra : Algebra F E := E.algebra' + let fUAlgebra : Algebra F U := U.algebra' + let fEIsAbelianGalois : IsAbelianGalois F E := + cyclotomicUnramifiedGeometricRelativeIsAbelianGalois H L + let fUIsAbelianGalois : IsAbelianGalois F U := + cyclotomicUnramifiedGeometricMaximalIsAbelianGalois H + let eUAlgebra : Algebra E U := + abstractFixedFieldCyclotomicFiniteUnramifiedInclusionAlgebra + H L hUnramified + let fEUTower : @IsScalarTower F E U + Algebra.toSMul Algebra.toSMul Algebra.toSMul := + IsScalarTower.of_algHom + (abstractFixedFieldCyclotomicFiniteUnramifiedInclusion + H L hUnramified) + apply AlgEquiv.ext + intro x + have hRestrictionValue := DFunLike.congr_fun + (DFunLike.congr_fun + (abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom_eq_restrictNormalHom + H L hUnramified) + (infiniteGlobalArtinMonoidHom + (abstractFixedField ℚ (SeparableClosure ℚ) H.field) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field)) + a)) + x + have hArtinValue := DFunLike.congr_fun + (abstractFixedFieldCyclotomicRestrictNormalHom_infiniteGlobalArtinMonoidHom + H L hUnramified a) + x + exact hRestrictionValue.trans hArtinValue + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedLocalGlobalCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedLocalGlobalCompatibility.lean new file mode 100644 index 0000000000..d30397cd9c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedLocalGlobalCompatibility.lean @@ -0,0 +1,402 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedGeometricRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueNaturality +/-! +# Cyclotomic unramified local--global compatibility + +For an unramified finite abelian subextension of an abstract rational +fixed field, the actual global norm-residue homomorphism agrees on every +finite one-place idele class with the chosen local Artin homomorphism. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open KummerTheory + +@[reducible] +private def composeMonoidHom + {M N P : Type*} [MulOne M] [MulOne N] [MulOne P] + (f : M →* N) (g : N →* P) : M →* P := + g.comp f + +attribute [local instance] + rationalSeparableClosureAlgebra + naturalityAbstractFixedFieldBaseQuotientFinite + naturalityAbstractFixedFieldRelativeQuotientFinite + naturalityAbstractFixedFieldFiniteDimensional + naturalityAbstractRelativeFixedFieldFiniteDimensional + naturalityAbstractFixedFieldRelativeScalarTower + naturalityAbstractRelativeFixedFieldAbsoluteFiniteDimensional + naturalityAbstractFixedFieldNumberField + naturalityAbstractRelativeFixedFieldNumberField + naturalityAbstractRelativeFixedFieldIsAbelianGalois + +/-- The finite ideles of an abstract fixed field carry the restricted-product group structure. -/ +@[reducible] +noncomputable local instance + abstractFixedFieldFiniteIdeleGroupGroup + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + Group + (FiniteIdeleGroup + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field)) := + RestrictedProduct.instGroupCoeOfSubgroupClass + (fun v : IsDedekindDomain.HeightOneSpectrum + (𝓞 (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field)) => + (v.adicCompletion + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field))ˣ) + +/-- The ideles of an abstract fixed field carry the product group structure. -/ +@[reducible] +noncomputable local instance + abstractFixedFieldIdeleGroupGroup + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + Group + (IdeleGroup + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field)) := + Prod.instGroup + +/-- The idele classes of an abstract fixed field carry the quotient group structure. -/ +@[reducible] +noncomputable local instance + abstractFixedFieldIdeleClassGroupGroup + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + Group + (IdeleClassGroup + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field)) := + QuotientGroup.Quotient.group + (IdeleGroup.principalSubgroup + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field)) + +private theorem + restrictNormalHom_comp_infiniteGlobalArtinMonoidHom_of_tower + (K E Ω : Type) [Field K] [NumberField K] + [Field E] [NumberField E] [Algebra K E] + [IsAbelianGalois K E] + [Field Ω] [Algebra K Ω] [Algebra E Ω] + [IsScalarTower K E Ω] [IsAbelianGalois K Ω] : + (AlgEquiv.restrictNormalHom E).comp + (infiniteGlobalArtinMonoidHom K Ω).toMonoidHom = + globalArtinMonoidHom (K := K) (L := E) := by + apply MonoidHom.ext + intro a + let j : E →ₐ[K] Ω := IsScalarTower.toAlgHom K E Ω + let G : FiniteGaloisIntermediateField K Ω := + { toIntermediateField := j.fieldRange + finiteDimensional := + j.equivFieldRange.toLinearEquiv.finiteDimensional + isGalois := IsGalois.of_algEquiv j.equivFieldRange } + let _ : FiniteDimensional K G := G.finiteDimensional + let _ : NumberField G := + NumberField.of_module_finite K G + let _ : IsAbelianGalois K G := + IsAbelianGalois.of_algHom G.toIntermediateField.val + let _ : Algebra E G := + j.equivFieldRange.toRingHom.toAlgebra + let _ : SMul E G := Algebra.toSMul + let _ : IsScalarTower K E G := + IsScalarTower.of_algHom j.equivFieldRange.toAlgHom + let _ : IsScalarTower K G Ω := + IntermediateField.isScalarTower_mid G.toIntermediateField + let _ : IsScalarTower E G Ω := + IsScalarTower.of_algebraMap_eq fun _ => rfl + have hProjection : + AlgEquiv.restrictNormalHom G + (infiniteGlobalArtinMonoidHom K Ω a) = + globalArtinMonoidHom (K := K) (L := G) a := + restrictNormalHom_infiniteGlobalArtinMonoidHom K Ω a G + calc + AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom K Ω a) = + AlgEquiv.restrictNormalHom E + (AlgEquiv.restrictNormalHom G + (infiniteGlobalArtinMonoidHom K Ω a)) := + IsScalarTower.AlgEquiv.restrictNormalHom_comp_apply E G + (infiniteGlobalArtinMonoidHom K Ω a) + _ = AlgEquiv.restrictNormalHom E + (globalArtinMonoidHom (K := K) (L := G) a) := + congrArg (AlgEquiv.restrictNormalHom E) hProjection + _ = globalArtinMonoidHom (K := K) (L := E) a := + DFunLike.congr_fun + (globalArtinMonoidHom_restrict_tower + (K := K) (L := G) (E := E)) a + +private theorem + abstractFixedFieldCyclotomicFiniteRestriction_comp_infiniteGlobalArtinMonoidHom + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) + (hUnramified : + L.toFiniteGaloisExtension.IsUnramified + rationalCyclotomicDegreeData) : + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let E := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + let U := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) + letI _ : NumberField F := + cyclotomicUnramifiedGeometricBaseNumberField H + letI _ : NumberField E := + cyclotomicUnramifiedGeometricRelativeNumberField H L + letI _ : Algebra F E := E.algebra' + letI _ : Algebra F U := U.algebra' + letI _ : IsAbelianGalois F E := + cyclotomicUnramifiedGeometricRelativeIsAbelianGalois H L + letI _ : IsAbelianGalois F U := + cyclotomicUnramifiedGeometricMaximalIsAbelianGalois H + letI _ : Algebra E U := + abstractFixedFieldCyclotomicFiniteUnramifiedInclusionAlgebra + H L hUnramified + letI _ : @IsScalarTower F E U + Algebra.toSMul Algebra.toSMul Algebra.toSMul := + IsScalarTower.of_algHom + (abstractFixedFieldCyclotomicFiniteUnramifiedInclusion + H L hUnramified) + (abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom + H L hUnramified).comp + (infiniteGlobalArtinMonoidHom F U).toMonoidHom = + globalArtinMonoidHom (K := F) (L := E) := by + dsimp only + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let E := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + let U := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) + let fNumberField : NumberField F := + cyclotomicUnramifiedGeometricBaseNumberField H + let eNumberField : NumberField E := + cyclotomicUnramifiedGeometricRelativeNumberField H L + let fEAlgebra : Algebra F E := E.algebra' + let fUAlgebra : Algebra F U := U.algebra' + let fEIsAbelianGalois : IsAbelianGalois F E := + cyclotomicUnramifiedGeometricRelativeIsAbelianGalois H L + let fUIsAbelianGalois : IsAbelianGalois F U := + cyclotomicUnramifiedGeometricMaximalIsAbelianGalois H + let eUAlgebra : Algebra E U := + abstractFixedFieldCyclotomicFiniteUnramifiedInclusionAlgebra + H L hUnramified + let fEUTower : @IsScalarTower F E U + Algebra.toSMul Algebra.toSMul Algebra.toSMul := + IsScalarTower.of_algHom + (abstractFixedFieldCyclotomicFiniteUnramifiedInclusion + H L hUnramified) + calc + (abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom + H L hUnramified).comp + (infiniteGlobalArtinMonoidHom F U).toMonoidHom = + (AlgEquiv.restrictNormalHom E).comp + (infiniteGlobalArtinMonoidHom F U).toMonoidHom := + congrArg + (fun f => f.comp + (infiniteGlobalArtinMonoidHom F U).toMonoidHom) + (abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom_eq_restrictNormalHom + H L hUnramified) + _ = globalArtinMonoidHom (K := F) (L := E) := + restrictNormalHom_comp_infiniteGlobalArtinMonoidHom_of_tower + F E U + +private theorem + abstractFixedFieldGlobalNormResidueMonoidHom_eq_cyclotomicRestrictionComp + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) + (hUnramified : + L.toFiniteGaloisExtension.IsUnramified + rationalCyclotomicDegreeData) : + let rhs := + composeMonoidHom + (abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom H) + (abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom + H L hUnramified) + abstractFixedFieldGlobalNormResidueMonoidHom H L = rhs := by + dsimp only + apply MonoidHom.ext + intro c + exact + abstractFixedFieldGlobalNormResidueMonoidHom_eq_cyclotomicFiniteRestriction + H L hUnramified c + +private theorem + abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom_comp_finitePlaceIdeleClass + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (v : IsDedekindDomain.HeightOneSpectrum + (𝓞 (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field))) : + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let U := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) + letI _ : IsAbelianGalois F U := + abstractFixedFieldCyclotomic_isAbelianGalois H + composeMonoidHom + (IdeleGroup.finitePlaceIdeleClass v) + (abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom H) = + composeMonoidHom + (IdeleGroup.finitePlaceIdele v) + (infiniteGlobalArtinMonoidHom F U).toMonoidHom := by + dsimp only + apply MonoidHom.ext + intro x + exact + abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom_mk + H (IdeleGroup.finitePlaceIdele v x) + +private theorem globalArtinMonoidHom_comp_finitePlaceIdele + (K E : Type) [Field K] [NumberField K] + [Field E] [NumberField E] [Algebra K E] + [IsAbelianGalois K E] + (v : IsDedekindDomain.HeightOneSpectrum (𝓞 K)) : + (globalArtinMonoidHom (K := K) (L := E)).comp + (IdeleGroup.finitePlaceIdele v) = + chosenFinitePlaceArtinMonoidHom + (K := K) (L := E) v := by + apply MonoidHom.ext + intro x + exact globalArtinMonoidHom_finitePlaceIdele + (K := K) (L := E) v x + +/-- The cyclotomic construction of fixed-field reciprocity satisfies +finite-place local--global compatibility on every finite unramified +abelian subextension. -/ +theorem + abstractFixedFieldGlobalNormResidueMonoidHom_comp_finitePlaceIdeleClass + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) + (hUnramified : + L.toFiniteGaloisExtension.IsUnramified + rationalCyclotomicDegreeData) + (v : IsDedekindDomain.HeightOneSpectrum + (𝓞 (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field))) : + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let E := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + (abstractFixedFieldGlobalNormResidueMonoidHom H L).comp + (IdeleGroup.finitePlaceIdeleClass v) = + chosenFinitePlaceArtinMonoidHom + (K := F) (L := E) v := by + dsimp only + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let E := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + let U := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) + let fUIsAbelianGalois : IsAbelianGalois F U := + abstractFixedFieldCyclotomic_isAbelianGalois H + let finiteIdele := IdeleGroup.finitePlaceIdele v + let finiteIdeleClass := IdeleGroup.finitePlaceIdeleClass v + let restriction := + abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom + H L hUnramified + let ideleClassArtin := + abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom H + let infiniteArtin := infiniteGlobalArtinMonoidHom F U + calc + (abstractFixedFieldGlobalNormResidueMonoidHom H L).comp + finiteIdeleClass = + (restriction.comp ideleClassArtin).comp + finiteIdeleClass := + congrArg + (fun f => f.comp finiteIdeleClass) + (abstractFixedFieldGlobalNormResidueMonoidHom_eq_cyclotomicRestrictionComp + H L hUnramified) + _ = restriction.comp + (ideleClassArtin.comp finiteIdeleClass) := rfl + _ = restriction.comp + (infiniteArtin.toMonoidHom.comp finiteIdele) := + congrArg (fun f => restriction.comp f) + (abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom_comp_finitePlaceIdeleClass + H v) + _ = (restriction.comp infiniteArtin.toMonoidHom).comp + finiteIdele := rfl + _ = (globalArtinMonoidHom (K := F) (L := E)).comp + finiteIdele := + congrArg (fun f => f.comp finiteIdele) + (abstractFixedFieldCyclotomicFiniteRestriction_comp_infiniteGlobalArtinMonoidHom + H L hUnramified) + _ = chosenFinitePlaceArtinMonoidHom + (K := F) (L := E) v := + globalArtinMonoidHom_comp_finitePlaceIdele F E v + +/-- The canonical inclusion realization of a finite unramified abstract +fixed-field extension satisfies finite-place local--global compatibility. -/ +theorem + globalNormResidueMonoidHomOfEmbedding_comp_finitePlaceIdeleClass_of_abstractFixedFieldUnramified + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) + (hUnramified : + L.toFiniteGaloisExtension.IsUnramified + rationalCyclotomicDegreeData) + (v : IsDedekindDomain.HeightOneSpectrum + (𝓞 (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field))) : + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let E := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + let j : E →ₐ[ℚ] SeparableClosure ℚ := + E.val.restrictScalars ℚ + (globalNormResidueMonoidHomOfEmbedding F E j).comp + (IdeleGroup.finitePlaceIdeleClass v) = + chosenFinitePlaceArtinMonoidHom + (K := F) (L := E) v := by + dsimp only + rw [ + globalNormResidueMonoidHomOfEmbedding_abstractFixedFieldInclusion + H L] + exact + abstractFixedFieldGlobalNormResidueMonoidHom_comp_finitePlaceIdeleClass + H L hUnramified v + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedRestriction.lean new file mode 100644 index 0000000000..fead08ceb2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedRestriction.lean @@ -0,0 +1,415 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.AbstractFixedFieldGlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicAbstractFixedFieldArtin +/-! +# Finite restriction of cyclotomic fixed-field reciprocity + +For an unramified finite abelian subextension of an abstract fixed +number field, this file constructs the genuine restriction from the +cyclotomic maximal-unramified Galois group to the finite Galois group. +It then identifies the restriction of the chosen-local-factor +cyclotomic Artin map with the actual global norm-residue map. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open KummerTheory + +/-- The actual fixed field attached to `H` is a number field. Keeping +this as one file-local instance makes it available while later idele-class +binders are elaborated. -/ +noncomputable local instance + cyclotomicUnramifiedRestriction_abstractFixedFieldNumberField + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + NumberField + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) := by + let : FiniteDimensional ℚ + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + exact + NumberField.of_module_finite ℚ + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + +/-- The abelianized fixed-field quotient comparison sends the class of +an actual finite quotient element to the corresponding automorphism of +the concrete relative fixed field. -/ +@[simp] +theorem + abstractFixedFieldAbelianizedExtensionQuotientEquivGaloisGroup_of + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) + (q : L.extensionQuotient) : + abstractFixedFieldAbelianizedExtensionQuotientEquivGaloisGroup H L + (Additive.ofMul (Abelianization.of q)) = + Additive.ofMul + ((L.extensionQuotientMulEquiv.trans + (LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) + H.field L.field L.below L.normal)) q) := by + let : IsMulCommutative L.extensionQuotient := + L.commutative + apply Additive.toMul.injective + change + (L.extensionQuotientMulEquiv.trans + (LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) + H.field L.field L.below L.normal)) + ((Abelianization.equivOfComm : + L.extensionQuotient ≃* + Abelianization L.extensionQuotient).symm + (Abelianization.of q)) = + (L.extensionQuotientMulEquiv.trans + (LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) + H.field L.field L.below L.normal)) q + exact congrArg + (L.extensionQuotientMulEquiv.trans + (LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) + H.field L.field L.below L.normal)) + ((Abelianization.equivOfComm : + L.extensionQuotient ≃* + Abelianization L.extensionQuotient).symm_apply_apply q) + +/-- Genuine restriction from the cyclotomic maximal-unramified +extension of an abstract fixed field to a finite unramified abelian +subextension. The construction uses the canonical quotient +presentations of both actual Galois groups. -/ +noncomputable def abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) + (hUnramified : + L.toFiniteGaloisExtension.IsUnramified + rationalCyclotomicDegreeData) : + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let E := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below + let hI := + rationalCyclotomicFieldInertia_le H.field + let U := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hI + Gal(U/F) →* Gal(E/F) := by + dsimp only + let qFinite : + L.toFiniteGaloisExtension.extensionQuotient ≃* + Gal(LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below/LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) := + L.toFiniteGaloisExtension.extensionQuotientMulEquiv.trans + (LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) + H.field L.field L.below L.normal) + let finiteRestriction := + DegreeData.finiteUnramifiedRestriction + rationalCyclotomicDegreeData + (H.toFiniteResidueAbstractField rationalCyclotomicDegreeData) + L.toFiniteGaloisExtension hUnramified + let degreeEquiv := + rationalCyclotomicDegreeData.maximalUnramifiedDegreeEquiv + (H.toFiniteResidueAbstractField rationalCyclotomicDegreeData) + let galEquiv := abstractFixedFieldCyclotomicGalEquivZHat H + exact + @MonoidHom.comp _ _ _ _ _ _ qFinite.toMonoidHom + (@MonoidHom.comp _ _ _ _ _ _ finiteRestriction + (@MonoidHom.comp _ _ _ _ _ _ + degreeEquiv.symm.toMonoidHom galEquiv.toMonoidHom)) + +/-- Evaluate the finite cyclotomic restriction through its quotient coordinates. -/ +theorem abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom_apply + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) + (hUnramified : + L.toFiniteGaloisExtension.IsUnramified + rationalCyclotomicDegreeData) + (σ : Gal(LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field)) : + abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom H L hUnramified σ = + (L.toFiniteGaloisExtension.extensionQuotientMulEquiv.trans + (LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) + H.field L.field L.below L.normal)) + (DegreeData.finiteUnramifiedRestriction + rationalCyclotomicDegreeData + (H.toFiniteResidueAbstractField rationalCyclotomicDegreeData) + L.toFiniteGaloisExtension hUnramified + ((rationalCyclotomicDegreeData.maximalUnramifiedDegreeEquiv + (H.toFiniteResidueAbstractField + rationalCyclotomicDegreeData)).symm + (abstractFixedFieldCyclotomicGalEquivZHat H σ))) := by + rfl + +/-- In the canonical `ZHat` coordinate, the genuine cyclotomic Artin +symbol recovers the abstract maximal-unramified quotient class. -/ +private theorem + abstractFixedFieldCyclotomicIdeleClassArtin_fixed_coordinate + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (a : + ambientFixedAddSubgroup + rationalIdeleClassRepresentation H.field) : + (rationalCyclotomicDegreeData.maximalUnramifiedDegreeEquiv + (H.toFiniteResidueAbstractField + rationalCyclotomicDegreeData)).symm + (abstractFixedFieldCyclotomicGalEquivZHat H + (abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom H + (Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed H.field + (hfinite := H.finite)).symm + a)))) = + (ClassFormation.ValuationData.maximalUnramifiedNormResidueSymbol + rationalCyclotomicIdeleClassValuationData H a).toMul := by + apply + (rationalCyclotomicDegreeData.maximalUnramifiedDegreeEquiv + (H.toFiniteResidueAbstractField + rationalCyclotomicDegreeData)).injective + refine ((rationalCyclotomicDegreeData.maximalUnramifiedDegreeEquiv + (H.toFiniteResidueAbstractField rationalCyclotomicDegreeData)).apply_symm_apply + (abstractFixedFieldCyclotomicGalEquivZHat H + (abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom H + (Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed H.field + (hfinite := H.finite)).symm a))))).trans ?_ + exact (congrArg (abstractFixedFieldCyclotomicGalEquivZHat H) + (abstractFixedFieldCyclotomicIdeleClassArtin_eq_maximalUnramifiedNormResidue + H a)).trans + (abstractFixedFieldCyclotomicGalEquivZHat_quotientClass H + (ClassFormation.ValuationData.maximalUnramifiedNormResidueSymbol + rationalCyclotomicIdeleClassValuationData H a).toMul) + +/-- On a fixed-part idele class, finite restriction of the genuine +cyclotomic Artin symbol is the finite restriction of the +maximal-unramified norm-residue symbol. -/ +theorem + abstractFixedFieldCyclotomicFiniteRestriction_ideleClassArtin_fixed + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) + (hUnramified : + L.toFiniteGaloisExtension.IsUnramified + rationalCyclotomicDegreeData) + (a : + ambientFixedAddSubgroup + rationalIdeleClassRepresentation H.field) : + abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom + H L hUnramified + (abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom H + (Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed H.field + (hfinite := H.finite)).symm + a))) = + (L.extensionQuotientMulEquiv.trans + (LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) + H.field L.field L.below L.normal)) + (DegreeData.finiteUnramifiedRestriction + rationalCyclotomicDegreeData + (H.toFiniteResidueAbstractField + rationalCyclotomicDegreeData) + L.toFiniteGaloisExtension hUnramified + (ClassFormation.ValuationData.maximalUnramifiedNormResidueSymbol + rationalCyclotomicIdeleClassValuationData H a).toMul) := by + let qFinite := + L.toFiniteGaloisExtension.extensionQuotientMulEquiv.trans + (LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) + H.field L.field L.below L.normal) + let finiteRestriction := + DegreeData.finiteUnramifiedRestriction + rationalCyclotomicDegreeData + (H.toFiniteResidueAbstractField rationalCyclotomicDegreeData) + L.toFiniteGaloisExtension hUnramified + let degreeEquiv := + rationalCyclotomicDegreeData.maximalUnramifiedDegreeEquiv + (H.toFiniteResidueAbstractField rationalCyclotomicDegreeData) + let galEquiv := abstractFixedFieldCyclotomicGalEquivZHat H + let c := + abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom H + (Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed H.field + (hfinite := H.finite)).symm a)) + calc + abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom + H L hUnramified c = + qFinite (finiteRestriction (degreeEquiv.symm (galEquiv c))) := rfl + _ = qFinite + (finiteRestriction + (ClassFormation.ValuationData.maximalUnramifiedNormResidueSymbol + rationalCyclotomicIdeleClassValuationData H a).toMul) := + congrArg (fun q ↦ qFinite (finiteRestriction q)) + (abstractFixedFieldCyclotomicIdeleClassArtin_fixed_coordinate H a) + +open ClassFormation.ValuationData renaming + normResidueSymbol_finiteNormClass_eq_maximalUnramifiedRestriction → + normResidueSymbol_finiteNormClass_eq_maximalUnramifiedRestriction in +/-- The actual fixed-field global norm-residue value on a fixed-part +class is the finite restriction of the maximal-unramified cyclotomic +symbol. -/ +theorem + abstractFixedFieldGlobalNormResidueMonoidHom_fixed_eq_finiteUnramifiedRestriction + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) + (hUnramified : + L.toFiniteGaloisExtension.IsUnramified + rationalCyclotomicDegreeData) + (a : + ambientFixedAddSubgroup + rationalIdeleClassRepresentation H.field) : + abstractFixedFieldGlobalNormResidueMonoidHom H L + (Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed H.field + (hfinite := H.finite)).symm + a)) = + (L.extensionQuotientMulEquiv.trans + (LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) + H.field L.field L.below L.normal)) + (DegreeData.finiteUnramifiedRestriction + rationalCyclotomicDegreeData + (H.toFiniteResidueAbstractField + rationalCyclotomicDegreeData) + L.toFiniteGaloisExtension hUnramified + (ClassFormation.ValuationData.maximalUnramifiedNormResidueSymbol + rationalCyclotomicIdeleClassValuationData H a).toMul) := by + let : Finite + (H.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H.field L.field L.below) := + L.finite + let : IsMulCommutative L.extensionQuotient := + L.commutative + let q : L.extensionQuotient := + DegreeData.finiteUnramifiedRestriction + rationalCyclotomicDegreeData + (H.toFiniteResidueAbstractField rationalCyclotomicDegreeData) + L.toFiniteGaloisExtension hUnramified + (ClassFormation.ValuationData.maximalUnramifiedNormResidueSymbol + rationalCyclotomicIdeleClassValuationData H a).toMul + rw [abstractFixedFieldGlobalNormResidueMonoidHom_fixed_apply] + change + Additive.toMul + (abstractFixedFieldAbelianizedExtensionQuotientEquivGaloisGroup H L + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + H L.toFiniteGaloisExtension + (finiteNormClass rationalIdeleClassRepresentation + H.field L.field L.below a))) = + _ + calc + _ = + Additive.toMul + (abstractFixedFieldAbelianizedExtensionQuotientEquivGaloisGroup H L + (Additive.ofMul (Abelianization.of q))) := + congrArg + (fun z => + Additive.toMul + (abstractFixedFieldAbelianizedExtensionQuotientEquivGaloisGroup + H L z)) + (normResidueSymbol_finiteNormClass_eq_maximalUnramifiedRestriction + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + H L.toFiniteGaloisExtension hUnramified a) + _ = _ := by + rw [abstractFixedFieldAbelianizedExtensionQuotientEquivGaloisGroup_of] + exact toMul_ofMul _ + +/-- Finite restriction of the genuine cyclotomic chosen-local-factor +Artin map is exactly the actual global norm-residue map for every +finite unramified abelian fixed-field extension. -/ +theorem + abstractFixedFieldGlobalNormResidueMonoidHom_eq_cyclotomicFiniteRestriction + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension H.field) + (hUnramified : + L.toFiniteGaloisExtension.IsUnramified + rationalCyclotomicDegreeData) + (c : + IdeleClassGroup + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field)) : + abstractFixedFieldGlobalNormResidueMonoidHom H L c = + abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom + H L hUnramified + (abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom H c) := by + let e := + rationalAbstractFixedFieldIdeleClassEquivFixed H.field + (hfinite := H.finite) + let a : + ambientFixedAddSubgroup + rationalIdeleClassRepresentation H.field := + e (Additive.ofMul c) + have hc : + Additive.toMul (e.symm a) = c := by + apply Additive.ofMul.injective + change e.symm (e (Additive.ofMul c)) = Additive.ofMul c + exact e.symm_apply_apply _ + calc + abstractFixedFieldGlobalNormResidueMonoidHom H L c = + abstractFixedFieldGlobalNormResidueMonoidHom H L + (Additive.toMul (e.symm a)) := by rw [hc] + _ = + (L.extensionQuotientMulEquiv.trans + (LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) + H.field L.field L.below L.normal)) + (DegreeData.finiteUnramifiedRestriction + rationalCyclotomicDegreeData + (H.toFiniteResidueAbstractField + rationalCyclotomicDegreeData) + L.toFiniteGaloisExtension hUnramified + (ClassFormation.ValuationData.maximalUnramifiedNormResidueSymbol + rationalCyclotomicIdeleClassValuationData H a).toMul) := + abstractFixedFieldGlobalNormResidueMonoidHom_fixed_eq_finiteUnramifiedRestriction + H L hUnramified a + _ = + abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom + H L hUnramified + (abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom H + (Additive.toMul (e.symm a))) := + (abstractFixedFieldCyclotomicFiniteRestriction_ideleClassArtin_fixed + H L hUnramified a).symm + _ = + abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom + H L hUnramified + (abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom H c) := + congrArg + (fun z => + abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom + H L hUnramified + (abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom H z)) + hc + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean new file mode 100644 index 0000000000..03529360c8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean @@ -0,0 +1,2033 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicTorsionFixedField +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteInteger +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.InfiniteBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.FieldTheory.IntermediateField.Algebraic +public import Mathlib.FieldTheory.Normal.Closure +public import Mathlib.FieldTheory.IsSepClosed +public import Mathlib.FieldTheory.SeparableClosure +public import Mathlib.GroupTheory.Index +/-! +# Base change of the rational cyclotomic `ZHat`-extension + +The rational cyclotomic `ZHat`-extension lives inside the fixed separable +closure of `ℚ`. To form its compositum with an arbitrary number field, we first +embed that number field into the same separable closure. The +intersection degree below is the normalization integer + +`f_K = [K ∩ ℚ_tilde : ℚ]`. + +All fields in this file are the actual mathlib intermediate fields in +`SeparableClosure ℚ`; no abstract copy of the compositum or of its +Galois group is introduced. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + continuousMulEquivOfCompactToT2 → + continuousMulEquivOfCompactToT2 + + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open scoped Topology +open AlgebraicNumberTheory +open ClassFormation +open KummerTheory + +/-- The fixed rational separable closure, with the intermediate-field algebra +structure used by Mathlib's `IsSepClosure` construction. -/ +noncomputable instance rationalSeparableClosure_isGalois : + IsGalois ℚ (SeparableClosure ℚ) := by + exact @IsSepClosure.isGalois + ℚ _ (SeparableClosure ℚ) _ + ((separableClosure ℚ (AlgebraicClosure ℚ)).algebra) + (separableClosure.isSepClosure ℚ (AlgebraicClosure ℚ)) + +/-- The chosen rational separable closure is normal over `ℚ`. -/ +noncomputable instance rationalSeparableClosure_isNormal : + Normal ℚ (SeparableClosure ℚ) := + rationalSeparableClosure_isGalois.to_normal + +/-- The cyclotomic `ZHat`-extension of `ℚ`, regarded as an actual +intermediate field of `SeparableClosure ℚ`. -/ +def rationalCyclotomicZHatField : + IntermediateField ℚ (SeparableClosure ℚ) := + IntermediateField.lift rationalCyclotomicTorsionFixedField + +noncomputable instance rationalCyclotomicZHatField_isAbelianGalois : + IsAbelianGalois ℚ rationalCyclotomicZHatField := by + exact @IsAbelianGalois.of_algHom + ℚ rationalCyclotomicZHatField rationalCyclotomicTorsionFixedField + _ _ _ _ _ + (IntermediateField.liftAlgEquiv + rationalCyclotomicTorsionFixedField).symm.toAlgHom + KummerTheory.rationalCyclotomicTorsionFixedField_isAbelianGalois + +/-- The lifted cyclotomic `ZHat`-field is normal with its canonical +`IntermediateField` algebra structure. This is the normality used by +restriction maps out of the fixed rational separable closure. -/ +theorem rationalCyclotomicZHatField_normal : + @Normal ℚ rationalCyclotomicZHatField _ _ + rationalCyclotomicZHatField.algebra' := by + exact @IsGalois.to_normal + ℚ _ rationalCyclotomicZHatField _ + rationalCyclotomicZHatField.algebra' + (@IsAbelianGalois.of_algHom + ℚ rationalCyclotomicZHatField rationalCyclotomicTorsionFixedField + _ _ rationalCyclotomicZHatField.algebra' _ _ + (IntermediateField.liftAlgEquiv + rationalCyclotomicTorsionFixedField).symm.toAlgHom + KummerTheory.rationalCyclotomicTorsionFixedField_isAbelianGalois).toIsGalois + +/-- The lifted cyclotomic `ZHat`-field is normal for the ambient algebra +structure selected by ordinary Galois-theory APIs. -/ +noncomputable instance rationalCyclotomicZHatField_isNormal : + Normal ℚ rationalCyclotomicZHatField := + rationalCyclotomicZHatField_isAbelianGalois.toIsGalois.to_normal + +/-- The cyclotomic Galois-group equivalence, transported from the nested +presentation to the copy of `ℚ_tilde` in `SeparableClosure ℚ`. -/ +noncomputable def rationalCyclotomicZHatFieldGalEquivZHat : + (rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField) ≃ₜ* + Multiplicative ZHat := by + let _ : T2Space + (rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField) := + krullTopology_t2 + let e := + IntermediateField.liftAlgEquiv + rationalCyclotomicTorsionFixedField + let c : + (rationalCyclotomicTorsionFixedField ≃ₐ[ℚ] + rationalCyclotomicTorsionFixedField) ≃ₜ* + (rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField) := + continuousMulEquivOfCompactToT2 + (AlgEquiv.autCongr e) + (continuous_algEquiv_autCongr e) + exact c.symm.trans + rationalCyclotomicTorsionFixedFieldGalEquivZHat + +/-- Restriction from the full rational cyclotomic field to its actual +`ZHat` torsion-fixed subfield, transported to the copy inside +`SeparableClosure ℚ`. -/ +noncomputable def rationalCyclotomicFullRestrictionToZHat : + (KummerTheory.rationalCyclotomicField ≃ₐ[ℚ] + KummerTheory.rationalCyclotomicField) →* + (rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField) := + (AlgEquiv.autCongr + (IntermediateField.liftAlgEquiv + KummerTheory.rationalCyclotomicTorsionFixedField)).toMonoidHom.comp + (@AlgEquiv.restrictNormalHom + ℚ _ KummerTheory.rationalCyclotomicField _ _ + KummerTheory.rationalCyclotomicTorsionFixedField _ _ _ _ + KummerTheory.rationalCyclotomicTorsionFixedField_normal) + +/-- The actual restriction to the lifted `ZHat`-field has coordinate +equal to the torsion-free component of the full cyclotomic character. -/ +@[simp] +theorem rationalCyclotomicZHatFieldGalEquivZHat_fullRestriction + (σ : + KummerTheory.rationalCyclotomicField ≃ₐ[ℚ] + KummerTheory.rationalCyclotomicField) : + rationalCyclotomicZHatFieldGalEquivZHat + (rationalCyclotomicFullRestrictionToZHat σ) = + (KummerTheory.zHatUnitsDecomposition + (KummerTheory.rationalCyclotomicCharacterContinuousMulEquiv + σ)).1 := by + let _ : T2Space + (rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField) := + krullTopology_t2 + let e := + IntermediateField.liftAlgEquiv + KummerTheory.rationalCyclotomicTorsionFixedField + let c : + (KummerTheory.rationalCyclotomicTorsionFixedField ≃ₐ[ℚ] + KummerTheory.rationalCyclotomicTorsionFixedField) ≃ₜ* + (rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField) := + continuousMulEquivOfCompactToT2 + (AlgEquiv.autCongr e) + (continuous_algEquiv_autCongr e) + change + rationalCyclotomicTorsionFixedFieldGalEquivZHat + (c.symm + (c + (@AlgEquiv.restrictNormalHom + ℚ _ KummerTheory.rationalCyclotomicField _ _ + KummerTheory.rationalCyclotomicTorsionFixedField _ _ _ _ + KummerTheory.rationalCyclotomicTorsionFixedField_normal σ))) = + (KummerTheory.zHatUnitsDecomposition + (KummerTheory.rationalCyclotomicCharacterContinuousMulEquiv + σ)).1 + rw [c.symm_apply_apply, + rationalCyclotomicTorsionFixedFieldGalEquivZHat_restrictNormal] + +/-- Restriction from the actual absolute Galois group of `ℚ` to the +cyclotomic `ZHat`-extension. -/ +noncomputable def + rationalAbsoluteGaloisRestrictionToCyclotomicZHat : + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) →ₜ* + (rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField) where + toMonoidHom := + @AlgEquiv.restrictNormalHom + ℚ _ (SeparableClosure ℚ) _ _ + rationalCyclotomicZHatField _ + rationalCyclotomicZHatField.algebra' _ _ + rationalCyclotomicZHatField_normal + continuous_toFun := by + let : @Normal ℚ rationalCyclotomicZHatField _ _ + rationalCyclotomicZHatField.algebra' := + rationalCyclotomicZHatField_normal + exact + InfiniteGalois.restrictNormalHom_continuous + rationalCyclotomicZHatField + +/-- The actual global degree datum +`d : Gal(ℚ_bar/ℚ) → Multiplicative ZHat`, obtained by restriction to the +cyclotomic `ZHat`-extension. -/ +noncomputable def rationalCyclotomicDegreeData : + DegreeData + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) where + degree := + (ContinuousMonoidHom.toContinuousMonoidHom + rationalCyclotomicZHatFieldGalEquivZHat).comp + rationalAbsoluteGaloisRestrictionToCyclotomicZHat + degree_surjective := + by + let : @Normal ℚ rationalCyclotomicZHatField _ _ + rationalCyclotomicZHatField.algebra' := + rationalCyclotomicZHatField_normal + exact + rationalCyclotomicZHatFieldGalEquivZHat.surjective.comp + (AlgEquiv.restrictNormalHom_surjective + (F := ℚ) + (K₁ := rationalCyclotomicZHatField) + (E := SeparableClosure ℚ)) + +/-- The inertia subgroup of the actual cyclotomic degree datum is +literally the subgroup fixing the cyclotomic `ZHat`-extension. -/ +theorem rationalCyclotomicDegreeData_inertia : + rationalCyclotomicDegreeData.inertia = + RamificationTheory.closedFixingSubgroup ℚ (SeparableClosure ℚ) + rationalCyclotomicZHatField := by + let : @Normal ℚ rationalCyclotomicZHatField _ _ + rationalCyclotomicZHatField.algebra' := + rationalCyclotomicZHatField_normal + let r := rationalAbsoluteGaloisRestrictionToCyclotomicZHat + have hrker : r.toMonoidHom.ker = + rationalCyclotomicZHatField.fixingSubgroup := by + change + (@AlgEquiv.restrictNormalHom + ℚ _ (SeparableClosure ℚ) _ _ + rationalCyclotomicZHatField _ + rationalCyclotomicZHatField.algebra' _ _ + rationalCyclotomicZHatField_normal).ker = + rationalCyclotomicZHatField.fixingSubgroup + exact + @IntermediateField.restrictNormalHom_ker + ℚ (SeparableClosure ℚ) _ _ _ + rationalCyclotomicZHatField + rationalCyclotomicZHatField_normal + ext σ + change + σ ∈ rationalCyclotomicDegreeData.inertia ↔ + σ ∈ RamificationTheory.closedFixingSubgroup ℚ (SeparableClosure ℚ) + rationalCyclotomicZHatField + rw [rationalCyclotomicDegreeData.mem_inertia_iff] + change + rationalCyclotomicZHatFieldGalEquivZHat + (r σ) = + 1 ↔ + σ ∈ rationalCyclotomicZHatField.fixingSubgroup + constructor + · intro hσ + have hrestrict : + r σ = + 1 := by + apply rationalCyclotomicZHatFieldGalEquivZHat.injective + simpa using hσ + have hker : + σ ∈ r.toMonoidHom.ker := + hrestrict + exact hrker ▸ hker + · intro hσ + have hker : + σ ∈ r.toMonoidHom.ker := by + rw [hrker] + exact hσ + change + rationalCyclotomicZHatFieldGalEquivZHat + (r σ) = + 1 + have hzero : r σ = 1 := + MonoidHom.mem_ker.mp hker + rw [hzero, map_one] + +/-- The field fixed by cyclotomic inertia is the actual cyclotomic +`ZHat`-extension inside the chosen rational separable closure. -/ +theorem rationalCyclotomicDegreeData_fixedField_inertia : + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) + rationalCyclotomicDegreeData.inertia = + rationalCyclotomicZHatField := by + rw [rationalCyclotomicDegreeData_inertia] + exact + InfiniteGalois.fixedField_fixingSubgroup + rationalCyclotomicZHatField + +/-- For every abstract rational fixed field `F`, the field fixed by +its cyclotomic inertia is the genuine compositum `Fℚ_tilde` in +`SeparableClosure ℚ`. -/ +theorem + rationalCyclotomicDegreeData_fixedField_fieldInertia + (H : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicDegreeData.fieldInertia H) = + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H ⊔ + rationalCyclotomicZHatField := by + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H + have hsubgroup : + (rationalCyclotomicDegreeData.fieldInertia H).toSubgroup = + (F ⊔ rationalCyclotomicZHatField).fixingSubgroup := by + calc + (rationalCyclotomicDegreeData.fieldInertia H).toSubgroup = + H.toSubgroup ⊓ + rationalCyclotomicDegreeData.inertia.toSubgroup := + rfl + _ = + H.toSubgroup ⊓ + rationalCyclotomicZHatField.fixingSubgroup := by + rw [rationalCyclotomicDegreeData_inertia] + rfl + _ = + F.fixingSubgroup ⊓ + rationalCyclotomicZHatField.fixingSubgroup := by + rw [InfiniteGalois.fixingSubgroup_fixedField H] + _ = + (F ⊔ rationalCyclotomicZHatField).fixingSubgroup := + IntermediateField.fixingSubgroup_sup.symm + change + IntermediateField.fixedField + (rationalCyclotomicDegreeData.fieldInertia H).toSubgroup = + F ⊔ rationalCyclotomicZHatField + rw [hsubgroup] + exact + InfiniteGalois.fixedField_fixingSubgroup + (F ⊔ rationalCyclotomicZHatField) + +/-- Restricting a closed subgroup of the rational absolute Galois group +to the cyclotomic `ZHat`-extension gives exactly the subgroup fixing the +intersection with its concrete fixed field. -/ +theorem + rationalAbsoluteGaloisRestriction_image_eq_intersection_fixingSubgroup + (H : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + H.toSubgroup.map + rationalAbsoluteGaloisRestrictionToCyclotomicZHat.toMonoidHom = + (((LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H) ⊓ + rationalCyclotomicZHatField).restrict + (show + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H ⊓ + rationalCyclotomicZHatField ≤ + rationalCyclotomicZHatField from + inf_le_right)).fixingSubgroup := by + let _ : T2Space + (rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField) := + krullTopology_t2 + let r := rationalAbsoluteGaloisRestrictionToCyclotomicZHat + let R : ClosedSubgroup + (rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField) := + { toSubgroup := H.toSubgroup.map r + isClosed' := by + change IsClosed (r '' H.carrier) + exact + (H.isClosed'.isCompact.image + r.continuous).isClosed } + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H + let J : IntermediateField ℚ (SeparableClosure ℚ) := + F ⊓ rationalCyclotomicZHatField + let hJT : J ≤ rationalCyclotomicZHatField := + inf_le_right + let E : IntermediateField ℚ rationalCyclotomicZHatField := + J.restrict hJT + have hE : + E = IntermediateField.fixedField R.toSubgroup := by + apply + (IntermediateField.lift_injective + rationalCyclotomicZHatField) + calc + IntermediateField.lift E = J := + IntermediateField.lift_restrict hJT + _ = + IntermediateField.lift + (IntermediateField.fixedField R.toSubgroup) := by + dsimp only [F, J, R, r] + change + IntermediateField.fixedField H.toSubgroup ⊓ + rationalCyclotomicZHatField = + IntermediateField.lift + (IntermediateField.fixedField + (Subgroup.map + (@AlgEquiv.restrictNormalHom + ℚ _ (SeparableClosure ℚ) _ _ + rationalCyclotomicZHatField _ + rationalCyclotomicZHatField.algebra' _ _ + rationalCyclotomicZHatField_normal) + H.toSubgroup)) + exact + @InfiniteGalois.restrict_fixedField + ℚ (SeparableClosure ℚ) _ _ _ H.toSubgroup + rationalCyclotomicZHatField + rationalCyclotomicZHatField_normal + have hfix : + E.fixingSubgroup = R.toSubgroup := by + rw [hE] + exact InfiniteGalois.fixingSubgroup_fixedField R + exact hfix.symm + +/-- The degree image of a closed subgroup of the rational absolute +Galois group is the subgroup of `ZHat` fixing the intersection of its +concrete fixed field with the actual cyclotomic `ZHat`-extension. -/ +theorem + rationalCyclotomicDegreeData_fieldImage_eq_intersection_fixingSubgroup : + ∀ H : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ), + rationalCyclotomicDegreeData.fieldImage H = + (((LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H) ⊓ + rationalCyclotomicZHatField).restrict + (show + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H ⊓ + rationalCyclotomicZHatField ≤ + rationalCyclotomicZHatField from + inf_le_right)).fixingSubgroup.map + rationalCyclotomicZHatFieldGalEquivZHat.toMonoidHom := by + intro H + rw [rationalCyclotomicDegreeData.fieldImage_eq_map] + change + H.toSubgroup.map + (rationalCyclotomicZHatFieldGalEquivZHat.toMonoidHom.comp + rationalAbsoluteGaloisRestrictionToCyclotomicZHat.toMonoidHom) = + (((LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H) ⊓ + rationalCyclotomicZHatField).restrict + (show + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H ⊓ + rationalCyclotomicZHatField ≤ + rationalCyclotomicZHatField from + inf_le_right)).fixingSubgroup.map + rationalCyclotomicZHatFieldGalEquivZHat.toMonoidHom + rw [← Subgroup.map_map, + rationalAbsoluteGaloisRestriction_image_eq_intersection_fixingSubgroup] + +/-- For a finite abstract rational field, the residue degree supplied +by the actual cyclotomic degree datum is the degree of the concrete +intersection with the cyclotomic `ZHat`-extension. -/ +theorem + rationalCyclotomicDegreeData_residueDegree_eq_intersection_finrank + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + (H.residueDegree rationalCyclotomicDegreeData : ℕ) = + Module.finrank ℚ + ((LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field ⊓ + rationalCyclotomicZHatField : + IntermediateField ℚ (SeparableClosure ℚ))) := by + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let J : IntermediateField ℚ (SeparableClosure ℚ) := + F ⊓ rationalCyclotomicZHatField + let hJT : J ≤ rationalCyclotomicZHatField := + inf_le_right + let E : IntermediateField ℚ rationalCyclotomicZHatField := + J.restrict hJT + let : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + let : FiniteDimensional ℚ J := + FiniteDimensional.of_injective + (IntermediateField.inclusion + (show J ≤ F from inf_le_left)).toLinearMap + (IntermediateField.inclusion + (show J ≤ F from inf_le_left)).injective + let : FiniteDimensional ℚ E := + ((IntermediateField.restrictAlgEquiv hJT).toLinearEquiv).finiteDimensional + let HR := + H.toFiniteResidueAbstractField + rationalCyclotomicDegreeData + let : Finite + (rationalCyclotomicDegreeData.residueQuotient + H.field) := + HR.finiteResidueQuotient + have hindex : + (rationalCyclotomicDegreeData.fieldImage + H.field).index = + Module.finrank ℚ J := by + rw [ + rationalCyclotomicDegreeData_fieldImage_eq_intersection_fixingSubgroup + H.field] + change + (E.fixingSubgroup.map + rationalCyclotomicZHatFieldGalEquivZHat.toMonoidHom).index = + Module.finrank ℚ J + calc + (E.fixingSubgroup.map + rationalCyclotomicZHatFieldGalEquivZHat.toMonoidHom).index = + E.fixingSubgroup.index := + Subgroup.index_map_equiv E.fixingSubgroup + rationalCyclotomicZHatFieldGalEquivZHat.toMulEquiv + _ = Module.finrank ℚ E := + (IntermediateField.finrank_eq_fixingSubgroup_index rationalCyclotomicZHatField E).symm + _ = Module.finrank ℚ J := by + change Module.finrank ℚ (J.restrict hJT) = Module.finrank ℚ J + exact + ((IntermediateField.restrictAlgEquiv hJT).toLinearEquiv).finrank_eq.symm + let : + (rationalCyclotomicDegreeData.fieldImage + HR.field).IsFiniteRelIndex + (⊤ : Subgroup ZHatMul) := + ⟨by + change + (rationalCyclotomicDegreeData.fieldImage H.field).relIndex + (⊤ : Subgroup ZHatMul) ≠ 0 + rw [Subgroup.relIndex_top_right, hindex] + exact Module.finrank_pos.ne'⟩ + apply Nat.cast_injective (R := Cardinal) + change + ((H.residueDegree + rationalCyclotomicDegreeData : ℕ) : Cardinal) = + (Module.finrank ℚ J : Cardinal) + rw [show + H.residueDegree rationalCyclotomicDegreeData = + HR.residueDegree from rfl, + ← HR.residueDegreeCardinal_eq_coe, + DegreeData.residueDegreeCardinal, + relativeIndexCardinal_eq_index_of_finite + (show rationalCyclotomicDegreeData.fieldImage HR.field ≤ + (⊤ : Subgroup ZHatMul) from le_top)] + norm_cast + simpa only [HR, FiniteAbstractField.toFiniteResidueAbstractField, + Subgroup.relIndex_top_right] using hindex + +/-- The degree of the intersection with the rational cyclotomic +`ZHat`-extension does not depend on the chosen embedding of an +abstract fixed field into `SeparableClosure ℚ`. + +The proof extends the embedding to an automorphism of the separable +closure. That automorphism preserves the cyclotomic `ZHat`-field +because the latter is normal over `ℚ`, and hence carries the canonical +intersection onto the intersection formed with the chosen image. -/ +theorem + abstractFixedFieldCyclotomicZHatIntersection_finrank_eq_of_embedding + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (ι : + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field →ₐ[ℚ] + SeparableClosure ℚ) : + Module.finrank ℚ + ((ι.fieldRange ⊓ rationalCyclotomicZHatField : + IntermediateField ℚ (SeparableClosure ℚ))) = + Module.finrank ℚ + ((LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field ⊓ + rationalCyclotomicZHatField : + IntermediateField ℚ (SeparableClosure ℚ))) := by + let K := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let T := rationalCyclotomicZHatField + let J : IntermediateField ℚ (SeparableClosure ℚ) := + K ⊓ T + let Jι : IntermediateField ℚ (SeparableClosure ℚ) := + ι.fieldRange ⊓ T + let : FiniteDimensional ℚ K := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + let : FiniteDimensional ℚ J := + FiniteDimensional.of_injective + (IntermediateField.inclusion + (show J ≤ K from inf_le_left)).toLinearMap + (IntermediateField.inclusion + (show J ≤ K from inf_le_left)).injective + let : FiniteDimensional ℚ ι.fieldRange := + (ι.equivFieldRange.toLinearEquiv).finiteDimensional + let : FiniteDimensional ℚ Jι := + FiniteDimensional.of_injective + (IntermediateField.inclusion + (show Jι ≤ ι.fieldRange from inf_le_left)).toLinearMap + (IntermediateField.inclusion + (show Jι ≤ ι.fieldRange from inf_le_left)).injective + let σ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ := + AlgEquiv.ofBijective + (ι.liftNormal (SeparableClosure ℚ)) + (AlgHom.normal_bijective + ℚ (SeparableClosure ℚ) (SeparableClosure ℚ) _) + have hσK (x : K) : + σ (x : SeparableClosure ℚ) = ι x := by + dsimp only [σ] + rw [AlgEquiv.ofBijective_apply] + simpa only [IntermediateField.algebraMap_apply, + Algebra.algebraMap_self, RingHom.id_apply] using + ι.liftNormal_commutes (SeparableClosure ℚ) x + have hmapK : + K.map σ.toAlgHom = ι.fieldRange := by + ext y + constructor + · rw [IntermediateField.mem_map] + rintro ⟨x, hx, hxy⟩ + rw [AlgHom.mem_fieldRange] + exact + ⟨⟨x, hx⟩, + (hσK ⟨x, hx⟩).symm.trans hxy⟩ + · rw [AlgHom.mem_fieldRange] + rintro ⟨x, hxy⟩ + rw [IntermediateField.mem_map] + exact + ⟨(x : SeparableClosure ℚ), x.property, + (hσK x).trans hxy⟩ + have hmapT : + T.map σ.toAlgHom = T := + (IntermediateField.normal_iff_forall_map_eq'.1 + (by + simpa only [T] using rationalCyclotomicZHatField_normal)) σ + have hmapJ : + J.map σ.toAlgHom = Jι := by + dsimp only [J, Jι] + rw [IntermediateField.map_inf, hmapK, hmapT] + let e : J ≃ₐ[ℚ] Jι := + (IntermediateField.equivMap J σ.toAlgHom).trans + (IntermediateField.equivOfEq hmapJ) + exact e.toLinearEquiv.finrank_eq.symm + +/-- The Galois group of the actual `ZHat`-extension of `ℚ` is +torsion-free. This is the property that removes every archimedean +order-two Artin factor in the normalized reciprocity construction. -/ +noncomputable instance rationalCyclotomicZHatFieldGal_isMulTorsionFree : + IsMulTorsionFree + (rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField) := + Function.Injective.isMulTorsionFree + rationalCyclotomicZHatFieldGalEquivZHat.toMonoidHom + rationalCyclotomicZHatFieldGalEquivZHat.injective + +variable (K : Type*) [Field K] [NumberField K] + +/-- The finite intersection `K ∩ ℚ_tilde` inside the common separable +closure. -/ +def numberFieldCyclotomicZHatIntersection : + IntermediateField ℚ (SeparableClosure ℚ) := + numberFieldInRationalSeparableClosure K ⊓ + rationalCyclotomicZHatField + +/-- The intersection `K ∩ ℚ_tilde`, embedded back into the original number +field through the chosen copy of `K` in `SeparableClosure ℚ`. -/ +noncomputable def numberFieldCyclotomicZHatIntersectionEmbedding : + numberFieldCyclotomicZHatIntersection K →ₐ[ℚ] K := + (numberFieldSeparableClosureEmbedding K).equivFieldRange.symm.toAlgHom.comp + (IntermediateField.inclusion inf_le_left) + +/-- The embedding of the cyclotomic intersection into `K` commutes with +the chosen embedding of `K` into the rational separable closure. -/ +@[simp] +theorem numberFieldCyclotomicZHatIntersectionEmbedding_commutes + (x : numberFieldCyclotomicZHatIntersection K) : + numberFieldSeparableClosureEmbedding K + (numberFieldCyclotomicZHatIntersectionEmbedding K x) = + (x : SeparableClosure ℚ) := by + change + (((numberFieldSeparableClosureEmbedding K).equivFieldRange + ((numberFieldSeparableClosureEmbedding K).equivFieldRange.symm + ((IntermediateField.inclusion inf_le_left) x)) : + numberFieldInRationalSeparableClosure K) : + SeparableClosure ℚ) = + (x : SeparableClosure ℚ) + rw [AlgEquiv.apply_symm_apply] + rfl + +noncomputable instance + numberFieldCyclotomicZHatIntersection_finiteDimensional : + FiniteDimensional ℚ + (numberFieldCyclotomicZHatIntersection K) := by + let f : + numberFieldCyclotomicZHatIntersection K →ₐ[ℚ] + numberFieldInRationalSeparableClosure K := + (IntermediateField.inclusion + (show + numberFieldCyclotomicZHatIntersection K ≤ + numberFieldInRationalSeparableClosure K from + inf_le_left)) + exact FiniteDimensional.of_injective f.toLinearMap f.injective + +noncomputable instance + numberFieldCyclotomicZHatIntersection_numberField : + NumberField (numberFieldCyclotomicZHatIntersection K) where + to_charZero := inferInstance + to_finiteDimensional := inferInstance + +noncomputable instance + numberFieldCyclotomicZHatIntersection_isAbelianGalois : + IsAbelianGalois ℚ + (numberFieldCyclotomicZHatIntersection K) := by + exact @IsAbelianGalois.of_algHom + ℚ (numberFieldCyclotomicZHatIntersection K) + rationalCyclotomicZHatField + _ _ _ _ _ + (IntermediateField.inclusion + (show + numberFieldCyclotomicZHatIntersection K ≤ + rationalCyclotomicZHatField from + inf_le_right)) + rationalCyclotomicZHatField_isAbelianGalois + +/-- The cyclotomic intersection degree +`f_K = [K ∩ ℚ_tilde : ℚ]`. -/ +noncomputable def cyclotomicZHatIntersectionDegree : ℕ := + Module.finrank ℚ (numberFieldCyclotomicZHatIntersection K) + +/-- For an abstract fixed field, the intersection degree computed +using `numberFieldSeparableClosureEmbedding` is the degree of the +canonical intersection already present in the rational absolute +Galois correspondence. -/ +theorem + cyclotomicZHatIntersectionDegree_abstractFixedField_eq_intersection_finrank + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + letI : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + letI : NumberField F := + NumberField.of_module_finite ℚ F + cyclotomicZHatIntersectionDegree F = + Module.finrank ℚ + ((F ⊓ rationalCyclotomicZHatField : + IntermediateField ℚ (SeparableClosure ℚ))) := by + dsimp only + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + let : NumberField F := + NumberField.of_module_finite ℚ F + change + Module.finrank ℚ + (numberFieldCyclotomicZHatIntersection F) = + Module.finrank ℚ + ((F ⊓ rationalCyclotomicZHatField : + IntermediateField ℚ (SeparableClosure ℚ))) + change + Module.finrank ℚ + (((numberFieldSeparableClosureEmbedding F).fieldRange ⊓ + rationalCyclotomicZHatField : + IntermediateField ℚ (SeparableClosure ℚ))) = + Module.finrank ℚ + ((LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field ⊓ rationalCyclotomicZHatField : + IntermediateField ℚ (SeparableClosure ℚ))) + exact + abstractFixedFieldCyclotomicZHatIntersection_finrank_eq_of_embedding + H (numberFieldSeparableClosureEmbedding F) + +/-- The concrete intersection degree of an abstract fixed field, +formed using the arbitrary chosen number-field embedding, is exactly +the residue degree supplied by `rationalCyclotomicDegreeData`. -/ +theorem + cyclotomicZHatIntersectionDegree_abstractFixedField_eq_residueDegree + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + letI : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + letI : NumberField F := + NumberField.of_module_finite ℚ F + cyclotomicZHatIntersectionDegree F = + (H.residueDegree rationalCyclotomicDegreeData : ℕ) := by + exact + (cyclotomicZHatIntersectionDegree_abstractFixedField_eq_intersection_finrank + H).trans + (rationalCyclotomicDegreeData_residueDegree_eq_intersection_finrank + H).symm + +/-- The cyclotomic intersection degree is positive. -/ +theorem cyclotomicZHatIntersectionDegree_pos : + 0 < cyclotomicZHatIntersectionDegree K := + Module.finrank_pos + +/-- The intersection degree divides the absolute degree of the number +field. -/ +theorem cyclotomicZHatIntersectionDegree_dvd_finrank : + cyclotomicZHatIntersectionDegree K ∣ + Module.finrank ℚ K := by + have h : + Module.finrank ℚ + (numberFieldCyclotomicZHatIntersection K) ∣ + Module.finrank ℚ + (numberFieldInRationalSeparableClosure K) := + IntermediateField.finrank_dvd_of_le_right + (show + numberFieldCyclotomicZHatIntersection K ≤ + numberFieldInRationalSeparableClosure K from + inf_le_left) + rw [numberFieldInRationalSeparableClosure] at h + rw [← + ((numberFieldSeparableClosureEmbedding K).equivFieldRange.toLinearEquiv).finrank_eq] at h + simpa only [cyclotomicZHatIntersectionDegree] using h + +/-- Under the actual Galois identification with `ZHat`, the +subgroup fixing `K ∩ ℚ_tilde` is precisely +`f_K ZHat`, where `f_K = [K ∩ ℚ_tilde : ℚ]`. -/ +theorem + rationalCyclotomicZHatFieldGal_fixingSubgroup_image_eq_mulNat_range : + (((numberFieldCyclotomicZHatIntersection K).restrict + (show + numberFieldCyclotomicZHatIntersection K ≤ + rationalCyclotomicZHatField from + inf_le_right)).fixingSubgroup.map + rationalCyclotomicZHatFieldGalEquivZHat.toMonoidHom).toAddSubgroup' = + (zHatMulNat + (cyclotomicZHatIntersectionDegree K)).toAddMonoidHom.range := by + let hle : + numberFieldCyclotomicZHatIntersection K ≤ + rationalCyclotomicZHatField := + inf_le_right + let E : IntermediateField ℚ rationalCyclotomicZHatField := + (numberFieldCyclotomicZHatIntersection K).restrict hle + let e := + rationalCyclotomicZHatFieldGalEquivZHat + change + (E.fixingSubgroup.map + e.toMonoidHom).toAddSubgroup' = + (zHatMulNat + (cyclotomicZHatIntersectionDegree K)).toAddMonoidHom.range + refine + zHatAddSubgroup_eq_mulNat_range_of_index_eq + (E.fixingSubgroup.map + e.toMonoidHom).toAddSubgroup' + (cyclotomicZHatIntersectionDegree_pos K) ?_ + change + (E.fixingSubgroup.map e.toMonoidHom).index = + cyclotomicZHatIntersectionDegree K + calc + (E.fixingSubgroup.map e.toMonoidHom).index = E.fixingSubgroup.index := + Subgroup.index_map_equiv E.fixingSubgroup e.toMulEquiv + _ = Module.finrank ℚ E := + (IntermediateField.finrank_eq_fixingSubgroup_index rationalCyclotomicZHatField E).symm + _ = cyclotomicZHatIntersectionDegree K := by + change + Module.finrank ℚ + ((numberFieldCyclotomicZHatIntersection K).restrict hle) = + Module.finrank ℚ (numberFieldCyclotomicZHatIntersection K) + exact + ((IntermediateField.restrictAlgEquiv hle).toLinearEquiv).finrank_eq.symm + +/-- The actual compositum of the chosen copy of `K` with a finite +Galois layer of the rational cyclotomic `ZHat`-extension. -/ +def numberFieldCyclotomicZHatFiniteCompositum + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IntermediateField ℚ (SeparableClosure ℚ) := + numberFieldInRationalSeparableClosure K ⊔ + IntermediateField.lift E.toIntermediateField + +noncomputable instance + numberFieldCyclotomicZHatFiniteCompositum_finiteDimensional + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + FiniteDimensional ℚ + (numberFieldCyclotomicZHatFiniteCompositum K E) := by + let : FiniteDimensional ℚ (IntermediateField.lift E.toIntermediateField) := + ((IntermediateField.liftAlgEquiv E.toIntermediateField).toLinearEquiv).finiteDimensional + exact + IntermediateField.finiteDimensional_sup + (numberFieldInRationalSeparableClosure K) + (IntermediateField.lift E.toIntermediateField) + +noncomputable instance + numberFieldCyclotomicZHatFiniteCompositum_numberField + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + NumberField + (numberFieldCyclotomicZHatFiniteCompositum K E) := + NumberField.of_module_finite ℚ + (numberFieldCyclotomicZHatFiniteCompositum K E) + +/-- The chosen embedding of `K` into each finite cyclotomic +compositum. -/ +noncomputable def + numberFieldCyclotomicZHatFiniteCompositumEmbedding + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + K →ₐ[ℚ] numberFieldCyclotomicZHatFiniteCompositum K E := + (numberFieldSeparableClosureEmbedding K).codRestrict + (numberFieldCyclotomicZHatFiniteCompositum K E).toSubalgebra + (fun x => + (show numberFieldInRationalSeparableClosure K ≤ + numberFieldCyclotomicZHatFiniteCompositum K E from + le_sup_left) + (show numberFieldSeparableClosureEmbedding K x ∈ + numberFieldInRationalSeparableClosure K from + (AlgHom.mem_fieldRange).mpr ⟨x, rfl⟩)) + +/-- A finite cyclotomic layer embedded into its compositum with `K`. -/ +noncomputable def + rationalCyclotomicZHatFiniteLayerCompositumEmbedding + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + E →ₐ[ℚ] numberFieldCyclotomicZHatFiniteCompositum K E := + (IntermediateField.inclusion le_sup_right).comp + (IntermediateField.liftAlgEquiv E.toIntermediateField).toAlgHom + +noncomputable instance + numberFieldCyclotomicZHatFiniteCompositumAlgebra + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Algebra K + (numberFieldCyclotomicZHatFiniteCompositum K E) := + (numberFieldCyclotomicZHatFiniteCompositumEmbedding K E).toRingHom.toAlgebra + +noncomputable instance + rationalCyclotomicZHatFiniteLayerCompositumAlgebra + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Algebra E + (numberFieldCyclotomicZHatFiniteCompositum K E) := + (rationalCyclotomicZHatFiniteLayerCompositumEmbedding K E).toRingHom.toAlgebra + +/-- The scalar action on the finite compositum induced by its actual +finite-layer embedding. Declaring it directly avoids asking instance search +to rediscover the action through an unrelated intermediate-field algebra. -/ +noncomputable instance + rationalCyclotomicZHatFiniteLayerCompositumSmul + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + SMul E + (numberFieldCyclotomicZHatFiniteCompositum K E) := + (rationalCyclotomicZHatFiniteLayerCompositumAlgebra K E).toSMul + +/-- The actual intersection `K ∩ E` inside the finite compositum, +transported back to the finite cyclotomic layer `E`. -/ +def numberFieldCyclotomicZHatFiniteIntersection + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IntermediateField ℚ E := + IntermediateField.comap + (rationalCyclotomicZHatFiniteLayerCompositumEmbedding K E) + (numberFieldCyclotomicZHatFiniteCompositumEmbedding K E).fieldRange + +/-- An element of the finite-layer intersection is, in the common +separable closure, an element of the full intersection `K ∩ ℚ_tilde`. -/ +theorem + numberFieldCyclotomicZHatFiniteIntersection_coe_mem_intersection + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) + (x : E) + (hx : + x ∈ numberFieldCyclotomicZHatFiniteIntersection K E) : + ((((x : E) : rationalCyclotomicZHatField) : + SeparableClosure ℚ)) ∈ + numberFieldCyclotomicZHatIntersection K := by + let C := + numberFieldCyclotomicZHatFiniteCompositum K E + let eK : K →ₐ[ℚ] C := + numberFieldCyclotomicZHatFiniteCompositumEmbedding K E + let eE : E →ₐ[ℚ] C := + rationalCyclotomicZHatFiniteLayerCompositumEmbedding K E + change eE x ∈ eK.fieldRange at hx + rw [AlgHom.mem_fieldRange] at hx + obtain ⟨k, hk⟩ := hx + have hkΩ : + numberFieldSeparableClosureEmbedding K k = + ((((x : E) : rationalCyclotomicZHatField) : + SeparableClosure ℚ)) := by + have h := congrArg (fun y : C => y.1) hk + change numberFieldSeparableClosureEmbedding K k = + ((((x : E) : rationalCyclotomicZHatField) : + SeparableClosure ℚ)) at h + exact h + constructor + · exact ⟨k, hkΩ⟩ + · exact ((x : E) : rationalCyclotomicZHatField).property + +private theorem sup_restrict_sup_eq_top + {R Ω : Type*} [Field R] [Field Ω] [Algebra R Ω] + (A B : IntermediateField R Ω) : + B.restrict (show B ≤ A ⊔ B from le_sup_right) ⊔ + A.restrict (show A ≤ A ⊔ B from le_sup_left) = ⊤ := by + apply IntermediateField.lift_injective (A ⊔ B) + rw [IntermediateField.lift_sup, IntermediateField.lift_restrict, + IntermediateField.lift_restrict, IntermediateField.lift_top] + exact sup_comm _ _ + +instance + numberFieldCyclotomicZHatFiniteCompositum_scalarTower + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsScalarTower ℚ K + (numberFieldCyclotomicZHatFiniteCompositum K E) := + IsScalarTower.of_algebraMap_eq' + ((numberFieldCyclotomicZHatFiniteCompositumEmbedding K E).comp_algebraMap.symm) + +instance + rationalCyclotomicZHatFiniteLayerCompositum_scalarTower + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsScalarTower ℚ E + (numberFieldCyclotomicZHatFiniteCompositum K E) := + IsScalarTower.of_algebraMap_eq' + ((rationalCyclotomicZHatFiniteLayerCompositumEmbedding K E).comp_algebraMap.symm) + +noncomputable instance + numberFieldCyclotomicZHatFiniteCompositum_finiteDimensional_over_K + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + FiniteDimensional K + (numberFieldCyclotomicZHatFiniteCompositum K E) := + FiniteDimensional.right ℚ K + (numberFieldCyclotomicZHatFiniteCompositum K E) + +noncomputable instance + numberFieldCyclotomicZHatFiniteCompositum_finiteDimensional_over_layer + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + FiniteDimensional E + (numberFieldCyclotomicZHatFiniteCompositum K E) := by + let : NumberField E := NumberField.of_module_finite ℚ E + let : Algebra E + (numberFieldCyclotomicZHatFiniteCompositum K E) := + ((rationalCyclotomicZHatFiniteLayerCompositumEmbedding K E).toRingHom).toAlgebra + let : Module E + (numberFieldCyclotomicZHatFiniteCompositum K E) := + Algebra.toModule + let : IsScalarTower ℚ E + (numberFieldCyclotomicZHatFiniteCompositum K E) := + rationalCyclotomicZHatFiniteLayerCompositum_scalarTower K E + exact + FiniteDimensional.right ℚ E + (numberFieldCyclotomicZHatFiniteCompositum K E) + +noncomputable instance + numberFieldCyclotomicZHatFiniteCompositum_isGalois + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsGalois K + (numberFieldCyclotomicZHatFiniteCompositum K E) := by + let C := + numberFieldCyclotomicZHatFiniteCompositum K E + let : Algebra ℚ C := C.algebra' + let A : IntermediateField ℚ C := + (numberFieldInRationalSeparableClosure K).restrict + (show + numberFieldInRationalSeparableClosure K ≤ C from + le_sup_left) + let B : IntermediateField ℚ C := + (IntermediateField.lift E.toIntermediateField).restrict + (show IntermediateField.lift E.toIntermediateField ≤ C from le_sup_right) + let : Algebra ℚ B := B.algebra' + let eK : K ≃ₐ[ℚ] A := + (numberFieldSeparableClosureEmbedding K).equivFieldRange.trans + (IntermediateField.restrictAlgEquiv le_sup_left) + let eE : E ≃ₐ[ℚ] B := + (IntermediateField.liftAlgEquiv E.toIntermediateField).trans + (IntermediateField.restrictAlgEquiv le_sup_right) + let hE : IsGalois ℚ E := E.isGalois + let : IsGalois ℚ E := hE + let hfiniteB : FiniteDimensional ℚ B := + eE.toLinearEquiv.finiteDimensional + let hB : IsGalois ℚ B := + @IsGalois.of_algEquiv ℚ E _ _ B _ _ _ hE eE + let : FiniteDimensional ℚ B := hfiniteB + let : IsGalois ℚ B := hB + have hsup : B ⊔ A = ⊤ := sup_restrict_sup_eq_top _ _ + let : IsGalois A C := + @IsGalois.sup_right ℚ _ C _ _ B A hB hfiniteB hsup + refine + @IsGalois.of_equiv_equiv A C _ _ _ K C _ _ _ (by infer_instance) + eK.symm.toRingEquiv (RingEquiv.refl C) ?_ + ext x + have heK (y : K) : + algebraMap K C y = algebraMap A C (eK y) := by + apply Subtype.ext + rfl + simpa using + congrArg (fun z : C => (z : SeparableClosure ℚ)) (heK (eK.symm x)) + +noncomputable instance + numberFieldCyclotomicZHatFiniteCompositum_isAbelianGalois + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsAbelianGalois K + (numberFieldCyclotomicZHatFiniteCompositum K E) := by + let C := + numberFieldCyclotomicZHatFiniteCompositum K E + let : Algebra ℚ C := C.algebra' + let A : IntermediateField ℚ C := + (numberFieldInRationalSeparableClosure K).restrict + (show + numberFieldInRationalSeparableClosure K ≤ C from + le_sup_left) + let B : IntermediateField ℚ C := + (IntermediateField.lift E.toIntermediateField).restrict + (show IntermediateField.lift E.toIntermediateField ≤ C from le_sup_right) + let : Algebra ℚ B := B.algebra' + let eK : K ≃ₐ[ℚ] A := + (numberFieldSeparableClosureEmbedding K).equivFieldRange.trans + (IntermediateField.restrictAlgEquiv le_sup_left) + let eE : E ≃ₐ[ℚ] B := + (IntermediateField.liftAlgEquiv E.toIntermediateField).trans + (IntermediateField.restrictAlgEquiv le_sup_right) + let hE : IsGalois ℚ E := E.isGalois + let : IsGalois ℚ E := hE + let hfiniteB : FiniteDimensional ℚ B := + eE.toLinearEquiv.finiteDimensional + let : IsAbelianGalois ℚ E := + IsAbelianGalois.tower_bot ℚ E rationalCyclotomicZHatField + let hB : IsAbelianGalois ℚ B := + @IsAbelianGalois.of_algHom ℚ B E _ _ _ _ _ eE.symm.toAlgHom + (IsAbelianGalois.tower_bot ℚ E rationalCyclotomicZHatField) + let : FiniteDimensional ℚ B := hfiniteB + let : IsAbelianGalois ℚ B := hB + have hsup : B ⊔ A = ⊤ := sup_restrict_sup_eq_top _ _ + let : IsGalois A C := + @IsGalois.sup_right ℚ _ C _ _ B A hB.toIsGalois hfiniteB hsup + let r : + (C ≃ₐ[A] C) →* (B ≃ₐ[ℚ] B) := + IntermediateField.restrictRestrictAlgEquivMapHom + ℚ B A C + have hr : Function.Injective r := + IntermediateField.restrictRestrictAlgEquivMapHom_injective B A hsup + let : IsAbelianGalois A C := + { is_comm.comm := fun σ τ => by + apply hr + calc + r (σ * τ) = r σ * r τ := r.map_mul σ τ + _ = r τ * r σ := IsMulCommutative.is_comm.comm _ _ + _ = r (τ * σ) := (r.map_mul τ σ).symm } + have heK (x : K) : + algebraMap K C x = + algebraMap A C (eK x) := by + apply Subtype.ext + rfl + let changeBase : + (C ≃ₐ[K] C) →* (C ≃ₐ[A] C) := + { toFun := fun σ => + { σ.toRingEquiv with + commutes' := by + intro y + have hy : + algebraMap K C (eK.symm y) = + algebraMap A C y := by + simpa using heK (eK.symm y) + rw [← hy] + change σ (algebraMap K C (eK.symm y)) = + algebraMap K C (eK.symm y) + exact σ.commutes _ } + map_one' := rfl + map_mul' := fun _ _ => rfl } + have hchangeBase : + Function.Injective changeBase := by + intro σ τ hστ + apply AlgEquiv.ext + intro x + exact + congrArg + (fun f : C ≃ₐ[A] C => f x) + hστ + exact + { is_comm.comm := fun σ τ => by + apply hchangeBase + calc + changeBase (σ * τ) = changeBase σ * changeBase τ := + changeBase.map_mul σ τ + _ = changeBase τ * changeBase σ := IsMulCommutative.is_comm.comm _ _ + _ = changeBase (τ * σ) := (changeBase.map_mul τ σ).symm } + +/-- Restriction from the actual finite compositum over `K` has image +exactly the subgroup of `Gal(E/ℚ)` fixing the actual intersection +`K ∩ E`. -/ +theorem + numberFieldCyclotomicZHatFiniteCompositum_restriction_range + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + letI : Normal ℚ E := E.isGalois.to_normal + let C := + numberFieldCyclotomicZHatFiniteCompositum K E + (IntermediateField.restrictRestrictAlgEquivMapHom + ℚ E K C).range = + (numberFieldCyclotomicZHatFiniteIntersection K E).fixingSubgroup := by + let : Normal ℚ E := E.isGalois.to_normal + let C := + numberFieldCyclotomicZHatFiniteCompositum K E + let : Algebra ℚ C := C.algebra' + let : Algebra K C := + numberFieldCyclotomicZHatFiniteCompositumAlgebra K E + let : IsScalarTower ℚ K C := + numberFieldCyclotomicZHatFiniteCompositum_scalarTower K E + let : Algebra E C := + rationalCyclotomicZHatFiniteLayerCompositumAlgebra K E + let : IsScalarTower ℚ E C := + rationalCyclotomicZHatFiniteLayerCompositum_scalarTower K E + let eK : K →ₐ[ℚ] C := + numberFieldCyclotomicZHatFiniteCompositumEmbedding K E + let eE : E →ₐ[ℚ] C := + rationalCyclotomicZHatFiniteLayerCompositumEmbedding K E + let r : + (C ≃ₐ[K] C) →* (E ≃ₐ[ℚ] E) := + IntermediateField.restrictRestrictAlgEquivMapHom + ℚ E K C + let J : IntermediateField ℚ E := + numberFieldCyclotomicZHatFiniteIntersection K E + have restriction_commutes + (τ : C ≃ₐ[K] C) (x : E) : + eE (r τ x) = τ (eE x) := by + change algebraMap E C (r τ x) = τ (algebraMap E C x) + change + algebraMap E C + ((AlgEquiv.restrictNormal + (MulSemiringAction.toAlgEquiv ℚ C τ) E) x) = + (MulSemiringAction.toAlgEquiv ℚ C τ) (algebraMap E C x) + exact AlgEquiv.restrictNormal_commutes + (MulSemiringAction.toAlgEquiv ℚ C τ) E x + have hfixedField : + IntermediateField.fixedField r.range = J := by + ext x + rw [IntermediateField.mem_fixedField_iff] + change + (∀ σ, σ ∈ r.range → σ x = x) ↔ + eE x ∈ eK.fieldRange + constructor + · intro hx + have hfixed : + ∀ τ : C ≃ₐ[K] C, τ (eE x) = eE x := by + intro τ + have hxτ : + r τ x = x := + hx (r τ) ⟨τ, rfl⟩ + have hrestrict : + eE (r τ x) = τ (eE x) := by + exact restriction_commutes τ x + exact hrestrict.symm.trans (congrArg eE hxτ) + have hmem : + eE x ∈ Set.range (algebraMap K C) := + (IsGalois.mem_range_algebraMap_iff_fixed + (eE x)).2 hfixed + rw [AlgHom.mem_fieldRange] + obtain ⟨k, hk⟩ := hmem + refine ⟨k, ?_⟩ + change algebraMap K C k = eE x + exact hk + · intro hx σ hσ + obtain ⟨τ, rfl⟩ := hσ + rw [AlgHom.mem_fieldRange] at hx + obtain ⟨k, hk⟩ := hx + apply eE.injective + change eE (r τ x) = eE x + have hrestrict : + eE (r τ x) = τ (eE x) := by + exact restriction_commutes τ x + rw [hrestrict, ← hk] + change τ (algebraMap K C k) = algebraMap K C k + exact τ.commutes k + calc + r.range = + (IntermediateField.fixedField r.range).fixingSubgroup := + (IntermediateField.fixingSubgroup_fixedField + r.range).symm + _ = J.fixingSubgroup := by rw [hfixedField] + +/-- The actual compositum `Kℚ_tilde` inside `SeparableClosure ℚ`. -/ +def numberFieldCyclotomicZHatCompositum : + IntermediateField ℚ (SeparableClosure ℚ) := + numberFieldInRationalSeparableClosure K ⊔ + rationalCyclotomicZHatField + +/-- The chosen copy of `K` embedded into its actual cyclotomic +`ZHat`-compositum. -/ +noncomputable def numberFieldCyclotomicZHatCompositumEmbedding : + K →ₐ[ℚ] numberFieldCyclotomicZHatCompositum K := + (numberFieldSeparableClosureEmbedding K).codRestrict + (numberFieldCyclotomicZHatCompositum K).toSubalgebra + (fun x => + (show numberFieldInRationalSeparableClosure K ≤ + numberFieldCyclotomicZHatCompositum K from + le_sup_left) + (show numberFieldSeparableClosureEmbedding K x ∈ + numberFieldInRationalSeparableClosure K from + (AlgHom.mem_fieldRange).mpr ⟨x, rfl⟩)) + +/-- The compositum embedding preserves the chosen separable-closure representative. -/ +theorem numberFieldCyclotomicZHatCompositumEmbedding_coe (x : K) : + (numberFieldCyclotomicZHatCompositumEmbedding K x : SeparableClosure ℚ) = + numberFieldSeparableClosureEmbedding K x := rfl + +/-- The rational cyclotomic `ZHat`-field embedded into its compositum +with `K`. -/ +noncomputable def rationalCyclotomicZHatCompositumEmbedding : + rationalCyclotomicZHatField →ₐ[ℚ] + numberFieldCyclotomicZHatCompositum K := + IntermediateField.inclusion le_sup_right + +noncomputable instance numberFieldCyclotomicZHatCompositumAlgebra : + Algebra K (numberFieldCyclotomicZHatCompositum K) := + ((numberFieldCyclotomicZHatCompositumEmbedding K).toRingHom).toAlgebra + +noncomputable instance rationalCyclotomicZHatCompositumAlgebra : + Algebra rationalCyclotomicZHatField + (numberFieldCyclotomicZHatCompositum K) := + ((rationalCyclotomicZHatCompositumEmbedding K).toRingHom).toAlgebra + +instance numberFieldCyclotomicZHatCompositum_scalarTower : + IsScalarTower ℚ K + (numberFieldCyclotomicZHatCompositum K) := + IsScalarTower.of_algebraMap_eq' + ((numberFieldCyclotomicZHatCompositumEmbedding K).comp_algebraMap.symm) + +instance rationalCyclotomicZHatCompositum_scalarTower : + IsScalarTower ℚ rationalCyclotomicZHatField + (numberFieldCyclotomicZHatCompositum K) := + IsScalarTower.of_algebraMap_eq' + ((rationalCyclotomicZHatCompositumEmbedding K).comp_algebraMap.symm) + +noncomputable instance + numberFieldCyclotomicZHatCompositum_isGalois : + IsGalois K (numberFieldCyclotomicZHatCompositum K) := by + let A : IntermediateField ℚ (SeparableClosure ℚ) := + numberFieldInRationalSeparableClosure K + let : Algebra A (SeparableClosure ℚ) := A.val.toAlgebra + let rationalCyclotomicZHatFieldIsGalois : + IsGalois ℚ rationalCyclotomicZHatField := + rationalCyclotomicZHatField_isAbelianGalois.toIsGalois + let C := numberFieldCyclotomicZHatCompositum K + let eK : K ≃ₐ[ℚ] A := + (numberFieldSeparableClosureEmbedding K).equivFieldRange + have hG : + ∀ E : FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField, + IsGalois A + (IntermediateField.extendScalars (F := A) + (E := A ⊔ IntermediateField.lift E.toIntermediateField) + le_sup_left) := by + intro E + let D := numberFieldCyclotomicZHatFiniteCompositum K E + let hAD : A ≤ D := by + dsimp only [A, D, numberFieldCyclotomicZHatFiniteCompositum] + exact le_sup_left + let : Algebra A D := (IntermediateField.inclusion hAD).toAlgebra + change IsGalois A (IntermediateField.extendScalars hAD) + have hcompat (x : K) : + algebraMap K D x = IntermediateField.inclusion hAD (eK x) := by + apply Subtype.ext + rfl + refine + IsGalois.of_equiv_equiv + (F := K) (E := D) (M := A) (N := D) + (h := by infer_instance) + (f := eK.toRingEquiv) (g := RingEquiv.refl D) ?_ + apply RingHom.ext + intro x + have hADmap (y : A) : + algebraMap A D y = IntermediateField.inclusion hAD y := by + rfl + change algebraMap A D (eK x) = algebraMap K D x + exact (hADmap (eK x)).trans (hcompat x).symm + let hAC : A ≤ C := by + dsimp only [A, C, numberFieldCyclotomicZHatCompositum] + exact le_sup_left + let full : IntermediateField A (SeparableClosure ℚ) := + IntermediateField.extendScalars hAC + have hfull0 : IsGalois A + (IntermediateField.extendScalars (F := A) + (E := A ⊔ rationalCyclotomicZHatField) le_sup_left) := + @IntermediateField.isGalois_extendScalars_sup_of_forall_finiteGalois + ℚ (SeparableClosure ℚ) _ _ _ A rationalCyclotomicZHatField + rationalCyclotomicZHatFieldIsGalois hG + have hfull : IsGalois A full := by + change IsGalois A + (IntermediateField.extendScalars (F := A) + (E := A ⊔ rationalCyclotomicZHatField) le_sup_left) + exact hfull0 + let : Algebra A C := (IntermediateField.inclusion hAC).toAlgebra + have hfull' := hfull + change IsGalois A C at hfull' + let : IsGalois A C := hfull' + have hcompat (x : K) : + algebraMap K C x = + IntermediateField.inclusion hAC (eK x) := by + apply Subtype.ext + rfl + refine + IsGalois.of_equiv_equiv + (F := A) (E := C) (M := K) (N := C) + (h := hfull') + (f := eK.symm.toRingEquiv) (g := RingEquiv.refl C) ?_ + apply RingHom.ext + intro x + have hACmap (y : A) : + algebraMap A C y = IntermediateField.inclusion hAC y := by + rfl + have hEq : algebraMap K C (eK.symm x) = algebraMap A C x := by + refine (hcompat (eK.symm x)).trans ?_ + rw [eK.apply_symm_apply] + exact (hACmap x).symm + exact hEq + +noncomputable instance + numberFieldCyclotomicZHatCompositum_isAbelianGalois : + IsAbelianGalois K + (numberFieldCyclotomicZHatCompositum K) := by + let C := numberFieldCyclotomicZHatCompositum K + let : Algebra ℚ C := C.algebra' + let A : IntermediateField ℚ C := + (numberFieldInRationalSeparableClosure K).restrict + (show + numberFieldInRationalSeparableClosure K ≤ C from + le_sup_left) + let B : IntermediateField ℚ C := + rationalCyclotomicZHatField.restrict + (show rationalCyclotomicZHatField ≤ C from le_sup_right) + let : Algebra ℚ B := B.algebra' + let eK : K ≃ₐ[ℚ] A := + (numberFieldSeparableClosureEmbedding K).equivFieldRange.trans + (IntermediateField.restrictAlgEquiv le_sup_left) + let eT : rationalCyclotomicZHatField ≃ₐ[ℚ] B := + IntermediateField.restrictAlgEquiv le_sup_right + let hB : IsAbelianGalois ℚ B := + @IsAbelianGalois.of_algHom ℚ B rationalCyclotomicZHatField + _ _ _ _ _ eT.symm.toAlgHom + rationalCyclotomicZHatField_isAbelianGalois + let : IsAbelianGalois ℚ B := hB + have hsup : B ⊔ A = ⊤ := sup_restrict_sup_eq_top _ _ + have heK (x : K) : + algebraMap K C x = + algebraMap A C (eK x) := by + apply Subtype.ext + rfl + let hAC : IsGalois A C := by + refine + @IsGalois.of_equiv_equiv K C _ _ _ A C _ _ _ (by infer_instance) + eK.toRingEquiv (RingEquiv.refl C) ?_ + ext x + simpa using + congrArg (fun z : C => (z : SeparableClosure ℚ)) (heK x).symm + let : IsGalois A C := hAC + let r : + (C ≃ₐ[A] C) →* (B ≃ₐ[ℚ] B) := + IntermediateField.restrictRestrictAlgEquivMapHom + ℚ B A C + have hr : Function.Injective r := + IntermediateField.restrictRestrictAlgEquivMapHom_injective + B A hsup + let : IsAbelianGalois A C := + { is_comm.comm := fun σ τ => by + apply hr + calc + r (σ * τ) = r σ * r τ := r.map_mul σ τ + _ = r τ * r σ := IsMulCommutative.is_comm.comm _ _ + _ = r (τ * σ) := (r.map_mul τ σ).symm } + let changeBase : + (C ≃ₐ[K] C) →* (C ≃ₐ[A] C) := + { toFun := fun σ => + { σ.toRingEquiv with + commutes' := by + intro y + have hy : + algebraMap K C (eK.symm y) = + algebraMap A C y := by + simpa using heK (eK.symm y) + rw [← hy] + change σ (algebraMap K C (eK.symm y)) = + algebraMap K C (eK.symm y) + exact σ.commutes _ } + map_one' := rfl + map_mul' := fun _ _ => rfl } + have hchangeBase : + Function.Injective changeBase := by + intro σ τ hστ + apply AlgEquiv.ext + intro x + exact + congrArg + (fun f : C ≃ₐ[A] C => f x) + hστ + exact + { is_comm.comm := fun σ τ => by + apply hchangeBase + calc + changeBase (σ * τ) = changeBase σ * changeBase τ := + changeBase.map_mul σ τ + _ = changeBase τ * changeBase σ := IsMulCommutative.is_comm.comm _ _ + _ = changeBase (τ * σ) := + (changeBase.map_mul τ σ).symm } + +/-- Inclusion of a finite cyclotomic compositum into the full +cyclotomic `ZHat`-compositum. -/ +noncomputable def + numberFieldCyclotomicZHatFiniteCompositumInclusion + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + numberFieldCyclotomicZHatFiniteCompositum K E →ₐ[ℚ] + numberFieldCyclotomicZHatCompositum K := + IntermediateField.inclusion + (sup_le_sup le_rfl + (IntermediateField.lift_le E.toIntermediateField)) + +/-- Inclusion of a finite compositum preserves its separable-closure representative. -/ +theorem numberFieldCyclotomicZHatFiniteCompositumInclusion_coe + (E : FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) + (x : numberFieldCyclotomicZHatFiniteCompositum K E) : + (numberFieldCyclotomicZHatFiniteCompositumInclusion K E x : SeparableClosure ℚ) = + (x : SeparableClosure ℚ) := + IntermediateField.coe_inclusion + (sup_le_sup le_rfl (IntermediateField.lift_le E.toIntermediateField)) x + +/-- The same finite-layer inclusion, over the chosen copy of `K`. -/ +noncomputable def + numberFieldCyclotomicZHatFiniteCompositumInclusionOverBase + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + numberFieldCyclotomicZHatFiniteCompositum K E →ₐ[K] + numberFieldCyclotomicZHatCompositum K := by + let f := + numberFieldCyclotomicZHatFiniteCompositumInclusion K E + exact + { f.toRingHom with + commutes' := by + intro x + rfl } + +/-- The finite cyclotomic compositum, as an intermediate field of the +full compositum over `K`. -/ +noncomputable def + numberFieldCyclotomicZHatFiniteLayerInCompositum + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IntermediateField K + (numberFieldCyclotomicZHatCompositum K) := + (numberFieldCyclotomicZHatFiniteCompositumInclusionOverBase K E).fieldRange + +noncomputable instance + numberFieldCyclotomicZHatFiniteLayerInCompositum_finiteDimensional + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + FiniteDimensional K + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) := + (AlgEquiv.toLinearEquiv + (AlgHom.equivFieldRange + (numberFieldCyclotomicZHatFiniteCompositumInclusionOverBase K E))).finiteDimensional + +noncomputable instance + numberFieldCyclotomicZHatFiniteLayerInCompositum_isAbelianGalois + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsAbelianGalois K + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) := + IsAbelianGalois.of_algHom + (AlgEquiv.toAlgHom + (AlgEquiv.symm + (AlgHom.equivFieldRange + (numberFieldCyclotomicZHatFiniteCompositumInclusionOverBase K E)))) + +noncomputable instance + numberFieldCyclotomicZHatFiniteLayerInCompositum_numberField + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + NumberField + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) := + NumberField.of_module_finite K + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) + +instance + numberFieldCyclotomicZHatFiniteLayerInCompositum_scalarTower + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsScalarTower ℚ K + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) := by + apply IsScalarTower.of_algebraMap_eq + intro x + apply Subtype.ext + change algebraMap ℚ (numberFieldCyclotomicZHatCompositum K) x = + algebraMap K (numberFieldCyclotomicZHatCompositum K) + (algebraMap ℚ K x) + exact + IsScalarTower.algebraMap_apply + ℚ K (numberFieldCyclotomicZHatCompositum K) x + +/-- A finite rational cyclotomic layer embedded into the corresponding +finite intermediate field of the full compositum. -/ +noncomputable def + rationalCyclotomicZHatFiniteLayerInCompositumEmbedding + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + E →ₐ[ℚ] + numberFieldCyclotomicZHatFiniteLayerInCompositum K E := by + exact + (AlgEquiv.toAlgHom + (AlgEquiv.restrictScalars ℚ + (AlgHom.equivFieldRange + (numberFieldCyclotomicZHatFiniteCompositumInclusionOverBase K E)))).comp + (rationalCyclotomicZHatFiniteLayerCompositumEmbedding K E) + +noncomputable instance + rationalCyclotomicZHatFiniteLayerInCompositumAlgebra + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Algebra E + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) := + RingHom.toAlgebra + (AlgHom.toRingHom + (rationalCyclotomicZHatFiniteLayerInCompositumEmbedding K E)) + +/-- The finite-layer scalar action on its actual image in the full +compositum. -/ +noncomputable instance + rationalCyclotomicZHatFiniteLayerInCompositumSmul + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + SMul E + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) := + Algebra.toSMul + (self := rationalCyclotomicZHatFiniteLayerInCompositumAlgebra K E) + +instance + rationalCyclotomicZHatFiniteLayerInCompositum_scalarTower + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsScalarTower ℚ E + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) := + IsScalarTower.of_algebraMap_eq' + (AlgHom.comp_algebraMap + (rationalCyclotomicZHatFiniteLayerInCompositumEmbedding K E)).symm + +/-- The corresponding finite layer as an object of the inverse system +of finite Galois subextensions of the full compositum. -/ +noncomputable def + numberFieldCyclotomicZHatFiniteGaloisLayerInCompositum + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + FiniteGaloisIntermediateField K + (numberFieldCyclotomicZHatCompositum K) where + toIntermediateField := + numberFieldCyclotomicZHatFiniteLayerInCompositum K E + finiteDimensional := inferInstance + isGalois := inferInstance + +/-- Restriction from the cyclotomic compositum over `K` to the rational +cyclotomic `ZHat`-field. -/ +noncomputable def numberFieldCyclotomicZHatCompositumRestriction : + Gal((numberFieldCyclotomicZHatCompositum K)/K) →* + Gal(rationalCyclotomicZHatField/ℚ) := + IntermediateField.restrictRestrictAlgEquivMapHom + ℚ rationalCyclotomicZHatField K + (numberFieldCyclotomicZHatCompositum K) + +/-- Restriction to the rational cyclotomic factor is injective. -/ +theorem numberFieldCyclotomicZHatCompositumRestriction_injective : + Function.Injective + (numberFieldCyclotomicZHatCompositumRestriction K) := by + let C := numberFieldCyclotomicZHatCompositum K + let : Algebra ℚ C := C.algebra' + let : Algebra K C := numberFieldCyclotomicZHatCompositumAlgebra K + let : IsScalarTower ℚ K C := + numberFieldCyclotomicZHatCompositum_scalarTower K + let : Algebra rationalCyclotomicZHatField C := + rationalCyclotomicZHatCompositumAlgebra K + let : IsScalarTower ℚ rationalCyclotomicZHatField C := + rationalCyclotomicZHatCompositum_scalarTower K + let A : IntermediateField ℚ C := + (numberFieldInRationalSeparableClosure K).restrict + (show + numberFieldInRationalSeparableClosure K ≤ C from + le_sup_left) + let B : IntermediateField ℚ C := + rationalCyclotomicZHatField.restrict + (show rationalCyclotomicZHatField ≤ C from le_sup_right) + let : Algebra ℚ B := B.algebra' + let eK : K ≃ₐ[ℚ] A := + (numberFieldSeparableClosureEmbedding K).equivFieldRange.trans + (IntermediateField.restrictAlgEquiv le_sup_left) + let eT : rationalCyclotomicZHatField ≃ₐ[ℚ] B := + IntermediateField.restrictAlgEquiv le_sup_right + let hB : IsAbelianGalois ℚ B := + @IsAbelianGalois.of_algHom ℚ B rationalCyclotomicZHatField + _ _ _ _ _ eT.symm.toAlgHom + rationalCyclotomicZHatField_isAbelianGalois + let : IsAbelianGalois ℚ B := hB + have hsup : B ⊔ A = ⊤ := sup_restrict_sup_eq_top _ _ + let rB : + (C ≃ₐ[A] C) →* (B ≃ₐ[ℚ] B) := + IntermediateField.restrictRestrictAlgEquivMapHom ℚ B A C + have hrB : Function.Injective rB := + IntermediateField.restrictRestrictAlgEquivMapHom_injective B A hsup + have heK (x : K) : + algebraMap K C x = algebraMap A C (eK x) := by + apply Subtype.ext + rfl + let changeBase : + (C ≃ₐ[K] C) →* (C ≃ₐ[A] C) := + { toFun := fun σ => + { σ.toRingEquiv with + commutes' := by + intro y + have hy : + algebraMap K C (eK.symm y) = + algebraMap A C y := by + simpa using heK (eK.symm y) + rw [← hy] + change σ (algebraMap K C (eK.symm y)) = + algebraMap K C (eK.symm y) + exact σ.commutes _ } + map_one' := rfl + map_mul' := fun _ _ => rfl } + have hchangeBase : Function.Injective changeBase := by + intro σ τ hστ + apply AlgEquiv.ext + intro x + exact congrArg (fun f : C ≃ₐ[A] C => f x) hστ + let transportT : + Gal(rationalCyclotomicZHatField/ℚ) →* + (B ≃ₐ[ℚ] B) := + (AlgEquiv.autCongr eT).toMonoidHom + have raw_restriction_commutes + (σ : C ≃ₐ[K] C) (x : rationalCyclotomicZHatField) : + (eT ((numberFieldCyclotomicZHatCompositumRestriction K σ) x) : C) = + σ (eT x : C) := by + change + algebraMap rationalCyclotomicZHatField C + (numberFieldCyclotomicZHatCompositumRestriction K σ x) = + σ (algebraMap rationalCyclotomicZHatField C x) + change + algebraMap rationalCyclotomicZHatField C + ((AlgEquiv.restrictNormal + (MulSemiringAction.toAlgEquiv ℚ C σ) + rationalCyclotomicZHatField) x) = + (MulSemiringAction.toAlgEquiv ℚ C σ) + (algebraMap rationalCyclotomicZHatField C x) + exact AlgEquiv.restrictNormal_commutes + (MulSemiringAction.toAlgEquiv ℚ C σ) + rationalCyclotomicZHatField x + have hcomm (σ : C ≃ₐ[K] C) : + transportT (numberFieldCyclotomicZHatCompositumRestriction K σ) = + rB (changeBase σ) := by + apply AlgEquiv.ext + intro x + obtain ⟨y, rfl⟩ := eT.surjective x + apply Subtype.ext + have hBrestrict : + (rB (changeBase σ) (eT y) : C) = + changeBase σ (eT y : C) := by + exact IntermediateField.restrictRestrictAlgEquivMapHom_apply + B A (changeBase σ) (eT y) + calc + (transportT (numberFieldCyclotomicZHatCompositumRestriction K σ) + (eT y) : C) = + (eT (numberFieldCyclotomicZHatCompositumRestriction K σ y) : C) := by + change + ((eT.symm.trans + ((numberFieldCyclotomicZHatCompositumRestriction K σ).trans eT)) + (eT y) : C) = + (eT ((numberFieldCyclotomicZHatCompositumRestriction K σ) y) : C) + simp only [AlgEquiv.trans_apply, AlgEquiv.symm_apply_apply] + _ = σ (eT y : C) := raw_restriction_commutes σ y + _ = changeBase σ (eT y : C) := rfl + _ = (rB (changeBase σ) (eT y) : C) := hBrestrict.symm + intro σ τ hστ + apply hchangeBase + apply hrB + rw [← hcomm σ, ← hcomm τ, hστ] + +/-- Restriction to a finite rational cyclotomic layer commutes with +first restricting an automorphism of the full compositum to the +corresponding finite compositum over `K`. -/ +theorem + restrictNormalHom_numberFieldCyclotomicZHatCompositumRestriction + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) + (σ : + Gal((numberFieldCyclotomicZHatCompositum K)/K)) : + letI : Algebra ℚ (numberFieldCyclotomicZHatCompositum K) := + (numberFieldCyclotomicZHatCompositum K).algebra' + letI : Algebra K (numberFieldCyclotomicZHatCompositum K) := + numberFieldCyclotomicZHatCompositumAlgebra K + letI : IsScalarTower ℚ K (numberFieldCyclotomicZHatCompositum K) := + numberFieldCyclotomicZHatCompositum_scalarTower K + letI : Normal ℚ E := E.isGalois.to_normal + letI : Normal K + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) := by + let : IsAbelianGalois K + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) := + numberFieldCyclotomicZHatFiniteLayerInCompositum_isAbelianGalois K E + exact IsGalois.to_normal + letI : IsScalarTower K + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) + (numberFieldCyclotomicZHatCompositum K) := by + exact IntermediateField.isScalarTower_mid + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) + AlgEquiv.restrictNormalHom E + (numberFieldCyclotomicZHatCompositumRestriction K σ) = + IntermediateField.restrictRestrictAlgEquivMapHom + ℚ E K + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) + (AlgEquiv.restrictNormalHom + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) + σ) := by + let : Normal ℚ E := E.isGalois.to_normal + let : Algebra ℚ (numberFieldCyclotomicZHatCompositum K) := + (numberFieldCyclotomicZHatCompositum K).algebra' + let : Algebra K (numberFieldCyclotomicZHatCompositum K) := + numberFieldCyclotomicZHatCompositumAlgebra K + let : IsScalarTower ℚ K (numberFieldCyclotomicZHatCompositum K) := + numberFieldCyclotomicZHatCompositum_scalarTower K + let : Normal K + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) := by + let : IsAbelianGalois K + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) := + numberFieldCyclotomicZHatFiniteLayerInCompositum_isAbelianGalois K E + exact IsGalois.to_normal + let : IsScalarTower K + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) + (numberFieldCyclotomicZHatCompositum K) := by + exact IntermediateField.isScalarTower_mid + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) + let C := numberFieldCyclotomicZHatCompositum K + let T := rationalCyclotomicZHatField + let P : IntermediateField K C := + numberFieldCyclotomicZHatFiniteLayerInCompositum K E + let : Algebra T C := rationalCyclotomicZHatCompositumAlgebra K + let : IsScalarTower ℚ T C := + rationalCyclotomicZHatCompositum_scalarTower K + let : Algebra E P := + rationalCyclotomicZHatFiniteLayerInCompositumAlgebra K E + let : IsScalarTower ℚ E P := + rationalCyclotomicZHatFiniteLayerInCompositum_scalarTower K E + let : IsAbelianGalois K P := by + change IsAbelianGalois K + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) + exact numberFieldCyclotomicZHatFiniteLayerInCompositum_isAbelianGalois K E + let : Normal K P := IsGalois.to_normal + let eEP : E →ₐ[ℚ] P := + rationalCyclotomicZHatFiniteLayerInCompositumEmbedding K E + let iP : P →ₐ[K] C := IntermediateField.val P + let iT : T →ₐ[ℚ] C := rationalCyclotomicZHatCompositumEmbedding K + have hEmbedding (z : E) : + iP (eEP z) = iT (z : T) := by + apply Subtype.ext + rfl + have hL (z : E) : + ((AlgEquiv.restrictNormalHom E + (numberFieldCyclotomicZHatCompositumRestriction K σ)) z : T) = + (numberFieldCyclotomicZHatCompositumRestriction K σ) (z : T) := by + change + algebraMap E T + ((AlgEquiv.restrictNormalHom E + (numberFieldCyclotomicZHatCompositumRestriction K σ)) z) = + (numberFieldCyclotomicZHatCompositumRestriction K σ) + (algebraMap E T z) + change + algebraMap E T + ((AlgEquiv.restrictNormal + (numberFieldCyclotomicZHatCompositumRestriction K σ) E) z) = + (numberFieldCyclotomicZHatCompositumRestriction K σ) + (algebraMap E T z) + exact AlgEquiv.restrictNormal_commutes + (numberFieldCyclotomicZHatCompositumRestriction K σ) E z + have hRaw (z : T) : + iT (numberFieldCyclotomicZHatCompositumRestriction K σ z) = + σ (iT z) := by + change + algebraMap T C + (numberFieldCyclotomicZHatCompositumRestriction K σ z) = + σ (algebraMap T C z) + change + algebraMap T C + ((AlgEquiv.restrictNormal + (MulSemiringAction.toAlgEquiv ℚ C σ) T) z) = + (MulSemiringAction.toAlgEquiv ℚ C σ) (algebraMap T C z) + exact AlgEquiv.restrictNormal_commutes + (MulSemiringAction.toAlgEquiv ℚ C σ) T z + have hP (z : P) : + iP (AlgEquiv.restrictNormalHom P σ z) = σ (iP z) := by + change + algebraMap P C (AlgEquiv.restrictNormalHom P σ z) = + σ (algebraMap P C z) + change + algebraMap P C + ((AlgEquiv.restrictNormal + (MulSemiringAction.toAlgEquiv K C σ) P) z) = + (MulSemiringAction.toAlgEquiv K C σ) (algebraMap P C z) + exact AlgEquiv.restrictNormal_commutes + (MulSemiringAction.toAlgEquiv K C σ) P z + have hQ (z : E) : + eEP + (IntermediateField.restrictRestrictAlgEquivMapHom + ℚ E K P (AlgEquiv.restrictNormalHom P σ) z) = + (AlgEquiv.restrictNormalHom P σ) (eEP z) := by + change + algebraMap E P + (IntermediateField.restrictRestrictAlgEquivMapHom + ℚ E K P (AlgEquiv.restrictNormalHom P σ) z) = + (AlgEquiv.restrictNormalHom P σ) (algebraMap E P z) + change + algebraMap E P + ((AlgEquiv.restrictNormal + (MulSemiringAction.toAlgEquiv ℚ P + (AlgEquiv.restrictNormalHom P σ)) E) z) = + (MulSemiringAction.toAlgEquiv ℚ P + (AlgEquiv.restrictNormalHom P σ)) (algebraMap E P z) + exact AlgEquiv.restrictNormal_commutes + (MulSemiringAction.toAlgEquiv ℚ P + (AlgEquiv.restrictNormalHom P σ)) E z + apply AlgEquiv.ext + intro x + apply eEP.injective + apply iP.injective + calc + iP (eEP + (AlgEquiv.restrictNormalHom E + (numberFieldCyclotomicZHatCompositumRestriction K σ) x)) = + iT (((AlgEquiv.restrictNormalHom E + (numberFieldCyclotomicZHatCompositumRestriction K σ) x) : T)) := + hEmbedding _ + _ = iT + (numberFieldCyclotomicZHatCompositumRestriction K σ (x : T)) := + congrArg iT (hL x) + _ = σ (iT (x : T)) := hRaw (x : T) + _ = σ (iP (eEP x)) := congrArg σ (hEmbedding x).symm + _ = iP (AlgEquiv.restrictNormalHom P σ (eEP x)) := (hP (eEP x)).symm + _ = iP (eEP + (IntermediateField.restrictRestrictAlgEquivMapHom + ℚ E K P (AlgEquiv.restrictNormalHom P σ) x)) := + congrArg iP (hQ x).symm + +/-- Restriction from the full cyclotomic compositum to its rational +cyclotomic factor is continuous for the actual Krull topologies. -/ +theorem numberFieldCyclotomicZHatCompositumRestriction_continuous : + Continuous + (numberFieldCyclotomicZHatCompositumRestriction K) := by + apply continuous_of_continuousAt_one _ + rw [continuousAt_def, map_one] + intro U hU + rw [krullTopology_mem_nhds_one_iff] at hU + obtain ⟨M, hMfinite, hMU⟩ := hU + let : FiniteDimensional ℚ M := hMfinite + let E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField := + { toIntermediateField := + IntermediateField.normalClosure + ℚ M rationalCyclotomicZHatField + finiteDimensional := + normalClosure.is_finiteDimensional + ℚ M rationalCyclotomicZHatField + isGalois := + IsGalois.normalClosure + ℚ M rationalCyclotomicZHatField } + let : Normal ℚ E := E.isGalois.to_normal + let P := + numberFieldCyclotomicZHatFiniteLayerInCompositum K E + let : IsAbelianGalois K P := + numberFieldCyclotomicZHatFiniteLayerInCompositum_isAbelianGalois K E + let : Normal K P := IsGalois.to_normal + let : IsScalarTower K P + (numberFieldCyclotomicZHatCompositum K) := + IntermediateField.isScalarTower_mid P + rw [krullTopology_mem_nhds_one_iff] + refine ⟨P, inferInstance, ?_⟩ + intro σ hσ + have hfixP : + AlgEquiv.restrictNormalHom + P + σ = + 1 := by + have hker : σ ∈ (AlgEquiv.restrictNormalHom P).ker := by + rw [IntermediateField.restrictNormalHom_ker] + exact hσ + exact hker + have hkerE : + AlgEquiv.restrictNormalHom E + (numberFieldCyclotomicZHatCompositumRestriction K σ) = 1 := by + rw [ + restrictNormalHom_numberFieldCyclotomicZHatCompositumRestriction, + hfixP, + map_one] + have hfixE : + (numberFieldCyclotomicZHatCompositumRestriction K σ) ∈ + (E : IntermediateField ℚ rationalCyclotomicZHatField).fixingSubgroup := by + rw [← IntermediateField.restrictNormalHom_ker] + exact hkerE + apply hMU + exact IntermediateField.fixingSubgroup_antitone + (IntermediateField.le_normalClosure M) hfixE + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealization.lean new file mode 100644 index 0000000000..487b47dbeb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealization.lean @@ -0,0 +1,556 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationFinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology +/-! +# Reciprocity for a realized finite Galois number-field tower + +This module equips the compatible fixed-field realization of `L / K` with the +finite-dimensional and number-field instances needed by global class formation, +then transports abstract reciprocity back to the original tower. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open AlgebraicNumberTheory +open LocalClassFieldTheory +open RamificationTheory + +/-- Fix the canonical class-group structure before forming norm quotients. -/ +@[instance_reducible] +private noncomputable def realizedTowerIdeleClassCommGroup + (F : Type) [Field F] [NumberField F] : + CommGroup (IdeleClassGroup F) := + QuotientGroup.Quotient.commGroup (IdeleGroup.principalSubgroup F) + +attribute [local instance] realizedTowerIdeleClassCommGroup + +private theorem realizedTowerIdeleClassIsMulCommutative + (F : Type) [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + IsMulCommutative.of_comm (fun a b => mul_comm a b) + +attribute [local instance] realizedTowerIdeleClassIsMulCommutative + +variable + (K L : Type) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +omit [FiniteDimensional K L] [IsGalois K L] in +private theorem numberFieldTowerAbstractBaseFiniteDimensional : + FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L)) := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerBaseSubgroupAbsoluteQuotientFinite K L) + +private theorem numberFieldTowerAbstractRelativeFiniteDimensional : + FiniteDimensional + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L)) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) + (numberFieldTowerBaseSubgroupAbsoluteQuotientFinite K L) + (numberFieldTowerExtensionQuotientFinite K L) + +omit [FiniteDimensional K L] [IsGalois K L] in +private theorem numberFieldTowerAbstractScalarTower : + IsScalarTower ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L)) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) := + IsScalarTower.of_algebraMap_eq' rfl + +private theorem numberFieldTowerAbstractTopFiniteDimensional : + FiniteDimensional ℚ + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) := by + let := numberFieldTowerAbstractBaseFiniteDimensional K L + let := numberFieldTowerAbstractRelativeFiniteDimensional K L + let := numberFieldTowerAbstractScalarTower K L + exact FiniteDimensional.trans ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L)) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) + +omit [FiniteDimensional K L] [IsGalois K L] in +private theorem numberFieldTowerAbstractBaseNumberField : + NumberField + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L)) := by + let := numberFieldTowerAbstractBaseFiniteDimensional K L + exact NumberField.of_module_finite ℚ _ + +private theorem numberFieldTowerAbstractTopNumberField : + NumberField + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) := by + let := numberFieldTowerAbstractTopFiniteDimensional K L + exact NumberField.of_module_finite ℚ _ + +private theorem numberFieldTowerRestrictedTopFiniteDimensional : + FiniteDimensional ℚ + ((abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)).restrictScalars ℚ) := by + let := numberFieldTowerAbstractTopFiniteDimensional K L + change FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerTopSubgroup L)) + change FiniteDimensional ℚ + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) + exact numberFieldTowerAbstractTopFiniteDimensional K L + +private theorem numberFieldTowerRestrictedTopNumberField : + NumberField + ((abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)).restrictScalars ℚ) := by + let := numberFieldTowerRestrictedTopFiniteDimensional K L + exact NumberField.of_module_finite ℚ _ + +@[reducible] private noncomputable def numberFieldTowerRestrictedTopAlgebra : + Algebra + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L)) + ((abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)).restrictScalars ℚ) := + (IntermediateField.inclusion + (abstractFixedField_le ℚ (SeparableClosure ℚ) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L))).toRingHom.toAlgebra + +private theorem numberFieldTowerAbstractRelativeIsGalois : + IsGalois + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L)) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) + (numberFieldTowerExtensionSubgroupNormal K L) + +private theorem ordinaryIdeleClassNormQuotientCongrOfAlgEquiv_symm_mk + {K₀ L₀ K₁ L₁ : Type} + [Field K₀] [NumberField K₀] + [Field L₀] [NumberField L₀] [Algebra K₀ L₀] + [Field K₁] [NumberField K₁] + [Field L₁] [NumberField L₁] [Algebra K₁ L₁] + (eK : K₀ ≃ₐ[ℚ] K₁) + (eL : L₀ ≃ₐ[ℚ] L₁) + (h : ∀ x : K₀, + eL (algebraMap K₀ L₀ x) = + algebraMap K₁ L₁ (eK x)) + (c : IdeleClassGroup K₁) : + (ordinaryIdeleClassNormQuotientCongrOfAlgEquiv eK eL h).symm + (QuotientGroup.mk' + (_root_.ideleClassNorm K₁ L₁).range c) = + QuotientGroup.mk' + (_root_.ideleClassNorm K₀ L₀).range + ((ideleClassCongr eK).symm c) := by + let e := ordinaryIdeleClassNormQuotientCongrOfAlgEquiv eK eL h + apply e.injective + rw [e.apply_symm_apply, + ordinaryIdeleClassNormQuotientCongrOfAlgEquiv_mk, + MulEquiv.apply_symm_apply] + +private noncomputable def numberFieldTowerFiniteNormClassPublicValue + (a : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L)) : + Additive + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient K L + (finiteNormClass rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) a) + +private noncomputable def numberFieldTowerFiniteNormClassExpectedValue + (a : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L)) : + Additive + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + Additive.ofMul + (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range + (Additive.toMul + ((numberFieldTowerIdeleClassEquivAmbientFixed K L).symm a))) + +private noncomputable def numberFieldTowerFiniteNormClassDirectComparisonValue + (a : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L)) : + Additive + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + let H := numberFieldTowerBaseSubgroup K L + let J := numberFieldTowerTopSubgroup L + let hJH : J.toSubgroup ≤ H.toSubgroup := + numberFieldTowerTopSubgroup_le_baseSubgroup K L + let hnormal := numberFieldTowerExtensionSubgroupNormal K L + let F := abstractFixedField ℚ (SeparableClosure ℚ) H + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hJH + letI : NumberField F := numberFieldTowerAbstractBaseNumberField K L + letI : NumberField E := numberFieldTowerAbstractTopNumberField K L + let eBase : K ≃ₐ[ℚ] F := numberFieldTowerAbstractBaseFieldEquiv K L + let eTop : L ≃ₐ[ℚ] E := numberFieldTowerAbstractTopFieldEquiv K L + have hcompat : ∀ x : K, + eTop (algebraMap K L x) = algebraMap F E (eBase x) := + numberFieldTowerAbstractFieldEquiv_algebraMap K L + let actualFieldEquiv : + (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃* + (IdeleClassGroup F ⧸ (_root_.ideleClassNorm F E).range) := + ordinaryIdeleClassNormQuotientCongrOfAlgEquiv + (K := K) (L := L) (K' := F) (L' := E) eBase eTop hcompat + exact + MulEquiv.toAdditive + actualFieldEquiv.symm + (rationalFiniteNormQuotientEquivIdeleClassNormQuotient + (hKfinite := numberFieldTowerBaseSubgroupAbsoluteQuotientFinite K L) + (hfinite := numberFieldTowerExtensionQuotientFinite K L) + H J hJH hnormal + (finiteNormClass rationalIdeleClassRepresentation H J hJH a)) + +private theorem numberFieldTowerFiniteNormClassPublicValue_eq_directComparison + (a : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L)) : + numberFieldTowerFiniteNormClassPublicValue K L a = + numberFieldTowerFiniteNormClassDirectComparisonValue K L a := by + unfold numberFieldTowerFiniteNormClassPublicValue + unfold numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient + unfold numberFieldTowerFiniteNormClassDirectComparisonValue + rfl + +private noncomputable def numberFieldTowerActualNormClassRepresentativeValue + (a : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L)) : + Additive + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + let H := numberFieldTowerBaseSubgroup K L + let J := numberFieldTowerTopSubgroup L + let hJH : J.toSubgroup ≤ H.toSubgroup := + numberFieldTowerTopSubgroup_le_baseSubgroup K L + let F := abstractFixedField ℚ (SeparableClosure ℚ) H + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hJH + letI : NumberField F := numberFieldTowerAbstractBaseNumberField K L + letI : NumberField E := numberFieldTowerAbstractTopNumberField K L + let eBase : K ≃ₐ[ℚ] F := numberFieldTowerAbstractBaseFieldEquiv K L + let eTop : L ≃ₐ[ℚ] E := numberFieldTowerAbstractTopFieldEquiv K L + have hcompat : ∀ x : K, + eTop (algebraMap K L x) = algebraMap F E (eBase x) := + numberFieldTowerAbstractFieldEquiv_algebraMap K L + let actualFieldEquiv : + (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃* + (IdeleClassGroup F ⧸ (_root_.ideleClassNorm F E).range) := + ordinaryIdeleClassNormQuotientCongrOfAlgEquiv + (K := K) (L := L) (K' := F) (L' := E) eBase eTop hcompat + exact + Additive.ofMul + (actualFieldEquiv.symm + (QuotientGroup.mk' + (_root_.ideleClassNorm F E).range + (Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed H).symm a)))) + +private theorem numberFieldTowerFiniteNormClassDirectComparison_eq_actualValue + (a : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L)) : + numberFieldTowerFiniteNormClassDirectComparisonValue K L a = + numberFieldTowerActualNormClassRepresentativeValue K L a := by + let H := numberFieldTowerBaseSubgroup K L + let J := numberFieldTowerTopSubgroup L + let hJH : J.toSubgroup ≤ H.toSubgroup := + numberFieldTowerTopSubgroup_le_baseSubgroup K L + let hnormal := numberFieldTowerExtensionSubgroupNormal K L + let F := abstractFixedField ℚ (SeparableClosure ℚ) H + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hJH + let : NumberField F := numberFieldTowerAbstractBaseNumberField K L + let : NumberField E := numberFieldTowerAbstractTopNumberField K L + let eBase : K ≃ₐ[ℚ] F := numberFieldTowerAbstractBaseFieldEquiv K L + let eTop : L ≃ₐ[ℚ] E := numberFieldTowerAbstractTopFieldEquiv K L + have hcompat : ∀ x : K, + eTop (algebraMap K L x) = algebraMap F E (eBase x) := + numberFieldTowerAbstractFieldEquiv_algebraMap K L + let actualFieldEquiv : + (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃* + (IdeleClassGroup F ⧸ (_root_.ideleClassNorm F E).range) := + ordinaryIdeleClassNormQuotientCongrOfAlgEquiv + (K := K) (L := L) (K' := F) (L' := E) eBase eTop hcompat + let q : FiniteNormQuotient rationalIdeleClassRepresentation H J hJH ≃+ + Additive (IdeleClassGroup F ⧸ (_root_.ideleClassNorm F E).range) := + rationalFiniteNormQuotientEquivIdeleClassNormQuotient + (hKfinite := numberFieldTowerBaseSubgroupAbsoluteQuotientFinite K L) + (hfinite := numberFieldTowerExtensionQuotientFinite K L) + H J hJH hnormal + let c : Additive (IdeleClassGroup F ⧸ (_root_.ideleClassNorm F E).range) := + Additive.ofMul + (QuotientGroup.mk' (_root_.ideleClassNorm F E).range + (Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed H).symm a))) + have hfixed : + q (finiteNormClass rationalIdeleClassRepresentation H J hJH a) = c := + rationalFiniteNormQuotientEquivIdeleClassNormQuotient_finiteNormClass + (hKfinite := numberFieldTowerBaseSubgroupAbsoluteQuotientFinite K L) + (hfinite := numberFieldTowerExtensionQuotientFinite K L) + H J hJH hnormal a + change + (MulEquiv.toAdditive actualFieldEquiv.symm) + (q (finiteNormClass rationalIdeleClassRepresentation H J hJH a)) = + (MulEquiv.toAdditive actualFieldEquiv.symm) c + exact congrArg + (fun x : Additive (IdeleClassGroup F ⧸ (_root_.ideleClassNorm F E).range) => + (MulEquiv.toAdditive actualFieldEquiv.symm) x) hfixed + +private theorem numberFieldTowerActualNormClassRepresentativeValue_eq_expected + (a : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L)) : + numberFieldTowerActualNormClassRepresentativeValue K L a = + numberFieldTowerFiniteNormClassExpectedValue K L a := by + let H := numberFieldTowerBaseSubgroup K L + let J := numberFieldTowerTopSubgroup L + let hJH : J.toSubgroup ≤ H.toSubgroup := + numberFieldTowerTopSubgroup_le_baseSubgroup K L + let F := abstractFixedField ℚ (SeparableClosure ℚ) H + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hJH + let : NumberField F := numberFieldTowerAbstractBaseNumberField K L + let : NumberField E := numberFieldTowerAbstractTopNumberField K L + let eBase : K ≃ₐ[ℚ] F := numberFieldTowerAbstractBaseFieldEquiv K L + let eTop : L ≃ₐ[ℚ] E := numberFieldTowerAbstractTopFieldEquiv K L + have hcompat : ∀ x : K, + eTop (algebraMap K L x) = algebraMap F E (eBase x) := + numberFieldTowerAbstractFieldEquiv_algebraMap K L + let actualFieldEquiv : + (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃* + (IdeleClassGroup F ⧸ (_root_.ideleClassNorm F E).range) := + ordinaryIdeleClassNormQuotientCongrOfAlgEquiv + (K := K) (L := L) (K' := F) (L' := E) eBase eTop hcompat + let c : IdeleClassGroup F := + Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed H).symm a) + change + Additive.ofMul + (actualFieldEquiv.symm + (QuotientGroup.mk' + (_root_.ideleClassNorm F E).range c)) = + Additive.ofMul + (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range + ((ideleClassCongr + (numberFieldTowerAbstractBaseFieldEquiv K L)).symm c)) + exact + congrArg Additive.ofMul + (ordinaryIdeleClassNormQuotientCongrOfAlgEquiv_symm_mk + (K₀ := K) (L₀ := L) (K₁ := F) (L₁ := E) eBase eTop hcompat c) + +/-- On a finite norm-class representative, the comparison with the +original number-field tower is the ordinary class map applied after +transporting the fixed-field idele class back to `K`. -/ +@[simp] +theorem + numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient_finiteNormClass + (a : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L)) : + numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient K L + (finiteNormClass rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) a) = + Additive.ofMul + (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range + (Additive.toMul + ((numberFieldTowerIdeleClassEquivAmbientFixed K L).symm + a))) := by + change + numberFieldTowerFiniteNormClassPublicValue K L a = + numberFieldTowerFiniteNormClassExpectedValue K L a + exact + (numberFieldTowerFiniteNormClassPublicValue_eq_directComparison K L a).trans + ((numberFieldTowerFiniteNormClassDirectComparison_eq_actualValue + K L a).trans + (numberFieldTowerActualNormClassRepresentativeValue_eq_expected + K L a)) + +/-- On an idele class of the original base field, the fixed-part +realization followed by the abstract finite norm-class map is exactly +the genuine quotient class modulo the ordinary idele-class norm. -/ +theorem + numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient_ideleClass + (c : IdeleClassGroup K) : + numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient K L + (finiteNormClass rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) + (numberFieldTowerIdeleClassEquivAmbientFixed K L + (Additive.ofMul c))) = + Additive.ofMul + (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range c) := by + simpa only [ + AddEquiv.symm_apply_apply, toMul_ofMul] using + (numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient_finiteNormClass + K L + (numberFieldTowerIdeleClassEquivAmbientFixed K L + (Additive.ofMul c))) + +/-- Under the compatible rational-separable-closure realization of a +finite Galois number-field extension, the abstract finite norm subgroup +is exactly the ordinary idele-class norm subgroup of the original +extension. -/ +theorem + map_numberFieldTowerFiniteNormSubgroup_eq_ordinaryIdeleClassNormRange : + letI := (numberFieldTowerFiniteAbstractField K L).finite + letI := numberFieldTowerExtensionSubgroup_normal K L + letI := numberFieldTowerExtensionQuotient_finite K L + (finiteNormSubgroup rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)).map + (numberFieldTowerIdeleClassEquivAmbientFixed + K L).symm.toAddMonoidHom = + (_root_.ideleClassNorm K L).range.toAddSubgroup := by + let E := + numberFieldTowerIdeleClassEquivAmbientFixed K L + let Q := + numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient + K L + ext c + constructor + · rintro ⟨a, ha, rfl⟩ + have haZero : + finiteNormClass rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) a = + 0 := + (finiteNormClass_eq_zero_iff + rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) a).2 ha + have hclass := + numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient_ideleClass + K L (Additive.toMul (E.symm a)) + have hmk : + QuotientGroup.mk' + (_root_.ideleClassNorm K L).range + (Additive.toMul (E.symm a)) = + 1 := by + have hzero : + (0 : Additive + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range)) = + Additive.ofMul + (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range + (Additive.toMul (E.symm a))) := by + simpa only [E, ofMul_toMul, + AddEquiv.apply_symm_apply, haZero, map_zero] using hclass + exact congrArg Additive.toMul hzero.symm + exact + (QuotientGroup.eq_one_iff + (Additive.toMul (E.symm a))).1 hmk + · intro hc + refine ⟨E c, ?_, E.symm_apply_apply c⟩ + apply + (finiteNormClass_eq_zero_iff + rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) + (E c)).1 + apply Q.injective + have hmk : + QuotientGroup.mk' + (_root_.ideleClassNorm K L).range + (Additive.toMul c) = + 1 := + (QuotientGroup.eq_one_iff + (Additive.toMul c)).2 hc + have hclass := + numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient_ideleClass + K L (Additive.toMul c) + simpa only [E, ofMul_toMul, + hmk, ofMul_one, map_zero] using hclass + +/-- If an ordinary subgroup contains the norm subgroup of a finite Galois +number-field extension, then its transport to the compatible rational +absolute fixed part is open for the genuine norm topology. -/ +theorem numberFieldTowerTransport_isNormOpen_of_normRange_le + (H : Subgroup (IdeleClassGroup K)) + (hLH : (_root_.ideleClassNorm K L).range ≤ H) : + letI := (numberFieldTowerFiniteAbstractField K L).finite + IsNormOpen rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + ((H.toAddSubgroup).map + (numberFieldTowerIdeleClassEquivAmbientFixed + K L).toAddMonoidHom : + AddSubgroup + (KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L))) := by + let E := + numberFieldTowerIdeleClassEquivAmbientFixed K L + rw [normTopology_addSubgroup_isOpen_iff] + refine + ⟨numberFieldTowerFiniteGaloisSubextension K L, ?_⟩ + intro a ha + have hback : + E.symm a ∈ + (finiteNormSubgroup rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)).map + E.symm.toAddMonoidHom := + ⟨a, ha, rfl⟩ + have hnorm : + Additive.toMul (E.symm a) ∈ + (_root_.ideleClassNorm K L).range := by + rw [ + map_numberFieldTowerFiniteNormSubgroup_eq_ordinaryIdeleClassNormRange + K L] at hback + exact hback + exact + ⟨E.symm a, hLH hnorm, E.apply_symm_apply a⟩ + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationCore.lean new file mode 100644 index 0000000000..bae296820b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationCore.lean @@ -0,0 +1,516 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.FixedFieldLattice +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicZHatBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.AbsoluteValueExtensions +/-! +# Finite Galois number-field extensions in the rational separable closure + +An actual tower `L / K / ℚ` must be realized by compatible embeddings +before the rational absolute class formation can be applied. We choose +only the upper embedding `L →ₐ[ℚ] SeparableClosure ℚ`; the lower embedding +is its restriction along `K →ₐ[ℚ] L`. Thus the two field ranges, their +fixing subgroups, and the norm comparison all come from the existing +mathlib and LCFT constructions. + +No second model of a number field, an idele class group, or a norm +quotient is introduced here. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open AlgebraicNumberTheory +open LocalClassFieldTheory +open RamificationTheory + +variable + (K L : Type*) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- The embedding of the lower field obtained by restricting the one +chosen embedding of the top field. -/ +noncomputable def numberFieldTowerLowerEmbedding : + K →ₐ[ℚ] SeparableClosure ℚ := + (numberFieldSeparableClosureEmbedding L).comp + (IsScalarTower.toAlgHom ℚ K L) + +/-- The copy of `K` obtained from the chosen copy of `L`; this is the +lower field in the compatible realization of `L / K`. -/ +def numberFieldTowerBaseField : + IntermediateField ℚ (SeparableClosure ℚ) := + (numberFieldTowerLowerEmbedding K L).fieldRange + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- The compatible embedded copy of `K` lies in the chosen embedded copy +of `L`. -/ +theorem numberFieldTowerBaseField_le_topField : + numberFieldTowerBaseField K L ≤ + numberFieldInRationalSeparableClosure L := by + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap K L y, rfl⟩ + +/-- The standard inclusion algebra on the two nested field ranges. -/ +noncomputable instance numberFieldTowerBaseFieldAlgebra : + Algebra (numberFieldTowerBaseField K L) + (numberFieldInRationalSeparableClosure L) := + (IntermediateField.inclusion + (numberFieldTowerBaseField_le_topField K L)).toRingHom.toAlgebra + +instance numberFieldTowerBaseFieldScalarTower : + IsScalarTower ℚ (numberFieldTowerBaseField K L) + (numberFieldInRationalSeparableClosure L) := + IsScalarTower.of_algebraMap_eq' rfl + +noncomputable instance numberFieldTowerBaseField_finiteDimensional : + FiniteDimensional ℚ (numberFieldTowerBaseField K L) := + (numberFieldTowerLowerEmbedding K L).equivFieldRange.toLinearEquiv.finiteDimensional + +noncomputable instance numberFieldTowerBaseField_numberField : + NumberField (numberFieldTowerBaseField K L) := + NumberField.of_module_finite ℚ (numberFieldTowerBaseField K L) + +noncomputable instance numberFieldTowerTopField_finiteDimensional : + FiniteDimensional (numberFieldTowerBaseField K L) + (numberFieldInRationalSeparableClosure L) := + FiniteDimensional.right ℚ + (numberFieldTowerBaseField K L) + (numberFieldInRationalSeparableClosure L) + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- The two field-range equivalences form the same square as the original +tower `L / K`. -/ +@[simp] +theorem numberFieldTowerFieldRangeEquiv_algebraMap (x : K) : + (numberFieldSeparableClosureEmbedding L).equivFieldRange + (algebraMap K L x) = + algebraMap (numberFieldTowerBaseField K L) + (numberFieldInRationalSeparableClosure L) + ((numberFieldTowerLowerEmbedding K L).equivFieldRange x) := by + rfl + +noncomputable instance numberFieldTowerTopField_isGalois : + IsGalois (numberFieldTowerBaseField K L) + (numberFieldInRationalSeparableClosure L) := by + let _ : Algebra + (numberFieldTowerLowerEmbedding K L).fieldRange + (numberFieldSeparableClosureEmbedding L).fieldRange := + numberFieldTowerBaseFieldAlgebra K L + exact + IsGalois.of_equiv_equiv + (F := K) (E := L) + (M := (numberFieldTowerLowerEmbedding K L).fieldRange) + (N := (numberFieldSeparableClosureEmbedding L).fieldRange) + (f := + (numberFieldTowerLowerEmbedding K L).equivFieldRange.toRingEquiv) + (g := + (numberFieldSeparableClosureEmbedding L).equivFieldRange.toRingEquiv) + (by + apply RingHom.ext + intro x + exact + (numberFieldTowerFieldRangeEquiv_algebraMap K L x).symm) + +/-- The closed subgroup representing the compatible embedded copy of +`K`. -/ +def numberFieldTowerBaseSubgroup : + ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) := + closedFixingSubgroup ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseField K L) + +/-- The closed subgroup representing the chosen embedded copy of `L`. -/ +def numberFieldTowerTopSubgroup : + ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) := + closedFixingSubgroup ℚ (SeparableClosure ℚ) + (numberFieldInRationalSeparableClosure L) + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Inclusion of compatible field ranges gives the contravariant +inclusion of their fixing subgroups. -/ +theorem numberFieldTowerTopSubgroup_le_baseSubgroup : + (numberFieldTowerTopSubgroup L).toSubgroup ≤ + (numberFieldTowerBaseSubgroup K L).toSubgroup := by + change + (numberFieldInRationalSeparableClosure L).fixingSubgroup ≤ + (numberFieldTowerBaseField K L).fixingSubgroup + exact + (numberFieldTowerBaseField K L).fixingSubgroup_le + (numberFieldTowerBaseField_le_topField K L) + +/-- The separable closure of `K` is identified with +`SeparableClosure ℚ` endowed with the algebra structure induced by the +compatible lower embedding. -/ +noncomputable def numberFieldTowerSeparableClosureEquiv : + let i := numberFieldTowerLowerEmbedding K L + letI : Algebra K (SeparableClosure ℚ) := + i.toRingHom.toAlgebra + SeparableClosure K ≃ₐ[K] SeparableClosure ℚ := by + dsimp only + let i := numberFieldTowerLowerEmbedding K L + let _ : Algebra K (SeparableClosure ℚ) := + i.toRingHom.toAlgebra + letI : IsScalarTower ℚ K (SeparableClosure ℚ) := + IsScalarTower.of_algebraMap_eq' i.comp_algebraMap.symm + letI : Algebra.IsSeparable K (SeparableClosure ℚ) := + Algebra.isSeparable_tower_top_of_isSeparable + ℚ K (SeparableClosure ℚ) + letI : IsSepClosure K (SeparableClosure ℚ) := + ⟨inferInstance, inferInstance⟩ + exact + IsSepClosure.equiv K + (SeparableClosure K) (SeparableClosure ℚ) + +/-- The algebra structure on the rational separable closure induced by +the compatible lower embedding in a number-field tower. -/ +@[reducible] +noncomputable def numberFieldTowerSeparableClosureBaseAlgebra : + Algebra K (SeparableClosure ℚ) := + (numberFieldTowerLowerEmbedding K L).toRingHom.toAlgebra + +/-- The algebra structure on the rational separable closure induced by +the chosen embedding of the top number field. -/ +@[reducible] +noncomputable def numberFieldTowerSeparableClosureTopAlgebra : + Algebra L (SeparableClosure ℚ) := + (numberFieldSeparableClosureEmbedding L).toRingHom.toAlgebra + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- The compatible lower embedding also realizes the standard +`ℚ → K` scalar tower inside the rational separable closure. -/ +theorem numberFieldTowerSeparableClosureBaseScalarTower : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + IsScalarTower ℚ K (SeparableClosure ℚ) := by + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + exact + IsScalarTower.of_algebraMap_eq' + (numberFieldTowerLowerEmbedding K L).comp_algebraMap.symm + +/-- The chosen top-field embedding realizes the standard +`ℚ → L` scalar tower inside the rational separable closure. -/ +theorem numberFieldTowerSeparableClosureTopScalarTower : + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + IsScalarTower ℚ L (SeparableClosure ℚ) := by + let : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + exact + IsScalarTower.of_algebraMap_eq' + (numberFieldSeparableClosureEmbedding L).comp_algebraMap.symm + +/-- With the algebra structure induced by its chosen rational +embedding, the rational separable closure is a genuine Galois +overfield of a number field. -/ +theorem numberFieldSeparableClosureTop_isGalois : + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + IsGalois L (SeparableClosure ℚ) := by + let : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + let : IsScalarTower ℚ L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopScalarTower L + let : Algebra.IsSeparable L (SeparableClosure ℚ) := + Algebra.isSeparable_tower_top_of_isSeparable + ℚ L (SeparableClosure ℚ) + let : IsSepClosure L (SeparableClosure ℚ) := + ⟨inferInstance, inferInstance⟩ + exact + IsGalois.of_algEquiv + (IsSepClosure.equiv L + (SeparableClosure L) (SeparableClosure ℚ)) + +/-- The actual cyclotomic `ZHat`-compositum of a number field and the +chosen rational separable closure form the expected scalar tower. -/ +theorem + numberFieldCyclotomicZHatCompositumSeparableClosureScalarTower : + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + IsScalarTower L + (numberFieldCyclotomicZHatCompositum L) + (SeparableClosure ℚ) := by + let : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + exact IsScalarTower.of_algebraMap_eq' rfl + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- The two compatible embeddings make the rational separable closure +an actual scalar tower over `K → L`. -/ +theorem numberFieldTowerSeparableClosureScalarTower : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + IsScalarTower K L (SeparableClosure ℚ) := by + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + let : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + exact IsScalarTower.of_algebraMap_eq' rfl + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- With the compatible lower embedding, the rational separable +closure is a genuine Galois overfield of the original base field. -/ +theorem numberFieldTowerSeparableClosure_isGalois : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + IsGalois K (SeparableClosure ℚ) := by + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + exact + IsGalois.of_algEquiv + (numberFieldTowerSeparableClosureEquiv K L) + +/-- Continuous restriction from the compatible separable closure to +the actual finite Galois extension in the original number-field +tower. -/ +noncomputable def numberFieldTowerSeparableClosureRestriction : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + Gal(SeparableClosure ℚ/K) →ₜ* + Gal(L/K) := by + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + let _ : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + let _ : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + let eL : L →ₐ[K] SeparableClosure ℚ := + IsScalarTower.toAlgHom K L (SeparableClosure ℚ) + let E : IntermediateField K (SeparableClosure ℚ) := + eL.fieldRange + letI : FiniteDimensional K E := + eL.equivFieldRange.toLinearEquiv.finiteDimensional + letI : IsGalois K E := + IsGalois.of_algEquiv eL.equivFieldRange + let c : + Gal(L/K) ≃* + Gal(E/K) := + AlgEquiv.autCongr eL.equivFieldRange + let rE : + Gal(SeparableClosure ℚ/K) →* + Gal(E/K) := + AlgEquiv.restrictNormalHom E + refine + { toMonoidHom := + AlgEquiv.restrictNormalHom L + continuous_toFun := ?_ } + have hrE : Continuous rE := + InfiniteGalois.restrictNormalHom_continuous E + have hc : Continuous c.symm := + continuous_of_discreteTopology + apply (hc.comp hrE).congr + intro σ + apply AlgEquiv.ext + intro x + apply eL.injective + change + eL + (((AlgEquiv.autCongr eL.equivFieldRange).symm + (AlgEquiv.restrictNormalHom E σ)) x) = + eL ((AlgEquiv.restrictNormalHom L σ) x) + have he (y : E) : + eL (eL.equivFieldRange.symm y) = E.val y := by + exact + congrArg Subtype.val + (eL.equivFieldRange.apply_symm_apply y) + calc + eL + (((AlgEquiv.autCongr eL.equivFieldRange).symm + (AlgEquiv.restrictNormalHom E σ)) x) = + E.val + ((AlgEquiv.restrictNormalHom E σ) + (eL.equivFieldRange x)) := by + simpa only [AlgEquiv.autCongr_symm, + AlgEquiv.autCongr_apply, AlgEquiv.trans_apply, + AlgEquiv.symm_symm] using + he + ((AlgEquiv.restrictNormalHom E σ) + (eL.equivFieldRange x)) + _ = σ (eL x) := by + exact + AlgEquiv.restrictNormal_commutes σ E + (eL.equivFieldRange x) + _ = eL ((AlgEquiv.restrictNormalHom L σ) x) := by + exact + (AlgEquiv.restrictNormal_commutes σ L x).symm + +/-- The compatible continuous restriction evaluates as ordinary +normal-field restriction. -/ +@[simp] +theorem numberFieldTowerSeparableClosureRestriction_apply + (σ : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + Gal(SeparableClosure ℚ/K)) : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + numberFieldTowerSeparableClosureRestriction K L σ = + AlgEquiv.restrictNormalHom L σ := by + let _ : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + let _ : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + let _ : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + change + (numberFieldTowerSeparableClosureRestriction K L).toMonoidHom σ = + AlgEquiv.restrictNormalHom L σ + rfl + +/-- Restriction from the compatible separable closure onto the finite +Galois top field is surjective. -/ +theorem numberFieldTowerSeparableClosureRestriction_surjective : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + Function.Surjective + (numberFieldTowerSeparableClosureRestriction K L) := by + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + let : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + let : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + let _ : IsGalois K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosure_isGalois K L + intro τ + obtain ⟨σ, hσ⟩ := + AlgEquiv.restrictNormalHom_surjective + (F := K) (K₁ := L) (E := SeparableClosure ℚ) τ + refine ⟨σ, ?_⟩ + rw [numberFieldTowerSeparableClosureRestriction_apply] + exact hσ + +/-- A `K`-automorphism of the common rational separable closure, +viewed as the corresponding rational automorphism fixing the embedded +copy of `K`. -/ +noncomputable def numberFieldTowerSeparableClosureToBaseSubgroup : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + Gal(SeparableClosure ℚ/K) →* + (numberFieldTowerBaseSubgroup K L).toSubgroup := by + let _ : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + refine + { toFun := fun σ => + ⟨AlgEquiv.restrictScalars ℚ σ, ?_⟩ + map_one' := by + apply Subtype.ext + rfl + map_mul' := by + intro σ τ + apply Subtype.ext + rfl } + change + AlgEquiv.restrictScalars ℚ σ ∈ + (numberFieldTowerBaseField K L).fixingSubgroup + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + obtain ⟨y, rfl⟩ := hx + exact σ.commutes y + +/-- The compatible `K`-absolute Galois group is exactly the fixing +subgroup of the embedded copy of `K` inside the rational absolute +Galois group. -/ +noncomputable def numberFieldTowerSeparableClosureEquivBaseSubgroup : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + Gal(SeparableClosure ℚ/K) ≃* + (numberFieldTowerBaseSubgroup K L).toSubgroup := by + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + refine + { toFun := numberFieldTowerSeparableClosureToBaseSubgroup K L + invFun := fun τ => + { τ.1 with + commutes' := fun x => ?_ } + left_inv := ?_ + right_inv := ?_ + map_mul' := map_mul + (numberFieldTowerSeparableClosureToBaseSubgroup K L) } + · have hτ : + ∀ z ∈ numberFieldTowerBaseField K L, + τ.1 z = z := by + exact + (IntermediateField.mem_fixingSubgroup_iff + (numberFieldTowerBaseField K L) τ.1).1 τ.2 + exact + hτ + (numberFieldTowerLowerEmbedding K L x) + ⟨x, rfl⟩ + · intro σ + apply AlgEquiv.ext + intro x + rfl + · intro τ + apply Subtype.ext + apply AlgEquiv.ext + intro x + rfl + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Coercing the base-subgroup comparison equivalence gives restriction of +scalars to the rational base. -/ +@[simp] +theorem numberFieldTowerSeparableClosureEquivBaseSubgroup_apply_coe + (σ : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + Gal(SeparableClosure ℚ/K)) : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + ((numberFieldTowerSeparableClosureEquivBaseSubgroup K L σ : + (numberFieldTowerBaseSubgroup K L).toSubgroup) : + Gal(SeparableClosure ℚ/ℚ)) = + AlgEquiv.restrictScalars ℚ σ := by + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + change + (numberFieldTowerSeparableClosureToBaseSubgroup K L σ).1 = + AlgEquiv.restrictScalars ℚ σ + rfl + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationFinitePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationFinitePlace.lean new file mode 100644 index 0000000000..ac4770d7ab --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationFinitePlace.lean @@ -0,0 +1,142 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationCore +/-! +# Finite places in the compatible Galois realization + +This module extends a chosen finite place of `L` to the common rational +separable closure and compares its decomposition data with the corresponding +places and completions in the original number-field tower. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open AlgebraicNumberTheory +open AlgebraicNumberTheory.Valuations +open IsDedekindDomain +open LocalClassFieldTheory +open RamificationTheory + +variable + (K L : Type*) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- Extend a specified finite place of the compatible top number +field to the common rational separable closure. + +Its restriction to `L` is definitionally the supplied exact extension, +so the resulting decomposition-group restriction lands at the +specified place rather than at an unrelated conjugate. -/ +noncomputable def + numberFieldTowerFinitePlaceExtensionToSeparableClosure + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (SeparableClosure ℚ) := by + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + letI : IsScalarTower ℚ L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopScalarTower L + letI : Algebra.IsAlgebraic L (SeparableClosure ℚ) := + Algebra.IsAlgebraic.tower_top (K := ℚ) L + exact + w.extendToAlgebraicallyClosed + (NumberField.HeightOneSpectrum.adicAbv K v) + (RayClass.adicAbv_isNontrivial v) + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- The compatible separable-closure extension restricts to the +specified finite-place extension on `L`. -/ +@[simp] +theorem + numberFieldTowerFinitePlaceExtensionToSeparableClosure_algebraMap + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (x : L) : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + (numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v w).1 + (algebraMap L (SeparableClosure ℚ) x) = + w.1 x := by + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + let : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + let : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + let : IsScalarTower ℚ L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopScalarTower L + let : Algebra.IsAlgebraic L (SeparableClosure ℚ) := + Algebra.IsAlgebraic.tower_top (K := ℚ) L + exact + AbsoluteValueExtension.extendToAlgebraicallyClosed_algebraMap + (NumberField.HeightOneSpectrum.adicAbv K v) + (RayClass.adicAbv_isNontrivial v) w x + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Restricting the compatible separable-closure absolute value along +the chosen top-field embedding recovers the supplied exact extension. -/ +theorem + numberFieldTowerFinitePlaceExtensionToSeparableClosure_restrict + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + (numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v w).1.comp + (f := algebraMap L (SeparableClosure ℚ)) + (algebraMap L (SeparableClosure ℚ)).injective = + w.1 := by + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + let : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + let : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + ext x + exact + numberFieldTowerFinitePlaceExtensionToSeparableClosure_algebraMap + K L v w x + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationNormQuotient.lean new file mode 100644 index 0000000000..e7c12e9168 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationNormQuotient.lean @@ -0,0 +1,350 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationSubextension +/-! +# Norm quotients in the compatible Galois realization + +This module identifies the abstract fixed fields with the embedded copies of +`K` and `L`, and transports the resulting idèle-class norm quotient and +reciprocity data to the original finite Galois extension. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open CyclicCohomology +open AlgebraicNumberTheory +open LocalClassFieldTheory +open RamificationTheory + +/-- The canonical quotient group structure, fixed before forming another quotient. -/ +@[instance_reducible] +private noncomputable def towerNormIdeleClassCommGroup + (F : Type) [Field F] [NumberField F] : + CommGroup (IdeleClassGroup F) := + QuotientGroup.Quotient.commGroup (IdeleGroup.principalSubgroup F) + +attribute [local instance] towerNormIdeleClassCommGroup + +variable + (K L : Type) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- The fixed field of the lower subgroup is the compatible embedded +copy of `K`. -/ +theorem numberFieldTowerAbstractBaseField_eq : + abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L) = + numberFieldTowerBaseField K L := + InfiniteGalois.fixedField_fixingSubgroup + (numberFieldTowerBaseField K L) + +/-- The original base field is canonically equivalent to the actual +fixed field used by the rational class formation. -/ +noncomputable def numberFieldTowerAbstractBaseFieldEquiv : + K ≃ₐ[ℚ] + abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L) := + (numberFieldTowerLowerEmbedding K L).equivFieldRange.trans + (IntermediateField.equivOfEq + (numberFieldTowerAbstractBaseField_eq K L).symm) + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- After restriction of scalars to `ℚ`, the upper relative fixed field +is the chosen embedded copy of `L`. -/ +theorem numberFieldTowerAbstractTopField_restrictScalars_eq : + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)).restrictScalars ℚ = + numberFieldInRationalSeparableClosure L := + InfiniteGalois.fixedField_fixingSubgroup + (numberFieldInRationalSeparableClosure L) + +/-- The original top field is canonically equivalent over `ℚ` to the +actual relative fixed field used by the rational class formation. -/ +noncomputable def numberFieldTowerAbstractTopFieldEquiv : + L ≃ₐ[ℚ] + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)).restrictScalars ℚ := + (numberFieldSeparableClosureEmbedding L).equivFieldRange.trans + (IntermediateField.equivOfEq + (numberFieldTowerAbstractTopField_restrictScalars_eq K L).symm) + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- The equivalences from the original number-field tower to its two +abstract fixed fields commute with the tower algebra maps. -/ +theorem numberFieldTowerAbstractFieldEquiv_algebraMap + (x : K) : + numberFieldTowerAbstractTopFieldEquiv K L + (algebraMap K L x) = + algebraMap + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L)) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) + (numberFieldTowerAbstractBaseFieldEquiv K L x) := by + apply Subtype.ext + calc + (numberFieldTowerAbstractTopFieldEquiv K L + (algebraMap K L x)).1 = + ((numberFieldSeparableClosureEmbedding L).equivFieldRange + (algebraMap K L x)).1 := by + rfl + _ = + (algebraMap + (numberFieldTowerBaseField K L) + (numberFieldInRationalSeparableClosure L) + ((numberFieldTowerLowerEmbedding K L).equivFieldRange x)).1 := + congrArg Subtype.val + (numberFieldTowerFieldRangeEquiv_algebraMap K L x) + _ = + (algebraMap + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L)) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) + (numberFieldTowerAbstractBaseFieldEquiv K L x)).1 := by + rfl + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- The compatible lower subgroup has finite absolute index in the +rational absolute Galois group. This opaque theorem keeps consumers +from unfolding the bundled finite-abstract-field witness. -/ +theorem numberFieldTowerBaseSubgroup_absoluteQuotient_finite : + Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (numberFieldTowerBaseSubgroup K L) + (le_baseField (numberFieldTowerBaseSubgroup K L))) := by + simpa only [numberFieldTowerFiniteAbstractField] using + (numberFieldTowerFiniteAbstractField K L).finite + +/-- The absolute-index witness used by the tower realization, registered at +its precise quotient type so downstream declarations need not normalize the +bundled finite-abstract-field construction. -/ +noncomputable instance + numberFieldTowerBaseSubgroupAbsoluteQuotientFinite : + Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (numberFieldTowerBaseSubgroup K L) + (le_baseField (numberFieldTowerBaseSubgroup K L))) := + numberFieldTowerBaseSubgroup_absoluteQuotient_finite K L + +/-- The normality witness for the tower realization, registered only at the +specialized extension subgroup. -/ +noncomputable instance + numberFieldTowerExtensionSubgroupNormal : + (extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)).Normal := + numberFieldTowerExtensionSubgroup_normal K L + +/-- The relative-index witness for the tower realization, registered only at +the specialized quotient consumed by `FiniteNormQuotient`. -/ +noncomputable instance + numberFieldTowerExtensionQuotientFinite : + Finite + ((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) := + numberFieldTowerExtensionQuotient_finite K L + +omit [FiniteDimensional K L] [IsGalois K L] in +private theorem towerNormAbstractBaseNumberField : + NumberField + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L)) := + NumberField.of_ringEquiv K + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L)) + (numberFieldTowerAbstractBaseFieldEquiv K L).toRingEquiv + +attribute [local instance] towerNormAbstractBaseNumberField + +omit [FiniteDimensional K L] [IsGalois K L] in +private theorem towerNormAbstractTopNumberField : + NumberField + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) := + NumberField.of_ringEquiv L + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) + (numberFieldTowerAbstractTopFieldEquiv K L).toRingEquiv + +attribute [local instance] towerNormAbstractTopNumberField + +/-- The fixed tower uses one canonical quotient dictionary throughout its +three comparison boundaries. -/ +@[instance_reducible] +private noncomputable def towerNormAbstractNormQuotientCommGroup : + CommGroup + (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L)) ⧸ + (_root_.ideleClassNorm + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L)) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L))).range) := + QuotientGroup.Quotient.commGroup + (_root_.ideleClassNorm + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L)) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L))).range + +attribute [local instance] towerNormAbstractNormQuotientCommGroup + +/-- The ordinary idele class group of the original base field, +transported to the fixed part of the rational absolute idele-class +representation used by abstract reciprocity. -/ +noncomputable def numberFieldTowerIdeleClassEquivAmbientFixed : + Additive (IdeleClassGroup K) ≃+ + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) := by + exact + (MulEquiv.toAdditive + (ideleClassCongr + (numberFieldTowerAbstractBaseFieldEquiv K L))).trans + (rationalAbstractFixedFieldIdeleClassEquivFixed + (hfinite := numberFieldTowerBaseSubgroupAbsoluteQuotientFinite K L) + (numberFieldTowerBaseSubgroup K L)) + +/-- The ordinary norm quotient of the two fixed fields, kept behind a +small type boundary so the two comparison steps can be elaborated in +separate declarations. -/ +private noncomputable def numberFieldTowerFixedFieldNormQuotient : Type := + let F := + abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L) + let E := + abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) + Additive + (IdeleClassGroup F ⧸ + (_root_.ideleClassNorm F E).range) + +private noncomputable instance + numberFieldTowerFixedFieldNormQuotientAddCommGroup : + AddCommGroup (numberFieldTowerFixedFieldNormQuotient K L) := by + let F := + abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L) + let E := + abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) + change AddCommGroup + (Additive (IdeleClassGroup F ⧸ (_root_.ideleClassNorm F E).range)) + exact Additive.addCommGroup + +/-- First comparison step: abstract finite norms to the ordinary norm +quotient of the realized fixed fields. -/ +private noncomputable def + numberFieldTowerFiniteNormQuotientEquivFixedFieldNormQuotient : + FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) ≃+ + numberFieldTowerFixedFieldNormQuotient K L := by + let H := numberFieldTowerBaseSubgroup K L + let J := numberFieldTowerTopSubgroup L + let hJH : J.toSubgroup ≤ H.toSubgroup := + numberFieldTowerTopSubgroup_le_baseSubgroup K L + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H + let E := + abstractRelativeFixedField ℚ (SeparableClosure ℚ) hJH + change + FiniteNormQuotient rationalIdeleClassRepresentation + H J hJH ≃+ + Additive + (IdeleClassGroup F ⧸ + (_root_.ideleClassNorm F E).range) + exact + rationalFiniteNormQuotientEquivIdeleClassNormQuotient + (hKfinite := numberFieldTowerBaseSubgroupAbsoluteQuotientFinite K L) + (hfinite := numberFieldTowerExtensionQuotientFinite K L) + H J hJH (numberFieldTowerExtensionSubgroupNormal K L) + +/-- Second comparison step: transport the realized fixed-field norm +quotient back to the original number-field tower. -/ +private noncomputable def + numberFieldTowerFixedFieldNormQuotientEquivActualNormQuotient : + numberFieldTowerFixedFieldNormQuotient K L ≃+ + Additive + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + let H := numberFieldTowerBaseSubgroup K L + let J := numberFieldTowerTopSubgroup L + let hJH : J.toSubgroup ≤ H.toSubgroup := + numberFieldTowerTopSubgroup_le_baseSubgroup K L + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H + let E := + abstractRelativeFixedField ℚ (SeparableClosure ℚ) hJH + change + Additive + (IdeleClassGroup F ⧸ + (_root_.ideleClassNorm F E).range) ≃+ + Additive + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) + let eBase : K ≃ₐ[ℚ] F := + numberFieldTowerAbstractBaseFieldEquiv K L + let eTop : L ≃ₐ[ℚ] E := + numberFieldTowerAbstractTopFieldEquiv K L + have hcompat : ∀ x : K, + eTop (algebraMap K L x) = algebraMap F E (eBase x) := + numberFieldTowerAbstractFieldEquiv_algebraMap K L + let eQuotient : + (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃* + (IdeleClassGroup F ⧸ (_root_.ideleClassNorm F E).range) := + ordinaryIdeleClassNormQuotientCongrOfAlgEquiv + (K := K) (L := L) (K' := F) (L' := E) eBase eTop hcompat + exact MulEquiv.toAdditive eQuotient.symm + +/-- The abstract finite norm quotient attached to the compatible +fixed-field realization of `L / K` is the ordinary idele-class norm +quotient of the original extension. -/ +noncomputable def + numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient : + FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) ≃+ + Additive + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + exact + (numberFieldTowerFiniteNormQuotientEquivFixedFieldNormQuotient K L).trans + (numberFieldTowerFixedFieldNormQuotientEquivActualNormQuotient K L) + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationSubextension.lean new file mode 100644 index 0000000000..31f17229b0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationSubextension.lean @@ -0,0 +1,264 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationCore +/-! +# The finite Galois subextension attached to a number-field tower + +This module realizes `L / K` as a finite Galois subextension inside the common +rational separable closure. It packages the relevant fixing subgroups, +normality, and finite-index data for abstract reciprocity. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open CyclicCohomology +open AlgebraicNumberTheory +open LocalClassFieldTheory +open RamificationTheory + +variable + (K L : Type) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- The relative fixing subgroup in the compatible realization is +normal. This is the existing LCFT ambient-embedding theorem specialized +to the number-field tower. -/ +theorem numberFieldTowerExtensionSubgroup_normal : + (extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)).Normal := by + let j := numberFieldSeparableClosureEmbedding L + let i := + j.comp (IsScalarTower.toAlgHom ℚ K L) + let : Algebra K (SeparableClosure ℚ) := + i.toRingHom.toAlgebra + let e := numberFieldTowerSeparableClosureEquiv K L + change + (extensionSubgroup + (closedFixingSubgroup ℚ (SeparableClosure ℚ) + (AlgHom.fieldRange i)) + (closedFixingSubgroup ℚ (SeparableClosure ℚ) + (AlgHom.fieldRange j)) + _).Normal + exact + ambientEmbeddedExtensionSubgroup_normal + ℚ K L j e + +/-- The relative quotient of fixing subgroups in the compatible +realization is finite. -/ +theorem numberFieldTowerExtensionQuotient_finite : + letI := + numberFieldTowerExtensionSubgroup_normal K L + Finite + ((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) := by + let j := numberFieldSeparableClosureEmbedding L + let i := + j.comp (IsScalarTower.toAlgHom ℚ K L) + let : Algebra K (SeparableClosure ℚ) := + i.toRingHom.toAlgebra + let e := numberFieldTowerSeparableClosureEquiv K L + change + Finite + ((closedFixingSubgroup ℚ (SeparableClosure ℚ) + (AlgHom.fieldRange i)).toSubgroup ⧸ + extensionSubgroup + (closedFixingSubgroup ℚ (SeparableClosure ℚ) + (AlgHom.fieldRange i)) + (closedFixingSubgroup ℚ (SeparableClosure ℚ) + (AlgHom.fieldRange j)) + _) + exact + ambientEmbeddedExtensionQuotient_finite + ℚ K L j e + +/-- The compatible realization of `L / K` as the finite Galois +subextension consumed by abstract reciprocity. -/ +noncomputable def numberFieldTowerFiniteGaloisSubextension : + FiniteGaloisSubextension + (numberFieldTowerBaseSubgroup K L) where + field := numberFieldTowerTopSubgroup L + below := numberFieldTowerTopSubgroup_le_baseSubgroup K L + normal := numberFieldTowerExtensionSubgroup_normal K L + finite := by + let := + numberFieldTowerExtensionSubgroup_normal K L + exact numberFieldTowerExtensionQuotient_finite K L + +/-- The lower fixing subgroup, with its finite absolute-index witness, +is the finite abstract field consumed by abstract reciprocity. -/ +@[reducible] +noncomputable def numberFieldTowerFiniteAbstractField : + FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) where + field := numberFieldTowerBaseSubgroup K L + finite := by + simpa only [numberFieldTowerBaseSubgroup, + numberFieldTowerBaseField] using + (ambientEmbeddedAbsoluteQuotientFinite + ℚ K (numberFieldTowerLowerEmbedding K L)) + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- The compatible embedded absolute Galois subgroup of a number +field is open in the rational absolute Galois group. -/ +theorem numberFieldTowerBaseSubgroup_isOpen : + IsOpen + ((numberFieldTowerBaseSubgroup K L : + ClosedSubgroup + (Gal(SeparableClosure ℚ/ℚ))) : + Set (Gal(SeparableClosure ℚ/ℚ))) := + abstractFiniteClosedSubgroup_isOpen + ℚ (SeparableClosure ℚ) + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerFiniteAbstractField K L).finite + +/-- The quotient represented by the compatible abstract subextension is +the actual `Gal(L / K)`. -/ +noncomputable def + numberFieldTowerExtensionQuotientEquivGaloisGroup : + (numberFieldTowerFiniteGaloisSubextension K L).extensionQuotient ≃* + Gal(L/K) := by + let j := numberFieldSeparableClosureEmbedding L + let i := + j.comp (IsScalarTower.toAlgHom ℚ K L) + letI : Algebra K (SeparableClosure ℚ) := + i.toRingHom.toAlgebra + let e := numberFieldTowerSeparableClosureEquiv K L + let H₀ := + closedFixingSubgroup ℚ (SeparableClosure ℚ) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup ℚ (SeparableClosure ℚ) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change j.fieldRange.fixingSubgroup ≤ i.fieldRange.fixingSubgroup + apply i.fieldRange.fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap K L y, rfl⟩ + letI : (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal + ℚ K L j e + change + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) ≃* + Gal(L/K) + exact + ambientEmbeddedExtensionQuotientEquivGaloisGroup + ℚ K L j e + +/-- Under the compatible realization, the finite quotient class of an +absolute automorphism is its genuine restriction to `L`. -/ +theorem + numberFieldTowerExtensionQuotientEquivGaloisGroup_mk_baseSubgroupEquiv + (σ : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + Gal(SeparableClosure ℚ/K)) : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + letI := + numberFieldTowerExtensionSubgroup_normal K L + numberFieldTowerExtensionQuotientEquivGaloisGroup K L + (QuotientGroup.mk + (numberFieldTowerSeparableClosureEquivBaseSubgroup + K L σ)) = + AlgEquiv.restrictNormalHom L σ := by + let j := + numberFieldSeparableClosureEmbedding L + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + let : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + let : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + let e := + numberFieldTowerSeparableClosureEquiv K L + let := + numberFieldTowerExtensionSubgroup_normal K L + apply AlgEquiv.ext + intro x + apply j.injective + calc + j + (numberFieldTowerExtensionQuotientEquivGaloisGroup K L + (QuotientGroup.mk + (numberFieldTowerSeparableClosureEquivBaseSubgroup + K L σ)) x) = + (numberFieldTowerSeparableClosureEquivBaseSubgroup + K L σ).1.1 (j x) := by + convert + (ambientEmbeddedExtensionQuotientEquivGaloisGroup_mk_apply + ℚ K L j e + (numberFieldTowerSeparableClosureEquivBaseSubgroup + K L σ) x) using 1; rfl + _ = σ (j x) := rfl + _ = + j + ((AlgEquiv.restrictNormalHom L σ) x) := by + exact + (AlgEquiv.restrictNormal_commutes σ L x).symm + +end Reciprocity +end GlobalClassFieldTheory + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation + +variable + (K L : Type) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +/-- The compatible finite Galois realization of an abelian number +field extension, bundled with commutativity of its actual abstract +quotient. -/ +noncomputable def numberFieldTowerFiniteAbelianSubextension + [hAbelian : IsAbelianGalois K L] : + FiniteAbelianSubextension + (numberFieldTowerBaseSubgroup K L) := by + letI : IsGalois K L := hAbelian.toIsGalois + exact + { toFiniteGaloisExtension := + numberFieldTowerFiniteGaloisSubextension K L + commutative := by + let e := + numberFieldTowerExtensionQuotientEquivGaloisGroup K L + exact + { is_comm := + ⟨fun x y => by + apply e.injective + rw [map_mul, map_mul] + exact + hAbelian.toIsMulCommutative.is_comm.comm + (e x) (e y)⟩ } } + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteIdeleArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteIdeleArtin.lean new file mode 100644 index 0000000000..5c9509efa7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteIdeleArtin.lean @@ -0,0 +1,766 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.Continuity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness +public import Mathlib.Algebra.BigOperators.Finprod +/-! +# The finite-place product of local Artin homomorphisms + +For a finite abelian extension of number fields `L / K`, the local +Artin factors of an idele are trivial at all but finitely many finite +places. This file forms their `finprod` directly in the actual global +Galois group. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField NNReal ValuativeRel +open NumberField IsDedekindDomain +open IdeleGroup RelativeIdeleGroup + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open AlgebraicNumberTheory.Valuations +open Function + +variable {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + +open scoped Classical in +/-- A finitely supported product may be regrouped over the fibers of an +arbitrary indexing map. -/ +theorem finprod_fibers_eq_sigma + {α β G : Type*} [CommMonoid G] + (g : α → β) (f : α → G) + (hf : HasFiniteMulSupport f) : + (∏ᶠ b : β, + ∏ᶠ x : {x : α // g x = b}, f x.1) = + ∏ᶠ x : α, f x := by + classical + let s := hf.toFinset + have hFiber (b : β) : + (∏ᶠ x : {x : α // g x = b}, f x.1) = + ∏ x ∈ s with g x = b, f x := by + rw [finprod_eq_prod_of_mulSupport_subset + (fun x : {x : α // g x = b} => f x.1) + (s := s.subtype fun x => g x = b)] + · simp only [Finset.prod_subtype_eq_prod_filter] + · intro x hx + change x ∈ s.subtype (fun x => g x = b) + change f x.1 ≠ 1 at hx + exact Finset.mem_subtype.mpr (hf.mem_toFinset.2 hx) + calc + (∏ᶠ b : β, + ∏ᶠ x : {x : α // g x = b}, f x.1) = + ∏ᶠ b : β, + ∏ x ∈ s with g x = b, f x := + finprod_congr hFiber + _ = ∏ x ∈ s, f x := by + rw [finprod_eq_prod_of_mulSupport_subset _ + (s.mulSupport_of_fiberwise_prod_subset_image f g)] + exact + Finset.prod_fiberwise_of_maps_to + (t := s.image g) + (fun x hx => Finset.mem_image_of_mem g hx) f + _ = ∏ᶠ x : α, f x := + (finprod_eq_prod f hf).symm + +open scoped Classical in +/-- A local norm of an integral unit at a finite place is again an +integral unit at the place below. -/ +theorem normUnits_mem_finitePlaceIntegerUnits + {M : Type} + [Field M] [NumberField M] [Algebra K M] + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) M) + (x : + ((finitePlaceExtensionCentre + (K := K) (L := M) v w).adicCompletion M)ˣ) + (hx : + x ∈ + ((finitePlaceExtensionCentre + (K := K) (L := M) v w).adicCompletionIntegers M).units) : + letI : Algebra (v.adicCompletion K) + ((finitePlaceExtensionCentre + (K := K) (L := M) v w).adicCompletion M) := + (finitePlaceAdicCompletionMap K M v + ⟨finitePlaceExtensionCentre (K := K) (L := M) v w, + finitePlaceBelow_finitePlaceExtensionCentre + (K := K) (L := M) v w⟩).toAlgebra + LocalFieldTheory.normUnits + (v.adicCompletion K) + ((finitePlaceExtensionCentre + (K := K) (L := M) v w).adicCompletion M) x ∈ + (v.adicCompletionIntegers K).units := by + let W : {W : HeightOneSpectrum (𝓞 M) // + _root_.finitePlaceBelow (K := K) W = v} := + ⟨finitePlaceExtensionCentre (K := K) (L := M) v w, + finitePlaceBelow_finitePlaceExtensionCentre + (K := K) (L := M) v w⟩ + let : Algebra (v.adicCompletion K) + ((finitePlaceExtensionCentre + (K := K) (L := M) v w).adicCompletion M) := + (finitePlaceAdicCompletionMap K M v W).toAlgebra + let z : (W.1.adicCompletionIntegers M).units := ⟨x, hx⟩ + simpa only [W, z, Subgroup.coe_subtype] using + IdeleGroup.finitePlace_normUnits_mem_integerUnits + (K := K) (L := M) v W z + +open scoped Classical in +/-- The finite local Artin factors of an idele have finite multiplicative +support. This is the support input for applying homomorphisms to the +finite-place global Artin product. -/ +theorem finitePlaceArtinFactors_hasFiniteMulSupport + (a : IdeleGroup K) : + HasFiniteMulSupport + (fun v : HeightOneSpectrum (𝓞 K) => + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v + (IdeleGroup.finiteComponent v a)) := by + let S : Set (HeightOneSpectrum (𝓞 K)) := + {v | a.2 v ∉ (v.adicCompletionIntegers K).units} + let T : Set (HeightOneSpectrum (𝓞 K)) := + {v | ∃ W : HeightOneSpectrum (𝓞 L), + W.asIdeal.LiesOver v.asIdeal ∧ + ¬ Algebra.IsUnramifiedAt (𝓞 K) W.asIdeal} + have hS : S.Finite := + Filter.eventually_cofinite.mp + (FiniteIdeleGroup.eventually_mem_localUnits a.2) + have hT : T.Finite := + AlgebraicNumberTheory.Ramification.finite_ramified_base_heightOne_primes + (𝓞 K) (𝓞 L) + rw [HasFiniteMulSupport] + apply (hS.union hT).subset + rw [mulSupport_subset_iff'] + intro v hv + have hvS : v ∉ S := by + intro hvS + exact hv (Set.mem_union_left T hvS) + have hvT : v ∉ T := by + intro hvT + exact hv (Set.mem_union_right S hvT) + have hNorm : + IdeleGroup.finiteComponent v a ∈ + chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := by + apply + adicCompletionIntegerUnits_le_chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v + (chosenFinitePlaceIsUnramified_of_isUnramifiedAt + (K := K) (L := L) v (by + by_contra hram + apply hvT + change + ∃ W : HeightOneSpectrum (𝓞 L), + W.asIdeal.LiesOver v.asIdeal ∧ + ¬ Algebra.IsUnramifiedAt + (𝓞 K) W.asIdeal + exact + ⟨finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension + (L := L) v), + finitePlaceExtensionCentre_liesOver + (K := K) (L := L) v + (chosenFinitePlaceExtension + (L := L) v), + hram⟩)) + simpa only [S, Set.mem_ofPred_eq, not_not, + IdeleGroup.finiteComponent_apply] using hvS + rw [← chosenFinitePlaceArtinMonoidHom_ker + (K := K) (L := L) v] at hNorm + exact MonoidHom.mem_ker.mp hNorm + +open scoped Classical in +/-- At an unramified finite place, the chosen local Artin map kills +integral idele components. -/ +theorem chosenFinitePlaceArtinMonoidHom_eq_one_of_integral_of_unramifiedAt + (v : HeightOneSpectrum (𝓞 K)) + (a : IdeleGroup K) + (ha : + IdeleGroup.finiteComponent v a ∈ + (v.adicCompletionIntegers K).units) + (hunram : + Algebra.IsUnramifiedAt (𝓞 K) + (finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension + (L := L) v)).asIdeal) : + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v + (IdeleGroup.finiteComponent v a) = 1 := by + have hNorm : + IdeleGroup.finiteComponent v a ∈ + chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := by + apply + adicCompletionIntegerUnits_le_chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v + (chosenFinitePlaceIsUnramified_of_isUnramifiedAt + (K := K) (L := L) v hunram) + exact ha + rw [← chosenFinitePlaceArtinMonoidHom_ker + (K := K) (L := L) v] at hNorm + exact MonoidHom.mem_ker.mp hNorm + +open scoped Classical in +private theorem chosenFinitePlaceArtinMonoidHom_eq_one_of_mem_localNorm + (v : HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) + (hx : x ∈ chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v) : + chosenFinitePlaceArtinMonoidHom (K := K) (L := L) v x = 1 := by + rw [← chosenFinitePlaceArtinMonoidHom_ker + (K := K) (L := L) v] at hx + exact MonoidHom.mem_ker.mp hx + +open scoped Classical in +/-- The product over all finite places of the actual local Artin +homomorphisms. Its value on an idele is a finite product because the +idele is locally integral almost everywhere and the extension is +unramified away from a finite set. -/ +noncomputable def finitePlaceGlobalArtinMonoidHom : + IdeleGroup K →* (L ≃ₐ[K] L) where + toFun a := + ∏ᶠ v : HeightOneSpectrum (𝓞 K), + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v + (IdeleGroup.finiteComponent v a) + map_one' := by + simp only [map_one] + exact finprod_one + map_mul' a b := by + simp only [map_mul] + exact + finprod_mul_distrib + (finitePlaceArtinFactors_hasFiniteMulSupport + (K := K) (L := L) a) + (finitePlaceArtinFactors_hasFiniteMulSupport + (K := K) (L := L) b) + +open scoped Classical in +/-- The finite-place global Artin homomorphism is continuous for the +restricted-product topology on ideles and the finite Krull topology on +the Galois group. -/ +theorem finitePlaceGlobalArtinMonoidHom_continuous : + Continuous + (finitePlaceGlobalArtinMonoidHom + (K := K) (L := L)) := by + classical + let T : Set (HeightOneSpectrum (𝓞 K)) := + {v | ∃ W : HeightOneSpectrum (𝓞 L), + W.asIdeal.LiesOver v.asIdeal ∧ + ¬ Algebra.IsUnramifiedAt (𝓞 K) W.asIdeal} + have hT : T.Finite := + AlgebraicNumberTheory.Ramification.finite_ramified_base_heightOne_primes + (𝓞 K) (𝓞 L) + let S : Finset (HeightOneSpectrum (𝓞 K)) := + hT.toFinset + let U : Set (IdeleGroup K) := + (IdeleGroup.supportedAt (K := K) (S : Set _) : Set _) ∩ + {a | ∀ v ∈ S, + IdeleGroup.finiteComponent v a ∈ + chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v} + have hUopen : IsOpen U := by + have hLocalOpen : IsOpen + {a : IdeleGroup K | ∀ v ∈ S, + IdeleGroup.finiteComponent v a ∈ + chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v} := by + rw [show + {a : IdeleGroup K | ∀ v ∈ S, + IdeleGroup.finiteComponent v a ∈ + chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v} = + ⋂ v ∈ S, + (IdeleGroup.finiteComponent v) ⁻¹' + (chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v : Set _) by + ext a + simp] + exact isOpen_biInter_finset fun v _ => + (chosenFinitePlaceLocalNormSubgroup_isOpen + (K := K) (L := L) v).preimage + (IdeleGroup.finiteComponentContinuous v).continuous + exact (IdeleGroup.isOpen_supportedAt S).inter hLocalOpen + have hUone : (1 : IdeleGroup K) ∈ U := by + constructor + · exact (IdeleGroup.supportedAt + (K := K) (S : Set _)).one_mem + · intro v _ + rw [map_one] + exact + (chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v).one_mem + have hUker : + U ⊆ + (finitePlaceGlobalArtinMonoidHom + (K := K) (L := L)) ⁻¹' {1} := by + intro a ha + change finitePlaceGlobalArtinMonoidHom + (K := K) (L := L) a = 1 + apply finprod_eq_one_of_forall_eq_one + intro v + by_cases hv : v ∈ S + · have hvNorm := ha.2 v hv + rw [← chosenFinitePlaceArtinMonoidHom_ker + (K := K) (L := L) v] at hvNorm + exact MonoidHom.mem_ker.mp hvNorm + · have hvT : v ∉ T := by + simp only [S, Set.Finite.mem_toFinset] at hv + exact hv + have haIntegral : + IdeleGroup.finiteComponent v a ∈ + (v.adicCompletionIntegers K).units := by + exact + (IdeleGroup.mem_supportedAt_iff + (K := K) (S : Set _) a).mp ha.1 v hv + apply + chosenFinitePlaceArtinMonoidHom_eq_one_of_integral_of_unramifiedAt + (K := K) (L := L) v a haIntegral + by_contra hram + apply hvT + exact + ⟨finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension + (L := L) v), + finitePlaceExtensionCentre_liesOver + (K := K) (L := L) v + (chosenFinitePlaceExtension + (L := L) v), + hram⟩ + apply continuous_of_continuousAt_one _ + rw [continuousAt_def, map_one] + intro V hV + apply Filter.mem_of_superset (hUopen.mem_nhds hUone) + intro a ha + have hmap : finitePlaceGlobalArtinMonoidHom + (K := K) (L := L) a = 1 := + Set.mem_preimage.mp (hUker ha) + change finitePlaceGlobalArtinMonoidHom + (K := K) (L := L) a ∈ V + simpa only [hmap] using mem_of_mem_nhds hV + +open scoped Classical in +/-- The finite Artin product after an idele norm is the `finprod`, over +base finite places, of the products of the corresponding local norm +factors at all finite places upstairs. -/ +theorem finitePlaceGlobalArtinMonoidHom_norm_eq_finprod_fibers + {M : Type} + [Field M] [NumberField M] [Algebra K M] + (a : IdeleGroup M) : + letI : ∀ v : HeightOneSpectrum (𝓞 K), + Fintype {W : HeightOneSpectrum (𝓞 M) // + finitePlaceBelow (K := K) W = v} := + fun v => by + let vK := HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + letI := + completionTensorDecompositionExtensionFintype + (K := K) (L := M) vK hvK + exact + Fintype.ofEquiv (AbsoluteValueExtension vK M) + (finitePlaceExtensionEquivAbove + (K := K) (L := M) v) + letI : ∀ v : HeightOneSpectrum (𝓞 K), + ∀ W : {W : HeightOneSpectrum (𝓞 M) // + finitePlaceBelow (K := K) W = v}, + Algebra (v.adicCompletion K) + (W.1.adicCompletion M) := + fun v W => + (finitePlaceAdicCompletionMap + K M v W).toAlgebra + finitePlaceGlobalArtinMonoidHom + (K := K) (L := L) + (IdeleGroup.norm K M a) = + ∏ᶠ v : HeightOneSpectrum (𝓞 K), + ∏ W : {W : HeightOneSpectrum (𝓞 M) // + finitePlaceBelow (K := K) W = v}, + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v + (LocalFieldTheory.normUnits + (v.adicCompletion K) + (W.1.adicCompletion M) + (IdeleGroup.finiteComponent W.1 a)) := by + classical + let : ∀ v : HeightOneSpectrum (𝓞 K), + Fintype {W : HeightOneSpectrum (𝓞 M) // + finitePlaceBelow (K := K) W = v} := + fun v => by + let vK := HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + letI := + completionTensorDecompositionExtensionFintype + (K := K) (L := M) vK hvK + exact + Fintype.ofEquiv (AbsoluteValueExtension vK M) + (finitePlaceExtensionEquivAbove + (K := K) (L := M) v) + let : ∀ v : HeightOneSpectrum (𝓞 K), + ∀ W : {W : HeightOneSpectrum (𝓞 M) // + finitePlaceBelow (K := K) W = v}, + Algebra (v.adicCompletion K) + (W.1.adicCompletion M) := + fun v W => + (finitePlaceAdicCompletionMap + K M v W).toAlgebra + rw [finitePlaceGlobalArtinMonoidHom] + apply finprod_congr + intro v + rw [IdeleGroup.finiteComponent_norm_eq_prod] + rw [map_prod] + +open scoped Classical in +private theorem finitePlaceNormArtinFactor_eq_one_of_component_unit_of_unramified + {M : Type} + [Field M] [NumberField M] [Algebra K M] + (a : IdeleGroup M) + (W : HeightOneSpectrum (𝓞 M)) + (hComponentUnit : + IdeleGroup.finiteComponent W a ∈ + (W.adicCompletionIntegers M).units) + (hunram : ChosenFinitePlaceIsUnramified + (K := K) (L := L) (finitePlaceBelow (K := K) W)) : + let v := finitePlaceBelow (K := K) W + letI : Algebra (v.adicCompletion K) (W.adicCompletion M) := + (finitePlaceAdicCompletionMap K M v ⟨W, rfl⟩).toAlgebra + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v + (LocalFieldTheory.normUnits + (v.adicCompletion K) + (W.adicCompletion M) + (IdeleGroup.finiteComponent W a)) = 1 := by + let v := finitePlaceBelow (K := K) W + let Wv : + {Q : HeightOneSpectrum (𝓞 M) // + finitePlaceBelow (K := K) Q = v} := + ⟨W, rfl⟩ + let z : (W.adicCompletionIntegers M).units := + ⟨IdeleGroup.finiteComponent W a, hComponentUnit⟩ + let : Algebra (v.adicCompletion K) (W.adicCompletion M) := + (finitePlaceAdicCompletionMap K M v Wv).toAlgebra + have hNormUnit : + LocalFieldTheory.normUnits + (v.adicCompletion K) + (W.adicCompletion M) + (IdeleGroup.finiteComponent W a) ∈ + (v.adicCompletionIntegers K).units := by + simpa only [z, Subgroup.coe_subtype] using + IdeleGroup.finitePlace_normUnits_mem_integerUnits + (K := K) (L := M) v Wv z + apply + chosenFinitePlaceArtinMonoidHom_eq_one_of_mem_localNorm + (K := K) (L := L) v + apply + adicCompletionIntegerUnits_le_chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v hunram + exact hNormUnit + +open scoped Classical in +/-- The local Artin factors obtained after an idele norm have finite +multiplicative support. -/ +theorem finitePlaceNormArtinFactors_hasFiniteMulSupport + {M : Type} + [Field M] [NumberField M] [Algebra K M] + (a : IdeleGroup M) : + HasFiniteMulSupport + (fun W : HeightOneSpectrum (𝓞 M) => + let v := + finitePlaceBelow (K := K) W + letI : Algebra (v.adicCompletion K) + (W.adicCompletion M) := + (finitePlaceAdicCompletionMap + K M v ⟨W, rfl⟩).toAlgebra + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v + (LocalFieldTheory.normUnits + (v.adicCompletion K) + (W.adicCompletion M) + (IdeleGroup.finiteComponent W a))) := by + let S : Set (HeightOneSpectrum (𝓞 M)) := + {W | a.2 W ∉ (W.adicCompletionIntegers M).units} + let T : Set (HeightOneSpectrum (𝓞 K)) := + {v | ∃ V : HeightOneSpectrum (𝓞 L), + V.asIdeal.LiesOver v.asIdeal ∧ + ¬ Algebra.IsUnramifiedAt (𝓞 K) V.asIdeal} + let U : Set (HeightOneSpectrum (𝓞 M)) := + {W | finitePlaceBelow (K := K) W ∈ T} + have hS : S.Finite := + Filter.eventually_cofinite.mp + (FiniteIdeleGroup.eventually_mem_localUnits a.2) + have hT : T.Finite := + AlgebraicNumberTheory.Ramification.finite_ramified_base_heightOne_primes + (𝓞 K) (𝓞 L) + have hU : U.Finite := by + exact + Set.Finite.preimage_finitePlaceBelow + (K := K) (L := M) hT + rw [HasFiniteMulSupport] + apply (hS.union hU).subset + rw [mulSupport_subset_iff'] + intro W hW + have hWS : W ∉ S := by + intro hWS + exact hW (Set.mem_union_left U hWS) + have hWU : W ∉ U := by + intro hWU + exact hW (Set.mem_union_right S hWU) + let v := + finitePlaceBelow (K := K) W + have hComponentUnit : + IdeleGroup.finiteComponent W a ∈ + (W.adicCompletionIntegers M).units := by + simpa only [S, Set.mem_ofPred_eq, not_not, + IdeleGroup.finiteComponent_apply] using hWS + have hvT : v ∉ T := by + intro hvT + apply hWU + exact hvT + apply + finitePlaceNormArtinFactor_eq_one_of_component_unit_of_unramified + (K := K) (L := L) a W hComponentUnit + apply chosenFinitePlaceIsUnramified_of_isUnramifiedAt + (K := K) (L := L) v + by_contra hram + apply hvT + exact + ⟨finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v), + finitePlaceExtensionCentre_liesOver + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v), + hram⟩ + +open scoped Classical in +/-- The finite Artin product after an idele norm, indexed directly by +the actual finite places upstairs. This is the flattened finite-place +form of the local norm--restriction identity used in the global square. -/ +theorem finitePlaceGlobalArtinMonoidHom_norm_eq_finprod + {M : Type} + [Field M] [NumberField M] [Algebra K M] + (a : IdeleGroup M) : + letI : ∀ W : HeightOneSpectrum (𝓞 M), + Algebra + ((finitePlaceBelow + (K := K) W).adicCompletion K) + (W.adicCompletion M) := + fun W => + (finitePlaceAdicCompletionMap + K M + (finitePlaceBelow (K := K) W) + ⟨W, rfl⟩).toAlgebra + finitePlaceGlobalArtinMonoidHom + (K := K) (L := L) + (IdeleGroup.norm K M a) = + ∏ᶠ W : HeightOneSpectrum (𝓞 M), + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) + (finitePlaceBelow (K := K) W) + (LocalFieldTheory.normUnits + ((finitePlaceBelow + (K := K) W).adicCompletion K) + (W.adicCompletion M) + (IdeleGroup.finiteComponent W a)) := by + classical + let : ∀ W : HeightOneSpectrum (𝓞 M), + Algebra + ((finitePlaceBelow + (K := K) W).adicCompletion K) + (W.adicCompletion M) := + fun W => + (finitePlaceAdicCompletionMap + K M + (finitePlaceBelow (K := K) W) + ⟨W, rfl⟩).toAlgebra + let : ∀ v : HeightOneSpectrum (𝓞 K), + Fintype {W : HeightOneSpectrum (𝓞 M) // + finitePlaceBelow (K := K) W = v} := + fun v => by + let vK := HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + letI := + completionTensorDecompositionExtensionFintype + (K := K) (L := M) vK hvK + exact + Fintype.ofEquiv (AbsoluteValueExtension vK M) + (finitePlaceExtensionEquivAbove + (K := K) (L := M) v) + let : ∀ v : HeightOneSpectrum (𝓞 K), + ∀ W : {W : HeightOneSpectrum (𝓞 M) // + finitePlaceBelow (K := K) W = v}, + Algebra (v.adicCompletion K) + (W.1.adicCompletion M) := + fun v W => + (finitePlaceAdicCompletionMap + K M v W).toAlgebra + let g : + HeightOneSpectrum (𝓞 M) → + HeightOneSpectrum (𝓞 K) := + finitePlaceBelow (K := K) + let f : + HeightOneSpectrum (𝓞 M) → + (L ≃ₐ[K] L) := + fun W => + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) (g W) + (LocalFieldTheory.normUnits + ((g W).adicCompletion K) + (W.adicCompletion M) + (IdeleGroup.finiteComponent W a)) + have hf : HasFiniteMulSupport f := by + simpa only [f, g] using + finitePlaceNormArtinFactors_hasFiniteMulSupport + (K := K) (L := L) a + calc + finitePlaceGlobalArtinMonoidHom + (K := K) (L := L) + (IdeleGroup.norm K M a) = + ∏ᶠ v : HeightOneSpectrum (𝓞 K), + ∏ W : {W : HeightOneSpectrum (𝓞 M) // + g W = v}, + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v + (LocalFieldTheory.normUnits + (v.adicCompletion K) + (W.1.adicCompletion M) + (IdeleGroup.finiteComponent W.1 a)) := by + simpa only [g] using + finitePlaceGlobalArtinMonoidHom_norm_eq_finprod_fibers + (K := K) (L := L) a + _ = ∏ᶠ v : HeightOneSpectrum (𝓞 K), + ∏ᶠ W : {W : HeightOneSpectrum (𝓞 M) // + g W = v}, + f W.1 := by + apply finprod_congr + intro v + rw [finprod_eq_prod_of_fintype] + apply Finset.prod_congr rfl + intro W _ + rcases W with ⟨W, hW⟩ + subst v + simp only [f, g] + _ = ∏ᶠ W : HeightOneSpectrum (𝓞 M), f W := + finprod_fibers_eq_sigma g f hf + _ = ∏ᶠ W : HeightOneSpectrum (𝓞 M), + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) + (finitePlaceBelow (K := K) W) + (LocalFieldTheory.normUnits + ((finitePlaceBelow (K := K) W).adicCompletion K) + (W.adicCompletion M) + (IdeleGroup.finiteComponent W a)) := by + apply finprod_congr + intro W + simp only [f, g] + +open scoped Classical in +/-- The finite part of the Artin norm--restriction field diamond. +Restriction of the upper finite Artin product is the lower finite Artin product +after the ordinary idele norm. -/ +theorem finitePlaceGlobalArtinMonoidHom_norm_restriction + {K' L' : Type} + [Field K'] [NumberField K'] + [Field L'] [NumberField L'] + [Algebra K K'] [Algebra K' L'] [Algebra K L'] + [IsScalarTower K K' L'] + [Algebra L L'] [IsScalarTower K L L'] + [IsAbelianGalois K' L'] : + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)).comp + (finitePlaceGlobalArtinMonoidHom + (K := K') (L := L')) = + (finitePlaceGlobalArtinMonoidHom + (K := K) (L := L)).comp + (IdeleGroup.norm K K') := by + apply MonoidHom.ext + intro a + let : ∀ W : HeightOneSpectrum (𝓞 K'), + Algebra + ((finitePlaceBelow + (K := K) W).adicCompletion K) + (W.adicCompletion K') := + fun W => + (finitePlaceAdicCompletionMap + K K' + (finitePlaceBelow (K := K) W) + ⟨W, rfl⟩).toAlgebra + change + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) + (∏ᶠ W : HeightOneSpectrum (𝓞 K'), + chosenFinitePlaceArtinMonoidHom + (K := K') (L := L') W + (IdeleGroup.finiteComponent W a)) = + finitePlaceGlobalArtinMonoidHom + (K := K) (L := L) + (IdeleGroup.norm K K' a) + rw [finitePlaceGlobalArtinMonoidHom_norm_eq_finprod] + rw [MonoidHom.map_finprod + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) + (finitePlaceArtinFactors_hasFiniteMulSupport + (K := K') (L := L') a)] + apply finprod_congr + intro W + exact + DFunLike.congr_fun + (chosenFinitePlaceArtinMonoidHom_norm_restriction + (K := K) (L := L) W) + (IdeleGroup.finiteComponent W a) + +open scoped Classical in +/-- On an idele supported at one finite place, the finite global product +is exactly that local Artin factor. -/ +@[simp] +theorem finitePlaceGlobalArtinMonoidHom_finitePlaceIdele + (v : HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) : + finitePlaceGlobalArtinMonoidHom + (K := K) (L := L) + (finitePlaceIdele v x) = + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x := by + change + (∏ᶠ w : HeightOneSpectrum (𝓞 K), + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) w + (IdeleGroup.finiteComponent w (finitePlaceIdele v x))) = + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x + rw [finprod_eq_single _ v] + · rw [finitePlaceIdele_finiteComponent_same] + · intro w hw + rw [finitePlaceIdele_finiteComponent_of_ne v w x hw, + map_one] + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteLocalFamily.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteLocalFamily.lean new file mode 100644 index 0000000000..d46b152e9c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteLocalFamily.lean @@ -0,0 +1,160 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.NormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +/-! +# Finite local families of ideles + +A finite family of local elements, extended by `1`, is the product of its +one-place ideles. Applying the global norm-quotient map gives the finite +product identity. The quotient map itself factors through idele classes +and therefore kills principal ideles. +-/ + +@[expose] public section + +open scoped NumberField BigOperators +open NumberField IsDedekindDomain +open IdeleGroup RelativeIdeleGroup + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +variable {K : Type*} [Field K] [NumberField K] + +open scoped Classical in +/-- A finite local family is the product of its one-place ideles. -/ +theorem prod_finitePlaceIdele_eq_ideleOfFiniteLocalFamily + (S : Finset (HeightOneSpectrum (𝓞 K))) + (a : ∀ v : ↥S, (v.1.adicCompletion K)ˣ) : + (∏ v : ↥S, finitePlaceIdele v.1 (a v)) = + IdeleGroup.ideleOfFiniteLocalFamily S a := by + apply Prod.ext + · apply ContinuousMulEquiv.piUnits.injective + funext w + change + IdeleGroup.infiniteComponent w + (∏ v : ↥S, finitePlaceIdele v.1 (a v)) = + IdeleGroup.infiniteComponent w + (IdeleGroup.ideleOfFiniteLocalFamily S a) + rw [map_prod] + have hfactor : + ∀ v : ↥S, + IdeleGroup.infiniteComponent w + (finitePlaceIdele v.1 (a v)) = 1 := by + intro v + exact finitePlaceIdele_infiniteComponent v.1 w (a v) + have hright : + IdeleGroup.infiniteComponent w + (IdeleGroup.ideleOfFiniteLocalFamily S a) = 1 := + rfl + rw [hright] + simp_rw [hfactor] + simp + · apply RestrictedProduct.ext + intro w + change + IdeleGroup.finiteComponent w + (∏ v : ↥S, finitePlaceIdele v.1 (a v)) = + (IdeleGroup.ideleOfFiniteLocalFamily S a).2 w + rw [map_prod] + by_cases hw : w ∈ S + · let vw : ↥S := ⟨w, hw⟩ + rw [Finset.prod_eq_single vw] + · calc + IdeleGroup.finiteComponent w + (finitePlaceIdele vw.1 (a vw)) = + a vw := by + simpa [vw] using + finitePlaceIdele_finiteComponent_same + w (a vw) + _ = (IdeleGroup.ideleOfFiniteLocalFamily S a).2 w := + (IdeleGroup.finiteIdeleOfFinset_apply_mem + S a vw).symm + · intro b _ hbw + apply finitePlaceIdele_finiteComponent_of_ne + intro h + apply hbw + apply Subtype.ext + exact h.symm + · intro hvw + exact (hvw (Finset.mem_univ vw)).elim + · calc + ∏ v : ↥S, + IdeleGroup.finiteComponent w + (finitePlaceIdele v.1 (a v)) = + 1 := by + apply Finset.prod_eq_one + intro v _ + apply finitePlaceIdele_finiteComponent_of_ne + intro h + apply hw + rw [h] + exact v.2 + _ = (IdeleGroup.ideleOfFiniteLocalFamily S a).2 w := + (IdeleGroup.finiteIdeleOfFinset_apply_notMem + S a w hw).symm + +open scoped Classical in +/-- Applying any multiplicative global symbol to a finite local family +gives the product of the one-place symbols. -/ +theorem map_ideleOfFiniteLocalFamily_eq_prod_local + {A : Type*} [CommGroup A] + (f : IdeleGroup K →* A) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (a : ∀ v : ↥S, (v.1.adicCompletion K)ˣ) : + f (IdeleGroup.ideleOfFiniteLocalFamily S a) = + ∏ v : ↥S, f (finitePlaceIdele v.1 (a v)) := by + rw [← map_prod, + prod_finitePlaceIdele_eq_ideleOfFiniteLocalFamily] + +section NormQuotient + +variable + (L : Type*) [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +open scoped Classical in +local instance finiteLocalFamilyIdeleClassGroupIsMulCommutative : + IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] finiteLocalFamilyIdeleClassGroupIsMulCommutative + +open scoped Classical in +/-- The idele class group carries its canonical commutative group structure. -/ +local instance finiteLocalFamilyIdeleClassGroupCommGroup : + CommGroup (IdeleClassGroup K) := + open scoped IsMulCommutative in + inferInstance + +attribute [local instance] finiteLocalFamilyIdeleClassGroupCommGroup + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- The finite-support product formula for the global +norm-quotient symbol. -/ +theorem globalNormClass_finiteLocalFamily + (S : Finset (HeightOneSpectrum (𝓞 K))) + (a : ∀ v : ↥S, (v.1.adicCompletion K)ˣ) : + globalNormClassFromIdele K L + (IdeleGroup.ideleOfFiniteLocalFamily S a) = + ∏ v : ↥S, + globalNormClassFromIdele K L + (finitePlaceIdele v.1 (a v)) := + map_ideleOfFiniteLocalFamily_eq_prod_local + (globalNormClassFromIdele K L) S a + +end NormQuotient + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertComparison.lean new file mode 100644 index 0000000000..45aa9c8267 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertComparison.lean @@ -0,0 +1,181 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicLocalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibHilbertProductFormula +/-! +# Comparison of finite-place Hilbert factors + +The finite-place factor of the transported adic pairing agrees with the +established finite-place Hilbert symbol. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +/-- The established finite-place symbol becomes the local Mathlib-facing +Hilbert symbol after mapping to the absolute-value completion. -/ +private theorem globalFinitePlaceHilbertSymbol_map_eq_local + (F : Type) [Field F] [NumberField F] + (n : ℕ+) (hnF : ((n : ℕ) : F) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) F).Nonempty) + (v : HeightOneSpectrum (𝓞 F)) (a b : Fˣ) : + let C := (HeightOneSpectrum.adicAbv F v).Completion + letI : ValuativeRel C := + GlobalClassFieldTheory.Reciprocity.finitePlaceLocalArtinCompletionValuativeRel v + let eFC : rootsOfUnity (n : ℕ) F ≃* rootsOfUnity (n : ℕ) C := + letI : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + rootsOfUnityEquivOfPrimitiveRoots (algebraMap F C).injective hmu + eFC (globalFinitePlaceHilbertSymbol F n hnF hmu v a b) = + localHilbertSymbol C n + (GlobalClassFieldTheory.Reciprocity.finitePlaceHilbert_natCast_ne_zero + F n hnF v) + (GlobalClassFieldTheory.Reciprocity.finitePlaceHilbert_primitiveRoots_nonempty + F n hmu v) + (GlobalClassFieldTheory.Reciprocity.finitePlaceHilbertCompletionUnit F v a) + (GlobalClassFieldTheory.Reciprocity.finitePlaceHilbertCompletionUnit F v b) := by + let C := (HeightOneSpectrum.adicAbv F v).Completion + let : ValuativeRel C := + GlobalClassFieldTheory.Reciprocity.finitePlaceLocalArtinCompletionValuativeRel v + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + let eFC : rootsOfUnity (n : ℕ) F ≃* rootsOfUnity (n : ℕ) C := + rootsOfUnityEquivOfPrimitiveRoots (algebraMap F C).injective hmu + change eFC + (KummerTheory.nthRootsSubgroupEquivRootsOfUnity F (n : ℕ) + (GlobalClassFieldTheory.Reciprocity.finitePlaceHilbertSymbol + F n hnF hmu v a b)) = + KummerTheory.nthRootsSubgroupEquivRootsOfUnity C (n : ℕ) + (GlobalClassFieldTheory.Reciprocity.finitePlaceLocalHilbertSymbol + F n hnF hmu v a b) + apply Subtype.ext + have h := congrArg Subtype.val + (GlobalClassFieldTheory.Reciprocity.finitePlaceHilbertSymbol_map_eq_localHilbertSymbol + F n hnF hmu v a b) + change Units.map (algebraMap F C).toMonoidHom + (GlobalClassFieldTheory.Reciprocity.finitePlaceHilbertSymbol + F n hnF hmu v a b) = + GlobalClassFieldTheory.Reciprocity.finitePlaceLocalHilbertSymbol + F n hnF hmu v a b + exact h + +/-- Mapping roots of unity from the number field to the adic completion +agrees with mapping first to the absolute-value completion. -/ +private theorem rootsOfUnity_finiteCompletion_comp + (F : Type) [Field F] [NumberField F] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) F).Nonempty) + (v : HeightOneSpectrum (𝓞 F)) + (hmuC : (primitiveRoots (n : ℕ) + (HeightOneSpectrum.adicAbv F v).Completion).Nonempty) + (z : rootsOfUnity (n : ℕ) F) : + let C := (HeightOneSpectrum.adicAbv F v).Completion + let D := v.adicCompletion F + letI : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + let eFC : rootsOfUnity (n : ℕ) F ≃* rootsOfUnity (n : ℕ) C := + rootsOfUnityEquivOfPrimitiveRoots (algebraMap F C).injective hmu + let eFD : rootsOfUnity (n : ℕ) F ≃* rootsOfUnity (n : ℕ) D := + rootsOfUnityEquivOfPrimitiveRoots (algebraMap F D).injective hmu + let eCD : rootsOfUnity (n : ℕ) C ≃* rootsOfUnity (n : ℕ) D := + rootsOfUnityEquivOfRingEquiv + (relativeFinitePlaceCompletionAlgEquiv v).toRingEquiv n hmuC + eFD z = eCD (eFC z) := by + let C := (HeightOneSpectrum.adicAbv F v).Completion + let D := v.adicCompletion F + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + let eFC : rootsOfUnity (n : ℕ) F ≃* rootsOfUnity (n : ℕ) C := + rootsOfUnityEquivOfPrimitiveRoots (algebraMap F C).injective hmu + let eFD : rootsOfUnity (n : ℕ) F ≃* rootsOfUnity (n : ℕ) D := + rootsOfUnityEquivOfPrimitiveRoots (algebraMap F D).injective hmu + let eCD : rootsOfUnity (n : ℕ) C ≃* rootsOfUnity (n : ℕ) D := + rootsOfUnityEquivOfRingEquiv + (relativeFinitePlaceCompletionAlgEquiv v).toRingEquiv n hmuC + apply Subtype.ext + apply Units.ext + change algebraMap F D ((z : Fˣ) : F) = + (relativeFinitePlaceCompletionAlgEquiv v) + (algebraMap F C ((z : Fˣ) : F)) + exact (relativeFinitePlaceCompletionAlgEquiv v).commutes ((z : Fˣ) : F) |>.symm + +/-- The finite factor of the adic local Hilbert family is the established +global finite-place Hilbert symbol. -/ +theorem finitePlaceAdicHilbertPairingFamily_finiteFactor + (F : Type) [Field F] [NumberField F] + (n : ℕ+) (hnF : ((n : ℕ) : F) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) F).Nonempty) + (v : HeightOneSpectrum (𝓞 F)) (a b : Fˣ) : + GlobalHilbertPairingFamily.finiteFactor F + (finitePlaceAdicHilbertPairingFamily F n hmu) hmu v a b = + globalFinitePlaceHilbertSymbol F n hnF hmu v a b := by + let C := (HeightOneSpectrum.adicAbv F v).Completion + let D := v.adicCompletion F + let e : C ≃+* D := (relativeFinitePlaceCompletionAlgEquiv v).toRingEquiv + let : ValuativeRel C := + GlobalClassFieldTheory.Reciprocity.finitePlaceLocalArtinCompletionValuativeRel v + let : IsNonarchimedeanLocalField C := + GlobalClassFieldTheory.Reciprocity.finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + let hnC : ((n : ℕ) : C) ≠ 0 := + GlobalClassFieldTheory.Reciprocity.finitePlaceHilbert_natCast_ne_zero F n hnF v + let hmuC : (primitiveRoots (n : ℕ) C).Nonempty := + GlobalClassFieldTheory.Reciprocity.finitePlaceHilbert_primitiveRoots_nonempty + F n hmu v + let eFC : rootsOfUnity (n : ℕ) F ≃* rootsOfUnity (n : ℕ) C := + rootsOfUnityEquivOfPrimitiveRoots (algebraMap F C).injective hmu + let eFD : rootsOfUnity (n : ℕ) F ≃* rootsOfUnity (n : ℕ) D := + rootsOfUnityEquivOfPrimitiveRoots (algebraMap F D).injective hmu + let eCD : rootsOfUnity (n : ℕ) C ≃* rootsOfUnity (n : ℕ) D := + rootsOfUnityEquivOfRingEquiv e n hmuC + let aC : Cˣ := + GlobalClassFieldTheory.Reciprocity.finitePlaceHilbertCompletionUnit F v a + let bC : Cˣ := + GlobalClassFieldTheory.Reciprocity.finitePlaceHilbertCompletionUnit F v b + let aD : Dˣ := Units.map (algebraMap F D).toMonoidHom a + let bD : Dˣ := Units.map (algebraMap F D).toMonoidHom b + have hunit (x : Fˣ) : + (Units.mapEquiv e.toMulEquiv).symm + (Units.map (algebraMap F D).toMonoidHom x) = + GlobalClassFieldTheory.Reciprocity.finitePlaceHilbertCompletionUnit F v x := by + apply Units.ext + apply e.injective + change e (e.symm (algebraMap F D (x : F))) = + e (algebraMap F C (x : F)) + rw [e.apply_symm_apply] + exact (relativeFinitePlaceCompletionAlgEquiv v).commutes (x : F) |>.symm + have hfactorD : + eFD (GlobalHilbertPairingFamily.finiteFactor F + (finitePlaceAdicHilbertPairingFamily F n hmu) hmu v a b) = + eCD (localHilbertSymbol C n hnC hmuC aC bC) := by + change eFD (eFD.symm + ((hilbertPairingOfRingEquiv e n hmuC + (localHilbertPairing C n hnC hmuC)) + (powerClass D n aD) (powerClass D n bD))) = _ + rw [eFD.apply_symm_apply, hilbertPairingOfRingEquiv_apply, + powerClassGroupEquivOfRingEquiv_symm_powerClass, + powerClassGroupEquivOfRingEquiv_symm_powerClass, + hunit a, hunit b, localHilbertPairing_powerClass] + have hglobal : + eFC (globalFinitePlaceHilbertSymbol F n hnF hmu v a b) = + localHilbertSymbol C n hnC hmuC aC bC := + globalFinitePlaceHilbertSymbol_map_eq_local F n hnF hmu v a b + apply eFD.injective + calc + eFD (GlobalHilbertPairingFamily.finiteFactor F + (finitePlaceAdicHilbertPairingFamily F n hmu) hmu v a b) = + eCD (localHilbertSymbol C n hnC hmuC aC bC) := hfactorD + _ = eCD (eFC (globalFinitePlaceHilbertSymbol F n hnF hmu v a b)) := by + rw [hglobal] + _ = eFD (globalFinitePlaceHilbertSymbol F n hnF hmu v a b) := + (rootsOfUnity_finiteCompletion_comp F n hmu v hmuC _).symm + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertProductFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertProductFormula.lean new file mode 100644 index 0000000000..0829696dee --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertProductFormula.lean @@ -0,0 +1,69 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertComparison +/-! +# A coherent Hilbert pairing family in a small number field + +The finite-place family already constructed from the local norm-residue +pairing satisfies the local laws. Its finite factors agree with the factors +of the global Hilbert product formula. +-/ + +@[expose] public section + +open scoped BigOperators NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +/-- The adic local pairings form a coherent global family, with their actual +finite-place factors satisfying the Hilbert product formula. -/ +theorem finitePlaceAdicHilbertPairingFamily_productFormula + (F : Type) [Field F] [NumberField F] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) F).Nonempty) : + let B := finitePlaceAdicHilbertPairingFamily F n hmu + GlobalHilbertPairingFamily.IsLocallyHilbert F B ∧ + GlobalHilbertPairingFamily.HasFiniteSupport F B hmu ∧ + ∀ a b : Fˣ, + (∏ v : InfinitePlace F, + globalInfinitePlaceHilbertSymbol F n v a b) * + ∏ᶠ v : HeightOneSpectrum (𝓞 F), + GlobalHilbertPairingFamily.finiteFactor F B hmu v a b = 1 := by + let B := finitePlaceAdicHilbertPairingFamily F n hmu + have hnF : ((n : ℕ) : F) ≠ 0 := Nat.cast_ne_zero.mpr n.ne_zero + refine ⟨finitePlaceAdicHilbertPairingFamily_isLocallyHilbert F n hmu, ?_, ?_⟩ + · intro a b + have hsource := + GlobalClassFieldTheory.Reciprocity.finitePlaceHilbertSymbol_hasFiniteMulSupport + F n hnF hmu a b + have htarget : Function.HasFiniteMulSupport + (fun v : HeightOneSpectrum (𝓞 F) => + globalFinitePlaceHilbertSymbol F n hnF hmu v a b) := + hsource.fun_comp + (KummerTheory.nthRootsSubgroupEquivRootsOfUnity F (n : ℕ)).map_one + convert htarget using 1 + funext v + exact finitePlaceAdicHilbertPairingFamily_finiteFactor F n hnF hmu v a b + · intro a b + calc + _ = (∏ v : InfinitePlace F, + globalInfinitePlaceHilbertSymbol F n v a b) * + ∏ᶠ v : HeightOneSpectrum (𝓞 F), + globalFinitePlaceHilbertSymbol F n hnF hmu v a b := by + congr 1 + apply finprod_congr + intro v + exact finitePlaceAdicHilbertPairingFamily_finiteFactor + F n hnF hmu v a b + _ = 1 := hilbertProductFormula F n hnF hmu a b + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicLocalField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicLocalField.lean new file mode 100644 index 0000000000..1b9551229e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicLocalField.lean @@ -0,0 +1,175 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SemilinearNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport +public import Mathlib.NumberTheory.LocalField.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology +/-! +# Local-field structure on a finite adic completion + +The distinguished integer-valued valuation on a number-field completion +provides the valuation relation required by local reciprocity. The +valuation relation is passed explicitly, not registered globally. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- The valuation relation induced by the canonical discrete valuation on +the completion at a finite place. -/ +@[reducible] +def finitePlaceCompletionValuativeRel + (F : Type u) [Field F] [NumberField F] + (v : HeightOneSpectrum (𝓞 F)) : + ValuativeRel (v.adicCompletion F) := + ValuativeRel.ofValuation + (Valued.v : Valuation (v.adicCompletion F) (WithZero (Multiplicative ℤ))) + +/-- The canonical finite adic completion is a nonarchimedean local field for +its distinguished valuation. -/ +theorem finitePlaceCompletionIsNonarchimedeanLocalField + (F : Type u) [Field F] [NumberField F] + (v : HeightOneSpectrum (𝓞 F)) : + @IsNonarchimedeanLocalField (v.adicCompletion F) inferInstance + (finitePlaceCompletionValuativeRel F v) inferInstance := by + let C := v.adicCompletion F + let ν : Valuation C (WithZero (Multiplicative ℤ)) := Valued.v + let _ : ν.IsNontrivial := inferInstance + let _ : ValuativeRel C := finitePlaceCompletionValuativeRel F v + let _ : ν.Compatible := Valuation.Compatible.ofValuation ν + let _ : ValuativeRel.IsNontrivial C := + (ValuativeRel.isNontrivial_iff_isNontrivial ν).2 inferInstance + let _ : IsValuativeTopology C := + LocalFieldTheory.isValuativeTopology_of_valued_ofValuation + C (WithZero (Multiplicative ℤ)) + exact + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + +end ClassFieldTheory + +section CompletionComparison + +open LocalClassFieldTheory + +variable (F : Type) [Field F] [NumberField F] +variable (v : HeightOneSpectrum (𝓞 F)) + +/-- The absolute-value completion uses the valuative relation chosen for finite-place local +reciprocity. -/ +local instance finitePlaceCompletionComparisonSourceValuativeRel : + ValuativeRel (HeightOneSpectrum.adicAbv F v).Completion := + GlobalClassFieldTheory.Reciprocity.finitePlaceLocalArtinCompletionValuativeRel v + +/-- The adic completion uses its finite-place valuative relation. -/ +local instance finitePlaceCompletionComparisonTargetValuativeRel : + ValuativeRel (v.adicCompletion F) := + ClassFieldTheory.finitePlaceCompletionValuativeRel F v + +/-- The canonical equivalence between the two finite-completion models +respects their chosen valuation relations. -/ +theorem finitePlaceCompletion_semilinearValuationCompatible : + SemilinearValuationCompatible + (HeightOneSpectrum.adicAbv F v).Completion + (v.adicCompletion F) + (relativeFinitePlaceCompletionAlgEquiv v).toRingEquiv := by + let C := (HeightOneSpectrum.adicAbv F v).Completion + let C' := v.adicCompletion F + let e := (relativeFinitePlaceCompletionAlgEquiv v).toRingEquiv + let _ : Algebra C C' := e.toRingHom.toAlgebra + change (ValuativeRel.valuation C).HasExtension (ValuativeRel.valuation C') + constructor + intro x y + change ValuativeRel.valuation C x ≤ ValuativeRel.valuation C y ↔ + ValuativeRel.valuation C' (e x) ≤ ValuativeRel.valuation C' (e y) + rw [← Valuation.Compatible.vle_iff_le, ← Valuation.Compatible.vle_iff_le] + change ‖x‖₊ ≤ ‖y‖₊ ↔ + (Valued.v : Valuation C' (WithZero (Multiplicative ℤ))) (e x) ≤ Valued.v (e y) + rw [← Valued.toNormedField.norm_le_iff] + change ‖x‖ ≤ ‖y‖ ↔ ‖relativeFinitePlaceCompletionRingEquiv v x‖ ≤ + ‖relativeFinitePlaceCompletionRingEquiv v y‖ + rw [relativeFinitePlaceCompletionRingEquiv_norm, + relativeFinitePlaceCompletionRingEquiv_norm] + +end CompletionComparison + +namespace ClassFieldTheory + +/-- At each finite place, transport the local Hilbert pairing from the +absolute-value completion to Mathlib's adic completion. -/ +def finitePlaceAdicHilbertPairingFamily + (F : Type) [Field F] [NumberField F] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) F).Nonempty) : + GlobalHilbertPairingFamily F n := by + intro v + let C := (HeightOneSpectrum.adicAbv F v).Completion + letI : ValuativeRel C := + GlobalClassFieldTheory.Reciprocity.finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + GlobalClassFieldTheory.Reciprocity.finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + letI : CharZero C := + charZero_of_injective_algebraMap (algebraMap F C).injective + have hnC : ((n : ℕ) : C) ≠ 0 := by + exact Nat.cast_ne_zero.mpr n.ne_zero + have hmuC : (primitiveRoots (n : ℕ) C).Nonempty := by + obtain ⟨ζ, hζ⟩ := hmu + exact ⟨algebraMap F C ζ, + (mem_primitiveRoots n.pos).2 + (((mem_primitiveRoots n.pos).1 hζ).map_of_injective + (algebraMap F C).injective)⟩ + exact hilbertPairingOfRingEquiv + (relativeFinitePlaceCompletionAlgEquiv v).toRingEquiv n hmuC + (localHilbertPairing C n hnC hmuC) + +/-- Every finite member of the transported family satisfies the local +Steinberg, skew-symmetry, nondegeneracy, and Kummer norm-residue laws. -/ +theorem finitePlaceAdicHilbertPairingFamily_isLocallyHilbert + (F : Type) [Field F] [NumberField F] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) F).Nonempty) : + GlobalHilbertPairingFamily.IsLocallyHilbert F + (finitePlaceAdicHilbertPairingFamily F n hmu) := by + intro v + let C := (HeightOneSpectrum.adicAbv F v).Completion + exact + letI : ValuativeRel C := + GlobalClassFieldTheory.Reciprocity.finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + GlobalClassFieldTheory.Reciprocity.finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + letI : CharZero C := + charZero_of_injective_algebraMap (algebraMap F C).injective + have hnC : ((n : ℕ) : C) ≠ 0 := Nat.cast_ne_zero.mpr n.ne_zero + have hmuC : (primitiveRoots (n : ℕ) C).Nonempty := by + obtain ⟨ζ, hζ⟩ := hmu + exact ⟨algebraMap F C ζ, + (mem_primitiveRoots n.pos).2 + (((mem_primitiveRoots n.pos).1 hζ).map_of_injective + (algebraMap F C).injective)⟩ + show HilbertPairing.IsLocalHilbertPairing (hilbertPairingOfRingEquiv + (relativeFinitePlaceCompletionAlgEquiv v).toRingEquiv n hmuC + (localHilbertPairing C n hnC hmuC)) from + hilbertPairingOfRingEquiv_isLocalHilbertPairing + (relativeFinitePlaceCompletionAlgEquiv v).toRingEquiv n hmuC + (localHilbertPairing C n hnC hmuC) + (localHilbertPairing_isLocalHilbertPairing C n hnC hmuC) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin.lean new file mode 100644 index 0000000000..67716591da --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin.lean @@ -0,0 +1,19 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Conjugation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.CrossLocalRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.NormRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.TowerRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.UnramifiedNormalization + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/All.lean new file mode 100644 index 0000000000..e46ef666fa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/All.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Conjugation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.CrossLocalRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.NormRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.TowerRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.UnramifiedNormalization + +/-! # All -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Conjugation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Conjugation.lean new file mode 100644 index 0000000000..52425a9882 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Conjugation.lean @@ -0,0 +1,578 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality +/-! +# Conjugation of finite-place Artin homomorphisms + +This module identifies localized completions associated with conjugate extensions and proves + conjugation invariance of the resulting finite-place Artin map. +-/ + +@[expose] public section + +open scoped IsMulCommutative NNReal NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory + +variable {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + +open scoped Classical in +/-- The algebraic localizations belonging to conjugate extensions of a +finite place are identified by the induced equivalence of completions. -/ +noncomputable def finitePlaceConjugateLocalizedCompletionAlgEquiv + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (g : L ≃ₐ[K] L) : + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let wc := absoluteValueExtensionConjugate vK w g + let Ew := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let Ewc := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wc + letI : Algebra vK.Completion Ew := + finitePlaceLocalArtinLocalizedAlgebra v w + letI : Algebra vK.Completion Ewc := + finitePlaceLocalArtinLocalizedAlgebra v wc + Ewc ≃ₐ[vK.Completion] Ew := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let wc := absoluteValueExtensionConjugate vK w g + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + letI hwK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + letI : SMul K w.1.Completion := hwK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI hwcK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) wc.1 + letI : SMul K wc.1.Completion := hwcK.toSMul + letI : Algebra vK.Completion wc.1.Completion := + AbsoluteValue.completionAlgebra vK wc.1 wc.2 + let Ew := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let Ewc := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wc + let eCompletion : wc.1.Completion ≃ₐ[vK.Completion] + w.1.Completion := + { LocalClassFieldTheory.conjugateExtensionCompletionRingEquiv + vK w g with + commutes' := + LocalClassFieldTheory.conjugateExtensionCompletionRingEquiv_algebraMap + vK w g } + let e : Ewc ≃ₐ[vK.Completion] Ew := + (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + vK hvK wc).trans + (eCompletion.trans + (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + vK hvK w).symm) + exact e + +omit [IsAbelianGalois K L] in +open scoped Classical in +/-- The conjugate-localization equivalence carries the canonical +embedding of `L` to the conjugate of that embedding. -/ +theorem finitePlaceConjugateLocalizedCompletionAlgEquiv_toAlgebraicLocalization + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (g : L ≃ₐ[K] L) (x : L) : + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let wc := absoluteValueExtensionConjugate vK w g + let Ew := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let Ewc := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wc + letI : Algebra vK.Completion Ew := + finitePlaceLocalArtinLocalizedAlgebra v w + letI : Algebra vK.Completion Ewc := + finitePlaceLocalArtinLocalizedAlgebra v wc + finitePlaceConjugateLocalizedCompletionAlgEquiv + (K := K) (L := L) v w g + (AbsoluteValue.toAlgebraicLocalization + vK wc.1 wc.2 x) = + AbsoluteValue.toAlgebraicLocalization + vK w.1 w.2 (g x) := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let wc := absoluteValueExtensionConjugate vK w g + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let hwK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hwK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let hwcK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) wc.1 + let : SMul K wc.1.Completion := hwcK.toSMul + let : Algebra vK.Completion wc.1.Completion := + AbsoluteValue.completionAlgebra vK wc.1 wc.2 + apply + (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + vK hvK w).injective + change + LocalClassFieldTheory.conjugateExtensionCompletionRingEquiv + vK w g + (AbsoluteValue.toCompletion wc.1 x) = + AbsoluteValue.toCompletion w.1 (g x) + exact + LocalClassFieldTheory.conjugateExtensionCompletionRingEquiv_toCompletion + vK w g x + +omit [IsAbelianGalois K L] in +open scoped Classical in +/-- The inverse conjugate-localization equivalence carries the +canonical embedding back along the inverse global automorphism. -/ +theorem + finitePlaceConjugateLocalizedCompletionAlgEquiv_symm_toAlgebraicLocalization + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (g : L ≃ₐ[K] L) (x : L) : + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let wc := absoluteValueExtensionConjugate vK w g + let Ew := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let Ewc := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wc + letI : Algebra vK.Completion Ew := + finitePlaceLocalArtinLocalizedAlgebra v w + letI : Algebra vK.Completion Ewc := + finitePlaceLocalArtinLocalizedAlgebra v wc + (finitePlaceConjugateLocalizedCompletionAlgEquiv + (K := K) (L := L) v w g).symm + (AbsoluteValue.toAlgebraicLocalization + vK w.1 w.2 x) = + AbsoluteValue.toAlgebraicLocalization + vK wc.1 wc.2 (g.symm x) := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let wc := absoluteValueExtensionConjugate vK w g + let hwK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hwK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let hwcK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) wc.1 + let : SMul K wc.1.Completion := hwcK.toSMul + let : Algebra vK.Completion wc.1.Completion := + AbsoluteValue.completionAlgebra vK wc.1 wc.2 + let e := + finitePlaceConjugateLocalizedCompletionAlgEquiv + (K := K) (L := L) v w g + apply e.injective + rw [e.apply_symm_apply, + finitePlaceConjugateLocalizedCompletionAlgEquiv_toAlgebraicLocalization, + g.apply_symm_apply] + +open scoped Classical in +/-- Conjugation of a place intertwines the two localization +decomposition-group identifications on each local automorphism. -/ +theorem finitePlaceDecompositionTransport_conjugate_apply + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (g : L ≃ₐ[K] L) : + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let wc := absoluteValueExtensionConjugate vK w g + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let Ew := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let Ewc := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wc + letI : Algebra vK.Completion Ew := + finitePlaceLocalArtinLocalizedAlgebra v w + letI : Algebra vK.Completion Ewc := + finitePlaceLocalArtinLocalizedAlgebra v wc + let e := + finitePlaceConjugateLocalizedCompletionAlgEquiv + (K := K) (L := L) v w g + let eDw : + absoluteValueDecompositionGroup K w.1 ≃* + (Ew ≃ₐ[vK.Completion] Ew) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w + let eDwc : + absoluteValueDecompositionGroup K wc.1 ≃* + (Ewc ≃ₐ[vK.Completion] Ewc) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK wc + ∀ tauC : Ewc ≃ₐ[vK.Completion] Ewc, + (absoluteValueDecompositionGroup K wc.1).subtype + (eDwc.symm tauC) = + (absoluteValueDecompositionGroup K w.1).subtype + (eDw.symm (AlgEquiv.autCongr e tauC)) := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let wc := absoluteValueExtensionConjugate vK w g + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let hwK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hwK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let hwcK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) wc.1 + let : SMul K wc.1.Completion := hwcK.toSMul + let : Algebra vK.Completion wc.1.Completion := + AbsoluteValue.completionAlgebra vK wc.1 wc.2 + let Ew := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let Ewc := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wc + let e := + finitePlaceConjugateLocalizedCompletionAlgEquiv + (K := K) (L := L) v w g + let eDw : + absoluteValueDecompositionGroup K w.1 ≃* + (Ew ≃ₐ[vK.Completion] Ew) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w + let eDwc : + absoluteValueDecompositionGroup K wc.1 ≃* + (Ewc ≃ₐ[vK.Completion] Ewc) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK wc + change + ∀ tauC : Ewc ≃ₐ[vK.Completion] Ewc, + (absoluteValueDecompositionGroup K wc.1).subtype + (eDwc.symm tauC) = + (absoluteValueDecompositionGroup K w.1).subtype + (eDw.symm (AlgEquiv.autCongr e tauC)) + intro tauC + let tau := AlgEquiv.autCongr e tauC + let rhoC : absoluteValueDecompositionGroup K wc.1 := + eDwc.symm tauC + let rho : absoluteValueDecompositionGroup K w.1 := + eDw.symm tau + change (rhoC.1 : L ≃ₐ[K] L) = + (rho.1 : L ≃ₐ[K] L) + apply AlgEquiv.ext + intro z + apply + (AbsoluteValue.toAlgebraicLocalization + vK w.1 w.2).injective + have hcomm : + g ((rhoC.1 : L ≃ₐ[K] L) (g.symm z)) = + (rhoC.1 : L ≃ₐ[K] L) z := by + have hg : + g * (rhoC.1 : L ≃ₐ[K] L) = + (rhoC.1 : L ≃ₐ[K] L) * g := + (inferInstance : + IsMulCommutative (L ≃ₐ[K] L)).is_comm.comm _ _ + calc + g ((rhoC.1 : L ≃ₐ[K] L) (g.symm z)) = + (g * (rhoC.1 : L ≃ₐ[K] L)) (g.symm z) := rfl + _ = ((rhoC.1 : L ≃ₐ[K] L) * g) (g.symm z) := + DFunLike.congr_fun hg (g.symm z) + _ = (rhoC.1 : L ≃ₐ[K] L) (g (g.symm z)) := rfl + _ = (rhoC.1 : L ≃ₐ[K] L) z := by + rw [g.apply_symm_apply] + calc + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + ((rhoC.1 : L ≃ₐ[K] L) z) = + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + (g ((rhoC.1 : L ≃ₐ[K] L) (g.symm z))) := by + rw [hcomm] + _ = e + (AbsoluteValue.toAlgebraicLocalization vK wc.1 wc.2 + ((rhoC.1 : L ≃ₐ[K] L) (g.symm z))) := by + rw [ + finitePlaceConjugateLocalizedCompletionAlgEquiv_toAlgebraicLocalization] + _ = e + (eDwc rhoC + (AbsoluteValue.toAlgebraicLocalization + vK wc.1 wc.2 (g.symm z))) := by + rw [localizationRamificationGroups_decompositionGroupEquiv_toLocalization] + _ = e + (tauC + (AbsoluteValue.toAlgebraicLocalization + vK wc.1 wc.2 (g.symm z))) := by + rw [eDwc.apply_symm_apply] + _ = (AlgEquiv.autCongr e tauC) + (AbsoluteValue.toAlgebraicLocalization + vK w.1 w.2 z) := by + change + e + (tauC + (AbsoluteValue.toAlgebraicLocalization + vK wc.1 wc.2 (g.symm z))) = + e + (tauC + (e.symm + (AbsoluteValue.toAlgebraicLocalization + vK w.1 w.2 z))) + rw [ + finitePlaceConjugateLocalizedCompletionAlgEquiv_symm_toAlgebraicLocalization] + _ = tau + (AbsoluteValue.toAlgebraicLocalization + vK w.1 w.2 z) := by + rfl + _ = eDw rho + (AbsoluteValue.toAlgebraicLocalization + vK w.1 w.2 z) := by + rw [eDw.apply_symm_apply] + _ = AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + ((rho.1 : L ≃ₐ[K] L) z) := by + rw [localizationRamificationGroups_decompositionGroupEquiv_toLocalization] + +open scoped Classical in +/-- Conjugation of a place intertwines the two localization +decomposition-group identifications after inclusion in the global +Galois group. -/ +theorem finitePlaceDecompositionTransport_conjugate + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (g : L ≃ₐ[K] L) : + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let wc := absoluteValueExtensionConjugate vK w g + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let Ew := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let Ewc := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wc + letI : Algebra vK.Completion Ew := + finitePlaceLocalArtinLocalizedAlgebra v w + letI : Algebra vK.Completion Ewc := + finitePlaceLocalArtinLocalizedAlgebra v wc + let e := + finitePlaceConjugateLocalizedCompletionAlgEquiv + (K := K) (L := L) v w g + let eDw : + absoluteValueDecompositionGroup K w.1 ≃* + (Ew ≃ₐ[vK.Completion] Ew) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w + let eDwc : + absoluteValueDecompositionGroup K wc.1 ≃* + (Ewc ≃ₐ[vK.Completion] Ewc) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK wc + (absoluteValueDecompositionGroup K wc.1).subtype.comp + eDwc.symm.toMonoidHom = + ((absoluteValueDecompositionGroup K w.1).subtype.comp + eDw.symm.toMonoidHom).comp + (AlgEquiv.autCongr e).toMonoidHom := by + apply MonoidHom.ext + intro tauC + exact + finitePlaceDecompositionTransport_conjugate_apply + (K := K) (L := L) v w g tauC + +open scoped Classical in +/-- Local Artin maps are natural under the localized-completion +equivalence induced by conjugating a finite-place extension. -/ +theorem finitePlaceLocalArtinMonoidHom_conjugate + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (g : L ≃ₐ[K] L) : + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let wc := absoluteValueExtensionConjugate vK w g + let Ew := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let Ewc := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wc + letI : Algebra vK.Completion Ew := + finitePlaceLocalArtinLocalizedAlgebra v w + letI : Algebra vK.Completion Ewc := + finitePlaceLocalArtinLocalizedAlgebra v wc + let e := + finitePlaceConjugateLocalizedCompletionAlgEquiv + (K := K) (L := L) v w g + (AlgEquiv.autCongr e).toMonoidHom.comp + (finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v wc) = + finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v w := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let wc := absoluteValueExtensionConjugate vK w g + let Ew := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let Ewc := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wc + let : Algebra vK.Completion Ew := + finitePlaceLocalArtinLocalizedAlgebra v w + let : Algebra vK.Completion Ewc := + finitePlaceLocalArtinLocalizedAlgebra v wc + let : FiniteDimensional vK.Completion Ew := + finitePlaceLocalArtinFiniteDimensional v w + let : FiniteDimensional vK.Completion Ewc := + finitePlaceLocalArtinFiniteDimensional v wc + let : IsAbelianGalois vK.Completion Ew := + finitePlaceLocalArtinIsAbelianGalois v w + (inferInstance : FiniteDimensional K L) + let : IsAbelianGalois vK.Completion Ewc := + finitePlaceLocalArtinIsAbelianGalois v wc + (inferInstance : FiniteDimensional K L) + let : ValuativeRel vK.Completion := + finitePlaceLocalArtinCompletionValuativeRel v + let : IsNonarchimedeanLocalField vK.Completion := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + let e := + finitePlaceConjugateLocalizedCompletionAlgEquiv + (K := K) (L := L) v w g + let eK : + vK.Completionˣ ≃* (v.adicCompletion K)ˣ := + finitePlaceCompletionUnitsContinuousMulEquiv v + change + (AlgEquiv.autCongr e).toMonoidHom.comp + ((LocalClassFieldTheory.abelianLocalArtinMonoidHom + vK.Completion Ewc).comp eK.symm.toMonoidHom) = + (LocalClassFieldTheory.abelianLocalArtinMonoidHom + vK.Completion Ew).comp eK.symm.toMonoidHom + exact + congrArg (fun f => f.comp eK.symm.toMonoidHom) + (LocalClassFieldTheory.abelianLocalArtinMonoidHom_autCongr + vK.Completion Ewc Ew e) + +open scoped Classical in +/-- Conjugating the chosen extension of a finite place does not change +its Artin homomorphism when the global extension is abelian. -/ +theorem finitePlaceArtinMonoidHomOfExtension_conjugate + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (g : L ≃ₐ[K] L) : + finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v + (absoluteValueExtensionConjugate + (NumberField.HeightOneSpectrum.adicAbv K v) w g) = + finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v w := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let wc := absoluteValueExtensionConjugate vK w g + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let hwK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hwK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let hwcK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) wc.1 + let : SMul K wc.1.Completion := hwcK.toSMul + let : Algebra vK.Completion wc.1.Completion := + AbsoluteValue.completionAlgebra vK wc.1 wc.2 + let Ew := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let Ewc := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wc + let e := + finitePlaceConjugateLocalizedCompletionAlgEquiv + (K := K) (L := L) v w g + let eDw : + absoluteValueDecompositionGroup K w.1 ≃* + (Ew ≃ₐ[vK.Completion] Ew) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w + let eDwc : + absoluteValueDecompositionGroup K wc.1 ≃* + (Ewc ≃ₐ[vK.Completion] Ewc) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK wc + have htransport := + finitePlaceDecompositionTransport_conjugate + (K := K) (L := L) v w g + have hlocal := + finitePlaceLocalArtinMonoidHom_conjugate + (K := K) (L := L) v w g + change + ((absoluteValueDecompositionGroup K wc.1).subtype.comp + eDwc.symm.toMonoidHom).comp + (finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v wc) = + ((absoluteValueDecompositionGroup K w.1).subtype.comp + eDw.symm.toMonoidHom).comp + (finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v w) + calc + _ = + (((absoluteValueDecompositionGroup K w.1).subtype.comp + eDw.symm.toMonoidHom).comp + (AlgEquiv.autCongr e).toMonoidHom).comp + (finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v wc) := + congrArg + (fun f => f.comp + (finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v wc)) + htransport + _ = + ((absoluteValueDecompositionGroup K w.1).subtype.comp + eDw.symm.toMonoidHom).comp + ((AlgEquiv.autCongr e).toMonoidHom.comp + (finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v wc)) := by + rfl + _ = _ := by rw [hlocal] + +open scoped Classical in +/-- The finite-place Artin homomorphism is independent of the chosen +extension of the base place in an abelian extension. -/ +theorem finitePlaceArtinMonoidHomOfExtension_eq + (v : HeightOneSpectrum (𝓞 K)) + (w w' : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) : + finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v w = + finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v w' := by + let : NumberField L := NumberField.of_module_finite K L + let W := + finitePlaceExtensionCentre + (K := K) (L := L) v w + let W' := + finitePlaceExtensionCentre + (K := K) (L := L) v w' + let : Finite (L ≃ₐ[K] L) := + IsGaloisGroup.finite (L ≃ₐ[K] L) K L + let : + IsGaloisGroup (L ≃ₐ[K] L) (𝓞 K) (𝓞 L) := + IsGaloisGroup.of_isFractionRing + (L ≃ₐ[K] L) (𝓞 K) (𝓞 L) K L + let : W.asIdeal.LiesOver v.asIdeal := + ⟨(finitePlaceExtensionCentreIdeal_under + (K := K) (L := L) v w).symm⟩ + let : W'.asIdeal.LiesOver v.asIdeal := + ⟨(finitePlaceExtensionCentreIdeal_under + (K := K) (L := L) v w').symm⟩ + obtain ⟨g, hg⟩ := + HilbertRamification.Dedekind.exists_smul_eq_of_isGaloisGroup + v.asIdeal W.asIdeal W'.asIdeal (L ≃ₐ[K] L) + have hplace : + finitePlaceEquiv K L g W = W' := by + apply HeightOneSpectrum.ext + rw [finitePlaceEquiv_asIdeal] + exact hg + have hconjugate : + absoluteValueExtensionConjugate + (NumberField.HeightOneSpectrum.adicAbv K v) + w g⁻¹ = + w' := by + apply + finitePlaceExtensionCentre_injective + (K := K) (L := L) v + rw [finitePlaceExtensionCentre_conjugate] + simpa only [inv_inv, W, W'] using hplace + rw [← hconjugate] + exact + (finitePlaceArtinMonoidHomOfExtension_conjugate + (K := K) (L := L) v w g⁻¹).symm + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Construction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Construction.lean new file mode 100644 index 0000000000..187edf0caa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Construction.lean @@ -0,0 +1,829 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.Comparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue +/-! +# Construction of finite-place Artin homomorphisms + +This module constructs the local Artin map for a chosen extension of a finite place and + transports it through the actual decomposition group into the global Galois group. +-/ + +@[expose] public section + +open scoped IsMulCommutative NNReal NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory + +variable {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [hKLfinite : FiniteDimensional K L] [IsAbelianGalois K L] + +open scoped Classical in +/-- A completion attached to a nonarchimedean absolute value has an ultrametric distance. -/ +theorem finitePlaceArtinCompletionIsUltrametricDist + {F : Type} [Field F] + (vF : AbsoluteValue F ℝ) + (hvF : IsNonarchimedean (vF : F → ℝ)) : + IsUltrametricDist vF.Completion := + IsUltrametricDist.isUltrametricDist_of_isNonarchimedean_norm + (AbsoluteValue.completionAbsoluteValue_isNonarchimedean + vF hvF) + +open scoped Classical in +/-- The valued-field structure on a finite-place completion induced by its nonarchimedean norm. -/ +@[reducible] +noncomputable def finitePlaceArtinCompletionValued + {F : Type} [Field F] + (vF : AbsoluteValue F ℝ) + (hvF : IsNonarchimedean (vF : F → ℝ)) : + Valued vF.Completion ℝ≥0 := + letI : IsUltrametricDist vF.Completion := + finitePlaceArtinCompletionIsUltrametricDist vF hvF + NormedField.toValued + +open scoped Classical in +/-- The valuation relation on a finite-place completion induced by its canonical valuation. -/ +@[reducible] +noncomputable def finitePlaceArtinCompletionValuativeRel + {F : Type} [Field F] + (vF : AbsoluteValue F ℝ) + (hvF : IsNonarchimedean (vF : F → ℝ)) : + ValuativeRel vF.Completion := by + letI : Valued vF.Completion ℝ≥0 := + finitePlaceArtinCompletionValued vF hvF + exact ValuativeRel.ofValuation + (Valued.v : Valuation vF.Completion ℝ≥0) + +open scoped Classical in +/-- The canonical valued structure makes a locally compact finite-place completion a +nonarchimedean local field. -/ +theorem + finitePlaceArtinCompletionIsNonarchimedeanLocalField + {F : Type} [Field F] + (vF : AbsoluteValue F ℝ) + (hvF : IsNonarchimedean (vF : F → ℝ)) + [IsUltrametricDist vF.Completion] + [(NormedField.valuation + (K := vF.Completion)).IsNontrivial] + [LocallyCompactSpace vF.Completion] : + letI : Valued vF.Completion ℝ≥0 := + finitePlaceArtinCompletionValued vF hvF + letI : ValuativeRel vF.Completion := + finitePlaceArtinCompletionValuativeRel vF hvF + IsNonarchimedeanLocalField vF.Completion := by + let : Valued vF.Completion ℝ≥0 := + finitePlaceArtinCompletionValued vF hvF + let vC : Valuation vF.Completion ℝ≥0 := Valued.v + let : vC.IsNontrivial := + (inferInstance : + (NormedField.valuation + (K := vF.Completion)).IsNontrivial) + let : ValuativeRel vF.Completion := + finitePlaceArtinCompletionValuativeRel vF hvF + let : vC.Compatible := + Valuation.Compatible.ofValuation vC + let : ValuativeRel.IsNontrivial vF.Completion := + (ValuativeRel.isNontrivial_iff_isNontrivial vC).2 + inferInstance + let : IsValuativeTopology vF.Completion := + isValuativeTopology_of_valued_ofValuation + vF.Completion ℝ≥0 + exact + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + +open scoped Classical in +/-- The concrete finite-completion ring equivalence agrees with the +relative-completion algebra equivalence on underlying rings. -/ +theorem finitePlaceCompletionRingEquiv_eq_relative + {F : Type} [Field F] [NumberField F] + (v : HeightOneSpectrum (𝓞 F)) : + finitePlaceCompletionRingEquiv v = + (relativeFinitePlaceCompletionAlgEquiv v).toRingEquiv := by + apply RingEquiv.ext + intro x + change + finitePlaceCompletionRingHom v x = + relativeFinitePlaceCompletionRingHom v x + refine UniformSpace.Completion.induction_on + (α := WithAbs + (NumberField.HeightOneSpectrum.adicAbv F v)) x ?_ ?_ + · exact isClosed_eq + (finitePlaceCompletionRingHom_isometry v).continuous + (relativeFinitePlaceCompletionRingHom_isometry v).continuous + · intro a + rw [finitePlaceCompletionRingHom_coe, + relativeFinitePlaceCompletionRingHom_coe] + rfl + +open scoped Classical in +/-- The finite-place Artin homomorphism associated with a specified +extension of the base adic absolute value to the global extension. -/ +noncomputable def finitePlaceArtinMonoidHomOfExtension + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) : + (v.adicCompletion K)ˣ →* (L ≃ₐ[K] L) := by + let vK := + NumberField.HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + letI hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := + LocalClassFieldTheory.localizedCompletionGlobalAlgebra vK w + letI := + LocalClassFieldTheory.localizedCompletionIsScalarTower vK w + let E := + AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + letI : FiniteDimensional vK.Completion E := + AlgebraicNumberTheory.Valuations.localizedCompletionModuleFinite vK hvK w + letI : IsAbelianGalois vK.Completion E := + LocalClassFieldTheory.localizedCompletion_isAbelianGalois + vK hvK w + letI : NontriviallyNormedField vK.Completion := + absoluteValueExtensionCompletionNontriviallyNormedField + vK hvK + letI : LocallyCompactSpace vK.Completion := + AbsoluteValue.Completion.locallyCompactSpace + (finitePlaceCompletionBaseMap_isometry v) + let hvKna : IsNonarchimedean (vK : K → ℝ) := + NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K v + letI : IsUltrametricDist vK.Completion := + finitePlaceArtinCompletionIsUltrametricDist vK hvKna + letI : Valued vK.Completion ℝ≥0 := + finitePlaceArtinCompletionValued vK hvKna + let vC : Valuation vK.Completion ℝ≥0 := + Valued.v + letI : vC.IsNontrivial := + (inferInstance : + (NormedField.valuation + (K := vK.Completion)).IsNontrivial) + letI : ValuativeRel vK.Completion := + finitePlaceArtinCompletionValuativeRel vK hvKna + letI : vC.Compatible := + Valuation.Compatible.ofValuation vC + letI : ValuativeRel.IsNontrivial vK.Completion := + (ValuativeRel.isNontrivial_iff_isNontrivial vC).2 + inferInstance + letI : IsValuativeTopology vK.Completion := + isValuativeTopology_of_valued_ofValuation + vK.Completion ℝ≥0 + letI : IsNonarchimedeanLocalField vK.Completion := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + let eD : + absoluteValueDecompositionGroup K w.1 ≃* + (E ≃ₐ[vK.Completion] E) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w + let eK : + vK.Completionˣ ≃* (v.adicCompletion K)ˣ := + finitePlaceCompletionUnitsContinuousMulEquiv v + exact + (absoluteValueDecompositionGroup K w.1).subtype.comp + (eD.symm.toMonoidHom.comp + ((LocalClassFieldTheory.abelianLocalArtinMonoidHom + vK.Completion E).comp eK.symm.toMonoidHom)) + +open scoped Classical in +/-- Pointwise formula for the finite-place Artin homomorphism attached +to a specified extension of the base absolute value. -/ +theorem finitePlaceArtinMonoidHomOfExtension_apply + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (x : (v.adicCompletion K)ˣ) : + let vK := + NumberField.HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + letI hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := + LocalClassFieldTheory.localizedCompletionGlobalAlgebra vK w + letI := + LocalClassFieldTheory.localizedCompletionIsScalarTower vK w + let E := + AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + letI : FiniteDimensional vK.Completion E := + AlgebraicNumberTheory.Valuations.localizedCompletionModuleFinite vK hvK w + letI : IsAbelianGalois vK.Completion E := + LocalClassFieldTheory.localizedCompletion_isAbelianGalois + vK hvK w + letI : NontriviallyNormedField vK.Completion := + absoluteValueExtensionCompletionNontriviallyNormedField + vK hvK + letI : LocallyCompactSpace vK.Completion := + AbsoluteValue.Completion.locallyCompactSpace + (finitePlaceCompletionBaseMap_isometry v) + letI : IsUltrametricDist vK.Completion := + IsUltrametricDist.isUltrametricDist_of_isNonarchimedean_norm + (AbsoluteValue.completionAbsoluteValue_isNonarchimedean + vK + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv + K v)) + letI : Valued vK.Completion ℝ≥0 := + NormedField.toValued + let vC : Valuation vK.Completion ℝ≥0 := + Valued.v + letI : vC.IsNontrivial := + (inferInstance : + (NormedField.valuation + (K := vK.Completion)).IsNontrivial) + letI : ValuativeRel vK.Completion := + ValuativeRel.ofValuation vC + letI : vC.Compatible := + Valuation.Compatible.ofValuation vC + letI : ValuativeRel.IsNontrivial vK.Completion := + (ValuativeRel.isNontrivial_iff_isNontrivial vC).2 + inferInstance + letI : IsValuativeTopology vK.Completion := + isValuativeTopology_of_valued_ofValuation + vK.Completion ℝ≥0 + letI : IsNonarchimedeanLocalField vK.Completion := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + let eD : + absoluteValueDecompositionGroup K w.1 ≃* + (E ≃ₐ[vK.Completion] E) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w + let eK : + vK.Completionˣ ≃* (v.adicCompletion K)ˣ := + finitePlaceCompletionUnitsContinuousMulEquiv v + finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v w x = + (absoluteValueDecompositionGroup K w.1).subtype + (eD.symm + (LocalClassFieldTheory.abelianLocalArtinMonoidHom + vK.Completion E (eK.symm x))) := by + rfl + +open scoped Classical in +/-- The canonical completion input used by the finite-place local Artin map. -/ +noncomputable def finitePlaceLocalArtinInputMonoidHom + (v : HeightOneSpectrum (𝓞 K)) : + (v.adicCompletion K)ˣ →* + (NumberField.HeightOneSpectrum.adicAbv K v).Completionˣ := + (finitePlaceCompletionUnitsContinuousMulEquiv v).symm.toMonoidHom + +open scoped Classical in +/-- Evaluation of the canonical completion input for the finite-place local +Artin map. -/ +noncomputable def finitePlaceLocalArtinInput + (v : HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) : + (NumberField.HeightOneSpectrum.adicAbv K v).Completionˣ := + finitePlaceLocalArtinInputMonoidHom v x + +open scoped Classical in +/-- The canonical valuation relation used on a finite-place completion by +the local Artin construction. -/ +@[reducible] +noncomputable def finitePlaceLocalArtinCompletionValuativeRel + (v : HeightOneSpectrum (𝓞 K)) : + ValuativeRel + (NumberField.HeightOneSpectrum.adicAbv K v).Completion := + finitePlaceArtinCompletionValuativeRel + (NumberField.HeightOneSpectrum.adicAbv K v) + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K v) + +open scoped Classical in +/-- The canonical nonarchimedean-local-field certificate used on a +finite-place completion by the local Artin construction. -/ +theorem + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField + (v : HeightOneSpectrum (𝓞 K)) : + @IsNonarchimedeanLocalField + (NumberField.HeightOneSpectrum.adicAbv K v).Completion + (inferInstance : Field + (NumberField.HeightOneSpectrum.adicAbv K v).Completion) + (finitePlaceLocalArtinCompletionValuativeRel v) + (inferInstance : TopologicalSpace + (NumberField.HeightOneSpectrum.adicAbv K v).Completion) := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let : NontriviallyNormedField vK.Completion := + absoluteValueExtensionCompletionNontriviallyNormedField + vK hvK + let : LocallyCompactSpace vK.Completion := + AbsoluteValue.Completion.locallyCompactSpace + (finitePlaceCompletionBaseMap_isometry v) + let hvKna : IsNonarchimedean (vK : K → ℝ) := + NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K v + let : IsUltrametricDist vK.Completion := + finitePlaceArtinCompletionIsUltrametricDist vK hvKna + let : Valued vK.Completion ℝ≥0 := + finitePlaceArtinCompletionValued vK hvKna + let : ValuativeRel vK.Completion := + finitePlaceLocalArtinCompletionValuativeRel v + exact + finitePlaceArtinCompletionIsNonarchimedeanLocalField + vK hvKna + +open scoped Classical in +/-- The local Artin input of a chosen order-one prime element has the +inverse-standard normalized local valuation. -/ +theorem finitePlaceLocalArtinInput_chosenLocalOrderSection_valuationMap + (v : HeightOneSpectrum (𝓞 K)) : + let C := (NumberField.HeightOneSpectrum.adicAbv K v).Completion + letI : ValuativeRel C := finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + IsNonarchimedeanLocalField.valuationMap C + (Additive.ofMul + (finitePlaceLocalArtinInput v + (FiniteIdeleGroup.chosenLocalOrderSection v 1))) = -1 := by + let C := (NumberField.HeightOneSpectrum.adicAbv K v).Completion + let a : (v.adicCompletion K)ˣ := + FiniteIdeleGroup.chosenLocalOrderSection v 1 + let x : Cˣ := finitePlaceLocalArtinInput v a + let : IsUltrametricDist C := + finitePlaceArtinCompletionIsUltrametricDist + (NumberField.HeightOneSpectrum.adicAbv K v) + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K v) + let : ValuativeRel C := finitePlaceLocalArtinCompletionValuativeRel v + let : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + let f := finitePlaceCompletionRingHom v + have hfx : f (x : C) = (a : v.adicCompletion K) := by + exact congrArg Units.val + ((finitePlaceCompletionUnitsContinuousMulEquiv v).apply_symm_apply a) + have hva : Valued.v (a : v.adicCompletion K) = + WithZero.exp (-1 : ℤ) := by + change Valued.v (Classical.choose + (HeightOneSpectrum.valuedAdicCompletion_surjective K v + (WithZero.exp (-1 : ℤ)))) = _ + exact Classical.choose_spec + (HeightOneSpectrum.valuedAdicCompletion_surjective K v + (WithZero.exp (-1 : ℤ))) + have horder (y z : C) : + ValuativeRel.valuation C y ≤ ValuativeRel.valuation C z ↔ + ‖y‖ ≤ ‖z‖ := by + change ValuativeRel.ValueGroupWithZero.mk y 1 ≤ + ValuativeRel.ValueGroupWithZero.mk z 1 ↔ _ + rw [ValuativeRel.ValueGroupWithZero.mk_le_mk] + simp only [Submonoid.coe_one, mul_one] + change NormedField.valuation y ≤ NormedField.valuation z ↔ _ + simp only [NormedField.valuation_apply, ← NNReal.coe_le_coe, coe_nnnorm] + have hlt (y z : C) : + ValuativeRel.valuation C y < ValuativeRel.valuation C z ↔ + ‖y‖ < ‖z‖ := by + rw [lt_iff_le_not_ge, lt_iff_le_not_ge] + exact and_congr (horder y z) (not_congr (horder z y)) + have hIntegerBound (η : WithZero (Multiplicative ℤ)) (hη : η < 1) : + η ≤ WithZero.exp (-1 : ℤ) := by + cases η using WithZero.recZeroCoe with + | zero => exact bot_le + | coe d => + change (d : WithZero (Multiplicative ℤ)) ≤ + ((Multiplicative.ofAdd (-1 : ℤ) : Multiplicative ℤ) : + WithZero (Multiplicative ℤ)) + rw [WithZero.coe_le_coe] + rw [← Multiplicative.toAdd_le] + change Multiplicative.toAdd d ≤ (-1 : ℤ) + have hd : Multiplicative.toAdd d < 0 := by + have hd' : d < (1 : Multiplicative ℤ) := by + simpa using hη + exact Multiplicative.toAdd_lt.mp hd' + omega + have hNormInput : ‖(x : C)‖ = ‖(a : v.adicCompletion K)‖ := by + rw [← hfx] + exact ((finitePlaceCompletionRingHom_isometry v).norm_map_of_map_zero + (map_zero f) (x : C)).symm + have hMax : ∀ δ : ValuativeRel.ValueGroupWithZero C, + δ < 1 → δ ≤ ValuativeRel.valuation C (x : C) := by + intro δ hδ + obtain ⟨y, rfl⟩ := ValuativeRel.valuation_surjective δ + have hyNorm : ‖y‖ < 1 := by + simpa only [norm_one] using (hlt y 1).mp (by simpa using hδ) + have hyConcrete : ‖f y‖ < 1 := by + rw [(finitePlaceCompletionRingHom_isometry v).norm_map_of_map_zero + (map_zero f) y] + exact hyNorm + let q : ℝ≥0 := v.asIdeal.absNorm + have hq : 1 < q := HeightOneSpectrum.one_lt_absNorm_nnreal v + have hyVal : Valued.v (f y) < + (1 : WithZero (Multiplicative ℤ)) := by + apply (WithZeroMulInt.toNNReal_lt_one_iff hq).mp + exact NNReal.coe_lt_coe.mp (by + simpa only [FinitePlace.norm_def, NNReal.coe_one] using hyConcrete) + have hyLe := hIntegerBound (Valued.v (f y)) hyVal + have hyNormLe : ‖f y‖ ≤ ‖(a : v.adicCompletion K)‖ := by + rw [FinitePlace.norm_def, FinitePlace.norm_def, hva] + exact NNReal.coe_le_coe.mpr + ((WithZeroMulInt.toNNReal_strictMono hq).monotone hyLe) + apply (horder y (x : C)).mpr + rw [hNormInput] + rw [← (finitePlaceCompletionRingHom_isometry v).norm_map_of_map_zero + (map_zero f) y] + exact hyNormLe + let φ := _root_.IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt C + have hφlt : φ (ValuativeRel.valuation C (x : C)) < 1 := by + have hval : WithZero.exp (-1 : ℤ) < + (1 : WithZero (Multiplicative ℤ)) := by + rw [WithZero.exp_eq_coe_ofAdd, ← WithZero.coe_one, + WithZero.coe_lt_coe] + change (Multiplicative.ofAdd (-1 : ℤ) : Multiplicative ℤ) < 1 + change (-1 : ℤ) < 0 + omega + have hnorm : ‖(x : C)‖ < 1 := by + rw [hNormInput, FinitePlace.norm_def, hva] + exact_mod_cast + (WithZeroMulInt.toNNReal_lt_one_iff + (HeightOneSpectrum.one_lt_absNorm_nnreal v)).mpr hval + have hv : ValuativeRel.valuation C (x : C) < 1 := by + exact (hlt (x : C) 1).mpr (by simpa only [norm_one] using hnorm) + simpa only [map_one] using φ.strictMono hv + have hφmax : ∀ η : WithZero (Multiplicative ℤ), + η < 1 → η ≤ φ (ValuativeRel.valuation C (x : C)) := by + intro η hη + let δ := φ.symm η + have hδ : δ < 1 := by + simpa only [map_one] using φ.symm.strictMono hη + have h := φ.strictMono.monotone (hMax δ hδ) + change φ (φ.symm η) ≤ _ at h + simpa only [φ.apply_symm_apply] using h + have hφeq : φ (ValuativeRel.valuation C (x : C)) = + WithZero.exp (-1 : ℤ) := by + apply le_antisymm + · exact hIntegerBound _ hφlt + · apply hφmax + rw [WithZero.exp_eq_coe_ofAdd, ← WithZero.coe_one, + WithZero.coe_lt_coe] + change (Multiplicative.ofAdd (-1 : ℤ) : Multiplicative ℤ) < 1 + change (-1 : ℤ) < 0 + omega + change IsNonarchimedeanLocalField.valuationMap C (Additive.ofMul x) = -1 + rw [IsNonarchimedeanLocalField.valuationMap_apply, + IsNonarchimedeanLocalField.v_apply] + change Multiplicative.toAdd + (WithZero.unzero + (x := φ (ValuativeRel.valuation C (x : C))) (by simp)) = -1 + rw [WithZero.toAdd_unzero_eq_log, hφeq, WithZero.log_exp] + +open scoped Classical in +/-- The canonical algebra structure on the localized completion used by the +finite-place local Artin map. -/ +@[reducible] +noncomputable def finitePlaceLocalArtinLocalizedAlgebra + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) : + let vK := NumberField.HeightOneSpectrum.adicAbv K v + Algebra vK.Completion + (AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w) := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + letI hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + exact inferInstance + +omit [IsAbelianGalois K L] in +open scoped Classical in +/-- The canonical finite-dimensional certificate for the localized +completion used by the finite-place local Artin map. -/ +theorem finitePlaceLocalArtinFiniteDimensional + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) : + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + letI : Algebra vK.Completion E := + finitePlaceLocalArtinLocalizedAlgebra v w + FiniteDimensional vK.Completion E := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let : Algebra vK.Completion E := + finitePlaceLocalArtinLocalizedAlgebra v w + exact + AlgebraicNumberTheory.Valuations.localizedCompletionModuleFinite + vK hvK w + +omit hKLfinite in +open scoped Classical in +/-- The canonical abelian-Galois certificate for the localized completion +used by the finite-place local Artin map. -/ +theorem finitePlaceLocalArtinIsAbelianGalois + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (_hKLfinite : FiniteDimensional K L) : + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + letI : Algebra vK.Completion E := + finitePlaceLocalArtinLocalizedAlgebra v w + IsAbelianGalois vK.Completion E := by + let : FiniteDimensional K L := _hKLfinite + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := + AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let : Algebra vK.Completion E := + finitePlaceLocalArtinLocalizedAlgebra v w + let : FiniteDimensional vK.Completion E := + finitePlaceLocalArtinFiniteDimensional + (hKLfinite := _hKLfinite) v w + exact + LocalClassFieldTheory.localizedCompletion_isAbelianGalois + vK hvK w + +open scoped Classical in +/-- The local Artin homomorphism on the algebraic localization attached to a chosen extension of +a finite place. -/ +noncomputable def finitePlaceLocalArtinMonoidHom + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) : + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + letI : Algebra vK.Completion E := + finitePlaceLocalArtinLocalizedAlgebra v w + (v.adicCompletion K)ˣ →* (E ≃ₐ[vK.Completion] E) := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + letI : Algebra vK.Completion E := + finitePlaceLocalArtinLocalizedAlgebra v w + letI : FiniteDimensional vK.Completion E := + finitePlaceLocalArtinFiniteDimensional v w + letI : IsAbelianGalois vK.Completion E := + finitePlaceLocalArtinIsAbelianGalois v w hKLfinite + letI : ValuativeRel vK.Completion := + finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField vK.Completion := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + exact + (LocalClassFieldTheory.abelianLocalArtinMonoidHom + vK.Completion E).comp + (finitePlaceLocalArtinInputMonoidHom v) + +open scoped Classical in +/-- Evaluation of the localized finite-place Artin homomorphism through the canonical completion +equivalence. -/ +theorem finitePlaceLocalArtinMonoidHom_apply + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (x : (v.adicCompletion K)ˣ) : + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + letI hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + letI : FiniteDimensional vK.Completion E := + AlgebraicNumberTheory.Valuations.localizedCompletionModuleFinite vK hvK w + letI : IsAbelianGalois vK.Completion E := + LocalClassFieldTheory.localizedCompletion_isAbelianGalois + vK hvK w + letI : NontriviallyNormedField vK.Completion := + absoluteValueExtensionCompletionNontriviallyNormedField + vK hvK + letI : LocallyCompactSpace vK.Completion := + AbsoluteValue.Completion.locallyCompactSpace + (finitePlaceCompletionBaseMap_isometry v) + let hvKna : IsNonarchimedean (vK : K → ℝ) := + NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K v + letI : IsUltrametricDist vK.Completion := + finitePlaceArtinCompletionIsUltrametricDist vK hvKna + letI : Valued vK.Completion ℝ≥0 := + finitePlaceArtinCompletionValued vK hvKna + letI : ValuativeRel vK.Completion := + finitePlaceArtinCompletionValuativeRel vK hvKna + letI : IsNonarchimedeanLocalField vK.Completion := + finitePlaceArtinCompletionIsNonarchimedeanLocalField + vK hvKna + let eK : + vK.Completionˣ ≃* (v.adicCompletion K)ˣ := + finitePlaceCompletionUnitsContinuousMulEquiv v + finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v w x = + LocalClassFieldTheory.abelianLocalArtinMonoidHom + vK.Completion E (eK.symm x) := by + rfl + +open scoped Classical in +/-- Evaluation of the localized finite-place Artin homomorphism with all +canonical completion data hidden behind named opaque terms. This is the +normalization API for clients that must not unfold the construction's +dependent instance tower. -/ +theorem finitePlaceLocalArtinMonoidHom_apply_normalized + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (x : (v.adicCompletion K)ˣ) : + finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v w x = + @LocalClassFieldTheory.abelianLocalArtinMonoidHom + (NumberField.HeightOneSpectrum.adicAbv K v).Completion + (AlgebraicNumberTheory.Valuations.LocalizedCompletion + (NumberField.HeightOneSpectrum.adicAbv K v) w) + (inferInstance : Field + (NumberField.HeightOneSpectrum.adicAbv K v).Completion) + (inferInstance : Field + (AlgebraicNumberTheory.Valuations.LocalizedCompletion + (NumberField.HeightOneSpectrum.adicAbv K v) w)) + (finitePlaceLocalArtinLocalizedAlgebra v w) + (finitePlaceLocalArtinCompletionValuativeRel v) + (inferInstance : TopologicalSpace + (NumberField.HeightOneSpectrum.adicAbv K v).Completion) + (finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v) + (finitePlaceLocalArtinFiniteDimensional v w) + (finitePlaceLocalArtinIsAbelianGalois v w hKLfinite) + (finitePlaceLocalArtinInput v x) := by + rfl + +open scoped Classical in +/-- Elementwise evaluation of the normalized localized finite-place Artin +map. This form lets clients transport an action without asking the +elaborator to rewrite an equality of automorphisms carrying a dependent +instance tower. -/ +theorem finitePlaceLocalArtinMonoidHom_apply_normalized_at + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (x : (v.adicCompletion K)ˣ) + (z : AlgebraicNumberTheory.Valuations.LocalizedCompletion + (NumberField.HeightOneSpectrum.adicAbv K v) w) : + finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v w x z = + (@LocalClassFieldTheory.abelianLocalArtinMonoidHom + (NumberField.HeightOneSpectrum.adicAbv K v).Completion + (AlgebraicNumberTheory.Valuations.LocalizedCompletion + (NumberField.HeightOneSpectrum.adicAbv K v) w) + (inferInstance : Field + (NumberField.HeightOneSpectrum.adicAbv K v).Completion) + (inferInstance : Field + (AlgebraicNumberTheory.Valuations.LocalizedCompletion + (NumberField.HeightOneSpectrum.adicAbv K v) w)) + (finitePlaceLocalArtinLocalizedAlgebra v w) + (finitePlaceLocalArtinCompletionValuativeRel v) + (inferInstance : TopologicalSpace + (NumberField.HeightOneSpectrum.adicAbv K v).Completion) + (finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v) + (finitePlaceLocalArtinFiniteDimensional v w) + (finitePlaceLocalArtinIsAbelianGalois v w hKLfinite) + (finitePlaceLocalArtinInput v x)) z := by + exact + congrArg (fun sigma => sigma z) + (finitePlaceLocalArtinMonoidHom_apply_normalized + (K := K) (L := L) v w x) + +open scoped Classical in +/-- The decomposition-group inclusion transporting localized automorphisms to the global Galois +group. -/ +noncomputable def finitePlaceLocalToGlobalMonoidHom + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) : + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + letI : Algebra vK.Completion E := + finitePlaceLocalArtinLocalizedAlgebra v w + (E ≃ₐ[vK.Completion] E) →* (L ≃ₐ[K] L) := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + letI : Algebra vK.Completion E := + finitePlaceLocalArtinLocalizedAlgebra v w + let eD : + absoluteValueDecompositionGroup K w.1 ≃* + (E ≃ₐ[vK.Completion] E) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w + exact + (absoluteValueDecompositionGroup K w.1).subtype.comp + eD.symm.toMonoidHom + +open scoped Classical in +/-- The finite-place Artin map factors through the localized Artin map and the +decomposition-group inclusion. -/ +theorem finitePlaceArtinMonoidHomOfExtension_factor + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) : + finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v w = + (finitePlaceLocalToGlobalMonoidHom + (K := K) (L := L) v w).comp + (finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v w) := by + rfl + +open scoped Classical in +/-- Evaluation of the global finite-place Artin homomorphism with the +localized Artin map and its decomposition-group transport expressed through +the canonical named data. -/ +theorem finitePlaceArtinMonoidHomOfExtension_apply_normalized + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (x : (v.adicCompletion K)ˣ) : + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + letI : Algebra vK.Completion E := + finitePlaceLocalArtinLocalizedAlgebra v w + let eD : + absoluteValueDecompositionGroup K w.1 ≃* + (E ≃ₐ[vK.Completion] E) := + decompositionGroupEquivAlgebraicLocalizationAut vK hvK w + finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v w x = + (absoluteValueDecompositionGroup K w.1).subtype + (eD.symm + (@LocalClassFieldTheory.abelianLocalArtinMonoidHom + vK.Completion E + (inferInstance : Field vK.Completion) + (inferInstance : Field E) + (finitePlaceLocalArtinLocalizedAlgebra v w) + (finitePlaceLocalArtinCompletionValuativeRel v) + (inferInstance : TopologicalSpace vK.Completion) + (finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v) + (finitePlaceLocalArtinFiniteDimensional v w) + (finitePlaceLocalArtinIsAbelianGalois v w hKLfinite) + (finitePlaceLocalArtinInput v x))) := by + rw [finitePlaceArtinMonoidHomOfExtension_factor, + MonoidHom.comp_apply, + finitePlaceLocalArtinMonoidHom_apply_normalized] + rfl + +open scoped Classical in +/-- The finite-place Artin homomorphism from the concrete adic +completion into the actual global Galois group. Its image is contained +in the decomposition group at the chosen extension above `v`. -/ +noncomputable def chosenFinitePlaceArtinMonoidHom + (v : HeightOneSpectrum (𝓞 K)) : + (v.adicCompletion K)ˣ →* (L ≃ₐ[K] L) := + finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v) + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Core.lean new file mode 100644 index 0000000000..8f709e8d4a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Core.lean @@ -0,0 +1,266 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Conjugation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.TowerRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.CrossLocalRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.NormRestriction +/-! +# Image and kernel of finite-place Artin homomorphisms + +This module identifies the image with the chosen decomposition group and the kernel with the + chosen local norm subgroup. +-/ + +@[expose] public section + +open scoped IsMulCommutative NNReal NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory + +variable {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + +open scoped Classical in +/-- The image of the chosen finite-place Artin homomorphism is exactly +the chosen decomposition group. -/ +theorem chosenFinitePlaceArtinMonoidHom_range + (v : HeightOneSpectrum (𝓞 K)) : + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).range = + finitePlaceDecompositionGroup + (K := K) (L := L) v := by + let vK := + NumberField.HeightOneSpectrum.adicAbv K v + let w := + chosenFinitePlaceExtension (L := L) v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let := + LocalClassFieldTheory.localizedCompletionGlobalAlgebra vK w + let := + LocalClassFieldTheory.localizedCompletionIsScalarTower vK w + let E := + AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let : FiniteDimensional vK.Completion E := + AlgebraicNumberTheory.Valuations.localizedCompletionModuleFinite vK hvK w + let : IsAbelianGalois vK.Completion E := + LocalClassFieldTheory.localizedCompletion_isAbelianGalois + vK hvK w + let : NontriviallyNormedField vK.Completion := + absoluteValueExtensionCompletionNontriviallyNormedField + vK hvK + let : LocallyCompactSpace vK.Completion := + AbsoluteValue.Completion.locallyCompactSpace + (finitePlaceCompletionBaseMap_isometry v) + let : IsUltrametricDist vK.Completion := + IsUltrametricDist.isUltrametricDist_of_isNonarchimedean_norm + (AbsoluteValue.completionAbsoluteValue_isNonarchimedean + vK + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv + K v)) + let : Valued vK.Completion ℝ≥0 := + NormedField.toValued + let vC : Valuation vK.Completion ℝ≥0 := + Valued.v + let : vC.IsNontrivial := + (inferInstance : + (NormedField.valuation + (K := vK.Completion)).IsNontrivial) + let : ValuativeRel vK.Completion := + ValuativeRel.ofValuation vC + let : vC.Compatible := + Valuation.Compatible.ofValuation vC + let : ValuativeRel.IsNontrivial vK.Completion := + (ValuativeRel.isNontrivial_iff_isNontrivial vC).2 + inferInstance + let : IsValuativeTopology vK.Completion := + isValuativeTopology_of_valued_ofValuation + vK.Completion ℝ≥0 + let : IsNonarchimedeanLocalField vK.Completion := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + let eD : + absoluteValueDecompositionGroup K w.1 ≃* + (E ≃ₐ[vK.Completion] E) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w + let eK : + vK.Completionˣ ≃* (v.adicCompletion K)ˣ := + finitePlaceCompletionUnitsContinuousMulEquiv v + have hsurjective : + Function.Surjective + (eD.symm.toMonoidHom.comp + ((LocalClassFieldTheory.abelianLocalArtinMonoidHom + vK.Completion E).comp + eK.symm.toMonoidHom)) := + eD.symm.surjective.comp + ((LocalClassFieldTheory.abelianLocalArtinMonoidHom_surjective + vK.Completion E).comp + eK.symm.surjective) + change + MonoidHom.range + ((absoluteValueDecompositionGroup K w.1).subtype.comp + (eD.symm.toMonoidHom.comp + ((LocalClassFieldTheory.abelianLocalArtinMonoidHom + vK.Completion E).comp + eK.symm.toMonoidHom))) = + absoluteValueDecompositionGroup K w.1 + rw [ + MonoidHom.range_comp, + MonoidHom.range_eq_top.mpr hsurjective, + ← MonoidHom.range_eq_map, + Subgroup.range_subtype] + +open scoped Classical in +/-- The kernel of the concrete finite-place Artin homomorphism is +exactly the chosen local norm subgroup. -/ +theorem chosenFinitePlaceArtinMonoidHom_ker + (v : HeightOneSpectrum (𝓞 K)) : + MonoidHom.ker + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v) = + chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := by + let vK := + NumberField.HeightOneSpectrum.adicAbv K v + let w := + chosenFinitePlaceExtension (L := L) v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let := + LocalClassFieldTheory.localizedCompletionGlobalAlgebra vK w + let := + LocalClassFieldTheory.localizedCompletionIsScalarTower vK w + let E := + AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let : FiniteDimensional vK.Completion E := + AlgebraicNumberTheory.Valuations.localizedCompletionModuleFinite vK hvK w + let : IsAbelianGalois vK.Completion E := + LocalClassFieldTheory.localizedCompletion_isAbelianGalois + vK hvK w + let : NontriviallyNormedField vK.Completion := + absoluteValueExtensionCompletionNontriviallyNormedField + vK hvK + let : LocallyCompactSpace vK.Completion := + AbsoluteValue.Completion.locallyCompactSpace + (finitePlaceCompletionBaseMap_isometry v) + let : IsUltrametricDist vK.Completion := + IsUltrametricDist.isUltrametricDist_of_isNonarchimedean_norm + (AbsoluteValue.completionAbsoluteValue_isNonarchimedean + vK + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv + K v)) + let : Valued vK.Completion ℝ≥0 := + NormedField.toValued + let vC : Valuation vK.Completion ℝ≥0 := + Valued.v + let : vC.IsNontrivial := + (inferInstance : + (NormedField.valuation + (K := vK.Completion)).IsNontrivial) + let : ValuativeRel vK.Completion := + ValuativeRel.ofValuation vC + let : vC.Compatible := + Valuation.Compatible.ofValuation vC + let : ValuativeRel.IsNontrivial vK.Completion := + (ValuativeRel.isNontrivial_iff_isNontrivial vC).2 + inferInstance + let : IsValuativeTopology vK.Completion := + isValuativeTopology_of_valued_ofValuation + vK.Completion ℝ≥0 + let : IsNonarchimedeanLocalField vK.Completion := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + let eD : + absoluteValueDecompositionGroup K w.1 ≃* + (E ≃ₐ[vK.Completion] E) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w + let eK : + vK.Completionˣ ≃* (v.adicCompletion K)ˣ := + finitePlaceCompletionUnitsContinuousMulEquiv v + let localArtin := + LocalClassFieldTheory.abelianLocalArtinMonoidHom + vK.Completion E + change + MonoidHom.ker + ((absoluteValueDecompositionGroup K w.1).subtype.comp + (eD.symm.toMonoidHom.comp + (localArtin.comp eK.symm.toMonoidHom))) = + (localNormSubgroup vK.Completion E).map + eK.toMonoidHom + apply SetLike.ext + intro x + constructor + · intro hx + change + (absoluteValueDecompositionGroup K w.1).subtype + (eD.symm (localArtin (eK.symm x))) = 1 at hx + have hxSubgroup : + eD.symm (localArtin (eK.symm x)) = 1 := by + apply Subtype.coe_injective + exact hx + have hxLocal : + localArtin (eK.symm x) = 1 := by + apply eD.symm.injective + simpa only [map_one] using hxSubgroup + have hxKer : + eK.symm x ∈ MonoidHom.ker localArtin := + hxLocal + have hxNorm : + eK.symm x ∈ localNormSubgroup vK.Completion E := by + rw [ + LocalClassFieldTheory.abelianLocalArtinMonoidHom_ker + ] at hxKer + exact hxKer + exact + ⟨eK.symm x, hxNorm, eK.apply_symm_apply x⟩ + · rintro ⟨y, hy, rfl⟩ + have hyKer : + y ∈ MonoidHom.ker localArtin := by + rw [ + LocalClassFieldTheory.abelianLocalArtinMonoidHom_ker + ] + exact hy + have hyArtin : localArtin y = 1 := hyKer + change + (absoluteValueDecompositionGroup K w.1).subtype + (eD.symm (localArtin (eK.symm (eK y)))) = 1 + simp only [eK.symm_apply_apply, hyArtin, map_one] + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean new file mode 100644 index 0000000000..554f07b8d8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean @@ -0,0 +1,916 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.TowerRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison +/-! +# Cross-base restriction of finite-place Artin homomorphisms + +This module compares localized completions in a square of number fields with different base + fields and transports restriction through the corresponding decomposition groups. +-/ + +@[expose] public section + +open scoped IsMulCommutative NNReal NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory + +variable {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + +open scoped Classical in +private theorem finitePlaceArtinLocalizedCompletion_algebraMap + {F M : Type} + [Field F] [NumberField F] + [Field M] [NumberField M] + [Algebra F M] [FiniteDimensional F M] + (v : HeightOneSpectrum (𝓞 F)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv F v) M) + (x : (NumberField.HeightOneSpectrum.adicAbv F v).Completion) : + let vF := NumberField.HeightOneSpectrum.adicAbv F v + let hvF : vF.IsNontrivial := + RayClass.adicAbv_isNontrivial v + letI hMF := + AbsoluteValue.extensionCompletionAlgebra + (K := F) w.1 + letI : SMul F w.1.Completion := hMF.toSMul + letI : Algebra vF.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vF w.1 w.2 + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vF w + let U := finitePlaceExtensionEquivAbove + (K := F) (L := M) v w + let eF : + vF.Completion ≃+* v.adicCompletion F := + (relativeFinitePlaceCompletionAlgEquiv v).toRingEquiv + let eE : + E ≃+* U.1.adicCompletion M := + (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + vF hvF w).toRingEquiv.trans + (finitePlaceExtensionAdicCompletionRingEquiv + (K := F) (L := M) v w) + eE (algebraMap vF.Completion E x) = + finitePlaceAdicCompletionMap + F M v U (eF x) := by + let vF := NumberField.HeightOneSpectrum.adicAbv F v + let hvF : vF.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let hMF := + AbsoluteValue.extensionCompletionAlgebra + (K := F) w.1 + let : SMul F w.1.Completion := hMF.toSMul + let : Algebra vF.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vF w.1 w.2 + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vF w + let U := finitePlaceExtensionEquivAbove + (K := F) (L := M) v w + let eF : + vF.Completion ≃+* v.adicCompletion F := + (relativeFinitePlaceCompletionAlgEquiv v).toRingEquiv + let eE : + E ≃+* U.1.adicCompletion M := + (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + vF hvF w).toRingEquiv.trans + (finitePlaceExtensionAdicCompletionRingEquiv + (K := F) (L := M) v w) + change + finitePlaceExtensionAdicCompletionRingEquiv + (K := F) (L := M) v w + (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + vF hvF w (algebraMap vF.Completion E x)) = + finitePlaceAdicCompletionMap + F M v U + (relativeFinitePlaceCompletionAlgEquiv v x) + rw [ + (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + vF hvF w).commutes] + rw [← + finitePlaceExtensionAdicCompletionMap_eq_finitePlaceAdicCompletionMap + F M v w] + change + finitePlaceExtensionAdicCompletionRingEquiv + (K := F) (L := M) v w + (algebraMap vF.Completion w.1.Completion x) = + finitePlaceExtensionAdicCompletionRingEquiv + (K := F) (L := M) v w + (AbsoluteValue.completionMap vF w.1 w.2 + ((relativeFinitePlaceCompletionAlgEquiv v).symm + (relativeFinitePlaceCompletionAlgEquiv v x))) + rw [ + (relativeFinitePlaceCompletionAlgEquiv v).symm_apply_apply, + AbsoluteValue.completionAlgebra_algebraMap] + +open scoped Classical in +/-- The continuous ring homomorphism between base completions attached to a finite place lying +above another. -/ +noncomputable def finitePlaceArtinRelativeCompletionRingHom + {K' : Type} [Field K'] [NumberField K'] + [Algebra K K'] + (v : HeightOneSpectrum (𝓞 K)) + (W : HeightOneSpectrum (𝓞 K')) + (hW : finitePlaceBelow (K := K) W = v) : + (NumberField.HeightOneSpectrum.adicAbv K v).Completion →+* + (NumberField.HeightOneSpectrum.adicAbv K' W).Completion := + let eC := + (relativeFinitePlaceCompletionAlgEquiv v).toRingEquiv + let eD := + (relativeFinitePlaceCompletionAlgEquiv W).toRingEquiv + eD.symm.toRingHom.comp + ((finitePlaceAdicCompletionMap + K K' v ⟨W, hW⟩).comp eC.toRingHom) + +open scoped Classical in +/-- The finite-place map between the relative base completions is continuous. -/ +theorem finitePlaceArtinRelativeCompletionRingHom_continuous + {K' : Type} [Field K'] [NumberField K'] + [Algebra K K'] + (v : HeightOneSpectrum (𝓞 K)) + (W : HeightOneSpectrum (𝓞 K')) + (hW : finitePlaceBelow (K := K) W = v) : + Continuous + (finitePlaceArtinRelativeCompletionRingHom + (K := K) (K' := K') v W hW) := by + let eD := + (relativeFinitePlaceCompletionAlgEquiv W).toRingEquiv + have hDsymm : Isometry eD.symm := + AddMonoidHomClass.isometry_of_norm eD.symm + (relativeFinitePlaceCompletionAlgEquiv_symm_norm W) + exact + hDsymm.continuous.comp + ((finitePlaceAdicCompletionMap_continuous + K K' v ⟨W, hW⟩).comp + (relativeFinitePlaceCompletionRingHom_isometry v).continuous) + +open scoped Classical in +/-- The localized completion at a finite place, with its completion-algebra +tower hidden behind one named type. -/ +noncomputable abbrev finitePlaceArtinLocalizedCompletion + (F M : Type) [Field F] [NumberField F] + [Field M] [Algebra F M] + (v : HeightOneSpectrum (𝓞 F)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv F v) M) : Type := + let vF := NumberField.HeightOneSpectrum.adicAbv F v + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vF w + letI : Algebra vF.Completion E := + finitePlaceLocalArtinLocalizedAlgebra (K := F) (L := M) v w + E + +open scoped Classical in +/-- The canonical map from the base completion into the localized completion, +with its construction tower confined to the definition body. -/ +noncomputable def finitePlaceArtinLocalizedCompletionBaseRingHom + (F M : Type) [Field F] [NumberField F] + [Field M] [NumberField M] [Algebra F M] + (v : HeightOneSpectrum (𝓞 F)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv F v) M) : + (NumberField.HeightOneSpectrum.adicAbv F v).Completion →+* + finitePlaceArtinLocalizedCompletion F M v w := by + let vF := NumberField.HeightOneSpectrum.adicAbv F v + letI hwF := + AbsoluteValue.extensionCompletionAlgebra + (K := F) w.1 + letI : SMul F w.1.Completion := hwF.toSMul + letI : Algebra vF.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vF w.1 w.2 + exact algebraMap vF.Completion + (AlgebraicNumberTheory.Valuations.LocalizedCompletion vF w) + +open scoped Classical in +/-- The ring homomorphism between localized completions in a finite-place scalar tower. -/ +noncomputable def finitePlaceArtinLocalizedCompletionRingHom + {K' L' : Type} + [Field K'] [NumberField K'] + [Field L'] [NumberField L'] + [NumberField L] + [Algebra K K'] [Algebra K' L'] [Algebra K L'] + [Algebra L L'] + (v : HeightOneSpectrum (𝓞 K)) + (W : HeightOneSpectrum (𝓞 K')) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (w' : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K' W) L') + (hcentres : + finitePlaceBelow (K := L) + (finitePlaceExtensionCentre + (K := K') (L := L') W w') = + finitePlaceExtensionCentre + (K := K) (L := L) v w) : + finitePlaceArtinLocalizedCompletion K L v w →+* + finitePlaceArtinLocalizedCompletion K' L' W w' := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let vK' := NumberField.HeightOneSpectrum.adicAbv K' W + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let hvK' : vK'.IsNontrivial := + RayClass.adicAbv_isNontrivial W + letI hwK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + letI : SMul K w.1.Completion := hwK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI hwK' := + AbsoluteValue.extensionCompletionAlgebra + (K := K') w'.1 + letI : SMul K' w'.1.Completion := hwK'.toSMul + letI : Algebra vK'.Completion w'.1.Completion := + AbsoluteValue.completionAlgebra vK' w'.1 w'.2 + let U := + finitePlaceExtensionEquivAbove + (K := K) (L := L) v w + let U' := + finitePlaceExtensionEquivAbove + (K := K') (L := L') W w' + have hU'L : finitePlaceBelow (K := L) U'.1 = U.1 := by + simpa only [ + U, U', + finitePlaceExtensionEquivAbove_coe + ] using hcentres + let eE : + AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w ≃+* + U.1.adicCompletion L := + (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + vK hvK w).toRingEquiv.trans + (finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w) + let eE' : + AlgebraicNumberTheory.Valuations.LocalizedCompletion vK' w' ≃+* + U'.1.adicCompletion L' := + (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + vK' hvK' w').toRingEquiv.trans + (finitePlaceExtensionAdicCompletionRingEquiv + (K := K') (L := L') W w') + exact + eE'.symm.toRingHom.comp + ((finitePlaceAdicCompletionMap + L L' U.1 ⟨U'.1, hU'L⟩).comp eE.toRingHom) + +omit [IsAbelianGalois K L] in +open scoped Classical in +/-- The localized-completion map agrees with the scalar-tower embedding on global elements. -/ +theorem finitePlaceArtinLocalizedCompletion_towerPoint + {K' L' : Type} + [Field K'] [NumberField K'] + [Field L'] [NumberField L'] + [NumberField L] + [Algebra K K'] [Algebra K' L'] [Algebra K L'] + [IsScalarTower K K' L'] + [Algebra L L'] [IsScalarTower K L L'] + (v : HeightOneSpectrum (𝓞 K)) + (W : HeightOneSpectrum (𝓞 K')) + (hW : finitePlaceBelow (K := K) W = v) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (w' : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K' W) L') + (hcentres : + finitePlaceBelow (K := L) + (finitePlaceExtensionCentre + (K := K') (L := L') W w') = + finitePlaceExtensionCentre + (K := K) (L := L) v w) + (x : (NumberField.HeightOneSpectrum.adicAbv K v).Completion) : + finitePlaceArtinLocalizedCompletionBaseRingHom K' L' W w' + (finitePlaceArtinRelativeCompletionRingHom + (K := K) (K' := K') v W hW x) = + finitePlaceArtinLocalizedCompletionRingHom + (K := K) (L := L) (K' := K') (L' := L') + v W w w' hcentres + (finitePlaceArtinLocalizedCompletionBaseRingHom K L v w x) := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let vK' := NumberField.HeightOneSpectrum.adicAbv K' W + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let hvK' : vK'.IsNontrivial := + RayClass.adicAbv_isNontrivial W + let hwK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hwK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let := + LocalClassFieldTheory.localizedCompletionGlobalAlgebra vK w + let hwK' := + AbsoluteValue.extensionCompletionAlgebra + (K := K') w'.1 + let : SMul K' w'.1.Completion := hwK'.toSMul + let : Algebra vK'.Completion w'.1.Completion := + AbsoluteValue.completionAlgebra vK' w'.1 w'.2 + let := + LocalClassFieldTheory.localizedCompletionGlobalAlgebra vK' w' + let C := vK.Completion + let D := vK'.Completion + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let E' := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK' w' + let : Algebra C D := + (finitePlaceArtinRelativeCompletionRingHom + (K := K) (K' := K') v W hW).toAlgebra + let : Algebra E E' := + (finitePlaceArtinLocalizedCompletionRingHom + (K := K) (L := L) (K' := K') (L' := L') + v W w w' hcentres).toAlgebra + let : Algebra C E' := + ((algebraMap D E').comp (algebraMap C D)).toAlgebra + change algebraMap C E' x = + algebraMap E E' (algebraMap C E x) + let U := + finitePlaceExtensionEquivAbove + (K := K) (L := L) v w + let U' := + finitePlaceExtensionEquivAbove + (K := K') (L := L') W w' + have hU'L : finitePlaceBelow (K := L) U'.1 = U.1 := by + simpa only [ + U, U', + finitePlaceExtensionEquivAbove_coe + ] using hcentres + have hU'K : + finitePlaceBelow (K := K) U'.1 = v := by + calc + finitePlaceBelow (K := K) U'.1 = + finitePlaceBelow (K := K) + (finitePlaceBelow (K := K') U'.1) := by + rw [finitePlaceBelow_finitePlaceBelow] + _ = finitePlaceBelow (K := K) W := by + rw [U'.2] + _ = v := hW + let eC : + C ≃+* v.adicCompletion K := + (relativeFinitePlaceCompletionAlgEquiv v).toRingEquiv + let eD : + D ≃+* W.adicCompletion K' := + (relativeFinitePlaceCompletionAlgEquiv W).toRingEquiv + let eE : + E ≃+* U.1.adicCompletion L := + (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + vK hvK w).toRingEquiv.trans + (finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w) + let eE' : + E' ≃+* U'.1.adicCompletion L' := + (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + vK' hvK' w').toRingEquiv.trans + (finitePlaceExtensionAdicCompletionRingEquiv + (K := K') (L := L') W w') + have hLowerBase (y : C) : + eE (algebraMap C E y) = + finitePlaceAdicCompletionMap + K L v U (eC y) := + finitePlaceArtinLocalizedCompletion_algebraMap + (F := K) (M := L) v w y + have hUpperBase (y : D) : + eE' (algebraMap D E' y) = + finitePlaceAdicCompletionMap + K' L' W U' (eD y) := + finitePlaceArtinLocalizedCompletion_algebraMap + (F := K') (M := L') W w' y + have hBaseMap (y : C) : + eD (algebraMap C D y) = + finitePlaceAdicCompletionMap + K K' v ⟨W, hW⟩ (eC y) := by + change + eD (eD.symm + (finitePlaceAdicCompletionMap + K K' v ⟨W, hW⟩ (eC y))) = + finitePlaceAdicCompletionMap + K K' v ⟨W, hW⟩ (eC y) + rw [eD.apply_symm_apply] + apply eE'.injective + calc + eE' (algebraMap C E' x) = + finitePlaceAdicCompletionMap + K' L' W U' + (finitePlaceAdicCompletionMap + K K' v ⟨W, hW⟩ (eC x)) := by + change eE' (algebraMap D E' (algebraMap C D x)) = _ + rw [hUpperBase, hBaseMap] + _ = + finitePlaceAdicCompletionMap + K L' v ⟨U'.1, hU'K⟩ (eC x) := + finitePlaceAdicCompletionMap_comp + K L' (M := K') v W U'.1 hW U'.2 hU'K (eC x) + _ = + finitePlaceAdicCompletionMap + L L' U.1 ⟨U'.1, hU'L⟩ + (finitePlaceAdicCompletionMap + K L v U (eC x)) := by + symm + exact + finitePlaceAdicCompletionMap_comp + K L' (M := L) v U.1 U'.1 U.2 hU'L hU'K (eC x) + _ = eE' (algebraMap E E' (algebraMap C E x)) := by + change + _ = + eE' + (eE'.symm + (finitePlaceAdicCompletionMap + L L' U.1 ⟨U'.1, hU'L⟩ + (eE (algebraMap C E x)))) + rw [eE'.apply_symm_apply, hLowerBase] + +omit [IsAbelianGalois K L] in +open scoped Classical in +private theorem finitePlaceArtinLocalizedCompletion_globalEmbedding + {K' L' : Type} + [Field K'] [NumberField K'] + [Field L'] [NumberField L'] + [NumberField L] + [Algebra K K'] [Algebra K' L'] [Algebra K L'] + [IsScalarTower K K' L'] + [Algebra L L'] [IsScalarTower K L L'] + (v : HeightOneSpectrum (𝓞 K)) + (W : HeightOneSpectrum (𝓞 K')) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (w' : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K' W) L') + (hcentres : + finitePlaceBelow (K := L) + (finitePlaceExtensionCentre + (K := K') (L := L') W w') = + finitePlaceExtensionCentre + (K := K) (L := L) v w) + (x : L) : + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let vK' := NumberField.HeightOneSpectrum.adicAbv K' W + letI hwK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + letI : SMul K w.1.Completion := hwK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI hwK' := + AbsoluteValue.extensionCompletionAlgebra + (K := K') w'.1 + letI : SMul K' w'.1.Completion := hwK'.toSMul + letI : Algebra vK'.Completion w'.1.Completion := + AbsoluteValue.completionAlgebra vK' w'.1 w'.2 + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let E' := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK' w' + letI : Algebra E E' := + (finitePlaceArtinLocalizedCompletionRingHom + (K := K) (L := L) (K' := K') (L' := L') + v W w w' hcentres).toAlgebra + algebraMap E E' + (AbsoluteValue.toAlgebraicLocalization + vK w.1 w.2 x) = + AbsoluteValue.toAlgebraicLocalization + vK' w'.1 w'.2 (algebraMap L L' x) := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let vK' := NumberField.HeightOneSpectrum.adicAbv K' W + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let hvK' : vK'.IsNontrivial := + RayClass.adicAbv_isNontrivial W + let hwK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hwK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let hwK' := + AbsoluteValue.extensionCompletionAlgebra + (K := K') w'.1 + let : SMul K' w'.1.Completion := hwK'.toSMul + let : Algebra vK'.Completion w'.1.Completion := + AbsoluteValue.completionAlgebra vK' w'.1 w'.2 + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let E' := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK' w' + let : Algebra E E' := + (finitePlaceArtinLocalizedCompletionRingHom + (K := K) (L := L) (K' := K') (L' := L') + v W w w' hcentres).toAlgebra + let U := + finitePlaceExtensionEquivAbove + (K := K) (L := L) v w + let U' := + finitePlaceExtensionEquivAbove + (K := K') (L := L') W w' + have hU'L : finitePlaceBelow (K := L) U'.1 = U.1 := by + simpa only [U, U', finitePlaceExtensionEquivAbove_coe] using hcentres + let eE : + E ≃+* U.1.adicCompletion L := + (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + vK hvK w).toRingEquiv.trans + (finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w) + let eE' : + E' ≃+* U'.1.adicCompletion L' := + (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + vK' hvK' w').toRingEquiv.trans + (finitePlaceExtensionAdicCompletionRingEquiv + (K := K') (L := L') W w') + have hLowerConcrete : + eE + (AbsoluteValue.toAlgebraicLocalization + vK w.1 w.2 x) = + FinitePlace.embedding U.1 x := by + exact (congrArg (finitePlaceExtensionAdicCompletionRingEquiv v w) + (localizedCompletionEquivCompletion_coe vK hvK w _)).trans + (finitePlaceExtensionAdicCompletionRingEquiv_toCompletion v w x) + have hUpperConcrete : + eE' + (AbsoluteValue.toAlgebraicLocalization + vK' w'.1 w'.2 (algebraMap L L' x)) = + FinitePlace.embedding U'.1 (algebraMap L L' x) := by + exact (congrArg (finitePlaceExtensionAdicCompletionRingEquiv W w') + (localizedCompletionEquivCompletion_coe vK' hvK' w' _)).trans + (finitePlaceExtensionAdicCompletionRingEquiv_toCompletion W w' (algebraMap L L' x)) + apply eE'.injective + change + eE' + (eE'.symm + (finitePlaceAdicCompletionMap + L L' U.1 ⟨U'.1, hU'L⟩ + (eE + (AbsoluteValue.toAlgebraicLocalization + vK w.1 w.2 x)))) = + eE' + (AbsoluteValue.toAlgebraicLocalization + vK' w'.1 w'.2 (algebraMap L L' x)) + rw [eE'.apply_symm_apply, hLowerConcrete, hUpperConcrete] + change + finitePlaceAdicCompletionMap + L L' U.1 ⟨U'.1, hU'L⟩ + (x : U.1.adicCompletion L) = + (algebraMap L L' x : U'.1.adicCompletion L') + exact finitePlaceAdicCompletionMap_coe L L' U.1 ⟨U'.1, hU'L⟩ x + +open scoped Classical in +/-- Localized automorphisms with the completion tower hidden behind one named +type. -/ +noncomputable abbrev finitePlaceArtinLocalizedAutomorphism + (F M : Type) [Field F] [NumberField F] + [Field M] [NumberField M] [Algebra F M] + (v : HeightOneSpectrum (𝓞 F)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv F v) M) : Type := + let vF := NumberField.HeightOneSpectrum.adicAbv F v + let E := finitePlaceArtinLocalizedCompletion F M v w + letI : Algebra vF.Completion E := + finitePlaceLocalArtinLocalizedAlgebra (K := F) (L := M) v w + E ≃ₐ[vF.Completion] E + +open scoped Classical in +/-- Restriction of localized automorphisms across a finite-place square with +different base fields. -/ +noncomputable def finitePlaceCrossLocalRestrictionMonoidHom + {K' L' : Type} + [Field K'] [NumberField K'] + [Field L'] [NumberField L'] + [NumberField L] + [Algebra K K'] [Algebra K' L'] [Algebra K L'] + [IsScalarTower K K' L'] + [Algebra L L'] [IsScalarTower K L L'] + (v : HeightOneSpectrum (𝓞 K)) + (W : HeightOneSpectrum (𝓞 K')) + (hW : finitePlaceBelow (K := K) W = v) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (w' : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K' W) L') + (hcentres : + finitePlaceBelow (K := L) + (finitePlaceExtensionCentre + (K := K') (L := L') W w') = + finitePlaceExtensionCentre + (K := K) (L := L) v w) : + finitePlaceArtinLocalizedAutomorphism K' L' W w' →* + finitePlaceArtinLocalizedAutomorphism K L v w := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let vK' := NumberField.HeightOneSpectrum.adicAbv K' W + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let C := vK.Completion + let D := vK'.Completion + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let E' := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK' w' + letI : Algebra C E := + finitePlaceLocalArtinLocalizedAlgebra (K := K) (L := L) v w + letI : Algebra D E' := + finitePlaceLocalArtinLocalizedAlgebra (K := K') (L := L') W w' + let lowerGlobalAlgebra : Algebra K E := + LocalClassFieldTheory.localizedCompletionGlobalAlgebra vK w + let upperGlobalAlgebra : Algebra K' E' := + LocalClassFieldTheory.localizedCompletionGlobalAlgebra vK' w' + letI : Algebra C D := + (finitePlaceArtinRelativeCompletionRingHom + (K := K) (K' := K') v W hW).toAlgebra + let derivedStructures : + PProd (Algebra E E') (Normal C E) := by + letI : Algebra K E := lowerGlobalAlgebra + letI : Algebra K' E' := upperGlobalAlgebra + let upperAlgebra : Algebra E E' := + (finitePlaceArtinLocalizedCompletionRingHom + (K := K) (L := L) (K' := K') (L' := L') + v W w w' hcentres).toAlgebra + letI : FiniteDimensional C E := + finitePlaceLocalArtinFiniteDimensional (K := K) (L := L) v w + letI : IsAbelianGalois C E := + finitePlaceLocalArtinIsAbelianGalois (K := K) (L := L) v w + (inferInstance : FiniteDimensional K L) + letI hGaloisE : IsGalois C E := + (inferInstance : IsAbelianGalois C E).toIsGalois + exact ⟨upperAlgebra, hGaloisE.to_normal⟩ + letI : Algebra E E' := derivedStructures.fst + letI : Algebra C E' := + ((algebraMap D E').comp (algebraMap C D)).toAlgebra + letI : IsScalarTower C D E' := + IsScalarTower.of_algebraMap_eq' rfl + letI : IsScalarTower C E E' := + IsScalarTower.of_algebraMap_eq' <| by + apply RingHom.ext + intro x + exact + finitePlaceArtinLocalizedCompletion_towerPoint + (K := K) (L := L) (K' := K') (L' := L') + v W hW w w' hcentres x + letI : Normal C E := derivedStructures.snd + exact + (AlgEquiv.restrictNormalHom E).comp + (AlgEquiv.restrictScalarsHom C) + +open scoped Classical in +private theorem finitePlaceDecompositionEquiv_symm_action + {F M : Type} + [Field F] [Field M] [Algebra F M] [IsGalois F M] + (vF : AbsoluteValue F ℝ) + (hvF : vF.IsNontrivial) + (wF : AbsoluteValueExtension vF M) + (tau : + letI hwF := + AbsoluteValue.extensionCompletionAlgebra + (K := F) wF.1 + letI : SMul F wF.1.Completion := hwF.toSMul + letI : Algebra vF.Completion wF.1.Completion := + AbsoluteValue.completionAlgebra vF wF.1 wF.2 + let E := + AlgebraicNumberTheory.Valuations.LocalizedCompletion vF wF + E ≃ₐ[vF.Completion] E) + (z : M) : + letI hwF := + AbsoluteValue.extensionCompletionAlgebra + (K := F) wF.1 + letI : SMul F wF.1.Completion := hwF.toSMul + letI : Algebra vF.Completion wF.1.Completion := + AbsoluteValue.completionAlgebra vF wF.1 wF.2 + let E := + AlgebraicNumberTheory.Valuations.LocalizedCompletion vF wF + let e : + absoluteValueDecompositionGroup F wF.1 ≃* + (E ≃ₐ[vF.Completion] E) := + decompositionGroupEquivAlgebraicLocalizationAut + vF hvF wF + let embedding : M →+* E := + AbsoluteValue.toAlgebraicLocalization vF wF.1 wF.2 + embedding (((e.symm tau).1 : M ≃ₐ[F] M) z) = + tau (embedding z) := by + let hwF := + AbsoluteValue.extensionCompletionAlgebra + (K := F) wF.1 + let : SMul F wF.1.Completion := hwF.toSMul + let : Algebra vF.Completion wF.1.Completion := + AbsoluteValue.completionAlgebra vF wF.1 wF.2 + let E := + AlgebraicNumberTheory.Valuations.LocalizedCompletion vF wF + let e : + absoluteValueDecompositionGroup F wF.1 ≃* + (E ≃ₐ[vF.Completion] E) := + decompositionGroupEquivAlgebraicLocalizationAut + vF hvF wF + let embedding : M →+* E := + AbsoluteValue.toAlgebraicLocalization vF wF.1 wF.2 + calc + embedding (((e.symm tau).1 : M ≃ₐ[F] M) z) = + e (e.symm tau) (embedding z) := by + rw [ + localizationRamificationGroups_decompositionGroupEquiv_toLocalization] + _ = tau (embedding z) := by + rw [e.apply_symm_apply] + +open scoped Classical in +private theorem finitePlaceCrossDecompositionTransport_core + {K K' L L' C D E E' : Type} + [Field K] [Field K'] [Field L] [Field L'] + [Field C] [Field D] [Field E] [Field E'] + [Algebra K K'] [Algebra K' L'] [Algebra K L'] + [IsScalarTower K K' L'] + [Algebra K L] [Algebra L L'] [IsScalarTower K L L'] + [Normal K L] + [Algebra C D] [Algebra D E'] [Algebra C E'] + [IsScalarTower C D E'] + [Algebra C E] [Algebra E E'] [IsScalarTower C E E'] + [Normal C E] + (phiLower : (E ≃ₐ[C] E) → (L ≃ₐ[K] L)) + (phiUpper : (E' ≃ₐ[D] E') → (L' ≃ₐ[K'] L')) + (lowerEmbedding : L →+* E) + (upperEmbedding : L' →+* E') + (hEmbedding : ∀ z : L, + algebraMap E E' (lowerEmbedding z) = + upperEmbedding (algebraMap L L' z)) + (hUpperAction : ∀ (tau : E' ≃ₐ[D] E') (z : L'), + upperEmbedding (phiUpper tau z) = + tau (upperEmbedding z)) + (hLowerAction : ∀ (tau : E ≃ₐ[C] E) (z : L), + tau (lowerEmbedding z) = + lowerEmbedding (phiLower tau z)) + (tauUpper : E' ≃ₐ[D] E') : + AlgEquiv.restrictNormalHom L + (AlgEquiv.restrictScalarsHom K (phiUpper tauUpper)) = + phiLower + (AlgEquiv.restrictNormalHom E + (AlgEquiv.restrictScalarsHom C tauUpper)) := by + let tauLower := + AlgEquiv.restrictNormalHom E + (AlgEquiv.restrictScalarsHom C tauUpper) + apply AlgEquiv.ext + intro z + apply (algebraMap L L').injective + apply upperEmbedding.injective + calc + upperEmbedding + (algebraMap L L' + ((AlgEquiv.restrictNormalHom L + (AlgEquiv.restrictScalarsHom K + (phiUpper tauUpper))) z)) = + upperEmbedding + (phiUpper tauUpper (algebraMap L L' z)) := by + exact congrArg upperEmbedding + (AlgEquiv.restrictNormal_commutes + (AlgEquiv.restrictScalarsHom K + (phiUpper tauUpper)) L z) + _ = tauUpper + (upperEmbedding (algebraMap L L' z)) := + hUpperAction tauUpper (algebraMap L L' z) + _ = tauUpper + (algebraMap E E' (lowerEmbedding z)) := by + rw [hEmbedding] + _ = algebraMap E E' + (tauLower (lowerEmbedding z)) := by + exact + (AlgEquiv.restrictNormal_commutes + (AlgEquiv.restrictScalarsHom C tauUpper) + E (lowerEmbedding z)).symm + _ = algebraMap E E' + (lowerEmbedding (phiLower tauLower z)) := by + rw [hLowerAction] + _ = upperEmbedding + (algebraMap L L' (phiLower tauLower z)) := by + rw [hEmbedding] + +open scoped Classical in +/-- Restriction through the completed local square agrees with restriction of +the corresponding global decomposition-group automorphisms. -/ +theorem finitePlaceCrossDecompositionTransport + {K' L' : Type} + [Field K'] [NumberField K'] + [Field L'] [NumberField L'] + [NumberField L] + [Algebra K K'] [Algebra K' L'] [Algebra K L'] + [IsScalarTower K K' L'] + [Algebra L L'] [IsScalarTower K L L'] + [IsAbelianGalois K' L'] + (v : HeightOneSpectrum (𝓞 K)) + (W : HeightOneSpectrum (𝓞 K')) + (hW : finitePlaceBelow (K := K) W = v) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (w' : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K' W) L') + (hcentres : + finitePlaceBelow (K := L) + (finitePlaceExtensionCentre + (K := K') (L := L') W w') = + finitePlaceExtensionCentre + (K := K) (L := L) v w) + (tauUpper : finitePlaceArtinLocalizedAutomorphism K' L' W w') : + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) + (finitePlaceLocalToGlobalMonoidHom + (K := K') (L := L') W w' tauUpper) = + finitePlaceLocalToGlobalMonoidHom + (K := K) (L := L) v w + (finitePlaceCrossLocalRestrictionMonoidHom + (K := K) (L := L) (K' := K') (L' := L') + v W hW w w' hcentres tauUpper) := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let vK' := NumberField.HeightOneSpectrum.adicAbv K' W + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let hvK' : vK'.IsNontrivial := + RayClass.adicAbv_isNontrivial W + let C := vK.Completion + let D := vK'.Completion + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let E' := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK' w' + let : Algebra C E := + finitePlaceLocalArtinLocalizedAlgebra (K := K) (L := L) v w + let : Algebra D E' := + finitePlaceLocalArtinLocalizedAlgebra (K := K') (L := L') W w' + let : Algebra K E := + LocalClassFieldTheory.localizedCompletionGlobalAlgebra vK w + let : Algebra K' E' := + LocalClassFieldTheory.localizedCompletionGlobalAlgebra vK' w' + let : Algebra C D := + (finitePlaceArtinRelativeCompletionRingHom + (K := K) (K' := K') v W hW).toAlgebra + let : Algebra E E' := + (finitePlaceArtinLocalizedCompletionRingHom + (K := K) (L := L) (K' := K') (L' := L') + v W w w' hcentres).toAlgebra + let : Algebra C E' := + ((algebraMap D E').comp (algebraMap C D)).toAlgebra + let : IsScalarTower C D E' := + IsScalarTower.of_algebraMap_eq' rfl + let : IsScalarTower C E E' := + IsScalarTower.of_algebraMap_eq' <| by + apply RingHom.ext + intro x + exact + finitePlaceArtinLocalizedCompletion_towerPoint + (K := K) (L := L) (K' := K') (L' := L') + v W hW w w' hcentres x + let : FiniteDimensional C E := + finitePlaceLocalArtinFiniteDimensional (K := K) (L := L) v w + let : IsAbelianGalois C E := + finitePlaceLocalArtinIsAbelianGalois (K := K) (L := L) v w + (inferInstance : FiniteDimensional K L) + let hGaloisE : IsGalois C E := + (inferInstance : IsAbelianGalois C E).toIsGalois + let : Normal C E := hGaloisE.to_normal + let eLower : + absoluteValueDecompositionGroup K w.1 ≃* + (E ≃ₐ[C] E) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w + let eUpper : + absoluteValueDecompositionGroup K' w'.1 ≃* + (E' ≃ₐ[D] E') := + decompositionGroupEquivAlgebraicLocalizationAut + vK' hvK' w' + let lowerEmbedding : L →+* E := + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + let upperEmbedding : L' →+* E' := + AbsoluteValue.toAlgebraicLocalization vK' w'.1 w'.2 + have hEmbedding (x : L) : + algebraMap E E' (lowerEmbedding x) = + upperEmbedding (algebraMap L L' x) := by + exact + finitePlaceArtinLocalizedCompletion_globalEmbedding + (K := K) (L := L) (K' := K') (L' := L') + v W w w' hcentres x + have hUpperAction + (tau : E' ≃ₐ[D] E') (z : L') : + upperEmbedding + (((eUpper.symm tau).1 : L' ≃ₐ[K'] L') z) = + tau (upperEmbedding z) := by + exact + finitePlaceDecompositionEquiv_symm_action + vK' hvK' w' tau z + have hLowerAction + (tau : E ≃ₐ[C] E) (z : L) : + tau (lowerEmbedding z) = + lowerEmbedding + (((eLower.symm tau).1 : L ≃ₐ[K] L) z) := by + exact + (finitePlaceDecompositionEquiv_symm_action + vK hvK w tau z).symm + change + ((AlgEquiv.restrictNormalHom L) + ((AlgEquiv.restrictScalarsHom K) + ((eUpper.symm tauUpper).1 : L' ≃ₐ[K'] L'))) = + ((eLower.symm + (AlgEquiv.restrictNormalHom E + ((AlgEquiv.restrictScalarsHom C) tauUpper))).1 : + L ≃ₐ[K] L) + exact + finitePlaceCrossDecompositionTransport_core + (fun tau => ((eLower.symm tau).1 : L ≃ₐ[K] L)) + (fun tau => ((eUpper.symm tau).1 : L' ≃ₐ[K'] L')) + lowerEmbedding upperEmbedding hEmbedding + hUpperAction hLowerAction tauUpper + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/NormRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/NormRestriction.lean new file mode 100644 index 0000000000..6bc2c3ac3e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/NormRestriction.lean @@ -0,0 +1,1325 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.CrossLocalRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.NormRestriction +/-! +# Norm--restriction for finite-place Artin homomorphisms + +This module proves norm--restriction naturality for finite-place Artin maps in an actual square +of number fields and their chosen completed local extensions. +-/ + +@[expose] public section + +open scoped IsMulCommutative NNReal NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory + +variable {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + +open scoped Classical in +private theorem finitePlaceArtinNormUnits_map_ringEquiv + {F M F' M' : Type} + [Field F] [Field M] [Field F'] [Field M'] + [Algebra F M] [Algebra F' M'] + (eF : F ≃+* F') (eM : M ≃+* M') + (he : + RingHom.comp (algebraMap F' M') eF = + RingHom.comp eM (algebraMap F M)) + (x : Mˣ) : + Units.mapEquiv eF.toMulEquiv + (LocalFieldTheory.normUnits F M x) = + LocalFieldTheory.normUnits F' M' + (Units.mapEquiv eM.toMulEquiv x) := by + apply Units.ext + change + eF (Algebra.norm F (x : M)) = + Algebra.norm F' (eM (x : M)) + rw [Algebra.norm_eq_of_equiv_equiv eF eM he] + exact eF.apply_symm_apply _ + +open scoped Classical in +private abbrev finitePlaceNormCompletion + (F : Type) [Field F] [NumberField F] + (v : HeightOneSpectrum (𝓞 F)) := + (NumberField.HeightOneSpectrum.adicAbv F v).Completion + +open scoped Classical in +private abbrev finitePlaceNormLocalizedCompletion + (F M : Type) [Field F] [Field M] [Algebra F M] + [NumberField F] + (v : HeightOneSpectrum (𝓞 F)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv F v) M) := + AlgebraicNumberTheory.Valuations.LocalizedCompletion + (NumberField.HeightOneSpectrum.adicAbv F v) w + +open scoped Classical in +private noncomputable def finitePlaceRelativeNormUnits + {K' : Type} + [Field K'] [NumberField K'] [Algebra K K'] + (v : HeightOneSpectrum (𝓞 K)) + (W : HeightOneSpectrum (𝓞 K')) + (hW : finitePlaceBelow (K := K) W = v) : + (finitePlaceNormCompletion K' W)ˣ →* + (finitePlaceNormCompletion K v)ˣ := by + letI : Algebra + (finitePlaceNormCompletion K v) + (finitePlaceNormCompletion K' W) := + (finitePlaceArtinRelativeCompletionRingHom + (K := K) (K' := K') v W hW).toAlgebra + exact LocalFieldTheory.normUnits + (finitePlaceNormCompletion K v) + (finitePlaceNormCompletion K' W) + +open scoped Classical in +private noncomputable def finitePlaceConcreteNormUnits + {K' : Type} + [Field K'] [NumberField K'] [Algebra K K'] + (v : HeightOneSpectrum (𝓞 K)) + (W : HeightOneSpectrum (𝓞 K')) + (hW : finitePlaceBelow (K := K) W = v) : + (W.adicCompletion K')ˣ →* (v.adicCompletion K)ˣ := by + letI : Algebra (v.adicCompletion K) (W.adicCompletion K') := + (finitePlaceAdicCompletionMap + K K' v ⟨W, hW⟩).toAlgebra + exact LocalFieldTheory.normUnits + (v.adicCompletion K) (W.adicCompletion K') + +open scoped Classical in +private theorem finitePlaceArtinConcreteNormUnits + {K' : Type} + [Field K'] [NumberField K'] [Algebra K K'] + (v : HeightOneSpectrum (𝓞 K)) + (W : HeightOneSpectrum (𝓞 K')) + (hW : finitePlaceBelow (K := K) W = v) + (x : (W.adicCompletion K')ˣ) : + finitePlaceCompletionUnitsContinuousMulEquiv v + (finitePlaceRelativeNormUnits + (K := K) (K' := K') v W hW + ((finitePlaceCompletionUnitsContinuousMulEquiv W).symm x)) = + finitePlaceConcreteNormUnits + (K := K) (K' := K') v W hW x := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let vK' := NumberField.HeightOneSpectrum.adicAbv K' W + let C := vK.Completion + let D := vK'.Completion + let eC : + C ≃+* v.adicCompletion K := + (relativeFinitePlaceCompletionAlgEquiv v).toRingEquiv + let eD : + D ≃+* W.adicCompletion K' := + (relativeFinitePlaceCompletionAlgEquiv W).toRingEquiv + let eCUnits : + Cˣ ≃* (v.adicCompletion K)ˣ := + finitePlaceCompletionUnitsContinuousMulEquiv v + let eDUnits : + Dˣ ≃* (W.adicCompletion K')ˣ := + finitePlaceCompletionUnitsContinuousMulEquiv W + have hCUnits : + eCUnits = Units.mapEquiv eC.toMulEquiv := by + change + Units.mapEquiv + (finitePlaceCompletionRingEquiv v).toMulEquiv = + Units.mapEquiv eC.toMulEquiv + rw [finitePlaceCompletionRingEquiv_eq_relative] + have hDUnits : + eDUnits = Units.mapEquiv eD.toMulEquiv := by + change + Units.mapEquiv + (finitePlaceCompletionRingEquiv W).toMulEquiv = + Units.mapEquiv eD.toMulEquiv + rw [finitePlaceCompletionRingEquiv_eq_relative] + let concreteBaseMap : + v.adicCompletion K →+* W.adicCompletion K' := + finitePlaceAdicCompletionMap K K' v ⟨W, hW⟩ + let : Algebra (v.adicCompletion K) (W.adicCompletion K') := + concreteBaseMap.toAlgebra + let : Algebra C D := + (finitePlaceArtinRelativeCompletionRingHom + (K := K) (K' := K') v W hW).toAlgebra + have hBaseMap (y : C) : + eD (algebraMap C D y) = + concreteBaseMap (eC y) := by + change + eD (eD.symm (concreteBaseMap (eC y))) = + concreteBaseMap (eC y) + rw [eD.apply_symm_apply] + have hBaseCompatible : + RingHom.comp + (algebraMap + (v.adicCompletion K) (W.adicCompletion K')) + eC = + RingHom.comp eD (algebraMap C D) := by + apply RingHom.ext + intro y + exact (hBaseMap y).symm + change + eCUnits + (LocalFieldTheory.normUnits C D + (eDUnits.symm x)) = + LocalFieldTheory.normUnits + (v.adicCompletion K) (W.adicCompletion K') x + rw [hCUnits, hDUnits] + calc + Units.mapEquiv eC.toMulEquiv + (LocalFieldTheory.normUnits C D + (Units.mapEquiv eD.symm.toMulEquiv x)) = + LocalFieldTheory.normUnits + (v.adicCompletion K) (W.adicCompletion K') + (Units.mapEquiv eD.toMulEquiv + (Units.mapEquiv eD.symm.toMulEquiv x)) := + finitePlaceArtinNormUnits_map_ringEquiv + eC eD hBaseCompatible + (Units.mapEquiv eD.symm.toMulEquiv x) + _ = + LocalFieldTheory.normUnits + (v.adicCompletion K) (W.adicCompletion K') x := by + congr 1 + change + (Units.mapEquiv eD.toMulEquiv) + ((Units.mapEquiv eD.toMulEquiv).symm x) = x + exact (Units.mapEquiv eD.toMulEquiv).apply_symm_apply x + +open scoped Classical in +private theorem finitePlaceArtinHasExtension_of_norm + {A B C D : Type} + [NormedField A] [NormedField B] + [NormedField C] [NormedField D] + [Algebra C D] + [Valued C ℝ≥0] [Valued D ℝ≥0] + [ValuativeRel C] [ValuativeRel D] + [(Valued.v : Valuation C ℝ≥0).Compatible] + [(Valued.v : Valuation D ℝ≥0).Compatible] + (eC : C ≃+* A) (eD : D ≃+* B) + (baseMap : A →+* B) + (hAlgebraMap : ∀ x : C, + algebraMap C D x = + eD.symm (baseMap (eC x))) + (hDNorm : ∀ y : B, ‖eD.symm y‖ = ‖y‖) + (hCNorm : ∀ x : C, ‖eC x‖ = ‖x‖) + (hBaseNorm : ∀ x : A, + ‖baseMap x‖ ≤ 1 ↔ ‖x‖ ≤ 1) + (hDValuation : ∀ x : D, + (Valued.v : Valuation D ℝ≥0) x = ‖x‖₊) + (hCValuation : ∀ x : C, + (Valued.v : Valuation C ℝ≥0) x = ‖x‖₊) : + (ValuativeRel.valuation C).HasExtension + (ValuativeRel.valuation D) := by + let vC : Valuation C ℝ≥0 := Valued.v + let vD : Valuation D ℝ≥0 := Valued.v + apply Valuation.HasExtension.ofComapInteger + ext x + simp only [Subring.mem_comap, Valuation.mem_integer_iff] + rw [ + ← (ValuativeRel.valuation D).vle_one_iff, + vD.vle_one_iff, + ← (ValuativeRel.valuation C).vle_one_iff, + vC.vle_one_iff] + rw [hDValuation, hCValuation] + have hTargetNorm : + ‖algebraMap C D x‖ = + ‖baseMap (eC x)‖ := by + rw [hAlgebraMap] + exact hDNorm (baseMap (eC x)) + have hTargetNormNN : + ‖algebraMap C D x‖₊ = + ‖baseMap (eC x)‖₊ := by + apply NNReal.eq + exact hTargetNorm + have hSourceNormNN : + ‖eC x‖₊ = ‖x‖₊ := by + apply NNReal.eq + exact hCNorm x + rw [hTargetNormNN, ← hSourceNormNN] + exact_mod_cast hBaseNorm (eC x) + +open scoped Classical in +private theorem finitePlaceArtinCompletionHasExtension + {K' : Type} + [Field K'] [NumberField K'] [Algebra K K'] + (v : HeightOneSpectrum (𝓞 K)) + (W : HeightOneSpectrum (𝓞 K')) + (hW : finitePlaceBelow (K := K) W = v) : + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let vK' := NumberField.HeightOneSpectrum.adicAbv K' W + let C := vK.Completion + let D := vK'.Completion + let hvKna : IsNonarchimedean (vK : K → ℝ) := + NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K v + let hvK'na : IsNonarchimedean (vK' : K' → ℝ) := + NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K' W + letI : IsUltrametricDist C := + finitePlaceArtinCompletionIsUltrametricDist vK hvKna + letI : Valued C ℝ≥0 := + finitePlaceArtinCompletionValued vK hvKna + letI : ValuativeRel C := + finitePlaceArtinCompletionValuativeRel vK hvKna + let vC : Valuation C ℝ≥0 := Valued.v + letI : vC.Compatible := + Valuation.Compatible.ofValuation vC + letI : IsUltrametricDist D := + finitePlaceArtinCompletionIsUltrametricDist vK' hvK'na + letI : Valued D ℝ≥0 := + finitePlaceArtinCompletionValued vK' hvK'na + letI : ValuativeRel D := + finitePlaceArtinCompletionValuativeRel vK' hvK'na + let vD : Valuation D ℝ≥0 := Valued.v + letI : vD.Compatible := + Valuation.Compatible.ofValuation vD + letI : Algebra C D := + (finitePlaceArtinRelativeCompletionRingHom + (K := K) (K' := K') v W hW).toAlgebra + (ValuativeRel.valuation C).HasExtension + (ValuativeRel.valuation D) := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let vK' := NumberField.HeightOneSpectrum.adicAbv K' W + let C := vK.Completion + let D := vK'.Completion + let eC : + C ≃+* v.adicCompletion K := + (relativeFinitePlaceCompletionAlgEquiv v).toRingEquiv + let eD : + D ≃+* W.adicCompletion K' := + (relativeFinitePlaceCompletionAlgEquiv W).toRingEquiv + let concreteBaseMap : + v.adicCompletion K →+* W.adicCompletion K' := + finitePlaceAdicCompletionMap K K' v ⟨W, hW⟩ + let : Algebra (v.adicCompletion K) (W.adicCompletion K') := + concreteBaseMap.toAlgebra + let : Algebra C D := + (finitePlaceArtinRelativeCompletionRingHom + (K := K) (K' := K') v W hW).toAlgebra + let hvKna : IsNonarchimedean (vK : K → ℝ) := + NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K v + let : IsUltrametricDist C := + finitePlaceArtinCompletionIsUltrametricDist vK hvKna + let : Valued C ℝ≥0 := + finitePlaceArtinCompletionValued vK hvKna + let vC : Valuation C ℝ≥0 := Valued.v + let : ValuativeRel C := + finitePlaceArtinCompletionValuativeRel vK hvKna + let : vC.Compatible := + Valuation.Compatible.ofValuation vC + let hvK'na : IsNonarchimedean (vK' : K' → ℝ) := + NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K' W + let : IsUltrametricDist D := + finitePlaceArtinCompletionIsUltrametricDist vK' hvK'na + let : Valued D ℝ≥0 := + finitePlaceArtinCompletionValued vK' hvK'na + let vD : Valuation D ℝ≥0 := Valued.v + let : ValuativeRel D := + finitePlaceArtinCompletionValuativeRel vK' hvK'na + let : vD.Compatible := + Valuation.Compatible.ofValuation vD + exact + finitePlaceArtinHasExtension_of_norm + eC eD concreteBaseMap + (by intro x; rfl) + (relativeFinitePlaceCompletionAlgEquiv_symm_norm W) + (fun x => + (relativeFinitePlaceCompletionRingHom_isometry + v).norm_map_of_map_zero + (map_zero + (relativeFinitePlaceCompletionRingHom v)) x) + (finitePlaceAdicCompletionMap_norm_le_one_iff + K K' v ⟨W, hW⟩) + (fun _ => rfl) + (fun _ => rfl) + +open scoped Classical in +private theorem finitePlaceLocalArtin_norm_restriction_apply + {C D E E' : Type} + [Field C] [ValuativeRel C] [TopologicalSpace C] + [IsNonarchimedeanLocalField C] + [Field D] [ValuativeRel D] [TopologicalSpace D] + [IsNonarchimedeanLocalField D] + [Field E] [Field E'] + [Algebra C D] [Algebra C E] [Algebra C E'] + [Algebra D E'] [Algebra E E'] + [IsScalarTower C D E'] [IsScalarTower C E E'] + [FiniteDimensional C D] [Algebra.IsSeparable C D] + [Valuation.HasExtension + (ValuativeRel.valuation C) (ValuativeRel.valuation D)] + [FiniteDimensional C E] [IsAbelianGalois C E] + [FiniteDimensional D E'] [IsAbelianGalois D E'] + (y : Dˣ) : + AlgEquiv.restrictNormalHom E + ((AlgEquiv.restrictScalarsHom C) + (LocalClassFieldTheory.abelianLocalArtinMonoidHom + D E' y)) = + LocalClassFieldTheory.abelianLocalArtinMonoidHom C E + (LocalFieldTheory.normUnits C D y) := + DFunLike.congr_fun + (LocalClassFieldTheory.abelianLocalArtinMonoidHom_norm_restriction + C D E E') y + +open scoped Classical in +private abbrev finitePlaceNormLocalizedAut + (F M : Type) [Field F] [Field M] [Algebra F M] + [NumberField F] + (v : HeightOneSpectrum (𝓞 F)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv F v) M) := + let vF := NumberField.HeightOneSpectrum.adicAbv F v + letI hwF := + AbsoluteValue.extensionCompletionAlgebra + (K := F) w.1 + letI : SMul F w.1.Completion := hwF.toSMul + letI : Algebra vF.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vF w.1 w.2 + let E := + AlgebraicNumberTheory.Valuations.LocalizedCompletion vF w + E ≃ₐ[vF.Completion] E + +section FinitePlaceNormRestrictionInstances + +variable {K' L' : Type} + [Field K'] [NumberField K'] + [Field L'] [NumberField L'] + [Algebra K K'] [Algebra K' L'] [Algebra K L'] + [IsScalarTower K K' L'] + [Algebra L L'] [IsScalarTower K L L'] + [IsAbelianGalois K' L'] + (v : HeightOneSpectrum (𝓞 K)) + (W : HeightOneSpectrum (𝓞 K')) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (w' : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K' W) L') + +local notation "vKₙ" => + NumberField.HeightOneSpectrum.adicAbv K v +local notation "vKₙ'" => + NumberField.HeightOneSpectrum.adicAbv K' W +local notation "Cₙ" => + finitePlaceNormCompletion K v +local notation "Dₙ" => + finitePlaceNormCompletion K' W +local notation "Eₙ" => + finitePlaceNormLocalizedCompletion K L v w +local notation "Eₙ'" => + finitePlaceNormLocalizedCompletion K' L' W w' + +open scoped Classical in +/-- The lower extended completion is an algebra over the lower global base field. -/ +local instance finitePlaceNormLowerExtensionAlgebra : + Algebra K w.1.Completion := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + +attribute [local instance] finitePlaceNormLowerExtensionAlgebra + +open scoped Classical in +/-- The lower global base field acts on the lower extended completion. -/ +local instance finitePlaceNormLowerExtensionSMul : + SMul K w.1.Completion := + (finitePlaceNormLowerExtensionAlgebra v w).toSMul + +attribute [local instance] finitePlaceNormLowerExtensionSMul + +open scoped Classical in +/-- The lower extended completion is an algebra over the lower base-place completion. -/ +local instance finitePlaceNormLowerCompletionAlgebra : + Algebra Cₙ w.1.Completion := + AbsoluteValue.completionAlgebra vKₙ w.1 w.2 + +attribute [local instance] finitePlaceNormLowerCompletionAlgebra + +open scoped Classical in +/-- The lower localized completion is an algebra over the lower global base field. -/ +local instance finitePlaceNormLowerGlobalAlgebra : + Algebra K Eₙ := + LocalClassFieldTheory.localizedCompletionGlobalAlgebra vKₙ w + +attribute [local instance] finitePlaceNormLowerGlobalAlgebra + +open scoped Classical in +/-- The upper extended completion is an algebra over the upper global base field. -/ +local instance finitePlaceNormUpperExtensionAlgebra : + Algebra K' w'.1.Completion := + AbsoluteValue.extensionCompletionAlgebra + (K := K') w'.1 + +attribute [local instance] finitePlaceNormUpperExtensionAlgebra + +open scoped Classical in +/-- The upper global base field acts on the upper extended completion. -/ +local instance finitePlaceNormUpperExtensionSMul : + SMul K' w'.1.Completion := + (finitePlaceNormUpperExtensionAlgebra W w').toSMul + +attribute [local instance] finitePlaceNormUpperExtensionSMul + +open scoped Classical in +/-- The upper extended completion is an algebra over the upper base-place completion. -/ +local instance finitePlaceNormUpperCompletionAlgebra : + Algebra Dₙ w'.1.Completion := + AbsoluteValue.completionAlgebra vKₙ' w'.1 w'.2 + +attribute [local instance] finitePlaceNormUpperCompletionAlgebra + +open scoped Classical in +/-- The upper localized completion is an algebra over the upper global base field. -/ +local instance finitePlaceNormUpperGlobalAlgebra : + Algebra K' Eₙ' := + LocalClassFieldTheory.localizedCompletionGlobalAlgebra vKₙ' w' + +attribute [local instance] finitePlaceNormUpperGlobalAlgebra + +open scoped Classical in +/-- The lower base-place completion carries a nontrivial normed field structure. -/ +local instance finitePlaceNormLowerNontriviallyNormedField : + NontriviallyNormedField Cₙ := + absoluteValueExtensionCompletionNontriviallyNormedField + vKₙ (RayClass.adicAbv_isNontrivial v) + +attribute [local instance] finitePlaceNormLowerNontriviallyNormedField + +open scoped Classical in +local instance finitePlaceNormLowerLocallyCompactSpace : + LocallyCompactSpace Cₙ := + AbsoluteValue.Completion.locallyCompactSpace + (finitePlaceCompletionBaseMap_isometry v) + +attribute [local instance] finitePlaceNormLowerLocallyCompactSpace + +open scoped Classical in +/-- The upper base-place completion carries a nontrivial normed field structure. -/ +local instance finitePlaceNormUpperNontriviallyNormedField : + NontriviallyNormedField Dₙ := + absoluteValueExtensionCompletionNontriviallyNormedField + vKₙ' (RayClass.adicAbv_isNontrivial W) + +attribute [local instance] finitePlaceNormUpperNontriviallyNormedField + +open scoped Classical in +local instance finitePlaceNormUpperLocallyCompactSpace : + LocallyCompactSpace Dₙ := + AbsoluteValue.Completion.locallyCompactSpace + (finitePlaceCompletionBaseMap_isometry W) + +attribute [local instance] finitePlaceNormUpperLocallyCompactSpace + +open scoped Classical in +local instance finitePlaceNormLowerLocalizedFiniteDimensional : + FiniteDimensional Cₙ Eₙ := + AlgebraicNumberTheory.Valuations.localizedCompletionModuleFinite + vKₙ (RayClass.adicAbv_isNontrivial v) w + +attribute [local instance] finitePlaceNormLowerLocalizedFiniteDimensional + +open scoped Classical in +local instance finitePlaceNormLowerLocalizedAbelianGalois : + IsAbelianGalois Cₙ Eₙ := + LocalClassFieldTheory.localizedCompletion_isAbelianGalois + vKₙ (RayClass.adicAbv_isNontrivial v) w + +attribute [local instance] finitePlaceNormLowerLocalizedAbelianGalois + +open scoped Classical in +local instance finitePlaceNormUpperLocalizedFiniteDimensional : + FiniteDimensional Dₙ Eₙ' := + AlgebraicNumberTheory.Valuations.localizedCompletionModuleFinite + vKₙ' (RayClass.adicAbv_isNontrivial W) w' + +attribute [local instance] finitePlaceNormUpperLocalizedFiniteDimensional + +open scoped Classical in +local instance finitePlaceNormUpperLocalizedAbelianGalois : + IsAbelianGalois Dₙ Eₙ' := + LocalClassFieldTheory.localizedCompletion_isAbelianGalois + vKₙ' (RayClass.adicAbv_isNontrivial W) w' + +attribute [local instance] finitePlaceNormUpperLocalizedAbelianGalois + +open scoped Classical in +local instance finitePlaceNormLowerUltrametric : + IsUltrametricDist Cₙ := + finitePlaceArtinCompletionIsUltrametricDist vKₙ + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K v) + +attribute [local instance] finitePlaceNormLowerUltrametric + +open scoped Classical in +/-- The lower base-place completion carries the nonnegative-real valuation used in local +reciprocity. -/ +local instance finitePlaceNormLowerValued : + Valued Cₙ ℝ≥0 := + finitePlaceArtinCompletionValued vKₙ + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K v) + +attribute [local instance] finitePlaceNormLowerValued + +open scoped Classical in +private theorem finitePlaceNormLowerValued_apply (x : Cₙ) : + (Valued.v : Valuation Cₙ ℝ≥0) x = ‖x‖₊ := rfl + +open scoped Classical in +local instance finitePlaceNormLowerValuationNontrivial : + (Valued.v : Valuation Cₙ ℝ≥0).IsNontrivial := + (inferInstance : + (NormedField.valuation (K := Cₙ)).IsNontrivial) + +attribute [local instance] finitePlaceNormLowerValuationNontrivial + +open scoped Classical in +/-- The lower base-place completion carries the valuative relation used in local reciprocity. -/ +local instance finitePlaceNormLowerValuativeRel : + ValuativeRel Cₙ := + finitePlaceArtinCompletionValuativeRel vKₙ + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K v) + +attribute [local instance] finitePlaceNormLowerValuativeRel + +open scoped Classical in +local instance finitePlaceNormLowerValuationCompatible : + (Valued.v : Valuation Cₙ ℝ≥0).Compatible := + Valuation.Compatible.ofValuation + (Valued.v : Valuation Cₙ ℝ≥0) + +attribute [local instance] finitePlaceNormLowerValuationCompatible + +open scoped Classical in +local instance finitePlaceNormLowerValuativeRelNontrivial : + ValuativeRel.IsNontrivial Cₙ := + (ValuativeRel.isNontrivial_iff_isNontrivial + (Valued.v : Valuation Cₙ ℝ≥0)).2 inferInstance + +attribute [local instance] finitePlaceNormLowerValuativeRelNontrivial + +open scoped Classical in +local instance finitePlaceNormLowerLocalField : + IsNonarchimedeanLocalField Cₙ := + finitePlaceArtinCompletionIsNonarchimedeanLocalField vKₙ + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K v) + +attribute [local instance] finitePlaceNormLowerLocalField + +open scoped Classical in +local instance finitePlaceNormUpperUltrametric : + IsUltrametricDist Dₙ := + finitePlaceArtinCompletionIsUltrametricDist vKₙ' + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K' W) + +attribute [local instance] finitePlaceNormUpperUltrametric + +open scoped Classical in +/-- The upper base-place completion carries the nonnegative-real valuation used in local +reciprocity. -/ +local instance finitePlaceNormUpperValued : + Valued Dₙ ℝ≥0 := + finitePlaceArtinCompletionValued vKₙ' + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K' W) + +attribute [local instance] finitePlaceNormUpperValued + +open scoped Classical in +local instance finitePlaceNormUpperValuationNontrivial : + (Valued.v : Valuation Dₙ ℝ≥0).IsNontrivial := + (inferInstance : + (NormedField.valuation (K := Dₙ)).IsNontrivial) + +attribute [local instance] finitePlaceNormUpperValuationNontrivial + +open scoped Classical in +/-- The upper base-place completion carries the valuative relation used in local reciprocity. -/ +local instance finitePlaceNormUpperValuativeRel : + ValuativeRel Dₙ := + finitePlaceArtinCompletionValuativeRel vKₙ' + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K' W) + +attribute [local instance] finitePlaceNormUpperValuativeRel + +open scoped Classical in +local instance finitePlaceNormUpperValuationCompatible : + (Valued.v : Valuation Dₙ ℝ≥0).Compatible := + Valuation.Compatible.ofValuation + (Valued.v : Valuation Dₙ ℝ≥0) + +attribute [local instance] finitePlaceNormUpperValuationCompatible + +open scoped Classical in +local instance finitePlaceNormUpperValuativeRelNontrivial : + ValuativeRel.IsNontrivial Dₙ := + (ValuativeRel.isNontrivial_iff_isNontrivial + (Valued.v : Valuation Dₙ ℝ≥0)).2 inferInstance + +attribute [local instance] finitePlaceNormUpperValuativeRelNontrivial + +open scoped Classical in +local instance finitePlaceNormUpperLocalField : + IsNonarchimedeanLocalField Dₙ := + finitePlaceArtinCompletionIsNonarchimedeanLocalField vKₙ' + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K' W) + +attribute [local instance] finitePlaceNormUpperLocalField + +open scoped Classical in +private noncomputable def finitePlaceNormRestrictedArtin + [NumberField L] + (hW : finitePlaceBelow (K := K) W = v) + (hcentres : + finitePlaceBelow (K := L) + (finitePlaceExtensionCentre + (K := K') (L := L') W w') = + finitePlaceExtensionCentre + (K := K) (L := L) v w) + (y : Dₙˣ) : + finitePlaceNormLocalizedAut K L v w := by + exact + finitePlaceCrossLocalRestrictionMonoidHom + (K := K) (L := L) (K' := K') (L' := L') + v W hW w w' hcentres + (finitePlaceLocalArtinMonoidHom + (K := K') (L := L') W w' + (finitePlaceCompletionUnitsContinuousMulEquiv W y)) + +open scoped Classical in +private noncomputable def finitePlaceNormLowerArtin + (hW : finitePlaceBelow (K := K) W = v) + (y : Dₙˣ) : + finitePlaceNormLocalizedAut K L v w := by + exact + finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v w + (finitePlaceCompletionUnitsContinuousMulEquiv v + (finitePlaceRelativeNormUnits + (K := K) (K' := K') v W hW y)) + +open scoped Classical in +private noncomputable def finitePlaceNormUpperRawArtin + (y : Dₙˣ) : + finitePlaceNormLocalizedAut K' L' W w' := + LocalClassFieldTheory.abelianLocalArtinMonoidHom + Dₙ Eₙ' y + +open scoped Classical in +private noncomputable def finitePlaceNormLowerRawArtin + (hW : finitePlaceBelow (K := K) W = v) + (y : Dₙˣ) : + finitePlaceNormLocalizedAut K L v w := + LocalClassFieldTheory.abelianLocalArtinMonoidHom + Cₙ Eₙ + (finitePlaceRelativeNormUnits + (K := K) (K' := K') v W hW y) + +open scoped Classical in +private theorem finitePlaceNormUpperArtin_eq_raw + (y : Dₙˣ) : + finitePlaceLocalArtinMonoidHom + (K := K') (L := L') W w' + (finitePlaceCompletionUnitsContinuousMulEquiv W y) = + finitePlaceNormUpperRawArtin + (K' := K') (L' := L') W w' y := by + rw [ + finitePlaceLocalArtinMonoidHom_apply + (K := K') (L := L') W w' + (finitePlaceCompletionUnitsContinuousMulEquiv W y)] + have hy : + (↑(finitePlaceCompletionUnitsContinuousMulEquiv W) : + Dₙˣ ≃* (W.adicCompletion K')ˣ).symm + (finitePlaceCompletionUnitsContinuousMulEquiv W y) = + y := + (finitePlaceCompletionUnitsContinuousMulEquiv W).symm_apply_apply y + rw [hy] + rfl + +open scoped Classical in +private theorem finitePlaceNormLowerArtin_eq_raw + (hW : finitePlaceBelow (K := K) W = v) + (y : Dₙˣ) : + finitePlaceNormLowerArtin + (K := K) (L := L) (K' := K') + v W w hW y = + finitePlaceNormLowerRawArtin + (K := K) (L := L) (K' := K') + v W w hW y := by + unfold finitePlaceNormLowerArtin + rw [ + finitePlaceLocalArtinMonoidHom_apply + (K := K) (L := L) v w + (finitePlaceCompletionUnitsContinuousMulEquiv v + (finitePlaceRelativeNormUnits + (K := K) (K' := K') v W hW y))] + have hy : + (↑(finitePlaceCompletionUnitsContinuousMulEquiv v) : + Cₙˣ ≃* (v.adicCompletion K)ˣ).symm + (finitePlaceCompletionUnitsContinuousMulEquiv v + (finitePlaceRelativeNormUnits + (K := K) (K' := K') v W hW y)) = + finitePlaceRelativeNormUnits + (K := K) (K' := K') v W hW y := + (finitePlaceCompletionUnitsContinuousMulEquiv v).symm_apply_apply _ + rw [hy] + rfl + +open scoped Classical in +private theorem finitePlaceNormRawArtin_naturality + [NumberField L] + (hW : finitePlaceBelow (K := K) W = v) + (hcentres : + finitePlaceBelow (K := L) + (finitePlaceExtensionCentre + (K := K') (L := L') W w') = + finitePlaceExtensionCentre + (K := K) (L := L) v w) + (y : Dₙˣ) : + finitePlaceCrossLocalRestrictionMonoidHom + (K := K) (L := L) (K' := K') (L' := L') + v W hW w w' hcentres + (finitePlaceNormUpperRawArtin + (K' := K') (L' := L') W w' y) = + finitePlaceNormLowerRawArtin + (K := K) (L := L) (K' := K') + v W w hW y := by + let C := finitePlaceNormCompletion K v + let D := finitePlaceNormCompletion K' W + let E := finitePlaceNormLocalizedCompletion K L v w + let E' := finitePlaceNormLocalizedCompletion K' L' W w' + let : Algebra C D := + (finitePlaceArtinRelativeCompletionRingHom + (K := K) (K' := K') v W hW).toAlgebra + let : ContinuousSMul C D := + continuousSMul_of_algebraMap C D <| + finitePlaceArtinRelativeCompletionRingHom_continuous + (K := K) (K' := K') v W hW + let : FiniteDimensional C D := + FiniteDimensional.of_locallyCompactSpace C + let : CharZero C := + charZero_of_injective_algebraMap + (algebraMap K C).injective + let : Algebra.IsIntegral C D := + Algebra.IsIntegral.of_finite C D + let : Algebra.IsSeparable C D := + Algebra.IsSeparable.of_integral C D + let : Algebra E E' := + (finitePlaceArtinLocalizedCompletionRingHom + (K := K) (L := L) (K' := K') (L' := L') + v W w w' hcentres).toAlgebra + let : Algebra C E' := + ((algebraMap D E').comp (algebraMap C D)).toAlgebra + let : IsScalarTower C D E' := + IsScalarTower.of_algebraMap_eq' rfl + let : IsScalarTower C E E' := + IsScalarTower.of_algebraMap_eq' <| by + apply RingHom.ext + intro x + exact + finitePlaceArtinLocalizedCompletion_towerPoint + (K := K) (L := L) (K' := K') (L' := L') + v W hW w w' hcentres x + let : + (ValuativeRel.valuation C).HasExtension + (ValuativeRel.valuation D) := + finitePlaceArtinCompletionHasExtension + (K := K) (K' := K') v W hW + let hGaloisE : IsGalois C E := + (inferInstance : IsAbelianGalois C E).toIsGalois + let : Normal C E := hGaloisE.to_normal + unfold finitePlaceNormUpperRawArtin + unfold finitePlaceNormLowerRawArtin + change + AlgEquiv.restrictNormalHom E + ((AlgEquiv.restrictScalarsHom C) + (LocalClassFieldTheory.abelianLocalArtinMonoidHom + D E' y)) = + LocalClassFieldTheory.abelianLocalArtinMonoidHom C E + (LocalFieldTheory.normUnits C D y) + exact finitePlaceLocalArtin_norm_restriction_apply y + +open scoped Classical in +private theorem finitePlaceNormLocalizedArtin_naturality + [NumberField L] + (hW : finitePlaceBelow (K := K) W = v) + (hcentres : + finitePlaceBelow (K := L) + (finitePlaceExtensionCentre + (K := K') (L := L') W w') = + finitePlaceExtensionCentre + (K := K) (L := L) v w) + (y : Dₙˣ) : + finitePlaceNormRestrictedArtin + (K := K) (L := L) (K' := K') (L' := L') + v W w w' hW hcentres y = + finitePlaceNormLowerArtin + (K := K) (L := L) (K' := K') + v W w hW y := by + calc + _ = + finitePlaceCrossLocalRestrictionMonoidHom + (K := K) (L := L) (K' := K') (L' := L') + v W hW w w' hcentres + (finitePlaceNormUpperRawArtin + (K' := K') (L' := L') W w' y) := by + unfold finitePlaceNormRestrictedArtin + exact congrArg + (finitePlaceCrossLocalRestrictionMonoidHom + (K := K) (L := L) (K' := K') (L' := L') + v W hW w w' hcentres) + (finitePlaceNormUpperArtin_eq_raw + (K' := K') (L' := L') W w' y) + _ = + finitePlaceNormLowerRawArtin + (K := K) (L := L) (K' := K') + v W w hW y := + finitePlaceNormRawArtin_naturality + (K := K) (L := L) (K' := K') (L' := L') + v W w w' hW hcentres y + _ = + finitePlaceNormLowerArtin + (K := K) (L := L) (K' := K') + v W w hW y := + (finitePlaceNormLowerArtin_eq_raw + (K := K) (L := L) (K' := K') + v W w hW y).symm + +open scoped Classical in +private theorem + finitePlaceLocalArtinMonoidHom_norm_restriction_localized + {K' L' : Type} + [Field K'] [NumberField K'] + [Field L'] [NumberField L'] + [NumberField L] + [Algebra K K'] [Algebra K' L'] [Algebra K L'] + [IsScalarTower K K' L'] + [Algebra L L'] [IsScalarTower K L L'] + [IsAbelianGalois K' L'] + (v : HeightOneSpectrum (𝓞 K)) + (W : HeightOneSpectrum (𝓞 K')) + (hW : finitePlaceBelow (K := K) W = v) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (w' : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K' W) L') + (hcentres : + finitePlaceBelow (K := L) + (finitePlaceExtensionCentre + (K := K') (L := L') W w') = + finitePlaceExtensionCentre + (K := K) (L := L) v w) + (y : (finitePlaceNormCompletion K' W)ˣ) : + finitePlaceCrossLocalRestrictionMonoidHom + (K := K) (L := L) (K' := K') (L' := L') + v W hW w w' hcentres + (finitePlaceLocalArtinMonoidHom + (K := K') (L := L') W w' + (finitePlaceCompletionUnitsContinuousMulEquiv W y)) = + finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v w + (finitePlaceCompletionUnitsContinuousMulEquiv v + (finitePlaceRelativeNormUnits + (K := K) (K' := K') v W hW y)) := by + calc + _ = + finitePlaceNormRestrictedArtin + (K := K) (L := L) (K' := K') (L' := L') + v W w w' hW hcentres y := + rfl + _ = + finitePlaceNormLowerArtin + (K := K) (L := L) (K' := K') + v W w hW y := + finitePlaceNormLocalizedArtin_naturality + (K := K) (L := L) (K' := K') (L' := L') + v W w w' hW hcentres y + _ = _ := + rfl + +open scoped Classical in +/-- The local Artin maps attached to specified finite places commute +with the norm between their concrete adic completions. -/ +theorem finitePlaceLocalArtinMonoidHom_norm_restriction + {K' L' : Type} + [Field K'] [NumberField K'] + [Field L'] [NumberField L'] + [NumberField L] + [Algebra K K'] [Algebra K' L'] [Algebra K L'] + [IsScalarTower K K' L'] + [Algebra L L'] [IsScalarTower K L L'] + [IsAbelianGalois K' L'] + (v : HeightOneSpectrum (𝓞 K)) + (W : HeightOneSpectrum (𝓞 K')) + (hW : finitePlaceBelow (K := K) W = v) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (w' : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K' W) L') + (hcentres : + finitePlaceBelow (K := L) + (finitePlaceExtensionCentre + (K := K') (L := L') W w') = + finitePlaceExtensionCentre + (K := K) (L := L) v w) + (x : (W.adicCompletion K')ˣ) : + letI : Algebra (v.adicCompletion K) (W.adicCompletion K') := + (finitePlaceAdicCompletionMap + K K' v ⟨W, hW⟩).toAlgebra + finitePlaceCrossLocalRestrictionMonoidHom + (K := K) (L := L) (K' := K') (L' := L') + v W hW w w' hcentres + (finitePlaceLocalArtinMonoidHom + (K := K') (L := L') W w' x) = + finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v w + (LocalFieldTheory.normUnits + (v.adicCompletion K) (W.adicCompletion K') x) := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let vK' := NumberField.HeightOneSpectrum.adicAbv K' W + let C := vK.Completion + let D := vK'.Completion + let eCUnits : + Cˣ ≃* (v.adicCompletion K)ˣ := + finitePlaceCompletionUnitsContinuousMulEquiv v + let eDUnits : + Dˣ ≃* (W.adicCompletion K')ˣ := + finitePlaceCompletionUnitsContinuousMulEquiv W + let : Algebra (v.adicCompletion K) (W.adicCompletion K') := + (finitePlaceAdicCompletionMap + K K' v ⟨W, hW⟩).toAlgebra + let : Algebra C D := + (finitePlaceArtinRelativeCompletionRingHom + (K := K) (K' := K') v W hW).toAlgebra + calc + finitePlaceCrossLocalRestrictionMonoidHom + (K := K) (L := L) (K' := K') (L' := L') + v W hW w w' hcentres + (finitePlaceLocalArtinMonoidHom + (K := K') (L := L') W w' x) = + finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v w + (eCUnits + (finitePlaceRelativeNormUnits + (K := K) (K' := K') v W hW + (eDUnits.symm x))) := + by + have h := + finitePlaceLocalArtinMonoidHom_norm_restriction_localized + (K := K) (L := L) (K' := K') (L' := L') + v W hW w w' hcentres (eDUnits.symm x) + change + finitePlaceCrossLocalRestrictionMonoidHom + (K := K) (L := L) (K' := K') (L' := L') + v W hW w w' hcentres + (finitePlaceLocalArtinMonoidHom + (K := K') (L := L') W w' + (eDUnits (eDUnits.symm x))) = + finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v w + (eCUnits + (finitePlaceRelativeNormUnits + (K := K) (K' := K') v W hW + (eDUnits.symm x))) at h + rw [eDUnits.apply_symm_apply] at h + exact h + _ = + finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v w + (LocalFieldTheory.normUnits + (v.adicCompletion K) (W.adicCompletion K') x) := + congrArg + (finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v w) + (finitePlaceArtinConcreteNormUnits + (K := K) (K' := K') v W hW x) + +end FinitePlaceNormRestrictionInstances + +open scoped Classical in +/-- The local Artin map attached to specified finite places carries a +local norm to the restriction of the upper Artin element. -/ +theorem + finitePlaceArtinMonoidHomOfExtension_norm_restriction + {K' L' : Type} + [Field K'] [NumberField K'] + [Field L'] [NumberField L'] + [Algebra K K'] [Algebra K' L'] [Algebra K L'] + [IsScalarTower K K' L'] + [Algebra L L'] [IsScalarTower K L L'] + [IsAbelianGalois K' L'] + (v : HeightOneSpectrum (𝓞 K)) + (W : HeightOneSpectrum (𝓞 K')) + (hW : finitePlaceBelow (K := K) W = v) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (w' : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K' W) L') + (hcentres : + letI : NumberField L := + NumberField.of_module_finite K L + finitePlaceBelow (K := L) + (finitePlaceExtensionCentre + (K := K') (L := L') W w') = + finitePlaceExtensionCentre + (K := K) (L := L) v w) : + letI : Algebra (v.adicCompletion K) (W.adicCompletion K') := + (finitePlaceAdicCompletionMap + K K' v ⟨W, hW⟩).toAlgebra + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)).comp + (finitePlaceArtinMonoidHomOfExtension + (K := K') (L := L') W w') = + (finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v w).comp + (LocalFieldTheory.normUnits + (v.adicCompletion K) (W.adicCompletion K')) := by + let : NumberField L := NumberField.of_module_finite K L + let : Algebra (v.adicCompletion K) (W.adicCompletion K') := + (finitePlaceAdicCompletionMap + K K' v ⟨W, hW⟩).toAlgebra + let globalRestriction : + (L' ≃ₐ[K'] L') →* (L ≃ₐ[K] L) := + (AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K) + let localUpper := + finitePlaceLocalArtinMonoidHom + (K := K') (L := L') W w' + let localLower := + finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v w + let localRestriction := + finitePlaceCrossLocalRestrictionMonoidHom + (K := K) (L := L) (K' := K') (L' := L') + v W hW w w' hcentres + let norm := + LocalFieldTheory.normUnits + (v.adicCompletion K) (W.adicCompletion K') + calc + globalRestriction.comp + (finitePlaceArtinMonoidHomOfExtension + (K := K') (L := L') W w') = + globalRestriction.comp + ((finitePlaceLocalToGlobalMonoidHom + (K := K') (L := L') W w').comp localUpper) := + congrArg + (fun f => globalRestriction.comp f) + (finitePlaceArtinMonoidHomOfExtension_factor + (K := K') (L := L') W w') + _ = + (globalRestriction.comp + (finitePlaceLocalToGlobalMonoidHom + (K := K') (L := L') W w')).comp localUpper := by + rfl + _ = + ((finitePlaceLocalToGlobalMonoidHom + (K := K) (L := L) v w).comp + localRestriction).comp localUpper := + congrArg + (fun f : + finitePlaceNormLocalizedAut K' L' W w' →* + (L ≃ₐ[K] L) => + f.comp localUpper) + (by + apply MonoidHom.ext + intro tau + exact + finitePlaceCrossDecompositionTransport + (K := K) (L := L) (K' := K') (L' := L') + v W hW w w' hcentres tau) + _ = + (finitePlaceLocalToGlobalMonoidHom + (K := K) (L := L) v w).comp + (localRestriction.comp localUpper) := by + rfl + _ = + (finitePlaceLocalToGlobalMonoidHom + (K := K) (L := L) v w).comp + (localLower.comp norm) := + congrArg + (fun f => (finitePlaceLocalToGlobalMonoidHom + (K := K) (L := L) v w).comp f) + (by + apply MonoidHom.ext + intro x + exact + finitePlaceLocalArtinMonoidHom_norm_restriction + (K := K) (L := L) (K' := K') (L' := L') + v W hW w w' hcentres x) + _ = + ((finitePlaceLocalToGlobalMonoidHom + (K := K) (L := L) v w).comp localLower).comp norm := by + rfl + _ = + (finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v w).comp norm := + congrArg + (fun f => f.comp norm) + (finitePlaceArtinMonoidHomOfExtension_factor + (K := K) (L := L) v w).symm + +open scoped Classical in +/-- Finite-place norm--restriction compatibility. Restriction of the upper +local Artin +factor is the lower local Artin factor after the norm between the +corresponding concrete adic completions. -/ +theorem chosenFinitePlaceArtinMonoidHom_norm_restriction + {K' L' : Type} + [Field K'] [NumberField K'] + [Field L'] [NumberField L'] + [Algebra K K'] [Algebra K' L'] [Algebra K L'] + [IsScalarTower K K' L'] + [Algebra L L'] [IsScalarTower K L L'] + [IsAbelianGalois K' L'] + (W : HeightOneSpectrum (𝓞 K')) : + let v := finitePlaceBelow (K := K) W + letI : Algebra (v.adicCompletion K) (W.adicCompletion K') := + (finitePlaceAdicCompletionMap + K K' v ⟨W, rfl⟩).toAlgebra + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)).comp + (chosenFinitePlaceArtinMonoidHom + (K := K') (L := L') W) = + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).comp + (LocalFieldTheory.normUnits + (v.adicCompletion K) (W.adicCompletion K')) := by + let : NumberField L := NumberField.of_module_finite K L + dsimp only + let v := + finitePlaceBelow (K := K) W + let w' := + chosenFinitePlaceExtension + (L := L') W + let U' := + finitePlaceExtensionCentre + (K := K') (L := L') W w' + let U := + finitePlaceBelow (K := L) U' + have hUK : finitePlaceBelow (K := K) U = v := by + calc + finitePlaceBelow (K := K) U = + finitePlaceBelow (K := K) U' := by + exact + finitePlaceBelow_finitePlaceBelow + (K := K) (M := L) (L := L') U' + _ = + finitePlaceBelow (K := K) + (finitePlaceBelow (K := K') U') := by + symm + exact + finitePlaceBelow_finitePlaceBelow + (K := K) (M := K') (L := L') U' + _ = finitePlaceBelow (K := K) W := by + rw [ + finitePlaceBelow_finitePlaceExtensionCentre + (K := K') (L := L') W w'] + _ = v := rfl + let Uv : + {Q : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := K) Q = v} := + ⟨U, hUK⟩ + let w : + AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L := + (finitePlaceExtensionEquivAbove + (K := K) (L := L) v).symm Uv + have hwCentre : + finitePlaceExtensionCentre + (K := K) (L := L) v w = U := by + have h := + congrArg Subtype.val + ((finitePlaceExtensionEquivAbove + (K := K) (L := L) v).apply_symm_apply Uv) + simpa only [ + finitePlaceExtensionEquivAbove_coe + ] using h + let : Algebra (v.adicCompletion K) (W.adicCompletion K') := + (finitePlaceAdicCompletionMap + K K' v ⟨W, rfl⟩).toAlgebra + calc + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)).comp + (chosenFinitePlaceArtinMonoidHom + (K := K') (L := L') W) = + (finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v w).comp + (LocalFieldTheory.normUnits + (v.adicCompletion K) (W.adicCompletion K')) := by + exact + finitePlaceArtinMonoidHomOfExtension_norm_restriction + (K := K) (L := L) v W rfl w w' + (by + change + finitePlaceBelow (K := L) U' = + finitePlaceExtensionCentre + (K := K) (L := L) v w + rw [hwCentre]) + _ = + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).comp + (LocalFieldTheory.normUnits + (v.adicCompletion K) (W.adicCompletion K')) := by + change + (finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v w).comp + (LocalFieldTheory.normUnits + (v.adicCompletion K) (W.adicCompletion K')) = + (finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v + (chosenFinitePlaceExtension + (L := L) v)).comp + (LocalFieldTheory.normUnits + (v.adicCompletion K) (W.adicCompletion K')) + exact congrArg + (fun f : (v.adicCompletion K)ˣ →* (L ≃ₐ[K] L) => + f.comp + (LocalFieldTheory.normUnits + (v.adicCompletion K) (W.adicCompletion K'))) + (finitePlaceArtinMonoidHomOfExtension_eq + (K := K) (L := L) v w + (chosenFinitePlaceExtension + (L := L) v)) + +open scoped Classical in +/-- Finite-place norm--restriction with the lower place supplied +explicitly. This form keeps the equality proof in the completion +algebra and avoids dependent elimination through adic-completion +types. -/ +theorem chosenFinitePlaceArtinMonoidHom_norm_restriction_of_below_eq + {K' L' : Type} + [Field K'] [NumberField K'] + [Field L'] [NumberField L'] + [Algebra K K'] [Algebra K' L'] [Algebra K L'] + [IsScalarTower K K' L'] + [Algebra L L'] [IsScalarTower K L L'] + [IsAbelianGalois K' L'] + (v : HeightOneSpectrum (𝓞 K)) + (W : HeightOneSpectrum (𝓞 K')) + (hW : finitePlaceBelow (K := K) W = v) : + letI : Algebra (v.adicCompletion K) (W.adicCompletion K') := + (finitePlaceAdicCompletionMap + K K' v ⟨W, hW⟩).toAlgebra + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)).comp + (chosenFinitePlaceArtinMonoidHom + (K := K') (L := L') W) = + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).comp + (LocalFieldTheory.normUnits + (v.adicCompletion K) (W.adicCompletion K')) := by + subst v + exact + chosenFinitePlaceArtinMonoidHom_norm_restriction + (K := K) (L := L) (K' := K') (L' := L') W + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean new file mode 100644 index 0000000000..41d5b3b968 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean @@ -0,0 +1,805 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Conjugation +/-! +# Restriction in a finite-place Artin tower + +This module restricts finite-place extensions through an intermediate field and proves + restriction naturality for the corresponding global Artin homomorphisms. +-/ + +@[expose] public section + +open scoped IsMulCommutative NNReal NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory + +variable {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + +open scoped Classical in +/-- Restrict an extension of a finite place through an intermediate +field in a scalar tower. -/ +def restrictFinitePlaceExtension + {E : Type} + [Field E] [Algebra K E] [Algebra E L] + [IsScalarTower K E L] + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) : + AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) E where + val := + w.1.comp (f := algebraMap E L) + (algebraMap E L).injective + property x := by + change + w.1 (algebraMap E L (algebraMap K E x)) = + NumberField.HeightOneSpectrum.adicAbv K v x + rw [← IsScalarTower.algebraMap_apply K E L] + exact w.2 x + +omit [NumberField K] [FiniteDimensional K L] + [IsAbelianGalois K L] in +open scoped Classical in +/-- Completion maps compose along a scalar tower when the three +absolute values extend one another. -/ +theorem absoluteValueCompletionMap_comp_of_isScalarTower + {E : Type} + [Field E] [Algebra K E] [Algebra E L] + [IsScalarTower K E L] + (vK : AbsoluteValue K ℝ) + (vE : AbsoluteValue E ℝ) + (vL : AbsoluteValue L ℝ) + (hKE : AbsoluteValue.Extends vK vE) + (hEL : AbsoluteValue.Extends vE vL) + (hKL : AbsoluteValue.Extends vK vL) : + (AbsoluteValue.completionMap vE vL hEL).comp + (AbsoluteValue.completionMap vK vE hKE) = + AbsoluteValue.completionMap vK vL hKL := by + ext x + refine + UniformSpace.Completion.induction_on + (α := WithAbs vK) x ?_ ?_ + · exact isClosed_eq + ((AbsoluteValue.completionMap_isometry + vE vL hEL).continuous.comp + (AbsoluteValue.completionMap_isometry + vK vE hKE).continuous) + (AbsoluteValue.completionMap_isometry + vK vL hKL).continuous + · intro a + have ha : (a : vK.Completion) = + algebraMap K vK.Completion + (WithAbs.equiv vK a) := by + change (a : vK.Completion) = + (((WithAbs.equiv vK).symm + (WithAbs.equiv vK a) : WithAbs vK) : + vK.Completion) + exact congrArg + (fun z : WithAbs vK => (z : vK.Completion)) + ((WithAbs.equiv vK).symm_apply_apply a).symm + rw [ha] + change + AbsoluteValue.completionMap vE vL hEL + (AbsoluteValue.completionMap vK vE hKE + (algebraMap K vK.Completion + (WithAbs.equiv vK a))) = + AbsoluteValue.completionMap vK vL hKL + (algebraMap K vK.Completion + (WithAbs.equiv vK a)) + rw [AbsoluteValue.completionMap_coe, + AbsoluteValue.toCompletion_eq_algebraMap, + AbsoluteValue.completionMap_coe, + AbsoluteValue.completionMap_coe, + IsScalarTower.algebraMap_apply K E L] + +open scoped Classical in +/-- The completion map in a number-field tower restricts to the +corresponding algebraic localizations. -/ +noncomputable def finitePlaceRestrictedLocalizedCompletionAlgHom + {E : Type} + [Field E] [Algebra K E] [Algebra E L] + [IsScalarTower K E L] + [FiniteDimensional K E] + (v : HeightOneSpectrum (𝓞 K)) + (wL : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) : + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let wE := + restrictFinitePlaceExtension + (K := K) (L := L) (E := E) v wL + let EL := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wE + let LL := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wL + letI : Algebra vK.Completion EL := + finitePlaceLocalArtinLocalizedAlgebra (K := K) (L := E) v wE + letI : Algebra vK.Completion LL := + finitePlaceLocalArtinLocalizedAlgebra (K := K) (L := L) v wL + EL →ₐ[vK.Completion] LL := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let wE := + restrictFinitePlaceExtension + (K := K) (L := L) (E := E) v wL + letI hEK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) wE.1 + letI : SMul K wE.1.Completion := hEK.toSMul + letI : Algebra vK.Completion wE.1.Completion := + AbsoluteValue.completionAlgebra vK wE.1 wE.2 + letI hLK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) wL.1 + letI : SMul K wL.1.Completion := hLK.toSMul + letI : Algebra vK.Completion wL.1.Completion := + AbsoluteValue.completionAlgebra vK wL.1 wL.2 + let hwEL : AbsoluteValue.Extends wE.1 wL.1 := by + intro x + rfl + letI : Algebra wE.1.Completion wL.1.Completion := + AbsoluteValue.completionAlgebra wE.1 wL.1 hwEL + have hcompletion : + (AbsoluteValue.completionMap wE.1 wL.1 hwEL).comp + (AbsoluteValue.completionMap vK wE.1 wE.2) = + AbsoluteValue.completionMap vK wL.1 wL.2 := + absoluteValueCompletionMap_comp_of_isScalarTower + (K := K) (L := L) (E := E) + vK wE.1 wL.1 wE.2 hwEL wL.2 + let completionAlgHom : + wE.1.Completion →ₐ[vK.Completion] + wL.1.Completion := + { __ := AbsoluteValue.completionMap wE.1 wL.1 hwEL + commutes' := fun x => by + change + AbsoluteValue.completionMap wE.1 wL.1 hwEL + (AbsoluteValue.completionMap + vK wE.1 wE.2 x) = + AbsoluteValue.completionMap + vK wL.1 wL.2 x + exact DFunLike.congr_fun hcompletion x } + let EL := + AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wE + let LL := + AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wL + let eE : + EL ≃ₐ[vK.Completion] wE.1.Completion := + AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + vK hvK wE + let eL : + LL ≃ₐ[vK.Completion] wL.1.Completion := + AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + vK hvK wL + let localizationAlgHom : + EL →ₐ[vK.Completion] LL := + eL.symm.toAlgHom.comp + (completionAlgHom.comp eE.toAlgHom) + exact localizationAlgHom + +omit [IsAbelianGalois K L] in +open scoped Classical in +/-- The restricted-localization map agrees with the original +number-field embedding on the intermediate field. -/ +theorem finitePlaceRestrictedLocalizedCompletionAlgHom_toAlgebraicLocalization + {E : Type} + [Field E] [Algebra K E] [Algebra E L] + [IsScalarTower K E L] + [FiniteDimensional K E] [IsGalois K E] + (v : HeightOneSpectrum (𝓞 K)) + (wL : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (x : E) : + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let wE := + restrictFinitePlaceExtension + (K := K) (L := L) (E := E) v wL + let EL := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wE + let LL := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wL + letI : Algebra vK.Completion EL := + finitePlaceLocalArtinLocalizedAlgebra (K := K) (L := E) v wE + letI : Algebra vK.Completion LL := + finitePlaceLocalArtinLocalizedAlgebra (K := K) (L := L) v wL + finitePlaceRestrictedLocalizedCompletionAlgHom + (K := K) (L := L) (E := E) v wL + (AbsoluteValue.toAlgebraicLocalization + vK wE.1 wE.2 x) = + AbsoluteValue.toAlgebraicLocalization + vK wL.1 wL.2 (algebraMap E L x) := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let wE := + restrictFinitePlaceExtension + (K := K) (L := L) (E := E) v wL + let hEK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) wE.1 + let : SMul K wE.1.Completion := hEK.toSMul + let : Algebra vK.Completion wE.1.Completion := + AbsoluteValue.completionAlgebra vK wE.1 wE.2 + let hLK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) wL.1 + let : SMul K wL.1.Completion := hLK.toSMul + let : Algebra vK.Completion wL.1.Completion := + AbsoluteValue.completionAlgebra vK wL.1 wL.2 + let hwEL : AbsoluteValue.Extends wE.1 wL.1 := by + intro z + rfl + let : Algebra wE.1.Completion wL.1.Completion := + AbsoluteValue.completionAlgebra wE.1 wL.1 hwEL + let LL := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wL + let eL : + LL ≃ₐ[vK.Completion] wL.1.Completion := + AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + vK hvK wL + apply eL.injective + change + AbsoluteValue.completionMap wE.1 wL.1 hwEL + (AbsoluteValue.toCompletion wE.1 x) = + AbsoluteValue.toCompletion wL.1 + (algebraMap E L x) + rw [AbsoluteValue.toCompletion_eq_algebraMap, + AbsoluteValue.completionMap_coe] + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- Compatible embeddings descend a commuting square of actions along an injective map. -/ +private theorem action_commutes_of_embedding_square + {E L EL LL : Type*} [Field E] [Field L] [Field EL] [Field LL] + (i : E →+* L) (f : E →+* EL) (g : L →+* LL) (j : EL →+* LL) + (sigmaE : E → E) (sigmaL : L → L) (tauE : EL → EL) (tauL : LL → LL) + (hdiagram : ∀ z, j (f z) = g (i z)) + (htau : ∀ z, tauL (j z) = j (tauE z)) + (hE : ∀ z, tauE (f z) = f (sigmaE z)) + (hL : ∀ z, tauL (g z) = g (sigmaL z)) (z : E) : + i (sigmaE z) = sigmaL (i z) := by + apply g.injective + calc + g (i (sigmaE z)) = j (f (sigmaE z)) := (hdiagram _).symm + _ = j (tauE (f z)) := congrArg j (hE _).symm + _ = tauL (j (f z)) := (htau _).symm + _ = tauL (g (i z)) := congrArg tauL (hdiagram _) + _ = g (sigmaL (i z)) := hL _ + +omit [NumberField K] [FiniteDimensional K L] in +/-- A compatible embedding of algebraic localizations carries +restriction of decomposition-group elements to restriction of the +corresponding local automorphisms. -/ +theorem decompositionGroupEquivAlgebraicLocalizationAut_restrict_of_commutes + {E : Type} + [Field E] [Algebra K E] [Algebra E L] + [IsScalarTower K E L] + [FiniteDimensional K E] [IsAbelianGalois K E] + (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) + (wE : AbsoluteValueExtension vK E) + (wL : AbsoluteValueExtension vK L) : + letI hEK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) wE.1 + letI : SMul K wE.1.Completion := hEK.toSMul + letI : Algebra vK.Completion wE.1.Completion := + AbsoluteValue.completionAlgebra vK wE.1 wE.2 + letI hLK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) wL.1 + letI : SMul K wL.1.Completion := hLK.toSMul + letI : Algebra vK.Completion wL.1.Completion := + AbsoluteValue.completionAlgebra vK wL.1 wL.2 + let EL := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wE + let LL := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wL + ∀ (localizationEmbedding : EL →ₐ[vK.Completion] LL), + letI hELL : Algebra EL LL := + localizationEmbedding.toRingHom.toAlgebra + letI : SMul EL LL := hELL.toSMul + letI : IsScalarTower vK.Completion EL LL := + IsScalarTower.of_algebraMap_eq' (by + apply RingHom.ext + intro x + exact (localizationEmbedding.commutes x).symm) + letI : FiniteDimensional vK.Completion EL := + AlgebraicNumberTheory.Valuations.localizedCompletionModuleFinite + vK hvK wE + letI : IsAbelianGalois vK.Completion EL := + LocalClassFieldTheory.localizedCompletion_isAbelianGalois + vK hvK wE + let eDE : + absoluteValueDecompositionGroup K wE.1 ≃* + (EL ≃ₐ[vK.Completion] EL) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK wE + let eDL : + absoluteValueDecompositionGroup K wL.1 ≃* + (LL ≃ₐ[vK.Completion] LL) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK wL + (∀ z : E, + localizationEmbedding + (AbsoluteValue.toAlgebraicLocalization + vK wE.1 wE.2 z) = + AbsoluteValue.toAlgebraicLocalization + vK wL.1 wL.2 (algebraMap E L z)) → + ∀ tauL : LL ≃ₐ[vK.Completion] LL, + AlgEquiv.restrictNormalHom E + ((eDL.symm tauL).1 : L ≃ₐ[K] L) = + ((eDE.symm + (AlgEquiv.restrictNormalHom EL tauL)).1 : + E ≃ₐ[K] E) := by + let hEK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) wE.1 + let : SMul K wE.1.Completion := hEK.toSMul + let : Algebra vK.Completion wE.1.Completion := + AbsoluteValue.completionAlgebra vK wE.1 wE.2 + let hLK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) wL.1 + let : SMul K wL.1.Completion := hLK.toSMul + let : Algebra vK.Completion wL.1.Completion := + AbsoluteValue.completionAlgebra vK wL.1 wL.2 + let EL := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wE + let LL := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wL + change + ∀ localizationEmbedding : EL →ₐ[vK.Completion] LL, _ + intro localizationEmbedding + let hELL : Algebra EL LL := + localizationEmbedding.toRingHom.toAlgebra + let : SMul EL LL := hELL.toSMul + let : IsScalarTower vK.Completion EL LL := + IsScalarTower.of_algebraMap_eq' (by + apply RingHom.ext + intro x + exact (localizationEmbedding.commutes x).symm) + let : FiniteDimensional vK.Completion EL := + AlgebraicNumberTheory.Valuations.localizedCompletionModuleFinite + vK hvK wE + let : IsAbelianGalois vK.Completion EL := + LocalClassFieldTheory.localizedCompletion_isAbelianGalois + vK hvK wE + let eDE : + absoluteValueDecompositionGroup K wE.1 ≃* + (EL ≃ₐ[vK.Completion] EL) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK wE + let eDL : + absoluteValueDecompositionGroup K wL.1 ≃* + (LL ≃ₐ[vK.Completion] LL) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK wL + change + (∀ z : E, + localizationEmbedding + (AbsoluteValue.toAlgebraicLocalization + vK wE.1 wE.2 z) = + AbsoluteValue.toAlgebraicLocalization + vK wL.1 wL.2 (algebraMap E L z)) → + ∀ tauL : LL ≃ₐ[vK.Completion] LL, _ + intro hlocalization tauL + let rhoL : absoluteValueDecompositionGroup K wL.1 := + eDL.symm tauL + let tauE := AlgEquiv.restrictNormalHom EL tauL + let rhoE : absoluteValueDecompositionGroup K wE.1 := + eDE.symm tauE + change + AlgEquiv.restrictNormalHom E + (rhoL.1 : L ≃ₐ[K] L) = + (rhoE.1 : E ≃ₐ[K] E) + apply AlgEquiv.ext + intro z + apply (algebraMap E L).injective + refine (AlgEquiv.restrictNormal_commutes (rhoL.1 : L ≃ₐ[K] L) E z).trans ?_ + symm + apply action_commutes_of_embedding_square + (algebraMap E L) + (AbsoluteValue.toAlgebraicLocalization vK wE.1 wE.2) + (AbsoluteValue.toAlgebraicLocalization vK wL.1 wL.2) + localizationEmbedding.toRingHom rhoE.1 rhoL.1 tauE tauL hlocalization + · intro u + exact (AlgEquiv.restrictNormal_commutes tauL EL u).symm + · intro u + change tauE _ = _ + rw [← eDE.apply_symm_apply tauE] + exact localizationRamificationGroups_decompositionGroupEquiv_toLocalization vK hvK wE _ _ + · intro u + change tauL _ = _ + rw [← eDL.apply_symm_apply tauL] + exact localizationRamificationGroups_decompositionGroupEquiv_toLocalization vK hvK wL _ _ + +open scoped Classical in +/-- Restriction of local Galois automorphisms along a compatible tower +of finite-place completions. -/ +noncomputable def finitePlaceLocalRestrictionMonoidHom + {E : Type} + [Field E] [Algebra K E] [Algebra E L] + [IsScalarTower K E L] + [FiniteDimensional K E] [IsAbelianGalois K E] + (v : HeightOneSpectrum (𝓞 K)) + (wL : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) : + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let wE := + restrictFinitePlaceExtension + (K := K) (L := L) (E := E) v wL + let EL := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wE + let LL := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wL + letI : Algebra vK.Completion EL := + finitePlaceLocalArtinLocalizedAlgebra (K := K) (L := E) v wE + letI : Algebra vK.Completion LL := + finitePlaceLocalArtinLocalizedAlgebra (K := K) (L := L) v wL + (LL ≃ₐ[vK.Completion] LL) →* + (EL ≃ₐ[vK.Completion] EL) := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let wE := + restrictFinitePlaceExtension + (K := K) (L := L) (E := E) v wL + let EL := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wE + let LL := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wL + letI : Algebra vK.Completion EL := + finitePlaceLocalArtinLocalizedAlgebra (K := K) (L := E) v wE + letI : Algebra vK.Completion LL := + finitePlaceLocalArtinLocalizedAlgebra (K := K) (L := L) v wL + let localizationAlgHom := + finitePlaceRestrictedLocalizedCompletionAlgHom + (K := K) (L := L) (E := E) v wL + letI hELL : Algebra EL LL := + localizationAlgHom.toRingHom.toAlgebra + letI : SMul EL LL := hELL.toSMul + letI : IsScalarTower vK.Completion EL LL := + IsScalarTower.of_algebraMap_eq' (by + apply RingHom.ext + intro x + exact (localizationAlgHom.commutes x).symm) + letI : FiniteDimensional vK.Completion EL := + finitePlaceLocalArtinFiniteDimensional (K := K) (L := E) v wE + letI : IsAbelianGalois vK.Completion EL := + finitePlaceLocalArtinIsAbelianGalois (K := K) (L := E) v wE + (inferInstance : FiniteDimensional K E) + letI hGaloisEL : IsGalois vK.Completion EL := + (inferInstance : + IsAbelianGalois vK.Completion EL).toIsGalois + letI : Normal vK.Completion EL := + hGaloisEL.to_normal + exact AlgEquiv.restrictNormalHom EL + +open scoped Classical in +/-- Restriction of global decomposition-group elements agrees with +restriction of the corresponding automorphisms of algebraic +localizations, pointwise on local automorphisms. -/ +theorem finitePlaceDecompositionTransport_restrict_tower_apply + {E : Type} + [Field E] [Algebra K E] [Algebra E L] + [IsScalarTower K E L] + [FiniteDimensional K E] [IsAbelianGalois K E] + (v : HeightOneSpectrum (𝓞 K)) + (wL : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) : + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let wE := + restrictFinitePlaceExtension + (K := K) (L := L) (E := E) v wL + let EL := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wE + let LL := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wL + letI : Algebra vK.Completion EL := + finitePlaceLocalArtinLocalizedAlgebra (K := K) (L := E) v wE + letI : Algebra vK.Completion LL := + finitePlaceLocalArtinLocalizedAlgebra (K := K) (L := L) v wL + let localizationAlgHom := + finitePlaceRestrictedLocalizedCompletionAlgHom + (K := K) (L := L) (E := E) v wL + letI hELL : Algebra EL LL := + localizationAlgHom.toRingHom.toAlgebra + letI : SMul EL LL := hELL.toSMul + letI : IsScalarTower vK.Completion EL LL := + IsScalarTower.of_algebraMap_eq' (by + apply RingHom.ext + intro x + exact (localizationAlgHom.commutes x).symm) + letI : FiniteDimensional vK.Completion EL := + finitePlaceLocalArtinFiniteDimensional (K := K) (L := E) v wE + letI : IsAbelianGalois vK.Completion EL := + finitePlaceLocalArtinIsAbelianGalois (K := K) (L := E) v wE + (inferInstance : FiniteDimensional K E) + let eDE : + absoluteValueDecompositionGroup K wE.1 ≃* + (EL ≃ₐ[vK.Completion] EL) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK wE + let eDL : + absoluteValueDecompositionGroup K wL.1 ≃* + (LL ≃ₐ[vK.Completion] LL) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK wL + ∀ tauL : LL ≃ₐ[vK.Completion] LL, + AlgEquiv.restrictNormalHom E + ((eDL.symm tauL).1 : L ≃ₐ[K] L) = + ((eDE.symm + (AlgEquiv.restrictNormalHom EL tauL)).1 : E ≃ₐ[K] E) := by + exact + decompositionGroupEquivAlgebraicLocalizationAut_restrict_of_commutes + (K := K) (L := L) (E := E) + (NumberField.HeightOneSpectrum.adicAbv K v) + (RayClass.adicAbv_isNontrivial v) + (restrictFinitePlaceExtension + (K := K) (L := L) (E := E) v wL) + wL + (finitePlaceRestrictedLocalizedCompletionAlgHom + (K := K) (L := L) (E := E) v wL) + (fun z => + finitePlaceRestrictedLocalizedCompletionAlgHom_toAlgebraicLocalization + (K := K) (L := L) (E := E) v wL z) + +open scoped Classical in +/-- Restriction of global decomposition-group elements agrees with +restriction of the corresponding automorphisms of algebraic +localizations. -/ +theorem finitePlaceDecompositionTransport_restrict_tower + {E : Type} + [Field E] [Algebra K E] [Algebra E L] + [IsScalarTower K E L] + [FiniteDimensional K E] [IsAbelianGalois K E] + (v : HeightOneSpectrum (𝓞 K)) + (wL : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) : + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let wE := + restrictFinitePlaceExtension + (K := K) (L := L) (E := E) v wL + let EL := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wE + let LL := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wL + letI : Algebra vK.Completion EL := + finitePlaceLocalArtinLocalizedAlgebra (K := K) (L := E) v wE + letI : Algebra vK.Completion LL := + finitePlaceLocalArtinLocalizedAlgebra (K := K) (L := L) v wL + let localizationAlgHom := + finitePlaceRestrictedLocalizedCompletionAlgHom + (K := K) (L := L) (E := E) v wL + letI hELL : Algebra EL LL := + localizationAlgHom.toRingHom.toAlgebra + letI : SMul EL LL := hELL.toSMul + letI : IsScalarTower vK.Completion EL LL := + IsScalarTower.of_algebraMap_eq' (by + apply RingHom.ext + intro x + exact (localizationAlgHom.commutes x).symm) + letI : FiniteDimensional vK.Completion EL := + finitePlaceLocalArtinFiniteDimensional (K := K) (L := E) v wE + letI : IsAbelianGalois vK.Completion EL := + finitePlaceLocalArtinIsAbelianGalois (K := K) (L := E) v wE + (inferInstance : FiniteDimensional K E) + let eDE : + absoluteValueDecompositionGroup K wE.1 ≃* + (EL ≃ₐ[vK.Completion] EL) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK wE + let eDL : + absoluteValueDecompositionGroup K wL.1 ≃* + (LL ≃ₐ[vK.Completion] LL) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK wL + (AlgEquiv.restrictNormalHom E).comp + ((absoluteValueDecompositionGroup K wL.1).subtype.comp + eDL.symm.toMonoidHom) = + ((absoluteValueDecompositionGroup K wE.1).subtype.comp + eDE.symm.toMonoidHom).comp + (AlgEquiv.restrictNormalHom EL) := by + apply MonoidHom.ext + intro tauL + exact + finitePlaceDecompositionTransport_restrict_tower_apply + (K := K) (L := L) (E := E) v wL tauL + +open scoped Classical in +/-- Local Artin maps on localized completions commute with restriction +through an abelian intermediate field. -/ +theorem finitePlaceLocalArtinMonoidHom_restrict_tower + {E : Type} + [Field E] [Algebra K E] [Algebra E L] + [IsScalarTower K E L] + [FiniteDimensional K E] [IsAbelianGalois K E] + (v : HeightOneSpectrum (𝓞 K)) + (wL : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) : + (finitePlaceLocalRestrictionMonoidHom + (K := K) (L := L) (E := E) v wL).comp + (finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v wL) = + finitePlaceLocalArtinMonoidHom + (K := K) (L := E) v + (restrictFinitePlaceExtension + (K := K) (L := L) (E := E) v wL) := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let wE := + restrictFinitePlaceExtension + (K := K) (L := L) (E := E) v wL + let EL := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wE + let LL := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK wL + let : Algebra vK.Completion EL := + finitePlaceLocalArtinLocalizedAlgebra (K := K) (L := E) v wE + let : Algebra vK.Completion LL := + finitePlaceLocalArtinLocalizedAlgebra (K := K) (L := L) v wL + let localizationAlgHom := + finitePlaceRestrictedLocalizedCompletionAlgHom + (K := K) (L := L) (E := E) v wL + let hELL : Algebra EL LL := + localizationAlgHom.toRingHom.toAlgebra + let : SMul EL LL := hELL.toSMul + let : IsScalarTower vK.Completion EL LL := + IsScalarTower.of_algebraMap_eq' (by + apply RingHom.ext + intro x + exact (localizationAlgHom.commutes x).symm) + let : FiniteDimensional vK.Completion EL := + finitePlaceLocalArtinFiniteDimensional (K := K) (L := E) v wE + let : IsAbelianGalois vK.Completion EL := + finitePlaceLocalArtinIsAbelianGalois (K := K) (L := E) v wE + (inferInstance : FiniteDimensional K E) + let hGaloisEL : IsGalois vK.Completion EL := + (inferInstance : + IsAbelianGalois vK.Completion EL).toIsGalois + let : Normal vK.Completion EL := + hGaloisEL.to_normal + let : FiniteDimensional vK.Completion LL := + finitePlaceLocalArtinFiniteDimensional (K := K) (L := L) v wL + let : IsAbelianGalois vK.Completion LL := + finitePlaceLocalArtinIsAbelianGalois (K := K) (L := L) v wL + (inferInstance : FiniteDimensional K L) + let : ValuativeRel vK.Completion := + finitePlaceLocalArtinCompletionValuativeRel v + let : IsNonarchimedeanLocalField vK.Completion := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + let eK : + vK.Completionˣ ≃* (v.adicCompletion K)ˣ := + finitePlaceCompletionUnitsContinuousMulEquiv v + change + (AlgEquiv.restrictNormalHom EL).comp + ((LocalClassFieldTheory.abelianLocalArtinMonoidHom + vK.Completion LL).comp eK.symm.toMonoidHom) = + (LocalClassFieldTheory.abelianLocalArtinMonoidHom + vK.Completion EL).comp eK.symm.toMonoidHom + apply MonoidHom.ext + intro x + exact + DFunLike.congr_fun + (LocalClassFieldTheory.abelianLocalArtinMonoidHom_restrict_tower + vK.Completion EL LL) + (eK.symm x) + + +open scoped Classical in +/-- Finite-place Artin homomorphisms attached to specified place +extensions commute with restriction through an abelian tower. -/ +theorem finitePlaceArtinMonoidHomOfExtension_restrict_tower + {E : Type} + [Field E] [Algebra K E] [Algebra E L] + [IsScalarTower K E L] + [FiniteDimensional K E] [IsAbelianGalois K E] + (v : HeightOneSpectrum (𝓞 K)) + (wL : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) : + (AlgEquiv.restrictNormalHom E).comp + (finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v wL) = + finitePlaceArtinMonoidHomOfExtension + (K := K) (L := E) v + (restrictFinitePlaceExtension + (K := K) (L := L) (E := E) v wL) := by + let wE := + restrictFinitePlaceExtension + (K := K) (L := L) (E := E) v wL + calc + (AlgEquiv.restrictNormalHom E).comp + (finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v wL) = + (AlgEquiv.restrictNormalHom E).comp + ((finitePlaceLocalToGlobalMonoidHom + (K := K) (L := L) v wL).comp + (finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v wL)) := + congrArg + (fun f => (AlgEquiv.restrictNormalHom E).comp f) + (finitePlaceArtinMonoidHomOfExtension_factor + (K := K) (L := L) v wL) + _ = + ((AlgEquiv.restrictNormalHom E).comp + (finitePlaceLocalToGlobalMonoidHom + (K := K) (L := L) v wL)).comp + (finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v wL) := by + rfl + _ = + ((finitePlaceLocalToGlobalMonoidHom + (K := K) (L := E) v wE).comp + (finitePlaceLocalRestrictionMonoidHom + (K := K) (L := L) (E := E) v wL)).comp + (finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v wL) := + congrArg + (fun f => f.comp + (finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v wL)) + (finitePlaceDecompositionTransport_restrict_tower + (K := K) (L := L) (E := E) v wL) + _ = + (finitePlaceLocalToGlobalMonoidHom + (K := K) (L := E) v wE).comp + ((finitePlaceLocalRestrictionMonoidHom + (K := K) (L := L) (E := E) v wL).comp + (finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v wL)) := by + rfl + _ = + (finitePlaceLocalToGlobalMonoidHom + (K := K) (L := E) v wE).comp + (finitePlaceLocalArtinMonoidHom + (K := K) (L := E) v wE) := + congrArg + (fun f => (finitePlaceLocalToGlobalMonoidHom + (K := K) (L := E) v wE).comp f) + (finitePlaceLocalArtinMonoidHom_restrict_tower + (K := K) (L := L) (E := E) v wL) + _ = + finitePlaceArtinMonoidHomOfExtension + (K := K) (L := E) v wE := + (finitePlaceArtinMonoidHomOfExtension_factor + (K := K) (L := E) v wE).symm + +open scoped Classical in +/-- Finite local factors commute with restriction in an abelian +number-field tower. -/ +theorem chosenFinitePlaceArtinMonoidHom_restrict_tower + {E : Type} + [Field E] [Algebra K E] [Algebra E L] + [IsScalarTower K E L] + [FiniteDimensional K E] [IsAbelianGalois K E] + (v : HeightOneSpectrum (𝓞 K)) : + (AlgEquiv.restrictNormalHom E).comp + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v) = + chosenFinitePlaceArtinMonoidHom + (K := K) (L := E) v := by + let wL := + chosenFinitePlaceExtension + (L := L) v + let wE := + restrictFinitePlaceExtension + (K := K) (L := L) (E := E) v wL + calc + (AlgEquiv.restrictNormalHom E).comp + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v) = + finitePlaceArtinMonoidHomOfExtension + (K := K) (L := E) v wE := + finitePlaceArtinMonoidHomOfExtension_restrict_tower + (K := K) (L := L) (E := E) v wL + _ = chosenFinitePlaceArtinMonoidHom + (K := K) (L := E) v := + finitePlaceArtinMonoidHomOfExtension_eq + (K := K) (L := E) v wE + (chosenFinitePlaceExtension + (L := E) v) + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/UnramifiedNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/UnramifiedNormalization.lean new file mode 100644 index 0000000000..4d7d275f8b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/UnramifiedNormalization.lean @@ -0,0 +1,110 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +/-! +# Unramified normalization of the chosen finite-place Artin map + +The chosen order-one input has normalized local valuation `-1` in the +geometric finite-place construction. Its local Artin image is therefore +inverse arithmetic Frobenius in the actual chosen completion. +-/ + +@[expose] public section + +open scoped NumberField ValuativeRel +open NumberField IsDedekindDomain +open AlgebraicNumberTheory.Valuations LocalFieldTheory + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +variable {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [hKLfinite : FiniteDimensional K L] [IsAbelianGalois K L] + +open scoped Classical in +/-- Arithmetic Frobenius of the actual chosen unramified local extension. -/ +noncomputable def chosenFinitePlaceLocalArithmeticFrobenius + (v : HeightOneSpectrum (𝓞 K)) + (hunram : ChosenFinitePlaceIsUnramified (K := K) (L := L) v) : + ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v ≃ₐ[ChosenFinitePlaceBaseCompletion + (K := K) v] + ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v := by + let C := ChosenFinitePlaceBaseCompletion (K := K) v + let E := ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v + letI : IsGalois C E := + chosenFinitePlaceLocalizedIsGalois (K := K) (L := L) v + letI : Valuation.HasExtension + (ValuativeRel.valuation C) (ValuativeRel.valuation E) := + chosenFinitePlaceLocalizedValuationHasExtension (K := K) (L := L) v + letI : IsIntegralClosure 𝒪[E] 𝒪[C] E := + chosenFinitePlaceLocalizedIsIntegralClosure (K := K) (L := L) v + letI : Module.Finite 𝒪[C] 𝒪[E] := + chosenFinitePlaceLocalizedIntegerModuleFinite (K := K) (L := L) v + letI : IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + C E := hunram + exact arithmeticFrobeniusOfUnramifiedValuation C E + +open scoped Classical in +/-- At an unramified chosen finite place, the chosen geometric local Artin +symbol of the order-one section is inverse arithmetic Frobenius. -/ +theorem chosenFinitePlaceLocalArtin_eq_arithmeticFrobenius_inv_of_unramified + (v : HeightOneSpectrum (𝓞 K)) + (hunram : ChosenFinitePlaceIsUnramified (K := K) (L := L) v) : + finitePlaceLocalArtinMonoidHom (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v) + (FiniteIdeleGroup.chosenLocalOrderSection v 1) = + (chosenFinitePlaceLocalArithmeticFrobenius + (K := K) (L := L) v hunram)⁻¹ := by + let w := chosenFinitePlaceExtension (L := L) v + let C := ChosenFinitePlaceBaseCompletion (K := K) v + let E := ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v + let x : (v.adicCompletion K)ˣ := + FiniteIdeleGroup.chosenLocalOrderSection v 1 + let : Algebra C E := finitePlaceLocalArtinLocalizedAlgebra v w + let : FiniteDimensional C E := finitePlaceLocalArtinFiniteDimensional v w + let : IsAbelianGalois C E := + finitePlaceLocalArtinIsAbelianGalois v w hKLfinite + let : ValuativeRel C := finitePlaceLocalArtinCompletionValuativeRel v + let : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + let : IsIntegralClosure 𝒪[E] 𝒪[C] E := + chosenFinitePlaceLocalizedIsIntegralClosure (K := K) (L := L) v + let : Module.Finite 𝒪[C] 𝒪[E] := + chosenFinitePlaceLocalizedIntegerModuleFinite (K := K) (L := L) v + let : IsNonarchimedeanLocalField.IsUnramifiedValuedExtension C E := hunram + have hval : + IsNonarchimedeanLocalField.valuationMap C + (Additive.ofMul (finitePlaceLocalArtinInput v x)) = -1 := + finitePlaceLocalArtinInput_chosenLocalOrderSection_valuationMap v + have hfrob := + LocalClassFieldTheory.abelianLocalArtinMonoidHom_eq_frobenius_zpow + C E (finitePlaceLocalArtinInput v x) + have hnorm : + LocalClassFieldTheory.abelianLocalArtinMonoidHom C E + (finitePlaceLocalArtinInput v x) = + (arithmeticFrobeniusOfUnramifiedValuation C E)⁻¹ := by + simpa only [hval, zpow_neg_one] using hfrob + calc + finitePlaceLocalArtinMonoidHom (K := K) (L := L) v w x = + LocalClassFieldTheory.abelianLocalArtinMonoidHom C E + (finitePlaceLocalArtinInput v x) := by + rfl + _ = (chosenFinitePlaceLocalArithmeticFrobenius + (K := K) (L := L) v hunram)⁻¹ := by + exact hnorm + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean new file mode 100644 index 0000000000..8729cb4d5f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean @@ -0,0 +1,1978 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.OnePlaceBaseNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusLift +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerPrimeProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicPrincipalIdele +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicZHatBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalPrimeFactor +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.ClosedAddSubgroup +public import Mathlib.GroupTheory.Nilpotent +public import Mathlib.Topology.Algebra.ContinuousMonoidHom +/-! +# Decomposition-compatible cyclotomic Frobenius lifts + +The finite-place reduction in the local--global compatibility theorem +uses automorphisms in a specified decomposition group, not arbitrary +lifts in the ambient absolute Galois group. + +This file begins with the source map needed for that construction. +For a normal intermediate field, restriction maps the decomposition +group upstairs onto the decomposition group of the restricted +valuation. The proof uses the actual valuation-conjugacy correction +in `absoluteValueDecompositionGroup_map_restrictNormalHom`. +-/ + +@[expose] public section + +open AlgebraicNumberTheory.Valuations +open AlgebraicNumberTheory +open HilbertRamification +open ClassFormation +open NumberField IsDedekindDomain +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +local instance (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +local instance rationalCyclotomicFrobeniusLiftPrimePowerNumberField + (p : Nat.Primes) (k : ℕ) : + NumberField (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) := + KummerTheory.rationalCyclotomicLevel_numberField + ⟨p.1 ^ k, pow_pos p.2.pos k⟩ + +local instance rationalCyclotomicFrobeniusLiftPrimePowerFiniteDimensional + (p : Nat.Primes) (k : ℕ) : + FiniteDimensional ℚ (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) := + rationalCyclotomicPrincipalPrimeLevelFiniteDimensional + ⟨p.1 ^ k, pow_pos p.2.pos k⟩ + +local instance rationalCyclotomicFrobeniusLiftPrimePowerIsAbelianGalois + (p : Nat.Primes) (k : ℕ) : + IsAbelianGalois ℚ (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) := + rationalCyclotomicLevelIsAbelianGalois + ⟨p.1 ^ k, pow_pos p.2.pos k⟩ + +noncomputable local instance + rationalCyclotomicFrobeniusLiftLevelFiniteDimensional + (m : ℕ+) : + FiniteDimensional ℚ + (KummerTheory.rationalCyclotomicLevel m) := + rationalCyclotomicPrincipalPrimeLevelFiniteDimensional m + +noncomputable local instance + rationalCyclotomicFrobeniusLiftLevelIsAbelianGalois + (m : ℕ+) : + IsAbelianGalois ℚ + (KummerTheory.rationalCyclotomicLevel m) := + rationalCyclotomicLevelIsAbelianGalois m + +variable + {K L Ω : Type} + [Field K] [Field L] [Field Ω] + [Algebra K L] [Algebra L Ω] [Algebra K Ω] + [IsScalarTower K L Ω] [Normal K L] + +/-- Restriction along a normal intermediate field, as a homomorphism +between the decomposition groups of a valuation and its restriction. + +Unlike an unrestricted Galois restriction, the codomain records the +valuation-stabilizer condition, which is the condition needed to +transport local Artin symbols through a global field tower. -/ +noncomputable def absoluteValueDecompositionGroupRestrictionHom + (wΩ : AbsoluteValue Ω ℝ) : + absoluteValueDecompositionGroup K wΩ →* + absoluteValueDecompositionGroup K + (wΩ.comp (f := algebraMap L Ω) + (algebraMap L Ω).injective) where + toFun τ := + ⟨AlgEquiv.restrictNormalHom + (F := K) (K₁ := Ω) L τ.1, + by + intro x + change + wΩ + (algebraMap L Ω + ((AlgEquiv.restrictNormalHom + (F := K) (K₁ := Ω) L τ.1) x)) < 1 ↔ + wΩ (algebraMap L Ω x) < 1 + change + wΩ + (algebraMap L Ω + ((AlgEquiv.restrictNormal τ.1 L) x)) < 1 ↔ + wΩ (algebraMap L Ω x) < 1 + rw [AlgEquiv.restrictNormal_commutes] + exact τ.2 (algebraMap L Ω x)⟩ + map_one' := by + apply Subtype.ext + exact + map_one + (AlgEquiv.restrictNormalHom + (F := K) (K₁ := Ω) L) + map_mul' τ η := by + apply Subtype.ext + exact + map_mul + (AlgEquiv.restrictNormalHom + (F := K) (K₁ := Ω) L) τ.1 η.1 + +/-- Restriction from a Galois overfield is surjective on the actual +decomposition groups of a nontrivial valuation. + +The preimage is obtained by first extending the requested +automorphism and then correcting it by an automorphism fixing the +normal intermediate field. Thus the resulting lift genuinely +stabilizes the specified valuation upstairs. -/ +theorem absoluteValueDecompositionGroupRestrictionHom_surjective + [IsGalois K Ω] + (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) + (wΩ : AbsoluteValueExtension vK Ω) : + Function.Surjective + (absoluteValueDecompositionGroupRestrictionHom + (K := K) (L := L) (Ω := Ω) wΩ.1) := by + intro σ + have hσ : + σ.1 ∈ + (absoluteValueDecompositionGroup K wΩ.1).map + (AlgEquiv.restrictNormalHom + (F := K) (K₁ := Ω) L) := by + rw [ + absoluteValueDecompositionGroup_map_restrictNormalHom + (F := K) (E := Ω) (M := L) vK hvK wΩ] + exact σ.2 + obtain ⟨τ, hτ, hτσ⟩ := hσ + refine ⟨⟨τ, hτ⟩, ?_⟩ + apply Subtype.ext + exact hτσ + +/-- The infinite global Artin symbol of a finite one-place idèle +stabilizes every chosen extension of that finite place to an abelian +Galois overfield. + +The proof is genuinely inverse-limit in nature. For each element of +the overfield, we pass to the finite Galois closure it generates. The +restriction of the infinite Artin symbol is then the finite chosen local +Artin symbol, whose image is the finite decomposition group. Independence +of the exact extension in the abelian finite layer returns the valuation +stabilizer statement upstairs. -/ +theorem + infiniteGlobalArtinMonoidHom_finitePlaceIdele_mem_absoluteValueDecompositionGroup + {F A : Type} + [Field F] [NumberField F] + [Field A] [Algebra F A] [IsAbelianGalois F A] + (v : HeightOneSpectrum (𝓞 F)) + (wA : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv F v) A) + (x : (v.adicCompletion F)ˣ) : + infiniteGlobalArtinMonoidHom F A + (IdeleGroup.finitePlaceIdele v x) ∈ + absoluteValueDecompositionGroup F wA.1 := by + rw [mem_absoluteValueDecompositionGroup_iff] + intro y + let M : IntermediateField F A := + IntermediateField.adjoin F {y} + let : FiniteDimensional F M := + IntermediateField.adjoin.finiteDimensional + (Algebra.IsIntegral.isIntegral y) + let E : + FiniteGaloisIntermediateField F A := + { toIntermediateField := + IntermediateField.normalClosure F M A + finiteDimensional := + normalClosure.is_finiteDimensional F M A + isGalois := + IsGalois.normalClosure F M A } + let : NumberField E := + NumberField.of_module_finite F E + let : IsAbelianGalois F E := + IsAbelianGalois.of_algHom + (E : IntermediateField F A).val + let vF := + NumberField.HeightOneSpectrum.adicAbv F v + let wE : AbsoluteValueExtension vF E := + restrictAbsoluteValueExtensionToIntermediate + vF wA E + have hyM : y ∈ M := + IntermediateField.subset_adjoin + (F := F) (S := {y}) (by rfl) + have hyE : y ∈ E.toIntermediateField := + IntermediateField.le_normalClosure M hyM + have hrestriction : + AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom F A + (IdeleGroup.finitePlaceIdele v x)) = + chosenFinitePlaceArtinMonoidHom + (K := F) (L := E) v x := by + rw [ + restrictNormalHom_infiniteGlobalArtinMonoidHom, + globalArtinMonoidHom_finitePlaceIdele] + have hchosen : + AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom F A + (IdeleGroup.finitePlaceIdele v x)) ∈ + finitePlaceDecompositionGroup + (K := F) (L := E) v := by + rw [← + chosenFinitePlaceArtinMonoidHom_range + (K := F) (L := E) v] + exact ⟨x, hrestriction.symm⟩ + have hrestricted : + AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom F A + (IdeleGroup.finitePlaceIdele v x)) ∈ + absoluteValueDecompositionGroup F wE.1 := by + rw [← + absoluteValueDecompositionGroup_eq_of_exactExtensions_of_isMulCommutative + vF + (RayClass.adicAbv_isNontrivial v) + (chosenFinitePlaceExtension (L := E) v) + wE] + exact hchosen + have hvalue := + (mem_absoluteValueDecompositionGroup_iff F wE.1 _).1 + hrestricted ⟨y, hyE⟩ + have hcommutes : + (((AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom F A + (IdeleGroup.finitePlaceIdele v x))) ⟨y, hyE⟩ : E) : A) = + infiniteGlobalArtinMonoidHom F A + (IdeleGroup.finitePlaceIdele v x) y := + AlgEquiv.restrictNormal_commutes + (infiniteGlobalArtinMonoidHom F A + (IdeleGroup.finitePlaceIdele v x)) E ⟨y, hyE⟩ + simpa only [wE, restrictAbsoluteValueExtensionToIntermediate_apply, + hcommutes] using hvalue + +section FiniteCyclotomicBaseChange + +variable + {F : Type*} [Field F] [NumberField F] + +/-- Restriction from a finite cyclotomic compositum over a number +field to its rational cyclotomic layer. -/ +noncomputable def + numberFieldCyclotomicZHatFiniteCompositumRestriction + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Gal(numberFieldCyclotomicZHatFiniteCompositum F E/F) →* + Gal(E/ℚ) := by + letI : Normal ℚ E := E.isGalois.to_normal + exact + IntermediateField.restrictRestrictAlgEquivMapHom + ℚ E F + (numberFieldCyclotomicZHatFiniteCompositum F E) + +/-- Restriction to the rational factor is injective on the actual +finite compositum: an automorphism fixing both generating fields fixes +their supremum. -/ +theorem + numberFieldCyclotomicZHatFiniteCompositumRestriction_injective + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Function.Injective + (numberFieldCyclotomicZHatFiniteCompositumRestriction + (F := F) E) := by + let : Normal ℚ E := E.isGalois.to_normal + let C := + numberFieldCyclotomicZHatFiniteCompositum F E + let : Algebra ℚ C := C.algebra' + let : Algebra F C := + numberFieldCyclotomicZHatFiniteCompositumAlgebra F E + let : IsScalarTower ℚ F C := + numberFieldCyclotomicZHatFiniteCompositum_scalarTower F E + let : Algebra E C := + rationalCyclotomicZHatFiniteLayerCompositumAlgebra F E + let : IsScalarTower ℚ E C := + rationalCyclotomicZHatFiniteLayerCompositum_scalarTower F E + let A : IntermediateField ℚ C := + (numberFieldInRationalSeparableClosure F).restrict + (show + numberFieldInRationalSeparableClosure F ≤ C from + le_sup_left) + let B : IntermediateField ℚ C := + (IntermediateField.lift E.toIntermediateField).restrict + (show + IntermediateField.lift E.toIntermediateField ≤ C from + le_sup_right) + let : Algebra ℚ B := B.algebra' + let eF : F ≃ₐ[ℚ] A := + (numberFieldSeparableClosureEmbedding F).equivFieldRange.trans + (IntermediateField.restrictAlgEquiv le_sup_left) + let eE : E ≃ₐ[ℚ] B := + (IntermediateField.liftAlgEquiv E.toIntermediateField).trans + (IntermediateField.restrictAlgEquiv le_sup_right) + let : Normal ℚ B := Normal.of_algEquiv eE + have hsup : B ⊔ A = ⊤ := by + apply IntermediateField.lift_injective C + rw [IntermediateField.lift_sup, + IntermediateField.lift_restrict, + IntermediateField.lift_restrict, + IntermediateField.lift_top] + exact sup_comm _ _ + let rB : + (C ≃ₐ[A] C) →* (B ≃ₐ[ℚ] B) := + IntermediateField.restrictRestrictAlgEquivMapHom ℚ B A C + have hrB : Function.Injective rB := + IntermediateField.restrictRestrictAlgEquivMapHom_injective + B A hsup + have heF (x : F) : + algebraMap F C x = algebraMap A C (eF x) := by + apply Subtype.ext + rfl + let changeBase : + (C ≃ₐ[F] C) →* (C ≃ₐ[A] C) := + { toFun := fun σ => + { σ.toRingEquiv with + commutes' := by + intro y + have hy : + algebraMap F C (eF.symm y) = + algebraMap A C y := by + simpa using heF (eF.symm y) + rw [← hy] + change σ (algebraMap F C (eF.symm y)) = + algebraMap F C (eF.symm y) + exact σ.commutes _ } + map_one' := rfl + map_mul' := fun _ _ => rfl } + have hchangeBase : Function.Injective changeBase := by + intro σ τ hστ + apply AlgEquiv.ext + intro x + exact congrArg (fun f : C ≃ₐ[A] C => f x) hστ + let transportE : Gal(E/ℚ) →* (B ≃ₐ[ℚ] B) := + (AlgEquiv.autCongr eE).toMonoidHom + have raw_restriction_commutes + (σ : C ≃ₐ[F] C) (x : E) : + (eE + (numberFieldCyclotomicZHatFiniteCompositumRestriction + (F := F) E σ x) : C) = + σ (eE x : C) := by + change + algebraMap E C + (numberFieldCyclotomicZHatFiniteCompositumRestriction + (F := F) E σ x) = + σ (algebraMap E C x) + change + algebraMap E C + ((AlgEquiv.restrictNormal + (MulSemiringAction.toAlgEquiv ℚ C σ) E) x) = + (MulSemiringAction.toAlgEquiv ℚ C σ) + (algebraMap E C x) + exact + AlgEquiv.restrictNormal_commutes + (MulSemiringAction.toAlgEquiv ℚ C σ) E x + have hcomm (σ : C ≃ₐ[F] C) : + transportE + (numberFieldCyclotomicZHatFiniteCompositumRestriction + (F := F) E σ) = + rB (changeBase σ) := by + apply AlgEquiv.ext + intro x + obtain ⟨y, rfl⟩ := eE.surjective x + apply Subtype.ext + have hBrestrict : + (rB (changeBase σ) (eE y) : C) = + changeBase σ (eE y : C) := by + exact + IntermediateField.restrictRestrictAlgEquivMapHom_apply + B A (changeBase σ) (eE y) + calc + (transportE + (numberFieldCyclotomicZHatFiniteCompositumRestriction + (F := F) E σ) (eE y) : C) = + (eE + (numberFieldCyclotomicZHatFiniteCompositumRestriction + (F := F) E σ y) : C) := by + change + ((eE.symm.trans + ((numberFieldCyclotomicZHatFiniteCompositumRestriction + (F := F) E σ).trans eE)) (eE y) : C) = + (eE + (numberFieldCyclotomicZHatFiniteCompositumRestriction + (F := F) E σ y) : C) + simp only [AlgEquiv.trans_apply, AlgEquiv.symm_apply_apply] + _ = σ (eE y : C) := raw_restriction_commutes σ y + _ = changeBase σ (eE y : C) := rfl + _ = (rB (changeBase σ) (eE y) : C) := hBrestrict.symm + intro σ τ hστ + apply hchangeBase + apply hrB + rw [← hcomm σ, ← hcomm τ, hστ] + +/-- The Galois group of the finite compositum is canonically the +subgroup of the rational finite-layer Galois group fixing the actual +intersection with the number field. -/ +noncomputable def + numberFieldCyclotomicZHatFiniteCompositumGalEquivFixingSubgroup + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Gal(numberFieldCyclotomicZHatFiniteCompositum F E/F) ≃* + (numberFieldCyclotomicZHatFiniteIntersection F E).fixingSubgroup := by + letI : Normal ℚ E := E.isGalois.to_normal + let r := + numberFieldCyclotomicZHatFiniteCompositumRestriction + (F := F) E + let eRange : + Gal(numberFieldCyclotomicZHatFiniteCompositum F E/F) ≃* + r.range := + MulEquiv.ofBijective r.rangeRestrict + ⟨fun σ τ h => + numberFieldCyclotomicZHatFiniteCompositumRestriction_injective + (F := F) E (congrArg Subtype.val h), + MonoidHom.rangeRestrict_surjective _⟩ + have hrange : + r.range = + (numberFieldCyclotomicZHatFiniteIntersection F E).fixingSubgroup := by + simpa only [r, + numberFieldCyclotomicZHatFiniteCompositumRestriction] using + (numberFieldCyclotomicZHatFiniteCompositum_restriction_range + (K := F) E) + exact + eRange.trans + (MulEquiv.subgroupCongr hrange) + +/-- The finite compositum Galois group and the intersection-fixing +subgroup have the same cardinality. -/ +theorem + numberFieldCyclotomicZHatFiniteCompositum_galois_card + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Nat.card + (Gal(numberFieldCyclotomicZHatFiniteCompositum F E/F)) = + Nat.card + (numberFieldCyclotomicZHatFiniteIntersection F E).fixingSubgroup := + Nat.card_congr + (numberFieldCyclotomicZHatFiniteCompositumGalEquivFixingSubgroup + (F := F) E).toEquiv + +end FiniteCyclotomicBaseChange + +/-- Restriction from the full actual cyclotomic `ZHat`-compositum over +a number field has image exactly the subgroup fixing the genuine +intersection with the rational cyclotomic `ZHat`-field. -/ +theorem numberFieldCyclotomicZHatCompositumRestriction_range + (F : Type*) [Field F] [NumberField F] : + (numberFieldCyclotomicZHatCompositumRestriction F).range = + ((numberFieldCyclotomicZHatIntersection F).restrict + (show + numberFieldCyclotomicZHatIntersection F ≤ + rationalCyclotomicZHatField from + by + dsimp only [numberFieldCyclotomicZHatIntersection] + exact inf_le_right)).fixingSubgroup := by + let C := numberFieldCyclotomicZHatCompositum F + let : Algebra ℚ C := C.algebra' + let : Algebra F C := + numberFieldCyclotomicZHatCompositumAlgebra F + let : IsScalarTower ℚ F C := + numberFieldCyclotomicZHatCompositum_scalarTower F + let : Algebra rationalCyclotomicZHatField C := + rationalCyclotomicZHatCompositumAlgebra F + let : IsScalarTower ℚ rationalCyclotomicZHatField C := + rationalCyclotomicZHatCompositum_scalarTower F + let : Normal ℚ rationalCyclotomicZHatField := + rationalCyclotomicZHatField_normal + let eF : F →ₐ[ℚ] C := + numberFieldCyclotomicZHatCompositumEmbedding F + let eT : rationalCyclotomicZHatField →ₐ[ℚ] C := + rationalCyclotomicZHatCompositumEmbedding F + let r := numberFieldCyclotomicZHatCompositumRestriction F + have hIntersection_le : + numberFieldCyclotomicZHatIntersection F ≤ + rationalCyclotomicZHatField := by + change + numberFieldInRationalSeparableClosure F ⊓ + rationalCyclotomicZHatField ≤ + rationalCyclotomicZHatField + exact inf_le_right + let J : IntermediateField ℚ rationalCyclotomicZHatField := + (numberFieldCyclotomicZHatIntersection F).restrict + hIntersection_le + have eF_eq_algebraMap (y : F) : + eF y = algebraMap F C y := by + rfl + have restriction_commutes + (τ : C ≃ₐ[F] C) (z : rationalCyclotomicZHatField) : + eT (r τ z) = τ (eT z) := by + change + algebraMap rationalCyclotomicZHatField C (r τ z) = + τ (algebraMap rationalCyclotomicZHatField C z) + change + algebraMap rationalCyclotomicZHatField C + ((AlgEquiv.restrictNormal + (MulSemiringAction.toAlgEquiv ℚ C τ) + rationalCyclotomicZHatField) z) = + (MulSemiringAction.toAlgEquiv ℚ C τ) + (algebraMap rationalCyclotomicZHatField C z) + exact + AlgEquiv.restrictNormal_commutes + (MulSemiringAction.toAlgEquiv ℚ C τ) + rationalCyclotomicZHatField z + have hJ (x : rationalCyclotomicZHatField) : + x ∈ J ↔ eT x ∈ eF.fieldRange := by + change + x ∈ (numberFieldCyclotomicZHatIntersection F).restrict + hIntersection_le ↔ + eT x ∈ eF.fieldRange + rw [IntermediateField.mem_restrict] + change + x.1 ∈ + numberFieldInRationalSeparableClosure F ⊓ + rationalCyclotomicZHatField ↔ + eT x ∈ eF.fieldRange + rw [IntermediateField.mem_inf] + simp only [x.2, and_true] + change + x.1 ∈ (numberFieldSeparableClosureEmbedding F).fieldRange ↔ + eT x ∈ eF.fieldRange + rw [AlgHom.mem_fieldRange, AlgHom.mem_fieldRange] + constructor + · rintro ⟨y, hy⟩ + refine ⟨y, ?_⟩ + apply Subtype.ext + change numberFieldSeparableClosureEmbedding F y = x.1 + exact hy + · rintro ⟨y, hy⟩ + refine ⟨y, ?_⟩ + change numberFieldSeparableClosureEmbedding F y = x.1 + exact congrArg Subtype.val hy + have hfixedField : + IntermediateField.fixedField r.range = J := by + ext x + rw [IntermediateField.mem_fixedField_iff] + rw [hJ] + constructor + · intro hx + have hfixed : + ∀ τ : C ≃ₐ[F] C, τ (eT x) = eT x := by + intro τ + have hxτ : r τ x = x := + hx (r τ) ⟨τ, rfl⟩ + have hrestrict : + eT (r τ x) = τ (eT x) := by + exact restriction_commutes τ x + exact hrestrict.symm.trans (congrArg eT hxτ) + have hmem : + eT x ∈ Set.range (algebraMap F C) := + (InfiniteGalois.mem_range_algebraMap_iff_fixed + (eT x)).2 hfixed + rw [AlgHom.mem_fieldRange] + obtain ⟨y, hy⟩ := hmem + exact ⟨y, (eF_eq_algebraMap y).trans hy⟩ + · intro hx σ hσ + obtain ⟨τ, rfl⟩ := hσ + rw [AlgHom.mem_fieldRange] at hx + obtain ⟨y, hy⟩ := hx + apply eT.injective + have hrestrict : + eT (r τ x) = τ (eT x) := by + exact restriction_commutes τ x + calc + eT (r τ x) = τ (eT x) := hrestrict + _ = τ (eF y) := congrArg τ hy.symm + _ = eF y := by + rw [eF_eq_algebraMap] + exact τ.commutes y + _ = eT x := hy + let H : ClosedSubgroup + (rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField) := + { toSubgroup := r.range + isClosed' := by + change IsClosed (Set.range r) + have hrClosed : + IsClosed + (Set.range + (numberFieldCyclotomicZHatCompositumRestriction F)) := + (isCompact_range + (numberFieldCyclotomicZHatCompositumRestriction_continuous F)).isClosed + simpa only [r] using hrClosed } + change r.range = J.fixingSubgroup + calc + r.range = + (IntermediateField.fixedField r.range).fixingSubgroup := + (by + have hH := InfiniteGalois.fixingSubgroup_fixedField H + change + (IntermediateField.fixedField r.range).fixingSubgroup = + r.range at hH + exact hH.symm) + _ = J.fixingSubgroup := + congrArg + (fun E : IntermediateField ℚ rationalCyclotomicZHatField => + E.fixingSubgroup) + hfixedField + +/-- The genuine cyclotomic `ZHat` coordinate on the full compositum +over a number field. -/ +noncomputable def numberFieldCyclotomicZHatCompositumCoordinate + (F : Type*) [Field F] [NumberField F] : + Gal(numberFieldCyclotomicZHatCompositum F/F) →* + Multiplicative ZHat := + rationalCyclotomicZHatFieldGalEquivZHat.toMonoidHom.comp + (numberFieldCyclotomicZHatCompositumRestriction F) + +/-- The genuine cyclotomic coordinate on the full compositum is +injective. -/ +theorem numberFieldCyclotomicZHatCompositumCoordinate_injective + (F : Type*) [Field F] [NumberField F] : + Function.Injective + (numberFieldCyclotomicZHatCompositumCoordinate F) := + rationalCyclotomicZHatFieldGalEquivZHat.injective.comp + (numberFieldCyclotomicZHatCompositumRestriction_injective F) + +/-- The actual cyclotomic `ZHat`-compositum over every number field +has torsion-free Galois group. -/ +noncomputable instance + numberFieldCyclotomicZHatCompositumGal_isMulTorsionFree + (F : Type*) [Field F] [NumberField F] : + IsMulTorsionFree + (Gal(numberFieldCyclotomicZHatCompositum F/F)) := + Function.Injective.isMulTorsionFree + (numberFieldCyclotomicZHatCompositumCoordinate F) + (numberFieldCyclotomicZHatCompositumCoordinate_injective F) + +/-- The image of the actual cyclotomic compositum over `F` is precisely +`f_F ZHat`, where `f_F` is the degree of the genuine intersection +`F ∩ ℚ_tilde`. -/ +theorem + numberFieldCyclotomicZHatCompositumCoordinate_range_toAddSubgroup + (F : Type*) [Field F] [NumberField F] : + (numberFieldCyclotomicZHatCompositumCoordinate F).range.toAddSubgroup' = + (zHatMulNat + (cyclotomicZHatIntersectionDegree F)).toAddMonoidHom.range := by + rw [numberFieldCyclotomicZHatCompositumCoordinate, + MonoidHom.range_comp, + numberFieldCyclotomicZHatCompositumRestriction_range] + exact + rationalCyclotomicZHatFieldGal_fixingSubgroup_image_eq_mulNat_range + F + +/-- A surjective restriction map admits positive cyclotomic-degree +lifts as soon as the degrees contributed by its kernel have finite +index in `ZHat`. + +This is the group-theoretic core of the decomposition-compatible +Frobenius lift: the initial preimage is corrected inside the genuine +restriction kernel, so its prescribed image is unchanged. -/ +theorem exists_positiveZHatDegree_lift_of_surjective + {D A : Type*} [Group D] [Group A] + (restriction : D →* A) + (hrestriction : Function.Surjective restriction) + (degree : D →* Multiplicative ZHat) + (hdegree : + ((restriction.ker.map degree).toAddSubgroup').index ≠ 0) + (σ : A) : + ∃ τ : D, + restriction τ = σ ∧ + ∃ n : ℕ, 0 < n ∧ + degree τ = + (Multiplicative.ofAdd (1 : ZHat)) ^ n := by + obtain ⟨s, hs⟩ := hrestriction σ + let H : AddSubgroup ZHat := + (restriction.ker.map degree).toAddSubgroup' + obtain ⟨n, hn, hmem⟩ := + exists_positive_nsmul_one_sub_mem_of_index_ne_zero + H hdegree (Multiplicative.toAdd (degree s)) + have hcorrection : + n • (1 : ZHat) - + Multiplicative.toAdd (degree s) ∈ H := by + simpa only [neg_sub] using H.neg_mem hmem + rw [Subgroup.mem_toAddSubgroup'] at hcorrection + obtain ⟨k, hk, hdk⟩ := hcorrection + refine ⟨s * k, ?_, ⟨n, hn, ?_⟩⟩ + · rw [map_mul, hs] + change restriction k = 1 at hk + rw [hk, mul_one] + · apply Multiplicative.ext + rw [map_mul] + rw [toAdd_mul, toAdd_pow, toAdd_ofAdd] + have hdk' := congrArg Multiplicative.toAdd hdk + rw [toAdd_ofAdd] at hdk' + rw [hdk'] + abel + +/-- Two homomorphisms out of a finite commutative group agree once +they agree on every primary component. + +This is the precise prime-power reduction used in the finite-place +argument. It is proved from the actual direct-product decomposition +by the Sylow subgroups; no cyclicity hypothesis on the whole group is +introduced. -/ +theorem MonoidHom.ext_of_eq_on_finitePrimaryComponents + {G A : Type*} + [CommGroup G] [Finite G] + [CommGroup A] + (f g : G →* A) + (hprimary : + ∀ (p : ℕ) (_hp : Fact p.Prime) + (x : CommGroup.primaryComponent G p), + f x = g x) : + f = g := by + classical + let sylowFintype (p : ℕ) : Fintype (Sylow p G) := + Fintype.ofFinite _ + let e : + (∀ p : (Nat.card G).primeFactors, + ∀ P : Sylow p.1 G, P) ≃* G := + Sylow.directProductOfNormal + (G := G) + (fun P => + Subgroup.normal_of_isMulCommutative + (P : Subgroup G)) + apply MonoidHom.ext + intro x + obtain ⟨y, rfl⟩ := e.surjective x + have hy : + y = + ∏ p : (Nat.card G).primeFactors, + ∏ P : Sylow p.1 G, + Pi.mulSingle p + (Pi.mulSingle P (y p P)) := by + calc + y = + ∏ p : (Nat.card G).primeFactors, + Pi.mulSingle p (y p) := + (Finset.univ_prod_mulSingle y).symm + _ = + ∏ p : (Nat.card G).primeFactors, + Pi.mulSingle p + (∏ P : Sylow p.1 G, + Pi.mulSingle P (y p P)) := by + apply Finset.prod_congr rfl + intro p _ + rw [Finset.univ_prod_mulSingle] + _ = + ∏ p : (Nat.card G).primeFactors, + ∏ P : Sylow p.1 G, + Pi.mulSingle p + (Pi.mulSingle P (y p P)) := by + apply Finset.prod_congr rfl + intro p _ + exact + map_prod + (MonoidHom.mulSingle + (fun q : (Nat.card G).primeFactors => + ∀ Q : Sylow q.1 G, Q) p) + (fun P : Sylow p.1 G => + Pi.mulSingle P (y p P)) Finset.univ + have hfactor + (p : (Nat.card G).primeFactors) + (P : Sylow p.1 G) : + f (e (Pi.mulSingle p + (Pi.mulSingle P (y p P)))) = + g (e (Pi.mulSingle p + (Pi.mulSingle P (y p P)))) := by + let hpFact : Fact (Nat.Prime p.1) := + ⟨Nat.prime_of_mem_primeFactors p.2⟩ + let u : + ∀ q : (Nat.card G).primeFactors, + ∀ Q : Sylow q.1 G, Q := + Pi.mulSingle p + (Pi.mulSingle P (y p P)) + let z : G := e u + have hz : + z ∈ CommGroup.primaryComponent G p.1 := by + obtain ⟨n, hn⟩ := + P.isPGroup' (y p P) + refine ⟨n, ?_⟩ + have hu : u ^ p.1 ^ n = 1 := by + dsimp only [u] + rw [← Pi.mulSingle_pow, + ← Pi.mulSingle_pow, + hn, + Pi.mulSingle_one, + Pi.mulSingle_one] + calc + z ^ p.1 ^ n = e (u ^ p.1 ^ n) := by + exact (map_pow e u (p.1 ^ n)).symm + _ = e 1 := by rw [hu] + _ = 1 := map_one e + exact + hprimary p.1 hpFact + ⟨z, hz⟩ + rw [hy] + simp only [map_prod, hfactor] + +/-- Every individual `p`-adic coordinate of the profinite integers is +surjective. This is extracted from the genuine Chinese-remainder +equivalence `ZHat ≃ ∏ p, ℤ_p`. -/ +theorem zHatToPadicInt_surjective + (p : Nat.Primes) : + Function.Surjective (zHatToPadicInt p) := by + classical + intro x + let y : ProfiniteIntegerPrimeProduct := + Pi.single p x + obtain ⟨z, hz⟩ := + zHatToProfiniteIntegerPrimeProduct_surjective y + refine ⟨z, ?_⟩ + have hp := congrFun hz p + simpa only [zHatToProfiniteIntegerPrimeProduct_apply, + y, Pi.single_eq_same] using hp + +/-- The genuine `p`-adic cyclotomic coordinate on the actual Galois +group of the rational cyclotomic `ZHat`-extension. -/ +noncomputable def rationalCyclotomicPadicCoordinate + (p : Nat.Primes) : + (rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField) →ₜ* + Multiplicative ℤ_[p.1] := by + let pCoordinate : + Multiplicative ZHat →ₜ* + Multiplicative ℤ_[p.1] := + ⟨AddMonoidHom.toMultiplicative + (zHatToPadicInt p).toAddMonoidHom, + continuous_ofAdd.comp + ((continuous_zHatToPadicInt p).comp + continuous_toAdd)⟩ + exact + pCoordinate.comp + (ContinuousMonoidHom.toContinuousMonoidHom + rationalCyclotomicZHatFieldGalEquivZHat) + +/-- The rational cyclotomic `p`-adic coordinate is obtained by applying the +canonical `ZHat`-to-`ℤ_p` coordinate to the cyclotomic character. -/ +@[simp] +theorem rationalCyclotomicPadicCoordinate_apply + (p : Nat.Primes) + (σ : + rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField) : + Multiplicative.toAdd + (rationalCyclotomicPadicCoordinate p σ) = + zHatToPadicInt p + (Multiplicative.toAdd + (rationalCyclotomicZHatFieldGalEquivZHat σ)) := + rfl + +/-- The `p`-adic cyclotomic coordinate on the actual decomposition +group of an arbitrary absolute value of the number-field cyclotomic +`ZHat`-compositum. + +This is the restriction of the genuine compositum Galois group to the +rational cyclotomic factor, followed by its actual `ℤ_p` coordinate. +The source is the valuation stabilizer itself, rather than an abstract +copy of a local Galois group. -/ +noncomputable def + numberFieldCyclotomicPadicDecompositionCoordinate + (F : Type) [Field F] [NumberField F] + (wC : AbsoluteValue + (numberFieldCyclotomicZHatCompositum F) ℝ) + (p : Nat.Primes) : + absoluteValueDecompositionGroup F wC →ₜ* + Multiplicative ℤ_[p.1] where + toMonoidHom := + (rationalCyclotomicPadicCoordinate p).toMonoidHom.comp + ((numberFieldCyclotomicZHatCompositumRestriction F).comp + (absoluteValueDecompositionGroup F wC).subtype) + continuous_toFun := + (rationalCyclotomicPadicCoordinate p).continuous_toFun.comp + ((numberFieldCyclotomicZHatCompositumRestriction_continuous + (K := F)).comp continuous_subtype_val) + +/-- The decomposition-group coordinate is the rational cyclotomic coordinate +of the restricted global automorphism. -/ +@[simp] +theorem numberFieldCyclotomicPadicDecompositionCoordinate_apply + (F : Type) [Field F] [NumberField F] + (wC : AbsoluteValue + (numberFieldCyclotomicZHatCompositum F) ℝ) + (p : Nat.Primes) + (σ : absoluteValueDecompositionGroup F wC) : + numberFieldCyclotomicPadicDecompositionCoordinate + F wC p σ = + rationalCyclotomicPadicCoordinate p + (numberFieldCyclotomicZHatCompositumRestriction F σ.1) := + rfl + +/-- On an actual global Artin symbol lying in a decomposition group, +the decomposition coordinate is the `p`-adic coordinate of the +rational cyclotomic idèle value of the ordinary field norm. -/ +theorem + numberFieldCyclotomicPadicDecompositionCoordinate_infiniteGlobalArtin + (F : Type) [Field F] [NumberField F] + (wC : AbsoluteValue + (numberFieldCyclotomicZHatCompositum F) ℝ) + (p : Nat.Primes) (a : IdeleGroup F) + (ha : + infiniteGlobalArtinMonoidHom F + (numberFieldCyclotomicZHatCompositum F) a ∈ + absoluteValueDecompositionGroup F wC) : + numberFieldCyclotomicPadicDecompositionCoordinate + F wC p + ⟨infiniteGlobalArtinMonoidHom F + (numberFieldCyclotomicZHatCompositum F) a, ha⟩ = + Multiplicative.ofAdd + (zHatToPadicInt p + (Multiplicative.toAdd + (rationalCyclotomicZHatIdeleValue + (IdeleGroup.norm ℚ F a)))) := by + apply Multiplicative.ext + rw [ + numberFieldCyclotomicPadicDecompositionCoordinate_apply, + numberFieldCyclotomicZHatCompositumRestriction_infiniteGlobalArtinMonoidHom, + rationalCyclotomicPadicCoordinate_apply, + rationalCyclotomicZHatIdeleValue_apply] + rfl + +/-- The image of a cyclotomic `p`-adic decomposition coordinate is +closed. This is the compact image of the actual closed decomposition +group in the Krull topology. -/ +theorem + numberFieldCyclotomicPadicDecompositionCoordinate_range_isClosed + (F : Type) [Field F] [NumberField F] + (wC : AbsoluteValue + (numberFieldCyclotomicZHatCompositum F) ℝ) + (p : Nat.Primes) : + IsClosed + ((numberFieldCyclotomicPadicDecompositionCoordinate + F wC p).range : + Set (Multiplicative ℤ_[p.1])) := by + let : + CompactSpace + (absoluteValueDecompositionGroup F wC) := + isCompact_iff_compactSpace.mp + (absoluteValueDecompositionGroup_isClosed F wC).isCompact + rw [MonoidHom.coe_range] + exact + (isCompact_range + (numberFieldCyclotomicPadicDecompositionCoordinate + F wC p).continuous_toFun).isClosed + +/-- Reduction of the full cyclotomic character of a rational one-place +idèle whose component is a power of a principal local component. The +result is the same power of the genuine chosen local Artin character. -/ +theorem + rationalCyclotomicCharacterPrimeProduct_finitePlaceIdele_principalComponent_toZModPow + (p q : Nat.Primes) (k d : ℕ) (x : ℚˣ) : + Units.map (PadicInt.toZModPow k).toMonoidHom + (KummerTheory.rationalCyclotomicCharacterPrimeProduct + (infiniteGlobalArtinMonoidHom + ℚ KummerTheory.rationalCyclotomicField + (IdeleGroup.finitePlaceIdele + (RayClass.rationalPrime q) + ((IdeleGroup.finiteComponent + (RayClass.rationalPrime q) + (IdeleGroup.principalIdele ℚ x)) ^ d))) p) = + (rationalCyclotomicPrincipalFinitePlaceCharacter + p k x q) ^ d := by + have hprime : + RayClass.rationalPrime q = + ((Rat.HeightOneSpectrum.primesEquiv + (R := NumberField.RingOfIntegers ℚ)).symm q) := by + rfl + rw [ + rationalCyclotomicGlobalArtin_character_toZModPow, + globalArtinMonoidHom_finitePlaceIdele, + hprime, + map_pow, + map_pow] + exact + congrArg (fun u => u ^ d) + (rationalCyclotomicPrincipalFinitePlaceCharacter_chosenArtin_spec + p k x q).symm + +/-- At the place `p`, the full `p`-adic cyclotomic character of the +one-place idèle obtained from the rational unit `p + 1` is the direct +unit `p + 1`, with the prescribed local-degree power. -/ +theorem + rationalCyclotomicCharacterPrimeProduct_finitePlaceIdele_primeSucc + (p : Nat.Primes) (d : ℕ) : + KummerTheory.rationalCyclotomicCharacterPrimeProduct + (infiniteGlobalArtinMonoidHom + ℚ KummerTheory.rationalCyclotomicField + (IdeleGroup.finitePlaceIdele + (RayClass.rationalPrime p) + ((IdeleGroup.finiteComponent + (RayClass.rationalPrime p) + (IdeleGroup.principalIdele ℚ + (Units.mk0 + ((p.1 + 1 : ℕ) : ℚ) + (by positivity)))) ^ d))) p = + (padicNatUnit p (p.1 + 1) + (Nat.coprime_self_add_right.mpr + (Nat.coprime_one_right p.1))) ^ d := by + let x : ℚˣ := + Units.mk0 + ((p.1 + 1 : ℕ) : ℚ) + (by positivity) + have hx : + (x : ℚ) = + ((p.1 + 1 : ℕ) : ℚ) := + rfl + have hprimeUnit : + (rationalPrimeUnit x p : ℚ) = + ((p.1 + 1 : ℕ) : ℚ) := by + rw [rationalPrimeUnit_val, + hx, + padicValRat_rationalPrime_succ, + neg_zero, + zpow_zero, + one_mul] + have hunit : + padicIntUnitOfRat p + (rationalPrimeUnit x p : ℚ) + (rationalPrimeUnit x p).ne_zero + (padicValRat_rationalPrimeUnit x p) = + padicNatUnit p (p.1 + 1) + (Nat.coprime_self_add_right.mpr + (Nat.coprime_one_right p.1)) := by + apply Units.ext + apply Subtype.ext + rw [padicIntUnitOfRat_coe, + padicNatUnit_val, + hprimeUnit] + exact PadicInt.coe_natCast (p.1 + 1) + apply Units.ext + apply PadicInt.ext_of_toZModPow.mp + intro k + let hpFact : Fact (Nat.Prime p.1) := ⟨p.2⟩ + have hred := + rationalCyclotomicCharacterPrimeProduct_finitePlaceIdele_principalComponent_toZModPow + p p k d x + rw [ + rationalCyclotomicPrincipalFinitePlaceCharacter_at_prime p k x, + hunit] at hred + have hredVal := congrArg Units.val hred + simp only [Units.coe_map, Units.val_pow_eq_pow_val] at hredVal + have htoZModPow (z : ℤ_[p.1]) : + (PadicInt.toZModPow + (p := p.1) (k : ℕ)).toMonoidHom z = + PadicInt.toZModPow (p := p.1) (k : ℕ) z := + rfl + simp only [htoZModPow] at hredVal + simpa only [x, Units.val_pow_eq_pow_val, map_pow] using hredVal + +/-- Away from `p`, the full `p`-adic cyclotomic character of the +rational-prime one-place idèle is inverse arithmetic Frobenius, again +with the prescribed local-degree power. -/ +theorem + rationalCyclotomicCharacterPrimeProduct_finitePlaceIdele_primeAway + (p q : Nat.Primes) (hqp : q ≠ p) (d : ℕ) : + KummerTheory.rationalCyclotomicCharacterPrimeProduct + (infiniteGlobalArtinMonoidHom + ℚ KummerTheory.rationalCyclotomicField + (IdeleGroup.finitePlaceIdele + (RayClass.rationalPrime q) + ((IdeleGroup.finiteComponent + (RayClass.rationalPrime q) + (IdeleGroup.principalIdele ℚ + (Units.mk0 (q.1 : ℚ) + (by exact_mod_cast q.2.ne_zero)))) ^ d))) p = + ((padicNatUnit p q.1 + ((Nat.coprime_primes p.2 q.2).2 + (fun hpq => + hqp (Subtype.ext hpq.symm))))⁻¹) ^ d := by + let x : ℚˣ := + Units.mk0 (q.1 : ℚ) + (by exact_mod_cast q.2.ne_zero) + let hcoprime : p.1.Coprime q.1 := + (Nat.coprime_primes p.2 q.2).2 + (fun hpq => + hqp (Subtype.ext hpq.symm)) + have hx : (x : ℚ) = q.1 := rfl + apply Units.ext + apply PadicInt.ext_of_toZModPow.mp + intro k + let hpFact : Fact (Nat.Prime p.1) := ⟨p.2⟩ + have hlocal : + rationalCyclotomicPrincipalFinitePlaceCharacter + p k x q = + (ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr + (rationalPrime_not_dvd_pow_of_ne + q p hqp k)))⁻¹ := by + rw [ + rationalCyclotomicPrincipalFinitePlaceCharacter_of_ne + p q hqp k x, + hx, + padicValRat.self q.2.one_lt, + zpow_neg, + zpow_one] + have hred := + rationalCyclotomicCharacterPrimeProduct_finitePlaceIdele_principalComponent_toZModPow + p q k d x + rw [hlocal] at hred + have htarget : + Units.map + (PadicInt.toZModPow + (p := p.1) (k : ℕ)).toMonoidHom + (((padicNatUnit p q.1 hcoprime)⁻¹) ^ d) = + ((ZMod.unitOfCoprime q.1 + (hcoprime.symm.pow_right k))⁻¹) ^ d := by + rw [map_pow, map_inv, + padicNatUnit_toZModPow] + have hredVal := + congrArg Units.val (hred.trans htarget.symm) + simp only [Units.coe_map, Units.val_pow_eq_pow_val] at hredVal + have htoZModPow (z : ℤ_[p.1]) : + (PadicInt.toZModPow + (p := p.1) (k : ℕ)).toMonoidHom z = + PadicInt.toZModPow (p := p.1) (k : ℕ) z := + rfl + simp only [htoZModPow] at hredVal + simpa only [x, hcoprime, Units.val_pow_eq_pow_val, + Units.val_inv_eq_inv_val] using hredVal + +/-- The image of the actual decomposition group has a nonzero +`p`-adic cyclotomic coordinate. + +The witness is a genuine one-place idèle over `F`. Its component is +obtained by extending a rational completion unit to the chosen place: +at residue characteristic `p` we use `p + 1`, and away from `p` we use +the rational residue prime. The ordinary idèle norm is the corresponding +positive local-degree power. The direct-unit and inverse-Frobenius +local formulas show that its full `p`-adic cyclotomic character is +non-torsion, so its torsion-free coordinate cannot vanish. -/ +theorem + numberFieldCyclotomicPadicDecompositionCoordinate_range_toAddSubgroup_ne_bot + (F : Type) [Field F] [NumberField F] + (v : HeightOneSpectrum (𝓞 F)) + (wC : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv F v) + (numberFieldCyclotomicZHatCompositum F)) + (p : Nat.Primes) : + (numberFieldCyclotomicPadicDecompositionCoordinate + F wC.1 p).range.toAddSubgroup' ≠ + (⊥ : AddSubgroup ℤ_[p.1]) := by + let q₀ : HeightOneSpectrum (𝓞 ℚ) := + _root_.finitePlaceBelow (K := ℚ) v + let q : Nat.Primes := + Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ) q₀ + have hq : + RayClass.rationalPrime q = q₀ := by + simpa only [q] using + (Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ)).symm_apply_apply q₀ + let x : ℚˣ := + if q = p then + Units.mk0 + ((p.1 + 1 : ℕ) : ℚ) + (by positivity) + else + Units.mk0 (q.1 : ℚ) + (by exact_mod_cast q.2.ne_zero) + let b : (q₀.adicCompletion ℚ)ˣ := + IdeleGroup.finiteComponent q₀ + (IdeleGroup.principalIdele ℚ x) + let d : ℕ := + IdeleGroup.finitePlaceCompletionDegree + (K := ℚ) (L := F) v + have hd : 0 < d := + IdeleGroup.finitePlaceCompletionDegree_pos + (K := ℚ) (L := F) v + let a : IdeleGroup F := + IdeleGroup.finitePlaceIdele v + (IdeleGroup.finitePlaceBaseUnitExtension + (K := ℚ) (L := F) v b) + have hnorm : + IdeleGroup.norm ℚ F a = + IdeleGroup.finitePlaceIdele q₀ (b ^ d) := by + exact + IdeleGroup.norm_finitePlaceIdele_finitePlaceBaseUnitExtension + (K := ℚ) (L := F) v b + have hArtin : + infiniteGlobalArtinMonoidHom F + (numberFieldCyclotomicZHatCompositum F) a ∈ + absoluteValueDecompositionGroup F wC.1 := by + exact + infiniteGlobalArtinMonoidHom_finitePlaceIdele_mem_absoluteValueDecompositionGroup + v wC + (IdeleGroup.finitePlaceBaseUnitExtension + (K := ℚ) (L := F) v b) + let τ : + absoluteValueDecompositionGroup F wC.1 := + ⟨infiniteGlobalArtinMonoidHom F + (numberFieldCyclotomicZHatCompositum F) a, + hArtin⟩ + have hτne : + numberFieldCyclotomicPadicDecompositionCoordinate + F wC.1 p τ ≠ 1 := by + intro hτone + have hcoordinate := + numberFieldCyclotomicPadicDecompositionCoordinate_infiniteGlobalArtin + F wC.1 p a hArtin + have hfreeNorm : + zHatToPadicInt p + (Multiplicative.toAdd + (rationalCyclotomicZHatIdeleValue + (IdeleGroup.norm ℚ F a))) = + 0 := by + have hone : + Multiplicative.ofAdd + (zHatToPadicInt p + (Multiplicative.toAdd + (rationalCyclotomicZHatIdeleValue + (IdeleGroup.norm ℚ F a)))) = + 1 := + hcoordinate.symm.trans hτone + exact congrArg Multiplicative.toAdd hone + rw [hnorm, + rationalCyclotomicZHatIdeleValue_eq_fullCharacterFreePart] + at hfreeNorm + let σQ := + infiniteGlobalArtinMonoidHom + ℚ KummerTheory.rationalCyclotomicField + (IdeleGroup.finitePlaceIdele q₀ (b ^ d)) + let u : ZHatˣ := + KummerTheory.rationalCyclotomicCharacterContinuousMulEquiv σQ + have hfree : + zHatToPadicInt p + (Multiplicative.toAdd + (KummerTheory.zHatUnitsDecomposition u).1) = + 0 := by + simpa only [u, σQ] using hfreeNorm + have hfinite : + IsOfFinOrder + (KummerTheory.rationalCyclotomicCharacterPrimeProduct + σQ p) := by + have htorsion := + KummerTheory.zHatUnit_padicCoordinate_isOfFinOrder_of_freeCoordinate_eq_zero + u p hfree + simpa only [ + u, + KummerTheory.zHatUnitsContinuousMulEquivPrimeProduct_rationalCyclotomicCharacter] + using htorsion + by_cases hqp : q = p + · have hcharacter : + KummerTheory.rationalCyclotomicCharacterPrimeProduct + σQ p = + (padicNatUnit p (p.1 + 1) + (Nat.coprime_self_add_right.mpr + (Nat.coprime_one_right p.1))) ^ d := by + dsimp only [σQ, b, x] + rw [ite_eq_left hqp, ← hq, hqp] + exact + rationalCyclotomicCharacterPrimeProduct_finitePlaceIdele_primeSucc + p d + have hpowerFinite : + IsOfFinOrder + ((padicNatUnit p (p.1 + 1) + (Nat.coprime_self_add_right.mpr + (Nat.coprime_one_right p.1))) ^ d) := by + rw [← hcharacter] + exact hfinite + have hbaseFinite := hpowerFinite.of_pow hd.ne' + exact + (padicNatUnit_not_isOfFinOrder_of_one_lt + p (p.1 + 1) + (Nat.coprime_self_add_right.mpr + (Nat.coprime_one_right p.1)) + (Nat.lt_trans p.2.one_lt + (Nat.lt_succ_self p.1))) hbaseFinite + · let hcoprime : p.1.Coprime q.1 := + (Nat.coprime_primes p.2 q.2).2 + (fun hpq => + hqp (Subtype.ext hpq.symm)) + have hcharacter : + KummerTheory.rationalCyclotomicCharacterPrimeProduct + σQ p = + ((padicNatUnit p q.1 hcoprime)⁻¹) ^ d := by + dsimp only [σQ, b, x] + rw [ite_eq_right hqp, ← hq] + simpa only [hcoprime] using + rationalCyclotomicCharacterPrimeProduct_finitePlaceIdele_primeAway + p q hqp d + have hinversePowerFinite : + IsOfFinOrder + (((padicNatUnit p q.1 hcoprime)⁻¹) ^ d) := by + rw [← hcharacter] + exact hfinite + have hinverseFinite := hinversePowerFinite.of_pow hd.ne' + have hbaseFinite := hinverseFinite.of_inv + exact + (padicNatUnit_not_isOfFinOrder_of_one_lt + p q.1 hcoprime q.2.one_lt) hbaseFinite + intro hbot + have hmem : + Multiplicative.toAdd + (numberFieldCyclotomicPadicDecompositionCoordinate + F wC.1 p τ) ∈ + (numberFieldCyclotomicPadicDecompositionCoordinate + F wC.1 p).range.toAddSubgroup' := by + rw [Subgroup.mem_toAddSubgroup', ofAdd_toAdd] + exact ⟨τ, rfl⟩ + rw [hbot] at hmem + exact + hτne + (congrArg Multiplicative.ofAdd + (AddSubgroup.mem_bot.mp hmem)) + +/-- The actual `p`-adic coordinate of a finite-place decomposition +group has finite index in `ℤ_[p]`. This is the precise nonvanishing +input used to correct a Frobenius lift inside the restriction kernel. -/ +theorem + numberFieldCyclotomicPadicDecompositionCoordinate_range_index_ne_zero + (F : Type) [Field F] [NumberField F] + (v : HeightOneSpectrum (𝓞 F)) + (wC : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv F v) + (numberFieldCyclotomicZHatCompositum F)) + (p : Nat.Primes) : + ((numberFieldCyclotomicPadicDecompositionCoordinate + F wC.1 p).range.toAddSubgroup').index ≠ 0 := by + let H : AddSubgroup ℤ_[p.1] := + (numberFieldCyclotomicPadicDecompositionCoordinate + F wC.1 p).range.toAddSubgroup' + have hclosed : + IsClosed (H : Set ℤ_[p.1]) := by + change + IsClosed + ((numberFieldCyclotomicPadicDecompositionCoordinate + F wC.1 p).range : + Set (Multiplicative ℤ_[p.1])) + exact + numberFieldCyclotomicPadicDecompositionCoordinate_range_isClosed + F wC.1 p + have hne : H ≠ ⊥ := + numberFieldCyclotomicPadicDecompositionCoordinate_range_toAddSubgroup_ne_bot + F v wC p + have hopen : IsOpen (H : Set ℤ_[p.1]) := + PadicInt.addSubgroup_isOpen_of_isClosed_of_ne_bot + p.1 H hclosed hne + let : Finite (ℤ_[p.1] ⧸ H) := + AddSubgroup.quotient_finite_of_isOpen H hopen + exact H.index_ne_zero_of_finite + +/-- The finite-index conclusion depends only on the valuation +class of the chosen absolute value on the cyclotomic compositum. -/ +theorem + numberFieldCyclotomicPadicDecompositionCoordinate_range_index_ne_zero_of_isEquiv + (F : Type) [Field F] [NumberField F] + (v : HeightOneSpectrum (𝓞 F)) + (wC : AbsoluteValue + (numberFieldCyclotomicZHatCompositum F) ℝ) + (wC' : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv F v) + (numberFieldCyclotomicZHatCompositum F)) + (hww' : wC.IsEquiv wC'.1) + (p : Nat.Primes) : + ((numberFieldCyclotomicPadicDecompositionCoordinate + F wC p).range.toAddSubgroup').index ≠ 0 := by + have hD : + absoluteValueDecompositionGroup F wC = + absoluteValueDecompositionGroup F wC'.1 := + absoluteValueDecompositionGroup_eq_of_absoluteValue_isEquiv + wC wC'.1 hww' + have hrange : + (numberFieldCyclotomicPadicDecompositionCoordinate + F wC p).range = + (numberFieldCyclotomicPadicDecompositionCoordinate + F wC'.1 p).range := by + ext y + constructor + · rintro ⟨σ, rfl⟩ + let σ' : + absoluteValueDecompositionGroup F wC'.1 := + ⟨σ.1, by + rw [← hD] + exact σ.2⟩ + exact ⟨σ', rfl⟩ + · rintro ⟨σ, rfl⟩ + let σ' : + absoluteValueDecompositionGroup F wC := + ⟨σ.1, by + rw [hD] + exact σ.2⟩ + exact ⟨σ', rfl⟩ + rw [hrange] + exact + numberFieldCyclotomicPadicDecompositionCoordinate_range_index_ne_zero + F v wC' p + +/-- The finite-index conclusion for an arbitrary representative of the +valuation class above `v`. + +The hypothesis only compares the restriction of the chosen absolute value +with the normalized `v`-adic absolute value. We raise the chosen +nonarchimedean absolute value to the unique positive normalizing exponent, +obtaining an exact extension without changing its decomposition group. -/ +theorem + numberFieldCyclotomicPadicDecompositionCoordinate_range_index_ne_zero_of_base_isEquiv + (F : Type) [Field F] [NumberField F] + (v : HeightOneSpectrum (𝓞 F)) + (wC : AbsoluteValue + (numberFieldCyclotomicZHatCompositum F) ℝ) + (hbase : + (wC.comp + (f := algebraMap F + (numberFieldCyclotomicZHatCompositum F)) + (algebraMap F + (numberFieldCyclotomicZHatCompositum F)).injective).IsEquiv + (NumberField.HeightOneSpectrum.adicAbv F v)) + (p : Nat.Primes) : + ((numberFieldCyclotomicPadicDecompositionCoordinate + F wC p).range.toAddSubgroup').index ≠ 0 := by + let vF : AbsoluteValue F ℝ := + NumberField.HeightOneSpectrum.adicAbv F v + let wF : AbsoluteValue F ℝ := + wC.comp + (f := algebraMap F + (numberFieldCyclotomicZHatCompositum F)) + (algebraMap F + (numberFieldCyclotomicZHatCompositum F)).injective + have hvFna : IsNonarchimedean (vF : F → ℝ) := + NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv F v + have hwFna : IsNonarchimedean (wF : F → ℝ) := by + rw [AbsoluteValue.isNonarchimedean_iff_bounded_nat] + refine ⟨1, ?_⟩ + intro n + exact + (hbase.le_one_iff).2 + (hvFna.apply_natCast_le_one + (map_zero_le vF 1) (map_one vF)) + have hwCna : + IsNonarchimedean + (wC : + numberFieldCyclotomicZHatCompositum F → ℝ) := by + rw [AbsoluteValue.isNonarchimedean_iff_bounded_nat] + refine ⟨1, ?_⟩ + intro n + have hn : + (n : numberFieldCyclotomicZHatCompositum F) = + algebraMap F + (numberFieldCyclotomicZHatCompositum F) + (n : F) := by + exact + (map_natCast + (algebraMap F + (numberFieldCyclotomicZHatCompositum F)) n).symm + rw [hn] + exact + hwFna.apply_natCast_le_one + (map_zero_le wF 1) (map_one wF) + obtain ⟨c, hc, hpow⟩ := + (AbsoluteValue.isEquiv_iff_exists_rpow_eq).1 hbase + let wC' : + AbsoluteValueExtension vF + (numberFieldCyclotomicZHatCompositum F) := + ⟨AbsoluteValue.nonarchimedeanRpow + wC hwCna c hc, + by + intro x + change + wC + (algebraMap F + (numberFieldCyclotomicZHatCompositum F) x) ^ + c = + vF x + exact congrFun hpow x⟩ + have hwwC' : wC.IsEquiv wC'.1 := + AbsoluteValue.isEquiv_nonarchimedeanRpow + wC hwCna c hc + exact + numberFieldCyclotomicPadicDecompositionCoordinate_range_index_ne_zero_of_isEquiv + F v wC wC' hwwC' p + +/-- The actual cyclotomic `p`-adic coordinate is onto. -/ +theorem rationalCyclotomicPadicCoordinate_surjective + (p : Nat.Primes) : + Function.Surjective + (rationalCyclotomicPadicCoordinate p) := by + intro y + obtain ⟨z, hz⟩ := + zHatToPadicInt_surjective p + (Multiplicative.toAdd y) + obtain ⟨σ, hσ⟩ := + rationalCyclotomicZHatFieldGalEquivZHat.surjective + (Multiplicative.ofAdd z) + refine ⟨σ, ?_⟩ + apply Multiplicative.ext + rw [rationalCyclotomicPadicCoordinate_apply, hσ] + exact hz + +/-- The closed subgroup fixing the `p`-primary cyclotomic direction. -/ +noncomputable def rationalCyclotomicPadicKernel + (p : Nat.Primes) : + ClosedSubgroup + (rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField) where + toSubgroup := + (rationalCyclotomicPadicCoordinate p).toMonoidHom.ker + isClosed' := by + change + IsClosed + ((rationalCyclotomicPadicCoordinate p) ⁻¹' + ({1} : Set (Multiplicative ℤ_[p.1]))) + exact + isClosed_singleton.preimage + (rationalCyclotomicPadicCoordinate p).continuous_toFun + +/-- The closed `p`-adic coordinate kernel is normal because it is the +kernel of a group homomorphism. -/ +instance rationalCyclotomicPadicKernel_normal + (p : Nat.Primes) : + (rationalCyclotomicPadicKernel p).toSubgroup.Normal := by + change + (rationalCyclotomicPadicCoordinate p).toMonoidHom.ker.Normal + exact MonoidHom.normal_ker _ + +/-- The `p`-primary cyclotomic field inside the rational cyclotomic +`ZHat`-extension. Its defining subgroup is the kernel of the actual +coordinate to `ℤ_p`. -/ +abbrev rationalCyclotomicPadicFieldWithinZHat + (p : Nat.Primes) : + IntermediateField ℚ rationalCyclotomicZHatField := + IntermediateField.fixedField + (rationalCyclotomicPadicKernel p).toSubgroup + +/-- The internal `p`-primary fixed field is Galois over `ℚ`. -/ +noncomputable instance + rationalCyclotomicPadicFieldWithinZHat_isGalois + (p : Nat.Primes) : + IsGalois ℚ (rationalCyclotomicPadicFieldWithinZHat p) := by + change + IsGalois ℚ + (IntermediateField.fixedField + (rationalCyclotomicPadicKernel p).toSubgroup) + exact + IsGalois.of_fixedField_normal_subgroup + (rationalCyclotomicPadicKernel p).toSubgroup + +/-- The canonical algebra maps through the internal `p`-primary fixed +field form a scalar tower. -/ +instance rationalCyclotomicPadicFieldWithinZHat_scalarTower + (p : Nat.Primes) : + IsScalarTower ℚ (rationalCyclotomicPadicFieldWithinZHat p) + rationalCyclotomicZHatField := by + apply IsScalarTower.of_algebraMap_eq' + rfl + +/-- The actual `p`-primary cyclotomic field in the fixed rational +separable closure. -/ +def rationalCyclotomicPadicField + (p : Nat.Primes) : + IntermediateField ℚ (SeparableClosure ℚ) := + IntermediateField.lift + (rationalCyclotomicPadicFieldWithinZHat p) + +/-- The actual `p`-primary field is contained in the cyclotomic +`ZHat`-extension. -/ +theorem rationalCyclotomicPadicField_le_cyclotomicZHatField + (p : Nat.Primes) : + rationalCyclotomicPadicField p ≤ + rationalCyclotomicZHatField := + IntermediateField.lift_le + (rationalCyclotomicPadicFieldWithinZHat p) + +/-- The fixing subgroup of the internal `p`-primary field is exactly +the kernel of the `p`-adic cyclotomic coordinate. -/ +theorem rationalCyclotomicPadicFieldWithinZHat_fixingSubgroup + (p : Nat.Primes) : + (rationalCyclotomicPadicFieldWithinZHat p).fixingSubgroup = + (rationalCyclotomicPadicKernel p).toSubgroup := by + exact + InfiniteGalois.fixingSubgroup_fixedField + (rationalCyclotomicPadicKernel p) + +/-- The Galois group of the internal `p`-primary cyclotomic field is +the actual additive group of `p`-adic integers, written +multiplicatively. -/ +noncomputable def + rationalCyclotomicPadicFieldWithinZHatGalEquivPadicInt + (p : Nat.Primes) : + (rationalCyclotomicPadicFieldWithinZHat p ≃ₐ[ℚ] + rationalCyclotomicPadicFieldWithinZHat p) ≃* + Multiplicative ℤ_[p.1] := + (InfiniteGalois.normalAutEquivQuotient + (rationalCyclotomicPadicKernel p)).symm.trans + (QuotientGroup.quotientKerEquivOfSurjective + (rationalCyclotomicPadicCoordinate p).toMonoidHom + (rationalCyclotomicPadicCoordinate_surjective p)) + +/-- Under the `ℤ_p` coordinate, restriction to the internal +`p`-primary field is exactly the original cyclotomic coordinate. -/ +theorem + rationalCyclotomicPadicFieldWithinZHatGalEquivPadicInt_restrict + (p : Nat.Primes) + (σ : + rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField) : + rationalCyclotomicPadicFieldWithinZHatGalEquivPadicInt p + (AlgEquiv.restrictNormalHom + (rationalCyclotomicPadicFieldWithinZHat p) σ) = + rationalCyclotomicPadicCoordinate p σ := by + let e := + InfiniteGalois.normalAutEquivQuotient + (rationalCyclotomicPadicKernel p) + let q := + QuotientGroup.quotientKerEquivOfSurjective + (rationalCyclotomicPadicCoordinate p).toMonoidHom + (rationalCyclotomicPadicCoordinate_surjective p) + change + q + (e.symm (e σ)) = + rationalCyclotomicPadicCoordinate p σ + rw [e.symm_apply_apply] + rfl + +/-- The actual `p`-primary cyclotomic field is an abelian Galois +extension of `ℚ`. -/ +noncomputable instance + rationalCyclotomicPadicField_isAbelianGalois + (p : Nat.Primes) : + IsAbelianGalois ℚ (rationalCyclotomicPadicField p) := by + exact + @IsAbelianGalois.of_algHom + ℚ (rationalCyclotomicPadicField p) + rationalCyclotomicZHatField + _ _ _ _ _ + (IntermediateField.inclusion + (rationalCyclotomicPadicField_le_cyclotomicZHatField p)) + rationalCyclotomicZHatField_isAbelianGalois + +/-- Reduction from `p`-adic integers to a finite `p`-power quotient is +surjective. -/ +theorem padicIntToZModPow_surjective + (p : Nat.Primes) (n : ℕ) : + Function.Surjective + (PadicInt.toZModPow + (p := p.1) n) := by + intro x + refine ⟨(x.val : ℤ_[p.1]), ?_⟩ + calc + PadicInt.toZModPow n (x.val : ℤ_[p.1]) = + (x.val : ZMod (p.1 ^ n)) := by + exact map_natCast + (PadicInt.toZModPow + (p := p.1) n) x.val + _ = x := ZMod.natCast_zmod_val x + +/-- The finite `p^n` cyclotomic coordinate on the genuine +cyclotomic `ZHat` Galois group. -/ +noncomputable def rationalCyclotomicPadicReduction + (p : Nat.Primes) (n : ℕ) : + (rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField) →* + Multiplicative (ZMod (p.1 ^ n)) := + (AddMonoidHom.toMultiplicative + (PadicInt.toZModPow + (p := p.1) n).toAddMonoidHom).comp + (rationalCyclotomicPadicCoordinate p).toMonoidHom + +/-- Finite cyclotomic reduction is obtained by reducing the `p`-adic +cyclotomic coordinate modulo `p^n`. -/ +@[simp] +theorem rationalCyclotomicPadicReduction_apply + (p : Nat.Primes) (n : ℕ) + (σ : + rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField) : + Multiplicative.toAdd + (rationalCyclotomicPadicReduction p n σ) = + PadicInt.toZModPow n + (Multiplicative.toAdd + (rationalCyclotomicPadicCoordinate p σ)) := + rfl + +/-- Every finite `p^n` cyclotomic coordinate is onto. -/ +theorem rationalCyclotomicPadicReduction_surjective + (p : Nat.Primes) (n : ℕ) : + Function.Surjective + (rationalCyclotomicPadicReduction p n) := by + intro y + obtain ⟨a, ha⟩ := + padicIntToZModPow_surjective p n + (Multiplicative.toAdd y) + obtain ⟨σ, hσ⟩ := + rationalCyclotomicPadicCoordinate_surjective p + (Multiplicative.ofAdd a) + refine ⟨σ, ?_⟩ + apply Multiplicative.ext + rw [rationalCyclotomicPadicReduction_apply, hσ] + exact ha + +/-- The closed subgroup cutting out the finite `p^n` cyclotomic +layer. -/ +noncomputable def rationalCyclotomicPadicLevelKernel + (p : Nat.Primes) (n : ℕ) : + ClosedSubgroup + (rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField) where + toSubgroup := + (rationalCyclotomicPadicReduction p n).ker + isClosed' := by + let c := + fun σ : + rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField => + Multiplicative.toAdd + (rationalCyclotomicPadicCoordinate p σ) + have hc : Continuous c := + continuous_toAdd.comp + (rationalCyclotomicPadicCoordinate p).continuous_toFun + have hspan : + IsClosed + ((Ideal.span + ({(p.1 : ℤ_[p.1]) ^ n} : + Set ℤ_[p.1]) : + Ideal ℤ_[p.1]) : + Set ℤ_[p.1]) := by + have hset : + ((Ideal.span + ({(p.1 : ℤ_[p.1]) ^ n} : + Set ℤ_[p.1]) : + Ideal ℤ_[p.1]) : + Set ℤ_[p.1]) = + Metric.closedBall 0 + ((p.1 : ℝ) ^ (-n : ℤ)) := by + ext x + change + x ∈ + (Ideal.span + ({(p.1 : ℤ_[p.1]) ^ n} : Set ℤ_[p.1]) : + Ideal ℤ_[p.1]) ↔ + dist x 0 ≤ (p.1 : ℝ) ^ (-n : ℤ) + rw [dist_zero_right, + PadicInt.norm_le_pow_iff_mem_span_pow] + rw [hset] + exact Metric.isClosed_closedBall + change + IsClosed + {σ | + rationalCyclotomicPadicReduction p n σ = 1} + rw [show + {σ | + rationalCyclotomicPadicReduction p n σ = 1} = + c ⁻¹' + ((Ideal.span + ({(p.1 : ℤ_[p.1]) ^ n} : + Set ℤ_[p.1]) : + Ideal ℤ_[p.1]) : + Set ℤ_[p.1]) by + ext σ + change + PadicInt.toZModPow n (c σ) = 0 ↔ + c σ ∈ + (Ideal.span + ({(p.1 : ℤ_[p.1]) ^ n} : + Set ℤ_[p.1]) : + Ideal ℤ_[p.1]) + rw [← PadicInt.ker_toZModPow n, + RingHom.mem_ker]] + exact hspan.preimage hc + +/-- The finite-coordinate kernel is normal because it is the kernel of +a group homomorphism. -/ +instance rationalCyclotomicPadicLevelKernel_normal + (p : Nat.Primes) (n : ℕ) : + (rationalCyclotomicPadicLevelKernel p n).toSubgroup.Normal := by + change (rationalCyclotomicPadicReduction p n).ker.Normal + exact MonoidHom.normal_ker _ + +/-- The finite-coordinate kernel is open in the cyclotomic Galois +group. -/ +theorem rationalCyclotomicPadicLevelKernel_isOpen + (p : Nat.Primes) (n : ℕ) : + IsOpen + ((rationalCyclotomicPadicLevelKernel p n : + Subgroup + (rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField)) : + Set + (rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField)) := by + let q := + rationalCyclotomicPadicReduction p n + let : + Finite + ((rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField) ⧸ q.ker) := + Finite.of_injective + (QuotientGroup.quotientKerEquivOfSurjective + q + (rationalCyclotomicPadicReduction_surjective p n)) + (QuotientGroup.quotientKerEquivOfSurjective + q + (rationalCyclotomicPadicReduction_surjective p n)).injective + let : q.ker.FiniteIndex := + Subgroup.finiteIndex_of_finite_quotient + change + IsOpen + (q.ker : + Set + (rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField)) + exact + q.ker.isOpen_of_isClosed_of_finiteIndex + (rationalCyclotomicPadicLevelKernel p n).isClosed' + +/-- The genuine finite cyclotomic `p^n` layer inside the actual +cyclotomic `ZHat`-extension. -/ +noncomputable abbrev rationalCyclotomicPadicFiniteLevel + (p : Nat.Primes) (n : ℕ) : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField where + toIntermediateField := + IntermediateField.fixedField + (rationalCyclotomicPadicLevelKernel p n).toSubgroup + finiteDimensional := by + apply + (InfiniteGalois.isOpen_iff_finite + (IntermediateField.fixedField + (rationalCyclotomicPadicLevelKernel p n).toSubgroup)).mp + rw [ + InfiniteGalois.fixingSubgroup_fixedField + (rationalCyclotomicPadicLevelKernel p n)] + exact + rationalCyclotomicPadicLevelKernel_isOpen p n + isGalois := by infer_instance + +/-- The bundled finite `p^n` layer exposes its constructed Galois +instance across the opaque field definition. -/ +noncomputable instance rationalCyclotomicPadicFiniteLevel_isGalois + (p : Nat.Primes) (n : ℕ) : + IsGalois ℚ (rationalCyclotomicPadicFiniteLevel p n) := + (rationalCyclotomicPadicFiniteLevel p n).isGalois + +/-- The canonical algebra maps through the finite `p^n` layer form a +scalar tower. -/ +instance rationalCyclotomicPadicFiniteLevel_scalarTower + (p : Nat.Primes) (n : ℕ) : + IsScalarTower ℚ (rationalCyclotomicPadicFiniteLevel p n) + rationalCyclotomicZHatField := by + apply IsScalarTower.of_algebraMap_eq' + rfl + +/-- The Galois group of the finite `p^n` cyclotomic level is the +actual cyclic group `ZMod (p^n)`. -/ +noncomputable def + rationalCyclotomicPadicFiniteLevelGalEquivZMod + (p : Nat.Primes) (n : ℕ) : + (rationalCyclotomicPadicFiniteLevel p n ≃ₐ[ℚ] + rationalCyclotomicPadicFiniteLevel p n) ≃* + Multiplicative (ZMod (p.1 ^ n)) := + (InfiniteGalois.normalAutEquivQuotient + (rationalCyclotomicPadicLevelKernel p n)).symm.trans + (QuotientGroup.quotientKerEquivOfSurjective + (rationalCyclotomicPadicReduction p n) + (rationalCyclotomicPadicReduction_surjective p n)) + +/-- Restriction to a finite `p^n` level is exactly reduction of the +genuine `p`-adic cyclotomic coordinate modulo `p^n`. -/ +theorem + rationalCyclotomicPadicFiniteLevelGalEquivZMod_restrict + (p : Nat.Primes) (n : ℕ) + (σ : + rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField) : + rationalCyclotomicPadicFiniteLevelGalEquivZMod p n + (AlgEquiv.restrictNormalHom + (rationalCyclotomicPadicFiniteLevel p n) σ) = + rationalCyclotomicPadicReduction p n σ := by + let e := + InfiniteGalois.normalAutEquivQuotient + (rationalCyclotomicPadicLevelKernel p n) + let q := + QuotientGroup.quotientKerEquivOfSurjective + (rationalCyclotomicPadicReduction p n) + (rationalCyclotomicPadicReduction_surjective p n) + change + q + (e.symm (e σ)) = + rationalCyclotomicPadicReduction p n σ + rw [e.symm_apply_apply] + rfl + +/-- The Galois group of the base-changed finite `p`-primary +cyclotomic layer, embedded in its genuine `ZMod (p^n)` coordinate. -/ +noncomputable def + numberFieldCyclotomicPadicFiniteCompositumCoordinate + (F : Type*) [Field F] [NumberField F] + (p : Nat.Primes) (n : ℕ) : + Gal(numberFieldCyclotomicZHatFiniteCompositum F + (rationalCyclotomicPadicFiniteLevel p n)/F) →* + Multiplicative (ZMod (p.1 ^ n)) := + (rationalCyclotomicPadicFiniteLevelGalEquivZMod + p n).toMonoidHom.comp + (numberFieldCyclotomicZHatFiniteCompositumRestriction + (F := F) + (rationalCyclotomicPadicFiniteLevel p n)) + +/-- The finite base-changed cyclotomic coordinate is injective. Thus +the actual compositum Galois group is realized as a subgroup of the +cyclic `p`-power coordinate, with no abstract replacement field. -/ +theorem + numberFieldCyclotomicPadicFiniteCompositumCoordinate_injective + (F : Type*) [Field F] [NumberField F] + (p : Nat.Primes) (n : ℕ) : + Function.Injective + (numberFieldCyclotomicPadicFiniteCompositumCoordinate + F p n) := + (rationalCyclotomicPadicFiniteLevelGalEquivZMod p n).injective.comp + (numberFieldCyclotomicZHatFiniteCompositumRestriction_injective + (F := F) + (rationalCyclotomicPadicFiniteLevel p n)) + +/-- Every actual finite base-changed `p`-primary cyclotomic layer has +cyclic Galois group. The statement is about the genuine compositum +over `F`: cyclicity follows by embedding its Galois group into the +standard cyclic `ZMod (p^n)` coordinate. -/ +theorem + numberFieldCyclotomicPadicFiniteCompositum_isCyclic + (F : Type*) [Field F] [NumberField F] + (p : Nat.Primes) (n : ℕ) : + IsCyclic + (Gal(numberFieldCyclotomicZHatFiniteCompositum F + (rationalCyclotomicPadicFiniteLevel p n)/F)) := + isCyclic_of_injective + (numberFieldCyclotomicPadicFiniteCompositumCoordinate + F p n) + (numberFieldCyclotomicPadicFiniteCompositumCoordinate_injective + F p n) + +/-- The degree of the genuine finite `p^n` cyclotomic level is +exactly `p^n`. -/ +theorem rationalCyclotomicPadicFiniteLevel_finrank + (p : Nat.Primes) (n : ℕ) : + Module.finrank ℚ + (rationalCyclotomicPadicFiniteLevel p n) = + p.1 ^ n := by + let : + FiniteDimensional ℚ + (rationalCyclotomicPadicFiniteLevel p n).toIntermediateField := + (rationalCyclotomicPadicFiniteLevel p n).finiteDimensional + calc + Module.finrank ℚ + (rationalCyclotomicPadicFiniteLevel p n) = + Nat.card + (rationalCyclotomicPadicFiniteLevel p n ≃ₐ[ℚ] + rationalCyclotomicPadicFiniteLevel p n) := + (IsGalois.card_aut_eq_finrank + ℚ (rationalCyclotomicPadicFiniteLevel p n)).symm + _ = + Nat.card + (Multiplicative (ZMod (p.1 ^ n))) := + Nat.card_congr + (rationalCyclotomicPadicFiniteLevelGalEquivZMod + p n).toEquiv + _ = Nat.card (ZMod (p.1 ^ n)) := + Nat.card_congr Multiplicative.toAdd + _ = p.1 ^ n := Nat.card_zmod (p.1 ^ n) + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtin.lean new file mode 100644 index 0000000000..e6d84eb4d5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtin.lean @@ -0,0 +1,547 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfinitePlaceArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CofinitelySplitFiniteExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm +/-! +# The preliminary global Artin homomorphism + +For a finite abelian extension `L / K`, the global norm-residue symbol +on ideles is the product of its archimedean and finite-place local +Artin factors. +-/ + +@[expose] public section + +open scoped BigOperators IsMulCommutative NumberField + NumberField.LiesOver +open NumberField IsDedekindDomain +open IdeleGroup RelativeIdeleGroup + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +variable {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + +open scoped Classical in +/-- The preliminary global Artin homomorphism +`[·, L / K] : I_K → Gal(L / K)`, defined as the product of all local +Artin homomorphisms. -/ +noncomputable def globalArtinMonoidHom : + IdeleGroup K →* (L ≃ₐ[K] L) := + infinitePlaceGlobalArtinMonoidHom + (K := K) (L := L) * + finitePlaceGlobalArtinMonoidHom + (K := K) (L := L) + +open scoped Classical in +/-- The preliminary global Artin homomorphism is continuous. -/ +theorem globalArtinMonoidHom_continuous : + Continuous + (globalArtinMonoidHom + (K := K) (L := L)) := + (infinitePlaceGlobalArtinMonoidHom_continuous + (K := K) (L := L)).mul + (finitePlaceGlobalArtinMonoidHom_continuous + (K := K) (L := L)) + +open scoped Classical in +/-- The preliminary global Artin symbol is the product of its actual +archimedean and finite local factors. -/ +theorem globalArtinMonoidHom_apply + (a : IdeleGroup K) : + globalArtinMonoidHom (K := K) (L := L) a = + (∏ v : InfinitePlace K, + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v + (IdeleGroup.infiniteComponent v a)) * + ∏ᶠ v : HeightOneSpectrum (𝓞 K), + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v + (IdeleGroup.finiteComponent v a) := by + change + infinitePlaceGlobalArtinMonoidHom + (K := K) (L := L) a * + finitePlaceGlobalArtinMonoidHom + (K := K) (L := L) a = _ + unfold infinitePlaceGlobalArtinMonoidHom + rw [MonoidHom.finsetProd_apply] + rfl + +open scoped Classical in +/-- The preliminary global Artin homomorphism of `L / K` kills every +actual relative-idele norm from `L`. At each finite and infinite place +this is exactly the corresponding local reciprocity kernel theorem. -/ +@[simp] +theorem globalArtinMonoidHom_relativeIdeleNorm_eq_one + (z : RelativeIdeleGroup K L) : + globalArtinMonoidHom + (K := K) (L := L) + (RelativeIdeleGroup.norm K L z) = + 1 := by + rw [globalArtinMonoidHom_apply] + have hnorm : + RelativeIdeleGroup.norm K L z ∈ + (RelativeIdeleGroup.norm K L).range := + ⟨z, rfl⟩ + have hinfinite : + (∏ v : InfinitePlace K, + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v + (IdeleGroup.infiniteComponent v + (RelativeIdeleGroup.norm K L z))) = + 1 := by + apply Finset.prod_eq_one + intro v _ + apply MonoidHom.mem_ker.mp + rw [chosenInfinitePlaceArtinMonoidHom_ker + (K := K) (L := L) v] + exact + _root_.infiniteComponent_mem_infiniteTensorNormSubgroup_of_mem_relativeNorm_range + (K := K) (L := L) + (RelativeIdeleGroup.norm K L z) hnorm v + have hfinite : + (∏ᶠ v : HeightOneSpectrum (𝓞 K), + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v + (IdeleGroup.finiteComponent v + (RelativeIdeleGroup.norm K L z))) = + 1 := by + apply finprod_eq_one_of_forall_eq_one + intro v + apply MonoidHom.mem_ker.mp + rw [chosenFinitePlaceArtinMonoidHom_ker + (K := K) (L := L) v] + exact + _root_.relativeIdeleNorm_finiteComponent_mem_chosenLocalNormSubgroup + (K := K) (L := L) v z + rw [hinfinite, hfinite, mul_one] + +open scoped Classical in +/-- The preliminary global Artin homomorphism kills the ordinary idele +norm `N_{L/K} : I_L → I_K`. This is the relative-idele kernel theorem +above, transported by the canonical scalar-extension equivalence used in +the definition of `IdeleGroup.norm`. -/ +@[simp] +theorem globalArtinMonoidHom_ideleNorm_eq_one + (a : IdeleGroup L) : + globalArtinMonoidHom + (K := K) (L := L) + (IdeleGroup.norm K L a) = + 1 := by + change + globalArtinMonoidHom + (K := K) (L := L) + (RelativeIdeleGroup.norm K L + ((relativeIdeleBaseChangeMulEquiv + (K := K) (L := L)).symm a)) = + 1 + exact + globalArtinMonoidHom_relativeIdeleNorm_eq_one + (K := K) (L := L) + ((relativeIdeleBaseChangeMulEquiv + (K := K) (L := L)).symm a) + +open scoped Classical in +/-- The actual global Artin symbol after an ordinary idele norm, expanded +simultaneously at all archimedean and finite places. The factors are +indexed by the genuine places upstairs, and use the ordinary LCFT field +norm on the corresponding completions. -/ +theorem globalArtinMonoidHom_norm_eq_place_products + {M : Type} + [Field M] [NumberField M] [Algebra K M] + (a : IdeleGroup M) : + letI : ∀ W : InfinitePlace M, + W.1.LiesOver + (infinitePlaceBelow (K := K) W).1 := + fun _ => ⟨rfl⟩ + letI : ∀ W : HeightOneSpectrum (𝓞 M), + Algebra + ((finitePlaceBelow + (K := K) W).adicCompletion K) + (W.adicCompletion M) := + fun W => + (finitePlaceAdicCompletionMap + K M + (finitePlaceBelow (K := K) W) + ⟨W, rfl⟩).toAlgebra + globalArtinMonoidHom + (K := K) (L := L) + (IdeleGroup.norm K M a) = + (∏ W : InfinitePlace M, + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) + (infinitePlaceBelow (K := K) W) + (LocalFieldTheory.normUnits + (infinitePlaceBelow + (K := K) W).Completion + W.Completion + (IdeleGroup.infiniteComponent W a))) * + ∏ᶠ W : HeightOneSpectrum (𝓞 M), + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) + (finitePlaceBelow (K := K) W) + (LocalFieldTheory.normUnits + ((finitePlaceBelow + (K := K) W).adicCompletion K) + (W.adicCompletion M) + (IdeleGroup.finiteComponent W a)) := by + classical + let : ∀ W : InfinitePlace M, + W.1.LiesOver + (infinitePlaceBelow (K := K) W).1 := + fun _ => ⟨rfl⟩ + let : ∀ W : HeightOneSpectrum (𝓞 M), + Algebra + ((finitePlaceBelow + (K := K) W).adicCompletion K) + (W.adicCompletion M) := + fun W => + (finitePlaceAdicCompletionMap + K M + (finitePlaceBelow (K := K) W) + ⟨W, rfl⟩).toAlgebra + change + infinitePlaceGlobalArtinMonoidHom + (K := K) (L := L) + (IdeleGroup.norm K M a) * + finitePlaceGlobalArtinMonoidHom + (K := K) (L := L) + (IdeleGroup.norm K M a) = _ + rw [infinitePlaceGlobalArtinMonoidHom_norm_eq_prod, + finitePlaceGlobalArtinMonoidHom_norm_eq_finprod] + +omit [NumberField K] [NumberField L] in +open scoped Classical in +/-- In an actual field diamond `K ⊂ K'`, `L ⊂ L'`, the standard +restriction map distributes over every local factor of the upper global +Artin symbol. The vertical Galois map is exactly the composite supplied +by mathlib: first restrict scalars from `K'` to `K`, then restrict the +automorphism of `L'` to the normal subextension `L`. -/ +theorem restrict_globalArtinMonoidHom_apply + {K' L' : Type} + [Field K'] [NumberField K'] + [Field L'] [NumberField L'] + [Algebra K K'] [Algebra K' L'] [Algebra K L'] + [IsScalarTower K K' L'] + [Algebra L L'] [IsScalarTower K L L'] + [IsAbelianGalois K' L'] + (a : IdeleGroup K') : + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) + (globalArtinMonoidHom + (K := K') (L := L') a) = + (∏ v : InfinitePlace K', + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) + (chosenInfinitePlaceArtinMonoidHom + (K := K') (L := L') v + (IdeleGroup.infiniteComponent v a))) * + ∏ᶠ v : HeightOneSpectrum (𝓞 K'), + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) + (chosenFinitePlaceArtinMonoidHom + (K := K') (L := L') v + (IdeleGroup.finiteComponent v a)) := by + rw [globalArtinMonoidHom_apply, map_mul, map_prod] + rw [MonoidHom.map_finprod + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) + (finitePlaceArtinFactors_hasFiniteMulSupport + (K := K') (L := L') a)] + +open scoped Classical in +/-- Norm--restriction for the actual global Artin homomorphism. In a number-field +diamond `K ⊂ K'`, `L ⊂ L'`, the ordinary idele norm and mathlib's standard +restriction composite form a commuting square. -/ +theorem globalArtinMonoidHom_norm_restriction + {K' L' : Type} + [Field K'] [NumberField K'] + [Field L'] [NumberField L'] + [Algebra K K'] [Algebra K' L'] [Algebra K L'] + [IsScalarTower K K' L'] + [Algebra L L'] [IsScalarTower K L L'] + [IsAbelianGalois K' L'] : + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)).comp + (globalArtinMonoidHom + (K := K') (L := L')) = + (globalArtinMonoidHom + (K := K) (L := L)).comp + (IdeleGroup.norm K K') := by + apply MonoidHom.ext + intro a + change + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) + (infinitePlaceGlobalArtinMonoidHom + (K := K') (L := L') a * + finitePlaceGlobalArtinMonoidHom + (K := K') (L := L') a) = + infinitePlaceGlobalArtinMonoidHom + (K := K) (L := L) + (IdeleGroup.norm K K' a) * + finitePlaceGlobalArtinMonoidHom + (K := K) (L := L) + (IdeleGroup.norm K K' a) + rw [map_mul] + have hinfinite : + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) + (infinitePlaceGlobalArtinMonoidHom + (K := K') (L := L') a) = + infinitePlaceGlobalArtinMonoidHom + (K := K) (L := L) + (IdeleGroup.norm K K' a) := by + simpa only [MonoidHom.comp_apply] using + DFunLike.congr_fun + (infinitePlaceGlobalArtinMonoidHom_norm_restriction + (K := K) (L := L)) + a + have hfinite : + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) + (finitePlaceGlobalArtinMonoidHom + (K := K') (L := L') a) = + finitePlaceGlobalArtinMonoidHom + (K := K) (L := L) + (IdeleGroup.norm K K' a) := by + simpa only [MonoidHom.comp_apply] using + DFunLike.congr_fun + (finitePlaceGlobalArtinMonoidHom_norm_restriction + (K := K) (L := L)) + a + rw [hinfinite, hfinite] + +open scoped Classical in +/-- For an abelian tower with fixed base field, the global Artin map +commutes with the genuine restriction homomorphism. -/ +theorem globalArtinMonoidHom_restrict_tower + {E : Type} + [Field E] [NumberField E] + [Algebra K E] [Algebra E L] + [IsScalarTower K E L] + [IsAbelianGalois K E] : + (AlgEquiv.restrictNormalHom E).comp + (globalArtinMonoidHom + (K := K) (L := L)) = + globalArtinMonoidHom + (K := K) (L := E) := by + apply MonoidHom.ext + intro a + change + AlgEquiv.restrictNormalHom E + (infinitePlaceGlobalArtinMonoidHom + (K := K) (L := L) a * + finitePlaceGlobalArtinMonoidHom + (K := K) (L := L) a) = + infinitePlaceGlobalArtinMonoidHom + (K := K) (L := E) a * + finitePlaceGlobalArtinMonoidHom + (K := K) (L := E) a + rw [map_mul] + congr 1 + · simp only [infinitePlaceGlobalArtinMonoidHom, + MonoidHom.finsetProd_apply, MonoidHom.comp_apply] + rw [map_prod] + apply Finset.prod_congr rfl + intro v _ + exact DFunLike.congr_fun + (chosenInfinitePlaceArtinMonoidHom_restrict_tower + (K := K) (L := L) (E := E) v) + (IdeleGroup.infiniteComponent v a) + · change + AlgEquiv.restrictNormalHom E + (∏ᶠ v : HeightOneSpectrum (𝓞 K), + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v + (IdeleGroup.finiteComponent v a)) = + ∏ᶠ v : HeightOneSpectrum (𝓞 K), + chosenFinitePlaceArtinMonoidHom + (K := K) (L := E) v + (IdeleGroup.finiteComponent v a) + rw [MonoidHom.map_finprod + (AlgEquiv.restrictNormalHom E) + (finitePlaceArtinFactors_hasFiniteMulSupport + (K := K) (L := L) a)] + apply finprod_congr + intro v + exact DFunLike.congr_fun + (chosenFinitePlaceArtinMonoidHom_restrict_tower + (K := K) (L := L) (E := E) v) + (IdeleGroup.finiteComponent v a) + +open scoped Classical in +/-- The global Artin symbol of an archimedean one-place idele is its +local infinite-place Artin symbol. -/ +@[simp] +theorem globalArtinMonoidHom_infinitePlaceIdele + (v : InfinitePlace K) + (x : v.Completionˣ) : + globalArtinMonoidHom + (K := K) (L := L) + (infinitePlaceIdele v x) = + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v x := by + classical + change + infinitePlaceGlobalArtinMonoidHom + (K := K) (L := L) (infinitePlaceIdele v x) * + finitePlaceGlobalArtinMonoidHom + (K := K) (L := L) (infinitePlaceIdele v x) = + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v x + have hinfinite : + infinitePlaceGlobalArtinMonoidHom + (K := K) (L := L) (infinitePlaceIdele v x) = + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v x := by + unfold infinitePlaceGlobalArtinMonoidHom + rw [MonoidHom.finsetProd_apply, Finset.prod_eq_single v] + · rw [MonoidHom.comp_apply, + infinitePlaceIdele_infiniteComponent_same] + · intro w _ hwv + rw [MonoidHom.comp_apply, + infinitePlaceIdele_infiniteComponent_of_ne v w x hwv, + map_one] + · intro hv + exact (hv (Finset.mem_univ v)).elim + have hfinite : + finitePlaceGlobalArtinMonoidHom + (K := K) (L := L) (infinitePlaceIdele v x) = + 1 := by + change + (∏ᶠ w : HeightOneSpectrum (𝓞 K), + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) w + (IdeleGroup.finiteComponent w + (infinitePlaceIdele v x))) = 1 + apply finprod_eq_one_of_forall_eq_one + intro w + rw [infinitePlaceIdele_finiteComponent, map_one] + rw [hinfinite, hfinite, mul_one] + +open scoped Classical in +/-- The global Artin symbol of a finite one-place idele is its local +finite-place Artin symbol. -/ +@[simp] +theorem globalArtinMonoidHom_finitePlaceIdele + (v : HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) : + globalArtinMonoidHom + (K := K) (L := L) + (finitePlaceIdele v x) = + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x := by + change + infinitePlaceGlobalArtinMonoidHom + (K := K) (L := L) (finitePlaceIdele v x) * + finitePlaceGlobalArtinMonoidHom + (K := K) (L := L) (finitePlaceIdele v x) = + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x + rw [infinitePlaceGlobalArtinMonoidHom_finitePlaceIdele, + finitePlaceGlobalArtinMonoidHom_finitePlaceIdele, one_mul] + +open scoped Classical in +/-- Every chosen finite-place decomposition group is contained in the +image of the global Artin homomorphism. -/ +theorem finitePlaceDecompositionGroup_le_globalArtinMonoidHom_range + (v : HeightOneSpectrum (𝓞 K)) : + finitePlaceDecompositionGroup + (K := K) (L := L) v ≤ + (globalArtinMonoidHom + (K := K) (L := L)).range := by + rw [← chosenFinitePlaceArtinMonoidHom_range + (K := K) (L := L) v] + intro σ hσ + rcases hσ with ⟨x, rfl⟩ + exact + ⟨finitePlaceIdele v x, + globalArtinMonoidHom_finitePlaceIdele + (K := K) (L := L) v x⟩ + +open scoped Classical in +/-- The actual global Artin homomorphism of a finite abelian extension +of number fields is surjective. -/ +theorem globalArtinMonoidHom_surjective : + Function.Surjective + (globalArtinMonoidHom + (K := K) (L := L)) := by + let H : Subgroup (L ≃ₐ[K] L) := + (globalArtinMonoidHom + (K := K) (L := L)).range + let : H.Normal := + H.normal_of_isMulCommutative + let E : IntermediateField K L := + IntermediateField.fixedField H + let : IsGalois K E := by + dsimp only [E] + infer_instance + have hsplit : + ∀ v : HeightOneSpectrum (𝓞 K), + FinitePlaceSplitsCompletely + (K := K) (L := E) v := by + intro v + apply + _root_.finitePlaceSplitsCompletely_of_decompositionGroup_le_restrictNormalHom_ker + (K := K) (E := E) (N := L) v + rw [IntermediateField.restrictNormalHom_ker] + change + finitePlaceDecompositionGroup + (K := K) (L := L) v ≤ + (IntermediateField.fixedField H).fixingSubgroup + rw [IntermediateField.fixingSubgroup_fixedField] + simpa only [H] using + finitePlaceDecompositionGroup_le_globalArtinMonoidHom_range + (K := K) (L := L) v + have hfinite : + {v : HeightOneSpectrum (𝓞 K) | + ¬ FinitePlaceSplitsCompletelyInExtension + (K := K) (E := E) v}.Finite := by + apply Set.finite_empty.subset + intro v hv + exact + (hv + ((_root_.finitePlaceSplitsCompletely_iff_inExtension + (K := K) (E := E) v).mp + (hsplit v))).elim + have hdegree : + Module.finrank K E = 1 := + Cohomology.finrank_eq_one_of_finite_nonSplittingPlaces + K E hfinite + have hEbot : + E = (⊥ : IntermediateField K L) := + IntermediateField.finrank_eq_one_iff.mp hdegree + have hHtop : + H = (⊤ : Subgroup (L ≃ₐ[K] L)) := by + calc + H = + (IntermediateField.fixedField H).fixingSubgroup := + (IntermediateField.fixingSubgroup_fixedField H).symm + _ = E.fixingSubgroup := rfl + _ = (⊥ : IntermediateField K L).fixingSubgroup := + congrArg + (fun F : IntermediateField K L => + F.fixingSubgroup) + hEbot + _ = ⊤ := by + rw [IntermediateField.fixingSubgroup_bot] + apply MonoidHom.range_eq_top.mp + simpa only [H] using hHtop + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinCompatibility.lean new file mode 100644 index 0000000000..e7b40451d0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinCompatibility.lean @@ -0,0 +1,344 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinFiniteSupportApproximation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.SeparableClosurePadicLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicCyclicData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicAuxiliaryField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteLocalGlobalArtinCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidue +/-! +# Compatibility of the global Artin map with global reciprocity + +For a finite abelian extension of number fields, the preliminary global +Artin map is the product of the chosen local Artin maps. The finite-place +and infinite-place compatibility theorems identify every one-place factor +with the canonical global norm-residue map. + +Only finitely many finite local Artin factors of an idele are nontrivial. +The finite-support approximation theorem replaces an arbitrary idele by +the product of those one-place ideles modulo an actual relative-idele norm. +It follows that the preliminary global Artin map is exactly the pullback +of the canonical norm-residue map along `I_K → C_K`. + +In particular, the local product is trivial on every principal idele. +The global Artin map therefore descends to the idele class group, where +it is the canonical surjective reciprocity homomorphism and has the +genuine idele-class norm range as its kernel. +-/ + +@[expose] public section + +open scoped NumberField BigOperators IsMulCommutative +open NumberField IsDedekindDomain +open IdeleGroup RelativeIdeleGroup + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + +open scoped Classical in +/-- Pulling the canonical global norm-residue homomorphism back from +idele classes to ideles gives exactly the product of the chosen local +Artin homomorphisms. -/ +theorem + globalNormResidueMonoidHom_comp_ideleClassQuotient_eq_globalArtin : + (globalNormResidueMonoidHom K L).comp + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K)) = + globalArtinMonoidHom (K := K) (L := L) := by + apply MonoidHom.ext + intro a + let a₀ := + artinFiniteSupportApproximation + (K := K) (L := L) a + have hnormApprox : + globalNormResidueMonoidHom K L + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) = + globalNormResidueMonoidHom K L + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a₀) := by + rw [globalNormResidueMonoidHom_apply, + globalNormResidueMonoidHom_apply] + change + Additive.toMul + (globalNormResidueEquiv K L + (Additive.ofMul + (globalNormClassFromIdele K L a))) = + Additive.toMul + (globalNormResidueEquiv K L + (Additive.ofMul + (globalNormClassFromIdele K L a₀))) + exact + congrArg + (fun q => + Additive.toMul + (globalNormResidueEquiv K L + (Additive.ofMul q))) + (by + simpa only [a₀] using + (globalNormClassFromIdele_eq_artinFiniteSupportApproximation + (K := K) (L := L) a)) + calc + globalNormResidueMonoidHom K L + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) = + globalNormResidueMonoidHom K L + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a₀) := + hnormApprox + _ = + globalArtinMonoidHom + (K := K) (L := L) a₀ := by + dsimp only [a₀] + rw [artinFiniteSupportApproximation] + simp only [map_mul, map_prod] + apply congrArg₂ (· * ·) + · apply Finset.prod_congr rfl + intro v _ + change + globalNormResidueMonoidHom K L + (IdeleGroup.infinitePlaceIdeleClass v + (IdeleGroup.infiniteComponent v a)) = + globalArtinMonoidHom + (K := K) (L := L) + (infinitePlaceIdele v + (IdeleGroup.infiniteComponent v a)) + rw [globalArtinMonoidHom_infinitePlaceIdele] + exact + DFunLike.congr_fun + (globalNormResidueMonoidHom_comp_infinitePlaceIdeleClass + (K := K) (L := L) v) + (IdeleGroup.infiniteComponent v a) + · apply Finset.prod_congr rfl + intro v _ + change + globalNormResidueMonoidHom K L + (IdeleGroup.finitePlaceIdeleClass v.1 + (IdeleGroup.finiteComponent v.1 a)) = + globalArtinMonoidHom + (K := K) (L := L) + (finitePlaceIdele v.1 + (IdeleGroup.finiteComponent v.1 a)) + rw [globalArtinMonoidHom_finitePlaceIdele] + exact + DFunLike.congr_fun + (globalNormResidueMonoidHom_comp_finitePlaceIdeleClass + (K := K) (L := L) v.1) + (IdeleGroup.finiteComponent v.1 a) + _ = + globalArtinMonoidHom + (K := K) (L := L) a := + (globalArtinMonoidHom_eq_artinFiniteSupportApproximation + (K := K) (L := L) a).symm + +open scoped Classical in +/-- The chosen local Artin product is trivial on every principal +idele. This is the global Artin product formula with the arithmetic +Frobenius normalization used by the local maps. -/ +@[simp] +theorem globalArtinMonoidHom_principalIdele + (x : Kˣ) : + globalArtinMonoidHom + (K := K) (L := L) + (IdeleGroup.principalIdele K x) = + 1 := by + rw [← DFunLike.congr_fun + (globalNormResidueMonoidHom_comp_ideleClassQuotient_eq_globalArtin + (K := K) (L := L)) + (IdeleGroup.principalIdele K x)] + change + globalNormResidueMonoidHom K L + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (IdeleGroup.principalIdele K x)) = + 1 + have hclass : + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (IdeleGroup.principalIdele K x) = + 1 := + (QuotientGroup.eq_one_iff + (IdeleGroup.principalIdele K x)).2 + ⟨x, rfl⟩ + rw [hclass, map_one] + +open scoped Classical in +/-- Expanded form of the global product formula: the product of all +chosen infinite local symbols and the finite-support product of all +chosen finite local symbols of a principal idele is one. -/ +theorem chosenLocalArtin_product_principalIdele + (x : Kˣ) : + (∏ v : InfinitePlace K, + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v + (IdeleGroup.infiniteComponent v + (IdeleGroup.principalIdele K x))) * + ∏ᶠ v : HeightOneSpectrum (𝓞 K), + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele K x)) = + 1 := by + rw [← globalArtinMonoidHom_apply] + exact + globalArtinMonoidHom_principalIdele + (K := K) (L := L) x + +open scoped Classical in +/-- The genuine idele-class Artin homomorphism obtained by descending +the local-product global Artin map through the principal ideles. -/ +noncomputable def globalIdeleClassArtinMonoidHom : + IdeleClassGroup K →* (L ≃ₐ[K] L) := + QuotientGroup.lift + (IdeleGroup.principalSubgroup K) + (globalArtinMonoidHom (K := K) (L := L)) + (by + intro a ha + change + globalArtinMonoidHom (K := K) (L := L) a = 1 + rcases ha with ⟨x, rfl⟩ + exact + globalArtinMonoidHom_principalIdele + (K := K) (L := L) x) + +open scoped Classical in +/-- Evaluation of the descended Artin homomorphism on an idele +representative recovers the chosen-local-factor product. -/ +theorem globalIdeleClassArtinMonoidHom_mk + (a : IdeleGroup K) : + globalIdeleClassArtinMonoidHom + (K := K) (L := L) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) = + globalArtinMonoidHom (K := K) (L := L) a := by + rw [globalIdeleClassArtinMonoidHom] + exact QuotientGroup.lift_mk _ _ _ + +open scoped Classical in +/-- The descended global Artin homomorphism is continuous for the +ordinary quotient topology on the idele class group. -/ +theorem globalIdeleClassArtinMonoidHom_continuous : + Continuous + (globalIdeleClassArtinMonoidHom + (K := K) (L := L)) := by + refine + (QuotientGroup.isQuotientMap_mk + (G := IdeleGroup K) + (N := IdeleGroup.principalSubgroup K)).continuous_iff.2 ?_ + convert + (globalArtinMonoidHom_continuous + (K := K) (L := L)) using 1 + funext a + exact globalIdeleClassArtinMonoidHom_mk + (K := K) (L := L) a + +open scoped Classical in +/-- The descended global Artin map, retaining its ordinary topological +group structure. -/ +noncomputable def globalIdeleClassArtinContinuousMonoidHom : + IdeleClassGroup K →ₜ* (L ≃ₐ[K] L) where + toMonoidHom := + globalIdeleClassArtinMonoidHom + (K := K) (L := L) + continuous_toFun := + globalIdeleClassArtinMonoidHom_continuous + (K := K) (L := L) + +open scoped Classical in +/-- The descended local-product Artin homomorphism is the canonical +global norm-residue homomorphism. -/ +theorem + globalIdeleClassArtinMonoidHom_eq_globalNormResidueMonoidHom : + globalIdeleClassArtinMonoidHom + (K := K) (L := L) = + globalNormResidueMonoidHom K L := by + apply MonoidHom.ext + intro c + refine QuotientGroup.induction_on c ?_ + intro a + change + globalIdeleClassArtinMonoidHom + (K := K) (L := L) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) = + globalNormResidueMonoidHom K L + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) + rw [globalIdeleClassArtinMonoidHom_mk] + exact + (DFunLike.congr_fun + (globalNormResidueMonoidHom_comp_ideleClassQuotient_eq_globalArtin + (K := K) (L := L)) a).symm + +open scoped Classical in +/-- The independently descended continuous local-product Artin map is +the canonical topological global norm-residue map. -/ +theorem + globalIdeleClassArtinContinuousMonoidHom_eq_globalNormResidueContinuousMonoidHom : + globalIdeleClassArtinContinuousMonoidHom + (K := K) (L := L) = + globalNormResidueContinuousMonoidHom K L := by + apply ContinuousMonoidHom.ext + intro c + change + globalIdeleClassArtinMonoidHom + (K := K) (L := L) c = + globalNormResidueMonoidHom K L c + exact + DFunLike.congr_fun + (globalIdeleClassArtinMonoidHom_eq_globalNormResidueMonoidHom + (K := K) (L := L)) c + +open scoped Classical in +/-- The descended global Artin homomorphism is surjective. -/ +theorem globalIdeleClassArtinMonoidHom_surjective : + Function.Surjective + (globalIdeleClassArtinMonoidHom + (K := K) (L := L)) := by + rw [ + globalIdeleClassArtinMonoidHom_eq_globalNormResidueMonoidHom] + exact globalNormResidueMonoidHom_surjective K L + +open scoped Classical in +/-- The kernel of the descended global Artin homomorphism is exactly +the genuine idele-class norm range. -/ +@[simp] +theorem globalIdeleClassArtinMonoidHom_ker : + (globalIdeleClassArtinMonoidHom + (K := K) (L := L)).ker = + (_root_.ideleClassNorm K L).range := by + rw [ + globalIdeleClassArtinMonoidHom_eq_globalNormResidueMonoidHom, + globalNormResidueMonoidHom_ker] + +open scoped Classical in +/-- An idele class has trivial global Artin symbol exactly when it is +the norm of an idele class from the extension. -/ +@[simp] +theorem globalIdeleClassArtinMonoidHom_eq_one_iff + (c : IdeleClassGroup K) : + globalIdeleClassArtinMonoidHom + (K := K) (L := L) c = 1 ↔ + c ∈ (_root_.ideleClassNorm K L).range := by + rw [ + globalIdeleClassArtinMonoidHom_eq_globalNormResidueMonoidHom, + globalNormResidueMonoidHom_eq_one_iff] + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinFiniteSupportApproximation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinFiniteSupportApproximation.lean new file mode 100644 index 0000000000..e85962e811 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinFiniteSupportApproximation.lean @@ -0,0 +1,375 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.HasseNormPrinciple +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteLocalFamily +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin +/-! +# Finite-support reduction for the global Artin map + +For a finite abelian extension `L / K`, only finitely many finite local +Artin factors of an idele are nontrivial. Keeping precisely those finite +components, together with every infinite component, gives an idele with +finite one-place support. The quotient of the original idele by this +approximation is an actual relative-idele norm: outside the retained +finite set this follows from the local Artin kernel theorem, and at the +retained and infinite places it follows because the quotient component is +one. + +Consequently both the preliminary global Artin map and the canonical +idele-class norm quotient may be evaluated on this finite-support +approximation. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct BigOperators +open NumberField IsDedekindDomain +open IdeleGroup RelativeIdeleGroup + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open scoped Classical in +/-- Supply the canonical commutativity used by the finite-support norm quotient. -/ +private theorem artinFiniteSupportIdeleClassIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] artinFiniteSupportIdeleClassIsMulCommutative + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + +open scoped Classical in +/-- The finite places at which the local Artin factor of `a` is +nontrivial. -/ +noncomputable def globalArtinFiniteSupport + (a : IdeleGroup K) : + Finset (HeightOneSpectrum (𝓞 K)) := + (finitePlaceArtinFactors_hasFiniteMulSupport + (K := K) (L := L) a).toFinset + +open scoped Classical in +/-- Membership in the finite Artin support is equivalent to nontriviality of +the corresponding chosen local Artin factor. -/ +@[simp] +theorem mem_globalArtinFiniteSupport_iff + (a : IdeleGroup K) + (v : HeightOneSpectrum (𝓞 K)) : + v ∈ globalArtinFiniteSupport (K := K) (L := L) a ↔ + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v + (IdeleGroup.finiteComponent v a) ≠ 1 := by + unfold globalArtinFiniteSupport + exact + (finitePlaceArtinFactors_hasFiniteMulSupport + (K := K) (L := L) a).mem_toFinset + +open scoped Classical in +/-- The finite-support Artin approximation of an idele. It is the +product of the one-place ideles carrying all infinite components and the +one-place ideles carrying exactly the finite components with nontrivial +local Artin factor. -/ +noncomputable def artinFiniteSupportApproximation + (a : IdeleGroup K) : + IdeleGroup K := + (∏ v : InfinitePlace K, + infinitePlaceIdele v + (IdeleGroup.infiniteComponent v a)) * + ∏ v : ↥(globalArtinFiniteSupport + (K := K) (L := L) a), + finitePlaceIdele v.1 + (IdeleGroup.finiteComponent v.1 a) + +open scoped Classical in +/-- The finite-support Artin approximation retains every infinite +component. -/ +theorem artinFiniteSupportApproximation_infiniteComponent + (a : IdeleGroup K) + (w : InfinitePlace K) : + IdeleGroup.infiniteComponent w + (artinFiniteSupportApproximation + (K := K) (L := L) a) = + IdeleGroup.infiniteComponent w a := by + classical + rw [artinFiniteSupportApproximation, + prod_finitePlaceIdele_eq_ideleOfFiniteLocalFamily, + map_mul, map_prod] + change + (∏ v : InfinitePlace K, + IdeleGroup.infiniteComponent w + (infinitePlaceIdele v + (IdeleGroup.infiniteComponent v a))) * 1 = + IdeleGroup.infiniteComponent w a + rw [mul_one, Finset.prod_eq_single w] + · exact + infinitePlaceIdele_infiniteComponent_same w + (IdeleGroup.infiniteComponent w a) + · intro v _ hvw + apply + infinitePlaceIdele_infiniteComponent_of_ne v w + (IdeleGroup.infiniteComponent v a) + intro hwv + exact hvw hwv.symm + · intro hw + exact (hw (Finset.mem_univ w)).elim + +open scoped Classical in +/-- At a finite place, the approximation is the original component +exactly on the finite Artin support and is one elsewhere. -/ +theorem artinFiniteSupportApproximation_finiteComponent + (a : IdeleGroup K) + (v : HeightOneSpectrum (𝓞 K)) : + IdeleGroup.finiteComponent v + (artinFiniteSupportApproximation + (K := K) (L := L) a) = + if v ∈ globalArtinFiniteSupport + (K := K) (L := L) a then + IdeleGroup.finiteComponent v a + else 1 := by + classical + rw [artinFiniteSupportApproximation, + prod_finitePlaceIdele_eq_ideleOfFiniteLocalFamily] + have hinfinite : + IdeleGroup.finiteComponent v + (∏ w : InfinitePlace K, + infinitePlaceIdele w + (IdeleGroup.infiniteComponent w a)) = + 1 := by + rw [map_prod] + apply Finset.prod_eq_one + intro w _ + exact + infinitePlaceIdele_finiteComponent w v + (IdeleGroup.infiniteComponent w a) + rw [map_mul, hinfinite, one_mul] + change + IdeleGroup.finiteIdeleOfFinset + (globalArtinFiniteSupport + (K := K) (L := L) a) + (fun w => + IdeleGroup.finiteComponent w.1 a) v = + if v ∈ globalArtinFiniteSupport + (K := K) (L := L) a then + IdeleGroup.finiteComponent v a + else 1 + by_cases hv : + v ∈ globalArtinFiniteSupport + (K := K) (L := L) a + · rw [ite_eq_left hv] + exact + IdeleGroup.finiteIdeleOfFinset_apply_mem + (globalArtinFiniteSupport + (K := K) (L := L) a) + (fun w => + IdeleGroup.finiteComponent w.1 a) + ⟨v, hv⟩ + · rw [ite_eq_right hv] + exact + IdeleGroup.finiteIdeleOfFinset_apply_notMem + (globalArtinFiniteSupport + (K := K) (L := L) a) + (fun w => + IdeleGroup.finiteComponent w.1 a) + v hv + +open scoped Classical in +/-- At a place in the Artin support, the finite-support approximation keeps +the original finite component. -/ +theorem artinFiniteSupportApproximation_finiteComponent_of_mem + (a : IdeleGroup K) + (v : HeightOneSpectrum (𝓞 K)) + (hv : + v ∈ globalArtinFiniteSupport + (K := K) (L := L) a) : + IdeleGroup.finiteComponent v + (artinFiniteSupportApproximation + (K := K) (L := L) a) = + IdeleGroup.finiteComponent v a := by + rw [artinFiniteSupportApproximation_finiteComponent, + ite_eq_left hv] + +open scoped Classical in +/-- Away from the Artin support, the finite-support approximation has trivial +finite component. -/ +theorem artinFiniteSupportApproximation_finiteComponent_of_notMem + (a : IdeleGroup K) + (v : HeightOneSpectrum (𝓞 K)) + (hv : + v ∉ globalArtinFiniteSupport + (K := K) (L := L) a) : + IdeleGroup.finiteComponent v + (artinFiniteSupportApproximation + (K := K) (L := L) a) = + 1 := by + rw [artinFiniteSupportApproximation_finiteComponent, + ite_eq_right hv] + +open scoped Classical in +open _root_.GlobalClassFieldTheory.ClassFieldAxiom renaming + relativeIdeleNorm_range_eq_allPlaceLocalNormCondition → + relativeIdeleNorm_range_eq_allPlaceLocalNormCondition in +/-- The quotient of an idele by its finite-support Artin approximation +is an actual relative-idele norm. -/ +theorem + artinFiniteSupportApproximation_remainder_mem_relativeIdeleNorm_range + (a : IdeleGroup K) : + a * (artinFiniteSupportApproximation + (K := K) (L := L) a)⁻¹ ∈ + (RelativeIdeleGroup.norm K L).range := by + rw [ + relativeIdeleNorm_range_eq_allPlaceLocalNormCondition] + constructor + · rw [_root_.GlobalClassFieldTheory.ClassFieldAxiom.allFinitePlaceLocalNormCondition] + apply Subgroup.mem_iInf.mpr + intro v + change + IdeleGroup.finiteComponent v + (a * (artinFiniteSupportApproximation + (K := K) (L := L) a)⁻¹) ∈ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v + by_cases hv : + v ∈ globalArtinFiniteSupport + (K := K) (L := L) a + · rw [map_mul, map_inv, + artinFiniteSupportApproximation_finiteComponent_of_mem + (K := K) (L := L) a v hv, + mul_inv_cancel] + exact Subgroup.one_mem _ + · have hArtin : + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v + (IdeleGroup.finiteComponent v a) = + 1 := by + by_contra hne + exact hv + ((mem_globalArtinFiniteSupport_iff + (K := K) (L := L) a v).2 hne) + have hLocalNorm : + IdeleGroup.finiteComponent v a ∈ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := by + rw [← chosenFinitePlaceArtinMonoidHom_ker + (K := K) (L := L) v] + exact MonoidHom.mem_ker.mpr hArtin + simpa only [map_mul, map_inv, + artinFiniteSupportApproximation_finiteComponent_of_notMem + (K := K) (L := L) a v hv, + inv_one, mul_one] using hLocalNorm + · rw [_root_.GlobalClassFieldTheory.ClassFieldAxiom.allInfinitePlaceLocalNormCondition] + apply Subgroup.mem_iInf.mpr + intro v + change + IdeleGroup.infiniteComponent v + (a * (artinFiniteSupportApproximation + (K := K) (L := L) a)⁻¹) ∈ + (Units.map + (Algebra.norm v.Completion : + (v.Completion ⊗[K] L) →* v.Completion)).range + rw [map_mul, map_inv, + artinFiniteSupportApproximation_infiniteComponent, + mul_inv_cancel] + exact Subgroup.one_mem _ + +omit [IsAbelianGalois K L] in +open scoped Classical in +/-- The canonical idele-class norm quotient kills every actual +relative-idele norm. -/ +@[simp] +theorem globalNormClassFromIdele_relativeIdeleNorm_eq_one + (z : RelativeIdeleGroup K L) : + globalNormClassFromIdele K L + (RelativeIdeleGroup.norm K L z) = + 1 := by + change + QuotientGroup.mk' + (_root_.ideleClassNorm K L).range + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (RelativeIdeleGroup.norm K L z)) = + 1 + apply (QuotientGroup.eq_one_iff _).2 + refine + ⟨QuotientGroup.mk' + (IdeleGroup.principalSubgroup L) + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) z), ?_⟩ + rw [_root_.ideleClassNorm_mk, + IdeleGroup.norm_relativeIdeleBaseChangeMulEquiv] + +open scoped Classical in +/-- The global Artin value of an idele is already determined by its +finite-support Artin approximation. -/ +theorem globalArtinMonoidHom_eq_artinFiniteSupportApproximation + (a : IdeleGroup K) : + globalArtinMonoidHom (K := K) (L := L) a = + globalArtinMonoidHom (K := K) (L := L) + (artinFiniteSupportApproximation + (K := K) (L := L) a) := by + obtain ⟨z, hz⟩ := + artinFiniteSupportApproximation_remainder_mem_relativeIdeleNorm_range + (K := K) (L := L) a + have hquotient : + globalArtinMonoidHom (K := K) (L := L) + (a * (artinFiniteSupportApproximation + (K := K) (L := L) a)⁻¹) = + 1 := by + rw [← hz] + exact + globalArtinMonoidHom_relativeIdeleNorm_eq_one + (K := K) (L := L) z + have hmul : + globalArtinMonoidHom (K := K) (L := L) a * + (globalArtinMonoidHom (K := K) (L := L) + (artinFiniteSupportApproximation + (K := K) (L := L) a))⁻¹ = + 1 := by + simpa only [map_mul, map_inv] using hquotient + exact mul_inv_eq_one.mp hmul + +open scoped Classical in +/-- The norm class of an idele is already determined by its +finite-support Artin approximation. -/ +theorem globalNormClassFromIdele_eq_artinFiniteSupportApproximation + (a : IdeleGroup K) : + globalNormClassFromIdele K L a = + globalNormClassFromIdele K L + (artinFiniteSupportApproximation + (K := K) (L := L) a) := by + obtain ⟨z, hz⟩ := + artinFiniteSupportApproximation_remainder_mem_relativeIdeleNorm_range + (K := K) (L := L) a + have hquotient : + globalNormClassFromIdele K L + (a * (artinFiniteSupportApproximation + (K := K) (L := L) a)⁻¹) = + 1 := by + rw [← hz] + exact + globalNormClassFromIdele_relativeIdeleNorm_eq_one + (K := K) (L := L) z + have hmul : + globalNormClassFromIdele K L a * + (globalNormClassFromIdele K L + (artinFiniteSupportApproximation + (K := K) (L := L) a))⁻¹ = + 1 := by + simpa only [map_mul, map_inv] using hquotient + exact mul_inv_eq_one.mp hmul + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol.lean new file mode 100644 index 0000000000..a2fc4da504 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol.lean @@ -0,0 +1,26 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceCharacterComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceFiniteSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceLocalGlobal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceCharacter +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegative +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeRoot +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeUnit +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlacePositive +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealSquare + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/All.lean new file mode 100644 index 0000000000..e12ca25df0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/All.lean @@ -0,0 +1,29 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceCharacterComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceFiniteSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceLocalGlobal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceCharacter +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegative +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeRoot +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeUnit +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlacePositive +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealSquare +/-! +# Global-place Hilbert symbols + +Public aggregate for the finite-place Kummer character comparison, finite +support of the Hilbert factors, and the infinite-place comparison. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/Core.lean new file mode 100644 index 0000000000..7a81b2cea9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/Core.lean @@ -0,0 +1,305 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Conjugation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol +public import Mathlib.FieldTheory.KummerExtension +/-! +# Global-place Hilbert symbols + +This module starts the local-to-global Hilbert-symbol layer. At a finite +place, global units are mapped into the canonical absolute-value completion, +the genuine local Hilbert symbol is evaluated there, and its value is +transported back to the roots of unity in the number field. + +The later local--global comparison can therefore identify this intrinsically +local definition with the root character of the finite-place global Artin +automorphism without building that comparison into the definition. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory +open AlgebraicNumberTheory.Valuations + +variable (K : Type) [Field K] [NumberField K] + +omit [NumberField K] in +open scoped Classical in +/-- A Kummer root quotient does not depend on the chosen `n`-th root once +the base field contains a primitive `n`-th root of unity. This is the +root-choice transport leaf used by the finite-place local--global +comparison. -/ +theorem rootQuotient_eq_of_same_pow_of_primitiveRoots + {L : Type} [Field L] [Algebra K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a : Kˣ) (u u' : Lˣ) + (hu : u ^ (n : ℕ) = + Units.map (algebraMap K L).toMonoidHom a) + (hu' : u' ^ (n : ℕ) = + Units.map (algebraMap K L).toMonoidHom a) + (sigma : Gal(L/K)) : + rootQuotient (K := K) (L := L) u sigma = + rootQuotient (K := K) (L := L) u' sigma := by + let D := chosenFiniteKummerRadicalDatum (K := K) (L := L) n + let delta : D.carrier := ⟨a, u, hu⟩ + let hfixed := + nthRootsOfUnity_fixed (K := K) (L := L) n + (nthRootsOfUnityInBase_of_primitiveRoots + (K := K) (L := L) n hmu) + calc + rootQuotient (K := K) (L := L) u sigma = + D.rootCharacter delta hfixed sigma := + D.rootCharacter_eq_of_same_pow hfixed delta hu sigma + _ = rootQuotient (K := K) (L := L) u' sigma := + (D.rootCharacter_eq_of_same_pow hfixed delta hu' sigma).symm + +omit [NumberField K] in +open scoped Classical in +/-- Conjugating a Galois automorphism through an algebra equivalence carries +the corresponding root quotient through the same equivalence. -/ +theorem rootQuotient_map_algEquiv + {L E : Type} [Field L] [Field E] [Algebra K L] [Algebra K E] + (e : L ≃ₐ[K] E) (u : Lˣ) (sigma : Gal(L/K)) : + rootQuotient (K := K) (L := E) + (Units.map e.toMonoidHom u) (AlgEquiv.autCongr e sigma) = + Units.map e.toMonoidHom + (rootQuotient (K := K) (L := L) u sigma) := by + apply Units.ext + simp [rootQuotient, AlgEquiv.autCongr_apply] + +open scoped Classical in +/-- A field generated by one `n`-th root is the splitting field of its +Kummer polynomial as soon as the base field already contains a primitive +`n`-th root of unity. -/ +theorem isSplittingField_X_pow_sub_C_of_root_adjoin_eq_top_of_primitiveRoots + (F E : Type) [Field F] [Field E] [Algebra F E] + [FiniteDimensional F E] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) F).Nonempty) + (a : F) (alpha : E) + (halpha : alpha ^ (n : ℕ) = algebraMap F E a) + (hgenerate : IntermediateField.adjoin F {alpha} = ⊤) : + Polynomial.IsSplittingField F E + (Polynomial.X ^ (n : ℕ) - Polynomial.C a) := by + constructor + · rw [Polynomial.map_sub, Polynomial.map_pow, Polynomial.map_C, + Polynomial.map_X] + obtain ⟨zeta, hzeta⟩ := hmu + exact X_pow_sub_C_splits_of_isPrimitiveRoot + (((mem_primitiveRoots n.pos).1 hzeta).map_of_injective + (algebraMap F E).injective) halpha + · rw [eq_top_iff, ← IntermediateField.top_toSubalgebra, ← hgenerate, + IntermediateField.adjoin_simple_toSubalgebra_of_isAlgebraic + (IsAlgebraic.of_finite F alpha)] + apply Algebra.adjoin_mono + rw [Set.singleton_subset_iff, + Polynomial.mem_rootSet_of_ne + (Polynomial.X_pow_sub_C_ne_zero n.pos a), + Polynomial.aeval_def, Polynomial.eval₂_sub, Polynomial.eval₂_X_pow, + Polynomial.eval₂_C, halpha, sub_self] + +open scoped Classical in +theorem finitePlaceHilbert_natCast_ne_zero + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (v : HeightOneSpectrum (𝓞 K)) : + ((n : ℕ) : + (NumberField.HeightOneSpectrum.adicAbv K v).Completion) ≠ 0 := by + intro hn + apply hnK + apply + (algebraMap K + (NumberField.HeightOneSpectrum.adicAbv K v).Completion).injective + simpa only [map_natCast, map_zero] using hn + +open scoped Classical in +theorem finitePlaceHilbert_primitiveRoots_nonempty + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) : + (primitiveRoots (n : ℕ) + (NumberField.HeightOneSpectrum.adicAbv K v).Completion).Nonempty := by + obtain ⟨zeta, hzeta⟩ := hmu + refine ⟨algebraMap K + (NumberField.HeightOneSpectrum.adicAbv K v).Completion zeta, ?_⟩ + apply (mem_primitiveRoots n.pos).2 + exact ((mem_primitiveRoots n.pos).1 hzeta).map_of_injective + (algebraMap K + (NumberField.HeightOneSpectrum.adicAbv K v).Completion).injective + +open scoped Classical in +/-- The image of a global unit in the canonical absolute-value completion +at a finite place. -/ +noncomputable def finitePlaceHilbertCompletionUnit + (v : HeightOneSpectrum (𝓞 K)) (a : Kˣ) : + (NumberField.HeightOneSpectrum.adicAbv K v).Completionˣ := + Units.map + (algebraMap K + (NumberField.HeightOneSpectrum.adicAbv K v).Completion).toMonoidHom a + +open scoped Classical in +/-- The local Hilbert-symbol value in the canonical absolute-value completion +at a finite place, before transport back to the number field. -/ +noncomputable def finitePlaceLocalHilbertSymbol + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) : + nthRootsSubgroup + (NumberField.HeightOneSpectrum.adicAbv K v).Completion (n : ℕ) := by + let C := (NumberField.HeightOneSpectrum.adicAbv K v).Completion + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + exact + LocalClassFieldTheory.Kummer.localHilbertSymbol C n + (finitePlaceHilbert_natCast_ne_zero K n hnK v) + (finitePlaceHilbert_primitiveRoots_nonempty K n hmu v) + (finitePlaceHilbertCompletionUnit K v a) + (finitePlaceHilbertCompletionUnit K v b) + +open scoped Classical in +/-- The Hilbert symbol of two global units at a finite place, evaluated in +the actual local completion and transported back to `μₙ(K)`. -/ +noncomputable def finitePlaceHilbertSymbol + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) : + nthRootsSubgroup K (n : ℕ) := + (nthRootsSubgroupEquivOfPrimitiveRoots K + (NumberField.HeightOneSpectrum.adicAbv K v).Completion n hmu).symm + (finitePlaceLocalHilbertSymbol K n hnK hmu v a b) + +open scoped Classical in +/-- Extending the finite-place symbol to the completion recovers the +underlying local Hilbert symbol on the images of the two global units. -/ +theorem finitePlaceHilbertSymbol_map_eq_localHilbertSymbol + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) : + nthRootsSubgroupMap K + (NumberField.HeightOneSpectrum.adicAbv K v).Completion (n : ℕ) + (finitePlaceHilbertSymbol K n hnK hmu v a b) = + finitePlaceLocalHilbertSymbol K n hnK hmu v a b := by + change + (nthRootsSubgroupEquivOfPrimitiveRoots K + (NumberField.HeightOneSpectrum.adicAbv K v).Completion n hmu) + ((nthRootsSubgroupEquivOfPrimitiveRoots K + (NumberField.HeightOneSpectrum.adicAbv K v).Completion n hmu).symm + (finitePlaceLocalHilbertSymbol K n hnK hmu v a b)) = + finitePlaceLocalHilbertSymbol K n hnK hmu v a b + exact + (nthRootsSubgroupEquivOfPrimitiveRoots K + (NumberField.HeightOneSpectrum.adicAbv K v).Completion n hmu).apply_symm_apply _ + +open scoped Classical in +/-- The global Kummer root character evaluated at the finite-place Artin +automorphism attached to a specified extension of the place. Its value is +transported from the chosen global simple Kummer extension back to `μₙ(K)`. +-/ +noncomputable def finitePlaceKummerRootCharacterOfExtension + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + nthRootsSubgroup K (n : ℕ) := by + let L := chosenSimpleKummerExtension K n hnK b + letI : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + letI : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let a_v : (v.adicCompletion K)ˣ := + Units.map (algebraMap K (v.adicCompletion K)).toMonoidHom a + exact + (nthRootsSubgroupEquivOfPrimitiveRoots K L n hmu).symm + (chosenSimpleKummerRootCharacter K n hnK hmu b + (finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v w a_v)) + +open scoped Classical in +/-- Changing the extension of the base absolute value does not change the +transported Kummer root-character value. -/ +theorem finitePlaceKummerRootCharacterOfExtension_eq_of_extensions + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) + (w w' : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + finitePlaceKummerRootCharacterOfExtension + K n hnK hmu v a b w = + finitePlaceKummerRootCharacterOfExtension + K n hnK hmu v a b w' := by + let L := chosenSimpleKummerExtension K n hnK b + let : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let a_v : (v.adicCompletion K)ˣ := + Units.map (algebraMap K (v.adicCompletion K)).toMonoidHom a + have hArtin := DFunLike.congr_fun + (finitePlaceArtinMonoidHomOfExtension_eq + (K := K) (L := L) v w w') a_v + have hRoot := congrArg + (chosenSimpleKummerRootCharacter K n hnK hmu b) hArtin + unfold finitePlaceKummerRootCharacterOfExtension + exact congrArg + (nthRootsSubgroupEquivOfPrimitiveRoots K L n hmu).symm hRoot + +open scoped Classical in +/-- The finite-place Kummer root-character value obtained from the canonical +chosen extension of the base place. -/ +noncomputable def finitePlaceKummerRootCharacter + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) : + nthRootsSubgroup K (n : ℕ) := by + let L := chosenSimpleKummerExtension K n hnK b + letI : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + letI : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + exact + finitePlaceKummerRootCharacterOfExtension K n hnK hmu v a b + (chosenFinitePlaceExtension (L := L) v) + +open scoped Classical in +/-- The finite-place Kummer root-character value is independent of the +extension of the base absolute value used to construct the local Artin map. +-/ +theorem finitePlaceKummerRootCharacterOfExtension_eq + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + finitePlaceKummerRootCharacterOfExtension + K n hnK hmu v a b w = + finitePlaceKummerRootCharacter K n hnK hmu v a b := by + let L := chosenSimpleKummerExtension K n hnK b + let : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let w' := chosenFinitePlaceExtension (L := L) v + unfold finitePlaceKummerRootCharacter + exact finitePlaceKummerRootCharacterOfExtension_eq_of_extensions + K n hnK hmu v a b w w' + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceCharacterComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceCharacterComparison.lean new file mode 100644 index 0000000000..00fa159591 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceCharacterComparison.lean @@ -0,0 +1,1052 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceLocalGlobal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization +/-! +# Finite-place Kummer root-character comparison + +The comparison is compiled through an S-valued map from the chosen global +Kummer extension to the Kummer extension chosen over the completion. The +localized completion and its instance tower occur only in the provider body +which proves compatibility with the two Artin actions. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory + +variable (K : Type) [Field K] [NumberField K] + +open scoped Classical in +private theorem nthRootsSubgroupMap_comp_eq_unitsMap + {F C L S : Type} [Field F] [Field C] [Field L] [Field S] + [Algebra F C] [Algebra F L] [Algebra C S] + (m : ℕ) (x : nthRootsSubgroup F m) (f : L →+* S) + (hmap : ∀ y : F, + algebraMap C S (algebraMap F C y) = f (algebraMap F L y)) : + (nthRootsSubgroupMap C S m + (nthRootsSubgroupMap F C m x)).1 = + Units.map f.toMonoidHom + (Units.map (algebraMap F L).toMonoidHom x.1) := by + apply Units.ext + exact hmap (x.1 : F) + +open scoped Classical in +private theorem rootQuotient_map_ringHom_of_action + {F G L S : Type} [Field F] [Field G] [Field L] [Field S] + [Algebra F L] [Algebra G S] + (f : L →+* S) (u : Lˣ) (sigmaL : Gal(L/F)) (sigmaS : Gal(S/G)) + (haction : sigmaS (f (u : L)) = f (sigmaL (u : L))) : + Units.map f.toMonoidHom + (rootQuotient (K := F) (L := L) u sigmaL) = + rootQuotient (K := G) (L := S) + (Units.map f.toMonoidHom u) sigmaS := by + apply Units.ext + simp only [rootQuotient, Units.val_div_eq_div_val, Units.coe_map] + change f (sigmaL (u : L) / (u : L)) = + sigmaS (f (u : L)) / f (u : L) + rw [map_div₀, haction] + +open scoped Classical in +/-- The normalized finite-place Artin action commutes with algebraic +localization. This generic boundary is compiled before the Kummer-specific +comparison, so the latter never re-elaborates the localization tower. -/ +private theorem finitePlaceArtin_apply_localized + {L : Type} [Field L] [Algebra K L] + [hKLfinite : FiniteDimensional K L] [IsAbelianGalois K L] + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (x : (v.adicCompletion K)ˣ) (z : L) : + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + letI : Algebra vK.Completion E := + finitePlaceLocalArtinLocalizedAlgebra v w + (@abelianLocalArtinMonoidHom vK.Completion E + (inferInstance : Field vK.Completion) (inferInstance : Field E) + (finitePlaceLocalArtinLocalizedAlgebra v w) + (finitePlaceLocalArtinCompletionValuativeRel v) + (inferInstance : TopologicalSpace vK.Completion) + (finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v) + (finitePlaceLocalArtinFiniteDimensional v w) + (finitePlaceLocalArtinIsAbelianGalois v w hKLfinite) + (finitePlaceLocalArtinInput v x)) + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 z) = + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + ((finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v w x) z) := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let : Algebra vK.Completion E := + finitePlaceLocalArtinLocalizedAlgebra v w + let sigmaE := @abelianLocalArtinMonoidHom vK.Completion E + (inferInstance : Field vK.Completion) (inferInstance : Field E) + (finitePlaceLocalArtinLocalizedAlgebra v w) + (finitePlaceLocalArtinCompletionValuativeRel v) + (inferInstance : TopologicalSpace vK.Completion) + (finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v) + (finitePlaceLocalArtinFiniteDimensional v w) + (finitePlaceLocalArtinIsAbelianGalois v w hKLfinite) + (finitePlaceLocalArtinInput v x) + let sigmaG := finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v w x + have hfactor := + finitePlaceArtinMonoidHomOfExtension_apply_normalized + (K := K) (L := L) v w x + let hvK : vK.IsNontrivial := RayClass.adicAbv_isNontrivial v + let eD : absoluteValueDecompositionGroup K w.1 ≃* Gal(E/vK.Completion) := + decompositionGroupEquivAlgebraicLocalizationAut vK hvK w + let delta : absoluteValueDecompositionGroup K w.1 := eD.symm sigmaE + have hdelta : eD delta = sigmaE := eD.apply_symm_apply sigmaE + change sigmaE (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 z) = + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 (sigmaG z) + dsimp only [sigmaG] + rw [hfactor] + rw [← hdelta] + exact localizationRamificationGroups_decompositionGroupEquiv_toLocalization + vK hvK w delta z + +open scoped Classical in +private noncomputable def finitePlaceKummerGlobalArtinAutomorphism + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + Gal((chosenSimpleKummerExtension K n hnK b)/K) := by + let L := chosenSimpleKummerExtension K n hnK b + let x : (v.adicCompletion K)ˣ := + Units.map (algebraMap K (v.adicCompletion K)).toMonoidHom a + letI : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + letI : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + exact finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v w x + +open scoped Classical in +private noncomputable def finitePlaceKummerLocalArtinAutomorphism + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) : + let C := finitePlaceKummerBaseCompletion K v + let S := finitePlaceKummerLocalExtension K n hnK v b + Gal(S/C) := by + let C := finitePlaceKummerBaseCompletion K v + let hnC := finitePlaceHilbert_natCast_ne_zero K n hnK v + let hmuC := finitePlaceHilbert_primitiveRoots_nonempty K n hmu v + let aC := finitePlaceHilbertCompletionUnit K v a + let bC := finitePlaceHilbertCompletionUnit K v b + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + exact + LocalClassFieldTheory.Kummer.chosenSimpleKummerNormResidueAutomorphism + C n hnC hmuC bC aC + +open scoped Classical in +/-- The canonical map from the chosen global Kummer extension to the +intrinsic Kummer extension over the finite-place completion. -/ +private noncomputable def finitePlaceKummerGlobalToLocalRingHom + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + chosenSimpleKummerExtension K n hnK b →+* + finitePlaceKummerLocalExtension K n hnK v b := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let C := finitePlaceKummerBaseCompletion K v + let L := chosenSimpleKummerExtension K n hnK b + let S := finitePlaceKummerLocalExtension K n hnK v b + let E := finitePlaceKummerLocalizedCompletion K n hnK v b w + letI : Algebra C E := + finitePlaceKummerLocalizedAlgebra K n hnK v b w + let e := finitePlaceKummerLocalGlobalAlgEquiv K n hnK hmu v b w + let toE : L →+* E := + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + exact e.symm.toRingHom.comp toE + +open scoped Classical in +/-- The global-to-local Kummer map extends the canonical scalar map from +the number field through its finite-place completion. -/ +private theorem finitePlaceKummerGlobalToLocalRingHom_commutes + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) + (y : K) : + let C := finitePlaceKummerBaseCompletion K v + let L := chosenSimpleKummerExtension K n hnK b + let S := finitePlaceKummerLocalExtension K n hnK v b + algebraMap C S (algebraMap K C y) = + finitePlaceKummerGlobalToLocalRingHom K n hnK hmu v b w + (algebraMap K L y) := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let C := finitePlaceKummerBaseCompletion K v + let L := chosenSimpleKummerExtension K n hnK b + let S := finitePlaceKummerLocalExtension K n hnK v b + let E := finitePlaceKummerLocalizedCompletion K n hnK v b w + let : Algebra C E := + finitePlaceKummerLocalizedAlgebra K n hnK v b w + let e := finitePlaceKummerLocalGlobalAlgEquiv K n hnK hmu v b w + let toE : L →+* E := + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + change algebraMap C S (algebraMap K C y) = + e.symm (toE (algebraMap K L y)) + apply e.injective + calc + e (algebraMap C S (algebraMap K C y)) = + algebraMap C E (algebraMap K C y) := e.commutes _ + _ = toE (algebraMap K L y) := + (AbsoluteValue.toAlgebraicLocalization_algebraMap + vK w.1 w.2 y).symm + _ = e (e.symm (toE (algebraMap K L y))) := + (e.apply_symm_apply _).symm + +open scoped Classical in +private noncomputable def + finitePlaceKummerTransportedLocalizedArtinAutomorphism + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + let C := finitePlaceKummerBaseCompletion K v + let S := finitePlaceKummerLocalExtension K n hnK v b + Gal(S/C) := by + let C := finitePlaceKummerBaseCompletion K v + let S := finitePlaceKummerLocalExtension K n hnK v b + let E := finitePlaceKummerLocalizedCompletion K n hnK v b w + let aC := finitePlaceHilbertCompletionUnit K v a + letI : FiniteDimensional K + (chosenSimpleKummerExtension K n hnK b) := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + letI : IsAbelianGalois K + (chosenSimpleKummerExtension K n hnK b) := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + letI : Algebra C E := + finitePlaceKummerLocalizedAlgebra K n hnK v b w + letI : FiniteDimensional C E := + finitePlaceKummerLocalizedFiniteDimensional K n hnK v b w + letI : IsAbelianGalois C E := + finitePlaceLocalArtinIsAbelianGalois + (K := K) (L := chosenSimpleKummerExtension K n hnK b) v w + (chosenSimpleKummerExtension_finiteDimensional K n hnK b) + let e := finitePlaceKummerLocalGlobalAlgEquiv K n hnK hmu v b w + let sigmaE : Gal(E/C) := abelianLocalArtinMonoidHom C E aC + exact (AlgEquiv.autCongr e).symm sigmaE + +open scoped Classical in +private theorem finitePlaceKummerLocalArtin_eq_transported + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + finitePlaceKummerLocalArtinAutomorphism + K n hnK hmu v a b = + finitePlaceKummerTransportedLocalizedArtinAutomorphism + K n hnK hmu v a b w := by + let C := finitePlaceKummerBaseCompletion K v + let L := chosenSimpleKummerExtension K n hnK b + let S := finitePlaceKummerLocalExtension K n hnK v b + let E := finitePlaceKummerLocalizedCompletion K n hnK v b w + let hnC := finitePlaceHilbert_natCast_ne_zero K n hnK v + let hmuC := finitePlaceHilbert_primitiveRoots_nonempty K n hmu v + let aC := finitePlaceHilbertCompletionUnit K v a + let bC := finitePlaceHilbertCompletionUnit K v b + let : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + let : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + let : FiniteDimensional C S := + finitePlaceKummerLocalFiniteDimensional K n hnK v b + let : IsAbelianGalois C S := + chosenSimpleKummerExtension_isAbelianGalois C n hnC hmuC bC + let : Algebra C E := + finitePlaceKummerLocalizedAlgebra K n hnK v b w + let : FiniteDimensional C E := + finitePlaceKummerLocalizedFiniteDimensional K n hnK v b w + let : IsAbelianGalois C E := + finitePlaceLocalArtinIsAbelianGalois + (K := K) (L := L) v w + (chosenSimpleKummerExtension_finiteDimensional K n hnK b) + let e := finitePlaceKummerLocalGlobalAlgEquiv K n hnK hmu v b w + let sigmaS : Gal(S/C) := abelianLocalArtinMonoidHom C S aC + let sigmaE : Gal(E/C) := abelianLocalArtinMonoidHom C E aC + let tauS : Gal(S/C) := (AlgEquiv.autCongr e).symm sigmaE + have hArtinEquiv : + (AlgEquiv.autCongr e).toMonoidHom sigmaS = sigmaE := by + have h := DFunLike.congr_fun + (LocalClassFieldTheory.abelianLocalArtinMonoidHom_autCongr + C S E e) aC + simpa only [sigmaS, sigmaE, MonoidHom.comp_apply] using h + have hsigma : sigmaS = tauS := by + apply (AlgEquiv.autCongr e).injective + calc + (AlgEquiv.autCongr e) sigmaS = sigmaE := hArtinEquiv + _ = (AlgEquiv.autCongr e) tauS := by + exact ((AlgEquiv.autCongr e).apply_symm_apply sigmaE).symm + change sigmaS = tauS + exact hsigma + +open scoped Classical in +private noncomputable def localizedDirectActionValue + {L : Type} [Field L] [Algebra K L] + [hfin : FiniteDimensional K L] [hab : IsAbelianGalois K L] + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (y : (NumberField.HeightOneSpectrum.adicAbv K v).Completionˣ) + (t : AlgebraicNumberTheory.Valuations.LocalizedCompletion + (NumberField.HeightOneSpectrum.adicAbv K v) w) : + AlgebraicNumberTheory.Valuations.LocalizedCompletion + (NumberField.HeightOneSpectrum.adicAbv K v) w := by + let C := (NumberField.HeightOneSpectrum.adicAbv K v).Completion + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion + (NumberField.HeightOneSpectrum.adicAbv K v) w + let _ : ValuativeRel C := finitePlaceLocalArtinCompletionValuativeRel v + let _ : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + let _ : Algebra C E := finitePlaceLocalArtinLocalizedAlgebra v w + let _ : FiniteDimensional C E := finitePlaceLocalArtinFiniteDimensional v w + let _ : IsAbelianGalois C E := + finitePlaceLocalArtinIsAbelianGalois v w hfin + exact abelianLocalArtinMonoidHom C E y t + +open scoped Classical in +private noncomputable def finitePlaceKummerCommonRootAction + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + finitePlaceKummerLocalExtension K n hnK v b := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let C := finitePlaceKummerBaseCompletion K v + let L := chosenSimpleKummerExtension K n hnK b + let S := finitePlaceKummerLocalExtension K n hnK v b + let E := finitePlaceKummerLocalizedCompletion K n hnK v b w + let aC := finitePlaceHilbertCompletionUnit K v a + letI : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + letI : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + letI : Algebra C E := + finitePlaceKummerLocalizedAlgebra K n hnK v b w + letI : FiniteDimensional C E := + finitePlaceKummerLocalizedFiniteDimensional K n hnK v b w + letI : IsAbelianGalois C E := + finitePlaceLocalArtinIsAbelianGalois + (K := K) (L := L) v w + (chosenSimpleKummerExtension_finiteDimensional K n hnK b) + let e := finitePlaceKummerLocalGlobalAlgEquiv K n hnK hmu v b w + let toE : L →+* E := + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + let uL : Lˣ := chosenSimpleKummerRootUnit K n hnK b + exact e.symm (localizedDirectActionValue K v w aC (toE (uL : L))) + +open scoped Classical in +private theorem finitePlaceKummerTransportedArtinRoot_eq_common + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + let f := finitePlaceKummerGlobalToLocalRingHom + K n hnK hmu v b w + let uL := chosenSimpleKummerRootUnit K n hnK b + finitePlaceKummerTransportedLocalizedArtinAutomorphism + K n hnK hmu v a b w (f uL) = + finitePlaceKummerCommonRootAction + K n hnK hmu v a b w := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let C := finitePlaceKummerBaseCompletion K v + let L := chosenSimpleKummerExtension K n hnK b + let S := finitePlaceKummerLocalExtension K n hnK v b + let E := finitePlaceKummerLocalizedCompletion K n hnK v b w + let aC := finitePlaceHilbertCompletionUnit K v a + let : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + let : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + let : Algebra C E := + finitePlaceKummerLocalizedAlgebra K n hnK v b w + let : FiniteDimensional C E := + finitePlaceKummerLocalizedFiniteDimensional K n hnK v b w + let : IsAbelianGalois C E := + finitePlaceLocalArtinIsAbelianGalois + (K := K) (L := L) v w + (chosenSimpleKummerExtension_finiteDimensional K n hnK b) + let e := finitePlaceKummerLocalGlobalAlgEquiv K n hnK hmu v b w + let toE : L →+* E := + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + let f : L →+* S := e.symm.toRingHom.comp toE + let uL : Lˣ := chosenSimpleKummerRootUnit K n hnK b + let sigmaE : Gal(E/C) := abelianLocalArtinMonoidHom C E aC + let directE : E := localizedDirectActionValue K v w aC (toE (uL : L)) + let tauS : Gal(S/C) := (AlgEquiv.autCongr e).symm sigmaE + have hArtinEquiv : + (AlgEquiv.autCongr e).toMonoidHom tauS = sigmaE := + (AlgEquiv.autCongr e).apply_symm_apply sigmaE + have hlocalNaturality (y : S) : + e (tauS y) = sigmaE (e y) := by + calc + e (tauS y) = + ((AlgEquiv.autCongr e).toMonoidHom tauS) (e y) := by + change e (tauS y) = e (tauS (e.symm (e y))) + exact + (congrArg (fun t : S => e (tauS t)) + (e.symm_apply_apply y)).symm + _ = sigmaE (e y) := + congrArg (fun tau : Gal(E/C) => tau (e y)) hArtinEquiv + have hef : e (f (uL : L)) = toE (uL : L) := by + change e (e.symm (toE (uL : L))) = toE (uL : L) + exact e.apply_symm_apply _ + have hdirect : directE = sigmaE (toE (uL : L)) := rfl + change tauS (f (uL : L)) = e.symm directE + apply e.injective + calc + e (tauS (f (uL : L))) = sigmaE (e (f (uL : L))) := + hlocalNaturality (f (uL : L)) + _ = sigmaE (toE (uL : L)) := + congrArg (fun t : E => sigmaE t) hef + _ = directE := hdirect.symm + _ = e (e.symm directE) := (e.apply_symm_apply _).symm + +open scoped Classical in +private noncomputable def localizedInputActionValue + {L : Type} [Field L] [Algebra K L] + [hfin : FiniteDimensional K L] [hab : IsAbelianGalois K L] + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (x : (v.adicCompletion K)ˣ) (z : L) : + AlgebraicNumberTheory.Valuations.LocalizedCompletion + (NumberField.HeightOneSpectrum.adicAbv K v) w := + localizedDirectActionValue K v w (finitePlaceLocalArtinInput v x) + (AbsoluteValue.toAlgebraicLocalization + (NumberField.HeightOneSpectrum.adicAbv K v) w.1 w.2 z) + +open scoped Classical in +private noncomputable def localizedGlobalActionValue + {L : Type} [Field L] [Algebra K L] + [hfin : FiniteDimensional K L] [hab : IsAbelianGalois K L] + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (x : (v.adicCompletion K)ˣ) (z : L) : + AlgebraicNumberTheory.Valuations.LocalizedCompletion + (NumberField.HeightOneSpectrum.adicAbv K v) w := + AbsoluteValue.toAlgebraicLocalization + (NumberField.HeightOneSpectrum.adicAbv K v) w.1 w.2 + (finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v w x z) + +open scoped Classical in +private theorem localizedActionValue_eq + {L : Type} [Field L] [Algebra K L] + [hfin : FiniteDimensional K L] [hab : IsAbelianGalois K L] + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (x : (v.adicCompletion K)ˣ) (z : L) : + localizedInputActionValue K v w x z = + localizedGlobalActionValue K v w x z := by + exact finitePlaceArtin_apply_localized (K := K) (L := L) v w x z + +open scoped Classical in +private noncomputable def finitePlaceKummerLocalizedInputValue + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + finitePlaceKummerLocalizedCompletion K n hnK v b w := + localizedInputActionValue (K := K) + (hfin := chosenSimpleKummerExtension_finiteDimensional K n hnK b) + (hab := chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b) + v w + (Units.map (algebraMap K (v.adicCompletion K)).toMonoidHom a) + (chosenSimpleKummerRootUnit K n hnK b : + chosenSimpleKummerExtension K n hnK b) + +open scoped Classical in +private noncomputable def finitePlaceKummerLocalizedGlobalValue + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + finitePlaceKummerLocalizedCompletion K n hnK v b w := + localizedGlobalActionValue (K := K) + (hfin := chosenSimpleKummerExtension_finiteDimensional K n hnK b) + (hab := chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b) + v w + (Units.map (algebraMap K (v.adicCompletion K)).toMonoidHom a) + (chosenSimpleKummerRootUnit K n hnK b : + chosenSimpleKummerExtension K n hnK b) + +open scoped Classical in +private theorem finitePlaceKummerLocalizedValue_eq + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + finitePlaceKummerLocalizedInputValue K n hnK hmu v a b w = + finitePlaceKummerLocalizedGlobalValue K n hnK hmu v a b w := by + exact localizedActionValue_eq + (K := K) (L := chosenSimpleKummerExtension K n hnK b) + (hfin := chosenSimpleKummerExtension_finiteDimensional K n hnK b) + (hab := chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b) + v w + (Units.map (algebraMap K (v.adicCompletion K)).toMonoidHom a) + (chosenSimpleKummerRootUnit K n hnK b : + chosenSimpleKummerExtension K n hnK b) + +open scoped Classical in +private theorem finitePlaceKummerCommonImage_eq_localizedInputValue + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + finitePlaceKummerLocalGlobalAlgEquiv K n hnK hmu v b w + (finitePlaceKummerCommonRootAction K n hnK hmu v a b w) = + finitePlaceKummerLocalizedInputValue K n hnK hmu v a b w := by + let L := chosenSimpleKummerExtension K n hnK b + let C := finitePlaceKummerBaseCompletion K v + let E := finitePlaceKummerLocalizedCompletion K n hnK v b w + let _ : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let _ : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let _ : ValuativeRel C := finitePlaceLocalArtinCompletionValuativeRel v + let _ : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + let _ : Algebra C E := finitePlaceKummerLocalizedAlgebra K n hnK v b w + let _ : FiniteDimensional C E := + finitePlaceKummerLocalizedFiniteDimensional K n hnK v b w + let _ : IsAbelianGalois C E := + finitePlaceLocalArtinIsAbelianGalois + (K := K) (L := L) v w + (chosenSimpleKummerExtension_finiteDimensional K n hnK b) + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let x : (v.adicCompletion K)ˣ := + Units.map (algebraMap K (v.adicCompletion K)).toMonoidHom a + let aC : Cˣ := finitePlaceHilbertCompletionUnit K v a + let z : L := chosenSimpleKummerRootUnit K n hnK b + let toE : L →+* E := AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + let e := finitePlaceKummerLocalGlobalAlgEquiv K n hnK hmu v b w + let directFor (y : Cˣ) : E := + localizedDirectActionValue K v w y (toE z) + have hinput : finitePlaceLocalArtinInput v x = aC := + finitePlaceLocalArtinInput_globalUnit K v a + calc + e (finitePlaceKummerCommonRootAction K n hnK hmu v a b w) = + directFor aC := by + change e (e.symm (directFor aC)) = directFor aC + exact e.apply_symm_apply _ + _ = directFor (finitePlaceLocalArtinInput v x) := + congrArg directFor hinput.symm + _ = finitePlaceKummerLocalizedInputValue K n hnK hmu v a b w := by + unfold finitePlaceKummerLocalizedInputValue localizedInputActionValue + rfl + +open scoped Classical in +private theorem finitePlaceKummerGlobalArtin_localized_action + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + finitePlaceKummerLocalGlobalAlgEquiv K n hnK hmu v b w + (finitePlaceKummerCommonRootAction K n hnK hmu v a b w) = + AbsoluteValue.toAlgebraicLocalization + (NumberField.HeightOneSpectrum.adicAbv K v) w.1 w.2 + (finitePlaceKummerGlobalArtinAutomorphism + K n hnK hmu v a b w + (chosenSimpleKummerRootUnit K n hnK b)) := by + calc + finitePlaceKummerLocalGlobalAlgEquiv K n hnK hmu v b w + (finitePlaceKummerCommonRootAction K n hnK hmu v a b w) = + finitePlaceKummerLocalizedInputValue K n hnK hmu v a b w := + finitePlaceKummerCommonImage_eq_localizedInputValue + K n hnK hmu v a b w + _ = finitePlaceKummerLocalizedGlobalValue K n hnK hmu v a b w := + finitePlaceKummerLocalizedValue_eq K n hnK hmu v a b w + _ = AbsoluteValue.toAlgebraicLocalization + (NumberField.HeightOneSpectrum.adicAbv K v) w.1 w.2 + (finitePlaceKummerGlobalArtinAutomorphism + K n hnK hmu v a b w + (chosenSimpleKummerRootUnit K n hnK b)) := rfl + +open scoped Classical in +private theorem finitePlaceKummerCommonRootAction_eq_global + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + let f := finitePlaceKummerGlobalToLocalRingHom + K n hnK hmu v b w + let uL := chosenSimpleKummerRootUnit K n hnK b + finitePlaceKummerCommonRootAction + K n hnK hmu v a b w = + f (finitePlaceKummerGlobalArtinAutomorphism + K n hnK hmu v a b w uL) := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let C := finitePlaceKummerBaseCompletion K v + let L := chosenSimpleKummerExtension K n hnK b + let S := finitePlaceKummerLocalExtension K n hnK v b + let E := finitePlaceKummerLocalizedCompletion K n hnK v b w + let aC := finitePlaceHilbertCompletionUnit K v a + let x : (v.adicCompletion K)ˣ := + Units.map (algebraMap K (v.adicCompletion K)).toMonoidHom a + let hKLfinite : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let hKLgalois : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + let : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + let : Algebra C E := + finitePlaceKummerLocalizedAlgebra K n hnK v b w + let : FiniteDimensional C E := + finitePlaceKummerLocalizedFiniteDimensional K n hnK v b w + let : IsAbelianGalois C E := + finitePlaceLocalArtinIsAbelianGalois + (K := K) (L := L) v w hKLfinite + let e := finitePlaceKummerLocalGlobalAlgEquiv K n hnK hmu v b w + let toE : L →+* E := + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + let f : L →+* S := e.symm.toRingHom.comp toE + let uL : Lˣ := chosenSimpleKummerRootUnit K n hnK b + let sigmaG : Gal(L/K) := + finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v w x + have himage := finitePlaceKummerGlobalArtin_localized_action + K n hnK hmu v a b w + apply e.injective + calc + e (finitePlaceKummerCommonRootAction + K n hnK hmu v a b w) = + toE (sigmaG (uL : L)) := himage + _ = e (f (sigmaG (uL : L))) := by + change toE (sigmaG (uL : L)) = + e (e.symm (toE (sigmaG (uL : L)))) + exact (e.apply_symm_apply _).symm + +open scoped Classical in +private theorem finitePlaceKummerTransportedArtin_root_action + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + let f := finitePlaceKummerGlobalToLocalRingHom + K n hnK hmu v b w + let uL := chosenSimpleKummerRootUnit K n hnK b + finitePlaceKummerTransportedLocalizedArtinAutomorphism + K n hnK hmu v a b w (f uL) = + f (finitePlaceKummerGlobalArtinAutomorphism + K n hnK hmu v a b w uL) := + (finitePlaceKummerTransportedArtinRoot_eq_common + K n hnK hmu v a b w).trans + (finitePlaceKummerCommonRootAction_eq_global + K n hnK hmu v a b w) + +open scoped Classical in +/-- The global-to-local Kummer map intertwines the two Artin actions on the +chosen Kummer root. -/ +private theorem finitePlaceKummerGlobalToLocalRingHom_artin_action + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + let f := finitePlaceKummerGlobalToLocalRingHom + K n hnK hmu v b w + let uL := chosenSimpleKummerRootUnit K n hnK b + finitePlaceKummerLocalArtinAutomorphism + K n hnK hmu v a b (f uL) = + f (finitePlaceKummerGlobalArtinAutomorphism + K n hnK hmu v a b w uL) := by + let C := finitePlaceKummerBaseCompletion K v + let L := chosenSimpleKummerExtension K n hnK b + let S := finitePlaceKummerLocalExtension K n hnK v b + let f : L →+* S := + finitePlaceKummerGlobalToLocalRingHom K n hnK hmu v b w + let uL : Lˣ := chosenSimpleKummerRootUnit K n hnK b + let sigmaS : Gal(S/C) := + finitePlaceKummerLocalArtinAutomorphism + K n hnK hmu v a b + let tauS : Gal(S/C) := + finitePlaceKummerTransportedLocalizedArtinAutomorphism + K n hnK hmu v a b w + let sigmaG : Gal(L/K) := + finitePlaceKummerGlobalArtinAutomorphism + K n hnK hmu v a b w + calc + sigmaS (f (uL : L)) = tauS (f (uL : L)) := + congrArg (fun tau : Gal(S/C) => tau (f (uL : L))) + (finitePlaceKummerLocalArtin_eq_transported + K n hnK hmu v a b w) + _ = f (sigmaG (uL : L)) := + finitePlaceKummerTransportedArtin_root_action + K n hnK hmu v a b w + +open scoped Classical in +/-- The image of the chosen global Kummer root has the same prescribed +power as the root chosen intrinsically over the completion. -/ +private theorem finitePlaceKummerGlobalToLocalRingHom_root_pow + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + let C := finitePlaceKummerBaseCompletion K v + let S := finitePlaceKummerLocalExtension K n hnK v b + let f := finitePlaceKummerGlobalToLocalRingHom + K n hnK hmu v b w + let uL := chosenSimpleKummerRootUnit K n hnK b + let bC := finitePlaceHilbertCompletionUnit K v b + Units.map f.toMonoidHom uL ^ (n : ℕ) = + Units.map (algebraMap C S).toMonoidHom bC := by + let C := finitePlaceKummerBaseCompletion K v + let L := chosenSimpleKummerExtension K n hnK b + let S := finitePlaceKummerLocalExtension K n hnK v b + let f := finitePlaceKummerGlobalToLocalRingHom + K n hnK hmu v b w + let uL : Lˣ := chosenSimpleKummerRootUnit K n hnK b + let bC := finitePlaceHilbertCompletionUnit K v b + have huLpow : + uL ^ (n : ℕ) = Units.map (algebraMap K L).toMonoidHom b := + chosenSimpleKummerRootUnit_pow K n hnK b + calc + Units.map f.toMonoidHom uL ^ (n : ℕ) = + Units.map f.toMonoidHom (uL ^ (n : ℕ)) := + (map_pow (Units.map f.toMonoidHom) uL (n : ℕ)).symm + _ = Units.map f.toMonoidHom + (Units.map (algebraMap K L).toMonoidHom b) := by rw [huLpow] + _ = Units.map (algebraMap C S).toMonoidHom bC := by + apply Units.ext + change f (algebraMap K L (b : K)) = + algebraMap C S (algebraMap K C (b : K)) + exact + (finitePlaceKummerGlobalToLocalRingHom_commutes + K n hnK hmu v b w (b : K)).symm + +open scoped Classical in +private theorem finitePlaceKummerMappedGlobalCharacter_units + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + let L := chosenSimpleKummerExtension K n hnK b + let f := finitePlaceKummerGlobalToLocalRingHom + K n hnK hmu v b w + let uL := chosenSimpleKummerRootUnit K n hnK b + let sigmaG := finitePlaceKummerGlobalArtinAutomorphism + K n hnK hmu v a b w + let globalValue := + finitePlaceKummerRootCharacterOfExtension + K n hnK hmu v a b w + Units.map f.toMonoidHom + (Units.map (algebraMap K L).toMonoidHom globalValue.1) = + Units.map f.toMonoidHom + (rootQuotient (K := K) (L := L) uL sigmaG) := by + let L := chosenSimpleKummerExtension K n hnK b + let f := finitePlaceKummerGlobalToLocalRingHom + K n hnK hmu v b w + let uL : Lˣ := chosenSimpleKummerRootUnit K n hnK b + let sigmaG : Gal(L/K) := + finitePlaceKummerGlobalArtinAutomorphism + K n hnK hmu v a b w + let globalValue := + finitePlaceKummerRootCharacterOfExtension + K n hnK hmu v a b w + have hglobalMap : + nthRootsSubgroupMap K L (n : ℕ) globalValue = + chosenSimpleKummerRootCharacter K n hnK hmu b sigmaG := by + unfold globalValue sigmaG + unfold finitePlaceKummerRootCharacterOfExtension + finitePlaceKummerGlobalArtinAutomorphism + exact + (nthRootsSubgroupEquivOfPrimitiveRoots K L n hmu).apply_symm_apply _ + have hglobalRoot : + Units.map (algebraMap K L).toMonoidHom globalValue.1 = + rootQuotient (K := K) (L := L) uL sigmaG := by + have h := congrArg Subtype.val hglobalMap + rw [chosenSimpleKummerRootCharacter_apply] at h + exact h + exact congrArg (Units.map f.toMonoidHom) hglobalRoot + +open scoped Classical in +private theorem finitePlaceKummerRootQuotient_eq_local + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + let C := finitePlaceKummerBaseCompletion K v + let L := chosenSimpleKummerExtension K n hnK b + let S := finitePlaceKummerLocalExtension K n hnK v b + let f := finitePlaceKummerGlobalToLocalRingHom + K n hnK hmu v b w + let uL := chosenSimpleKummerRootUnit K n hnK b + let uS := chosenSimpleKummerRootUnit C + n (finitePlaceHilbert_natCast_ne_zero K n hnK v) + (finitePlaceHilbertCompletionUnit K v b) + let sigmaG := finitePlaceKummerGlobalArtinAutomorphism + K n hnK hmu v a b w + let sigmaS := finitePlaceKummerLocalArtinAutomorphism + K n hnK hmu v a b + Units.map f.toMonoidHom + (rootQuotient (K := K) (L := L) uL sigmaG) = + rootQuotient (K := C) (L := S) uS sigmaS := by + let C := finitePlaceKummerBaseCompletion K v + let L := chosenSimpleKummerExtension K n hnK b + let S := finitePlaceKummerLocalExtension K n hnK v b + let hnC := finitePlaceHilbert_natCast_ne_zero K n hnK v + let hmuC := finitePlaceHilbert_primitiveRoots_nonempty K n hmu v + let bC := finitePlaceHilbertCompletionUnit K v b + let f : L →+* S := + finitePlaceKummerGlobalToLocalRingHom K n hnK hmu v b w + let uL : Lˣ := chosenSimpleKummerRootUnit K n hnK b + let uS : Sˣ := chosenSimpleKummerRootUnit C n hnC bC + let sigmaG : Gal(L/K) := + finitePlaceKummerGlobalArtinAutomorphism + K n hnK hmu v a b w + let sigmaS : Gal(S/C) := + finitePlaceKummerLocalArtinAutomorphism + K n hnK hmu v a b + have haction : + sigmaS (f (uL : L)) = f (sigmaG (uL : L)) := + finitePlaceKummerGlobalToLocalRingHom_artin_action + K n hnK hmu v a b w + have hrootMap : + Units.map f.toMonoidHom + (rootQuotient (K := K) (L := L) uL sigmaG) = + rootQuotient (K := C) (L := S) + (Units.map f.toMonoidHom uL) sigmaS := + rootQuotient_map_ringHom_of_action + f uL sigmaG sigmaS haction + have huTpow : + Units.map f.toMonoidHom uL ^ (n : ℕ) = + Units.map (algebraMap C S).toMonoidHom bC := + finitePlaceKummerGlobalToLocalRingHom_root_pow + K n hnK hmu v b w + have huSpow : + uS ^ (n : ℕ) = Units.map (algebraMap C S).toMonoidHom bC := + chosenSimpleKummerRootUnit_pow C n hnC bC + have hchoice : + rootQuotient (K := C) (L := S) + (Units.map f.toMonoidHom uL) sigmaS = + rootQuotient (K := C) (L := S) uS sigmaS := + rootQuotient_eq_of_same_pow_of_primitiveRoots + C n hmuC bC (Units.map f.toMonoidHom uL) uS + huTpow huSpow sigmaS + exact hrootMap.trans hchoice + +open scoped Classical in +private theorem finitePlaceKummerLocalHilbert_units + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) : + let C := finitePlaceKummerBaseCompletion K v + let S := finitePlaceKummerLocalExtension K n hnK v b + let uS := chosenSimpleKummerRootUnit C + n (finitePlaceHilbert_natCast_ne_zero K n hnK v) + (finitePlaceHilbertCompletionUnit K v b) + let sigmaS := finitePlaceKummerLocalArtinAutomorphism + K n hnK hmu v a b + Units.map (algebraMap C S).toMonoidHom + (finitePlaceLocalHilbertSymbol K n hnK hmu v a b).1 = + rootQuotient (K := C) (L := S) uS sigmaS := by + let C := finitePlaceKummerBaseCompletion K v + let S := finitePlaceKummerLocalExtension K n hnK v b + let hnC := finitePlaceHilbert_natCast_ne_zero K n hnK v + let hmuC := finitePlaceHilbert_primitiveRoots_nonempty K n hmu v + let aC := finitePlaceHilbertCompletionUnit K v a + let bC := finitePlaceHilbertCompletionUnit K v b + let : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + let : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + let : FiniteDimensional C S := + finitePlaceKummerLocalFiniteDimensional K n hnK v b + let : IsAbelianGalois C S := + chosenSimpleKummerExtension_isAbelianGalois C n hnC hmuC bC + let uS : Sˣ := chosenSimpleKummerRootUnit C n hnC bC + let sigmaS : Gal(S/C) := + finitePlaceKummerLocalArtinAutomorphism + K n hnK hmu v a b + let localValue := + LocalClassFieldTheory.Kummer.localHilbertSymbol + C n hnC hmuC aC bC + have hmap := + LocalClassFieldTheory.Kummer.localHilbertSymbol_map_eq_rootQuotient + C n hnC hmuC aC bC + have hroot : + Units.map (algebraMap C S).toMonoidHom localValue.1 = + rootQuotient (K := C) (L := S) uS sigmaS := by + have h := congrArg Subtype.val hmap + change + Units.map (algebraMap C S).toMonoidHom localValue.1 = + rootQuotient (K := C) (L := S) uS sigmaS at h + exact h + have hvalue : + finitePlaceLocalHilbertSymbol K n hnK hmu v a b = localValue := by + unfold finitePlaceLocalHilbertSymbol localValue + rfl + rw [hvalue] + exact hroot + +open scoped Classical in +/-- For every extension of a finite place, the global Kummer root character +equals the finite-place Hilbert symbol. -/ +theorem finitePlaceKummerRootCharacterOfExtension_localGlobal + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + finitePlaceKummerRootCharacterOfExtension + K n hnK hmu v a b w = + finitePlaceHilbertSymbol K n hnK hmu v a b := by + let C := finitePlaceKummerBaseCompletion K v + let L := chosenSimpleKummerExtension K n hnK b + let S := finitePlaceKummerLocalExtension K n hnK v b + let f : L →+* S := + finitePlaceKummerGlobalToLocalRingHom K n hnK hmu v b w + let uL : Lˣ := chosenSimpleKummerRootUnit K n hnK b + let sigmaG : Gal(L/K) := + finitePlaceKummerGlobalArtinAutomorphism + K n hnK hmu v a b w + let globalValue := + finitePlaceKummerRootCharacterOfExtension K n hnK hmu v a b w + let localValue := + finitePlaceLocalHilbertSymbol K n hnK hmu v a b + let uS : Sˣ := chosenSimpleKummerRootUnit C + n (finitePlaceHilbert_natCast_ne_zero K n hnK v) + (finitePlaceHilbertCompletionUnit K v b) + let sigmaS : Gal(S/C) := + finitePlaceKummerLocalArtinAutomorphism + K n hnK hmu v a b + apply nthRootsSubgroupMap_injective K C (n : ℕ) + rw [finitePlaceHilbertSymbol_map_eq_localHilbertSymbol] + apply nthRootsSubgroupMap_injective C S (n : ℕ) + apply Subtype.ext + change + (nthRootsSubgroupMap C S (n : ℕ) + (nthRootsSubgroupMap K C (n : ℕ) globalValue)).1 = + (nthRootsSubgroupMap C S (n : ℕ) localValue).1 + calc + (nthRootsSubgroupMap C S (n : ℕ) + (nthRootsSubgroupMap K C (n : ℕ) globalValue)).1 = + Units.map f.toMonoidHom + (Units.map (algebraMap K L).toMonoidHom globalValue.1) := + nthRootsSubgroupMap_comp_eq_unitsMap + (n : ℕ) globalValue f + (finitePlaceKummerGlobalToLocalRingHom_commutes + K n hnK hmu v b w) + _ = Units.map f.toMonoidHom + (rootQuotient (K := K) (L := L) uL sigmaG) := + finitePlaceKummerMappedGlobalCharacter_units + K n hnK hmu v a b w + _ = rootQuotient (K := C) (L := S) uS sigmaS := + finitePlaceKummerRootQuotient_eq_local + K n hnK hmu v a b w + _ = Units.map (algebraMap C S).toMonoidHom localValue.1 := + (finitePlaceKummerLocalHilbert_units + K n hnK hmu v a b).symm + _ = (nthRootsSubgroupMap C S (n : ℕ) localValue).1 := rfl + +open scoped Classical in +/-- The canonical finite-place Kummer root character is the finite-place +Hilbert symbol. -/ +theorem finitePlaceKummerRootCharacter_localGlobal + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) : + finitePlaceKummerRootCharacter K n hnK hmu v a b = + finitePlaceHilbertSymbol K n hnK hmu v a b := by + let L := chosenSimpleKummerExtension K n hnK b + let : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let w := chosenFinitePlaceExtension (L := L) v + calc + finitePlaceKummerRootCharacter K n hnK hmu v a b = + finitePlaceKummerRootCharacterOfExtension + K n hnK hmu v a b w := + (finitePlaceKummerRootCharacterOfExtension_eq + K n hnK hmu v a b w).symm + _ = finitePlaceHilbertSymbol K n hnK hmu v a b := + finitePlaceKummerRootCharacterOfExtension_localGlobal + K n hnK hmu v a b w + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceComparison.lean new file mode 100644 index 0000000000..a5f268ec97 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceComparison.lean @@ -0,0 +1,222 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.Core +/-! +# Finite-place local--global Kummer comparison + +This file isolates the completion factor used to compare the global Kummer +root character with the local Hilbert symbol. The algebra, finiteness, root, +and splitting-field data are named separately so downstream proofs do not +rebuild the localized-completion instance tower. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory +open AlgebraicNumberTheory.Valuations +open LocalClassFieldTheory + +variable (K : Type) [Field K] [NumberField K] + +open scoped Classical in +/-- The absolute-value completion used at the finite place `v`. -/ +abbrev finitePlaceKummerBaseCompletion + (v : HeightOneSpectrum (𝓞 K)) := + (NumberField.HeightOneSpectrum.adicAbv K v).Completion + +open scoped Classical in +/-- The localized completion of the chosen global simple Kummer extension. -/ +abbrev finitePlaceKummerLocalizedCompletion + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (v : HeightOneSpectrum (𝓞 K)) (b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) := + LocalizedCompletion + (NumberField.HeightOneSpectrum.adicAbv K v) w + +open scoped Classical in +/-- The canonical completion algebra for the localized global Kummer +extension. -/ +@[reducible] +noncomputable def finitePlaceKummerLocalizedAlgebra + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (v : HeightOneSpectrum (𝓞 K)) (b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + Algebra (finitePlaceKummerBaseCompletion K v) + (finitePlaceKummerLocalizedCompletion K n hnK v b w) := + finitePlaceLocalArtinLocalizedAlgebra + (K := K) (L := chosenSimpleKummerExtension K n hnK b) v w + +open scoped Classical in +/-- The named finite-dimensional certificate for the localized global +Kummer extension. -/ +theorem finitePlaceKummerLocalizedFiniteDimensional + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (v : HeightOneSpectrum (𝓞 K)) (b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + letI : Algebra (finitePlaceKummerBaseCompletion K v) + (finitePlaceKummerLocalizedCompletion K n hnK v b w) := + finitePlaceKummerLocalizedAlgebra K n hnK v b w + FiniteDimensional (finitePlaceKummerBaseCompletion K v) + (finitePlaceKummerLocalizedCompletion K n hnK v b w) := by + let : FiniteDimensional K (chosenSimpleKummerExtension K n hnK b) := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + exact finitePlaceLocalArtinFiniteDimensional + (K := K) (L := chosenSimpleKummerExtension K n hnK b) v w + +open scoped Classical in +/-- The image of the global chosen radical as a unit of the localized +completion. -/ +noncomputable def finitePlaceKummerLocalizedRootUnit + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (v : HeightOneSpectrum (𝓞 K)) (b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + (finitePlaceKummerLocalizedCompletion K n hnK v b w)ˣ := + Units.map + (AbsoluteValue.toAlgebraicLocalization + (NumberField.HeightOneSpectrum.adicAbv K v) w.1 w.2).toMonoidHom + (chosenSimpleKummerRootUnit K n hnK b) + +open scoped Classical in +/-- The localized global radical is an `n`-th root of the image of `b` in +the finite-place completion. -/ +theorem finitePlaceKummerLocalizedRootUnit_pow + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (v : HeightOneSpectrum (𝓞 K)) (b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + letI : Algebra (finitePlaceKummerBaseCompletion K v) + (finitePlaceKummerLocalizedCompletion K n hnK v b w) := + finitePlaceKummerLocalizedAlgebra K n hnK v b w + finitePlaceKummerLocalizedRootUnit K n hnK v b w ^ (n : ℕ) = + Units.map + (algebraMap (finitePlaceKummerBaseCompletion K v) + (finitePlaceKummerLocalizedCompletion K n hnK v b w)).toMonoidHom + (finitePlaceHilbertCompletionUnit K v b) := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + have hroot_val : + (((chosenSimpleKummerRootUnit K n hnK b : + (chosenSimpleKummerExtension K n hnK b)ˣ) : + chosenSimpleKummerExtension K n hnK b) ^ (n : ℕ)) = + algebraMap K (chosenSimpleKummerExtension K n hnK b) (b : K) := by + apply Subtype.ext + exact chosenSimpleKummerRoot_pow K n hnK b + let L := chosenSimpleKummerExtension K n hnK b + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := LocalizedCompletion vK w + let : Algebra vK.Completion E := + finitePlaceKummerLocalizedAlgebra K n hnK v b w + apply Units.ext + simp only [finitePlaceKummerLocalizedRootUnit, + finitePlaceHilbertCompletionUnit, Units.val_pow_eq_pow_val, Units.coe_map] + calc + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + (((chosenSimpleKummerRootUnit K n hnK b : Lˣ) : L)) ^ (n : ℕ) = + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + (((chosenSimpleKummerRootUnit K n hnK b : Lˣ) : L) ^ (n : ℕ)) := by + exact (map_pow + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2) + (((chosenSimpleKummerRootUnit K n hnK b : Lˣ) : L)) (n : ℕ)).symm + _ = AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + (algebraMap K L (b : K)) := by rw [hroot_val] + _ = algebraMap vK.Completion E + (algebraMap K vK.Completion (b : K)) := + AbsoluteValue.toAlgebraicLocalization_algebraMap + vK w.1 w.2 (b : K) + +open scoped Classical in +/-- The localized image of the global chosen radical generates the whole +localized extension over the base completion. -/ +theorem finitePlaceKummerLocalizedRoot_adjoin_eq_top + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (v : HeightOneSpectrum (𝓞 K)) (b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + letI : Algebra (finitePlaceKummerBaseCompletion K v) + (finitePlaceKummerLocalizedCompletion K n hnK v b w) := + finitePlaceKummerLocalizedAlgebra K n hnK v b w + IntermediateField.adjoin (finitePlaceKummerBaseCompletion K v) + {((finitePlaceKummerLocalizedRootUnit K n hnK v b w : + (finitePlaceKummerLocalizedCompletion K n hnK v b w)ˣ) : + finitePlaceKummerLocalizedCompletion K n hnK v b w)} = ⊤ := by + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let L := chosenSimpleKummerExtension K n hnK b + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := LocalizedCompletion vK w + let : Algebra vK.Completion E := + finitePlaceKummerLocalizedAlgebra K n hnK v b w + let : Algebra K E := localizedCompletionGlobalAlgebra vK w + let : SMul K E := (localizedCompletionGlobalAlgebra vK w).toSMul + let : IsScalarTower K vK.Completion E := + localizedCompletionIsScalarTower vK w + exact localizedCompletion_adjoin_image_eq_top_of_adjoin_eq_top + vK w + (((chosenSimpleKummerRootUnit K n hnK b : Lˣ) : L)) + (chosenSimpleKummerExtension_adjoin_root_eq_top K n hnK b) + +open scoped Classical in +/-- The localized global simple Kummer extension is a splitting field for +the local Kummer polynomial. -/ +theorem finitePlaceKummerLocalized_isSplittingField + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + let C := finitePlaceKummerBaseCompletion K v + let E := finitePlaceKummerLocalizedCompletion K n hnK v b w + letI : Algebra C E := + finitePlaceKummerLocalizedAlgebra K n hnK v b w + letI : FiniteDimensional C E := + finitePlaceKummerLocalizedFiniteDimensional K n hnK v b w + Polynomial.IsSplittingField C E + (Polynomial.X ^ (n : ℕ) - + Polynomial.C (algebraMap K C (b : K))) := by + let C := finitePlaceKummerBaseCompletion K v + let E := finitePlaceKummerLocalizedCompletion K n hnK v b w + let : Algebra C E := + finitePlaceKummerLocalizedAlgebra K n hnK v b w + let : FiniteDimensional C E := + finitePlaceKummerLocalizedFiniteDimensional K n hnK v b w + exact + isSplittingField_X_pow_sub_C_of_root_adjoin_eq_top_of_primitiveRoots + C E n (finitePlaceHilbert_primitiveRoots_nonempty K n hmu v) + (algebraMap K C (b : K)) + ((finitePlaceKummerLocalizedRootUnit K n hnK v b w : Eˣ) : E) + (congrArg Units.val + (finitePlaceKummerLocalizedRootUnit_pow K n hnK v b w)) + (finitePlaceKummerLocalizedRoot_adjoin_eq_top K n hnK v b w) + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceFiniteSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceFiniteSupport.lean new file mode 100644 index 0000000000..55c73d67aa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceFiniteSupport.lean @@ -0,0 +1,107 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceCharacterComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin +/-! +# Finite support of finite-place Hilbert symbols + +The finite-place Hilbert-symbol family is obtained by applying the Kummer +root character to the finite-place Artin factors of a principal idele. Its +finite support therefore follows directly from the existing finite-support +theorem for those Artin factors; no second ramification-support construction +is needed here. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory +open Function + +variable (K : Type) [Field K] [NumberField K] + +open scoped Classical in +/-- For fixed global units `a` and `b`, the finite-place Hilbert symbols are +nontrivial at only finitely many finite places. -/ +theorem finitePlaceHilbertSymbol_hasFiniteMulSupport + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a b : Kˣ) : + HasFiniteMulSupport + (fun v : HeightOneSpectrum (𝓞 K) => + finitePlaceHilbertSymbol K n hnK hmu v a b) := by + let L := chosenSimpleKummerExtension K n hnK b + let _ : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let _ : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let _ : NumberField L := NumberField.of_module_finite K L + let chi : Gal(L/K) →* nthRootsSubgroup K (n : ℕ) := + (nthRootsSubgroupEquivOfPrimitiveRoots K L n hmu).symm.toMonoidHom.comp + (chosenSimpleKummerRootCharacter K n hnK hmu b) + have hArtin : + HasFiniteMulSupport + (fun v : HeightOneSpectrum (𝓞 K) => + chosenFinitePlaceArtinMonoidHom (K := K) (L := L) v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele K a))) := + finitePlaceArtinFactors_hasFiniteMulSupport + (K := K) (L := L) (IdeleGroup.principalIdele K a) + have hRoot : + HasFiniteMulSupport + (fun v : HeightOneSpectrum (𝓞 K) => + chi + (chosenFinitePlaceArtinMonoidHom (K := K) (L := L) v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele K a)))) := + hArtin.fun_comp chi.map_one + convert hRoot using 1 + funext v + have hcomponent : + (IdeleGroup.finiteComponent v (IdeleGroup.principalIdele K a) : + (v.adicCompletion K)ˣ) = + Units.map (algebraMap K (v.adicCompletion K)).toMonoidHom a := by + apply Units.ext + calc + ((IdeleGroup.finiteComponent v (IdeleGroup.principalIdele K a) : + (v.adicCompletion K)ˣ) : v.adicCompletion K) = + ((a : K) : v.adicCompletion K) := + IdeleGroup.finiteComponent_principalIdele a v + _ = algebraMap K (v.adicCompletion K) (a : K) := by + symm + have hmap := congrFun + (IsDedekindDomain.HeightOneSpectrum.algebraMap_adicCompletion + (R := 𝓞 K) (S := K) (K := K) (v := v)) (a : K) + simpa using hmap + rw [hcomponent] + calc + finitePlaceHilbertSymbol K n hnK hmu v a b = + finitePlaceKummerRootCharacter K n hnK hmu v a b := + (finitePlaceKummerRootCharacter_localGlobal + K n hnK hmu v a b).symm + _ = chi + (chosenFinitePlaceArtinMonoidHom (K := K) (L := L) v + (Units.map (algebraMap K (v.adicCompletion K)).toMonoidHom a)) := by + change finitePlaceKummerRootCharacter K n hnK hmu v a b = + finitePlaceKummerRootCharacterOfExtension K n hnK hmu v a b + (chosenFinitePlaceExtension (L := L) v) + exact + (finitePlaceKummerRootCharacterOfExtension_eq K n hnK hmu v a b + (chosenFinitePlaceExtension (L := L) v)).symm + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceLocalGlobal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceLocalGlobal.lean new file mode 100644 index 0000000000..d7a48aff4e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceLocalGlobal.lean @@ -0,0 +1,174 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceComparison +/-! +# Finite-place local--global Kummer transport + +This file compares the two splitting fields of the finite-place Kummer +polynomial: the simple Kummer extension chosen directly over the completion +and the localization of the chosen global simple Kummer extension. The +completion input, finiteness, splitting-field, and equivalence data are kept +as separate declarations so the eventual root-character comparison does not +rebuild their instance towers. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory +open AlgebraicNumberTheory.Valuations + +variable (K : Type) [Field K] [NumberField K] + +open scoped Classical in +/-- The Kummer polynomial obtained by mapping a global radicand into the +finite-place completion. -/ +abbrev finitePlaceKummerPolynomial + (n : ℕ+) (v : HeightOneSpectrum (𝓞 K)) (b : Kˣ) := + Polynomial.X ^ (n : ℕ) - + Polynomial.C + (algebraMap K (finitePlaceKummerBaseCompletion K v) (b : K)) + +open scoped Classical in +/-- The simple Kummer extension chosen intrinsically over the finite-place +completion. -/ +noncomputable abbrev finitePlaceKummerLocalExtension + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (v : HeightOneSpectrum (𝓞 K)) (b : Kˣ) := + chosenSimpleKummerExtension + (finitePlaceKummerBaseCompletion K v) n + (finitePlaceHilbert_natCast_ne_zero K n hnK v) + (finitePlaceHilbertCompletionUnit K v b) + +open scoped Classical in +/-- Mapping a global unit through the concrete adic-completion model and +then back through the canonical completion equivalence gives its ordinary +image in the absolute-value completion. -/ +theorem finitePlaceLocalArtinInput_globalUnit + (v : HeightOneSpectrum (𝓞 K)) (a : Kˣ) : + finitePlaceLocalArtinInput v + (Units.map + (algebraMap K (v.adicCompletion K)).toMonoidHom a) = + finitePlaceHilbertCompletionUnit K v a := by + apply Units.ext + apply (finitePlaceCompletionRingEquiv v).injective + let x : (v.adicCompletion K)ˣ := + Units.map (algebraMap K (v.adicCompletion K)).toMonoidHom a + have hleft : + finitePlaceCompletionRingEquiv v + (finitePlaceLocalArtinInput v x : + finitePlaceKummerBaseCompletion K v) = + (x : v.adicCompletion K) := by + exact congrArg Units.val + ((finitePlaceCompletionUnitsContinuousMulEquiv v).apply_symm_apply x) + calc + finitePlaceCompletionRingEquiv v + (finitePlaceLocalArtinInput v + (Units.map + (algebraMap K (v.adicCompletion K)).toMonoidHom a) : + finitePlaceKummerBaseCompletion K v) = + (x : v.adicCompletion K) := hleft + _ = algebraMap K (v.adicCompletion K) (a : K) := rfl + _ = finitePlaceCompletionRingEquiv v + (finitePlaceHilbertCompletionUnit K v a : + finitePlaceKummerBaseCompletion K v) := by + change + algebraMap K (v.adicCompletion K) (a : K) = + finitePlaceCompletionRingEquiv v + (algebraMap K (finitePlaceKummerBaseCompletion K v) (a : K)) + rw [finitePlaceCompletionRingEquiv_eq_relative] + exact (relativeFinitePlaceCompletionAlgEquiv v).commutes (a : K) |>.symm + +open scoped Classical in +/-- The named finite-dimensional certificate for the Kummer extension +chosen directly over the completion. -/ +theorem finitePlaceKummerLocalFiniteDimensional + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (v : HeightOneSpectrum (𝓞 K)) (b : Kˣ) : + FiniteDimensional (finitePlaceKummerBaseCompletion K v) + (finitePlaceKummerLocalExtension K n hnK v b) := + chosenSimpleKummerExtension_finiteDimensional + (finitePlaceKummerBaseCompletion K v) n + (finitePlaceHilbert_natCast_ne_zero K n hnK v) + (finitePlaceHilbertCompletionUnit K v b) + +open scoped Classical in +/-- The simple Kummer extension chosen directly over the completion is a +splitting field of the finite-place Kummer polynomial. -/ +theorem finitePlaceKummerLocal_isSplittingField + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (b : Kˣ) : + Polynomial.IsSplittingField + (finitePlaceKummerBaseCompletion K v) + (finitePlaceKummerLocalExtension K n hnK v b) + (finitePlaceKummerPolynomial K n v b) := by + let C := finitePlaceKummerBaseCompletion K v + let hnC := finitePlaceHilbert_natCast_ne_zero K n hnK v + let bC := finitePlaceHilbertCompletionUnit K v b + let S := chosenSimpleKummerExtension C n hnC bC + let : FiniteDimensional C S := + finitePlaceKummerLocalFiniteDimensional K n hnK v b + change Polynomial.IsSplittingField C S + (Polynomial.X ^ (n : ℕ) - Polynomial.C (bC : C)) + apply + isSplittingField_X_pow_sub_C_of_root_adjoin_eq_top_of_primitiveRoots + C S n (finitePlaceHilbert_primitiveRoots_nonempty K n hmu v) + (bC : C) + ((chosenSimpleKummerRootUnit C n hnC bC : Sˣ) : S) + · apply Subtype.ext + exact chosenSimpleKummerRoot_pow C n hnC bC + · exact chosenSimpleKummerExtension_adjoin_root_eq_top C n hnC bC + +open scoped Classical in +/-- A canonical algebra equivalence between the intrinsically local Kummer +extension and the localization of the chosen global Kummer extension. It is +constructed solely from the fact that both fields split the same polynomial; +no compatibility between their chosen roots is assumed. -/ +noncomputable def finitePlaceKummerLocalGlobalAlgEquiv + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (b : Kˣ) + (w : AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (chosenSimpleKummerExtension K n hnK b)) : + let C := finitePlaceKummerBaseCompletion K v + let S := finitePlaceKummerLocalExtension K n hnK v b + let E := finitePlaceKummerLocalizedCompletion K n hnK v b w + letI : Algebra C E := + finitePlaceKummerLocalizedAlgebra K n hnK v b w + S ≃ₐ[C] E := by + let C := finitePlaceKummerBaseCompletion K v + let S := finitePlaceKummerLocalExtension K n hnK v b + let E := finitePlaceKummerLocalizedCompletion K n hnK v b w + let f := finitePlaceKummerPolynomial K n v b + letI : Algebra C E := + finitePlaceKummerLocalizedAlgebra K n hnK v b w + letI : FiniteDimensional C S := + finitePlaceKummerLocalFiniteDimensional K n hnK v b + letI : FiniteDimensional C E := + finitePlaceKummerLocalizedFiniteDimensional K n hnK v b w + letI : Polynomial.IsSplittingField C S f := + finitePlaceKummerLocal_isSplittingField K n hnK hmu v b + letI : Polynomial.IsSplittingField C E f := + finitePlaceKummerLocalized_isSplittingField K n hnK hmu v b w + exact + (Polynomial.IsSplittingField.algEquiv S f).trans + (Polynomial.IsSplittingField.algEquiv E f).symm + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlace.lean new file mode 100644 index 0000000000..b2ceaefb42 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlace.lean @@ -0,0 +1,97 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RootCharacters +public import Mathlib.NumberTheory.NumberField.InfinitePlace.Basic +/-! +# Hilbert symbols at infinite places + +At a complex place the Hilbert symbol is trivial. At a real place, once the +base field contains the relevant roots of unity, the only nontrivial case is +the quadratic one: its value is `-1` exactly when both arguments are negative. +The definition below records that evaluation directly in `μₙ(K)`. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory + +variable (K : Type) [Field K] [NumberField K] + +open scoped Classical in +/-- The Hilbert symbol of two global units at an infinite place. Complex +places and nonquadratic exponents contribute `1`; a real quadratic place +contributes `-1` precisely when both real embeddings are negative. -/ +noncomputable def infinitePlaceHilbertSymbol + (n : ℕ+) (v : InfinitePlace K) (a b : Kˣ) : + nthRootsSubgroup K (n : ℕ) := by + by_cases hn : (n : ℕ) = 2 + · by_cases hv : v.IsReal + · by_cases ha : InfinitePlace.embedding_of_isReal hv (a : K) < 0 + · by_cases hb : InfinitePlace.embedding_of_isReal hv (b : K) < 0 + · refine ⟨(-1 : Kˣ), ?_⟩ + change (-1 : Kˣ) ^ (n : ℕ) = 1 + rw [hn] + simp + · exact 1 + · exact 1 + · exact 1 + · exact 1 + +omit [NumberField K] in +open scoped Classical in +/-- Every complex infinite place has trivial Hilbert symbol. -/ +@[simp] +theorem infinitePlaceHilbertSymbol_eq_one_of_isComplex + (n : ℕ+) (v : InfinitePlace K) (a b : Kˣ) + (hv : v.IsComplex) : + infinitePlaceHilbertSymbol K n v a b = 1 := by + have hvNotReal : ¬v.IsReal := + InfinitePlace.not_isReal_iff_isComplex.mpr hv + simp [infinitePlaceHilbertSymbol, hvNotReal] + +omit [NumberField K] in +open scoped Classical in +/-- Away from the quadratic exponent, every infinite-place factor is +trivial. -/ +@[simp] +theorem infinitePlaceHilbertSymbol_eq_one_of_ne_two + (n : ℕ+) (v : InfinitePlace K) (a b : Kˣ) + (hn : (n : ℕ) ≠ 2) : + infinitePlaceHilbertSymbol K n v a b = 1 := by + simp [infinitePlaceHilbertSymbol, hn] + +omit [NumberField K] in +open scoped Classical in +/-- Explicit real-place evaluation of the quadratic Hilbert symbol. -/ +theorem infinitePlaceHilbertSymbol_real_apply + (n : ℕ+) (v : InfinitePlace K) (a b : Kˣ) + (hn : (n : ℕ) = 2) (hv : v.IsReal) : + (infinitePlaceHilbertSymbol K n v a b).1 = + if InfinitePlace.embedding_of_isReal hv (a : K) < 0 ∧ + InfinitePlace.embedding_of_isReal hv (b : K) < 0 then + (-1 : Kˣ) + else + 1 := by + by_cases ha : InfinitePlace.embedding_of_isReal hv (a : K) < 0 + · by_cases hb : InfinitePlace.embedding_of_isReal hv (b : K) < 0 + · simp [infinitePlaceHilbertSymbol, hn, hv, ha, hb] + · simp [infinitePlaceHilbertSymbol, hn, hv, ha, hb] + · simp [infinitePlaceHilbertSymbol, hn, hv, ha] + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceCharacter.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceCharacter.lean new file mode 100644 index 0000000000..f739eeeb27 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceCharacter.lean @@ -0,0 +1,121 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfinitePlaceArtin +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension +/-! +# Infinite-place Kummer root characters + +This file connects the infinite-place Hilbert factor to the Kummer root +character of the actual infinite-place Artin map. The complex-place branch +is completed here. The real quadratic action is kept as the next arithmetic +leaf rather than being introduced as an assumption. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory + +variable (K : Type) [Field K] [NumberField K] + +open scoped Classical in +/-- The Kummer root character of the actual Artin automorphism at an +infinite place. -/ +noncomputable def infinitePlaceKummerRootCharacter + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : InfinitePlace K) (a b : Kˣ) : + nthRootsSubgroup K (n : ℕ) := by + let L := chosenSimpleKummerExtension K n hnK b + letI : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + letI : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + letI : NumberField L := NumberField.of_module_finite K L + let a_v : v.Completionˣ := + Units.map (algebraMap K v.Completion).toMonoidHom a + exact + (nthRootsSubgroupEquivOfPrimitiveRoots K L n hmu).symm + (chosenSimpleKummerRootCharacter K n hnK hmu b + (chosenInfinitePlaceArtinMonoidHom (K := K) (L := L) v a_v)) + +omit [NumberField K] in +open scoped Classical in +private theorem chosenInfinitePlaceArtinMonoidHom_eq_one_of_isComplex + {L : Type} [Field L] [Algebra K L] [IsGalois K L] + (v : InfinitePlace K) (hv : v.IsComplex) (x : v.Completionˣ) : + chosenInfinitePlaceArtinMonoidHom (K := K) (L := L) v x = 1 := by + let w := chosenInfinitePlaceAbove (L := L) v + have hw : w.comap (algebraMap K L) = v := + chosenInfinitePlaceAbove_comap (L := L) v + have hwUnramified : w.IsUnramified K := by + apply InfinitePlace.isUnramified_iff.mpr + apply Or.inr + rw [hw] + exact hv + have hwUnramified' : + (chosenInfinitePlaceAbove (L := L) v).IsUnramified K := by + simpa only [w] using hwUnramified + unfold chosenInfinitePlaceArtinMonoidHom + unfold infinitePlaceArtinMonoidHomOfPlace + rw [dite_eq_left hwUnramified'] + rfl + +open scoped Classical in +/-- At a complex place the infinite-place Kummer root character is +trivial. -/ +@[simp] +theorem infinitePlaceKummerRootCharacter_eq_one_of_isComplex + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : InfinitePlace K) (a b : Kˣ) (hv : v.IsComplex) : + infinitePlaceKummerRootCharacter K n hnK hmu v a b = 1 := by + let L := chosenSimpleKummerExtension K n hnK b + let : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let : NumberField L := NumberField.of_module_finite K L + let a_v : v.Completionˣ := + Units.map (algebraMap K v.Completion).toMonoidHom a + have hArtin : + chosenInfinitePlaceArtinMonoidHom (K := K) (L := L) v + a_v = 1 := + chosenInfinitePlaceArtinMonoidHom_eq_one_of_isComplex K v hv a_v + change + (nthRootsSubgroupEquivOfPrimitiveRoots K L n hmu).symm + (chosenSimpleKummerRootCharacter K n hnK hmu b + (chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v a_v)) = 1 + rw [hArtin, map_one, map_one] + +open scoped Classical in +/-- The Kummer root character and the explicit Hilbert factor agree at every +complex infinite place. -/ +theorem infinitePlaceKummerRootCharacter_localGlobal_of_isComplex + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : InfinitePlace K) (a b : Kˣ) (hv : v.IsComplex) : + infinitePlaceKummerRootCharacter K n hnK hmu v a b = + infinitePlaceHilbertSymbol K n v a b := by + rw [infinitePlaceKummerRootCharacter_eq_one_of_isComplex + K n hnK hmu v a b hv] + exact (infinitePlaceHilbertSymbol_eq_one_of_isComplex K n v a b hv).symm + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegative.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegative.lean new file mode 100644 index 0000000000..f6b7729b89 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegative.lean @@ -0,0 +1,122 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeUnit +/-! +# The negative-negative real infinite-place Hilbert factor +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory + +variable (K : Type) [Field K] [NumberField K] + +open scoped Classical in +/-- In the quadratic real case with both arguments negative, the actual +infinite-place Kummer root character is `-1`. -/ +theorem infinitePlaceKummerRootCharacter_eq_neg_one_of_real_of_neg_neg + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : InfinitePlace K) (a b : Kˣ) + (hn : (n : ℕ) = 2) (hv : v.IsReal) + (ha : InfinitePlace.embedding_of_isReal hv (a : K) < 0) + (hb : InfinitePlace.embedding_of_isReal hv (b : K) < 0) : + let negOne : nthRootsSubgroup K (n : ℕ) := + ⟨(-1 : Kˣ), by simp [hn]⟩ + infinitePlaceKummerRootCharacter K n hnK hmu v a b = negOne := by + let L := chosenSimpleKummerExtension K n hnK b + let : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let : NumberField L := NumberField.of_module_finite K L + let a_v : v.Completionˣ := + Units.map (algebraMap K v.Completion).toMonoidHom a + let beta : Lˣ := chosenSimpleKummerRootUnit K n hnK b + let sigma : Gal(L/K) := + chosenInfinitePlaceArtinMonoidHom (K := K) (L := L) v a_v + let negOne : nthRootsSubgroup K (n : ℕ) := + ⟨(-1 : Kˣ), by simp [hn]⟩ + have hArtin : + sigma = chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v (-1 : v.Completionˣ) := by + exact chosenInfinitePlaceArtin_globalUnit_eq_neg_one_of_real_of_neg + K v hv a ha + have haction : + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v (-1 : v.Completionˣ) (beta : L) = + -(beta : L) := by + change + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v (-1 : v.Completionˣ) + ((chosenSimpleKummerRootUnit K n hnK b : Lˣ) : L) = + -((chosenSimpleKummerRootUnit K n hnK b : Lˣ) : L) + exact + chosenInfinitePlaceArtin_neg_one_apply_kummerRoot_of_real_of_radical_neg + K n hnK hmu v b hn hv hb + have hroot : + rootQuotient (K := K) (L := L) beta sigma = + Units.map (algebraMap K L).toMonoidHom negOne.1 := by + apply Units.ext + simp only [rootQuotient, Units.val_div_eq_div_val, Units.coe_map] + change sigma (beta : L) / (beta : L) = + algebraMap K L (-1 : K) + rw [hArtin, haction] + simp + apply nthRootsSubgroupMap_injective K L (n : ℕ) + change + nthRootsSubgroupMap K L (n : ℕ) + ((nthRootsSubgroupEquivOfPrimitiveRoots K L n hmu).symm + (chosenSimpleKummerRootCharacter K n hnK hmu b sigma)) = + nthRootsSubgroupMap K L (n : ℕ) negOne + calc + nthRootsSubgroupMap K L (n : ℕ) + ((nthRootsSubgroupEquivOfPrimitiveRoots K L n hmu).symm + (chosenSimpleKummerRootCharacter K n hnK hmu b sigma)) = + chosenSimpleKummerRootCharacter K n hnK hmu b sigma := by + exact + (nthRootsSubgroupEquivOfPrimitiveRoots K L n hmu).apply_symm_apply _ + _ = nthRootsSubgroupMap K L (n : ℕ) negOne := by + apply Subtype.ext + rw [chosenSimpleKummerRootCharacter_apply] + exact hroot + +open scoped Classical in +/-- The explicit Hilbert factor and the Kummer root character agree in the +negative-negative quadratic real branch. -/ +theorem infinitePlaceKummerRootCharacter_localGlobal_of_real_of_neg_neg + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : InfinitePlace K) (a b : Kˣ) + (hn : (n : ℕ) = 2) (hv : v.IsReal) + (ha : InfinitePlace.embedding_of_isReal hv (a : K) < 0) + (hb : InfinitePlace.embedding_of_isReal hv (b : K) < 0) : + infinitePlaceKummerRootCharacter K n hnK hmu v a b = + infinitePlaceHilbertSymbol K n v a b := by + let negOne : nthRootsSubgroup K (n : ℕ) := + ⟨(-1 : Kˣ), by simp [hn]⟩ + calc + infinitePlaceKummerRootCharacter K n hnK hmu v a b = negOne := + infinitePlaceKummerRootCharacter_eq_neg_one_of_real_of_neg_neg + K n hnK hmu v a b hn hv ha hb + _ = infinitePlaceHilbertSymbol K n v a b := by + apply Subtype.ext + simp [negOne, infinitePlaceHilbertSymbol, hn, hv, ha, hb] + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeRoot.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeRoot.lean new file mode 100644 index 0000000000..d40452c5eb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeRoot.lean @@ -0,0 +1,108 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRamification +public import Mathlib.Analysis.Complex.Order +/-! +# Complex conjugation on a negative quadratic Kummer root +-/ + +@[expose] public section + +open scoped ComplexConjugate ComplexOrder NumberField +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory + +variable (K : Type) [Field K] [NumberField K] + +open scoped Classical in +/-- At a real place where the quadratic radicand is negative, the actual +infinite-place Artin value of `-1` sends the chosen Kummer root to its +negative. -/ +theorem chosenInfinitePlaceArtin_neg_one_apply_kummerRoot_of_real_of_radical_neg + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : InfinitePlace K) (b : Kˣ) + (hn : (n : ℕ) = 2) (hv : v.IsReal) + (hb : InfinitePlace.embedding_of_isReal hv (b : K) < 0) : + let L := chosenSimpleKummerExtension K n hnK b + letI : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + letI : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + letI : NumberField L := NumberField.of_module_finite K L + let beta : L := (chosenSimpleKummerRootUnit K n hnK b : Lˣ) + chosenInfinitePlaceArtinMonoidHom (K := K) (L := L) v + (-1 : v.Completionˣ) beta = -beta := by + let L := chosenSimpleKummerExtension K n hnK b + let : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let : NumberField L := NumberField.of_module_finite K L + let beta : L := (chosenSimpleKummerRootUnit K n hnK b : Lˣ) + have hbeta : beta ^ 2 = algebraMap K L (b : K) := by + have hunit := congrArg Units.val + (chosenSimpleKummerRootUnit_pow K n hnK b) + rw [hn] at hunit + exact hunit + let w := chosenInfinitePlaceAbove (L := L) v + have hw : w.comap (algebraMap K L) = v := + chosenInfinitePlaceAbove_comap (L := L) v + have hcomapReal : (w.comap (algebraMap K L)).IsReal := by + rw [hw] + exact hv + have hcomp := + InfinitePlace.comap_embedding_of_isReal + (algebraMap K L) hcomapReal + have hsq : + (w.embedding beta) ^ 2 = + (InfinitePlace.embedding_of_isReal hv (b : K) : ℂ) := by + calc + (w.embedding beta) ^ 2 = w.embedding (beta ^ 2) := by rw [map_pow] + _ = w.embedding (algebraMap K L (b : K)) := by rw [hbeta] + _ = (w.comap (algebraMap K L)).embedding (b : K) := by + rw [hcomp] + rfl + _ = v.embedding (b : K) := by rw [hw] + _ = (InfinitePlace.embedding_of_isReal hv (b : K) : ℂ) := by + rw [InfinitePlace.embedding_of_isReal_apply] + have hnonpos : (w.embedding beta) ^ 2 ≤ (0 : ℂ) := by + rw [hsq] + exact (Complex.real_le_real).2 hb.le + have hre : (w.embedding beta).re = 0 := + Complex.sq_nonpos_iff.mp hnonpos + have hstar : star (w.embedding beta) = -w.embedding beta := by + apply Complex.ext + · simp [hre] + · simp + have hRamified : w.IsRamified K := by + simpa only [L, w] using + chosenSimpleKummerExtension_chosenInfinitePlace_isRamified_of_real_of_radical_neg + K n hnK hmu v b hn hv hb + have hConj := + chosenInfinitePlaceArtinMonoidHom_neg_one_isConj_of_ramified + (K := K) (L := L) v hRamified + apply w.embedding.injective + calc + w.embedding + (chosenInfinitePlaceArtinMonoidHom (K := K) (L := L) v + (-1 : v.Completionˣ) beta) = + star (w.embedding beta) := hConj.eq beta + _ = -w.embedding beta := hstar + _ = w.embedding (-beta) := by rw [map_neg] + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeUnit.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeUnit.lean new file mode 100644 index 0000000000..11feb32541 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeUnit.lean @@ -0,0 +1,89 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeRoot +/-! +# Negative units and the real infinite-place Artin map +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +variable (K : Type) [Field K] [NumberField K] + +open scoped Classical in +private theorem ringEquiv_unit_div_neg_one + {F : Type*} [Field F] (e : F ≃+* ℝ) (x : Fˣ) : + e ((x / (-1 : Fˣ) : Fˣ) : F) = -e (x : F) := by + calc + e ((x / (-1 : Fˣ) : Fˣ) : F) = + e (x : F) / e (-1 : F) := + by + rw [Units.val_div_eq_div_val] + exact map_div₀ e (x : F) (-1 : F) + _ = -e (x : F) := by + rw [map_neg, map_one, div_neg, div_one] + +open scoped Classical in +private theorem monoidHom_eq_of_div_apply_eq_one + {G H : Type*} [Group G] [Monoid H] + (f : G →* H) (x y : G) (h : f (x / y) = 1) : + f x = f y := by + calc + f x = f ((x / y) * y) := by simp + _ = f (x / y) * f y := map_mul f _ _ + _ = f y := by rw [h, one_mul] + +omit [NumberField K] in +open scoped Classical in +/-- At a real infinite place, the Artin value of a negative global unit is +the Artin value of `-1`. -/ +theorem chosenInfinitePlaceArtin_globalUnit_eq_neg_one_of_real_of_neg + {L : Type} [Field L] [Algebra K L] [IsGalois K L] + (v : InfinitePlace K) (hv : v.IsReal) (a : Kˣ) + (ha : InfinitePlace.embedding_of_isReal hv (a : K) < 0) : + chosenInfinitePlaceArtinMonoidHom (K := K) (L := L) v + (Units.map (algebraMap K v.Completion).toMonoidHom a) = + chosenInfinitePlaceArtinMonoidHom (K := K) (L := L) v + (-1 : v.Completionˣ) := by + let e : v.Completion ≃+* ℝ := + InfinitePlace.Completion.ringEquivRealOfIsReal hv + let a_v : v.Completionˣ := + Units.map (algebraMap K v.Completion).toMonoidHom a + let q : v.Completionˣ := a_v / (-1 : v.Completionˣ) + have haCoord : + e (a_v : v.Completion) = + InfinitePlace.embedding_of_isReal hv (a : K) := + realInfinitePlace_globalUnit_realCoordinate K v hv a + have hqCoord : + e (q : v.Completion) = + -InfinitePlace.embedding_of_isReal hv (a : K) := by + rw [show e (q : v.Completion) = -e (a_v : v.Completion) by + exact ringEquiv_unit_div_neg_one e a_v] + rw [haCoord] + have hqPos : 0 < e (q : v.Completion) := by + rw [hqCoord] + linarith + let artin := chosenInfinitePlaceArtinMonoidHom (K := K) (L := L) v + have hqArtin : artin q = 1 := by + exact chosenInfinitePlaceArtinMonoidHom_eq_one_of_real_pos + (K := K) (L := L) v hv q hqPos + change artin a_v = artin (-1 : v.Completionˣ) + apply monoidHom_eq_of_div_apply_eq_one artin + simpa only [q] using hqArtin + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlacePositive.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlacePositive.lean new file mode 100644 index 0000000000..3a821c9f01 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlacePositive.lean @@ -0,0 +1,105 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceCharacter +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealSquare +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SimpleExtensionLocalBehavior +/-! +# The positive-radicand real infinite-place branch + +When the radicand is positive at a real place, it is a square in the local +completion. The existing Kummer tensor-norm theorem then makes the local +norm subgroup all of the completion units, so the actual infinite-place +Artin automorphism and its Kummer root character are trivial. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory + +variable (K : Type) [Field K] [NumberField K] + +open scoped Classical in +/-- In the quadratic real case, a positive radicand makes the infinite-place +Kummer root character trivial. -/ +theorem infinitePlaceKummerRootCharacter_eq_one_of_real_of_radical_pos + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : InfinitePlace K) (a b : Kˣ) + (hn : (n : ℕ) = 2) (hv : v.IsReal) + (hb : 0 < InfinitePlace.embedding_of_isReal hv (b : K)) : + infinitePlaceKummerRootCharacter K n hnK hmu v a b = 1 := by + let L := chosenSimpleKummerExtension K n hnK b + let : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let : NumberField L := NumberField.of_module_finite K L + let a_v : v.Completionˣ := + Units.map (algebraMap K v.Completion).toMonoidHom a + have hbSquare : + Units.map (algebraMap K v.Completion).toMonoidHom b ∈ + (powMonoidHom (n : ℕ) : v.Completionˣ →* v.Completionˣ).range := by + rw [hn] + exact realInfinitePlace_globalUnit_mem_squareSubgroup_of_pos K v hv b hb + have hNormTop : + infiniteTensorNormSubgroup (K := K) (L := L) v = ⊤ := by + simpa only [L] using + chosenSimpleKummerExtension_infiniteTensorNormSubgroup_eq_top_of_mem_nthPowerSubgroup + (K := K) n hnK hmu b v hbSquare + have haNorm : + a_v ∈ infiniteTensorNormSubgroup (K := K) (L := L) v := by + rw [hNormTop] + trivial + have haKer : + a_v ∈ (chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v).ker := by + rw [chosenInfinitePlaceArtinMonoidHom_ker] + exact haNorm + have hArtin : + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v a_v = 1 := + MonoidHom.mem_ker.mp haKer + change + (nthRootsSubgroupEquivOfPrimitiveRoots K L n hmu).symm + (chosenSimpleKummerRootCharacter K n hnK hmu b + (chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v a_v)) = 1 + rw [hArtin, map_one, map_one] + +open scoped Classical in +/-- The explicit real Hilbert factor and the Kummer root character agree +when the quadratic radicand is positive. -/ +theorem infinitePlaceKummerRootCharacter_localGlobal_of_real_of_radical_pos + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : InfinitePlace K) (a b : Kˣ) + (hn : (n : ℕ) = 2) (hv : v.IsReal) + (hb : 0 < InfinitePlace.embedding_of_isReal hv (b : K)) : + infinitePlaceKummerRootCharacter K n hnK hmu v a b = + infinitePlaceHilbertSymbol K n v a b := by + rw [infinitePlaceKummerRootCharacter_eq_one_of_real_of_radical_pos + K n hnK hmu v a b hn hv hb] + have hbNotNeg : + ¬InfinitePlace.embedding_of_isReal hv (b : K) < 0 := + not_lt_of_ge hb.le + symm + apply Subtype.ext + simp [infinitePlaceHilbertSymbol, hn, hv, hbNotNeg] + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRamification.lean new file mode 100644 index 0000000000..ae7f383464 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRamification.lean @@ -0,0 +1,101 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlacePositive +/-! +# Ramification of a negative quadratic Kummer radical at a real place +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory + +variable (K : Type) [Field K] [NumberField K] + +omit [NumberField K] in +open scoped Classical in +/-- In the quadratic Kummer extension of a radicand that is negative at a +real place, the chosen infinite place upstairs is ramified. -/ +theorem chosenSimpleKummerExtension_chosenInfinitePlace_isRamified_of_real_of_radical_neg + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : InfinitePlace K) (b : Kˣ) + (hn : (n : ℕ) = 2) (hv : v.IsReal) + (hb : InfinitePlace.embedding_of_isReal hv (b : K) < 0) : + let L := chosenSimpleKummerExtension K n hnK b + letI : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + letI : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + letI : NumberField L := NumberField.of_module_finite K L + (chosenInfinitePlaceAbove (L := L) v).IsRamified K := by + let L := chosenSimpleKummerExtension K n hnK b + let : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let beta : L := + (chosenSimpleKummerRootUnit K n hnK b : Lˣ) + have hbeta : beta ^ 2 = algebraMap K L (b : K) := by + have hunit := congrArg Units.val + (chosenSimpleKummerRootUnit_pow K n hnK b) + rw [hn] at hunit + exact hunit + let w := chosenInfinitePlaceAbove (L := L) v + have hw : w.comap (algebraMap K L) = v := + chosenInfinitePlaceAbove_comap (L := L) v + have hwComplex : w.IsComplex := by + apply InfinitePlace.not_isReal_iff_isComplex.mp + intro hwReal + have hcomapReal : (w.comap (algebraMap K L)).IsReal := by + rw [hw] + exact hv + have hcomplexComp := + InfinitePlace.comap_embedding_of_isReal + (algebraMap K L) hcomapReal + have hrealComp : + (InfinitePlace.embedding_of_isReal hwReal).comp + (algebraMap K L) = + InfinitePlace.embedding_of_isReal hv := by + apply RingHom.ext + intro x + apply Complex.ofReal_injective + change + ((InfinitePlace.embedding_of_isReal hwReal + (algebraMap K L x) : ℝ) : ℂ) = + ((InfinitePlace.embedding_of_isReal hv x : ℝ) : ℂ) + rw [InfinitePlace.embedding_of_isReal_apply, + InfinitePlace.embedding_of_isReal_apply] + rw [← RingHom.comp_apply, ← hcomplexComp, hw] + have hsq : + (InfinitePlace.embedding_of_isReal hwReal beta) ^ 2 = + InfinitePlace.embedding_of_isReal hv (b : K) := by + calc + (InfinitePlace.embedding_of_isReal hwReal beta) ^ 2 = + InfinitePlace.embedding_of_isReal hwReal (beta ^ 2) := by + rw [map_pow] + _ = InfinitePlace.embedding_of_isReal hwReal + (algebraMap K L (b : K)) := by rw [hbeta] + _ = InfinitePlace.embedding_of_isReal hv (b : K) := by + exact DFunLike.congr_fun hrealComp (b : K) + nlinarith [sq_nonneg + (InfinitePlace.embedding_of_isReal hwReal beta)] + apply InfinitePlace.isRamified_iff.mpr + exact ⟨hwComplex, by rw [hw]; exact hv⟩ + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealComparison.lean new file mode 100644 index 0000000000..75fd865b1a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealComparison.lean @@ -0,0 +1,183 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegative +/-! +# Complete infinite-place Kummer root-character comparison +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory + +variable (K : Type) [Field K] [NumberField K] + +omit [NumberField K] in +open scoped Classical in +/-- A global unit positive at a real place has trivial infinite-place Kummer +root character. -/ +theorem infinitePlaceKummerRootCharacter_eq_one_of_real_of_left_pos + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : InfinitePlace K) (a b : Kˣ) (hv : v.IsReal) + (ha : 0 < InfinitePlace.embedding_of_isReal hv (a : K)) : + infinitePlaceKummerRootCharacter K n hnK hmu v a b = 1 := by + let L := chosenSimpleKummerExtension K n hnK b + let : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let a_v : v.Completionˣ := + Units.map (algebraMap K v.Completion).toMonoidHom a + have haCoord : + InfinitePlace.Completion.ringEquivRealOfIsReal hv + (a_v : v.Completion) = + InfinitePlace.embedding_of_isReal hv (a : K) := + realInfinitePlace_globalUnit_realCoordinate K v hv a + have hArtin : + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v a_v = 1 := + chosenInfinitePlaceArtinMonoidHom_eq_one_of_real_pos + (K := K) (L := L) v hv a_v (haCoord.symm ▸ ha) + change + (nthRootsSubgroupEquivOfPrimitiveRoots K L n hmu).symm + (chosenSimpleKummerRootCharacter K n hnK hmu b + (chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v a_v)) = 1 + rw [hArtin, map_one, map_one] + +omit [NumberField K] in +open scoped Classical in +/-- In the quadratic real case, positivity of the first argument gives the +explicit local--global comparison. -/ +theorem infinitePlaceKummerRootCharacter_localGlobal_of_real_of_left_pos + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : InfinitePlace K) (a b : Kˣ) + (hn : (n : ℕ) = 2) (hv : v.IsReal) + (ha : 0 < InfinitePlace.embedding_of_isReal hv (a : K)) : + infinitePlaceKummerRootCharacter K n hnK hmu v a b = + infinitePlaceHilbertSymbol K n v a b := by + rw [infinitePlaceKummerRootCharacter_eq_one_of_real_of_left_pos + K n hnK hmu v a b hv ha] + have haNotNeg : + ¬InfinitePlace.embedding_of_isReal hv (a : K) < 0 := + not_lt_of_ge ha.le + symm + apply Subtype.ext + simp [infinitePlaceHilbertSymbol, hn, hv, haNotNeg] + +open scoped Classical in +/-- Complete quadratic comparison at a real infinite place. -/ +theorem infinitePlaceKummerRootCharacter_localGlobal_of_real_of_two + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : InfinitePlace K) (a b : Kˣ) + (hn : (n : ℕ) = 2) (hv : v.IsReal) : + infinitePlaceKummerRootCharacter K n hnK hmu v a b = + infinitePlaceHilbertSymbol K n v a b := by + have haNe : InfinitePlace.embedding_of_isReal hv (a : K) ≠ 0 := by + intro haZero + apply a.ne_zero + apply (InfinitePlace.embedding_of_isReal hv).injective + exact haZero.trans (InfinitePlace.embedding_of_isReal hv).map_zero.symm + rcases lt_trichotomy + (InfinitePlace.embedding_of_isReal hv (a : K)) 0 with + haNeg | haZero | haPos + · have hbNe : InfinitePlace.embedding_of_isReal hv (b : K) ≠ 0 := by + intro hbZero + apply b.ne_zero + apply (InfinitePlace.embedding_of_isReal hv).injective + exact hbZero.trans (InfinitePlace.embedding_of_isReal hv).map_zero.symm + rcases lt_trichotomy + (InfinitePlace.embedding_of_isReal hv (b : K)) 0 with + hbNeg | hbZero | hbPos + · exact + infinitePlaceKummerRootCharacter_localGlobal_of_real_of_neg_neg + K n hnK hmu v a b hn hv haNeg hbNeg + · exact False.elim (hbNe hbZero) + · exact + infinitePlaceKummerRootCharacter_localGlobal_of_real_of_radical_pos + K n hnK hmu v a b hn hv hbPos + · exact False.elim (haNe haZero) + · exact + infinitePlaceKummerRootCharacter_localGlobal_of_real_of_left_pos + K n hnK hmu v a b hn hv haPos + +open scoped Classical in +/-- At every infinite place, the actual infinite-place Artin root character +equals the explicit Hilbert factor. -/ +theorem infinitePlaceKummerRootCharacter_localGlobal + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : InfinitePlace K) (a b : Kˣ) : + infinitePlaceKummerRootCharacter K n hnK hmu v a b = + infinitePlaceHilbertSymbol K n v a b := by + by_cases hv : v.IsReal + · have hnLe : (n : ℕ) ≤ 2 := by + by_contra hnLarge + have hTwoLt : 2 < (n : ℕ) := by omega + obtain ⟨zeta, hzeta⟩ := hmu + have hRealZero : InfinitePlace.nrRealPlaces K = 0 := + InfinitePlace.IsPrimitiveRoot.nrRealPlaces_eq_zero_of_two_lt + hTwoLt ((mem_primitiveRoots n.pos).mp hzeta) + have hRealPos : 0 < InfinitePlace.nrRealPlaces K := + Fintype.card_pos_iff.mpr ⟨⟨v, hv⟩⟩ + omega + have hnPos : 0 < (n : ℕ) := n.pos + have hnCases : (n : ℕ) = 1 ∨ (n : ℕ) = 2 := by + omega + rcases hnCases with hnOne | hnTwo + · apply Subtype.ext + have hleft := + (infinitePlaceKummerRootCharacter K n hnK hmu v a b).2 + have hright := (infinitePlaceHilbertSymbol K n v a b).2 + have hleftOne : + (infinitePlaceKummerRootCharacter K n hnK hmu v a b).1 = 1 := by + calc + (infinitePlaceKummerRootCharacter K n hnK hmu v a b).1 = + (infinitePlaceKummerRootCharacter K n hnK hmu v a b).1 ^ 1 := + (pow_one _).symm + _ = (infinitePlaceKummerRootCharacter K n hnK hmu v a b).1 ^ + (n : ℕ) := congrArg + (fun m : ℕ => + (infinitePlaceKummerRootCharacter + K n hnK hmu v a b).1 ^ m) hnOne.symm + _ = 1 := hleft + have hrightOne : + (infinitePlaceHilbertSymbol K n v a b).1 = 1 := by + calc + (infinitePlaceHilbertSymbol K n v a b).1 = + (infinitePlaceHilbertSymbol K n v a b).1 ^ 1 := + (pow_one _).symm + _ = (infinitePlaceHilbertSymbol K n v a b).1 ^ (n : ℕ) := + congrArg + (fun m : ℕ => (infinitePlaceHilbertSymbol K n v a b).1 ^ m) + hnOne.symm + _ = 1 := hright + exact hleftOne.trans hrightOne.symm + · exact + infinitePlaceKummerRootCharacter_localGlobal_of_real_of_two + K n hnK hmu v a b hnTwo hv + · have hvComplex : v.IsComplex := + InfinitePlace.not_isReal_iff_isComplex.mp hv + exact + infinitePlaceKummerRootCharacter_localGlobal_of_isComplex + K n hnK hmu v a b hvComplex + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealSquare.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealSquare.lean new file mode 100644 index 0000000000..934ef70f9f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealSquare.lean @@ -0,0 +1,87 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlace +public import Mathlib.NumberTheory.NumberField.Completion.InfinitePlace +/-! +# Positive global units are local squares at real places + +This is the arithmetic input for the positive-radicand branch of the real +infinite-place Hilbert-symbol comparison. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +variable (K : Type) [Field K] [NumberField K] + +omit [NumberField K] in +open scoped Classical in +/-- The canonical real coordinate of a global unit in a real completion is +its real infinite-place embedding. -/ +theorem realInfinitePlace_globalUnit_realCoordinate + (v : InfinitePlace K) (hv : v.IsReal) (b : Kˣ) : + InfinitePlace.Completion.ringEquivRealOfIsReal hv + (Units.map (algebraMap K v.Completion).toMonoidHom b : + v.Completionˣ) = + InfinitePlace.embedding_of_isReal hv (b : K) := by + change + InfinitePlace.Completion.ringEquivRealOfIsReal hv + (algebraMap K v.Completion (b : K)) = + InfinitePlace.embedding_of_isReal hv (b : K) + rw [InfinitePlace.Completion.ringEquivRealOfIsReal_apply] + rw [InfinitePlace.Completion.algebraMap_apply] + rw [InfinitePlace.Completion.extensionEmbeddingOfIsReal_coe] + simp only [WithAbs.equiv_apply] + +omit [NumberField K] in +open scoped Classical in +/-- A global unit whose image at a real infinite place is positive becomes a +square in the unit group of the completion. -/ +theorem realInfinitePlace_globalUnit_mem_squareSubgroup_of_pos + (v : InfinitePlace K) (hv : v.IsReal) (b : Kˣ) + (hb : 0 < InfinitePlace.embedding_of_isReal hv (b : K)) : + Units.map (algebraMap K v.Completion).toMonoidHom b ∈ + (powMonoidHom 2 : v.Completionˣ →* v.Completionˣ).range := by + let e : v.Completion ≃+* ℝ := + InfinitePlace.Completion.ringEquivRealOfIsReal hv + let eU : v.Completionˣ ≃* ℝˣ := + Units.mapEquiv e.toMulEquiv + let b_v : v.Completionˣ := + Units.map (algebraMap K v.Completion).toMonoidHom b + have hcoord : + (eU b_v : ℝ) = InfinitePlace.embedding_of_isReal hv (b : K) := by + exact realInfinitePlace_globalUnit_realCoordinate K v hv b + have hpos : 0 < (eU b_v : ℝ) := by + rw [hcoord] + exact hb + let t : ℝˣ := + Units.mk0 (Real.sqrt (eU b_v : ℝ)) + (ne_of_gt (Real.sqrt_pos.2 hpos)) + let y : v.Completionˣ := eU.symm t + refine ⟨y, ?_⟩ + rw [powMonoidHom_apply] + apply eU.injective + calc + eU (y ^ 2) = (eU y) ^ 2 := map_pow eU y 2 + _ = t ^ 2 := by rw [eU.apply_symm_apply] + _ = eU b_v := by + apply Units.ext + change Real.sqrt (eU b_v : ℝ) ^ 2 = (eU b_v : ℝ) + exact Real.sq_sqrt hpos.le + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean new file mode 100644 index 0000000000..e534c1b30c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean @@ -0,0 +1,522 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedReciprocity +/-! +# The global norm-residue symbol + +For a finite abelian Galois extension `L / K`, the rational absolute +idele-class formation realizes the abstract finite norm quotient as the +actual quotient + +`C_K / N_{L/K} C_L`. + +The concrete cyclotomic valuation supplies the valuation data required +by abstract reciprocity. Composing the inverse of the fixed-field +comparison, the abstract norm-residue symbol, and the compatible +Galois-group comparison gives the actual equivalence + +`C_K / N_{L/K} C_L ≃ Gal(L / K)`. + +The homomorphism on `C_K` is obtained from the genuine quotient map. +Consequently it is surjective and its kernel is exactly the range of +the actual ordinary idele-class norm. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open KummerTheory + +/-- Fix the canonical class-group dictionary before forming norm quotients. -/ +@[instance_reducible] +private noncomputable def globalNormResidueIdeleClassCommGroup + (F : Type) [Field F] [NumberField F] : + CommGroup (IdeleClassGroup F) := + QuotientGroup.Quotient.commGroup (IdeleGroup.principalSubgroup F) + +attribute [local instance] globalNormResidueIdeleClassCommGroup + +private theorem globalNormResidueIdeleClassIsMulCommutative + (F : Type) [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + IsMulCommutative.of_comm (fun a b => mul_comm a b) + +attribute [local instance] globalNormResidueIdeleClassIsMulCommutative + +variable + (K L : Type) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + +/-- A reducible presentation of the compatible finite abstract field. +Its field projection is definitionally the concrete tower subgroup, so +dependent norm-quotient types do not require opaque unfolding. -/ +noncomputable abbrev numberFieldTowerReciprocityFiniteAbstractField : + FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) where + field := numberFieldTowerBaseSubgroup K L + finite := numberFieldTowerBaseSubgroupAbsoluteQuotientFinite K L + +/-- The abelianization of the compatible abstract extension quotient +is the actual abelian Galois group of `L / K`. -/ +noncomputable def + numberFieldTowerAbelianizedExtensionQuotientEquivGaloisGroup : + Additive + (Abelianization + (ClassFormation.FiniteGaloisSubextension.extensionQuotient + (numberFieldTowerFiniteGaloisSubextension K L))) ≃+ + Additive (Gal(L/K)) := + MulEquiv.toAdditive + (MulEquiv.trans + (MulEquiv.abelianizationCongr + (numberFieldTowerExtensionQuotientEquivGaloisGroup K L)) + (Abelianization.equivOfComm : + Gal(L/K) ≃* + Abelianization (Gal(L/K))).symm) + +/-- The compatible abelianized extension-quotient comparison sends the +class of an abstract automorphism to the corresponding actual +automorphism of `L / K`. -/ +@[simp] +theorem + numberFieldTowerAbelianizedExtensionQuotientEquivGaloisGroup_of + (q : + ClassFormation.FiniteGaloisSubextension.extensionQuotient + (numberFieldTowerFiniteGaloisSubextension K L)) : + numberFieldTowerAbelianizedExtensionQuotientEquivGaloisGroup K L + (Additive.ofMul (Abelianization.of q)) = + Additive.ofMul + (numberFieldTowerExtensionQuotientEquivGaloisGroup K L q) := by + apply Additive.toMul.injective + change + (Abelianization.equivOfComm : + Gal(L/K) ≃* + Abelianization (Gal(L/K))).symm + (MulEquiv.abelianizationCongr + (numberFieldTowerExtensionQuotientEquivGaloisGroup K L) + (Abelianization.of q)) = + numberFieldTowerExtensionQuotientEquivGaloisGroup K L q + rw [abelianizationCongr_of] + exact + (Abelianization.equivOfComm : + Gal(L/K) ≃* + Abelianization (Gal(L/K))).symm_apply_apply _ + +/-- The abstract norm-residue map followed by the compatible actual +Galois-group comparison. Keeping this composition behind a typed boundary +prevents the finite norm quotient from being reconstructed while composing +with the concrete quotient comparison. -/ +private noncomputable def + numberFieldTowerAbstractNormResidueGaloisEquiv : + FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) ≃+ + Additive (Gal(L/K)) := by + letI : AddCommGroup + (FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) := + finiteNormQuotientAddCommGroup rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) + exact + @AddEquiv.trans + (FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) + (Additive + (Abelianization + (ClassFormation.FiniteGaloisSubextension.extensionQuotient + (numberFieldTowerFiniteGaloisSubextension K L)))) + (Additive (Gal(L/K))) + inferInstance inferInstance inferInstance + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldTowerReciprocityFiniteAbstractField K L) + (numberFieldTowerFiniteGaloisSubextension K L)) + (numberFieldTowerAbelianizedExtensionQuotientEquivGaloisGroup K L) + +/-- Evaluation of the typed abstract norm-residue/Galois comparison. -/ +private theorem numberFieldTowerAbstractNormResidueGaloisEquiv_apply + (x : FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) : + numberFieldTowerAbstractNormResidueGaloisEquiv K L x = + numberFieldTowerAbelianizedExtensionQuotientEquivGaloisGroup K L + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldTowerReciprocityFiniteAbstractField K L) + (numberFieldTowerFiniteGaloisSubextension K L) x) := by + rfl + +/-- The actual global norm-residue equivalence + +`C_K / N_{L/K} C_L ≃ Gal(L / K)`. + +Its three factors are respectively the actual fixed-field norm +comparison, the abstract norm-residue symbol built from the concrete +cyclotomic valuation, and the compatible Galois-group comparison. -/ +noncomputable def globalNormResidueEquiv : + Additive + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≃+ + Additive (Gal(L/K)) := by + exact + (numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient + K L).symm.trans + (numberFieldTowerAbstractNormResidueGaloisEquiv K L) + +/-- Evaluation after transporting an abstract finite norm class to the +ordinary idele-class norm quotient. -/ +private theorem globalNormResidueEquiv_transport_apply + (x : FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) : + globalNormResidueEquiv K L + (numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient + K L x) = + numberFieldTowerAbstractNormResidueGaloisEquiv K L x := by + simp only [globalNormResidueEquiv, AddEquiv.trans_apply, + AddEquiv.symm_apply_apply] + +/-- The global norm-residue equivalence on a finite abstract norm class, +after transport to the ordinary idele-class norm quotient. -/ +theorem globalNormResidueEquiv_finiteNormClass + (x : FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) : + globalNormResidueEquiv K L + (numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient + K L x) = + numberFieldTowerAbelianizedExtensionQuotientEquivGaloisGroup K L + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldTowerReciprocityFiniteAbstractField K L) + (numberFieldTowerFiniteGaloisSubextension K L) x) := + (globalNormResidueEquiv_transport_apply K L x).trans + (numberFieldTowerAbstractNormResidueGaloisEquiv_apply K L x) + +open _root_.GlobalClassFieldTheory.Reciprocity renaming + rationalCyclotomicIdeleClassValuationData → cyclotomicValuationData in + +/-- On the genuine finite-reciprocity class of an abstract extension +automorphism, the global norm-residue equivalence is the corresponding +actual automorphism of `L / K`. -/ +@[simp] +theorem globalNormResidueEquiv_finiteReciprocityHom + (q : + ClassFormation.FiniteGaloisSubextension.extensionQuotient + (numberFieldTowerFiniteGaloisSubextension K L)) : + globalNormResidueEquiv K L + (numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient + K L + (rationalCyclotomicDegreeData.finiteReciprocityHom + rationalIdeleClassRepresentation + cyclotomicValuationData + (cyclotomicValuationData.classFieldAxiom_implies_unramifiedUnitCohomology + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom) + (numberFieldTowerReciprocityFiniteAbstractField K L) + (numberFieldTowerFiniteGaloisSubextension K L).field + (numberFieldTowerFiniteGaloisSubextension K L).below + (hLnormal := + (numberFieldTowerFiniteGaloisSubextension K L).normal) + (hLfinite := + (numberFieldTowerFiniteGaloisSubextension K L).finite) + (Additive.ofMul q))) = + Additive.ofMul + (numberFieldTowerExtensionQuotientEquivGaloisGroup K L q) := by + let x : FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) := + rationalCyclotomicDegreeData.finiteReciprocityHom + rationalIdeleClassRepresentation + cyclotomicValuationData + (cyclotomicValuationData.classFieldAxiom_implies_unramifiedUnitCohomology + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom) + (numberFieldTowerReciprocityFiniteAbstractField K L) + (numberFieldTowerFiniteGaloisSubextension K L).field + (numberFieldTowerFiniteGaloisSubextension K L).below + (hLnormal := + (numberFieldTowerFiniteGaloisSubextension K L).normal) + (hLfinite := + (numberFieldTowerFiniteGaloisSubextension K L).finite) + (Additive.ofMul q) + change + globalNormResidueEquiv K L + (numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient + K L x) = + Additive.ofMul + (numberFieldTowerExtensionQuotientEquivGaloisGroup K L q) + calc + _ = numberFieldTowerAbstractNormResidueGaloisEquiv K L x := + globalNormResidueEquiv_transport_apply K L x + _ = + numberFieldTowerAbelianizedExtensionQuotientEquivGaloisGroup K L + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + cyclotomicValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldTowerReciprocityFiniteAbstractField K L) + (numberFieldTowerFiniteGaloisSubextension K L) + x) := + numberFieldTowerAbstractNormResidueGaloisEquiv_apply K L x + _ = + numberFieldTowerAbelianizedExtensionQuotientEquivGaloisGroup K L + (Additive.ofMul (Abelianization.of q)) := + congrArg + (numberFieldTowerAbelianizedExtensionQuotientEquivGaloisGroup K L) + (rationalCyclotomicDegreeData.normResidueSymbol_finiteReciprocityHom + rationalIdeleClassRepresentation + cyclotomicValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldTowerReciprocityFiniteAbstractField K L) + (numberFieldTowerFiniteGaloisSubextension K L) q) + _ = _ := + numberFieldTowerAbelianizedExtensionQuotientEquivGaloisGroup_of K L q + +/-- The inverse global reciprocity equivalence + +`Gal(L / K) ≃ C_K / N_{L/K} C_L`. -/ +noncomputable def globalReciprocityEquiv : + Additive (Gal(L/K)) ≃+ + Additive + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + (globalNormResidueEquiv K L).symm + +/-- The actual global norm-residue homomorphism on the idele class +group, obtained by composing the genuine quotient map with the global +norm-residue equivalence. -/ +noncomputable def globalNormResidueMonoidHom : + IdeleClassGroup K →* Gal(L/K) := by + let e : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≃* + Gal(L/K) := + AddEquiv.toMultiplicative (globalNormResidueEquiv K L) + exact + e.toMonoidHom.comp + (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range) + +/-- Evaluation of the actual global norm-residue homomorphism is the +global norm-residue equivalence applied to the genuine norm quotient +class. -/ +@[simp] +theorem globalNormResidueMonoidHom_apply + (c : IdeleClassGroup K) : + globalNormResidueMonoidHom K L c = + Additive.toMul + (globalNormResidueEquiv K L + (Additive.ofMul + (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range c))) := + rfl + +open ClassFormation.ValuationData renaming + normResidueSymbol_finiteNormClass_eq_maximalUnramifiedRestriction → + normResidueSymbol_finiteNormClass_eq_maximalUnramifiedRestriction in +/-- For a finite extension whose compatible abstract realization is +unramified for the cyclotomic degree datum, the actual global +norm-residue symbol is the finite restriction of the +maximal-unramified valuation symbol. -/ +theorem globalNormResidueMonoidHom_eq_maximalUnramifiedRestriction + (hUnramified : + (numberFieldTowerFiniteGaloisSubextension K L).IsUnramified + rationalCyclotomicDegreeData) + (c : IdeleClassGroup K) : + globalNormResidueMonoidHom K L c = + numberFieldTowerExtensionQuotientEquivGaloisGroup K L + (DegreeData.finiteUnramifiedRestriction + rationalCyclotomicDegreeData + (ClassFormation.FiniteAbstractField.toFiniteResidueAbstractField + (numberFieldTowerReciprocityFiniteAbstractField K L) + rationalCyclotomicDegreeData) + (numberFieldTowerFiniteGaloisSubextension K L) + hUnramified + (ClassFormation.ValuationData.maximalUnramifiedNormResidueSymbol + rationalCyclotomicIdeleClassValuationData + (numberFieldTowerReciprocityFiniteAbstractField K L) + (numberFieldTowerIdeleClassEquivAmbientFixed K L + (Additive.ofMul c))).toMul) := by + let H := + numberFieldTowerReciprocityFiniteAbstractField K L + let E := + numberFieldTowerFiniteGaloisSubextension K L + let a : ambientFixedAddSubgroup rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) := + numberFieldTowerIdeleClassEquivAmbientFixed K L + (Additive.ofMul c) + let x : FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) := + finiteNormClass rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) a + let q : E.extensionQuotient := + DegreeData.finiteUnramifiedRestriction + rationalCyclotomicDegreeData + (ClassFormation.FiniteAbstractField.toFiniteResidueAbstractField + H rationalCyclotomicDegreeData) + E hUnramified + (ClassFormation.ValuationData.maximalUnramifiedNormResidueSymbol + rationalCyclotomicIdeleClassValuationData H a).toMul + have hclass := + numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient_ideleClass + K L c + rw [globalNormResidueMonoidHom_apply, ← hclass] + calc + _ = Additive.toMul + (numberFieldTowerAbstractNormResidueGaloisEquiv K L x) := + congrArg Additive.toMul + (globalNormResidueEquiv_transport_apply K L x) + _ = Additive.toMul + (numberFieldTowerAbelianizedExtensionQuotientEquivGaloisGroup K L + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + H E x)) := + congrArg Additive.toMul + (numberFieldTowerAbstractNormResidueGaloisEquiv_apply K L x) + _ = + Additive.toMul + (numberFieldTowerAbelianizedExtensionQuotientEquivGaloisGroup K L + (Additive.ofMul (Abelianization.of q))) := + congrArg + (fun z => + Additive.toMul + (numberFieldTowerAbelianizedExtensionQuotientEquivGaloisGroup + K L z)) + (normResidueSymbol_finiteNormClass_eq_maximalUnramifiedRestriction + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + H E hUnramified a) + _ = _ := by + rw [numberFieldTowerAbelianizedExtensionQuotientEquivGaloisGroup_of] + exact toMul_ofMul _ + +/-- An idele class has trivial global norm-residue symbol exactly when +it is an actual idele-class norm from `L`. -/ +theorem globalNormResidueMonoidHom_eq_one_iff + (c : IdeleClassGroup K) : + globalNormResidueMonoidHom K L c = 1 ↔ + c ∈ (_root_.ideleClassNorm K L).range := by + let e : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≃* + Gal(L/K) := + AddEquiv.toMultiplicative (globalNormResidueEquiv K L) + change + e (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range c) = + 1 ↔ + c ∈ (_root_.ideleClassNorm K L).range + constructor + · intro h + have hq : + QuotientGroup.mk' + (_root_.ideleClassNorm K L).range c = + 1 := by + apply e.injective + exact h.trans (map_one e).symm + exact (QuotientGroup.eq_one_iff c).1 hq + · intro hc + have hq : + QuotientGroup.mk' + (_root_.ideleClassNorm K L).range c = + 1 := + (QuotientGroup.eq_one_iff c).2 hc + calc + e (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range c) = e 1 := + congrArg e hq + _ = 1 := map_one e + +/-- The actual global norm-residue homomorphism is surjective. -/ +theorem globalNormResidueMonoidHom_surjective : + Function.Surjective + (globalNormResidueMonoidHom K L) := by + change + Function.Surjective + ((AddEquiv.toMultiplicative + (globalNormResidueEquiv K L)).toMonoidHom.comp + (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range)) + exact + (AddEquiv.toMultiplicative + (globalNormResidueEquiv K L)).surjective.comp + (QuotientGroup.mk'_surjective + (_root_.ideleClassNorm K L).range) + +/-- The index of the actual idele-class norm subgroup of a finite +abelian extension is its field degree. -/ +theorem ideleClassNorm_index_eq_finrank_abelian : + (_root_.ideleClassNorm K L).range.index = + Module.finrank K L := by + rw [Subgroup.index_eq_card] + calc + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) = + Nat.card + (Additive + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range)) := + (Nat.card_congr Additive.toMul).symm + _ = Nat.card (Additive (Gal(L/K))) := + Nat.card_congr (globalNormResidueEquiv K L).toEquiv + _ = Nat.card (Gal(L/K)) := + Nat.card_congr Additive.toMul + _ = Module.finrank K L := + IsGalois.card_aut_eq_finrank K L + +/-- The kernel of the actual global norm-residue homomorphism is +exactly the range of the ordinary idele-class norm. -/ +@[simp] +theorem globalNormResidueMonoidHom_ker : + (globalNormResidueMonoidHom K L).ker = + (_root_.ideleClassNorm K L).range := by + ext c + change + globalNormResidueMonoidHom K L c = 1 ↔ + c ∈ (_root_.ideleClassNorm K L).range + exact globalNormResidueMonoidHom_eq_one_iff K L c + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean new file mode 100644 index 0000000000..76ef8e0850 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean @@ -0,0 +1,766 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +/-! +# The global norm-residue symbol for finite Galois extensions + +For an arbitrary finite Galois extension of number fields, the global +norm-residue quotient is the abelianization of the genuine Galois group: + +`C_K / N_{L/K} C_L ≃ Gal(L / K)ᵃᵇ`. + +The abelian specialization in `GlobalNormResidue` identifies this target +further with `Gal(L / K)`. This file retains the abelianization and therefore +states global reciprocity at its full finite-Galois generality. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open KummerTheory + +variable + (K L : Type) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- Idèle classes are commutative. Keeping the mixin as a named local +instance lets norm-range quotient types elaborate before entering a +declaration body. -/ +local instance + globalNormResidueAbelianization_ideleClassGroupIsMulCommutative : + IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +/-- The abelianization of the compatible abstract extension quotient is the +abelianization of the actual Galois group. -/ +noncomputable def + numberFieldTowerAbelianizedExtensionQuotientEquivGaloisAbelianization : + Additive + (Abelianization + (ClassFormation.FiniteGaloisSubextension.extensionQuotient + (numberFieldTowerFiniteGaloisSubextension K L))) ≃+ + Additive (Abelianization (Gal(L/K))) := + MulEquiv.toAdditive + (MulEquiv.abelianizationCongr + (numberFieldTowerExtensionQuotientEquivGaloisGroup K L)) + +private theorem numberFieldTowerAbelianizationCongr_of + (q : + ClassFormation.FiniteGaloisSubextension.extensionQuotient + (numberFieldTowerFiniteGaloisSubextension K L)) : + MulEquiv.abelianizationCongr + (numberFieldTowerExtensionQuotientEquivGaloisGroup K L) + (Abelianization.of q) = + Abelianization.of + (numberFieldTowerExtensionQuotientEquivGaloisGroup K L q) := + abelianizationCongr_of + (numberFieldTowerExtensionQuotientEquivGaloisGroup K L) q + +/-- The comparison on abelianizations sends the class of an abstract +automorphism to the class of its actual restriction to `L`. -/ +@[simp] +theorem + numberFieldTowerAbelianizedExtensionQuotientEquivGaloisAbelianization_of + (q : + ClassFormation.FiniteGaloisSubextension.extensionQuotient + (numberFieldTowerFiniteGaloisSubextension K L)) : + numberFieldTowerAbelianizedExtensionQuotientEquivGaloisAbelianization + K L (Additive.ofMul (Abelianization.of q)) = + Additive.ofMul + (Abelianization.of + (numberFieldTowerExtensionQuotientEquivGaloisGroup K L q)) := by + exact + congrArg Additive.ofMul + (numberFieldTowerAbelianizationCongr_of K L q) + +/-- The abstract norm-residue symbol followed by the concrete Galois +comparison. This declaration boundary keeps the dependent quotient indices +and their instance packages from being reconstructed at each evaluation. -/ +private noncomputable def + numberFieldTowerAbstractNormResidueGaloisAbelianizationEquiv : + FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) ≃+ + Additive (Abelianization (Gal(L/K))) := by + let _ : Finite _ := + (numberFieldTowerReciprocityFiniteAbstractField K L).finite + let _ : + (CyclicCohomology.extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)).Normal := + numberFieldTowerExtensionSubgroup_normal K L + let _ : Finite _ := + (numberFieldTowerFiniteGaloisSubextension K L).finite + letI : AddCommGroup + (FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) := + finiteNormQuotientAddCommGroup rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) + exact + @AddEquiv.trans + (FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) + (Additive + (Abelianization + (ClassFormation.FiniteGaloisSubextension.extensionQuotient + (numberFieldTowerFiniteGaloisSubextension K L)))) + (Additive (Abelianization (Gal(L/K)))) + inferInstance inferInstance inferInstance + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldTowerReciprocityFiniteAbstractField K L) + (numberFieldTowerFiniteGaloisSubextension K L)) + (numberFieldTowerAbelianizedExtensionQuotientEquivGaloisAbelianization + K L) + +/-- The actual global norm-residue equivalence for a finite Galois +number-field extension: + +`C_K / N_{L/K} C_L ≃ Gal(L / K)ᵃᵇ`. -/ +noncomputable def globalNormResidueAbelianizationEquiv : + Additive + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≃+ + Additive (Abelianization (Gal(L/K))) := by + exact + (numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient + K L).symm.trans + (numberFieldTowerAbstractNormResidueGaloisAbelianizationEquiv K L) + +private theorem + numberFieldTowerAbstractNormResidueGaloisAbelianizationEquiv_apply + (x : + FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) : + letI := + (numberFieldTowerReciprocityFiniteAbstractField K L).finite + letI := + numberFieldTowerExtensionSubgroup_normal K L + letI := + (numberFieldTowerFiniteGaloisSubextension K L).finite + numberFieldTowerAbstractNormResidueGaloisAbelianizationEquiv K L x = + numberFieldTowerAbelianizedExtensionQuotientEquivGaloisAbelianization + K L + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldTowerReciprocityFiniteAbstractField K L) + (numberFieldTowerFiniteGaloisSubextension K L) x) := by + let hBaseFinite := + (numberFieldTowerReciprocityFiniteAbstractField K L).finite + let hExtensionNormal := + numberFieldTowerExtensionSubgroup_normal K L + let hRelativeFinite := + (numberFieldTowerFiniteGaloisSubextension K L).finite + rfl + +private theorem globalNormResidueAbelianizationEquiv_transport_apply + (x : + FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) : + globalNormResidueAbelianizationEquiv K L + (numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient + K L x) = + numberFieldTowerAbstractNormResidueGaloisAbelianizationEquiv K L x := by + simp only [globalNormResidueAbelianizationEquiv, AddEquiv.trans_apply, + AddEquiv.symm_apply_apply] + +/-- The abelianized global norm-residue equivalence on a finite norm class. -/ +theorem globalNormResidueAbelianizationEquiv_finiteNormClass + (x : FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) : + letI := (numberFieldTowerReciprocityFiniteAbstractField K L).finite + letI := numberFieldTowerExtensionSubgroup_normal K L + letI := (numberFieldTowerFiniteGaloisSubextension K L).finite + globalNormResidueAbelianizationEquiv K L + (numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient + K L x) = + numberFieldTowerAbelianizedExtensionQuotientEquivGaloisAbelianization + K L + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldTowerReciprocityFiniteAbstractField K L) + (numberFieldTowerFiniteGaloisSubextension K L) x) := by + exact (globalNormResidueAbelianizationEquiv_transport_apply K L x).trans + (numberFieldTowerAbstractNormResidueGaloisAbelianizationEquiv_apply K L x) + +open _root_.GlobalClassFieldTheory.Reciprocity renaming + rationalCyclotomicIdeleClassValuationData → cyclotomicValuationData in + +/-- On the genuine finite-reciprocity class of an abstract extension +automorphism, the finite-Galois norm-residue equivalence gives the class of +the corresponding actual automorphism in the Galois abelianization. -/ +@[simp] +theorem globalNormResidueAbelianizationEquiv_finiteReciprocityHom + (q : + ClassFormation.FiniteGaloisSubextension.extensionQuotient + (numberFieldTowerFiniteGaloisSubextension K L)) : + letI := + (numberFieldTowerReciprocityFiniteAbstractField K L).finite + letI := + numberFieldTowerExtensionSubgroup_normal K L + letI := + (numberFieldTowerFiniteGaloisSubextension K L).finite + globalNormResidueAbelianizationEquiv K L + (numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient + K L + (rationalCyclotomicDegreeData.finiteReciprocityHom + rationalIdeleClassRepresentation + cyclotomicValuationData + (cyclotomicValuationData.classFieldAxiom_implies_unramifiedUnitCohomology + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom) + (numberFieldTowerReciprocityFiniteAbstractField K L) + (numberFieldTowerFiniteGaloisSubextension K L).field + (numberFieldTowerFiniteGaloisSubextension K L).below + (hLnormal := + (numberFieldTowerFiniteGaloisSubextension K L).normal) + (hLfinite := + (numberFieldTowerFiniteGaloisSubextension K L).finite) + (Additive.ofMul q))) = + Additive.ofMul + (Abelianization.of + (numberFieldTowerExtensionQuotientEquivGaloisGroup K L q)) := by + let hBaseFinite := + (numberFieldTowerReciprocityFiniteAbstractField K L).finite + let hExtensionNormal := + numberFieldTowerExtensionSubgroup_normal K L + let hRelativeFinite := + (numberFieldTowerFiniteGaloisSubextension K L).finite + let x := + rationalCyclotomicDegreeData.finiteReciprocityHom + rationalIdeleClassRepresentation + cyclotomicValuationData + (cyclotomicValuationData.classFieldAxiom_implies_unramifiedUnitCohomology + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom) + (numberFieldTowerReciprocityFiniteAbstractField K L) + (numberFieldTowerFiniteGaloisSubextension K L).field + (numberFieldTowerFiniteGaloisSubextension K L).below + (hLnormal := + (numberFieldTowerFiniteGaloisSubextension K L).normal) + (hLfinite := + (numberFieldTowerFiniteGaloisSubextension K L).finite) + (Additive.ofMul q) + have hxNorm : + rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + cyclotomicValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldTowerReciprocityFiniteAbstractField K L) + (numberFieldTowerFiniteGaloisSubextension K L) x = + Additive.ofMul (Abelianization.of q) := + rationalCyclotomicDegreeData.normResidueSymbol_finiteReciprocityHom + rationalIdeleClassRepresentation + cyclotomicValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldTowerReciprocityFiniteAbstractField K L) + (numberFieldTowerFiniteGaloisSubextension K L) q + exact + (globalNormResidueAbelianizationEquiv_transport_apply K L x).trans + ((numberFieldTowerAbstractNormResidueGaloisAbelianizationEquiv_apply + K L x).trans + ((congrArg + (numberFieldTowerAbelianizedExtensionQuotientEquivGaloisAbelianization + K L) + hxNorm).trans + (numberFieldTowerAbelianizedExtensionQuotientEquivGaloisAbelianization_of + K L q))) + +/-- The inverse global reciprocity equivalence for an arbitrary finite Galois +extension. -/ +noncomputable def globalReciprocityAbelianizationEquiv : + Additive (Abelianization (Gal(L/K))) ≃+ + Additive + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + (globalNormResidueAbelianizationEquiv K L).symm + +/-- The genuine global norm-residue homomorphism with target the +abelianization of the actual Galois group. -/ +noncomputable def globalNormResidueAbelianizationMonoidHom : + IdeleClassGroup K →* + Abelianization (Gal(L/K)) := by + let e : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≃* + Abelianization (Gal(L/K)) := + AddEquiv.toMultiplicative + (globalNormResidueAbelianizationEquiv K L) + exact + e.toMonoidHom.comp + (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range) + +/-- Evaluation of the finite-Galois global norm-residue homomorphism is the +global equivalence applied to the genuine norm quotient class. -/ +@[simp] +theorem globalNormResidueAbelianizationMonoidHom_apply + (c : IdeleClassGroup K) : + globalNormResidueAbelianizationMonoidHom K L c = + Additive.toMul + (globalNormResidueAbelianizationEquiv K L + (Additive.ofMul + (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range c))) := + rfl + +/-- Evaluate the finite-Galois symbol on the norm class of an idèle class. -/ +theorem globalNormResidueAbelianizationMonoidHom_finiteNormClass + (c : IdeleClassGroup K) : + letI := (numberFieldTowerReciprocityFiniteAbstractField K L).finite + letI := numberFieldTowerExtensionSubgroup_normal K L + letI := (numberFieldTowerFiniteGaloisSubextension K L).finite + globalNormResidueAbelianizationMonoidHom K L c = + Additive.toMul + (numberFieldTowerAbelianizedExtensionQuotientEquivGaloisAbelianization + K L + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldTowerReciprocityFiniteAbstractField K L) + (numberFieldTowerFiniteGaloisSubextension K L) + (finiteNormClass rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) + (numberFieldTowerIdeleClassEquivAmbientFixed K L + (Additive.ofMul c))))) := by + let x : FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) := + finiteNormClass rationalIdeleClassRepresentation + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) + (numberFieldTowerIdeleClassEquivAmbientFixed K L (Additive.ofMul c)) + have hclass := + numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient_ideleClass + K L c + calc + _ = Additive.toMul + (globalNormResidueAbelianizationEquiv K L + (Additive.ofMul + (QuotientGroup.mk' (_root_.ideleClassNorm K L).range c))) := + globalNormResidueAbelianizationMonoidHom_apply K L c + _ = Additive.toMul + (globalNormResidueAbelianizationEquiv K L + (numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient + K L x)) := + congrArg (fun q => Additive.toMul + (globalNormResidueAbelianizationEquiv K L q)) hclass.symm + _ = _ := congrArg Additive.toMul + (globalNormResidueAbelianizationEquiv_finiteNormClass K L x) + +/-- An idele class has trivial finite-Galois norm-residue symbol exactly when +it is an actual idele-class norm from `L`. -/ +theorem globalNormResidueAbelianizationMonoidHom_eq_one_iff + (c : IdeleClassGroup K) : + globalNormResidueAbelianizationMonoidHom K L c = 1 ↔ + c ∈ (_root_.ideleClassNorm K L).range := by + let e := + AddEquiv.toMultiplicative + (globalNormResidueAbelianizationEquiv K L) + change + e (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range c) = + 1 ↔ + c ∈ (_root_.ideleClassNorm K L).range + constructor + · intro h + have hq : + QuotientGroup.mk' + (_root_.ideleClassNorm K L).range c = + 1 := by + apply + e.injective + exact h.trans (map_one e).symm + exact (QuotientGroup.eq_one_iff c).1 hq + · intro hc + have hq : + QuotientGroup.mk' + (_root_.ideleClassNorm K L).range c = + 1 := + (QuotientGroup.eq_one_iff c).2 hc + exact + (congrArg e hq).trans + (map_one e) + +/-- The finite-Galois global norm-residue homomorphism is surjective onto the +actual Galois abelianization. -/ +theorem globalNormResidueAbelianizationMonoidHom_surjective : + Function.Surjective + (globalNormResidueAbelianizationMonoidHom K L) := by + let e : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≃* + Abelianization (Gal(L/K)) := + AddEquiv.toMultiplicative + (globalNormResidueAbelianizationEquiv K L) + intro y + obtain ⟨q, hq⟩ := e.surjective y + obtain ⟨c, hc⟩ := + QuotientGroup.mk'_surjective + (_root_.ideleClassNorm K L).range q + refine ⟨c, ?_⟩ + calc + globalNormResidueAbelianizationMonoidHom K L c = + Additive.toMul + (globalNormResidueAbelianizationEquiv K L + (Additive.ofMul + (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range c))) := + globalNormResidueAbelianizationMonoidHom_apply K L c + _ = e q := congrArg e hc + _ = y := hq + +/-- The finite-Galois global norm-residue symbol viewed on the idele group. + +This is the genuine idele-class symbol pulled back along +`I_K → C_K`; in particular it is not a separately chosen map. -/ +noncomputable def globalNormResidueAbelianizationIdeleMonoidHom : + IdeleGroup K →* + Abelianization (Gal(L/K)) := + (globalNormResidueAbelianizationMonoidHom K L).comp + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K)) + +/-- Evaluation of the finite-Galois norm-residue symbol on an idele is +evaluation of the class symbol on its genuine idele class. -/ +@[simp] +theorem globalNormResidueAbelianizationIdeleMonoidHom_apply + (a : IdeleGroup K) : + globalNormResidueAbelianizationIdeleMonoidHom K L a = + globalNormResidueAbelianizationMonoidHom K L + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) := + rfl + +/-- The finite-Galois norm-residue symbol on ideles is trivial on every +principal idele. -/ +theorem globalNormResidueAbelianizationIdeleMonoidHom_principalIdele + (x : Kˣ) : + globalNormResidueAbelianizationIdeleMonoidHom K L + (IdeleGroup.principalIdele K x) = + 1 := by + have hclass : + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (IdeleGroup.principalIdele K x) = + 1 := + (QuotientGroup.eq_one_iff + (IdeleGroup.principalIdele K x)).2 + ⟨x, rfl⟩ + calc + globalNormResidueAbelianizationIdeleMonoidHom K L + (IdeleGroup.principalIdele K x) = + globalNormResidueAbelianizationMonoidHom K L + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (IdeleGroup.principalIdele K x)) := + globalNormResidueAbelianizationIdeleMonoidHom_apply K L _ + _ = globalNormResidueAbelianizationMonoidHom K L 1 := + congrArg + (globalNormResidueAbelianizationMonoidHom K L) + hclass + _ = 1 := map_one _ + +/-- The finite-Galois norm-residue symbol remains surjective when viewed +on ideles. -/ +theorem globalNormResidueAbelianizationIdeleMonoidHom_surjective : + Function.Surjective + (globalNormResidueAbelianizationIdeleMonoidHom K L) := + (globalNormResidueAbelianizationMonoidHom_surjective K L).comp + (QuotientGroup.mk'_surjective + (IdeleGroup.principalSubgroup K)) + +/-- An idele has trivial finite-Galois norm-residue symbol exactly when +its idele class is an actual norm from `L`. -/ +theorem globalNormResidueAbelianizationIdeleMonoidHom_eq_one_iff + (a : IdeleGroup K) : + globalNormResidueAbelianizationIdeleMonoidHom K L a = 1 ↔ + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a ∈ + (_root_.ideleClassNorm K L).range := by + simpa only [ + globalNormResidueAbelianizationIdeleMonoidHom_apply] using + globalNormResidueAbelianizationMonoidHom_eq_one_iff K L + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) + +/-- The kernel of the idele-level finite-Galois norm-residue symbol is the +full inverse image of the genuine idele-class norm range. -/ +@[simp] +theorem globalNormResidueAbelianizationIdeleMonoidHom_ker : + (globalNormResidueAbelianizationIdeleMonoidHom K L).ker = + (_root_.ideleClassNorm K L).range.comap + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K)) := by + ext a + change + globalNormResidueAbelianizationIdeleMonoidHom K L a = 1 ↔ + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a ∈ + (_root_.ideleClassNorm K L).range + exact + globalNormResidueAbelianizationIdeleMonoidHom_eq_one_iff + K L a + +/-- The kernel of the finite-Galois norm-residue homomorphism is exactly the +range of the ordinary idele-class norm. -/ +@[simp] +theorem globalNormResidueAbelianizationMonoidHom_ker : + (globalNormResidueAbelianizationMonoidHom K L).ker = + (_root_.ideleClassNorm K L).range := by + ext c + change + globalNormResidueAbelianizationMonoidHom K L c = 1 ↔ + c ∈ (_root_.ideleClassNorm K L).range + exact + globalNormResidueAbelianizationMonoidHom_eq_one_iff + K L c + +/-- The index of the actual norm subgroup is the order of the +abelianization of the genuine finite Galois group. -/ +theorem ideleClassNorm_index_eq_galoisAbelianization_card : + (_root_.ideleClassNorm K L).range.index = + Nat.card (Abelianization (Gal(L/K))) := by + calc + (_root_.ideleClassNorm K L).range.index = + Nat.card + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + Subgroup.index_eq_card + ((_root_.ideleClassNorm K L).range) + _ = + Nat.card + (Additive + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range)) := + (Nat.card_congr Additive.toMul).symm + _ = + Nat.card + (Additive + (Abelianization (Gal(L/K)))) := + Nat.card_congr + (globalNormResidueAbelianizationEquiv K L).toEquiv + _ = + Nat.card + (Abelianization (Gal(L/K))) := + Nat.card_congr Additive.toMul + +section AbelianSpecialization + +variable + (F E : Type) [Field F] [NumberField F] + [Field E] [NumberField E] [Algebra F E] + [FiniteDimensional F E] [IsAbelianGalois F E] + +open _root_.GlobalClassFieldTheory.Reciprocity renaming + rationalCyclotomicIdeleClassValuationData → cyclotomicValuationData in + +private theorem + globalNormResidueAbelianizationEquiv_abelianSpecialization_apply + (q : + Additive + (IdeleClassGroup F ⧸ + (_root_.ideleClassNorm F E).range)) : + MulEquiv.toAdditive + (Abelianization.equivOfComm : + Gal(E/F) ≃* + Abelianization (Gal(E/F))).symm + (globalNormResidueAbelianizationEquiv F E q) = + globalNormResidueEquiv F E q := by + let H := + numberFieldTowerReciprocityFiniteAbstractField F E + let T := + numberFieldTowerFiniteGaloisSubextension F E + let hBaseFinite := H.finite + let hExtensionNormal := + numberFieldTowerExtensionSubgroup_normal F E + let hRelativeFinite := T.finite + let hUnramified := + cyclotomicValuationData.classFieldAxiom_implies_unramifiedUnitCohomology + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + let r := + rationalCyclotomicDegreeData.finiteReciprocityHom + rationalIdeleClassRepresentation + cyclotomicValuationData + hUnramified H T.field T.below + (hLnormal := T.normal) + (hLfinite := T.finite) + let n := + numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient F E + let canonical : + Gal(E/F) ≃* + Abelianization (Gal(E/F)) := + Abelianization.equivOfComm + have hr : Function.Surjective r := + cyclotomicValuationData.abstractReciprocity_finiteReciprocityHom_surjective + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + hUnramified H T + obtain ⟨x, rfl⟩ := n.surjective q + obtain ⟨t, rfl⟩ := hr x + have hAbelianized := + globalNormResidueAbelianizationEquiv_finiteReciprocityHom + F E (Additive.toMul t) + have hOrdinary := + globalNormResidueEquiv_finiteReciprocityHom + F E (Additive.toMul t) + calc + MulEquiv.toAdditive canonical.symm + (globalNormResidueAbelianizationEquiv F E (n (r t))) = + MulEquiv.toAdditive canonical.symm + (Additive.ofMul + (Abelianization.of + (numberFieldTowerExtensionQuotientEquivGaloisGroup + F E (Additive.toMul t)))) := + congrArg (MulEquiv.toAdditive canonical.symm) hAbelianized + _ = + Additive.ofMul + (numberFieldTowerExtensionQuotientEquivGaloisGroup + F E (Additive.toMul t)) := + congrArg Additive.ofMul + (canonical.symm_apply_apply + (numberFieldTowerExtensionQuotientEquivGaloisGroup + F E (Additive.toMul t))) + _ = globalNormResidueEquiv F E (n (r t)) := + hOrdinary.symm + +/-- For an abelian extension, composing the finite-Galois equivalence with +the canonical equivalence from the Galois abelianization recovers the usual +global norm-residue equivalence. -/ +theorem globalNormResidueAbelianizationEquiv_abelianSpecialization : + (globalNormResidueAbelianizationEquiv F E).trans + (MulEquiv.toAdditive + (Abelianization.equivOfComm : + Gal(E/F) ≃* + Abelianization (Gal(E/F))).symm) = + globalNormResidueEquiv F E := by + apply AddEquiv.ext + intro q + exact + globalNormResidueAbelianizationEquiv_abelianSpecialization_apply + F E q + +/-- In the canonical direction used by the global reciprocity isomorphism, +the finite-Galois construction likewise specializes to the ordinary +abelian reciprocity equivalence. -/ +theorem globalReciprocityAbelianizationEquiv_abelianSpecialization : + (MulEquiv.toAdditive + (Abelianization.equivOfComm : + Gal(E/F) ≃* + Abelianization (Gal(E/F)))).trans + (globalReciprocityAbelianizationEquiv F E) = + globalReciprocityEquiv F E := by + change + ((globalNormResidueAbelianizationEquiv F E).trans + (MulEquiv.toAdditive + (Abelianization.equivOfComm : + Gal(E/F) ≃* + Abelianization (Gal(E/F))).symm)).symm = + (globalNormResidueEquiv F E).symm + exact + congrArg AddEquiv.symm + (globalNormResidueAbelianizationEquiv_abelianSpecialization F E) + +private theorem + globalNormResidueAbelianizationMonoidHom_abelianSpecialization_apply + (c : IdeleClassGroup F) : + (Abelianization.equivOfComm : + Gal(E/F) ≃* + Abelianization (Gal(E/F))).symm + (globalNormResidueAbelianizationMonoidHom F E c) = + globalNormResidueMonoidHom F E c := by + simpa only [ + globalNormResidueAbelianizationMonoidHom_apply, + globalNormResidueMonoidHom_apply, + MulEquiv.toAdditive_apply_apply, + MonoidHom.toAdditive_apply_apply, + MulEquiv.coe_toMonoidHom, + toMul_ofMul] using + congrArg Additive.toMul + (globalNormResidueAbelianizationEquiv_abelianSpecialization_apply + F E + (Additive.ofMul + (QuotientGroup.mk' + (_root_.ideleClassNorm F E).range c))) + +/-- The finite-Galois norm-residue homomorphism specializes to the ordinary +abelian global Artin homomorphism after the canonical target +identification. -/ +theorem + globalNormResidueAbelianizationMonoidHom_abelianSpecialization : + (Abelianization.equivOfComm : + Gal(E/F) ≃* + Abelianization (Gal(E/F))).symm.toMonoidHom.comp + (globalNormResidueAbelianizationMonoidHom F E) = + globalNormResidueMonoidHom F E := by + apply MonoidHom.ext + intro c + exact + globalNormResidueAbelianizationMonoidHom_abelianSpecialization_apply + F E c + +/-- The idele-level finite-Galois symbol has the same abelian +specialization, after pulling both class symbols back along +`I_F → C_F`. -/ +theorem + globalNormResidueAbelianizationIdeleMonoidHom_abelianSpecialization : + (Abelianization.equivOfComm : + Gal(E/F) ≃* + Abelianization (Gal(E/F))).symm.toMonoidHom.comp + (globalNormResidueAbelianizationIdeleMonoidHom F E) = + (globalNormResidueMonoidHom F E).comp + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup F)) := by + apply MonoidHom.ext + intro a + simpa only [ + MonoidHom.comp_apply, + MulEquiv.coe_toMonoidHom, + globalNormResidueAbelianizationIdeleMonoidHom_apply] using + globalNormResidueAbelianizationMonoidHom_abelianSpecialization_apply + F E + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup F) a) + +end AbelianSpecialization + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianizationNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianizationNaturality.lean new file mode 100644 index 0000000000..71ddefeba4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianizationNaturality.lean @@ -0,0 +1,862 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormProof +/-! +# Naturality of finite-Galois global reciprocity in abelianizations + +For a finite tower `K ⊆ M ⊆ N` with `N / K` Galois, this file proves +that ordinary idèle-class norm from `M` to `K` corresponds to restriction +from `Gal(N / M)` to `Gal(N / K)`, after passing both Galois groups to their +abelianizations. The intermediate extension `M / K` is not assumed Galois. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open AlgebraicNumberTheory +open LocalClassFieldTheory +open KummerTheory +open CyclicCohomology + +private theorem abelianizationNaturalityIdeleClassIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] abelianizationNaturalityIdeleClassIsMulCommutative + +/-- Transport by an equality-induced field equivalence leaves the underlying +rational direct-limit idèle class unchanged. -/ +private theorem rationalIdeleClassEquivFixed_congr_apply_val + {A B : IntermediateField ℚ (SeparableClosure ℚ)} + [FiniteDimensional ℚ A] [FiniteDimensional ℚ B] + (h : A = B) + (e : B ≃ₐ[ℚ] A) + (he : e.trans (IntermediateField.equivOfEq h) = + (AlgEquiv.refl : B ≃ₐ[ℚ] B)) + (c : Additive (IdeleClassGroup B)) : + ((rationalIdeleClassEquivFixed A) + (MulEquiv.toAdditive (ideleClassCongr e) c)).1 = + ((rationalIdeleClassEquivFixed B) c).1 := by + cases h + have he' : e = AlgEquiv.refl := by + apply AlgEquiv.ext + intro x + have hx := DFunLike.congr_fun he x + change e x = x at hx + exact hx + rw [he'] + have hc : + MulEquiv.toAdditive + (ideleClassCongr (AlgEquiv.refl : A ≃ₐ[ℚ] A)) c = c := by + cases c with + | ofMul c => + exact congrArg Additive.ofMul (ideleClassCongr_refl c) + rw [hc] + +private theorem rationalIdeleClassEquivFixed_transport_commonTop_val + {T : Type} [Field T] [NumberField T] + {A B : IntermediateField ℚ (SeparableClosure ℚ)} + [hA : FiniteDimensional ℚ A] [hB : FiniteDimensional ℚ B] + (h : A = B) (e : T ≃ₐ[ℚ] B) (c : IdeleClassGroup T) : + ((rationalIdeleClassEquivFixed A) + (Additive.ofMul (ideleClassCongr (K := T) (M := A) + (e.trans (IntermediateField.equivOfEq h).symm) c))).1 = + ((rationalIdeleClassEquivFixed B) + (Additive.ofMul (ideleClassCongr (K := T) (M := B) e c))).1 := by + cases h + have he : e.trans (IntermediateField.equivOfEq (rfl : A = A)).symm = e := by + ext x + rfl + rw [he] + +section CommonTop + +variable + (K M N : Type) + [Field K] [NumberField K] + [Field M] [NumberField M] + [Field N] [NumberField N] + [Algebra K M] [Algebra M N] [Algebra K N] + [IsScalarTower K M N] + +omit [NumberField M] [NumberField N] in +private theorem + commonTopBaseIntermediateFiniteDimensional + [FiniteDimensional K N] : FiniteDimensional K M := + FiniteDimensional.left K M N + +omit [NumberField K] [NumberField M] [NumberField N] in +private theorem + commonTopIntermediateTopFiniteDimensional + [FiniteDimensional K N] : FiniteDimensional M N := + FiniteDimensional.right K M N + +omit [NumberField K] [NumberField M] [NumberField N] in +private theorem + commonTopIntermediateTopIsGalois + [IsGalois K N] : IsGalois M N := + IsGalois.tower_top_of_isGalois K M N + +/-- The two base fixing subgroups obtained from one embedding of the common +top field are nested in the direction dictated by `K ⊆ M`. -/ +private theorem numberFieldEmbeddedBaseSubgroup_le_of_commonTop + (j : N →ₐ[ℚ] SeparableClosure ℚ) : + (numberFieldEmbeddedBaseSubgroup M N j).toSubgroup ≤ + (numberFieldEmbeddedBaseSubgroup K N j).toSubgroup := by + change + (numberFieldEmbeddedLowerEmbedding M N j).fieldRange.fixingSubgroup ≤ + (numberFieldEmbeddedLowerEmbedding K N j).fieldRange.fixingSubgroup + apply + (numberFieldEmbeddedLowerEmbedding K N j).fieldRange.fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + refine ⟨algebraMap K M y, ?_⟩ + change + j (algebraMap M N (algebraMap K M y)) = + j (algebraMap K N y) + rw [IsScalarTower.algebraMap_apply K M N] + +/-- In a common finite Galois overfield, the quotient between the two base +fixing subgroups is finite even when the intermediate extension is not +Galois. -/ +private theorem + numberFieldEmbeddedBaseChangeExtensionQuotient_finite_of_commonTop + [FiniteDimensional K N] [IsGalois K N] + (j : N →ₐ[ℚ] SeparableClosure ℚ) : + let H := numberFieldEmbeddedBaseSubgroup K N j + let H' := numberFieldEmbeddedBaseSubgroup M N j + let hH'H := numberFieldEmbeddedBaseSubgroup_le_of_commonTop K M N j + Finite + (H.toSubgroup ⧸ + extensionSubgroup H H' hH'H) := by + dsimp only + let H := numberFieldEmbeddedBaseSubgroup K N j + let H' := numberFieldEmbeddedBaseSubgroup M N j + let J := numberFieldEmbeddedTopSubgroup K N j + let hJH := numberFieldEmbeddedTopSubgroup_le_baseSubgroup K N j + let hJH' : J.toSubgroup ≤ H'.toSubgroup := + numberFieldEmbeddedTopSubgroup_le_baseSubgroup M N j + let hH'H := numberFieldEmbeddedBaseSubgroup_le_of_commonTop K M N j + let lower := extensionSubgroup H J hJH + let intermediate := extensionSubgroup H H' hH'H + have hle : lower ≤ intermediate := by + intro sigma hsigma + rw [mem_extensionSubgroup_iff] at hsigma ⊢ + exact hJH' hsigma + let : Finite (H.toSubgroup ⧸ lower) := by + exact numberFieldEmbeddedExtensionQuotient_finite K N j + let : lower.FiniteIndex := + Subgroup.finiteIndex_of_finite_quotient + let : intermediate.FiniteIndex := + Subgroup.finiteIndex_of_le hle + exact Subgroup.finite_quotient_of_finiteIndex + +/-- The abelianized quotient of an explicitly embedded finite Galois tower +is the abelianization of its actual Galois group. -/ +noncomputable def + numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisAbelianization + [FiniteDimensional K N] [IsGalois K N] + (j : N →ₐ[ℚ] SeparableClosure ℚ) : + Additive + (Abelianization + (numberFieldEmbeddedFiniteGaloisSubextension K N j).extensionQuotient) ≃+ + Additive (Abelianization Gal(N/K)) := + MulEquiv.toAdditive + (MulEquiv.abelianizationCongr + (numberFieldEmbeddedExtensionQuotientEquivGaloisGroup K N j)) + +/-- The abstract norm-residue symbol followed by the actual Galois +abelianization comparison, with the public finite norm quotient's additive +structure fixed at this boundary. -/ +private noncomputable def + numberFieldEmbeddedAbstractNormResidueGaloisAbelianizationEquiv + [FiniteDimensional K N] [IsGalois K N] + (j : N →ₐ[ℚ] SeparableClosure ℚ) + [hRelativeFinite : Finite + ((numberFieldEmbeddedBaseSubgroup K N j).toSubgroup ⧸ + extensionSubgroup + (numberFieldEmbeddedBaseSubgroup K N j) + (numberFieldEmbeddedTopSubgroup K N j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K N j))] : + FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K N j) + (numberFieldEmbeddedTopSubgroup K N j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K N j) ≃+ + Additive (Abelianization Gal(N/K)) := by + let _ : Finite _ := + (numberFieldEmbeddedFiniteAbstractField K N j).finite + let _ : + (extensionSubgroup + (numberFieldEmbeddedBaseSubgroup K N j) + (numberFieldEmbeddedTopSubgroup K N j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K N j)).Normal := + numberFieldEmbeddedExtensionSubgroup_normal K N j + letI : AddCommGroup + (FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K N j) + (numberFieldEmbeddedTopSubgroup K N j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K N j)) := + finiteNormQuotientAddCommGroup rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K N j) + (numberFieldEmbeddedTopSubgroup K N j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K N j) + exact + @AddEquiv.trans + (FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K N j) + (numberFieldEmbeddedTopSubgroup K N j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K N j)) + (Additive + (Abelianization + (numberFieldEmbeddedFiniteGaloisSubextension K N j).extensionQuotient)) + (Additive (Abelianization Gal(N/K))) + inferInstance inferInstance inferInstance + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldEmbeddedFiniteAbstractField K N j) + (numberFieldEmbeddedFiniteGaloisSubextension K N j)) + (numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisAbelianization + K N j) + +/-- Evaluation of the typed embedded norm-residue/Galois comparison. -/ +private theorem + numberFieldEmbeddedAbstractNormResidueGaloisAbelianizationEquiv_apply + [FiniteDimensional K N] [IsGalois K N] + (j : N →ₐ[ℚ] SeparableClosure ℚ) + [hRelativeFinite : Finite + ((numberFieldEmbeddedBaseSubgroup K N j).toSubgroup ⧸ + extensionSubgroup + (numberFieldEmbeddedBaseSubgroup K N j) + (numberFieldEmbeddedTopSubgroup K N j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K N j))] + (x : FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K N j) + (numberFieldEmbeddedTopSubgroup K N j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K N j)) : + numberFieldEmbeddedAbstractNormResidueGaloisAbelianizationEquiv K N j x = + numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisAbelianization + K N j + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldEmbeddedFiniteAbstractField K N j) + (numberFieldEmbeddedFiniteGaloisSubextension K N j) x) := by + let hBaseFinite := + (numberFieldEmbeddedFiniteAbstractField K N j).finite + let hExtensionNormal := + numberFieldEmbeddedExtensionSubgroup_normal K N j + rfl + +/-- The finite-Galois norm-residue map built from an explicitly supplied +embedding of the top field, with target the actual Galois abelianization. -/ +noncomputable def globalNormResidueAbelianizationMonoidHomOfEmbedding + [FiniteDimensional K N] [IsGalois K N] + (j : N →ₐ[ℚ] SeparableClosure ℚ) : + IdeleClassGroup K →* Abelianization Gal(N/K) := by + let hRelativeFinite : Finite + ((numberFieldEmbeddedBaseSubgroup K N j).toSubgroup ⧸ + extensionSubgroup + (numberFieldEmbeddedBaseSubgroup K N j) + (numberFieldEmbeddedTopSubgroup K N j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K N j)) := + numberFieldEmbeddedExtensionQuotient_finite K N j + let e : + (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K N).range) ≃* + Abelianization Gal(N/K) := + AddEquiv.toMultiplicative + ((numberFieldEmbeddedFiniteNormQuotientEquivIdeleClassNormQuotient + K N j).symm.trans + (numberFieldEmbeddedAbstractNormResidueGaloisAbelianizationEquiv + K N j (hRelativeFinite := hRelativeFinite))) + exact e.toMonoidHom.comp + (QuotientGroup.mk' (_root_.ideleClassNorm K N).range) + +/-- Evaluation of the explicitly embedded abelianized norm-residue map on +an ordinary idèle class. -/ +@[simp] +theorem globalNormResidueAbelianizationMonoidHomOfEmbedding_apply + [FiniteDimensional K N] [IsGalois K N] + (j : N →ₐ[ℚ] SeparableClosure ℚ) + (c : IdeleClassGroup K) : + letI _ : Finite + ((numberFieldEmbeddedBaseSubgroup K N j).toSubgroup ⧸ + extensionSubgroup + (numberFieldEmbeddedBaseSubgroup K N j) + (numberFieldEmbeddedTopSubgroup K N j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K N j)) := + numberFieldEmbeddedExtensionQuotient_finite K N j + globalNormResidueAbelianizationMonoidHomOfEmbedding K N j c = + Additive.toMul + (numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisAbelianization + K N j + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldEmbeddedFiniteAbstractField K N j) + (numberFieldEmbeddedFiniteGaloisSubextension K N j) + (finiteNormClass rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K N j) + (numberFieldEmbeddedTopSubgroup K N j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K N j) + (numberFieldEmbeddedIdeleClassEquivAmbientFixed + K N j (Additive.ofMul c))))) := by + dsimp only + let hRelativeFinite : Finite + ((numberFieldEmbeddedBaseSubgroup K N j).toSubgroup ⧸ + extensionSubgroup + (numberFieldEmbeddedBaseSubgroup K N j) + (numberFieldEmbeddedTopSubgroup K N j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K N j)) := + numberFieldEmbeddedExtensionQuotient_finite K N j + have hclass := + numberFieldEmbeddedFiniteNormQuotientEquivIdeleClassNormQuotient_ideleClass + K N j c + let x : + FiniteNormQuotient rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K N j) + (numberFieldEmbeddedTopSubgroup K N j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K N j) := + finiteNormClass rationalIdeleClassRepresentation + (numberFieldEmbeddedBaseSubgroup K N j) + (numberFieldEmbeddedTopSubgroup K N j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K N j) + (numberFieldEmbeddedIdeleClassEquivAmbientFixed + K N j (Additive.ofMul c)) + let q : Additive + (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K N).range) := + Additive.ofMul + (QuotientGroup.mk' (_root_.ideleClassNorm K N).range c) + have hclass' : + numberFieldEmbeddedFiniteNormQuotientEquivIdeleClassNormQuotient + K N j x = q := + hclass + have htransport : + (numberFieldEmbeddedFiniteNormQuotientEquivIdeleClassNormQuotient + K N j).symm q = x := by + exact + (congrArg + (numberFieldEmbeddedFiniteNormQuotientEquivIdeleClassNormQuotient + K N j).symm hclass'.symm).trans + ((numberFieldEmbeddedFiniteNormQuotientEquivIdeleClassNormQuotient + K N j).symm_apply_apply x) + calc + globalNormResidueAbelianizationMonoidHomOfEmbedding K N j c = + Additive.toMul + (numberFieldEmbeddedAbstractNormResidueGaloisAbelianizationEquiv + K N j (hRelativeFinite := hRelativeFinite) + ((numberFieldEmbeddedFiniteNormQuotientEquivIdeleClassNormQuotient + K N j).symm q)) := by + rfl + _ = + Additive.toMul + (numberFieldEmbeddedAbstractNormResidueGaloisAbelianizationEquiv + K N j (hRelativeFinite := hRelativeFinite) x) := + congrArg + (fun y => + Additive.toMul + (numberFieldEmbeddedAbstractNormResidueGaloisAbelianizationEquiv + K N j (hRelativeFinite := hRelativeFinite) y)) + htransport + _ = + Additive.toMul + (numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisAbelianization + K N j + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldEmbeddedFiniteAbstractField K N j) + (numberFieldEmbeddedFiniteGaloisSubextension K N j) x)) := by + exact congrArg Additive.toMul + (numberFieldEmbeddedAbstractNormResidueGaloisAbelianizationEquiv_apply + K N j (hRelativeFinite := hRelativeFinite) x) + +/-- The standard finite-Galois norm-residue map is the explicit construction +for the standard chosen embedding of the common top field. -/ +theorem + globalNormResidueAbelianizationMonoidHom_eq_ofEmbedding_standard + [FiniteDimensional K N] [IsGalois K N] : + globalNormResidueAbelianizationMonoidHom K N = + globalNormResidueAbelianizationMonoidHomOfEmbedding K N + (numberFieldSeparableClosureEmbedding N) := by + let j := numberFieldSeparableClosureEmbedding N + have hIdeleClassEquiv : + numberFieldTowerIdeleClassEquivAmbientFixed K N = + numberFieldEmbeddedIdeleClassEquivAmbientFixed K N j := by + exact numberFieldTowerIdeleClassEquivAmbientFixed_eq_embedded_standard K N + have hFiniteAbstractField : + numberFieldTowerReciprocityFiniteAbstractField K N = + numberFieldEmbeddedFiniteAbstractField K N j := by + rfl + have hSubextension : + numberFieldTowerFiniteGaloisSubextension K N = + numberFieldEmbeddedFiniteGaloisSubextension K N j := by + rfl + have hGaloisComparison : + numberFieldTowerAbelianizedExtensionQuotientEquivGaloisAbelianization K N = + numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisAbelianization + K N j := by + rfl + apply MonoidHom.ext + intro c + have hTower := + globalNormResidueAbelianizationMonoidHom_finiteNormClass K N c + have hEmbedded := + globalNormResidueAbelianizationMonoidHomOfEmbedding_apply K N j c + exact hTower.trans + ((show _ = _ by + simp only [← hIdeleClassEquiv, ← hGaloisComparison] + cases hFiniteAbstractField + cases hSubextension + rfl).trans hEmbedded.symm) + +/-- In one common top-field embedding, the abstract relative norm between +the two base fixing subgroups is the ordinary idèle-class norm. No +normality of the intermediate extension `M / K` is used. -/ +theorem + numberFieldEmbeddedIdeleClassEquivAmbientFixed_relativeNorm_of_commonTop + [FiniteDimensional K N] [IsGalois K N] + (j : N →ₐ[ℚ] SeparableClosure ℚ) + (c : IdeleClassGroup M) : + letI _ : FiniteDimensional K M := + commonTopBaseIntermediateFiniteDimensional K M N + let H := numberFieldEmbeddedBaseSubgroup K N j + let H' := numberFieldEmbeddedBaseSubgroup M N j + let hH'H := numberFieldEmbeddedBaseSubgroup_le_of_commonTop K M N j + letI _ : Finite (rationalFixedFieldAbsoluteQuotient H) := + (numberFieldEmbeddedFiniteAbstractField K N j).finite + letI _ : Finite + (rationalFixedFieldRelativeQuotient H H' hH'H) := + numberFieldEmbeddedBaseChangeExtensionQuotient_finite_of_commonTop + K M N j + relativeNorm rationalIdeleClassRepresentation H H' hH'H + (numberFieldEmbeddedIdeleClassEquivAmbientFixed + M N j (Additive.ofMul c)) = + numberFieldEmbeddedIdeleClassEquivAmbientFixed + K N j + (Additive.ofMul (_root_.ideleClassNorm K M c)) := by + intro H H' + let hH'H := numberFieldEmbeddedBaseSubgroup_le_of_commonTop K M N j + let hHfinite : Finite (rationalFixedFieldAbsoluteQuotient H) := by + exact (numberFieldEmbeddedFiniteAbstractField K N j).finite + let hHH'finite : Finite + (rationalFixedFieldRelativeQuotient H H' hH'H) := + numberFieldEmbeddedBaseChangeExtensionQuotient_finite_of_commonTop + K M N j + let F := abstractFixedField ℚ (SeparableClosure ℚ) H + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hH'H + let : NumberField F := by + let : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H hHfinite + exact NumberField.of_module_finite ℚ F + let : NumberField E := by + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H H' hH'H hHfinite hHH'finite + exact NumberField.of_module_finite F E + let hE : + E.restrictScalars ℚ = + abstractFixedField ℚ (SeparableClosure ℚ) H' := + IntermediateField.extendScalars_restrictScalars + (abstractFixedField_le ℚ (SeparableClosure ℚ) hH'H) + let eRel : + E ≃ₐ[ℚ] abstractFixedField ℚ (SeparableClosure ℚ) H' := + IntermediateField.equivOfEq hE + let eK : K ≃ₐ[ℚ] F := + numberFieldEmbeddedAbstractBaseFieldEquiv K N j + let eMBase : + M ≃ₐ[ℚ] abstractFixedField ℚ (SeparableClosure ℚ) H' := + numberFieldEmbeddedAbstractBaseFieldEquiv M N j + let eM : M ≃ₐ[ℚ] E := eMBase.trans eRel.symm + have hcompat (x : K) : + eM (algebraMap K M x) = algebraMap F E (eK x) := by + apply eRel.injective + apply Subtype.ext + change + j (algebraMap M N (algebraMap K M x)) = + j (algebraMap K N x) + rw [IsScalarTower.algebraMap_apply K M N] + have hupper : + rationalAbstractRelativeFixedFieldIdeleClassEquivFixed + H H' hH'H + (Additive.ofMul (ideleClassCongr eM c)) = + numberFieldEmbeddedIdeleClassEquivAmbientFixed + M N j (Additive.ofMul c) := by + apply Subtype.ext + exact rationalIdeleClassEquivFixed_transport_commonTop_val + (hA := by change FiniteDimensional ℚ E; infer_instance) + (hB := numberFieldEmbeddedAbstractFixedFieldFiniteDimensional M N j) + hE eMBase c + have hrelative := + rationalAbstractRelativeFixedFieldIdeleClassEquivFixed_relativeNorm_ofFiniteTower + H H' hH'H + unfold rationalAbstractRelativeFixedFieldNormStatement at hrelative + have hrelativec := hrelative (ideleClassCongr eM c) + change + relativeNorm rationalIdeleClassRepresentation H H' hH'H + (rationalAbstractRelativeFixedFieldIdeleClassEquivFixed + H H' hH'H + (Additive.ofMul (ideleClassCongr eM c))) = + rationalAbstractFixedFieldIdeleClassEquivFixed H + (Additive.ofMul + (_root_.ideleClassNorm F E (ideleClassCongr eM c))) + at hrelativec + calc + _ = relativeNorm rationalIdeleClassRepresentation H H' hH'H + (rationalAbstractRelativeFixedFieldIdeleClassEquivFixed H H' hH'H + (Additive.ofMul (ideleClassCongr eM c))) := + congrArg (relativeNorm rationalIdeleClassRepresentation H H' hH'H) hupper.symm + _ = rationalAbstractFixedFieldIdeleClassEquivFixed H + (Additive.ofMul (_root_.ideleClassNorm F E (ideleClassCongr eM c))) := + hrelativec + _ = _ := by + change + rationalAbstractFixedFieldIdeleClassEquivFixed H + (Additive.ofMul (_root_.ideleClassNorm F E (ideleClassCongr eM c))) = + rationalAbstractFixedFieldIdeleClassEquivFixed H + (Additive.ofMul (ideleClassCongr eK (_root_.ideleClassNorm K M c))) + apply congrArg (rationalAbstractFixedFieldIdeleClassEquivFixed H) + apply congrArg Additive.ofMul + exact (ideleClassCongr_ideleClassNorm + (K := K) (K' := F) (L := M) (L' := E) eK eM hcompat c).symm + +/-- The canonical quotient-to-Galois comparisons for one common top-field +embedding intertwine abstract restriction with restriction on actual Galois +groups, after abelianization. -/ +theorem + numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisAbelianization_restriction + [FiniteDimensional K N] [IsGalois K N] + (j : N →ₐ[ℚ] SeparableClosure ℚ) : + letI _ : FiniteDimensional K M := + commonTopBaseIntermediateFiniteDimensional K M N + letI _ : FiniteDimensional M N := + commonTopIntermediateTopFiniteDimensional K M N + letI _ : IsGalois M N := + commonTopIntermediateTopIsGalois K M N + ∀ z : Abelianization + (numberFieldEmbeddedFiniteGaloisSubextension M N j).extensionQuotient, + let H := numberFieldEmbeddedBaseSubgroup K N j + let H' := numberFieldEmbeddedBaseSubgroup M N j + let J := numberFieldEmbeddedTopSubgroup K N j + let hJH := numberFieldEmbeddedTopSubgroup_le_baseSubgroup K N j + let hJH' : J.toSubgroup ≤ H'.toSubgroup := + numberFieldEmbeddedTopSubgroup_le_baseSubgroup M N j + let hH'H := numberFieldEmbeddedBaseSubgroup_le_of_commonTop K M N j + letI _ : (extensionSubgroup H J hJH).Normal := + numberFieldEmbeddedExtensionSubgroup_normal K N j + letI _ : (extensionSubgroup H' J hJH').Normal := + numberFieldEmbeddedExtensionSubgroup_normal M N j + Abelianization.map + (AlgEquiv.restrictScalarsHom K : Gal(N/M) →* Gal(N/K)) + (Additive.toMul + (numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisAbelianization + M N j (Additive.ofMul z))) = + Additive.toMul + (numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisAbelianization + K N j + (MonoidHom.toAdditive + (normResidueNaturalityAbelianizedRestriction + H H' J J hJH hJH' hH'H le_rfl) + (Additive.ofMul z))) := by + dsimp only + let : FiniteDimensional K M := + commonTopBaseIntermediateFiniteDimensional K M N + let : FiniteDimensional M N := + commonTopIntermediateTopFiniteDimensional K M N + let : IsGalois M N := + commonTopIntermediateTopIsGalois K M N + intro z + let H := numberFieldEmbeddedBaseSubgroup K N j + let H' := numberFieldEmbeddedBaseSubgroup M N j + let J := numberFieldEmbeddedTopSubgroup K N j + let hJH := numberFieldEmbeddedTopSubgroup_le_baseSubgroup K N j + let hJH' : J.toSubgroup ≤ H'.toSubgroup := + numberFieldEmbeddedTopSubgroup_le_baseSubgroup M N j + let hH'H := numberFieldEmbeddedBaseSubgroup_le_of_commonTop K M N j + let hLowerNormal : (extensionSubgroup H J hJH).Normal := + numberFieldEmbeddedExtensionSubgroup_normal K N j + let hUpperNormal : (extensionSubgroup H' J hJH').Normal := + numberFieldEmbeddedExtensionSubgroup_normal M N j + let qLowerRaw : + (H.toSubgroup ⧸ extensionSubgroup H J hJH) ≃* Gal(N/K) := + numberFieldEmbeddedExtensionQuotientEquivGaloisGroup K N j + let qUpperRaw : + (H'.toSubgroup ⧸ extensionSubgroup H' J hJH') ≃* Gal(N/M) := + numberFieldEmbeddedExtensionQuotientEquivGaloisGroup M N j + let restrictActual : Gal(N/M) →* Gal(N/K) := + AlgEquiv.restrictScalarsHom K + obtain ⟨q, rfl⟩ := QuotientGroup.mk_surjective z + obtain ⟨sigma, rfl⟩ := + (numberFieldEmbeddedFiniteGaloisSubextension M N j).extensionQuotientMk_surjective q + change + Abelianization.map restrictActual + (qUpperRaw.abelianizationCongr + (Abelianization.of (QuotientGroup.mk sigma))) = + qLowerRaw.abelianizationCongr + (normResidueNaturalityAbelianizedRestriction + H H' J J hJH hJH' hH'H le_rfl + (Abelianization.of (QuotientGroup.mk sigma))) + rw [normResidueNaturalityAbelianizedRestriction_of_mk, + abelianizationCongr_of, abelianizationCongr_of, + Abelianization.map_of] + have hraw : + restrictActual (qUpperRaw (QuotientGroup.mk sigma)) = + qLowerRaw + (QuotientGroup.mk (Subgroup.inclusion hH'H sigma)) := by + apply AlgEquiv.ext + intro x + apply j.injective + let hUpperAlgebra : Algebra M (SeparableClosure ℚ) := + numberFieldEmbeddedSeparableClosureAlgebra M N j + let eUpper := numberFieldEmbeddedSeparableClosureEquiv M N j + let hLowerAlgebra : Algebra K (SeparableClosure ℚ) := + numberFieldEmbeddedSeparableClosureAlgebra K N j + let eLower := numberFieldEmbeddedSeparableClosureEquiv K N j + calc + j (restrictActual (qUpperRaw (QuotientGroup.mk sigma)) x) = + sigma.1.1 (j x) := by + exact + ambientEmbeddedExtensionQuotientEquivGaloisGroup_mk_apply + ℚ M N j eUpper sigma x + _ = (Subgroup.inclusion hH'H sigma).1.1 (j x) := rfl + _ = j + (qLowerRaw + (QuotientGroup.mk (Subgroup.inclusion hH'H sigma)) x) := by + exact + (ambientEmbeddedExtensionQuotientEquivGaloisGroup_mk_apply + ℚ K N j eLower (Subgroup.inclusion hH'H sigma) x).symm + exact congrArg Abelianization.of hraw + +/-- For one embedding of a common finite Galois overfield, the +abelianization-valued global norm-residue maps commute with ordinary +idèle-class norm and restriction. The intermediate extension need not be +Galois. -/ +theorem + globalNormResidueAbelianizationMonoidHomOfEmbedding_norm_restriction + [FiniteDimensional K N] [IsGalois K N] + (j : N →ₐ[ℚ] SeparableClosure ℚ) : + letI _ : FiniteDimensional K M := + commonTopBaseIntermediateFiniteDimensional K M N + letI _ : FiniteDimensional M N := + commonTopIntermediateTopFiniteDimensional K M N + letI _ : IsGalois M N := + commonTopIntermediateTopIsGalois K M N + (Abelianization.map + (AlgEquiv.restrictScalarsHom K : Gal(N/M) →* Gal(N/K))).comp + (globalNormResidueAbelianizationMonoidHomOfEmbedding M N j) = + (globalNormResidueAbelianizationMonoidHomOfEmbedding K N j).comp + (_root_.ideleClassNorm K M) := by + let : FiniteDimensional K M := + commonTopBaseIntermediateFiniteDimensional K M N + let : FiniteDimensional M N := + commonTopIntermediateTopFiniteDimensional K M N + let : IsGalois M N := + commonTopIntermediateTopIsGalois K M N + let H := numberFieldEmbeddedBaseSubgroup K N j + let H' := numberFieldEmbeddedBaseSubgroup M N j + let J := numberFieldEmbeddedTopSubgroup K N j + let hJH := numberFieldEmbeddedTopSubgroup_le_baseSubgroup K N j + let hJH' : J.toSubgroup ≤ H'.toSubgroup := + numberFieldEmbeddedTopSubgroup_le_baseSubgroup M N j + let hH'H := numberFieldEmbeddedBaseSubgroup_le_of_commonTop K M N j + let hLowerNormal : (extensionSubgroup H J hJH).Normal := + numberFieldEmbeddedExtensionSubgroup_normal K N j + let hLowerFinite : + Finite (H.toSubgroup ⧸ extensionSubgroup H J hJH) := + numberFieldEmbeddedExtensionQuotient_finite K N j + let hUpperNormal : (extensionSubgroup H' J hJH').Normal := + numberFieldEmbeddedExtensionSubgroup_normal M N j + let hUpperFinite : + Finite (H'.toSubgroup ⧸ extensionSubgroup H' J hJH') := + numberFieldEmbeddedExtensionQuotient_finite M N j + let hHH'finite := + numberFieldEmbeddedBaseChangeExtensionQuotient_finite_of_commonTop + K M N j + let T : + FiniteAbstractFieldExtension + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) := + { field := numberFieldEmbeddedFiniteAbstractField M N j + base := numberFieldEmbeddedFiniteAbstractField K N j + below := hH'H + finiteQuotient := hHH'finite } + let hTBaseNormal : + (extensionSubgroup T.base.field J hJH).Normal := by + change (extensionSubgroup H J hJH).Normal + exact hLowerNormal + let hTBaseFinite : + Finite + (T.base.field.toSubgroup ⧸ + extensionSubgroup T.base.field J hJH) := by + change Finite (H.toSubgroup ⧸ extensionSubgroup H J hJH) + exact hLowerFinite + let hTFieldNormal : + (extensionSubgroup T.field.field J hJH').Normal := by + change (extensionSubgroup H' J hJH').Normal + exact hUpperNormal + let hTFieldFinite : + Finite + (T.field.field.toSubgroup ⧸ + extensionSubgroup T.field.field J hJH') := by + change Finite (H'.toSubgroup ⧸ extensionSubgroup H' J hJH') + exact hUpperFinite + let restrictActual : Gal(N/M) →* Gal(N/K) := + AlgEquiv.restrictScalarsHom K + apply MonoidHom.ext + intro c + let a := + numberFieldEmbeddedIdeleClassEquivAmbientFixed + M N j (Additive.ofMul c) + have hnat := + DegreeData.normResidueNaturality_norm_restriction + (D := rationalCyclotomicDegreeData) + (A := rationalIdeleClassRepresentation) + (v := rationalCyclotomicIdeleClassValuationData) + (hcf := rationalIdeleClassRepresentation_satisfiesClassFieldAxiom) + (T := T) (L := J) (L' := J) + (hLnormal := hTBaseNormal) + (hL'normal := hTFieldNormal) + (hLKfinite := hTBaseFinite) + (hL'K'finite := hTFieldFinite) + hJH hJH' le_rfl + have hnatc := + DFunLike.congr_fun hnat + (finiteNormClass rationalIdeleClassRepresentation + H' J hJH' a) + change _ = + rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + T.base + { field := J + below := hJH + normal := hTBaseNormal + finite := hTBaseFinite } + (finiteReciprocityNaturalityNormMap + rationalIdeleClassRepresentation + T.base.field T.field.field J J + hJH hJH' T.below le_rfl + (finiteNormClass rationalIdeleClassRepresentation + T.field.field J hJH' a)) at hnatc + rw [finiteReciprocityNaturalityNormMap_finiteNormClass] at hnatc + have hnorm : + relativeNorm rationalIdeleClassRepresentation H H' hH'H a = + numberFieldEmbeddedIdeleClassEquivAmbientFixed K N j + (Additive.ofMul (_root_.ideleClassNorm K M c)) := + numberFieldEmbeddedIdeleClassEquivAmbientFixed_relativeNorm_of_commonTop + K M N j c + calc + Abelianization.map restrictActual + (globalNormResidueAbelianizationMonoidHomOfEmbedding M N j c) = + Abelianization.map restrictActual + (Additive.toMul + (numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisAbelianization + M N j + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldEmbeddedFiniteAbstractField M N j) + (numberFieldEmbeddedFiniteGaloisSubextension M N j) + (finiteNormClass rationalIdeleClassRepresentation + H' J hJH' a)))) := by + rw [globalNormResidueAbelianizationMonoidHomOfEmbedding_apply] + _ = + Additive.toMul + (numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisAbelianization + K N j + (MonoidHom.toAdditive + (normResidueNaturalityAbelianizedRestriction + H H' J J hJH hJH' hH'H le_rfl) + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldEmbeddedFiniteAbstractField M N j) + (numberFieldEmbeddedFiniteGaloisSubextension M N j) + (finiteNormClass rationalIdeleClassRepresentation + H' J hJH' a)))) := by + exact + numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisAbelianization_restriction + K M N j _ + _ = + Additive.toMul + (numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisAbelianization + K N j + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldEmbeddedFiniteAbstractField K N j) + (numberFieldEmbeddedFiniteGaloisSubextension K N j) + (finiteNormClass rationalIdeleClassRepresentation + H J hJH + (relativeNorm rationalIdeleClassRepresentation + H H' hH'H a)))) := by + exact congrArg + (fun z => + Additive.toMul + (numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisAbelianization + K N j z)) + hnatc + _ = + globalNormResidueAbelianizationMonoidHomOfEmbedding K N j + (_root_.ideleClassNorm K M c) := by + rw [hnorm, + ← globalNormResidueAbelianizationMonoidHomOfEmbedding_apply] + +/-- Global norm-residue naturality in Galois abelianizations for a finite +tower with a common Galois top field. No Galois hypothesis is imposed on +the intermediate extension. -/ +theorem globalNormResidueAbelianizationMonoidHom_norm_restriction + [FiniteDimensional K N] [IsGalois K N] : + letI _ : FiniteDimensional K M := + commonTopBaseIntermediateFiniteDimensional K M N + letI _ : FiniteDimensional M N := + commonTopIntermediateTopFiniteDimensional K M N + letI _ : IsGalois M N := + commonTopIntermediateTopIsGalois K M N + (Abelianization.map + (AlgEquiv.restrictScalarsHom K : Gal(N/M) →* Gal(N/K))).comp + (globalNormResidueAbelianizationMonoidHom M N) = + (globalNormResidueAbelianizationMonoidHom K N).comp + (_root_.ideleClassNorm K M) := by + let : FiniteDimensional K M := + commonTopBaseIntermediateFiniteDimensional K M N + let : FiniteDimensional M N := + commonTopIntermediateTopFiniteDimensional K M N + let : IsGalois M N := + commonTopIntermediateTopIsGalois K M N + rw [globalNormResidueAbelianizationMonoidHom_eq_ofEmbedding_standard, + globalNormResidueAbelianizationMonoidHom_eq_ofEmbedding_standard] + exact + globalNormResidueAbelianizationMonoidHomOfEmbedding_norm_restriction + K M N (numberFieldSeparableClosureEmbedding N) + +end CommonTop + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean new file mode 100644 index 0000000000..e50ae45122 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean @@ -0,0 +1,2973 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.AbstractFixedFieldGlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality +/-! +# Naturality of the global norm-residue symbol + +This file records the same-base restriction specialization of abstract +norm-residue naturality in the rational absolute class formation. All +closed subgroups remain in one fixed separable-closure ambient, so the +statement is directly usable by fixed-field overextension arguments. +-/ + +@[expose] public section + +open scoped IsMulCommutative + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open GlobalClassFields +open KummerTheory +open AlgebraicNumberTheory +open LocalClassFieldTheory +open RamificationTheory + +universe u + +@[instance_reducible] +private noncomputable def naturalityIdeleClassCommGroup + (F : Type) [Field F] [NumberField F] : CommGroup (IdeleClassGroup F) := + QuotientGroup.Quotient.commGroup (IdeleGroup.principalSubgroup F) + +attribute [local instance] naturalityIdeleClassCommGroup + +local instance ideleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] + : IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +local instance ideleClassSubgroupNormal + {F : Type} [Field F] [NumberField F] + (N : Subgroup (IdeleClassGroup F)) : N.Normal := + N.normal_of_isMulCommutative + + +/-- Two finite Galois subextensions with the same underlying closed subgroup +are equal; the remaining structure fields are proof-irrelevant. -/ +private theorem finiteGaloisSubextension_eq_of_field_eq + {G : Type u} [Group G] [TopologicalSpace G] + {K : ClosedSubgroup G} + (A B : FiniteGaloisSubextension K) + (h : A.field = B.field) : + A = B := by + cases A with + | mk A hA nA fA => + cases B with + | mk B hB nB fB => + dsimp only at h + cases h + rfl + +/-- Rebase a finite Galois subextension along equality of its bundled base. +The field equality is the only data component; the remaining fields are +proof-irrelevant. -/ +private theorem finiteGaloisSubextension_transport_eq_of_field_eq + {G : Type u} [Group G] [TopologicalSpace G] + {A B : FiniteAbstractField G} + (hAB : A = B) + (P : FiniteGaloisSubextension A.field) + (Q : FiniteGaloisSubextension B.field) + (hfield : P.field = Q.field) : + Eq.mp + (congrArg + (fun X : FiniteAbstractField G => + FiniteGaloisSubextension X.field) + hAB) + P = Q := by + cases hAB + exact finiteGaloisSubextension_eq_of_field_eq P Q hfield + +/-- Transporting an additive equivalence between rational ambient fixed +subgroups does not change the underlying direct-limit class. -/ +private theorem rationalAmbientFixedAddEquiv_transport_apply_val + {A B : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)} + (hAB : A = B) + {X : Type} [AddGroup X] + (e : X ≃+ + ambientFixedAddSubgroup rationalIdeleClassRepresentation A.field) + (x : X) : + ((Eq.mp + (congrArg + (fun Y : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) => + X ≃+ ambientFixedAddSubgroup + rationalIdeleClassRepresentation Y.field) + hAB) + e x).1) = + (e x).1 := by + cases hAB + rfl + +/-- Changing only the bundled subgroup of an additive subgroup element +does not change its value in the ambient group. -/ +private theorem addSubgroupCongr_apply_val + {A : Type} [AddGroup A] + {H K : AddSubgroup A} + (h : H = K) (x : H) : + ((AddEquiv.addSubgroupCongr h x).1 : A) = x.1 := by + cases h + rfl + +/-- Transporting an idele class along a field equality and the corresponding +algebra equivalence leaves its rational direct-limit representative fixed. -/ +private theorem rationalIdeleClassEquivFixed_congr_apply_val + {A B : IntermediateField ℚ (SeparableClosure ℚ)} + [FiniteDimensional ℚ A] [FiniteDimensional ℚ B] + (h : A = B) + (e : B ≃ₐ[ℚ] A) + (he : e.trans (IntermediateField.equivOfEq h) = + (AlgEquiv.refl : B ≃ₐ[ℚ] B)) + (c : Additive (IdeleClassGroup B)) : + ((rationalIdeleClassEquivFixed A) + (MulEquiv.toAdditive (ideleClassCongr e) c)).1 = + ((rationalIdeleClassEquivFixed B) c).1 := by + cases h + have he' : e = AlgEquiv.refl := by + apply AlgEquiv.ext + intro x + have hx := DFunLike.congr_fun he x + change e x = x at hx + exact hx + rw [he'] + have hc : + MulEquiv.toAdditive + (ideleClassCongr (AlgEquiv.refl : A ≃ₐ[ℚ] A)) c = c := by + cases c with + | ofMul c => + exact congrArg Additive.ofMul (ideleClassCongr_refl c) + rw [hc] + +/-- Transporting the target intermediate field of a base-field equivalence +preserves its rational fixed-part representative. -/ +private theorem rationalIdeleClassEquivFixed_transport_baseEquiv_val + {T : Type} [Field T] [NumberField T] + {A B : IntermediateField ℚ (SeparableClosure ℚ)} + [FiniteDimensional ℚ A] [FiniteDimensional ℚ B] + (h : A = B) (e : T ≃ₐ[ℚ] B) + (c : IdeleClassGroup T) : + ((rationalIdeleClassEquivFixed A) + (Additive.ofMul + (ideleClassCongr (K := T) (M := A) + (e.trans (IntermediateField.equivOfEq h).symm) c))).1 = + ((rationalIdeleClassEquivFixed B) + (Additive.ofMul (ideleClassCongr (K := T) (M := B) e c))).1 := by + cases h + have he : + e.trans (IntermediateField.equivOfEq (rfl : A = A)).symm = e := by + ext x + rfl + rw [he] + +/-- Equality of the lower and upper closed subgroups transports the raw +extension quotient without exposing dependent rewrites to clients. -/ +private def extensionQuotientMulEquivOfEq + {G : Type u} [Group G] [TopologicalSpace G] + {H H' J J' : ClosedSubgroup G} + (hH : H = H') (hJ : J = J') + (hJH : J.toSubgroup ≤ H.toSubgroup) + (hJH' : J'.toSubgroup ≤ H'.toSubgroup) + [(CyclicCohomology.extensionSubgroup H J hJH).Normal] + [(CyclicCohomology.extensionSubgroup H' J' hJH').Normal] : + (H.toSubgroup ⧸ CyclicCohomology.extensionSubgroup H J hJH) ≃* + (H'.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H' J' hJH') := by + cases hH + cases hJ + exact MulEquiv.refl _ + +/-- The quotient transport sends a quotient representative to the same +ambient group element, rebundled in the equal lower subgroup. -/ +@[simp] +private theorem extensionQuotientMulEquivOfEq_mk + {G : Type u} [Group G] [TopologicalSpace G] + {H H' J J' : ClosedSubgroup G} + (hH : H = H') (hJ : J = J') + (hJH : J.toSubgroup ≤ H.toSubgroup) + (hJH' : J'.toSubgroup ≤ H'.toSubgroup) + [(CyclicCohomology.extensionSubgroup H J hJH).Normal] + [(CyclicCohomology.extensionSubgroup H' J' hJH').Normal] + (σ : H.toSubgroup) : + extensionQuotientMulEquivOfEq hH hJ hJH hJH' + (QuotientGroup.mk σ) = + QuotientGroup.mk + ((MulEquiv.subgroupCongr + (congrArg ClosedSubgroup.toSubgroup hH)) σ) := by + cases hH + cases hJ + rfl + +/-- Rebundling an element along equality of closed subgroups preserves its +underlying ambient group element. -/ +private theorem closedSubgroupCongr_apply_val + {G : Type u} [Group G] [TopologicalSpace G] + {H H' : ClosedSubgroup G} + (hH : H = H') (σ : H.toSubgroup) : + (((MulEquiv.subgroupCongr + (congrArg ClosedSubgroup.toSubgroup hH)) σ).1 : G) = σ.1 := by + cases hH + rfl + +/-- Rebase an abelianized extension-quotient equivalence together with its +finite abstract base. -/ +private def abelianizedExtensionQuotientAddEquiv_transportBase + {G : Type u} [Group G] [TopologicalSpace G] + {A B : FiniteAbstractField G} + (hAB : A = B) + (P : FiniteGaloisSubextension A.field) + {X : Type} [AddGroup X] + (e : Additive (Abelianization P.extensionQuotient) ≃+ X) : + Additive + (Abelianization + (Eq.mp + (congrArg + (fun Y : FiniteAbstractField G => + FiniteGaloisSubextension Y.field) + hAB) + P).extensionQuotient) ≃+ X := by + cases hAB + exact e + +/-- Rebase an abelianized equivalence along equality of finite Galois +subextensions over a fixed abstract base. -/ +private def abelianizedExtensionQuotientAddEquiv_transportExtension + {G : Type u} [Group G] [TopologicalSpace G] + {K : ClosedSubgroup G} + {P Q : FiniteGaloisSubextension K} + (hPQ : P = Q) + {X : Type} [AddGroup X] + (e : Additive (Abelianization P.extensionQuotient) ≃+ X) : + Additive (Abelianization Q.extensionQuotient) ≃+ X := by + cases hPQ + exact e + +/-- The explicit quotient equivalence induced by rebasing a finite Galois +subextension. -/ +private def extensionQuotientMulEquiv_transportFiniteGalois + {G : Type u} [Group G] [TopologicalSpace G] + {A B : FiniteAbstractField G} + (hAB : A = B) + (P : FiniteGaloisSubextension A.field) + {Q : FiniteGaloisSubextension B.field} + (hPQ : + Eq.mp + (congrArg + (fun Y : FiniteAbstractField G => + FiniteGaloisSubextension Y.field) + hAB) + P = Q) : + Q.extensionQuotient ≃* P.extensionQuotient := by + cases hAB + cases hPQ + exact MulEquiv.refl _ + +/-- Quotient rebasing sends a canonical representative to the same ambient +group element rebundled in the old base subgroup. -/ +@[simp] +private theorem extensionQuotientMulEquiv_transportFiniteGalois_mk + {G : Type u} [Group G] [TopologicalSpace G] + {A B : FiniteAbstractField G} + (hAB : A = B) + (P : FiniteGaloisSubextension A.field) + {Q : FiniteGaloisSubextension B.field} + (hPQ : + Eq.mp + (congrArg + (fun Y : FiniteAbstractField G => + FiniteGaloisSubextension Y.field) + hAB) + P = Q) + (σ : B.field.toSubgroup) : + extensionQuotientMulEquiv_transportFiniteGalois hAB P hPQ + (Q.extensionQuotientMk σ) = + P.extensionQuotientMk + ((MulEquiv.subgroupCongr + (congrArg ClosedSubgroup.toSubgroup + (congrArg FiniteAbstractField.field hAB).symm)) σ) := by + cases hAB + cases hPQ + rfl + +/-- Abelianization commutes with simultaneous transport of the abstract base +and its finite Galois subextension. -/ +private theorem abelianizedCanonicalEquiv_transportFiniteGalois + {G : Type u} [Group G] [TopologicalSpace G] + {A B : FiniteAbstractField G} + (hAB : A = B) + (P : FiniteGaloisSubextension A.field) + {Q : FiniteGaloisSubextension B.field} + (hPQ : + Eq.mp + (congrArg + (fun Y : FiniteAbstractField G => + FiniteGaloisSubextension Y.field) + hAB) + P = Q) + {X : Type} [CommGroup X] + (e : P.extensionQuotient ≃* X) : + abelianizedExtensionQuotientAddEquiv_transportExtension hPQ + (abelianizedExtensionQuotientAddEquiv_transportBase + hAB P + (MulEquiv.toAdditive + (e.abelianizationCongr.trans + (Abelianization.equivOfComm : X ≃* Abelianization X).symm))) = + MulEquiv.toAdditive + (((extensionQuotientMulEquiv_transportFiniteGalois + hAB P hPQ).trans e).abelianizationCongr.trans + (Abelianization.equivOfComm : X ≃* Abelianization X).symm) := by + cases hAB + cases hPQ + rfl + +/-- Package the entire rational finite norm-residue evaluation so that its +dependent base, extension, quotient and comparison maps move together. -/ +private def rationalFiniteNormResidueValue + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteGaloisSubextension K.field) + {C X : Type} [AddGroup C] [AddGroup X] + (eIdele : C ≃+ + ambientFixedAddSubgroup rationalIdeleClassRepresentation K.field) + (eGalois : Additive (Abelianization L.extensionQuotient) ≃+ X) + (c : C) : X := by + letI : + Finite + (K.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + K.field L.field L.below) := + L.finite + exact + eGalois + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + K L + (finiteNormClass rationalIdeleClassRepresentation + K.field L.field L.below (eIdele c))) + +/-- The packaged norm-residue value is invariant under rebasing the finite +abstract field together with all dependent data. -/ +private theorem rationalFiniteNormResidueValue_transportBase + {A B : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)} + (hAB : A = B) + (P : FiniteGaloisSubextension A.field) + {C X : Type} [AddGroup C] [AddGroup X] + (eIdele : C ≃+ + ambientFixedAddSubgroup rationalIdeleClassRepresentation A.field) + (eGalois : Additive (Abelianization P.extensionQuotient) ≃+ X) + (c : C) : + rationalFiniteNormResidueValue A P eIdele eGalois c = + rationalFiniteNormResidueValue B + (Eq.mp + (congrArg + (fun Y : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) => + FiniteGaloisSubextension Y.field) + hAB) + P) + (Eq.mp + (congrArg + (fun Y : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) => + C ≃+ ambientFixedAddSubgroup + rationalIdeleClassRepresentation Y.field) + hAB) + eIdele) + (abelianizedExtensionQuotientAddEquiv_transportBase + hAB P eGalois) + c := by + cases hAB + rfl + +/-- The packaged norm-residue value is invariant under equality of the finite +Galois subextension. -/ +private theorem rationalFiniteNormResidueValue_transportExtension + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + {P Q : FiniteGaloisSubextension K.field} + (hPQ : P = Q) + {C X : Type} [AddGroup C] [AddGroup X] + (eIdele : C ≃+ + ambientFixedAddSubgroup rationalIdeleClassRepresentation K.field) + (eGalois : Additive (Abelianization P.extensionQuotient) ≃+ X) + (c : C) : + rationalFiniteNormResidueValue K P eIdele eGalois c = + rationalFiniteNormResidueValue K Q eIdele + (abelianizedExtensionQuotientAddEquiv_transportExtension + hPQ eGalois) + c := by + cases hPQ + rfl + +/-- Evaluation of the canonical abelianization comparison induced by a +multiplicative equivalence into a commutative group. -/ +private theorem abelianizationCongrToComm_apply + {Q R : Type*} [Group Q] [CommGroup R] + (e : Q ≃* R) (q : Q) : + MulEquiv.toAdditive + (e.abelianizationCongr.trans + (Abelianization.equivOfComm : R ≃* Abelianization R).symm) + (Additive.ofMul (Abelianization.of q)) = + Additive.ofMul (e q) := by + apply Additive.toMul.injective + change + (Abelianization.equivOfComm : R ≃* Abelianization R).symm + (e.abelianizationCongr (Abelianization.of q)) = e q + rw [abelianizationCongr_of] + exact + (Abelianization.equivOfComm : R ≃* Abelianization R).symm_apply_apply _ + +/-- Evaluation of the canonical quotient from the abelianization of a +commutative group. -/ +private theorem commutativeAbelianizationEquiv_apply + {Q R : Type*} [CommGroup Q] [Group R] + (e : Q ≃* R) (q : Q) : + MulEquiv.toAdditive + ((Abelianization.equivOfComm : Q ≃* Abelianization Q).symm.trans e) + (Additive.ofMul (Abelianization.of q)) = + Additive.ofMul (e q) := by + apply Additive.toMul.injective + change + e ((Abelianization.equivOfComm : Q ≃* Abelianization Q).symm + (Abelianization.of q)) = e q + exact congrArg e + ((Abelianization.equivOfComm : Q ≃* Abelianization Q).symm_apply_apply q) + +section AbstractFixedFieldInclusion + +variable + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + +local instance naturalityAbstractFixedFieldBaseQuotientFinite : + Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + H.field (le_baseField H.field)) := + H.finite + +local instance naturalityAbstractFixedFieldRelativeQuotientFinite : + Finite + (H.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H.field P.field P.below) := + P.finite + +noncomputable local instance + naturalityAbstractFixedFieldFiniteDimensional : + FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) H.field) := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + +noncomputable local instance + naturalityAbstractRelativeFixedFieldFiniteDimensional : + FiniteDimensional + (abstractFixedField ℚ (SeparableClosure ℚ) H.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + H.field P.field P.below H.finite P.finite + +local instance naturalityAbstractFixedFieldRelativeScalarTower : + IsScalarTower ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) H.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + +noncomputable local instance + naturalityAbstractRelativeFixedFieldAbsoluteFiniteDimensional : + FiniteDimensional ℚ + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) := + FiniteDimensional.trans ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) H.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) + +noncomputable local instance naturalityAbstractFixedFieldNumberField : + NumberField + (abstractFixedField ℚ (SeparableClosure ℚ) H.field) := + NumberField.of_module_finite ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) H.field) + +noncomputable local instance + naturalityAbstractRelativeFixedFieldNumberField : + NumberField + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) := + NumberField.of_module_finite ℚ + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) + +/-- Use the same direct fixed-field Galois witness as the intrinsic +norm-residue construction. This prevents the dependent Galois-group type +from being synthesized through a second `IsAbelianGalois` instance path. -/ +noncomputable local instance + naturalityAbstractRelativeFixedFieldIsGalois : + IsGalois + (abstractFixedField ℚ (SeparableClosure ℚ) H.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) + H.field P.field P.below P.normal + +noncomputable local instance + naturalityAbstractRelativeFixedFieldIsAbelianGalois : + IsAbelianGalois + (abstractFixedField ℚ (SeparableClosure ℚ) H.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) := + finiteAbelianSubextensionAbstractRelativeFixedFieldIsAbelianGalois P + +/-- The lower subgroup obtained from the canonical inclusion of an abstract +fixed-field tower is the original lower closed subgroup. -/ +private theorem + numberFieldEmbeddedBaseSubgroup_abstractFixedFieldInclusion + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) : + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let j : E →ₐ[ℚ] SeparableClosure ℚ := + E.val.restrictScalars ℚ + numberFieldEmbeddedBaseSubgroup F E j = H.field := by + dsimp only + have hi : + numberFieldEmbeddedLowerEmbedding + (abstractFixedField ℚ (SeparableClosure ℚ) H.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) + ((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below).val.restrictScalars ℚ) = + (abstractFixedField + ℚ (SeparableClosure ℚ) H.field).val := by + ext x + rfl + have hRange : + (numberFieldEmbeddedLowerEmbedding + (abstractFixedField ℚ (SeparableClosure ℚ) H.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) + ((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below).val.restrictScalars ℚ)).fieldRange = + abstractFixedField ℚ (SeparableClosure ℚ) H.field := by + ext x + constructor + · rintro ⟨y, rfl⟩ + change + numberFieldEmbeddedLowerEmbedding + (abstractFixedField ℚ (SeparableClosure ℚ) H.field) + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) + ((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below).val.restrictScalars ℚ) y ∈ + abstractFixedField ℚ (SeparableClosure ℚ) H.field + rw [hi] + exact y.property + · intro hx + refine ⟨⟨x, hx⟩, ?_⟩ + rw [hi] + rfl + rw [numberFieldEmbeddedBaseSubgroup, hRange] + exact + closedFixingSubgroup_abstractFixedField_eq + ℚ (SeparableClosure ℚ) H.field + +/-- The upper subgroup obtained from the canonical inclusion of an abstract +fixed-field tower is the original upper closed subgroup. -/ +private theorem + numberFieldEmbeddedTopSubgroup_abstractFixedFieldInclusion + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) : + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let j : E →ₐ[ℚ] SeparableClosure ℚ := + E.val.restrictScalars ℚ + numberFieldEmbeddedTopSubgroup F E j = P.field := by + dsimp only + rw [numberFieldEmbeddedTopSubgroup] + have hjRangeSelf : + ((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below).val.restrictScalars ℚ).fieldRange = + (abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below).restrictScalars ℚ := by + ext x + constructor + · rintro ⟨y, rfl⟩ + exact y.property + · intro hx + exact ⟨⟨x, hx⟩, rfl⟩ + have hjRange : + ((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below).val.restrictScalars ℚ).fieldRange = + abstractFixedField ℚ (SeparableClosure ℚ) P.field := by + exact hjRangeSelf.trans + (IntermediateField.extendScalars_restrictScalars + (abstractFixedField_le + ℚ (SeparableClosure ℚ) P.below)) + rw [hjRange] + exact + closedFixingSubgroup_abstractFixedField_eq + ℚ (SeparableClosure ℚ) P.field + +/-- Transport a packaged rational norm-residue value directly from an equal +abstract base to the finite Galois extension underlying `P`. Keeping the two +dependent transports in their own declaration prevents their elaboration cost +from accumulating in the main fixed-field comparison theorem. -/ +private theorem rationalFiniteNormResidueValue_transportToAbstractExtension + {A : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)} + (hAH : A = H) + (L : FiniteGaloisSubextension A.field) + (hLP : + Eq.mp + (congrArg + (fun Y : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) => + FiniteGaloisSubextension Y.field) + hAH) + L = + P.toFiniteGaloisExtension) + {C X : Type} [AddGroup C] [AddGroup X] + (eIdele : C ≃+ + ambientFixedAddSubgroup rationalIdeleClassRepresentation A.field) + (eGalois : Additive (Abelianization L.extensionQuotient) ≃+ X) + (c : C) : + rationalFiniteNormResidueValue A L eIdele eGalois c = + rationalFiniteNormResidueValue H P.toFiniteGaloisExtension + (Eq.mp + (congrArg + (fun Y : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) => + C ≃+ ambientFixedAddSubgroup + rationalIdeleClassRepresentation Y.field) + hAH) + eIdele) + (abelianizedExtensionQuotientAddEquiv_transportExtension hLP + (abelianizedExtensionQuotientAddEquiv_transportBase + hAH L eGalois)) + c := by + calc + _ = rationalFiniteNormResidueValue H + (Eq.mp + (congrArg + (fun Y : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) => + FiniteGaloisSubextension Y.field) + hAH) + L) + (Eq.mp + (congrArg + (fun Y : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) => + C ≃+ ambientFixedAddSubgroup + rationalIdeleClassRepresentation Y.field) + hAH) + eIdele) + (abelianizedExtensionQuotientAddEquiv_transportBase hAH L eGalois) + c := + rationalFiniteNormResidueValue_transportBase + (A := A) (B := H) (C := C) (X := X) + hAH L eIdele eGalois c + _ = _ := + rationalFiniteNormResidueValue_transportExtension + (K := H) + (P := Eq.mp + (congrArg + (fun Y : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) => + FiniteGaloisSubextension Y.field) + hAH) + L) + (Q := P.toFiniteGaloisExtension) (C := C) (X := X) + hLP + (Eq.mp + (congrArg + (fun Y : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) => + C ≃+ ambientFixedAddSubgroup + rationalIdeleClassRepresentation Y.field) + hAH) + eIdele) + (abelianizedExtensionQuotientAddEquiv_transportBase hAH L eGalois) + c + +/-- The packaged value at the literal fixed-field realization is the ambient +fixed-part norm-residue homomorphism evaluated at the same idele class. -/ +private theorem rationalFiniteNormResidueValue_abstractFixedField_eq_ambient + (c : IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) H.field)) : + rationalFiniteNormResidueValue H P.toFiniteGaloisExtension + (rationalAbstractFixedFieldIdeleClassEquivFixed H.field) + (abstractFixedFieldAbelianizedExtensionQuotientEquivGaloisGroup H P) + (Additive.ofMul c) = + ambientFixedGlobalNormResidueAddMonoidHom H P + (rationalAbstractFixedFieldIdeleClassEquivFixed + H.field (Additive.ofMul c)) := by + let eRec := + rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + H P.toFiniteGaloisExtension + let eGal := + abstractFixedFieldAbelianizedExtensionQuotientEquivGaloisGroup H P + change + eGal + (eRec + (finiteNormClass rationalIdeleClassRepresentation + H.field P.field P.below + (rationalAbstractFixedFieldIdeleClassEquivFixed + H.field (Additive.ofMul c)))) = + eGal + (eRec + (finiteNormClass rationalIdeleClassRepresentation + H.field P.field P.below + (rationalAbstractFixedFieldIdeleClassEquivFixed + H.field (Additive.ofMul c)))) + rfl + +/-- The packaged norm-residue value for the literal fixed-field realization +is the intrinsic abstract fixed-field norm-residue value. -/ +private theorem rationalFiniteNormResidueValue_abstractFixedField_apply + (c : IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) H.field)) : + Additive.toMul + (rationalFiniteNormResidueValue H P.toFiniteGaloisExtension + (rationalAbstractFixedFieldIdeleClassEquivFixed H.field) + (abstractFixedFieldAbelianizedExtensionQuotientEquivGaloisGroup + H P) + (Additive.ofMul c)) = + abstractFixedFieldGlobalNormResidueMonoidHom H P c := by + let a := + rationalAbstractFixedFieldIdeleClassEquivFixed + H.field (Additive.ofMul c) + have hAbstract := + abstractFixedFieldGlobalNormResidueMonoidHom_fixed_apply H P a + calc + _ = Additive.toMul + (ambientFixedGlobalNormResidueAddMonoidHom H P + (rationalAbstractFixedFieldIdeleClassEquivFixed + H.field (Additive.ofMul c))) := by + exact congrArg Additive.toMul + (rationalFiniteNormResidueValue_abstractFixedField_eq_ambient + (H := H) (P := P) c) + _ = _ := by + simpa only [a, AddEquiv.symm_apply_apply, toMul_ofMul] using + hAbstract.symm + +/-- The finite abstract field reconstructed from the literal fixed-field +inclusion is the original packaged abstract field. Keeping this structure +equality separate avoids repeatedly rebuilding all of its proof fields. -/ +private theorem + numberFieldEmbeddedFiniteAbstractField_abstractFixedFieldInclusion + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) : + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let j : E →ₐ[ℚ] SeparableClosure ℚ := + E.val.restrictScalars ℚ + numberFieldEmbeddedFiniteAbstractField F E j = H := by + dsimp only + exact FiniteAbstractField.eq_of_field_eq _ _ + (numberFieldEmbeddedBaseSubgroup_abstractFixedFieldInclusion H P) + +/-- Pointwise specification of the idele-class comparison after transporting +the explicitly embedded abstract field to the canonical packaged field. The +transport is kept at the value boundary, so clients never compare the two +dependent additive equivalences themselves. -/ +private theorem + numberFieldEmbeddedIdeleClassEquivAmbientFixed_transport_apply + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (c : Additive + (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) H.field))) : + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let j : E →ₐ[ℚ] SeparableClosure ℚ := + E.val.restrictScalars ℚ + let HEmbedded := + numberFieldEmbeddedFiniteAbstractField F E j + let hHEmbedded : HEmbedded = H := + numberFieldEmbeddedFiniteAbstractField_abstractFixedFieldInclusion H P + Eq.mp + (congrArg + (fun X : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) => + Additive (IdeleClassGroup F) ≃+ + ambientFixedAddSubgroup + rationalIdeleClassRepresentation X.field) + hHEmbedded) + (numberFieldEmbeddedIdeleClassEquivAmbientFixed F E j) c = + rationalAbstractFixedFieldIdeleClassEquivFixed H.field c := by + dsimp only + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let j : E →ₐ[ℚ] SeparableClosure ℚ := + E.val.restrictScalars ℚ + have hBase : + numberFieldEmbeddedBaseSubgroup F E j = H.field := + numberFieldEmbeddedBaseSubgroup_abstractFixedFieldInclusion H P + have hHEmbedded : + numberFieldEmbeddedFiniteAbstractField F E j = H := + numberFieldEmbeddedFiniteAbstractField_abstractFixedFieldInclusion H P + have hFixedBase : + abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup F E j) = F := + congrArg + (abstractFixedField ℚ (SeparableClosure ℚ)) hBase + let eBase : F ≃ₐ[ℚ] F := + (numberFieldEmbeddedAbstractBaseFieldEquiv F E j).trans + (IntermediateField.equivOfEq hFixedBase) + have heBase : + eBase = (AlgEquiv.refl : F ≃ₐ[ℚ] F) := by + apply AlgEquiv.ext + intro x + apply Subtype.ext + change x.1 = x.1 + rfl + let hEmbeddedQuotientFinite := + numberFieldEmbeddedAbsoluteQuotientFinite F E j + let hEmbeddedFixedFiniteDimensional := + numberFieldEmbeddedAbstractFixedFieldFiniteDimensional F E j + apply Subtype.ext + rw [rationalAmbientFixedAddEquiv_transport_apply_val + hHEmbedded + (numberFieldEmbeddedIdeleClassEquivAmbientFixed F E j) c] + dsimp only [numberFieldEmbeddedIdeleClassEquivAmbientFixed] + simp only [AddEquiv.trans_apply] + change + ((rationalIdeleClassEquivFixed + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup F E j))) + (MulEquiv.toAdditive + (ideleClassCongr + (numberFieldEmbeddedAbstractBaseFieldEquiv F E j)) c)).1 = + ((rationalIdeleClassEquivFixed F) c).1 + exact rationalIdeleClassEquivFixed_congr_apply_val + hFixedBase + (numberFieldEmbeddedAbstractBaseFieldEquiv F E j) + heBase c + +/-- Transporting the finite Galois subextension reconstructed from the literal +fixed-field inclusion recovers the canonical subextension packaged by `P`. +This is the sole dependent structure equality used by the later quotient +comparisons. -/ +private theorem + numberFieldEmbeddedFiniteGaloisSubextension_transport_eq + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) : + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let j : E →ₐ[ℚ] SeparableClosure ℚ := + E.val.restrictScalars ℚ + let HEmbedded := + numberFieldEmbeddedFiniteAbstractField F E j + let PEmbedded : FiniteGaloisSubextension HEmbedded.field := + numberFieldEmbeddedFiniteGaloisSubextension F E j + let hHEmbedded : HEmbedded = H := + numberFieldEmbeddedFiniteAbstractField_abstractFixedFieldInclusion H P + Eq.mp + (congrArg + (fun X : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) => + FiniteGaloisSubextension X.field) + hHEmbedded) + PEmbedded = + P.toFiniteGaloisExtension := by + dsimp only + let F := abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let j : E →ₐ[ℚ] SeparableClosure ℚ := E.val.restrictScalars ℚ + let HEmbedded := + numberFieldEmbeddedFiniteAbstractField F E j + let PEmbedded : FiniteGaloisSubextension HEmbedded.field := + numberFieldEmbeddedFiniteGaloisSubextension F E j + have hHEmbedded : HEmbedded = H := + numberFieldEmbeddedFiniteAbstractField_abstractFixedFieldInclusion H P + exact finiteGaloisSubextension_transport_eq_of_field_eq + hHEmbedded PEmbedded P.toFiniteGaloisExtension + (numberFieldEmbeddedTopSubgroup_abstractFixedFieldInclusion H P) + +/-- Opaque endpoint for the extension-quotient comparison supplied by the +literal embedding. Its domain is already the canonical quotient of `P`, so +no client has to reconstruct the two subgroup transports. -/ +private noncomputable def + abstractFixedFieldInclusionEmbeddedExtensionQuotientEquiv + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) : + P.toFiniteGaloisExtension.extensionQuotient ≃* + Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let j : E →ₐ[ℚ] SeparableClosure ℚ := E.val.restrictScalars ℚ + have hBase : + numberFieldEmbeddedBaseSubgroup F E j = H.field := + numberFieldEmbeddedBaseSubgroup_abstractFixedFieldInclusion H P + have hTop : + numberFieldEmbeddedTopSubgroup F E j = P.field := + numberFieldEmbeddedTopSubgroup_abstractFixedFieldInclusion H P + letI hAlgebra : Algebra F (SeparableClosure ℚ) := + numberFieldEmbeddedSeparableClosureAlgebra F E j + let eSep := + numberFieldEmbeddedSeparableClosureEquiv F E j + letI hEmbeddedExtensionNormal : + (CyclicCohomology.extensionSubgroup + (numberFieldEmbeddedBaseSubgroup F E j) + (numberFieldEmbeddedTopSubgroup F E j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup F E j)).Normal := + numberFieldEmbeddedExtensionSubgroup_normal F E j + exact + P.toFiniteGaloisExtension.extensionQuotientMulEquiv.trans + ((extensionQuotientMulEquivOfEq + hBase.symm hTop.symm P.below + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup F E j)).trans + (ambientEmbeddedExtensionQuotientEquivGaloisGroup + ℚ F E j eSep)) + +/-- Opaque canonical endpoint for the same quotient, obtained directly from +the abstract fixed-field realization. -/ +private noncomputable def + abstractFixedFieldInclusionCanonicalExtensionQuotientEquiv + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) : + P.toFiniteGaloisExtension.extensionQuotient ≃* + Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := by + exact + P.toFiniteGaloisExtension.extensionQuotientMulEquiv.trans + (abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) + H.field P.field P.below P.normal) + +/-- Pointwise opaque endpoint of the embedded quotient equivalence. -/ +private noncomputable def + abstractFixedFieldInclusionEmbeddedExtensionQuotientValue + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (q : P.toFiniteGaloisExtension.extensionQuotient) : + Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := + abstractFixedFieldInclusionEmbeddedExtensionQuotientEquiv H P q + +/-- Pointwise opaque endpoint of the canonical quotient equivalence. -/ +private noncomputable def + abstractFixedFieldInclusionCanonicalExtensionQuotientValue + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (q : P.toFiniteGaloisExtension.extensionQuotient) : + Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := + abstractFixedFieldInclusionCanonicalExtensionQuotientEquiv H P q + +/-- Fully applied ambient value of the embedded quotient endpoint. -/ +private noncomputable def + abstractFixedFieldInclusionEmbeddedExtensionQuotientApplyVal + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (q : P.toFiniteGaloisExtension.extensionQuotient) + (x : abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) : SeparableClosure ℚ := + (abstractFixedFieldInclusionEmbeddedExtensionQuotientValue H P q x : + SeparableClosure ℚ) + +/-- Fully applied ambient value of the canonical quotient endpoint. -/ +private noncomputable def + abstractFixedFieldInclusionCanonicalExtensionQuotientApplyVal + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (q : P.toFiniteGaloisExtension.extensionQuotient) + (x : abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) : SeparableClosure ℚ := + (abstractFixedFieldInclusionCanonicalExtensionQuotientValue H P q x : + SeparableClosure ℚ) + +/-- The ambient Galois value attached to a representative of the canonical +quotient, packaged behind a literal result type. -/ +private noncomputable def + abstractFixedFieldInclusionAmbientEmbeddedQuotientMkValue + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (σ : H.field.toSubgroup) : + Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let j : E →ₐ[ℚ] SeparableClosure ℚ := E.val.restrictScalars ℚ + have hBase : + numberFieldEmbeddedBaseSubgroup F E j = H.field := + numberFieldEmbeddedBaseSubgroup_abstractFixedFieldInclusion H P + letI hAlgebra : Algebra F (SeparableClosure ℚ) := + numberFieldEmbeddedSeparableClosureAlgebra F E j + let eSep := + numberFieldEmbeddedSeparableClosureEquiv F E j + letI hEmbeddedExtensionNormal : + (CyclicCohomology.extensionSubgroup + (numberFieldEmbeddedBaseSubgroup F E j) + (numberFieldEmbeddedTopSubgroup F E j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup F E j)).Normal := + numberFieldEmbeddedExtensionSubgroup_normal F E j + let σEmbedded : + (numberFieldEmbeddedBaseSubgroup F E j).toSubgroup := + (MulEquiv.subgroupCongr + (congrArg ClosedSubgroup.toSubgroup hBase.symm)) σ + exact + ambientEmbeddedExtensionQuotientEquivGaloisGroup + ℚ F E j eSep (QuotientGroup.mk σEmbedded) + +/-- Fully applied ambient value of the packaged representative endpoint. -/ +private noncomputable def + abstractFixedFieldInclusionAmbientEmbeddedQuotientMkApplyVal + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (σ : H.field.toSubgroup) + (x : abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) : SeparableClosure ℚ := + (abstractFixedFieldInclusionAmbientEmbeddedQuotientMkValue H P σ x : + SeparableClosure ℚ) + +/-- Ambient action of the representative after rebundling it in the embedded +base subgroup. -/ +private noncomputable def + abstractFixedFieldInclusionRebasedAutomorphismApplyVal + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (σ : H.field.toSubgroup) + (x : abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) : SeparableClosure ℚ := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let j : E →ₐ[ℚ] SeparableClosure ℚ := E.val.restrictScalars ℚ + have hBase : + numberFieldEmbeddedBaseSubgroup F E j = H.field := + numberFieldEmbeddedBaseSubgroup_abstractFixedFieldInclusion H P + let σEmbedded : + (numberFieldEmbeddedBaseSubgroup F E j).toSubgroup := + (MulEquiv.subgroupCongr + (congrArg ClosedSubgroup.toSubgroup hBase.symm)) σ + exact σEmbedded.1.1 (x : SeparableClosure ℚ) + +/-- The embedded quotient endpoint sends a canonical representative to the +packaged ambient value above. -/ +private theorem + abstractFixedFieldInclusionEmbeddedExtensionQuotientValue_mk + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (σ : H.field.toSubgroup) : + abstractFixedFieldInclusionEmbeddedExtensionQuotientValue H P + (P.toFiniteGaloisExtension.extensionQuotientMk σ) = + abstractFixedFieldInclusionAmbientEmbeddedQuotientMkValue H P σ := by + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let j : E →ₐ[ℚ] SeparableClosure ℚ := + E.val.restrictScalars ℚ + have hBase : + numberFieldEmbeddedBaseSubgroup F E j = H.field := + numberFieldEmbeddedBaseSubgroup_abstractFixedFieldInclusion H P + have hTop : + numberFieldEmbeddedTopSubgroup F E j = P.field := + numberFieldEmbeddedTopSubgroup_abstractFixedFieldInclusion H P + let hAlgebra : Algebra F (SeparableClosure ℚ) := + numberFieldEmbeddedSeparableClosureAlgebra F E j + let eSep := + numberFieldEmbeddedSeparableClosureEquiv F E j + let hEmbeddedExtensionNormal : + (CyclicCohomology.extensionSubgroup + (numberFieldEmbeddedBaseSubgroup F E j) + (numberFieldEmbeddedTopSubgroup F E j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup F E j)).Normal := + numberFieldEmbeddedExtensionSubgroup_normal F E j + simp only [ + abstractFixedFieldInclusionEmbeddedExtensionQuotientValue, + abstractFixedFieldInclusionEmbeddedExtensionQuotientEquiv, + abstractFixedFieldInclusionAmbientEmbeddedQuotientMkValue, + MulEquiv.trans_apply, + FiniteGaloisSubextension.extensionQuotientMk_apply] + exact congrArg + (ambientEmbeddedExtensionQuotientEquivGaloisGroup ℚ F E j eSep) + (extensionQuotientMulEquivOfEq_mk + hBase.symm hTop.symm P.below + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup F E j) σ) + +/-- The packaged ambient endpoint evaluates to the action of the rebundled +representative. -/ +private theorem + abstractFixedFieldInclusionAmbientEmbeddedQuotientMkApplyVal_eq_rebased + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (σ : H.field.toSubgroup) + (x : abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) : + abstractFixedFieldInclusionAmbientEmbeddedQuotientMkApplyVal H P σ x = + abstractFixedFieldInclusionRebasedAutomorphismApplyVal H P σ x := by + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let j : E →ₐ[ℚ] SeparableClosure ℚ := + E.val.restrictScalars ℚ + have hBase : + numberFieldEmbeddedBaseSubgroup F E j = H.field := + numberFieldEmbeddedBaseSubgroup_abstractFixedFieldInclusion H P + let hAlgebra : Algebra F (SeparableClosure ℚ) := + numberFieldEmbeddedSeparableClosureAlgebra F E j + let eSep := + numberFieldEmbeddedSeparableClosureEquiv F E j + let hEmbeddedExtensionNormal : + (CyclicCohomology.extensionSubgroup + (numberFieldEmbeddedBaseSubgroup F E j) + (numberFieldEmbeddedTopSubgroup F E j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup F E j)).Normal := + numberFieldEmbeddedExtensionSubgroup_normal F E j + let σEmbedded : + (numberFieldEmbeddedBaseSubgroup F E j).toSubgroup := + (MulEquiv.subgroupCongr + (congrArg ClosedSubgroup.toSubgroup hBase.symm)) σ + have hmk := + ambientEmbeddedExtensionQuotientEquivGaloisGroup_mk_apply + ℚ F E j eSep σEmbedded x + change + (ambientEmbeddedExtensionQuotientEquivGaloisGroup + ℚ F E j eSep (QuotientGroup.mk σEmbedded) x : + SeparableClosure ℚ) = + σEmbedded.1.1 (x : SeparableClosure ℚ) at hmk + simpa only [ + abstractFixedFieldInclusionAmbientEmbeddedQuotientMkApplyVal, + abstractFixedFieldInclusionAmbientEmbeddedQuotientMkValue, + abstractFixedFieldInclusionRebasedAutomorphismApplyVal] using hmk + +/-- Rebundling the representative does not change its action in the ambient +separable closure. -/ +private theorem + abstractFixedFieldInclusionRebasedAutomorphismApplyVal_eq + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (σ : H.field.toSubgroup) + (x : abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) : + abstractFixedFieldInclusionRebasedAutomorphismApplyVal H P σ x = + σ.1.1 (x : SeparableClosure ℚ) := by + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let j : E →ₐ[ℚ] SeparableClosure ℚ := + E.val.restrictScalars ℚ + have hBase : + numberFieldEmbeddedBaseSubgroup F E j = H.field := + numberFieldEmbeddedBaseSubgroup_abstractFixedFieldInclusion H P + let σEmbedded : + (numberFieldEmbeddedBaseSubgroup F E j).toSubgroup := + (MulEquiv.subgroupCongr + (congrArg ClosedSubgroup.toSubgroup hBase.symm)) σ + have hσEmbedded : + (σEmbedded.1 : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) = σ.1 := + closedSubgroupCongr_apply_val hBase.symm σ + change σEmbedded.1.1 (x : SeparableClosure ℚ) = _ + rw [hσEmbedded] + +/-- The packaged ambient representative acts by the original automorphism on +the underlying separable-closure value. -/ +private theorem + abstractFixedFieldInclusionAmbientEmbeddedQuotientMkValue_apply + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (σ : H.field.toSubgroup) + (x : abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) : + abstractFixedFieldInclusionAmbientEmbeddedQuotientMkApplyVal H P σ x = + σ.1.1 (x : SeparableClosure ℚ) := by + exact + (abstractFixedFieldInclusionAmbientEmbeddedQuotientMkApplyVal_eq_rebased + H P σ x).trans + (abstractFixedFieldInclusionRebasedAutomorphismApplyVal_eq H P σ x) + +/-- Evaluation of the embedded quotient endpoint on a canonical quotient +representative, stated only in the ambient separable closure. -/ +private theorem + abstractFixedFieldInclusionEmbeddedExtensionQuotientEquiv_mk_val + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (σ : H.field.toSubgroup) + (x : abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) : + abstractFixedFieldInclusionEmbeddedExtensionQuotientApplyVal H P + (P.toFiniteGaloisExtension.extensionQuotientMk σ) x = + σ.1.1 (x : SeparableClosure ℚ) := by + calc + _ = abstractFixedFieldInclusionAmbientEmbeddedQuotientMkApplyVal + H P σ x := by + exact congrArg + (fun g => (g x : SeparableClosure ℚ)) + (abstractFixedFieldInclusionEmbeddedExtensionQuotientValue_mk + H P σ) + _ = _ := + abstractFixedFieldInclusionAmbientEmbeddedQuotientMkValue_apply + H P σ x + +/-- Evaluation of the canonical abstract quotient endpoint on a quotient +representative, again exposed only through its ambient value. -/ +private theorem + abstractFixedFieldInclusionCanonicalExtensionQuotientEquiv_mk_val + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (σ : H.field.toSubgroup) + (x : abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below) : + abstractFixedFieldInclusionCanonicalExtensionQuotientApplyVal H P + (P.toFiniteGaloisExtension.extensionQuotientMk σ) x = + σ.1.1 (x : SeparableClosure ℚ) := by + simp only [ + abstractFixedFieldInclusionCanonicalExtensionQuotientApplyVal, + abstractFixedFieldInclusionCanonicalExtensionQuotientValue, + abstractFixedFieldInclusionCanonicalExtensionQuotientEquiv, + MulEquiv.trans_apply, + FiniteGaloisSubextension.extensionQuotientMk_apply] + exact + (abstractExtensionQuotientEquivGaloisGroup_mk_apply_val + ℚ (SeparableClosure ℚ) + H.field P.field P.below P.normal σ x).symm + +/-- The embedded and canonical quotient endpoints agree on each quotient +class. This pointwise boundary is intentionally weaker than equality of the +dependent `MulEquiv` structures. -/ +private theorem + abstractFixedFieldInclusionExtensionQuotientEquiv_apply + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (q : P.toFiniteGaloisExtension.extensionQuotient) : + abstractFixedFieldInclusionEmbeddedExtensionQuotientValue H P q = + abstractFixedFieldInclusionCanonicalExtensionQuotientValue H P q := by + refine P.toFiniteGaloisExtension.extensionQuotient_inductionOn + (motive := fun q => + abstractFixedFieldInclusionEmbeddedExtensionQuotientValue H P q = + abstractFixedFieldInclusionCanonicalExtensionQuotientValue H P q) + q ?_ + intro σ + apply AlgEquiv.ext + intro x + apply Subtype.ext + exact + (abstractFixedFieldInclusionEmbeddedExtensionQuotientEquiv_mk_val + H P σ x).trans + (abstractFixedFieldInclusionCanonicalExtensionQuotientEquiv_mk_val + H P σ x).symm + +/-- Opaque quotient endpoint obtained by transporting the explicitly embedded +finite Galois subextension back to the canonical package. -/ +private noncomputable def + abstractFixedFieldInclusionTransportedExtensionQuotientEquiv + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) : + P.toFiniteGaloisExtension.extensionQuotient ≃* + Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := by + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let j : E →ₐ[ℚ] SeparableClosure ℚ := + E.val.restrictScalars ℚ + let HEmbedded := + numberFieldEmbeddedFiniteAbstractField F E j + let PEmbedded : FiniteGaloisSubextension HEmbedded.field := + numberFieldEmbeddedFiniteGaloisSubextension F E j + have hHEmbedded : HEmbedded = H := + numberFieldEmbeddedFiniteAbstractField_abstractFixedFieldInclusion H P + have hPEmbedded : + Eq.mp + (congrArg + (fun X : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) => + FiniteGaloisSubextension X.field) + hHEmbedded) + PEmbedded = + P.toFiniteGaloisExtension := + numberFieldEmbeddedFiniteGaloisSubextension_transport_eq H P + exact + (extensionQuotientMulEquiv_transportFiniteGalois + hHEmbedded PEmbedded hPEmbedded).trans + (numberFieldEmbeddedExtensionQuotientEquivGaloisGroup F E j) + +/-- Pointwise opaque endpoint of the transported quotient equivalence. -/ +private noncomputable def + abstractFixedFieldInclusionTransportedExtensionQuotientValue + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (q : P.toFiniteGaloisExtension.extensionQuotient) : + Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := + abstractFixedFieldInclusionTransportedExtensionQuotientEquiv H P q + +/-- Transporting a canonical representative of the embedded finite Galois +package preserves its Galois value. -/ +private theorem + abstractFixedFieldInclusionTransportedExtensionQuotientValue_mk + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (σ : H.field.toSubgroup) : + abstractFixedFieldInclusionTransportedExtensionQuotientValue H P + (P.toFiniteGaloisExtension.extensionQuotientMk σ) = + abstractFixedFieldInclusionEmbeddedExtensionQuotientValue H P + (P.toFiniteGaloisExtension.extensionQuotientMk σ) := by + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let j : E →ₐ[ℚ] SeparableClosure ℚ := + E.val.restrictScalars ℚ + have hBase : + numberFieldEmbeddedBaseSubgroup F E j = H.field := + numberFieldEmbeddedBaseSubgroup_abstractFixedFieldInclusion H P + have hTop : + numberFieldEmbeddedTopSubgroup F E j = P.field := + numberFieldEmbeddedTopSubgroup_abstractFixedFieldInclusion H P + let HEmbedded := + numberFieldEmbeddedFiniteAbstractField F E j + let PEmbedded : FiniteGaloisSubextension HEmbedded.field := + numberFieldEmbeddedFiniteGaloisSubextension F E j + have hHEmbedded : HEmbedded = H := + numberFieldEmbeddedFiniteAbstractField_abstractFixedFieldInclusion H P + have hPEmbedded : + Eq.mp + (congrArg + (fun X : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) => + FiniteGaloisSubextension X.field) + hHEmbedded) + PEmbedded = + P.toFiniteGaloisExtension := + numberFieldEmbeddedFiniteGaloisSubextension_transport_eq H P + let hAlgebra : Algebra F (SeparableClosure ℚ) := + numberFieldEmbeddedSeparableClosureAlgebra F E j + let eSep := + numberFieldEmbeddedSeparableClosureEquiv F E j + let hEmbeddedExtensionNormal : + (CyclicCohomology.extensionSubgroup + (numberFieldEmbeddedBaseSubgroup F E j) + (numberFieldEmbeddedTopSubgroup F E j) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup F E j)).Normal := + numberFieldEmbeddedExtensionSubgroup_normal F E j + have hFieldEq : + (congrArg FiniteAbstractField.field hHEmbedded).symm = hBase.symm := + Subsingleton.elim _ _ + simp only [ + abstractFixedFieldInclusionTransportedExtensionQuotientValue, + abstractFixedFieldInclusionEmbeddedExtensionQuotientValue, + abstractFixedFieldInclusionTransportedExtensionQuotientEquiv, + abstractFixedFieldInclusionEmbeddedExtensionQuotientEquiv, + MulEquiv.trans_apply, + extensionQuotientMulEquiv_transportFiniteGalois_mk, + FiniteGaloisSubextension.extensionQuotientMk_apply, + numberFieldEmbeddedExtensionQuotientEquivGaloisGroup] + rw [hFieldEq] + change + ambientEmbeddedExtensionQuotientEquivGaloisGroup ℚ F E j eSep + (QuotientGroup.mk + ((MulEquiv.subgroupCongr + (congrArg ClosedSubgroup.toSubgroup hBase.symm)) σ)) = _ + exact + (congrArg + (ambientEmbeddedExtensionQuotientEquivGaloisGroup ℚ F E j eSep) + (extensionQuotientMulEquivOfEq_mk + hBase.symm hTop.symm P.below + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup F E j) σ)).symm + +/-- Transporting the embedded finite Galois package preserves the value of +its extension-quotient comparison. -/ +private theorem + abstractFixedFieldInclusionTransportedExtensionQuotientEquiv_apply + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (q : P.toFiniteGaloisExtension.extensionQuotient) : + abstractFixedFieldInclusionTransportedExtensionQuotientValue H P q = + abstractFixedFieldInclusionEmbeddedExtensionQuotientValue H P q := by + refine P.toFiniteGaloisExtension.extensionQuotient_inductionOn + (motive := fun q => + abstractFixedFieldInclusionTransportedExtensionQuotientValue H P q = + abstractFixedFieldInclusionEmbeddedExtensionQuotientValue H P q) + q ?_ + intro σ + exact abstractFixedFieldInclusionTransportedExtensionQuotientValue_mk + H P σ + +/-- Opaque abelianized equivalence obtained by transporting the explicitly +embedded finite Galois package to the canonical one. -/ +private noncomputable def + abstractFixedFieldInclusionTransportedAbelianizedEquiv + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) : + Additive + (Abelianization + P.toFiniteGaloisExtension.extensionQuotient) ≃+ + Additive + (Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) + H.field))) := by + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let j : E →ₐ[ℚ] SeparableClosure ℚ := + E.val.restrictScalars ℚ + let HEmbedded := + numberFieldEmbeddedFiniteAbstractField F E j + let PEmbedded : FiniteGaloisSubextension HEmbedded.field := + numberFieldEmbeddedFiniteGaloisSubextension F E j + have hHEmbedded : HEmbedded = H := + numberFieldEmbeddedFiniteAbstractField_abstractFixedFieldInclusion H P + have hPEmbedded : + Eq.mp + (congrArg + (fun X : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) => + FiniteGaloisSubextension X.field) + hHEmbedded) + PEmbedded = + P.toFiniteGaloisExtension := + numberFieldEmbeddedFiniteGaloisSubextension_transport_eq H P + exact + abelianizedExtensionQuotientAddEquiv_transportExtension hPEmbedded + (abelianizedExtensionQuotientAddEquiv_transportBase + hHEmbedded PEmbedded + (numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisGroup + F E j)) + +/-- Canonical abelianization comparison built from the already transported +opaque extension-quotient endpoint. -/ +private noncomputable def + abstractFixedFieldInclusionTransportedCanonicalAbelianizedEquiv + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) : + Additive + (Abelianization + P.toFiniteGaloisExtension.extensionQuotient) ≃+ + Additive + (Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) + H.field))) := by + let Q := + Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) + exact + MulEquiv.toAdditive + ((MulEquiv.abelianizationCongr + (abstractFixedFieldInclusionTransportedExtensionQuotientEquiv H P)).trans + (Abelianization.equivOfComm : Q ≃* Abelianization Q).symm) + +/-- Pointwise opaque value of the transported abelianized equivalence. -/ +private noncomputable def + abstractFixedFieldInclusionTransportedAbelianizedValue + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (z : Additive + (Abelianization P.toFiniteGaloisExtension.extensionQuotient)) : + Additive + (Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := + abstractFixedFieldInclusionTransportedAbelianizedEquiv H P z + +/-- Pointwise opaque value of the canonical abelianization comparison built +from the transported quotient endpoint. -/ +private noncomputable def + abstractFixedFieldInclusionTransportedCanonicalAbelianizedValue + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (z : Additive + (Abelianization P.toFiniteGaloisExtension.extensionQuotient)) : + Additive + (Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := + abstractFixedFieldInclusionTransportedCanonicalAbelianizedEquiv H P z + +/-- Pointwise opaque value of the intrinsic abstract fixed-field +abelianization comparison. -/ +private noncomputable def + abstractFixedFieldInclusionCanonicalAbelianizedValue + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (z : Additive + (Abelianization P.toFiniteGaloisExtension.extensionQuotient)) : + Additive + (Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := + abstractFixedFieldAbelianizedExtensionQuotientEquivGaloisGroup H P z + +/-- The transported abelianized endpoint agrees pointwise with the canonical +abelianization comparison built from the transported quotient endpoint. -/ +private theorem + abstractFixedFieldInclusionTransportedAbelianizedValue_eq_canonical + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (z : Additive + (Abelianization P.toFiniteGaloisExtension.extensionQuotient)) : + abstractFixedFieldInclusionTransportedAbelianizedValue H P z = + abstractFixedFieldInclusionTransportedCanonicalAbelianizedValue + H P z := by + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let j : E →ₐ[ℚ] SeparableClosure ℚ := + E.val.restrictScalars ℚ + let HEmbedded := + numberFieldEmbeddedFiniteAbstractField F E j + let PEmbedded : FiniteGaloisSubextension HEmbedded.field := + numberFieldEmbeddedFiniteGaloisSubextension F E j + have hHEmbedded : HEmbedded = H := + numberFieldEmbeddedFiniteAbstractField_abstractFixedFieldInclusion H P + have hPEmbedded : + Eq.mp + (congrArg + (fun X : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) => + FiniteGaloisSubextension X.field) + hHEmbedded) + PEmbedded = + P.toFiniteGaloisExtension := + numberFieldEmbeddedFiniteGaloisSubextension_transport_eq H P + let qEmbedded : PEmbedded.extensionQuotient ≃* Gal(E/F) := + numberFieldEmbeddedExtensionQuotientEquivGaloisGroup F E j + have hCanonical : + abstractFixedFieldInclusionTransportedAbelianizedEquiv H P = + abstractFixedFieldInclusionTransportedCanonicalAbelianizedEquiv + H P := by + simpa only [ + abstractFixedFieldInclusionTransportedAbelianizedEquiv, + abstractFixedFieldInclusionTransportedCanonicalAbelianizedEquiv, + abstractFixedFieldInclusionTransportedExtensionQuotientEquiv, + numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisGroup, + qEmbedded] using + (abelianizedCanonicalEquiv_transportFiniteGalois + hHEmbedded PEmbedded hPEmbedded qEmbedded) + exact DFunLike.congr_fun hCanonical z + +/-- On an abelianization representative, the transported canonical endpoint +is the additive value of the transported quotient endpoint. -/ +private theorem + abstractFixedFieldInclusionTransportedCanonicalAbelianizedValue_of + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (q : P.toFiniteGaloisExtension.extensionQuotient) : + abstractFixedFieldInclusionTransportedCanonicalAbelianizedValue H P + (Additive.ofMul (Abelianization.of q)) = + Additive.ofMul + (abstractFixedFieldInclusionTransportedExtensionQuotientValue + H P q) := by + simpa only [ + abstractFixedFieldInclusionTransportedCanonicalAbelianizedValue, + abstractFixedFieldInclusionTransportedCanonicalAbelianizedEquiv, + abstractFixedFieldInclusionTransportedExtensionQuotientValue] using + (abelianizationCongrToComm_apply + (abstractFixedFieldInclusionTransportedExtensionQuotientEquiv H P) q) + +/-- On the same representative, the intrinsic fixed-field endpoint is the +additive value of the canonical quotient endpoint. -/ +private theorem + abstractFixedFieldInclusionCanonicalAbelianizedValue_of + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (q : P.toFiniteGaloisExtension.extensionQuotient) : + abstractFixedFieldInclusionCanonicalAbelianizedValue H P + (Additive.ofMul (Abelianization.of q)) = + Additive.ofMul + (abstractFixedFieldInclusionCanonicalExtensionQuotientValue + H P q) := by + let hRawQuotientCommGroup : + CommGroup P.toFiniteGaloisExtension.extensionQuotient := + { (inferInstance : + Group P.toFiniteGaloisExtension.extensionQuotient) with + mul_comm := P.commutative.is_comm.comm } + let qAbstractRaw := + abstractFixedFieldInclusionCanonicalExtensionQuotientEquiv H P + change + MulEquiv.toAdditive + ((Abelianization.equivOfComm : + P.toFiniteGaloisExtension.extensionQuotient ≃* + Abelianization + P.toFiniteGaloisExtension.extensionQuotient).symm.trans + qAbstractRaw) + (Additive.ofMul (Abelianization.of q)) = + Additive.ofMul (qAbstractRaw q) + exact commutativeAbelianizationEquiv_apply qAbstractRaw q + +/-- The canonical abelianization comparison built after transport agrees +pointwise with the intrinsic abstract fixed-field comparison. -/ +private theorem + abstractFixedFieldInclusionTransportedCanonicalAbelianizedValue_eq + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (z : Additive + (Abelianization P.toFiniteGaloisExtension.extensionQuotient)) : + abstractFixedFieldInclusionTransportedCanonicalAbelianizedValue H P z = + abstractFixedFieldInclusionCanonicalAbelianizedValue H P z := by + let q : P.toFiniteGaloisExtension.extensionQuotient := + Quotient.out z.toMul + have hz : Additive.ofMul (Abelianization.of q) = z := by + apply Additive.ext + exact Quotient.out_eq' z.toMul + rw [← hz] + calc + _ = Additive.ofMul + (abstractFixedFieldInclusionTransportedExtensionQuotientValue + H P q) := + abstractFixedFieldInclusionTransportedCanonicalAbelianizedValue_of + H P q + _ = Additive.ofMul + (abstractFixedFieldInclusionEmbeddedExtensionQuotientValue + H P q) := + congrArg Additive.ofMul + (abstractFixedFieldInclusionTransportedExtensionQuotientEquiv_apply + H P q) + _ = Additive.ofMul + (abstractFixedFieldInclusionCanonicalExtensionQuotientValue + H P q) := + congrArg Additive.ofMul + (abstractFixedFieldInclusionExtensionQuotientEquiv_apply H P q) + _ = _ := + (abstractFixedFieldInclusionCanonicalAbelianizedValue_of H P q).symm + +/-- The transported abelianized equivalence agrees pointwise with the +intrinsic abstract fixed-field Galois comparison. -/ +private theorem + abstractFixedFieldInclusionTransportedAbelianizedValue_eq + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (z : Additive + (Abelianization P.toFiniteGaloisExtension.extensionQuotient)) : + abstractFixedFieldInclusionTransportedAbelianizedValue H P z = + abstractFixedFieldInclusionCanonicalAbelianizedValue H P z := + (abstractFixedFieldInclusionTransportedAbelianizedValue_eq_canonical + H P z).trans + (abstractFixedFieldInclusionTransportedCanonicalAbelianizedValue_eq + H P z) + +/-- Opaque packaged norm-residue value before transporting the explicitly +embedded abstract field and finite Galois package. -/ +private noncomputable def + abstractFixedFieldInclusionEmbeddedNormResidueValue + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (c : Additive + (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) H.field))) : + Additive + (Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) + := by + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let j : E →ₐ[ℚ] SeparableClosure ℚ := + E.val.restrictScalars ℚ + let HEmbedded := + numberFieldEmbeddedFiniteAbstractField F E j + let PEmbedded : FiniteGaloisSubextension HEmbedded.field := + numberFieldEmbeddedFiniteGaloisSubextension F E j + exact + rationalFiniteNormResidueValue HEmbedded PEmbedded + (numberFieldEmbeddedIdeleClassEquivAmbientFixed F E j) + (numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisGroup + F E j) + c + +/-- Opaque packaged value after transporting both dependent structures to +the canonical `H` and `P` endpoints. -/ +private noncomputable def + abstractFixedFieldInclusionTransportedNormResidueValue + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (c : Additive + (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) H.field))) : + Additive + (Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) + := by + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let j : E →ₐ[ℚ] SeparableClosure ℚ := + E.val.restrictScalars ℚ + let HEmbedded := + numberFieldEmbeddedFiniteAbstractField F E j + have hHEmbedded : HEmbedded = H := + numberFieldEmbeddedFiniteAbstractField_abstractFixedFieldInclusion H P + let eIdeleEmbedded := + numberFieldEmbeddedIdeleClassEquivAmbientFixed F E j + let eIdeleOverH : + Additive (IdeleClassGroup F) ≃+ + ambientFixedAddSubgroup rationalIdeleClassRepresentation H.field := + Eq.mp + (congrArg + (fun X : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) => + Additive (IdeleClassGroup F) ≃+ + ambientFixedAddSubgroup + rationalIdeleClassRepresentation X.field) + hHEmbedded) + eIdeleEmbedded + exact + rationalFiniteNormResidueValue H P.toFiniteGaloisExtension + eIdeleOverH + (abstractFixedFieldInclusionTransportedAbelianizedEquiv H P) + c + +/-- Opaque intrinsic packaged norm-residue value at the canonical endpoints. -/ +private noncomputable def + abstractFixedFieldInclusionCanonicalNormResidueValue + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (c : Additive + (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) H.field))) : + Additive + (Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := + rationalFiniteNormResidueValue H P.toFiniteGaloisExtension + (rationalAbstractFixedFieldIdeleClassEquivFixed H.field) + (abstractFixedFieldAbelianizedExtensionQuotientEquivGaloisGroup H P) + c + +/-- Simultaneous transport of the embedded abstract field and finite Galois +package sends the embedded norm-residue value to the transported endpoint. -/ +private theorem + abstractFixedFieldInclusionEmbeddedNormResidueValue_eq_transported + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (c : Additive + (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) H.field))) : + abstractFixedFieldInclusionEmbeddedNormResidueValue H P c = + abstractFixedFieldInclusionTransportedNormResidueValue H P c := by + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let j : E →ₐ[ℚ] SeparableClosure ℚ := + E.val.restrictScalars ℚ + let HEmbedded := + numberFieldEmbeddedFiniteAbstractField F E j + let PEmbedded : FiniteGaloisSubextension HEmbedded.field := + numberFieldEmbeddedFiniteGaloisSubextension F E j + have hHEmbedded : HEmbedded = H := + numberFieldEmbeddedFiniteAbstractField_abstractFixedFieldInclusion H P + have hPEmbedded : + Eq.mp + (congrArg + (fun X : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) => + FiniteGaloisSubextension X.field) + hHEmbedded) + PEmbedded = + P.toFiniteGaloisExtension := + numberFieldEmbeddedFiniteGaloisSubextension_transport_eq H P + let eIdeleEmbedded := + numberFieldEmbeddedIdeleClassEquivAmbientFixed F E j + let eGaloisEmbedded := + numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisGroup F E j + simpa only [ + abstractFixedFieldInclusionEmbeddedNormResidueValue, + abstractFixedFieldInclusionTransportedNormResidueValue, + abstractFixedFieldInclusionTransportedAbelianizedEquiv, + eIdeleEmbedded, + eGaloisEmbedded] using + (rationalFiniteNormResidueValue_transportToAbstractExtension + (H := H) (P := P) + (A := HEmbedded) + (C := Additive (IdeleClassGroup F)) + (X := Additive Gal(E/F)) + hHEmbedded PEmbedded hPEmbedded + eIdeleEmbedded eGaloisEmbedded c) + +/-- A packaged finite norm-residue value depends only on the value of its +idele comparison at the chosen input and the value of its Galois comparison +at the resulting norm class. -/ +private theorem rationalFiniteNormResidueValue_congr_apply + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteGaloisSubextension K.field) + {C X : Type} [AddGroup C] [AddGroup X] + (eIdele eIdele' : C ≃+ + ambientFixedAddSubgroup rationalIdeleClassRepresentation K.field) + (eGalois eGalois' : + Additive (Abelianization L.extensionQuotient) ≃+ X) + (c : C) + (heIdele : eIdele c = eIdele' c) + (heGalois : ∀ z, eGalois z = eGalois' z) : + rationalFiniteNormResidueValue K L eIdele eGalois c = + rationalFiniteNormResidueValue K L eIdele' eGalois' c := by + unfold rationalFiniteNormResidueValue + rw [heIdele] + exact heGalois _ + +/-- The transported packaged value is the intrinsic canonical packaged value; +only the idele input and the eventual abelianized value are compared. -/ +private theorem + abstractFixedFieldInclusionTransportedNormResidueValue_eq_canonical + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (c : Additive + (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) H.field))) : + abstractFixedFieldInclusionTransportedNormResidueValue H P c = + abstractFixedFieldInclusionCanonicalNormResidueValue H P c := by + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let j : E →ₐ[ℚ] SeparableClosure ℚ := + E.val.restrictScalars ℚ + let HEmbedded := + numberFieldEmbeddedFiniteAbstractField F E j + have hHEmbedded : HEmbedded = H := + numberFieldEmbeddedFiniteAbstractField_abstractFixedFieldInclusion H P + let eIdeleEmbedded := + numberFieldEmbeddedIdeleClassEquivAmbientFixed F E j + let eIdeleOverH : + Additive (IdeleClassGroup F) ≃+ + ambientFixedAddSubgroup rationalIdeleClassRepresentation H.field := + Eq.mp + (congrArg + (fun X : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) => + Additive (IdeleClassGroup F) ≃+ + ambientFixedAddSubgroup + rationalIdeleClassRepresentation X.field) + hHEmbedded) + eIdeleEmbedded + simpa only [ + abstractFixedFieldInclusionTransportedNormResidueValue, + abstractFixedFieldInclusionCanonicalNormResidueValue, + eIdeleEmbedded, + eIdeleOverH] using + (rationalFiniteNormResidueValue_congr_apply + H P.toFiniteGaloisExtension + eIdeleOverH + (rationalAbstractFixedFieldIdeleClassEquivFixed H.field) + (abstractFixedFieldInclusionTransportedAbelianizedEquiv H P) + (abstractFixedFieldAbelianizedExtensionQuotientEquivGaloisGroup H P) + c + (numberFieldEmbeddedIdeleClassEquivAmbientFixed_transport_apply H P c) + (fun z => abstractFixedFieldInclusionTransportedAbelianizedValue_eq + H P z)) + +/-- The explicitly embedded and intrinsic packaged norm-residue values agree. -/ +private theorem + abstractFixedFieldInclusionEmbeddedNormResidueValue_eq + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) + (c : Additive + (IdeleClassGroup + (abstractFixedField ℚ (SeparableClosure ℚ) H.field))) : + abstractFixedFieldInclusionEmbeddedNormResidueValue H P c = + abstractFixedFieldInclusionCanonicalNormResidueValue H P c := + (abstractFixedFieldInclusionEmbeddedNormResidueValue_eq_transported + H P c).trans + (abstractFixedFieldInclusionTransportedNormResidueValue_eq_canonical + H P c) + +/-- For the literal fixed fields attached to an abstract finite abelian +extension, the norm-residue map obtained from their canonical inclusion in +the rational separable closure is the intrinsic fixed-field norm-residue +map. -/ +theorem + globalNormResidueMonoidHomOfEmbedding_abstractFixedFieldInclusion + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (P : FiniteAbelianSubextension H.field) : + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H.field + let E := + abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let j : E →ₐ[ℚ] SeparableClosure ℚ := + E.val.restrictScalars ℚ + globalNormResidueMonoidHomOfEmbedding F E j = + abstractFixedFieldGlobalNormResidueMonoidHom H P := by + dsimp only + apply MonoidHom.ext + intro c + rw [globalNormResidueMonoidHomOfEmbedding_apply] + change + Additive.toMul + (abstractFixedFieldInclusionEmbeddedNormResidueValue + H P (Additive.ofMul c)) = + abstractFixedFieldGlobalNormResidueMonoidHom H P c + calc + _ = Additive.toMul + (abstractFixedFieldInclusionCanonicalNormResidueValue + H P (Additive.ofMul c)) := + congrArg Additive.toMul + (abstractFixedFieldInclusionEmbeddedNormResidueValue_eq + H P (Additive.ofMul c)) + _ = _ := by + simpa only [abstractFixedFieldInclusionCanonicalNormResidueValue] using + (rationalFiniteNormResidueValue_abstractFixedField_apply + (H := H) (P := P) c) + +end AbstractFixedFieldInclusion + +section EmbeddedNumberFieldRestriction + +variable + (K K' L L' : Type) + [Field K] [NumberField K] + [Field K'] [NumberField K'] + [Field L] [NumberField L] + [Field L'] [NumberField L'] + [Algebra K K'] [Algebra K L] [Algebra K L'] + [Algebra K' L'] [Algebra L L'] + [IsScalarTower K K' L'] [IsScalarTower K L L'] + + +/-- Rebracketing the compatible tower does not change its embedded lower +fixing subgroup. -/ +private theorem numberFieldEmbeddedBaseSubgroup_baseChange_eq + (j : L' →ₐ[ℚ] SeparableClosure ℚ) : + numberFieldEmbeddedBaseSubgroup K K' + (numberFieldEmbeddedLowerEmbedding K' L' j) = + numberFieldEmbeddedBaseSubgroup K L + (j.comp (IsScalarTower.toAlgHom ℚ L L')) := by + have hi : + numberFieldEmbeddedLowerEmbedding K K' + (numberFieldEmbeddedLowerEmbedding K' L' j) = + numberFieldEmbeddedLowerEmbedding K L + (j.comp (IsScalarTower.toAlgHom ℚ L L')) := by + ext x + simp only [numberFieldEmbeddedLowerEmbedding, AlgHom.comp_apply, + IsScalarTower.coe_toAlgHom'] + rw [← IsScalarTower.algebraMap_apply K K' L', + ← IsScalarTower.algebraMap_apply K L L'] + simp only [numberFieldEmbeddedBaseSubgroup, hi] + +omit [Field K] [NumberField K] + [Algebra K K'] [Algebra K L'] [IsScalarTower K K' L'] in +/-- The top subgroup of the rebracketed base-change tower is the embedded +fixing subgroup of the intermediate field. -/ +private theorem numberFieldEmbeddedTopSubgroup_baseChange_eq + (j : L' →ₐ[ℚ] SeparableClosure ℚ) : + numberFieldEmbeddedTopSubgroup K K' + (numberFieldEmbeddedLowerEmbedding K' L' j) = + numberFieldEmbeddedBaseSubgroup K' L' j := by + rfl + +/-- Reidentify the two presentations of the embedded lower fixing subgroup +without transporting dependent subgroup data through an equality. -/ +private noncomputable def numberFieldEmbeddedBaseChangeBaseEquiv + (j : L' →ₐ[ℚ] SeparableClosure ℚ) : + (numberFieldEmbeddedBaseSubgroup K K' + (numberFieldEmbeddedLowerEmbedding K' L' j)).toSubgroup ≃* + (numberFieldEmbeddedBaseSubgroup K L + (j.comp (IsScalarTower.toAlgHom ℚ L L'))).toSubgroup := + MulEquiv.subgroupCongr + (congrArg ClosedSubgroup.toSubgroup + (numberFieldEmbeddedBaseSubgroup_baseChange_eq K K' L L' j)) + +/-- Under the identity equivalence of the two lower fixing subgroups, the +relative subgroup for the base change is exactly the target presentation. -/ +private theorem numberFieldEmbeddedBaseChangeExtensionSubgroup_map_eq + (j : L' →ₐ[ℚ] SeparableClosure ℚ) : + (CyclicCohomology.extensionSubgroup + (numberFieldEmbeddedBaseSubgroup K K' + (numberFieldEmbeddedLowerEmbedding K' L' j)) + (numberFieldEmbeddedTopSubgroup K K' + (numberFieldEmbeddedLowerEmbedding K' L' j)) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K K' + (numberFieldEmbeddedLowerEmbedding K' L' j))).map + (numberFieldEmbeddedBaseChangeBaseEquiv K K' L L' j).toMonoidHom = + CyclicCohomology.extensionSubgroup + (numberFieldEmbeddedBaseSubgroup K L + (j.comp (IsScalarTower.toAlgHom ℚ L L'))) + (numberFieldEmbeddedBaseSubgroup K' L' j) + (numberFieldEmbeddedBaseSubgroup_le_of_tower K K' L L' j) := by + let e := numberFieldEmbeddedBaseChangeBaseEquiv K K' L L' j + have hTop : + (numberFieldEmbeddedTopSubgroup K K' + (numberFieldEmbeddedLowerEmbedding K' L' j)).toSubgroup = + (numberFieldEmbeddedBaseSubgroup K' L' j).toSubgroup := + congrArg ClosedSubgroup.toSubgroup + (numberFieldEmbeddedTopSubgroup_baseChange_eq + (K := K) (K' := K') (L' := L') j) + ext x + constructor + · rintro ⟨y, hy, rfl⟩ + change + ((e y : + (numberFieldEmbeddedBaseSubgroup K L + (j.comp (IsScalarTower.toAlgHom ℚ L L'))).toSubgroup) : + SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) ∈ + (numberFieldEmbeddedBaseSubgroup K' L' j).toSubgroup + dsimp only [e, numberFieldEmbeddedBaseChangeBaseEquiv] + rw [MulEquiv.subgroupCongr_apply, ← hTop] + exact hy + · intro hx + refine ⟨e.symm x, ?_, e.apply_symm_apply x⟩ + change + (((e.symm x : + (numberFieldEmbeddedBaseSubgroup K K' + (numberFieldEmbeddedLowerEmbedding K' L' j)).toSubgroup) : + SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) ∈ + (numberFieldEmbeddedTopSubgroup K K' + (numberFieldEmbeddedLowerEmbedding K' L' j)).toSubgroup) + dsimp only [e, numberFieldEmbeddedBaseChangeBaseEquiv] + rw [MulEquiv.subgroupCongr_symm_apply, hTop] + exact hx + +/-- Normality of the relative subgroup between the two embedded base fields +in a finite Galois base change. -/ +private theorem numberFieldEmbeddedBaseChangeExtensionSubgroup_normal + [FiniteDimensional K K'] [IsGalois K K'] + (j : L' →ₐ[ℚ] SeparableClosure ℚ) : + (CyclicCohomology.extensionSubgroup + (numberFieldEmbeddedBaseSubgroup K L + (j.comp (IsScalarTower.toAlgHom ℚ L L'))) + (numberFieldEmbeddedBaseSubgroup K' L' j) + (numberFieldEmbeddedBaseSubgroup_le_of_tower K K' L L' j)).Normal := by + let e := numberFieldEmbeddedBaseChangeBaseEquiv K K' L L' j + have hNormal := + (numberFieldEmbeddedExtensionSubgroup_normal K K' + (numberFieldEmbeddedLowerEmbedding K' L' j)).map + e.toMonoidHom e.surjective + rw [numberFieldEmbeddedBaseChangeExtensionSubgroup_map_eq + K K' L L' j] at hNormal + exact hNormal + +noncomputable local instance + numberFieldEmbeddedBaseChangeExtensionSubgroupNormal + [FiniteDimensional K K'] [IsGalois K K'] + (j : L' →ₐ[ℚ] SeparableClosure ℚ) : + (CyclicCohomology.extensionSubgroup + (numberFieldEmbeddedBaseSubgroup K L + (j.comp (IsScalarTower.toAlgHom ℚ L L'))) + (numberFieldEmbeddedBaseSubgroup K' L' j) + (numberFieldEmbeddedBaseSubgroup_le_of_tower K K' L L' j)).Normal := + numberFieldEmbeddedBaseChangeExtensionSubgroup_normal K K' L L' j + +/-- Finiteness of the relative quotient between the two embedded base fields +in a finite Galois base change. -/ +private theorem numberFieldEmbeddedBaseChangeExtensionQuotient_finite + [FiniteDimensional K K'] [IsGalois K K'] + (j : L' →ₐ[ℚ] SeparableClosure ℚ) : + Finite + ((numberFieldEmbeddedBaseSubgroup K L + (j.comp (IsScalarTower.toAlgHom ℚ L L'))).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (numberFieldEmbeddedBaseSubgroup K L + (j.comp (IsScalarTower.toAlgHom ℚ L L'))) + (numberFieldEmbeddedBaseSubgroup K' L' j) + (numberFieldEmbeddedBaseSubgroup_le_of_tower K K' L L' j)) := by + let e := numberFieldEmbeddedBaseChangeBaseEquiv K K' L L' j + let N := + CyclicCohomology.extensionSubgroup + (numberFieldEmbeddedBaseSubgroup K K' + (numberFieldEmbeddedLowerEmbedding K' L' j)) + (numberFieldEmbeddedTopSubgroup K K' + (numberFieldEmbeddedLowerEmbedding K' L' j)) + (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K K' + (numberFieldEmbeddedLowerEmbedding K' L' j)) + let M := + CyclicCohomology.extensionSubgroup + (numberFieldEmbeddedBaseSubgroup K L + (j.comp (IsScalarTower.toAlgHom ℚ L L'))) + (numberFieldEmbeddedBaseSubgroup K' L' j) + (numberFieldEmbeddedBaseSubgroup_le_of_tower K K' L L' j) + let hNNormal : N.Normal := + numberFieldEmbeddedExtensionSubgroup_normal K K' + (numberFieldEmbeddedLowerEmbedding K' L' j) + let hMNormal : M.Normal := + numberFieldEmbeddedBaseChangeExtensionSubgroup_normal K K' L L' j + let hNFinite : + Finite + ((numberFieldEmbeddedBaseSubgroup K K' + (numberFieldEmbeddedLowerEmbedding K' L' j)).toSubgroup ⧸ N) := + numberFieldEmbeddedExtensionQuotient_finite K K' + (numberFieldEmbeddedLowerEmbedding K' L' j) + have hmap : N.map e.toMonoidHom = M := + numberFieldEmbeddedBaseChangeExtensionSubgroup_map_eq K K' L L' j + have hle : N ≤ M.comap e.toMonoidHom := by + rw [← hmap] + exact Subgroup.le_comap_map e.toMonoidHom N + let f : + ((numberFieldEmbeddedBaseSubgroup K K' + (numberFieldEmbeddedLowerEmbedding K' L' j)).toSubgroup ⧸ N) →* + ((numberFieldEmbeddedBaseSubgroup K L + (j.comp (IsScalarTower.toAlgHom ℚ L L'))).toSubgroup ⧸ M) := + QuotientGroup.map N M e.toMonoidHom hle + have hmk : Function.Surjective + (QuotientGroup.mk ∘ e : + (numberFieldEmbeddedBaseSubgroup K K' + (numberFieldEmbeddedLowerEmbedding K' L' j)).toSubgroup → + (numberFieldEmbeddedBaseSubgroup K L + (j.comp (IsScalarTower.toAlgHom ℚ L L'))).toSubgroup ⧸ M) := + QuotientGroup.mk_surjective.comp e.surjective + have hsurj : Function.Surjective f := + QuotientGroup.map_surjective_of_surjective + (N := N) M e.toMonoidHom hmk hle + exact Finite.of_surjective f hsurj + +noncomputable local instance + numberFieldEmbeddedBaseChangeExtensionQuotientFinite + [FiniteDimensional K K'] [IsGalois K K'] + (j : L' →ₐ[ℚ] SeparableClosure ℚ) : + Finite + ((numberFieldEmbeddedBaseSubgroup K L + (j.comp (IsScalarTower.toAlgHom ℚ L L'))).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (numberFieldEmbeddedBaseSubgroup K L + (j.comp (IsScalarTower.toAlgHom ℚ L L'))) + (numberFieldEmbeddedBaseSubgroup K' L' j) + (numberFieldEmbeddedBaseSubgroup_le_of_tower K K' L L' j)) := + numberFieldEmbeddedBaseChangeExtensionQuotient_finite K K' L L' j + +/-- Reuse the canonical absolute fixed-field witness for the lower embedded +tower. The base-change relative witness below needs this exact instance path +when forming the absolute finite-dimensional tower. -/ +noncomputable local instance + numberFieldEmbeddedBaseChangeBaseFixedFieldFiniteDimensional + (j : L' →ₐ[ℚ] SeparableClosure ℚ) : + FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup K L + (j.comp (IsScalarTower.toAlgHom ℚ L L')))) := + numberFieldEmbeddedAbstractFixedFieldFiniteDimensional K L + (j.comp (IsScalarTower.toAlgHom ℚ L L')) + +noncomputable local instance + numberFieldEmbeddedBaseChangeRelativeFixedFieldFiniteDimensional + [FiniteDimensional K K'] [IsGalois K K'] + (j : L' →ₐ[ℚ] SeparableClosure ℚ) : + FiniteDimensional + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup K L + (j.comp (IsScalarTower.toAlgHom ℚ L L')))) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup_le_of_tower K K' L L' j)) := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup K L + (j.comp (IsScalarTower.toAlgHom ℚ L L'))) + (numberFieldEmbeddedBaseSubgroup K' L' j) + (numberFieldEmbeddedBaseSubgroup_le_of_tower K K' L L' j) + (numberFieldEmbeddedAbsoluteQuotientFinite K L + (j.comp (IsScalarTower.toAlgHom ℚ L L'))) + (numberFieldEmbeddedBaseChangeExtensionQuotientFinite K K' L L' j) + +local instance + numberFieldEmbeddedBaseChangeRelativeFixedFieldScalarTower + (j : L' →ₐ[ℚ] SeparableClosure ℚ) : + IsScalarTower ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup K L + (j.comp (IsScalarTower.toAlgHom ℚ L L')))) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup_le_of_tower K K' L L' j)) := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + +noncomputable local instance + numberFieldEmbeddedBaseChangeRelativeFixedFieldAbsoluteFiniteDimensional + [FiniteDimensional K K'] [IsGalois K K'] + (j : L' →ₐ[ℚ] SeparableClosure ℚ) : + FiniteDimensional ℚ + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup_le_of_tower K K' L L' j)) := + FiniteDimensional.trans ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup K L + (j.comp (IsScalarTower.toAlgHom ℚ L L')))) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup_le_of_tower K K' L L' j)) + +noncomputable local instance + numberFieldEmbeddedBaseChangeRelativeFixedFieldNumberField + [FiniteDimensional K K'] [IsGalois K K'] + (j : L' →ₐ[ℚ] SeparableClosure ℚ) : + NumberField + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup_le_of_tower K K' L L' j)) := + NumberField.of_module_finite ℚ + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup_le_of_tower K K' L L' j)) + +noncomputable local instance + numberFieldEmbeddedBaseChangeRelativeFixedFieldIsGalois + [FiniteDimensional K K'] [IsGalois K K'] + (j : L' →ₐ[ℚ] SeparableClosure ℚ) : + IsGalois + (abstractFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup K L + (j.comp (IsScalarTower.toAlgHom ℚ L L')))) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup_le_of_tower K K' L L' j)) := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) + (numberFieldEmbeddedBaseSubgroup K L + (j.comp (IsScalarTower.toAlgHom ℚ L L'))) + (numberFieldEmbeddedBaseSubgroup K' L' j) + (numberFieldEmbeddedBaseSubgroup_le_of_tower K K' L L' j) + (numberFieldEmbeddedBaseChangeExtensionSubgroupNormal K K' L L' j) + +/-- In one common rational-separable-closure realization, the canonical +quotient-to-Galois comparisons intertwine abstract restriction with +ordinary restriction of the actual number-field automorphisms. -/ +theorem + numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisGroup_restriction + [FiniteDimensional K L] [IsAbelianGalois K L] + [FiniteDimensional K' L'] [IsAbelianGalois K' L'] + (j : L' →ₐ[ℚ] SeparableClosure ℚ) + (z : + Abelianization + (numberFieldEmbeddedFiniteGaloisSubextension + K' L' j).extensionQuotient) : + let jLower : L →ₐ[ℚ] SeparableClosure ℚ := + j.comp (IsScalarTower.toAlgHom ℚ L L') + let H := + numberFieldEmbeddedBaseSubgroup K L jLower + let H' := + numberFieldEmbeddedBaseSubgroup K' L' j + let J := + numberFieldEmbeddedTopSubgroup K L jLower + let J' := + numberFieldEmbeddedTopSubgroup K' L' j + let hH'H := + numberFieldEmbeddedBaseSubgroup_le_of_tower K K' L L' j + let hJ'J := + numberFieldEmbeddedTopSubgroup_le_of_tower K K' L L' j + let hJH := + numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L jLower + let hJ'H' := + numberFieldEmbeddedTopSubgroup_le_baseSubgroup K' L' j + letI _ : + (CyclicCohomology.extensionSubgroup H J hJH).Normal := + numberFieldEmbeddedExtensionSubgroup_normal K L jLower + letI _ : + (CyclicCohomology.extensionSubgroup H' J' hJ'H').Normal := + numberFieldEmbeddedExtensionSubgroup_normal K' L' j + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) + (Additive.toMul + (numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisGroup + K' L' j (Additive.ofMul z))) = + Additive.toMul + (numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisGroup + K L jLower + (MonoidHom.toAdditive + (normResidueNaturalityAbelianizedRestriction + H H' J J' + hJH hJ'H' + hH'H hJ'J) + (Additive.ofMul z))) := by + dsimp only + let jLower : L →ₐ[ℚ] SeparableClosure ℚ := + j.comp (IsScalarTower.toAlgHom ℚ L L') + let H := + numberFieldEmbeddedBaseSubgroup K L jLower + let H' := + numberFieldEmbeddedBaseSubgroup K' L' j + let J := + numberFieldEmbeddedTopSubgroup K L jLower + let J' := + numberFieldEmbeddedTopSubgroup K' L' j + let hH'H := + numberFieldEmbeddedBaseSubgroup_le_of_tower K K' L L' j + let hJ'J := + numberFieldEmbeddedTopSubgroup_le_of_tower K K' L L' j + let hJH := + numberFieldEmbeddedTopSubgroup_le_baseSubgroup + K L jLower + let hJ'H' := + numberFieldEmbeddedTopSubgroup_le_baseSubgroup + K' L' j + let hLowerNormal : + (CyclicCohomology.extensionSubgroup H J hJH).Normal := + numberFieldEmbeddedExtensionSubgroup_normal K L jLower + let hUpperNormal : + (CyclicCohomology.extensionSubgroup H' J' hJ'H').Normal := + numberFieldEmbeddedExtensionSubgroup_normal K' L' j + let qLower := + numberFieldEmbeddedExtensionQuotientEquivGaloisGroup + K L jLower + let qUpper := + numberFieldEmbeddedExtensionQuotientEquivGaloisGroup + K' L' j + let qLowerRaw : + (H.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H J hJH) ≃* + Gal(L/K) := by + exact + { qLower.toEquiv with + map_mul' := fun x y => qLower.map_mul x y } + let qUpperRaw : + (H'.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H' J' hJ'H') ≃* + Gal(L'/K') := by + exact + { qUpper.toEquiv with + map_mul' := fun x y => qUpper.map_mul x y } + let restrictActual : + Gal(L'/K') →* Gal(L/K) := + (AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K) + obtain ⟨q, rfl⟩ := + QuotientGroup.mk_surjective z + obtain ⟨σ, rfl⟩ := + (numberFieldEmbeddedFiniteGaloisSubextension + K' L' j).extensionQuotientMk_surjective q + change + restrictActual + ((Abelianization.equivOfComm (H := Gal(L'/K'))).symm + (qUpperRaw.abelianizationCongr + (Abelianization.of (QuotientGroup.mk σ)))) = + (Abelianization.equivOfComm (H := Gal(L/K))).symm + (qLowerRaw.abelianizationCongr + (normResidueNaturalityAbelianizedRestriction + H H' J J' hJH hJ'H' hH'H hJ'J + (Abelianization.of (QuotientGroup.mk σ)))) + rw [normResidueNaturalityAbelianizedRestriction_of_mk, + abelianizationCongr_of, abelianizationCongr_of] + change + restrictActual (qUpperRaw (QuotientGroup.mk σ)) = + qLowerRaw + (QuotientGroup.mk (Subgroup.inclusion hH'H σ)) + apply AlgEquiv.ext + intro x + apply jLower.injective + let hUpperAlgebra : Algebra K' (SeparableClosure ℚ) := + numberFieldEmbeddedSeparableClosureAlgebra K' L' j + let eUpper := + numberFieldEmbeddedSeparableClosureEquiv K' L' j + let hLowerAlgebra : Algebra K (SeparableClosure ℚ) := + numberFieldEmbeddedSeparableClosureAlgebra K L jLower + let eLower := + numberFieldEmbeddedSeparableClosureEquiv K L jLower + calc + jLower + (restrictActual + (qUpperRaw (QuotientGroup.mk σ)) x) = + j + ((qUpperRaw (QuotientGroup.mk σ)) + (algebraMap L L' x)) := by + exact congrArg j + (AlgEquiv.restrictNormal_commutes + ((AlgEquiv.restrictScalarsHom K) + (qUpperRaw (QuotientGroup.mk σ))) + L x) + _ = σ.1.1 + (j (algebraMap L L' x)) := by + exact + ambientEmbeddedExtensionQuotientEquivGaloisGroup_mk_apply + ℚ K' L' j eUpper σ (algebraMap L L' x) + _ = (Subgroup.inclusion hH'H σ).1.1 + (jLower x) := rfl + _ = jLower + (qLowerRaw + (QuotientGroup.mk + (Subgroup.inclusion hH'H σ)) x) := by + exact + (ambientEmbeddedExtensionQuotientEquivGaloisGroup_mk_apply + ℚ K L jLower eLower + (Subgroup.inclusion hH'H σ) x).symm + +/-- In a compatible common embedding, the fixed-part relative norm +between two (Galois-related) base fields is the genuine ordinary +idele-class norm. -/ +theorem numberFieldEmbeddedIdeleClassEquivAmbientFixed_relativeNorm + [FiniteDimensional K K'] [IsGalois K K'] + (j : L' →ₐ[ℚ] SeparableClosure ℚ) + (c : IdeleClassGroup K') : + let jLower : L →ₐ[ℚ] SeparableClosure ℚ := + j.comp (IsScalarTower.toAlgHom ℚ L L') + let H := + numberFieldEmbeddedBaseSubgroup K L jLower + let H' := + numberFieldEmbeddedBaseSubgroup K' L' j + let hH'H := + numberFieldEmbeddedBaseSubgroup_le_of_tower K K' L L' j + letI _ : Finite + (H.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H H' hH'H) := + numberFieldEmbeddedBaseChangeExtensionQuotientFinite + K K' L L' j + relativeNorm rationalIdeleClassRepresentation H H' hH'H + (numberFieldEmbeddedIdeleClassEquivAmbientFixed + K' L' j (Additive.ofMul c)) = + numberFieldEmbeddedIdeleClassEquivAmbientFixed + K L jLower + (Additive.ofMul (_root_.ideleClassNorm K K' c)) := by + intro jLower H H' + let hH'H := + numberFieldEmbeddedBaseSubgroup_le_of_tower K K' L L' j + let hnormal := + numberFieldEmbeddedBaseChangeExtensionSubgroupNormal K K' L L' j + let F := + abstractFixedField ℚ (SeparableClosure ℚ) H + let E := + abstractRelativeFixedField ℚ (SeparableClosure ℚ) hH'H + let _ : + (CyclicCohomology.extensionSubgroup H H' hH'H).Normal := + hnormal + let _ : + Finite + (H.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H H' hH'H) := + numberFieldEmbeddedBaseChangeExtensionQuotientFinite + K K' L L' j + let _ : + Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + H (le_baseField H)) := + numberFieldEmbeddedAbsoluteQuotientFinite K L jLower + let _ : NumberField F := + numberFieldEmbeddedAbstractFixedFieldNumberField K L jLower + let _ : NumberField E := + numberFieldEmbeddedBaseChangeRelativeFixedFieldNumberField + K K' L L' j + let _ : FiniteDimensional ℚ (E.restrictScalars ℚ) := by + change FiniteDimensional ℚ E + exact + numberFieldEmbeddedBaseChangeRelativeFixedFieldAbsoluteFiniteDimensional + K K' L L' j + let _ : NumberField + (abstractFixedField ℚ (SeparableClosure ℚ) H') := + numberFieldEmbeddedAbstractFixedFieldNumberField K' L' j + have hE : + E.restrictScalars ℚ = + abstractFixedField ℚ (SeparableClosure ℚ) H' := + IntermediateField.extendScalars_restrictScalars + (abstractFixedField_le + ℚ (SeparableClosure ℚ) hH'H) + let eRel : + E ≃ₐ[ℚ] + abstractFixedField ℚ (SeparableClosure ℚ) H' := + IntermediateField.equivOfEq hE + let eK : + K ≃ₐ[ℚ] F := + numberFieldEmbeddedAbstractBaseFieldEquiv K L jLower + let eK'Base : + K' ≃ₐ[ℚ] + abstractFixedField ℚ (SeparableClosure ℚ) H' := + numberFieldEmbeddedAbstractBaseFieldEquiv K' L' j + let eK' : K' ≃ₐ[ℚ] E := + eK'Base.trans eRel.symm + have hcompat (x : K) : + eK' (algebraMap K K' x) = + algebraMap F E (eK x) := by + apply eRel.injective + apply Subtype.ext + change + j (algebraMap K' L' (algebraMap K K' x)) = + j (algebraMap L L' (algebraMap K L x)) + rw [← IsScalarTower.algebraMap_apply K K' L', + ← IsScalarTower.algebraMap_apply K L L'] + have hupper : + rationalAbstractRelativeFixedFieldIdeleClassEquivFixed + H H' hH'H + (Additive.ofMul (ideleClassCongr eK' c)) = + numberFieldEmbeddedIdeleClassEquivAmbientFixed + K' L' j (Additive.ofMul c) := by + apply Subtype.ext + change + ((rationalIdeleClassEquivFixed (E.restrictScalars ℚ)) + (Additive.ofMul (ideleClassCongr eK' c))).1 = + ((rationalIdeleClassEquivFixed + (abstractFixedField ℚ (SeparableClosure ℚ) H')) + (Additive.ofMul (ideleClassCongr eK'Base c))).1 + exact rationalIdeleClassEquivFixed_transport_baseEquiv_val + (T := K') (A := E.restrictScalars ℚ) + (B := abstractFixedField ℚ (SeparableClosure ℚ) H') hE eK'Base c + have hrelative := + rationalAbstractRelativeFixedFieldIdeleClassEquivFixed_relativeNorm + H H' hH'H hnormal + (Additive.ofMul (ideleClassCongr eK' c)) + change + relativeNorm rationalIdeleClassRepresentation H H' hH'H + (rationalAbstractRelativeFixedFieldIdeleClassEquivFixed + H H' hH'H + (Additive.ofMul (ideleClassCongr eK' c))) = + rationalAbstractFixedFieldIdeleClassEquivFixed H + (Additive.ofMul + (_root_.ideleClassNorm F E + (ideleClassCongr eK' c))) + at hrelative + calc + relativeNorm rationalIdeleClassRepresentation H H' hH'H + (numberFieldEmbeddedIdeleClassEquivAmbientFixed + K' L' j (Additive.ofMul c)) = + relativeNorm rationalIdeleClassRepresentation H H' hH'H + (rationalAbstractRelativeFixedFieldIdeleClassEquivFixed + H H' hH'H (Additive.ofMul (ideleClassCongr eK' c))) := + congrArg (relativeNorm rationalIdeleClassRepresentation H H' hH'H) + hupper.symm + _ = rationalAbstractFixedFieldIdeleClassEquivFixed H + (Additive.ofMul + (_root_.ideleClassNorm F E (ideleClassCongr eK' c))) := hrelative + _ = numberFieldEmbeddedIdeleClassEquivAmbientFixed + K L jLower (Additive.ofMul (_root_.ideleClassNorm K K' c)) := by + change + rationalAbstractFixedFieldIdeleClassEquivFixed H + (Additive.ofMul + (_root_.ideleClassNorm F E (ideleClassCongr eK' c))) = + rationalAbstractFixedFieldIdeleClassEquivFixed H + (Additive.ofMul + (ideleClassCongr eK (_root_.ideleClassNorm K K' c))) + apply congrArg (rationalAbstractFixedFieldIdeleClassEquivFixed H) + apply congrArg Additive.ofMul + exact + (ideleClassCongr_ideleClassNorm + (K := K) (K' := F) (L := K') (L' := E) eK eK' hcompat c).symm + +/-- For one common compatible embedding of a Galois base-change +diamond, the genuine global norm-residue maps commute with ordinary +idele-class norm and actual restriction of automorphisms. -/ +theorem globalNormResidueMonoidHomOfEmbedding_norm_restriction + [FiniteDimensional K L] [IsAbelianGalois K L] + [FiniteDimensional K' L'] [IsAbelianGalois K' L'] + [FiniteDimensional K K'] [IsGalois K K'] + (j : L' →ₐ[ℚ] SeparableClosure ℚ) : + let jLower : L →ₐ[ℚ] SeparableClosure ℚ := + j.comp (IsScalarTower.toAlgHom ℚ L L') + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)).comp + (globalNormResidueMonoidHomOfEmbedding K' L' j) = + (globalNormResidueMonoidHomOfEmbedding K L jLower).comp + (_root_.ideleClassNorm K K') := by + dsimp only + let jLower : L →ₐ[ℚ] SeparableClosure ℚ := + j.comp (IsScalarTower.toAlgHom ℚ L L') + let H := + numberFieldEmbeddedBaseSubgroup K L jLower + let H' := + numberFieldEmbeddedBaseSubgroup K' L' j + let J := + numberFieldEmbeddedTopSubgroup K L jLower + let J' := + numberFieldEmbeddedTopSubgroup K' L' j + let hJH := + numberFieldEmbeddedTopSubgroup_le_baseSubgroup K L jLower + let hJ'H' := + numberFieldEmbeddedTopSubgroup_le_baseSubgroup K' L' j + let hH'H := + numberFieldEmbeddedBaseSubgroup_le_of_tower K K' L L' j + let hJ'J := + numberFieldEmbeddedTopSubgroup_le_of_tower K K' L L' j + let _ : + (CyclicCohomology.extensionSubgroup H J hJH).Normal := + numberFieldEmbeddedExtensionSubgroup_normal K L jLower + let _ : + Finite + (H.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H J hJH) := + numberFieldEmbeddedExtensionQuotient_finite K L jLower + let _ : + (CyclicCohomology.extensionSubgroup H' J' hJ'H').Normal := + numberFieldEmbeddedExtensionSubgroup_normal K' L' j + let _ : + Finite + (H'.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H' J' hJ'H') := + numberFieldEmbeddedExtensionQuotient_finite K' L' j + let hHH'finite := + numberFieldEmbeddedBaseChangeExtensionQuotientFinite K K' L L' j + let T : + FiniteAbstractFieldExtension + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) := + { field := numberFieldEmbeddedFiniteAbstractField K' L' j + base := numberFieldEmbeddedFiniteAbstractField K L jLower + below := hH'H + finiteQuotient := hHH'finite } + let hTBaseNormal : + (CyclicCohomology.extensionSubgroup + T.base.field J hJH).Normal := by + change + (CyclicCohomology.extensionSubgroup H J hJH).Normal + exact numberFieldEmbeddedExtensionSubgroup_normal K L jLower + let hTBaseFinite : + Finite + (T.base.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + T.base.field J hJH) := by + change + Finite + (H.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H J hJH) + exact numberFieldEmbeddedExtensionQuotient_finite K L jLower + let hTFieldNormal : + (CyclicCohomology.extensionSubgroup + T.field.field J' hJ'H').Normal := by + change + (CyclicCohomology.extensionSubgroup H' J' hJ'H').Normal + exact numberFieldEmbeddedExtensionSubgroup_normal K' L' j + let hTFieldFinite : + Finite + (T.field.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + T.field.field J' hJ'H') := by + change + Finite + (H'.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup H' J' hJ'H') + exact numberFieldEmbeddedExtensionQuotient_finite K' L' j + let restrictActual : + Gal(L'/K') →* Gal(L/K) := + (AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K) + apply MonoidHom.ext + intro c + let a := + numberFieldEmbeddedIdeleClassEquivAmbientFixed + K' L' j (Additive.ofMul c) + have hnat := + DegreeData.normResidueNaturality_norm_restriction + (D := rationalCyclotomicDegreeData) + (A := rationalIdeleClassRepresentation) + (v := rationalCyclotomicIdeleClassValuationData) + (hcf := rationalIdeleClassRepresentation_satisfiesClassFieldAxiom) + (T := T) (L := J) (L' := J') + (hLnormal := hTBaseNormal) + (hL'normal := hTFieldNormal) + (hLKfinite := hTBaseFinite) + (hL'K'finite := hTFieldFinite) + hJH hJ'H' hJ'J + have hnatc := + DFunLike.congr_fun hnat + (finiteNormClass rationalIdeleClassRepresentation + H' J' hJ'H' a) + change _ = + rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + T.base + { field := J + below := hJH + normal := hTBaseNormal + finite := hTBaseFinite } + (finiteReciprocityNaturalityNormMap + rationalIdeleClassRepresentation + T.base.field T.field.field J J' + hJH hJ'H' T.below hJ'J + (finiteNormClass rationalIdeleClassRepresentation + T.field.field J' hJ'H' a)) at hnatc + rw [finiteReciprocityNaturalityNormMap_finiteNormClass] + at hnatc + have hnorm : + relativeNorm rationalIdeleClassRepresentation + H H' hH'H a = + numberFieldEmbeddedIdeleClassEquivAmbientFixed + K L jLower + (Additive.ofMul (_root_.ideleClassNorm K K' c)) := + numberFieldEmbeddedIdeleClassEquivAmbientFixed_relativeNorm + K K' L L' j c + calc + restrictActual + (globalNormResidueMonoidHomOfEmbedding K' L' j c) = + restrictActual + (Additive.toMul + (numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisGroup + K' L' j + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldEmbeddedFiniteAbstractField K' L' j) + (numberFieldEmbeddedFiniteGaloisSubextension K' L' j) + (finiteNormClass rationalIdeleClassRepresentation + H' J' hJ'H' a)))) := by + rw [globalNormResidueMonoidHomOfEmbedding_apply] + _ = + Additive.toMul + (numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisGroup + K L jLower + (MonoidHom.toAdditive + (normResidueNaturalityAbelianizedRestriction + H H' J J' hJH hJ'H' hH'H hJ'J) + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldEmbeddedFiniteAbstractField K' L' j) + (numberFieldEmbeddedFiniteGaloisSubextension K' L' j) + (finiteNormClass rationalIdeleClassRepresentation + H' J' hJ'H' a)))) := by + exact + numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisGroup_restriction + K K' L L' j _ + _ = + Additive.toMul + (numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisGroup + K L jLower + (rationalCyclotomicDegreeData.normResidueSymbol + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldEmbeddedFiniteAbstractField K L jLower) + (numberFieldEmbeddedFiniteGaloisSubextension K L jLower) + (finiteNormClass rationalIdeleClassRepresentation + H J hJH + (relativeNorm rationalIdeleClassRepresentation + H H' hH'H a)))) := by + exact congrArg + (fun z => + Additive.toMul + (numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisGroup + K L jLower z)) + hnatc + _ = + globalNormResidueMonoidHomOfEmbedding K L jLower + (_root_.ideleClassNorm K K' c) := by + rw [hnorm, + ← globalNormResidueMonoidHomOfEmbedding_apply] + +end EmbeddedNumberFieldRestriction + +variable + {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [TotallyDisconnectedSpace G] + +/-- Same-base norm-residue naturality in a compatible ambient: +restriction from the larger finite Galois subextension commutes with +the canonical projection between its finite norm quotient and the +norm quotient of an intermediate subextension. -/ +theorem normResidueSymbol_restriction_sameBase + (D : DegreeData G) + (A : Rep ℤ G) + (v : ValuationData D A) + (hcf : SatisfiesClassFieldAxiom A) + (K : FiniteAbstractField G) + (M L : ClosedSubgroup G) + (hLM : L.toSubgroup ≤ M.toSubgroup) + (hMK : M.toSubgroup ≤ K.field.toSubgroup) + [hLnormal : + (CyclicCohomology.extensionSubgroup + K.field L (hLM.trans hMK)).Normal] + [hMnormal : + (CyclicCohomology.extensionSubgroup K.field M hMK).Normal] + [hLfinite : + Finite + (K.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup K.field L + (hLM.trans hMK))] : + letI _ : Finite + (M.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup M L hLM) := + abstractReciprocity_lowerExtension_finite + K.field M L hLM hMK + letI hIntermediateFinite : Finite + (K.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup K.field M hMK) := + abstractReciprocity_intermediateQuotient_finite + K.field M L hLM hMK + let EM : FiniteGaloisSubextension K.field := + ⟨M, hMK, hMnormal, hIntermediateFinite⟩ + let EL : FiniteGaloisSubextension K.field := + ⟨L, hLM.trans hMK, hLnormal, hLfinite⟩ + let hEL_EM : EL.field.toSubgroup ≤ EM.field.toSubgroup := + hLM + let QL : Type := + FiniteNormQuotient A K.field L (hLM.trans hMK) + let QM : Type := + FiniteNormQuotient A K.field M hMK + let AL : Type := + Additive + (Abelianization + (K.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + K.field L (hLM.trans hMK))) + let AM : Type := + Additive + (Abelianization + (K.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup K.field M hMK)) + let restriction : + AL →+ AM := + MonoidHom.toAdditive + (normResidueNaturalityAbelianizedRestriction + K.field K.field EM.field EL.field + EM.below EL.below le_rfl hEL_EM) + let projection : + QL →+ QM := + abstractReciprocityNormProjection + A K.field EM.field EL.field hEL_EM EM.below + let normEL : + QL →+ AL := + (DegreeData.normResidueSymbol + (D := D) (A := A) (v := v) (hcf := hcf) + (K := K) (L := EL)).toAddMonoidHom + let normEM : + QM →+ AM := + (DegreeData.normResidueSymbol + (D := D) (A := A) (v := v) (hcf := hcf) + (K := K) (L := EM)).toAddMonoidHom + (restriction.comp normEL : + QL →+ AM) = + (normEM.comp projection : + QL →+ AM) := by + let _ : Finite + (M.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup M L hLM) := + abstractReciprocity_lowerExtension_finite + K.field M L hLM hMK + let hIntermediateFinite : Finite + (K.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup K.field M hMK) := + abstractReciprocity_intermediateQuotient_finite + K.field M L hLM hMK + let EM : FiniteGaloisSubextension K.field := + ⟨M, hMK, hMnormal, hIntermediateFinite⟩ + let EL : FiniteGaloisSubextension K.field := + ⟨L, hLM.trans hMK, hLnormal, hLfinite⟩ + let hEL_EM : EL.field.toSubgroup ≤ EM.field.toSubgroup := + hLM + let QL : Type := + FiniteNormQuotient A K.field L (hLM.trans hMK) + let QM : Type := + FiniteNormQuotient A K.field M hMK + let AL : Type := + Additive + (Abelianization + (K.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + K.field L (hLM.trans hMK))) + let AM : Type := + Additive + (Abelianization + (K.field.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup K.field M hMK)) + let restriction : + AL →+ AM := + MonoidHom.toAdditive + (normResidueNaturalityAbelianizedRestriction + K.field K.field EM.field EL.field + EM.below EL.below le_rfl hEL_EM) + let projection : + QL →+ QM := + abstractReciprocityNormProjection + A K.field EM.field EL.field hEL_EM EM.below + let T : FiniteAbstractFieldExtension G := + { base := K + field := K + below := le_rfl + finiteQuotient := + (FiniteGaloisSubextension.refl K.field).finite } + have hnat := + D.normResidueNaturality_norm_restriction + (hLnormal := hMnormal) (hL'normal := hLnormal) + (hLKfinite := hIntermediateFinite) (hL'K'finite := hLfinite) + A v hcf T M L hMK (hLM.trans hMK) hLM + rw [finiteReciprocityNaturalityNormMap_sameBase_eq_normProjection] + at hnat + dsimp only [T, restriction, projection, EM, EL, hEL_EM, QL, QM, AL, AM, + FiniteGaloisSubextension.extensionQuotient] at hnat ⊢ + exact hnat + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFamilyAlgEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFamilyAlgEquiv.lean new file mode 100644 index 0000000000..839339822a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFamilyAlgEquiv.lean @@ -0,0 +1,150 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.FinitePlaceAdicCompletionCongrEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFiniteFactorNaturality +/-! +# Hilbert-pairing families under equivalences of number fields + +A number-field equivalence permutes finite places and identifies the +corresponding adic completions. The local pairings and their finite factors +can therefore be transported without changing their normalization. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- A primitive root in the number field remains primitive in every finite +adic completion. -/ +theorem primitiveRoots_nonempty_adicCompletion + (F : Type u) [Field F] [NumberField F] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) F).Nonempty) + (v : HeightOneSpectrum (𝓞 F)) : + (primitiveRoots (n : ℕ) (v.adicCompletion F)).Nonempty := by + obtain ⟨ζ, hζ⟩ := hmu + exact ⟨algebraMap F (v.adicCompletion F) ζ, + (mem_primitiveRoots n.pos).2 + (((mem_primitiveRoots n.pos).1 hζ).map_of_injective + (algebraMap F (v.adicCompletion F)).injective)⟩ + +/-- Transport a global family through the finite-place and adic-completion +equivalences induced by an equivalence of number fields. -/ +def globalHilbertPairingFamilyCongr + {F : Type u} {G : Type v} + [Field F] [NumberField F] [Field G] [NumberField G] + (e : F ≃ₐ[ℚ] G) (n : ℕ+) + (hmuF : (primitiveRoots (n : ℕ) F).Nonempty) + (BF : GlobalHilbertPairingFamily F n) : + GlobalHilbertPairingFamily G n := fun W => + hilbertPairingOfRingEquiv + (finitePlaceAdicCompletionCongrEquiv e W) n + (primitiveRoots_nonempty_adicCompletion F n hmuF + ((finitePlaceCongr e).symm W)) + (BF ((finitePlaceCongr e).symm W)) + +/-- Local Hilbert-pairing laws survive transport of the global family. -/ +theorem globalHilbertPairingFamilyCongr_isLocallyHilbert + {F : Type u} {G : Type v} + [Field F] [NumberField F] [Field G] [NumberField G] + (e : F ≃ₐ[ℚ] G) (n : ℕ+) + (hmuF : (primitiveRoots (n : ℕ) F).Nonempty) + (BF : GlobalHilbertPairingFamily F n) + (hBF : GlobalHilbertPairingFamily.IsLocallyHilbert F BF) : + GlobalHilbertPairingFamily.IsLocallyHilbert G + (globalHilbertPairingFamilyCongr e n hmuF BF) := by + intro W + exact hilbertPairingOfRingEquiv_isLocalHilbertPairing + (finitePlaceAdicCompletionCongrEquiv e W) n + (primitiveRoots_nonempty_adicCompletion F n hmuF + ((finitePlaceCongr e).symm W)) + (BF ((finitePlaceCongr e).symm W)) + (hBF ((finitePlaceCongr e).symm W)) + +/-- At corresponding places, finite factors of the transported family are +related by the equivalence of global roots of unity. -/ +theorem globalHilbertPairingFamilyCongr_finiteFactor + {F : Type u} {G : Type v} + [Field F] [NumberField F] [Field G] [NumberField G] + (e : F ≃ₐ[ℚ] G) (n : ℕ+) + (hmuF : (primitiveRoots (n : ℕ) F).Nonempty) + (hmuG : (primitiveRoots (n : ℕ) G).Nonempty) + (BF : GlobalHilbertPairingFamily F n) + (W : HeightOneSpectrum (𝓞 G)) (a b : Fˣ) : + rootsOfUnityEquivOfRingEquiv e.toRingEquiv n hmuF + (GlobalHilbertPairingFamily.finiteFactor F BF hmuF + ((finitePlaceCongr e).symm W) a b) = + GlobalHilbertPairingFamily.finiteFactor G + (globalHilbertPairingFamilyCongr e n hmuF BF) hmuG W + (Units.mapEquiv e.toRingEquiv.toMulEquiv a) + (Units.mapEquiv e.toRingEquiv.toMulEquiv b) := by + let w := (finitePlaceCongr e).symm W + let : Algebra F G := e.toRingHom.toAlgebra + have hKM : finitePlaceBelow (K := F) W = w := by + apply HeightOneSpectrum.ext + rfl + have hcomm (x : F) : + finitePlaceAdicCompletionCongrEquiv e W + (algebraMap F (w.adicCompletion F) x) = + algebraMap G (W.adicCompletion G) (e x) := by + change finitePlaceAdicCompletionMap F G w ⟨W, hKM⟩ + (x : w.adicCompletion F) = + algebraMap G (W.adicCompletion G) (e x) + rw [finitePlaceAdicCompletionMap_coe] + rfl + exact globalHilbertPairingFamily_finiteFactor_congr + e.toRingEquiv n hmuF hmuG w W + (finitePlaceAdicCompletionCongrEquiv e W) hcomm + (primitiveRoots_nonempty_adicCompletion F n hmuF w) + BF (globalHilbertPairingFamilyCongr e n hmuF BF) rfl a b + +/-- Finite support of global evaluations is invariant under an equivalence +of number fields. -/ +theorem globalHilbertPairingFamilyCongr_hasFiniteSupport + {F : Type u} {G : Type v} + [Field F] [NumberField F] [Field G] [NumberField G] + (e : F ≃ₐ[ℚ] G) (n : ℕ+) + (hmuF : (primitiveRoots (n : ℕ) F).Nonempty) + (hmuG : (primitiveRoots (n : ℕ) G).Nonempty) + (BF : GlobalHilbertPairingFamily F n) + (hBF : GlobalHilbertPairingFamily.HasFiniteSupport F BF hmuF) : + GlobalHilbertPairingFamily.HasFiniteSupport G + (globalHilbertPairingFamilyCongr e n hmuF BF) hmuG := by + let eu : Fˣ ≃* Gˣ := Units.mapEquiv e.toRingEquiv.toMulEquiv + let er : rootsOfUnity (n : ℕ) F ≃* rootsOfUnity (n : ℕ) G := + rootsOfUnityEquivOfRingEquiv e.toRingEquiv n hmuF + intro a b + have hsource : Function.HasFiniteMulSupport + (fun v : HeightOneSpectrum (𝓞 F) => + er (GlobalHilbertPairingFamily.finiteFactor F BF hmuF v + (eu.symm a) (eu.symm b))) := + Function.HasFiniteMulSupport.fun_comp + (hBF (eu.symm a) (eu.symm b)) (map_one er) + have hreindex := Function.HasFiniteMulSupport.fun_comp_of_injective + (finitePlaceCongr e).symm.injective hsource + convert hreindex using 1 + funext W + have hfactor := globalHilbertPairingFamilyCongr_finiteFactor + e n hmuF hmuG BF W (eu.symm a) (eu.symm b) + change er (GlobalHilbertPairingFamily.finiteFactor F BF hmuF + ((finitePlaceCongr e).symm W) (eu.symm a) (eu.symm b)) = + GlobalHilbertPairingFamily.finiteFactor G + (globalHilbertPairingFamilyCongr e n hmuF BF) hmuG W + (eu (eu.symm a)) (eu (eu.symm b)) at hfactor + rw [eu.apply_symm_apply, eu.apply_symm_apply] at hfactor + exact hfactor.symm + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFiniteFactorNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFiniteFactorNaturality.lean new file mode 100644 index 0000000000..31bcb51522 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFiniteFactorNaturality.lean @@ -0,0 +1,105 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport +/-! +# Naturality of the finite Hilbert factor + +The factor obtained by evaluating a local pairing on global units commutes +with equivalences of both the number fields and their completions. The +commuting square for the two field embeddings is the only geometric input. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- Transporting a local Hilbert pairing through a compatible equivalence of +completions transports its finite factor through the equivalence of global +roots of unity. -/ +theorem globalHilbertPairingFamily_finiteFactor_congr + {F : Type u} {G : Type v} + [Field F] [NumberField F] [Field G] [NumberField G] + (e : F ≃+* G) (n : ℕ+) + (hmuF : (primitiveRoots (n : ℕ) F).Nonempty) + (hmuG : (primitiveRoots (n : ℕ) G).Nonempty) + (v : HeightOneSpectrum (𝓞 F)) (W : HeightOneSpectrum (𝓞 G)) + (ec : v.adicCompletion F ≃+* W.adicCompletion G) + (hcomm : ∀ x : F, + ec (algebraMap F (v.adicCompletion F) x) = + algebraMap G (W.adicCompletion G) (e x)) + (hmuC : (primitiveRoots (n : ℕ) (v.adicCompletion F)).Nonempty) + (BF : GlobalHilbertPairingFamily F n) + (BG : GlobalHilbertPairingFamily G n) + (hB : BG W = hilbertPairingOfRingEquiv ec n hmuC (BF v)) + (a b : Fˣ) : + rootsOfUnityEquivOfRingEquiv e n hmuF + (GlobalHilbertPairingFamily.finiteFactor F BF hmuF v a b) = + GlobalHilbertPairingFamily.finiteFactor G BG hmuG W + (Units.mapEquiv e.toMulEquiv a) + (Units.mapEquiv e.toMulEquiv b) := by + let C := v.adicCompletion F + let D := W.adicCompletion G + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + let eFC : rootsOfUnity (n : ℕ) F ≃* rootsOfUnity (n : ℕ) C := + rootsOfUnityEquivOfPrimitiveRoots (algebraMap F C).injective hmuF + let eGD : rootsOfUnity (n : ℕ) G ≃* rootsOfUnity (n : ℕ) D := + rootsOfUnityEquivOfPrimitiveRoots (algebraMap G D).injective hmuG + let eCD : rootsOfUnity (n : ℕ) C ≃* rootsOfUnity (n : ℕ) D := + rootsOfUnityEquivOfRingEquiv ec n hmuC + let eFG : rootsOfUnity (n : ℕ) F ≃* rootsOfUnity (n : ℕ) G := + rootsOfUnityEquivOfRingEquiv e n hmuF + have hroots (z : rootsOfUnity (n : ℕ) F) : + eGD (eFG z) = eCD (eFC z) := by + apply Subtype.ext + apply Units.ext + change algebraMap G D (e ((z : Fˣ) : F)) = + ec (algebraMap F C ((z : Fˣ) : F)) + exact (hcomm _).symm + have hunit (x : Fˣ) : + (Units.mapEquiv ec.toMulEquiv).symm + (Units.map (algebraMap G D).toMonoidHom + (Units.mapEquiv e.toMulEquiv x)) = + Units.map (algebraMap F C).toMonoidHom x := by + apply Units.ext + apply ec.injective + change ec (ec.symm (algebraMap G D (e (x : F)))) = + ec (algebraMap F C (x : F)) + rw [ec.apply_symm_apply] + exact (hcomm _).symm + apply eGD.injective + change eGD (eFG (eFC.symm + (BF v + (powerClass C n + (Units.map (algebraMap F C).toMonoidHom a)) + (powerClass C n + (Units.map (algebraMap F C).toMonoidHom b))))) = + eGD (eGD.symm + (BG W + (powerClass D n + (Units.map (algebraMap G D).toMonoidHom + (Units.mapEquiv e.toMulEquiv a))) + (powerClass D n + (Units.map (algebraMap G D).toMonoidHom + (Units.mapEquiv e.toMulEquiv b))))) + rw [eGD.apply_symm_apply, hroots, eFC.apply_symm_apply, hB, + hilbertPairingOfRingEquiv_apply, + powerClassGroupEquivOfRingEquiv_symm_powerClass, + powerClassGroupEquivOfRingEquiv_symm_powerClass, + hunit a, hunit b] + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormula.lean new file mode 100644 index 0000000000..678002b38f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormula.lean @@ -0,0 +1,197 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceFiniteSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinCompatibility +/-! +# The global Hilbert product formula + +The finite- and infinite-place Hilbert factors constructed in the preceding +files all take values in the same group of `n`-th roots of unity in the base +field. Their product is the image, under the global Kummer root character, +of the product of the corresponding local Artin factors. Global reciprocity +on a principal idele therefore makes this product equal to one. +-/ + +@[expose] public section + +open scoped BigOperators IsMulCommutative NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory + +variable (K : Type) [Field K] [NumberField K] + +open scoped Classical in +private theorem map_product_mul_finprod + {I J M N : Type} [Fintype I] [CommMonoid M] [CommMonoid N] + (chi : M →* N) (f : I → M) (g : J → M) + (hg : Function.HasFiniteMulSupport g) : + (∏ i, chi (f i)) * ∏ᶠ j, chi (g j) = + chi ((∏ i, f i) * ∏ᶠ j, g j) := by + rw [chi.map_mul, map_prod, MonoidHom.map_finprod chi hg] + +open scoped Classical in +/-- The product of the Hilbert symbols of two global units over all places. +The finite-place part is a genuine finite-support product. -/ +noncomputable def globalHilbertProduct + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a b : Kˣ) : + nthRootsSubgroup K (n : ℕ) := + (∏ v : InfinitePlace K, + infinitePlaceHilbertSymbol K n v a b) * + ∏ᶠ v : HeightOneSpectrum (𝓞 K), + finitePlaceHilbertSymbol K n hnK hmu v a b + +open scoped Classical in +/-- The global Hilbert product of a principal pair is trivial. The proof +maps the chosen local Artin product through the global Kummer root character +and then uses the finite- and infinite-place comparison theorems. -/ +theorem globalHilbertProduct_principal + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a b : Kˣ) : + globalHilbertProduct K n hnK hmu a b = 1 := by + let L := chosenSimpleKummerExtension K n hnK b + let : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let : NumberField L := NumberField.of_module_finite K L + let chi : Gal(L/K) →* nthRootsSubgroup K (n : ℕ) := + (nthRootsSubgroupEquivOfPrimitiveRoots K L n hmu).symm.toMonoidHom.comp + (chosenSimpleKummerRootCharacter K n hnK hmu b) + have hArtin := + chosenLocalArtin_product_principalIdele + (K := K) (L := L) a + have hFiniteSupport := finitePlaceArtinFactors_hasFiniteMulSupport + (K := K) (L := L) (IdeleGroup.principalIdele K a) + have hMapped : + (∏ v : InfinitePlace K, + chi + (chosenInfinitePlaceArtinMonoidHom (K := K) (L := L) v + (IdeleGroup.infiniteComponent v + (IdeleGroup.principalIdele K a)))) * + ∏ᶠ v : HeightOneSpectrum (𝓞 K), + chi + (chosenFinitePlaceArtinMonoidHom (K := K) (L := L) v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele K a))) = 1 := by + calc + _ = chi + ((∏ v : InfinitePlace K, + chosenInfinitePlaceArtinMonoidHom (K := K) (L := L) v + (IdeleGroup.infiniteComponent v + (IdeleGroup.principalIdele K a))) * + ∏ᶠ v : HeightOneSpectrum (𝓞 K), + chosenFinitePlaceArtinMonoidHom (K := K) (L := L) v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele K a))) := + map_product_mul_finprod chi _ _ hFiniteSupport + _ = chi 1 := congrArg chi hArtin + _ = 1 := chi.map_one + have hInfinite : + (∏ v : InfinitePlace K, + chi + (chosenInfinitePlaceArtinMonoidHom (K := K) (L := L) v + (IdeleGroup.infiniteComponent v + (IdeleGroup.principalIdele K a)))) = + ∏ v : InfinitePlace K, + infinitePlaceHilbertSymbol K n v a b := by + apply Finset.prod_congr rfl + intro v _ + have hcomponent : + (IdeleGroup.infiniteComponent v (IdeleGroup.principalIdele K a) : + v.Completionˣ) = + Units.map (algebraMap K v.Completion).toMonoidHom a := by + apply Units.ext + calc + ((IdeleGroup.infiniteComponent v (IdeleGroup.principalIdele K a) : + v.Completionˣ) : v.Completion) = + ((a : K) : v.Completion) := + IdeleGroup.infiniteComponent_principalIdele a v + _ = algebraMap K v.Completion (a : K) := + (NumberField.InfinitePlace.Completion.algebraMap_apply + v (a : K)).symm + rw [hcomponent] + calc + chi + (chosenInfinitePlaceArtinMonoidHom (K := K) (L := L) v + (Units.map (algebraMap K v.Completion).toMonoidHom a)) = + infinitePlaceKummerRootCharacter K n hnK hmu v a b := by + rfl + _ = infinitePlaceHilbertSymbol K n v a b := + infinitePlaceKummerRootCharacter_localGlobal + K n hnK hmu v a b + have hFinite : + (∏ᶠ v : HeightOneSpectrum (𝓞 K), + chi + (chosenFinitePlaceArtinMonoidHom (K := K) (L := L) v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele K a)))) = + ∏ᶠ v : HeightOneSpectrum (𝓞 K), + finitePlaceHilbertSymbol K n hnK hmu v a b := by + apply finprod_congr + intro v + have hcomponent : + (IdeleGroup.finiteComponent v (IdeleGroup.principalIdele K a) : + (v.adicCompletion K)ˣ) = + Units.map (algebraMap K (v.adicCompletion K)).toMonoidHom a := by + apply Units.ext + calc + ((IdeleGroup.finiteComponent v (IdeleGroup.principalIdele K a) : + (v.adicCompletion K)ˣ) : v.adicCompletion K) = + ((a : K) : v.adicCompletion K) := + IdeleGroup.finiteComponent_principalIdele a v + _ = algebraMap K (v.adicCompletion K) (a : K) := by + symm + have hmap := congrFun + (IsDedekindDomain.HeightOneSpectrum.algebraMap_adicCompletion + (𝓞 K) K (S := K) v) (a : K) + simpa using hmap + rw [hcomponent] + calc + chi + (chosenFinitePlaceArtinMonoidHom (K := K) (L := L) v + (Units.map (algebraMap K (v.adicCompletion K)).toMonoidHom a)) = + finitePlaceKummerRootCharacter K n hnK hmu v a b := by + change finitePlaceKummerRootCharacterOfExtension K n hnK hmu v a b + (chosenFinitePlaceExtension (L := L) v) = + finitePlaceKummerRootCharacter K n hnK hmu v a b + exact finitePlaceKummerRootCharacterOfExtension_eq K n hnK hmu v a b + (chosenFinitePlaceExtension (L := L) v) + _ = finitePlaceHilbertSymbol K n hnK hmu v a b := + finitePlaceKummerRootCharacter_localGlobal + K n hnK hmu v a b + unfold globalHilbertProduct + rw [← hInfinite, ← hFinite] + exact hMapped + +open scoped Classical in +/-- The Hilbert symbols of two global units have product one over all finite +and infinite places. -/ +theorem hilbertSymbol_allPlaces_product_eq_one + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a b : Kˣ) : + (∏ v : InfinitePlace K, + infinitePlaceHilbertSymbol K n v a b) * + ∏ᶠ v : HeightOneSpectrum (𝓞 K), + finitePlaceHilbertSymbol K n hnK hmu v a b = 1 := by + exact globalHilbertProduct_principal K n hnK hmu a b + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormulaAlgEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormulaAlgEquiv.lean new file mode 100644 index 0000000000..cb9bcd8a83 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormulaAlgEquiv.lean @@ -0,0 +1,121 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFamilyAlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteHilbertFactorNaturality +public import Mathlib.Algebra.BigOperators.Finprod +/-! +# Transport of the Hilbert product formula + +The product formula is invariant under a number-field equivalence. The +finite product is reindexed by the induced equivalence of finite places, +and the ordinary infinite product by the equivalence of infinite places. +-/ + +@[expose] public section + +open scoped BigOperators NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- The Hilbert product formula survives transport of the local-pairing +family across a number-field equivalence. -/ +theorem globalHilbertPairingFamilyCongr_productFormula + {F : Type u} {G : Type v} + [Field F] [NumberField F] [Field G] [NumberField G] + (e : F ≃ₐ[ℚ] G) (n : ℕ+) + (hmuF : (primitiveRoots (n : ℕ) F).Nonempty) + (hmuG : (primitiveRoots (n : ℕ) G).Nonempty) + (BF : GlobalHilbertPairingFamily F n) + (hBF : ∀ a b : Fˣ, + (∏ v : InfinitePlace F, + globalInfinitePlaceHilbertSymbol F n v a b) * + ∏ᶠ v : HeightOneSpectrum (𝓞 F), + GlobalHilbertPairingFamily.finiteFactor F BF hmuF v a b = 1) : + ∀ a b : Gˣ, + (∏ W : InfinitePlace G, + globalInfinitePlaceHilbertSymbol G n W a b) * + ∏ᶠ W : HeightOneSpectrum (𝓞 G), + GlobalHilbertPairingFamily.finiteFactor G + (globalHilbertPairingFamilyCongr e n hmuF BF) hmuG W a b = 1 := by + let eu : Fˣ ≃* Gˣ := Units.mapEquiv e.toRingEquiv.toMulEquiv + let er : rootsOfUnity (n : ℕ) F ≃* rootsOfUnity (n : ℕ) G := + rootsOfUnityEquivOfRingEquiv e.toRingEquiv n hmuF + let eFin := finitePlaceCongr e + let eInf := infinitePlaceEquivOfRingEquiv e.toRingEquiv + intro a b + let a₀ : Fˣ := eu.symm a + let b₀ : Fˣ := eu.symm b + let fInf : InfinitePlace F → rootsOfUnity (n : ℕ) F := + fun v => globalInfinitePlaceHilbertSymbol F n v a₀ b₀ + let fFin : HeightOneSpectrum (𝓞 F) → rootsOfUnity (n : ℕ) F := + fun v => GlobalHilbertPairingFamily.finiteFactor F BF hmuF v a₀ b₀ + have hInf (W : InfinitePlace G) : + globalInfinitePlaceHilbertSymbol G n W a b = + er (fInf (eInf.symm W)) := by + have h := globalInfinitePlaceHilbertSymbol_congr + e.toRingEquiv n hmuF W a₀ b₀ + change er (fInf (eInf.symm W)) = + globalInfinitePlaceHilbertSymbol G n W + (eu a₀) (eu b₀) at h + rw [eu.apply_symm_apply, eu.apply_symm_apply] at h + exact h.symm + have hFin (W : HeightOneSpectrum (𝓞 G)) : + GlobalHilbertPairingFamily.finiteFactor G + (globalHilbertPairingFamilyCongr e n hmuF BF) hmuG W a b = + er (fFin (eFin.symm W)) := by + have h := globalHilbertPairingFamilyCongr_finiteFactor + e n hmuF hmuG BF W a₀ b₀ + change er (fFin (eFin.symm W)) = + GlobalHilbertPairingFamily.finiteFactor G + (globalHilbertPairingFamilyCongr e n hmuF BF) hmuG W + (eu a₀) (eu b₀) at h + rw [eu.apply_symm_apply, eu.apply_symm_apply] at h + exact h.symm + have hInfProd : + (∏ W : InfinitePlace G, + globalInfinitePlaceHilbertSymbol G n W a b) = + er (∏ v : InfinitePlace F, fInf v) := by + calc + _ = ∏ W : InfinitePlace G, er (fInf (eInf.symm W)) := by + apply Fintype.prod_congr + intro W + exact hInf W + _ = er (∏ W : InfinitePlace G, fInf (eInf.symm W)) := + (map_prod er _ _).symm + _ = er (∏ v : InfinitePlace F, fInf v) := by + rw [Equiv.prod_comp eInf.symm fInf] + have hFinProd : + (∏ᶠ W : HeightOneSpectrum (𝓞 G), + GlobalHilbertPairingFamily.finiteFactor G + (globalHilbertPairingFamilyCongr e n hmuF BF) hmuG W a b) = + er (∏ᶠ v : HeightOneSpectrum (𝓞 F), fFin v) := by + calc + _ = ∏ᶠ W : HeightOneSpectrum (𝓞 G), er (fFin (eFin.symm W)) := + finprod_congr hFin + _ = er (∏ᶠ W : HeightOneSpectrum (𝓞 G), fFin (eFin.symm W)) := + (MulEquiv.map_finprod er _).symm + _ = er (∏ᶠ v : HeightOneSpectrum (𝓞 F), fFin v) := by + rw [finprod_comp_equiv eFin.symm] + calc + _ = er (∏ v : InfinitePlace F, fInf v) * + er (∏ᶠ v : HeightOneSpectrum (𝓞 F), fFin v) := by + rw [hInfProd, hFinProd] + _ = er ((∏ v : InfinitePlace F, fInf v) * + ∏ᶠ v : HeightOneSpectrum (𝓞 F), fFin v) := + (map_mul er _ _).symm + _ = er 1 := congrArg er (hBF a₀ b₀) + _ = 1 := map_one er + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitAbstractFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitAbstractFixedField.lean new file mode 100644 index 0000000000..d2fe01dcf1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitAbstractFixedField.lean @@ -0,0 +1,354 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPoints +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldNorm +/-! +# Abstract fixed fields in the rational idele-class representation + +Fixed-point comparisons for finite-index closed subgroups and their actual +abstract fixed fields. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open CyclicCohomology + +/-- The ordinary rational idele class group is the fixed part at the +distinguished base subgroup. This is `rationalIdeleClassEquivFixed` at +the bottom intermediate field, transported along mathlib's canonical +`ℚ ≃ₐ[ℚ] ⊥` equivalence and the identity +`Gal(ℚ_bar/⊥) = baseField`. -/ +noncomputable def rationalIdeleClassEquivBaseFixed : + Additive (IdeleClassGroup ℚ) ≃+ + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) := by + let B := (⊥ : + IntermediateField ℚ (SeparableClosure ℚ)) + letI : FiniteDimensional ℚ B := + (IntermediateField.botEquiv + ℚ (SeparableClosure ℚ)).symm.toLinearEquiv.finiteDimensional + letI : NumberField B := + NumberField.of_module_finite ℚ B + let e : ℚ ≃ₐ[ℚ] B := + (IntermediateField.botEquiv + ℚ (SeparableClosure ℚ)).symm + let hB : + RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) B = + baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) := + LocalClassFieldTheory.closedFixingSubgroup_bot_eq_baseField + ℚ (SeparableClosure ℚ) + exact + (MulEquiv.toAdditive + (ideleClassCongr e)).trans + ((rationalIdeleClassEquivFixed B).trans + (AddEquiv.addSubgroupCongr + (congrArg + (KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation) + hB))) + +/-- Scalar extension between finite rational intermediate fields becomes +the literal inclusion between their fixed parts in the absolute +idele-class representation. -/ +theorem rationalIdeleClassEquivFixed_extension_coe + {F E : IntermediateField ℚ (SeparableClosure ℚ)} + [FiniteDimensional ℚ F] [FiniteDimensional ℚ E] + (hFE : F ≤ E) + (c : RelativeIdeleGroup.ClassGroup ℚ F) : + (rationalIdeleClassEquivFixed E + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) (M := E) + (IntermediateField.inclusion hFE) c)))).1 = + (rationalIdeleClassEquivFixed F + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) c))).1 := by + change + Additive.ofMul + (rationalIntermediateIdeleClassToDirectLimit E + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) (M := E) + (IntermediateField.inclusion hFE) c))) = + Additive.ofMul + (rationalIntermediateIdeleClassToDirectLimit F + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) c)) + exact congrArg Additive.ofMul + (rationalIntermediateIdeleClassToDirectLimit_extension hFE c) + +/-- The distinguished base fixed-part equivalence sends an ordinary +rational idele class to its diagonal class at every finite Galois level +of the absolute direct limit. -/ +theorem rationalIdeleClassEquivBaseFixed_coe + (E : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)) + (c : IdeleClassGroup ℚ) : + (rationalIdeleClassEquivBaseFixed + (Additive.ofMul c)).1 = + Additive.ofMul + (rationalRelativeIdeleClassToDirectLimit E + (RelativeIdeleGroup.classInclusion ℚ E c)) := by + let B := (⊥ : + IntermediateField ℚ (SeparableClosure ℚ)) + let : FiniteDimensional ℚ B := + (IntermediateField.botEquiv + ℚ (SeparableClosure ℚ)).symm.toLinearEquiv.finiteDimensional + let : NumberField B := + NumberField.of_module_finite ℚ B + let e : ℚ ≃ₐ[ℚ] B := + (IntermediateField.botEquiv + ℚ (SeparableClosure ℚ)).symm + let hBE : + B ≤ (E : IntermediateField ℚ (SeparableClosure ℚ)) := + bot_le + let cB : RelativeIdeleGroup.ClassGroup ℚ B := + RelativeIdeleGroup.classInclusion ℚ B c + have hbaseChange : + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := B) cB = + ideleClassCongr e c := by + calc + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := B) cB = + ideleClassExtension ℚ B c := by + simpa only [cB] using + (_root_.relativeIdeleClassBaseChangeMulEquiv_classInclusion + (K := ℚ) (L := B) c) + _ = ideleClassCongr e c := + DFunLike.congr_fun + (rationalIdeleClassExtension_eq_ideleClassCongr e) c + have hclassEmbedding : + RelativeIdeleGroup.classEmbedding (K := ℚ) (L := B) (M := E) + (IntermediateField.inclusion hBE) cB = + RelativeIdeleGroup.classInclusion ℚ E c := by + simpa only [cB] using + (rationalRelativeIdeleClassEmbedding_classInclusion hBE c) + have h0 : + (rationalIdeleClassEquivBaseFixed (Additive.ofMul c)).1 = + (rationalIdeleClassEquivFixed B + (Additive.ofMul (ideleClassCongr e c))).1 := by + rfl + have h1 : + (rationalIdeleClassEquivFixed B + (Additive.ofMul (ideleClassCongr e c))).1 = + (rationalIdeleClassEquivFixed B + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := B) cB))).1 := + congrArg + (fun x : IdeleClassGroup B => + (rationalIdeleClassEquivFixed B (Additive.ofMul x)).1) + hbaseChange.symm + have h2 : + (rationalIdeleClassEquivFixed B + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := B) cB))).1 = + (rationalIdeleClassEquivFixed E + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := B) (M := E) + (IntermediateField.inclusion hBE) cB)))).1 := + (rationalIdeleClassEquivFixed_extension_coe hBE cB).symm + have h3 : + (rationalIdeleClassEquivFixed E + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := B) (M := E) + (IntermediateField.inclusion hBE) cB)))).1 = + Additive.ofMul + (rationalIntermediateIdeleClassToDirectLimit E + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) + (RelativeIdeleGroup.classInclusion ℚ E c))) := by + change + Additive.ofMul + (rationalIntermediateIdeleClassToDirectLimit E + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := B) (M := E) + (IntermediateField.inclusion hBE) cB))) = _ + rw [hclassEmbedding] + have h4 : + Additive.ofMul + (rationalIntermediateIdeleClassToDirectLimit E + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) + (RelativeIdeleGroup.classInclusion ℚ E c))) = + Additive.ofMul + (rationalRelativeIdeleClassToDirectLimit E + (RelativeIdeleGroup.classInclusion ℚ E c)) := + congrArg Additive.ofMul + (rationalFiniteGaloisIdeleClassToDirectLimit_baseChange + E (RelativeIdeleGroup.classInclusion ℚ E c)) + exact Eq.trans h0 (Eq.trans h1 (Eq.trans h2 (Eq.trans h3 h4))) + +private noncomputable instance + (K : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + [hfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] : + NumberField + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) K) := by + let : FiniteDimensional ℚ + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) K) := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hfinite + exact + NumberField.of_module_finite ℚ + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) K) + +/-- The actual idele class group of the fixed field represented by a +finite-index closed subgroup is the corresponding fixed part of the +rational absolute idele-class representation. This is the closed-subgroup +endpoint of `rationalIdeleClassEquivFixed`. -/ +noncomputable def rationalAbstractFixedFieldIdeleClassEquivFixed + (K : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + [hfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] : + Additive + (IdeleClassGroup + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) K)) ≃+ + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K := by + letI : FiniteDimensional ℚ + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) K) := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hfinite + have hclosed : + RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) K) = + K := + LocalClassFieldTheory.closedFixingSubgroup_abstractFixedField_eq + ℚ (SeparableClosure ℚ) K + exact + (rationalIdeleClassEquivFixed + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) K)).trans + (AddEquiv.addSubgroupCongr + (congrArg + (KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation) + hclosed)) + +/-- The closed-subgroup fixed-field endpoint has the same underlying +direct-limit class as the intermediate-field comparison from which it is +transported. -/ +@[simp] +theorem rationalAbstractFixedFieldIdeleClassEquivFixed_coe + (K : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + [hfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + (c : Additive + (IdeleClassGroup + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) K))) : + (rationalAbstractFixedFieldIdeleClassEquivFixed K c).1 = + (rationalIdeleClassEquivFixed + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) K) c).1 := by + let : FiniteDimensional ℚ + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) K) := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hfinite + rfl + +/-- The relative abstract fixed-field idele class group, identified with +the fixed part at the upper closed subgroup when finite dimensionality is +already available. -/ +noncomputable def + rationalAbstractRelativeFixedFieldIdeleClassEquivFixedOfFiniteDimensional + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [FiniteDimensional ℚ + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hLK)] + [NumberField + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hLK)] : + Additive + (IdeleClassGroup + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hLK)) ≃+ + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation L := by + let E := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hLK + letI : FiniteDimensional ℚ (E.restrictScalars ℚ) := by + change FiniteDimensional ℚ + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) L) + change FiniteDimensional ℚ E + infer_instance + let hclosed : + RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) (E.restrictScalars ℚ) = + L := by + change + RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) L) = + L + exact + LocalClassFieldTheory.closedFixingSubgroup_abstractFixedField_eq + ℚ (SeparableClosure ℚ) L + exact + (rationalIdeleClassEquivFixed + (E.restrictScalars ℚ)).trans + (AddEquiv.addSubgroupCongr + (congrArg + (KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation) + hclosed)) + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean new file mode 100644 index 0000000000..414c05d9de --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean @@ -0,0 +1,480 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing +public import Mathlib.Algebra.Colimit.DirectLimit +public import Mathlib.FieldTheory.Galois.Profinite +/-! +# The rational absolute idele-class direct limit + +Finite Galois relative idele class groups over `ℚ`, their scalar-extension +maps, and the induced absolute Galois representation. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open CyclicCohomology + +universe u + +/-- The rational algebra structure on the chosen separable closure is +the one induced by its realization inside the algebraic closure. -/ +@[reducible] +noncomputable instance rationalSeparableClosureAlgebra : + Algebra ℚ (SeparableClosure ℚ) := + letI : Algebra ℚ (AlgebraicClosure ℚ) := + AlgebraicClosure.instAlgebra ℚ + IntermediateField.algebra' (R' := ℚ) + (separableClosure ℚ (AlgebraicClosure ℚ)) + +/-- A rational intermediate field uses its actual inclusion into the +chosen separable closure as its algebra structure. -/ +@[reducible] +noncomputable instance rationalIntermediateFieldAlgebra + (E : IntermediateField ℚ (SeparableClosure ℚ)) : + Algebra ℚ E := + IntermediateField.algebra' (R' := ℚ) E + +/-- Every finite-dimensional rational intermediate field is a number +field. -/ +noncomputable instance rationalIntermediateFieldNumberField + (E : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ E] : + NumberField E := + NumberField.of_module_finite ℚ E + +/-- A finite quotient of nested closed rational absolute Galois +subgroups carries its canonical finite type. -/ +noncomputable instance rationalClosedSubgroupQuotientFintype + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + Fintype (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + Fintype.ofFinite _ + +/-- Extending the diagonal rational idele class through two nested +intermediate fields is the diagonal class at the larger field. -/ +theorem rationalRelativeIdeleClassEmbedding_classInclusion + {E F : IntermediateField ℚ (SeparableClosure ℚ)} + [NumberField E] [NumberField F] + (h : E ≤ F) + (c : IdeleClassGroup ℚ) : + RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion h) + (RelativeIdeleGroup.classInclusion ℚ E c) = + RelativeIdeleGroup.classInclusion ℚ F c := by + refine QuotientGroup.induction_on c ?_ + intro a + rfl + +/-- The action of the rational absolute Galois group on one finite +relative idele class group, obtained by restricting automorphisms. -/ +@[reducible] +noncomputable def rationalAbsoluteGaloisIdeleClassAction + (E : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)) : + MulDistribMulAction + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (RelativeIdeleGroup.ClassGroup ℚ E) := by + letI : + MulDistribMulAction (E ≃ₐ[ℚ] E) + (RelativeIdeleGroup.ClassGroup ℚ E) := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction ℚ E + exact + MulDistribMulAction.compHom + (RelativeIdeleGroup.ClassGroup ℚ E) + (AlgEquiv.restrictNormalHom E) + +/-- The rational absolute Galois action on every finite-Galois +relative idele class group. -/ +noncomputable instance rationalFiniteGaloisIdeleClassMulDistribMulAction + (E : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)) : + MulDistribMulAction + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (RelativeIdeleGroup.ClassGroup ℚ E) := + rationalAbsoluteGaloisIdeleClassAction E + +private instance + (E : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)) : + Monoid (RelativeIdeleGroup.ClassGroup ℚ E) := + inferInstance + +private noncomputable instance : + ∀ E : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ), + MulDistribMulAction + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (RelativeIdeleGroup.ClassGroup ℚ E) := + fun E => rationalAbsoluteGaloisIdeleClassAction E + +private noncomputable instance : + ∀ E : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ), + SMul + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (RelativeIdeleGroup.ClassGroup ℚ E) := + fun E => (rationalAbsoluteGaloisIdeleClassAction E).toSMul + +theorem rationalAbsoluteGaloisIdeleClass_smul_mk + (E : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)) + (σ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (a : RelativeIdeleGroup ℚ E) : + σ • QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup ℚ E) a = + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup ℚ E) + ((AlgEquiv.restrictNormalHom E σ) • a) := + rfl + +/-- Relative-adele scalar extension intertwines conjugation with the +restriction of an absolute Galois automorphism. -/ +theorem rationalRelativeAdeleEmbedding_conjugation_of_restrict + {E : IntermediateField ℚ (SeparableClosure ℚ)} + [FiniteDimensional ℚ E] + {F : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)} + (h : E ≤ (F : IntermediateField ℚ (SeparableClosure ℚ))) + (σ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (τ : E ≃ₐ[ℚ] E) + (hστ : ∀ x : E, + ((τ x : E) : SeparableClosure ℚ) = + σ (x : SeparableClosure ℚ)) + (z : RelativeAdeleRing ℚ E) : + RelativeIdeleGroup.adeleEmbedding (IntermediateField.inclusion h) + (RelativeIdeleGroup.conjugation ℚ E τ z) = + RelativeIdeleGroup.conjugation ℚ F + (AlgEquiv.restrictNormalHom F σ) + (RelativeIdeleGroup.adeleEmbedding (IntermediateField.inclusion h) z) := by + induction z using TensorProduct.inductionOn with + | tmul a x => + simp only [RelativeIdeleGroup.conjugation_tmul, + RelativeIdeleGroup.adeleEmbedding, + RelativeIdeleGroup.scalarEmbedding_tmul] + congr 1 + apply Subtype.ext + calc + ((IntermediateField.inclusion h (τ x) : F) : + SeparableClosure ℚ) = + ((τ x : E) : SeparableClosure ℚ) := rfl + _ = σ (x : SeparableClosure ℚ) := hστ x + _ = σ ((IntermediateField.inclusion h x : F) : + SeparableClosure ℚ) := rfl + _ = (((AlgEquiv.restrictNormalHom F σ) + (IntermediateField.inclusion h x) : F) : + SeparableClosure ℚ) := + (AlgEquiv.restrictNormal_commutes σ F + (IntermediateField.inclusion h x)).symm + | add x y hx hy => + simp only [map_add, hx, hy] + +/-- Relative-idele scalar extension intertwines conjugation with the +restriction of an absolute Galois automorphism. -/ +theorem rationalRelativeIdeleEmbedding_conjugation_of_restrict + {E : IntermediateField ℚ (SeparableClosure ℚ)} + [FiniteDimensional ℚ E] + {F : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)} + (h : E ≤ (F : IntermediateField ℚ (SeparableClosure ℚ))) + (σ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (τ : E ≃ₐ[ℚ] E) + (hστ : ∀ x : E, + ((τ x : E) : SeparableClosure ℚ) = + σ (x : SeparableClosure ℚ)) + (a : RelativeIdeleGroup ℚ E) : + RelativeIdeleGroup.ideleEmbedding (IntermediateField.inclusion h) + (τ • a) = + (AlgEquiv.restrictNormalHom F σ) • + RelativeIdeleGroup.ideleEmbedding (IntermediateField.inclusion h) a := by + apply Units.ext + exact + rationalRelativeAdeleEmbedding_conjugation_of_restrict + h σ τ hστ + (a : RelativeAdeleRing ℚ E) + +/-- Relative idele-class scalar extension intertwines conjugation with +the restriction of an absolute Galois automorphism. -/ +theorem + rationalRelativeIdeleClassEmbedding_conjugation_of_restrict + {E : IntermediateField ℚ (SeparableClosure ℚ)} + [FiniteDimensional ℚ E] + {F : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)} + (h : E ≤ (F : IntermediateField ℚ (SeparableClosure ℚ))) + (σ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (τ : E ≃ₐ[ℚ] E) + (hστ : ∀ x : E, + ((τ x : E) : SeparableClosure ℚ) = + σ (x : SeparableClosure ℚ)) + (c : RelativeIdeleGroup.ClassGroup ℚ E) : + RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion h) (τ • c) = + σ • RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion h) c := by + refine QuotientGroup.induction_on c ?_ + intro a + exact congrArg + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup ℚ F)) + (rationalRelativeIdeleEmbedding_conjugation_of_restrict + h σ τ hστ a) + +/-- The transition map between finite Galois relative idele class groups +is equivariant for the rational absolute Galois action. -/ +theorem rationalRelativeIdeleClassEmbedding_smul + {E F : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)} + (h : E ≤ F) + (σ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (c : RelativeIdeleGroup.ClassGroup ℚ E) : + RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion h) (σ • c) = + σ • RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion h) c := by + apply rationalRelativeIdeleClassEmbedding_conjugation_of_restrict + h σ (AlgEquiv.restrictNormalHom E σ) + intro x + simp only [AlgEquiv.restrictNormalHom_apply] + +/-- Acting after scalar extension agrees with the class embedding induced +by the resulting restricted field embedding. -/ +theorem + rationalRelativeIdeleClassEmbedding_smul_eq_classEmbedding + {E : IntermediateField ℚ (SeparableClosure ℚ)} + [FiniteDimensional ℚ E] + {F : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)} + (h : E ≤ F) + (σ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (c : RelativeIdeleGroup.ClassGroup ℚ E) : + (AlgEquiv.restrictNormalHom F σ) • + RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion h) c = + RelativeIdeleGroup.classEmbedding + ((AlgEquiv.restrictNormalHom F σ).toAlgHom.comp + (IntermediateField.inclusion h)) c := by + refine QuotientGroup.induction_on c ?_ + intro a + apply congrArg + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup ℚ F)) + apply Units.ext + change + RelativeIdeleGroup.conjugation ℚ F + (AlgEquiv.restrictNormalHom F σ) + (RelativeIdeleGroup.adeleEmbedding (IntermediateField.inclusion h) + (a : RelativeAdeleRing ℚ E)) = + RelativeIdeleGroup.adeleEmbedding + ((AlgEquiv.restrictNormalHom F σ).toAlgHom.comp + (IntermediateField.inclusion h)) + (a : RelativeAdeleRing ℚ E) + induction (a : RelativeAdeleRing ℚ E) using + TensorProduct.inductionOn with + | tmul y x => + simp only [RelativeIdeleGroup.adeleEmbedding, + RelativeIdeleGroup.scalarEmbedding_tmul, + RelativeIdeleGroup.conjugation_tmul] + congr 1 + | add x y hx hy => + let f := RelativeIdeleGroup.adeleEmbedding (IntermediateField.inclusion h) + let g := RelativeIdeleGroup.conjugation ℚ F (AlgEquiv.restrictNormalHom F σ) + let k := RelativeIdeleGroup.adeleEmbedding + ((AlgEquiv.restrictNormalHom F σ).toAlgHom.comp + (IntermediateField.inclusion h)) + exact + ((congrArg g (map_add f x y)).trans (map_add g (f x) (f y))).trans + ((congrArg₂ (· + ·) hx hy).trans (map_add k x y).symm) + +/-- The equivariant scalar-extension transition map in the +finite-Galois idele-class system. -/ +noncomputable def rationalRelativeIdeleClassTransition + {E F : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)} + (h : E ≤ F) : + MulDistribMulActionHom + (MonoidHom.id + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (RelativeIdeleGroup.ClassGroup ℚ E) + (RelativeIdeleGroup.ClassGroup ℚ F) where + toMonoidHom := + RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion h) + map_smul' σ c := by + simpa using rationalRelativeIdeleClassEmbedding_smul h σ c + +/-- Scalar extension of relative adeles along the identity inclusion is +the identity. -/ +theorem rationalRelativeAdeleEmbedding_self + (E : IntermediateField ℚ (SeparableClosure ℚ)) + [NumberField E] + (z : RelativeAdeleRing ℚ E) : + RelativeIdeleGroup.adeleEmbedding + (IntermediateField.inclusion (show E ≤ E from le_rfl)) z = z := by + induction z using TensorProduct.inductionOn with + | tmul a x => + simp only [RelativeIdeleGroup.adeleEmbedding, + RelativeIdeleGroup.scalarEmbedding_tmul] + congr 1 + | add x y hx hy => + simp only [map_add, hx, hy] + +/-- Scalar extension of relative adeles is transitive in a tower of +intermediate fields. -/ +theorem rationalRelativeAdeleEmbedding_comp + {E F H : IntermediateField ℚ (SeparableClosure ℚ)} + [NumberField E] [NumberField F] [NumberField H] + (hEF : E ≤ F) (hFH : F ≤ H) + (z : RelativeAdeleRing ℚ E) : + RelativeIdeleGroup.adeleEmbedding (IntermediateField.inclusion hFH) + (RelativeIdeleGroup.adeleEmbedding (IntermediateField.inclusion hEF) z) = + RelativeIdeleGroup.adeleEmbedding + (IntermediateField.inclusion (hEF.trans hFH)) z := by + exact congrArg (fun f => f z) + (Algebra.TensorProduct.map_id_comp + (S := NumberField.AdeleRing (𝓞 ℚ) ℚ) + (A := NumberField.AdeleRing (𝓞 ℚ) ℚ) + (IntermediateField.inclusion hFH) (IntermediateField.inclusion hEF)).symm + +/-- Scalar extension of relative idele classes along the identity +inclusion is the identity. -/ +theorem rationalRelativeIdeleClassEmbedding_self + (E : IntermediateField ℚ (SeparableClosure ℚ)) + [NumberField E] + (c : RelativeIdeleGroup.ClassGroup ℚ E) : + RelativeIdeleGroup.classEmbedding + (IntermediateField.inclusion (show E ≤ E from le_rfl)) c = c := by + refine QuotientGroup.induction_on c ?_ + intro a + exact congrArg + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup ℚ E)) + (Units.ext + (rationalRelativeAdeleEmbedding_self E + (a : RelativeAdeleRing ℚ E))) + +/-- Scalar extension of relative idele classes is transitive in a tower +of intermediate fields. -/ +theorem rationalRelativeIdeleClassEmbedding_comp + {E F H : IntermediateField ℚ (SeparableClosure ℚ)} + [NumberField E] [NumberField F] [NumberField H] + (hEF : E ≤ F) (hFH : F ≤ H) + (c : RelativeIdeleGroup.ClassGroup ℚ E) : + RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion hFH) + (RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion hEF) c) = + RelativeIdeleGroup.classEmbedding + (IntermediateField.inclusion (hEF.trans hFH)) c := by + have hinc : (IntermediateField.inclusion hFH).comp (IntermediateField.inclusion hEF) = + IntermediateField.inclusion (hEF.trans hFH) := by + ext x + rfl + calc + _ = RelativeIdeleGroup.classEmbedding + ((IntermediateField.inclusion hFH).comp (IntermediateField.inclusion hEF)) c := + RelativeIdeleGroup.classEmbedding_comp (K := ℚ) (L := E) (M := F) (N := H) + (IntermediateField.inclusion hFH) (IntermediateField.inclusion hEF) c + _ = _ := congrArg (fun f => RelativeIdeleGroup.classEmbedding f c) hinc + +/-- Scalar extension forms the directed system used by the rational idele-class limit. -/ +noncomputable instance rationalRelativeIdeleClassDirectedSystem : + DirectedSystem + (fun E : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ) => + RelativeIdeleGroup.ClassGroup ℚ E) + (fun _ _ h => rationalRelativeIdeleClassTransition h) where + map_self {i} c := + rationalRelativeIdeleClassEmbedding_self + (i : IntermediateField ℚ (SeparableClosure ℚ)) c + map_map {k} {j} {i} hIJ hJK c := + rationalRelativeIdeleClassEmbedding_comp + (E := (i : IntermediateField ℚ (SeparableClosure ℚ))) + (F := (j : IntermediateField ℚ (SeparableClosure ℚ))) + (H := (k : IntermediateField ℚ (SeparableClosure ℚ))) + hIJ hJK c + +/-- The direct limit of the actual idele class groups of the finite +Galois subextensions of `SeparableClosure ℚ / ℚ`. -/ +noncomputable abbrev rationalIdeleClassDirectLimit := + DirectLimit + (fun E : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ) => + RelativeIdeleGroup.ClassGroup ℚ E) + (fun _ _ h => rationalRelativeIdeleClassTransition h) + +/-- The multiplicative structure on the rational absolute idele-class +direct limit supplied by Mathlib's directed-limit construction. -/ +noncomputable instance rationalIdeleClassDirectLimitMonoid : + Monoid rationalIdeleClassDirectLimit := + DirectLimit.instMonoid + +theorem rationalIdeleClassDirectLimit_mk_apply + {E F : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)} + (c : RelativeIdeleGroup.ClassGroup ℚ E) + (h : E ≤ F) : + (⟦⟨F, RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion h) c⟩⟧ : + rationalIdeleClassDirectLimit) = + ⟦⟨E, c⟩⟧ := by + exact + DirectLimit.mk_apply + (F := fun E : + FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ) => + RelativeIdeleGroup.ClassGroup ℚ E) + (f := fun _ _ h => + rationalRelativeIdeleClassTransition h) + E F c h + +/-- The canonical map from one finite-level relative idele class group +to the directed limit. -/ +def rationalRelativeIdeleClassToDirectLimit + (E : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)) : + RelativeIdeleGroup.ClassGroup ℚ E →* + rationalIdeleClassDirectLimit where + toFun c := ⟦⟨E, c⟩⟧ + map_one' := by + exact + (DirectLimit.one_def + (G := fun E : + FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ) => + RelativeIdeleGroup.ClassGroup ℚ E) + (f := fun _ _ h => + rationalRelativeIdeleClassTransition h) + E).symm + map_mul' c d := by + exact + (DirectLimit.mul_def + (G := fun E : + FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ) => + RelativeIdeleGroup.ClassGroup ℚ E) + (f := fun _ _ h => + rationalRelativeIdeleClassTransition h) + E c d).symm + +/-- The rational absolute Galois action on the idele-class direct limit, +supplied by Mathlib from the equivariant transition maps. -/ +noncomputable instance + rationalIdeleClassDirectLimitMulDistribMulAction : + MulDistribMulAction + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + rationalIdeleClassDirectLimit := + DirectLimit.instMulDistribMulActionOfMulActionHomClass + (R := SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (G := fun E : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ) => + RelativeIdeleGroup.ClassGroup ℚ E) + (f := fun _ _ h => rationalRelativeIdeleClassTransition h) + +/-- The scalar action underlying the canonical absolute Galois action on +the rational idele-class direct limit. -/ +noncomputable instance rationalIdeleClassDirectLimitSMul : + SMul + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + rationalIdeleClassDirectLimit := + rationalIdeleClassDirectLimitMulDistribMulAction.toSMul + +/-- The coefficient representation of the global class formation: +the rational absolute Galois group acts on the direct limit of the +actual finite-level idele class groups. -/ +noncomputable def rationalIdeleClassRepresentation : + Rep ℤ (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) := + Rep.ofMulDistribMulAction + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + rationalIdeleClassDirectLimit + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean new file mode 100644 index 0000000000..8a1e5f7867 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean @@ -0,0 +1,672 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitAbstractFixedField +/-! +# Finite extensions in the rational idele-class representation + +The fixed representation of a finite abstract extension is compared with +the relative idele class group of its two actual fixed fields. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +private theorem rationalIdeleClassDirectLimit_smul_mk + (E : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)) + (c : RelativeIdeleGroup.ClassGroup ℚ E) + (σ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) : + σ • (⟦⟨E, c⟩⟧ : rationalIdeleClassDirectLimit) = + (⟦⟨E, σ • c⟩⟧ : rationalIdeleClassDirectLimit) := rfl + +open ClassFormation +open LocalClassFieldTheory +open CyclicCohomology + +private noncomputable instance + rationalAbstractTowerClassGroupCommGroup + (F E : Type) + [Field F] + [Field E] + [Algebra ℚ F] [Algebra F E] [Algebra ℚ E] + : + CommGroup (TowerRelativeIdeleGroup.ClassGroup ℚ F E) := by + letI : CommGroup (TowerRelativeIdeleGroup ℚ F E) := + inferInstance + exact + QuotientGroup.Quotient.commGroup + (TowerRelativeIdeleGroup.principalSubgroup ℚ F E) + +private noncomputable instance + rationalAbstractTowerClassGroupMul + (F E : Type) + [Field F] [NumberField F] + [Field E] [NumberField E] + [Algebra ℚ F] [Algebra F E] [Algebra ℚ E] + [IsScalarTower ℚ F E] + [FiniteDimensional ℚ F] [FiniteDimensional F E] : + Mul (TowerRelativeIdeleGroup.ClassGroup ℚ F E) := + (rationalAbstractTowerClassGroupCommGroup F E).toMul + +private noncomputable instance + rationalAbstractTowerClassGroupMulOneClass + (F E : Type) + [Field F] [NumberField F] + [Field E] [NumberField E] + [Algebra ℚ F] [Algebra F E] [Algebra ℚ E] + [IsScalarTower ℚ F E] + [FiniteDimensional ℚ F] [FiniteDimensional F E] : + MulOneClass (TowerRelativeIdeleGroup.ClassGroup ℚ F E) := + (rationalAbstractTowerClassGroupCommGroup F E).toMulOneClass + +private noncomputable instance + rationalAbstractRelativeClassGroupCommGroup + (F E : Type) + [Field F] [NumberField F] + [Field E] + [Algebra F E] : + CommGroup (RelativeIdeleGroup.ClassGroup F E) := by + letI : CommGroup (RelativeIdeleGroup F E) := + inferInstance + exact + QuotientGroup.Quotient.commGroup + (RelativeIdeleGroup.principalSubgroup F E) + +private noncomputable instance + rationalAbstractRelativeClassGroupMul + (F E : Type) + [Field F] [NumberField F] + [Field E] [NumberField E] + [Algebra F E] [FiniteDimensional F E] : + Mul (RelativeIdeleGroup.ClassGroup F E) := + (rationalAbstractRelativeClassGroupCommGroup F E).toMul + +private noncomputable instance + rationalAbstractRelativeClassGroupMulOneClass + (F E : Type) + [Field F] [NumberField F] + [Field E] [NumberField E] + [Algebra F E] [FiniteDimensional F E] : + MulOneClass (RelativeIdeleGroup.ClassGroup F E) := + (rationalAbstractRelativeClassGroupCommGroup F E).toMulOneClass + +/-- The coefficient representation attached to a finite abstract +extension is the existing relative idele class group of its two actual +fixed fields. This packages the fixed-part and tower base-change +comparisons into the endpoint used by finite reciprocity. -/ +noncomputable def rationalAbstractExtensionIdeleClassEquiv + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) K + let E := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hLK + letI := hnormal + letI : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional F E := + LocalClassFieldTheory.abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + letI : NumberField F := NumberField.of_module_finite ℚ F + letI : NumberField E := NumberField.of_module_finite ℚ E + (extensionFixedRepresentation rationalIdeleClassRepresentation + K L hLK hnormal).V ≃+ + Additive (RelativeIdeleGroup.ClassGroup F E) := by + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) K + let E := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hLK + letI := hnormal + letI : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional F E := + LocalClassFieldTheory.abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + letI : NumberField F := NumberField.of_module_finite ℚ F + letI : NumberField E := NumberField.of_module_finite ℚ E + let eFixed : + Additive (IdeleClassGroup E) ≃+ + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation L := + rationalAbstractRelativeFixedFieldIdeleClassEquivFixedOfFiniteDimensional K L hLK + let eRelative : + Additive (RelativeIdeleGroup.ClassGroup ℚ E) ≃+ + Additive (IdeleClassGroup E) := + MulEquiv.toAdditive + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E)) + let eTower : + Additive (RelativeIdeleGroup.ClassGroup ℚ E) ≃+ + Additive (RelativeIdeleGroup.ClassGroup F E) := + MulEquiv.toAdditive + ((TowerRelativeIdeleGroup.classGroupEquiv + ℚ F E).symm.trans + (towerRelativeIdeleClassBaseChangeMulEquiv + ℚ F E)) + exact + (((extensionFixedRepresentationEquiv + rationalIdeleClassRepresentation K L hLK hnormal).trans + eFixed.symm).trans eRelative.symm).trans eTower + +/-- In the direct-limit fixed-part comparison, one absolute left-coset +action is the idele-class embedding selected by the corresponding +embedding into the canonical normal closure. -/ +theorem rationalIdeleClassEquivFixed_relativeCosetAction_coe + (K : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] + (c : RelativeIdeleGroup.ClassGroup ℚ K) + (q : + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) + (⊥ : IntermediateField ℚ (SeparableClosure ℚ))).toSubgroup ⧸ + extensionSubgroup + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) + (⊥ : IntermediateField ℚ (SeparableClosure ℚ))) + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) K) + (LocalClassFieldTheory.fixingSubgroupLeBase + ℚ (SeparableClosure ℚ) K)) : + (relativeCosetAction rationalIdeleClassRepresentation + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) + (⊥ : IntermediateField ℚ (SeparableClosure ℚ))) + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) K) + (LocalClassFieldTheory.fixingSubgroupLeBase + ℚ (SeparableClosure ℚ) K) + (rationalIdeleClassEquivFixed K + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K) c))) q : + rationalIdeleClassRepresentation.V) = + Additive.ofMul + (rationalRelativeIdeleClassToDirectLimit + (rationalNormalClosure K) + (RelativeIdeleGroup.classEmbedding + (rationalBaseFixingCosetEquivNormalClosure K q) c)) := by + let hKN : + K ≤ (rationalNormalClosure K : + IntermediateField ℚ (SeparableClosure ℚ)) := + IntermediateField.le_normalClosure K + refine Quotient.inductionOn' q ?_ + intro σ + have hembedding : + rationalBaseFixingCosetEquivNormalClosure K + (QuotientGroup.mk σ) = + (AlgEquiv.restrictNormalHom + (rationalNormalClosure K) σ.1).toAlgHom.comp + (IntermediateField.inclusion + hKN) := by + apply AlgHom.ext + intro x + apply Subtype.ext + change + σ.1 (x : SeparableClosure ℚ) = + (((AlgEquiv.restrictNormalHom + (rationalNormalClosure K) σ.1) + (IntermediateField.inclusion + hKN x) : + rationalNormalClosure K) : + SeparableClosure ℚ) + exact + (AlgEquiv.restrictNormal_commutes σ.1 + (rationalNormalClosure K) + (IntermediateField.inclusion + hKN x)).symm + rw [hembedding] + change + Additive.ofMul + (σ.1 • + rationalIntermediateIdeleClassToDirectLimit K + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K) c)) = + Additive.ofMul + (rationalRelativeIdeleClassToDirectLimit + (rationalNormalClosure K) + (RelativeIdeleGroup.classEmbedding + ((AlgEquiv.restrictNormalHom + (rationalNormalClosure K) σ.1).toAlgHom.comp + (IntermediateField.inclusion + hKN)) c)) + rw [show + rationalIntermediateIdeleClassToDirectLimit K + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K) c) = + (⟦⟨rationalNormalClosure K, + rationalIntermediateIdeleClassToNormalClosure K + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K) c)⟩⟧ : + rationalIdeleClassDirectLimit) + from rfl, + rationalIdeleClassDirectLimit_smul_mk] + apply congrArg Additive.ofMul + apply congrArg + (fun d : + RelativeIdeleGroup.ClassGroup ℚ (rationalNormalClosure K) => + (⟦⟨rationalNormalClosure K, d⟩⟧ : + rationalIdeleClassDirectLimit)) + change + (AlgEquiv.restrictNormalHom + (rationalNormalClosure K) σ.1) • + RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion hKN) + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).symm + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K) c)) = + RelativeIdeleGroup.classEmbedding + ((AlgEquiv.restrictNormalHom + (rationalNormalClosure K) σ.1).toAlgHom.comp + (IntermediateField.inclusion + hKN)) c + rw [(_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).symm_apply_apply] + exact + rationalRelativeIdeleClassEmbedding_smul_eq_classEmbedding + hKN σ.1 c + +/-- The abstract class-formation norm in the rational idele-class +direct limit is the ordinary relative idele-class norm, embedded at the +canonical normal closure. -/ +theorem rationalIdeleClassEquivFixed_relativeNorm_coe + (K : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] + (c : RelativeIdeleGroup.ClassGroup ℚ K) : + (relativeNorm rationalIdeleClassRepresentation + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) + (⊥ : IntermediateField ℚ (SeparableClosure ℚ))) + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) K) + (LocalClassFieldTheory.fixingSubgroupLeBase + ℚ (SeparableClosure ℚ) K) + (rationalIdeleClassEquivFixed K + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K) c))) : + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) + (⊥ : IntermediateField ℚ (SeparableClosure ℚ)))).1 = + Additive.ofMul + (rationalRelativeIdeleClassToDirectLimit + (rationalNormalClosure K) + (RelativeIdeleGroup.classInclusion + ℚ (rationalNormalClosure K) + (RelativeIdeleGroup.Cohomology.ideleClassNorm ℚ K c))) := by + classical + let : Algebra K (rationalNormalClosure K) := + (IntermediateField.inclusion + (IntermediateField.le_normalClosure K)).toRingHom.toAlgebra + let : IsScalarTower ℚ K (rationalNormalClosure K) := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + let Q := + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) + (⊥ : IntermediateField ℚ (SeparableClosure ℚ))).toSubgroup ⧸ + extensionSubgroup + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) + (⊥ : IntermediateField ℚ (SeparableClosure ℚ))) + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) K) + (LocalClassFieldTheory.fixingSubgroupLeBase + ℚ (SeparableClosure ℚ) K) + let := Fintype.ofFinite Q + let term : Q → Additive rationalIdeleClassDirectLimit := + fun q => + (relativeCosetAction rationalIdeleClassRepresentation + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) + (⊥ : IntermediateField ℚ (SeparableClosure ℚ))) + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) K) + (LocalClassFieldTheory.fixingSubgroupLeBase + ℚ (SeparableClosure ℚ) K) + (rationalIdeleClassEquivFixed K + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K) c))) q : + Additive rationalIdeleClassDirectLimit) + have hterm (q : Q) : + Additive.toMul (term q) = + rationalRelativeIdeleClassToDirectLimit + (rationalNormalClosure K) + (RelativeIdeleGroup.classEmbedding + (rationalBaseFixingCosetEquivNormalClosure K q) c) := by + have h := + congrArg Additive.toMul + (rationalIdeleClassEquivFixed_relativeCosetAction_coe + K c q) + exact h.trans (toMul_ofMul _) + apply Additive.toMul.injective + change + Additive.toMul (∑ q : Q, term q) = + rationalRelativeIdeleClassToDirectLimit + (rationalNormalClosure K) + (RelativeIdeleGroup.classInclusion + ℚ (rationalNormalClosure K) + (RelativeIdeleGroup.Cohomology.ideleClassNorm ℚ K c)) + rw [toMul_sum] + calc + ∏ q : Q, + Additive.toMul (term q) = + ∏ q : Q, + rationalRelativeIdeleClassToDirectLimit + (rationalNormalClosure K) + (RelativeIdeleGroup.classEmbedding + (rationalBaseFixingCosetEquivNormalClosure K q) c) := by + apply Finset.prod_congr rfl + intro q _ + exact hterm q + _ = + rationalRelativeIdeleClassToDirectLimit + (rationalNormalClosure K) + (∏ q : Q, + RelativeIdeleGroup.classEmbedding + (rationalBaseFixingCosetEquivNormalClosure K q) c) := by + let g := + rationalRelativeIdeleClassToDirectLimit + (rationalNormalClosure K) + let f := fun q : Q => + RelativeIdeleGroup.classEmbedding + (rationalBaseFixingCosetEquivNormalClosure K q) c + have hmap (s : Finset Q) : + g (s.prod f) = + s.prod (fun q => g (f q)) := by + induction s using Finset.induction_on with + | empty => + exact g.map_one + | @insert q s hqs ih => + rw [Finset.prod_insert hqs, Finset.prod_insert hqs, + g.map_mul, ih] + change + (∏ q : Q, g (f q)) = + g (∏ q : Q, f q) + exact (hmap Finset.univ).symm + _ = + rationalRelativeIdeleClassToDirectLimit + (rationalNormalClosure K) + (∏ f : K →ₐ[ℚ] rationalNormalClosure K, + RelativeIdeleGroup.classEmbedding f c) := by + apply congrArg + (rationalRelativeIdeleClassToDirectLimit + (rationalNormalClosure K)) + exact + Fintype.prod_equiv + (rationalBaseFixingCosetEquivNormalClosure K) + (fun q : Q => + RelativeIdeleGroup.classEmbedding + (rationalBaseFixingCosetEquivNormalClosure K q) c) + (fun f : K →ₐ[ℚ] rationalNormalClosure K => + RelativeIdeleGroup.classEmbedding f c) + (fun _ => rfl) + _ = + rationalRelativeIdeleClassToDirectLimit + (rationalNormalClosure K) + (RelativeIdeleGroup.classInclusion + ℚ (rationalNormalClosure K) + (RelativeIdeleGroup.Cohomology.ideleClassNorm ℚ K c)) := by + apply congrArg + (rationalRelativeIdeleClassToDirectLimit + (rationalNormalClosure K)) + have hnorm : + RelativeIdeleGroup.Cohomology.ideleClassNorm ℚ K c = + RelativeIdeleGroup.classNorm ℚ K c := by + refine QuotientGroup.induction_on c ?_ + intro a + rfl + calc + (∏ f : K →ₐ[ℚ] rationalNormalClosure K, + RelativeIdeleGroup.classEmbedding f c) = + RelativeIdeleGroup.classInclusion + ℚ (rationalNormalClosure K) + (RelativeIdeleGroup.classNorm ℚ K c) := + (RelativeIdeleGroup.classInclusion_ideleClassNorm_eq_prod_embeddings + c).symm + _ = + RelativeIdeleGroup.classInclusion + ℚ (rationalNormalClosure K) + (RelativeIdeleGroup.Cohomology.ideleClassNorm ℚ K c) := by + rw [hnorm] + +/-- For a finite abstract rational field, the abstract norm to the base +has the ordinary relative idele-class norm as its underlying direct-limit +class. The two closed-subgroup indices are transported through their +actual fixed fields; no new norm is introduced. -/ +theorem + rationalAbstractFixedFieldIdeleClassEquivFixed_normToBase_coe + (H : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + [hfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + H (le_baseField H))] + (c : RelativeIdeleGroup.ClassGroup ℚ + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H)) : + (normToBase rationalIdeleClassRepresentation H + (rationalAbstractFixedFieldIdeleClassEquivFixed H + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) + (L := LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H) c))) : + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ))).1 = + Additive.ofMul + (rationalRelativeIdeleClassToDirectLimit + (rationalNormalClosure + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H)) + (RelativeIdeleGroup.classInclusion + ℚ + (rationalNormalClosure + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H)) + (RelativeIdeleGroup.Cohomology.ideleClassNorm ℚ + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H) c))) := by + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H + let : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H hfinite + let x : + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) F) := + rationalIdeleClassEquivFixed F + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) c)) + let x' : + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation H := + rationalAbstractFixedFieldIdeleClassEquivFixed H + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) c)) + have hx : x.1 = x'.1 := by + simpa only [x, x', F] using + (rationalAbstractFixedFieldIdeleClassEquivFixed_coe H + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) c))).symm + have htransport := + LocalClassFieldTheory.relativeNorm_coe_eq_of_closedSubgroup_eq + rationalIdeleClassRepresentation + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) + (⊥ : IntermediateField ℚ (SeparableClosure ℚ))) + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) F) + H + (LocalClassFieldTheory.fixingSubgroupLeBase + ℚ (SeparableClosure ℚ) F) + (le_baseField H) + (LocalClassFieldTheory.closedFixingSubgroup_bot_eq_baseField + ℚ (SeparableClosure ℚ)) + (LocalClassFieldTheory.closedFixingSubgroup_abstractFixedField_eq + ℚ (SeparableClosure ℚ) H) + x x' hx + exact htransport.symm.trans + (rationalIdeleClassEquivFixed_relativeNorm_coe F c) + +section AbstractFixedFieldOrdinaryNorm + +variable + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + +local instance rationalFiniteAbstractField_quotient_finite : + Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + H.field (le_baseField H.field)) := + H.finite + +/-- Pulling the abstract base norm of an actual fixed-field idele class +back through the distinguished rational fixed-part equivalence is the +ordinary idele-class norm of that class. -/ +theorem + rationalAbstractFixedFieldNormToBase_eq_ordinaryIdeleClassNorm + (c : Additive + (IdeleClassGroup + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field))) : + rationalIdeleClassEquivBaseFixed.symm + (normToBase rationalIdeleClassRepresentation H.field + (rationalAbstractFixedFieldIdeleClassEquivFixed + H.field c)) = + Additive.ofMul + (_root_.ideleClassNorm ℚ + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (Additive.toMul c)) := by + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + let d : RelativeIdeleGroup.ClassGroup ℚ F := + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F)).symm (Additive.toMul c) + have hc : + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) d = + Additive.toMul c := by + simpa only [d] using + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F)).apply_symm_apply + (Additive.toMul c)) + have hcoe : + (normToBase rationalIdeleClassRepresentation H.field + (rationalAbstractFixedFieldIdeleClassEquivFixed + H.field c) : + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ))).1 = + Additive.ofMul + (rationalRelativeIdeleClassToDirectLimit + (rationalNormalClosure F) + (RelativeIdeleGroup.classInclusion ℚ + (rationalNormalClosure F) + (RelativeIdeleGroup.Cohomology.ideleClassNorm + ℚ F d))) := by + have h := + rationalAbstractFixedFieldIdeleClassEquivFixed_normToBase_coe + H.field d + have hcAdd : + Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) d) = + c := by + simpa only [ofMul_toMul] using congrArg Additive.ofMul hc + rw [hcAdd] at h + exact h + have hordinary : + _root_.ideleClassNorm ℚ F (Additive.toMul c) = + RelativeIdeleGroup.Cohomology.ideleClassNorm ℚ F d := by + rw [← hc] + exact + ordinaryIdeleClassNorm_relativeIdeleClassBaseChange d + have hbase := + rationalIdeleClassEquivBaseFixed_coe + (rationalNormalClosure F) + (_root_.ideleClassNorm ℚ F (Additive.toMul c)) + have hcoe' := hcoe.trans + (congrArg + (fun x : IdeleClassGroup ℚ => + Additive.ofMul + (rationalRelativeIdeleClassToDirectLimit + (rationalNormalClosure F) + (RelativeIdeleGroup.classInclusion ℚ + (rationalNormalClosure F) x))) + hordinary.symm) + apply rationalIdeleClassEquivBaseFixed.injective + calc + rationalIdeleClassEquivBaseFixed + (rationalIdeleClassEquivBaseFixed.symm + (normToBase rationalIdeleClassRepresentation H.field + (rationalAbstractFixedFieldIdeleClassEquivFixed H.field c))) = + normToBase rationalIdeleClassRepresentation H.field + (rationalAbstractFixedFieldIdeleClassEquivFixed H.field c) := + rationalIdeleClassEquivBaseFixed.apply_symm_apply _ + _ = rationalIdeleClassEquivBaseFixed + (Additive.ofMul + (_root_.ideleClassNorm ℚ F (Additive.toMul c))) := by + apply Subtype.ext + exact hcoe'.trans hbase.symm + +end AbstractFixedFieldOrdinaryNorm + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionAction.lean new file mode 100644 index 0000000000..76290c4de1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionAction.lean @@ -0,0 +1,726 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtension +/-! +# Galois actions on rational fixed-field idele classes + +Naturality of the fixed-field comparison for automorphisms and the +finite-extension Galois action. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open LocalClassFieldTheory +open CyclicCohomology + +/-- The fixed-part comparison intertwines an automorphism of a finite +rational intermediate field with any lift to the rational absolute +Galois group. -/ +theorem rationalIdeleClassEquivFixed_action_coe + (E : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ E] + (σ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (τ : E ≃ₐ[ℚ] E) + (hστ : ∀ x : E, + ((τ x : E) : SeparableClosure ℚ) = + σ (x : SeparableClosure ℚ)) + (c : RelativeIdeleGroup.ClassGroup ℚ E) : + rationalIdeleClassRepresentation.ρ σ + (rationalIdeleClassEquivFixed E + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) c))).1 = + (rationalIdeleClassEquivFixed E + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) (τ • c)))).1 := by + change + Additive.ofMul + (σ • rationalIntermediateIdeleClassToDirectLimit E + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) c)) = + Additive.ofMul + (rationalIntermediateIdeleClassToDirectLimit E + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) (τ • c))) + exact congrArg Additive.ofMul + (rationalIntermediateIdeleClassToDirectLimit_conjugation + E σ τ hστ c) + +/-- The fixed-part idèle-class realization is natural under an +equivalence between two finite rational intermediate fields induced by +an automorphism of the rational separable closure. -/ +theorem rationalIdeleClassEquivFixed_ambientAlgEquiv + {E F : IntermediateField ℚ (SeparableClosure ℚ)} + [FiniteDimensional ℚ E] [FiniteDimensional ℚ F] + (σ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (e : E ≃ₐ[ℚ] F) + (hσe : ∀ x : E, + ((e x : F) : SeparableClosure ℚ) = + σ (x : SeparableClosure ℚ)) + (c : IdeleClassGroup E) : + rationalIdeleClassRepresentation.ρ σ + (rationalIdeleClassEquivFixed E + (Additive.ofMul c)).1 = + (rationalIdeleClassEquivFixed F + (Additive.ofMul (ideleClassCongr e c))).1 := by + change + Additive.ofMul + (σ • rationalIntermediateIdeleClassToDirectLimit E c) = + Additive.ofMul + (rationalIntermediateIdeleClassToDirectLimit F + (ideleClassCongr e c)) + exact congrArg Additive.ofMul + (rationalIntermediateIdeleClassToDirectLimit_ambientAlgEquiv + σ e hσe c) + +private theorem relativeIdeleClassBaseChangeAddEquiv_apply + (E : Type) [Field E] [NumberField E] + (c : Additive (RelativeIdeleGroup.ClassGroup ℚ E)) : + (MulEquiv.toAdditive + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E))) c = + Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) (Additive.toMul c)) := by + rfl + +/-- The relative fixed-field comparison has the same underlying direct-limit +class as the intermediate-field comparison from which it is transported. -/ +private theorem + rationalAbstractRelativeFixedFieldIdeleClassEquivFixed_coe + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [FiniteDimensional ℚ + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK)] + [FiniteDimensional ℚ + ((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hLK).restrictScalars ℚ)] + [NumberField + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK)] + (c : Additive + (IdeleClassGroup + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK))) : + (rationalAbstractRelativeFixedFieldIdeleClassEquivFixedOfFiniteDimensional + K L hLK c).1 = + (rationalIdeleClassEquivFixed + ((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hLK).restrictScalars ℚ) c).1 := by + rfl + +private theorem + rationalAbstractRelativeFixedFieldIdeleClassEquivFixed_baseChange_coe + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [FiniteDimensional ℚ + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK)] + [FiniteDimensional ℚ + ((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hLK).restrictScalars ℚ)] + [NumberField + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK)] + (c : Additive + (RelativeIdeleGroup.ClassGroup ℚ + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK))) : + (rationalAbstractRelativeFixedFieldIdeleClassEquivFixedOfFiniteDimensional + K L hLK + ((MulEquiv.toAdditive + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) + (L := abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hLK))) c)).1 = + (rationalIdeleClassEquivFixed + ((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hLK).restrictScalars ℚ) + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) + (L := abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hLK) + (Additive.toMul c)))).1 := by + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + let eFixed := + rationalAbstractRelativeFixedFieldIdeleClassEquivFixedOfFiniteDimensional + K L hLK + let eRelative := + MulEquiv.toAdditive + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E)) + calc + (eFixed (eRelative c)).1 = + (rationalIdeleClassEquivFixed + (E.restrictScalars ℚ) (eRelative c)).1 := + rationalAbstractRelativeFixedFieldIdeleClassEquivFixed_coe + K L hLK (eRelative c) + _ = (rationalIdeleClassEquivFixed + (E.restrictScalars ℚ) + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) (Additive.toMul c)))).1 := + congrArg + (fun d => + (rationalIdeleClassEquivFixed + (E.restrictScalars ℚ) d).1) + (relativeIdeleClassBaseChangeAddEquiv_apply E c) + +private theorem + rationalAbstractRelativeFixedFieldIdeleClassEquivFixed_action_baseChange_coe + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [FiniteDimensional ℚ + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK)] + [FiniteDimensional ℚ + ((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hLK).restrictScalars ℚ)] + [NumberField + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK)] + (σ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (τ₀ : + abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK ≃ₐ[ℚ] + abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK) + (hστ : ∀ y : abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hLK, + ((τ₀ y : abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hLK) : SeparableClosure ℚ) = + σ (y : SeparableClosure ℚ)) + (c : Additive + (RelativeIdeleGroup.ClassGroup ℚ + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK))) : + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + let eFixed := + rationalAbstractRelativeFixedFieldIdeleClassEquivFixedOfFiniteDimensional + K L hLK + let eRelative := + MulEquiv.toAdditive + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E)) + rationalIdeleClassRepresentation.ρ σ + (eFixed (eRelative c)).1 = + (eFixed + (eRelative + (Additive.ofMul + (τ₀ • Additive.toMul c)))).1 := by + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + let eFixed := + rationalAbstractRelativeFixedFieldIdeleClassEquivFixedOfFiniteDimensional + K L hLK + let eRelative := + MulEquiv.toAdditive + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E)) + let E₀ := E.restrictScalars ℚ + let τQ : E₀ ≃ₐ[ℚ] E₀ := τ₀ + let cRelQ : RelativeIdeleGroup.ClassGroup ℚ E₀ := + Additive.toMul c + let cQ : IdeleClassGroup E₀ := + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E₀) cRelQ + let cτRelQ : RelativeIdeleGroup.ClassGroup ℚ E₀ := + τQ • cRelQ + let cτQ : IdeleClassGroup E₀ := + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E₀) cτRelQ + have hστQ : ∀ y : E₀, + ((τQ y : E₀) : SeparableClosure ℚ) = + σ (y : SeparableClosure ℚ) := by + exact hστ + have hAction := + rationalIdeleClassEquivFixed_ambientAlgEquiv + (E := E₀) (F := E₀) + σ τQ hστQ cQ + have hLeft : + (eFixed (eRelative c)).1 = + (rationalIdeleClassEquivFixed + E₀ (Additive.ofMul cQ)).1 := by + exact + rationalAbstractRelativeFixedFieldIdeleClassEquivFixed_baseChange_coe + K L hLK c + have hCongr : + ideleClassCongr τQ cQ = cτQ := by + exact + (_root_.relativeIdeleClassBaseChangeMulEquiv_smul_congr + τQ cRelQ).symm + have hcτRaw : + cτQ = + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) + (τ₀ • Additive.toMul c) := by + rfl + have hRight : + (rationalIdeleClassEquivFixed + E₀ (Additive.ofMul (ideleClassCongr τQ cQ))).1 = + (eFixed + (eRelative + (Additive.ofMul + (τ₀ • Additive.toMul c)))).1 := by + calc + _ = (rationalIdeleClassEquivFixed + E₀ (Additive.ofMul cτQ)).1 := + congrArg + (fun d => + (rationalIdeleClassEquivFixed + E₀ (Additive.ofMul d)).1) + hCongr + _ = (rationalIdeleClassEquivFixed + E₀ + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) + (τ₀ • Additive.toMul c)))).1 := + congrArg + (fun d => + (rationalIdeleClassEquivFixed + E₀ (Additive.ofMul d)).1) + hcτRaw + _ = _ := + (rationalAbstractRelativeFixedFieldIdeleClassEquivFixed_baseChange_coe + K L hLK + (Additive.ofMul + (τ₀ • Additive.toMul c))).symm + calc + rationalIdeleClassRepresentation.ρ σ + (eFixed (eRelative c)).1 = + rationalIdeleClassRepresentation.ρ σ + (rationalIdeleClassEquivFixed + E₀ (Additive.ofMul cQ)).1 := + congrArg (rationalIdeleClassRepresentation.ρ σ) hLeft + _ = (rationalIdeleClassEquivFixed + E₀ + (Additive.ofMul + (ideleClassCongr τQ cQ))).1 := + hAction + _ = _ := hRight + +private theorem + rationalAbstractExtensionIdeleClassEquiv_action_fixed_mk + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (σ : K.toSubgroup) + (x : (extensionFixedRepresentation rationalIdeleClassRepresentation + K L hLK hnormal).V) : + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI := hnormal + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + letI : NumberField F := NumberField.of_module_finite ℚ F + letI : NumberField E := NumberField.of_module_finite ℚ E + let M := + extensionFixedRepresentation rationalIdeleClassRepresentation + K L hLK hnormal + let eAmbient := + extensionFixedRepresentationEquiv + rationalIdeleClassRepresentation K L hLK hnormal + let eFixed := + rationalAbstractRelativeFixedFieldIdeleClassEquivFixedOfFiniteDimensional K L hLK + let eRelative := + MulEquiv.toAdditive + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E)) + let eQ := + abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) K L hLK hnormal + let τ : E ≃ₐ[F] E := + eQ (QuotientGroup.mk' (extensionSubgroup K L hLK) σ) + let τ₀ : E ≃ₐ[ℚ] E := τ.restrictScalars ℚ + let c : Additive (RelativeIdeleGroup.ClassGroup ℚ E) := + eRelative.symm (eFixed.symm (eAmbient x)) + eAmbient + (M.ρ + (QuotientGroup.mk' (extensionSubgroup K L hLK) σ) x) = + eFixed + (eRelative + (Additive.ofMul (τ₀ • Additive.toMul c))) := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + let := hnormal + let : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + let : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + let : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + let : NumberField F := NumberField.of_module_finite ℚ F + let : NumberField E := NumberField.of_module_finite ℚ E + let : FiniteDimensional ℚ (E.restrictScalars ℚ) := by + change FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) L) + change FiniteDimensional ℚ E + infer_instance + let M := + extensionFixedRepresentation rationalIdeleClassRepresentation + K L hLK hnormal + let eAmbient := + extensionFixedRepresentationEquiv + rationalIdeleClassRepresentation K L hLK hnormal + let eFixed := + rationalAbstractRelativeFixedFieldIdeleClassEquivFixedOfFiniteDimensional K L hLK + let eRelative := + MulEquiv.toAdditive + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E)) + let eQ := + abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) K L hLK hnormal + let τ : E ≃ₐ[F] E := + eQ (QuotientGroup.mk' (extensionSubgroup K L hLK) σ) + let τ₀ : E ≃ₐ[ℚ] E := τ.restrictScalars ℚ + let c : Additive (RelativeIdeleGroup.ClassGroup ℚ E) := + eRelative.symm (eFixed.symm (eAmbient x)) + have hc : + eFixed (eRelative c) = eAmbient x := by + calc + eFixed (eRelative c) = + eFixed (eFixed.symm (eAmbient x)) := + congrArg eFixed + (eRelative.apply_symm_apply + (eFixed.symm (eAmbient x))) + _ = eAmbient x := + eFixed.apply_symm_apply (eAmbient x) + have hστ : ∀ y : E, + ((τ₀ y : E) : SeparableClosure ℚ) = + σ.1 (y : SeparableClosure ℚ) := by + intro y + change + ((τ y : E) : SeparableClosure ℚ) = + σ.1 (y : SeparableClosure ℚ) + simpa only [τ, eQ] using + (abstractExtensionQuotientEquivGaloisGroup_mk_apply_val + ℚ (SeparableClosure ℚ) K L hLK hnormal σ y).symm + apply Subtype.ext + calc + (eAmbient + (M.ρ + (QuotientGroup.mk' (extensionSubgroup K L hLK) σ) x)).1 = + relativeCosetAction rationalIdeleClassRepresentation + K L hLK (eAmbient x) + (QuotientGroup.mk' + (extensionSubgroup K L hLK) σ) := + extensionFixedRepresentation_action_coe + rationalIdeleClassRepresentation K L hLK hnormal + (QuotientGroup.mk' + (extensionSubgroup K L hLK) σ) x + _ = + rationalIdeleClassRepresentation.ρ σ.1 + (eAmbient x).1 := by + change + relativeCosetAction rationalIdeleClassRepresentation + K L hLK (eAmbient x) (QuotientGroup.mk σ) = + rationalIdeleClassRepresentation.ρ σ.1 + (eAmbient x).1 + exact + relativeCosetAction_mk + rationalIdeleClassRepresentation K L hLK + (eAmbient x) σ + _ = + rationalIdeleClassRepresentation.ρ σ.1 + (eFixed (eRelative c)).1 := by + rw [hc] + _ = + (eFixed + (eRelative + (Additive.ofMul + (τ₀ • Additive.toMul c)))).1 := by + exact + rationalAbstractRelativeFixedFieldIdeleClassEquivFixed_action_baseChange_coe + K L hLK σ.1 τ₀ hστ c + +private theorem rationalTowerRelativeIdeleClassBaseChangeAddEquiv_smul + (F E : Type) + [Field F] [NumberField F] + [Field E] [NumberField E] + [Algebra ℚ F] [Algebra F E] [Algebra ℚ E] + [IsScalarTower ℚ F E] + [FiniteDimensional ℚ F] [FiniteDimensional F E] + (τ : E ≃ₐ[F] E) + (c : Additive (RelativeIdeleGroup.ClassGroup ℚ E)) : + let eTower : + Additive (RelativeIdeleGroup.ClassGroup ℚ E) ≃+ + Additive (RelativeIdeleGroup.ClassGroup F E) := + (MulEquiv.toAdditive + (TowerRelativeIdeleGroup.classGroupEquiv + ℚ F E).symm).trans + (MulEquiv.toAdditive + (towerRelativeIdeleClassBaseChangeMulEquiv + ℚ F E)) + eTower + (Additive.ofMul + ((τ.restrictScalars ℚ) • Additive.toMul c)) = + Additive.ofMul + (τ • Additive.toMul (eTower c)) := by + let eTower : + Additive (RelativeIdeleGroup.ClassGroup ℚ E) ≃+ + Additive (RelativeIdeleGroup.ClassGroup F E) := + (MulEquiv.toAdditive + (TowerRelativeIdeleGroup.classGroupEquiv + ℚ F E).symm).trans + (MulEquiv.toAdditive + (towerRelativeIdeleClassBaseChangeMulEquiv + ℚ F E)) + apply Additive.toMul.injective + change + towerRelativeIdeleClassBaseChangeMulEquiv ℚ F E + ((TowerRelativeIdeleGroup.classGroupEquiv ℚ F E).symm + ((τ.restrictScalars ℚ) • Additive.toMul c)) = + τ • + towerRelativeIdeleClassBaseChangeMulEquiv ℚ F E + ((TowerRelativeIdeleGroup.classGroupEquiv ℚ F E).symm + (Additive.toMul c)) + exact + towerRelativeIdeleClassBaseChangeMulEquiv_smul + ℚ F E τ (Additive.toMul c) + +private theorem addEquiv_trans_symm_trans_symm_trans_apply_eq + {V A B C D : Type*} + [Add V] [Add A] [Add B] [Add C] [Add D] + (eV : V ≃+ D) (eB : B ≃+ D) + (eA : A ≃+ B) (eC : A ≃+ C) + {y : V} {z : A} {w : C} + (h : eV y = eB (eA z)) + (ht : eC z = w) : + (((eV.trans eB.symm).trans eA.symm).trans eC) y = w := by + change eC (eA.symm (eB.symm (eV y))) = w + rw [h, eB.symm_apply_apply, eA.symm_apply_apply] + exact ht + +private theorem rationalAbstractExtensionIdeleClassEquiv_action_mk + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (σ : K.toSubgroup) + (x : (extensionFixedRepresentation rationalIdeleClassRepresentation + K L hLK hnormal).V) : + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI := hnormal + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + letI : NumberField F := NumberField.of_module_finite ℚ F + letI : NumberField E := NumberField.of_module_finite ℚ E + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L hLK hnormal + letI : MulDistribMulAction (E ≃ₐ[F] E) + (RelativeIdeleGroup.ClassGroup F E) := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction F E + rationalAbstractExtensionIdeleClassEquiv K L hLK hnormal + ((extensionFixedRepresentation rationalIdeleClassRepresentation + K L hLK hnormal).ρ + (QuotientGroup.mk' + (extensionSubgroup K L hLK) σ) x) = + (Rep.ofMulDistribMulAction (E ≃ₐ[F] E) + (RelativeIdeleGroup.ClassGroup F E)).ρ + (abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) K L hLK hnormal + (QuotientGroup.mk' + (extensionSubgroup K L hLK) σ)) + (rationalAbstractExtensionIdeleClassEquiv + K L hLK hnormal x) := by + have hfixed := rationalAbstractExtensionIdeleClassEquiv_action_fixed_mk + K L hLK hnormal (hKfinite := hKfinite) (hfinite := hfinite) σ x + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + let := hnormal + let : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + let : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + let : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + let : NumberField F := NumberField.of_module_finite ℚ F + let : NumberField E := NumberField.of_module_finite ℚ E + let : FiniteDimensional ℚ (E.restrictScalars ℚ) := by + change FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) L) + change FiniteDimensional ℚ E + infer_instance + let : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L hLK hnormal + let : MulDistribMulAction (E ≃ₐ[F] E) + (RelativeIdeleGroup.ClassGroup F E) := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction F E + let M := + extensionFixedRepresentation rationalIdeleClassRepresentation + K L hLK hnormal + let eAmbient := + extensionFixedRepresentationEquiv + rationalIdeleClassRepresentation K L hLK hnormal + let eFixed : + Additive (IdeleClassGroup E) ≃+ + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation L := + rationalAbstractRelativeFixedFieldIdeleClassEquivFixedOfFiniteDimensional K L hLK + let eRelative : + Additive (RelativeIdeleGroup.ClassGroup ℚ E) ≃+ + Additive (IdeleClassGroup E) := + MulEquiv.toAdditive + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E)) + let eTower : + Additive (RelativeIdeleGroup.ClassGroup ℚ E) ≃+ + Additive (RelativeIdeleGroup.ClassGroup F E) := + (MulEquiv.toAdditive + (TowerRelativeIdeleGroup.classGroupEquiv + ℚ F E).symm).trans + (MulEquiv.toAdditive + (towerRelativeIdeleClassBaseChangeMulEquiv + ℚ F E)) + let eQ := + abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) K L hLK hnormal + let τ : E ≃ₐ[F] E := + eQ (QuotientGroup.mk' (extensionSubgroup K L hLK) σ) + let τ₀ : E ≃ₐ[ℚ] E := τ.restrictScalars ℚ + let c : Additive (RelativeIdeleGroup.ClassGroup ℚ E) := + eRelative.symm (eFixed.symm (eAmbient x)) + have htower := rationalTowerRelativeIdeleClassBaseChangeAddEquiv_smul F E τ c + have hresult := addEquiv_trans_symm_trans_symm_trans_apply_eq + _ _ _ eTower hfixed htower + exact hresult + +/-- The abstract quotient action on the rational absolute idele-class +representation becomes the ordinary Galois action on the relative idele +class group of the two concrete fixed fields. -/ +theorem rationalAbstractExtensionIdeleClassEquiv_action + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (q : K.toSubgroup ⧸ extensionSubgroup K L hLK) + (x : (extensionFixedRepresentation rationalIdeleClassRepresentation + K L hLK hnormal).V) : + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI := hnormal + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + letI : NumberField F := NumberField.of_module_finite ℚ F + letI : NumberField E := NumberField.of_module_finite ℚ E + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L hLK hnormal + letI : MulDistribMulAction (E ≃ₐ[F] E) + (RelativeIdeleGroup.ClassGroup F E) := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction F E + rationalAbstractExtensionIdeleClassEquiv K L hLK hnormal + ((extensionFixedRepresentation rationalIdeleClassRepresentation + K L hLK hnormal).ρ q x) = + (Rep.ofMulDistribMulAction (E ≃ₐ[F] E) + (RelativeIdeleGroup.ClassGroup F E)).ρ + (abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) K L hLK hnormal q) + (rationalAbstractExtensionIdeleClassEquiv + K L hLK hnormal x) := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + let := hnormal + let : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + let : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + let : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + let : NumberField F := NumberField.of_module_finite ℚ F + let : NumberField E := NumberField.of_module_finite ℚ E + let : FiniteDimensional ℚ (E.restrictScalars ℚ) := by + change FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) L) + change FiniteDimensional ℚ E + infer_instance + let : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L hLK hnormal + let : MulDistribMulAction (E ≃ₐ[F] E) + (RelativeIdeleGroup.ClassGroup F E) := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction F E + refine Quotient.inductionOn' q ?_ + intro σ + exact + rationalAbstractExtensionIdeleClassEquiv_action_mk + K L hLK hnormal σ x + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionNorm.lean new file mode 100644 index 0000000000..44385d0354 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionNorm.lean @@ -0,0 +1,860 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionAction +/-! +# Norms on rational fixed-field idele classes + +Compatibility of fixed-field inclusion and relative norm with the actual +idele-class extension attached to the abstract subgroup tower. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open LocalClassFieldTheory +open CyclicCohomology + +private theorem fourStepAddEquiv_apply_eq + {V A B C D : Type*} + [Add V] [Add A] [Add B] [Add C] [Add D] + (eV : V ≃+ D) (eB : B ≃+ D) + (eA : A ≃+ B) (eC : A ≃+ C) + {y : V} {z : A} {w : C} + (h : eV y = eB (eA z)) + (ht : eC z = w) : + (((eV.trans eB.symm).trans eA.symm).trans eC) y = w := by + change eC (eA.symm (eB.symm (eV y))) = w + rw [h, eB.symm_apply_apply, eA.symm_apply_apply] + exact ht + +private theorem repOfMulDistribMulAction_rho_toMul + {G A : Type*} [Group G] [CommGroup A] + [MulDistribMulAction G A] + (g : G) (a : Additive A) : + Additive.toMul + ((Rep.ofMulDistribMulAction G A).ρ g a) = + g • Additive.toMul a := + rfl + +private theorem fintype_prod_comp_equiv + {ι κ A : Type*} + [Fintype ι] [Fintype κ] [CommMonoid A] + (e : ι ≃ κ) (f : κ → A) : + (∏ i, f (e i)) = ∏ k, f k := + Fintype.prod_equiv e + (fun i => f (e i)) f (fun _ => rfl) + +private theorem eq_of_common_ofMul_image + {A B : Type*} + (f : A → B) (hf : Function.Injective f) + {u : Additive B} {a b : A} + (ha : u = Additive.ofMul (f a)) + (hb : u = Additive.ofMul (f b)) : + a = b := by + have h := congrArg Additive.toMul (ha.symm.trans hb) + change f a = f b at h + exact hf h + +private noncomputable def relativeIdeleClassNormAdditiveValue + (F E : Type) + [Field F] [NumberField F] + [Field E] + [Algebra F E] [FiniteDimensional F E] + (c : Additive (RelativeIdeleGroup.ClassGroup F E)) : + Additive (IdeleClassGroup F) := + Additive.ofMul + (RelativeIdeleGroup.Cohomology.ideleClassNorm F E + (Additive.toMul c)) + +private noncomputable def includedRelativeIdeleClassNormAdditiveValue + (F E : Type) + [Field F] [NumberField F] + [Field E] + [Algebra F E] [FiniteDimensional F E] + (c : Additive (RelativeIdeleGroup.ClassGroup F E)) : + Additive (RelativeIdeleGroup.ClassGroup F E) := + Additive.ofMul + (RelativeIdeleGroup.classInclusion F E + (RelativeIdeleGroup.Cohomology.ideleClassNorm F E + (Additive.toMul c))) + +private noncomputable def rationalFixedFieldInclusionComparison + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (c : RelativeIdeleGroup.ClassGroup ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) K)) := + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI := hnormal + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + letI : NumberField F := NumberField.of_module_finite ℚ F + letI : NumberField E := NumberField.of_module_finite ℚ E + (rationalAbstractExtensionIdeleClassEquiv K L hLK hnormal + ((extensionFixedRepresentationEquiv + rationalIdeleClassRepresentation K L hLK hnormal).symm + (fixedFieldInclusion rationalIdeleClassRepresentation + K L hLK + (rationalAbstractFixedFieldIdeleClassEquivFixed K + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) c))))), + Additive.ofMul + (RelativeIdeleGroup.classInclusion F E + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) c))) + +private noncomputable def rationalExtensionNormComparison + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (x : (extensionFixedRepresentation rationalIdeleClassRepresentation + K L hLK hnormal).V) := + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI := hnormal + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K inferInstance + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK inferInstance inferInstance + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + letI : NumberField F := NumberField.of_module_finite ℚ F + letI : NumberField E := NumberField.of_module_finite ℚ E + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L hLK hnormal + let M := + extensionFixedRepresentation rationalIdeleClassRepresentation + K L hLK hnormal + let e := + rationalAbstractExtensionIdeleClassEquiv K L hLK hnormal + (e (M.norm.hom x), + includedRelativeIdeleClassNormAdditiveValue F E (e x)) + +private noncomputable def rationalRelativeNormComparison + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation L) := + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI := hnormal + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + letI : NumberField F := NumberField.of_module_finite ℚ F + letI : NumberField E := NumberField.of_module_finite ℚ E + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L hLK hnormal + let eAmbient := + extensionFixedRepresentationEquiv + rationalIdeleClassRepresentation K L hLK hnormal + let eK := rationalAbstractFixedFieldIdeleClassEquivFixed K + let e := + rationalAbstractExtensionIdeleClassEquiv K L hLK hnormal + (eK.symm + (relativeNorm rationalIdeleClassRepresentation + K L hLK a), + relativeIdeleClassNormAdditiveValue F E + (e (eAmbient.symm a))) + +private theorem rationalRelativeNormComparison_fst + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation L) : + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI := hnormal + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + letI : NumberField F := NumberField.of_module_finite ℚ F + letI : NumberField E := NumberField.of_module_finite ℚ E + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L hLK hnormal + let eK := rationalAbstractFixedFieldIdeleClassEquivFixed K + (rationalRelativeNormComparison K L hLK hnormal a).1 = + eK.symm (relativeNorm rationalIdeleClassRepresentation K L hLK a) := rfl + +private noncomputable def rationalFixedFieldIdeleClassAdditiveType + (K : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] : Type := + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : NumberField F := NumberField.of_module_finite ℚ F + Additive (IdeleClassGroup F) + +private noncomputable def rationalFixedFieldIdeleClassType + (K : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] : Type := + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : NumberField F := NumberField.of_module_finite ℚ F + IdeleClassGroup F + +private noncomputable def rationalRelativeNormSource + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation L) : + rationalFixedFieldIdeleClassAdditiveType + (hKfinite := hKfinite) K := + (rationalRelativeNormComparison + (hKfinite := hKfinite) (hfinite := hfinite) + K L hLK hnormal a).1 + +private noncomputable def rationalRelativeNormTarget + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation L) : + rationalFixedFieldIdeleClassAdditiveType + (hKfinite := hKfinite) K := + (rationalRelativeNormComparison + (hKfinite := hKfinite) (hfinite := hfinite) + K L hLK hnormal a).2 + +private noncomputable def rationalRelativeNormClassNormSource + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation L) : + rationalFixedFieldIdeleClassType + (hKfinite := hKfinite) K := + Additive.toMul + (rationalRelativeNormTarget + (hKfinite := hKfinite) (hfinite := hfinite) + K L hLK hnormal a) + +private noncomputable def rationalRelativeNormClassNormTarget + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation L) : + rationalFixedFieldIdeleClassType + (hKfinite := hKfinite) K := + Additive.toMul + (rationalRelativeNormSource + (hKfinite := hKfinite) (hfinite := hfinite) + K L hLK hnormal a) + +/-- The fixed-part inclusion from the lower abstract field to the upper +one becomes the existing relative idele-class inclusion under the +fixed-field realization. -/ +theorem + rationalAbstractExtensionIdeleClassEquiv_fixedFieldInclusion + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (c : RelativeIdeleGroup.ClassGroup ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) K)) : + let comparison := + rationalFixedFieldInclusionComparison K L hLK hnormal c + comparison.1 = comparison.2 := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + let _ := hnormal + let _ : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + let _ : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + let _ : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + let _ : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + let _ : NumberField F := NumberField.of_module_finite ℚ F + let _ : NumberField E := NumberField.of_module_finite ℚ E + let _ : FiniteDimensional ℚ (E.restrictScalars ℚ) := by + change FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) L) + change FiniteDimensional ℚ E + infer_instance + let hFE : F ≤ E.restrictScalars ℚ := + abstractFixedField_le ℚ (SeparableClosure ℚ) hLK + let eAmbient := + extensionFixedRepresentationEquiv + rationalIdeleClassRepresentation K L hLK hnormal + let eFixed : + Additive (IdeleClassGroup E) ≃+ + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation L := + rationalAbstractRelativeFixedFieldIdeleClassEquivFixedOfFiniteDimensional K L hLK + let eRelative : + Additive (RelativeIdeleGroup.ClassGroup ℚ E) ≃+ + Additive (IdeleClassGroup E) := + MulEquiv.toAdditive + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E)) + let eTower : + Additive (RelativeIdeleGroup.ClassGroup ℚ E) ≃+ + Additive (RelativeIdeleGroup.ClassGroup F E) := + MulEquiv.toAdditive + ((TowerRelativeIdeleGroup.classGroupEquiv + ℚ F E).symm.trans + (towerRelativeIdeleClassBaseChangeMulEquiv + ℚ F E)) + let aK : + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K := + rationalAbstractFixedFieldIdeleClassEquivFixed K + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) c)) + let cE : RelativeIdeleGroup.ClassGroup ℚ E := + RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) (M := E) + (IntermediateField.inclusion hFE) c + let z : Additive (RelativeIdeleGroup.ClassGroup ℚ E) := + Additive.ofMul cE + let y : + (extensionFixedRepresentation rationalIdeleClassRepresentation + K L hLK hnormal).V := + eAmbient.symm + (fixedFieldInclusion rationalIdeleClassRepresentation + K L hLK aK) + have hFixed : + eFixed (eRelative z) = + fixedFieldInclusion rationalIdeleClassRepresentation + K L hLK aK := by + apply Subtype.ext + calc + (eFixed (eRelative z)).1 = + (rationalIdeleClassEquivFixed + (E.restrictScalars ℚ) + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) cE))).1 := by + rfl + _ = + (rationalIdeleClassEquivFixed F + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) c))).1 := by + change + Additive.ofMul + (rationalIntermediateIdeleClassToDirectLimit + (E.restrictScalars ℚ) + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E.restrictScalars ℚ) + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) (M := E) + (IntermediateField.inclusion hFE) c))) = + Additive.ofMul + (rationalIntermediateIdeleClassToDirectLimit F + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) c)) + exact congrArg Additive.ofMul + (rationalIntermediateIdeleClassToDirectLimit_extension hFE c) + _ = aK.1 := by + simpa only [aK, F] using + (rationalAbstractFixedFieldIdeleClassEquivFixed_coe K + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) c))).symm + _ = + (fixedFieldInclusion rationalIdeleClassRepresentation + K L hLK aK).1 := by + exact + (fixedFieldInclusion_coe rationalIdeleClassRepresentation + K L hLK aK).symm + have hAmbient : + eAmbient y = eFixed (eRelative z) := by + calc + eAmbient y = + fixedFieldInclusion rationalIdeleClassRepresentation + K L hLK aK := + eAmbient.apply_symm_apply _ + _ = eFixed (eRelative z) := hFixed.symm + have hTower : + eTower z = + Additive.ofMul + (RelativeIdeleGroup.classInclusion F E + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) c)) := by + apply Additive.toMul.injective + change + towerRelativeIdeleClassBaseChangeMulEquiv ℚ F E + ((TowerRelativeIdeleGroup.classGroupEquiv + ℚ F E).symm cE) = + RelativeIdeleGroup.classInclusion F E + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) c) + exact + rationalRelativeIdeleClassEmbedding_towerBaseChange hFE c + change + (((eAmbient.trans eFixed.symm).trans eRelative.symm).trans eTower) y = + Additive.ofMul + (RelativeIdeleGroup.classInclusion F E + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) c)) + exact fourStepAddEquiv_apply_eq + eAmbient eFixed eRelative eTower hAmbient hTower + +/-- Under the fixed-field realization, the representation norm is the +existing relative idele-class norm, viewed in the upper class group by +the existing class inclusion. -/ +theorem rationalAbstractExtensionIdeleClassEquiv_norm + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (x : (extensionFixedRepresentation rationalIdeleClassRepresentation + K L hLK hnormal).V) : + let comparison := + rationalExtensionNormComparison K L hLK hnormal x + comparison.1 = comparison.2 := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + let _ := hnormal + let _ : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K inferInstance + let _ : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK inferInstance inferInstance + let _ : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + let _ : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + let _ : NumberField F := NumberField.of_module_finite ℚ F + let _ : NumberField E := NumberField.of_module_finite ℚ E + let _ : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L hLK hnormal + let _ : MulDistribMulAction (E ≃ₐ[F] E) + (RelativeIdeleGroup.ClassGroup F E) := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction F E + let Q := K.toSubgroup ⧸ extensionSubgroup K L hLK + let _ : Fintype Q := Fintype.ofFinite Q + let M := + extensionFixedRepresentation rationalIdeleClassRepresentation + K L hLK hnormal + let e := + rationalAbstractExtensionIdeleClassEquiv K L hLK hnormal + let eQ := + abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) K L hLK hnormal + let c : RelativeIdeleGroup.ClassGroup F E := + Additive.toMul (e x) + change e (M.norm.hom x) = + includedRelativeIdeleClassNormAdditiveValue F E (e x) + apply Additive.toMul.injective + simp only [Rep.norm, Representation.norm] + change + Additive.toMul (e ((∑ q : Q, M.ρ q) x)) = + RelativeIdeleGroup.classInclusion F E + (RelativeIdeleGroup.Cohomology.ideleClassNorm F E c) + rw [LinearMap.sum_apply, map_sum, toMul_sum] + have hActionProd : + (∏ q : Q, Additive.toMul (e (M.ρ q x))) = + ∏ q : Q, eQ q • c := by + apply Finset.prod_congr rfl + intro q _ + rw [rationalAbstractExtensionIdeleClassEquiv_action + K L hLK hnormal q x] + exact repOfMulDistribMulAction_rho_toMul (eQ q) (e x) + have hReindex : + (∏ q : Q, eQ q • c) = + ∏ τ : E ≃ₐ[F] E, τ • c := by + exact fintype_prod_comp_equiv eQ.toEquiv + (fun τ : E ≃ₐ[F] E => τ • c) + have hNormProd : + (∏ τ : E ≃ₐ[F] E, τ • c) = + RelativeIdeleGroup.classInclusion F E + (RelativeIdeleGroup.Cohomology.ideleClassNorm F E c) := + (RelativeIdeleGroup.classInclusion_ideleClassNorm_eq_prod_conjugates + c).symm + exact Eq.trans hActionProd (Eq.trans hReindex hNormProd) + +private theorem rationalRelativeNorm_representation_norm + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation L) : + let M := + extensionFixedRepresentation rationalIdeleClassRepresentation + K L hLK hnormal + let eAmbient := + extensionFixedRepresentationEquiv + rationalIdeleClassRepresentation K L hLK hnormal + M.norm.hom (eAmbient.symm a) = + eAmbient.symm + (fixedFieldInclusion rationalIdeleClassRepresentation + K L hLK + (relativeNorm rationalIdeleClassRepresentation + K L hLK a)) := by + let M := + extensionFixedRepresentation rationalIdeleClassRepresentation + K L hLK hnormal + let eAmbient := + extensionFixedRepresentationEquiv + rationalIdeleClassRepresentation K L hLK hnormal + let x := eAmbient.symm a + let n := + relativeNorm rationalIdeleClassRepresentation K L hLK a + change + M.norm.hom x = + eAmbient.symm + (fixedFieldInclusion rationalIdeleClassRepresentation + K L hLK n) + apply Subtype.ext + change (M.norm.hom x).1 = n.1 + have hNormCoe := + extensionFixedRepresentation_norm_coe + rationalIdeleClassRepresentation + K L hLK hnormal x + change + (M.norm.hom x).1 = + (relativeNorm rationalIdeleClassRepresentation + K L hLK (eAmbient x)).1 at hNormCoe + have hxa : eAmbient x = a := + eAmbient.apply_symm_apply a + rw [hxa] at hNormCoe + exact hNormCoe + +private theorem rationalRelativeNormClassNorm_eq + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation L) : + rationalRelativeNormClassNormSource + (hKfinite := hKfinite) (hfinite := hfinite) + K L hLK hnormal a = + rationalRelativeNormClassNormTarget + (hKfinite := hKfinite) (hfinite := hfinite) + K L hLK hnormal a := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + let _ := hnormal + let _ : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + let _ : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + let _ : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + let _ : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + let _ : NumberField F := NumberField.of_module_finite ℚ F + let _ : NumberField E := NumberField.of_module_finite ℚ E + let _ : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L hLK hnormal + let Q := K.toSubgroup ⧸ extensionSubgroup K L hLK + let _ : Fintype Q := Fintype.ofFinite Q + let M := + extensionFixedRepresentation rationalIdeleClassRepresentation + K L hLK hnormal + let eAmbient := + extensionFixedRepresentationEquiv + rationalIdeleClassRepresentation K L hLK hnormal + let eK := + rationalAbstractFixedFieldIdeleClassEquivFixed K + let e := + rationalAbstractExtensionIdeleClassEquiv K L hLK hnormal + let x := eAmbient.symm a + let n := + relativeNorm rationalIdeleClassRepresentation K L hLK a + let q := + RelativeIdeleGroup.Cohomology.ideleClassNorm F E + (Additive.toMul (e x)) + let cK : RelativeIdeleGroup.ClassGroup ℚ F := + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F)).symm + (Additive.toMul (eK.symm n)) + have hcK : + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) cK = + Additive.toMul (eK.symm n) := by + exact + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F)).apply_symm_apply + (Additive.toMul (eK.symm n)) + have hn : + eK + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) cK)) = + n := by + rw [hcK] + change eK (eK.symm n) = n + exact eK.apply_symm_apply n + have hMnorm : + M.norm.hom x = + eAmbient.symm + (fixedFieldInclusion rationalIdeleClassRepresentation + K L hLK n) := by + exact rationalRelativeNorm_representation_norm + (hfinite := hfinite) K L hLK hnormal a + have hNorm := + rationalAbstractExtensionIdeleClassEquiv_norm + K L hLK hnormal x + have hInclusion := + rationalAbstractExtensionIdeleClassEquiv_fixedFieldInclusion + K L hLK hnormal cK + change + e (M.norm.hom x) = + Additive.ofMul + (RelativeIdeleGroup.classInclusion F E q) at hNorm + change + e + (eAmbient.symm + (fixedFieldInclusion rationalIdeleClassRepresentation + K L hLK + (eK + (Additive.ofMul + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) cK))))) = + Additive.ofMul + (RelativeIdeleGroup.classInclusion F E + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) cK)) at hInclusion + have hNorm' := + (congrArg (fun t => e t) hMnorm).symm.trans hNorm + have hInclusionLeft := congrArg + (fun b => + e + (eAmbient.symm + (fixedFieldInclusion rationalIdeleClassRepresentation + K L hLK b))) + hn + have hInclusionRight := congrArg + (fun d : IdeleClassGroup F => + Additive.ofMul + (RelativeIdeleGroup.classInclusion F E d)) + hcK + have hInclusion' := + hInclusionLeft.symm.trans (hInclusion.trans hInclusionRight) + have hq : + q = Additive.toMul (eK.symm n) := by + exact eq_of_common_ofMul_image + (fun d : IdeleClassGroup F => + RelativeIdeleGroup.classInclusion F E d) + (RelativeIdeleGroup.classInclusion_injective F E) + hNorm' hInclusion' + change q = Additive.toMul (eK.symm n) + exact hq + +/-- The relative norm in the rational absolute idele-class +representation is the existing relative idele-class norm on the two +actual fixed fields. -/ +theorem + rationalAbstractFixedFieldIdeleClassEquivFixed_relativeNorm + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation L) : + rationalRelativeNormSource + (hKfinite := hKfinite) (hfinite := hfinite) + K L hLK hnormal a = + rationalRelativeNormTarget + (hKfinite := hKfinite) (hfinite := hfinite) + K L hLK hnormal a := by + have h := congrArg Additive.ofMul + (rationalRelativeNormClassNorm_eq + (hKfinite := hKfinite) (hfinite := hfinite) + K L hLK hnormal a).symm + change + rationalRelativeNormSource + (hKfinite := hKfinite) (hfinite := hfinite) + K L hLK hnormal a = + rationalRelativeNormTarget + (hKfinite := hKfinite) (hfinite := hfinite) + K L hLK hnormal a at h + exact h + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevel.lean new file mode 100644 index 0000000000..4b2a62fdb0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevel.lean @@ -0,0 +1,228 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevelCore +/-! +# Tensor comparison and injectivity at finite rational levels + +This endpoint leaf contains the tensor-unflattening comparisons and the +resulting injectivity theorems. The finite-level normal-closure maps and +their tower compatibility live in the reusable core leaf. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open CyclicCohomology + +attribute [local instance] + relativeAdeleRingIntermediateAlgebra + +local instance rationalFiniteLevelEndpointNumberField + (K : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] : NumberField K := + NumberField.of_module_finite ℚ K +/-- Rational relative-adele scalar extension agrees with unflattening +the corresponding fixed-bottom tensor tower. -/ +theorem rationalRelativeAdeleEmbedding_unflatten + {K N : IntermediateField ℚ (SeparableClosure ℚ)} + [FiniteDimensional ℚ K] [FiniteDimensional ℚ N] + (hKN : K ≤ N) + (a : RelativeAdeleRing ℚ K) : + letI : Algebra K N := + (IntermediateField.inclusion hKN).toRingHom.toAlgebra + letI : IsScalarTower ℚ K N := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional K N := + FiniteDimensional.right ℚ K N + towerRelativeAdeleUnflatten ℚ K N + (RelativeIdeleGroup.adeleEmbedding (K := ℚ) (L := K) (M := N) + (IntermediateField.inclusion hKN) a) = + a ⊗ₜ[K] (1 : N) := by + let : Algebra K N := + (IntermediateField.inclusion hKN).toRingHom.toAlgebra + let : IsScalarTower ℚ K N := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + let : FiniteDimensional K N := + FiniteDimensional.right ℚ K N + have hflatten : + towerRelativeAdeleFlatten ℚ K N + (towerRelativeAdeleUnflatten ℚ K N + (RelativeIdeleGroup.adeleEmbedding (K := ℚ) (L := K) (M := N) + (IntermediateField.inclusion hKN) a)) = + RelativeIdeleGroup.adeleEmbedding (K := ℚ) (L := K) (M := N) + (IntermediateField.inclusion hKN) a := + (towerRelativeAdeleRingEquiv ℚ K N).apply_symm_apply + (RelativeIdeleGroup.adeleEmbedding (K := ℚ) (L := K) (M := N) + (IntermediateField.inclusion hKN) a) + apply + (towerRelativeAdeleRingEquiv ℚ K N).injective + change + towerRelativeAdeleFlatten ℚ K N + (towerRelativeAdeleUnflatten ℚ K N + (RelativeIdeleGroup.adeleEmbedding (K := ℚ) (L := K) (M := N) + (IntermediateField.inclusion hKN) a)) = + towerRelativeAdeleFlatten ℚ K N + (a ⊗ₜ[K] (1 : N)) + rw [hflatten] + rw [towerRelativeAdeleFlatten_tmul] + simp only [map_one, mul_one] + rfl + +/-- Rational relative-idele scalar extension agrees with unflattening +the corresponding fixed-bottom tensor tower. -/ +theorem rationalRelativeIdeleEmbedding_unflatten + {K N : IntermediateField ℚ (SeparableClosure ℚ)} + [FiniteDimensional ℚ K] [FiniteDimensional ℚ N] + (hKN : K ≤ N) + (a : RelativeIdeleGroup ℚ K) : + letI : Algebra K N := + (IntermediateField.inclusion hKN).toRingHom.toAlgebra + letI : IsScalarTower ℚ K N := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional K N := + FiniteDimensional.right ℚ K N + letI : Algebra K (RelativeAdeleRing ℚ K) := + relativeAdeleRingIntermediateAlgebra ℚ K + (towerRelativeIdeleEquiv ℚ K N).symm + (RelativeIdeleGroup.ideleEmbedding (K := ℚ) (L := K) (M := N) + (IntermediateField.inclusion hKN) a) = + (Units.map + (@Algebra.TensorProduct.includeLeft + K K (RelativeAdeleRing ℚ K) N + inferInstance inferInstance + (relativeAdeleRingIntermediateAlgebra ℚ K) + inferInstance + ((IntermediateField.inclusion hKN).toRingHom.toAlgebra) + inferInstance + (relativeAdeleRingIntermediateAlgebra ℚ K) + (@smulCommClass_self K (RelativeAdeleRing ℚ K) inferInstance + (@Algebra.toModule K (RelativeAdeleRing ℚ K) inferInstance inferInstance + (relativeAdeleRingIntermediateAlgebra ℚ + K)).toDistribMulAction.toMulAction)).toMonoidHom a : + TowerRelativeIdeleGroup ℚ K N) := by + let : Algebra K N := + (IntermediateField.inclusion hKN).toRingHom.toAlgebra + let : IsScalarTower ℚ K N := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + let : FiniteDimensional K N := + FiniteDimensional.right ℚ K N + let : Algebra K (RelativeAdeleRing ℚ K) := + relativeAdeleRingIntermediateAlgebra ℚ K + apply Units.ext + exact + rationalRelativeAdeleEmbedding_unflatten + hKN (a : RelativeAdeleRing ℚ K) + +/-- Rational relative idele-class scalar extension agrees with the +fixed-bottom tower base-change equivalence. -/ +theorem + rationalRelativeIdeleClassEmbedding_towerBaseChange + {K N : IntermediateField ℚ (SeparableClosure ℚ)} + [FiniteDimensional ℚ K] [FiniteDimensional ℚ N] + (hKN : K ≤ N) + (c : RelativeIdeleGroup.ClassGroup ℚ K) : + letI : Algebra K N := + (IntermediateField.inclusion hKN).toRingHom.toAlgebra + letI : IsScalarTower ℚ K N := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional K N := + FiniteDimensional.right ℚ K N + towerRelativeIdeleClassBaseChangeMulEquiv ℚ K N + ((TowerRelativeIdeleGroup.classGroupEquiv ℚ K N).symm + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := K) (M := N) + (IntermediateField.inclusion hKN) c)) = + RelativeIdeleGroup.classInclusion K N + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K) c) := by + let : Algebra K N := + (IntermediateField.inclusion hKN).toRingHom.toAlgebra + let : IsScalarTower ℚ K N := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + let : FiniteDimensional K N := + FiniteDimensional.right ℚ K N + refine QuotientGroup.induction_on c ?_ + intro a + change + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K N) + (towerRelativeIdeleBaseChangeMulEquiv ℚ K N + ((towerRelativeIdeleEquiv ℚ K N).symm + (RelativeIdeleGroup.ideleEmbedding (K := ℚ) (L := K) (M := N) + (IntermediateField.inclusion hKN) a))) = + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K N) + (RelativeIdeleGroup.inclusion K N + (relativeIdeleBaseChangeMulEquiv + (K := ℚ) (L := K) a)) + apply congrArg + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K N)) + rw [rationalRelativeIdeleEmbedding_unflatten hKN a] + exact + towerRelativeIdeleBaseChangeMulEquiv_includeLeft + ℚ K N a + +/-- Scalar extension between finite rational relative idele class groups +is injective. -/ +theorem rationalRelativeIdeleClassEmbedding_injective + {K N : IntermediateField ℚ (SeparableClosure ℚ)} + [FiniteDimensional ℚ K] [FiniteDimensional ℚ N] + (hKN : K ≤ N) : + Function.Injective + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := K) (M := N) + (IntermediateField.inclusion hKN)) := by + let : Algebra K N := + (IntermediateField.inclusion hKN).toRingHom.toAlgebra + let : IsScalarTower ℚ K N := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + let : FiniteDimensional K N := + FiniteDimensional.right ℚ K N + intro a b hab + have htransport := + congrArg + (fun c : RelativeIdeleGroup.ClassGroup ℚ N => + towerRelativeIdeleClassBaseChangeMulEquiv ℚ K N + ((TowerRelativeIdeleGroup.classGroupEquiv ℚ K N).symm c)) + hab + rw [rationalRelativeIdeleClassEmbedding_towerBaseChange hKN a, + rationalRelativeIdeleClassEmbedding_towerBaseChange hKN b] + at htransport + apply + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).injective + exact + RelativeIdeleGroup.classInclusion_injective K N htransport + +/-- Each finite-level relative idele class group embeds into the rational +idele-class direct limit. -/ +theorem rationalRelativeIdeleClassToDirectLimit_injective + (E : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)) : + Function.Injective + (rationalRelativeIdeleClassToDirectLimit E) := by + exact + DirectLimit.mk_injective + (F := fun E : + FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ) => + RelativeIdeleGroup.ClassGroup ℚ E) + (f := fun _ _ h => + rationalRelativeIdeleClassTransition h) + (fun _ _ h => + rationalRelativeIdeleClassEmbedding_injective h) + E + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevelCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevelCore.lean new file mode 100644 index 0000000000..6c726f9688 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevelCore.lean @@ -0,0 +1,260 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitCore +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.ClosedFixingSubgroup +public import Mathlib.GroupTheory.QuotientGroup.Defs +/-! +# Finite levels of the rational idele-class direct limit + +Normal closures, finite-level scalar extension, tower base change, and the +canonical embeddings into the rational idele-class direct limit. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open CyclicCohomology + +attribute [local instance] + relativeAdeleRingIntermediateAlgebra + +local instance rationalIntermediateNumberField + (K : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] : NumberField K := + NumberField.of_module_finite ℚ K + +instance rationalTowerClassGroupCommGroup + (K N : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] [FiniteDimensional ℚ N] + [Algebra K N] [IsScalarTower ℚ K N] [FiniteDimensional K N] : + CommGroup (TowerRelativeIdeleGroup.ClassGroup ℚ K N) := by + letI : CommGroup (TowerRelativeIdeleGroup ℚ K N) := inferInstance + exact + QuotientGroup.Quotient.commGroup + (TowerRelativeIdeleGroup.principalSubgroup ℚ K N) + +instance rationalTowerClassGroupMul + (K N : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] [FiniteDimensional ℚ N] + [Algebra K N] [IsScalarTower ℚ K N] [FiniteDimensional K N] : + Mul (TowerRelativeIdeleGroup.ClassGroup ℚ K N) := by + letI : CommGroup (TowerRelativeIdeleGroup ℚ K N) := inferInstance + exact + (QuotientGroup.Quotient.commGroup + (TowerRelativeIdeleGroup.principalSubgroup ℚ K N)).toMul + +/-- The canonical finite Galois closure, inside `SeparableClosure ℚ`, +of a finite rational intermediate field. -/ +noncomputable def rationalNormalClosure + (K : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] : + FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ) := + { IntermediateField.normalClosure + ℚ K (SeparableClosure ℚ) with + finiteDimensional := + normalClosure.is_finiteDimensional + ℚ K (SeparableClosure ℚ) + isGalois := + IsGalois.normalClosure ℚ K (SeparableClosure ℚ) } + +/-- Absolute left cosets fixing a finite rational intermediate field, +identified with its embeddings into the canonical normal closure. -/ +noncomputable def + rationalBaseFixingCosetEquivNormalClosure + (K : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] : + ((RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) + (⊥ : IntermediateField ℚ (SeparableClosure ℚ))).toSubgroup ⧸ + extensionSubgroup + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) + (⊥ : IntermediateField ℚ (SeparableClosure ℚ))) + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) K) + (LocalClassFieldTheory.fixingSubgroupLeBase + ℚ (SeparableClosure ℚ) K)) ≃ + (K →ₐ[ℚ] rationalNormalClosure K) := + (LocalClassFieldTheory.baseFixingCosetEquivAlgHom + ℚ (SeparableClosure ℚ) K).trans + (normalClosure.algHomEquiv + (F := ℚ) (K := K) (L := SeparableClosure ℚ)).symm + +/-- Embed the actual idele class group of a finite rational +intermediate field into the relative presentation at its canonical +finite Galois closure. -/ +noncomputable def rationalIntermediateIdeleClassToNormalClosure + (K : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] : + IdeleClassGroup K →* + RelativeIdeleGroup.ClassGroup ℚ (rationalNormalClosure K) := + (RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion + (IntermediateField.le_normalClosure K))).comp + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).symm.toMonoidHom + +/-- The canonical map from the actual idele class group of a finite +rational intermediate field to the absolute idele-class direct limit. -/ +noncomputable def rationalIntermediateIdeleClassToDirectLimit + (K : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] : + IdeleClassGroup K →* rationalIdeleClassDirectLimit := + (rationalRelativeIdeleClassToDirectLimit + (rationalNormalClosure K)).comp + (rationalIntermediateIdeleClassToNormalClosure K) + +private theorem monoidHom_comp_equiv_symm_apply + {A B C D : Type*} [Monoid A] [Monoid B] [Monoid C] [Monoid D] + (f : C →* D) (g : B →* C) (e : B ≃* A) (b : B) : + (f.comp (g.comp e.symm.toMonoidHom)) (e b) = f (g b) := by + change f (g (e.symm (e b))) = f (g b) + rw [e.symm_apply_apply] + +/-- Passing from the relative presentation of a finite rational +intermediate field to its ordinary idele class group commutes with the +canonical map to the absolute direct limit. -/ +theorem + rationalIntermediateIdeleClassToDirectLimit_baseChange + (K : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] + (c : RelativeIdeleGroup.ClassGroup ℚ K) : + rationalIntermediateIdeleClassToDirectLimit K + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K) c) = + rationalRelativeIdeleClassToDirectLimit + (rationalNormalClosure K) + (RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion + (IntermediateField.le_normalClosure K)) c) := by + exact monoidHom_comp_equiv_symm_apply + (rationalRelativeIdeleClassToDirectLimit (rationalNormalClosure K)) + (RelativeIdeleGroup.classEmbedding + (IntermediateField.inclusion (IntermediateField.le_normalClosure K))) + (_root_.relativeIdeleClassBaseChangeMulEquiv (K := ℚ) (L := K)) c + +/-- At a finite Galois rational intermediate field, the ordinary +idele-class comparison followed by the absolute direct-limit map is the +canonical finite-level map itself. -/ +theorem + rationalFiniteGaloisIdeleClassToDirectLimit_baseChange + (E : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)) + (c : RelativeIdeleGroup.ClassGroup ℚ E) : + rationalIntermediateIdeleClassToDirectLimit + (E : IntermediateField ℚ (SeparableClosure ℚ)) + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) c) = + rationalRelativeIdeleClassToDirectLimit E c := by + rw [rationalIntermediateIdeleClassToDirectLimit_baseChange] + exact rationalIdeleClassDirectLimit_mk_apply c + (IntermediateField.le_normalClosure + (E : IntermediateField ℚ (SeparableClosure ℚ))) + +private theorem rationalRelativeIdeleClassEmbedding_commutativeSquare + {F E N₁ N₂ : IntermediateField ℚ (SeparableClosure ℚ)} + [NumberField F] [NumberField E] [NumberField N₁] [NumberField N₂] + (hFE : F ≤ E) (hFN₁ : F ≤ N₁) (hEN₂ : E ≤ N₂) (hN₁N₂ : N₁ ≤ N₂) + (c : RelativeIdeleGroup.ClassGroup ℚ F) : + RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := N₂) + (IntermediateField.inclusion hEN₂) + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) (M := E) + (IntermediateField.inclusion hFE) c) = + RelativeIdeleGroup.classEmbedding (K := ℚ) (L := N₁) (M := N₂) + (IntermediateField.inclusion hN₁N₂) + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) (M := N₁) + (IntermediateField.inclusion hFN₁) c) := by + calc + _ = RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) (M := N₂) + (IntermediateField.inclusion (hFE.trans hEN₂)) c := + rationalRelativeIdeleClassEmbedding_comp hFE hEN₂ c + _ = RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) (M := N₂) + (IntermediateField.inclusion (hFN₁.trans hN₁N₂)) c := by + rfl + _ = _ := + (rationalRelativeIdeleClassEmbedding_comp hFN₁ hN₁N₂ c).symm + +/-- The canonical maps from nested rational intermediate fields to the +idele-class direct limit agree after scalar extension. -/ +theorem + rationalIntermediateIdeleClassToDirectLimit_extension + {F E : IntermediateField ℚ (SeparableClosure ℚ)} + [FiniteDimensional ℚ F] [FiniteDimensional ℚ E] + (hFE : F ≤ E) + (c : RelativeIdeleGroup.ClassGroup ℚ F) : + rationalIntermediateIdeleClassToDirectLimit E + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) (M := E) + (IntermediateField.inclusion hFE) c)) = + rationalIntermediateIdeleClassToDirectLimit F + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) c) := by + let hFN : + F ≤ (rationalNormalClosure F : + IntermediateField ℚ (SeparableClosure ℚ)) := + IntermediateField.le_normalClosure F + let hEN : + E ≤ (rationalNormalClosure E : + IntermediateField ℚ (SeparableClosure ℚ)) := + IntermediateField.le_normalClosure E + let hN : rationalNormalClosure F ≤ rationalNormalClosure E := + IntermediateField.normalClosure_mono F E hFE + have hcomp : + RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) + (M := rationalNormalClosure E) (IntermediateField.inclusion hEN) + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) (M := E) + (IntermediateField.inclusion hFE) c) = + RelativeIdeleGroup.classEmbedding (K := ℚ) + (L := rationalNormalClosure F) (M := rationalNormalClosure E) + (IntermediateField.inclusion hN) + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) + (M := rationalNormalClosure F) + (IntermediateField.inclusion hFN) c) := by + exact rationalRelativeIdeleClassEmbedding_commutativeSquare + hFE hFN hEN hN c + calc + _ = rationalRelativeIdeleClassToDirectLimit (rationalNormalClosure E) + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) + (M := rationalNormalClosure E) (IntermediateField.inclusion hEN) + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) (M := E) + (IntermediateField.inclusion hFE) c)) := + rationalIntermediateIdeleClassToDirectLimit_baseChange E + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) (M := E) + (IntermediateField.inclusion hFE) c) + _ = rationalRelativeIdeleClassToDirectLimit (rationalNormalClosure E) + (RelativeIdeleGroup.classEmbedding (K := ℚ) + (L := rationalNormalClosure F) (M := rationalNormalClosure E) + (IntermediateField.inclusion hN) + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) + (M := rationalNormalClosure F) + (IntermediateField.inclusion hFN) c)) := by + exact congrArg + (rationalRelativeIdeleClassToDirectLimit (rationalNormalClosure E)) hcomp + _ = rationalRelativeIdeleClassToDirectLimit (rationalNormalClosure F) + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) + (M := rationalNormalClosure F) + (IntermediateField.inclusion hFN) c) := + rationalIdeleClassDirectLimit_mk_apply + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) + (M := rationalNormalClosure F) + (IntermediateField.inclusion hFN) c) + hN + _ = _ := + (rationalIntermediateIdeleClassToDirectLimit_baseChange F c).symm + + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormCore.lean new file mode 100644 index 0000000000..388e1b7021 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormCore.lean @@ -0,0 +1,511 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldRelativeNorm +/-! +# Core comparisons for finite-tower idèle-class norms + +This internal provider isolates the tensor base-change, embedding-product, +and direct-limit comparison lemmas used by the non-Galois finite-tower norm +theorem. Keeping these commands in their own leaf prevents the endpoint +proof from rebuilding the helper environment. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity +namespace FiniteTowerNormCore + +open ClassFormation +open LocalClassFieldTheory +open CyclicCohomology + +universe u + +private theorem finiteTowerIdeleIsMulCommutative + {K M L : Type u} + [Field K] [NumberField K] [Field M] [Field L] + [Algebra K M] [Algebra M L] : + IsMulCommutative (TowerRelativeIdeleGroup K M L) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] finiteTowerIdeleIsMulCommutative + +/-- Algebra homomorphisms into an ambient field are equivalent to algebra +homomorphisms into the normal closure inside that field. -/ +noncomputable def normalClosureAlgHomEquiv + {F E L : Type u} + [Field F] [Field E] [Field L] + [Algebra F E] [Algebra F L] : + (E →ₐ[F] L) ≃ + (E →ₐ[F] IntermediateField.normalClosure F E L) := + (normalClosure.algHomEquiv F E L).symm + +/-- Lift an algebra homomorphism to the normal closure in its codomain. -/ +noncomputable def normalClosureLiftAlgHom + {F E L : Type u} + [Field F] [Field E] [Field L] + [Algebra F E] [Algebra F L] + (f : E →ₐ[F] L) : + E →ₐ[F] IntermediateField.normalClosure F E L := + normalClosureAlgHomEquiv f + +/-- Promote a ring homomorphism compatible with the scalar maps to an +algebra homomorphism. -/ +def algHomOfCompatibleRingHom + {R S A : Type u} + [CommSemiring R] [CommSemiring S] [Semiring A] + [Algebra R S] [Algebra R A] + (f : S →+* A) + (h : ∀ x : R, f (algebraMap R S x) = algebraMap R A x) : + S →ₐ[R] A where + toRingHom := f + commutes' := h + +private theorem relativeAdeleEmbedding_toAlgHom_unflatten + {K M L : Type u} + [Field K] [NumberField K] + [Field M] + [Field L] + [Algebra K M] [Algebra M L] [Algebra K L] + [IsScalarTower K M L] + (a : RelativeAdeleRing K M) : + towerRelativeAdeleUnflatten K M L + (RelativeIdeleGroup.adeleEmbedding + (IsScalarTower.toAlgHom K M L) a) = + a ⊗ₜ[M] (1 : L) := by + have hflatten : + towerRelativeAdeleFlatten K M L + (towerRelativeAdeleUnflatten K M L + (RelativeIdeleGroup.adeleEmbedding + (IsScalarTower.toAlgHom K M L) a)) = + RelativeIdeleGroup.adeleEmbedding + (IsScalarTower.toAlgHom K M L) a := + (towerRelativeAdeleRingEquiv K M L).apply_symm_apply _ + apply (towerRelativeAdeleRingEquiv K M L).injective + change + towerRelativeAdeleFlatten K M L + (towerRelativeAdeleUnflatten K M L + (RelativeIdeleGroup.adeleEmbedding + (IsScalarTower.toAlgHom K M L) a)) = + towerRelativeAdeleFlatten K M L + (a ⊗ₜ[M] (1 : L)) + rw [hflatten, towerRelativeAdeleFlatten_tmul] + simp only [map_one, mul_one] + rfl + +private theorem relativeIdeleEmbedding_toAlgHom_unflatten + {K M L : Type u} + [Field K] [NumberField K] + [Field M] [NumberField M] + [Field L] [NumberField L] + [Algebra K M] [Algebra M L] [Algebra K L] + [IsScalarTower K M L] + [FiniteDimensional K M] [FiniteDimensional M L] + (a : RelativeIdeleGroup K M) : + letI : Algebra M (RelativeAdeleRing K M) := + relativeAdeleRingIntermediateAlgebra K M + (towerRelativeIdeleEquiv K M L).symm + (RelativeIdeleGroup.ideleEmbedding + (IsScalarTower.toAlgHom K M L) a) = + (Units.map + (@Algebra.TensorProduct.includeLeft + M M (RelativeAdeleRing K M) L + inferInstance inferInstance + (relativeAdeleRingIntermediateAlgebra K M) + inferInstance inferInstance inferInstance + (relativeAdeleRingIntermediateAlgebra K M) + (smulCommClass_self M (RelativeAdeleRing K M))).toRingHom a : + TowerRelativeIdeleGroup K M L) := by + let _ : Algebra M (RelativeAdeleRing K M) := + relativeAdeleRingIntermediateAlgebra K M + apply Units.ext + exact relativeAdeleEmbedding_toAlgHom_unflatten + (K := K) (M := M) (L := L) (a : RelativeAdeleRing K M) + +private theorem + relativeIdeleClassEmbedding_toAlgHom_towerBaseChange + {K M L : Type u} + [Field K] [NumberField K] + [Field M] [NumberField M] + [Field L] [NumberField L] + [Algebra K M] [Algebra M L] [Algebra K L] + [IsScalarTower K M L] + [FiniteDimensional K M] [FiniteDimensional M L] + (c : RelativeIdeleGroup.ClassGroup K M) : + towerRelativeIdeleClassBaseChangeMulEquiv K M L + ((TowerRelativeIdeleGroup.classGroupEquiv K M L).symm + (RelativeIdeleGroup.classEmbedding + (IsScalarTower.toAlgHom K M L) c)) = + RelativeIdeleGroup.classInclusion M L + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := M) c) := by + let _ : Algebra M (RelativeAdeleRing K M) := + relativeAdeleRingIntermediateAlgebra K M + refine QuotientGroup.induction_on c ?_ + intro a + change + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup M L) + (towerRelativeIdeleBaseChangeMulEquiv K M L + ((towerRelativeIdeleEquiv K M L).symm + (RelativeIdeleGroup.ideleEmbedding + (IsScalarTower.toAlgHom K M L) a))) = + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup M L) + (RelativeIdeleGroup.inclusion M L + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := M) a)) + apply congrArg + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup M L)) + rw [relativeIdeleEmbedding_toAlgHom_unflatten + (K := K) (M := M) (L := L) a] + exact towerRelativeIdeleBaseChangeMulEquiv_includeLeft K M L a + +theorem + relativeIdeleClassBaseChange_classEmbedding_toAlgHom + {K M L : Type u} + [Field K] [NumberField K] + [Field M] [NumberField M] + [Field L] [NumberField L] + [Algebra K M] [Algebra M L] [Algebra K L] + [IsScalarTower K M L] + [FiniteDimensional K M] [FiniteDimensional M L] + (c : RelativeIdeleGroup.ClassGroup K M) : + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := L) + (RelativeIdeleGroup.classEmbedding + (IsScalarTower.toAlgHom K M L) c) = + _root_.ideleClassExtension M L + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := M) c) := by + calc + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := L) + (RelativeIdeleGroup.classEmbedding + (IsScalarTower.toAlgHom K M L) c) = + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := M) (L := L) + (towerRelativeIdeleClassBaseChangeMulEquiv K M L + ((TowerRelativeIdeleGroup.classGroupEquiv K M L).symm + (RelativeIdeleGroup.classEmbedding + (IsScalarTower.toAlgHom K M L) c))) := + (relativeIdeleClassBaseChangeMulEquiv_tower K M L _).symm + _ = _root_.relativeIdeleClassBaseChangeMulEquiv + (K := M) (L := L) + (RelativeIdeleGroup.classInclusion M L + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := M) c)) := by + rw [relativeIdeleClassEmbedding_toAlgHom_towerBaseChange + (K := K) (M := M) (L := L) c] + _ = _root_.ideleClassExtension M L + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := K) (L := M) c) := + relativeIdeleClassBaseChangeMulEquiv_classInclusion _ + +theorem classEmbedding_smul_eq_classEmbedding_comp + {K E U : Type u} + [Field K] [NumberField K] + [Field E] [Field U] + [Algebra K E] [Algebra K U] + (j : E →ₐ[K] U) (σ : U ≃ₐ[K] U) + (c : RelativeIdeleGroup.ClassGroup K E) : + σ • RelativeIdeleGroup.classEmbedding j c = + RelativeIdeleGroup.classEmbedding (σ.toAlgHom.comp j) c := by + refine QuotientGroup.induction_on c ?_ + intro a + change + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K U) + (σ • RelativeIdeleGroup.ideleEmbedding j a) = + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K U) + (RelativeIdeleGroup.ideleEmbedding + (σ.toAlgHom.comp j) a) + apply congrArg + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K U)) + apply Units.ext + change + RelativeIdeleGroup.conjugation K U σ + (RelativeIdeleGroup.adeleEmbedding j + (a : RelativeAdeleRing K E)) = + RelativeIdeleGroup.adeleEmbedding + (σ.toAlgHom.comp j) (a : RelativeAdeleRing K E) + induction (a : RelativeAdeleRing K E) using + TensorProduct.inductionOn with + | tmul y x => + simp only [RelativeIdeleGroup.adeleEmbedding, + RelativeIdeleGroup.scalarEmbedding_tmul, + RelativeIdeleGroup.conjugation_tmul] + congr 1 + | add x y hx hy => + simp only [map_add, hx, hy] + +private theorem classEmbedding_changeBase + {k F E U : Type u} + [Field k] [NumberField k] + [Field F] [NumberField F] + [Field E] [NumberField E] + [Field U] [NumberField U] + [Algebra k F] [Algebra F E] [Algebra k E] + [Algebra E U] [Algebra F U] [Algebra k U] + [IsScalarTower k F E] [IsScalarTower F E U] + [IsScalarTower k F U] [IsScalarTower k E U] + [FiniteDimensional k F] [FiniteDimensional F E] + [FiniteDimensional E U] [FiniteDimensional F U] + [IsGalois F U] + (f : E →ₐ[F] U) (c : IdeleClassGroup E) : + towerRelativeIdeleClassBaseChangeMulEquiv k F U + ((TowerRelativeIdeleGroup.classGroupEquiv k F U).symm + (RelativeIdeleGroup.classEmbedding + (f.restrictScalars k) + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := k) (L := E)).symm c))) = + RelativeIdeleGroup.classEmbedding f + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := E)).symm c) := by + let jₖ : E →ₐ[k] U := IsScalarTower.toAlgHom k E U + let jF : E →ₐ[F] U := IsScalarTower.toAlgHom F E U + let dₖ : RelativeIdeleGroup.ClassGroup k E := + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := k) (L := E)).symm c + let dF : RelativeIdeleGroup.ClassGroup F E := + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := E)).symm c + have hcanonical : + towerRelativeIdeleClassBaseChangeMulEquiv k F U + ((TowerRelativeIdeleGroup.classGroupEquiv k F U).symm + (RelativeIdeleGroup.classEmbedding jₖ dₖ)) = + RelativeIdeleGroup.classEmbedding jF dF := by + apply (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := U)).injective + calc + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := U) + (towerRelativeIdeleClassBaseChangeMulEquiv k F U + ((TowerRelativeIdeleGroup.classGroupEquiv k F U).symm + (RelativeIdeleGroup.classEmbedding jₖ dₖ))) = + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := k) (L := U) + (RelativeIdeleGroup.classEmbedding jₖ dₖ) := + relativeIdeleClassBaseChangeMulEquiv_tower k F U _ + _ = _root_.ideleClassExtension E U c := by + rw [relativeIdeleClassBaseChange_classEmbedding_toAlgHom + (K := k) (M := E) (L := U) dₖ] + exact congrArg (_root_.ideleClassExtension E U) + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := k) (L := E)).apply_symm_apply c) + _ = _root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := U) + (RelativeIdeleGroup.classEmbedding jF dF) := by + rw [relativeIdeleClassBaseChange_classEmbedding_toAlgHom + (K := F) (M := E) (L := U) dF] + exact congrArg (_root_.ideleClassExtension E U) + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := E)).apply_symm_apply c).symm + let σ : U ≃ₐ[F] U := + RelativeIdeleGroup.liftSubextensionEmbedding f + have hσ : RelativeIdeleGroup.restrictToSubextension σ = f := + RelativeIdeleGroup.restrict_liftSubextensionEmbedding f + have hrestrict : + (σ.restrictScalars k).toAlgHom.comp jₖ = + f.restrictScalars k := by + apply AlgHom.ext + intro x + have hx := DFunLike.congr_fun hσ x + exact hx + have hrestrictF : σ.toAlgHom.comp jF = f := by + exact hσ + rw [← hrestrict, ← hrestrictF] + calc + towerRelativeIdeleClassBaseChangeMulEquiv k F U + ((TowerRelativeIdeleGroup.classGroupEquiv k F U).symm + (RelativeIdeleGroup.classEmbedding + ((σ.restrictScalars k).toAlgHom.comp jₖ) dₖ)) = + towerRelativeIdeleClassBaseChangeMulEquiv k F U + ((TowerRelativeIdeleGroup.classGroupEquiv k F U).symm + ((σ.restrictScalars k) • + RelativeIdeleGroup.classEmbedding jₖ dₖ)) := by + rw [classEmbedding_smul_eq_classEmbedding_comp] + _ = σ • + towerRelativeIdeleClassBaseChangeMulEquiv k F U + ((TowerRelativeIdeleGroup.classGroupEquiv k F U).symm + (RelativeIdeleGroup.classEmbedding jₖ dₖ)) := + towerRelativeIdeleClassBaseChangeMulEquiv_smul + k F U σ (RelativeIdeleGroup.classEmbedding jₖ dₖ) + _ = σ • RelativeIdeleGroup.classEmbedding jF dF := by + rw [hcanonical] + _ = RelativeIdeleGroup.classEmbedding + (σ.toAlgHom.comp jF) dF := + classEmbedding_smul_eq_classEmbedding_comp jF σ dF + +theorem relativeIdeleClassBaseChange_classEmbedding_changeBase + {k F E U : Type u} + [Field k] [NumberField k] + [Field F] [NumberField F] + [Field E] [NumberField E] + [Field U] [NumberField U] + [Algebra k F] [Algebra F E] [Algebra k E] + [Algebra E U] [Algebra F U] [Algebra k U] + [IsScalarTower k F E] [IsScalarTower F E U] + [IsScalarTower k F U] [IsScalarTower k E U] + [FiniteDimensional k F] [FiniteDimensional F E] + [FiniteDimensional E U] [FiniteDimensional F U] + [IsGalois F U] + (f : E →ₐ[F] U) (c : IdeleClassGroup E) : + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := k) (L := U) + (RelativeIdeleGroup.classEmbedding + (f.restrictScalars k) + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := k) (L := E)).symm c)) = + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := U) + (RelativeIdeleGroup.classEmbedding f + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := E)).symm c)) := by + have hchange := classEmbedding_changeBase + (k := k) (F := F) (E := E) (U := U) f c + rw [← hchange] + exact (relativeIdeleClassBaseChangeMulEquiv_tower + k F U + (RelativeIdeleGroup.classEmbedding + (f.restrictScalars k) + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := k) (L := E)).symm c))).symm + +private theorem classEmbedding_comp + {K E N U : Type u} + [Field K] [NumberField K] + [Field E] [Field N] [Field U] + [Algebra K E] [Algebra K N] [Algebra K U] + (f : E →ₐ[K] N) (g : N →ₐ[K] U) + (c : RelativeIdeleGroup.ClassGroup K E) : + RelativeIdeleGroup.classEmbedding g + (RelativeIdeleGroup.classEmbedding f c) = + RelativeIdeleGroup.classEmbedding (g.comp f) c := by + refine QuotientGroup.induction_on c ?_ + intro a + change + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K U) + (RelativeIdeleGroup.ideleEmbedding g + (RelativeIdeleGroup.ideleEmbedding f a)) = + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K U) + (RelativeIdeleGroup.ideleEmbedding (g.comp f) a) + apply congrArg + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup K U)) + apply Units.ext + change + RelativeIdeleGroup.adeleEmbedding g + (RelativeIdeleGroup.adeleEmbedding f + (a : RelativeAdeleRing K E)) = + RelativeIdeleGroup.adeleEmbedding (g.comp f) + (a : RelativeAdeleRing K E) + induction (a : RelativeAdeleRing K E) using + TensorProduct.inductionOn with + | tmul y x => + simp only [RelativeIdeleGroup.adeleEmbedding, + RelativeIdeleGroup.scalarEmbedding_tmul] + rfl + | add x y hx hy => + simp only [map_add, hx, hy] + +theorem relativeIdeleClassBaseChange_prod_embeddings + {F E N U Q : Type u} + [Field F] [NumberField F] + [Field E] [Field N] + [Field U] [NumberField U] + [Algebra F E] [Algebra F N] [Algebra F U] + [Algebra E N] [IsScalarTower F E N] + [FiniteDimensional F E] [FiniteDimensional F N] + [FiniteDimensional F U] [IsGalois F N] + [Fintype Q] + (e : Q ≃ (E →ₐ[F] N)) (j : N →ₐ[F] U) + (c : RelativeIdeleGroup.ClassGroup F E) : + (∏ q : Q, + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := U) + (RelativeIdeleGroup.classEmbedding (j.comp (e q)) c)) = + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := U) + (RelativeIdeleGroup.classEmbedding j + (RelativeIdeleGroup.classInclusion F N + (RelativeIdeleGroup.classNorm F E c))) := by + rw [← map_prod] + apply congrArg + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := U)) + calc + ∏ q : Q, RelativeIdeleGroup.classEmbedding (j.comp (e q)) c = + ∏ f : E →ₐ[F] N, + RelativeIdeleGroup.classEmbedding (j.comp f) c := by + exact Fintype.prod_equiv e + (fun q => RelativeIdeleGroup.classEmbedding (j.comp (e q)) c) + (fun f => RelativeIdeleGroup.classEmbedding (j.comp f) c) + (fun _ => rfl) + _ = RelativeIdeleGroup.classEmbedding j + (∏ f : E →ₐ[F] N, + RelativeIdeleGroup.classEmbedding f c) := by + rw [map_prod] + apply Finset.prod_congr rfl + intro f _ + exact (classEmbedding_comp f j c).symm + _ = RelativeIdeleGroup.classEmbedding j + (RelativeIdeleGroup.classInclusion F N + (RelativeIdeleGroup.classNorm F E c)) := by + rw [RelativeIdeleGroup.classInclusion_ideleClassNorm_eq_prod_embeddings] + +theorem + rationalIntermediateIdeleClassToDirectLimit_classEmbedding + (E : IntermediateField ℚ (SeparableClosure ℚ)) + (U : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ E] + (hEU : E ≤ (U : IntermediateField ℚ (SeparableClosure ℚ))) + (c : IdeleClassGroup E) : + rationalIntermediateIdeleClassToDirectLimit E c = + rationalRelativeIdeleClassToDirectLimit U + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + (IntermediateField.inclusion hEU) + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E)).symm c)) := by + let d : RelativeIdeleGroup.ClassGroup ℚ E := + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E)).symm c + calc + rationalIntermediateIdeleClassToDirectLimit E c = + rationalIntermediateIdeleClassToDirectLimit U + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := U) + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + (IntermediateField.inclusion hEU) d)) := by + rw [show c = _root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) d by + exact ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E)).apply_symm_apply c).symm] + exact (rationalIntermediateIdeleClassToDirectLimit_extension + hEU d).symm + _ = rationalRelativeIdeleClassToDirectLimit U + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + (IntermediateField.inclusion hEU) d) := + rationalFiniteGaloisIdeleClassToDirectLimit_baseChange + U (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + (IntermediateField.inclusion hEU) d) + +end FiniteTowerNormCore +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormProof.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormProof.lean new file mode 100644 index 0000000000..3b5b1b1159 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormProof.lean @@ -0,0 +1,660 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormStatement +/-! +# Proof of ordinary norm comparison in finite towers of rational fixed fields + +This proof leaf installs the canonical finite-tower context once and splits +the normal-closure embedding calculation, the pointwise coset action, and the +finite product calculation into separate commands. The public theorem is a +thin wrapper around those providers. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open LocalClassFieldTheory +open CyclicCohomology +open FiniteTowerNormCore + +section RationalFiniteTower + +variable + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hKfinite : Finite (rationalFixedFieldAbsoluteQuotient K)] + [hfinite : Finite + (rationalFixedFieldRelativeQuotient K L hLK)] + +local notation "F₀" => + abstractFixedField ℚ (SeparableClosure ℚ) K +local notation "E₀" => + abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK +local notation "N₀" => + IntermediateField.normalClosure F₀ E₀ (SeparableClosure ℚ) +private abbrev rationalFiniteTowerRestrictedNormal : + IntermediateField ℚ (SeparableClosure ℚ) := + IntermediateField.restrictScalars ℚ N₀ +private abbrev rationalFiniteTowerRestrictedUpper : + IntermediateField ℚ (SeparableClosure ℚ) := + IntermediateField.restrictScalars ℚ E₀ +local notation "EQ₀" => + rationalFiniteTowerRestrictedUpper K L hLK +local notation "NQ₀" => + rationalFiniteTowerRestrictedNormal K L hLK +local notation "U₀" => rationalNormalClosure NQ₀ +local notation "Q₀" => + K.toSubgroup ⧸ extensionSubgroup K L hLK + +noncomputable local instance rationalFiniteTowerLowerFiniteDimensional : + FiniteDimensional ℚ F₀ := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + +noncomputable local instance rationalFiniteTowerUpperFiniteDimensional : + FiniteDimensional F₀ E₀ := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + +local instance rationalFiniteTowerLowerUpperScalarTower : + IsScalarTower ℚ F₀ E₀ := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + +noncomputable local instance rationalFiniteTowerUpperAbsoluteFiniteDimensional : + FiniteDimensional ℚ E₀ := + FiniteDimensional.trans ℚ F₀ E₀ + +noncomputable local instance rationalFiniteTowerRestrictedUpperFiniteDimensional : + FiniteDimensional ℚ EQ₀ := by + change FiniteDimensional ℚ E₀ + infer_instance + +noncomputable local instance rationalFiniteTowerLowerNumberField : + NumberField F₀ := + NumberField.of_module_finite ℚ F₀ + +noncomputable local instance rationalFiniteTowerUpperNumberField : + NumberField E₀ := + NumberField.of_module_finite ℚ E₀ + +local instance rationalFiniteTowerUpperSeparableClosureScalarTower : + IsScalarTower F₀ E₀ (SeparableClosure ℚ) := + IsScalarTower.of_algebraMap_eq' (by + ext x + rfl) + +omit hKfinite hfinite in +private theorem rationalFiniteTower_lower_le_upper : + F₀ ≤ IntermediateField.restrictScalars ℚ E₀ := + abstractFixedField_le ℚ (SeparableClosure ℚ) hLK + +omit hKfinite hfinite in +private theorem rationalFiniteTower_upper_le_normal : + IntermediateField.restrictScalars ℚ E₀ ≤ NQ₀ := by + intro x hx + exact IntermediateField.le_normalClosure E₀ hx + +omit hKfinite hfinite in +private theorem rationalFiniteTower_lower_le_normal : + F₀ ≤ NQ₀ := + (rationalFiniteTower_lower_le_upper K L hLK).trans + (rationalFiniteTower_upper_le_normal K L hLK) + +local instance rationalFiniteTowerNormalScalarTower : + IsScalarTower ℚ F₀ N₀ := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + +noncomputable local instance rationalFiniteTowerNormalFiniteDimensional : + FiniteDimensional F₀ N₀ := + normalClosure.is_finiteDimensional F₀ E₀ (SeparableClosure ℚ) + +noncomputable local instance rationalFiniteTowerNormalAbsoluteFiniteDimensional : + FiniteDimensional ℚ N₀ := + FiniteDimensional.trans ℚ F₀ N₀ + +noncomputable local instance rationalFiniteTowerNormalNumberField : + NumberField N₀ := + NumberField.of_module_finite ℚ N₀ + +noncomputable local instance rationalFiniteTowerRestrictedNormalFiniteDimensional : + FiniteDimensional ℚ NQ₀ := by + change FiniteDimensional ℚ N₀ + infer_instance + +private theorem rationalFiniteTower_normal_le_rationalNormalClosure : + NQ₀ ≤ (U₀ : IntermediateField ℚ (SeparableClosure ℚ)) := by + change NQ₀ ≤ IntermediateField.normalClosure + ℚ NQ₀ (SeparableClosure ℚ) + exact IntermediateField.le_normalClosure NQ₀ + +private theorem rationalFiniteTower_lower_le_rationalNormalClosure : + F₀ ≤ (U₀ : IntermediateField ℚ (SeparableClosure ℚ)) := + (rationalFiniteTower_lower_le_normal K L hLK).trans + (rationalFiniteTower_normal_le_rationalNormalClosure K L hLK) + +private theorem rationalFiniteTower_upper_le_rationalNormalClosure : + IntermediateField.restrictScalars ℚ E₀ ≤ + (U₀ : IntermediateField ℚ (SeparableClosure ℚ)) := + (rationalFiniteTower_upper_le_normal K L hLK).trans + (rationalFiniteTower_normal_le_rationalNormalClosure K L hLK) + +/-- The rational normal closure is an algebra over the lower field through the specified +inclusion. -/ +local instance rationalFiniteTowerRationalNormalClosureLowerAlgebra : + Algebra F₀ U₀ := + (IntermediateField.inclusion + (rationalFiniteTower_lower_le_rationalNormalClosure K L hLK)).toRingHom.toAlgebra + +/-- The rational normal closure is an algebra over the upper field through the specified +inclusion. -/ +local instance rationalFiniteTowerRationalNormalClosureUpperAlgebra : + Algebra E₀ U₀ := + (IntermediateField.inclusion + (rationalFiniteTower_upper_le_rationalNormalClosure K L hLK)).toRingHom.toAlgebra + +/-- The rational normal closure is an algebra over the intermediate normal closure through +inclusion. -/ +local instance rationalFiniteTowerRationalNormalClosureNormalAlgebra : + Algebra N₀ U₀ := + (IntermediateField.inclusion + (rationalFiniteTower_normal_le_rationalNormalClosure K L hLK)).toRingHom.toAlgebra + +local instance rationalFiniteTowerRationalNormalClosureLowerScalarTower : + IsScalarTower ℚ F₀ U₀ := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + +local instance rationalFiniteTowerRationalNormalClosureUpperScalarTower : + IsScalarTower ℚ E₀ U₀ := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + +local instance rationalFiniteTowerRationalNormalClosureNormalScalarTower : + IsScalarTower ℚ N₀ U₀ := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + +local instance rationalFiniteTowerLowerUpperClosureScalarTower : + IsScalarTower F₀ E₀ U₀ := + IsScalarTower.of_algebraMap_eq' (by + ext x + rfl) + +local instance rationalFiniteTowerLowerNormalClosureScalarTower : + IsScalarTower F₀ N₀ U₀ := + IsScalarTower.of_algebraMap_eq' (by + ext x + rfl) + +local instance rationalFiniteTowerClosureSeparableClosureScalarTower : + IsScalarTower F₀ U₀ (SeparableClosure ℚ) := + IsScalarTower.of_algebraMap_eq' (by + ext x + rfl) + +noncomputable local instance rationalFiniteTowerClosureOverUpperFiniteDimensional : + FiniteDimensional E₀ U₀ := + FiniteDimensional.right ℚ E₀ U₀ + +noncomputable local instance rationalFiniteTowerClosureOverLowerFiniteDimensional : + FiniteDimensional F₀ U₀ := + FiniteDimensional.right ℚ F₀ U₀ + +noncomputable local instance rationalFiniteTowerClosureOverNormalFiniteDimensional : + FiniteDimensional N₀ U₀ := + FiniteDimensional.right ℚ N₀ U₀ + +local instance rationalFiniteTowerLowerSeparableClosureGalois : + IsGalois F₀ (SeparableClosure ℚ) := + IsGalois.tower_top_of_isGalois ℚ F₀ (SeparableClosure ℚ) + +local instance rationalFiniteTowerNormalGalois : IsGalois F₀ N₀ := + IsGalois.normalClosure F₀ E₀ (SeparableClosure ℚ) + +local instance rationalFiniteTowerClosureOverLowerGalois : IsGalois F₀ U₀ := + IsGalois.tower_top_of_isGalois ℚ F₀ U₀ + +local instance rationalFiniteTowerClosureOverNormalGalois : IsGalois N₀ U₀ := + IsGalois.tower_top_of_isGalois ℚ N₀ U₀ + +/-- The quotient indexing embeddings in the rational finite tower has a finite enumeration. -/ +noncomputable local instance rationalFiniteTowerQuotientFintype : Fintype Q₀ := + Fintype.ofFinite Q₀ + +private noncomputable def rationalFiniteTowerCosetEquiv : + Q₀ ≃ (E₀ →ₐ[F₀] N₀) := + (abstractFixedFieldCosetEquivAlgHom + ℚ (SeparableClosure ℚ) K L hLK).trans + (normalClosureAlgHomEquiv + (F := F₀) (E := E₀) (L := SeparableClosure ℚ)) + +private noncomputable def rationalFiniteTowerNormalInclusion : + N₀ →ₐ[F₀] U₀ := + algHomOfCompatibleRingHom + (IntermediateField.inclusion + (rationalFiniteTower_normal_le_rationalNormalClosure K L hLK)).toRingHom + (fun _ => rfl) + +private noncomputable def rationalFiniteTowerUpperInclusion : + E₀ →ₐ[ℚ] U₀ := + IntermediateField.inclusion + (rationalFiniteTower_upper_le_rationalNormalClosure K L hLK) + +private noncomputable def rationalFiniteTowerRelativeClass + (c : IdeleClassGroup E₀) : + RelativeIdeleGroup.ClassGroup F₀ E₀ := + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F₀) (L := E₀)).symm c + +private noncomputable def rationalFiniteTowerRationalRelativeClass + (c : IdeleClassGroup E₀) : + RelativeIdeleGroup.ClassGroup ℚ E₀ := + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E₀)).symm c + +private noncomputable def rationalFiniteTowerEmbeddedClass + (c : IdeleClassGroup E₀) (q : Q₀) : IdeleClassGroup U₀ := + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := F₀) (L := U₀) + (RelativeIdeleGroup.classEmbedding + ((rationalFiniteTowerNormalInclusion K L hLK).comp + (rationalFiniteTowerCosetEquiv K L hLK q)) + (rationalFiniteTowerRelativeClass K L hLK c)) + +private theorem rationalFiniteTowerCoset_comp_normalInclusion + (q : Q₀) : + (IsScalarTower.toAlgHom F₀ U₀ (SeparableClosure ℚ)).comp + ((rationalFiniteTowerNormalInclusion K L hLK).comp + (rationalFiniteTowerCosetEquiv K L hLK q)) = + abstractFixedFieldCosetToAlgHom + ℚ (SeparableClosure ℚ) K L hLK q := by + apply AlgHom.ext + intro x + change + ((normalClosure.algHomEquiv + F₀ E₀ (SeparableClosure ℚ)) + ((normalClosure.algHomEquiv + F₀ E₀ (SeparableClosure ℚ)).symm + (abstractFixedFieldCosetToAlgHom + ℚ (SeparableClosure ℚ) K L hLK q))) x = _ + exact DFunLike.congr_fun + ((normalClosure.algHomEquiv + F₀ E₀ (SeparableClosure ℚ)).apply_symm_apply + (abstractFixedFieldCosetToAlgHom + ℚ (SeparableClosure ℚ) K L hLK q)) x + +private theorem rationalFiniteTower_restrictedEmbedding + (sigma : K.toSubgroup) : + (AlgEquiv.restrictNormalHom U₀ sigma.1).toAlgHom.comp + (rationalFiniteTowerUpperInclusion K L hLK) = + ((rationalFiniteTowerNormalInclusion K L hLK).comp + (rationalFiniteTowerCosetEquiv K L hLK + (QuotientGroup.mk sigma))).restrictScalars ℚ := by + apply AlgHom.ext + intro x + apply (IsScalarTower.toAlgHom ℚ U₀ + (SeparableClosure ℚ)).injective + change + algebraMap U₀ (SeparableClosure ℚ) + ((AlgEquiv.restrictNormalHom U₀ sigma.1) + (rationalFiniteTowerUpperInclusion K L hLK x)) = + algebraMap U₀ (SeparableClosure ℚ) + ((rationalFiniteTowerNormalInclusion K L hLK) + (rationalFiniteTowerCosetEquiv K L hLK + (QuotientGroup.mk sigma) x)) + calc + algebraMap U₀ (SeparableClosure ℚ) + ((AlgEquiv.restrictNormalHom U₀ sigma.1) + (rationalFiniteTowerUpperInclusion K L hLK x)) = + sigma.1 + (algebraMap U₀ (SeparableClosure ℚ) + (rationalFiniteTowerUpperInclusion K L hLK x)) := + AlgEquiv.restrictNormal_commutes sigma.1 U₀ + (rationalFiniteTowerUpperInclusion K L hLK x) + _ = sigma.1 (x : SeparableClosure ℚ) := by rfl + _ = (abstractFixedFieldCosetToAlgHom + ℚ (SeparableClosure ℚ) K L hLK + (QuotientGroup.mk sigma)) x := by rfl + _ = algebraMap U₀ (SeparableClosure ℚ) + ((rationalFiniteTowerNormalInclusion K L hLK) + (rationalFiniteTowerCosetEquiv K L hLK + (QuotientGroup.mk sigma) x)) := + (DFunLike.congr_fun + (rationalFiniteTowerCoset_comp_normalInclusion K L hLK + (QuotientGroup.mk sigma)) x).symm + +private theorem rationalFiniteTower_representativeAction + (c : IdeleClassGroup E₀) (sigma : K.toSubgroup) : + Additive.toMul + (Additive.ofMul + (sigma.1 • + rationalIntermediateIdeleClassToDirectLimit EQ₀ c)) = + rationalIntermediateIdeleClassToDirectLimit U₀ + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := U₀) + (RelativeIdeleGroup.classEmbedding + ((AlgEquiv.restrictNormalHom U₀ sigma.1).toAlgHom.comp + (rationalFiniteTowerUpperInclusion K L hLK)) + (rationalFiniteTowerRationalRelativeClass K L hLK c))) := by + let dℚ := rationalFiniteTowerRationalRelativeClass K L hLK c + let tau := AlgEquiv.restrictNormalHom U₀ sigma.1 + let jEU := rationalFiniteTowerUpperInclusion K L hLK + rw [toMul_ofMul] + have hlevel : + rationalIntermediateIdeleClassToDirectLimit EQ₀ c = + rationalRelativeIdeleClassToDirectLimit U₀ + (RelativeIdeleGroup.classEmbedding jEU dℚ) := by + exact rationalIntermediateIdeleClassToDirectLimit_classEmbedding + EQ₀ U₀ + (rationalFiniteTower_upper_le_rationalNormalClosure K L hLK) c + rw [hlevel] + rw [rationalFiniteGaloisIdeleClassToDirectLimit_baseChange] + change + sigma.1 • + (⟦⟨U₀, RelativeIdeleGroup.classEmbedding jEU dℚ⟩⟧ : + rationalIdeleClassDirectLimit) = _ + change (⟦⟨U₀, sigma.1 • RelativeIdeleGroup.classEmbedding jEU dℚ⟩⟧ : + rationalIdeleClassDirectLimit) = _ + apply congrArg + (fun z : RelativeIdeleGroup.ClassGroup ℚ U₀ => + (⟦⟨U₀, z⟩⟧ : rationalIdeleClassDirectLimit)) + exact classEmbedding_smul_eq_classEmbedding_comp jEU tau dℚ + +private theorem rationalRelativeFixedFieldCosetActionPointwise + (c : IdeleClassGroup E₀) (q : Q₀) : + Additive.toMul + ((relativeCosetAction rationalIdeleClassRepresentation + K L hLK + (rationalAbstractRelativeFixedFieldIdeleClassEquivFixedOfFiniteDimensional + K L hLK (Additive.ofMul c)) q : + Additive rationalIdeleClassDirectLimit)) = + rationalIntermediateIdeleClassToDirectLimit + (U₀ : IntermediateField ℚ (SeparableClosure ℚ)) + (rationalFiniteTowerEmbeddedClass K L hLK c q) := by + let dℚ := rationalFiniteTowerRationalRelativeClass K L hLK c + let dF := rationalFiniteTowerRelativeClass K L hLK c + let a := + rationalAbstractRelativeFixedFieldIdeleClassEquivFixedOfFiniteDimensional + K L hLK (Additive.ofMul c) + let term : Q₀ → Additive rationalIdeleClassDirectLimit := + fun q => + (relativeCosetAction rationalIdeleClassRepresentation + K L hLK a q : Additive rationalIdeleClassDirectLimit) + change + Additive.toMul (term q) = + rationalIntermediateIdeleClassToDirectLimit + (U₀ : IntermediateField ℚ (SeparableClosure ℚ)) + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F₀) (L := U₀) + (RelativeIdeleGroup.classEmbedding + ((rationalFiniteTowerNormalInclusion K L hLK).comp + (rationalFiniteTowerCosetEquiv K L hLK q)) dF)) + have hbase (f : E₀ →ₐ[F₀] U₀) : + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := U₀) + (RelativeIdeleGroup.classEmbedding + (f.restrictScalars ℚ) dℚ) = + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := F₀) (L := U₀) + (RelativeIdeleGroup.classEmbedding f dF) := by + exact relativeIdeleClassBaseChange_classEmbedding_changeBase + (k := ℚ) (F := F₀) (E := E₀) (U := U₀) f c + rw [← hbase ((rationalFiniteTowerNormalInclusion K L hLK).comp + (rationalFiniteTowerCosetEquiv K L hLK q))] + obtain ⟨sigma, rfl⟩ := + QuotientGroup.mk_surjective q + rw [← rationalFiniteTower_restrictedEmbedding K L hLK sigma] + change + Additive.toMul + (Additive.ofMul + (sigma.1 • rationalIntermediateIdeleClassToDirectLimit EQ₀ c)) = + rationalIntermediateIdeleClassToDirectLimit U₀ + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := U₀) + (RelativeIdeleGroup.classEmbedding + ((AlgEquiv.restrictNormalHom U₀ sigma.1).toAlgHom.comp + (rationalFiniteTowerUpperInclusion K L hLK)) dℚ)) + exact rationalFiniteTower_representativeAction K L hLK c sigma + +private theorem rationalFiniteTower_product_embeddedClass + (c : IdeleClassGroup E₀) : + ∏ q : Q₀, rationalFiniteTowerEmbeddedClass K L hLK c q = + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := F₀) (L := U₀) + (RelativeIdeleGroup.classEmbedding + (rationalFiniteTowerNormalInclusion K L hLK) + (RelativeIdeleGroup.classInclusion F₀ N₀ + (RelativeIdeleGroup.classNorm F₀ E₀ + (rationalFiniteTowerRelativeClass K L hLK c)))) := by + unfold rationalFiniteTowerEmbeddedClass + exact relativeIdeleClassBaseChange_prod_embeddings + (rationalFiniteTowerCosetEquiv K L hLK) + (rationalFiniteTowerNormalInclusion K L hLK) + (rationalFiniteTowerRelativeClass K L hLK c) + +private theorem rationalFiniteTowerNormalInclusion_eq_toAlgHom : + rationalFiniteTowerNormalInclusion K L hLK = + IsScalarTower.toAlgHom F₀ N₀ U₀ := by + apply AlgHom.ext + intro x + rfl + +private theorem rationalFiniteTowerLowerInclusion_eq_toAlgHom : + IntermediateField.inclusion + (rationalFiniteTower_lower_le_rationalNormalClosure K L hLK) = + IsScalarTower.toAlgHom ℚ F₀ U₀ := by + apply AlgHom.ext + intro x + rfl + +private theorem rationalFiniteTower_ideleClassExtension_comp_apply + (x : IdeleClassGroup F₀) : + _root_.ideleClassExtension N₀ U₀ + (_root_.ideleClassExtension F₀ N₀ x) = + _root_.ideleClassExtension F₀ U₀ x := by + have hcomp : + (_root_.ideleClassExtension N₀ U₀).comp + (_root_.ideleClassExtension F₀ N₀) = + _root_.ideleClassExtension F₀ U₀ := + _root_.ideleClassExtension_comp + (K := F₀) (L := U₀) N₀ + exact DFunLike.congr_fun hcomp x + +private theorem rationalFiniteTower_baseChange_classInclusion + (x : IdeleClassGroup F₀) : + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := F₀) (L := N₀) + (RelativeIdeleGroup.classInclusion F₀ N₀ x) = + _root_.ideleClassExtension F₀ N₀ x := + _root_.relativeIdeleClassBaseChangeMulEquiv_classInclusion + (K := F₀) (L := N₀) x + +private theorem + rationalFiniteTower_baseChange_normalInclusion_classInclusion + (x : IdeleClassGroup F₀) : + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := F₀) (L := U₀) + (RelativeIdeleGroup.classEmbedding + (rationalFiniteTowerNormalInclusion K L hLK) + (RelativeIdeleGroup.classInclusion F₀ N₀ x)) = + _root_.ideleClassExtension F₀ U₀ x := by + rw [rationalFiniteTowerNormalInclusion_eq_toAlgHom K L hLK] + rw [relativeIdeleClassBaseChange_classEmbedding_toAlgHom + (K := F₀) (M := N₀) (L := U₀)] + exact + (congrArg (_root_.ideleClassExtension N₀ U₀) + (rationalFiniteTower_baseChange_classInclusion K L hLK x)).trans + (rationalFiniteTower_ideleClassExtension_comp_apply K L hLK x) + +private theorem rationalFiniteTower_directLimit_ideleClassExtension + (x : IdeleClassGroup F₀) : + rationalIntermediateIdeleClassToDirectLimit + (U₀ : IntermediateField ℚ (SeparableClosure ℚ)) + (_root_.ideleClassExtension F₀ U₀ x) = + rationalIntermediateIdeleClassToDirectLimit F₀ x := by + let dℚF : RelativeIdeleGroup.ClassGroup ℚ F₀ := + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F₀)).symm x + have hext := rationalIntermediateIdeleClassToDirectLimit_extension + (rationalFiniteTower_lower_le_rationalNormalClosure K L hLK) dℚF + rw [rationalFiniteTowerLowerInclusion_eq_toAlgHom K L hLK] at hext + rw [relativeIdeleClassBaseChange_classEmbedding_toAlgHom + (K := ℚ) (M := F₀) (L := U₀) dℚF] at hext + rw [(_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F₀)).apply_symm_apply] at hext + exact hext + +private theorem rationalFiniteTower_relativeClassNorm_eq_ordinaryNorm + (c : IdeleClassGroup E₀) : + RelativeIdeleGroup.classNorm F₀ E₀ + (rationalFiniteTowerRelativeClass K L hLK c) = + _root_.ideleClassNorm F₀ E₀ c := by + let d := rationalFiniteTowerRelativeClass K L hLK c + have hd : + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := F₀) (L := E₀) d = c := by + dsimp only [d, rationalFiniteTowerRelativeClass] + exact (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F₀) (L := E₀)).apply_symm_apply c + calc + RelativeIdeleGroup.classNorm F₀ E₀ d = + _root_.ideleClassNorm F₀ E₀ + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F₀) (L := E₀) d) := + (ordinaryIdeleClassNorm_relativeIdeleClassBaseChange d).symm + _ = _root_.ideleClassNorm F₀ E₀ c := + congrArg (_root_.ideleClassNorm F₀ E₀) hd + +private theorem rationalFiniteTower_directLimit_extension_eq_norm + (c : IdeleClassGroup E₀) : + rationalIntermediateIdeleClassToDirectLimit + (U₀ : IntermediateField ℚ (SeparableClosure ℚ)) + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F₀) (L := U₀) + (RelativeIdeleGroup.classEmbedding + (rationalFiniteTowerNormalInclusion K L hLK) + (RelativeIdeleGroup.classInclusion F₀ N₀ + (RelativeIdeleGroup.classNorm F₀ E₀ + (rationalFiniteTowerRelativeClass K L hLK c))))) = + rationalIntermediateIdeleClassToDirectLimit F₀ + (_root_.ideleClassNorm F₀ E₀ c) := by + calc + rationalIntermediateIdeleClassToDirectLimit + (U₀ : IntermediateField ℚ (SeparableClosure ℚ)) + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F₀) (L := U₀) + (RelativeIdeleGroup.classEmbedding + (rationalFiniteTowerNormalInclusion K L hLK) + (RelativeIdeleGroup.classInclusion F₀ N₀ + (RelativeIdeleGroup.classNorm F₀ E₀ + (rationalFiniteTowerRelativeClass K L hLK c))))) = + rationalIntermediateIdeleClassToDirectLimit U₀ + (_root_.ideleClassExtension F₀ U₀ + (RelativeIdeleGroup.classNorm F₀ E₀ + (rationalFiniteTowerRelativeClass K L hLK c))) := by + apply congrArg + (rationalIntermediateIdeleClassToDirectLimit + (U₀ : IntermediateField ℚ (SeparableClosure ℚ))) + exact + rationalFiniteTower_baseChange_normalInclusion_classInclusion + K L hLK + (RelativeIdeleGroup.classNorm F₀ E₀ + (rationalFiniteTowerRelativeClass K L hLK c)) + _ = rationalIntermediateIdeleClassToDirectLimit F₀ + (RelativeIdeleGroup.classNorm F₀ E₀ + (rationalFiniteTowerRelativeClass K L hLK c)) := + rationalFiniteTower_directLimit_ideleClassExtension K L hLK _ + _ = rationalIntermediateIdeleClassToDirectLimit F₀ + (_root_.ideleClassNorm F₀ E₀ c) := by + apply congrArg (rationalIntermediateIdeleClassToDirectLimit F₀) + exact rationalFiniteTower_relativeClassNorm_eq_ordinaryNorm K L hLK c + +private theorem rationalFiniteTower_product_embeddings_eq_norm + (c : IdeleClassGroup E₀) : + ∏ q : Q₀, + rationalIntermediateIdeleClassToDirectLimit + (U₀ : IntermediateField ℚ (SeparableClosure ℚ)) + (rationalFiniteTowerEmbeddedClass K L hLK c q) = + rationalIntermediateIdeleClassToDirectLimit F₀ + (_root_.ideleClassNorm F₀ E₀ c) := by + let g := rationalIntermediateIdeleClassToDirectLimit + (U₀ : IntermediateField ℚ (SeparableClosure ℚ)) + let b : Q₀ → IdeleClassGroup U₀ := fun q => + rationalFiniteTowerEmbeddedClass K L hLK c q + have hprodMap (s : Finset Q₀) : + g (s.prod b) = s.prod (fun q => g (b q)) := by + exact map_prod g b s + change (∏ q : Q₀, g (b q)) = _ + calc + ∏ q : Q₀, g (b q) = g (∏ q : Q₀, b q) := + (hprodMap Finset.univ).symm + _ = g (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F₀) (L := U₀) + (RelativeIdeleGroup.classEmbedding + (rationalFiniteTowerNormalInclusion K L hLK) + (RelativeIdeleGroup.classInclusion F₀ N₀ + (RelativeIdeleGroup.classNorm F₀ E₀ + (rationalFiniteTowerRelativeClass K L hLK c))))) := by + exact congrArg g + (rationalFiniteTower_product_embeddedClass K L hLK c) + _ = rationalIntermediateIdeleClassToDirectLimit F₀ + (_root_.ideleClassNorm F₀ E₀ c) := + rationalFiniteTower_directLimit_extension_eq_norm K L hLK c + +private theorem rationalAbstractRelativeFixedFieldNormCore + (c : IdeleClassGroup E₀) : + relativeNorm rationalIdeleClassRepresentation K L hLK + (rationalAbstractRelativeFixedFieldIdeleClassEquivFixedOfFiniteDimensional + K L hLK (Additive.ofMul c)) = + rationalAbstractFixedFieldIdeleClassEquivFixed K + (Additive.ofMul (_root_.ideleClassNorm F₀ E₀ c)) := by + let a := + rationalAbstractRelativeFixedFieldIdeleClassEquivFixedOfFiniteDimensional + K L hLK (Additive.ofMul c) + let term : Q₀ → Additive rationalIdeleClassDirectLimit := + fun q => + (relativeCosetAction rationalIdeleClassRepresentation + K L hLK a q : Additive rationalIdeleClassDirectLimit) + apply Subtype.ext + apply Additive.toMul.injective + change + Additive.toMul (∑ q : Q₀, term q) = + rationalIntermediateIdeleClassToDirectLimit F₀ + (_root_.ideleClassNorm F₀ E₀ c) + rw [toMul_sum] + calc + ∏ q : Q₀, Additive.toMul (term q) = + ∏ q : Q₀, + rationalIntermediateIdeleClassToDirectLimit + (U₀ : IntermediateField ℚ (SeparableClosure ℚ)) + (rationalFiniteTowerEmbeddedClass K L hLK c q) := by + apply Finset.prod_congr rfl + intro q _ + exact rationalRelativeFixedFieldCosetActionPointwise K L hLK c q + _ = rationalIntermediateIdeleClassToDirectLimit F₀ + (_root_.ideleClassNorm F₀ E₀ c) := + rationalFiniteTower_product_embeddings_eq_norm K L hLK c + +/-- The abstract relative norm agrees with the ordinary idèle-class norm +for every finite tower of rational fixed fields. -/ +theorem + rationalAbstractRelativeFixedFieldIdeleClassEquivFixed_relativeNorm_ofFiniteTower : + rationalAbstractRelativeFixedFieldNormStatement K L hLK := by + unfold rationalAbstractRelativeFixedFieldNormStatement + intro F E c + exact rationalAbstractRelativeFixedFieldNormCore K L hLK c + +end RationalFiniteTower + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormStatement.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormStatement.lean new file mode 100644 index 0000000000..71d6d623ca --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormStatement.lean @@ -0,0 +1,168 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormCore +/-! +# Ordinary norms in finite towers of rational fixed fields + +This leaf compares the abstract relative norm in the rational idèle-class +direct limit with the ordinary idèle-class norm for a finite fixed-field +tower. The upper field need not be Galois over the lower field. + +The construction is kept separate from the foundational direct-limit norm +module so that the normal-closure and coset-product proof elaborates in a +fresh command environment. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open LocalClassFieldTheory +open CyclicCohomology +open FiniteTowerNormCore + +/-- The finite absolute quotient attached to a rational fixed field. -/ +abbrev rationalFixedFieldAbsoluteQuotient + (K : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) := + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K) + +/-- The finite relative quotient attached to an inclusion of rational +fixed fields. -/ +abbrev rationalFixedFieldRelativeQuotient + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) := + K.toSubgroup ⧸ extensionSubgroup K L hLK + +/-- The proposition that the abstract relative norm agrees with the ordinary +idele-class norm on a finite tower of rational fixed fields. -/ +@[irreducible] noncomputable def + rationalAbstractRelativeFixedFieldNormStatement + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hKfinite : Finite (rationalFixedFieldAbsoluteQuotient K)] + [hfinite : Finite + (rationalFixedFieldRelativeQuotient K L hLK)] : Prop := + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := FiniteDimensional.trans ℚ F E + letI : NumberField F := NumberField.of_module_finite ℚ F + letI : NumberField E := NumberField.of_module_finite ℚ E + ∀ c : IdeleClassGroup E, + relativeNorm rationalIdeleClassRepresentation K L hLK + (rationalAbstractRelativeFixedFieldIdeleClassEquivFixedOfFiniteDimensional + K L hLK (Additive.ofMul c)) = + rationalAbstractFixedFieldIdeleClassEquivFixed K + (Additive.ofMul (_root_.ideleClassNorm F E c)) + +/-- The pointwise comparison between the abstract coset action and the +ordinary class embedding into a common rational normal closure. -/ +@[irreducible] noncomputable def + rationalRelativeFixedFieldCosetActionStatement + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hKfinite : Finite (rationalFixedFieldAbsoluteQuotient K)] + [hfinite : Finite + (rationalFixedFieldRelativeQuotient K L hLK)] : Prop := + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := FiniteDimensional.trans ℚ F E + letI : NumberField F := NumberField.of_module_finite ℚ F + letI : NumberField E := NumberField.of_module_finite ℚ E + letI : IsScalarTower F E (SeparableClosure ℚ) := + IsScalarTower.of_algebraMap_eq' (by ext x; rfl) + let N := IntermediateField.normalClosure F E (SeparableClosure ℚ) + let Nℚ := N.restrictScalars ℚ + let hFE : F ≤ E.restrictScalars ℚ := + abstractFixedField_le ℚ (SeparableClosure ℚ) hLK + let hEN : E.restrictScalars ℚ ≤ Nℚ := fun _ hx => + IntermediateField.le_normalClosure E hx + let hFN : F ≤ Nℚ := hFE.trans hEN + letI : Algebra F N := + (IntermediateField.inclusion hFN).toRingHom.toAlgebra + letI : IsScalarTower ℚ F N := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional F N := + normalClosure.is_finiteDimensional F E (SeparableClosure ℚ) + letI : FiniteDimensional ℚ N := FiniteDimensional.trans ℚ F N + letI : NumberField N := NumberField.of_module_finite ℚ N + letI : FiniteDimensional ℚ Nℚ := by + change FiniteDimensional ℚ N + infer_instance + let U := rationalNormalClosure Nℚ + let hNU : Nℚ ≤ + (U : IntermediateField ℚ (SeparableClosure ℚ)) := by + change Nℚ ≤ IntermediateField.normalClosure + ℚ Nℚ (SeparableClosure ℚ) + exact IntermediateField.le_normalClosure Nℚ + let hFU : F ≤ + (U : IntermediateField ℚ (SeparableClosure ℚ)) := hFN.trans hNU + letI : Algebra F U := + (IntermediateField.inclusion hFU).toRingHom.toAlgebra + letI : IsScalarTower ℚ F U := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional F U := FiniteDimensional.right ℚ F U + let Q := K.toSubgroup ⧸ extensionSubgroup K L hLK + letI : Fintype Q := Fintype.ofFinite Q + let liftCoset : Q → (E →ₐ[F] N) := fun q => + normalClosureLiftAlgHom + (abstractFixedFieldCosetToAlgHom + ℚ (SeparableClosure ℚ) K L hLK q) + let jNU : N →ₐ[F] U := + algHomOfCompatibleRingHom + (IntermediateField.inclusion hNU).toRingHom + (fun _ => rfl) + ∀ (c : IdeleClassGroup E) (q : Q), + Additive.toMul + ((relativeCosetAction rationalIdeleClassRepresentation + K L hLK + (rationalAbstractRelativeFixedFieldIdeleClassEquivFixedOfFiniteDimensional + K L hLK (Additive.ofMul c)) q : + Additive rationalIdeleClassDirectLimit)) = + rationalIntermediateIdeleClassToDirectLimit + (U : IntermediateField ℚ (SeparableClosure ℚ)) + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := U) + (RelativeIdeleGroup.classEmbedding + (jNU.comp (liftCoset q)) + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := E)).symm c))) + + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescent.lean new file mode 100644 index 0000000000..7e99097b8c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescent.lean @@ -0,0 +1,263 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescentCore +/-! +# Finite-level and direct-limit fixed-point descent endpoints + +This endpoint leaf turns the reusable fixed-point comparisons into actual +descent witnesses first at one finite Galois level and then in the rational +idèle-class direct limit. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity +/-- The tower base-change equivalence carries extension of a rational +relative idele class along `K ↪ U` to relative class inclusion of the +corresponding idele class of `K`. This is the actual commuting square used +for descent. -/ +theorem rationalRelativeIdeleClass_descent_square + (K : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] + (U : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)) + [Algebra K U] + [IsScalarTower ℚ K U] + [FiniteDimensional K U] + [IsGalois K U] + (hKU : + K ≤ (U : IntermediateField ℚ (SeparableClosure ℚ))) + (h_algebraMap : ∀ x : K, + ((algebraMap K U x : U) : SeparableClosure ℚ) = + (x : SeparableClosure ℚ)) + (q : IdeleClassGroup K) : + rationalRelativeIdeleClassTowerBaseChangeEquiv K U + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := K) (M := U) + (IntermediateField.inclusion hKU) + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).symm q)) = + RelativeIdeleGroup.classInclusion K U q := by + have hAlgebra := + rationalIntermediateField_algebra_eq_inclusion + K U hKU h_algebraMap + cases hAlgebra + let : Algebra K U := + (IntermediateField.inclusion hKU).toRingHom.toAlgebra + let : IsScalarTower ℚ K U := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + let : FiniteDimensional K U := + FiniteDimensional.right ℚ K U + let : IsGalois K U := + IsGalois.tower_top_of_isGalois ℚ K U + calc + rationalRelativeIdeleClassTowerBaseChangeEquiv K U + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := K) (M := U) + (IntermediateField.inclusion hKU) + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).symm q)) = + RelativeIdeleGroup.classInclusion K U + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K) + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).symm q)) := by + change + towerRelativeIdeleClassBaseChangeMulEquiv ℚ K U + ((TowerRelativeIdeleGroup.classGroupEquiv ℚ K U).symm + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := K) (M := U) + (IntermediateField.inclusion hKU) + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).symm q))) = + RelativeIdeleGroup.classInclusion K U + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K) + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).symm q)) + exact + rationalRelativeIdeleClassEmbedding_towerBaseChange + hKU + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).symm q) + _ = RelativeIdeleGroup.classInclusion K U q := by + exact + congrArg (RelativeIdeleGroup.classInclusion K U) + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).apply_symm_apply q) + +/-- A rational relative idele class at a finite Galois level whose actual +tower base change is fixed over `K` descends to an actual idele class of +`K`. The conclusion is the commuting square with relative scalar +extension, not merely an abstract preimage. -/ +theorem rationalRelativeIdeleClass_exists_descent_of_tower_fixed + (K : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] + (U : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)) + [Algebra K U] + [IsScalarTower ℚ K U] + [FiniteDimensional K U] + [IsGalois K U] + (hKU : + K ≤ (U : IntermediateField ℚ (SeparableClosure ℚ))) + (h_algebraMap : ∀ x : K, + ((algebraMap K U x : U) : SeparableClosure ℚ) = + (x : SeparableClosure ℚ)) + (d : RelativeIdeleGroup.ClassGroup ℚ U) + (hd_fixed : + towerRelativeIdeleClassBaseChangeMulEquiv ℚ K U + ((TowerRelativeIdeleGroup.classGroupEquiv + ℚ K U).symm d) ∈ + RelativeIdeleGroup.galoisFixedClassSubgroup K U) : + ∃ q : IdeleClassGroup K, + RelativeIdeleGroup.classEmbedding (K := ℚ) (L := K) (M := U) + (IntermediateField.inclusion hKU) + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).symm q) = + d := by + let e : + RelativeIdeleGroup.ClassGroup ℚ U ≃* + RelativeIdeleGroup.ClassGroup K U := + rationalRelativeIdeleClassTowerBaseChangeEquiv K U + let dK : RelativeIdeleGroup.ClassGroup K U := + towerRelativeIdeleClassBaseChangeMulEquiv ℚ K U + ((TowerRelativeIdeleGroup.classGroupEquiv ℚ K U).symm d) + have hdK_fixed : + dK ∈ + RelativeIdeleGroup.galoisFixedClassSubgroup K U := by + exact hd_fixed + let dFixed : + RelativeIdeleGroup.galoisFixedClassSubgroup K U := + ⟨dK, hdK_fixed⟩ + let q : IdeleClassGroup K := + (rationalIntermediateIdeleClassEquivGaloisFixed K U).symm dFixed + have hqU : + RelativeIdeleGroup.classInclusion K U q = dK := by + calc + RelativeIdeleGroup.classInclusion K U q = + ((rationalIntermediateIdeleClassEquivGaloisFixed K U q : + RelativeIdeleGroup.galoisFixedClassSubgroup K U) : + RelativeIdeleGroup.ClassGroup K U) := + (rationalIntermediateIdeleClassEquivGaloisFixed_coe + K U q).symm + _ = dK := by + exact congrArg Subtype.val + ((rationalIntermediateIdeleClassEquivGaloisFixed + K U).apply_symm_apply dFixed) + refine ⟨q, e.injective ?_⟩ + calc + e + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := K) (M := U) + (IntermediateField.inclusion hKU) + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).symm q)) = + RelativeIdeleGroup.classInclusion K U q := + rationalRelativeIdeleClass_descent_square + K U hKU h_algebraMap q + _ = dK := hqU + _ = e d := rfl + +/-- Every rational direct-limit idele class fixed by the absolute Galois +subgroup over a finite intermediate field comes from an actual idele +class of that field. The proof chooses an actual finite-Galois +representative and descends it through the tower comparison. -/ +theorem rationalDirectLimit_fixed_exists_ideleClass + (K : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] + (z : rationalIdeleClassDirectLimit) + (hz_fixed : + ∀ σ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ, + σ ∈ K.fixingSubgroup → σ • z = z) : + ∃ q : IdeleClassGroup K, + rationalIntermediateIdeleClassToDirectLimit K q = z := by + obtain ⟨E, c, hzc⟩ := + DirectLimit.exists_eq_mk + (fun _ _ h => rationalRelativeIdeleClassTransition h) z + let U : + FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ) := + E ⊔ rationalNormalClosure K + let hEU : E ≤ U := + le_sup_left + let hNU : rationalNormalClosure K ≤ U := + le_sup_right + let hKU : + K ≤ (U : IntermediateField ℚ (SeparableClosure ℚ)) := + (IntermediateField.le_normalClosure K).trans hNU + let d : RelativeIdeleGroup.ClassGroup ℚ U := + RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + (IntermediateField.inclusion hEU) c + have hzU : + z = (⟦⟨U, d⟩⟧ : rationalIdeleClassDirectLimit) := by + exact hzc.trans + (rationalIdeleClassDirectLimit_mk_apply c hEU).symm + let : Algebra K U := + (IntermediateField.inclusion hKU).toRingHom.toAlgebra + let : IsScalarTower ℚ K U := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + let : FiniteDimensional K U := + FiniteDimensional.right ℚ K U + let : IsGalois K U := + IsGalois.tower_top_of_isGalois ℚ K U + have h_algebraMap (x : K) : + ((algebraMap K U x : U) : SeparableClosure ℚ) = + (x : SeparableClosure ℚ) := + rfl + have hd_fixed := + rationalTowerRelativeIdeleClass_fixed_of_directLimit_fixed + K U h_algebraMap d z hzU hz_fixed + obtain ⟨q, hq⟩ := + rationalRelativeIdeleClass_exists_descent_of_tower_fixed + K U hKU h_algebraMap d hd_fixed + refine ⟨q, ?_⟩ + calc + rationalIntermediateIdeleClassToDirectLimit K q = + (⟦⟨U, + RelativeIdeleGroup.classEmbedding (K := ℚ) + (L := rationalNormalClosure K) (M := U) + (IntermediateField.inclusion hNU) + (rationalIntermediateIdeleClassToNormalClosure K q)⟩⟧ : + rationalIdeleClassDirectLimit) := + (rationalIdeleClassDirectLimit_mk_apply + (rationalIntermediateIdeleClassToNormalClosure K q) + hNU).symm + _ = + (⟦⟨U, + RelativeIdeleGroup.classEmbedding (K := ℚ) (L := K) (M := U) + (IntermediateField.inclusion hKU) + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).symm q)⟩⟧ : + rationalIdeleClassDirectLimit) := by + apply congrArg + (fun a : RelativeIdeleGroup.ClassGroup ℚ U => + (⟦⟨U, a⟩⟧ : rationalIdeleClassDirectLimit)) + change + RelativeIdeleGroup.classEmbedding (K := ℚ) + (L := rationalNormalClosure K) (M := U) + (IntermediateField.inclusion hNU) + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := K) + (M := rationalNormalClosure K) + (IntermediateField.inclusion + (IntermediateField.le_normalClosure K)) + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).symm q)) = + RelativeIdeleGroup.classEmbedding (K := ℚ) (L := K) (M := U) + (IntermediateField.inclusion + ((IntermediateField.le_normalClosure K).trans hNU)) + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).symm q) + exact + rationalRelativeIdeleClassEmbedding_comp + (IntermediateField.le_normalClosure K) hNU + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).symm q) + _ = ⟦⟨U, d⟩⟧ := by rw [hq] + _ = z := hzU.symm + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescentCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescentCore.lean new file mode 100644 index 0000000000..06e85f3d07 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescentCore.lean @@ -0,0 +1,207 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevel +/-! +# Descent of fixed rational idele classes + +An element of the rational idele-class direct limit which is fixed over a +finite intermediate field is represented at a finite Galois level. Its +actual tower base change is Galois-fixed, hence descends to an idele class +of the intermediate field. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +/-- If a finite-level representative of the rational idele-class direct +limit is fixed by the absolute Galois subgroup over `K`, then its actual +tower base change from `ℚ` to `K` is fixed by `Gal(U/K)`. -/ +theorem rationalTowerRelativeIdeleClass_fixed_of_directLimit_fixed + (K : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] + (U : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)) + [Algebra K U] + [IsScalarTower ℚ K U] + [FiniteDimensional K U] + [IsGalois K U] + (h_algebraMap : ∀ x : K, + ((algebraMap K U x : U) : SeparableClosure ℚ) = + (x : SeparableClosure ℚ)) + (d : RelativeIdeleGroup.ClassGroup ℚ U) + (z : rationalIdeleClassDirectLimit) + (hzU : + z = (⟦⟨U, d⟩⟧ : rationalIdeleClassDirectLimit)) + (hz_fixed : + ∀ σ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ, + σ ∈ K.fixingSubgroup → σ • z = z) : + towerRelativeIdeleClassBaseChangeMulEquiv ℚ K U + ((TowerRelativeIdeleGroup.classGroupEquiv + ℚ K U).symm d) ∈ + RelativeIdeleGroup.galoisFixedClassSubgroup K U := by + intro η + let τ : U ≃ₐ[ℚ] U := + η.restrictScalars ℚ + obtain ⟨σ, hσU⟩ := + (AlgEquiv.restrictNormalHom_surjective + (F := ℚ) (K₁ := U) (E := SeparableClosure ℚ)) τ + have hσK : σ ∈ K.fixingSubgroup := by + rw [IntermediateField.mem_fixingSubgroup_iff] + intro y hy + let yK : K := ⟨y, hy⟩ + let yU : U := algebraMap K U yK + have hη : η yU = yU := by + exact η.commutes yK + have hres := + DFunLike.congr_fun hσU yU + calc + σ y = + σ ((yU : U) : SeparableClosure ℚ) := by + rw [h_algebraMap yK] + _ = + (((AlgEquiv.restrictNormalHom U σ) yU : U) : + SeparableClosure ℚ) := + (AlgEquiv.restrictNormal_commutes σ U yU).symm + _ = ((τ yU : U) : SeparableClosure ℚ) := + congrArg Subtype.val hres + _ = ((η yU : U) : SeparableClosure ℚ) := rfl + _ = ((yU : U) : SeparableClosure ℚ) := + congrArg Subtype.val hη + _ = y := + h_algebraMap yK + have hzσ := hz_fixed σ hσK + rw [hzU] at hzσ + change (⟦⟨U, (AlgEquiv.restrictNormalHom U σ) • d⟩⟧ : rationalIdeleClassDirectLimit) = + ⟦⟨U, d⟩⟧ at hzσ + have hdQ : + (AlgEquiv.restrictNormalHom U σ) • d = d := + (rationalRelativeIdeleClassToDirectLimit_injective U) hzσ + have hdτ : τ • d = d := by + rw [← hσU] + exact hdQ + calc + η • + towerRelativeIdeleClassBaseChangeMulEquiv ℚ K U + ((TowerRelativeIdeleGroup.classGroupEquiv + ℚ K U).symm d) = + towerRelativeIdeleClassBaseChangeMulEquiv ℚ K U + ((TowerRelativeIdeleGroup.classGroupEquiv + ℚ K U).symm + ((η.restrictScalars ℚ) • d)) := + (towerRelativeIdeleClassBaseChangeMulEquiv_smul + ℚ K U η d).symm + _ = + towerRelativeIdeleClassBaseChangeMulEquiv ℚ K U + ((TowerRelativeIdeleGroup.classGroupEquiv + ℚ K U).symm d) := + congrArg + (fun a => + towerRelativeIdeleClassBaseChangeMulEquiv ℚ K U + ((TowerRelativeIdeleGroup.classGroupEquiv + ℚ K U).symm a)) + hdτ + +/-- An algebra structure on nested rational intermediate fields is the +canonical one induced by intermediate-field inclusion whenever its algebra +map agrees with the ambient inclusions. -/ +theorem rationalIntermediateField_algebra_eq_inclusion + (K : IntermediateField ℚ (SeparableClosure ℚ)) + (U : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)) + [Algebra K U] + (hKU : + K ≤ (U : IntermediateField ℚ (SeparableClosure ℚ))) + (h_algebraMap : ∀ x : K, + ((algebraMap K U x : U) : SeparableClosure ℚ) = + (x : SeparableClosure ℚ)) : + (inferInstance : Algebra K U) = + (IntermediateField.inclusion hKU).toRingHom.toAlgebra := by + apply Algebra.algebra_ext + intro x + apply Subtype.ext + exact h_algebraMap x + +/-- The actual tower comparison from rational relative idele classes at `U` +to relative idele classes over the intermediate field `K`. -/ +noncomputable def rationalRelativeIdeleClassTowerBaseChangeEquiv + (K : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] + (U : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)) + [Algebra K U] + [IsScalarTower ℚ K U] + [FiniteDimensional K U] + [IsGalois K U] : + RelativeIdeleGroup.ClassGroup ℚ U ≃* + RelativeIdeleGroup.ClassGroup K U := + (TowerRelativeIdeleGroup.classGroupEquiv + ℚ K U).symm.trans + (towerRelativeIdeleClassBaseChangeMulEquiv ℚ K U) + +/-- The actual idele class group of `K`, identified with the subgroup of +relative idele classes at `U` fixed by `Gal(U/K)`. This transports the +Herbrand fixed-subgroup target of `baseIdeleClassEquivFixed` to the concrete +Galois-fixed subgroup. -/ +noncomputable def rationalIntermediateIdeleClassEquivGaloisFixed + (K : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] + (U : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)) + [Algebra K U] + [IsScalarTower ℚ K U] + [FiniteDimensional K U] + [IsGalois K U] : + IdeleClassGroup K ≃* + RelativeIdeleGroup.galoisFixedClassSubgroup K U := by + letI : + MulDistribMulAction (U ≃ₐ[K] U) + (RelativeIdeleGroup.ClassGroup K U) := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K U + exact + (RelativeIdeleGroup.Cohomology.baseIdeleClassEquivFixed K U).trans + (MulEquiv.subgroupCongr + (RelativeIdeleGroup.Cohomology.ideleClass_fixedSubgroup_eq_galoisFixed + K U)) + +/-- Under the concrete fixed-point equivalence, an idele class maps to its +actual relative class inclusion. -/ +@[simp] +theorem rationalIntermediateIdeleClassEquivGaloisFixed_coe + (K : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] + (U : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)) + [Algebra K U] + [IsScalarTower ℚ K U] + [FiniteDimensional K U] + [IsGalois K U] + (q : IdeleClassGroup K) : + ((rationalIntermediateIdeleClassEquivGaloisFixed K U q : + RelativeIdeleGroup.galoisFixedClassSubgroup K U) : + RelativeIdeleGroup.ClassGroup K U) = + RelativeIdeleGroup.classInclusion K U q := by + let : + MulDistribMulAction (U ≃ₐ[K] U) + (RelativeIdeleGroup.ClassGroup K U) := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction K U + change + ((RelativeIdeleGroup.Cohomology.baseIdeleClassEquivFixed K U q : + CyclicCohomology.ProfiniteCohomology.Herbrand.fixedSubgroup + (U ≃ₐ[K] U) + (RelativeIdeleGroup.ClassGroup K U)) : + RelativeIdeleGroup.ClassGroup K U) = + RelativeIdeleGroup.classInclusion K U q + exact + RelativeIdeleGroup.Cohomology.baseIdeleClassEquivFixed_coe K U q + + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPoints.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPoints.lean new file mode 100644 index 0000000000..9dbd4dea1b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPoints.lean @@ -0,0 +1,632 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescent +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerDelta +/-! +# Fixed points of the rational idele-class direct limit + +The actual idele class group of a finite rational intermediate field is +identified with the corresponding fixed subgroup of the direct limit. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +/-- Scalar extension of a rational relative adele is fixed by every +absolute Galois element fixing the source field. -/ +theorem + rationalRelativeAdeleEmbedding_fixed_of_mem_fixingSubgroup + {K : IntermediateField ℚ (SeparableClosure ℚ)} + [FiniteDimensional ℚ K] + {N : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)} + (hKN : K ≤ (N : + IntermediateField ℚ (SeparableClosure ℚ))) + (σ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (hσ : σ ∈ K.fixingSubgroup) + (z : RelativeAdeleRing ℚ K) : + RelativeIdeleGroup.conjugation ℚ N + (AlgEquiv.restrictNormalHom N σ) + (RelativeIdeleGroup.adeleEmbedding (K := ℚ) (L := K) (M := N) + (IntermediateField.inclusion hKN) z) = + RelativeIdeleGroup.adeleEmbedding (K := ℚ) (L := K) (M := N) + (IntermediateField.inclusion hKN) z := by + induction z using TensorProduct.inductionOn with + | tmul a x => + simp only [RelativeIdeleGroup.adeleEmbedding, + RelativeIdeleGroup.scalarEmbedding_tmul, + RelativeIdeleGroup.conjugation_tmul] + congr 1 + apply Subtype.ext + calc + (((AlgEquiv.restrictNormalHom N σ) + (IntermediateField.inclusion hKN x) : N) : + SeparableClosure ℚ) = + σ ((IntermediateField.inclusion hKN x : N) : + SeparableClosure ℚ) := + AlgEquiv.restrictNormal_commutes σ N + (IntermediateField.inclusion hKN x) + _ = σ (x : SeparableClosure ℚ) := rfl + _ = (x : SeparableClosure ℚ) := + (IntermediateField.mem_fixingSubgroup_iff K σ).1 + hσ x.1 x.2 + _ = ((IntermediateField.inclusion hKN x : N) : + SeparableClosure ℚ) := rfl + | add x y hx hy => + simp only [map_add, hx, hy] + +/-- Scalar extension of a rational relative idele class is fixed by every +absolute Galois element fixing the source field. -/ +theorem + rationalRelativeIdeleClassEmbedding_fixed_of_mem_fixingSubgroup + {K : IntermediateField ℚ (SeparableClosure ℚ)} + [FiniteDimensional ℚ K] + {N : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)} + (hKN : K ≤ (N : + IntermediateField ℚ (SeparableClosure ℚ))) + (σ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (hσ : σ ∈ K.fixingSubgroup) + (c : RelativeIdeleGroup.ClassGroup ℚ K) : + σ • RelativeIdeleGroup.classEmbedding (K := ℚ) (L := K) (M := N) + (IntermediateField.inclusion hKN) c = + RelativeIdeleGroup.classEmbedding (K := ℚ) (L := K) (M := N) + (IntermediateField.inclusion hKN) c := by + refine QuotientGroup.induction_on c ?_ + intro a + change + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup ℚ N) + ((AlgEquiv.restrictNormalHom N σ) • + RelativeIdeleGroup.ideleEmbedding (K := ℚ) (L := K) (M := N) + (IntermediateField.inclusion hKN) a) = + QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup ℚ N) + (RelativeIdeleGroup.ideleEmbedding (K := ℚ) (L := K) (M := N) + (IntermediateField.inclusion hKN) a) + apply congrArg + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup ℚ N)) + apply Units.ext + exact + rationalRelativeAdeleEmbedding_fixed_of_mem_fixingSubgroup + hKN σ hσ (a : RelativeAdeleRing ℚ K) + +/-- The map from an intermediate idele class group to the direct limit +intertwines compatible finite and absolute Galois actions. -/ +theorem rationalIntermediateIdeleClassToDirectLimit_conjugation + (E : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ E] + (σ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (τ : E ≃ₐ[ℚ] E) + (hστ : ∀ x : E, + ((τ x : E) : SeparableClosure ℚ) = + σ (x : SeparableClosure ℚ)) + (c : RelativeIdeleGroup.ClassGroup ℚ E) : + σ • rationalIntermediateIdeleClassToDirectLimit E + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) c) = + rationalIntermediateIdeleClassToDirectLimit E + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) (τ • c)) := by + let N : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ) := + rationalNormalClosure E + let hEN : E ≤ (N : IntermediateField ℚ (SeparableClosure ℚ)) := + IntermediateField.le_normalClosure E + let : SMul + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (RelativeIdeleGroup.ClassGroup ℚ N) := + (rationalAbsoluteGaloisIdeleClassAction + N).toSMul + have hconjugation : + σ • RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := N) + (IntermediateField.inclusion hEN) c = + RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := N) + (IntermediateField.inclusion hEN) + (τ • c) := + (rationalRelativeIdeleClassEmbedding_conjugation_of_restrict + hEN σ τ hστ c).symm + have hlimit_smul + (d : RelativeIdeleGroup.ClassGroup ℚ N) : + σ • rationalRelativeIdeleClassToDirectLimit N d = + rationalRelativeIdeleClassToDirectLimit N + (σ • d) := by + rfl + calc + σ • rationalIntermediateIdeleClassToDirectLimit E + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) c) = + σ • rationalRelativeIdeleClassToDirectLimit N + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := N) + (IntermediateField.inclusion hEN) c) := by + convert congrArg (fun z => σ • z) + (rationalIntermediateIdeleClassToDirectLimit_baseChange E c) using 1 + simp only [N, rationalNormalClosure] + congr 4 + _ = rationalRelativeIdeleClassToDirectLimit N + (σ • RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := N) + (IntermediateField.inclusion hEN) c) := + hlimit_smul _ + _ = rationalRelativeIdeleClassToDirectLimit N + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := N) + (IntermediateField.inclusion hEN) + (τ • c)) := + congrArg + (rationalRelativeIdeleClassToDirectLimit N) + hconjugation + _ = rationalIntermediateIdeleClassToDirectLimit E + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) (τ • c)) := + by + convert + (rationalIntermediateIdeleClassToDirectLimit_baseChange E (τ • c)).symm + using 1 + simp only [N, rationalNormalClosure] + congr 4 + +/-- Scalar extension intertwines the ambient automorphism with an induced field equivalence. -/ +private theorem rationalRelativeIdeleClassEmbedding_ambientAlgEquiv + {E F : IntermediateField ℚ (SeparableClosure ℚ)} + [FiniteDimensional ℚ E] [FiniteDimensional ℚ F] + (U : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)) + (hEU : E ≤ (U : IntermediateField ℚ (SeparableClosure ℚ))) + (hFU : F ≤ (U : IntermediateField ℚ (SeparableClosure ℚ))) + (σ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) (e : E ≃ₐ[ℚ] F) + (hσe : ∀ x : E, ((e x : F) : SeparableClosure ℚ) = σ (x : SeparableClosure ℚ)) + (cE : RelativeIdeleGroup.ClassGroup ℚ E) : + σ • RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + (IntermediateField.inclusion hEU) cE = + RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) (M := U) + (IntermediateField.inclusion hFU) (relativeIdeleClassCongr (K := ℚ) e cE) := by + let : MulDistribMulAction + (U ≃ₐ[ℚ] U) + (RelativeIdeleGroup.ClassGroup ℚ U) := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction ℚ U + let : SMul + (U ≃ₐ[ℚ] U) + (RelativeIdeleGroup.ClassGroup ℚ U) := + (RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction ℚ U).toSMul + let : SMul + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (RelativeIdeleGroup.ClassGroup ℚ U) := + (rationalAbsoluteGaloisIdeleClassAction U).toSMul + have hrestricted : + (AlgEquiv.restrictNormalHom U σ) • + RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + (IntermediateField.inclusion hEU) cE = + RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + ((AlgEquiv.restrictNormalHom U σ).toAlgHom.comp + (IntermediateField.inclusion hEU)) cE := by + exact rationalRelativeIdeleClassEmbedding_smul_eq_classEmbedding hEU σ cE + have hsmul : + σ • RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + (IntermediateField.inclusion hEU) cE = + RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + ((AlgEquiv.restrictNormalHom U σ).toAlgHom.comp + (IntermediateField.inclusion hEU)) cE := by + change (AlgEquiv.restrictNormalHom U σ) • + RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + (IntermediateField.inclusion hEU) cE = + RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + ((AlgEquiv.restrictNormalHom U σ).toAlgHom.comp + (IntermediateField.inclusion hEU)) cE + exact hrestricted + have hclass' : + σ • RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + (IntermediateField.inclusion hEU) cE = + RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) (M := U) + (IntermediateField.inclusion hFU) + (relativeIdeleClassCongr (K := ℚ) e cE) := by + calc + σ • RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + (IntermediateField.inclusion hEU) cE = + RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + ((AlgEquiv.restrictNormalHom U σ).toAlgHom.comp + (IntermediateField.inclusion hEU)) cE := + hsmul + _ = RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) (M := U) + (IntermediateField.inclusion hFU) + (relativeIdeleClassCongr (K := ℚ) e cE) := by + rw [RelativeIdeleGroup.classEmbedding_relativeIdeleClassCongr] + apply congrArg + (fun f : E →ₐ[ℚ] U => + RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) f cE) + apply AlgHom.ext + intro x + apply Subtype.ext + calc + (((AlgEquiv.restrictNormalHom U σ).toAlgHom.comp + (IntermediateField.inclusion hEU)) x : + SeparableClosure ℚ) = + σ (x : SeparableClosure ℚ) := by + exact + AlgEquiv.restrictNormal_commutes σ U + (IntermediateField.inclusion hEU x) + _ = ((e x : F) : SeparableClosure ℚ) := + (hσe x).symm + _ = + (((IntermediateField.inclusion hFU).comp + e.toAlgHom) x : U) := + rfl + exact hclass' + +/-- The canonical direct-limit realization of idèle classes is natural +under an equivalence between two finite rational intermediate fields +which is induced by an automorphism of the rational separable closure. -/ +theorem rationalIntermediateIdeleClassToDirectLimit_ambientAlgEquiv + {E F : IntermediateField ℚ (SeparableClosure ℚ)} + [FiniteDimensional ℚ E] [FiniteDimensional ℚ F] + (σ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (e : E ≃ₐ[ℚ] F) + (hσe : ∀ x : E, + ((e x : F) : SeparableClosure ℚ) = + σ (x : SeparableClosure ℚ)) + (c : IdeleClassGroup E) : + σ • rationalIntermediateIdeleClassToDirectLimit E c = + rationalIntermediateIdeleClassToDirectLimit F + (ideleClassCongr e c) := by + let U : + FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ) := + rationalNormalClosure E ⊔ rationalNormalClosure F + let hEU : + E ≤ (U : IntermediateField ℚ (SeparableClosure ℚ)) := + (IntermediateField.le_normalClosure E).trans le_sup_left + let hFU : + F ≤ (U : IntermediateField ℚ (SeparableClosure ℚ)) := + (IntermediateField.le_normalClosure F).trans le_sup_right + let cE : RelativeIdeleGroup.ClassGroup ℚ E := + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E)).symm c + let cF : RelativeIdeleGroup.ClassGroup ℚ F := + relativeIdeleClassCongr (K := ℚ) e cE + let : MulDistribMulAction + (U ≃ₐ[ℚ] U) + (RelativeIdeleGroup.ClassGroup ℚ U) := + RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction ℚ U + let : SMul + (U ≃ₐ[ℚ] U) + (RelativeIdeleGroup.ClassGroup ℚ U) := + (RelativeIdeleGroup.Cohomology.ideleClassMulDistribMulAction ℚ U).toSMul + let : SMul + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (RelativeIdeleGroup.ClassGroup ℚ U) := + (rationalAbsoluteGaloisIdeleClassAction U).toSMul + have hcF : + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) cF = + ideleClassCongr e c := by + calc + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) cF = + ideleClassCongr e + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) cE) := by + simpa only [cF] using + (_root_.relativeIdeleClassBaseChangeMulEquiv_relativeIdeleClassCongr + e cE) + _ = ideleClassCongr e c := by + simp only [cE, + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E)).apply_symm_apply] + have hE : + rationalIntermediateIdeleClassToDirectLimit E c = + rationalRelativeIdeleClassToDirectLimit U + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + (IntermediateField.inclusion hEU) cE) := by + calc + rationalIntermediateIdeleClassToDirectLimit E c = + rationalIntermediateIdeleClassToDirectLimit E + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) cE) := by + simp only [cE, + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E)).apply_symm_apply] + _ = + rationalIntermediateIdeleClassToDirectLimit + (U : IntermediateField ℚ (SeparableClosure ℚ)) + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := U) + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + (IntermediateField.inclusion hEU) cE)) := + (rationalIntermediateIdeleClassToDirectLimit_extension + hEU cE).symm + _ = + rationalRelativeIdeleClassToDirectLimit U + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + (IntermediateField.inclusion hEU) cE) := + rationalFiniteGaloisIdeleClassToDirectLimit_baseChange + U (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + (IntermediateField.inclusion hEU) cE) + have hF : + rationalIntermediateIdeleClassToDirectLimit F + (ideleClassCongr e c) = + rationalRelativeIdeleClassToDirectLimit U + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) (M := U) + (IntermediateField.inclusion hFU) cF) := by + calc + rationalIntermediateIdeleClassToDirectLimit F + (ideleClassCongr e c) = + rationalIntermediateIdeleClassToDirectLimit F + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := F) cF) := by + rw [hcF] + _ = + rationalIntermediateIdeleClassToDirectLimit + (U : IntermediateField ℚ (SeparableClosure ℚ)) + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := U) + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) (M := U) + (IntermediateField.inclusion hFU) cF)) := + (rationalIntermediateIdeleClassToDirectLimit_extension + hFU cF).symm + _ = + rationalRelativeIdeleClassToDirectLimit U + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) (M := U) + (IntermediateField.inclusion hFU) cF) := + rationalFiniteGaloisIdeleClassToDirectLimit_baseChange + U (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) (M := U) + (IntermediateField.inclusion hFU) cF) + have hclass' := rationalRelativeIdeleClassEmbedding_ambientAlgEquiv + U hEU hFU σ e hσe cE + have hclass : + σ • RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + (IntermediateField.inclusion hEU) cE = + RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) (M := U) + (IntermediateField.inclusion hFU) cF := by + simpa only [cF] using hclass' + have hlimit_smul : + σ • rationalRelativeIdeleClassToDirectLimit U + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + (IntermediateField.inclusion hEU) cE) = + rationalRelativeIdeleClassToDirectLimit U + (σ • RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + (IntermediateField.inclusion hEU) cE) := by + rfl + calc + σ • rationalIntermediateIdeleClassToDirectLimit E c = + σ • rationalRelativeIdeleClassToDirectLimit U + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + (IntermediateField.inclusion hEU) cE) := by + rw [hE] + _ = rationalRelativeIdeleClassToDirectLimit U + (σ • RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) + (IntermediateField.inclusion hEU) cE) := + hlimit_smul + _ = rationalRelativeIdeleClassToDirectLimit U + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) (M := U) + (IntermediateField.inclusion hFU) cF) := + congrArg (rationalRelativeIdeleClassToDirectLimit U) hclass + _ = rationalIntermediateIdeleClassToDirectLimit F + (ideleClassCongr e c) := + hF.symm + +/-- The image in the direct limit of an idele class over `K` is fixed by +the absolute Galois subgroup fixing `K`. -/ +theorem rationalIntermediateIdeleClassToDirectLimit_fixed + (K : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] + (c : IdeleClassGroup K) + (σ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (hσ : σ ∈ K.fixingSubgroup) : + σ • rationalIntermediateIdeleClassToDirectLimit K c = + rationalIntermediateIdeleClassToDirectLimit K c := by + let N : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ) := + rationalNormalClosure K + let hKN : K ≤ (N : IntermediateField ℚ (SeparableClosure ℚ)) := + IntermediateField.le_normalClosure K + let : SMul + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (RelativeIdeleGroup.ClassGroup ℚ N) := + (rationalAbsoluteGaloisIdeleClassAction + N).toSMul + let d : RelativeIdeleGroup.ClassGroup ℚ K := + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).symm c + have hd : + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K) d = c := by + simp only [d, + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).apply_symm_apply] + have hfixed : + σ • RelativeIdeleGroup.classEmbedding (K := ℚ) (L := K) (M := N) + (IntermediateField.inclusion hKN) d = + RelativeIdeleGroup.classEmbedding (K := ℚ) (L := K) (M := N) + (IntermediateField.inclusion hKN) d := + rationalRelativeIdeleClassEmbedding_fixed_of_mem_fixingSubgroup + hKN σ hσ d + have hlimit_smul : + σ • rationalRelativeIdeleClassToDirectLimit N + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := K) (M := N) + (IntermediateField.inclusion hKN) d) = + rationalRelativeIdeleClassToDirectLimit N + (σ • RelativeIdeleGroup.classEmbedding (K := ℚ) (L := K) (M := N) + (IntermediateField.inclusion hKN) d) := by + rfl + calc + σ • rationalIntermediateIdeleClassToDirectLimit K c = + σ • rationalIntermediateIdeleClassToDirectLimit K + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K) d) := by + rw [hd] + _ = σ • rationalRelativeIdeleClassToDirectLimit N + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := K) (M := N) + (IntermediateField.inclusion hKN) d) := by + convert congrArg (fun z => σ • z) + (rationalIntermediateIdeleClassToDirectLimit_baseChange K d) using 1 + simp only [N, rationalNormalClosure] + congr 4 + _ = rationalRelativeIdeleClassToDirectLimit N + (σ • RelativeIdeleGroup.classEmbedding (K := ℚ) (L := K) (M := N) + (IntermediateField.inclusion hKN) d) := + hlimit_smul + _ = rationalRelativeIdeleClassToDirectLimit N + (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := K) (M := N) + (IntermediateField.inclusion hKN) d) := + congrArg + (rationalRelativeIdeleClassToDirectLimit N) hfixed + _ = rationalIntermediateIdeleClassToDirectLimit K + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K) d) := + by + convert + (rationalIntermediateIdeleClassToDirectLimit_baseChange K d).symm + using 1 + simp only [N, rationalNormalClosure] + congr 4 + _ = rationalIntermediateIdeleClassToDirectLimit K c := by + rw [hd] + +/-- Additive idele classes map into the fixed subgroup of the rational +idele-class representation. -/ +theorem rationalIntermediateIdeleClassToDirectLimit_mem_fixed + (K : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] + (c : Additive (IdeleClassGroup K)) : + MonoidHom.toAdditive + (rationalIntermediateIdeleClassToDirectLimit K) c ∈ + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) K) := by + change + (show rationalIdeleClassRepresentation from + MonoidHom.toAdditive + (rationalIntermediateIdeleClassToDirectLimit K) c) ∈ + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) K) + rw [KummerTheory.mem_ambientFixedAddSubgroup_iff] + intro σ + change + Additive.ofMul + (σ.1 • + rationalIntermediateIdeleClassToDirectLimit K + (Additive.toMul c)) = + Additive.ofMul + (rationalIntermediateIdeleClassToDirectLimit K + (Additive.toMul c)) + exact congrArg Additive.ofMul + (rationalIntermediateIdeleClassToDirectLimit_fixed + K (Additive.toMul c) σ.1 σ.2) + +/-- The canonical additive homomorphism from the idele class group of a +finite rational intermediate field to the corresponding fixed subgroup. -/ +noncomputable def rationalIntermediateIdeleClassToFixed + (K : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] : + Additive (IdeleClassGroup K) →+ + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) K) := + (MonoidHom.toAdditive + (rationalIntermediateIdeleClassToDirectLimit K)).codRestrict + (KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) K)) + (rationalIntermediateIdeleClassToDirectLimit_mem_fixed K) + +/-- The canonical map from a finite rational idele class group to the +corresponding fixed subgroup is injective. -/ +theorem rationalIntermediateIdeleClassToFixed_injective + (K : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] : + Function.Injective + (rationalIntermediateIdeleClassToFixed K) := by + intro a b hab + have hlim : + rationalIntermediateIdeleClassToDirectLimit K + (Additive.toMul a) = + rationalIntermediateIdeleClassToDirectLimit K + (Additive.toMul b) := by + exact congrArg + (fun z : + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) K) => + Additive.toMul + (z.1 : (rationalIdeleClassRepresentation).V)) + hab + have hnormal : + rationalIntermediateIdeleClassToNormalClosure K + (Additive.toMul a) = + rationalIntermediateIdeleClassToNormalClosure K + (Additive.toMul b) := + (rationalRelativeIdeleClassToDirectLimit_injective + (rationalNormalClosure K)) hlim + have hrelative : + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).symm (Additive.toMul a) = + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).symm (Additive.toMul b) := + (rationalRelativeIdeleClassEmbedding_injective + (IntermediateField.le_normalClosure K)) hnormal + apply Additive.toMul.injective + exact + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).symm.injective hrelative + +/-- The canonical map from a finite rational idele class group to the +corresponding fixed subgroup is surjective. -/ +theorem rationalIntermediateIdeleClassToFixed_surjective + (K : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] : + Function.Surjective + (rationalIntermediateIdeleClassToFixed K) := by + intro x + let z : rationalIdeleClassDirectLimit := + Additive.toMul + (x.1 : (rationalIdeleClassRepresentation).V) + have hz_fixed + (σ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) + (hσ : σ ∈ K.fixingSubgroup) : + σ • z = z := by + have hfixed := x.2 ⟨σ, hσ⟩ + change Additive.ofMul (σ • z) = Additive.ofMul z at hfixed + exact Additive.ofMul.injective hfixed + obtain ⟨q, hqz⟩ := + rationalDirectLimit_fixed_exists_ideleClass + K z hz_fixed + refine ⟨Additive.ofMul q, ?_⟩ + apply Subtype.ext + change + (show rationalIdeleClassRepresentation from + Additive.ofMul + (rationalIntermediateIdeleClassToDirectLimit K q)) = + x.1 + rw [hqz] + exact + ofMul_toMul + (x.1 : Additive rationalIdeleClassDirectLimit) + +/-- The subgroup of the absolute idele-class direct limit fixed by the +absolute Galois group over a finite rational intermediate field is +exactly that field's actual idele class group. -/ +noncomputable def rationalIdeleClassEquivFixed + (K : IntermediateField ℚ (SeparableClosure ℚ)) + [FiniteDimensional ℚ K] : + Additive (IdeleClassGroup K) ≃+ + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation + (RamificationTheory.closedFixingSubgroup + ℚ (SeparableClosure ℚ) K) := + AddEquiv.ofBijective + (rationalIntermediateIdeleClassToFixed K) + ⟨rationalIntermediateIdeleClassToFixed_injective K, + rationalIntermediateIdeleClassToFixed_surjective K⟩ + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitNormQuotient.lean new file mode 100644 index 0000000000..32abb9c743 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitNormQuotient.lean @@ -0,0 +1,1129 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient +/-! +# Finite norm quotients for rational fixed fields + +The abstract finite norm subgroup and quotient are identified with the +ordinary idele-class norm range and quotient of the actual fixed-field extension. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open LocalClassFieldTheory +open CyclicCohomology + +local instance + rationalNormQuotientIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +local instance + rationalNormQuotientIdeleClassSubgroupNormal + {F : Type} [Field F] [NumberField F] + (N : Subgroup (IdeleClassGroup F)) : N.Normal := + N.normal_of_isMulCommutative + +@[instance_reducible] +private noncomputable def rationalNormQuotientIdeleClassCommGroup + (F : Type) [Field F] [NumberField F] : + CommGroup (IdeleClassGroup F) := + open scoped IsMulCommutative in + inferInstance + +private theorem rationalNormQuotientNumberFieldOfFiniteDimensional + (F : Type*) [Field F] [Algebra ℚ F] [FiniteDimensional ℚ F] : + NumberField F := + NumberField.of_module_finite ℚ F + +private theorem rationalNormQuotientAbstractFixedFieldNumberField + (K : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] : + NumberField + (abstractFixedField ℚ (SeparableClosure ℚ) K) := by + let _ : FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) K) := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + exact + NumberField.of_module_finite ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) K) + +private theorem rationalNormQuotientAbstractRelativeFixedFieldNumberField + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + NumberField + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK) := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + let _ : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + let _ : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + let _ : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + let _ : FiniteDimensional ℚ E := FiniteDimensional.trans ℚ F E + exact NumberField.of_module_finite ℚ E + +private theorem addEquiv_trans_symm_trans_symm_trans_apply_eq + {V A B C D : Type*} + [Add V] [Add A] [Add B] [Add C] [Add D] + (eV : V ≃+ D) (eB : B ≃+ D) + (eA : A ≃+ B) (eC : A ≃+ C) + {y : V} {z : A} {w : C} + (h : eV y = eB (eA z)) + (ht : eC z = w) : + (((eV.trans eB.symm).trans eA.symm).trans eC) y = w := by + change eC (eA.symm (eB.symm (eV y))) = w + rw [h, eB.symm_apply_apply, eA.symm_apply_apply] + exact ht + +private theorem rationalTowerRelativeClass_baseChange + (F E : Type) + [Field F] [NumberField F] + [Field E] [NumberField E] + [Algebra ℚ F] [Algebra F E] [Algebra ℚ E] + [IsScalarTower ℚ F E] + [FiniteDimensional ℚ F] [FiniteDimensional F E] + (c : Additive (IdeleClassGroup E)) : + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := E) + (towerRelativeIdeleClassBaseChangeMulEquiv ℚ F E + ((TowerRelativeIdeleGroup.classGroupEquiv + ℚ F E).symm + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E)).symm (Additive.toMul c)))) = + Additive.toMul c := by + let dQ : RelativeIdeleGroup.ClassGroup ℚ E := + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E)).symm (Additive.toMul c) + have hTower := + relativeIdeleClassBaseChangeMulEquiv_tower ℚ F E dQ + have hBase := + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E)).apply_symm_apply (Additive.toMul c) + exact Eq.trans hTower hBase + +private theorem rationalTowerRelativeClass_norm + (F E : Type) + [Field F] [NumberField F] + [Field E] [NumberField E] + [Algebra ℚ F] [Algebra F E] [Algebra ℚ E] + [IsScalarTower ℚ F E] + [FiniteDimensional ℚ F] [FiniteDimensional F E] + (c : Additive (IdeleClassGroup E)) : + let dF := + towerRelativeIdeleClassBaseChangeMulEquiv ℚ F E + ((TowerRelativeIdeleGroup.classGroupEquiv + ℚ F E).symm + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E)).symm (Additive.toMul c))) + RelativeIdeleGroup.Cohomology.ideleClassNorm F E dF = + _root_.ideleClassNorm F E (Additive.toMul c) := by + let dF := + towerRelativeIdeleClassBaseChangeMulEquiv ℚ F E + ((TowerRelativeIdeleGroup.classGroupEquiv + ℚ F E).symm + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E)).symm (Additive.toMul c))) + have hbase := rationalTowerRelativeClass_baseChange F E c + change + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := F) (L := E) dF = Additive.toMul c at hbase + exact + (ordinaryIdeleClassNorm_relativeIdeleClassBaseChange dF).symm.trans + (congrArg (_root_.ideleClassNorm F E) hbase) + +private noncomputable abbrev rationalRelativeFixedFieldIdeleClassAdditiveType + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : Type := + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + letI : NumberField E := + NumberField.of_module_finite ℚ E + Additive (IdeleClassGroup E) + +private noncomputable abbrev rationalOrdinaryNormQuotientAdditiveType + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : Type := + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI := hnormal + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := FiniteDimensional.trans ℚ F E + letI := + rationalNormQuotientNumberFieldOfFiniteDimensional F + letI := + rationalNormQuotientNumberFieldOfFiniteDimensional E + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L hLK hnormal + Additive + (IdeleClassGroup F ⧸ (_root_.ideleClassNorm F E).range) + +@[instance_reducible] private noncomputable instance + rationalOrdinaryNormQuotientAdditiveTypeAddCommGroup + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + AddCommGroup + (rationalOrdinaryNormQuotientAdditiveType + K L hLK hnormal) := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI := hnormal + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := FiniteDimensional.trans ℚ F E + letI : NumberField F := + rationalNormQuotientNumberFieldOfFiniteDimensional F + letI : NumberField E := + rationalNormQuotientNumberFieldOfFiniteDimensional E + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L hLK hnormal + letI : CommGroup (IdeleClassGroup F) := + rationalNormQuotientIdeleClassCommGroup F + change + AddCommGroup + (Additive + (IdeleClassGroup F ⧸ (_root_.ideleClassNorm F E).range)) + infer_instance + +private def quotientAddEquivOfEquivMapEq + {A B : Type*} [AddCommGroup A] [AddCommGroup B] + (S : AddSubgroup A) (T : AddSubgroup B) + (e : B ≃+ A) + (hmap : S.map e.symm.toAddMonoidHom = T) : + (A ⧸ S) ≃+ (B ⧸ T) := by + have hforward : + S ≤ AddSubgroup.comap e.symm.toAddMonoidHom T := by + intro x hx + change e.symm x ∈ T + rw [← hmap] + exact ⟨x, hx, rfl⟩ + have hinverse : + T ≤ AddSubgroup.comap e.toAddMonoidHom S := by + intro y hy + change e y ∈ S + have hy' : y ∈ S.map e.symm.toAddMonoidHom := by + rw [hmap] + exact hy + rcases hy' with ⟨x, hx, hxy⟩ + have heq : e y = x := by + apply e.symm.injective + simpa using hxy.symm + rw [heq] + exact hx + let f : (A ⧸ S) →+ (B ⧸ T) := + QuotientAddGroup.map S T e.symm.toAddMonoidHom hforward + let g : (B ⧸ T) →+ (A ⧸ S) := + QuotientAddGroup.map T S e.toAddMonoidHom hinverse + exact + { toFun := f + invFun := g + left_inv := by + intro q + refine QuotientAddGroup.induction_on q ?_ + intro x + change (↑(e (e.symm x)) : A ⧸ S) = ↑x + rw [e.apply_symm_apply] + right_inv := by + intro q + refine QuotientAddGroup.induction_on q ?_ + intro x + change (↑(e.symm (e x)) : B ⧸ T) = ↑x + rw [e.symm_apply_apply] + map_add' := f.map_add } + +private theorem quotientAddEquivOfEquivMapEq_mk + {A B : Type*} [AddCommGroup A] [AddCommGroup B] + (S : AddSubgroup A) (T : AddSubgroup B) + (e : B ≃+ A) + (hmap : S.map e.symm.toAddMonoidHom = T) + (x : A) : + quotientAddEquivOfEquivMapEq S T e hmap + (QuotientAddGroup.mk' S x) = + QuotientAddGroup.mk' T (e.symm x) := by + have hforward : + S ≤ AddSubgroup.comap e.symm.toAddMonoidHom T := by + intro y hy + change e.symm y ∈ T + rw [← hmap] + exact ⟨y, hy, rfl⟩ + change + QuotientAddGroup.map S T e.symm.toAddMonoidHom hforward + (QuotientAddGroup.mk' S x) = + QuotientAddGroup.mk' T (e.symm x) + rw [QuotientAddGroup.map_mk'] + rfl + +private noncomputable def additiveQuotientEquiv + {G : Type*} [CommGroup G] (H : Subgroup G) : + (Additive G ⧸ H.toAddSubgroup) ≃+ + Additive (G ⧸ H) := by + let normAdd : Additive G →+ Additive (G ⧸ H) := + MonoidHom.toAdditive (QuotientGroup.mk' H) + let T := normAdd.ker + have hT : H.toAddSubgroup = T := by + ext g + change + Additive.toMul g ∈ H ↔ + QuotientGroup.mk' H (Additive.toMul g) = 1 + exact (QuotientGroup.eq_one_iff (Additive.toMul g)).symm + have hmap : + H.toAddSubgroup.map + (AddEquiv.refl (Additive G)).symm.toAddMonoidHom = T := by + change + H.toAddSubgroup.map (AddMonoidHom.id (Additive G)) = T + rw [AddSubgroup.map_id] + exact hT + let modelEquiv : + (Additive G ⧸ H.toAddSubgroup) ≃+ + (Additive G ⧸ T) := + quotientAddEquivOfEquivMapEq + H.toAddSubgroup T (AddEquiv.refl (Additive G)) hmap + have hsurjective : Function.Surjective normAdd := by + intro q + obtain ⟨g, hg⟩ := + QuotientGroup.mk'_surjective H (Additive.toMul q) + refine ⟨Additive.ofMul g, ?_⟩ + apply Additive.toMul.injective + change QuotientGroup.mk' H g = Additive.toMul q + exact hg + exact modelEquiv.trans + (QuotientAddGroup.quotientKerEquivOfSurjective + normAdd hsurjective) + +private noncomputable def quotientAddEquivOfEquivMapEqToQuotient + {A G : Type*} [AddCommGroup A] [CommGroup G] + (S : AddSubgroup A) (N : Subgroup G) [N.Normal] + (e : Additive G ≃+ A) + (hmap : S.map e.symm.toAddMonoidHom = N.toAddSubgroup) : + (A ⧸ S) ≃+ Additive (G ⧸ N) := + (quotientAddEquivOfEquivMapEq S N.toAddSubgroup e hmap).trans + (additiveQuotientEquiv N) + +private noncomputable def addEquivTransQuotientOfEquivMapEq + {Q A G : Type*} + [AddCommGroup Q] [AddCommGroup A] [CommGroup G] + (S : AddSubgroup A) (N : Subgroup G) [N.Normal] + (eConcrete : Q ≃+ (A ⧸ S)) (e : Additive G ≃+ A) + (hmap : S.map e.symm.toAddMonoidHom = N.toAddSubgroup) : + Q ≃+ Additive (G ⧸ N) := + eConcrete.trans + (quotientAddEquivOfEquivMapEqToQuotient S N e hmap) + +private theorem map_addRange_eq_monoidRange_toAddSubgroup_of_equiv + {U A G H : Type*} + [AddCommGroup U] [AddCommGroup A] [CommGroup G] [CommGroup H] + (f : U →+ A) (g : G →* H) + (eU : Additive G ≃+ U) (eA : Additive H ≃+ A) + (hcompat : ∀ c : Additive G, + eA.symm (f (eU c)) = + Additive.ofMul (g (Additive.toMul c))) : + f.range.map eA.symm.toAddMonoidHom = g.range.toAddSubgroup := by + ext y + constructor + · intro hy + obtain ⟨n, ⟨u, hu⟩, hny⟩ := hy + let c : Additive G := eU.symm u + refine ⟨Additive.toMul c, ?_⟩ + apply Additive.ofMul.injective + exact + (hcompat c).symm.trans + ((congrArg (fun z => eA.symm (f z)) + (eU.apply_symm_apply u)).trans + ((congrArg eA.symm hu).trans hny)) + · intro hy + obtain ⟨d, hd⟩ := hy + let c : Additive G := Additive.ofMul d + let u : U := eU c + exact + ⟨f u, ⟨u, rfl⟩, + (hcompat c).trans (congrArg Additive.ofMul hd)⟩ + +/-- The ordinary idele class group of the upper fixed field, identified +directly with the corresponding fixed part of the rational absolute +idele-class representation. Unlike +`rationalAbstractExtensionIdeleClassEquiv`, this comparison does not +package a Galois action and therefore does not require normality. -/ +noncomputable def + rationalAbstractRelativeFixedFieldIdeleClassEquivFixed + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + rationalRelativeFixedFieldIdeleClassAdditiveType + (hKfinite := hKfinite) (hfinite := hfinite) + K L hLK ≃+ + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation L := by + let F := + abstractFixedField ℚ (SeparableClosure ℚ) K + let E := + abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + letI : NumberField E := + NumberField.of_module_finite ℚ E + change Additive (IdeleClassGroup E) ≃+ + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation L + exact + rationalAbstractRelativeFixedFieldIdeleClassEquivFixedOfFiniteDimensional + K L hLK + +private noncomputable def rationalRelativeFixedFieldNormComparison + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (c : rationalRelativeFixedFieldIdeleClassAdditiveType + (hKfinite := hKfinite) (hfinite := hfinite) + K L hLK) : + (KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K) × + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K := + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI := hnormal + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := FiniteDimensional.trans ℚ F E + letI : NumberField F := + rationalNormQuotientNumberFieldOfFiniteDimensional F + letI : NumberField E := + rationalNormQuotientNumberFieldOfFiniteDimensional E + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L hLK hnormal + (relativeNorm rationalIdeleClassRepresentation K L hLK + (rationalAbstractRelativeFixedFieldIdeleClassEquivFixed K L hLK c), + rationalAbstractFixedFieldIdeleClassEquivFixed K + (Additive.ofMul + (_root_.ideleClassNorm F E (Additive.toMul c)))) + +private noncomputable def rationalRelativeFixedFieldNormPreimageComparison + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (c : rationalRelativeFixedFieldIdeleClassAdditiveType + (hKfinite := hKfinite) (hfinite := hfinite) + K L hLK) := + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI := hnormal + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + letI : NumberField F := NumberField.of_module_finite ℚ F + letI : NumberField E := NumberField.of_module_finite ℚ E + let dQ : RelativeIdeleGroup.ClassGroup ℚ E := + (_root_.relativeIdeleClassBaseChangeMulEquiv (K := ℚ) (L := E)).symm + (Additive.toMul c) + let dF : RelativeIdeleGroup.ClassGroup F E := towerRelativeIdeleClassBaseChangeMulEquiv ℚ F E + ((TowerRelativeIdeleGroup.classGroupEquiv ℚ F E).symm dQ) + (rationalAbstractExtensionIdeleClassEquiv K L hLK hnormal + ((extensionFixedRepresentationEquiv + rationalIdeleClassRepresentation K L hLK hnormal).symm + (rationalAbstractRelativeFixedFieldIdeleClassEquivFixed + K L hLK c)), + Additive.ofMul dF) + +private theorem rationalRelativeFixedFieldNormPreimageComparison_eq + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (c : rationalRelativeFixedFieldIdeleClassAdditiveType + (hKfinite := hKfinite) (hfinite := hfinite) + K L hLK) : + (rationalRelativeFixedFieldNormPreimageComparison K L hLK hnormal c).1 = + (rationalRelativeFixedFieldNormPreimageComparison K L hLK hnormal c).2 := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + let _ := hnormal + let _ : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional ℚ (SeparableClosure ℚ) K hKfinite + let _ : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + let _ : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + let _ : FiniteDimensional ℚ E := FiniteDimensional.trans ℚ F E + let _ : NumberField F := NumberField.of_module_finite ℚ F + let _ : NumberField E := NumberField.of_module_finite ℚ E + let eUpper := rationalAbstractRelativeFixedFieldIdeleClassEquivFixed K L hLK + let dQ : RelativeIdeleGroup.ClassGroup ℚ E := + (_root_.relativeIdeleClassBaseChangeMulEquiv (K := ℚ) (L := E)).symm + (Additive.toMul c) + let dF : RelativeIdeleGroup.ClassGroup F E := + towerRelativeIdeleClassBaseChangeMulEquiv ℚ F E + ((TowerRelativeIdeleGroup.classGroupEquiv ℚ F E).symm dQ) + let eAmbient := extensionFixedRepresentationEquiv + rationalIdeleClassRepresentation K L hLK hnormal + let eFixed : Additive (IdeleClassGroup E) ≃+ + KummerTheory.ambientFixedAddSubgroup rationalIdeleClassRepresentation L := + rationalAbstractRelativeFixedFieldIdeleClassEquivFixedOfFiniteDimensional K L hLK + let eRelative : + Additive (RelativeIdeleGroup.ClassGroup ℚ E) ≃+ + Additive (IdeleClassGroup E) := + MulEquiv.toAdditive + (_root_.relativeIdeleClassBaseChangeMulEquiv (K := ℚ) (L := E)) + let eTower : + Additive (RelativeIdeleGroup.ClassGroup ℚ E) ≃+ + Additive (RelativeIdeleGroup.ClassGroup F E) := + MulEquiv.toAdditive ((TowerRelativeIdeleGroup.classGroupEquiv ℚ F E).symm.trans + (towerRelativeIdeleClassBaseChangeMulEquiv ℚ F E)) + change + (((eAmbient.trans eFixed.symm).trans eRelative.symm).trans eTower) + (eAmbient.symm (eUpper c)) = + Additive.ofMul dF + apply addEquiv_trans_symm_trans_symm_trans_apply_eq + eAmbient eFixed eRelative eTower + (z := Additive.ofMul dQ) + · have hAmbient := eAmbient.apply_symm_apply (eUpper c) + have heUpper : eUpper c = eFixed c := rfl + have heRelative : eRelative (Additive.ofMul dQ) = c := by + apply Additive.toMul.injective + change + _root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E) dQ = + Additive.toMul c + exact + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := E)).apply_symm_apply _ + exact hAmbient.trans (heUpper.trans (congrArg eFixed heRelative).symm) + · rfl + +private noncomputable def rationalRelativeFixedFieldNormCohomologyComparison + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (c : rationalRelativeFixedFieldIdeleClassAdditiveType + (hKfinite := hKfinite) (hfinite := hfinite) + K L hLK) := + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI := hnormal + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := FiniteDimensional.trans ℚ F E + letI : NumberField F := NumberField.of_module_finite ℚ F + letI : NumberField E := NumberField.of_module_finite ℚ E + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L hLK hnormal + let eUpper := + rationalAbstractRelativeFixedFieldIdeleClassEquivFixed K L hLK + let comparison := + rationalRelativeFixedFieldNormPreimageComparison + K L hLK hnormal c + ((rationalAbstractFixedFieldIdeleClassEquivFixed K).symm + (relativeNorm rationalIdeleClassRepresentation + K L hLK (eUpper c)), + Additive.ofMul + (RelativeIdeleGroup.Cohomology.ideleClassNorm F E + (Additive.toMul comparison.2))) + +private theorem rationalRelativeFixedFieldNormCohomologyComparison_eq + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (c : rationalRelativeFixedFieldIdeleClassAdditiveType + (hKfinite := hKfinite) (hfinite := hfinite) + K L hLK) : + (rationalRelativeFixedFieldNormCohomologyComparison + K L hLK hnormal c).1 = + (rationalRelativeFixedFieldNormCohomologyComparison + K L hLK hnormal c).2 := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + let _ := hnormal + let _ : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + let _ : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + let _ : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + let _ : FiniteDimensional ℚ E := FiniteDimensional.trans ℚ F E + let _ : NumberField F := NumberField.of_module_finite ℚ F + let _ : NumberField E := NumberField.of_module_finite ℚ E + let _ : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L hLK hnormal + let eUpper := + rationalAbstractRelativeFixedFieldIdeleClassEquivFixed K L hLK + let comparison := + rationalRelativeFixedFieldNormPreimageComparison + K L hLK hnormal c + change + (rationalAbstractFixedFieldIdeleClassEquivFixed K).symm + (relativeNorm rationalIdeleClassRepresentation + K L hLK (eUpper c)) = + Additive.ofMul + (RelativeIdeleGroup.Cohomology.ideleClassNorm F E + (Additive.toMul comparison.2)) + have htransport : comparison.1 = comparison.2 := + rationalRelativeFixedFieldNormPreimageComparison_eq + K L hLK hnormal c + have hnorm := + rationalAbstractFixedFieldIdeleClassEquivFixed_relativeNorm + K L hLK hnormal (eUpper c) + change + (rationalAbstractFixedFieldIdeleClassEquivFixed K).symm + (relativeNorm rationalIdeleClassRepresentation + K L hLK (eUpper c)) = + Additive.ofMul + (RelativeIdeleGroup.Cohomology.ideleClassNorm F E + (Additive.toMul comparison.1)) + at hnorm + rw [htransport] at hnorm + exact hnorm + +/-- For a finite Galois pair of abstract fixed fields, the direct upper +fixed-part comparison intertwines the class-formation relative norm with +the ordinary idele-class norm. -/ +theorem + rationalAbstractRelativeFixedFieldIdeleClassEquivFixed_relativeNorm + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (c : rationalRelativeFixedFieldIdeleClassAdditiveType + (hKfinite := hKfinite) (hfinite := hfinite) + K L hLK) : + let comparison := rationalRelativeFixedFieldNormComparison + (hKfinite := hKfinite) (hfinite := hfinite) K L hLK hnormal c + comparison.1 = comparison.2 := by + let _ := hnormal + let F := + abstractFixedField ℚ (SeparableClosure ℚ) K + let E := + abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + let _ : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + let _ : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + let _ : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + let _ : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + let _ : NumberField F := + NumberField.of_module_finite ℚ F + let _ : NumberField E := + NumberField.of_module_finite ℚ E + let _ : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L hLK hnormal + change + relativeNorm rationalIdeleClassRepresentation K L hLK + (rationalAbstractRelativeFixedFieldIdeleClassEquivFixed + K L hLK c) = + rationalAbstractFixedFieldIdeleClassEquivFixed K + (Additive.ofMul + (_root_.ideleClassNorm F E (Additive.toMul c))) + let eUpper := + rationalAbstractRelativeFixedFieldIdeleClassEquivFixed + K L hLK + let comparison := + rationalRelativeFixedFieldNormPreimageComparison + K L hLK hnormal c + let dF : RelativeIdeleGroup.ClassGroup F E := + Additive.toMul comparison.2 + have hcohom := + rationalRelativeFixedFieldNormCohomologyComparison_eq + K L hLK hnormal c + change + (rationalAbstractFixedFieldIdeleClassEquivFixed K).symm + (relativeNorm rationalIdeleClassRepresentation + K L hLK (eUpper c)) = + Additive.ofMul + (RelativeIdeleGroup.Cohomology.ideleClassNorm F E + dF) + at hcohom + have hbridge := rationalTowerRelativeClass_norm F E c + change + RelativeIdeleGroup.Cohomology.ideleClassNorm F E dF = + _root_.ideleClassNorm F E (Additive.toMul c) at hbridge + calc + relativeNorm rationalIdeleClassRepresentation K L hLK (eUpper c) = + rationalAbstractFixedFieldIdeleClassEquivFixed K + ((rationalAbstractFixedFieldIdeleClassEquivFixed K).symm + (relativeNorm rationalIdeleClassRepresentation + K L hLK (eUpper c))) := + ((rationalAbstractFixedFieldIdeleClassEquivFixed K).apply_symm_apply _).symm + _ = rationalAbstractFixedFieldIdeleClassEquivFixed K + (Additive.ofMul + (_root_.ideleClassNorm F E (Additive.toMul c))) := + congrArg (rationalAbstractFixedFieldIdeleClassEquivFixed K) + (hcohom.trans (congrArg Additive.ofMul hbridge)) + +/-- The fixed-field comparison carries the abstract finite norm subgroup +exactly to the ordinary idele-class norm range of the actual fixed fields. -/ +theorem + map_rationalFiniteNormSubgroup_eq_ordinaryIdeleClassNormRange_concrete + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI := hnormal + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + letI : NumberField F := NumberField.of_module_finite ℚ F + letI : NumberField E := NumberField.of_module_finite ℚ E + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L hLK hnormal + (finiteNormSubgroup rationalIdeleClassRepresentation K L hLK).map + (rationalAbstractFixedFieldIdeleClassEquivFixed + K).symm.toAddMonoidHom = + (_root_.ideleClassNorm F E).range.toAddSubgroup := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + let _ := hnormal + let _ : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + let _ : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + let _ : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + let _ : FiniteDimensional ℚ E := FiniteDimensional.trans ℚ F E + let _ : NumberField F := NumberField.of_module_finite ℚ F + let _ : NumberField E := NumberField.of_module_finite ℚ E + let _ : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L hLK hnormal + let _ : CommGroup (IdeleClassGroup F) := + rationalNormQuotientIdeleClassCommGroup F + let _ : CommGroup (IdeleClassGroup E) := + rationalNormQuotientIdeleClassCommGroup E + let eK : Additive (IdeleClassGroup F) ≃+ + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K := + rationalAbstractFixedFieldIdeleClassEquivFixed + (hfinite := hKfinite) K + let eUpper : Additive (IdeleClassGroup E) ≃+ + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation L := + rationalAbstractRelativeFixedFieldIdeleClassEquivFixed + (hKfinite := hKfinite) (hfinite := hfinite) K L hLK + let f := relativeNorm rationalIdeleClassRepresentation K L hLK + let g : IdeleClassGroup E →* IdeleClassGroup F := + _root_.ideleClassNorm F E + change f.range.map eK.symm.toAddMonoidHom = g.range.toAddSubgroup + refine map_addRange_eq_monoidRange_toAddSubgroup_of_equiv + (U := KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation L) + (A := KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K) + (G := IdeleClassGroup E) (H := IdeleClassGroup F) + (f := f) (g := g) (eU := eUpper) (eA := eK) ?_ + intro c + have hcompat := rationalAbstractRelativeFixedFieldIdeleClassEquivFixed_relativeNorm + (hKfinite := hKfinite) (hfinite := hfinite) K L hLK hnormal c + apply eK.injective + exact Eq.trans (eK.apply_symm_apply (f (eUpper c))) hcompat + +private noncomputable def rationalFiniteNormQuotientConcreteStep + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + FiniteNormQuotient rationalIdeleClassRepresentation K L hLK ≃+ + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K ⧸ + finiteNormSubgroup rationalIdeleClassRepresentation K L hLK := + finiteNormQuotientConcreteEquiv + rationalIdeleClassRepresentation K L hLK + +/-- The finite norm quotient in the rational absolute representation is +the ordinary idele-class quotient by the actual norm subgroup of the +fixed-field extension. -/ +noncomputable def + rationalFiniteNormQuotientEquivIdeleClassNormQuotient + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] : + FiniteNormQuotient rationalIdeleClassRepresentation K L hLK ≃+ + rationalOrdinaryNormQuotientAdditiveType K L hLK hnormal := by + letI : (extensionSubgroup K L hLK).Normal := hnormal + letI : FiniteDimensional ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) K) := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional + (abstractFixedField ℚ (SeparableClosure ℚ) K) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK) := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + letI : IsScalarTower ℚ + (abstractFixedField ℚ (SeparableClosure ℚ) K) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK) := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : NumberField (abstractFixedField ℚ (SeparableClosure ℚ) K) := + rationalNormQuotientAbstractFixedFieldNumberField + (hKfinite := hKfinite) K + letI : NumberField (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK) := + rationalNormQuotientAbstractRelativeFixedFieldNumberField + (hKfinite := hKfinite) (hfinite := hfinite) K L hLK + letI : IsGalois + (abstractFixedField ℚ (SeparableClosure ℚ) K) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK) := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L hLK hnormal + letI : CommGroup (IdeleClassGroup (abstractFixedField ℚ (SeparableClosure ℚ) K)) := + rationalNormQuotientIdeleClassCommGroup + (abstractFixedField ℚ (SeparableClosure ℚ) K) + letI : (_root_.ideleClassNorm + (abstractFixedField ℚ (SeparableClosure ℚ) K) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK)).range.Normal := + rationalNormQuotientIdeleClassSubgroupNormal + (F := abstractFixedField ℚ (SeparableClosure ℚ) K) + (_root_.ideleClassNorm + (abstractFixedField ℚ (SeparableClosure ℚ) K) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK)).range + change FiniteNormQuotient rationalIdeleClassRepresentation K L hLK ≃+ + Additive (IdeleClassGroup (abstractFixedField ℚ (SeparableClosure ℚ) K) ⧸ + (_root_.ideleClassNorm + (abstractFixedField ℚ (SeparableClosure ℚ) K) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK)).range) + exact addEquivTransQuotientOfEquivMapEq + (Q := FiniteNormQuotient + rationalIdeleClassRepresentation K L hLK) + (A := KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K) + (G := IdeleClassGroup (abstractFixedField ℚ (SeparableClosure ℚ) K)) + (S := finiteNormSubgroup rationalIdeleClassRepresentation K L hLK) + (N := (_root_.ideleClassNorm + (abstractFixedField ℚ (SeparableClosure ℚ) K) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK)).range) + (eConcrete := rationalFiniteNormQuotientConcreteStep + (hfinite := hfinite) K L hLK) + (e := rationalAbstractFixedFieldIdeleClassEquivFixed + (hfinite := hKfinite) K) + (hmap := map_rationalFiniteNormSubgroup_eq_ordinaryIdeleClassNormRange_concrete + (hKfinite := hKfinite) (hfinite := hfinite) K L hLK hnormal) + +private noncomputable def rationalFiniteNormQuotientClassValue + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K) : + rationalOrdinaryNormQuotientAdditiveType + (hKfinite := hKfinite) (hfinite := hfinite) + K L hLK hnormal := + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + letI := hnormal + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + letI : NumberField F := NumberField.of_module_finite ℚ F + letI : NumberField E := NumberField.of_module_finite ℚ E + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L hLK hnormal + Additive.ofMul + (QuotientGroup.mk' (_root_.ideleClassNorm F E).range + (Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed K).symm a))) + +/-- The fixed-field norm-quotient comparison sends an abstract finite +norm class to the ordinary idele class of the transported +representative. -/ +@[simp] +theorem + rationalFiniteNormQuotientEquivIdeleClassNormQuotient_finiteNormClass + (K L : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (a : KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K) : + rationalFiniteNormQuotientEquivIdeleClassNormQuotient + K L hLK hnormal + (finiteNormClass rationalIdeleClassRepresentation + K L hLK a) = + rationalFiniteNormQuotientClassValue + (hKfinite := hKfinite) (hfinite := hfinite) + K L hLK hnormal a := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK + let _ := hnormal + let _ : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + let _ : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L hLK hKfinite hfinite + let _ : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + let _ : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + let _ : NumberField F := NumberField.of_module_finite ℚ F + let _ : NumberField E := NumberField.of_module_finite ℚ E + let _ : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L hLK hnormal + change + rationalFiniteNormQuotientEquivIdeleClassNormQuotient + K L hLK hnormal + (finiteNormClass rationalIdeleClassRepresentation + K L hLK a) = + Additive.ofMul + (QuotientGroup.mk' + (_root_.ideleClassNorm F E).range + (Additive.toMul + ((rationalAbstractFixedFieldIdeleClassEquivFixed K).symm + a))) + simp only [ + rationalFiniteNormQuotientEquivIdeleClassNormQuotient, + rationalFiniteNormQuotientConcreteStep, + addEquivTransQuotientOfEquivMapEq, + quotientAddEquivOfEquivMapEqToQuotient] + rfl + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassNormTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassNormTopology.lean new file mode 100644 index 0000000000..841012a0b1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassNormTopology.lean @@ -0,0 +1,282 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +/-! +# The norm topology and the ordinary idele-class topology + +On every actual fixed field inside the rational separable closure, the +canonical fixed-part model identifies each abstract finite norm subgroup +with the range of the corresponding ordinary idele-class norm. Since the +latter is open, every abstract norm-open subgroup becomes open in the +ordinary idele-class topology after transport to the actual fixed field. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open LocalClassFieldTheory + +/-- Use the canonical quotient group structure before elaborating additive +norm-subgroup maps. -/ +@[instance_reducible] +private noncomputable def normTopologyIdeleClassCommGroup + (F : Type) [Field F] [NumberField F] : + CommGroup (IdeleClassGroup F) := + QuotientGroup.Quotient.commGroup (IdeleGroup.principalSubgroup F) + +attribute [local instance] normTopologyIdeleClassCommGroup + +/-- The transport of an abstract fixed-part subgroup to the ordinary +idele-class group of the corresponding rational fixed field. -/ +noncomputable def rationalTransportedNormSubgroup + (K : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + (H : AddSubgroup + (KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K)) : + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : NumberField F := NumberField.of_module_finite ℚ F + AddSubgroup (Additive (IdeleClassGroup F)) := by + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : NumberField F := NumberField.of_module_finite ℚ F + exact + H.map + (rationalAbstractFixedFieldIdeleClassEquivFixed + K).symm.toAddMonoidHom + +private theorem rationalNormOpenSubgroup_exists_finiteNormSubgroup + (K : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (H : AddSubgroup + (KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K)) + (hH : IsNormOpen rationalIdeleClassRepresentation K + (H : Set + (KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K))) : + ∃ L : FiniteGaloisSubextension K, + FiniteGaloisSubextension.normSubgroup + rationalIdeleClassRepresentation L ≤ H := by + exact + (normTopology_addSubgroup_isOpen_iff + rationalIdeleClassRepresentation K H).1 hH + +private theorem isOpen_addSubgroup_of_eq + {A : Type*} [AddGroup A] [TopologicalSpace A] + (H H' : AddSubgroup A) (h : H = H') + (hopen : IsOpen (H' : Set A)) : + IsOpen (H : Set A) := by + exact h.symm ▸ hopen + +private theorem + rationalFiniteNormSubgroup_map_eq_ordinaryIdeleClassNormRange + (K : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + (L : FiniteGaloisSubextension K) : + letI : Finite + (K.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup K L.field L.below) := + L.finite + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := + abstractRelativeFixedField ℚ (SeparableClosure ℚ) L.below + letI : + (CyclicCohomology.extensionSubgroup + K L.field L.below).Normal := + L.normal + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L.field L.below hKfinite L.finite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + letI : NumberField F := NumberField.of_module_finite ℚ F + letI : NumberField E := NumberField.of_module_finite ℚ E + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L.field L.below L.normal + (finiteNormSubgroup rationalIdeleClassRepresentation + K L.field L.below).map + (rationalAbstractFixedFieldIdeleClassEquivFixed + K).symm.toAddMonoidHom = + (_root_.ideleClassNorm F E).range.toAddSubgroup := by + exact + map_rationalFiniteNormSubgroup_eq_ordinaryIdeleClassNormRange_concrete + (hKfinite := hKfinite) (hfinite := L.finite) + K L.field L.below L.normal + +private theorem rationalOrdinaryIdeleClassNormRange_isOpen + (K : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + (L : FiniteGaloisSubextension K) : + letI : Finite + (K.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup K L.field L.below) := + L.finite + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + let E := + abstractRelativeFixedField ℚ (SeparableClosure ℚ) L.below + letI : + (CyclicCohomology.extensionSubgroup + K L.field L.below).Normal := + L.normal + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L.field L.below hKfinite L.finite + letI : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + letI : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + letI : NumberField F := NumberField.of_module_finite ℚ F + letI : NumberField E := NumberField.of_module_finite ℚ E + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L.field L.below L.normal + IsOpen + (((_root_.ideleClassNorm F E).range.toAddSubgroup : + AddSubgroup (Additive (IdeleClassGroup F))) : + Set (Additive (IdeleClassGroup F))) := by + intro F E + let : NumberField F := by + let : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + exact NumberField.of_module_finite ℚ F + let : NumberField E := by + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K L.field L.below hKfinite L.finite + exact NumberField.of_module_finite F E + let : IsGalois F E := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) K L.field L.below L.normal + exact + GlobalClassFields.ideleClassNorm_range_isOpen + (K := F) (L := E) + +/-- Transporting a norm-open subgroup of the rational absolute +idele-class representation to the idele class group of its actual fixed +field produces an open subgroup for the ordinary idele-class topology. -/ +theorem rationalNormOpenSubgroup_isOpen + (K : ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + [hKfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + CyclicCohomology.extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + K (le_baseField K))] + (H : AddSubgroup + (KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K)) + (hH : IsNormOpen rationalIdeleClassRepresentation K + (H : Set + (KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K))) : + let F := abstractFixedField ℚ (SeparableClosure ℚ) K + letI : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + letI : NumberField F := NumberField.of_module_finite ℚ F + IsOpen + ((rationalTransportedNormSubgroup + (hKfinite := hKfinite) K H : + AddSubgroup (Additive (IdeleClassGroup F))) : + Set (Additive (IdeleClassGroup F))) := by + intro F + let : NumberField F := by + let : FiniteDimensional ℚ F := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K hKfinite + exact NumberField.of_module_finite ℚ F + let eK : + Additive (IdeleClassGroup F) ≃+ + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K := + rationalAbstractFixedFieldIdeleClassEquivFixed K + rcases + rationalNormOpenSubgroup_exists_finiteNormSubgroup K H hH with + ⟨L, hLH⟩ + let : Finite + (K.toSubgroup ⧸ + CyclicCohomology.extensionSubgroup K L.field L.below) := + L.finite + let : + (CyclicCohomology.extensionSubgroup + K L.field L.below).Normal := + L.normal + change + IsOpen + ((H.map eK.symm.toAddMonoidHom : + AddSubgroup (Additive (IdeleClassGroup F))) : + Set (Additive (IdeleClassGroup F))) + apply AddSubgroup.isOpen_mono (AddSubgroup.map_mono hLH) + have hnormMap := + rationalFiniteNormSubgroup_map_eq_ordinaryIdeleClassNormRange + (hKfinite := hKfinite) K L + have hopen := + rationalOrdinaryIdeleClassNormRange_isOpen + (hKfinite := hKfinite) K L + change + IsOpen + (((finiteNormSubgroup rationalIdeleClassRepresentation + K L.field L.below).map + eK.symm.toAddMonoidHom : + AddSubgroup (Additive (IdeleClassGroup F))) : + Set (Additive (IdeleClassGroup F))) + exact + isOpen_addSubgroup_of_eq _ _ hnormMap hopen + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean new file mode 100644 index 0000000000..882883d910 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean @@ -0,0 +1,1035 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicZHatBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin +public import Mathlib.FieldTheory.Galois.Profinite +/-! +# The infinite global Artin homomorphism + +This file assembles the finite global Artin homomorphisms in the +`FiniteGaloisIntermediateField` inverse limit supplied by mathlib. The +first target is the actual `ZHat`-extension of `ℚ` constructed in +`CyclotomicZHatBaseChange`. + +The positive archimedean section below is the cyclotomic normalization device: +multiplying an idele by the section of its absolute +norm produces a norm-one idele without changing its Artin symbol. +-/ + +@[expose] public section + +open scoped IsMulCommutative NNReal NumberField Topology +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open CategoryTheory Opposite +open FiniteGaloisIntermediateField ProfiniteGrp + +open scoped Classical in +/-- Every infinite place of `ℚ` is the canonical real place. -/ +theorem rationalInfinitePlace_isReal + (v : InfinitePlace ℚ) : + v.IsReal := by + rw [Subsingleton.elim v Rat.infinitePlace] + exact Rat.isReal_infinitePlace + +open scoped Classical in +/-- A positive real unit viewed in an archimedean completion of the rational field. -/ +noncomputable def rationalPositiveArchimedeanLocalComponent + (v : InfinitePlace ℚ) : + ℝ≥0ˣ →* v.Completionˣ := + (Units.mapEquiv + (InfinitePlace.Completion.ringEquivRealOfIsReal + (rationalInfinitePlace_isReal v)).symm.toMulEquiv).toMonoidHom.comp + (Units.map NNReal.toRealHom.toMonoidHom) + +open scoped Classical in +/-- The positive real unit embedded diagonally in the infinite ideles of the rational field. -/ +noncomputable def rationalPositiveArchimedeanInfinitePart : + ℝ≥0ˣ →* InfiniteIdeleGroup ℚ := + ContinuousMulEquiv.piUnits.symm.toMonoidHom.comp + (MonoidHom.pi rationalPositiveArchimedeanLocalComponent) + +open scoped Classical in +private theorem rationalPositiveArchimedeanInfinitePart_component + (r : ℝ≥0ˣ) (v : InfinitePlace ℚ) : + ContinuousMulEquiv.piUnits + (rationalPositiveArchimedeanInfinitePart r) v = + rationalPositiveArchimedeanLocalComponent v r := by + change + ContinuousMulEquiv.piUnits + (ContinuousMulEquiv.piUnits.symm + ((MonoidHom.pi rationalPositiveArchimedeanLocalComponent) r)) v = + rationalPositiveArchimedeanLocalComponent v r + exact congrFun + (ContinuousMulEquiv.piUnits.apply_symm_apply + ((MonoidHom.pi rationalPositiveArchimedeanLocalComponent) r)) v + +open scoped Classical in +/-- The positive archimedean section +`ℝ₊ˣ → I_ℚ`. Its finite component is one, and at the unique infinite +place it is the positive real unit supplied by the input. -/ +noncomputable def rationalPositiveArchimedeanIdele : + ℝ≥0ˣ →* IdeleGroup ℚ := by + exact + { toFun := fun r => + (rationalPositiveArchimedeanInfinitePart r, 1) + map_one' := by simp + map_mul' := by simp } + +open scoped Classical in +/-- The positive archimedean section has trivial finite component at +every finite place of `ℚ`. -/ +theorem rationalPositiveArchimedeanIdele_finiteComponent + (r : ℝ≥0ˣ) + (v : HeightOneSpectrum (𝓞 ℚ)) : + IdeleGroup.finiteComponent v + (rationalPositiveArchimedeanIdele r) = + 1 := + rfl + +open scoped Classical in +/-- At the unique rational infinite place, the positive section becomes +the original positive real unit under mathlib's canonical completion +equivalence. -/ +theorem rationalPositiveArchimedeanIdele_infiniteComponent + (r : ℝ≥0ˣ) : + Units.mapEquiv + (InfinitePlace.Completion.ringEquivRealOfIsReal + Rat.isReal_infinitePlace).toMulEquiv + (IdeleGroup.infiniteComponent Rat.infinitePlace + (rationalPositiveArchimedeanIdele r)) = + Units.map NNReal.toRealHom.toMonoidHom r := by + change + Units.mapEquiv + (InfinitePlace.Completion.ringEquivRealOfIsReal + Rat.isReal_infinitePlace).toMulEquiv + (ContinuousMulEquiv.piUnits + (rationalPositiveArchimedeanInfinitePart r) + Rat.infinitePlace) = + Units.map NNReal.toRealHom.toMonoidHom r + rw [rationalPositiveArchimedeanInfinitePart_component] + let e := + (InfinitePlace.Completion.ringEquivRealOfIsReal + Rat.isReal_infinitePlace).toMulEquiv + change + Units.mapEquiv e + (Units.mapEquiv e.symm + (Units.map NNReal.toRealHom.toMonoidHom r)) = + Units.map NNReal.toRealHom.toMonoidHom r + rw [← Units.mapEquiv_symm] + exact + (Units.mapEquiv e).apply_symm_apply + (Units.map NNReal.toRealHom.toMonoidHom r) + +open scoped Classical in +/-- The positive archimedean section has absolute idele norm `r⁻¹`. +This is the normalization dictated by the convention in +`IdeleGroup.absoluteNorm`. -/ +theorem rationalPositiveArchimedeanIdele_absoluteNorm + (r : ℝ≥0ˣ) : + IdeleGroup.absoluteNorm + (rationalPositiveArchimedeanIdele r) = + r⁻¹ := by + have hcomponent := + congrArg Units.val + (rationalPositiveArchimedeanIdele_infiniteComponent r) + have hcomponent' : + InfinitePlace.Completion.ringEquivRealOfIsReal + Rat.isReal_infinitePlace + ((IdeleGroup.infiniteComponent Rat.infinitePlace + (rationalPositiveArchimedeanIdele r) : + Rat.infinitePlace.Completionˣ) : + Rat.infinitePlace.Completion) = + ((r : ℝ≥0ˣ) : ℝ) := by + simpa using hcomponent + have hlocalNorm : + ‖((IdeleGroup.infiniteComponent Rat.infinitePlace + (rationalPositiveArchimedeanIdele r) : + Rat.infinitePlace.Completionˣ) : + Rat.infinitePlace.Completion)‖₊ = + (r : ℝ≥0) := by + apply NNReal.eq + simp only [coe_nnnorm] + calc + ‖((IdeleGroup.infiniteComponent Rat.infinitePlace + (rationalPositiveArchimedeanIdele r) : + Rat.infinitePlace.Completionˣ) : + Rat.infinitePlace.Completion)‖ = + ‖InfinitePlace.Completion.ringEquivRealOfIsReal + Rat.isReal_infinitePlace + ((IdeleGroup.infiniteComponent Rat.infinitePlace + (rationalPositiveArchimedeanIdele r) : + Rat.infinitePlace.Completionˣ) : + Rat.infinitePlace.Completion)‖ := + ((InfinitePlace.Completion.isometryEquivRealOfIsReal + Rat.isReal_infinitePlace).isometry.norm_map_of_map_zero + (map_zero + (InfinitePlace.Completion.ringEquivRealOfIsReal + Rat.isReal_infinitePlace)) + _).symm + _ = ‖((r : ℝ≥0ˣ) : ℝ)‖ := by + rw [hcomponent'] + _ = ((r : ℝ≥0ˣ) : ℝ) := + Real.norm_of_nonneg (r : ℝ≥0).coe_nonneg + have hinfinite : + InfiniteIdeleGroup.archimedeanNorm + (rationalPositiveArchimedeanIdele r).1 = + r := by + rw [InfiniteIdeleGroup.archimedeanNorm_apply, + Fintype.prod_unique] + rw [show + (default : InfinitePlace ℚ) = Rat.infinitePlace by + exact Subsingleton.elim _ _, + InfinitePlace.mult_isReal + ⟨Rat.infinitePlace, Rat.isReal_infinitePlace⟩, + pow_one] + apply Units.ext + exact hlocalNorm + rw [IdeleGroup.absoluteNorm_apply] + change + FiniteIdeleGroup.absoluteNorm (1 : FiniteIdeleGroup ℚ) * + (InfiniteIdeleGroup.archimedeanNorm + (rationalPositiveArchimedeanIdele r).1)⁻¹ = + r⁻¹ + rw [map_one, hinfinite, one_mul] + +open scoped Classical in +/-- Every finite abelian global Artin homomorphism kills the positive +archimedean section over `ℚ`. -/ +theorem globalArtinMonoidHom_rationalPositiveArchimedeanIdele + {L : Type} + [Field L] [NumberField L] [Algebra ℚ L] + [IsAbelianGalois ℚ L] + (r : ℝ≥0ˣ) : + globalArtinMonoidHom + (K := ℚ) (L := L) + (rationalPositiveArchimedeanIdele r) = + 1 := by + have hcomponent := + congrArg Units.val + (rationalPositiveArchimedeanIdele_infiniteComponent r) + have hpos : + 0 < + InfinitePlace.Completion.ringEquivRealOfIsReal + Rat.isReal_infinitePlace + ((IdeleGroup.infiniteComponent Rat.infinitePlace + (rationalPositiveArchimedeanIdele r) : + Rat.infinitePlace.Completionˣ) : + Rat.infinitePlace.Completion) := by + have hvalue : + InfinitePlace.Completion.ringEquivRealOfIsReal + Rat.isReal_infinitePlace + ((IdeleGroup.infiniteComponent Rat.infinitePlace + (rationalPositiveArchimedeanIdele r) : + Rat.infinitePlace.Completionˣ) : + Rat.infinitePlace.Completion) = + ((r : ℝ≥0ˣ) : ℝ) := by + simpa using hcomponent + rw [hvalue] + exact + NNReal.coe_pos.mpr + (pos_iff_ne_zero.mpr (Units.ne_zero r)) + rw [globalArtinMonoidHom_apply] + have hinfinite : + (∏ v : InfinitePlace ℚ, + chosenInfinitePlaceArtinMonoidHom + (K := ℚ) (L := L) v + (IdeleGroup.infiniteComponent v + (rationalPositiveArchimedeanIdele r))) = + 1 := by + rw [Fintype.prod_unique, + show + (default : InfinitePlace ℚ) = Rat.infinitePlace by + exact Subsingleton.elim _ _] + exact + chosenInfinitePlaceArtinMonoidHom_eq_one_of_real_pos + (K := ℚ) (L := L) + Rat.infinitePlace Rat.isReal_infinitePlace _ hpos + have hfinite : + (∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + chosenFinitePlaceArtinMonoidHom + (K := ℚ) (L := L) v + (IdeleGroup.finiteComponent v + (rationalPositiveArchimedeanIdele r))) = + 1 := by + apply finprod_eq_one_of_forall_eq_one + intro v + rw [rationalPositiveArchimedeanIdele_finiteComponent, + map_one] + rw [hinfinite, hfinite, mul_one] + +/-! +## Assembly in the finite-Galois inverse limit + +The following construction is the global analogue of LCFT's +`residueFrobeniusToLimit`: its coordinates are the actual finite global +Artin homomorphisms, and compatibility is restriction in a finite +abelian tower. +-/ + +open scoped Classical in +/-- The compatible family of finite global Artin symbols attached to +an idele, regarded as a point of the finite-Galois inverse limit. -/ +noncomputable def infiniteGlobalArtinLimitPoint + (K Ω : Type) [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] + (a : IdeleGroup K) : + limit + (InfiniteGalois.asProfiniteGaloisGroupFunctor + K Ω) := by + letI (E : + FiniteGaloisIntermediateField + K Ω) : + NumberField E := + NumberField.of_module_finite K E + exact + { val := fun E => + globalArtinMonoidHom + (K := K) (L := E.unop) a + property := by + intro E F f + algebraize [Subsemiring.inclusion <| leOfHom f.1] + have : IsScalarTower K F.unop E.unop := + IsScalarTower.of_algebraMap_eq (congrFun rfl) + change + AlgEquiv.restrictNormalHom F.unop + (globalArtinMonoidHom + (K := K) (L := E.unop) a) = + globalArtinMonoidHom + (K := K) (L := F.unop) a + exact + DFunLike.congr_fun + (globalArtinMonoidHom_restrict_tower + (K := K) (E := F.unop) (L := E.unop)) a } + +open scoped Classical in +/-- The continuous global Artin homomorphism into the finite-Galois +inverse limit, before transport to the Krull-topological Galois group. -/ +noncomputable def infiniteGlobalArtinToLimit + (K Ω : Type) [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] : + IdeleGroup K →ₜ* + limit + (InfiniteGalois.asProfiniteGaloisGroupFunctor + K Ω) := by + letI + (E : + FiniteGaloisIntermediateField + K Ω) : + NumberField E := + NumberField.of_module_finite K E + exact + { toFun := infiniteGlobalArtinLimitPoint K Ω + map_one' := by + apply Subtype.ext + funext E + exact + (globalArtinMonoidHom + (K := K) (L := E.unop)).map_one + map_mul' := by + intro x y + apply Subtype.ext + funext E + exact + (globalArtinMonoidHom + (K := K) (L := E.unop)).map_mul x y + continuous_toFun := by + have hcontinuous + (E : + (FiniteGaloisIntermediateField + K Ω)ᵒᵖ) : + @Continuous + (IdeleGroup K) (E.unop ≃ₐ[K] E.unop) + inferInstance (krullTopology K E.unop) + (globalArtinMonoidHom + (K := K) (L := E.unop)) := + globalArtinMonoidHom_continuous + (K := K) (L := E.unop) + let + (E : + (FiniteGaloisIntermediateField + K Ω)ᵒᵖ) : + TopologicalSpace (E.unop ≃ₐ[K] E.unop) := + ((InfiniteGalois.asProfiniteGaloisGroupFunctor + K Ω).obj E).toProfinite.toTop.str + apply Continuous.subtype_mk + exact continuous_pi fun E => by + change + @Continuous + (IdeleGroup K) (E.unop ≃ₐ[K] E.unop) + inferInstance inferInstance + (globalArtinMonoidHom + (K := K) (L := E.unop)) + rw [show + (inferInstance : + TopologicalSpace (E.unop ≃ₐ[K] E.unop)) = + krullTopology K E.unop by + change + (⊥ : TopologicalSpace + (E.unop ≃ₐ[K] E.unop)) = + krullTopology K E.unop + exact + (@DiscreteTopology.eq_bot _ + (krullTopology K E.unop) + inferInstance).symm] + exact hcontinuous E } + +open scoped Classical in +/-- The continuous global Artin homomorphism of an arbitrary abelian +Galois extension of a number field. Its finite coordinates are the +finite global Artin homomorphisms. -/ +noncomputable def infiniteGlobalArtinMonoidHom + (K Ω : Type) [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] : + IdeleGroup K →ₜ* (Ω ≃ₐ[K] Ω) := + (ContinuousMonoidHom.toContinuousMonoidHom + (InfiniteGalois.continuousMulEquivToLimit + K Ω).symm).comp + (infiniteGlobalArtinToLimit K Ω) + +open scoped Classical in +/-- Projection of the infinite global Artin homomorphism to a finite +Galois intermediate field is exactly that field's finite global Artin +homomorphism, using a caller-supplied number-field witness. -/ +@[simp] +theorem restrictNormalHom_infiniteGlobalArtinMonoidHom_of_numberField + (K Ω : Type) [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] + (a : IdeleGroup K) + (E : FiniteGaloisIntermediateField K Ω) + (hE : NumberField E) : + letI : NumberField E := hE + AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom K Ω a) = + globalArtinMonoidHom + (K := K) (L := E) a := by + let : NumberField E := hE + have hcomponent := + congrArg + (InfiniteGalois.proj + (k := K) (K := Ω) E) + ((InfiniteGalois.continuousMulEquivToLimit + K Ω).apply_symm_apply + (infiniteGlobalArtinToLimit K Ω a)) + exact hcomponent + +open scoped Classical in +/-- Finite projection with both finite-layer structures supplied explicitly. +This is useful when a concrete tower already has named canonical witnesses +and must not resynthesize them while checking the projected Artin endpoint. -/ +theorem restrictNormalHom_infiniteGlobalArtinMonoidHom_of_structures + (K Ω : Type) [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] + (a : IdeleGroup K) + (E : FiniteGaloisIntermediateField K Ω) + (hE : NumberField E) + (hAbelian : IsAbelianGalois K E) : + letI : NumberField E := hE + letI : IsAbelianGalois K E := hAbelian + AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom K Ω a) = + globalArtinMonoidHom + (K := K) (L := E) a := by + let : NumberField E := hE + let : IsAbelianGalois K E := hAbelian + exact + restrictNormalHom_infiniteGlobalArtinMonoidHom_of_numberField + K Ω a E hE + +open scoped Classical in +/-- Finite projection stated for a plain intermediate field with its finite +Galois structures supplied separately. This avoids packaging a concrete +dependent field into `FiniteGaloisIntermediateField` at every call site. -/ +theorem restrictNormalHom_infiniteGlobalArtinMonoidHom_of_intermediateField + (K Ω : Type) [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] + (a : IdeleGroup K) (E : IntermediateField K Ω) + [FiniteDimensional K E] [IsGalois K E] + (hE : NumberField E) + (hAbelian : IsAbelianGalois K E) : + letI : NumberField E := hE + letI : IsAbelianGalois K E := hAbelian + AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom K Ω a) = + globalArtinMonoidHom (K := K) (L := E) a := by + let G : FiniteGaloisIntermediateField K Ω := + { toIntermediateField := E + finiteDimensional := inferInstance + isGalois := inferInstance } + let : NumberField E := hE + let : IsAbelianGalois K E := hAbelian + exact + restrictNormalHom_infiniteGlobalArtinMonoidHom_of_structures + K Ω a G hE hAbelian + +open scoped Classical in +/-- Finite projection for a plain intermediate field when its structures are +already installed as ambient instances. -/ +theorem restrictNormalHom_infiniteGlobalArtinMonoidHom_intermediateField + (K Ω : Type) [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] + (a : IdeleGroup K) (E : IntermediateField K Ω) + [FiniteDimensional K E] [NumberField E] [IsAbelianGalois K E] : + AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom K Ω a) = + globalArtinMonoidHom (K := K) (L := E) a := by + exact + restrictNormalHom_infiniteGlobalArtinMonoidHom_of_intermediateField + K Ω a E (inferInstance : NumberField E) + (inferInstance : IsAbelianGalois K E) + +open scoped Classical in +/-- Pointwise form of finite projection of the infinite global Artin map. +This is the stable interface when a concrete finite layer carries algebra +instances propositionally, but not definitionally, equal to the canonical +intermediate-field instances. -/ +theorem restrictNormalHom_infiniteGlobalArtinMonoidHom_of_numberField_apply + (K Ω : Type) [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] + (a : IdeleGroup K) + (E : FiniteGaloisIntermediateField K Ω) + (hE : NumberField E) + (x : E) : + letI : NumberField E := hE + AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom K Ω a) x = + globalArtinMonoidHom + (K := K) (L := E) a x := by + let : NumberField E := hE + exact DFunLike.congr_fun + (restrictNormalHom_infiniteGlobalArtinMonoidHom_of_numberField + K Ω a E hE) x + +open scoped Classical in +/-- Postcomposition of a finite projection of the infinite global Artin map. +Keeping `congrArg` at this generic level prevents large concrete towers from +being normalized merely to infer the endpoints of the mapped equality. -/ +theorem map_restrictNormalHom_infiniteGlobalArtinMonoidHom_of_numberField + (K Ω : Type) [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] + (a : IdeleGroup K) + (E : FiniteGaloisIntermediateField K Ω) + (hE : NumberField E) + {M : Type} (f : (E ≃ₐ[K] E) → M) : + letI : NumberField E := hE + f (AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom K Ω a)) = + f (globalArtinMonoidHom + (K := K) (L := E) a) := by + let : NumberField E := hE + exact congrArg f + (restrictNormalHom_infiniteGlobalArtinMonoidHom_of_numberField + K Ω a E hE) + +open scoped Classical in +/-- Postcomposition of a finite projection with both finite-layer structures +supplied explicitly. This avoids resynthesizing proposition-valued instances +when the finite field is a concrete dependent intermediate field. -/ +theorem map_restrictNormalHom_infiniteGlobalArtinMonoidHom_of_structures + (K Ω : Type) [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] + (a : IdeleGroup K) + (E : FiniteGaloisIntermediateField K Ω) + (hE : NumberField E) + (hAbelian : IsAbelianGalois K E) + {M : Type} (f : (E ≃ₐ[K] E) → M) : + letI : NumberField E := hE + letI : IsAbelianGalois K E := hAbelian + f (AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom K Ω a)) = + f (globalArtinMonoidHom + (K := K) (L := E) a) := by + let : NumberField E := hE + let : IsAbelianGalois K E := hAbelian + exact congrArg f + (restrictNormalHom_infiniteGlobalArtinMonoidHom_of_structures + K Ω a E hE hAbelian) + +open scoped Classical in +/-- Postcomposition of the finite projection for a plain intermediate field. +The explicit structures keep concrete cyclotomic levels out of instance +normalization at the consumer. -/ +theorem + map_restrictNormalHom_infiniteGlobalArtinMonoidHom_of_intermediateField + (K Ω : Type) [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] + (a : IdeleGroup K) (E : IntermediateField K Ω) + [FiniteDimensional K E] [IsGalois K E] + (hE : NumberField E) + (hAbelian : IsAbelianGalois K E) + {M : Type} (f : (E ≃ₐ[K] E) → M) : + letI : NumberField E := hE + letI : IsAbelianGalois K E := hAbelian + f (AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom K Ω a)) = + f (globalArtinMonoidHom (K := K) (L := E) a) := by + let : NumberField E := hE + let : IsAbelianGalois K E := hAbelian + exact congrArg f + (restrictNormalHom_infiniteGlobalArtinMonoidHom_of_intermediateField + K Ω a E hE hAbelian) + +open scoped Classical in +/-- The finite global Artin homomorphism with its number-field witness fixed +as an explicit argument. Concrete intermediate-field towers can share this +opaque hom without repeatedly comparing independently synthesized witnesses. -/ +noncomputable def globalArtinMonoidHomOfNumberField + (K L : Type) [Field K] [NumberField K] + [Field L] [Algebra K L] [IsAbelianGalois K L] + (hL : NumberField L) : + IdeleGroup K →* (L ≃ₐ[K] L) := by + letI : NumberField L := hL + exact globalArtinMonoidHom (K := K) (L := L) + +open scoped Classical in +/-- Norm-restriction naturality with the upper finite global Artin homomorphism +expressed through an explicit number-field witness. -/ +theorem globalArtinMonoidHomOfNumberField_norm_restriction + (K L K' L' : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + [Field K'] [NumberField K'] + [Field L'] [Algebra K K'] [Algebra K' L'] [Algebra K L'] + [IsScalarTower K K' L'] + [Algebra L L'] [IsScalarTower K L L'] + [IsAbelianGalois K' L'] + (hL' : NumberField L') : + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)).comp + (globalArtinMonoidHomOfNumberField K' L' hL') = + (globalArtinMonoidHom (K := K) (L := L)).comp + (IdeleGroup.norm K K') := by + let : NumberField L' := hL' + exact globalArtinMonoidHom_norm_restriction + +open scoped Classical in +/-- Monoid-hom postcomposition of a finite projection, stated at the hom +application level. This keeps concrete consumers from unfolding +`MonoidHom.comp` merely to join the projection and finite Artin endpoints. -/ +theorem comp_restrictNormalHom_infiniteGlobalArtinMonoidHom_of_numberField + (K Ω : Type) [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] + (a : IdeleGroup K) + (E : FiniteGaloisIntermediateField K Ω) + (hE : NumberField E) + {M : Type} [Monoid M] + (f : (E ≃ₐ[K] E) →* M) : + letI : NumberField E := hE + f (AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom K Ω a)) = + (f.comp (globalArtinMonoidHomOfNumberField K E hE)) a := by + let : NumberField E := hE + exact + (map_restrictNormalHom_infiniteGlobalArtinMonoidHom_of_numberField + K Ω a E hE f).trans rfl + +open scoped Classical in +/-- The mapped finite projection and its finite Artin specification, with +both endpoints fixed while the ambient field instances are still generic. +Concrete towers can reuse the package without asking the elaborator to +normalize those instances while checking the equality again. -/ +noncomputable def + compRestrictNormalHomInfiniteGlobalArtinDataOfNumberField + (K Ω : Type) [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] + (a : IdeleGroup K) + (E : FiniteGaloisIntermediateField K Ω) + (hE : NumberField E) + {M : Type} [Monoid M] + (f : (E ≃ₐ[K] E) →* M) : + letI : NumberField E := hE + {x : M // + x = (f.comp + (globalArtinMonoidHomOfNumberField K E hE)) a} := by + letI : NumberField E := hE + exact + ⟨f (AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom K Ω a)), + comp_restrictNormalHom_infiniteGlobalArtinMonoidHom_of_numberField + K Ω a E hE f⟩ + +open scoped Classical in +/-- The mapped infinite projection transported through a supplied naturality +square. The intermediate finite Artin hom is the explicit-witness version, +so the equality is composed once in this generic provider rather than by a +concrete dependent field tower. -/ +noncomputable def + compRestrictNormalHomInfiniteGlobalArtinNaturalityDataOfNumberField + (K Ω : Type) [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] + (a : IdeleGroup K) + (E : FiniteGaloisIntermediateField K Ω) + (hE : NumberField E) + {M : Type} [Monoid M] + (f : (E ≃ₐ[K] E) →* M) + (g : IdeleGroup K →* M) + (hnat : + f.comp (globalArtinMonoidHomOfNumberField K E hE) = g) : + letI : NumberField E := hE + {x : M // x = g a} := by + letI : NumberField E := hE + have hprojection := + comp_restrictNormalHom_infiniteGlobalArtinMonoidHom_of_numberField + K Ω a E hE f + exact + ⟨f (AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom K Ω a)), + hprojection.trans (DFunLike.congr_fun hnat a)⟩ + +open scoped Classical in +/-- Postcomposition of a finite projection when the finite layer's number +field structure is already installed as the ambient instance. -/ +theorem map_restrictNormalHom_infiniteGlobalArtinMonoidHom + (K Ω : Type) [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] + (a : IdeleGroup K) + (E : FiniteGaloisIntermediateField K Ω) + [NumberField E] + {M : Type} (f : (E ≃ₐ[K] E) → M) : + f (AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom K Ω a)) = + f (globalArtinMonoidHom + (K := K) (L := E) a) := + congrArg f + (restrictNormalHom_infiniteGlobalArtinMonoidHom_of_numberField + K Ω a E (inferInstance : NumberField E)) + +open scoped Classical in +/-- Projection of the infinite global Artin homomorphism to a finite +Galois intermediate field, with its canonical module-finite number-field +structure. -/ +@[simp] +theorem restrictNormalHom_infiniteGlobalArtinMonoidHom + (K Ω : Type) [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] + (a : IdeleGroup K) + (E : FiniteGaloisIntermediateField K Ω) : + letI : NumberField E := + NumberField.of_module_finite K E + AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom K Ω a) = + globalArtinMonoidHom + (K := K) (L := E) a := by + exact + restrictNormalHom_infiniteGlobalArtinMonoidHom_of_numberField + K Ω a E (NumberField.of_module_finite K E) + +open scoped Classical in +/-- Restriction of the infinite global Artin map along an abstract finite +abelian scalar tower. Unlike the intermediate-field projection theorem, this +form allows the finite extension to be supplied through any chosen embedding +into the ambient infinite extension. -/ +theorem restrictNormalHom_infiniteGlobalArtinMonoidHom_of_scalarTower + (K E Ω : Type) [Field K] [NumberField K] + [Field E] [NumberField E] [Algebra K E] + [IsAbelianGalois K E] + [Field Ω] [Algebra K Ω] [Algebra E Ω] + [IsScalarTower K E Ω] [IsAbelianGalois K Ω] + (a : IdeleGroup K) : + AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom K Ω a) = + globalArtinMonoidHom (K := K) (L := E) a := by + let j : E →ₐ[K] Ω := IsScalarTower.toAlgHom K E Ω + let G : FiniteGaloisIntermediateField K Ω := + { toIntermediateField := j.fieldRange + finiteDimensional := + j.equivFieldRange.toLinearEquiv.finiteDimensional + isGalois := IsGalois.of_algEquiv j.equivFieldRange } + let _ : FiniteDimensional K G := G.finiteDimensional + let _ : NumberField G := + NumberField.of_module_finite K G + let _ : IsAbelianGalois K G := + IsAbelianGalois.of_algHom G.toIntermediateField.val + let _ : Algebra E G := + j.equivFieldRange.toRingHom.toAlgebra + let _ : SMul E G := Algebra.toSMul + let _ : IsScalarTower K E G := + IsScalarTower.of_algHom j.equivFieldRange.toAlgHom + let _ : IsScalarTower K G Ω := + IntermediateField.isScalarTower_mid G.toIntermediateField + let _ : IsScalarTower E G Ω := + IsScalarTower.of_algebraMap_eq fun _ => rfl + have hProjection : + AlgEquiv.restrictNormalHom G + (infiniteGlobalArtinMonoidHom K Ω a) = + globalArtinMonoidHom (K := K) (L := G) a := + restrictNormalHom_infiniteGlobalArtinMonoidHom K Ω a G + calc + AlgEquiv.restrictNormalHom E + (infiniteGlobalArtinMonoidHom K Ω a) = + AlgEquiv.restrictNormalHom E + (AlgEquiv.restrictNormalHom G + (infiniteGlobalArtinMonoidHom K Ω a)) := + IsScalarTower.AlgEquiv.restrictNormalHom_comp_apply E G + (infiniteGlobalArtinMonoidHom K Ω a) + _ = AlgEquiv.restrictNormalHom E + (globalArtinMonoidHom (K := K) (L := G) a) := + congrArg (AlgEquiv.restrictNormalHom E) hProjection + _ = globalArtinMonoidHom (K := K) (L := E) a := + DFunLike.congr_fun + (globalArtinMonoidHom_restrict_tower + (K := K) (L := G) (E := E)) a + +open scoped Classical in +/-- Finite global reciprocity at every coordinate makes the infinite +global Artin homomorphism dense in the Krull topology. -/ +theorem infiniteGlobalArtinMonoidHom_denseRange + (K Ω : Type) [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] : + DenseRange (infiniteGlobalArtinMonoidHom K Ω) := by + apply dense_iff_inter_open.mpr + rintro U hU ⟨σ, hσU⟩ + let V : Set (Ω ≃ₐ[K] Ω) := + (Homeomorph.mulLeft σ) ⁻¹' U + have hVopen : IsOpen V := + hU.preimage (Homeomorph.mulLeft σ).continuous + have hVone : (1 : Ω ≃ₐ[K] Ω) ∈ V := by + change σ * 1 ∈ U + simpa using hσU + have hVnhds : + V ∈ 𝓝 (1 : Ω ≃ₐ[K] Ω) := + hVopen.mem_nhds hVone + obtain ⟨E, hEV⟩ := + (InfiniteGalois.krullTopology_mem_nhds_one_iff_of_isGalois + (k := K) (K := Ω) V).mp + hVnhds + let : NumberField E := + NumberField.of_module_finite K E + obtain ⟨a, ha⟩ := + globalArtinMonoidHom_surjective + (K := K) (L := E) + (AlgEquiv.restrictNormalHom E σ) + have hfix : + σ⁻¹ * infiniteGlobalArtinMonoidHom K Ω a ∈ + E.fixingSubgroup := by + rw [ + FiniteGaloisIntermediateField.mem_fixingSubgroup_iff, + map_mul, map_inv, + restrictNormalHom_infiniteGlobalArtinMonoidHom, + ha, inv_mul_cancel] + have hmemV : + σ⁻¹ * infiniteGlobalArtinMonoidHom K Ω a ∈ V := + hEV hfix + refine + ⟨infiniteGlobalArtinMonoidHom K Ω a, ?_, + ⟨a, rfl⟩⟩ + simpa [V, mul_assoc] using hmemV + +open scoped Classical in +/-- The actual continuous global Artin homomorphism from rational ideles +to the Galois group of the `ZHat`-extension of `ℚ`. -/ +noncomputable def rationalCyclotomicZHatGlobalArtin : + IdeleGroup ℚ →ₜ* + (rationalCyclotomicZHatField ≃ₐ[ℚ] + rationalCyclotomicZHatField) := + infiniteGlobalArtinMonoidHom ℚ rationalCyclotomicZHatField + +open scoped Classical in +private theorem + continuousMulEquivToLimit_rationalCyclotomicZHatGlobalArtin_apply + (a : IdeleGroup ℚ) : + InfiniteGalois.continuousMulEquivToLimit + ℚ rationalCyclotomicZHatField + (rationalCyclotomicZHatGlobalArtin a) = + infiniteGlobalArtinToLimit + ℚ rationalCyclotomicZHatField a := by + exact + (InfiniteGalois.continuousMulEquivToLimit + ℚ rationalCyclotomicZHatField).apply_symm_apply _ + +open scoped Classical in +/-- Projection of the rational `ZHat` Artin homomorphism is the finite +global Artin homomorphism. -/ +@[simp] +theorem restrictNormalHom_rationalCyclotomicZHatGlobalArtin + (a : IdeleGroup ℚ) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + letI : NumberField E := + NumberField.of_module_finite ℚ E + letI : IsAbelianGalois ℚ E := + IsAbelianGalois.of_algHom E.toIntermediateField.val + AlgEquiv.restrictNormalHom E + (rationalCyclotomicZHatGlobalArtin a) = + globalArtinMonoidHom + (K := ℚ) (L := E) a := + restrictNormalHom_infiniteGlobalArtinMonoidHom + ℚ rationalCyclotomicZHatField a E + +open scoped Classical in +/-- Rational cyclotomic projection with caller-supplied finite-layer +structures. -/ +theorem restrictNormalHom_rationalCyclotomicZHatGlobalArtin_of_structures + (a : IdeleGroup ℚ) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) + (hE : NumberField E) + (hAbelian : IsAbelianGalois ℚ E) : + letI : NumberField E := hE + letI : IsAbelianGalois ℚ E := hAbelian + AlgEquiv.restrictNormalHom E + (rationalCyclotomicZHatGlobalArtin a) = + globalArtinMonoidHom + (K := ℚ) (L := E) a := by + let : NumberField E := hE + let : IsAbelianGalois ℚ E := hAbelian + exact + restrictNormalHom_infiniteGlobalArtinMonoidHom_of_structures + ℚ rationalCyclotomicZHatField a E hE hAbelian + +open scoped Classical in +/-- A mapped relative infinite Artin projection, the corresponding rational +finite Artin value, and the rational infinite projection, packaged with both +comparison steps. The common finite value is generated only once in this +generic provider, so concrete dependent towers never compare separately +elaborated finite-field structures. -/ +noncomputable def + compRestrictNormalHomInfiniteGlobalArtinRationalCyclotomicDataOfNumberField + (K Ω : Type) [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] + (a : IdeleGroup K) + (E' : FiniteGaloisIntermediateField K Ω) + (hE' : NumberField E') + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) + (hE : NumberField E) + (hAbelian : IsAbelianGalois ℚ E) + (f : (E' ≃ₐ[K] E') →* Gal(E/ℚ)) + (hnat : + letI : NumberField E' := hE' + letI : NumberField E := hE + letI : IsAbelianGalois ℚ E := hAbelian + f.comp (globalArtinMonoidHomOfNumberField K E' hE') = + (globalArtinMonoidHom (K := ℚ) (L := E)).comp + (IdeleGroup.norm ℚ K)) : + letI : NumberField E' := hE' + letI : NumberField E := hE + letI : IsAbelianGalois ℚ E := hAbelian + {x : Gal(E/ℚ) × Gal(E/ℚ) × Gal(E/ℚ) // + x.1 = x.2.1 ∧ x.2.1 = x.2.2} := by + letI : NumberField E' := hE' + letI : NumberField E := hE + letI : IsAbelianGalois ℚ E := hAbelian + let relativeData := + compRestrictNormalHomInfiniteGlobalArtinNaturalityDataOfNumberField + K Ω a E' hE' f + ((globalArtinMonoidHom (K := ℚ) (L := E)).comp + (IdeleGroup.norm ℚ K)) + hnat + have hcomp : + ((globalArtinMonoidHom (K := ℚ) (L := E)).comp + (IdeleGroup.norm ℚ K)) a = + globalArtinMonoidHom (K := ℚ) (L := E) + (IdeleGroup.norm ℚ K a) := + rfl + exact + ⟨(relativeData.1, + ((globalArtinMonoidHom (K := ℚ) (L := E)).comp + (IdeleGroup.norm ℚ K)) a, + AlgEquiv.restrictNormalHom E + (rationalCyclotomicZHatGlobalArtin + (IdeleGroup.norm ℚ K a))), + relativeData.2, + hcomp.trans + (restrictNormalHom_rationalCyclotomicZHatGlobalArtin_of_structures + (IdeleGroup.norm ℚ K a) E hE hAbelian).symm⟩ + +open scoped Classical in +/-- The rational `ZHat` specialization has dense Artin image. -/ +theorem rationalCyclotomicZHatGlobalArtin_denseRange : + DenseRange rationalCyclotomicZHatGlobalArtin := + infiniteGlobalArtinMonoidHom_denseRange + ℚ rationalCyclotomicZHatField + +open scoped Classical in +/-- The infinite global Artin homomorphism, like each of its finite +coordinates, kills the positive archimedean section. -/ +@[simp] +theorem + rationalCyclotomicZHatGlobalArtin_rationalPositiveArchimedeanIdele + (r : ℝ≥0ˣ) : + rationalCyclotomicZHatGlobalArtin + (rationalPositiveArchimedeanIdele r) = + 1 := by + let + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + NumberField E := + NumberField.of_module_finite ℚ E + let + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsAbelianGalois ℚ E := + IsAbelianGalois.of_algHom E.toIntermediateField.val + apply + (InfiniteGalois.continuousMulEquivToLimit + ℚ rationalCyclotomicZHatField).injective + rw [ + continuousMulEquivToLimit_rationalCyclotomicZHatGlobalArtin_apply, + map_one] + apply Subtype.ext + funext E + exact + globalArtinMonoidHom_rationalPositiveArchimedeanIdele + (L := E.unop) r + +open scoped Classical in +/-- Every rational idele has the same infinite Artin symbol as a +norm-one idele. -/ +theorem + exists_normOneIdele_same_rationalCyclotomicZHatGlobalArtin + (a : IdeleGroup ℚ) : + ∃ b : IdeleGroup.normOneSubgroup (K := ℚ), + rationalCyclotomicZHatGlobalArtin b = + rationalCyclotomicZHatGlobalArtin a := by + let r := IdeleGroup.absoluteNorm a + refine + ⟨⟨a * rationalPositiveArchimedeanIdele r, ?_⟩, + ?_⟩ + · change + IdeleGroup.absoluteNorm + (a * rationalPositiveArchimedeanIdele r) = + 1 + rw [map_mul, + rationalPositiveArchimedeanIdele_absoluteNorm] + simp [r] + · change + rationalCyclotomicZHatGlobalArtin + (a * rationalPositiveArchimedeanIdele r) = + rationalCyclotomicZHatGlobalArtin a + rw [map_mul, + rationalCyclotomicZHatGlobalArtin_rationalPositiveArchimedeanIdele, + mul_one] + +open scoped Classical in +/-- The norm-one rational ideles already have dense Artin image. -/ +theorem rationalCyclotomicZHatGlobalArtin_normOne_denseRange : + DenseRange + (fun b : IdeleGroup.normOneSubgroup (K := ℚ) => + rationalCyclotomicZHatGlobalArtin b) := by + apply rationalCyclotomicZHatGlobalArtin_denseRange.mono + rintro σ ⟨a, rfl⟩ + obtain ⟨b, hb⟩ := + exists_normOneIdele_same_rationalCyclotomicZHatGlobalArtin a + exact ⟨b, hb⟩ + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinDescent.lean new file mode 100644 index 0000000000..a49347f1dd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinDescent.lean @@ -0,0 +1,142 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinCompatibility +/-! +# Descent of the infinite global Artin homomorphism + +The finite global Artin product formula at every finite Galois intermediate +field shows that the infinite global Artin homomorphism kills principal ideles. +This file descends that homomorphism to the idele class group and retains its +ordinary quotient topology. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +variable + {K Ω : Type} + [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] + +open scoped Classical in +private theorem + continuousMulEquivToLimit_infiniteGlobalArtinMonoidHom_apply + (a : IdeleGroup K) : + InfiniteGalois.continuousMulEquivToLimit K Ω + (infiniteGlobalArtinMonoidHom K Ω a) = + infiniteGlobalArtinToLimit K Ω a := by + exact + (InfiniteGalois.continuousMulEquivToLimit K Ω).apply_symm_apply _ + +open scoped Classical in +/-- The infinite global Artin homomorphism is trivial on every principal +idele. -/ +@[simp] +theorem infiniteGlobalArtinMonoidHom_principalIdele + (x : Kˣ) : + infiniteGlobalArtinMonoidHom K Ω + (IdeleGroup.principalIdele K x) = + 1 := by + let (E : FiniteGaloisIntermediateField K Ω) : NumberField E := + NumberField.of_module_finite K E + let (E : FiniteGaloisIntermediateField K Ω) : IsAbelianGalois K E := + IsAbelianGalois.of_algHom E.toIntermediateField.val + apply (InfiniteGalois.continuousMulEquivToLimit K Ω).injective + rw [ + continuousMulEquivToLimit_infiniteGlobalArtinMonoidHom_apply, + map_one] + apply Subtype.ext + funext E + exact + globalArtinMonoidHom_principalIdele + (K := K) (L := E.unop) x + +open scoped Classical in +/-- The infinite global Artin homomorphism descended through the subgroup of +principal ideles. -/ +noncomputable def infiniteGlobalIdeleClassArtinMonoidHom : + IdeleClassGroup K →* (Ω ≃ₐ[K] Ω) := + QuotientGroup.lift + (IdeleGroup.principalSubgroup K) + (infiniteGlobalArtinMonoidHom K Ω).toMonoidHom + (by + intro a ha + change infiniteGlobalArtinMonoidHom K Ω a = 1 + rcases ha with ⟨x, rfl⟩ + exact + infiniteGlobalArtinMonoidHom_principalIdele + (K := K) (Ω := Ω) x) + +open scoped Classical in +/-- Evaluation of the descended infinite global Artin homomorphism on an idele +representative recovers the original infinite Artin homomorphism. -/ +theorem infiniteGlobalIdeleClassArtinMonoidHom_mk + (a : IdeleGroup K) : + infiniteGlobalIdeleClassArtinMonoidHom + (K := K) (Ω := Ω) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) = + infiniteGlobalArtinMonoidHom K Ω a := by + rw [infiniteGlobalIdeleClassArtinMonoidHom] + exact QuotientGroup.lift_mk _ _ _ + +open scoped Classical in +private theorem infiniteGlobalIdeleClassArtinMonoidHom_continuous : + Continuous + (infiniteGlobalIdeleClassArtinMonoidHom + (K := K) (Ω := Ω)) := by + refine + (QuotientGroup.isQuotientMap_mk + (G := IdeleGroup K) + (N := IdeleGroup.principalSubgroup K)).continuous_iff.2 ?_ + convert + (infiniteGlobalArtinMonoidHom K Ω).continuous_toFun using 1 + funext a + exact + infiniteGlobalIdeleClassArtinMonoidHom_mk + (K := K) (Ω := Ω) a + +open scoped Classical in +/-- The descended infinite global Artin homomorphism, retaining the ordinary +quotient topology on the idele class group. -/ +noncomputable def infiniteGlobalIdeleClassArtinContinuousMonoidHom : + IdeleClassGroup K →ₜ* (Ω ≃ₐ[K] Ω) where + toMonoidHom := + infiniteGlobalIdeleClassArtinMonoidHom + (K := K) (Ω := Ω) + continuous_toFun := by + exact infiniteGlobalIdeleClassArtinMonoidHom_continuous (K := K) (Ω := Ω) + +open scoped Classical in +/-- The descended infinite global Artin homomorphism has dense image in the +Krull topology. -/ +theorem infiniteGlobalIdeleClassArtinContinuousMonoidHom_denseRange : + DenseRange + (infiniteGlobalIdeleClassArtinContinuousMonoidHom + (K := K) (Ω := Ω)) := by + refine + (infiniteGlobalArtinMonoidHom_denseRange K Ω).mono ?_ + rintro σ ⟨a, rfl⟩ + refine + ⟨QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a, ?_⟩ + exact + infiniteGlobalIdeleClassArtinMonoidHom_mk + (K := K) (Ω := Ω) a + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinSurjectivity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinSurjectivity.lean new file mode 100644 index 0000000000..bc92b10b5e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinSurjectivity.lean @@ -0,0 +1,303 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormOneCompact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PositiveArchimedeanSection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinDescent +/-! +# Surjectivity of the infinite global Artin homomorphism + +The absolute idele norm is split, up to inversion, by an idele supported at +one infinite place. Its local component is positive, so every finite global +Artin homomorphism, and hence the infinite global Artin homomorphism, kills +it. Multiplication by this section therefore replaces any idele by a +norm-one idele without changing its Artin symbol. +-/ + +@[expose] public section + +open scoped IsMulCommutative NNReal NumberField Topology +open NumberField IsDedekindDomain +open NumberField.Units.dirichletUnitTheorem + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +/-- Compatibility name for the positive archimedean section. -/ +noncomputable def numberFieldPositiveArchimedeanIdele + (K : Type) [Field K] [NumberField K] : + ℝ≥0ˣ →* IdeleGroup K := + IdeleGroup.positiveArchimedeanSection K + +open scoped Classical in +/-- Compatibility evaluation of the finite components of the positive +archimedean section. -/ +theorem numberFieldPositiveArchimedeanIdele_finiteComponent + (r : ℝ≥0ˣ) + (v : HeightOneSpectrum (𝓞 K)) : + IdeleGroup.finiteComponent v + (numberFieldPositiveArchimedeanIdele K r) = + 1 := + IdeleGroup.positiveArchimedeanSection_finiteComponent r v + +open scoped Classical in +/-- Compatibility form of positivity at every infinite component. -/ +theorem numberFieldPositiveArchimedeanIdele_infiniteComponent_mem_positive + (r : ℝ≥0ˣ) (v : InfinitePlace K) : + IdeleGroup.infiniteComponent v + (numberFieldPositiveArchimedeanIdele K r) ∈ + RayClass.infinitePositiveSubgroup v := + IdeleGroup.positiveArchimedeanSection_infiniteComponent_mem_positive r v + +open scoped Classical in +/-- Compatibility form of the absolute-norm evaluation. -/ +theorem numberFieldPositiveArchimedeanIdele_absoluteNorm + (r : ℝ≥0ˣ) : + IdeleGroup.absoluteNorm + (numberFieldPositiveArchimedeanIdele K r) = + r⁻¹ := + IdeleGroup.positiveArchimedeanSection_absoluteNorm r + +open scoped Classical in +private theorem globalArtinMonoidHom_positiveArchimedeanSection + {L : Type} + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + (r : ℝ≥0ˣ) : + globalArtinMonoidHom + (K := K) (L := L) + (IdeleGroup.positiveArchimedeanSection K r) = + 1 := by + rw [globalArtinMonoidHom_apply] + have hinfinite : + (∏ v : InfinitePlace K, + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v + (IdeleGroup.infiniteComponent v + (IdeleGroup.positiveArchimedeanSection K r))) = + 1 := by + apply Finset.prod_eq_one + intro v _ + apply + (chosenInfinitePlaceArtinMonoidHom_eq_one_iff_infiniteTensorNorm + (K := K) (L := L) v _).2 + exact + (infinitePositiveSubgroup_le_infiniteTensorNormSubgroup + (K := K) (L := L) v) + (IdeleGroup.positiveArchimedeanSection_infiniteComponent_mem_positive + r v) + have hfinite : + (∏ᶠ v : HeightOneSpectrum (𝓞 K), + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v + (IdeleGroup.finiteComponent v + (IdeleGroup.positiveArchimedeanSection K r))) = + 1 := by + apply finprod_eq_one_of_forall_eq_one + intro v + rw [IdeleGroup.positiveArchimedeanSection_finiteComponent, + map_one] + rw [hinfinite, hfinite, mul_one] + +open scoped Classical in +private theorem continuousMulEquivToLimit_infiniteGlobalArtinMonoidHom_apply' + {K Ω : Type} + [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] + (a : IdeleGroup K) : + InfiniteGalois.continuousMulEquivToLimit K Ω + (infiniteGlobalArtinMonoidHom K Ω a) = + infiniteGlobalArtinToLimit K Ω a := by + exact + (InfiniteGalois.continuousMulEquivToLimit K Ω).apply_symm_apply _ + +open scoped Classical in +/-- The infinite global Artin homomorphism kills the positive archimedean +section over every number field. -/ +@[simp] +theorem infiniteGlobalArtinMonoidHom_positiveArchimedeanSection + (K Ω : Type) + [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] + (r : ℝ≥0ˣ) : + infiniteGlobalArtinMonoidHom K Ω + (IdeleGroup.positiveArchimedeanSection K r) = + 1 := by + let + (E : FiniteGaloisIntermediateField K Ω) : + NumberField E := + NumberField.of_module_finite K E + let + (E : FiniteGaloisIntermediateField K Ω) : + IsAbelianGalois K E := + IsAbelianGalois.of_algHom E.toIntermediateField.val + apply + (InfiniteGalois.continuousMulEquivToLimit K Ω).injective + rw [ + continuousMulEquivToLimit_infiniteGlobalArtinMonoidHom_apply', + map_one] + apply Subtype.ext + funext E + exact + globalArtinMonoidHom_positiveArchimedeanSection + (K := K) (L := E.unop) r + +open scoped Classical in +/-- Compatibility form of the Artin evaluation on the positive archimedean +section. -/ +@[simp] +theorem infiniteGlobalArtinMonoidHom_numberFieldPositiveArchimedeanIdele + (K Ω : Type) + [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] + (r : ℝ≥0ˣ) : + infiniteGlobalArtinMonoidHom K Ω + (numberFieldPositiveArchimedeanIdele K r) = + 1 := + infiniteGlobalArtinMonoidHom_positiveArchimedeanSection K Ω r + +open scoped Classical in +/-- Every idele has the same infinite global Artin symbol as a norm-one +idele. -/ +theorem exists_normOneIdele_same_infiniteGlobalArtin + (K Ω : Type) + [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] + (a : IdeleGroup K) : + ∃ b : IdeleGroup.normOneSubgroup (K := K), + infiniteGlobalArtinMonoidHom K Ω b = + infiniteGlobalArtinMonoidHom K Ω a := by + refine + ⟨IdeleGroup.positiveArchimedeanNormOneCorrection K a, ?_⟩ + rw [IdeleGroup.positiveArchimedeanNormOneCorrection_coe, + map_mul, + infiniteGlobalArtinMonoidHom_positiveArchimedeanSection, + mul_one] + +open scoped Classical in +private theorem + infiniteGlobalIdeleClassArtinContinuousMonoidHom_normOne_denseRange + (K Ω : Type) + [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] : + DenseRange + (fun c : IdeleClassGroup.normOneSubgroup (K := K) => + infiniteGlobalIdeleClassArtinContinuousMonoidHom + (K := K) (Ω := Ω) (c : IdeleClassGroup K)) := by + apply + (infiniteGlobalIdeleClassArtinContinuousMonoidHom_denseRange + (K := K) (Ω := Ω)).mono + rintro σ ⟨c, rfl⟩ + obtain ⟨a, rfl⟩ := + QuotientGroup.mk'_surjective + (IdeleGroup.principalSubgroup K) c + obtain ⟨b, hb⟩ := + exists_normOneIdele_same_infiniteGlobalArtin K Ω a + let d : IdeleClassGroup.normOneSubgroup (K := K) := + ⟨QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (b : IdeleGroup K), + (IdeleClassGroup.mk_mem_normOneSubgroup_iff + (b : IdeleGroup K)).2 b.2⟩ + refine ⟨d, ?_⟩ + change + infiniteGlobalIdeleClassArtinMonoidHom + (K := K) (Ω := Ω) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (b : IdeleGroup K)) = + infiniteGlobalIdeleClassArtinMonoidHom + (K := K) (Ω := Ω) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) + rw [infiniteGlobalIdeleClassArtinMonoidHom_mk, + infiniteGlobalIdeleClassArtinMonoidHom_mk] + exact hb + +open scoped Classical in +private theorem + infiniteGlobalIdeleClassArtinContinuousMonoidHom_normOne_surjective + (K Ω : Type) + [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] : + Function.Surjective + (fun c : IdeleClassGroup.normOneSubgroup (K := K) => + infiniteGlobalIdeleClassArtinContinuousMonoidHom + (K := K) (Ω := Ω) (c : IdeleClassGroup K)) := by + let f := + fun c : IdeleClassGroup.normOneSubgroup (K := K) => + infiniteGlobalIdeleClassArtinContinuousMonoidHom + (K := K) (Ω := Ω) (c : IdeleClassGroup K) + have hf : Continuous f := by + exact + (infiniteGlobalIdeleClassArtinContinuousMonoidHom + (K := K) (Ω := Ω)).continuous_toFun.comp + continuous_subtype_val + have hclosed : IsClosed (Set.range f) := + (isCompact_range hf).isClosed + have hdense : DenseRange f := by + simpa only [f] using + (infiniteGlobalIdeleClassArtinContinuousMonoidHom_normOne_denseRange + K Ω) + intro σ + have hσ : σ ∈ closure (Set.range f) := by + rw [hdense.closure_range] + trivial + rwa [hclosed.closure_eq] at hσ + +open scoped Classical in +/-- The infinite global Artin homomorphism on idele classes is surjective. -/ +theorem infiniteGlobalIdeleClassArtinContinuousMonoidHom_surjective + (K Ω : Type) + [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] : + Function.Surjective + (infiniteGlobalIdeleClassArtinContinuousMonoidHom + (K := K) (Ω := Ω)) := by + intro σ + obtain ⟨c, hc⟩ := + infiniteGlobalIdeleClassArtinContinuousMonoidHom_normOne_surjective + K Ω σ + exact ⟨(c : IdeleClassGroup K), hc⟩ + +open scoped Classical in +/-- The infinite global Artin homomorphism is surjective. -/ +theorem infiniteGlobalArtinMonoidHom_surjective + (K Ω : Type) + [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] : + Function.Surjective + (infiniteGlobalArtinMonoidHom K Ω) := by + intro σ + obtain ⟨c, hc⟩ := + infiniteGlobalIdeleClassArtinContinuousMonoidHom_surjective + K Ω σ + obtain ⟨a, ha⟩ := + QuotientGroup.mk'_surjective + (IdeleGroup.principalSubgroup K) c + refine ⟨a, ?_⟩ + calc + infiniteGlobalArtinMonoidHom K Ω a = + infiniteGlobalIdeleClassArtinContinuousMonoidHom + (K := K) (Ω := Ω) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) := + (infiniteGlobalIdeleClassArtinMonoidHom_mk + (K := K) (Ω := Ω) a).symm + _ = infiniteGlobalIdeleClassArtinContinuousMonoidHom + (K := K) (Ω := Ω) c := by rw [ha] + _ = σ := hc + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteHilbertFactorNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteHilbertFactorNaturality.lean new file mode 100644 index 0000000000..f4cd6aba9e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteHilbertFactorNaturality.lean @@ -0,0 +1,112 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.PlaceEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalInfinitePlaceHilbertSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport +/-! +# Naturality of the infinite Hilbert factor + +The real-place sign in the explicit infinite Hilbert factor is unchanged +under an equivalence of number fields. This reindexes the infinite part of +the product formula when a field is replaced by a small model. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- Corresponding real embeddings assign the same real value to a field +element and its image under the field equivalence. -/ +theorem infinitePlace_embedding_of_isReal_congr + {F : Type u} {G : Type v} [Field F] [Field G] + (e : F ≃+* G) (W : InfinitePlace G) + (hv : ((infinitePlaceEquivOfRingEquiv e).symm W).IsReal) + (hW : W.IsReal) (x : F) : + InfinitePlace.embedding_of_isReal hv x = + InfinitePlace.embedding_of_isReal hW (e x) := by + apply Complex.ofReal_injective + rw [InfinitePlace.embedding_of_isReal_apply, + InfinitePlace.embedding_of_isReal_apply] + change ((W.comap e.toRingHom).embedding) x = W.embedding (e x) + rw [InfinitePlace.comap_embedding_of_isReal e.toRingHom hv] + rfl + +/-- The explicit infinite Hilbert factor commutes with equivalence of number +fields, including the exceptional quadratic real-place sign. -/ +theorem globalInfinitePlaceHilbertSymbol_congr + {F : Type u} {G : Type v} + [Field F] [NumberField F] [Field G] [NumberField G] + (e : F ≃+* G) (n : ℕ+) + (hmuF : (primitiveRoots (n : ℕ) F).Nonempty) + (W : InfinitePlace G) (a b : Fˣ) : + rootsOfUnityEquivOfRingEquiv e n hmuF + (globalInfinitePlaceHilbertSymbol F n + ((infinitePlaceEquivOfRingEquiv e).symm W) a b) = + globalInfinitePlaceHilbertSymbol G n W + (Units.mapEquiv e.toMulEquiv a) + (Units.mapEquiv e.toMulEquiv b) := by + let v := (infinitePlaceEquivOfRingEquiv e).symm W + let er := rootsOfUnityEquivOfRingEquiv e n hmuF + change er (globalInfinitePlaceHilbertSymbol F n v a b) = + globalInfinitePlaceHilbertSymbol G n W + (Units.mapEquiv e.toMulEquiv a) + (Units.mapEquiv e.toMulEquiv b) + have hviff : v.IsReal ↔ W.IsReal := by + change (W.comap e.toRingHom).IsReal ↔ W.IsReal + exact InfinitePlace.isReal_comap_iff e + by_cases hn : (n : ℕ) = 2 + · by_cases hW : W.IsReal + · have hv : v.IsReal := hviff.mpr hW + have haiff : + InfinitePlace.embedding_of_isReal hv (a : F) < 0 ↔ + InfinitePlace.embedding_of_isReal hW + ((Units.mapEquiv e.toMulEquiv a : Gˣ) : G) < 0 := by + rw [show ((Units.mapEquiv e.toMulEquiv a : Gˣ) : G) = e (a : F) by + simp] + rw [infinitePlace_embedding_of_isReal_congr e W hv hW] + have hbiff : + InfinitePlace.embedding_of_isReal hv (b : F) < 0 ↔ + InfinitePlace.embedding_of_isReal hW + ((Units.mapEquiv e.toMulEquiv b : Gˣ) : G) < 0 := by + rw [show ((Units.mapEquiv e.toMulEquiv b : Gˣ) : G) = e (b : F) by + simp] + rw [infinitePlace_embedding_of_isReal_congr e W hv hW] + by_cases ha : InfinitePlace.embedding_of_isReal hv (a : F) < 0 + · have haG := haiff.mp ha + change InfinitePlace.embedding_of_isReal hW (e (a : F)) < 0 at haG + by_cases hb : InfinitePlace.embedding_of_isReal hv (b : F) < 0 + · have hbG := hbiff.mp hb + change InfinitePlace.embedding_of_isReal hW (e (b : F)) < 0 at hbG + simp? [globalInfinitePlaceHilbertSymbol, hn, hv, + hW, ha, hb, haG, hbG] + apply Subtype.ext + apply Units.ext + change e (-1 : F) = (-1 : G) + simp + · have hbG := fun h => hb (hbiff.mpr h) + change ¬InfinitePlace.embedding_of_isReal hW (e (b : F)) < 0 at hbG + simp [globalInfinitePlaceHilbertSymbol, hn, hv, + hW, ha, hb, haG, hbG] + · have haG := fun h => ha (haiff.mpr h) + change ¬InfinitePlace.embedding_of_isReal hW (e (a : F)) < 0 at haG + simp [globalInfinitePlaceHilbertSymbol, hn, hv, + hW, ha, haG] + · have hv : ¬v.IsReal := fun h => hW (hviff.mp h) + simp [globalInfinitePlaceHilbertSymbol, hn, hv, hW] + · simp [globalInfinitePlaceHilbertSymbol, hn] + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteLocalGlobalArtinCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteLocalGlobalArtinCompatibility.lean new file mode 100644 index 0000000000..ac25d3fc92 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteLocalGlobalArtinCompatibility.lean @@ -0,0 +1,468 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RationalComplexification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceOverfield +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.NumberFieldComplexification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RamifiedOverextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.OverextensionArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceCompatibility +/-! +# Archimedean local-global compatibility of Artin homomorphisms + +This file compares the actual Artin homomorphism at an infinite place +with the global norm-residue homomorphism on idele classes. The +one-place norm statements are proved from genuine relative ideles +supported at the chosen archimedean place. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField +open IdeleGroup RelativeIdeleGroup + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + +omit [IsAbelianGalois K L] in +/-- A determinant norm at one infinite place gives an actual global +idele-class norm. The witness is the relative idele supported at that +place, transported to an ordinary idele of the extension field. -/ +theorem infinitePlaceIdeleClass_mem_ideleClassNorm_range_of_mem_infiniteTensorNorm + (v : InfinitePlace K) + (x : v.Completionˣ) + (hx : + x ∈ infiniteTensorNormSubgroup + (K := K) (L := L) v) : + IdeleGroup.infinitePlaceIdeleClass v x ∈ + (_root_.ideleClassNorm K L).range := by + have hnorm : + IdeleGroup.infinitePlaceIdele v x ∈ + ideleNormSubgroup (K := K) (L := L) := + (infinitePlaceIdele_mem_ideleNormSubgroup_iff + (K := K) (L := L) v x).2 hx + obtain ⟨z, hz⟩ := hnorm + refine + ⟨QuotientGroup.mk' + (IdeleGroup.principalSubgroup L) + (_root_.relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) z), ?_⟩ + change + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (IdeleGroup.norm K L + (_root_.relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) z)) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (IdeleGroup.infinitePlaceIdele v x) + rw [IdeleGroup.norm_relativeIdeleBaseChangeMulEquiv, hz] + +omit [FiniteDimensional K L] in +/-- Triviality of the actual chosen infinite-place Artin symbol is +equivalent to membership in the corresponding determinant-norm +subgroup. -/ +@[simp] +theorem chosenInfinitePlaceArtinMonoidHom_eq_one_iff_infiniteTensorNorm + (v : InfinitePlace K) + (x : v.Completionˣ) : + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v x = 1 ↔ + x ∈ infiniteTensorNormSubgroup + (K := K) (L := L) v := by + change + x ∈ (chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v).ker ↔ _ + rw [chosenInfinitePlaceArtinMonoidHom_ker + (K := K) (L := L) v] + +/-- An infinite-place element killed by the actual local Artin +homomorphism is killed by the global norm-residue homomorphism after +insertion as a one-place idele class. -/ +theorem globalNormResidueMonoidHom_infinitePlaceIdeleClass_eq_one_of_localArtin_eq_one + (v : InfinitePlace K) + (x : v.Completionˣ) + (hx : + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v x = 1) : + globalNormResidueMonoidHom K L + (IdeleGroup.infinitePlaceIdeleClass v x) = 1 := by + rw [globalNormResidueMonoidHom_eq_one_iff] + exact + infinitePlaceIdeleClass_mem_ideleClassNorm_range_of_mem_infiniteTensorNorm + (K := K) (L := L) v x + ((chosenInfinitePlaceArtinMonoidHom_eq_one_iff_infiniteTensorNorm + (K := K) (L := L) v x).1 hx) + +/-- The infinite tensor norm subgroup lies in the kernel of the global +norm-residue homomorphism restricted to the one-place idele class map. -/ +theorem infiniteTensorNormSubgroup_le_globalNormResidueKernel + (v : InfinitePlace K) : + infiniteTensorNormSubgroup + (K := K) (L := L) v ≤ + ((globalNormResidueMonoidHom K L).comp + (IdeleGroup.infinitePlaceIdeleClass v)).ker := by + intro x hx + exact + globalNormResidueMonoidHom_infinitePlaceIdeleClass_eq_one_of_localArtin_eq_one + (K := K) (L := L) v x + ((chosenInfinitePlaceArtinMonoidHom_eq_one_iff_infiniteTensorNorm + (K := K) (L := L) v x).2 hx) + +/-- A positive element at a real infinite place gives an actual +idele-class norm. -/ +theorem infinitePlaceIdeleClass_mem_ideleClassNorm_range_of_real_pos + (v : InfinitePlace K) + (hvReal : v.IsReal) + (x : v.Completionˣ) + (hx : + 0 < + InfinitePlace.Completion.ringEquivRealOfIsReal + hvReal (x : v.Completion)) : + IdeleGroup.infinitePlaceIdeleClass v x ∈ + (_root_.ideleClassNorm K L).range := by + apply + infinitePlaceIdeleClass_mem_ideleClassNorm_range_of_mem_infiniteTensorNorm + (K := K) (L := L) v x + exact + (chosenInfinitePlaceArtinMonoidHom_eq_one_iff_infiniteTensorNorm + (K := K) (L := L) v x).1 + (chosenInfinitePlaceArtinMonoidHom_eq_one_of_real_pos + (K := K) (L := L) v hvReal x hx) + +/-- The global norm-residue symbol of a positive real one-place idele +class is trivial. -/ +theorem globalNormResidueMonoidHom_infinitePlaceIdeleClass_eq_one_of_real_pos + (v : InfinitePlace K) + (hvReal : v.IsReal) + (x : v.Completionˣ) + (hx : + 0 < + InfinitePlace.Completion.ringEquivRealOfIsReal + hvReal (x : v.Completion)) : + globalNormResidueMonoidHom K L + (IdeleGroup.infinitePlaceIdeleClass v x) = 1 := by + rw [globalNormResidueMonoidHom_eq_one_iff] + exact + infinitePlaceIdeleClass_mem_ideleClassNorm_range_of_real_pos + (K := K) (L := L) v hvReal x hx + +/-- At an actually unramified infinite place, both the restricted +global norm-residue map and the chosen local Artin map are trivial, +hence the local-global compatibility square commutes. -/ +theorem globalNormResidueMonoidHom_comp_infinitePlaceIdeleClass_of_unramified + (v : InfinitePlace K) + (hUnramified : + (chosenInfinitePlaceAbove (L := L) v).IsUnramified K) : + (globalNormResidueMonoidHom K L).comp + (IdeleGroup.infinitePlaceIdeleClass v) = + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v := by + apply MonoidHom.ext + intro x + have hlocal : + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v x = 1 := by + unfold chosenInfinitePlaceArtinMonoidHom + unfold infinitePlaceArtinMonoidHomOfPlace + rw [dite_eq_left hUnramified] + rfl + have hglobal : + globalNormResidueMonoidHom K L + (IdeleGroup.infinitePlaceIdeleClass v x) = 1 := + globalNormResidueMonoidHom_infinitePlaceIdeleClass_eq_one_of_localArtin_eq_one + (K := K) (L := L) v x hlocal + rw [MonoidHom.comp_apply, hglobal, hlocal] + +/-- At a complex base place the chosen place upstairs is automatically +unramified, so the archimedean local-global compatibility square is +trivial. -/ +theorem globalNormResidueMonoidHom_comp_infinitePlaceIdeleClass_of_isComplex + (v : InfinitePlace K) + (hvComplex : v.IsComplex) : + (globalNormResidueMonoidHom K L).comp + (IdeleGroup.infinitePlaceIdeleClass v) = + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v := by + apply + globalNormResidueMonoidHom_comp_infinitePlaceIdeleClass_of_unramified + (K := K) (L := L) v + apply InfinitePlace.isUnramified_iff.mpr + apply Or.inr + rw [chosenInfinitePlaceAbove_comap (L := L) v] + exact hvComplex + +/-- At an actually unramified infinite place, one-place idele-class +norm membership is exactly local determinant-norm membership. -/ +theorem infinitePlaceIdeleClass_mem_ideleClassNorm_range_iff_of_unramified + (v : InfinitePlace K) + (hUnramified : + (chosenInfinitePlaceAbove (L := L) v).IsUnramified K) + (x : v.Completionˣ) : + IdeleGroup.infinitePlaceIdeleClass v x ∈ + (_root_.ideleClassNorm K L).range ↔ + x ∈ infiniteTensorNormSubgroup + (K := K) (L := L) v := by + rw [← globalNormResidueMonoidHom_eq_one_iff] + rw [← + chosenInfinitePlaceArtinMonoidHom_eq_one_iff_infiniteTensorNorm + (K := K) (L := L) v x] + have hcompat : + globalNormResidueMonoidHom K L + (IdeleGroup.infinitePlaceIdeleClass v x) = + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v x := by + simpa only [MonoidHom.comp_apply] using + DFunLike.congr_fun + (globalNormResidueMonoidHom_comp_infinitePlaceIdeleClass_of_unramified + (K := K) (L := L) v hUnramified) x + rw [hcompat] + +omit [FiniteDimensional K L] in +/-- At an actually ramified real place, negative one is not a local +determinant norm. This is the concrete real/complex norm obstruction: +every norm from the complex completion is positive. -/ +theorem neg_one_not_mem_infiniteTensorNormSubgroup_of_ramified + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + (-1 : v.Completionˣ) ∉ + infiniteTensorNormSubgroup + (K := K) (L := L) v := by + let w := chosenInfinitePlaceAbove (L := L) v + have hw : + w.comap (algebraMap K L) = v := + chosenInfinitePlaceAbove_comap (L := L) v + let chosenInfinitePlaceLiesOver : w.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) hw⟩ + rw [infiniteTensorNormSubgroup_eq_localNormSubgroup + (K := K) (L := L) v w hw] + rintro ⟨z, hz⟩ + have hvReal : v.IsReal := by + exact hw ▸ hRamified.isReal + have hwComplex : w.IsComplex := + hRamified.isComplex + have hpos := + infinitePlace_normUnits_real_complex_pos + (K := K) (K' := L) v w hw + hvReal hwComplex z + have hneg : (0 : ℝ) < -1 := by + rw [hz] at hpos + simpa only [ + InfinitePlace.Completion.ringEquivRealOfIsReal_apply, + Units.coe_neg_one, map_neg, map_one] using hpos + norm_num at hneg + +omit [FiniteDimensional K L] in +/-- The actual chosen local Artin symbol of negative one is nontrivial +at a ramified real place. -/ +theorem chosenInfinitePlaceArtinMonoidHom_neg_one_ne_one_of_ramified + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v + (-1 : v.Completionˣ) ≠ 1 := by + intro htrivial + exact + neg_one_not_mem_infiniteTensorNormSubgroup_of_ramified + (K := K) (L := L) v hRamified + ((chosenInfinitePlaceArtinMonoidHom_eq_one_iff_infiniteTensorNorm + (K := K) (L := L) v (-1 : v.Completionˣ)).1 htrivial) + +omit [NumberField K] in +/-- Every unit at a real completion is positive either as given or +after multiplication by negative one. -/ +private theorem realCompletionUnit_pos_or_neg_one_mul_pos + (v : InfinitePlace K) + (hvReal : v.IsReal) + (x : v.Completionˣ) : + 0 < + InfinitePlace.Completion.ringEquivRealOfIsReal + hvReal (x : v.Completion) ∨ + 0 < + InfinitePlace.Completion.ringEquivRealOfIsReal + hvReal + (((-1 : v.Completionˣ) * x : v.Completionˣ) : + v.Completion) := by + let e : + v.Completion ≃+* ℝ := + InfinitePlace.Completion.ringEquivRealOfIsReal hvReal + have hne : + e (x : v.Completion) ≠ 0 := + (map_ne_zero e).2 (Units.ne_zero x) + rcases lt_or_gt_of_ne hne with hneg | hpos + · right + change 0 < e ((-1 : v.Completion) * (x : v.Completion)) + rw [map_mul, map_neg, map_one] + simpa only [neg_one_mul] using neg_pos.mpr hneg + · exact Or.inl hpos + +/-- At a real place, the full archimedean local-global Artin square is +equivalent to its single value at negative one. Positivity kills both +maps, so this isolates the unique ramified real source calculation. -/ +theorem globalNormResidueMonoidHom_comp_infinitePlaceIdeleClass_eq_iff_neg_one + (v : InfinitePlace K) + (hvReal : v.IsReal) : + (globalNormResidueMonoidHom K L).comp + (IdeleGroup.infinitePlaceIdeleClass v) = + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v ↔ + globalNormResidueMonoidHom K L + (IdeleGroup.infinitePlaceIdeleClass v + (-1 : v.Completionˣ)) = + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v + (-1 : v.Completionˣ) := by + constructor + · intro h + exact DFunLike.congr_fun h (-1 : v.Completionˣ) + · intro hneg + apply MonoidHom.ext + intro x + rcases + realCompletionUnit_pos_or_neg_one_mul_pos + (K := K) v hvReal x with hx | hx + · rw [MonoidHom.comp_apply, + globalNormResidueMonoidHom_infinitePlaceIdeleClass_eq_one_of_real_pos + (K := K) (L := L) v hvReal x hx, + chosenInfinitePlaceArtinMonoidHom_eq_one_of_real_pos + (K := K) (L := L) v hvReal x hx] + · have hglobal : + globalNormResidueMonoidHom K L + (IdeleGroup.infinitePlaceIdeleClass v + ((-1 : v.Completionˣ) * x)) = 1 := + globalNormResidueMonoidHom_infinitePlaceIdeleClass_eq_one_of_real_pos + (K := K) (L := L) v hvReal + ((-1 : v.Completionˣ) * x) hx + have hlocal : + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v + ((-1 : v.Completionˣ) * x) = 1 := + chosenInfinitePlaceArtinMonoidHom_eq_one_of_real_pos + (K := K) (L := L) v hvReal + ((-1 : v.Completionˣ) * x) hx + change + ((globalNormResidueMonoidHom K L).comp + (IdeleGroup.infinitePlaceIdeleClass v)) + ((-1 : v.Completionˣ) * x) = 1 at hglobal + rw [map_mul] at hglobal hlocal + have hglobalX : + globalNormResidueMonoidHom K L + (IdeleGroup.infinitePlaceIdeleClass v x) = + (globalNormResidueMonoidHom K L + (IdeleGroup.infinitePlaceIdeleClass v + (-1 : v.Completionˣ)))⁻¹ := + eq_inv_of_mul_eq_one_right hglobal + have hlocalX : + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v x = + (chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v + (-1 : v.Completionˣ))⁻¹ := + eq_inv_of_mul_eq_one_right hlocal + rw [MonoidHom.comp_apply, hglobalX, hlocalX, hneg] + +/-- For an arbitrary infinite place, the local-global Artin square is +reduced canonically to the negative-one calculation in the real case; +the complex case is already trivial. -/ +theorem + globalNormResidueMonoidHom_comp_infinitePlaceIdeleClass_eq_iff_real_neg_one + (v : InfinitePlace K) : + (globalNormResidueMonoidHom K L).comp + (IdeleGroup.infinitePlaceIdeleClass v) = + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v ↔ + ∀ _hvReal : v.IsReal, + globalNormResidueMonoidHom K L + (IdeleGroup.infinitePlaceIdeleClass v + (-1 : v.Completionˣ)) = + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v + (-1 : v.Completionˣ) := by + constructor + · intro h _hvReal + exact DFunLike.congr_fun h (-1 : v.Completionˣ) + · intro h + rcases v.isReal_or_isComplex with hvReal | hvComplex + · exact + (globalNormResidueMonoidHom_comp_infinitePlaceIdeleClass_eq_iff_neg_one + (K := K) (L := L) v hvReal).2 + (h hvReal) + · exact + globalNormResidueMonoidHom_comp_infinitePlaceIdeleClass_of_isComplex + (K := K) (L := L) v hvComplex + +/-- The global norm-residue homomorphism restricted to a single +archimedean component is the actual local Artin homomorphism at that +place. + +At an unramified archimedean place both maps are trivial. In the only +remaining case, a ramified real place, positivity reduces the equality +to negative one and the complexification overextension identifies its +global symbol with the genuine local complex conjugation. -/ +theorem globalNormResidueMonoidHom_comp_infinitePlaceIdeleClass + (v : InfinitePlace K) : + (globalNormResidueMonoidHom K L).comp + (IdeleGroup.infinitePlaceIdeleClass v) = + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v := by + rw [ + globalNormResidueMonoidHom_comp_infinitePlaceIdeleClass_eq_iff_real_neg_one] + intro _hvReal + by_cases hUnramified : + (chosenInfinitePlaceAbove (L := L) v).IsUnramified K + · exact + DFunLike.congr_fun + (globalNormResidueMonoidHom_comp_infinitePlaceIdeleClass_of_unramified + (K := K) (L := L) v hUnramified) + (-1 : v.Completionˣ) + · exact + globalNormResidueMonoidHom_infinitePlaceIdeleClass_neg_one_of_ramified + (K := K) (L := L) v hUnramified + +/-- One-place archimedean norm membership is exactly membership in the +local determinant-norm subgroup. This is the norm-kernel form of +archimedean local-global Artin compatibility. -/ +theorem infinitePlaceIdeleClass_mem_ideleClassNorm_range_iff + (v : InfinitePlace K) + (x : v.Completionˣ) : + IdeleGroup.infinitePlaceIdeleClass v x ∈ + (_root_.ideleClassNorm K L).range ↔ + x ∈ infiniteTensorNormSubgroup + (K := K) (L := L) v := by + rw [← globalNormResidueMonoidHom_eq_one_iff] + rw [← + chosenInfinitePlaceArtinMonoidHom_eq_one_iff_infiniteTensorNorm + (K := K) (L := L) v x] + have hcompat : + globalNormResidueMonoidHom K L + (IdeleGroup.infinitePlaceIdeleClass v x) = + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v x := by + simpa only [MonoidHom.comp_apply] using + DFunLike.congr_fun + (globalNormResidueMonoidHom_comp_infinitePlaceIdeleClass + (K := K) (L := L) v) x + rw [hcompat] + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean new file mode 100644 index 0000000000..0182d4fb01 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean @@ -0,0 +1,1428 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.InfinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.LocalBlocks +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +public import Mathlib.Algebra.BigOperators.Group.Finset.Lemmas +public import Mathlib.Algebra.Group.Hom.Instances +/-! +# Archimedean Artin homomorphisms + +At a ramified infinite place, the local extension is complex over +real. Its Artin homomorphism sends the sign of a real unit to the +corresponding complex-conjugation element of the decomposition group. +At an unramified infinite place the decomposition group, and hence the +local homomorphism, is trivial. +-/ + +@[expose] public section + +open scoped BigOperators IsMulCommutative NumberField + NumberField.LiesOver +open NumberField IsDedekindDomain +open IdeleGroup RelativeIdeleGroup + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open HilbertRamification +open LocalFieldTheory + +variable {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + +section Galois + +variable [IsGalois K L] + +open scoped Classical in +/-- The Galois automorphism acting as complex conjugation at a ramified infinite place. -/ +noncomputable def ramifiedInfinitePlaceConjugation + (w : InfinitePlace L) (hRamified : w.IsRamified K) : + L ≃ₐ[K] L := + Classical.choose + (InfinitePlace.exists_isConj_of_isRamified + (k := K) (K := L) + ((InfinitePlace.mk_embedding w).symm ▸ hRamified)) + +omit [NumberField K] [NumberField L] in +open scoped Classical in +private theorem ramifiedInfinitePlaceConjugation_isConj + (w : InfinitePlace L) (hRamified : w.IsRamified K) : + NumberField.ComplexEmbedding.IsConj + (InfinitePlace.embedding w) + (ramifiedInfinitePlaceConjugation + (K := K) w hRamified) := + Classical.choose_spec + (InfinitePlace.exists_isConj_of_isRamified + (k := K) (K := L) + ((InfinitePlace.mk_embedding w).symm ▸ hRamified)) + +omit [NumberField K] [NumberField L] in +open scoped Classical in +private theorem ramifiedInfinitePlaceConjugation_sq + (w : InfinitePlace L) (hRamified : w.IsRamified K) : + ramifiedInfinitePlaceConjugation + (K := K) w hRamified * + ramifiedInfinitePlaceConjugation + (K := K) w hRamified = + 1 := by + ext x + simpa using + NumberField.ComplexEmbedding.isConj_apply_apply + (ramifiedInfinitePlaceConjugation_isConj + (K := K) w hRamified) x + +open scoped Classical in +/-- The archimedean Artin homomorphism associated with a specified +infinite place above the base place. -/ +noncomputable def infinitePlaceArtinMonoidHomOfPlace + (v : InfinitePlace K) (w : InfinitePlace L) + (hw : w.comap (algebraMap K L) = v) : + v.Completionˣ →* (L ≃ₐ[K] L) := by + by_cases hUnramified : w.IsUnramified K + · exact 1 + · have hRamified : w.IsRamified K := + hUnramified + have hvReal : v.IsReal := by + rw [← hw] + exact hRamified.isReal + let signToGalois : ℤˣ →* (L ≃ₐ[K] L) := + { toFun := fun u => + if u = 1 then 1 + else + ramifiedInfinitePlaceConjugation + (K := K) w hRamified + map_one' := ite_eq_left rfl + map_mul' := by + intro x y + rcases Int.units_eq_one_or x with rfl | rfl + · simp + rcases Int.units_eq_one_or y with rfl | rfl + · simp + · simp [ + ramifiedInfinitePlaceConjugation_sq + (K := K) w hRamified] } + let completionUnitsEquivRealUnits : + v.Completionˣ ≃* ℝˣ := + Units.mapEquiv + (InfinitePlace.Completion.ringEquivRealOfIsReal + hvReal).toMulEquiv + exact + signToGalois.comp + (LocalClassFieldTheory.realUnitsSign.comp + completionUnitsEquivRealUnits.toMonoidHom) + +open scoped Classical in +/-- The actual local Artin homomorphism at an infinite place, using +the infinite place of `L` already chosen by the local-block API. -/ +noncomputable def chosenInfinitePlaceArtinMonoidHom + (v : InfinitePlace K) : + v.Completionˣ →* (L ≃ₐ[K] L) := + infinitePlaceArtinMonoidHomOfPlace + (K := K) (L := L) v + (chosenInfinitePlaceAbove + (L := L) v) + (chosenInfinitePlaceAbove_comap + (L := L) v) + +omit [NumberField K] [NumberField L] in +open scoped Classical in +/-- At a ramified real place, the actual chosen local Artin symbol of +negative one is complex conjugation along the chosen infinite place +upstairs. The statement exposes the intrinsic property of the Artin +value, without exposing the auxiliary conjugation chosen in its +construction. -/ +theorem chosenInfinitePlaceArtinMonoidHom_neg_one_isConj_of_ramified + (v : InfinitePlace K) + (hRamified : + (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : + NumberField.ComplexEmbedding.IsConj + (InfinitePlace.embedding + (chosenInfinitePlaceAbove (L := L) v)) + (chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v (-1 : v.Completionˣ)) := by + let w := chosenInfinitePlaceAbove (L := L) v + have hw : + w.comap (algebraMap K L) = v := + chosenInfinitePlaceAbove_comap (L := L) v + have hvReal : v.IsReal := by + rw [← hw] + exact hRamified.isReal + have hsign : + LocalClassFieldTheory.realUnitsSign + (Units.mapEquiv + (InfinitePlace.Completion.ringEquivRealOfIsReal + hvReal).toMulEquiv + (-1 : v.Completionˣ)) = + (-1 : ℤˣ) := by + apply Units.ext + simp [LocalClassFieldTheory.realUnitsSign] + have hConj := + ramifiedInfinitePlaceConjugation_isConj + (K := K) w hRamified + change + NumberField.ComplexEmbedding.IsConj + (InfinitePlace.embedding w) + (chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v (-1 : v.Completionˣ)) + have hUnramified : ¬ w.IsUnramified K := hRamified + have hUnramified' : + ¬ (chosenInfinitePlaceAbove (L := L) v).IsUnramified K := by + simpa only [w] using hUnramified + have hsignNe : + LocalClassFieldTheory.realUnitsSign + (Units.mapEquiv + (InfinitePlace.Completion.ringEquivRealOfIsReal + hvReal).toMulEquiv + (-1 : v.Completionˣ)) ≠ 1 := by + rw [hsign] + decide + unfold chosenInfinitePlaceArtinMonoidHom + unfold infinitePlaceArtinMonoidHomOfPlace + simp only [dite_eq_right hUnramified', MonoidHom.comp_apply] + change + NumberField.ComplexEmbedding.IsConj + (InfinitePlace.embedding w) + (if + LocalClassFieldTheory.realUnitsSign + (Units.mapEquiv + (InfinitePlace.Completion.ringEquivRealOfIsReal + hvReal).toMulEquiv + (-1 : v.Completionˣ)) = + 1 then + 1 + else + ramifiedInfinitePlaceConjugation + (K := K) + (chosenInfinitePlaceAbove (L := L) v) + hUnramified') + rw [ite_eq_right hsignNe] + simpa only [w] using hConj + +end Galois + +section AbelianTower + +variable [IsAbelianGalois K L] + +omit [NumberField K] [NumberField L] in +open scoped Classical in +/-- In an abelian extension, the archimedean Artin homomorphism is +independent of the chosen infinite place above the base place. -/ +theorem infinitePlaceArtinMonoidHomOfPlace_eq + (v : InfinitePlace K) + (w w' : InfinitePlace L) + (hw : w.comap (algebraMap K L) = v) + (hw' : w'.comap (algebraMap K L) = v) : + infinitePlaceArtinMonoidHomOfPlace + (K := K) (L := L) v w hw = + infinitePlaceArtinMonoidHomOfPlace + (K := K) (L := L) v w' hw' := by + obtain ⟨g, hg⟩ := + InfinitePlace.exists_smul_eq_of_comap_eq + (hw.trans hw'.symm) + have hUnramified : + w.IsUnramified K ↔ w'.IsUnramified K := by + rw [InfinitePlace.isUnramified_iff, + InfinitePlace.isUnramified_iff, hw, hw'] + rw [← hg, InfinitePlace.isReal_smul_iff] + by_cases hwUnramified : w.IsUnramified K + · have hw'Unramified : w'.IsUnramified K := + hUnramified.mp hwUnramified + simp [infinitePlaceArtinMonoidHomOfPlace, + hwUnramified, hw'Unramified] + · have hw'Unramified : ¬ w'.IsUnramified K := + fun h => hwUnramified (hUnramified.mpr h) + have hwRamified : w.IsRamified K := hwUnramified + have hw'Ramified : w'.IsRamified K := hw'Unramified + let sigma := + ramifiedInfinitePlaceConjugation + (K := K) w hwRamified + let sigma' := + ramifiedInfinitePlaceConjugation + (K := K) w' hw'Ramified + have hsigma := + ramifiedInfinitePlaceConjugation_isConj + (K := K) w hwRamified + have hsigma' := + ramifiedInfinitePlaceConjugation_isConj + (K := K) w' hw'Ramified + have hsigmaMem : + sigma ∈ + MulAction.stabilizer (L ≃ₐ[K] L) w := by + rw [← InfinitePlace.mk_embedding w, + InfinitePlace.mem_stabilizer_mk_iff] + exact Or.inr hsigma + have hsigmaMem' : + sigma ∈ + MulAction.stabilizer (L ≃ₐ[K] L) w' := by + rw [← hg] + rw [MulAction.mem_stabilizer_iff] at hsigmaMem + rw [MulAction.mem_stabilizer_iff] + calc + sigma • (g • w) = + (sigma * g) • w := + (mul_smul sigma g w).symm + _ = (g * sigma) • w := by + rw [mul_comm] + _ = g • (sigma • w) := + mul_smul g sigma w + _ = g • w := by + rw [hsigmaMem] + have hsigmaNe : sigma ≠ 1 := + (NumberField.ComplexEmbedding.isConj_ne_one_iff + hsigma).2 + (InfinitePlace.isComplex_iff.mp + hwRamified.isComplex) + have hsigmaAtW' : + NumberField.ComplexEmbedding.IsConj + (InfinitePlace.embedding w') sigma := by + rw [← InfinitePlace.mk_embedding w', + InfinitePlace.mem_stabilizer_mk_iff] at hsigmaMem' + exact hsigmaMem'.resolve_left hsigmaNe + have hsigmaEq : sigma = sigma' := + hsigmaAtW'.ext hsigma' + apply MonoidHom.ext + intro x + simp [infinitePlaceArtinMonoidHomOfPlace, + hwUnramified, hw'Unramified, + sigma, sigma', hsigmaEq] + +omit [NumberField K] [NumberField L] in +open scoped Classical in +/-- Archimedean Artin homomorphisms attached to specified places commute +with restriction through an abelian tower. -/ +theorem infinitePlaceArtinMonoidHomOfPlace_restrict_tower + {E : Type} + [Field E] + [Algebra K E] [Algebra E L] + [IsScalarTower K E L] + [IsGalois K E] + (v : InfinitePlace K) + (wL : InfinitePlace L) + (hwL : wL.comap (algebraMap K L) = v) + (hwE : + (wL.comap (algebraMap E L)).comap + (algebraMap K E) = v) : + (AlgEquiv.restrictNormalHom E).comp + (infinitePlaceArtinMonoidHomOfPlace + (K := K) (L := L) v wL hwL) = + infinitePlaceArtinMonoidHomOfPlace + (K := K) (L := E) v + (wL.comap (algebraMap E L)) hwE := by + let wE := wL.comap (algebraMap E L) + by_cases hLUnramified : wL.IsUnramified K + · have hEUnramified : wE.IsUnramified K := + hLUnramified.comap E + simp [infinitePlaceArtinMonoidHomOfPlace, + hLUnramified, hEUnramified, wE] + · have hLRamified : wL.IsRamified K := + hLUnramified + have hvReal : v.IsReal := by + rw [← hwL] + exact hLRamified.isReal + let sigmaL := + ramifiedInfinitePlaceConjugation + (K := K) wL hLRamified + let sigmaR : E ≃ₐ[K] E := + AlgEquiv.restrictNormalHom E sigmaL + have hsigmaL := + ramifiedInfinitePlaceConjugation_isConj + (K := K) wL hLRamified + let phi : E →+* ℂ := + (InfinitePlace.embedding wL).comp + (algebraMap E L) + have hphi : + NumberField.ComplexEmbedding.IsConj + phi sigmaR := by + apply RingHom.ext + intro x + change + star + (InfinitePlace.embedding wL + (algebraMap E L x)) = + InfinitePlace.embedding wL + (algebraMap E L (sigmaR x)) + rw [show + algebraMap E L (sigmaR x) = + sigmaL (algebraMap E L x) by + dsimp [sigmaR] + exact AlgEquiv.restrictNormal_commutes sigmaL E x] + exact (hsigmaL.eq (algebraMap E L x)).symm + have hmk : InfinitePlace.mk phi = wE := by + change + InfinitePlace.mk + ((InfinitePlace.embedding wL).comp + (algebraMap E L)) = + wL.comap (algebraMap E L) + conv_rhs => rw [← InfinitePlace.mk_embedding wL] + rw [InfinitePlace.comap_mk] + by_cases hEUnramified : wE.IsUnramified K + · have hEUnramified' : + (wL.comap (algebraMap E L)).IsUnramified K := by + simpa only [wE] using hEUnramified + have hsigmaR : sigmaR = 1 := + hphi.isUnramified_mk_iff.mp + (hmk.symm ▸ hEUnramified) + apply MonoidHom.ext + intro x + unfold infinitePlaceArtinMonoidHomOfPlace + rw [dite_eq_right hLUnramified, dite_eq_left hEUnramified'] + simp only [MonoidHom.comp_apply] + dsimp + split_ifs with hsign + · simp + · simpa [sigmaR, sigmaL] using hsigmaR + · have hEUnramified' : + ¬ (wL.comap (algebraMap E L)).IsUnramified K := by + simpa only [wE] using hEUnramified + have hERamified : wE.IsRamified K := + hEUnramified + let sigmaE := + ramifiedInfinitePlaceConjugation + (K := K) wE hERamified + have hsigmaE := + ramifiedInfinitePlaceConjugation_isConj + (K := K) wE hERamified + have hsigmaRNe : sigmaR ≠ 1 := by + intro hsigmaR + have : + (InfinitePlace.mk phi).IsUnramified K := + hphi.isUnramified_mk_iff.mpr hsigmaR + exact hEUnramified (hmk ▸ this) + have hsigmaRMem : + sigmaR ∈ + MulAction.stabilizer (E ≃ₐ[K] E) wE := by + rw [← hmk, + InfinitePlace.mem_stabilizer_mk_iff] + exact Or.inr hphi + have hsigmaRAtWE : + NumberField.ComplexEmbedding.IsConj + (InfinitePlace.embedding wE) sigmaR := by + rw [← InfinitePlace.mk_embedding wE, + InfinitePlace.mem_stabilizer_mk_iff] at hsigmaRMem + exact hsigmaRMem.resolve_left hsigmaRNe + have hsigmaREq : sigmaR = sigmaE := + hsigmaRAtWE.ext hsigmaE + apply MonoidHom.ext + intro x + unfold infinitePlaceArtinMonoidHomOfPlace + rw [dite_eq_right hLUnramified, dite_eq_right hEUnramified'] + simp only [MonoidHom.comp_apply] + dsimp + split_ifs with hsign + · simp + · simpa [sigmaR, sigmaL, sigmaE] using hsigmaREq + +open scoped Classical in +/-- The norm from a complex archimedean completion to a real completion +is positive under the canonical real coordinate. -/ +theorem infinitePlace_normUnits_real_complex_pos + {K' : Type} + [Field K'] [NumberField K'] [Algebra K K'] + (v : InfinitePlace K) (W : InfinitePlace K') + (hW : W.comap (algebraMap K K') = v) + (hvReal : v.IsReal) (hWComplex : W.IsComplex) + (x : W.Completionˣ) : + letI : W.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) hW⟩ + 0 < + InfinitePlace.Completion.ringEquivRealOfIsReal + hvReal + (LocalFieldTheory.normUnits + v.Completion W.Completion x : + v.Completion) := by + let : W.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) hW⟩ + let eReal : + v.Completion ≃+* ℝ := + InfinitePlace.Completion.ringEquivRealOfIsReal + hvReal + let eComplex : + W.Completion ≃+* ℂ := + InfinitePlace.Completion.ringEquivComplexOfIsComplex + hWComplex + let : + NumberField.ComplexEmbedding.LiesOver + (InfinitePlace.Completion.extensionEmbedding W) + (InfinitePlace.Completion.extensionEmbedding v) := + InfinitePlace.LiesOver.extensionEmbedding_liesOver_of_isReal + W hvReal + have hCompatible : + RingHom.comp (algebraMap ℝ ℂ) eReal = + RingHom.comp eComplex + (algebraMap v.Completion W.Completion) := by + ext z + simp [eReal, eComplex] + have hNorm := + LocalClassFieldTheory.normUnits_map_ringEquiv + eReal eComplex hCompatible x + have hNormVal := congrArg Units.val hNorm + change + 0 < + ((Units.mapEquiv eReal.toMulEquiv + (LocalFieldTheory.normUnits + v.Completion W.Completion x) : ℝˣ) : ℝ) + rw [hNormVal] + change + 0 < + Algebra.norm ℝ + (eComplex (x : W.Completion)) + rw [Algebra.norm_complex_apply, Complex.normSq_pos] + exact (map_ne_zero eComplex).2 (Units.ne_zero x) + +open scoped Classical in +/-- The norm between real archimedean completions agrees with the +transported local unit under their canonical real coordinates. -/ +theorem infinitePlace_normUnits_real_real + {K' : Type} + [Field K'] [NumberField K'] [Algebra K K'] + (v : InfinitePlace K) (W : InfinitePlace K') + (hW : W.comap (algebraMap K K') = v) + (hvReal : v.IsReal) (hWReal : W.IsReal) + (x : W.Completionˣ) : + letI : W.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) hW⟩ + Units.mapEquiv + (InfinitePlace.Completion.ringEquivRealOfIsReal + hvReal).toMulEquiv + (LocalFieldTheory.normUnits + v.Completion W.Completion x) = + Units.mapEquiv + (InfinitePlace.Completion.ringEquivRealOfIsReal + hWReal).toMulEquiv x := by + let : W.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) hW⟩ + let eBase : + v.Completion ≃+* ℝ := + InfinitePlace.Completion.ringEquivRealOfIsReal + hvReal + let eExtension : + W.Completion ≃+* ℝ := + InfinitePlace.Completion.ringEquivRealOfIsReal + hWReal + let : + NumberField.ComplexEmbedding.LiesOver + (InfinitePlace.Completion.extensionEmbedding W) + (InfinitePlace.Completion.extensionEmbedding v) := + InfinitePlace.LiesOver.extensionEmbedding_liesOver_of_isReal + W hvReal + have hCompatible : + RingHom.comp (algebraMap ℝ ℝ) eBase = + RingHom.comp eExtension + (algebraMap v.Completion W.Completion) := by + ext z + change + InfinitePlace.Completion.extensionEmbeddingOfIsReal + hvReal z = + InfinitePlace.Completion.extensionEmbeddingOfIsReal + hWReal ((algebraMap v.Completion W.Completion) z) + apply Complex.ofReal_injective + simpa only [ + InfinitePlace.Completion.extensionEmbeddingOfIsReal_apply] using + (InfinitePlace.Completion.liesOver_extensionEmbedding_apply + W (v := v)).symm + simpa only [ + LocalFieldTheory.normUnits, + Algebra.norm_self, + Units.map_id, + MonoidHom.id_apply + ] using + LocalClassFieldTheory.normUnits_map_ringEquiv + eBase eExtension hCompatible x + +omit [NumberField K] [NumberField L] in +/-- Complex conjugation restricts along a compatible tower of field embeddings. -/ +private theorem complexEmbedding_isConj_restriction + {K' L' : Type} [Field K'] [Field L'] + [Algebra K K'] [Algebra K' L'] [Algebra K L'] [IsScalarTower K K' L'] + [Algebra L L'] [IsScalarTower K L L'] + (σ : L' ≃ₐ[K'] L') (φ : L' →+* ℂ) + (hφ : NumberField.ComplexEmbedding.IsConj φ σ) : + NumberField.ComplexEmbedding.IsConj (φ.comp (algebraMap L L')) + (((AlgEquiv.restrictNormalHom L).comp (AlgEquiv.restrictScalarsHom K)) σ) := by + apply RingHom.ext + intro x + change star (φ (algebraMap L L' x)) = + φ (algebraMap L L' ((AlgEquiv.restrictNormal (AlgEquiv.restrictScalars K σ) L) x)) + rw [AlgEquiv.restrictNormal_commutes] + exact (hφ.eq (algebraMap L L' x)).symm + +omit [NumberField L] in +open scoped Classical in +/-- The archimedean Artin map attached to specified places carries a +local norm to the restriction of the upper Artin element. -/ +theorem infinitePlaceArtinMonoidHomOfPlace_norm_restriction + {K' L' : Type} + [Field K'] [NumberField K'] + [Field L'] + [Algebra K K'] [Algebra K' L'] [Algebra K L'] + [IsScalarTower K K' L'] + [Algebra L L'] [IsScalarTower K L L'] + [IsAbelianGalois K' L'] + (v : InfinitePlace K) (W : InfinitePlace K') + (w' : InfinitePlace L') + (hW : W.comap (algebraMap K K') = v) + (hw' : w'.comap (algebraMap K' L') = W) : + let w := w'.comap (algebraMap L L') + let hw : w.comap (algebraMap K L) = v := by + dsimp only [w] + rw [← InfinitePlace.comap_comp, + ← IsScalarTower.algebraMap_eq K L L', + IsScalarTower.algebraMap_eq K K' L', + InfinitePlace.comap_comp, hw', hW] + letI : W.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) hW⟩ + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)).comp + (infinitePlaceArtinMonoidHomOfPlace + (K := K') (L := L') W w' hw') = + (infinitePlaceArtinMonoidHomOfPlace + (K := K) (L := L) v w hw).comp + (LocalFieldTheory.normUnits + v.Completion W.Completion) := by + let w := w'.comap (algebraMap L L') + have hw : + w.comap (algebraMap K L) = v := by + dsimp only [w] + rw [← InfinitePlace.comap_comp, + ← IsScalarTower.algebraMap_eq K L L', + IsScalarTower.algebraMap_eq K K' L', + InfinitePlace.comap_comp, hw', hW] + let : W.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) hW⟩ + dsimp only + by_cases hUpperUnramified : w'.IsUnramified K' + · by_cases hLowerUnramified : w.IsUnramified K + · have hLowerUnramified' : + (w'.comap (algebraMap L L')).IsUnramified K := by + simpa only [w] using hLowerUnramified + unfold infinitePlaceArtinMonoidHomOfPlace + rw [dite_eq_left hUpperUnramified, dite_eq_left hLowerUnramified'] + simp + · have hLowerUnramified' : + ¬ (w'.comap (algebraMap L L')).IsUnramified K := by + simpa only [w] using hLowerUnramified + have hLowerRamified : w.IsRamified K := + hLowerUnramified + have hvReal : v.IsReal := by + rw [← hw] + exact hLowerRamified.isReal + have hw'Complex : w'.IsComplex := by + rw [← InfinitePlace.not_isReal_iff_isComplex] + intro hw'Real + have hwReal : w.IsReal := by + exact hw'Real.comap (algebraMap L L') + exact + (InfinitePlace.not_isComplex_iff_isReal.mpr + hwReal) hLowerRamified.isComplex + have hWComplex : W.IsComplex := by + rcases + InfinitePlace.isUnramified_iff.mp + hUpperUnramified with + hw'Real | hWComplex + · exact + (InfinitePlace.not_isReal_iff_isComplex.mpr + hw'Complex hw'Real).elim + · simpa only [hw'] using hWComplex + apply MonoidHom.ext + intro x + have hPositive := + infinitePlace_normUnits_real_complex_pos + (K := K) v W hW hvReal hWComplex x + have hSign : + LocalClassFieldTheory.realUnitsSign + (Units.mapEquiv + (InfinitePlace.Completion.ringEquivRealOfIsReal + hvReal).toMulEquiv + (LocalFieldTheory.normUnits + v.Completion W.Completion x)) = + 1 := + MonoidHom.mem_ker.mp + ((LocalClassFieldTheory.mem_realUnitsSign_ker_iff _).2 + hPositive) + unfold infinitePlaceArtinMonoidHomOfPlace + rw [dite_eq_left hUpperUnramified, dite_eq_right hLowerUnramified'] + simp only [MonoidHom.comp_apply] + dsimp + split_ifs with hsign + · exact map_one _ + · exact (hsign hSign).elim + · have hUpperRamified : w'.IsRamified K' := + hUpperUnramified + have hWReal : W.IsReal := by + rw [← hw'] + exact hUpperRamified.isReal + have hvReal : v.IsReal := by + rw [← hW] + exact hWReal.comap (algebraMap K K') + let sigmaUpper := + ramifiedInfinitePlaceConjugation + (K := K') w' hUpperRamified + let sigmaRestricted : L ≃ₐ[K] L := + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) sigmaUpper + have hSigmaUpper := + ramifiedInfinitePlaceConjugation_isConj + (K := K') w' hUpperRamified + let phi : L →+* ℂ := + (InfinitePlace.embedding w').comp + (algebraMap L L') + have hphi : NumberField.ComplexEmbedding.IsConj phi sigmaRestricted := + complexEmbedding_isConj_restriction sigmaUpper (InfinitePlace.embedding w') hSigmaUpper + have hmk : InfinitePlace.mk phi = w := by + change + InfinitePlace.mk + ((InfinitePlace.embedding w').comp + (algebraMap L L')) = + w'.comap (algebraMap L L') + conv_rhs => rw [← InfinitePlace.mk_embedding w'] + rw [InfinitePlace.comap_mk] + have hSign (x : W.Completionˣ) : + LocalClassFieldTheory.realUnitsSign + (Units.mapEquiv + (InfinitePlace.Completion.ringEquivRealOfIsReal + hWReal).toMulEquiv x) = + LocalClassFieldTheory.realUnitsSign + (Units.mapEquiv + (InfinitePlace.Completion.ringEquivRealOfIsReal + hvReal).toMulEquiv + (LocalFieldTheory.normUnits + v.Completion W.Completion x)) := by + rw [infinitePlace_normUnits_real_real + (K := K) v W hW hvReal hWReal x] + by_cases hLowerUnramified : w.IsUnramified K + · have hLowerUnramified' : + (w'.comap (algebraMap L L')).IsUnramified K := by + simpa only [w] using hLowerUnramified + have hSigmaRestricted : sigmaRestricted = 1 := + hphi.isUnramified_mk_iff.mp + (hmk.symm ▸ hLowerUnramified) + apply MonoidHom.ext + intro x + unfold infinitePlaceArtinMonoidHomOfPlace + rw [dite_eq_right hUpperUnramified, dite_eq_left hLowerUnramified'] + simp only [MonoidHom.comp_apply] + dsimp + split_ifs with hsign + · change + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) 1 = + 1 + exact map_one _ + · simpa [sigmaRestricted, sigmaUpper] using hSigmaRestricted + · have hLowerUnramified' : + ¬ (w'.comap (algebraMap L L')).IsUnramified K := by + simpa only [w] using hLowerUnramified + have hLowerRamified : w.IsRamified K := + hLowerUnramified + let sigmaLower := + ramifiedInfinitePlaceConjugation + (K := K) w hLowerRamified + have hSigmaLower := + ramifiedInfinitePlaceConjugation_isConj + (K := K) w hLowerRamified + have hSigmaRestrictedNe : + sigmaRestricted ≠ 1 := by + intro hSigmaRestricted + have : + (InfinitePlace.mk phi).IsUnramified K := + hphi.isUnramified_mk_iff.mpr + hSigmaRestricted + exact hLowerUnramified (hmk ▸ this) + have hSigmaRestrictedMem : + sigmaRestricted ∈ + MulAction.stabilizer + (L ≃ₐ[K] L) w := by + rw [← hmk, + InfinitePlace.mem_stabilizer_mk_iff] + exact Or.inr hphi + have hSigmaRestrictedAtW : + NumberField.ComplexEmbedding.IsConj + (InfinitePlace.embedding w) + sigmaRestricted := by + rw [← InfinitePlace.mk_embedding w, + InfinitePlace.mem_stabilizer_mk_iff] at hSigmaRestrictedMem + exact + hSigmaRestrictedMem.resolve_left + hSigmaRestrictedNe + have hSigmaEq : + sigmaRestricted = sigmaLower := + hSigmaRestrictedAtW.ext hSigmaLower + apply MonoidHom.ext + intro x + unfold infinitePlaceArtinMonoidHomOfPlace + rw [dite_eq_right hUpperUnramified, dite_eq_right hLowerUnramified'] + simp only [MonoidHom.comp_apply] + dsimp + split_ifs with hsignUpper hsignLower hsignLower + · exact map_one _ + · exact (hsignLower ((hSign x).symm.trans hsignUpper)).elim + · exact (hsignUpper ((hSign x).trans hsignLower)).elim + · simpa [sigmaRestricted, sigmaUpper, sigmaLower] using hSigmaEq + +omit [NumberField K] [NumberField L] in +open scoped Classical in +/-- Archimedean local factors commute with restriction in an abelian +number-field tower. -/ +theorem chosenInfinitePlaceArtinMonoidHom_restrict_tower + {E : Type} + [Field E] [NumberField E] + [Algebra K E] [Algebra E L] + [IsScalarTower K E L] + [IsAbelianGalois K E] + (v : InfinitePlace K) : + (AlgEquiv.restrictNormalHom E).comp + (chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v) = + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := E) v := by + let wL := + chosenInfinitePlaceAbove + (L := L) v + let wE := wL.comap (algebraMap E L) + have hwL : + wL.comap (algebraMap K L) = v := + chosenInfinitePlaceAbove_comap + (L := L) v + have hwE : + wE.comap (algebraMap K E) = v := by + dsimp only [wE] + rw [← InfinitePlace.comap_comp, + ← IsScalarTower.algebraMap_eq K E L, hwL] + calc + (AlgEquiv.restrictNormalHom E).comp + (chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v) = + infinitePlaceArtinMonoidHomOfPlace + (K := K) (L := E) v wE hwE := + infinitePlaceArtinMonoidHomOfPlace_restrict_tower + (K := K) (L := L) (E := E) + v wL hwL hwE + _ = chosenInfinitePlaceArtinMonoidHom + (K := K) (L := E) v := + infinitePlaceArtinMonoidHomOfPlace_eq + (K := K) (L := E) v wE + (chosenInfinitePlaceAbove + (L := E) v) + hwE + (chosenInfinitePlaceAbove_comap + (L := E) v) + +omit [NumberField L] in +open scoped Classical in +/-- In an actual number-field diamond `K ⊂ K'`, `L ⊂ L'`, the +archimedean local Artin factor commutes with the ordinary completion +norm and with the standard restriction composite supplied by mathlib. -/ +theorem chosenInfinitePlaceArtinMonoidHom_norm_restriction + {K' L' : Type} + [Field K'] [NumberField K'] + [Field L'] [NumberField L'] + [Algebra K K'] [Algebra K' L'] [Algebra K L'] + [IsScalarTower K K' L'] + [Algebra L L'] [IsScalarTower K L L'] + [IsAbelianGalois K' L'] + (W : InfinitePlace K') : + let v := infinitePlaceBelow (K := K) W + letI : W.1.LiesOver v.1 := ⟨rfl⟩ + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)).comp + (chosenInfinitePlaceArtinMonoidHom + (K := K') (L := L') W) = + (chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v).comp + (LocalFieldTheory.normUnits + v.Completion W.Completion) := by + let v := infinitePlaceBelow (K := K) W + let w' := + chosenInfinitePlaceAbove + (L := L') W + let w := w'.comap (algebraMap L L') + have hW : + W.comap (algebraMap K K') = v := rfl + have hw' : + w'.comap (algebraMap K' L') = W := + chosenInfinitePlaceAbove_comap + (L := L') W + have hw : + w.comap (algebraMap K L) = v := by + dsimp only [w] + rw [← InfinitePlace.comap_comp, + ← IsScalarTower.algebraMap_eq K L L', + IsScalarTower.algebraMap_eq K K' L', + InfinitePlace.comap_comp, hw', hW] + let : W.1.LiesOver v.1 := ⟨rfl⟩ + calc + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)).comp + (chosenInfinitePlaceArtinMonoidHom + (K := K') (L := L') W) = + (infinitePlaceArtinMonoidHomOfPlace + (K := K) (L := L) v w hw).comp + (LocalFieldTheory.normUnits + v.Completion W.Completion) := + infinitePlaceArtinMonoidHomOfPlace_norm_restriction + (K := K) (L := L) v W w' hW hw' + _ = + (chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v).comp + (LocalFieldTheory.normUnits + v.Completion W.Completion) := by + rw [chosenInfinitePlaceArtinMonoidHom] + rw [infinitePlaceArtinMonoidHomOfPlace_eq + (K := K) (L := L) v w + (chosenInfinitePlaceAbove + (L := L) v) + hw + (chosenInfinitePlaceAbove_comap + (L := L) v)] + +end AbelianTower + +section Galois + +variable [IsGalois K L] + +omit [NumberField K] [NumberField L] in +open scoped Classical in +/-- The chosen archimedean Artin homomorphism is continuous. -/ +theorem chosenInfinitePlaceArtinMonoidHom_continuous + (v : InfinitePlace K) : + Continuous + (chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v) := by + classical + let w := + chosenInfinitePlaceAbove + (L := L) v + by_cases hUnramified : w.IsUnramified K + · have hUnramified' : + (chosenInfinitePlaceAbove (L := L) v).IsUnramified K := by + simpa only [w] using hUnramified + unfold chosenInfinitePlaceArtinMonoidHom + unfold infinitePlaceArtinMonoidHomOfPlace + rw [dite_eq_left hUnramified'] + exact continuous_const + · have hUnramified' : + ¬ (chosenInfinitePlaceAbove (L := L) v).IsUnramified K := by + simpa only [w] using hUnramified + have hRamified : w.IsRamified K := hUnramified + have hvReal : v.IsReal := by + rw [← chosenInfinitePlaceAbove_comap (L := L) v] + exact hRamified.isReal + let e : v.Completionˣ ≃ₜ* ℝˣ := + Units.mapContinuousMulEquiv + (RayClass.realCompletionContinuousMulEquiv v hvReal) + let signToGalois : ℤˣ → (L ≃ₐ[K] L) := + fun u => + if u = 1 then 1 + else + ramifiedInfinitePlaceConjugation + (K := K) + (chosenInfinitePlaceAbove (L := L) v) + hUnramified' + have hSignToGalois : Continuous signToGalois := + continuous_of_discreteTopology + have hMap : + Continuous fun x : v.Completionˣ => + Units.mapEquiv + (InfinitePlace.Completion.ringEquivRealOfIsReal + hvReal).toMulEquiv x := by + change Continuous e + exact e.continuous_toFun + unfold chosenInfinitePlaceArtinMonoidHom + unfold infinitePlaceArtinMonoidHomOfPlace + rw [dite_eq_right hUnramified'] + change + Continuous fun x : v.Completionˣ => + signToGalois + (LocalClassFieldTheory.realUnitsSign + (Units.mapEquiv + (InfinitePlace.Completion.ringEquivRealOfIsReal + hvReal).toMulEquiv x)) + exact hSignToGalois.comp + (LocalClassFieldTheory.realUnitsSign_continuous.comp hMap) + +omit [NumberField K] [NumberField L] in +open scoped Classical in +/-- A positive element at a real place has trivial archimedean Artin +symbol. -/ +theorem chosenInfinitePlaceArtinMonoidHom_eq_one_of_real_pos + (v : InfinitePlace K) (hvReal : v.IsReal) + (x : v.Completionˣ) + (hx : + 0 < + InfinitePlace.Completion.ringEquivRealOfIsReal + hvReal (x : v.Completion)) : + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v x = 1 := by + let e : v.Completion ≃+* ℝ := + InfinitePlace.Completion.ringEquivRealOfIsReal + hvReal + let eu : v.Completionˣ ≃* ℝˣ := + Units.mapEquiv e.toMulEquiv + have hx' : 0 < (eu x : ℝ) := by + simpa [eu, e] using hx + have hsign : + LocalClassFieldTheory.realUnitsSign (eu x) = 1 := + MonoidHom.mem_ker.mp + ((LocalClassFieldTheory.mem_realUnitsSign_ker_iff + (eu x)).2 hx') + have hsign' : + LocalClassFieldTheory.realUnitsSign + (Units.mapEquiv + (InfinitePlace.Completion.ringEquivRealOfIsReal + hvReal).toMulEquiv x) = 1 := by + simpa [eu, e] using hsign + let w := + chosenInfinitePlaceAbove + (L := L) v + by_cases hUnramified : w.IsUnramified K + · have hUnramified' : + (chosenInfinitePlaceAbove (L := L) v).IsUnramified K := by + simpa only [w] using hUnramified + unfold chosenInfinitePlaceArtinMonoidHom + unfold infinitePlaceArtinMonoidHomOfPlace + rw [dite_eq_left hUnramified'] + rfl + · have hUnramified' : + ¬ (chosenInfinitePlaceAbove (L := L) v).IsUnramified K := by + simpa only [w] using hUnramified + unfold chosenInfinitePlaceArtinMonoidHom + unfold infinitePlaceArtinMonoidHomOfPlace + rw [dite_eq_right hUnramified'] + simp only [MonoidHom.comp_apply] + change + (if + LocalClassFieldTheory.realUnitsSign + (Units.mapEquiv + (InfinitePlace.Completion.ringEquivRealOfIsReal + hvReal).toMulEquiv x) = + 1 then + 1 + else _) = + 1 + rw [hsign'] + simp + +universe uNorm vNorm + +/-- Compatible changes of both fields carry the local norm subgroup to the new norm subgroup. -/ +private theorem localNormSubgroup_map_ringEquivs + {F E : Type uNorm} {F' E' : Type vNorm} + [Field F] [Field E] [Field F'] [Field E'] + [Algebra F E] [Algebra F' E'] (eBase : F ≃+* F') (eExtension : E ≃+* E') + (hCompatible : (algebraMap F' E').comp eBase.toRingHom = + eExtension.toRingHom.comp (algebraMap F E)) : + (localNormSubgroup F E).map (Units.mapEquiv eBase.toMulEquiv).toMonoidHom = + localNormSubgroup F' E' := by + let eExtensionUnits := Units.mapEquiv eExtension.toMulEquiv + ext x + constructor + · rintro ⟨_, ⟨y, rfl⟩, rfl⟩ + exact ⟨eExtensionUnits y, + (LocalClassFieldTheory.normUnits_map_ringEquiv eBase eExtension hCompatible y).symm⟩ + · rintro ⟨y, rfl⟩ + refine ⟨normUnits F E (eExtensionUnits.symm y), ⟨_, rfl⟩, ?_⟩ + change Units.mapEquiv eBase.toMulEquiv (normUnits F E (eExtensionUnits.symm y)) = _ + rw [LocalClassFieldTheory.normUnits_map_ringEquiv eBase eExtension hCompatible] + exact congrArg (normUnits F' E') (eExtensionUnits.apply_symm_apply y) + +open scoped Classical in +/-- The kernel of the actual Artin homomorphism at an infinite place +is exactly the determinant-norm image on the corresponding tensor +factor. -/ +theorem chosenInfinitePlaceArtinMonoidHom_ker + (v : InfinitePlace K) : + MonoidHom.ker + (chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v) = + infiniteTensorNormSubgroup + (K := K) (L := L) v := by + let w := + chosenInfinitePlaceAbove + (L := L) v + have hw : + w.comap (algebraMap K L) = v := + chosenInfinitePlaceAbove_comap + (L := L) v + let : w.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) hw⟩ + rw [ + infiniteTensorNormSubgroup_eq_localNormSubgroup + (K := K) (L := L) v w hw] + by_cases hUnramified : w.IsUnramified K + · have hDegree : + Module.finrank v.Completion w.Completion = 1 := + InfinitePlace.IsUnramified.finrank_eq_one v hUnramified + have hNormTop : + localNormSubgroup + v.Completion w.Completion = ⊤ := by + apply top_unique + intro x _ + refine + ⟨Units.map + (algebraMap + v.Completion w.Completion).toMonoidHom x, + ?_⟩ + apply Units.ext + change + Algebra.norm v.Completion + (algebraMap v.Completion w.Completion + (x : v.Completion)) = + (x : v.Completion) + rw [Algebra.norm_algebraMap, hDegree, pow_one] + rw [hNormTop, MonoidHom.ker_eq_top_iff] + have hUnramified' : + (chosenInfinitePlaceAbove (L := L) v).IsUnramified K := by + simpa only [w] using hUnramified + unfold chosenInfinitePlaceArtinMonoidHom + unfold infinitePlaceArtinMonoidHomOfPlace + rw [dite_eq_left hUnramified'] + · have hRamified : w.IsRamified K := + hUnramified + have hvReal : v.IsReal := by + rw [← hw] + exact hRamified.isReal + let σ := + ramifiedInfinitePlaceConjugation + (K := K) w hRamified + have hσ := + ramifiedInfinitePlaceConjugation_isConj + (K := K) w hRamified + have hσsq : σ * σ = 1 := by + exact + ramifiedInfinitePlaceConjugation_sq + (K := K) w hRamified + let signToGalois : ℤˣ →* (L ≃ₐ[K] L) := + { toFun := fun u => + if u = 1 then 1 else σ + map_one' := ite_eq_left rfl + map_mul' := by + intro x y + rcases Int.units_eq_one_or x with rfl | rfl + · simp + rcases Int.units_eq_one_or y with rfl | rfl + · simp + · simp [hσsq] } + have hσne : σ ≠ 1 := + (NumberField.ComplexEmbedding.isConj_ne_one_iff + hσ).2 + (InfinitePlace.isComplex_iff.mp + hRamified.isComplex) + have hSignInjective : + Function.Injective signToGalois := by + intro x y hxy + rcases Int.units_eq_one_or x with rfl | rfl + · rcases Int.units_eq_one_or y with rfl | rfl + · rfl + · exfalso + apply hσne + simpa [signToGalois] using + hxy.symm + · rcases Int.units_eq_one_or y with rfl | rfl + · exfalso + apply hσne + simpa [signToGalois] using + hxy + · rfl + let eRealField : + v.Completion ≃+* ℝ := + InfinitePlace.Completion.ringEquivRealOfIsReal + hvReal + let completionUnitsEquivRealUnits : + v.Completionˣ ≃* ℝˣ := + Units.mapEquiv eRealField.toMulEquiv + have hwComplex : w.IsComplex := + hRamified.isComplex + let eComplexField : + w.Completion ≃+* ℂ := + InfinitePlace.Completion.ringEquivComplexOfIsComplex + hwComplex + let eComplexUnits : + w.Completionˣ ≃* ℂˣ := + Units.mapEquiv eComplexField.toMulEquiv + let : + NumberField.ComplexEmbedding.LiesOver + (InfinitePlace.Completion.extensionEmbedding w) + (InfinitePlace.Completion.extensionEmbedding v) := + InfinitePlace.LiesOver.extensionEmbedding_liesOver_of_isReal + w hvReal + have hCompletionCompatible : + RingHom.comp (algebraMap ℝ ℂ) eRealField = + RingHom.comp eComplexField + (algebraMap v.Completion w.Completion) := by + ext x + simp [eRealField, eComplexField] + have hCompletionCompatibleSymm := + LocalClassFieldTheory.ringEquiv_compat_symm + eRealField eComplexField hCompletionCompatible + have hRealComplexNormTransport : + (localNormSubgroup ℝ ℂ).map completionUnitsEquivRealUnits.symm.toMonoidHom = + localNormSubgroup v.Completion w.Completion := + localNormSubgroup_map_ringEquivs eRealField.symm eComplexField.symm + hCompletionCompatibleSymm + simp only [chosenInfinitePlaceArtinMonoidHom, + infinitePlaceArtinMonoidHomOfPlace, + w, hUnramified] + change + MonoidHom.ker + (signToGalois.comp + (LocalClassFieldTheory.realUnitsSign.comp + completionUnitsEquivRealUnits.toMonoidHom)) = + localNormSubgroup + v.Completion w.Completion + calc + MonoidHom.ker + (signToGalois.comp + (LocalClassFieldTheory.realUnitsSign.comp + completionUnitsEquivRealUnits.toMonoidHom)) = + MonoidHom.ker + (LocalClassFieldTheory.realUnitsSign.comp + completionUnitsEquivRealUnits.toMonoidHom) := + MonoidHom.ker_comp_of_injective _ _ hSignInjective + _ = + Subgroup.map completionUnitsEquivRealUnits.symm.toMonoidHom + (MonoidHom.ker LocalClassFieldTheory.realUnitsSign) := + MonoidHom.ker_comp_mulEquiv + LocalClassFieldTheory.realUnitsSign + completionUnitsEquivRealUnits + _ = + Subgroup.map completionUnitsEquivRealUnits.symm.toMonoidHom + (localNormSubgroup ℝ ℂ) := by + rw [LocalClassFieldTheory.realUnitsSign_ker_eq_complexNormSubgroup] + _ = localNormSubgroup v.Completion w.Completion := + hRealComplexNormTransport + +end Galois + +variable [IsAbelianGalois K L] + +open scoped Classical in +/-- The product of the actual archimedean local Artin homomorphisms +over the finite set of infinite places of `K`. -/ +noncomputable def infinitePlaceGlobalArtinMonoidHom : + IdeleGroup K →* (L ≃ₐ[K] L) := + ∏ v : InfinitePlace K, + (chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v).comp + (IdeleGroup.infiniteComponent v) + +omit [NumberField L] in +open scoped Classical in +/-- The archimedean global Artin product is continuous. -/ +theorem infinitePlaceGlobalArtinMonoidHom_continuous : + Continuous + (infinitePlaceGlobalArtinMonoidHom + (K := K) (L := L)) := by + unfold infinitePlaceGlobalArtinMonoidHom + rw [MonoidHom.coe_finsetProd] + have hprod : + (∏ v : InfinitePlace K, + ⇑((chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v).comp + (IdeleGroup.infiniteComponent v))) = + fun a : IdeleGroup K => + ∏ v : InfinitePlace K, + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v + (IdeleGroup.infiniteComponent v a) := by + funext a + simp only [Finset.prod_apply, MonoidHom.comp_apply] + rw [hprod] + apply continuous_finsetProd Finset.univ + intro v _ + exact + (chosenInfinitePlaceArtinMonoidHom_continuous + (K := K) (L := L) v).comp + (IdeleGroup.infiniteComponentContinuous v).continuous + +omit [NumberField L] in +open scoped Classical in +/-- The archimedean Artin product after an idele norm is the product, +over all infinite places upstairs, of the base local Artin maps applied +to the corresponding local field norms. -/ +theorem infinitePlaceGlobalArtinMonoidHom_norm_eq_prod + {M : Type} + [Field M] [NumberField M] [Algebra K M] + (a : IdeleGroup M) : + letI : ∀ W : InfinitePlace M, + W.1.LiesOver + (infinitePlaceBelow (K := K) W).1 := + fun _ => ⟨rfl⟩ + infinitePlaceGlobalArtinMonoidHom + (K := K) (L := L) + (IdeleGroup.norm K M a) = + ∏ W : InfinitePlace M, + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) + (infinitePlaceBelow (K := K) W) + (LocalFieldTheory.normUnits + (infinitePlaceBelow + (K := K) W).Completion + W.Completion + (IdeleGroup.infiniteComponent W a)) := by + classical + let : ∀ W : InfinitePlace M, + W.1.LiesOver + (infinitePlaceBelow (K := K) W).1 := + fun _ => ⟨rfl⟩ + let factor : InfinitePlace M → (L ≃ₐ[K] L) := + fun W => + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) + (infinitePlaceBelow (K := K) W) + (LocalFieldTheory.normUnits + (infinitePlaceBelow + (K := K) W).Completion + W.Completion + (IdeleGroup.infiniteComponent W a)) + unfold infinitePlaceGlobalArtinMonoidHom + rw [MonoidHom.finsetProd_apply] + change + (∏ v : InfinitePlace K, + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v + (IdeleGroup.infiniteComponent v + (IdeleGroup.norm K M a))) = + ∏ W : InfinitePlace M, factor W + calc + (∏ v : InfinitePlace K, + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) v + (IdeleGroup.infiniteComponent v + (IdeleGroup.norm K M a))) = + ∏ v : InfinitePlace K, + ∏ W ∈ Finset.univ with + infinitePlaceBelow (K := K) W = v, + factor W := by + apply Finset.prod_congr rfl + intro v _ + let vK := v.1 + let hvK : vK.IsNontrivial := v.isNontrivial + let eAbove := + infinitePlaceAboveEquivExtension + (K := K) (L := M) v + let := + AlgebraicNumberTheory.Valuations.completionTensorDecompositionExtensionFintype + (K := K) (L := M) vK hvK + let : Fintype {W : InfinitePlace M // + infinitePlaceBelow (K := K) W = v} := + Fintype.ofEquiv + (AlgebraicNumberTheory.Valuations.AbsoluteValueExtension vK M) + eAbove.symm + let : ∀ W : {W : InfinitePlace M // + infinitePlaceBelow (K := K) W = v}, + W.1.1.LiesOver v.1 := + fun W => + ⟨congrArg (fun q : InfinitePlace K => q.1) W.2⟩ + rw [IdeleGroup.infiniteComponent_norm_eq_prod] + rw [map_prod] + symm + rw [Finset.prod_subtype + (p := fun W : InfinitePlace M => + infinitePlaceBelow (K := K) W = v) + (s := Finset.univ.filter fun W : InfinitePlace M => + infinitePlaceBelow (K := K) W = v) + (by intro W; simp)] + apply Finset.prod_congr rfl + intro W _ + rcases W with ⟨W, rfl⟩ + rfl + _ = ∏ W : InfinitePlace M, factor W := + Finset.prod_fiberwise + Finset.univ + (infinitePlaceBelow (K := K)) + factor + +omit [NumberField L] in +open scoped Classical in +/-- The archimedean part of the Artin norm--restriction field diamond. +Restriction of the upper infinite Artin product is the lower infinite Artin +product after the ordinary idele norm. -/ +theorem infinitePlaceGlobalArtinMonoidHom_norm_restriction + {K' L' : Type} + [Field K'] [NumberField K'] + [Field L'] [NumberField L'] + [Algebra K K'] [Algebra K' L'] [Algebra K L'] + [IsScalarTower K K' L'] + [Algebra L L'] [IsScalarTower K L L'] + [IsAbelianGalois K' L'] : + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)).comp + (infinitePlaceGlobalArtinMonoidHom + (K := K') (L := L')) = + (infinitePlaceGlobalArtinMonoidHom + (K := K) (L := L)).comp + (IdeleGroup.norm K K') := by + apply MonoidHom.ext + intro a + let : ∀ W : InfinitePlace K', + W.1.LiesOver + (infinitePlaceBelow + (K := K) W).1 := + fun _ => ⟨rfl⟩ + change + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) + (infinitePlaceGlobalArtinMonoidHom + (K := K') (L := L') a) = + infinitePlaceGlobalArtinMonoidHom + (K := K) (L := L) + (IdeleGroup.norm K K' a) + rw [infinitePlaceGlobalArtinMonoidHom_norm_eq_prod] + unfold infinitePlaceGlobalArtinMonoidHom + rw [MonoidHom.finsetProd_apply] + rw [map_prod] + apply Finset.prod_congr rfl + intro W _ + exact + DFunLike.congr_fun + (chosenInfinitePlaceArtinMonoidHom_norm_restriction + (K := K) (L := L) W) + (IdeleGroup.infiniteComponent W a) + +omit [NumberField L] in +open scoped Classical in +/-- Every archimedean factor is trivial on a finite one-place idele. -/ +@[simp] +theorem infinitePlaceGlobalArtinMonoidHom_finitePlaceIdele + (v : HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) : + infinitePlaceGlobalArtinMonoidHom + (K := K) (L := L) + (finitePlaceIdele v x) = + 1 := by + unfold infinitePlaceGlobalArtinMonoidHom + rw [MonoidHom.finsetProd_apply] + apply Finset.prod_eq_one + intro w _ + change + chosenInfinitePlaceArtinMonoidHom + (K := K) (L := L) w + (IdeleGroup.infiniteComponent w + (finitePlaceIdele v x)) = + 1 + have hcomponent : + IdeleGroup.infiniteComponent w + (finitePlaceIdele v x) = + (1 : w.Completionˣ) := + finitePlaceIdele_infiniteComponent v w x + rw [hcomponent] + exact map_one _ + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IntermediateNormAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IntermediateNormAbelianization.lean new file mode 100644 index 0000000000..36b93bdfb5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IntermediateNormAbelianization.lean @@ -0,0 +1,178 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianizationNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormTowerConductor +/-! +# Abelianized restriction over intermediate fields + +For a finite Galois extension and an arbitrary intermediate field, this file +identifies the image of abelianized restriction with the image of the fixing +subgroup. It then proves naturality for the ordinary idèle-class norm and +identifies its range as the Artin preimage of that abelianized fixing-subgroup +image. No normality of the intermediate extension over the base is assumed. +-/ + +@[expose] public section + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +variable + {K N : Type} + [Field K] [NumberField K] + [Field N] [NumberField N] + [Algebra K N] [IsGalois K N] + +/-- Restriction from the Galois group over an intermediate field, passed to +abelianizations. -/ +noncomputable def intermediateAbelianizedRestriction + (M : IntermediateField K N) : + Abelianization Gal(N/M) →* Abelianization Gal(N/K) := + Abelianization.map + (AlgEquiv.restrictScalarsHom K : Gal(N/M) →* Gal(N/K)) + +omit [NumberField K] [NumberField N] [IsGalois K N] in +/-- The image of abelianized restriction from an intermediate field is the +image of its fixing subgroup in the ambient abelianization. -/ +theorem intermediateAbelianizedRestriction_range_eq_fixingSubgroup_image + (M : IntermediateField K N) : + (intermediateAbelianizedRestriction (K := K) (N := N) M).range = + M.fixingSubgroup.map + (Abelianization.of : Gal(N/K) →* Abelianization Gal(N/K)) := by + ext z + constructor + · rintro ⟨q, rfl⟩ + obtain ⟨sigma, rfl⟩ := + QuotientGroup.mk'_surjective + (_root_.commutator Gal(N/M)) q + let tau : M.fixingSubgroup := + (IntermediateField.fixingSubgroupEquiv M).symm sigma + refine ⟨tau, tau.property, ?_⟩ + change + Abelianization.of (tau : Gal(N/K)) = + Abelianization.of + ((AlgEquiv.restrictScalarsHom K) sigma) + rfl + · rintro ⟨tau, htau, rfl⟩ + let sigma : Gal(N/M) := + IntermediateField.fixingSubgroupEquiv M ⟨tau, htau⟩ + refine ⟨Abelianization.of sigma, ?_⟩ + change + Abelianization.of + ((AlgEquiv.restrictScalarsHom K) sigma) = + Abelianization.of tau + rfl + +/-- After the surjective global norm-residue map over an intermediate field, +abelianized restriction still has exactly the fixing-subgroup image. -/ +theorem + intermediateAbelianizedRestriction_comp_globalNormResidue_range_eq_fixingSubgroup_image + (M : IntermediateField K N) : + ((intermediateAbelianizedRestriction (K := K) (N := N) M).comp + (globalNormResidueAbelianizationMonoidHom M N)).range = + M.fixingSubgroup.map + (Abelianization.of : Gal(N/K) →* Abelianization Gal(N/K)) := by + calc + ((intermediateAbelianizedRestriction (K := K) (N := N) M).comp + (globalNormResidueAbelianizationMonoidHom M N)).range = + (intermediateAbelianizedRestriction (K := K) (N := N) M).range := by + apply le_antisymm + · rintro z ⟨c, rfl⟩ + exact ⟨globalNormResidueAbelianizationMonoidHom M N c, rfl⟩ + · rintro z ⟨q, rfl⟩ + obtain ⟨c, hc⟩ := + globalNormResidueAbelianizationMonoidHom_surjective M N q + refine ⟨c, ?_⟩ + simp only [MonoidHom.comp_apply, hc] + _ = M.fixingSubgroup.map + (Abelianization.of : Gal(N/K) →* Abelianization Gal(N/K)) := + intermediateAbelianizedRestriction_range_eq_fixingSubgroup_image M + +/-- Ordinary idèle-class norm from an arbitrary intermediate field agrees +with restriction of the finite-Galois global norm-residue symbol after +abelianization. No normality of the intermediate field over the base is +assumed. -/ +theorem globalNormResidueAbelianization_comp_ideleClassNorm_intermediate + (M : IntermediateField K N) : + (globalNormResidueAbelianizationMonoidHom K N).comp + (_root_.ideleClassNorm K M) = + (intermediateAbelianizedRestriction (K := K) (N := N) M).comp + (globalNormResidueAbelianizationMonoidHom M N) := by + exact + (globalNormResidueAbelianizationMonoidHom_norm_restriction + K M N).symm + +/-- The norm subgroup from an arbitrary intermediate field is the inverse +image, under finite-Galois global reciprocity, of the image of its fixing +subgroup in the ambient Galois abelianization. -/ +theorem ideleClassNorm_range_eq_artin_preimage_abelianizedFixingSubgroup + (M : IntermediateField K N) : + (_root_.ideleClassNorm K M).range = + (M.fixingSubgroup.map + (Abelianization.of : Gal(N/K) →* Abelianization Gal(N/K))).comap + (globalNormResidueAbelianizationMonoidHom K N) := by + let f := globalNormResidueAbelianizationMonoidHom K N + let g := globalNormResidueAbelianizationMonoidHom M N + let r := intermediateAbelianizedRestriction (K := K) (N := N) M + let n := _root_.ideleClassNorm K M + have hnat := + globalNormResidueAbelianization_comp_ideleClassNorm_intermediate + (K := K) (N := N) M + have hrange := + intermediateAbelianizedRestriction_range_eq_fixingSubgroup_image + (K := K) (N := N) M + ext x + constructor + · rintro ⟨c, rfl⟩ + change f (n c) ∈ + M.fixingSubgroup.map + (Abelianization.of : Gal(N/K) →* Abelianization Gal(N/K)) + have hpoint : f (n c) = r (g c) := + DFunLike.congr_fun hnat c + rw [hpoint, ← hrange] + exact ⟨g c, rfl⟩ + · intro hx + change f x ∈ + M.fixingSubgroup.map + (Abelianization.of : Gal(N/K) →* Abelianization Gal(N/K)) + at hx + have hxrange : f x ∈ r.range := by + rw [hrange] + exact hx + obtain ⟨q, hq⟩ := hxrange + obtain ⟨c, hc⟩ := + globalNormResidueAbelianizationMonoidHom_surjective M N q + have hpoint : f (n c) = r (g c) := + DFunLike.congr_fun hnat c + have heq : f x = f (n c) := by + calc + f x = r q := hq.symm + _ = r (g c) := congrArg r hc.symm + _ = f (n c) := hpoint.symm + have hker : x * (n c)⁻¹ ∈ f.ker := by + change f (x * (n c)⁻¹) = 1 + rw [map_mul, map_inv, heq, mul_inv_cancel] + have htop : + x * (n c)⁻¹ ∈ (_root_.ideleClassNorm K N).range := by + rw [← globalNormResidueAbelianizationMonoidHom_ker K N] + exact hker + have htopIntermediate : + x * (n c)⁻¹ ∈ (_root_.ideleClassNorm K M).range := + GlobalClassFieldTheory.GlobalClassFields.ideleClassNorm_range_le_of_tower + (K := K) (M := M) (L := N) htop + have hnc : n c ∈ (_root_.ideleClassNorm K M).range := ⟨c, rfl⟩ + have hproduct := + (_root_.ideleClassNorm K M).range.mul_mem htopIntermediate hnc + simpa only [inv_mul_cancel_right] using hproduct + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility.lean new file mode 100644 index 0000000000..8c7ef0b581 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicAuxiliaryField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicCyclicData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.SeparableClosurePadicLift + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/All.lean new file mode 100644 index 0000000000..f27e0e7a9f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/All.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicAuxiliaryField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicCyclicData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.SeparableClosurePadicLift +/-! +# Local-global compatibility of Artin homomorphisms + +This compatibility module reexports the semantic layers that construct the +separable-closure lift, its finite p-adic auxiliary field, and the resulting +factorization of the global norm-residue map through every finite-place +local Artin map. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean new file mode 100644 index 0000000000..856e2393bc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean @@ -0,0 +1,784 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicAuxiliaryField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel +/-! +# Factorization of the global Artin map through local Artin maps + +This module completes the auxiliary-field argument, factors the global +norm-residue map through each local Artin quotient, and proves the +finite-place local-global compatibility theorem. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField +open NumberField +open AlgebraicNumberTheory.Valuations +open HilbertRamification + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open CyclicCohomology +open KummerTheory + +attribute [local instance] + finitePadicAuxiliaryExtensionQuotientIsMulCommutative + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + +/-- The finite quotient coordinate remains primary after transport to +the relative Galois group. -/ +private theorem numberFieldTowerFiniteQuotientCoordinate_mem_primary + (p : Nat.Primes) (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (σ' : Gal(L/K)) + (hτσ : + numberFieldTowerExtensionQuotientEquivGaloisGroup K L + (numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ) = σ') + (hprimary : + σ' ∈ CommGroup.primaryComponent (Gal(L/K)) p.1) : + numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ ∈ + CommGroup.primaryComponent + ((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) + p.1 := by + obtain ⟨m, hm⟩ := hprimary + refine ⟨m, ?_⟩ + apply (numberFieldTowerExtensionQuotientEquivGaloisGroup K L).injective + calc + (numberFieldTowerExtensionQuotientEquivGaloisGroup K L) + (numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ ^ (p.1 ^ m)) = + (numberFieldTowerExtensionQuotientEquivGaloisGroup K L + (numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ)) ^ (p.1 ^ m) := map_pow _ _ _ + _ = σ' ^ (p.1 ^ m) := + congrArg (fun g => g ^ (p.1 ^ m)) hτσ + _ = 1 := hm + _ = numberFieldTowerExtensionQuotientEquivGaloisGroup K L 1 := + (map_one _).symm + +/-- The cyclotomic auxiliary-field construction supplies a local +representative on which the local and global Artin values agree. -/ +private theorem exists_finitePlacePrimary_localGlobalRepresentative + (v : IsDedekindDomain.HeightOneSpectrum (𝓞 K)) + (p : Nat.Primes) + (σ : + absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := L) v).1) + (hgenerate : + Subgroup.closure + ({σ.1} : Set (Gal(L/K))) = + ⊤) + (hprimary : + σ.1 ∈ + CommGroup.primaryComponent + (Gal(L/K)) p.1) : + ∃ z : (v.adicCompletion K)ˣ, + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v z = σ.1 ∧ + globalNormResidueMonoidHom K L + (IdeleGroup.finitePlaceIdeleClass v z) = σ.1 := by + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + let : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + let : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + let : IsScalarTower ℚ K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseScalarTower K L + let := numberFieldTowerExtensionSubgroup_normal K L + obtain + ⟨τ, hτσ, hτdecomposition, hτdegree, + _hfinite, _hbase, _hintersection, _hcontainment, + n, hn, hdegree⟩ := + exists_finitePlacePrimaryCyclotomicAuxiliaryFixedField + (K := K) (L := L) v p σ hgenerate hprimary + have hprimaryQuotient : + numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ ∈ + CommGroup.primaryComponent + ((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) + p.1 := + numberFieldTowerFiniteQuotientCoordinate_mem_primary + (K := K) (L := L) p τ σ.1 hτσ hprimary + let data := + numberFieldTowerFinitePadicAuxiliaryLocalGlobalRepresentative + (K := K) (L := L) v p τ hτdegree hτdecomposition + n hn hdegree hprimaryQuotient + exact ⟨data.1, data.2.1.trans hτσ, data.2.2.trans hτσ⟩ + +omit [NumberField L] in +/-- Triviality of the actual chosen finite-place Artin symbol is +equivalent to membership in the actual chosen local norm subgroup. -/ +@[simp] +theorem chosenFinitePlaceArtinMonoidHom_eq_one_iff_chosenLocalNorm + (v : IsDedekindDomain.HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) : + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x = 1 ↔ + x ∈ chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := by + change + x ∈ (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).ker ↔ _ + rw [chosenFinitePlaceArtinMonoidHom_ker + (K := K) (L := L) v] + +/-- A finite-place element killed by the actual local Artin +homomorphism is also killed by the global norm-residue homomorphism +after insertion as a one-place idele class. -/ +theorem globalNormResidueMonoidHom_finitePlaceIdeleClass_eq_one_of_localArtin_eq_one + (v : IsDedekindDomain.HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) + (hx : + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x = 1) : + globalNormResidueMonoidHom K L + (IdeleGroup.finitePlaceIdeleClass v x) = 1 := by + rw [globalNormResidueMonoidHom_eq_one_iff] + exact + finitePlaceIdeleClass_mem_ideleClassNorm_range_of_mem_chosenLocalNorm + (K := K) (L := L) v x + ((chosenFinitePlaceArtinMonoidHom_eq_one_iff_chosenLocalNorm + (K := K) (L := L) v x).1 hx) + +/-- The chosen local norm subgroup lies in the kernel of the global +norm-residue homomorphism restricted to the one-place finite idele +class map. -/ +theorem chosenFinitePlaceLocalNormSubgroup_le_globalNormResidueKernel + (v : IsDedekindDomain.HeightOneSpectrum (𝓞 K)) : + chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v ≤ + ((globalNormResidueMonoidHom K L).comp + (IdeleGroup.finitePlaceIdeleClass v)).ker := by + intro x hx + exact + globalNormResidueMonoidHom_finitePlaceIdeleClass_eq_one_of_localArtin_eq_one + (K := K) (L := L) v x + ((chosenFinitePlaceArtinMonoidHom_eq_one_iff_chosenLocalNorm + (K := K) (L := L) v x).2 hx) + +/-- The restriction of the global norm-residue homomorphism to one +finite-place idele class depends only on the corresponding local Artin +symbol. + +This is the exact quotient step used in the prime-primary reduction: +the already proved inclusion of the local norm subgroup in the global +norm kernel makes the value independent of the chosen local preimage. -/ +theorem globalNormResidue_finitePlaceIdeleClass_eq_of_localArtin_eq + (v : IsDedekindDomain.HeightOneSpectrum (𝓞 K)) + (x y : (v.adicCompletion K)ˣ) + (hxy : + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x = + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v y) : + globalNormResidueMonoidHom K L + (IdeleGroup.finitePlaceIdeleClass v x) = + globalNormResidueMonoidHom K L + (IdeleGroup.finitePlaceIdeleClass v y) := by + let f : + (v.adicCompletion K)ˣ →* (L ≃ₐ[K] L) := + (globalNormResidueMonoidHom K L).comp + (IdeleGroup.finitePlaceIdeleClass v) + let g : + (v.adicCompletion K)ˣ →* (L ≃ₐ[K] L) := + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v + have hlocal : + g (x * y⁻¹) = 1 := by + rw [map_mul, map_inv, hxy, mul_inv_cancel] + have hglobal : + f (x * y⁻¹) = 1 := by + exact + globalNormResidueMonoidHom_finitePlaceIdeleClass_eq_one_of_localArtin_eq_one + (K := K) (L := L) v (x * y⁻¹) hlocal + have hquotient : + f x * (f y)⁻¹ = 1 := by + simpa only [map_mul, map_inv] using hglobal + exact mul_inv_eq_one.mp hquotient + +/-- Finite-place local--global compatibility for a `p`-primary +decomposition automorphism which generates the whole relative Galois +group. The auxiliary-field construction is isolated in an opaque +representative lemma, so consumers only see this short quotient step. -/ +theorem + globalNormResidueMonoidHom_finitePlaceIdeleClass_eq_of_primary_generator + (v : IsDedekindDomain.HeightOneSpectrum (𝓞 K)) + (p : Nat.Primes) + (σ : + absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := L) v).1) + (hgenerate : + Subgroup.closure ({σ.1} : Set (Gal(L/K))) = ⊤) + (hprimary : + σ.1 ∈ CommGroup.primaryComponent (Gal(L/K)) p.1) + (x : (v.adicCompletion K)ˣ) + (hx : + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x = σ.1) : + globalNormResidueMonoidHom K L + (IdeleGroup.finitePlaceIdeleClass v x) = σ.1 := by + obtain ⟨z, hlocal, hglobal⟩ := + exists_finitePlacePrimary_localGlobalRepresentative + (K := K) (L := L) v p σ hgenerate hprimary + exact + (globalNormResidue_finitePlaceIdeleClass_eq_of_localArtin_eq + (K := K) (L := L) v x z (hx.trans hlocal.symm)).trans hglobal + +/-- The global norm-residue symbol at one finite place, factored +through the actual image of the chosen local Artin homomorphism. + +The definition uses a preimage only to specify the value. Its +well-definedness and multiplicativity are consequences of the genuine +one-place norm-kernel theorem above. -/ +noncomputable def finitePlaceGlobalNormResidueFactor + (v : IsDedekindDomain.HeightOneSpectrum (𝓞 K)) : + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).range →* + (L ≃ₐ[K] L) := by + let g : + (v.adicCompletion K)ˣ →* (L ≃ₐ[K] L) := + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v + let f : + (v.adicCompletion K)ˣ →* (L ≃ₐ[K] L) := + (globalNormResidueMonoidHom K L).comp + (IdeleGroup.finitePlaceIdeleClass v) + have hker : g.rangeRestrict.ker ≤ f.ker := by + rw [MonoidHom.ker_rangeRestrict] + simpa only [g, f, chosenFinitePlaceArtinMonoidHom_ker] using + chosenFinitePlaceLocalNormSubgroup_le_globalNormResidueKernel + (K := K) (L := L) v + exact + g.rangeRestrict.liftOfSurjective + g.rangeRestrict_surjective ⟨f, hker⟩ + +/-- Factoring and then evaluating the actual local Artin symbol gives +the original one-place global norm-residue value. -/ +theorem finitePlaceGlobalNormResidueFactor_comp_rangeRestrict + (v : IsDedekindDomain.HeightOneSpectrum (𝓞 K)) : + (finitePlaceGlobalNormResidueFactor + (K := K) (L := L) v).comp + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).rangeRestrict = + (globalNormResidueMonoidHom K L).comp + (IdeleGroup.finitePlaceIdeleClass v) := by + let g : + (v.adicCompletion K)ˣ →* (L ≃ₐ[K] L) := + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v + let f : + (v.adicCompletion K)ˣ →* (L ≃ₐ[K] L) := + (globalNormResidueMonoidHom K L).comp + (IdeleGroup.finitePlaceIdeleClass v) + have hker : g.rangeRestrict.ker ≤ f.ker := by + rw [MonoidHom.ker_rangeRestrict] + simpa only [g, f, chosenFinitePlaceArtinMonoidHom_ker] using + chosenFinitePlaceLocalNormSubgroup_le_globalNormResidueKernel + (K := K) (L := L) v + change + (g.rangeRestrict.liftOfSurjective + g.rangeRestrict_surjective ⟨f, hker⟩).comp + g.rangeRestrict = + f + simpa only [MonoidHom.liftOfSurjective] using + g.rangeRestrict.liftOfRightInverse_comp + (Function.surjInv g.rangeRestrict_surjective) + (Function.rightInverse_surjInv + g.rangeRestrict_surjective) + ⟨f, hker⟩ + +/-- Pointwise norm/restriction naturality, with the coercion from the +homomorphism equality normalized once outside the descent construction. -/ +private theorem globalNormResidueMonoidHomOfEmbedding_norm_restriction_apply + (K K' L L' : Type) + [Field K] [NumberField K] + [Field K'] [NumberField K'] + [Field L] [NumberField L] + [Field L'] [NumberField L'] + [Algebra K K'] [Algebra K L] [Algebra K L'] + [Algebra K' L'] [Algebra L L'] + [IsScalarTower K K' L'] [IsScalarTower K L L'] + [FiniteDimensional K L] [IsAbelianGalois K L] + [FiniteDimensional K' L'] [IsAbelianGalois K' L'] + [FiniteDimensional K K'] [IsGalois K K'] + (j : L' →ₐ[ℚ] SeparableClosure ℚ) + (c : IdeleClassGroup K') : + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) + (globalNormResidueMonoidHomOfEmbedding K' L' j c) = + globalNormResidueMonoidHomOfEmbedding K L + (j.comp (IsScalarTower.toAlgHom ℚ L L')) + (_root_.ideleClassNorm K K' c) := by + exact + DFunLike.congr_fun + (globalNormResidueMonoidHomOfEmbedding_norm_restriction + (K := K) (L := L) (K' := K') (L' := L') j) c + +/-- Norming one upper representative down a finite Galois base-change +transports both its chosen local Artin value and its global norm-residue +value. All fields and places are explicit here, so no constructed +fixed-field tower occurs in the declaration type. -/ +private theorem exists_finitePlaceNormDescent_localGlobalRepresentative + {M : Type} + [Field M] [NumberField M] + [Algebra K M] [FiniteDimensional K M] [IsGalois K M] + [Algebra M L] [FiniteDimensional M L] [IsAbelianGalois M L] + [IsScalarTower K M L] + (v : IsDedekindDomain.HeightOneSpectrum (𝓞 K)) + (W : IsDedekindDomain.HeightOneSpectrum (𝓞 M)) + (hWbelow : finitePlaceBelow (K := K) W = v) + (σM : Gal(L/M)) (σG : Gal(L/K)) + (hrestrict : + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) σM = σG) + (y : (W.adicCompletion M)ˣ) + (hy : + chosenFinitePlaceArtinMonoidHom + (K := M) (L := L) W y = σM) + (hglobalM : + globalNormResidueMonoidHom M L + (IdeleGroup.finitePlaceIdeleClass W y) = σM) : + ∃ z : (v.adicCompletion K)ˣ, + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v z = σG ∧ + globalNormResidueMonoidHom K L + (IdeleGroup.finitePlaceIdeleClass v z) = σG := by + let Wover : + {W' : IsDedekindDomain.HeightOneSpectrum (𝓞 M) // + finitePlaceBelow (K := K) W' = v} := + ⟨W, hWbelow⟩ + let : + Algebra (v.adicCompletion K) (W.adicCompletion M) := + (finitePlaceAdicCompletionMap K M v Wover).toAlgebra + let z : (v.adicCompletion K)ˣ := + LocalFieldTheory.normUnits + (v.adicCompletion K) (W.adicCompletion M) y + have hlocalNorm : + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v z = + σG := by + have hnat := + DFunLike.congr_fun + (chosenFinitePlaceArtinMonoidHom_norm_restriction_of_below_eq + (K := K) (L := L) (K' := M) (L' := L) + v W hWbelow) y + change + chosenFinitePlaceArtinMonoidHom (K := K) (L := L) v + (LocalFieldTheory.normUnits + (v.adicCompletion K) (W.adicCompletion M) y) = + σG + calc + chosenFinitePlaceArtinMonoidHom (K := K) (L := L) v + (LocalFieldTheory.normUnits + (v.adicCompletion K) (W.adicCompletion M) y) = + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) + (chosenFinitePlaceArtinMonoidHom + (K := M) (L := L) W y) := by + simpa only [MonoidHom.coe_comp, Function.comp_apply] + using hnat.symm + _ = ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) σM := + congrArg + (((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) : Gal(L/M) →* Gal(L/K)) hy + _ = σG := hrestrict + let j : L →ₐ[ℚ] SeparableClosure ℚ := + AlgebraicNumberTheory.numberFieldSeparableClosureEmbedding L + have hjLower : + j.comp (IsScalarTower.toAlgHom ℚ L L) = + AlgebraicNumberTheory.numberFieldSeparableClosureEmbedding L := by + apply AlgHom.ext + intro a + rfl + have hnormClass : + _root_.ideleClassNorm K M + (IdeleGroup.finitePlaceIdeleClass W y) = + IdeleGroup.finitePlaceIdeleClass v z := by + simpa only [Wover, z] using + (IdeleGroup.ideleClassNorm_finitePlaceIdeleClass_eq_normUnits + (K := K) (L := M) v Wover y) + have hglobalNorm : + globalNormResidueMonoidHom K L + (IdeleGroup.finitePlaceIdeleClass v z) = + σG := by + calc + globalNormResidueMonoidHom K L + (IdeleGroup.finitePlaceIdeleClass v z) = + globalNormResidueMonoidHom K L + (_root_.ideleClassNorm K M + (IdeleGroup.finitePlaceIdeleClass W y)) := + congrArg (globalNormResidueMonoidHom K L) hnormClass.symm + _ = globalNormResidueMonoidHomOfEmbedding K L + (j.comp (IsScalarTower.toAlgHom ℚ L L)) + (_root_.ideleClassNorm K M + (IdeleGroup.finitePlaceIdeleClass W y)) := by + rw [hjLower, + ← globalNormResidueMonoidHom_eq_ofEmbedding_standard] + _ = ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) + (globalNormResidueMonoidHomOfEmbedding M L j + (IdeleGroup.finitePlaceIdeleClass W y)) := by + apply Eq.symm + apply + globalNormResidueMonoidHomOfEmbedding_norm_restriction_apply + _ = ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) + (globalNormResidueMonoidHom M L + (IdeleGroup.finitePlaceIdeleClass W y)) := by + exact congrArg + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) + (DFunLike.congr_fun + (globalNormResidueMonoidHom_eq_ofEmbedding_standard + (K := M) (L := L)) + (IdeleGroup.finitePlaceIdeleClass W y)).symm + _ = ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) σM := + congrArg + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) hglobalM + _ = σG := hrestrict + exact ⟨z, hlocalNorm, hglobalNorm⟩ + +/-- A primary generator at an explicit upper place can first be realized +by the auxiliary construction and then normed through an explicit base +change. This short bridge keeps the auxiliary witness out of the +cyclic-fixed-field construction. -/ +private theorem exists_finitePlacePrimaryNormDescent_localGlobalRepresentative + {M : Type} + [Field M] [NumberField M] + [Algebra K M] [FiniteDimensional K M] [IsGalois K M] + [Algebra M L] [FiniteDimensional M L] [IsAbelianGalois M L] + [IsScalarTower K M L] + (v : IsDedekindDomain.HeightOneSpectrum (𝓞 K)) + (W : IsDedekindDomain.HeightOneSpectrum (𝓞 M)) + (hWbelow : finitePlaceBelow (K := K) W = v) + (p : Nat.Primes) + (δM : + absoluteValueDecompositionGroup M + (chosenFinitePlaceExtension (L := L) W).1) + (hgenerate : + Subgroup.closure ({δM.1} : Set (Gal(L/M))) = ⊤) + (hprimary : + δM.1 ∈ CommGroup.primaryComponent (Gal(L/M)) p.1) + (σG : Gal(L/K)) + (hrestrict : + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) δM.1 = σG) : + ∃ z : (v.adicCompletion K)ˣ, + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v z = σG ∧ + globalNormResidueMonoidHom K L + (IdeleGroup.finitePlaceIdeleClass v z) = σG := by + obtain ⟨y, hy, hglobalM⟩ := + exists_finitePlacePrimary_localGlobalRepresentative + (K := M) (L := L) W p δM hgenerate hprimary + exact + exists_finitePlaceNormDescent_localGlobalRepresentative + (K := K) (L := L) v W hWbelow + δM.1 σG hrestrict y hy hglobalM + +/-- Cyclic fixed-field descent turns a primary decomposition +automorphism into a lower representative without exposing the constructed +field tower in the declaration type. -/ +private theorem exists_finitePlacePrimary_cyclicFixedFieldRepresentative + (v : IsDedekindDomain.HeightOneSpectrum (𝓞 K)) + (p : Nat.Primes) + (δ : + absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := L) v).1) + (hprimary : + δ.1 ∈ CommGroup.primaryComponent (Gal(L/K)) p.1) : + ∃ z : (v.adicCompletion K)ˣ, + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v z = δ.1 ∧ + globalNormResidueMonoidHom K L + (IdeleGroup.finitePlaceIdeleClass v z) = δ.1 := by + let σG : Gal(L/K) := δ.1 + let M := automorphismCyclicFixedField σG + let : NumberField M := NumberField.of_module_finite K M + let W := automorphismCyclicFixedPlace v σG + let σM : Gal(L/M) := automorphismOverCyclicFixedField σG + have hσMdecomposition : + σM ∈ + absoluteValueDecompositionGroup M + (chosenFinitePlaceExtension (L := L) W).1 := by + exact + automorphismOverCyclicFixedField_mem_chosenFinitePlaceDecompositionGroup + (K := K) (L := L) v δ + let δM : + absoluteValueDecompositionGroup M + (chosenFinitePlaceExtension (L := L) W).1 := + ⟨σM, hσMdecomposition⟩ + have hσMrestrict : σM.restrictScalars K = σG := + automorphismOverCyclicFixedField_restrictScalars σG + have hσMprimary : + σM ∈ CommGroup.primaryComponent (Gal(L/M)) p.1 := by + obtain ⟨n, hn⟩ := hprimary + have hnG : σG ^ (p.1 ^ n) = 1 := hn + refine ⟨n, ?_⟩ + apply AlgEquiv.restrictScalars_injective K + change + (AlgEquiv.restrictScalarsHom K) (σM ^ (p.1 ^ n)) = + (AlgEquiv.restrictScalarsHom K) (1 : Gal(L/M)) + rw [ + map_pow, + AlgEquiv.restrictScalarsHom_apply, + hσMrestrict, + hnG, + map_one + ] + have hWbelow : finitePlaceBelow (K := K) W = v := + finitePlaceBelow_automorphismCyclicFixedPlace + (K := K) (L := L) v σG + have hrestrictσM : + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) σM = + σG := by + simpa only [ + MonoidHom.coe_comp, + Function.comp_apply, + AlgEquiv.restrictNormalHom_id, + MonoidHom.id_apply, + AlgEquiv.restrictScalarsHom_apply + ] using hσMrestrict + exact + exists_finitePlacePrimaryNormDescent_localGlobalRepresentative + (K := K) (L := L) v W hWbelow p δM + (automorphismOverCyclicFixedField_generates σG) + hσMprimary σG hrestrictσM + +/-- On every primary component of the actual decomposition-group +image, the one-place global norm-residue factor is the tautological +inclusion. An arbitrary primary element is reduced to the cyclic +extension cut out by that element, where the auxiliary-field theorem +above applies to its genuine generator. -/ +theorem finitePlaceGlobalNormResidueFactor_eq_subtype_on_primary + (v : IsDedekindDomain.HeightOneSpectrum (𝓞 K)) + (p : ℕ) (hp : Fact p.Prime) + (σ : + CommGroup.primaryComponent + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).range p) : + finitePlaceGlobalNormResidueFactor + (K := K) (L := L) v σ = + (σ : + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).range) := by + let σG : Gal(L/K) := + (σ : + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).range) + have hσdecomposition : + σG ∈ + absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := L) v).1 := by + change σG ∈ finitePlaceDecompositionGroup + (K := K) (L := L) v + rw [ + ← chosenFinitePlaceArtinMonoidHom_range + (K := K) (L := L) v] + exact + (σ : + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).range).property + let δ : + absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := L) v).1 := + ⟨σG, hσdecomposition⟩ + have hσprimary : + σG ∈ CommGroup.primaryComponent (Gal(L/K)) p := by + obtain ⟨n, hn⟩ := σ.property + exact ⟨n, congrArg Subtype.val hn⟩ + let pPrime : Nat.Primes := ⟨p, hp.out⟩ + obtain ⟨z, hlocal, hglobal⟩ := + exists_finitePlacePrimary_cyclicFixedFieldRepresentative + (K := K) (L := L) v pPrime δ hσprimary + have hfactor := + DFunLike.congr_fun + (finitePlaceGlobalNormResidueFactor_comp_rangeRestrict + (K := K) (L := L) v) z + have hrange : + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).rangeRestrict z = + (σ : + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).range) := by + apply Subtype.ext + simpa only [MonoidHom.coe_rangeRestrict, δ, σG] using hlocal + calc + finitePlaceGlobalNormResidueFactor + (K := K) (L := L) v σ = + finitePlaceGlobalNormResidueFactor + (K := K) (L := L) v + ((chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).rangeRestrict z) := + congrArg + (finitePlaceGlobalNormResidueFactor + (K := K) (L := L) v) hrange.symm + _ = globalNormResidueMonoidHom K L + (IdeleGroup.finitePlaceIdeleClass v z) := by + simpa only [MonoidHom.coe_comp, Function.comp_apply] using hfactor + _ = σG := by + simpa only [δ] using hglobal + _ = (σ : + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).range) := rfl + +/-- The desired finite-place local--global compatibility is equivalent +to saying that the factor induced on the actual decomposition-group +image is its inclusion into the global Galois group. -/ +theorem globalNormResidueMonoidHom_comp_finitePlaceIdeleClass_iff + (v : IsDedekindDomain.HeightOneSpectrum (𝓞 K)) : + (globalNormResidueMonoidHom K L).comp + (IdeleGroup.finitePlaceIdeleClass v) = + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v ↔ + finitePlaceGlobalNormResidueFactor + (K := K) (L := L) v = + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).range.subtype := by + constructor + · intro h + apply MonoidHom.ext + intro σ + obtain ⟨x, hx⟩ := σ.property + have hσ : + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).rangeRestrict x = σ := + Subtype.ext hx + calc + finitePlaceGlobalNormResidueFactor + (K := K) (L := L) v σ = + finitePlaceGlobalNormResidueFactor + (K := K) (L := L) v + ((chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).rangeRestrict x) := + congrArg (finitePlaceGlobalNormResidueFactor + (K := K) (L := L) v) hσ.symm + _ = globalNormResidueMonoidHom K L + (IdeleGroup.finitePlaceIdeleClass v x) := + DFunLike.congr_fun + (finitePlaceGlobalNormResidueFactor_comp_rangeRestrict + (K := K) (L := L) v) x + _ = chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x := DFunLike.congr_fun h x + _ = (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).range.subtype σ := hx + · intro h + calc + (globalNormResidueMonoidHom K L).comp + (IdeleGroup.finitePlaceIdeleClass v) = + (finitePlaceGlobalNormResidueFactor + (K := K) (L := L) v).comp + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).rangeRestrict := + (finitePlaceGlobalNormResidueFactor_comp_rangeRestrict + (K := K) (L := L) v).symm + _ = + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).range.subtype.comp + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).rangeRestrict := by + rw [h] + _ = + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v := + MonoidHom.subtype_comp_rangeRestrict + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v) + +/-- Equality of the induced decomposition-group map with the inclusion +is characterized by equality on every primary component. This is the +exact finite-group reduction in the proof of finite-place local--global +compatibility. -/ +theorem finitePlaceGlobalNormResidueFactor_eq_subtype_iff_primary + (v : IsDedekindDomain.HeightOneSpectrum (𝓞 K)) : + finitePlaceGlobalNormResidueFactor + (K := K) (L := L) v = + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).range.subtype ↔ + ∀ (p : ℕ) (_hp : Fact p.Prime) + (σ : + CommGroup.primaryComponent + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).range p), + finitePlaceGlobalNormResidueFactor + (K := K) (L := L) v σ = + (σ : + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).range) := by + constructor + · intro h p hp σ + exact congrArg + (fun f : + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).range →* Gal(L/K) => f σ) + h + · intro h + apply MonoidHom.ext_of_eq_on_finitePrimaryComponents + intro p hp σ + exact h p hp σ + +/-- The factor of the one-place global norm-residue map through the +actual local Artin image is exactly the inclusion of that decomposition +subgroup into the global Galois group. -/ +theorem finitePlaceGlobalNormResidueFactor_eq_subtype + (v : IsDedekindDomain.HeightOneSpectrum (𝓞 K)) : + finitePlaceGlobalNormResidueFactor + (K := K) (L := L) v = + (chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).range.subtype := by + apply + (finitePlaceGlobalNormResidueFactor_eq_subtype_iff_primary + (K := K) (L := L) v).2 + intro p hp σ + exact + finitePlaceGlobalNormResidueFactor_eq_subtype_on_primary + (K := K) (L := L) v p hp σ + +/-- The global norm-residue symbol restricted to a genuine one-place +finite idele class is the actual chosen local Artin symbol. -/ +theorem globalNormResidueMonoidHom_comp_finitePlaceIdeleClass + (v : IsDedekindDomain.HeightOneSpectrum (𝓞 K)) : + (globalNormResidueMonoidHom K L).comp + (IdeleGroup.finitePlaceIdeleClass v) = + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v := by + apply + (globalNormResidueMonoidHom_comp_finitePlaceIdeleClass_iff + (K := K) (L := L) v).2 + exact + finitePlaceGlobalNormResidueFactor_eq_subtype + (K := K) (L := L) v + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean new file mode 100644 index 0000000000..886b8cca43 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean @@ -0,0 +1,1946 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicCyclicData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedLocalGlobalCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.OnePlaceBaseNorm +/-! +# The finite p-adic auxiliary field + +This module realizes the simultaneous finite/cyclotomic lift as an actual +number field and proves the subgroup and intermediate-field identities +needed by the auxiliary-field argument. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField +open AlgebraicNumberTheory IsDedekindDomain NumberField +open IdeleGroup RelativeIdeleGroup +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open CyclicCohomology +open KummerTheory ClassFormation + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open GlobalClassFields + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + +local instance (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +attribute [local instance] + rationalSeparableClosureAlgebra + +local instance finitePadicAuxiliaryExtensionNormal : + (extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)).Normal := + numberFieldTowerExtensionSubgroup_normal K L + +local instance finitePadicAuxiliaryExtensionQuotientFinite : + Finite + ((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) := + numberFieldTowerExtensionQuotient_finite K L + +noncomputable local instance finitePadicAuxiliaryExtensionQuotientIsMulCommutative : + IsMulCommutative + ((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) := by + let e : + ((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) ≃* + Gal(L/K) := + numberFieldTowerExtensionQuotientEquivGaloisGroup K L + exact + { is_comm := + ⟨fun x y => by + apply e.injective + rw [map_mul, map_mul] + exact + (inferInstance : + IsMulCommutative (Gal(L/K))).is_comm.comm + (e x) (e y)⟩ } + +/-- The concrete auxiliary fixed field attached to a simultaneous +finite/cyclotomic lift. -/ +noncomputable def numberFieldTowerFinitePadicCyclicFixedField + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + IntermediateField ℚ (SeparableClosure ℚ) := by + exact + IntermediateField.fixedField + (numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ).toSubgroup + +/-- A nonzero-degree lift produces a genuine number field: its +concrete fixed field is finite over `ℚ`. -/ +theorem numberFieldTowerFinitePadicCyclicFixedField_finiteDimensional + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (hτ : + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ ≠ + 1) : + FiniteDimensional ℚ + (numberFieldTowerFinitePadicCyclicFixedField + (K := K) (L := L) p τ) := by + let S := + numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ + let F := + numberFieldTowerFinitePadicCyclicFixedField + (K := K) (L := L) p τ + apply + (InfiniteGalois.isOpen_iff_finite + (K := SeparableClosure ℚ) F).1 + change IsOpen + (IntermediateField.fixedField S.toSubgroup).fixingSubgroup.carrier + rw [InfiniteGalois.fixingSubgroup_fixedField S] + exact + numberFieldTowerFinitePadicCyclicFixedSubgroup_isOpen + (K := K) (L := L) p τ hτ + +/-- The compatible embedded copy of `K` lies in every auxiliary +cyclic fixed field. -/ +theorem numberFieldTowerBaseField_le_finitePadicCyclicFixedField + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + numberFieldTowerBaseField K L ≤ + numberFieldTowerFinitePadicCyclicFixedField + (K := K) (L := L) p τ := by + intro x hx + change x ∈ IntermediateField.fixedField + (numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ).toSubgroup + rw [IntermediateField.mem_fixedField_iff] + intro σ hσ + change + σ ∈ + (numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ).toSubgroup at hσ + obtain ⟨u, hu, rfl⟩ := hσ + exact + (IntermediateField.mem_fixingSubgroup_iff + (numberFieldTowerBaseField K L) u.1).1 u.2 x hx + +/-- The compatible embedding of the original base field into the +genuine auxiliary fixed field. -/ +noncomputable def numberFieldTowerFinitePadicAuxiliaryBaseEmbedding + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + K →ₐ[ℚ] + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ) := by + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ) + exact + (numberFieldTowerLowerEmbedding K L).codRestrict F.toSubalgebra + (fun x => + numberFieldTowerBaseField_le_finitePadicCyclicFixedField + (K := K) (L := L) p τ ⟨x, rfl⟩) + +/-- Coercing the auxiliary base embedding recovers the fixed lower embedding +into the rational separable closure. -/ +@[simp] +theorem numberFieldTowerFinitePadicAuxiliaryBaseEmbedding_coe + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (x : K) : + ((numberFieldTowerFinitePadicAuxiliaryBaseEmbedding + (K := K) (L := L) p τ x : + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ)) : + SeparableClosure ℚ) = + numberFieldTowerLowerEmbedding K L x := by + rfl + +/-- The compatible copy of the original top field lies in the +auxiliary compositum fixed field. -/ +theorem numberFieldTowerTopField_mem_finitePadicAuxiliaryTopField + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + {x : SeparableClosure ℚ} + (hx : x ∈ numberFieldInRationalSeparableClosure L) : + x ∈ + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ).below := by + let S := + numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ + let T := + numberFieldTowerTopSubgroup L + change x ∈ IntermediateField.fixedField + (S.toSubgroup ⊓ T.toSubgroup) + rw [IntermediateField.mem_fixedField_iff] + intro σ hσ + have hσT : σ ∈ T.toSubgroup := + hσ.2 + change + σ ∈ + (numberFieldInRationalSeparableClosure L).fixingSubgroup + at hσT + exact + (IntermediateField.mem_fixingSubgroup_iff + (numberFieldInRationalSeparableClosure L) σ).1 + hσT x hx + +/-- The compatible embedding of the original top field into the +auxiliary compositum fixed field. -/ +noncomputable def numberFieldTowerFinitePadicAuxiliaryTopEmbedding + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + L →ₐ[ℚ] + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ).below := by + let E := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ).below + exact + (numberFieldSeparableClosureEmbedding L).codRestrict + (E.restrictScalars ℚ).toSubalgebra + (fun x => + numberFieldTowerTopField_mem_finitePadicAuxiliaryTopField + (K := K) (L := L) p τ ⟨x, rfl⟩) + +/-- Coercing the auxiliary top embedding recovers the chosen top-field +embedding into the rational separable closure. -/ +@[simp] +theorem numberFieldTowerFinitePadicAuxiliaryTopEmbedding_coe + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (x : L) : + ((numberFieldTowerFinitePadicAuxiliaryTopEmbedding + (K := K) (L := L) p τ x : + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ).below) : + SeparableClosure ℚ) = + numberFieldSeparableClosureEmbedding L x := by + rfl + +/-- The compatible base and top embeddings form the actual +base-change square inside the rational separable closure. -/ +theorem numberFieldTowerFinitePadicAuxiliaryEmbedding_algebraMap + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (x : K) : + ((numberFieldTowerFinitePadicAuxiliaryTopEmbedding + (K := K) (L := L) p τ (algebraMap K L x) : + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ).below) : + SeparableClosure ℚ) = + ((numberFieldTowerFinitePadicAuxiliaryBaseEmbedding + (K := K) (L := L) p τ x : + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ)) : + SeparableClosure ℚ) := by + rfl + +noncomputable instance + numberFieldTowerFinitePadicAuxiliaryBaseAlgebra + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + Algebra K + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ)) := by + exact + (numberFieldTowerFinitePadicAuxiliaryBaseEmbedding + (K := K) (L := L) p τ).toRingHom.toAlgebra + +instance + numberFieldTowerFinitePadicAuxiliary_baseRatScalarTower + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + IsScalarTower ℚ K + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ)) := by + exact + IsScalarTower.of_algebraMap_eq' + (numberFieldTowerFinitePadicAuxiliaryBaseEmbedding + (K := K) (L := L) p τ).comp_algebraMap.symm + +noncomputable instance + numberFieldTowerFinitePadicAuxiliaryTopAlgebra + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + Algebra L + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ).below) := by + exact + (numberFieldTowerFinitePadicAuxiliaryTopEmbedding + (K := K) (L := L) p τ).toRingHom.toAlgebra + +instance + numberFieldTowerFinitePadicAuxiliary_topRatScalarTower + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + IsScalarTower ℚ L + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ).below) := by + exact + IsScalarTower.of_algebraMap_eq' + (numberFieldTowerFinitePadicAuxiliaryTopEmbedding + (K := K) (L := L) p τ).comp_algebraMap.symm + +noncomputable instance + numberFieldTowerFinitePadicAuxiliaryOriginalBaseTopAlgebra + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + Algebra K + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ).below) := by + exact + ((numberFieldTowerFinitePadicAuxiliaryTopEmbedding + (K := K) (L := L) p τ).comp + (IsScalarTower.toAlgHom ℚ K L)).toRingHom.toAlgebra + +instance + numberFieldTowerFinitePadicAuxiliary_originalTopScalarTower + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + IsScalarTower K L + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ).below) := by + exact IsScalarTower.of_algebraMap_eq' rfl + +instance + numberFieldTowerFinitePadicAuxiliary_baseTopScalarTower + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + IsScalarTower K + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ)) + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ).below) := by + apply IsScalarTower.of_algebraMap_eq' + apply RingHom.ext + intro x + apply Subtype.ext + exact + numberFieldTowerFinitePadicAuxiliaryEmbedding_algebraMap + (K := K) (L := L) p τ x + +/-- The genuine auxiliary fixed field is Galois over the original +base field through the compatible embedding above. -/ +theorem numberFieldTowerFinitePadicAuxiliaryBase_isGalois + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + IsGalois K + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ)) := by + let H := + numberFieldTowerBaseSubgroup K L + let S := + numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ + let hSH := + numberFieldTowerFinitePadicCyclicFixedSubgroup_le_baseSubgroup + (K := K) (L := L) p τ + let B := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) S + let FB := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hSH + let auxiliaryBaseAlgebra : Algebra B FB := + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) hSH).algebra + let auxiliaryBaseGalois : IsGalois B FB := + LocalClassFieldTheory.abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) H S hSH + (numberFieldTowerFinitePadicCyclicFixedSubgroup_extension_normal + (K := K) (L := L) p τ) + let eK := + numberFieldTowerAbstractBaseFieldEquiv K L + refine + @IsGalois.of_equiv_equiv + B FB _ _ auxiliaryBaseAlgebra + K F _ _ + (numberFieldTowerFinitePadicAuxiliaryBaseAlgebra + (K := K) (L := L) p τ) + auxiliaryBaseGalois + eK.symm.toRingEquiv (RingEquiv.refl F) ?_ + apply RingHom.ext + intro x + apply Subtype.ext + change + ((eK (eK.symm x) : B) : SeparableClosure ℚ) = + (x : SeparableClosure ℚ) + exact + congrArg Subtype.val (eK.apply_symm_apply x) + +/-- The distinguished absolute lift, regarded as an element of the +auxiliary base subgroup. -/ +noncomputable def numberFieldTowerFinitePadicAuxiliarySubgroupLift + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + (numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ).toSubgroup := + ⟨τ.1, + numberFieldTowerFinitePadicCyclicFixedSubgroup_generator_mem + (K := K) (L := L) p τ⟩ + +/-- The actual automorphism of the auxiliary compositum induced by +the distinguished simultaneous finite/cyclotomic lift. -/ +noncomputable def numberFieldTowerFinitePadicAuxiliaryAutomorphism + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + let P := + numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ + let S := + numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ + Gal(LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below/LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) S) := by + dsimp only + let P := + numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ + let S := + numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ + let σS := + numberFieldTowerFinitePadicAuxiliarySubgroupLift + (K := K) (L := L) p τ + exact + LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup + ℚ (SeparableClosure ℚ) + S P.field P.below + P.toFiniteGaloisExtension.normal + (QuotientGroup.mk' + (extensionSubgroup + S P.field P.below) + σS) + +/-- On the common separable closure, the auxiliary automorphism acts +by the original distinguished ambient lift. -/ +theorem numberFieldTowerFinitePadicAuxiliaryAutomorphism_apply_val + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (x : + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ).below) : + ((numberFieldTowerFinitePadicAuxiliaryAutomorphism + (K := K) (L := L) p τ x : + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ).below) : + SeparableClosure ℚ) = + τ.1 (x : SeparableClosure ℚ) := by + let P := + numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ + let S := + numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ + let σS := + numberFieldTowerFinitePadicAuxiliarySubgroupLift + (K := K) (L := L) p τ + exact + (LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup_mk_apply_val + ℚ (SeparableClosure ℚ) + S P.field P.below + P.toFiniteGaloisExtension.normal σS x).symm + +/-- Restricting the auxiliary automorphism through the actual +base-change square recovers the finite quotient coordinate of the +distinguished lift. -/ +theorem numberFieldTowerFinitePadicAuxiliaryAutomorphism_restriction + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) + (numberFieldTowerFinitePadicAuxiliaryAutomorphism + (K := K) (L := L) p τ) = + numberFieldTowerExtensionQuotientEquivGaloisGroup K L + (numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ) := by + let E := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ).below + let σE := + numberFieldTowerFinitePadicAuxiliaryAutomorphism + (K := K) (L := L) p τ + apply AlgEquiv.ext + intro x + apply (numberFieldSeparableClosureEmbedding L).injective + calc + numberFieldSeparableClosureEmbedding L + (((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) σE x) = + ((σE (algebraMap L E x) : E) : + SeparableClosure ℚ) := by + exact congrArg Subtype.val + (AlgEquiv.restrictNormal_commutes + ((AlgEquiv.restrictScalarsHom K) σE) L x) + _ = τ.1 (numberFieldSeparableClosureEmbedding L x) := by + rw [ + numberFieldTowerFinitePadicAuxiliaryAutomorphism_apply_val + (K := K) (L := L) p τ] + rfl + _ = + numberFieldSeparableClosureEmbedding L + (numberFieldTowerExtensionQuotientEquivGaloisGroup K L + (numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ) x) := by + exact + (numberFieldTowerExtensionQuotientEquivGaloisGroup_mk_apply + (K := K) (L := L) τ x).symm + +/-- Restriction of the chosen separable-closure place to the genuine +auxiliary base field. This is an exact extension of the original +finite place of `K`, not merely an equivalent valuation. -/ +noncomputable def + numberFieldTowerFinitePadicAuxiliaryBasePlaceExtension + (v : HeightOneSpectrum (𝓞 K)) + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ)) := by + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ) + let wΩ := + numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v (chosenFinitePlaceExtension (L := L) v) + refine + ⟨wΩ.1.comp (f := F.val.toRingHom) F.val.injective, ?_⟩ + intro x + change + wΩ.1 (numberFieldTowerLowerEmbedding K L x) = + NumberField.HeightOneSpectrum.adicAbv K v x + exact wΩ.2 x + +/-- Restriction of the same separable-closure place to the genuine +auxiliary compositum. Its restriction to `K` agrees exactly with the +original normalized finite absolute value. -/ +noncomputable def + numberFieldTowerFinitePadicAuxiliaryTopPlaceExtension + (v : HeightOneSpectrum (𝓞 K)) + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv K v) + (LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ).below) := by + let E := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ).below + let wΩ := + numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v (chosenFinitePlaceExtension (L := L) v) + refine + ⟨wΩ.1.comp (f := E.val.toRingHom) E.val.injective, ?_⟩ + intro x + change + wΩ.1 (numberFieldTowerLowerEmbedding K L x) = + NumberField.HeightOneSpectrum.adicAbv K v x + exact wΩ.2 x + +/-- The centre of the restricted place on the auxiliary compositum +lies above the centre of the same place on the auxiliary base field. -/ +theorem + numberFieldTowerFinitePadicAuxiliaryTopPlace_below + (v : HeightOneSpectrum (𝓞 K)) + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (hτ : + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ ≠ + 1) : + let S := + numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ + let P := + numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) S + let E := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + letI hHfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + S (le_baseField S)) := + (numberFieldTowerFinitePadicAuxiliaryAbstractField + (K := K) (L := L) p τ hτ).finite + letI hPfinite : Finite + (S.toSubgroup ⧸ + extensionSubgroup S P.field P.below) := + P.finite + letI _ : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) S hHfinite + letI _ : FiniteDimensional F E := + LocalClassFieldTheory.abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + S P.field P.below hHfinite hPfinite + letI _ : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' rfl + letI _ : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + letI _ : NumberField F := + NumberField.of_module_finite ℚ F + letI _ : NumberField E := + NumberField.of_module_finite ℚ E + letI _ : Algebra K F := + numberFieldTowerFinitePadicAuxiliaryBaseAlgebra + (K := K) (L := L) p τ + finitePlaceBelow (K := F) + (finitePlaceExtensionCentre + (K := K) (L := E) v + (numberFieldTowerFinitePadicAuxiliaryTopPlaceExtension + (K := K) (L := L) v p τ)) = + finitePlaceExtensionCentre + (K := K) (L := F) v + (numberFieldTowerFinitePadicAuxiliaryBasePlaceExtension + (K := K) (L := L) v p τ) := by + dsimp only + let S := + numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ + let P := + numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) S + let E := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let hHfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + S (le_baseField S)) := + (numberFieldTowerFinitePadicAuxiliaryAbstractField + (K := K) (L := L) p τ hτ).finite + let hPfinite : Finite + (S.toSubgroup ⧸ + extensionSubgroup S P.field P.below) := + P.finite + let auxiliaryBaseFiniteDimensional : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) S hHfinite + let auxiliaryTopFiniteDimensional : FiniteDimensional F E := + LocalClassFieldTheory.abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + S P.field P.below hHfinite hPfinite + let auxiliaryScalarTower : IsScalarTower ℚ F E := + IsScalarTower.of_algebraMap_eq' rfl + let auxiliaryAbsoluteFiniteDimensional : FiniteDimensional ℚ E := + FiniteDimensional.trans ℚ F E + let auxiliaryBaseNumberField : NumberField F := + NumberField.of_module_finite ℚ F + let auxiliaryTopNumberField : NumberField E := + NumberField.of_module_finite ℚ E + let auxiliaryOriginalBaseAlgebra : Algebra K F := + numberFieldTowerFinitePadicAuxiliaryBaseAlgebra + (K := K) (L := L) p τ + let wF := + numberFieldTowerFinitePadicAuxiliaryBasePlaceExtension + (K := K) (L := L) v p τ + let wE := + numberFieldTowerFinitePadicAuxiliaryTopPlaceExtension + (K := K) (L := L) v p τ + apply HeightOneSpectrum.ext + ext x + change + algebraMap (𝓞 F) (𝓞 E) x ∈ + finitePlaceExtensionCentreIdeal + (K := K) (L := E) v wE ↔ + x ∈ + finitePlaceExtensionCentreIdeal + (K := K) (L := F) v wF + rw [ + mem_finitePlaceExtensionCentreIdeal_iff, + mem_finitePlaceExtensionCentreIdeal_iff] + rfl + +/-- Evaluation of the distinguished auxiliary automorphism through the +restricted top-field place. Isolating this coercion calculation prevents the +whole decomposition-group proof from normalizing the fixed-field tower. -/ +private theorem + numberFieldTowerFinitePadicAuxiliaryTopPlace_automorphism_apply + (v : HeightOneSpectrum (𝓞 K)) + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + let P := numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ + let E := LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let wE := numberFieldTowerFinitePadicAuxiliaryTopPlaceExtension + (K := K) (L := L) v p τ + let σE := numberFieldTowerFinitePadicAuxiliaryAutomorphism + (K := K) (L := L) p τ + ∀ x : E, + wE.1 (σE x) = + (numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v (chosenFinitePlaceExtension (L := L) v)).1 + (τ.1 (x : SeparableClosure ℚ)) := by + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + dsimp only + intro x + change + (numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v (chosenFinitePlaceExtension (L := L) v)).1 + ((numberFieldTowerFinitePadicAuxiliaryAutomorphism + (K := K) (L := L) p τ x : + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ).below) : SeparableClosure ℚ) = _ + rw [ + numberFieldTowerFinitePadicAuxiliaryAutomorphism_apply_val + (K := K) (L := L) p τ] + +/-- The distinguished auxiliary automorphism preserves the top-field place +obtained by restricting the original separable-closure place. -/ +private theorem numberFieldTowerFinitePadicAuxiliaryAutomorphism_mem_topPlaceDecomposition + (v : HeightOneSpectrum (𝓞 K)) + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (hdecomposition : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + (numberFieldTowerSeparableClosureEquivBaseSubgroup K L).symm τ ∈ + absoluteValueDecompositionGroup K + (numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v (chosenFinitePlaceExtension (L := L) v)).1) : + let S := numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ + let F := LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) S + let wE := numberFieldTowerFinitePadicAuxiliaryTopPlaceExtension + (K := K) (L := L) v p τ + let σE := numberFieldTowerFinitePadicAuxiliaryAutomorphism + (K := K) (L := L) p τ + σE ∈ absoluteValueDecompositionGroup F wE.1 := by + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + dsimp only at hdecomposition ⊢ + let S := + numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) S + let wE := + numberFieldTowerFinitePadicAuxiliaryTopPlaceExtension + (K := K) (L := L) v p τ + let σE := + numberFieldTowerFinitePadicAuxiliaryAutomorphism + (K := K) (L := L) p τ + intro x + change + wE.1 (σE x) < 1 ↔ + wE.1 x < 1 + rw [ + numberFieldTowerFinitePadicAuxiliaryTopPlace_automorphism_apply + (K := K) (L := L) v p τ x, + show + wE.1 x = + (numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v + (chosenFinitePlaceExtension (L := L) v)).1 + (x : SeparableClosure ℚ) from rfl] + exact hdecomposition (x : SeparableClosure ℚ) + +/-- The restricted top-field place and the chosen extension above its centre +have the same decomposition group. -/ +private theorem numberFieldTowerFinitePadicAuxiliaryTopDecompositionGroup_eq_chosen + (v : HeightOneSpectrum (𝓞 K)) + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (hτ : + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ ≠ 1) : + let S := numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ + let P := numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ + let F := LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) S + let E := LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + letI hHfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + S (le_baseField S)) := + (numberFieldTowerFinitePadicAuxiliaryAbstractField + (K := K) (L := L) p τ hτ).finite + letI hPfinite : Finite + (S.toSubgroup ⧸ extensionSubgroup S P.field P.below) := P.finite + letI : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) S hHfinite + letI : FiniteDimensional F E := + LocalClassFieldTheory.abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) S P.field P.below hHfinite hPfinite + letI : IsScalarTower ℚ F E := IsScalarTower.of_algebraMap_eq' rfl + letI : FiniteDimensional ℚ E := FiniteDimensional.trans ℚ F E + letI : NumberField F := NumberField.of_module_finite ℚ F + letI : NumberField E := NumberField.of_module_finite ℚ E + letI : IsAbelianGalois F E := + GlobalClassFields.finiteAbelianSubextensionAbstractRelativeFixedFieldIsAbelianGalois P + letI : Algebra K F := + numberFieldTowerFinitePadicAuxiliaryBaseAlgebra + (K := K) (L := L) p τ + let wF := numberFieldTowerFinitePadicAuxiliaryBasePlaceExtension + (K := K) (L := L) v p τ + let wE := numberFieldTowerFinitePadicAuxiliaryTopPlaceExtension + (K := K) (L := L) v p τ + let V := finitePlaceExtensionCentre (K := K) (L := F) v wF + absoluteValueDecompositionGroup F wE.1 = + absoluteValueDecompositionGroup F + (chosenFinitePlaceExtension (L := E) V).1 := by + dsimp only + let H := + numberFieldTowerFinitePadicAuxiliaryAbstractField + (K := K) (L := L) p τ hτ + let S := + numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ + let P := + numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) S + let E := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + let hHfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + S (le_baseField S)) := + H.finite + let hPfinite : Finite + (S.toSubgroup ⧸ extensionSubgroup S P.field P.below) := + P.finite + let : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) S hHfinite + let : FiniteDimensional F E := + LocalClassFieldTheory.abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) S P.field P.below hHfinite hPfinite + let : IsScalarTower ℚ F E := IsScalarTower.of_algebraMap_eq' rfl + let : FiniteDimensional ℚ E := FiniteDimensional.trans ℚ F E + let : NumberField F := NumberField.of_module_finite ℚ F + let : NumberField E := NumberField.of_module_finite ℚ E + let : IsAbelianGalois F E := + GlobalClassFields.finiteAbelianSubextensionAbstractRelativeFixedFieldIsAbelianGalois P + let : Algebra K F := + numberFieldTowerFinitePadicAuxiliaryBaseAlgebra + (K := K) (L := L) p τ + let wF := + numberFieldTowerFinitePadicAuxiliaryBasePlaceExtension + (K := K) (L := L) v p τ + let wE := + numberFieldTowerFinitePadicAuxiliaryTopPlaceExtension + (K := K) (L := L) v p τ + let V := finitePlaceExtensionCentre (K := K) (L := F) v wF + let W := finitePlaceExtensionCentre (K := K) (L := E) v wE + let Wover : + {W' : HeightOneSpectrum (𝓞 E) // + finitePlaceBelow (K := F) W' = V} := + ⟨W, + numberFieldTowerFinitePadicAuxiliaryTopPlace_below + (K := K) (L := L) v p τ hτ⟩ + let wFE : + AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv F V) E := + (finitePlaceExtensionEquivAbove + (K := F) (L := E) V).symm Wover + have hwFEcentre : + finitePlaceExtensionCentre + (K := F) (L := E) V wFE = + W := by + exact + congrArg Subtype.val + ((finitePlaceExtensionEquivAbove + (K := F) (L := E) V).apply_symm_apply Wover) + have hwEquiv : wE.1.IsEquiv wFE.1 := by + apply + finitePlaceExtensions_isEquiv_of_centres_eq + (F := K) (M := F) v V wE wFE + exact hwFEcentre.symm + calc + absoluteValueDecompositionGroup F wE.1 = + absoluteValueDecompositionGroup F wFE.1 := + absoluteValueDecompositionGroup_eq_of_absoluteValue_isEquiv + (F := F) wE.1 wFE.1 hwEquiv + _ = + absoluteValueDecompositionGroup F + (chosenFinitePlaceExtension (L := E) V).1 := + absoluteValueDecompositionGroup_eq_of_exactExtensions_of_isMulCommutative + (F := F) + (NumberField.HeightOneSpectrum.adicAbv F V) + (RayClass.adicAbv_isNontrivial V) + wFE + (chosenFinitePlaceExtension (L := E) V) + +/-- Pointwise form of norm/restriction naturality. Keeping the function +equality and its coercion normalization in this small declaration prevents +the auxiliary-field witness construction below from repeatedly elaborating +the full pair of composite homomorphisms. -/ +private theorem globalNormResidueMonoidHomOfEmbedding_norm_restriction_apply + (K K' L L' : Type) + [Field K] [NumberField K] + [Field K'] [NumberField K'] + [Field L] [NumberField L] + [Field L'] [NumberField L'] + [Algebra K K'] [Algebra K L] [Algebra K L'] + [Algebra K' L'] [Algebra L L'] + [IsScalarTower K K' L'] [IsScalarTower K L L'] + [FiniteDimensional K L] [IsAbelianGalois K L] + [FiniteDimensional K' L'] [IsAbelianGalois K' L'] + [FiniteDimensional K K'] [IsGalois K K'] + (j : L' →ₐ[ℚ] SeparableClosure ℚ) + (c : IdeleClassGroup K') : + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) + (globalNormResidueMonoidHomOfEmbedding K' L' j c) = + globalNormResidueMonoidHomOfEmbedding K L + (j.comp (IsScalarTower.toAlgHom ℚ L L')) + (_root_.ideleClassNorm K K' c) := by + exact + DFunLike.congr_fun + (globalNormResidueMonoidHomOfEmbedding_norm_restriction + (K := K) (L := L) (K' := K') (L' := L') j) c + + + +/-- The auxiliary-field construction produces a lower local unit +whose chosen local Artin value and global norm-residue value are both +the finite quotient coordinate of the distinguished lift. -/ +private theorem numberFieldTowerFinitePadicAuxiliaryLocalGlobalRepresentative_nonempty + (v : HeightOneSpectrum (𝓞 K)) + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (hτ : + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ ≠ 1) + (hdecomposition : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + (numberFieldTowerSeparableClosureEquivBaseSubgroup K L).symm τ ∈ + absoluteValueDecompositionGroup K + (numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v (chosenFinitePlaceExtension (L := L) v)).1) + (n : ℕ) (hn : 0 < n) + (hdegree : + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ = + (Multiplicative.ofAdd (1 : ℤ_[p.1])) ^ n) + (hprimaryQuotient : + numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ ∈ + CommGroup.primaryComponent + ((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) + p.1) : + Nonempty {z : (v.adicCompletion K)ˣ // + chosenFinitePlaceArtinMonoidHom (K := K) (L := L) v z = + numberFieldTowerExtensionQuotientEquivGaloisGroup K L + (numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ) ∧ + globalNormResidueMonoidHom K L + (IdeleGroup.finitePlaceIdeleClass v z) = + numberFieldTowerExtensionQuotientEquivGaloisGroup K L + (numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ)} := by + refine ⟨?_⟩ + let H := + numberFieldTowerFinitePadicAuxiliaryAbstractField + (K := K) (L := L) p τ hτ + let S := + numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ + let P := + numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ + let F := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) S + let E := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below + letI hHfinite : Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + S (le_baseField S)) := + H.finite + letI hPfinite : Finite + (S.toSubgroup ⧸ extensionSubgroup S P.field P.below) := + P.finite + letI auxiliaryBaseNumberField : NumberField F := by + let : FiniteDimensional ℚ F := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) S hHfinite + exact NumberField.of_module_finite ℚ F + letI auxiliaryTopNumberField : NumberField E := by + let : FiniteDimensional F E := + LocalClassFieldTheory.abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) + S P.field P.below hHfinite hPfinite + exact NumberField.of_module_finite F E + letI auxiliaryAbelianGalois : IsAbelianGalois F E := + GlobalClassFields.finiteAbelianSubextensionAbstractRelativeFixedFieldIsAbelianGalois P + letI auxiliaryOriginalBaseAlgebra : Algebra K F := + numberFieldTowerFinitePadicAuxiliaryBaseAlgebra + (K := K) (L := L) p τ + letI auxiliaryOriginalTopAlgebra : Algebra L E := + numberFieldTowerFinitePadicAuxiliaryTopAlgebra + (K := K) (L := L) p τ + letI auxiliaryOriginalBaseTopAlgebra : Algebra K E := + numberFieldTowerFinitePadicAuxiliaryOriginalBaseTopAlgebra + (K := K) (L := L) p τ + letI auxiliaryOriginalTopScalarTower : IsScalarTower K L E := + numberFieldTowerFinitePadicAuxiliary_originalTopScalarTower + (K := K) (L := L) p τ + letI auxiliaryBaseTopScalarTower : IsScalarTower K F E := + numberFieldTowerFinitePadicAuxiliary_baseTopScalarTower + (K := K) (L := L) p τ + letI auxiliaryOriginalBaseGalois : IsGalois K F := + numberFieldTowerFinitePadicAuxiliaryBase_isGalois + (K := K) (L := L) p τ + let auxiliaryOriginalTopAlgHom : L →ₐ[ℚ] E := + numberFieldTowerFinitePadicAuxiliaryTopEmbedding + (K := K) (L := L) p τ + let wF := + numberFieldTowerFinitePadicAuxiliaryBasePlaceExtension + (K := K) (L := L) v p τ + let wE := + numberFieldTowerFinitePadicAuxiliaryTopPlaceExtension + (K := K) (L := L) v p τ + let V := + finitePlaceExtensionCentre + (K := K) (L := F) v wF + have hVbelow : finitePlaceBelow (K := K) V = v := + finitePlaceBelow_finitePlaceExtensionCentre + (K := K) (L := F) v wF + let Vover : + {V' : HeightOneSpectrum (𝓞 F) // + finitePlaceBelow (K := K) V' = v} := + ⟨V, hVbelow⟩ + letI auxiliaryCompletionAlgebra : + Algebra (v.adicCompletion K) (V.adicCompletion F) := + (finitePlaceAdicCompletionMap K F v Vover).toAlgebra + let σE : Gal(E/F) := + numberFieldTowerFinitePadicAuxiliaryAutomorphism + (K := K) (L := L) p τ + have hσtop : + σE ∈ absoluteValueDecompositionGroup F wE.1 := + numberFieldTowerFinitePadicAuxiliaryAutomorphism_mem_topPlaceDecomposition + (K := K) (L := L) v p τ hdecomposition + have hgroup := + numberFieldTowerFinitePadicAuxiliaryTopDecompositionGroup_eq_chosen + (K := K) (L := L) v p τ hτ + have hσchosen : + σE ∈ absoluteValueDecompositionGroup F + (chosenFinitePlaceExtension (L := E) V).1 := by + rw [← hgroup] + exact hσtop + have hRange : + σE ∈ (chosenFinitePlaceArtinMonoidHom + (K := F) (L := E) V).range := by + rw [chosenFinitePlaceArtinMonoidHom_range (K := F) (L := E) V] + exact hσchosen + let y : (V.adicCompletion F)ˣ := Classical.choose hRange + have hy : + chosenFinitePlaceArtinMonoidHom (K := F) (L := E) V y = + numberFieldTowerFinitePadicAuxiliaryAutomorphism + (K := K) (L := L) p τ := + Classical.choose_spec hRange + let z : (v.adicCompletion K)ˣ := + LocalFieldTheory.normUnits + (v.adicCompletion K) (V.adicCompletion F) y + have hz : + z = LocalFieldTheory.normUnits + (v.adicCompletion K) (V.adicCompletion F) y := by + rfl + let σK : Gal(L/K) := + numberFieldTowerExtensionQuotientEquivGaloisGroup K L + (numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ) + let restriction : Gal(E/F) →* Gal(L/K) := + (AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K) + have hrestrict : restriction σE = σK := + numberFieldTowerFinitePadicAuxiliaryAutomorphism_restriction + (K := K) (L := L) p τ + have hlocal : + chosenFinitePlaceArtinMonoidHom (K := K) (L := L) v z = + σK := by + rw [hz] + have hnat := + DFunLike.congr_fun + (chosenFinitePlaceArtinMonoidHom_norm_restriction_of_below_eq + (K := K) (L := L) (K' := F) (L' := E) + v V hVbelow) y + calc + chosenFinitePlaceArtinMonoidHom (K := K) (L := L) v + (LocalFieldTheory.normUnits + (v.adicCompletion K) (V.adicCompletion F) y) = + restriction + (chosenFinitePlaceArtinMonoidHom (K := F) (L := E) V y) := by + simpa only [ + MonoidHom.coe_comp, Function.comp_apply, restriction] + using hnat.symm + _ = restriction σE := congrArg restriction hy + _ = σK := hrestrict + let j : E →ₐ[ℚ] SeparableClosure ℚ := + E.val.restrictScalars ℚ + have hjLower : + j.comp auxiliaryOriginalTopAlgHom = + AlgebraicNumberTheory.numberFieldSeparableClosureEmbedding L := by + apply AlgHom.ext + intro a + exact + numberFieldTowerFinitePadicAuxiliaryTopEmbedding_coe + (K := K) (L := L) p τ a + have hPUnramified : + P.toFiniteGaloisExtension.IsUnramified + rationalCyclotomicDegreeData := + numberFieldTowerFinitePadicAuxiliaryCompositumSubextension_isUnramified + (K := K) (L := L) p τ n hn hdegree hprimaryQuotient + have hcompat : + (globalNormResidueMonoidHomOfEmbedding F E j).comp + (IdeleGroup.finitePlaceIdeleClass V) = + chosenFinitePlaceArtinMonoidHom (K := F) (L := E) V := + globalNormResidueMonoidHomOfEmbedding_comp_finitePlaceIdeleClass_of_abstractFixedFieldUnramified + H P hPUnramified V + have hupper : + globalNormResidueMonoidHomOfEmbedding F E j + (IdeleGroup.finitePlaceIdeleClass V y) = + σE := + (congrArg + (fun φ : (V.adicCompletion F)ˣ →* Gal(E/F) => φ y) + hcompat).trans hy + have hnormClass : + _root_.ideleClassNorm K F + (IdeleGroup.finitePlaceIdeleClass V y) = + IdeleGroup.finitePlaceIdeleClass v z := by + rw [hz] + simpa only [Vover] using + (IdeleGroup.ideleClassNorm_finitePlaceIdeleClass_eq_normUnits + (K := K) (L := F) v Vover y) + have hglobal : + globalNormResidueMonoidHom K L + (IdeleGroup.finitePlaceIdeleClass v z) = + σK := by + calc + globalNormResidueMonoidHom K L + (IdeleGroup.finitePlaceIdeleClass v z) = + globalNormResidueMonoidHom K L + (_root_.ideleClassNorm K F + (IdeleGroup.finitePlaceIdeleClass V y)) := + congrArg (globalNormResidueMonoidHom K L) hnormClass.symm + _ = globalNormResidueMonoidHomOfEmbedding K L + (j.comp auxiliaryOriginalTopAlgHom) + (_root_.ideleClassNorm K F + (IdeleGroup.finitePlaceIdeleClass V y)) := by + rw [hjLower, + ← globalNormResidueMonoidHom_eq_ofEmbedding_standard] + _ = ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) + (globalNormResidueMonoidHomOfEmbedding F E j + (IdeleGroup.finitePlaceIdeleClass V y)) := by + apply Eq.symm + apply + globalNormResidueMonoidHomOfEmbedding_norm_restriction_apply + _ = ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) σE := + congrArg + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) hupper + _ = restriction σE := rfl + _ = σK := hrestrict + exact ⟨z, hlocal, hglobal⟩ + + +/-- A chosen local unit represents the prescribed finite quotient class under both the local Artin +map and the global norm-residue map. -/ +noncomputable def numberFieldTowerFinitePadicAuxiliaryLocalGlobalRepresentative + (v : HeightOneSpectrum (𝓞 K)) + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (hτ : + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ ≠ 1) + (hdecomposition : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + (numberFieldTowerSeparableClosureEquivBaseSubgroup K L).symm τ ∈ + absoluteValueDecompositionGroup K + (numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v (chosenFinitePlaceExtension (L := L) v)).1) + (n : ℕ) (hn : 0 < n) + (hdegree : + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ = + (Multiplicative.ofAdd (1 : ℤ_[p.1])) ^ n) + (hprimaryQuotient : + numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ ∈ + CommGroup.primaryComponent + ((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) + p.1) : + {z : (v.adicCompletion K)ˣ // + chosenFinitePlaceArtinMonoidHom (K := K) (L := L) v z = + numberFieldTowerExtensionQuotientEquivGaloisGroup K L + (numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ) ∧ + globalNormResidueMonoidHom K L + (IdeleGroup.finitePlaceIdeleClass v z) = + numberFieldTowerExtensionQuotientEquivGaloisGroup K L + (numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ)} := + Classical.choice (numberFieldTowerFinitePadicAuxiliaryLocalGlobalRepresentative_nonempty + v p τ hτ hdecomposition n hn hdegree hprimaryQuotient) + +/-- Every genuine finite-place decomposition automorphism has a +compatible embedded absolute lift with the same finite quotient class +and positive integral cyclotomic `p`-adic degree. -/ +theorem exists_numberFieldTowerFinitePadicLift_of_finitePlace + (v : HeightOneSpectrum (𝓞 K)) + (p : Nat.Primes) + (σ : + absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := L) v).1) : + letI _ : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI _ : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI _ : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + ∃ τ : (numberFieldTowerBaseSubgroup K L).toSubgroup, + numberFieldTowerExtensionQuotientEquivGaloisGroup K L + (numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ) = + σ.1 ∧ + (numberFieldTowerSeparableClosureEquivBaseSubgroup K L).symm τ ∈ + absoluteValueDecompositionGroup K + (numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v + (chosenFinitePlaceExtension (L := L) v)).1 ∧ + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ ≠ + 1 ∧ + ∃ n : ℕ, 0 < n ∧ + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ = + (Multiplicative.ofAdd (1 : ℤ_[p.1])) ^ n := by + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + let : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + let : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + obtain ⟨τΩ, hτΩrestrict, n, hn, hτΩdegree⟩ := + exists_finitePlaceSeparableClosureLift_with_positivePadicCyclotomicDegree + (K := K) (L := L) v p σ + let τ : + (numberFieldTowerBaseSubgroup K L).toSubgroup := + numberFieldTowerSeparableClosureEquivBaseSubgroup + K L τΩ.1 + have hfinite : + numberFieldTowerExtensionQuotientEquivGaloisGroup K L + (numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ) = + σ.1 := by + change + numberFieldTowerExtensionQuotientEquivGaloisGroup K L + (QuotientGroup.mk + (numberFieldTowerSeparableClosureEquivBaseSubgroup + K L τΩ.1)) = + σ.1 + rw [ + numberFieldTowerExtensionQuotientEquivGaloisGroup_mk_baseSubgroupEquiv] + exact congrArg Subtype.val hτΩrestrict + have hdegree : + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ = + (Multiplicative.ofAdd (1 : ℤ_[p.1])) ^ n := by + exact hτΩdegree + have hdecomposition : + (numberFieldTowerSeparableClosureEquivBaseSubgroup K L).symm τ ∈ + absoluteValueDecompositionGroup K + (numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v + (chosenFinitePlaceExtension (L := L) v)).1 := by + simpa only [τ, MulEquiv.symm_apply_apply] using τΩ.2 + refine + ⟨τ, hfinite, hdecomposition, ?_, n, hn, hdegree⟩ + rw [hdegree] + exact + PadicInt.multiplicative_positiveNatDegree_ne_one + p.1 n hn + +/-- Generation of the actual finite Galois group transports back +through the compatible finite quotient coordinate. -/ +theorem + numberFieldTowerFiniteQuotientCoordinate_generates_of_galoisGenerator + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (σ : Gal(L/K)) + (hτσ : + numberFieldTowerExtensionQuotientEquivGaloisGroup K L + (numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ) = + σ) + (hσ : Subgroup.closure ({σ} : Set (Gal(L/K))) = ⊤) : + Subgroup.closure + ({numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ} : + Set + ((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L))) = + ⊤ := by + let e := + numberFieldTowerExtensionQuotientEquivGaloisGroup K L + let q : + (numberFieldTowerFiniteGaloisSubextension + K L).extensionQuotient := + numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ + have hq : e.toMonoidHom q = σ := by + exact hτσ + change + Subgroup.closure + ({q} : + Set + (numberFieldTowerFiniteGaloisSubextension + K L).extensionQuotient) = + ⊤ + apply Subgroup.map_injective (f := e.toMonoidHom) e.injective + rw [MonoidHom.map_closure, Set.image_singleton, + hq, hσ, + Subgroup.map_top_of_surjective e.toMonoidHom e.surjective] + +/-- If the finite quotient coordinate of a lift generates the whole +finite Galois quotient, then its cyclic preimage together with the +top-field subgroup generates the whole embedded absolute Galois +group. -/ +theorem + numberFieldTowerFinitePadicCyclicPreimage_sup_extensionSubgroup_eq_top + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (hgenerate : + Subgroup.closure + ({numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ} : + Set + ((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L))) = + ⊤) : + (numberFieldTowerFinitePadicCyclicPreimage + (K := K) (L := L) p τ).toSubgroup ⊔ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) = + ⊤ := by + let H := + numberFieldTowerBaseSubgroup K L + let N := + extensionSubgroup + H + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) + let Q := H.toSubgroup ⧸ N + let P := + numberFieldTowerFinitePadicImage + (K := K) (L := L) p + let coordinate := + numberFieldTowerFinitePadicCoordinate + (K := K) (L := L) p + let rangeRestriction := + numberFieldTowerFinitePadicRangeRestriction + (K := K) (L := L) p + let γ : P.toSubgroup := + rangeRestriction τ + let Γ := + ClassFormation.padicCyclicClosure γ + let finiteProjection : + P.toSubgroup →* + Q := + (MonoidHom.fst Q + (Multiplicative ℤ_[p.1])).comp + P.toSubgroup.subtype + have hprojection : + Γ.toSubgroup.map finiteProjection = ⊤ := by + apply top_unique + rw [← hgenerate] + apply (Subgroup.closure_le _).2 + intro q hq + rw [Set.mem_singleton_iff] at hq + subst q + refine + ⟨γ, + (ClassFormation.padicCyclicClosureGenerator γ).2, + ?_⟩ + rfl + have hquotientSurjective : + ∀ q : Q, + ∃ u : H.toSubgroup, + u ∈ + (numberFieldTowerFinitePadicCyclicPreimage + (K := K) (L := L) p τ).toSubgroup ∧ + numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) u = + q := by + intro q + have hq : + q ∈ Γ.toSubgroup.map finiteProjection := by + rw [hprojection] + trivial + obtain ⟨z, hzΓ, hzq⟩ := hq + obtain ⟨u, hu⟩ := + numberFieldTowerFinitePadicRangeRestriction_surjective + (K := K) (L := L) p z + refine ⟨u, ?_, ?_⟩ + · change rangeRestriction u ∈ Γ.toSubgroup + rw [hu] + exact hzΓ + · calc + numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) u = + finiteProjection (rangeRestriction u) := rfl + _ = finiteProjection z := congrArg finiteProjection hu + _ = q := hzq + apply top_unique + intro h _ + obtain ⟨u, huU, huq⟩ := + hquotientSurjective + (numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) h) + let k : H.toSubgroup := + h * u⁻¹ + have hkN : k ∈ N := by + apply (QuotientGroup.eq_one_iff (N := N) k).mp + change + numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) (h * u⁻¹) = + 1 + rw [map_mul, map_inv, huq, mul_inv_cancel] + have hkSup : + k ∈ + (numberFieldTowerFinitePadicCyclicPreimage + (K := K) (L := L) p τ).toSubgroup ⊔ + N := + (le_sup_right : + N ≤ + (numberFieldTowerFinitePadicCyclicPreimage + (K := K) (L := L) p τ).toSubgroup ⊔ N) hkN + have huSup : + u ∈ + (numberFieldTowerFinitePadicCyclicPreimage + (K := K) (L := L) p τ).toSubgroup ⊔ + N := + (le_sup_left : + (numberFieldTowerFinitePadicCyclicPreimage + (K := K) (L := L) p τ).toSubgroup ≤ + (numberFieldTowerFinitePadicCyclicPreimage + (K := K) (L := L) p τ).toSubgroup ⊔ N) huU + have hku : + k * u = h := by + simp only [k, inv_mul_cancel_right] + rw [← hku] + exact + ((numberFieldTowerFinitePadicCyclicPreimage + (K := K) (L := L) p τ).toSubgroup ⊔ N).mul_mem + hkSup huSup + +/-- Ambient form of the generation statement: the auxiliary cyclic +fixed subgroup together with the subgroup fixing `L` generates the +subgroup fixing `K`. -/ +theorem + numberFieldTowerFinitePadicCyclicFixedSubgroup_sup_topSubgroup + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (hgenerate : + Subgroup.closure + ({numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ} : + Set + ((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L))) = + ⊤) : + (numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ).toSubgroup ⊔ + (numberFieldTowerTopSubgroup L).toSubgroup = + (numberFieldTowerBaseSubgroup K L).toSubgroup := by + let H := + numberFieldTowerBaseSubgroup K L + let T := + numberFieldTowerTopSubgroup L + let N := + extensionSubgroup + H T + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) + let U := + numberFieldTowerFinitePadicCyclicPreimage + (K := K) (L := L) p τ + have hrelative : + U.toSubgroup ⊔ N = ⊤ := + numberFieldTowerFinitePadicCyclicPreimage_sup_extensionSubgroup_eq_top + (K := K) (L := L) p τ hgenerate + have hNmap : + N.map H.toSubgroup.subtype = + T.toSubgroup := by + exact + Subgroup.map_subgroupOf_eq_of_le + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) + change + U.toSubgroup.map H.toSubgroup.subtype ⊔ + T.toSubgroup = + H.toSubgroup + rw [← hNmap, ← Subgroup.map_sup, + hrelative, ← MonoidHom.range_eq_map, + H.toSubgroup.range_subtype] + +/-- The concrete auxiliary fixed field is linearly disjoint from `L` +over the compatible embedded copy of `K`. -/ +theorem + numberFieldTowerFinitePadicCyclicFixedField_inf_topField + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (hgenerate : + Subgroup.closure + ({numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ} : + Set + ((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L))) = + ⊤) : + numberFieldTowerFinitePadicCyclicFixedField + (K := K) (L := L) p τ ⊓ + numberFieldInRationalSeparableClosure L = + numberFieldTowerBaseField K L := by + let S := + numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ + let T := + numberFieldTowerTopSubgroup L + let H := + numberFieldTowerBaseSubgroup K L + change + IntermediateField.fixedField S.toSubgroup ⊓ + numberFieldInRationalSeparableClosure L = + numberFieldTowerBaseField K L + rw [ + ← InfiniteGalois.fixedField_fixingSubgroup + (numberFieldInRationalSeparableClosure L), + ← InfiniteGalois.fixedField_fixingSubgroup + (numberFieldTowerBaseField K L)] + change + IntermediateField.fixedField S.toSubgroup ⊓ + IntermediateField.fixedField T.toSubgroup = + IntermediateField.fixedField H.toSubgroup + rw [ + ← IntermediateField.fixedField_sup_eq_inf, + numberFieldTowerFinitePadicCyclicFixedSubgroup_sup_topSubgroup + (K := K) (L := L) p τ hgenerate] + +/-- If the finite quotient coordinate is `p`-primary, adjoining the +actual rational `p`-primary cyclotomic field to the auxiliary fixed +field contains the compatible copy of `L`. + +This is the field-theoretic conclusion of the simultaneous +finite/cyclotomic lift: the intersection of the two fixing subgroups +already fixes `L`, hence their fixed-field compositum contains `L`. -/ +theorem + numberFieldTowerTopField_le_finitePadicCyclicFixedField_sup_padicCyclotomicField + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (n : ℕ) (hn : 0 < n) + (hdegree : + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ = + (Multiplicative.ofAdd (1 : ℤ_[p.1])) ^ n) + (hprimary : + numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ ∈ + CommGroup.primaryComponent + ((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) + p.1) : + numberFieldInRationalSeparableClosure L ≤ + numberFieldTowerFinitePadicCyclicFixedField + (K := K) (L := L) p τ ⊔ + rationalCyclotomicPadicField p := by + let S := + numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ + let T := + numberFieldTowerTopSubgroup L + let F := + numberFieldTowerFinitePadicCyclicFixedField + (K := K) (L := L) p τ + let C : @IntermediateField ℚ (SeparableClosure ℚ) _ _ + rationalSeparableClosureAlgebra := + rationalCyclotomicPadicField p + have hfixing : + (F ⊔ C).fixingSubgroup ≤ + T.toSubgroup := by + change + (IntermediateField.fixedField S.toSubgroup ⊔ C).fixingSubgroup ≤ + T.toSubgroup + rw [ + IntermediateField.fixingSubgroup_sup, + InfiniteGalois.fixingSubgroup_fixedField S] + intro σ hσ + apply + numberFieldTowerFinitePadicCyclicFixedSubgroup_inf_absolutePadicKernel_le_topSubgroup + (K := K) (L := L) p τ n hn hdegree hprimary + refine ⟨hσ.1, ?_⟩ + let : Algebra ℚ rationalCyclotomicZHatField := + rationalCyclotomicZHatField.algebra' + let : @Normal ℚ rationalCyclotomicZHatField _ _ + rationalCyclotomicZHatField.algebra' := + rationalCyclotomicZHatField_normal + let E := + rationalCyclotomicPadicFieldWithinZHat p + change + rationalCyclotomicPadicCoordinate p + (rationalAbsoluteGaloisRestrictionToCyclotomicZHat σ) = + 1 + have hr : + rationalAbsoluteGaloisRestrictionToCyclotomicZHat σ ∈ + E.fixingSubgroup := by + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + apply Subtype.ext + have hfix : + σ x.1 = x.1 := + (IntermediateField.mem_fixingSubgroup_iff + (IntermediateField.lift E) σ).1 hσ.2 x.1 + ((IntermediateField.mem_lift x).2 hx) + exact + (AlgEquiv.restrictNormal_commutes + σ rationalCyclotomicZHatField x).trans hfix + rw [rationalCyclotomicPadicFieldWithinZHat_fixingSubgroup] + at hr + exact hr + rw [ + ← InfiniteGalois.fixedField_fixingSubgroup + (numberFieldInRationalSeparableClosure L)] + change + IntermediateField.fixedField T.toSubgroup ≤ + F ⊔ C + rw [ + ← InfiniteGalois.fixedField_fixingSubgroup + (F ⊔ C)] + exact + IntermediateField.fixedField_le hfixing + +/-- For a finite-place automorphism generating `Gal(L/K)`, construct +the genuine auxiliary number field used in the cyclotomic reduction. + +The field is finite over `ℚ`, contains the compatible copy of `K`, and +has intersection with the compatible copy of `L` exactly equal to that +copy of `K`. Its defining lift has the prescribed local restriction +and positive integral cyclotomic `p`-adic degree. -/ +theorem exists_finitePlaceCyclotomicAuxiliaryFixedField + (v : HeightOneSpectrum (𝓞 K)) + (p : Nat.Primes) + (σ : + absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := L) v).1) + (hσ : + Subgroup.closure + ({σ.1} : Set (Gal(L/K))) = + ⊤) : + letI _ : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI _ : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI _ : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + ∃ τ : (numberFieldTowerBaseSubgroup K L).toSubgroup, + numberFieldTowerExtensionQuotientEquivGaloisGroup K L + (numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ) = + σ.1 ∧ + (numberFieldTowerSeparableClosureEquivBaseSubgroup K L).symm τ ∈ + absoluteValueDecompositionGroup K + (numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v + (chosenFinitePlaceExtension (L := L) v)).1 ∧ + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ ≠ + 1 ∧ + FiniteDimensional ℚ + (numberFieldTowerFinitePadicCyclicFixedField + (K := K) (L := L) p τ) ∧ + numberFieldTowerBaseField K L ≤ + numberFieldTowerFinitePadicCyclicFixedField + (K := K) (L := L) p τ ∧ + numberFieldTowerFinitePadicCyclicFixedField + (K := K) (L := L) p τ ⊓ + numberFieldInRationalSeparableClosure L = + numberFieldTowerBaseField K L ∧ + ∃ n : ℕ, 0 < n ∧ + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ = + (Multiplicative.ofAdd (1 : ℤ_[p.1])) ^ n := by + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + let : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + let : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + obtain + ⟨τ, hτσ, hτdecomposition, hτdegree, + n, hn, hdegree⟩ := + exists_numberFieldTowerFinitePadicLift_of_finitePlace + (K := K) (L := L) v p σ + have hgenerate := + numberFieldTowerFiniteQuotientCoordinate_generates_of_galoisGenerator + (K := K) (L := L) τ σ.1 hτσ hσ + refine + ⟨τ, hτσ, hτdecomposition, hτdegree, + numberFieldTowerFinitePadicCyclicFixedField_finiteDimensional + (K := K) (L := L) p τ hτdegree, + numberFieldTowerBaseField_le_finitePadicCyclicFixedField + (K := K) (L := L) p τ, + numberFieldTowerFinitePadicCyclicFixedField_inf_topField + (K := K) (L := L) p τ hgenerate, + n, hn, hdegree⟩ + +/-- A `p`-primary local generator admits a genuine auxiliary number +field whose compositum with the rational `p`-primary cyclotomic field +contains `L`. + +Besides the field containment, the construction records the two +properties needed for descent: the auxiliary field meets `L` exactly +in `K`, and the chosen absolute lift has positive integral +cyclotomic degree. -/ +theorem exists_finitePlacePrimaryCyclotomicAuxiliaryFixedField + (v : HeightOneSpectrum (𝓞 K)) + (p : Nat.Primes) + (σ : + absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := L) v).1) + (hgenerate : + Subgroup.closure + ({σ.1} : Set (Gal(L/K))) = + ⊤) + (hprimary : + σ.1 ∈ + CommGroup.primaryComponent + (Gal(L/K)) p.1) : + letI _ : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI _ : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI _ : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + ∃ τ : (numberFieldTowerBaseSubgroup K L).toSubgroup, + numberFieldTowerExtensionQuotientEquivGaloisGroup K L + (numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ) = + σ.1 ∧ + (numberFieldTowerSeparableClosureEquivBaseSubgroup K L).symm τ ∈ + absoluteValueDecompositionGroup K + (numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v + (chosenFinitePlaceExtension (L := L) v)).1 ∧ + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ ≠ + 1 ∧ + FiniteDimensional ℚ + (numberFieldTowerFinitePadicCyclicFixedField + (K := K) (L := L) p τ) ∧ + numberFieldTowerBaseField K L ≤ + numberFieldTowerFinitePadicCyclicFixedField + (K := K) (L := L) p τ ∧ + numberFieldTowerFinitePadicCyclicFixedField + (K := K) (L := L) p τ ⊓ + numberFieldInRationalSeparableClosure L = + numberFieldTowerBaseField K L ∧ + numberFieldInRationalSeparableClosure L ≤ + numberFieldTowerFinitePadicCyclicFixedField + (K := K) (L := L) p τ ⊔ + rationalCyclotomicPadicField p ∧ + ∃ n : ℕ, 0 < n ∧ + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ = + (Multiplicative.ofAdd (1 : ℤ_[p.1])) ^ n := by + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + let : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + let : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + obtain + ⟨τ, hτσ, hτdecomposition, hτdegree, + hfinite, hbase, hintersection, + n, hn, hdegree⟩ := + exists_finitePlaceCyclotomicAuxiliaryFixedField + (K := K) (L := L) v p σ hgenerate + have hprimaryQuotient : + numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ ∈ + CommGroup.primaryComponent + ((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) + p.1 := by + obtain ⟨m, hm⟩ := hprimary + refine ⟨m, ?_⟩ + let e := + numberFieldTowerExtensionQuotientEquivGaloisGroup K L + let q := + numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ + let N : ℕ := p.1 ^ m + have hq : e q = σ.1 := by + exact hτσ + have hmN : σ.1 ^ N = 1 := by + exact hm + change q ^ N = 1 + apply e.injective + calc + e (q ^ N) = (e q) ^ N := by + exact map_pow e q N + _ = σ.1 ^ N := by rw [hq] + _ = 1 := hmN + _ = e 1 := (map_one e).symm + have hcontainment := + numberFieldTowerTopField_le_finitePadicCyclicFixedField_sup_padicCyclotomicField + (K := K) (L := L) p τ n hn hdegree + hprimaryQuotient + exact + ⟨τ, hτσ, hτdecomposition, hτdegree, + hfinite, hbase, hintersection, + hcontainment, n, hn, hdegree⟩ + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicCyclicData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicCyclicData.lean new file mode 100644 index 0000000000..34c26cba1d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicCyclicData.lean @@ -0,0 +1,976 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.SeparableClosurePadicLift +/-! +# Finite p-adic cyclic data for local-global Artin compatibility + +This module packages the simultaneous finite-quotient and cyclotomic +coordinates and the corresponding abstract auxiliary subextension. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField +open NumberField +open IdeleGroup RelativeIdeleGroup +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open CyclicCohomology +open KummerTheory ClassFormation + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + +local instance (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +local instance numberFieldTowerExtensionNormal : + (extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)).Normal := + numberFieldTowerExtensionSubgroup_normal K L + +local instance finitePadicTowerExtensionQuotientFinite : + Finite + ((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) := + numberFieldTowerExtensionQuotient_finite K L + +noncomputable local instance numberFieldTowerExtensionQuotientIsMulCommutative : + IsMulCommutative + ((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) := by + let e : + ((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) ≃* + Gal(L/K) := + numberFieldTowerExtensionQuotientEquivGaloisGroup K L + exact + { is_comm := + ⟨fun x y => by + apply e.injective + rw [map_mul, map_mul] + exact + (inferInstance : + IsMulCommutative (Gal(L/K))).is_comm.comm + (e x) (e y)⟩ } + +local instance numberFieldTowerBaseSubgroupCompactSpace : + CompactSpace + (numberFieldTowerBaseSubgroup K L).toSubgroup := + isCompact_iff_compactSpace.mp + (numberFieldTowerBaseSubgroup K L).isClosed'.isCompact + +/-- Inclusion of a subgroup equipped with its subtype topology. -/ +def continuousSubgroupSubtype + {A : Type*} [Group A] [TopologicalSpace A] + (H : Subgroup A) : H →ₜ* A where + toMonoidHom := H.subtype + continuous_toFun := continuous_subtype_val + +/-- The finite quotient coordinate on the compatible embedded copy of +the absolute Galois group of `K`. -/ +noncomputable def numberFieldTowerFiniteQuotientCoordinate : + (numberFieldTowerBaseSubgroup K L).toSubgroup →ₜ* + ((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) := by + let N := + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) + exact + { toMonoidHom := QuotientGroup.mk' N + continuous_toFun := QuotientGroup.continuous_mk } + +/-- The genuine `p`-adic cyclotomic degree on the rational absolute +Galois group. -/ +noncomputable def rationalSeparableClosurePadicCyclotomicDegree + (p : Nat.Primes) : + Gal(SeparableClosure ℚ/ℚ) →ₜ* + Multiplicative ℤ_[p.1] := + (rationalCyclotomicPadicCoordinate p).comp + rationalAbsoluteGaloisRestrictionToCyclotomicZHat + +/-- The kernel of the absolute `p`-adic cyclotomic degree is exactly +the fixing subgroup of the actual `p`-primary cyclotomic field in the +rational separable closure. -/ +theorem rationalSeparableClosurePadicCyclotomicDegree_ker + (p : Nat.Primes) : + (rationalSeparableClosurePadicCyclotomicDegree + p).toMonoidHom.ker = + (rationalCyclotomicPadicField p).fixingSubgroup := by + let : Algebra ℚ rationalCyclotomicZHatField := + rationalCyclotomicZHatField.algebra' + let : @Normal ℚ rationalCyclotomicZHatField _ _ + rationalCyclotomicZHatField.algebra' := + rationalCyclotomicZHatField_normal + let E := + rationalCyclotomicPadicFieldWithinZHat p + ext σ + change + rationalCyclotomicPadicCoordinate p + (rationalAbsoluteGaloisRestrictionToCyclotomicZHat σ) = + 1 ↔ + σ ∈ (IntermediateField.lift E).fixingSubgroup + constructor + · intro hσ + have hr : + rationalAbsoluteGaloisRestrictionToCyclotomicZHat σ ∈ + E.fixingSubgroup := by + rw [ + rationalCyclotomicPadicFieldWithinZHat_fixingSubgroup] + exact hσ + refine (IntermediateField.mem_fixingSubgroup_iff + (IntermediateField.lift E) σ).2 ?_ + intro x hx + let xC : rationalCyclotomicZHatField := + ⟨x, IntermediateField.lift_le E hx⟩ + have hxE : xC ∈ E := + (IntermediateField.mem_lift xC).1 hx + have hfix : + (rationalAbsoluteGaloisRestrictionToCyclotomicZHat σ) xC = + xC := + (IntermediateField.mem_fixingSubgroup_iff + E + (rationalAbsoluteGaloisRestrictionToCyclotomicZHat σ)).1 hr xC hxE + calc + σ x = + algebraMap rationalCyclotomicZHatField (SeparableClosure ℚ) + ((rationalAbsoluteGaloisRestrictionToCyclotomicZHat σ) xC) := by + exact + (AlgEquiv.restrictNormal_commutes + σ rationalCyclotomicZHatField xC).symm + _ = algebraMap rationalCyclotomicZHatField + (SeparableClosure ℚ) xC := by + rw [hfix] + _ = x := rfl + · intro hσ + have hr : + rationalAbsoluteGaloisRestrictionToCyclotomicZHat σ ∈ + E.fixingSubgroup := by + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + apply Subtype.ext + have hfix : + σ x.1 = x.1 := + (IntermediateField.mem_fixingSubgroup_iff + (IntermediateField.lift E) σ).1 hσ x.1 + ((IntermediateField.mem_lift x).2 hx) + exact + (AlgEquiv.restrictNormal_commutes + σ rationalCyclotomicZHatField x).trans hfix + rw [ + rationalCyclotomicPadicFieldWithinZHat_fixingSubgroup] + at hr + exact hr + +/-- The genuine rational cyclotomic `p`-adic degree restricted to the +compatible embedded copy of the absolute Galois group of `K`. -/ +noncomputable def numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (p : Nat.Primes) : + (numberFieldTowerBaseSubgroup K L).toSubgroup →ₜ* + Multiplicative ℤ_[p.1] := + (rationalSeparableClosurePadicCyclotomicDegree p).comp + (continuousSubgroupSubtype + (numberFieldTowerBaseSubgroup K L).toSubgroup) + +/-- The simultaneous finite-extension and cyclotomic `p`-adic +coordinate on the compatible absolute Galois group of `K`. -/ +noncomputable def numberFieldTowerFinitePadicCoordinate + (p : Nat.Primes) : + (numberFieldTowerBaseSubgroup K L).toSubgroup →ₜ* + (((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) × + Multiplicative ℤ_[p.1]) := by + let finiteCoordinate := + numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) + let padicDegree := + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p + exact + { toFun := fun τ => + (finiteCoordinate τ, padicDegree τ) + map_one' := by + simp only [map_one] + rfl + map_mul' := by + intro σ τ + simp only [map_mul, Prod.mul_def] + continuous_toFun := + finiteCoordinate.continuous_toFun.prodMk + padicDegree.continuous_toFun } + +/-- The actual image of the simultaneous finite and `p`-adic +cyclotomic coordinate, as a closed subgroup of the product. -/ +noncomputable def numberFieldTowerFinitePadicImage + (p : Nat.Primes) : + ClosedSubgroup + (((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) × + Multiplicative ℤ_[p.1]) := by + let H := + numberFieldTowerBaseSubgroup K L + let N := + extensionSubgroup + H + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) + letI extensionSubgroupClosed : IsClosed (N : Set H.toSubgroup) := + extensionSubgroup_isClosed + H + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) + let coordinate := + numberFieldTowerFinitePadicCoordinate + (K := K) (L := L) p + refine + { toSubgroup := coordinate.toMonoidHom.range + isClosed' := ?_ } + change IsClosed (Set.range coordinate) + exact + (isCompact_range coordinate.continuous_toFun).isClosed + +/-- The `p`-adic degree on the actual simultaneous-coordinate image is +its second projection. -/ +noncomputable def numberFieldTowerFinitePadicImageDegree + (p : Nat.Primes) : + (numberFieldTowerFinitePadicImage + (K := K) (L := L) p).toSubgroup →ₜ* + Multiplicative ℤ_[p.1] := by + exact + { toFun := fun z => z.1.2 + map_one' := rfl + map_mul' := fun _ _ => rfl + continuous_toFun := + continuous_snd.comp continuous_subtype_val } + +/-- The kernel of the `p`-adic degree on the simultaneous-coordinate +image is finite: its first projection injects it into the finite +Galois quotient. -/ +theorem numberFieldTowerFinitePadicImageDegree_ker_finite + (p : Nat.Primes) : + Finite + (numberFieldTowerFinitePadicImageDegree + (K := K) (L := L) p).toMonoidHom.ker := by + let H := + numberFieldTowerBaseSubgroup K L + let N := + extensionSubgroup + H + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) + let Q := H.toSubgroup ⧸ N + let degree := + numberFieldTowerFinitePadicImageDegree + (K := K) (L := L) p + let first : + degree.toMonoidHom.ker → Q := + fun z => z.1.1.1 + apply Finite.of_injective first + intro x y hxy + apply Subtype.ext + apply Subtype.ext + apply Prod.ext + · exact hxy + · have hx : x.1.1.2 = 1 := x.2 + have hy : y.1.1.2 = 1 := y.2 + exact hx.trans hy.symm + +/-- The simultaneous coordinate with codomain restricted to its actual +closed image. -/ +noncomputable def numberFieldTowerFinitePadicRangeRestriction + (p : Nat.Primes) : + (numberFieldTowerBaseSubgroup K L).toSubgroup →ₜ* + (numberFieldTowerFinitePadicImage + (K := K) (L := L) p).toSubgroup := by + let coordinate := + numberFieldTowerFinitePadicCoordinate + (K := K) (L := L) p + exact + { toMonoidHom := coordinate.toMonoidHom.rangeRestrict + continuous_toFun := + coordinate.continuous_toFun.subtype_mk + (fun τ => ⟨τ, rfl⟩) } + +/-- The degree projection of the restricted simultaneous coordinate is the +original cyclotomic degree. Keeping this pointwise boundary avoids unfolding +the closed-image package in downstream proofs. -/ +theorem numberFieldTowerFinitePadicImageDegree_rangeRestriction_apply + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + numberFieldTowerFinitePadicImageDegree + (K := K) (L := L) p + (numberFieldTowerFinitePadicRangeRestriction + (K := K) (L := L) p τ) = + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ := + rfl + +/-- Restriction to the actual simultaneous-coordinate image is +surjective. -/ +theorem numberFieldTowerFinitePadicRangeRestriction_surjective + (p : Nat.Primes) : + Function.Surjective + (numberFieldTowerFinitePadicRangeRestriction + (K := K) (L := L) p) := by + exact + (numberFieldTowerFinitePadicCoordinate + (K := K) (L := L) p).toMonoidHom.rangeRestrict_surjective + +/-- The inverse image in the compatible absolute Galois group of the +closed cyclic subgroup generated by one simultaneous finite/`p`-adic +coordinate. -/ +noncomputable def numberFieldTowerFinitePadicCyclicPreimage + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + ClosedSubgroup + (numberFieldTowerBaseSubgroup K L).toSubgroup := by + let rangeRestriction := + numberFieldTowerFinitePadicRangeRestriction + (K := K) (L := L) p + let γ := + rangeRestriction τ + let Γ := + ClassFormation.padicCyclicClosure γ + exact + { toSubgroup := + Γ.toSubgroup.comap + rangeRestriction.toMonoidHom + isClosed' := + Γ.isClosed'.preimage + rangeRestriction.continuous_toFun } + +/-- The simultaneous finite/cyclotomic coordinate has abelian image, +so the inverse image of the closed cyclic subgroup generated by one +coordinate is normal in the compatible absolute Galois group of `K`. + +Consequently, the auxiliary fixed field constructed below is Galois +over the embedded copy of `K`, as in the field diagram of the +finite-place reduction. -/ +theorem numberFieldTowerFinitePadicCyclicPreimage_normal + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + (numberFieldTowerFinitePadicCyclicPreimage + (K := K) (L := L) p τ).toSubgroup.Normal := by + let P := + numberFieldTowerFinitePadicImage + (K := K) (L := L) p + let rangeRestriction := + numberFieldTowerFinitePadicRangeRestriction + (K := K) (L := L) p + let γ : P.toSubgroup := + rangeRestriction τ + let Γ := + ClassFormation.padicCyclicClosure γ + change + (Γ.toSubgroup.comap + rangeRestriction.toMonoidHom).Normal + exact + Γ.toSubgroup.normal_of_isMulCommutative.comap + rangeRestriction.toMonoidHom + +/-- A lift with nontrivial `p`-adic degree generates an open cyclic +preimage in the compatible absolute Galois group. -/ +theorem numberFieldTowerFinitePadicCyclicPreimage_isOpen + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (hτ : + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ ≠ + 1) : + IsOpen + ((numberFieldTowerFinitePadicCyclicPreimage + (K := K) (L := L) p τ : + ClosedSubgroup + (numberFieldTowerBaseSubgroup K L).toSubgroup) : + Set (numberFieldTowerBaseSubgroup K L).toSubgroup) := by + let P := + numberFieldTowerFinitePadicImage + (K := K) (L := L) p + let rangeRestriction := + numberFieldTowerFinitePadicRangeRestriction + (K := K) (L := L) p + let degree := + numberFieldTowerFinitePadicImageDegree + (K := K) (L := L) p + let : CompactSpace P.toSubgroup := + isCompact_iff_compactSpace.mp P.isClosed'.isCompact + let γ : P.toSubgroup := + rangeRestriction τ + let finiteDegreeKernel : Finite degree.toMonoidHom.ker := + numberFieldTowerFinitePadicImageDegree_ker_finite + (K := K) (L := L) p + have hγ : degree γ ≠ 1 := by + simpa only [degree, γ, rangeRestriction, + numberFieldTowerFinitePadicImageDegree_rangeRestriction_apply] using hτ + have hΓ : + IsOpen + ((ClassFormation.padicCyclicClosure γ : + Subgroup P.toSubgroup) : + Set P.toSubgroup) := + ClassFormation.padicCyclicClosure_isOpen_of_degree_ne_one + p.1 degree γ hγ + exact + hΓ.preimage rangeRestriction.continuous_toFun + +/-- For a lift whose finite coordinate is `p`-primary and whose +cyclotomic degree is a positive integer, the `p`-adic degree is +injective on its actual closed cyclic image. -/ +theorem numberFieldTowerFinitePadicCyclicImageDegree_injective + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (n : ℕ) (hn : 0 < n) + (hdegree : + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ = + (Multiplicative.ofAdd (1 : ℤ_[p.1])) ^ n) + (hprimary : + numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ ∈ + CommGroup.primaryComponent + ((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) + p.1) : + let P := + numberFieldTowerFinitePadicImage + (K := K) (L := L) p + let γ : P.toSubgroup := + numberFieldTowerFinitePadicRangeRestriction + (K := K) (L := L) p τ + Function.Injective + (((numberFieldTowerFinitePadicImageDegree + (K := K) (L := L) p).comp + (continuousSubgroupSubtype + (ClassFormation.padicCyclicClosure γ).toSubgroup)) : + ClassFormation.padicCyclicClosure γ → + Multiplicative ℤ_[p.1]) := by + dsimp only + let H := + numberFieldTowerBaseSubgroup K L + let T := + numberFieldTowerTopSubgroup L + let N := + extensionSubgroup H T + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) + let Q := H.toSubgroup ⧸ N + let P := + numberFieldTowerFinitePadicImage + (K := K) (L := L) p + let γ : P.toSubgroup := + numberFieldTowerFinitePadicRangeRestriction + (K := K) (L := L) p τ + let finiteProjection : + P.toSubgroup →ₜ* Q := + { toFun := fun z => z.1.1 + map_one' := rfl + map_mul' := fun _ _ => rfl + continuous_toFun := + continuous_fst.comp continuous_subtype_val } + let degree := + numberFieldTowerFinitePadicImageDegree + (K := K) (L := L) p + let extensionSubgroupClosed : IsClosed (N : Set H.toSubgroup) := + extensionSubgroup_isClosed H T + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) + let extensionSubgroupFiniteIndex : N.FiniteIndex := + N.finiteIndex_of_finite_quotient + let quotientDiscreteTopology : DiscreteTopology Q := + QuotientGroup.discreteTopology + (N.isOpen_of_isClosed_of_finiteIndex + extensionSubgroupClosed) + obtain ⟨m, hm⟩ := hprimary + apply + ClassFormation.padicCyclicClosure_degree_injective_of_primePower_finiteCoordinate + p.1 finiteProjection degree + (γ := γ) (m := m) (n := n) + · intro x y hxy + apply Subtype.ext + exact hxy + · exact hn + · exact hm + · exact hdegree + +/-- On a positive-degree lift with `p`-primary finite coordinate, the +intersection of its cyclic preimage with the cyclotomic `p`-adic +kernel already fixes `L`. -/ +theorem + numberFieldTowerFinitePadicCyclicPreimage_inf_padicKernel_le_extensionSubgroup + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (n : ℕ) (hn : 0 < n) + (hdegree : + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ = + (Multiplicative.ofAdd (1 : ℤ_[p.1])) ^ n) + (hprimary : + numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ ∈ + CommGroup.primaryComponent + ((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) + p.1) : + (numberFieldTowerFinitePadicCyclicPreimage + (K := K) (L := L) p τ).toSubgroup ⊓ + (numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p).toMonoidHom.ker ≤ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) := by + let H := + numberFieldTowerBaseSubgroup K L + let T := + numberFieldTowerTopSubgroup L + let N := + extensionSubgroup H T + (numberFieldTowerTopSubgroup_le_baseSubgroup K L) + let P := + numberFieldTowerFinitePadicImage + (K := K) (L := L) p + let rangeRestriction := + numberFieldTowerFinitePadicRangeRestriction + (K := K) (L := L) p + let γ : P.toSubgroup := + rangeRestriction τ + let Γ := + ClassFormation.padicCyclicClosure γ + let degree := + numberFieldTowerFinitePadicImageDegree + (K := K) (L := L) p + have hinjective := + numberFieldTowerFinitePadicCyclicImageDegree_injective + (K := K) (L := L) p τ n hn hdegree hprimary + intro u hu + let z : Γ.toSubgroup := + ⟨rangeRestriction u, hu.1⟩ + have hz : z = 1 := by + apply hinjective + change + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p u = + 1 + exact hu.2 + have hfinite : + numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) u = + 1 := by + have hzfinite := + congrArg (fun w : Γ.toSubgroup => w.1.1.1) hz + exact hzfinite + exact + (QuotientGroup.eq_one_iff (N := N) u).mp hfinite + +/-- The cyclic preimage, embedded back into the rational absolute +Galois group. Its fixed field is the concrete auxiliary number field +used in the finite-place reduction. -/ +noncomputable def numberFieldTowerFinitePadicCyclicFixedSubgroup + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + ClosedSubgroup (Gal(SeparableClosure ℚ/ℚ)) := by + let H := + numberFieldTowerBaseSubgroup K L + let U := + numberFieldTowerFinitePadicCyclicPreimage + (K := K) (L := L) p τ + exact + { toSubgroup := + U.toSubgroup.map H.toSubgroup.subtype + isClosed' := by + change + IsClosed + (Subtype.val '' + (U : Set H.toSubgroup)) + exact + H.isClosed'.isClosedEmbedding_subtypeVal.isClosedMap + (U : Set H.toSubgroup) U.isClosed' } + +/-- The distinguished simultaneous finite/cyclotomic lift itself lies +in the auxiliary subgroup whose fixed field is used for descent. -/ +theorem numberFieldTowerFinitePadicCyclicFixedSubgroup_generator_mem + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + (τ : Gal(SeparableClosure ℚ/ℚ)) ∈ + (numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ).toSubgroup := by + let H := + numberFieldTowerBaseSubgroup K L + let rangeRestriction := + numberFieldTowerFinitePadicRangeRestriction + (K := K) (L := L) p + let γ := + rangeRestriction τ + let Γ := + ClassFormation.padicCyclicClosure γ + let U := + numberFieldTowerFinitePadicCyclicPreimage + (K := K) (L := L) p τ + change + (τ : Gal(SeparableClosure ℚ/ℚ)) ∈ + U.toSubgroup.map H.toSubgroup.subtype + refine ⟨τ, ?_, rfl⟩ + change rangeRestriction τ ∈ Γ.toSubgroup + exact + (ClassFormation.padicCyclicClosureGenerator γ).2 + +/-- The auxiliary cyclic fixed subgroup lies in the subgroup fixing +the compatible embedded copy of `K`. -/ +theorem numberFieldTowerFinitePadicCyclicFixedSubgroup_le_baseSubgroup + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + (numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ).toSubgroup ≤ + (numberFieldTowerBaseSubgroup K L).toSubgroup := by + let H := + numberFieldTowerBaseSubgroup K L + let U := + numberFieldTowerFinitePadicCyclicPreimage + (K := K) (L := L) p τ + rintro _ ⟨u, _, rfl⟩ + exact u.2 + +/-- The auxiliary fixed field is Galois over the compatible embedded +copy of `K`. On subgroup coordinates this is normality of the +embedded cyclic-preimage subgroup inside the base fixing subgroup. -/ +theorem + numberFieldTowerFinitePadicCyclicFixedSubgroup_extension_normal + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + (extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ) + (numberFieldTowerFinitePadicCyclicFixedSubgroup_le_baseSubgroup + (K := K) (L := L) p τ)).Normal := by + let H := + numberFieldTowerBaseSubgroup K L + let U := + numberFieldTowerFinitePadicCyclicPreimage + (K := K) (L := L) p τ + let S := + numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ + let hSH := + numberFieldTowerFinitePadicCyclicFixedSubgroup_le_baseSubgroup + (K := K) (L := L) p τ + have hU : U.toSubgroup.Normal := + numberFieldTowerFinitePadicCyclicPreimage_normal + (K := K) (L := L) p τ + have hext : + extensionSubgroup H S hSH = + U.toSubgroup := by + ext u + rw [mem_extensionSubgroup_iff] + change + u.1 ∈ U.toSubgroup.map H.toSubgroup.subtype ↔ + u ∈ U.toSubgroup + constructor + · rintro ⟨z, hz, hzu⟩ + have hzu' : z = u := + Subtype.ext hzu + exact hzu' ▸ hz + · intro hu + exact ⟨u, hu, rfl⟩ + exact hext.symm ▸ hU + +/-- The relative subgroup defined by the ambient auxiliary fixed +subgroup is exactly the original cyclic preimage inside the compatible +absolute Galois group of `K`. -/ +theorem + numberFieldTowerFinitePadicCyclicFixedSubgroup_extensionSubgroup + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ) + (numberFieldTowerFinitePadicCyclicFixedSubgroup_le_baseSubgroup + (K := K) (L := L) p τ) = + (numberFieldTowerFinitePadicCyclicPreimage + (K := K) (L := L) p τ).toSubgroup := by + let H := + numberFieldTowerBaseSubgroup K L + let U := + numberFieldTowerFinitePadicCyclicPreimage + (K := K) (L := L) p τ + ext u + rw [mem_extensionSubgroup_iff] + change + u.1 ∈ U.toSubgroup.map H.toSubgroup.subtype ↔ + u ∈ U.toSubgroup + constructor + · rintro ⟨z, hz, hzu⟩ + have hzu' : z = u := + Subtype.ext hzu + exact hzu' ▸ hz + · intro hu + exact ⟨u, hu, rfl⟩ + +/-- Ambient form of the kernel-intersection statement. -/ +theorem + numberFieldTowerFinitePadicCyclicFixedSubgroup_inf_absolutePadicKernel_le_topSubgroup + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (n : ℕ) (hn : 0 < n) + (hdegree : + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ = + (Multiplicative.ofAdd (1 : ℤ_[p.1])) ^ n) + (hprimary : + numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ ∈ + CommGroup.primaryComponent + ((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) + p.1) : + (numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ).toSubgroup ⊓ + (rationalSeparableClosurePadicCyclotomicDegree + p).toMonoidHom.ker ≤ + (numberFieldTowerTopSubgroup L).toSubgroup := by + let T := + numberFieldTowerTopSubgroup L + let U := + numberFieldTowerFinitePadicCyclicPreimage + (K := K) (L := L) p τ + have hrelative := + numberFieldTowerFinitePadicCyclicPreimage_inf_padicKernel_le_extensionSubgroup + (K := K) (L := L) p τ n hn hdegree hprimary + intro σ hσ + obtain ⟨u, huU, huσ⟩ := hσ.1 + have huDegree : + u ∈ + (numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p).toMonoidHom.ker := by + change + rationalSeparableClosurePadicCyclotomicDegree + p u.1 = + 1 + calc + rationalSeparableClosurePadicCyclotomicDegree p u.1 = + rationalSeparableClosurePadicCyclotomicDegree p σ := + congrArg + (rationalSeparableClosurePadicCyclotomicDegree p) huσ + _ = 1 := hσ.2 + have huN := + hrelative ⟨huU, huDegree⟩ + change σ ∈ T.toSubgroup + exact huσ ▸ huN + +/-- A nonzero-degree cyclic lift cuts out an open subgroup of the +rational absolute Galois group. -/ +theorem numberFieldTowerFinitePadicCyclicFixedSubgroup_isOpen + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (hτ : + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ ≠ + 1) : + IsOpen + ((numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ : + ClosedSubgroup + (Gal(SeparableClosure ℚ/ℚ))) : + Set (Gal(SeparableClosure ℚ/ℚ))) := by + let H := + numberFieldTowerBaseSubgroup K L + let U := + numberFieldTowerFinitePadicCyclicPreimage + (K := K) (L := L) p τ + change + IsOpen + (Subtype.val '' (U : Set H.toSubgroup)) + exact + (numberFieldTowerBaseSubgroup_isOpen K L).isOpenMap_subtype_val + (U : Set H.toSubgroup) + (numberFieldTowerFinitePadicCyclicPreimage_isOpen + (K := K) (L := L) p τ hτ) + +/-- The auxiliary cyclic fixed subgroup as a genuine finite Galois +subextension of the compatible abstract field attached to `K`. -/ +noncomputable def + numberFieldTowerFinitePadicCyclicGaloisSubextension + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (hτ : + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ ≠ + 1) : + FiniteGaloisSubextension + (numberFieldTowerBaseSubgroup K L) where + field := + numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ + below := + numberFieldTowerFinitePadicCyclicFixedSubgroup_le_baseSubgroup + (K := K) (L := L) p τ + normal := + numberFieldTowerFinitePadicCyclicFixedSubgroup_extension_normal + (K := K) (L := L) p τ + finite := by + rw [ + numberFieldTowerFinitePadicCyclicFixedSubgroup_extensionSubgroup + (K := K) (L := L) p τ] + exact + Subgroup.quotient_finite_of_isOpen + (numberFieldTowerFinitePadicCyclicPreimage + (K := K) (L := L) p τ).toSubgroup + (numberFieldTowerFinitePadicCyclicPreimage_isOpen + (K := K) (L := L) p τ hτ) + +/-- The auxiliary fixed subgroup, with its absolute finite-index +witness, as the finite abstract field used by fixed-field global +reciprocity. -/ +noncomputable def numberFieldTowerFinitePadicAuxiliaryAbstractField + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (hτ : + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ ≠ + 1) : + FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) := + ((numberFieldTowerFinitePadicCyclicGaloisSubextension + (K := K) (L := L) p τ hτ).toFiniteAbstractFieldExtension + (K := numberFieldTowerFiniteAbstractField K L)).field + +/-- Base change of `L / K` to the auxiliary cyclic fixed field. Its +top subgroup is the intersection of the auxiliary fixing subgroup +with the subgroup fixing `L`, hence its concrete top field is the +auxiliary compositum with `L`. -/ +noncomputable def + numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : + FiniteAbelianSubextension + (numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ) := + (numberFieldTowerFiniteAbelianSubextension K L).baseChange + (numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ) + (numberFieldTowerFinitePadicCyclicFixedSubgroup_le_baseSubgroup + (K := K) (L := L) p τ) + +/-- The auxiliary compositum is unramified for the genuine +cyclotomic degree datum. The proof is the key `p`-primary +intersection: full cyclotomic inertia lies in every `p`-adic +cyclotomic kernel, and the latter intersection already fixes `L`. -/ +theorem + numberFieldTowerFinitePadicAuxiliaryCompositumSubextension_isUnramified + (p : Nat.Primes) + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (n : ℕ) (hn : 0 < n) + (hdegree : + numberFieldTowerBaseSubgroupPadicCyclotomicDegree + (K := K) (L := L) p τ = + (Multiplicative.ofAdd (1 : ℤ_[p.1])) ^ n) + (hprimary : + numberFieldTowerFiniteQuotientCoordinate + (K := K) (L := L) τ ∈ + CommGroup.primaryComponent + ((numberFieldTowerBaseSubgroup K L).toSubgroup ⧸ + extensionSubgroup + (numberFieldTowerBaseSubgroup K L) + (numberFieldTowerTopSubgroup L) + (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) + p.1) : + (numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ).toFiniteGaloisExtension.IsUnramified + rationalCyclotomicDegreeData := by + let : Algebra ℚ rationalCyclotomicZHatField := + rationalCyclotomicZHatField.algebra' + let : @Normal ℚ rationalCyclotomicZHatField _ _ + rationalCyclotomicZHatField.algebra' := + rationalCyclotomicZHatField_normal + let S := + numberFieldTowerFinitePadicCyclicFixedSubgroup + (K := K) (L := L) p τ + let T := + numberFieldTowerTopSubgroup L + let P := + numberFieldTowerFinitePadicAuxiliaryCompositumSubextension + (K := K) (L := L) p τ + apply + (P.toFiniteGaloisExtension.isUnramified_iff_inertia_le + rationalCyclotomicDegreeData).2 + intro σ hσ + change σ ∈ S.toSubgroup ⊓ T.toSubgroup + refine ⟨hσ.1, ?_⟩ + apply + numberFieldTowerFinitePadicCyclicFixedSubgroup_inf_absolutePadicKernel_le_topSubgroup + (K := K) (L := L) p τ n hn hdegree hprimary + refine ⟨hσ.1, ?_⟩ + change + rationalSeparableClosurePadicCyclotomicDegree p σ = + 1 + have hdegreeOne : + rationalCyclotomicZHatFieldGalEquivZHat + (AlgEquiv.restrictNormalHom + rationalCyclotomicZHatField σ) = + 1 := by + exact hσ.2 + apply Multiplicative.toAdd.injective + change + zHatToPadicInt p + (Multiplicative.toAdd + (rationalCyclotomicZHatFieldGalEquivZHat + (AlgEquiv.restrictNormalHom + rationalCyclotomicZHatField σ))) = + (0 : ℤ_[p.1]) + have hdegreeAdd := + congrArg Multiplicative.toAdd hdegreeOne + change + Multiplicative.toAdd + (rationalCyclotomicZHatFieldGalEquivZHat + (AlgEquiv.restrictNormalHom + rationalCyclotomicZHatField σ)) = + 0 at hdegreeAdd + rw [hdegreeAdd] + exact map_zero (zHatToPadicInt p) + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean new file mode 100644 index 0000000000..63337e94b7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean @@ -0,0 +1,1496 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceCyclotomicFrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PadicCyclicClosure +/-! +# Separable-closure p-adic lifts for local-global Artin compatibility + +This module constructs the finite-place decomposition restriction maps and +the positive p-adic cyclotomic lifts used in the local-global comparison. +-/ + +@[expose] public section + +open scoped NumberField +open AlgebraicNumberTheory IsDedekindDomain NumberField +open IdeleGroup RelativeIdeleGroup +open AlgebraicNumberTheory.Valuations +open HilbertRamification + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + +local instance (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +/-- Evaluation of the compatible finite quotient on an arbitrary +ambient representative is the action of that representative on the +chosen embedded copy of the top field. -/ +theorem numberFieldTowerExtensionQuotientEquivGaloisGroup_mk_apply + (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) + (x : L) : + numberFieldSeparableClosureEmbedding L + (numberFieldTowerExtensionQuotientEquivGaloisGroup K L + ((numberFieldTowerFiniteGaloisSubextension K L).extensionQuotientMk + τ) x) = + τ.1 (numberFieldSeparableClosureEmbedding L x) := by + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + let : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + let : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + let : IsScalarTower ℚ K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseScalarTower K L + let j := + numberFieldSeparableClosureEmbedding L + let e := + numberFieldTowerSeparableClosureEquiv K L + let quotientNormal := numberFieldTowerExtensionSubgroup_normal K L + convert + (LocalClassFieldTheory.ambientEmbeddedExtensionQuotientEquivGaloisGroup_mk_apply + ℚ K L j e τ x) using 1; rfl + +/-- The fixed field of the cyclic subgroup generated by one +automorphism of a finite abelian extension. + +Passing from `K` to this field is the genuine cyclic reduction used in +the proof of finite-place local--global compatibility: over this field +the given automorphism generates the whole Galois group. -/ +noncomputable def automorphismCyclicFixedField + (σ : Gal(L/K)) : + IntermediateField K L := + IntermediateField.fixedField + (Subgroup.closure ({σ} : Set (Gal(L/K)))) + +noncomputable local instance automorphismCyclicFixedFieldNumberField + (σ : Gal(L/K)) : + NumberField (automorphismCyclicFixedField σ) := + NumberField.of_module_finite K + (automorphismCyclicFixedField σ) + +/-- An automorphism, regarded over the fixed field of the cyclic +subgroup it generates. -/ +noncomputable def automorphismOverCyclicFixedField + (σ : Gal(L/K)) : + Gal(L/automorphismCyclicFixedField σ) := + IntermediateField.fixingSubgroupEquiv + (automorphismCyclicFixedField σ) + ⟨σ, by + rw [automorphismCyclicFixedField, + IntermediateField.fixingSubgroup_fixedField] + exact + Subgroup.subset_closure + (Set.mem_singleton σ)⟩ + +omit [NumberField K] [NumberField L] [IsAbelianGalois K L] in +/-- Restricting the automorphism over its cyclic fixed field back to the base +field recovers the original automorphism. -/ +@[simp] +theorem automorphismOverCyclicFixedField_restrictScalars + (σ : Gal(L/K)) : + (automorphismOverCyclicFixedField σ).restrictScalars K = σ := by + ext x + rfl + +omit [NumberField K] [NumberField L] [IsAbelianGalois K L] in +/-- The automorphism over its cyclic fixed field genuinely generates +the entire relative Galois group. -/ +theorem automorphismOverCyclicFixedField_generates + (σ : Gal(L/K)) : + Subgroup.closure + ({automorphismOverCyclicFixedField σ} : + Set + (Gal(L/automorphismCyclicFixedField σ))) = + ⊤ := by + let M := automorphismCyclicFixedField σ + let σM : Gal(L/M) := + automorphismOverCyclicFixedField σ + let e : + M.fixingSubgroup ≃* + Gal(L/M) := + IntermediateField.fixingSubgroupEquiv M + have hσ : + (⟨σ, by + change + σ ∈ + (automorphismCyclicFixedField σ).fixingSubgroup + rw [automorphismCyclicFixedField, + IntermediateField.fixingSubgroup_fixedField] + exact + Subgroup.subset_closure + (Set.mem_singleton σ)⟩ : + M.fixingSubgroup) = + e.symm.toMonoidHom σM := by + apply Subtype.ext + rfl + apply Subgroup.map_injective + (f := e.symm.toMonoidHom) e.symm.injective + change + Subgroup.map e.symm.toMonoidHom + (Subgroup.closure ({σM} : Set (Gal(L/M)))) = + Subgroup.map e.symm.toMonoidHom ⊤ + rw [MonoidHom.map_closure, Set.image_singleton, + ← hσ, Subgroup.map_top_of_surjective + e.symm.toMonoidHom e.symm.surjective] + apply Subgroup.map_injective + (f := M.fixingSubgroup.subtype) + M.fixingSubgroup.subtype_injective + rw [MonoidHom.map_closure, Set.image_singleton, + ← MonoidHom.range_eq_map, M.fixingSubgroup.range_subtype] + change + Subgroup.closure ({σ} : Set (Gal(L/K))) = + (automorphismCyclicFixedField σ).fixingSubgroup + rw [automorphismCyclicFixedField, + IntermediateField.fixingSubgroup_fixedField] + +/-- The finite place of the cyclic fixed field obtained by restricting +the chosen extension of `v` to that field and taking its centre. -/ +noncomputable def automorphismCyclicFixedPlace + (v : HeightOneSpectrum (𝓞 K)) + (σ : Gal(L/K)) : + let M := automorphismCyclicFixedField σ + HeightOneSpectrum (𝓞 M) := by + dsimp only + let M := automorphismCyclicFixedField σ + exact + finitePlaceExtensionCentre + (K := K) (L := M) v + (restrictFinitePlaceExtension + (K := K) (L := L) (E := M) v + (chosenFinitePlaceExtension (L := L) v)) + +omit [NumberField L] in +/-- The finite place induced on the cyclic fixed field lies above the original +base-field place. -/ +@[simp] +theorem finitePlaceBelow_automorphismCyclicFixedPlace + (v : HeightOneSpectrum (𝓞 K)) + (σ : Gal(L/K)) : + finitePlaceBelow (K := K) + (automorphismCyclicFixedPlace v σ) = + v := by + let M := automorphismCyclicFixedField σ + exact + finitePlaceBelow_finitePlaceExtensionCentre + (K := K) (L := M) v + (restrictFinitePlaceExtension + (K := K) (L := L) (E := M) v + (chosenFinitePlaceExtension (L := L) v)) + +/-- The centre in `L` of the originally chosen extension of `v` lies +above the cyclic-reduction place. This identifies the exact upper +place used in the norm--restriction square without making a new +valuation choice. -/ +theorem finitePlaceBelow_chosenExtensionCentre_eq_automorphismCyclicFixedPlace + (v : HeightOneSpectrum (𝓞 K)) + (σ : Gal(L/K)) : + let M := automorphismCyclicFixedField σ + finitePlaceBelow (K := M) + (finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v)) = + automorphismCyclicFixedPlace v σ := by + dsimp only + let M := automorphismCyclicFixedField σ + let w := + chosenFinitePlaceExtension (L := L) v + let wM := + restrictFinitePlaceExtension + (K := K) (L := L) (E := M) v w + apply HeightOneSpectrum.ext + ext x + change + algebraMap (𝓞 M) (𝓞 L) x ∈ + finitePlaceExtensionCentreIdeal + (K := K) (L := L) v w ↔ + x ∈ + finitePlaceExtensionCentreIdeal + (K := K) (L := M) v wM + rw [ + mem_finitePlaceExtensionCentreIdeal_iff, + mem_finitePlaceExtensionCentreIdeal_iff] + rfl + +/-- The exact extension of the normalized finite absolute value at the +cyclic-reduction place whose centre is the original chosen place of +`L`. -/ +noncomputable def automorphismCyclicFixedTopExtension + (v : HeightOneSpectrum (𝓞 K)) + (σ : Gal(L/K)) : + let M := automorphismCyclicFixedField σ + AbsoluteValueExtension + (NumberField.HeightOneSpectrum.adicAbv M + (automorphismCyclicFixedPlace v σ)) L := by + dsimp only + let M := automorphismCyclicFixedField σ + let W := + automorphismCyclicFixedPlace v σ + let V : + {V : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := M) V = W} := + ⟨finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v), + finitePlaceBelow_chosenExtensionCentre_eq_automorphismCyclicFixedPlace + (K := K) (L := L) v σ⟩ + exact + (finitePlaceExtensionEquivAbove + (K := M) (L := L) W).symm V + +/-- The chosen top extension above the cyclic fixed place has the same centre +as the original chosen extension over the base field. -/ +@[simp] +theorem automorphismCyclicFixedTopExtension_centre + (v : HeightOneSpectrum (𝓞 K)) + (σ : Gal(L/K)) : + let M := automorphismCyclicFixedField σ + finitePlaceExtensionCentre + (K := M) (L := L) + (automorphismCyclicFixedPlace v σ) + (automorphismCyclicFixedTopExtension v σ) = + finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v) := by + dsimp only + let M := automorphismCyclicFixedField σ + let W := + automorphismCyclicFixedPlace v σ + let V : + {V : HeightOneSpectrum (𝓞 L) // + finitePlaceBelow (K := M) V = W} := + ⟨finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v), + finitePlaceBelow_chosenExtensionCentre_eq_automorphismCyclicFixedPlace + (K := K) (L := L) v σ⟩ + have h := + congrArg Subtype.val + ((finitePlaceExtensionEquivAbove + (K := M) (L := L) W).apply_symm_apply V) + simpa only [ + finitePlaceExtensionEquivAbove_coe, + V, W, id_eq, + automorphismCyclicFixedTopExtension + ] using h + +/-- A decomposition automorphism remains in the decomposition group at the +chosen place after the cyclic fixed-field reduction. This is the lightweight +geometric statement underlying the corresponding local Artin range result. -/ +theorem automorphismOverCyclicFixedField_mem_chosenFinitePlaceDecompositionGroup + (v : HeightOneSpectrum (𝓞 K)) + (σ : + absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := L) v).1) : + let M := automorphismCyclicFixedField σ.1 + automorphismOverCyclicFixedField σ.1 ∈ + absoluteValueDecompositionGroup M + (chosenFinitePlaceExtension + (L := L) (automorphismCyclicFixedPlace v σ.1)).1 := by + dsimp only + let M := + automorphismCyclicFixedField σ.1 + let W := + automorphismCyclicFixedPlace v σ.1 + let wK := + chosenFinitePlaceExtension (L := L) v + let wM := + automorphismCyclicFixedTopExtension v σ.1 + let σM : Gal(L/M) := + automorphismOverCyclicFixedField σ.1 + have hrestrict : + RamificationTheory.HilbertRamification.ValuationSubring.restrictAutomorphismScalars + (K := K) (M := M) σM = + σ.1 := by + apply AlgEquiv.ext + intro x + rfl + have hσM_wK : + σM ∈ + absoluteValueDecompositionGroup M wK.1 := by + apply + (decompositionGroupRestriction_mem_absoluteValueDecompositionGroup_restrictScalars_iff + (K := K) (M := M) wK.1 σM).mp + simpa only [hrestrict] using σ.2 + have hequiv : + wK.1.IsEquiv wM.1 := by + apply + finitePlaceExtensions_isEquiv_of_centres_eq + (F := K) (M := M) v W wK wM + exact + (automorphismCyclicFixedTopExtension_centre + (K := K) (L := L) v σ.1).symm + have hσM_wM : + σM ∈ + absoluteValueDecompositionGroup M wM.1 := by + rw [ + ← + absoluteValueDecompositionGroup_eq_of_absoluteValue_isEquiv + (F := M) wK.1 wM.1 hequiv] + exact hσM_wK + have hσM_chosen : + σM ∈ + absoluteValueDecompositionGroup M + (chosenFinitePlaceExtension (L := L) W).1 := by + rw [ + ← + absoluteValueDecompositionGroup_eq_of_exactExtensions_of_isMulCommutative + (F := M) + (NumberField.HeightOneSpectrum.adicAbv M W) + (RayClass.adicAbv_isNontrivial W) + wM + (chosenFinitePlaceExtension (L := L) W)] + exact hσM_wM + exact hσM_chosen + +/-- A decomposition automorphism remains a decomposition +automorphism after the cyclic fixed-field reduction, for the actual +chosen local Artin factor over the reduced base. -/ +theorem automorphismOverCyclicFixedField_mem_chosenFinitePlaceArtin_range + (v : HeightOneSpectrum (𝓞 K)) + (σ : + absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := L) v).1) : + let M := automorphismCyclicFixedField σ.1 + automorphismOverCyclicFixedField σ.1 ∈ + (chosenFinitePlaceArtinMonoidHom + (K := M) (L := L) + (automorphismCyclicFixedPlace v σ.1)).range := by + dsimp only + rw [ + chosenFinitePlaceArtinMonoidHom_range + (K := automorphismCyclicFixedField σ.1) (L := L) + (automorphismCyclicFixedPlace v σ.1)] + exact + automorphismOverCyclicFixedField_mem_chosenFinitePlaceDecompositionGroup + (K := K) (L := L) v σ + +/-- Restriction from the decomposition group in the common compatible +rational separable closure to the decomposition group at the chosen +finite place of `L`. + +The codomain is transported along the proved equality between the +restricted ambient absolute value and the supplied exact extension. -/ +noncomputable def finitePlaceSeparableClosureDecompositionRestriction + (v : HeightOneSpectrum (𝓞 K)) : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + let wL := + chosenFinitePlaceExtension (L := L) v + let wΩ := + numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v wL + absoluteValueDecompositionGroup K wΩ.1 →* + absoluteValueDecompositionGroup K wL.1 := by + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + dsimp only + let wL := + chosenFinitePlaceExtension (L := L) v + let wΩ := + numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v wL + exact + { toFun := fun τ => + ⟨AlgEquiv.restrictNormalHom L τ.1, + by + intro x + change + wL.1 + ((AlgEquiv.restrictNormalHom L τ.1) x) < 1 ↔ + wL.1 x < 1 + rw [ + ← + numberFieldTowerFinitePlaceExtensionToSeparableClosure_algebraMap + K L v wL + ((AlgEquiv.restrictNormalHom L τ.1) x), + ← + numberFieldTowerFinitePlaceExtensionToSeparableClosure_algebraMap + K L v wL x] + have hcomm : + algebraMap L (SeparableClosure ℚ) + ((AlgEquiv.restrictNormalHom L τ.1) x) = + τ.1 (algebraMap L (SeparableClosure ℚ) x) := by + exact AlgEquiv.restrictNormal_commutes τ.1 L x + rw [hcomm] + exact τ.2 (algebraMap L (SeparableClosure ℚ) x)⟩ + map_one' := by + apply Subtype.ext + exact + map_one + (AlgEquiv.restrictNormalHom + (F := K) (K₁ := SeparableClosure ℚ) L) + map_mul' := by + intro τ η + apply Subtype.ext + exact + map_mul + (AlgEquiv.restrictNormalHom + (F := K) (K₁ := SeparableClosure ℚ) L) + τ.1 η.1 } + +omit [FiniteDimensional K L] in +/-- On underlying automorphisms, the compatible finite-place +restriction is the ordinary normal-field restriction. -/ +@[simp] +theorem finitePlaceSeparableClosureDecompositionRestriction_coe + (v : HeightOneSpectrum (𝓞 K)) : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + ∀ (τ : + let wΩ := + numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v (chosenFinitePlaceExtension (L := L) v) + absoluteValueDecompositionGroup K wΩ.1), + ((finitePlaceSeparableClosureDecompositionRestriction + (K := K) (L := L) v) τ : + Gal(L/K)) = + AlgEquiv.restrictNormalHom L τ.1 := by + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + let : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + let : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + intro τ + rfl + +omit [FiniteDimensional K L] in +/-- The compatible separable-closure restriction is onto the actual +decomposition group at the chosen finite place. -/ +theorem finitePlaceSeparableClosureDecompositionRestriction_surjective + (v : HeightOneSpectrum (𝓞 K)) : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + Function.Surjective + (finitePlaceSeparableClosureDecompositionRestriction + (K := K) (L := L) v) := by + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + let : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + let : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + dsimp only + let separableClosurePadicLiftBaseIsGalois : + IsGalois K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosure_isGalois K L + let wL := + chosenFinitePlaceExtension (L := L) v + let wΩ := + numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v wL + let r := + absoluteValueDecompositionGroupRestrictionHom + (K := K) (L := L) (Ω := SeparableClosure ℚ) wΩ.1 + have hr : Function.Surjective r := + absoluteValueDecompositionGroupRestrictionHom_surjective + (K := K) (L := L) (Ω := SeparableClosure ℚ) + (NumberField.HeightOneSpectrum.adicAbv K v) + (RayClass.adicAbv_isNontrivial v) wΩ + have hw : + wΩ.1.comp + (f := algebraMap L (SeparableClosure ℚ)) + (algebraMap L (SeparableClosure ℚ)).injective = + wL.1 := + numberFieldTowerFinitePlaceExtensionToSeparableClosure_restrict + K L v wL + let σToRestricted : + absoluteValueDecompositionGroup K wL.1 → + absoluteValueDecompositionGroup K + (wΩ.1.comp + (f := algebraMap L (SeparableClosure ℚ)) + (algebraMap L (SeparableClosure ℚ)).injective) := + fun σ => + ⟨σ.1, by + simpa only [hw] using σ.2⟩ + intro σ + obtain ⟨τ, hτ⟩ := hr (σToRestricted σ) + refine ⟨τ, ?_⟩ + apply Subtype.ext + change (r τ).1 = (σToRestricted σ).1 + exact congrArg + (fun ρ : + absoluteValueDecompositionGroup K + (wΩ.1.comp + (f := algebraMap L (SeparableClosure ℚ)) + (algebraMap L (SeparableClosure ℚ)).injective) => ρ.1) + hτ + +/-- Scalar restriction embeds the decomposition group over `L` into +the compatible decomposition group over `K`. -/ +noncomputable def + finitePlaceSeparableClosureTopDecompositionInclusion + (v : HeightOneSpectrum (𝓞 K)) : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + let wΩ := + numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v (chosenFinitePlaceExtension (L := L) v) + absoluteValueDecompositionGroup L wΩ.1 →* + absoluteValueDecompositionGroup K wΩ.1 := by + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + dsimp only + let wΩ := + numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v (chosenFinitePlaceExtension (L := L) v) + exact + { toFun := fun τ => + ⟨RamificationTheory.HilbertRamification.ValuationSubring.restrictAutomorphismScalars + (K := K) (M := L) τ.1, + (decompositionGroupRestriction_mem_absoluteValueDecompositionGroup_restrictScalars_iff + (K := K) (M := L) wΩ.1 τ.1).2 τ.2⟩ + map_one' := by + apply Subtype.ext + rfl + map_mul' := by + intro τ η + apply Subtype.ext + rfl } + +omit [FiniteDimensional K L] in +/-- The image of the top-field decomposition group is exactly the +kernel of restriction to the chosen finite-place decomposition group +of `L`. -/ +theorem + finitePlaceSeparableClosureTopDecompositionInclusion_range + (v : HeightOneSpectrum (𝓞 K)) : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + (finitePlaceSeparableClosureTopDecompositionInclusion + (K := K) (L := L) v).range = + (finitePlaceSeparableClosureDecompositionRestriction + (K := K) (L := L) v).ker := by + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + let : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + let : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + let wL := + chosenFinitePlaceExtension (L := L) v + let wΩ := + numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v wL + ext τ + constructor + · rintro ⟨η, rfl⟩ + rw [MonoidHom.mem_ker] + apply Subtype.ext + apply AlgEquiv.ext + intro x + simp only [ + finitePlaceSeparableClosureDecompositionRestriction_coe] + apply (algebraMap L (SeparableClosure ℚ)).injective + calc + algebraMap L (SeparableClosure ℚ) + ((AlgEquiv.restrictNormalHom L + ((finitePlaceSeparableClosureTopDecompositionInclusion + (K := K) (L := L) v) η).1) x) = + ((finitePlaceSeparableClosureTopDecompositionInclusion + (K := K) (L := L) v) η).1 + (algebraMap L (SeparableClosure ℚ) x) := + AlgEquiv.restrictNormal_commutes + ((finitePlaceSeparableClosureTopDecompositionInclusion + (K := K) (L := L) v) η).1 L x + _ = η.1 (algebraMap L (SeparableClosure ℚ) x) := rfl + _ = algebraMap L (SeparableClosure ℚ) x := η.1.commutes x + _ = algebraMap L (SeparableClosure ℚ) + ((1 : Gal(L/K)) x) := rfl + · intro hτ + have hrestriction : + AlgEquiv.restrictNormalHom L τ.1 = 1 := by + have hτOne := MonoidHom.mem_ker.mp hτ + have hτVal := congrArg Subtype.val hτOne + calc + AlgEquiv.restrictNormalHom L τ.1 = + ((1 : absoluteValueDecompositionGroup K wL.1).1 : + Gal(L/K)) := by + simpa only [ + finitePlaceSeparableClosureDecompositionRestriction_coe] using + hτVal + _ = 1 := rfl + let η : SeparableClosure ℚ ≃ₐ[L] SeparableClosure ℚ := + { τ.1.toRingEquiv with + commutes' := by + intro x + have hcomm := + AlgEquiv.restrictNormal_commutes τ.1 L x + have hx := + congrArg (fun ρ : Gal(L/K) => ρ x) hrestriction + change (τ.1.restrictNormal L) x = x at hx + calc + τ.1 (algebraMap L (SeparableClosure ℚ) x) = + algebraMap L (SeparableClosure ℚ) + ((τ.1.restrictNormal L) x) := hcomm.symm + _ = algebraMap L (SeparableClosure ℚ) x := + congrArg (algebraMap L (SeparableClosure ℚ)) hx } + have hη : + η ∈ absoluteValueDecompositionGroup L wΩ.1 := by + intro x + exact τ.2 x + refine ⟨⟨η, hη⟩, ?_⟩ + apply Subtype.ext + apply AlgEquiv.ext + intro x + rfl + +/-- The compatible separable-closure absolute value, regarded as an +exact extension of the chosen absolute value on the top number +field. -/ +noncomputable def finitePlaceSeparableClosureTopExtension + (v : HeightOneSpectrum (𝓞 K)) : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + let wL := + chosenFinitePlaceExtension (L := L) v + AbsoluteValueExtension wL.1 (SeparableClosure ℚ) := by + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + dsimp only + let wL := + chosenFinitePlaceExtension (L := L) v + let wΩ := + numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v wL + refine ⟨wΩ.1, ?_⟩ + intro x + exact + numberFieldTowerFinitePlaceExtensionToSeparableClosure_algebraMap + K L v wL x + +/-- Restriction of the compatible separable-closure valuation to the +actual cyclotomic `ZHat`-compositum over the top number field. -/ +noncomputable def finitePlaceCyclotomicCompositumExtension + (v : HeightOneSpectrum (𝓞 K)) : + let wL := + chosenFinitePlaceExtension (L := L) v + AbsoluteValueExtension wL.1 + (numberFieldCyclotomicZHatCompositum L) := by + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + letI : IsScalarTower L + (numberFieldCyclotomicZHatCompositum L) + (SeparableClosure ℚ) := + numberFieldCyclotomicZHatCompositumSeparableClosureScalarTower L + dsimp only + let C := + numberFieldCyclotomicZHatCompositum L + let wL := + chosenFinitePlaceExtension (L := L) v + let wΩL := + finitePlaceSeparableClosureTopExtension + (K := K) (L := L) v + refine + ⟨wΩL.1.comp + (f := algebraMap C (SeparableClosure ℚ)) + (algebraMap C (SeparableClosure ℚ)).injective, + ?_⟩ + intro x + change + wΩL.1 + (algebraMap C (SeparableClosure ℚ) + (algebraMap L C x)) = + wL.1 x + rw [← IsScalarTower.algebraMap_apply L C (SeparableClosure ℚ)] + exact wΩL.2 x + +omit [FiniteDimensional K L] in +/-- The restricted cyclotomic-compositum valuation has the same +finite-place class as the normalized valuation at the centre of the +chosen extension on the top field. -/ +theorem finitePlaceCyclotomicCompositumExtension_base_isEquiv + (v : HeightOneSpectrum (𝓞 K)) : + let wL := + chosenFinitePlaceExtension (L := L) v + let wC := + finitePlaceCyclotomicCompositumExtension + (K := K) (L := L) v + (wC.1.comp + (f := algebraMap L + (numberFieldCyclotomicZHatCompositum L)) + (algebraMap L + (numberFieldCyclotomicZHatCompositum L)).injective).IsEquiv + (NumberField.HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v wL)) := by + dsimp only + let C := + numberFieldCyclotomicZHatCompositum L + let wL := + chosenFinitePlaceExtension (L := L) v + let wC := + finitePlaceCyclotomicCompositumExtension + (K := K) (L := L) v + have hrestrict : + wC.1.comp + (f := algebraMap L C) + (algebraMap L C).injective = + wL.1 := by + ext x + exact wC.2 x + change + (wC.1.comp + (f := algebraMap L C) + (algebraMap L C).injective).IsEquiv + (NumberField.HeightOneSpectrum.adicAbv L + (finitePlaceExtensionCentre + (K := K) (L := L) v wL)) + rw [hrestrict] + exact + finitePlaceExtension_isEquiv_adicAbv + (K := K) (L := L) v wL + +/-- Restriction from the top-field decomposition group in the +compatible separable closure to the decomposition group in the actual +cyclotomic `ZHat`-compositum. -/ +noncomputable def + finitePlaceSeparableClosureTopCyclotomicRestriction + (v : HeightOneSpectrum (𝓞 K)) : + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower L + (numberFieldCyclotomicZHatCompositum L) + (SeparableClosure ℚ) := + numberFieldCyclotomicZHatCompositumSeparableClosureScalarTower L + let wΩL := + finitePlaceSeparableClosureTopExtension + (K := K) (L := L) v + let wC := + finitePlaceCyclotomicCompositumExtension + (K := K) (L := L) v + absoluteValueDecompositionGroup L wΩL.1 →* + absoluteValueDecompositionGroup L wC.1 := by + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower L + (numberFieldCyclotomicZHatCompositum L) + (SeparableClosure ℚ) := + numberFieldCyclotomicZHatCompositumSeparableClosureScalarTower L + dsimp only + let C := + numberFieldCyclotomicZHatCompositum L + let wΩL := + finitePlaceSeparableClosureTopExtension + (K := K) (L := L) v + let wC := + finitePlaceCyclotomicCompositumExtension + (K := K) (L := L) v + have hwC : + wΩL.1.comp + (f := algebraMap C (SeparableClosure ℚ)) + (algebraMap C (SeparableClosure ℚ)).injective = + wC.1 := by + rfl + let raw := + absoluteValueDecompositionGroupRestrictionHom + (K := L) (L := C) (Ω := SeparableClosure ℚ) + wΩL.1 + exact + { toFun := fun τ => + ⟨(raw τ).1, by + simpa only [hwC] using (raw τ).2⟩ + map_one' := by + apply Subtype.ext + exact congrArg Subtype.val (map_one raw) + map_mul' := by + intro τ η + apply Subtype.ext + exact congrArg Subtype.val (map_mul raw τ η) } + +omit [FiniteDimensional K L] in +/-- The top-field decomposition group surjects onto the decomposition +group of the actual cyclotomic `ZHat`-compositum at the restricted +place. -/ +theorem + finitePlaceSeparableClosureTopCyclotomicRestriction_surjective + (v : HeightOneSpectrum (𝓞 K)) : + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower L + (numberFieldCyclotomicZHatCompositum L) + (SeparableClosure ℚ) := + numberFieldCyclotomicZHatCompositumSeparableClosureScalarTower L + Function.Surjective + (finitePlaceSeparableClosureTopCyclotomicRestriction + (K := K) (L := L) v) := by + let : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + let : IsScalarTower L + (numberFieldCyclotomicZHatCompositum L) + (SeparableClosure ℚ) := + numberFieldCyclotomicZHatCompositumSeparableClosureScalarTower L + dsimp only + let C := + numberFieldCyclotomicZHatCompositum L + let separableClosurePadicLiftTopIsGalois : + IsGalois L (SeparableClosure ℚ) := + numberFieldSeparableClosureTop_isGalois L + let wL := + chosenFinitePlaceExtension (L := L) v + let wΩL := + finitePlaceSeparableClosureTopExtension + (K := K) (L := L) v + let wC := + finitePlaceCyclotomicCompositumExtension + (K := K) (L := L) v + let raw := + absoluteValueDecompositionGroupRestrictionHom + (K := L) (L := C) (Ω := SeparableClosure ℚ) wΩL.1 + have hraw : Function.Surjective raw := + absoluteValueDecompositionGroupRestrictionHom_surjective + (K := L) (L := C) (Ω := SeparableClosure ℚ) + wL.1 + (wL.isNontrivial + (RayClass.adicAbv_isNontrivial v)) + wΩL + have hwC : + wΩL.1.comp + (f := algebraMap C (SeparableClosure ℚ)) + (algebraMap C (SeparableClosure ℚ)).injective = + wC.1 := by + rfl + intro σ + let σRaw : + absoluteValueDecompositionGroup L + (wΩL.1.comp + (f := algebraMap C (SeparableClosure ℚ)) + (algebraMap C (SeparableClosure ℚ)).injective) := + ⟨σ.1, by + rw [hwC] + exact σ.2⟩ + obtain ⟨τ, hτ⟩ := hraw σRaw + refine ⟨τ, ?_⟩ + apply Subtype.ext + change (raw τ).1 = σRaw.1 + exact congrArg + (fun ρ : + absoluteValueDecompositionGroup L + (wΩL.1.comp + (f := algebraMap C (SeparableClosure ℚ)) + (algebraMap C (SeparableClosure ℚ)).injective) => ρ.1) + hτ + +/-- Restriction of the compatible separable-closure decomposition +group to the actual rational cyclotomic `ZHat`-field. -/ +noncomputable def finitePlaceSeparableClosureCyclotomicRestriction + (v : HeightOneSpectrum (𝓞 K)) : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + letI : IsScalarTower ℚ K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseScalarTower K L + let wΩ := + numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v (chosenFinitePlaceExtension (L := L) v) + absoluteValueDecompositionGroup K wΩ.1 →* + Gal(rationalCyclotomicZHatField/ℚ) := + by + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + letI : IsScalarTower ℚ K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseScalarTower K L + letI : Normal ℚ rationalCyclotomicZHatField := + rationalCyclotomicZHatField_normal + exact + (AlgEquiv.restrictNormalHom + rationalCyclotomicZHatField).comp + ((AlgEquiv.restrictScalarsHom ℚ).comp + (absoluteValueDecompositionGroup K + (numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v + (chosenFinitePlaceExtension (L := L) v)).1).subtype) + +/-- The genuine `p`-adic cyclotomic degree on the compatible +separable-closure decomposition group. -/ +noncomputable def finitePlaceSeparableClosurePadicCyclotomicDegree + (v : HeightOneSpectrum (𝓞 K)) + (p : Nat.Primes) : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + letI : IsScalarTower ℚ K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseScalarTower K L + let wΩ := + numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v (chosenFinitePlaceExtension (L := L) v) + absoluteValueDecompositionGroup K wΩ.1 →* + Multiplicative ℤ_[p.1] := + by + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + letI : IsScalarTower ℚ K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseScalarTower K L + exact + (rationalCyclotomicPadicCoordinate p).toMonoidHom.comp + (finitePlaceSeparableClosureCyclotomicRestriction + (K := K) (L := L) v) + +omit [FiniteDimensional K L] in +/-- Restricting first to the top cyclotomic compositum gives the same +`p`-adic degree as restricting directly from the common separable +closure to the rational cyclotomic field. -/ +theorem + finitePlaceSeparableClosureTopCyclotomicRestriction_padicDegree + (v : HeightOneSpectrum (𝓞 K)) + (p : Nat.Primes) : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + letI : IsScalarTower ℚ K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseScalarTower K L + letI : IsScalarTower L + (numberFieldCyclotomicZHatCompositum L) + (SeparableClosure ℚ) := + numberFieldCyclotomicZHatCompositumSeparableClosureScalarTower L + (finitePlaceSeparableClosurePadicCyclotomicDegree + (K := K) (L := L) v p).comp + (finitePlaceSeparableClosureTopDecompositionInclusion + (K := K) (L := L) v) = + (numberFieldCyclotomicPadicDecompositionCoordinate L + (finitePlaceCyclotomicCompositumExtension + (K := K) (L := L) v).1 p).toMonoidHom.comp + (finitePlaceSeparableClosureTopCyclotomicRestriction + (K := K) (L := L) v) := by + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + let : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + let : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + let : IsScalarTower ℚ K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseScalarTower K L + let : IsScalarTower L + (numberFieldCyclotomicZHatCompositum L) + (SeparableClosure ℚ) := + numberFieldCyclotomicZHatCompositumSeparableClosureScalarTower L + let C := + numberFieldCyclotomicZHatCompositum L + let T := + rationalCyclotomicZHatField + let : Algebra T C := + rationalCyclotomicZHatCompositumAlgebra L + let : IsScalarTower ℚ T C := + rationalCyclotomicZHatCompositum_scalarTower L + let : Normal ℚ T := + rationalCyclotomicZHatField_normal + let : Normal L C := + IsGalois.to_normal + apply MonoidHom.ext + intro τ + apply congrArg (rationalCyclotomicPadicCoordinate p) + apply AlgEquiv.ext + intro x + let τK : SeparableClosure ℚ ≃ₐ[K] SeparableClosure ℚ := + RamificationTheory.HilbertRamification.ValuationSubring.restrictAutomorphismScalars + (K := K) (M := L) τ.1 + let τQ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ := + τK.restrictScalars ℚ + let τC : C ≃ₐ[L] C := + AlgEquiv.restrictNormalHom C τ.1 + change + AlgEquiv.restrictNormalHom T τQ x = + numberFieldCyclotomicZHatCompositumRestriction L τC x + have hTC (z : T) : + algebraMap C (SeparableClosure ℚ) (algebraMap T C z) = + algebraMap T (SeparableClosure ℚ) z := by + rfl + have hC : + algebraMap T C + (numberFieldCyclotomicZHatCompositumRestriction L τC x) = + τC (algebraMap T C x) := by + change + algebraMap T C + ((AlgEquiv.restrictNormal + (MulSemiringAction.toAlgEquiv ℚ C τC) T) x) = + (MulSemiringAction.toAlgEquiv ℚ C τC) + (algebraMap T C x) + exact + AlgEquiv.restrictNormal_commutes + (MulSemiringAction.toAlgEquiv ℚ C τC) T x + have hΩC : + algebraMap C (SeparableClosure ℚ) (τC (algebraMap T C x)) = + τ.1 + (algebraMap C (SeparableClosure ℚ) + (algebraMap T C x)) := by + exact + AlgEquiv.restrictNormal_commutes τ.1 C + (algebraMap T C x) + apply (algebraMap T (SeparableClosure ℚ)).injective + calc + algebraMap T (SeparableClosure ℚ) + (AlgEquiv.restrictNormalHom T τQ x) = + τQ (algebraMap T (SeparableClosure ℚ) x) := + AlgEquiv.restrictNormal_commutes τQ T x + _ = τ.1 (algebraMap T (SeparableClosure ℚ) x) := rfl + _ = τ.1 + (algebraMap C (SeparableClosure ℚ) + (algebraMap T C x)) := + congrArg τ.1 (hTC x).symm + _ = algebraMap C (SeparableClosure ℚ) + (τC (algebraMap T C x)) := hΩC.symm + _ = algebraMap C (SeparableClosure ℚ) + (algebraMap T C + (numberFieldCyclotomicZHatCompositumRestriction L τC x)) := + congrArg (algebraMap C (SeparableClosure ℚ)) hC.symm + _ = algebraMap T (SeparableClosure ℚ) + (numberFieldCyclotomicZHatCompositumRestriction L τC x) := + hTC _ + +omit [FiniteDimensional K L] in +/-- The `p`-adic degrees contributed by the top-field decomposition +group are exactly those visible in the actual cyclotomic compositum at +the restricted place. -/ +theorem + finitePlaceSeparableClosureTop_padicDegree_range + (v : HeightOneSpectrum (𝓞 K)) + (p : Nat.Primes) : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + letI : IsScalarTower ℚ K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseScalarTower K L + letI : IsScalarTower L + (numberFieldCyclotomicZHatCompositum L) + (SeparableClosure ℚ) := + numberFieldCyclotomicZHatCompositumSeparableClosureScalarTower L + ((finitePlaceSeparableClosurePadicCyclotomicDegree + (K := K) (L := L) v p).comp + (finitePlaceSeparableClosureTopDecompositionInclusion + (K := K) (L := L) v)).range = + (numberFieldCyclotomicPadicDecompositionCoordinate L + (finitePlaceCyclotomicCompositumExtension + (K := K) (L := L) v).1 p).toMonoidHom.range := by + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + let : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + let : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + let : IsScalarTower ℚ K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseScalarTower K L + let : IsScalarTower L + (numberFieldCyclotomicZHatCompositum L) + (SeparableClosure ℚ) := + numberFieldCyclotomicZHatCompositumSeparableClosureScalarTower L + rw [ + finitePlaceSeparableClosureTopCyclotomicRestriction_padicDegree + (K := K) (L := L) v p] + apply le_antisymm + · rintro y ⟨τ, rfl⟩ + exact + ⟨finitePlaceSeparableClosureTopCyclotomicRestriction + (K := K) (L := L) v τ, + rfl⟩ + · rintro y ⟨σ, rfl⟩ + obtain ⟨τ, hτ⟩ := + finitePlaceSeparableClosureTopCyclotomicRestriction_surjective + (K := K) (L := L) v σ + refine ⟨τ, ?_⟩ + exact congrArg + (numberFieldCyclotomicPadicDecompositionCoordinate L + (finitePlaceCyclotomicCompositumExtension + (K := K) (L := L) v).1 p) + hτ + +omit [FiniteDimensional K L] in +/-- The `p`-adic degrees contributed by the kernel of finite-place +restriction are exactly the degrees coming from the decomposition +group over the top field. -/ +theorem + finitePlaceSeparableClosureRestrictionKernel_padicDegree_range + (v : HeightOneSpectrum (𝓞 K)) + (p : Nat.Primes) : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + letI : IsScalarTower ℚ K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseScalarTower K L + letI : IsScalarTower L + (numberFieldCyclotomicZHatCompositum L) + (SeparableClosure ℚ) := + numberFieldCyclotomicZHatCompositumSeparableClosureScalarTower L + let restriction := + finitePlaceSeparableClosureDecompositionRestriction + (K := K) (L := L) v + let inclusion := + finitePlaceSeparableClosureTopDecompositionInclusion + (K := K) (L := L) v + let degree := + finitePlaceSeparableClosurePadicCyclotomicDegree + (K := K) (L := L) v p + (restriction.ker.map degree).toAddSubgroup' = + (degree.comp inclusion).range.toAddSubgroup' := by + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + let : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + let : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + let : IsScalarTower ℚ K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseScalarTower K L + let : IsScalarTower L + (numberFieldCyclotomicZHatCompositum L) + (SeparableClosure ℚ) := + numberFieldCyclotomicZHatCompositumSeparableClosureScalarTower L + dsimp only + let restriction := + finitePlaceSeparableClosureDecompositionRestriction + (K := K) (L := L) v + let inclusion := + finitePlaceSeparableClosureTopDecompositionInclusion + (K := K) (L := L) v + let degree := + finitePlaceSeparableClosurePadicCyclotomicDegree + (K := K) (L := L) v p + rw [ + ← + finitePlaceSeparableClosureTopDecompositionInclusion_range + (K := K) (L := L) v, + MonoidHom.range_comp] + +omit [FiniteDimensional K L] in +/-- The `p`-adic cyclotomic degrees contributed by the genuine kernel +of finite-place restriction form a closed additive subgroup of +`ℤ_p`. -/ +theorem + finitePlaceSeparableClosureRestrictionKernel_padicDegree_isClosed + (v : HeightOneSpectrum (𝓞 K)) + (p : Nat.Primes) : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + letI : IsScalarTower ℚ K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseScalarTower K L + letI : IsScalarTower L + (numberFieldCyclotomicZHatCompositum L) + (SeparableClosure ℚ) := + numberFieldCyclotomicZHatCompositumSeparableClosureScalarTower L + let restriction := + finitePlaceSeparableClosureDecompositionRestriction + (K := K) (L := L) v + let degree := + finitePlaceSeparableClosurePadicCyclotomicDegree + (K := K) (L := L) v p + IsClosed + ((((restriction.ker.map degree).toAddSubgroup' : + AddSubgroup ℤ_[p.1]) : + Set ℤ_[p.1])) := by + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + let : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + let : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + let : IsScalarTower ℚ K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseScalarTower K L + let : IsScalarTower L + (numberFieldCyclotomicZHatCompositum L) + (SeparableClosure ℚ) := + numberFieldCyclotomicZHatCompositumSeparableClosureScalarTower L + dsimp only + rw [ + finitePlaceSeparableClosureRestrictionKernel_padicDegree_range + (K := K) (L := L) v p, + finitePlaceSeparableClosureTop_padicDegree_range + (K := K) (L := L) v p] + change + IsClosed + ((fun z : ℤ_[p.1] => Multiplicative.ofAdd z) ⁻¹' + ((numberFieldCyclotomicPadicDecompositionCoordinate L + (finitePlaceCyclotomicCompositumExtension + (K := K) (L := L) v).1 p).range : + Set (Multiplicative ℤ_[p.1]))) + exact + (numberFieldCyclotomicPadicDecompositionCoordinate_range_isClosed + L + (finitePlaceCyclotomicCompositumExtension + (K := K) (L := L) v).1 p).preimage + continuous_ofAdd + +omit [FiniteDimensional K L] in +/-- The `p`-adic cyclotomic degrees contributed by the genuine kernel +of finite-place restriction form an open subgroup of `ℤ_p`. + +The point is that the valuation on the actual cyclotomic compositum +need only represent the normalized finite-place class. The +finite-index theorem for that valuation class and closedness of the +kernel image give openness. -/ +theorem + finitePlaceSeparableClosureRestrictionKernel_padicDegree_isOpen + (v : HeightOneSpectrum (𝓞 K)) + (p : Nat.Primes) : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + letI : IsScalarTower ℚ K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseScalarTower K L + letI : IsScalarTower L + (numberFieldCyclotomicZHatCompositum L) + (SeparableClosure ℚ) := + numberFieldCyclotomicZHatCompositumSeparableClosureScalarTower L + let restriction := + finitePlaceSeparableClosureDecompositionRestriction + (K := K) (L := L) v + let degree := + finitePlaceSeparableClosurePadicCyclotomicDegree + (K := K) (L := L) v p + IsOpen + ((((restriction.ker.map degree).toAddSubgroup' : + AddSubgroup ℤ_[p.1]) : + Set ℤ_[p.1])) := by + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + let : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + let : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + let : IsScalarTower ℚ K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseScalarTower K L + let : IsScalarTower L + (numberFieldCyclotomicZHatCompositum L) + (SeparableClosure ℚ) := + numberFieldCyclotomicZHatCompositumSeparableClosureScalarTower L + dsimp only + have hclosed := + finitePlaceSeparableClosureRestrictionKernel_padicDegree_isClosed + (K := K) (L := L) v p + dsimp only at hclosed + rw [ + finitePlaceSeparableClosureRestrictionKernel_padicDegree_range + (K := K) (L := L) v p, + finitePlaceSeparableClosureTop_padicDegree_range + (K := K) (L := L) v p] at hclosed ⊢ + let H : AddSubgroup ℤ_[p.1] := + (numberFieldCyclotomicPadicDecompositionCoordinate L + (finitePlaceCyclotomicCompositumExtension + (K := K) (L := L) v).1 p).range.toAddSubgroup' + change IsClosed (H : Set ℤ_[p.1]) at hclosed + have hindex : H.index ≠ 0 := by + exact + numberFieldCyclotomicPadicDecompositionCoordinate_range_index_ne_zero_of_base_isEquiv + L + (finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v)) + (finitePlaceCyclotomicCompositumExtension + (K := K) (L := L) v).1 + (finitePlaceCyclotomicCompositumExtension_base_isEquiv + (K := K) (L := L) v) + p + let finiteIndexH : H.FiniteIndex := ⟨hindex⟩ + exact AddSubgroup.isOpen_of_isClosed_of_finiteIndex H hclosed + +/-- A surjective restriction map admits a lift with positive integral +`p`-adic degree whenever the degrees contributed by its kernel form an +open subgroup of `ℤ_[p]`. + +The initial lift is corrected inside the genuine restriction kernel. +Density of the positive natural numbers in `ℤ_[p]` supplies the +required correction without changing its prescribed restriction. -/ +theorem exists_positivePadicDegree_lift_of_surjective + {D A : Type} [Group D] [Group A] + (p : ℕ) [Fact p.Prime] + (restriction : D →* A) + (hrestriction : Function.Surjective restriction) + (degree : D →* Multiplicative ℤ_[p]) + (hdegree : + IsOpen + ((((restriction.ker.map degree).toAddSubgroup' : + AddSubgroup ℤ_[p]) : + Set ℤ_[p]))) + (σ : A) : + ∃ τ : D, + restriction τ = σ ∧ + ∃ n : ℕ, 0 < n ∧ + degree τ = + (Multiplicative.ofAdd (1 : ℤ_[p])) ^ n := by + obtain ⟨s, hs⟩ := hrestriction σ + let H : AddSubgroup ℤ_[p] := + (restriction.ker.map degree).toAddSubgroup' + have hHopen : IsOpen (H : Set ℤ_[p]) := by + simpa only [H] using hdegree + obtain ⟨n, hn, hmem⟩ := + PadicInt.exists_positive_natCast_sub_mem_of_isOpen_addSubgroup + p H hHopen (Multiplicative.toAdd (degree s)) + have hcorrection : + (n : ℤ_[p]) - + Multiplicative.toAdd (degree s) ∈ H := by + simpa only [neg_sub] using H.neg_mem hmem + change + Multiplicative.ofAdd + ((n : ℤ_[p]) - + Multiplicative.toAdd (degree s)) ∈ + restriction.ker.map degree at hcorrection + obtain ⟨k, hk, hdk⟩ := hcorrection + refine ⟨s * k, ?_, ⟨n, hn, ?_⟩⟩ + · rw [map_mul, hs] + change restriction k = 1 at hk + rw [hk, mul_one] + · apply Multiplicative.ext + rw [map_mul] + change + Multiplicative.toAdd (degree s) + + Multiplicative.toAdd (degree k) = + n • (1 : ℤ_[p]) + have hdk' := congrArg Multiplicative.toAdd hdk + change + Multiplicative.toAdd (degree k) = + (n : ℤ_[p]) - + Multiplicative.toAdd (degree s) at hdk' + rw [hdk'] + simp only [nsmul_eq_mul, mul_one] + abel + +omit [FiniteDimensional K L] in +/-- Every actual finite-place decomposition automorphism has a lift to +the compatible separable closure whose genuine cyclotomic `p`-adic +degree is a positive integer. + +The lift is corrected only inside the decomposition group over `L`, so +its prescribed restriction to `L` is unchanged. -/ +theorem + exists_finitePlaceSeparableClosureLift_with_positivePadicCyclotomicDegree + (v : HeightOneSpectrum (𝓞 K)) + (p : Nat.Primes) + (σ : + absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := L) v).1) : + letI : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + letI : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + letI : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + letI : IsScalarTower ℚ K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseScalarTower K L + letI : IsScalarTower L + (numberFieldCyclotomicZHatCompositum L) + (SeparableClosure ℚ) := + numberFieldCyclotomicZHatCompositumSeparableClosureScalarTower L + let wΩ := + numberFieldTowerFinitePlaceExtensionToSeparableClosure + K L v (chosenFinitePlaceExtension (L := L) v) + ∃ τ : absoluteValueDecompositionGroup K wΩ.1, + finitePlaceSeparableClosureDecompositionRestriction + (K := K) (L := L) v τ = + σ ∧ + ∃ n : ℕ, 0 < n ∧ + finitePlaceSeparableClosurePadicCyclotomicDegree + (K := K) (L := L) v p τ = + (Multiplicative.ofAdd (1 : ℤ_[p.1])) ^ n := by + let : Algebra K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseAlgebra K L + let : Algebra L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureTopAlgebra L + let : IsScalarTower K L (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureScalarTower K L + let : IsScalarTower ℚ K (SeparableClosure ℚ) := + numberFieldTowerSeparableClosureBaseScalarTower K L + let : IsScalarTower L + (numberFieldCyclotomicZHatCompositum L) + (SeparableClosure ℚ) := + numberFieldCyclotomicZHatCompositumSeparableClosureScalarTower L + dsimp only + exact + exists_positivePadicDegree_lift_of_surjective + p + (finitePlaceSeparableClosureDecompositionRestriction + (K := K) (L := L) v) + (finitePlaceSeparableClosureDecompositionRestriction_surjective + (K := K) (L := L) v) + (finitePlaceSeparableClosurePadicCyclotomicDegree + (K := K) (L := L) v p) + (finitePlaceSeparableClosureRestrictionKernel_padicDegree_isOpen + (K := K) (L := L) v p) + σ + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibHilbertProductFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibHilbertProductFormula.lean new file mode 100644 index 0000000000..c6a5fea222 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibHilbertProductFormula.lean @@ -0,0 +1,79 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormula +public import Mathlib.Algebra.BigOperators.Finprod +/-! +# Mathlib-facing Hilbert product formula + +The established product formula is transported from the internal subgroup of +roots of unity to Mathlib's `rootsOfUnity`. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +open scoped BigOperators NumberField +open NumberField IsDedekindDomain + +open scoped Classical in +/-- The finite-place Hilbert factor, transported from the internal +unit-root subgroup to Mathlib's `rootsOfUnity`. -/ +noncomputable def globalFinitePlaceHilbertSymbol + (F : Type) [Field F] [NumberField F] + (n : ℕ+) (hnF : ((n : ℕ) : F) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) F).Nonempty) + (v : HeightOneSpectrum (𝓞 F)) (a b : Fˣ) : + rootsOfUnity (n : ℕ) F := + (KummerTheory.nthRootsSubgroupEquivRootsOfUnity F (n : ℕ)) + (GlobalClassFieldTheory.Reciprocity.finitePlaceHilbertSymbol + F n hnF hmu v a b) + +open scoped Classical in +/-- **Hilbert product formula.** The product of the local symbols of two +global units over every finite and infinite place is one. -/ +theorem hilbertProductFormula + (F : Type) [Field F] [NumberField F] + (n : ℕ+) (hnF : ((n : ℕ) : F) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) F).Nonempty) + (a b : Fˣ) : + (∏ v : InfinitePlace F, + globalInfinitePlaceHilbertSymbol F n v a b) * + ∏ᶠ v : HeightOneSpectrum (𝓞 F), + globalFinitePlaceHilbertSymbol F n hnF hmu v a b = 1 := by + let e := KummerTheory.nthRootsSubgroupEquivRootsOfUnity F (n : ℕ) + have hfinite := + GlobalClassFieldTheory.Reciprocity.finitePlaceHilbertSymbol_hasFiniteMulSupport + F n hnF hmu a b + change + (∏ v : InfinitePlace F, + e (GlobalClassFieldTheory.Reciprocity.infinitePlaceHilbertSymbol + F n v a b)) * + ∏ᶠ v : HeightOneSpectrum (𝓞 F), + e (GlobalClassFieldTheory.Reciprocity.finitePlaceHilbertSymbol + F n hnF hmu v a b) = 1 + calc + _ = e + ((∏ v : InfinitePlace F, + GlobalClassFieldTheory.Reciprocity.infinitePlaceHilbertSymbol + F n v a b) * + ∏ᶠ v : HeightOneSpectrum (𝓞 F), + GlobalClassFieldTheory.Reciprocity.finitePlaceHilbertSymbol + F n hnF hmu v a b) := by + rw [map_mul, map_prod, map_finprod e hfinite] + _ = e 1 := congrArg e + (GlobalClassFieldTheory.Reciprocity.hilbertSymbol_allPlaces_product_eq_one + F n hnF hmu a b) + _ = 1 := map_one e + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibTopologicalGlobalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibTopologicalGlobalReciprocity.lean new file mode 100644 index 0000000000..1cbd79ad26 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibTopologicalGlobalReciprocity.lean @@ -0,0 +1,55 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.ConnectedComponentQuotientCongr +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibTopologyComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IdeleClassConnectedQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianKernel +/-! +# Topological global reciprocity in Mathlib's groups + +The existing maximal-abelian Artin isomorphism is transported through the +topological comparison of idèle class groups and the canonical comparison of +absolute Galois abelianizations. This module proves the small-universe case; +universe transport for the public statement is separate. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory.Reciprocity + +/-- The maximal-abelian Artin isomorphism, expressed entirely in Mathlib's +idèle-class and absolute-Galois groups, for a small number-field carrier. -/ +noncomputable def mathlibIdeleClassConnectedQuotientEquivAbelianization + (K : Type) [Field K] [NumberField K] : + ClassFieldTheory.IdeleClassConnectedQuotient K ≃ₜ* + Field.absoluteGaloisGroupAbelianization K := by + let classEquiv : IdeleClassGroup K ≃ₜ* + NumberField.IdeleClassGroup (𝓞 K) K := + IdeleGroup.ideleClassGroupContinuousMulEquivMathlib K + let compEquiv := ClassFieldTheory.connectedComponentQuotientCongr classEquiv + let e₁ : ClassFieldTheory.IdeleClassConnectedQuotient K ≃ₜ* + ideleClassComponentQuotient K := compEquiv.symm + let e₂ : ideleClassComponentQuotient K ≃ₜ* + Gal(maximalAbelianExtension K/K) := + ideleClassComponentQuotientEquivMaximalAbelianGalois K + let e₃ : TopologicalAbelianization Gal(SeparableClosure K/K) ≃ₜ* + Gal(maximalAbelianExtension K/K) := + absoluteTopologicalAbelianizationEquivMaximalAbelianGalois K + let e₄ : Field.absoluteGaloisGroupAbelianization K ≃ₜ* + TopologicalAbelianization Gal(SeparableClosure K/K) := + absoluteGaloisGroupAbelianizationEquivSeparable K + exact e₁.trans (e₂.trans (e₃.symm.trans e₄.symm)) + +end GlobalClassFieldTheory.Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianGlobalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianGlobalArtin.lean new file mode 100644 index 0000000000..d4271ee16d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianGlobalArtin.lean @@ -0,0 +1,76 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.AbsoluteAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinSurjectivity +/-! +# Global Artin map for the maximal abelian extension + +This module specializes the continuous infinite global Artin map to the +maximal abelian subextension of the separable closure. It also exposes the +idele-representative evaluation and its finite Galois projections. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +variable (K : Type) [Field K] [NumberField K] + +open scoped Classical in +/-- The continuous global Artin homomorphism from the idele class group to +the Galois group of the maximal abelian extension. -/ +noncomputable def maximalAbelianGlobalArtin : + IdeleClassGroup K →ₜ* Gal(maximalAbelianExtension K/K) := + infiniteGlobalIdeleClassArtinContinuousMonoidHom + (K := K) (Ω := maximalAbelianExtension K) + +open scoped Classical in +/-- Evaluation of the maximal abelian global Artin map on an idele +representative recovers the infinite global Artin map. -/ +theorem maximalAbelianGlobalArtin_mk (a : IdeleGroup K) : + maximalAbelianGlobalArtin K + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) a) = + infiniteGlobalArtinMonoidHom K (maximalAbelianExtension K) a := + infiniteGlobalIdeleClassArtinMonoidHom_mk + (K := K) (Ω := maximalAbelianExtension K) a + +open scoped Classical in +/-- Projection of the maximal abelian global Artin map at an idele +representative to a finite Galois intermediate field agrees with the finite +global Artin map. -/ +theorem maximalAbelianGlobalArtin_finiteProjection + (a : IdeleGroup K) + (E : FiniteGaloisIntermediateField K (maximalAbelianExtension K)) : + letI : NumberField E := NumberField.of_module_finite K E + AlgEquiv.restrictNormalHom E + (maximalAbelianGlobalArtin K + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) a)) = + globalArtinMonoidHom (K := K) (L := E) a := by + let : NumberField E := NumberField.of_module_finite K E + rw [maximalAbelianGlobalArtin_mk] + exact + restrictNormalHom_infiniteGlobalArtinMonoidHom + K (maximalAbelianExtension K) a E + +open scoped Classical in +/-- The maximal abelian global Artin homomorphism is surjective. -/ +theorem maximalAbelianGlobalArtin_surjective : + Function.Surjective (maximalAbelianGlobalArtin K) := + infiniteGlobalIdeleClassArtinContinuousMonoidHom_surjective + K (maximalAbelianExtension K) + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianKernel.lean new file mode 100644 index 0000000000..988a23a0c3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianKernel.lean @@ -0,0 +1,244 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdentityComponent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldOriginalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianGlobalArtin +/-! +# The kernel of maximal abelian global reciprocity + +This module identifies the kernel of the maximal abelian global Artin map +with the identity component of the idele class group. It then descends the +map to the component quotient. + +The separation argument is intrinsic to the compact totally disconnected +component quotient. A separating open normal subgroup is pulled back to a +closed finite-index idele-class subgroup, whose selected finite class field +supplies the detecting finite Galois coordinate. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open GlobalClassFields + +variable (K : Type) [Field K] [NumberField K] + +open scoped Classical in +/-- A class outside the identity component is excluded by a closed +finite-index subgroup which contains the identity component. -/ +theorem exists_closedFiniteIndexSubgroup_not_mem_of_not_mem_identityComponent + (c : IdeleClassGroup K) + (hc : c ∉ ideleClassIdentityComponent K) : + ∃ H : Subgroup (IdeleClassGroup K), + IsClosed (H : Set (IdeleClassGroup K)) ∧ + H.FiniteIndex ∧ + ideleClassIdentityComponent K ≤ H ∧ c ∉ H := by + let C := ideleClassIdentityComponent K + let q : IdeleClassGroup K →* ideleClassComponentQuotient K := + QuotientGroup.mk' C + have hqc : q c ≠ 1 := by + intro h + exact hc ((QuotientGroup.eq_one_iff c).mp h) + let U : Set (ideleClassComponentQuotient K) := {q c}ᶜ + have hUopen : IsOpen U := isClosed_singleton.isOpen_compl + have hUone : (1 : ideleClassComponentQuotient K) ∈ U := by + simpa [U, eq_comm] using hqc + obtain ⟨V, hVU⟩ := + ProfiniteGrp.exist_openNormalSubgroup_sub_open_nhds_of_one + hUopen hUone + let H : Subgroup (IdeleClassGroup K) := + (V : Subgroup (ideleClassComponentQuotient K)).comap q + have hHopen : IsOpen (H : Set (IdeleClassGroup K)) := by + change IsOpen (q ⁻¹' (V : Set (ideleClassComponentQuotient K))) + exact V.isOpen.preimage QuotientGroup.continuous_mk + have hHclosed : IsClosed (H : Set (IdeleClassGroup K)) := + Subgroup.isClosed_of_isOpen H hHopen + have hVfinite : + (V : Subgroup (ideleClassComponentQuotient K)).FiniteIndex := + V.toOpenSubgroup.finiteIndex_of_finite_quotient + have hHfinite : H.FiniteIndex := by + rw [Subgroup.finiteIndex_iff] + rw [show H.index = + (V : Subgroup (ideleClassComponentQuotient K)).index by + simpa only [H] using + (V : Subgroup (ideleClassComponentQuotient K)).index_comap_of_surjective + (QuotientGroup.mk'_surjective C)] + exact hVfinite.index_ne_zero + have hCH : C ≤ H := by + intro x hx + change q x ∈ V + have hqx : q x = 1 := + (QuotientGroup.eq_one_iff x).2 hx + rw [hqx] + change (1 : ideleClassComponentQuotient K) ∈ V.toOpenSubgroup + exact V.toOpenSubgroup.one_mem + have hcH : c ∉ H := by + intro hcH + have hqcV : q c ∈ V := hcH + have : q c ∈ ({q c} : Set (ideleClassComponentQuotient K))ᶜ := + hVU hqcV + exact this (by simp) + exact ⟨H, hHclosed, hHfinite, hCH, hcH⟩ + +open scoped Classical in +/-- Replacing a finite abelian extension by its selected finite layer in the +maximal abelian extension preserves its idele-class norm range. -/ +theorem finiteAbelianExtensionInMaximalAbelianExtension_ideleClassNorm_range + (L : Type) [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] : + let E := finiteAbelianExtensionInMaximalAbelianExtension K L + letI : NumberField E := NumberField.of_module_finite K E + (_root_.ideleClassNorm K E).range = + (_root_.ideleClassNorm K L).range := by + let E := finiteAbelianExtensionInMaximalAbelianExtension K L + let e : L ≃ₐ[K] E := + finiteAbelianExtensionEquivInMaximalAbelianExtension K L + let hE : NumberField E := NumberField.of_module_finite K E + let : NumberField E := hE + have htransport := + ordinaryIdeleClassNorm_range_map_congrOfAlgEquiv + (K := K) (K' := K) (L := L) (L' := E) + (AlgEquiv.refl : K ≃ₐ[ℚ] K) + (e.restrictScalars ℚ) + (fun x => e.commutes x) + calc + (_root_.ideleClassNorm K E).range = + (_root_.ideleClassNorm K L).range.map + (ideleClassCongr + (AlgEquiv.refl : K ≃ₐ[ℚ] K)).toMonoidHom := + htransport.symm + _ = (_root_.ideleClassNorm K L).range := by + ext c + constructor + · rintro ⟨d, hd, rfl⟩ + simpa using hd + · intro hc + exact ⟨c, hc, by simp⟩ + +open scoped Classical in +/-- The kernel of the maximal abelian global Artin map is exactly the +identity component of the idele class group. -/ +theorem maximalAbelianGlobalArtin_ker : + (maximalAbelianGlobalArtin K).ker = + ideleClassIdentityComponent K := by + apply le_antisymm + · intro c hc + change (maximalAbelianGlobalArtin K).toMonoidHom c = 1 at hc + by_contra hcIdentity + obtain ⟨H, hHclosed, hHfinite, _, hcH⟩ := + exists_closedFiniteIndexSubgroup_not_mem_of_not_mem_identityComponent + K c hcIdentity + let : H.FiniteIndex := hHfinite + let L := closedFiniteIndexClassField (K := K) H hHclosed + let : NumberField L := NumberField.of_module_finite K L + let E := finiteAbelianExtensionInMaximalAbelianExtension K L + let : NumberField E := NumberField.of_module_finite K E + have hNormE : (_root_.ideleClassNorm K E).range = H := by + calc + (_root_.ideleClassNorm K E).range = + (_root_.ideleClassNorm K L).range := + finiteAbelianExtensionInMaximalAbelianExtension_ideleClassNorm_range + K L + _ = H := + closedFiniteIndexClassField_ideleClassNorm_range + (K := K) H hHclosed + obtain ⟨a, rfl⟩ := + QuotientGroup.mk'_surjective + (IdeleGroup.principalSubgroup K) c + have hFiniteArtin : + globalIdeleClassArtinMonoidHom + (K := K) (L := E) + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a) = 1 := by + rw [globalIdeleClassArtinMonoidHom_mk, + ← maximalAbelianGlobalArtin_finiteProjection K a E] + change + (AlgEquiv.restrictNormalHom + (F := K) (K₁ := maximalAbelianExtension K) E) + ((maximalAbelianGlobalArtin K).toMonoidHom + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a)) = 1 + calc + _ = (AlgEquiv.restrictNormalHom + (F := K) (K₁ := maximalAbelianExtension K) E) 1 := + congrArg + (AlgEquiv.restrictNormalHom + (F := K) (K₁ := maximalAbelianExtension K) E) hc + _ = 1 := map_one _ + have hNormMem : + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a ∈ + (_root_.ideleClassNorm K E).range := + (globalIdeleClassArtinMonoidHom_eq_one_iff + (K := K) (L := E) _).mp hFiniteArtin + rw [hNormE] at hNormMem + exact hcH hNormMem + · exact + ideleClassIdentityComponent_le_ker K + (maximalAbelianGlobalArtin K) + +open scoped Classical in +/-- Maximal abelian reciprocity identifies the component quotient of the +idele class group with the maximal abelian Galois group. -/ +noncomputable def ideleClassComponentQuotientEquivMaximalAbelianGalois : + ideleClassComponentQuotient K ≃ₜ* + Gal(maximalAbelianExtension K/K) := by + let e : ideleClassComponentQuotient K ≃* + Gal(maximalAbelianExtension K/K) := + QuotientGroup.liftEquiv + (ideleClassIdentityComponent K) + (maximalAbelianGlobalArtin_surjective K) + (maximalAbelianGlobalArtin_ker K).symm + have heContinuous : Continuous e := by + apply + (QuotientGroup.isQuotientMap_mk + (ideleClassIdentityComponent K)).continuous_iff.mpr + refine + (maximalAbelianGlobalArtin K).continuous_toFun.congr + (fun c => ?_) + exact + (QuotientGroup.liftEquiv_coe + (ideleClassIdentityComponent K) + (maximalAbelianGlobalArtin_surjective K) + (maximalAbelianGlobalArtin_ker K).symm c).symm + let h := heContinuous.homeoOfEquivCompactToT2 + exact + { toMulEquiv := e + continuous_toFun := h.continuous + continuous_invFun := h.symm.continuous } + +open scoped Classical in +/-- Evaluation of component-quotient reciprocity on an idele class is the +maximal abelian global Artin map. -/ +theorem ideleClassComponentQuotientEquivMaximalAbelianGalois_mk + (c : IdeleClassGroup K) : + ideleClassComponentQuotientEquivMaximalAbelianGalois K + (QuotientGroup.mk' + (ideleClassIdentityComponent K) c) = + maximalAbelianGlobalArtin K c := by + change + QuotientGroup.liftEquiv + (ideleClassIdentityComponent K) + (maximalAbelianGlobalArtin_surjective K) + (maximalAbelianGlobalArtin_ker K).symm + (QuotientGroup.mk' + (ideleClassIdentityComponent K) c) = + maximalAbelianGlobalArtin K c + exact QuotientGroup.liftEquiv_coe _ _ _ _ + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/NormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/NormQuotient.lean new file mode 100644 index 0000000000..1802563971 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/NormQuotient.lean @@ -0,0 +1,66 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm +/-! +# Ideles in the ordinary idele-class norm quotient + +This file supplies the useful composite from ideles to the quotient +of `C_K` by the range of the ordinary norm `C_L → C_K`, used by the +global norm-residue-symbol constructions. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +variable + (K L : Type*) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + +local instance normQuotientIdeleClassGroupIsMulCommutative : + IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +/-- The composite from ideles to the canonical class norm quotient +`C_K / N_{L/K} C_L`. -/ +def globalNormClassFromIdele : + IdeleGroup K →* + IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range := + (QuotientGroup.mk' + (_root_.ideleClassNorm K L).range).comp + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K)) + +omit [FiniteDimensional K L] in +/-- The map from ideles to the class norm quotient factors through +`C_K`, so it kills every principal idele. -/ +@[simp] +theorem globalNormClassFromIdele_principalIdele + (x : Kˣ) : + globalNormClassFromIdele K L + (IdeleGroup.principalIdele K x) = 1 := by + rw [globalNormClassFromIdele, MonoidHom.comp_apply] + have hclass : + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (IdeleGroup.principalIdele K x) = 1 := + (QuotientGroup.eq_one_iff + (IdeleGroup.principalIdele K x)).2 ⟨x, rfl⟩ + rw [hclass, map_one] + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/OnePlaceNormKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/OnePlaceNormKernel.lean new file mode 100644 index 0000000000..593738be18 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/OnePlaceNormKernel.lean @@ -0,0 +1,324 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm +/-! +# The one-place norm kernel + +At the source level, the key calculation is that an idele supported at one +finite place is a global relative-idele norm exactly when its local component +is a norm from the corresponding local tensor algebra. The determinant-norm +comparison then identifies this image with the norm group of any chosen +completion above the place. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain +open IdeleGroup RelativeIdeleGroup + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- The image of the global norm on relative ideles. -/ +def ideleNormSubgroup : + Subgroup (IdeleGroup K) := + (RelativeIdeleGroup.norm K L).range + +/-- The raw idele norm quotient. Passing further to principal-idèle +classes gives the class quotient used in the global reciprocity theorem. -/ +abbrev IdeleNormQuotient := + IdeleGroup K ⧸ ideleNormSubgroup (K := K) (L := L) + +/-- The projection to the raw global norm quotient. -/ +def ideleNormClass : + IdeleGroup K →* IdeleNormQuotient (K := K) (L := L) := + QuotientGroup.mk' (ideleNormSubgroup (K := K) (L := L)) + +omit [NumberField L] [IsGalois K L] in +/-- A relative idele supported at an archimedean place has norm equal +to the one-place idele of its local determinant norm. -/ +theorem norm_relativeInfinitePlaceIdele + (v : InfinitePlace K) + (z : (v.Completion ⊗[K] L)ˣ) : + RelativeIdeleGroup.norm K L + (relativeInfinitePlaceIdele + (K := K) (L := L) v z) = + infinitePlaceIdele v + (infiniteTensorDetNorm + (K := K) (L := L) v z) := by + apply Prod.ext + · apply ContinuousMulEquiv.piUnits.injective + funext w + change + IdeleGroup.infiniteComponent w + (RelativeIdeleGroup.norm K L + (relativeInfinitePlaceIdele + (K := K) (L := L) v z)) = + IdeleGroup.infiniteComponent w + (infinitePlaceIdele v + (infiniteTensorDetNorm + (K := K) (L := L) v z)) + by_cases hw : w = v + · subst w + rw [RelativeIdeleGroup.infiniteComponent_norm, + relativeInfinitePlaceIdele_infiniteComponent_same, + infinitePlaceIdele_infiniteComponent_same] + rfl + · rw [RelativeIdeleGroup.infiniteComponent_norm, + relativeInfinitePlaceIdele_infiniteComponent_of_ne + v w z hw, + map_one, + infinitePlaceIdele_infiniteComponent_of_ne + v w + (infiniteTensorDetNorm + (K := K) (L := L) v z) hw] + · apply RestrictedProduct.ext + intro w + change + IdeleGroup.finiteComponent w + (RelativeIdeleGroup.norm K L + (relativeInfinitePlaceIdele + (K := K) (L := L) v z)) = + IdeleGroup.finiteComponent w + (infinitePlaceIdele v + (infiniteTensorDetNorm + (K := K) (L := L) v z)) + rw [RelativeIdeleGroup.finiteComponent_norm, + relativeInfinitePlaceIdele_finiteComponent, + map_one, + infinitePlaceIdele_finiteComponent] + +omit [NumberField L] [IsGalois K L] in +/-- Exact archimedean one-place intersection before quotienting by +principal ideles: + +`N(I_L) ∩ K_vˣ = N((K_v ⊗_K L)ˣ)`. +-/ +theorem infinitePlaceIdele_mem_ideleNormSubgroup_iff + (v : InfinitePlace K) + (x : v.Completionˣ) : + infinitePlaceIdele v x ∈ + ideleNormSubgroup (K := K) (L := L) ↔ + x ∈ infiniteTensorNormSubgroup + (K := K) (L := L) v := by + constructor + · rintro ⟨a, ha⟩ + refine + ⟨RelativeIdeleGroup.infiniteComponent + (K := K) (L := L) v a, ?_⟩ + have hcomponent := + congrArg (IdeleGroup.infiniteComponent v) ha + rw [RelativeIdeleGroup.infiniteComponent_norm, + infinitePlaceIdele_infiniteComponent_same] at hcomponent + exact hcomponent + · rintro ⟨z, rfl⟩ + exact + ⟨relativeInfinitePlaceIdele + (K := K) (L := L) v z, + norm_relativeInfinitePlaceIdele + (K := K) (L := L) v z⟩ + +omit [NumberField L] [IsGalois K L] in +/-- Kernel-exact form of the archimedean one-place norm statement. -/ +theorem ideleNormClass_comp_infinitePlaceIdele_ker + (v : InfinitePlace K) : + ((ideleNormClass (K := K) (L := L)).comp + (infinitePlaceIdele v)).ker = + infiniteTensorNormSubgroup + (K := K) (L := L) v := by + ext x + change + QuotientGroup.mk' + (ideleNormSubgroup (K := K) (L := L)) + (infinitePlaceIdele v x) = 1 ↔ + x ∈ infiniteTensorNormSubgroup + (K := K) (L := L) v + exact + (QuotientGroup.eq_one_iff + (infinitePlaceIdele v x)).trans + (infinitePlaceIdele_mem_ideleNormSubgroup_iff + (K := K) (L := L) v x) + +omit [NumberField L] [IsGalois K L] in +/-- A relative idele supported at `v` has norm equal to the one-place +idele of its local determinant norm. -/ +theorem norm_relativeFinitePlaceIdele + (v : HeightOneSpectrum (𝓞 K)) + (z : (v.adicCompletion K ⊗[K] L)ˣ) : + RelativeIdeleGroup.norm K L + (relativeFinitePlaceIdele (K := K) (L := L) v z) = + finitePlaceIdele v + (localTensorNorm (K := K) (L := L) v z) := by + apply Prod.ext + · apply ContinuousMulEquiv.piUnits.injective + funext w + change + IdeleGroup.infiniteComponent w + (RelativeIdeleGroup.norm K L + (relativeFinitePlaceIdele + (K := K) (L := L) v z)) = + IdeleGroup.infiniteComponent w + (finitePlaceIdele v + (localTensorNorm (K := K) (L := L) v z)) + rw [RelativeIdeleGroup.infiniteComponent_norm, + relativeFinitePlaceIdele_infiniteComponent, + map_one, finitePlaceIdele_infiniteComponent] + · apply RestrictedProduct.ext + intro w + change + IdeleGroup.finiteComponent w + (RelativeIdeleGroup.norm K L + (relativeFinitePlaceIdele + (K := K) (L := L) v z)) = + IdeleGroup.finiteComponent w + (finitePlaceIdele v + (localTensorNorm (K := K) (L := L) v z)) + by_cases hw : w = v + · subst w + rw [RelativeIdeleGroup.finiteComponent_norm, + relativeFinitePlaceIdele_finiteComponent_same, + finitePlaceIdele_finiteComponent_same] + · rw [RelativeIdeleGroup.finiteComponent_norm, + relativeFinitePlaceIdele_finiteComponent_of_ne v w z hw, + map_one, + finitePlaceIdele_finiteComponent_of_ne v w + (localTensorNorm (K := K) (L := L) v z) hw] + +omit [NumberField L] [IsGalois K L] in +/-- Exact one-place intersection before quotienting by principal ideles: + +`N(I_L) ∩ K_vˣ = N((K_v ⊗_K L)ˣ)`. +-/ +theorem finitePlaceIdele_mem_ideleNormSubgroup_iff + (v : HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) : + finitePlaceIdele v x ∈ + ideleNormSubgroup (K := K) (L := L) ↔ + x ∈ (localTensorNorm (K := K) (L := L) v).range := by + constructor + · rintro ⟨a, ha⟩ + refine + ⟨RelativeIdeleGroup.finiteComponent + (K := K) (L := L) v a, ?_⟩ + have hcomponent := + congrArg (IdeleGroup.finiteComponent v) ha + rw [RelativeIdeleGroup.finiteComponent_norm, + finitePlaceIdele_finiteComponent_same] at hcomponent + exact hcomponent + · rintro ⟨z, rfl⟩ + exact + ⟨relativeFinitePlaceIdele + (K := K) (L := L) v z, + norm_relativeFinitePlaceIdele + (K := K) (L := L) v z⟩ + +omit [NumberField L] in +/-- The finite-place tensor form with the actual chosen completion +norm group. -/ +theorem finitePlaceIdele_mem_ideleNormSubgroup_iff_chosenLocalNorm + (v : HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) : + finitePlaceIdele v x ∈ + ideleNormSubgroup (K := K) (L := L) ↔ + x ∈ chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := by + rw [finitePlaceIdele_mem_ideleNormSubgroup_iff + (K := K) (L := L)] + exact SetLike.ext_iff.mp + (finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup + (K := K) (L := L) v) x + +/-- A chosen local norm at one finite place gives an actual global +idele-class norm. The witness is the relative idele supported at that +place, transported to an ordinary idele of the extension field. -/ +theorem finitePlaceIdeleClass_mem_ideleClassNorm_range_of_mem_chosenLocalNorm + (v : HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) + (hx : + x ∈ chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v) : + IdeleGroup.finitePlaceIdeleClass v x ∈ + (_root_.ideleClassNorm K L).range := by + have hnorm : + IdeleGroup.finitePlaceIdele v x ∈ + ideleNormSubgroup (K := K) (L := L) := + (finitePlaceIdele_mem_ideleNormSubgroup_iff_chosenLocalNorm + (K := K) (L := L) v x).2 hx + obtain ⟨z, hz⟩ := hnorm + refine + ⟨QuotientGroup.mk' + (IdeleGroup.principalSubgroup L) + (_root_.relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) z), ?_⟩ + change + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (IdeleGroup.norm K L + (_root_.relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) z)) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePlaceIdele v x) + rw [IdeleGroup.norm_relativeIdeleBaseChangeMulEquiv, hz] + +omit [NumberField L] in +/-- Kernel-exact form of the one-place norm statement. -/ +theorem ideleNormClass_comp_finitePlaceIdele_ker + (v : HeightOneSpectrum (𝓞 K)) : + ((ideleNormClass (K := K) (L := L)).comp + (finitePlaceIdele v)).ker = + chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := by + ext x + change + ideleNormClass (K := K) (L := L) + (finitePlaceIdele v x) = 1 ↔ + x ∈ chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v + change + QuotientGroup.mk' + (ideleNormSubgroup (K := K) (L := L)) + (finitePlaceIdele v x) = 1 ↔ + x ∈ chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v + constructor + · intro hx + have hmem : + finitePlaceIdele v x ∈ + ideleNormSubgroup (K := K) (L := L) := + (QuotientGroup.eq_one_iff + (N := ideleNormSubgroup (K := K) (L := L)) + (x := finitePlaceIdele v x)).mp hx + exact + (finitePlaceIdele_mem_ideleNormSubgroup_iff_chosenLocalNorm + (K := K) (L := L) v x).mp hmem + · intro hx + apply + (QuotientGroup.eq_one_iff + (N := ideleNormSubgroup (K := K) (L := L)) + (x := finitePlaceIdele v x)).mpr + exact + (finitePlaceIdele_mem_ideleNormSubgroup_iff_chosenLocalNorm + (K := K) (L := L) v x).mpr hx + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean new file mode 100644 index 0000000000..3c3b8b22bb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean @@ -0,0 +1,2486 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceCharacterComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.Ideal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +public import Mathlib.NumberTheory.Padics.HeightOneSpectrum +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.QuadraticReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.PowerResidueTameFormula +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionInvariants +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SimpleExtensionLocalBehavior +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FiniteRadicalSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.PrincipalUnits +/-! +# Bad-place support and correction for power-residue reciprocity + +For two global units `a` and `b`, the local Kummer factor can be nontrivial +only where `a`, `b`, or the exponent fails to be a valuation-ring unit. This +file records that concrete finite set, proves triviality outside it from the +unramified simple-Kummer criterion and the local norm kernel, and constructs +the exponent-place and infinite-place correction in the common field-valued +group of roots of unity. +-/ + +@[expose] public section + +open scoped BigOperators NumberField NumberTheorySymbols ValuativeRel WithZero +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory +open AlgebraicNumberTheory.PowerResidueSymbols +open LocalClassFieldTheory.Kummer +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +variable (K : Type) [Field K] [NumberField K] + +open scoped Classical in +/-- Equality for the valuation used to define a valuative relation transports +to equality in the relation's canonical value group. -/ +private theorem canonicalValuation_eq_of_valuation_eq + {R Γ : Type*} [Ring R] [LinearOrderedCommGroupWithZero Γ] + (v : Valuation R Γ) (x y : R) (hxy : v x = v y) : + letI : ValuativeRel R := ValuativeRel.ofValuation v + ValuativeRel.valuation R x = ValuativeRel.valuation R y := by + let : ValuativeRel R := ValuativeRel.ofValuation v + change + ValuativeRel.ValueGroupWithZero.mk x 1 = + ValuativeRel.ValueGroupWithZero.mk y 1 + rw [ValuativeRel.ValueGroupWithZero.mk_eq_mk] + constructor + · change v (x * (1 : R)) ≤ v (y * (1 : R)) + simpa only [mul_one] using hxy.le + · change v (y * (1 : R)) ≤ v (x * (1 : R)) + simpa only [mul_one] using hxy.ge + +open scoped Classical in +/-- The bounded-natural-number form of nonarchimedeanness for a finite-place +absolute value. Naming this bridge keeps all completion residue constructions +on one proof-irrelevant provider. -/ +private theorem finitePlaceAdicAbv_nonarchimedeanAbsoluteValue + (v : HeightOneSpectrum (𝓞 K)) : + LubinTate.Valuations.NonarchimedeanAbsoluteValue + (HeightOneSpectrum.adicAbv K v) := + (AbsoluteValue.isNonarchimedean_iff_bounded_nat + (HeightOneSpectrum.adicAbv K v)).1 + (HeightOneSpectrum.isNonarchimedean_adicAbv K v) + +open scoped Classical in +/-- Finite-field power-residue symbols commute with a field equivalence. +The statement is made on underlying units so it can be reused with every +roots-of-unity transport occurring below. -/ +theorem finiteFieldPowerResidueSymbol_unitsMap_ringEquiv + {k l : Type*} [Field k] [Field l] [Fintype k] [Fintype l] + (e : k ≃+* l) (n : ℕ+) + (hnk : (n : ℕ) ∣ Fintype.card k - 1) + (hnl : (n : ℕ) ∣ Fintype.card l - 1) + (u : kˣ) : + Units.map e.toMonoidHom + ((AlgebraicNumberTheory.PowerResidueSymbols.finiteFieldPowerResidueSymbol + k n hnk u : + rootsOfUnity (n : ℕ) k) : kˣ) = + ((AlgebraicNumberTheory.PowerResidueSymbols.finiteFieldPowerResidueSymbol + l n hnl + (Units.map e.toMonoidHom u) : + rootsOfUnity (n : ℕ) l) : lˣ) := by + rw [ + AlgebraicNumberTheory.PowerResidueSymbols.finiteFieldPowerResidueSymbol_apply, + AlgebraicNumberTheory.PowerResidueSymbols.finiteFieldPowerResidueSymbol_apply, + map_pow] + rw [Fintype.card_congr e.toEquiv] + +open scoped Classical in +/-- The residue field of a finite-place completion is canonically the +prime-ideal residue field. The construction passes through the localization +at the prime and then through the residue equivalence induced by completion. -/ +noncomputable def finitePlacePrimeResidueEquivLocalResidue + (v : HeightOneSpectrum (𝓞 K)) : + let C := (HeightOneSpectrum.adicAbv K v).Completion + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + (𝓞 K ⧸ v.asIdeal) ≃+* 𝓀[C] := by + let a := HeightOneSpectrum.adicAbv K v + have ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a := by + exact finitePlaceAdicAbv_nonarchimedeanAbsoluteValue K v + let C := a.Completion + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + let V := LubinTate.Valuations.exponentialValuationSubring + (AlgebraicNumberTheory.Valuations.absoluteValueExponentialValuation a ha) + let aC := AbsoluteValue.completionAbsoluteValue a + let haC : LubinTate.Valuations.NonarchimedeanAbsoluteValue aC := + (AbsoluteValue.isNonarchimedean_iff_bounded_nat aC).1 + (AbsoluteValue.completionAbsoluteValue_isNonarchimedean a + ((AbsoluteValue.isNonarchimedean_iff_bounded_nat a).2 ha)) + let VC := LubinTate.Valuations.exponentialValuationSubring + (AlgebraicNumberTheory.Valuations.absoluteValueExponentialValuation aC haC) + let Rv := v.valuationSubringAtPrime K + letI : IsLocalRing Rv := + IsLocalization.AtPrime.isLocalRing Rv v.asIdeal + have hBase : Rv.toSubring = V := by + ext x + rw [AlgebraicNumberTheory.Valuations.mem_absoluteValueExponentialSubring_iff] + change x ∈ v.valuationSubringAtPrime K ↔ _ + rw [v.valuationSubringAtPrime_eq_valuationSubring] + change v.valuation K x ≤ 1 ↔ a x ≤ 1 + rw [HeightOneSpectrum.adicAbv_def] + exact_mod_cast + (WithZeroMulInt.toNNReal_le_one_iff + (HeightOneSpectrum.one_lt_absNorm_nnreal v)).symm + let eBase : Rv ≃+* V := RingEquiv.subringCongr hBase + have hCompletion : VC = 𝒪[C] := by + ext x + rw [AlgebraicNumberTheory.Valuations.mem_absoluteValueExponentialSubring_iff] + change ‖x‖ ≤ 1 ↔ x ∈ 𝒪[C] + exact + (finitePlaceCompletion_mem_integers_iff_norm_le_one + a (HeightOneSpectrum.isNonarchimedean_adicAbv K v) x).symm + let eCompletionRing : VC ≃+* 𝒪[C] := + RingEquiv.subringCongr hCompletion + let eIdeal : (𝓞 K ⧸ v.asIdeal) ≃+* v.asIdeal.ResidueField := + RingEquiv.ofBijective + (algebraMap (𝓞 K ⧸ v.asIdeal) v.asIdeal.ResidueField) + v.asIdeal.bijective_algebraMap_quotient_residueField + let eLocalization : Localization.AtPrime v.asIdeal ≃ₐ[𝓞 K] Rv := + IsLocalization.algEquiv v.asIdeal.primeCompl _ _ + exact + eIdeal |>.trans + (IsLocalRing.ResidueField.mapEquiv eLocalization.toRingEquiv) |>.trans + (IsLocalRing.ResidueField.mapEquiv eBase) |>.trans + (AlgebraicNumberTheory.Valuations.completionResidueEquiv a ha) |>.trans + (IsLocalRing.ResidueField.mapEquiv eCompletionRing) + +open scoped Classical in +/-- The image of an algebraic integer in the valuation ring of a finite-place +completion. -/ +noncomputable def finitePlaceIntegralCompletionElement + (v : HeightOneSpectrum (𝓞 K)) (x : 𝓞 K) : + let C := (HeightOneSpectrum.adicAbv K v).Completion + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + 𝒪[C] := by + let C := (HeightOneSpectrum.adicAbv K v).Completion + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + exact ⟨algebraMap K C (x : K), by + rw [finitePlaceCompletion_mem_integers_iff_norm_le_one + (HeightOneSpectrum.adicAbv K v) + (HeightOneSpectrum.isNonarchimedean_adicAbv K v)] + calc + ‖algebraMap K C (x : K)‖ = + HeightOneSpectrum.adicAbv K v (x : K) := + AbsoluteValue.completionAbsoluteValue_coe + (HeightOneSpectrum.adicAbv K v) (x : K) + _ ≤ 1 := + v.adicAbv_coe_le_one + (HeightOneSpectrum.one_lt_absNorm_nnreal v) x⟩ + +open scoped Classical in +/-- The finite-place integral element has the expected underlying completion +value. -/ +theorem finitePlaceIntegralCompletionElement_coe + (v : HeightOneSpectrum (𝓞 K)) (x : 𝓞 K) : + let C := (HeightOneSpectrum.adicAbv K v).Completion + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + (finitePlaceIntegralCompletionElement K v x : C) = + algebraMap K C (x : K) := + rfl + +open scoped Classical in +/-- The finite-place residue equivalence sends the class of an algebraic +integer to the residue of its canonical image in the completion. -/ +@[simp] +theorem finitePlacePrimeResidueEquivLocalResidue_mk + (v : HeightOneSpectrum (𝓞 K)) (x : 𝓞 K) : + let C := (HeightOneSpectrum.adicAbv K v).Completion + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + finitePlacePrimeResidueEquivLocalResidue K v + (Ideal.Quotient.mk v.asIdeal x) = + IsLocalRing.residue 𝒪[C] + (finitePlaceIntegralCompletionElement K v x) := by + simp only [finitePlacePrimeResidueEquivLocalResidue, + finitePlaceIntegralCompletionElement, RingEquiv.trans_apply] + rw [RingEquiv.ofBijective_apply, + Ideal.algebraMap_quotient_residueField_mk] + rw [IsScalarTower.algebraMap_apply + (NumberField.RingOfIntegers K) (Localization.AtPrime v.asIdeal)] + rw [IsLocalRing.ResidueField.algebraMap_eq] + simp only [IsLocalRing.ResidueField.mapEquiv_apply, + IsLocalRing.ResidueField.map_residue] + rw [AlgebraicNumberTheory.Valuations.completionResidueEquiv_residue] + simp only [IsLocalRing.ResidueField.map_residue] + congr 1 + apply Subtype.ext + change + algebraMap K (HeightOneSpectrum.adicAbv K v).Completion + (((IsLocalization.algEquiv v.asIdeal.primeCompl + (Localization.AtPrime v.asIdeal) + (v.valuationSubringAtPrime K)) + (algebraMap (𝓞 K) (Localization.AtPrime v.asIdeal) x) : + v.valuationSubringAtPrime K) : K) = + algebraMap K (HeightOneSpectrum.adicAbv K v).Completion (x : K) + rw [AlgEquiv.commutes] + rw [IsScalarTower.algebraMap_apply + (NumberField.RingOfIntegers K) (v.valuationSubringAtPrime K)] + rfl + +open scoped Classical in +/-- A nonzero algebraic integer, regarded as a global field unit. -/ +def nonzeroIntegralFieldUnit (x : 𝓞 K) (hx : x ≠ 0) : Kˣ := + Units.mk0 (x : K) (by + intro hxK + apply hx + apply Subtype.ext + exact hxK) + +omit [NumberField K] in +open scoped Classical in +@[simp] +theorem nonzeroIntegralFieldUnit_coe (x : 𝓞 K) (hx : x ≠ 0) : + ((nonzeroIntegralFieldUnit K x hx : Kˣ) : K) = (x : K) := + rfl + +open scoped Classical in +/-- An algebraic integer avoiding a prime ideal, regarded as a nonzero +element of the global field. -/ +noncomputable def primeAvoidingIntegralFieldUnit + (v : HeightOneSpectrum (𝓞 K)) + (x : 𝓞 K) (hx : x ∉ v.asIdeal) : Kˣ := + nonzeroIntegralFieldUnit K x (by + intro hx0 + apply hx + rw [hx0] + exact Ideal.zero_mem _) + +omit [NumberField K] in +open scoped Classical in +@[simp] +theorem primeAvoidingIntegralFieldUnit_coe + (v : HeightOneSpectrum (𝓞 K)) + (x : 𝓞 K) (hx : x ∉ v.asIdeal) : + ((primeAvoidingIntegralFieldUnit K v x hx : Kˣ) : K) = (x : K) := + rfl + +open scoped Classical in +/-- An algebraic integer nonzero modulo `v`, regarded as a unit of the +valuation ring of the finite-place completion. -/ +noncomputable def finitePlaceIntegralCompletionUnit + (v : HeightOneSpectrum (𝓞 K)) + (x : 𝓞 K) (hx : x ∉ v.asIdeal) : + let C := (HeightOneSpectrum.adicAbv K v).Completion + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + 𝒪[C]ˣ := by + let a := HeightOneSpectrum.adicAbv K v + let C := a.Completion + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + let y : C := algebraMap K C (x : K) + have hyNorm : ‖y‖ = 1 := by + calc + ‖y‖ = a (x : K) := + AbsoluteValue.completionAbsoluteValue_coe a (x : K) + _ = ‖NumberField.FinitePlace.embedding v (x : K)‖ := + (NumberField.FinitePlace.norm_embedding v (x : K)).symm + _ = 1 := + (NumberField.FinitePlace.norm_eq_one_iff_notMem K v x).2 hx + have hyNe : y ≠ 0 := by + intro hy + rw [hy, norm_zero] at hyNorm + exact zero_ne_one hyNorm + let yIntegral : 𝒪[C] := ⟨y, by + rw [finitePlaceCompletion_mem_integers_iff_norm_le_one + a (HeightOneSpectrum.isNonarchimedean_adicAbv K v)] + exact hyNorm.le⟩ + let yInvIntegral : 𝒪[C] := ⟨y⁻¹, by + rw [finitePlaceCompletion_mem_integers_iff_norm_le_one + a (HeightOneSpectrum.isNonarchimedean_adicAbv K v), + norm_inv, hyNorm, inv_one]⟩ + exact { + val := yIntegral + inv := yInvIntegral + val_inv := by + apply Subtype.ext + exact mul_inv_cancel₀ hyNe + inv_val := by + apply Subtype.ext + exact inv_mul_cancel₀ hyNe } + +open scoped Classical in +/-- Forgetting the integral-unit structure recovers the ordinary image of +the algebraic integer in the finite-place completion. -/ +theorem finitePlaceIntegralCompletionUnit_coe + (v : HeightOneSpectrum (𝓞 K)) + (x : 𝓞 K) (hx : x ∉ v.asIdeal) : + let C := (HeightOneSpectrum.adicAbv K v).Completion + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + (((finitePlaceIntegralCompletionUnit K v x hx : 𝒪[C]ˣ) : 𝒪[C]) : C) = + algebraMap K C (x : K) := by + rfl + +open scoped Classical in +/-- The completion image of a prime-avoiding algebraic integer is the field +unit underlying its canonical valuation-ring unit. -/ +theorem finitePlaceHilbert_completionUnit_primeAvoidingIntegralFieldUnit + (v : HeightOneSpectrum (𝓞 K)) + (x : 𝓞 K) (hx : x ∉ v.asIdeal) : + let C := (HeightOneSpectrum.adicAbv K v).Completion + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + finitePlaceHilbertCompletionUnit K v + (primeAvoidingIntegralFieldUnit K v x hx) = + integerUnitsToFieldUnits C + (finitePlaceIntegralCompletionUnit K v x hx) := by + let C := (HeightOneSpectrum.adicAbv K v).Completion + let : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + let : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + dsimp only + apply Units.ext + change + algebraMap K C (x : K) = + (((finitePlaceIntegralCompletionUnit K v x hx : 𝒪[C]ˣ) : + 𝒪[C]) : C) + exact (finitePlaceIntegralCompletionUnit_coe K v x hx).symm + +open scoped Classical in +/-- As an element of the completion valuation ring, the lifted unit is the +canonical lifted algebraic integer. -/ +@[simp] +theorem finitePlaceIntegralCompletionUnit_val + (v : HeightOneSpectrum (𝓞 K)) + (x : 𝓞 K) (hx : x ∉ v.asIdeal) : + let C := (HeightOneSpectrum.adicAbv K v).Completion + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + (finitePlaceIntegralCompletionUnit K v x hx : 𝒪[C]) = + finitePlaceIntegralCompletionElement K v x := by + dsimp only + apply Subtype.ext + exact finitePlaceIntegralCompletionUnit_coe K v x hx + +open scoped Classical in +/-- Reduction of the canonical completion unit agrees with reduction modulo +the corresponding global prime ideal. -/ +theorem finitePlace_integerUnitsToResidueUnits_integralUnit + (v : HeightOneSpectrum (𝓞 K)) + (x : 𝓞 K) (hx : x ∉ v.asIdeal) : + let C := (HeightOneSpectrum.adicAbv K v).Completion + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + integerUnitsToResidueUnits C + (finitePlaceIntegralCompletionUnit K v x hx) = + Units.map + (finitePlacePrimeResidueEquivLocalResidue K v).toMonoidHom + (AlgebraicNumberTheory.PowerResidueSymbols.primeIdealResidueUnit + K v x hx) := by + dsimp only + apply Units.ext + change + IsLocalRing.residue 𝒪[(HeightOneSpectrum.adicAbv K v).Completion] + (finitePlaceIntegralCompletionUnit K v x hx : + 𝒪[(HeightOneSpectrum.adicAbv K v).Completion]) = + finitePlacePrimeResidueEquivLocalResidue K v + (Ideal.Quotient.mk v.asIdeal x) + simpa only [finitePlaceIntegralCompletionUnit_val] using + (finitePlacePrimeResidueEquivLocalResidue_mk K v x).symm + +open scoped Classical in +/-- The canonical inclusion from integral roots of unity into the common +field-valued group used by the global Hilbert symbols. -/ +def integralRootsOfUnityToNthRoots + (n : ℕ) : + rootsOfUnity n (𝓞 K) →* nthRootsSubgroup K n where + toFun z := + ⟨Units.map (algebraMap (𝓞 K) K).toMonoidHom z.1, by + calc + Units.map (algebraMap (𝓞 K) K).toMonoidHom z.1 ^ n = + Units.map (algebraMap (𝓞 K) K).toMonoidHom (z.1 ^ n) := + (map_pow + (Units.map (algebraMap (𝓞 K) K).toMonoidHom) z.1 n).symm + _ = 1 := by rw [z.2, map_one]⟩ + map_one' := by + apply Subtype.ext + exact map_one (Units.map (algebraMap (𝓞 K) K).toMonoidHom) + map_mul' := by + intro z w + apply Subtype.ext + exact map_mul + (Units.map (algebraMap (𝓞 K) K).toMonoidHom) z.1 w.1 + +omit [NumberField K] in +open scoped Classical in +/-- The integral-root inclusion is the underlying unit map. -/ +@[simp] +theorem integralRootsOfUnityToNthRoots_apply + (n : ℕ) (z : rootsOfUnity n (𝓞 K)) : + (integralRootsOfUnityToNthRoots K n z).1 = + Units.map (algebraMap (𝓞 K) K).toMonoidHom z.1 := + rfl + +omit [NumberField K] in +open scoped Classical in +/-- The integral-to-field inclusion is injective on roots of unity. -/ +theorem integralRootsOfUnityToNthRoots_injective + (n : ℕ) : + Function.Injective (integralRootsOfUnityToNthRoots K n) := by + intro z w h + apply Subtype.ext + apply + (Units.map_injective + (f := (algebraMap (𝓞 K) K).toMonoidHom) + RingOfIntegers.coe_injective) + exact congrArg Subtype.val h + +open scoped Classical in +/-- Reduction after embedding an integral global root of unity into a +finite-place completion is the transport of reduction modulo the +corresponding prime ideal. -/ +theorem finitePlace_localNthRootsReduction_integralRoots + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ+) + (z : rootsOfUnity (n : ℕ) (𝓞 K)) : + let C := (HeightOneSpectrum.adicAbv K v).Completion + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + (localNthRootsReduction C n + (nthRootsSubgroupMap K C (n : ℕ) + (integralRootsOfUnityToNthRoots K (n : ℕ) z))).1 = + Units.map + (finitePlacePrimeResidueEquivLocalResidue K v).toMonoidHom + (AlgebraicNumberTheory.PowerResidueSymbols.rootsOfUnityReduction + K v (n : ℕ) z).1 := by + dsimp only + apply Units.ext + change + IsLocalRing.residue 𝒪[(HeightOneSpectrum.adicAbv K v).Completion] + (nthRootIntegerUnit + (HeightOneSpectrum.adicAbv K v).Completion n + (nthRootsSubgroupMap K + (HeightOneSpectrum.adicAbv K v).Completion (n : ℕ) + (integralRootsOfUnityToNthRoots K (n : ℕ) z)) : + 𝒪[(HeightOneSpectrum.adicAbv K v).Completion]) = + finitePlacePrimeResidueEquivLocalResidue K v + (Ideal.Quotient.mk v.asIdeal (z.1 : 𝓞 K)) + rw [finitePlacePrimeResidueEquivLocalResidue_mk] + congr 1 + +open scoped Classical in +/-- The integral principal ideal generated by the exponent. -/ +def powerResidueExponentIdeal (n : ℕ+) : Ideal (𝓞 K) := + Ideal.span {((n : ℕ) : 𝓞 K)} + +open scoped Classical in +/-- The exponent ideal is nonzero in a number field. -/ +theorem powerResidueExponentIdeal_ne_zero (n : ℕ+) : + powerResidueExponentIdeal K n ≠ 0 := by + change Ideal.span {((n : ℕ) : 𝓞 K)} ≠ ⊥ + exact Ideal.span_singleton_eq_bot.not.mpr + (Nat.cast_ne_zero.mpr n.ne_zero) + +omit [NumberField K] in +open scoped Classical in +private theorem ideal_span_singleton_ne_zero + {x : 𝓞 K} (hx : x ≠ 0) : Ideal.span {x} ≠ 0 := + Submodule.span_singleton_eq_bot.mp.mt hx + +open scoped Classical in +/-- The finite places dividing the exponent. These, together with all +infinite places, are precisely the correction places in the reciprocity +formula once the two principal denominator supports are removed. -/ +noncomputable def powerResidueExponentFinitePlaces + (n : ℕ+) : Finset (HeightOneSpectrum (𝓞 K)) := + (Ideal.finite_factors + (powerResidueExponentIdeal_ne_zero K n)).toFinset + +open scoped Classical in +/-- Membership in the exponent-place support is divisibility by the exponent +ideal. -/ +@[simp] +theorem mem_powerResidueExponentFinitePlaces_iff + (n : ℕ+) (v : HeightOneSpectrum (𝓞 K)) : + v ∈ powerResidueExponentFinitePlaces K n ↔ + v.asIdeal ∣ powerResidueExponentIdeal K n := + Set.Finite.mem_toFinset + (Ideal.finite_factors + (powerResidueExponentIdeal_ne_zero K n)) + +open scoped Classical in +/-- At a finite place not dividing the exponent, the exponent is a unit in +the canonical completion. -/ +theorem finitePlace_natCast_valuation_eq_one_of_not_mem_exponent + (n : ℕ+) (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ powerResidueExponentFinitePlaces K n) : + let C := (HeightOneSpectrum.adicAbv K v).Completion + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + ValuativeRel.valuation C ((n : ℕ) : C) = 1 := by + dsimp only + let : IsUltrametricDist + (HeightOneSpectrum.adicAbv K v).Completion := + finitePlaceArtinCompletionIsUltrametricDist + (HeightOneSpectrum.adicAbv K v) + (HeightOneSpectrum.isNonarchimedean_adicAbv K v) + have hvNotDvd : + ¬ v.asIdeal ∣ powerResidueExponentIdeal K n := by + simpa only [mem_powerResidueExponentFinitePlaces_iff] using hv + have hvNotMem : ((n : ℕ) : 𝓞 K) ∉ v.asIdeal := by + intro hvMem + apply hvNotDvd + rw [powerResidueExponentIdeal, Ideal.dvd_span_singleton] + exact hvMem + let C := (HeightOneSpectrum.adicAbv K v).Completion + have hNorm : ‖((n : ℕ) : C)‖ = 1 := by + calc + ‖((n : ℕ) : C)‖ = + ‖algebraMap K C (((n : ℕ) : K))‖ := by rw [map_natCast] + _ = HeightOneSpectrum.adicAbv K v (((n : ℕ) : K)) := + AbsoluteValue.completionAbsoluteValue_coe + (HeightOneSpectrum.adicAbv K v) (((n : ℕ) : K)) + _ = ‖NumberField.FinitePlace.embedding v (((n : ℕ) : K))‖ := + (NumberField.FinitePlace.norm_embedding v (((n : ℕ) : K))).symm + _ = 1 := + (NumberField.FinitePlace.norm_eq_one_iff_notMem K v + (((n : ℕ) : 𝓞 K))).2 hvNotMem + let vCNorm := NormedField.valuation (K := C) + let : vCNorm.Compatible := Valuation.Compatible.ofValuation vCNorm + have hnCNorm : vCNorm ((n : ℕ) : C) = 1 := by + change ‖((n : ℕ) : C)‖₊ = 1 + exact NNReal.eq (by simpa using hNorm) + exact + (ValuativeRel.isEquiv vCNorm (ValuativeRel.valuation C)) + |>.eq_one_iff_eq_one.mp hnCNorm + +open scoped Classical in +private noncomputable def finitePlaceLocalTamePowerResidueSymbolValue + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hv : v ∉ powerResidueExponentFinitePlaces K n) + (a : 𝓞 K) (ha : a ∉ v.asIdeal) : + nthRootsSubgroup (HeightOneSpectrum.adicAbv K v).Completion (n : ℕ) := by + let C := (HeightOneSpectrum.adicAbv K v).Completion + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + exact localTamePowerResidueSymbol C n + (finitePlace_natCast_valuation_eq_one_of_not_mem_exponent K n v hv) + (finitePlaceHilbert_primitiveRoots_nonempty K n hmu v) + (finitePlaceIntegralCompletionUnit K v a ha) + +open scoped Classical in +private noncomputable def finitePlaceLocalTamePowerResidueSymbolFieldValue + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hv : v ∉ powerResidueExponentFinitePlaces K n) + (a : 𝓞 K) (ha : a ∉ v.asIdeal) : + (HeightOneSpectrum.adicAbv K v).Completion := + let C := (HeightOneSpectrum.adicAbv K v).Completion + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + ((localTamePowerResidueSymbol C n + (finitePlace_natCast_valuation_eq_one_of_not_mem_exponent K n v hv) + (finitePlaceHilbert_primitiveRoots_nonempty K n hmu v) + (finitePlaceIntegralCompletionUnit K v a ha)).1 : C) + +open scoped Classical in +private noncomputable def finitePlacePrimeIdealPowerResidueIntegralRoot + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hcoprime : (Ideal.absNorm v.asIdeal).Coprime (n : ℕ)) + (a : 𝓞 K) (ha : a ∉ v.asIdeal) : + rootsOfUnity (n : ℕ) (𝓞 K) := + AlgebraicNumberTheory.PowerResidueSymbols.primeIdealPowerResidueSymbol + K v n hmu hcoprime a ha + +open scoped Classical in +private noncomputable def finitePlacePrimeIdealPowerResidueGlobalRoot + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hcoprime : (Ideal.absNorm v.asIdeal).Coprime (n : ℕ)) + (a : 𝓞 K) (ha : a ∉ v.asIdeal) : nthRootsSubgroup K (n : ℕ) := + integralRootsOfUnityToNthRoots K (n : ℕ) + (finitePlacePrimeIdealPowerResidueIntegralRoot K v n hmu hcoprime a ha) + +open scoped Classical in +private noncomputable def finitePlacePrimeIdealPowerResidueFactorValue + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hcoprime : (Ideal.absNorm v.asIdeal).Coprime (n : ℕ)) + (a : 𝓞 K) (ha : a ∉ v.asIdeal) : + nthRootsSubgroup (HeightOneSpectrum.adicAbv K v).Completion (n : ℕ) := + nthRootsSubgroupMap K (HeightOneSpectrum.adicAbv K v).Completion (n : ℕ) + (finitePlacePrimeIdealPowerResidueGlobalRoot K v n hmu hcoprime a ha) + +open scoped Classical in +private noncomputable def finitePlacePrimeIdealPowerResidueFactorFieldValue + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hcoprime : (Ideal.absNorm v.asIdeal).Coprime (n : ℕ)) + (a : 𝓞 K) (ha : a ∉ v.asIdeal) : + (HeightOneSpectrum.adicAbv K v).Completion := + (((nthRootsSubgroupMap K + (HeightOneSpectrum.adicAbv K v).Completion (n : ℕ)) + (finitePlacePrimeIdealPowerResidueGlobalRoot K v n hmu hcoprime a ha)).1 : + (HeightOneSpectrum.adicAbv K v).Completion) + +open scoped Classical in +private noncomputable def finitePlaceLocalTamePowerResidueSymbolResidueValue + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hv : v ∉ powerResidueExponentFinitePlaces K n) + (a : 𝓞 K) (ha : a ∉ v.asIdeal) : + let C := (HeightOneSpectrum.adicAbv K v).Completion + letI : ValuativeRel C := finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + 𝓀[C] := by + dsimp only + let C := (HeightOneSpectrum.adicAbv K v).Completion + letI : ValuativeRel C := finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + letI : Fintype 𝓀[C] := Fintype.ofFinite _ + have hnLocal : (n : ℕ) ∣ Fintype.card 𝓀[C] - 1 := by + rw [← Nat.card_eq_fintype_card] + exact dvd_residueCard_sub_one_of_primitiveRoots C n + (finitePlace_natCast_valuation_eq_one_of_not_mem_exponent K n v hv) + (finitePlaceHilbert_primitiveRoots_nonempty K n hmu v) + exact + (((AlgebraicNumberTheory.PowerResidueSymbols.finiteFieldPowerResidueSymbol + 𝓀[C] n hnLocal + (integerUnitsToResidueUnits C + (finitePlaceIntegralCompletionUnit K v a ha)) : + rootsOfUnity (n : ℕ) 𝓀[C]).1 : 𝓀[C]ˣ) : 𝓀[C]) + +open scoped Classical in +private noncomputable def finitePlacePrimeIdealPowerResidueFactorResidueValue + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hcoprime : (Ideal.absNorm v.asIdeal).Coprime (n : ℕ)) + (a : 𝓞 K) (ha : a ∉ v.asIdeal) : + let C := (HeightOneSpectrum.adicAbv K v).Completion + letI : ValuativeRel C := finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + 𝓀[C] := by + dsimp only + let C := (HeightOneSpectrum.adicAbv K v).Completion + letI : ValuativeRel C := finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + exact + (((localNthRootsReduction C n + (nthRootsSubgroupMap K C (n : ℕ) + (integralRootsOfUnityToNthRoots K (n : ℕ) + (AlgebraicNumberTheory.PowerResidueSymbols.primeIdealPowerResidueSymbol + K v n hmu hcoprime a ha)))).1 : 𝓀[C]ˣ) : 𝓀[C]) + +open scoped Classical in +open AlgebraicNumberTheory.PowerResidueSymbols renaming + rootsOfUnityReductionEquiv_primeIdealPowerResidueSymbol → + rootsOfUnityReductionEquiv_primeIdealPowerResidueSymbol in +/-- The tame symbol in a finite-place completion is the image of the +prime-ideal power-residue symbol. All comparisons are canonical: the only +place hypothesis says that the place does not divide the exponent. -/ +private theorem finitePlaceLocalTamePowerResidueSymbol_residueValue_eq + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hcoprime : (Ideal.absNorm v.asIdeal).Coprime (n : ℕ)) + (hv : v ∉ powerResidueExponentFinitePlaces K n) + (a : 𝓞 K) (ha : a ∉ v.asIdeal) : + finitePlaceLocalTamePowerResidueSymbolResidueValue K v n hmu hv a ha = + finitePlacePrimeIdealPowerResidueFactorResidueValue + K v n hmu hcoprime a ha := by + unfold finitePlaceLocalTamePowerResidueSymbolResidueValue + unfold finitePlacePrimeIdealPowerResidueFactorResidueValue + dsimp only + let C := (HeightOneSpectrum.adicAbv K v).Completion + let : ValuativeRel C := finitePlaceLocalArtinCompletionValuativeRel v + let : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + let : Field (𝓞 K ⧸ v.asIdeal) := Ideal.Quotient.field v.asIdeal + let : Fintype (𝓞 K ⧸ v.asIdeal) := Fintype.ofFinite _ + let : Fintype 𝓀[C] := Fintype.ofFinite _ + let hnC := finitePlace_natCast_valuation_eq_one_of_not_mem_exponent K n v hv + let hmuC := finitePlaceHilbert_primitiveRoots_nonempty K n hmu v + have hnPrime : + (n : ℕ) ∣ Fintype.card (𝓞 K ⧸ v.asIdeal) - 1 := by + rw [AlgebraicNumberTheory.PowerResidueSymbols.card_primeIdealResidueField K v] + exact + AlgebraicNumberTheory.PowerResidueSymbols.dvd_absNorm_sub_one_of_primitiveRoots + K v n hmu hcoprime + have hnLocal : (n : ℕ) ∣ Fintype.card 𝓀[C] - 1 := by + rw [← Nat.card_eq_fintype_card] + exact dvd_residueCard_sub_one_of_primitiveRoots C n hnC hmuC + rw [finitePlace_localNthRootsReduction_integralRoots] + rw [← AlgebraicNumberTheory.PowerResidueSymbols.rootsOfUnityReductionEquiv_apply + K v n hmu hcoprime, + rootsOfUnityReductionEquiv_primeIdealPowerResidueSymbol + K v n hmu hcoprime a ha] + rw [finitePlace_integerUnitsToResidueUnits_integralUnit] + exact congrArg (fun u : 𝓀[C]ˣ => (u : 𝓀[C])) + (finiteFieldPowerResidueSymbol_unitsMap_ringEquiv + (finitePlacePrimeResidueEquivLocalResidue K v) + n hnPrime hnLocal + (AlgebraicNumberTheory.PowerResidueSymbols.primeIdealResidueUnit + K v a ha)).symm + +open scoped Classical in +private theorem finitePlaceLocalTamePowerResidueSymbolFieldValue_eq_primeIdealValue + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hcoprime : (Ideal.absNorm v.asIdeal).Coprime (n : ℕ)) + (hv : v ∉ powerResidueExponentFinitePlaces K n) + (a : 𝓞 K) (ha : a ∉ v.asIdeal) : + @Eq (HeightOneSpectrum.adicAbv K v).Completion + (finitePlaceLocalTamePowerResidueSymbolFieldValue K v n hmu hv a ha) + (finitePlacePrimeIdealPowerResidueFactorFieldValue + K v n hmu hcoprime a ha) := by + let C := (HeightOneSpectrum.adicAbv K v).Completion + let : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + let : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + let hnC := + finitePlace_natCast_valuation_eq_one_of_not_mem_exponent K n v hv + let hmuC := finitePlaceHilbert_primitiveRoots_nonempty K n hmu v + unfold finitePlaceLocalTamePowerResidueSymbolFieldValue + unfold finitePlacePrimeIdealPowerResidueFactorFieldValue + unfold finitePlacePrimeIdealPowerResidueGlobalRoot + unfold finitePlacePrimeIdealPowerResidueIntegralRoot + have hRoots : + localTamePowerResidueSymbol C n hnC hmuC + (finitePlaceIntegralCompletionUnit K v a ha) = + nthRootsSubgroupMap K C (n : ℕ) + (integralRootsOfUnityToNthRoots K (n : ℕ) + (AlgebraicNumberTheory.PowerResidueSymbols.primeIdealPowerResidueSymbol + K v n hmu hcoprime a ha)) := by + apply (localNthRootsReductionEquiv C n hnC hmuC).injective + rw [localNthRootsReductionEquiv_localTamePowerResidueSymbol] + apply Subtype.ext + apply Units.ext + have hResidue := finitePlaceLocalTamePowerResidueSymbol_residueValue_eq + K v n hmu hcoprime hv a ha + unfold finitePlaceLocalTamePowerResidueSymbolResidueValue at hResidue + unfold finitePlacePrimeIdealPowerResidueFactorResidueValue at hResidue + dsimp only at hResidue + exact hResidue + exact congrArg (fun q : nthRootsSubgroup C (n : ℕ) => (q.1 : C)) hRoots + +open scoped Classical in +/-- The normalized additive valuation of a global field unit in the +canonical completion at a finite place. -/ +noncomputable def finitePlaceNormalizedValuation + (v : HeightOneSpectrum (𝓞 K)) (x : Kˣ) : ℤ := by + let C := (HeightOneSpectrum.adicAbv K v).Completion + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + exact valuationMap C + (Additive.ofMul (finitePlaceHilbertCompletionUnit K v x)) + +open scoped Classical in +/-- Away from the exponent, a finite-place Hilbert factor with integral-unit +first entry is the prime-ideal power-residue symbol raised to the negative +normalized valuation of the second entry. -/ +theorem finitePlaceHilbertSymbol_eq_primeIdealPowerResidueFactor_zpow + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ powerResidueExponentFinitePlaces K n) + (hcoprime : (Ideal.absNorm v.asIdeal).Coprime (n : ℕ)) + (a : 𝓞 K) (ha : a ∉ v.asIdeal) (b : Kˣ) : + finitePlaceHilbertSymbol K n hnK hmu v + (primeAvoidingIntegralFieldUnit K v a ha) b = + integralRootsOfUnityToNthRoots K (n : ℕ) + (AlgebraicNumberTheory.PowerResidueSymbols.primeIdealPowerResidueSymbol + K v n hmu hcoprime a ha) ^ + (-finitePlaceNormalizedValuation K v b) := by + let C := (HeightOneSpectrum.adicAbv K v).Completion + let : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + let : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + let hnC := + finitePlace_natCast_valuation_eq_one_of_not_mem_exponent K n v hv + let hmuC := finitePlaceHilbert_primitiveRoots_nonempty K n hmu v + let bC := finitePlaceHilbertCompletionUnit K v b + apply nthRootsSubgroupMap_injective K C (n : ℕ) + rw [finitePlaceHilbertSymbol_map_eq_localHilbertSymbol] + change + localHilbertSymbol C n + (finitePlaceHilbert_natCast_ne_zero K n hnK v) hmuC + (finitePlaceHilbertCompletionUnit K v + (primeAvoidingIntegralFieldUnit K v a ha)) bC = + nthRootsSubgroupMap K C (n : ℕ) + (integralRootsOfUnityToNthRoots K (n : ℕ) + (AlgebraicNumberTheory.PowerResidueSymbols.primeIdealPowerResidueSymbol + K v n hmu hcoprime a ha) ^ + (-finitePlaceNormalizedValuation K v b)) + rw [finitePlaceHilbert_completionUnit_primeAvoidingIntegralFieldUnit] + rw [localHilbertSymbol_tame_formula C n hnC hmuC] + change + finitePlaceLocalTamePowerResidueSymbolValue K v n hmu hv a ha ^ + (-finitePlaceNormalizedValuation K v b) = _ + have hBase : + finitePlaceLocalTamePowerResidueSymbolValue K v n hmu hv a ha = + finitePlacePrimeIdealPowerResidueFactorValue + K v n hmu hcoprime a ha := by + apply Subtype.ext + apply Units.ext + simpa only [finitePlaceLocalTamePowerResidueSymbolValue, + finitePlacePrimeIdealPowerResidueFactorValue, + finitePlaceLocalTamePowerResidueSymbolFieldValue, + finitePlacePrimeIdealPowerResidueFactorFieldValue] using + finitePlaceLocalTamePowerResidueSymbolFieldValue_eq_primeIdealValue + K v n hmu hcoprime hv a ha + rw [hBase] + unfold finitePlacePrimeIdealPowerResidueFactorValue + unfold finitePlacePrimeIdealPowerResidueGlobalRoot + unfold finitePlacePrimeIdealPowerResidueIntegralRoot + rw [map_zpow] + +open scoped Classical in +/-- Endpoint form of the finite-place local/global power-residue comparison. -/ +theorem finitePlaceHilbertSymbol_eq_primeIdealPowerResidueFactor + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ powerResidueExponentFinitePlaces K n) + (hcoprime : (Ideal.absNorm v.asIdeal).Coprime (n : ℕ)) + (a : 𝓞 K) (ha : a ∉ v.asIdeal) (b : Kˣ) : + finitePlaceHilbertSymbol K n hnK hmu v + (primeAvoidingIntegralFieldUnit K v a ha) b = + integralRootsOfUnityToNthRoots K (n : ℕ) + (AlgebraicNumberTheory.PowerResidueSymbols.primeIdealPowerResidueSymbol + K v n hmu hcoprime a ha) ^ + (-finitePlaceNormalizedValuation K v b) := + finitePlaceHilbertSymbol_eq_primeIdealPowerResidueFactor_zpow + K n hnK hmu v hv hcoprime a ha b + +open scoped Classical in +/-- The Dedekind prime multiplicity is the exponent occurring in the +integer-valued adic valuation. -/ +theorem intValuation_eq_exp_neg_idealPrimeMultiplicity + (v : HeightOneSpectrum (𝓞 K)) (x : 𝓞 K) (hx : x ≠ 0) : + v.intValuation x = + WithZero.exp + (-(AlgebraicNumberTheory.PowerResidueSymbols.idealPrimeMultiplicity K v (Ideal.span {x}) + : ℤ)) := by + rw [v.intValuation_if_neg hx] + rfl + +open scoped Classical in +/-- For an integral element, the normalized valuation in the canonical +finite-place completion is the negative multiplicity of the prime in its +principal ideal. -/ +theorem finitePlaceNormalizedValuation_nonzeroIntegralFieldUnit + (v : HeightOneSpectrum (𝓞 K)) + (x : 𝓞 K) (hx : x ≠ 0) : + finitePlaceNormalizedValuation K v + (nonzeroIntegralFieldUnit K x hx) = + -(AlgebraicNumberTheory.PowerResidueSymbols.idealPrimeMultiplicity K v (Ideal.span {x}) : + ℤ) := by + let C := (HeightOneSpectrum.adicAbv K v).Completion + let : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + let : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + let : IsUltrametricDist C := + finitePlaceArtinCompletionIsUltrametricDist + (HeightOneSpectrum.adicAbv K v) + (HeightOneSpectrum.isNonarchimedean_adicAbv K v) + let m := AlgebraicNumberTheory.PowerResidueSymbols.idealPrimeMultiplicity K v (Ideal.span {x}) + let πData := chosenFinitePlaceCompletionIntegralUniformizer v + have hπIrreducible : Irreducible πData.completionInteger := by + rw [IsDiscreteValuationRing.irreducible_iff_uniformizer] + let completionDVF : + ValuationTheory.DiscreteValuationField.DVF C := + { ValueGroup := ValuativeRel.ValueGroupWithZero C + valuation := ValuativeRel.valuation C } + exact + completionDVF.maximalIdeal_eq_span_uniformizer + πData.completionInteger_isUniformizer + let πC : Cˣ := + Units.mk0 (πData.completionInteger : C) + πData.completionInteger_isUniformizer.ne_zero + let xC : Cˣ := + finitePlaceHilbertCompletionUnit K v + (nonzeroIntegralFieldUnit K x hx) + have hIntX : + v.intValuation x = WithZero.exp (-(m : ℤ)) := by + exact intValuation_eq_exp_neg_idealPrimeMultiplicity K v x hx + have hIntPiPow : + v.intValuation (πData.integer ^ m) = + WithZero.exp (-(m : ℤ)) := by + rw [map_pow, πData.intValuation_eq_exp_neg_one] + calc + WithZero.exp (-1 : ℤ) ^ m = + WithZero.exp (m • (-1 : ℤ)) := + (WithZero.exp_nsmul m (-1 : ℤ)).symm + _ = WithZero.exp (-(m : ℤ)) := by simp + have hnormX : + ‖(xC : C)‖ = + (WithZeroMulInt.toNNReal + (HeightOneSpectrum.absNorm_ne_zero v) + (WithZero.exp (-(m : ℤ))) : ℝ) := by + change ‖algebraMap K C (x : K)‖ = _ + calc + ‖algebraMap K C (x : K)‖ = + HeightOneSpectrum.adicAbv K v (x : K) := + AbsoluteValue.completionAbsoluteValue_coe + (HeightOneSpectrum.adicAbv K v) (x : K) + _ = _ := by + rw [HeightOneSpectrum.adicAbv_def, + HeightOneSpectrum.valuation_of_algebraMap, hIntX] + have hnormPiPow : + ‖((πC ^ m : Cˣ) : C)‖ = + (WithZeroMulInt.toNNReal + (HeightOneSpectrum.absNorm_ne_zero v) + (WithZero.exp (-(m : ℤ))) : ℝ) := by + have hπC : + (πC : C) = algebraMap K C (πData.integer : K) := by + exact πData.coe_completionInteger + have hπCPow : + ((πC ^ m : Cˣ) : C) = + algebraMap K C (((πData.integer ^ m : 𝓞 K) : K)) := by + have hIntegerPow : + (((πData.integer ^ m : 𝓞 K) : K)) = + (πData.integer : K) ^ m := by + exact map_pow (algebraMap (𝓞 K) K) πData.integer m + rw [Units.val_pow_eq_pow_val, hπC, hIntegerPow, map_pow] + calc + ‖((πC ^ m : Cˣ) : C)‖ = + ‖algebraMap K C ((πData.integer ^ m : 𝓞 K) : K)‖ := + congrArg norm hπCPow + _ = HeightOneSpectrum.adicAbv K v + ((πData.integer ^ m : 𝓞 K) : K) := + AbsoluteValue.completionAbsoluteValue_coe + (HeightOneSpectrum.adicAbv K v) + ((πData.integer ^ m : 𝓞 K) : K) + _ = + (WithZeroMulInt.toNNReal + (HeightOneSpectrum.absNorm_ne_zero v) + (WithZero.exp (-(m : ℤ))) : ℝ) := by + rw [HeightOneSpectrum.adicAbv_def, + HeightOneSpectrum.valuation_of_algebraMap, hIntPiPow] + have hraw : + ValuativeRel.valuation C (xC : C) = + ValuativeRel.valuation C ((πC ^ m : Cˣ) : C) := by + apply canonicalValuation_eq_of_valuation_eq + (v := NormedField.valuation (K := C)) + apply NNReal.eq + simpa only [NormedField.valuation_apply, coe_nnnorm] using + hnormX.trans hnormPiPow.symm + have hValuationMap : + valuationMap C (Additive.ofMul xC) = + valuationMap C (Additive.ofMul (πC ^ m)) := by + rw [valuationMap_apply, valuationMap_apply] + unfold IsNonarchimedeanLocalField.v + congr 2 + exact congrArg + (_root_.IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt C) hraw + have hπCValuation : + valuationMap C (Additive.ofMul πC) = -1 := by + rw [valuationMap_apply] + exact + v_integerRingIrreducibleFieldUnit C πData.completionInteger + hπIrreducible πC rfl + calc + finitePlaceNormalizedValuation K v + (nonzeroIntegralFieldUnit K x hx) = + valuationMap C (Additive.ofMul xC) := rfl + _ = valuationMap C (Additive.ofMul (πC ^ m)) := hValuationMap + _ = (m : ℤ) * valuationMap C (Additive.ofMul πC) := by + rw [valuationMap_ofMul_pow] + _ = -(m : ℤ) := by rw [hπCValuation]; simp + _ = -(AlgebraicNumberTheory.PowerResidueSymbols.idealPrimeMultiplicity K v (Ideal.span {x}) + : ℤ) := rfl + +open scoped Classical in +/-- Prime avoidance is the common special case of the integral valuation +formula used for numerator units. -/ +theorem finitePlaceNormalizedValuation_primeAvoidingIntegralFieldUnit + (v : HeightOneSpectrum (𝓞 K)) + (x : 𝓞 K) (hx : x ∉ v.asIdeal) : + finitePlaceNormalizedValuation K v + (primeAvoidingIntegralFieldUnit K v x hx) = + -(AlgebraicNumberTheory.PowerResidueSymbols.idealPrimeMultiplicity K v (Ideal.span {x}) : + ℤ) := by + let hx0 : x ≠ 0 := by + intro hxzero + apply hx + rw [hxzero] + exact Ideal.zero_mem _ + change finitePlaceNormalizedValuation K v + (nonzeroIntegralFieldUnit K x hx0) = _ + exact finitePlaceNormalizedValuation_nonzeroIntegralFieldUnit K v x hx0 + +open scoped Classical in +/-- Integral form of the finite-place comparison: the exponent is the +Dedekind multiplicity in the principal denominator ideal. -/ +theorem finitePlaceHilbertSymbol_integral_eq_primeIdealPowerResidueFactor + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ powerResidueExponentFinitePlaces K n) + (hcoprime : (Ideal.absNorm v.asIdeal).Coprime (n : ℕ)) + (a b : 𝓞 K) (ha0 : a ≠ 0) (hb0 : b ≠ 0) + (ha : a ∉ v.asIdeal) : + finitePlaceHilbertSymbol K n hnK hmu v + (nonzeroIntegralFieldUnit K a ha0) + (nonzeroIntegralFieldUnit K b hb0) = + integralRootsOfUnityToNthRoots K (n : ℕ) + (AlgebraicNumberTheory.PowerResidueSymbols.primeIdealPowerResidueSymbol + K v n hmu hcoprime a ha) ^ + AlgebraicNumberTheory.PowerResidueSymbols.idealPrimeMultiplicity K v (Ideal.span {b}) := by + have haUnits : + nonzeroIntegralFieldUnit K a ha0 = + primeAvoidingIntegralFieldUnit K v a ha := by + apply Units.ext + rfl + rw [haUnits, + finitePlaceHilbertSymbol_eq_primeIdealPowerResidueFactor + K n hnK hmu v hv hcoprime a ha + (nonzeroIntegralFieldUnit K b hb0), + finitePlaceNormalizedValuation_nonzeroIntegralFieldUnit] + simp only [neg_neg, zpow_natCast] + +open scoped Classical in +/-- Finite-place Hilbert symbols inherit skew symmetry from the local +Hilbert symbol in the canonical completion. -/ +theorem finitePlaceHilbertSymbol_skew + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) (a b : Kˣ) : + finitePlaceHilbertSymbol K n hnK hmu v a b = + (finitePlaceHilbertSymbol K n hnK hmu v b a)⁻¹ := by + let C := (HeightOneSpectrum.adicAbv K v).Completion + let : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + let : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + apply nthRootsSubgroupMap_injective K C (n : ℕ) + rw [map_inv, + finitePlaceHilbertSymbol_map_eq_localHilbertSymbol, + finitePlaceHilbertSymbol_map_eq_localHilbertSymbol] + exact + localHilbertSymbol_skew C n + (finitePlaceHilbert_natCast_ne_zero K n hnK v) + (finitePlaceHilbert_primitiveRoots_nonempty K n hmu v) + (finitePlaceHilbertCompletionUnit K v a) + (finitePlaceHilbertCompletionUnit K v b) + +open scoped Classical in +/-- If two nonzero algebraic integers are both units at a finite place, the +corresponding finite-place Hilbert symbol is trivial. -/ +theorem finitePlaceHilbertSymbol_integral_units_eq_one + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ powerResidueExponentFinitePlaces K n) + (a b : 𝓞 K) (ha0 : a ≠ 0) (hb0 : b ≠ 0) + (ha : a ∉ v.asIdeal) (hb : b ∉ v.asIdeal) : + finitePlaceHilbertSymbol K n hnK hmu v + (nonzeroIntegralFieldUnit K a ha0) + (nonzeroIntegralFieldUnit K b hb0) = 1 := by + let C := (HeightOneSpectrum.adicAbv K v).Completion + let : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + let : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + apply nthRootsSubgroupMap_injective K C (n : ℕ) + rw [map_one, finitePlaceHilbertSymbol_map_eq_localHilbertSymbol] + have haUnits : + finitePlaceHilbertCompletionUnit K v + (nonzeroIntegralFieldUnit K a ha0) = + integerUnitsToFieldUnits C + (finitePlaceIntegralCompletionUnit K v a ha) := by + apply Units.ext + change + algebraMap K C (a : K) = + (((finitePlaceIntegralCompletionUnit K v a ha : 𝒪[C]ˣ) : + 𝒪[C]) : C) + exact (finitePlaceIntegralCompletionUnit_coe K v a ha).symm + have hbUnits : + finitePlaceHilbertCompletionUnit K v + (nonzeroIntegralFieldUnit K b hb0) = + integerUnitsToFieldUnits C + (finitePlaceIntegralCompletionUnit K v b hb) := by + apply Units.ext + change + algebraMap K C (b : K) = + (((finitePlaceIntegralCompletionUnit K v b hb : 𝒪[C]ˣ) : + 𝒪[C]) : C) + exact (finitePlaceIntegralCompletionUnit_coe K v b hb).symm + unfold finitePlaceLocalHilbertSymbol + rw [haUnits, hbUnits] + exact + localHilbertSymbol_integerUnit_integerUnit_eq_one C n + (finitePlace_natCast_valuation_eq_one_of_not_mem_exponent K n v hv) + (finitePlaceHilbert_primitiveRoots_nonempty K n hmu v) + (finitePlaceIntegralCompletionUnit K v a ha) + (finitePlaceIntegralCompletionUnit K v b hb) + +open scoped Classical in +/-- Primewise comparison between the tame finite-place Hilbert factor and +the quotient of the two ideal power-residue factors. -/ +theorem powerResidueAwayFromExponentFiniteFactor_integral_eq_idealFactors + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a b : 𝓞 K) (ha0 : a ≠ 0) (hb0 : b ≠ 0) + (hcoprimeA : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ Ideal.span {a} → + (Ideal.absNorm P.asIdeal).Coprime (n : ℕ)) + (hcoprimeB : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ Ideal.span {b} → + (Ideal.absNorm P.asIdeal).Coprime (n : ℕ)) + (haB : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ Ideal.span {b} → a ∉ P.asIdeal) + (hbA : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ Ideal.span {a} → b ∉ P.asIdeal) + (hAwayA : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ Ideal.span {a} → + P ∉ powerResidueExponentFinitePlaces K n) + (hAwayB : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ Ideal.span {b} → + P ∉ powerResidueExponentFinitePlaces K n) + (P : HeightOneSpectrum (𝓞 K)) : + (if P ∈ powerResidueExponentFinitePlaces K n then + 1 + else + finitePlaceHilbertSymbol K n hnK hmu P + (nonzeroIntegralFieldUnit K a ha0) + (nonzeroIntegralFieldUnit K b hb0)) = + integralRootsOfUnityToNthRoots K (n : ℕ) + (idealPowerResidueFactor K (Ideal.span {b}) n hmu a + hcoprimeB haB P) * + (integralRootsOfUnityToNthRoots K (n : ℕ) + (idealPowerResidueFactor K (Ideal.span {a}) n hmu b + hcoprimeA hbA P))⁻¹ := by + by_cases hPExponent : P ∈ powerResidueExponentFinitePlaces K n + · have hPA : ¬ P.asIdeal ∣ Ideal.span {a} := by + intro hPA + exact (hAwayA P hPA) hPExponent + have hPB : ¬ P.asIdeal ∣ Ideal.span {b} := by + intro hPB + exact (hAwayB P hPB) hPExponent + simp only [ite_eq_left hPExponent, idealPowerResidueFactor, + dite_eq_right hPA, dite_eq_right hPB, map_one, inv_one, mul_one] + · rw [ite_eq_right hPExponent] + by_cases hPB : P.asIdeal ∣ Ideal.span {b} + · have haP : a ∉ P.asIdeal := haB P hPB + have hPA : ¬ P.asIdeal ∣ Ideal.span {a} := by + intro hPA + apply haP + rw [← Ideal.dvd_span_singleton] + exact hPA + rw [finitePlaceHilbertSymbol_integral_eq_primeIdealPowerResidueFactor + K n hnK hmu P (hAwayB P hPB) (hcoprimeB P hPB) + a b ha0 hb0 haP] + simp only [idealPowerResidueFactor, dite_eq_left hPB, dite_eq_right hPA, + map_pow, map_one, inv_one, mul_one] + · by_cases hPA : P.asIdeal ∣ Ideal.span {a} + · have hbP : b ∉ P.asIdeal := hbA P hPA + rw [finitePlaceHilbertSymbol_skew K n hnK hmu] + rw [finitePlaceHilbertSymbol_integral_eq_primeIdealPowerResidueFactor + K n hnK hmu P (hAwayA P hPA) (hcoprimeA P hPA) + b a hb0 ha0 hbP] + simp only [idealPowerResidueFactor, dite_eq_right hPB, dite_eq_left hPA, + map_pow, map_one, one_mul] + · have haP : a ∉ P.asIdeal := by + intro haMem + apply hPA + rw [Ideal.dvd_span_singleton] + exact haMem + have hbP : b ∉ P.asIdeal := by + intro hbMem + apply hPB + rw [Ideal.dvd_span_singleton] + exact hbMem + rw [finitePlaceHilbertSymbol_integral_units_eq_one + K n hnK hmu P hPExponent a b ha0 hb0 haP hbP] + simp only [idealPowerResidueFactor, dite_eq_right hPB, dite_eq_right hPA, + map_one, inv_one, mul_one] + +open scoped Classical in +/-- A concrete finite set containing every finite place where a local +power-residue factor of `a` and `b` may be nontrivial. Its exponent part is +the exact set of prime divisors of `(n)`. -/ +noncomputable def powerResidueBadFinitePlaces + (n : ℕ+) (a b : Kˣ) : + Finset (HeightOneSpectrum (𝓞 K)) := + (chosenUnitFiniteSupport (K := K) a ∪ + chosenUnitFiniteSupport (K := K) b) ∪ + powerResidueExponentFinitePlaces K n + +open scoped Classical in +/-- The explicit bad-place correction in power-residue reciprocity. Every +factor already lies in the common group `nthRootsSubgroup K n`. -/ +noncomputable def powerResidueBadPlaceCorrection + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a b : Kˣ) : + nthRootsSubgroup K (n : ℕ) := + (∏ v : InfinitePlace K, + infinitePlaceHilbertSymbol K n v a b) * + (∏ v ∈ powerResidueExponentFinitePlaces K n, + finitePlaceHilbertSymbol K n hnK hmu v a b) + +open scoped Classical in +private theorem valuation_eq_one_of_not_mem_chosenUnitFiniteSupport + (x : Kˣ) (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ chosenUnitFiniteSupport (K := K) x) : + v.valuation K (x : K) = 1 := + (mem_SUnitGroup_iff (K := K) + (chosenUnitFiniteSupport (K := K) x) x).mp + (mem_sUnitGroup_chosenUnitFiniteSupport (K := K) x) v hv + +open scoped Classical in +/-- The finite-place Hilbert symbol is trivial when the exponent and both +global arguments are units at this place. -/ +theorem finitePlaceHilbertSymbol_eq_one_of_valuation_eq_one + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a b : Kˣ) (v : HeightOneSpectrum (𝓞 K)) + (hva : v.valuation K (a : K) = 1) + (hvb : v.valuation K (b : K) = 1) + (hvn : v.valuation K ((n : ℕ) : K) = 1) : + finitePlaceHilbertSymbol K n hnK hmu v a b = 1 := by + let L := chosenSimpleKummerExtension K n hnK b + let : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let : NumberField L := NumberField.of_module_finite K L + have haIntegral : + IdeleGroup.finiteComponent v (IdeleGroup.principalIdele K a) ∈ + (v.adicCompletionIntegers K).units := by + rw [HeightOneSpectrum.adicCompletionIntegers.mem_units_iff_valued_eq_one] + rw [IdeleGroup.finiteComponent_principalIdele, + HeightOneSpectrum.valuedAdicCompletion_eq_valuation'] + exact hva + have hUnramified : + Algebra.IsUnramifiedAt (𝓞 K) + (finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v)).asIdeal := by + apply + chosenSimpleKummerExtension_isUnramifiedAt_at_all_finitePlacesAbove_of_valuation_eq_one + (K := K) n hnK hmu b v hvb hvn + exact + finitePlaceBelow_finitePlaceExtensionCentre + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v) + have hArtin : + chosenFinitePlaceArtinMonoidHom (K := K) (L := L) v + (IdeleGroup.finiteComponent v (IdeleGroup.principalIdele K a)) = 1 := + chosenFinitePlaceArtinMonoidHom_eq_one_of_integral_of_unramifiedAt + (K := K) (L := L) v (IdeleGroup.principalIdele K a) + haIntegral hUnramified + rw [← finitePlaceKummerRootCharacter_localGlobal K n hnK hmu v a b] + unfold finitePlaceKummerRootCharacter + unfold finitePlaceKummerRootCharacterOfExtension + have hcomponent : + (IdeleGroup.finiteComponent v (IdeleGroup.principalIdele K a) : + (v.adicCompletion K)ˣ) = + Units.map (algebraMap K (v.adicCompletion K)).toMonoidHom a := by + apply Units.ext + calc + ((IdeleGroup.finiteComponent v (IdeleGroup.principalIdele K a) : + (v.adicCompletion K)ˣ) : v.adicCompletion K) = + ((a : K) : v.adicCompletion K) := + IdeleGroup.finiteComponent_principalIdele a v + _ = algebraMap K (v.adicCompletion K) (a : K) := by + symm + have hmap := congrFun + (IsDedekindDomain.HeightOneSpectrum.algebraMap_adicCompletion + (R := 𝓞 K) (S := K) (K := K) (v := v)) (a : K) + simpa using hmap + rw [hcomponent] at hArtin + unfold chosenFinitePlaceArtinMonoidHom at hArtin + dsimp only at hArtin ⊢ + rw [hArtin, map_one, map_one] + +open scoped Classical in +/-- Outside the concrete bad-place set, the finite-place Hilbert factor is +trivial. -/ +theorem finitePlaceHilbertSymbol_eq_one_of_not_mem_powerResidueBadFinitePlaces + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a b : Kˣ) (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ powerResidueBadFinitePlaces K n a b) : + finitePlaceHilbertSymbol K n hnK hmu v a b = 1 := by + have hvaSupport : v ∉ chosenUnitFiniteSupport (K := K) a := by + intro hva + apply hv + exact Finset.mem_union_left _ (Finset.mem_union_left _ hva) + have hvbSupport : v ∉ chosenUnitFiniteSupport (K := K) b := by + intro hvb + apply hv + exact Finset.mem_union_left _ (Finset.mem_union_right _ hvb) + have hvnSupport : + v ∉ powerResidueExponentFinitePlaces K n := by + intro hvn + apply hv + exact Finset.mem_union_right _ hvn + have hva : v.valuation K (a : K) = 1 := + valuation_eq_one_of_not_mem_chosenUnitFiniteSupport K a v hvaSupport + have hvb : v.valuation K (b : K) = 1 := + valuation_eq_one_of_not_mem_chosenUnitFiniteSupport K b v hvbSupport + have hvn : v.valuation K ((n : ℕ) : K) = 1 := by + have hvnNotDvd : + ¬ v.asIdeal ∣ powerResidueExponentIdeal K n := by + simpa only [mem_powerResidueExponentFinitePlaces_iff] using hvnSupport + have hvnNotMem : ((n : ℕ) : 𝓞 K) ∉ v.asIdeal := by + intro hvnMem + apply hvnNotDvd + rw [powerResidueExponentIdeal, Ideal.dvd_span_singleton] + exact hvnMem + simpa only [map_natCast] using + (v.valuation_eq_one_iff_notMem (K := K) + (r := ((n : ℕ) : 𝓞 K))).2 hvnNotMem + exact finitePlaceHilbertSymbol_eq_one_of_valuation_eq_one + K n hnK hmu a b v hva hvb hvn + +open scoped Classical in +/-- The multiplicative support of the finite-place Hilbert factors is +contained in the explicit power-residue bad-place set. -/ +theorem finitePlaceHilbertSymbol_mulSupport_subset_powerResidueBadFinitePlaces + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a b : Kˣ) : + Function.mulSupport + (fun v : HeightOneSpectrum (𝓞 K) => + finitePlaceHilbertSymbol K n hnK hmu v a b) ⊆ + (powerResidueBadFinitePlaces K n a b : + Set (HeightOneSpectrum (𝓞 K))) := by + intro v hv + change finitePlaceHilbertSymbol K n hnK hmu v a b ≠ 1 at hv + change v ∈ powerResidueBadFinitePlaces K n a b + by_contra hvBad + exact hv + (finitePlaceHilbertSymbol_eq_one_of_not_mem_powerResidueBadFinitePlaces + K n hnK hmu a b v hvBad) + +open scoped Classical in +/-- The finite-place Hilbert `finprod` is the ordinary product over the +explicit bad-place set. -/ +theorem finitePlaceHilbertSymbol_finprod_eq_prod_powerResidueBadFinitePlaces + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a b : Kˣ) : + (∏ᶠ v : HeightOneSpectrum (𝓞 K), + finitePlaceHilbertSymbol K n hnK hmu v a b) = + ∏ v ∈ powerResidueBadFinitePlaces K n a b, + finitePlaceHilbertSymbol K n hnK hmu v a b := by + rw [finprod_eq_prod_of_mulSupport_subset _ + (finitePlaceHilbertSymbol_mulSupport_subset_powerResidueBadFinitePlaces + K n hnK hmu a b)] + +open scoped Classical in +/-- Finite-set form of the Hilbert product formula: the product over all +explicitly bad finite places is the inverse of the infinite-place product. -/ +theorem powerResidueBadFinitePlaces_product_eq_infinitePlaceProduct_inv + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a b : Kˣ) : + (∏ v ∈ powerResidueBadFinitePlaces K n a b, + finitePlaceHilbertSymbol K n hnK hmu v a b) = + (∏ v : InfinitePlace K, + infinitePlaceHilbertSymbol K n v a b)⁻¹ := by + have hproduct := + hilbertSymbol_allPlaces_product_eq_one K n hnK hmu a b + rw [ + finitePlaceHilbertSymbol_finprod_eq_prod_powerResidueBadFinitePlaces] + at hproduct + exact (eq_inv_iff_mul_eq_one).2 (by + simpa only [mul_comm] using hproduct) + +open scoped Classical in +/-- The product of the finite-place Hilbert factors away from primes dividing +the exponent. C1 identifies this term with the quotient of the two ideal +power-residue symbols; the remaining factors are exactly the correction. -/ +noncomputable def powerResidueAwayFromExponentFiniteProduct + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a b : Kˣ) : + nthRootsSubgroup K (n : ℕ) := + ∏ᶠ v : HeightOneSpectrum (𝓞 K), + if v ∈ powerResidueExponentFinitePlaces K n then + 1 + else + finitePlaceHilbertSymbol K n hnK hmu v a b + +open scoped Classical in +/-- The complete tame finite-place product for two nonzero algebraic +integers is the quotient of the two ideal power-residue symbols. -/ +theorem powerResidueAwayFromExponentFiniteProduct_integral_eq_idealSymbol_div + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a b : 𝓞 K) (ha0 : a ≠ 0) (hb0 : b ≠ 0) + (hcoprimeA : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ Ideal.span {a} → + (Ideal.absNorm P.asIdeal).Coprime (n : ℕ)) + (hcoprimeB : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ Ideal.span {b} → + (Ideal.absNorm P.asIdeal).Coprime (n : ℕ)) + (haB : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ Ideal.span {b} → a ∉ P.asIdeal) + (hbA : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ Ideal.span {a} → b ∉ P.asIdeal) + (hAwayA : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ Ideal.span {a} → + P ∉ powerResidueExponentFinitePlaces K n) + (hAwayB : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ Ideal.span {b} → + P ∉ powerResidueExponentFinitePlaces K n) : + powerResidueAwayFromExponentFiniteProduct K n hnK hmu + (nonzeroIntegralFieldUnit K a ha0) + (nonzeroIntegralFieldUnit K b hb0) = + integralRootsOfUnityToNthRoots K (n : ℕ) + (idealPowerResidueSymbol K (Ideal.span {b}) + (by exact ideal_span_singleton_ne_zero K hb0) + n hmu a hcoprimeB haB) * + (integralRootsOfUnityToNthRoots K (n : ℕ) + (idealPowerResidueSymbol K (Ideal.span {a}) + (by exact ideal_span_singleton_ne_zero K ha0) + n hmu b hcoprimeA hbA))⁻¹ := by + let IA : Ideal (𝓞 K) := Ideal.span {a} + let IB : Ideal (𝓞 K) := Ideal.span {b} + have hIA : IA ≠ 0 := by + dsimp only [IA] + exact ideal_span_singleton_ne_zero K ha0 + have hIB : IB ≠ 0 := by + dsimp only [IB] + exact ideal_span_singleton_ne_zero K hb0 + let fB : HeightOneSpectrum (𝓞 K) → nthRootsSubgroup K (n : ℕ) := + fun P => integralRootsOfUnityToNthRoots K (n : ℕ) + (idealPowerResidueFactor K IB n hmu a hcoprimeB haB P) + let fA : HeightOneSpectrum (𝓞 K) → nthRootsSubgroup K (n : ℕ) := + fun P => integralRootsOfUnityToNthRoots K (n : ℕ) + (idealPowerResidueFactor K IA n hmu b hcoprimeA hbA P) + have hfB : Function.HasFiniteMulSupport fB := + (idealPowerResidueFactor_hasFiniteMulSupport + K IB hIB n hmu a hcoprimeB haB).subset (by + intro P hP + change fB P ≠ 1 at hP + change idealPowerResidueFactor K IB n hmu a hcoprimeB haB P ≠ 1 + intro hOne + exact hP (by simp only [fB, hOne, map_one])) + have hfA : Function.HasFiniteMulSupport fA := + (idealPowerResidueFactor_hasFiniteMulSupport + K IA hIA n hmu b hcoprimeA hbA).subset (by + intro P hP + change fA P ≠ 1 at hP + change idealPowerResidueFactor K IA n hmu b hcoprimeA hbA P ≠ 1 + intro hOne + exact hP (by simp only [fA, hOne, map_one])) + have hfAInv : + Function.HasFiniteMulSupport (fun P => (fA P)⁻¹) := + hfA.subset (by + intro P hP + change (fA P)⁻¹ ≠ 1 at hP + change fA P ≠ 1 + intro hOne + exact hP (by rw [hOne, inv_one])) + let invHom : nthRootsSubgroup K (n : ℕ) →* + nthRootsSubgroup K (n : ℕ) := invMonoidHom + have hfinprodInv : + (∏ᶠ P : HeightOneSpectrum (𝓞 K), (fA P)⁻¹) = + (∏ᶠ P : HeightOneSpectrum (𝓞 K), fA P)⁻¹ := by + change (∏ᶠ P : HeightOneSpectrum (𝓞 K), invHom (fA P)) = + invHom (∏ᶠ P : HeightOneSpectrum (𝓞 K), fA P) + exact (MonoidHom.map_finprod invHom hfA).symm + calc + powerResidueAwayFromExponentFiniteProduct K n hnK hmu + (nonzeroIntegralFieldUnit K a ha0) + (nonzeroIntegralFieldUnit K b hb0) = + ∏ᶠ P : HeightOneSpectrum (𝓞 K), fB P * (fA P)⁻¹ := by + apply finprod_congr + intro P + simpa only [fA, fB, IA, IB] using + powerResidueAwayFromExponentFiniteFactor_integral_eq_idealFactors + K n hnK hmu a b ha0 hb0 hcoprimeA hcoprimeB haB hbA + hAwayA hAwayB P + _ = (∏ᶠ P : HeightOneSpectrum (𝓞 K), fB P) * + (∏ᶠ P : HeightOneSpectrum (𝓞 K), (fA P)⁻¹) := + finprod_mul_distrib hfB hfAInv + _ = (∏ᶠ P : HeightOneSpectrum (𝓞 K), fB P) * + (∏ᶠ P : HeightOneSpectrum (𝓞 K), fA P)⁻¹ := by + rw [hfinprodInv] + _ = integralRootsOfUnityToNthRoots K (n : ℕ) + (idealPowerResidueSymbol K IB hIB n hmu a hcoprimeB haB) * + (integralRootsOfUnityToNthRoots K (n : ℕ) + (idealPowerResidueSymbol K IA hIA n hmu b hcoprimeA hbA))⁻¹ := by + rw [idealPowerResidueSymbol_eq_finprod, + idealPowerResidueSymbol_eq_finprod] + rw [MonoidHom.map_finprod + (integralRootsOfUnityToNthRoots K (n : ℕ)) + (idealPowerResidueFactor_hasFiniteMulSupport + K IB hIB n hmu a hcoprimeB haB), + MonoidHom.map_finprod + (integralRootsOfUnityToNthRoots K (n : ℕ)) + (idealPowerResidueFactor_hasFiniteMulSupport + K IA hIA n hmu b hcoprimeA hbA)] + _ = integralRootsOfUnityToNthRoots K (n : ℕ) + (idealPowerResidueSymbol K (Ideal.span {b}) + (by exact ideal_span_singleton_ne_zero K hb0) + n hmu a hcoprimeB haB) * + (integralRootsOfUnityToNthRoots K (n : ℕ) + (idealPowerResidueSymbol K (Ideal.span {a}) + (by exact ideal_span_singleton_ne_zero K ha0) + n hmu b hcoprimeA hbA))⁻¹ := by + rfl + +open scoped Classical in +/-- Split the full finite-place product into exponent-prime factors and the +product away from the exponent. -/ +theorem finitePlaceHilbertSymbol_finprod_eq_exponent_product_mul_away + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a b : Kˣ) : + (∏ᶠ v : HeightOneSpectrum (𝓞 K), + finitePlaceHilbertSymbol K n hnK hmu v a b) = + (∏ v ∈ powerResidueExponentFinitePlaces K n, + finitePlaceHilbertSymbol K n hnK hmu v a b) * + powerResidueAwayFromExponentFiniteProduct K n hnK hmu a b := by + let exponentFactor : HeightOneSpectrum (𝓞 K) → + nthRootsSubgroup K (n : ℕ) := fun v => + if v ∈ powerResidueExponentFinitePlaces K n then + finitePlaceHilbertSymbol K n hnK hmu v a b + else + 1 + let awayFactor : HeightOneSpectrum (𝓞 K) → + nthRootsSubgroup K (n : ℕ) := fun v => + if v ∈ powerResidueExponentFinitePlaces K n then + 1 + else + finitePlaceHilbertSymbol K n hnK hmu v a b + have hExponentSupport : + Function.mulSupport exponentFactor ⊆ + (powerResidueExponentFinitePlaces K n : + Set (HeightOneSpectrum (𝓞 K))) := by + intro v hv + change exponentFactor v ≠ 1 at hv + change v ∈ powerResidueExponentFinitePlaces K n + by_contra hvExponent + exact hv (by simp only [exponentFactor, ite_eq_right hvExponent]) + have hExponentFinite : Function.HasFiniteMulSupport exponentFactor := by + rw [Function.HasFiniteMulSupport] + exact + (powerResidueExponentFinitePlaces K n).finite_toSet.subset + hExponentSupport + have hAwayFinite : Function.HasFiniteMulSupport awayFactor := by + rw [Function.HasFiniteMulSupport] + exact + (finitePlaceHilbertSymbol_hasFiniteMulSupport K n hnK hmu a b).subset + (by + intro v hv + change awayFactor v ≠ 1 at hv + change finitePlaceHilbertSymbol K n hnK hmu v a b ≠ 1 + by_contra hvOne + exact hv (by simp only [awayFactor, hvOne, ite_self])) + have hPointwise : + (fun v : HeightOneSpectrum (𝓞 K) => + finitePlaceHilbertSymbol K n hnK hmu v a b) = + fun v => exponentFactor v * awayFactor v := by + funext v + by_cases hv : v ∈ powerResidueExponentFinitePlaces K n + · simp only [exponentFactor, awayFactor, ite_eq_left hv, mul_one] + · simp only [exponentFactor, awayFactor, ite_eq_right hv, one_mul] + have hExponentProduct : + (∏ᶠ v : HeightOneSpectrum (𝓞 K), exponentFactor v) = + ∏ v ∈ powerResidueExponentFinitePlaces K n, + finitePlaceHilbertSymbol K n hnK hmu v a b := by + rw [finprod_eq_prod_of_mulSupport_subset exponentFactor hExponentSupport] + apply Finset.prod_congr rfl + intro v hv + simp only [exponentFactor, ite_eq_left hv] + calc + (∏ᶠ v : HeightOneSpectrum (𝓞 K), + finitePlaceHilbertSymbol K n hnK hmu v a b) = + ∏ᶠ v : HeightOneSpectrum (𝓞 K), + exponentFactor v * awayFactor v := by + rw [hPointwise] + _ = (∏ᶠ v : HeightOneSpectrum (𝓞 K), exponentFactor v) * + (∏ᶠ v : HeightOneSpectrum (𝓞 K), awayFactor v) := + finprod_mul_distrib hExponentFinite hAwayFinite + _ = (∏ v ∈ powerResidueExponentFinitePlaces K n, + finitePlaceHilbertSymbol K n hnK hmu v a b) * + (∏ᶠ v : HeightOneSpectrum (𝓞 K), awayFactor v) := by + rw [hExponentProduct] + _ = (∏ v ∈ powerResidueExponentFinitePlaces K n, + finitePlaceHilbertSymbol K n hnK hmu v a b) * + powerResidueAwayFromExponentFiniteProduct K n hnK hmu a b := by + rfl + +open scoped Classical in +/-- General Hilbert-product core of power-residue reciprocity. The complete +finite product away from the exponent is the inverse of the explicit product +of all infinite-place factors and all exponent-prime factors. -/ +theorem powerResidueAwayFromExponentFiniteProduct_eq_badPlaceCorrection_inv + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a b : Kˣ) : + powerResidueAwayFromExponentFiniteProduct K n hnK hmu a b = + (powerResidueBadPlaceCorrection K n hnK hmu a b)⁻¹ := by + have hproduct := + hilbertSymbol_allPlaces_product_eq_one K n hnK hmu a b + rw [finitePlaceHilbertSymbol_finprod_eq_exponent_product_mul_away] + at hproduct + exact (eq_inv_iff_mul_eq_one).2 (by + unfold powerResidueBadPlaceCorrection + simpa only [mul_assoc, mul_comm, mul_left_comm] using hproduct) + +open scoped Classical in +/-- General ideal power-residue reciprocity with the explicit product of +infinite and exponent-prime Hilbert factors as correction. -/ +theorem idealPowerResidueSymbol_reciprocity_with_bad_place_correction + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a b : 𝓞 K) (ha0 : a ≠ 0) (hb0 : b ≠ 0) + (hcoprimeA : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ Ideal.span {a} → + (Ideal.absNorm P.asIdeal).Coprime (n : ℕ)) + (hcoprimeB : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ Ideal.span {b} → + (Ideal.absNorm P.asIdeal).Coprime (n : ℕ)) + (haB : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ Ideal.span {b} → a ∉ P.asIdeal) + (hbA : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ Ideal.span {a} → b ∉ P.asIdeal) + (hAwayA : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ Ideal.span {a} → + P ∉ powerResidueExponentFinitePlaces K n) + (hAwayB : + ∀ P : HeightOneSpectrum (𝓞 K), + P.asIdeal ∣ Ideal.span {b} → + P ∉ powerResidueExponentFinitePlaces K n) : + integralRootsOfUnityToNthRoots K (n : ℕ) + (idealPowerResidueSymbol K (Ideal.span {b}) + (by exact ideal_span_singleton_ne_zero K hb0) + n hmu a hcoprimeB haB) = + (powerResidueBadPlaceCorrection K n hnK hmu + (nonzeroIntegralFieldUnit K a ha0) + (nonzeroIntegralFieldUnit K b hb0))⁻¹ * + integralRootsOfUnityToNthRoots K (n : ℕ) + (idealPowerResidueSymbol K (Ideal.span {a}) + (by exact ideal_span_singleton_ne_zero K ha0) + n hmu b hcoprimeA hbA) := by + let symbolAB := integralRootsOfUnityToNthRoots K (n : ℕ) + (idealPowerResidueSymbol K (Ideal.span {b}) + (by exact ideal_span_singleton_ne_zero K hb0) + n hmu a hcoprimeB haB) + let symbolBA := integralRootsOfUnityToNthRoots K (n : ℕ) + (idealPowerResidueSymbol K (Ideal.span {a}) + (by exact ideal_span_singleton_ne_zero K ha0) + n hmu b hcoprimeA hbA) + let correction := powerResidueBadPlaceCorrection K n hnK hmu + (nonzeroIntegralFieldUnit K a ha0) + (nonzeroIntegralFieldUnit K b hb0) + have hIdeal := + powerResidueAwayFromExponentFiniteProduct_integral_eq_idealSymbol_div + K n hnK hmu a b ha0 hb0 hcoprimeA hcoprimeB haB hbA + hAwayA hAwayB + have hCorrection := + powerResidueAwayFromExponentFiniteProduct_eq_badPlaceCorrection_inv + K n hnK hmu + (nonzeroIntegralFieldUnit K a ha0) + (nonzeroIntegralFieldUnit K b hb0) + have hQuotient : symbolAB * symbolBA⁻¹ = correction⁻¹ := by + rw [← hIdeal, hCorrection] + change symbolAB = correction⁻¹ * symbolBA + calc + symbolAB = (symbolAB * symbolBA⁻¹) * symbolBA := by + simp only [mul_assoc, inv_mul_cancel, mul_one] + _ = correction⁻¹ * symbolBA := by rw [hQuotient] + +/-! ## Quadratic specialization over the rational field -/ + +open AlgebraicNumberTheory.PowerResidueSymbols + +open scoped Classical in +local instance rationalPrimeFact (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +attribute [local instance] rationalPrimeFact + +open scoped Classical in +/-- The rational field contains the primitive square root of unity `-1`. +This is the canonical source of the primitive-root input in the quadratic +specialization; no root is chosen downstream. -/ +theorem rationalQuadraticPrimitiveRoots_nonempty : + (primitiveRoots 2 ℚ).Nonempty := by + refine ⟨-1, (mem_primitiveRoots (by decide)).2 ?_⟩ + exact IsPrimitiveRoot.neg_one 0 (by decide) + +open scoped Classical in +/-- The residue field at the rational prime over `p` is canonically `ZMod p`. +The construction first transports the prime ideal through +`Rat.ringOfIntegersEquiv` and then uses the standard integer quotient. -/ +noncomputable def rationalPrimeResidueEquivZMod + (p : Nat.Primes) : + (𝓞 ℚ ⧸ (RayClass.rationalPrime p).asIdeal) ≃+* ZMod p.1 := by + have hIntEquiv : + Rat.IsIntegralClosure.intEquiv (𝓞 ℚ) = + Rat.ringOfIntegersEquiv := by + ext x + exact Rat.IsIntegralClosure.intEquiv_apply_eq_ringOfIntegersEquiv x + have hmap : + Ideal.span {(p.1 : ℤ)} = + (RayClass.rationalPrime p).asIdeal.map + Rat.ringOfIntegersEquiv := by + simpa only [RayClass.natGenerator_rationalPrime, hIntEquiv] using + (Rat.HeightOneSpectrum.span_natGenerator + (RayClass.rationalPrime p)) + exact + (Ideal.quotientEquiv + (RayClass.rationalPrime p).asIdeal + (Ideal.span {(p.1 : ℤ)}) + Rat.ringOfIntegersEquiv hmap).trans + (Int.quotientSpanNatEquivZMod p.1) + +open scoped Classical in +/-- The rational residue-field equivalence sends an integral residue class to +the corresponding integer class modulo `p`. -/ +@[simp] +theorem rationalPrimeResidueEquivZMod_mk + (p : Nat.Primes) (a : 𝓞 ℚ) : + rationalPrimeResidueEquivZMod p + (Ideal.Quotient.mk (RayClass.rationalPrime p).asIdeal a) = + (Rat.ringOfIntegersEquiv a : ZMod p.1) := by + rw [rationalPrimeResidueEquivZMod, RingEquiv.trans_apply] + have hmk + (hIJ : + Ideal.span {(p.1 : ℤ)} = + (RayClass.rationalPrime p).asIdeal.map + Rat.ringOfIntegersEquiv) : + Ideal.quotientEquiv + (RayClass.rationalPrime p).asIdeal + (Ideal.span {(p.1 : ℤ)}) + Rat.ringOfIntegersEquiv hIJ + (Ideal.Quotient.mk (RayClass.rationalPrime p).asIdeal a) = + Ideal.Quotient.mk (Ideal.span {(p.1 : ℤ)}) + (Rat.ringOfIntegersEquiv a) := + Ideal.quotientEquiv_mk + (RayClass.rationalPrime p).asIdeal + (Ideal.span {(p.1 : ℤ)}) + Rat.ringOfIntegersEquiv hIJ a + have hquot : + ((Int.quotientSpanNatEquivZMod p.1 : + (ℤ ⧸ Ideal.span {(p.1 : ℤ)}) →+* ZMod p.1).comp + (Ideal.Quotient.mk (Ideal.span {(p.1 : ℤ)}))) = + Int.castRingHom (ZMod p.1) := + Int.quotientSpanNatEquivZMod_comp_Quotient_mk p.1 + calc + _ = Int.quotientSpanNatEquivZMod p.1 + (Ideal.Quotient.mk (Ideal.span {(p.1 : ℤ)}) + (Rat.ringOfIntegersEquiv a)) := + congrArg (Int.quotientSpanNatEquivZMod p.1) (hmk _) + _ = _ := congrArg + (fun f : ℤ →+* ZMod p.1 => f (Rat.ringOfIntegersEquiv a)) hquot + +open scoped Classical in +/-- The absolute norm of the rational prime ideal attached to `p` is `p`. +This follows from the explicit residue-field equivalence rather than from a +cardinality assumption supplied by a consumer. -/ +theorem absNorm_rationalPrime (p : Nat.Primes) : + Ideal.absNorm (RayClass.rationalPrime p).asIdeal = p.1 := by + rw [Ideal.absNorm_apply, Submodule.cardQuot_apply] + calc + Nat.card (𝓞 ℚ ⧸ (RayClass.rationalPrime p).asIdeal) = + Nat.card (ZMod p.1) := + Nat.card_congr (rationalPrimeResidueEquivZMod p).toEquiv + _ = p.1 := Nat.card_zmod p.1 + +open scoped Classical in +/-- An odd rational prime has residue characteristic coprime to the quadratic +exponent. -/ +theorem absNorm_rationalPrime_coprime_two + (p : Nat.Primes) (hp : p.1 ≠ 2) : + (Ideal.absNorm (RayClass.rationalPrime p).asIdeal).Coprime 2 := by + rw [absNorm_rationalPrime] + exact (p.2.odd_of_ne_two hp).coprime_two_right + +open scoped Classical in +/-- Evaluate a quadratic integral root of unity as the corresponding integer +sign. -/ +def rationalQuadraticRootValue + (z : rootsOfUnity 2 (𝓞 ℚ)) : ℤ := + Rat.ringOfIntegersEquiv (z.1 : 𝓞 ℚ) + +open scoped Classical in +/-- The identity quadratic root evaluates to the positive integer sign. -/ +@[simp] +theorem rationalQuadraticRootValue_one : + rationalQuadraticRootValue (1 : rootsOfUnity 2 (𝓞 ℚ)) = 1 := by + simp [rationalQuadraticRootValue] + +open scoped Classical in +/-- Integer evaluation of quadratic roots of unity is multiplicative. -/ +def rationalQuadraticRootValueMonoidHom : + rootsOfUnity 2 (𝓞 ℚ) →* ℤ where + toFun := rationalQuadraticRootValue + map_one' := rationalQuadraticRootValue_one + map_mul' := by + intro z w + simp [rationalQuadraticRootValue] + +open scoped Classical in +/-- The multiplicative sign evaluation has the expected underlying function. -/ +@[simp] +theorem rationalQuadraticRootValueMonoidHom_apply + (z : rootsOfUnity 2 (𝓞 ℚ)) : + rationalQuadraticRootValueMonoidHom z = + rationalQuadraticRootValue z := + rfl + +open scoped Classical in +/-- The integer sign evaluation detects the identity root. -/ +theorem rationalQuadraticRootValue_eq_one_iff + (z : rootsOfUnity 2 (𝓞 ℚ)) : + rationalQuadraticRootValue z = 1 ↔ z = 1 := by + constructor + · intro hz + apply Subtype.ext + apply Units.ext + apply Rat.ringOfIntegersEquiv.injective + change Rat.ringOfIntegersEquiv (z.1 : 𝓞 ℚ) = + Rat.ringOfIntegersEquiv (1 : 𝓞 ℚ) + rw [map_one] + simpa only [rationalQuadraticRootValue] using hz + · rintro rfl + exact rationalQuadraticRootValue_one + +open scoped Classical in +/-- A quadratic root evaluates to one of the two integer signs. -/ +theorem rationalQuadraticRootValue_eq_one_or_neg_one + (z : rootsOfUnity 2 (𝓞 ℚ)) : + rationalQuadraticRootValue z = 1 ∨ + rationalQuadraticRootValue z = -1 := by + have hzUnits : z.1 ^ 2 = 1 := z.2 + have hzIntegers : ((z.1 : 𝓞 ℚ) ^ 2) = 1 := by + simpa using congrArg (fun u : (𝓞 ℚ)ˣ ↦ (u : 𝓞 ℚ)) hzUnits + have hzSign := congrArg Rat.ringOfIntegersEquiv hzIntegers + have hzSquare : rationalQuadraticRootValue z ^ 2 = 1 := by + simpa only [rationalQuadraticRootValue, map_pow, map_one] using hzSign + exact (sq_eq_one_iff).mp hzSquare + +open scoped Classical in +/-- The chosen integral numerator remains nonzero after passing to the +standard residue field `ZMod p`. -/ +theorem rationalPrimeResidue_intCast_ne_zero + (p : Nat.Primes) (a : 𝓞 ℚ) + (ha : a ∉ (RayClass.rationalPrime p).asIdeal) : + (Rat.ringOfIntegersEquiv a : ZMod p.1) ≠ 0 := by + intro haz + apply ha + rw [← Ideal.Quotient.eq_zero_iff_mem] + apply (rationalPrimeResidueEquivZMod p).injective + simpa only [rationalPrimeResidueEquivZMod_mk, map_zero] using haz + +open scoped Classical in +/-- A square among residue units is exactly a square in the standard rational +prime residue field. The reverse implication constructs the unit from the +nonzero square root. -/ +theorem rationalPrimeResidueUnit_sq_iff_isSquare + (p : Nat.Primes) (a : 𝓞 ℚ) + (ha : a ∉ (RayClass.rationalPrime p).asIdeal) : + (∃ u : (𝓞 ℚ ⧸ (RayClass.rationalPrime p).asIdeal)ˣ, + u ^ 2 = primeIdealResidueUnit ℚ (RayClass.rationalPrime p) a ha) ↔ + IsSquare (Rat.ringOfIntegersEquiv a : ZMod p.1) := by + let e := rationalPrimeResidueEquivZMod p + constructor + · rintro ⟨u, hu⟩ + refine ⟨e (u : 𝓞 ℚ ⧸ (RayClass.rationalPrime p).asIdeal), ?_⟩ + have hu' := congrArg + (fun x : (𝓞 ℚ ⧸ (RayClass.rationalPrime p).asIdeal)ˣ ↦ + e (x : 𝓞 ℚ ⧸ (RayClass.rationalPrime p).asIdeal)) hu + simpa [e, pow_two, primeIdealResidueUnit, + rationalPrimeResidueEquivZMod_mk] using hu'.symm + · rintro ⟨x, hx⟩ + have haZ : (Rat.ringOfIntegersEquiv a : ZMod p.1) ≠ 0 := + rationalPrimeResidue_intCast_ne_zero p a ha + have hxne : x ≠ 0 := by + intro hxzero + apply haZ + simpa [hxzero] using hx + let u : (𝓞 ℚ ⧸ (RayClass.rationalPrime p).asIdeal)ˣ := + Units.map e.symm.toRingHom (Units.mk0 x hxne) + refine ⟨u, ?_⟩ + apply Units.ext + apply e.injective + simpa [u, e, pow_two, primeIdealResidueUnit, + rationalPrimeResidueEquivZMod_mk] using hx.symm + +open scoped Classical in +/-- The quadratic prime-ideal power-residue symbol over `ℚ`, evaluated as an +integer sign, is the classical Legendre symbol. -/ +theorem rationalPrimeIdealPowerResidueSymbol_two_eq_legendre + (p : Nat.Primes) (hp : p.1 ≠ 2) + (a : 𝓞 ℚ) (ha : a ∉ (RayClass.rationalPrime p).asIdeal) : + rationalQuadraticRootValue + (primeIdealPowerResidueSymbol ℚ (RayClass.rationalPrime p) + (2 : ℕ+) rationalQuadraticPrimitiveRoots_nonempty + (absNorm_rationalPrime_coprime_two p hp) a ha) = + legendreSym p.1 (Rat.ringOfIntegersEquiv a) := by + let z := + primeIdealPowerResidueSymbol ℚ (RayClass.rationalPrime p) + (2 : ℕ+) rationalQuadraticPrimitiveRoots_nonempty + (absNorm_rationalPrime_coprime_two p hp) a ha + have haZ : (Rat.ringOfIntegersEquiv a : ZMod p.1) ≠ 0 := + rationalPrimeResidue_intCast_ne_zero p a ha + have hzOne : z = 1 ↔ legendreSym p.1 (Rat.ringOfIntegersEquiv a) = 1 := by + calc + z = 1 ↔ + ∃ u : (𝓞 ℚ ⧸ (RayClass.rationalPrime p).asIdeal)ˣ, + u ^ 2 = primeIdealResidueUnit ℚ + (RayClass.rationalPrime p) a ha := + primeIdealPowerResidueSymbol_eq_one_iff ℚ + (RayClass.rationalPrime p) (2 : ℕ+) + rationalQuadraticPrimitiveRoots_nonempty + (absNorm_rationalPrime_coprime_two p hp) a ha + _ ↔ IsSquare (Rat.ringOfIntegersEquiv a : ZMod p.1) := + rationalPrimeResidueUnit_sq_iff_isSquare p a ha + _ ↔ legendreSym p.1 (Rat.ringOfIntegersEquiv a) = 1 := + (legendreSym.eq_one_iff p.1 haZ).symm + rcases rationalQuadraticRootValue_eq_one_or_neg_one z with hz | hz + · have hzRoot : z = 1 := + (rationalQuadraticRootValue_eq_one_iff z).1 hz + calc + rationalQuadraticRootValue z = 1 := hz + _ = legendreSym p.1 (Rat.ringOfIntegersEquiv a) := + (hzOne.1 hzRoot).symm + · rcases legendreSym.eq_one_or_neg_one p.1 haZ with hleg | hleg + · have hzRoot : z = 1 := hzOne.2 hleg + have hzValue : rationalQuadraticRootValue z = 1 := + (rationalQuadraticRootValue_eq_one_iff z).2 hzRoot + have hcontr : (1 : ℤ) = -1 := hzValue.symm.trans hz + norm_num at hcontr + · exact hz.trans hleg.symm + +/-! ## Rational principal-ideal factorization -/ + +open scoped Classical in +/-- The principal ideal of `𝓞 ℚ` generated by a natural number, expressed +through the canonical equivalence `𝓞 ℚ ≃+* ℤ`. -/ +noncomputable def rationalPrincipalIdeal (b : ℕ) : Ideal (𝓞 ℚ) := + Ideal.span {Rat.ringOfIntegersEquiv.symm (b : ℤ)} + +open scoped Classical in +/-- A positive rational principal ideal is nonzero. -/ +theorem rationalPrincipalIdeal_ne_zero + (b : ℕ) (hb : b ≠ 0) : + rationalPrincipalIdeal b ≠ 0 := by + unfold rationalPrincipalIdeal + apply ideal_span_singleton_ne_zero ℚ + have hbInt : (b : ℤ) ≠ 0 := Int.ofNat_ne_zero.mpr hb + have h := Rat.ringOfIntegersEquiv.symm.injective.ne hbInt + simpa only [map_zero] using h + +open scoped Classical in +/-- The height-one prime of `𝓞 ℚ` attached to `p` is generated by the +corresponding rational integer. -/ +theorem rationalPrime_asIdeal_eq_span + (p : Nat.Primes) : + (RayClass.rationalPrime p).asIdeal = + Ideal.span {Rat.ringOfIntegersEquiv.symm (p.1 : ℤ)} := by + let v : HeightOneSpectrum (𝓞 ℚ) := + RayClass.rationalPrime p + have hIntEquiv : + Rat.IsIntegralClosure.intEquiv (𝓞 ℚ) = + Rat.ringOfIntegersEquiv := by + ext x + exact + Rat.IsIntegralClosure.intEquiv_apply_eq_ringOfIntegersEquiv x + have hspan : + Ideal.span {(p.1 : ℤ)} = + v.asIdeal.map Rat.ringOfIntegersEquiv := by + simpa only [v, RayClass.natGenerator_rationalPrime, + hIntEquiv] using + Rat.HeightOneSpectrum.span_natGenerator v + apply + ((RingEquiv.idealComapOrderIso + Rat.ringOfIntegersEquiv).symm).injective + simp only [RingEquiv.idealComapOrderIso_symm_apply] + calc + (RayClass.rationalPrime p).asIdeal.map + Rat.ringOfIntegersEquiv = + Ideal.span {(p.1 : ℤ)} := by + simpa only [v] using hspan.symm + _ = + (Ideal.span + {Rat.ringOfIntegersEquiv.symm (p.1 : ℤ)}).map + Rat.ringOfIntegersEquiv := by + rw [Ideal.map_span, Set.image_singleton, + Rat.ringOfIntegersEquiv.apply_symm_apply] + +open scoped Classical in +/-- Divisibility of a rational principal ideal by the prime over `p` is +exactly natural-number divisibility by `p`. -/ +theorem rationalPrime_dvd_rationalPrincipalIdeal_iff + (p : Nat.Primes) (b : ℕ) : + (RayClass.rationalPrime p).asIdeal ∣ rationalPrincipalIdeal b ↔ + p.1 ∣ b := by + rw [rationalPrincipalIdeal, rationalPrime_asIdeal_eq_span, + Ideal.dvd_iff_le, Ideal.span_singleton_le_span_singleton, + map_dvd_iff Rat.ringOfIntegersEquiv.symm, + Int.natCast_dvd_natCast] + +open scoped Classical in +/-- Every prime divisor of an odd rational principal ideal has odd residue +characteristic. Thus its norm is coprime to the quadratic exponent. -/ +theorem rationalPrincipalIdeal_absNorm_coprime_two_of_odd + (b : ℕ) (hbOdd : Odd b) + (P : HeightOneSpectrum (𝓞 ℚ)) + (hP : P.asIdeal ∣ rationalPrincipalIdeal b) : + (Ideal.absNorm P.asIdeal).Coprime 2 := by + let p : Nat.Primes := + ⟨Rat.HeightOneSpectrum.natGenerator P, + Rat.HeightOneSpectrum.prime_natGenerator P⟩ + have hprimeEq : RayClass.rationalPrime p = P := by + exact + (Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ)).symm_apply_apply P + have hpIdealDvd : + (RayClass.rationalPrime p).asIdeal ∣ + rationalPrincipalIdeal b := by + rw [hprimeEq] + exact hP + have hpDvd : p.1 ∣ b := + (rationalPrime_dvd_rationalPrincipalIdeal_iff p b).mp hpIdealDvd + have hpNeTwo : p.1 ≠ 2 := by + intro hpTwo + apply hbOdd.not_two_dvd_nat + simpa only [hpTwo] using hpDvd + rw [← hprimeEq] + exact absNorm_rationalPrime_coprime_two p hpNeTwo + +open scoped Classical in +/-- Coprimality of the integer numerator and the natural denominator excludes +the numerator from every prime ideal dividing the denominator ideal. -/ +theorem rationalPrincipalIdeal_numerator_not_mem_of_coprime + (a : 𝓞 ℚ) (b : ℕ) + (hab : Nat.Coprime + (Rat.ringOfIntegersEquiv a).natAbs b) + (P : HeightOneSpectrum (𝓞 ℚ)) + (hP : P.asIdeal ∣ rationalPrincipalIdeal b) : + a ∉ P.asIdeal := by + intro haP + let p : Nat.Primes := + ⟨Rat.HeightOneSpectrum.natGenerator P, + Rat.HeightOneSpectrum.prime_natGenerator P⟩ + have hprimeEq : RayClass.rationalPrime p = P := by + exact + (Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ)).symm_apply_apply P + have hpIdealDvd : + (RayClass.rationalPrime p).asIdeal ∣ + rationalPrincipalIdeal b := by + rw [hprimeEq] + exact hP + have hpDvdB : p.1 ∣ b := + (rationalPrime_dvd_rationalPrincipalIdeal_iff p b).mp hpIdealDvd + have hpCoprimeA : + Nat.Coprime p.1 (Rat.ringOfIntegersEquiv a).natAbs := + (hab.of_dvd_right hpDvdB).symm + have hpNotDvdA : + ¬ p.1 ∣ (Rat.ringOfIntegersEquiv a).natAbs := + p.2.coprime_iff_not_dvd.mp hpCoprimeA + apply hpNotDvdA + have haPrime : + a ∈ (RayClass.rationalPrime p).asIdeal := by + rw [hprimeEq] + exact haP + rw [rationalPrime_asIdeal_eq_span, + Ideal.mem_span_singleton] at haPrime + have hpDvdInt : + (p.1 : ℤ) ∣ Rat.ringOfIntegersEquiv a := by + apply (map_dvd_iff Rat.ringOfIntegersEquiv.symm).mp + simpa only [Rat.ringOfIntegersEquiv.symm_apply_apply] using haPrime + exact Int.natCast_dvd.mp hpDvdInt + +open scoped Classical in +/-- The multiplicity of the rational prime ideal over `p` in `(b)` is the +usual `p`-adic exponent in the natural-number factorization of `b`. -/ +theorem idealPrimeMultiplicity_rationalPrincipalIdeal + (p : Nat.Primes) (b : ℕ) (hb : b ≠ 0) : + idealPrimeMultiplicity ℚ (RayClass.rationalPrime p) + (rationalPrincipalIdeal b) = + b.factorization p.1 := by + let e := Rat.ringOfIntegersEquiv + let x : 𝓞 ℚ := e.symm (p.1 : ℤ) + let a : 𝓞 ℚ := e.symm (b : ℤ) + have hpInt : Prime (p.1 : ℤ) := + Int.prime_iff_natAbs_prime.mpr (by simpa using p.2) + have hxPrime : Prime x := by + exact (MulEquiv.prime_iff e.symm).mpr hpInt + have hpow : x ^ b.factorization p.1 ∣ a := by + have hpowNat : p.1 ^ b.factorization p.1 ∣ b := + (p.2.pow_dvd_iff_le_factorization hb).mpr le_rfl + have hpowInt : + (p.1 : ℤ) ^ b.factorization p.1 ∣ (b : ℤ) := by + exact_mod_cast hpowNat + simpa only [x, a, ← map_pow, + map_dvd_iff e.symm] using hpowInt + have hpowSucc : ¬x ^ (b.factorization p.1 + 1) ∣ a := by + intro h + have hInt : + (p.1 : ℤ) ^ (b.factorization p.1 + 1) ∣ (b : ℤ) := by + simpa only [x, a, ← map_pow, + map_dvd_iff e.symm] using h + have hNat : p.1 ^ (b.factorization p.1 + 1) ∣ b := by + exact_mod_cast hInt + have hle := (p.2.pow_dvd_iff_le_factorization hb).mp hNat + omega + rw [idealPrimeMultiplicity, rationalPrincipalIdeal, + rationalPrime_asIdeal_eq_span] + simpa only [x, a] using + (Ideal.count_associates_eq' hxPrime hpow hpowSucc) + +open scoped Classical in +/-- Prime divisors of the rational principal ideal `(b)` are canonically the +natural prime factors of `b`. -/ +noncomputable def rationalPrincipalIdealPrimeDivisorsEquiv + (b : ℕ) (hb : b ≠ 0) : + idealPrimeDivisors ℚ (rationalPrincipalIdeal b) ≃ + b.primeFactors where + toFun P := + ⟨Rat.HeightOneSpectrum.natGenerator P.1, + (Nat.mem_primeFactors_of_ne_zero hb).mpr + ⟨Rat.HeightOneSpectrum.prime_natGenerator P.1, + (rationalPrime_dvd_rationalPrincipalIdeal_iff + ⟨Rat.HeightOneSpectrum.natGenerator P.1, + Rat.HeightOneSpectrum.prime_natGenerator P.1⟩ b).mp + (by + have hprimeEq : + RayClass.rationalPrime + ⟨Rat.HeightOneSpectrum.natGenerator P.1, + Rat.HeightOneSpectrum.prime_natGenerator P.1⟩ = + P.1 := + (Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ)).symm_apply_apply P.1 + rw [hprimeEq] + exact P.2)⟩⟩ + invFun p := + ⟨RayClass.rationalPrime + ⟨p.1, Nat.prime_of_mem_primeFactors p.2⟩, + (rationalPrime_dvd_rationalPrincipalIdeal_iff + ⟨p.1, Nat.prime_of_mem_primeFactors p.2⟩ b).mpr + (Nat.dvd_of_mem_primeFactors p.2)⟩ + left_inv P := by + apply Subtype.ext + have hq : + (⟨Rat.HeightOneSpectrum.natGenerator P.1, + Rat.HeightOneSpectrum.prime_natGenerator P.1⟩ : Nat.Primes) = + Rat.HeightOneSpectrum.primesEquiv P.1 := + Subtype.ext rfl + simpa only [RayClass.rationalPrime, hq] using + (Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).symm_apply_apply P.1 + right_inv p := by + apply Subtype.ext + exact + RayClass.natGenerator_rationalPrime + ⟨p.1, Nat.prime_of_mem_primeFactors p.2⟩ + +open scoped Classical in +/-- Reindexing a natural prime factor back to a height-one prime gives the +standard rational prime above it. -/ +@[simp] +theorem rationalPrincipalIdealPrimeDivisorsEquiv_symm_apply_val + (b : ℕ) (hb : b ≠ 0) (p : b.primeFactors) : + ((rationalPrincipalIdealPrimeDivisorsEquiv b hb).symm p).1 = + RayClass.rationalPrime + ⟨p.1, Nat.prime_of_mem_primeFactors p.2⟩ := + rfl + +open scoped Classical in +/-- Under the prime-factor reindexing, ideal multiplicity becomes the +corresponding entry of `Nat.factorization`. -/ +theorem idealPrimeMultiplicity_rationalPrincipalIdeal_reindexed + (b : ℕ) (hb : b ≠ 0) (p : b.primeFactors) : + idealPrimeMultiplicity ℚ + ((rationalPrincipalIdealPrimeDivisorsEquiv b hb).symm p).1 + (rationalPrincipalIdeal b) = + b.factorization p.1 := by + rw [rationalPrincipalIdealPrimeDivisorsEquiv_symm_apply_val b hb p] + exact idealPrimeMultiplicity_rationalPrincipalIdeal + ⟨p.1, Nat.prime_of_mem_primeFactors p.2⟩ b hb + +open scoped Classical in +/-- Reindex a product over the prime divisors of `(b)` by the ordinary +natural prime factors of `b`. -/ +theorem prod_rationalPrincipalIdealPrimeDivisors_eq_prod_primeFactors + {M : Type*} [CommMonoid M] + (b : ℕ) (hb : b ≠ 0) + (f : HeightOneSpectrum (𝓞 ℚ) → M) : + letI : Fintype + (idealPrimeDivisors ℚ (rationalPrincipalIdeal b)) := + (idealPrimeDivisors_finite ℚ (rationalPrincipalIdeal b) + (rationalPrincipalIdeal_ne_zero b hb)).fintype + (∏ P : idealPrimeDivisors ℚ (rationalPrincipalIdeal b), f P.1) = + ∏ p : b.primeFactors, + f ((rationalPrincipalIdealPrimeDivisorsEquiv b hb).symm p).1 := by + let : Fintype + (idealPrimeDivisors ℚ (rationalPrincipalIdeal b)) := + (idealPrimeDivisors_finite ℚ (rationalPrincipalIdeal b) + (rationalPrincipalIdeal_ne_zero b hb)).fintype + exact + Fintype.prod_equiv + (rationalPrincipalIdealPrimeDivisorsEquiv b hb) + (fun P => f P.1) + (fun p => f ((rationalPrincipalIdealPrimeDivisorsEquiv b hb).symm p).1) + (fun P => by + rw [(rationalPrincipalIdealPrimeDivisorsEquiv b hb).symm_apply_apply]) + +open scoped Classical in +/-- Reindex a product whose factor also depends on the divisibility witness. +This is the subtype-valued form used by the defining product of the ideal +power-residue symbol. -/ +theorem prod_rationalPrincipalIdealPrimeDivisors_eq_prod_primeFactors_subtype + {M : Type*} [CommMonoid M] + (b : ℕ) (hb : b ≠ 0) + (f : idealPrimeDivisors ℚ (rationalPrincipalIdeal b) → M) : + letI : Fintype + (idealPrimeDivisors ℚ (rationalPrincipalIdeal b)) := + (idealPrimeDivisors_finite ℚ (rationalPrincipalIdeal b) + (rationalPrincipalIdeal_ne_zero b hb)).fintype + (∏ P : idealPrimeDivisors ℚ (rationalPrincipalIdeal b), f P) = + ∏ p : b.primeFactors, + f ((rationalPrincipalIdealPrimeDivisorsEquiv b hb).symm p) := by + let : Fintype + (idealPrimeDivisors ℚ (rationalPrincipalIdeal b)) := + (idealPrimeDivisors_finite ℚ (rationalPrincipalIdeal b) + (rationalPrincipalIdeal_ne_zero b hb)).fintype + exact + Fintype.prod_equiv + (rationalPrincipalIdealPrimeDivisorsEquiv b hb) + f + (fun p => + f ((rationalPrincipalIdealPrimeDivisorsEquiv b hb).symm p)) + (fun P => by + rw [(rationalPrincipalIdealPrimeDivisorsEquiv b hb).symm_apply_apply]) + +open scoped Classical in +/-- The list-based Jacobi symbol is the product over distinct prime factors, +with the usual natural factorization multiplicity as exponent. -/ +theorem jacobiSym_eq_prod_primeFactors_factorization + (a : ℤ) (b : ℕ) : + jacobiSym a b = + ∏ p : b.primeFactors, + (@legendreSym p.1 + ⟨Nat.prime_of_mem_primeFactors p.2⟩ a) ^ + b.factorization p.1 := by + let f : ℕ → ℤ := fun p => + if hp : p.Prime then @legendreSym p ⟨hp⟩ a else 1 + rw [jacobiSym] + have hmap : + b.primeFactorsList.pmap + (fun p pp => @legendreSym p ⟨pp⟩ a) + (fun _ hp => Nat.prime_of_mem_primeFactorsList hp) = + b.primeFactorsList.map f := by + rw [← List.pmap_eq_map + (fun _ hp => Nat.prime_of_mem_primeFactorsList hp)] + apply List.pmap_congr_left + intro p hp hprime _ + simp only [f, dite_eq_left hprime] + rw [hmap, Finset.prod_list_map_count] + have hrhs : + (∏ p : b.primeFactors, + (@legendreSym p.1 + ⟨Nat.prime_of_mem_primeFactors p.2⟩ a) ^ + b.factorization p.1) = + ∏ p : b.primeFactors, f p.1 ^ b.factorization p.1 := by + apply Fintype.prod_congr + intro p + have hpPrime : p.1.Prime := + Nat.prime_of_mem_primeFactors p.2 + simp only [f, dite_eq_left hpPrime] + rw [hrhs] + calc + _ = ∏ p ∈ b.primeFactors, + f p ^ b.factorization p := by + apply Finset.prod_congr rfl + intro p hp + simp only [Nat.primeFactorsList_count_eq] + _ = ∏ p : b.primeFactors, + f p.1 ^ b.factorization p.1 := + (Finset.prod_coe_sort b.primeFactors + (fun p => f p ^ b.factorization p)).symm + +open scoped Classical in +private theorem rationalQuadraticPrimitiveRoots_nonempty_pnat : + (primitiveRoots (((2 : ℕ+) : ℕ)) ℚ).Nonempty := by + change (primitiveRoots 2 ℚ).Nonempty + exact rationalQuadraticPrimitiveRoots_nonempty + +open scoped Classical in +private def rationalQuadraticRootValuePNatMonoidHom : + rootsOfUnity (((2 : ℕ+) : ℕ)) (𝓞 ℚ) →* ℤ := by + change rootsOfUnity 2 (𝓞 ℚ) →* ℤ + exact rationalQuadraticRootValueMonoidHom + +open scoped Classical in +private noncomputable def rationalIdealQuadraticSourceFactor + (a : 𝓞 ℚ) (b : ℕ) (hbOdd : Odd b) + (hab : Nat.Coprime (Rat.ringOfIntegersEquiv a).natAbs b) + (P : idealPrimeDivisors ℚ (rationalPrincipalIdeal b)) : ℤ := + Rat.ringOfIntegersEquiv + ((primeIdealPowerResidueSymbol ℚ P.1 (2 : ℕ+) + rationalQuadraticPrimitiveRoots_nonempty_pnat + (by + change + (Ideal.absNorm P.1.asIdeal).Coprime 2 + exact rationalPrincipalIdeal_absNorm_coprime_two_of_odd + b hbOdd P.1 + ((mem_idealPrimeDivisors ℚ (rationalPrincipalIdeal b) P.1).mp P.2)) + a + (rationalPrincipalIdeal_numerator_not_mem_of_coprime + a b hab P.1 + ((mem_idealPrimeDivisors ℚ (rationalPrincipalIdeal b) P.1).mp P.2))).1.1 ^ + idealPrimeMultiplicity ℚ P.1 (rationalPrincipalIdeal b)) + +open scoped Classical in +private def rationalJacobiPrimeFactor + (a : 𝓞 ℚ) (b : ℕ) (p : b.primeFactors) : ℤ := + @legendreSym p.1 ⟨Nat.prime_of_mem_primeFactors p.2⟩ + (Rat.ringOfIntegersEquiv a) ^ b.factorization p.1 + +open scoped Classical in +private theorem rationalIdealQuadraticSourceFactor_reindexed + (a : 𝓞 ℚ) (b : ℕ) (hb : b ≠ 0) (hbOdd : Odd b) + (hab : Nat.Coprime (Rat.ringOfIntegersEquiv a).natAbs b) + (p : b.primeFactors) : + rationalIdealQuadraticSourceFactor a b hbOdd hab + ((rationalPrincipalIdealPrimeDivisorsEquiv b hb).symm p) = + rationalJacobiPrimeFactor a b p := by + unfold rationalIdealQuadraticSourceFactor rationalJacobiPrimeFactor + rw [map_pow] + rw [idealPrimeMultiplicity_rationalPrincipalIdeal_reindexed b hb p] + have hpNeTwo : p.1 ≠ 2 := by + intro hpTwo + apply hbOdd.not_two_dvd_nat + simpa only [hpTwo] using Nat.dvd_of_mem_primeFactors p.2 + let P := (rationalPrincipalIdealPrimeDivisorsEquiv b hb).symm p + have hLegendre := + rationalPrimeIdealPowerResidueSymbol_two_eq_legendre + ⟨p.1, Nat.prime_of_mem_primeFactors p.2⟩ hpNeTwo a + (rationalPrincipalIdeal_numerator_not_mem_of_coprime + a b hab P.1 P.2) + rw [← hLegendre] + rfl + +open scoped Classical in +/-- The quadratic ideal power-residue symbol of a positive rational +principal ideal is the classical Jacobi symbol. Oddness supplies the +residue-characteristic condition at every denominator prime, while ordinary +natural coprimality supplies numerator nonvanishing. -/ +theorem rationalIdealPowerResidueSymbol_two_eq_jacobiSym + (a : 𝓞 ℚ) (b : ℕ) (hb : b ≠ 0) + (hbOdd : Odd b) + (hab : Nat.Coprime + (Rat.ringOfIntegersEquiv a).natAbs b) : + rationalQuadraticRootValue + (idealPowerResidueSymbol ℚ + (rationalPrincipalIdeal b) + (rationalPrincipalIdeal_ne_zero b hb) + (2 : ℕ+) (by exact rationalQuadraticPrimitiveRoots_nonempty_pnat) a + (by + intro P hP + change (Ideal.absNorm P.asIdeal).Coprime 2 + exact rationalPrincipalIdeal_absNorm_coprime_two_of_odd + b hbOdd P hP) + (rationalPrincipalIdeal_numerator_not_mem_of_coprime a b hab)) = + jacobiSym (Rat.ringOfIntegersEquiv a) b := by + let : Fintype + (idealPrimeDivisors ℚ (rationalPrincipalIdeal b)) := + (idealPrimeDivisors_finite ℚ (rationalPrincipalIdeal b) + (rationalPrincipalIdeal_ne_zero b hb)).fintype + rw [idealPowerResidueSymbol_eq_prod] + change rationalQuadraticRootValuePNatMonoidHom _ = _ + rw [map_prod] + change + (∏ P : idealPrimeDivisors ℚ (rationalPrincipalIdeal b), + rationalIdealQuadraticSourceFactor a b hbOdd hab P) = _ + rw [ + prod_rationalPrincipalIdealPrimeDivisors_eq_prod_primeFactors_subtype + b hb (rationalIdealQuadraticSourceFactor a b hbOdd hab), + jacobiSym_eq_prod_primeFactors_factorization] + apply Fintype.prod_congr + intro p + exact rationalIdealQuadraticSourceFactor_reindexed + a b hb hbOdd hab p + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ProductFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ProductFormula.lean new file mode 100644 index 0000000000..54996d2744 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ProductFormula.lean @@ -0,0 +1,198 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteLocalFamily +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel +/-! +# The local--global norm-symbol bridge + +This file isolates the exact quotient calculation used by the Hilbert-symbol +product formula. The one-place embedding sends the chosen local norm group +directly into the ordinary idele-class norm group, so it descends without an +intermediate raw-idele quotient. The resulting character identity gives the +finite-support and +principal-idèle product identities for every character of that target. +-/ + +@[expose] public section + +open scoped NumberField BigOperators +open NumberField IsDedekindDomain +open IdeleGroup RelativeIdeleGroup + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open scoped Classical in +private theorem productFormulaIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +attribute [local instance] productFormulaIdeleClassGroupIsMulCommutative + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +open scoped Classical in +/-- The one-place embedding, descended directly from the chosen local norm +quotient to the ordinary idele-class norm quotient. -/ +noncomputable def finitePlaceNormQuotientToGlobalClass + (v : HeightOneSpectrum (𝓞 K)) : + ChosenFinitePlaceNormQuotient + (K := K) (L := L) v →* + IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range := + QuotientGroup.lift + (chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v) + ((globalNormClassFromIdele K L).comp + (finitePlaceIdele v)) + (by + intro x hx + have hnorm : + finitePlaceIdele v x ∈ + ideleNormSubgroup (K := K) (L := L) := + (finitePlaceIdele_mem_ideleNormSubgroup_iff_chosenLocalNorm + (K := K) (L := L) v x).2 hx + obtain ⟨z, hz⟩ := hnorm + change + QuotientGroup.mk' + (_root_.ideleClassNorm K L).range + (QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (finitePlaceIdele v x)) = 1 + apply (QuotientGroup.eq_one_iff _).2 + refine + ⟨QuotientGroup.mk' + (IdeleGroup.principalSubgroup L) + (relativeIdeleBaseChangeMulEquiv + (K := K) (L := L) z), ?_⟩ + rw [_root_.ideleClassNorm_mk, + IdeleGroup.norm_relativeIdeleBaseChangeMulEquiv, + hz]) + +open scoped Classical in +/-- Exact local--global compatibility on representatives. -/ +@[simp] +theorem finitePlaceNormQuotientToGlobalClass_localClass + (v : HeightOneSpectrum (𝓞 K)) + (a : (v.adicCompletion K)ˣ) : + finitePlaceNormQuotientToGlobalClass + (K := K) (L := L) v + (finitePlaceTensorNormClass + (K := K) (L := L) v a) = + globalNormClassFromIdele K L + (finitePlaceIdele v a) := by + rfl + +omit [FiniteDimensional K L] [IsGalois K L] in +open scoped Classical in +/-- A character of the global class norm quotient, restricted to the +one-place class at `v`. -/ +noncomputable def finitePlaceGlobalSymbol + {A : Type*} [CommGroup A] + (chi : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) →* A) + (v : HeightOneSpectrum (𝓞 K)) : + (v.adicCompletion K)ˣ →* A := + chi.comp + ((globalNormClassFromIdele K L).comp + (finitePlaceIdele v)) + +open scoped Classical in +/-- The one-place global symbol is the character of the transported local norm +class. -/ +@[simp] +theorem finitePlaceGlobalSymbol_eq_localNormClass + {A : Type*} [CommGroup A] + (chi : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) →* A) + (v : HeightOneSpectrum (𝓞 K)) + (a : (v.adicCompletion K)ˣ) : + finitePlaceGlobalSymbol (K := K) (L := L) chi v a = + chi + (finitePlaceNormQuotientToGlobalClass + (K := K) (L := L) v + (finitePlaceTensorNormClass + (K := K) (L := L) v a)) := by + rw [finitePlaceGlobalSymbol, MonoidHom.comp_apply, + MonoidHom.comp_apply, + finitePlaceNormQuotientToGlobalClass_localClass] + +omit [FiniteDimensional K L] [IsGalois K L] in +open scoped Classical in +/-- Finite-support form of the product formula for a global norm-quotient +character. -/ +theorem finitePlaceGlobalSymbol_finiteLocalFamily + {A : Type*} [CommGroup A] + (chi : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) →* A) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (a : ∀ v : ↥S, (v.1.adicCompletion K)ˣ) : + ∏ v : ↥S, + finitePlaceGlobalSymbol (K := K) (L := L) chi v.1 (a v) = + chi + (globalNormClassFromIdele K L + (IdeleGroup.ideleOfFiniteLocalFamily S a)) := by + let : CommGroup (IdeleClassGroup K) := + QuotientGroup.Quotient.commGroup (IdeleGroup.principalSubgroup K) + rw [globalNormClass_finiteLocalFamily] + rw [map_prod] + rfl + +omit [FiniteDimensional K L] [IsGalois K L] in +open scoped Classical in +/-- A global norm-quotient character is trivial on a principal idèle. -/ +theorem globalNormQuotientCharacter_principal + {A : Type*} [CommGroup A] + (chi : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) →* A) + (x : Kˣ) : + chi + (globalNormClassFromIdele K L + (IdeleGroup.principalIdele K x)) = 1 := by + rw [globalNormClassFromIdele_principalIdele, map_one] + +omit [FiniteDimensional K L] [IsGalois K L] in +open scoped Classical in +/-- Exact bridge from a finite local representative of a principal global +norm class to the product-one identity. The premise is a concrete equality +in `C_K / N C_L`, not a product-formula assumption. -/ +theorem finitePlaceGlobalSymbol_product_eq_one_of_eq_principal + {A : Type*} [CommGroup A] + (chi : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) →* A) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (a : ∀ v : ↥S, (v.1.adicCompletion K)ˣ) + (x : Kˣ) + (hprincipal : + globalNormClassFromIdele K L + (IdeleGroup.ideleOfFiniteLocalFamily S a) = + globalNormClassFromIdele K L + (IdeleGroup.principalIdele K x)) : + ∏ v : ↥S, + finitePlaceGlobalSymbol (K := K) (L := L) chi v.1 (a v) = 1 := by + rw [finitePlaceGlobalSymbol_finiteLocalFamily] + rw [hprincipal] + exact globalNormQuotientCharacter_principal chi x + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicArithmeticProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicArithmeticProduct.lean new file mode 100644 index 0000000000..c6c4acf70e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicArithmeticProduct.lean @@ -0,0 +1,454 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalProduct +/-! +# The rational cyclotomic product formula in arithmetic normalization + +The arithmetic norm-residue symbol sends an ordinary unramified +uniformizer to arithmetic Frobenius. At the ramified prime of a +prime-power cyclotomic layer, a local unit `u` therefore acts by +`u⁻¹`. This file records those two signs on the actual chosen local +Artin maps and proves the finite principal-idèle product formula in +that normalization. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open scoped Classical in +/-- The prime subtype supplies the primality instance used at this local factor. -/ +local instance rationalCyclotomicArithmeticProductPrimeFact (q : Nat.Primes) : Fact q.1.Prime := + ⟨q.2⟩ + +attribute [local instance] rationalCyclotomicArithmeticProductPrimeFact + +open scoped Classical in +/-- The positive cyclotomic level has nonzero underlying natural number. -/ +local instance rationalCyclotomicArithmeticProductPositiveLevelNeZero (m : ℕ+) : NeZero (m : ℕ) := + ⟨m.ne_zero⟩ + +attribute [local instance] rationalCyclotomicArithmeticProductPositiveLevelNeZero + +section ArbitraryCyclotomicLevel + +open scoped Classical in +noncomputable local instance + rationalCyclotomicArithmeticLevelFiniteDimensional + (m : ℕ+) : + FiniteDimensional ℚ + (KummerTheory.rationalCyclotomicLevel m) := + IsCyclotomicExtension.finiteDimensional + {(m : ℕ)} ℚ (KummerTheory.rationalCyclotomicLevel m) + +attribute [local instance] rationalCyclotomicArithmeticLevelFiniteDimensional + +open scoped Classical in +noncomputable local instance + rationalCyclotomicArithmeticLevelIsAbelianGalois + (m : ℕ+) : + IsAbelianGalois ℚ + (KummerTheory.rationalCyclotomicLevel m) := + rationalCyclotomicLevelIsAbelianGalois m + +attribute [local instance] rationalCyclotomicArithmeticLevelIsAbelianGalois + +open scoped Classical in +/-- Mapping an arithmetic chosen local symbol to a cyclotomic +coordinate only inverts the corresponding geometric coordinate. This +small opaque boundary keeps the full chosen-Artin expressions out of +the finite-product congruence below. -/ +private theorem + galEquivZMod_arithmeticChosenFinitePlaceArtinMonoidHom_eq_inv + (m : ℕ+) (v : HeightOneSpectrum (𝓞 ℚ)) + (x : (v.adicCompletion ℚ)ˣ) : + IsCyclotomicExtension.Rat.galEquivZMod + (m : ℕ) + (KummerTheory.rationalCyclotomicLevel m) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension m) + (arithmeticChosenFinitePlaceArtinMonoidHom + ℚ (KummerTheory.rationalCyclotomicLevel m) v x) = + (IsCyclotomicExtension.Rat.galEquivZMod + (m : ℕ) + (KummerTheory.rationalCyclotomicLevel m) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension m) + (chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel m) + v x))⁻¹ := by + rw [arithmeticChosenFinitePlaceArtinMonoidHom_apply, map_inv] + +open scoped Classical in +/-- For an arbitrary chosen local input away from the conductor, the +arithmetic cyclotomic character is `q` raised to the negative of the +absolute-value logarithmic valuation. Thus an ordinary DVR +uniformizer, whose logarithmic value is `-1`, maps to `q`. -/ +theorem + galEquivZMod_arithmeticChosenFinitePlaceArtinMonoidHom_of_not_dvd + (m : ℕ+) (q : Nat.Primes) + (hq : ¬ q.1 ∣ (m : ℕ)) + (x : ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) : + IsCyclotomicExtension.Rat.galEquivZMod + (m : ℕ) + (KummerTheory.rationalCyclotomicLevel m) + (arithmeticChosenFinitePlaceArtinMonoidHom + ℚ (KummerTheory.rationalCyclotomicLevel m) + (RayClass.rationalPrime q) x) = + (ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr hq)) ^ + (- + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + (Additive.ofMul + ((finitePlaceCompletionUnitsContinuousMulEquiv + (RayClass.rationalPrime q)).symm x))) := by + rw [arithmeticChosenFinitePlaceArtinMonoidHom_apply, + map_inv, + galEquivZMod_chosenFinitePlaceArtinMonoidHom_of_not_dvd + m q hq x, + ← zpow_neg] + +open scoped Classical in +/-- Away from the conductor, the arithmetic local Artin character of +a rational principal component is the usual positive valuation power +of arithmetic Frobenius. -/ +theorem + galEquivZMod_arithmeticChosenFinitePlaceArtinMonoidHom_principal_of_not_dvd + (m : ℕ+) (q : Nat.Primes) + (hq : ¬ q.1 ∣ (m : ℕ)) (x : ℚˣ) : + IsCyclotomicExtension.Rat.galEquivZMod + (m : ℕ) + (KummerTheory.rationalCyclotomicLevel m) + (arithmeticChosenFinitePlaceArtinMonoidHom + ℚ (KummerTheory.rationalCyclotomicLevel m) + (RayClass.rationalPrime q) + (IdeleGroup.finiteComponent + (RayClass.rationalPrime q) + (IdeleGroup.principalIdele ℚ x))) = + (ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr hq)) ^ + padicValRat q.1 (x : ℚ) := by + rw [arithmeticChosenFinitePlaceArtinMonoidHom_apply, + map_inv, + galEquivZMod_chosenFinitePlaceArtinMonoidHom_principal_of_not_dvd + m q hq x] + rw [← zpow_neg, neg_neg] + +end ArbitraryCyclotomicLevel + +open scoped Classical in +/-- The arithmetic chosen finite-place character of a rational +principal idèle at the prime `q`. -/ +noncomputable def + rationalCyclotomicArithmeticPrincipalFinitePlaceCharacter + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) (q : Nat.Primes) : + (ZMod (p.1 ^ k))ˣ := + (rationalCyclotomicPrincipalFinitePlaceCharacter p k x q)⁻¹ + +open scoped Classical in +/-- Arithmetic and geometric finite-place characters differ exactly +by inversion. -/ +@[simp] +theorem + rationalCyclotomicArithmeticPrincipalFinitePlaceCharacter_eq_inv + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) (q : Nat.Primes) : + rationalCyclotomicArithmeticPrincipalFinitePlaceCharacter + p k x q = + (rationalCyclotomicPrincipalFinitePlaceCharacter + p k x q)⁻¹ := by + rfl + +open scoped Classical in +/-- Outside the ordinary rational prime-factorization support, the +arithmetic local factor is trivial. -/ +theorem + rationalCyclotomicArithmeticPrincipalFinitePlaceCharacter_eq_one_of_not_mem_support + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) (q : Nat.Primes) + (hq : + q ∉ rationalPrimeFactorizationPrimeSupport x p) : + rationalCyclotomicArithmeticPrincipalFinitePlaceCharacter + p k x q = + 1 := by + rw [ + rationalCyclotomicArithmeticPrincipalFinitePlaceCharacter_eq_inv, + rationalCyclotomicPrincipalFinitePlaceCharacter_eq_one_of_not_mem_support + p k x q hq, + inv_one] + +open scoped Classical in +/-- The arithmetic rational principal finite-place characters have +finite multiplicative support. -/ +theorem + rationalCyclotomicArithmeticPrincipalFinitePlaceCharacters_hasFiniteMulSupport + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) : + Function.HasFiniteMulSupport + (rationalCyclotomicArithmeticPrincipalFinitePlaceCharacter + p k x) := by + rw [Function.HasFiniteMulSupport] + apply + (rationalPrimeFactorizationPrimeSupport x p).finite_toSet.subset + intro q hq + by_contra hqSupport + exact hq + (rationalCyclotomicArithmeticPrincipalFinitePlaceCharacter_eq_one_of_not_mem_support + p k x q hqSupport) + +open scoped Classical in +/-- At a prime away from `p`, the arithmetic character is the direct +Frobenius power `q ^ v_q(x)`. -/ +theorem + rationalCyclotomicArithmeticPrincipalFinitePlaceCharacter_of_ne + (p q : Nat.Primes) (hqp : q ≠ p) + (k : ℕ) (x : ℚˣ) : + rationalCyclotomicArithmeticPrincipalFinitePlaceCharacter + p k x q = + (ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr + (rationalPrime_not_dvd_pow_of_ne q p hqp k))) ^ + padicValRat q.1 (x : ℚ) := by + rw [ + rationalCyclotomicArithmeticPrincipalFinitePlaceCharacter_eq_inv, + rationalCyclotomicPrincipalFinitePlaceCharacter_of_ne p q hqp k x, + zpow_neg, + inv_inv] + +open scoped Classical in +/-- At the ramified prime `p`, the arithmetic character is the inverse +of the actual reduced `p`-adic unit. -/ +theorem + rationalCyclotomicArithmeticPrincipalFinitePlaceCharacter_at_prime + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) : + rationalCyclotomicArithmeticPrincipalFinitePlaceCharacter + p k x p = + (Units.map (PadicInt.toZModPow k).toMonoidHom + (padicIntUnitOfRat p + (rationalPrimeUnit x p : ℚ) + (rationalPrimeUnit x p).ne_zero + (padicValRat_rationalPrimeUnit x p)))⁻¹ := by + rw [ + rationalCyclotomicArithmeticPrincipalFinitePlaceCharacter_eq_inv, + rationalCyclotomicPrincipalFinitePlaceCharacter_at_prime] + +open scoped Classical in +/-- The rational cyclotomic level is a number field. -/ +local instance rationalCyclotomicArithmeticProductPrimePowerLevelNumberField + (p : Nat.Primes) (k : ℕ) : + NumberField + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) := + KummerTheory.rationalCyclotomicLevel_numberField + ⟨p.1 ^ k, pow_pos p.2.pos k⟩ + +attribute [local instance] rationalCyclotomicArithmeticProductPrimePowerLevelNumberField + +open scoped Classical in +/-- A rational cyclotomic field of prime-power level is finite-dimensional over the rationals. -/ +local instance rationalCyclotomicArithmeticProductPrimePowerLevelFiniteDimensional + (p : Nat.Primes) (k : ℕ) : + FiniteDimensional ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) := + rationalCyclotomicPrincipalPrimeLevelFiniteDimensional + ⟨p.1 ^ k, pow_pos p.2.pos k⟩ + +attribute [local instance] rationalCyclotomicArithmeticProductPrimePowerLevelFiniteDimensional + +open scoped Classical in +/-- The rational cyclotomic level is an abelian Galois extension of the rationals. -/ +local instance rationalCyclotomicArithmeticProductPrimePowerLevelAbelianGalois + (p : Nat.Primes) (k : ℕ) : + IsAbelianGalois ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) := + rationalCyclotomicLevelIsAbelianGalois + ⟨p.1 ^ k, pow_pos p.2.pos k⟩ + +attribute [local instance] rationalCyclotomicArithmeticProductPrimePowerLevelAbelianGalois + +open scoped Classical in +/-- Pointwise inversion of the chosen local characters, assembled before +the public product formula so that its proof does not unfold the full +finite-product expressions during definitional equality checking. -/ +private theorem + rationalCyclotomicArithmeticPrincipalFinitePlaceProduct_eq_inv_geometric + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) : + (∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (arithmeticChosenFinitePlaceArtinMonoidHom + ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele ℚ x)))) = + (∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := + KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele ℚ x))))⁻¹ := by + calc + (∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (arithmeticChosenFinitePlaceArtinMonoidHom + ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele ℚ x)))) = + ∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + (IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := + KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele ℚ x))))⁻¹ := by + apply finprod_congr + intro v + exact + galEquivZMod_arithmeticChosenFinitePlaceArtinMonoidHom_eq_inv + ⟨p.1 ^ k, pow_pos p.2.pos k⟩ v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele ℚ x)) + _ = + (∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := + KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele ℚ x))))⁻¹ := by + rw [finprod_inv_distrib] + +open scoped Classical in +/-- The reduction of a rational sign is fixed by inversion. -/ +private theorem rationalSignPadicUnit_toZModPow_inv_eq_self + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) : + (Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p))⁻¹ = + Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p) := by + have hs : + Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p) * + Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p) = 1 := by + simpa only [pow_two] using + rationalSignPadicUnit_toZModPow_sq x p k + calc + (Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p))⁻¹ = + (Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p))⁻¹ * 1 := by + rw [mul_one] + _ = + (Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p))⁻¹ * + (Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p) * + Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p)) := by + rw [hs] + _ = + ((Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p))⁻¹ * + Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p)) * + Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p) := by + rw [mul_assoc] + _ = Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p) := by + rw [inv_mul_cancel, one_mul] + +open scoped Classical in +/-- At every prime-power cyclotomic level, the product of the actual +arithmetic finite-place characters of a rational principal idèle is +the reduction of its sign. -/ +theorem + rationalCyclotomicArithmeticPrincipalFinitePlaceProduct_eq_sign + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) : + (∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (arithmeticChosenFinitePlaceArtinMonoidHom + ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele ℚ x)))) = + Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p) := by + exact + (rationalCyclotomicArithmeticPrincipalFinitePlaceProduct_eq_inv_geometric + p k x).trans + ((congrArg (fun u => u⁻¹) + (rationalCyclotomicPrincipalFinitePlaceProduct_eq_sign p k x)).trans + (rationalSignPadicUnit_toZModPow_inv_eq_self p k x)) + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicCharacterRigidity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicCharacterRigidity.lean new file mode 100644 index 0000000000..2c0d749c00 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicCharacterRigidity.lean @@ -0,0 +1,82 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacterEquiv +/-! +# Rigidity of the rational cyclotomic character + +The actual rational cyclotomic character is detected by all of its +prime-power reductions. In particular, if every reduction of every +`p`-adic character coordinate has square one, then the underlying +automorphism of the full rational cyclotomic field has square one. +-/ + +@[expose] public section + + + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open scoped Classical in +/-- The prime subtype supplies the primality instance used at this local factor. -/ +local instance rationalCyclotomicCharacterRigidityPrimeFact (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +attribute [local instance] rationalCyclotomicCharacterRigidityPrimeFact + +open scoped Classical in +/-- An automorphism of the full rational cyclotomic field has square one +as soon as every prime-power reduction of its genuine cyclotomic +character has square one. -/ +theorem rationalCyclotomicAutomorphism_sq_eq_one_of_character_reductions + (σ : + KummerTheory.rationalCyclotomicField ≃ₐ[ℚ] + KummerTheory.rationalCyclotomicField) + (h : + ∀ (p : Nat.Primes) (k : ℕ), + Units.map (PadicInt.toZModPow k).toMonoidHom + (KummerTheory.rationalCyclotomicCharacterPrimeProduct + σ p) ^ 2 = + 1) : + σ ^ 2 = 1 := by + apply + KummerTheory.rationalCyclotomicCharacterPrimeProduct_injective + rw [map_pow, map_one] + funext p + apply Units.ext + apply PadicInt.ext_of_toZModPow.mp + intro k + let u : ℤ_[p.1]ˣ := + KummerTheory.rationalCyclotomicCharacterPrimeProduct σ p + let f : ℤ_[p.1] →* ZMod (p.1 ^ k) := + (PadicInt.toZModPow k).toMonoidHom + have hk : Units.map f (u ^ 2) = 1 := by + change + Units.map (PadicInt.toZModPow k).toMonoidHom + (KummerTheory.rationalCyclotomicCharacterPrimeProduct σ p ^ 2) = + 1 + rw [map_pow] + exact h p k + simp only [Pi.pow_apply, Pi.one_apply] + calc + (PadicInt.toZModPow k) + ↑(KummerTheory.rationalCyclotomicCharacterPrimeProduct σ p ^ 2) = + f ↑(u ^ 2) := rfl + _ = ↑(Units.map f (u ^ 2)) := + (Units.coe_map f (u ^ 2)).symm + _ = ↑(1 : (ZMod (p.1 ^ k))ˣ) := + congrArg Units.val hk + _ = f ↑(1 : ℤ_[p.1]ˣ) := (map_one f).symm + _ = (PadicInt.toZModPow k) ↑(1 : ℤ_[p.1]ˣ) := rfl + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlace.lean new file mode 100644 index 0000000000..11f7d89226 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlace.lean @@ -0,0 +1,121 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicField +public import Mathlib.NumberTheory.NumberField.Cyclotomic.Ideal +/-! +# Unramified finite places of rational cyclotomic levels + +This file connects the cyclotomic ramification-index formula over `ℤ` +to the finite-place completions used by the global Artin map. A rational +prime outside the conductor is unramified at the actual chosen extension +of its normalized finite-place absolute value. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +local instance (q : Nat.Primes) : Fact q.1.Prime := + ⟨q.2⟩ + +/-- The height-one prime of `𝓞 ℚ` indexed by `q` lies over the principal +prime ideal `(q)` of `ℤ`. -/ +theorem rationalPrime_liesOver_integerSpan + (q : Nat.Primes) : + (RayClass.rationalPrime q).asIdeal.LiesOver + (Ideal.span {(q.1 : ℤ)}) := by + constructor + change + Ideal.span {(q.1 : ℤ)} = + (RayClass.rationalPrime q).asIdeal.comap + (algebraMap ℤ (𝓞 ℚ)) + rw [← RayClass.natGenerator_rationalPrime q, + Rat.HeightOneSpectrum.span_natGenerator] + have hAlgebraMap : + (algebraMap ℤ (𝓞 ℚ)) = + (Rat.IsIntegralClosure.intEquiv (𝓞 ℚ)).symm.toRingHom := + Subsingleton.elim _ _ + rw [hAlgebraMap] + exact Ideal.map_comap_of_equiv _ + +/-- The centre of the chosen finite-place extension in a rational +cyclotomic level is algebraically unramified away from the level. -/ +theorem rationalCyclotomicLevel_isUnramifiedAt_chosenFinitePlaceCentre + (m : ℕ+) (q : Nat.Primes) + (hq : ¬ q.1 ∣ (m : ℕ)) : + Algebra.IsUnramifiedAt (𝓞 ℚ) + (finitePlaceExtensionCentre + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel m) + (RayClass.rationalPrime q) + (chosenFinitePlaceExtension + (L := KummerTheory.rationalCyclotomicLevel m) + (RayClass.rationalPrime q))).asIdeal := by + let v : HeightOneSpectrum (𝓞 ℚ) := + RayClass.rationalPrime q + let L := + KummerTheory.rationalCyclotomicLevel m + let W := + finitePlaceExtensionCentre + (K := ℚ) (L := L) v + (chosenFinitePlaceExtension (L := L) v) + change Algebra.IsUnramifiedAt (𝓞 ℚ) W.asIdeal + let hWv : W.asIdeal.LiesOver v.asIdeal := + finitePlaceExtensionCentre_liesOver + (K := ℚ) (L := L) v + (chosenFinitePlaceExtension (L := L) v) + let hvq : + v.asIdeal.LiesOver (Ideal.span {(q.1 : ℤ)}) := by + dsimp only [v] + exact rationalPrime_liesOver_integerSpan q + let hWq : + W.asIdeal.LiesOver (Ideal.span {(q.1 : ℤ)}) := + Ideal.LiesOver.trans W.asIdeal v.asIdeal + (Ideal.span {(q.1 : ℤ)}) + have hAbsolute : + W.asIdeal.ramificationIdx ℤ = 1 := + IsCyclotomicExtension.Rat.ramificationIdx_eq_of_not_dvd + q.1 L W.asIdeal hq + have hTower : + W.asIdeal.ramificationIdx ℤ = + v.asIdeal.ramificationIdx ℤ * + W.asIdeal.ramificationIdx (𝓞 ℚ) := + Ideal.ramificationIdx_tower + (R := ℤ) v.asIdeal W.asIdeal + have hRelative : + W.asIdeal.ramificationIdx (𝓞 ℚ) = 1 := + Nat.eq_one_of_mul_eq_one_left + (hTower.symm.trans hAbsolute) + exact Ideal.ramificationIdx_eq_one_iff.mp hRelative + +/-- A rational cyclotomic level is unramified at every chosen finite +place whose underlying rational prime does not divide the level. -/ +theorem rationalCyclotomicLevel_chosenFinitePlaceIsUnramified + (m : ℕ+) (q : Nat.Primes) + (hq : ¬ q.1 ∣ (m : ℕ)) : + ChosenFinitePlaceIsUnramified + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel m) + (RayClass.rationalPrime q) := by + apply chosenFinitePlaceIsUnramified_of_isUnramifiedAt + exact + rationalCyclotomicLevel_isUnramifiedAt_chosenFinitePlaceCentre + m q hq + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean new file mode 100644 index 0000000000..16bcf1a00d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean @@ -0,0 +1,3294 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicLocalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrimeFactorization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrincipalLocalUnit +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SemilinearNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.PadicMultiplicativeArtinComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicValuationComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinPolynomial +public import Mathlib.NumberTheory.NumberField.Cyclotomic.Galois +/-! +# Finite-place Artin symbols in rational cyclotomic levels + +At a rational prime away from the cyclotomic level, the chosen completed +extension is unramified. Its normalized local Artin map is therefore the +arithmetic Frobenius raised to the local valuation. The genuine primitive +root in the localized cyclotomic level identifies the image of arithmetic +Frobenius under the global cyclotomic character with the residue prime. +-/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + valuation_hasExtension_of_valuationSubring_equiv → + valuation_hasExtension_of_valuationSubring_equiv + + +open scoped NNReal NumberField ValuativeRel +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +-- Specializing the generic finite-place comparison to `ℚ` must retain its +-- `Algebra.id` owner rather than selecting the competing rational-field +-- instance introduced after specialization. +open scoped Classical in +/-- The completion at a rational finite place uses the rational algebra structure induced from the +identity algebra on the rationals. -/ +@[reducible] noncomputable local instance + rationalFinitePlaceCompletionRatAlgebra + (v : HeightOneSpectrum (𝓞 ℚ)) : + Algebra ℚ (HeightOneSpectrum.adicAbv ℚ v).Completion := by + letI : Algebra ℚ ℚ := Algebra.id ℚ + let hWith : Algebra ℚ + (WithAbs (HeightOneSpectrum.adicAbv ℚ v)) := + WithAbs.instAlgebra _ + let hUniform : UniformContinuousConstSMul ℚ + (WithAbs (HeightOneSpectrum.adicAbv ℚ v)) := + WithAbs.instUniformContinuousConstSMulReal _ + exact + @UniformSpace.Completion.algebra + (WithAbs (HeightOneSpectrum.adicAbv ℚ v)) _ _ _ _ + ℚ _ hWith hUniform + +attribute [local instance] rationalFinitePlaceCompletionRatAlgebra + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open LubinTate + +open scoped Classical in +private theorem mappedAbelianLocalArtin_eq_frobenius_zpow + {F E G : Type} + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [ValuativeRel E] [UniformSpace E] [IsUniformAddGroup E] + [IsNonarchimedeanLocalField E] + [Algebra F E] [FiniteDimensional F E] [IsAbelianGalois F E] + [Valuation.HasExtension + (ValuativeRel.valuation F) (ValuativeRel.valuation E)] + [IsNonarchimedeanLocalField.IsUnramifiedValuedExtension F E] + [Group G] + (f : (E ≃ₐ[F] E) →* G) (x : Fˣ) : + f (LocalClassFieldTheory.abelianLocalArtinMonoidHom F E x) = + (f (arithmeticFrobeniusOfUnramifiedValuation F E)) ^ + IsNonarchimedeanLocalField.valuationMap F + (Additive.ofMul x) := by + rw [LocalClassFieldTheory.abelianLocalArtinMonoidHom_eq_frobenius_zpow, + map_zpow] + +open scoped Classical in +/-- The prime subtype supplies the primality instance used at this local factor. -/ +theorem rationalCyclotomicFinitePlaceArtinPrimeFact (q : Nat.Primes) : Fact q.1.Prime := + ⟨q.2⟩ + +attribute [local instance] rationalCyclotomicFinitePlaceArtinPrimeFact + +open scoped Classical in +/-- The positive cyclotomic level has nonzero underlying natural number. -/ +theorem rationalCyclotomicFinitePlaceArtinPositiveLevelNeZero (m : ℕ+) : NeZero (m : ℕ) := + ⟨m.ne_zero⟩ + +attribute [local instance] rationalCyclotomicFinitePlaceArtinPositiveLevelNeZero + +open scoped Classical in +/-- A finite rational cyclotomic level has finite degree over the rationals. -/ +theorem rationalCyclotomicLevelFiniteDimensional + (m : ℕ+) : + FiniteDimensional ℚ + (KummerTheory.rationalCyclotomicLevel m) := + IsCyclotomicExtension.finiteDimensional + {(m : ℕ)} ℚ (KummerTheory.rationalCyclotomicLevel m) + +attribute [local instance] rationalCyclotomicLevelFiniteDimensional + +open scoped Classical in +/-- A rational cyclotomic level is an abelian Galois extension of the rationals. -/ +theorem rationalCyclotomicLevelIsAbelianGalois + (m : ℕ+) : + IsAbelianGalois ℚ + (KummerTheory.rationalCyclotomicLevel m) := by + have : IsGalois ℚ + (KummerTheory.rationalCyclotomicLevel m) := + inferInstance + let e := + IsCyclotomicExtension.Rat.galEquivZMod + (m : ℕ) (KummerTheory.rationalCyclotomicLevel m) + exact + { is_comm.comm σ τ := by + apply e.injective + simp only [map_mul] + exact mul_comm _ _ } + +attribute [local instance] rationalCyclotomicLevelIsAbelianGalois + +open scoped Classical in +/-- The completion at a rational prime carries its nontrivial normed field structure. -/ +@[reducible] +noncomputable local instance rationalFinitePlaceBaseNontriviallyNormedField + (q : Nat.Primes) : + NontriviallyNormedField + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion := + absoluteValueExtensionCompletionNontriviallyNormedField + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)) + (RayClass.adicAbv_isNontrivial + (RayClass.rationalPrime q)) + +attribute [local instance] rationalFinitePlaceBaseNontriviallyNormedField + +open scoped Classical in +/-- The completion of the rationals at a finite prime is locally compact. -/ +theorem rationalFinitePlaceBaseLocallyCompactSpace + (q : Nat.Primes) : + LocallyCompactSpace + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion := + AbsoluteValue.Completion.locallyCompactSpace + (finitePlaceCompletionBaseMap_isometry + (RayClass.rationalPrime q)) + +attribute [local instance] rationalFinitePlaceBaseLocallyCompactSpace + +open scoped Classical in +/-- The metric on the rational prime completion satisfies the ultrametric inequality. -/ +theorem rationalFinitePlaceBaseIsUltrametricDist + (q : Nat.Primes) : + IsUltrametricDist + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion := + finitePlaceArtinCompletionIsUltrametricDist + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)) + (HeightOneSpectrum.isNonarchimedean_adicAbv + ℚ (RayClass.rationalPrime q)) + +attribute [local instance] rationalFinitePlaceBaseIsUltrametricDist + +open scoped Classical in +/-- The completion at a rational prime carries the nonnegative-real valuation used by the Artin +map. -/ +@[reducible] +noncomputable local instance rationalFinitePlaceBaseValued + (q : Nat.Primes) : + Valued + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion ℝ≥0 := + finitePlaceArtinCompletionValued + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)) + (HeightOneSpectrum.isNonarchimedean_adicAbv + ℚ (RayClass.rationalPrime q)) + +attribute [local instance] rationalFinitePlaceBaseValued + +open scoped Classical in +/-- The completion at a rational prime carries the valuative relation used by the Artin map. -/ +@[reducible] +noncomputable local instance rationalFinitePlaceBaseValuativeRel + (q : Nat.Primes) : + ValuativeRel + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion := + finitePlaceLocalArtinCompletionValuativeRel + (K := ℚ) (RayClass.rationalPrime q) + +attribute [local instance] rationalFinitePlaceBaseValuativeRel + +open scoped Classical in +noncomputable local instance + rationalFinitePlaceBaseValuationIsNontrivial + (q : Nat.Primes) : + (Valued.v : + Valuation + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + ℝ≥0).IsNontrivial := + (inferInstance : + (NormedField.valuation + (K := + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion)).IsNontrivial) + +attribute [local instance] rationalFinitePlaceBaseValuationIsNontrivial + +open scoped Classical in +noncomputable local instance rationalFinitePlaceBaseValuationCompatible + (q : Nat.Primes) : + (Valued.v : + Valuation + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + ℝ≥0).Compatible := + Valuation.Compatible.ofValuation _ + +attribute [local instance] rationalFinitePlaceBaseValuationCompatible + +open scoped Classical in +/-- The valuation relation on the rational prime completion is nontrivial. -/ +theorem rationalFinitePlaceBaseValuativeRelIsNontrivial + (q : Nat.Primes) : + ValuativeRel.IsNontrivial + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion := + (ValuativeRel.isNontrivial_iff_isNontrivial + (Valued.v : + Valuation + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + ℝ≥0)).2 inferInstance + +attribute [local instance] rationalFinitePlaceBaseValuativeRelIsNontrivial + +open scoped Classical in +/-- The topology of the rational prime completion is induced by its valuation relation. -/ +theorem rationalFinitePlaceBaseIsValuativeTopology + (q : Nat.Primes) : + IsValuativeTopology + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion := + isValuativeTopology_of_valued_ofValuation + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion ℝ≥0 + +attribute [local instance] rationalFinitePlaceBaseIsValuativeTopology + +open scoped Classical in +/-- The rational prime completion is a nonarchimedean local field. -/ +theorem rationalFinitePlaceBaseIsNonarchimedeanLocalField + (q : Nat.Primes) : + IsNonarchimedeanLocalField + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField + (K := ℚ) (RayClass.rationalPrime q) + +attribute [local instance] rationalFinitePlaceBaseIsNonarchimedeanLocalField + +/-! Named compatibility witnesses used by the ramified-prime and ray-norm +modules. They are not installed as a duplicate module-level instance family; +the canonical instances above already provide the same data. -/ + +attribute [local instance] rationalFinitePlaceBaseIsNonarchimedeanLocalField + +open scoped Classical in +/-- Rational cyclotomic levels are finite-dimensional over `ℚ`. -/ +theorem rationalCyclotomicPrincipalPrimeLevelFiniteDimensional + (m : ℕ+) : + FiniteDimensional ℚ (KummerTheory.rationalCyclotomicLevel m) := + rationalCyclotomicLevelFiniteDimensional m + +open scoped Classical in +/-- Rational cyclotomic levels are abelian Galois extensions of `ℚ`. -/ +theorem rationalCyclotomicPrincipalPrimeLevelIsAbelianGalois + (m : ℕ+) : + IsAbelianGalois ℚ (KummerTheory.rationalCyclotomicLevel m) := + rationalCyclotomicLevelIsAbelianGalois m + +open scoped Classical in +/-- The canonical nontrivially normed field structure on the completion of +`ℚ` at the rational prime `p`, exposed for principal-prime constructions. -/ +@[reducible] +noncomputable def rationalPrimeFactorCompletionNontriviallyNormedField + (p : Nat.Primes) : + NontriviallyNormedField + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime p)).Completion := + rationalFinitePlaceBaseNontriviallyNormedField p + +open scoped Classical in +/-- The completion of `ℚ` at `p` is locally compact. -/ +theorem rationalPrimeFactorCompletionLocallyCompactSpace + (p : Nat.Primes) : + LocallyCompactSpace + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime p)).Completion := + rationalFinitePlaceBaseLocallyCompactSpace p + +open scoped Classical in +/-- The completion of `ℚ` at `p` carries its canonical ultrametric distance. -/ +theorem rationalPrimeFactorCompletionIsUltrametricDist + (p : Nat.Primes) : + IsUltrametricDist + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime p)).Completion := + rationalFinitePlaceBaseIsUltrametricDist p + +open scoped Classical in +/-- The canonical `ℝ≥0`-valued structure on the completion of `ℚ` at `p`. -/ +@[reducible] +noncomputable def rationalPrimeFactorCompletionValued + (p : Nat.Primes) : + Valued + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime p)).Completion ℝ≥0 := + rationalFinitePlaceBaseValued p + +open scoped Classical in +/-- The valuative relation induced by the canonical valuation on the +completion of `ℚ` at `p`. -/ +@[reducible] +noncomputable def rationalPrimeFactorCompletionValuativeRel + (p : Nat.Primes) : + ValuativeRel + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime p)).Completion := + rationalFinitePlaceBaseValuativeRel p + +open scoped Classical in +/-- The canonical valuation on the completion of `ℚ` at `p` is nontrivial. -/ +theorem rationalPrimeFactorCompletionValuationIsNontrivial + (p : Nat.Primes) : + (Valued.v : Valuation + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime p)).Completion ℝ≥0).IsNontrivial := + rationalFinitePlaceBaseValuationIsNontrivial p + +open scoped Classical in +/-- The canonical valuation on the completion of `ℚ` at `p` is compatible +with its field structure. -/ +theorem rationalPrimeFactorCompletionValuationCompatible + (p : Nat.Primes) : + (Valued.v : Valuation + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime p)).Completion ℝ≥0).Compatible := + rationalFinitePlaceBaseValuationCompatible p + +open scoped Classical in +/-- The canonical valuative relation on the completion at `p` is nontrivial. -/ +theorem rationalPrimeFactorCompletionValuativeRelIsNontrivial + (p : Nat.Primes) : + ValuativeRel.IsNontrivial + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime p)).Completion := + rationalFinitePlaceBaseValuativeRelIsNontrivial p + +open scoped Classical in +/-- The completion topology at `p` is induced by its canonical valuation. -/ +theorem rationalPrimeFactorCompletionIsValuativeTopology + (p : Nat.Primes) : + IsValuativeTopology + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime p)).Completion := + rationalFinitePlaceBaseIsValuativeTopology p + +open scoped Classical in +/-- The completion of `ℚ` at `p` is a nonarchimedean local field. -/ +theorem rationalPrimeFactorCompletionIsNonarchimedeanLocalField + (p : Nat.Primes) : + IsNonarchimedeanLocalField + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime p)).Completion := + rationalFinitePlaceBaseIsNonarchimedeanLocalField p + +open scoped Classical in +/-- The positive conductor of the `n`-th ramified cyclotomic level at +`p`. -/ +def rationalCyclotomicPrincipalPrimeModulus + (p : Nat.Primes) (n : ℕ) : ℕ+ := + ⟨p.1 ^ (n + 1), pow_pos p.2.pos (n + 1)⟩ + +open scoped Classical in +/-- The rational finite-place completion used at the prime `p`. -/ +abbrev RationalCyclotomicPrincipalPrimeCompletion + (p : Nat.Primes) := + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime p)).Completion + +open scoped Classical in +/-- The chosen localized cyclotomic field at level `p ^ (n + 1)`. -/ +abbrev RationalCyclotomicPrincipalPrimeLocalizedLevel + (p : Nat.Primes) (n : ℕ) := + rationalCyclotomicLocalizedCompletion + (rationalCyclotomicPrincipalPrimeModulus p n) + (RayClass.rationalPrime p) + +open scoped Classical in +/-- The standard multiplicative Lubin--Tate field at level `n`. -/ +abbrev RationalCyclotomicPrincipalPrimePadicLevel + (p : Nat.Primes) (n : ℕ) := + standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p.1) n + +open scoped Classical in +/-- The valuation ring of the absolute-value completion at `q`, identified +with the standard p-adic integer ring `ℤ_q`. -/ +noncomputable def rationalFinitePlaceCompletionIntegerRingEquivPadicInt + (q : Nat.Primes) : + 𝒪[(HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion] ≃+* + ℤ_[q.1] := by + let v : HeightOneSpectrum (𝓞 ℚ) := + RayClass.rationalPrime q + let vQ := HeightOneSpectrum.adicAbv ℚ v + let eConcreteIntegers : + 𝒪[vQ.Completion] ≃+* + v.adicCompletionIntegers ℚ := + finitePlaceCompletionIntegerRingEquiv v + exact + eConcreteIntegers.trans + (PadicInt.adicCompletionIntegersEquiv + (𝓞 ℚ) q).symm.toRingEquiv + +open scoped Classical in +/-- The absolute-value completion at the rational prime `q`, identified +with the standard field `ℚ_q`. -/ +noncomputable def rationalFinitePlaceCompletionRingEquivPadic + (q : Nat.Primes) : + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion ≃+* + ℚ_[q.1] := + IsFractionRing.ringEquivOfRingEquiv + (rationalFinitePlaceCompletionIntegerRingEquivPadicInt q) + +open scoped Classical in +/-- The completion-to-`ℚ_q` equivalence respects the rational embedding. -/ +theorem rationalFinitePlaceCompletionRingEquivPadic_algebraMap + (q : Nat.Primes) (a : ℚ) : + rationalFinitePlaceCompletionRingEquivPadic q + (algebraMap ℚ + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion a) = + algebraMap ℚ ℚ_[q.1] a := by + exact + (rationalFinitePlaceCompletionRingEquivPadic q).toRingHom.map_rat_algebraMap a + +open scoped Classical in +/-- The completion field equivalence and its restriction to valuation +rings commute with the natural inclusions into the fields. -/ +theorem rationalFinitePlaceCompletionIntegerRingEquivPadicInt_coe + (q : Nat.Primes) + (a : + 𝒪[(HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion]) : + rationalFinitePlaceCompletionRingEquivPadic q + (algebraMap + 𝒪[(HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion] + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion a) = + algebraMap ℤ_[q.1] ℚ_[q.1] + (rationalFinitePlaceCompletionIntegerRingEquivPadicInt q a) := by + exact + (IsFractionRing.ringEquivOfRingEquiv_algebraMap + (rationalFinitePlaceCompletionIntegerRingEquivPadicInt q) a) + +open scoped Classical in +/-- The canonical rational-completion equivalence preserves the canonical +valuations. -/ +theorem + rationalFinitePlaceCompletionRingEquivPadic_semilinearValuationCompatible + (p : Nat.Primes) : + SemilinearValuationCompatible + (RationalCyclotomicPrincipalPrimeCompletion p) ℚ_[p.1] + (rationalFinitePlaceCompletionRingEquivPadic p) := by + let F := RationalCyclotomicPrincipalPrimeCompletion p + let eK := rationalFinitePlaceCompletionRingEquivPadic p + let : Algebra F ℚ_[p.1] := eK.toRingHom.toAlgebra + change + (ValuativeRel.valuation F).HasExtension + (ValuativeRel.valuation ℚ_[p.1]) + let eO := + (rationalFinitePlaceCompletionIntegerRingEquivPadicInt p).trans + (padicIntEquivValuationSubring p.1) + have hChosen : + (localCompleteDVF F).valuation.HasExtension + (padicDVRValuation p.1) := by + change + (localCompleteDVF F).valuation.HasExtension + (padicCompleteDVF p.1).valuation + apply + valuation_hasExtension_of_valuationSubring_equiv + (localCompleteDVF F) + (padicCompleteDVF p.1) + eO + intro z + change + algebraMap + (padicDVRValuation p.1).valuationSubring ℚ_[p.1] + (padicIntEquivValuationSubring p.1 + (rationalFinitePlaceCompletionIntegerRingEquivPadicInt + p z)) = + rationalFinitePlaceCompletionRingEquivPadic p + (algebraMap 𝒪[F] F z) + symm + calc + rationalFinitePlaceCompletionRingEquivPadic p + (algebraMap 𝒪[F] F z) = + algebraMap ℤ_[p.1] ℚ_[p.1] + (rationalFinitePlaceCompletionIntegerRingEquivPadicInt + p z) := + rationalFinitePlaceCompletionIntegerRingEquivPadicInt_coe + p z + _ = + algebraMap + (padicDVRValuation p.1).valuationSubring ℚ_[p.1] + (padicIntEquivValuationSubring p.1 + (rationalFinitePlaceCompletionIntegerRingEquivPadicInt + p z)) := by + rw [PadicInt.algebraMap_apply, + ValuationSubring.algebraMap_apply] + exact + (padicIntEquivValuationSubring_coe p.1 + (rationalFinitePlaceCompletionIntegerRingEquivPadicInt + p z)).symm + have hBase : + (ValuativeRel.valuation F).HasExtension + (padicDVRValuation p.1) := by + rw [← localCompleteDVF_valuation_eq] + exact hChosen + refine + { val_isEquiv_comap := ?_ } + exact + hBase.val_isEquiv_comap.trans + ((padicDVRValuation_isEquiv_valuativeRelValuation + p.1).comap (algebraMap F ℚ_[p.1])) + +open scoped Classical in +/-- The rational prime, pulled back from `ℤ_q` to the valuation ring of +the absolute-value completion at `q`. -/ +noncomputable def rationalPrimeFinitePlaceInteger + (q : Nat.Primes) : + 𝒪[(HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion] := + (rationalFinitePlaceCompletionIntegerRingEquivPadicInt q).symm + (q.1 : ℤ_[q.1]) + +open scoped Classical in +/-- The pulled-back rational prime is irreducible in the completion +valuation ring. -/ +theorem rationalPrimeFinitePlaceInteger_irreducible + (q : Nat.Primes) : + Irreducible (rationalPrimeFinitePlaceInteger q) := by + exact + (MulEquiv.irreducible_iff + (rationalFinitePlaceCompletionIntegerRingEquivPadicInt + q).symm.toMulEquiv).2 + ((PadicInt.prime_p : + Prime (q.1 : ℤ_[q.1])).irreducible) + +open scoped Classical in +/-- Coercing the pulled-back prime to the completion field gives the +ordinary image of the rational number `q`. -/ +theorem rationalPrimeFinitePlaceInteger_coe + (q : Nat.Primes) : + ((rationalPrimeFinitePlaceInteger q : + 𝒪[(HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion]) : + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion) = + algebraMap ℚ + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + (q.1 : ℚ) := by + apply + (rationalFinitePlaceCompletionRingEquivPadic q).injective + change + rationalFinitePlaceCompletionRingEquivPadic q + (algebraMap + 𝒪[(HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion] + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + (rationalPrimeFinitePlaceInteger q)) = + rationalFinitePlaceCompletionRingEquivPadic q + (algebraMap ℚ + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + (q.1 : ℚ)) + calc + rationalFinitePlaceCompletionRingEquivPadic q + (algebraMap + 𝒪[(HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion] + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + (rationalPrimeFinitePlaceInteger q)) = + algebraMap ℤ_[q.1] ℚ_[q.1] + ((rationalFinitePlaceCompletionIntegerRingEquivPadicInt q) + (rationalPrimeFinitePlaceInteger q)) := + rationalFinitePlaceCompletionIntegerRingEquivPadicInt_coe + q (rationalPrimeFinitePlaceInteger q) + _ = (q.1 : ℚ_[q.1]) := by + rw [rationalPrimeFinitePlaceInteger, + (rationalFinitePlaceCompletionIntegerRingEquivPadicInt + q).apply_symm_apply, + PadicInt.algebraMap_apply, + PadicInt.coe_natCast] + _ = + rationalFinitePlaceCompletionRingEquivPadic q + (algebraMap ℚ + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + (q.1 : ℚ)) := by + rw [ + rationalFinitePlaceCompletionRingEquivPadic_algebraMap] + norm_num + +open scoped Classical in +/-- The rational prime as a field unit of its absolute-value completion. -/ +noncomputable def rationalPrimeFinitePlaceFieldUnit + (q : Nat.Primes) : + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completionˣ := + Units.mk0 + (rationalPrimeFinitePlaceInteger q : + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion) + (by + intro hzero + exact + (rationalPrimeFinitePlaceInteger_irreducible q).ne_zero + (Subtype.ext hzero)) + +open scoped Classical in +/-- In the inverse-standard local reciprocity normalization, the rational +prime itself has normalized additive value `-1`. -/ +theorem rationalPrimeFinitePlaceFieldUnit_valuationMap + (q : Nat.Primes) : + IsNonarchimedeanLocalField.valuationMap + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + (Additive.ofMul + (rationalPrimeFinitePlaceFieldUnit q)) = + -1 := by + simpa [IsNonarchimedeanLocalField.valuationMap_apply] using + (LocalFieldTheory.v_integerRingIrreducibleFieldUnit + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + (rationalPrimeFinitePlaceInteger q) + (rationalPrimeFinitePlaceInteger_irreducible q) + (rationalPrimeFinitePlaceFieldUnit q) rfl) + +open scoped Classical in +/-- The rational `q`-unit part of `x`, pulled back from `ℤ_qˣ` to the +valuation ring of the absolute-value completion. -/ +noncomputable def rationalPrimeUnitFinitePlaceIntegerUnit + (x : ℚˣ) (q : Nat.Primes) : + 𝒪[(HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion]ˣ := + Units.map + (rationalFinitePlaceCompletionIntegerRingEquivPadicInt + q).symm.toMonoidHom + (padicIntUnitOfRat q + (rationalPrimeUnit x q : ℚ) + (rationalPrimeUnit x q).ne_zero + (padicValRat_rationalPrimeUnit x q)) + +open scoped Classical in +/-- Forgetting the integrality proof from the pulled-back `q`-unit gives +the ordinary image of the rational `q`-unit in the completion field. -/ +theorem rationalPrimeUnitFinitePlaceIntegerUnit_coe + (x : ℚˣ) (q : Nat.Primes) : + (((rationalPrimeUnitFinitePlaceIntegerUnit x q : + 𝒪[(HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion]ˣ) : + 𝒪[(HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion]) : + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion) = + algebraMap ℚ + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + (rationalPrimeUnit x q : ℚ) := by + apply + (rationalFinitePlaceCompletionRingEquivPadic q).injective + change + rationalFinitePlaceCompletionRingEquivPadic q + (algebraMap + 𝒪[(HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion] + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + (rationalPrimeUnitFinitePlaceIntegerUnit x q : + 𝒪[(HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion])) = + rationalFinitePlaceCompletionRingEquivPadic q + (algebraMap ℚ + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + (rationalPrimeUnit x q : ℚ)) + calc + rationalFinitePlaceCompletionRingEquivPadic q + (algebraMap + 𝒪[(HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion] + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + (rationalPrimeUnitFinitePlaceIntegerUnit x q : + 𝒪[(HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion])) = + algebraMap ℤ_[q.1] ℚ_[q.1] + ((rationalFinitePlaceCompletionIntegerRingEquivPadicInt q) + (rationalPrimeUnitFinitePlaceIntegerUnit x q : + 𝒪[(HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion])) := + rationalFinitePlaceCompletionIntegerRingEquivPadicInt_coe q + (rationalPrimeUnitFinitePlaceIntegerUnit x q : + 𝒪[(HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion]) + _ = + ((padicIntUnitOfRat q + (rationalPrimeUnit x q : ℚ) + (rationalPrimeUnit x q).ne_zero + (padicValRat_rationalPrimeUnit x q) : + ℤ_[q.1]) : ℚ_[q.1]) := by + rw [rationalPrimeUnitFinitePlaceIntegerUnit] + simp [PadicInt.algebraMap_apply] + _ = ((rationalPrimeUnit x q : ℚ) : ℚ_[q.1]) := by + rw [padicIntUnitOfRat_coe] + _ = + rationalFinitePlaceCompletionRingEquivPadic q + (algebraMap ℚ + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + (rationalPrimeUnit x q : ℚ)) := by + rw [ + rationalFinitePlaceCompletionRingEquivPadic_algebraMap] + simp + +open scoped Classical in +/-- The completion field unit underlying the pulled-back rational `q`-unit +has normalized additive value zero. -/ +theorem rationalPrimeUnitFinitePlaceField_valuationMap + (x : ℚˣ) (q : Nat.Primes) : + IsNonarchimedeanLocalField.valuationMap + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + (Additive.ofMul + (IsNonarchimedeanLocalField.integerUnitsToFieldUnits + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + (rationalPrimeUnitFinitePlaceIntegerUnit x q))) = + 0 := by + rw [IsNonarchimedeanLocalField.valuationMap_apply] + exact + IsNonarchimedeanLocalField.v_integerUnitsToFieldUnits + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + (rationalPrimeUnitFinitePlaceIntegerUnit x q) + +open scoped Classical in +/-- The rational prime `q`, regarded as a unit of `ℚ`. -/ +def rationalPrimeGeneratorUnit (q : Nat.Primes) : ℚˣ := + Units.mk0 (q.1 : ℚ) (by exact_mod_cast q.2.ne_zero) + +open scoped Classical in +/-- The underlying rational number of the prime generator unit is `q`. -/ +@[simp] +theorem rationalPrimeGeneratorUnit_coe (q : Nat.Primes) : + (rationalPrimeGeneratorUnit q : ℚ) = q.1 := + rfl + +open scoped Classical in +/-- Reattaching the removed `q`-power to the rational `q`-unit recovers +the original rational field unit. -/ +theorem rationalPrimeGeneratorUnit_zpow_mul_rationalPrimeUnit + (x : ℚˣ) (q : Nat.Primes) : + rationalPrimeGeneratorUnit q ^ + padicValRat q.1 (x : ℚ) * + rationalPrimeUnit x q = + x := by + rw [rationalPrimeGeneratorUnit, rationalPrimeUnit, + ← mul_assoc, ← zpow_add] + simp + +open scoped Classical in +/-- The source unit in the absolute-value completion represented by the +finite component of a rational principal idele. -/ +noncomputable def rationalPrincipalFinitePlaceInput + (x : ℚˣ) (q : Nat.Primes) : + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completionˣ := + (finitePlaceCompletionUnitsContinuousMulEquiv + (RayClass.rationalPrime q)).symm + (IdeleGroup.finiteComponent + (RayClass.rationalPrime q) + (IdeleGroup.principalIdele ℚ x)) + +open scoped Classical in +/-- The source unit represented by a principal finite component is the +ordinary image of the rational field unit in the absolute-value +completion. -/ +theorem rationalPrincipalFinitePlaceInput_eq_algebraMap + (x : ℚˣ) (q : Nat.Primes) : + rationalPrincipalFinitePlaceInput x q = + Units.map + (algebraMap ℚ + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion).toMonoidHom + x := by + apply Units.ext + let v : HeightOneSpectrum (𝓞 ℚ) := + RayClass.rationalPrime q + let vQ := HeightOneSpectrum.adicAbv ℚ v + let component : (v.adicCompletion ℚ)ˣ := + IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele ℚ x) + apply (finitePlaceCompletionRingEquiv v).injective + change + finitePlaceCompletionRingEquiv v + (rationalPrincipalFinitePlaceInput x q : vQ.Completion) = + finitePlaceCompletionRingEquiv v + (algebraMap ℚ vQ.Completion (x : ℚ)) + have hCompletion : + finitePlaceCompletionRingEquiv v + (rationalPrincipalFinitePlaceInput x q : + vQ.Completion) = + (component : v.adicCompletion ℚ) := by + have hUnits := + congrArg Units.val + ((finitePlaceCompletionUnitsContinuousMulEquiv v).apply_symm_apply + component) + exact hUnits + have hComponent : + (component : v.adicCompletion ℚ) = + algebraMap ℚ (v.adicCompletion ℚ) (x : ℚ) := by + apply (Padic.adicCompletionEquiv (𝓞 ℚ) q).symm.injective + calc + (Padic.adicCompletionEquiv (𝓞 ℚ) q).symm + (component : v.adicCompletion ℚ) = + algebraMap ℚ ℚ_[q.1] (x : ℚ) := by + dsimp only [component] + rw [IdeleGroup.finiteComponent_principalIdele] + exact + (Padic.adicCompletionEquiv + (𝓞 ℚ) q).symm.commutes (x : ℚ) + _ = (Padic.adicCompletionEquiv (𝓞 ℚ) q).symm + (algebraMap ℚ (v.adicCompletion ℚ) (x : ℚ)) := by + symm + exact + (Padic.adicCompletionEquiv + (𝓞 ℚ) q).symm.commutes (x : ℚ) + calc + finitePlaceCompletionRingEquiv v + (rationalPrincipalFinitePlaceInput x q : + vQ.Completion) = + (component : v.adicCompletion ℚ) := hCompletion + _ = algebraMap ℚ (v.adicCompletion ℚ) (x : ℚ) := hComponent + _ = finitePlaceCompletionRingEquiv v + (algebraMap ℚ vQ.Completion (x : ℚ)) := by + symm + exact + (finitePlaceCompletionAlgEquiv (K := ℚ) v).commutes (x : ℚ) + +open scoped Classical in +/-- The normalized local exponent of a rational principal finite +component is the negative of the usual `q`-adic exponent. The minus sign +records the inverse-standard local reciprocity convention in which a +prime element has normalized value `-1`. -/ +theorem rationalPrincipalFiniteComponent_valuationMap + (x : ℚˣ) (q : Nat.Primes) : + IsNonarchimedeanLocalField.valuationMap + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + (Additive.ofMul + ((finitePlaceCompletionUnitsContinuousMulEquiv + (RayClass.rationalPrime q)).symm + (IdeleGroup.finiteComponent + (RayClass.rationalPrime q) + (IdeleGroup.principalIdele ℚ x)))) = + -padicValRat q.1 (x : ℚ) := by + let F := + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + let embed : ℚˣ →* Fˣ := + Units.map (algebraMap ℚ F).toMonoidHom + let primeUnit : Fˣ := + rationalPrimeFinitePlaceFieldUnit q + let integralUnit : 𝒪[F]ˣ := + rationalPrimeUnitFinitePlaceIntegerUnit x q + let unitPart : Fˣ := + IsNonarchimedeanLocalField.integerUnitsToFieldUnits + F integralUnit + have hInput : + rationalPrincipalFinitePlaceInput x q = + embed x := by + exact rationalPrincipalFinitePlaceInput_eq_algebraMap x q + have hPrime : + embed (rationalPrimeGeneratorUnit q) = + primeUnit := by + apply Units.ext + exact + (rationalPrimeFinitePlaceInteger_coe q).symm + have hUnit : + embed (rationalPrimeUnit x q) = + unitPart := by + apply Units.ext + exact + (rationalPrimeUnitFinitePlaceIntegerUnit_coe + x q).symm + change + IsNonarchimedeanLocalField.valuationMap F + (Additive.ofMul + (rationalPrincipalFinitePlaceInput x q)) = + -padicValRat q.1 (x : ℚ) + rw [hInput] + conv_lhs => + rw [← rationalPrimeGeneratorUnit_zpow_mul_rationalPrimeUnit + x q] + rw [map_mul, map_zpow, hPrime, hUnit, + IsNonarchimedeanLocalField.valuationMap_ofMul_mul, + IsNonarchimedeanLocalField.valuationMap_ofMul_zpow, + rationalPrimeFinitePlaceFieldUnit_valuationMap, + rationalPrimeUnitFinitePlaceField_valuationMap] + ring + +open scoped Classical in +/-- The principal finite component of the rational prime itself has +normalized local exponent `-1`. -/ +theorem rationalPrimePrincipalFiniteComponent_valuationMap + (q : Nat.Primes) : + IsNonarchimedeanLocalField.valuationMap + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + (Additive.ofMul + ((finitePlaceCompletionUnitsContinuousMulEquiv + (RayClass.rationalPrime q)).symm + (IdeleGroup.finiteComponent + (RayClass.rationalPrime q) + (IdeleGroup.principalIdele ℚ + (rationalPrimeGeneratorUnit q))))) = + -1 := by + rw [rationalPrincipalFiniteComponent_valuationMap, + rationalPrimeGeneratorUnit_coe, + padicValRat.self q.2.one_lt] + +open scoped Classical in +/-- A cyclotomic automorphism which raises the selected primitive root to +the `q`-th power has cyclotomic character equal to the residue-prime unit. -/ +private theorem rationalCyclotomicLevel_galEquivZMod_eq_unitOfCoprime + (m : ℕ+) (q : Nat.Primes) + (hq : ¬ q.1 ∣ (m : ℕ)) + (σ : KummerTheory.rationalCyclotomicLevel m ≃ₐ[ℚ] + KummerTheory.rationalCyclotomicLevel m) + (hσ : + σ (rationalCyclotomicLevelPrimitiveRoot m) = + rationalCyclotomicLevelPrimitiveRoot m ^ q.1) : + IsCyclotomicExtension.Rat.galEquivZMod + (m : ℕ) (KummerTheory.rationalCyclotomicLevel m) σ = + ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr hq) := by + let ζ := rationalCyclotomicLevelPrimitiveRoot m + have hζ : IsPrimitiveRoot ζ (m : ℕ) := + rationalCyclotomicLevelPrimitiveRoot_isPrimitiveRoot m + have hCharacterRoot : + σ ζ = + ζ ^ + (IsCyclotomicExtension.Rat.galEquivZMod + (m : ℕ) (KummerTheory.rationalCyclotomicLevel m) σ).val.val := + IsCyclotomicExtension.Rat.galEquivZMod_apply_of_pow_eq + (m : ℕ) (KummerTheory.rationalCyclotomicLevel m) σ + hζ.pow_eq_one + have hPowers : + ζ ^ + (IsCyclotomicExtension.Rat.galEquivZMod + (m : ℕ) (KummerTheory.rationalCyclotomicLevel m) σ).val.val = + ζ ^ q.1 := + hCharacterRoot.symm.trans hσ + rw [(hζ.isOfFinOrder m.ne_zero).pow_inj_mod, + ← hζ.eq_orderOf, + ← ZMod.natCast_eq_natCast_iff', + ZMod.natCast_val] at hPowers + apply Units.ext + simpa using hPowers + +open scoped Classical in +/-- The finite place of the rational field corresponding to a prime number. -/ +abbrev rationalCyclotomicArtinPlace (q : Nat.Primes) : + HeightOneSpectrum (𝓞 ℚ) := + RayClass.rationalPrime q + +open scoped Classical in +/-- The absolute value associated to the rational finite place used in the cyclotomic Artin map. -/ +abbrev rationalCyclotomicArtinBaseAbv (q : Nat.Primes) : + AbsoluteValue ℚ ℝ := + HeightOneSpectrum.adicAbv ℚ (rationalCyclotomicArtinPlace q) + +open scoped Classical in +/-- The rational cyclotomic extension at a positive integral level. -/ +abbrev rationalCyclotomicArtinLevel (m : ℕ+) := + KummerTheory.rationalCyclotomicLevel m + +open scoped Classical in +/-- The chosen extension of a rational finite-place absolute value to a cyclotomic level. -/ +abbrev rationalCyclotomicArtinExtension + (m : ℕ+) (q : Nat.Primes) : + AbsoluteValueExtension + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinLevel m) := + chosenFinitePlaceExtension + (L := rationalCyclotomicArtinLevel m) + (rationalCyclotomicArtinPlace q) + +open scoped Classical in +/-- The completion of the cyclotomic level at the chosen extension of the finite place. -/ +abbrev rationalCyclotomicArtinLocalizedField + (m : ℕ+) (q : Nat.Primes) := + AlgebraicNumberTheory.Valuations.LocalizedCompletion + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q) + +open scoped Classical in +/-- The cyclotomic extension completion used by the rational Artin map is an algebra over the +rationals. -/ +@[reducible] +noncomputable local instance rationalCyclotomicArtinExtensionAlgebra + (m : ℕ+) (q : Nat.Primes) : + Algebra ℚ + (rationalCyclotomicArtinExtension m q).1.Completion := + AbsoluteValue.extensionCompletionAlgebra + (K := ℚ) (rationalCyclotomicArtinExtension m q).1 + +attribute [local instance] rationalCyclotomicArtinExtensionAlgebra + +open scoped Classical in +/-- The rationals act on the cyclotomic extension completion through the chosen extension +algebra. -/ +@[reducible] +noncomputable local instance rationalCyclotomicArtinExtensionSMul + (m : ℕ+) (q : Nat.Primes) : + SMul ℚ + (rationalCyclotomicArtinExtension m q).1.Completion := + (rationalCyclotomicArtinExtensionAlgebra m q).toSMul + +attribute [local instance] rationalCyclotomicArtinExtensionSMul + +open scoped Classical in +/-- The completed cyclotomic extension is an algebra over the completion at the chosen rational +prime. -/ +@[reducible] +noncomputable local instance + rationalCyclotomicArtinCompletionAlgebra + (m : ℕ+) (q : Nat.Primes) : + Algebra (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinExtension m q).1.Completion := + AbsoluteValue.completionAlgebra + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q).1 + (rationalCyclotomicArtinExtension m q).2 + +attribute [local instance] rationalCyclotomicArtinCompletionAlgebra + +open scoped Classical in +/-- Scalar extension from the rational prime completion to the localized cyclotomic field. -/ +@[reducible] +noncomputable local instance rationalCyclotomicArtinLocalizedAlgebra + (m : ℕ+) (q : Nat.Primes) : + Algebra (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinLocalizedField m q) := + finitePlaceLocalArtinLocalizedAlgebra + (K := ℚ) (L := rationalCyclotomicArtinLevel m) + (rationalCyclotomicArtinPlace q) + (rationalCyclotomicArtinExtension m q) + +attribute [local instance] rationalCyclotomicArtinLocalizedAlgebra + +open scoped Classical in +/-- The rational algebra structure on the localized cyclotomic field induced by its global +extension. -/ +noncomputable local instance + rationalCyclotomicArtinLocalizedGlobalAlgebra + (m : ℕ+) (q : Nat.Primes) : + Algebra ℚ (rationalCyclotomicArtinLocalizedField m q) := + LocalClassFieldTheory.localizedCompletionGlobalAlgebra + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q) + +attribute [local instance] rationalCyclotomicArtinLocalizedGlobalAlgebra + +open scoped Classical in +/-- Rational scalar multiplication on the localized cyclotomic field, taken from its global +algebra structure. -/ +noncomputable local instance + rationalCyclotomicArtinLocalizedGlobalSMul + (m : ℕ+) (q : Nat.Primes) : + SMul ℚ (rationalCyclotomicArtinLocalizedField m q) := + (rationalCyclotomicArtinLocalizedGlobalAlgebra m q).toSMul + +attribute [local instance] rationalCyclotomicArtinLocalizedGlobalSMul + +open scoped Classical in +/-- Rational scalar multiplication factors through the base prime completion on the localized +cyclotomic field. -/ +theorem rationalCyclotomicArtinLocalizedScalarTower + (m : ℕ+) (q : Nat.Primes) : + IsScalarTower ℚ + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinLocalizedField m q) := by + constructor + intro r x y + simp only [Algebra.smul_def, map_mul, eq_ratCast, + map_ratCast, mul_assoc] + +attribute [local instance] rationalCyclotomicArtinLocalizedScalarTower + +open scoped Classical in +/-- The localized cyclotomic field is finite dimensional over the base prime completion. -/ +theorem rationalCyclotomicArtinLocalizedFiniteDimensional + (m : ℕ+) (q : Nat.Primes) : + FiniteDimensional + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinLocalizedField m q) := + finitePlaceLocalArtinFiniteDimensional + (K := ℚ) (L := rationalCyclotomicArtinLevel m) + (rationalCyclotomicArtinPlace q) + (rationalCyclotomicArtinExtension m q) + +attribute [local instance] rationalCyclotomicArtinLocalizedFiniteDimensional + +open scoped Classical in +/-- The localized cyclotomic field is abelian Galois over the base prime completion. -/ +theorem rationalCyclotomicArtinLocalizedIsAbelianGalois + (m : ℕ+) (q : Nat.Primes) : + IsAbelianGalois + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinLocalizedField m q) := + finitePlaceLocalArtinIsAbelianGalois + (K := ℚ) (L := rationalCyclotomicArtinLevel m) + (rationalCyclotomicArtinPlace q) + (rationalCyclotomicArtinExtension m q) + (inferInstance : + FiniteDimensional ℚ (rationalCyclotomicArtinLevel m)) + +attribute [local instance] rationalCyclotomicArtinLocalizedIsAbelianGalois + +open scoped Classical in +/-- The localized cyclotomic extension is separable over the base prime completion. -/ +theorem rationalCyclotomicArtinLocalizedIsSeparable + (m : ℕ+) (q : Nat.Primes) : + Algebra.IsSeparable + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinLocalizedField m q) := + (rationalCyclotomicArtinLocalizedIsAbelianGalois m q).toIsGalois.to_isSeparable + +attribute [local instance] rationalCyclotomicArtinLocalizedIsSeparable + +open scoped Classical in +/-- The localized field remains cyclotomic of the selected level over the base prime completion. +-/ +theorem rationalCyclotomicArtinLocalizedIsCyclotomic + (m : ℕ+) (q : Nat.Primes) : + IsCyclotomicExtension {(m : ℕ)} + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinLocalizedField m q) := + rationalCyclotomicLevel_localizedCompletion_isCyclotomicExtension + m (rationalCyclotomicArtinPlace q) + +attribute [local instance] rationalCyclotomicArtinLocalizedIsCyclotomic + +open scoped Classical in +/-- The completed cyclotomic extension is finite dimensional over the base prime completion. -/ +theorem rationalCyclotomicArtinExtensionFiniteDimensional + (m : ℕ+) (q : Nat.Primes) : + FiniteDimensional + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinExtension m q).1.Completion := + completionModuleFinite + (rationalCyclotomicArtinBaseAbv q) + (RayClass.adicAbv_isNontrivial + (rationalCyclotomicArtinPlace q)) + (rationalCyclotomicArtinExtension m q) + +attribute [local instance] rationalCyclotomicArtinExtensionFiniteDimensional + +open scoped Classical in +/-- Scalar multiplication by the base prime completion is continuous on the completed extension. +-/ +theorem rationalCyclotomicArtinExtensionContinuousSMul + (m : ℕ+) (q : Nat.Primes) : + ContinuousSMul + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinExtension m q).1.Completion := + continuousSMul_of_algebraMap _ _ + (AbsoluteValue.completionMap_isometry + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q).1 + (rationalCyclotomicArtinExtension m q).2).continuous + +attribute [local instance] rationalCyclotomicArtinExtensionContinuousSMul + +open scoped Classical in +/-- The completion of the chosen cyclotomic prime extension is locally compact. -/ +theorem rationalCyclotomicArtinExtensionLocallyCompact + (m : ℕ+) (q : Nat.Primes) : + LocallyCompactSpace + (rationalCyclotomicArtinExtension m q).1.Completion := + LocallyCompactSpace.of_finiteDimensional_of_complete + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinExtension m q).1.Completion + +attribute [local instance] rationalCyclotomicArtinExtensionLocallyCompact + +open scoped Classical in +private noncomputable def + rationalCyclotomicArtinLocalizedEquivCompletion + (m : ℕ+) (q : Nat.Primes) : + rationalCyclotomicArtinLocalizedField m q ≃ᵢ + (rationalCyclotomicArtinExtension m q).1.Completion := + { toEquiv := + (localizedCompletionEquivCompletion + (rationalCyclotomicArtinBaseAbv q) + (RayClass.adicAbv_isNontrivial + (rationalCyclotomicArtinPlace q)) + (rationalCyclotomicArtinExtension m q)).toEquiv + isometry_toFun := + Isometry.of_dist_eq fun _ _ => rfl } + +open scoped Classical in +/-- The localized cyclotomic field is locally compact. -/ +theorem rationalCyclotomicArtinLocalizedLocallyCompact + (m : ℕ+) (q : Nat.Primes) : + LocallyCompactSpace + (rationalCyclotomicArtinLocalizedField m q) := + ((rationalCyclotomicArtinLocalizedEquivCompletion m q).toHomeomorph.locallyCompactSpace_iff).2 + inferInstance + +attribute [local instance] rationalCyclotomicArtinLocalizedLocallyCompact + +open scoped Classical in +/-- The metric on the localized cyclotomic field satisfies the ultrametric inequality. -/ +theorem rationalCyclotomicArtinLocalizedIsUltrametricDist + (m : ℕ+) (q : Nat.Primes) : + IsUltrametricDist + (rationalCyclotomicArtinLocalizedField m q) := + localizedCompletionIsUltrametricDist + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q) + (HeightOneSpectrum.isNonarchimedean_adicAbv + ℚ (rationalCyclotomicArtinPlace q)) + +attribute [local instance] rationalCyclotomicArtinLocalizedIsUltrametricDist + +open scoped Classical in +/-- The real-valued valuation on the localized cyclotomic field extending the selected +finite-place absolute value. -/ +noncomputable local instance rationalCyclotomicArtinLocalizedValued + (m : ℕ+) (q : Nat.Primes) : + Valued (rationalCyclotomicArtinLocalizedField m q) ℝ≥0 := + localizedCompletionFinitePlaceValued + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q) + (HeightOneSpectrum.isNonarchimedean_adicAbv + ℚ (rationalCyclotomicArtinPlace q)) + +attribute [local instance] rationalCyclotomicArtinLocalizedValued + +open scoped Classical in +/-- The valuation relation on the localized cyclotomic field associated with the chosen finite +place. -/ +@[reducible] +noncomputable local instance + rationalCyclotomicArtinLocalizedValuativeRel + (m : ℕ+) (q : Nat.Primes) : + ValuativeRel (rationalCyclotomicArtinLocalizedField m q) := + localizedCompletionFinitePlaceValuativeRel + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q) + (HeightOneSpectrum.isNonarchimedean_adicAbv + ℚ (rationalCyclotomicArtinPlace q)) + +attribute [local instance] rationalCyclotomicArtinLocalizedValuativeRel + +open scoped Classical in +noncomputable local instance + rationalCyclotomicArtinLocalizedValuationCompatible + (m : ℕ+) (q : Nat.Primes) : + (Valued.v : Valuation + (rationalCyclotomicArtinLocalizedField m q) ℝ≥0).Compatible := + Valuation.Compatible.ofValuation _ + +attribute [local instance] rationalCyclotomicArtinLocalizedValuationCompatible + +open scoped Classical in +noncomputable local instance + rationalCyclotomicArtinLocalizedValuationHasExtension + (m : ℕ+) (q : Nat.Primes) : + Valuation.HasExtension + (ValuativeRel.valuation + (rationalCyclotomicArtinBaseAbv q).Completion) + (ValuativeRel.valuation + (rationalCyclotomicArtinLocalizedField m q)) := + localizedCompletionValuationHasExtension + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q) + (HeightOneSpectrum.isNonarchimedean_adicAbv + ℚ (rationalCyclotomicArtinPlace q)) + +attribute [local instance] rationalCyclotomicArtinLocalizedValuationHasExtension + +open scoped Classical in +noncomputable local instance + rationalCyclotomicArtinLocalizedValuationIsNontrivial + (m : ℕ+) (q : Nat.Primes) : + (ValuativeRel.valuation + (rationalCyclotomicArtinLocalizedField m q)).IsNontrivial := + Valuation.IsNontrivial.of_hasExtension + (ValuativeRel.valuation + (rationalCyclotomicArtinBaseAbv q).Completion) + (ValuativeRel.valuation + (rationalCyclotomicArtinLocalizedField m q)) + +attribute [local instance] rationalCyclotomicArtinLocalizedValuationIsNontrivial + +open scoped Classical in +/-- The valuation relation on the localized cyclotomic field is nontrivial. -/ +theorem rationalCyclotomicArtinLocalizedValuativeRelIsNontrivial + (m : ℕ+) (q : Nat.Primes) : + ValuativeRel.IsNontrivial + (rationalCyclotomicArtinLocalizedField m q) := + (ValuativeRel.isNontrivial_iff_isNontrivial + (ValuativeRel.valuation + (rationalCyclotomicArtinLocalizedField m q))).2 inferInstance + +attribute [local instance] rationalCyclotomicArtinLocalizedValuativeRelIsNontrivial + +open scoped Classical in +/-- The localized cyclotomic topology is induced by its valuation relation. -/ +theorem rationalCyclotomicArtinLocalizedIsValuativeTopology + (m : ℕ+) (q : Nat.Primes) : + IsValuativeTopology + (rationalCyclotomicArtinLocalizedField m q) := + isValuativeTopology_of_valued_ofValuation + (rationalCyclotomicArtinLocalizedField m q) ℝ≥0 + +attribute [local instance] rationalCyclotomicArtinLocalizedIsValuativeTopology + +open scoped Classical in +/-- The localized cyclotomic field is a nonarchimedean local field. -/ +theorem rationalCyclotomicArtinLocalizedIsNonarchimedeanLocalField + (m : ℕ+) (q : Nat.Primes) : + IsNonarchimedeanLocalField + (rationalCyclotomicArtinLocalizedField m q) := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + +attribute [local instance] rationalCyclotomicArtinLocalizedIsNonarchimedeanLocalField + +open scoped Classical in +/-- The localized cyclotomic field is an algebra over the valuation ring of the rational prime +completion. -/ +noncomputable local instance + rationalCyclotomicArtinLocalizedIntegerAlgebra + (m : ℕ+) (q : Nat.Primes) : + Algebra + 𝒪[(rationalCyclotomicArtinBaseAbv q).Completion] + (rationalCyclotomicArtinLocalizedField m q) := + Algebra.ofSubsemiring + 𝒪[(rationalCyclotomicArtinBaseAbv q).Completion] + +attribute [local instance] rationalCyclotomicArtinLocalizedIntegerAlgebra + +open scoped Classical in +/-- The localized integer ring is the integral closure of the base completion's integer ring. -/ +theorem rationalCyclotomicArtinLocalizedIsIntegralClosure + (m : ℕ+) (q : Nat.Primes) : + IsIntegralClosure + 𝒪[rationalCyclotomicArtinLocalizedField m q] + 𝒪[(rationalCyclotomicArtinBaseAbv q).Completion] + (rationalCyclotomicArtinLocalizedField m q) := + localizedCompletionIsIntegralClosureWithExtension + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q) + (RayClass.adicAbv_isNontrivial + (rationalCyclotomicArtinPlace q)) + (HeightOneSpectrum.isNonarchimedean_adicAbv + ℚ (rationalCyclotomicArtinPlace q)) + +attribute [local instance] rationalCyclotomicArtinLocalizedIsIntegralClosure + +open scoped Classical in +/-- The localized integer ring is a finite module over the base completion's integer ring. -/ +theorem rationalCyclotomicArtinLocalizedIntegerModuleFinite + (m : ℕ+) (q : Nat.Primes) : + Module.Finite + 𝒪[(rationalCyclotomicArtinBaseAbv q).Completion] + 𝒪[rationalCyclotomicArtinLocalizedField m q] := + integerRing_moduleFinite_of_isIntegralClosure + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinLocalizedField m q) + +attribute [local instance] rationalCyclotomicArtinLocalizedIntegerModuleFinite + +section RationalCyclotomicPrincipalPrime + +/-! ## Ramified prime-power transport + +This section reuses the canonical finite-place Artin tower above. In +particular, it introduces no parallel completion/localization instance tower. -/ + +open scoped Classical in +/-- The level with prime-power modulus is a cyclotomic extension of that order over the +rationals. -/ +theorem rationalCyclotomicPrincipalPrimeLevelIsCyclotomicExtension + (p : Nat.Primes) (n : ℕ) : + IsCyclotomicExtension {p.1 ^ (n + 1)} ℚ + (KummerTheory.rationalCyclotomicLevel + (rationalCyclotomicPrincipalPrimeModulus p n)) := by + change + IsCyclotomicExtension + {(rationalCyclotomicPrincipalPrimeModulus p n : ℕ)} ℚ + (KummerTheory.rationalCyclotomicLevel + (rationalCyclotomicPrincipalPrimeModulus p n)) + exact + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + (rationalCyclotomicPrincipalPrimeModulus p n) + +attribute [local instance] rationalCyclotomicPrincipalPrimeLevelIsCyclotomicExtension + +open scoped Classical in +private abbrev rationalCyclotomicPrincipalPrimePlace + (p : Nat.Primes) : HeightOneSpectrum (𝓞 ℚ) := + rationalCyclotomicArtinPlace p + +open scoped Classical in +/-- The rational cyclotomic level used in the principal-prime completion comparison. -/ +abbrev rationalCyclotomicPrincipalPrimeLevel + (m : ℕ+) := + rationalCyclotomicArtinLevel m + +open scoped Classical in +/-- The chosen absolute-value extension used in the principal-prime completion comparison. -/ +abbrev rationalCyclotomicPrincipalPrimeExtension + (m : ℕ+) (p : Nat.Primes) := + rationalCyclotomicArtinExtension m p + +open scoped Classical in +/-- The `ℚ_[p]`-algebra structure on the localized cyclotomic completion, +transported through the canonical comparison with the `p`-adic completion. -/ +@[reducible] +noncomputable def + rationalCyclotomicPrincipalPrimeLocalizedPadicAlgebra + (m : ℕ+) (p : Nat.Primes) : + Algebra ℚ_[p.1] + (rationalCyclotomicLocalizedCompletion m + (RayClass.rationalPrime p)) := + ((algebraMap + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime p)).Completion + (rationalCyclotomicLocalizedCompletion m + (RayClass.rationalPrime p))).comp + (rationalFinitePlaceCompletionRingEquivPadic p).symm.toRingHom).toAlgebra + +open scoped Classical in +/-- The localized cyclotomic field carries the p-adic algebra structure used in the +principal-prime comparison. -/ +@[reducible] +noncomputable local instance + rationalCyclotomicArtinLocalizedPadicAlgebra + (m : ℕ+) (p : Nat.Primes) : + Algebra ℚ_[p.1] (rationalCyclotomicArtinLocalizedField m p) := + rationalCyclotomicPrincipalPrimeLocalizedPadicAlgebra m p + +attribute [local instance] rationalCyclotomicArtinLocalizedPadicAlgebra + +open scoped Classical in +private noncomputable def rationalFinitePlaceCompletionAlgEquivPadic + (p : Nat.Primes) : + (rationalCyclotomicArtinBaseAbv p).Completion ≃ₐ[ℚ] ℚ_[p.1] := + AlgEquiv.ofRingEquiv + (f := rationalFinitePlaceCompletionRingEquivPadic p) + (rationalFinitePlaceCompletionRingEquivPadic_algebraMap p) + +open scoped Classical in +/-- Rational scalar multiplication on the localized cyclotomic field factors through the p-adic +field. -/ +theorem rationalCyclotomicArtinLocalizedPadicScalarTower + (m : ℕ+) (p : Nat.Primes) : + IsScalarTower ℚ ℚ_[p.1] + (rationalCyclotomicArtinLocalizedField m p) := by + constructor + intro r x y + simp only [Algebra.smul_def, map_mul, eq_ratCast, + map_ratCast, mul_assoc] + +attribute [local instance] rationalCyclotomicArtinLocalizedPadicScalarTower + +open scoped Classical in +private theorem rationalCyclotomicArtin_padic_algebraMap + (m : ℕ+) (p : Nat.Primes) : + algebraMap (rationalCyclotomicArtinBaseAbv p).Completion + (rationalCyclotomicArtinLocalizedField m p) = + (algebraMap ℚ_[p.1] + (rationalCyclotomicArtinLocalizedField m p)) ∘ + (rationalFinitePlaceCompletionAlgEquivPadic p) := by + funext a + change + algebraMap (rationalCyclotomicArtinBaseAbv p).Completion + (rationalCyclotomicArtinLocalizedField m p) a = + algebraMap (rationalCyclotomicArtinBaseAbv p).Completion + (rationalCyclotomicArtinLocalizedField m p) + ((rationalFinitePlaceCompletionRingEquivPadic p).symm + (rationalFinitePlaceCompletionRingEquivPadic p a)) + exact + congrArg + (algebraMap (rationalCyclotomicArtinBaseAbv p).Completion + (rationalCyclotomicArtinLocalizedField m p)) + ((rationalFinitePlaceCompletionRingEquivPadic p).symm_apply_apply a).symm + +open scoped Classical in +private theorem rationalCyclotomicArtin_algebraAdjoin_restrictScalars + (m : ℕ+) (p : Nat.Primes) : + (Algebra.adjoin (rationalCyclotomicArtinBaseAbv p).Completion + ({rationalCyclotomicLocalizedPrimitiveRoot m + (rationalCyclotomicArtinPlace p)} : + Set (rationalCyclotomicArtinLocalizedField m p))).restrictScalars ℚ = + (Algebra.adjoin ℚ_[p.1] + ({rationalCyclotomicLocalizedPrimitiveRoot m + (rationalCyclotomicArtinPlace p)} : + Set (rationalCyclotomicArtinLocalizedField m p))).restrictScalars ℚ := by + exact + Algebra.restrictScalars_adjoin_of_algEquiv + (E := rationalCyclotomicArtinLocalizedField m p) + (rationalFinitePlaceCompletionAlgEquivPadic p) + (rationalCyclotomicArtin_padic_algebraMap m p) + ({rationalCyclotomicLocalizedPrimitiveRoot m + (rationalCyclotomicArtinPlace p)} : + Set (rationalCyclotomicArtinLocalizedField m p)) + +open scoped Classical in +private theorem + rationalCyclotomicArtin_baseAlgebraAdjoin_restrict_eq_top + (m : ℕ+) (p : Nat.Primes) : + (Algebra.adjoin (rationalCyclotomicArtinBaseAbv p).Completion + ({rationalCyclotomicLocalizedPrimitiveRoot m + (rationalCyclotomicArtinPlace p)} : + Set (rationalCyclotomicArtinLocalizedField m p))).restrictScalars ℚ = + (⊤ : Subalgebra (rationalCyclotomicArtinBaseAbv p).Completion + (rationalCyclotomicArtinLocalizedField m p)).restrictScalars ℚ := by + have hRoot : IsPrimitiveRoot + (show rationalCyclotomicArtinLocalizedField m p from + rationalCyclotomicLocalizedPrimitiveRoot m + (rationalCyclotomicArtinPlace p)) + (m : ℕ) := + rationalCyclotomicLocalizedPrimitiveRoot_isPrimitiveRoot + m (rationalCyclotomicArtinPlace p) + have hTop : + Algebra.adjoin (rationalCyclotomicArtinBaseAbv p).Completion + ({rationalCyclotomicLocalizedPrimitiveRoot m + (rationalCyclotomicArtinPlace p)} : + Set (rationalCyclotomicArtinLocalizedField m p)) = ⊤ := + IsCyclotomicExtension.adjoin_primitive_root_eq_top + (A := (rationalCyclotomicArtinBaseAbv p).Completion) + (B := rationalCyclotomicArtinLocalizedField m p) hRoot + exact congrArg + (fun A : Subalgebra (rationalCyclotomicArtinBaseAbv p).Completion + (rationalCyclotomicArtinLocalizedField m p) => A.restrictScalars ℚ) + hTop + +open scoped Classical in +private theorem rationalCyclotomicArtin_restrictScalars_top_base_eq_padic + (m : ℕ+) (p : Nat.Primes) : + (⊤ : Subalgebra (rationalCyclotomicArtinBaseAbv p).Completion + (rationalCyclotomicArtinLocalizedField m p)).restrictScalars ℚ = + (⊤ : Subalgebra ℚ_[p.1] + (rationalCyclotomicArtinLocalizedField m p)).restrictScalars ℚ := + (Subalgebra.restrictScalars_top ℚ).trans + (Subalgebra.restrictScalars_top ℚ).symm + +open scoped Classical in +private theorem + rationalCyclotomicArtin_padicAlgebraAdjoin_restrict_eq_top + (m : ℕ+) (p : Nat.Primes) : + (Algebra.adjoin ℚ_[p.1] + ({rationalCyclotomicLocalizedPrimitiveRoot m + (rationalCyclotomicArtinPlace p)} : + Set (rationalCyclotomicArtinLocalizedField m p))).restrictScalars ℚ = + (⊤ : Subalgebra ℚ_[p.1] + (rationalCyclotomicArtinLocalizedField m p)).restrictScalars ℚ := by + exact + (rationalCyclotomicArtin_algebraAdjoin_restrictScalars m p).symm.trans + ((rationalCyclotomicArtin_baseAlgebraAdjoin_restrict_eq_top m p).trans + (rationalCyclotomicArtin_restrictScalars_top_base_eq_padic m p)) + +open scoped Classical in +/-- The finite-dimensional instance for the standard multiplicative level, +named once so all consumers use the same proof term. -/ +theorem rationalCyclotomicPrincipalPrimePadicLevelFiniteDimensional + (p : Nat.Primes) (n : ℕ) : + FiniteDimensional ℚ_[p.1] + (standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p.1) n) := + standardLubinTateLevelField_finiteDimensional + (padicMultiplicativeLubinTateSeries_isUniformizer p.1) n + +attribute [local instance] + rationalCyclotomicPrincipalPrimePadicLevelFiniteDimensional + +open scoped Classical in +/-- The prime-power cyclotomic p-adic level is an abelian Galois extension of the p-adic field. +-/ +theorem rationalCyclotomicPrincipalPrimePadicLevelIsAbelianGalois + (p : Nat.Primes) (n : ℕ) : + IsAbelianGalois ℚ_[p.1] + (RationalCyclotomicPrincipalPrimePadicLevel p n) := + standardLubinTateLevelField_isAbelianGalois + (padicLocalField p.1) + (padicMultiplicativeLubinTateSeries_isUniformizer p.1) n + +attribute [local instance] rationalCyclotomicPrincipalPrimePadicLevelIsAbelianGalois + +open scoped Classical in +/-- The p-adic field is an algebra over the rational prime completion via their canonical ring +equivalence. -/ +@[reducible] +noncomputable local instance rationalPrimeFactorCompletionPadicAlgebra + (p : Nat.Primes) : + Algebra (RationalCyclotomicPrincipalPrimeCompletion p) ℚ_[p.1] := + (rationalFinitePlaceCompletionRingEquivPadic p).toRingHom.toAlgebra + +attribute [local instance] rationalPrimeFactorCompletionPadicAlgebra + +open scoped Classical in +/-- The genuine multiplicative Lubin--Tate level is generated by its +primitive `p ^ (n + 1)`-st root of unity. -/ +theorem padicMultiplicativePrimitiveRoot_adjoin_eq_top + (p : ℕ) [Fact p.Prime] (n : ℕ) : + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let T := standardLubinTateLevelField hπ n + Algebra.adjoin ℚ_[p] + ({padicMultiplicativePrimitiveRoot p n} : Set T) = + ⊤ := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let T := standardLubinTateLevelField hπ n + let ζ : T := padicMultiplicativePrimitiveRoot p n + let m := p ^ (n + 1) + let : NeZero m := + ⟨pow_ne_zero _ (Fact.out : Nat.Prime p).ne_zero⟩ + let : FiniteDimensional ℚ_[p] T := + standardLubinTateLevelField_finiteDimensional hπ n + have hζ : IsPrimitiveRoot ζ m := by + simpa only [ζ, m] using + padicMultiplicativePrimitiveRoot_isPrimitiveRoot p n + let A : IntermediateField ℚ_[p] T := + IntermediateField.adjoin ℚ_[p] {ζ} + let : IsCyclotomicExtension {m} ℚ_[p] A := + hζ.intermediateField_adjoin_isCyclotomicExtension ℚ_[p] + have hAfin : + Module.finrank ℚ_[p] A = Nat.totient m := by + exact + IsCyclotomicExtension.finrank A + (by + simpa only [m] using + padicCyclotomicPolynomial_irreducible_prime_pow_succ + p n) + have hTfin : + Module.finrank ℚ_[p] T = Nat.totient m := by + rw [standardLubinTateLevelField_finrank hπ n] + have hcard : + Nat.card (padicLocalField p).residueField = p := by + simpa [padicLocalField] using + padicCompleteDVF_residueField_card p + rw [hcard, Nat.totient_prime_pow + (Fact.out : Nat.Prime p) (Nat.succ_pos n)] + simp [Nat.mul_comm] + have hAeq : A = ⊤ := by + apply IntermediateField.eq_of_le_of_finrank_eq le_top + simpa using hAfin.trans hTfin.symm + calc + Algebra.adjoin ℚ_[p] {ζ} = A.toSubalgebra := by + exact + (IntermediateField.adjoin_toSubalgebra + ({ζ} : Set T)).symm + _ = (⊤ : IntermediateField ℚ_[p] T).toSubalgebra := + congrArg IntermediateField.toSubalgebra hAeq + _ = ⊤ := rfl + +open scoped Classical in +/-- The standard multiplicative Lubin--Tate level is the actual +`p ^ (n + 1)`-cyclotomic extension of `ℚ_p`. -/ +theorem padicMultiplicativeLevel_isCyclotomicExtension + (p : ℕ) [Fact p.Prime] (n : ℕ) : + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let T := standardLubinTateLevelField hπ n + IsCyclotomicExtension {p ^ (n + 1)} ℚ_[p] T := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let T := standardLubinTateLevelField hπ n + exact + padic_isCyclotomicExtension_of_primitiveRoot_adjoin_eq_top + (padicMultiplicativePrimitiveRoot p n) + (padicMultiplicativePrimitiveRoot_isPrimitiveRoot p n) + (padicMultiplicativePrimitiveRoot_adjoin_eq_top p n) + +open scoped Classical in +private theorem + rationalCyclotomicPrincipalPrimeLocalizedPrimitiveRoot_isPrimitiveRoot + (p : Nat.Primes) (n : ℕ) : + IsPrimitiveRoot + (rationalCyclotomicLocalizedPrimitiveRoot + (rationalCyclotomicPrincipalPrimeModulus p n) + (RayClass.rationalPrime p)) + (p.1 ^ (n + 1)) := by + change + IsPrimitiveRoot + (rationalCyclotomicLocalizedPrimitiveRoot + (rationalCyclotomicPrincipalPrimeModulus p n) + (RayClass.rationalPrime p)) + (rationalCyclotomicPrincipalPrimeModulus p n : ℕ) + exact + rationalCyclotomicLocalizedPrimitiveRoot_isPrimitiveRoot + (rationalCyclotomicPrincipalPrimeModulus p n) + (RayClass.rationalPrime p) + +open scoped Classical in +private theorem + rationalCyclotomicPrincipalPrimeLocalizedPrimitiveRoot_adjoin_eq_top + (p : Nat.Primes) (n : ℕ) : + Algebra.adjoin ℚ_[p.1] + ({rationalCyclotomicLocalizedPrimitiveRoot + (rationalCyclotomicPrincipalPrimeModulus p n) + (rationalCyclotomicArtinPlace p)} : + Set (rationalCyclotomicArtinLocalizedField + (rationalCyclotomicPrincipalPrimeModulus p n) p)) = + ⊤ := by + exact + (Subalgebra.restrictScalars_injective ℚ) + (rationalCyclotomicArtin_padicAlgebraAdjoin_restrict_eq_top + (rationalCyclotomicPrincipalPrimeModulus p n) p) + +open scoped Classical in +private theorem + rationalCyclotomicPrincipalPrimeLocalizedLevel_isCyclotomicExtension + (p : Nat.Primes) (n : ℕ) : + IsCyclotomicExtension {p.1 ^ (n + 1)} ℚ_[p.1] + (rationalCyclotomicArtinLocalizedField + (rationalCyclotomicPrincipalPrimeModulus p n) p) := by + exact + padic_isCyclotomicExtension_of_primitiveRoot_adjoin_eq_top + (rationalCyclotomicLocalizedPrimitiveRoot + (rationalCyclotomicPrincipalPrimeModulus p n) + (rationalCyclotomicArtinPlace p)) + (rationalCyclotomicPrincipalPrimeLocalizedPrimitiveRoot_isPrimitiveRoot + p n) + (rationalCyclotomicPrincipalPrimeLocalizedPrimitiveRoot_adjoin_eq_top + p n) + +open scoped Classical in +/-- The chosen localized global cyclotomic level, transported over the +completion equivalence, is the standard multiplicative Lubin--Tate level. -/ +noncomputable def rationalCyclotomicLocalizedCompletionPadicAlgEquiv + (p : Nat.Primes) (n : ℕ) : + rationalCyclotomicArtinLocalizedField + (rationalCyclotomicPrincipalPrimeModulus p n) p ≃ₐ[ℚ_[p.1]] + RationalCyclotomicPrincipalPrimePadicLevel p n := by + letI : IsCyclotomicExtension {p.1 ^ (n + 1)} ℚ_[p.1] + (rationalCyclotomicArtinLocalizedField + (rationalCyclotomicPrincipalPrimeModulus p n) p) := + rationalCyclotomicPrincipalPrimeLocalizedLevel_isCyclotomicExtension p n + letI : IsCyclotomicExtension {p.1 ^ (n + 1)} ℚ_[p.1] + (RationalCyclotomicPrincipalPrimePadicLevel p n) := + padicMultiplicativeLevel_isCyclotomicExtension p.1 n + exact + IsCyclotomicExtension.algEquiv + {p.1 ^ (n + 1)} ℚ_[p.1] + (rationalCyclotomicArtinLocalizedField + (rationalCyclotomicPrincipalPrimeModulus p n) p) + (RationalCyclotomicPrincipalPrimePadicLevel p n) + +/-! ## The ramified principal finite-place factor -/ + +open scoped Classical in +private theorem + rationalCyclotomicPrincipalPrime_galEquivZMod_eq_of_action + (p : Nat.Primes) (n : ℕ) + (sigma : Gal(rationalCyclotomicPrincipalPrimeLevel + (rationalCyclotomicPrincipalPrimeModulus p n)/ℚ)) + (a : (ZMod (p.1 ^ (n + 1)))ˣ) + (haction : + sigma (rationalCyclotomicLevelPrimitiveRoot + (rationalCyclotomicPrincipalPrimeModulus p n)) = + rationalCyclotomicLevelPrimitiveRoot + (rationalCyclotomicPrincipalPrimeModulus p n) ^ a.val.val) : + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ (n + 1)) + (rationalCyclotomicPrincipalPrimeLevel + (rationalCyclotomicPrincipalPrimeModulus p n)) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + (rationalCyclotomicPrincipalPrimeModulus p n)) sigma = + a := by + let m := rationalCyclotomicPrincipalPrimeModulus p n + let L := rationalCyclotomicPrincipalPrimeLevel m + let zeta : L := rationalCyclotomicLevelPrimitiveRoot m + have hzeta : IsPrimitiveRoot zeta (p.1 ^ (n + 1)) := by + change + IsPrimitiveRoot + (rationalCyclotomicLevelPrimitiveRoot m) (m : ℕ) + exact rationalCyclotomicLevelPrimitiveRoot_isPrimitiveRoot m + change + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ (n + 1)) L + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension m) + sigma = a + let c := + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ (n + 1)) L + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension m) + sigma + have hc : + sigma zeta = zeta ^ c.val.val := + IsCyclotomicExtension.Rat.galEquivZMod_apply_of_pow_eq + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension m) + (p.1 ^ (n + 1)) L sigma hzeta.pow_eq_one + have hpowers : + zeta ^ c.val.val = zeta ^ a.val.val := + hc.symm.trans haction + rw [(hzeta.isOfFinOrder m.ne_zero).pow_inj_mod, + ← hzeta.eq_orderOf, + ← ZMod.natCast_eq_natCast_iff'] at hpowers + change + (c.val.val : ZMod (p.1 ^ (n + 1))) = + (a.val.val : ZMod (p.1 ^ (n + 1))) at hpowers + have hValues : c.val = a.val := by + calc + c.val = (c.val.val : ZMod (p.1 ^ (n + 1))) := + (ZMod.natCast_zmod_val c.val).symm + _ = (a.val.val : ZMod (p.1 ^ (n + 1))) := hpowers + _ = a.val := ZMod.natCast_zmod_val a.val + change c = a + apply Units.ext + exact hValues + +open scoped Classical in +/-- The chosen finite-place Artin map factors through any extension identified +with the chosen one. -/ +theorem chosenFinitePlaceArtinMonoidHom_apply_factor_of_extension_eq + {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) + (hw : chosenFinitePlaceExtension (L := L) v = w) + (x : (v.adicCompletion K)ˣ) : + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x = + finitePlaceLocalToGlobalMonoidHom + (K := K) (L := L) v w + (finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v w x) := by + subst w + exact + congrArg + (fun f : (v.adicCompletion K)ˣ →* (L ≃ₐ[K] L) => f x) + (finitePlaceArtinMonoidHomOfExtension_factor + (K := K) (L := L) v + (chosenFinitePlaceExtension (L := L) v)) + +open scoped Classical in +private theorem + chosenFinitePlaceArtinMonoidHom_apply_factor_of_extension_eq_at + {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) + (hw : chosenFinitePlaceExtension (L := L) v = w) + (x : (v.adicCompletion K)ˣ) (z : L) : + chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x z = + finitePlaceLocalToGlobalMonoidHom + (K := K) (L := L) v w + (finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v w x) z := by + exact + congrArg (fun sigma : Gal(L/K) => sigma z) + (chosenFinitePlaceArtinMonoidHom_apply_factor_of_extension_eq + (K := K) (L := L) v w hw x) + +open scoped Classical in +private theorem finitePlaceLocalToGlobalMonoidHom_apply_pow_of_localized_action + {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [IsAbelianGalois K L] + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) + (sigma : + let vK := HeightOneSpectrum.adicAbv K v + let E := LocalizedCompletion vK w + letI : Algebra vK.Completion E := + finitePlaceLocalArtinLocalizedAlgebra v w + Gal(E/vK.Completion)) + (z : L) + (zLocal : + let vK := HeightOneSpectrum.adicAbv K v + LocalizedCompletion vK w) + (e : ℕ) + (hLocalization : + let vK := HeightOneSpectrum.adicAbv K v + let E := LocalizedCompletion vK w + letI : Algebra vK.Completion E := + finitePlaceLocalArtinLocalizedAlgebra v w + let eLoc : L →+* E := + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + eLoc z = zLocal) + (hlocal : sigma zLocal = zLocal ^ e) : + finitePlaceLocalToGlobalMonoidHom + (K := K) (L := L) v w sigma z = z ^ e := by + let vK := HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := RayClass.adicAbv_isNontrivial v + let E := LocalizedCompletion vK w + let : Algebra vK.Completion E := + finitePlaceLocalArtinLocalizedAlgebra v w + let eD : absoluteValueDecompositionGroup K w.1 ≃* Gal(E/vK.Completion) := + decompositionGroupEquivAlgebraicLocalizationAut vK hvK w + let eLoc : L →+* E := + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + let delta : absoluteValueDecompositionGroup K w.1 := eD.symm sigma + have hDecomposition : eD delta = sigma := eD.apply_symm_apply sigma + apply eLoc.injective + calc + eLoc (finitePlaceLocalToGlobalMonoidHom + (K := K) (L := L) v w sigma z) = + eD delta (eLoc z) := + (localizationRamificationGroups_decompositionGroupEquiv_toLocalization + vK hvK w delta z).symm + _ = sigma (eLoc z) := + congrArg (fun tau : Gal(E/vK.Completion) => tau (eLoc z)) + hDecomposition + _ = sigma zLocal := + congrArg (fun y : E => sigma y) hLocalization + _ = zLocal ^ e := hlocal + _ = (eLoc z) ^ e := + congrArg (fun y : E => y ^ e) hLocalization.symm + _ = eLoc (z ^ e) := (map_pow eLoc z e).symm + +open scoped Classical in +private theorem map_primitiveRoot_eq_pow_of_eq_pow + {M : Type} [CommRing M] [IsDomain M] + (f : M →* M) (zeta rho : M) (order exponent : ℕ) + [NeZero order] + (hzeta : IsPrimitiveRoot zeta order) + (hrho : IsPrimitiveRoot rho order) + (hf : f zeta = zeta ^ exponent) : + f rho = rho ^ exponent := by + obtain ⟨j, -, hj⟩ := + hzeta.eq_pow_of_pow_eq_one hrho.pow_eq_one + calc + f rho = f (zeta ^ j) := congrArg f hj.symm + _ = (f zeta) ^ j := map_pow f zeta j + _ = (zeta ^ exponent) ^ j := congrArg (fun z => z ^ j) hf + _ = zeta ^ (exponent * j) := (pow_mul zeta exponent j).symm + _ = zeta ^ (j * exponent) := + congrArg (fun e : ℕ => zeta ^ e) (Nat.mul_comm exponent j) + _ = (zeta ^ j) ^ exponent := pow_mul zeta j exponent + _ = rho ^ exponent := congrArg (fun z => z ^ exponent) hj + +open scoped Classical in +private theorem finitePlaceLocalArtinMonoidHom_apply_semilinear + {K L K' L' : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [hKLfinite : FiniteDimensional K L] [IsAbelianGalois K L] + [Field K'] [ValuativeRel K'] [TopologicalSpace K'] + [IsNonarchimedeanLocalField K'] + [Field L'] [Algebra K' L'] + [FiniteDimensional K' L'] [IsAbelianGalois K' L'] + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) + (eK : (HeightOneSpectrum.adicAbv K v).Completion ≃+* K') + (eL : LocalizedCompletion + (HeightOneSpectrum.adicAbv K v) w ≃+* L') + (hcomm : ∀ y : (HeightOneSpectrum.adicAbv K v).Completion, + eL (@algebraMap + (HeightOneSpectrum.adicAbv K v).Completion + (LocalizedCompletion (HeightOneSpectrum.adicAbv K v) w) + _ _ (finitePlaceLocalArtinLocalizedAlgebra v w) y) = + algebraMap K' L' (eK y)) + (hExt : SemilinearValuationCompatible + (HeightOneSpectrum.adicAbv K v).Completion K' eK) + (x : (v.adicCompletion K)ˣ) + (z : LocalizedCompletion (HeightOneSpectrum.adicAbv K v) w) : + eL (finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v w x z) = + LocalClassFieldTheory.abelianLocalArtinMonoidHom K' L' + (Units.map eK.toMonoidHom + (finitePlaceLocalArtinInput v x)) (eL z) := by + calc + eL (finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v w x z) = + eL ((@LocalClassFieldTheory.abelianLocalArtinMonoidHom + (HeightOneSpectrum.adicAbv K v).Completion + (LocalizedCompletion (HeightOneSpectrum.adicAbv K v) w) + (inferInstance : Field + (HeightOneSpectrum.adicAbv K v).Completion) + (inferInstance : Field + (LocalizedCompletion (HeightOneSpectrum.adicAbv K v) w)) + (finitePlaceLocalArtinLocalizedAlgebra v w) + (finitePlaceLocalArtinCompletionValuativeRel v) + (inferInstance : TopologicalSpace + (HeightOneSpectrum.adicAbv K v).Completion) + (finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v) + (finitePlaceLocalArtinFiniteDimensional v w) + (finitePlaceLocalArtinIsAbelianGalois v w hKLfinite) + (finitePlaceLocalArtinInput v x)) z) := + congrArg eL + (finitePlaceLocalArtinMonoidHom_apply_normalized_at + (K := K) (L := L) v w x z) + _ = LocalClassFieldTheory.abelianLocalArtinMonoidHom K' L' + (Units.map eK.toMonoidHom + (finitePlaceLocalArtinInput v x)) (eL z) := + @abelianLocalArtinMonoidHom_semilinear_action + (HeightOneSpectrum.adicAbv K v).Completion K' + (LocalizedCompletion (HeightOneSpectrum.adicAbv K v) w) L' + (inferInstance : Field + (HeightOneSpectrum.adicAbv K v).Completion) + (finitePlaceLocalArtinCompletionValuativeRel v) + (inferInstance : TopologicalSpace + (HeightOneSpectrum.adicAbv K v).Completion) + (finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v) + (inferInstance : Field K') + (inferInstance : ValuativeRel K') + (inferInstance : TopologicalSpace K') + (inferInstance : IsNonarchimedeanLocalField K') + (inferInstance : Field + (LocalizedCompletion (HeightOneSpectrum.adicAbv K v) w)) + (inferInstance : Field L') + (finitePlaceLocalArtinLocalizedAlgebra v w) + (inferInstance : Algebra K' L') + (finitePlaceLocalArtinFiniteDimensional v w) + (finitePlaceLocalArtinIsAbelianGalois v w hKLfinite) + (inferInstance : FiniteDimensional K' L') + (inferInstance : IsAbelianGalois K' L') + eK eL hcomm hExt (finitePlaceLocalArtinInput v x) z + +open scoped Classical in +/-- If a semilinearly identified target local Artin value is trivial, then the +corresponding global finite-place Artin value is trivial. This generic bridge +keeps concrete completion and localization instance towers out of downstream +proof terms. -/ +theorem finitePlaceArtinMonoidHomOfExtension_eq_one_of_semilinear + {K L K' L' : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [hKLfinite : FiniteDimensional K L] [IsAbelianGalois K L] + [Field K'] [ValuativeRel K'] [TopologicalSpace K'] + [IsNonarchimedeanLocalField K'] + [Field L'] [Algebra K' L'] + [FiniteDimensional K' L'] [IsAbelianGalois K' L'] + (v : HeightOneSpectrum (𝓞 K)) + (w : AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v) L) + (eK : (HeightOneSpectrum.adicAbv K v).Completion ≃+* K') + (eL : LocalizedCompletion + (HeightOneSpectrum.adicAbv K v) w ≃+* L') + (hcomm : ∀ y : (HeightOneSpectrum.adicAbv K v).Completion, + eL (@algebraMap + (HeightOneSpectrum.adicAbv K v).Completion + (LocalizedCompletion (HeightOneSpectrum.adicAbv K v) w) + _ _ (finitePlaceLocalArtinLocalizedAlgebra v w) y) = + algebraMap K' L' (eK y)) + (hExt : SemilinearValuationCompatible + (HeightOneSpectrum.adicAbv K v).Completion K' eK) + (x : (v.adicCompletion K)ˣ) + (htrivial : + LocalClassFieldTheory.abelianLocalArtinMonoidHom K' L' + (Units.map eK.toMonoidHom + (finitePlaceLocalArtinInput v x)) = 1) : + finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v w x = 1 := by + rw [finitePlaceArtinMonoidHomOfExtension_factor, + MonoidHom.comp_apply] + have hlocal : + finitePlaceLocalArtinMonoidHom + (K := K) (L := L) v w x = 1 := by + rw [finitePlaceLocalArtinMonoidHom_apply_normalized] + exact + @abelianLocalArtinMonoidHom_eq_one_of_semilinear + (HeightOneSpectrum.adicAbv K v).Completion K' + (LocalizedCompletion (HeightOneSpectrum.adicAbv K v) w) L' + (inferInstance : Field + (HeightOneSpectrum.adicAbv K v).Completion) + (finitePlaceLocalArtinCompletionValuativeRel v) + (inferInstance : TopologicalSpace + (HeightOneSpectrum.adicAbv K v).Completion) + (finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v) + (inferInstance : Field K') + (inferInstance : ValuativeRel K') + (inferInstance : TopologicalSpace K') + (inferInstance : IsNonarchimedeanLocalField K') + (inferInstance : Field + (LocalizedCompletion (HeightOneSpectrum.adicAbv K v) w)) + (inferInstance : Field L') + (finitePlaceLocalArtinLocalizedAlgebra v w) + (inferInstance : Algebra K' L') + (finitePlaceLocalArtinFiniteDimensional v w) + (finitePlaceLocalArtinIsAbelianGalois v w hKLfinite) + (inferInstance : FiniteDimensional K' L') + (inferInstance : IsAbelianGalois K' L') + eK eL hcomm hExt (finitePlaceLocalArtinInput v x) htrivial + rw [hlocal, map_one] + +open scoped Classical in +private noncomputable def rationalCyclotomicPrincipalPrimeLocalizedRoot + (p : Nat.Primes) (n : ℕ) : + rationalCyclotomicArtinLocalizedField + (rationalCyclotomicPrincipalPrimeModulus p n) p := + rationalCyclotomicLocalizedPrimitiveRoot + (rationalCyclotomicPrincipalPrimeModulus p n) + (RayClass.rationalPrime p) + +open scoped Classical in +private noncomputable def rationalCyclotomicPrincipalPrimeResidueUnit + (p : Nat.Primes) (n : ℕ) (x : ℚˣ) : + (ZMod (p.1 ^ (n + 1)))ˣ := + Units.map + (PadicInt.toZModPow (p := p.1) (n + 1)).toMonoidHom + (padicIntUnitOfRat p + (rationalPrimeUnit x p : ℚ) + (rationalPrimeUnit x p).ne_zero + (padicValRat_rationalPrimeUnit x p)) + +open scoped Classical in +private theorem rationalCyclotomicPrincipalPrime_localizedBase_commutes + (p : Nat.Primes) (n : ℕ) + (y : (rationalCyclotomicArtinBaseAbv p).Completion) : + rationalCyclotomicLocalizedCompletionPadicAlgEquiv p n + (algebraMap (rationalCyclotomicArtinBaseAbv p).Completion + (rationalCyclotomicArtinLocalizedField + (rationalCyclotomicPrincipalPrimeModulus p n) p) y) = + algebraMap ℚ_[p.1] + (RationalCyclotomicPrincipalPrimePadicLevel p n) + (rationalFinitePlaceCompletionRingEquivPadic p y) := by + let m := rationalCyclotomicPrincipalPrimeModulus p n + let E := rationalCyclotomicArtinLocalizedField m p + let eL := rationalCyclotomicLocalizedCompletionPadicAlgEquiv p n + have hy : + algebraMap (rationalCyclotomicArtinBaseAbv p).Completion E y = + algebraMap ℚ_[p.1] E + (rationalFinitePlaceCompletionRingEquivPadic p y) := by + change + algebraMap (rationalCyclotomicArtinBaseAbv p).Completion E y = + algebraMap (rationalCyclotomicArtinBaseAbv p).Completion E + ((rationalFinitePlaceCompletionRingEquivPadic p).symm + (rationalFinitePlaceCompletionRingEquivPadic p y)) + exact + (congrArg + (algebraMap (rationalCyclotomicArtinBaseAbv p).Completion E) + ((rationalFinitePlaceCompletionRingEquivPadic p).symm_apply_apply y)).symm + calc + eL (algebraMap (rationalCyclotomicArtinBaseAbv p).Completion E y) = + eL (algebraMap ℚ_[p.1] E + (rationalFinitePlaceCompletionRingEquivPadic p y)) := + congrArg eL hy + _ = algebraMap ℚ_[p.1] + (RationalCyclotomicPrincipalPrimePadicLevel p n) + (rationalFinitePlaceCompletionRingEquivPadic p y) := + eL.commutes (rationalFinitePlaceCompletionRingEquivPadic p y) + +open scoped Classical in +/-- Specialized ramified-prime bridge from the standard `p`-adic Artin value +to the canonical global finite-place Artin value. The localized completion +and all of its dependent instances remain private to this provider. -/ +theorem + rationalCyclotomicPrincipalPrime_finitePlaceArtinOfExtension_eq_one_of_padic + (p : Nat.Primes) (n : ℕ) + (x : ((RayClass.rationalPrime p).adicCompletion ℚ)ˣ) + (htrivial : + abelianLocalArtinMonoidHom ℚ_[p.1] + (RationalCyclotomicPrincipalPrimePadicLevel p n) + (Units.map + (rationalFinitePlaceCompletionRingEquivPadic p).toMonoidHom + (finitePlaceLocalArtinInput (RayClass.rationalPrime p) x)) = 1) : + finitePlaceArtinMonoidHomOfExtension + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel + (rationalCyclotomicPrincipalPrimeModulus p n)) + (RayClass.rationalPrime p) + (rationalCyclotomicChosenFinitePlaceExtension + (rationalCyclotomicPrincipalPrimeModulus p n) + (RayClass.rationalPrime p)) x = 1 := by + exact + finitePlaceArtinMonoidHomOfExtension_eq_one_of_semilinear + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel + (rationalCyclotomicPrincipalPrimeModulus p n)) + (K' := ℚ_[p.1]) + (L' := RationalCyclotomicPrincipalPrimePadicLevel p n) + (RayClass.rationalPrime p) + (rationalCyclotomicChosenFinitePlaceExtension + (rationalCyclotomicPrincipalPrimeModulus p n) + (RayClass.rationalPrime p)) + (rationalFinitePlaceCompletionRingEquivPadic p) + (rationalCyclotomicLocalizedCompletionPadicAlgEquiv p n).toRingEquiv + (rationalCyclotomicPrincipalPrime_localizedBase_commutes p n) + (rationalFinitePlaceCompletionRingEquivPadic_semilinearValuationCompatible p) + x htrivial + +open scoped Classical in +private theorem + padicMultiplicativePrimitiveRoot_rationalPrimeUnitParameterGaloisAction + (p : Nat.Primes) (n : ℕ) (x : ℚˣ) : + standardLubinTateUnitParameterEquivGal + (padicLocalField p.1) + (padicMultiplicativeLubinTateSeries_isUniformizer p.1) n + (standardLubinTateUnitParameterClass + (padicLocalField p.1) n + (rationalPrimeUnitValuationSubringUnit x p)) + (padicMultiplicativePrimitiveRoot p.1 n) = + padicMultiplicativePrimitiveRoot p.1 n ^ + (PadicInt.toZModPow (p := p.1) (n + 1) + (padicIntUnitOfRat p + (rationalPrimeUnit x p : ℚ) + (rationalPrimeUnit x p).ne_zero + (padicValRat_rationalPrimeUnit x p) : ℤ_[p.1])).val := by + let uZ : ℤ_[p.1]ˣ := + padicIntUnitOfRat p + (rationalPrimeUnit x p : ℚ) + (rationalPrimeUnit x p).ne_zero + (padicValRat_rationalPrimeUnit x p) + let u : (padicLocalField p.1).valuationSubringˣ := + Units.map (padicIntEquivValuationSubring p.1).toMonoidHom uZ + have huRational : + rationalPrimeUnitValuationSubringUnit x p = u := by + rfl + have huPreimage : + (padicIntEquivValuationSubring p.1).symm + ((u : (padicLocalField p.1).valuationSubringˣ) : + (padicLocalField p.1).valuationSubring) = + (uZ : ℤ_[p.1]) := by + change + (padicIntEquivValuationSubring p.1).symm + (padicIntEquivValuationSubring p.1 (uZ : ℤ_[p.1])) = + (uZ : ℤ_[p.1]) + exact + (padicIntEquivValuationSubring p.1).symm_apply_apply + (uZ : ℤ_[p.1]) + have hAction := + padicMultiplicativePrimitiveRoot_unitParameterGaloisAction + p.1 n u + rw [huPreimage] at hAction + rw [huRational] + exact hAction + +open scoped Classical in +private noncomputable def rationalCyclotomicPrincipalPrimePadicTargetArtin + (p : Nat.Primes) (n : ℕ) (x : ℚˣ) : + Gal(RationalCyclotomicPrincipalPrimePadicLevel p n/ℚ_[p.1]) := + @LocalClassFieldTheory.abelianLocalArtinMonoidHom + ℚ_[p.1] (RationalCyclotomicPrincipalPrimePadicLevel p n) + (inferInstance : Field ℚ_[p.1]) + (inferInstance : Field + (RationalCyclotomicPrincipalPrimePadicLevel p n)) + (inferInstance : Algebra ℚ_[p.1] + (RationalCyclotomicPrincipalPrimePadicLevel p n)) + (inferInstance : ValuativeRel ℚ_[p.1]) + (inferInstance : TopologicalSpace ℚ_[p.1]) + (inferInstance : IsNonarchimedeanLocalField ℚ_[p.1]) + (rationalCyclotomicPrincipalPrimePadicLevelFiniteDimensional p n) + (standardLubinTateLevelField_isAbelianGalois + (padicLocalField p.1) + (padicMultiplicativeLubinTateSeries_isUniformizer p.1) n) + (Units.map + (rationalFinitePlaceCompletionRingEquivPadic p).toMonoidHom + (rationalPrincipalFinitePlaceInput x p)) + +open scoped Classical in +private noncomputable def + rationalCyclotomicPrincipalPrimePadicUnitParameterArtin + (p : Nat.Primes) (n : ℕ) (x : ℚˣ) : + Gal(RationalCyclotomicPrincipalPrimePadicLevel p n/ℚ_[p.1]) := + standardLubinTateUnitParameterEquivGal + (padicLocalField p.1) + (padicMultiplicativeLubinTateSeries_isUniformizer p.1) n + (standardLubinTateUnitParameterClass + (padicLocalField p.1) n + (rationalPrimeUnitValuationSubringUnit x p)) + +open scoped Classical in +private theorem + rationalCyclotomicPrincipalPrime_padicTargetArtin_eq_unitParameter + (p : Nat.Primes) (n : ℕ) (x : ℚˣ) : + rationalCyclotomicPrincipalPrimePadicTargetArtin p n x = + rationalCyclotomicPrincipalPrimePadicUnitParameterArtin p n x := by + let T := RationalCyclotomicPrincipalPrimePadicLevel p n + let eK := rationalFinitePlaceCompletionRingEquivPadic p + let : FiniteDimensional ℚ_[p.1] T := + rationalCyclotomicPrincipalPrimePadicLevelFiniteDimensional p n + let hpi := padicMultiplicativeLubinTateSeries_isUniformizer p.1 + let : IsAbelianGalois ℚ_[p.1] T := + standardLubinTateLevelField_isAbelianGalois + (padicLocalField p.1) hpi n + have hsource : + Units.map eK.toMonoidHom (rationalPrincipalFinitePlaceInput x p) = + Units.map (algebraMap ℚ ℚ_[p.1]).toMonoidHom x := by + rw [rationalPrincipalFinitePlaceInput_eq_algebraMap] + apply Units.ext + exact rationalFinitePlaceCompletionRingEquivPadic_algebraMap p (x : ℚ) + change + LocalClassFieldTheory.abelianLocalArtinMonoidHom ℚ_[p.1] T + (Units.map eK.toMonoidHom + (rationalPrincipalFinitePlaceInput x p)) = + standardLubinTateUnitParameterEquivGal + (padicLocalField p.1) hpi n + (standardLubinTateUnitParameterClass + (padicLocalField p.1) n + (rationalPrimeUnitValuationSubringUnit x p)) + rw [hsource] + rw [ + padicMultiplicativeAbelianLocalArtin_eq_uniformizerUnitPart, + rationalPadicFieldUnit_uniformizerUnitPart, + padicMultiplicativeAbelianLocalArtin_eq_unitParameter] + +open scoped Classical in +private theorem + rationalCyclotomicPrincipalPrime_padicArtin_action_eq_unitParameter + (p : Nat.Primes) (n : ℕ) (x : ℚˣ) : + (@LocalClassFieldTheory.abelianLocalArtinMonoidHom + ℚ_[p.1] (RationalCyclotomicPrincipalPrimePadicLevel p n) + (inferInstance : Field ℚ_[p.1]) + (inferInstance : Field + (RationalCyclotomicPrincipalPrimePadicLevel p n)) + (inferInstance : Algebra ℚ_[p.1] + (RationalCyclotomicPrincipalPrimePadicLevel p n)) + (inferInstance : ValuativeRel ℚ_[p.1]) + (inferInstance : TopologicalSpace ℚ_[p.1]) + (inferInstance : IsNonarchimedeanLocalField ℚ_[p.1]) + (rationalCyclotomicPrincipalPrimePadicLevelFiniteDimensional p n) + (standardLubinTateLevelField_isAbelianGalois + (padicLocalField p.1) + (padicMultiplicativeLubinTateSeries_isUniformizer p.1) n) + (Units.map + (rationalFinitePlaceCompletionRingEquivPadic p).toMonoidHom + (finitePlaceLocalArtinInput + (K := ℚ) (RayClass.rationalPrime p) + (IdeleGroup.finiteComponent + (RayClass.rationalPrime p) + (IdeleGroup.principalIdele ℚ x))))) + ((rationalCyclotomicLocalizedCompletionPadicAlgEquiv p n).toRingEquiv + (rationalCyclotomicPrincipalPrimeLocalizedRoot p n)) = + rationalCyclotomicPrincipalPrimePadicUnitParameterArtin p n x + (rationalCyclotomicLocalizedCompletionPadicAlgEquiv p n + (rationalCyclotomicPrincipalPrimeLocalizedRoot p n)) := by + let eK := rationalFinitePlaceCompletionRingEquivPadic p + have hInput : + finitePlaceLocalArtinInput + (K := ℚ) (RayClass.rationalPrime p) + (IdeleGroup.finiteComponent + (RayClass.rationalPrime p) + (IdeleGroup.principalIdele ℚ x)) = + rationalPrincipalFinitePlaceInput x p := by + rfl + have hMapped : + Units.map eK.toMonoidHom + (finitePlaceLocalArtinInput + (K := ℚ) (RayClass.rationalPrime p) + (IdeleGroup.finiteComponent + (RayClass.rationalPrime p) + (IdeleGroup.principalIdele ℚ x))) = + Units.map eK.toMonoidHom + (rationalPrincipalFinitePlaceInput x p) := + congrArg (Units.map eK.toMonoidHom) hInput + calc + _ = rationalCyclotomicPrincipalPrimePadicTargetArtin p n x + (rationalCyclotomicLocalizedCompletionPadicAlgEquiv p n + (rationalCyclotomicPrincipalPrimeLocalizedRoot p n)) := by + exact congrArg + (fun uQp => + (@LocalClassFieldTheory.abelianLocalArtinMonoidHom + ℚ_[p.1] (RationalCyclotomicPrincipalPrimePadicLevel p n) + (inferInstance : Field ℚ_[p.1]) + (inferInstance : Field + (RationalCyclotomicPrincipalPrimePadicLevel p n)) + (inferInstance : Algebra ℚ_[p.1] + (RationalCyclotomicPrincipalPrimePadicLevel p n)) + (inferInstance : ValuativeRel ℚ_[p.1]) + (inferInstance : TopologicalSpace ℚ_[p.1]) + (inferInstance : IsNonarchimedeanLocalField ℚ_[p.1]) + (rationalCyclotomicPrincipalPrimePadicLevelFiniteDimensional p n) + (standardLubinTateLevelField_isAbelianGalois + (padicLocalField p.1) + (padicMultiplicativeLubinTateSeries_isUniformizer p.1) n) + uQp) + (rationalCyclotomicLocalizedCompletionPadicAlgEquiv p n + (rationalCyclotomicPrincipalPrimeLocalizedRoot p n))) + hMapped + _ = rationalCyclotomicPrincipalPrimePadicUnitParameterArtin p n x + (rationalCyclotomicLocalizedCompletionPadicAlgEquiv p n + (rationalCyclotomicPrincipalPrimeLocalizedRoot p n)) := + congrArg + (fun tau => tau + (rationalCyclotomicLocalizedCompletionPadicAlgEquiv p n + (rationalCyclotomicPrincipalPrimeLocalizedRoot p n))) + (rationalCyclotomicPrincipalPrime_padicTargetArtin_eq_unitParameter + p n x) + +open scoped Classical in +private theorem + rationalCyclotomicPrincipalPrime_padicUnitParameterArtin_action + (p : Nat.Primes) (n : ℕ) (x : ℚˣ) : + rationalCyclotomicPrincipalPrimePadicUnitParameterArtin p n x + (rationalCyclotomicLocalizedCompletionPadicAlgEquiv p n + (rationalCyclotomicPrincipalPrimeLocalizedRoot p n)) = + (rationalCyclotomicLocalizedCompletionPadicAlgEquiv p n + (rationalCyclotomicPrincipalPrimeLocalizedRoot p n)) ^ + (rationalCyclotomicPrincipalPrimeResidueUnit p n x).val.val := by + let m := rationalCyclotomicPrincipalPrimeModulus p n + let E := rationalCyclotomicArtinLocalizedField m p + let T := RationalCyclotomicPrincipalPrimePadicLevel p n + let eL : E ≃ₐ[ℚ_[p.1]] T := + rationalCyclotomicLocalizedCompletionPadicAlgEquiv p n + let zetaE : E := rationalCyclotomicPrincipalPrimeLocalizedRoot p n + let tau : Gal(T/ℚ_[p.1]) := + rationalCyclotomicPrincipalPrimePadicUnitParameterArtin p n x + let a := rationalCyclotomicPrincipalPrimeResidueUnit p n x + let zetaT : T := padicMultiplicativePrimitiveRoot p.1 n + have hzetaE : IsPrimitiveRoot zetaE (p.1 ^ (n + 1)) := by + change + IsPrimitiveRoot + (rationalCyclotomicLocalizedPrimitiveRoot m + (RayClass.rationalPrime p)) (m : ℕ) + exact + rationalCyclotomicLocalizedPrimitiveRoot_isPrimitiveRoot + m (RayClass.rationalPrime p) + have hrho : IsPrimitiveRoot (eL zetaE) (p.1 ^ (n + 1)) := + hzetaE.map_of_injective eL.injective + have hzetaT : IsPrimitiveRoot zetaT (p.1 ^ (n + 1)) := + padicMultiplicativePrimitiveRoot_isPrimitiveRoot p.1 n + have htauZetaT : tau zetaT = zetaT ^ a.val.val := + padicMultiplicativePrimitiveRoot_rationalPrimeUnitParameterGaloisAction + p n x + exact + map_primitiveRoot_eq_pow_of_eq_pow + tau.toMonoidHom zetaT (eL zetaE) + (p.1 ^ (n + 1)) a.val.val hzetaT hrho htauZetaT + +open scoped Classical in +private theorem rationalCyclotomicPrincipalPrime_localArtin_action + (p : Nat.Primes) (n : ℕ) (x : ℚˣ) : + finitePlaceLocalArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel + (rationalCyclotomicPrincipalPrimeModulus p n)) + (RayClass.rationalPrime p) + (rationalCyclotomicChosenFinitePlaceExtension + (rationalCyclotomicPrincipalPrimeModulus p n) + (RayClass.rationalPrime p)) + (IdeleGroup.finiteComponent + (RayClass.rationalPrime p) + (IdeleGroup.principalIdele ℚ x)) + (rationalCyclotomicPrincipalPrimeLocalizedRoot p n) = + (rationalCyclotomicPrincipalPrimeLocalizedRoot p n) ^ + (rationalCyclotomicPrincipalPrimeResidueUnit p n x).val.val := by + let eL := rationalCyclotomicLocalizedCompletionPadicAlgEquiv p n + apply eL.injective + calc + _ = _ := + finitePlaceLocalArtinMonoidHom_apply_semilinear + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel + (rationalCyclotomicPrincipalPrimeModulus p n)) + (K' := ℚ_[p.1]) + (L' := RationalCyclotomicPrincipalPrimePadicLevel p n) + (RayClass.rationalPrime p) + (rationalCyclotomicChosenFinitePlaceExtension + (rationalCyclotomicPrincipalPrimeModulus p n) + (RayClass.rationalPrime p)) + (rationalFinitePlaceCompletionRingEquivPadic p) + eL.toRingEquiv + (rationalCyclotomicPrincipalPrime_localizedBase_commutes p n) + (rationalFinitePlaceCompletionRingEquivPadic_semilinearValuationCompatible + p) + (IdeleGroup.finiteComponent + (RayClass.rationalPrime p) + (IdeleGroup.principalIdele ℚ x)) + (rationalCyclotomicPrincipalPrimeLocalizedRoot p n) + _ = rationalCyclotomicPrincipalPrimePadicUnitParameterArtin p n x + (eL (rationalCyclotomicPrincipalPrimeLocalizedRoot p n)) := + rationalCyclotomicPrincipalPrime_padicArtin_action_eq_unitParameter + p n x + _ = (eL (rationalCyclotomicPrincipalPrimeLocalizedRoot p n)) ^ + (rationalCyclotomicPrincipalPrimeResidueUnit p n x).val.val := + rationalCyclotomicPrincipalPrime_padicUnitParameterArtin_action p n x + _ = eL ((rationalCyclotomicPrincipalPrimeLocalizedRoot p n) ^ + (rationalCyclotomicPrincipalPrimeResidueUnit p n x).val.val) := + (map_pow eL (rationalCyclotomicPrincipalPrimeLocalizedRoot p n) + (rationalCyclotomicPrincipalPrimeResidueUnit p n x).val.val).symm + +open scoped Classical in +/-- The finite-place Artin symbol at the ramified prime, in its canonical +local-to-global factored form. Keeping this specialization opaque prevents its +dependent local/global instance tower from being unfolded downstream. -/ +noncomputable def rationalCyclotomicPrincipalPrimeChosenArtin + (p : Nat.Primes) (n : ℕ) (x : ℚˣ) : + KummerTheory.rationalCyclotomicLevel + (rationalCyclotomicPrincipalPrimeModulus p n) ≃ₐ[ℚ] + KummerTheory.rationalCyclotomicLevel + (rationalCyclotomicPrincipalPrimeModulus p n) := + finitePlaceLocalToGlobalMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel + (rationalCyclotomicPrincipalPrimeModulus p n)) + (RayClass.rationalPrime p) + (rationalCyclotomicChosenFinitePlaceExtension + (rationalCyclotomicPrincipalPrimeModulus p n) + (RayClass.rationalPrime p)) + (finitePlaceLocalArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel + (rationalCyclotomicPrincipalPrimeModulus p n)) + (RayClass.rationalPrime p) + (rationalCyclotomicChosenFinitePlaceExtension + (rationalCyclotomicPrincipalPrimeModulus p n) + (RayClass.rationalPrime p)) + (IdeleGroup.finiteComponent + (RayClass.rationalPrime p) + (IdeleGroup.principalIdele ℚ x))) + +open scoped Classical in +/-- At the ramified prime, the cyclotomic character of the chosen finite-place +Artin symbol is the direct reduction of the rational `p`-adic unit. -/ +theorem galEquivZMod_chosenFinitePlaceArtinMonoidHom_principal_at_prime + (p : Nat.Primes) (n : ℕ) (x : ℚˣ) : + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ (n + 1)) + (KummerTheory.rationalCyclotomicLevel + (rationalCyclotomicPrincipalPrimeModulus p n)) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + (rationalCyclotomicPrincipalPrimeModulus p n)) + (rationalCyclotomicPrincipalPrimeChosenArtin p n x) = + Units.map + (PadicInt.toZModPow (p := p.1) (n + 1)).toMonoidHom + (padicIntUnitOfRat p + (rationalPrimeUnit x p : ℚ) + (rationalPrimeUnit x p).ne_zero + (padicValRat_rationalPrimeUnit x p)) := by + change _ = rationalCyclotomicPrincipalPrimeResidueUnit p n x + apply rationalCyclotomicPrincipalPrime_galEquivZMod_eq_of_action p n + simp only [rationalCyclotomicPrincipalPrimeChosenArtin] + apply finitePlaceLocalToGlobalMonoidHom_apply_pow_of_localized_action + (zLocal := rationalCyclotomicPrincipalPrimeLocalizedRoot p n) + · rfl + · exact rationalCyclotomicPrincipalPrime_localArtin_action p n x + +end RationalCyclotomicPrincipalPrime + +open scoped Classical in +private theorem rationalCyclotomicArtinUnramified + (m : ℕ+) (q : Nat.Primes) + (hq : ¬ q.1 ∣ (m : ℕ)) : + IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinLocalizedField m q) := by + simpa [ChosenFinitePlaceIsUnramified] using + (rationalCyclotomicLevel_chosenFinitePlaceIsUnramified + m q hq) + +open scoped Classical in +private noncomputable def rationalCyclotomicArtinLocalFrobeniusOf + (m : ℕ+) (q : Nat.Primes) + (hUnramified : + IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinLocalizedField m q)) : + rationalCyclotomicArtinLocalizedField m q ≃ₐ[(rationalCyclotomicArtinBaseAbv q).Completion] + rationalCyclotomicArtinLocalizedField m q := by + letI := hUnramified + exact arithmeticFrobeniusOfUnramifiedValuation + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinLocalizedField m q) + +open scoped Classical in +private noncomputable def rationalCyclotomicArtinLocalFrobenius + (m : ℕ+) (q : Nat.Primes) + (hq : ¬ q.1 ∣ (m : ℕ)) : + rationalCyclotomicArtinLocalizedField m q ≃ₐ[(rationalCyclotomicArtinBaseAbv q).Completion] + rationalCyclotomicArtinLocalizedField m q := + rationalCyclotomicArtinLocalFrobeniusOf m q + (rationalCyclotomicArtinUnramified m q hq) + +open scoped Classical in +private noncomputable def rationalCyclotomicArtinDecompositionEquiv + (m : ℕ+) (q : Nat.Primes) : + absoluteValueDecompositionGroup ℚ + (rationalCyclotomicArtinExtension m q).1 ≃* + (rationalCyclotomicArtinLocalizedField m q ≃ₐ[(rationalCyclotomicArtinBaseAbv q).Completion] + rationalCyclotomicArtinLocalizedField m q) := + decompositionGroupEquivAlgebraicLocalizationAut + (rationalCyclotomicArtinBaseAbv q) + (RayClass.adicAbv_isNontrivial + (rationalCyclotomicArtinPlace q)) + (rationalCyclotomicArtinExtension m q) + +open scoped Classical in +private noncomputable def rationalCyclotomicArtinLocalToGlobalMonoidHom + (m : ℕ+) (q : Nat.Primes) : + (rationalCyclotomicArtinLocalizedField m q ≃ₐ[(rationalCyclotomicArtinBaseAbv q).Completion] + rationalCyclotomicArtinLocalizedField m q) →* + (rationalCyclotomicArtinLevel m ≃ₐ[ℚ] + rationalCyclotomicArtinLevel m) := + finitePlaceLocalToGlobalMonoidHom + (K := ℚ) (L := rationalCyclotomicArtinLevel m) + (rationalCyclotomicArtinPlace q) + (rationalCyclotomicArtinExtension m q) + +open scoped Classical in +private noncomputable abbrev rationalCyclotomicArtinLocalArtin + (m : ℕ+) (q : Nat.Primes) + (x : ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) : + rationalCyclotomicArtinLocalizedField m q ≃ₐ[(rationalCyclotomicArtinBaseAbv q).Completion] + rationalCyclotomicArtinLocalizedField m q := + finitePlaceLocalArtinMonoidHom + (K := ℚ) (L := rationalCyclotomicArtinLevel m) + (rationalCyclotomicArtinPlace q) + (rationalCyclotomicArtinExtension m q) x + +open scoped Classical in +private noncomputable def rationalCyclotomicArtinGlobalFrobeniusOf + (m : ℕ+) (q : Nat.Primes) + (hUnramified : + IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinLocalizedField m q)) : + rationalCyclotomicArtinLevel m ≃ₐ[ℚ] + rationalCyclotomicArtinLevel m := + rationalCyclotomicArtinLocalToGlobalMonoidHom m q + (rationalCyclotomicArtinLocalFrobeniusOf + m q hUnramified) + +open scoped Classical in +/-- The global decomposition-group lift of arithmetic Frobenius at the +chosen place above `q`. Keeping the local construction opaque prevents its +many completion instances from leaking into later theorem statements. -/ +private noncomputable def rationalCyclotomicChosenArithmeticFrobenius + (m : ℕ+) (q : Nat.Primes) + (hq : ¬ q.1 ∣ (m : ℕ)) : + KummerTheory.rationalCyclotomicLevel m ≃ₐ[ℚ] + KummerTheory.rationalCyclotomicLevel m := by + exact + rationalCyclotomicArtinGlobalFrobeniusOf m q + (rationalCyclotomicArtinUnramified m q hq) + +open scoped Classical in +/-- Transport a unit of the rational adic completion to the absolute-value completion. -/ +noncomputable abbrev rationalCyclotomicArtinLocalInput + (q : Nat.Primes) + (x : ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) : + (rationalCyclotomicArtinBaseAbv q).Completionˣ := + finitePlaceLocalArtinInput + (K := ℚ) (rationalCyclotomicArtinPlace q) x + +open scoped Classical in +/-- The normalized valuation of the canonical completion input used by the +rational finite-place Artin map. This named endpoint keeps the completion +instances out of downstream theorem statements. -/ +noncomputable def rationalCyclotomicArtinLocalExponent + (q : Nat.Primes) + (x : ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) : ℤ := + IsNonarchimedeanLocalField.valuationMap + (rationalCyclotomicArtinBaseAbv q).Completion + (Additive.ofMul (rationalCyclotomicArtinLocalInput q x)) + +open scoped Classical in +/-- The chosen finite-place Artin value in a rational cyclotomic level, with +the completion and Galois instance arguments frozen at the provider boundary. -/ +noncomputable def rationalCyclotomicChosenFinitePlaceArtinValue + (m : ℕ+) (q : Nat.Primes) + (x : ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) : + Gal(KummerTheory.rationalCyclotomicLevel m/ℚ) := + chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel m) + (RayClass.rationalPrime q) x + +open scoped Classical in +private theorem rationalCyclotomicArtinLocalArtin_eq + (m : ℕ+) (q : Nat.Primes) + (x : ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) : + rationalCyclotomicArtinLocalArtin m q x = + @LocalClassFieldTheory.abelianLocalArtinMonoidHom + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinLocalizedField m q) + (inferInstance : Field + (rationalCyclotomicArtinBaseAbv q).Completion) + (inferInstance : Field + (rationalCyclotomicArtinLocalizedField m q)) + (finitePlaceLocalArtinLocalizedAlgebra + (K := ℚ) (L := rationalCyclotomicArtinLevel m) + (rationalCyclotomicArtinPlace q) + (rationalCyclotomicArtinExtension m q)) + (finitePlaceLocalArtinCompletionValuativeRel + (K := ℚ) (rationalCyclotomicArtinPlace q)) + (inferInstance : TopologicalSpace + (rationalCyclotomicArtinBaseAbv q).Completion) + (finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField + (K := ℚ) (rationalCyclotomicArtinPlace q)) + (finitePlaceLocalArtinFiniteDimensional + (K := ℚ) (L := rationalCyclotomicArtinLevel m) + (rationalCyclotomicArtinPlace q) + (rationalCyclotomicArtinExtension m q)) + (finitePlaceLocalArtinIsAbelianGalois + (K := ℚ) (L := rationalCyclotomicArtinLevel m) + (rationalCyclotomicArtinPlace q) + (rationalCyclotomicArtinExtension m q) + (inferInstance : FiniteDimensional ℚ + (rationalCyclotomicArtinLevel m))) + (finitePlaceLocalArtinInput + (K := ℚ) (rationalCyclotomicArtinPlace q) x) := by + rfl + +open scoped Classical in +private theorem rationalCyclotomicChosenArithmeticFrobenius_eq_lift + (m : ℕ+) (q : Nat.Primes) + (hq : ¬ q.1 ∣ (m : ℕ)) : + rationalCyclotomicChosenArithmeticFrobenius m q hq = + (absoluteValueDecompositionGroup ℚ + (rationalCyclotomicArtinExtension m q).1).subtype + ((rationalCyclotomicArtinDecompositionEquiv m q).symm + (rationalCyclotomicArtinLocalFrobenius m q hq)) := by + rfl + +open scoped Classical in +private theorem + rationalCyclotomicFinitePlaceMappedLocalArtin_eq_frobenius_zpow_of + (m : ℕ+) (q : Nat.Primes) + (hAbelian : + IsAbelianGalois + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinLocalizedField m q)) + (hUnramified : + IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinLocalizedField m q)) + (x : ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) : + rationalCyclotomicArtinLocalToGlobalMonoidHom m q + (LocalClassFieldTheory.abelianLocalArtinMonoidHom + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinLocalizedField m q) + (rationalCyclotomicArtinLocalInput q x)) = + (rationalCyclotomicArtinGlobalFrobeniusOf + m q hUnramified) ^ + rationalCyclotomicArtinLocalExponent q x := by + let := hAbelian + let := hUnramified + change + rationalCyclotomicArtinLocalToGlobalMonoidHom m q + (LocalClassFieldTheory.abelianLocalArtinMonoidHom + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinLocalizedField m q) + (rationalCyclotomicArtinLocalInput q x)) = + (rationalCyclotomicArtinLocalToGlobalMonoidHom m q + (arithmeticFrobeniusOfUnramifiedValuation + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinLocalizedField m q))) ^ + rationalCyclotomicArtinLocalExponent q x + exact + mappedAbelianLocalArtin_eq_frobenius_zpow + (F := (rationalCyclotomicArtinBaseAbv q).Completion) + (E := rationalCyclotomicArtinLocalizedField m q) + (rationalCyclotomicArtinLocalToGlobalMonoidHom m q) + (rationalCyclotomicArtinLocalInput q x) + +open scoped Classical in +private theorem + rationalCyclotomicFinitePlaceMappedLocalArtin_eq_frobenius_zpow + (m : ℕ+) (q : Nat.Primes) + (hq : ¬ q.1 ∣ (m : ℕ)) + (x : ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) : + rationalCyclotomicArtinLocalToGlobalMonoidHom m q + (rationalCyclotomicArtinLocalArtin m q x) = + (rationalCyclotomicChosenArithmeticFrobenius m q hq) ^ + rationalCyclotomicArtinLocalExponent q x := by + change + rationalCyclotomicArtinLocalToGlobalMonoidHom m q + (rationalCyclotomicArtinLocalArtin m q x) = + (rationalCyclotomicArtinGlobalFrobeniusOf m q + (rationalCyclotomicArtinUnramified m q hq)) ^ + rationalCyclotomicArtinLocalExponent q x + calc + rationalCyclotomicArtinLocalToGlobalMonoidHom m q + (rationalCyclotomicArtinLocalArtin m q x) = + rationalCyclotomicArtinLocalToGlobalMonoidHom m q + (LocalClassFieldTheory.abelianLocalArtinMonoidHom + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinLocalizedField m q) + (rationalCyclotomicArtinLocalInput q x)) := + congrArg + (fun σ => + rationalCyclotomicArtinLocalToGlobalMonoidHom m q σ) + (rationalCyclotomicArtinLocalArtin_eq m q x) + _ = + (rationalCyclotomicArtinGlobalFrobeniusOf m q + (rationalCyclotomicArtinUnramified m q hq)) ^ + rationalCyclotomicArtinLocalExponent q x := + rationalCyclotomicFinitePlaceMappedLocalArtin_eq_frobenius_zpow_of + m q (rationalCyclotomicArtinLocalizedIsAbelianGalois m q) + (rationalCyclotomicArtinUnramified m q hq) x + +open scoped Classical in +/-- The chosen local Artin symbol is the chosen global Frobenius lift raised +to the normalized local valuation. -/ +private theorem + chosenFinitePlaceArtin_eq_chosenArithmeticFrobenius_zpow + (m : ℕ+) (q : Nat.Primes) + (hq : ¬ q.1 ∣ (m : ℕ)) + (x : ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) : + chosenFinitePlaceArtinMonoidHom + (K := ℚ) (L := rationalCyclotomicArtinLevel m) + (rationalCyclotomicArtinPlace q) x = + (rationalCyclotomicChosenArithmeticFrobenius m q hq) ^ + rationalCyclotomicArtinLocalExponent q x := by + change + finitePlaceArtinMonoidHomOfExtension + (K := ℚ) (L := rationalCyclotomicArtinLevel m) + (rationalCyclotomicArtinPlace q) + (rationalCyclotomicArtinExtension m q) x = + (rationalCyclotomicChosenArithmeticFrobenius m q hq) ^ + rationalCyclotomicArtinLocalExponent q x + have hFactor : + finitePlaceArtinMonoidHomOfExtension + (K := ℚ) (L := rationalCyclotomicArtinLevel m) + (rationalCyclotomicArtinPlace q) + (rationalCyclotomicArtinExtension m q) x = + rationalCyclotomicArtinLocalToGlobalMonoidHom m q + (rationalCyclotomicArtinLocalArtin m q x) := by + change + finitePlaceArtinMonoidHomOfExtension + (K := ℚ) (L := rationalCyclotomicArtinLevel m) + (rationalCyclotomicArtinPlace q) + (rationalCyclotomicArtinExtension m q) x = + finitePlaceLocalToGlobalMonoidHom + (K := ℚ) (L := rationalCyclotomicArtinLevel m) + (rationalCyclotomicArtinPlace q) + (rationalCyclotomicArtinExtension m q) + (finitePlaceLocalArtinMonoidHom + (K := ℚ) (L := rationalCyclotomicArtinLevel m) + (rationalCyclotomicArtinPlace q) + (rationalCyclotomicArtinExtension m q) x) + exact + congrArg + (fun φ : + ((rationalCyclotomicArtinPlace q).adicCompletion ℚ)ˣ →* + (rationalCyclotomicArtinLevel m ≃ₐ[ℚ] + rationalCyclotomicArtinLevel m) => φ x) + (finitePlaceArtinMonoidHomOfExtension_factor + (K := ℚ) (L := rationalCyclotomicArtinLevel m) + (rationalCyclotomicArtinPlace q) + (rationalCyclotomicArtinExtension m q)) + exact + hFactor.trans + (rationalCyclotomicFinitePlaceMappedLocalArtin_eq_frobenius_zpow + m q hq x) + +open scoped Classical in +private theorem rationalCyclotomicArtinResidueFieldCard + (q : Nat.Primes) : + Nat.card 𝓀[(rationalCyclotomicArtinBaseAbv q).Completion] = q.1 := by + simpa [rationalCyclotomicArtinPlace, + rationalCyclotomicArtinBaseAbv] using + rationalFinitePlaceCompletion_residueField_card + (rationalCyclotomicArtinPlace q) + +open scoped Classical in +private theorem rationalCyclotomicArtinLocalFrobenius_apply_root + (m : ℕ+) (q : Nat.Primes) + (hq : ¬ q.1 ∣ (m : ℕ)) : + rationalCyclotomicArtinLocalFrobenius m q hq + (rationalCyclotomicLocalizedPrimitiveRoot + m (rationalCyclotomicArtinPlace q)) = + (rationalCyclotomicLocalizedPrimitiveRoot + m (rationalCyclotomicArtinPlace q)) ^ q.1 := by + let := rationalCyclotomicArtinUnramified m q hq + have hRoot : + IsPrimitiveRoot + (rationalCyclotomicLocalizedPrimitiveRoot + m (rationalCyclotomicArtinPlace q)) (m : ℕ) := + rationalCyclotomicLocalizedPrimitiveRoot_isPrimitiveRoot + m (rationalCyclotomicArtinPlace q) + have hCoprime : + (Nat.card + 𝓀[(rationalCyclotomicArtinBaseAbv q).Completion]).Coprime + (m : ℕ) := by + rw [rationalCyclotomicArtinResidueFieldCard q] + exact q.2.coprime_iff_not_dvd.mpr hq + exact + (arithmeticFrobeniusOfUnramifiedValuation_apply_primitiveRoot + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinLocalizedField m q) + hRoot hCoprime).trans + (congrArg + (fun n : ℕ => (rationalCyclotomicLocalizedPrimitiveRoot + m (rationalCyclotomicArtinPlace q)) ^ n) + (rationalCyclotomicArtinResidueFieldCard q)) + +open scoped Classical in +private theorem rationalCyclotomicArtinFrobeniusLift_localization + (m : ℕ+) (q : Nat.Primes) + (hq : ¬ q.1 ∣ (m : ℕ)) : + AbsoluteValue.toAlgebraicLocalization + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q).1 + (rationalCyclotomicArtinExtension m q).2 + (((absoluteValueDecompositionGroup ℚ + (rationalCyclotomicArtinExtension m q).1).subtype + ((rationalCyclotomicArtinDecompositionEquiv m q).symm + (rationalCyclotomicArtinLocalFrobenius m q hq))) + (rationalCyclotomicLevelPrimitiveRoot m)) = + rationalCyclotomicArtinLocalFrobenius m q hq + (AbsoluteValue.toAlgebraicLocalization + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q).1 + (rationalCyclotomicArtinExtension m q).2 + (rationalCyclotomicLevelPrimitiveRoot m)) := by + calc + AbsoluteValue.toAlgebraicLocalization + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q).1 + (rationalCyclotomicArtinExtension m q).2 + (((absoluteValueDecompositionGroup ℚ + (rationalCyclotomicArtinExtension m q).1).subtype + ((rationalCyclotomicArtinDecompositionEquiv m q).symm + (rationalCyclotomicArtinLocalFrobenius m q hq))) + (rationalCyclotomicLevelPrimitiveRoot m)) = + rationalCyclotomicArtinDecompositionEquiv m q + ((rationalCyclotomicArtinDecompositionEquiv m q).symm + (rationalCyclotomicArtinLocalFrobenius m q hq)) + (AbsoluteValue.toAlgebraicLocalization + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q).1 + (rationalCyclotomicArtinExtension m q).2 + (rationalCyclotomicLevelPrimitiveRoot m)) := + (localizationRamificationGroups_decompositionGroupEquiv_toLocalization + (rationalCyclotomicArtinBaseAbv q) + (RayClass.adicAbv_isNontrivial + (rationalCyclotomicArtinPlace q)) + (rationalCyclotomicArtinExtension m q) + ((rationalCyclotomicArtinDecompositionEquiv m q).symm + (rationalCyclotomicArtinLocalFrobenius m q hq)) + (rationalCyclotomicLevelPrimitiveRoot m)).symm + _ = rationalCyclotomicArtinLocalFrobenius m q hq + (AbsoluteValue.toAlgebraicLocalization + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q).1 + (rationalCyclotomicArtinExtension m q).2 + (rationalCyclotomicLevelPrimitiveRoot m)) := + congrArg + (fun σ : rationalCyclotomicArtinLocalizedField m q ≃ₐ[(rationalCyclotomicArtinBaseAbv + q).Completion] + rationalCyclotomicArtinLocalizedField m q => + σ (AbsoluteValue.toAlgebraicLocalization + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q).1 + (rationalCyclotomicArtinExtension m q).2 + (rationalCyclotomicLevelPrimitiveRoot m))) + ((rationalCyclotomicArtinDecompositionEquiv m q).apply_symm_apply + (rationalCyclotomicArtinLocalFrobenius m q hq)) + +open scoped Classical in +private theorem rationalCyclotomicChosenArithmeticFrobenius_localization + (m : ℕ+) (q : Nat.Primes) + (hq : ¬ q.1 ∣ (m : ℕ)) : + AbsoluteValue.toAlgebraicLocalization + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q).1 + (rationalCyclotomicArtinExtension m q).2 + (rationalCyclotomicChosenArithmeticFrobenius m q hq + (rationalCyclotomicLevelPrimitiveRoot m)) = + rationalCyclotomicArtinLocalFrobenius m q hq + (AbsoluteValue.toAlgebraicLocalization + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q).1 + (rationalCyclotomicArtinExtension m q).2 + (rationalCyclotomicLevelPrimitiveRoot m)) := by + calc + AbsoluteValue.toAlgebraicLocalization + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q).1 + (rationalCyclotomicArtinExtension m q).2 + (rationalCyclotomicChosenArithmeticFrobenius m q hq + (rationalCyclotomicLevelPrimitiveRoot m)) = + AbsoluteValue.toAlgebraicLocalization + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q).1 + (rationalCyclotomicArtinExtension m q).2 + (((absoluteValueDecompositionGroup ℚ + (rationalCyclotomicArtinExtension m q).1).subtype + ((rationalCyclotomicArtinDecompositionEquiv m q).symm + (rationalCyclotomicArtinLocalFrobenius m q hq))) + (rationalCyclotomicLevelPrimitiveRoot m)) := + congrArg + (fun σ : rationalCyclotomicArtinLevel m ≃ₐ[ℚ] + rationalCyclotomicArtinLevel m => + AbsoluteValue.toAlgebraicLocalization + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q).1 + (rationalCyclotomicArtinExtension m q).2 + (σ (rationalCyclotomicLevelPrimitiveRoot m))) + (rationalCyclotomicChosenArithmeticFrobenius_eq_lift m q hq) + _ = rationalCyclotomicArtinLocalFrobenius m q hq + (AbsoluteValue.toAlgebraicLocalization + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q).1 + (rationalCyclotomicArtinExtension m q).2 + (rationalCyclotomicLevelPrimitiveRoot m)) := + rationalCyclotomicArtinFrobeniusLift_localization m q hq + +open scoped Classical in +private theorem rationalCyclotomicArtinPrimitiveRoot_localization + (m : ℕ+) (q : Nat.Primes) : + AbsoluteValue.toAlgebraicLocalization + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q).1 + (rationalCyclotomicArtinExtension m q).2 + (rationalCyclotomicLevelPrimitiveRoot m) = + rationalCyclotomicLocalizedPrimitiveRoot + m (rationalCyclotomicArtinPlace q) := by + rfl + +open scoped Classical in +private theorem rationalCyclotomicArtinLocalizedRoot_pow + (m : ℕ+) (q : Nat.Primes) : + (rationalCyclotomicLocalizedPrimitiveRoot + m (rationalCyclotomicArtinPlace q)) ^ q.1 = + rationalCyclotomicGlobalToLocalizedAlgHom + m (rationalCyclotomicArtinPlace q) + (rationalCyclotomicLevelPrimitiveRoot m ^ q.1) := by + calc + (rationalCyclotomicLocalizedPrimitiveRoot + m (rationalCyclotomicArtinPlace q)) ^ q.1 = + (rationalCyclotomicGlobalToLocalizedAlgHom + m (rationalCyclotomicArtinPlace q) + (rationalCyclotomicLevelPrimitiveRoot m)) ^ q.1 := + congrArg (fun z => z ^ q.1) + (rationalCyclotomicGlobalToLocalizedAlgHom_primitiveRoot m + (rationalCyclotomicArtinPlace q)).symm + _ = rationalCyclotomicGlobalToLocalizedAlgHom + m (rationalCyclotomicArtinPlace q) + (rationalCyclotomicLevelPrimitiveRoot m ^ q.1) := + (map_pow + (rationalCyclotomicGlobalToLocalizedAlgHom + m (rationalCyclotomicArtinPlace q)) + (rationalCyclotomicLevelPrimitiveRoot m) q.1).symm + +open scoped Classical in +private theorem rationalCyclotomicChosenArithmeticFrobenius_apply_root + (m : ℕ+) (q : Nat.Primes) + (hq : ¬ q.1 ∣ (m : ℕ)) : + rationalCyclotomicChosenArithmeticFrobenius m q hq + (rationalCyclotomicLevelPrimitiveRoot m) = + rationalCyclotomicLevelPrimitiveRoot m ^ q.1 := by + apply + (AbsoluteValue.toAlgebraicLocalization + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q).1 + (rationalCyclotomicArtinExtension m q).2).injective + have hLocalization : + AbsoluteValue.toAlgebraicLocalization + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q).1 + (rationalCyclotomicArtinExtension m q).2 + (rationalCyclotomicChosenArithmeticFrobenius m q hq + (rationalCyclotomicLevelPrimitiveRoot m)) = + rationalCyclotomicArtinLocalFrobenius m q hq + (AbsoluteValue.toAlgebraicLocalization + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q).1 + (rationalCyclotomicArtinExtension m q).2 + (rationalCyclotomicLevelPrimitiveRoot m)) := + rationalCyclotomicChosenArithmeticFrobenius_localization m q hq + have hPrimitiveRoot : + rationalCyclotomicArtinLocalFrobenius m q hq + (AbsoluteValue.toAlgebraicLocalization + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q).1 + (rationalCyclotomicArtinExtension m q).2 + (rationalCyclotomicLevelPrimitiveRoot m)) = + rationalCyclotomicArtinLocalFrobenius m q hq + (rationalCyclotomicLocalizedPrimitiveRoot + m (rationalCyclotomicArtinPlace q)) := + congrArg + (rationalCyclotomicArtinLocalFrobenius m q hq) + (rationalCyclotomicArtinPrimitiveRoot_localization m q) + have hLocalFrobenius : + rationalCyclotomicArtinLocalFrobenius m q hq + (rationalCyclotomicLocalizedPrimitiveRoot + m (rationalCyclotomicArtinPlace q)) = + (rationalCyclotomicLocalizedPrimitiveRoot + m (rationalCyclotomicArtinPlace q)) ^ q.1 := + rationalCyclotomicArtinLocalFrobenius_apply_root m q hq + have hPower : + (rationalCyclotomicLocalizedPrimitiveRoot + m (rationalCyclotomicArtinPlace q)) ^ q.1 = + rationalCyclotomicGlobalToLocalizedAlgHom + m (rationalCyclotomicArtinPlace q) + (rationalCyclotomicLevelPrimitiveRoot m ^ q.1) := + rationalCyclotomicArtinLocalizedRoot_pow m q + have hAlgebraicLocalization : + rationalCyclotomicGlobalToLocalizedAlgHom + m (rationalCyclotomicArtinPlace q) + (rationalCyclotomicLevelPrimitiveRoot m ^ q.1) = + AbsoluteValue.toAlgebraicLocalization + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q).1 + (rationalCyclotomicArtinExtension m q).2 + (rationalCyclotomicLevelPrimitiveRoot m ^ q.1) := + rationalCyclotomicGlobalToLocalizedAlgHom_apply + m (rationalCyclotomicArtinPlace q) + (rationalCyclotomicLevelPrimitiveRoot m ^ q.1) + exact + Eq.trans hLocalization + (Eq.trans hPrimitiveRoot + (Eq.trans hLocalFrobenius + (Eq.trans hPower hAlgebraicLocalization))) + +open scoped Classical in +/-- The cyclotomic character sends the chosen arithmetic Frobenius lift to +the residue prime. -/ +private theorem galEquivZMod_chosenArithmeticFrobenius + (m : ℕ+) (q : Nat.Primes) + (hq : ¬ q.1 ∣ (m : ℕ)) : + IsCyclotomicExtension.Rat.galEquivZMod + (m : ℕ) (KummerTheory.rationalCyclotomicLevel m) + (rationalCyclotomicChosenArithmeticFrobenius m q hq) = + ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr hq) := by + exact + rationalCyclotomicLevel_galEquivZMod_eq_unitOfCoprime + m q hq (rationalCyclotomicChosenArithmeticFrobenius m q hq) + (rationalCyclotomicChosenArithmeticFrobenius_apply_root m q hq) + +open scoped Classical in +/-- At a rational prime not dividing the level, the cyclotomic character +of the chosen finite-place Artin symbol is the residue prime raised to the +normalized local valuation. -/ +theorem galEquivZMod_chosenFinitePlaceArtinMonoidHom_of_not_dvd + (m : ℕ+) (q : Nat.Primes) + (hq : ¬ q.1 ∣ (m : ℕ)) + (x : ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) : + let v : HeightOneSpectrum (𝓞 ℚ) := + RayClass.rationalPrime q + let L := KummerTheory.rationalCyclotomicLevel m + let vQ := HeightOneSpectrum.adicAbv ℚ v + let localInput := + (finitePlaceCompletionUnitsContinuousMulEquiv v).symm x + let localExponent := + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap + vQ.Completion (Additive.ofMul localInput) + IsCyclotomicExtension.Rat.galEquivZMod + (m : ℕ) L + (chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := L) v x) = + (ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr hq)) ^ localExponent := by + dsimp only + rw [chosenFinitePlaceArtin_eq_chosenArithmeticFrobenius_zpow + m q hq x, map_zpow, + galEquivZMod_chosenArithmeticFrobenius m q hq] + rfl + +open scoped Classical in +/-- Away from the cyclotomic level, a finite-place input of normalized +valuation zero has trivial cyclotomic character. -/ +theorem + galEquivZMod_chosenFinitePlaceArtinMonoidHom_eq_one_of_not_dvd_of_localExponent_eq_zero + (m : ℕ+) (q : Nat.Primes) + (hq : ¬ q.1 ∣ (m : ℕ)) + (x : ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) + (hzero : rationalCyclotomicArtinLocalExponent q x = 0) : + IsCyclotomicExtension.Rat.galEquivZMod + (m : ℕ) (KummerTheory.rationalCyclotomicLevel m) + (chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel m) + (RayClass.rationalPrime q) x) = + 1 := by + rw [chosenFinitePlaceArtin_eq_chosenArithmeticFrobenius_zpow + m q hq x, + map_zpow, galEquivZMod_chosenArithmeticFrobenius m q hq, + hzero, zpow_zero] + +open scoped Classical in +/-- Away from the cyclotomic level, valuation zero makes the chosen +finite-place Artin symbol itself trivial. Returning the Galois element, +rather than an equality between cyclotomic characters with frozen instance +arguments, lets downstream restriction arguments apply their own canonical +character without a dependent instance transport. -/ +theorem + chosenFinitePlaceArtinMonoidHom_eq_one_of_not_dvd_of_localExponent_eq_zero + (m : ℕ+) (q : Nat.Primes) + (hq : ¬ q.1 ∣ (m : ℕ)) + (x : ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) + (hzero : rationalCyclotomicArtinLocalExponent q x = 0) : + chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel m) + (RayClass.rationalPrime q) x = + 1 := by + apply + (IsCyclotomicExtension.Rat.galEquivZMod + (m : ℕ) (KummerTheory.rationalCyclotomicLevel m)).injective + simpa only [map_one] using + galEquivZMod_chosenFinitePlaceArtinMonoidHom_eq_one_of_not_dvd_of_localExponent_eq_zero + m q hq x hzero + +open scoped Classical in +/-- For a rational principal idele, the unramified finite-place +cyclotomic Artin symbol at `q` is `q` raised to the negative usual +`q`-adic exponent. -/ +theorem + galEquivZMod_chosenFinitePlaceArtinMonoidHom_principal_of_not_dvd + (m : ℕ+) (q : Nat.Primes) + (hq : ¬ q.1 ∣ (m : ℕ)) (x : ℚˣ) : + IsCyclotomicExtension.Rat.galEquivZMod + (m : ℕ) + (KummerTheory.rationalCyclotomicLevel m) + (chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel m) + (RayClass.rationalPrime q) + (IdeleGroup.finiteComponent + (RayClass.rationalPrime q) + (IdeleGroup.principalIdele ℚ x))) = + (ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr hq)) ^ + (-padicValRat q.1 (x : ℚ)) := by + rw [ + galEquivZMod_chosenFinitePlaceArtinMonoidHom_of_not_dvd + m q hq, + rationalPrincipalFiniteComponent_valuationMap] + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicLocalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicLocalization.lean new file mode 100644 index 0000000000..1b78eebd4d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicLocalization.lean @@ -0,0 +1,272 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicField +public import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +/-! +# Localized rational cyclotomic levels + +This file identifies the algebraic localization of an actual finite +rational cyclotomic level with a cyclotomic extension of the completed +base. The primitive root is the image of a genuine primitive root in +the global level under the canonical global-to-local map. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain +open AlgebraicNumberTheory.Valuations +open LocalClassFieldTheory + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +/-- A genuine primitive root in the actual `m`-th rational cyclotomic +level. -/ +noncomputable def rationalCyclotomicLevelPrimitiveRoot + (m : ℕ+) : KummerTheory.rationalCyclotomicLevel m := + Classical.choose + (IsCyclotomicExtension.exists_isPrimitiveRoot + (S := {(m : ℕ)}) + (n := (m : ℕ)) + ℚ (KummerTheory.rationalCyclotomicLevel m) + (by simp) m.ne_zero) + +/-- The finite adic absolute value of the rational base at `v`. -/ +abbrev rationalCyclotomicAdicAbsoluteValue + (v : HeightOneSpectrum (𝓞 ℚ)) := + HeightOneSpectrum.adicAbv ℚ v + +/-- The chosen extension of the rational finite-place absolute value to +the actual `m`-th cyclotomic level. -/ +noncomputable def rationalCyclotomicChosenFinitePlaceExtension + (m : ℕ+) (v : HeightOneSpectrum (𝓞 ℚ)) : + AbsoluteValueExtension + (rationalCyclotomicAdicAbsoluteValue v) + (KummerTheory.rationalCyclotomicLevel m) := + chosenFinitePlaceExtension + (L := KummerTheory.rationalCyclotomicLevel m) v + +/-- The canonical algebra structure on the selected extension completion +over the rational finite completion. -/ +noncomputable instance rationalCyclotomicCompletionAlgebra + (m : ℕ+) (v : HeightOneSpectrum (𝓞 ℚ)) : + Algebra (rationalCyclotomicAdicAbsoluteValue v).Completion + (rationalCyclotomicChosenFinitePlaceExtension m v).1.Completion := + AbsoluteValue.completionAlgebra + (rationalCyclotomicAdicAbsoluteValue v) + (rationalCyclotomicChosenFinitePlaceExtension m v).1 + (rationalCyclotomicChosenFinitePlaceExtension m v).2 + +/-- The actual algebraic localization of the rational cyclotomic level at `v`. -/ +abbrev rationalCyclotomicLocalizedCompletion + (m : ℕ+) (v : HeightOneSpectrum (𝓞 ℚ)) := + LocalizedCompletion + (rationalCyclotomicAdicAbsoluteValue v) + (rationalCyclotomicChosenFinitePlaceExtension m v) + +/-- The selected rational cyclotomic localization is finite over the finite completion. -/ +noncomputable instance rationalCyclotomicLocalizedCompletionFinite + (m : ℕ+) (v : HeightOneSpectrum (𝓞 ℚ)) : + FiniteDimensional (rationalCyclotomicAdicAbsoluteValue v).Completion + (rationalCyclotomicLocalizedCompletion m v) := + localizedCompletionModuleFinite + (rationalCyclotomicAdicAbsoluteValue v) + (RayClass.adicAbv_isNontrivial v) + (rationalCyclotomicChosenFinitePlaceExtension m v) + +/-- The selected rational cyclotomic localization is algebraic over the finite completion. -/ +noncomputable instance rationalCyclotomicLocalizedCompletionIsAlgebraic + (m : ℕ+) (v : HeightOneSpectrum (𝓞 ℚ)) : + Algebra.IsAlgebraic (rationalCyclotomicAdicAbsoluteValue v).Completion + (rationalCyclotomicLocalizedCompletion m v) := + AbsoluteValue.algebraicLocalization_isAlgebraic + (rationalCyclotomicAdicAbsoluteValue v) + (rationalCyclotomicChosenFinitePlaceExtension m v).1 + (rationalCyclotomicChosenFinitePlaceExtension m v).2 + +/-- The selected root in the actual rational cyclotomic level is +primitive of order `m`. -/ +theorem rationalCyclotomicLevelPrimitiveRoot_isPrimitiveRoot + (m : ℕ+) : + IsPrimitiveRoot (rationalCyclotomicLevelPrimitiveRoot m) + (m : ℕ) := + Classical.choose_spec + (IsCyclotomicExtension.exists_isPrimitiveRoot + (S := {(m : ℕ)}) + (n := (m : ℕ)) + ℚ (KummerTheory.rationalCyclotomicLevel m) + (by simp) m.ne_zero) + +section RationalGlobalToLocalized + +private theorem rationalCyclotomicLocalizedCompletion_charZero + (m : ℕ+) (v : HeightOneSpectrum (𝓞 ℚ)) : + CharZero (rationalCyclotomicLocalizedCompletion m v) := + charZero_of_injective_ringHom + ((AbsoluteValue.toAlgebraicLocalization + (rationalCyclotomicAdicAbsoluteValue v) + (rationalCyclotomicChosenFinitePlaceExtension m v).1 + (rationalCyclotomicChosenFinitePlaceExtension m v).2).comp + (algebraMap ℚ (KummerTheory.rationalCyclotomicLevel m))).injective + +attribute [local instance] rationalCyclotomicLocalizedCompletion_charZero + +/-- The actual global-to-local embedding of the selected rational +cyclotomic level, regarded as a rational algebra homomorphism. -/ +noncomputable def rationalCyclotomicGlobalToLocalizedAlgHom + (m : ℕ+) (v : HeightOneSpectrum (𝓞 ℚ)) : + KummerTheory.rationalCyclotomicLevel m →ₐ[ℚ] + rationalCyclotomicLocalizedCompletion m v := + (AbsoluteValue.toAlgebraicLocalization + (rationalCyclotomicAdicAbsoluteValue v) + (rationalCyclotomicChosenFinitePlaceExtension m v).1 + (rationalCyclotomicChosenFinitePlaceExtension m v).2).toRatAlgHom + +/-- The named rational algebra homomorphism has the canonical +global-to-local ring homomorphism as its underlying map. -/ +@[simp] +theorem rationalCyclotomicGlobalToLocalizedAlgHom_apply + (m : ℕ+) (v : HeightOneSpectrum (𝓞 ℚ)) + (x : KummerTheory.rationalCyclotomicLevel m) : + rationalCyclotomicGlobalToLocalizedAlgHom m v x = + AbsoluteValue.toAlgebraicLocalization + (rationalCyclotomicAdicAbsoluteValue v) + (rationalCyclotomicChosenFinitePlaceExtension m v).1 + (rationalCyclotomicChosenFinitePlaceExtension m v).2 x := + rfl + +/-- The image of the selected global primitive root in the algebraic +localization at `v`. -/ +noncomputable def rationalCyclotomicLocalizedPrimitiveRoot + (m : ℕ+) (v : HeightOneSpectrum (𝓞 ℚ)) : + rationalCyclotomicLocalizedCompletion m v := + AbsoluteValue.toAlgebraicLocalization + (rationalCyclotomicAdicAbsoluteValue v) + (rationalCyclotomicChosenFinitePlaceExtension m v).1 + (rationalCyclotomicChosenFinitePlaceExtension m v).2 + (rationalCyclotomicLevelPrimitiveRoot m) + +/-- The selected localized root is the actual global-to-local image of +the selected global primitive root. -/ +theorem rationalCyclotomicGlobalToLocalizedAlgHom_primitiveRoot + (m : ℕ+) (v : HeightOneSpectrum (𝓞 ℚ)) : + rationalCyclotomicGlobalToLocalizedAlgHom m v + (rationalCyclotomicLevelPrimitiveRoot m) = + rationalCyclotomicLocalizedPrimitiveRoot m v := + rfl + +/-- The localized global root remains primitive because the canonical +global-to-local homomorphism is injective. -/ +theorem rationalCyclotomicLocalizedPrimitiveRoot_isPrimitiveRoot + (m : ℕ+) (v : HeightOneSpectrum (𝓞 ℚ)) : + IsPrimitiveRoot + (rationalCyclotomicLocalizedPrimitiveRoot m v) (m : ℕ) := by + exact + (rationalCyclotomicLevelPrimitiveRoot_isPrimitiveRoot m).map_of_injective + (rationalCyclotomicGlobalToLocalizedAlgHom m v).injective + +end RationalGlobalToLocalized + +/-- The selected primitive root generates the actual rational cyclotomic +level over `ℚ`. -/ +theorem rationalCyclotomicLevelPrimitiveRoot_adjoin_eq_top + (m : ℕ+) : + IntermediateField.adjoin ℚ + ({rationalCyclotomicLevelPrimitiveRoot m} : + Set (KummerTheory.rationalCyclotomicLevel m)) = + ⊤ := by + let : NeZero (m : ℕ) := ⟨m.ne_zero⟩ + exact + IntermediateField.adjoin_eq_top_of_algebra + ℚ + ({rationalCyclotomicLevelPrimitiveRoot m} : + Set (KummerTheory.rationalCyclotomicLevel m)) + (IsCyclotomicExtension.adjoin_primitive_root_eq_top + (rationalCyclotomicLevelPrimitiveRoot_isPrimitiveRoot m)) + +/-- The localized primitive root generates the whole algebraic +localization over the completed rational field. -/ +theorem + rationalCyclotomicLocalizedPrimitiveRoot_adjoin_eq_top + (m : ℕ+) (v : HeightOneSpectrum (𝓞 ℚ)) : + IntermediateField.adjoin + (rationalCyclotomicAdicAbsoluteValue v).Completion + {rationalCyclotomicLocalizedPrimitiveRoot m v} = + ⊤ := by + let vQ := rationalCyclotomicAdicAbsoluteValue v + let w := rationalCyclotomicChosenFinitePlaceExtension m v + let hℚ := + AbsoluteValue.extensionCompletionAlgebra + (K := ℚ) w.1 + let : SMul ℚ w.1.Completion := hℚ.toSMul + let : Algebra vQ.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vQ w.1 w.2 + let : Algebra ℚ (LocalizedCompletion vQ w) := + localizedCompletionGlobalAlgebra vQ w + let : SMul ℚ (LocalizedCompletion vQ w) := + (localizedCompletionGlobalAlgebra vQ w).toSMul + let : IsScalarTower ℚ vQ.Completion + (LocalizedCompletion vQ w) := + localizedCompletionIsScalarTower vQ w + exact + localizedCompletion_adjoin_image_eq_top_of_adjoin_eq_top + vQ w (rationalCyclotomicLevelPrimitiveRoot m) + (rationalCyclotomicLevelPrimitiveRoot_adjoin_eq_top m) + +/-- The localized primitive root generates the same top subalgebra as its +intermediate-field closure. This avoids reducing the two adjoin constructions. -/ +theorem rationalCyclotomicLocalizedPrimitiveRoot_algebraAdjoin_eq_top + (m : ℕ+) (v : HeightOneSpectrum (𝓞 ℚ)) : + Algebra.adjoin (rationalCyclotomicAdicAbsoluteValue v).Completion + ({rationalCyclotomicLocalizedPrimitiveRoot m v} : + Set (rationalCyclotomicLocalizedCompletion m v)) = ⊤ := by + exact + IntermediateField.adjoin_eq_top_iff.mp + (show + IntermediateField.adjoin + (rationalCyclotomicAdicAbsoluteValue v).Completion + {rationalCyclotomicLocalizedPrimitiveRoot m v} = + ⊤ + from + rationalCyclotomicLocalizedPrimitiveRoot_adjoin_eq_top + m v) + +/-- The algebraic localization of the actual `m`-th rational cyclotomic +level is itself a cyclotomic extension of the completed rational field. -/ +theorem rationalCyclotomicLevel_localizedCompletion_isCyclotomicExtension + (m : ℕ+) (v : HeightOneSpectrum (𝓞 ℚ)) : + IsCyclotomicExtension {(m : ℕ)} + (rationalCyclotomicAdicAbsoluteValue v).Completion + (rationalCyclotomicLocalizedCompletion m v) := by + let : NeZero (m : ℕ) := ⟨m.ne_zero⟩ + let ζv : rationalCyclotomicLocalizedCompletion m v := + rationalCyclotomicLocalizedPrimitiveRoot m v + have hζv : IsPrimitiveRoot ζv (m : ℕ) := + rationalCyclotomicLocalizedPrimitiveRoot_isPrimitiveRoot m v + have hAdjoin : + Algebra.adjoin (rationalCyclotomicAdicAbsoluteValue v).Completion + ({ζv} : Set (rationalCyclotomicLocalizedCompletion m v)) = ⊤ := by + simpa [ζv] using + rationalCyclotomicLocalizedPrimitiveRoot_algebraAdjoin_eq_top m v + exact + IsCyclotomicExtension.equiv {(m : ℕ)} + (rationalCyclotomicAdicAbsoluteValue v).Completion + (Algebra.adjoin (rationalCyclotomicAdicAbsoluteValue v).Completion + ({ζv} : Set (rationalCyclotomicLocalizedCompletion m v))) + (h := hζv.adjoin_isCyclotomicExtension + (rationalCyclotomicAdicAbsoluteValue v).Completion) + ((Subalgebra.equivOfEq _ _ hAdjoin).trans Subalgebra.topEquiv) + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean new file mode 100644 index 0000000000..1c8a91bd31 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean @@ -0,0 +1,721 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlaceArtin +public import Mathlib.Algebra.BigOperators.Finprod +/-! +# Away-from-p factors of a rational cyclotomic principal idele + +For the cyclotomic level `p ^ k`, this file reindexes the actual chosen +finite-place Artin characters over rational primes. Away from `p`, the +unramified formula makes the multiplicative support lie in the ordinary +finite prime factorization support of the principal rational number. + +The final theorem separates the genuine `p`-factor from the explicit +away-from-`p` finite product. The construction also applies to `k = 0`. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open Function + +open scoped Classical in +/-- The prime subtype supplies the primality instance used at this local factor. -/ +local instance rationalCyclotomicPrincipalAwayProductPrimeFact (q : Nat.Primes) : Fact q.1.Prime := + ⟨q.2⟩ + +attribute [local instance] rationalCyclotomicPrincipalAwayProductPrimeFact + +open scoped Classical in +/-- The positive cyclotomic level has nonzero underlying natural number. -/ +local instance rationalCyclotomicPrincipalAwayProductPositiveLevelNeZero + (m : ℕ+) : NeZero (m : ℕ) := + ⟨m.ne_zero⟩ + +attribute [local instance] rationalCyclotomicPrincipalAwayProductPositiveLevelNeZero + +open scoped Classical in +local instance rationalCyclotomicPrincipalPrimePowerNumberField + (p : Nat.Primes) (k : ℕ) : + NumberField (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) := + KummerTheory.rationalCyclotomicLevel_numberField + ⟨p.1 ^ k, pow_pos p.2.pos k⟩ + +attribute [local instance] rationalCyclotomicPrincipalPrimePowerNumberField + +open scoped Classical in +local instance rationalCyclotomicPrincipalPrimePowerFiniteDimensional + (p : Nat.Primes) (k : ℕ) : + FiniteDimensional ℚ (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) := + rationalCyclotomicPrincipalPrimeLevelFiniteDimensional + ⟨p.1 ^ k, pow_pos p.2.pos k⟩ + +attribute [local instance] rationalCyclotomicPrincipalPrimePowerFiniteDimensional + +open scoped Classical in +local instance rationalCyclotomicPrincipalPrimePowerIsGalois + (p : Nat.Primes) (k : ℕ) : + IsGalois ℚ (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) := + KummerTheory.rationalCyclotomicLevel_isGalois + ⟨p.1 ^ k, pow_pos p.2.pos k⟩ + +attribute [local instance] rationalCyclotomicPrincipalPrimePowerIsGalois + +open scoped Classical in +local instance rationalCyclotomicPrincipalPrimePowerIsAbelianGalois + (p : Nat.Primes) (k : ℕ) : + IsAbelianGalois ℚ (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) := + IsAbelianGalois.of_algHom + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩).val + +attribute [local instance] rationalCyclotomicPrincipalPrimePowerIsAbelianGalois + +open scoped Classical in +noncomputable local instance + rationalCyclotomicPrincipalLevelFiniteDimensional + (m : ℕ+) : + FiniteDimensional ℚ + (KummerTheory.rationalCyclotomicLevel m) := + rationalCyclotomicPrincipalPrimeLevelFiniteDimensional m + +attribute [local instance] rationalCyclotomicPrincipalLevelFiniteDimensional + +open scoped Classical in +noncomputable local instance + rationalCyclotomicPrincipalLevelIsAbelianGalois + (m : ℕ+) : + IsAbelianGalois ℚ + (KummerTheory.rationalCyclotomicLevel m) := + rationalCyclotomicPrincipalPrimeLevelIsAbelianGalois m + +attribute [local instance] rationalCyclotomicPrincipalLevelIsAbelianGalois + +open scoped Classical in +/-- The local Artin automorphism of a prime-power cyclotomic level evaluated +on a principal idele. -/ +noncomputable def rationalCyclotomicPrincipalHeightOneArtinInput + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) + (v : HeightOneSpectrum (𝓞 ℚ)) : + KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩ ≃ₐ[ℚ] + KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩ := + chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := + KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele ℚ x)) + +open scoped Classical in +private theorem rationalCyclotomicPrincipalHeightOneArtinInput_spec + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) + (v : HeightOneSpectrum (𝓞 ℚ)) : + rationalCyclotomicPrincipalHeightOneArtinInput p k x v = + chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := + KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele ℚ x)) := by + rfl + +open scoped Classical in +/-- The cyclotomic coordinate of the local Artin value of a principal idele at a finite place. -/ +noncomputable def rationalCyclotomicPrincipalHeightOneCharacter + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) + (v : HeightOneSpectrum (𝓞 ℚ)) : + (ZMod (p.1 ^ k))ˣ := + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (rationalCyclotomicPrincipalHeightOneArtinInput p k x v) + +open scoped Classical in +/-- The named height-one character is the cyclotomic coordinate of the +chosen finite-place Artin symbol. -/ +theorem rationalCyclotomicPrincipalHeightOneCharacter_spec + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) + (v : HeightOneSpectrum (𝓞 ℚ)) : + rationalCyclotomicPrincipalHeightOneCharacter p k x v = + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := + KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele ℚ x))) := by + rw [rationalCyclotomicPrincipalHeightOneCharacter, + rationalCyclotomicPrincipalHeightOneArtinInput_spec] + +open scoped Classical in +/-- The genuine chosen finite-place Artin character of the rational +principal idele at the prime `q`, evaluated in the `p ^ k` cyclotomic +coordinate. -/ +noncomputable def rationalCyclotomicPrincipalFinitePlaceCharacter + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) (q : Nat.Primes) : + (ZMod (p.1 ^ k))ˣ := + rationalCyclotomicPrincipalHeightOneCharacter p k x + ((Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ)).symm q) + +open scoped Classical in +private theorem rationalCyclotomicPrincipalFinitePlaceCharacter_spec + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) (q : Nat.Primes) : + rationalCyclotomicPrincipalFinitePlaceCharacter p k x q = + rationalCyclotomicPrincipalHeightOneCharacter p k x + ((Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ)).symm q) := by + rfl + +open scoped Classical in +/-- The named rational-prime character is exactly the cyclotomic +coordinate of the chosen finite-place Artin symbol. -/ +theorem + rationalCyclotomicPrincipalFinitePlaceCharacter_chosenArtin_spec + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) (q : Nat.Primes) : + rationalCyclotomicPrincipalFinitePlaceCharacter p k x q = + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := + KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + ((Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ)).symm q) + (IdeleGroup.finiteComponent + ((Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ)).symm q) + (IdeleGroup.principalIdele ℚ x))) := by + rw [rationalCyclotomicPrincipalFinitePlaceCharacter_spec] + exact + rationalCyclotomicPrincipalHeightOneCharacter_spec p k x + ((Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ)).symm q) + +open scoped Classical in +/-- At every positive `p`-power level, the finite-place character at `p` +is the direct reduction of the rational `p`-adic unit. -/ +theorem rationalCyclotomicPrincipalFinitePlaceCharacter_at_prime_succ_formula + (p : Nat.Primes) (n : ℕ) (x : ℚˣ) : + rationalCyclotomicPrincipalFinitePlaceCharacter p (n + 1) x p = + Units.map + (PadicInt.toZModPow (p := p.1) (n + 1)).toMonoidHom + (padicIntUnitOfRat p + (rationalPrimeUnit x p : ℚ) + (rationalPrimeUnit x p).ne_zero + (padicValRat_rationalPrimeUnit x p)) := by + have hwChosen : + chosenFinitePlaceExtension + (L := KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ (n + 1), pow_pos p.2.pos (n + 1)⟩) + ((Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ)).symm p) = + rationalCyclotomicChosenFinitePlaceExtension + ⟨p.1 ^ (n + 1), pow_pos p.2.pos (n + 1)⟩ + ((Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ)).symm p) := rfl + let localArtin : Gal(KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ (n + 1), pow_pos p.2.pos (n + 1)⟩/ℚ) := + finitePlaceLocalToGlobalMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ (n + 1), pow_pos p.2.pos (n + 1)⟩) + ((Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).symm p) + (rationalCyclotomicChosenFinitePlaceExtension + ⟨p.1 ^ (n + 1), pow_pos p.2.pos (n + 1)⟩ + ((Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).symm p)) + (finitePlaceLocalArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ (n + 1), pow_pos p.2.pos (n + 1)⟩) + ((Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).symm p) + (rationalCyclotomicChosenFinitePlaceExtension + ⟨p.1 ^ (n + 1), pow_pos p.2.pos (n + 1)⟩ + ((Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).symm p)) + (IdeleGroup.finiteComponent + ((Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).symm p) + (IdeleGroup.principalIdele ℚ x))) + let chosenArtin : Gal(KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ (n + 1), pow_pos p.2.pos (n + 1)⟩/ℚ) := + chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ (n + 1), pow_pos p.2.pos (n + 1)⟩) + ((Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).symm p) + (IdeleGroup.finiteComponent + ((Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).symm p) + (IdeleGroup.principalIdele ℚ x)) + have hSpec : + rationalCyclotomicPrincipalHeightOneArtinInput + p (n + 1) x + ((Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ)).symm p) = + chosenArtin := by + dsimp only [chosenArtin] + exact rationalCyclotomicPrincipalHeightOneArtinInput_spec + p (n + 1) x + ((Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).symm p) + have hFactor : chosenArtin = localArtin := by + dsimp only [chosenArtin, localArtin] + exact chosenFinitePlaceArtinMonoidHom_apply_factor_of_extension_eq + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ (n + 1), pow_pos p.2.pos (n + 1)⟩) + ((Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).symm p) + (rationalCyclotomicChosenFinitePlaceExtension + ⟨p.1 ^ (n + 1), pow_pos p.2.pos (n + 1)⟩ + ((Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).symm p)) + hwChosen + (IdeleGroup.finiteComponent + ((Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).symm p) + (IdeleGroup.principalIdele ℚ x)) + have hLocal : + localArtin = rationalCyclotomicPrincipalPrimeChosenArtin p n x := by + dsimp only [localArtin] + simp only [rationalCyclotomicPrincipalPrimeChosenArtin, + rationalCyclotomicPrincipalPrimeModulus, RayClass.rationalPrime] + rfl + have hInput := hSpec.trans (hFactor.trans hLocal) + have hCharacter := congrArg + (fun sigma : Gal(KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ (n + 1), pow_pos p.2.pos (n + 1)⟩/ℚ) => + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ (n + 1)) + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ (n + 1), pow_pos p.2.pos (n + 1)⟩) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨p.1 ^ (n + 1), pow_pos p.2.pos (n + 1)⟩) + sigma) + hInput + calc + rationalCyclotomicPrincipalFinitePlaceCharacter p (n + 1) x p = _ := by + rw [rationalCyclotomicPrincipalFinitePlaceCharacter_spec, + rationalCyclotomicPrincipalHeightOneCharacter] + _ = _ := hCharacter + _ = Units.map + (PadicInt.toZModPow (p := p.1) (n + 1)).toMonoidHom + (padicIntUnitOfRat p + (rationalPrimeUnit x p : ℚ) + (rationalPrimeUnit x p).ne_zero + (padicValRat_rationalPrimeUnit x p)) := + galEquivZMod_chosenFinitePlaceArtinMonoidHom_principal_at_prime p n x + +open scoped Classical in +/-- A rational prime distinct from `p` does not divide any power +`p ^ k`. This includes the level-one case `k = 0`. -/ +theorem rationalPrime_not_dvd_pow_of_ne + (q p : Nat.Primes) (hqp : q ≠ p) (k : ℕ) : + ¬ q.1 ∣ p.1 ^ k := by + intro hdiv + apply hqp + apply Subtype.ext + exact Nat.prime_eq_prime_of_dvd_pow q.2 p.2 hdiv + +open scoped Classical in +/-- Away from `p`, the chosen finite-place character is the inverse +Frobenius power determined by the rational `q`-adic valuation. -/ +theorem rationalCyclotomicPrincipalFinitePlaceCharacter_of_ne + (p q : Nat.Primes) (hqp : q ≠ p) + (k : ℕ) (x : ℚˣ) : + rationalCyclotomicPrincipalFinitePlaceCharacter p k x q = + (ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr + (rationalPrime_not_dvd_pow_of_ne q p hqp k))) ^ + (-padicValRat q.1 (x : ℚ)) := by + have hprime : + RayClass.rationalPrime q = + ((Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ)).symm q) := by + change + (Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ)).symm q = + (Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ)).symm q + rfl + rw [rationalCyclotomicPrincipalFinitePlaceCharacter_spec, + rationalCyclotomicPrincipalHeightOneCharacter_spec, ← hprime] + exact + galEquivZMod_chosenFinitePlaceArtinMonoidHom_principal_of_not_dvd + ⟨p.1 ^ k, pow_pos p.2.pos k⟩ q + (rationalPrime_not_dvd_pow_of_ne q p hqp k) x + +open scoped Classical in +/-- Outside the finite rational prime-factorization support, the +`q`-adic valuation of the nonzero rational number is zero. -/ +theorem + padicValRat_eq_zero_of_not_mem_rationalPrimeFactorizationPrimeSupport + (x : ℚˣ) (p q : Nat.Primes) + (hq : + q ∉ rationalPrimeFactorizationPrimeSupport x p) : + padicValRat q.1 (x : ℚ) = 0 := by + have hqNat : + q.1 ∉ rationalPrimeFactorizationSupport x p := by + intro hmem + exact hq + ((mem_rationalPrimeFactorizationPrimeSupport_iff + x p q).2 hmem) + have hqNotLt : + ¬ q.1 < + max (max (x : ℚ).num.natAbs (x : ℚ).den) p.1 + 1 := by + intro hlt + apply hqNat + rw [rationalPrimeFactorizationSupport, + Finset.mem_filter, Finset.mem_range] + exact ⟨hlt, q.2⟩ + have hbound : + max (max (x : ℚ).num.natAbs (x : ℚ).den) p.1 + 1 ≤ + q.1 := + Nat.le_of_not_gt hqNotLt + have hnumLt : + (x : ℚ).num.natAbs < q.1 := by + apply lt_of_lt_of_le _ hbound + exact + Nat.lt_succ_of_le + (le_trans + (le_max_left (x : ℚ).num.natAbs (x : ℚ).den) + (le_max_left + (max (x : ℚ).num.natAbs (x : ℚ).den) p.1)) + have hdenLt : + (x : ℚ).den < q.1 := by + apply lt_of_lt_of_le _ hbound + exact + Nat.lt_succ_of_le + (le_trans + (le_max_right (x : ℚ).num.natAbs (x : ℚ).den) + (le_max_left + (max (x : ℚ).num.natAbs (x : ℚ).den) p.1)) + have hnumPos : + 0 < (x : ℚ).num.natAbs := + Nat.pos_of_ne_zero + (Int.natAbs_ne_zero.mpr + (Rat.num_ne_zero.mpr x.ne_zero)) + have hdenPos : + 0 < (x : ℚ).den := + Nat.pos_of_ne_zero (x : ℚ).den_ne_zero + have hqNum : + ¬ q.1 ∣ (x : ℚ).num.natAbs := + Nat.not_dvd_of_pos_of_lt hnumPos hnumLt + have hqDen : + ¬ q.1 ∣ (x : ℚ).den := + Nat.not_dvd_of_pos_of_lt hdenPos hdenLt + rw [padicValRat_def, padicValInt, + padicValNat.eq_zero_of_not_dvd hqNum, + padicValNat.eq_zero_of_not_dvd hqDen] + norm_num + +open scoped Classical in +/-- A chosen finite-place Artin character outside the rational +prime-factorization support is genuinely trivial. -/ +@[simp] +theorem + rationalCyclotomicPrincipalFinitePlaceCharacter_eq_one_of_not_mem_support + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) (q : Nat.Primes) + (hq : + q ∉ rationalPrimeFactorizationPrimeSupport x p) : + rationalCyclotomicPrincipalFinitePlaceCharacter p k x q = 1 := by + have hqp : q ≠ p := by + intro h + subst q + exact hq + (mem_rationalPrimeFactorizationPrimeSupport x p) + rw [rationalCyclotomicPrincipalFinitePlaceCharacter_of_ne + p q hqp k x, + padicValRat_eq_zero_of_not_mem_rationalPrimeFactorizationPrimeSupport + x p q hq] + simp only [neg_zero, zpow_zero] + +open scoped Classical in +/-- The actual rational principal finite-place characters have finite +multiplicative support, contained in the ordinary rational prime +factorization support. -/ +theorem + rationalCyclotomicPrincipalFinitePlaceCharacters_hasFiniteMulSupport + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) : + HasFiniteMulSupport + (rationalCyclotomicPrincipalFinitePlaceCharacter p k x) := by + rw [HasFiniteMulSupport] + apply + (rationalPrimeFactorizationPrimeSupport x p).finite_toSet.subset + intro q hq + by_contra hqSupport + exact hq + (rationalCyclotomicPrincipalFinitePlaceCharacter_eq_one_of_not_mem_support + p k x q hqSupport) + +open scoped Classical in +/-- The off-`p` finprod of the genuine chosen Artin characters is the +explicit finite product over the erased rational prime-factorization +support. -/ +theorem + rationalCyclotomicPrincipalAwayFinitePlaceCharacter_finprod_eq_factorizationProduct + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) : + (∏ᶠ (q : Nat.Primes) (_ : q ≠ p), + rationalCyclotomicPrincipalFinitePlaceCharacter p k x q) = + ∏ q : + ↥((rationalPrimeFactorizationPrimeSupport x p).erase p), + (ZMod.unitOfCoprime q.1.1 + (q.1.2.coprime_iff_not_dvd.mpr + (rationalPrime_not_dvd_pow_of_ne + q.1 p (Finset.ne_of_mem_erase q.2) k))) ^ + (-padicValRat q.1.1 (x : ℚ)) := by + let f : Nat.Primes → (ZMod (p.1 ^ k))ˣ := + rationalCyclotomicPrincipalFinitePlaceCharacter p k x + have hfinprod : + (∏ᶠ (q : Nat.Primes) (_ : q ≠ p), f q) = + ∏ q ∈ + (rationalPrimeFactorizationPrimeSupport x p).erase p, + f q := by + apply finprod_cond_eq_prod_of_cond_iff + intro q hq + constructor + · intro hqp + rw [Finset.mem_erase] + refine ⟨hqp, ?_⟩ + by_contra hqSupport + exact hq + (rationalCyclotomicPrincipalFinitePlaceCharacter_eq_one_of_not_mem_support + p k x q hqSupport) + · intro hqSupport + exact (Finset.mem_erase.mp hqSupport).1 + calc + (∏ᶠ (q : Nat.Primes) (_ : q ≠ p), + rationalCyclotomicPrincipalFinitePlaceCharacter p k x q) = + ∏ q ∈ + (rationalPrimeFactorizationPrimeSupport x p).erase p, + f q := hfinprod + _ = + ∏ q : + ↥((rationalPrimeFactorizationPrimeSupport x p).erase p), + f q.1 := by + exact + (Finset.prod_coe_sort + ((rationalPrimeFactorizationPrimeSupport x p).erase p) + f).symm + _ = + ∏ q : + ↥((rationalPrimeFactorizationPrimeSupport x p).erase p), + (ZMod.unitOfCoprime q.1.1 + (q.1.2.coprime_iff_not_dvd.mpr + (rationalPrime_not_dvd_pow_of_ne + q.1 p (Finset.ne_of_mem_erase q.2) k))) ^ + (-padicValRat q.1.1 (x : ℚ)) := by + apply Finset.prod_congr rfl + intro q _ + change rationalCyclotomicPrincipalFinitePlaceCharacter p k x q.1 = _ + exact rationalCyclotomicPrincipalFinitePlaceCharacter_of_ne + p q.1 (Finset.ne_of_mem_erase q.2) k x + +open scoped Classical in +/-- The direct rational `p`-unit character times the explicit inverse +away-from-`p` factorization product is the reduced rational sign. -/ +theorem + rationalPrimeUnitCharacter_mul_principalAwayFactorizationProduct_eq_sign + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) : + Units.map (PadicInt.toZModPow k).toMonoidHom + (padicIntUnitOfRat p (rationalPrimeUnit x p : ℚ) + (rationalPrimeUnit x p).ne_zero + (padicValRat_rationalPrimeUnit x p)) * + ∏ q : + ↥((rationalPrimeFactorizationPrimeSupport x p).erase p), + (ZMod.unitOfCoprime q.1.1 + (q.1.2.coprime_iff_not_dvd.mpr + (rationalPrime_not_dvd_pow_of_ne + q.1 p (Finset.ne_of_mem_erase q.2) k))) ^ + (-padicValRat q.1.1 (x : ℚ)) = + Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p) := by + exact + padicIntUnitOfRat_rationalPrimeUnit_mul_primeSupportInverseFactors_toZModPow + x p k + +open scoped Classical in +private noncomputable def rationalCyclotomicPrincipalHeightOneCharacterFinprod + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) : + (ZMod (p.1 ^ k))ˣ := + ∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + rationalCyclotomicPrincipalHeightOneCharacter p k x v + +open scoped Classical in +private theorem + rationalCyclotomicPrincipalHeightOneCharacterFinprod_eq_finprod + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) : + rationalCyclotomicPrincipalHeightOneCharacterFinprod p k x = + ∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + rationalCyclotomicPrincipalHeightOneCharacter p k x v := by + rfl + +open scoped Classical in +private theorem rationalCyclotomicPrincipalHeightOneCharacterFinprod_spec + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) : + rationalCyclotomicPrincipalHeightOneCharacterFinprod p k x = + ∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := + KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele ℚ x))) := by + calc + rationalCyclotomicPrincipalHeightOneCharacterFinprod p k x = + ∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + rationalCyclotomicPrincipalHeightOneCharacter p k x v := + rationalCyclotomicPrincipalHeightOneCharacterFinprod_eq_finprod p k x + _ = _ := by + apply finprod_congr + intro v + exact rationalCyclotomicPrincipalHeightOneCharacter_spec p k x v + +open scoped Classical in +private theorem + rationalCyclotomicPrincipalFinitePlaceCharacter_prime_mul_away_eq_namedFinprod + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) : + rationalCyclotomicPrincipalFinitePlaceCharacter p k x p * + (∏ᶠ (q : Nat.Primes) (_ : q ≠ p), + rationalCyclotomicPrincipalFinitePlaceCharacter p k x q) = + rationalCyclotomicPrincipalHeightOneCharacterFinprod p k x := by + rw [mul_finprod_cond_ne p + (rationalCyclotomicPrincipalFinitePlaceCharacters_hasFiniteMulSupport + p k x)] + calc + (∏ᶠ q : Nat.Primes, + rationalCyclotomicPrincipalFinitePlaceCharacter p k x q) = + ∏ᶠ q : Nat.Primes, + rationalCyclotomicPrincipalHeightOneCharacter p k x + ((Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ)).symm q) := by + apply finprod_congr + intro q + exact rationalCyclotomicPrincipalFinitePlaceCharacter_spec p k x q + _ = ∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + rationalCyclotomicPrincipalHeightOneCharacter p k x v := + finprod_comp_equiv + (Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ)).symm + _ = rationalCyclotomicPrincipalHeightOneCharacterFinprod p k x := + (rationalCyclotomicPrincipalHeightOneCharacterFinprod_eq_finprod + p k x).symm + +open scoped Classical in +/-- Reindexing by `Rat.HeightOneSpectrum.primesEquiv` and separating the +distinguished prime identifies the height-one finprod with its genuine +`p`-factor times the off-`p` prime finprod. -/ +theorem + rationalCyclotomicPrincipalFinitePlaceCharacter_prime_mul_away_finprod + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) : + rationalCyclotomicPrincipalFinitePlaceCharacter p k x p * + (∏ᶠ (q : Nat.Primes) (_ : q ≠ p), + rationalCyclotomicPrincipalFinitePlaceCharacter p k x q) = + ∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := + KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele ℚ x))) := by + exact + (rationalCyclotomicPrincipalFinitePlaceCharacter_prime_mul_away_eq_namedFinprod + p k x).trans + (rationalCyclotomicPrincipalHeightOneCharacterFinprod_spec p k x) + +open scoped Classical in +/-- Exact source for the final principal-product calculation: the +height-one chosen Artin finprod is the genuine `p`-factor times the +explicit away-from-`p` rational factorization product. -/ +theorem + rationalCyclotomicPrincipalFinitePlaceCharacter_prime_mul_factorizationProduct + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) : + rationalCyclotomicPrincipalFinitePlaceCharacter p k x p * + (∏ q : + ↥((rationalPrimeFactorizationPrimeSupport x p).erase p), + (ZMod.unitOfCoprime q.1.1 + (q.1.2.coprime_iff_not_dvd.mpr + (rationalPrime_not_dvd_pow_of_ne + q.1 p (Finset.ne_of_mem_erase q.2) k))) ^ + (-padicValRat q.1.1 (x : ℚ))) = + ∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := + KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele ℚ x))) := by + rw [ + ← + rationalCyclotomicPrincipalAwayFinitePlaceCharacter_finprod_eq_factorizationProduct + p k x] + exact + rationalCyclotomicPrincipalFinitePlaceCharacter_prime_mul_away_finprod + p k x + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalPrimeFactor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalPrimeFactor.lean new file mode 100644 index 0000000000..882385360f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalPrimeFactor.lean @@ -0,0 +1,57 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalAwayProduct +/-! +# The ramified prime factor of a rational cyclotomic principal idele + +The level-zero factor is trivial. At every positive level, the finite-place +character specification reduces the claim to the ramified chosen-Artin formula +proved in `RationalCyclotomicFinitePlaceArtin`. +-/ + +@[expose] public section + + + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open scoped Classical in +/-- The prime subtype supplies the primality instance used at this local factor. -/ +local instance rationalCyclotomicPrincipalPrimeFactorPrimeFact (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +attribute [local instance] rationalCyclotomicPrincipalPrimeFactorPrimeFact + +open scoped Classical in +/-- The chosen finite-place factor at the ramified prime `p` is the direct +reduction of the rational `p`-adic unit. -/ +theorem rationalCyclotomicPrincipalFinitePlaceCharacter_at_prime + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) : + rationalCyclotomicPrincipalFinitePlaceCharacter p k x p = + Units.map (PadicInt.toZModPow k).toMonoidHom + (padicIntUnitOfRat p + (rationalPrimeUnit x p : ℚ) + (rationalPrimeUnit x p).ne_zero + (padicValRat_rationalPrimeUnit x p)) := by + cases k with + | zero => + apply Units.ext + change (_ : ZMod 1) = _ + exact Subsingleton.elim _ _ + | succ n => + exact + rationalCyclotomicPrincipalFinitePlaceCharacter_at_prime_succ_formula + p n x + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalProduct.lean new file mode 100644 index 0000000000..74368fd320 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalProduct.lean @@ -0,0 +1,206 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalPrimeFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicZHatRigidity +/-! +# The rational cyclotomic principal-idele product formula + +The ramified local factor at `p` is the direct `p`-adic unit character. +Every other finite local factor is the inverse Frobenius power prescribed +by the rational prime factorization. Their product is the image of the +rational sign and therefore has square one. Prime-power detection in the +torsion-free rational `ZHat`-extension removes this final sign ambiguity +and proves that every rational principal idele has trivial value. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open scoped Classical in +/-- The prime subtype supplies the primality instance used at this local factor. -/ +local instance rationalCyclotomicPrincipalProductPrimeFact (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +attribute [local instance] rationalCyclotomicPrincipalProductPrimeFact + +open scoped Classical in +local instance rationalCyclotomicPrincipalProductPrimePowerNumberField + (p : Nat.Primes) (k : ℕ) : + NumberField (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) := + KummerTheory.rationalCyclotomicLevel_numberField + ⟨p.1 ^ k, pow_pos p.2.pos k⟩ + +attribute [local instance] rationalCyclotomicPrincipalProductPrimePowerNumberField + +open scoped Classical in +local instance rationalCyclotomicPrincipalProductPrimePowerFiniteDimensional + (p : Nat.Primes) (k : ℕ) : + FiniteDimensional ℚ (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) := + rationalCyclotomicPrincipalPrimeLevelFiniteDimensional + ⟨p.1 ^ k, pow_pos p.2.pos k⟩ + +attribute [local instance] rationalCyclotomicPrincipalProductPrimePowerFiniteDimensional + +open scoped Classical in +local instance rationalCyclotomicPrincipalProductPrimePowerIsAbelianGalois + (p : Nat.Primes) (k : ℕ) : + IsAbelianGalois ℚ (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) := + rationalCyclotomicLevelIsAbelianGalois + ⟨p.1 ^ k, pow_pos p.2.pos k⟩ + +attribute [local instance] rationalCyclotomicPrincipalProductPrimePowerIsAbelianGalois + +open scoped Classical in +noncomputable local instance + rationalCyclotomicPrincipalProductLevelFiniteDimensional + (m : ℕ+) : + FiniteDimensional ℚ + (KummerTheory.rationalCyclotomicLevel m) := + rationalCyclotomicPrincipalPrimeLevelFiniteDimensional m + +attribute [local instance] rationalCyclotomicPrincipalProductLevelFiniteDimensional + +open scoped Classical in +noncomputable local instance + rationalCyclotomicPrincipalProductLevelIsAbelianGalois + (m : ℕ+) : + IsAbelianGalois ℚ + (KummerTheory.rationalCyclotomicLevel m) := + rationalCyclotomicPrincipalPrimeLevelIsAbelianGalois m + +attribute [local instance] rationalCyclotomicPrincipalProductLevelIsAbelianGalois + +open scoped Classical in +/-- The finite product of the genuine chosen local Artin characters of a +rational principal idele is the reduction of its rational sign. -/ +theorem rationalCyclotomicPrincipalFinitePlaceProduct_eq_sign + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) : + (∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) + (KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := + KummerTheory.rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + v + (IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele ℚ x)))) = + Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p) := by + exact + (rationalCyclotomicPrincipalFinitePlaceCharacter_prime_mul_factorizationProduct + p k x).symm.trans + ((congrArg (fun u => u * _) + (rationalCyclotomicPrincipalFinitePlaceCharacter_at_prime + p k x)).trans + (rationalPrimeUnitCharacter_mul_principalAwayFactorizationProduct_eq_sign + p k x)) + +open scoped Classical in +/-- At every prime-power cyclotomic coordinate, the global Artin +character of the finite part of a rational principal idele is exactly the +reduced rational sign. -/ +theorem + rationalCyclotomicGlobalArtin_character_toZModPow_principalFinitePart_eq_sign + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) : + Units.map (PadicInt.toZModPow k).toMonoidHom + (KummerTheory.rationalCyclotomicCharacterPrimeProduct + (infiniteGlobalArtinMonoidHom + ℚ KummerTheory.rationalCyclotomicField + (rationalIdeleFinitePart + (IdeleGroup.principalIdele ℚ x))) p) = + Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p) := by + exact + (rationalCyclotomicGlobalArtin_character_toZModPow_finitePart_eq_finprod + (IdeleGroup.principalIdele ℚ x) p k).trans + (rationalCyclotomicPrincipalFinitePlaceProduct_eq_sign p k x) + +open scoped Classical in +/-- Every prime-power reduction of the finite principal cyclotomic +character has square one. -/ +theorem + rationalCyclotomicGlobalArtin_character_toZModPow_principalFinitePart_sq + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) : + Units.map (PadicInt.toZModPow k).toMonoidHom + (KummerTheory.rationalCyclotomicCharacterPrimeProduct + (infiniteGlobalArtinMonoidHom + ℚ KummerTheory.rationalCyclotomicField + (rationalIdeleFinitePart + (IdeleGroup.principalIdele ℚ x))) p) ^ 2 = + 1 := by + exact + (congrArg (fun u => u ^ 2) + (rationalCyclotomicGlobalArtin_character_toZModPow_principalFinitePart_eq_sign + p k x)).trans + (rationalSignPadicUnit_toZModPow_sq x p k) + +open scoped Classical in +/-- The finite part of every rational principal idele has trivial value +in the actual rational cyclotomic `ZHat`-extension. -/ +theorem rationalCyclotomicZHatIdeleValue_principalFinitePart_eq_one + (x : ℚˣ) : + rationalCyclotomicZHatIdeleValue + (rationalIdeleFinitePart + (IdeleGroup.principalIdele ℚ x)) = + 1 := by + apply + rationalCyclotomicZHatIdeleValue_eq_one_of_character_reductions + intro p k + exact + rationalCyclotomicGlobalArtin_character_toZModPow_principalFinitePart_sq + p k x + +open scoped Classical in +/-- The rational cyclotomic value kills every rational principal idele. -/ +theorem rationalCyclotomicZHatIdeleValue_principalIdele_eq_one + (x : ℚˣ) : + rationalCyclotomicZHatIdeleValue + (IdeleGroup.principalIdele ℚ x) = + 1 := by + exact + (rationalCyclotomicZHatIdeleValue_principalIdele_eq_finitePart x).trans + (rationalCyclotomicZHatIdeleValue_principalFinitePart_eq_one x) + +open scoped Classical in +/-- The normalized cyclotomic `ZHat`-valuation kills principal ideles over +every number field. This is the unconditional principal-idele endpoint +needed for descent to the idele class group. -/ +@[simp] +theorem normalizedCyclotomicZHatIdeleValue_principalIdele_eq_zero + (K : Type) [Field K] [NumberField K] (x : Kˣ) : + normalizedCyclotomicZHatIdeleValue K + (Additive.ofMul + (IdeleGroup.principalIdele K x)) = + 0 := by + exact + (normalizedCyclotomicZHatIdeleValue_principalIdele_eq_zero_iff_finitePart + K x).2 + (rationalCyclotomicZHatIdeleValue_principalFinitePart_eq_one + (Units.map (Algebra.norm ℚ) x)) + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean new file mode 100644 index 0000000000..f43e1fd7a9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean @@ -0,0 +1,855 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianLocalConductorComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlaceArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RayClassComparison +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacterEquiv +/-! +# Rational cyclotomic ray norm groups + +For a positive integer `m`, the genuine idèle-class norm range of the +actual cyclotomic level `ℚ(μ_m)` is the rational ray congruence subgroup +modulo `(m)`. + +The local input is the cyclotomic higher-unit calculation: at a rational prime +`q`, an +`m.factorization q`-th higher unit has trivial Artin action on every +prime-power cyclotomic part. On the `q`-primary part this is the actual +multiplicative Lubin--Tate norm theorem; on every other primary part it is +the unramified Artin formula together with valuation zero. The finite +cyclotomic character then detects that the full local Artin symbol is +trivial. +-/ + +@[expose] public section + +open scoped NNReal NumberField ValuativeRel +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open LubinTate + +open scoped Classical in +/-- The prime subtype supplies the primality instance used at this local factor. -/ +local instance rationalCyclotomicRayNormPrimeFact (q : Nat.Primes) : Fact q.1.Prime := + ⟨q.2⟩ + +attribute [local instance] rationalCyclotomicRayNormPrimeFact + +attribute [local instance] + rationalCyclotomicPrincipalPrimeLevelFiniteDimensional + rationalCyclotomicPrincipalPrimeLevelIsAbelianGalois + +section FinitePlaceLocalCalculation + +attribute [local instance] + rationalFinitePlaceBaseNontriviallyNormedField + rationalFinitePlaceBaseLocallyCompactSpace + rationalFinitePlaceBaseIsUltrametricDist + rationalFinitePlaceBaseValued + rationalFinitePlaceBaseValuativeRel + rationalFinitePlaceBaseValuationIsNontrivial + rationalFinitePlaceBaseValuationCompatible + rationalFinitePlaceBaseValuativeRelIsNontrivial + rationalFinitePlaceBaseIsValuativeTopology + rationalFinitePlaceBaseIsNonarchimedeanLocalField + +open scoped Classical in +private theorem + rationalRayNorm_integerUnitsMap_mem_higherPrincipalUnits_iff + (q : Nat.Primes) (n : ℕ) + (u : 𝒪[RationalCyclotomicPrincipalPrimeCompletion q]ˣ) : + Units.mapEquiv + (((rationalFinitePlaceCompletionIntegerRingEquivPadicInt q).trans + (padicIntEquivValuationSubring q.1)).toMulEquiv) u ∈ + higherPrincipalUnitGroup + (padicLocalField q.1).toCompleteDVF n ↔ + u ∈ principalUnits + (RationalCyclotomicPrincipalPrimeCompletion q) n := by + let F := RationalCyclotomicPrincipalPrimeCompletion q + let eO : + 𝒪[F] ≃+* (padicLocalField q.1).valuationSubring := + (rationalFinitePlaceCompletionIntegerRingEquivPadicInt q).trans + (padicIntEquivValuationSubring q.1) + change + eO (u : 𝒪[F]) - 1 ∈ + (padicLocalField q.1).toCompleteDVF.maximalIdeal ^ n ↔ + (u : 𝒪[F]) - 1 ∈ + (IsLocalRing.maximalIdeal 𝒪[F]) ^ n + simpa only [map_sub, map_one] using + (ValuationTheory.ringEquiv_mem_maximalIdeal_pow_iff + eO n ((u : 𝒪[F]) - 1)) + +open scoped Classical in +private theorem rationalRayNorm_fieldUnitsMap_integerUnits + (q : Nat.Primes) + (u : 𝒪[RationalCyclotomicPrincipalPrimeCompletion q]ˣ) : + Units.map + (rationalFinitePlaceCompletionRingEquivPadic q).toMonoidHom + (IsNonarchimedeanLocalField.integerUnitsToFieldUnits + (RationalCyclotomicPrincipalPrimeCompletion q) u) = + CompleteDVF.valuationSubringUnitsToFieldUnits + (padicLocalField q.1).toCompleteDVF + (Units.mapEquiv + (((rationalFinitePlaceCompletionIntegerRingEquivPadicInt q).trans + (padicIntEquivValuationSubring q.1)).toMulEquiv) u) := by + let F := RationalCyclotomicPrincipalPrimeCompletion q + let eK := rationalFinitePlaceCompletionRingEquivPadic q + let eO : + 𝒪[F] ≃+* (padicLocalField q.1).valuationSubring := + (rationalFinitePlaceCompletionIntegerRingEquivPadicInt q).trans + (padicIntEquivValuationSubring q.1) + apply Units.ext + change + eK (algebraMap 𝒪[F] F + ((u : 𝒪[F]ˣ) : 𝒪[F])) = + algebraMap (padicLocalField q.1).valuationSubring ℚ_[q.1] + (eO ((u : 𝒪[F]ˣ) : 𝒪[F])) + calc + eK (algebraMap 𝒪[F] F + ((u : 𝒪[F]ˣ) : 𝒪[F])) = + algebraMap ℤ_[q.1] ℚ_[q.1] + ((rationalFinitePlaceCompletionIntegerRingEquivPadicInt q) + ((u : 𝒪[F]ˣ) : 𝒪[F])) := + rationalFinitePlaceCompletionIntegerRingEquivPadicInt_coe + q ((u : 𝒪[F]ˣ) : 𝒪[F]) + _ = + algebraMap (padicLocalField q.1).valuationSubring ℚ_[q.1] + (padicIntEquivValuationSubring q.1 + ((rationalFinitePlaceCompletionIntegerRingEquivPadicInt q) + ((u : 𝒪[F]ˣ) : 𝒪[F]))) := by + change + (((rationalFinitePlaceCompletionIntegerRingEquivPadicInt q) + ((u : 𝒪[F]ˣ) : 𝒪[F]) : ℤ_[q.1]) : ℚ_[q.1]) = + ((padicIntEquivValuationSubring q.1 + ((rationalFinitePlaceCompletionIntegerRingEquivPadicInt q) + ((u : 𝒪[F]ˣ) : 𝒪[F])) : + (padicDVRValuation q.1).valuationSubring) : ℚ_[q.1]) + exact + (padicIntEquivValuationSubring_coe q.1 + ((rationalFinitePlaceCompletionIntegerRingEquivPadicInt q) + ((u : 𝒪[F]ˣ) : 𝒪[F]))).symm + _ = + algebraMap (padicLocalField q.1).valuationSubring ℚ_[q.1] + (eO ((u : 𝒪[F]ˣ) : 𝒪[F])) := + rfl + +open scoped Classical in +/-- The canonical rational-completion equivalence transports the +topology-first principal-unit subgroup to the packaged higher-principal-unit +subgroup in the standard `q`-adic field. -/ +theorem + rationalFinitePlaceFieldPrincipalUnits_map_eq_padicHigherPrincipalUnits + (q : Nat.Primes) (n : ℕ) : + let vQ := + HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q) + let eK := + rationalFinitePlaceCompletionRingEquivPadic q + (fieldPrincipalUnits vQ.Completion n).map + (Units.map eK.toMonoidHom) = + (higherPrincipalUnitGroup + (padicLocalField q.1).toCompleteDVF n).map + (CompleteDVF.valuationSubringUnitsToFieldUnits + (padicLocalField q.1).toCompleteDVF) := by + let vQ := + HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q) + let eO : + 𝒪[vQ.Completion] ≃+* + (padicLocalField q.1).valuationSubring := + (rationalFinitePlaceCompletionIntegerRingEquivPadicInt q).trans + (padicIntEquivValuationSubring q.1) + let eU : + 𝒪[vQ.Completion]ˣ ≃* + (padicLocalField q.1).valuationSubringˣ := + Units.mapEquiv eO.toMulEquiv + let jQ : 𝒪[vQ.Completion]ˣ →* vQ.Completionˣ := + IsNonarchimedeanLocalField.integerUnitsToFieldUnits vQ.Completion + ext x + constructor + · rintro ⟨z, hz, rfl⟩ + change + z ∈ + (principalUnits vQ.Completion n).map jQ at hz + obtain ⟨u, hu, rfl⟩ := hz + refine + ⟨eU u, + (rationalRayNorm_integerUnitsMap_mem_higherPrincipalUnits_iff + q n u).2 hu, + ?_⟩ + exact (rationalRayNorm_fieldUnitsMap_integerUnits q u).symm + · rintro ⟨u, hu, rfl⟩ + let z : 𝒪[vQ.Completion]ˣ := eU.symm u + have hzu : + eU z = u := + eU.apply_symm_apply u + refine + ⟨jQ z, ⟨z, ?_, rfl⟩, ?_⟩ + · apply + (rationalRayNorm_integerUnitsMap_mem_higherPrincipalUnits_iff + q n z).1 + exact hzu.symm ▸ hu + · exact + (rationalRayNorm_fieldUnitsMap_integerUnits q z).trans + (congrArg + (CompleteDVF.valuationSubringUnitsToFieldUnits + (padicLocalField q.1).toCompleteDVF) + hzu) + +section PrimePowerCalculation + +attribute [local instance] + rationalCyclotomicPrincipalPrimePadicLevelFiniteDimensional + +open scoped Classical in +noncomputable local instance + rationalCyclotomicRayNormPadicLevelIsAbelianGalois + (q : Nat.Primes) (n : ℕ) : + IsAbelianGalois ℚ_[q.1] + (RationalCyclotomicPrincipalPrimePadicLevel q n) := + standardLubinTateLevelField_isAbelianGalois + (padicLocalField q.1) + (padicMultiplicativeLubinTateSeries_isUniformizer q.1) n + +attribute [local instance] rationalCyclotomicRayNormPadicLevelIsAbelianGalois + +open scoped Classical in +/-- A rational higher unit has trivial local Artin image in the standard +multiplicative Lubin--Tate level. This is the purely `q`-adic part of the +prime-power argument; the semilinear transport to the localized global +cyclotomic field is handled separately below. -/ +private theorem rationalPrimePowerPadicAbelianLocalArtin_eq_one + (q : Nat.Primes) (n : ℕ) + (x : ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) + (hx : + x ∈ RayClass.localHigherUnitGroup + (RayClass.rationalPrime q) (n + 1)) : + abelianLocalArtinMonoidHom ℚ_[q.1] + (RationalCyclotomicPrincipalPrimePadicLevel q n) + (Units.map + (rationalFinitePlaceCompletionRingEquivPadic q).toMonoidHom + ((finitePlaceCompletionUnitsContinuousMulEquiv + (RayClass.rationalPrime q)).symm x)) = 1 := by + let v : HeightOneSpectrum (𝓞 ℚ) := + RayClass.rationalPrime q + let vQ := HeightOneSpectrum.adicAbv ℚ v + let eK := rationalFinitePlaceCompletionRingEquivPadic q + let eC : + vQ.Completionˣ ≃ₜ* (v.adicCompletion ℚ)ˣ := + finitePlaceCompletionUnitsContinuousMulEquiv v + let localInput : vQ.Completionˣ := eC.symm x + let T := RationalCyclotomicPrincipalPrimePadicLevel q n + have hxMap : + x ∈ + (fieldPrincipalUnits vQ.Completion (n + 1)).map + eC.toMonoidHom := by + rw [ + GlobalClassFields.finitePlaceFieldPrincipalUnits_map_eq_localHigherUnitGroup + (K := ℚ) v (n + 1)] + exact hx + have hlocalInput : + localInput ∈ + fieldPrincipalUnits vQ.Completion (n + 1) := by + obtain ⟨y, hy, hyx⟩ := hxMap + have hylocal : y = localInput := by + have hyx' : eC y = x := hyx + apply eC.injective + exact hyx'.trans (eC.apply_symm_apply x).symm + rw [← hylocal] + exact hy + have hxMapped : + Units.map eK.toMonoidHom localInput ∈ + (higherPrincipalUnitGroup + (padicLocalField q.1).toCompleteDVF (n + 1)).map + (CompleteDVF.valuationSubringUnitsToFieldUnits + (padicLocalField q.1).toCompleteDVF) := by + rw [← + rationalFinitePlaceFieldPrincipalUnits_map_eq_padicHigherPrincipalUnits + q (n + 1)] + exact ⟨localInput, hlocalInput, rfl⟩ + obtain ⟨u, hu, hux⟩ := hxMapped + have hPadic : + abelianLocalArtinMonoidHom ℚ_[q.1] T + (Units.map eK.toMonoidHom localInput) = 1 := by + rw [← hux] + simpa only [standardLubinTateUnitFactorFieldUnit] using + (padicMultiplicativeAbelianLocalArtin_eq_one_of_mem_higherPrincipalUnitGroup + q.1 n u hu) + simpa only [T, eK, localInput, eC, vQ, v] using hPadic + +open scoped Classical in +/-- The chosen ramified finite-place Artin value, with the cyclotomic level +and its instance arguments frozen behind a named boundary. -/ +private noncomputable def rationalPrimePowerChosenFinitePlaceArtinValue + (q : Nat.Primes) (n : ℕ) + (x : + ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) : + KummerTheory.rationalCyclotomicLevel + (rationalCyclotomicPrincipalPrimeModulus q n) ≃ₐ[ℚ] + KummerTheory.rationalCyclotomicLevel + (rationalCyclotomicPrincipalPrimeModulus q n) := + chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := + KummerTheory.rationalCyclotomicLevel + (rationalCyclotomicPrincipalPrimeModulus q n)) + (RayClass.rationalPrime q) x + +open scoped Classical in +/-- The standard `q`-adic calculation evaluated on the canonical input used +by the finite-place Artin construction. -/ +private theorem rationalPrimePowerFinitePlaceLocalInputPadicArtin_eq_one + (q : Nat.Primes) (n : ℕ) + (x : ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) + (hx : + x ∈ RayClass.localHigherUnitGroup + (RayClass.rationalPrime q) (n + 1)) : + abelianLocalArtinMonoidHom ℚ_[q.1] + (RationalCyclotomicPrincipalPrimePadicLevel q n) + (Units.map + (rationalFinitePlaceCompletionRingEquivPadic q).toMonoidHom + (finitePlaceLocalArtinInput + (RayClass.rationalPrime q) x)) = 1 := by + change + abelianLocalArtinMonoidHom ℚ_[q.1] + (RationalCyclotomicPrincipalPrimePadicLevel q n) + (Units.map + (rationalFinitePlaceCompletionRingEquivPadic q).toMonoidHom + ((finitePlaceCompletionUnitsContinuousMulEquiv + (RayClass.rationalPrime q)).symm x)) = 1 + exact rationalPrimePowerPadicAbelianLocalArtin_eq_one q n x hx + +open scoped Classical in +/-- The normalized local calculation, transported through the decomposition +group inclusion. This bridge contains no semilinear instance search. -/ +private theorem rationalPrimePowerFinitePlaceArtinOfExtension_eq_one + (q : Nat.Primes) (n : ℕ) + (x : + ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) + (hx : + x ∈ RayClass.localHigherUnitGroup + (RayClass.rationalPrime q) (n + 1)) : + finitePlaceArtinMonoidHomOfExtension + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel + (rationalCyclotomicPrincipalPrimeModulus q n)) + (RayClass.rationalPrime q) + (rationalCyclotomicChosenFinitePlaceExtension + (rationalCyclotomicPrincipalPrimeModulus q n) + (RayClass.rationalPrime q)) x = 1 := by + exact + rationalCyclotomicPrincipalPrime_finitePlaceArtinOfExtension_eq_one_of_padic + q n x + (rationalPrimePowerFinitePlaceLocalInputPadicArtin_eq_one q n x hx) + +open scoped Classical in +/-- The local semilinear calculation for a ramified prime-power level. Its +statement only exposes the named global Artin value. -/ +private theorem + rationalPrimePowerChosenFinitePlaceArtinValue_eq_one_of_mem_localHigherUnitGroup + (q : Nat.Primes) (n : ℕ) + (x : + ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) + (hx : + x ∈ RayClass.localHigherUnitGroup + (RayClass.rationalPrime q) (n + 1)) : + rationalPrimePowerChosenFinitePlaceArtinValue q n x = 1 := by + simpa only [rationalPrimePowerChosenFinitePlaceArtinValue, + chosenFinitePlaceArtinMonoidHom, + rationalCyclotomicChosenFinitePlaceExtension] using + rationalPrimePowerFinitePlaceArtinOfExtension_eq_one q n x hx + +open scoped Classical in +/-- A principal unit of depth `n + 1` has trivial chosen finite-place +Artin symbol in the genuine `q ^ (n + 1)`-st rational cyclotomic level. -/ +theorem + rationalPrimePowerChosenFinitePlaceArtin_eq_one_of_mem_localHigherUnitGroup + (q : Nat.Primes) (n : ℕ) + (x : + ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) + (hx : + x ∈ RayClass.localHigherUnitGroup + (RayClass.rationalPrime q) (n + 1)) : + chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := + KummerTheory.rationalCyclotomicLevel + (rationalCyclotomicPrincipalPrimeModulus q n)) + (RayClass.rationalPrime q) x = + 1 := by + simpa only [rationalPrimePowerChosenFinitePlaceArtinValue] using + rationalPrimePowerChosenFinitePlaceArtinValue_eq_one_of_mem_localHigherUnitGroup + q n x hx + +open scoped Classical in +/-- The positive-depth form of the prime-power calculation. Eliminating +the successor before introducing a cyclotomic level avoids transporting its +dependent field and instance data later in the full-level coordinate proof. -/ +private theorem + rationalPrimePowerChosenFinitePlaceArtin_eq_one_of_mem_localHigherUnitGroup_pos + (q : Nat.Primes) (k : ℕ) (hk : k ≠ 0) + (mp : ℕ+) (hmp : (mp : ℕ) = q.1 ^ k) + (x : ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) + (hx : + x ∈ RayClass.localHigherUnitGroup + (RayClass.rationalPrime q) k) : + chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel mp) + (RayClass.rationalPrime q) x = 1 := by + obtain ⟨n, rfl⟩ := Nat.exists_eq_succ_of_ne_zero hk + have hlevel : + mp = rationalCyclotomicPrincipalPrimeModulus q n := by + apply Subtype.ext + exact hmp + subst mp + exact + rationalPrimePowerChosenFinitePlaceArtin_eq_one_of_mem_localHigherUnitGroup + q n x hx + +open scoped Classical in +/-- A valuation-zero input away from a named cyclotomic level has trivial +chosen Artin value. Keeping the level as a positive-natural variable makes +the instance owner identical on both sides of the imported calculation. -/ +private theorem rationalCyclotomicRayNormAwayChosenFinitePlaceArtin_eq_one + (mp : ℕ+) (q : Nat.Primes) + (hq : ¬ q.1 ∣ (mp : ℕ)) + (x : ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) + (hzero : rationalCyclotomicArtinLocalExponent q x = 0) : + chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel mp) + (RayClass.rationalPrime q) x = 1 := by + exact + chosenFinitePlaceArtinMonoidHom_eq_one_of_not_dvd_of_localExponent_eq_zero + mp q hq x hzero + +end PrimePowerCalculation + +open scoped Classical in +open _root_.GlobalClassFieldTheory.GlobalClassFields renaming + finitePlaceCompletion_valuationMap_eq_zero_of_mem_localHigherUnitGroup → + finitePlaceCompletion_valuationMap_eq_zero_of_mem_localHigherUnitGroup in +/-- Membership in a rational local higher-unit group forces the normalized +cyclotomic Artin exponent to vanish. This boundary keeps the completion and +valuation expansion out of the full cyclotomic-coordinate calculation. -/ +private theorem + rationalCyclotomicRayNormLocalExponent_eq_zero_of_mem_localHigherUnitGroup + (q : Nat.Primes) (n : ℕ) + (x : ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) + (hx : + x ∈ RayClass.localHigherUnitGroup + (RayClass.rationalPrime q) n) : + rationalCyclotomicArtinLocalExponent q x = 0 := by + change + IsNonarchimedeanLocalField.valuationMap + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + (Additive.ofMul + ((finitePlaceCompletionUnitsContinuousMulEquiv + (RayClass.rationalPrime q)).symm x)) = + 0 + exact + finitePlaceCompletion_valuationMap_eq_zero_of_mem_localHigherUnitGroup + (K := ℚ) (RayClass.rationalPrime q) n x hx + +open scoped Classical in +/-- The rational ray-class higher-unit group at `q` consists of actual +local norms from the chosen completion of the genuine cyclotomic level. -/ +theorem + rationalCyclotomicLevel_localHigherUnitGroup_le_chosenLocalNorm + (m : ℕ+) (q : Nat.Primes) : + RayClass.localHigherUnitGroup + (RayClass.rationalPrime q) + (RayClass.rationalFiniteModulus (m : ℕ) + (RayClass.rationalPrime q)) ≤ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel m) + (RayClass.rationalPrime q) := by + intro x hxMod + rw [← chosenFinitePlaceArtinMonoidHom_ker, + MonoidHom.mem_ker] + have hx : + x ∈ RayClass.localHigherUnitGroup + (RayClass.rationalPrime q) + ((m : ℕ).factorization q.1) := by + simpa only [RayClass.rationalFiniteModulus_apply, + RayClass.natGenerator_rationalPrime] using hxMod + let L := KummerTheory.rationalCyclotomicLevel m + let : IsCyclotomicExtension {(m : ℕ)} ℚ L := by + simpa only [L] using + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension m + let : FiniteDimensional ℚ L := + rationalCyclotomicLevelFiniteDimensional m + let : IsAbelianGalois ℚ L := + rationalCyclotomicLevelIsAbelianGalois m + let σ : Gal(L/ℚ) := + chosenFinitePlaceArtinMonoidHom + (K := ℚ) (L := L) (RayClass.rationalPrime q) x + apply + (IsCyclotomicExtension.Rat.galEquivZMod + (m : ℕ) L).injective + apply Units.ext + let e := + ZMod.equivPi (n := (m : ℕ)) m.2.ne' + apply e.injective + funext r + have hrPrime : r.1.Prime := + Nat.prime_of_mem_primeFactors r.2 + let p : Nat.Primes := ⟨r.1, hrPrime⟩ + let k := (m : ℕ).factorization p.1 + have hpDvd : + p.1 ∣ (m : ℕ) := + Nat.dvd_of_mem_primeFactors r.2 + have hkNe : k ≠ 0 := + (p.2.factorization_pos_of_dvd m.ne_zero hpDvd).ne' + have hpow : p.1 ^ k ∣ (m : ℕ) := + (p.2.pow_dvd_iff_le_factorization m.2.ne').2 le_rfl + let mp : ℕ+ := + ⟨p.1 ^ k, pow_pos p.2.pos k⟩ + let P := KummerTheory.rationalCyclotomicLevel mp + have hmp : (mp : ℕ) = p.1 ^ k := rfl + have hAwayDvd (hpq : p ≠ q) : ¬ q.1 ∣ (mp : ℕ) := by + change ¬ q.1 ∣ p.1 ^ k + have hqNotDvdP : ¬ q.1 ∣ p.1 := by + intro hqp + rcases (Nat.dvd_prime p.2).1 hqp with hqOne | hqpEq + · exact q.2.ne_one hqOne + · exact hpq (Subtype.ext hqpEq.symm) + have hqCoprimeP : Nat.Coprime q.1 p.1 := + q.2.coprime_iff_not_dvd.mpr hqNotDvdP + exact q.2.coprime_iff_not_dvd.mp (hqCoprimeP.pow_right k) + let : NumberField P := + KummerTheory.rationalCyclotomicLevel_numberField mp + let : IsCyclotomicExtension {p.1 ^ k} ℚ P := by + rw [← hmp] + simpa only [P] using + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension mp + let : FiniteDimensional ℚ P := + rationalCyclotomicLevelFiniteDimensional mp + let : IsAbelianGalois ℚ P := + rationalCyclotomicLevelIsAbelianGalois mp + let χ : Gal(P/ℚ) ≃* (ZMod (p.1 ^ k))ˣ := + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) P + have hFL : P ≤ L := by + simpa only [P] using + (KummerTheory.rationalCyclotomicLevel_mono + (m := mp) (n := m) hpow) + let algFL : Algebra P L := + RingHom.toAlgebra + (IntermediateField.inclusion hFL).toRingHom + let : SMul P L := + @Algebra.toSMul P L _ _ algFL + let : Algebra P L := algFL + let : IsScalarTower ℚ P L := + IsScalarTower.of_algHom (IntermediateField.inclusion hFL) + have hrestrict : + σ.restrictNormal P = + chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel mp) + (RayClass.rationalPrime q) x := by + change + (AlgEquiv.restrictNormalHom + (KummerTheory.rationalCyclotomicLevel mp)) + (chosenFinitePlaceArtinMonoidHom + (K := ℚ) (L := L) (RayClass.rationalPrime q) x) = + chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel mp) + (RayClass.rationalPrime q) x + exact + DFunLike.congr_fun + (chosenFinitePlaceArtinMonoidHom_restrict_tower + (K := ℚ) (L := L) + (E := KummerTheory.rationalCyclotomicLevel mp) + (RayClass.rationalPrime q)) + x + have hcharacterRestrict : + χ (σ.restrictNormal P) = + χ (chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel mp) + (RayClass.rationalPrime q) x) := + congrArg χ hrestrict + have hprojection : + ZMod.unitsMap hpow + (IsCyclotomicExtension.Rat.galEquivZMod + (m : ℕ) L σ) = + χ (σ.restrictNormal P) := + (IsCyclotomicExtension.Rat.galEquivZMod_restrictNormal_apply + (m : ℕ) L P + hpow σ).symm + have hcoordinate : + ZMod.unitsMap hpow + (IsCyclotomicExtension.Rat.galEquivZMod + (m : ℕ) L σ) = + 1 := by + refine hprojection.trans ?_ + by_cases hpq : p = q + · subst q + have hArtinF : + chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel mp) + (RayClass.rationalPrime p) x = 1 := by + exact + rationalPrimePowerChosenFinitePlaceArtin_eq_one_of_mem_localHigherUnitGroup_pos + p k hkNe mp hmp x hx + have hArtinCharacter : + χ (chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel mp) + (RayClass.rationalPrime p) x) = 1 := by + calc + χ (chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel mp) + (RayClass.rationalPrime p) x) = + χ 1 := congrArg χ hArtinF + _ = 1 := χ.map_one + exact hcharacterRestrict.trans hArtinCharacter + · have hzero : rationalCyclotomicArtinLocalExponent q x = 0 := + rationalCyclotomicRayNormLocalExponent_eq_zero_of_mem_localHigherUnitGroup + q ((m : ℕ).factorization q.1) x hx + have hArtinF : + chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel mp) + (RayClass.rationalPrime q) x = 1 := by + exact + rationalCyclotomicRayNormAwayChosenFinitePlaceArtin_eq_one + mp q (hAwayDvd hpq) x hzero + have hArtinCharacter : + χ (chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel mp) + (RayClass.rationalPrime q) x) = 1 := by + calc + χ (chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel mp) + (RayClass.rationalPrime q) x) = + χ 1 := congrArg χ hArtinF + _ = 1 := χ.map_one + exact hcharacterRestrict.trans hArtinCharacter + have heval (z : ZMod (m : ℕ)) : + e z r = + ZMod.castHom hpow (ZMod (p.1 ^ k)) z := by + change + ((Pi.evalRingHom + (fun s : (m : ℕ).primeFactors => + ZMod (s.1 ^ (m : ℕ).factorization s.1)) r).comp + e.toRingHom) z = + ZMod.castHom hpow (ZMod (p.1 ^ k)) z + exact RingHom.congr_fun (Subsingleton.elim _ _) z + rw [map_one, heval, heval] + simpa only [p, k, ZMod.unitsMap_val, + ZMod.castHom_apply, map_one, Units.val_one] using + congrArg + (fun u : (ZMod (p.1 ^ k))ˣ => + (u : ZMod (p.1 ^ k))) + hcoordinate + +end FinitePlaceLocalCalculation + +open scoped Classical in +/-- At every finite rational place, the local higher-unit group prescribed +by `(m)` lies in the chosen local norm subgroup of `ℚ(μ_m)`. -/ +theorem rationalCyclotomicLevel_rationalModulus_localNorm + (m : ℕ+) + (v : HeightOneSpectrum (𝓞 ℚ)) : + RayClass.localHigherUnitGroup v + (RayClass.rationalFiniteModulus (m : ℕ) v) ≤ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel m) v := by + let q : Nat.Primes := + Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ) v + have hv : + RayClass.rationalPrime q = v := by + change + (Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ)).symm + ((Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ)) v) = + v + exact + (Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ)).symm_apply_apply v + rw [← hv] + exact + rationalCyclotomicLevel_localHigherUnitGroup_le_chosenLocalNorm m q + +open scoped Classical in +/-- The rational ray congruence subgroup modulo `(m)` is contained in the +genuine idèle-class norm range from the actual cyclotomic level `ℚ(μ_m)`. -/ +theorem + rationalCongruenceSubgroup_le_rationalCyclotomicLevelIdeleClassNormRange + (m : ℕ) (hm : m ≠ 0) : + let mp : ℕ+ := ⟨m, Nat.pos_of_ne_zero hm⟩ + RayClass.Modulus.congruenceSubgroup + (RayClass.rationalModulus m) ≤ + (_root_.ideleClassNorm ℚ + (KummerTheory.rationalCyclotomicLevel mp)).range := by + dsimp only + let mp : ℕ+ := ⟨m, Nat.pos_of_ne_zero hm⟩ + let L := KummerTheory.rationalCyclotomicLevel mp + have hlocal : + ∀ v : HeightOneSpectrum (𝓞 ℚ), + RayClass.localHigherUnitGroup v + (RayClass.rationalFiniteModulus m v) ≤ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := ℚ) (L := L) v := by + intro v + change + RayClass.localHigherUnitGroup v + (RayClass.rationalFiniteModulus (mp : ℕ) v) ≤ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel mp) v + exact rationalCyclotomicLevel_rationalModulus_localNorm mp v + have hfinite : + GlobalClassFields.ideleClassNormDefiningModulus + (K := ℚ) (L := L) ≤ + RayClass.rationalFiniteModulus m := + GlobalClassFields.ideleClassNormDefiningModulus_le_of_localHigherUnitGroup_le + (K := ℚ) (L := L) + (RayClass.rationalFiniteModulus m) hlocal + have hmodulus : + RayClass.Modulus.narrowOfFinite + (GlobalClassFields.ideleClassNormDefiningModulus + (K := ℚ) (L := L)) ≤ + RayClass.rationalModulus m := by + refine ⟨hfinite, ?_⟩ + change + (Finset.univ : Finset (RayClass.RealPlace ℚ)) ⊆ + Finset.univ + exact fun _ h => h + exact + (GlobalClassFields.rayClassCongruenceSubgroup_antitone + (K := ℚ) hmodulus).trans + (GlobalClassFields.ideleClassNormDefiningModulus_isDefiningModulus + (K := ℚ) (L := L)) + +open scoped Classical in +/-- The genuine idèle-class norm range from the actual finite cyclotomic +level is exactly the rational ray congruence subgroup modulo `(m)`. -/ +theorem + rationalCyclotomicLevel_ideleClassNorm_range_eq_rationalCongruenceSubgroup + (m : ℕ) (hm : m ≠ 0) : + let mp : ℕ+ := ⟨m, Nat.pos_of_ne_zero hm⟩ + (_root_.ideleClassNorm ℚ + (KummerTheory.rationalCyclotomicLevel mp)).range = + RayClass.Modulus.congruenceSubgroup + (RayClass.rationalModulus m) := by + dsimp only + let : NeZero m := ⟨hm⟩ + let mp : ℕ+ := ⟨m, Nat.pos_of_ne_zero hm⟩ + let L := KummerTheory.rationalCyclotomicLevel mp + let : IsCyclotomicExtension {m} ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, Nat.pos_of_ne_zero hm⟩) := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨m, Nat.pos_of_ne_zero hm⟩ + let H := + RayClass.Modulus.congruenceSubgroup + (RayClass.rationalModulus m) + let N := + (_root_.ideleClassNorm ℚ L).range + have hHN : H ≤ N := by + simpa only [H, N, L, mp] using + rationalCongruenceSubgroup_le_rationalCyclotomicLevelIdeleClassNormRange + m hm + have hindex : H.index = N.index := by + calc + H.index = + Nat.card + (IdeleClassGroup ℚ ⧸ + RayClass.Modulus.congruenceSubgroup + (RayClass.rationalModulus m)) := by + rw [Subgroup.index_eq_card] + _ = m.totient := + KroneckerWeber.rationalRayClassFieldQuotient_card_eq_totient m hm + _ = Module.finrank ℚ L := by + simpa only [L, mp] using + (IsCyclotomicExtension.Rat.finrank m L).symm + _ = N.index := by + simpa only [N] using + (ideleClassNorm_index_eq_finrank_abelian ℚ L).symm + apply le_antisymm + · by_contra hNH + have hne : H ≠ N := by + intro hEq + exact hNH hEq.symm.le + have hstrict : H < N := + lt_of_le_of_ne hHN hne + have hindexStrict := + Subgroup.index_strictAnti hstrict + rw [hindex] at hindexStrict + exact (Nat.lt_irrefl _ hindexStrict) + · exact hHN + +open scoped Classical in +/-- The standard cyclotomic field `CyclotomicField m ℚ` has the same +actual idèle-class norm range, namely the rational ray congruence subgroup +modulo `(m)`. -/ +theorem + rationalCyclotomicField_ideleClassNorm_range_eq_rationalCongruenceSubgroup + (m : ℕ) (hm : m ≠ 0) : + (_root_.ideleClassNorm ℚ + (CyclotomicField m ℚ)).range = + RayClass.Modulus.congruenceSubgroup + (RayClass.rationalModulus m) := by + let mp : ℕ+ := ⟨m, Nat.pos_of_ne_zero hm⟩ + let L := KummerTheory.rationalCyclotomicLevel mp + let C := CyclotomicField m ℚ + let : NeZero m := ⟨hm⟩ + let : IsCyclotomicExtension {m} ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, Nat.pos_of_ne_zero hm⟩) := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨m, Nat.pos_of_ne_zero hm⟩ + let : IsCyclotomicExtension {m} ℚ C := + CyclotomicField.isCyclotomicExtension m ℚ + let e : L ≃ₐ[ℚ] C := + IsCyclotomicExtension.algEquiv {m} ℚ L C + calc + (_root_.ideleClassNorm ℚ C).range = + (_root_.ideleClassNorm ℚ L).range := by + simpa only [ordinaryIdeleClassNorm_range_eq_relative] using + (ideleClassNorm_range_algEquiv + (K := ℚ) e) + _ = + RayClass.Modulus.congruenceSubgroup + (RayClass.rationalModulus m) := by + simpa only [L, mp] using + rationalCyclotomicLevel_ideleClassNorm_range_eq_rationalCongruenceSubgroup + m hm + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicZHatRigidity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicZHatRigidity.lean new file mode 100644 index 0000000000..d6d4e175e2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicZHatRigidity.lean @@ -0,0 +1,94 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicPrincipalIdele +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicCharacterRigidity +/-! +# Prime-power detection for the rational cyclotomic `ZHat`-Artin map + +Prime-power reductions of the genuine cyclotomic character detect the +full rational cyclotomic automorphism. Restricting that automorphism +through actual finite cyclotomic levels then detects every finite +coordinate of the rational cyclotomic `ZHat`-extension. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative +open NumberField ClassFormation + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open scoped Classical in +/-- The prime subtype supplies the primality instance used at this local factor. -/ +local instance rationalCyclotomicZHatRigidityPrimeFact (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +attribute [local instance] rationalCyclotomicZHatRigidityPrimeFact + +open scoped Classical in +/-- If all prime-power character reductions of the full cyclotomic +global Artin symbol have square one, then the corresponding Artin symbol +in the actual rational `ZHat`-extension has square one. -/ +theorem + rationalCyclotomicZHatGlobalArtin_sq_eq_one_of_character_reductions + (a : IdeleGroup ℚ) + (h : + ∀ (p : Nat.Primes) (k : ℕ), + Units.map (PadicInt.toZModPow k).toMonoidHom + (KummerTheory.rationalCyclotomicCharacterPrimeProduct + (infiniteGlobalArtinMonoidHom + ℚ KummerTheory.rationalCyclotomicField a) p) ^ 2 = + 1) : + rationalCyclotomicZHatGlobalArtin a ^ 2 = 1 := by + let σ : + KummerTheory.rationalCyclotomicField ≃ₐ[ℚ] + KummerTheory.rationalCyclotomicField := + infiniteGlobalArtinMonoidHom + ℚ KummerTheory.rationalCyclotomicField a + have hσ : σ ^ 2 = 1 := + rationalCyclotomicAutomorphism_sq_eq_one_of_character_reductions + σ h + rw [rationalCyclotomicZHatGlobalArtin_eq_fullRestriction] + change (rationalCyclotomicFullRestrictionToZHat σ) ^ 2 = 1 + rw [← map_pow, hσ, map_one] +open scoped Classical in +/-- Prime-power square-one identities force the rational cyclotomic +idele value itself to be trivial. Torsion-freeness of `ZHat` removes +the residual order-two ambiguity. -/ +theorem + rationalCyclotomicZHatIdeleValue_eq_one_of_character_reductions + (a : IdeleGroup ℚ) + (h : + ∀ (p : Nat.Primes) (k : ℕ), + Units.map (PadicInt.toZModPow k).toMonoidHom + (KummerTheory.rationalCyclotomicCharacterPrimeProduct + (infiniteGlobalArtinMonoidHom + ℚ KummerTheory.rationalCyclotomicField a) p) ^ 2 = + 1) : + rationalCyclotomicZHatIdeleValue a = 1 := by + have hArtin : + rationalCyclotomicZHatGlobalArtin a ^ 2 = 1 := + rationalCyclotomicZHatGlobalArtin_sq_eq_one_of_character_reductions + a h + have hValue : + rationalCyclotomicZHatIdeleValue a ^ 2 = 1 := by + rw [rationalCyclotomicZHatIdeleValue_apply, + ← map_pow, hArtin, map_one] + exact + (pow_left_injective + (M := Multiplicative ZHat) + (n := 2) (by norm_num)) + (by simpa using hValue) + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrimeFactorization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrimeFactorization.lean new file mode 100644 index 0000000000..96e97e4d05 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrimeFactorization.lean @@ -0,0 +1,810 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational +/-! +# Prime factorization of a nonzero rational number + +This file records the elementary rational factorization needed for the +principal-idele calculation over `ℚ`. At a fixed rational prime `p`, removing +the `p`-power from `x : ℚˣ` leaves the sign of `x` times the finite product of +the powers of all primes different from `p`. + +The last declarations package rational `p`-adic units as units of `ℤ_[p]` and +identify the reduction of a natural unit modulo `p ^ k`. +-/ + +@[expose] public section + +open scoped BigOperators +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open scoped Classical in +/-- The prime subtype supplies the primality instance used at this local factor. -/ +local instance rationalPrimeFactorizationPrimeFact (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +attribute [local instance] rationalPrimeFactorizationPrimeFact + +open scoped Classical in +/-- A finite set containing every prime occurring in the numerator or +denominator of `x`, as well as the distinguished prime `p`. -/ +def rationalPrimeFactorizationSupport + (x : ℚˣ) (p : Nat.Primes) : Finset ℕ := + (Finset.range + (max (max (x : ℚ).num.natAbs (x : ℚ).den) p.1 + 1)).filter + Nat.Prime + +open scoped Classical in +theorem mem_rationalPrimeFactorizationSupport + (x : ℚˣ) (p : Nat.Primes) : + p.1 ∈ rationalPrimeFactorizationSupport x p := by + rw [rationalPrimeFactorizationSupport, Finset.mem_filter, + Finset.mem_range] + exact + ⟨Nat.lt_succ_of_le + (le_max_right + (max (x : ℚ).num.natAbs (x : ℚ).den) p.1), + p.2⟩ + +open scoped Classical in +/-- The rational `p`-adic unit part of `x`: multiply `x` by the inverse of +its `p`-power. -/ +def rationalPrimeUnit (x : ℚˣ) (p : Nat.Primes) : ℚˣ := + (Units.mk0 (p.1 : ℚ) (by exact_mod_cast p.2.ne_zero)) ^ + (-padicValRat p.1 (x : ℚ)) * x + +open scoped Classical in +@[simp] +theorem rationalPrimeUnit_val (x : ℚˣ) (p : Nat.Primes) : + (rationalPrimeUnit x p : ℚ) = + (p.1 : ℚ) ^ (-padicValRat p.1 (x : ℚ)) * (x : ℚ) := by + simp [rationalPrimeUnit] + +open scoped Classical in +/-- Removing the `p`-power from a nonzero rational number leaves +`p`-adic valuation zero. -/ +theorem padicValRat_rationalPrimeUnit + (x : ℚˣ) (p : Nat.Primes) : + padicValRat p.1 (rationalPrimeUnit x p : ℚ) = 0 := by + have hp0 : (p.1 : ℚ) ≠ 0 := by + exact_mod_cast p.2.ne_zero + have hpow0 : + (p.1 : ℚ) ^ (-padicValRat p.1 (x : ℚ)) ≠ 0 := + zpow_ne_zero _ hp0 + rw [rationalPrimeUnit_val, + padicValRat.mul hpow0 x.ne_zero, + padicValRat.zpow, + padicValRat.self p.2.one_lt] + ring + +open scoped Classical in +/-- The ordinary prime factorization of a nonzero rational number, over the +finite support chosen by `rationalPrimeFactorizationSupport`. -/ +theorem rational_factorization_over_support + (x : ℚˣ) (p : Nat.Primes) : + (x : ℚ) = + (((x : ℚ).num.sign : ℤ) : ℚ) * + ∏ q ∈ rationalPrimeFactorizationSupport x p, + (q : ℚ) ^ padicValRat q (x : ℚ) := by + let r : ℚ := x + let B : ℕ := max (max r.num.natAbs r.den) p.1 + 1 + let s : Finset ℕ := (Finset.range B).filter Nat.Prime + have hsupport : + rationalPrimeFactorizationSupport x p = s := by + rfl + have hnum0 : r.num.natAbs ≠ 0 := + Int.natAbs_ne_zero.mpr + (Rat.num_ne_zero.mpr x.ne_zero) + have hden0 : r.den ≠ 0 := + r.den_ne_zero + have hnum_lt : r.num.natAbs < B := by + exact + Nat.lt_succ_of_le + (le_trans + (le_max_left r.num.natAbs r.den) + (le_max_left (max r.num.natAbs r.den) p.1)) + have hden_lt : r.den < B := by + exact + Nat.lt_succ_of_le + (le_trans + (le_max_right r.num.natAbs r.den) + (le_max_left (max r.num.natAbs r.den) p.1)) + have hnumNat := + Nat.prod_pow_prime_padicValNat + r.num.natAbs hnum0 B hnum_lt + have hdenNat := + Nat.prod_pow_prime_padicValNat + r.den hden0 B hden_lt + have hnum : + (∏ q ∈ s, + (q : ℚ) ^ padicValNat q r.num.natAbs) = + (r.num.natAbs : ℚ) := by + norm_cast + have hden : + (∏ q ∈ s, + (q : ℚ) ^ padicValNat q r.den) = + (r.den : ℚ) := by + norm_cast + have hsign : + (r.num : ℚ) = + (((r.num.sign : ℤ) : ℚ)) * (r.num.natAbs : ℚ) := by + have hsignInt : + r.num.sign * (r.num.natAbs : ℤ) = r.num := + Int.sign_mul_natAbs r.num + calc + (r.num : ℚ) = + ((r.num.sign * (r.num.natAbs : ℤ) : ℤ) : ℚ) := + congrArg (fun z : ℤ => (z : ℚ)) hsignInt.symm + _ = + (((r.num.sign : ℤ) : ℚ)) * (r.num.natAbs : ℚ) := by + norm_num + have hprod : + (∏ q ∈ s, (q : ℚ) ^ padicValRat q r) = + (r.num.natAbs : ℚ) / (r.den : ℚ) := by + calc + (∏ q ∈ s, (q : ℚ) ^ padicValRat q r) = + ∏ q ∈ s, + (q : ℚ) ^ padicValNat q r.num.natAbs / + (q : ℚ) ^ padicValNat q r.den := by + apply Finset.prod_congr rfl + intro q hq + have hqprime : q.Prime := + (Finset.mem_filter.mp hq).2 + rw [padicValRat_def, padicValInt, + zpow_sub₀ (by exact_mod_cast hqprime.ne_zero), + zpow_natCast, zpow_natCast] + _ = + (∏ q ∈ s, + (q : ℚ) ^ padicValNat q r.num.natAbs) / + ∏ q ∈ s, + (q : ℚ) ^ padicValNat q r.den := by + rw [Finset.prod_div_distrib] + _ = (r.num.natAbs : ℚ) / (r.den : ℚ) := by + rw [hnum, hden] + rw [hsupport] + calc + (x : ℚ) = (r.num : ℚ) / (r.den : ℚ) := by + simpa only [r] using r.num_div_den.symm + _ = + (((r.num.sign : ℤ) : ℚ)) * + ((r.num.natAbs : ℚ) / (r.den : ℚ)) := by + rw [hsign, mul_div_assoc] + _ = + (((r.num.sign : ℤ) : ℚ)) * + ∏ q ∈ s, (q : ℚ) ^ padicValRat q r := by + rw [hprod] + _ = + ((((x : ℚ).num.sign : ℤ) : ℚ)) * + ∏ q ∈ s, (q : ℚ) ^ padicValRat q (x : ℚ) := by + rfl + +open scoped Classical in +/-- The `p`-adic unit part of `x` is its sign times the finite product of +`q ^ padicValRat q x` over the primes `q ≠ p`. -/ +theorem rationalPrimeUnit_factorization + (x : ℚˣ) (p : Nat.Primes) : + (rationalPrimeUnit x p : ℚ) = + (((x : ℚ).num.sign : ℤ) : ℚ) * + ∏ q ∈ (rationalPrimeFactorizationSupport x p).erase p.1, + (q : ℚ) ^ padicValRat q (x : ℚ) := by + let s := rationalPrimeFactorizationSupport x p + let f : ℕ → ℚ := + fun q => (q : ℚ) ^ padicValRat q (x : ℚ) + have hp_mem : p.1 ∈ s := + mem_rationalPrimeFactorizationSupport x p + have hsplit : + f p.1 * ∏ q ∈ s.erase p.1, f q = + ∏ q ∈ s, f q := + Finset.mul_prod_erase s f hp_mem + have hfactor : + (x : ℚ) = + (((x : ℚ).num.sign : ℤ) : ℚ) * + ∏ q ∈ s, f q := by + simpa only [s, f] using + rational_factorization_over_support x p + have hp0 : (p.1 : ℚ) ≠ 0 := by + exact_mod_cast p.2.ne_zero + rw [rationalPrimeUnit_val] + calc + (p.1 : ℚ) ^ (-padicValRat p.1 (x : ℚ)) * (x : ℚ) = + (p.1 : ℚ) ^ (-padicValRat p.1 (x : ℚ)) * + ((((x : ℚ).num.sign : ℤ) : ℚ) * + ∏ q ∈ s, f q) := + congrArg + (fun y : ℚ => + (p.1 : ℚ) ^ (-padicValRat p.1 (x : ℚ)) * y) + hfactor + _ = + (p.1 : ℚ) ^ (-padicValRat p.1 (x : ℚ)) * + ((((x : ℚ).num.sign : ℤ) : ℚ) * + (f p.1 * ∏ q ∈ s.erase p.1, f q)) := by + rw [hsplit] + _ = + (((x : ℚ).num.sign : ℤ) : ℚ) * + (((p.1 : ℚ) ^ (-padicValRat p.1 (x : ℚ)) * + (p.1 : ℚ) ^ padicValRat p.1 (x : ℚ)) * + ∏ q ∈ s.erase p.1, f q) := by + dsimp only [f] + ring + _ = + (((x : ℚ).num.sign : ℤ) : ℚ) * + ∏ q ∈ s.erase p.1, f q := by + rw [← zpow_add₀ hp0, neg_add_cancel, zpow_zero, one_mul] + _ = + (((x : ℚ).num.sign : ℤ) : ℚ) * + ∏ q ∈ + (rationalPrimeFactorizationSupport x p).erase p.1, + (q : ℚ) ^ padicValRat q (x : ℚ) := by + rfl + +open scoped Classical in +/-- A nonzero rational number of `p`-adic valuation zero, regarded as a +unit of the `p`-adic integers. -/ +def padicIntUnitOfRat + (p : Nat.Primes) (y : ℚ) + (hy : y ≠ 0) (hval : padicValRat p.1 y = 0) : + ℤ_[p.1]ˣ := + PadicInt.mkUnits (u := (y : ℚ_[p.1])) (by + rw [Padic.eq_padicNorm, + padicNorm.eq_zpow_of_nonzero hy, hval] + simp) + +open scoped Classical in +/-- The underlying `p`-adic number of `padicIntUnitOfRat` is the original +rational number. -/ +@[simp] +theorem padicIntUnitOfRat_coe + (p : Nat.Primes) (y : ℚ) + (hy : y ≠ 0) (hval : padicValRat p.1 y = 0) : + (((padicIntUnitOfRat p y hy hval : ℤ_[p.1]) : ℚ_[p.1])) = + (y : ℚ_[p.1]) := by + exact PadicInt.mkUnits_eq _ + +open scoped Classical in +/-- The sign of a nonzero rational numerator is a unit at every finite +prime. -/ +theorem padicValRat_rational_num_sign + (x : ℚˣ) (p : Nat.Primes) : + padicValRat p.1 ((((x : ℚ).num.sign : ℤ) : ℚ)) = 0 := by + have hnum : (x : ℚ).num ≠ 0 := + Rat.num_ne_zero.mpr x.ne_zero + rcases lt_or_gt_of_ne hnum with hneg | hpos + · have hsign : (x : ℚ).num.sign = -1 := by + rw [Int.sign_eq_sign, sign_neg hneg] + rfl + rw [hsign] + simp + · have hsign : (x : ℚ).num.sign = 1 := by + rw [Int.sign_eq_sign, sign_pos hpos] + rfl + rw [hsign] + simp + +open scoped Classical in +/-- The actual sign of `x`, regarded as a unit of the `p`-adic integers. -/ +def rationalSignPadicUnit + (x : ℚˣ) (p : Nat.Primes) : ℤ_[p.1]ˣ := + padicIntUnitOfRat p ((((x : ℚ).num.sign : ℤ) : ℚ)) + (by + exact_mod_cast + (Int.sign_eq_zero_iff_zero.not.mpr + (Rat.num_ne_zero.mpr x.ne_zero))) + (padicValRat_rational_num_sign x p) + +open scoped Classical in +/-- The underlying `p`-adic number of `rationalSignPadicUnit` is the sign of +the rational numerator. -/ +theorem rationalSignPadicUnit_coe + (x : ℚˣ) (p : Nat.Primes) : + (((rationalSignPadicUnit x p : ℤ_[p.1]) : ℚ_[p.1])) = + (((((x : ℚ).num.sign : ℤ) : ℚ) : ℚ_[p.1])) := by + exact padicIntUnitOfRat_coe _ _ _ _ + +open scoped Classical in +/-- The value in `ℤ_[p]` of `rationalSignPadicUnit` is the integer sign. -/ +@[simp] +theorem rationalSignPadicUnit_val + (x : ℚˣ) (p : Nat.Primes) : + (rationalSignPadicUnit x p : ℤ_[p.1]) = + ((x : ℚ).num.sign : ℤ) := by + apply Subtype.ext + simp only [rationalSignPadicUnit_coe, PadicInt.coe_intCast, + Rat.cast_intCast] + +open scoped Classical in +/-- The rational sign unit has square one. -/ +@[simp] +theorem rationalSignPadicUnit_sq + (x : ℚˣ) (p : Nat.Primes) : + rationalSignPadicUnit x p ^ 2 = 1 := by + apply Units.ext + change (rationalSignPadicUnit x p : ℤ_[p.1]) ^ 2 = 1 + rw [rationalSignPadicUnit_val] + have hnum : (x : ℚ).num ≠ 0 := + Rat.num_ne_zero.mpr x.ne_zero + rcases lt_or_gt_of_ne hnum with hneg | hpos + · have hsign : (x : ℚ).num.sign = -1 := by + rw [Int.sign_eq_sign, sign_neg hneg] + rfl + rw [hsign] + simp + · have hsign : (x : ℚ).num.sign = 1 := by + rw [Int.sign_eq_sign, sign_pos hpos] + rfl + rw [hsign] + simp + +open scoped Classical in +/-- Reduction of the rational sign unit modulo `p ^ k` has the expected +integer value. -/ +theorem rationalSignPadicUnit_toZModPow_val + (x : ℚˣ) (p : Nat.Primes) (k : ℕ) : + ((Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p) : + (ZMod (p.1 ^ k))ˣ) : ZMod (p.1 ^ k)) = + ((x : ℚ).num.sign : ℤ) := by + change + PadicInt.toZModPow k + (rationalSignPadicUnit x p : ℤ_[p.1]) = + ((x : ℚ).num.sign : ℤ) + rw [rationalSignPadicUnit_val] + simp + +open scoped Classical in +/-- Reduction of the rational sign unit still has square one. -/ +theorem rationalSignPadicUnit_toZModPow_sq + (x : ℚˣ) (p : Nat.Primes) (k : ℕ) : + Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p) ^ 2 = + 1 := by + rw [← map_pow, rationalSignPadicUnit_sq, map_one] + +open scoped Classical in +/-- A natural number prime to `p`, regarded as a unit of `ℤ_[p]`. -/ +def padicNatUnit + (p : Nat.Primes) (q : ℕ) (h : p.1.Coprime q) : + ℤ_[p.1]ˣ := + PadicInt.mkUnits + (u := (((q : ℤ_[p.1]) : ℚ_[p.1]))) + (by + simpa using + (PadicInt.norm_natCast_eq_one_iff (p := p.1)).2 h) + +open scoped Classical in +@[simp] +theorem padicNatUnit_val + (p : Nat.Primes) (q : ℕ) (h : p.1.Coprime q) : + (padicNatUnit p q h : ℤ_[p.1]) = q := by + apply Subtype.ext + rfl + +open scoped Classical in +/-- Reducing the canonical `p`-adic unit attached to `q` modulo `p ^ k` +gives the canonical unit represented by `q` in `ZMod (p ^ k)`. -/ +theorem padicNatUnit_toZModPow + (p : Nat.Primes) (q k : ℕ) (h : p.1.Coprime q) : + Units.map (PadicInt.toZModPow k).toMonoidHom + (padicNatUnit p q h) = + ZMod.unitOfCoprime q (h.symm.pow_right k) := by + apply Units.ext + simp + +open scoped Classical in +/-- The successor of `p` is a `p`-adic unit. -/ +theorem padicValRat_rationalPrime_succ + (p : Nat.Primes) : + padicValRat p.1 (((p.1 + 1 : ℕ) : ℚ)) = 0 := by + have hnot : + ¬ p.1 ∣ p.1 + 1 := + p.2.coprime_iff_not_dvd.mp + (Nat.coprime_self_add_right.mpr + (Nat.coprime_one_right p.1)) + rw [padicValRat.of_nat, + padicValNat.eq_zero_of_not_dvd hnot] + norm_num + +open scoped Classical in +/-- A positive natural number greater than one, prime to `p`, gives a +genuine non-torsion unit of `ℤ_[p]`. -/ +theorem padicNatUnit_not_isOfFinOrder_of_one_lt + (p : Nat.Primes) (n : ℕ) + (hcoprime : p.1.Coprime n) + (hn : 1 < n) : + ¬ IsOfFinOrder (padicNatUnit p n hcoprime) := by + intro hfinite + obtain ⟨k, hk, hpow⟩ := + isOfFinOrder_iff_pow_eq_one.mp hfinite + have hval := + congrArg + (fun z : ℤ_[p.1]ˣ => (z : ℤ_[p.1])) + hpow + have hnat : n ^ k = 1 := by + rw [Units.val_pow_eq_pow_val, + padicNatUnit_val] at hval + simp at hval + apply Nat.cast_injective (R := ℤ_[p.1]) + simpa only [Nat.cast_pow, Nat.cast_one] using hval + exact + (Nat.ne_of_gt + (Nat.one_lt_pow hk.ne' hn)) hnat + +open scoped Classical in +/-- Every member of the rational factorization support is prime. -/ +theorem prime_of_mem_rationalPrimeFactorizationSupport + (x : ℚˣ) (p : Nat.Primes) {q : ℕ} + (hq : q ∈ rationalPrimeFactorizationSupport x p) : + q.Prime := + (Finset.mem_filter.mp hq).2 + +open scoped Classical in +/-- The canonical embedding of the natural-number factorization support +into the type of natural primes. -/ +def rationalPrimeFactorizationSupportEmbedding + (x : ℚˣ) (p : Nat.Primes) : + ↥(rationalPrimeFactorizationSupport x p) ↪ Nat.Primes where + toFun q := + ⟨q.1, + prime_of_mem_rationalPrimeFactorizationSupport + x p q.2⟩ + inj' q r h := by + apply Subtype.ext + exact + congrArg (fun z : Nat.Primes => (z : ℕ)) h + +open scoped Classical in +/-- The factorization support as an actual finite set of `Nat.Primes`. -/ +def rationalPrimeFactorizationPrimeSupport + (x : ℚˣ) (p : Nat.Primes) : Finset Nat.Primes := + Finset.univ.map + (rationalPrimeFactorizationSupportEmbedding x p) + +open scoped Classical in +/-- Membership in the prime-valued support is exactly membership of the +underlying natural number in the original support. -/ +@[simp] +theorem mem_rationalPrimeFactorizationPrimeSupport_iff + (x : ℚˣ) (p : Nat.Primes) (q : Nat.Primes) : + q ∈ rationalPrimeFactorizationPrimeSupport x p ↔ + q.1 ∈ rationalPrimeFactorizationSupport x p := by + constructor + · intro hq + obtain ⟨r, -, hr⟩ := + Finset.mem_map.mp hq + rw [← hr] + exact r.2 + · intro hq + apply Finset.mem_map.mpr + refine + ⟨⟨q.1, hq⟩, + Finset.mem_univ _, + ?_⟩ + apply Subtype.ext + rfl + +open scoped Classical in +/-- The distinguished prime belongs to the prime-valued support. -/ +theorem mem_rationalPrimeFactorizationPrimeSupport + (x : ℚˣ) (p : Nat.Primes) : + p ∈ rationalPrimeFactorizationPrimeSupport x p := + (mem_rationalPrimeFactorizationPrimeSupport_iff x p p).2 + (mem_rationalPrimeFactorizationSupport x p) + +open scoped Classical in +/-- Erasing `p` commutes with passing from natural-number support to +prime-valued support. -/ +theorem mem_rationalPrimeFactorizationPrimeSupport_erase_iff + (x : ℚˣ) (p q : Nat.Primes) : + q ∈ (rationalPrimeFactorizationPrimeSupport x p).erase p ↔ + q.1 ∈ (rationalPrimeFactorizationSupport x p).erase p.1 := by + rw [Finset.mem_erase, Finset.mem_erase] + constructor + · rintro ⟨hqp, hq⟩ + exact + ⟨fun hval => hqp (Subtype.ext hval), + (mem_rationalPrimeFactorizationPrimeSupport_iff + x p q).1 hq⟩ + · rintro ⟨hval, hq⟩ + exact + ⟨fun hqp => hval (congrArg Subtype.val hqp), + (mem_rationalPrimeFactorizationPrimeSupport_iff + x p q).2 hq⟩ + +open scoped Classical in +/-- The canonical prime associated with an element of the erased natural +support. -/ +def rationalPrimeOfMemFactorizationSupportErase + (x : ℚˣ) (p : Nat.Primes) + (q : ↥((rationalPrimeFactorizationSupport x p).erase p.1)) : + Nat.Primes := + ⟨q.1, + prime_of_mem_rationalPrimeFactorizationSupport + x p (Finset.mem_of_mem_erase q.2)⟩ + +open scoped Classical in +/-- The erased natural support and the erased prime-valued support have +canonically equivalent element types. -/ +def rationalPrimeFactorizationSupportEraseEquiv + (x : ℚˣ) (p : Nat.Primes) : + ↥((rationalPrimeFactorizationSupport x p).erase p.1) ≃ + ↥((rationalPrimeFactorizationPrimeSupport x p).erase p) where + toFun q := + ⟨rationalPrimeOfMemFactorizationSupportErase x p q, + (mem_rationalPrimeFactorizationPrimeSupport_erase_iff + x p _).2 q.2⟩ + invFun q := + ⟨q.1.1, + (mem_rationalPrimeFactorizationPrimeSupport_erase_iff + x p q.1).1 q.2⟩ + left_inv q := by + apply Subtype.ext + rfl + right_inv q := by + apply Subtype.ext + apply Subtype.ext + rfl + +open scoped Classical in +/-- A prime in the support with `p` erased is coprime to `p`. -/ +theorem coprime_of_mem_rationalPrimeFactorizationSupport_erase + (x : ℚˣ) (p : Nat.Primes) {q : ℕ} + (hq : + q ∈ (rationalPrimeFactorizationSupport x p).erase p.1) : + p.1.Coprime q := by + have hqprime : + q.Prime := + prime_of_mem_rationalPrimeFactorizationSupport x p + (Finset.mem_of_mem_erase hq) + exact + (Nat.coprime_primes p.2 hqprime).2 + (Finset.ne_of_mem_erase hq).symm + +open scoped Classical in +/-- The rational prime-unit factorization, lifted from `ℚ` to an exact +identity of units of `ℤ_[p]`. -/ +theorem padicIntUnitOfRat_rationalPrimeUnit_factorization + (x : ℚˣ) (p : Nat.Primes) : + padicIntUnitOfRat p (rationalPrimeUnit x p : ℚ) + (rationalPrimeUnit x p).ne_zero + (padicValRat_rationalPrimeUnit x p) = + rationalSignPadicUnit x p * + ∏ q : + ↥((rationalPrimeFactorizationSupport x p).erase p.1), + (padicNatUnit p q.1 + (coprime_of_mem_rationalPrimeFactorizationSupport_erase + x p q.2)) ^ + padicValRat q.1 (x : ℚ) := by + let : Fact p.1.Prime := ⟨p.2⟩ + have hQ := + congrArg (algebraMap ℚ ℚ_[p.1]) + (rationalPrimeUnit_factorization x p) + let ι := PadicInt.Coe.ringHom (p := p.1) + have hι_apply (z : ℤ_[p.1]) : + ι z = (z : ℚ_[p.1]) := rfl + have hι : Function.Injective ι := + fun _ _ h => PadicInt.ext h + have hprod : + (∏ q : + ↥((rationalPrimeFactorizationSupport x p).erase p.1), + ι + (((padicNatUnit p q.1 + (coprime_of_mem_rationalPrimeFactorizationSupport_erase + x p q.2)) ^ + padicValRat q.1 (x : ℚ) : ℤ_[p.1]ˣ) : ℤ_[p.1])) = + ∏ q ∈ (rationalPrimeFactorizationSupport x p).erase p.1, + (q : ℚ_[p.1]) ^ padicValRat q (x : ℚ) := by + calc + _ = + ∏ q : + ↥((rationalPrimeFactorizationSupport x p).erase p.1), + (q.1 : ℚ_[p.1]) ^ padicValRat q.1 (x : ℚ) := by + apply Finset.prod_congr rfl + intro q _ + let u : ℤ_[p.1]ˣ := + padicNatUnit p q.1 + (coprime_of_mem_rationalPrimeFactorizationSupport_erase + x p q.2) + let n : ℤ := padicValRat q.1 (x : ℚ) + have hu : (u : ℤ_[p.1]) = q.1 := by + dsimp only [u] + exact + padicNatUnit_val p q.1 + (coprime_of_mem_rationalPrimeFactorizationSupport_erase + x p q.2) + have huQ : ((u : ℤ_[p.1]) : ℚ_[p.1]) = (q.1 : ℚ_[p.1]) := by + simpa only [PadicInt.coe_natCast] using + congrArg (fun z : ℤ_[p.1] => (z : ℚ_[p.1])) hu + let U : ℤ_[p.1]ˣ →* ℚ_[p.1]ˣ := + Units.map ι.toMonoidHom + have hUQ : ((U u : ℚ_[p.1]ˣ) : ℚ_[p.1]) = + (q.1 : ℚ_[p.1]) := by + change ι (u : ℤ_[p.1]) = (q.1 : ℚ_[p.1]) + simpa only [hι_apply] using huQ + change + ((((u ^ n : ℤ_[p.1]ˣ) : ℤ_[p.1]) : ℚ_[p.1])) = + (q.1 : ℚ_[p.1]) ^ n + calc + _ = ((U (u ^ n) : ℚ_[p.1]ˣ) : ℚ_[p.1]) := rfl + _ = (((U u) ^ n : ℚ_[p.1]ˣ) : ℚ_[p.1]) := + congrArg (fun v : ℚ_[p.1]ˣ => (v : ℚ_[p.1])) + (map_zpow U u n) + _ = ((U u : ℚ_[p.1]ˣ) : ℚ_[p.1]) ^ n := + Units.val_zpow_eq_zpow_val (U u) n + _ = _ := congrArg (fun z : ℚ_[p.1] => z ^ n) hUQ + _ = _ := + Finset.prod_coe_sort + ((rationalPrimeFactorizationSupport x p).erase p.1) + (fun q : ℕ => + (q : ℚ_[p.1]) ^ padicValRat q (x : ℚ)) + apply Units.ext + apply hι + rw [Units.val_mul, Units.coe_prod] + change + ι + (padicIntUnitOfRat p (rationalPrimeUnit x p : ℚ) + (rationalPrimeUnit x p).ne_zero + (padicValRat_rationalPrimeUnit x p) : ℤ_[p.1]) = + ι + ((rationalSignPadicUnit x p : ℤ_[p.1]) * + ∏ q : + ↥((rationalPrimeFactorizationSupport x p).erase p.1), + (((padicNatUnit p q.1 + (coprime_of_mem_rationalPrimeFactorizationSupport_erase + x p q.2)) ^ + padicValRat q.1 (x : ℚ) : ℤ_[p.1]ˣ) : ℤ_[p.1])) + rw [map_mul, map_prod] + rw [hprod] + simp only [hι_apply, padicIntUnitOfRat_coe, + rationalSignPadicUnit_coe] + change + (algebraMap ℚ ℚ_[p.1]) (rationalPrimeUnit x p : ℚ) = + (algebraMap ℚ ℚ_[p.1]) + (((x : ℚ).num.sign : ℤ) : ℚ) * + ∏ q ∈ (rationalPrimeFactorizationSupport x p).erase p.1, + (q : ℚ_[p.1]) ^ padicValRat q (x : ℚ) + simpa only [map_mul, map_prod, map_zpow₀, + map_natCast] using hQ + +open scoped Classical in +/-- The rational prime-unit factorization after reduction modulo `p ^ k`. -/ +theorem padicIntUnitOfRat_rationalPrimeUnit_toZModPow + (x : ℚˣ) (p : Nat.Primes) (k : ℕ) : + Units.map (PadicInt.toZModPow k).toMonoidHom + (padicIntUnitOfRat p (rationalPrimeUnit x p : ℚ) + (rationalPrimeUnit x p).ne_zero + (padicValRat_rationalPrimeUnit x p)) = + Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p) * + ∏ q : + ↥((rationalPrimeFactorizationSupport x p).erase p.1), + (ZMod.unitOfCoprime q.1 + ((coprime_of_mem_rationalPrimeFactorizationSupport_erase + x p q.2).symm.pow_right k)) ^ + padicValRat q.1 (x : ℚ) := by + have h := + congrArg + (Units.map (PadicInt.toZModPow k).toMonoidHom) + (padicIntUnitOfRat_rationalPrimeUnit_factorization x p) + simpa only [map_mul, map_prod, map_zpow, + padicNatUnit_toZModPow] using h + +open scoped Classical in +/-- Multiplying the reduced rational prime-unit by the inverse powers of all +prime factors away from `p` recovers the reduced sign. -/ +theorem padicIntUnitOfRat_rationalPrimeUnit_mul_inverseFactors_toZModPow + (x : ℚˣ) (p : Nat.Primes) (k : ℕ) : + Units.map (PadicInt.toZModPow k).toMonoidHom + (padicIntUnitOfRat p (rationalPrimeUnit x p : ℚ) + (rationalPrimeUnit x p).ne_zero + (padicValRat_rationalPrimeUnit x p)) * + ∏ q : + ↥((rationalPrimeFactorizationSupport x p).erase p.1), + (ZMod.unitOfCoprime q.1 + ((coprime_of_mem_rationalPrimeFactorizationSupport_erase + x p q.2).symm.pow_right k)) ^ + (-padicValRat q.1 (x : ℚ)) = + Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p) := by + rw [padicIntUnitOfRat_rationalPrimeUnit_toZModPow] + rw [mul_assoc, ← Finset.prod_mul_distrib] + simp + +open scoped Classical in +/-- Prime-valued support form of the reduced rational product formula. +The direct `p`-adic unit factor times all inverse away-from-`p` factors +is the reduced rational sign. -/ +theorem + padicIntUnitOfRat_rationalPrimeUnit_mul_primeSupportInverseFactors_toZModPow + (x : ℚˣ) (p : Nat.Primes) (k : ℕ) : + Units.map (PadicInt.toZModPow k).toMonoidHom + (padicIntUnitOfRat p (rationalPrimeUnit x p : ℚ) + (rationalPrimeUnit x p).ne_zero + (padicValRat_rationalPrimeUnit x p)) * + ∏ q : + ↥((rationalPrimeFactorizationPrimeSupport x p).erase p), + (ZMod.unitOfCoprime q.1.1 + ((coprime_of_mem_rationalPrimeFactorizationSupport_erase + x p + ((mem_rationalPrimeFactorizationPrimeSupport_erase_iff + x p q.1).1 q.2)).symm.pow_right k)) ^ + (-padicValRat q.1.1 (x : ℚ)) = + Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p) := by + have hprod : + (∏ q : + ↥((rationalPrimeFactorizationPrimeSupport x p).erase p), + (ZMod.unitOfCoprime q.1.1 + ((coprime_of_mem_rationalPrimeFactorizationSupport_erase + x p + ((mem_rationalPrimeFactorizationPrimeSupport_erase_iff + x p q.1).1 q.2)).symm.pow_right k)) ^ + (-padicValRat q.1.1 (x : ℚ))) = + ∏ q : + ↥((rationalPrimeFactorizationSupport x p).erase p.1), + (ZMod.unitOfCoprime q.1 + ((coprime_of_mem_rationalPrimeFactorizationSupport_erase + x p q.2).symm.pow_right k)) ^ + (-padicValRat q.1 (x : ℚ)) := by + refine + Fintype.prod_equiv + (rationalPrimeFactorizationSupportEraseEquiv x p).symm + _ _ ?_ + intro q + rfl + rw [hprod] + exact + padicIntUnitOfRat_rationalPrimeUnit_mul_inverseFactors_toZModPow + x p k + +open scoped Classical in +/-- Multiplication by the reduced sign cancels the sign in the reduced +prime-unit factorization. -/ +theorem rationalSignPadicUnit_mul_primeUnit_toZModPow + (x : ℚˣ) (p : Nat.Primes) (k : ℕ) : + Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p) * + Units.map (PadicInt.toZModPow k).toMonoidHom + (padicIntUnitOfRat p (rationalPrimeUnit x p : ℚ) + (rationalPrimeUnit x p).ne_zero + (padicValRat_rationalPrimeUnit x p)) = + ∏ q : + ↥((rationalPrimeFactorizationSupport x p).erase p.1), + (ZMod.unitOfCoprime q.1 + ((coprime_of_mem_rationalPrimeFactorizationSupport_erase + x p q.2).symm.pow_right k)) ^ + padicValRat q.1 (x : ℚ) := by + rw [padicIntUnitOfRat_rationalPrimeUnit_toZModPow] + rw [← mul_assoc, ← pow_two, + rationalSignPadicUnit_toZModPow_sq, one_mul] + +open scoped Classical in +/-- Inverse/cancellation form of the reduced prime-unit factorization. -/ +theorem padicIntUnitOfRat_rationalPrimeUnit_toZModPow_inv_mul + (x : ℚˣ) (p : Nat.Primes) (k : ℕ) : + (Units.map (PadicInt.toZModPow k).toMonoidHom + (padicIntUnitOfRat p (rationalPrimeUnit x p : ℚ) + (rationalPrimeUnit x p).ne_zero + (padicValRat_rationalPrimeUnit x p)))⁻¹ * + (Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalSignPadicUnit x p) * + ∏ q : + ↥((rationalPrimeFactorizationSupport x p).erase p.1), + (ZMod.unitOfCoprime q.1 + ((coprime_of_mem_rationalPrimeFactorizationSupport_erase + x p q.2).symm.pow_right k)) ^ + padicValRat q.1 (x : ℚ)) = + 1 := by + rw [← padicIntUnitOfRat_rationalPrimeUnit_toZModPow] + simp + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean new file mode 100644 index 0000000000..2f9ccfeac4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean @@ -0,0 +1,494 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrimeFactorization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeSeries +/-! +# The ramified local unit of a rational principal idele + +For a nonzero rational number `x` and a rational prime `p`, removing the +`p`-power from `x` produces an actual `p`-adic unit. This file identifies +that unit simultaneously in the height-one completion used by global +reciprocity, in the standard field `ℚ_[p]`, and in the valuation subring +used by the multiplicative Lubin--Tate construction. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + fieldUnitUniformizerUnitPart → + fieldUnitUniformizerUnitPart + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + valuationSubringUnitFieldUnitHom_fieldUnitUniformizerUnitPart → + valuationSubringUnitFieldUnitHom_fieldUnitUniformizerUnitPart + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + valuationSubringUnitFieldUnitHom_injective → + valuationSubringUnitFieldUnitHom_injective + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming + multiplicativeIntegerValuationOfUniformizer_isUniformizer → + multiplicativeIntegerValuationOfUniformizer_isUniformizer + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming + multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup → + multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming + valuationSubringUnitsToFieldUnits_mem_unitGroup → + valuationSubringUnitsToFieldUnits_mem_unitGroup + + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open LocalFieldTheory.DiscreteValuationField.Examples.Qp + +open scoped Classical in +/-- The prime subtype supplies the primality instance used at this local factor. -/ +local instance rationalPrincipalLocalUnitPrimeFact (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +attribute [local instance] rationalPrincipalLocalUnitPrimeFact + +open scoped Classical in +/-- The rational `p`-unit has value one for the height-one valuation +corresponding to `p`. -/ +theorem rationalPrimeUnit_heightOneValuation_eq_one + (x : ℚˣ) (p : Nat.Primes) : + (RayClass.rationalPrime p).valuation ℚ + (rationalPrimeUnit x p : ℚ) = + 1 := by + let v : HeightOneSpectrum (𝓞 ℚ) := + RayClass.rationalPrime p + have hequiv := + Rat.HeightOneSpectrum.valuation_equiv_padicValuation v + apply hequiv.eq_one_iff_eq_one.mpr + have hv : + Rat.HeightOneSpectrum.primesEquiv v = p := by + simp only [v, RayClass.rationalPrime, Equiv.apply_symm_apply] + rw [hv] + change + (if (rationalPrimeUnit x p : ℚ) = 0 then 0 + else WithZero.exp + (-padicValRat p.1 (rationalPrimeUnit x p : ℚ))) = + 1 + rw [ite_eq_right (Units.ne_zero _), padicValRat_rationalPrimeUnit] + rfl + +open scoped Classical in +/-- The rational `p`-unit, expressed as a unit of the valuation subring of +the standard local field `ℚ_[p]`. -/ +def rationalPrimeUnitValuationSubringUnit + (x : ℚˣ) (p : Nat.Primes) : + (padicLocalField p.1).valuationSubringˣ := + Units.map + (padicIntEquivValuationSubring + p.1).toMonoidHom + (padicIntUnitOfRat p + (rationalPrimeUnit x p : ℚ) + (Units.ne_zero _) + (padicValRat_rationalPrimeUnit x p)) + +open scoped Classical in +/-- Forgetting the integrality proof from the standard valuation-subring +unit recovers the rational `p`-unit in `ℚ_[p]`. -/ +@[simp] +theorem rationalPrimeUnitValuationSubringUnit_coe + (x : ℚˣ) (p : Nat.Primes) : + ((rationalPrimeUnitValuationSubringUnit x p : + (padicLocalField p.1).valuationSubring) : + ℚ_[p.1]) = + ((rationalPrimeUnit x p : ℚ) : ℚ_[p.1]) := by + change + ((padicIntEquivValuationSubring p.1 + (padicIntUnitOfRat p + (rationalPrimeUnit x p : ℚ) + (Units.ne_zero _) + (padicValRat_rationalPrimeUnit x p)) : + (padicLocalField p.1).valuationSubring) : + ℚ_[p.1]) = + ((rationalPrimeUnit x p : ℚ) : ℚ_[p.1]) + rw [ + padicIntEquivValuationSubring_coe, + padicIntUnitOfRat_coe] + +open scoped Classical in +/-- The Lubin--Tate field-unit inclusion of the rational `p`-unit is the +ordinary embedding of that rational unit into `ℚ_[p]`. -/ +theorem standardLubinTateUnitFactorFieldUnit_rationalPrimeUnit + (x : ℚˣ) (p : Nat.Primes) : + LubinTate.standardLubinTateUnitFactorFieldUnit + (padicLocalField p.1) + (rationalPrimeUnitValuationSubringUnit x p) = + Units.map (algebraMap ℚ ℚ_[p.1]).toMonoidHom + (rationalPrimeUnit x p) := by + apply Units.ext + change + ((rationalPrimeUnitValuationSubringUnit x p : + (padicLocalField p.1).valuationSubring) : + ℚ_[p.1]) = + algebraMap ℚ ℚ_[p.1] (rationalPrimeUnit x p : ℚ) + exact rationalPrimeUnitValuationSubringUnit_coe x p + +open scoped Classical in +/-- The standard multiplicative Lubin--Tate base uniformizer is exactly the +image of the positive rational prime generator in `ℚ_[p]ˣ`. -/ +theorem standardLubinTateBaseUniformizerUnit_eq_rationalPrimeGenerator + (p : Nat.Primes) : + LubinTate.standardLubinTateBaseUniformizerUnit + (LubinTate.padicMultiplicativeLubinTateSeries_isUniformizer + p.1) = + Units.map (algebraMap ℚ ℚ_[p.1]).toMonoidHom + (Units.mk0 (p.1 : ℚ) (by + exact_mod_cast p.2.ne_zero)) := by + apply Units.ext + change + ((padicIntEquivValuationSubring + p.1 (p.1 : ℤ_[p.1]) : + (padicLocalField p.1).valuationSubring) : + ℚ_[p.1]) = + algebraMap ℚ ℚ_[p.1] (p.1 : ℚ) + rw [padicIntEquivValuationSubring_coe] + simp + +open scoped Classical in +/-- Restoring the removed `p`-power recovers the original rational field +unit. This is the multiplicative factorization used after completion. -/ +theorem rationalPrimeUnit_mul_primeGenerator_zpow + (x : ℚˣ) (p : Nat.Primes) : + rationalPrimeUnit x p * + (Units.mk0 (p.1 : ℚ) (by + exact_mod_cast p.2.ne_zero)) ^ + padicValRat p.1 (x : ℚ) = + x := by + rw [rationalPrimeUnit] + calc + ((Units.mk0 (p.1 : ℚ) (by + exact_mod_cast p.2.ne_zero)) ^ + (-padicValRat p.1 (x : ℚ)) * x) * + (Units.mk0 (p.1 : ℚ) (by + exact_mod_cast p.2.ne_zero)) ^ + padicValRat p.1 (x : ℚ) = + x * ((Units.mk0 (p.1 : ℚ) (by + exact_mod_cast p.2.ne_zero)) ^ + (-padicValRat p.1 (x : ℚ)) * + (Units.mk0 (p.1 : ℚ) (by + exact_mod_cast p.2.ne_zero)) ^ + padicValRat p.1 (x : ℚ)) := by + ac_rfl + _ = x := by + rw [← zpow_add] + simp + +open scoped Classical in +/-- In `ℚ_[p]ˣ`, a rational field unit is its actual integral +`rationalPrimeUnit` factor times the corresponding power of the standard +multiplicative Lubin--Tate uniformizer. -/ +theorem rationalPadicFieldUnit_eq_unitFactor_mul_baseUniformizer_zpow + (x : ℚˣ) (p : Nat.Primes) : + Units.map (algebraMap ℚ ℚ_[p.1]).toMonoidHom x = + LubinTate.standardLubinTateUnitFactorFieldUnit + (padicLocalField p.1) + (rationalPrimeUnitValuationSubringUnit x p) * + LubinTate.standardLubinTateBaseUniformizerUnit + (LubinTate.padicMultiplicativeLubinTateSeries_isUniformizer + p.1) ^ + padicValRat p.1 (x : ℚ) := by + rw [ + standardLubinTateUnitFactorFieldUnit_rationalPrimeUnit, + standardLubinTateBaseUniformizerUnit_eq_rationalPrimeGenerator, + ← map_zpow, + ← map_mul, + rationalPrimeUnit_mul_primeGenerator_zpow] + +open scoped Classical in +/-- The exponent selected by the complete-DVF uniformizer decomposition of a +rational element is its ordinary `p`-adic valuation. -/ +theorem rationalPadicFieldUnit_uniformizerValueExponent + (x : ℚˣ) (p : Nat.Primes) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent + (padicLocalField p.1).toCompleteDVF) + (LubinTate.padicMultiplicativeLubinTateSeries_isUniformizer + p.1) + (Units.map (algebraMap ℚ ℚ_[p.1]).toMonoidHom x) = + padicValRat p.1 (x : ℚ) := by + let F := padicLocalField p.1 + let hπ := + LubinTate.padicMultiplicativeLubinTateSeries_isUniformizer + p.1 + let X : ℚ_[p.1]ˣ := + Units.map (algebraMap ℚ ℚ_[p.1]).toMonoidHom x + let u : F.valuationSubringˣ := + rationalPrimeUnitValuationSubringUnit x p + let ϖ : ℚ_[p.1]ˣ := + LubinTate.standardLubinTateBaseUniformizerUnit hπ + let V := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer + F.toCompleteDVF) hπ + have hfactor : + X = + LubinTate.standardLubinTateUnitFactorFieldUnit F u * + ϖ ^ padicValRat p.1 (x : ℚ) := by + simpa only [F, hπ, X, u, ϖ] using + rationalPadicFieldUnit_eq_unitFactor_mul_baseUniformizer_zpow + x p + have huMem : + LubinTate.standardLubinTateUnitFactorFieldUnit F u ∈ + F.valuation.valuationSubring.unitGroup := by + simpa only [ + LubinTate.standardLubinTateUnitFactorFieldUnit] using + (valuationSubringUnitsToFieldUnits_mem_unitGroup + F.toCompleteDVF u) + have hzero : + V.zeroSubgroup = + F.valuation.valuationSubring.unitGroup := by + simpa only [V] using + (multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup + F.toCompleteDVF hπ) + have huZero : + V.val + (LubinTate.standardLubinTateUnitFactorFieldUnit F u) = + 0 := by + apply (V.mem_zeroSubgroup_iff _).1 + rw [hzero] + exact huMem + have hϖeq : + ϖ = + Units.mk0 + ((padicIntEquivValuationSubring + p.1 (p.1 : ℤ_[p.1]) : + (padicLocalField p.1).valuationSubring) : + ℚ_[p.1]) + hπ.ne_zero := by + apply Units.ext + change + (ϖ : ℚ_[p.1]) = + ((padicIntEquivValuationSubring + p.1 (p.1 : ℤ_[p.1]) : + (padicLocalField p.1).valuationSubring) : + ℚ_[p.1]) + simpa only [ϖ] using + LubinTate.standardLubinTateBaseUniformizerUnit_coe hπ + have hϖ : V.IsUniformizer ϖ := by + rw [hϖeq] + simpa only [V] using + (multiplicativeIntegerValuationOfUniformizer_isUniformizer + F.toCompleteDVF hπ) + change V.val X = padicValRat p.1 (x : ℚ) + rw [ + hfactor, + V.val_mul, + V.val_uniformizer_zpow hϖ, + huZero, + zero_add] + +open scoped Classical in +/-- The actual unit part chosen by the standard multiplicative Lubin--Tate +uniformizer decomposition of a rational `p`-adic field unit is precisely +`rationalPrimeUnitValuationSubringUnit`. -/ +theorem rationalPadicFieldUnit_uniformizerUnitPart + (x : ℚˣ) (p : Nat.Primes) : + fieldUnitUniformizerUnitPart + (padicLocalField p.1).toCompleteDVF + (LubinTate.padicMultiplicativeLubinTateSeries_isUniformizer + p.1) + (Units.map (algebraMap ℚ ℚ_[p.1]).toMonoidHom x) = + rationalPrimeUnitValuationSubringUnit x p := by + let F := padicLocalField p.1 + let hπ := + LubinTate.padicMultiplicativeLubinTateSeries_isUniformizer + p.1 + let X : ℚ_[p.1]ˣ := + Units.map (algebraMap ℚ ℚ_[p.1]).toMonoidHom x + let u : F.valuationSubringˣ := + rationalPrimeUnitValuationSubringUnit x p + let ϖ : ℚ_[p.1]ˣ := + LubinTate.standardLubinTateBaseUniformizerUnit hπ + apply + valuationSubringUnitFieldUnitHom_injective + refine + (valuationSubringUnitFieldUnitHom_fieldUnitUniformizerUnitPart + F.toCompleteDVF hπ X).trans ?_ + change + X * ϖ ^ + (-((LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent + F.toCompleteDVF) hπ X)) = + LubinTate.standardLubinTateUnitFactorFieldUnit F u + rw [ + show + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent + F.toCompleteDVF) hπ X = + padicValRat p.1 (x : ℚ) by + simpa only [F, hπ, X] using + rationalPadicFieldUnit_uniformizerValueExponent x p, + show + X = + LubinTate.standardLubinTateUnitFactorFieldUnit F u * + ϖ ^ padicValRat p.1 (x : ℚ) by + simpa only [F, hπ, X, u, ϖ] using + rationalPadicFieldUnit_eq_unitFactor_mul_baseUniformizer_zpow + x p] + rw [mul_assoc, ← zpow_add] + simp + +open scoped Classical in +/-- Under the canonical equivalence between `ℚ_[p]` and the height-one +completion at `p`, the principal finite component of the rational `p`-unit +is its ordinary image in `ℚ_[p]`. -/ +theorem padicCompletionEquiv_principalFiniteComponent_rationalPrimeUnit + (x : ℚˣ) (p : Nat.Primes) : + Units.map + (Padic.adicCompletionEquiv (𝓞 ℚ) p).symm.toMonoidHom + (IdeleGroup.finiteComponent + (RayClass.rationalPrime p) + (IdeleGroup.principalIdele ℚ + (rationalPrimeUnit x p))) = + Units.map (algebraMap ℚ ℚ_[p.1]).toMonoidHom + (rationalPrimeUnit x p) := by + apply Units.ext + change + (Padic.adicCompletionEquiv (𝓞 ℚ) p).symm + (((IdeleGroup.finiteComponent + (RayClass.rationalPrime p) + (IdeleGroup.principalIdele ℚ + (rationalPrimeUnit x p)) : + ((RayClass.rationalPrime p).adicCompletion ℚ)ˣ) : + (RayClass.rationalPrime p).adicCompletion ℚ)) = + algebraMap ℚ ℚ_[p.1] (rationalPrimeUnit x p : ℚ) + rw [IdeleGroup.finiteComponent_principalIdele] + exact + (Padic.adicCompletionEquiv (𝓞 ℚ) p).symm.commutes + (rationalPrimeUnit x p : ℚ) + +open scoped Classical in +/-- Transporting an arbitrary rational principal finite component through +the canonical `p`-adic completion equivalence gives its ordinary image in +`ℚ_[p]ˣ`. -/ +theorem padicCompletionEquiv_principalFiniteComponent + (x : ℚˣ) (p : Nat.Primes) : + Units.map + (Padic.adicCompletionEquiv (𝓞 ℚ) p).symm.toMonoidHom + (IdeleGroup.finiteComponent + (RayClass.rationalPrime p) + (IdeleGroup.principalIdele ℚ x)) = + Units.map (algebraMap ℚ ℚ_[p.1]).toMonoidHom x := by + apply Units.ext + change + (Padic.adicCompletionEquiv (𝓞 ℚ) p).symm + (((IdeleGroup.finiteComponent + (RayClass.rationalPrime p) + (IdeleGroup.principalIdele ℚ x) : + ((RayClass.rationalPrime p).adicCompletion ℚ)ˣ) : + (RayClass.rationalPrime p).adicCompletion ℚ)) = + algebraMap ℚ ℚ_[p.1] (x : ℚ) + rw [IdeleGroup.finiteComponent_principalIdele] + exact + (Padic.adicCompletionEquiv (𝓞 ℚ) p).symm.commutes + (x : ℚ) + +open scoped Classical in +/-- The transported rational principal finite component has the explicit +standard Lubin--Tate uniformizer/unit factorization. -/ +theorem padicCompletionEquiv_principalFiniteComponent_factorization + (x : ℚˣ) (p : Nat.Primes) : + Units.map + (Padic.adicCompletionEquiv (𝓞 ℚ) p).symm.toMonoidHom + (IdeleGroup.finiteComponent + (RayClass.rationalPrime p) + (IdeleGroup.principalIdele ℚ x)) = + LubinTate.standardLubinTateUnitFactorFieldUnit + (padicLocalField p.1) + (rationalPrimeUnitValuationSubringUnit x p) * + LubinTate.standardLubinTateBaseUniformizerUnit + (LubinTate.padicMultiplicativeLubinTateSeries_isUniformizer + p.1) ^ + padicValRat p.1 (x : ℚ) := by + rw [ + padicCompletionEquiv_principalFiniteComponent, + rationalPadicFieldUnit_eq_unitFactor_mul_baseUniformizer_zpow] + +open scoped Classical in +/-- Applying the actual complete-DVF unit-part operation to a transported +rational principal finite component returns the integral +`rationalPrimeUnit` factor. -/ +theorem + padicCompletionEquiv_principalFiniteComponent_uniformizerUnitPart + (x : ℚˣ) (p : Nat.Primes) : + fieldUnitUniformizerUnitPart + (padicLocalField p.1).toCompleteDVF + (LubinTate.padicMultiplicativeLubinTateSeries_isUniformizer + p.1) + (Units.map + (Padic.adicCompletionEquiv (𝓞 ℚ) p).symm.toMonoidHom + (IdeleGroup.finiteComponent + (RayClass.rationalPrime p) + (IdeleGroup.principalIdele ℚ x))) = + rationalPrimeUnitValuationSubringUnit x p := by + rw [padicCompletionEquiv_principalFiniteComponent] + exact rationalPadicFieldUnit_uniformizerUnitPart x p + +open scoped Classical in +/-- The rational prime generator at its own finite place transports to the +actual standard multiplicative Lubin--Tate base uniformizer. -/ +theorem + padicCompletionEquiv_principalFiniteComponent_rationalPrimeGenerator + (p : Nat.Primes) : + Units.map + (Padic.adicCompletionEquiv (𝓞 ℚ) p).symm.toMonoidHom + (IdeleGroup.finiteComponent + (RayClass.rationalPrime p) + (IdeleGroup.principalIdele ℚ + (Units.mk0 (p.1 : ℚ) (by + exact_mod_cast p.2.ne_zero)))) = + LubinTate.standardLubinTateBaseUniformizerUnit + (LubinTate.padicMultiplicativeLubinTateSeries_isUniformizer + p.1) := by + rw [ + padicCompletionEquiv_principalFiniteComponent, + standardLubinTateBaseUniformizerUnit_eq_rationalPrimeGenerator] + +open scoped Classical in +/-- The principal finite component of the rational `p`-unit is transported +to the exact field unit used by the multiplicative Lubin--Tate Artin map. -/ +theorem + padicCompletionEquiv_principalFiniteComponent_eq_lubinTateUnitFactor + (x : ℚˣ) (p : Nat.Primes) : + Units.map + (Padic.adicCompletionEquiv (𝓞 ℚ) p).symm.toMonoidHom + (IdeleGroup.finiteComponent + (RayClass.rationalPrime p) + (IdeleGroup.principalIdele ℚ + (rationalPrimeUnit x p))) = + LubinTate.standardLubinTateUnitFactorFieldUnit + (padicLocalField p.1) + (rationalPrimeUnitValuationSubringUnit x p) := by + rw [ + padicCompletionEquiv_principalFiniteComponent_rationalPrimeUnit, + standardLubinTateUnitFactorFieldUnit_rationalPrimeUnit] + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalQuadraticPowerResidueReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalQuadraticPowerResidueReciprocity.lean new file mode 100644 index 0000000000..30b9c940a3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalQuadraticPowerResidueReciprocity.lean @@ -0,0 +1,1285 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.PowerResidueReciprocity +/-! +# Rational quadratic reciprocity from global class field theory + +The dyadic correction specializes power-residue reciprocity over `ℚ` and +derives Gauss's quadratic reciprocity law. +-/ + +@[expose] public section + +open scoped BigOperators NumberField NumberTheorySymbols ValuativeRel WithZero +open NumberField IsDedekindDomain + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +-- Specializing the generic completion construction to `ℚ` must keep the +-- `Algebra.id` owner fixed. Otherwise the rational-field algebra path is +-- underdetermined during instance synthesis. +open scoped Classical in +/-- The rational scalar action on a finite-place completion, with the identity algebra on the base +field fixed. -/ +@[reducible] noncomputable local instance rationalQuadraticCompletionAlgebra + (v : HeightOneSpectrum (𝓞 ℚ)) : + Algebra ℚ (HeightOneSpectrum.adicAbv ℚ v).Completion := by + letI : Algebra ℚ ℚ := Algebra.id ℚ + let hWith : Algebra ℚ + (WithAbs (HeightOneSpectrum.adicAbv ℚ v)) := + WithAbs.instAlgebra _ + let hUniform : UniformContinuousConstSMul ℚ + (WithAbs (HeightOneSpectrum.adicAbv ℚ v)) := + WithAbs.instUniformContinuousConstSMulReal _ + exact + @UniformSpace.Completion.algebra + (WithAbs (HeightOneSpectrum.adicAbv ℚ v)) _ _ _ _ + ℚ _ hWith hUniform + +attribute [local instance] rationalQuadraticCompletionAlgebra + +open KummerTheory +open AlgebraicNumberTheory.PowerResidueSymbols +open LocalClassFieldTheory.Kummer +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +open scoped Classical in +private def rationalQuadraticRootValuePNatMonoidHom : + rootsOfUnity (((2 : ℕ+) : ℕ)) (𝓞 ℚ) →* ℤ := by + change rootsOfUnity 2 (𝓞 ℚ) →* ℤ + exact rationalQuadraticRootValueMonoidHom + +/-! ## Dyadic correction and Gauss reciprocity -/ + +open scoped Classical in +/-- The rational prime above two, used throughout the dyadic specialization. -/ +def rationalTwoPrime : Nat.Primes := ⟨2, Nat.prime_two⟩ + +open scoped Classical in +/-- Identify the completion at the rational prime above two with the corresponding indexed +p-adic field. -/ +noncomputable def rationalTwoAdicCompletionToIndexedPadic : + (RayClass.rationalPrime rationalTwoPrime).adicCompletion ℚ ≃+* + ℚ_[Rat.HeightOneSpectrum.primesEquiv + (RayClass.rationalPrime rationalTwoPrime)] := + (IsDedekindDomain.HeightOneSpectrum.adicCompletion.equiv ℚ + (RayClass.rationalPrime rationalTwoPrime)).trans + ((UniformSpace.Completion.mapRingEquiv + (WithVal.congr + (IsDedekindDomain.HeightOneSpectrum.valuation ℚ + (RayClass.rationalPrime rationalTwoPrime)) + (Rat.padicValuation + (Rat.HeightOneSpectrum.primesEquiv + (RayClass.rationalPrime rationalTwoPrime))) + (RingEquiv.refl ℚ)) + (Rat.HeightOneSpectrum.withValEquiv + (RayClass.rationalPrime rationalTwoPrime)).continuous + (Rat.HeightOneSpectrum.withValEquiv + (RayClass.rationalPrime rationalTwoPrime)).symm.continuous).trans + Padic.withValRingEquiv) + +open scoped Classical in +/-- The absolute-value completion at the rational prime above two is +canonically the usual field of `2`-adic numbers. -/ +noncomputable def rationalTwoAdicCompletionEquivPadic : + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime rationalTwoPrime)).Completion ≃+* ℚ_[2] := + (finitePlaceCompletionRingEquiv + (RayClass.rationalPrime rationalTwoPrime)).trans + (rationalTwoAdicCompletionToIndexedPadic.trans + (show + ℚ_[Rat.HeightOneSpectrum.primesEquiv + (RayClass.rationalPrime rationalTwoPrime)] ≃+* + ℚ_[rationalTwoPrime] from + RingEquiv.cast (R := fun p : Nat.Primes => ℚ_[p.1]) + ((Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ)).apply_symm_apply rationalTwoPrime))) + +open scoped Classical in +/-- A natural number in the rational ring of integers. -/ +noncomputable def rationalNatInteger (m : ℕ) : 𝓞 ℚ := + Rat.ringOfIntegersEquiv.symm (m : ℤ) + +open scoped Classical in +@[simp] +theorem rationalNatInteger_equiv (m : ℕ) : + Rat.ringOfIntegersEquiv (rationalNatInteger m) = (m : ℤ) := + Rat.ringOfIntegersEquiv.apply_symm_apply (m : ℤ) + +open scoped Classical in +@[simp] +theorem rationalNatInteger_coe (m : ℕ) : + (rationalNatInteger m : ℚ) = (m : ℚ) := by + exact Rat.ringOfIntegersEquiv_symm_apply_coe (m : ℤ) + +open scoped Classical in +/-- A positive natural number, regarded canonically as a rational field unit. -/ +noncomputable def rationalNaturalFieldUnit + (m : ℕ) (hm : m ≠ 0) : ℚˣ := + nonzeroIntegralFieldUnit ℚ (rationalNatInteger m) (by + intro h + apply Int.ofNat_ne_zero.mpr hm + simpa [rationalNatInteger_equiv] using + congrArg Rat.ringOfIntegersEquiv h) + +open scoped Classical in +@[simp] +theorem rationalNaturalFieldUnit_coe + (m : ℕ) (hm : m ≠ 0) : + (rationalNaturalFieldUnit m hm : ℚ) = (m : ℚ) := by + exact rationalNatInteger_coe m + +open scoped Classical in +/-- The negative quadratic integral root of unity over `ℚ`. -/ +def rationalQuadraticNegOneRoot : rootsOfUnity 2 (𝓞 ℚ) := + ⟨-1, by norm_num⟩ + +open scoped Classical in +@[simp] +theorem rationalQuadraticRootValue_negOneRoot : + rationalQuadraticRootValue rationalQuadraticNegOneRoot = -1 := by + simp [rationalQuadraticRootValue, rationalQuadraticNegOneRoot] + +open scoped Classical in +/-- For exponent two, the exponent ideal is the rational principal ideal +generated by two. -/ +theorem powerResidueExponentIdeal_rational_two : + powerResidueExponentIdeal ℚ (2 : ℕ+) = rationalPrincipalIdeal 2 := by + unfold powerResidueExponentIdeal rationalPrincipalIdeal + congr 2 + apply Rat.ringOfIntegersEquiv.injective + simp + +open scoped Classical in +/-- The only finite exponent place in the rational quadratic specialization +is the prime above two. -/ +theorem powerResidueExponentFinitePlaces_rational_two : + powerResidueExponentFinitePlaces ℚ (2 : ℕ+) = + {RayClass.rationalPrime rationalTwoPrime} := by + ext v + rw [Finset.mem_singleton, + mem_powerResidueExponentFinitePlaces_iff, + powerResidueExponentIdeal_rational_two] + let p : Nat.Primes := + Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ) v + have hpv : RayClass.rationalPrime p = v := + (Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ)).symm_apply_apply v + constructor + · intro hvDvd + have hpDvd : p.1 ∣ 2 := by + apply (rationalPrime_dvd_rationalPrincipalIdeal_iff p 2).mp + simpa only [hpv] using hvDvd + have hpEq : p = rationalTwoPrime := by + apply Subtype.ext + exact (Nat.prime_dvd_prime_iff_eq p.2 Nat.prime_two).mp hpDvd + exact hpv.symm.trans (congrArg RayClass.rationalPrime hpEq) + · intro hv + rw [hv] + apply (rationalPrime_dvd_rationalPrincipalIdeal_iff + rationalTwoPrime 2).mpr + change 2 ∣ 2 + exact dvd_rfl + +open scoped Classical in +/-- The sign-normalized odd integer used in the dyadic square-class +calculation, regarded as a unit of `ℚ₂`. -/ +noncomputable def rationalTwoAdicSignedOddUnit + (m : ℕ) (hm : Odd m) : ℚ_[2]ˣ := + Units.mk0 + ((((-1 : ℤ) ^ (m / 2) * (m : ℤ)) : ℤ) : ℚ_[2]) (by + exact_mod_cast + mul_ne_zero (pow_ne_zero _ (by norm_num : (-1 : ℤ) ≠ 0)) + (Int.ofNat_ne_zero.mpr (by + intro hm0 + subst m + norm_num at hm))) + +open scoped Classical in +@[simp] +theorem rationalTwoAdicSignedOddUnit_coe + (m : ℕ) (hm : Odd m) : + (rationalTwoAdicSignedOddUnit m hm : ℚ_[2]) = + (((-1 : ℤ) ^ (m / 2) * (m : ℤ) : ℤ) : ℚ_[2]) := + rfl + +open scoped Classical in +/-- A sign-normalized odd rational integer is, in `ℚ₂`, either a square or +five times a square. This is the exact dyadic square-class input needed for +the quadratic Hilbert correction. -/ +theorem rationalTwoAdicSignedOddUnit_squareClass + (m : ℕ) (hm : Odd m) : + let five : ℚ_[2]ˣ := Units.mk0 (5 : ℚ_[2]) (by norm_num) + ∃ r : ℚ_[2]ˣ, + rationalTwoAdicSignedOddUnit m hm = r ^ 2 ∨ + rationalTwoAdicSignedOddUnit m hm = five * r ^ 2 := by + let : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩ + let q : ℤ := (-1 : ℤ) ^ (m / 2) * (m : ℤ) + have hmInt : Odd (m : ℤ) := by exact_mod_cast hm + have hqData : Odd q ∧ ∃ k : ℤ, q - 1 = 4 * k := by + have hmMod : m % 4 = 1 ∨ m % 4 = 3 := by + have hmTwo := Nat.odd_iff.mp hm + omega + rcases hmMod with hm1 | hm3 + · have hsign : (-1 : ℤ) ^ (m / 2) = 1 := + by + have hdiv : m / 2 = 2 * (m / 4) := by omega + rw [hdiv, pow_mul] + norm_num + have hmForm : m = 4 * (m / 4) + 1 := by + have hdiv := Nat.mod_add_div m 4 + omega + constructor + · simpa only [q, hsign, one_mul] using hmInt + · refine ⟨(m / 4 : ℕ), ?_⟩ + simp only [q, hsign, one_mul] + exact_mod_cast (by omega : (m : ℤ) - 1 = 4 * (m / 4 : ℕ)) + · have hsign : (-1 : ℤ) ^ (m / 2) = -1 := + by + have hdiv : m / 2 = 2 * (m / 4) + 1 := by omega + rw [hdiv, pow_add, pow_mul] + norm_num + have hmForm : m = 4 * (m / 4) + 3 := by + have hdiv := Nat.mod_add_div m 4 + omega + constructor + · simpa only [q, hsign, neg_one_mul] using hmInt.neg + · refine ⟨-((m / 4 : ℤ) + 1), ?_⟩ + simp only [q, hsign, neg_one_mul] + omega + have hqCoprime : IsCoprime q (2 : ℤ) := by + obtain ⟨k, hk⟩ := hqData.2 + refine ⟨1, -2 * k, ?_⟩ + omega + have hqPadicUnit : IsUnit (q : ℤ_[2]) := by + rw [PadicInt.isUnit_iff, PadicInt.norm_intCast_eq_one_iff] + exact hqCoprime + let qZ : ℤ_[2]ˣ := hqPadicUnit.unit + let F := + LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF 2 + let eO : ℤ_[2] ≃+* F.valuationSubring := + LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicIntEquivValuationSubring 2 + let qO : F.valuationSubringˣ := Units.mapEquiv eO.toMulEquiv qZ + have hqMaximal : + (q : ℤ_[2]) - 1 ∈ IsLocalRing.maximalIdeal ℤ_[2] ^ 2 := by + rw [PadicInt.maximalIdeal_eq_span_p, Ideal.span_singleton_pow, + Ideal.mem_span_singleton] + obtain ⟨k, hk⟩ := hqData.2 + refine ⟨(k : ℤ_[2]), ?_⟩ + calc + (q : ℤ_[2]) - 1 = ((q - 1 : ℤ) : ℤ_[2]) := by norm_num + _ = ((4 * k : ℤ) : ℤ_[2]) := by rw [hk] + _ = (2 : ℤ_[2]) ^ 2 * (k : ℤ_[2]) := by norm_num + have hqO2 : + qO ∈ LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2 := by + rw [LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.mem_iff] + have hqOVal : (qO : F.valuationSubring) = eO (q : ℤ_[2]) := by + simp [qO, qZ] + rw [hqOVal, ← map_one eO, ← map_sub] + exact + (ValuationTheory.ringEquiv_mem_maximalIdeal_pow_iff + eO 2 ((q : ℤ_[2]) - 1)).2 hqMaximal + let u : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2 := + ⟨qO, hqO2⟩ + obtain ⟨rD, hrD⟩ := + LocalClassFieldTheory.padicDVR_U2_square_class u + let toField : F.valuationSubringˣ →* ℚ_[2]ˣ := + Units.map F.valuation.valuationSubring.subtype.toMonoidHom + let r : ℚ_[2]ˣ := toField (rD : F.valuationSubringˣ) + let five : ℚ_[2]ˣ := Units.mk0 (5 : ℚ_[2]) (by norm_num) + have hbase : toField qO = rationalTwoAdicSignedOddUnit m hm := by + apply Units.ext + dsimp [toField, qO, qZ, eO, F, q] + rfl + have hfive : + toField + ((LocalClassFieldTheory.padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + F.valuationSubringˣ) = + five := by + apply Units.ext + dsimp [toField, five, F] + exact LocalClassFieldTheory.padicDVR_five_val + refine ⟨r, ?_⟩ + rcases hrD with hrD | hrD + · left + calc + rationalTwoAdicSignedOddUnit m hm = toField qO := hbase.symm + _ = toField ((rD : F.valuationSubringˣ) ^ 2) := + congrArg toField hrD + _ = r ^ 2 := by rw [map_pow] + · right + calc + rationalTwoAdicSignedOddUnit m hm = toField qO := hbase.symm + _ = toField + ((LocalClassFieldTheory.padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) * + (rD : F.valuationSubringˣ) ^ 2) := + congrArg toField hrD + _ = five * r ^ 2 := by rw [map_mul, map_pow, hfive] + +open scoped Classical in +/-- Pull the signed odd square-class decomposition back from `ℚ₂` to the +canonical absolute-value completion used by global Hilbert symbols. -/ +theorem rationalTwoAdicOddUnit_squareClass + (m : ℕ) (hm : Odd m) : + let v₂ := RayClass.rationalPrime rationalTwoPrime + let C := (HeightOneSpectrum.adicAbv ℚ v₂).Completion + let aC := finitePlaceHilbertCompletionUnit ℚ v₂ + (rationalNaturalFieldUnit m (by + intro hm0 + subst m + norm_num at hm)) + let fiveC : Cˣ := Units.mk0 (5 : C) + (finitePlaceHilbert_natCast_ne_zero ℚ (5 : ℕ+) (by norm_num) v₂) + ∃ r : Cˣ, + aC = (-1 : Cˣ) ^ (m / 2) * r ^ 2 ∨ + aC = (-1 : Cˣ) ^ (m / 2) * (fiveC * r ^ 2) := by + dsimp only + let v₂ := RayClass.rationalPrime rationalTwoPrime + let C := (HeightOneSpectrum.adicAbv ℚ v₂).Completion + let e : C ≃+* ℚ_[2] := rationalTwoAdicCompletionEquivPadic + have hm0 : m ≠ 0 := by + intro hm0 + subst m + norm_num at hm + let aC : Cˣ := finitePlaceHilbertCompletionUnit ℚ v₂ + (rationalNaturalFieldUnit m hm0) + have haC : + (aC : (HeightOneSpectrum.adicAbv ℚ v₂).Completion) = + (m : (HeightOneSpectrum.adicAbv ℚ v₂).Completion) := by + simp only [aC, C, finitePlaceHilbertCompletionUnit, Units.coe_map, + rationalNaturalFieldUnit_coe] + exact map_natCast + (algebraMap ℚ (HeightOneSpectrum.adicAbv ℚ v₂).Completion) m + let fiveC : Cˣ := Units.mk0 (5 : C) + (finitePlaceHilbert_natCast_ne_zero ℚ (5 : ℕ+) (by norm_num) v₂) + let fiveQ : ℚ_[2]ˣ := Units.mk0 (5 : ℚ_[2]) (by norm_num) + obtain ⟨rQ, hrQ⟩ := + rationalTwoAdicSignedOddUnit_squareClass m hm + let rC : Cˣ := Units.map e.symm.toMonoidHom rQ + have hsigned : + Units.map e.symm.toMonoidHom + (rationalTwoAdicSignedOddUnit m hm) = + (-1 : Cˣ) ^ (m / 2) * aC := by + apply Units.ext + simp only [Units.coe_map, Units.val_mul, Units.val_pow_eq_pow_val, + rationalTwoAdicSignedOddUnit_coe] + rw [haC] + change + e.symm ((((-1 : ℤ) ^ (m / 2) * (m : ℤ) : ℤ) : ℚ_[2])) = + (-1 : (HeightOneSpectrum.adicAbv ℚ v₂).Completion) ^ (m / 2) * + (m : (HeightOneSpectrum.adicAbv ℚ v₂).Completion) + calc + e.symm ((((-1 : ℤ) ^ (m / 2) * (m : ℤ) : ℤ) : ℚ_[2])) = + (((-1 : ℤ) ^ (m / 2) * (m : ℤ) : ℤ) : + (HeightOneSpectrum.adicAbv ℚ v₂).Completion) := + map_intCast e.symm.toRingHom _ + _ = (-1 : (HeightOneSpectrum.adicAbv ℚ v₂).Completion) ^ (m / 2) * + (m : (HeightOneSpectrum.adicAbv ℚ v₂).Completion) := by norm_num + have hqSq : (((-1 : Cˣ) ^ (m / 2)) ^ 2) = 1 := by + calc + (((-1 : Cˣ) ^ (m / 2)) ^ 2) = ((-1 : Cˣ) ^ 2) ^ (m / 2) := by + rw [← pow_mul, Nat.mul_comm, pow_mul] + _ = 1 := by rw [neg_one_sq, one_pow] + refine ⟨rC, ?_⟩ + rcases hrQ with hrQ | hrQ + · left + have hmapped := congrArg + (Units.map e.symm.toMonoidHom) hrQ + have hsignedEq : + (-1 : Cˣ) ^ (m / 2) * aC = rC ^ 2 := by + simpa only [hsigned, map_pow, rC] using hmapped + calc + aC = 1 * aC := (one_mul aC).symm + _ = (((-1 : Cˣ) ^ (m / 2)) ^ 2) * aC := by rw [hqSq] + _ = (-1 : Cˣ) ^ (m / 2) * + (((-1 : Cˣ) ^ (m / 2)) * aC) := by + rw [pow_two, mul_assoc] + _ = (-1 : Cˣ) ^ (m / 2) * rC ^ 2 := by rw [hsignedEq] + · right + have hmapped := congrArg + (Units.map e.symm.toMonoidHom) hrQ + have hfiveMapped : + Units.map e.symm.toMonoidHom fiveQ = fiveC := by + apply Units.ext + change e.symm (5 : ℚ_[2]) = (5 : C) + simpa using map_natCast e.symm 5 + have hsignedEq : + (-1 : Cˣ) ^ (m / 2) * aC = fiveC * rC ^ 2 := by + simpa only [hsigned, map_mul, map_pow, hfiveMapped, rC, fiveQ] + using hmapped + calc + aC = 1 * aC := (one_mul aC).symm + _ = (((-1 : Cˣ) ^ (m / 2)) ^ 2) * aC := by rw [hqSq] + _ = (-1 : Cˣ) ^ (m / 2) * + (((-1 : Cˣ) ^ (m / 2)) * aC) := by + rw [pow_two, mul_assoc] + _ = (-1 : Cˣ) ^ (m / 2) * (fiveC * rC ^ 2) := + congrArg (fun z => (-1 : Cˣ) ^ (m / 2) * z) hsignedEq + +open scoped Classical in +private theorem localHilbertSymbol_pow_left + (F : Type) [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + (n : ℕ+) (hnF : ((n : ℕ) : F) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) F).Nonempty) + (x y : Fˣ) (e : ℕ) : + localHilbertSymbol F n hnF hmu (x ^ e) y = + localHilbertSymbol F n hnF hmu x y ^ e := by + change + localHilbertSymbolHom F n hnF hmu y (x ^ e) = + localHilbertSymbolHom F n hnF hmu y x ^ e + exact map_pow (localHilbertSymbolHom F n hnF hmu y) x e + +open scoped Classical in +private theorem localHilbertSymbol_pow_right + (F : Type) [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + (n : ℕ+) (hnF : ((n : ℕ) : F) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) F).Nonempty) + (x y : Fˣ) (e : ℕ) : + localHilbertSymbol F n hnF hmu x (y ^ e) = + localHilbertSymbol F n hnF hmu x y ^ e := by + rw [localHilbertSymbol_skew, + localHilbertSymbol_pow_left, + ← inv_pow, ← localHilbertSymbol_skew] + +open scoped Classical in +private theorem localHilbertSymbol_mul_left + (F : Type) [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + (n : ℕ+) (hnF : ((n : ℕ) : F) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) F).Nonempty) + (x y z : Fˣ) : + localHilbertSymbol F n hnF hmu (x * y) z = + localHilbertSymbol F n hnF hmu x z * + localHilbertSymbol F n hnF hmu y z := by + change + localHilbertSymbolHom F n hnF hmu z (x * y) = + localHilbertSymbolHom F n hnF hmu z x * + localHilbertSymbolHom F n hnF hmu z y + exact map_mul (localHilbertSymbolHom F n hnF hmu z) x y + +open scoped Classical in +private theorem localHilbertSymbol_pow_pow + (F : Type) [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + (n : ℕ+) (hnF : ((n : ℕ) : F) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) F).Nonempty) + (x y : Fˣ) (a b : ℕ) : + localHilbertSymbol F n hnF hmu (x ^ a) (y ^ b) = + localHilbertSymbol F n hnF hmu x y ^ (a * b) := by + rw [localHilbertSymbol_pow_left, localHilbertSymbol_pow_right, + ← pow_mul, Nat.mul_comm] + +open scoped Classical in +private theorem localQuadraticHilbertSymbol_square_left_eq_one + (F : Type) [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + (h2F : ((((2 : ℕ+) : ℕ)) : F) ≠ 0) + (hmu : (primitiveRoots (((2 : ℕ+) : ℕ)) F).Nonempty) + (x y : Fˣ) : + localHilbertSymbol F (2 : ℕ+) h2F hmu (x ^ 2) y = 1 := by + rw [localHilbertSymbol_pow_left] + apply Subtype.ext + exact (localHilbertSymbol F (2 : ℕ+) h2F hmu x y).2 + +open scoped Classical in +private theorem localQuadraticHilbertSymbol_square_right_eq_one + (F : Type) [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + (h2F : ((((2 : ℕ+) : ℕ)) : F) ≠ 0) + (hmu : (primitiveRoots (((2 : ℕ+) : ℕ)) F).Nonempty) + (x y : Fˣ) : + localHilbertSymbol F (2 : ℕ+) h2F hmu x (y ^ 2) = 1 := by + rw [localHilbertSymbol_pow_right] + apply Subtype.ext + exact (localHilbertSymbol F (2 : ℕ+) h2F hmu x y).2 + +open scoped Classical in +private theorem localQuadraticHilbertSymbol_value_sq_eq_one + (F : Type) [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + (h2F : ((((2 : ℕ+) : ℕ)) : F) ≠ 0) + (hmu : (primitiveRoots (((2 : ℕ+) : ℕ)) F).Nonempty) + (x y : Fˣ) : + localHilbertSymbol F (2 : ℕ+) h2F hmu x y ^ 2 = 1 := by + apply Subtype.ext + exact (localHilbertSymbol F (2 : ℕ+) h2F hmu x y).2 + +open scoped Classical in +private theorem localQuadraticHilbertSymbol_squareClass_formula + (F : Type) [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + (h2F : ((((2 : ℕ+) : ℕ)) : F) ≠ 0) + (hmu : (primitiveRoots (((2 : ℕ+) : ℕ)) F).Nonempty) + (q five a b r s : Fˣ) (ka kb : ℕ) + (negRoot : nthRootsSubgroup F (((2 : ℕ+) : ℕ))) + (hqq : localHilbertSymbol F (2 : ℕ+) h2F hmu q q = negRoot) + (hqfive : + localHilbertSymbol F (2 : ℕ+) h2F hmu q five = 1) + (hfivefive : + localHilbertSymbol F (2 : ℕ+) h2F hmu five five = 1) + (ha : a = q ^ ka * r ^ 2 ∨ + a = q ^ ka * (five * r ^ 2)) + (hb : b = q ^ kb * s ^ 2 ∨ + b = q ^ kb * (five * s ^ 2)) : + localHilbertSymbol F (2 : ℕ+) h2F hmu a b = + negRoot ^ (ka * kb) := by + have hfiveq : + localHilbertSymbol F (2 : ℕ+) h2F hmu five q = 1 := by + rw [localHilbertSymbol_skew, hqfive, inv_one] + rcases ha with ha | ha <;> rcases hb with hb | hb + all_goals subst a; subst b + all_goals + simp only [localHilbertSymbol_mul_left, + localHilbertSymbol_mul_right, + localHilbertSymbol_pow_left, + localHilbertSymbol_pow_right, + localQuadraticHilbertSymbol_value_sq_eq_one, + hqq, hqfive, hfiveq, hfivefive, + one_pow, mul_one, one_mul] + all_goals + have hsquare + (x : nthRootsSubgroup F (((2 : ℕ+) : ℕ))) : x ^ 2 = 1 := by + apply Subtype.ext + change x.1 ^ 2 = 1 + exact x.2 + rw [hsquare, mul_one] + exact (pow_mul negRoot ka kb).symm + +open scoped Classical in +/-- The dyadic quadratic Hilbert symbol of `-1` and `5` is trivial. -/ +theorem rationalTwoAdicHilbert_negOne_five_eq_one : + let v₂ := RayClass.rationalPrime rationalTwoPrime + let C := (HeightOneSpectrum.adicAbv ℚ v₂).Completion + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v₂ + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v₂ + localHilbertSymbol C (2 : ℕ+) + (finitePlaceHilbert_natCast_ne_zero ℚ (2 : ℕ+) + (by norm_num) v₂) + (finitePlaceHilbert_primitiveRoots_nonempty ℚ (2 : ℕ+) + rationalQuadraticPrimitiveRoots_nonempty v₂) + (-1 : Cˣ) (Units.mk0 (5 : C) + (finitePlaceHilbert_natCast_ne_zero ℚ (5 : ℕ+) + (by norm_num) v₂)) = 1 := by + dsimp only + let v₂ := RayClass.rationalPrime rationalTwoPrime + let C := (HeightOneSpectrum.adicAbv ℚ v₂).Completion + let : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v₂ + let : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v₂ + let h2C := finitePlaceHilbert_natCast_ne_zero ℚ (2 : ℕ+) + (by norm_num) v₂ + let hmuC := finitePlaceHilbert_primitiveRoots_nonempty ℚ (2 : ℕ+) + rationalQuadraticPrimitiveRoots_nonempty v₂ + let two : Cˣ := Units.mk0 (2 : C) + (finitePlaceHilbert_natCast_ne_zero ℚ (2 : ℕ+) (by norm_num) v₂) + let negFour : Cˣ := Units.mk0 (-4 : C) + (neg_ne_zero.mpr + (finitePlaceHilbert_natCast_ne_zero ℚ (4 : ℕ+) (by norm_num) v₂)) + let five : Cˣ := Units.mk0 (5 : C) + (finitePlaceHilbert_natCast_ne_zero ℚ (5 : ℕ+) (by norm_num) v₂) + have hnegFour : negFour = (-1 : Cˣ) * two ^ 2 := by + apply Units.ext + change + (-4 : (HeightOneSpectrum.adicAbv ℚ v₂).Completion) = + (-1 : (HeightOneSpectrum.adicAbv ℚ v₂).Completion) * + (2 : (HeightOneSpectrum.adicAbv ℚ v₂).Completion) ^ 2 + norm_num + have hstein : + localHilbertSymbol C (2 : ℕ+) h2C hmuC negFour five = 1 := by + have hcomp : 1 - (negFour : C) ≠ 0 := by + have hval : 1 - (negFour : C) = (5 : C) := by + dsimp only [negFour] + change + 1 - (-4 : (HeightOneSpectrum.adicAbv ℚ v₂).Completion) = 5 + norm_num + rw [hval] + exact finitePlaceHilbert_natCast_ne_zero ℚ (5 : ℕ+) + (by norm_num) v₂ + have hs := localHilbertSymbol_steinberg C (2 : ℕ+) h2C hmuC negFour hcomp + have hfiveComp : five = Units.mk0 (1 - (negFour : C)) hcomp := by + apply Units.ext + dsimp only [negFour, five] + change + (5 : (HeightOneSpectrum.adicAbv ℚ v₂).Completion) = 1 - (-4) + norm_num + rw [hfiveComp] + exact hs + rw [hnegFour] at hstein + change + localHilbertSymbolHom C (2 : ℕ+) h2C hmuC five + ((-1 : Cˣ) * two ^ 2) = 1 at hstein + rw [map_mul] at hstein + change + localHilbertSymbol C (2 : ℕ+) h2C hmuC (-1 : Cˣ) five * + localHilbertSymbol C (2 : ℕ+) h2C hmuC (two ^ 2) five = 1 + at hstein + rw [localQuadraticHilbertSymbol_square_left_eq_one, mul_one] at hstein + exact hstein + +open scoped Classical in +/-- The dyadic quadratic Hilbert symbol of `5` with itself is trivial. -/ +theorem rationalTwoAdicHilbert_five_five_eq_one : + let v₂ := RayClass.rationalPrime rationalTwoPrime + let C := (HeightOneSpectrum.adicAbv ℚ v₂).Completion + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v₂ + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v₂ + localHilbertSymbol C (2 : ℕ+) + (finitePlaceHilbert_natCast_ne_zero ℚ (2 : ℕ+) + (by norm_num) v₂) + (finitePlaceHilbert_primitiveRoots_nonempty ℚ (2 : ℕ+) + rationalQuadraticPrimitiveRoots_nonempty v₂) + (Units.mk0 (5 : C) + (finitePlaceHilbert_natCast_ne_zero ℚ (5 : ℕ+) + (by norm_num) v₂)) + (Units.mk0 (5 : C) + (finitePlaceHilbert_natCast_ne_zero ℚ (5 : ℕ+) + (by norm_num) v₂)) = 1 := by + dsimp only + let v₂ := RayClass.rationalPrime rationalTwoPrime + let C := (HeightOneSpectrum.adicAbv ℚ v₂).Completion + let : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v₂ + let : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v₂ + let h2C := finitePlaceHilbert_natCast_ne_zero ℚ (2 : ℕ+) + (by norm_num) v₂ + let hmuC := finitePlaceHilbert_primitiveRoots_nonempty ℚ (2 : ℕ+) + rationalQuadraticPrimitiveRoots_nonempty v₂ + let five : Cˣ := Units.mk0 (5 : C) + (finitePlaceHilbert_natCast_ne_zero ℚ (5 : ℕ+) (by norm_num) v₂) + have hneg : + localHilbertSymbol C (2 : ℕ+) h2C hmuC five (-five) = 1 := + localHilbertSymbol_neg_self C (2 : ℕ+) h2C hmuC five + have hdecomp : -five = (-1 : Cˣ) * five := by + apply Units.ext + change + -(5 : (HeightOneSpectrum.adicAbv ℚ v₂).Completion) = + (-1 : (HeightOneSpectrum.adicAbv ℚ v₂).Completion) * 5 + ring + rw [hdecomp, localHilbertSymbol_mul_right] at hneg + have hskew : + localHilbertSymbol C (2 : ℕ+) h2C hmuC five (-1 : Cˣ) = 1 := by + rw [localHilbertSymbol_skew, + rationalTwoAdicHilbert_negOne_five_eq_one, inv_one] + rw [hskew, one_mul] at hneg + exact hneg + +open scoped Classical in +/-- The rational global field unit represented by `-1`. -/ +def rationalQuadraticNegOneFieldUnit : ℚˣ := + nonzeroIntegralFieldUnit ℚ (-1 : 𝓞 ℚ) (by norm_num) + +open scoped Classical in +@[simp] +theorem rationalQuadraticNegOneFieldUnit_coe : + (rationalQuadraticNegOneFieldUnit : ℚ) = -1 := + rfl + +open scoped Classical in +private theorem rationalQuadraticNegOne_not_mem + (v : HeightOneSpectrum (𝓞 ℚ)) : + (-1 : 𝓞 ℚ) ∉ v.asIdeal := by + intro hneg + have hone : (1 : 𝓞 ℚ) ∈ v.asIdeal := by + simpa only [neg_neg] using v.asIdeal.neg_mem hneg + exact v.isPrime.ne_top ((Ideal.eq_top_iff_one v.asIdeal).mpr hone) + +open scoped Classical in +private theorem rationalFinitePlaceHilbert_negOne_negOne_eq_one_of_ne_two + (v : HeightOneSpectrum (𝓞 ℚ)) + (hv : v ≠ RayClass.rationalPrime rationalTwoPrime) : + finitePlaceHilbertSymbol ℚ (2 : ℕ+) (by norm_num) + rationalQuadraticPrimitiveRoots_nonempty v + rationalQuadraticNegOneFieldUnit + rationalQuadraticNegOneFieldUnit = 1 := by + apply finitePlaceHilbertSymbol_integral_units_eq_one + ℚ (2 : ℕ+) (by norm_num) + rationalQuadraticPrimitiveRoots_nonempty v + · rw [powerResidueExponentFinitePlaces_rational_two] + simpa only [Finset.mem_singleton] + · exact rationalQuadraticNegOne_not_mem v + · exact rationalQuadraticNegOne_not_mem v + +open scoped Classical in +/-- The finite-place Hilbert factor of `(-1,-1)` at the prime above two is +the negative quadratic root. The proof uses the global product formula; +all odd finite factors are trivial and the unique real factor is `-1`. -/ +theorem rationalFinitePlaceHilbert_negOne_negOne_eq_negOne : + finitePlaceHilbertSymbol ℚ (2 : ℕ+) (by norm_num) + rationalQuadraticPrimitiveRoots_nonempty + (RayClass.rationalPrime rationalTwoPrime) + rationalQuadraticNegOneFieldUnit + rationalQuadraticNegOneFieldUnit = + integralRootsOfUnityToNthRoots ℚ 2 + rationalQuadraticNegOneRoot := by + let negRoot : nthRootsSubgroup ℚ (((2 : ℕ+) : ℕ)) := + integralRootsOfUnityToNthRoots ℚ (((2 : ℕ+) : ℕ)) + rationalQuadraticNegOneRoot + have hinfinite : + (∏ v : InfinitePlace ℚ, + infinitePlaceHilbertSymbol ℚ (2 : ℕ+) + v rationalQuadraticNegOneFieldUnit + rationalQuadraticNegOneFieldUnit) = negRoot := by + rw [Fintype.prod_unique, + show (default : InfinitePlace ℚ) = Rat.infinitePlace by + exact Subsingleton.elim _ _] + apply Subtype.ext + have hreal := infinitePlaceHilbertSymbol_real_apply + ℚ (2 : ℕ+) Rat.infinitePlace + rationalQuadraticNegOneFieldUnit rationalQuadraticNegOneFieldUnit + rfl Rat.isReal_infinitePlace + have hneg : + InfinitePlace.embedding_of_isReal Rat.isReal_infinitePlace + (rationalQuadraticNegOneFieldUnit : ℚ) < 0 := by + rw [rationalQuadraticNegOneFieldUnit_coe, map_neg, map_one] + norm_num + rw [ite_eq_left ⟨hneg, hneg⟩] at hreal + have hreal' : + (infinitePlaceHilbertSymbol ℚ (2 : ℕ+) Rat.infinitePlace + rationalQuadraticNegOneFieldUnit + rationalQuadraticNegOneFieldUnit).1 = (-1 : ℚˣ) := by + simpa [rationalQuadraticNegOneFieldUnit] using hreal + have hnegRootVal : negRoot.1 = (-1 : ℚˣ) := by + apply Units.ext + change algebraMap (𝓞 ℚ) ℚ (-1 : 𝓞 ℚ) = (-1 : ℚ) + rw [map_neg, map_one] + exact hreal'.trans hnegRootVal.symm + have hfinite : + (∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + finitePlaceHilbertSymbol ℚ (2 : ℕ+) (by norm_num) + rationalQuadraticPrimitiveRoots_nonempty v + rationalQuadraticNegOneFieldUnit + rationalQuadraticNegOneFieldUnit) = + finitePlaceHilbertSymbol ℚ (2 : ℕ+) (by norm_num) + rationalQuadraticPrimitiveRoots_nonempty + (RayClass.rationalPrime rationalTwoPrime) + rationalQuadraticNegOneFieldUnit + rationalQuadraticNegOneFieldUnit := by + apply finprod_eq_single + intro v hv + exact + rationalFinitePlaceHilbert_negOne_negOne_eq_one_of_ne_two v hv + have hproduct := hilbertSymbol_allPlaces_product_eq_one + ℚ (2 : ℕ+) (by norm_num) + rationalQuadraticPrimitiveRoots_nonempty + rationalQuadraticNegOneFieldUnit + rationalQuadraticNegOneFieldUnit + rw [hinfinite, hfinite] at hproduct + have hnegRootSquare : negRoot * negRoot = 1 := by + have hroot : negRoot.1 ^ (((2 : ℕ+) : ℕ)) = (1 : ℚˣ) := + (KummerTheory.mem_nthRootsSubgroup_iff ℚ).mp negRoot.2 + change negRoot.1 ^ 2 = (1 : ℚˣ) at hroot + apply Subtype.ext + change negRoot.1 * negRoot.1 = (1 : ℚˣ) + simpa only [pow_two] using hroot + let twoFactor := + finitePlaceHilbertSymbol ℚ (2 : ℕ+) (by norm_num) + rationalQuadraticPrimitiveRoots_nonempty + (RayClass.rationalPrime rationalTwoPrime) + rationalQuadraticNegOneFieldUnit rationalQuadraticNegOneFieldUnit + change twoFactor = negRoot + calc + twoFactor = 1 * twoFactor := (one_mul twoFactor).symm + _ = (negRoot * negRoot) * twoFactor := by rw [hnegRootSquare] + _ = negRoot * (negRoot * twoFactor) := mul_assoc _ _ _ + _ = negRoot := by rw [hproduct, mul_one] + +open scoped Classical in +/-- In the canonical dyadic completion, the local quadratic Hilbert symbol +of `(-1,-1)` is `-1`. -/ +theorem rationalTwoAdicHilbert_negOne_negOne_eq_negOne : + let v₂ := RayClass.rationalPrime rationalTwoPrime + let C := (HeightOneSpectrum.adicAbv ℚ v₂).Completion + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v₂ + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v₂ + localHilbertSymbol C (2 : ℕ+) + (finitePlaceHilbert_natCast_ne_zero ℚ (2 : ℕ+) + (by norm_num) v₂) + (finitePlaceHilbert_primitiveRoots_nonempty ℚ (2 : ℕ+) + rationalQuadraticPrimitiveRoots_nonempty v₂) + (-1 : Cˣ) (-1 : Cˣ) = + (⟨(-1 : Cˣ), by + apply (KummerTheory.mem_nthRootsSubgroup_iff C).mpr + change + ((-1 : (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime rationalTwoPrime)).Completionˣ)) ^ 2 = 1 + norm_num⟩ : nthRootsSubgroup C 2) := by + dsimp only + let v₂ := RayClass.rationalPrime rationalTwoPrime + let C := (HeightOneSpectrum.adicAbv ℚ v₂).Completion + let : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v₂ + let : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v₂ + let hn : ((((2 : ℕ+) : ℕ)) : ℚ) ≠ 0 := by norm_num + have hmap := finitePlaceHilbertSymbol_map_eq_localHilbertSymbol + ℚ (2 : ℕ+) hn rationalQuadraticPrimitiveRoots_nonempty + (RayClass.rationalPrime rationalTwoPrime) + rationalQuadraticNegOneFieldUnit rationalQuadraticNegOneFieldUnit + rw [rationalFinitePlaceHilbert_negOne_negOne_eq_negOne] at hmap + have hmappedNeg : + nthRootsSubgroupMap ℚ + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime rationalTwoPrime)).Completion 2 + (integralRootsOfUnityToNthRoots ℚ 2 + rationalQuadraticNegOneRoot) = + (⟨(-1 : (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime rationalTwoPrime)).Completionˣ), by + apply (KummerTheory.mem_nthRootsSubgroup_iff _).mpr + norm_num⟩ : nthRootsSubgroup _ 2) := by + apply Subtype.ext + apply Units.ext + change + algebraMap ℚ (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime rationalTwoPrime)).Completion (-1) = -1 + rw [map_neg, map_one] + have hnegC : + finitePlaceHilbertCompletionUnit ℚ + (RayClass.rationalPrime rationalTwoPrime) + rationalQuadraticNegOneFieldUnit = + (-1 : (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime rationalTwoPrime)).Completionˣ) := by + apply Units.ext + change + algebraMap ℚ (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime rationalTwoPrime)).Completion (-1) = -1 + rw [map_neg, map_one] + have hresult := hmap.symm.trans hmappedNeg + unfold finitePlaceLocalHilbertSymbol at hresult + rw [hnegC] at hresult + exact hresult + +open scoped Classical in +/-- Explicit dyadic quadratic Hilbert-symbol formula for positive odd +rational integers. -/ +theorem rationalTwoAdicHilbert_odd_eq_classicalSign + (a b : ℕ) (ha : Odd a) (hb : Odd b) : + let v₂ := RayClass.rationalPrime rationalTwoPrime + let C := (HeightOneSpectrum.adicAbv ℚ v₂).Completion + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v₂ + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v₂ + localHilbertSymbol C (2 : ℕ+) + (finitePlaceHilbert_natCast_ne_zero ℚ (2 : ℕ+) + (by norm_num) v₂) + (finitePlaceHilbert_primitiveRoots_nonempty ℚ (2 : ℕ+) + rationalQuadraticPrimitiveRoots_nonempty v₂) + (finitePlaceHilbertCompletionUnit ℚ v₂ + (rationalNaturalFieldUnit a (by + intro ha0 + subst a + norm_num at ha))) + (finitePlaceHilbertCompletionUnit ℚ v₂ + (rationalNaturalFieldUnit b (by + intro hb0 + subst b + norm_num at hb))) = + (⟨(-1 : Cˣ), by + apply (KummerTheory.mem_nthRootsSubgroup_iff C).mpr + change + (-1 : (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime rationalTwoPrime)).Completionˣ) ^ 2 = 1 + norm_num⟩ : nthRootsSubgroup C 2) ^ + (a / 2 * (b / 2)) := by + dsimp only + let v₂ := RayClass.rationalPrime rationalTwoPrime + let C := (HeightOneSpectrum.adicAbv ℚ v₂).Completion + let : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v₂ + let : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v₂ + let h2C := finitePlaceHilbert_natCast_ne_zero ℚ (2 : ℕ+) + (by norm_num) v₂ + let hmuC := finitePlaceHilbert_primitiveRoots_nonempty ℚ (2 : ℕ+) + rationalQuadraticPrimitiveRoots_nonempty v₂ + have ha0 : a ≠ 0 := by + intro ha0 + subst a + norm_num at ha + have hb0 : b ≠ 0 := by + intro hb0 + subst b + norm_num at hb + let aC := finitePlaceHilbertCompletionUnit ℚ v₂ + (rationalNaturalFieldUnit a ha0) + let bC := finitePlaceHilbertCompletionUnit ℚ v₂ + (rationalNaturalFieldUnit b hb0) + let fiveC : Cˣ := Units.mk0 (5 : C) + (finitePlaceHilbert_natCast_ne_zero ℚ (5 : ℕ+) (by norm_num) v₂) + let negRootC : nthRootsSubgroup C 2 := ⟨(-1 : Cˣ), by + apply (KummerTheory.mem_nthRootsSubgroup_iff C).mpr + change + (-1 : (HeightOneSpectrum.adicAbv ℚ v₂).Completionˣ) ^ 2 = 1 + norm_num⟩ + obtain ⟨r, hr⟩ := rationalTwoAdicOddUnit_squareClass a ha + obtain ⟨s, hs⟩ := rationalTwoAdicOddUnit_squareClass b hb + exact localQuadraticHilbertSymbol_squareClass_formula + C h2C hmuC (-1 : Cˣ) fiveC aC bC r s + (a / 2) (b / 2) negRootC + rationalTwoAdicHilbert_negOne_negOne_eq_negOne + rationalTwoAdicHilbert_negOne_five_eq_one + rationalTwoAdicHilbert_five_five_eq_one hr hs + +open scoped Classical in +/-- The global finite-place Hilbert factor at two is the classical quadratic +sign for positive odd rational integers. -/ +theorem rationalFinitePlaceHilbert_odd_eq_classicalSign + (a b : ℕ) (ha : Odd a) (hb : Odd b) : + finitePlaceHilbertSymbol ℚ (2 : ℕ+) (by norm_num) + rationalQuadraticPrimitiveRoots_nonempty + (RayClass.rationalPrime rationalTwoPrime) + (rationalNaturalFieldUnit a (by + intro ha0 + subst a + norm_num at ha)) + (rationalNaturalFieldUnit b (by + intro hb0 + subst b + norm_num at hb)) = + integralRootsOfUnityToNthRoots ℚ 2 + (rationalQuadraticNegOneRoot ^ (a / 2 * (b / 2))) := by + have ha0 : a ≠ 0 := by + intro ha0 + subst a + norm_num at ha + have hb0 : b ≠ 0 := by + intro hb0 + subst b + norm_num at hb + let hn : ((2 : ℕ) : ℚ) ≠ 0 := by norm_num + let v₂ := RayClass.rationalPrime rationalTwoPrime + change finitePlaceHilbertSymbol ℚ (2 : ℕ+) hn + rationalQuadraticPrimitiveRoots_nonempty v₂ + (rationalNaturalFieldUnit a ha0) + (rationalNaturalFieldUnit b hb0) = _ + apply nthRootsSubgroupMap_injective ℚ + (HeightOneSpectrum.adicAbv ℚ v₂).Completion 2 + have hmap := finitePlaceHilbertSymbol_map_eq_localHilbertSymbol + ℚ (2 : ℕ+) hn rationalQuadraticPrimitiveRoots_nonempty v₂ + (rationalNaturalFieldUnit a ha0) (rationalNaturalFieldUnit b hb0) + have hlocal := rationalTwoAdicHilbert_odd_eq_classicalSign a b ha hb + dsimp only at hlocal + have hrootMap : + nthRootsSubgroupMap ℚ + (HeightOneSpectrum.adicAbv ℚ v₂).Completion 2 + (integralRootsOfUnityToNthRoots ℚ 2 + (rationalQuadraticNegOneRoot ^ (a / 2 * (b / 2)))) = + (⟨(-1 : (HeightOneSpectrum.adicAbv ℚ v₂).Completionˣ), by + apply (KummerTheory.mem_nthRootsSubgroup_iff _).mpr + norm_num⟩ : nthRootsSubgroup _ 2) ^ + (a / 2 * (b / 2)) := by + apply Subtype.ext + change + Units.map (algebraMap ℚ + (HeightOneSpectrum.adicAbv ℚ v₂).Completion).toMonoidHom + (Units.map (algebraMap (𝓞 ℚ) ℚ).toMonoidHom + ((-1 : (𝓞 ℚ)ˣ) ^ (a / 2 * (b / 2)))) = + (-1 : (HeightOneSpectrum.adicAbv ℚ v₂).Completionˣ) ^ + (a / 2 * (b / 2)) + rw [map_pow, map_pow] + congr 1 + apply Units.ext + simp + have hlocal' : + finitePlaceLocalHilbertSymbol ℚ (2 : ℕ+) hn + rationalQuadraticPrimitiveRoots_nonempty v₂ + (rationalNaturalFieldUnit a ha0) + (rationalNaturalFieldUnit b hb0) = + (⟨(-1 : (HeightOneSpectrum.adicAbv ℚ v₂).Completionˣ), by + apply (KummerTheory.mem_nthRootsSubgroup_iff _).mpr + norm_num⟩ : nthRootsSubgroup _ 2) ^ + (a / 2 * (b / 2)) := by + unfold finitePlaceLocalHilbertSymbol + exact hlocal + exact hmap.trans (hlocal'.trans hrootMap.symm) + +open scoped Classical in +private theorem rationalInfinitePlaceHilbert_natural_eq_one + (a b : ℕ) (ha : a ≠ 0) (hb : b ≠ 0) + (v : InfinitePlace ℚ) : + infinitePlaceHilbertSymbol ℚ (2 : ℕ+) v + (rationalNaturalFieldUnit a ha) + (rationalNaturalFieldUnit b hb) = 1 := by + have hv : v = Rat.infinitePlace := Subsingleton.elim _ _ + subst v + have haPos : + 0 < InfinitePlace.embedding_of_isReal Rat.isReal_infinitePlace + (rationalNaturalFieldUnit a ha : ℚ) := by + rw [rationalNaturalFieldUnit_coe] + simpa only [map_natCast] using + (Nat.cast_pos.mpr (Nat.pos_of_ne_zero ha) : (0 : ℝ) < (a : ℝ)) + apply Subtype.ext + have hreal := infinitePlaceHilbertSymbol_real_apply + ℚ (2 : ℕ+) Rat.infinitePlace + (rationalNaturalFieldUnit a ha) (rationalNaturalFieldUnit b hb) + rfl Rat.isReal_infinitePlace + have hnot : + ¬(InfinitePlace.embedding_of_isReal Rat.isReal_infinitePlace + (rationalNaturalFieldUnit a ha : ℚ) < 0 ∧ + InfinitePlace.embedding_of_isReal Rat.isReal_infinitePlace + (rationalNaturalFieldUnit b hb : ℚ) < 0) := + fun h => (not_lt_of_ge haPos.le) h.1 + rw [ite_eq_right hnot] at hreal + exact hreal + +open scoped Classical in +/-- Evaluation of the complete rational quadratic bad-place correction. +For positive odd inputs the infinite factor is trivial, and the sole finite +bad place is `2`, whose wild Hilbert symbol gives the classical sign. -/ +theorem rationalQuadraticBadPlaceCorrection_eq_classicalSign + (a b : ℕ) (ha : Odd a) (hb : Odd b) : + powerResidueBadPlaceCorrection ℚ (2 : ℕ+) (by norm_num) + rationalQuadraticPrimitiveRoots_nonempty + (rationalNaturalFieldUnit a (by + intro ha0 + subst a + norm_num at ha)) + (rationalNaturalFieldUnit b (by + intro hb0 + subst b + norm_num at hb)) = + integralRootsOfUnityToNthRoots ℚ 2 + (rationalQuadraticNegOneRoot ^ (a / 2 * (b / 2))) := by + have ha0 : a ≠ 0 := by + intro ha0 + subst a + norm_num at ha + have hb0 : b ≠ 0 := by + intro hb0 + subst b + norm_num at hb + let hn : ((((2 : ℕ+) : ℕ)) : ℚ) ≠ 0 := by norm_num + change powerResidueBadPlaceCorrection ℚ (2 : ℕ+) hn + rationalQuadraticPrimitiveRoots_nonempty + (rationalNaturalFieldUnit a ha0) + (rationalNaturalFieldUnit b hb0) = _ + unfold powerResidueBadPlaceCorrection + have hinfinite : + (∏ v : InfinitePlace ℚ, + infinitePlaceHilbertSymbol ℚ (2 : ℕ+) v + (rationalNaturalFieldUnit a ha0) + (rationalNaturalFieldUnit b hb0)) = 1 := by + apply Finset.prod_eq_one + intro v _ + exact rationalInfinitePlaceHilbert_natural_eq_one a b ha0 hb0 v + rw [hinfinite, one_mul, + powerResidueExponentFinitePlaces_rational_two, + Finset.prod_singleton, + rationalFinitePlaceHilbert_odd_eq_classicalSign a b ha hb] + +open scoped Classical in +/-- Every prime divisor of an odd rational principal ideal is away from the +quadratic exponent place. -/ +theorem rationalPrincipalIdeal_primeDivisors_away_from_two + (m : ℕ) (hm : Odd m) + (P : HeightOneSpectrum (𝓞 ℚ)) + (hP : P.asIdeal ∣ rationalPrincipalIdeal m) : + P ∉ powerResidueExponentFinitePlaces ℚ (2 : ℕ+) := by + rw [powerResidueExponentFinitePlaces_rational_two, + Finset.mem_singleton] + intro hPtwo + subst P + have htwoDvd : 2 ∣ m := + (rationalPrime_dvd_rationalPrincipalIdeal_iff + rationalTwoPrime m).mp hP + exact hm.not_two_dvd_nat htwoDvd + +open scoped Classical in +/-- Gauss reciprocity derived from the global power-residue reciprocity +theorem, including the explicitly evaluated dyadic correction. The proof +does not invoke the pre-existing quadratic-reciprocity theorem. -/ +theorem gaussReciprocity_nat_from_powerResidueReciprocity + {a b : ℕ} (ha : Odd a) (hb : Odd b) (hab : a.Coprime b) : + J((a : ℤ) | b) * J((b : ℤ) | a) = + (-1 : ℤ) ^ (a / 2 * (b / 2)) := by + have ha0 : a ≠ 0 := by + intro ha0 + subst a + norm_num at ha + have hb0 : b ≠ 0 := by + intro hb0 + subst b + norm_num at hb + let aO : 𝓞 ℚ := rationalNatInteger a + let bO : 𝓞 ℚ := rationalNatInteger b + have haO0 : aO ≠ 0 := by + intro h + exact (Int.ofNat_ne_zero.mpr ha0) (by + simpa [aO] using congrArg Rat.ringOfIntegersEquiv h) + have hbO0 : bO ≠ 0 := by + intro h + exact (Int.ofNat_ne_zero.mpr hb0) (by + simpa [bO] using congrArg Rat.ringOfIntegersEquiv h) + have hspanA : Ideal.span {aO} = rationalPrincipalIdeal a := rfl + have hspanB : Ideal.span {bO} = rationalPrincipalIdeal b := rfl + have haB : + ∀ P : HeightOneSpectrum (𝓞 ℚ), + P.asIdeal ∣ Ideal.span {bO} → aO ∉ P.asIdeal := by + intro P hP + apply rationalPrincipalIdeal_numerator_not_mem_of_coprime aO b + · simpa [aO] using hab + · simpa only [hspanB] using hP + have hbA : + ∀ P : HeightOneSpectrum (𝓞 ℚ), + P.asIdeal ∣ Ideal.span {aO} → bO ∉ P.asIdeal := by + intro P hP + apply rationalPrincipalIdeal_numerator_not_mem_of_coprime bO a + · simpa [bO, Nat.coprime_comm] using hab + · simpa only [hspanA] using hP + have hrec := + idealPowerResidueSymbol_reciprocity_with_bad_place_correction + ℚ (2 : ℕ+) (by norm_num) + rationalQuadraticPrimitiveRoots_nonempty + aO bO haO0 hbO0 + (fun P hP => by + apply rationalPrincipalIdeal_absNorm_coprime_two_of_odd a ha P + simpa only [hspanA] using hP) + (fun P hP => by + apply rationalPrincipalIdeal_absNorm_coprime_two_of_odd b hb P + simpa only [hspanB] using hP) + haB hbA + (fun P hP => + rationalPrincipalIdeal_primeDivisors_away_from_two a ha P + (by simpa only [hspanA] using hP)) + (fun P hP => + rationalPrincipalIdeal_primeDivisors_away_from_two b hb P + (by simpa only [hspanB] using hP)) + let symbolAB := + idealPowerResidueSymbol ℚ (rationalPrincipalIdeal b) + (rationalPrincipalIdeal_ne_zero b hb0) + (2 : ℕ+) rationalQuadraticPrimitiveRoots_nonempty aO + (rationalPrincipalIdeal_absNorm_coprime_two_of_odd b hb) + (rationalPrincipalIdeal_numerator_not_mem_of_coprime aO b + (by simpa [aO] using hab)) + let symbolBA := + idealPowerResidueSymbol ℚ (rationalPrincipalIdeal a) + (rationalPrincipalIdeal_ne_zero a ha0) + (2 : ℕ+) rationalQuadraticPrimitiveRoots_nonempty bO + (rationalPrincipalIdeal_absNorm_coprime_two_of_odd a ha) + (rationalPrincipalIdeal_numerator_not_mem_of_coprime bO a + (by simpa [bO, Nat.coprime_comm] using hab)) + let negPow : rootsOfUnity (((2 : ℕ+) : ℕ)) (𝓞 ℚ) := + rationalQuadraticNegOneRoot ^ (a / 2 * (b / 2)) + have hcorrection : + powerResidueBadPlaceCorrection ℚ (2 : ℕ+) (by norm_num) + rationalQuadraticPrimitiveRoots_nonempty + (nonzeroIntegralFieldUnit ℚ aO haO0) + (nonzeroIntegralFieldUnit ℚ bO hbO0) = + integralRootsOfUnityToNthRoots ℚ (((2 : ℕ+) : ℕ)) negPow := by + have hc := rationalQuadraticBadPlaceCorrection_eq_classicalSign a b ha hb + unfold rationalNaturalFieldUnit at hc + change + powerResidueBadPlaceCorrection ℚ (2 : ℕ+) (by norm_num) + rationalQuadraticPrimitiveRoots_nonempty + (nonzeroIntegralFieldUnit ℚ aO haO0) + (nonzeroIntegralFieldUnit ℚ bO hbO0) = _ + exact hc + have hnegInv : + (integralRootsOfUnityToNthRoots ℚ (((2 : ℕ+) : ℕ)) negPow)⁻¹ = + integralRootsOfUnityToNthRoots ℚ (((2 : ℕ+) : ℕ)) negPow := by + apply inv_eq_of_mul_eq_one_right + have hroot : + (integralRootsOfUnityToNthRoots ℚ (((2 : ℕ+) : ℕ)) negPow).1 ^ + (((2 : ℕ+) : ℕ)) = (1 : ℚˣ) := + (KummerTheory.mem_nthRootsSubgroup_iff ℚ).mp + (integralRootsOfUnityToNthRoots ℚ (((2 : ℕ+) : ℕ)) negPow).2 + change + integralRootsOfUnityToNthRoots ℚ (((2 : ℕ+) : ℕ)) negPow * + integralRootsOfUnityToNthRoots ℚ (((2 : ℕ+) : ℕ)) negPow = 1 + apply Subtype.ext + change + (integralRootsOfUnityToNthRoots ℚ (((2 : ℕ+) : ℕ)) negPow).1 * + (integralRootsOfUnityToNthRoots ℚ (((2 : ℕ+) : ℕ)) negPow).1 = + (1 : ℚˣ) + change + (integralRootsOfUnityToNthRoots ℚ (((2 : ℕ+) : ℕ)) negPow).1 ^ 2 = + (1 : ℚˣ) at hroot + simpa only [pow_two] using hroot + have hroot : symbolAB = negPow * symbolBA := by + apply integralRootsOfUnityToNthRoots_injective ℚ (((2 : ℕ+) : ℕ)) + rw [map_mul] + calc + integralRootsOfUnityToNthRoots ℚ (((2 : ℕ+) : ℕ)) symbolAB = + (powerResidueBadPlaceCorrection ℚ (2 : ℕ+) (by norm_num) + rationalQuadraticPrimitiveRoots_nonempty + (nonzeroIntegralFieldUnit ℚ aO haO0) + (nonzeroIntegralFieldUnit ℚ bO hbO0))⁻¹ * + integralRootsOfUnityToNthRoots ℚ (((2 : ℕ+) : ℕ)) symbolBA := by + simpa only [hspanA, hspanB, symbolAB, symbolBA] using hrec + _ = integralRootsOfUnityToNthRoots ℚ (((2 : ℕ+) : ℕ)) negPow * + integralRootsOfUnityToNthRoots ℚ (((2 : ℕ+) : ℕ)) symbolBA := by + rw [hcorrection, hnegInv] + have hvalue := congrArg rationalQuadraticRootValuePNatMonoidHom hroot + have hAB : rationalQuadraticRootValue symbolAB = J((a : ℤ) | b) := by + simpa only [symbolAB, aO, rationalNatInteger_equiv] using + rationalIdealPowerResidueSymbol_two_eq_jacobiSym + aO b hb0 hb (by simpa [aO] using hab) + have hBA : rationalQuadraticRootValue symbolBA = J((b : ℤ) | a) := by + simpa only [symbolBA, bO, rationalNatInteger_equiv] using + rationalIdealPowerResidueSymbol_two_eq_jacobiSym + bO a ha0 ha (by simpa [bO, Nat.coprime_comm] using hab) + have hnegValue : + rationalQuadraticRootValue negPow = + (-1 : ℤ) ^ (a / 2 * (b / 2)) := by + change rationalQuadraticRootValueMonoidHom + (rationalQuadraticNegOneRoot ^ (a / 2 * (b / 2))) = _ + rw [map_pow, rationalQuadraticRootValueMonoidHom_apply, + rationalQuadraticRootValue_negOneRoot] + have hlinear : + J((a : ℤ) | b) = + (-1 : ℤ) ^ (a / 2 * (b / 2)) * J((b : ℤ) | a) := by + unfold rationalQuadraticRootValuePNatMonoidHom at hvalue + rw [map_mul] at hvalue + change + rationalQuadraticRootValue symbolAB = + rationalQuadraticRootValue negPow * + rationalQuadraticRootValue symbolBA at hvalue + rw [hAB, hBA, hnegValue] at hvalue + exact hvalue + have hsq : J((b : ℤ) | a) ^ 2 = 1 := by + apply jacobiSym.sq_one + simpa [Int.gcd_eq_natAbs] using hab.symm.gcd_eq_one + calc + J((a : ℤ) | b) * J((b : ℤ) | a) = + ((-1 : ℤ) ^ (a / 2 * (b / 2)) * J((b : ℤ) | a)) * + J((b : ℤ) | a) := by rw [hlinear] + _ = (-1 : ℤ) ^ (a / 2 * (b / 2)) * + J((b : ℤ) | a) ^ 2 := by ring + _ = (-1 : ℤ) ^ (a / 2 * (b / 2)) := by rw [hsq, mul_one] + +open scoped Classical in +/-- The CFT-derived theorem agrees propositionally with the existing library +statement. This comparison is the only place where the pre-existing theorem +is mentioned. -/ +theorem gaussReciprocity_nat_from_powerResidueReciprocity_eq_mathlib + {a b : ℕ} (ha : Odd a) (hb : Odd b) (hab : a.Coprime b) : + gaussReciprocity_nat_from_powerResidueReciprocity ha hb hab = + AlgebraicNumberTheory.PowerResidueSymbols.gaussReciprocity_nat + ha hb hab := by + apply Subsingleton.elim + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidue.lean new file mode 100644 index 0000000000..d37aa29ec3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidue.lean @@ -0,0 +1,171 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +public import Mathlib.FieldTheory.KrullTopology +public import Mathlib.Topology.Algebra.Group.Quotient +/-! +# Topological global norm-residue reciprocity + +For a finite abelian extension of number fields, the genuine +idele-class norm range is open in the ordinary idele-class topology. +Hence its native quotient topology is discrete. The finite Krull +Galois group is discrete as well, so the algebraic global norm-residue +equivalence upgrades to a homeomorphic multiplicative equivalence. + +This file also bundles the quotient map and the global norm-residue map +as continuous homomorphisms, and proves that forgetting their topology +recovers the previously constructed actual global norm-residue symbol. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +/-- Fix the canonical class-group dictionary before bundling norm-quotient maps. -/ +@[instance_reducible] +private noncomputable def topologicalNormResidueIdeleClassCommGroup + (F : Type) [Field F] [NumberField F] : + CommGroup (IdeleClassGroup F) := + QuotientGroup.Quotient.commGroup (IdeleGroup.principalSubgroup F) + +attribute [local instance] topologicalNormResidueIdeleClassCommGroup + +private theorem topologicalNormResidueIdeleClassIsMulCommutative + (F : Type) [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + IsMulCommutative.of_comm (fun a b => mul_comm a b) + +attribute [local instance] topologicalNormResidueIdeleClassIsMulCommutative + +variable + (K L : Type) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + +/-- The native quotient topology on +`C_K / N_{L/K}(C_L)` is discrete because the genuine ordinary +idele-class norm range is open. -/ +theorem ideleClassNormQuotient_discreteTopology : + DiscreteTopology + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + apply QuotientGroup.discreteTopology + exact + GlobalClassFields.ideleClassNorm_range_isOpen + (K := K) (L := L) + +/-- Global norm-residue reciprocity as a homeomorphic multiplicative +equivalence between the native norm quotient and the finite Krull +Galois group. Both directions are continuous in their genuine +topologies. -/ +noncomputable def globalNormResidueContinuousMulEquiv : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≃ₜ* + Gal(L/K) := by + let : DiscreteTopology + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + ideleClassNormQuotient_discreteTopology K L + let e : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≃* + Gal(L/K) := + AddEquiv.toMultiplicative + (globalNormResidueEquiv K L) + exact + { e with + continuous_toFun := continuous_of_discreteTopology + continuous_invFun := continuous_of_discreteTopology } + +/-- Evaluation of the topological norm-residue equivalence is the +existing actual norm-residue equivalence on the same quotient class. -/ +@[simp] +theorem globalNormResidueContinuousMulEquiv_apply + (c : + IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) : + globalNormResidueContinuousMulEquiv K L c = + Additive.toMul + (globalNormResidueEquiv K L + (Additive.ofMul c)) := by + rfl + +/-- Global reciprocity in the direction used by the class-field +correspondence, + +`Gal(L / K) ≃ₜ* C_K / N_{L/K}(C_L)`. + +This is the inverse of the norm-residue equivalence as a +`ContinuousMulEquiv`, so the Krull topology on the finite Galois group +and the native quotient topology on the idele-class quotient are part +of the public statement. -/ +noncomputable def globalReciprocityContinuousMulEquiv : + Gal(L/K) ≃ₜ* + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + (globalNormResidueContinuousMulEquiv K L).symm + +/-- Evaluation of topological global reciprocity is the inverse of the +actual norm-residue equivalence, with no additional choice of an +abstract group isomorphism. -/ +@[simp] +theorem globalReciprocityContinuousMulEquiv_apply + (σ : Gal(L/K)) : + globalReciprocityContinuousMulEquiv K L σ = + Additive.toMul + ((globalNormResidueEquiv K L).symm + (Additive.ofMul σ)) := by + rfl + +/-- The genuine quotient map +`C_K → C_K / N_{L/K}(C_L)`, bundled with continuity for the native +ordinary quotient topology. -/ +noncomputable def ideleClassNormQuotientContinuousMonoidHom : + IdeleClassGroup K →ₜ* + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + { QuotientGroup.mk' + (_root_.ideleClassNorm K L).range with + continuous_toFun := QuotientGroup.continuous_mk } + +/-- The actual global norm-residue map, bundled as a continuous +homomorphism on the ordinary idele-class topology. -/ +noncomputable def globalNormResidueContinuousMonoidHom : + IdeleClassGroup K →ₜ* Gal(L/K) := + (ContinuousMonoidHom.toContinuousMonoidHom + (globalNormResidueContinuousMulEquiv K L)).comp + (ideleClassNormQuotientContinuousMonoidHom K L) + +/-- Evaluation of the continuous global norm-residue map agrees with +the existing actual global norm-residue symbol. -/ +@[simp] +theorem globalNormResidueContinuousMonoidHom_apply + (c : IdeleClassGroup K) : + globalNormResidueContinuousMonoidHom K L c = + globalNormResidueMonoidHom K L c := by + rfl + +/-- The existing actual global norm-residue homomorphism is continuous +for the ordinary idele-class topology and the finite Krull topology. -/ +theorem globalNormResidueMonoidHom_continuous : + Continuous (globalNormResidueMonoidHom K L) := + (globalNormResidueContinuousMonoidHom K L).continuous.congr + (fun c => + globalNormResidueContinuousMonoidHom_apply K L c) + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean new file mode 100644 index 0000000000..f378922f67 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean @@ -0,0 +1,193 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianization +public import Mathlib.FieldTheory.KrullTopology +public import Mathlib.Topology.Algebra.Group.Quotient +/-! +# Topological global reciprocity for finite Galois extensions + +For a finite Galois extension `L / K`, global norm-residue reciprocity +identifies the native idele-class norm quotient with the abelianization +of the finite Krull Galois group. This file records the identification +as a `ContinuousMulEquiv` in both mathematical directions: + +* norm-residue: `C_K / N_{L/K}(C_L) ≃ₜ* Gal(L / K)ᵃᵇ`; +* reciprocity: `Gal(L / K)ᵃᵇ ≃ₜ* C_K / N_{L/K}(C_L)`. + +The evaluation lemmas below ensure that these are the already +constructed actual global symbols, rather than unrelated abstract +isomorphisms between finite groups. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField +open NumberField + +noncomputable +section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +variable + (K L : Type) [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- Keep quotient normality out of every exported declaration type. -/ +local instance + topologicalGlobalNormResidueAbelianization_ideleClassGroupIsMulCommutative : + IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +/-- `Abelianization` is an opaque quotient alias, so install its native +quotient topology explicitly before asking for topological properties. -/ +local instance + topologicalGlobalNormResidueAbelianizationGaloisAbelianizationTopology : + TopologicalSpace (Abelianization (Gal(L/K))) := by + change + TopologicalSpace + (Gal(L/K) ⧸ commutator (Gal(L/K))) + infer_instance + +/-- The native topology on the actual idele-class norm quotient is +discrete. The openness used here is the genuine ordinary norm-range +theorem for the given finite Galois extension. -/ +theorem ideleClassNormAbelianizationQuotient_discreteTopology : + DiscreteTopology + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := by + apply QuotientGroup.discreteTopology + exact + GlobalClassFields.ideleClassNorm_range_isOpen + (K := K) (L := L) + +omit [NumberField K] [NumberField L] [IsGalois K L] in +/-- The abelianization of a finite Krull Galois group carries the +discrete quotient topology. -/ +theorem finiteGaloisAbelianization_discreteTopology : + DiscreteTopology + (Abelianization (Gal(L/K))) := by + change + DiscreteTopology + (Gal(L/K) ⧸ + commutator (Gal(L/K))) + apply QuotientGroup.discreteTopology + exact isOpen_discrete _ + +local instance + topologicalGlobalNormResidueAbelianization_normQuotientDiscreteTopology : + DiscreteTopology + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + ideleClassNormAbelianizationQuotient_discreteTopology K L + +local instance + topologicalGlobalNormResidueAbelianization_galoisAbelianizationDiscreteTopology : + DiscreteTopology (Abelianization (Gal(L/K))) := + finiteGaloisAbelianization_discreteTopology K L + +/-- The full finite-Galois norm-residue isomorphism with its native +topologies: + +`C_K / N_{L/K}(C_L) ≃ₜ* Gal(L / K)ᵃᵇ`. -/ +noncomputable def globalNormResidueAbelianizationContinuousMulEquiv : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≃ₜ* + Abelianization (Gal(L/K)) := by + let e : + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) ≃* + Abelianization (Gal(L/K)) := + AddEquiv.toMultiplicative + (globalNormResidueAbelianizationEquiv K L) + exact + { e with + continuous_toFun := continuous_of_discreteTopology + continuous_invFun := continuous_of_discreteTopology } + +/-- Evaluation of the topological finite-Galois norm-residue +equivalence is the previously constructed actual norm-residue +equivalence. -/ +@[simp] +theorem globalNormResidueAbelianizationContinuousMulEquiv_apply + (c : + IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) : + globalNormResidueAbelianizationContinuousMulEquiv K L c = + Additive.toMul + (globalNormResidueAbelianizationEquiv K L + (Additive.ofMul c)) := by + rfl + +/-- Global reciprocity for a finite Galois extension in the direction +used by the class-field correspondence: + +`Gal(L / K)ᵃᵇ ≃ₜ* C_K / N_{L/K}(C_L)`. -/ +noncomputable def globalReciprocityAbelianizationContinuousMulEquiv : + Abelianization (Gal(L/K)) ≃ₜ* + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + (globalNormResidueAbelianizationContinuousMulEquiv K L).symm + +/-- Evaluation in the reciprocity direction is exactly the inverse +actual finite-Galois norm-residue map. -/ +@[simp] +theorem globalReciprocityAbelianizationContinuousMulEquiv_apply + (σ : Abelianization (Gal(L/K))) : + globalReciprocityAbelianizationContinuousMulEquiv K L σ = + Additive.toMul + ((globalNormResidueAbelianizationEquiv K L).symm + (Additive.ofMul σ)) := by + rfl + +/-- The native quotient projection +`C_K → C_K / N_{L/K}(C_L)` as a continuous homomorphism. -/ +noncomputable def + ideleClassNormAbelianizationQuotientContinuousMonoidHom : + IdeleClassGroup K →ₜ* + (IdeleClassGroup K ⧸ + (_root_.ideleClassNorm K L).range) := + { QuotientGroup.mk' + (_root_.ideleClassNorm K L).range with + continuous_toFun := QuotientGroup.continuous_mk } + +/-- The global norm-residue symbol +`C_K → Gal(L / K)ᵃᵇ` as a continuous homomorphism in the natural +idele-class and finite Krull quotient topologies. -/ +noncomputable def + globalNormResidueAbelianizationContinuousMonoidHom : + IdeleClassGroup K →ₜ* + Abelianization (Gal(L/K)) := + (ContinuousMonoidHom.toContinuousMonoidHom + (globalNormResidueAbelianizationContinuousMulEquiv K L)).comp + (ideleClassNormAbelianizationQuotientContinuousMonoidHom K L) + +/-- Forgetting continuity from the topological finite-Galois +norm-residue map recovers the previously constructed actual symbol. -/ +@[simp] +theorem globalNormResidueAbelianizationContinuousMonoidHom_apply + (c : IdeleClassGroup K) : + globalNormResidueAbelianizationContinuousMonoidHom K L c = + globalNormResidueAbelianizationMonoidHom K L c := by + rfl + +/-- The actual finite-Galois norm-residue symbol is continuous. -/ +theorem globalNormResidueAbelianizationMonoidHom_continuous : + Continuous + (globalNormResidueAbelianizationMonoidHom K L) := + (globalNormResidueAbelianizationContinuousMonoidHom K L).continuous.congr + (fun c => + globalNormResidueAbelianizationContinuousMonoidHom_apply + K L c) + +end Reciprocity +end GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/HasseArf.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/HasseArf.lean new file mode 100644 index 0000000000..c9b56c752f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/HasseArf.lean @@ -0,0 +1,1338 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsUpperRamificationJump +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsLowerRamificationJump +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.AbelianGaloisEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ShrinkTransport +public import Mathlib.Algebra.Algebra.Shrink +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.AbstractUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Compositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristicStandardCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.FiniteAbelian +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.StandardCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Unramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified +public import Mathlib.FieldTheory.Fixed +public import Mathlib.SetTheory.Cardinal.Finite +/-! +# Hasse--Arf + +Reader-facing facade for the Hasse--Arf theorem: upper ramification jumps of +finite Abelian local extensions are integral. Reusable ramification, +Lubin--Tate, and local reciprocity infrastructure is exported by its owner +libraries rather than through this facade. +-/ + +@[expose] public section + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction → + herbrandFunction + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction_nat → + herbrandFunction_nat + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction_of_floor → + herbrandFunction_of_floor + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction_of_nonpos → + herbrandFunction_of_nonpos + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandValueNat → + herbrandValueNat + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandValueNat_succ → + herbrandValueNat_succ + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandValueNat_zero → + herbrandValueNat_zero + +open _root_.RamificationTheory.DiscreteValuationField.DVF renaming + mem_valuationSubring_algEquiv_iff_of_hasUniqueValuationExtension → + mem_valuationSubring_algEquiv_iff_of_hasUniqueValuationExtension + + +/-! +# Hasse--Arf integrality + +Filtered local reciprocity identifies the Artin principal-unit step +filtration with the upper ramification filtration. Since the former changes +only at natural-number indices, every upper jump of a finite Abelian local +extension is integral (with the separate possible endpoint `-1`). +-/ + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- Each lower ramification group of a finite extension is finite. -/ +theorem lowerRamificationGroup_finite + (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (A : ValuationSubring L) (n : ℕ) : + Finite (lowerRamificationGroup K A n) := by + classical + infer_instance + +/-- The order of each lower ramification group of a finite extension is positive. -/ +theorem lowerRamificationGroup_card_pos + (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (A : ValuationSubring L) (n : ℕ) : + 0 < Nat.card (lowerRamificationGroup K A n) := by + exact Nat.card_pos (α := lowerRamificationGroup K A n) + +/-- Successive rational Herbrand values differ by the normalized cardinality +of the next lower ramification group. -/ +theorem herbrandFunctionAtLowerIndex_succ + (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + (A : ValuationSubring L) (n : ℕ) : + herbrandFunctionAtLowerIndex K A (n + 1) = + herbrandFunctionAtLowerIndex K A n + + (Nat.card (lowerRamificationGroup K A (n + 1)) : ℚ) / + Nat.card (lowerRamificationGroup K A 0) := by + unfold herbrandFunctionAtLowerIndex + rw [Finset.sum_Icc_succ_top (Nat.succ_le_succ (Nat.zero_le n)), add_div] + +end ClassFieldTheory + +namespace HasseArf + +open LocalClassFieldTheory +open RamificationTheory +open RamificationTheory.LocalField +open RamificationTheory.HilbertRamification.Higher +open LocalFieldTheory +open scoped Pointwise + +/-! ## From filtered reciprocity to integral upper jumps -/ + +/-- If filtered local reciprocity has been established for a finite Abelian +extension at nonnegative indices, then the right-limit at a nonnegative +index is the right-limit of the Artin principal-unit filtration. -/ +theorem + localUpperRamificationGroupAfter_eq_artinPrincipalUnitStepGroupAfter_of_filteredLocalReciprocity + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (hfiltered : ∀ t, 0 ≤ t → + artinPrincipalUnitStepGroup K L t = + localUpperRamificationGroup K L t) + (t : ℝ) (ht : 0 ≤ t) : + localUpperRamificationGroupAfter K L t = + natCeilStepFiltrationAfter (artinPrincipalUnitGroup K L) t := by + unfold localUpperRamificationGroupAfter + unfold natCeilStepFiltrationAfter + apply iSup_congr + intro s + exact (hfiltered s (ht.trans s.property.le)).symm + +/-- At a nonnegative index, filtered local reciprocity identifies intrinsic +upper jumps with jumps of the Artin principal-unit step filtration. -/ +theorem + isLocalUpperRamificationJump_iff_isArtinPrincipalUnitJump_of_filteredLocalReciprocity + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (hfiltered : ∀ t, 0 ≤ t → + artinPrincipalUnitStepGroup K L t = + localUpperRamificationGroup K L t) + (t : ℝ) (ht : 0 ≤ t) : + IsLocalUpperRamificationJump K L t ↔ + IsArtinPrincipalUnitJump K L t := by + unfold IsLocalUpperRamificationJump + unfold IsArtinPrincipalUnitJump + rw [← hfiltered t ht] + rw [ + localUpperRamificationGroupAfter_eq_artinPrincipalUnitStepGroupAfter_of_filteredLocalReciprocity + K L hfiltered t ht] + rfl + +/-- The nonnegative part of the formal Hasse--Arf implication: once filtered +local reciprocity is known for a finite Abelian extension, every nonnegative +actual upper jump is a natural number. The possible index `-1` is handled +separately from the principal-unit filtration. -/ +theorem + isLocalUpperRamificationJump_integer_of_filteredLocalReciprocity + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (hfiltered : ∀ t, 0 ≤ t → + artinPrincipalUnitStepGroup K L t = + localUpperRamificationGroup K L t) + {t : ℝ} (ht0 : 0 ≤ t) + (ht : IsLocalUpperRamificationJump K L t) : + ∃ n : ℕ, t = n := by + exact isArtinPrincipalUnitJump_integer K L + ((isLocalUpperRamificationJump_iff_isArtinPrincipalUnitJump_of_filteredLocalReciprocity + K L hfiltered t ht0).mp ht) + +/-- The full formal Hasse--Arf implication from filtered local reciprocity: +every actual upper jump is an integer. The endpoint `-1` is treated directly, +while every other jump is nonnegative and hence comes from the natural-number +principal-unit filtration. -/ +theorem + isLocalUpperRamificationJump_int_of_filteredLocalReciprocity + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (hfiltered : ∀ t, 0 ≤ t → + artinPrincipalUnitStepGroup K L t = + localUpperRamificationGroup K L t) + {t : ℝ} (ht : IsLocalUpperRamificationJump K L t) : + ∃ z : ℤ, t = z := by + rcases isLocalUpperRamificationJump_eq_neg_one_or_nonneg K L ht with hneg | ht0 + · exact ⟨-1, by simpa using hneg⟩ + · obtain ⟨n, hn⟩ := + isLocalUpperRamificationJump_integer_of_filteredLocalReciprocity + K L hfiltered ht0 ht + exact ⟨n, by simpa using hn⟩ + +/-- Hasse--Arf integrality: every actual upper ramification jump of +a finite Abelian local extension is an integer. -/ +theorem isLocalUpperRamificationJump_int + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + {t : ℝ} (ht : IsLocalUpperRamificationJump K L t) : + ∃ z : ℤ, t = z := by + exact + isLocalUpperRamificationJump_int_of_filteredLocalReciprocity + K L + (fun s hs => + finiteAbelian_filteredLocalReciprocity K L s hs) + ht + +/-- The chosen valuation ring of a finite local extension is invariant under +every base-field automorphism. Thus its Mathlib decomposition group is the +entire Galois group. -/ +theorem chosenLocalExtension_decompositionSubgroup_eq_top + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + ((chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring).decompositionSubgroup K = + ⊤ := by + let base := (localCompleteDVF K).toDVF + let target := (chosenLocalExtensionCompleteDVF K L).toDVF + let huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{0, 0, 0, 0, 0} + base target := + chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension K L + apply (Subgroup.eq_top_iff' _).2 + intro σ + change σ • target.valuation.valuationSubring = target.valuation.valuationSubring + ext z + rw [ValuationSubring.mem_pointwise_smul_iff_inv_smul_mem] + exact + (mem_valuationSubring_algEquiv_iff_of_hasUniqueValuationExtension + (base := base) (target := target) huniq σ⁻¹ z).symm + +/-- At integer indices the lower group defined using Mathlib's valuation +subring action agrees elementwise with the existing local lower group. -/ +theorem mem_chosenLowerRamificationGroup_iff_mem_localLowerRamificationGroup + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (n : ℕ) (σ : Gal(L/K)) + (hσ : σ ∈ + ((chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring).decompositionSubgroup K) : + (⟨σ, hσ⟩ : + ((chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring).decompositionSubgroup K) ∈ + ClassFieldTheory.lowerRamificationGroup K + (chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring n ↔ + σ ∈ localLowerRamificationGroup K L (n : ℝ) := by + let base := (localCompleteDVF K).toDVF + let target := (chosenLocalExtensionCompleteDVF K L).toDVF + let huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{0, 0, 0, 0, 0} + base target := + chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension K L + have hact (a : target.valuationSubring) : + (⟨σ, hσ⟩ : target.valuation.valuationSubring.decompositionSubgroup K) • a = + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a := by + apply Subtype.ext + rfl + change (∀ a : target.valuationSubring, + (⟨σ, hσ⟩ : target.valuation.valuationSubring.decompositionSubgroup K) • a - a ∈ + (IsLocalRing.maximalIdeal target.valuationSubring) ^ (n + 1)) ↔ + σ ∈ lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ) + rw [mem_lowerRamificationGroup_nat_iff] + simp only [hact] + +/-- At every real index, the lower group of the chosen valuation ring agrees +elementwise with the existing local lower filtration after forgetting the +decomposition-subgroup wrapper. -/ +theorem mem_chosenRealLowerRamificationGroup_iff_mem_localLowerRamificationGroup + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (s : ℝ) (σ : Gal(L/K)) + (hσ : σ ∈ + ((chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring).decompositionSubgroup K) : + (⟨σ, hσ⟩ : + ((chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring).decompositionSubgroup K) ∈ + ClassFieldTheory.realLowerRamificationGroup K + (chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring s ↔ + σ ∈ localLowerRamificationGroup K L s := by + let base := (localCompleteDVF K).toDVF + let target := (chosenLocalExtensionCompleteDVF K L).toDVF + let huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{0, 0, 0, 0, 0} + base target := + chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension K L + have hact (a : target.valuationSubring) : + (⟨σ, hσ⟩ : target.valuation.valuationSubring.decompositionSubgroup K) • a = + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a := by + apply Subtype.ext + rfl + change (∀ a : target.valuationSubring, + (⟨σ, hσ⟩ : target.valuation.valuationSubring.decompositionSubgroup K) • a - a ∈ + (IsLocalRing.maximalIdeal target.valuationSubring) ^ + (Int.ceil (s + 1)).toNat) ↔ + σ ∈ RamificationTheory.HilbertRamification.Higher.lowerRamificationGroup + (base := base) (target := target) huniq s + rw [RamificationTheory.HilbertRamification.Higher.mem_lowerRamificationGroup_iff] + change (∀ a : target.valuationSubring, + (⟨σ, hσ⟩ : target.valuation.valuationSubring.decompositionSubgroup K) • a - a ∈ + (IsLocalRing.maximalIdeal target.valuationSubring) ^ + (Int.ceil (s + 1)).toNat) ↔ + (∀ a : target.valuationSubring, + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a - a ∈ + (IsLocalRing.maximalIdeal target.valuationSubring) ^ + (Int.ceil (s + 1)).toNat) + simp only [hact] + +/-- The finite lower groups in Mathlib's valuation-subring model and in the +existing local filtration have the same elements, after forgetting the +decomposition-subgroup wrapper. -/ +noncomputable def chosenLowerRamificationGroupEquiv + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (n : ℕ) : + ClassFieldTheory.lowerRamificationGroup K + (chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring n ≃ + localLowerRamificationGroup K L (n : ℝ) := by + have htop := chosenLocalExtension_decompositionSubgroup_eq_top K L + refine { + toFun := fun g => + ⟨g.1.1, + (mem_chosenLowerRamificationGroup_iff_mem_localLowerRamificationGroup + K L n g.1.1 g.1.2).mp g.2⟩ + invFun := fun g => + ⟨⟨g.1, by rw [htop]; trivial⟩, + (mem_chosenLowerRamificationGroup_iff_mem_localLowerRamificationGroup + K L n g.1 (by rw [htop]; trivial)).mpr g.2⟩ + left_inv := ?_ + right_inv := ?_ } + · intro g + apply Subtype.ext + apply Subtype.ext + rfl + · intro g + apply Subtype.ext + rfl + +/-- The public-style lower group has the same cardinality as the original +local lower group at every nonnegative integral index. -/ +theorem card_chosenLowerRamificationGroup_eq_card_localLowerRamificationGroup + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (n : ℕ) : + Nat.card (ClassFieldTheory.lowerRamificationGroup K + (chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring n) = + Nat.card (localLowerRamificationGroup K L (n : ℝ)) := + Nat.card_congr (chosenLowerRamificationGroupEquiv K L n) + +/-- Successive rational Herbrand values differ by the normalized cardinality +of the next lower group. -/ +theorem herbrandFunctionAtLowerIndex_succ + (K L : Type) [Field K] [Field L] [Algebra K L] + (A : ValuationSubring L) (n : ℕ) : + ClassFieldTheory.herbrandFunctionAtLowerIndex K A (n + 1) = + ClassFieldTheory.herbrandFunctionAtLowerIndex K A n + + (Nat.card (ClassFieldTheory.lowerRamificationGroup K A (n + 1)) : ℚ) / + Nat.card (ClassFieldTheory.lowerRamificationGroup K A 0) := + ClassFieldTheory.herbrandFunctionAtLowerIndex_succ K A n + +/-- After the canonical inclusion `ℚ → ℝ`, the rational finite-sum +Herbrand value agrees with the Herbrand function used by local reciprocity. -/ +theorem chosenHerbrandFunctionAtLowerIndex_real_eq + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (n : ℕ) : + ((ClassFieldTheory.herbrandFunctionAtLowerIndex K + (chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring n : ℚ) : ℝ) = + herbrandFunctionOfUniqueExtension + (base := (localCompleteDVF K).toDVF) + (target := (chosenLocalExtensionCompleteDVF K L).toDVF) + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension.{0} K L) + (n : ℝ) := by + let base := (localCompleteDVF K).toDVF + let target := (chosenLocalExtensionCompleteDVF K L).toDVF + let huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{0, 0, 0, 0, 0} + base target := + chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension K L + let F := lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq + change ((ClassFieldTheory.herbrandFunctionAtLowerIndex K + target.valuation.valuationSubring n : ℚ) : ℝ) = + herbrandFunction + F (n : ℝ) + induction n with + | zero => + simp only [ClassFieldTheory.herbrandFunctionAtLowerIndex, + show Finset.Icc (1 : ℕ) 0 = ∅ from by decide, + Finset.sum_empty, zero_div, Rat.cast_zero, + herbrandFunction_nat, + herbrandValueNat_zero] + | succ n ih => + rw [herbrandFunctionAtLowerIndex_succ, Rat.cast_add, Rat.cast_div] + rw [herbrandFunction_nat, + herbrandValueNat_succ] + rw [← + herbrandFunction_nat + F n, ih] + congr 1 + rw [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandSlope] + rw [show F.lower (n + 1) = + localLowerRamificationGroup K L ((n + 1 : ℕ) : ℝ) from rfl] + rw [show F.lower 0 = localLowerRamificationGroup K L (0 : ℝ) by + unfold F + rw [lowerRamificationFiltrationOfUniqueExtension_lower] + unfold localLowerRamificationGroup + simp only [Nat.cast_zero]] + rw [card_chosenLowerRamificationGroup_eq_card_localLowerRamificationGroup K L (n + 1), + card_chosenLowerRamificationGroup_eq_card_localLowerRamificationGroup K L 0] + simp only [Rat.cast_natCast, Nat.cast_zero] + +/-- For an extension carrying its own compatible local-field valuation, the +chosen integral-closure valuation ring is exactly the canonical one. -/ +theorem chosenLocalExtension_valuationSubring_eq_canonical + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + (chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring = + (ValuativeRel.valuation L).valuationSubring := by + let : (localCompleteDVF K).valuation.HasExtension (ValuativeRel.valuation L) := by + rw [localCompleteDVF_valuation_eq] + exact ‹Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)› + exact + ValuationTheory.DiscreteValuationField.ValuedExtension.valuationSubring_eq_of_finite_separable + (localCompleteDVF K) (chosenLocalExtensionCompleteDVF K L) + (ValuativeRel.valuation L) + +/-- The public canonical Herbrand value agrees with the old local Herbrand +function at each natural index, after casting from rationals to reals. -/ +theorem canonicalHerbrandFunctionAtLowerIndex_real_eq + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (n : ℕ) : + ((ClassFieldTheory.herbrandFunctionAtLowerIndex K + (ValuativeRel.valuation L).valuationSubring n : ℚ) : ℝ) = + herbrandFunctionOfUniqueExtension + (base := (localCompleteDVF K).toDVF) + (target := (chosenLocalExtensionCompleteDVF K L).toDVF) + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension.{0} K L) + (n : ℝ) := by + rw [← chosenLocalExtension_valuationSubring_eq_canonical K L] + exact chosenHerbrandFunctionAtLowerIndex_real_eq K L n + +/-- The public piecewise-linear Herbrand function of the chosen valuation +ring agrees at every real index with the existing local Herbrand function. -/ +theorem chosenHerbrandFunction_eq_localHerbrandFunction + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (s : ℝ) : + ClassFieldTheory.herbrandFunction K + (chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring s = + herbrandFunctionOfUniqueExtension + (base := (localCompleteDVF K).toDVF) + (target := (chosenLocalExtensionCompleteDVF K L).toDVF) + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension.{0} K L) s := by + let base := (localCompleteDVF K).toDVF + let target := (chosenLocalExtensionCompleteDVF K L).toDVF + let huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{0, 0, 0, 0, 0} + base target := + chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension K L + let F := lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq + have hcard (m : ℕ) : + Nat.card (ClassFieldTheory.lowerRamificationGroup K + target.valuation.valuationSubring m) = Nat.card (F.lower m) := by + calc + Nat.card (ClassFieldTheory.lowerRamificationGroup K + target.valuation.valuationSubring m) = + Nat.card (localLowerRamificationGroup K L (m : ℝ)) := + card_chosenLowerRamificationGroup_eq_card_localLowerRamificationGroup K L m + _ = Nat.card (F.lower m) := rfl + have hnat (m : ℕ) : + ((ClassFieldTheory.herbrandFunctionAtLowerIndex K + target.valuation.valuationSubring m : ℚ) : ℝ) = + herbrandValueNat + F m := by + calc + ((ClassFieldTheory.herbrandFunctionAtLowerIndex K + target.valuation.valuationSubring m : ℚ) : ℝ) = + herbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq (m : ℝ) := + chosenHerbrandFunctionAtLowerIndex_real_eq K L m + _ = + herbrandValueNat + F m := by + change + herbrandFunction + F (m : ℝ) = _ + exact + herbrandFunction_nat + F m + have hslope (m : ℕ) : + ((Nat.card (ClassFieldTheory.lowerRamificationGroup K + target.valuation.valuationSubring (m + 1)) : ℝ) / + Nat.card (ClassFieldTheory.lowerRamificationGroup K + target.valuation.valuationSubring 0)) = + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandSlope + F m := by + unfold RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandSlope + rw [hcard (m + 1), hcard 0] + change ClassFieldTheory.herbrandFunction K target.valuation.valuationSubring s = + herbrandFunction + F s + unfold ClassFieldTheory.herbrandFunction + by_cases hs : 0 ≤ s + · rw [ite_eq_left hs] + dsimp only + rw [herbrandFunction_of_floor + F hs ⌊s⌋₊ rfl] + rw [hnat ⌊s⌋₊, hslope ⌊s⌋₊] + · rw [ite_eq_right hs] + exact + (herbrandFunction_of_nonpos + F (le_of_lt (lt_of_not_ge hs))).symm + +/-- The public piecewise-linear Herbrand function of the canonical valuation +ring agrees at every real index with the existing local Herbrand function. -/ +theorem canonicalHerbrandFunction_eq_localHerbrandFunction + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (s : ℝ) : + ClassFieldTheory.herbrandFunction K + (ValuativeRel.valuation L).valuationSubring s = + herbrandFunctionOfUniqueExtension + (base := (localCompleteDVF K).toDVF) + (target := (chosenLocalExtensionCompleteDVF K L).toDVF) + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension.{0} K L) s := by + rw [← chosenLocalExtension_valuationSubring_eq_canonical K L] + exact chosenHerbrandFunction_eq_localHerbrandFunction K L s + +/-- The inverse of the public canonical Herbrand function agrees with the +inverse used by the existing local upper filtration. -/ +theorem canonicalInverseHerbrandFunction_eq_localInverseHerbrandFunction + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (t : ℝ) : + ClassFieldTheory.inverseHerbrandFunction K L t = + inverseHerbrandFunctionOfUniqueExtension + (base := (localCompleteDVF K).toDVF) + (target := (chosenLocalExtensionCompleteDVF K L).toDVF) + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension.{0} K L) t := by + have hfun : + ClassFieldTheory.herbrandFunction K + (ValuativeRel.valuation L).valuationSubring = + herbrandFunctionOfUniqueExtension + (base := (localCompleteDVF K).toDVF) + (target := (chosenLocalExtensionCompleteDVF K L).toDVF) + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension.{0} K L) := by + funext s + exact canonicalHerbrandFunction_eq_localHerbrandFunction K L s + unfold ClassFieldTheory.inverseHerbrandFunction + rw [hfun] + rfl + +/-- Membership in the public canonical upper group is equivalent to +membership in the existing local upper group, after forgetting the +decomposition-subgroup wrapper. -/ +theorem mem_canonicalUpperRamificationGroup_iff_mem_localUpperRamificationGroup + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (t : ℝ) (σ : Gal(L/K)) + (hσ : σ ∈ + ((ValuativeRel.valuation L).valuationSubring).decompositionSubgroup K) : + (⟨σ, hσ⟩ : + ((ValuativeRel.valuation L).valuationSubring).decompositionSubgroup K) ∈ + ClassFieldTheory.upperRamificationGroup K L t ↔ + σ ∈ localUpperRamificationGroup K L t := by + have hσChosen : σ ∈ + ((chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring).decompositionSubgroup K + := by + rw [chosenLocalExtension_valuationSubring_eq_canonical K L] + exact hσ + have hchosen := + mem_chosenRealLowerRamificationGroup_iff_mem_localLowerRamificationGroup + K L (ClassFieldTheory.inverseHerbrandFunction K L t) σ hσChosen + have hmem_congr (A B : ValuationSubring L) (hAB : A = B) + (hA : σ ∈ A.decompositionSubgroup K) + (hB : σ ∈ B.decompositionSubgroup K) (s : ℝ) : + (⟨σ, hA⟩ : A.decompositionSubgroup K) ∈ + ClassFieldTheory.realLowerRamificationGroup K A s ↔ + (⟨σ, hB⟩ : B.decompositionSubgroup K) ∈ + ClassFieldTheory.realLowerRamificationGroup K B s := by + subst B + rfl + have hcanonical : + (⟨σ, hσ⟩ : + ((ValuativeRel.valuation L).valuationSubring).decompositionSubgroup K) ∈ + ClassFieldTheory.realLowerRamificationGroup K + (ValuativeRel.valuation L).valuationSubring + (ClassFieldTheory.inverseHerbrandFunction K L t) ↔ + σ ∈ localLowerRamificationGroup K L + (ClassFieldTheory.inverseHerbrandFunction K L t) := by + have heq := hmem_congr + (chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring + (ValuativeRel.valuation L).valuationSubring + (chosenLocalExtension_valuationSubring_eq_canonical K L) + hσChosen hσ (ClassFieldTheory.inverseHerbrandFunction K L t) + exact heq.symm.trans hchosen + change (⟨σ, hσ⟩ : + ((ValuativeRel.valuation L).valuationSubring).decompositionSubgroup K) ∈ + ClassFieldTheory.realLowerRamificationGroup K + (ValuativeRel.valuation L).valuationSubring + (ClassFieldTheory.inverseHerbrandFunction K L t) ↔ + σ ∈ localLowerRamificationGroup K L + (inverseHerbrandFunctionOfUniqueExtension + (base := (localCompleteDVF K).toDVF) + (target := (chosenLocalExtensionCompleteDVF K L).toDVF) + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension.{0} K L) t) + rw [← canonicalInverseHerbrandFunction_eq_localInverseHerbrandFunction K L t] + exact hcanonical + +/-- Mapping the public canonical upper group from the decomposition subgroup +into `Gal(L/K)` gives the existing local upper group. -/ +theorem upperRamificationGroup_map_subtype_eq_localUpperRamificationGroup + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (t : ℝ) : + (ClassFieldTheory.upperRamificationGroup K L t).map + (((ValuativeRel.valuation L).valuationSubring).decompositionSubgroup K).subtype = + localUpperRamificationGroup K L t := by + have htop : + ((ValuativeRel.valuation L).valuationSubring).decompositionSubgroup K = ⊤ := by + rw [← chosenLocalExtension_valuationSubring_eq_canonical K L] + exact chosenLocalExtension_decompositionSubgroup_eq_top K L + apply Subgroup.ext + intro σ + constructor + · intro h + obtain ⟨g, hg, rfl⟩ := Subgroup.mem_map.mp h + exact (mem_canonicalUpperRamificationGroup_iff_mem_localUpperRamificationGroup + K L t g.1 g.2).mp hg + · intro h + have hσ : σ ∈ + ((ValuativeRel.valuation L).valuationSubring).decompositionSubgroup K := by + rw [htop] + trivial + exact Subgroup.mem_map.mpr + ⟨⟨σ, hσ⟩, + (mem_canonicalUpperRamificationGroup_iff_mem_localUpperRamificationGroup + K L t σ hσ).mpr h, + rfl⟩ + +/-- Subgroup transport also identifies the public right-limit upper group +with the existing local right-limit upper group. -/ +theorem upperRamificationGroupAfter_map_subtype_eq_localUpperRamificationGroupAfter + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (t : ℝ) : + (ClassFieldTheory.upperRamificationGroupAfter K L t).map + (((ValuativeRel.valuation L).valuationSubring).decompositionSubgroup K).subtype = + localUpperRamificationGroupAfter K L t := by + unfold ClassFieldTheory.upperRamificationGroupAfter + unfold localUpperRamificationGroupAfter + rw [Subgroup.map_iSup] + apply iSup_congr + intro s + exact upperRamificationGroup_map_subtype_eq_localUpperRamificationGroup K L s + +/-- Equality of natural lower groups is reflected by the local filtration. -/ +theorem chosenLowerRamificationGroup_eq_iff_localLowerRamificationGroup_eq + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (m n : ℕ) : + ClassFieldTheory.lowerRamificationGroup K + (chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring m = + ClassFieldTheory.lowerRamificationGroup K + (chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring n ↔ + localLowerRamificationGroup K L (m : ℝ) = + localLowerRamificationGroup K L (n : ℝ) := by + constructor + · intro h + apply Subgroup.ext + intro σ + have hσ : σ ∈ + ((chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring).decompositionSubgroup + K := by + rw [chosenLocalExtension_decompositionSubgroup_eq_top K L] + trivial + rw [← mem_chosenLowerRamificationGroup_iff_mem_localLowerRamificationGroup K L m σ hσ, + ← mem_chosenLowerRamificationGroup_iff_mem_localLowerRamificationGroup K L n σ hσ, h] + · intro h + apply Subgroup.ext + intro σ + rw [mem_chosenLowerRamificationGroup_iff_mem_localLowerRamificationGroup K L m σ.1 σ.2, + mem_chosenLowerRamificationGroup_iff_mem_localLowerRamificationGroup K L n σ.1 σ.2, + h] + +/-- The canonical lower-jump predicate is exactly a strict change in the +original local lower filtration. -/ +theorem canonicalIsLowerRamificationJump_iff + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (n : ℕ) : + ClassFieldTheory.IsLowerRamificationJump K + (ValuativeRel.valuation L).valuationSubring n ↔ + localLowerRamificationGroup K L (n : ℝ) ≠ + localLowerRamificationGroup K L ((n + 1 : ℕ) : ℝ) := by + unfold ClassFieldTheory.IsLowerRamificationJump + rw [← chosenLocalExtension_valuationSubring_eq_canonical K L] + exact not_congr + (chosenLowerRamificationGroup_eq_iff_localLowerRamificationGroup_eq K L n (n + 1)) + +/-- Immediately to the right of the integer `n`, the real lower filtration +has already reached (or passed) the group at `n + 1`. -/ +theorem localLowerRamificationGroup_le_succ_of_nat_lt + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (n : ℕ) {s : ℝ} (hs : (n : ℝ) < s) : + localLowerRamificationGroup K L s ≤ + localLowerRamificationGroup K L ((n + 1 : ℕ) : ℝ) := by + let target := (chosenLocalExtensionCompleteDVF K L).toDVF + have hexponent : + realRamificationExponent ((n + 1 : ℕ) : ℝ) ≤ realRamificationExponent s := by + rw [realRamificationExponent_nat] + have hceil : ((n + 2 : ℕ) : ℤ) ≤ Int.ceil (s + 1) := by + apply (Int.le_ceil_iff).2 + norm_num only [Int.cast_sub, Int.cast_add, Int.cast_natCast, Nat.cast_add, Nat.cast_ofNat, + Int.cast_one] + linarith + unfold realRamificationExponent + simpa only [Int.toNat_natCast, Nat.add_assoc, Nat.add_comm, Nat.add_left_comm] using + Int.toNat_le_toNat hceil + intro σ hσ a + have hpow : + target.maximalIdeal ^ realRamificationExponent s ≤ + target.maximalIdeal ^ realRamificationExponent ((n + 1 : ℕ) : ℝ) := + Ideal.pow_le_pow_right hexponent + exact hpow (hσ a) + +/-- A strict change between consecutive integer lower groups yields an +upper jump at the Herbrand image of the lower index. -/ +theorem isLocalUpperRamificationJump_herbrand_nat_of_lower_ne_succ + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (n : ℕ) + (hjump : localLowerRamificationGroup K L (n : ℝ) ≠ + localLowerRamificationGroup K L ((n + 1 : ℕ) : ℝ)) : + IsLocalUpperRamificationJump K L + (herbrandFunctionOfUniqueExtension + (base := (localCompleteDVF K).toDVF) + (target := (chosenLocalExtensionCompleteDVF K L).toDVF) + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension.{0} K L) + (n : ℝ)) := by + let base := (localCompleteDVF K).toDVF + let target := (chosenLocalExtensionCompleteDVF K L).toDVF + let huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{0, 0, 0, 0, 0} + base target := + chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension K L + let t := herbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq (n : ℝ) + have hAt : localUpperRamificationGroup K L t = + localLowerRamificationGroup K L (n : ℝ) := by + exact upperRamificationGroupOfUniqueExtension_herbrandFunction + (base := base) (target := target) huniq (n : ℝ) + have hAfter : localUpperRamificationGroupAfter K L t ≤ + localLowerRamificationGroup K L ((n + 1 : ℕ) : ℝ) := by + unfold localUpperRamificationGroupAfter + apply iSup_le + intro s + have hmono := + (inverseHerbrandFunctionOfUniqueExtension_strictMono + (base := base) (target := target) huniq) s.property + have hs : (n : ℝ) < inverseHerbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq s.1 := by + change inverseHerbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq + (herbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq (n : ℝ)) < _ at hmono + simpa only [inverseHerbrandFunctionOfUniqueExtension_eta] using hmono + exact localLowerRamificationGroup_le_succ_of_nat_lt K L n hs + change localUpperRamificationGroup K L t ≠ + localUpperRamificationGroupAfter K L t + intro hEq + have hLe : localLowerRamificationGroup K L (n : ℝ) ≤ + localLowerRamificationGroup K L ((n + 1 : ℕ) : ℝ) := by + rw [← hAt, hEq] + exact hAfter + have hRev : localLowerRamificationGroup K L ((n + 1 : ℕ) : ℝ) ≤ + localLowerRamificationGroup K L (n : ℝ) := + (lowerRamificationGroup_antitone (base := base) (target := target) huniq) + (by exact_mod_cast Nat.le_succ n) + exact hjump (le_antisymm hLe hRev) + +/-- The public rational lower-jump formulation of Hasse--Arf for fields in +the universe supported by the existing local reciprocity construction. -/ +theorem hasseArf_canonical + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + {n : ℕ} + (hn : ClassFieldTheory.IsLowerRamificationJump K + (ValuativeRel.valuation L).valuationSubring n) : + ∃ z : ℤ, + ClassFieldTheory.herbrandFunctionAtLowerIndex K + (ValuativeRel.valuation L).valuationSubring n = (z : ℚ) := by + have hjump : IsLocalUpperRamificationJump K L + (herbrandFunctionOfUniqueExtension + (base := (localCompleteDVF K).toDVF) + (target := (chosenLocalExtensionCompleteDVF K L).toDVF) + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension.{0} K L) + (n : ℝ)) := + isLocalUpperRamificationJump_herbrand_nat_of_lower_ne_succ K L n + ((canonicalIsLowerRamificationJump_iff K L n).mp hn) + obtain ⟨z, hz⟩ := isLocalUpperRamificationJump_int K L hjump + refine ⟨z, ?_⟩ + have hreal : + ((ClassFieldTheory.herbrandFunctionAtLowerIndex K + (ValuativeRel.valuation L).valuationSubring n : ℚ) : ℝ) = (z : ℝ) := by + rw [canonicalHerbrandFunctionAtLowerIndex_real_eq K L n] + exact hz + exact_mod_cast hreal + +/-! ## Compatible small representatives of finite extensions -/ + +/-- The algebra structure on the two small representatives, transported from +the original field extension. -/ +@[instance_reducible] +noncomputable def shrinkAlgebra + (K L : Type*) [Field K] [Field L] [Algebra K L] + [Small.{0} K] [Small.{0} L] : + Algebra (Shrink.{0} K) (Shrink.{0} L) := + ((Shrink.ringEquiv L).symm.toRingHom.comp + ((algebraMap K L).comp (Shrink.ringEquiv K).toRingHom)).toAlgebra + +/-- The two `Shrink` equivalences commute with the algebra maps. -/ +theorem shrinkAlgebra_commutes + (K L : Type*) [Field K] [Field L] [Algebra K L] + [Small.{0} K] [Small.{0} L] : + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + (algebraMap (Shrink.{0} K) (Shrink.{0} L)).comp + (Shrink.ringEquiv K).symm.toRingHom = + (Shrink.ringEquiv L).symm.toRingHom.comp (algebraMap K L) := + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + by + apply RingHom.ext + intro x + change (Shrink.ringEquiv L).symm + (algebraMap K L (Shrink.ringEquiv K ((Shrink.ringEquiv K).symm x))) = + (Shrink.ringEquiv L).symm (algebraMap K L x) + simp + +/-- Finite-dimensionality survives simultaneous shrinking of the base and +extension fields. -/ +theorem shrink_finiteDimensional + (K L : Type*) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Small.{0} K] [Small.{0} L] : + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + FiniteDimensional (Shrink.{0} K) (Shrink.{0} L) := + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + Module.Finite.of_equiv_equiv + (Shrink.ringEquiv K).symm (Shrink.ringEquiv L).symm + (shrinkAlgebra_commutes K L) + +/-- Abelian Galois structure survives simultaneous shrinking of both fields. -/ +theorem shrink_isAbelianGalois + (K L : Type*) [Field K] [Field L] [Algebra K L] + [IsAbelianGalois K L] [Small.{0} K] [Small.{0} L] : + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + IsAbelianGalois (Shrink.{0} K) (Shrink.{0} L) := + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + ClassFieldTheory.isAbelianGalois_of_equiv_equiv + (Shrink.ringEquiv K).symm (Shrink.ringEquiv L).symm + (shrinkAlgebra_commutes K L) + +/-- Galois automorphisms of a finite extension are identified with those of +its simultaneous small representatives. -/ +noncomputable def shrinkGalEquiv + (K L : Type*) [Field K] [Field L] [Algebra K L] + [Small.{0} K] [Small.{0} L] : + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + Gal(Shrink.{0} L/Shrink.{0} K) ≃ Gal(L/K) := + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + ClassFieldTheory.galEquivOfEquivEquiv + (Shrink.ringEquiv K).symm (Shrink.ringEquiv L).symm + (shrinkAlgebra_commutes K L) + +/-- The Galois equivalence acts by conjugating with the field equivalence. -/ +theorem shrinkGalEquiv_apply + (K L : Type*) [Field K] [Field L] [Algebra K L] + [Small.{0} K] [Small.{0} L] : + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + ∀ (σ : Gal(Shrink.{0} L/Shrink.{0} K)) (x : Shrink.{0} L), + shrinkGalEquiv K L σ (Shrink.ringEquiv L x) = + Shrink.ringEquiv L (σ x) := + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + by + intro σ x + simp [shrinkGalEquiv, ClassFieldTheory.galEquivOfEquivEquiv] + +/-- The canonical valuation ring of a small local field is the pullback of +the original canonical valuation ring. This does not depend on the choice of +equivalent representatives for the two valuations. -/ +theorem shrink_valuationSubring_eq_comap + (L : Type*) [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Small.{0} L] : + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + (ValuativeRel.valuation (Shrink.{0} L)).valuationSubring = + (ValuativeRel.valuation L).valuationSubring.comap + (Shrink.ringEquiv L).toRingHom := + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + by + let v := shrinkLocalFieldValuation L + have hv : (ValuativeRel.valuation (Shrink.{0} L)).IsEquiv v := + letI : v.Compatible := Valuation.Compatible.ofValuation v + ValuativeRel.isEquiv _ _ + ext x + change (ValuativeRel.valuation (Shrink.{0} L)) x ≤ 1 ↔ + (ValuativeRel.valuation L) (Shrink.ringEquiv L x) ≤ 1 + exact hv.le_one_iff_le_one.trans (by simp [v, shrinkLocalFieldValuation]) + +/-- Conjugation of Galois automorphisms preserves the pointwise action on the +canonical valuation rings. -/ +theorem shrink_mem_pointwise_smul_iff + (K L : Type*) [Field K] [Field L] [Algebra K L] + [Small.{0} K] [Small.{0} L] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] : + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + ∀ (σ : Gal(Shrink.{0} L/Shrink.{0} K)) (x : Shrink.{0} L), + x ∈ σ • (ValuativeRel.valuation (Shrink.{0} L)).valuationSubring ↔ + Shrink.ringEquiv L x ∈ + shrinkGalEquiv K L σ • + (ValuativeRel.valuation L).valuationSubring := + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + by + let e := Shrink.ringEquiv L + let B := (ValuativeRel.valuation (Shrink.{0} L)).valuationSubring + let A := (ValuativeRel.valuation L).valuationSubring + have hmem (y : Shrink.{0} L) : y ∈ B ↔ e y ∈ A := by + rw [show B = A.comap e.toRingHom from shrink_valuationSubring_eq_comap L] + rfl + intro σ x + have hleft := ValuationSubring.mem_smul_pointwise_iff_exists σ x B + have hright := ValuationSubring.mem_smul_pointwise_iff_exists + (shrinkGalEquiv K L σ) (e x) A + constructor + · intro hx + obtain ⟨y, hy, heq⟩ := hleft.mp hx + apply hright.mpr + refine ⟨e y, (hmem y).mp hy, ?_⟩ + change σ y = x at heq + change shrinkGalEquiv K L σ (e y) = e x + rw [shrinkGalEquiv_apply K L σ y] + exact congrArg e heq + · intro hx + obtain ⟨z, hz, heq⟩ := hright.mp hx + let y := e.symm z + apply hleft.mpr + refine ⟨y, (hmem y).mpr ?_, ?_⟩ + · simpa [y] using hz + · change shrinkGalEquiv K L σ z = e x at heq + change σ y = x + apply e.injective + have hnat := shrinkGalEquiv_apply K L σ y + change shrinkGalEquiv K L σ (e y) = e (σ y) at hnat + rw [← hnat] + simpa [y] using heq + +/-- A Galois automorphism stabilizes the small canonical valuation ring +exactly when its conjugate stabilizes the original canonical valuation ring. -/ +theorem shrink_mem_decompositionSubgroup_iff + (K L : Type*) [Field K] [Field L] [Algebra K L] + [Small.{0} K] [Small.{0} L] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] : + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + ∀ σ : Gal(Shrink.{0} L/Shrink.{0} K), + σ ∈ ((ValuativeRel.valuation (Shrink.{0} L)).valuationSubring).decompositionSubgroup + (Shrink.{0} K) ↔ + shrinkGalEquiv K L σ ∈ + ((ValuativeRel.valuation L).valuationSubring).decompositionSubgroup K := + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + by + let e := Shrink.ringEquiv L + let B := (ValuativeRel.valuation (Shrink.{0} L)).valuationSubring + let A := (ValuativeRel.valuation L).valuationSubring + have hmem (x : Shrink.{0} L) : x ∈ B ↔ e x ∈ A := by + rw [show B = A.comap e.toRingHom from shrink_valuationSubring_eq_comap L] + rfl + intro σ + change σ • B = B ↔ shrinkGalEquiv K L σ • A = A + constructor + · intro h + apply ValuationSubring.ext + intro z + let x := e.symm z + calc + z ∈ shrinkGalEquiv K L σ • A ↔ x ∈ σ • B := by + simpa [x, e] using (shrink_mem_pointwise_smul_iff K L σ x).symm + _ ↔ x ∈ B := by rw [h] + _ ↔ z ∈ A := by simpa [x] using hmem x + · intro h + apply ValuationSubring.ext + intro x + calc + x ∈ σ • B ↔ e x ∈ shrinkGalEquiv K L σ • A := + shrink_mem_pointwise_smul_iff K L σ x + _ ↔ e x ∈ A := by rw [h] + _ ↔ x ∈ B := (hmem x).symm + +/-- The field equivalence restricts to the two canonical integer rings. -/ +noncomputable def shrinkValuationSubringRingEquiv + (L : Type*) [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Small.{0} L] : + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + (ValuativeRel.valuation (Shrink.{0} L)).valuationSubring ≃+* + (ValuativeRel.valuation L).valuationSubring := + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + RingEquiv.restrict (Shrink.ringEquiv L) _ _ (by + intro x + rw [shrink_valuationSubring_eq_comap L] + rfl) + +/-- Membership in a power of the maximal ideal is preserved by the +equivalence of canonical integer rings. -/ +theorem shrink_mem_maximalIdeal_pow_iff + (L : Type*) [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Small.{0} L] (n : ℕ) : + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + ∀ x : (ValuativeRel.valuation (Shrink.{0} L)).valuationSubring, + x ∈ (IsLocalRing.maximalIdeal + (ValuativeRel.valuation (Shrink.{0} L)).valuationSubring) ^ n ↔ + shrinkValuationSubringRingEquiv L x ∈ + (IsLocalRing.maximalIdeal + (ValuativeRel.valuation L).valuationSubring) ^ n := + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + by + intro x + let e := shrinkValuationSubringRingEquiv L + have hmap : + (IsLocalRing.maximalIdeal + (ValuativeRel.valuation (Shrink.{0} L)).valuationSubring ^ n).map e = + (IsLocalRing.maximalIdeal + (ValuativeRel.valuation L).valuationSubring) ^ n := by + rw [Ideal.map_pow, IsLocalRing.map_ringEquiv_maximalIdeal] + rw [← hmap] + exact (Ideal.apply_mem_of_equiv_iff (f := e)).symm + +/-- Conjugation preserves membership in every lower ramification group of +the canonical valuation ring. -/ +theorem shrink_mem_lowerRamificationGroup_iff + (K L : Type*) [Field K] [Field L] [Algebra K L] + [Small.{0} K] [Small.{0} L] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + (n : ℕ) : + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + ∀ (σ : Gal(Shrink.{0} L/Shrink.{0} K)) + (hσ : σ ∈ + ((ValuativeRel.valuation (Shrink.{0} L)).valuationSubring).decompositionSubgroup + (Shrink.{0} K)), + (⟨σ, hσ⟩ : + ((ValuativeRel.valuation (Shrink.{0} L)).valuationSubring).decompositionSubgroup + (Shrink.{0} K)) ∈ + ClassFieldTheory.lowerRamificationGroup (Shrink.{0} K) + (ValuativeRel.valuation (Shrink.{0} L)).valuationSubring n ↔ + (⟨shrinkGalEquiv K L σ, + (shrink_mem_decompositionSubgroup_iff K L σ).mp hσ⟩ : + ((ValuativeRel.valuation L).valuationSubring).decompositionSubgroup K) ∈ + ClassFieldTheory.lowerRamificationGroup K + (ValuativeRel.valuation L).valuationSubring n := + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + by + let B := (ValuativeRel.valuation (Shrink.{0} L)).valuationSubring + let A := (ValuativeRel.valuation L).valuationSubring + let e := shrinkValuationSubringRingEquiv L + intro σ hσ + let τ := shrinkGalEquiv K L σ + have hτ : τ ∈ A.decompositionSubgroup K := + (shrink_mem_decompositionSubgroup_iff K L σ).mp hσ + have haction (x : B) : + e ((⟨σ, hσ⟩ : B.decompositionSubgroup (Shrink.{0} K)) • x) = + (⟨τ, hτ⟩ : A.decompositionSubgroup K) • e x := by + apply Subtype.ext + change (Shrink.ringEquiv L) (σ (x : Shrink.{0} L)) = + τ ((Shrink.ringEquiv L) (x : Shrink.{0} L)) + exact (shrinkGalEquiv_apply K L σ x).symm + have hpow (x : B) : + (⟨σ, hσ⟩ : B.decompositionSubgroup (Shrink.{0} K)) • x - x ∈ + (IsLocalRing.maximalIdeal B) ^ (n + 1) ↔ + (⟨τ, hτ⟩ : A.decompositionSubgroup K) • e x - e x ∈ + (IsLocalRing.maximalIdeal A) ^ (n + 1) := by + have h := shrink_mem_maximalIdeal_pow_iff L (n + 1) + ((⟨σ, hσ⟩ : B.decompositionSubgroup (Shrink.{0} K)) • x - x) + change _ ↔ e ((⟨σ, hσ⟩ : B.decompositionSubgroup (Shrink.{0} K)) • x - x) ∈ + (IsLocalRing.maximalIdeal A) ^ (n + 1) at h + rw [map_sub, haction] at h + exact h + change (∀ x : B, + (⟨σ, hσ⟩ : B.decompositionSubgroup (Shrink.{0} K)) • x - x ∈ + (IsLocalRing.maximalIdeal B) ^ (n + 1)) ↔ + (∀ y : A, + (⟨τ, hτ⟩ : A.decompositionSubgroup K) • y - y ∈ + (IsLocalRing.maximalIdeal A) ^ (n + 1)) + constructor + · intro h y + have hy := (hpow (e.symm y)).mp (h (e.symm y)) + simpa using hy + · intro h x + exact (hpow x).mpr (h (e x)) + +/-- The decomposition groups of the two equivalent local extensions are +equivalent as finite types. -/ +noncomputable def shrinkDecompositionGroupEquiv + (K L : Type*) [Field K] [Field L] [Algebra K L] + [Small.{0} K] [Small.{0} L] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] : + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + ((ValuativeRel.valuation (Shrink.{0} L)).valuationSubring).decompositionSubgroup + (Shrink.{0} K) ≃ + ((ValuativeRel.valuation L).valuationSubring).decompositionSubgroup K := + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + (shrinkGalEquiv K L).subtypeEquiv + (shrink_mem_decompositionSubgroup_iff K L) + +/-- Each natural-index lower ramification group has the same elements after +conjugating through the small field representatives. -/ +noncomputable def shrinkLowerRamificationGroupEquiv + (K L : Type*) [Field K] [Field L] [Algebra K L] + [Small.{0} K] [Small.{0} L] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] (n : ℕ) : + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + ClassFieldTheory.lowerRamificationGroup (Shrink.{0} K) + (ValuativeRel.valuation (Shrink.{0} L)).valuationSubring n ≃ + ClassFieldTheory.lowerRamificationGroup K + (ValuativeRel.valuation L).valuationSubring n := + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + (shrinkDecompositionGroupEquiv K L).subtypeEquiv (by + intro σ + exact shrink_mem_lowerRamificationGroup_iff K L n σ.1 σ.2) + +/-- The canonical lower groups have equal cardinalities at every natural +index before and after shrinking the field carriers. -/ +theorem shrink_card_lowerRamificationGroup_eq + (K L : Type*) [Field K] [Field L] [Algebra K L] + [Small.{0} K] [Small.{0} L] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] (n : ℕ) : + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + Nat.card (ClassFieldTheory.lowerRamificationGroup (Shrink.{0} K) + (ValuativeRel.valuation (Shrink.{0} L)).valuationSubring n) = + Nat.card (ClassFieldTheory.lowerRamificationGroup K + (ValuativeRel.valuation L).valuationSubring n) := + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + Nat.card_congr (shrinkLowerRamificationGroupEquiv K L n) + +/-- Equality of two lower ramification groups is invariant under shrinking +both local fields. -/ +theorem shrink_lowerRamificationGroup_eq_iff + (K L : Type*) [Field K] [Field L] [Algebra K L] + [Small.{0} K] [Small.{0} L] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] (m n : ℕ) : + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + ClassFieldTheory.lowerRamificationGroup (Shrink.{0} K) + (ValuativeRel.valuation (Shrink.{0} L)).valuationSubring m = + ClassFieldTheory.lowerRamificationGroup (Shrink.{0} K) + (ValuativeRel.valuation (Shrink.{0} L)).valuationSubring n ↔ + ClassFieldTheory.lowerRamificationGroup K + (ValuativeRel.valuation L).valuationSubring m = + ClassFieldTheory.lowerRamificationGroup K + (ValuativeRel.valuation L).valuationSubring n := + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + by + let B := (ValuativeRel.valuation (Shrink.{0} L)).valuationSubring + let A := (ValuativeRel.valuation L).valuationSubring + let e := shrinkDecompositionGroupEquiv K L + have hmem (i : ℕ) (σ : B.decompositionSubgroup (Shrink.{0} K)) : + σ ∈ ClassFieldTheory.lowerRamificationGroup (Shrink.{0} K) B i ↔ + e σ ∈ ClassFieldTheory.lowerRamificationGroup K A i := + shrink_mem_lowerRamificationGroup_iff K L i σ.1 σ.2 + constructor + · intro h + apply Subgroup.ext + intro τ + let σ := e.symm τ + calc + τ ∈ ClassFieldTheory.lowerRamificationGroup K A m ↔ + σ ∈ ClassFieldTheory.lowerRamificationGroup (Shrink.{0} K) B m := by + simpa [σ] using (hmem m σ).symm + _ ↔ σ ∈ ClassFieldTheory.lowerRamificationGroup (Shrink.{0} K) B n := by + rw [h] + _ ↔ τ ∈ ClassFieldTheory.lowerRamificationGroup K A n := by + simpa [σ] using hmem n σ + · intro h + apply Subgroup.ext + intro σ + calc + σ ∈ ClassFieldTheory.lowerRamificationGroup (Shrink.{0} K) B m ↔ + e σ ∈ ClassFieldTheory.lowerRamificationGroup K A m := hmem m σ + _ ↔ e σ ∈ ClassFieldTheory.lowerRamificationGroup K A n := by rw [h] + _ ↔ σ ∈ ClassFieldTheory.lowerRamificationGroup (Shrink.{0} K) B n := + (hmem n σ).symm + +/-- The public lower-jump predicate is invariant under changing to the +small representatives of a local extension. -/ +theorem shrink_isLowerRamificationJump_iff + (K L : Type*) [Field K] [Field L] [Algebra K L] + [Small.{0} K] [Small.{0} L] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] (n : ℕ) : + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + ClassFieldTheory.IsLowerRamificationJump (Shrink.{0} K) + (ValuativeRel.valuation (Shrink.{0} L)).valuationSubring n ↔ + ClassFieldTheory.IsLowerRamificationJump K + (ValuativeRel.valuation L).valuationSubring n := + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + not_congr (shrink_lowerRamificationGroup_eq_iff K L n (n + 1)) + +/-- The rational finite-sum Herbrand value at a natural lower index is +unchanged by shrinking the extension fields. -/ +theorem shrink_herbrandFunctionAtLowerIndex_eq + (K L : Type*) [Field K] [Field L] [Algebra K L] + [Small.{0} K] [Small.{0} L] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] (n : ℕ) : + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + ClassFieldTheory.herbrandFunctionAtLowerIndex (Shrink.{0} K) + (ValuativeRel.valuation (Shrink.{0} L)).valuationSubring n = + ClassFieldTheory.herbrandFunctionAtLowerIndex K + (ValuativeRel.valuation L).valuationSubring n := + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + by + unfold ClassFieldTheory.herbrandFunctionAtLowerIndex + congr 1 + · apply Finset.sum_congr rfl + intro i hi + rw [shrink_card_lowerRamificationGroup_eq K L i] + · rw [shrink_card_lowerRamificationGroup_eq K L 0] + +end HasseArf diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber.lean new file mode 100644 index 0000000000..5358ff373c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber.lean @@ -0,0 +1,27 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Final +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumCyclotomicTarget +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumGlobalEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLeftFactors +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLocalizationEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuationInertiaBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuedEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalPadicPrimePowInertiaBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.LocalCyclotomicEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalCyclotomicArithmeticReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalRayClassFieldCyclotomic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RayClassComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Setup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.UnramifiedCompositumSupport + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/All.lean new file mode 100644 index 0000000000..3674bd824c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/All.lean @@ -0,0 +1,26 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Final +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumCyclotomicTarget +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumGlobalEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLeftFactors +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLocalizationEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuationInertiaBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuedEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalPadicPrimePowInertiaBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.LocalCyclotomicEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalCyclotomicArithmeticReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalRayClassFieldCyclotomic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RayClassComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Setup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.UnramifiedCompositumSupport + +/-! # All -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Core.lean new file mode 100644 index 0000000000..1d8107beb3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Core.lean @@ -0,0 +1,61 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.LocalCyclotomicEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalCyclotomicArithmeticReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Final +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumCyclotomicTarget +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumGlobalEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLeftFactors +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLocalizationEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuationInertiaBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuedEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalPadicPrimePowInertiaBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalRayClassFieldCyclotomic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RayClassComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Setup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.UnramifiedCompositumSupport +/-! +# Kronecker--Weber + +The reader-facing entry point for the local and global Kronecker--Weber +theorems. Importing this module exposes both supported endpoints. +-/ + +@[expose] public section + +/-! +# The global Kronecker--Weber theorem + +Every finite abelian extension of `ℚ` is contained in a cyclotomic field. +The arithmetic construction and global degree estimate are kept in the +semantic support modules under `KroneckerWeber.Global`; this root exposes the +canonical theorem statement. +-/ + +noncomputable +section + +namespace KroneckerWeber + +/-- **Global Kronecker--Weber.** + +Every finite abelian extension of `ℚ` embeds in `ℚ(ζₙ)` for some positive +integer `n`. Here `CyclotomicField n ℚ` is the concrete model of +`ℚ(ζₙ)`. -/ +theorem exists_cyclotomicEmbedding + (L : Type) [Field L] [NumberField L] [IsAbelianGalois ℚ L] : + ∃ n : ℕ, 0 < n ∧ + Nonempty (L →ₐ[ℚ] CyclotomicField n ℚ) := + ⟨kroneckerWeberConductorCandidate (L := L), + kroneckerWeberConductorCandidate_pos (L := L), + ⟨kroneckerWeberCyclotomicEmbedding (L := L)⟩⟩ + +end KroneckerWeber + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Final.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Final.lean new file mode 100644 index 0000000000..583d22b6ec --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Final.lean @@ -0,0 +1,132 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuationInertiaBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.PadicValuationInertia +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.UnramifiedCompositumSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeFromChosenPrimes +/-! +# Global Kronecker--Weber + +The synchronized prime above each member of the finite ramification support +has inertia cardinality at most the corresponding prime-power totient. +Outside that support the auxiliary compositum is unramified. The finite +inertia groups therefore generate its full abelian Galois group, and their +product bounds its degree by the degree of the conductor cyclotomic field. +-/ + +@[expose] public section + +noncomputable +section + +namespace KroneckerWeber + +open NumberField +open AlgebraicNumberTheory +open AlgebraicNumberTheory.Ramification +open HilbertRamification.Dedekind +open scoped NumberField + +variable (L : Type) [Field L] +variable [hNF : NumberField L] [hLab : IsAbelianGalois ℚ L] + +/-- The global degree estimate which completes the arithmetic part of the +Kronecker–Weber argument. -/ +theorem kroneckerWeberCompositum_finrank_le_totient : + Module.finrank ℚ (kroneckerWeberCompositumField L) ≤ + Nat.totient (kroneckerWeberConductorCandidate (L := L)) := by + classical + let M := kroneckerWeberCompositumField L + let C := CyclotomicField (kroneckerWeberConductorCandidate (L := L)) ℚ + let S := kroneckerWeberRamifiedPrimes (L := L) + let e : Nat.Primes → ℕ := + kroneckerWeberLocalRamificationExponent (L := L) + let A : IntermediateField ℚ M := + kroneckerWeberCompositumLeftField (L := L) + let B : IntermediateField ℚ M := + (kroneckerWeberCompositumEmbeddingRight (L := L)).fieldRange + let eLA : L ≃ₐ[ℚ] A := + kroneckerWeberCompositumLeftEquiv (L := L) + let eCB : C ≃ₐ[ℚ] B := + AlgEquiv.ofInjectiveField + (kroneckerWeberCompositumEmbeddingRight (L := L)) + let _ : IsAbelianGalois ℚ A := + IsAbelianGalois.of_algHom eLA.symm.toAlgHom + let _ : IsAbelianGalois ℚ B := + IsAbelianGalois.of_algHom eCB.symm.toAlgHom + have hsup : A ⊔ B = ⊤ := by + change + (finiteAbelianCompositumEmbeddingLeft ℚ L + (CyclotomicField + (kroneckerWeberConductorCandidate (L := L)) ℚ)).fieldRange ⊔ + (finiteAbelianCompositumEmbeddingRight ℚ L + (CyclotomicField + (kroneckerWeberConductorCandidate (L := L)) ℚ)).fieldRange = ⊤ + exact finiteAbelianCompositum_embeddingRanges_sup_eq_top + ℚ L + (CyclotomicField + (kroneckerWeberConductorCandidate (L := L)) ℚ) + let chosen : ∀ p : Nat.Primes, + Ideal.primesOver (rationalPrimeIdeal p) (𝓞 M) := fun p ↦ + if hp : p ∈ S then + letI : Fact p.1.Prime := ⟨p.2⟩ + let wM := + kroneckerWeberGlobalCompositumCyclotomicPadicExtension + (L := L) p hp + have hpPrime : (⟨p.1, Fact.out⟩ : Nat.Primes) = p := + Subtype.ext rfl + ⟨globalPadicPrimeIdeal p.1 M wM, + globalPadicPrimeIdeal_isPrime p.1 M wM, + by simpa only [hpPrime] using globalPadicPrimeIdeal_liesOver p.1 M wM⟩ + else + kroneckerWeberCompositumPrimeAbove (L := L) p + have hunramifiedOutside : + ∀ (Q : Ideal (𝓞 M)) [Q.IsPrime] [Q.IsMaximal], + (¬ ∃ p ∈ S, rationalPrimeIdeal p = Q.under ℤ) → + Algebra.IsUnramifiedAt ℤ Q := by + intro Q _ _ hQ + exact kroneckerWeberCompositum_isUnramifiedAt_of_not_mem + (L := L) A B eLA eCB hsup Q hQ + have hcard : ∀ p ∈ S, + Nat.card + (inertiaGroup (chosen p).1 (M ≃ₐ[ℚ] M)) ≤ + Nat.totient (p.1 ^ e p) := by + intro p hp + let _ : Fact p.1.Prime := ⟨p.2⟩ + let wM := + kroneckerWeberGlobalCompositumCyclotomicPadicExtension + (L := L) p hp + have hchosen : + (chosen p).1 = globalPadicPrimeIdeal p.1 M wM := by + simp only [chosen, dite_eq_left hp] + congr 1 + rw [hchosen] + have hbridge := + globalPadicPrimeIdeal_inertia_natCard_le_valuationInertia p.1 M wM + have hlocal := + kroneckerWeberGlobalCompositumValuationInertiaCard_le + (L := L) p hp + rw [kroneckerWeberGlobalCompositumValuationInertiaCard] at hlocal + exact hbridge.trans hlocal + have hdegree := + finrank_le_totient_prod_primePowers_of_chosen_primes + M S e chosen hunramifiedOutside hcard + simpa [M, S, e, kroneckerWeberConductorCandidate] using hdegree + +/-- The actual embedding into the cyclotomic field whose order is the +conductor candidate assembled from the finitely many ramified primes. -/ +noncomputable def kroneckerWeberCyclotomicEmbedding : + L →ₐ[ℚ] + CyclotomicField (kroneckerWeberConductorCandidate (L := L)) ℚ := + kroneckerWeberEmbeddingOfCompositumFinrankLe + (L := L) (kroneckerWeberCompositum_finrank_le_totient (L := L)) + +end KroneckerWeber + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumCyclotomicTarget.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumCyclotomicTarget.lean new file mode 100644 index 0000000000..fa0147f14d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumCyclotomicTarget.lean @@ -0,0 +1,115 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Setup +/-! +# The common local cyclotomic target + +At a ramified prime `p`, the structured local embedding of `L` has order +`(p^f - 1) * p^e`, while the global conductor has order `p^e * c` with +`c` prime to `p`. Their common target has order +`((p^f - 1) * c) * p^e`; crucially, it uses the same exponent `e`. +-/ + +@[expose] public section + +noncomputable +section + +namespace KroneckerWeber + +variable (L : Type) [Field L] +variable [hNF : NumberField L] [hLab : IsAbelianGalois ℚ L] + +/-- The prime-to-`p` factor of the common local target. -/ +noncomputable def kroneckerWeberLocalCompositumCoprimePart + (p : Nat.Primes) : ℕ := + (p.1 ^ kroneckerWeberLocalUnramifiedDegree (L := L) p - 1) * + kroneckerWeberConductorCoprimePart (L := L) p + +/-- The common local cyclotomic order, retaining exactly the conductor +exponent chosen at `p`. -/ +noncomputable def kroneckerWeberLocalCompositumOrder + (p : Nat.Primes) : ℕ := + kroneckerWeberLocalCompositumCoprimePart (L := L) p * + p.1 ^ kroneckerWeberLocalRamificationExponent (L := L) p + +/-- The prime-to-`p` part of the common local target is coprime to `p`. -/ +theorem kroneckerWeberLocalCompositumCoprimePart_coprime + (p : Nat.Primes) : + Nat.Coprime p.1 + (kroneckerWeberLocalCompositumCoprimePart (L := L) p) := by + let : Fact p.1.Prime := ⟨p.2⟩ + rw [kroneckerWeberLocalCompositumCoprimePart] + have hprimeTo : Nat.Coprime p.1 + (p.1 ^ kroneckerWeberLocalUnramifiedDegree (L := L) p - 1) := by + rw [p.2.coprime_iff_not_dvd] + intro hdiv + have hpow : p.1 ∣ + p.1 ^ kroneckerWeberLocalUnramifiedDegree (L := L) p := + dvd_pow_self p.1 + (kroneckerWeberLocalUnramifiedDegree_pos (L := L) p).ne' + have hpowgt : 1 < + p.1 ^ kroneckerWeberLocalUnramifiedDegree (L := L) p := + one_lt_pow₀ p.2.one_lt + (kroneckerWeberLocalUnramifiedDegree_pos (L := L) p).ne' + have hdiff : + p.1 ^ kroneckerWeberLocalUnramifiedDegree (L := L) p - + (p.1 ^ kroneckerWeberLocalUnramifiedDegree (L := L) p - 1) = + 1 := by + omega + have hone : p.1 ∣ 1 := by + rw [← hdiff] + exact Nat.dvd_sub hpow hdiv + exact p.2.ne_one (Nat.dvd_one.mp hone) + exact hprimeTo.mul_right + (kroneckerWeberConductorCoprimePart_coprime (L := L) p) + +/-- The common local cyclotomic order is positive. -/ +theorem kroneckerWeberLocalCompositumOrder_pos + (p : Nat.Primes) : + 0 < kroneckerWeberLocalCompositumOrder (L := L) p := by + rw [kroneckerWeberLocalCompositumOrder, + kroneckerWeberLocalCompositumCoprimePart] + apply Nat.mul_pos + · apply Nat.mul_pos + · exact Nat.sub_pos_of_lt + (one_lt_pow₀ p.2.one_lt + (kroneckerWeberLocalUnramifiedDegree_pos (L := L) p).ne') + · rw [kroneckerWeberConductorCoprimePart] + exact Finset.prod_pos fun q _ ↦ pow_pos q.2.pos _ + · exact pow_pos p.2.pos _ + +/-- The structured local cyclotomic order divides the common local order. -/ +theorem kroneckerWeberLocalStructuredOrder_dvd_compositumOrder + (p : Nat.Primes) : + (p.1 ^ kroneckerWeberLocalUnramifiedDegree (L := L) p - 1) * + p.1 ^ kroneckerWeberLocalRamificationExponent (L := L) p ∣ + kroneckerWeberLocalCompositumOrder (L := L) p := by + refine ⟨kroneckerWeberConductorCoprimePart (L := L) p, ?_⟩ + rw [kroneckerWeberLocalCompositumOrder, + kroneckerWeberLocalCompositumCoprimePart] + ac_rfl + +/-- At a ramified prime, the global conductor candidate divides the common +local cyclotomic order. -/ +theorem kroneckerWeberConductorCandidate_dvd_localCompositumOrder + (p : Nat.Primes) + (hp : p ∈ kroneckerWeberRamifiedPrimes (L := L)) : + kroneckerWeberConductorCandidate (L := L) ∣ + kroneckerWeberLocalCompositumOrder (L := L) p := by + rw [kroneckerWeberConductorCandidate_eq_primePower_mul_coprimePart + (L := L) p hp] + refine ⟨p.1 ^ kroneckerWeberLocalUnramifiedDegree (L := L) p - 1, ?_⟩ + rw [kroneckerWeberLocalCompositumOrder, + kroneckerWeberLocalCompositumCoprimePart] + ac_rfl + +end KroneckerWeber + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumGlobalEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumGlobalEmbedding.lean new file mode 100644 index 0000000000..4c68cc18cb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumGlobalEmbedding.lean @@ -0,0 +1,58 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLeftFactors +/-! +# The global cyclotomic factor inside the common local target + +The global conductor cyclotomic field embeds, after base change and enlargement +of the order, into the common `p`-adic cyclotomic target used by the synchronized +valued compositum construction. +-/ + +@[expose] public section + +noncomputable +section + +namespace KroneckerWeber + +open AlgebraicNumberTheory +open AlgebraicNumberTheory.Valuations + +variable (L : Type) [Field L] +variable [hNF : NumberField L] [hLab : IsAbelianGalois ℚ L] + +/-- The global conductor cyclotomic factor embedded after base change to +`ℚ_p` and enlargement of the cyclotomic order. -/ +noncomputable def kroneckerWeberGlobalRightEmbeddingProperty + (p : Nat.Primes) : Prop := by + letI : Fact p.1.Prime := ⟨p.2⟩ + exact Nonempty + (CyclotomicField (kroneckerWeberConductorCandidate (L := L)) ℚ →ₐ[ℚ] + CyclotomicField (kroneckerWeberLocalCompositumOrder (L := L) p) + ℚ_[p.1]) + +/-- At a ramified prime, the global conductor cyclotomic field embeds into +the common local cyclotomic target. -/ +theorem kroneckerWeberGlobalRightEmbedding + (p : Nat.Primes) + (hp : p ∈ kroneckerWeberRamifiedPrimes (L := L)) : + kroneckerWeberGlobalRightEmbeddingProperty (L := L) p := by + let : Fact p.1.Prime := ⟨p.2⟩ + exact ⟨cyclotomicFieldEmbeddingOfBaseAndDvd ℚ ℚ_[p.1] + (kroneckerWeberConductorCandidate (L := L)) + (kroneckerWeberLocalCompositumOrder (L := L) p) + (kroneckerWeberConductorCandidate_pos (L := L)) + (kroneckerWeberLocalCompositumOrder_pos (L := L) p) + (kroneckerWeberConductorCandidate_dvd_localCompositumOrder + (L := L) p hp)⟩ + +end KroneckerWeber + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLeftFactors.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLeftFactors.lean new file mode 100644 index 0000000000..f46e6f304d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLeftFactors.lean @@ -0,0 +1,140 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.CompositumEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumCyclotomicTarget +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicLocalizationCanonicalValuation +/-! +# The left-factor ring embedding for the global compositum + +The chosen localization remains internal to the proof. The +public statement mentions only a ring embedding from `L` to the common +local cyclotomic target, so elaborating its type never unfolds completion +or transported-algebra instances. Rational linearity is added separately +in the global-factor file by `map_ratCast`. +-/ + +@[expose] public section + +noncomputable +section + +namespace KroneckerWeber + +open AlgebraicNumberTheory +open AlgebraicNumberTheory.Valuations +open HilbertRamification + +variable (L : Type) [Field L] +variable [hNF : NumberField L] [hLab : IsAbelianGalois ℚ L] + +/-- A ring embedding of `L` into the common local cyclotomic target which +pulls the canonical target absolute value back to the chosen `p`-adic place. +Its factorization through the chosen localization is retained in the proof, +without exposing that expensive localization type in this declaration. -/ +noncomputable def kroneckerWeberGlobalLeftRingEmbeddingProperty + (p : Nat.Primes) : Prop := by + let _ : Fact p.1.Prime := ⟨p.2⟩ + let N := kroneckerWeberLocalCompositumOrder (L := L) p + have hN : 0 < N := kroneckerWeberLocalCompositumOrder_pos (L := L) p + letI : NeZero N := ⟨hN.ne'⟩ + let T := CyclotomicField N ℚ_[p.1] + letI : FiniteDimensional ℚ_[p.1] T := + IsCyclotomicExtension.finiteDimensional {N} ℚ_[p.1] T + let w := kroneckerWeberPadicExtension (L := L) p.1 + exact ∃ i : L →+* T, ∀ x : L, + padicFiniteExtensionAbsoluteValue p.1 T (i x) = w.1 x + +/-- The global field admits a ring embedding into the common local target +which preserves the chosen `p`-adic place. -/ +theorem kroneckerWeberGlobalLeftRingEmbedding + (p : Nat.Primes) : + kroneckerWeberGlobalLeftRingEmbeddingProperty (L := L) p := by + let _ : Fact p.1.Prime := ⟨p.2⟩ + let w := kroneckerWeberPadicExtension (L := L) p.1 + let vK := Rat.AbsoluteValue.padic p.1 + let _ : Field vK.Completion := inferInstance + let _ : Field w.1.Completion := inferInstance + let hK := AbsoluteValue.extensionCompletionAlgebra (K := ℚ) w.1 + let _ : Algebra ℚ w.1.Completion := hK + let _ : SMul ℚ w.1.Completion := hK.toSMul + let _ := AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + let hE : Field E := inferInstance + let _ : Field E := hE + let hBaseE : Algebra vK.Completion E := inferInstance + let _ : Algebra vK.Completion E := hBaseE + let e := padicAbsoluteValueCompletionRingEquiv p.1 + let hQpE : Algebra ℚ_[p.1] E := + @transportedAlgebraAlongRingEquiv vK.Completion ℚ_[p.1] E _ _ + (@CommRing.toCommSemiring E hE.toCommRing) hBaseE e + let _ : Algebra ℚ_[p.1] E := hQpE + let _ : Module.Finite vK.Completion E := + globalPadicLocalizationModuleFinite p.1 L w + let _ : Algebra ℚ_[p.1] vK.Completion := e.symm.toRingHom.toAlgebra + let _ : IsScalarTower ℚ_[p.1] vK.Completion E := + IsScalarTower.of_algebraMap_eq' (by + ext x + exact transportedAlgebraAlongRingEquiv_algebraMap e x) + let _ : Module.Finite ℚ_[p.1] vK.Completion := + FiniteDimensional.of_surjective + (Algebra.linearMap ℚ_[p.1] vK.Completion) e.symm.surjective + let _ : Module.Finite ℚ_[p.1] E := Module.Finite.trans vK.Completion E + let u := + (p.1 ^ kroneckerWeberLocalUnramifiedDegree (L := L) p - 1) * + p.1 ^ kroneckerWeberLocalRamificationExponent (L := L) p + let N := kroneckerWeberLocalCompositumOrder (L := L) p + have hu : 0 < u := by + apply Nat.mul_pos + · exact Nat.sub_pos_of_lt + (one_lt_pow₀ p.2.one_lt + (kroneckerWeberLocalUnramifiedDegree_pos (L := L) p).ne') + · exact pow_pos p.2.pos _ + have hN : 0 < N := + kroneckerWeberLocalCompositumOrder_pos (L := L) p + let _ : NeZero N := ⟨hN.ne'⟩ + let _ : FiniteDimensional ℚ_[p.1] (CyclotomicField N ℚ_[p.1]) := + IsCyclotomicExtension.finiteDimensional {N} ℚ_[p.1] + (CyclotomicField N ℚ_[p.1]) + have hi := kroneckerWeberLocalCyclotomicEmbedding (L := L) p + change Nonempty (E →ₐ[ℚ_[p.1]] CyclotomicField u ℚ_[p.1]) at hi + obtain ⟨i⟩ := hi + let iup : CyclotomicField u ℚ_[p.1] →ₐ[ℚ_[p.1]] + CyclotomicField N ℚ_[p.1] := + cyclotomicFieldEmbeddingOfDvd ℚ_[p.1] u N hu hN + (kroneckerWeberLocalStructuredOrder_dvd_compositumOrder + (L := L) p) + let ilocal : E →ₐ[ℚ_[p.1]] CyclotomicField N ℚ_[p.1] := + iup.comp i + let iGlobal : L →+* CyclotomicField N ℚ_[p.1] := + ilocal.toRingHom.comp (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2) + have hAbsolute := globalPadicLocalizationAbsoluteValue_eq_canonical p.1 L w + change AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 = + padicFiniteExtensionAbsoluteValue p.1 E at hAbsolute + refine ⟨iGlobal, ?_⟩ + intro x + change padicFiniteExtensionAbsoluteValue p.1 + (CyclotomicField N ℚ_[p.1]) + (ilocal (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x)) = w.1 x + calc + padicFiniteExtensionAbsoluteValue p.1 + (CyclotomicField N ℚ_[p.1]) + (ilocal (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x)) = + padicFiniteExtensionAbsoluteValue p.1 E + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x) := + padicFiniteExtensionAbsoluteValue_algHom p.1 ilocal _ + _ = AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x) := by + rw [hAbsolute] + _ = w.1 x := + AbsoluteValue.algebraicLocalizationAbsoluteValue_toAlgebraicLocalization vK w.1 w.2 x + +end KroneckerWeber + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLocalizationEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLocalizationEmbedding.lean new file mode 100644 index 0000000000..cb13579fc4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLocalizationEmbedding.lean @@ -0,0 +1,151 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuedEmbedding +/-! +# Embedding the localized global compositum in the common cyclotomic target + +The synchronized global embedding is an isometry for the pulled-back place. +It therefore extends to completions. Compatibility on the completed base +identifies the restriction to the chosen localization as a genuine +`ℚ_p`-algebra embedding into the same common cyclotomic target. +-/ + +@[expose] public section + +noncomputable +section + +namespace KroneckerWeber + +open AlgebraicNumberTheory.Valuations +open HilbertRamification + +variable (L : Type) [Field L] +variable [hNF : NumberField L] [hLab : IsAbelianGalois ℚ L] + +/-- The actual embedding type, named one layer before taking `Nonempty` so +later theorem declarations do not normalize the localization construction. -/ +noncomputable def kroneckerWeberGlobalCompositumLocalizationAlgHom + (p : Nat.Primes) [Fact p.1.Prime] + (hp : p ∈ kroneckerWeberRamifiedPrimes (L := L)) : Type := by + let M := kroneckerWeberCompositumField L + let wM := + kroneckerWeberGlobalCompositumCyclotomicPadicExtension (L := L) p hp + let N := kroneckerWeberLocalCompositumOrder (L := L) p + exact globalPadicLocalizationCyclotomicAlgHom p.1 M wM N + +/-- The localized global compositum embeds into the common local cyclotomic +target at every ramified prime. -/ +theorem kroneckerWeberGlobalCompositumLocalizationEmbedding + (p : Nat.Primes) [Fact p.1.Prime] + (hp : p ∈ kroneckerWeberRamifiedPrimes (L := L)) : + Nonempty + (kroneckerWeberGlobalCompositumLocalizationAlgHom + (L := L) p hp) := by + let M := kroneckerWeberCompositumField L + let N := kroneckerWeberLocalCompositumOrder (L := L) p + have hN : 0 < N := kroneckerWeberLocalCompositumOrder_pos (L := L) p + let _ : NeZero N := ⟨hN.ne'⟩ + let T := CyclotomicField N ℚ_[p.1] + let _ : Field T := inferInstance + let _ : FiniteDimensional ℚ_[p.1] T := + IsCyclotomicExtension.finiteDimensional {N} ℚ_[p.1] T + let W := + kroneckerWeberGlobalValuedCompositumEmbeddingData (L := L) p hp + let wM := + kroneckerWeberGlobalCompositumCyclotomicPadicExtension (L := L) p hp + let vK := Rat.AbsoluteValue.padic p.1 + let aT := padicFiniteExtensionAbsoluteValue p.1 T + have hW : ∀ x : M, aT (W.embedding x) = wM.1 x := by + intro x + rfl + let _ : CompleteSpace (WithAbs aT) := + completeSpace_withAbs_of_isCompleteForAbsoluteValue aT + (padicFiniteExtensionAbsoluteValue_complete p.1 T) + let F : wM.1.Completion →+* WithAbs aT := + AbsoluteValue.completionMapToCompleteTarget + wM.1 aT W.embedding.toRingHom hW + let _ : Field vK.Completion := inferInstance + let _ : Field wM.1.Completion := inferInstance + let hK := AbsoluteValue.extensionCompletionAlgebra (K := ℚ) wM.1 + let _ : Algebra ℚ wM.1.Completion := hK + let _ : SMul ℚ wM.1.Completion := hK.toSMul + let _ := AbsoluteValue.completionAlgebra vK wM.1 wM.2 + let E := AbsoluteValue.algebraicLocalization vK wM.1 wM.2 + let hE : Field E := inferInstance + let _ : Field E := hE + let hBaseE : Algebra vK.Completion E := inferInstance + let _ : Algebra vK.Completion E := hBaseE + let e := padicAbsoluteValueCompletionRingEquiv p.1 + let _ : Algebra ℚ_[p.1] E := + @transportedAlgebraAlongRingEquiv vK.Completion ℚ_[p.1] E _ _ + (@CommRing.toCommSemiring E hE.toCommRing) hBaseE e + let g : vK.Completion →+* WithAbs aT := + (WithAbs.equiv aT).symm.toRingHom.comp + ((algebraMap ℚ_[p.1] T).comp e.toRingHom) + have hgNorm (x : vK.Completion) : ‖g x‖ = ‖x‖ := by + change aT (algebraMap ℚ_[p.1] T (e x)) = ‖x‖ + rw [padicFiniteExtensionAbsoluteValue_extends] + change ‖padicAbsoluteValueCompletionRingHom p.1 x‖ = ‖x‖ + exact + (padicAbsoluteValueCompletionRingHom_isometry p.1).norm_map_of_map_zero + (map_zero (padicAbsoluteValueCompletionRingHom p.1)) x + have hg : Isometry g := + AddMonoidHomClass.isometry_of_norm g hgNorm + have hbase (x : vK.Completion) : + F (AbsoluteValue.completionMap vK wM.1 wM.2 x) = g x := by + have hcomp : + F.comp (AbsoluteValue.completionMap vK wM.1 wM.2) = g := by + change + (AbsoluteValue.completionMapToCompleteTarget + wM.1 aT W.embedding.toRingHom hW).comp + (AbsoluteValue.completionMap vK wM.1 wM.2) = g + apply + AbsoluteValue.completionMapToCompleteTarget_comp_completionMap_eq_of_coe_eq + vK wM.1 wM.2 aT W.embedding.toRingHom hW g hg.continuous + intro q + dsimp only [g, RingHom.comp_apply] + apply congrArg (WithAbs.equiv aT).symm + change W.embedding (algebraMap ℚ M q) = + algebraMap ℚ_[p.1] T + (e (((WithAbs.equiv vK).symm q : WithAbs vK) : + vK.Completion)) + rw [W.embedding.commutes] + have he : e (((WithAbs.equiv vK).symm q : WithAbs vK) : + vK.Completion) = padicAbsoluteValueBaseMap p.1 + ((WithAbs.equiv vK).symm q) := by + change padicAbsoluteValueCompletionRingHom p.1 + (((WithAbs.equiv vK).symm q : WithAbs vK) : vK.Completion) = _ + exact padicAbsoluteValueCompletionRingHom_coe p.1 _ + have hq : algebraMap ℚ T q = + algebraMap ℚ_[p.1] T + (padicAbsoluteValueBaseMap p.1 ((WithAbs.equiv vK).symm q)) := by + simp + exact hq.trans (congrArg (algebraMap ℚ_[p.1] T) he.symm) + exact DFunLike.congr_fun hcomp x + let iRing : E →+* T := + (WithAbs.equiv aT).toRingHom.comp + (F.comp E.val.toRingHom) + change Nonempty (E →ₐ[ℚ_[p.1]] T) + refine ⟨ + { __ := iRing + commutes' := ?_ }⟩ + intro q + change (WithAbs.equiv aT) + (F (AbsoluteValue.completionMap vK wM.1 wM.2 (e.symm q))) = + algebraMap ℚ_[p.1] T q + rw [hbase] + change algebraMap ℚ_[p.1] T (e (e.symm q)) = + algebraMap ℚ_[p.1] T q + rw [e.apply_symm_apply] + +end KroneckerWeber + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuationInertiaBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuationInertiaBound.lean new file mode 100644 index 0000000000..829aec9f3b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuationInertiaBound.lean @@ -0,0 +1,78 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLocalizationEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalPadicPrimePowInertiaBound +/-! +# The fixed-conductor local inertia bound for the auxiliary compositum + +At each chosen ramified prime, the localization of the single global +compositum embeds in the common local cyclotomic field whose `p`-power part +is exactly the exponent selected from `L`. The arbitrary-coprime local +bound therefore gives the sharp factor `φ(p^e)`. +-/ + +@[expose] public section + +noncomputable +section + +namespace KroneckerWeber + +open AlgebraicNumberTheory.Valuations +open HilbertRamification + +variable (L : Type) [Field L] +variable [hNF : NumberField L] [hLab : IsAbelianGalois ℚ L] + +/-- The cardinality of the valuation-theoretic inertia group of the fixed +global compositum at its synchronized place above `p`. Naming this natural +number keeps the completion/localization type out of later declaration +types. -/ +noncomputable def kroneckerWeberGlobalCompositumValuationInertiaCard + (p : Nat.Primes) [Fact p.1.Prime] + (hp : p ∈ kroneckerWeberRamifiedPrimes (L := L)) : ℕ := by + let M := kroneckerWeberCompositumField L + let wM := + kroneckerWeberGlobalCompositumCyclotomicPadicExtension (L := L) p hp + let vK := Rat.AbsoluteValue.padic p.1 + let hw := HilbertRamification.absoluteValueExtension_nonarchimedean_of_base + vK wM (rationalPadicAbsoluteValue_nonarchimedean p.1) + exact Nat.card + (RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup ℚ + (HilbertRamification.absoluteValueExtensionValuationSubring + vK wM hw)) + +/-- The exact local factor used in the global product estimate. -/ +theorem kroneckerWeberGlobalCompositumValuationInertiaCard_le + (p : Nat.Primes) [Fact p.1.Prime] + (hp : p ∈ kroneckerWeberRamifiedPrimes (L := L)) : + kroneckerWeberGlobalCompositumValuationInertiaCard (L := L) p hp ≤ + Nat.totient + (p.1 ^ kroneckerWeberLocalRamificationExponent (L := L) p) := by + let M := kroneckerWeberCompositumField L + let wM := + kroneckerWeberGlobalCompositumCyclotomicPadicExtension (L := L) p hp + let r := kroneckerWeberLocalCompositumCoprimePart (L := L) p + let e := kroneckerWeberLocalRamificationExponent (L := L) p + have hpr : Nat.Coprime p.1 r := + kroneckerWeberLocalCompositumCoprimePart_coprime (L := L) p + have hi := + kroneckerWeberGlobalCompositumLocalizationEmbedding (L := L) p hp + change Nonempty + (globalPadicLocalizationCyclotomicAlgHom p.1 M wM + (r * p.1 ^ e)) at hi + let i : globalPadicLocalizationCyclotomicAlgHom p.1 M wM + (r * p.1 ^ e) := Classical.choice hi + rw [kroneckerWeberGlobalCompositumValuationInertiaCard] + exact globalPadicInertia_natCard_le_coprimeCyclotomicPrimePowTotient + p.1 M wM r e hpr i + +end KroneckerWeber + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuedEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuedEmbedding.lean new file mode 100644 index 0000000000..aeecc6f486 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuedEmbedding.lean @@ -0,0 +1,172 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumGlobalEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicLocalizationCanonicalValuation +/-! +# A valued global embedding of the auxiliary compositum + +The left factor is embedded through its chosen localization. +Consequently the pullback of the canonical absolute value on the common +local cyclotomic target is exactly the chosen `p`-adic place. The corrected +normal-compositum embedding preserves this exact left restriction. +-/ + +@[expose] public section + +noncomputable +section + +namespace KroneckerWeber + +open AlgebraicNumberTheory +open AlgebraicNumberTheory.Valuations +open HilbertRamification + +variable (L : Type) [Field L] +variable [hNF : NumberField L] [hLab : IsAbelianGalois ℚ L] + +/-- The value-preserving property for a global left-factor embedding. The +finite-dimensional structure of the concrete cyclotomic target remains +internal to this named proposition. -/ +noncomputable def kroneckerWeberGlobalLeftEmbeddingPreservesPadicPlace + (p : Nat.Primes) [Fact p.1.Prime] + (i : L →ₐ[ℚ] + CyclotomicField (kroneckerWeberLocalCompositumOrder (L := L) p) + ℚ_[p.1]) : Prop := by + let N := kroneckerWeberLocalCompositumOrder (L := L) p + have hN : 0 < N := kroneckerWeberLocalCompositumOrder_pos (L := L) p + letI : NeZero N := ⟨hN.ne'⟩ + let T := CyclotomicField N ℚ_[p.1] + letI : FiniteDimensional ℚ_[p.1] T := + IsCyclotomicExtension.finiteDimensional {N} ℚ_[p.1] T + let w := kroneckerWeberPadicExtension (L := L) p.1 + exact ∀ x : L, + padicFiniteExtensionAbsoluteValue p.1 T (i x) = w.1 x + +/-- A global left-factor embedding which preserves the particular `p`-adic +place used to choose the local exponent. -/ +noncomputable def kroneckerWeberGlobalValuedLeftEmbeddingProperty + (p : Nat.Primes) : Prop := by + letI : Fact p.1.Prime := ⟨p.2⟩ + let T := + CyclotomicField (kroneckerWeberLocalCompositumOrder (L := L) p) ℚ_[p.1] + exact ∃ i : L →ₐ[ℚ] T, + kroneckerWeberGlobalLeftEmbeddingPreservesPadicPlace (L := L) p i + +/-- The global field embeds into the common local cyclotomic target while +preserving the chosen `p`-adic place. -/ +theorem kroneckerWeberGlobalValuedLeftEmbedding + (p : Nat.Primes) : + kroneckerWeberGlobalValuedLeftEmbeddingProperty (L := L) p := by + let : Fact p.1.Prime := ⟨p.2⟩ + let N := kroneckerWeberLocalCompositumOrder (L := L) p + have hN : 0 < N := kroneckerWeberLocalCompositumOrder_pos (L := L) p + let : NeZero N := ⟨hN.ne'⟩ + let T := CyclotomicField N ℚ_[p.1] + let : FiniteDimensional ℚ_[p.1] T := + IsCyclotomicExtension.finiteDimensional {N} ℚ_[p.1] T + let w := kroneckerWeberPadicExtension (L := L) p.1 + have hi := kroneckerWeberGlobalLeftRingEmbedding (L := L) p + change ∃ r : L →+* T, ∀ x : L, + padicFiniteExtensionAbsoluteValue p.1 T (r x) = w.1 x at hi + obtain ⟨r, hr⟩ := hi + let i : L →ₐ[ℚ] T := + { __ := r + commutes' := fun q ↦ map_ratCast r q } + refine ⟨i, ?_⟩ + change ∀ x : L, + padicFiniteExtensionAbsoluteValue p.1 T (i x) = w.1 x + exact hr + +/-- A common-target compositum embedding whose restriction to `L` induces +the chosen `p`-adic absolute value. -/ +structure KroneckerWeberGlobalValuedCompositumEmbeddingData + (p : Nat.Primes) [Fact p.1.Prime] where + /-- The value-preserving embedding of the original global field. -/ + leftEmbedding : + L →ₐ[ℚ] + CyclotomicField (kroneckerWeberLocalCompositumOrder (L := L) p) + ℚ_[p.1] + /-- The embedding of the global compositum into the common local target. -/ + embedding : + kroneckerWeberCompositumField L →ₐ[ℚ] + CyclotomicField (kroneckerWeberLocalCompositumOrder (L := L) p) + ℚ_[p.1] + /-- The compositum embedding restricts to the chosen left-factor embedding. -/ + embedding_left : ∀ x : L, + embedding (kroneckerWeberCompositumEmbeddingLeft (L := L) x) = + leftEmbedding x + /-- The left-factor embedding pulls back the canonical target absolute value + to the chosen `p`-adic place. -/ + leftEmbedding_absoluteValue : + kroneckerWeberGlobalLeftEmbeddingPreservesPadicPlace + (L := L) p leftEmbedding + +/-- The synchronized valued embeddings of the original field and its global +cyclotomic compositum into the common local target. -/ +noncomputable def kroneckerWeberGlobalValuedCompositumEmbeddingData + (p : Nat.Primes) + (hp : p ∈ kroneckerWeberRamifiedPrimes (L := L)) : + letI : Fact p.1.Prime := ⟨p.2⟩ + KroneckerWeberGlobalValuedCompositumEmbeddingData (L := L) p := by + letI : Fact p.1.Prime := ⟨p.2⟩ + let hi := kroneckerWeberGlobalValuedLeftEmbedding (L := L) p + let i := Classical.choose hi + let hiAbs := Classical.choose_spec hi + let j : + CyclotomicField (kroneckerWeberConductorCandidate (L := L)) ℚ →ₐ[ℚ] + CyclotomicField (kroneckerWeberLocalCompositumOrder (L := L) p) + ℚ_[p.1] := + Classical.choice (kroneckerWeberGlobalRightEmbedding (L := L) p hp) + let hex := + exists_finiteGaloisCompositumEmbeddingOfEmbeddings_left_eq + ℚ L (CyclotomicField (kroneckerWeberConductorCandidate (L := L)) ℚ) + (CyclotomicField (kroneckerWeberLocalCompositumOrder (L := L) p) + ℚ_[p.1]) i j + let g := Classical.choose hex + let hg := Classical.choose_spec hex + exact ⟨i, g, hg, hiAbs⟩ + +/-- The synchronized `p`-adic place on the global compositum, pulled back +from the canonical absolute value on the common local cyclotomic target. -/ +noncomputable def kroneckerWeberGlobalCompositumCyclotomicPadicExtension + (p : Nat.Primes) [Fact p.1.Prime] + (hp : p ∈ kroneckerWeberRamifiedPrimes (L := L)) : + AbsoluteValueExtension (Rat.AbsoluteValue.padic p.1) + (kroneckerWeberCompositumField L) := by + let N := kroneckerWeberLocalCompositumOrder (L := L) p + have hN : 0 < N := kroneckerWeberLocalCompositumOrder_pos (L := L) p + letI : NeZero N := ⟨hN.ne'⟩ + let T := CyclotomicField N ℚ_[p.1] + letI : FiniteDimensional ℚ_[p.1] T := + IsCyclotomicExtension.finiteDimensional {N} ℚ_[p.1] T + let W := + kroneckerWeberGlobalValuedCompositumEmbeddingData (L := L) p hp + let aT := padicFiniteExtensionAbsoluteValue p.1 T + let aM : AbsoluteValue (kroneckerWeberCompositumField L) ℝ := + aT.comp W.embedding.injective + refine ⟨aM, ?_⟩ + intro q + change aT (W.embedding (algebraMap ℚ (kroneckerWeberCompositumField L) q)) = + Rat.AbsoluteValue.padic p.1 q + rw [W.embedding.commutes] + change aT (q : T) = Rat.AbsoluteValue.padic p.1 q + calc + aT (q : T) = aT (algebraMap ℚ_[p.1] T (q : ℚ_[p.1])) := by + congr 1 + _ = NormedField.toAbsoluteValue ℚ_[p.1] (q : ℚ_[p.1]) := + padicFiniteExtensionAbsoluteValue_extends p.1 T _ + _ = Rat.AbsoluteValue.padic p.1 q := by + change ‖(q : ℚ_[p.1])‖ = Rat.AbsoluteValue.padic p.1 q + simpa only [Rat.AbsoluteValue.padic_eq_padicNorm] using + Padic.eq_padicNorm (p := p.1) q + +end KroneckerWeber + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalPadicPrimePowInertiaBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalPadicPrimePowInertiaBound.lean new file mode 100644 index 0000000000..1dbfe35903 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalPadicPrimePowInertiaBound.lean @@ -0,0 +1,144 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRestrictionCard +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicInertiaBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicLocalizationCanonicalValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.LocalCyclotomicEmbedding +/-! +# The one-prime p-primary inertia bound + +This endpoint combines the localization–inertia comparison, the structured +local cyclotomic embedding, and the ramification comparison to replace the full cyclotomic + totient by +the exact `p`-primary factor `φ(p ^ n)`. +-/ + +@[expose] public section + +noncomputable +section + +namespace KroneckerWeber + +open AlgebraicNumberTheory.Valuations +open HilbertRamification + +variable (p : ℕ) [Fact p.Prime] +variable (L : Type) [Field L] [Algebra ℚ L] + [FiniteDimensional ℚ L] [IsAbelianGalois ℚ L] + +/-- If the localization at `w` actually embeds into the cyclotomic field of +order `r * p ^ n`, with `r` prime to `p`, then its global inertia group has +order at most `φ(p ^ n)`. This is the fixed-conductor local input used in +the global Kronecker–Weber argument. -/ +theorem globalPadicInertia_natCard_le_coprimeCyclotomicPrimePowTotient + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) L) + (r n : ℕ) (hpr : p.Coprime r) + (i : globalPadicLocalizationCyclotomicAlgHom + p L w (r * p ^ n)) : + let vK := Rat.AbsoluteValue.padic p + let hw := HilbertRamification.absoluteValueExtension_nonarchimedean_of_base + vK w (rationalPadicAbsoluteValue_nonarchimedean p) + Nat.card + (RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup ℚ + (HilbertRamification.absoluteValueExtensionValuationSubring + vK w hw)) ≤ + Nat.totient (p ^ n) := by + let vK := Rat.AbsoluteValue.padic p + let hvK := padicAbsoluteValue_isNontrivial p + let hv := rationalPadicAbsoluteValue_nonarchimedean p + let hw := HilbertRamification.absoluteValueExtension_nonarchimedean_of_base + vK w hv + let hK := AbsoluteValue.extensionCompletionAlgebra (K := ℚ) w.1 + let : SMul ℚ w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + let hE : Field E := inferInstance + let hBaseE : Algebra vK.Completion E := inferInstance + let e := padicAbsoluteValueCompletionRingEquiv p + let hQpE : Algebra ℚ_[p] E := + @transportedAlgebraAlongRingEquiv vK.Completion ℚ_[p] E _ _ + (@CommRing.toCommSemiring E hE.toCommRing) hBaseE e + let : Module.Finite vK.Completion E := + globalPadicLocalizationModuleFinite p L w + let : IsAbelianGalois vK.Completion E := + globalPadicLocalization_isAbelianGalois p L w + let : Algebra ℚ_[p] vK.Completion := e.symm.toRingHom.toAlgebra + let : IsScalarTower ℚ_[p] vK.Completion E := + IsScalarTower.of_algebraMap_eq' (by + ext x + exact transportedAlgebraAlongRingEquiv_algebraMap e x) + let : Module.Finite ℚ_[p] vK.Completion := + FiniteDimensional.of_surjective + (Algebra.linearMap ℚ_[p] vK.Completion) e.symm.surjective + let : Module.Finite ℚ_[p] E := Module.Finite.trans vK.Completion E + let : IsGalois ℚ_[p] E := by + apply IsGalois.of_equiv_equiv + (F := vK.Completion) (E := E) (M := ℚ_[p]) (N := E) + (f := e) (g := RingEquiv.refl E) + apply RingHom.ext + intro x + simp only [RingHom.comp_apply] + change + (@algebraMap ℚ_[p] E _ hE.toSemiring hQpE) (e x) = + (@algebraMap vK.Completion E _ hE.toSemiring hBaseE) x + change + (@algebraMap vK.Completion E _ hE.toSemiring hBaseE) + (e.symm (e x)) = + (@algebraMap vK.Completion E _ hE.toSemiring hBaseE) x + rw [e.symm_apply_apply] + change E →ₐ[ℚ_[p]] CyclotomicField (r * p ^ n) ℚ_[p] at i + let A := HilbertRamification.algebraicLocalizationValuationSubring + vK w hw + have hA := globalPadicLocalizationValuationSubring_eq_canonical p L w + change A = + absoluteValueValuationSubring + (padicFiniteExtensionAbsoluteValue p E) + (padicFiniteExtensionAbsoluteValue_nonarchimedean p E) at hA + have hRestrict : + Nat.card + (RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup vK.Completion A) ≤ + Nat.card + (RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup ℚ_[p] A) := + HilbertRamification.ValuationSubring.natCard_inertiaGroup_le_restrictScalars + (K := ℚ_[p]) (M := vK.Completion) A + have hCanonical : + Nat.card + (RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup ℚ_[p] + (absoluteValueValuationSubring + (padicFiniteExtensionAbsoluteValue p E) + (padicFiniteExtensionAbsoluteValue_nonarchimedean p E))) ≤ + Nat.totient (p ^ n) := + natCard_padicCanonicalInertia_le_totient_primePow_of_coprimeEmbedding + p r n hpr E i + calc + Nat.card + (RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup ℚ + (HilbertRamification.absoluteValueExtensionValuationSubring + vK w hw)) = + Nat.card + (RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup vK.Completion A) := + Nat.card_congr + (HilbertRamification.inertiaGroupEquivAlgebraicLocalization + vK hvK w hw).toEquiv + _ ≤ Nat.card + (RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup ℚ_[p] A) := + hRestrict + _ = Nat.card + (RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup ℚ_[p] + (absoluteValueValuationSubring + (padicFiniteExtensionAbsoluteValue p E) + (padicFiniteExtensionAbsoluteValue_nonarchimedean p E))) := by + rw [hA] + _ ≤ Nat.totient (p ^ n) := hCanonical + +end KroneckerWeber + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/LocalCyclotomicEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/LocalCyclotomicEmbedding.lean new file mode 100644 index 0000000000..d16dc23fef --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/LocalCyclotomicEmbedding.lean @@ -0,0 +1,352 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.NumberTheory.Cyclotomic.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalClassFieldAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormSubgroupFunctoriality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.PrincipalUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.StandardSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.Unramified +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.CyclotomicField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.PadicLocalization +/-! +# Local cyclotomic embeddings for the global construction + +This module proves local Kronecker--Weber through norm-subgroup order reversal, +then applies it to localizations of finite abelian extensions of `ℚ`. +-/ + +@[expose] public section + +noncomputable +section + +namespace KroneckerWeber + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation LocalClassFieldTheory +open LocalFieldTheory.Padic + +/-- The ramified cyclotomic branch of local Kronecker–Weber. When the chosen +prime element `p` is already a norm from `L`, the ramified realization theorem realizes the +principal-unit depth furnished by openness as an actual `p`-power +cyclotomic extension. Order reversal then embeds `L` into that extension. + +The extra norm condition is exactly what excludes the nontrivial unramified +part; the general construction also adjoins roots of +unity of order `p ^ f - 1`. -/ +theorem exists_pPowerCyclotomicEmbedding_of_padicPrime_mem_normSubgroup + (p : ℕ) [Fact p.Prime] + (L : Type) [Field L] [Algebra ℚ_[p] L] + [FiniteDimensional ℚ_[p] L] [IsAbelianGalois ℚ_[p] L] + (hpNorm : padicPrimeUnit p ∈ localNormSubgroup ℚ_[p] L) : + ∃ n : ℕ, 1 ≤ n ∧ + ∃ ζ : CyclotomicField (p ^ n) ℚ_[p], + IsPrimitiveRoot ζ (p ^ n) ∧ + Algebra.adjoin ℚ_[p] ({ζ} : Set _) = ⊤ ∧ + Nonempty (L →ₐ[ℚ_[p]] CyclotomicField (p ^ n) ℚ_[p]) := by + let : IsNonarchimedeanLocalField ℚ_[p] := + { toIsValuativeTopology := padicIsValuativeTopology p + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + obtain ⟨n, hn, hprincipal⟩ := + exists_uniformizerPrincipalSubgroup_one_le_normSubgroup + ℚ_[p] L (padicPrimeUnit p) hpNorm + have hpnpos : 0 < p ^ n := pow_pos (Fact.out : Nat.Prime p).pos n + let : NeZero (p ^ n) := ⟨Nat.ne_of_gt hpnpos⟩ + let C := CyclotomicField (p ^ n) ℚ_[p] + let : IsCyclotomicExtension {p ^ n} ℚ_[p] C := + CyclotomicField.isCyclotomicExtension (p ^ n) ℚ_[p] + let : FiniteDimensional ℚ_[p] C := + IsCyclotomicExtension.finiteDimensional {p ^ n} ℚ_[p] C + let : IsAbelianGalois ℚ_[p] C := + IsCyclotomicExtension.isAbelianGalois {p ^ n} ℚ_[p] C + obtain ⟨ζ, hζ, hgen⟩ := + exists_primitiveRoot_adjoin_eq_top_cyclotomicField ℚ_[p] (p ^ n) hpnpos + have hnsub : n - 1 + 1 = n := Nat.sub_add_cancel hn + have hζ' : IsPrimitiveRoot ζ (p ^ (n - 1 + 1)) := by + simpa [hnsub] using hζ + have hnorm : localNormSubgroup ℚ_[p] C = + LocalFieldTheory.uniformizerPrincipalSubgroup ℚ_[p] + (padicPrimeUnit p) 1 n := by + simpa [C, hnsub] using + (localNormSubgroup_eq_uniformizerPrincipalSubgroup_cyclotomicPrimePower + p (k := n - 1) ζ hζ' hgen) + have hnorm_le : localNormSubgroup ℚ_[p] C ≤ localNormSubgroup ℚ_[p] L := by + rw [hnorm] + exact hprincipal + exact ⟨n, hn, ζ, hζ, hgen, + nonempty_algHom_of_normSubgroup_le ℚ_[p] L C hnorm_le⟩ + +/-- Structured form of local Kronecker--Weber. The construction uses the +cyclotomic order +`(p ^ f - 1) * p ^ n`; retaining that form makes its unramified and +`p`-primary ramified factors available to the global proof. + +Openness supplies positive `f,n` with `⟨p ^ f⟩ Uⁿ ≤ N(Lˣ)`. The unramified +cyclotomic theorem realizes `⟨p ^ f⟩ U¹` by the extension of order +`p ^ f - 1`, while the ramified cyclotomic theorem realizes `⟨p⟩ Uⁿ` by the +`p ^ n`-cyclotomic extension. Their +composite sits in the cyclotomic field of order `(p ^ f - 1) * p ^ n`, and +the norm-subgroup order reversal gives the required embedding. -/ +theorem exists_structuredLocalCyclotomicEmbedding + (p : ℕ) [Fact p.Prime] + (L : Type) [Field L] [Algebra ℚ_[p] L] + [FiniteDimensional ℚ_[p] L] [IsAbelianGalois ℚ_[p] L] : + ∃ f n : ℕ, 0 < f ∧ 1 ≤ n ∧ + ∃ ζ : CyclotomicField ((p ^ f - 1) * p ^ n) ℚ_[p], + IsPrimitiveRoot ζ ((p ^ f - 1) * p ^ n) ∧ + Algebra.adjoin ℚ_[p] ({ζ} : Set _) = ⊤ ∧ + Nonempty + (L →ₐ[ℚ_[p]] + CyclotomicField ((p ^ f - 1) * p ^ n) ℚ_[p]) := by + let : IsNonarchimedeanLocalField ℚ_[p] := + { toIsValuativeTopology := padicIsValuativeTopology p + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + obtain ⟨f, n, hf, hn, hprincipal⟩ := + exists_uniformizerPrincipalSubgroup_le_normSubgroup + ℚ_[p] L (padicPrimeUnit p) + have hpf : 1 < p ^ f := + one_lt_pow₀ (Fact.out : Nat.Prime p).one_lt hf.ne' + have huPos : 0 < p ^ f - 1 := Nat.sub_pos_of_lt hpf + have hrPos : 0 < p ^ n := pow_pos (Fact.out : Nat.Prime p).pos n + have hmPos : 0 < (p ^ f - 1) * p ^ n := mul_pos huPos hrPos + let : NeZero (p ^ f - 1) := ⟨huPos.ne'⟩ + let : NeZero (p ^ n) := ⟨hrPos.ne'⟩ + let : NeZero ((p ^ f - 1) * p ^ n) := ⟨hmPos.ne'⟩ + let U := CyclotomicField (p ^ f - 1) ℚ_[p] + let C := CyclotomicField (p ^ n) ℚ_[p] + let D := CyclotomicField ((p ^ f - 1) * p ^ n) ℚ_[p] + let : IsCyclotomicExtension {p ^ f - 1} ℚ_[p] U := + CyclotomicField.isCyclotomicExtension (p ^ f - 1) ℚ_[p] + let : IsCyclotomicExtension {p ^ n} ℚ_[p] C := + CyclotomicField.isCyclotomicExtension (p ^ n) ℚ_[p] + let : IsCyclotomicExtension {(p ^ f - 1) * p ^ n} ℚ_[p] D := + CyclotomicField.isCyclotomicExtension ((p ^ f - 1) * p ^ n) ℚ_[p] + let : FiniteDimensional ℚ_[p] U := + IsCyclotomicExtension.finiteDimensional {p ^ f - 1} ℚ_[p] U + let : FiniteDimensional ℚ_[p] C := + IsCyclotomicExtension.finiteDimensional {p ^ n} ℚ_[p] C + let : FiniteDimensional ℚ_[p] D := + IsCyclotomicExtension.finiteDimensional + {(p ^ f - 1) * p ^ n} ℚ_[p] D + let : IsAbelianGalois ℚ_[p] U := + IsCyclotomicExtension.isAbelianGalois {p ^ f - 1} ℚ_[p] U + let : IsAbelianGalois ℚ_[p] C := + IsCyclotomicExtension.isAbelianGalois {p ^ n} ℚ_[p] C + let : IsAbelianGalois ℚ_[p] D := + IsCyclotomicExtension.isAbelianGalois + {(p ^ f - 1) * p ^ n} ℚ_[p] D + obtain ⟨ζU, hζU, hgenU⟩ := + exists_primitiveRoot_adjoin_eq_top_cyclotomicField + ℚ_[p] (p ^ f - 1) huPos + obtain ⟨ζC, hζC, hgenC⟩ := + exists_primitiveRoot_adjoin_eq_top_cyclotomicField + ℚ_[p] (p ^ n) hrPos + obtain ⟨ζD, hζD, hgenD⟩ := + exists_primitiveRoot_adjoin_eq_top_cyclotomicField + ℚ_[p] ((p ^ f - 1) * p ^ n) hmPos + have hnormU : localNormSubgroup ℚ_[p] U = + unramifiedNormSubgroup ℚ_[p] f := + normSubgroup_eq_unramifiedNormSubgroup_padic_prime_pow_sub_one + p f hf U hζU hgenU + have hnsub : n - 1 + 1 = n := Nat.sub_add_cancel hn + have hζC' : IsPrimitiveRoot ζC (p ^ (n - 1 + 1)) := by + simpa [hnsub] using hζC + have hnormC : localNormSubgroup ℚ_[p] C = + LocalFieldTheory.uniformizerPrincipalSubgroup ℚ_[p] + (padicPrimeUnit p) 1 n := by + simpa [C, hnsub] using + (localNormSubgroup_eq_uniformizerPrincipalSubgroup_cyclotomicPrimePower + p (k := n - 1) ζC hζC' hgenC) + obtain ⟨iU⟩ := nonempty_algHom_cyclotomicField_of_dvd + ℚ_[p] (p ^ f - 1) ((p ^ f - 1) * p ^ n) + huPos hmPos (dvd_mul_right _ _) + obtain ⟨iC⟩ := nonempty_algHom_cyclotomicField_of_dvd + ℚ_[p] (p ^ n) ((p ^ f - 1) * p ^ n) + hrPos hmPos (dvd_mul_left _ _) + have hnormD_U : localNormSubgroup ℚ_[p] D ≤ localNormSubgroup ℚ_[p] U := + LocalFieldTheory.normSubgroup_le_of_algHom ℚ_[p] U D iU + have hnormD_C : localNormSubgroup ℚ_[p] D ≤ localNormSubgroup ℚ_[p] C := + LocalFieldTheory.normSubgroup_le_of_algHom ℚ_[p] C D iC + have hnormD_inf : localNormSubgroup ℚ_[p] D ≤ + unramifiedNormSubgroup ℚ_[p] f ⊓ + LocalFieldTheory.uniformizerPrincipalSubgroup ℚ_[p] + (padicPrimeUnit p) 1 n := by + rw [← hnormU, ← hnormC] + exact le_inf hnormD_U hnormD_C + have hnormD_L : localNormSubgroup ℚ_[p] D ≤ localNormSubgroup ℚ_[p] L := + (hnormD_inf.trans + (unramifiedNormSubgroup_inf_padicPrincipalSubgroup_le p f n)).trans + hprincipal + exact ⟨f, n, hf, hn, ζD, hζD, hgenD, + nonempty_algHom_of_normSubgroup_le ℚ_[p] L D hnormD_L⟩ + +/-- Local Kronecker--Weber: every finite abelian +extension of `ℚ_p` embeds in a cyclotomic extension. -/ +theorem exists_localCyclotomicEmbedding + (p : ℕ) [Fact p.Prime] + (L : Type) [Field L] [Algebra ℚ_[p] L] + [FiniteDimensional ℚ_[p] L] [IsAbelianGalois ℚ_[p] L] : + ∃ m : ℕ, 0 < m ∧ + ∃ ζ : CyclotomicField m ℚ_[p], + IsPrimitiveRoot ζ m ∧ + Algebra.adjoin ℚ_[p] ({ζ} : Set _) = ⊤ ∧ + Nonempty (L →ₐ[ℚ_[p]] CyclotomicField m ℚ_[p]) := by + obtain ⟨f, n, hf, _hn, ζ, hζ, hgen, hi⟩ := + exists_structuredLocalCyclotomicEmbedding p L + have hpf : 1 < p ^ f := + one_lt_pow₀ (Fact.out : Nat.Prime p).one_lt hf.ne' + have huPos : 0 < p ^ f - 1 := Nat.sub_pos_of_lt hpf + have hpPowPos : 0 < p ^ n := pow_pos (Fact.out : Nat.Prime p).pos n + exact ⟨(p ^ f - 1) * p ^ n, mul_pos huPos hpPowPos, + ζ, hζ, hgen, hi⟩ + +end KroneckerWeber + +end + +noncomputable +section + +namespace KroneckerWeber + +open AlgebraicNumberTheory.Valuations +open HilbertRamification + +variable (p : ℕ) [Fact p.Prime] +variable (L : Type) [Field L] [Algebra ℚ L] + [FiniteDimensional ℚ L] [IsAbelianGalois ℚ L] + +/-- The type of actual embeddings of the localization at `w` +into the `m`-th cyclotomic extension of `ℚ_p`. Naming this type exposes an +embedding as a genuine theorem input while keeping all transported algebra +instances internal. -/ +noncomputable def globalPadicLocalizationCyclotomicAlgHom + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) L) + (m : ℕ) : Type := by + let vK := Rat.AbsoluteValue.padic p + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := ℚ) w.1 + letI : SMul ℚ w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + letI hE : Field E := inferInstance + letI hBaseE : Algebra vK.Completion E := inferInstance + let e := padicAbsoluteValueCompletionRingEquiv p + letI : Algebra ℚ_[p] E := + @transportedAlgebraAlongRingEquiv vK.Completion ℚ_[p] E _ _ + (@CommRing.toCommSemiring E hE.toCommRing) hBaseE e + exact E →ₐ[ℚ_[p]] CyclotomicField m ℚ_[p] + +/-- Structured version of the local cyclotomic-embedding assertion. It +retains the prime-to-`p` unramified order `p ^ f - 1` and the ramified order +`p ^ n` from the local cyclotomic construction. -/ +noncomputable def globalPadicLocalizationStructuredCyclotomicEmbeddingProperty + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) L) : Prop := by + let vK := Rat.AbsoluteValue.padic p + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := ℚ) w.1 + letI : SMul ℚ w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + letI hE : Field E := inferInstance + letI hBaseE : Algebra vK.Completion E := inferInstance + let e := padicAbsoluteValueCompletionRingEquiv p + letI hQpE : Algebra ℚ_[p] E := + @transportedAlgebraAlongRingEquiv vK.Completion ℚ_[p] E _ _ + (@CommRing.toCommSemiring E hE.toCommRing) hBaseE e + exact ∃ f n : ℕ, 0 < f ∧ 1 ≤ n ∧ + Nonempty + (E →ₐ[ℚ_[p]] + CyclotomicField ((p ^ f - 1) * p ^ n) ℚ_[p]) + +/-- The local completion of a finite abelian extension of `ℚ`, transported +to the concrete base `ℚ_[p]`, embeds in a cyclotomic extension. + +This is the local cyclotomic input to the global construction. It +does not yet assert that the local embeddings for the finitely many ramified +primes glue into one global cyclotomic field. -/ +theorem globalPadicLocalization_structuredCyclotomicEmbedding + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) L) : + globalPadicLocalizationStructuredCyclotomicEmbeddingProperty p L w := by + let vK := Rat.AbsoluteValue.padic p + let hK := AbsoluteValue.extensionCompletionAlgebra (K := ℚ) w.1 + let : SMul ℚ w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + let hE : Field E := inferInstance + let hBaseE : Algebra vK.Completion E := inferInstance + let e := padicAbsoluteValueCompletionRingEquiv p + let hQpE : Algebra ℚ_[p] E := + @transportedAlgebraAlongRingEquiv vK.Completion ℚ_[p] E _ _ + (@CommRing.toCommSemiring E hE.toCommRing) hBaseE e + change ∃ f n : ℕ, 0 < f ∧ 1 ≤ n ∧ + Nonempty + (E →ₐ[ℚ_[p]] + CyclotomicField ((p ^ f - 1) * p ^ n) ℚ_[p]) + let : Module.Finite vK.Completion E := + globalPadicLocalizationModuleFinite p L w + let : IsAbelianGalois vK.Completion E := + globalPadicLocalization_isAbelianGalois p L w + let : Algebra ℚ_[p] vK.Completion := e.symm.toRingHom.toAlgebra + let : IsScalarTower ℚ_[p] vK.Completion E := + IsScalarTower.of_algebraMap_eq' (by + ext x + exact transportedAlgebraAlongRingEquiv_algebraMap e x) + let : Module.Finite ℚ_[p] vK.Completion := + FiniteDimensional.of_surjective + (Algebra.linearMap ℚ_[p] vK.Completion) e.symm.surjective + let : Module.Finite ℚ_[p] E := + Module.Finite.trans vK.Completion E + let : IsGalois ℚ_[p] E := by + apply IsGalois.of_equiv_equiv + (F := vK.Completion) (E := E) (M := ℚ_[p]) (N := E) + (f := e) (g := RingEquiv.refl E) + apply RingHom.ext + intro x + simp only [RingHom.comp_apply] + change + (@algebraMap ℚ_[p] E _ hE.toSemiring + hQpE) (e x) = + (@algebraMap vK.Completion E _ + hE.toSemiring hBaseE) x + change + (@algebraMap vK.Completion E _ + hE.toSemiring hBaseE) (e.symm (e x)) = + (@algebraMap vK.Completion E _ + hE.toSemiring hBaseE) x + rw [e.symm_apply_apply] + let liftToCompletedBase : + (E ≃ₐ[ℚ_[p]] E) → (E ≃ₐ[vK.Completion] E) := fun σ ↦ + { __ := σ.toRingEquiv + commutes' := fun x ↦ by + obtain ⟨q, rfl⟩ := e.symm.surjective x + change + σ (@algebraMap ℚ_[p] E _ hE.toSemiring hQpE q) = + @algebraMap ℚ_[p] E _ hE.toSemiring hQpE q + exact σ.commutes q } + let : IsAbelianGalois ℚ_[p] E := + { is_comm.comm := fun σ τ ↦ + AlgEquiv.ext fun x ↦ by + have h := DFunLike.congr_fun + ((inferInstance : + IsMulCommutative + (E ≃ₐ[vK.Completion] E)).is_comm.comm + (liftToCompletedBase σ) (liftToCompletedBase τ)) x + simpa [liftToCompletedBase] using h } + obtain ⟨f, n, hf, hn, _ζ, _hζ, _hadjoin, hEmbedding⟩ := + exists_structuredLocalCyclotomicEmbedding p E + exact ⟨f, n, hf, hn, hEmbedding⟩ + +end KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean new file mode 100644 index 0000000000..f4afb2bf3e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean @@ -0,0 +1,280 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalRayClassFieldCyclotomic +/-! +# Arithmetic reciprocity for rational cyclotomic ray class fields + +This module uses an ordinary rational uniformizer, not its inverse, and +the arithmetic global norm-residue map. Consequently an unramified +prime `q` acts on roots of unity by the direct power `q`. The finite +Galois/ray-class comparison is retained as a `ContinuousMulEquiv` with +the native quotient and finite Krull topologies. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField Cyclotomic + +noncomputable +section + +namespace KroneckerWeber + +open GlobalClassFieldTheory +open GlobalClassFieldTheory.GlobalClassFields +open GlobalClassFieldTheory.Reciprocity + +open scoped Classical in +/-- The ordinary rational uniformizer at `q`, transported to the +adic-completion model used by idèles. -/ +noncomputable def rationalPrimeUniformizerLocalInput + (q : Nat.Primes) : + ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ := + finitePlaceCompletionUnitsContinuousMulEquiv + (RayClass.rationalPrime q) + (rationalPrimeFinitePlaceFieldUnit q) + +open scoped Classical in +/-- In the absolute-value logarithmic coordinate, an ordinary +uniformizer has value `-1`. -/ +theorem rationalPrimeUniformizerLocalInput_valuationMap + (q : Nat.Primes) : + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap + (NumberField.HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + (Additive.ofMul + ((finitePlaceCompletionUnitsContinuousMulEquiv + (RayClass.rationalPrime q)).symm + (rationalPrimeUniformizerLocalInput q))) = + -1 := by + rw [rationalPrimeUniformizerLocalInput, + (finitePlaceCompletionUnitsContinuousMulEquiv + (RayClass.rationalPrime q)).symm_apply_apply, + rationalPrimeFinitePlaceFieldUnit_valuationMap] + +open scoped Classical in +/-- The previously used value-one absolute-logarithmic input is the +inverse of the ordinary uniformizer. -/ +theorem rationalPrimeArithmeticFrobeniusLocalInput_eq_inv_uniformizer + (q : Nat.Primes) : + rationalPrimeArithmeticFrobeniusLocalInput q = + (rationalPrimeUniformizerLocalInput q)⁻¹ := by + rw [rationalPrimeArithmeticFrobeniusLocalInput, + rationalPrimeUniformizerLocalInput, map_inv] + +section NonzeroOrder + +variable (m : ℕ) [NeZero m] + +open scoped Classical in +/-- A nonzero cyclotomic level remains nonzero after casting to the rational field. -/ +local instance rationalCyclotomicArithmeticReciprocityRationalLevelNeZero : NeZero (m : ℚ) := + ⟨by exact_mod_cast (NeZero.ne m)⟩ + +attribute [local instance] rationalCyclotomicArithmeticReciprocityRationalLevelNeZero + +open scoped Classical in +noncomputable /-- The rational cyclotomic level is a number field. -/ +local instance rationalCyclotomicArithmeticReciprocityLevelNumberField : + NumberField + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) := + KummerTheory.rationalCyclotomicLevel_numberField + ⟨m, NeZero.pos m⟩ + +attribute [local instance] rationalCyclotomicArithmeticReciprocityLevelNumberField + +open scoped Classical in +noncomputable local instance + rationalCyclotomicArithmeticLevelIsCyclotomicExtension : + IsCyclotomicExtension {m} ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) := by + change + IsCyclotomicExtension + {((⟨m, NeZero.pos m⟩ : ℕ+) : ℕ)} ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) + exact + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension _ + +attribute [local instance] rationalCyclotomicArithmeticLevelIsCyclotomicExtension + +open scoped Classical in +noncomputable local instance + rationalCyclotomicArithmeticLevelIsAbelianGalois : + IsAbelianGalois ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) := + IsCyclotomicExtension.isAbelianGalois {m} ℚ _ + +attribute [local instance] rationalCyclotomicArithmeticLevelIsAbelianGalois + +open scoped Classical in +/-- Arithmetic reciprocity on the ordinary uniformizer agrees +literally with geometric reciprocity on its inverse. This equality +fixes the normalization independently of the cyclotomic character. -/ +theorem + arithmeticGlobalNormResidue_uniformizer_eq_globalNormResidue_inverseUniformizer + (q : Nat.Primes) : + arithmeticGlobalNormResidueMonoidHom + ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) + (IdeleGroup.finitePlaceIdeleClass + (RayClass.rationalPrime q) + (rationalPrimeUniformizerLocalInput q)) = + globalNormResidueMonoidHom + ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) + (IdeleGroup.finitePlaceIdeleClass + (RayClass.rationalPrime q) + (rationalPrimeArithmeticFrobeniusLocalInput q)) := by + let n : ℕ+ := ⟨m, NeZero.pos m⟩ + let g : IdeleClassGroup ℚ →* + Gal(KummerTheory.rationalCyclotomicLevel n/ℚ) := + globalNormResidueMonoidHom ℚ (KummerTheory.rationalCyclotomicLevel n) + let i : ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ →* + IdeleClassGroup ℚ := + IdeleGroup.finitePlaceIdeleClass (RayClass.rationalPrime q) + let u : ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ := + rationalPrimeUniformizerLocalInput q + calc + arithmeticGlobalNormResidueMonoidHom + ℚ (KummerTheory.rationalCyclotomicLevel n) (i u) = + (g (i u))⁻¹ := + arithmeticGlobalNormResidueMonoidHom_apply + ℚ (KummerTheory.rationalCyclotomicLevel n) (i u) + _ = g (i (u⁻¹)) := (map_inv (g.comp i) u).symm + _ = g (i (rationalPrimeArithmeticFrobeniusLocalInput q)) := + congrArg (g.comp i) + (rationalPrimeArithmeticFrobeniusLocalInput_eq_inv_uniformizer q).symm + +open scoped Classical in +/-- At `q ∤ m`, the arithmetic global norm-residue symbol of the +ordinary one-place uniformizer is arithmetic Frobenius `ζ ↦ ζ ^ q`. -/ +theorem + rationalCyclotomicLevel_arithmeticGlobalNormResidue_at_unramifiedPrime + (q : Nat.Primes) (hq : ¬ q.1 ∣ m) : + IsCyclotomicExtension.Rat.galEquivZMod + m + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) + (arithmeticGlobalNormResidueMonoidHom + ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) + (IdeleGroup.finitePlaceIdeleClass + (RayClass.rationalPrime q) + (rationalPrimeUniformizerLocalInput q))) = + ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr hq) := by + rw [ + arithmeticGlobalNormResidue_uniformizer_eq_globalNormResidue_inverseUniformizer + m, + rationalCyclotomicLevel_globalNormResidue_at_unramifiedPrime + m q hq] + +open scoped Classical in +/-- Arithmetic-Frobenius-normalized topological reciprocity for the actual finite +cyclotomic level inside the fixed rational separable closure. -/ +noncomputable def + rationalCyclotomicLevelArithmeticGaloisContinuousMulEquivRayClassGroup + : + Gal(KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩/ℚ) ≃ₜ* + RayClass.RayClassGroup (RayClass.rationalModulus m) := by + exact + (commutativeGroupInversionContinuousMulEquiv + (Gal(KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩/ℚ))).trans + (rationalCyclotomicLevelGaloisContinuousMulEquivRayClassGroup m) + +open scoped Classical in +/-- Arithmetic reciprocity sends the arithmetic norm-residue symbol +of an idèle class to its genuine rational ray class. -/ +theorem + rationalCyclotomicGaloisEquivRayClassGroup_arithmeticGlobalNormResidue + (c : IdeleClassGroup ℚ) : + rationalCyclotomicLevelArithmeticGaloisContinuousMulEquivRayClassGroup + m + (arithmeticGlobalNormResidueMonoidHom + ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) c) = + QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.rationalModulus m)) c := by + change + rationalCyclotomicLevelGaloisContinuousMulEquivRayClassGroup m + ((arithmeticGlobalNormResidueMonoidHom + ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) c)⁻¹) = + QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.rationalModulus m)) c + rw [ + arithmeticGlobalNormResidueMonoidHom_apply, + inv_inv, + rationalCyclotomicLevelGaloisContinuousMulEquivRayClassGroup_globalNormResidue] + +open scoped Classical in +/-- Inverse arithmetic ray reciprocity sends the ray class of an +idèle class back to its arithmetic global norm-residue symbol. -/ +theorem + rationalCyclotomicLevelArithmeticGaloisContinuousMulEquivRayClassGroup_symm_mk + (c : IdeleClassGroup ℚ) : + (rationalCyclotomicLevelArithmeticGaloisContinuousMulEquivRayClassGroup + m).symm + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.rationalModulus m)) c) = + arithmeticGlobalNormResidueMonoidHom + ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) c := by + apply + (rationalCyclotomicLevelArithmeticGaloisContinuousMulEquivRayClassGroup + m).injective + rw [ + (rationalCyclotomicLevelArithmeticGaloisContinuousMulEquivRayClassGroup + m).apply_symm_apply, + rationalCyclotomicGaloisEquivRayClassGroup_arithmeticGlobalNormResidue] + +open scoped Classical in +/-- The inverse arithmetic ray reciprocity image of the ordinary +uniformizer class at `q ∤ m` has direct cyclotomic exponent `q`. -/ +theorem + rationalCyclotomicLevel_arithmeticRayReciprocity_at_unramifiedPrime + (q : Nat.Primes) (hq : ¬ q.1 ∣ m) : + IsCyclotomicExtension.Rat.galEquivZMod + m + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) + ((rationalCyclotomicLevelArithmeticGaloisContinuousMulEquivRayClassGroup + m).symm + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.rationalModulus m)) + (IdeleGroup.finitePlaceIdeleClass + (RayClass.rationalPrime q) + (rationalPrimeUniformizerLocalInput q)))) = + ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr hq) := by + rw [ + rationalCyclotomicLevelArithmeticGaloisContinuousMulEquivRayClassGroup_symm_mk, + rationalCyclotomicLevel_arithmeticGlobalNormResidue_at_unramifiedPrime + m q hq] + +end NonzeroOrder + +end KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean new file mode 100644 index 0000000000..ca5a57d17d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean @@ -0,0 +1,800 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicRayNorm +/-! +# The rational ray class field as an actual cyclotomic field + +For a nonzero natural number `m`, the selected ray class field for the +rational modulus `(m)` is isomorphic over `ℚ` to the actual cyclotomic +field `CyclotomicField m ℚ`. + +The field comparison is obtained from the exact idèle-class norm-range +equality. We also retain the topological content of global reciprocity: + +`Gal(ℚ(μ_m) / ℚ) ≃ₜ* C_ℚ / C_ℚ^m`. + +Thus the result is an equality of actual class fields and not merely an +equality of degrees or an abstract comparison of finite groups. +-/ + +@[expose] public section + +open scoped IsMulCommutative NumberField Cyclotomic + +noncomputable +section + +namespace KroneckerWeber + +open GlobalClassFieldTheory +open GlobalClassFieldTheory.GlobalClassFields +open GlobalClassFieldTheory.Reciprocity +open NumberField IsDedekindDomain + +open scoped Classical in +noncomputable local instance rationalCyclotomicLevelIsAbelianGalois + (n : ℕ+) : + IsAbelianGalois ℚ (KummerTheory.rationalCyclotomicLevel n) := + IsCyclotomicExtension.isAbelianGalois {(n : ℕ)} ℚ + (KummerTheory.rationalCyclotomicLevel n) + +attribute [local instance] rationalCyclotomicLevelIsAbelianGalois + +open scoped Classical in +private noncomputable def + galoisContinuousMulEquivRayClassGroupOfNormRangeEq + (L : Type) [Field L] [NumberField L] [Algebra ℚ L] + [FiniteDimensional ℚ L] [IsAbelianGalois ℚ L] + (r : RayClass.Modulus ℚ) + (h : (_root_.ideleClassNorm ℚ L).range = + RayClass.Modulus.congruenceSubgroup r) : + Gal(L/ℚ) ≃ₜ* RayClass.RayClassGroup r := by + letI : (_root_.ideleClassNorm ℚ L).range.Normal := + h ▸ inferInstance + letI : DiscreteTopology (RayClass.RayClassGroup r) := + QuotientGroup.discreteTopology + (RayClass.isOpen_congruenceSubgroup r) + let reciprocity : + Gal(L/ℚ) ≃* + (IdeleClassGroup ℚ ⧸ + (_root_.ideleClassNorm ℚ L).range) := + AddEquiv.toMultiplicative (globalReciprocityEquiv ℚ L) + exact + { reciprocity.trans + (QuotientGroup.quotientMulEquivOfEq h) with + continuous_toFun := continuous_of_discreteTopology + continuous_invFun := continuous_of_discreteTopology } + +open scoped Classical in +private theorem quotientMulEquivOfNormRangeEq_globalNormResidue + (L : Type) [Field L] [NumberField L] [Algebra ℚ L] + [FiniteDimensional ℚ L] [IsAbelianGalois ℚ L] + (H : Subgroup (IdeleClassGroup ℚ)) + [(_root_.ideleClassNorm ℚ L).range.Normal] [H.Normal] + (h : (_root_.ideleClassNorm ℚ L).range = H) + (c : IdeleClassGroup ℚ) : + QuotientGroup.quotientMulEquivOfEq h + (Additive.toMul + ((globalNormResidueEquiv ℚ L).symm + (Additive.ofMul + (globalNormResidueMonoidHom ℚ L c)))) = + QuotientGroup.mk' H c := by + have hNormResidue : + Additive.ofMul (globalNormResidueMonoidHom ℚ L c) = + globalNormResidueEquiv ℚ L + (Additive.ofMul + (QuotientGroup.mk' + (_root_.ideleClassNorm ℚ L).range c)) := + congrArg (fun σ => Additive.ofMul σ) + (globalNormResidueMonoidHom_apply ℚ L c) + calc + _ = QuotientGroup.quotientMulEquivOfEq h + (Additive.toMul + ((globalNormResidueEquiv ℚ L).symm + (globalNormResidueEquiv ℚ L + (Additive.ofMul + (QuotientGroup.mk' + (_root_.ideleClassNorm ℚ L).range c))))) := + congrArg + (fun τ => + QuotientGroup.quotientMulEquivOfEq h + (Additive.toMul + ((globalNormResidueEquiv ℚ L).symm τ))) + hNormResidue + _ = QuotientGroup.mk' H c := by + rw [AddEquiv.symm_apply_apply] + exact QuotientGroup.quotientMulEquivOfEq_mk h c + +open scoped Classical in +private theorem + galoisContinuousMulEquivRayClassGroupOfNormRangeEq_globalNormResidue + (L : Type) [Field L] [NumberField L] [Algebra ℚ L] + [FiniteDimensional ℚ L] [IsAbelianGalois ℚ L] + (r : RayClass.Modulus ℚ) + (h : (_root_.ideleClassNorm ℚ L).range = + RayClass.Modulus.congruenceSubgroup r) + (c : IdeleClassGroup ℚ) : + galoisContinuousMulEquivRayClassGroupOfNormRangeEq L r h + (globalNormResidueMonoidHom ℚ L c) = + QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup r) c := by + let : (_root_.ideleClassNorm ℚ L).range.Normal := + h ▸ inferInstance + change + QuotientGroup.quotientMulEquivOfEq h + (Additive.toMul + ((globalNormResidueEquiv ℚ L).symm + (Additive.ofMul + (globalNormResidueMonoidHom ℚ L c)))) = + QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup r) c + exact + quotientMulEquivOfNormRangeEq_globalNormResidue + L (RayClass.Modulus.congruenceSubgroup r) h c + +open scoped Classical in +/-- Conjugating an automorphism between two actual singleton +cyclotomic extensions preserves its exponent on primitive roots. -/ +theorem galEquivZMod_autCongr + (m : ℕ) [NeZero m] + (A B : Type*) [Field A] [NumberField A] + [Field B] [NumberField B] + [IsCyclotomicExtension {m} ℚ A] + [IsCyclotomicExtension {m} ℚ B] + (e : A ≃ₐ[ℚ] B) + (σ : Gal(A/ℚ)) : + IsCyclotomicExtension.Rat.galEquivZMod + m B (AlgEquiv.autCongr e σ) = + IsCyclotomicExtension.Rat.galEquivZMod + m A σ := by + let ζ : A := + IsCyclotomicExtension.zeta m ℚ A + have hζ : IsPrimitiveRoot ζ m := + IsCyclotomicExtension.zeta_spec m ℚ A + have hζB : IsPrimitiveRoot (e ζ) m := + hζ.map_of_injective e.injective + suffices + (e ζ) ^ + (IsCyclotomicExtension.Rat.galEquivZMod + m B (AlgEquiv.autCongr e σ)).val.val = + (e ζ) ^ + (IsCyclotomicExtension.Rat.galEquivZMod + m A σ).val.val by + rw [ + (hζB.isOfFinOrder (NeZero.ne m)).pow_inj_mod, + ← hζB.eq_orderOf, + ← ZMod.natCast_eq_natCast_iff', + ZMod.natCast_val, + ZMod.natCast_val, + ZMod.cast_id'] at this + rwa [Units.ext_iff] + calc + (e ζ) ^ + (IsCyclotomicExtension.Rat.galEquivZMod + m B (AlgEquiv.autCongr e σ)).val.val = + (AlgEquiv.autCongr e σ) (e ζ) := by + symm + exact + IsCyclotomicExtension.Rat.galEquivZMod_apply_of_pow_eq + m B (AlgEquiv.autCongr e σ) hζB.pow_eq_one + _ = e (σ ζ) := by + simp only [AlgEquiv.autCongr_apply, AlgEquiv.trans_apply, + e.symm_apply_apply] + _ = + e + (ζ ^ + (IsCyclotomicExtension.Rat.galEquivZMod + m A σ).val.val) := by + rw [ + IsCyclotomicExtension.Rat.galEquivZMod_apply_of_pow_eq + m A σ hζ.pow_eq_one] + _ = + (e ζ) ^ + (IsCyclotomicExtension.Rat.galEquivZMod + m A σ).val.val := by + rw [map_pow] + +section NonzeroOrder + +variable (m : ℕ) [NeZero m] + +open scoped Classical in +/-- A nonzero cyclotomic level remains nonzero after casting to the rational field. -/ +local instance rationalRayClassFieldCyclotomicRationalLevelNeZero : NeZero (m : ℚ) := + ⟨by exact_mod_cast (NeZero.ne m)⟩ + +attribute [local instance] rationalRayClassFieldCyclotomicRationalLevelNeZero + +open scoped Classical in +/-- The rational cyclotomic level is a number field. -/ +noncomputable local instance rationalRayClassFieldCyclotomicLevelNumberField : + NumberField + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) := + KummerTheory.rationalCyclotomicLevel_numberField + ⟨m, NeZero.pos m⟩ + +attribute [local instance] rationalRayClassFieldCyclotomicLevelNumberField + +open scoped Classical in +/-- The rational cyclotomic level is an abelian Galois extension of the rationals. -/ +noncomputable local instance rationalRayClassFieldCyclotomicLevelAbelianGalois : + IsAbelianGalois ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) := + rationalCyclotomicLevelIsAbelianGalois + ⟨m, NeZero.pos m⟩ + +attribute [local instance] rationalRayClassFieldCyclotomicLevelAbelianGalois + +open scoped Classical in +noncomputable local instance rationalCyclotomicLevelIsCyclotomicExtensionAtOrder : + IsCyclotomicExtension {m} ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) := by + change + IsCyclotomicExtension + {((⟨m, NeZero.pos m⟩ : ℕ+) : ℕ)} ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) + exact + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + ⟨m, NeZero.pos m⟩ + +attribute [local instance] rationalCyclotomicLevelIsCyclotomicExtensionAtOrder + +open scoped Classical in +noncomputable local instance rationalCyclotomicFieldIsCyclotomicExtension : + IsCyclotomicExtension {m} ℚ (CyclotomicField m ℚ) := + CyclotomicField.isCyclotomicExtension m ℚ + +attribute [local instance] rationalCyclotomicFieldIsCyclotomicExtension + +open scoped Classical in +noncomputable local instance rationalCyclotomicFieldIsAbelianGalois : + IsAbelianGalois ℚ (CyclotomicField m ℚ) := + IsCyclotomicExtension.isAbelianGalois {m} ℚ + (CyclotomicField m ℚ) + +attribute [local instance] rationalCyclotomicFieldIsAbelianGalois + +open scoped Classical in +noncomputable local instance rationalCyclotomicLevelIdeleClassNormRangeNormal : + (_root_.ideleClassNorm ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩)).range.Normal := by + rw [ + rationalCyclotomicLevel_ideleClassNorm_range_eq_rationalCongruenceSubgroup + m (NeZero.ne m)] + infer_instance + +attribute [local instance] rationalCyclotomicLevelIdeleClassNormRangeNormal + +open scoped Classical in +noncomputable local instance rationalCyclotomicFieldIdeleClassNormRangeNormal : + (_root_.ideleClassNorm ℚ (CyclotomicField m ℚ)).range.Normal := by + rw [ + rationalCyclotomicField_ideleClassNorm_range_eq_rationalCongruenceSubgroup + m (NeZero.ne m)] + infer_instance + +attribute [local instance] rationalCyclotomicFieldIdeleClassNormRangeNormal + +open scoped Classical in +/-- The internal finite level of the rational cyclotomic closure is +isomorphic over `ℚ` to mathlib's concrete cyclotomic field of the same +order. -/ +noncomputable def rationalCyclotomicLevelAlgEquivCyclotomicField + : + KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩ ≃ₐ[ℚ] + CyclotomicField m ℚ := by + exact + IsCyclotomicExtension.algEquiv {m} ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) + (CyclotomicField m ℚ) + +open scoped Classical in +/-- A normalized local element of order one at the rational prime `q`. +It is the inverse of the rational uniformizer in the absolute-value +completion, transported to the adic-completion model used by idèles. -/ +noncomputable def rationalPrimeArithmeticFrobeniusLocalInput + (q : Nat.Primes) : + ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ := + finitePlaceCompletionUnitsContinuousMulEquiv + (RayClass.rationalPrime q) + ((rationalPrimeFinitePlaceFieldUnit q)⁻¹) + +open scoped Classical in +/-- The normalized local input for prime-ideal Artin reciprocity has +inverse-standard valuation exponent one. -/ +theorem rationalPrimeArithmeticFrobeniusLocalInput_valuationMap + (q : Nat.Primes) : + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + (Additive.ofMul + ((finitePlaceCompletionUnitsContinuousMulEquiv + (RayClass.rationalPrime q)).symm + (rationalPrimeArithmeticFrobeniusLocalInput q))) = + 1 := by + rw [ + rationalPrimeArithmeticFrobeniusLocalInput, + (finitePlaceCompletionUnitsContinuousMulEquiv + (RayClass.rationalPrime q)).symm_apply_apply, + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_ofMul_inv, + rationalPrimeFinitePlaceFieldUnit_valuationMap] + norm_num + +open scoped Classical in +private theorem + rationalCyclotomicLevel_chosenFinitePlaceArtin_at_unramifiedPrime + (m : ℕ) [NeZero m] + (q : Nat.Primes) (hq : ¬ q.1 ∣ m) : + IsCyclotomicExtension.Rat.galEquivZMod + m + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) + (chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) + (RayClass.rationalPrime q) + (rationalPrimeArithmeticFrobeniusLocalInput q)) = + ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr hq) := by + calc + IsCyclotomicExtension.Rat.galEquivZMod + m + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) + (chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) + (RayClass.rationalPrime q) + (rationalPrimeArithmeticFrobeniusLocalInput q)) = + (ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr hq)) ^ + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + (Additive.ofMul + ((finitePlaceCompletionUnitsContinuousMulEquiv + (RayClass.rationalPrime q)).symm + (rationalPrimeArithmeticFrobeniusLocalInput q))) := by + apply + galEquivZMod_chosenFinitePlaceArtinMonoidHom_of_not_dvd + change ¬ q.1 ∣ m + exact hq + _ = ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr hq) := by + rw [ + rationalPrimeArithmeticFrobeniusLocalInput_valuationMap, + zpow_one] + +open scoped Classical in +/-- At an unramified rational prime `q ∤ m`, the actual global +norm-residue symbol on the normalized one-place prime idèle acts on the +internal `m`-th cyclotomic level by the direct exponent `q`. -/ +theorem + rationalCyclotomicLevel_globalNormResidue_at_unramifiedPrime + (q : Nat.Primes) (hq : ¬ q.1 ∣ m) : + IsCyclotomicExtension.Rat.galEquivZMod + m + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) + (globalNormResidueMonoidHom + ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) + (IdeleGroup.finitePlaceIdeleClass + (RayClass.rationalPrime q) + (rationalPrimeArithmeticFrobeniusLocalInput q))) = + ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr hq) := by + have hglobal : + globalNormResidueMonoidHom ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) + (IdeleGroup.finitePlaceIdeleClass + (RayClass.rationalPrime q) + (rationalPrimeArithmeticFrobeniusLocalInput q)) = + chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) + (RayClass.rationalPrime q) + (rationalPrimeArithmeticFrobeniusLocalInput q) := + DFunLike.congr_fun + (globalNormResidueMonoidHom_comp_finitePlaceIdeleClass + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) + (RayClass.rationalPrime q)) + (rationalPrimeArithmeticFrobeniusLocalInput q) + calc + _ = IsCyclotomicExtension.Rat.galEquivZMod + m + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) + (chosenFinitePlaceArtinMonoidHom + (K := ℚ) + (L := KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) + (RayClass.rationalPrime q) + (rationalPrimeArithmeticFrobeniusLocalInput q)) := + congrArg + (IsCyclotomicExtension.Rat.galEquivZMod + m + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩)) + hglobal + _ = ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr hq) := + rationalCyclotomicLevel_chosenFinitePlaceArtin_at_unramifiedPrime + m q hq + +open scoped Classical in +/-- Topological global reciprocity for the actual finite level inside the +rational cyclotomic closure. The target is the idelic rational ray class +group modulo `(m)`, transported along the exact norm-range equality. -/ +noncomputable def + rationalCyclotomicLevelGaloisContinuousMulEquivRayClassGroup + : + Gal(KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩/ℚ) ≃ₜ* + RayClass.RayClassGroup (RayClass.rationalModulus m) := + galoisContinuousMulEquivRayClassGroupOfNormRangeEq + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) + (RayClass.rationalModulus m) + (rationalCyclotomicLevel_ideleClassNorm_range_eq_rationalCongruenceSubgroup + m (NeZero.ne m)) + +open scoped Classical in +/-- Evaluation of finite-level rational cyclotomic reciprocity is inverse +global norm-residue reciprocity followed by the exact ray norm-range +transport. -/ +@[simp] +theorem + rationalCyclotomicLevelGaloisContinuousMulEquivRayClassGroup_apply + (σ : + Gal(KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩/ℚ)) : + rationalCyclotomicLevelGaloisContinuousMulEquivRayClassGroup + m σ = + QuotientGroup.quotientMulEquivOfEq + (rationalCyclotomicLevel_ideleClassNorm_range_eq_rationalCongruenceSubgroup + m (NeZero.ne m)) + (Additive.toMul + ((globalNormResidueEquiv + ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩)).symm + (Additive.ofMul σ))) := by + rfl + +open scoped Classical in +/-- On an idèle-class representative, finite-level cyclotomic reciprocity +is the actual global norm-residue symbol followed by its rational ray +class modulo `(m)`. -/ +theorem + rationalCyclotomicLevelGaloisContinuousMulEquivRayClassGroup_globalNormResidue + (c : IdeleClassGroup ℚ) : + rationalCyclotomicLevelGaloisContinuousMulEquivRayClassGroup + m + (globalNormResidueMonoidHom + ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) c) = + QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.rationalModulus m)) c := by + rw [ + rationalCyclotomicLevelGaloisContinuousMulEquivRayClassGroup_apply] + apply + quotientMulEquivOfNormRangeEq_globalNormResidue + +open scoped Classical in +/-- Inverse finite-level cyclotomic reciprocity sends the ray class of an +idèle class back to its genuine global norm-residue symbol. -/ +theorem + rationalCyclotomicLevelGaloisContinuousMulEquivRayClassGroup_symm_mk + (c : IdeleClassGroup ℚ) : + (rationalCyclotomicLevelGaloisContinuousMulEquivRayClassGroup + m).symm + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.rationalModulus m)) c) = + globalNormResidueMonoidHom + ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) c := by + apply + (rationalCyclotomicLevelGaloisContinuousMulEquivRayClassGroup + m).injective + rw [ + (rationalCyclotomicLevelGaloisContinuousMulEquivRayClassGroup + m).apply_symm_apply, + rationalCyclotomicLevelGaloisContinuousMulEquivRayClassGroup_globalNormResidue] + +open scoped Classical in +/-- The inverse ray reciprocity image of the normalized one-place class at +an unramified rational prime has direct cyclotomic exponent `q`. This +places the actual global map, its ray quotient, and the Frobenius +normalization on one literal finite cyclotomic field. -/ +theorem + rationalCyclotomicLevel_rayReciprocity_at_unramifiedPrime + (q : Nat.Primes) (hq : ¬ q.1 ∣ m) : + IsCyclotomicExtension.Rat.galEquivZMod + m + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) + ((rationalCyclotomicLevelGaloisContinuousMulEquivRayClassGroup + m).symm + (QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.rationalModulus m)) + (IdeleGroup.finitePlaceIdeleClass + (RayClass.rationalPrime q) + (rationalPrimeArithmeticFrobeniusLocalInput q)))) = + ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr hq) := by + rw [ + rationalCyclotomicLevelGaloisContinuousMulEquivRayClassGroup_symm_mk, + rationalCyclotomicLevel_globalNormResidue_at_unramifiedPrime + m q hq] + +open scoped Classical in +/-- The actual arithmetic Frobenius at `q` on the concrete cyclotomic +field, obtained by transporting the genuine global one-place Artin +symbol from the internal cyclotomic level. -/ +noncomputable def rationalCyclotomicPrimeArithmeticFrobenius + (q : Nat.Primes) : + Gal(CyclotomicField m ℚ/ℚ) := by + let mp : ℕ+ := ⟨m, NeZero.pos m⟩ + let L : Type := KummerTheory.rationalCyclotomicLevel mp + let : NumberField L := + KummerTheory.rationalCyclotomicLevel_numberField mp + let : FiniteDimensional ℚ L := + rationalCyclotomicPrincipalPrimeLevelFiniteDimensional mp + let : IsAbelianGalois ℚ L := + rationalCyclotomicLevelIsAbelianGalois mp + exact + AlgEquiv.autCongr + (rationalCyclotomicLevelAlgEquivCyclotomicField m) + (globalNormResidueMonoidHom + ℚ L + (IdeleGroup.finitePlaceIdeleClass + (RayClass.rationalPrime q) + (rationalPrimeArithmeticFrobeniusLocalInput q))) + +open scoped Classical in +/-- For `q ∤ m`, the actual arithmetic Frobenius on +`CyclotomicField m ℚ` is the direct-`q` automorphism +`ζ ↦ ζ ^ q`; no inverse appears. -/ +theorem rationalCyclotomicPrimeArithmeticFrobenius_galEquivZMod + (q : Nat.Primes) (hq : ¬ q.1 ∣ m) : + IsCyclotomicExtension.Rat.galEquivZMod + m (CyclotomicField m ℚ) + (rationalCyclotomicPrimeArithmeticFrobenius m q) = + ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr hq) := by + let mp : ℕ+ := ⟨m, NeZero.pos m⟩ + let L : Type := KummerTheory.rationalCyclotomicLevel mp + let : NumberField L := + KummerTheory.rationalCyclotomicLevel_numberField mp + let : IsCyclotomicExtension {m} ℚ L := by + change + IsCyclotomicExtension {m} ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) + exact rationalCyclotomicLevelIsCyclotomicExtensionAtOrder m + let : FiniteDimensional ℚ L := + rationalCyclotomicPrincipalPrimeLevelFiniteDimensional mp + let : IsAbelianGalois ℚ L := + rationalCyclotomicLevelIsAbelianGalois mp + change + IsCyclotomicExtension.Rat.galEquivZMod + m (CyclotomicField m ℚ) + (AlgEquiv.autCongr + (rationalCyclotomicLevelAlgEquivCyclotomicField m) + (globalNormResidueMonoidHom + ℚ L + (IdeleGroup.finitePlaceIdeleClass + (RayClass.rationalPrime q) + (rationalPrimeArithmeticFrobeniusLocalInput q)))) = + ZMod.unitOfCoprime q.1 + (q.2.coprime_iff_not_dvd.mpr hq) + rw [ + galEquivZMod_autCongr, + rationalCyclotomicLevel_globalNormResidue_at_unramifiedPrime + m q hq] + +open scoped Classical in +/-- The selected rational ray class field is the actual cyclotomic field +of the same modulus, as an equivalence of fields over `ℚ`. -/ +noncomputable def rationalRayClassFieldCyclotomicRingEquiv + : + rayClassField ℚ (RayClass.rationalModulus m) ≃+* + CyclotomicField m ℚ := by + letI : Algebra ℚ + (rayClassField ℚ (RayClass.rationalModulus m)) := + rayClassFieldAlgebraOverOriginal (RayClass.rationalModulus m) + exact + (Classical.choice + ((nonempty_algEquiv_rayClassField_iff_ideleClassNorm_range_eq + (K := ℚ) + (CyclotomicField m ℚ) + (RayClass.rationalModulus m)).2 + (rationalCyclotomicField_ideleClassNorm_range_eq_rationalCongruenceSubgroup + m (NeZero.ne m)))).symm.toRingEquiv + +open scoped Classical in +/-- A chosen `ℚ`-algebra equivalence from the selected rational ray class +field to the cyclotomic field of the same modulus. -/ +noncomputable def rationalRayClassFieldCyclotomicAlgEquiv + : + rayClassField ℚ (RayClass.rationalModulus m) ≃ₐ[ℚ] + CyclotomicField m ℚ := by + let e := rationalRayClassFieldCyclotomicRingEquiv m + refine { e with commutes' := ?_ } + intro q + exact map_ratCast e q + +open scoped Classical in +noncomputable local instance rationalRayClassFieldIsCyclotomicExtension : + IsCyclotomicExtension {m} ℚ + (rayClassField ℚ (RayClass.rationalModulus m)) := + IsCyclotomicExtension.equiv {m} ℚ (CyclotomicField m ℚ) + (rationalRayClassFieldCyclotomicAlgEquiv m).symm + +attribute [local instance] rationalRayClassFieldIsCyclotomicExtension + +open scoped Classical in +noncomputable local instance rationalRayClassFieldIsAbelianGalois : + IsAbelianGalois ℚ + (rayClassField ℚ (RayClass.rationalModulus m)) := + IsCyclotomicExtension.isAbelianGalois {m} ℚ + (rayClassField ℚ (RayClass.rationalModulus m)) + +attribute [local instance] rationalRayClassFieldIsAbelianGalois + +open scoped Classical in +/-- Transporting the actual norm-residue symbol of the selected rational +ray class field to the concrete cyclotomic realization preserves its +cyclotomic character. The left side uses the literal conjugation map on +Galois automorphisms, not an abstract identification of finite groups. -/ +theorem + rationalRayClassFieldCyclotomicAlgEquiv_autCongr_globalNormResidue_character + (c : IdeleClassGroup ℚ) : + IsCyclotomicExtension.Rat.galEquivZMod + m (CyclotomicField m ℚ) + (AlgEquiv.autCongr + (rationalRayClassFieldCyclotomicAlgEquiv m) + (globalNormResidueMonoidHom + ℚ (rayClassField ℚ (RayClass.rationalModulus m)) c)) = + IsCyclotomicExtension.Rat.galEquivZMod + m (rayClassField ℚ (RayClass.rationalModulus m)) + (globalNormResidueMonoidHom + ℚ (rayClassField ℚ (RayClass.rationalModulus m)) c) := by + let e := rationalRayClassFieldCyclotomicAlgEquiv m + exact galEquivZMod_autCongr m + (rayClassField ℚ (RayClass.rationalModulus m)) + (CyclotomicField m ℚ) e + (globalNormResidueMonoidHom + ℚ (rayClassField ℚ (RayClass.rationalModulus m)) c) + +open scoped Classical in +/-- Monoid-hom form of cyclotomic-character invariance under the selected +ray-class-field/cyclotomic-field realization. -/ +theorem + rationalRayClassFieldCyclotomicAlgEquiv_autCongr_globalNormResidue_character_hom + : + ((IsCyclotomicExtension.Rat.galEquivZMod + m (CyclotomicField m ℚ)).toMonoidHom.comp + ((AlgEquiv.autCongr + (rationalRayClassFieldCyclotomicAlgEquiv m)).toMonoidHom.comp + (globalNormResidueMonoidHom + ℚ (rayClassField ℚ (RayClass.rationalModulus m))))) = + ((IsCyclotomicExtension.Rat.galEquivZMod + m (rayClassField ℚ (RayClass.rationalModulus m))).toMonoidHom.comp + (globalNormResidueMonoidHom + ℚ (rayClassField ℚ (RayClass.rationalModulus m)))) := by + apply MonoidHom.ext + intro c + exact + rationalRayClassFieldCyclotomicAlgEquiv_autCongr_globalNormResidue_character + m c + +open scoped Classical in +/-- Topological global reciprocity for the actual rational cyclotomic +field, with target the rational ray class group modulo `(m)`. -/ +noncomputable def + rationalCyclotomicGaloisContinuousMulEquivRayClassGroup + : + Gal(CyclotomicField m ℚ/ℚ) ≃ₜ* + RayClass.RayClassGroup (RayClass.rationalModulus m) := + galoisContinuousMulEquivRayClassGroupOfNormRangeEq + (CyclotomicField m ℚ) (RayClass.rationalModulus m) + (rationalCyclotomicField_ideleClassNorm_range_eq_rationalCongruenceSubgroup + m (NeZero.ne m)) + +open scoped Classical in +/-- The ordinary cyclotomic character, retaining the finite Krull +topology on the actual Galois group and the discrete topology on +`(ℤ/mℤ)ˣ`. -/ +noncomputable def + rationalCyclotomicGaloisContinuousMulEquivZModUnits + : + Gal(CyclotomicField m ℚ/ℚ) ≃ₜ* + (ZMod m)ˣ := by + exact + { IsCyclotomicExtension.Rat.galEquivZMod + m (CyclotomicField m ℚ) with + continuous_toFun := continuous_of_discreteTopology + continuous_invFun := continuous_of_discreteTopology } + +open scoped Classical in +/-- Forgetting topology from the cyclotomic character recovers the +standard `galEquivZMod` map literally. -/ +@[simp] +theorem + rationalCyclotomicGaloisContinuousMulEquivZModUnits_apply + (σ : Gal(CyclotomicField m ℚ/ℚ)) : + rationalCyclotomicGaloisContinuousMulEquivZModUnits + m σ = + IsCyclotomicExtension.Rat.galEquivZMod + m (CyclotomicField m ℚ) σ := by + rfl + +open scoped Classical in +/-- Evaluation of rational cyclotomic reciprocity is inverse global +norm-residue reciprocity followed by transport along the exact +cyclotomic norm-range equality. -/ +@[simp] +theorem + rationalCyclotomicGaloisContinuousMulEquivRayClassGroup_apply + (σ : Gal(CyclotomicField m ℚ/ℚ)) : + rationalCyclotomicGaloisContinuousMulEquivRayClassGroup + m σ = + QuotientGroup.quotientMulEquivOfEq + (rationalCyclotomicField_ideleClassNorm_range_eq_rationalCongruenceSubgroup + m (NeZero.ne m)) + (Additive.toMul + ((globalNormResidueEquiv + ℚ (CyclotomicField m ℚ)).symm + (Additive.ofMul σ))) := by + rfl + +open scoped Classical in +/-- On an idèle-class representative, rational cyclotomic reciprocity +sends the actual global norm-residue symbol to its ray class modulo +`(m)`. -/ +theorem + rationalCyclotomicGaloisContinuousMulEquivRayClassGroup_globalNormResidue + (c : IdeleClassGroup ℚ) : + rationalCyclotomicGaloisContinuousMulEquivRayClassGroup + m + (globalNormResidueMonoidHom + ℚ (CyclotomicField m ℚ) c) = + QuotientGroup.mk' + (RayClass.Modulus.congruenceSubgroup + (RayClass.rationalModulus m)) c := by + rw [rationalCyclotomicGaloisContinuousMulEquivRayClassGroup_apply] + apply + quotientMulEquivOfNormRangeEq_globalNormResidue + +end NonzeroOrder + +end KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RayClassComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RayClassComparison.lean new file mode 100644 index 0000000000..4c6830e210 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RayClassComparison.lean @@ -0,0 +1,120 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational +public import Mathlib.NumberTheory.Cyclotomic.Gal +/-! +# The rational ray-class/cyclotomic comparison + +For `K = ℚ`, both the ray class quotient modulo `(m)` and the Galois +group of the `m`-th cyclotomic field are canonically `(ℤ/mℤ)ˣ`. This +file composes the two independently constructed equivalences and verifies +the degree/index equality showing that the ray class +field is `ℚ(μ_m)`. +-/ + +@[expose] public section + +open scoped NumberField Cyclotomic + +noncomputable +section + +namespace KroneckerWeber + +open Polynomial + +/-- The rational ray class group modulo `(m)` is canonically the +automorphism group of the `m`-th cyclotomic field. -/ +noncomputable def rationalRayClassGroupEquivCyclotomicAut + (m : ℕ) (hm : m ≠ 0) : + RayClass.RayClassGroup (RayClass.rationalModulus m) ≃* + (CyclotomicField m ℚ ≃ₐ[ℚ] CyclotomicField m ℚ) := by + letI : NeZero m := ⟨hm⟩ + letI : NeZero (m : ℚ) := ⟨by exact_mod_cast hm⟩ + letI : IsCyclotomicExtension {m} ℚ + (CyclotomicField m ℚ) := + CyclotomicField.isCyclotomicExtension m ℚ + exact + (RayClass.rationalRayClassGroupEquivZModUnits m hm).trans + (IsCyclotomicExtension.autEquivPow + (CyclotomicField m ℚ) + (Polynomial.cyclotomic.irreducible_rat + (Nat.pos_of_ne_zero hm))).symm + +/-- The quotient by the rational ray-class norm subgroup is the Galois +group of the corresponding cyclotomic field. -/ +noncomputable def rationalRayClassFieldQuotientEquivCyclotomicAut + (m : ℕ) (hm : m ≠ 0) : + IdeleClassGroup ℚ ⧸ + RayClass.Modulus.congruenceSubgroup + (RayClass.rationalModulus m) ≃* + (CyclotomicField m ℚ ≃ₐ[ℚ] CyclotomicField m ℚ) := + rationalRayClassGroupEquivCyclotomicAut m hm + +/-- The index of the rational ray congruence subgroup equals the degree +of the `m`-th cyclotomic field. -/ +theorem rationalRayClassFieldQuotient_card_eq_cyclotomicDegree + (m : ℕ) (hm : m ≠ 0) : + Nat.card + (IdeleClassGroup ℚ ⧸ + RayClass.Modulus.congruenceSubgroup + (RayClass.rationalModulus m)) = + Module.finrank ℚ (CyclotomicField m ℚ) := by + let : NeZero m := ⟨hm⟩ + let : NeZero (m : ℚ) := ⟨by exact_mod_cast hm⟩ + let : IsCyclotomicExtension {m} ℚ + (CyclotomicField m ℚ) := + CyclotomicField.isCyclotomicExtension m ℚ + let : IsGalois ℚ (CyclotomicField m ℚ) := + IsCyclotomicExtension.isGalois {m} ℚ + (CyclotomicField m ℚ) + calc + Nat.card + (IdeleClassGroup ℚ ⧸ + RayClass.Modulus.congruenceSubgroup + (RayClass.rationalModulus m)) = + Nat.card + (CyclotomicField m ℚ ≃ₐ[ℚ] + CyclotomicField m ℚ) := + Nat.card_congr + (rationalRayClassFieldQuotientEquivCyclotomicAut + m hm).toEquiv + _ = Module.finrank ℚ (CyclotomicField m ℚ) := + IsGalois.card_aut_eq_finrank ℚ (CyclotomicField m ℚ) + +/-- Both sides of the rational ray-class/cyclotomic comparison have +Euler-totient order. -/ +theorem rationalRayClassFieldQuotient_card_eq_totient + (m : ℕ) (hm : m ≠ 0) : + Nat.card + (IdeleClassGroup ℚ ⧸ + RayClass.Modulus.congruenceSubgroup + (RayClass.rationalModulus m)) = + m.totient := by + let : NeZero m := ⟨hm⟩ + let : NeZero (m : ℚ) := ⟨by exact_mod_cast hm⟩ + let : IsCyclotomicExtension {m} ℚ + (CyclotomicField m ℚ) := + CyclotomicField.isCyclotomicExtension m ℚ + calc + Nat.card + (IdeleClassGroup ℚ ⧸ + RayClass.Modulus.congruenceSubgroup + (RayClass.rationalModulus m)) = + Module.finrank ℚ (CyclotomicField m ℚ) := + rationalRayClassFieldQuotient_card_eq_cyclotomicDegree + m hm + _ = m.totient := + IsCyclotomicExtension.finrank + (CyclotomicField m ℚ) + (Polynomial.cyclotomic.irreducible_rat + (Nat.pos_of_ne_zero hm)) + +end KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Setup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Setup.lean new file mode 100644 index 0000000000..4fdcb7761b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Setup.lean @@ -0,0 +1,406 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +public import Mathlib.FieldTheory.Galois.GaloisClosure +public import Mathlib.NumberTheory.NumberField.Cyclotomic.Basic +public import Mathlib.NumberTheory.Padics.HeightOneSpectrum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.FiniteAbelianCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.LocalCyclotomicEmbedding +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic +/-! +# Setup for the global Kronecker--Weber theorem + +This file begins the global Kronecker–Weber construction. +Two finite abelian extensions, embedded in one separable closure, have a +finite abelian compositum. In particular this applies to the given number +field and a cyclotomic field. The remaining arithmetic step is to choose the +cyclotomic order from the local data and prove that the compositum has no +larger degree than the cyclotomic subfield. +-/ + +@[expose] public section + +noncomputable +section + +namespace KroneckerWeber + +open AlgebraicNumberTheory +open HilbertRamification +open HilbertRamification.Dedekind +open scoped IsMulCommutative NumberField + +section GlobalConductorCandidate + +open AlgebraicNumberTheory.Valuations + +variable (L : Type) [Field L] +variable [hNF : NumberField L] [hLab : IsAbelianGalois ℚ L] + +include hNF in +/-- The finite set `S` of ramified rational primes, +primes. A prime belongs to this finset precisely when some height-one prime +of `𝓞 L` above it is ramified. -/ +noncomputable def kroneckerWeberRamifiedPrimes : Finset Nat.Primes := by + let S : Set (IsDedekindDomain.HeightOneSpectrum ℤ) := + {v | ∃ w : IsDedekindDomain.HeightOneSpectrum (𝓞 L), + w.asIdeal.LiesOver v.asIdeal ∧ + ¬ Algebra.IsUnramifiedAt ℤ w.asIdeal} + have hS : S.Finite := + AlgebraicNumberTheory.Ramification.finite_ramified_base_heightOne_primes ℤ (𝓞 L) + exact hS.toFinset.image Rat.HeightOneSpectrum.primesEquiv + +omit hLab in +/-- Membership in the finite ramified-prime set, stated in +height-one-prime language. -/ +theorem mem_kroneckerWeberRamifiedPrimes_iff + (p : Nat.Primes) : + p ∈ kroneckerWeberRamifiedPrimes (L := L) ↔ + ∃ w : IsDedekindDomain.HeightOneSpectrum (𝓞 L), + (w.asIdeal : Ideal (𝓞 L)).LiesOver + ((Rat.HeightOneSpectrum.primesEquiv.symm p).asIdeal : Ideal ℤ) ∧ + ¬ Algebra.IsUnramifiedAt ℤ w.asIdeal := by + classical + simp only [kroneckerWeberRamifiedPrimes, Finset.mem_image, + Set.Finite.mem_toFinset, Set.mem_ofPred_eq] + constructor + · rintro ⟨v, hv, rfl⟩ + simpa using hv + · intro hp + exact ⟨Rat.HeightOneSpectrum.primesEquiv.symm p, hp, + Rat.HeightOneSpectrum.primesEquiv.apply_symm_apply p⟩ + +include hLab in +/-- A chosen extension to `L` of the rational `p`-adic absolute value, +constructed by pulling the absolute value on an algebraic closure of the +completion back along a chosen embedding. -/ +noncomputable def kroneckerWeberPadicExtension + (p : ℕ) [Fact p.Prime] : + AbsoluteValueExtension (Rat.AbsoluteValue.padic p) L := by + let vK := Rat.AbsoluteValue.padic p + letI : Algebra ℚ ℚ := Algebra.id ℚ + let hWith : Algebra ℚ (WithAbs vK) := + WithAbs.instAlgebra _ + let hUniform : UniformContinuousConstSMul ℚ (WithAbs vK) := + WithAbs.instUniformContinuousConstSMulReal _ + let hBase : Algebra ℚ vK.Completion := + @UniformSpace.Completion.algebra + (WithAbs vK) _ _ _ _ ℚ _ hWith hUniform + let hClosure : Algebra ℚ + (absoluteValueExtensionAlgebraicCompletionClosure vK) := + @AlgebraicClosure.instAlgebra vK.Completion _ ℚ _ hBase + let : Algebra ℚ vK.Completion := hBase + let : Algebra ℚ + (absoluteValueExtensionAlgebraicCompletionClosure vK) := + hClosure + exact pullbackAbsoluteValueExtension + vK + (padicAbsoluteValue_isNontrivial p) + IsSepClosed.lift + +include L hNF hLab in +/-- The concrete local embedding assertion attached to fixed structured +parameters `f` and `n`. Its named form hides the localization +instances while retaining the actual embedding needed for the ramification +estimate in the global argument. -/ +noncomputable def kroneckerWeberLocalCyclotomicEmbeddingProperty + (p : Nat.Primes) (f n : ℕ) : Prop := by + letI : Fact p.1.Prime := ⟨p.2⟩ + let w := kroneckerWeberPadicExtension (L := L) p.1 + let vK := Rat.AbsoluteValue.padic p.1 + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := ℚ) w.1 + letI : SMul ℚ w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + letI hE : Field E := inferInstance + letI hBaseE : Algebra vK.Completion E := inferInstance + let e := padicAbsoluteValueCompletionRingEquiv p.1 + letI hQpE : Algebra ℚ_[p.1] E := + @transportedAlgebraAlongRingEquiv vK.Completion ℚ_[p.1] E _ _ + (@CommRing.toCommSemiring E hE.toCommRing) hBaseE e + exact Nonempty + (E →ₐ[ℚ_[p.1]] + CyclotomicField ((p.1 ^ f - 1) * p.1 ^ n) ℚ_[p.1]) + +/-- The synchronized local data chosen from structured local +Kronecker--Weber. In particular, the ramification exponent below and the +embedding used to bound it come from one and the same witness. -/ +structure KroneckerWeberLocalCyclotomicData (p : Nat.Primes) where + /-- The unramified-degree parameter in the local cyclotomic order. -/ + unramifiedDegree : ℕ + /-- The exponent of the `p`-power factor in the local cyclotomic order. -/ + ramificationExponent : ℕ + /-- Positivity of the chosen unramified-degree parameter. -/ + unramifiedDegree_pos : 0 < unramifiedDegree + /-- Positivity of the chosen ramification exponent. -/ + ramificationExponent_pos : 1 ≤ ramificationExponent + /-- The structured local embedding associated with the two chosen parameters. -/ + embedding : kroneckerWeberLocalCyclotomicEmbeddingProperty + (L := L) p unramifiedDegree ramificationExponent + +include L hNF hLab in +/-- A chosen structured local cyclotomic witness at `p`. -/ +noncomputable def kroneckerWeberLocalCyclotomicData + (p : Nat.Primes) : + KroneckerWeberLocalCyclotomicData (L := L) p := by + letI : Fact p.1.Prime := ⟨p.2⟩ + let w := kroneckerWeberPadicExtension (L := L) p.1 + have h := globalPadicLocalization_structuredCyclotomicEmbedding p.1 L w + dsimp only + [globalPadicLocalizationStructuredCyclotomicEmbeddingProperty] at h + let f := Classical.choose h + let hf := Classical.choose_spec h + let n := Classical.choose hf + let hn := Classical.choose_spec hf + refine ⟨f, n, hn.1, hn.2.1, ?_⟩ + simpa only [kroneckerWeberLocalCyclotomicEmbeddingProperty] using hn.2.2 + +include L hNF hLab in +/-- The prime-to-`p` residue degree in the chosen structured local +cyclotomic witness. -/ +noncomputable def kroneckerWeberLocalUnramifiedDegree + (p : Nat.Primes) : ℕ := + (kroneckerWeberLocalCyclotomicData (L := L) p).unramifiedDegree + +include L hNF hLab in +/-- The `p`-power exponent supplied by the structured local +Kronecker--Weber theorem for the chosen completion of `L` at `p`. -/ +noncomputable def kroneckerWeberLocalRamificationExponent + (p : Nat.Primes) : ℕ := + (kroneckerWeberLocalCyclotomicData (L := L) p).ramificationExponent + +include L hNF in +/-- The chosen prime-to-`p` residue degree is positive. -/ +theorem kroneckerWeberLocalUnramifiedDegree_pos + (p : Nat.Primes) : + 0 < kroneckerWeberLocalUnramifiedDegree (L := L) p := + (kroneckerWeberLocalCyclotomicData + (L := L) p).unramifiedDegree_pos + +include L hNF in +/-- The actual local cyclotomic embedding selected together with the two +local exponents. -/ +theorem kroneckerWeberLocalCyclotomicEmbedding + (p : Nat.Primes) : + kroneckerWeberLocalCyclotomicEmbeddingProperty + (L := L) p + (kroneckerWeberLocalUnramifiedDegree (L := L) p) + (kroneckerWeberLocalRamificationExponent (L := L) p) := + (kroneckerWeberLocalCyclotomicData (L := L) p).embedding + +include L hNF hLab in +/-- The cyclotomic order `n = ∏_{p ∈ S} p^{e_p}` chosen from the ramification +support. -/ +noncomputable def kroneckerWeberConductorCandidate : ℕ := + ∏ p ∈ kroneckerWeberRamifiedPrimes (L := L), + p.1 ^ kroneckerWeberLocalRamificationExponent (L := L) p + +include L hNF hLab in +/-- The part of the conductor candidate supported away from `p`. -/ +noncomputable def kroneckerWeberConductorCoprimePart + (p : Nat.Primes) : ℕ := + ∏ q ∈ (kroneckerWeberRamifiedPrimes (L := L)).erase p, + q.1 ^ kroneckerWeberLocalRamificationExponent (L := L) q + +include L hNF in +/-- At a ramified prime `p`, the conductor candidate splits into its chosen +`p`-primary order and the product supported at the other ramified primes. -/ +theorem kroneckerWeberConductorCandidate_eq_primePower_mul_coprimePart + (p : Nat.Primes) + (hp : p ∈ kroneckerWeberRamifiedPrimes (L := L)) : + kroneckerWeberConductorCandidate (L := L) = + p.1 ^ kroneckerWeberLocalRamificationExponent (L := L) p * + kroneckerWeberConductorCoprimePart (L := L) p := by + classical + rw [kroneckerWeberConductorCandidate, + kroneckerWeberConductorCoprimePart] + exact (Finset.mul_prod_erase _ _ hp).symm + +include L hNF in +/-- The complementary factor really is prime to `p`; this is the arithmetic +input which makes it part of the unramified factor in the local cyclotomic +field used in the global construction. -/ +theorem kroneckerWeberConductorCoprimePart_coprime + (p : Nat.Primes) : + Nat.Coprime p.1 + (kroneckerWeberConductorCoprimePart (L := L) p) := by + classical + rw [kroneckerWeberConductorCoprimePart, + Nat.coprime_prod_right_iff] + intro q hq + apply Nat.Coprime.pow_right + exact (Nat.coprime_primes p.2 q.2).2 + (Subtype.coe_ne_coe.mpr + (Ne.symm (Finset.ne_of_mem_erase hq))) + +include L hNF in +/-- The constructed global cyclotomic order is nonzero. -/ +theorem kroneckerWeberConductorCandidate_pos : + 0 < kroneckerWeberConductorCandidate (L := L) := by + classical + apply Finset.prod_pos + intro p hp + exact pow_pos p.2.pos + (kroneckerWeberLocalRamificationExponent (L := L) p) + +end GlobalConductorCandidate + +section GlobalCompositum + +open AlgebraicNumberTheory.Valuations + +variable (L : Type) [Field L] +variable [hNF : NumberField L] [hLab : IsAbelianGalois ℚ L] + +/-- The conductor candidate is nonzero. -/ +instance kroneckerWeberConductorCandidate_neZero : + NeZero (kroneckerWeberConductorCandidate (L := L)) := + ⟨(kroneckerWeberConductorCandidate_pos (L := L)).ne'⟩ + +/-- The cyclotomic field at the conductor candidate is abelian Galois over +the rationals. -/ +instance kroneckerWeberCyclotomicField_isAbelianGalois : + IsAbelianGalois ℚ + (CyclotomicField (kroneckerWeberConductorCandidate (L := L)) ℚ) := + let n := kroneckerWeberConductorCandidate (L := L) + letI : IsCyclotomicExtension {n} ℚ (CyclotomicField n ℚ) := + CyclotomicField.isCyclotomicExtension n ℚ + IsCyclotomicExtension.isAbelianGalois {n} ℚ _ + +include L hNF hLab in +/-- The concrete compositum `M = L(μ_n)` in a fixed separable closure of +`ℚ`, for the conductor candidate constructed above. -/ +noncomputable def kroneckerWeberCompositumField : + IntermediateField ℚ (SeparableClosure ℚ) := + finiteAbelianCompositumField ℚ L + (CyclotomicField (kroneckerWeberConductorCandidate (L := L)) ℚ) + +/-- The global Kronecker--Weber compositum is finite-dimensional over the +rationals. -/ +instance kroneckerWeberCompositumField_finiteDimensional : + FiniteDimensional ℚ (kroneckerWeberCompositumField L) := by + change FiniteDimensional ℚ + (finiteAbelianCompositumField ℚ L + (CyclotomicField (kroneckerWeberConductorCandidate (L := L)) ℚ)) + infer_instance + +/-- The global Kronecker--Weber compositum is abelian Galois over the +rationals. -/ +instance kroneckerWeberCompositumField_isAbelianGalois : + IsAbelianGalois ℚ (kroneckerWeberCompositumField L) := by + exact finiteAbelianCompositumField_isAbelianGalois ℚ L + (CyclotomicField (kroneckerWeberConductorCandidate (L := L)) ℚ) + +/-- The global Kronecker--Weber compositum is a number field. -/ +instance kroneckerWeberCompositumField_numberField : + NumberField (kroneckerWeberCompositumField L) := ⟨⟩ + +include L hNF hLab in +/-- The original abelian extension embeds into `M = L(μ_n)`. -/ +noncomputable def kroneckerWeberCompositumEmbeddingLeft : + L →ₐ[ℚ] kroneckerWeberCompositumField L := + finiteAbelianCompositumEmbeddingLeft ℚ L + (CyclotomicField (kroneckerWeberConductorCandidate (L := L)) ℚ) + +include L hNF hLab in +/-- The conductor cyclotomic field embeds into `M = L(μ_n)`. -/ +noncomputable def kroneckerWeberCompositumEmbeddingRight : + CyclotomicField (kroneckerWeberConductorCandidate (L := L)) ℚ →ₐ[ℚ] + kroneckerWeberCompositumField L := + finiteAbelianCompositumEmbeddingRight ℚ L + (CyclotomicField (kroneckerWeberConductorCandidate (L := L)) ℚ) + +include L hNF hLab in +/-- The copy of `L` inside the concrete compositum. -/ +noncomputable def kroneckerWeberCompositumLeftField : + IntermediateField ℚ (kroneckerWeberCompositumField L) := + (kroneckerWeberCompositumEmbeddingLeft (L := L)).fieldRange + +include L hNF hLab in +/-- The chosen copy of `L` in the compositum is canonically isomorphic to +`L`. -/ +noncomputable def kroneckerWeberCompositumLeftEquiv : + L ≃ₐ[ℚ] kroneckerWeberCompositumLeftField (L := L) := + AlgEquiv.ofInjectiveField + (kroneckerWeberCompositumEmbeddingLeft (L := L)) + +include L hNF hLab in +/-- The elementary lower degree bound for the cyclotomic factor of `M`. -/ +theorem kroneckerWeberCyclotomic_finrank_le_compositum : + Module.finrank ℚ + (CyclotomicField (kroneckerWeberConductorCandidate (L := L)) ℚ) ≤ + Module.finrank ℚ (kroneckerWeberCompositumField L) := + finiteAbelianCompositum_finrank_right_le ℚ L + (CyclotomicField (kroneckerWeberConductorCandidate (L := L)) ℚ) + +include L hNF hLab in +/-- Once the global inertia count supplies the upper degree bound, the +cyclotomic inclusion in `M` is an isomorphism. This isolates the purely +linear-algebraic final step of the global construction. -/ +noncomputable def kroneckerWeberCompositumEquivCyclotomicOfFinrankLe + (hupper : + Module.finrank ℚ (kroneckerWeberCompositumField L) ≤ + Nat.totient (kroneckerWeberConductorCandidate (L := L))) : + kroneckerWeberCompositumField L ≃ₐ[ℚ] + CyclotomicField (kroneckerWeberConductorCandidate (L := L)) ℚ := by + let n := kroneckerWeberConductorCandidate (L := L) + let C := CyclotomicField n ℚ + let M := kroneckerWeberCompositumField L + let i : C →ₐ[ℚ] M := kroneckerWeberCompositumEmbeddingRight (L := L) + letI : IsCyclotomicExtension {n} ℚ C := by + dsimp only [C] + exact CyclotomicField.isCyclotomicExtension n ℚ + have hcyclotomic : Module.finrank ℚ C = Nat.totient n := + IsCyclotomicExtension.Rat.finrank n C + have hCM : Module.finrank ℚ C ≤ Module.finrank ℚ M := + kroneckerWeberCyclotomic_finrank_le_compositum (L := L) + have hMC : Module.finrank ℚ M ≤ Module.finrank ℚ C := by + rw [hcyclotomic] + exact hupper + have hdim : Module.finrank ℚ C = Module.finrank ℚ M := + Nat.le_antisymm hCM hMC + have hiSurjective : Function.Surjective i.toLinearMap := + (LinearMap.injective_iff_surjective_of_finrank_eq_finrank + (f := i.toLinearMap) hdim).mp i.injective + exact (AlgEquiv.ofBijective i ⟨i.injective, hiSurjective⟩).symm + +include L hNF hLab in +/-- The promised embedding of `L` into the conductor cyclotomic field, +deduced from the global upper degree bound. -/ +noncomputable def kroneckerWeberEmbeddingOfCompositumFinrankLe + (hupper : + Module.finrank ℚ (kroneckerWeberCompositumField L) ≤ + Nat.totient (kroneckerWeberConductorCandidate (L := L))) : + L →ₐ[ℚ] + CyclotomicField (kroneckerWeberConductorCandidate (L := L)) ℚ := + (kroneckerWeberCompositumEquivCyclotomicOfFinrankLe + (L := L) hupper).toAlgHom.comp + (kroneckerWeberCompositumEmbeddingLeft (L := L)) + +include L hNF hLab in +/-- A chosen prime of `M = L(μ_n)` over the rational prime `p`. -/ +noncomputable def kroneckerWeberCompositumPrimeAbove + (p : Nat.Primes) : + Ideal.primesOver + ((Rat.HeightOneSpectrum.primesEquiv.symm p).asIdeal : Ideal ℤ) + (𝓞 (kroneckerWeberCompositumField L)) := by + letI : ((Rat.HeightOneSpectrum.primesEquiv.symm p).asIdeal : + Ideal ℤ).IsPrime := by + infer_instance + exact Classical.choice (inferInstance : Nonempty + (Ideal.primesOver + ((Rat.HeightOneSpectrum.primesEquiv.symm p).asIdeal : Ideal ℤ) + (𝓞 (kroneckerWeberCompositumField L)))) + +end GlobalCompositum + +end KroneckerWeber + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/UnramifiedCompositumSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/UnramifiedCompositumSupport.lean new file mode 100644 index 0000000000..d913eb6454 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/UnramifiedCompositumSupport.lean @@ -0,0 +1,265 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.NumberField.Cyclotomic.Ideal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.RationalPrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Setup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.CompositumUnramified +/-! +# Ramification support of the auxiliary compositum + +Let `S` be the finite set of rational primes ramified in `L`, let +`n = ∏ p∈S, p ^ e_p`, and put `M = L(μ_n)`. This file proves the +global ramification assertion used in the inertia count: every finite prime +of `M` outside `S` is unramified over `ℤ`. + +The two factors are unramified outside `S` for different reasons. For `L` +this is the definition of `S`; for the cyclotomic factor it is the standard +formula saying that a rational prime not dividing the conductor has +ramification index one. An inertia automorphism of the compositum restricts +to inertia automorphisms of both factors. Since the factors generate the +compositum, triviality of both restrictions implies triviality of the +original inertia automorphism. +-/ + +@[expose] public section + +noncomputable +section + +namespace KroneckerWeber + +open NumberField +open HilbertRamification.Dedekind +open AlgebraicNumberTheory.Ramification +open scoped NumberField + +attribute [local instance] Ideal.Quotient.field + +section ConductorSupport + +variable (L : Type) [Field L] [NumberField L] [IsAbelianGalois ℚ L] + +/-- A rational prime outside `S` does not divide the conductor candidate, +whose prime-power factors are supported exactly on `S`. -/ +theorem kroneckerWeber_prime_not_dvd_conductorCandidate + (p : Nat.Primes) + (hp : p ∉ kroneckerWeberRamifiedPrimes (L := L)) : + ¬ p.1 ∣ kroneckerWeberConductorCandidate (L := L) := by + classical + apply p.2.coprime_iff_not_dvd.mp + rw [kroneckerWeberConductorCandidate, + Nat.coprime_prod_right_iff] + intro q hq + apply Nat.Coprime.pow_right + exact (Nat.coprime_primes p.2 q.2).2 + (Subtype.coe_ne_coe.mpr fun hpq => hp (hpq ▸ hq)) + +end ConductorSupport + +section FactorRamification + +variable (L : Type) [Field L] [NumberField L] [IsAbelianGalois ℚ L] + +omit [IsAbelianGalois ℚ L] in +/-- The copy of `L` in any isomorphic realization has ramification index +one above a rational prime outside the defining support `S`. -/ +theorem kroneckerWeber_leftFactor_ramificationIdx_eq_one + {A : Type*} [Field A] [NumberField A] + (eLA : L ≃ₐ[ℚ] A) + (p : Nat.Primes) + (hpS : p ∉ kroneckerWeberRamifiedPrimes (L := L)) + (PA : Ideal (𝓞 A)) [PA.IsPrime] + [PA.LiesOver (rationalPrimeIdeal p)] : + PA.ramificationIdx ℤ = 1 := by + let eLAₒ : (𝓞 L) ≃ₐ[ℤ] (𝓞 A) := + (RingOfIntegers.mapAlgEquiv eLA).restrictScalars ℤ + let PL : Ideal (𝓞 L) := PA.comap eLAₒ + let : PL.LiesOver (rationalPrimeIdeal p) := + Ideal.comap_liesOver PA (rationalPrimeIdeal p) eLAₒ + have hp0 : rationalPrimeIdeal p ≠ ⊥ := + (Rat.HeightOneSpectrum.primesEquiv.symm p).ne_bot + have hPL0 : PL ≠ ⊥ := + Ideal.ne_bot_of_liesOver_of_ne_bot hp0 PL + have hPLunramified : Algebra.IsUnramifiedAt ℤ PL := by + by_contra hram + apply hpS + apply (mem_kroneckerWeberRamifiedPrimes_iff + (L := L) p).2 + let w : IsDedekindDomain.HeightOneSpectrum (𝓞 L) := + ⟨PL, inferInstance, hPL0⟩ + exact ⟨w, inferInstance, hram⟩ + have hPLramification : + PL.ramificationIdx ℤ = 1 := + Ideal.ramificationIdx_eq_one_iff.mpr hPLunramified + calc + PA.ramificationIdx ℤ = + (rationalPrimeIdeal p).ramificationIdx' PA := + (Ideal.ramificationIdx'_eq_ramificationIdx + (rationalPrimeIdeal p) PA hp0).symm + _ = (rationalPrimeIdeal p).ramificationIdx' PL := + (Ideal.ramificationIdx'_comap_eq + (rationalPrimeIdeal p) eLAₒ PA).symm + _ = PL.ramificationIdx ℤ := + Ideal.ramificationIdx'_eq_ramificationIdx + (rationalPrimeIdeal p) PL hp0 + _ = 1 := hPLramification + +/-- The conductor cyclotomic factor has ramification index one outside +`S`, since primes outside `S` do not divide the conductor candidate. -/ +theorem kroneckerWeber_cyclotomicFactor_ramificationIdx_eq_one + {B : Type*} [Field B] [NumberField B] + (eCB : + CyclotomicField (kroneckerWeberConductorCandidate (L := L)) ℚ + ≃ₐ[ℚ] B) + (p : Nat.Primes) + (hpS : p ∉ kroneckerWeberRamifiedPrimes (L := L)) + (PB : Ideal (𝓞 B)) [PB.IsPrime] + [PB.LiesOver (rationalPrimeIdeal p)] : + PB.ramificationIdx ℤ = 1 := by + let C : Type := + CyclotomicField (kroneckerWeberConductorCandidate (L := L)) ℚ + let : IsCyclotomicExtension + {kroneckerWeberConductorCandidate (L := L)} ℚ C := by + dsimp only [C] + exact CyclotomicField.isCyclotomicExtension + (kroneckerWeberConductorCandidate (L := L)) ℚ + let eCBₒ : (𝓞 C) ≃ₐ[ℤ] (𝓞 B) := + (RingOfIntegers.mapAlgEquiv eCB).restrictScalars ℤ + let PC : Ideal (𝓞 C) := PB.comap eCBₒ + let : PC.LiesOver (rationalPrimeIdeal p) := + Ideal.comap_liesOver PB (rationalPrimeIdeal p) eCBₒ + let : Fact (Nat.Prime p.1) := ⟨p.2⟩ + let : PC.LiesOver (Ideal.span {(p.1 : ℤ)}) := by + rw [← rationalPrimeIdeal_eq_span p] + infer_instance + have hpndvd : + ¬ p.1 ∣ kroneckerWeberConductorCandidate (L := L) := + kroneckerWeber_prime_not_dvd_conductorCandidate (L := L) p hpS + have hp0 : rationalPrimeIdeal p ≠ ⊥ := + (Rat.HeightOneSpectrum.primesEquiv.symm p).ne_bot + have hPCramification : + PC.ramificationIdx ℤ = 1 := + IsCyclotomicExtension.Rat.ramificationIdx_eq_of_not_dvd + p.1 C PC hpndvd + calc + PB.ramificationIdx ℤ = + (rationalPrimeIdeal p).ramificationIdx' PB := + (Ideal.ramificationIdx'_eq_ramificationIdx + (rationalPrimeIdeal p) PB hp0).symm + _ = (rationalPrimeIdeal p).ramificationIdx' PC := + (Ideal.ramificationIdx'_comap_eq + (rationalPrimeIdeal p) eCBₒ PB).symm + _ = PC.ramificationIdx ℤ := + Ideal.ramificationIdx'_eq_ramificationIdx + (rationalPrimeIdeal p) PC hp0 + _ = 1 := hPCramification + +end FactorRamification + +section CompositumSupport + +variable (L : Type) [Field L] +variable [hNF : NumberField L] [hLab : IsAbelianGalois ℚ L] + +/-- Ramification support of a realization of the auxiliary compositum. If +the copies of `L` and the conductor cyclotomic field generate +`M`, every finite prime of `M` outside the ramification support of `L` is +unramified over `ℤ`. -/ +theorem kroneckerWeberCompositum_isUnramifiedAt_of_not_mem + {M : Type*} [Field M] [NumberField M] [IsGalois ℚ M] + (A B : IntermediateField ℚ M) [Normal ℚ A] [Normal ℚ B] + (eLA : L ≃ₐ[ℚ] A) + (eCB : + CyclotomicField (kroneckerWeberConductorCandidate (L := L)) ℚ + ≃ₐ[ℚ] B) + (hsup : A ⊔ B = ⊤) + (Q : Ideal (𝓞 M)) + [Q.IsPrime] [Q.IsMaximal] + (hQoutside : + ¬ ∃ p ∈ kroneckerWeberRamifiedPrimes (L := L), + rationalPrimeIdeal p = Q.under ℤ) : + Algebra.IsUnramifiedAt ℤ Q := by + classical + let q : Ideal ℤ := Q.under ℤ + have hQ0 : Q ≠ ⊥ := + Ring.ne_bot_of_isMaximal_of_not_isField + (M := Q) inferInstance (RingOfIntegers.not_isField M) + let : q.IsPrime := inferInstance + have hq0 : q ≠ ⊥ := + Ideal.under_ne_bot ℤ hQ0 + let v : IsDedekindDomain.HeightOneSpectrum ℤ := + ⟨q, inferInstance, hq0⟩ + let p : Nat.Primes := Rat.HeightOneSpectrum.primesEquiv v + have hpq : rationalPrimeIdeal p = q := by + change + (Rat.HeightOneSpectrum.primesEquiv.symm p).asIdeal = v.asIdeal + rw [Rat.HeightOneSpectrum.primesEquiv.symm_apply_apply] + have hpS : p ∉ kroneckerWeberRamifiedPrimes (L := L) := by + intro hp + exact hQoutside ⟨p, hp, hpq⟩ + let : Q.LiesOver (rationalPrimeIdeal p) := ⟨hpq⟩ + have hp0 : rationalPrimeIdeal p ≠ ⊥ := + (Rat.HeightOneSpectrum.primesEquiv.symm p).ne_bot + let PA : Ideal (𝓞 A) := Q.under (𝓞 A) + let PB : Ideal (𝓞 B) := Q.under (𝓞 B) + let : Q.LiesOver PA := ⟨rfl⟩ + let : Q.LiesOver PB := ⟨rfl⟩ + let : PA.LiesOver (rationalPrimeIdeal p) := + Ideal.LiesOver.tower_bot Q PA (rationalPrimeIdeal p) + let : PB.LiesOver (rationalPrimeIdeal p) := + Ideal.LiesOver.tower_bot Q PB (rationalPrimeIdeal p) + have hPA0 : PA ≠ ⊥ := + Ideal.ne_bot_of_liesOver_of_ne_bot hp0 PA + have hPB0 : PB ≠ ⊥ := + Ideal.ne_bot_of_liesOver_of_ne_bot hp0 PB + let : PA.IsMaximal := + (inferInstance : PA.IsPrime).isMaximal hPA0 + let : PB.IsMaximal := + (inferInstance : PB.IsPrime).isMaximal hPB0 + have hPAramification : + PA.ramificationIdx ℤ = 1 := + kroneckerWeber_leftFactor_ramificationIdx_eq_one + (L := L) eLA p hpS PA + have hPBramification : + PB.ramificationIdx ℤ = 1 := + kroneckerWeber_cyclotomicFactor_ramificationIdx_eq_one + (L := L) eCB p hpS PB + let aAlg : Algebra ℚ A := inferInstance + let hANormal : @Normal ℚ A _ _ aAlg := inferInstance + let hAAlg : Algebra ℚ A := A.algebra' + have hAAlg_eq : aAlg = hAAlg := Subsingleton.elim _ _ + cases hAAlg_eq + let : Normal ℚ A := hANormal + let bAlg : Algebra ℚ B := inferInstance + let hBNormal : @Normal ℚ B _ _ bAlg := inferInstance + let hBAlg : Algebra ℚ B := B.algebra' + have hBAlg_eq : bAlg = hBAlg := Subsingleton.elim _ _ + cases hBAlg_eq + let : Normal ℚ B := hBNormal + let hAGalois : IsGalois ℚ A := + isGalois_iff.mpr ⟨inferInstance, inferInstance⟩ + let hBGalois : IsGalois ℚ B := + isGalois_iff.mpr ⟨inferInstance, inferInstance⟩ + have hIA : inertiaGroup PA Gal(A/ℚ) = ⊥ := + @inertiaGroup_eq_bot_of_ramificationIdx_eq_one_int A _ _ hAGalois + (rationalPrimeIdeal p) PA _ _ _ _ hp0 hPAramification + have hIB : inertiaGroup PB Gal(B/ℚ) = ⊥ := + @inertiaGroup_eq_bot_of_ramificationIdx_eq_one_int B _ _ hBGalois + (rationalPrimeIdeal p) PB _ _ _ _ hp0 hPBramification + have hIM : inertiaGroup Q Gal(M/ℚ) = ⊥ := + inertiaGroup_eq_bot_of_restrictNormal_of_sup_eq_top + A B Q hsup (by simpa only [PA] using hIA) + (by simpa only [PB] using hIB) + exact isUnramifiedAt_int_of_inertiaGroup_eq_bot Q hIM + +end CompositumSupport + +end KroneckerWeber + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory.lean new file mode 100644 index 0000000000..7aef854c0c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/All.lean new file mode 100644 index 0000000000..18acb2b818 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/All.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.All +/-! +# Kummer theory + +Public root for the reusable Kummer-theory layer used by abstract class formations. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete.lean new file mode 100644 index 0000000000..2cb42a8210 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.CyclotomicPrimeBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.FinitePlaceDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitKummerUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SimpleExtensionLocalBehavior + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/All.lean new file mode 100644 index 0000000000..de79b0fd76 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/All.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.CyclotomicPrimeBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.FinitePlaceDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitKummerUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SimpleExtensionLocalBehavior +/-! +# Concrete Kummer theory + +Root characters, radical quotients, finite and infinite generation, the local +unramified unit criterion, and the perfect Kummer pairing for actual field +extensions. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/CyclotomicPrimeBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/CyclotomicPrimeBaseChange.lean new file mode 100644 index 0000000000..b5dfff73f4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/CyclotomicPrimeBaseChange.lean @@ -0,0 +1,353 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.TensorProduct +public import Mathlib.NumberTheory.Cyclotomic.PrimitiveRoots +/-! +# Prime cyclotomic base change + +This file constructs the roots-of-unity base change for a prime-degree +extension. If `L / K` has prime degree `p`, the +cyclotomic extension `K(μ_p) / K` has degree strictly smaller than `p`. +The two degrees are therefore coprime, and + +`K(μ_p) ⊗[K] L` + +is an actual field, Galois of degree `p` over `K(μ_p)`. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField + +noncomputable +section + +namespace KummerTheory + +universe u + +variable + (K L : Type u) + [Field K] [NumberField K] + [Field L] [NumberField L] + [Algebra K L] [IsGalois K L] + +/-- Over a characteristic-zero field, the concrete cyclotomic field +of order `m` has degree at most `φ(m)`. -/ +theorem cyclotomicField_finrank_le_totient + (F : Type*) [Field F] [CharZero F] + (m : ℕ) (hm : 0 < m) : + Module.finrank F (CyclotomicField m F) ≤ + Nat.totient m := by + let : NeZero m := ⟨hm.ne'⟩ + let C := CyclotomicField m F + let : IsCyclotomicExtension {m} F C := + CyclotomicField.isCyclotomicExtension m F + let : FiniteDimensional F C := + IsCyclotomicExtension.finiteDimensional {m} F C + obtain ⟨ζ, hζ⟩ := + (CyclotomicField.isCyclotomicExtension m F).exists_isPrimitiveRoot + (Set.mem_singleton m) hm.ne' + have hgen : Algebra.adjoin F ({ζ} : Set C) = ⊤ := + IsCyclotomicExtension.adjoin_primitive_root_eq_top hζ + have htop : + IntermediateField.adjoin F ({ζ} : Set C) = ⊤ := + IntermediateField.adjoin_eq_top_of_algebra + F ({ζ} : Set C) hgen + have hroot : + Polynomial.aeval ζ + (Polynomial.cyclotomic m F) = 0 := by + rw [Polynomial.aeval_def, + Polynomial.eval₂_eq_eval_map, + Polynomial.map_cyclotomic, + ← Polynomial.IsRoot.def] + exact hζ.isRoot_cyclotomic hm + have hdegree : + (minpoly F ζ).natDegree ≤ + (Polynomial.cyclotomic m F).natDegree := + Polynomial.natDegree_le_natDegree + (minpoly.min F ζ + (Polynomial.cyclotomic.monic m F) hroot) + calc + Module.finrank F (CyclotomicField m F) = + Module.finrank F C := rfl + _ = Module.finrank F + (IntermediateField.adjoin F ({ζ} : Set C)) := by + rw [htop] + simp + _ = (minpoly F ζ).natDegree := + IntermediateField.adjoin.finrank + (IsIntegral.of_finite F ζ) + _ ≤ (Polynomial.cyclotomic m F).natDegree := + hdegree + _ = Nat.totient m := + Polynomial.natDegree_cyclotomic m F + +/-- The prime cyclotomic base field used for prime-degree base change. -/ +abbrev PrimeCyclotomicBase (p : ℕ) := + CyclotomicField p K + +/-- The tensor-product compositum of `L` and the prime cyclotomic +base field. Its field structure is constructed below from coprime +degrees. -/ +abbrev PrimeCyclotomicPushout (p : ℕ) := + PrimeCyclotomicBase K p ⊗[K] L + +noncomputable instance primeCyclotomicBaseFiniteDimensional + (p : ℕ) : + FiniteDimensional K (PrimeCyclotomicBase K p) := + IsCyclotomicExtension.finiteDimensional + {p} K (PrimeCyclotomicBase K p) + +noncomputable instance primeCyclotomicBaseIsGalois + (p : ℕ) : + IsGalois K (PrimeCyclotomicBase K p) := + IsCyclotomicExtension.isGalois + {p} K (PrimeCyclotomicBase K p) + +noncomputable instance primeCyclotomicBaseNumberField + (p : ℕ) [NeZero p] : + NumberField (PrimeCyclotomicBase K p) := + NumberField.of_module_finite K + (PrimeCyclotomicBase K p) + +/-- Over a characteristic-zero field, the degree of `K(μ_p)` is +strictly smaller than the prime `p`. -/ +theorem primeCyclotomicBase_finrank_lt + (p : ℕ) (hp : p.Prime) : + Module.finrank K (PrimeCyclotomicBase K p) < p := by + let : NeZero p := ⟨hp.ne_zero⟩ + have hle : + Module.finrank K (PrimeCyclotomicBase K p) ≤ + Nat.totient p := + cyclotomicField_finrank_le_totient + K p hp.pos + rw [Nat.totient_prime hp] at hle + exact hle.trans_lt (Nat.sub_one_lt hp.ne_zero) + +omit [NumberField L] [IsGalois K L] in +/-- The cyclotomic degree is coprime to a prime-degree extension. -/ +theorem primeCyclotomicBase_finrank_coprime + (p : ℕ) (hp : p.Prime) + (hdegree : Module.finrank K L = p) : + (Module.finrank K (PrimeCyclotomicBase K p)).Coprime + (Module.finrank K L) := by + rw [hdegree] + exact + (Nat.coprime_of_lt_prime + (ne_of_gt Module.finrank_pos) + (primeCyclotomicBase_finrank_lt + (K := K) p hp) + hp).symm + +/-- The field structure on the prime cyclotomic pushout, obtained +from coprime degrees. -/ +@[reducible] +noncomputable def primeCyclotomicPushoutField + (p : ℕ) (hp : p.Prime) + (hdegree : Module.finrank K L = p) : + Field (PrimeCyclotomicPushout K L p) := + (tensorProduct_isField_of_finrank_coprime + K (PrimeCyclotomicBase K p) L + (primeCyclotomicBase_finrank_coprime + (K := K) (L := L) p hp hdegree)).toField + +/-- The canonical left-factor algebra structure, restated after +installing the field structure on the tensor product. -/ +@[reducible] +noncomputable def primeCyclotomicPushoutAlgebra + (p : ℕ) (hp : p.Prime) + (hdegree : Module.finrank K L = p) : + letI : NeZero p := ⟨hp.ne_zero⟩ + letI : Field (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushoutField K L p hp hdegree + Algebra + (PrimeCyclotomicBase K p) + (PrimeCyclotomicPushout K L p) := by + letI : Field (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushoutField K L p hp hdegree + exact Algebra.TensorProduct.leftAlgebra + +omit [IsGalois K L] in +/-- The pushout has the expected degree over the cyclotomic base. -/ +theorem primeCyclotomicPushout_finrank + (p : ℕ) (hp : p.Prime) + (hdegree : Module.finrank K L = p) : + letI : NeZero p := ⟨hp.ne_zero⟩ + letI : Field (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushoutField K L p hp hdegree + letI : Algebra + (PrimeCyclotomicBase K p) + (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushoutAlgebra K L p hp hdegree + Module.finrank + (PrimeCyclotomicBase K p) + (PrimeCyclotomicPushout K L p) = + p := by + let : NeZero p := ⟨hp.ne_zero⟩ + let : Field (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushoutField K L p hp hdegree + let : Algebra + (PrimeCyclotomicBase K p) + (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushoutAlgebra K L p hp hdegree + rw [Module.finrank_baseChange, hdegree] + +/-- The prime cyclotomic pushout is Galois over `K(μ_p)`. -/ +theorem primeCyclotomicPushout_isGalois + (p : ℕ) (hp : p.Prime) + (hdegree : Module.finrank K L = p) : + letI : NeZero p := ⟨hp.ne_zero⟩ + letI : Field (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushoutField K L p hp hdegree + letI : Algebra + (PrimeCyclotomicBase K p) + (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushoutAlgebra K L p hp hdegree + IsGalois + (PrimeCyclotomicBase K p) + (PrimeCyclotomicPushout K L p) := by + let : NeZero p := ⟨hp.ne_zero⟩ + let : Field (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushoutField K L p hp hdegree + let : Algebra + (PrimeCyclotomicBase K p) + (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushoutAlgebra K L p hp hdegree + exact + tensorProduct_isGalois_of_finrank_coprime + K (PrimeCyclotomicBase K p) L + (primeCyclotomicBase_finrank_coprime + (K := K) (L := L) p hp hdegree) + +omit [IsGalois K L] in +/-- The prime cyclotomic pushout is again a number field. -/ +theorem primeCyclotomicPushout_numberField + (p : ℕ) (hp : p.Prime) + (hdegree : Module.finrank K L = p) : + letI : NeZero p := ⟨hp.ne_zero⟩ + letI : Field (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushoutField K L p hp hdegree + letI : Algebra + (PrimeCyclotomicBase K p) + (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushoutAlgebra K L p hp hdegree + NumberField (PrimeCyclotomicPushout K L p) := by + let : NeZero p := ⟨hp.ne_zero⟩ + let : Field (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushoutField K L p hp hdegree + let : Algebra + (PrimeCyclotomicBase K p) + (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushoutAlgebra K L p hp hdegree + exact + NumberField.of_module_finite + (PrimeCyclotomicBase K p) + (PrimeCyclotomicPushout K L p) + +/-- The cyclotomic base contains a primitive `p`-th root of unity. -/ +theorem primeCyclotomicBase_primitiveRoots_nonempty + (p : ℕ) (hp : p.Prime) : + (primitiveRoots p (PrimeCyclotomicBase K p)).Nonempty := by + let : NeZero p := ⟨hp.ne_zero⟩ + obtain ⟨ζ, hζ⟩ := + (CyclotomicField.isCyclotomicExtension p K).exists_isPrimitiveRoot + (Set.mem_singleton p) hp.ne_zero + exact ⟨ζ, (mem_primitiveRoots hp.pos).2 hζ⟩ + +/-- The Galois group after cyclotomic base change is cyclic of prime +order. -/ +theorem primeCyclotomicPushout_isCyclic + (p : ℕ) (hp : p.Prime) + (hdegree : Module.finrank K L = p) : + letI : NeZero p := ⟨hp.ne_zero⟩ + letI : Field (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushoutField K L p hp hdegree + letI : Algebra + (PrimeCyclotomicBase K p) + (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushoutAlgebra K L p hp hdegree + letI : IsGalois + (PrimeCyclotomicBase K p) + (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushout_isGalois + K L p hp hdegree + IsCyclic + (PrimeCyclotomicPushout K L p ≃ₐ[PrimeCyclotomicBase K p] + PrimeCyclotomicPushout K L p) := by + let : NeZero p := ⟨hp.ne_zero⟩ + let : Field (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushoutField K L p hp hdegree + let : Algebra + (PrimeCyclotomicBase K p) + (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushoutAlgebra K L p hp hdegree + let : IsGalois + (PrimeCyclotomicBase K p) + (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushout_isGalois + K L p hp hdegree + let : Fact p.Prime := ⟨hp⟩ + exact + isCyclic_of_prime_card (p := p) (by + rw [IsGalois.card_aut_eq_finrank, + primeCyclotomicPushout_finrank + K L p hp hdegree]) + +/-- Prime-degree Kummer coordinates for the base-changed Galois group, +in the exact one-coordinate form used by the prime-degree Kummer coordinate construction. -/ +noncomputable def primeCyclotomicPushoutGalEquivPiZMod + (p : ℕ) (hp : p.Prime) + (hdegree : Module.finrank K L = p) : + letI : NeZero p := ⟨hp.ne_zero⟩ + letI : Field (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushoutField K L p hp hdegree + letI : Algebra + (PrimeCyclotomicBase K p) + (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushoutAlgebra K L p hp hdegree + letI : IsGalois + (PrimeCyclotomicBase K p) + (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushout_isGalois + K L p hp hdegree + (PrimeCyclotomicPushout K L p ≃ₐ[PrimeCyclotomicBase K p] + PrimeCyclotomicPushout K L p) ≃* + (Fin 1 → Multiplicative (ZMod p)) := by + letI : NeZero p := ⟨hp.ne_zero⟩ + letI : Field (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushoutField K L p hp hdegree + letI : Algebra + (PrimeCyclotomicBase K p) + (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushoutAlgebra K L p hp hdegree + letI : IsGalois + (PrimeCyclotomicBase K p) + (PrimeCyclotomicPushout K L p) := + primeCyclotomicPushout_isGalois + K L p hp hdegree + let G := + PrimeCyclotomicPushout K L p ≃ₐ[PrimeCyclotomicBase K p] + PrimeCyclotomicPushout K L p + letI : IsCyclic G := + primeCyclotomicPushout_isCyclic + K L p hp hdegree + have hcardG : Nat.card G = p := by + dsimp only [G] + rw [IsGalois.card_aut_eq_finrank, + primeCyclotomicPushout_finrank + K L p hp hdegree] + exact + (hcardG ▸ (zmodCyclicMulEquiv + (inferInstance : IsCyclic G)).symm).trans + (MulEquiv.piUnique + (fun _ : Fin 1 => Multiplicative (ZMod p))).symm + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/FinitePlaceDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/FinitePlaceDecomposition.lean new file mode 100644 index 0000000000..0ecf8e46bf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/FinitePlaceDecomposition.lean @@ -0,0 +1,321 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RootCharacters +public import Mathlib.Algebra.Group.Hom.Basic +public import Mathlib.Algebra.Group.Subgroup.Ker +/-! +# Kummer radicals and finite-place decomposition fields + +For a finite Galois extension containing an `n`-th root `β` of a +base-field unit `a`, this file identifies the local `n`-th-power +condition on `a` with membership of `β` in the decomposition field. + +The proof uses the canonical comparison between the two models of the +finite-place completion and the algebraic localization realization of +the decomposition field. The only Kummer input is the usual fact that +two roots with the same `n`-th power differ by an `n`-th root of unity. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory + +noncomputable +section + +namespace KummerTheory + +variable {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in +/-- If a Kummer radicand is an `n`-th power in an absolute-value +completion, its chosen root lies in the corresponding decomposition +field. This is the completion-level source behind both the finite and +archimedean localization arguments. -/ +theorem + kummerRadicand_root_mem_decompositionFixedField_of_mem_nthPowerSubgroup + (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a : Kˣ) (beta : Lˣ) + (hbeta : + beta ^ (n : ℕ) = + Units.map (algebraMap K L).toMonoidHom a) + (ha : + Units.map + (algebraMap K vK.Completion).toMonoidHom a ∈ + (powMonoidHom (n : ℕ) : + vK.Completionˣ →* vK.Completionˣ).range) : + (beta : L) ∈ + IntermediateField.fixedField + (absoluteValueDecompositionGroup K w.1) := by + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let := localizedCompletionGlobalAlgebra vK w + let := localizedCompletionIsScalarTower vK w + let C := vK.Completion + let E := LocalizedCompletion vK w + let toE := + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + let aC : Cˣ := + Units.map (algebraMap K C).toMonoidHom a + have hbeta_val : + (beta : L) ^ (n : ℕ) = + algebraMap K L (a : K) := by + simpa using congrArg Units.val hbeta + obtain ⟨yC, hyC⟩ := + (MonoidHom.mem_range + (G := Cˣ)).mp ha + rw [powMonoidHom_apply] at hyC + let betaE : Eˣ := + Units.map toE.toMonoidHom beta + let yE : Eˣ := + Units.map (algebraMap C E).toMonoidHom yC + have hbetaE : + betaE ^ (n : ℕ) = + Units.map (algebraMap C E).toMonoidHom aC := by + apply Units.ext + change + toE (beta : L) ^ (n : ℕ) = + algebraMap C E (algebraMap K C (a : K)) + calc + toE (beta : L) ^ (n : ℕ) = + toE ((beta : L) ^ (n : ℕ)) := by + exact + (map_pow toE (beta : L) (n : ℕ)).symm + _ = toE (algebraMap K L (a : K)) := by + rw [hbeta_val] + _ = algebraMap C E (algebraMap K C (a : K)) := + AbsoluteValue.toAlgebraicLocalization_algebraMap + vK w.1 w.2 (a : K) + have hyE : + yE ^ (n : ℕ) = + Units.map (algebraMap C E).toMonoidHom aC := by + calc + yE ^ (n : ℕ) = + Units.map (algebraMap C E).toMonoidHom + (yC ^ (n : ℕ)) := by + exact + (map_pow + (Units.map (algebraMap C E).toMonoidHom) + yC (n : ℕ)).symm + _ = Units.map (algebraMap C E).toMonoidHom aC := by + rw [hyC] + let q : Eˣ := betaE / yE + have hq : q ^ (n : ℕ) = 1 := + KummerTheory.div_pow_eq_one_of_pow_eq_pow + (hbetaE.trans hyE.symm) + obtain ⟨zeta, hzeta_mem⟩ := hmu + have hzeta : + IsPrimitiveRoot zeta (n : ℕ) := + (mem_primitiveRoots n.pos).mp hzeta_mem + have hzetaE : + IsPrimitiveRoot + (algebraMap C E (algebraMap K C zeta)) + (n : ℕ) := + (hzeta.map_of_injective + (algebraMap K C).injective).map_of_injective + (algebraMap C E).injective + have hq_val : + (q : E) ^ (n : ℕ) = 1 := by + simpa using congrArg Units.val hq + obtain ⟨i, _hi, hzetaq⟩ := + hzetaE.eq_pow_of_pow_eq_one hq_val + have hbeta_base : + toE (beta : L) ∈ + Set.range (algebraMap C E) := by + refine + ⟨(algebraMap K C zeta) ^ i * (yC : C), ?_⟩ + calc + algebraMap C E + ((algebraMap K C zeta) ^ i * (yC : C)) = + (algebraMap C E (algebraMap K C zeta)) ^ i * + algebraMap C E (yC : C) := by + rw [map_mul, map_pow] + _ = (q : E) * (yE : E) := by + rw [hzetaq] + rfl + _ = toE (beta : L) := by + simpa [betaE] using + congrArg Units.val + (show q * yE = betaE by simp [q]) + have hcomap : + (beta : L) ∈ + ((algebraMap C E).fieldRange).comap toE := + hbeta_base + rw [ + localizedCompletion_baseField_comap_eq_fixedField_decompositionGroup + vK hvK w] at hcomap + simpa [C, E, toE] using hcomap + +omit [FiniteDimensional K L] in +open scoped Classical in +/-- A Kummer radicand is an `n`-th power in the finite-place completion +exactly when its chosen root belongs to the decomposition field at the +chosen extension of that place. -/ +theorem + finitePlaceKummerRadicand_mem_nthPowerSubgroup_iff_root_mem_decompositionFixedField + (v : HeightOneSpectrum (𝓞 K)) + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a : Kˣ) (beta : Lˣ) + (hbeta : + beta ^ (n : ℕ) = + Units.map (algebraMap K L).toMonoidHom a) : + Units.map + (algebraMap K (v.adicCompletion K)).toMonoidHom a ∈ + (powMonoidHom (n : ℕ) : + (v.adicCompletion K)ˣ →* + (v.adicCompletion K)ˣ).range ↔ + (beta : L) ∈ + IntermediateField.fixedField + (absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := L) v).1) := by + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + let vK := HeightOneSpectrum.adicAbv K v + let w := chosenFinitePlaceExtension (L := L) v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let := localizedCompletionGlobalAlgebra vK w + let := localizedCompletionIsScalarTower vK w + let C := vK.Completion + let E := LocalizedCompletion vK w + let toE := + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + let e : + Cˣ ≃ₜ* (v.adicCompletion K)ˣ := + finitePlaceCompletionUnitsContinuousMulEquiv v + let aC : Cˣ := + Units.map (algebraMap K C).toMonoidHom a + have he_base (u : Kˣ) : + e (Units.map (algebraMap K C).toMonoidHom u) = + Units.map + (algebraMap K (v.adicCompletion K)).toMonoidHom u := by + apply Units.ext + let x : WithAbs vK := + (WithAbs.equiv vK).symm (u : K) + change + finitePlaceCompletionRingHom v (x : C) = + algebraMap K (v.adicCompletion K) (u : K) + rw [finitePlaceCompletionRingHom_coe] + rfl + have hbeta_val : + (beta : L) ^ (n : ℕ) = + algebraMap K L (a : K) := by + simpa using congrArg Units.val hbeta + constructor + · intro ha + apply + kummerRadicand_root_mem_decompositionFixedField_of_mem_nthPowerSubgroup + (K := K) (L := L) vK hvK w n hmu a beta hbeta + obtain ⟨y, hy⟩ := + (MonoidHom.mem_range + (G := (v.adicCompletion K)ˣ)).mp ha + rw [powMonoidHom_apply] at hy + apply + (MonoidHom.mem_range + (G := Cˣ)).mpr + refine ⟨e.symm y, ?_⟩ + rw [powMonoidHom_apply] + apply e.injective + calc + e ((e.symm y) ^ (n : ℕ)) = + (e (e.symm y)) ^ (n : ℕ) := + map_pow e (e.symm y) (n : ℕ) + _ = y ^ (n : ℕ) := by + rw [e.apply_symm_apply] + _ = + Units.map + (algebraMap K + (v.adicCompletion K)).toMonoidHom a := hy + _ = e aC := (he_base a).symm + · intro hfixed + have hcomap : + (beta : L) ∈ + ((algebraMap C E).fieldRange).comap toE := by + rw [ + localizedCompletion_baseField_comap_eq_fixedField_decompositionGroup + vK hvK w] + simpa [vK, w] using hfixed + change + toE (beta : L) ∈ Set.range (algebraMap C E) + at hcomap + obtain ⟨y, hy⟩ := hcomap + have hy_ne : y ≠ 0 := by + intro hy_zero + have hbeta_zero : (beta : L) = 0 := by + apply toE.injective + calc + toE (beta : L) = + algebraMap C E y := hy.symm + _ = 0 := by rw [hy_zero, map_zero] + _ = toE 0 := (map_zero toE).symm + exact beta.ne_zero hbeta_zero + let yC : Cˣ := Units.mk0 y hy_ne + have hyC : yC ^ (n : ℕ) = aC := by + apply Units.ext + apply (algebraMap C E).injective + change + algebraMap C E (y ^ (n : ℕ)) = + algebraMap C E (algebraMap K C (a : K)) + calc + algebraMap C E (y ^ (n : ℕ)) = + (algebraMap C E y) ^ (n : ℕ) := by + exact + map_pow (algebraMap C E) y (n : ℕ) + _ = toE (beta : L) ^ (n : ℕ) := by + rw [hy] + _ = toE ((beta : L) ^ (n : ℕ)) := by + exact + (map_pow toE (beta : L) (n : ℕ)).symm + _ = toE (algebraMap K L (a : K)) := by + rw [hbeta_val] + _ = algebraMap C E (algebraMap K C (a : K)) := + AbsoluteValue.toAlgebraicLocalization_algebraMap + vK w.1 w.2 (a : K) + apply + (MonoidHom.mem_range + (G := (v.adicCompletion K)ˣ)).mpr + refine ⟨e yC, ?_⟩ + rw [powMonoidHom_apply] + calc + (e yC) ^ (n : ℕ) = + e (yC ^ (n : ℕ)) := by + exact + (map_pow e yC (n : ℕ)).symm + _ = e aC := by rw [hyC] + _ = + Units.map + (algebraMap K + (v.adicCompletion K)).toMonoidHom a := + he_base a + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitKummerUnramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitKummerUnramified.lean new file mode 100644 index 0000000000..1259f4e5cd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitKummerUnramified.lean @@ -0,0 +1,539 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SimpleExtensionLocalBehavior +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.CompositumUnramified +/-! +# Unramifiedness of the full `S`-unit Kummer extension + +This file supplies the ramification input in the existence proof for the +global norm topology. Every defining root of + +`K(√[n]{Kˢ}) / K` + +is first rescaled to the root of an actual `S`-unit. Its simple +intermediate field is then identified with the chosen simple Kummer +extension attached to that unit. The finite set of such simple fields +generating the full extension is used to kill the full inertia group away +from `S`. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open HilbertRamification.Dedekind + +noncomputable +section + +namespace KummerTheory + +variable {K : Type} [Field K] [NumberField K] + +omit [NumberField K] in +open scoped Classical in +/-- Adjoining an element internally to an intermediate field gives the +same extension as adjoining its ambient value. -/ +noncomputable def adjoinSubtypeEquivAmbientAdjoin + {Omega : Type} [Field Omega] [Algebra K Omega] + (E : IntermediateField K Omega) (x : E) : + IntermediateField.adjoin K {x} ≃ₐ[K] + IntermediateField.adjoin K {(x : Omega)} := by + exact + (IntermediateField.equivMap + (IntermediateField.adjoin K {x}) E.val).trans + (IntermediateField.equivOfEq + (by + rw [IntermediateField.adjoin_map, + Set.image_singleton] + rfl)) + +omit [NumberField K] in +open scoped Classical in +/-- Equality of singleton adjoins in an ambient field descends to equality +of the corresponding singleton adjoins inside an intermediate field. -/ +theorem adjoin_subtype_eq_of_adjoin_ambient_eq + {Omega : Type} [Field Omega] [Algebra K Omega] + (E : IntermediateField K Omega) (x y : E) + (h : + IntermediateField.adjoin K {(x : Omega)} = + IntermediateField.adjoin K {(y : Omega)}) : + IntermediateField.adjoin K {x} = + IntermediateField.adjoin K {y} := by + apply IntermediateField.map_injective E.val + calc + (IntermediateField.adjoin K {x}).map E.val = + IntermediateField.adjoin K {E.val x} := by + rw [IntermediateField.adjoin_map, Set.image_singleton] + _ = IntermediateField.adjoin K {E.val y} := h + _ = (IntermediateField.adjoin K {y}).map E.val := by + rw [IntermediateField.adjoin_map, Set.image_singleton] + +omit [NumberField K] in +open scoped Classical in +/-- An arbitrary nonzero root of `X ^ n - b` in the separable closure +generates the same intermediate field as the chosen simple Kummer root, +provided that the base field contains the `n`-th roots of unity. -/ +theorem adjoin_rootUnit_eq_chosenSimpleKummerExtension + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (b : Kˣ) (alpha : (SeparableClosure K)ˣ) + (halpha : + alpha ^ (n : ℕ) = + Units.map + (algebraMap K (SeparableClosure K)).toMonoidHom b) : + IntermediateField.adjoin K + {(alpha : SeparableClosure K)} = + chosenSimpleKummerExtension K n hn b := by + let E := chosenSimpleKummerExtension K n hn b + have hbE : + b ∈ + finiteKummerRadicalSubgroup + (K := K) (L := E) n := by + exact + ⟨chosenSimpleKummerRootUnit K n hn b, + chosenSimpleKummerRootUnit_pow K n hn b⟩ + have halphaRoot : + (alpha : SeparableClosure K) ∈ + kummerRootSet + (K := K) (Omega := SeparableClosure K) n + (finiteKummerRadicalSubgroup + (K := K) (L := E) n) := by + refine ⟨⟨b, hbE⟩, ?_⟩ + simpa using congrArg Units.val halpha + have halphaE : (alpha : SeparableClosure K) ∈ E := + kummerRootSet_finiteKummerRadicalSubgroup_le + E n hmu halphaRoot + let R := + IntermediateField.adjoin K + {(alpha : SeparableClosure K)} + let alphaR : Rˣ := + Units.mk0 + ⟨(alpha : SeparableClosure K), + IntermediateField.subset_adjoin K + {(alpha : SeparableClosure K)} + (Set.mem_singleton (alpha : SeparableClosure K))⟩ + (by + intro hzero + apply alpha.ne_zero + exact congrArg Subtype.val hzero) + have hbR : + b ∈ + finiteKummerRadicalSubgroup + (K := K) (L := R) n := by + refine ⟨alphaR, ?_⟩ + apply Units.ext + apply Subtype.ext + simpa [alphaR] using congrArg Units.val halpha + have hchosenRoot : + chosenSimpleKummerRoot K n hn b ∈ + kummerRootSet + (K := K) (Omega := SeparableClosure K) n + (finiteKummerRadicalSubgroup + (K := K) (L := R) n) := by + exact + ⟨⟨b, hbR⟩, + chosenSimpleKummerRoot_pow K n hn b⟩ + have hchosenRootR : + chosenSimpleKummerRoot K n hn b ∈ R := + kummerRootSet_finiteKummerRadicalSubgroup_le + R n hmu hchosenRoot + apply le_antisymm + · apply IntermediateField.adjoin_le_iff.mpr + intro x hx + rw [Set.mem_singleton_iff] at hx + subst x + exact halphaE + · change + IntermediateField.adjoin K + {chosenSimpleKummerRoot K n hn b} ≤ R + apply IntermediateField.adjoin_le_iff.mpr + intro x hx + rw [Set.mem_singleton_iff] at hx + subst x + exact hchosenRootR + +open scoped Classical in +/-- Each defining root of the full `S`-unit Kummer extension generates +the chosen simple Kummer extension belonging to an actual `S`-unit. -/ +theorem exists_sUnit_chosenSimpleKummerExtension_eq_adjoin_of_mem_fullRootSet + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) + {beta : SeparableClosure K} + (hbeta : + beta ∈ + kummerRootSet + (K := K) (Omega := SeparableClosure K) n + (fullSUnitKummerSubgroup (K := K) n S).1) : + ∃ u : SUnitGroup (K := K) S, + IntermediateField.adjoin K {beta} = + chosenSimpleKummerExtension K n hn u.1 := by + obtain ⟨u, alpha, halpha, hadjoin⟩ := + exists_sUnitRoot_adjoin_eq_of_mem_fullSUnitKummerRootSet + (K := K) n S hbeta + refine ⟨u, ?_⟩ + calc + IntermediateField.adjoin K {beta} = + IntermediateField.adjoin K + {(alpha : SeparableClosure K)} := + hadjoin.symm + _ = chosenSimpleKummerExtension K n hn u.1 := + adjoin_rootUnit_eq_chosenSimpleKummerExtension + n hn hmu u.1 alpha halpha + +open scoped Classical in +/-- Internal source data for a defining root of the full `S`-unit Kummer +extension. Inside the simple field generated by the original root, this +produces an actual root of an `S`-unit which still generates the whole +simple field, together with its concrete simple-Kummer model. -/ +theorem exists_sUnitRootUnit_generating_internalAdjoin + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (beta : E) + (hbeta : + (beta : Omega) ∈ + kummerRootSet + (K := K) (Omega := Omega) n + (fullSUnitKummerSubgroup (K := K) n S).1) : + let B := IntermediateField.adjoin K {beta} + ∃ (u : SUnitGroup (K := K) S) (alpha : Bˣ) + (_ : B ≃ₐ[K] chosenSimpleKummerExtension K n hn u.1), + alpha ^ (n : ℕ) = + Units.map (algebraMap K B).toMonoidHom u.1 ∧ + IntermediateField.adjoin K {(alpha : B)} = ⊤ := by + classical + dsimp only + let B := IntermediateField.adjoin K {beta} + obtain ⟨u, alphaOmega, halphaOmega, hadjoinOmega⟩ := + exists_sUnitRoot_adjoin_eq_of_mem_fullSUnitKummerRootSet + (K := K) n S hbeta + have hbetaAdjoinE : + IntermediateField.adjoin K {(beta : Omega)} ≤ E := by + apply IntermediateField.adjoin_le_iff.mpr + intro x hx + rw [Set.mem_singleton_iff] at hx + subst x + exact beta.property + have halphaOmegaMem : + (alphaOmega : Omega) ∈ + IntermediateField.adjoin K {(beta : Omega)} := by + rw [← hadjoinOmega] + exact + IntermediateField.subset_adjoin K + {(alphaOmega : Omega)} + (Set.mem_singleton (alphaOmega : Omega)) + let alphaE : Eˣ := + Units.mk0 + ⟨(alphaOmega : Omega), + hbetaAdjoinE halphaOmegaMem⟩ + (by + intro hzero + apply alphaOmega.ne_zero + exact congrArg Subtype.val hzero) + have hadjoinE : + IntermediateField.adjoin K {(alphaE : E)} = B := by + exact + adjoin_subtype_eq_of_adjoin_ambient_eq + E (alphaE : E) beta hadjoinOmega + let alphaB : Bˣ := + Units.mk0 + ⟨(alphaE : E), by + rw [← hadjoinE] + exact + IntermediateField.subset_adjoin K + {(alphaE : E)} + (Set.mem_singleton (alphaE : E))⟩ + (by + intro hzero + apply alphaE.ne_zero + exact congrArg Subtype.val hzero) + have halphaOmegaVal := + congrArg Units.val halphaOmega + simp only [Units.val_pow_eq_pow_val, + Units.coe_map] at halphaOmegaVal + have halphaB : + alphaB ^ (n : ℕ) = + Units.map (algebraMap K B).toMonoidHom u.1 := by + apply Units.ext + apply Subtype.ext + apply Subtype.ext + simpa [alphaB, alphaE] using halphaOmegaVal + have hgenerate : + IntermediateField.adjoin K {(alphaB : B)} = ⊤ := by + apply IntermediateField.map_injective B.val + calc + (IntermediateField.adjoin K {(alphaB : B)}).map B.val = + IntermediateField.adjoin K + {B.val (alphaB : B)} := by + rw [IntermediateField.adjoin_map, + Set.image_singleton] + _ = IntermediateField.adjoin K {(alphaE : E)} := by + rfl + _ = B := hadjoinE + _ = B.val.fieldRange := + (IntermediateField.fieldRange_val B).symm + _ = (⊤ : IntermediateField K B).map B.val := + (AlgHom.fieldRange_eq_map B.val) + let eOmega : Omega ≃ₐ[K] SeparableClosure K := + IsSepClosure.equiv K Omega (SeparableClosure K) + let alphaSep : (SeparableClosure K)ˣ := + Units.map eOmega.toMonoidHom alphaOmega + have halphaSep : + alphaSep ^ (n : ℕ) = + Units.map + (algebraMap K (SeparableClosure K)).toMonoidHom u.1 := by + apply Units.ext + simp only [Units.val_pow_eq_pow_val, + alphaSep, Units.coe_map] + rw [← map_pow, halphaOmegaVal] + exact eOmega.commutes (u.1 : K) + have hmap : + (IntermediateField.adjoin K + {(alphaOmega : Omega)}).map eOmega.toAlgHom = + IntermediateField.adjoin K + {(alphaSep : SeparableClosure K)} := by + rw [IntermediateField.adjoin_map, Set.image_singleton] + rfl + have hsimple : + IntermediateField.adjoin K + {(alphaSep : SeparableClosure K)} = + chosenSimpleKummerExtension K n hn u.1 := + adjoin_rootUnit_eq_chosenSimpleKummerExtension + n hn hmu u.1 alphaSep halphaSep + let eAmbient : + B ≃ₐ[K] + IntermediateField.adjoin K {(beta : Omega)} := + adjoinSubtypeEquivAmbientAdjoin E beta + let eSimple : B ≃ₐ[K] chosenSimpleKummerExtension K n hn u.1 := + eAmbient.trans + ((IntermediateField.equivOfEq hadjoinOmega.symm).trans + ((IntermediateField.equivMap + (IntermediateField.adjoin K {(alphaOmega : Omega)}) + eOmega.toAlgHom).trans + ((IntermediateField.equivOfEq hmap).trans + (IntermediateField.equivOfEq hsimple)))) + exact ⟨u, alphaB, eSimple, halphaB, hgenerate⟩ + +open scoped Classical in +/-- The simple intermediate field generated by any defining root of the +full `S`-unit Kummer extension is Galois over the base field. The proof +rescales the defining root to an actual `S`-unit root and transports the +concrete simple-Kummer Galois structure across the resulting algebra +equivalence. -/ +theorem fullSUnitKummerRoot_internalAdjoin_isGalois + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (beta : E) + (hbeta : + (beta : Omega) ∈ + kummerRootSet + (K := K) (Omega := Omega) n + (fullSUnitKummerSubgroup (K := K) n S).1) : + IsGalois K (IntermediateField.adjoin K {beta}) := by + obtain ⟨u, _, eSimple, _, _⟩ := + exists_sUnitRootUnit_generating_internalAdjoin + (K := K) E n hn hmu S beta hbeta + let L := chosenSimpleKummerExtension K n hn u.1 + let : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hn u.1 + let : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hn hmu u.1 + exact IsGalois.of_algEquiv eSimple.symm + +open scoped Classical in +/-- Away from `S`, and away from the residue characteristics dividing the +exponent, the full `S`-unit Kummer extension is unramified at the chosen +finite completion. This is proved on the actual full extension: a finite +set of defining roots generates it, every associated simple field is +unramified by the derivative criterion, and restriction kills the full +inertia group. -/ +theorem + fullSUnitKummerExtension_chosenFinitePlaceIsUnramified_of_not_mem + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (v : HeightOneSpectrum (𝓞 K)) + (hvS : v ∉ S) + (hnv : v.valuation K ((n : ℕ) : K) = 1) : + let E := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S + letI : FiniteDimensional K E := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hn hmu S + letI : IsGalois K E := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S + letI : NumberField E := + NumberField.of_module_finite K E + ChosenFinitePlaceIsUnramified + (K := K) (L := E) v := by + classical + dsimp only + let E := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S + let : FiniteDimensional K E := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hn hmu S + let : IsGalois K E := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S + let : NumberField E := + NumberField.of_module_finite K E + let w := chosenFinitePlaceExtension (L := E) v + let Q := + finitePlaceExtensionCentre + (K := K) (L := E) v w + obtain ⟨T, hTroot, hTgenerate⟩ := + exists_finset_fullSUnitKummerExtensionRoots_adjoin_eq_top + (K := K) (Omega := Omega) n hn hmu S + have hnormal : + ∀ x : E, x ∈ T → + Normal K (IntermediateField.adjoin K {x}) := by + intro x hx + let B := IntermediateField.adjoin K {x} + let : IsGalois K B := + fullSUnitKummerRoot_internalAdjoin_isGalois + (K := K) E n hn hmu S x (hTroot x hx) + exact inferInstance + have hsimpleInertia : + ∀ (x : E) (hx : x ∈ T), + inertiaGroup + (Q.asIdeal.under + (𝓞 (IntermediateField.adjoin K {x}))) + Gal((IntermediateField.adjoin K {x})/K) = + ⊥ := by + intro x hx + let B := IntermediateField.adjoin K {x} + let : IsGalois K B := + fullSUnitKummerRoot_internalAdjoin_isGalois + (K := K) E n hn hmu S x (hTroot x hx) + let : NumberField B := + NumberField.of_module_finite K B + obtain ⟨u, alpha, _, halpha, hgenerate⟩ := + exists_sUnitRootUnit_generating_internalAdjoin + (K := K) E n hn hmu S x (hTroot x hx) + have huvaluation : + v.valuation K (u.1 : K) = 1 := + (mem_SUnitGroup_iff (K := K) S u.1).mp + u.2 v hvS + have hunramifiedB : + ChosenFinitePlaceIsUnramified + (K := K) (L := B) v := + kummerGeneratedExtension_chosenFinitePlaceIsUnramified_of_valuation_eq_one + (K := K) n u.1 alpha halpha hgenerate + v huvaluation hnv + let P : HeightOneSpectrum (𝓞 B) := + finitePlaceBelow (K := B) Q + have hPbelow : + finitePlaceBelow (K := K) P = v := by + calc + finitePlaceBelow (K := K) P = + finitePlaceBelow (K := K) Q := by + exact + finitePlaceBelow_finitePlaceBelow + (K := K) (M := B) (L := E) Q + _ = v := + finitePlaceBelow_finitePlaceExtensionCentre + (K := K) (L := E) v w + have hunramifiedP : + Algebra.IsUnramifiedAt (𝓞 K) P.asIdeal := + isUnramifiedAt_at_finitePlaceAbove_of_chosenFinitePlaceIsUnramified + (K := K) (L := B) v P hPbelow hunramifiedB + have hIP : + inertiaGroup P.asIdeal Gal(B/K) = ⊥ := + inertiaGroup_eq_bot_of_isUnramifiedAt + (K := K) (M := B) P.asIdeal hunramifiedP + simpa only [P, finitePlaceBelow_asIdeal] using hIP + have hIQ : + inertiaGroup Q.asIdeal Gal(E/K) = ⊥ := + inertiaGroup_eq_bot_of_finset_adjoin_eq_top + (K := K) (M := E) T Q.asIdeal + hnormal hsimpleInertia hTgenerate + have hunramifiedQ : + Algebra.IsUnramifiedAt (𝓞 K) Q.asIdeal := + isUnramifiedAt_of_inertiaGroup_eq_bot + (K := K) (M := E) Q.asIdeal hIQ + exact + chosenFinitePlaceIsUnramified_of_isUnramifiedAt + (K := K) (L := E) v + (by simpa only [Q] using hunramifiedQ) + +open scoped Classical in +/-- Every finite prime of the full `S`-unit Kummer extension above a +place outside `S` is unramified, provided the exponent is a unit at the +base place. This is the ideal-theoretic form of the preceding chosen +completion theorem. -/ +theorem + fullSUnitKummerExtension_isUnramifiedAt_of_below_not_mem + {Omega : Type} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + let E := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S + letI : FiniteDimensional K E := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hn hmu S + letI : IsGalois K E := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S + letI : NumberField E := + NumberField.of_module_finite K E + ∀ P : HeightOneSpectrum (𝓞 E), + finitePlaceBelow (K := K) P ∉ S → + (finitePlaceBelow (K := K) P).valuation K + ((n : ℕ) : K) = + 1 → + Algebra.IsUnramifiedAt (𝓞 K) P.asIdeal := by + dsimp only + let E := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S + let _ : FiniteDimensional K E := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hn hmu S + let _ : IsGalois K E := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S + let _ : NumberField E := + NumberField.of_module_finite K E + intro P hPS hnP + let v := finitePlaceBelow (K := K) P + have hunramified : + ChosenFinitePlaceIsUnramified + (K := K) (L := E) v := by + simpa only [E, v] using + fullSUnitKummerExtension_chosenFinitePlaceIsUnramified_of_not_mem + (K := K) (Omega := Omega) n hn hmu S v hPS hnP + exact + isUnramifiedAt_at_finitePlaceAbove_of_chosenFinitePlaceIsUnramified + (K := K) (L := E) v P rfl hunramified + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation.lean new file mode 100644 index 0000000000..099c5bb3be --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.EnlargedSUnitRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FiniteRadicalSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FullSUnitKummerExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitLocalPowerKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitPowerQuotient + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/All.lean new file mode 100644 index 0000000000..68e3acbc45 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/All.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.EnlargedSUnitRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FiniteRadicalSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FullSUnitKummerExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitLocalPowerKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitPowerQuotient + +/-! # All -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/Core.lean new file mode 100644 index 0000000000..43a58f35d4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/Core.lean @@ -0,0 +1,316 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.EnlargedSUnitRestriction +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SUnitPreparation.PrimePowerKernelCoordinates +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitPowerQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FullSUnitKummerExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitLocalPowerKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FiniteRadicalSupport +/-! +# Rank and kernel coordinates for S-unit preparation + +The endpoint of the S-unit preparation construction: the rank bound, the exact + restriction-kernel cardinality, and prime-power coordinates. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative NNReal ValuativeRel +open NumberField IsDedekindDomain +open LocalFieldTheory + +noncomputable +section + +namespace KummerTheory + +variable {K : Type*} [Field K] + [numberFieldK : NumberField K] + +open scoped Classical in +/-- The cardinal comparison in the finite S-unit preparation argument: if +`Gal(E/K) ≃ (Z/nZ)^r`, then `r ≤ s` for the source-produced enlarged +set of places. -/ +theorem galoisRank_le_totalPlaceCard_enlargedS + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) (hn : 1 < (n : ℕ)) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + r ≤ + totalPlaceCard (K := K) + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S) := by + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + have hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let : IsGalois K N := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S' + let : Finite Gal(N/K) := + finite_fullSUnitKummerExtension_galois + (K := K) (Omega := Omega) n hnK hmu S' + have hcardE : + Nat.card Gal(E/K) = (n : ℕ) ^ r := by + rw [Nat.card_congr eG.toEquiv, Nat.card_pi] + simp + have hcardN : + Nat.card Gal(N/K) = + (n : ℕ) ^ totalPlaceCard (K := K) S' := + card_fullSUnitKummerExtension_galois + (K := K) (Omega := Omega) n hnK hmu S' + have hexponentE : + ∀ sigma : Gal(E/K), sigma ^ (n : ℕ) = 1 := + galois_pow_eq_one_of_equiv_pi_zmod E n r eG + have hcardLe : + Nat.card Gal(E/K) ≤ Nat.card Gal(N/K) := + Nat.card_le_card_of_surjective + (enlargedSUnitKummerRestrictionHom + (K := K) (Omega := Omega) E n hmu + hexponentE S) + (enlargedSUnitKummerRestrictionHom_surjective + (K := K) (Omega := Omega) E n hmu + hexponentE S) + rw [hcardE, hcardN] at hcardLe + exact (Nat.pow_le_pow_iff_right hn).mp hcardLe + +open scoped Classical in +/-- The restriction kernel in the finite S-unit preparation argument has the expected +cardinality `n ^ (s - r)`. Both fields and the restriction map are the +concrete objects constructed above. -/ +theorem card_enlargedSUnitKummerRestrictionHom_ker + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) (hn : 1 < (n : ℕ)) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Nat.card + (enlargedSUnitKummerRestrictionHom + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod E n r eG) + S).ker = + (n : ℕ) ^ + (totalPlaceCard (K := K) + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S) - r) := by + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + have hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let : IsGalois K N := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S' + let : Finite Gal(N/K) := + finite_fullSUnitKummerExtension_galois + (K := K) (Omega := Omega) n hnK hmu S' + have hexponentE : + ∀ sigma : Gal(E/K), sigma ^ (n : ℕ) = 1 := + galois_pow_eq_one_of_equiv_pi_zmod E n r eG + let f : Gal(N/K) →* Gal(E/K) := + enlargedSUnitKummerRestrictionHom + (K := K) (Omega := Omega) E n hmu hexponentE S + have hf : + Function.Surjective f := + enlargedSUnitKummerRestrictionHom_surjective + (K := K) (Omega := Omega) E n hmu hexponentE S + have hcardE : + Nat.card Gal(E/K) = (n : ℕ) ^ r := by + rw [Nat.card_congr eG.toEquiv, Nat.card_pi] + simp + have hcardN : + Nat.card Gal(N/K) = + (n : ℕ) ^ totalPlaceCard (K := K) S' := + card_fullSUnitKummerExtension_galois + (K := K) (Omega := Omega) n hnK hmu S' + have hquotient : + Nat.card (Gal(N/K) ⧸ f.ker) = + Nat.card Gal(E/K) := + Nat.card_congr + (QuotientGroup.quotientKerEquivOfSurjective + f hf).toEquiv + have hfactor : + (n : ℕ) ^ totalPlaceCard (K := K) S' = + (n : ℕ) ^ r * Nat.card f.ker := by + rw [← hcardN, ← hcardE, ← hquotient] + exact + Subgroup.card_eq_card_quotient_mul_card_subgroup + f.ker + have hr : + r ≤ totalPlaceCard (K := K) S' := + galoisRank_le_totalPlaceCard_enlargedS + (K := K) (Omega := Omega) E n hn hmu r eG S + have hsplit : + (n : ℕ) ^ totalPlaceCard (K := K) S' = + (n : ℕ) ^ r * + (n : ℕ) ^ + (totalPlaceCard (K := K) S' - r) := by + rw [← pow_add, Nat.add_sub_of_le hr] + have hcancel : + (n : ℕ) ^ r * Nat.card f.ker = + (n : ℕ) ^ r * + (n : ℕ) ^ + (totalPlaceCard (K := K) S' - r) := + hfactor.symm.trans hsplit + exact Nat.eq_of_mul_eq_mul_left + (pow_pos n.pos r) hcancel + +open scoped Classical in +/-- In the prime-power case, the actual relative Galois group +`Gal(N/E)` is a free `ZMod n`-module of rank `s - r`. This is the +concrete basis source used to choose the fields `N_i` in the finite S-unit preparation argument. -/ +theorem + exists_enlargedSUnitKummerRestrictionKernelEquivPiZMod + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Nonempty + ((enlargedSUnitKummerRestrictionHom + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod E n r eG) + S).ker ≃* + (Fin + (totalPlaceCard (K := K) + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S) - r) → + Multiplicative (ZMod (n : ℕ)))) := by + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + let G := Gal(N/K) + let H := Gal(E/K) + have hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + have hnOne : 1 < (n : ℕ) := by + rw [hn] + calc + 1 < p := hp.one_lt + _ = p ^ 1 := (pow_one p).symm + _ ≤ p ^ v := + Nat.pow_le_pow_right hp.pos + (Nat.succ_le_iff.mpr hv) + have hexponentE : + ∀ sigma : H, sigma ^ (n : ℕ) = 1 := + galois_pow_eq_one_of_equiv_pi_zmod E n r eG + let : IsGalois K N := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S' + let : Finite G := + finite_fullSUnitKummerExtension_galois + (K := K) (Omega := Omega) n hnK hmu S' + let : IsMulCommutative G := + KummerTheory.kummerRadicalExtension_isMulCommutative + n hmu (fullSUnitKummerSubgroup (K := K) n S').1 + let : Module (ZMod (n : ℕ)) (Additive G) := + additiveZModModuleOfPowEqOne (n : ℕ) + (fullSUnitKummerExtension_galois_pow_eq_one + (K := K) (Omega := Omega) n hmu S') + let : Module (ZMod (n : ℕ)) (Additive H) := + additiveZModModuleOfPowEqOne (n : ℕ) hexponentE + have hfreeG : Module.Free (ZMod (n : ℕ)) (Additive G) := + fullSUnitKummerExtension_galois_moduleFree + (K := K) (Omega := Omega) n hnK hmu S' + let eH : + Additive H ≃ₗ[ZMod (n : ℕ)] + (Fin r → ZMod (n : ℕ)) := + additivePiLinearEquiv (n : ℕ) eG + have hfreeH : Module.Free (ZMod (n : ℕ)) (Additive H) := + Module.Free.of_equiv eH.symm + let f : G →* H := + enlargedSUnitKummerRestrictionHom + (K := K) (Omega := Omega) E n hmu + hexponentE S + have hf : Function.Surjective f := + enlargedSUnitKummerRestrictionHom_surjective + (K := K) (Omega := Omega) E n hmu + hexponentE S + have hcard : + Nat.card f.ker = + (n : ℕ) ^ + (totalPlaceCard (K := K) S' - r) := + card_enlargedSUnitKummerRestrictionHom_ker + (K := K) (Omega := Omega) E n hnOne + hmu r eG S + exact + exists_kernelMulEquiv_pi_zmod_of_primePower + (G := G) (H := H) + (n : ℕ) p v + (totalPlaceCard (K := K) S' - r) + hp hv hn hfreeG hfreeH f hf hcard + +open scoped Classical in +/-- A chosen coordinate equivalence for the actual relative Galois +group in the finite S-unit preparation argument. -/ +noncomputable def + chosenEnlargedSUnitKummerRestrictionKernelEquivPiZMod + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) + (hn : (n : ℕ) = p ^ v) + (r : ℕ) + (eG : + Gal(E/K) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + (enlargedSUnitKummerRestrictionHom + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod E n r eG) + S).ker ≃* + (Fin + (totalPlaceCard (K := K) + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S) - r) → + Multiplicative (ZMod (n : ℕ))) := + Classical.choice + (exists_enlargedSUnitKummerRestrictionKernelEquivPiZMod + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S) + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/EnlargedSUnitRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/EnlargedSUnitRestriction.lean new file mode 100644 index 0000000000..b5ce9742c4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/EnlargedSUnitRestriction.lean @@ -0,0 +1,636 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FullSUnitKummerExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FiniteRadicalSupport +/-! +# Restriction from an enlarged S-unit Kummer extension + +The concrete embedding and Galois restriction map, its fixing subgroup, and the cyclic fixed + fields attached to kernel elements. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative NNReal ValuativeRel +open NumberField IsDedekindDomain +open LocalFieldTheory + +noncomputable +section + +namespace KummerTheory + +variable {K : Type*} [Field K] + [numberFieldK : NumberField K] + +open scoped Classical in +/-- The actual field containment `L ≤ N` for finite S-unit preparation, after producing +the required finite enlargement of `S`. -/ +theorem le_fullSUnitKummerExtension_of_enlargedS + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ sigma : Gal(E/K), sigma ^ (n : ℕ) = 1) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + E ≤ + fullSUnitKummerExtension + (K := K) (Omega := Omega) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S) := by + have hgenerate := + kummerRadicalExtension_enlargedSUnitKummerSubgroup_eq + (K := K) (Omega := Omega) E n hmu hexponent S + have hmono := kummerRadicalExtension_mono + (K := K) (Omega := Omega) n + (sUnitKummerSubgroup_le_fullSUnitKummerSubgroup + (K := K) (L := E) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S)) + intro x hx + apply hmono + rw [hgenerate] + exact hx + +open scoped Classical in +/-- The actual inclusion algebra `E → N` supplied by the source-produced +containment above. -/ +@[reducible] +noncomputable def enlargedSUnitKummerAlgebra + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ sigma : Gal(E/K), sigma ^ (n : ℕ) = 1) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Algebra E + (fullSUnitKummerExtension + (K := K) (Omega := Omega) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S)) := + (IntermediateField.inclusion + (le_fullSUnitKummerExtension_of_enlargedS + (K := K) (Omega := Omega) E n hmu hexponent S)).toAlgebra + +open scoped Classical in +/-- Restriction from the full `S`-unit Kummer extension `N` to the actual +extension `E ≤ N` produced above. -/ +noncomputable def enlargedSUnitKummerRestrictionHom + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ sigma : Gal(E/K), sigma ^ (n : ℕ) = 1) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Gal(fullSUnitKummerExtension + (K := K) (Omega := Omega) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S)/K) →* + Gal(E/K) := by + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S) + let : Algebra E N := + enlargedSUnitKummerAlgebra + (K := K) (Omega := Omega) E n hmu hexponent S + letI : IsScalarTower K E N := by infer_instance + exact + AlgEquiv.restrictNormalHom + (F := K) (K₁ := N) (E := E) + +open scoped Classical in +/-- The restriction map `Gal(N/K) → Gal(E/K)` is onto. -/ +theorem enlargedSUnitKummerRestrictionHom_surjective + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ sigma : Gal(E/K), sigma ^ (n : ℕ) = 1) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Function.Surjective + (enlargedSUnitKummerRestrictionHom + (K := K) (Omega := Omega) E n hmu hexponent S) := by + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S) + let _ : Algebra E N := + enlargedSUnitKummerAlgebra + (K := K) (Omega := Omega) E n hmu hexponent S + let : IsScalarTower K E N := by infer_instance + let : IsGalois K N := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S) + simpa [enlargedSUnitKummerRestrictionHom, N] using + (AlgEquiv.restrictNormalHom_surjective + (F := K) (K₁ := E) (E := N)) + +open scoped Classical in +/-- The actual embedded copy of `E` inside the full `S`-unit Kummer +extension `N`. -/ +noncomputable def enlargedSUnitKummerEmbeddedExtension + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ sigma : Gal(E/K), sigma ^ (n : ℕ) = 1) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + IntermediateField K + (fullSUnitKummerExtension + (K := K) (Omega := Omega) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S)) := by + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S) + let : Algebra E N := + enlargedSUnitKummerAlgebra + (K := K) (Omega := Omega) E n hmu hexponent S + let : IsScalarTower K E N := by infer_instance + exact (IsScalarTower.toAlgHom K E N).fieldRange + +open scoped Classical in +/-- The kernel of restriction is precisely the subgroup fixing the +concrete embedded copy of `E` in `N`. -/ +theorem enlargedSUnitKummerRestrictionHom_ker_eq_fixingSubgroup + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ sigma : Gal(E/K), sigma ^ (n : ℕ) = 1) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + (enlargedSUnitKummerRestrictionHom + (K := K) (Omega := Omega) E n hmu hexponent S).ker = + (enlargedSUnitKummerEmbeddedExtension + (K := K) (Omega := Omega) E n hmu + hexponent S).fixingSubgroup := by + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + let _ : Algebra E N := + enlargedSUnitKummerAlgebra + (K := K) (Omega := Omega) E n hmu hexponent S + let _ : IsScalarTower K E N := by infer_instance + let M : IntermediateField K N := + (IsScalarTower.toAlgHom K E N).fieldRange + change + (AlgEquiv.restrictNormalHom + (F := K) (K₁ := N) (E := E)).ker = + M.fixingSubgroup + ext sigma + rw [MonoidHom.mem_ker, + IntermediateField.mem_fixingSubgroup_iff] + constructor + · intro hsigma y hy + rcases hy with ⟨x, rfl⟩ + have hx : + sigma.restrictNormal E x = x := by + change + (AlgEquiv.restrictNormalHom + (F := K) (K₁ := N) (E := E) sigma) x = + (1 : Gal(E/K)) x + rw [hsigma] + calc + sigma (algebraMap E N x) = + algebraMap E N (sigma.restrictNormal E x) := + (AlgEquiv.restrictNormal_commutes sigma E x).symm + _ = algebraMap E N x := + congrArg (algebraMap E N) hx + · intro hsigma + apply AlgEquiv.ext + intro x + apply (algebraMap E N).injective + change + algebraMap E N (sigma.restrictNormal E x) = + algebraMap E N x + exact + (AlgEquiv.restrictNormal_commutes sigma E x).trans + (hsigma (algebraMap E N x) ⟨x, rfl⟩) + +open scoped Classical in +/-- The field fixed by the concrete restriction kernel is exactly the +embedded copy of `E`. -/ +theorem fixedField_enlargedSUnitKummerRestrictionHom_ker + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ sigma : Gal(E/K), sigma ^ (n : ℕ) = 1) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + IntermediateField.fixedField + (enlargedSUnitKummerRestrictionHom + (K := K) (Omega := Omega) E n hmu + hexponent S).ker = + enlargedSUnitKummerEmbeddedExtension + (K := K) (Omega := Omega) E n hmu + hexponent S := by + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + have hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let : IsGalois K N := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S' + let : FiniteDimensional K N := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S' + rw [ + enlargedSUnitKummerRestrictionHom_ker_eq_fixingSubgroup + (K := K) (Omega := Omega) E n hmu + hexponent S] + exact + IsGalois.fixedField_fixingSubgroup + (enlargedSUnitKummerEmbeddedExtension + (K := K) (Omega := Omega) E n hmu + hexponent S) + +open scoped Classical in +/-- For an element `sigma` of the relative Galois subgroup +`Gal(N/E)`, this is the actual cyclic fixed field +`N_sigma = N ^ ⟨sigma⟩` used in the prime construction of the finite S-unit preparation argument. -/ +noncomputable def enlargedSUnitKummerCyclicFixedField + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ sigma : Gal(E/K), sigma ^ (n : ℕ) = 1) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (sigma : + (enlargedSUnitKummerRestrictionHom + (K := K) (Omega := Omega) E n hmu + hexponent S).ker) : + IntermediateField K + (fullSUnitKummerExtension + (K := K) (Omega := Omega) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S)) := + IntermediateField.fixedField + (Subgroup.zpowers + (sigma : + Gal(fullSUnitKummerExtension + (K := K) (Omega := Omega) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S)/K))) + +open scoped Classical in +/-- The embedded extension `E` lies in every cyclic fixed field attached +to an element of `Gal(N/E)`. -/ +theorem enlargedSUnitKummerEmbeddedExtension_le_cyclicFixedField + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ sigma : Gal(E/K), sigma ^ (n : ℕ) = 1) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (sigma : + (enlargedSUnitKummerRestrictionHom + (K := K) (Omega := Omega) E n hmu + hexponent S).ker) : + enlargedSUnitKummerEmbeddedExtension + (K := K) (Omega := Omega) E n hmu + hexponent S ≤ + enlargedSUnitKummerCyclicFixedField + (K := K) (Omega := Omega) E n hmu + hexponent S sigma := by + apply (IntermediateField.le_iff_le _ _).2 + rw [ + ← enlargedSUnitKummerRestrictionHom_ker_eq_fixingSubgroup + (K := K) (Omega := Omega) E n hmu + hexponent S] + exact Subgroup.zpowers_le.mpr sigma.2 + +open scoped Classical in +/-- The top Kummer field is Galois over each cyclic fixed field. -/ +theorem enlargedSUnitKummerCyclicFixedField_isGalois + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ sigma : Gal(E/K), sigma ^ (n : ℕ) = 1) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (sigma : + (enlargedSUnitKummerRestrictionHom + (K := K) (Omega := Omega) E n hmu + hexponent S).ker) : + IsGalois + (enlargedSUnitKummerCyclicFixedField + (K := K) (Omega := Omega) E n hmu + hexponent S sigma) + (fullSUnitKummerExtension + (K := K) (Omega := Omega) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S)) := by + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + have hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let : IsGalois K N := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S' + let : Finite Gal(N/K) := + finite_fullSUnitKummerExtension_galois + (K := K) (Omega := Omega) n hnK hmu S' + change + IsGalois + (IntermediateField.fixedField + (Subgroup.zpowers (sigma : Gal(N/K)))) N + exact IsGalois.of_fixed_field N _ + +open scoped Classical in +/-- The relative degree of `N/N_sigma` is the order of `sigma`. -/ +theorem enlargedSUnitKummerCyclicFixedField_finrank + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ sigma : Gal(E/K), sigma ^ (n : ℕ) = 1) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (sigma : + (enlargedSUnitKummerRestrictionHom + (K := K) (Omega := Omega) E n hmu + hexponent S).ker) : + Module.finrank + (enlargedSUnitKummerCyclicFixedField + (K := K) (Omega := Omega) E n hmu + hexponent S sigma) + (fullSUnitKummerExtension + (K := K) (Omega := Omega) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S)) = + orderOf + (sigma : + Gal(fullSUnitKummerExtension + (K := K) (Omega := Omega) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S)/K)) := by + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + have hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let : FiniteDimensional K N := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S' + change + Module.finrank + (IntermediateField.fixedField + (Subgroup.zpowers (sigma : Gal(N/K)))) N = + orderOf (sigma : Gal(N/K)) + rw [IntermediateField.finrank_fixedField_eq_card, + Nat.card_zpowers] + +open scoped Classical in +/-- The relative Galois group `Gal(N/N_sigma)` is cyclic. -/ +theorem enlargedSUnitKummerCyclicFixedField_isCyclic + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ sigma : Gal(E/K), sigma ^ (n : ℕ) = 1) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (sigma : + (enlargedSUnitKummerRestrictionHom + (K := K) (Omega := Omega) E n hmu + hexponent S).ker) : + IsCyclic + ((fullSUnitKummerExtension + (K := K) (Omega := Omega) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S)) ≃ₐ[enlargedSUnitKummerCyclicFixedField + (K := K) (Omega := Omega) E n hmu + hexponent S sigma] + (fullSUnitKummerExtension + (K := K) (Omega := Omega) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S))) := by + let S' := + enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S + let N := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S' + have hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + let : FiniteDimensional K N := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu S' + let P : Subgroup Gal(N/K) := + Subgroup.zpowers (sigma : Gal(N/K)) + have hP : IsCyclic P := + Subgroup.isCyclic_zpowers (sigma : Gal(N/K)) + exact + (IntermediateField.subgroupEquivAlgEquiv P).isCyclic.mp + hP + +open scoped Classical in +/-- The order of every relative automorphism divides the Kummer +exponent `n`. -/ +theorem orderOf_enlargedSUnitKummerRestrictionKernel_dvd + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ sigma : Gal(E/K), sigma ^ (n : ℕ) = 1) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (sigma : + (enlargedSUnitKummerRestrictionHom + (K := K) (Omega := Omega) E n hmu + hexponent S).ker) : + orderOf + (sigma : + Gal(fullSUnitKummerExtension + (K := K) (Omega := Omega) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S)/K)) ∣ + (n : ℕ) := + orderOf_dvd_of_pow_eq_one + (fullSUnitKummerExtension_galois_pow_eq_one + (K := K) (Omega := Omega) n hmu + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S) + (sigma : + Gal(fullSUnitKummerExtension + (K := K) (Omega := Omega) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S)/K))) + +open scoped Classical in +/-- If `n = p^v`, then the cyclic degree attached to every relative +automorphism is a power of `p`. -/ +theorem exists_orderOf_enlargedSUnitKummerRestrictionKernel_eq_prime_pow + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ sigma : Gal(E/K), sigma ^ (n : ℕ) = 1) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (p v : ℕ) (hp : p.Prime) + (hn : (n : ℕ) = p ^ v) + (sigma : + (enlargedSUnitKummerRestrictionHom + (K := K) (Omega := Omega) E n hmu + hexponent S).ker) : + ∃ k ≤ v, + orderOf + (sigma : + Gal(fullSUnitKummerExtension + (K := K) (Omega := Omega) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S)/K)) = + p ^ k := by + apply (Nat.dvd_prime_pow hp).1 + rw [← hn] + exact + orderOf_enlargedSUnitKummerRestrictionKernel_dvd + (K := K) (Omega := Omega) E n hmu + hexponent S sigma + +open scoped Classical in +/-- A nonidentity relative automorphism gives a genuinely nontrivial +cyclic subextension. -/ +theorem enlargedSUnitKummerCyclicFixedField_ne_top + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ sigma : Gal(E/K), sigma ^ (n : ℕ) = 1) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (sigma : + (enlargedSUnitKummerRestrictionHom + (K := K) (Omega := Omega) E n hmu + hexponent S).ker) + (hsigma : + (sigma : + Gal(fullSUnitKummerExtension + (K := K) (Omega := Omega) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S)/K)) ≠ 1) : + enlargedSUnitKummerCyclicFixedField + (K := K) (Omega := Omega) E n hmu + hexponent S sigma ≠ ⊤ := by + intro htop + have hdegree := + enlargedSUnitKummerCyclicFixedField_finrank + (K := K) (Omega := Omega) E n hmu + hexponent S sigma + rw [htop, IntermediateField.finrank_top] at hdegree + exact hsigma (orderOf_eq_one_iff.mp hdegree.symm) + +open scoped Classical in +/-- In the prime-power case, a nonidentity relative automorphism has +order `p^k` with positive exponent. -/ +theorem exists_pos_orderOf_enlargedSUnitKummerRestrictionKernel_eq_prime_pow + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ sigma : Gal(E/K), sigma ^ (n : ℕ) = 1) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (p v : ℕ) (hp : p.Prime) + (hn : (n : ℕ) = p ^ v) + (sigma : + (enlargedSUnitKummerRestrictionHom + (K := K) (Omega := Omega) E n hmu + hexponent S).ker) + (hsigma : + (sigma : + Gal(fullSUnitKummerExtension + (K := K) (Omega := Omega) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S)/K)) ≠ 1) : + ∃ k, 0 < k ∧ k ≤ v ∧ + orderOf + (sigma : + Gal(fullSUnitKummerExtension + (K := K) (Omega := Omega) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S)/K)) = + p ^ k := by + obtain ⟨k, hkv, horder⟩ := + exists_orderOf_enlargedSUnitKummerRestrictionKernel_eq_prime_pow + (K := K) (Omega := Omega) E n hmu + hexponent S p v hp hn sigma + have hk : 0 < k := by + apply Nat.pos_of_ne_zero + intro hkzero + apply hsigma + apply orderOf_eq_one_iff.mp + rw [horder, hkzero, pow_zero] + exact ⟨k, hk, hkv, horder⟩ + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FiniteRadicalSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FiniteRadicalSupport.lean new file mode 100644 index 0000000000..840520d8eb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FiniteRadicalSupport.lean @@ -0,0 +1,421 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitLocalPowerKernel +/-! +# Finite support for Kummer radicals + +A chosen finite enlargement of places containing representatives of every class in a finite + Kummer radical. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative NNReal ValuativeRel +open NumberField IsDedekindDomain +open LocalFieldTheory + +noncomputable +section + +namespace KummerTheory + +variable {K : Type*} [Field K] + [numberFieldK : NumberField K] + +open scoped Classical in +/-- The finite Kummer radical `D ∩ Kˢ`, where +`D = Lˣⁿ ∩ Kˣ`. -/ +def sUnitFiniteKummerRadical + {L : Type*} [Field L] [Algebra K L] + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Subgroup Kˣ := + SUnitGroup (K := K) S ⊓ + KummerTheory.finiteKummerRadicalSubgroup + (K := K) (L := L) n + +open scoped Classical in +/-- An `S`-unit belongs to the finite Kummer radical exactly when it has +an `n`-th root in `L`. -/ +@[simp] +theorem mem_sUnitFiniteKummerRadical_iff + {L : Type*} [Field L] [Algebra K L] + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (x : Kˣ) : + x ∈ sUnitFiniteKummerRadical (K := K) (L := L) n S ↔ + x ∈ SUnitGroup (K := K) S ∧ + ∃ beta : Lˣ, + beta ^ (n : ℕ) = + Units.map (algebraMap K L).toMonoidHom x := + Iff.rfl + +open scoped Classical in +/-- Adjoin the ambient `n`-th powers to `D ∩ Kˢ`, producing an admissible +object on the subgroup side of Kummer theory. -/ +def sUnitKummerSubgroup + {L : Type*} [Field L] [Algebra K L] + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + KummerTheory.KummerSubgroup K n := + ⟨sUnitFiniteKummerRadical (K := K) (L := L) n S ⊔ + KummerTheory.unitNthPowersSubgroup K n, + le_sup_right⟩ + +open scoped Classical in +/-- The `S`-unit Kummer subgroup lies in the actual radical of `L / K`. -/ +theorem sUnitKummerSubgroup_le_finiteKummerRadicalSubgroup + {L : Type*} [Field L] [Algebra K L] + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + (sUnitKummerSubgroup (K := K) (L := L) n S).1 ≤ + KummerTheory.finiteKummerRadicalSubgroup + (K := K) (L := L) n := by + apply sup_le + · exact inf_le_right + · intro x hx + obtain ⟨y, rfl⟩ := + (KummerTheory.mem_unitNthPowersSubgroup_iff n).mp hx + exact + (KummerTheory.mem_finiteKummerRadicalSubgroup_iff n).mpr + ⟨Units.map (algebraMap K L).toMonoidHom y, by simp⟩ + +open scoped Classical in +/-- Enlarging the finite set of places enlarges the `S`-unit group. -/ +theorem sUnitGroup_mono + {S T : Finset (HeightOneSpectrum (𝓞 K))} + (hST : S ⊆ T) : + SUnitGroup (K := K) S ≤ SUnitGroup (K := K) T := by + intro x hx + rw [mem_SUnitGroup_iff] at hx ⊢ + intro v hvT + exact hx v (fun hvS => hvT (hST hvS)) + +open scoped Classical in +/-- A chosen finite set of places outside which a given global unit is +an integral unit. -/ +noncomputable def chosenUnitFiniteSupport (x : Kˣ) : + Finset (HeightOneSpectrum (𝓞 K)) := + Classical.choose + (IdeleGroup.exists_finset_supportedAt + (IdeleGroup.principalIdele K x)) + +open scoped Classical in +/-- A global unit is an `S`-unit for its chosen finite support. -/ +theorem mem_sUnitGroup_chosenUnitFiniteSupport (x : Kˣ) : + x ∈ SUnitGroup (K := K) (chosenUnitFiniteSupport (K := K) x) := by + rw [mem_SUnitGroup_iff] + intro v hv + have hsupported := + Classical.choose_spec + (IdeleGroup.exists_finset_supportedAt + (IdeleGroup.principalIdele K x)) + have hunit := + (IdeleGroup.mem_supportedAt_iff + (K := K) + (chosenUnitFiniteSupport (K := K) x : Set _) + (IdeleGroup.principalIdele K x)).mp hsupported v + (by simpa using hv) + rw [ + HeightOneSpectrum.adicCompletionIntegers.mem_units_iff_valued_eq_one] + at hunit + change + Valued.v + (((IdeleGroup.finiteComponent v + (IdeleGroup.principalIdele K x) : + (v.adicCompletion K)ˣ) : + v.adicCompletion K)) = 1 at hunit + rw [IdeleGroup.finiteComponent_principalIdele, + HeightOneSpectrum.valuedAdicCompletion_eq_valuation'] at hunit + exact hunit + +omit numberFieldK in +open scoped Classical in +/-- The actual radical quotient of a finite Galois extension is finite. +This is obtained from the concrete finite Kummer character equivalence, +not supplied as a finiteness hypothesis. -/ +theorem finite_chosenFiniteKummerRadicalQuotient + {L : Type*} [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + Finite + ((KummerTheory.chosenFiniteKummerRadicalDatum + (K := K) (L := L) n).RadicalQuotient) := by + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + let D := + KummerTheory.chosenFiniteKummerRadicalDatum + (K := K) (L := L) n + let H := + Gal(L/K) →* KummerTheory.nthRootsSubgroup L (n : ℕ) + let : Finite H := + Finite.of_injective + (fun chi : H => + (chi : Gal(L/K) → + KummerTheory.nthRootsSubgroup L (n : ℕ))) + DFunLike.coe_injective + let hbase : + KummerTheory.NthRootsOfUnityInBase + (K := K) (L := L) n := + KummerTheory.nthRootsOfUnityInBase_of_primitiveRoots + (K := K) (L := L) n hmu + let e : D.RadicalQuotient ≃* H := + KummerTheory.finiteKummerCharacterEquiv n hbase + exact Finite.of_equiv H e.symm.toEquiv + +open scoped Classical in +/-- A chosen representative of a class in the actual finite Kummer +radical quotient. -/ +noncomputable def chosenFiniteKummerRadicalRepresentative + {L : Type*} [Field L] [Algebra K L] + (n : ℕ+) + (q : + (KummerTheory.chosenFiniteKummerRadicalDatum + (K := K) (L := L) n).RadicalQuotient) : + (KummerTheory.chosenFiniteKummerRadicalDatum + (K := K) (L := L) n).carrier := + Classical.choose + ((KummerTheory.chosenFiniteKummerRadicalDatum + (K := K) (L := L) n).radicalQuotientMk_surjective q) + +omit numberFieldK in +open scoped Classical in +/-- The chosen representative maps back to the prescribed radical class. -/ +@[simp] +theorem chosenFiniteKummerRadicalRepresentative_spec + {L : Type*} [Field L] [Algebra K L] + (n : ℕ+) + (q : + (KummerTheory.chosenFiniteKummerRadicalDatum + (K := K) (L := L) n).RadicalQuotient) : + (KummerTheory.chosenFiniteKummerRadicalDatum + (K := K) (L := L) n).radicalQuotientMk + (chosenFiniteKummerRadicalRepresentative + (K := K) (L := L) n q) = q := + Classical.choose_spec + ((KummerTheory.chosenFiniteKummerRadicalDatum + (K := K) (L := L) n).radicalQuotientMk_surjective q) + +open scoped Classical in +/-- The union of the supports of one representative of every actual +Kummer radical class. -/ +noncomputable def finiteKummerRadicalSupport + {L : Type*} [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + Finset (HeightOneSpectrum (𝓞 K)) := by + let D := + KummerTheory.chosenFiniteKummerRadicalDatum + (K := K) (L := L) n + letI : Finite D.RadicalQuotient := + finite_chosenFiniteKummerRadicalQuotient + (K := K) (L := L) n hmu + letI : Fintype D.RadicalQuotient := + Fintype.ofFinite D.RadicalQuotient + exact + Finset.univ.biUnion fun q => + chosenUnitFiniteSupport (K := K) + (chosenFiniteKummerRadicalRepresentative + (K := K) (L := L) n q).1 + +open scoped Classical in +/-- Enlarge any prescribed finite set by the finite supports needed to +represent all actual Kummer radical classes by `S`-units. -/ +noncomputable def enlargeByFiniteKummerRadicalSupport + {L : Type*} [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Finset (HeightOneSpectrum (𝓞 K)) := + S ∪ finiteKummerRadicalSupport + (K := K) (L := L) n hmu + +open scoped Classical in +/-- The radical-support enlargement contains its starting set. -/ +theorem subset_enlargeByFiniteKummerRadicalSupport + {L : Type*} [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + S ⊆ enlargeByFiniteKummerRadicalSupport + (K := K) (L := L) n hmu S := + Finset.subset_union_left + +open scoped Classical in +/-- Each chosen radical representative is an `S`-unit after the chosen +finite enlargement. -/ +theorem chosenFiniteKummerRadicalRepresentative_mem_enlargedSUnitGroup + {L : Type*} [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (q : + (KummerTheory.chosenFiniteKummerRadicalDatum + (K := K) (L := L) n).RadicalQuotient) : + (chosenFiniteKummerRadicalRepresentative + (K := K) (L := L) n q).1 ∈ + SUnitGroup (K := K) + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := L) n hmu S) := by + apply sUnitGroup_mono + (K := K) + (S := chosenUnitFiniteSupport (K := K) + (chosenFiniteKummerRadicalRepresentative + (K := K) (L := L) n q).1) + (T := enlargeByFiniteKummerRadicalSupport + (K := K) (L := L) n hmu S) + · intro v hv + apply Finset.mem_union_right + let D := + KummerTheory.chosenFiniteKummerRadicalDatum + (K := K) (L := L) n + let : Finite D.RadicalQuotient := + finite_chosenFiniteKummerRadicalQuotient + (K := K) (L := L) n hmu + let : Fintype D.RadicalQuotient := + Fintype.ofFinite D.RadicalQuotient + exact Finset.mem_biUnion.mpr + ⟨q, Finset.mem_univ q, hv⟩ + · exact mem_sUnitGroup_chosenUnitFiniteSupport + (K := K) + (chosenFiniteKummerRadicalRepresentative + (K := K) (L := L) n q).1 + +open scoped Classical in +/-- After the chosen finite enlargement, the actual radical of `L/K` +is generated by its `S`-unit part and the ambient `n`-th powers. -/ +theorem finiteKummerRadicalSubgroup_le_enlargedSUnitKummerSubgroup + {L : Type*} [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + KummerTheory.finiteKummerRadicalSubgroup + (K := K) (L := L) n ≤ + (sUnitKummerSubgroup + (K := K) (L := L) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := L) n hmu S)).1 := by + intro a ha + let D := + KummerTheory.chosenFiniteKummerRadicalDatum + (K := K) (L := L) n + let aD : D.carrier := ⟨a, ha⟩ + let q : D.RadicalQuotient := D.radicalQuotientMk aD + let bD : D.carrier := + chosenFiniteKummerRadicalRepresentative + (K := K) (L := L) n q + have hbclass : D.radicalQuotientMk bD = + D.radicalQuotientMk aD := by + exact chosenFiniteKummerRadicalRepresentative_spec + (K := K) (L := L) n q + have habpower : aD / bD ∈ D.ambientNthPowersSubgroup := by + exact (D.radicalQuotientMk_eq_iff aD bD).1 hbclass.symm + obtain ⟨z, hz⟩ := + (D.mem_ambientNthPowersSubgroup_iff).1 habpower + apply Subgroup.mem_sup.mpr + refine + ⟨bD.1, + ⟨chosenFiniteKummerRadicalRepresentative_mem_enlargedSUnitGroup + (K := K) (L := L) n hmu S q, + bD.2⟩, + z ^ (n : ℕ), + (KummerTheory.mem_unitNthPowersSubgroup_iff n).2 + ⟨z, rfl⟩, + ?_⟩ + change bD.1 * z ^ (n : ℕ) = aD.1 + rw [hz] + change bD.1 * (aD.1 / bD.1) = aD.1 + simp [div_eq_mul_inv, mul_comm, mul_left_comm] + +open scoped Classical in +/-- Exact radical identification after the chosen finite enlargement. -/ +theorem enlargedSUnitKummerSubgroup_eq_finiteKummerRadicalSubgroup + {L : Type*} [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + (sUnitKummerSubgroup + (K := K) (L := L) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := L) n hmu S)).1 = + KummerTheory.finiteKummerRadicalSubgroup + (K := K) (L := L) n := + le_antisymm + (sUnitKummerSubgroup_le_finiteKummerRadicalSubgroup + (K := K) (L := L) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := L) n hmu S)) + (finiteKummerRadicalSubgroup_le_enlargedSUnitKummerSubgroup + (K := K) (L := L) n hmu S) + +open scoped Classical in +/-- The `S`-unit radical subgroup belonging to an extension is contained +in the full `S`-unit Kummer subgroup. -/ +theorem sUnitKummerSubgroup_le_fullSUnitKummerSubgroup + {L : Type*} [Field L] [Algebra K L] + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + (sUnitKummerSubgroup (K := K) (L := L) n S).1 ≤ + (fullSUnitKummerSubgroup (K := K) n S).1 := by + apply sup_le + · exact inf_le_left.trans le_sup_left + · exact le_sup_right + +omit numberFieldK in +open scoped Classical in +/-- Monotonicity of the concrete radical-extension construction. -/ +theorem kummerRadicalExtension_mono + {Omega : Type*} [Field Omega] [Algebra K Omega] + (n : ℕ+) + {Delta Gamma : Subgroup Kˣ} + (h : Delta ≤ Gamma) : + KummerTheory.kummerRadicalExtension + (K := K) (Omega := Omega) n Delta ≤ + KummerTheory.kummerRadicalExtension + (K := K) (Omega := Omega) n Gamma := by + apply IntermediateField.adjoin_le_iff.mpr + rintro beta ⟨a, ha⟩ + apply IntermediateField.subset_adjoin K + (KummerTheory.kummerRootSet + (K := K) (Omega := Omega) n Gamma) + exact ⟨⟨a.1, h a.2⟩, ha⟩ + +open scoped Classical in +/-- Kummer generation of an abelian exponent-`n` extension from the +`S`-unit radical supplied by the chosen finite enlargement. -/ +theorem kummerRadicalExtension_enlargedSUnitKummerSubgroup_eq + {Omega : Type*} [Field Omega] [Algebra K Omega] + (E : IntermediateField K Omega) + [FiniteDimensional K E] [IsGalois K E] + [IsMulCommutative Gal(E/K)] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ sigma : Gal(E/K), sigma ^ (n : ℕ) = 1) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + KummerTheory.kummerRadicalExtension + (K := K) (Omega := Omega) n + (sUnitKummerSubgroup + (K := K) (L := E) n + (enlargeByFiniteKummerRadicalSupport + (K := K) (L := E) n hmu S)).1 = + E := by + rw [ + enlargedSUnitKummerSubgroup_eq_finiteKummerRadicalSubgroup + (K := K) (L := E) n hmu S] + exact + KummerTheory.kummerRadicalExtension_finiteKummerRadicalSubgroup_eq + E n hmu hexponent + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FullSUnitKummerExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FullSUnitKummerExtension.lean new file mode 100644 index 0000000000..77340ca4ca --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FullSUnitKummerExtension.lean @@ -0,0 +1,570 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitPowerQuotient +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SUnitPreparation.PrimePowerKernelCoordinates +/-! +# The full S-unit Kummer extension + +Construction, finite generation, Galois structure, cardinality, and coordinates for the Kummer + extension generated by + all `S`-unit roots. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative NNReal ValuativeRel +open NumberField IsDedekindDomain +open LocalFieldTheory + +noncomputable +section + +namespace KummerTheory + +variable {K : Type*} [Field K] + [numberFieldK : NumberField K] + +open scoped Classical in +/-- The actual field `N = K(√[n]{Kˢ})` in a fixed separable closure. -/ +def fullSUnitKummerExtension + {Omega : Type*} [Field Omega] [Algebra K Omega] + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + IntermediateField K Omega := + KummerTheory.kummerRadicalExtension + (K := K) (Omega := Omega) n + (fullSUnitKummerSubgroup (K := K) n S).1 + +open scoped Classical in +/-- Every root used to generate the full `S`-unit Kummer extension can be +rescaled by an element of `Kˣ` to become the root of an actual `S`-unit. +The rescaling does not change the simple intermediate field that it +generates. This is the source-producing step needed to apply the local +unramified Kummer criterion to every generator of the full extension. -/ +theorem exists_sUnitRoot_adjoin_eq_of_mem_fullSUnitKummerRootSet + {Omega : Type*} [Field Omega] [Algebra K Omega] + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) + {beta : Omega} + (hbeta : + beta ∈ + KummerTheory.kummerRootSet + (K := K) (Omega := Omega) n + (fullSUnitKummerSubgroup (K := K) n S).1) : + ∃ (u : SUnitGroup (K := K) S) (alpha : Omegaˣ), + alpha ^ (n : ℕ) = + Units.map (algebraMap K Omega).toMonoidHom u.1 ∧ + IntermediateField.adjoin K {(alpha : Omega)} = + IntermediateField.adjoin K {beta} := by + have hbetaNe : beta ≠ 0 := + KummerTheory.kummerRootSet_ne_zero + n (fullSUnitKummerSubgroup (K := K) n S).1 hbeta + obtain ⟨a, hbetaPow⟩ := hbeta + obtain ⟨u, hu, z, hz, huz⟩ := + Subgroup.mem_sup.mp a.property + obtain ⟨c, hc⟩ := + (KummerTheory.mem_unitNthPowersSubgroup_iff n).mp hz + let uS : SUnitGroup (K := K) S := ⟨u, hu⟩ + let betaUnit : Omegaˣ := + Units.mk0 beta hbetaNe + let cOmega : Omegaˣ := + Units.map (algebraMap K Omega).toMonoidHom c + let alpha : Omegaˣ := betaUnit / cOmega + have hbetaUnitPow : + betaUnit ^ (n : ℕ) = + Units.map (algebraMap K Omega).toMonoidHom a.1 := by + apply Units.ext + exact hbetaPow + have hcOmegaPow : + cOmega ^ (n : ℕ) = + Units.map (algebraMap K Omega).toMonoidHom z := by + dsimp only [cOmega] + rw [← map_pow, hc] + have hau : a.1 / z = u := by + rw [← huz] + simp + have halphaPow : + alpha ^ (n : ℕ) = + Units.map (algebraMap K Omega).toMonoidHom u := by + dsimp only [alpha] + rw [div_pow, hbetaUnitPow, hcOmegaPow, ← map_div, hau] + refine ⟨uS, alpha, halphaPow, ?_⟩ + let Rbeta := IntermediateField.adjoin K {beta} + let Ralpha := IntermediateField.adjoin K {(alpha : Omega)} + have halphaMem : (alpha : Omega) ∈ Rbeta := by + have halphaVal : + (alpha : Omega) = + beta / algebraMap K Omega (c : K) := by + simp [alpha, betaUnit, cOmega] + rw [halphaVal] + exact Rbeta.div_mem + (IntermediateField.subset_adjoin K {beta} + (Set.mem_singleton beta)) + (Rbeta.algebraMap_mem (c : K)) + have hrecover : alpha * cOmega = betaUnit := + div_mul_cancel betaUnit cOmega + have hbetaMem : beta ∈ Ralpha := by + have hrecoverVal : + (alpha : Omega) * + algebraMap K Omega (c : K) = beta := by + simpa [betaUnit, cOmega] using + congrArg Units.val hrecover + rw [← hrecoverVal] + exact Ralpha.mul_mem + (IntermediateField.subset_adjoin K {(alpha : Omega)} + (Set.mem_singleton (alpha : Omega))) + (Ralpha.algebraMap_mem (c : K)) + apply le_antisymm + · apply IntermediateField.adjoin_le_iff.mpr + intro x hx + rw [Set.mem_singleton_iff] at hx + subst x + exact halphaMem + · apply IntermediateField.adjoin_le_iff.mpr + intro x hx + rw [Set.mem_singleton_iff] at hx + subst x + exact hbetaMem + +open scoped Classical in +/-- The field `N = K(√[n]{Kˢ})` is Galois over `K`. -/ +theorem fullSUnitKummerExtension_isGalois + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + IsGalois K + (fullSUnitKummerExtension (K := K) (Omega := Omega) n S) := + KummerTheory.kummerRadicalExtension_isGalois n + (fullSUnitKummerSubgroup (K := K) n S).1 + +open scoped Classical in +/-- The Galois group of `N/K` is finite. -/ +theorem finite_fullSUnitKummerExtension_galois + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Finite + Gal(fullSUnitKummerExtension + (K := K) (Omega := Omega) n S/K) := by + let _ : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + let E := + fullSUnitKummerExtension (K := K) (Omega := Omega) n S + let Q := + KummerTheory.RestrictedRadicalQuotient + n (fullSUnitKummerSubgroup (K := K) n S) + let _ : Finite Q := + finite_fullSUnitRadicalQuotient (K := K) n S + let _ : Finite (Q →* KummerTheory.nthRootsSubgroup E (n : ℕ)) := + Finite.of_injective + (fun chi : Q →* KummerTheory.nthRootsSubgroup E (n : ℕ) => + (chi : Q → KummerTheory.nthRootsSubgroup E (n : ℕ))) + DFunLike.coe_injective + let e : + Gal(E/K) ≃* + (Q →* KummerTheory.nthRootsSubgroup E (n : ℕ)) := + KummerTheory.kummerRadicalExtensionRestrictedTransposeMulEquiv + n hn hmu (fullSUnitKummerSubgroup (K := K) n S) + exact Finite.of_equiv + (Q →* KummerTheory.nthRootsSubgroup E (n : ℕ)) + e.symm.toEquiv + +open scoped Classical in +/-- The extension `N = K(√[n]{Kˢ})` is finite-dimensional. -/ +theorem fullSUnitKummerExtension_finiteDimensional + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + FiniteDimensional K + (fullSUnitKummerExtension + (K := K) (Omega := Omega) n S) := by + let E := + fullSUnitKummerExtension (K := K) (Omega := Omega) n S + let _ : IsGalois K E := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S + let _ : Finite Gal(E/K) := + finite_fullSUnitKummerExtension_galois + (K := K) (Omega := Omega) n hn hmu S + exact IsGalois.finiteDimensional_of_finite K E + +open scoped Classical in +/-- A finite set of the actual Kummer roots generates the full `S`-unit +Kummer extension. Finiteness is obtained from Kummer duality, and the +finite root set is extracted from a primitive element of the resulting +finite separable extension. -/ +theorem exists_finset_fullSUnitKummerRootSet_adjoin_eq + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + ∃ T : Finset Omega, + (T : Set Omega) ⊆ + KummerTheory.kummerRootSet + (K := K) (Omega := Omega) n + (fullSUnitKummerSubgroup (K := K) n S).1 ∧ + IntermediateField.adjoin K (T : Set Omega) = + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S := by + let E := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S + let _ : IsGalois K E := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S + let _ : FiniteDimensional K E := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hn hmu S + obtain ⟨theta, htheta⟩ := + Field.exists_primitive_element K E + obtain ⟨T, hT, hthetaT⟩ := + KummerTheory.exists_finset_kummerRootSet_of_mem_kummerRadicalExtension + n (fullSUnitKummerSubgroup (K := K) n S).1 theta.property + refine ⟨T, hT, ?_⟩ + let R := IntermediateField.adjoin K (T : Set Omega) + have hRE : R ≤ E := by + apply IntermediateField.adjoin_le_iff.mpr + intro x hx + apply IntermediateField.subset_adjoin K + (KummerTheory.kummerRootSet + (K := K) (Omega := Omega) n + (fullSUnitKummerSubgroup (K := K) n S).1) + exact hT hx + have hall : ∀ x : E, (x : Omega) ∈ R := by + intro x + have hx : + x ∈ (⊤ : IntermediateField K E) := + trivial + rw [← htheta] at hx + induction hx using IntermediateField.adjoin_induction with + | mem y hy => + have hy' : y = theta := + Set.mem_singleton_iff.mp hy + subst y + exact hthetaT + | algebraMap a => + exact R.algebraMap_mem a + | add x y hx hy ihx ihy => + exact R.add_mem ihx ihy + | inv x hx ihx => + exact R.inv_mem ihx + | mul x y hx hy ihx ihy => + exact R.mul_mem ihx ihy + apply le_antisymm hRE + intro x hx + exact hall ⟨x, hx⟩ + +open scoped Classical in +/-- The finite generating roots may be regarded as elements of the full +Kummer extension itself; internally they adjoin to the top field. This is +the form consumed by finite inertia-restriction arguments. -/ +theorem exists_finset_fullSUnitKummerExtensionRoots_adjoin_eq_top + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + let E := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S + ∃ T : Finset E, + (∀ x : E, x ∈ T → + (x : Omega) ∈ + KummerTheory.kummerRootSet + (K := K) (Omega := Omega) n + (fullSUnitKummerSubgroup (K := K) n S).1) ∧ + IntermediateField.adjoin K (T : Set E) = ⊤ := by + classical + dsimp only + let E := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S + let _ : IsGalois K E := + fullSUnitKummerExtension_isGalois + (K := K) (Omega := Omega) n S + let _ : FiniteDimensional K E := + fullSUnitKummerExtension_finiteDimensional + (K := K) (Omega := Omega) n hn hmu S + obtain ⟨theta, htheta⟩ := + Field.exists_primitive_element K E + obtain ⟨T₀, hT₀, hthetaT₀⟩ := + KummerTheory.exists_finset_kummerRootSet_of_mem_kummerRadicalExtension + n (fullSUnitKummerSubgroup (K := K) n S).1 theta.property + have hT₀E : + IntermediateField.adjoin K (T₀ : Set Omega) ≤ E := by + apply IntermediateField.adjoin_le_iff.mpr + intro x hx + apply IntermediateField.subset_adjoin K + (KummerTheory.kummerRootSet + (K := K) (Omega := Omega) n + (fullSUnitKummerSubgroup (K := K) n S).1) + exact hT₀ hx + let toE : ↥T₀ → E := + fun x => ⟨x.1, + IntermediateField.subset_adjoin K + (KummerTheory.kummerRootSet + (K := K) (Omega := Omega) n + (fullSUnitKummerSubgroup (K := K) n S).1) + (hT₀ x.property)⟩ + let T : Finset E := + Finset.univ.image toE + have hTroot : + ∀ x : E, x ∈ T → + (x : Omega) ∈ + KummerTheory.kummerRootSet + (K := K) (Omega := Omega) n + (fullSUnitKummerSubgroup (K := K) n S).1 := by + intro x hx + obtain ⟨y, _, hy⟩ := + Finset.mem_image.mp hx + rw [← hy] + exact hT₀ y.property + refine ⟨T, hTroot, ?_⟩ + let R := IntermediateField.adjoin K (T : Set E) + have hlift : + ∀ (x : Omega) + (hx : + x ∈ IntermediateField.adjoin K (T₀ : Set Omega)), + (⟨x, hT₀E hx⟩ : E) ∈ R := by + intro x hx + exact IntermediateField.adjoin_induction K + (p := fun y hy => (⟨y, hT₀E hy⟩ : E) ∈ R) + (fun y hy => by + let yT : ↥T₀ := ⟨y, hy⟩ + have hyT : toE yT ∈ T := by + apply Finset.mem_image.mpr + exact ⟨yT, Finset.mem_univ yT, rfl⟩ + have hmem : toE yT ∈ R := + IntermediateField.subset_adjoin K + (T : Set E) hyT + simpa only [toE, yT] using hmem) + (fun a => by + exact R.algebraMap_mem a) + (fun _ _ _ _ ihx ihy => by + simpa using R.add_mem ihx ihy) + (fun _ _ ihx => by + convert R.inv_mem ihx using 1) + (fun _ _ _ _ ihx ihy => by + simpa using R.mul_mem ihx ihy) + hx + have hthetaR : theta ∈ R := by + simpa using hlift theta.1 hthetaT₀ + apply top_unique + rw [← htheta] + apply IntermediateField.adjoin_le_iff.mpr + intro x hx + rw [Set.mem_singleton_iff] at hx + subst x + exact hthetaR + +open scoped Classical in +/-- The Galois group of `N/K` has cardinality `n ^ s`. -/ +theorem card_fullSUnitKummerExtension_galois + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Nat.card + Gal(fullSUnitKummerExtension + (K := K) (Omega := Omega) n S/K) = + (n : ℕ) ^ totalPlaceCard (K := K) S := by + let _ : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + let E := + fullSUnitKummerExtension (K := K) (Omega := Omega) n S + let Q := + KummerTheory.RestrictedRadicalQuotient + n (fullSUnitKummerSubgroup (K := K) n S) + let e : + Gal(E/K) ≃* + (Q →* KummerTheory.nthRootsSubgroup E (n : ℕ)) := + KummerTheory.kummerRadicalExtensionRestrictedTransposeMulEquiv + n hn hmu (fullSUnitKummerSubgroup (K := K) n S) + obtain ⟨dual⟩ := + KummerTheory.finiteNthRootsCharacterDuality + (G := Q) (K := K) (L := E) n hmu + (KummerTheory.restrictedRadicalQuotient_pow_eq_one + n (fullSUnitKummerSubgroup (K := K) n S)) + calc + Nat.card Gal(E/K) = + Nat.card (Q →* KummerTheory.nthRootsSubgroup E (n : ℕ)) := + Nat.card_congr e.toEquiv + _ = Nat.card Q := Nat.card_congr dual.toEquiv + _ = (n : ℕ) ^ totalPlaceCard (K := K) S := + card_fullSUnitRadicalQuotient (K := K) n S hmu + +open scoped Classical in +/-- Every automorphism of the full `S`-unit Kummer extension has +`n`-th power one. -/ +theorem fullSUnitKummerExtension_galois_pow_eq_one + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (sigma : + Gal(fullSUnitKummerExtension + (K := K) (Omega := Omega) n S/K)) : + sigma ^ (n : ℕ) = 1 := + KummerTheory.kummerRadicalExtension_galois_pow_eq_one + n hmu (fullSUnitKummerSubgroup (K := K) n S).1 sigma + +open scoped Classical in +/-- A chosen Kummer-duality equivalence identifies the Galois group of the full +`S`-unit extension with the actual `S`-unit quotient. -/ +noncomputable def + chosenFullSUnitKummerExtensionGaloisEquivSUnitQuotient + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Gal(fullSUnitKummerExtension + (K := K) (Omega := Omega) n S/K) ≃* + SUnitGroup (K := K) S ⧸ + (powMonoidHom (n : ℕ) : + SUnitGroup (K := K) S →* + SUnitGroup (K := K) S).range := by + let Q := + KummerTheory.RestrictedRadicalQuotient + n (fullSUnitKummerSubgroup (K := K) n S) + let E := + fullSUnitKummerExtension + (K := K) (Omega := Omega) n S + let e : + Gal(E/K) ≃* + (Q →* KummerTheory.nthRootsSubgroup E (n : ℕ)) := + KummerTheory.kummerRadicalExtensionRestrictedTransposeMulEquiv + n hn hmu (fullSUnitKummerSubgroup (K := K) n S) + let dual : + (Q →* KummerTheory.nthRootsSubgroup E (n : ℕ)) ≃* Q := + Classical.choice <| + KummerTheory.finiteNthRootsCharacterDuality + (G := Q) (K := K) (L := E) n hmu + (KummerTheory.restrictedRadicalQuotient_pow_eq_one + n (fullSUnitKummerSubgroup (K := K) n S)) + exact (e.trans dual).trans + (sUnitNthPowerQuotientEquivFullSUnitRadicalQuotient + (K := K) n S).symm + +open scoped Classical in +/-- `ZMod n` coordinates derived from the chosen duality equivalence on the Galois +group of the full `S`-unit Kummer extension. -/ +noncomputable def fullSUnitKummerExtensionGaloisCoordinates + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Gal(fullSUnitKummerExtension + (K := K) (Omega := Omega) n S/K) ≃* + Multiplicative (ZMod (n : ℕ)) × + Multiplicative + (Fin (SUnitGroup.logRank (K := K) S) → + ZMod (n : ℕ)) := + (chosenFullSUnitKummerExtensionGaloisEquivSUnitQuotient + (K := K) (Omega := Omega) n hn hmu S).trans + (sUnitNthPowerQuotientCoordinates + (K := K) S n hmu) + +open scoped Classical in +/-- The Galois group of the full `S`-unit Kummer extension, with one +coordinate for every finite place in `S` and every infinite place. +This chosen coordinate form is consumed by the global norm-index +theorem. -/ +noncomputable def fullSUnitKummerExtensionGaloisEquivPiZMod + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Gal(fullSUnitKummerExtension + (K := K) (Omega := Omega) n S/K) ≃* + (Fin (totalPlaceCard (K := K) S) → + Multiplicative (ZMod (n : ℕ))) := by + let r := SUnitGroup.logRank (K := K) S + let eFin : Fin (r + 1) ≃ + Fin (totalPlaceCard (K := K) S) := + finCongr + (totalPlaceCard_eq_sUnitLogRank_add_one + (K := K) S).symm + let eReindex : + (Fin (r + 1) → Multiplicative (ZMod (n : ℕ))) ≃* + (Fin (totalPlaceCard (K := K) S) → + Multiplicative (ZMod (n : ℕ))) := + { toFun := fun f i => f (eFin.symm i) + invFun := fun f i => f (eFin i) + left_inv := by + intro f + funext i + simp only [Equiv.symm_apply_apply] + right_inv := by + intro f + funext i + simp only [Equiv.apply_symm_apply] + map_mul' := by + intro f g + rfl } + exact + (fullSUnitKummerExtensionGaloisCoordinates + (K := K) (Omega := Omega) n hn hmu S).trans <| + (multiplicativeZModProductEquivPiSucc + (n : ℕ) r).trans eReindex + +open scoped Classical in +/-- With its canonical exponent-`n` module structure, the full +`S`-unit Kummer Galois group is a free `ZMod n`-module. -/ +theorem fullSUnitKummerExtension_galois_moduleFree + {Omega : Type*} [Field Omega] [Algebra K Omega] + [IsSepClosure K Omega] + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + letI : IsMulCommutative + Gal(fullSUnitKummerExtension + (K := K) (Omega := Omega) n S/K) := + KummerTheory.kummerRadicalExtension_isMulCommutative + n hmu (fullSUnitKummerSubgroup (K := K) n S).1 + letI : Module (ZMod (n : ℕ)) + (Additive + Gal(fullSUnitKummerExtension + (K := K) (Omega := Omega) n S/K)) := + additiveZModModuleOfPowEqOne (n : ℕ) + (fullSUnitKummerExtension_galois_pow_eq_one + (K := K) (Omega := Omega) n hmu S) + Module.Free (ZMod (n : ℕ)) + (Additive + Gal(fullSUnitKummerExtension + (K := K) (Omega := Omega) n S/K)) := by + let G := + Gal(fullSUnitKummerExtension + (K := K) (Omega := Omega) n S/K) + let _ : IsMulCommutative G := + KummerTheory.kummerRadicalExtension_isMulCommutative + n hmu (fullSUnitKummerSubgroup (K := K) n S).1 + let _ : Module (ZMod (n : ℕ)) (Additive G) := + additiveZModModuleOfPowEqOne (n : ℕ) + (fullSUnitKummerExtension_galois_pow_eq_one + (K := K) (Omega := Omega) n hmu S) + let e : + Additive G ≃ₗ[ZMod (n : ℕ)] + ZMod (n : ℕ) × + (Fin (SUnitGroup.logRank (K := K) S) → + ZMod (n : ℕ)) := + additiveCoordinatesLinearEquiv (n : ℕ) + (fullSUnitKummerExtensionGaloisCoordinates + (K := K) (Omega := Omega) n hn hmu S) + exact Module.Free.of_equiv e.symm + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitLocalPowerKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitLocalPowerKernel.lean new file mode 100644 index 0000000000..55dd1370ab --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitLocalPowerKernel.lean @@ -0,0 +1,218 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitPowerQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation +/-! +# The local-power kernel of S-units + +The localization map on `S`-units, its kernel, its quotient by + global powers, and the associated Kummer radical. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative NNReal ValuativeRel +open NumberField IsDedekindDomain +open LocalFieldTheory + +noncomputable +section + +namespace KummerTheory + +variable {K : Type*} [Field K] + [numberFieldK : NumberField K] + +open scoped Classical in +/-- The diagonal localization map +`Kˢ → ∏ v ∈ T, K_vˣ / K_vˣⁿ`. -/ +noncomputable def sUnitLocalPowerMap + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + SUnitGroup (K := K) S →* + ∀ v : T, + ((v : HeightOneSpectrum (𝓞 K)).adicCompletion K)ˣ ⧸ + (powMonoidHom (n : ℕ) : + ((v : HeightOneSpectrum (𝓞 K)).adicCompletion K)ˣ →* + ((v : HeightOneSpectrum (𝓞 K)).adicCompletion K)ˣ).range := + (IdeleGroup.principalLocalQuotientMap + (K := K) T + (fun v => + (powMonoidHom (n : ℕ) : + (v.1.adicCompletion K)ˣ →* + (v.1.adicCompletion K)ˣ).range)).comp + (SUnitGroup (K := K) S).subtype + +open scoped Classical in +/-- The subgroup `Δ` of `S`-units which are local `n`-th powers at every +place in `T`. -/ +def sUnitLocalPowerKernel + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + Subgroup (SUnitGroup (K := K) S) := + MonoidHom.ker (sUnitLocalPowerMap (K := K) n S T) + +open scoped Classical in +/-- Elementwise description of the local-power kernel `Δ`. -/ +theorem mem_sUnitLocalPowerKernel_iff + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) + (x : SUnitGroup (K := K) S) : + x ∈ sUnitLocalPowerKernel (K := K) n S T ↔ + ∀ v : T, + Units.map + (algebraMap K + ((v : HeightOneSpectrum (𝓞 K)).adicCompletion K)).toMonoidHom + (x : Kˣ) ∈ + (powMonoidHom (n : ℕ) : + ((v : HeightOneSpectrum (𝓞 K)).adicCompletion K)ˣ →* + ((v : HeightOneSpectrum (𝓞 K)).adicCompletion K)ˣ).range := by + rw [sUnitLocalPowerKernel, MonoidHom.mem_ker] + constructor + · intro hx v + have hv := congrFun hx v + rw [Pi.one_apply] at hv + exact (QuotientGroup.eq_one_iff _).mp hv + · intro hx + funext v + exact (QuotientGroup.eq_one_iff _).mpr (hx v) + +open scoped Classical in +/-- Global `n`-th powers are local `n`-th powers at every place. -/ +theorem nthPowerSubgroup_le_sUnitLocalPowerKernel + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + (powMonoidHom (n : ℕ) : + SUnitGroup (K := K) S →* + SUnitGroup (K := K) S).range ≤ + sUnitLocalPowerKernel (K := K) n S T := by + intro x hx + obtain ⟨y, hy⟩ := + (MonoidHom.mem_range + (G := SUnitGroup (K := K) S)).mp hx + rw [powMonoidHom_apply] at hy + subst x + rw [sUnitLocalPowerKernel, MonoidHom.mem_ker, map_pow] + change (sUnitLocalPowerMap (K := K) n S T y) ^ (n : ℕ) = 1 + funext v + exact (QuotientGroup.eq_one_iff _).mpr + ((MonoidHom.mem_range + (G := + ((v : HeightOneSpectrum (𝓞 K)).adicCompletion K)ˣ)).mpr + ⟨_, by rw [powMonoidHom_apply]⟩) + +open scoped Classical in +/-- The copy of `Kˢⁿ` inside the local-power kernel `Δ`. -/ +def sUnitLocalPowerKernelNthPowers + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + Subgroup (sUnitLocalPowerKernel (K := K) n S T) := + ((powMonoidHom (n : ℕ) : + SUnitGroup (K := K) S →* + SUnitGroup (K := K) S).range).comap + (sUnitLocalPowerKernel (K := K) n S T).subtype + +open scoped Classical in +/-- The canonical map `Δ / Kˢⁿ → Kˢ / Kˢⁿ`. -/ +def sUnitLocalPowerKernelQuotientMap + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + sUnitLocalPowerKernel (K := K) n S T ⧸ + sUnitLocalPowerKernelNthPowers (K := K) n S T →* + SUnitGroup (K := K) S ⧸ + (powMonoidHom (n : ℕ) : + SUnitGroup (K := K) S →* + SUnitGroup (K := K) S).range := + QuotientGroup.map + (sUnitLocalPowerKernelNthPowers (K := K) n S T) + (powMonoidHom (n : ℕ) : + SUnitGroup (K := K) S →* + SUnitGroup (K := K) S).range + (sUnitLocalPowerKernel (K := K) n S T).subtype + (by + intro x hx + exact hx) + +open scoped Classical in +/-- Inclusion of `Δ` induces an injection on quotients by `Kˢⁿ`. -/ +theorem sUnitLocalPowerKernelQuotientMap_injective + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + Function.Injective + (sUnitLocalPowerKernelQuotientMap (K := K) n S T) := by + intro q r hqr + induction q using QuotientGroup.induction_on' with + | _ x => + induction r using QuotientGroup.induction_on' with + | _ y => + apply (QuotientGroup.eq_iff_div_mem).2 + change + (x.1 / y.1) ∈ + (powMonoidHom (n : ℕ) : + SUnitGroup (K := K) S →* + SUnitGroup (K := K) S).range + apply (QuotientGroup.eq_iff_div_mem).1 + exact hqr + +open scoped Classical in +/-- The restricted radical quotient `Δ / Kˢⁿ` is finite. -/ +noncomputable instance finite_sUnitLocalPowerKernelQuotient + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + Finite + (sUnitLocalPowerKernel (K := K) n S T ⧸ + sUnitLocalPowerKernelNthPowers (K := K) n S T) := + Finite.of_injective + (sUnitLocalPowerKernelQuotientMap (K := K) n S T) + (sUnitLocalPowerKernelQuotientMap_injective + (K := K) n S T) + +open scoped Classical in +/-- The restricted radical quotient has cardinality at most `n ^ s`. -/ +theorem card_sUnitLocalPowerKernelQuotient_le + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + Nat.card + (sUnitLocalPowerKernel (K := K) n S T ⧸ + sUnitLocalPowerKernelNthPowers (K := K) n S T) ≤ + (n : ℕ) ^ totalPlaceCard (K := K) S := by + rw [← card_sUnit_nthPowerQuotient (K := K) S n hmu] + exact Nat.card_le_card_of_injective + (sUnitLocalPowerKernelQuotientMap (K := K) n S T) + (sUnitLocalPowerKernelQuotientMap_injective + (K := K) n S T) + +open scoped Classical in +/-- The local-power kernel, regarded as an actual subgroup of `Kˣ`. -/ +def sUnitLocalPowerRadical + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) : + Subgroup Kˣ := + (sUnitLocalPowerKernel (K := K) n S T).map + (SUnitGroup (K := K) S).subtype + +open scoped Classical in +/-- Membership in the local-power radical is membership in the kernel +through the canonical `S`-unit inclusion. -/ +theorem mem_sUnitLocalPowerRadical_iff + (n : ℕ+) + (S T : Finset (HeightOneSpectrum (𝓞 K))) + (x : Kˣ) : + x ∈ sUnitLocalPowerRadical (K := K) n S T ↔ + ∃ hx : x ∈ SUnitGroup (K := K) S, + (⟨x, hx⟩ : SUnitGroup (K := K) S) ∈ + sUnitLocalPowerKernel (K := K) n S T := by + constructor + · rintro ⟨y, hy, rfl⟩ + exact ⟨y.2, hy⟩ + · rintro ⟨hx, hlocal⟩ + exact ⟨⟨x, hx⟩, hlocal, rfl⟩ + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitPowerQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitPowerQuotient.lean new file mode 100644 index 0000000000..2093681138 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitPowerQuotient.lean @@ -0,0 +1,666 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.LogLattice +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.KummerCorrespondenceFormula +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.PowerIndex +public import Mathlib.NumberTheory.NumberField.Cyclotomic.Basic +/-! +# Power quotients of S-unit groups + +The finite `n`-th-power quotient of an `S`-unit group, its cardinality, and explicit `ZMod n` + coordinates. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative NNReal ValuativeRel +open NumberField IsDedekindDomain +open LocalFieldTheory + +noncomputable +section + +namespace KummerTheory + +variable {K : Type*} [Field K] + [numberFieldK : NumberField K] + +open scoped Classical in +/-- The total place-set cardinal `s = #S`, with all infinite places included. -/ +def totalPlaceCard + (S : Finset (HeightOneSpectrum (𝓞 K))) : ℕ := + Fintype.card (InfinitePlace K) + S.card + +open scoped Classical in +/-- The number of places in the `S`-unit theorem is one more than the +free rank of the `S`-unit group. The extra coordinate is the +roots-of-unity coordinate. -/ +theorem totalPlaceCard_eq_sUnitLogRank_add_one + (S : Finset (HeightOneSpectrum (𝓞 K))) : + totalPlaceCard (K := K) S = + SUnitGroup.logRank (K := K) S + 1 := by + unfold totalPlaceCard SUnitGroup.logRank + have hinfinite : + 0 < Fintype.card (InfinitePlace K) := + Fintype.card_pos + omega + +open scoped Classical in +/-- One roots-of-unity coordinate together with `r` free coordinates +is the product of `r + 1` copies of `ZMod n`, in multiplicative +notation. -/ +noncomputable def multiplicativeZModProductEquivPiSucc + (n r : ℕ) : + Multiplicative (ZMod n) × + Multiplicative (Fin r → ZMod n) ≃* + (Fin (r + 1) → Multiplicative (ZMod n)) where + toFun x i := + Fin.cases x.1 + (fun j => Multiplicative.ofAdd (x.2.toAdd j)) i + invFun f := + (f 0, + Multiplicative.ofAdd + (fun j => (f j.succ).toAdd)) + left_inv := by + rintro ⟨a, b⟩ + apply Prod.ext + · rfl + · apply Multiplicative.toAdd.injective + funext j + rfl + right_inv := by + intro f + funext i + refine Fin.cases ?_ (fun j => ?_) i + · rfl + · rfl + map_mul' := by + intro x y + funext i + refine Fin.cases ?_ (fun j => ?_) i + · rfl + · rfl + +open scoped Classical in +/-- Coordinatewise reduction of a finite free `ℤ`-module modulo `n`. -/ +def finsuppModHom (d n : ℕ) : + (Fin d →₀ ℤ) →+ (Fin d → ZMod n) where + toFun x i := x i + map_zero' := by + ext i + simp + map_add' x y := by + ext i + simp + +open scoped Classical in +/-- Every vector over `ZMod n` has an integral lift. -/ +theorem finsuppModHom_surjective (d n : ℕ) : + Function.Surjective (finsuppModHom d n) := by + intro y + choose x hx using fun i => ZMod.intCast_surjective (y i) + let x' : Fin d →₀ ℤ := + (Finsupp.equivFunOnFinite).symm x + refine ⟨x', ?_⟩ + ext i + exact hx i + +open scoped Classical in +/-- The kernel of coordinatewise reduction is exactly the subgroup of +`n`-fold multiples. -/ +theorem finsuppModHom_ker (d n : ℕ) : + (finsuppModHom d n).ker = + LocalFieldTheory.nsmulAddSubgroup (Fin d →₀ ℤ) n := by + ext x + constructor + · intro hx + rw [AddMonoidHom.mem_ker] at hx + rw [LocalFieldTheory.mem_nsmulAddSubgroup_iff] + let y : Fin d → ℤ := fun i => (x i) / n + let y' : Fin d →₀ ℤ := + (Finsupp.equivFunOnFinite).symm y + refine ⟨y', ?_⟩ + ext i + have hdiv : (n : ℤ) ∣ x i := by + rw [← ZMod.intCast_zmod_eq_zero_iff_dvd] + exact congrFun hx i + change (n : ℤ) * (x i / n) = x i + rw [mul_comm] + exact Int.ediv_mul_cancel hdiv + · intro hx + rw [LocalFieldTheory.mem_nsmulAddSubgroup_iff] at hx + obtain ⟨y, rfl⟩ := hx + rw [AddMonoidHom.mem_ker] + ext i + simp [finsuppModHom] + +open scoped Classical in +/-- The finite-free quotient `(ℤ^d) / n(ℤ^d)` is `(ZMod n)^d`. -/ +noncomputable def finsuppNsmulQuotientEquivPiZMod + (d n : ℕ) : + (Fin d →₀ ℤ) ⧸ + LocalFieldTheory.nsmulAddSubgroup (Fin d →₀ ℤ) n ≃+ + (Fin d → ZMod n) := by + rw [← finsuppModHom_ker d n] + exact QuotientAddGroup.quotientKerEquivOfSurjective + (finsuppModHom d n) + (finsuppModHom_surjective d n) + +open scoped Classical in +/-- In multiplicative notation, the free integral quotient by `n`-th +powers is a product of copies of `ZMod n`. -/ +noncomputable def multiplicativeFinsuppNthPowerQuotientEquivPiZMod + (d n : ℕ) : + Multiplicative (Fin d →₀ ℤ) ⧸ + (powMonoidHom n : + Multiplicative (Fin d →₀ ℤ) →* + Multiplicative (Fin d →₀ ℤ)).range ≃* + Multiplicative (Fin d → ZMod n) := by + rw [ + LocalFieldTheory.powMonoidHom_range_multiplicative_eq_nsmulAddSubgroup_toSubgroup] + exact (finsuppNsmulQuotientEquivPiZMod d n).toMultiplicative + +open scoped Classical in +/-- The quotient of a finite free integral module by a positive multiple +is finite. -/ +noncomputable instance finite_finsupp_nsmulQuotient + (d : ℕ) (n : ℕ+) : + Finite + ((Fin d →₀ ℤ) ⧸ + LocalFieldTheory.nsmulAddSubgroup + (Fin d →₀ ℤ) (n : ℕ)) := by + let _ : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + exact Finite.of_equiv + (Fin d → ZMod (n : ℕ)) + (finsuppNsmulQuotientEquivPiZMod d n).symm + +open scoped Classical in +/-- The cardinality of `(ℤ^d) / n(ℤ^d)` is `n ^ d`. -/ +theorem card_finsupp_nsmulQuotient + (d : ℕ) (n : ℕ+) : + Nat.card + ((Fin d →₀ ℤ) ⧸ + LocalFieldTheory.nsmulAddSubgroup + (Fin d →₀ ℤ) (n : ℕ)) = + (n : ℕ) ^ d := by + let _ : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + rw [Nat.card_congr + (finsuppNsmulQuotientEquivPiZMod d n).toEquiv, + Nat.card_pi] + simp + +omit [NumberField K] in +open scoped Classical in +/-- A primitive `n`-th root in `K` embeds a cyclic subgroup of order `n` +into the roots of unity of the integer ring. -/ +theorem n_dvd_numberField_torsionOrder + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + (n : ℕ) ∣ NumberField.Units.torsionOrder K := by + let _ : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + obtain ⟨ζ, hζ⟩ := hmu + have hζprim : IsPrimitiveRoot ζ (n : ℕ) := + (mem_primitiveRoots n.pos).mp hζ + let ζO : 𝓞 K := hζprim.toInteger + have hζOprim : IsPrimitiveRoot ζO (n : ℕ) := + hζprim.toInteger_isPrimitiveRoot + let hu : IsUnit ζO := hζOprim.isUnit n.ne_zero + let u : (𝓞 K)ˣ := hu.unit + have huval : (u : 𝓞 K) = ζO := + hu.unit_spec + have huprim : IsPrimitiveRoot u (n : ℕ) := by + rw [← IsPrimitiveRoot.coe_units_iff, huval] + exact hζOprim + have hutorsion : u ∈ NumberField.Units.torsion K := by + rw [NumberField.Units.torsion, + CommGroup.mem_torsion, + isOfFinOrder_iff_pow_eq_one] + exact ⟨n, n.pos, huprim.pow_eq_one⟩ + let ut : NumberField.Units.torsion K := + ⟨u, hutorsion⟩ + have hutprim : IsPrimitiveRoot ut (n : ℕ) := by + rw [← IsPrimitiveRoot.coe_submonoidClass_iff] + exact huprim + rw [NumberField.Units.torsionOrder, + hutprim.eq_orderOf] + exact orderOf_dvd_natCard ut + +include numberFieldK in +open scoped Classical in +/-- If `K` contains a primitive `n`-th root, the quotient of its roots of +unity by `n`-th powers has cardinality `n`. -/ +theorem card_numberField_torsion_nthPowerQuotient + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + Nat.card + (NumberField.Units.torsion K ⧸ + (powMonoidHom (n : ℕ) : + NumberField.Units.torsion K →* + NumberField.Units.torsion K).range) = + (n : ℕ) := by + let T := NumberField.Units.torsion K + let P := + (powMonoidHom (n : ℕ) : T →* T).range + have hcardP : + Nat.card P = + Nat.card T / (Nat.card T).gcd (n : ℕ) := by + exact IsCyclic.card_powMonoidHom_range T (n : ℕ) + have hgcd_dvd : (Nat.card T).gcd (n : ℕ) ∣ Nat.card T := + Nat.gcd_dvd_left _ _ + have hcard_factor : + (Nat.card T).gcd (n : ℕ) * + (Nat.card T / (Nat.card T).gcd (n : ℕ)) = + Nat.card T := + Nat.mul_div_cancel' hgcd_dvd + have hquotient : + Nat.card (T ⧸ P) * + (Nat.card T / (Nat.card T).gcd (n : ℕ)) = + Nat.card T := by + rw [← hcardP] + exact (Subgroup.card_eq_card_quotient_mul_card_subgroup P).symm + have hfactor_pos : + 0 < Nat.card T / (Nat.card T).gcd (n : ℕ) := by + rw [Nat.div_pos_iff] + have hTpos : 0 < Nat.card T := Nat.card_pos + exact ⟨Nat.gcd_pos_of_pos_left _ hTpos, + Nat.gcd_le_left (m := Nat.card T) (n : ℕ) hTpos⟩ + have hcard : + Nat.card (T ⧸ P) = + (Nat.card T).gcd (n : ℕ) := by + exact Nat.eq_of_mul_eq_mul_right hfactor_pos + (hquotient.trans hcard_factor.symm) + change Nat.card (T ⧸ P) = (n : ℕ) + rw [hcard, Nat.gcd_eq_right] + simpa [T, NumberField.Units.torsionOrder] using + n_dvd_numberField_torsionOrder (K := K) n hmu + +open scoped Classical in +/-- The roots-of-unity contribution to the `S`-unit quotient is one +copy of `ZMod n`. -/ +noncomputable def numberFieldTorsionNthPowerQuotientEquivZMod + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + NumberField.Units.torsion K ⧸ + (powMonoidHom (n : ℕ) : + NumberField.Units.torsion K →* + NumberField.Units.torsion K).range ≃* + Multiplicative (ZMod (n : ℕ)) := by + letI : IsCyclic + (NumberField.Units.torsion K ⧸ + (powMonoidHom (n : ℕ) : + NumberField.Units.torsion K →* + NumberField.Units.torsion K).range) := + isCyclic_of_surjective + (QuotientGroup.mk' + (powMonoidHom (n : ℕ) : + NumberField.Units.torsion K →* + NumberField.Units.torsion K).range) + (QuotientGroup.mk'_surjective _) + apply mulEquivOfCyclicCardEq + rw [card_numberField_torsion_nthPowerQuotient + (K := K) n hmu] + simp + +open scoped Classical in +/-- The `n`-th-power quotient of an `S`-unit group is finite. -/ +noncomputable instance finite_sUnit_nthPowerQuotient + (S : Finset (HeightOneSpectrum (𝓞 K))) (n : ℕ+) : + Finite + (SUnitGroup (K := K) S ⧸ + (powMonoidHom (n : ℕ) : + SUnitGroup (K := K) S →* + SUnitGroup (K := K) S).range) := by + apply LocalFieldTheory.finite_nthPowerQuotient_of_mulEquiv + (SUnitGroup (K := K) S) + (NumberField.Units.torsion K × + Multiplicative + (Fin (SUnitGroup.logRank (K := K) S) →₀ ℤ)) + (n : ℕ) + (SUnitGroup.decomposition (K := K) S) + +open scoped Classical in +/-- The `S`-unit theorem in the form used in the finite S-unit preparation argument: + +`#(Kˢ / Kˢⁿ) = n ^ (#InfinitePlace K + #S)`. +-/ +theorem card_sUnit_nthPowerQuotient + (S : Finset (HeightOneSpectrum (𝓞 K))) + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + Nat.card + (SUnitGroup (K := K) S ⧸ + (powMonoidHom (n : ℕ) : + SUnitGroup (K := K) S →* + SUnitGroup (K := K) S).range) = + (n : ℕ) ^ totalPlaceCard (K := K) S := by + let F := + Fin (SUnitGroup.logRank (K := K) S) →₀ ℤ + let _ : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + have hfree : + Nat.card + (Multiplicative F ⧸ + (powMonoidHom (n : ℕ) : + Multiplicative F →* Multiplicative F).range) = + (n : ℕ) ^ SUnitGroup.logRank (K := K) S := by + have htransport := + LocalFieldTheory.card_multiplicative_nthPowerQuotient_eq_additive_nsmulQuotient + F (n : ℕ) + rw [htransport] + exact card_finsupp_nsmulQuotient + (SUnitGroup.logRank (K := K) S) n + have hplace : + totalPlaceCard (K := K) S = + SUnitGroup.logRank (K := K) S + 1 := by + unfold totalPlaceCard SUnitGroup.logRank + have hinfinite : + 0 < Fintype.card (InfinitePlace K) := + Fintype.card_pos + omega + calc + Nat.card + (SUnitGroup (K := K) S ⧸ + (powMonoidHom (n : ℕ) : + SUnitGroup (K := K) S →* + SUnitGroup (K := K) S).range) = + Nat.card + ((NumberField.Units.torsion K × Multiplicative F) ⧸ + (powMonoidHom (n : ℕ) : + NumberField.Units.torsion K × Multiplicative F →* + NumberField.Units.torsion K × + Multiplicative F).range) := by + exact Nat.card_congr + (LocalFieldTheory.nthPowerQuotientEquivOfMulEquiv + (SUnitGroup (K := K) S) + (NumberField.Units.torsion K × Multiplicative F) + (n : ℕ) + (SUnitGroup.decomposition (K := K) S)).toEquiv + _ = + Nat.card + ((NumberField.Units.torsion K ⧸ + (powMonoidHom (n : ℕ) : + NumberField.Units.torsion K →* + NumberField.Units.torsion K).range) × + (Multiplicative F ⧸ + (powMonoidHom (n : ℕ) : + Multiplicative F →* Multiplicative F).range)) := by + exact Nat.card_congr + (LocalFieldTheory.nthPowerProductQuotientEquiv + (NumberField.Units.torsion K) (Multiplicative F) + (n : ℕ)).toEquiv + _ = + (n : ℕ) * + (n : ℕ) ^ SUnitGroup.logRank (K := K) S := by + rw [Nat.card_prod, + card_numberField_torsion_nthPowerQuotient (K := K) n hmu, + hfree] + _ = (n : ℕ) ^ totalPlaceCard (K := K) S := by + rw [hplace, pow_succ'] + +open scoped Classical in +/-- The full `S`-unit quotient has one torsion coordinate and one +coordinate for every logarithmic free generator. -/ +noncomputable def sUnitNthPowerQuotientCoordinates + (S : Finset (HeightOneSpectrum (𝓞 K))) + (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + SUnitGroup (K := K) S ⧸ + (powMonoidHom (n : ℕ) : + SUnitGroup (K := K) S →* + SUnitGroup (K := K) S).range ≃* + Multiplicative (ZMod (n : ℕ)) × + Multiplicative + (Fin (SUnitGroup.logRank (K := K) S) → + ZMod (n : ℕ)) := + (LocalFieldTheory.nthPowerQuotientEquivOfMulEquiv + (SUnitGroup (K := K) S) + (NumberField.Units.torsion K × + Multiplicative + (Fin (SUnitGroup.logRank (K := K) S) →₀ ℤ)) + (n : ℕ) + (SUnitGroup.decomposition (K := K) S)).trans <| + (LocalFieldTheory.nthPowerProductQuotientEquiv + (NumberField.Units.torsion K) + (Multiplicative + (Fin (SUnitGroup.logRank (K := K) S) →₀ ℤ)) + (n : ℕ)).trans <| + MulEquiv.prodCongr + (numberFieldTorsionNthPowerQuotientEquivZMod + (K := K) n hmu) + (multiplicativeFinsuppNthPowerQuotientEquivPiZMod + (SUnitGroup.logRank (K := K) S) (n : ℕ)) + +open scoped Classical in +/-- If a positive power of a global unit is an `S`-unit, then the unit +itself is an `S`-unit. This is the valuation-theoretic saturation needed +to compare the abstract Kummer quotient with `Kˢ / Kˢⁿ`. -/ +theorem mem_sUnitGroup_of_pow_mem + (S : Finset (HeightOneSpectrum (𝓞 K))) + (n : ℕ+) (x : Kˣ) + (hx : x ^ (n : ℕ) ∈ SUnitGroup (K := K) S) : + x ∈ SUnitGroup (K := K) S := by + rw [mem_SUnitGroup_iff] at hx ⊢ + intro v hv + have hpow := hx v hv + change + v.valuation K (((x : Kˣ) : K) ^ (n : ℕ)) = 1 + at hpow + rw [map_pow] at hpow + exact + (pow_eq_one_iff_left + (a := v.valuation K ((x : Kˣ) : K)) n.ne_zero).mp hpow + +open scoped Classical in +/-- The admissible subgroup + +`Kˢ · Kˣⁿ ≤ Kˣ` + +whose radical extension is the field `N = K(√[n]{Kˢ})` in the finite S-unit preparation argument. -/ +def fullSUnitKummerSubgroup + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + KummerTheory.KummerSubgroup K n := + ⟨SUnitGroup (K := K) S ⊔ + KummerTheory.unitNthPowersSubgroup K n, + le_sup_right⟩ + +open scoped Classical in +/-- Include an `S`-unit in the full `S`-unit Kummer subgroup. -/ +def sUnitToFullSUnitKummerSubgroup + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + SUnitGroup (K := K) S →* + (fullSUnitKummerSubgroup (K := K) n S).1 := + Subgroup.inclusion le_sup_left + +open scoped Classical in +/-- Map an `S`-unit to its class in +`(Kˢ · Kˣⁿ) / Kˣⁿ`. -/ +def sUnitToFullSUnitRadicalQuotient + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + SUnitGroup (K := K) S →* + KummerTheory.RestrictedRadicalQuotient + n (fullSUnitKummerSubgroup (K := K) n S) := + (KummerTheory.restrictedRadicalQuotientMk + n (fullSUnitKummerSubgroup (K := K) n S)).comp + (sUnitToFullSUnitKummerSubgroup (K := K) n S) + +open scoped Classical in +/-- `S`-unit `n`-th powers vanish in the full radical quotient. -/ +theorem nthPowerSubgroup_le_ker_sUnitToFullSUnitRadicalQuotient + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + (powMonoidHom (n : ℕ) : + SUnitGroup (K := K) S →* + SUnitGroup (K := K) S).range ≤ + MonoidHom.ker + (sUnitToFullSUnitRadicalQuotient (K := K) n S) := by + intro x hx + obtain ⟨y, hy⟩ := + (MonoidHom.mem_range + (G := SUnitGroup (K := K) S)).mp hx + rw [powMonoidHom_apply] at hy + subst x + rw [MonoidHom.mem_ker, map_pow] + apply + (KummerTheory.restrictedRadicalQuotientMk_eq_one_iff + n (fullSUnitKummerSubgroup (K := K) n S) _).2 + exact + (KummerTheory.mem_restrictedNthPowersSubgroup_iff + n (fullSUnitKummerSubgroup (K := K) n S)).2 + ⟨(y : Kˣ), rfl⟩ + +open scoped Classical in +/-- The canonical comparison + +`Kˢ / Kˢⁿ → (Kˢ · Kˣⁿ) / Kˣⁿ`. -/ +def sUnitNthPowerQuotientToFullSUnitRadicalQuotient + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + SUnitGroup (K := K) S ⧸ + (powMonoidHom (n : ℕ) : + SUnitGroup (K := K) S →* + SUnitGroup (K := K) S).range →* + KummerTheory.RestrictedRadicalQuotient + n (fullSUnitKummerSubgroup (K := K) n S) := + QuotientGroup.lift + (powMonoidHom (n : ℕ) : + SUnitGroup (K := K) S →* + SUnitGroup (K := K) S).range + (sUnitToFullSUnitRadicalQuotient (K := K) n S) + (nthPowerSubgroup_le_ker_sUnitToFullSUnitRadicalQuotient + (K := K) n S) + +open scoped Classical in +/-- Every class in `(Kˢ · Kˣⁿ) / Kˣⁿ` has an `S`-unit representative. -/ +theorem sUnitNthPowerQuotientToFullSUnitRadicalQuotient_surjective + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Function.Surjective + (sUnitNthPowerQuotientToFullSUnitRadicalQuotient + (K := K) n S) := by + intro q + obtain ⟨x, rfl⟩ := + KummerTheory.restrictedRadicalQuotientMk_surjective + n (fullSUnitKummerSubgroup (K := K) n S) q + obtain ⟨y, hy, z, hz, hyz⟩ := + Subgroup.mem_sup.1 x.property + let yS : SUnitGroup (K := K) S := ⟨y, hy⟩ + refine + ⟨QuotientGroup.mk' + (powMonoidHom (n : ℕ) : + SUnitGroup (K := K) S →* + SUnitGroup (K := K) S).range yS, ?_⟩ + change + KummerTheory.restrictedRadicalQuotientMk + n (fullSUnitKummerSubgroup (K := K) n S) + (sUnitToFullSUnitKummerSubgroup (K := K) n S yS) = + KummerTheory.restrictedRadicalQuotientMk + n (fullSUnitKummerSubgroup (K := K) n S) x + apply + (KummerTheory.restrictedRadicalQuotientMk_eq_iff + n (fullSUnitKummerSubgroup (K := K) n S) _ _).2 + change y / x.1 ∈ KummerTheory.unitNthPowersSubgroup K n + rw [← hyz] + simpa using + (KummerTheory.unitNthPowersSubgroup K n).inv_mem hz + +open scoped Classical in +/-- The canonical comparison from `Kˢ / Kˢⁿ` is injective. The only +arithmetic point is saturation of the `S`-unit group under positive +powers, proved above from valuations. -/ +theorem sUnitNthPowerQuotientToFullSUnitRadicalQuotient_injective + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Function.Injective + (sUnitNthPowerQuotientToFullSUnitRadicalQuotient + (K := K) n S) := by + intro q r hqr + induction q using QuotientGroup.induction_on' with + | _ x => + induction r using QuotientGroup.induction_on' with + | _ y => + apply (QuotientGroup.eq_iff_div_mem).2 + have hglobal : + ((x : Kˣ) / (y : Kˣ)) ∈ + KummerTheory.unitNthPowersSubgroup K n := by + have hrestricted := + (KummerTheory.restrictedRadicalQuotientMk_eq_iff + n (fullSUnitKummerSubgroup (K := K) n S) _ _).1 hqr + exact + (KummerTheory.mem_restrictedNthPowersSubgroup_iff + n (fullSUnitKummerSubgroup (K := K) n S)).1 hrestricted + obtain ⟨z, hz⟩ := + (KummerTheory.mem_unitNthPowersSubgroup_iff n).mp hglobal + have hzpow : + z ^ (n : ℕ) ∈ SUnitGroup (K := K) S := by + rw [hz] + exact (SUnitGroup (K := K) S).div_mem x.property y.property + let zS : SUnitGroup (K := K) S := + ⟨z, mem_sUnitGroup_of_pow_mem (K := K) S n z hzpow⟩ + apply + (MonoidHom.mem_range + (G := SUnitGroup (K := K) S)).2 + refine ⟨zS, ?_⟩ + rw [powMonoidHom_apply] + apply Subtype.ext + exact hz + +open scoped Classical in +/-- The exact quotient identification used to define +`N = K(√[n]{Kˢ})`. -/ +noncomputable def sUnitNthPowerQuotientEquivFullSUnitRadicalQuotient + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + SUnitGroup (K := K) S ⧸ + (powMonoidHom (n : ℕ) : + SUnitGroup (K := K) S →* + SUnitGroup (K := K) S).range ≃* + KummerTheory.RestrictedRadicalQuotient + n (fullSUnitKummerSubgroup (K := K) n S) := + MulEquiv.ofBijective + (sUnitNthPowerQuotientToFullSUnitRadicalQuotient + (K := K) n S) + ⟨sUnitNthPowerQuotientToFullSUnitRadicalQuotient_injective + (K := K) n S, + sUnitNthPowerQuotientToFullSUnitRadicalQuotient_surjective + (K := K) n S⟩ + +open scoped Classical in +/-- The full `S`-unit radical quotient is finite. -/ +noncomputable instance finite_fullSUnitRadicalQuotient + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) : + Finite + (KummerTheory.RestrictedRadicalQuotient + n (fullSUnitKummerSubgroup (K := K) n S)) := + Finite.of_equiv + (SUnitGroup (K := K) S ⧸ + (powMonoidHom (n : ℕ) : + SUnitGroup (K := K) S →* + SUnitGroup (K := K) S).range) + (sUnitNthPowerQuotientEquivFullSUnitRadicalQuotient + (K := K) n S) + +open scoped Classical in +/-- The radical quotient defining `N` has cardinality `n ^ s`. -/ +theorem card_fullSUnitRadicalQuotient + (n : ℕ+) + (S : Finset (HeightOneSpectrum (𝓞 K))) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + Nat.card + (KummerTheory.RestrictedRadicalQuotient + n (fullSUnitKummerSubgroup (K := K) n S)) = + (n : ℕ) ^ totalPlaceCard (K := K) S := by + rw [← card_sUnit_nthPowerQuotient (K := K) S n hmu] + exact Nat.card_congr + (sUnitNthPowerQuotientEquivFullSUnitRadicalQuotient + (K := K) n S).symm.toEquiv + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean new file mode 100644 index 0000000000..57bc2d0cf2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean @@ -0,0 +1,721 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.FinitePlaceDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.InfinitePlaceTensorBlock +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalUnitKummerUnramified +/-! +# Unramified finite places in simple Kummer extensions + +This file proves the local unit case of the Kummer ramification criterion. +If both `b` and the exponent `n` are units at a finite place, then the +chosen localization of `K(ⁿ√b) / K` at that place is unramified. + +The proof uses the existing algebraic localization, mathlib's minimal +polynomial API, and the complete-DVF different criterion. No auxiliary +Kummer extension or alternative notion of unramifiedness is introduced. +-/ + +@[expose] public section + +open scoped NumberField NNReal TensorProduct ValuativeRel +open NumberField IsDedekindDomain +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalFieldTheory +open LocalClassFieldTheory + +noncomputable +section + +namespace KummerTheory + +variable {K : Type} [Field K] [NumberField K] + +open scoped Classical in +private theorem valuativeRelExtension_isNontrivial + {C F : Type} + [Field C] [Field F] [Algebra C F] + [ValuativeRel C] [ValuativeRel F] + [Valuation.HasExtension + (ValuativeRel.valuation C) (ValuativeRel.valuation F)] + [(ValuativeRel.valuation C).IsNontrivial] : + (ValuativeRel.valuation F).IsNontrivial := { + exists_val_nontrivial := by + let vC := ValuativeRel.valuation C + let vF := ValuativeRel.valuation F + rcases Valuation.IsNontrivial.exists_val_nontrivial + (v := vC) with ⟨x, hx0, hx1⟩ + refine ⟨algebraMap C F x, ?_, ?_⟩ + · intro h + have hm : + vF (algebraMap C F x) = + vF (algebraMap C F 0) := by + simpa only [map_zero] using h + exact hx0 (by + simpa only [map_zero] using + ((Valuation.HasExtension.val_map_eq_iff vC vF x 0).1 hm)) + · intro h + have hm : + vF (algebraMap C F x) = + vF (algebraMap C F 1) := by + simpa only [map_one] using h + exact hx1 (by + simpa only [map_one] using + ((Valuation.HasExtension.val_map_eq_iff vC vF x 1).1 hm)) } + +open scoped Classical in +/-- A finite Galois number-field extension generated by an `n`-th root of a +unit is unramified at every chosen completion where both the radicand and +`n` are units. + +This is the source-producing Kummer criterion: the proof works on the +actual localized completion, proves that the chosen root generates it, +and applies the derivative/different criterion to `X ^ n - b`. -/ +theorem + kummerGeneratedExtension_chosenFinitePlaceIsUnramified_of_valuation_eq_one + {L : Type} + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (n : ℕ+) + (b : Kˣ) + (beta : Lˣ) + (hbeta : + beta ^ (n : ℕ) = + Units.map (algebraMap K L).toMonoidHom b) + (hgen : + IntermediateField.adjoin K + ({(beta : L)} : Set L) = ⊤) + (v : HeightOneSpectrum (𝓞 K)) + (hb : v.valuation K (b : K) = 1) + (hn : v.valuation K ((n : ℕ) : K) = 1) : + ChosenFinitePlaceIsUnramified + (K := K) (L := L) v := by + let vK := HeightOneSpectrum.adicAbv K v + let w := chosenFinitePlaceExtension (L := L) v + let hvK : vK.IsNontrivial := + RayClass.adicAbv_isNontrivial v + let hvKna : IsNonarchimedean (vK : K → ℝ) := + HeightOneSpectrum.isNonarchimedean_adicAbv K v + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let := localizedCompletionGlobalAlgebra vK w + let := localizedCompletionIsScalarTower vK w + let C := vK.Completion + let F := LocalizedCompletion vK w + let : FiniteDimensional C F := + localizedCompletionModuleFinite vK hvK w + let : IsGalois C F := + HilbertRamification.algebraicLocalization_isGalois vK w + let : NontriviallyNormedField C := + absoluteValueExtensionCompletionNontriviallyNormedField vK hvK + let : LocallyCompactSpace C := + AbsoluteValue.Completion.locallyCompactSpace + (finitePlaceCompletionBaseMap_isometry v) + let : IsUltrametricDist C := + completionIsUltrametricDist vK hvKna + let : Valued C ℝ≥0 := + finitePlaceCompletionValued vK hvKna + let vCNorm : Valuation C ℝ≥0 := Valued.v + let : vCNorm.IsNontrivial := + (inferInstance : + (NormedField.valuation (K := C)).IsNontrivial) + let : ValuativeRel C := + finitePlaceCompletionValuativeRel vK hvKna + let : vCNorm.Compatible := + Valuation.Compatible.ofValuation vCNorm + let : ValuativeRel.IsNontrivial C := + (ValuativeRel.isNontrivial_iff_isNontrivial vCNorm).2 + inferInstance + let vC := ValuativeRel.valuation C + let : vC.IsNontrivial := inferInstance + let : IsValuativeTopology C := + isValuativeTopology_of_valued_ofValuation C ℝ≥0 + let : IsNonarchimedeanLocalField C := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + let : FiniteDimensional C w.1.Completion := + completionModuleFinite vK hvK w + let : ContinuousSMul C w.1.Completion := + continuousSMul_of_algebraMap _ _ + (AbsoluteValue.completionMap_isometry vK w.1 w.2).continuous + let : LocallyCompactSpace w.1.Completion := + LocallyCompactSpace.of_finiteDimensional_of_complete + C w.1.Completion + let eCompletion : F ≃ᵢ w.1.Completion := + { toEquiv := + (localizedCompletionEquivCompletion + vK hvK w).toEquiv + isometry_toFun := Isometry.of_dist_eq fun _ _ => rfl } + let : LocallyCompactSpace F := + (eCompletion.toHomeomorph.locallyCompactSpace_iff).2 + inferInstance + let : IsUltrametricDist F := + localizedCompletionIsUltrametricDist + vK w hvKna + let : Valued F ℝ≥0 := + localizedCompletionFinitePlaceValued + vK w hvKna + let : ValuativeRel F := + localizedCompletionFinitePlaceValuativeRel + vK w hvKna + let vFNorm : Valuation F ℝ≥0 := Valued.v + let : vFNorm.Compatible := + Valuation.Compatible.ofValuation vFNorm + let vF := ValuativeRel.valuation F + let : Valuation.HasExtension vC vF := + localizedCompletionValuationHasExtension + vK w hvKna + let : vF.IsNontrivial := + valuativeRelExtension_isNontrivial (C := C) (F := F) + let : ValuativeRel.IsNontrivial F := + (ValuativeRel.isNontrivial_iff_isNontrivial vF).2 + inferInstance + let : IsValuativeTopology F := + isValuativeTopology_of_valued_ofValuation F ℝ≥0 + let : IsNonarchimedeanLocalField F := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + let : Algebra 𝒪[C] F := + Algebra.ofSubsemiring 𝒪[C] + let := + localizedCompletionIsIntegralClosureWithExtension + vK w hvK hvKna + let : Module.Finite 𝒪[C] 𝒪[F] := + integerRing_moduleFinite_of_isIntegralClosure C F + have hbAbv : vK (b : K) = 1 := by + rw [HeightOneSpectrum.adicAbv_def, hb] + simp + have hnAbv : vK ((n : ℕ) : K) = 1 := by + rw [HeightOneSpectrum.adicAbv_def, hn] + simp + have hbNorm : + ‖algebraMap K C (b : K)‖ = 1 := by + calc + ‖algebraMap K C (b : K)‖ = vK (b : K) := + AbsoluteValue.completionAbsoluteValue_coe vK (b : K) + _ = 1 := hbAbv + let bC : C := algebraMap K C (b : K) + have hbCNorm : vCNorm bC = 1 := by + change ‖bC‖₊ = 1 + exact NNReal.eq (by simpa [bC] using hbNorm) + have hbCVal : vC bC = 1 := + (ValuativeRel.isEquiv vCNorm vC).eq_one_iff_eq_one.mp hbCNorm + have hnNorm : ‖((n : ℕ) : C)‖ = 1 := by + calc + ‖((n : ℕ) : C)‖ = + ‖algebraMap K C ((n : ℕ) : K)‖ := by + rw [map_natCast] + _ = vK ((n : ℕ) : K) := + AbsoluteValue.completionAbsoluteValue_coe vK ((n : ℕ) : K) + _ = 1 := hnAbv + let nC : C := (n : ℕ) + have hnCNorm : vCNorm nC = 1 := by + change ‖nC‖₊ = 1 + exact NNReal.eq (by simpa [nC] using hnNorm) + have hnCVal : vC nC = 1 := + (ValuativeRel.isEquiv vCNorm vC).eq_one_iff_eq_one.mp hnCNorm + let betaL : L := (beta : L) + let betaF : F := + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 betaL + have hbetaLpow : + betaL ^ (n : ℕ) = algebraMap K L (b : K) := + congrArg Units.val hbeta + have hbetaFpow : + betaF ^ (n : ℕ) = + algebraMap C F (algebraMap K C (b : K)) := by + have hmap := + congrArg + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2) + hbetaLpow + simpa only [betaF, map_pow, + AbsoluteValue.toAlgebraicLocalization_algebraMap] using hmap + have hbetaWpow : (w.1 betaL) ^ (n : ℕ) = 1 := by + calc + (w.1 betaL) ^ (n : ℕ) = w.1 (betaL ^ (n : ℕ)) := by + rw [map_pow] + _ = w.1 (algebraMap K L (b : K)) := by rw [hbetaLpow] + _ = vK (b : K) := w.2 (b : K) + _ = 1 := hbAbv + have hbetaW : w.1 betaL = 1 := + (pow_eq_one_iff_of_nonneg (w.1.nonneg betaL) n.ne_zero).mp + hbetaWpow + have hbetaNorm : ‖betaF‖ = 1 := by + change + AbsoluteValue.algebraicLocalizationAbsoluteValue + vK w.1 w.2 betaF = 1 + rw [ + AbsoluteValue.algebraicLocalizationAbsoluteValue_toAlgebraicLocalization, + hbetaW] + have hbetaFNorm : vFNorm betaF = 1 := by + change ‖betaF‖₊ = 1 + exact NNReal.eq hbetaNorm + have hbetaFVal : vF betaF = 1 := + (ValuativeRel.isEquiv vFNorm vF).eq_one_iff_eq_one.mp hbetaFNorm + have hglobal : IntermediateField.adjoin K {betaL} = ⊤ := by + simpa only [betaL] using hgen + have hR : IntermediateField.adjoin C {betaF} = ⊤ := by + simpa only [C, F, betaF] using + localizedCompletion_adjoin_image_eq_top_of_adjoin_eq_top + vK w betaL hglobal + have hgenF : Algebra.adjoin C {betaF} = ⊤ := by + apply + (IntermediateField.adjoin_simple_eq_top_iff_of_isAlgebraic + (Algebra.IsAlgebraic.isAlgebraic betaF)).mp + exact hR + change IsNonarchimedeanLocalField.IsUnramifiedValuedExtension C F + exact + isUnramifiedValuedExtension_of_unit_kummer_generator + n bC betaF hbCVal hnCVal hbetaFVal hbetaFpow hgenF + +open scoped Classical in +/-- A chosen simple Kummer extension is unramified at a finite place where its +radicand and exponent are units. This is the direct specialization of +the generated-extension derivative criterion above. -/ +theorem + chosenSimpleKummerExtension_chosenFinitePlaceIsUnramified_of_valuation_eq_one + (n : ℕ+) + (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (b : Kˣ) + (v : HeightOneSpectrum (𝓞 K)) + (hb : v.valuation K (b : K) = 1) + (hn : v.valuation K ((n : ℕ) : K) = 1) : + let L := chosenSimpleKummerExtension K n hnK b + letI : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + letI : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + letI : NumberField L := + NumberField.of_module_finite K L + ChosenFinitePlaceIsUnramified + (K := K) (L := L) v := by + let L := chosenSimpleKummerExtension K n hnK b + let : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let : NumberField L := + NumberField.of_module_finite K L + let beta : Lˣ := + chosenSimpleKummerRootUnit K n hnK b + apply + kummerGeneratedExtension_chosenFinitePlaceIsUnramified_of_valuation_eq_one + (K := K) (L := L) n b beta + · dsimp only [L, beta] + exact chosenSimpleKummerRootUnit_pow K n hnK b + · simpa [L, beta] using + chosenSimpleKummerExtension_adjoin_root_eq_top K n hnK b + · exact hb + · exact hn + +open scoped Classical in +/-- At every finite place above a base place where the radicand and exponent +are units, the chosen simple Kummer extension is globally unramified in the +ideal-theoretic sense. -/ +theorem + chosenSimpleKummerExtension_isUnramifiedAt_at_all_finitePlacesAbove_of_valuation_eq_one + (n : ℕ+) + (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (b : Kˣ) + (v : HeightOneSpectrum (𝓞 K)) + (hb : v.valuation K (b : K) = 1) + (hn : v.valuation K ((n : ℕ) : K) = 1) : + let L := chosenSimpleKummerExtension K n hnK b + letI : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + letI : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + letI : NumberField L := + NumberField.of_module_finite K L + ∀ P : HeightOneSpectrum (𝓞 L), + finitePlaceBelow (K := K) P = v → + Algebra.IsUnramifiedAt (𝓞 K) P.asIdeal := by + let L := chosenSimpleKummerExtension K n hnK b + let _ : FiniteDimensional K L := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let _ : IsAbelianGalois K L := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let _ : NumberField L := + NumberField.of_module_finite K L + have hunram : + ChosenFinitePlaceIsUnramified + (K := K) (L := L) v := by + simpa only [L] using + chosenSimpleKummerExtension_chosenFinitePlaceIsUnramified_of_valuation_eq_one + (K := K) n hnK hmu b v hb hn + change ∀ P : HeightOneSpectrum (𝓞 L), + finitePlaceBelow (K := K) P = v → + Algebra.IsUnramifiedAt (𝓞 K) P.asIdeal + intro P hP + exact + isUnramifiedAt_at_finitePlaceAbove_of_chosenFinitePlaceIsUnramified + (K := K) (L := L) (v := v) (P := P) + (hP := hP) (hunram := hunram) + +open scoped Classical in +/-- A finite place splits completely in the chosen simple Kummer extension when +the radicand is already an `n`-th power in the completion. This is the +finite-place splitting source used in the local splitting analysis of simple radical extensions. -/ +theorem + chosenSimpleKummerExtension_finitePlaceSplitsCompletely_of_mem_nthPowerSubgroup + (n : ℕ+) + (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (b : Kˣ) + (v : HeightOneSpectrum (𝓞 K)) + (hb : + Units.map + (algebraMap K (v.adicCompletion K)).toMonoidHom b ∈ + (powMonoidHom (n : ℕ) : + (v.adicCompletion K)ˣ →* + (v.adicCompletion K)ˣ).range) : + let E := chosenSimpleKummerExtension K n hnK b + letI : FiniteDimensional K E := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + letI : IsAbelianGalois K E := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + FinitePlaceSplitsCompletely + (K := K) (L := E) v := by + let E := chosenSimpleKummerExtension K n hnK b + let : FiniteDimensional K E := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let : IsAbelianGalois K E := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let beta : Eˣ := + chosenSimpleKummerRootUnit K n hnK b + have hbeta : + beta ^ (n : ℕ) = + Units.map (algebraMap K E).toMonoidHom b := by + dsimp only [E, beta] + exact chosenSimpleKummerRootUnit_pow K n hnK b + let D : Subgroup (E ≃ₐ[K] E) := + absoluteValueDecompositionGroup K + (chosenFinitePlaceExtension (L := E) v).1 + have hfixed : + (beta : E) ∈ + IntermediateField.fixedField D := by + simpa only [D] using + (finitePlaceKummerRadicand_mem_nthPowerSubgroup_iff_root_mem_decompositionFixedField + (K := K) (L := E) v n hmu b beta hbeta).mp hb + have hgen : + IntermediateField.adjoin K ({(beta : E)} : Set E) = ⊤ := by + simpa [E, beta] using + chosenSimpleKummerExtension_adjoin_root_eq_top K n hnK b + have hle : + IntermediateField.adjoin K ({(beta : E)} : Set E) ≤ + IntermediateField.fixedField D := by + apply IntermediateField.adjoin_le_iff.mpr + intro x hx + have hx' : x = (beta : E) := + Set.mem_singleton_iff.mp hx + subst x + exact hfixed + have htop : + IntermediateField.fixedField D = ⊤ := by + apply top_unique + rw [← hgen] + exact hle + change D = ⊥ + rw [← IntermediateField.fixingSubgroup_fixedField D, + htop, IntermediateField.fixingSubgroup_top] + +omit [NumberField K] in +open scoped Classical in +/-- The local Kummer root forces the infinite decomposition group to be trivial. -/ +private theorem + chosenSimpleKummerExtension_infiniteDecompositionGroup_eq_bot_of_mem_nthPowerSubgroup + (n : ℕ+) + (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (b : Kˣ) + (w : InfinitePlace K) + (hb : + Units.map + (algebraMap K w.Completion).toMonoidHom b ∈ + (powMonoidHom (n : ℕ) : + w.Completionˣ →* w.Completionˣ).range) : + let E := chosenSimpleKummerExtension K n hnK b + letI : FiniteDimensional K E := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + letI : IsAbelianGalois K E := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let vK : AbsoluteValue K ℝ := w.1 + let u : AbsoluteValueExtension vK E := + pullbackAbsoluteValueExtension vK w.isNontrivial IsAlgClosed.lift + absoluteValueDecompositionGroup K u.1 = ⊥ := by + let E := chosenSimpleKummerExtension K n hnK b + let : FiniteDimensional K E := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let : IsAbelianGalois K E := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let vK : AbsoluteValue K ℝ := w.1 + let hvK : vK.IsNontrivial := w.isNontrivial + let u : AbsoluteValueExtension vK E := + pullbackAbsoluteValueExtension + vK hvK IsAlgClosed.lift + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) u.1 + let : SMul K u.1.Completion := hK.toSMul + let : Algebra vK.Completion u.1.Completion := + AbsoluteValue.completionAlgebra vK u.1 u.2 + let := localizedCompletionGlobalAlgebra vK u + let := localizedCompletionIsScalarTower vK u + let C := vK.Completion + let F := LocalizedCompletion vK u + let eK : w.Completion ≃+* C := + (infinitePlaceCompletionAlgEquiv + (K := K) w).toRingEquiv + let eC : w.Completionˣ ≃* Cˣ := + Units.mapEquiv eK.toMulEquiv + let : FiniteDimensional C F := + localizedCompletionModuleFinite vK hvK u + let : IsGalois C F := + HilbertRamification.algebraicLocalization_isGalois vK u + let beta : Eˣ := + chosenSimpleKummerRootUnit K n hnK b + have hbeta : + beta ^ (n : ℕ) = + Units.map (algebraMap K E).toMonoidHom b := by + dsimp only [E, beta] + exact chosenSimpleKummerRootUnit_pow K n hnK b + have hbC : + Units.map + (algebraMap K C).toMonoidHom b ∈ + (powMonoidHom (n : ℕ) : Cˣ →* Cˣ).range := by + obtain ⟨y, hy⟩ := + (MonoidHom.mem_range + (G := w.Completionˣ)).mp hb + refine + (MonoidHom.mem_range + (G := Cˣ)).mpr ⟨eC y, ?_⟩ + rw [powMonoidHom_apply] at hy ⊢ + calc + (eC y) ^ (n : ℕ) = + eC (y ^ (n : ℕ)) := + (map_pow eC y (n : ℕ)).symm + _ = + eC + (Units.map + (algebraMap K w.Completion).toMonoidHom b) := + congrArg eC hy + _ = + Units.map + (algebraMap K C).toMonoidHom b := by + apply Units.ext + simpa [eC, eK, C, vK] using + (infinitePlaceCompletionAlgEquiv + (K := K) w).commutes (b : K) + have hfixed : + (beta : E) ∈ + IntermediateField.fixedField + (absoluteValueDecompositionGroup K u.1) := by + apply + kummerRadicand_root_mem_decompositionFixedField_of_mem_nthPowerSubgroup + (K := K) (L := E) vK hvK u n hmu b beta hbeta + exact hbC + let D : Subgroup (E ≃ₐ[K] E) := + absoluteValueDecompositionGroup K u.1 + have hgen : + IntermediateField.adjoin K ({(beta : E)} : Set E) = ⊤ := by + simpa [E, beta] using + chosenSimpleKummerExtension_adjoin_root_eq_top K n hnK b + have hle : + IntermediateField.adjoin K ({(beta : E)} : Set E) ≤ + IntermediateField.fixedField D := by + apply IntermediateField.adjoin_le_iff.mpr + intro x hx + have hx' : x = (beta : E) := + Set.mem_singleton_iff.mp hx + subst x + change + (beta : E) ∈ + IntermediateField.fixedField + (absoluteValueDecompositionGroup K u.1) + exact hfixed + have htop : + IntermediateField.fixedField D = ⊤ := by + apply top_unique + rw [← hgen] + exact hle + have hD : D = ⊥ := by + rw [← IntermediateField.fixingSubgroup_fixedField D, + htop, IntermediateField.fixingSubgroup_top] + exact hD + +omit [NumberField K] in +open scoped Classical in +/-- At an infinite place where the radicand is already an `n`-th +power, the determinant norm from the simple Kummer tensor algebra is +surjective. The proof identifies the decomposition group with the +trivial group and then uses the canonical local tensor norm theorem. -/ +theorem + chosenSimpleKummerExtension_infiniteTensorNormSubgroup_eq_top_of_mem_nthPowerSubgroup + (n : ℕ+) + (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (b : Kˣ) + (w : InfinitePlace K) + (hb : + Units.map + (algebraMap K w.Completion).toMonoidHom b ∈ + (powMonoidHom (n : ℕ) : + w.Completionˣ →* w.Completionˣ).range) : + let E := chosenSimpleKummerExtension K n hnK b + letI : FiniteDimensional K E := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + letI : IsAbelianGalois K E := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + infiniteTensorNormSubgroup + (K := K) (L := E) w = ⊤ := by + let E := chosenSimpleKummerExtension K n hnK b + let : FiniteDimensional K E := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let : IsAbelianGalois K E := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let vK : AbsoluteValue K ℝ := w.1 + let hvK : vK.IsNontrivial := w.isNontrivial + let u : AbsoluteValueExtension vK E := + pullbackAbsoluteValueExtension + vK hvK IsAlgClosed.lift + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) u.1 + let : SMul K u.1.Completion := hK.toSMul + let : Algebra vK.Completion u.1.Completion := + AbsoluteValue.completionAlgebra vK u.1 u.2 + let := localizedCompletionGlobalAlgebra vK u + let := localizedCompletionIsScalarTower vK u + let C := vK.Completion + let F := LocalizedCompletion vK u + let eK : w.Completion ≃+* C := + (infinitePlaceCompletionAlgEquiv + (K := K) w).toRingEquiv + let eC : w.Completionˣ ≃* Cˣ := + Units.mapEquiv eK.toMulEquiv + let : FiniteDimensional C F := + localizedCompletionModuleFinite vK hvK u + let : IsGalois C F := + HilbertRamification.algebraicLocalization_isGalois vK u + let D : Subgroup (E ≃ₐ[K] E) := + absoluteValueDecompositionGroup K u.1 + have hD : D = ⊥ := + chosenSimpleKummerExtension_infiniteDecompositionGroup_eq_bot_of_mem_nthPowerSubgroup + n hnK hmu b w hb + let eLocal : + D ≃* (F ≃ₐ[C] F) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK u + have hdegree : + Module.finrank C F = 1 := by + calc + Module.finrank C F = + Nat.card (F ≃ₐ[C] F) := + (IsGalois.card_aut_eq_finrank C F).symm + _ = Nat.card D := + (Nat.card_congr eLocal.toEquiv).symm + _ = 1 := by + rw [hD] + simp + let : Module.Free C F := + Module.Free.of_divisionRing C F + have hNormTop : + localNormSubgroup C F = ⊤ := by + apply top_unique + intro x _ + refine + ⟨Units.map (algebraMap C F).toMonoidHom x, ?_⟩ + apply Units.ext + change + Algebra.norm C (algebraMap C F (x : C)) = + (x : C) + rw [Algebra.norm_algebraMap, hdegree, pow_one] + have hLocalTensorTop : + localTensorNormSubgroup + (K := K) (L := E) vK = + ⊤ := by + rw [localTensorNormSubgroup_eq_localNormSubgroup + (K := K) (L := E) vK u hvK] + exact hNormTop + let eA : + (w.Completion ⊗[K] E) ≃+* + LocalTensorAlgebra (L := E) vK := + (infinitePlaceLocalTensorAlgEquiv + (K := K) (L := E) w).toRingEquiv + let eU : + (w.Completion ⊗[K] E)ˣ ≃* + (LocalTensorAlgebra (L := E) vK)ˣ := + infinitePlaceLocalTensorUnitsEquiv + (K := K) (L := E) w + have hnorm + (z : (w.Completion ⊗[K] E)ˣ) : + eC + (infiniteTensorDetNorm + (K := K) (L := E) w z) = + localTensorDetNorm + (K := K) (L := E) vK (eU z) := by + apply Units.ext + change + eK + (Algebra.norm w.Completion + (z : w.Completion ⊗[K] E)) = + Algebra.norm C + (eA (z : w.Completion ⊗[K] E)) + exact + _root_.map_norm_tensorProduct_baseChange + (K := K) (L := E) + (infinitePlaceCompletionAlgEquiv + (K := K) w).toAlgHom + (z : w.Completion ⊗[K] E) + apply top_unique + intro x _ + have hx : + eC x ∈ + localTensorNormSubgroup + (K := K) (L := E) vK := by + rw [hLocalTensorTop] + trivial + obtain ⟨z, hz⟩ := hx + refine ⟨eU.symm z, ?_⟩ + apply eC.injective + rw [hnorm, eU.apply_symm_apply, hz] + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory.lean new file mode 100644 index 0000000000..be4278545a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/All.lean new file mode 100644 index 0000000000..c7e588b6b4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/All.lean @@ -0,0 +1,46 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.All +/-! +# Local class field theory + +This is the canonical root of the complete local class field theory library. +It reaches every supported implementation layer. Clients that need a smaller +dependency closure should import the semantic owner aggregate for the result +they use: + +- `LocalClassFieldTheory.Finite.LocalReciprocity` for finite reciprocity; +- `LocalClassFieldTheory.Finite.Existence` for finite existence; +- `LocalClassFieldTheory.Infinite` for absolute and profinite reciprocity; +- `LocalClassFieldTheory.Kummer` for the local Kummer pairing; +- `LocalClassFieldTheory.LubinTateApplication` for Lubin--Tate applications. + +The principal declarations live in the `LocalClassFieldTheory` namespace. +The abstract class-formation layer uses the `ClassFormation` namespace. + +## Headline API + +The finite reciprocity isomorphism and continuous Artin map: +- `LocalClassFieldTheory.localReciprocityEquiv` +- `LocalClassFieldTheory.localArtinMap` +- `LocalClassFieldTheory.localArtinMap_surjective` +- `LocalClassFieldTheory.localArtinMap_ker` + +Finite local existence: +- `LocalClassFieldTheory.finiteAbelianNormSubgroupOrderIso` + +Absolute and profinite reciprocity: +- `LocalClassFieldTheory.absoluteLocalArtinMap` +- `LocalClassFieldTheory.profiniteLocalReciprocity` +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation.lean new file mode 100644 index 0000000000..a068819dff --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation.lean @@ -0,0 +1,33 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanHilbert90 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.CohomologyBridge +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FieldUnitsHerbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FilteredLiftingSequence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Hilbert90 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.IntegerUnitsHerbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Main +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasis +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisCohomology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisFiniteQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGaloisAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGradedLifting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisInfiniteProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisRecursiveLifting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.PrincipalUnitGraded +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValuationHerbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValueGroupCohomology + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/All.lean new file mode 100644 index 0000000000..7d4e91650f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/All.lean @@ -0,0 +1,36 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanHilbert90 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.CohomologyBridge +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FieldUnitsHerbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FilteredLiftingSequence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Hilbert90 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.IntegerUnitsHerbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Main +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasis +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisCohomology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisFiniteQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGaloisAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGradedLifting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisInfiniteProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisRecursiveLifting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.PrincipalUnitGraded +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValuationHerbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValueGroupCohomology +/-! +# The local class formation + +Public aggregate for the normal-basis, unit-filtration, valuation, and +cohomology calculations establishing the local class-field axiom. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanHilbert90.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanHilbert90.lean new file mode 100644 index 0000000000..55bddb314e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanHilbert90.lean @@ -0,0 +1,184 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.GaloisCohomology +/-! +# The Hilbert-90 half of the local class-field axiom at every place + +The degree-minus-one assertion for the archimedean local block is independent of +the nonarchimedean local reciprocity theorem. It follows directly from +Hilbert 90 for the algebraic localization, and therefore applies also +at archimedean places. +-/ + +@[expose] public section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open CyclicCohomology +open CyclicCohomology.ProfiniteCohomology.Herbrand + +noncomputable +section + +namespace LocalClassFieldTheory + +variable {K L : Type} + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- Hilbert 90 makes the local `H⁻¹` group trivial for an arbitrary +nontrivial absolute value, including an infinite place. -/ +theorem localHerbrandHMinusOne_subsingleton + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + letI hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := localizedCompletionGlobalAlgebra vK w + letI := localizedCompletionIsScalarTower vK w + letI : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + letI : IsGalois vK.Completion + (LocalizedCompletion vK w) := + HilbertRamification.algebraicLocalization_isGalois vK w + letI : Fintype (absoluteValueDecompositionGroup K w.1) := + Fintype.ofFinite _ + letI := + decompositionGroupLocalUnitsAction vK hvK w + Subsingleton + (HerbrandHMinusOne + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion vK w)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K w.1) + σ hgen)) := by + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let := localizedCompletionGlobalAlgebra vK w + let := localizedCompletionIsScalarTower vK w + let : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + let : IsGalois vK.Completion + (LocalizedCompletion vK w) := + HilbertRamification.algebraicLocalization_isGalois vK w + let : Fintype (absoluteValueDecompositionGroup K w.1) := + Fintype.ofFinite _ + let := + decompositionGroupLocalUnitsAction vK hvK w + let E := + localHerbrandHMinusOneEquivUnitsTateHminusOne + vK hvK w σ hgen + let g := + localizedCompletionGaloisGenerator + vK hvK w σ hgen + let hg := + localizedCompletionGaloisGenerator_generates + vK hvK w σ hgen + have hzero : + CategoryTheory.Limits.IsZero + (tateCohomology + (Rep.ofAlgebraAutOnUnits vK.Completion + (LocalizedCompletion vK w)) (-1)) := + hilbert90_unitsTateHminusOne_isZero + vK.Completion (LocalizedCompletion vK w) g hg + let : + Subsingleton + (tateCohomology + (Rep.ofAlgebraAutOnUnits vK.Completion + (LocalizedCompletion vK w)) (-1)) := + ModuleCat.subsingleton_of_isZero hzero + exact + ⟨fun x y => + E.injective (Subsingleton.elim (E x) (E y))⟩ + +/-- The same universal Hilbert-90 conclusion as a finite-cardinality +statement. -/ +theorem localHerbrandHMinusOne_card_eq_one_of_absoluteValue + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + letI hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := localizedCompletionGlobalAlgebra vK w + letI := localizedCompletionIsScalarTower vK w + letI : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + letI : IsGalois vK.Completion + (LocalizedCompletion vK w) := + HilbertRamification.algebraicLocalization_isGalois vK w + letI : Fintype (absoluteValueDecompositionGroup K w.1) := + Fintype.ofFinite _ + letI := + decompositionGroupLocalUnitsAction vK hvK w + Nat.card + (HerbrandHMinusOne + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion vK w)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K w.1) + σ hgen)) = 1 := by + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let := localizedCompletionGlobalAlgebra vK w + let := localizedCompletionIsScalarTower vK w + let : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + let : IsGalois vK.Completion + (LocalizedCompletion vK w) := + HilbertRamification.algebraicLocalization_isGalois vK w + let : Fintype (absoluteValueDecompositionGroup K w.1) := + Fintype.ofFinite _ + let := + decompositionGroupLocalUnitsAction vK hvK w + let : + Subsingleton + (HerbrandHMinusOne + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion vK w)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K w.1) + σ hgen)) := + localHerbrandHMinusOne_subsingleton + vK hvK w σ hgen + exact Nat.card_unique + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanNormQuotient.lean new file mode 100644 index 0000000000..6af3896bb0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanNormQuotient.lean @@ -0,0 +1,911 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanHilbert90 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.InfinitePlaceTensorBlock +public import Mathlib.Basic.Real.Sign +public import Mathlib.NumberTheory.NumberField.Completion.Ramification +public import Mathlib.RingTheory.Complex +/-! +# The real/complex norm quotient + +At a ramified infinite place the local extension is `ℂ/ℝ`. Its norm +subgroup consists exactly of the positive real units, so the sign map +identifies the norm quotient with `ℤˣ`, a group of order two. +-/ + +@[expose] public section + +open LocalFieldTheory +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology + +noncomputable +section + +namespace LocalClassFieldTheory + +universe u v w z + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open NumberField +open scoped NumberField.LiesOver + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +open scoped Classical in +/-- An infinite place above another one, written in the absolute-value +extension format used by the algebraic-localization API. -/ +def infinitePlaceAbsoluteValueExtension + (v : InfinitePlace K) (w : InfinitePlace L) + (hw : w.comap (algebraMap K L) = v) : + AbsoluteValueExtension v.1 L := + ⟨w.1, fun x => + congrArg + (fun q : InfinitePlace K => q.1 x) hw⟩ + +open scoped Classical in +/-- The underlying absolute-value completion of a real infinite place +is the real numbers. -/ +def absoluteCompletionRingEquivReal + (v : InfinitePlace K) (hv : v.IsReal) : + v.1.Completion ≃+* ℝ := + (InfinitePlace.Completion.equiv v).symm.trans + (InfinitePlace.Completion.ringEquivRealOfIsReal hv) + +open scoped Classical in +/-- The underlying absolute-value completion of a complex infinite +place is the complex numbers. -/ +def absoluteCompletionRingEquivComplex + (v : InfinitePlace K) (hv : v.IsComplex) : + v.1.Completion ≃+* ℂ := + (InfinitePlace.Completion.equiv v).symm.trans + (InfinitePlace.Completion.ringEquivComplexOfIsComplex hv) + +omit [NumberField K] [NumberField L] [FiniteDimensional K L] + [IsGalois K L] in +open scoped Classical in +/-- For an infinite place, the absolute-value decomposition +group is the ordinary Galois stabilizer of that place. -/ +theorem absoluteValueDecompositionGroup_eq_infinitePlaceStabilizer + (w : InfinitePlace L) : + absoluteValueDecompositionGroup K w.1 = + MulAction.stabilizer (L ≃ₐ[K] L) w := by + ext σ + constructor + · intro hσ + have hσi : + σ⁻¹ ∈ absoluteValueDecompositionGroup K w.1 := + (absoluteValueDecompositionGroup K w.1).inv_mem hσ + rw [mem_absoluteValueDecompositionGroup_iff_equivalent, + LubinTate.Valuations.equivalentAbsoluteValues_iff_isEquiv] at hσi + rw [MulAction.mem_stabilizer_iff] + apply + (InfinitePlace.eq_iff_isEquiv + (w := σ • w) (v := w)).2 + exact hσi + · intro hσ + rw [MulAction.mem_stabilizer_iff] at hσ + have hσi : + σ⁻¹ ∈ absoluteValueDecompositionGroup K w.1 := by + rw [mem_absoluteValueDecompositionGroup_iff_equivalent, + LubinTate.Valuations.equivalentAbsoluteValues_iff_isEquiv] + exact + (InfinitePlace.eq_iff_isEquiv + (w := σ • w) (v := w)).1 hσ + simpa using + (absoluteValueDecompositionGroup K w.1).inv_mem hσi + +open scoped Classical in +/-- Field norms commute with compatible changes of both the base and +extension fields. -/ +theorem normUnits_map_ringEquiv + {K : Type u} {L : Type v} {K' : Type w} {L' : Type z} + [Field K] [Field L] [Field K'] [Field L'] + [Algebra K L] [Algebra K' L'] + (eK : K ≃+* K') (eL : L ≃+* L') + (he : + RingHom.comp (algebraMap K' L') eK = + RingHom.comp eL (algebraMap K L)) + (x : Lˣ) : + Units.mapEquiv eK.toMulEquiv (normUnits K L x) = + normUnits K' L' + (Units.mapEquiv eL.toMulEquiv x) := by + apply Units.ext + change + eK (Algebra.norm K (x : L)) = + Algebra.norm K' (eL (x : L)) + rw [Algebra.norm_eq_of_equiv_equiv eK eL he] + exact eK.apply_symm_apply _ + +open scoped Classical in +/-- Compatibility of a square of ring equivalences is symmetric. -/ +theorem ringEquiv_compat_symm + {K : Type u} {L : Type v} {K' : Type w} {L' : Type z} + [Field K] [Field L] [Field K'] [Field L'] + [Algebra K L] [Algebra K' L'] + (eK : K ≃+* K') (eL : L ≃+* L') + (he : + RingHom.comp (algebraMap K' L') eK = + RingHom.comp eL (algebraMap K L)) : + RingHom.comp (algebraMap K L) eK.symm = + RingHom.comp eL.symm (algebraMap K' L') := by + ext x + apply eL.injective + have hx := DFunLike.congr_fun he (eK.symm x) + simpa using hx.symm + +open scoped Classical in +/-- A compatible pair of field equivalences induces a map of norm +quotients. -/ +def normQuotientMapOfRingEquiv + {K L K' L' : Type} + [Field K] [Field L] [Field K'] [Field L'] + [Algebra K L] [Algebra K' L'] + (eK : K ≃+* K') (eL : L ≃+* L') + (he : + RingHom.comp (algebraMap K' L') eK = + RingHom.comp eL (algebraMap K L)) : + NormQuotient K L →* NormQuotient K' L' := + normQuotientLift + ((normClass K' L').comp + (Units.mapEquiv eK.toMulEquiv).toMonoidHom) + (by + rintro x ⟨y, rfl⟩ + rw [MonoidHom.mem_ker] + change + normClass K' L' + (Units.mapEquiv eK.toMulEquiv + (normUnits K L y)) = 1 + rw [normUnits_map_ringEquiv eK eL he] + exact mk_normUnits_eq_one K' L' + (Units.mapEquiv eL.toMulEquiv y)) + +open scoped Classical in +/-- Transporting a norm class through compatible field equivalences agrees +with transporting its representative unit. -/ +@[simp] +theorem normQuotientMapOfRingEquiv_normClass + {K L K' L' : Type} + [Field K] [Field L] [Field K'] [Field L'] + [Algebra K L] [Algebra K' L'] + (eK : K ≃+* K') (eL : L ≃+* L') + (he : + RingHom.comp (algebraMap K' L') eK = + RingHom.comp eL (algebraMap K L)) + (x : Kˣ) : + normQuotientMapOfRingEquiv eK eL he + (normClass K L x) = + normClass K' L' + (Units.mapEquiv eK.toMulEquiv x) := + normQuotientLift_normClass _ _ x + +open scoped Classical in +/-- Norm quotients are invariant under compatible equivalences of the +base and extension fields. -/ +def normQuotientEquivOfRingEquiv + {K L K' L' : Type} + [Field K] [Field L] [Field K'] [Field L'] + [Algebra K L] [Algebra K' L'] + (eK : K ≃+* K') (eL : L ≃+* L') + (he : + RingHom.comp (algebraMap K' L') eK = + RingHom.comp eL (algebraMap K L)) : + NormQuotient K L ≃* NormQuotient K' L' where + toFun := normQuotientMapOfRingEquiv eK eL he + invFun := + normQuotientMapOfRingEquiv eK.symm eL.symm + (ringEquiv_compat_symm eK eL he) + left_inv q := by + refine NormQuotient.inductionOn + (motive := fun q => + normQuotientMapOfRingEquiv eK.symm eL.symm + (ringEquiv_compat_symm eK eL he) + (normQuotientMapOfRingEquiv eK eL he q) = + q) + q ?_ + intro x + rw [normQuotientMapOfRingEquiv_normClass, + normQuotientMapOfRingEquiv_normClass] + congr 1 + exact (Units.mapEquiv eK.toMulEquiv).symm_apply_apply x + right_inv q := by + refine NormQuotient.inductionOn + (motive := fun q => + normQuotientMapOfRingEquiv eK eL he + (normQuotientMapOfRingEquiv eK.symm eL.symm + (ringEquiv_compat_symm eK eL he) q) = + q) + q ?_ + intro x + rw [normQuotientMapOfRingEquiv_normClass, + normQuotientMapOfRingEquiv_normClass] + congr 1 + exact (Units.mapEquiv eK.toMulEquiv).apply_symm_apply x + map_mul' := fun x y => + map_mul (normQuotientMapOfRingEquiv eK eL he) x y + +open scoped Classical in +/-- A one-element acting group has trivial degree-zero Herbrand +cohomology. -/ +theorem herbrandH0_card_eq_one_of_group_card_eq_one + {G A : Type*} + [Group G] [Fintype G] + [CommGroup A] [MulDistribMulAction G A] + (hG : Nat.card G = 1) : + Nat.card (HerbrandH0 G A) = 1 := by + let : Subsingleton G := + (Nat.card_eq_one_iff_unique.mp hG).1 + let : Subsingleton (HerbrandH0 G A) := + herbrandH0_subsingleton_of_fixed_le_tateNormSubgroup + (G := G) (A := A) (by + intro a ha + refine ⟨a, ?_⟩ + rw [tateNormHom_apply] + unfold tateNorm + classical + have huniv : (Finset.univ : Finset G) = {1} := by + ext g + simp [Subsingleton.elim g 1] + rw [huniv] + simp) + exact Nat.card_unique + +open scoped Classical in +/-- At a complex place above a real place, the completion norm quotient +is the concrete quotient for `ℂ/ℝ`. -/ +def infiniteCompletionNormQuotientEquivRealComplex + (v : InfinitePlace K) (w : InfinitePlace L) + (hw : w.comap (algebraMap K L) = v) + (hv : v.IsReal) (hwc : w.IsComplex) : + letI : w.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) hw⟩ + NormQuotient v.Completion w.Completion ≃* + NormQuotient ℝ ℂ := by + letI : w.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) hw⟩ + letI : + NumberField.ComplexEmbedding.LiesOver + (InfinitePlace.Completion.extensionEmbedding w) + (InfinitePlace.Completion.extensionEmbedding v) := + InfinitePlace.LiesOver.extensionEmbedding_liesOver_of_isReal + w hv + exact + normQuotientEquivOfRingEquiv + (InfinitePlace.Completion.ringEquivRealOfIsReal hv) + (InfinitePlace.Completion.ringEquivComplexOfIsComplex hwc) + (by ext; simp) + +open scoped Classical in +/-- The algebraic localization used in the local cohomology block is +canonically the whole absolute-value completion, also at an infinite +place. -/ +def localizedCompletionNormQuotientEquivAbsoluteCompletions + (v : InfinitePlace K) (w : InfinitePlace L) + (hw : w.comap (algebraMap K L) = v) : + let u := + infinitePlaceAbsoluteValueExtension v w hw + letI hL := + AbsoluteValue.extensionCompletionAlgebra + (K := K) u.1 + letI : SMul K u.1.Completion := hL.toSMul + letI : Algebra v.1.Completion u.1.Completion := + AbsoluteValue.completionAlgebra v.1 u.1 u.2 + letI : Algebra v.1.Completion w.1.Completion := + AbsoluteValue.completionAlgebra v.1 w.1 + (infinitePlaceAbsoluteValueExtension v w hw).2 + NormQuotient v.1.Completion + (LocalizedCompletion v.1 u) ≃* + NormQuotient v.1.Completion w.1.Completion := by + let u := + infinitePlaceAbsoluteValueExtension v w hw + letI hL := + AbsoluteValue.extensionCompletionAlgebra + (K := K) u.1 + letI : SMul K u.1.Completion := hL.toSMul + letI : Algebra v.1.Completion u.1.Completion := + AbsoluteValue.completionAlgebra v.1 u.1 u.2 + letI : Algebra v.1.Completion w.1.Completion := + AbsoluteValue.completionAlgebra v.1 w.1 + (infinitePlaceAbsoluteValueExtension v w hw).2 + let eLAlg : + LocalizedCompletion v.1 u ≃ₐ[v.1.Completion] + w.1.Completion := + localizedCompletionEquivCompletion + v.1 v.isNontrivial u + let eL : LocalizedCompletion v.1 u ≃+* w.1.Completion := + eLAlg.toRingEquiv + exact + normQuotientEquivOfRingEquiv + (RingEquiv.refl v.1.Completion) eL + (by + ext x + exact eLAlg.commutes x) + +open scoped Classical in +/-- Written using the underlying absolute-value completions, the norm +quotient at a complex place above a real place is again the concrete +quotient for `ℂ/ℝ`. -/ +def absoluteCompletionNormQuotientEquivRealComplex + (v : InfinitePlace K) (w : InfinitePlace L) + (hw : w.comap (algebraMap K L) = v) + (hv : v.IsReal) (hwc : w.IsComplex) : + let u := + infinitePlaceAbsoluteValueExtension v w hw + letI hL := + AbsoluteValue.extensionCompletionAlgebra + (K := K) u.1 + letI : SMul K u.1.Completion := hL.toSMul + letI : Algebra v.1.Completion u.1.Completion := + AbsoluteValue.completionAlgebra v.1 u.1 u.2 + letI : Algebra v.1.Completion w.1.Completion := + AbsoluteValue.completionAlgebra v.1 w.1 + (infinitePlaceAbsoluteValueExtension v w hw).2 + NormQuotient v.1.Completion w.1.Completion ≃* + NormQuotient ℝ ℂ := by + let u := + infinitePlaceAbsoluteValueExtension v w hw + letI hL := + AbsoluteValue.extensionCompletionAlgebra + (K := K) u.1 + letI : SMul K u.1.Completion := hL.toSMul + letI : Algebra v.1.Completion u.1.Completion := + AbsoluteValue.completionAlgebra v.1 u.1 u.2 + letI : Algebra v.1.Completion w.1.Completion := + AbsoluteValue.completionAlgebra v.1 w.1 + (infinitePlaceAbsoluteValueExtension v w hw).2 + letI : w.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) hw⟩ + have hEmbedding : + w.embedding.comp (algebraMap K L) = + v.embedding := + (InfinitePlace.LiesOver.embedding_liesOver_of_isReal + w hv).over + have hCompletionEmbedding : + ∀ x : v.1.Completion, + InfinitePlace.Completion.extensionEmbedding w + ((InfinitePlace.Completion.equiv w).symm + (AbsoluteValue.completionMap + v.1 w.1 + (infinitePlaceAbsoluteValueExtension + v w hw).2 x)) = + InfinitePlace.Completion.extensionEmbedding v + ((InfinitePlace.Completion.equiv v).symm x) := by + intro x + refine + UniformSpace.Completion.induction_on + (α := WithAbs v.1) x ?_ ?_ + · exact + isClosed_eq + ((InfinitePlace.Completion.isometry_extensionEmbedding + w).continuous.comp + ((InfinitePlace.Completion.continuous_ofCompletion + w).comp + (AbsoluteValue.completionMap_isometry + v.1 w.1 + (infinitePlaceAbsoluteValueExtension + v w hw).2).continuous)) + ((InfinitePlace.Completion.isometry_extensionEmbedding + v).continuous.comp + (InfinitePlace.Completion.continuous_ofCompletion v)) + · intro y + have hy : + (y : v.1.Completion) = + algebraMap K v.1.Completion + (WithAbs.equiv v.1 y) := by + rw [← AbsoluteValue.toCompletion_eq_algebraMap] + simp + have hmap : + AbsoluteValue.completionMap v.1 w.1 + (infinitePlaceAbsoluteValueExtension v w hw).2 + (y : v.1.Completion) = + AbsoluteValue.toCompletion w.1 + (algebraMap K L (WithAbs.equiv v.1 y)) := + (congrArg + (AbsoluteValue.completionMap v.1 w.1 + (infinitePlaceAbsoluteValueExtension v w hw).2) hy).trans + (AbsoluteValue.completionMap_coe v.1 w.1 + (infinitePlaceAbsoluteValueExtension v w hw).2 + (WithAbs.equiv v.1 y)) + have hwEmbedding : + InfinitePlace.Completion.extensionEmbedding w + ((InfinitePlace.Completion.equiv w).symm + (AbsoluteValue.toCompletion w.1 + (algebraMap K L (WithAbs.equiv v.1 y)))) = + w.embedding (algebraMap K L (WithAbs.equiv v.1 y)) := + (InfinitePlace.Completion.extensionEmbedding_coe w + ((WithAbs.equiv w.1).symm + (algebraMap K L (WithAbs.equiv v.1 y)))).trans + (congrArg w.embedding + ((WithAbs.equiv w.1).apply_symm_apply + (algebraMap K L (WithAbs.equiv v.1 y)))) + exact + (congrArg (fun z : w.1.Completion => + InfinitePlace.Completion.extensionEmbedding w + ((InfinitePlace.Completion.equiv w).symm z)) hmap).trans + (hwEmbedding.trans + ((DFunLike.congr_fun hEmbedding (WithAbs.equiv v.1 y)).trans + (InfinitePlace.Completion.extensionEmbedding_coe v y).symm)) + exact + normQuotientEquivOfRingEquiv + (absoluteCompletionRingEquivReal v hv) + (absoluteCompletionRingEquivComplex w hwc) + (by + ext x + exact + (InfinitePlace.Completion.extensionEmbeddingOfIsReal_apply hv + ((InfinitePlace.Completion.equiv v).symm x)).trans + (hCompletionEmbedding x).symm) + +open scoped Classical in +/-- The sign of a nonzero real number, regarded as an integral unit. -/ +def realUnitsSign : ℝˣ →* ℤˣ := + Units.map + ((SignType.castHom (α := ℤ)).comp + (signHom (α := ℝ))) + +open scoped Classical in +/-- Coercing `realUnitsSign x` to an integer recovers the usual sign of +the underlying nonzero real number. -/ +@[simp] +theorem realUnitsSign_coe (x : ℝˣ) : + ((realUnitsSign x : ℤˣ) : ℤ) = + (SignType.sign (x : ℝ) : ℤ) := + rfl + +open scoped Classical in +/-- Both integral signs occur. -/ +theorem realUnitsSign_surjective : + Function.Surjective realUnitsSign := by + intro u + rcases Int.units_eq_one_or u with rfl | rfl + · exact ⟨1, by simp [realUnitsSign]⟩ + · exact ⟨-1, by + apply Units.ext + simp [realUnitsSign]⟩ + +open scoped Classical in +/-- A nonzero real unit has trivial sign precisely when it is positive. -/ +theorem mem_realUnitsSign_ker_iff (x : ℝˣ) : + x ∈ realUnitsSign.ker ↔ 0 < (x : ℝ) := by + rw [MonoidHom.mem_ker] + constructor + · intro hx + have hxv := congrArg Units.val hx + have hs : SignType.sign (x : ℝ) = 1 := by + cases hsign : SignType.sign (x : ℝ) <;> + simp [realUnitsSign_coe, hsign] at hxv ⊢ + exact sign_eq_one_iff.mp hs + · intro hx + apply Units.ext + simp [realUnitsSign, sign_pos hx] + +open scoped Classical in +/-- The sign homomorphism is continuous for the native topology on +real units and the discrete topology on `ℤˣ`. -/ +@[fun_prop] +theorem realUnitsSign_continuous : + Continuous realUnitsSign := by + apply continuous_of_continuousAt_one _ + rw [continuousAt_def, map_one] + intro V hV + have hposOpen : + IsOpen {x : ℝˣ | 0 < (x : ℝ)} := + isOpen_Ioi.preimage Units.continuous_val + have hposOne : + (1 : ℝˣ) ∈ {x : ℝˣ | 0 < (x : ℝ)} := by + norm_num + apply Filter.mem_of_superset (hposOpen.mem_nhds hposOne) + intro x hx + have hsign : realUnitsSign x = 1 := + MonoidHom.mem_ker.mp + ((mem_realUnitsSign_ker_iff x).2 hx) + change realUnitsSign x ∈ V + rw [hsign] + exact mem_of_mem_nhds hV + +open scoped Classical in +/-- The norms from `ℂˣ` are precisely the positive real units. -/ +theorem realUnitsSign_ker_eq_complexNormSubgroup : + realUnitsSign.ker = localNormSubgroup ℝ ℂ := by + ext x + rw [mem_realUnitsSign_ker_iff] + change 0 < (x : ℝ) ↔ + ∃ u : ℂˣ, normUnits ℝ ℂ u = x + constructor + · intro hx + let z : ℂ := + (Real.sqrt (x : ℝ) : ℝ) + have hz : z ≠ 0 := by + exact Complex.ofReal_ne_zero.mpr + (ne_of_gt (Real.sqrt_pos.2 hx)) + let u : ℂˣ := Units.mk0 z hz + refine ⟨u, ?_⟩ + apply Units.ext + change Algebra.norm ℝ (u : ℂ) = (x : ℝ) + rw [Algebra.norm_complex_apply] + simpa [u, z, Complex.normSq_ofReal] using + Real.mul_self_sqrt hx.le + · rintro ⟨u, rfl⟩ + change 0 < Algebra.norm ℝ (u : ℂ) + rw [Algebra.norm_complex_apply, Complex.normSq_pos] + exact Units.ne_zero u + +open scoped Classical in +/-- The norm quotient for `ℂ/ℝ` is the two-element sign group. -/ +def realComplexNormQuotientEquivSign : + NormQuotient ℝ ℂ ≃* ℤˣ := + normQuotientEquivOfSurjective + realUnitsSign + realUnitsSign_surjective + realUnitsSign_ker_eq_complexNormSubgroup + +open scoped Classical in +/-- The real/complex norm quotient is finite via its equivalence with +the integral sign group. -/ +noncomputable instance realComplexNormQuotientFinite : + Finite (NormQuotient ℝ ℂ) := + Finite.of_equiv ℤˣ + realComplexNormQuotientEquivSign.symm.toEquiv + +open scoped Classical in +/-- The real/complex local norm quotient has order two. -/ +theorem realComplexNormQuotient_card_eq_two : + Nat.card (NormQuotient ℝ ℂ) = 2 := by + rw [Nat.card_congr realComplexNormQuotientEquivSign.toEquiv, + Nat.card_eq_fintype_card, Fintype.card_units_int] + +omit [NumberField L] in +omit [NumberField L] in +open scoped Classical in +/-- The degree-zero local Herbrand group at an infinite place has +cardinality equal to the archimedean local degree: one at an +unramified place and two at a ramified real-to-complex place. -/ +theorem infinitePlaceLocalHerbrandH0_card_eq_localDegree + (v : InfinitePlace K) (w : InfinitePlace L) + (hw : w.comap (algebraMap K L) = v) : + let u := + infinitePlaceAbsoluteValueExtension v w hw + letI hL := + AbsoluteValue.extensionCompletionAlgebra + (K := K) u.1 + letI : SMul K u.1.Completion := hL.toSMul + letI : Algebra v.1.Completion u.1.Completion := + AbsoluteValue.completionAlgebra v.1 u.1 u.2 + letI := localizedCompletionGlobalAlgebra v.1 u + letI := localizedCompletionIsScalarTower v.1 u + letI : FiniteDimensional v.1.Completion + (LocalizedCompletion v.1 u) := + localizedCompletionModuleFinite v.1 v.isNontrivial u + letI : IsGalois v.1.Completion + (LocalizedCompletion v.1 u) := + HilbertRamification.algebraicLocalization_isGalois v.1 u + letI : Fintype (absoluteValueDecompositionGroup K w.1) := + Fintype.ofFinite _ + letI : MulDistribMulAction + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion v.1 u)ˣ := + decompositionGroupLocalUnitsAction + v.1 v.isNontrivial u + Nat.card + (HerbrandH0 + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion v.1 u)ˣ) = + if w.IsUnramified K then 1 else 2 := by + let u := + infinitePlaceAbsoluteValueExtension v w hw + let hL := + AbsoluteValue.extensionCompletionAlgebra + (K := K) u.1 + let : SMul K u.1.Completion := hL.toSMul + let : Algebra v.1.Completion u.1.Completion := + AbsoluteValue.completionAlgebra v.1 u.1 u.2 + let := localizedCompletionGlobalAlgebra v.1 u + let := localizedCompletionIsScalarTower v.1 u + let : FiniteDimensional v.1.Completion + (LocalizedCompletion v.1 u) := + localizedCompletionModuleFinite v.1 v.isNontrivial u + let : IsGalois v.1.Completion + (LocalizedCompletion v.1 u) := + HilbertRamification.algebraicLocalization_isGalois v.1 u + let : Fintype (absoluteValueDecompositionGroup K w.1) := + Fintype.ofFinite _ + let : MulDistribMulAction + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion v.1 u)ˣ := + decompositionGroupLocalUnitsAction + v.1 v.isNontrivial u + by_cases hUnramified : w.IsUnramified K + · rw [ite_eq_left hUnramified] + apply herbrandH0_card_eq_one_of_group_card_eq_one + rw [absoluteValueDecompositionGroup_eq_infinitePlaceStabilizer w, + InfinitePlace.card_stabilizer, ite_eq_left hUnramified] + · rw [ite_eq_right hUnramified] + have hRamified : w.IsRamified K := hUnramified + have hvReal : v.IsReal := by + rw [← hw] + exact hRamified.isReal + have hwComplex : w.IsComplex := + hRamified.isComplex + let eH0 := + localHerbrandH0EquivNormQuotient + v.1 v.isNontrivial u + let eCompletion := + localizedCompletionNormQuotientEquivAbsoluteCompletions + v w hw + let eRealComplex := + absoluteCompletionNormQuotientEquivRealComplex + v w hw hvReal hwComplex + calc + Nat.card + (HerbrandH0 + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion v.1 u)ˣ) = + Nat.card (NormQuotient ℝ ℂ) := + Nat.card_congr + (eH0.trans + (eCompletion.trans eRealComplex)).toEquiv + _ = 2 := realComplexNormQuotient_card_eq_two + +omit [NumberField L] in +open scoped Classical in +/-- Complete archimedean local class-field axiom, in the exact form +used in the relative-idele Herbrand quotient: Hilbert 90 gives +`#H⁻¹ = 1`, while the norm quotient gives the local degree in `H⁰`. -/ +theorem infinitePlaceLocalClassAxiom_cards + (v : InfinitePlace K) (w : InfinitePlace L) + (hw : w.comap (algebraMap K L) = v) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + let u := + infinitePlaceAbsoluteValueExtension v w hw + letI hL := + AbsoluteValue.extensionCompletionAlgebra + (K := K) u.1 + letI : SMul K u.1.Completion := hL.toSMul + letI : Algebra v.1.Completion u.1.Completion := + AbsoluteValue.completionAlgebra v.1 u.1 u.2 + letI := localizedCompletionGlobalAlgebra v.1 u + letI := localizedCompletionIsScalarTower v.1 u + letI : FiniteDimensional v.1.Completion + (LocalizedCompletion v.1 u) := + localizedCompletionModuleFinite v.1 v.isNontrivial u + letI : IsGalois v.1.Completion + (LocalizedCompletion v.1 u) := + HilbertRamification.algebraicLocalization_isGalois v.1 u + letI : Fintype (absoluteValueDecompositionGroup K w.1) := + Fintype.ofFinite _ + letI : MulDistribMulAction + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion v.1 u)ˣ := + decompositionGroupLocalUnitsAction + v.1 v.isNontrivial u + Nat.card + (HerbrandHMinusOne + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion v.1 u)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K w.1) + σ hgen)) = 1 ∧ + Nat.card + (HerbrandH0 + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion v.1 u)ˣ) = + if w.IsUnramified K then 1 else 2 := by + let u := + infinitePlaceAbsoluteValueExtension v w hw + let hL := + AbsoluteValue.extensionCompletionAlgebra + (K := K) u.1 + let : SMul K u.1.Completion := hL.toSMul + let : Algebra v.1.Completion u.1.Completion := + AbsoluteValue.completionAlgebra v.1 u.1 u.2 + let := localizedCompletionGlobalAlgebra v.1 u + let := localizedCompletionIsScalarTower v.1 u + let : FiniteDimensional v.1.Completion + (LocalizedCompletion v.1 u) := + localizedCompletionModuleFinite v.1 v.isNontrivial u + let : IsGalois v.1.Completion + (LocalizedCompletion v.1 u) := + HilbertRamification.algebraicLocalization_isGalois v.1 u + let : Fintype (absoluteValueDecompositionGroup K w.1) := + Fintype.ofFinite _ + let : MulDistribMulAction + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion v.1 u)ˣ := + decompositionGroupLocalUnitsAction + v.1 v.isNontrivial u + exact + ⟨localHerbrandHMinusOne_card_eq_one_of_absoluteValue + v.1 v.isNontrivial u σ hgen, + infinitePlaceLocalHerbrandH0_card_eq_localDegree + v w hw⟩ + +omit [NumberField L] in +open scoped Classical in +/-- Finiteness of the archimedean degree-zero local Herbrand group, +deduced from its explicit nonzero cardinality. -/ +theorem infinitePlaceLocalHerbrandH0Finite + (v : InfinitePlace K) (w : InfinitePlace L) + (hw : w.comap (algebraMap K L) = v) : + let u := + infinitePlaceAbsoluteValueExtension v w hw + letI : Fintype (absoluteValueDecompositionGroup K w.1) := + Fintype.ofFinite _ + letI : MulDistribMulAction + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion v.1 u)ˣ := + decompositionGroupLocalUnitsAction + v.1 v.isNontrivial u + Finite + (HerbrandH0 + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion v.1 u)ˣ) := by + let u := + infinitePlaceAbsoluteValueExtension v w hw + let hL := + AbsoluteValue.extensionCompletionAlgebra + (K := K) u.1 + let : SMul K u.1.Completion := hL.toSMul + let : Algebra v.1.Completion u.1.Completion := + AbsoluteValue.completionAlgebra v.1 u.1 u.2 + let := localizedCompletionGlobalAlgebra v.1 u + let := localizedCompletionIsScalarTower v.1 u + let : FiniteDimensional v.1.Completion + (LocalizedCompletion v.1 u) := + localizedCompletionModuleFinite v.1 v.isNontrivial u + let : IsGalois v.1.Completion + (LocalizedCompletion v.1 u) := + HilbertRamification.algebraicLocalization_isGalois v.1 u + let : Fintype (absoluteValueDecompositionGroup K w.1) := + Fintype.ofFinite _ + let : MulDistribMulAction + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion v.1 u)ˣ := + decompositionGroupLocalUnitsAction + v.1 v.isNontrivial u + change + Finite + (HerbrandH0 + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion v.1 u)ˣ) + by_cases hUnramified : w.IsUnramified K + · have hGroup : + Nat.card (absoluteValueDecompositionGroup K w.1) = 1 := by + rw [absoluteValueDecompositionGroup_eq_infinitePlaceStabilizer w, + InfinitePlace.card_stabilizer, ite_eq_left hUnramified] + let : Subsingleton (absoluteValueDecompositionGroup K w.1) := + (Nat.card_eq_one_iff_unique.mp hGroup).1 + let : + Subsingleton + (HerbrandH0 + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion v.1 u)ˣ) := + herbrandH0_subsingleton_of_fixed_le_tateNormSubgroup + (G := absoluteValueDecompositionGroup K w.1) + (A := (LocalizedCompletion v.1 u)ˣ) (by + intro a ha + refine ⟨a, ?_⟩ + rw [tateNormHom_apply] + unfold tateNorm + classical + have huniv : + (Finset.univ : + Finset (absoluteValueDecompositionGroup K w.1)) = + {1} := by + ext g + simp [Subsingleton.elim g 1] + rw [huniv] + simp) + exact + Finite.of_injective + (fun _ : + HerbrandH0 + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion v.1 u)ˣ => false) + (fun x y _ => Subsingleton.elim x y) + · have hRamified : w.IsRamified K := hUnramified + have hvReal : v.IsReal := by + rw [← hw] + exact hRamified.isReal + have hwComplex : w.IsComplex := + hRamified.isComplex + let eH0 := + localHerbrandH0EquivNormQuotient + v.1 v.isNontrivial u + let eCompletion := + localizedCompletionNormQuotientEquivAbsoluteCompletions + v w hw + let eRealComplex := + absoluteCompletionNormQuotientEquivRealComplex + v w hw hvReal hwComplex + exact + Finite.of_equiv + (NormQuotient ℝ ℂ) + (eH0.trans + (eCompletion.trans eRealComplex)).symm.toEquiv + +omit [NumberField K] [NumberField L] in +open scoped Classical in +/-- Finiteness of the archimedean degree-minus-one local Herbrand +group. -/ +theorem infinitePlaceLocalHerbrandHMinusOneFinite + (v : InfinitePlace K) (w : InfinitePlace L) + (hw : w.comap (algebraMap K L) = v) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + let u := + infinitePlaceAbsoluteValueExtension v w hw + letI : Fintype (absoluteValueDecompositionGroup K w.1) := + Fintype.ofFinite _ + letI : MulDistribMulAction + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion v.1 u)ˣ := + decompositionGroupLocalUnitsAction + v.1 v.isNontrivial u + Finite + (HerbrandHMinusOne + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion v.1 u)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K w.1) + σ hgen)) := by + let u := + infinitePlaceAbsoluteValueExtension v w hw + let hL := + AbsoluteValue.extensionCompletionAlgebra + (K := K) u.1 + let : SMul K u.1.Completion := hL.toSMul + let : Algebra v.1.Completion u.1.Completion := + AbsoluteValue.completionAlgebra v.1 u.1 u.2 + let := localizedCompletionGlobalAlgebra v.1 u + let := localizedCompletionIsScalarTower v.1 u + let : FiniteDimensional v.1.Completion + (LocalizedCompletion v.1 u) := + localizedCompletionModuleFinite v.1 v.isNontrivial u + let : IsGalois v.1.Completion + (LocalizedCompletion v.1 u) := + HilbertRamification.algebraicLocalization_isGalois v.1 u + let : Fintype (absoluteValueDecompositionGroup K w.1) := + Fintype.ofFinite _ + let : MulDistribMulAction + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion v.1 u)ˣ := + decompositionGroupLocalUnitsAction + v.1 v.isNontrivial u + change + Finite + (HerbrandHMinusOne + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion v.1 u)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K w.1) + σ hgen)) + let : + Subsingleton + (HerbrandHMinusOne + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion v.1 u)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K w.1) + σ hgen)) := + localHerbrandHMinusOne_subsingleton + v.1 v.isNontrivial u σ hgen + exact + Finite.of_injective + (fun _ => false) + (fun x y _ => Subsingleton.elim x y) + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean new file mode 100644 index 0000000000..6cf99f52d9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean @@ -0,0 +1,497 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.GaloisCohomology +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.NormImage +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic + +/-! # Cohomology Bridge -/ + +@[expose] public section +namespace LocalClassFieldTheory + +open CyclicCohomology + +/-! +# The actual low-degree Tate quotients as Herbrand quotients + +This file compares the concrete multiplicative Herbrand quotients from +low-degree cyclic cohomology with the Tate objects built from mathlib's actual +Galois representation on `Lˣ`. The comparison uses the standard Galois action +on units; it does not introduce a replacement coefficient object. +-/ + +noncomputable +section + +open scoped BigOperators + +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CategoryTheory + +variable (K L : Type) [Field K] [Field L] [Algebra K L] + +/-- The norm in the actual unit representation is the multiplicative Herbrand +norm after passing from `Additive Lˣ` back to `Lˣ`. -/ +theorem unitsNormLinearMap_toMul_eq_tateNorm + [Fintype (Gal(L/K))] (x : Lˣ) : + Additive.toMul (unitsNormLinearMap K L (Additive.ofMul x)) = + tateNorm (Gal(L/K)) Lˣ x := by + have hnorm : + unitsNormLinearMap K L (Additive.ofMul x) = + ∑ σ : Gal(L/K), (Rep.ofAlgebraAutOnUnits K L).ρ σ (Additive.ofMul x) := by + exact LinearMap.sum_apply Finset.univ + (fun σ : Gal(L/K) => (Rep.ofAlgebraAutOnUnits K L).ρ σ) + (Additive.ofMul x : Additive Lˣ) + rw [hnorm] + calc + (Additive.toMul + ((∑ σ : Gal(L/K), (Rep.ofAlgebraAutOnUnits K L).ρ σ (Additive.ofMul x)) : + Additive Lˣ) : Lˣ) = + ∏ σ : Gal(L/K), + (Additive.toMul + ((Rep.ofAlgebraAutOnUnits K L).ρ σ (Additive.ofMul x) : Additive Lˣ) : Lˣ) := by + simpa only using additive_toMul_finset_sum_units L Finset.univ + (fun σ : Gal(L/K) => (Rep.ofAlgebraAutOnUnits K L).ρ σ (Additive.ofMul x)) + _ = tateNorm (Gal(L/K)) Lˣ x := by + rfl + +/-- Multiplicative fixed units and the invariant submodule of the actual unit +representation are the same additive group. -/ +def additiveFixedUnitsEquivInvariants : + Additive (fixedSubgroup (Gal(L/K)) Lˣ) ≃+ + unitsInvariantSubmodule K L where + toFun x := ⟨Additive.ofMul ((Additive.toMul x : fixedSubgroup (Gal(L/K)) Lˣ) : Lˣ), by + intro σ + exact congrArg Additive.ofMul ((Additive.toMul x).property σ)⟩ + invFun x := Additive.ofMul ⟨Additive.toMul (x : Additive Lˣ), by + intro σ + exact Additive.ofMul.injective (x.property σ)⟩ + left_inv x := rfl + right_inv x := rfl + map_add' x y := rfl + +/-- Compose an additive equivalence with a submodule quotient map. + +Keeping this construction polymorphic prevents typeclass search from unfolding +the concrete Galois representation while it looks for the quotient's additive +structure. -/ +def additiveEquivToQuotientHom + {A M : Type} [AddCommGroup A] [AddCommGroup M] + (e : A ≃+ M) (N : Submodule ℤ M) : A →+ M ⧸ N := + N.mkQ.toAddMonoidHom.comp e.toAddMonoidHom + +/-- Multiplicative form of an additive homomorphism, kept polymorphic for the +same elaboration reason as `additiveEquivToQuotientHom`. -/ +def additiveHomToMultiplicativeHom + {G B : Type} [Group G] [AddCommGroup B] + (f : Additive G →+ B) : G →* Multiplicative B := + AddMonoidHom.toMultiplicativeRight f + +/-- The multiplicative group structure on an additive submodule quotient. +This is passed explicitly at concrete call sites to avoid rediscovering it by +unfolding the coefficient representation. -/ +@[implicit_reducible] +def multiplicativeQuotientGroup + {M : Type} [AddCommGroup M] (N : Submodule ℤ M) : + Group (Multiplicative (M ⧸ N)) := + Multiplicative.group + +/-- Kernel of a homomorphism into a multiplicative additive quotient, with the +codomain structure supplied directly. -/ +def kernelOfAdditiveQuotientHom + {G M : Type} [Group G] [AddCommGroup M] + (N : Submodule ℤ M) (f : G →* Multiplicative (M ⧸ N)) : Subgroup G := + @MonoidHom.ker G inferInstance (Multiplicative (M ⧸ N)) + (multiplicativeQuotientGroup N).toMulOneClass f + +/-- First-isomorphism-theorem comparison for a surjection onto a +multiplicative additive quotient. -/ +def quotientMulEquivOfSurjectiveAdditiveQuotient + {G M : Type} [CommGroup G] [AddCommGroup M] + (N : Submodule ℤ M) (S : Subgroup G) + (f : G →* Multiplicative (M ⧸ N)) + (hker : kernelOfAdditiveQuotientHom N f = S) + (hsurj : Function.Surjective f) : + G ⧸ S ≃* Multiplicative (M ⧸ N) := by + letI : Group (Multiplicative (M ⧸ N)) := multiplicativeQuotientGroup N + exact + (QuotientGroup.quotientMulEquivOfEq hker.symm).trans + (QuotientGroup.quotientKerEquivOfSurjective f hsurj) + +/-- Forget the type tags in an equivalence whose codomain is the +multiplicative form of an additive group. -/ +def mulEquivMultiplicativeToEquiv + {G B : Type} [Group G] [AddCommGroup B] + (e : G ≃* Multiplicative B) : G ≃ B where + toFun q := Multiplicative.toAdd (e q) + invFun q := e.symm (Multiplicative.ofAdd q) + left_inv q := e.left_inv q + right_inv q := e.right_inv (Multiplicative.ofAdd q) + +/-- Additive quotient map from fixed units to invariant units modulo norms. -/ +def additiveFixedUnitToInvariantsNormQuotientHom + [Fintype (Gal(L/K))] : + Additive (fixedSubgroup (Gal(L/K)) Lˣ) →+ + (unitsInvariantSubmodule K L ⧸ unitsTateH0NormSubmodule K L) := + additiveEquivToQuotientHom (additiveFixedUnitsEquivInvariants K L) + (unitsTateH0NormSubmodule K L) + +/-- Send a fixed unit to its invariant-unit class modulo norms. -/ +def fixedUnitToInvariantsNormQuotientMonoidHom + [Fintype (Gal(L/K))] : + fixedSubgroup (Gal(L/K)) Lˣ →* + Multiplicative + (unitsInvariantSubmodule K L ⧸ unitsTateH0NormSubmodule K L) := + additiveHomToMultiplicativeHom + (additiveFixedUnitToInvariantsNormQuotientHom K L) + +/-- A fixed unit maps to its canonical invariant-unit class modulo norms. -/ +@[simp] +theorem fixedUnitToInvariantsNormQuotientMonoidHom_apply + [Fintype (Gal(L/K))] (x : fixedSubgroup (Gal(L/K)) Lˣ) : + Multiplicative.toAdd + (fixedUnitToInvariantsNormQuotientMonoidHom K L x) = + (unitsTateH0NormSubmodule K L).mkQ + (additiveFixedUnitsEquivInvariants K L (Additive.ofMul x)) := + rfl + +/-- The kernel of the fixed-unit quotient map is exactly +the Herbrand norm subgroup inside the fixed subgroup. -/ +theorem fixedUnitToInvariantsNormQuotientMonoidHom_ker + [Fintype (Gal(L/K))] : + kernelOfAdditiveQuotientHom (unitsTateH0NormSubmodule K L) + (fixedUnitToInvariantsNormQuotientMonoidHom K L) = + (tateNormSubgroup (Gal(L/K)) Lˣ).subgroupOf + (fixedSubgroup (Gal(L/K)) Lˣ) := by + ext x + constructor + · intro hx + have hx0 := congrArg Multiplicative.toAdd hx + change + (unitsTateH0NormSubmodule K L).mkQ + (additiveFixedUnitsEquivInvariants K L (Additive.ofMul x)) = 0 at hx0 + have hxmem : + additiveFixedUnitsEquivInvariants K L (Additive.ofMul x) ∈ + unitsTateH0NormSubmodule K L := + (Submodule.Quotient.mk_eq_zero (unitsTateH0NormSubmodule K L)).1 hx0 + rcases hxmem with ⟨y, hy⟩ + change (x : Lˣ) ∈ tateNormSubgroup (Gal(L/K)) Lˣ + refine ⟨Additive.toMul y, ?_⟩ + have hy' := congrArg + (fun z : unitsInvariantSubmodule K L => + Additive.toMul (z : Additive Lˣ)) hy + change Additive.toMul (unitsNormLinearMap K L y) = (x : Lˣ) at hy' + rw [tateNormHom_apply, + ← unitsNormLinearMap_toMul_eq_tateNorm K L (Additive.toMul y)] + simpa using hy' + · intro hx + change (x : Lˣ) ∈ tateNormSubgroup (Gal(L/K)) Lˣ at hx + rcases hx with ⟨y, hy⟩ + apply Multiplicative.toAdd.injective + change + (unitsTateH0NormSubmodule K L).mkQ + (additiveFixedUnitsEquivInvariants K L (Additive.ofMul x)) = 0 + apply (Submodule.Quotient.mk_eq_zero (unitsTateH0NormSubmodule K L)).2 + change additiveFixedUnitsEquivInvariants K L (Additive.ofMul x) ∈ + LinearMap.range (unitsNormToInvariantsLinearMap K L) + refine ⟨Additive.ofMul y, ?_⟩ + apply Subtype.ext + apply Additive.toMul.injective + change Additive.toMul + (unitsNormLinearMap K L (Additive.ofMul y)) = (x : Lˣ) + rw [unitsNormLinearMap_toMul_eq_tateNorm K L y] + exact hy + +/-- Every invariant-unit class modulo norms has a multiplicatively fixed representative. -/ +theorem fixedUnitToInvariantsNormQuotientMonoidHom_surjective + [Fintype (Gal(L/K))] : + Function.Surjective (fixedUnitToInvariantsNormQuotientMonoidHom K L) := by + intro q + rcases Submodule.mkQ_surjective (unitsTateH0NormSubmodule K L) + (Multiplicative.toAdd q) with ⟨z, hz⟩ + let x : fixedSubgroup (Gal(L/K)) Lˣ := + Additive.toMul ((additiveFixedUnitsEquivInvariants K L).symm z) + refine ⟨x, ?_⟩ + apply Multiplicative.toAdd.injective + change + (unitsTateH0NormSubmodule K L).mkQ + (additiveFixedUnitsEquivInvariants K L (Additive.ofMul x)) = + Multiplicative.toAdd q + calc + _ = (unitsTateH0NormSubmodule K L).mkQ z := by + apply congrArg (unitsTateH0NormSubmodule K L).mkQ + change additiveFixedUnitsEquivInvariants K L + ((additiveFixedUnitsEquivInvariants K L).symm z) = z + exact (additiveFixedUnitsEquivInvariants K L).apply_symm_apply z + _ = Multiplicative.toAdd q := hz + +/-- The multiplicative Herbrand quotient is the invariant-unit quotient by norms. -/ +def herbrandH0MulEquivInvariantsNormQuotient + [Fintype (Gal(L/K))] := + quotientMulEquivOfSurjectiveAdditiveQuotient + (unitsTateH0NormSubmodule K L) + ((tateNormSubgroup (Gal(L/K)) Lˣ).subgroupOf + (fixedSubgroup (Gal(L/K)) Lˣ)) + (fixedUnitToInvariantsNormQuotientMonoidHom K L) + (fixedUnitToInvariantsNormQuotientMonoidHom_ker K L) + (fixedUnitToInvariantsNormQuotientMonoidHom_surjective K L) + +/-- The multiplicative Herbrand quotient of field units is mathlib's +degree-zero Tate cohomology. -/ +def herbrandH0EquivTateCohomologyZero [Fintype (Gal(L/K))] : + HerbrandH0 (Gal(L/K)) Lˣ ≃ + tateCohomology (Rep.ofAlgebraAutOnUnits K L) 0 := + (mulEquivMultiplicativeToEquiv + (herbrandH0MulEquivInvariantsNormQuotient K L)).trans + (tateUnitsH0IsoInvariantsQuotient K L).symm.toLinearEquiv.toEquiv + +/-- Cardinality transport from the concrete Herbrand quotient to mathlib's +degree-zero Tate cohomology. -/ +theorem cardinalMk_herbrandH0_fieldUnits_eq_tateCohomology_zero + [Fintype (Gal(L/K))] : + Cardinal.mk (HerbrandH0 (Gal(L/K)) Lˣ) = + Cardinal.mk (tateCohomology (Rep.ofAlgebraAutOnUnits K L) 0) := + Cardinal.mk_congr (herbrandH0EquivTateCohomologyZero K L) + +/-- Subtraction by the identity in the actual unit representation is the +multiplicative coboundary `x ↦ g•x/x`. -/ +theorem unitsRhoSub_toMul_eq_sigmaMinusOne + (g : Gal(L/K)) (x : Lˣ) : + (Additive.toMul ((Rep.ofAlgebraAutOnUnits K L).ρ g (Additive.ofMul x)) : Lˣ) * x⁻¹ = + sigmaMinusOne (Gal(L/K)) Lˣ g x := by + rfl + +/-- Multiplicative norm-one units and the kernel of the norm on the actual +unit representation are the same additive group. -/ +def additiveNormKernelEquivUnitsNormKer [Fintype (Gal(L/K))] : + Additive (normKernelSubgroup (Gal(L/K)) Lˣ) ≃+ + LinearMap.ker (unitsNormLinearMap K L) where + toFun x := ⟨Additive.ofMul + ((Additive.toMul x : normKernelSubgroup (Gal(L/K)) Lˣ) : Lˣ), by + apply Additive.toMul.injective + change Additive.toMul + (unitsNormLinearMap K L (Additive.ofMul + ((Additive.toMul x : normKernelSubgroup (Gal(L/K)) Lˣ) : Lˣ))) = 1 + rw [unitsNormLinearMap_toMul_eq_tateNorm K L + ((Additive.toMul x : normKernelSubgroup (Gal(L/K)) Lˣ) : Lˣ)] + exact (Additive.toMul x).property⟩ + invFun x := Additive.ofMul ⟨Additive.toMul (x : Additive Lˣ), by + change tateNorm (Gal(L/K)) Lˣ (Additive.toMul (x : Additive Lˣ)) = 1 + rw [← unitsNormLinearMap_toMul_eq_tateNorm K L + (Additive.toMul (x : Additive Lˣ))] + have hx := congrArg Additive.toMul x.property + exact hx⟩ + left_inv x := rfl + right_inv x := rfl + map_add' x y := rfl + +/-- The actual additive differential `ρ(g)-1`, with codomain restricted to +the kernel of the norm. -/ +def unitsRhoSubToNormKerLinearMap [Fintype (Gal(L/K))] + (g : Gal(L/K)) : + Additive Lˣ →ₗ[ℤ] LinearMap.ker (unitsNormLinearMap K L) := + ((Rep.ofAlgebraAutOnUnits K L).ρ g - LinearMap.id).codRestrict + (LinearMap.ker (unitsNormLinearMap K L)) (by + intro x + change unitsNormLinearMap K L + ((Rep.ofAlgebraAutOnUnits K L).ρ g x - x) = 0 + change (Rep.ofAlgebraAutOnUnits K L).norm.hom + ((Rep.ofAlgebraAutOnUnits K L).ρ g x - x) = 0 + rw [map_sub] + apply sub_eq_zero.mpr + change Representation.norm (Rep.ofAlgebraAutOnUnits K L).ρ + ((Rep.ofAlgebraAutOnUnits K L).ρ g x) = + Representation.norm (Rep.ofAlgebraAutOnUnits K L).ρ x + exact Representation.norm_self_apply (Rep.ofAlgebraAutOnUnits K L).ρ g x) + +/-- Additive quotient map from the multiplicative norm kernel to the +standard boundary presentation of degree-minus-one Tate cohomology. -/ +def additiveNormKernelToUnitsBoundaryQuotientHom + [Fintype (Gal(L/K))] (g : Gal(L/K)) : + Additive (normKernelSubgroup (Gal(L/K)) Lˣ) →+ + LinearMap.ker (unitsNormLinearMap K L) ⧸ + LinearMap.range (unitsRhoSubToNormKerLinearMap K L g) := + additiveEquivToQuotientHom + (additiveNormKernelEquivUnitsNormKer K L) + (LinearMap.range (unitsRhoSubToNormKerLinearMap K L g)) + +/-- Multiplicative form of the standard boundary quotient map. -/ +def normKernelToUnitsBoundaryQuotientMonoidHom + [Fintype (Gal(L/K))] (g : Gal(L/K)) : + normKernelSubgroup (Gal(L/K)) Lˣ →* + Multiplicative + (LinearMap.ker (unitsNormLinearMap K L) ⧸ + LinearMap.range (unitsRhoSubToNormKerLinearMap K L g)) := + additiveHomToMultiplicativeHom + (additiveNormKernelToUnitsBoundaryQuotientHom K L g) + +/-- The kernel of the standard boundary quotient map is the augmentation +subgroup generated by `ρ(g)-1`. -/ +theorem normKernelToUnitsBoundaryQuotientMonoidHom_ker + [Fintype (Gal(L/K))] (g : Gal(L/K)) : + kernelOfAdditiveQuotientHom + (LinearMap.range (unitsRhoSubToNormKerLinearMap K L g)) + (normKernelToUnitsBoundaryQuotientMonoidHom K L g) = + (augmentationSubgroup (Gal(L/K)) Lˣ g).subgroupOf + (normKernelSubgroup (Gal(L/K)) Lˣ) := by + ext x + constructor + · intro hx + have hx0 := congrArg Multiplicative.toAdd hx + change + (LinearMap.range (unitsRhoSubToNormKerLinearMap K L g)).mkQ + (additiveNormKernelEquivUnitsNormKer K L (Additive.ofMul x)) = + 0 at hx0 + have hxmem : + additiveNormKernelEquivUnitsNormKer K L (Additive.ofMul x) ∈ + LinearMap.range (unitsRhoSubToNormKerLinearMap K L g) := + (Submodule.Quotient.mk_eq_zero + (LinearMap.range (unitsRhoSubToNormKerLinearMap K L g))).1 hx0 + rcases hxmem with ⟨y, hy⟩ + change (x : Lˣ) ∈ augmentationSubgroup (Gal(L/K)) Lˣ g + refine ⟨Additive.toMul y, ?_⟩ + have hy' := congrArg + (fun z : LinearMap.ker (unitsNormLinearMap K L) => + Additive.toMul (z : Additive Lˣ)) hy + simp only [unitsRhoSubToNormKerLinearMap, + additiveNormKernelEquivUnitsNormKer] at hy' + change + (Additive.toMul ((Rep.ofAlgebraAutOnUnits K L).ρ g y) : Lˣ) * + (Additive.toMul y)⁻¹ = (x : Lˣ) at hy' + rw [sigmaMinusOneHom_apply, + ← unitsRhoSub_toMul_eq_sigmaMinusOne K L g (Additive.toMul y)] + exact hy' + · intro hx + change (x : Lˣ) ∈ augmentationSubgroup (Gal(L/K)) Lˣ g at hx + rcases hx with ⟨y, hy⟩ + apply Multiplicative.toAdd.injective + change + (LinearMap.range (unitsRhoSubToNormKerLinearMap K L g)).mkQ + (additiveNormKernelEquivUnitsNormKer K L (Additive.ofMul x)) = + 0 + apply (Submodule.Quotient.mk_eq_zero + (LinearMap.range (unitsRhoSubToNormKerLinearMap K L g))).2 + refine ⟨Additive.ofMul y, ?_⟩ + apply Subtype.ext + apply Additive.toMul.injective + simp only [unitsRhoSubToNormKerLinearMap, + additiveNormKernelEquivUnitsNormKer] + change + (Additive.toMul ((Rep.ofAlgebraAutOnUnits K L).ρ g (Additive.ofMul y)) : Lˣ) * y⁻¹ = + (x : Lˣ) + rw [unitsRhoSub_toMul_eq_sigmaMinusOne K L g y] + exact hy + +/-- Every class of the standard boundary quotient has a representative in +the multiplicative norm kernel. -/ +theorem normKernelToUnitsBoundaryQuotientMonoidHom_surjective + [Fintype (Gal(L/K))] (g : Gal(L/K)) : + Function.Surjective + (normKernelToUnitsBoundaryQuotientMonoidHom K L g) := by + intro q + rcases Submodule.mkQ_surjective + (LinearMap.range (unitsRhoSubToNormKerLinearMap K L g)) + (Multiplicative.toAdd q) with ⟨z, hz⟩ + let x : normKernelSubgroup (Gal(L/K)) Lˣ := + Additive.toMul ((additiveNormKernelEquivUnitsNormKer K L).symm z) + refine ⟨x, ?_⟩ + apply Multiplicative.toAdd.injective + change + (LinearMap.range (unitsRhoSubToNormKerLinearMap K L g)).mkQ + (additiveNormKernelEquivUnitsNormKer K L (Additive.ofMul x)) = + Multiplicative.toAdd q + calc + _ = (LinearMap.range (unitsRhoSubToNormKerLinearMap K L g)).mkQ z := by + apply congrArg + (LinearMap.range (unitsRhoSubToNormKerLinearMap K L g)).mkQ + change additiveNormKernelEquivUnitsNormKer K L + ((additiveNormKernelEquivUnitsNormKer K L).symm z) = z + exact (additiveNormKernelEquivUnitsNormKer K L).apply_symm_apply z + _ = Multiplicative.toAdd q := hz + +/-- The multiplicative Herbrand quotient is the standard additive boundary +quotient used by mathlib's finite-cyclic Tate complex. -/ +def herbrandHminusOneMulEquivUnitsBoundaryQuotient + [Fintype (Gal(L/K))] (g : Gal(L/K)) : + HerbrandHMinusOne (Gal(L/K)) Lˣ g ≃* + Multiplicative + (LinearMap.ker (unitsNormLinearMap K L) ⧸ + LinearMap.range (unitsRhoSubToNormKerLinearMap K L g)) := + (HerbrandHMinusOne.equiv (G := Gal(L/K)) (A := Lˣ) g).trans + (quotientMulEquivOfSurjectiveAdditiveQuotient + (LinearMap.range (unitsRhoSubToNormKerLinearMap K L g)) + ((augmentationSubgroup (Gal(L/K)) Lˣ g).subgroupOf + (normKernelSubgroup (Gal(L/K)) Lˣ)) + (normKernelToUnitsBoundaryQuotientMonoidHom K L g) + (normKernelToUnitsBoundaryQuotientMonoidHom_ker K L g) + (normKernelToUnitsBoundaryQuotientMonoidHom_surjective K L g)) + +/-- Type-level comparison with the standard boundary quotient. -/ +def herbrandHminusOneEquivUnitsBoundaryQuotient + [Fintype (Gal(L/K))] (g : Gal(L/K)) : + HerbrandHMinusOne (Gal(L/K)) Lˣ g ≃ + LinearMap.ker (unitsNormLinearMap K L) ⧸ + LinearMap.range (unitsRhoSubToNormKerLinearMap K L g) := + mulEquivMultiplicativeToEquiv + (herbrandHminusOneMulEquivUnitsBoundaryQuotient K L g) + +/-- Mathlib's degree-minus-one Tate object is its standard finite-cyclic +boundary quotient `ker N / im(ρ(g)-1)`. -/ +noncomputable def unitsTateHminusOneIsoBoundaryQuotient + [FiniteDimensional K L] (g : Gal(L/K)) + (hg : ∀ x : Gal(L/K), x ∈ Subgroup.zpowers g) : + tateCohomology (Rep.ofAlgebraAutOnUnits K L) (-1) ≅ + ModuleCat.of ℤ + (LinearMap.ker (unitsNormLinearMap K L) ⧸ + LinearMap.range (unitsRhoSubToNormKerLinearMap K L g)) := by + letI : IsCyclic (Gal(L/K)) := + CyclicCohomology.isCyclic_of_generator g hg + letI : CommGroup (Gal(L/K)) := IsCyclic.commGroup + let T := + Rep.FiniteCyclicGroup.subCompNormHom (Rep.ofAlgebraAutOnUnits K L) g + have hmap : + T.moduleCatToCycles = + unitsRhoSubToNormKerLinearMap K L g := by + ext x + rfl + have e := T.moduleCatHomologyIso + change + T.homology ≅ + ModuleCat.of ℤ + (LinearMap.ker (unitsNormLinearMap K L) ⧸ + LinearMap.range + T.moduleCatToCycles) at e + rw [hmap] at e + exact TateCohomology.isoFiniteCyclicNegOne (Rep.ofAlgebraAutOnUnits K L) g hg ≪≫ + e + +/-- Genuine comparison of the multiplicative `H⁻¹` quotient +for field units with Mathlib's actual Tate `H⁻¹` object. -/ +noncomputable def herbrandHminusOneEquivUnitsTateHminusOne + [FiniteDimensional K L] (g : Gal(L/K)) + (hg : ∀ x : Gal(L/K), x ∈ Subgroup.zpowers g) : + HerbrandHMinusOne (Gal(L/K)) Lˣ g ≃ + tateCohomology (Rep.ofAlgebraAutOnUnits K L) (-1) := + (herbrandHminusOneEquivUnitsBoundaryQuotient K L g).trans + (unitsTateHminusOneIsoBoundaryQuotient K L g hg).symm.toLinearEquiv.toEquiv + +/-- Cardinality transport from the concrete Herbrand `H⁻¹` quotient to +the actual Tate `H⁻¹` object. The statement is valid without introducing an +extraneous finiteness hypothesis. -/ +theorem cardinalMk_herbrandHminusOne_fieldUnits_eq_unitsTateHminusOne + [FiniteDimensional K L] (g : Gal(L/K)) + (hg : ∀ x : Gal(L/K), x ∈ Subgroup.zpowers g) : + Cardinal.mk (HerbrandHMinusOne (Gal(L/K)) Lˣ g) = + Cardinal.mk (tateCohomology (Rep.ofAlgebraAutOnUnits K L) (-1)) := + Cardinal.mk_congr (herbrandHminusOneEquivUnitsTateHminusOne K L g hg) + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FieldUnitsHerbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FieldUnitsHerbrand.lean new file mode 100644 index 0000000000..383f0ef0e8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FieldUnitsHerbrand.lean @@ -0,0 +1,143 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.CohomologyBridge +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Hilbert90 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValuationHerbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValueGroupCohomology + +/-! # Field Units Herbrand -/ + +@[expose] public section +namespace LocalClassFieldTheory +open CyclicCohomology + +open LocalFieldTheory + +/-! +# The field-unit calculation in the local class-field-axiom theorem + +This file proves the final Herbrand-quotient calculation for the local +class-field axiom. Its only input beyond the local-field hypotheses is the +preceding normal-basis calculation `h(G, O_Lˣ) = 1` for the actual action on +integer units. +-/ + +noncomputable +section + +open scoped ValuativeRel +open CyclicCohomology.ProfiniteCohomology.Herbrand +open IsNonarchimedeanLocalField + +variable (K L : Type) [Field K] [ValuativeRel K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] [FiniteDimensional K L] + [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure (ValuativeRel.valuation L).integer + (ValuativeRel.valuation K).integer L] + +omit [IsGalois K L] in +/-- Finiteness of actual unit Tate `H⁰`, derived from the finite Herbrand +quotients in the valuation exact sequence and transported across the genuine +comparison equivalence. -/ +theorem unitsTateH0FiniteOfIntegerUnitsHerbrand + (g : Gal(L/K)) + (hg : ∀ σ : Gal(L/K), σ ∈ Subgroup.zpowers g) + (hU : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + HerbrandQuotientDefined (Gal(L/K)) + (ValuativeRel.valuation L).integerˣ g) : + Finite (tateCohomology (Rep.ofAlgebraAutOnUnits K L) 0) := by + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + let := galoisGroupFieldUnitsMulDistribMulAction K L + let := galoisGroupValueGroupMulDistribMulAction K L + obtain ⟨hField, _⟩ := + valuationHerbrand_multiplicativity_of_integerUnits_defined K L g hg hU + let : Finite (HerbrandH0 (Gal(L/K)) Lˣ) := hField.1 + exact Finite.of_equiv (HerbrandH0 (Gal(L/K)) Lˣ) + (herbrandH0EquivTateCohomologyZero K L) + +/-- Final Herbrand calculation for the local class-field axiom. Multiplicativity for the +valuation sequence, the normal-basis result `h(G,O_Lˣ)=1`, the value-group +calculation, and Hilbert 90 imply the two asserted cardinalities for the +actual Tate cohomology of `Lˣ`. -/ +theorem fieldUnits_tate_card_of_integerUnits_herbrand_eq_one + (g : Gal(L/K)) + (hg : ∀ σ : Gal(L/K), σ ∈ Subgroup.zpowers g) + (hU : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + HerbrandQuotientDefined (Gal(L/K)) + (ValuativeRel.valuation L).integerˣ g) + (hU_one : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + @herbrandQuotient (Gal(L/K)) + (ValuativeRel.valuation L).integerˣ _ _ _ + (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) + g = 1) : + letI := unitsTateH0FiniteOfIntegerUnitsHerbrand K L g hg hU + Nat.card (tateCohomology (Rep.ofAlgebraAutOnUnits K L) 0) = Module.finrank K L ∧ + Nat.card (tateCohomology (Rep.ofAlgebraAutOnUnits K L) (-1)) = 1 := by + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + let := galoisGroupFieldUnitsMulDistribMulAction K L + let := galoisGroupValueGroupMulDistribMulAction K L + let hZ : HerbrandQuotientDefined + (Gal(L/K)) (Multiplicative Int) g := + galoisGroupValueGroup_herbrandQuotientDefined K L g + rcases valuationHerbrand_multiplicativity_of_integerUnits_defined + K L g hg hU with ⟨hField, hmult⟩ + let : Finite (HerbrandH0 (Gal(L/K)) Lˣ) := hField.1 + let : Finite (HerbrandHMinusOne (Gal(L/K)) Lˣ g) := hField.2 + let : Finite + (HerbrandH0 (Gal(L/K)) (Multiplicative Int)) := hZ.1 + let : Finite + (HerbrandHMinusOne (Gal(L/K)) (Multiplicative Int) g) := hZ.2 + have hZ0 : + Nat.card (HerbrandH0 (Gal(L/K)) (Multiplicative Int)) = + Module.finrank K L := + galoisGroupValueGroup_herbrandH0_card_eq_finrank K L + have hZm1 : + Nat.card (HerbrandHMinusOne + (Gal(L/K)) (Multiplicative Int) g) = 1 := + galoisGroupValueGroup_herbrandHMinusOne_card_eq_one K L g + have hZ_one : + @herbrandQuotient (Gal(L/K)) (Multiplicative Int) _ _ _ + (galoisGroupValueGroupMulDistribMulAction K L) g = + (Module.finrank K L : ℚ) := by + rw [herbrandQuotient_eq_card_ratio, hZ0, hZm1] + simp + have hm1_actual : + Nat.card (tateCohomology (Rep.ofAlgebraAutOnUnits K L) (-1)) = 1 := + unitsTateHminusOne_card_eq_one K L g hg + have hm1_field : + Nat.card (HerbrandHMinusOne (Gal(L/K)) Lˣ g) = 1 := by + exact (Nat.card_congr + (herbrandHminusOneEquivUnitsTateHminusOne K L g hg)).trans hm1_actual + have hField_quotient : + @herbrandQuotient (Gal(L/K)) Lˣ _ _ _ + (galoisGroupFieldUnitsMulDistribMulAction K L) + g = (Module.finrank K L : ℚ) := by + rw [hmult, hU_one, hZ_one] + simp + have h0_field_rat : + (Nat.card (HerbrandH0 (Gal(L/K)) Lˣ) : ℚ) = + (Module.finrank K L : ℚ) := by + rw [← hField_quotient, herbrandQuotient_eq_card_ratio, hm1_field] + simp + have h0_field : + Nat.card (HerbrandH0 (Gal(L/K)) Lˣ) = Module.finrank K L := by + exact_mod_cast h0_field_rat + constructor + · exact + (Nat.card_congr (herbrandH0EquivTateCohomologyZero K L)).symm.trans h0_field + · exact hm1_actual + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FilteredLiftingSequence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FilteredLiftingSequence.lean new file mode 100644 index 0000000000..5db77745f8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FilteredLiftingSequence.lean @@ -0,0 +1,162 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisInfiniteProduct + +/-! # Filtered Lifting Sequence -/ + +@[expose] public section +namespace LocalClassFieldTheory + +/-! +# Recursive correction sequences + +This file isolates the dependent-choice bookkeeping in the infinite-product +argument of the local class-field-axiom theorem. A one-step lift in a filtered commutative +group produces compatible correction and remainder sequences. No +cohomological input is hidden here: the existence of each one-step lift is an +explicit parameter, discharged for the normal-basis filtration in the next +file. +-/ + +noncomputable +section + +universe u + +/-- Left-to-right finite products of a correction sequence. -/ +def filteredCorrectionProduct {A : Type u} [Monoid A] (z : Nat → A) : Nat → A + | 0 => 1 + | d + 1 => filteredCorrectionProduct z d * z d + +/-- The empty correction product is the identity. -/ +@[simp] +theorem filteredCorrectionProduct_zero {A : Type u} [Monoid A] (z : Nat → A) : + filteredCorrectionProduct z 0 = 1 := + rfl + +/-- A successor correction product appends the correction at the preceding index. -/ +@[simp] +theorem filteredCorrectionProduct_succ {A : Type u} [Monoid A] + (z : Nat → A) (d : Nat) : + filteredCorrectionProduct z (d + 1) = filteredCorrectionProduct z d * z d := + rfl + +/-- A remainder at depth `n + i`, carrying both its filtration condition and +the condition that must be preserved by one-step lifting. -/ +structure FilteredLiftState (A : Type u) (P : Nat → A → Prop) + (R : A → Prop) (n i : Nat) where + /-- The current remainder at relative depth `i`. -/ + value : A + /-- The current remainder lies in filtration level `n + i`. -/ + mem : P (n + i) value + /-- The current remainder satisfies the condition preserved by each lifting step. -/ + stable : R value + +/-- One correction step `a_i = F(b_i) a_(i+1)`. -/ +structure FilteredLiftStep (A : Type u) [CommGroup A] + (P : Nat → A → Prop) (R : A → Prop) (F : A →* A) + (n i : Nat) (s : FilteredLiftState A P R n i) where + /-- The correction chosen at relative depth `i`. -/ + correction : A + /-- The correction lies in the same filtration level `n + i` as the current remainder. -/ + correction_mem : P (n + i) correction + /-- The remainder state after removing the current correction, one level deeper. -/ + next : FilteredLiftState A P R n (i + 1) + /-- The current remainder is the image of the correction under `F` times the next remainder. -/ + equation : s.value = F correction * next.value + +/-- The recursively chosen remainder sequence. -/ +noncomputable def chosenFilteredLiftStateSequence + (A : Type u) [CommGroup A] (P : Nat → A → Prop) (R : A → Prop) + (F : A →* A) (n : Nat) (initial : FilteredLiftState A P R n 0) + (step : ∀ i (s : FilteredLiftState A P R n i), + Nonempty (FilteredLiftStep A P R F n i s)) : + (i : Nat) → FilteredLiftState A P R n i + | 0 => initial + | i + 1 => + (Classical.choice + (step i (chosenFilteredLiftStateSequence A P R F n initial step i))).next + +/-- The recursively chosen correction at depth `n + i`. -/ +noncomputable def chosenFilteredLiftCorrectionSequence + (A : Type u) [CommGroup A] (P : Nat → A → Prop) (R : A → Prop) + (F : A →* A) (n : Nat) (initial : FilteredLiftState A P R n 0) + (step : ∀ i (s : FilteredLiftState A P R n i), + Nonempty (FilteredLiftStep A P R F n i s)) (i : Nat) : A := + (Classical.choice + (step i (chosenFilteredLiftStateSequence A P R F n initial step i))).correction + +/-- The chosen filtered-lift sequence starts at the supplied initial state. -/ +@[simp] +theorem chosenFilteredLiftStateSequence_zero + (A : Type u) [CommGroup A] (P : Nat → A → Prop) (R : A → Prop) + (F : A →* A) (n : Nat) (initial : FilteredLiftState A P R n 0) + (step : ∀ i (s : FilteredLiftState A P R n i), + Nonempty (FilteredLiftStep A P R F n i s)) : + chosenFilteredLiftStateSequence A P R F n initial step 0 = initial := + rfl + +/-- Each successor state is the next state of the chosen lifting step. -/ +@[simp] +theorem chosenFilteredLiftStateSequence_succ + (A : Type u) [CommGroup A] (P : Nat → A → Prop) (R : A → Prop) + (F : A →* A) (n : Nat) (initial : FilteredLiftState A P R n 0) + (step : ∀ i (s : FilteredLiftState A P R n i), + Nonempty (FilteredLiftStep A P R F n i s)) (i : Nat) : + chosenFilteredLiftStateSequence A P R F n initial step (i + 1) = + (Classical.choice + (step i (chosenFilteredLiftStateSequence A P R F n initial step i))).next := + rfl + +/-- Every chosen correction lies at the advertised filtration level. -/ +theorem chosenFilteredLiftCorrectionSequence_mem + (A : Type u) [CommGroup A] (P : Nat → A → Prop) (R : A → Prop) + (F : A →* A) (n : Nat) (initial : FilteredLiftState A P R n 0) + (step : ∀ i (s : FilteredLiftState A P R n i), + Nonempty (FilteredLiftStep A P R F n i s)) (i : Nat) : + P (n + i) + (chosenFilteredLiftCorrectionSequence A P R F n initial step i) := + (Classical.choice + (step i (chosenFilteredLiftStateSequence A P R F n initial step i))).correction_mem + +/-- The defining one-step recurrence for the chosen sequences. -/ +theorem chosenFilteredLiftStateSequence_equation + (A : Type u) [CommGroup A] (P : Nat → A → Prop) (R : A → Prop) + (F : A →* A) (n : Nat) (initial : FilteredLiftState A P R n 0) + (step : ∀ i (s : FilteredLiftState A P R n i), + Nonempty (FilteredLiftStep A P R F n i s)) (i : Nat) : + (chosenFilteredLiftStateSequence A P R F n initial step i).value = + F (chosenFilteredLiftCorrectionSequence A P R F n initial step i) * + (chosenFilteredLiftStateSequence A P R F n initial step (i + 1)).value := by + exact (Classical.choice + (step i (chosenFilteredLiftStateSequence A P R F n initial step i))).equation + +/-- The initial remainder equals the image under `F` of the first `d` +corrections, times the depth-`d` remainder. -/ +theorem filteredLift_initial_eq_correctionProduct_mul_state + (A : Type u) [CommGroup A] (P : Nat → A → Prop) (R : A → Prop) + (F : A →* A) (n : Nat) (initial : FilteredLiftState A P R n 0) + (step : ∀ i (s : FilteredLiftState A P R n i), + Nonempty (FilteredLiftStep A P R F n i s)) (d : Nat) : + initial.value = + F (filteredCorrectionProduct + (chosenFilteredLiftCorrectionSequence A P R F n initial step) d) * + (chosenFilteredLiftStateSequence A P R F n initial step d).value := by + induction d with + | zero => + rw [filteredCorrectionProduct_zero, chosenFilteredLiftStateSequence_zero, + map_one, one_mul] + | succ d ih => + rw [filteredCorrectionProduct_succ, map_mul] + rw [mul_assoc, ← chosenFilteredLiftStateSequence_equation + A P R F n initial step d] + exact ih + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Hilbert90.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Hilbert90.lean new file mode 100644 index 0000000000..ef748aac68 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Hilbert90.lean @@ -0,0 +1,40 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.GaloisCohomology +/-! +Provides the public declarations in the +`LocalClassFieldTheory.ClassFormation.Hilbert90` Lean module. +-/ + +@[expose] public section + +namespace LocalClassFieldTheory + +open CyclicCohomology + +noncomputable +section + +/-- The `i = -1` half of the local class-field-axiom theorem on the actual field-unit +representation. This is Hilbert 90 transported through the cyclic +`H¹ ≃ H⁻¹` comparison. -/ +theorem unitsTateHminusOne_card_eq_one + (K L : Type) [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] + (g : Gal(L/K)) (hg : ∀ σ : Gal(L/K), σ ∈ Subgroup.zpowers g) : + Nat.card (tateCohomology (Rep.ofAlgebraAutOnUnits K L) (-1)) = 1 := by + calc + Nat.card (tateCohomology (Rep.ofAlgebraAutOnUnits K L) (-1)) = + Nat.card (groupCohomology.H1 (Rep.ofAlgebraAutOnUnits K L)) := + Nat.card_congr + (unitsH1IsoTateHminusOne K L g hg).symm.toLinearEquiv.toEquiv + _ = 1 := Nat.card_unique + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean new file mode 100644 index 0000000000..594cf15470 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean @@ -0,0 +1,194 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisFiniteQuotient + +/-! # Integer Units Herbrand -/ + +@[expose] public section +namespace LocalClassFieldTheory + +open LocalFieldTheory + +open CyclicCohomology + +/-! +# The Herbrand quotient of the integer-unit group + +This file proves the final integer-unit Herbrand-quotient calculation. For a +sufficiently deep normal-basis neighbourhood +`V = 1 + π_K^n M`, the exact sequence + +`1 → V → 𝒪_Lˣ → 𝒪_Lˣ / V → 1` + +has the actual `Gal(L / K)` actions. Vanishing of the two low-degree +Herbrand groups of `V`, together with finiteness of the quotient, gives +`h(G, 𝒪_Lˣ) = 1` by the Herbrand-quotient multiplicativity theorem. +-/ + +noncomputable +section + +open scoped ValuativeRel +open CyclicCohomology.ProfiniteCohomology.Herbrand +open IsNonarchimedeanLocalField + +variable (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [ValuativeRel L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + +/-- The normal-basis subgroup sequence is short exact and equivariant for +the actual actions used in the local class-field-axiom argument. -/ +theorem chosenNormalBasisIntegerUnitsHerbrand_shortExact + (n : Nat) (V : Subgroup 𝒪[L]ˣ) + (hV : (V : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) : + letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + letI := chosenNormalBasisIntegerUnitsQuotMulDistribMulAction K L n V hV + (∀ (sigma : Gal(L/K)) (a : V), + chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) V (sigma • a) = + sigma • chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) V a) ∧ + (∀ (sigma : Gal(L/K)) (a : 𝒪[L]ˣ), + chosenNormalBasisIntegerUnitsQuotientMap (L := L) V (sigma • a) = + sigma • chosenNormalBasisIntegerUnitsQuotientMap (L := L) V a) ∧ + (∀ a : 𝒪[L]ˣ, + chosenNormalBasisIntegerUnitsQuotientMap (L := L) V a = 1 ↔ + ∃ v : V, + chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) V v = a) ∧ + Function.Injective + (chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) V) ∧ + Function.Surjective + (chosenNormalBasisIntegerUnitsQuotientMap (L := L) V) := by + let := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + let := chosenNormalBasisIntegerUnitsQuotMulDistribMulAction K L n V hV + refine ⟨chosenNormalBasisPrincipalUnitSubgroupInclusion_equivariant K L n V hV, + chosenNormalBasisIntegerUnitsQuotientMap_equivariant K L n V hV, ?_, + chosenNormalBasisPrincipalUnitSubgroupInclusion_injective (L := L) V, + chosenNormalBasisIntegerUnitsQuotientMap_surjective (L := L) V⟩ + intro a + have hrange := + chosenNormalBasisPrincipalUnitSubgroupInclusion_range_eq_ker_quotient + (L := L) V + constructor + · intro ha + have ha' : a ∈ MonoidHom.ker + (chosenNormalBasisIntegerUnitsQuotientMap (L := L) V) := ha + rw [← hrange] at ha' + exact ha' + · rintro ⟨v, rfl⟩ + have hv : + chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) V v ∈ + MonoidHom.range + (chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) V) := + ⟨v, rfl⟩ + rw [hrange] at hv + exact hv + +/-- Integer-unit Herbrand calculation at one chosen normal-basis +level. The only low-degree cohomology input is the proved vanishing of +`H⁰(G,V)` and `H⁻¹(G,V)`; finiteness of `𝒪_Lˣ/V` is the other honest +input. -/ +theorem integerUnits_herbrandQuotient_eq_one_of_chosenNormalBasis + (n : Nat) (V : Subgroup 𝒪[L]ˣ) + (hV : (V : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) + (hfinite : Finite (𝒪[L]ˣ ⧸ V)) + (g : Gal(L/K)) + (hg : ∀ sigma : Gal(L/K), sigma ∈ Subgroup.zpowers g) + (hH0 : + letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV + Subsingleton (HerbrandH0 (Gal(L/K)) V)) + (hHminusOne : + letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV + Subsingleton (HerbrandHMinusOne (Gal(L/K)) V g)) : + letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + letI := chosenNormalBasisIntegerUnitsQuotMulDistribMulAction K L n V hV + ∃ _ : HerbrandQuotientDefined (Gal(L/K)) 𝒪[L]ˣ g, + @herbrandQuotient (Gal(L/K)) 𝒪[L]ˣ _ _ _ + (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) + g = 1 := by + let := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + let := chosenNormalBasisIntegerUnitsQuotMulDistribMulAction K L n V hV + let : Finite (𝒪[L]ˣ ⧸ V) := hfinite + let : Subsingleton (HerbrandH0 (Gal(L/K)) V) := hH0 + let : Subsingleton (HerbrandHMinusOne (Gal(L/K)) V g) := hHminusOne + let hVdefined : HerbrandQuotientDefined (Gal(L/K)) V g := + ⟨inferInstance, inferInstance⟩ + let hQdefined : HerbrandQuotientDefined (Gal(L/K)) (𝒪[L]ˣ ⧸ V) g := + ⟨inferInstance, inferInstance⟩ + let hseq := chosenNormalBasisIntegerUnitsHerbrand_shortExact K L n V hV + have hsurj : ∀ c : 𝒪[L]ˣ ⧸ V, ∃ b : 𝒪[L]ˣ, + chosenNormalBasisIntegerUnitsQuotientMap (L := L) V b = c := by + intro c + exact hseq.2.2.2.2 c + let hU := herbrandQuotientDefined_middle_of_left_right + (G := Gal(L/K)) (A := V) (B := 𝒪[L]ˣ) (C := 𝒪[L]ˣ ⧸ V) + (chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) V) + (chosenNormalBasisIntegerUnitsQuotientMap (L := L) V) + hseq.1 hseq.2.1 hseq.2.2.1 hseq.2.2.2.1 hsurj + g hg hVdefined hQdefined + refine ⟨hU, ?_⟩ + let : Finite (HerbrandH0 (Gal(L/K)) 𝒪[L]ˣ) := hU.1 + let : Finite (HerbrandHMinusOne (Gal(L/K)) 𝒪[L]ˣ g) := hU.2 + have hVone : herbrandQuotient (G := Gal(L/K)) (A := V) g = 1 := by + exact herbrandQuotient_eq_one_of_card_eq + (G := Gal(L/K)) (A := V) g + (by simp only [Nat.card_unique]) + have hQone : + herbrandQuotient (G := Gal(L/K)) (A := 𝒪[L]ˣ ⧸ V) g = 1 := by + exact herbrandQuotient_eq_one_of_finite_module + (G := Gal(L/K)) (A := 𝒪[L]ˣ ⧸ V) g hg + have hmul : herbrandQuotient (G := Gal(L/K)) (A := 𝒪[L]ˣ) g = + herbrandQuotient (G := Gal(L/K)) (A := V) g * + herbrandQuotient (G := Gal(L/K)) (A := 𝒪[L]ˣ ⧸ V) g := + herbrandQuotient_multiplicative_of_shortExact + (G := Gal(L/K)) (A := V) (B := 𝒪[L]ˣ) (C := 𝒪[L]ˣ ⧸ V) + (chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) V) + (chosenNormalBasisIntegerUnitsQuotientMap (L := L) V) + hseq.1 hseq.2.1 hseq.2.2.1 hseq.2.2.2.1 hsurj g hg + exact hmul.trans (by rw [hVone, hQone, one_mul]) + +variable [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Module.Finite 𝒪[K] 𝒪[L]] + +/-- At all sufficiently deep chosen normal-basis levels: +`H⁰(G,V)=H⁻¹(G,V)=1` implies that the integer-unit Herbrand quotient is +defined and equals `1`. -/ +theorem exists_integerUnits_herbrandQuotient_eq_one_of_large_chosenNormalBasisLevel : + ∃ c : Nat, ∀ n : Nat, c ≤ n → + ∀ (V : Subgroup 𝒪[L]ˣ) + (hV : (V : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) + (g : Gal(L/K)), + (∀ sigma : Gal(L/K), sigma ∈ Subgroup.zpowers g) → + (letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV; + Subsingleton (HerbrandH0 (Gal(L/K)) V)) → + (letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV; + Subsingleton (HerbrandHMinusOne (Gal(L/K)) V g)) → + letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + letI := chosenNormalBasisIntegerUnitsQuotMulDistribMulAction K L n V hV + ∃ _ : HerbrandQuotientDefined (Gal(L/K)) 𝒪[L]ˣ g, + @herbrandQuotient (Gal(L/K)) 𝒪[L]ˣ _ _ _ + (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) + g = 1 := by + rcases exists_finite_chosenNormalBasisIntegerUnitsQuotient + (K := K) (L := L) with ⟨c, hc⟩ + refine ⟨c, ?_⟩ + intro n hcn V hV g hg hH0 hHminusOne + exact integerUnits_herbrandQuotient_eq_one_of_chosenNormalBasis + K L n V hV (hc n hcn V hV) g hg hH0 hHminusOne + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks.lean new file mode 100644 index 0000000000..3a394fe477 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.FamilyClassAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Induced +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.TensorNorm + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/All.lean new file mode 100644 index 0000000000..c4ed3d9faa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/All.lean @@ -0,0 +1,20 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.FamilyClassAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Induced +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.TensorNorm +/-! +# Local class-formation blocks + +Aggregate for the local block families, their induced and tensor +constructions, and the resulting class-field axiom. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family.lean new file mode 100644 index 0000000000..6f5aeb4b8e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.H0 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.HMinusOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.Instances + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/All.lean new file mode 100644 index 0000000000..be9073ce3b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/All.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.H0 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.HMinusOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.Instances +/-! +# Finite families of local idele blocks + +Public facade for the canonical family instances and the degree-zero and +degree-minus-one Herbrand equivalences. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/H0.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/H0.lean new file mode 100644 index 0000000000..6a5a5be93c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/H0.lean @@ -0,0 +1,90 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.Instances +/-! +# Degree-zero cohomology of finite local-block families +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology + +universe u v w + +variable {K : Type u} {L : Type v} + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- Degree-zero cohomology for a finite family of local blocks. -/ +noncomputable def localBlockFamilyHerbrandH0Equiv + {ι : Type w} + (d : ι → LocalPlaceDatum K L) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + letI _localAction : ∀ i, + MulDistribMulAction + (absoluteValueDecompositionGroup K (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ := + fun i ↦ decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + letI _blockAction : ∀ i, + MulDistribMulAction (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) := + fun i ↦ inducedMulDistribMulAction + (absoluteValueDecompositionGroup K (d i).extension.1) + letI _familyAction : + MulDistribMulAction (L ≃ₐ[K] L) + (LocalBlockFamily d) := + piMulDistribMulAction (L ≃ₐ[K] L) + (fun i ↦ LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) + letI _decompositionFintype : ∀ i, + Fintype + (absoluteValueDecompositionGroup K + (d i).extension.1) := + fun _ ↦ Fintype.ofFinite _ + HerbrandH0 (L ≃ₐ[K] L) + (LocalBlockFamily d) ≃* + ∀ i, + HerbrandH0 + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ := by + letI localAction := localBlockFamilyLocalAction d + letI blockAction := localBlockFamilyBlockAction d + letI familyAction := localBlockFamilyCohomologyAction d + letI decompositionFintype := + localBlockFamilyDecompositionFintype d + exact + (herbrandH0PiEquiv + (G := L ≃ₐ[K] L) + (fun i ↦ LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension)).trans + (MulEquiv.piCongrRight fun i ↦ + localPlaceBlockHerbrandH0Equiv + (d i).base (d i).base_isNontrivial + (d i).extension σ hgen) + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/HMinusOne.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/HMinusOne.lean new file mode 100644 index 0000000000..f4578f567f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/HMinusOne.lean @@ -0,0 +1,94 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.H0 +/-! +# Degree-minus-one cohomology of finite local-block families +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology + +universe u v w + +variable {K : Type u} {L : Type v} + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- Degree-minus-one cohomology for a finite family of local blocks. -/ +noncomputable def localBlockFamilyHerbrandHMinusOneEquiv + {ι : Type w} + (d : ι → LocalPlaceDatum K L) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + letI _localAction : ∀ i, + MulDistribMulAction + (absoluteValueDecompositionGroup K (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ := + fun i ↦ decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + letI _blockAction : ∀ i, + MulDistribMulAction (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) := + fun i ↦ inducedMulDistribMulAction + (absoluteValueDecompositionGroup K (d i).extension.1) + letI _familyAction : + MulDistribMulAction (L ≃ₐ[K] L) + (LocalBlockFamily d) := + piMulDistribMulAction (L ≃ₐ[K] L) + (fun i ↦ LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) + letI _decompositionFintype : ∀ i, + Fintype + (absoluteValueDecompositionGroup K + (d i).extension.1) := + fun _ ↦ Fintype.ofFinite _ + HerbrandHMinusOne (L ≃ₐ[K] L) + (LocalBlockFamily d) σ ≃* + ∀ i, + HerbrandHMinusOne + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K + (d i).extension.1) + σ hgen) := by + letI localAction := localBlockFamilyLocalAction d + letI blockAction := localBlockFamilyBlockAction d + letI familyAction := localBlockFamilyCohomologyAction d + letI decompositionFintype := + localBlockFamilyDecompositionFintype d + exact + (herbrandHMinusOnePiEquiv + (G := L ≃ₐ[K] L) + (fun i ↦ LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) σ).trans + (MulEquiv.piCongrRight fun i ↦ + localPlaceBlockHerbrandHMinusOneEquiv + (d i).base (d i).base_isNontrivial + (d i).extension σ hgen) + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/Instances.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/Instances.lean new file mode 100644 index 0000000000..55626c8a06 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/Instances.lean @@ -0,0 +1,108 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Induced +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Product +/-! +# Finite families of local idele blocks + +This file combines the local induced-module calculation over a finite +family of places. It is the finite-support part of the localized class formation. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology + +universe u v w + +variable (K : Type u) (L : Type v) + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- A chosen extension `w` of a nontrivial base absolute value. These are +exactly the concrete inputs needed to form one local block. -/ +structure LocalPlaceDatum where + /-- The base absolute value. -/ + base : AbsoluteValue K ℝ + /-- Nontriviality of the base absolute value. -/ + base_isNontrivial : base.IsNontrivial + /-- A chosen extension of the base absolute value to `L`. -/ + extension : AbsoluteValueExtension base L + +variable {K L} + +/-- Product of the local blocks attached to a family of chosen places. -/ +abbrev LocalBlockFamily {ι : Type w} + (d : ι → LocalPlaceDatum K L) := + ∀ i, LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension + + +/-- Canonical componentwise decomposition-group action for a local-block +family. -/ +@[reducible] +noncomputable def localBlockFamilyLocalAction + {ι : Type w} (d : ι → LocalPlaceDatum K L) : + ∀ i, MulDistribMulAction + (absoluteValueDecompositionGroup K (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ := + fun i => + decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + +/-- Canonical induced action on every local block in a family. -/ +@[reducible] +noncomputable def localBlockFamilyBlockAction + {ι : Type w} (d : ι → LocalPlaceDatum K L) : + ∀ i, MulDistribMulAction (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) := by + letI := localBlockFamilyLocalAction d + exact fun i => + inducedMulDistribMulAction + (absoluteValueDecompositionGroup K + (d i).extension.1) + +/-- Canonical componentwise action on the product of a local-block family. -/ +@[reducible] +noncomputable def localBlockFamilyCohomologyAction + {ι : Type w} (d : ι → LocalPlaceDatum K L) : + MulDistribMulAction (L ≃ₐ[K] L) + (LocalBlockFamily d) := by + letI := localBlockFamilyLocalAction d + letI := localBlockFamilyBlockAction d + exact + piMulDistribMulAction (L ≃ₐ[K] L) + (fun i ↦ LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) + +/-- Canonical finite structures on the decomposition groups in a local-block +family. -/ +@[reducible] +noncomputable def localBlockFamilyDecompositionFintype + {ι : Type w} (d : ι → LocalPlaceDatum K L) : + ∀ i, Fintype + (absoluteValueDecompositionGroup K + (d i).extension.1) := + fun _ => Fintype.ofFinite _ + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/FamilyClassAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/FamilyClassAxiom.lean new file mode 100644 index 0000000000..6dad9827b5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/FamilyClassAxiom.lean @@ -0,0 +1,848 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.Instances +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.H0 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.HMinusOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Product +/-! +# The local class-field axiom for finite families of local blocks + +This file combines the local class-field calculation with the finite-product +description of local idele blocks. It supplies the finite-place-family part +of the finite family of localized class-formation blocks: + +* degree-zero cohomology is the product of the genuine local norm quotients; +* degree-minus-one cohomology has cardinality one; +* the Herbrand quotient is the product of the local degrees. +-/ + +@[expose] public section + +open scoped BigOperators + +noncomputable +section + +namespace LocalClassFieldTheory + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology +open LocalClassFieldTheory +open LocalFieldTheory + +universe uι + +variable {K L : Type} + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] +variable {ι : Type uι} [Fintype ι] + +/-- Degree-zero local-block cohomology, with the local terms identified with their +actual norm quotients. -/ +noncomputable def localBlockFamilyHerbrandH0EquivNormQuotients + (d : ι → LocalPlaceDatum K L) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + letI _extensionAlgebra : ∀ i, + Algebra K (d i).extension.1.Completion := + fun i ↦ AbsoluteValue.extensionCompletionAlgebra + (K := K) (d i).extension.1 + letI _extensionSmul : ∀ i, + SMul K (d i).extension.1.Completion := + fun i ↦ (inferInstance : + Algebra K (d i).extension.1.Completion).toSMul + letI _completionAlgebra : ∀ i, + Algebra (d i).base.Completion + (d i).extension.1.Completion := + fun i ↦ AbsoluteValue.completionAlgebra + (d i).base (d i).extension.1 + (d i).extension.2 + letI _globalAlgebra : ∀ i, + Algebra K + (LocalizedCompletion + (d i).base (d i).extension) := + fun i ↦ localizedCompletionGlobalAlgebra + (d i).base (d i).extension + letI _scalarTower : ∀ i, + IsScalarTower K (d i).base.Completion + (LocalizedCompletion + (d i).base (d i).extension) := + fun i ↦ localizedCompletionIsScalarTower + (d i).base (d i).extension + letI _localizedFinite : ∀ i, + FiniteDimensional (d i).base.Completion + (LocalizedCompletion + (d i).base (d i).extension) := + fun i ↦ localizedCompletionModuleFinite + (d i).base (d i).base_isNontrivial + (d i).extension + letI _localizedGalois : ∀ i, + IsGalois (d i).base.Completion + (LocalizedCompletion + (d i).base (d i).extension) := + fun i ↦ HilbertRamification.algebraicLocalization_isGalois + (d i).base (d i).extension + letI _localAction : ∀ i, + MulDistribMulAction + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ := + fun i ↦ decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + letI _blockAction : ∀ i, + MulDistribMulAction (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) := + fun i ↦ inducedMulDistribMulAction + (absoluteValueDecompositionGroup K + (d i).extension.1) + letI _familyAction : + MulDistribMulAction (L ≃ₐ[K] L) + (LocalBlockFamily d) := + piMulDistribMulAction (L ≃ₐ[K] L) + (fun i ↦ LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) + letI _decompositionFintype : ∀ i, + Fintype + (absoluteValueDecompositionGroup K + (d i).extension.1) := + fun _ ↦ Fintype.ofFinite _ + HerbrandH0 (L ≃ₐ[K] L) + (LocalBlockFamily d) ≃* + ∀ i, NormQuotient + (d i).base.Completion + (LocalizedCompletion + (d i).base (d i).extension) := by + letI extensionAlgebra : ∀ i, + Algebra K (d i).extension.1.Completion := + fun i ↦ AbsoluteValue.extensionCompletionAlgebra + (K := K) (d i).extension.1 + letI extensionSmul : ∀ i, + SMul K (d i).extension.1.Completion := + fun i ↦ (extensionAlgebra i).toSMul + letI completionAlgebra : ∀ i, + Algebra (d i).base.Completion + (d i).extension.1.Completion := + fun i ↦ AbsoluteValue.completionAlgebra + (d i).base (d i).extension.1 + (d i).extension.2 + letI globalAlgebra : ∀ i, + Algebra K + (LocalizedCompletion + (d i).base (d i).extension) := + fun i ↦ localizedCompletionGlobalAlgebra + (d i).base (d i).extension + letI scalarTower : ∀ i, + IsScalarTower K (d i).base.Completion + (LocalizedCompletion + (d i).base (d i).extension) := + fun i ↦ localizedCompletionIsScalarTower + (d i).base (d i).extension + letI localizedFinite : ∀ i, + FiniteDimensional (d i).base.Completion + (LocalizedCompletion + (d i).base (d i).extension) := + fun i ↦ localizedCompletionModuleFinite + (d i).base (d i).base_isNontrivial + (d i).extension + letI localizedGalois : ∀ i, + IsGalois (d i).base.Completion + (LocalizedCompletion + (d i).base (d i).extension) := + fun i ↦ HilbertRamification.algebraicLocalization_isGalois + (d i).base (d i).extension + letI localAction : ∀ i, + MulDistribMulAction + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ := + fun i ↦ decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + letI blockAction : ∀ i, + MulDistribMulAction (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) := + fun i ↦ inducedMulDistribMulAction + (absoluteValueDecompositionGroup K + (d i).extension.1) + letI familyAction : + MulDistribMulAction (L ≃ₐ[K] L) + (LocalBlockFamily d) := + piMulDistribMulAction (L ≃ₐ[K] L) + (fun i ↦ LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) + letI decompositionFintype : ∀ i, + Fintype + (absoluteValueDecompositionGroup K + (d i).extension.1) := + fun _ ↦ Fintype.ofFinite _ + exact + (localBlockFamilyHerbrandH0Equiv + d σ hgen).trans + (MulEquiv.piCongrRight fun i ↦ + localHerbrandH0EquivNormQuotient + (d i).base (d i).base_isNontrivial + (d i).extension) + +omit [Fintype ι] in +/-- The degree-zero cohomology of a finite family of local blocks is finite. -/ +theorem localBlockFamilyHerbrandH0Finite [Finite ι] + (d : ι → LocalPlaceDatum K L) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) + [∀ i, ValuativeRel (d i).base.Completion] + [∀ i, + IsNonarchimedeanLocalField + (d i).base.Completion] : + letI _localAction : ∀ i, + MulDistribMulAction + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ := + fun i ↦ decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + letI _blockAction : ∀ i, + MulDistribMulAction (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) := + fun i ↦ inducedMulDistribMulAction + (absoluteValueDecompositionGroup K + (d i).extension.1) + letI _familyAction : + MulDistribMulAction (L ≃ₐ[K] L) + (LocalBlockFamily d) := + piMulDistribMulAction (L ≃ₐ[K] L) + (fun i ↦ LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) + letI _decompositionFintype : ∀ i, + Fintype + (absoluteValueDecompositionGroup K + (d i).extension.1) := + fun _ ↦ Fintype.ofFinite _ + Finite + (HerbrandH0 (L ≃ₐ[K] L) + (LocalBlockFamily d)) := by + classical + let := Fintype.ofFinite ι + let extensionAlgebra : ∀ i, + Algebra K (d i).extension.1.Completion := + fun i ↦ AbsoluteValue.extensionCompletionAlgebra + (K := K) (d i).extension.1 + let extensionSmul : ∀ i, + SMul K (d i).extension.1.Completion := + fun i ↦ (extensionAlgebra i).toSMul + let completionAlgebra : ∀ i, + Algebra (d i).base.Completion + (d i).extension.1.Completion := + fun i ↦ AbsoluteValue.completionAlgebra + (d i).base (d i).extension.1 + (d i).extension.2 + let globalAlgebra : ∀ i, + Algebra K + (LocalizedCompletion + (d i).base (d i).extension) := + fun i ↦ localizedCompletionGlobalAlgebra + (d i).base (d i).extension + let scalarTower : ∀ i, + IsScalarTower K (d i).base.Completion + (LocalizedCompletion + (d i).base (d i).extension) := + fun i ↦ localizedCompletionIsScalarTower + (d i).base (d i).extension + let localizedFinite : ∀ i, + FiniteDimensional (d i).base.Completion + (LocalizedCompletion + (d i).base (d i).extension) := + fun i ↦ localizedCompletionModuleFinite + (d i).base (d i).base_isNontrivial + (d i).extension + let localizedGalois : ∀ i, + IsGalois (d i).base.Completion + (LocalizedCompletion + (d i).base (d i).extension) := + fun i ↦ HilbertRamification.algebraicLocalization_isGalois + (d i).base (d i).extension + let localAction : ∀ i, + MulDistribMulAction + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ := + fun i ↦ decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + let blockAction : ∀ i, + MulDistribMulAction (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) := + fun i ↦ inducedMulDistribMulAction + (absoluteValueDecompositionGroup K + (d i).extension.1) + let familyAction : + MulDistribMulAction (L ≃ₐ[K] L) + (LocalBlockFamily d) := + piMulDistribMulAction (L ≃ₐ[K] L) + (fun i ↦ LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) + let decompositionFintype : ∀ i, + Fintype + (absoluteValueDecompositionGroup K + (d i).extension.1) := + fun _ ↦ Fintype.ofFinite _ + let localFinite : ∀ i, + Finite + (HerbrandH0 + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ) := + fun i ↦ localHerbrandH0Finite + (d i).base (d i).base_isNontrivial + (d i).extension σ hgen + exact Finite.of_equiv + (∀ i, + HerbrandH0 + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ) + (localBlockFamilyHerbrandH0Equiv + d σ hgen).symm.toEquiv + +omit [Fintype ι] in +/-- The degree-minus-one cohomology of a finite family of local blocks is +finite. -/ +theorem localBlockFamilyHerbrandHMinusOneFinite [Finite ι] + (d : ι → LocalPlaceDatum K L) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) + [∀ i, ValuativeRel (d i).base.Completion] + [∀ i, + IsNonarchimedeanLocalField + (d i).base.Completion] : + letI _localAction : ∀ i, + MulDistribMulAction + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ := + fun i ↦ decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + letI _blockAction : ∀ i, + MulDistribMulAction (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) := + fun i ↦ inducedMulDistribMulAction + (absoluteValueDecompositionGroup K + (d i).extension.1) + letI _familyAction : + MulDistribMulAction (L ≃ₐ[K] L) + (LocalBlockFamily d) := + piMulDistribMulAction (L ≃ₐ[K] L) + (fun i ↦ LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) + letI _decompositionFintype : ∀ i, + Fintype + (absoluteValueDecompositionGroup K + (d i).extension.1) := + fun _ ↦ Fintype.ofFinite _ + Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (LocalBlockFamily d) σ) := by + classical + let := Fintype.ofFinite ι + let extensionAlgebra : ∀ i, + Algebra K (d i).extension.1.Completion := + fun i ↦ AbsoluteValue.extensionCompletionAlgebra + (K := K) (d i).extension.1 + let extensionSmul : ∀ i, + SMul K (d i).extension.1.Completion := + fun i ↦ (extensionAlgebra i).toSMul + let completionAlgebra : ∀ i, + Algebra (d i).base.Completion + (d i).extension.1.Completion := + fun i ↦ AbsoluteValue.completionAlgebra + (d i).base (d i).extension.1 + (d i).extension.2 + let globalAlgebra : ∀ i, + Algebra K + (LocalizedCompletion + (d i).base (d i).extension) := + fun i ↦ localizedCompletionGlobalAlgebra + (d i).base (d i).extension + let scalarTower : ∀ i, + IsScalarTower K (d i).base.Completion + (LocalizedCompletion + (d i).base (d i).extension) := + fun i ↦ localizedCompletionIsScalarTower + (d i).base (d i).extension + let localizedFinite : ∀ i, + FiniteDimensional (d i).base.Completion + (LocalizedCompletion + (d i).base (d i).extension) := + fun i ↦ localizedCompletionModuleFinite + (d i).base (d i).base_isNontrivial + (d i).extension + let localizedGalois : ∀ i, + IsGalois (d i).base.Completion + (LocalizedCompletion + (d i).base (d i).extension) := + fun i ↦ HilbertRamification.algebraicLocalization_isGalois + (d i).base (d i).extension + let localAction : ∀ i, + MulDistribMulAction + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ := + fun i ↦ decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + let blockAction : ∀ i, + MulDistribMulAction (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) := + fun i ↦ inducedMulDistribMulAction + (absoluteValueDecompositionGroup K + (d i).extension.1) + let familyAction : + MulDistribMulAction (L ≃ₐ[K] L) + (LocalBlockFamily d) := + piMulDistribMulAction (L ≃ₐ[K] L) + (fun i ↦ LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) + let decompositionFintype : ∀ i, + Fintype + (absoluteValueDecompositionGroup K + (d i).extension.1) := + fun _ ↦ Fintype.ofFinite _ + let localFinite : ∀ i, + Finite + (HerbrandHMinusOne + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K + (d i).extension.1) + σ hgen)) := + fun i ↦ localHerbrandHMinusOneFinite + (d i).base (d i).base_isNontrivial + (d i).extension σ hgen + exact Finite.of_equiv + (∀ i, + HerbrandHMinusOne + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K + (d i).extension.1) + σ hgen)) + (localBlockFamilyHerbrandHMinusOneEquiv + d σ hgen).symm.toEquiv + +omit [Fintype ι] in +/-- In degree minus one, a finite family of local blocks has +degree-minus-one cohomology of cardinality one. -/ +theorem localBlockFamilyHerbrandHMinusOne_card_eq_one [Finite ι] + (d : ι → LocalPlaceDatum K L) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) + [∀ i, ValuativeRel (d i).base.Completion] + [∀ i, + IsNonarchimedeanLocalField + (d i).base.Completion] : + letI _localAction : ∀ i, + MulDistribMulAction + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ := + fun i ↦ decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + letI _blockAction : ∀ i, + MulDistribMulAction (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) := + fun i ↦ inducedMulDistribMulAction + (absoluteValueDecompositionGroup K + (d i).extension.1) + letI _familyAction : + MulDistribMulAction (L ≃ₐ[K] L) + (LocalBlockFamily d) := + piMulDistribMulAction (L ≃ₐ[K] L) + (fun i ↦ LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) + letI _decompositionFintype : ∀ i, + Fintype + (absoluteValueDecompositionGroup K + (d i).extension.1) := + fun _ ↦ Fintype.ofFinite _ + letI _familyFinite : + Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (LocalBlockFamily d) σ) := + localBlockFamilyHerbrandHMinusOneFinite + d σ hgen + Nat.card + (HerbrandHMinusOne (L ≃ₐ[K] L) + (LocalBlockFamily d) σ) = 1 := by + classical + let := Fintype.ofFinite ι + let extensionAlgebra : ∀ i, + Algebra K (d i).extension.1.Completion := + fun i ↦ AbsoluteValue.extensionCompletionAlgebra + (K := K) (d i).extension.1 + let extensionSmul : ∀ i, + SMul K (d i).extension.1.Completion := + fun i ↦ (extensionAlgebra i).toSMul + let completionAlgebra : ∀ i, + Algebra (d i).base.Completion + (d i).extension.1.Completion := + fun i ↦ AbsoluteValue.completionAlgebra + (d i).base (d i).extension.1 + (d i).extension.2 + let globalAlgebra : ∀ i, + Algebra K + (LocalizedCompletion + (d i).base (d i).extension) := + fun i ↦ localizedCompletionGlobalAlgebra + (d i).base (d i).extension + let scalarTower : ∀ i, + IsScalarTower K (d i).base.Completion + (LocalizedCompletion + (d i).base (d i).extension) := + fun i ↦ localizedCompletionIsScalarTower + (d i).base (d i).extension + let localizedFinite : ∀ i, + FiniteDimensional (d i).base.Completion + (LocalizedCompletion + (d i).base (d i).extension) := + fun i ↦ localizedCompletionModuleFinite + (d i).base (d i).base_isNontrivial + (d i).extension + let localizedGalois : ∀ i, + IsGalois (d i).base.Completion + (LocalizedCompletion + (d i).base (d i).extension) := + fun i ↦ HilbertRamification.algebraicLocalization_isGalois + (d i).base (d i).extension + let localAction : ∀ i, + MulDistribMulAction + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ := + fun i ↦ decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + let blockAction : ∀ i, + MulDistribMulAction (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) := + fun i ↦ inducedMulDistribMulAction + (absoluteValueDecompositionGroup K + (d i).extension.1) + let familyAction : + MulDistribMulAction (L ≃ₐ[K] L) + (LocalBlockFamily d) := + piMulDistribMulAction (L ≃ₐ[K] L) + (fun i ↦ LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) + let decompositionFintype : ∀ i, + Fintype + (absoluteValueDecompositionGroup K + (d i).extension.1) := + fun _ ↦ Fintype.ofFinite _ + let localFinite : ∀ i, + Finite + (HerbrandHMinusOne + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K + (d i).extension.1) + σ hgen)) := + fun i ↦ localHerbrandHMinusOneFinite + (d i).base (d i).base_isNontrivial + (d i).extension σ hgen + let familyFinite : + Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (LocalBlockFamily d) σ) := + localBlockFamilyHerbrandHMinusOneFinite + d σ hgen + calc + Nat.card + (HerbrandHMinusOne (L ≃ₐ[K] L) + (LocalBlockFamily d) σ) = + Nat.card + (∀ i, + HerbrandHMinusOne + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K + (d i).extension.1) + σ hgen)) := + Nat.card_congr + (localBlockFamilyHerbrandHMinusOneEquiv + d σ hgen).toEquiv + _ = ∏ i, Nat.card + (HerbrandHMinusOne + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K + (d i).extension.1) + σ hgen)) := + Nat.card_pi + _ = ∏ _i : ι, 1 := by + apply Finset.prod_congr rfl + intro i _ + exact localHerbrandHMinusOne_card_eq_one + (d i).base (d i).base_isNontrivial + (d i).extension σ hgen + _ = 1 := by simp + +/-- The Herbrand quotient of a finite family of local blocks is +the product of the corresponding local degrees. -/ +theorem localBlockFamily_herbrandQuotient_eq_product_localDegrees + (d : ι → LocalPlaceDatum K L) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) + [∀ i, ValuativeRel (d i).base.Completion] + [∀ i, + IsNonarchimedeanLocalField + (d i).base.Completion] : + letI _extensionAlgebra := + fun i : ι ↦ AbsoluteValue.extensionCompletionAlgebra + (K := K) (d i).extension.1 + letI _extensionSmul : ∀ i, + SMul K (d i).extension.1.Completion := + fun i ↦ (inferInstance : + Algebra K (d i).extension.1.Completion).toSMul + letI _completionAlgebra := + fun i : ι ↦ AbsoluteValue.completionAlgebra + (d i).base (d i).extension.1 + (d i).extension.2 + letI _globalAlgebra := + fun i : ι ↦ localizedCompletionGlobalAlgebra + (d i).base (d i).extension + letI _scalarTower := + fun i : ι ↦ localizedCompletionIsScalarTower + (d i).base (d i).extension + letI _localizedFinite := + fun i : ι ↦ localizedCompletionModuleFinite + (d i).base (d i).base_isNontrivial + (d i).extension + letI _localizedGalois := + fun i : ι ↦ HilbertRamification.algebraicLocalization_isGalois + (d i).base (d i).extension + letI _localAction := + fun i : ι ↦ decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + letI _blockAction : ∀ i, + MulDistribMulAction (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) := + fun i : ι ↦ inducedMulDistribMulAction + (absoluteValueDecompositionGroup K + (d i).extension.1) + letI _familyAction := + piMulDistribMulAction (L ≃ₐ[K] L) + (fun i ↦ LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) + letI _decompositionFintype : ∀ i, + Fintype + (absoluteValueDecompositionGroup K + (d i).extension.1) := + fun _ ↦ Fintype.ofFinite _ + letI _familyH0Finite := + localBlockFamilyHerbrandH0Finite + d σ hgen + letI _familyHMinusOneFinite := + localBlockFamilyHerbrandHMinusOneFinite + d σ hgen + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := LocalBlockFamily d) σ = + ∏ i, (Module.finrank + (d i).base.Completion + (LocalizedCompletion + (d i).base (d i).extension) : ℚ) := by + let extensionAlgebra := + fun i : ι ↦ AbsoluteValue.extensionCompletionAlgebra + (K := K) (d i).extension.1 + let extensionSmul : ∀ i, + SMul K (d i).extension.1.Completion := + fun i ↦ (extensionAlgebra i).toSMul + let completionAlgebra := + fun i : ι ↦ AbsoluteValue.completionAlgebra + (d i).base (d i).extension.1 + (d i).extension.2 + let globalAlgebra := + fun i : ι ↦ localizedCompletionGlobalAlgebra + (d i).base (d i).extension + let scalarTower := + fun i : ι ↦ localizedCompletionIsScalarTower + (d i).base (d i).extension + let localizedFinite := + fun i : ι ↦ localizedCompletionModuleFinite + (d i).base (d i).base_isNontrivial + (d i).extension + let localizedGalois := + fun i : ι ↦ HilbertRamification.algebraicLocalization_isGalois + (d i).base (d i).extension + let localAction := + fun i : ι ↦ decompositionGroupLocalUnitsAction + (d i).base (d i).base_isNontrivial + (d i).extension + let blockAction : ∀ i, + MulDistribMulAction (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) := + fun i : ι ↦ inducedMulDistribMulAction + (absoluteValueDecompositionGroup K + (d i).extension.1) + let familyAction := + piMulDistribMulAction (L ≃ₐ[K] L) + (fun i ↦ LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) + let decompositionFintype : ∀ i, + Fintype + (absoluteValueDecompositionGroup K + (d i).extension.1) := + fun _ ↦ Fintype.ofFinite _ + let localH0Finite := + fun i : ι ↦ localHerbrandH0Finite + (d i).base (d i).base_isNontrivial + (d i).extension σ hgen + let localHMinusOneFinite := + fun i : ι ↦ localHerbrandHMinusOneFinite + (d i).base (d i).base_isNontrivial + (d i).extension σ hgen + let blockH0Finite := + fun i : ι ↦ Finite.of_equiv + (HerbrandH0 + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ) + (localPlaceBlockHerbrandH0Equiv + (d i).base (d i).base_isNontrivial + (d i).extension σ hgen).symm.toEquiv + let blockHMinusOneFinite := + fun i : ι ↦ Finite.of_equiv + (HerbrandHMinusOne + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K + (d i).extension.1) + σ hgen)) + (localPlaceBlockHerbrandHMinusOneEquiv + (d i).base (d i).base_isNontrivial + (d i).extension σ hgen).symm.toEquiv + let familyH0Finite := + localBlockFamilyHerbrandH0Finite + d σ hgen + let familyHMinusOneFinite := + localBlockFamilyHerbrandHMinusOneFinite + d σ hgen + calc + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := LocalBlockFamily d) σ = + ∏ i, herbrandQuotient + (G := L ≃ₐ[K] L) + (A := LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) σ := + herbrandQuotient_pi + (fun i ↦ LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) σ + _ = ∏ i, (Module.finrank + (d i).base.Completion + (LocalizedCompletion + (d i).base (d i).extension) : ℚ) := by + apply Finset.prod_congr rfl + intro i _ + have hH0 := (Nat.card_congr + (localPlaceBlockHerbrandH0Equiv + (d i).base (d i).base_isNontrivial (d i).extension σ hgen).toEquiv).trans + (localHerbrandH0_card_eq_localDegree + (d i).base (d i).base_isNontrivial (d i).extension σ hgen) + have hHMinusOne := (Nat.card_congr + (localPlaceBlockHerbrandHMinusOneEquiv + (d i).base (d i).base_isNontrivial (d i).extension σ hgen).toEquiv).trans + (localHerbrandHMinusOne_card_eq_one + (d i).base (d i).base_isNontrivial (d i).extension σ hgen) + rw [herbrandQuotient_eq_card_ratio, + hH0, hHMinusOne] + simp + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Induced.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Induced.lean new file mode 100644 index 0000000000..8f7fac487a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Induced.lean @@ -0,0 +1,156 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Induced +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization +/-! +# Local blocks of the idele group + +For a place `w` of a Galois extension above a base absolute value `v`, its +decomposition group acts on the local multiplicative group. The product of +all conjugate local factors is therefore the induced module from that +decomposition group. This is the algebraic content of the induced local block. + +The local field is expressed as the canonical algebraic localization. +For finite extensions this is the entire metric completion by +`absoluteValueExtension_finiteLocalization_eq_top`. +-/ + +@[expose] public section + +open scoped TensorProduct + +noncomputable +section + +namespace LocalClassFieldTheory + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open CyclicCohomology.ProfiniteCohomology.Herbrand +open CyclicCohomology + +universe u v + +variable {K : Type u} {L : Type v} + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + [IsGalois K L] + +/-- The decomposition group acts on the units of the chosen local field, +through the canonical global-to-local Galois equivalence. -/ +@[reducible] +noncomputable def decompositionGroupLocalUnitsAction + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) : + MulDistribMulAction + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion vK w)ˣ := + MulDistribMulAction.compHom + (LocalizedCompletion vK w)ˣ + (decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w).toMonoidHom + +omit [FiniteDimensional K L] in +@[simp] +theorem decompositionGroup_smul_localUnit_coe + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (σ : absoluteValueDecompositionGroup K w.1) + (x : (LocalizedCompletion vK w)ˣ) : + letI := + decompositionGroupLocalUnitsAction vK hvK w + ((σ • x : (LocalizedCompletion vK w)ˣ) : + LocalizedCompletion vK w) = + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w σ (x : LocalizedCompletion vK w) := + rfl + +/-- The block of local multiplicative groups above `v`, after choosing +one extension `w`. It is the induced module from the decomposition group +at `w`. -/ +abbrev LocalPlaceBlock + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) := + @InducedModule + (G := L ≃ₐ[K] L) + (B := (LocalizedCompletion vK w)ˣ) + inferInstance + (absoluteValueDecompositionGroup K w.1) + inferInstance + (decompositionGroupLocalUnitsAction vK hvK w) + +/-- In cyclic coordinates, the local block is a finite product +of conjugate copies of the chosen completion. -/ +noncomputable def localPlaceBlockEquivProduct + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + letI := + decompositionGroupLocalUnitsAction vK hvK w + LocalPlaceBlock vK hvK w ≃* + (Fin (absoluteValueDecompositionGroup K w.1).index → + (LocalizedCompletion vK w)ˣ) := + by + letI := + decompositionGroupLocalUnitsAction vK hvK w + exact inducedCoordinatesOfFiniteCyclic + (absoluteValueDecompositionGroup K w.1) σ hgen + +/-- Degree-zero cohomology for one local block. -/ +noncomputable def localPlaceBlockHerbrandH0Equiv + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + letI := + decompositionGroupLocalUnitsAction vK hvK w + letI : Fintype (absoluteValueDecompositionGroup K w.1) := + Fintype.ofFinite _ + HerbrandH0 (L ≃ₐ[K] L) + (LocalPlaceBlock vK hvK w) ≃* + HerbrandH0 (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion vK w)ˣ := + by + letI := + decompositionGroupLocalUnitsAction vK hvK w + letI : Fintype (absoluteValueDecompositionGroup K w.1) := + Fintype.ofFinite _ + exact inducedHerbrandH0EquivOfFiniteCyclic + (absoluteValueDecompositionGroup K w.1) σ hgen + +/-- Degree-minus-one cohomology for one local block. -/ +noncomputable def localPlaceBlockHerbrandHMinusOneEquiv + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + letI := + decompositionGroupLocalUnitsAction vK hvK w + letI : Fintype (absoluteValueDecompositionGroup K w.1) := + Fintype.ofFinite _ + HerbrandHMinusOne (L ≃ₐ[K] L) + (LocalPlaceBlock vK hvK w) σ ≃* + HerbrandHMinusOne + (absoluteValueDecompositionGroup K w.1) + (LocalizedCompletion vK w)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K w.1) σ hgen) := + by + letI := + decompositionGroupLocalUnitsAction vK hvK w + letI : Fintype (absoluteValueDecompositionGroup K w.1) := + Fintype.ofFinite _ + exact inducedHerbrandHMinusOneEquivOfFiniteCyclic + (absoluteValueDecompositionGroup K w.1) σ hgen + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Tensor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Tensor.lean new file mode 100644 index 0000000000..bcedd0a1c4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Tensor.lean @@ -0,0 +1,1068 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Induced +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AbsoluteValueConjugacy +public import Mathlib.Algebra.Group.Pi.Units +/-! +# The tensor-product realization of a local induced block + +This file connects the induced module in `LocalBlock` with the actual local +factor of the scalar-extended adele algebra. The natural Galois action on +`K_v ⊗[K] L` is conjugation on the second tensor factor. The completion tensor-product theorem +identifies this algebra with the product of the completions above `v`. + +The first part records the natural tensor action and the canonical +identifications between completions at conjugate absolute values. These +identifications are the concrete source of the induced-module covariance in +the induced local-block calculation. +-/ + +@[expose] public section + +open scoped TensorProduct + +noncomputable +section + +namespace LocalClassFieldTheory + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open CyclicCohomology + +universe u v + +variable {K : Type u} {L : Type v} + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + [IsGalois K L] + +/-- The local tensor algebra occurring as the factor of +`𝔸_K ⊗[K] L` at `v`. -/ +abbrev LocalTensorAlgebra (vK : AbsoluteValue K ℝ) := + vK.Completion ⊗[K] L + +/-- Galois conjugation on the second factor of the local tensor algebra. -/ +noncomputable def localTensorConjugation + (vK : AbsoluteValue K ℝ) (σ : L ≃ₐ[K] L) : + LocalTensorAlgebra (L := L) vK ≃ₐ[vK.Completion] + LocalTensorAlgebra (L := L) vK := by + let f : + LocalTensorAlgebra (L := L) vK →ₐ[vK.Completion] + LocalTensorAlgebra (L := L) vK := + Algebra.TensorProduct.map + (AlgHom.id vK.Completion vK.Completion) σ.toAlgHom + let g : + LocalTensorAlgebra (L := L) vK →ₐ[vK.Completion] + LocalTensorAlgebra (L := L) vK := + Algebra.TensorProduct.map + (AlgHom.id vK.Completion vK.Completion) σ.symm.toAlgHom + exact AlgEquiv.ofAlgHom f g + (by ext x; simp [f, g]) + (by ext x; simp [f, g]) + +omit [FiniteDimensional K L] [IsGalois K L] in +@[simp] +theorem localTensorConjugation_tmul + (vK : AbsoluteValue K ℝ) (σ : L ≃ₐ[K] L) + (b : vK.Completion) (x : L) : + localTensorConjugation vK σ (b ⊗ₜ[K] x) = + b ⊗ₜ[K] σ x := + rfl + +omit [FiniteDimensional K L] [IsGalois K L] in +theorem localTensorConjugation_one + (vK : AbsoluteValue K ℝ) + (z : LocalTensorAlgebra (L := L) vK) : + localTensorConjugation vK (1 : L ≃ₐ[K] L) z = z := by + induction z using TensorProduct.inductionOn with + | tmul b x => simp + | add x y hx hy => simp [hx, hy] + +omit [FiniteDimensional K L] [IsGalois K L] in +theorem localTensorConjugation_mul + (vK : AbsoluteValue K ℝ) (σ τ : L ≃ₐ[K] L) + (z : LocalTensorAlgebra (L := L) vK) : + localTensorConjugation vK (σ * τ) z = + localTensorConjugation vK σ + (localTensorConjugation vK τ z) := by + induction z using TensorProduct.inductionOn with + | tmul b x => simp + | add x y hx hy => simp [hx, hy] + +/-- The natural Galois action on the unit group of the local tensor +algebra. -/ +@[reducible] +noncomputable def localTensorUnitsAction + (vK : AbsoluteValue K ℝ) : + MulDistribMulAction + (L ≃ₐ[K] L) (LocalTensorAlgebra (L := L) vK)ˣ where + smul σ z := + Units.mapEquiv (localTensorConjugation vK σ).toMulEquiv z + one_smul z := by + apply Units.ext + exact localTensorConjugation_one vK + (z : LocalTensorAlgebra (L := L) vK) + mul_smul σ τ z := by + apply Units.ext + exact localTensorConjugation_mul vK σ τ + (z : LocalTensorAlgebra (L := L) vK) + smul_mul σ x y := by + apply Units.ext + exact (localTensorConjugation vK σ).map_mul + (x : LocalTensorAlgebra (L := L) vK) + (y : LocalTensorAlgebra (L := L) vK) + smul_one σ := by + apply Units.ext + exact (localTensorConjugation vK σ).map_one + +omit [FiniteDimensional K L] [IsGalois K L] in +@[simp] +theorem localTensorUnitsAction_smul_coe + (vK : AbsoluteValue K ℝ) (σ : L ≃ₐ[K] L) + (z : (LocalTensorAlgebra (L := L) vK)ˣ) : + letI := localTensorUnitsAction (K := K) (L := L) vK + ((σ • z : (LocalTensorAlgebra (L := L) vK)ˣ) : + LocalTensorAlgebra (L := L) vK) = + localTensorConjugation vK σ + (z : LocalTensorAlgebra (L := L) vK) := + rfl + +/-- The isometric ring equivalence from the normed copy attached to +`w ∘ σ` to the normed copy attached to `w`. -/ +noncomputable def conjugateWithAbsRingEquiv + (w : AbsoluteValue L ℝ) (σ : L ≃ₐ[K] L) : + WithAbs (absoluteValueConjugate w σ) ≃+* WithAbs w := + WithAbs.congr + (absoluteValueConjugate w σ) w σ.toRingEquiv + +omit [FiniteDimensional K L] [IsGalois K L] in +theorem conjugateWithAbsRingEquiv_isometry + (w : AbsoluteValue L ℝ) (σ : L ≃ₐ[K] L) : + Isometry (conjugateWithAbsRingEquiv w σ) := by + apply AddMonoidHomClass.isometry_of_norm + intro x + rw [WithAbs.norm_eq_apply_ofAbs, WithAbs.norm_eq_apply_ofAbs] + rfl + +omit [FiniteDimensional K L] [IsGalois K L] in +theorem conjugateWithAbsRingEquiv_symm_isometry + (w : AbsoluteValue L ℝ) (σ : L ≃ₐ[K] L) : + Isometry (conjugateWithAbsRingEquiv w σ).symm := by + apply AddMonoidHomClass.isometry_of_norm + intro x + rw [WithAbs.norm_eq_apply_ofAbs, WithAbs.norm_eq_apply_ofAbs] + change w (σ (σ⁻¹ x.ofAbs)) = w x.ofAbs + exact congrArg w (σ.apply_symm_apply x.ofAbs) + +/-- The canonical equivalence between the completions at `w ∘ σ` and +`w`, induced by `σ : L → L`. -/ +noncomputable def conjugateCompletionRingEquiv + (w : AbsoluteValue L ℝ) (σ : L ≃ₐ[K] L) : + (absoluteValueConjugate w σ).Completion ≃+* + w.Completion := + UniformSpace.Completion.mapRingEquiv + (conjugateWithAbsRingEquiv w σ) + (conjugateWithAbsRingEquiv_isometry w σ).continuous + (conjugateWithAbsRingEquiv_symm_isometry w σ).continuous + +omit [FiniteDimensional K L] [IsGalois K L] in +theorem conjugateCompletionRingEquiv_toCompletion + (w : AbsoluteValue L ℝ) (σ : L ≃ₐ[K] L) (x : L) : + conjugateCompletionRingEquiv w σ + (AbsoluteValue.toCompletion + (absoluteValueConjugate w σ) x) = + AbsoluteValue.toCompletion w (σ x) := by + change + UniformSpace.Completion.mapRingEquiv + (conjugateWithAbsRingEquiv w σ) + (conjugateWithAbsRingEquiv_isometry w σ).continuous + (conjugateWithAbsRingEquiv_symm_isometry w σ).continuous + (((WithAbs.equiv + (absoluteValueConjugate w σ)).symm x : + WithAbs (absoluteValueConjugate w σ)) : + (absoluteValueConjugate w σ).Completion) = _ + rw [UniformSpace.Completion.mapRingEquiv_apply, + UniformSpace.Completion.map_coe + (conjugateWithAbsRingEquiv_isometry w σ).uniformContinuous] + rfl + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Conjugation fixes the embedded completed base field. -/ +theorem conjugateCompletionRingEquiv_completionMap + (vK : AbsoluteValue K ℝ) + (w : AbsoluteValueExtension vK L) + (σ : L ≃ₐ[K] L) (b : vK.Completion) : + conjugateCompletionRingEquiv w.1 σ + (AbsoluteValue.completionMap vK + (absoluteValueConjugate w.1 σ) + (absoluteValueConjugate_extends vK w σ) b) = + AbsoluteValue.completionMap vK w.1 w.2 b := by + refine UniformSpace.Completion.ext' + (UniformSpace.Completion.continuous_map.comp + (AbsoluteValue.completionMap_isometry + vK + (absoluteValueConjugate w.1 σ) + (absoluteValueConjugate_extends vK w σ)).continuous) + (AbsoluteValue.completionMap_isometry + vK w.1 w.2).continuous ?_ b + intro x + have hx : (x : vK.Completion) = + algebraMap K vK.Completion (WithAbs.equiv vK x) := by + rw [← AbsoluteValue.toCompletion_eq_algebraMap] + simp + rw [hx] + simp only [Function.comp_apply] + rw [AbsoluteValue.completionMap_coe, + AbsoluteValue.completionMap_coe] + change + conjugateCompletionRingEquiv w.1 σ + (AbsoluteValue.toCompletion + (absoluteValueConjugate w.1 σ) + (algebraMap K L (WithAbs.equiv vK x))) = + AbsoluteValue.toCompletion w.1 + (algebraMap K L (WithAbs.equiv vK x)) + rw [conjugateCompletionRingEquiv_toCompletion, σ.commutes] + +omit [FiniteDimensional K L] [IsGalois K L] in +theorem conjugateCompletionRingEquiv_algebraMap + (vK : AbsoluteValue K ℝ) + (w : AbsoluteValueExtension vK L) + (σ : L ≃ₐ[K] L) (b : vK.Completion) : + letI : + Algebra vK.Completion + (absoluteValueConjugate w.1 σ).Completion := + AbsoluteValue.completionAlgebra vK + (absoluteValueConjugate w.1 σ) + (absoluteValueConjugate_extends vK w σ) + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + conjugateCompletionRingEquiv w.1 σ + (algebraMap vK.Completion + (absoluteValueConjugate w.1 σ).Completion b) = + algebraMap vK.Completion w.1.Completion b := + conjugateCompletionRingEquiv_completionMap vK w σ b + +/-- The conjugate-completion equivalence with its source indexed by the +corresponding element of `AbsoluteValueExtension`. This wrapper keeps +dependent product components definitionally aligned. -/ +noncomputable def conjugateExtensionCompletionRingEquiv + (vK : AbsoluteValue K ℝ) + (w : AbsoluteValueExtension vK L) + (σ : L ≃ₐ[K] L) : + (absoluteValueExtensionConjugate vK w σ).1.Completion ≃+* + w.1.Completion := by + change + (absoluteValueConjugate w.1 σ).Completion ≃+* + w.1.Completion + exact conjugateCompletionRingEquiv w.1 σ + +omit [FiniteDimensional K L] [IsGalois K L] in +theorem conjugateExtensionCompletionRingEquiv_toCompletion + (vK : AbsoluteValue K ℝ) + (w : AbsoluteValueExtension vK L) + (σ : L ≃ₐ[K] L) (x : L) : + conjugateExtensionCompletionRingEquiv vK w σ + (AbsoluteValue.toCompletion + (absoluteValueExtensionConjugate vK w σ).1 x) = + AbsoluteValue.toCompletion w.1 (σ x) := by + change + conjugateCompletionRingEquiv w.1 σ + (AbsoluteValue.toCompletion + (absoluteValueConjugate w.1 σ) x) = + AbsoluteValue.toCompletion w.1 (σ x) + exact conjugateCompletionRingEquiv_toCompletion w.1 σ x + +omit [FiniteDimensional K L] [IsGalois K L] in +theorem conjugateExtensionCompletionRingEquiv_algebraMap + (vK : AbsoluteValue K ℝ) + (w : AbsoluteValueExtension vK L) + (σ : L ≃ₐ[K] L) (b : vK.Completion) : + letI : + Algebra vK.Completion + (absoluteValueExtensionConjugate vK w σ).1.Completion := + AbsoluteValue.completionAlgebra vK + (absoluteValueExtensionConjugate vK w σ).1 + (absoluteValueExtensionConjugate vK w σ).2 + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + conjugateExtensionCompletionRingEquiv vK w σ + (algebraMap vK.Completion + (absoluteValueExtensionConjugate vK w σ).1.Completion b) = + algebraMap vK.Completion w.1.Completion b := by + let _ : + Algebra vK.Completion + (absoluteValueConjugate w.1 σ).Completion := + AbsoluteValue.completionAlgebra vK + (absoluteValueConjugate w.1 σ) + (absoluteValueConjugate_extends vK w σ) + let _ : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + change + conjugateCompletionRingEquiv w.1 σ + (algebraMap vK.Completion + (absoluteValueConjugate w.1 σ).Completion b) = + algebraMap vK.Completion w.1.Completion b + exact conjugateCompletionRingEquiv_algebraMap vK w σ b + +/-- Evaluation of the local tensor algebra in the chosen completion, +with codomain written in the algebraic-localization model used by +`LocalPlaceBlock`. -/ +noncomputable def localTensorEvaluation + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + LocalTensorAlgebra (L := L) vK →ₐ[vK.Completion] + LocalizedCompletion vK w := by + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + exact + (localizedCompletionEquivCompletion vK hvK w).symm.toAlgHom.comp + (absoluteValueExtensionLocalizationTensorHom vK w) + +omit [IsGalois K L] in +@[simp] +theorem localTensorEvaluation_tmul + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (b : vK.Completion) (x : L) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + localTensorEvaluation vK hvK w (b ⊗ₜ[K] x) = + algebraMap vK.Completion (LocalizedCompletion vK w) b * + AbsoluteValue.toAlgebraicLocalization + vK w.1 w.2 x := by + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let _ : SMul K w.1.Completion := hK.toSMul + let _ := AbsoluteValue.completionAlgebra vK w.1 w.2 + apply (localizedCompletionEquivCompletion vK hvK w).injective + rw [map_mul] + simp only [localTensorEvaluation, AlgHom.coe_comp, Function.comp_apply, + absoluteValueExtension_localizationTensorHom_tmul] + rfl + +/-- Evaluation at the chosen extension is covariant for left +multiplication by the decomposition group. This is the defining +covariance relation of the induced module, obtained directly from +the localization Galois-group equivalence. -/ +theorem localTensorEvaluation_conjugation_decomposition + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (h : absoluteValueDecompositionGroup K w.1) + (g : L ≃ₐ[K] L) + (z : LocalTensorAlgebra (L := L) vK) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + localTensorEvaluation vK hvK w + (localTensorConjugation vK (h.1 * g) z) = + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w h + (localTensorEvaluation vK hvK w + (localTensorConjugation vK g z)) := by + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let _ : SMul K w.1.Completion := hK.toSMul + let _ := AbsoluteValue.completionAlgebra vK w.1 w.2 + induction z using TensorProduct.inductionOn with + | add x y hx hy => + simpa only [map_add] using congrArg₂ (· + ·) hx hy + | tmul b x => + rw [localTensorConjugation_tmul, + localTensorConjugation_tmul, + localTensorEvaluation_tmul, + localTensorEvaluation_tmul, + map_mul, + (decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w h).commutes, + localizationRamificationGroups_decompositionGroupEquiv_toLocalization] + rfl + +/-- The canonical orbit-evaluation map from local tensor units to the +induced local block. Its covariance is exactly +`localTensorEvaluation_conjugation_decomposition`. -/ +noncomputable def localTensorOrbitHom + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) : + letI := + decompositionGroupLocalUnitsAction vK hvK w + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + (LocalTensorAlgebra (L := L) vK)ˣ →* + LocalPlaceBlock vK hvK w := by + letI := + decompositionGroupLocalUnitsAction vK hvK w + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + exact + { toFun := fun z => + ⟨fun g => + Units.map + (localTensorEvaluation vK hvK w).toMonoidHom + (Units.map + (localTensorConjugation vK g).toMonoidHom z), + by + intro h g + apply Units.ext + change + localTensorEvaluation vK hvK w + (localTensorConjugation vK (h.1 * g) + (z : LocalTensorAlgebra (L := L) vK)) = + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w h + (localTensorEvaluation vK hvK w + (localTensorConjugation vK g + (z : LocalTensorAlgebra (L := L) vK))) + exact + localTensorEvaluation_conjugation_decomposition + vK hvK w h g z⟩ + map_one' := by + apply Subtype.ext + funext g + apply Units.ext + simp + map_mul' := by + intro x y + apply Subtype.ext + funext g + apply Units.ext + simp } + +/-- Orbit evaluation intertwines natural conjugation on the tensor +factor with right translation on the induced module. -/ +theorem localTensorOrbitHom_smul + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (τ : L ≃ₐ[K] L) + (z : (LocalTensorAlgebra (L := L) vK)ˣ) : + letI := + decompositionGroupLocalUnitsAction vK hvK w + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := localTensorUnitsAction (K := K) (L := L) vK + localTensorOrbitHom vK hvK w (τ • z) = + τ • localTensorOrbitHom vK hvK w z := by + let _ := + decompositionGroupLocalUnitsAction vK hvK w + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let _ : SMul K w.1.Completion := hK.toSMul + let _ := AbsoluteValue.completionAlgebra vK w.1 w.2 + let _ := localTensorUnitsAction (K := K) (L := L) vK + apply Subtype.ext + funext g + apply Units.ext + change + localTensorEvaluation vK hvK w + (localTensorConjugation vK g + (localTensorConjugation vK τ + (z : LocalTensorAlgebra (L := L) vK))) = + localTensorEvaluation vK hvK w + (localTensorConjugation vK (g * τ) + (z : LocalTensorAlgebra (L := L) vK)) + rw [localTensorConjugation_mul] + +/-- After transporting the completion at `w ∘ g` back to the chosen +completion at `w`, the corresponding component of the tensor-product decomposition is +evaluation of the `g`-conjugate tensor. -/ +theorem conjugateExtensionCompletionRingEquiv_completionTensorDecomposition_left + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (g : L ≃ₐ[K] L) + (z : LocalTensorAlgebra (L := L) vK) : + letI : ∀ w' : AbsoluteValueExtension vK L, + Algebra vK.Completion w'.1.Completion := + fun w' ↦ AbsoluteValue.completionAlgebra vK w'.1 w'.2 + conjugateExtensionCompletionRingEquiv vK w g + (completionTensorDecompositionLeft (K := K) (L := L) vK hvK z + (absoluteValueExtensionConjugate vK w g)) = + absoluteValueExtensionLocalizationTensorHom vK w + (localTensorConjugation vK g z) := by + let _ : ∀ w' : AbsoluteValueExtension vK L, + Algebra vK.Completion w'.1.Completion := + fun w' ↦ AbsoluteValue.completionAlgebra vK w'.1 w'.2 + induction z using TensorProduct.inductionOn with + | add x y hx hy => + simpa only [map_add, Pi.add_apply] using + congrArg₂ (· + ·) hx hy + | tmul b x => + rw [completionTensorDecomposition_left_tmul_apply, + map_mul, + conjugateExtensionCompletionRingEquiv_algebraMap] + change + algebraMap vK.Completion w.1.Completion b * + conjugateExtensionCompletionRingEquiv vK w g + (AbsoluteValue.toCompletion + (absoluteValueExtensionConjugate vK w g).1 x) = + absoluteValueExtensionLocalizationTensorHom vK w + (localTensorConjugation vK g (b ⊗ₜ[K] x)) + rw [conjugateExtensionCompletionRingEquiv_toCompletion, + localTensorConjugation_tmul, + absoluteValueExtension_localizationTensorHom_tmul] + change + algebraMap vK.Completion w.1.Completion b * + AbsoluteValue.toCompletion w.1 (g x) = + algebraMap vK.Completion w.1.Completion b * + AbsoluteValue.toCompletion w.1 (g x) + rfl + +section RightCosetCoordinates + +universe uG uB + +variable {G : Type uG} {B : Type uB} + [Group G] [CommGroup B] + (H : Subgroup G) [MulDistribMulAction H B] + +/-- Right cosets `H \ G`, appropriate for the convention +`f (h * g) = h • f g` used by `InducedModule`. -/ +abbrev InducedRightCosets := + Quotient (QuotientGroup.rightRel H) + +/-- The element carrying the chosen representative of the right coset of +`g` to `g`. -/ +noncomputable def rightCosetCoefficient (g : G) : H := by + let q : InducedRightCosets H := Quotient.mk'' g + refine ⟨g * (Quotient.out q)⁻¹, ?_⟩ + exact QuotientGroup.rightRel_apply.mp + (Quotient.exact' (Quotient.out_eq' q)) + +@[simp] +theorem rightCosetCoefficient_mul_out (g : G) : + (rightCosetCoefficient H g : G) * + Quotient.out (Quotient.mk'' g : + InducedRightCosets H) = g := by + simp [rightCosetCoefficient] + +theorem rightCoset_mk_mul_left + (h : H) (g : G) : + (Quotient.mk'' (h.1 * g) : InducedRightCosets H) = + Quotient.mk'' g := by + apply Quotient.sound' + rw [QuotientGroup.rightRel_apply] + simpa only [mul_inv_rev, mul_assoc, mul_inv_cancel_left, + one_mul] using H.inv_mem h.2 + +theorem rightCosetCoefficient_mul_left + (h : H) (g : G) : + rightCosetCoefficient H (h.1 * g) = + h * rightCosetCoefficient H g := by + apply Subtype.ext + simp only [rightCosetCoefficient, Subgroup.coe_mul] + rw [rightCoset_mk_mul_left H h g] + simp only [mul_assoc] + +/-- Restriction to one representative of each right coset identifies an +induced module with a product indexed by `H \ G`. No commutativity or +cyclicity assumption on `G` is used. -/ +noncomputable def inducedRightCosetCoordinates : + InducedModule (B := B) H ≃* + (InducedRightCosets H → B) where + toFun f q := f.1 (Quotient.out q) + invFun b := ⟨fun g => + rightCosetCoefficient H g • + b (Quotient.mk'' g), by + intro h g + change + rightCosetCoefficient H (h.1 * g) • + b (Quotient.mk'' (h.1 * g)) = + h • + (rightCosetCoefficient H g • + b (Quotient.mk'' g)) + rw [rightCosetCoefficient_mul_left H h g, + rightCoset_mk_mul_left H h g, mul_smul]⟩ + left_inv f := by + apply Subtype.ext + funext g + change + rightCosetCoefficient H g • + f.1 (Quotient.out + (Quotient.mk'' g : InducedRightCosets H)) = + f.1 g + calc + rightCosetCoefficient H g • + f.1 (Quotient.out + (Quotient.mk'' g : InducedRightCosets H)) = + f.1 ((rightCosetCoefficient H g : G) * + Quotient.out + (Quotient.mk'' g : InducedRightCosets H)) := + (f.2 (rightCosetCoefficient H g) + (Quotient.out + (Quotient.mk'' g : InducedRightCosets H))).symm + _ = f.1 g := congrArg f.1 + (rightCosetCoefficient_mul_out H g) + right_inv b := by + funext q + change + rightCosetCoefficient H (Quotient.out q) • + b (Quotient.mk'' (Quotient.out q)) = + b q + have hq : + (Quotient.mk'' (Quotient.out q) : + InducedRightCosets H) = q := + Quotient.out_eq' q + rw [hq] + have hc : + rightCosetCoefficient H (Quotient.out q) = 1 := by + apply Subtype.ext + simp [rightCosetCoefficient, hq] + rw [hc, one_smul] + map_mul' f g := by + funext q + rfl + +@[simp] +theorem inducedRightCosetCoordinates_apply + (f : InducedModule (B := B) H) + (q : InducedRightCosets H) : + inducedRightCosetCoordinates H f q = + f.1 (Quotient.out q) := + rfl + +end RightCosetCoordinates + +section ExtensionOrbit + +variable (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + +local notation "G" => L ≃ₐ[K] L + +/-- The chosen representative of a right coset sends `w` to a well-defined +extension above `v`. -/ +noncomputable def rightCosetExtension + (q : InducedRightCosets + (absoluteValueDecompositionGroup K w.1)) : + AbsoluteValueExtension vK L := + absoluteValueExtensionConjugate vK w (Quotient.out q) + +omit [FiniteDimensional K L] [IsGalois K L] in +include hvK in +theorem rightCosetExtension_eq_of_mk + (g : G) : + rightCosetExtension vK w + (Quotient.mk'' g : InducedRightCosets + (absoluteValueDecompositionGroup K w.1)) = + absoluteValueExtensionConjugate vK w g := by + let q : InducedRightCosets + (absoluteValueDecompositionGroup K w.1) := Quotient.mk'' g + let h : absoluteValueDecompositionGroup K w.1 := + rightCosetCoefficient (absoluteValueDecompositionGroup K w.1) g + have hfix : + absoluteValueExtensionConjugate vK w h.1 = w := + (mem_absoluteValueDecompositionGroup_iff_extensionConjugate_eq + vK hvK w h.1).mp h.2 + have hg : + h.1 * Quotient.out q = g := + rightCosetCoefficient_mul_out + (absoluteValueDecompositionGroup K w.1) g + apply Subtype.ext + ext x + change w.1 (Quotient.out q x) = w.1 (g x) + rw [← hg] + change w.1 (Quotient.out q x) = + w.1 (h.1 (Quotient.out q x)) + have hp : + w.1 (h.1 (Quotient.out q x)) = + w.1 (Quotient.out q x) := by + have hp' := congrArg + (fun z : AbsoluteValueExtension vK L => + z.1 (Quotient.out q x)) hfix + change + w.1 (h.1 (Quotient.out q x)) = + w.1 (Quotient.out q x) at hp' + exact hp' + exact hp.symm + +/-- Transitivity of extensions, sharpened to the orbit equivalence +`H \ G ≃ {w' | w' ∣ v}`. -/ +noncomputable def rightCosetExtensionEquiv : + InducedRightCosets (absoluteValueDecompositionGroup K w.1) ≃ + AbsoluteValueExtension vK L := by + apply Equiv.ofBijective (rightCosetExtension vK w) + constructor + · intro q r hqr + have hmem : + Quotient.out r * (Quotient.out q)⁻¹ ∈ + absoluteValueDecompositionGroup K w.1 := by + rw [mem_absoluteValueDecompositionGroup_iff_extensionConjugate_eq + vK hvK w] + apply Subtype.ext + ext x + change + w.1 (Quotient.out r ((Quotient.out q)⁻¹ x)) = + w.1 x + have hp : + w.1 (Quotient.out q ((Quotient.out q)⁻¹ x)) = + w.1 (Quotient.out r ((Quotient.out q)⁻¹ x)) := by + have hp' := congrArg + (fun z : AbsoluteValueExtension vK L => + z.1 ((Quotient.out q)⁻¹ x)) hqr + change + w.1 (Quotient.out q ((Quotient.out q)⁻¹ x)) = + w.1 (Quotient.out r ((Quotient.out q)⁻¹ x)) + at hp' + exact hp' + simpa using hp.symm + have hout : + (Quotient.mk'' (Quotient.out q) : + InducedRightCosets + (absoluteValueDecompositionGroup K w.1)) = + Quotient.mk'' (Quotient.out r) := by + apply Quotient.sound' + exact QuotientGroup.rightRel_apply.mpr hmem + calc + q = Quotient.mk'' (Quotient.out q) := + (Quotient.out_eq' q).symm + _ = Quotient.mk'' (Quotient.out r) := hout + _ = r := Quotient.out_eq' r + · intro w' + obtain ⟨g, hg⟩ := absoluteValueConjugacy vK hvK w w' + refine ⟨Quotient.mk'' g, ?_⟩ + exact (rightCosetExtension_eq_of_mk vK hvK w g).trans hg.symm + +omit [FiniteDimensional K L] in +@[simp] +theorem rightCosetExtensionEquiv_apply + (q : InducedRightCosets + (absoluteValueDecompositionGroup K w.1)) : + rightCosetExtensionEquiv vK hvK w q = + absoluteValueExtensionConjugate + vK w (Quotient.out q) := + rfl + +end ExtensionOrbit + +section ProductEquivalences + +variable (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + +/-- Reindex the product of all completion unit groups by the right cosets +of the decomposition group. -/ +noncomputable def completionProductReindexRightCosets : + (∀ w' : AbsoluteValueExtension vK L, w'.1.Completionˣ) ≃* + (∀ q : InducedRightCosets + (absoluteValueDecompositionGroup K w.1), + ((rightCosetExtensionEquiv vK hvK w q).1.Completion)ˣ) := by + let e := + Equiv.piCongrLeft' + (fun w' : AbsoluteValueExtension vK L => + w'.1.Completionˣ) + (rightCosetExtensionEquiv vK hvK w).symm + exact + { e with + map_mul' := by + intro x y + funext q + rfl } + +/-- For a right coset, conjugation by its chosen representative identifies +the corresponding completion with the fixed completion at `w`. -/ +noncomputable def rightCosetCompletionUnitsEquiv + (q : InducedRightCosets + (absoluteValueDecompositionGroup K w.1)) : + ((rightCosetExtensionEquiv vK hvK w q).1.Completion)ˣ ≃* + w.1.Completionˣ := by + exact Units.mapEquiv + (conjugateExtensionCompletionRingEquiv + vK w (Quotient.out q)).toMulEquiv + +omit [FiniteDimensional K L] in +theorem rightCosetCompletionUnitsEquiv_apply_coe + (q : InducedRightCosets + (absoluteValueDecompositionGroup K w.1)) + (z : + ((rightCosetExtensionEquiv vK hvK w q).1.Completion)ˣ) : + ((rightCosetCompletionUnitsEquiv vK hvK w q z : + w.1.Completionˣ) : w.1.Completion) = + conjugateExtensionCompletionRingEquiv + vK w (Quotient.out q) + (z : + (rightCosetExtensionEquiv vK hvK w q).1.Completion) := + rfl + +/-- The product supplied by the completion tensor-product decomposition, rewritten as one copy +of the +chosen local multiplicative group for every right coset. -/ +noncomputable def completionProductUnitsEquivRightCosets : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + (∀ w' : AbsoluteValueExtension vK L, w'.1.Completionˣ) ≃* + (InducedRightCosets + (absoluteValueDecompositionGroup K w.1) → + (LocalizedCompletion vK w)ˣ) := by + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + exact + (completionProductReindexRightCosets vK hvK w).trans + ((MulEquiv.piCongrRight fun q : InducedRightCosets + (absoluteValueDecompositionGroup K w.1) => + rightCosetCompletionUnitsEquiv vK hvK w q).trans + (MulEquiv.piCongrRight fun _ : InducedRightCosets + (absoluteValueDecompositionGroup K w.1) => + (Units.mapEquiv + (localizedCompletionEquivCompletion + vK hvK w).toMulEquiv).symm)) + +@[simp] +theorem completionProductUnitsEquivRightCosets_apply_coe + (p : ∀ w' : AbsoluteValueExtension vK L, + w'.1.Completionˣ) + (q : InducedRightCosets + (absoluteValueDecompositionGroup K w.1)) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + ((completionProductUnitsEquivRightCosets vK hvK w p q : + (LocalizedCompletion vK w)ˣ) : + LocalizedCompletion vK w) = + (localizedCompletionEquivCompletion vK hvK w).symm + (conjugateExtensionCompletionRingEquiv + vK w (Quotient.out q) + ((p (rightCosetExtensionEquiv vK hvK w q) : + (rightCosetExtensionEquiv vK hvK w q).1.Completionˣ) : + (rightCosetExtensionEquiv vK hvK w q).1.Completion)) := by + rfl + +/-- The product of completions above `v` is the induced block from the +decomposition group. This form is valid for an arbitrary finite Galois +extension; the decomposition group need not be normal. -/ +noncomputable def completionProductUnitsEquivLocalPlaceBlock : + letI := + decompositionGroupLocalUnitsAction vK hvK w + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + (∀ w' : AbsoluteValueExtension vK L, w'.1.Completionˣ) ≃* + LocalPlaceBlock vK hvK w := by + letI := + decompositionGroupLocalUnitsAction vK hvK w + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + exact + (completionProductUnitsEquivRightCosets vK hvK w).trans + (inducedRightCosetCoordinates + (absoluteValueDecompositionGroup K w.1)).symm + +/-- Concrete tensor realization of the induced local block: the actual local unit group +`(K_v ⊗[K] L)ˣ` is multiplicatively equivalent to the induced block from +the decomposition group at a chosen extension `w`. -/ +noncomputable def localTensorUnitsEquivLocalPlaceBlock : + letI := + decompositionGroupLocalUnitsAction vK hvK w + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : ∀ w' : AbsoluteValueExtension vK L, + Algebra vK.Completion w'.1.Completion := + fun w' ↦ AbsoluteValue.completionAlgebra vK w'.1 w'.2 + (LocalTensorAlgebra (L := L) vK)ˣ ≃* + LocalPlaceBlock vK hvK w := by + letI := + decompositionGroupLocalUnitsAction vK hvK w + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : ∀ w' : AbsoluteValueExtension vK L, + Algebra vK.Completion w'.1.Completion := + fun w' ↦ AbsoluteValue.completionAlgebra vK w'.1 w'.2 + exact + (localTensorUnitsEquivCompletionProduct vK hvK).trans + (completionProductUnitsEquivLocalPlaceBlock vK hvK w) + +/-- On the chosen representative of a right coset, the concrete +The tensor-product equivalence is the canonical orbit-evaluation map. -/ +theorem localTensorUnitsEquivLocalPlaceBlock_apply_out_coe + (z : (LocalTensorAlgebra (L := L) vK)ˣ) + (q : InducedRightCosets + (absoluteValueDecompositionGroup K w.1)) : + letI := + decompositionGroupLocalUnitsAction vK hvK w + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : ∀ w' : AbsoluteValueExtension vK L, + Algebra vK.Completion w'.1.Completion := + fun w' ↦ AbsoluteValue.completionAlgebra vK w'.1 w'.2 + (((localTensorUnitsEquivLocalPlaceBlock vK hvK w z).1 + (Quotient.out q) : + (LocalizedCompletion vK w)ˣ) : + LocalizedCompletion vK w) = + localTensorEvaluation vK hvK w + (localTensorConjugation vK (Quotient.out q) + (z : LocalTensorAlgebra (L := L) vK)) := by + let _ := + decompositionGroupLocalUnitsAction vK hvK w + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let _ : SMul K w.1.Completion := hK.toSMul + let _ := AbsoluteValue.completionAlgebra vK w.1 w.2 + let _ : ∀ w' : AbsoluteValueExtension vK L, + Algebra vK.Completion w'.1.Completion := + fun w' ↦ AbsoluteValue.completionAlgebra vK w'.1 w'.2 + have hcoord : + inducedRightCosetCoordinates + (absoluteValueDecompositionGroup K w.1) + (localTensorUnitsEquivLocalPlaceBlock vK hvK w z) q = + completionProductUnitsEquivRightCosets vK hvK w + (localTensorUnitsEquivCompletionProduct vK hvK z) q := by + change + inducedRightCosetCoordinates + (absoluteValueDecompositionGroup K w.1) + ((inducedRightCosetCoordinates + (absoluteValueDecompositionGroup K w.1)).symm + (completionProductUnitsEquivRightCosets vK hvK w + (localTensorUnitsEquivCompletionProduct vK hvK z))) q = + completionProductUnitsEquivRightCosets vK hvK w + (localTensorUnitsEquivCompletionProduct vK hvK z) q + rw [MulEquiv.apply_symm_apply] + have hval := congrArg + (fun u : (LocalizedCompletion vK w)ˣ => + (u : LocalizedCompletion vK w)) hcoord + change + (((localTensorUnitsEquivLocalPlaceBlock vK hvK w z).1 + (Quotient.out q) : + (LocalizedCompletion vK w)ˣ) : + LocalizedCompletion vK w) = + ((completionProductUnitsEquivRightCosets vK hvK w + (localTensorUnitsEquivCompletionProduct vK hvK z) q : + (LocalizedCompletion vK w)ˣ) : + LocalizedCompletion vK w) at hval + rw [hval, + completionProductUnitsEquivRightCosets_apply_coe, + localTensorUnitsEquivCompletionProduct_apply_coe] + change + (localizedCompletionEquivCompletion vK hvK w).symm + (conjugateExtensionCompletionRingEquiv + vK w (Quotient.out q) + (completionTensorDecompositionLeft (K := K) (L := L) vK hvK + (z : LocalTensorAlgebra (L := L) vK) + (absoluteValueExtensionConjugate + vK w (Quotient.out q)))) = + localTensorEvaluation vK hvK w + (localTensorConjugation vK (Quotient.out q) + (z : LocalTensorAlgebra (L := L) vK)) + rw [conjugateExtensionCompletionRingEquiv_completionTensorDecomposition_left] + rfl + +/-- The multiplicative equivalence obtained from the tensor-product decomposition is +literally the canonical orbit-evaluation homomorphism. -/ +theorem localTensorUnitsEquivLocalPlaceBlock_eq_orbitHom_apply + (z : (LocalTensorAlgebra (L := L) vK)ˣ) : + letI := + decompositionGroupLocalUnitsAction vK hvK w + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : ∀ w' : AbsoluteValueExtension vK L, + Algebra vK.Completion w'.1.Completion := + fun w' ↦ AbsoluteValue.completionAlgebra vK w'.1 w'.2 + localTensorUnitsEquivLocalPlaceBlock vK hvK w z = + localTensorOrbitHom vK hvK w z := by + let _ := + decompositionGroupLocalUnitsAction vK hvK w + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let _ : SMul K w.1.Completion := hK.toSMul + let _ := AbsoluteValue.completionAlgebra vK w.1 w.2 + let _ : ∀ w' : AbsoluteValueExtension vK L, + Algebra vK.Completion w'.1.Completion := + fun w' ↦ AbsoluteValue.completionAlgebra vK w'.1 w'.2 + apply + (inducedRightCosetCoordinates + (absoluteValueDecompositionGroup K w.1)).injective + funext q + apply Units.ext + change + (((localTensorUnitsEquivLocalPlaceBlock vK hvK w z).1 + (Quotient.out q) : + (LocalizedCompletion vK w)ˣ) : + LocalizedCompletion vK w) = + localTensorEvaluation vK hvK w + (localTensorConjugation vK (Quotient.out q) + (z : LocalTensorAlgebra (L := L) vK)) + exact + localTensorUnitsEquivLocalPlaceBlock_apply_out_coe + vK hvK w z q + +/-- Equivariant concrete form: the actual tensor local factor +and the induced local block are equivalent compatibly with the full +Galois action. -/ +theorem localTensorUnitsEquivLocalPlaceBlock_smul + (τ : L ≃ₐ[K] L) + (z : (LocalTensorAlgebra (L := L) vK)ˣ) : + letI := + decompositionGroupLocalUnitsAction vK hvK w + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : ∀ w' : AbsoluteValueExtension vK L, + Algebra vK.Completion w'.1.Completion := + fun w' ↦ AbsoluteValue.completionAlgebra vK w'.1 w'.2 + letI := localTensorUnitsAction (K := K) (L := L) vK + localTensorUnitsEquivLocalPlaceBlock vK hvK w (τ • z) = + τ • localTensorUnitsEquivLocalPlaceBlock vK hvK w z := by + let _ := + decompositionGroupLocalUnitsAction vK hvK w + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let _ : SMul K w.1.Completion := hK.toSMul + let _ := AbsoluteValue.completionAlgebra vK w.1 w.2 + let _ : ∀ w' : AbsoluteValueExtension vK L, + Algebra vK.Completion w'.1.Completion := + fun w' ↦ AbsoluteValue.completionAlgebra vK w'.1 w'.2 + let _ := localTensorUnitsAction (K := K) (L := L) vK + rw [localTensorUnitsEquivLocalPlaceBlock_eq_orbitHom_apply, + localTensorUnitsEquivLocalPlaceBlock_eq_orbitHom_apply] + exact localTensorOrbitHom_smul vK hvK w τ z + +/-- The inverse of the induced local-block equivalence is equivariant as well. -/ +theorem localTensorUnitsEquivLocalPlaceBlock_symm_smul + (τ : L ≃ₐ[K] L) + (f : LocalPlaceBlock vK hvK w) : + letI := + decompositionGroupLocalUnitsAction vK hvK w + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : ∀ w' : AbsoluteValueExtension vK L, + Algebra vK.Completion w'.1.Completion := + fun w' ↦ AbsoluteValue.completionAlgebra vK w'.1 w'.2 + letI := localTensorUnitsAction (K := K) (L := L) vK + (localTensorUnitsEquivLocalPlaceBlock vK hvK w).symm + (τ • f) = + τ • + (localTensorUnitsEquivLocalPlaceBlock vK hvK w).symm f := by + let _ := + decompositionGroupLocalUnitsAction vK hvK w + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let _ : SMul K w.1.Completion := hK.toSMul + let _ := AbsoluteValue.completionAlgebra vK w.1 w.2 + let _ : ∀ w' : AbsoluteValueExtension vK L, + Algebra vK.Completion w'.1.Completion := + fun w' ↦ AbsoluteValue.completionAlgebra vK w'.1 w'.2 + let _ := localTensorUnitsAction (K := K) (L := L) vK + apply + (localTensorUnitsEquivLocalPlaceBlock + vK hvK w).injective + rw [MulEquiv.apply_symm_apply, + localTensorUnitsEquivLocalPlaceBlock_smul, + MulEquiv.apply_symm_apply] + +end ProductEquivalences + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/TensorNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/TensorNorm.lean new file mode 100644 index 0000000000..a8cdb98a65 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/TensorNorm.lean @@ -0,0 +1,450 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalNorm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient +/-! +# The norm image of a local tensor factor + +For a finite Galois extension `L / K`, the completion tensor-product theorem decomposes + +`K_v ⊗[K] L` + +as the product of the completions above `v`. After choosing one extension +`w`, Galois conjugation identifies every factor with `L_w`. Consequently +the image of the determinant norm on the tensor algebra is exactly the field +norm subgroup of `L_w / K_v`. + +This is the concrete norm-subgroup form of the local calculation used in +the local-block norm calculation, and it is also the bridge between the local cohomology +calculation and multiplicative weak approximation. +-/ + +@[expose] public section + +open scoped BigOperators TensorProduct + +noncomputable +section + +namespace LocalClassFieldTheory + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalFieldTheory +open ValuationTheory.Completion + +universe u + +variable {K L : Type u} + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- The determinant norm on the unit group of a local tensor algebra. -/ +def localTensorDetNorm + (vK : AbsoluteValue K ℝ) : + (LocalTensorAlgebra (L := L) vK)ˣ →* + vK.Completionˣ := + Units.map (Algebra.norm vK.Completion) + +/-- The image of the determinant norm on a local tensor algebra. -/ +def localTensorNormSubgroup + (vK : AbsoluteValue K ℝ) : + Subgroup vK.Completionˣ := + (localTensorDetNorm (K := K) (L := L) vK).range + +section ChosenCompletion + +variable (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + +/-- For a right coset of the decomposition group, conjugation followed by +the localization/completion equivalence identifies the corresponding +completion with the chosen algebraic localization. -/ +noncomputable def rightCosetCompletionAlgEquiv + (q : InducedRightCosets + (absoluteValueDecompositionGroup K w.1)) : + letI hK := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : + Algebra vK.Completion + (rightCosetExtensionEquiv vK hvK w q).1.Completion := + AbsoluteValue.completionAlgebra vK + (rightCosetExtensionEquiv vK hvK w q).1 + (rightCosetExtensionEquiv vK hvK w q).2 + (rightCosetExtensionEquiv vK hvK w q).1.Completion ≃ₐ[vK.Completion] LocalizedCompletion vK + w := by + letI hK := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : + Algebra vK.Completion + (rightCosetExtensionEquiv vK hvK w q).1.Completion := + AbsoluteValue.completionAlgebra vK + (rightCosetExtensionEquiv vK hvK w q).1 + (rightCosetExtensionEquiv vK hvK w q).2 + let eConj : + (rightCosetExtensionEquiv vK hvK w q).1.Completion ≃ₐ[vK.Completion] w.1.Completion := + { conjugateExtensionCompletionRingEquiv + vK w (Quotient.out q) with + commutes' := + conjugateExtensionCompletionRingEquiv_algebraMap + vK w (Quotient.out q) } + exact eConj.trans + (localizedCompletionEquivCompletion vK hvK w).symm + +/-- Transporting a completion unit to the chosen localization preserves +its determinant norm over the completed base field. -/ +theorem normUnits_rightCosetCompletionAlgEquiv + (q : InducedRightCosets + (absoluteValueDecompositionGroup K w.1)) + (z : + ((rightCosetExtensionEquiv vK hvK w q).1.Completion)ˣ) : + letI hK := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : + Algebra vK.Completion + (rightCosetExtensionEquiv vK hvK w q).1.Completion := + AbsoluteValue.completionAlgebra vK + (rightCosetExtensionEquiv vK hvK w q).1 + (rightCosetExtensionEquiv vK hvK w q).2 + letI : Module.Finite vK.Completion + (rightCosetExtensionEquiv vK hvK w q).1.Completion := + completionModuleFinite vK hvK + (rightCosetExtensionEquiv vK hvK w q) + letI : Module.Finite vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + normUnits vK.Completion (LocalizedCompletion vK w) + (Units.mapEquiv + (rightCosetCompletionAlgEquiv + vK hvK w q).toMulEquiv z) = + Units.map (Algebra.norm vK.Completion) z := by + let hK := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let _ : SMul K w.1.Completion := hK.toSMul + let _ := AbsoluteValue.completionAlgebra vK w.1 w.2 + let _ : + Algebra vK.Completion + (rightCosetExtensionEquiv vK hvK w q).1.Completion := + AbsoluteValue.completionAlgebra vK + (rightCosetExtensionEquiv vK hvK w q).1 + (rightCosetExtensionEquiv vK hvK w q).2 + let _ : Module.Finite vK.Completion + (rightCosetExtensionEquiv vK hvK w q).1.Completion := + completionModuleFinite vK hvK + (rightCosetExtensionEquiv vK hvK w q) + let _ : Module.Finite vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + apply Units.ext + change + Algebra.norm vK.Completion + (rightCosetCompletionAlgEquiv vK hvK w q + (z : + (rightCosetExtensionEquiv + vK hvK w q).1.Completion)) = + Algebra.norm vK.Completion + (z : + (rightCosetExtensionEquiv + vK hvK w q).1.Completion) + exact Algebra.norm_eq_of_algEquiv + (rightCosetCompletionAlgEquiv vK hvK w q) _ + +/-- The completion tensor-product decomposition, with all factors transported to the one +chosen algebraic localization. -/ +noncomputable def localTensorUnitsEquivChosenCoordinates : + letI hK := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : ∀ w' : AbsoluteValueExtension vK L, + Algebra vK.Completion w'.1.Completion := + fun w' ↦ AbsoluteValue.completionAlgebra vK w'.1 w'.2 + (LocalTensorAlgebra (L := L) vK)ˣ ≃* + (InducedRightCosets + (absoluteValueDecompositionGroup K w.1) → + (LocalizedCompletion vK w)ˣ) := by + letI hK := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : ∀ w' : AbsoluteValueExtension vK L, + Algebra vK.Completion w'.1.Completion := + fun w' ↦ AbsoluteValue.completionAlgebra vK w'.1 w'.2 + exact + (localTensorUnitsEquivCompletionProduct + vK hvK).trans + (completionProductUnitsEquivRightCosets + vK hvK w) + +/-- The finite set of right cosets of the decomposition group. It is +packaged explicitly so statements about products do not depend on a chosen +`Fintype` structure for the quotient. -/ +noncomputable def decompositionRightCosetsFinset : + Finset + (InducedRightCosets + (absoluteValueDecompositionGroup K w.1)) := + @Finset.univ _ (Fintype.ofFinite _) + +omit [IsGalois K L] in +@[simp] +theorem mem_decompositionRightCosetsFinset + (q : InducedRightCosets + (absoluteValueDecompositionGroup K w.1)) : + q ∈ decompositionRightCosetsFinset + (K := K) (vK := vK) (w := w) := by + simp [decompositionRightCosetsFinset] + +/-- The field norm of a transported coordinate is the determinant norm +of the original completion coordinate. -/ +theorem normUnits_completionProductUnitsEquivRightCosets + (p : ∀ w' : AbsoluteValueExtension vK L, + w'.1.Completionˣ) + (q : InducedRightCosets + (absoluteValueDecompositionGroup K w.1)) : + letI hK := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : ∀ w' : AbsoluteValueExtension vK L, + Algebra vK.Completion w'.1.Completion := + fun w' ↦ AbsoluteValue.completionAlgebra vK w'.1 w'.2 + letI : ∀ w' : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w'.1.Completion := + fun w' ↦ completionModuleFinite vK hvK w' + letI : Module.Finite vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + normUnits vK.Completion (LocalizedCompletion vK w) + (completionProductUnitsEquivRightCosets + vK hvK w p q) = + Units.map (Algebra.norm vK.Completion) + (p (rightCosetExtensionEquiv vK hvK w q)) := by + let hK := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let _ : SMul K w.1.Completion := hK.toSMul + let _ := AbsoluteValue.completionAlgebra vK w.1 w.2 + let _ : ∀ w' : AbsoluteValueExtension vK L, + Algebra vK.Completion w'.1.Completion := + fun w' ↦ AbsoluteValue.completionAlgebra vK w'.1 w'.2 + let _ : ∀ w' : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w'.1.Completion := + fun w' ↦ completionModuleFinite vK hvK w' + let _ : Module.Finite vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + rw [← normUnits_rightCosetCompletionAlgEquiv + vK hvK w q + (p (rightCosetExtensionEquiv vK hvK w q))] + congr 1 + +/-- The determinant norm on `K_v ⊗[K] L` is the product of the field +norms of its coordinates after all factors have been transported to the +chosen localization. -/ +theorem localTensorDetNorm_eq_prod_chosenCoordinates + (z : (LocalTensorAlgebra (L := L) vK)ˣ) : + letI hK := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : ∀ w' : AbsoluteValueExtension vK L, + Algebra vK.Completion w'.1.Completion := + fun w' ↦ AbsoluteValue.completionAlgebra vK w'.1 w'.2 + letI : ∀ w' : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w'.1.Completion := + fun w' ↦ completionModuleFinite vK hvK w' + letI : Module.Finite vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + localTensorDetNorm (K := K) (L := L) vK z = + ∏ q ∈ decompositionRightCosetsFinset + (K := K) (vK := vK) (w := w), + normUnits vK.Completion + (LocalizedCompletion vK w) + (localTensorUnitsEquivChosenCoordinates + vK hvK w z q) := by + classical + let _ := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + let hK := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let _ : SMul K w.1.Completion := hK.toSMul + let _ := AbsoluteValue.completionAlgebra vK w.1 w.2 + let _ : ∀ w' : AbsoluteValueExtension vK L, + Algebra vK.Completion w'.1.Completion := + fun w' ↦ AbsoluteValue.completionAlgebra vK w'.1 w'.2 + let _ : ∀ w' : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w'.1.Completion := + fun w' ↦ completionModuleFinite vK hvK w' + let _ : Module.Finite vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + apply Units.ext + change + Algebra.norm vK.Completion + (z : LocalTensorAlgebra (L := L) vK) = + ((∏ q ∈ decompositionRightCosetsFinset + (K := K) (vK := vK) (w := w), + normUnits vK.Completion + (LocalizedCompletion vK w) + (localTensorUnitsEquivChosenCoordinates + vK hvK w z q) : vK.Completionˣ) : + vK.Completion) + have hnorm := + RelativeIdeleGroup.localNorm_units_eq_prod + vK hvK z + change + Algebra.norm vK.Completion + (z : LocalTensorAlgebra (L := L) vK) = + ∏ w' : AbsoluteValueExtension vK L, + Algebra.norm vK.Completion + (completionTensorDecompositionLeft + (K := K) (L := L) vK hvK + (z : LocalTensorAlgebra (L := L) vK) w') + at hnorm + rw [hnorm] + change + (∏ w' : AbsoluteValueExtension vK L, + Algebra.norm vK.Completion + (completionTensorDecompositionLeft + (K := K) (L := L) vK hvK + (z : LocalTensorAlgebra (L := L) vK) w')) = + Units.coeHom vK.Completion + (∏ q ∈ decompositionRightCosetsFinset + (K := K) (vK := vK) (w := w), + normUnits vK.Completion + (LocalizedCompletion vK w) + (localTensorUnitsEquivChosenCoordinates + vK hvK w z q)) + rw [map_prod] + rw [show decompositionRightCosetsFinset + (K := K) (vK := vK) (w := w) = + Finset.univ by + ext q + simp] + rw [← (rightCosetExtensionEquiv + vK hvK w).prod_comp] + apply Finset.prod_congr rfl + intro q _ + have h := + normUnits_completionProductUnitsEquivRightCosets + vK hvK w + (localTensorUnitsEquivCompletionProduct vK hvK z) q + exact (congrArg (fun x : vK.Completionˣ ↦ + (x : vK.Completion)) h).symm + +/-- **Local tensor norm image.** The determinant norm image of the local +tensor algebra is exactly the field-norm subgroup of any chosen completion +above `v`. -/ +theorem localTensorNormSubgroup_eq_localNormSubgroup + (hvK : vK.IsNontrivial) : + letI hK := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : Module.Finite vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + localTensorNormSubgroup (K := K) (L := L) vK = + localNormSubgroup vK.Completion + (LocalizedCompletion vK w) := by + classical + let _ := + completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK + let hK := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let _ : SMul K w.1.Completion := hK.toSMul + let _ := AbsoluteValue.completionAlgebra vK w.1 w.2 + let _ : ∀ w' : AbsoluteValueExtension vK L, + Algebra vK.Completion w'.1.Completion := + fun w' ↦ AbsoluteValue.completionAlgebra vK w'.1 w'.2 + let _ : ∀ w' : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w'.1.Completion := + fun w' ↦ completionModuleFinite vK hvK w' + let _ : Module.Finite vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + ext x + change + (∃ z : (LocalTensorAlgebra (L := L) vK)ˣ, + localTensorDetNorm (K := K) (L := L) vK z = x) ↔ + ∃ y : (LocalizedCompletion vK w)ˣ, + normUnits vK.Completion + (LocalizedCompletion vK w) y = x + constructor + · rintro ⟨z, rfl⟩ + refine + ⟨∏ q ∈ decompositionRightCosetsFinset + (K := K) (vK := vK) (w := w), + localTensorUnitsEquivChosenCoordinates + vK hvK w z q, ?_⟩ + rw [map_prod, + localTensorDetNorm_eq_prod_chosenCoordinates + vK hvK w z] + · rintro ⟨y, rfl⟩ + let q₀ : InducedRightCosets + (absoluteValueDecompositionGroup K w.1) := + Quotient.mk'' (1 : L ≃ₐ[K] L) + let f : + InducedRightCosets + (absoluteValueDecompositionGroup K w.1) → + (LocalizedCompletion vK w)ˣ := + fun q ↦ if q₀ = q then y else 1 + let z : (LocalTensorAlgebra (L := L) vK)ˣ := + (localTensorUnitsEquivChosenCoordinates + vK hvK w).symm f + refine ⟨z, ?_⟩ + rw [localTensorDetNorm_eq_prod_chosenCoordinates + vK hvK w z] + change + (∏ q ∈ decompositionRightCosetsFinset + (K := K) (vK := vK) (w := w), + normUnits vK.Completion + (LocalizedCompletion vK w) + (localTensorUnitsEquivChosenCoordinates + vK hvK w z q)) = + normUnits vK.Completion + (LocalizedCompletion vK w) y + rw [(localTensorUnitsEquivChosenCoordinates + vK hvK w).apply_symm_apply f] + have hq₀ : + q₀ ∈ decompositionRightCosetsFinset + (K := K) (vK := vK) (w := w) := + mem_decompositionRightCosetsFinset + (K := K) (vK := vK) (w := w) q₀ + simpa only [f, apply_ite, map_one] using + Finset.prod_ite_eq_of_mem + (decompositionRightCosetsFinset + (K := K) (vK := vK) (w := w)) + q₀ + (fun _ ↦ + normUnits vK.Completion + (LocalizedCompletion vK w) y) + hq₀ + +end ChosenCompletion + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology.lean new file mode 100644 index 0000000000..af513567eb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Algebra.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Algebra.lean new file mode 100644 index 0000000000..ef5974ba08 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Algebra.lean @@ -0,0 +1,351 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv +/-! +# Algebra for localized completion cohomology + +This file provides named algebra, finite-dimensional, Galois, scalar-tower, and +global-to-local embedding providers for localized completions. +-/ + +@[expose] public section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory +open CyclicCohomology +open CyclicCohomology.ProfiniteCohomology.Herbrand +open scoped TensorProduct + +noncomputable +section + +namespace LocalClassFieldTheory + +universe u v + +variable {K : Type u} {L : Type v} + [Field K] [Field L] [Algebra K L] + +/-- The canonical algebra structure on an algebraic localization over the +completed base. Naming this instance keeps clients from rebuilding the +completion tower at every declaration boundary. -/ +@[reducible] +noncomputable def localizedCompletionBaseAlgebra + (vK : AbsoluteValue K ℝ) + (w : AbsoluteValueExtension vK L) : + Algebra vK.Completion (LocalizedCompletion vK w) := by + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + exact inferInstance + +/-- The named finite-dimensional certificate for an algebraic localization +of a finite global extension. -/ +theorem localizedCompletionFiniteDimensional + [FiniteDimensional K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) : + letI : Algebra vK.Completion (LocalizedCompletion vK w) := + localizedCompletionBaseAlgebra vK w + FiniteDimensional vK.Completion (LocalizedCompletion vK w) := by + let _ := localizedCompletionBaseAlgebra vK w + exact localizedCompletionModuleFinite vK hvK w + +/-- The named Galois certificate for the algebraic localization of a Galois +extension. -/ +theorem localizedCompletionIsGalois + [IsGalois K L] + (vK : AbsoluteValue K ℝ) + (w : AbsoluteValueExtension vK L) : + letI : Algebra vK.Completion (LocalizedCompletion vK w) := + localizedCompletionBaseAlgebra vK w + IsGalois vK.Completion (LocalizedCompletion vK w) := by + let _ := localizedCompletionBaseAlgebra vK w + exact HilbertRamification.algebraicLocalization_isGalois vK w + +/-- The algebra structure on the algebraic localization induced by the tower +`K → K_v → L_w`. -/ +@[reducible] +noncomputable def localizedCompletionGlobalAlgebra + (vK : AbsoluteValue K ℝ) + (w : AbsoluteValueExtension vK L) : + letI : Algebra vK.Completion (LocalizedCompletion vK w) := + localizedCompletionBaseAlgebra vK w + Algebra K (LocalizedCompletion vK w) := by + letI : Algebra vK.Completion (LocalizedCompletion vK w) := + localizedCompletionBaseAlgebra vK w + exact + ((algebraMap vK.Completion + (LocalizedCompletion vK w)).comp + (algebraMap K vK.Completion)).toAlgebra + +theorem localizedCompletionIsScalarTower + (vK : AbsoluteValue K ℝ) + (w : AbsoluteValueExtension vK L) : + letI : Algebra vK.Completion (LocalizedCompletion vK w) := + localizedCompletionBaseAlgebra vK w + letI := localizedCompletionGlobalAlgebra vK w + IsScalarTower K vK.Completion + (LocalizedCompletion vK w) := by + let _ : Algebra vK.Completion (LocalizedCompletion vK w) := + localizedCompletionBaseAlgebra vK w + let _ := localizedCompletionGlobalAlgebra vK w + exact IsScalarTower.of_algebraMap_eq' rfl + +/-- The canonical global-to-local embedding as a `K`-algebra homomorphism. -/ +noncomputable def localizedCompletionToAlgHom + (vK : AbsoluteValue K ℝ) + (w : AbsoluteValueExtension vK L) : + letI : Algebra vK.Completion (LocalizedCompletion vK w) := + localizedCompletionBaseAlgebra vK w + letI := localizedCompletionGlobalAlgebra vK w + letI := localizedCompletionIsScalarTower vK w + L →ₐ[K] LocalizedCompletion vK w := by + letI : Algebra vK.Completion (LocalizedCompletion vK w) := + localizedCompletionBaseAlgebra vK w + letI := localizedCompletionGlobalAlgebra vK w + letI := localizedCompletionIsScalarTower vK w + exact + { __ := AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + commutes' := fun x ↦ by + change + AbsoluteValue.toAlgebraicLocalization + vK w.1 w.2 (algebraMap K L x) = + algebraMap vK.Completion + (LocalizedCompletion vK w) + (algebraMap K vK.Completion x) + exact + AbsoluteValue.toAlgebraicLocalization_algebraMap + vK w.1 w.2 x } + +/-- The algebraic localization is generated over the completed base by the +canonical image of the global extension. -/ +theorem localizedCompletion_adjoin_range_eq_top + (vK : AbsoluteValue K ℝ) + (w : AbsoluteValueExtension vK L) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := localizedCompletionGlobalAlgebra vK w + letI := localizedCompletionIsScalarTower vK w + IntermediateField.adjoin vK.Completion + (Set.range + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2)) = ⊤ := by + let _ := localizedCompletionBaseAlgebra vK w + let _ := localizedCompletionGlobalAlgebra vK w + let _ := localizedCompletionIsScalarTower vK w + exact + HilbertRamification.decompositionField_localization_adjoin_range_eq_top + vK w + +/-- A global primitive element remains a primitive element after passing to +the chosen algebraic localization over the completed base field. -/ +theorem localizedCompletion_adjoin_image_eq_top_of_adjoin_eq_top + (vK : AbsoluteValue K ℝ) + (w : AbsoluteValueExtension vK L) (β : L) + (hβ : IntermediateField.adjoin K {β} = ⊤) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := localizedCompletionGlobalAlgebra vK w + letI := localizedCompletionIsScalarTower vK w + IntermediateField.adjoin vK.Completion + {AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 β} = ⊤ := by + let _ := localizedCompletionBaseAlgebra vK w + let _ := localizedCompletionGlobalAlgebra vK w + let _ := localizedCompletionIsScalarTower vK w + let toF := localizedCompletionToAlgHom vK w + let βw := AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 β + have hfieldRange : + toF.fieldRange = IntermediateField.adjoin K {βw} := by + rw [AlgHom.fieldRange_eq_map, ← hβ, + IntermediateField.adjoin_map, Set.image_singleton] + rfl + let R : IntermediateField vK.Completion (LocalizedCompletion vK w) := + IntermediateField.adjoin vK.Completion {βw} + have hKAdjoin : + IntermediateField.adjoin K {βw} ≤ R.restrictScalars K := by + apply IntermediateField.adjoin_le_iff.mpr + intro x hx + have hx' : x = βw := Set.mem_singleton_iff.mp hx + subst x + exact IntermediateField.subset_adjoin vK.Completion + {βw} (Set.mem_singleton βw) + have hrange : + Set.range (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2) ⊆ R := by + rintro _ ⟨x, rfl⟩ + change toF x ∈ R + have hx : toF x ∈ toF.fieldRange := ⟨x, rfl⟩ + rw [hfieldRange] at hx + exact hKAdjoin hx + apply top_unique + rw [← localizedCompletion_adjoin_range_eq_top vK w] + exact IntermediateField.adjoin_le_iff.mpr hrange + +variable [IsGalois K L] + +/-- Every element in the canonical image of the global extension is separable +over the completed base. -/ +theorem localizedCompletion_generator_isSeparable + (vK : AbsoluteValue K ℝ) + (w : AbsoluteValueExtension vK L) (x : L) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := localizedCompletionGlobalAlgebra vK w + letI := localizedCompletionIsScalarTower vK w + IsSeparable vK.Completion + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x) := by + let _ := localizedCompletionBaseAlgebra vK w + let _ := localizedCompletionGlobalAlgebra vK w + let _ := localizedCompletionIsScalarTower vK w + exact + HilbertRamification.decompositionField_toLocalization_isSeparable + vK w x + +/-- The completed-base minimal polynomial of every canonical global generator +splits in the algebraic localization. -/ +theorem localizedCompletion_generator_minpoly_splits + (vK : AbsoluteValue K ℝ) + (w : AbsoluteValueExtension vK L) (x : L) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := localizedCompletionGlobalAlgebra vK w + letI := localizedCompletionIsScalarTower vK w + ((minpoly vK.Completion + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x)).map + (algebraMap vK.Completion + (LocalizedCompletion vK w))).Splits := by + let _ := localizedCompletionBaseAlgebra vK w + let _ := localizedCompletionGlobalAlgebra vK w + let _ := localizedCompletionIsScalarTower vK w + exact + HilbertRamification.decompositionField_toLocalization_minpoly_splits + vK w x + +open scoped IsMulCommutative in +omit [IsGalois K L] in +/-- The algebraic localization of an abelian Galois extension is abelian +Galois over the completed base field. -/ +theorem localizedCompletion_isAbelianGalois + [IsAbelianGalois K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := localizedCompletionGlobalAlgebra vK w + letI := localizedCompletionIsScalarTower vK w + IsAbelianGalois vK.Completion + (LocalizedCompletion vK w) := by + let _ := localizedCompletionBaseAlgebra vK w + let _ := localizedCompletionGlobalAlgebra vK w + let _ := localizedCompletionIsScalarTower vK w + let _ : IsGalois vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionIsGalois vK w + let e : + absoluteValueDecompositionGroup K w.1 ≃* + (LocalizedCompletion vK w ≃ₐ[vK.Completion] + LocalizedCompletion vK w) := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w + exact + { is_comm.comm := fun σ τ => by + apply e.symm.injective + rw [map_mul, map_mul] + apply Subtype.ext + exact mul_comm _ _ } + +/-- The elements of `L` whose images in the algebraic localization come +from the completed base field are exactly the fixed field of the +decomposition group at `w`. -/ +theorem localizedCompletion_baseField_comap_eq_fixedField_decompositionGroup + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := localizedCompletionGlobalAlgebra vK w + letI := localizedCompletionIsScalarTower vK w + ((algebraMap vK.Completion + (LocalizedCompletion vK w)).fieldRange).comap + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2) = + (IntermediateField.fixedField + (absoluteValueDecompositionGroup K w.1)).toSubfield := by + let _ := localizedCompletionBaseAlgebra vK w + let _ := localizedCompletionGlobalAlgebra vK w + let _ := localizedCompletionIsScalarTower vK w + let _ : IsGalois vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionIsGalois vK w + ext x + change + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x ∈ + Set.range + (algebraMap vK.Completion + (LocalizedCompletion vK w)) ↔ + x ∈ IntermediateField.fixedField + (absoluteValueDecompositionGroup K w.1) + rw [InfiniteGalois.mem_range_algebraMap_iff_fixed, + IntermediateField.mem_fixedField_iff] + constructor + · intro hfixed σ hσ + let δ : absoluteValueDecompositionGroup K w.1 := ⟨σ, hσ⟩ + apply + (AbsoluteValue.toAlgebraicLocalization + vK w.1 w.2).injective + calc + AbsoluteValue.toAlgebraicLocalization + vK w.1 w.2 (σ x) = + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w δ + (AbsoluteValue.toAlgebraicLocalization + vK w.1 w.2 x) := + (localizationRamificationGroups_decompositionGroupEquiv_toLocalization + vK hvK w δ x).symm + _ = AbsoluteValue.toAlgebraicLocalization + vK w.1 w.2 x := + hfixed _ + · intro hZ τ + let δ : absoluteValueDecompositionGroup K w.1 := + (decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w).symm τ + have hδ : ((δ : L ≃ₐ[K] L) x) = x := + hZ δ δ.property + calc + τ (AbsoluteValue.toAlgebraicLocalization + vK w.1 w.2 x) = + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w δ + (AbsoluteValue.toAlgebraicLocalization + vK w.1 w.2 x) := by + rw [MulEquiv.apply_symm_apply] + _ = AbsoluteValue.toAlgebraicLocalization + vK w.1 w.2 ((δ : L ≃ₐ[K] L) x) := + localizationRamificationGroups_decompositionGroupEquiv_toLocalization + vK hvK w δ x + _ = AbsoluteValue.toAlgebraicLocalization + vK w.1 w.2 x := + congrArg + (AbsoluteValue.toAlgebraicLocalization + vK w.1 w.2) hδ + + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/All.lean new file mode 100644 index 0000000000..be299538a5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/All.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv +/-! +# The local class-field axiom for decomposition-group blocks + +Public facade for the change-of-group, localized algebra, Galois generator, +low-degree Herbrand equivalence, finiteness, and cardinality leaves. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality.lean new file mode 100644 index 0000000000..5862870d43 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/All.lean new file mode 100644 index 0000000000..87d912f5ac --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/All.lean @@ -0,0 +1,19 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial +/-! +# Localized-completion Herbrand cardinalities + +Public facade for the degree-zero, degree-minus-one, triviality, and Herbrand +quotient leaves. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/H0.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/H0.lean new file mode 100644 index 0000000000..494bbb3da5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/H0.lean @@ -0,0 +1,128 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +/-! +# Degree-zero localized Herbrand cardinality +-/ + +@[expose] public section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory +open CyclicCohomology +open CyclicCohomology.ProfiniteCohomology.Herbrand +open scoped TensorProduct + +noncomputable +section + +namespace LocalClassFieldTheory + +section LocalTateComparison + +variable {k ell : Type} + [Field k] [Field ell] [Algebra k ell] + [FiniteDimensional k ell] [IsGalois k ell] + +theorem localHerbrandH0_card_eq_localDegree + (vK : AbsoluteValue k ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK ell) + (σ : ell ≃ₐ[k] ell) + (hgen : ∀ τ : ell ≃ₐ[k] ell, + τ ∈ Subgroup.zpowers σ) + [ValuativeRel vK.Completion] + [IsNonarchimedeanLocalField vK.Completion] : + letI hK := + AbsoluteValue.extensionCompletionAlgebra + (K := k) w.1 + letI : SMul k w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := localizedCompletionGlobalAlgebra vK w + letI := localizedCompletionIsScalarTower vK w + letI : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + letI : IsGalois vK.Completion + (LocalizedCompletion vK w) := + HilbertRamification.algebraicLocalization_isGalois vK w + letI : Fintype (absoluteValueDecompositionGroup k w.1) := + Fintype.ofFinite _ + letI := + decompositionGroupLocalUnitsAction vK hvK w + letI : Finite + (HerbrandH0 + (absoluteValueDecompositionGroup k w.1) + (LocalizedCompletion vK w)ˣ) := + localHerbrandH0Finite vK hvK w σ hgen + Nat.card + (HerbrandH0 + (absoluteValueDecompositionGroup k w.1) + (LocalizedCompletion vK w)ˣ) = + Module.finrank vK.Completion + (LocalizedCompletion vK w) := by + let := localizedCompletionBaseAlgebra vK w + let := localizedCompletionGlobalAlgebra vK w + let := localizedCompletionIsScalarTower vK w + let : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionFiniteDimensional vK hvK w + let : IsGalois vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionIsGalois vK w + let := localizedCompletionDecompositionGroupFintype vK w + let := + decompositionGroupLocalUnitsAction vK hvK w + let : Finite + (HerbrandH0 + (absoluteValueDecompositionGroup k w.1) + (LocalizedCompletion vK w)ˣ) := + localHerbrandH0Finite vK hvK w σ hgen + let g := + localizedCompletionGaloisGenerator + vK hvK w σ hgen + let hg := + localizedCompletionGaloisGenerator_generates + vK hvK w σ hgen + let hcard := + finiteExtensionUnits_tate_card_of_generator + vK.Completion (LocalizedCompletion vK w) + g hg + let : Finite + (tateCohomology + (Rep.ofAlgebraAutOnUnits vK.Completion + (LocalizedCompletion vK w)) 0) := + hcard.finiteH0 + calc + Nat.card + (HerbrandH0 + (absoluteValueDecompositionGroup k w.1) + (LocalizedCompletion vK w)ˣ) = + Nat.card + (Multiplicative + (tateCohomology + (Rep.ofAlgebraAutOnUnits vK.Completion + (LocalizedCompletion vK w)) 0)) := + Nat.card_congr + (localHerbrandH0EquivUnitsTateH0 + vK hvK w).toEquiv + _ = Nat.card + (tateCohomology + (Rep.ofAlgebraAutOnUnits vK.Completion + (LocalizedCompletion vK w)) 0) := rfl + _ = Module.finrank vK.Completion + (LocalizedCompletion vK w) := + hcard.cardH0 + + +end LocalTateComparison + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/HMinusOne.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/HMinusOne.lean new file mode 100644 index 0000000000..59b0e8f13c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/HMinusOne.lean @@ -0,0 +1,128 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +/-! +# Degree-minus-one localized Herbrand cardinality +-/ + +@[expose] public section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory +open CyclicCohomology +open CyclicCohomology.ProfiniteCohomology.Herbrand +open scoped TensorProduct + +noncomputable +section + +namespace LocalClassFieldTheory + +section LocalTateComparison + +variable {k ell : Type} + [Field k] [Field ell] [Algebra k ell] + [FiniteDimensional k ell] [IsGalois k ell] + +theorem localHerbrandHMinusOne_card_eq_one + (vK : AbsoluteValue k ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK ell) + (σ : ell ≃ₐ[k] ell) + (hgen : ∀ τ : ell ≃ₐ[k] ell, + τ ∈ Subgroup.zpowers σ) + [ValuativeRel vK.Completion] + [IsNonarchimedeanLocalField vK.Completion] : + letI hK := + AbsoluteValue.extensionCompletionAlgebra + (K := k) w.1 + letI : SMul k w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := localizedCompletionGlobalAlgebra vK w + letI := localizedCompletionIsScalarTower vK w + letI : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + letI : IsGalois vK.Completion + (LocalizedCompletion vK w) := + HilbertRamification.algebraicLocalization_isGalois vK w + letI : Fintype (absoluteValueDecompositionGroup k w.1) := + Fintype.ofFinite _ + letI := + decompositionGroupLocalUnitsAction vK hvK w + letI : Finite + (HerbrandHMinusOne + (absoluteValueDecompositionGroup k w.1) + (LocalizedCompletion vK w)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup k w.1) + σ hgen)) := + localHerbrandHMinusOneFinite + vK hvK w σ hgen + Nat.card + (HerbrandHMinusOne + (absoluteValueDecompositionGroup k w.1) + (LocalizedCompletion vK w)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup k w.1) + σ hgen)) = 1 := by + let := localizedCompletionBaseAlgebra vK w + let := localizedCompletionGlobalAlgebra vK w + let := localizedCompletionIsScalarTower vK w + let : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionFiniteDimensional vK hvK w + let : IsGalois vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionIsGalois vK w + let := localizedCompletionDecompositionGroupFintype vK w + let := + decompositionGroupLocalUnitsAction vK hvK w + let : Finite + (HerbrandHMinusOne + (absoluteValueDecompositionGroup k w.1) + (LocalizedCompletion vK w)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup k w.1) + σ hgen)) := + localHerbrandHMinusOneFinite + vK hvK w σ hgen + let g := + localizedCompletionGaloisGenerator + vK hvK w σ hgen + let hg := + localizedCompletionGaloisGenerator_generates + vK hvK w σ hgen + let hcard := + finiteExtensionUnits_tate_card_of_generator + vK.Completion (LocalizedCompletion vK w) + g hg + calc + Nat.card + (HerbrandHMinusOne + (absoluteValueDecompositionGroup k w.1) + (LocalizedCompletion vK w)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup k w.1) + σ hgen)) = + Nat.card + (tateCohomology + (Rep.ofAlgebraAutOnUnits vK.Completion + (LocalizedCompletion vK w)) (-1)) := + Nat.card_congr + (localHerbrandHMinusOneEquivUnitsTateHminusOne + vK hvK w σ hgen) + _ = 1 := hcard.cardHminusOne + + +end LocalTateComparison + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Quotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Quotient.lean new file mode 100644 index 0000000000..d0374f9d31 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Quotient.lean @@ -0,0 +1,119 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial +/-! +# Localized-units Herbrand quotient +-/ + +@[expose] public section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory +open CyclicCohomology +open CyclicCohomology.ProfiniteCohomology.Herbrand +open scoped TensorProduct + +noncomputable +section + +namespace LocalClassFieldTheory + +section LocalTateComparison + +variable {k ell : Type} + [Field k] [Field ell] [Algebra k ell] + [FiniteDimensional k ell] [IsGalois k ell] + +theorem localUnits_herbrandQuotient_eq_localDegree + (vK : AbsoluteValue k ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK ell) + (σ : ell ≃ₐ[k] ell) + (hgen : ∀ τ : ell ≃ₐ[k] ell, + τ ∈ Subgroup.zpowers σ) + [ValuativeRel vK.Completion] + [IsNonarchimedeanLocalField vK.Completion] : + letI hK := + AbsoluteValue.extensionCompletionAlgebra + (K := k) w.1 + letI : SMul k w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := localizedCompletionGlobalAlgebra vK w + letI := localizedCompletionIsScalarTower vK w + letI : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + letI : IsGalois vK.Completion + (LocalizedCompletion vK w) := + HilbertRamification.algebraicLocalization_isGalois vK w + letI : Fintype (absoluteValueDecompositionGroup k w.1) := + Fintype.ofFinite _ + letI := + decompositionGroupLocalUnitsAction vK hvK w + letI : Finite + (HerbrandH0 + (absoluteValueDecompositionGroup k w.1) + (LocalizedCompletion vK w)ˣ) := + localHerbrandH0Finite vK hvK w σ hgen + letI : Finite + (HerbrandHMinusOne + (absoluteValueDecompositionGroup k w.1) + (LocalizedCompletion vK w)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup k w.1) + σ hgen)) := + localHerbrandHMinusOneFinite + vK hvK w σ hgen + herbrandQuotient + (G := absoluteValueDecompositionGroup k w.1) + (A := (LocalizedCompletion vK w)ˣ) + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup k w.1) + σ hgen) = + (Module.finrank vK.Completion + (LocalizedCompletion vK w) : ℚ) := by + let _ := localizedCompletionBaseAlgebra vK w + let _ := localizedCompletionGlobalAlgebra vK w + let _ := localizedCompletionIsScalarTower vK w + let _ : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionFiniteDimensional vK hvK w + let _ : IsGalois vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionIsGalois vK w + let _ := localizedCompletionDecompositionGroupFintype vK w + let _ := + decompositionGroupLocalUnitsAction vK hvK w + let _ : Finite + (HerbrandH0 + (absoluteValueDecompositionGroup k w.1) + (LocalizedCompletion vK w)ˣ) := + localHerbrandH0Finite vK hvK w σ hgen + let _ : Finite + (HerbrandHMinusOne + (absoluteValueDecompositionGroup k w.1) + (LocalizedCompletion vK w)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup k w.1) + σ hgen)) := + localHerbrandHMinusOneFinite + vK hvK w σ hgen + rw [herbrandQuotient_eq_card_ratio, + localHerbrandH0_card_eq_localDegree + vK hvK w σ hgen, + localHerbrandHMinusOne_card_eq_one + vK hvK w σ hgen] + simp + + +end LocalTateComparison + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Trivial.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Trivial.lean new file mode 100644 index 0000000000..2848e5bc0d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Trivial.lean @@ -0,0 +1,113 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +/-! +# Triviality of localized degree-minus-one Herbrand cohomology +-/ + +@[expose] public section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory +open CyclicCohomology +open CyclicCohomology.ProfiniteCohomology.Herbrand +open scoped TensorProduct + +noncomputable +section + +namespace LocalClassFieldTheory + +section LocalTateComparison + +variable {k ell : Type} + [Field k] [Field ell] [Algebra k ell] + [FiniteDimensional k ell] [IsGalois k ell] + +theorem localHerbrandHMinusOne_eq_one + (vK : AbsoluteValue k ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK ell) + (σ : ell ≃ₐ[k] ell) + (hgen : ∀ τ : ell ≃ₐ[k] ell, + τ ∈ Subgroup.zpowers σ) + [ValuativeRel vK.Completion] + [IsNonarchimedeanLocalField vK.Completion] : + letI hK := + AbsoluteValue.extensionCompletionAlgebra + (K := k) w.1 + letI : SMul k w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := localizedCompletionGlobalAlgebra vK w + letI := localizedCompletionIsScalarTower vK w + letI : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + letI : IsGalois vK.Completion + (LocalizedCompletion vK w) := + HilbertRamification.algebraicLocalization_isGalois vK w + letI : Fintype (absoluteValueDecompositionGroup k w.1) := + Fintype.ofFinite _ + letI := + decompositionGroupLocalUnitsAction vK hvK w + ∀ c : HerbrandHMinusOne + (absoluteValueDecompositionGroup k w.1) + (LocalizedCompletion vK w)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup k w.1) + σ hgen), + c = 1 := by + let _ := localizedCompletionBaseAlgebra vK w + let _ := localizedCompletionGlobalAlgebra vK w + let _ := localizedCompletionIsScalarTower vK w + let _ : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionFiniteDimensional vK hvK w + let _ : IsGalois vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionIsGalois vK w + let _ := localizedCompletionDecompositionGroupFintype vK w + let _ := + decompositionGroupLocalUnitsAction vK hvK w + let _ : Finite + (HerbrandHMinusOne + (absoluteValueDecompositionGroup k w.1) + (LocalizedCompletion vK w)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup k w.1) + σ hgen)) := + localHerbrandHMinusOneFinite + vK hvK w σ hgen + have hcard : + Nat.card + (HerbrandHMinusOne + (absoluteValueDecompositionGroup k w.1) + (LocalizedCompletion vK w)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup k w.1) + σ hgen)) = 1 := by + exact localHerbrandHMinusOne_card_eq_one + vK hvK w σ hgen + let _ : Subsingleton + (HerbrandHMinusOne + (absoluteValueDecompositionGroup k w.1) + (LocalizedCompletion vK w)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup k w.1) + σ hgen)) := + (Nat.card_eq_one_iff_unique.mp hcard).1 + intro c + exact Subsingleton.elim c 1 + + +end LocalTateComparison + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/CompMulEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/CompMulEquiv.lean new file mode 100644 index 0000000000..f114ee7cfb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/CompMulEquiv.lean @@ -0,0 +1,165 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Invariants +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.NormImage +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Main +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Induced +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldLocalization +public import Mathlib.FieldTheory.Galois.Infinite +/-! +# The local class-field axiom for decomposition-group blocks + +This file supplies the localized-completion input for the class formation. First it +proves change-of-group equivalences for low-degree multiplicative Tate +cohomology. It then applies the canonical algebraic-localization results: +the algebraic localization of a finite Galois extension is finite Galois over +the completed base, and the localization equivalence identifies its Galois group with the +decomposition group. + +For a nonarchimedean locally compact base completion, the concrete local +class-field axiom then gives: + +* `H⁰` is the actual field-norm quotient; +* `H⁻¹` is trivial; +* the cardinality and Herbrand quotient equal the local degree. +-/ + +@[expose] public section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory +open CyclicCohomology +open CyclicCohomology.ProfiniteCohomology.Herbrand +open scoped TensorProduct + +noncomputable +section + +namespace LocalClassFieldTheory + +universe uH uG uA + +variable {H : Type uH} {G : Type uG} {A : Type uA} + [Group H] [Fintype H] [Group G] [Fintype G] + [CommGroup A] [MulDistribMulAction G A] + +theorem tateNorm_compMulEquiv (e : H ≃* G) (a : A) : + letI := MulDistribMulAction.compHom A e.toMonoidHom + tateNorm H A a = tateNorm G A a := by + let := MulDistribMulAction.compHom A e.toMonoidHom + change (∏ h : H, e h • a) = ∏ g : G, g • a + exact e.toEquiv.prod_comp fun g ↦ g • a + +/-- Transport of the fixed subgroup along an isomorphism of acting groups. -/ +noncomputable def fixedSubgroupCompMulEquiv (e : H ≃* G) : + letI := MulDistribMulAction.compHom A e.toMonoidHom + fixedSubgroup H A ≃* fixedSubgroup G A := by + letI := MulDistribMulAction.compHom A e.toMonoidHom + exact + { toFun := fun x ↦ ⟨x.1, fun g ↦ by + have hx := x.2 (e.symm g) + change e (e.symm g) • x.1 = x.1 at hx + simpa using hx⟩ + invFun := fun x ↦ ⟨x.1, fun h ↦ x.2 (e h)⟩ + left_inv := fun _ ↦ rfl + right_inv := fun _ ↦ rfl + map_mul' := fun _ _ ↦ rfl } + +/-- Transport of the Tate norm kernel along an isomorphism of acting groups. -/ +noncomputable def normKernelCompMulEquiv (e : H ≃* G) : + letI := MulDistribMulAction.compHom A e.toMonoidHom + normKernelSubgroup H A ≃* normKernelSubgroup G A := by + letI := MulDistribMulAction.compHom A e.toMonoidHom + exact + { toFun := fun x ↦ ⟨x.1, by + change tateNorm G A x.1 = 1 + rw [← tateNorm_compMulEquiv e] + exact x.2⟩ + invFun := fun x ↦ ⟨x.1, by + change tateNorm H A x.1 = 1 + rw [tateNorm_compMulEquiv e] + exact x.2⟩ + left_inv := fun _ ↦ rfl + right_inv := fun _ ↦ rfl + map_mul' := fun _ _ ↦ rfl } + +/-- Change of acting group for multiplicative degree-zero Herbrand +cohomology. -/ +noncomputable def herbrandH0CompMulEquiv (e : H ≃* G) : + letI := MulDistribMulAction.compHom A e.toMonoidHom + HerbrandH0 H A ≃* HerbrandH0 G A := by + letI := MulDistribMulAction.compHom A e.toMonoidHom + let f := fixedSubgroupCompMulEquiv (A := A) e + let N := + (tateNormSubgroup H A).subgroupOf (fixedSubgroup H A) + let M := + (tateNormSubgroup G A).subgroupOf (fixedSubgroup G A) + exact quotientMulEquivOfSplit N M + f.toMonoidHom f.symm.toMonoidHom + (fun y ↦ f.apply_symm_apply y) + (fun x hx ↦ by + rw [Subgroup.mem_subgroupOf] at hx ⊢ + rcases hx with ⟨a, ha⟩ + refine ⟨a, ?_⟩ + change tateNorm G A a = x.1 + rw [← tateNorm_compMulEquiv e] + exact ha) + (fun y hy ↦ by + rw [Subgroup.mem_subgroupOf] at hy ⊢ + rcases hy with ⟨a, ha⟩ + refine ⟨a, ?_⟩ + change tateNorm H A a = y.1 + rw [tateNorm_compMulEquiv e] + exact ha) + (fun x hx ↦ by + have hx1 : x = 1 := by + apply f.injective + simpa [f] using hx + rw [hx1] + exact N.one_mem) + +/-- Change of acting group for multiplicative degree-minus-one Herbrand +cohomology. -/ +noncomputable def herbrandHMinusOneCompMulEquiv + (e : H ≃* G) (σ : H) : + letI := MulDistribMulAction.compHom A e.toMonoidHom + HerbrandHMinusOne H A σ ≃* + HerbrandHMinusOne G A (e σ) := by + letI := MulDistribMulAction.compHom A e.toMonoidHom + let f := normKernelCompMulEquiv (A := A) e + let N := + (augmentationSubgroup H A σ).subgroupOf + (normKernelSubgroup H A) + let M := + (augmentationSubgroup G A (e σ)).subgroupOf + (normKernelSubgroup G A) + exact quotientMulEquivOfSplit N M + f.toMonoidHom f.symm.toMonoidHom + (fun y ↦ f.apply_symm_apply y) + (fun x hx ↦ by + rw [Subgroup.mem_subgroupOf] at hx ⊢ + rcases hx with ⟨a, ha⟩ + refine ⟨a, ?_⟩ + exact ha) + (fun y hy ↦ by + rw [Subgroup.mem_subgroupOf] at hy ⊢ + rcases hy with ⟨a, ha⟩ + refine ⟨a, ?_⟩ + exact ha) + (fun x hx ↦ by + have hx1 : x = 1 := by + apply f.injective + simpa [f] using hx + rw [hx1] + exact N.one_mem) + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Finite.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Finite.lean new file mode 100644 index 0000000000..fd318c3f71 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Finite.lean @@ -0,0 +1,167 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv +/-! +# Finiteness of localized-completion Herbrand groups +-/ + +@[expose] public section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory +open CyclicCohomology +open CyclicCohomology.ProfiniteCohomology.Herbrand +open scoped TensorProduct + +noncomputable +section + +namespace LocalClassFieldTheory + +section LocalTateComparison + +variable {k ell : Type} + [Field k] [Field ell] [Algebra k ell] + [FiniteDimensional k ell] [IsGalois k ell] + +theorem localHerbrandH0Finite + (vK : AbsoluteValue k ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK ell) + (σ : ell ≃ₐ[k] ell) + (hgen : ∀ τ : ell ≃ₐ[k] ell, + τ ∈ Subgroup.zpowers σ) + [ValuativeRel vK.Completion] + [IsNonarchimedeanLocalField vK.Completion] : + letI hK := + AbsoluteValue.extensionCompletionAlgebra + (K := k) w.1 + letI : SMul k w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := localizedCompletionGlobalAlgebra vK w + letI := localizedCompletionIsScalarTower vK w + letI : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + letI : IsGalois vK.Completion + (LocalizedCompletion vK w) := + HilbertRamification.algebraicLocalization_isGalois vK w + letI : Fintype (absoluteValueDecompositionGroup k w.1) := + Fintype.ofFinite _ + letI := + decompositionGroupLocalUnitsAction vK hvK w + Finite + (HerbrandH0 (absoluteValueDecompositionGroup k w.1) + (LocalizedCompletion vK w)ˣ) := by + let := localizedCompletionBaseAlgebra vK w + let := localizedCompletionGlobalAlgebra vK w + let := localizedCompletionIsScalarTower vK w + let : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionFiniteDimensional vK hvK w + let : IsGalois vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionIsGalois vK w + let := localizedCompletionDecompositionGroupFintype vK w + let g := + localizedCompletionGaloisGenerator + vK hvK w σ hgen + let hg := + localizedCompletionGaloisGenerator_generates + vK hvK w σ hgen + let hcard := + finiteExtensionUnits_tate_card_of_generator + vK.Completion (LocalizedCompletion vK w) + g hg + let : Finite + (tateCohomology + (Rep.ofAlgebraAutOnUnits vK.Completion + (LocalizedCompletion vK w)) 0) := + hcard.finiteH0 + exact Finite.of_equiv + (Multiplicative + (tateCohomology + (Rep.ofAlgebraAutOnUnits vK.Completion + (LocalizedCompletion vK w)) 0)) + (localHerbrandH0EquivUnitsTateH0 + vK hvK w).symm.toEquiv + +theorem localHerbrandHMinusOneFinite + (vK : AbsoluteValue k ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK ell) + (σ : ell ≃ₐ[k] ell) + (hgen : ∀ τ : ell ≃ₐ[k] ell, + τ ∈ Subgroup.zpowers σ) + [ValuativeRel vK.Completion] + [IsNonarchimedeanLocalField vK.Completion] : + letI hK := + AbsoluteValue.extensionCompletionAlgebra + (K := k) w.1 + letI : SMul k w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := localizedCompletionGlobalAlgebra vK w + letI := localizedCompletionIsScalarTower vK w + letI : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + letI : IsGalois vK.Completion + (LocalizedCompletion vK w) := + HilbertRamification.algebraicLocalization_isGalois vK w + letI : Fintype (absoluteValueDecompositionGroup k w.1) := + Fintype.ofFinite _ + letI := + decompositionGroupLocalUnitsAction vK hvK w + Finite + (HerbrandHMinusOne + (absoluteValueDecompositionGroup k w.1) + (LocalizedCompletion vK w)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup k w.1) + σ hgen)) := by + let := localizedCompletionBaseAlgebra vK w + let := localizedCompletionGlobalAlgebra vK w + let := localizedCompletionIsScalarTower vK w + let : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionFiniteDimensional vK hvK w + let : IsGalois vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionIsGalois vK w + let := localizedCompletionDecompositionGroupFintype vK w + let g := + localizedCompletionGaloisGenerator + vK hvK w σ hgen + let hg := + localizedCompletionGaloisGenerator_generates + vK hvK w σ hgen + let hcard := + finiteExtensionUnits_tate_card_of_generator + vK.Completion (LocalizedCompletion vK w) + g hg + let : Finite + (tateCohomology + (Rep.ofAlgebraAutOnUnits vK.Completion + (LocalizedCompletion vK w)) (-1)) := by + apply Nat.finite_of_card_ne_zero + rw [hcard.cardHminusOne] + exact one_ne_zero + exact Finite.of_equiv + (tateCohomology + (Rep.ofAlgebraAutOnUnits vK.Completion + (LocalizedCompletion vK w)) (-1)) + (localHerbrandHMinusOneEquivUnitsTateHminusOne + vK hvK w σ hgen).symm + + +end LocalTateComparison + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Generator.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Generator.lean new file mode 100644 index 0000000000..76e112c128 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Generator.lean @@ -0,0 +1,94 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +/-! +# A generator of a localized finite Galois group +-/ + +@[expose] public section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory +open CyclicCohomology +open CyclicCohomology.ProfiniteCohomology.Herbrand +open scoped TensorProduct + +noncomputable +section + +namespace LocalClassFieldTheory + +universe u v + +variable {K : Type u} {L : Type v} + [Field K] [Field L] [Algebra K L] + [IsGalois K L] [FiniteDimensional K L] + +/-- The canonical finite structure on the decomposition group used by the +localized low-degree cohomology calculations. -/ +@[reducible] +noncomputable def localizedCompletionDecompositionGroupFintype + (vK : AbsoluteValue K ℝ) + (w : AbsoluteValueExtension vK L) : + Fintype (absoluteValueDecompositionGroup K w.1) := + Fintype.ofFinite _ + +/-- A generator of the localized Galois group induced by a chosen generator +of the global cyclic Galois group. -/ +noncomputable def localizedCompletionGaloisGenerator + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + LocalizedCompletion vK w ≃ₐ[vK.Completion] + LocalizedCompletion vK w := + (decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w) + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup K w.1) σ hgen) + +theorem localizedCompletionGaloisGenerator_generates + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (σ : L ≃ₐ[K] L) + (hgen : ∀ τ : L ≃ₐ[K] L, + τ ∈ Subgroup.zpowers σ) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + ∀ τ : LocalizedCompletion vK w ≃ₐ[vK.Completion] + LocalizedCompletion vK w, + τ ∈ Subgroup.zpowers + (localizedCompletionGaloisGenerator + vK hvK w σ hgen) := by + let := localizedCompletionBaseAlgebra vK w + let H := absoluteValueDecompositionGroup K w.1 + let e := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w + let δ := + subgroupGeneratorOfGenerator H σ hgen + intro τ + rw [show localizedCompletionGaloisGenerator + vK hvK w σ hgen = e δ from rfl] + change τ ∈ Subgroup.zpowers (e.toMonoidHom δ) + rw [← MonoidHom.map_zpowers e.toMonoidHom δ] + refine ⟨e.symm τ, ?_, e.apply_symm_apply τ⟩ + exact subgroupGeneratorOfGenerator_generates + H σ hgen (e.symm τ) + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/HerbrandEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/HerbrandEquiv.lean new file mode 100644 index 0000000000..ce42dfd20c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/HerbrandEquiv.lean @@ -0,0 +1,231 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +/-! +# Low-degree Herbrand equivalences for a localized completion +-/ + +@[expose] public section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory +open CyclicCohomology +open CyclicCohomology.ProfiniteCohomology.Herbrand +open scoped TensorProduct + +noncomputable +section + +namespace LocalClassFieldTheory + +section LocalTateComparison + +variable {k ell : Type} + [Field k] [Field ell] [Algebra k ell] + [FiniteDimensional k ell] [IsGalois k ell] + +/-- Degree-zero multiplicative Herbrand cohomology for a decomposition group +identified with degree-zero Tate cohomology of the localized field units. -/ +noncomputable def localHerbrandH0EquivUnitsTateH0 + (vK : AbsoluteValue k ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK ell) : + letI hK := + AbsoluteValue.extensionCompletionAlgebra + (K := k) w.1 + letI : SMul k w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := localizedCompletionGlobalAlgebra vK w + letI := localizedCompletionIsScalarTower vK w + letI : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + letI : IsGalois vK.Completion + (LocalizedCompletion vK w) := + HilbertRamification.algebraicLocalization_isGalois vK w + letI : Fintype (absoluteValueDecompositionGroup k w.1) := + Fintype.ofFinite _ + letI := + decompositionGroupLocalUnitsAction vK hvK w + HerbrandH0 (absoluteValueDecompositionGroup k w.1) + (LocalizedCompletion vK w)ˣ ≃* + Multiplicative + (tateCohomology + (Rep.ofAlgebraAutOnUnits vK.Completion + (LocalizedCompletion vK w)) 0) := by + letI := localizedCompletionBaseAlgebra vK w + letI := localizedCompletionGlobalAlgebra vK w + letI := localizedCompletionIsScalarTower vK w + letI : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionFiniteDimensional vK hvK w + letI : IsGalois vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionIsGalois vK w + letI := localizedCompletionDecompositionGroupFintype vK w + letI : + MulDistribMulAction + (LocalizedCompletion vK w ≃ₐ[vK.Completion] + LocalizedCompletion vK w) + (LocalizedCompletion vK w)ˣ := + galoisGroupFieldUnitsMulDistribMulAction + vK.Completion (LocalizedCompletion vK w) + let e := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w + let eTate : + (unitsInvariantSubmodule vK.Completion + (LocalizedCompletion vK w) ⧸ + unitsTateH0NormSubmodule vK.Completion + (LocalizedCompletion vK w)) ≃+ + tateCohomology + (Rep.ofAlgebraAutOnUnits vK.Completion + (LocalizedCompletion vK w)) 0 := + (tateUnitsH0IsoInvariantsQuotient + vK.Completion + (LocalizedCompletion vK w)).symm.toLinearEquiv.toAddEquiv + exact + (herbrandH0CompMulEquiv + (A := (LocalizedCompletion vK w)ˣ) e).trans + ((herbrandH0MulEquivInvariantsNormQuotient + vK.Completion (LocalizedCompletion vK w)).trans + eTate.toMultiplicative) + +/-- Degree-minus-one multiplicative Herbrand cohomology for a decomposition +group identified with degree-minus-one Tate cohomology of localized units. -/ +noncomputable def localHerbrandHMinusOneEquivUnitsTateHminusOne + (vK : AbsoluteValue k ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK ell) + (σ : ell ≃ₐ[k] ell) + (hgen : ∀ τ : ell ≃ₐ[k] ell, + τ ∈ Subgroup.zpowers σ) : + letI hK := + AbsoluteValue.extensionCompletionAlgebra + (K := k) w.1 + letI : SMul k w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := localizedCompletionGlobalAlgebra vK w + letI := localizedCompletionIsScalarTower vK w + letI : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + letI : IsGalois vK.Completion + (LocalizedCompletion vK w) := + HilbertRamification.algebraicLocalization_isGalois vK w + letI : Fintype (absoluteValueDecompositionGroup k w.1) := + Fintype.ofFinite _ + letI := + decompositionGroupLocalUnitsAction vK hvK w + HerbrandHMinusOne + (absoluteValueDecompositionGroup k w.1) + (LocalizedCompletion vK w)ˣ + (subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup k w.1) σ hgen) ≃ + tateCohomology + (Rep.ofAlgebraAutOnUnits vK.Completion + (LocalizedCompletion vK w)) (-1) := by + letI := localizedCompletionBaseAlgebra vK w + letI := localizedCompletionGlobalAlgebra vK w + letI := localizedCompletionIsScalarTower vK w + letI : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionFiniteDimensional vK hvK w + letI : IsGalois vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionIsGalois vK w + letI := localizedCompletionDecompositionGroupFintype vK w + letI : + MulDistribMulAction + (LocalizedCompletion vK w ≃ₐ[vK.Completion] + LocalizedCompletion vK w) + (LocalizedCompletion vK w)ˣ := + galoisGroupFieldUnitsMulDistribMulAction + vK.Completion (LocalizedCompletion vK w) + let e := + decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w + let δ := + subgroupGeneratorOfGenerator + (absoluteValueDecompositionGroup k w.1) σ hgen + let g := + localizedCompletionGaloisGenerator + vK hvK w σ hgen + let hg := + localizedCompletionGaloisGenerator_generates + vK hvK w σ hgen + exact + (herbrandHMinusOneCompMulEquiv + (A := (LocalizedCompletion vK w)ˣ) + e δ).toEquiv.trans + (herbrandHminusOneEquivUnitsTateHminusOne + vK.Completion (LocalizedCompletion vK w) + g hg) + +/-- Degree-zero Herbrand cohomology for a decomposition group identified with +the norm quotient of the localized field extension. -/ +noncomputable def localHerbrandH0EquivNormQuotient + (vK : AbsoluteValue k ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK ell) : + letI hK := + AbsoluteValue.extensionCompletionAlgebra + (K := k) w.1 + letI : SMul k w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := localizedCompletionGlobalAlgebra vK w + letI := localizedCompletionIsScalarTower vK w + letI : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionModuleFinite vK hvK w + letI : IsGalois vK.Completion + (LocalizedCompletion vK w) := + HilbertRamification.algebraicLocalization_isGalois vK w + letI : Fintype (absoluteValueDecompositionGroup k w.1) := + Fintype.ofFinite _ + letI := + decompositionGroupLocalUnitsAction vK hvK w + HerbrandH0 (absoluteValueDecompositionGroup k w.1) + (LocalizedCompletion vK w)ˣ ≃* + NormQuotient vK.Completion + (LocalizedCompletion vK w) := by + letI := localizedCompletionBaseAlgebra vK w + letI := localizedCompletionGlobalAlgebra vK w + letI := localizedCompletionIsScalarTower vK w + letI : FiniteDimensional vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionFiniteDimensional vK hvK w + letI : IsGalois vK.Completion + (LocalizedCompletion vK w) := + localizedCompletionIsGalois vK w + letI := localizedCompletionDecompositionGroupFintype vK w + let e0 := + localHerbrandH0EquivUnitsTateH0 vK hvK w + let eAdd : + tateCohomology + (Rep.ofAlgebraAutOnUnits vK.Completion + (LocalizedCompletion vK w)) 0 ≃+ + Additive + (NormQuotient vK.Completion + (LocalizedCompletion vK w)) := + (H0TateUnitsIsoNormQuotient + vK.Completion + (LocalizedCompletion vK w)).toLinearEquiv.toAddEquiv + exact e0.trans <| + eAdd.toMultiplicative.trans <| + MulEquiv.multiplicativeAdditive + (NormQuotient vK.Completion + (LocalizedCompletion vK w)) + + +end LocalTateComparison + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean new file mode 100644 index 0000000000..0f063c1712 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean @@ -0,0 +1,133 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FieldUnitsHerbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.IntegerUnitsHerbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisCohomology + +/-! # Main -/ + +@[expose] public section +namespace LocalClassFieldTheory +open CyclicCohomology + +open LocalFieldTheory + +/-! +# The local class-field axiom + +For a cyclic extension of nonarchimedean local fields, the actual Tate +cohomology of `Lˣ` has cardinalities `[L : K]` in degree zero and `1` in +degree minus one. +-/ + +noncomputable +section + +open scoped ValuativeRel +open IsNonarchimedeanLocalField +open CyclicCohomology.ProfiniteCohomology.Herbrand + +variable (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + +/-- The integer-unit Herbrand witness used by the local class-field axiom, +including the proof that its Herbrand quotient is one. -/ +theorem exists_localIntegerUnitsHerbrandDefinedAndEqOne + (g : Gal(L/K)) + (hg : ∀ sigma : Gal(L/K), sigma ∈ Subgroup.zpowers g) : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + ∃ _ : HerbrandQuotientDefined (Gal(L/K)) 𝒪[L]ˣ g, + @herbrandQuotient (Gal(L/K)) 𝒪[L]ˣ _ _ _ + (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) + g = 1 := by + rcases exists_chosenNormalBasisPrincipalUnitSubgroup + (K := K) (L := L) with ⟨cV, hcV⟩ + rcases exists_chosenNormalBasisPrincipalUnit_herbrand_subsingleton + (K := K) (L := L) g hg with ⟨cH, hcH⟩ + rcases exists_integerUnits_herbrandQuotient_eq_one_of_large_chosenNormalBasisLevel + (K := K) (L := L) with ⟨cU, hcU⟩ + let n : Nat := max cV (max cH cU) + have hcVn : cV ≤ n := le_max_left cV (max cH cU) + have hrest : max cH cU ≤ n := le_max_right cV (max cH cU) + have hcHn : cH ≤ n := le_trans (le_max_left cH cU) hrest + have hcUn : cU ≤ n := le_trans (le_max_right cH cU) hrest + rcases hcV n hcVn with ⟨V, hV, _hVprincipal⟩ + let := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction + K L n V hV + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + let := chosenNormalBasisIntegerUnitsQuotMulDistribMulAction K L n V hV + have hcoh := hcH n hcHn V hV + rcases hcU n hcUn V hV g hg hcoh.1 hcoh.2 with ⟨hU, hUone⟩ + exact ⟨hU, hUone⟩ + +/-- Canonical choice of the integer-unit finiteness witness constructed by +the local normal-basis argument. -/ +private theorem localIntegerUnitsHerbrandDefined + (g : Gal(L/K)) + (hg : ∀ sigma : Gal(L/K), sigma ∈ Subgroup.zpowers g) : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + HerbrandQuotientDefined (Gal(L/K)) 𝒪[L]ˣ g := + Classical.choose (exists_localIntegerUnitsHerbrandDefinedAndEqOne K L g hg) + +private theorem localIntegerUnitsHerbrandQuotient_eq_one + (g : Gal(L/K)) + (hg : ∀ sigma : Gal(L/K), sigma ∈ Subgroup.zpowers g) : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + @herbrandQuotient (Gal(L/K)) 𝒪[L]ˣ _ _ _ + (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) g = 1 := + Classical.choose_spec (exists_localIntegerUnitsHerbrandDefinedAndEqOne K L g hg) + +/-- Finiteness of actual unit Tate `H⁰`, produced from the same local +normal-basis witness as the cardinality theorem. -/ +theorem localFieldUnitsTateH0FiniteOfGenerator + (g : Gal(L/K)) + (hg : ∀ sigma : Gal(L/K), sigma ∈ Subgroup.zpowers g) : + Finite (tateCohomology (Rep.ofAlgebraAutOnUnits K L) 0) := + unitsTateH0FiniteOfIntegerUnitsHerbrand K L g hg + (localIntegerUnitsHerbrandDefined K L g hg) + +/-- The local class-field-axiom theorem for a specified generator of the cyclic Galois group. -/ +theorem localFieldUnits_tate_card_of_generator + (g : Gal(L/K)) + (hg : ∀ sigma : Gal(L/K), sigma ∈ Subgroup.zpowers g) : + letI := localFieldUnitsTateH0FiniteOfGenerator K L g hg + Nat.card (tateCohomology (Rep.ofAlgebraAutOnUnits K L) 0) = Module.finrank K L ∧ + Nat.card (tateCohomology (Rep.ofAlgebraAutOnUnits K L) (-1)) = 1 := by + exact fieldUnits_tate_card_of_integerUnits_herbrand_eq_one + K L g hg (localIntegerUnitsHerbrandDefined K L g hg) + (localIntegerUnitsHerbrandQuotient_eq_one K L g hg) + +/-- States the theorem `localFieldUnitsTateH0FiniteOfIsCyclic`. -/ +theorem localFieldUnitsTateH0FiniteOfIsCyclic + [IsCyclic (Gal(L/K))] : + Finite (tateCohomology (Rep.ofAlgebraAutOnUnits K L) 0) := by + obtain ⟨g, hg⟩ := (IsCyclic.exists_generator : + ∃ g : Gal(L/K), ∀ sigma : Gal(L/K), + sigma ∈ Subgroup.zpowers g) + exact localFieldUnitsTateH0FiniteOfGenerator K L g hg + +/-- Generator-free form of the local class-field-axiom theorem. Both Tate +cohomology objects are canonical and independent of the generator used in the proof. -/ +theorem localFieldUnits_tate_card_of_isCyclic [IsCyclic (Gal(L/K))] : + letI := localFieldUnitsTateH0FiniteOfIsCyclic K L + Nat.card (tateCohomology (Rep.ofAlgebraAutOnUnits K L) 0) = Module.finrank K L ∧ + Nat.card (tateCohomology (Rep.ofAlgebraAutOnUnits K L) (-1)) = 1 := by + rcases (IsCyclic.exists_generator : + ∃ g : Gal(L/K), ∀ sigma : Gal(L/K), + sigma ∈ Subgroup.zpowers g) with ⟨g, hg⟩ + exact localFieldUnits_tate_card_of_generator K L g hg + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean new file mode 100644 index 0000000000..568ebed1b1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean @@ -0,0 +1,761 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLattice +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic +public import Mathlib.FieldTheory.Galois.NormalBasis +public import Mathlib.LinearAlgebra.Quotient.Pi +/-! Provides the public declarations in the `LocalClassFieldTheory.ClassFormation.NormalBasis` + Lean module. -/ + +@[expose] public section + +open _root_.CyclicCohomology.ProfiniteCohomology.Herbrand renaming + herbrandH0_subsingleton_of_addEquiv_rightRegularFunction → + herbrandH0_subsingleton_of_addEquiv_rightRegularFunction + +open _root_.CyclicCohomology.ProfiniteCohomology.Herbrand renaming + herbrandHMinusOne_subsingleton_of_addEquiv_rightRegularFunction → + herbrandHMinusOne_subsingleton_of_addEquiv_rightRegularFunction + +open _root_.CyclicCohomology.ProfiniteCohomology.Herbrand renaming + multiplicativeMulDistribMulActionOfDistribMulAction → + multiplicativeMulDistribMulActionOfDistribMulAction + + +namespace LocalClassFieldTheory + +open LocalFieldTheory + +open CyclicCohomology + +noncomputable +section + +universe u + +open scoped ValuativeRel + +variable (K L : Type u) [Field K] [ValuativeRel K] [Field L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + +/-- The two descriptions of the standard lattice use the same normal-basis orbit. -/ +theorem span_normalBasis_eq_chosenNormalBasisIntegerLattice : + Submodule.span 𝒪[K] (Set.range (IsGalois.normalBasis K L)) = + chosenNormalBasisIntegerLattice K L := by + rw [chosenNormalBasisIntegerLattice_eq_span] + congr 1 + ext y + constructor + · rintro ⟨σ, rfl⟩ + exact ⟨σ, (IsGalois.normalBasis_apply (K := K) (L := L) σ).symm⟩ + · rintro ⟨σ, rfl⟩ + exact ⟨σ, IsGalois.normalBasis_apply (K := K) (L := L) σ⟩ + +/-- The normal-basis orbit is an `𝒪_K`-basis of the standard lattice `M`. +This is the coordinate source for the induced-module calculation in the local +class-field-axiom proof. -/ +noncomputable def chosenNormalBasisIntegerLatticeBasis : + Module.Basis Gal(L/K) 𝒪[K] (chosenNormalBasisIntegerLattice K L) := + ((IsGalois.normalBasis K L).restrictScalars 𝒪[K]).map + (LinearEquiv.ofEq _ _ + (span_normalBasis_eq_chosenNormalBasisIntegerLattice K L)) + +/-- The integral lattice basis has the same underlying vectors as the chosen normal basis. -/ +@[simp] +theorem chosenNormalBasisIntegerLatticeBasis_apply (σ : Gal(L/K)) : + ((chosenNormalBasisIntegerLatticeBasis K L σ : + chosenNormalBasisIntegerLattice K L) : L) = IsGalois.normalBasis K L σ := by + simp [chosenNormalBasisIntegerLatticeBasis, LinearEquiv.coe_ofEq_apply] + +section GradedCoordinates + +variable [TopologicalSpace K] [IsNonarchimedeanLocalField K] + +/-- Multiplication by `π_K^n`, from the normal-basis lattice onto its +`n`-th dilate. -/ +def chosenNormalBasisIntegerLatticeMulPowLinearMap (n : Nat) : + chosenNormalBasisIntegerLattice K L →ₗ[𝒪[K]] + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) where + toFun x := + ⟨algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * (x : L), + (mem_chosenBaseUniformizerPowSubmodule_iff + (K := K) (L := L) n (chosenNormalBasisIntegerLattice K L) _).2 + ⟨x, x.2, rfl⟩⟩ + map_add' := by + intro x y + ext + exact mul_add _ _ _ + map_smul' := by + intro a x + ext + simp [Algebra.smul_def, mul_assoc, mul_comm, mul_left_comm] + +/-- Uniformizer-power scaling bijects the integral lattice with its scaled copy. -/ +theorem chosenNormalBasisIntegerLatticeMulPowLinearMap_bijective (n : Nat) : + Function.Bijective (chosenNormalBasisIntegerLatticeMulPowLinearMap K L n) := by + constructor + · intro x y hxy + apply Subtype.ext + have hxy' := congrArg Subtype.val hxy + change algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * (x : L) = + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * (y : L) at hxy' + have hπ : chosenIntegerRingUniformizer K ^ n ≠ 0 := + pow_ne_zero n (chosenIntegerRingUniformizer_irreducible K).ne_zero + have hπL : algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) ≠ 0 := by + change algebraMap K L + ((chosenIntegerRingUniformizer K ^ n : 𝒪[K]) : K) ≠ 0 + apply (map_ne_zero (algebraMap K L)).2 + intro h + exact hπ ((IsFractionRing.injective 𝒪[K] K) h) + exact mul_left_cancel₀ hπL hxy' + · intro x + rcases (mem_chosenBaseUniformizerPowSubmodule_iff + (K := K) (L := L) n (chosenNormalBasisIntegerLattice K L) (x : L)).1 x.2 with + ⟨y, hy, hxy⟩ + refine ⟨⟨y, hy⟩, ?_⟩ + apply Subtype.ext + exact hxy + +/-- Multiplication by `π_K^n` as an `𝒪_K`-linear equivalence of the +normal-basis lattice with its `n`-th dilate. -/ +noncomputable def chosenNormalBasisIntegerLatticeMulPowLinearEquiv (n : Nat) : + chosenNormalBasisIntegerLattice K L ≃ₗ[𝒪[K]] + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) := + LinearEquiv.ofBijective (chosenNormalBasisIntegerLatticeMulPowLinearMap K L n) + (chosenNormalBasisIntegerLatticeMulPowLinearMap_bijective K L n) + +/-- The scaling equivalence acts by multiplication by the chosen uniformizer power. -/ +@[simp] +theorem chosenNormalBasisIntegerLatticeMulPowLinearEquiv_apply + (n : Nat) (x : chosenNormalBasisIntegerLattice K L) : + ((chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n x : + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)) : L) = + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * (x : L) := + rfl + +/-- The first uniformizer layer `π_K M`, regarded as a submodule of the +normal-basis lattice `M`. -/ +def chosenNormalBasisIntegerLatticeUniformizerSubmodule : + Submodule 𝒪[K] (chosenNormalBasisIntegerLattice K L) := + (chosenBaseUniformizerPowSubmodule K L 1 + (chosenNormalBasisIntegerLattice K L)).comap + (chosenNormalBasisIntegerLattice K L).subtype + +/-- Membership in the lattice uniformizer submodule is detected after coercion to the field. -/ +@[simp] +theorem mem_chosenNormalBasisIntegerLatticeUniformizerSubmodule_iff + (x : chosenNormalBasisIntegerLattice K L) : + x ∈ chosenNormalBasisIntegerLatticeUniformizerSubmodule K L ↔ + (x : L) ∈ chosenBaseUniformizerPowSubmodule K L 1 + (chosenNormalBasisIntegerLattice K L) := + Iff.rfl + +/-- Scaling maps the uniformizer submodule onto the next normal-basis lattice. -/ +theorem chosenNormalBasisIntegerLatticeUniformizerSubmodule_map_mulPow + (n : Nat) : + (chosenNormalBasisIntegerLatticeUniformizerSubmodule K L).map + (chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n : + chosenNormalBasisIntegerLattice K L →ₗ[𝒪[K]] + chosenBaseUniformizerPowSubmodule K L n + (chosenNormalBasisIntegerLattice K L)) = + chosenNormalBasisLatticeSuccSubmodule K L n := by + ext x + constructor + · rintro ⟨y, hy, rfl⟩ + change algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * (y : L) ∈ + chosenBaseUniformizerPowSubmodule K L (n + 1) + (chosenNormalBasisIntegerLattice K L) + rcases (mem_chosenBaseUniformizerPowSubmodule_iff + (K := K) (L := L) 1 (chosenNormalBasisIntegerLattice K L) (y : L)).1 hy with + ⟨z, hz, hzy⟩ + refine (mem_chosenBaseUniformizerPowSubmodule_iff + (K := K) (L := L) (n + 1) (chosenNormalBasisIntegerLattice K L) _).2 + ⟨z, hz, ?_⟩ + rw [← hzy] + simp only [pow_succ, pow_zero, map_mul, one_mul] + ring + · intro hx + change (x : L) ∈ chosenBaseUniformizerPowSubmodule K L (n + 1) + (chosenNormalBasisIntegerLattice K L) at hx + rcases (mem_chosenBaseUniformizerPowSubmodule_iff + (K := K) (L := L) (n + 1) (chosenNormalBasisIntegerLattice K L) (x : L)).1 hx with + ⟨z, hz, hzx⟩ + let y : chosenNormalBasisIntegerLattice K L := + ⟨algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K) * z, by + simpa [Algebra.smul_def] using + (chosenNormalBasisIntegerLattice K L).smul_mem + (chosenIntegerRingUniformizer K) hz⟩ + have hy : y ∈ chosenNormalBasisIntegerLatticeUniformizerSubmodule K L := by + refine (mem_chosenBaseUniformizerPowSubmodule_iff + (K := K) (L := L) 1 (chosenNormalBasisIntegerLattice K L) (y : L)).2 + ⟨z, hz, ?_⟩ + simp [y] + refine ⟨y, hy, ?_⟩ + apply Subtype.ext + change algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * (y : L) = + (x : L) + rw [← hzx] + simp only [y, pow_succ, map_mul] + ring + +/-- Removing the common factor `π_K^n` identifies the `n`-th lattice graded +piece with the fixed quotient `M / π_K M`. -/ +noncomputable def chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv + (n : Nat) : + chosenNormalBasisLatticeSuccQuot K L n ≃ₗ[𝒪[K]] + (chosenNormalBasisIntegerLattice K L ⧸ + chosenNormalBasisIntegerLatticeUniformizerSubmodule K L) := + (chosenNormalBasisLatticeSuccQuotConcreteLinearEquiv K L n).trans + (Submodule.Quotient.equiv + (chosenNormalBasisIntegerLatticeUniformizerSubmodule K L) + (chosenNormalBasisLatticeSuccSubmodule K L n) + (chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n) + (chosenNormalBasisIntegerLatticeUniformizerSubmodule_map_mulPow K L n)).symm + +/-- Removing the common uniformizer power sends a scaled representative to its integral class. -/ +@[simp] +theorem chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv_mk_mulPow + (n : Nat) (x : chosenNormalBasisIntegerLattice K L) : + chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv K L n + (chosenNormalBasisLatticeSuccQuotMk K L n + (chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n x)) = + Submodule.Quotient.mk x := by + let e := Submodule.Quotient.equiv + (chosenNormalBasisIntegerLatticeUniformizerSubmodule K L) + (chosenNormalBasisLatticeSuccSubmodule K L n) + (chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n) + (chosenNormalBasisIntegerLatticeUniformizerSubmodule_map_mulPow K L n) + change + e.symm + (chosenNormalBasisLatticeSuccQuotConcreteLinearEquiv K L n + (chosenNormalBasisLatticeSuccQuotMk K L n + (chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n x))) = + Submodule.Quotient.mk x + rw [chosenNormalBasisLatticeSuccQuotConcreteLinearEquiv_mk] + apply e.injective + rw [LinearEquiv.apply_symm_apply] + rfl + +/-- Coordinate functions all of whose values lie in the maximal ideal of +`𝒪_K`. -/ +def chosenNormalBasisCoordinateMaximalSubmodule : + Submodule 𝒪[K] (Gal(L/K) → 𝒪[K]) := + Submodule.pi Set.univ (fun _ => (𝓂[K] : Ideal 𝒪[K])) + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- A coordinate function lies in the maximal submodule exactly when every value is nonunit. -/ +@[simp] +theorem mem_chosenNormalBasisCoordinateMaximalSubmodule_iff + (f : Gal(L/K) → 𝒪[K]) : + f ∈ chosenNormalBasisCoordinateMaximalSubmodule K L ↔ + ∀ σ : Gal(L/K), f σ ∈ (𝓂[K] : Ideal 𝒪[K]) := by + simp [chosenNormalBasisCoordinateMaximalSubmodule] + +/-- Normal-basis coordinates identify the uniformizer submodule with pointwise maximal-ideal +values. -/ +theorem chosenNormalBasisIntegerLatticeUniformizerSubmodule_map_equivFun : + (chosenNormalBasisIntegerLatticeUniformizerSubmodule K L).map + ((chosenNormalBasisIntegerLatticeBasis K L).equivFun : + chosenNormalBasisIntegerLattice K L →ₗ[𝒪[K]] (Gal(L/K) → 𝒪[K])) = + chosenNormalBasisCoordinateMaximalSubmodule K L := by + ext f + constructor + · rintro ⟨x, hx, rfl⟩ + rw [chosenNormalBasisCoordinateMaximalSubmodule, Submodule.mem_pi] + intro σ _ + rcases (mem_chosenBaseUniformizerPowSubmodule_iff + (K := K) (L := L) 1 (chosenNormalBasisIntegerLattice K L) (x : L)).1 hx with + ⟨z, hz, hzx⟩ + let zM : chosenNormalBasisIntegerLattice K L := ⟨z, hz⟩ + have hx_eq : x = chosenIntegerRingUniformizer K • zM := by + apply Subtype.ext + simpa [Algebra.smul_def, zM] using hzx.symm + rw [chosenIntegerRingUniformizer_maximalIdeal_eq, + Ideal.mem_span_singleton'] + refine ⟨(chosenNormalBasisIntegerLatticeBasis K L).equivFun zM σ, ?_⟩ + rw [hx_eq] + simp [mul_comm] + · intro hf + have hf' : ∀ σ : Gal(L/K), + ∃ c : 𝒪[K], c * chosenIntegerRingUniformizer K = f σ := by + intro σ + have hσ := (Submodule.mem_pi.mp hf) σ (Set.mem_univ σ) + rw [chosenIntegerRingUniformizer_maximalIdeal_eq, + Ideal.mem_span_singleton'] at hσ + exact hσ + let c : Gal(L/K) → 𝒪[K] := fun σ => Classical.choose (hf' σ) + have hc (σ : Gal(L/K)) : + c σ * chosenIntegerRingUniformizer K = f σ := + Classical.choose_spec (hf' σ) + let z : chosenNormalBasisIntegerLattice K L := + (chosenNormalBasisIntegerLatticeBasis K L).equivFun.symm c + let x : chosenNormalBasisIntegerLattice K L := + chosenIntegerRingUniformizer K • z + have hx : x ∈ chosenNormalBasisIntegerLatticeUniformizerSubmodule K L := by + refine (mem_chosenBaseUniformizerPowSubmodule_iff + (K := K) (L := L) 1 (chosenNormalBasisIntegerLattice K L) (x : L)).2 + ⟨z, z.2, ?_⟩ + simp [x, Algebra.smul_def] + refine ⟨x, hx, ?_⟩ + funext σ + have hzcoord : + (chosenNormalBasisIntegerLatticeBasis K L).equivFun z = c := + (chosenNormalBasisIntegerLatticeBasis K L).equivFun.apply_symm_apply c + calc + (chosenNormalBasisIntegerLatticeBasis K L).equivFun x σ = + chosenIntegerRingUniformizer K * + (chosenNormalBasisIntegerLatticeBasis K L).equivFun z σ := by + simp [x] + _ = chosenIntegerRingUniformizer K * c σ := by rw [hzcoord] + _ = f σ := by rw [mul_comm, hc] + +/-- Normal-basis coordinates identify `M / π_K M` with the coordinatewise +maximal-ideal quotient. -/ +noncomputable def chosenNormalBasisIntegerLatticeQuotCoordinateQuotLinearEquiv : + (chosenNormalBasisIntegerLattice K L ⧸ + chosenNormalBasisIntegerLatticeUniformizerSubmodule K L) ≃ₗ[𝒪[K]] + ((Gal(L/K) → 𝒪[K]) ⧸ chosenNormalBasisCoordinateMaximalSubmodule K L) := + Submodule.Quotient.equiv + (chosenNormalBasisIntegerLatticeUniformizerSubmodule K L) + (chosenNormalBasisCoordinateMaximalSubmodule K L) + (chosenNormalBasisIntegerLatticeBasis K L).equivFun + (chosenNormalBasisIntegerLatticeUniformizerSubmodule_map_equivFun K L) + +/-- Quotienting coordinate functions by the pointwise maximal ideal is the +function space with values in `𝒪_K / 𝓂_K`. -/ +noncomputable def chosenNormalBasisCoordinateQuotPiLinearEquiv : + ((Gal(L/K) → 𝒪[K]) ⧸ chosenNormalBasisCoordinateMaximalSubmodule K L) ≃ₗ[𝒪[K]] + (Gal(L/K) → (𝒪[K] ⧸ (𝓂[K] : Ideal 𝒪[K]))) := by + classical + exact Submodule.quotientPi (fun _ : Gal(L/K) => (𝓂[K] : Ideal 𝒪[K])) + +omit [IsGalois K L] in +/-- The coordinate quotient equivalence sends a representative to its pointwise residue classes. -/ +@[simp] +theorem chosenNormalBasisCoordinateQuotPiLinearEquiv_mk + (f : Gal(L/K) → 𝒪[K]) : + chosenNormalBasisCoordinateQuotPiLinearEquiv K L + (Submodule.Quotient.mk f) = + fun σ : Gal(L/K) => Submodule.Quotient.mk (f σ) := + rfl + +/-- Apply `𝒪_K / 𝓂_K ≃ 𝓀_K` pointwise and reverse the Galois index. The +inverse index converts the natural left-regular coordinate rule into the +right-regular convention used in the Herbrand calculation. -/ +def chosenNormalBasisPiResidueInverseIndexAddEquiv : + (Gal(L/K) → (𝒪[K] ⧸ (𝓂[K] : Ideal 𝒪[K]))) ≃+ + (Gal(L/K) → 𝓀[K]) where + toFun f σ := integerRingModMaximalIdealAddEquivResidue K (f σ⁻¹) + invFun f σ := (integerRingModMaximalIdealAddEquivResidue K).symm (f σ⁻¹) + left_inv := by + intro f + funext σ + simp + right_inv := by + intro f + funext σ + simp + map_add' := by + intro f g + funext σ + simp + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- The inverse-index equivalence evaluates a residue function at the inverse Galois element. -/ +@[simp] +theorem chosenNormalBasisPiResidueInverseIndexAddEquiv_apply + (f : Gal(L/K) → (𝒪[K] ⧸ (𝓂[K] : Ideal 𝒪[K]))) + (σ : Gal(L/K)) : + chosenNormalBasisPiResidueInverseIndexAddEquiv K L f σ = + integerRingModMaximalIdealAddEquivResidue K (f σ⁻¹) := + rfl + +/-- The honest additive normal-basis model of the lattice graded piece +`π_K^n M / π_K^(n+1) M` as the right-regular function module over the residue +field. -/ +noncomputable def chosenNormalBasisLatticeSuccQuotRightRegularAddEquiv (n : Nat) : + chosenNormalBasisLatticeSuccQuot K L n ≃+ (Gal(L/K) → 𝓀[K]) := + (chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv K L n).toAddEquiv.trans + ((chosenNormalBasisIntegerLatticeQuotCoordinateQuotLinearEquiv K L).toAddEquiv.trans + ((chosenNormalBasisCoordinateQuotPiLinearEquiv K L).toAddEquiv.trans + (chosenNormalBasisPiResidueInverseIndexAddEquiv K L))) + +/-- Computes right-regular residue coordinates of a scaled lattice representative. -/ +@[simp] +theorem chosenNormalBasisLatticeSuccQuotRightRegularAddEquiv_mk_mulPow + (n : Nat) (x : chosenNormalBasisIntegerLattice K L) (σ : Gal(L/K)) : + chosenNormalBasisLatticeSuccQuotRightRegularAddEquiv K L n + (chosenNormalBasisLatticeSuccQuotMk K L n + (chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n x)) σ = + IsLocalRing.residue 𝒪[K] + ((chosenNormalBasisIntegerLatticeBasis K L).equivFun x σ⁻¹) := by + rw [chosenNormalBasisLatticeSuccQuotRightRegularAddEquiv] + simp only [chosenNormalBasisIntegerLatticeQuotCoordinateQuotLinearEquiv, + chosenNormalBasisCoordinateQuotPiLinearEquiv, chosenNormalBasisPiResidueInverseIndexAddEquiv, + AddEquiv.trans_apply, AddEquiv.coe_mk, AddHom.toFun_eq_coe, LinearMap.coe_toAddHom, + LinearEquiv.coe_coe, LinearEquiv.invFun_eq_symm, Equiv.coe_fn_mk, + chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv_mk_mulPow, + Submodule.Quotient.equiv_symm, Submodule.Quotient.equiv_apply, Submodule.mapQ_apply, + Module.Basis.equivFun_apply] + change integerRingModMaximalIdealAddEquivResidue K + (Ideal.Quotient.mk (𝓂[K] : Ideal 𝒪[K]) + ((chosenNormalBasisIntegerLatticeBasis K L).equivFun x σ⁻¹)) = _ + rfl + +/-! ### The actual `Gal(L / K)` action and right-regular equivariance -/ + +/-- The actual Galois action restricted to the stable normal-basis lattice. -/ +def galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv (τ : Gal(L/K)) : + chosenNormalBasisIntegerLattice K L ≃ₗ[𝒪[K]] + chosenNormalBasisIntegerLattice K L where + toFun x := ⟨τ (x : L), + galoisGroup_apply_mem_chosenNormalBasisIntegerLattice (K := K) (L := L) τ x.2⟩ + invFun x := ⟨τ⁻¹ (x : L), + galoisGroup_apply_mem_chosenNormalBasisIntegerLattice (K := K) (L := L) τ⁻¹ x.2⟩ + left_inv x := by + apply Subtype.ext + exact τ.symm_apply_apply (x : L) + right_inv x := by + apply Subtype.ext + exact τ.apply_symm_apply (x : L) + map_add' x y := by + apply Subtype.ext + exact map_add τ (x : L) (y : L) + map_smul' a x := by + apply Subtype.ext + have ha : τ (algebraMap 𝒪[K] L a) = algebraMap 𝒪[K] L a := by + change τ (algebraMap K L (a : K)) = algebraMap K L (a : K) + exact τ.commutes (a : K) + change τ (((a • x : chosenNormalBasisIntegerLattice K L) : L)) = + ((a • (⟨τ (x : L), galoisGroup_apply_mem_chosenNormalBasisIntegerLattice + (K := K) (L := L) τ x.2⟩ : chosenNormalBasisIntegerLattice K L) : + chosenNormalBasisIntegerLattice K L) : L) + rw [Submodule.coe_smul, Submodule.coe_smul] + rw [Algebra.smul_def, Algebra.smul_def] + rw [map_mul, ha] + +omit [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +/-- The restricted lattice equivalence agrees with the ambient Galois action. -/ +@[simp] +theorem galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv_apply_coe + (τ : Gal(L/K)) (x : chosenNormalBasisIntegerLattice K L) : + ((galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv K L τ x : + chosenNormalBasisIntegerLattice K L) : L) = τ (x : L) := + rfl + +omit [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +/-- The identity Galois element acts trivially on the normal-basis lattice. -/ +@[simp] +theorem galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv_one_apply + (x : chosenNormalBasisIntegerLattice K L) : + galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv K L 1 x = x := by + apply Subtype.ext + rfl + +omit [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +/-- Multiplication in the Galois group acts by composition on the normal-basis lattice. -/ +@[simp] +theorem galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv_mul_apply + (τ υ : Gal(L/K)) (x : chosenNormalBasisIntegerLattice K L) : + galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv K L (τ * υ) x = + galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv K L τ + (galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv K L υ x) := by + apply Subtype.ext + rfl + +omit [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +/-- Normal-basis lattice coordinates obey the left-regular rule before the +inverse-index reindexing. -/ +theorem chosenNormalBasisIntegerLatticeBasis_equivFun_galoisGroup + (τ σ : Gal(L/K)) (x : chosenNormalBasisIntegerLattice K L) : + (chosenNormalBasisIntegerLatticeBasis K L).equivFun + (galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv K L τ x) σ = + (chosenNormalBasisIntegerLatticeBasis K L).equivFun x (τ⁻¹ * σ) := by + let b := chosenNormalBasisIntegerLatticeBasis K L + let f := galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv K L τ + let e : Gal(L/K) ≃ Gal(L/K) := Equiv.mulLeft τ⁻¹ + have hbmap : b.map f = b.reindex e := by + ext ρ + rw [Module.Basis.map_apply, Module.Basis.reindex_apply] + have he : e.symm ρ = τ * ρ := by + simp [e] + rw [he] + simp only [f, b, galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv_apply_coe, + chosenNormalBasisIntegerLatticeBasis_apply] + rw [IsGalois.normalBasis_apply (K := K) (L := L) (τ * ρ), + IsGalois.normalBasis_apply (K := K) (L := L) ρ] + rfl + have hcoord (ρ : Gal(L/K)) : + b.equivFun (f x) (τ * ρ) = b.equivFun x ρ := by + calc + b.equivFun (f x) (τ * ρ) = + (b.reindex e).equivFun (f x) ρ := by + rw [Module.Basis.equivFun_apply, Module.Basis.equivFun_apply, + Module.Basis.repr_reindex_apply] + simp [e] + _ = (b.map f).equivFun (f x) ρ := by rw [hbmap] + _ = b.equivFun x ρ := by + rw [Module.Basis.map_equivFun] + simp [f] + simpa using hcoord (τ⁻¹ * σ) + +/-- The lattice uniformizer submodule is stable under every Galois automorphism. -/ +theorem chosenNormalBasisIntegerLatticeUniformizerSubmodule_map_galoisGroup + (τ : Gal(L/K)) : + (chosenNormalBasisIntegerLatticeUniformizerSubmodule K L).map + (galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv K L τ : + chosenNormalBasisIntegerLattice K L →ₗ[𝒪[K]] + chosenNormalBasisIntegerLattice K L) = + chosenNormalBasisIntegerLatticeUniformizerSubmodule K L := by + ext x + constructor + · rintro ⟨y, hy, rfl⟩ + rcases (mem_chosenBaseUniformizerPowSubmodule_iff + (K := K) (L := L) 1 (chosenNormalBasisIntegerLattice K L) (y : L)).1 hy with + ⟨z, hz, hzy⟩ + refine (mem_chosenBaseUniformizerPowSubmodule_iff + (K := K) (L := L) 1 (chosenNormalBasisIntegerLattice K L) _).2 + ⟨τ z, galoisGroup_apply_mem_chosenNormalBasisIntegerLattice + (K := K) (L := L) τ hz, ?_⟩ + change algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ 1) * τ z = τ (y : L) + rw [← hzy, map_mul] + congr 1 + change algebraMap K L + ((chosenIntegerRingUniformizer K ^ 1 : 𝒪[K]) : K) = + τ (algebraMap K L + ((chosenIntegerRingUniformizer K ^ 1 : 𝒪[K]) : K)) + exact (τ.commutes _).symm + · intro hx + let y := galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv K L τ⁻¹ x + have hy : y ∈ chosenNormalBasisIntegerLatticeUniformizerSubmodule K L := by + rcases (mem_chosenBaseUniformizerPowSubmodule_iff + (K := K) (L := L) 1 (chosenNormalBasisIntegerLattice K L) (x : L)).1 hx with + ⟨z, hz, hzx⟩ + refine (mem_chosenBaseUniformizerPowSubmodule_iff + (K := K) (L := L) 1 (chosenNormalBasisIntegerLattice K L) (y : L)).2 + ⟨τ⁻¹ z, galoisGroup_apply_mem_chosenNormalBasisIntegerLattice + (K := K) (L := L) τ⁻¹ hz, ?_⟩ + change algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ 1) * τ⁻¹ z = + τ⁻¹ (x : L) + rw [← hzx, map_mul] + congr 1 + change algebraMap K L + ((chosenIntegerRingUniformizer K ^ 1 : 𝒪[K]) : K) = + τ⁻¹ (algebraMap K L + ((chosenIntegerRingUniformizer K ^ 1 : 𝒪[K]) : K)) + exact ((τ⁻¹).commutes _).symm + refine ⟨y, hy, ?_⟩ + apply Subtype.ext + exact τ.apply_symm_apply (x : L) + +/-- The actual Galois action on the fixed quotient `M / π_K M`. -/ +noncomputable def galoisGroupChosenNormalBasisIntegerLatticeQuotLinearEquiv + (τ : Gal(L/K)) : + (chosenNormalBasisIntegerLattice K L ⧸ + chosenNormalBasisIntegerLatticeUniformizerSubmodule K L) ≃ₗ[𝒪[K]] + (chosenNormalBasisIntegerLattice K L ⧸ + chosenNormalBasisIntegerLatticeUniformizerSubmodule K L) := + Submodule.Quotient.equiv + (chosenNormalBasisIntegerLatticeUniformizerSubmodule K L) + (chosenNormalBasisIntegerLatticeUniformizerSubmodule K L) + (galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv K L τ) + (chosenNormalBasisIntegerLatticeUniformizerSubmodule_map_galoisGroup K L τ) + +/-- The induced quotient action sends a class to the class of its Galois transform. -/ +@[simp] +theorem galoisGroupChosenNormalBasisIntegerLatticeQuotLinearEquiv_mk + (τ : Gal(L/K)) (x : chosenNormalBasisIntegerLattice K L) : + galoisGroupChosenNormalBasisIntegerLatticeQuotLinearEquiv K L τ + (Submodule.Quotient.mk x) = + Submodule.Quotient.mk + (galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv K L τ x) := + rfl + +/-- The actual Galois action on `π_K^n M / π_K^(n+1) M`, transported through +removal of the common factor `π_K^n`. -/ +noncomputable def galoisGroupChosenNormalBasisLatticeSuccQuotAddEquiv + (n : Nat) (τ : Gal(L/K)) : + chosenNormalBasisLatticeSuccQuot K L n ≃+ + chosenNormalBasisLatticeSuccQuot K L n := + (chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv K L n).toAddEquiv.trans + ((galoisGroupChosenNormalBasisIntegerLatticeQuotLinearEquiv K L τ).toAddEquiv.trans + (chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv K L n).symm.toAddEquiv) + +/-- The transported Galois action transforms the integral part of a scaled representative. -/ +@[simp] +theorem galoisGroupChosenNormalBasisLatticeSuccQuotAddEquiv_mk_mulPow + (n : Nat) (τ : Gal(L/K)) (x : chosenNormalBasisIntegerLattice K L) : + galoisGroupChosenNormalBasisLatticeSuccQuotAddEquiv K L n τ + (chosenNormalBasisLatticeSuccQuotMk K L n + (chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n x)) = + chosenNormalBasisLatticeSuccQuotMk K L n + (chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n + (galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv K L τ x)) := by + let e := chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv K L n + change e.symm + (galoisGroupChosenNormalBasisIntegerLatticeQuotLinearEquiv K L τ + (e (chosenNormalBasisLatticeSuccQuotMk K L n + (chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n x)))) = _ + rw [chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv_mk_mulPow, + galoisGroupChosenNormalBasisIntegerLatticeQuotLinearEquiv_mk] + apply e.injective + rw [LinearEquiv.apply_symm_apply, + chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv_mk_mulPow] + +/-- Removing the common uniformizer power intertwines the two quotient Galois actions. -/ +@[simp] +theorem chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv_galoisGroup + (n : Nat) (τ : Gal(L/K)) + (q : chosenNormalBasisLatticeSuccQuot K L n) : + chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv K L n + (galoisGroupChosenNormalBasisLatticeSuccQuotAddEquiv K L n τ q) = + galoisGroupChosenNormalBasisIntegerLatticeQuotLinearEquiv K L τ + (chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv K L n q) := by + let e := chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv K L n + change e (e.symm + (galoisGroupChosenNormalBasisIntegerLatticeQuotLinearEquiv K L τ (e q))) = _ + exact e.apply_symm_apply _ + +/-- On representatives, the transported action is multiplication by `π_K^n` +followed by the actual field automorphism. -/ +theorem chosenNormalBasisIntegerLatticeMulPowLinearEquiv_galoisGroup_apply_coe + (n : Nat) (τ : Gal(L/K)) (x : chosenNormalBasisIntegerLattice K L) : + ((chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n + (galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv K L τ x) : + chosenBaseUniformizerPowSubmodule K L n + (chosenNormalBasisIntegerLattice K L)) : L) = + τ ((chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n x : + chosenBaseUniformizerPowSubmodule K L n + (chosenNormalBasisIntegerLattice K L)) : L) := by + change algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * τ (x : L) = + τ (algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * (x : L)) + rw [map_mul] + congr 1 + change algebraMap K L ((chosenIntegerRingUniformizer K ^ n : 𝒪[K]) : K) = + τ (algebraMap K L ((chosenIntegerRingUniformizer K ^ n : 𝒪[K]) : K)) + exact (τ.commutes _).symm + +/-- The additive `Gal(L / K)`-action on the lattice graded piece induced by +the actual action on the extension field. -/ +@[implicit_reducible] +noncomputable def galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction + (n : Nat) : + DistribMulAction Gal(L/K) (chosenNormalBasisLatticeSuccQuot K L n) where + smul τ q := galoisGroupChosenNormalBasisLatticeSuccQuotAddEquiv K L n τ q + one_smul := by + intro q + change galoisGroupChosenNormalBasisLatticeSuccQuotAddEquiv K L n 1 q = q + let e := chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv K L n + apply e.injective + rw [chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv_galoisGroup] + refine Submodule.Quotient.induction_on + (chosenNormalBasisIntegerLatticeUniformizerSubmodule K L) (e q) ?_ + intro x + rw [galoisGroupChosenNormalBasisIntegerLatticeQuotLinearEquiv_mk, + galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv_one_apply] + mul_smul := by + intro τ υ q + change galoisGroupChosenNormalBasisLatticeSuccQuotAddEquiv K L n (τ * υ) q = + galoisGroupChosenNormalBasisLatticeSuccQuotAddEquiv K L n τ + (galoisGroupChosenNormalBasisLatticeSuccQuotAddEquiv K L n υ q) + let e := chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv K L n + apply e.injective + rw [chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv_galoisGroup, + chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv_galoisGroup, + chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv_galoisGroup] + refine Submodule.Quotient.induction_on + (chosenNormalBasisIntegerLatticeUniformizerSubmodule K L) (e q) ?_ + intro x + rw [galoisGroupChosenNormalBasisIntegerLatticeQuotLinearEquiv_mk, + galoisGroupChosenNormalBasisIntegerLatticeQuotLinearEquiv_mk, + galoisGroupChosenNormalBasisIntegerLatticeQuotLinearEquiv_mk, + galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv_mul_apply] + smul_zero := by + intro τ + exact (galoisGroupChosenNormalBasisLatticeSuccQuotAddEquiv K L n τ).map_zero + smul_add := by + intro τ q r + exact (galoisGroupChosenNormalBasisLatticeSuccQuotAddEquiv K L n τ).map_add q r + +/-- The graded-piece scalar action applies the Galois automorphism to a scaled representative. -/ +@[simp] +theorem galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction_smul_mk_mulPow + (n : Nat) (τ : Gal(L/K)) (x : chosenNormalBasisIntegerLattice K L) : + letI := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L n + τ • chosenNormalBasisLatticeSuccQuotMk K L n + (chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n x) = + chosenNormalBasisLatticeSuccQuotMk K L n + (chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n + (galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv K L τ x)) := + galoisGroupChosenNormalBasisLatticeSuccQuotAddEquiv_mk_mulPow K L n τ x + +/-- The inverse-indexed residue coordinates intertwine the Galois +action with the pointwise right-regular action. -/ +theorem chosenNormalBasisLatticeSuccQuotRightRegularAddEquiv_commutes + (n : Nat) (τ : Gal(L/K)) + (q : chosenNormalBasisLatticeSuccQuot K L n) (σ : Gal(L/K)) : + letI := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L n + chosenNormalBasisLatticeSuccQuotRightRegularAddEquiv K L n (τ • q) σ = + chosenNormalBasisLatticeSuccQuotRightRegularAddEquiv K L n q (σ * τ) := by + let := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L n + refine chosenNormalBasisLatticeSuccQuot.inductionOn K L n + (motive := fun q => + chosenNormalBasisLatticeSuccQuotRightRegularAddEquiv K L n (τ • q) σ = + chosenNormalBasisLatticeSuccQuotRightRegularAddEquiv K L n q (σ * τ)) + q ?_ + intro z + let x : chosenNormalBasisIntegerLattice K L := + (chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n).symm z + have hz : chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n x = z := + (chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n).apply_symm_apply z + rw [← hz, + galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction_smul_mk_mulPow, + chosenNormalBasisLatticeSuccQuotRightRegularAddEquiv_mk_mulPow, + chosenNormalBasisLatticeSuccQuotRightRegularAddEquiv_mk_mulPow, + chosenNormalBasisIntegerLatticeBasis_equivFun_galoisGroup] + congr 1 + +/-- Herbrand `H⁰` vanishes on every additive normal-basis lattice graded +piece. -/ +theorem chosenNormalBasisLatticeSuccQuot_herbrandH0_subsingleton (n : Nat) : + letI := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L n + letI := + multiplicativeMulDistribMulActionOfDistribMulAction + Gal(L/K) (chosenNormalBasisLatticeSuccQuot K L n) + Subsingleton (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 + Gal(L/K) (Multiplicative (chosenNormalBasisLatticeSuccQuot K L n))) := by + let := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L n + exact + herbrandH0_subsingleton_of_addEquiv_rightRegularFunction + (G := Gal(L/K)) (M := chosenNormalBasisLatticeSuccQuot K L n) (D := 𝓀[K]) + (chosenNormalBasisLatticeSuccQuotRightRegularAddEquiv K L n) + (chosenNormalBasisLatticeSuccQuotRightRegularAddEquiv_commutes K L n) + +/-- Cyclic Herbrand `H⁻¹` vanishes on every additive normal-basis lattice +graded piece. -/ +theorem chosenNormalBasisLatticeSuccQuot_herbrandHMinusOne_subsingleton + (n : Nat) (τ : Gal(L/K)) + (hgen : ∀ g : Gal(L/K), g ∈ Subgroup.zpowers τ) : + letI := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L n + letI := + multiplicativeMulDistribMulActionOfDistribMulAction + Gal(L/K) (chosenNormalBasisLatticeSuccQuot K L n) + Subsingleton (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne + Gal(L/K) (Multiplicative (chosenNormalBasisLatticeSuccQuot K L n)) τ) := by + let := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L n + exact + herbrandHMinusOne_subsingleton_of_addEquiv_rightRegularFunction + (G := Gal(L/K)) (M := chosenNormalBasisLatticeSuccQuot K L n) (D := 𝓀[K]) + τ hgen (chosenNormalBasisLatticeSuccQuotRightRegularAddEquiv K L n) + (chosenNormalBasisLatticeSuccQuotRightRegularAddEquiv_commutes K L n) + +end GradedCoordinates + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisCohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisCohomology.lean new file mode 100644 index 0000000000..f4050bb07e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisCohomology.lean @@ -0,0 +1,118 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisRecursiveLifting + +/-! # Normal Basis Cohomology -/ + +@[expose] public section +namespace LocalClassFieldTheory +open CyclicCohomology + +open LocalFieldTheory + +/-! +# Low-degree cohomology of a deep normal-basis unit subgroup + +The recursive norm and coboundary constructions are converted here into the +actual quotient statements `H⁰(G,V)=H⁻¹(G,V)=1` used in the local class-field-axiom theorem. +-/ + +noncomputable +section + +universe u + +open scoped ValuativeRel +open IsNonarchimedeanLocalField +open CyclicCohomology.ProfiniteCohomology.Herbrand + +variable (K L : Type u) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + +/-- The local class-field-axiom theorem: for every sufficiently deep chosen normal-basis subgroup +`V`, both low-degree Herbrand quotients are trivial. -/ +theorem exists_chosenNormalBasisPrincipalUnit_herbrand_subsingleton + (g : Gal(L/K)) + (hgen : ∀ sigma : Gal(L/K), sigma ∈ Subgroup.zpowers g) : + ∃ c : Nat, ∀ n : Nat, c ≤ n → + ∀ (V : Subgroup 𝒪[L]ˣ) + (hV : (V : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n), + letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction + K L n V hV + Subsingleton (HerbrandH0 (Gal(L/K)) V) ∧ + Subsingleton (HerbrandHMinusOne (Gal(L/K)) V g) := by + rcases exists_chosenNormalBasisPrincipalUnit_fixed_is_tateNorm + (K := K) (L := L) with ⟨c0, hc0⟩ + rcases exists_chosenNormalBasisPrincipalUnit_normOne_is_sigmaMinusOne + (K := K) (L := L) g hgen with ⟨cm, hcm⟩ + refine ⟨max c0 cm, ?_⟩ + intro n hn V hV + have hc0n : c0 ≤ n := le_trans (le_max_left c0 cm) hn + have hcmn : cm ≤ n := le_trans (le_max_right c0 cm) hn + let := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction + K L n V hV + have hfixed : fixedSubgroup (Gal(L/K)) V ≤ + tateNormSubgroup (Gal(L/K)) V := by + intro a ha + have haSet : ((a : V) : 𝒪[L]ˣ) ∈ (V : Set 𝒪[L]ˣ) := (a : V).2 + have haLevel : ((a : V) : 𝒪[L]ˣ) ∈ + chosenNormalBasisPrincipalUnitSet K L n := by + rw [← hV] + exact haSet + have haFixed : ∀ sigma : Gal(L/K), + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + sigma • ((a : V) : 𝒪[L]ˣ) = ((a : V) : 𝒪[L]ˣ) := by + intro sigma + exact congrArg (fun z : V => (z : 𝒪[L]ˣ)) (ha sigma) + rcases hc0 n hc0n ((a : V) : 𝒪[L]ˣ) haLevel haFixed with + ⟨b, hb, hab⟩ + let bv : V := ⟨b, by + change b ∈ (V : Set 𝒪[L]ˣ) + rw [hV] + exact hb⟩ + refine ⟨bv, ?_⟩ + apply Subtype.ext + rw [tateNormHom_apply, + chosenNormalBasisPrincipalUnitSubgroup_tateNorm_coe K L n V hV] + exact hab.symm + have hkernel : normKernelSubgroup (Gal(L/K)) V ≤ + augmentationSubgroup (Gal(L/K)) V g := by + intro a ha + have haLevel : ((a : V) : 𝒪[L]ˣ) ∈ + chosenNormalBasisPrincipalUnitSet K L n := by + rw [← hV] + exact (a : V).2 + have haNorm : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + tateNorm (Gal(L/K)) 𝒪[L]ˣ ((a : V) : 𝒪[L]ˣ) = 1 := by + rw [← chosenNormalBasisPrincipalUnitSubgroup_tateNorm_coe K L n V hV] + exact congrArg (fun z : V => (z : 𝒪[L]ˣ)) ha + rcases hcm n hcmn ((a : V) : 𝒪[L]ˣ) haLevel haNorm with + ⟨b, hb, hab⟩ + let bv : V := ⟨b, by + change b ∈ (V : Set 𝒪[L]ˣ) + rw [hV] + exact hb⟩ + refine ⟨bv, ?_⟩ + apply Subtype.ext + rw [sigmaMinusOneHom_apply, + chosenNormalBasisPrincipalUnitSubgroup_sigmaMinusOne_coe K L n V hV] + exact hab.symm + exact ⟨ + herbrandH0_subsingleton_of_fixed_le_tateNormSubgroup hfixed, + herbrandHMinusOne_subsingleton_of_normKernel_le_augmentationSubgroup + g hkernel⟩ + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisFiniteQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisFiniteQuotient.lean new file mode 100644 index 0000000000..2de2fd276a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisFiniteQuotient.lean @@ -0,0 +1,117 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGaloisAction +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientTower +/-! Provides the public declarations in the + `LocalClassFieldTheory.ClassFormation.NormalBasisFiniteQuotient` Lean module. -/ + +@[expose] public section + +namespace LocalClassFieldTheory +open LocalFieldTheory + +open CyclicCohomology + +noncomputable +section + +universe u + +open scoped ValuativeRel +open Filter IsNonarchimedeanLocalField + +variable (K L : Type u) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + +/-- Since the normal-basis lattices `π_K^n M` are open for high `n`, each +corresponding `V^n` contains an ordinary principal-unit subgroup. -/ +theorem exists_principalUnits_le_chosenNormalBasisPrincipalUnitSet : + ∃ c : Nat, ∀ n : Nat, c ≤ n → + ∃ m : Nat, (principalUnits L m : Set 𝒪[L]ˣ) ⊆ + chosenNormalBasisPrincipalUnitSet K L n := by + rcases exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_mem_nhds_zero + (K := K) (L := L) with ⟨c, hc⟩ + refine ⟨c, ?_⟩ + intro n hcn + let S : Set L := + (chosenBaseUniformizerPowSubmodule K L n + (chosenNormalBasisIntegerLattice K L) : Set L) + have hS : S ∈ nhds (0 : L) := hc n hcn + have hSO : {x : 𝒪[L] | (x : L) ∈ S} ∈ nhds (0 : 𝒪[L]) := by + exact continuous_subtype_val.continuousAt hS + rcases exists_maximalIdeal_pow_subset_nhds_zero L + {x : 𝒪[L] | (x : L) ∈ S} hSO with ⟨m, hm⟩ + refine ⟨m, ?_⟩ + intro a ha + rw [mem_chosenNormalBasisPrincipalUnitSet_iff] + change + (((((a : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L)) ∈ S + exact hm ((mem_principalUnits_iff L a m).1 ha) + +/-- The canonical map from `𝒪_Lˣ/U_L^m` onto `𝒪_Lˣ/V` whenever +`U_L^m ≤ V`. -/ +def integerUnitsModPrincipalUnitsToSubgroupQuotient + (m : Nat) (V : Subgroup 𝒪[L]ˣ) (h : principalUnits L m ≤ V) : + IntegerUnitsModPrincipalUnitsAtLevel L m →* (𝒪[L]ˣ ⧸ V) := + integerUnitsModPrincipalUnitsAtLevelLift m (QuotientGroup.mk' V) + (by + intro a ha + rw [MonoidHom.mem_ker] + change (QuotientGroup.mk a : 𝒪[L]ˣ ⧸ V) = 1 + exact (QuotientGroup.eq_one_iff a).2 (h ha)) + +omit [TopologicalSpace L] [IsNonarchimedeanLocalField L] in +/-- States the theorem `integerUnitsModPrincipalUnitsToSubgroupQuotient_surjective`. -/ +theorem integerUnitsModPrincipalUnitsToSubgroupQuotient_surjective + (m : Nat) (V : Subgroup 𝒪[L]ˣ) (h : principalUnits L m ≤ V) : + Function.Surjective + (integerUnitsModPrincipalUnitsToSubgroupQuotient L m V h) := by + intro q + refine Quotient.inductionOn' q ?_ + intro a + refine ⟨integerUnitsModPrincipalUnitsAtLevelMk L m a, ?_⟩ + rfl + +/-- A quotient by a subgroup containing an ordinary principal-unit level is +finite. -/ +theorem finite_chosenNormalBasisIntegerUnitsQuotient_of_principalUnits_le + (m : Nat) (V : Subgroup 𝒪[L]ˣ) (h : principalUnits L m ≤ V) : + Finite (𝒪[L]ˣ ⧸ V) := by + let : Finite (IntegerUnitsModPrincipalUnitsAtLevel L m) := + integerUnitsModPrincipalUnitsAtLevel_finite_of_isNonarchimedeanLocalField L m + exact Finite.of_surjective + (integerUnitsModPrincipalUnitsToSubgroupQuotient L m V h) + (integerUnitsModPrincipalUnitsToSubgroupQuotient_surjective L m V h) + +/-- Finite-index boundary for the local class-field axiom: for sufficiently large `n`, every +actual subgroup with carrier `V^n` has finite quotient in `𝒪_Lˣ`. -/ +theorem exists_finite_chosenNormalBasisIntegerUnitsQuotient : + ∃ c : Nat, ∀ n : Nat, c ≤ n → + ∀ (V : Subgroup 𝒪[L]ˣ), + (V : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n → + Finite (𝒪[L]ˣ ⧸ V) := by + rcases exists_principalUnits_le_chosenNormalBasisPrincipalUnitSet + (K := K) (L := L) with ⟨c, hc⟩ + refine ⟨c, ?_⟩ + intro n hcn V hV + rcases hc n hcn with ⟨m, hm⟩ + have hle : principalUnits L m ≤ V := by + intro a ha + change (a : 𝒪[L]ˣ) ∈ (V : Set 𝒪[L]ˣ) + rw [hV] + exact hm ha + exact finite_chosenNormalBasisIntegerUnitsQuotient_of_principalUnits_le + (L := L) m V hle + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean new file mode 100644 index 0000000000..e0d111dd4c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean @@ -0,0 +1,297 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLattice +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation +public import Mathlib.GroupTheory.GroupAction.Quotient +/-! Provides the public declarations in the + `LocalClassFieldTheory.ClassFormation.NormalBasisGaloisAction` Lean module. -/ + +@[expose] public section + +namespace LocalClassFieldTheory + +open LocalFieldTheory + +open CyclicCohomology + +noncomputable +section + +universe uG uA u + +open scoped ValuativeRel +open IsNonarchimedeanLocalField +open CyclicCohomology.ProfiniteCohomology.Herbrand + +/-- Restrict a multiplicative group action to an invariant subgroup. This +is the honest action used below on the standard subgroups `V^n`. -/ +@[implicit_reducible] +def subgroupMulDistribMulActionOfStable + (G : Type uG) (A : Type uA) [Group G] [CommGroup A] + [MulDistribMulAction G A] (V : Subgroup A) + (hstable : ∀ (g : G) (a : A), a ∈ V → g • a ∈ V) : + MulDistribMulAction G V where + smul g a := ⟨g • (a : A), hstable g a a.2⟩ + one_smul := by + intro a + apply Subtype.ext + exact one_smul G (a : A) + mul_smul := by + intro g h a + apply Subtype.ext + exact mul_smul g h (a : A) + smul_mul := by + intro g a b + apply Subtype.ext + exact MulDistribMulAction.smul_mul g (a : A) (b : A) + smul_one := by + intro g + apply Subtype.ext + exact MulDistribMulAction.smul_one g + +/-- An invariant subgroup satisfies the relation-preservation condition +needed for the action on its quotient. -/ +theorem quotientActionOfSubgroupStable + (G : Type uG) (A : Type uA) [Group G] [CommGroup A] + [MulDistribMulAction G A] (V : Subgroup A) + (hstable : ∀ (g : G) (a : A), a ∈ V → g • a ∈ V) : + MulAction.QuotientAction G V where + inv_mul_mem g a b hab := by + have hsmul : g • (a⁻¹ * b) ∈ V := hstable g (a⁻¹ * b) hab + simpa [MulDistribMulAction.smul_mul, map_inv] using hsmul + +/-- Descend an action by group automorphisms to the quotient by an invariant +subgroup. -/ +@[implicit_reducible] +def quotientMulDistribMulActionOfSubgroupStable + (G : Type uG) (A : Type uA) [Group G] [CommGroup A] + [MulDistribMulAction G A] (V : Subgroup A) + (hstable : ∀ (g : G) (a : A), a ∈ V → g • a ∈ V) : + MulDistribMulAction G (A ⧸ V) := by + letI : MulAction.QuotientAction G V := + quotientActionOfSubgroupStable G A V hstable + exact + { smul := (· • ·) + one_smul := one_smul G + mul_smul := mul_smul + smul_mul := by + intro g x y + refine Quotient.inductionOn₂' x y ?_ + intro a b + exact congrArg QuotientGroup.mk + (MulDistribMulAction.smul_mul g a b) + smul_one := by + intro g + exact congrArg QuotientGroup.mk + (MulDistribMulAction.smul_one g) } + +variable (K L : Type u) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + +/-- Every dilate `π_K^n M` of the normal-basis lattice is stable under the +actual action of `Gal(L / K)`. -/ +theorem galoisGroup_apply_mem_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice + (n : Nat) (sigma : Gal(L/K)) {x : L} + (hx : x ∈ chosenBaseUniformizerPowSubmodule K L n + (chosenNormalBasisIntegerLattice K L)) : + sigma x ∈ chosenBaseUniformizerPowSubmodule K L n + (chosenNormalBasisIntegerLattice K L) := by + rcases (mem_chosenBaseUniformizerPowSubmodule_iff + (K := K) (L := L) n (chosenNormalBasisIntegerLattice K L) x).1 hx with + ⟨y, hy, rfl⟩ + refine (mem_chosenBaseUniformizerPowSubmodule_iff + (K := K) (L := L) n (chosenNormalBasisIntegerLattice K L) _).2 + ⟨sigma y, + galoisGroup_apply_mem_chosenNormalBasisIntegerLattice + (K := K) (L := L) sigma hy, ?_⟩ + rw [map_mul] + change + algebraMap K L (((chosenIntegerRingUniformizer K ^ n : 𝒪[K]) : K)) * + sigma y = + sigma (algebraMap K L + (((chosenIntegerRingUniformizer K ^ n : 𝒪[K]) : K))) * sigma y + rw [sigma.commutes] + +variable [ValuativeRel L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + +/-- The actual integer-unit Galois action preserves each normal-basis +principal-unit set `V^n = 1 + π_K^n M`. -/ +theorem galoisGroup_smul_mem_chosenNormalBasisPrincipalUnitSet + (n : Nat) (sigma : Gal(L/K)) {a : 𝒪[L]ˣ} + (ha : a ∈ chosenNormalBasisPrincipalUnitSet K L n) : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + sigma • a ∈ chosenNormalBasisPrincipalUnitSet K L n := by + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + rw [mem_chosenNormalBasisPrincipalUnitSet_iff] at ha ⊢ + have hstable := + galoisGroup_apply_mem_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice + (K := K) (L := L) n sigma ha + simpa [galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure_smul, + map_sub, map_one] using hstable + +/-- The restricted actual Galois action on any subgroup whose carrier is +the standard `V^n`. -/ +@[implicit_reducible] +def chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction + (n : Nat) (V : Subgroup 𝒪[L]ˣ) + (hV : (V : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) : + MulDistribMulAction (Gal(L/K)) V := by + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + exact subgroupMulDistribMulActionOfStable (Gal(L/K)) 𝒪[L]ˣ V + (by + intro sigma a ha + change sigma • (a : 𝒪[L]ˣ) ∈ (V : Set 𝒪[L]ˣ) + rw [hV] + exact galoisGroup_smul_mem_chosenNormalBasisPrincipalUnitSet + (K := K) (L := L) n sigma (hV ▸ ha)) + +/-- The induced Galois action on the principal-unit subgroup agrees with the ambient action. -/ +@[simp] +theorem chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction_smul + (n : Nat) (V : Subgroup 𝒪[L]ˣ) + (hV : (V : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) + (sigma : Gal(L/K)) (a : V) : + letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV + ((sigma • a : V) : 𝒪[L]ˣ) = + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + sigma • (a : 𝒪[L]ˣ) := + rfl + +/-- Coercing the subgroup Tate norm gives the ambient product over the Galois group. -/ +@[simp] +theorem chosenNormalBasisPrincipalUnitSubgroup_tateNorm_coe + (n : Nat) (V : Subgroup 𝒪[L]ˣ) + (hV : (V : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) + (a : V) : + letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + ((tateNorm (Gal(L/K)) V a : V) : 𝒪[L]ˣ) = + tateNorm (Gal(L/K)) 𝒪[L]ˣ (a : 𝒪[L]ˣ) := by + let := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + unfold tateNorm + change V.subtype (∏ g : Gal(L/K), g • a) = + ∏ g : Gal(L/K), g • (a : 𝒪[L]ˣ) + rw [map_prod] + apply Finset.prod_congr rfl + intro g _hg + rfl + +/-- Coercion commutes with the `σ - 1` operation on the principal-unit subgroup. -/ +@[simp] +theorem chosenNormalBasisPrincipalUnitSubgroup_sigmaMinusOne_coe + (n : Nat) (V : Subgroup 𝒪[L]ˣ) + (hV : (V : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) + (sigma : Gal(L/K)) (a : V) : + letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + ((sigmaMinusOne (Gal(L/K)) V sigma a : V) : 𝒪[L]ˣ) = + sigmaMinusOne (Gal(L/K)) 𝒪[L]ˣ sigma (a : 𝒪[L]ˣ) := by + let := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + rfl + +/-- The quotient action on `𝒪_Lˣ / V^n`, descended from the actual integer-unit +Galois action. -/ +@[implicit_reducible] +def chosenNormalBasisIntegerUnitsQuotMulDistribMulAction + (n : Nat) (V : Subgroup 𝒪[L]ˣ) + (hV : (V : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) : + MulDistribMulAction (Gal(L/K)) (𝒪[L]ˣ ⧸ V) := by + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + exact quotientMulDistribMulActionOfSubgroupStable + (Gal(L/K)) 𝒪[L]ˣ V (by + intro sigma a ha + change a ∈ (V : Set 𝒪[L]ˣ) at ha + change sigma • a ∈ (V : Set 𝒪[L]ˣ) + rw [hV] at ha ⊢ + exact galoisGroup_smul_mem_chosenNormalBasisPrincipalUnitSet + (K := K) (L := L) n sigma ha) + +/-- Inclusion of a chosen normal-basis principal-unit subgroup into all +integer units. -/ +def chosenNormalBasisPrincipalUnitSubgroupInclusion + (V : Subgroup 𝒪[L]ˣ) : V →* 𝒪[L]ˣ := + V.subtype + +/-- The principal-unit subgroup inclusion returns the underlying integer unit. -/ +@[simp] +theorem chosenNormalBasisPrincipalUnitSubgroupInclusion_apply + (V : Subgroup 𝒪[L]ˣ) (a : V) : + chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) V a = a := + rfl + +/-- Projection of integer units to the quotient by `V^n`. -/ +def chosenNormalBasisIntegerUnitsQuotientMap + (V : Subgroup 𝒪[L]ˣ) : 𝒪[L]ˣ →* (𝒪[L]ˣ ⧸ V) := + QuotientGroup.mk' V + +/-- The integer-unit quotient map sends a unit to its quotient class. -/ +@[simp] +theorem chosenNormalBasisIntegerUnitsQuotientMap_apply + (V : Subgroup 𝒪[L]ˣ) (a : 𝒪[L]ˣ) : + chosenNormalBasisIntegerUnitsQuotientMap (L := L) V a = + QuotientGroup.mk a := + rfl + +/-- Inclusion of the principal-unit subgroup is Galois equivariant. -/ +theorem chosenNormalBasisPrincipalUnitSubgroupInclusion_equivariant + (n : Nat) (V : Subgroup 𝒪[L]ˣ) + (hV : (V : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) + (sigma : Gal(L/K)) (a : V) : + letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) V (sigma • a) = + sigma • chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) V a := + rfl + +/-- The quotient map on integer units is Galois equivariant. -/ +theorem chosenNormalBasisIntegerUnitsQuotientMap_equivariant + (n : Nat) (V : Subgroup 𝒪[L]ˣ) + (hV : (V : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) + (sigma : Gal(L/K)) (a : 𝒪[L]ˣ) : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + letI := chosenNormalBasisIntegerUnitsQuotMulDistribMulAction K L n V hV + chosenNormalBasisIntegerUnitsQuotientMap (L := L) V (sigma • a) = + sigma • chosenNormalBasisIntegerUnitsQuotientMap (L := L) V a := by + rfl + +/-- Inclusion of the principal-unit subgroup is injective. -/ +theorem chosenNormalBasisPrincipalUnitSubgroupInclusion_injective + (V : Subgroup 𝒪[L]ˣ) : + Function.Injective (chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) V) := + Subtype.val_injective + +/-- Every integer-unit quotient class has a representative. -/ +theorem chosenNormalBasisIntegerUnitsQuotientMap_surjective + (V : Subgroup 𝒪[L]ˣ) : + Function.Surjective (chosenNormalBasisIntegerUnitsQuotientMap (L := L) V) := + QuotientGroup.mk'_surjective V + +/-- Exactness at the integer-unit term of `1 → V^n → 𝒪_Lˣ → 𝒪_Lˣ/V^n +→ 1`. -/ +theorem chosenNormalBasisPrincipalUnitSubgroupInclusion_range_eq_ker_quotient + (V : Subgroup 𝒪[L]ˣ) : + MonoidHom.range (chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) V) = + MonoidHom.ker (chosenNormalBasisIntegerUnitsQuotientMap (L := L) V) := by + ext a + change (∃ v : V, (v : 𝒪[L]ˣ) = a) ↔ QuotientGroup.mk' V a = 1 + rw [QuotientGroup.mk'_apply, QuotientGroup.eq_one_iff] + constructor + · rintro ⟨v, rfl⟩ + exact v.2 + · intro ha + exact ⟨⟨a, ha⟩, rfl⟩ + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean new file mode 100644 index 0000000000..9e8c737e40 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean @@ -0,0 +1,489 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasis +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.PrincipalUnitGraded +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGaloisAction +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic +/-! Provides the public declarations in the + `LocalClassFieldTheory.ClassFormation.NormalBasisGradedLifting` Lean module. -/ + +@[expose] public section + +namespace LocalClassFieldTheory + +open LocalFieldTheory + +open CyclicCohomology + +noncomputable +section + +universe u + +open scoped BigOperators ValuativeRel +open IsNonarchimedeanLocalField +open CyclicCohomology.ProfiniteCohomology.Herbrand + +variable (K L : Type u) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [ValuativeRel L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + +/-- The class `u - 1` in the normal-basis lattice graded piece is equivariant +for the actual Galois action on integer units and the transported action on +the lattice quotient. -/ +theorem chosenNormalBasisPrincipalUnitLatticeClass_galoisGroup + (n : Nat) (sigma : Gal(L/K)) (u : 𝒪[L]ˣ) + (hu : u ∈ chosenNormalBasisPrincipalUnitSet K L n) : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + letI := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L n + chosenNormalBasisPrincipalUnitLatticeClass K L n (sigma • u) + (galoisGroup_smul_mem_chosenNormalBasisPrincipalUnitSet + (K := K) (L := L) n sigma hu) = + sigma • chosenNormalBasisPrincipalUnitLatticeClass K L n u hu := by + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + let := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L n + let y : chosenBaseUniformizerPowSubmodule K L n + (chosenNormalBasisIntegerLattice K L) := + ⟨((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L), hu⟩ + let x : chosenNormalBasisIntegerLattice K L := + (chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n).symm y + have hxy : chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n x = y := + (chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n).apply_symm_apply y + rw [chosenNormalBasisPrincipalUnitLatticeClass, + chosenNormalBasisPrincipalUnitLatticeClass] + change chosenNormalBasisLatticeSuccQuotMk K L n _ = + sigma • chosenNormalBasisLatticeSuccQuotMk K L n y + rw [← hxy, + galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction_smul_mk_mulPow] + apply congrArg (chosenNormalBasisLatticeSuccQuotMk K L n) + apply Subtype.ext + have hfield := chosenNormalBasisIntegerLatticeMulPowLinearEquiv_galoisGroup_apply_coe + K L n sigma x + rw [hxy] at hfield + simpa [y, galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure_smul, + map_sub, map_one] using hfield.symm + +/-- The actual action on `V^n` descends to the successive quotient +`V^n / V^(n+1)`. -/ +@[implicit_reducible] +def chosenNormalBasisPrincipalUnitSuccQuotMulDistribMulAction + (n : Nat) {Vn Vsucc : Subgroup 𝒪[L]ˣ} (hV : Vsucc ≤ Vn) + (hVn : (Vn : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) + (hVsucc : (Vsucc : Set 𝒪[L]ˣ) = + chosenNormalBasisPrincipalUnitSet K L (n + 1)) : + MulDistribMulAction (Gal(L/K)) + (chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV) := by + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction + K L n Vn hVn + change MulDistribMulAction (Gal(L/K)) + (Vn ⧸ chosenNormalBasisPrincipalUnitSuccSubgroup (L := L) hV) + exact quotientMulDistribMulActionOfSubgroupStable + (Gal(L/K)) Vn + (chosenNormalBasisPrincipalUnitSuccSubgroup (L := L) hV) (by + intro sigma a ha + apply (mem_chosenNormalBasisPrincipalUnitSuccSubgroup_iff + (L := L) hV (sigma • a)).2 + change (sigma • (a : 𝒪[L]ˣ)) ∈ (Vsucc : Set 𝒪[L]ˣ) + rw [hVsucc] + apply galoisGroup_smul_mem_chosenNormalBasisPrincipalUnitSet + (K := K) (L := L) (n + 1) sigma + rw [← hVsucc] + exact (mem_chosenNormalBasisPrincipalUnitSuccSubgroup_iff + (L := L) hV a).1 ha) + +/-- States the theorem `chosenNormalBasisPrincipalUnitSuccQuotMulDistribMulAction_smul_mk`. -/ +@[simp] +theorem chosenNormalBasisPrincipalUnitSuccQuotMulDistribMulAction_smul_mk + (n : Nat) {Vn Vsucc : Subgroup 𝒪[L]ˣ} (hV : Vsucc ≤ Vn) + (hVn : (Vn : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) + (hVsucc : (Vsucc : Set 𝒪[L]ˣ) = + chosenNormalBasisPrincipalUnitSet K L (n + 1)) + (sigma : Gal(L/K)) (u : Vn) : + letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction + K L n Vn hVn + letI := chosenNormalBasisPrincipalUnitSuccQuotMulDistribMulAction + K L n hV hVn hVsucc + sigma • chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV u = + chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV (sigma • u) := + rfl + +/-- Any graded-piece equivalence whose value on representatives is `u - 1` +is equivariant for the actual quotient action and the lattice action. -/ +theorem chosenNormalBasisPrincipalUnitSuccQuotMulEquiv_galoisGroup + (n : Nat) {Vn Vsucc : Subgroup 𝒪[L]ˣ} (hV : Vsucc ≤ Vn) + (hVn : (Vn : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) + (hVsucc : (Vsucc : Set 𝒪[L]ˣ) = + chosenNormalBasisPrincipalUnitSet K L (n + 1)) + (Phi : chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV ≃* + Multiplicative (chosenNormalBasisLatticeSuccQuot K L n)) + (hPhi : ∀ u : Vn, + Phi (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV u) = + Multiplicative.ofAdd + (chosenNormalBasisPrincipalUnitLatticeClass K L n (u : 𝒪[L]ˣ) + (by exact hVn ▸ u.2))) + (sigma : Gal(L/K)) + (q : chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV) : + letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction + K L n Vn hVn + letI := chosenNormalBasisPrincipalUnitSuccQuotMulDistribMulAction + K L n hV hVn hVsucc + letI := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L n + letI := multiplicativeMulDistribMulActionOfDistribMulAction + (Gal(L/K)) (chosenNormalBasisLatticeSuccQuot K L n) + Phi (sigma • q) = sigma • Phi q := by + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + let := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction + K L n Vn hVn + let := chosenNormalBasisPrincipalUnitSuccQuotMulDistribMulAction + K L n hV hVn hVsucc + let := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L n + let := multiplicativeMulDistribMulActionOfDistribMulAction + (Gal(L/K)) (chosenNormalBasisLatticeSuccQuot K L n) + refine + chosenNormalBasisPrincipalUnitSuccQuot.inductionOn + (L := L) hV + (motive := fun q => Phi (sigma • q) = sigma • Phi q) + q ?_ + intro u + rw [chosenNormalBasisPrincipalUnitSuccQuotMulDistribMulAction_smul_mk, + hPhi, hPhi] + exact congrArg Multiplicative.ofAdd + (chosenNormalBasisPrincipalUnitLatticeClass_galoisGroup + (K := K) (L := L) n sigma (u : 𝒪[L]ˣ) (by exact hVn ▸ u.2)) + +/-- One-step `H⁰` lifting: sufficiently deep fixed units are +a norm from the same level times a fixed unit one level deeper. -/ +theorem exists_chosenNormalBasisPrincipalUnit_h0_oneStep_lifting + [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Module.Finite 𝒪[K] 𝒪[L]] : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + ∃ c : Nat, ∀ k : Nat, c ≤ k → ∀ a : 𝒪[L]ˣ, + a ∈ chosenNormalBasisPrincipalUnitSet K L k → + (∀ sigma : Gal(L/K), sigma • a = a) → + ∃ b a' : 𝒪[L]ˣ, + b ∈ chosenNormalBasisPrincipalUnitSet K L k ∧ + a' ∈ chosenNormalBasisPrincipalUnitSet K L (k + 1) ∧ + (∀ sigma : Gal(L/K), sigma • a' = a') ∧ + a = tateNorm (Gal(L/K)) 𝒪[L]ˣ b * a' := by + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + rcases exists_chosenNormalBasisPrincipalUnitSuccQuotMulEquivLatticeSuccQuot + (K := K) (L := L) with ⟨c, hc⟩ + refine ⟨c, ?_⟩ + intro k hck a ha hfixed + rcases hc k hck with + ⟨Vn, Vsucc, hV, hVn, hVsucc, Phi, _hVnle, hPhi⟩ + let := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction + K L k Vn hVn + let := chosenNormalBasisPrincipalUnitSuccQuotMulDistribMulAction + K L k hV hVn hVsucc + let := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L k + let := multiplicativeMulDistribMulActionOfDistribMulAction + (Gal(L/K)) (chosenNormalBasisLatticeSuccQuot K L k) + let av : Vn := ⟨a, by + change a ∈ (Vn : Set 𝒪[L]ˣ) + rw [hVn] + exact ha⟩ + let q : Multiplicative (chosenNormalBasisLatticeSuccQuot K L k) := + Phi (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV av) + have hqfixed : ∀ sigma : Gal(L/K), sigma • q = q := by + intro sigma + dsimp [q] + calc + sigma • Phi (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV av) = + Phi (sigma • chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV av) := + (chosenNormalBasisPrincipalUnitSuccQuotMulEquiv_galoisGroup + (K := K) (L := L) k hV hVn hVsucc Phi hPhi sigma _).symm + _ = Phi (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV (sigma • av)) := by + rw [chosenNormalBasisPrincipalUnitSuccQuotMulDistribMulAction_smul_mk] + _ = Phi (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV av) := by + congr 2 + apply Subtype.ext + exact hfixed sigma + let qfixed : fixedSubgroup (Gal(L/K)) + (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k)) := + ⟨q, hqfixed⟩ + have hH0 := chosenNormalBasisLatticeSuccQuot_herbrandH0_subsingleton K L k + have hqone : + QuotientGroup.mk' + ((tateNormSubgroup (Gal(L/K)) + (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k))).subgroupOf + (fixedSubgroup (Gal(L/K)) + (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k)))) + qfixed = 1 := + @Subsingleton.elim _ hH0 _ _ + have hqmem : q ∈ tateNormSubgroup (Gal(L/K)) + (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k)) := by + have hm := (QuotientGroup.eq_one_iff _).1 hqone + exact hm + rcases hqmem with ⟨y, hy⟩ + rcases Phi.surjective y with ⟨qb, hqb⟩ + rcases chosenNormalBasisPrincipalUnitSuccQuotMk_surjective + (L := L) hV qb with + ⟨bv, hbvmk⟩ + change chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV bv = qb at hbvmk + have hPhiNorm : + Phi (tateNorm (Gal(L/K)) + (chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV) + (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV bv)) = q := by + calc + Phi (tateNorm (Gal(L/K)) + (chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV) + (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV bv)) = + tateNorm (Gal(L/K)) + (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k)) + (Phi (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV bv)) := + map_tateNorm Phi.toMonoidHom + (fun sigma z => chosenNormalBasisPrincipalUnitSuccQuotMulEquiv_galoisGroup + (K := K) (L := L) k hV hVn hVsucc Phi hPhi sigma z) _ + _ = tateNorm (Gal(L/K)) + (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k)) y := by + rw [hbvmk, hqb] + _ = q := hy + have hquotNorm : + tateNorm (Gal(L/K)) + (chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV) + (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV bv) = + chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV av := by + apply Phi.injective + simpa [q] using hPhiNorm + let bn : Vn := tateNorm (Gal(L/K)) Vn bv + have hmkbn : chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV bn = + chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV av := by + calc + chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV bn = + tateNorm (Gal(L/K)) + (chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV) + (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV bv) := by + exact map_tateNorm + (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV) + (fun sigma z => + (chosenNormalBasisPrincipalUnitSuccQuotMulDistribMulAction_smul_mk + (K := K) (L := L) k hV hVn hVsucc sigma z).symm) bv + _ = chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV av := hquotNorm + let aprimev : Vn := av / bn + have haprimeSucc : (aprimev : 𝒪[L]ˣ) ∈ Vsucc := by + apply (chosenNormalBasisPrincipalUnitSuccQuotMk_eq_one_iff + (L := L) hV aprimev).1 + dsimp [aprimev] + rw [map_div, hmkbn] + simp + have havfixed : ∀ sigma : Gal(L/K), sigma • av = av := by + intro sigma + apply Subtype.ext + exact hfixed sigma + have hbnfixed : ∀ sigma : Gal(L/K), sigma • bn = bn := by + intro sigma + exact smul_tateNorm_eq (G := Gal(L/K)) (A := Vn) sigma bv + have haprimefixed : ∀ sigma : Gal(L/K), sigma • aprimev = aprimev := by + intro sigma + dsimp [aprimev] + have ha' := havfixed sigma + have hb' := hbnfixed sigma + change (MulDistribMulAction.toMonoidHom Vn sigma) av = av at ha' + change (MulDistribMulAction.toMonoidHom Vn sigma) bn = bn at hb' + change (MulDistribMulAction.toMonoidHom Vn sigma) (av / bn) = av / bn + rw [map_div, ha', hb'] + refine ⟨(bv : 𝒪[L]ˣ), (aprimev : 𝒪[L]ˣ), ?_, ?_, ?_, ?_⟩ + · exact hVn ▸ bv.2 + · exact hVsucc ▸ haprimeSucc + · intro sigma + exact congrArg (fun z : Vn => (z : 𝒪[L]ˣ)) (haprimefixed sigma) + · have hbnval : (bn : 𝒪[L]ˣ) = + tateNorm (Gal(L/K)) 𝒪[L]ˣ (bv : 𝒪[L]ˣ) := by + exact map_tateNorm + (chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) Vn) + (fun sigma z => chosenNormalBasisPrincipalUnitSubgroupInclusion_equivariant + (K := K) (L := L) k Vn hVn sigma z) bv + change a = tateNorm (Gal(L/K)) 𝒪[L]ˣ (bv : 𝒪[L]ˣ) * + (aprimev : 𝒪[L]ˣ) + rw [← hbnval] + dsimp [aprimev, av] + simp + +/-- One-step `H⁻¹` lifting: for a chosen generator, every +sufficiently deep norm-one unit is a coboundary from the same level times a +norm-one unit one level deeper. -/ +theorem exists_chosenNormalBasisPrincipalUnit_hMinusOne_oneStep_lifting + [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Module.Finite 𝒪[K] 𝒪[L]] + (g : Gal(L/K)) (hgen : ∀ sigma : Gal(L/K), + sigma ∈ Subgroup.zpowers g) : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + ∃ c : Nat, ∀ k : Nat, c ≤ k → ∀ a : 𝒪[L]ˣ, + a ∈ chosenNormalBasisPrincipalUnitSet K L k → + tateNorm (Gal(L/K)) 𝒪[L]ˣ a = 1 → + ∃ b a' : 𝒪[L]ˣ, + b ∈ chosenNormalBasisPrincipalUnitSet K L k ∧ + a' ∈ chosenNormalBasisPrincipalUnitSet K L (k + 1) ∧ + tateNorm (Gal(L/K)) 𝒪[L]ˣ a' = 1 ∧ + a = sigmaMinusOne (Gal(L/K)) 𝒪[L]ˣ g b * a' := by + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + rcases exists_chosenNormalBasisPrincipalUnitSuccQuotMulEquivLatticeSuccQuot + (K := K) (L := L) with ⟨c, hc⟩ + refine ⟨c, ?_⟩ + intro k hck a ha hnorm + rcases hc k hck with + ⟨Vn, Vsucc, hV, hVn, hVsucc, Phi, _hVnle, hPhi⟩ + let := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction + K L k Vn hVn + let := chosenNormalBasisPrincipalUnitSuccQuotMulDistribMulAction + K L k hV hVn hVsucc + let := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L k + let := multiplicativeMulDistribMulActionOfDistribMulAction + (Gal(L/K)) (chosenNormalBasisLatticeSuccQuot K L k) + let av : Vn := ⟨a, by + change a ∈ (Vn : Set 𝒪[L]ˣ) + rw [hVn] + exact ha⟩ + have hnormv : tateNorm (Gal(L/K)) Vn av = 1 := by + apply Subtype.ext + have hmap := map_tateNorm + (chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) Vn) + (fun sigma z => chosenNormalBasisPrincipalUnitSubgroupInclusion_equivariant + (K := K) (L := L) k Vn hVn sigma z) av + change ((chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) Vn) + (tateNorm (Gal(L/K)) Vn av) : 𝒪[L]ˣ) = + tateNorm (Gal(L/K)) 𝒪[L]ˣ a at hmap + rw [hnorm] at hmap + exact hmap + let q : Multiplicative (chosenNormalBasisLatticeSuccQuot K L k) := + Phi (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV av) + have hqnorm : tateNorm (Gal(L/K)) + (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k)) q = 1 := by + dsimp [q] + calc + tateNorm (Gal(L/K)) + (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k)) + (Phi (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV av)) = + Phi (tateNorm (Gal(L/K)) + (chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV) + (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV av)) := + (map_tateNorm Phi.toMonoidHom + (fun sigma z => chosenNormalBasisPrincipalUnitSuccQuotMulEquiv_galoisGroup + (K := K) (L := L) k hV hVn hVsucc Phi hPhi sigma z) _).symm + _ = Phi (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV + (tateNorm (Gal(L/K)) Vn av)) := by + congr 1 + exact (map_tateNorm + (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV) + (fun sigma z => + (chosenNormalBasisPrincipalUnitSuccQuotMulDistribMulAction_smul_mk + (K := K) (L := L) k hV hVn hVsucc sigma z).symm) av).symm + _ = 1 := by rw [hnormv]; simp + let qker : normKernelSubgroup (Gal(L/K)) + (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k)) := + ⟨q, hqnorm⟩ + have hHm := chosenNormalBasisLatticeSuccQuot_herbrandHMinusOne_subsingleton + K L k g hgen + have hqone : + QuotientGroup.mk' + ((augmentationSubgroup (Gal(L/K)) + (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k)) g).subgroupOf + (normKernelSubgroup (Gal(L/K)) + (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k)))) + qker = 1 := + @Subsingleton.elim _ hHm _ _ + have hqmem : q ∈ augmentationSubgroup (Gal(L/K)) + (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k)) g := by + have hm := (QuotientGroup.eq_one_iff _).1 hqone + exact hm + rcases hqmem with ⟨y, hy⟩ + rcases Phi.surjective y with ⟨qb, hqb⟩ + rcases chosenNormalBasisPrincipalUnitSuccQuotMk_surjective + (L := L) hV qb with + ⟨bv, hbvmk⟩ + change chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV bv = qb at hbvmk + have hPhiCoboundary : + Phi (sigmaMinusOne (Gal(L/K)) + (chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV) g + (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV bv)) = q := by + calc + Phi (sigmaMinusOne (Gal(L/K)) + (chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV) g + (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV bv)) = + sigmaMinusOne (Gal(L/K)) + (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k)) g + (Phi (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV bv)) := + map_sigmaMinusOne Phi.toMonoidHom + (fun sigma z => chosenNormalBasisPrincipalUnitSuccQuotMulEquiv_galoisGroup + (K := K) (L := L) k hV hVn hVsucc Phi hPhi sigma z) g _ + _ = sigmaMinusOne (Gal(L/K)) + (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k)) g y := by + rw [hbvmk, hqb] + _ = q := hy + have hquotCoboundary : + sigmaMinusOne (Gal(L/K)) + (chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV) g + (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV bv) = + chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV av := by + apply Phi.injective + simpa [q] using hPhiCoboundary + let cobv : Vn := sigmaMinusOne (Gal(L/K)) Vn g bv + have hmkcob : chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV cobv = + chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV av := by + calc + chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV cobv = + sigmaMinusOne (Gal(L/K)) + (chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV) g + (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV bv) := by + exact map_sigmaMinusOne + (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV) + (fun sigma z => + (chosenNormalBasisPrincipalUnitSuccQuotMulDistribMulAction_smul_mk + (K := K) (L := L) k hV hVn hVsucc sigma z).symm) g bv + _ = chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV av := hquotCoboundary + let aprimev : Vn := av / cobv + have haprimeSucc : (aprimev : 𝒪[L]ˣ) ∈ Vsucc := by + apply (chosenNormalBasisPrincipalUnitSuccQuotMk_eq_one_iff + (L := L) hV aprimev).1 + dsimp [aprimev] + rw [map_div, hmkcob] + simp + have haprimeNormV : tateNorm (Gal(L/K)) Vn aprimev = 1 := by + dsimp [aprimev, cobv] + rw [div_eq_mul_inv, tateNorm_mul, tateNorm_inv, hnormv, + tateNorm_sigmaMinusOne_eq_one] + simp + have haprimeNorm : tateNorm (Gal(L/K)) 𝒪[L]ˣ + (aprimev : 𝒪[L]ˣ) = 1 := by + have hmap := map_tateNorm + (chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) Vn) + (fun sigma z => chosenNormalBasisPrincipalUnitSubgroupInclusion_equivariant + (K := K) (L := L) k Vn hVn sigma z) aprimev + have hleft : + chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) Vn + (tateNorm (Gal(L/K)) Vn aprimev) = 1 := + (congrArg + (chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) Vn) + haprimeNormV).trans + (chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) Vn).map_one + exact (congrArg (tateNorm (Gal(L/K)) 𝒪[L]ˣ) + (chosenNormalBasisPrincipalUnitSubgroupInclusion_apply + (L := L) Vn aprimev)).symm.trans (hmap.symm.trans hleft) + refine ⟨(bv : 𝒪[L]ˣ), (aprimev : 𝒪[L]ˣ), ?_, ?_, haprimeNorm, ?_⟩ + · exact hVn ▸ bv.2 + · exact hVsucc ▸ haprimeSucc + · have hcobval : (cobv : 𝒪[L]ˣ) = + sigmaMinusOne (Gal(L/K)) 𝒪[L]ˣ g (bv : 𝒪[L]ˣ) := by + exact map_sigmaMinusOne + (chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) Vn) + (fun sigma z => chosenNormalBasisPrincipalUnitSubgroupInclusion_equivariant + (K := K) (L := L) k Vn hVn sigma z) g bv + change a = sigmaMinusOne (Gal(L/K)) 𝒪[L]ˣ g (bv : 𝒪[L]ˣ) * + (aprimev : 𝒪[L]ˣ) + rw [← hcobval] + dsimp [aprimev, av] + simp + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean new file mode 100644 index 0000000000..94af21c16f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean @@ -0,0 +1,477 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLattice +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation +/-! Provides the public declarations in the + `LocalClassFieldTheory.ClassFormation.NormalBasisInfiniteProduct` Lean module. -/ + +@[expose] public section + +namespace LocalClassFieldTheory +open CyclicCohomology + +open CyclicCohomology LocalFieldTheory + +noncomputable +section + +universe u + +open scoped BigOperators +open scoped ValuativeRel +open Filter IsNonarchimedeanLocalField +open CyclicCohomology.ProfiniteCohomology.Herbrand + +variable (K L : Type u) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [ValuativeRel L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- An element of `π_K^m 𝒪_L`, viewed in `L`, is represented by an +element of `𝓂_L^m`. This is the valuation-extension bridge needed to turn +normal-basis corrections into the usual principal-unit corrections. -/ +theorem chosenBaseUniformizerPow_integerRingFieldSubmodule_exists_mem_maximalIdeal_pow + (m : Nat) {x : L} + (hx : x ∈ chosenBaseUniformizerPowSubmodule K L m + (integerRingFieldSubmodule K L)) : + ∃ a : 𝒪[L], a ∈ (𝓂[L] ^ m : Ideal 𝒪[L]) ∧ (a : L) = x := by + rcases (mem_chosenBaseUniformizerPowSubmodule_iff + (K := K) (L := L) m (integerRingFieldSubmodule K L) x).1 hx with + ⟨y, hy, rfl⟩ + let yInt : 𝒪[L] := ⟨y, + (mem_integerRingFieldSubmodule_iff (K := K) (L := L) y).1 hy⟩ + let πL : 𝒪[L] := + integerRingMapOfValuationExtension K L (chosenIntegerRingUniformizer K) + have hπL : πL ∈ (𝓂[L] : Ideal 𝒪[L]) := by + exact integerRingMap_uniformizer_mem_maximalIdeal_of_valuationExtension + (K := K) (L := L) + refine ⟨πL ^ m * yInt, ?_, ?_⟩ + · exact Ideal.mul_mem_right yInt _ (Ideal.pow_mem_pow hπL m) + · dsimp [πL, yInt] + rw [map_pow] + rfl + +/-- Once `π_K^bM ⊆ 𝒪_L` and `b+1 ≤ n`, a correction in +`V^(n+i)` is an honest element of the usual principal-unit group `U_L^(i+1)`. -/ +theorem chosenNormalBasisPrincipalUnitSet_mem_principalUnits_succ_of_lattice_bound + {b n i : Nat} + (hb : chosenBaseUniformizerPowSubmodule K L b + (chosenNormalBasisIntegerLattice K L) ≤ + integerRingFieldSubmodule K L) + (hbn : b + 1 ≤ n) {z : 𝒪[L]ˣ} + (hz : z ∈ chosenNormalBasisPrincipalUnitSet K L (n + i)) : + z ∈ principalUnits L (1 + i) := by + rcases Nat.exists_eq_add_of_le hbn with ⟨r, rfl⟩ + let x : L := ((((z : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) + have hxdeep : x ∈ chosenBaseUniformizerPowSubmodule K L + (b + ((1 + r) + i)) (chosenNormalBasisIntegerLattice K L) := by + simpa [x, Nat.add_assoc] using hz + have hxint : x ∈ chosenBaseUniformizerPowSubmodule K L ((1 + r) + i) + (integerRingFieldSubmodule K L) := + chosenBaseUniformizerPowSubmodule_add_le_chosenBaseUniformizerPowSubmodule_of_le + (K := K) (L := L) (a := b) (n := (1 + r) + i) hb hxdeep + rcases chosenBaseUniformizerPow_integerRingFieldSubmodule_exists_mem_maximalIdeal_pow + (K := K) (L := L) ((1 + r) + i) hxint with ⟨a, ha, hax⟩ + have hpow : (𝓂[L] ^ ((1 + r) + i) : Ideal 𝒪[L]) ≤ + (𝓂[L] ^ (1 + i) : Ideal 𝒪[L]) := by + apply Ideal.pow_le_pow_right + exact Nat.add_le_add_right (Nat.le_add_right 1 r) i + have ha' : a ∈ (𝓂[L] ^ (1 + i) : Ideal 𝒪[L]) := hpow ha + rw [mem_principalUnits_iff] + have haeq : a = ((z : 𝒪[L]ˣ) : 𝒪[L]) - 1 := by + apply Subtype.ext + simpa [x] using hax + simpa [haeq] using ha' + +/-- Once the normal-basis lattice has entered `𝒪_L`, a sequence whose +`i`-th term lies in `V^(n+i)` converges to `1` in `𝒪_L`. -/ +theorem tendsto_chosenNormalBasisPrincipalUnitSequence_one_of_lattice_bound + [UniformSpace L] [IsNonarchimedeanLocalField L] + {b n : Nat} + (hb : chosenBaseUniformizerPowSubmodule K L b + (chosenNormalBasisIntegerLattice K L) ≤ + integerRingFieldSubmodule K L) + (hbn : b + 1 ≤ n) (z : Nat → 𝒪[L]ˣ) + (hz : ∀ i : Nat, z i ∈ chosenNormalBasisPrincipalUnitSet K L (n + i)) : + Tendsto (fun i : Nat => ((z i : 𝒪[L]ˣ) : 𝒪[L])) atTop + (nhds (1 : 𝒪[L])) := by + have hsub : Tendsto + (fun i : Nat => ((z i : 𝒪[L]ˣ) : 𝒪[L]) - 1) atTop + (nhds (0 : 𝒪[L])) := by + rw [tendsto_def] + intro s hs + rcases eventually_maximalIdeal_pow_subset_nhds_zero L s hs with ⟨N, hN⟩ + filter_upwards [eventually_ge_atTop N] with i hi + apply hN (1 + i) + · exact le_trans hi (Nat.le_add_left i 1) + · exact (mem_principalUnits_iff L (z i) (1 + i)).1 + (chosenNormalBasisPrincipalUnitSet_mem_principalUnits_succ_of_lattice_bound + (K := K) (L := L) hb hbn (hz i)) + simpa using hsub.const_add (1 : 𝒪[L]) + +/-- Every ring equivalence of the valuation integer ring is continuous. The +proof uses the maximal-ideal powers as a neighborhood basis and the fact that +a ring equivalence preserves each such power. -/ +theorem continuous_integerRingEquiv_of_isNonarchimedeanLocalField + [UniformSpace L] [IsNonarchimedeanLocalField L] + (e : 𝒪[L] ≃+* 𝒪[L]) : Continuous e := by + apply continuous_of_continuousAt_zero e.toAddMonoidHom + rw [ContinuousAt, map_zero, tendsto_def] + intro s hs + rcases exists_maximalIdeal_pow_subset_nhds_zero L s hs with ⟨N, hN⟩ + exact Filter.mem_of_superset (maximalIdeal_pow_mem_nhds_zero L N) + (fun x hx => hN + ((integerRingEquiv_mem_maximalIdeal_pow L e N x).2 hx)) + +omit [IsGalois K L] [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +/-- Finite Tate norms for the actual `Gal(L / K)` action commute with limits +of valuation-ring units. This is just continuity of each Galois conjugate +followed by continuity of a finite product. -/ +theorem tendsto_galoisGroupIntegerUnits_tateNorm_of_tendsto + [UniformSpace L] [IsUniformAddGroup L] [IsNonarchimedeanLocalField L] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (f : Nat → 𝒪[L]ˣ) (x : 𝒪[L]ˣ) + (hf : Tendsto (fun d : Nat => ((f d : 𝒪[L]ˣ) : 𝒪[L])) atTop + (nhds ((x : 𝒪[L]ˣ) : 𝒪[L]))) : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + Tendsto + (fun d : Nat => + ((tateNorm (Gal(L/K)) 𝒪[L]ˣ (f d) : 𝒪[L]ˣ) : 𝒪[L])) + atTop + (nhds ((tateNorm (Gal(L/K)) 𝒪[L]ˣ x : 𝒪[L]ˣ) : 𝒪[L])) := by + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + have hσ (sigma : Gal(L/K)) : Tendsto + (fun d : Nat => ((sigma • f d : 𝒪[L]ˣ) : 𝒪[L])) atTop + (nhds ((sigma • x : 𝒪[L]ˣ) : 𝒪[L])) := by + have he := + (continuous_integerRingEquiv_of_isNonarchimedeanLocalField L + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L sigma)).tendsto + ((x : 𝒪[L]ˣ) : 𝒪[L]) |>.comp hf + rw [show + (⇑(galoisGroupIntegerRingEquivOfIsIntegralClosure K L sigma) ∘ + fun d : Nat => ((f d : 𝒪[L]ˣ) : 𝒪[L])) = + (fun d : Nat => + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L sigma) + ((f d : 𝒪[L]ˣ) : 𝒪[L])) by + funext d + rfl] at he + simpa [ + galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure_smul] using he + have hprod := tendsto_finsetProd + (Finset.univ : Finset (Gal(L/K))) (fun sigma _ => hσ sigma) + convert hprod using 1 <;> simp [tateNorm] + +omit [FiniteDimensional K L] [IsGalois K L] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +/-- The actual multiplicative coboundary `x ↦ g(x)x⁻¹` on valuation-ring +units commutes with limits taken in `𝒪_L`. We use continuity of the +restricted Galois automorphism, and continuity of inversion away from zero in +the ambient local field. -/ +theorem tendsto_galoisGroupIntegerUnits_sigmaMinusOne_of_tendsto + [UniformSpace L] [IsUniformAddGroup L] [IsNonarchimedeanLocalField L] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (g : Gal(L/K)) (f : Nat → 𝒪[L]ˣ) (x : 𝒪[L]ˣ) + (hf : Tendsto (fun d : Nat => ((f d : 𝒪[L]ˣ) : 𝒪[L])) atTop + (nhds ((x : 𝒪[L]ˣ) : 𝒪[L]))) : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + Tendsto + (fun d : Nat => + ((sigmaMinusOne (Gal(L/K)) 𝒪[L]ˣ g (f d) : 𝒪[L]ˣ) : 𝒪[L])) + atTop + (nhds ((sigmaMinusOne (Gal(L/K)) 𝒪[L]ˣ g x : 𝒪[L]ˣ) : 𝒪[L])) := by + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + have hgO : Tendsto + (fun d : Nat => ((g • f d : 𝒪[L]ˣ) : 𝒪[L])) atTop + (nhds ((g • x : 𝒪[L]ˣ) : 𝒪[L])) := by + have he := + (continuous_integerRingEquiv_of_isNonarchimedeanLocalField L + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L g)).tendsto + ((x : 𝒪[L]ˣ) : 𝒪[L]) |>.comp hf + rw [show + (⇑(galoisGroupIntegerRingEquivOfIsIntegralClosure K L g) ∘ + fun d : Nat => ((f d : 𝒪[L]ˣ) : 𝒪[L])) = + (fun d : Nat => + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L g) + ((f d : 𝒪[L]ˣ) : 𝒪[L])) by + funext d + rfl] at he + simpa [ + galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure_smul] using he + have hfL : Tendsto + (fun d : Nat => (((f d : 𝒪[L]ˣ) : 𝒪[L]) : L)) atTop + (nhds (((x : 𝒪[L]ˣ) : 𝒪[L]) : L)) := + continuous_subtype_val.tendsto ((x : 𝒪[L]ˣ) : 𝒪[L]) |>.comp hf + have hgL : Tendsto + (fun d : Nat => (((g • f d : 𝒪[L]ˣ) : 𝒪[L]) : L)) atTop + (nhds (((g • x : 𝒪[L]ˣ) : 𝒪[L]) : L)) := + continuous_subtype_val.tendsto ((g • x : 𝒪[L]ˣ) : 𝒪[L]) |>.comp hgO + have hinv_coe (u : 𝒪[L]ˣ) : + ((((u⁻¹ : 𝒪[L]ˣ) : 𝒪[L])) : L) = + ((((u : 𝒪[L]ˣ) : 𝒪[L])) : L)⁻¹ := by + apply eq_inv_of_mul_eq_one_right + exact congrArg (fun y : 𝒪[L] => (y : L)) u.val_inv + apply tendsto_subtype_rng.2 + have h := hgL.mul (hfL.inv₀ (by + intro hx0 + apply Units.ne_zero x + apply Subtype.ext + exact hx0)) + convert h using 1 <;> simp [sigmaMinusOne, hinv_coe] + +/-- Regard a normal-basis correction sequence as the usual sequence of +successively deeper principal units. -/ +def chosenNormalBasisPrincipalUnitSequenceAsPrincipalUnits + {b n : Nat} + (hb : chosenBaseUniformizerPowSubmodule K L b + (chosenNormalBasisIntegerLattice K L) ≤ + integerRingFieldSubmodule K L) + (hbn : b + 1 ≤ n) (z : Nat → 𝒪[L]ˣ) + (hz : ∀ i : Nat, z i ∈ chosenNormalBasisPrincipalUnitSet K L (n + i)) + (i : Nat) : principalUnits L (1 + i) := + ⟨z i, + chosenNormalBasisPrincipalUnitSet_mem_principalUnits_succ_of_lattice_bound + (K := K) (L := L) hb hbn (hz i)⟩ + +/-- Coercing the principal-unit sequence returns the original normal-basis correction term. -/ +@[simp] +theorem chosenNormalBasisPrincipalUnitSequenceAsPrincipalUnits_val + {b n : Nat} + (hb : chosenBaseUniformizerPowSubmodule K L b + (chosenNormalBasisIntegerLattice K L) ≤ + integerRingFieldSubmodule K L) + (hbn : b + 1 ≤ n) (z : Nat → 𝒪[L]ˣ) + (hz : ∀ i : Nat, z i ∈ chosenNormalBasisPrincipalUnitSet K L (n + i)) + (i : Nat) : + (chosenNormalBasisPrincipalUnitSequenceAsPrincipalUnits K L hb hbn z hz i : 𝒪[L]ˣ) = z i := + rfl + +/-- Finite products of a normal-basis correction sequence. -/ +def chosenNormalBasisPrincipalUnitCorrectionProduct (z : Nat → 𝒪[L]ˣ) : + Nat → 𝒪[L]ˣ + | 0 => 1 + | d + 1 => chosenNormalBasisPrincipalUnitCorrectionProduct z d * z d + +/-- The empty normal-basis correction product is the identity unit. -/ +@[simp] +theorem chosenNormalBasisPrincipalUnitCorrectionProduct_zero (z : Nat → 𝒪[L]ˣ) : + chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z 0 = 1 := + rfl + +/-- A successor correction product appends the correction at the preceding index. -/ +@[simp] +theorem chosenNormalBasisPrincipalUnitCorrectionProduct_succ + (z : Nat → 𝒪[L]ˣ) (d : Nat) : + chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z (d + 1) = + chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z d * z d := + rfl + +/-- The normal-basis partial products are definitionally the standard +principal-unit correction products after the lattice-to-ideal bridge. -/ +theorem chosenNormalBasisPrincipalUnitCorrectionProduct_eq_principalUnitsCorrectionProduct + {b n : Nat} + (hb : chosenBaseUniformizerPowSubmodule K L b + (chosenNormalBasisIntegerLattice K L) ≤ + integerRingFieldSubmodule K L) + (hbn : b + 1 ≤ n) (z : Nat → 𝒪[L]ˣ) + (hz : ∀ i : Nat, z i ∈ chosenNormalBasisPrincipalUnitSet K L (n + i)) + (d : Nat) : + chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z d = + principalUnitsCorrectionProduct L 1 + (chosenNormalBasisPrincipalUnitSequenceAsPrincipalUnits K L hb hbn z hz) d := by + induction d with + | zero => rfl + | succ d ih => + rw [chosenNormalBasisPrincipalUnitCorrectionProduct_succ, + principalUnitsCorrectionProduct_succ, ih] + rfl + +omit [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- If `V^n` is multiplicatively closed, every finite correction product +stays in `V^n`. -/ +theorem chosenNormalBasisPrincipalUnitCorrectionProduct_mem + {n : Nat} + (hmul : ∀ u : 𝒪[L]ˣ, u ∈ chosenNormalBasisPrincipalUnitSet K L n → + ∀ v : 𝒪[L]ˣ, v ∈ chosenNormalBasisPrincipalUnitSet K L n → + u * v ∈ chosenNormalBasisPrincipalUnitSet K L n) + (z : Nat → 𝒪[L]ˣ) + (hz : ∀ i : Nat, z i ∈ chosenNormalBasisPrincipalUnitSet K L (n + i)) + (d : Nat) : + chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z d ∈ + chosenNormalBasisPrincipalUnitSet K L n := by + induction d with + | zero => + exact chosenNormalBasisPrincipalUnitSet_one_mem (K := K) (L := L) n + | succ d ih => + rw [chosenNormalBasisPrincipalUnitCorrectionProduct_succ] + apply hmul _ ih (z d) + exact chosenBaseUniformizerPowSubmodule_antitone + (K := K) (L := L) (chosenNormalBasisIntegerLattice K L) + (Nat.le_add_right n d) (hz d) + +omit [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- The quotient of two partial products is controlled by the filtration +level at the earlier index. This is the exact tail recurrence used in both +`H⁰` and `H⁻¹` correction arguments. -/ +theorem chosenNormalBasisPrincipalUnitCorrectionProduct_div_mem + {n : Nat} + (hmul : ∀ k : Nat, n ≤ k → + ∀ u : 𝒪[L]ˣ, u ∈ chosenNormalBasisPrincipalUnitSet K L k → + ∀ v : 𝒪[L]ˣ, v ∈ chosenNormalBasisPrincipalUnitSet K L k → + u * v ∈ chosenNormalBasisPrincipalUnitSet K L k) + (z : Nat → 𝒪[L]ˣ) + (hz : ∀ i : Nat, z i ∈ chosenNormalBasisPrincipalUnitSet K L (n + i)) + (m d : Nat) : + chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z (m + d) / + chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z m ∈ + chosenNormalBasisPrincipalUnitSet K L (n + m) := by + induction d with + | zero => simp + | succ d ih => + have hprod : + chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z (m + (d + 1)) = + chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z (m + d) * + z (m + d) := by + rw [Nat.add_succ] + rfl + rw [hprod] + have hzlevel : z (m + d) ∈ chosenNormalBasisPrincipalUnitSet K L (n + m) := + chosenBaseUniformizerPowSubmodule_antitone + (K := K) (L := L) (chosenNormalBasisIntegerLattice K L) + (Nat.add_le_add_left (Nat.le_add_right m d) n) (hz (m + d)) + have hEq : + chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z (m + d) * + z (m + d) / + chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z m = + (chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z (m + d) / + chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z m) * + z (m + d) := by + simp [div_eq_mul_inv, mul_assoc, mul_comm] + rw [hEq] + exact hmul (n + m) (Nat.le_add_right n m) _ ih _ hzlevel + +/-- Completeness of `𝒪_L` gives a unit-valued limit for the normal-basis +partial products once the lattice sequence has been embedded in +`U_L^(i+1)`. -/ +theorem exists_tendsto_chosenNormalBasisPrincipalUnitCorrectionProduct_principalUnit + [UniformSpace L] [IsUniformAddGroup L] [IsNonarchimedeanLocalField L] + {b n : Nat} + (hb : chosenBaseUniformizerPowSubmodule K L b + (chosenNormalBasisIntegerLattice K L) ≤ + integerRingFieldSubmodule K L) + (hbn : b + 1 ≤ n) (z : Nat → 𝒪[L]ˣ) + (hz : ∀ i : Nat, z i ∈ chosenNormalBasisPrincipalUnitSet K L (n + i)) : + ∃ x : principalUnits L 1, + Tendsto + (fun d : Nat => + ((chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z d : 𝒪[L]ˣ) : + 𝒪[L])) + atTop (nhds (((x : principalUnits L 1) : 𝒪[L]ˣ) : 𝒪[L])) := by + let zU : ∀ i : Nat, principalUnits L (1 + i) := + chosenNormalBasisPrincipalUnitSequenceAsPrincipalUnits K L hb hbn z hz + rcases exists_tendsto_principalUnitsCorrectionProduct_principalUnit + L 1 (by rfl) zU with ⟨x, hx⟩ + refine ⟨x, hx.congr' (Eventually.of_forall ?_)⟩ + intro d + exact congrArg (fun q : 𝒪[L]ˣ => (q : 𝒪[L])) + (chosenNormalBasisPrincipalUnitCorrectionProduct_eq_principalUnitsCorrectionProduct + (K := K) (L := L) hb hbn z hz d).symm + +omit [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- A unit-valued limit of partial products remains in the initial +normal-basis filtration level whenever that lattice is closed. -/ +theorem chosenNormalBasisPrincipalUnitCorrectionProduct_limit_mem + [UniformSpace L] [IsNonarchimedeanLocalField L] + {n : Nat} + (hclosed : IsClosed + ((chosenBaseUniformizerPowSubmodule K L n + (chosenNormalBasisIntegerLattice K L) : Set L))) + (hmul : ∀ u : 𝒪[L]ˣ, u ∈ chosenNormalBasisPrincipalUnitSet K L n → + ∀ v : 𝒪[L]ˣ, v ∈ chosenNormalBasisPrincipalUnitSet K L n → + u * v ∈ chosenNormalBasisPrincipalUnitSet K L n) + (z : Nat → 𝒪[L]ˣ) + (hz : ∀ i : Nat, z i ∈ chosenNormalBasisPrincipalUnitSet K L (n + i)) + (x : 𝒪[L]ˣ) + (hx : Tendsto + (fun d : Nat => + ((chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z d : 𝒪[L]ˣ) : + 𝒪[L])) + atTop (nhds ((x : 𝒪[L]ˣ) : 𝒪[L]))) : + x ∈ chosenNormalBasisPrincipalUnitSet K L n := by + have hxL : Tendsto + (fun d : Nat => + (((chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z d : 𝒪[L]ˣ) : + 𝒪[L]) : L)) + atTop (nhds ((((x : 𝒪[L]ˣ) : 𝒪[L])) : L)) := + (continuous_subtype_val.tendsto ((x : 𝒪[L]ˣ) : 𝒪[L])).comp hx + have hsub : Tendsto + (fun d : Nat => + (((((chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z d : 𝒪[L]ˣ) : + 𝒪[L]) - 1 : 𝒪[L]) : L))) + atTop (nhds (((((x : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L))) := by + simpa using hxL.sub (tendsto_const_nhds (x := (1 : L))) + rw [mem_chosenNormalBasisPrincipalUnitSet_iff] + exact submodule_mem_of_tendsto_of_forall_mem_of_closed + (K := K) (L := L) hclosed hsub + (fun d => chosenNormalBasisPrincipalUnitCorrectionProduct_mem + (K := K) (L := L) hmul z hz d) + +/-- Infinite-product boundary for the local class-field axiom: for all sufficiently large +`n`, every sequence `z_i ∈ V^(n+i)` has partial products converging to an +actual unit of `V^n`. -/ +theorem exists_tendsto_chosenNormalBasisPrincipalUnitCorrectionProduct + [UniformSpace L] [IsUniformAddGroup L] [IsNonarchimedeanLocalField L] + [Module.Finite 𝒪[K] 𝒪[L]] : + ∃ c : Nat, ∀ n : Nat, c ≤ n → + ∀ z : Nat → 𝒪[L]ˣ, + (∀ i : Nat, z i ∈ chosenNormalBasisPrincipalUnitSet K L (n + i)) → + ∃ x : 𝒪[L]ˣ, + Tendsto + (fun d : Nat => + ((chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z d : + 𝒪[L]ˣ) : 𝒪[L])) + atTop (nhds ((x : 𝒪[L]ˣ) : 𝒪[L])) ∧ + x ∈ chosenNormalBasisPrincipalUnitSet K L n := by + rcases + exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_integerRingFieldSubmodule + (K := K) (L := L) with ⟨b, hb⟩ + rcases exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_mul_mul_mem_self + (K := K) (L := L) with ⟨cMul, hcMul⟩ + rcases exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_isClosed + (K := K) (L := L) with ⟨cClosed, hcClosed⟩ + refine ⟨max (b + 1) (max cMul cClosed), ?_⟩ + intro n hn z hz + have hbn : b + 1 ≤ n := + le_trans (le_max_left (b + 1) (max cMul cClosed)) hn + have hrest : max cMul cClosed ≤ max (b + 1) (max cMul cClosed) := + le_max_right (b + 1) (max cMul cClosed) + have hcMuln : cMul ≤ n := + le_trans (le_trans (le_max_left cMul cClosed) hrest) hn + have hcClosedn : cClosed ≤ n := + le_trans (le_trans (le_max_right cMul cClosed) hrest) hn + let hmulLattice := hcMul n hcMuln + have hmul : ∀ u : 𝒪[L]ˣ, u ∈ chosenNormalBasisPrincipalUnitSet K L n → + ∀ v : 𝒪[L]ˣ, v ∈ chosenNormalBasisPrincipalUnitSet K L n → + u * v ∈ chosenNormalBasisPrincipalUnitSet K L n := by + intro u hu v hv + exact chosenNormalBasisPrincipalUnitSet_mul_mem + (K := K) (L := L) hmulLattice hu hv + rcases exists_tendsto_chosenNormalBasisPrincipalUnitCorrectionProduct_principalUnit + (K := K) (L := L) hb hbn z hz with ⟨x, hx⟩ + let xu : 𝒪[L]ˣ := (x : principalUnits L 1) + refine ⟨xu, ?_, ?_⟩ + · exact hx + · exact chosenNormalBasisPrincipalUnitCorrectionProduct_limit_mem + (K := K) (L := L) (hcClosed n hcClosedn) hmul z hz xu hx + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisRecursiveLifting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisRecursiveLifting.lean new file mode 100644 index 0000000000..9e3cde38b8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisRecursiveLifting.lean @@ -0,0 +1,252 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FilteredLiftingSequence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGradedLifting + +/-! # Normal Basis Recursive Lifting -/ + +@[expose] public section +namespace LocalClassFieldTheory +open CyclicCohomology + +open LocalFieldTheory + +/-! +# Infinite lifting on the normal-basis principal-unit filtration + +This is the recursive core of the local class-field-axiom theorem. The one-step graded +lifting is iterated, its correction factors are multiplied, and completeness +of the local field turns the resulting formal recursion into an actual norm +or coboundary in the initial subgroup. +-/ + +noncomputable +section + +universe u + +open scoped ValuativeRel +open Filter IsNonarchimedeanLocalField +open CyclicCohomology.ProfiniteCohomology.Herbrand + +variable (K L : Type u) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + +omit [UniformSpace L] [IsUniformAddGroup L] [IsNonarchimedeanLocalField L] in +private theorem filteredCorrectionProduct_eq_chosenNormalBasisProduct + (z : Nat → 𝒪[L]ˣ) (d : Nat) : + filteredCorrectionProduct z d = + chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z d := by + induction d with + | zero => rfl + | succ d ih => + rw [filteredCorrectionProduct_succ, + chosenNormalBasisPrincipalUnitCorrectionProduct_succ, ih] + +/-- Recursive `H⁰` lifting. At every sufficiently deep +normal-basis level, an actually fixed unit is the norm of a unit at the same +level. -/ +theorem exists_chosenNormalBasisPrincipalUnit_fixed_is_tateNorm : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + ∃ c : Nat, ∀ n : Nat, c ≤ n → ∀ a : 𝒪[L]ˣ, + a ∈ chosenNormalBasisPrincipalUnitSet K L n → + (∀ sigma : Gal(L/K), sigma • a = a) → + ∃ b : 𝒪[L]ˣ, b ∈ chosenNormalBasisPrincipalUnitSet K L n ∧ + a = tateNorm (Gal(L/K)) 𝒪[L]ˣ b := by + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + rcases exists_chosenNormalBasisPrincipalUnit_h0_oneStep_lifting + (K := K) (L := L) with ⟨cStep, hStep⟩ + rcases exists_tendsto_chosenNormalBasisPrincipalUnitCorrectionProduct + (K := K) (L := L) with ⟨cProd, hProd⟩ + rcases + exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_integerRingFieldSubmodule + (K := K) (L := L) with ⟨b, hb⟩ + refine ⟨max cStep (max cProd (b + 1)), ?_⟩ + intro n hn a ha hfixed + have hcStep : cStep ≤ n := + le_trans (le_max_left cStep (max cProd (b + 1))) hn + have hrest : max cProd (b + 1) ≤ max cStep (max cProd (b + 1)) := + le_max_right cStep (max cProd (b + 1)) + have hcProd : cProd ≤ n := + le_trans (le_trans (le_max_left cProd (b + 1)) hrest) hn + have hbn : b + 1 ≤ n := + le_trans (le_trans (le_max_right cProd (b + 1)) hrest) hn + let P : Nat → 𝒪[L]ˣ → Prop := fun k x => + x ∈ chosenNormalBasisPrincipalUnitSet K L k + let R : 𝒪[L]ˣ → Prop := fun x => + ∀ sigma : Gal(L/K), sigma • x = x + let F : 𝒪[L]ˣ →* 𝒪[L]ˣ := + tateNormHom (G := Gal(L/K)) (A := 𝒪[L]ˣ) + let initial : FilteredLiftState 𝒪[L]ˣ P R n 0 := + ⟨a, by simpa [P] using ha, hfixed⟩ + let step : ∀ i (s : FilteredLiftState 𝒪[L]ˣ P R n i), + Nonempty (FilteredLiftStep 𝒪[L]ˣ P R F n i s) := by + intro i s + have hlevel : cStep ≤ n + i := + le_trans hcStep (Nat.le_add_right n i) + rcases hStep (n + i) hlevel s.value (by simpa [P] using s.mem) + (by simpa [R] using s.stable) with + ⟨z, a', hz, ha', hfixed', heq⟩ + refine ⟨⟨z, ?_, ⟨a', ?_, ?_⟩, ?_⟩⟩ + · simpa [P] using hz + · simpa [P, Nat.add_assoc] using ha' + · simpa [R] using hfixed' + · simpa [F] using heq + let states : (i : Nat) → FilteredLiftState 𝒪[L]ˣ P R n i := + chosenFilteredLiftStateSequence 𝒪[L]ˣ P R F n initial step + let z : Nat → 𝒪[L]ˣ := + chosenFilteredLiftCorrectionSequence 𝒪[L]ˣ P R F n initial step + have hz (i : Nat) : z i ∈ chosenNormalBasisPrincipalUnitSet K L (n + i) := by + exact chosenFilteredLiftCorrectionSequence_mem + 𝒪[L]ˣ P R F n initial step i + rcases hProd n hcProd z hz with ⟨x, hx, hxmem⟩ + have hstates (i : Nat) : + (states i).value ∈ chosenNormalBasisPrincipalUnitSet K L (n + i) := by + exact (states i).mem + have hrem : Tendsto + (fun i : Nat => (((states i).value : 𝒪[L]ˣ) : 𝒪[L])) atTop + (nhds (1 : 𝒪[L])) := + tendsto_chosenNormalBasisPrincipalUnitSequence_one_of_lattice_bound + (K := K) (L := L) hb hbn (fun i => (states i).value) hstates + have hnorm := tendsto_galoisGroupIntegerUnits_tateNorm_of_tendsto + (K := K) (L := L) + (fun d => chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z d) x hx + have hrec (d : Nat) : + a = tateNorm (Gal(L/K)) 𝒪[L]ˣ + (chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z d) * + (states d).value := by + have h := filteredLift_initial_eq_correctionProduct_mul_state + 𝒪[L]ˣ P R F n initial step d + rw [filteredCorrectionProduct_eq_chosenNormalBasisProduct + (L := L) z d] at h + simpa [initial, states, F] using h + have hmul : Tendsto + (fun d : Nat => + ((tateNorm (Gal(L/K)) 𝒪[L]ˣ + (chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z d) : + 𝒪[L]ˣ) : 𝒪[L]) * (((states d).value : 𝒪[L]ˣ) : 𝒪[L])) + atTop + (nhds (((tateNorm (Gal(L/K)) 𝒪[L]ˣ x : 𝒪[L]ˣ) : 𝒪[L]) * 1)) := + hnorm.mul hrem + have hconst : Tendsto (fun _d : Nat => ((a : 𝒪[L]ˣ) : 𝒪[L])) atTop + (nhds ((a : 𝒪[L]ˣ) : 𝒪[L])) := tendsto_const_nhds + have heqO : ((a : 𝒪[L]ˣ) : 𝒪[L]) = + ((tateNorm (Gal(L/K)) 𝒪[L]ˣ x : 𝒪[L]ˣ) : 𝒪[L]) * 1 := by + apply tendsto_nhds_unique hconst + exact hmul.congr' (Eventually.of_forall (fun d => by + simpa using congrArg (fun q : 𝒪[L]ˣ => (q : 𝒪[L])) (hrec d).symm)) + refine ⟨x, hxmem, ?_⟩ + apply Units.ext + simpa using heqO + +/-- Recursive `H⁻¹` lifting. For a chosen generator, +every sufficiently deep norm-one unit is an actual coboundary from the same +normal-basis level. -/ +theorem exists_chosenNormalBasisPrincipalUnit_normOne_is_sigmaMinusOne + (g : Gal(L/K)) (hgen : ∀ sigma : Gal(L/K), + sigma ∈ Subgroup.zpowers g) : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + ∃ c : Nat, ∀ n : Nat, c ≤ n → ∀ a : 𝒪[L]ˣ, + a ∈ chosenNormalBasisPrincipalUnitSet K L n → + tateNorm (Gal(L/K)) 𝒪[L]ˣ a = 1 → + ∃ b : 𝒪[L]ˣ, b ∈ chosenNormalBasisPrincipalUnitSet K L n ∧ + a = sigmaMinusOne (Gal(L/K)) 𝒪[L]ˣ g b := by + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + rcases exists_chosenNormalBasisPrincipalUnit_hMinusOne_oneStep_lifting + (K := K) (L := L) g hgen with ⟨cStep, hStep⟩ + rcases exists_tendsto_chosenNormalBasisPrincipalUnitCorrectionProduct + (K := K) (L := L) with ⟨cProd, hProd⟩ + rcases + exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_integerRingFieldSubmodule + (K := K) (L := L) with ⟨b, hb⟩ + refine ⟨max cStep (max cProd (b + 1)), ?_⟩ + intro n hn a ha hnorma + have hcStep : cStep ≤ n := + le_trans (le_max_left cStep (max cProd (b + 1))) hn + have hrest : max cProd (b + 1) ≤ max cStep (max cProd (b + 1)) := + le_max_right cStep (max cProd (b + 1)) + have hcProd : cProd ≤ n := + le_trans (le_trans (le_max_left cProd (b + 1)) hrest) hn + have hbn : b + 1 ≤ n := + le_trans (le_trans (le_max_right cProd (b + 1)) hrest) hn + let P : Nat → 𝒪[L]ˣ → Prop := fun k x => + x ∈ chosenNormalBasisPrincipalUnitSet K L k + let R : 𝒪[L]ˣ → Prop := fun x => + tateNorm (Gal(L/K)) 𝒪[L]ˣ x = 1 + let F : 𝒪[L]ˣ →* 𝒪[L]ˣ := + sigmaMinusOneHom (G := Gal(L/K)) (A := 𝒪[L]ˣ) g + let initial : FilteredLiftState 𝒪[L]ˣ P R n 0 := + ⟨a, by simpa [P] using ha, hnorma⟩ + let step : ∀ i (s : FilteredLiftState 𝒪[L]ˣ P R n i), + Nonempty (FilteredLiftStep 𝒪[L]ˣ P R F n i s) := by + intro i s + have hlevel : cStep ≤ n + i := + le_trans hcStep (Nat.le_add_right n i) + rcases hStep (n + i) hlevel s.value (by simpa [P] using s.mem) + (by simpa [R] using s.stable) with + ⟨z, a', hz, ha', hnorm', heq⟩ + refine ⟨⟨z, ?_, ⟨a', ?_, ?_⟩, ?_⟩⟩ + · simpa [P] using hz + · simpa [P, Nat.add_assoc] using ha' + · simpa [R] using hnorm' + · simpa [F] using heq + let states : (i : Nat) → FilteredLiftState 𝒪[L]ˣ P R n i := + chosenFilteredLiftStateSequence 𝒪[L]ˣ P R F n initial step + let z : Nat → 𝒪[L]ˣ := + chosenFilteredLiftCorrectionSequence 𝒪[L]ˣ P R F n initial step + have hz (i : Nat) : z i ∈ chosenNormalBasisPrincipalUnitSet K L (n + i) := by + exact chosenFilteredLiftCorrectionSequence_mem + 𝒪[L]ˣ P R F n initial step i + rcases hProd n hcProd z hz with ⟨x, hx, hxmem⟩ + have hstates (i : Nat) : + (states i).value ∈ chosenNormalBasisPrincipalUnitSet K L (n + i) := + (states i).mem + have hrem : Tendsto + (fun i : Nat => (((states i).value : 𝒪[L]ˣ) : 𝒪[L])) atTop + (nhds (1 : 𝒪[L])) := + tendsto_chosenNormalBasisPrincipalUnitSequence_one_of_lattice_bound + (K := K) (L := L) hb hbn (fun i => (states i).value) hstates + have hcob := tendsto_galoisGroupIntegerUnits_sigmaMinusOne_of_tendsto + (K := K) (L := L) g + (fun d => chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z d) x hx + have hrec (d : Nat) : + a = sigmaMinusOne (Gal(L/K)) 𝒪[L]ˣ g + (chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z d) * + (states d).value := by + have h := filteredLift_initial_eq_correctionProduct_mul_state + 𝒪[L]ˣ P R F n initial step d + rw [filteredCorrectionProduct_eq_chosenNormalBasisProduct + (L := L) z d] at h + simpa [initial, states, F] using h + have hmul : Tendsto + (fun d : Nat => + ((sigmaMinusOne (Gal(L/K)) 𝒪[L]ˣ g + (chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z d) : + 𝒪[L]ˣ) : 𝒪[L]) * (((states d).value : 𝒪[L]ˣ) : 𝒪[L])) + atTop + (nhds (((sigmaMinusOne (Gal(L/K)) 𝒪[L]ˣ g x : 𝒪[L]ˣ) : 𝒪[L]) * 1)) := + hcob.mul hrem + have hconst : Tendsto (fun _d : Nat => ((a : 𝒪[L]ˣ) : 𝒪[L])) atTop + (nhds ((a : 𝒪[L]ˣ) : 𝒪[L])) := tendsto_const_nhds + have heqO : ((a : 𝒪[L]ˣ) : 𝒪[L]) = + ((sigmaMinusOne (Gal(L/K)) 𝒪[L]ˣ g x : 𝒪[L]ˣ) : 𝒪[L]) * 1 := by + apply tendsto_nhds_unique hconst + exact hmul.congr' (Eventually.of_forall (fun d => by + simpa using congrArg (fun q : 𝒪[L]ˣ => (q : 𝒪[L])) (hrec d).symm)) + refine ⟨x, hxmem, ?_⟩ + apply Units.ext + simpa using heqO + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/PrincipalUnitGraded.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/PrincipalUnitGraded.lean new file mode 100644 index 0000000000..370290406b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/PrincipalUnitGraded.lean @@ -0,0 +1,264 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLattice +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients +/-! Provides the public declarations in the + `LocalClassFieldTheory.ClassFormation.PrincipalUnitGraded` Lean module. -/ + +@[expose] public section + +namespace LocalClassFieldTheory + +open CyclicCohomology LocalFieldTheory + +noncomputable +section + +universe u + +open scoped ValuativeRel +open IsNonarchimedeanLocalField + +variable (K L : Type u) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [ValuativeRel L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + +omit [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- The map `u ↦ u - 1` on successive normal-basis principal-unit quotients +is injective. Its kernel calculation is exactly the statement that +`u - 1 ∈ π_K^(n+1)M` if and only if `u ∈ V^(n+1)`. -/ +theorem chosenNormalBasisPrincipalUnitSuccQuotToLatticeSuccQuotHom_injective + {n : Nat} {Vn Vsucc : Subgroup 𝒪[L]ˣ} + (hVn : (Vn : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) + (hVsucc : (Vsucc : Set 𝒪[L]ˣ) = + chosenNormalBasisPrincipalUnitSet K L (n + 1)) + (hV : Vsucc ≤ Vn) + (hmul_error : ∀ u : 𝒪[L]ˣ, u ∈ chosenNormalBasisPrincipalUnitSet K L n → + ∀ v : 𝒪[L]ˣ, v ∈ chosenNormalBasisPrincipalUnitSet K L n → + (((((u * v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) - + (((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) + + ((((v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L))) ∈ + chosenBaseUniformizerPowSubmodule K L (n + 1) + (chosenNormalBasisIntegerLattice K L)) : + Function.Injective + (chosenNormalBasisPrincipalUnitSuccQuotToLatticeSuccQuotHom + K L n hVn hVsucc hV hmul_error) := by + rw [← MonoidHom.ker_eq_bot_iff] + apply le_antisymm + · intro q hq + rw [Subgroup.mem_bot] + revert hq + refine + chosenNormalBasisPrincipalUnitSuccQuot.inductionOn + (L := L) hV + (motive := fun q => + q ∈ (chosenNormalBasisPrincipalUnitSuccQuotToLatticeSuccQuotHom + K L n hVn hVsucc hV hmul_error).ker → q = 1) + q ?_ + intro u hu + rw [MonoidHom.mem_ker] at hu + change chosenNormalBasisPrincipalUnitSuccQuotToLatticeSuccQuotHom + K L n hVn hVsucc hV hmul_error + (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV u) = 1 at hu + rw [chosenNormalBasisPrincipalUnitSuccQuotToLatticeSuccQuotHom_mk] at hu + have hu_n : (u : 𝒪[L]ˣ) ∈ chosenNormalBasisPrincipalUnitSet K L n := by + exact hVn ▸ u.2 + have hzero : + chosenNormalBasisPrincipalUnitLatticeClass K L n (u : 𝒪[L]ˣ) hu_n = 0 := by + have h := congrArg + (fun x : Multiplicative (chosenNormalBasisLatticeSuccQuot K L n) => x.toAdd) hu + change + chosenNormalBasisPrincipalUnitLatticeClass K L n (u : 𝒪[L]ˣ) hu_n = 0 at h + exact h + have hu_succ : + (u : 𝒪[L]ˣ) ∈ chosenNormalBasisPrincipalUnitSet K L (n + 1) := + (chosenNormalBasisPrincipalUnitLatticeClass_eq_zero_iff + (K := K) (L := L) (u : 𝒪[L]ˣ) hu_n).1 hzero + change chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV u = 1 + rw [chosenNormalBasisPrincipalUnitSuccQuotMk_eq_one_iff] + change (u : 𝒪[L]ˣ) ∈ (Vsucc : Set 𝒪[L]ˣ) + rw [hVsucc] + exact hu_succ + · exact bot_le + +/-- If the high normal-basis lattice lies in the maximal ideal, every additive +successive-quotient class is represented by a unit `1 + x`; hence the +map `u ↦ u - 1` is surjective. -/ +theorem chosenNormalBasisPrincipalUnitSuccQuotToLatticeSuccQuotHom_surjective_of_le_maximalIdeal + {n : Nat} {Vn Vsucc : Subgroup 𝒪[L]ˣ} + (hVn : (Vn : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) + (hVsucc : (Vsucc : Set 𝒪[L]ˣ) = + chosenNormalBasisPrincipalUnitSet K L (n + 1)) + (hV : Vsucc ≤ Vn) + (hmul_error : ∀ u : 𝒪[L]ˣ, u ∈ chosenNormalBasisPrincipalUnitSet K L n → + ∀ v : 𝒪[L]ˣ, v ∈ chosenNormalBasisPrincipalUnitSet K L n → + (((((u * v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) - + (((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) + + ((((v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L))) ∈ + chosenBaseUniformizerPowSubmodule K L (n + 1) + (chosenNormalBasisIntegerLattice K L)) + (hle : chosenBaseUniformizerPowSubmodule K L n + (chosenNormalBasisIntegerLattice K L) ≤ + maximalIdealFieldSubmodule K L) : + Function.Surjective + (chosenNormalBasisPrincipalUnitSuccQuotToLatticeSuccQuotHom + K L n hVn hVsucc hV hmul_error) := by + intro y + let yadd : chosenNormalBasisLatticeSuccQuot K L n := Multiplicative.toAdd y + suffices ∃ q : chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV, + chosenNormalBasisPrincipalUnitSuccQuotToLatticeSuccQuotHom + K L n hVn hVsucc hV hmul_error q = Multiplicative.ofAdd yadd by + simpa [yadd] using this + refine chosenNormalBasisLatticeSuccQuot.inductionOn K L n + (motive := fun yadd => + ∃ q : chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV, + chosenNormalBasisPrincipalUnitSuccQuotToLatticeSuccQuotHom + K L n hVn hVsucc hV hmul_error q = + Multiplicative.ofAdd yadd) + yadd ?_ + intro x + have hxmax : (x : L) ∈ maximalIdealFieldSubmodule K L := hle x.2 + rcases (mem_maximalIdealFieldSubmodule_iff + (K := K) (L := L) (x : L)).1 hxmax with ⟨a, ha, hax⟩ + have ha_pow : a ∈ (𝓂[L] ^ (1 : Nat) : Ideal 𝒪[L]) := by + simpa using ha + let hunit : IsUnit (1 + a) := + isUnit_one_add_of_mem_maximalIdeal_pow L (n := 1) (by rfl) a ha_pow + let u : 𝒪[L]ˣ := hunit.unit + have huval : ((u : 𝒪[L]ˣ) : 𝒪[L]) = 1 + a := by + exact IsUnit.unit_spec hunit + have hu_sub_one : + (((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) = (x : L)) := by + rw [huval] + simpa using hax + have hu_set : u ∈ chosenNormalBasisPrincipalUnitSet K L n := by + rw [mem_chosenNormalBasisPrincipalUnitSet_iff, hu_sub_one] + exact x.2 + have huVn : u ∈ Vn := by + change u ∈ (Vn : Set 𝒪[L]ˣ) + rw [hVn] + exact hu_set + let ux : Vn := ⟨u, huVn⟩ + refine ⟨chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV ux, ?_⟩ + rw [chosenNormalBasisPrincipalUnitSuccQuotToLatticeSuccQuotHom_mk] + change Multiplicative.ofAdd + (chosenNormalBasisPrincipalUnitLatticeClass K L n u hu_set) = + Multiplicative.ofAdd (chosenNormalBasisLatticeSuccQuotMk K L n x) + congr 1 + rw [chosenNormalBasisPrincipalUnitLatticeClass] + exact congrArg (chosenNormalBasisLatticeSuccQuotMk K L n) + (Subtype.ext hu_sub_one) + +/-- The actual isomorphism +`V^n/V^(n+1) ≃ π_K^nM/π_K^(n+1)M` once the high-lattice bound and +multiplicative-error estimate hold. -/ +noncomputable def chosenNormalBasisPrincipalUnitSuccQuotMulEquivLatticeSuccQuot + {n : Nat} {Vn Vsucc : Subgroup 𝒪[L]ˣ} + (hVn : (Vn : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) + (hVsucc : (Vsucc : Set 𝒪[L]ˣ) = + chosenNormalBasisPrincipalUnitSet K L (n + 1)) + (hV : Vsucc ≤ Vn) + (hmul_error : ∀ u : 𝒪[L]ˣ, u ∈ chosenNormalBasisPrincipalUnitSet K L n → + ∀ v : 𝒪[L]ˣ, v ∈ chosenNormalBasisPrincipalUnitSet K L n → + (((((u * v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) - + (((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) + + ((((v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L))) ∈ + chosenBaseUniformizerPowSubmodule K L (n + 1) + (chosenNormalBasisIntegerLattice K L)) + (hle : chosenBaseUniformizerPowSubmodule K L n + (chosenNormalBasisIntegerLattice K L) ≤ + maximalIdealFieldSubmodule K L) : + chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV ≃* + Multiplicative (chosenNormalBasisLatticeSuccQuot K L n) := + MulEquiv.ofBijective + (chosenNormalBasisPrincipalUnitSuccQuotToLatticeSuccQuotHom + K L n hVn hVsucc hV hmul_error) + ⟨chosenNormalBasisPrincipalUnitSuccQuotToLatticeSuccQuotHom_injective + (K := K) (L := L) hVn hVsucc hV hmul_error, + chosenNormalBasisPrincipalUnitSuccQuotToLatticeSuccQuotHom_surjective_of_le_maximalIdeal + (K := K) (L := L) hVn hVsucc hV hmul_error hle⟩ + +/-- States the theorem `chosenNormalBasisPrincipalUnitSuccQuotMulEquivLatticeSuccQuot_mk`. -/ +@[simp] +theorem chosenNormalBasisPrincipalUnitSuccQuotMulEquivLatticeSuccQuot_mk + {n : Nat} {Vn Vsucc : Subgroup 𝒪[L]ˣ} + (hVn : (Vn : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) + (hVsucc : (Vsucc : Set 𝒪[L]ˣ) = + chosenNormalBasisPrincipalUnitSet K L (n + 1)) + (hV : Vsucc ≤ Vn) + (hmul_error : ∀ u : 𝒪[L]ˣ, u ∈ chosenNormalBasisPrincipalUnitSet K L n → + ∀ v : 𝒪[L]ˣ, v ∈ chosenNormalBasisPrincipalUnitSet K L n → + (((((u * v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) - + (((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) + + ((((v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L))) ∈ + chosenBaseUniformizerPowSubmodule K L (n + 1) + (chosenNormalBasisIntegerLattice K L)) + (hle : chosenBaseUniformizerPowSubmodule K L n + (chosenNormalBasisIntegerLattice K L) ≤ + maximalIdealFieldSubmodule K L) + (u : Vn) : + chosenNormalBasisPrincipalUnitSuccQuotMulEquivLatticeSuccQuot + K L hVn hVsucc hV hmul_error hle + (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV u) = + Multiplicative.ofAdd + (chosenNormalBasisPrincipalUnitLatticeClass K L n (u : 𝒪[L]ˣ) + (by exact hVn ▸ u.2)) := + rfl + +/-- Existential high-degree boundary used in the proof of the local class-field-axiom theorem: +for every sufficiently large `n`, the actual successive principal-unit +quotient is isomorphic to the corresponding normal-basis lattice quotient. -/ +theorem exists_chosenNormalBasisPrincipalUnitSuccQuotMulEquivLatticeSuccQuot + [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Module.Finite 𝒪[K] 𝒪[L]] : + ∃ c : Nat, ∀ n : Nat, c ≤ n → + ∃ Vn Vsucc : Subgroup 𝒪[L]ˣ, + ∃ hV : Vsucc ≤ Vn, + ∃ hVn : (Vn : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n, + (Vsucc : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L (n + 1) ∧ + ∃ Φ : chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV ≃* + Multiplicative (chosenNormalBasisLatticeSuccQuot K L n), + Vn ≤ principalUnits L 1 ∧ + ∀ u : Vn, + Φ (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV u) = + Multiplicative.ofAdd + (chosenNormalBasisPrincipalUnitLatticeClass K L n + (u : 𝒪[L]ˣ) (by exact hVn ▸ u.2)) := by + rcases exists_chosenNormalBasisPrincipalUnitSubgroupSuccPair + (K := K) (L := L) with ⟨c₁, hc₁⟩ + rcases exists_chosenNormalBasisPrincipalUnitSet_mul_error_mem_succ + (K := K) (L := L) with ⟨c₂, hc₂⟩ + rcases + exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_maximalIdeal_and_mul_closed + (K := K) (L := L) with ⟨c₃, hc₃⟩ + refine ⟨max c₁ (max c₂ c₃), ?_⟩ + intro n hn + have hc₁n : c₁ ≤ n := + le_trans (le_max_left c₁ (max c₂ c₃)) hn + have hcrest : max c₂ c₃ ≤ max c₁ (max c₂ c₃) := + le_max_right c₁ (max c₂ c₃) + have hc₂n : c₂ ≤ n := + le_trans (le_trans (le_max_left c₂ c₃) hcrest) hn + have hc₃n : c₃ ≤ n := + le_trans (le_trans (le_max_right c₂ c₃) hcrest) hn + rcases hc₁ n hc₁n with ⟨Vn, Vsucc, hVn, hVsucc, hV, hVnle⟩ + let hmul_error := hc₂ n hc₂n + let hle := (hc₃ n hc₃n).1 + let Φ : chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV ≃* + Multiplicative (chosenNormalBasisLatticeSuccQuot K L n) := + chosenNormalBasisPrincipalUnitSuccQuotMulEquivLatticeSuccQuot + K L hVn hVsucc hV hmul_error hle + refine ⟨Vn, Vsucc, hV, hVn, hVsucc, Φ, hVnle, ?_⟩ + intro u + rfl + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean new file mode 100644 index 0000000000..6342c309ee --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean @@ -0,0 +1,287 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing +/-! Provides the public declarations in the `LocalClassFieldTheory.ClassFormation.Valuation` + Lean module. -/ + +@[expose] public section + +namespace LocalClassFieldTheory + +open LocalFieldTheory + +noncomputable +section + +universe u + +open scoped ValuativeRel +open IsNonarchimedeanLocalField + +/-- The actual `Gal(L / K)` action on field units, obtained by applying each +field automorphism to a unit. -/ +@[implicit_reducible] +def galoisGroupFieldUnitsMulDistribMulAction + (K L : Type u) [Field K] [Field L] [Algebra K L] : + MulDistribMulAction (Gal(L/K)) Lˣ where + smul σ x := Units.mapEquiv σ.toMulEquiv x + one_smul := by + intro x + ext + rfl + mul_smul := by + intro σ τ x + ext + rfl + smul_mul := by + intro σ x y + exact map_mul (Units.mapEquiv σ.toMulEquiv) x y + smul_one := by + intro σ + exact map_one (Units.mapEquiv σ.toMulEquiv) + +/-- States the theorem `galoisGroupFieldUnitsMulDistribMulAction_smul`. -/ +@[simp] +theorem galoisGroupFieldUnitsMulDistribMulAction_smul + (K L : Type u) [Field K] [Field L] [Algebra K L] + (σ : Gal(L/K)) (x : Lˣ) : + letI := galoisGroupFieldUnitsMulDistribMulAction K L + σ • x = Units.mapEquiv σ.toMulEquiv x := + rfl + +/-- The actual `Gal(L / K)` action on integer units. Its source is the +restriction of the field automorphism to the integral closure `𝒪[L]`. -/ +@[implicit_reducible] +def galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + MulDistribMulAction (Gal(L/K)) 𝒪[L]ˣ where + smul σ x := Units.mapEquiv + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ).toMulEquiv x + one_smul := by + intro x + ext + rfl + mul_smul := by + intro σ τ x + ext + rfl + smul_mul := by + intro σ x y + exact map_mul + (Units.mapEquiv + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ).toMulEquiv) x y + smul_one := by + intro σ + exact map_one + (Units.mapEquiv + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ).toMulEquiv) + +/-- States the theorem `galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure_smul`. -/ +@[simp] +theorem galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure_smul + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (σ : Gal(L/K)) (x : 𝒪[L]ˣ) : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + σ • x = Units.mapEquiv + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ).toMulEquiv x := + rfl + +/-- The trivial Galois action on the value group `ℤ`, written +multiplicatively so that it is a multiplicative Galois module. -/ +@[implicit_reducible] +def galoisGroupValueGroupMulDistribMulAction + (K L : Type u) [Field K] [Field L] [Algebra K L] : + MulDistribMulAction (Gal(L/K)) (Multiplicative Int) where + smul _ n := n + one_smul := by intro n; rfl + mul_smul := by intro _ _ n; rfl + smul_mul := by intro _ m n; rfl + smul_one := by intro _; rfl + +/-- States the theorem `galoisGroupValueGroupMulDistribMulAction_smul`. -/ +@[simp] +theorem galoisGroupValueGroupMulDistribMulAction_smul + (K L : Type u) [Field K] [Field L] [Algebra K L] + (σ : Gal(L/K)) (n : Multiplicative Int) : + letI := galoisGroupValueGroupMulDistribMulAction K L + σ • n = n := + rfl + +/-- The inclusion `𝒪_Lˣ → Lˣ` is equivariant for the actual actions. -/ +theorem integerUnitsToFieldUnits_galoisGroup_equivariant + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (σ : Gal(L/K)) (x : 𝒪[L]ˣ) : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + letI := galoisGroupFieldUnitsMulDistribMulAction K L + integerUnitsToFieldUnits L (σ • x) = + σ • integerUnitsToFieldUnits L x := by + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + let := galoisGroupFieldUnitsMulDistribMulAction K L + ext + rfl + +/-- A Galois automorphism preserves the normalized additive valuation. The +proof uses only the actual integral-closure restriction to `𝒪_L`, the DVR +normalization of an irreducible uniformizer, and the unit--uniformizer +decomposition of `Lˣ`; no extension-invariant package is assumed. -/ +theorem valuationMap_unitsMapEquiv_galoisGroup + (K L : Type u) [Field K] [ValuativeRel K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (σ : Gal(L/K)) (x : Lˣ) : + valuationMap L + (Additive.ofMul (Units.mapEquiv σ.toMulEquiv x)) = + valuationMap L (Additive.ofMul x) := by + let e : 𝒪[L] ≃+* 𝒪[L] := galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ + let πO : 𝒪[L] := chosenIntegerRingUniformizer L + let π : Lˣ := integerRingUniformizerFieldUnit L + let σπ : Lˣ := Units.mapEquiv σ.toMulEquiv π + have heπO : Irreducible (e πO) := + (MulEquiv.irreducible_iff e.toMulEquiv).2 + (chosenIntegerRingUniformizer_irreducible L) + have hσπ : (σπ : L) = ((e πO : 𝒪[L]) : L) := by + rfl + have hvσπ : v L (Additive.ofMul σπ) = -1 := + v_integerRingIrreducibleFieldUnit L (e πO) heπO σπ hσπ + have hvσπinv : v L (Additive.ofMul σπ⁻¹) = 1 := by + rw [v_inv, hvσπ] + norm_num + let ϖ : Lˣ := inverseIntegerRingUniformizerFieldUnit L + have hmapϖ : Units.mapEquiv σ.toMulEquiv ϖ = σπ⁻¹ := by + ext + rfl + have hvmapϖ : + v L (Additive.ofMul (Units.mapEquiv σ.toMulEquiv ϖ)) = 1 := by + rw [hmapϖ] + exact hvσπinv + have hϖ : valuationMap L (Additive.ofMul ϖ) = 1 := by + exact v_inverseIntegerRingUniformizerFieldUnit L + let n : Int := valuationMap L (Additive.ofMul x) + let u : 𝒪[L]ˣ := uniformizerUnitFactor L ϖ hϖ x + let σu : 𝒪[L]ˣ := Units.mapEquiv e.toMulEquiv u + have hmapu : + Units.mapEquiv σ.toMulEquiv (integerUnitsToFieldUnits L u) = + integerUnitsToFieldUnits L σu := by + ext + rfl + have hvmapu : + v L (Additive.ofMul + (Units.mapEquiv σ.toMulEquiv (integerUnitsToFieldUnits L u))) = 0 := by + rw [hmapu] + exact v_integerUnitsToFieldUnits L σu + have hx : integerUnitsToFieldUnits L u * ϖ ^ n = x := by + simp [u, n] + have hxσ : + Units.mapEquiv σ.toMulEquiv x = + Units.mapEquiv σ.toMulEquiv (integerUnitsToFieldUnits L u) * + (Units.mapEquiv σ.toMulEquiv ϖ) ^ n := by + calc + Units.mapEquiv σ.toMulEquiv x = + Units.mapEquiv σ.toMulEquiv + (integerUnitsToFieldUnits L u * ϖ ^ n) := + congrArg (Units.mapEquiv σ.toMulEquiv) hx.symm + _ = Units.mapEquiv σ.toMulEquiv (integerUnitsToFieldUnits L u) * + (Units.mapEquiv σ.toMulEquiv ϖ) ^ n := by + simp only [map_mul, map_zpow] + rw [valuationMap_apply, valuationMap_apply, hxσ, v_mul, v_zpow, + hvmapu, hvmapϖ, mul_one, zero_add] + rfl + +/-- The normalized valuation on `Lˣ` is equivariant for the actual Galois +action and the trivial action on its value group. -/ +theorem valuationUnitsMulHom_galoisGroup_equivariant + (K L : Type u) [Field K] [ValuativeRel K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (σ : Gal(L/K)) (x : Lˣ) : + letI := galoisGroupFieldUnitsMulDistribMulAction K L + letI := galoisGroupValueGroupMulDistribMulAction K L + valuationUnitsMulHom L (σ • x) = + σ • valuationUnitsMulHom L x := by + let := galoisGroupFieldUnitsMulDistribMulAction K L + let := galoisGroupValueGroupMulDistribMulAction K L + exact congrArg Multiplicative.ofAdd + (valuationMap_unitsMapEquiv_galoisGroup K L σ x) + +/-- Multiplicative and additive presentations of valuation-one/valuation-zero +agree for a field unit. -/ +theorem valuationUnitsMulHom_eq_one_iff_valuationMap_eq_zero + (L : Type u) [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] (x : Lˣ) : + valuationUnitsMulHom L x = 1 ↔ + valuationMap L (Additive.ofMul x) = 0 := by + change valuationUnitsMulHom L x = 1 ↔ + Multiplicative.toAdd (valuationUnitsMulHom L x) = 0 + constructor + · intro hx + exact congrArg Multiplicative.toAdd hx + · intro hx + apply Multiplicative.toAdd.injective + exact hx + +/-- Exactness at `Lˣ`: the kernel of normalized valuation consists exactly +of the units of the valuation integer ring. -/ +theorem valuationUnitsMulHom_eq_one_iff_exists_integerUnit + (L : Type u) [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] (x : Lˣ) : + valuationUnitsMulHom L x = 1 ↔ + ∃ y : 𝒪[L]ˣ, integerUnitsToFieldUnits L y = x := by + rw [valuationUnitsMulHom_eq_one_iff_valuationMap_eq_zero] + constructor + · intro hx + exact + (integerUnitsToFieldUnits_mem_range_iff_valuationMap_eq_zero L x).2 hx + · rintro ⟨y, rfl⟩ + exact + (integerUnitsToFieldUnits_mem_range_iff_valuationMap_eq_zero L + (integerUnitsToFieldUnits L y)).1 ⟨y, rfl⟩ + +/-- Exactness of the multiplicative valuation sequence at `Lˣ`, stated as +the equality of the actual range and kernel subgroups. -/ +theorem integerUnitsToFieldUnits_range_eq_ker_valuationUnitsMulHom + (L : Type u) [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] : + MonoidHom.range (integerUnitsToFieldUnits L) = + MonoidHom.ker (valuationUnitsMulHom L) := by + ext x + change (∃ y : 𝒪[L]ˣ, integerUnitsToFieldUnits L y = x) ↔ + valuationUnitsMulHom L x = 1 + exact (valuationUnitsMulHom_eq_one_iff_exists_integerUnit L x).symm + +/-- The multiplicative normalized valuation `Lˣ → Multiplicative ℤ` is +surjective. -/ +theorem valuationUnitsMulHom_surjective + (L : Type u) [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] : + Function.Surjective (valuationUnitsMulHom L) := by + intro n + rcases valuationMap_surjective L (Multiplicative.toAdd n) with ⟨x, hx⟩ + refine ⟨Additive.toMul x, ?_⟩ + change Multiplicative.ofAdd (valuationMap L x) = n + rw [hx] + rfl + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean new file mode 100644 index 0000000000..5a513072de --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean @@ -0,0 +1,149 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValueGroupCohomology + +/-! # Valuation Herbrand -/ + +@[expose] public section +namespace LocalClassFieldTheory + +open LocalFieldTheory + +open CyclicCohomology + +/-! +# The valuation sequence and Herbrand quotients + +This file applies the Herbrand-quotient multiplicativity theorem to the actual +valuation sequence from integer units through field units to the value group. + +All three actions are the concrete actions from `ValuationReal`: the Galois +action on integer and field units, and the trivial action on the value group. +-/ + +noncomputable +section + +open scoped ValuativeRel +open CyclicCohomology.ProfiniteCohomology.Herbrand +open IsNonarchimedeanLocalField + +variable (K L : Type) [Field K] [ValuativeRel K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure (ValuativeRel.valuation L).integer + (ValuativeRel.valuation K).integer L] + +omit [FiniteDimensional K L] in +/-- The actual valuation sequence has equivariant maps, is exact at field +units, is injective on integer units, and is surjective onto the value group. -/ +theorem valuationHerbrand_shortExact : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + letI := galoisGroupFieldUnitsMulDistribMulAction K L + letI := galoisGroupValueGroupMulDistribMulAction K L + (∀ (σ : Gal(L/K)) (x : (ValuativeRel.valuation L).integerˣ), + integerUnitsToFieldUnits L (σ • x) = + σ • integerUnitsToFieldUnits L x) ∧ + (∀ (σ : Gal(L/K)) (x : Lˣ), + valuationUnitsMulHom L (σ • x) = + σ • valuationUnitsMulHom L x) ∧ + (∀ x : Lˣ, valuationUnitsMulHom L x = 1 ↔ + ∃ y : (ValuativeRel.valuation L).integerˣ, + integerUnitsToFieldUnits L y = x) ∧ + Function.Injective (integerUnitsToFieldUnits L) ∧ + Function.Surjective (valuationUnitsMulHom L) := by + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + let := galoisGroupFieldUnitsMulDistribMulAction K L + let := galoisGroupValueGroupMulDistribMulAction K L + exact ⟨integerUnitsToFieldUnits_galoisGroup_equivariant K L, + valuationUnitsMulHom_galoisGroup_equivariant K L, + valuationUnitsMulHom_eq_one_iff_exists_integerUnit L, + integerUnitsToFieldUnits_injective L, + valuationUnitsMulHom_surjective L⟩ + +omit [ValuativeRel K] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure (ValuativeRel.valuation L).integer + (ValuativeRel.valuation K).integer L] in +/-- The Herbrand quotient of the trivially acted-on value group is defined: +its degree-zero group is finite cyclic and its degree-minus-one group is +trivial. -/ +theorem galoisGroupValueGroup_herbrandQuotientDefined + (g : Gal(L/K)) : + letI := galoisGroupValueGroupMulDistribMulAction K L + HerbrandQuotientDefined (Gal(L/K)) (Multiplicative Int) g := by + exact ⟨galoisGroupValueGroupHerbrandH0Finite K L, + galoisGroupValueGroupHerbrandHMinusOneFinite K L g⟩ + +/-- Herbrand-quotient multiplicativity for the actual valuation sequence. Once the +Herbrand quotient of the integer-unit term is defined, the value-group term +is already defined by `galoisGroupValueGroup_herbrandQuotientDefined`; hence the +field-unit quotient is defined and + +`h(G,Lˣ) = h(G,(valuation integer ring of L)ˣ) * h(G,ℤ)`. + +The only non-derived finiteness input is `hU`, the two finite low-degree +Herbrand quotients for the actual integer-unit action. -/ +theorem valuationHerbrand_multiplicativity_of_integerUnits_defined + (g : Gal(L/K)) + (hg : ∀ σ : Gal(L/K), σ ∈ Subgroup.zpowers g) + (hU : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + HerbrandQuotientDefined (Gal(L/K)) + (ValuativeRel.valuation L).integerˣ g) : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + letI := galoisGroupFieldUnitsMulDistribMulAction K L + letI := galoisGroupValueGroupMulDistribMulAction K L + ∃ _ : HerbrandQuotientDefined (Gal(L/K)) Lˣ g, + @herbrandQuotient (Gal(L/K)) Lˣ _ _ _ + (galoisGroupFieldUnitsMulDistribMulAction K L) g = + @herbrandQuotient (Gal(L/K)) + (ValuativeRel.valuation L).integerˣ _ _ _ + (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) + g * + @herbrandQuotient (Gal(L/K)) (Multiplicative Int) _ _ _ + (galoisGroupValueGroupMulDistribMulAction K L) g := by + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + let := galoisGroupFieldUnitsMulDistribMulAction K L + let := galoisGroupValueGroupMulDistribMulAction K L + let hZ : HerbrandQuotientDefined (Gal(L/K)) (Multiplicative Int) g := + galoisGroupValueGroup_herbrandQuotientDefined K L g + let hseq := valuationHerbrand_shortExact K L + let hField := herbrandQuotientDefined_middle_of_left_right + (G := Gal(L/K)) + (A := (ValuativeRel.valuation L).integerˣ) + (B := Lˣ) (C := Multiplicative Int) + (integerUnitsToFieldUnits L) (valuationUnitsMulHom L) + hseq.1 hseq.2.1 hseq.2.2.1 hseq.2.2.2.1 hseq.2.2.2.2 + g hg hU hZ + refine ⟨hField, ?_⟩ + let : Finite + (HerbrandH0 (Gal(L/K)) (ValuativeRel.valuation L).integerˣ) := hU.1 + let : Finite + (HerbrandHMinusOne (Gal(L/K)) + (ValuativeRel.valuation L).integerˣ g) := hU.2 + let : Finite (HerbrandH0 (Gal(L/K)) Lˣ) := hField.1 + let : Finite (HerbrandHMinusOne (Gal(L/K)) Lˣ g) := hField.2 + let : Finite + (HerbrandH0 (Gal(L/K)) (Multiplicative Int)) := hZ.1 + let : Finite + (HerbrandHMinusOne (Gal(L/K)) (Multiplicative Int) g) := hZ.2 + exact herbrandQuotient_multiplicative_of_shortExact + (G := Gal(L/K)) + (A := (ValuativeRel.valuation L).integerˣ) + (B := Lˣ) (C := Multiplicative Int) + (integerUnitsToFieldUnits L) (valuationUnitsMulHom L) + hseq.1 hseq.2.1 hseq.2.2.1 hseq.2.2.2.1 hseq.2.2.2.2 + g hg + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValueGroupCohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValueGroupCohomology.lean new file mode 100644 index 0000000000..2d2887cf50 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValueGroupCohomology.lean @@ -0,0 +1,238 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import Mathlib.Data.ZMod.QuotientGroup +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation +/-! Provides the public declarations in the + `LocalClassFieldTheory.ClassFormation.ValueGroupCohomology` Lean module. -/ + +@[expose] public section + +namespace LocalClassFieldTheory + +open LocalFieldTheory + +open CyclicCohomology + +noncomputable +section + +open scoped BigOperators + +universe u + +open CyclicCohomology.ProfiniteCohomology.Herbrand + +variable (K L : Type u) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + +/-- On the trivially acted-on value group, the finite-group norm is +multiplication by the order of the Galois group. -/ +theorem galoisGroupValueGroup_tateNorm_toAdd (a : Multiplicative Int) : + letI := galoisGroupValueGroupMulDistribMulAction K L + Multiplicative.toAdd + (tateNorm (Gal(L/K)) (Multiplicative Int) a) = + (Fintype.card (Gal(L/K)) : Int) * Multiplicative.toAdd a := by + let := galoisGroupValueGroupMulDistribMulAction K L + have hnorm : tateNorm (Gal(L/K)) (Multiplicative Int) a = + a ^ Fintype.card (Gal(L/K)) := by + simp only [tateNorm, galoisGroupValueGroupMulDistribMulAction_smul, + Finset.prod_const, Finset.card_univ] + simpa only [toAdd_pow, nsmul_eq_mul] using + congrArg Multiplicative.toAdd hnorm + +/-- Reduction modulo `|G|` on the fixed subgroup of the trivial value-group +module. -/ +def galoisGroupValueGroupFixedToZModHom : + letI := galoisGroupValueGroupMulDistribMulAction K L + fixedSubgroup (Gal(L/K)) (Multiplicative Int) →* + Multiplicative (ZMod (Fintype.card (Gal(L/K)))) := by + letI := galoisGroupValueGroupMulDistribMulAction K L + exact + { toFun := fun x => Multiplicative.ofAdd + ((Multiplicative.toAdd (x : Multiplicative Int) : Int) : + ZMod (Fintype.card (Gal(L/K)))) + map_one' := by simp + map_mul' := by + intro x y + simp } + +/-- States the theorem `galoisGroupValueGroupFixedToZModHom_surjective`. -/ +theorem galoisGroupValueGroupFixedToZModHom_surjective : + letI := galoisGroupValueGroupMulDistribMulAction K L + Function.Surjective (galoisGroupValueGroupFixedToZModHom K L) := by + let := galoisGroupValueGroupMulDistribMulAction K L + intro y + rcases ZMod.intCast_surjective (Multiplicative.toAdd y) with ⟨z, hz⟩ + let x : fixedSubgroup (Gal(L/K)) (Multiplicative Int) := + ⟨Multiplicative.ofAdd z, by intro σ; rfl⟩ + refine ⟨x, ?_⟩ + rw [show galoisGroupValueGroupFixedToZModHom K L x = + Multiplicative.ofAdd + ((z : Int) : ZMod (Fintype.card (Gal(L/K)))) by rfl] + exact congrArg Multiplicative.ofAdd hz + +/-- The kernel of reduction modulo `|G|` is exactly the norm subgroup inside +the fixed subgroup. -/ +theorem galoisGroupValueGroupFixedToZModHom_ker : + letI := galoisGroupValueGroupMulDistribMulAction K L + MonoidHom.ker (galoisGroupValueGroupFixedToZModHom K L) = + (tateNormSubgroup (Gal(L/K)) (Multiplicative Int)).subgroupOf + (fixedSubgroup (Gal(L/K)) (Multiplicative Int)) := by + let := galoisGroupValueGroupMulDistribMulAction K L + ext x + rw [MonoidHom.mem_ker] + constructor + · intro hx + have hx0 : + ((Multiplicative.toAdd (x : Multiplicative Int) : Int) : + ZMod (Fintype.card (Gal(L/K)))) = 0 := by + exact congrArg Multiplicative.toAdd hx + rcases (ZMod.intCast_zmod_eq_zero_iff_dvd _ _).1 hx0 with ⟨z, hz⟩ + change (x : Multiplicative Int) ∈ + tateNormSubgroup (Gal(L/K)) (Multiplicative Int) + refine ⟨Multiplicative.ofAdd z, ?_⟩ + have htoAdd : + Multiplicative.toAdd + (tateNorm (Gal(L/K)) (Multiplicative Int) + (Multiplicative.ofAdd z)) = + Multiplicative.toAdd (x : Multiplicative Int) := by + rw [galoisGroupValueGroup_tateNorm_toAdd] + exact hz.symm + exact congrArg Multiplicative.ofAdd htoAdd + · intro hx + change (x : Multiplicative Int) ∈ + tateNormSubgroup (Gal(L/K)) (Multiplicative Int) at hx + rcases hx with ⟨z, hz⟩ + rw [tateNormHom_apply] at hz + exact congrArg Multiplicative.ofAdd (by + change + ((Multiplicative.toAdd (x : Multiplicative Int) : Int) : + ZMod (Fintype.card (Gal(L/K)))) = 0 + rw [← hz, galoisGroupValueGroup_tateNorm_toAdd] + apply (ZMod.intCast_zmod_eq_zero_iff_dvd _ _).2 + exact ⟨Multiplicative.toAdd z, rfl⟩) + +/-- The actual custom Tate `H⁰` of the trivial value group is `Z/|G|Z`. -/ +noncomputable def galoisGroupValueGroupHerbrandH0MulEquivZMod : + letI := galoisGroupValueGroupMulDistribMulAction K L + HerbrandH0 (Gal(L/K)) (Multiplicative Int) ≃* + Multiplicative (ZMod (Fintype.card (Gal(L/K)))) := by + letI := galoisGroupValueGroupMulDistribMulAction K L + exact + (HerbrandH0.equiv + (G := Gal(L/K)) (A := Multiplicative Int)).trans + ((QuotientGroup.quotientMulEquivOfEq + (galoisGroupValueGroupFixedToZModHom_ker K L).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (galoisGroupValueGroupFixedToZModHom K L) + (galoisGroupValueGroupFixedToZModHom_surjective K L))) + +/-- Finiteness of value-group `H⁰`, derived from its explicit cyclic +description rather than assumed as an extra hypothesis. -/ +theorem galoisGroupValueGroupHerbrandH0Finite : + letI := galoisGroupValueGroupMulDistribMulAction K L + Finite (HerbrandH0 (Gal(L/K)) (Multiplicative Int)) := by + let := galoisGroupValueGroupMulDistribMulAction K L + exact Finite.of_equiv + (Multiplicative (ZMod (Fintype.card (Gal(L/K))))) + (galoisGroupValueGroupHerbrandH0MulEquivZMod K L).symm.toEquiv + +/-- Value-group factor for the local class-field axiom: `#H⁰(G,ℤ)=|G|`. -/ +theorem galoisGroupValueGroup_herbrandH0_card : + letI := galoisGroupValueGroupMulDistribMulAction K L + letI := galoisGroupValueGroupHerbrandH0Finite K L + Nat.card (HerbrandH0 (Gal(L/K)) (Multiplicative Int)) = + Fintype.card (Gal(L/K)) := by + let := galoisGroupValueGroupMulDistribMulAction K L + rw [Nat.card_congr (galoisGroupValueGroupHerbrandH0MulEquivZMod K L).toEquiv] + simp + +/-- For a finite Galois extension, the value-group factor is the extension +degree appearing in the local class-field-axiom theorem. -/ +theorem galoisGroupValueGroup_herbrandH0_card_eq_finrank [IsGalois K L] : + letI := galoisGroupValueGroupMulDistribMulAction K L + letI := galoisGroupValueGroupHerbrandH0Finite K L + Nat.card (HerbrandH0 (Gal(L/K)) (Multiplicative Int)) = + Module.finrank K L := by + let := galoisGroupValueGroupMulDistribMulAction K L + rw [galoisGroupValueGroup_herbrandH0_card K L] + exact Fintype.card_eq_nat_card.trans (IsGalois.card_aut_eq_finrank K L) + +/-- The norm kernel of the trivial torsion-free value group is zero. -/ +theorem galoisGroupValueGroup_normKernelSubgroup_eq_bot : + letI := galoisGroupValueGroupMulDistribMulAction K L + normKernelSubgroup (Gal(L/K)) (Multiplicative Int) = ⊥ := by + let := galoisGroupValueGroupMulDistribMulAction K L + apply le_antisymm + · intro x hx + rw [Subgroup.mem_bot] + exact congrArg Multiplicative.ofAdd (by + change Multiplicative.toAdd (x : Multiplicative Int) = 0 + have hnorm : + (Fintype.card (Gal(L/K)) : Int) * + Multiplicative.toAdd (x : Multiplicative Int) = 0 := by + rw [← galoisGroupValueGroup_tateNorm_toAdd K L] + exact congrArg Multiplicative.toAdd hx + exact (mul_eq_zero.mp hnorm).resolve_left (by + exact_mod_cast Fintype.card_ne_zero)) + · exact bot_le + +/-- Finiteness of value-group `H⁻¹`, derived from the vanishing of its +norm kernel. -/ +theorem galoisGroupValueGroupHerbrandHMinusOneFinite + (σ : Gal(L/K)) : + letI := galoisGroupValueGroupMulDistribMulAction K L + Finite + (HerbrandHMinusOne (Gal(L/K)) (Multiplicative Int) σ) := by + let := galoisGroupValueGroupMulDistribMulAction K L + have : Subsingleton + (normKernelSubgroup (Gal(L/K)) (Multiplicative Int)) := by + rw [galoisGroupValueGroup_normKernelSubgroup_eq_bot K L] + infer_instance + let : Subsingleton + (HerbrandHMinusOne (Gal(L/K)) (Multiplicative Int) σ) := + ⟨fun q => + HerbrandHMinusOne.inductionOn σ + (motive := fun q => ∀ r, q = r) q fun x r => + HerbrandHMinusOne.inductionOn σ + (motive := fun r => HerbrandHMinusOne.mk σ x = r) r fun y => + congrArg (fun z => HerbrandHMinusOne.mk σ z) + (Subsingleton.elim x y)⟩ + exact Finite.of_injective + (fun _ : HerbrandHMinusOne (Gal(L/K)) + (Multiplicative Int) σ => false) + (fun x y _ => Subsingleton.elim x y) + +/-- Value-group factor for the local class-field axiom: `H⁻¹(G,ℤ)` is trivial. -/ +theorem galoisGroupValueGroup_herbrandHMinusOne_card_eq_one + (σ : Gal(L/K)) : + letI := galoisGroupValueGroupMulDistribMulAction K L + letI := galoisGroupValueGroupHerbrandHMinusOneFinite K L σ + Nat.card + (HerbrandHMinusOne (Gal(L/K)) (Multiplicative Int) σ) = 1 := by + let := galoisGroupValueGroupMulDistribMulAction K L + have : Subsingleton + (normKernelSubgroup (Gal(L/K)) (Multiplicative Int)) := by + rw [galoisGroupValueGroup_normKernelSubgroup_eq_bot K L] + infer_instance + let : Subsingleton + (HerbrandHMinusOne (Gal(L/K)) (Multiplicative Int) σ) := + ⟨fun q => + HerbrandHMinusOne.inductionOn σ + (motive := fun q => ∀ r, q = r) q fun x r => + HerbrandHMinusOne.inductionOn σ + (motive := fun r => HerbrandHMinusOne.mk σ x = r) r fun y => + congrArg (fun z => HerbrandHMinusOne.mk σ z) + (Subsingleton.elim x y)⟩ + exact Nat.card_unique + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite.lean new file mode 100644 index 0000000000..6a60df9abc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Conductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.UnramifiedConductor + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/All.lean new file mode 100644 index 0000000000..ce2ed4b176 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/All.lean @@ -0,0 +1,22 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Conductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.UnramifiedConductor +/-! +# Finite local reciprocity + +Public focused entry point for finite local reciprocity, local conductors, the +local Artin map, and the unconditional finite local existence order +isomorphism. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Conductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Conductor.lean new file mode 100644 index 0000000000..d39978d0d0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Conductor.lean @@ -0,0 +1,147 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups +public import Mathlib.FieldTheory.Galois.Abelian +/-! +# Conductors of finite abelian local extensions + +For a finite abelian extension `L / K`, define its conductor exponent as the +least `n ≥ 0` for which the `n`-th principal-unit group of +`K` lies in the norm subgroup. The conductor itself is the corresponding +power of the maximal ideal of the valuation ring of `K`. + +The existence of this least exponent is not an extra hypothesis here. It +follows from openness of the norm subgroup of the actual finite extension and +the principal-unit neighbourhood basis. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open scoped ValuativeRel +open LocalFieldTheory + +/-- The field-level principal-unit filtration is antitone in its exponent. -/ +theorem fieldPrincipalUnits_antitone + (K : Type) [Field K] [ValuativeRel K] + {m n : ℕ} (hmn : m ≤ n) : + LocalFieldTheory.fieldPrincipalUnits K n ≤ LocalFieldTheory.fieldPrincipalUnits K m := + Subgroup.map_mono (principalUnits_antitone K hmn) + +/-- For an actual finite abelian local extension, some principal-unit group +is contained in its norm subgroup. This supplies the least conductor +exponent. -/ +theorem exists_fieldPrincipalUnits_le_normSubgroup + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + ∃ n : ℕ, LocalFieldTheory.fieldPrincipalUnits K n ≤ localNormSubgroup K L := by + obtain ⟨n, _hn, hle⟩ := + LocalFieldTheory.exists_fieldPrincipalUnits_le_of_isOpen K (localNormSubgroup K L) + (LocalClassFieldTheory.localNormSubgroup_isOpen K L) + exact ⟨n, hle⟩ + +/-- The least principal-unit depth contained in the norm subgroup of the +finite abelian extension `L / K`. -/ +def localConductorExponent + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : ℕ := by + classical + exact Nat.find (exists_fieldPrincipalUnits_le_normSubgroup K L) + +/-- The principal-unit group at the conductor exponent is contained in the +norm subgroup. -/ +theorem localConductorExponent_spec + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + LocalFieldTheory.fieldPrincipalUnits K (localConductorExponent K L) ≤ + localNormSubgroup K L := by + classical + exact Nat.find_spec (exists_fieldPrincipalUnits_le_normSubgroup K L) + +/-- Minimality of the conductor exponent. -/ +theorem localConductorExponent_min + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + {n : ℕ} (hn : LocalFieldTheory.fieldPrincipalUnits K n ≤ localNormSubgroup K L) : + localConductorExponent K L ≤ n := by + classical + exact Nat.find_min' (exists_fieldPrincipalUnits_le_normSubgroup K L) hn + +/-- A depth contains the conductor depth exactly when its principal units are +already norms. This records both the defining property and its minimality. -/ +theorem localConductorExponent_le_iff + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (n : ℕ) : + localConductorExponent K L ≤ n ↔ + LocalFieldTheory.fieldPrincipalUnits K n ≤ localNormSubgroup K L := by + constructor + · intro hn + exact (fieldPrincipalUnits_antitone K hn).trans + (localConductorExponent_spec K L) + · exact localConductorExponent_min K L + +/-- The conductor ideal `p_K ^ n`, where `n` is the least principal-unit +depth contained in the norm subgroup. -/ +def localConductorIdeal + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : Ideal 𝒪[K] := + 𝓂[K] ^ localConductorExponent K L + +/-- The conductor exponent is zero exactly when the whole unit group +`U_K = U_K^(0)` is contained in the norm subgroup. -/ +theorem localConductorExponent_eq_zero_iff + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + localConductorExponent K L = 0 ↔ + LocalFieldTheory.fieldPrincipalUnits K 0 ≤ localNormSubgroup K L := by + simpa using (localConductorExponent_le_iff K L 0) + +/-- The conductor ideal is `1` exactly when its exponent is zero. -/ +theorem localConductorIdeal_eq_one_iff_exponent_eq_zero + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + localConductorIdeal K L = 1 ↔ localConductorExponent K L = 0 := by + simp [localConductorIdeal, Ideal.pow_eq_top_iff, + (IsLocalRing.maximalIdeal.isMaximal 𝒪[K]).ne_top] + +/-- The conductor-one criterion stated directly in terms of the norm subgroup +and `U_K = U_K^(0)`. -/ +theorem localConductorIdeal_eq_one_iff + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + localConductorIdeal K L = 1 ↔ + LocalFieldTheory.fieldPrincipalUnits K 0 ≤ localNormSubgroup K L := + (localConductorIdeal_eq_one_iff_exponent_eq_zero K L).trans + (localConductorExponent_eq_zero_iff K L) + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm.lean new file mode 100644 index 0000000000..cf45317b39 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.PrincipalUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.StandardSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.Unramified + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/All.lean new file mode 100644 index 0000000000..1c55983fa2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/All.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.PrincipalUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.StandardSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.Unramified +/-! +# Norm groups of p-adic cyclotomic extensions + +The prime-power and prime-to-`p` norm-subgroup computations used by local +Kronecker--Weber, exposed as reusable finite local class field theory. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean new file mode 100644 index 0000000000..e1e47a4344 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean @@ -0,0 +1,1002 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.PrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.Existence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.UnramifiedConductor +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv +/-! +# Norm subgroups of p-adic prime-power cyclotomic extensions + +For a primitive `p ^ (k + 1)`-st root of unity generating `L / ℚ_p`, +the norm subgroup is exactly the subgroup generated by `p` and the +`(k + 1)`-st principal units. The odd and dyadic calculations are kept +separate before being combined in the final theorem. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + quotientUnitHom → + quotientUnitHom + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + quotientUnitHom_ker_eq → + quotientUnitHom_ker_eq + +open _root_.LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation renaming + completeDVFOfWithZeroValuation → + completeDVFOfWithZeroValuation + +open _root_.LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation renaming + expSeriesFieldOfWithZeroValuation → + expSeriesFieldOfWithZeroValuation + + +noncomputable +section + +open scoped ValuativeRel WithZero + +namespace LocalClassFieldTheory + +open LocalFieldTheory +open LocalFieldTheory.Padic +open LocalFieldTheory.IsNonarchimedeanLocalField +open ValuationTheory + +variable (p : ℕ) [Fact p.Prime] + +/-- For odd `p`, the `(k+1)`-st principal units of `ℚ_p` are norms from a +primitive `p^(k+1)`-st cyclotomic extension. -/ +theorem fieldPrincipalUnits_le_normSubgroup_cyclotomic_odd + {k : ℕ} (hp2 : p ≠ 2) + {L : Type} [Field L] [Algebra ℚ_[p] L] + (zeta : L) (hzeta : IsPrimitiveRoot zeta (p ^ (k + 1))) + (hgen : Algebra.adjoin ℚ_[p] ({zeta} : Set L) = ⊤) : + LocalFieldTheory.fieldPrincipalUnits ℚ_[p] (k + 1) ≤ localNormSubgroup ℚ_[p] L := by + let v := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p + let F := + completeDVFOfWithZeroValuation v + let eO : 𝒪[ℚ_[p]] ≃+* F.valuationSubring := + integerRingEquivPadicDVRValuationSubring p + let EU : 𝒪[ℚ_[p]]ˣ ≃* F.valuationSubringˣ := + Units.mapEquiv eO.toMulEquiv + rintro x ⟨u, hu, rfl⟩ + have huD : EU u ∈ LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F (k + 1) := by + change Units.mapEquiv + (integerRingEquivPadicDVRValuationSubring p).toMulEquiv u ∈ + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p) + (k + 1) + exact (unitsMapEquiv_mem_higherPrincipalUnitGroup_iff p (k + 1) u).2 hu + let uD : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F (k + + 1) := ⟨EU u, huD⟩ + obtain ⟨rD, hrD⟩ := + padicDVR_higherPrincipalUnit_degree_is_power_odd p hp2 k uD + let rO : 𝒪[ℚ_[p]]ˣ := EU.symm (rD : F.valuationSubringˣ) + have hrO : rO ∈ principalUnits ℚ_[p] 1 := by + apply (unitsMapEquiv_mem_higherPrincipalUnitGroup_iff p 1 rO).1 + have hmapF : EU rO ∈ + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 1 := by + simpa only [rO, MulEquiv.apply_symm_apply] using rD.property + have hmap : + Units.mapEquiv + (integerRingEquivPadicDVRValuationSubring p).toMulEquiv rO ∈ + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p) 1 := by + change EU rO ∈ + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 1 + exact hmapF + exact hmap + let r : ℚ_[p]ˣ := integerUnitsToFieldUnits ℚ_[p] rO + have hrO_pow : rO ^ ((p - 1) * p ^ k) = u := by + apply EU.injective + simpa [rO, uD] using hrD + have hr_pow : r ^ ((p - 1) * p ^ k) = integerUnitsToFieldUnits ℚ_[p] u := by + calc + r ^ ((p - 1) * p ^ k) = + integerUnitsToFieldUnits ℚ_[p] (rO ^ ((p - 1) * p ^ k)) := by + exact (map_pow (integerUnitsToFieldUnits ℚ_[p]) rO ((p - 1) * p ^ k)).symm + _ = integerUnitsToFieldUnits ℚ_[p] u := congrArg _ hrO_pow + have hnorm := LocalFieldTheory.DiscreteValuationField.fieldNormSubgroup_pow_finrank_mem ℚ_[p] L r + rw [AlgebraicNumberTheory.Valuations.padicCyclotomic_finrank_eq_prime_sub_one_mul_pow + zeta hzeta hgen] at hnorm + rw [hr_pow] at hnorm + simpa [LocalFieldTheory.DiscreteValuationField.fieldNormSubgroup, + localNormSubgroup] using hnorm + +/-- The prime element `p` is a norm from a primitive prime-power cyclotomic +extension of `ℚ_p`. -/ +theorem padicPrimeUnit_mem_normSubgroup_cyclotomic + {k : ℕ} {L : Type} [Field L] [Algebra ℚ_[p] L] + (zeta : L) (hzeta : IsPrimitiveRoot zeta (p ^ (k + 1))) + (hgen : Algebra.adjoin ℚ_[p] ({zeta} : Set L) = ⊤) : + padicPrimeUnit p ∈ localNormSubgroup ℚ_[p] L := by + have horder : 1 < p ^ (k + 1) := + Nat.one_lt_pow (Nat.succ_ne_zero k) (Fact.out : Nat.Prime p).one_lt + have hne : (1 - zeta : L) ≠ 0 := + sub_ne_zero.mpr (Ne.symm (hzeta.ne_one horder)) + let y : Lˣ := Units.mk0 (1 - zeta) hne + apply MonoidHom.mem_range.mpr + refine ⟨y, ?_⟩ + apply Units.ext + change Algebra.norm ℚ_[p] (1 - zeta) = (p : ℚ_[p]) + exact AlgebraicNumberTheory.Valuations.padicCyclotomic_norm_one_sub_primitiveRoot_eq_prime + zeta hzeta hgen + +/-- For odd `p`, the standard subgroup generated by `p` and `U^(k+1)` is +contained in the cyclotomic norm subgroup. -/ +theorem uniformizerPrincipalSubgroup_le_normSubgroup_cyclotomic_odd + {k : ℕ} (hp2 : p ≠ 2) + {L : Type} [Field L] [Algebra ℚ_[p] L] + (zeta : L) (hzeta : IsPrimitiveRoot zeta (p ^ (k + 1))) + (hgen : Algebra.adjoin ℚ_[p] ({zeta} : Set L) = ⊤) : + LocalFieldTheory.uniformizerPrincipalSubgroup ℚ_[p] (padicPrimeUnit p) 1 (k + 1) ≤ + localNormSubgroup ℚ_[p] L := by + rw [LocalFieldTheory.uniformizerPrincipalSubgroup] + apply sup_le + · rw [Subgroup.zpowers_le] + simpa using + padicPrimeUnit_mem_normSubgroup_cyclotomic p zeta hzeta hgen + · exact fieldPrincipalUnits_le_normSubgroup_cyclotomic_odd + p hp2 zeta hzeta hgen + +open AlgebraicNumberTheory.Valuations renaming + padic_isCyclotomicExtension_of_primitiveRoot_adjoin_eq_top → + padic_isCyclotomicExtension_of_primitiveRoot_adjoin_eq_top in +/-- For odd `p`, the norm subgroup of a primitive `p^(k+1)`-st cyclotomic +extension is exactly the subgroup generated by `p` and `U^(k+1)`. -/ +theorem localNormSubgroup_eq_uniformizerPrincipalSubgroup_cyclotomicPrimePower_odd + {k : ℕ} (hp2 : p ≠ 2) + {L : Type} [Field L] [Algebra ℚ_[p] L] + (zeta : L) (hzeta : IsPrimitiveRoot zeta (p ^ (k + 1))) + (hgen : Algebra.adjoin ℚ_[p] ({zeta} : Set L) = ⊤) : + localNormSubgroup ℚ_[p] L = + LocalFieldTheory.uniformizerPrincipalSubgroup ℚ_[p] (padicPrimeUnit p) 1 (k + 1) := by + let : IsNonarchimedeanLocalField ℚ_[p] := + padicIsNonarchimedeanLocalField p + let n := p ^ (k + 1) + let : NeZero n := + ⟨pow_ne_zero _ (Fact.out : Nat.Prime p).ne_zero⟩ + let : IsCyclotomicExtension {n} ℚ_[p] L := by + simpa [n] using + padic_isCyclotomicExtension_of_primitiveRoot_adjoin_eq_top zeta hzeta hgen + let : FiniteDimensional ℚ_[p] L := + IsCyclotomicExtension.finiteDimensional {n} ℚ_[p] L + let : IsAbelianGalois ℚ_[p] L := + IsCyclotomicExtension.isAbelianGalois {n} ℚ_[p] L + let H := + LocalFieldTheory.uniformizerPrincipalSubgroup ℚ_[p] (padicPrimeUnit p) 1 (k + 1) + let N := localNormSubgroup ℚ_[p] L + have hHinv : H = + LocalFieldTheory.uniformizerPrincipalSubgroup ℚ_[p] + (padicPrimeUnit p)⁻¹ 1 (k + 1) := by + simp [H, LocalFieldTheory.uniformizerPrincipalSubgroup, Subgroup.zpowers_inv] + have hcardH : Nat.card (ℚ_[p]ˣ ⧸ H) = (p - 1) * p ^ k := by + rw [hHinv] + exact nat_card_fieldUnitsUniformizerPrincipalQuot_padic_succ p k + have hindexH : H.index = (p - 1) * p ^ k := by + rw [Subgroup.index_eq_card] + exact hcardH + have hcardN : Nat.card (NormQuotient ℚ_[p] L) = (p - 1) * p ^ k := by + calc + Nat.card (NormQuotient ℚ_[p] L) = Module.finrank ℚ_[p] L := by + exact card_normQuotient_eq_finrank_of_isAbelianGalois ℚ_[p] L + _ = (p - 1) * p ^ k := + AlgebraicNumberTheory.Valuations.padicCyclotomic_finrank_eq_prime_sub_one_mul_pow + zeta hzeta hgen + have hindexN : N.index = (p - 1) * p ^ k := by + rw [Subgroup.index_eq_card] + exact hcardN + have hdpos : 0 < (p - 1) * p ^ k := + Nat.mul_pos (Nat.sub_pos_of_lt (Fact.out : Nat.Prime p).one_lt) + (pow_pos (Fact.out : Nat.Prime p).pos k) + let : H.FiniteIndex := ⟨by + rw [hindexH] + exact Nat.ne_of_gt hdpos⟩ + have hHN : H ≤ N := by + exact uniformizerPrincipalSubgroup_le_normSubgroup_cyclotomic_odd + p hp2 zeta hzeta hgen + apply Eq.symm + apply le_antisymm hHN + by_contra hNH + have hne : H ≠ N := by + intro heq + apply hNH + rw [heq] + have hstrict : H < N := lt_of_le_of_ne hHN hne + have hi := Subgroup.index_strictAnti hstrict + rw [hindexH, hindexN] at hi + exact (Nat.lt_irrefl _ hi) + + +/-- The minimal polynomial of `2 + i`, for a primitive fourth root `i`, is +the translated fourth cyclotomic polynomial. -/ +theorem minpoly_two_add_primitiveFourthRoot + {L : Type*} [Field L] [Algebra ℚ_[2] L] + (i : L) (hi : IsPrimitiveRoot i 4) : + minpoly ℚ_[2] ((2 : L) + i) = + (Polynomial.cyclotomic 4 ℚ_[2]).comp + (Polynomial.X - Polynomial.C (2 : ℚ_[2])) := by + let : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩ + let : NeZero (4 : ℚ_[2]) := ⟨by norm_num⟩ + have hirr : + Irreducible (Polynomial.cyclotomic 4 ℚ_[2]) := by + simpa using + AlgebraicNumberTheory.Valuations.padicCyclotomicPolynomial_irreducible_prime_pow_succ 2 1 + have hadd : + (2 : L) + i = i + algebraMap ℚ_[2] L (2 : ℚ_[2]) := by + rw [map_ofNat (algebraMap ℚ_[2] L) 2] + exact add_comm _ _ + rw [hadd, minpoly.add_algebraMap, ← hi.minpoly_eq_cyclotomic_of_irreducible hirr] + + +/-- Over `ℚ₂`, the fourth cyclotomic polynomial is `X² + 1`. -/ +theorem cyclotomic_four_padic : + Polynomial.cyclotomic 4 ℚ_[2] = + Polynomial.X ^ 2 + 1 := by + rw [show 4 = 2 ^ (1 + 1) by norm_num, + Polynomial.cyclotomic_prime_pow_eq_geom_sum Nat.prime_two] + norm_num [Finset.sum_range_succ] + ac_rfl + + +/-- The norm of `2 + i` from its simple extension over `ℚ₂` is `5`. -/ +theorem norm_adjoin_two_add_primitiveFourthRoot + {L : Type*} [Field L] [Algebra ℚ_[2] L] + (i : L) (hi : IsPrimitiveRoot i 4) : + Algebra.norm ℚ_[2] + (IntermediateField.AdjoinSimple.gen ℚ_[2] ((2 : L) + i)) = + (5 : ℚ_[2]) := by + let j : L := (2 : L) + i + have hj : j = algebraMap ℚ_[2] L (2 : ℚ_[2]) + i := by + dsimp [j] + rw [map_ofNat (algebraMap ℚ_[2] L) 2] + have hjint : IsIntegral ℚ_[2] j := by + rw [hj] + exact (isIntegral_algebraMap : + IsIntegral ℚ_[2] (algebraMap ℚ_[2] L (2 : ℚ_[2]))).add + ((hi.isIntegral (by norm_num)).tower_top) + let E : IntermediateField ℚ_[2] L := IntermediateField.adjoin ℚ_[2] {j} + let pb : PowerBasis ℚ_[2] E := + IntermediateField.adjoin.powerBasis hjint + change Algebra.norm ℚ_[2] pb.gen = (5 : ℚ_[2]) + rw [Algebra.PowerBasis.norm_gen_eq_coeff_zero_minpoly] + simp only [pb, E, IntermediateField.adjoin.powerBasis_dim, + IntermediateField.adjoin.powerBasis_gen, IntermediateField.minpoly_gen] + rw [minpoly_two_add_primitiveFourthRoot i hi] + rw [cyclotomic_four_padic] + rw [Polynomial.natDegree_comp] + rw [show (1 : Polynomial ℚ_[2]) = Polynomial.C 1 by simp, + Polynomial.natDegree_X_pow_add_C, Polynomial.natDegree_X_sub_C] + rw [ + Polynomial.coeff_zero_eq_eval_zero, Polynomial.eval_comp] + norm_num + +/-- In a primitive `2^(m+2)`-st cyclotomic extension, the norm of +`2 + ζ^(2^m)` is `5^(2^m)`. -/ +theorem norm_two_add_fourthRoot_cyclotomic_two + (m : ℕ) {L : Type*} [Field L] [Algebra ℚ_[2] L] + (zeta : L) (hzeta : IsPrimitiveRoot zeta (2 ^ (m + 2))) + (hgen : Algebra.adjoin ℚ_[2] ({zeta} : Set L) = ⊤) : + Algebra.norm ℚ_[2] ((2 : L) + zeta ^ (2 ^ m)) = + (5 : ℚ_[2]) ^ (2 ^ m) := by + let : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩ + let n := 2 ^ (m + 2) + let : NeZero n := ⟨pow_ne_zero _ (by norm_num)⟩ + let : IsCyclotomicExtension {n} ℚ_[2] L := by + simpa [n, Nat.add_assoc] using + AlgebraicNumberTheory.Valuations.padic_isCyclotomicExtension_of_primitiveRoot_adjoin_eq_top + (p := 2) (k := m + 1) zeta hzeta hgen + let : FiniteDimensional ℚ_[2] L := + IsCyclotomicExtension.finiteDimensional {n} ℚ_[2] L + let i : L := zeta ^ (2 ^ m) + have hi : IsPrimitiveRoot i 4 := by + apply hzeta.pow (by positivity) + rw [show m + 2 = m + 2 by rfl, pow_add] + norm_num + let j : L := (2 : L) + i + have hj : j = algebraMap ℚ_[2] L (2 : ℚ_[2]) + i := by + dsimp [j] + rw [map_ofNat (algebraMap ℚ_[2] L) 2] + have hjint : IsIntegral ℚ_[2] j := by + rw [hj] + exact (isIntegral_algebraMap : + IsIntegral ℚ_[2] (algebraMap ℚ_[2] L (2 : ℚ_[2]))).add + ((hi.isIntegral (by norm_num)).tower_top) + let E : IntermediateField ℚ_[2] L := IntermediateField.adjoin ℚ_[2] {j} + have hfinE : Module.finrank ℚ_[2] E = 2 := by + rw [IntermediateField.adjoin.finrank hjint] + rw [minpoly_two_add_primitiveFourthRoot i hi] + rw [cyclotomic_four_padic, Polynomial.natDegree_comp] + rw [show (1 : Polynomial ℚ_[2]) = Polynomial.C 1 by simp, + Polynomial.natDegree_X_pow_add_C, Polynomial.natDegree_X_sub_C] + have hfinL : Module.finrank ℚ_[2] L = 2 ^ (m + 1) := by + simpa [Nat.add_assoc] using + AlgebraicNumberTheory.Valuations.padicCyclotomic_finrank_eq_prime_sub_one_mul_pow + (p := 2) (k := m + 1) zeta hzeta hgen + have hmul : + 2 * Module.finrank E L = 2 * (2 ^ m) := by + calc + 2 * Module.finrank E L = + Module.finrank ℚ_[2] E * Module.finrank E L := by rw [hfinE] + _ = Module.finrank ℚ_[2] L := + Module.finrank_mul_finrank ℚ_[2] E L + _ = 2 ^ (m + 1) := hfinL + _ = 2 * (2 ^ m) := by rw [pow_succ]; ac_rfl + have hfinRel : Module.finrank E L = 2 ^ m := + Nat.eq_of_mul_eq_mul_left (by norm_num) hmul + calc + Algebra.norm ℚ_[2] ((2 : L) + zeta ^ (2 ^ m)) = + Algebra.norm ℚ_[2] j := by rfl + _ = Algebra.norm ℚ_[2] + (IntermediateField.AdjoinSimple.gen ℚ_[2] j) ^ + Module.finrank E L := by + simpa [E] using Algebra.norm_eq_norm_adjoin ℚ_[2] j + _ = (5 : ℚ_[2]) ^ Module.finrank E L := by + rw [norm_adjoin_two_add_primitiveFourthRoot i hi] + _ = (5 : ℚ_[2]) ^ (2 ^ m) := by rw [hfinRel] + + +/-- Every element of the `(m+2)`-nd maximal-ideal power of `ℤ₂` is the +`2^m`-fold additive multiple of an element in the square of the maximal +ideal. -/ +theorem padicInt_exists_two_power_root_of_mem_maximalIdeal_pow_add_two + (m : ℕ) (z : ℤ_[2]) + (hz : z ∈ IsLocalRing.maximalIdeal ℤ_[2] ^ (m + 2)) : + ∃ b : ℤ_[2], + b ∈ IsLocalRing.maximalIdeal ℤ_[2] ^ 2 ∧ + (2 ^ m) • b = z := by + rw [PadicInt.maximalIdeal_eq_span_p, Ideal.span_singleton_pow, + Ideal.mem_span_singleton] at hz + obtain ⟨c, rfl⟩ := hz + let b : ℤ_[2] := c * (2 : ℤ_[2]) ^ 2 + refine ⟨b, ?_, ?_⟩ + · rw [PadicInt.maximalIdeal_eq_span_p, Ideal.span_singleton_pow, + Ideal.mem_span_singleton] + refine ⟨c, ?_⟩ + simp [b, mul_comm] + · simp only [nsmul_eq_mul, Nat.cast_pow] + simp [b, pow_add, mul_comm, mul_left_comm] + +/-- Depth two lies in the logarithm/exponential convergence range over +`ℚ₂`. -/ +theorem padicDVR_logExp_level_two : + (LocalFieldTheory.DiscreteValuationField.LocalField.ramificationIndexOfWithZeroValuation + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation 2) : ℚ) / + (((LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation + 2)).residueCharacteristic : ℚ) - 1) < + (2 : ℚ) := by + let : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩ + rw [padicDVR_ramificationIndex_eq_one 2, + padicDVR_residueCharacteristic 2] + norm_num + +/-- Every depth at least two lies in the logarithm/exponential convergence +range over `ℚ₂`. -/ +theorem padicDVR_logExp_level_add_two (m : ℕ) : + (LocalFieldTheory.DiscreteValuationField.LocalField.ramificationIndexOfWithZeroValuation + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation 2) : ℚ) / + (((LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation + 2)).residueCharacteristic : ℚ) - 1) < + ((m + 2 : ℕ) : ℚ) := by + apply lt_of_lt_of_le padicDVR_logExp_level_two + exact_mod_cast (Nat.le_add_left 2 m) + + +/-- Every element of `U^(m+2)` over `ℚ₂` is a `2^m`-th power of an element +of `U²`. -/ +theorem padicDVR_higherPrincipalUnit_two_power + (m : ℕ) : + let v := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation 2 + let F := + completeDVFOfWithZeroValuation v + ∀ u : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F (m + 2), + ∃ r : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2, + (r : F.valuationSubringˣ) ^ (2 ^ m) = + (u : F.valuationSubringˣ) := by + let : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩ + let v := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation 2 + let F := + completeDVFOfWithZeroValuation v + change ∀ u : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F (m + + 2), + ∃ r : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2, + (r : F.valuationSubringˣ) ^ (2 ^ m) = + (u : F.valuationSubringˣ) + have hv : Function.Surjective v := + (IsDiscreteValuationRing.maximalIdeal ℤ_[2]).valuation_surjective ℚ_[2] + let E2 := expLogMulEquivOfWithZeroValuation v hv 2 + padicDVR_logExp_level_two + let En := expLogMulEquivOfWithZeroValuation v hv (m + 2) + (padicDVR_logExp_level_add_two m) + let eO : ℤ_[2] ≃+* F.valuationSubring := + LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicIntEquivValuationSubring 2 + intro u + let a : Multiplicative (F.maximalIdeal ^ (m + 2) : Ideal F.valuationSubring) := + En.symm u + let z : ℤ_[2] := eO.symm (a.toAdd : F.valuationSubring) + have hz : z ∈ IsLocalRing.maximalIdeal ℤ_[2] ^ (m + 2) := by + apply (ringEquiv_mem_maximalIdeal_pow_iff eO (m + 2) z).1 + simp [z] + obtain ⟨b, hb, hdb⟩ := + padicInt_exists_two_power_root_of_mem_maximalIdeal_pow_add_two m z hz + have hbO : eO b ∈ F.maximalIdeal ^ 2 := by + exact (ringEquiv_mem_maximalIdeal_pow_iff eO 2 b).2 hb + let b2 : (F.maximalIdeal ^ 2 : Ideal F.valuationSubring) := + ⟨eO b, hbO⟩ + have hdbO : (2 ^ m) • (eO b) = (a.toAdd : F.valuationSubring) := by + rw [← map_nsmul eO (2 ^ m) b, hdb] + simp [z] + let r : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2 := E2 + (Multiplicative.ofAdd b2) + refine ⟨r, ?_⟩ + have hua : En a = u := En.apply_symm_apply u + have hrpow : + r ^ (2 ^ m) = + E2 ((Multiplicative.ofAdd b2) ^ (2 ^ m)) := by + change E2 (Multiplicative.ofAdd b2) ^ (2 ^ m) = + E2 ((Multiplicative.ofAdd b2) ^ (2 ^ m)) + exact (map_pow E2 (Multiplicative.ofAdd b2) (2 ^ m)).symm + change ((r ^ (2 ^ m) : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + F.valuationSubringˣ) = (u : F.valuationSubringˣ) + rw [hrpow, ← hua] + apply Units.ext + apply Subtype.ext + have hleft := expLogMulEquivOfWithZeroValuation_fieldVal v hv 2 + padicDVR_logExp_level_two + ((Multiplicative.ofAdd b2) ^ (2 ^ m)) + have hright := expLogMulEquivOfWithZeroValuation_fieldVal v hv (m + 2) + (padicDVR_logExp_level_add_two m) a + have hleft' : + ((((E2 ((Multiplicative.ofAdd b2) ^ (2 ^ m)) : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + F.valuationSubringˣ) : + F.valuationSubring) : ℚ_[2]) = + expSeriesFieldOfWithZeroValuation + v ((((Multiplicative.ofAdd b2) ^ (2 ^ m)).toAdd : + F.valuationSubring) : ℚ_[2]) + (fun q => + Nat.cast_ne_zero.mpr (Nat.factorial_ne_zero q)) := by + exact hleft + have hright' : + ((((En a : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F + (m + 2)) : F.valuationSubringˣ) : + F.valuationSubring) : ℚ_[2]) = + expSeriesFieldOfWithZeroValuation + v ((a.toAdd : F.valuationSubring) : ℚ_[2]) + (fun q => + Nat.cast_ne_zero.mpr (Nat.factorial_ne_zero q)) := by + exact hright + rw [hleft', hright'] + congr 2 + + +/-- The unit `5`, regarded as an element of the second higher-principal-unit +group over `ℚ₂`. -/ +noncomputable def padicDVRFive : + letI : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩ + let F := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF 2 + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2 := by + letI : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩ + let F := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF 2 + let eO : ℤ_[2] ≃+* F.valuationSubring := + LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicIntEquivValuationSubring 2 + have hfive : IsUnit (5 : ℤ_[2]) := by + rw [PadicInt.isUnit_iff] + exact PadicInt.norm_natCast_eq_one_iff.mpr (by norm_num) + let fiveZ : ℤ_[2]ˣ := hfive.unit + let fiveO : F.valuationSubringˣ := Units.mapEquiv eO.toMulEquiv fiveZ + refine ⟨fiveO, ?_⟩ + rw [LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.mem_iff] + have hval : (fiveO : F.valuationSubring) = eO (5 : ℤ_[2]) := by + simp [fiveO, fiveZ] + rw [hval, ← map_one eO, ← map_sub] + apply (ringEquiv_mem_maximalIdeal_pow_iff eO 2 ((5 : ℤ_[2]) - 1)).2 + rw [PadicInt.maximalIdeal_eq_span_p, Ideal.span_singleton_pow, + Ideal.mem_span_singleton] + refine ⟨1, ?_⟩ + norm_num + +/-- The underlying `ℚ₂` value of `padicDVRFive` is `5`. -/ +@[simp] theorem padicDVR_five_val : + letI : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩ + let F := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF 2 + ((((padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + F.valuationSubringˣ) : F.valuationSubring) : ℚ_[2]) = 5 := by + let : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩ + let F := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF 2 + let eO : ℤ_[2] ≃+* F.valuationSubring := + LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicIntEquivValuationSubring 2 + change (((Units.mapEquiv eO.toMulEquiv _ : F.valuationSubringˣ) : + F.valuationSubring) : ℚ_[2]) = 5 + rfl + +/-- Every second principal unit over `ℚ₂` lies either in `U³` or in the +coset `5 * U³`. -/ +theorem padicDVR_U2_split (u : + letI : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩ + let F := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF 2 + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + letI : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩ + let F := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF 2 + (u : F.valuationSubringˣ) ∈ + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 3 ∨ + (u : F.valuationSubringˣ) / + (padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) ∈ + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 3 := by + let : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩ + let F := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF 2 + let eO : ℤ_[2] ≃+* F.valuationSubring := + LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicIntEquivValuationSubring 2 + let x : ℤ_[2] := eO.symm (((u : F.valuationSubringˣ) : F.valuationSubring)) + have hu2 : + ((u : F.valuationSubringˣ) : F.valuationSubring) - 1 ∈ + F.maximalIdeal ^ 2 := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.mem_iff + F 2 (u : F.valuationSubringˣ)).1 u.property + have hx2 : x - 1 ∈ IsLocalRing.maximalIdeal ℤ_[2] ^ 2 := by + apply (ringEquiv_mem_maximalIdeal_pow_iff eO 2 (x - 1)).1 + rw [map_sub, map_one] + simpa [x] using hu2 + rw [PadicInt.maximalIdeal_eq_span_p, Ideal.span_singleton_pow, + Ideal.mem_span_singleton] at hx2 + obtain ⟨c, hc⟩ := hx2 + have hcmod : PadicInt.toZMod c = 0 ∨ PadicInt.toZMod c = 1 := by + have hlt := ZMod.val_lt (PadicInt.toZMod c) + have hle : (PadicInt.toZMod c).val ≤ 1 := by omega + rcases Nat.le_one_iff_eq_zero_or_eq_one.1 hle with h | h + · left + calc + PadicInt.toZMod c = ((PadicInt.toZMod c).val : ZMod 2) := + (ZMod.natCast_zmod_val _).symm + _ = 0 := by rw [h]; norm_num + · right + calc + PadicInt.toZMod c = ((PadicInt.toZMod c).val : ZMod 2) := + (ZMod.natCast_zmod_val _).symm + _ = 1 := by rw [h]; norm_num + rcases hcmod with hc0 | hc1 + · left + rw [LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.mem_iff] + have hxe : eO x = + ((u : F.valuationSubringˣ) : F.valuationSubring) := by simp [x] + rw [← hxe, ← map_one eO, ← map_sub] + apply (ringEquiv_mem_maximalIdeal_pow_iff eO 3 (x - 1)).2 + rw [PadicInt.maximalIdeal_eq_span_p, Ideal.span_singleton_pow, + Ideal.mem_span_singleton] + have hcm : c ∈ IsLocalRing.maximalIdeal ℤ_[2] := by + rw [← PadicInt.ker_toZMod, RingHom.mem_ker] + exact hc0 + rw [PadicInt.maximalIdeal_eq_span_p, Ideal.mem_span_singleton] at hcm + obtain ⟨d, hd⟩ := hcm + refine ⟨d, ?_⟩ + calc + x - 1 = (2 : ℤ_[2]) ^ 2 * c := hc + _ = (2 : ℤ_[2]) ^ 3 * d := by rw [hd]; ring + · right + have hcsub : c - 1 ∈ IsLocalRing.maximalIdeal ℤ_[2] := by + rw [← PadicInt.ker_toZMod, RingHom.mem_ker] + simp [hc1] + rw [PadicInt.maximalIdeal_eq_span_p, Ideal.mem_span_singleton] at hcsub + obtain ⟨d, hd⟩ := hcsub + have hx5 : x - 5 ∈ IsLocalRing.maximalIdeal ℤ_[2] ^ 3 := by + rw [PadicInt.maximalIdeal_eq_span_p, Ideal.span_singleton_pow, + Ideal.mem_span_singleton] + refine ⟨d, ?_⟩ + calc + x - 5 = (x - 1) - 4 := by ring + _ = (2 : ℤ_[2]) ^ 2 * (c - 1) := by rw [hc]; ring + _ = (2 : ℤ_[2]) ^ 3 * d := by rw [hd]; ring + have hdiff : + ((u : F.valuationSubringˣ) : F.valuationSubring) - + (((padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + F.valuationSubringˣ) : F.valuationSubring) ∈ + F.maximalIdeal ^ 3 := by + have hxe : eO x = + ((u : F.valuationSubringˣ) : F.valuationSubring) := by + simp [x] + have hefive : eO (5 : ℤ_[2]) = + (((padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + F.valuationSubringˣ) : F.valuationSubring) := by + apply Subtype.ext + rfl + have hmapped := + (ringEquiv_mem_maximalIdeal_pow_iff eO 3 (x - 5)).2 hx5 + rw [map_sub, hxe, hefive] at hmapped + exact hmapped + have hq : + quotientUnitHom F 3 + (u : F.valuationSubringˣ) = + quotientUnitHom F 3 + ((padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + F.valuationSubringˣ) := by + apply Units.ext + exact (Ideal.Quotient.mk_eq_mk_iff_sub_mem + (I := F.maximalIdeal ^ 3) + (((u : F.valuationSubringˣ) : F.valuationSubring)) + ((((padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + F.valuationSubringˣ) : F.valuationSubring))).2 hdiff + rw [← + quotientUnitHom_ker_eq F 3, + MonoidHom.mem_ker] + rw [map_div, hq] + exact div_self' _ + +/-- Every second principal unit over `ℚ₂` is either a square in `U²` or five +times such a square. -/ +theorem padicDVR_U2_square_class + (u : + letI : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩ + let F := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF 2 + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + letI : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩ + let F := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF 2 + ∃ r : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2, + (u : F.valuationSubringˣ) = (r : F.valuationSubringˣ) ^ 2 ∨ + (u : F.valuationSubringˣ) = + (padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) * + (r : F.valuationSubringˣ) ^ 2 := by + let : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩ + let F := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF 2 + let F' := + completeDVFOfWithZeroValuation + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation 2) + have hroot : + ∀ w : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 3, + ∃ r : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2, + (r : F.valuationSubringˣ) ^ 2 = + (w : F.valuationSubringˣ) := by + change ∀ w : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F' 3, + ∃ r : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F' 2, + (r : F'.valuationSubringˣ) ^ 2 = (w : F'.valuationSubringˣ) + simpa using (padicDVR_higherPrincipalUnit_two_power 1) + rcases padicDVR_U2_split u with hu | hu + · let w : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 3 := + ⟨u, hu⟩ + obtain ⟨r, hr⟩ := hroot w + exact ⟨r, Or.inl hr.symm⟩ + · let w : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 3 := + ⟨(u : F.valuationSubringˣ) / + (padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2), hu⟩ + obtain ⟨r, hr⟩ := hroot w + have hr' : (r : F.valuationSubringˣ) ^ 2 = + (u : F.valuationSubringˣ) / + (padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) := by + simpa [w] using hr + refine ⟨r, Or.inr ?_⟩ + calc + (u : F.valuationSubringˣ) = + (padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) * + ((u : F.valuationSubringˣ) / + (padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F + 2)) := by + symm + rw [mul_comm] + exact div_mul_cancel _ _ + _ = (padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) * + (r : F.valuationSubringˣ) ^ 2 := by rw [← hr'] + +/-- At the first dyadic cyclotomic level, all first principal units are +norms. -/ +theorem fieldPrincipalUnits_le_normSubgroup_cyclotomic_two_zero + {L : Type} [Field L] [Algebra ℚ_[2] L] + (zeta : L) (hzeta : IsPrimitiveRoot zeta (2 ^ 1)) + (hgen : Algebra.adjoin ℚ_[2] ({zeta} : Set L) = ⊤) : + LocalFieldTheory.fieldPrincipalUnits ℚ_[2] 1 ≤ localNormSubgroup ℚ_[2] L := by + let : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩ + intro x hx + have hnorm := + LocalFieldTheory.DiscreteValuationField.fieldNormSubgroup_pow_finrank_mem ℚ_[2] L x + rw [AlgebraicNumberTheory.Valuations.padicCyclotomic_finrank_eq_prime_sub_one_mul_pow + zeta hzeta hgen] at hnorm + norm_num at hnorm + simpa [LocalFieldTheory.DiscreteValuationField.fieldNormSubgroup, + localNormSubgroup] using hnorm + +/-- At a dyadic cyclotomic level `2^(m+2)`, all `(m+2)`-nd principal units +are norms. -/ +theorem fieldPrincipalUnits_le_normSubgroup_cyclotomic_two_succ + (m : ℕ) {L : Type} [Field L] [Algebra ℚ_[2] L] + (zeta : L) (hzeta : IsPrimitiveRoot zeta (2 ^ (m + 2))) + (hgen : Algebra.adjoin ℚ_[2] ({zeta} : Set L) = ⊤) : + LocalFieldTheory.fieldPrincipalUnits ℚ_[2] (m + 2) ≤ localNormSubgroup ℚ_[2] L := by + let : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩ + let n := 2 ^ (m + 2) + let : NeZero n := ⟨pow_ne_zero _ (by norm_num)⟩ + let : IsCyclotomicExtension {n} ℚ_[2] L := by + simpa [n, Nat.add_assoc] using + AlgebraicNumberTheory.Valuations.padic_isCyclotomicExtension_of_primitiveRoot_adjoin_eq_top + (p := 2) (k := m + 1) zeta hzeta hgen + let : FiniteDimensional ℚ_[2] L := + IsCyclotomicExtension.finiteDimensional {n} ℚ_[2] L + let F := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF 2 + let F' := + completeDVFOfWithZeroValuation + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation 2) + let eO : 𝒪[ℚ_[2]] ≃+* F.valuationSubring := + integerRingEquivPadicDVRValuationSubring 2 + let EU : 𝒪[ℚ_[2]]ˣ ≃* F.valuationSubringˣ := + Units.mapEquiv eO.toMulEquiv + let toField : F.valuationSubringˣ →* ℚ_[2]ˣ := + Units.map F.valuation.valuationSubring.subtype.toMonoidHom + let five : ℚ_[2]ˣ := Units.mk0 (5 : ℚ_[2]) (by norm_num) + have hfin : Module.finrank ℚ_[2] L = 2 ^ (m + 1) := by + simpa [Nat.add_assoc] using + AlgebraicNumberTheory.Valuations.padicCyclotomic_finrank_eq_prime_sub_one_mul_pow + (p := 2) (k := m + 1) zeta hzeta hgen + have hnormy := + norm_two_add_fourthRoot_cyclotomic_two m zeta hzeta hgen + have hyne : (2 : L) + zeta ^ (2 ^ m) ≠ 0 := by + intro hy + rw [hy, Algebra.norm_zero] at hnormy + exact (pow_ne_zero (2 ^ m) (by norm_num : (5 : ℚ_[2]) ≠ 0)) + hnormy.symm + let y : Lˣ := Units.mk0 ((2 : L) + zeta ^ (2 ^ m)) hyne + have hfiveNorm : five ^ (2 ^ m) ∈ localNormSubgroup ℚ_[2] L := by + apply MonoidHom.mem_range.mpr + refine ⟨y, ?_⟩ + apply Units.ext + change Algebra.norm ℚ_[2] ((2 : L) + zeta ^ (2 ^ m)) = + (5 : ℚ_[2]) ^ (2 ^ m) + exact hnormy + rintro x ⟨u, hu, rfl⟩ + have huD : EU u ∈ LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F (m + 2) := by + simpa [EU, eO, F] using + (unitsMapEquiv_mem_higherPrincipalUnitGroup_iff + 2 (m + 2) u).2 hu + let uD : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F (m + + 2) := ⟨EU u, huD⟩ + have hroot : + ∀ w : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F (m + 2), + ∃ rD : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2, + (rD : F.valuationSubringˣ) ^ (2 ^ m) = + (w : F.valuationSubringˣ) := by + change + ∀ w : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F' (m + 2), + ∃ rD : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F' 2, + (rD : F'.valuationSubringˣ) ^ (2 ^ m) = + (w : F'.valuationSubringˣ) + simpa using (padicDVR_higherPrincipalUnit_two_power m) + obtain ⟨rD, hrD⟩ := hroot uD + obtain ⟨sD, hsD⟩ := + padicDVR_U2_square_class rD + let s : ℚ_[2]ˣ := toField (sD : F.valuationSubringˣ) + have hbase : + toField (uD : F.valuationSubringˣ) = + integerUnitsToFieldUnits ℚ_[2] u := by + apply Units.ext + dsimp [toField, uD, EU, eO] + exact integerRingEquivPadicDVRValuationSubring_coe + 2 (u : 𝒪[ℚ_[2]]) + have hfive : + toField + ((padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + F.valuationSubringˣ) = five := by + apply Units.ext + dsimp [toField, five, F] + exact padicDVR_five_val + have hsNorm : s ^ (2 ^ (m + 1)) ∈ localNormSubgroup ℚ_[2] L := by + have hsNormRaw := + LocalFieldTheory.DiscreteValuationField.fieldNormSubgroup_pow_finrank_mem ℚ_[2] L s + rw [hfin] at hsNormRaw + simpa [LocalFieldTheory.DiscreteValuationField.fieldNormSubgroup, + localNormSubgroup] using hsNormRaw + rcases hsD with hsD | hsD + · have huDpow : + (uD : F.valuationSubringˣ) = + (sD : F.valuationSubringˣ) ^ (2 ^ (m + 1)) := by + calc + (uD : F.valuationSubringˣ) = + (rD : F.valuationSubringˣ) ^ (2 ^ m) := hrD.symm + _ = ((sD : F.valuationSubringˣ) ^ 2) ^ (2 ^ m) := by rw [hsD] + _ = (sD : F.valuationSubringˣ) ^ (2 ^ (m + 1)) := by + rw [← pow_mul] + congr 1 + rw [pow_succ] + ac_rfl + have hdecomp : + integerUnitsToFieldUnits ℚ_[2] u = s ^ (2 ^ (m + 1)) := by + calc + integerUnitsToFieldUnits ℚ_[2] u = + toField (uD : F.valuationSubringˣ) := hbase.symm + _ = toField ((sD : F.valuationSubringˣ) ^ (2 ^ (m + 1))) := + congrArg toField huDpow + _ = s ^ (2 ^ (m + 1)) := by + exact map_pow toField (sD : F.valuationSubringˣ) (2 ^ (m + 1)) + rw [hdecomp] + exact hsNorm + · have huDprod : + (uD : F.valuationSubringˣ) = + ((padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + F.valuationSubringˣ) ^ (2 ^ m) * + (sD : F.valuationSubringˣ) ^ (2 ^ (m + 1)) := by + calc + (uD : F.valuationSubringˣ) = + (rD : F.valuationSubringˣ) ^ (2 ^ m) := hrD.symm + _ = (((padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + F.valuationSubringˣ) * + (sD : F.valuationSubringˣ) ^ 2) ^ (2 ^ m) := by rw [hsD] + _ = ((padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + F.valuationSubringˣ) ^ (2 ^ m) * + ((sD : F.valuationSubringˣ) ^ 2) ^ (2 ^ m) := by + rw [mul_pow] + _ = ((padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + F.valuationSubringˣ) ^ (2 ^ m) * + (sD : F.valuationSubringˣ) ^ (2 ^ (m + 1)) := by + rw [← pow_mul] + congr 2 + rw [pow_succ] + ac_rfl + have hdecomp : + integerUnitsToFieldUnits ℚ_[2] u = + five ^ (2 ^ m) * s ^ (2 ^ (m + 1)) := by + calc + integerUnitsToFieldUnits ℚ_[2] u = + toField (uD : F.valuationSubringˣ) := hbase.symm + _ = toField + (((padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + F.valuationSubringˣ) ^ (2 ^ m) * + (sD : F.valuationSubringˣ) ^ (2 ^ (m + 1))) := + congrArg toField huDprod + _ = five ^ (2 ^ m) * s ^ (2 ^ (m + 1)) := by + rw [map_mul, map_pow, map_pow, hfive] + rw [hdecomp] + exact (localNormSubgroup ℚ_[2] L).mul_mem hfiveNorm hsNorm + +/-- At every positive dyadic cyclotomic level, the principal units at the +corresponding depth are norms. -/ +theorem fieldPrincipalUnits_le_normSubgroup_cyclotomic_two + (k : ℕ) {L : Type} [Field L] [Algebra ℚ_[2] L] + (zeta : L) (hzeta : IsPrimitiveRoot zeta (2 ^ (k + 1))) + (hgen : Algebra.adjoin ℚ_[2] ({zeta} : Set L) = ⊤) : + LocalFieldTheory.fieldPrincipalUnits ℚ_[2] (k + 1) ≤ localNormSubgroup ℚ_[2] L := by + cases k with + | zero => + simpa using + fieldPrincipalUnits_le_normSubgroup_cyclotomic_two_zero + zeta hzeta hgen + | succ m => + simpa [Nat.add_assoc] using + fieldPrincipalUnits_le_normSubgroup_cyclotomic_two_succ + m zeta hzeta hgen + + +/-- Over `ℚ₂`, the standard subgroup generated by `2` and `U^(k+1)` is +contained in the corresponding cyclotomic norm subgroup. -/ +theorem uniformizerPrincipalSubgroup_le_normSubgroup_cyclotomic_two + (k : ℕ) {L : Type} [Field L] [Algebra ℚ_[2] L] + (zeta : L) (hzeta : IsPrimitiveRoot zeta (2 ^ (k + 1))) + (hgen : Algebra.adjoin ℚ_[2] ({zeta} : Set L) = ⊤) : + LocalFieldTheory.uniformizerPrincipalSubgroup ℚ_[2] (padicPrimeUnit 2) 1 (k + 1) ≤ + localNormSubgroup ℚ_[2] L := by + let : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩ + rw [LocalFieldTheory.uniformizerPrincipalSubgroup] + apply sup_le + · rw [Subgroup.zpowers_le] + simpa using + padicPrimeUnit_mem_normSubgroup_cyclotomic + 2 zeta hzeta hgen + · exact fieldPrincipalUnits_le_normSubgroup_cyclotomic_two + k zeta hzeta hgen + +/-- Over `ℚ₂`, the norm subgroup of a primitive `2^(k+1)`-st cyclotomic +extension is exactly the subgroup generated by `2` and `U^(k+1)`. -/ +theorem localNormSubgroup_eq_uniformizerPrincipalSubgroup_cyclotomicPrimePower_two + {k : ℕ} {L : Type} [Field L] [Algebra ℚ_[2] L] + (zeta : L) (hzeta : IsPrimitiveRoot zeta (2 ^ (k + 1))) + (hgen : Algebra.adjoin ℚ_[2] ({zeta} : Set L) = ⊤) : + localNormSubgroup ℚ_[2] L = + LocalFieldTheory.uniformizerPrincipalSubgroup ℚ_[2] + (padicPrimeUnit 2) 1 (k + 1) := by + let : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩ + let : IsNonarchimedeanLocalField ℚ_[2] := + padicIsNonarchimedeanLocalField 2 + let n := 2 ^ (k + 1) + let : NeZero n := ⟨pow_ne_zero _ (by norm_num)⟩ + let : IsCyclotomicExtension {n} ℚ_[2] L := by + simpa [n] using + AlgebraicNumberTheory.Valuations.padic_isCyclotomicExtension_of_primitiveRoot_adjoin_eq_top + zeta hzeta hgen + let : FiniteDimensional ℚ_[2] L := + IsCyclotomicExtension.finiteDimensional {n} ℚ_[2] L + let : IsAbelianGalois ℚ_[2] L := + IsCyclotomicExtension.isAbelianGalois {n} ℚ_[2] L + let H := + LocalFieldTheory.uniformizerPrincipalSubgroup ℚ_[2] + (padicPrimeUnit 2) 1 (k + 1) + let N := localNormSubgroup ℚ_[2] L + have hHinv : H = + LocalFieldTheory.uniformizerPrincipalSubgroup ℚ_[2] + (padicPrimeUnit 2)⁻¹ 1 (k + 1) := by + simp [H, LocalFieldTheory.uniformizerPrincipalSubgroup, Subgroup.zpowers_inv] + have hcardH : Nat.card (ℚ_[2]ˣ ⧸ H) = (2 - 1) * 2 ^ k := by + rw [hHinv] + exact nat_card_fieldUnitsUniformizerPrincipalQuot_padic_succ 2 k + have hindexH : H.index = (2 - 1) * 2 ^ k := by + rw [Subgroup.index_eq_card] + exact hcardH + have hcardN : Nat.card (NormQuotient ℚ_[2] L) = (2 - 1) * 2 ^ k := by + calc + Nat.card (NormQuotient ℚ_[2] L) = Module.finrank ℚ_[2] L := by + exact card_normQuotient_eq_finrank_of_isAbelianGalois ℚ_[2] L + _ = (2 - 1) * 2 ^ k := + AlgebraicNumberTheory.Valuations.padicCyclotomic_finrank_eq_prime_sub_one_mul_pow + zeta hzeta hgen + have hindexN : N.index = (2 - 1) * 2 ^ k := by + rw [Subgroup.index_eq_card] + exact hcardN + have hdpos : 0 < (2 - 1) * 2 ^ k := by positivity + let : H.FiniteIndex := ⟨by + rw [hindexH] + exact Nat.ne_of_gt hdpos⟩ + have hHN : H ≤ N := by + exact uniformizerPrincipalSubgroup_le_normSubgroup_cyclotomic_two + k zeta hzeta hgen + apply Eq.symm + apply le_antisymm hHN + by_contra hNH + have hne : H ≠ N := by + intro heq + apply hNH + rw [heq] + have hstrict : H < N := lt_of_le_of_ne hHN hne + have hi := Subgroup.index_strictAnti hstrict + rw [hindexH, hindexN] at hi + exact (Nat.lt_irrefl _ hi) + +/-- For every prime `p`, the norm subgroup of a primitive `p^(k+1)`-st +cyclotomic extension is exactly the subgroup generated by `p` and +`U^(k+1)`. -/ +theorem localNormSubgroup_eq_uniformizerPrincipalSubgroup_cyclotomicPrimePower + {k : ℕ} {L : Type} [Field L] [Algebra ℚ_[p] L] + (zeta : L) (hzeta : IsPrimitiveRoot zeta (p ^ (k + 1))) + (hgen : Algebra.adjoin ℚ_[p] ({zeta} : Set L) = ⊤) : + localNormSubgroup ℚ_[p] L = + LocalFieldTheory.uniformizerPrincipalSubgroup ℚ_[p] + (padicPrimeUnit p) 1 (k + 1) := by + by_cases hp2 : p = 2 + · subst p + exact + localNormSubgroup_eq_uniformizerPrincipalSubgroup_cyclotomicPrimePower_two + zeta hzeta hgen + · exact + localNormSubgroup_eq_uniformizerPrincipalSubgroup_cyclotomicPrimePower_odd + p hp2 zeta hzeta hgen + +end LocalClassFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/StandardSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/StandardSubgroup.lean new file mode 100644 index 0000000000..eb1f7c5174 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/StandardSubgroup.lean @@ -0,0 +1,87 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardSubgroupIntersection +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.PrincipalUnits +/-! +# Standard p-adic norm-subgroup intersections + +The p-adic prime element used by the cyclotomic norm calculation has +normalized valuation `-1`. This file records the corresponding orientation +of the standard unramified/principal-unit intersection lemma. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory +open LocalFieldTheory.Padic +open LocalFieldTheory.IsNonarchimedeanLocalField + +/-- The intersection of the degree-`f` unramified condition and the +depth-`n` principal-unit condition is contained in the standard p-adic +subgroup with prime exponent `f`. -/ +theorem unramifiedNormSubgroup_inf_padicPrincipalSubgroup_le + (p f n : ℕ) [Fact p.Prime] + [IsNonarchimedeanLocalField ℚ_[p]] : + unramifiedNormSubgroup ℚ_[p] f ⊓ + LocalFieldTheory.uniformizerPrincipalSubgroup ℚ_[p] (padicPrimeUnit p) 1 n ≤ + LocalFieldTheory.uniformizerPrincipalSubgroup ℚ_[p] (padicPrimeUnit p) f n := by + intro x hx + rcases Subgroup.mem_sup.mp hx.2 with ⟨y, hy, z, hz, hyz⟩ + rcases Subgroup.mem_zpowers_iff.mp hy with ⟨k, hky⟩ + have hky' : (padicPrimeUnit p) ^ k = y := by + simpa using hky + change z ∈ (principalUnits ℚ_[p] n).map + (integerUnitsToFieldUnits ℚ_[p]) at hz + rcases hz with ⟨u, hu, huz⟩ + have hvz : valuationMap ℚ_[p] (Additive.ofMul z) = 0 := by + rw [← huz] + exact v_integerUnitsToFieldUnits ℚ_[p] u + have hvx : valuationMap ℚ_[p] (Additive.ofMul x) = -k := by + calc + valuationMap ℚ_[p] (Additive.ofMul x) = + valuationMap ℚ_[p] (Additive.ofMul (y * z)) := + congrArg _ hyz.symm + _ = valuationMap ℚ_[p] (Additive.ofMul y) + + valuationMap ℚ_[p] (Additive.ofMul z) := + valuationMap_ofMul_mul ℚ_[p] y z + _ = valuationMap ℚ_[p] + (Additive.ofMul ((padicPrimeUnit p) ^ k)) + 0 := by + rw [hky', hvz] + _ = k * (-1) + 0 := by + rw [valuationMap_ofMul_zpow, valuationMap_padicPrimeUnit] + _ = -k := by ring + have hfneg : (f : ℤ) ∣ -k := by + rw [← hvx] + exact (mem_unramifiedNormSubgroup_iff ℚ_[p] f x).1 hx.1 + obtain ⟨t, ht⟩ := hfneg + have hk : k = (f : ℤ) * (-t) := by + calc + k = -(-k) := by ring + _ = -((f : ℤ) * t) := by rw [ht] + _ = (f : ℤ) * (-t) := by ring + have hyTarget : y ∈ Subgroup.zpowers ((padicPrimeUnit p) ^ f) := by + rw [← hky', Subgroup.mem_zpowers_iff] + refine ⟨-t, ?_⟩ + calc + ((padicPrimeUnit p) ^ f) ^ (-t) = + ((padicPrimeUnit p) ^ (f : ℤ)) ^ (-t) := by + rw [zpow_natCast] + _ = (padicPrimeUnit p) ^ ((f : ℤ) * (-t)) := by + rw [zpow_mul] + _ = (padicPrimeUnit p) ^ k := by rw [← hk] + exact Subgroup.mem_sup.mpr ⟨y, hyTarget, z, ⟨u, hu, huz⟩, hyz⟩ + +end LocalClassFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/Unramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/Unramified.lean new file mode 100644 index 0000000000..d913ca2a5c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/Unramified.lean @@ -0,0 +1,283 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.PrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Lift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.ResidueNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Norm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Uniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Cohomology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv +/-! +# The unramified cyclotomic norm subgroup over `ℚ_p` + +This file joins the canonical-valuation form of the unramified cyclotomic theorem to the +unramified norm computation. For a field generated by a +primitive root of order `p ^ f - 1`, that theorem supplies the +unramified extension of degree `f`; the result below expresses its norm +subgroup in the spectral-norm presentation used by local class field theory. +-/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + hasExtension_valuation_of_valuationSubring_pullback → + hasExtension_valuation_of_valuationSubring_pullback + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + valuationSubring_isIntegralClosure_of_isIntegral → + valuationSubring_isIntegralClosure_of_isIntegral + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + target_valuationSubring_eq_of_finite_separable → + target_valuationSubring_eq_of_finite_separable + + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory.Padic +open ValuationTheory + +open scoped NNReal ValuativeRel + +private theorem map_maximalIdeal_of_ringEquiv_square + {A B C D : Type*} [CommRing A] [CommRing B] [CommRing C] [CommRing D] + [IsLocalRing A] [IsLocalRing B] [IsLocalRing C] [IsLocalRing D] + (eBase : A ≃+* B) (eTarget : C ≃+* D) (f : B →+* C) (g : A →+* D) + (hcommute : eTarget.toRingHom.comp (f.comp eBase.toRingHom) = g) + (hmap : Ideal.map f (IsLocalRing.maximalIdeal B) = IsLocalRing.maximalIdeal C) : + Ideal.map g (IsLocalRing.maximalIdeal A) = IsLocalRing.maximalIdeal D := by + rw [← hcommute, ← Ideal.map_map, ← Ideal.map_map, + ringEquiv_map_maximalIdeal eBase, hmap, ringEquiv_map_maximalIdeal eTarget] + +/-- Let `L/ℚ_p` be generated by a primitive root of order `p ^ f - 1`. +The unramified cyclotomic theorem identifies `L` with the unramified extension of degree +`f`; consequently its norm subgroup is `⟨p ^ f⟩ × U¹`. + +The proof compares the complete-DVF valuation with the spectral valuation +used by the unramified norm theorem. Uniqueness of the +extended valuation on the finite separable extension transports +ramification index one between the two presentations. -/ +theorem normSubgroup_eq_unramifiedNormSubgroup_padic_prime_pow_sub_one + (p f : ℕ) [Fact p.Prime] (hf : 0 < f) + (L : Type) [Field L] [Algebra ℚ_[p] L] + [FiniteDimensional ℚ_[p] L] [IsGalois ℚ_[p] L] + [IsNonarchimedeanLocalField ℚ_[p]] + {ζ : L} (hζ : IsPrimitiveRoot ζ (p ^ f - 1)) + (hζgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) : + LocalFieldTheory.localNormSubgroup ℚ_[p] L = unramifiedNormSubgroup ℚ_[p] f := by + let : NontriviallyNormedField L := + spectralNorm.nontriviallyNormedField ℚ_[p] L + let : NormedSpace ℚ_[p] L := spectralNorm.normedSpace ℚ_[p] L + let : CompleteSpace L := spectralNorm.completeSpace ℚ_[p] L + let : LocallyCompactSpace L := + LocallyCompactSpace.of_finiteDimensional_of_complete ℚ_[p] L + let : IsUltrametricDist L := + ⟨fun x y z => by + change ‖x - z‖ ≤ max ‖x - y‖ ‖y - z‖ + rw [← sub_add_sub_cancel x y z] + exact isNonarchimedean_spectralNorm + (K := ℚ_[p]) (L := L) (x - y) (y - z)⟩ + let : Valued L ℝ≥0 := NormedField.toValued + let vL : Valuation L ℝ≥0 := Valued.v + let : vL.IsNontrivial := + (inferInstance : (NormedField.valuation (K := L)).IsNontrivial) + let : ValuativeRel L := ValuativeRel.ofValuation vL + let : vL.Compatible := Valuation.Compatible.ofValuation vL + let : ValuativeRel.IsNontrivial L := + (ValuativeRel.isNontrivial_iff_isNontrivial vL).2 inferInstance + let : IsValuativeTopology L := + LocalFieldTheory.isValuativeTopology_of_valued_ofValuation L ℝ≥0 + let : IsNonarchimedeanLocalField L := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + let : (ValuativeRel.valuation ℚ_[p]).HasExtension + (ValuativeRel.valuation L) := by + apply Valuation.HasExtension.ofComapInteger + ext x + change ValuativeRel.valuation L (algebraMap ℚ_[p] L x) ≤ 1 ↔ + ValuativeRel.valuation ℚ_[p] x ≤ 1 + rw [← (ValuativeRel.valuation L).vle_one_iff, vL.vle_one_iff] + change spectralNorm ℚ_[p] L (algebraMap ℚ_[p] L x) ≤ 1 ↔ + ValuativeRel.valuation ℚ_[p] x ≤ 1 + rw [spectralNorm_extends] + rw [← integer_mem_iff_norm_le_one p x, + Valuation.mem_integer_iff] + let base := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p + let : base.valuation.HasExtension vL := by + apply Valuation.HasExtension.ofComapInteger + ext x + change vL (algebraMap ℚ_[p] L x) ≤ 1 ↔ base.valuation x ≤ 1 + change spectralNorm ℚ_[p] L (algebraMap ℚ_[p] L x) ≤ 1 ↔ + x ∈ base.valuation.valuationSubring + rw [spectralNorm_extends] + constructor + · intro hx + let u : 𝒪[ℚ_[p]] := + ⟨x, (integer_mem_iff_norm_le_one p x).2 hx⟩ + exact (integerRingEquivPadicDVRValuationSubring p u).property + · intro hx + let y : base.valuationSubring := ⟨x, hx⟩ + let u : 𝒪[ℚ_[p]] := + (integerRingEquivPadicDVRValuationSubring p).symm y + have hu : (u : ℚ_[p]) = x := by + calc + (u : ℚ_[p]) = + ((integerRingEquivPadicDVRValuationSubring p u : + base.valuationSubring) : ℚ_[p]) := by rfl + _ = (y : ℚ_[p]) := congrArg Subtype.val + ((integerRingEquivPadicDVRValuationSubring p).apply_symm_apply y) + _ = x := rfl + have humem : + (u : ℚ_[p]) ∈ (ValuativeRel.valuation ℚ_[p]).integer := u.property + have hunorm := + (integer_mem_iff_norm_le_one p (u : ℚ_[p])).1 humem + simpa [hu] using hunorm + let : Algebra.IsIntegral 𝒪[ℚ_[p]] 𝒪[L] := ⟨by + intro y + apply IsIntegral.tower_bot + (R := 𝒪[ℚ_[p]]) (A := 𝒪[L]) (B := L) + (Subring.subtype_injective (ValuativeRel.valuation L).integer) + have hyv : vL (y : L) ≤ 1 := by + apply (vL.vle_one_iff).1 + apply ((ValuativeRel.valuation L).vle_one_iff).2 + exact y.property + have hynorm : ‖(y : L)‖ ≤ 1 := by + have hynormNN : ‖(y : L)‖₊ ≤ 1 := by + simpa [vL, NormedField.valuation_apply] using hyv + exact_mod_cast hynormNN + change spectralNorm ℚ_[p] L (y : L) ≤ 1 at hynorm + have hcoeffNorm : + ∀ n : ℕ, ‖(minpoly ℚ_[p] (y : L)).coeff n‖ ≤ 1 := + (spectralValue_le_one_iff + (minpoly.monic (Algebra.IsIntegral.isIntegral (y : L)))).1 + (by simpa [spectralNorm] using hynorm) + have hcoeff : + (↑(minpoly ℚ_[p] (y : L)).coeffs : Set ℚ_[p]) ⊆ + (ValuativeRel.valuation ℚ_[p]).integer := by + intro c hc + obtain ⟨n, _hn, rfl⟩ := Polynomial.mem_coeffs_iff.mp hc + exact (integer_mem_iff_norm_le_one p _).2 (hcoeffNorm n) + let q : Polynomial 𝒪[ℚ_[p]] := + (minpoly ℚ_[p] (y : L)).toSubring + (ValuativeRel.valuation ℚ_[p]).integer hcoeff + refine ⟨q, ?_, ?_⟩ + · exact (Polynomial.monic_toSubring + (minpoly ℚ_[p] (y : L)) + (ValuativeRel.valuation ℚ_[p]).integer hcoeff).2 + (minpoly.monic (Algebra.IsIntegral.isIntegral (y : L))) + · have hmaproot : + Polynomial.aeval (y : L) + (q.map (algebraMap 𝒪[ℚ_[p]] ℚ_[p])) = 0 := by + dsimp only [q] + rw [show algebraMap 𝒪[ℚ_[p]] ℚ_[p] = + (ValuativeRel.valuation ℚ_[p]).integer.subtype from rfl, + Polynomial.map_toSubring] + exact minpoly.aeval ℚ_[p] (y : L) + rwa [Polynomial.aeval_map_algebraMap ℚ_[p] (y : L) q] at hmaproot⟩ + let : Algebra.IsIntegral + (ValuativeRel.valuation ℚ_[p]).valuationSubring + (ValuativeRel.valuation L).valuationSubring := by + change Algebra.IsIntegral 𝒪[ℚ_[p]] 𝒪[L] + infer_instance + let hIntegralClosure : IsIntegralClosure 𝒪[L] 𝒪[ℚ_[p]] L := + valuationSubring_isIntegralClosure_of_isIntegral + (ValuativeRel.valuation ℚ_[p]) (ValuativeRel.valuation L) + let : IsIntegralClosure 𝒪[L] 𝒪[ℚ_[p]] L := hIntegralClosure + let : Module.Finite 𝒪[ℚ_[p]] 𝒪[L] := + LocalFieldTheory.integerRing_moduleFinite_of_isIntegralClosure ℚ_[p] L + obtain ⟨target, hExt, hTarget, _hUnram, _hdegree⟩ := + AlgebraicNumberTheory.Valuations.exists_padicCyclotomic_completeDVF_isFiniteUnramified_degree_eq + p f hf hζ hζgen + let : base.valuation.HasExtension target.valuation := hExt + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := hTarget + let : base.valuation.HasExtension vL.valuationSubring.valuation := by + apply + hasExtension_valuation_of_valuationSubring_pullback + intro x + change vL (algebraMap ℚ_[p] L x) ≤ 1 ↔ base.valuation x ≤ 1 + exact _root_.Valuation.HasExtension.val_map_le_one_iff base.valuation vL x + have hTargetEq : target.valuation.valuationSubring = vL.valuationSubring := + target_valuationSubring_eq_of_finite_separable + (base := base) (target := target) vL.valuationSubring + let eBase : 𝒪[ℚ_[p]] ≃+* base.valuationSubring := + integerRingEquivPadicDVRValuationSubring p + let eTarget : target.valuationSubring ≃+* 𝒪[L] := + { toFun := fun x => ⟨x, by + change ValuativeRel.valuation L (x : L) ≤ 1 + apply ((ValuativeRel.valuation L).vle_one_iff).1 + apply (vL.vle_one_iff).2 + change (x : L) ∈ vL.valuationSubring + rw [← hTargetEq] + exact x.property⟩ + invFun := fun x => ⟨x, by + change target.valuation (x : L) ≤ 1 + change (x : L) ∈ target.valuation.valuationSubring + rw [hTargetEq] + apply (vL.vle_one_iff).1 + apply ((ValuativeRel.valuation L).vle_one_iff).2 + exact x.property⟩ + left_inv := fun x => Subtype.ext rfl + right_inv := fun x => Subtype.ext rfl + map_mul' := fun _ _ => Subtype.ext rfl + map_add' := fun _ _ => Subtype.ext rfl } + let iCanonical : base.valuationSubring →+* target.valuationSubring := + algebraMap base.valuationSubring target.valuationSubring + let iLocal : 𝒪[ℚ_[p]] →+* 𝒪[L] := algebraMap 𝒪[ℚ_[p]] 𝒪[L] + let : IsDiscreteValuationRing base.valuationSubring := + base.valuationSubring_isDiscreteValuationRing + let : IsDiscreteValuationRing target.valuationSubring := + target.valuationSubring_isDiscreteValuationRing + have hramCanonical : + Ideal.ramificationIdx' + (IsLocalRing.maximalIdeal base.valuationSubring) + (IsLocalRing.maximalIdeal target.valuationSubring) = 1 := + AlgebraicNumberTheory.Valuations.padicCyclotomic_ramificationIndex_eq_one_prime_pow_sub_one + p f hf hζ hζgen target + have hiCanonical : Function.Injective iCanonical := + fun _ _ hxy => Subtype.ext ((algebraMap ℚ_[p] L).injective (congrArg Subtype.val hxy)) + have hmapCanonical : + Ideal.map iCanonical (IsLocalRing.maximalIdeal base.valuationSubring) = + IsLocalRing.maximalIdeal target.valuationSubring := by + have hmap := map_maximalIdeal_eq_pow_ramificationIdx hiCanonical + simpa only [hramCanonical, pow_one] using hmap + have hmapLocal := map_maximalIdeal_of_ringEquiv_square + eBase eTarget iCanonical iLocal (by ext x; rfl) hmapCanonical + let : LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + ℚ_[p] L := ⟨by + have hp : (IsLocalRing.maximalIdeal 𝒪[ℚ_[p]]) ≠ ⊥ := + IsDiscreteValuationRing.not_a_field 𝒪[ℚ_[p]] + rw [← Ideal.ramificationIdx'_eq_ramificationIdx + (IsLocalRing.maximalIdeal 𝒪[ℚ_[p]]) + (IsLocalRing.maximalIdeal 𝒪[L]) hp] + apply Ideal.ramificationIdx'_spec + · rw [hmapLocal, pow_one] + · rw [hmapLocal] + simpa using not_le_of_gt (Ideal.pow_succ_lt_pow + (IsDiscreteValuationRing.not_a_field 𝒪[L]) 1)⟩ + calc + LocalFieldTheory.localNormSubgroup ℚ_[p] L = + unramifiedNormSubgroup ℚ_[p] (Module.finrank ℚ_[p] L) := + normSubgroup_eq_unramifiedNormSubgroup_of_isIntegralClosure ℚ_[p] L + _ = unramifiedNormSubgroup ℚ_[p] f := by + rw [AlgebraicNumberTheory.Valuations.padicCyclotomic_finrank_prime_pow_sub_one + p f hf hζ hζgen] + +end LocalClassFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence.lean new file mode 100644 index 0000000000..b4ba64c2d7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence.lean @@ -0,0 +1,42 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CharacteristicZero +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.Classification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CyclotomicKummerDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristicDominatingExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.FiniteUnramifiedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.KummerNormOpen +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LocalAbsoluteData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LubinTateUniformizerDiagonal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MathlibFieldClassification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MaximalKummerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupOrderEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupRingEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupSurjectivity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianNorms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianNorms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkIntermediateFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkLocalClassification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkOpenSubgroups +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkSeparableClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardDominatingExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardLubinTate +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardSubgroupIntersection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedLubinTateDiagonal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnshrinkFiniteAbelianFields + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/All.lean new file mode 100644 index 0000000000..6b37c36336 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/All.lean @@ -0,0 +1,50 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CharacteristicZero +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.Classification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CyclotomicKummerDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristicDominatingExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.FiniteUnramifiedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.KummerNormOpen +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LocalAbsoluteData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LubinTateUniformizerDiagonal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MathlibFieldClassification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MaximalKummerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupOrderEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupRingEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupSurjectivity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianNorms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianNorms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkIntermediateFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkLocalClassification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkOpenSubgroups +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkSeparableClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardDominatingExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardLubinTate +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardSubgroupIntersection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedLubinTateDiagonal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnshrinkFiniteAbelianFields +/-! +# Finite local existence theorem + +The ordinary norm-subgroup assignment is an order embedding into the +opposite poset of native open finite-index subgroups. Kummer theory in +characteristic zero and transported Lubin--Tate levels in positive +characteristic prove the existing characteristic-specific order +isomorphisms. The canonical standard Lubin--Tate construction now also +provides a characteristic-independent finite abelian factor with its exact +norm subgroup. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CharacteristicZero.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CharacteristicZero.lean new file mode 100644 index 0000000000..09bd266536 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CharacteristicZero.lean @@ -0,0 +1,89 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CyclotomicKummerDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupSurjectivity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +/-! +# Local existence theorem in characteristic zero + +Kummer theory supplies a finite Galois norm subgroup inside the power +subgroup attached to any finite-index subgroup of `Kˣ`. Consequently the +ordinary norm-subgroup order embedding is surjective, hence an order +isomorphism. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [CharZero K] + +/-- In characteristic zero, every native open finite-index subgroup of +`Kˣ` is the norm subgroup of a finite abelian extension. -/ +theorem finiteAbelianNormSubgroupMap_surjective_of_charZero : + Function.Surjective (finiteAbelianNormSubgroupMap K) := by + apply finiteAbelianNormSubgroupMap_surjective_of_normOpen K + intro H _hH + have hindex : H.index ≠ 0 := Subgroup.FiniteIndex.index_ne_zero + let n : ℕ+ := ⟨H.index, Nat.pos_of_ne_zero hindex⟩ + have hnK : ((n : ℕ) : K) ≠ 0 := by + exact_mod_cast n.ne_zero + obtain ⟨F, hnormF⟩ := + exists_finiteGalois_normSubgroup_le_powMonoidHom_range K n hnK + let E : IntermediateField K (SeparableClosure K) := F + let : FiniteDimensional K E := F.finiteDimensional + let : IsGalois K E := F.isGalois + apply finiteIndexSubgroup_isNormOpen_of_normSubgroup_le K E H + intro x hx + have hxPower : x ∈ (powMonoidHom H.index : Kˣ →* Kˣ).range := by + simpa [E, n] using hnormF hx + obtain ⟨y, rfl⟩ := + (MonoidHom.mem_range (G := Kˣ)).1 hxPower + exact H.pow_index_mem y + +/-- Characteristic-zero local existence as an order isomorphism: finite +abelian subextensions, ordered by inclusion, correspond to native open +finite-index subgroups of `Kˣ` with the opposite inclusion order. -/ +noncomputable def finiteAbelianNormSubgroupOrderIsoOfCharZero : + FiniteAbelianSubextension (intrinsicAbstractBase K) ≃o + (OpenFiniteIndexSubgroup K)ᵒᵈ where + toEquiv := Equiv.ofBijective (finiteAbelianNormSubgroupMap K) + ⟨finiteAbelianNormSubgroupMap_injective K, + finiteAbelianNormSubgroupMap_surjective_of_charZero K⟩ + map_rel_iff' := by + intro L₁ L₂ + change finiteAbelianNormSubgroup K L₂ ≤ + finiteAbelianNormSubgroup K L₁ ↔ L₁ ≤ L₂ + exact (finiteAbelianSubextension_le_iff_normSubgroup_le K L₁ L₂).symm + +/-- Underlying equivalence of the characteristic-zero local existence +order isomorphism. -/ +noncomputable def finiteAbelianNormSubgroupEquivOfCharZero : + FiniteAbelianSubextension (intrinsicAbstractBase K) ≃ + OpenFiniteIndexSubgroup K := + (finiteAbelianNormSubgroupOrderIsoOfCharZero K).toEquiv + +/-- States the theorem `finiteAbelianNormSubgroupOrderIso_of_charZero_apply`. -/ +@[simp] +theorem finiteAbelianNormSubgroupOrderIso_of_charZero_apply + (L : FiniteAbelianSubextension (intrinsicAbstractBase K)) : + finiteAbelianNormSubgroupOrderIsoOfCharZero K L = + finiteAbelianNormSubgroupMap K L := by + rfl + +end LocalClassFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/Classification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/Classification.lean new file mode 100644 index 0000000000..0197f50af8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/Classification.lean @@ -0,0 +1,76 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CharacteristicZero +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +/-! +# Classification by open finite-index norm subgroups + +Combining the mixed- and equal-characteristic existence arguments gives the +unconditional order isomorphism between finite abelian subextensions of the +fixed separable closure and open finite-index subgroups of the local +multiplicative group. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- Every native open finite-index subgroup of `Kˣ` is the norm subgroup of +a finite abelian subextension of the fixed separable closure. -/ +theorem finiteAbelianNormSubgroupMap_surjective : + Function.Surjective (finiteAbelianNormSubgroupMap K) := by + classical + by_cases hcharZero : CharZero K + · let : CharZero K := hcharZero + exact finiteAbelianNormSubgroupMap_surjective_of_charZero K + · obtain ⟨p, hp, hKp⟩ := (CharP.exists' K).resolve_left hcharZero + let : Fact p.Prime := hp + let : CharP K p := hKp + exact finiteAbelianNormSubgroupMap_surjective_of_charP K p + +/-- **Finite local existence theorem.** Finite abelian subextensions, +ordered by field inclusion, correspond to native open finite-index subgroups +of `Kˣ` with the opposite inclusion order. -/ +noncomputable def finiteAbelianNormSubgroupOrderIso : + FiniteAbelianSubextension (intrinsicAbstractBase K) ≃o + (OpenFiniteIndexSubgroup K)ᵒᵈ where + toEquiv := Equiv.ofBijective (finiteAbelianNormSubgroupMap K) + ⟨finiteAbelianNormSubgroupMap_injective K, + finiteAbelianNormSubgroupMap_surjective K⟩ + map_rel_iff' := by + intro L₁ L₂ + change finiteAbelianNormSubgroup K L₂ ≤ + finiteAbelianNormSubgroup K L₁ ↔ L₁ ≤ L₂ + exact (finiteAbelianSubextension_le_iff_normSubgroup_le K L₁ L₂).symm + +/-- Underlying equivalence of the finite local existence order isomorphism. -/ +noncomputable def finiteAbelianNormSubgroupEquiv : + FiniteAbelianSubextension (intrinsicAbstractBase K) ≃ + OpenFiniteIndexSubgroup K := + (finiteAbelianNormSubgroupOrderIso K).toEquiv + +/-- States the theorem `finiteAbelianNormSubgroupOrderIso_apply`. -/ +@[simp] +theorem finiteAbelianNormSubgroupOrderIso_apply + (L : FiniteAbelianSubextension (intrinsicAbstractBase K)) : + finiteAbelianNormSubgroupOrderIso K L = + finiteAbelianNormSubgroupMap K L := + rfl + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CyclotomicKummerDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CyclotomicKummerDescent.lean new file mode 100644 index 0000000000..e9b52a5f20 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CyclotomicKummerDescent.lean @@ -0,0 +1,195 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.Cyclotomic.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MaximalKummerNorm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormSubgroupFunctoriality +/-! +# Cyclotomic descent for maximal Kummer norm subgroups + +For an exponent nonzero in the base field, adjoining the roots of unity, +applying maximal Kummer theory, and descending the norm inclusion produces a +finite Galois extension whose norm subgroup is contained in `Kˣⁿ`. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open scoped NNReal ValuativeRel +open CyclicCohomology KummerTheory ClassFormation +open LocalFieldTheory.DiscreteValuationField LocalFieldTheory + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- There is a finite Galois extension whose local norm subgroup is contained +in the `n`-th-power subgroup, without assuming roots of unity in the base. -/ +theorem exists_finiteGalois_normSubgroup_le_powMonoidHom_range + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) : + ∃ E : FiniteGaloisIntermediateField K (SeparableClosure K), + localNormSubgroup K (E : IntermediateField K (SeparableClosure K)) ≤ + (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range := by + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + let : NeZero ((n : ℕ) : K) := ⟨hnK⟩ + let C := CyclotomicField (n : ℕ) K + let : FiniteDimensional K C := + IsCyclotomicExtension.finiteDimensional {(n : ℕ)} K C + let : IsGalois K C := + IsCyclotomicExtension.isGalois {(n : ℕ)} K C + obtain ⟨zeta, hzeta⟩ := + (CyclotomicField.isCyclotomicExtension (n : ℕ) K).exists_isPrimitiveRoot + (Set.mem_singleton (n : ℕ)) n.ne_zero + let j : C →ₐ[K] SeparableClosure K := IsSepClosed.lift + let K1 := AlgHom.fieldRange j + let eC : C ≃ₐ[K] K1 := AlgEquiv.ofInjectiveField j + let : FiniteDimensional K K1 := eC.toLinearEquiv.finiteDimensional + let : IsGalois K K1 := IsGalois.of_algEquiv eC + have hnK1 : ((n : ℕ) : K1) ≠ 0 := by + intro h + apply hnK + apply (algebraMap K K1).injective + simpa using h + have hmu1 : (primitiveRoots (n : ℕ) K1).Nonempty := + ⟨eC zeta, (mem_primitiveRoots n.pos).2 + (hzeta.map_of_injective eC.injective)⟩ + let : UniformSpace K := IsTopologicalAddGroup.rightUniformSpace K + let : IsUniformAddGroup K := isUniformAddGroup_of_addCommGroup + let : Valued K (ValuativeRel.ValueGroupWithZero K) := inferInstance + let : (Valued.v : Valuation K + (ValuativeRel.ValueGroupWithZero K)).RankOne := + { hom' := ValuativeRel.IsRankLeOne.nonempty.some.emb (R := K) |>.comp + MonoidWithZeroHom.ValueGroup₀.embedding + strictMono' := ValuativeRel.IsRankLeOne.nonempty.some.strictMono.comp + MonoidWithZeroHom.ValueGroup₀.embedding_strictMono } + let : NontriviallyNormedField K := + Valued.toNontriviallyNormedField + (L := K) (Γ₀ := ValuativeRel.ValueGroupWithZero K) + let : CompleteSpace K := inferInstance + let : NontriviallyNormedField K1 := + spectralNorm.nontriviallyNormedField K K1 + let : NormedSpace K K1 := spectralNorm.normedSpace K K1 + let : NormedAlgebra K K1 := + { (inferInstance : Algebra K K1) with + norm_smul_le := NormedSpace.norm_smul_le } + let : CompleteSpace K1 := spectralNorm.completeSpace K K1 + let : LocallyCompactSpace K1 := + LocallyCompactSpace.of_finiteDimensional_of_complete K K1 + let : IsUltrametricDist K1 := + ⟨fun x y z => by + change ‖x - z‖ ≤ max ‖x - y‖ ‖y - z‖ + rw [← sub_add_sub_cancel x y z] + exact isNonarchimedean_spectralNorm + (K := K) (L := K1) (x - y) (y - z)⟩ + let : Valued K1 ℝ≥0 := NormedField.toValued + let vK1 : Valuation K1 ℝ≥0 := Valued.v + let : vK1.IsNontrivial := + (inferInstance : (NormedField.valuation (K := K1)).IsNontrivial) + let : ValuativeRel K1 := ValuativeRel.ofValuation vK1 + let : vK1.Compatible := Valuation.Compatible.ofValuation vK1 + let : ValuativeRel.IsNontrivial K1 := + (ValuativeRel.isNontrivial_iff_isNontrivial vK1).2 inferInstance + let : IsValuativeTopology K1 := + isValuativeTopology_of_valued_ofValuation K1 ℝ≥0 + let : IsNonarchimedeanLocalField K1 := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + let : IsScalarTower K K1 (SeparableClosure K) := by + apply IsScalarTower.of_algebraMap_eq + intro x + rfl + let : Algebra.IsSeparable K1 (SeparableClosure K) := + Algebra.isSeparable_tower_top_of_isSeparable K K1 (SeparableClosure K) + let : IsSepClosure K1 (SeparableClosure K) := + { sep_closed := inferInstance + separable := inferInstance } + let Delta := KummerTheory.maximalKummerSubgroup K1 n + let L1 := kummerRadicalExtension + (K := K1) (Omega := SeparableClosure K) n Delta.1 + let : IsGalois K1 L1 := + kummerRadicalExtension_isGalois + (K := K1) (Omega := SeparableClosure K) n Delta.1 + let : FiniteDimensional K1 L1 := + KummerTheory.maximalKummerRadicalExtension_finiteDimensional + (K := K1) (Omega := SeparableClosure K) n hnK1 hmu1 + let : Module.Free K1 L1 := Module.Free.of_divisionRing K1 L1 + have hnormK1 : + localNormSubgroup K1 L1 = (powMonoidHom (n : ℕ) : K1ˣ →* K1ˣ).range := by + simpa only [L1, Delta] using + maximalKummerNormSubgroup_eq_powMonoidHom_range + (K := K1) (Omega := SeparableClosure K) n hnK1 hmu1 + have hnormL1 : + localNormSubgroup K L1 ≤ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range := by + rintro x ⟨y, rfl⟩ + have hy : normUnits K1 L1 y ∈ (powMonoidHom (n : ℕ) : K1ˣ →* K1ˣ).range := by + rw [← hnormK1] + exact ⟨y, rfl⟩ + rw [MonoidHom.mem_range] at hy ⊢ + obtain ⟨a, ha⟩ := hy + refine ⟨normUnits K K1 a, ?_⟩ + calc + normUnits K K1 a ^ (n : ℕ) = + normUnits K K1 (a ^ (n : ℕ)) := by rw [map_pow] + _ = normUnits K K1 (normUnits K1 L1 y) := congrArg _ ha + _ = normUnits K L1 y := LocalFieldTheory.normUnits_tower K K1 L1 y + let L0 := L1.restrictScalars K + let : FiniteDimensional K L1 := FiniteDimensional.trans K K1 L1 + let eLin : L0 ≃ₗ[K] L1 := + { toFun := fun x => ⟨x.1, x.2⟩ + invFun := fun x => ⟨x.1, x.2⟩ + left_inv := by intro x; ext; rfl + right_inv := by intro x; ext; rfl + map_add' := by intro x y; ext; rfl + map_smul' := by intro a x; ext; rfl } + let : FiniteDimensional K L0 := Module.Finite.equiv eLin.symm + let eL : L1 ≃ₐ[K] L0 := + { toFun := fun x => ⟨x.1, x.2⟩ + invFun := fun x => ⟨x.1, x.2⟩ + left_inv := by intro x; ext; rfl + right_inv := by intro x; ext; rfl + map_add' := by intro x y; ext; rfl + map_mul' := by intro x y; ext; rfl + commutes' := by intro x; ext; rfl } + have hnormL0 : + localNormSubgroup K L0 ≤ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range := by + rw [LocalFieldTheory.normSubgroup_algEquiv K L1 L0 eL] + exact hnormL1 + let F := IntermediateField.normalClosure K L0 (SeparableClosure K) + let : FiniteDimensional K F := + normalClosure.is_finiteDimensional K L0 (SeparableClosure K) + let : IsGalois K F := + IsGalois.normalClosure K L0 (SeparableClosure K) + let hAlgL0F : Algebra L0 F := + (IntermediateField.inclusion + (IntermediateField.le_normalClosure L0)).toAlgebra + let : SMul L0 F := Algebra.toSMul (self := hAlgL0F) + let : Module L0 F := @Algebra.toModule L0 F _ _ hAlgL0F + let : IsScalarTower K L0 F := by + apply IsScalarTower.of_algebraMap_eq + intro x + rfl + let : FiniteDimensional L0 F := FiniteDimensional.right K L0 F + have hnormFL0 : localNormSubgroup K F ≤ localNormSubgroup K L0 := + LocalFieldTheory.normSubgroup_le_of_tower K L0 F + have hnormF : localNormSubgroup K F ≤ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range := by + intro x hx + exact hnormL0 (hnormFL0 hx) + let E : FiniteGaloisIntermediateField K (SeparableClosure K) := + { toIntermediateField := F + finiteDimensional := inferInstance + isGalois := inferInstance } + exact ⟨E, by simpa [E] using hnormF⟩ + +end LocalClassFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristic.lean new file mode 100644 index 0000000000..dbb7339033 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristic.lean @@ -0,0 +1,625 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Series +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.LinearTerm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Intertwiner +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.CoefficientEquation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Reduction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCoefficient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCorrection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.DegreeStabilization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveIntertwiner +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerCoefficient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.CompletedSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.DefectCorrection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.IntertwinerConstruction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarEndomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerPrimitive +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerThetaFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedResidueFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedStandardLevelTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedFrobeniusFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeIntertwiner +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.DivisionPolynomial +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.GaloisParameterFiltration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HerbrandFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HigherUnitLevelEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelFieldTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveDisplacement +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LocalUpperRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ParameterCongruence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveEisenstein +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveRoot +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveTorsion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedIterates +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameters +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameterFiltration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedPrimitiveEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedLevelCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.UpperRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamificationFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedPrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedPolynomialEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizerNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusBaseEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldCoefficientDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPowerBasis +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPrimitive +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectBracketAtCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracketRecursion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectTargetLevelEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFirstIdentity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFrobeniusFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaIteration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaAtCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaLocalInverse +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FreeRankOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelFieldTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.UnitQuotientGalois +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.AmbientBracketAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.DivisionModuleEndomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateEndomorphism +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CoefficientFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CompletedUnramifiedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.ContractingEquation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.LaurentSeriesFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFrobeniusFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitsNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.LevelAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.StandardSubgroupNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitQuotientCard +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaCoefficients +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaUniqueness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.RealIndexSteps +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LubinTateTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LaurentPrincipalUnitTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedLevelTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardSubgroupIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormSubgroupExact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.TransportedNormSubgroupExact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.PadicMultiplicativeArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicUpperFiltration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardSubgroupIntersection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupSurjectivity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm +/-! +# Equal-characteristic existence for local class field theory + +The explicit Lubin--Tate level over the Laurent-series model is transported +to an arbitrary equal-characteristic local field. Together with an +unramified extension, it supplies a finite Galois extension whose norm +subgroup lies in any prescribed open finite-index subgroup of `Kˣ`. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open LubinTate.EqualCharacteristic + +variable (K : Type) [Field K] + +section LocalField + +variable [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- A transported equal-characteristic Lubin--Tate level whose norm subgroup +is contained in the prescribed uniformizer/principal-unit subgroup. -/ +theorem exists_equalCharacteristicLubinTateFiniteGaloisExtension_normSubgroup_map_le + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : _root_.LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul ϖ) = 1) + (n : ℕ) (hn : 0 < n) : + ∃ T : FiniteGaloisSubextension (intrinsicAbstractBase K), + (T.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom ≤ + (LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ 1 n).toAddSubgroup := by + let F := equalCharacteristicTargetLocalField K + let hKres : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F (n - 1) + let : CharP K p := hKp + let : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ (n - 1) + let : FiniteDimensional K E := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ (n - 1) + let : IsAbelianGalois K E := + equalCharacteristicTransportedLubinTateLevel_isAbelianGalois + K p ϖ hϖ (n - 1) + have hLT : + localNormSubgroup K E ≤ + LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ 1 n := by + simpa [equalCharacteristicTransportedLubinTateNormSubgroup, F, E] using + (equalCharacteristicTransportedLubinTateNormSubgroup_le_of_pos + K p ϖ hϖ n hn) + exact + exists_finiteGaloisExtension_normSubgroup_map_le_of_normSubgroup_le + K E (LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ 1 n) hLT + +/-- The transported Lubin--Tate level retained as a named finite abelian +subextension of the fixed separable closure. -/ +noncomputable def + equalCharacteristicTransportedLubinTateFiniteAbelianSubextension + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : _root_.LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul ϖ) = 1) + (m : ℕ) : + FiniteAbelianSubextension (intrinsicAbstractBase K) := by + let F := equalCharacteristicTargetLocalField K + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + letI : CharP K p := hKp + letI : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra K p ϖ hϖ m + letI : FiniteDimensional K E := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ m + letI : IsAbelianGalois K E := + equalCharacteristicTransportedLubinTateLevel_isAbelianGalois + K p ϖ hϖ m + exact + finiteAbelianAbstractExtensionOfEmbedding K E + (AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K E) + +/-- The explicit transported Lubin--Tate level is base-linearly equivalent +to the concrete fixed field represented by its named finite abelian +subextension. -/ +noncomputable def equalCharacteristicTransportedLubinTateFixedFieldEquiv + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : _root_.LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul ϖ) = 1) + (m : ℕ) : + let F := equalCharacteristicTargetLocalField K + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + letI : CharP K p := hKp + letI : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra K p ϖ hϖ m + E ≃ₐ[K] + abstractFixedField K (SeparableClosure K) + (equalCharacteristicTransportedLubinTateFiniteAbelianSubextension + K p ϖ hϖ m).field := by + let F := equalCharacteristicTargetLocalField K + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + letI : CharP K p := hKp + letI : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra K p ϖ hϖ m + letI : FiniteDimensional K E := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ m + letI : IsAbelianGalois K E := + equalCharacteristicTransportedLubinTateLevel_isAbelianGalois + K p ϖ hϖ m + let i := AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K E + let T := + equalCharacteristicTransportedLubinTateFiniteAbelianSubextension + K p ϖ hϖ m + have hfixed : + abstractFixedField K (SeparableClosure K) T.field = + finiteGaloisFieldRangeOfEmbedding K E i := by + change + IntermediateField.fixedField + (finiteGaloisFieldRangeOfEmbedding K E i).fixingSubgroup = + finiteGaloisFieldRangeOfEmbedding K E i + exact + InfiniteGalois.fixedField_fixingSubgroup + (finiteGaloisFieldRangeOfEmbedding K E i) + rw [hfixed] + exact finiteGaloisFieldRangeEquivOfEmbedding K E i + +/-- The named transported Lubin--Tate subextension retains the concrete norm +containment at level `m + 1`. -/ +theorem + equalCharacteristicTransportedLubinTateFiniteAbelianSubextension_normSubgroup_map_le + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : _root_.LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul ϖ) = 1) + (m : ℕ) : + let T := + equalCharacteristicTransportedLubinTateFiniteAbelianSubextension + K p ϖ hϖ m + (T.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom ≤ + (LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ 1 (m + 1)).toAddSubgroup := by + let F := equalCharacteristicTargetLocalField K + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + let : CharP K p := hKp + let : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra K p ϖ hϖ m + let : FiniteDimensional K E := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ m + let : IsAbelianGalois K E := + equalCharacteristicTransportedLubinTateLevel_isAbelianGalois + K p ϖ hϖ m + have hLT : + localNormSubgroup K E ≤ + LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ 1 (m + 1) := by + simpa [equalCharacteristicTransportedLubinTateNormSubgroup, F, E] using + (equalCharacteristicTransportedLubinTateNormSubgroup_le_uniformizerPrincipalSubgroup + K p ϖ hϖ m) + let i := AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K E + let T := + equalCharacteristicTransportedLubinTateFiniteAbelianSubextension + K p ϖ hϖ m + have hmap : + (T.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom = + additiveNormSubgroup K E := by + simpa [T, + equalCharacteristicTransportedLubinTateFiniteAbelianSubextension, + i, F, E] using + map_finiteAbelianAbstractExtension_normSubgroup_eq K E i + change + (T.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom ≤ + (LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ 1 (m + 1)).toAddSubgroup + rw [hmap] + intro x hx + change Additive.toMul x ∈ LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ 1 (m + 1) + apply hLT + exact hx + +/-- The transported equal-characteristic Lubin--Tate level, packaged as a +finite abelian subextension of the fixed separable closure. -/ +theorem exists_equalCharacteristicLubinTateFiniteAbelianExtension_normSubgroup_map_le + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : _root_.LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul ϖ) = 1) + (n : ℕ) (hn : 0 < n) : + ∃ T : FiniteAbelianSubextension (intrinsicAbstractBase K), + (T.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom ≤ + (LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ 1 n).toAddSubgroup := by + refine + ⟨equalCharacteristicTransportedLubinTateFiniteAbelianSubextension + K p ϖ hϖ (n - 1), ?_⟩ + simpa [Nat.sub_add_cancel hn] using + (equalCharacteristicTransportedLubinTateFiniteAbelianSubextension_normSubgroup_map_le + K p ϖ hϖ (n - 1)) + +/-- The named finite abelian standard compositum: its first factor is the +canonical degree-`d` unramified extension and its second factor is the +transported Lubin--Tate level indexed by `n - 1`, whose norm subgroup uses +the principal-unit level `n`. -/ +noncomputable def equalCharacteristicStandardFiniteAbelianCompositum + (p : ℕ) [Fact p.Prime] [CharP K p] + (ϖ : Kˣ) + (hϖ : _root_.LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul ϖ) = 1) + (d n : ℕ) (hd : 0 < d) : + FiniteAbelianSubextension (intrinsicAbstractBase K) := + (localFiniteUnramifiedAbelianSubextension K d hd).compositum + (equalCharacteristicTransportedLubinTateFiniteAbelianSubextension + K p ϖ hϖ (n - 1)) + +/-- The concrete fixed field of the named standard compositum is the +compositum of its unramified and transported Lubin--Tate fixed fields. -/ +theorem equalCharacteristicStandardFiniteAbelianCompositum_fixedField_eq_sup + (p : ℕ) [Fact p.Prime] [CharP K p] + (ϖ : Kˣ) + (hϖ : _root_.LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul ϖ) = 1) + (d n : ℕ) (hd : 0 < d) : + abstractFixedField K (SeparableClosure K) + (equalCharacteristicStandardFiniteAbelianCompositum + K p ϖ hϖ d n hd).field = + abstractFixedField K (SeparableClosure K) + (localFiniteUnramifiedAbelianSubextension K d hd).field ⊔ + abstractFixedField K (SeparableClosure K) + (equalCharacteristicTransportedLubinTateFiniteAbelianSubextension + K p ϖ hϖ (n - 1)).field := by + simpa [equalCharacteristicStandardFiniteAbelianCompositum] using + (finiteAbelianSubextension_compositum_fixedField K + (localFiniteUnramifiedAbelianSubextension K d hd) + (equalCharacteristicTransportedLubinTateFiniteAbelianSubextension + K p ϖ hϖ (n - 1))) + +/-- The ordinary norm subgroup of the named standard compositum is contained +in every overgroup of `⟨ϖ^d⟩ U^n`. -/ +theorem + equalCharacteristicStandardFiniteAbelianCompositum_nativeNormSubgroup_le + (p : ℕ) [Fact p.Prime] [CharP K p] + (H : Subgroup Kˣ) + (ϖ : Kˣ) (d n : ℕ) + (hϖ : _root_.LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul ϖ) = 1) + (hd : 0 < d) (hn : 0 < n) + (hstandard : LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ d n ≤ H) : + finiteAbelianNormSubgroup K + (equalCharacteristicStandardFiniteAbelianCompositum + K p ϖ hϖ d n hd) ≤ + H := by + let U := localFiniteUnramifiedAbelianSubextension K d hd + let T := + equalCharacteristicTransportedLubinTateFiniteAbelianSubextension + K p ϖ hϖ (n - 1) + have hUle : + (U.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom ≤ + (unramifiedNormSubgroup K d).toAddSubgroup := by + simpa [U] using + localFiniteUnramifiedAbelianSubextension_normSubgroup_map_le + K d hd + have hTle : + (T.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom ≤ + (LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ 1 n).toAddSubgroup := by + simpa [T, Nat.sub_add_cancel hn] using + (equalCharacteristicTransportedLubinTateFiniteAbelianSubextension_normSubgroup_map_le + K p ϖ hϖ (n - 1)) + have hP : + (U.compositum T).normSubgroup (intrinsicAbsoluteUnits K) ≤ + H.toAddSubgroup.map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).toAddMonoidHom := + finiteAbelianCompositum_normSubgroup_le_of_standard + K H ϖ d n hϖ hstandard U T hUle hTle + simpa [equalCharacteristicStandardFiniteAbelianCompositum, U, T] using + (finiteAbelianNormSubgroup_le_of_abstractNormSubgroup_le_map + K (U.compositum T) H hP) + +/-- The two finite abelian factors of the positive-characteristic standard +construction can be retained explicitly, together with their norm controls +and the native norm containment for their compositum. -/ +theorem + exists_equalCharacteristicStandardFiniteAbelianCompositum_nativeNormSubgroup_le + (p : ℕ) [Fact p.Prime] [CharP K p] + (H : Subgroup Kˣ) + (ϖ : Kˣ) (d n : ℕ) + (hϖ : _root_.LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul ϖ) = 1) + (hd : 0 < d) (hn : 0 < n) + (hstandard : LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ d n ≤ H) : + ∃ U T : FiniteAbelianSubextension (intrinsicAbstractBase K), + (U.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom ≤ + (unramifiedNormSubgroup K d).toAddSubgroup ∧ + (T.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom ≤ + (LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ 1 n).toAddSubgroup ∧ + finiteAbelianNormSubgroup K (U.compositum T) ≤ H := by + obtain ⟨U, hUle⟩ := + exists_unramifiedFiniteAbelianExtension_normSubgroup_map_le K d hd + obtain ⟨T, hTle⟩ := + exists_equalCharacteristicLubinTateFiniteAbelianExtension_normSubgroup_map_le + K p ϖ hϖ n hn + have hP : + (U.compositum T).normSubgroup (intrinsicAbsoluteUnits K) ≤ + H.toAddSubgroup.map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).toAddMonoidHom := + finiteAbelianCompositum_normSubgroup_le_of_standard + K H ϖ d n hϖ hstandard U T hUle hTle + refine ⟨U, T, hUle, hTle, ?_⟩ + exact + finiteAbelianNormSubgroup_le_of_abstractNormSubgroup_le_map + K (U.compositum T) H hP + +/-- A standard subgroup in positive characteristic is dominated by the norm +subgroup of an explicitly assembled finite abelian compositum: an unramified +factor controls the uniformizer exponent and a transported Lubin--Tate factor +controls the principal units. -/ +theorem exists_equalCharacteristicStandardFiniteAbelianExtension_normSubgroup_le + (p : ℕ) [Fact p.Prime] [CharP K p] + (H : Subgroup Kˣ) + (ϖ : Kˣ) (d n : ℕ) + (hϖ : _root_.LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul ϖ) = 1) + (hd : 0 < d) (hn : 0 < n) + (hstandard : LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ d n ≤ H) : + ∃ P : FiniteAbelianSubextension (intrinsicAbstractBase K), + P.normSubgroup (intrinsicAbsoluteUnits K) ≤ + H.toAddSubgroup.map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).toAddMonoidHom := by + obtain ⟨U, hUle⟩ := + exists_unramifiedFiniteAbelianExtension_normSubgroup_map_le K d hd + obtain ⟨T, hTle⟩ := + exists_equalCharacteristicLubinTateFiniteAbelianExtension_normSubgroup_map_le + K p ϖ hϖ n hn + refine ⟨U.compositum T, ?_⟩ + exact + finiteAbelianCompositum_normSubgroup_le_of_standard + K H ϖ d n hϖ hstandard U T hUle hTle + +/-- Native field-facing form of the preceding construction: the represented +finite abelian fixed field has ordinary norm subgroup contained in the +prescribed standard overgroup. -/ +theorem exists_equalCharacteristicStandardFiniteAbelianNativeNormSubgroup_le + (p : ℕ) [Fact p.Prime] [CharP K p] + (H : Subgroup Kˣ) + (ϖ : Kˣ) (d n : ℕ) + (hϖ : _root_.LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul ϖ) = 1) + (hd : 0 < d) (hn : 0 < n) + (hstandard : LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ d n ≤ H) : + ∃ P : FiniteAbelianSubextension (intrinsicAbstractBase K), + finiteAbelianNormSubgroup K P ≤ H := by + obtain ⟨P, hP⟩ := + exists_equalCharacteristicStandardFiniteAbelianExtension_normSubgroup_le + K p H ϖ d n hϖ hd hn hstandard + exact + ⟨P, + finiteAbelianNormSubgroup_le_of_abstractNormSubgroup_le_map + K P H hP⟩ + +/-- In positive characteristic, every ordinary open finite-index subgroup of +`Kˣ` is open for the norm topology. -/ +theorem openFiniteIndexSubgroup_isNormOpen_of_charP + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (H : Subgroup Kˣ) [H.FiniteIndex] + (hH : IsOpen (H : Set Kˣ)) : + let A := intrinsicAbsoluteUnits K + let B := intrinsicAbstractBase K + let e := baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + ClassFormation.IsNormOpen A B + ((H.toAddSubgroup.map e.toAddMonoidHom : + AddSubgroup (ambientFixedAddSubgroup A B)) : + Set (ambientFixedAddSubgroup A B)) := by + let A := intrinsicAbsoluteUnits K + let B := intrinsicAbstractBase K + let e := baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + obtain ⟨ϖ, d, n, hϖ, hd, hn, hstandard⟩ := + LocalFieldTheory.exists_uniformizerPrincipalSubgroup_le_of_isOpen_finiteIndex + K H hH + obtain ⟨U, hUle⟩ := + exists_unramifiedFiniteGaloisExtension_normSubgroup_map_le K d hd + obtain ⟨T, hTle⟩ := + exists_equalCharacteristicLubinTateFiniteGaloisExtension_normSubgroup_map_le + K p ϖ hϖ n hn + let P := U.compositum T + have hP : + P.normSubgroup A ≤ H.toAddSubgroup.map e.toAddMonoidHom := by + simpa [A, B, e, P] using + (finiteGaloisCompositum_normSubgroup_le_of_standard + K H ϖ d n hϖ hstandard U T hUle hTle) + exact (ClassFormation.normTopology_addSubgroup_isOpen_iff A B + (H.toAddSubgroup.map e.toAddMonoidHom)).2 ⟨P, hP⟩ + +/-- In positive characteristic, every ordinary open finite-index subgroup is +the ordinary norm subgroup of a finite abelian subextension. -/ +theorem finiteAbelianNormSubgroupMap_surjective_of_charP + (p : ℕ) [Fact p.Prime] [CharP K p] : + Function.Surjective (finiteAbelianNormSubgroupMap K) := by + intro H + let : H.subgroup.FiniteIndex := H.finiteIndex + apply exists_finiteAbelianNormSubgroup_eq_of_normOpen K H + exact openFiniteIndexSubgroup_isNormOpen_of_charP + K p H.subgroup H.isOpen + +/-- Positive-characteristic local existence as an order isomorphism: finite +abelian subextensions correspond to ordinary open finite-index subgroups of +Kˣ with the opposite inclusion order. -/ +noncomputable def finiteAbelianNormSubgroupOrderIsoOfCharP + (p : ℕ) [Fact p.Prime] [CharP K p] : + FiniteAbelianSubextension (intrinsicAbstractBase K) ≃o + (OpenFiniteIndexSubgroup K)ᵒᵈ where + toEquiv := Equiv.ofBijective (finiteAbelianNormSubgroupMap K) + ⟨finiteAbelianNormSubgroupMap_injective K, + finiteAbelianNormSubgroupMap_surjective_of_charP K p⟩ + map_rel_iff' := by + intro L₁ L₂ + change finiteAbelianNormSubgroup K L₂ ≤ + finiteAbelianNormSubgroup K L₁ ↔ L₁ ≤ L₂ + exact (finiteAbelianSubextension_le_iff_normSubgroup_le K L₁ L₂).symm + +/-- Underlying equivalence of positive-characteristic local existence. -/ +noncomputable def finiteAbelianNormSubgroupEquivOfCharP + (p : ℕ) [Fact p.Prime] [CharP K p] : + FiniteAbelianSubextension (intrinsicAbstractBase K) ≃ + OpenFiniteIndexSubgroup K := + (finiteAbelianNormSubgroupOrderIsoOfCharP K p).toEquiv + +/-- States the theorem `finiteAbelianNormSubgroupOrderIso_of_charP_apply`. -/ +@[simp] +theorem finiteAbelianNormSubgroupOrderIso_of_charP_apply + (p : ℕ) [Fact p.Prime] [CharP K p] + (L : FiniteAbelianSubextension (intrinsicAbstractBase K)) : + finiteAbelianNormSubgroupOrderIsoOfCharP K p L = + finiteAbelianNormSubgroupMap K L := by + rfl + +end LocalField + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristicDominatingExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristicDominatingExtension.lean new file mode 100644 index 0000000000..0fc0b950e7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristicDominatingExtension.lean @@ -0,0 +1,103 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +/-! +# Equal-characteristic dominating extensions + +Every finite abelian extension of a positive-characteristic local field +embeds into the fixed field represented by a finite abelian compositum of an +unramified factor and a transported Lubin--Tate factor. This is the +source-producing field extension used for descent of filtered reciprocity. +-/ + +@[expose] public section + +noncomputable +section + +open scoped ValuativeRel + +namespace LocalClassFieldTheory + +open ClassFormation CyclicCohomology +open KummerTheory +open LocalClassFieldTheory +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +/-- Source-producing form retaining the uniformizer, the unramified degree, +the Lubin--Tate level, and the named standard compositum. -/ +theorem exists_equalCharacteristicFiniteAbelianDominatingStandardCompositum + (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [IsAbelianGalois K L] + (p : ℕ) [Fact p.Prime] [CharP K p] : + ∃ (ϖ : Kˣ) (d n : ℕ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (hd : 0 < d) (_hn : 0 < n), + Nonempty + (L →ₐ[K] + abstractFixedField K (SeparableClosure K) + (equalCharacteristicStandardFiniteAbelianCompositum + K p ϖ hϖ d n hd).field) := by + let ϖ := inverseIntegerRingUniformizerFieldUnit K + have hϖ : valuationMap K (Additive.ofMul ϖ) = 1 := by + rw [valuationMap_apply] + exact v_inverseIntegerRingUniformizerFieldUnit K + obtain ⟨d, n, hd, hn, hstandard⟩ := + exists_uniformizerPrincipalSubgroup_le_normSubgroup K L ϖ + let P := + equalCharacteristicStandardFiniteAbelianCompositum + K p ϖ hϖ d n hd + have hP : + finiteAbelianNormSubgroup K P ≤ localNormSubgroup K L := by + simpa [P] using + (equalCharacteristicStandardFiniteAbelianCompositum_nativeNormSubgroup_le + K p (localNormSubgroup K L) ϖ d n hϖ hd hn hstandard) + refine ⟨ϖ, d, n, hϖ, hd, hn, ?_⟩ + let E := abstractFixedField K (SeparableClosure K) P.field + let : Finite + ((baseField (intrinsicAbsoluteGalois K)).toSubgroup ⧸ + extensionSubgroup + (baseField (intrinsicAbsoluteGalois K)) P.field + (le_baseField P.field)) := + finiteAbelianSubextension_finite_over_absoluteBase K P + let : FiniteDimensional K E := + abstractFixedField_finiteDimensional + K (SeparableClosure K) P.field inferInstance + let : IsAbelianGalois K E := + finiteAbelianSubextension_fixedField_isAbelianGalois K P + apply nonempty_algHom_of_normSubgroup_le K L E + simpa [E, P, finiteAbelianNormSubgroup] using hP + +/-- A finite abelian extension of an equal-characteristic local field embeds +into a finite abelian fixed field whose norm subgroup is obtained from the +standard unramified/Lubin--Tate construction. -/ +theorem exists_equalCharacteristicFiniteAbelianDominatingFixedField + (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [IsAbelianGalois K L] + (p : ℕ) [Fact p.Prime] [CharP K p] : + ∃ P : FiniteAbelianSubextension (intrinsicAbstractBase K), + Nonempty + (L →ₐ[K] + abstractFixedField K (SeparableClosure K) P.field) := by + obtain ⟨ϖ, d, n, hϖ, hd, _hn, hEmbed⟩ := + exists_equalCharacteristicFiniteAbelianDominatingStandardCompositum + K L p + exact + ⟨equalCharacteristicStandardFiniteAbelianCompositum + K p ϖ hϖ d n hd, + hEmbed⟩ + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/FiniteUnramifiedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/FiniteUnramifiedField.lean new file mode 100644 index 0000000000..f2e46498a8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/FiniteUnramifiedField.lean @@ -0,0 +1,230 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupOrderEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology +/-! +# The standard finite unramified local extension + +The abstract local class formation already constructs, for every positive +`d`, a canonical finite unramified abelian subextension of the local absolute +Galois group. This file takes its actual fixed field in the chosen separable +closure and equips that field with the existing spectral local-field +structure. + +No second Frobenius is introduced. The canonical lift on this field is the +existing `arithmeticFrobeniusOfUnramifiedValuation`. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open scoped ValuativeRel +open ClassFormation LocalFieldTheory + +/-- The actual fixed field of the canonical degree-`d` unramified factor. -/ +abbrev localFiniteUnramifiedField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) : + IntermediateField K (SeparableClosure K) := + abstractFixedField K (SeparableClosure K) + (localFiniteUnramifiedAbelianSubextension K d hd).field + +/-- The standard unramified fixed field is finite over its base. -/ +noncomputable instance localFiniteUnramifiedField_finiteDimensional + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) : + FiniteDimensional K (localFiniteUnramifiedField K d hd) := + abstractFixedField_finiteDimensional K (SeparableClosure K) + (localFiniteUnramifiedAbelianSubextension K d hd).field + (finiteAbelianSubextension_finite_over_absoluteBase K + (localFiniteUnramifiedAbelianSubextension K d hd)) + +/-- The standard unramified fixed field is abelian Galois over its base. -/ +noncomputable instance localFiniteUnramifiedField_isAbelianGalois + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) : + IsAbelianGalois K (localFiniteUnramifiedField K d hd) := + finiteAbelianSubextension_fixedField_isAbelianGalois K + (localFiniteUnramifiedAbelianSubextension K d hd) + +/-- The canonical spectral norm on the standard unramified fixed field. -/ +noncomputable instance localFiniteUnramifiedFieldNontriviallyNormedField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) : + NontriviallyNormedField (localFiniteUnramifiedField K d hd) := + finiteExtensionSpectralNormedField K + (localFiniteUnramifiedField K d hd) + +/-- The valuation relation induced by the canonical spectral norm. -/ +noncomputable instance localFiniteUnramifiedFieldValuativeRel + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) : + ValuativeRel (localFiniteUnramifiedField K d hd) := + finiteExtensionSpectralValuativeRel K + (localFiniteUnramifiedField K d hd) + +/-- A standard finite unramified fixed field is again a local field. -/ +noncomputable instance localFiniteUnramifiedField_isNonarchimedeanLocalField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) : + IsNonarchimedeanLocalField (localFiniteUnramifiedField K d hd) := + finiteExtensionSpectralIsNonarchimedeanLocalField K + (localFiniteUnramifiedField K d hd) + +/-- The spectral valuation is the extension of the valuation on `K`. -/ +noncomputable instance localFiniteUnramifiedField_valuationHasExtension + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) : + Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation (localFiniteUnramifiedField K d hd)) := + finiteExtensionSpectralValuation_hasExtension K + (localFiniteUnramifiedField K d hd) + +/-- The fixed field has the degree prescribed by the abstract unramified +factor. -/ +theorem localFiniteUnramifiedField_finrank + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) : + Module.finrank K (localFiniteUnramifiedField K d hd) = d := by + let G := intrinsicAbsoluteGalois K + let D := localResidueDatum K + let B : FiniteAbstractField G := + intrinsicFiniteAbstractBase K + let Bresidue := B.toFiniteResidueAbstractField D + let U := localFiniteUnramifiedAbelianSubextension K d hd + have hdegree : + (U.toFiniteGaloisExtension.toFiniteAbstractExtension.degree : ℕ) = d := by + have h := D.finiteUnramifiedExtension_degree Bresidue d hd + change + (U.toFiniteGaloisExtension.toFiniteAbstractExtension.degree : ℕ) = d at h + exact h + calc + Module.finrank K (localFiniteUnramifiedField K d hd) = + (abstractFixedField K (SeparableClosure K) + U.field).fixingSubgroup.index := + IntermediateField.finrank_eq_fixingSubgroup_index + (F := K) (SeparableClosure K) + (abstractFixedField K (SeparableClosure K) U.field) + _ = U.field.toSubgroup.index := by + rw [InfiniteGalois.fixingSubgroup_fixedField U.field] + _ = (CyclicCohomology.extensionSubgroup + (intrinsicAbstractBase K) U.field U.below).index := by + change U.field.toSubgroup.index = + (U.field.toSubgroup.subgroupOf + (intrinsicAbstractBase K).toSubgroup).index + rw [show (intrinsicAbstractBase K).toSubgroup = ⊤ by + simpa [G] using congrArg ClosedSubgroup.toSubgroup + (closedFixingSubgroup_bot_eq_baseField K (SeparableClosure K))] + rw [← Subgroup.relIndex_top_right] + rfl + _ = (U.toFiniteGaloisExtension.toFiniteAbstractExtension.degree : ℕ) := + U.toFiniteGaloisExtension.toFiniteAbstractExtension.extensionSubgroup_index_eq_degree + _ = d := hdegree + +/-- The literal residue extension of the standard fixed field also has +degree `d`. -/ +theorem localFiniteUnramifiedField_residue_finrank + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) : + @Module.finrank 𝓀[K] + 𝓀[localFiniteUnramifiedField K d hd] _ _ + (IsLocalRing.ResidueField.instModule + (R := 𝒪[K]) + (S := 𝒪[localFiniteUnramifiedField K d hd])) = d := by + let G := intrinsicAbsoluteGalois K + let D := localResidueDatum K + let B : FiniteAbstractField G := + intrinsicFiniteAbstractBase K + let Bresidue := B.toFiniteResidueAbstractField D + let U := localFiniteUnramifiedAbelianSubextension K d hd + let H : FiniteAbstractField G := + ⟨U.field, finiteAbelianSubextension_finite_over_absoluteBase K U⟩ + let EU : FiniteAbstractFieldExtension G := + { field := H + base := B + below := U.below + finiteQuotient := U.finite } + have hrelative : (EU.residueDegree D : ℕ) = d := by + have h := D.finiteUnramifiedExtension_residueDegree Bresidue d hd + change (EU.residueDegree D : ℕ) = d at h + exact h + have hbase : (B.residueDegree D : ℕ) = 1 := by + exact intrinsicFiniteAbstractBase_residueDegree_eq_one K + have habsolute : (H.residueDegree D : ℕ) = d := by + let ER := EU.toFiniteResidueAbstractExtension D + have htower := ER.residueDegree_mul_absoluteResidueDegree D + change + (EU.residueDegree D : ℕ) * (B.residueDegree D : ℕ) = + (H.residueDegree D : ℕ) at htower + rw [hrelative, hbase, mul_one] at htower + exact htower.symm + have hcomparison := + localResidueDatum_residueDegree_eq_residueFinrank K H + change + (H.residueDegree D : ℕ) = + @Module.finrank 𝓀[K] + 𝓀[localFiniteUnramifiedField K d hd] _ _ + (IsLocalRing.ResidueField.instModule + (R := 𝒪[K]) + (S := 𝒪[localFiniteUnramifiedField K d hd])) at hcomparison + exact hcomparison.symm.trans habsolute + +/-- The standard fixed field is unramified for the actual local valuations. -/ +noncomputable instance localFiniteUnramifiedField_isUnramifiedValuedExtension + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) : + IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K + (localFiniteUnramifiedField K d hd) where + maximalIdeal_ramificationIdx_eq_one := by + have hfund := + maximalIdeal_ramificationIdx_mul_residue_finrank_eq_finrank K + (localFiniteUnramifiedField K d hd) + have hmax : (𝓂[K] : Ideal 𝒪[K]) ≠ ⊥ := + Ring.ne_bot_of_isMaximal_of_not_isField + (IsLocalRing.maximalIdeal.isMaximal 𝒪[K]) + (IsDiscreteValuationRing.not_isField 𝒪[K]) + rw [Ideal.ramificationIdx'_eq_ramificationIdx _ _ hmax, + localFiniteUnramifiedField_residue_finrank K d hd, + localFiniteUnramifiedField_finrank K d hd] at hfund + apply Nat.eq_of_mul_eq_mul_right hd + simpa only [one_mul] using hfund + +/-- On the standard degree-`d` fixed field, the existing arithmetic +Frobenius has order exactly `d`. -/ +theorem localFiniteUnramifiedField_arithmeticFrobenius_order + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) : + orderOf + (arithmeticFrobeniusOfUnramifiedValuation K + (localFiniteUnramifiedField K d hd)) = + d := by + rw [orderOf_arithmeticFrobeniusOfUnramifiedValuation, + localFiniteUnramifiedField_finrank K d hd] + +end LocalClassFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/KummerNormOpen.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/KummerNormOpen.lean new file mode 100644 index 0000000000..a84d66ae70 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/KummerNormOpen.lean @@ -0,0 +1,178 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MaximalKummerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CyclotomicKummerDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.PowerIndex +/-! +# Kummer criteria for openness in the norm topology + +Let `H ≤ Kˣ` have finite index `n`, with `n` nonzero in `K`, and suppose +that `K` contains a primitive `n`-th root of unity. Lagrange's theorem +gives `Kˣⁿ ≤ H`; the maximal Kummer extension constructed above has norm +group exactly `Kˣⁿ`. Hence `H`, transported to the coefficient +group, is open for the norm topology. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation + +variable (K : Type) [Field K] + +/-- Prime-to-characteristic Kummer existence in the norm topology, with +cyclotomic descent carried out inside the fixed separable +closure. -/ +theorem finiteIndexSubgroup_isNormOpen_of_natCast_ne_zero + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (H : Subgroup Kˣ) [H.FiniteIndex] + (hnK : (H.index : K) ≠ 0) : + let A := galoisAmbientUnitsRep K (SeparableClosure K) + let B := closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K)) + let e := baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + IsNormOpen A B + ((H.toAddSubgroup.map e.toAddMonoidHom : + AddSubgroup (ambientFixedAddSubgroup A B)) : + Set (ambientFixedAddSubgroup A B)) := by + let A := galoisAmbientUnitsRep K (SeparableClosure K) + let B := closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K)) + let e := baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + have hindex : H.index ≠ 0 := Subgroup.FiniteIndex.index_ne_zero + let n : ℕ+ := ⟨H.index, Nat.pos_of_ne_zero hindex⟩ + have hnK' : ((n : ℕ) : K) ≠ 0 := by simpa [n] using hnK + obtain ⟨F, hnormF⟩ := + exists_finiteGalois_normSubgroup_le_powMonoidHom_range K n hnK' + let E : IntermediateField K (SeparableClosure K) := F + let : FiniteDimensional K E := F.finiteDimensional + let : IsGalois K E := F.isGalois + let L : FiniteGaloisSubextension B := { + field := closedFixingSubgroup K (SeparableClosure K) E + below := fixingSubgroupLeBase K (SeparableClosure K) E + normal := inferInstance + finite := baseFixingExtensionQuotient_finite + K (SeparableClosure K) E } + have hnormLe : additiveNormSubgroup K E ≤ H.toAddSubgroup := by + intro x hx + change Additive.toMul x ∈ localNormSubgroup K E at hx + change Additive.toMul x ∈ H + apply LocalFieldTheory.powMonoidHom_range_index_le Kˣ H + exact hnormF hx + have hmap : + (L.normSubgroup A).map e.symm.toAddMonoidHom = + additiveNormSubgroup K E := by + simpa [A, B, L, e, FiniteGaloisSubextension.normSubgroup] using + (map_finiteNormSubgroup_eq_additiveNormSubgroup + K (SeparableClosure K) E) + have hLE : + L.normSubgroup A ≤ H.toAddSubgroup.map e.toAddMonoidHom := by + intro x hx + have hxmap : e.symm x ∈ + (L.normSubgroup A).map e.symm.toAddMonoidHom := + ⟨x, hx, rfl⟩ + rw [hmap] at hxmap + exact ⟨e.symm x, hnormLe hxmap, e.apply_symm_apply x⟩ + exact (normTopology_addSubgroup_isOpen_iff A B + (H.toAddSubgroup.map e.toAddMonoidHom)).2 ⟨L, hLE⟩ + +/-- In characteristic zero every finite-index subgroup is norm-open. -/ +theorem finiteIndexSubgroup_isNormOpen_of_charZero + [CharZero K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : Subgroup Kˣ) [H.FiniteIndex] : + let A := galoisAmbientUnitsRep K (SeparableClosure K) + let B := closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K)) + let e := baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + IsNormOpen A B + ((H.toAddSubgroup.map e.toAddMonoidHom : + AddSubgroup (ambientFixedAddSubgroup A B)) : + Set (ambientFixedAddSubgroup A B)) := by + apply finiteIndexSubgroup_isNormOpen_of_natCast_ne_zero K H + have hindex : H.index ≠ 0 := Subgroup.FiniteIndex.index_ne_zero + exact_mod_cast hindex + +/-- Prime-to-characteristic Kummer existence: a finite-index subgroup becomes +norm-open once the corresponding roots of unity are in the base field. -/ +theorem finiteIndexSubgroup_isNormOpen_of_primitiveRoots + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (H : Subgroup Kˣ) [H.FiniteIndex] + (hnK : (H.index : K) ≠ 0) + (hmu : (primitiveRoots H.index K).Nonempty) : + let A := galoisAmbientUnitsRep K (SeparableClosure K) + let B := closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K)) + let e := baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + IsNormOpen A B + ((H.toAddSubgroup.map e.toAddMonoidHom : + AddSubgroup (ambientFixedAddSubgroup A B)) : + Set (ambientFixedAddSubgroup A B)) := by + let A := galoisAmbientUnitsRep K (SeparableClosure K) + let B := closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K)) + let e := baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + have hindex : H.index ≠ 0 := Subgroup.FiniteIndex.index_ne_zero + let n : ℕ+ := ⟨H.index, Nat.pos_of_ne_zero hindex⟩ + let Delta := KummerTheory.maximalKummerSubgroup K n + let E := kummerRadicalExtension + (K := K) (Omega := SeparableClosure K) n Delta.1 + have hnK' : ((n : ℕ) : K) ≠ 0 := by simpa [n] using hnK + have hmu' : (primitiveRoots (n : ℕ) K).Nonempty := by + simpa [n] using hmu + let : IsGalois K E := + kummerRadicalExtension_isGalois + (K := K) (Omega := SeparableClosure K) n Delta.1 + let : FiniteDimensional K E := + KummerTheory.maximalKummerRadicalExtension_finiteDimensional + (K := K) (Omega := SeparableClosure K) n hnK' hmu' + let L : FiniteGaloisSubextension B := { + field := closedFixingSubgroup K (SeparableClosure K) E + below := fixingSubgroupLeBase K (SeparableClosure K) E + normal := inferInstance + finite := baseFixingExtensionQuotient_finite + K (SeparableClosure K) E } + have hnormEq : + localNormSubgroup K E = (powMonoidHom H.index : Kˣ →* Kˣ).range := by + simpa [E, Delta, n] using + (maximalKummerNormSubgroup_eq_powMonoidHom_range + (K := K) (Omega := SeparableClosure K) n hnK' hmu') + have hnormLe : additiveNormSubgroup K E ≤ H.toAddSubgroup := by + intro x hx + change Additive.toMul x ∈ localNormSubgroup K E at hx + change Additive.toMul x ∈ H + rw [hnormEq] at hx + exact LocalFieldTheory.powMonoidHom_range_index_le Kˣ H hx + have hmap : + (L.normSubgroup A).map e.symm.toAddMonoidHom = + additiveNormSubgroup K E := by + simpa [A, B, L, e, FiniteGaloisSubextension.normSubgroup] using + (map_finiteNormSubgroup_eq_additiveNormSubgroup + K (SeparableClosure K) E) + have hLE : + L.normSubgroup A ≤ H.toAddSubgroup.map e.toAddMonoidHom := by + intro x hx + have hxmap : e.symm x ∈ + (L.normSubgroup A).map e.symm.toAddMonoidHom := + ⟨x, hx, rfl⟩ + rw [hmap] at hxmap + exact ⟨e.symm x, hnormLe hxmap, e.apply_symm_apply x⟩ + exact (normTopology_addSubgroup_isOpen_iff A B + (H.toAddSubgroup.map e.toAddMonoidHom)).2 ⟨L, hLE⟩ + +end LocalClassFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LocalAbsoluteData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LocalAbsoluteData.lean new file mode 100644 index 0000000000..768fafd561 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LocalAbsoluteData.lean @@ -0,0 +1,119 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification +/-! +# Absolute data for finite local existence + +This file isolates the common abstract Galois-theoretic realization of the absolute Galois +group, its unit representation, and the ground-field fixing subgroup. Both +the characteristic-zero and equal-characteristic existence arguments use +these definitions. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation LocalClassFieldTheory + +/-- An open finite-index subgroup of the ordinary topological group `Kˣ`. + +This is a genuine public object rather than a transparent subtype alias: its +topological and finite-index contracts remain available without exposing a +particular nested-pair representation. -/ +structure OpenFiniteIndexSubgroup + (K : Type) [Field K] [TopologicalSpace K] where + /-- The underlying subgroup of field units. -/ + subgroup : Subgroup Kˣ + /-- The underlying subgroup is open in the unit-group topology. -/ + isOpen : IsOpen (subgroup : Set Kˣ) + /-- The underlying subgroup has finite index. -/ + finiteIndex : subgroup.FiniteIndex + +namespace OpenFiniteIndexSubgroup + +variable {K : Type} [Field K] [TopologicalSpace K] + +/-- Provides this instance. -/ +instance : Coe (OpenFiniteIndexSubgroup K) (Subgroup Kˣ) := + ⟨OpenFiniteIndexSubgroup.subgroup⟩ + +/-- States the theorem `ext`. -/ +@[ext] +theorem ext {H H' : OpenFiniteIndexSubgroup K} + (h : H.subgroup = H'.subgroup) : H = H' := by + cases H + cases H' + cases h + rfl + +/-- Provides this instance. -/ +instance : PartialOrder (OpenFiniteIndexSubgroup K) := + PartialOrder.lift OpenFiniteIndexSubgroup.subgroup + (fun _ _ h ↦ OpenFiniteIndexSubgroup.ext h) + +end OpenFiniteIndexSubgroup + +/-- Normality over the abstract base fixing group makes the represented +fixed field Galois over the concrete local base field. -/ +theorem abstractFixedField_isGalois_of_base_normal + (K : Type) [Field K] + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) + (hnormal : + (extensionSubgroup + (baseField (Gal(SeparableClosure K/K))) H + (le_baseField H)).Normal) : + IsGalois K (abstractFixedField K (SeparableClosure K) H) := by + let B := baseField (Gal(SeparableClosure K/K)) + have hsub : + extensionSubgroup B H (le_baseField H) = + H.toSubgroup.subgroupOf B.toSubgroup := by + ext sigma + rw [mem_extensionSubgroup_iff] + have hrelative : + (H.toSubgroup.subgroupOf B.toSubgroup).Normal := by + rw [← hsub] + exact hnormal + have hconj : + ∀ h g : Gal(SeparableClosure K/K), + h ∈ H.toSubgroup → g ∈ B.toSubgroup → + g * h * g⁻¹ ∈ H.toSubgroup := + (Subgroup.normal_subgroupOf_iff (le_baseField H)).1 hrelative + let : H.toSubgroup.Normal := + { conj_mem := fun h hh g => hconj h g hh (by simp [B, baseField]) } + apply (InfiniteGalois.normal_iff_isGalois + (abstractFixedField K (SeparableClosure K) H)).1 + have hfix : + (abstractFixedField K (SeparableClosure K) H).fixingSubgroup = + H.toSubgroup := by + have hclosed := closedFixingSubgroup_abstractFixedField_eq + K (SeparableClosure K) H + exact congrArg ClosedSubgroup.toSubgroup hclosed + rw [hfix] + infer_instance + +variable (K : Type) [Field K] + +/-- The closed fixing group of the ground field is absolutely finite in the +abstract Galois-theoretic sense (indeed, it is the full absolute Galois group). -/ +noncomputable instance intrinsicAbstractBase_index_finite : + Finite ((baseField (intrinsicAbsoluteGalois K)).toSubgroup ⧸ + extensionSubgroup (baseField (intrinsicAbsoluteGalois K)) + (intrinsicAbstractBase K) (le_baseField (intrinsicAbstractBase K))) := by + exact (intrinsicFiniteAbstractBase K).finite + +end LocalClassFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean new file mode 100644 index 0000000000..efb92744a2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean @@ -0,0 +1,1113 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.FiniteUnramifiedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationInvariants +public import Mathlib.FieldTheory.LinearDisjoint +/-! +# The unramified--Lubin--Tate diagonal field for an explicit uniformizer + +This module constructs the diagonal descent field attached to an arbitrary +explicit uniformizer. The unramified factor has the exact order of the inverse +finite Lubin--Tate unit action. Arithmetic Frobenius on that factor and the +inverse unit action on the Lubin--Tate level therefore glue to one automorphism +of their compositum. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open scoped ValuativeRel +open LocalFieldTheory +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.IsNonarchimedeanLocalField +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension +open LubinTate + +private theorem explicitLocalCompleteDVFValuation_hasExtension + (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] : + (LocalFieldTheory.localCompleteDVF K).valuation.HasExtension + (LocalFieldTheory.localCompleteDVF L).valuation := by + apply Valuation.HasExtension.ofComapInteger + ext x + change + ValuativeRel.valuation L (algebraMap K L x) ≤ 1 ↔ + ValuativeRel.valuation K x ≤ 1 + exact Valuation.HasExtension.val_map_le_one_iff + (ValuativeRel.valuation K) (ValuativeRel.valuation L) x + +/-- With its spectral valuation, the finite Lubin--Tate level attached to an +explicit uniformizer has residue degree one over the local base field. -/ +theorem lubinTateLevel_spectral_inertiaDeg_eq_one + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + {π : (standardLocalField K).valuationSubring} + (hπ : (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + (n : ℕ) : + let T := standardLubinTateLevelField hπ n + letI : FiniteDimensional K T := + standardLubinTateLevelField_finiteDimensional hπ n + letI : NontriviallyNormedField T := + finiteExtensionSpectralNormedField K T + letI : ValuativeRel T := + finiteExtensionSpectralValuativeRel K T + letI : IsNonarchimedeanLocalField T := + finiteExtensionSpectralIsNonarchimedeanLocalField K T + letI : Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation T) := + finiteExtensionSpectralValuation_hasExtension K T + letI : + (LocalFieldTheory.localCompleteDVF K).valuation.HasExtension + (LocalFieldTheory.localCompleteDVF T).valuation := by + exact explicitLocalCompleteDVFValuation_hasExtension K T + (LocalFieldTheory.localCompleteDVF T).maximalIdeal.inertiaDeg + (LocalFieldTheory.localCompleteDVF K).valuationSubring = 1 := by + let T := standardLubinTateLevelField hπ n + let : FiniteDimensional K T := + standardLubinTateLevelField_finiteDimensional hπ n + let : NontriviallyNormedField T := + finiteExtensionSpectralNormedField K T + let : ValuativeRel T := + finiteExtensionSpectralValuativeRel K T + let : IsNonarchimedeanLocalField T := + finiteExtensionSpectralIsNonarchimedeanLocalField K T + let : Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation T) := + finiteExtensionSpectralValuation_hasExtension K T + let base := (standardLocalField K).toCompleteDVF + let chosen := standardLubinTateLevelCompleteDVF hπ n + let spectral := LocalFieldTheory.localCompleteDVF T + let : base.valuation.HasExtension spectral.valuation := + explicitLocalCompleteDVFValuation_hasExtension K T + have hValuationRing : + chosen.valuation.valuationSubring = + spectral.valuation.valuationSubring := + valuationSubring_eq_of_finite_separable base chosen spectral.valuation + have hdegree : + degree base.toDVF chosen.toDVF = + ramificationIndex base.toDVF chosen.toDVF * + residueDegree base.toDVF chosen.toDVF := + standardLubinTateLevelCompleteDVF_fundamentalIdentity hπ n + have hramification : + ramificationIndex base.toDVF chosen.toDVF = + degree base.toDVF chosen.toDVF := + standardLubinTateLevel_ramificationIndex_eq_degree hπ n + have hdegreePos : 0 < degree base.toDVF chosen.toDVF := by + change 0 < Module.finrank K T + exact Module.finrank_pos + have hresidue : + residueDegree base.toDVF chosen.toDVF = 1 := by + apply Nat.eq_of_mul_eq_mul_left hdegreePos + simpa [hramification] using hdegree.symm + change chosen.maximalIdeal.inertiaDeg base.valuationSubring = 1 at hresidue + let e : chosen.valuationSubring ≃ₐ[base.valuationSubring] + spectral.valuationSubring := + { toFun := fun x => ⟨x, by + rw [← hValuationRing] + exact x.property⟩ + invFun := fun x => ⟨x, by + rw [hValuationRing] + exact x.property⟩ + left_inv := fun x => by + apply Subtype.ext + rfl + right_inv := fun x => by + apply Subtype.ext + rfl + map_mul' := fun x y => by + apply Subtype.ext + rfl + map_add' := fun x y => by + apply Subtype.ext + rfl + commutes' := fun x => by + apply Subtype.ext + rfl } + have hmap : + chosen.maximalIdeal.map e = spectral.maximalIdeal := + IsLocalRing.map_ringEquiv_maximalIdeal e.toRingEquiv + have hinertia : + spectral.maximalIdeal.inertiaDeg base.valuationSubring = + chosen.maximalIdeal.inertiaDeg base.valuationSubring := by + rw [Ideal.inertiaDeg_eq_of_isMaximal base.maximalIdeal spectral.maximalIdeal, + Ideal.inertiaDeg_eq_of_isMaximal base.maximalIdeal chosen.maximalIdeal] + exact + (Ideal.Quotient.algEquivOfEqMap base.maximalIdeal e + hmap.symm).toLinearEquiv.finrank_eq.symm + change spectral.maximalIdeal.inertiaDeg base.valuationSubring = 1 + exact hinertia.trans hresidue + +private theorem explicitLocalCompleteDVF_ramificationIdx_eq_one_of_top + (K M U : Type) [Field K] [Field M] [Field U] + [Algebra K M] [Algebra K U] [Algebra M U] [IsScalarTower K M U] + (base : CompleteDVF K) (middle : CompleteDVF M) + (total : CompleteDVF U) + [base.valuation.HasExtension middle.valuation] + [base.valuation.HasExtension total.valuation] + [middle.valuation.HasExtension total.valuation] + [FiniteDimensional M U] [Algebra.IsSeparable M U] + (htop : + total.maximalIdeal.ramificationIdx base.valuationSubring = 1) : + middle.maximalIdeal.ramificationIdx base.valuationSubring = 1 := by + let : IsScalarTower base.valuationSubring middle.valuationSubring + total.valuationSubring := + IsScalarTower.of_algebraMap_eq' (by + ext x + change + algebraMap K U (x : K) = + algebraMap M U (algebraMap K M (x : K)) + exact IsScalarTower.algebraMap_apply K M U (x : K)) + let : Algebra middle.valuationSubring U := + ((algebraMap total.valuationSubring U).comp + (algebraMap middle.valuationSubring total.valuationSubring)).toAlgebra + let : IsScalarTower middle.valuationSubring + total.valuationSubring U := + IsScalarTower.of_algebraMap_eq' rfl + let : Module.Finite middle.valuationSubring + total.valuationSubring := + moduleFinite_target_valuationSubring_of_finite_separable middle total + let : Module.IsTorsionFree middle.valuationSubring + total.valuationSubring := + moduleIsTorsionFree_target_valuationSubring_of_finite_separable + middle total + let : Module.Free middle.valuationSubring + total.valuationSubring := + Module.free_of_finite_type_torsion_free' + have hdiv : + middle.maximalIdeal.ramificationIdx base.valuationSubring ∣ + total.maximalIdeal.ramificationIdx base.valuationSubring := + middle.maximalIdeal.ramificationIdx_below_dvd total.maximalIdeal + rw [htop] at hdiv + exact Nat.eq_one_of_dvd_one hdiv + +private theorem + localFiniteUnramifiedField_inf_lubinTateLevelField_ramificationIdx + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + {π : (standardLocalField K).valuationSubring} + (hπ : (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + (d : ℕ) (hd : 0 < d) (n : ℕ) : + let U := localFiniteUnramifiedField K d hd + let T := standardLubinTateLevelField hπ n + let M := U ⊓ T + letI : FiniteDimensional K T := + standardLubinTateLevelField_finiteDimensional hπ n + letI : FiniteDimensional K M := + FiniteDimensional.of_injective + (M.inclusion (show M ≤ U from inf_le_left)).toLinearMap + (M.inclusion (show M ≤ U from inf_le_left)).injective + letI : NontriviallyNormedField M := + finiteExtensionSpectralNormedField K M + letI : ValuativeRel M := + finiteExtensionSpectralValuativeRel K M + letI : IsNonarchimedeanLocalField M := + finiteExtensionSpectralIsNonarchimedeanLocalField K M + letI : Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation M) := + finiteExtensionSpectralValuation_hasExtension K M + let base := LocalFieldTheory.localCompleteDVF K + let middle := LocalFieldTheory.localCompleteDVF M + letI : base.valuation.HasExtension middle.valuation := + explicitLocalCompleteDVFValuation_hasExtension K M + middle.maximalIdeal.ramificationIdx base.valuationSubring = 1 := by + let U := localFiniteUnramifiedField K d hd + let T := standardLubinTateLevelField hπ n + let M := U ⊓ T + let : FiniteDimensional K T := + standardLubinTateLevelField_finiteDimensional hπ n + let : FiniteDimensional K M := + FiniteDimensional.of_injective + (M.inclusion (show M ≤ U from inf_le_left)).toLinearMap + (M.inclusion (show M ≤ U from inf_le_left)).injective + let : NontriviallyNormedField M := + finiteExtensionSpectralNormedField K M + let : ValuativeRel M := + finiteExtensionSpectralValuativeRel K M + let : IsNonarchimedeanLocalField M := + finiteExtensionSpectralIsNonarchimedeanLocalField K M + let : Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation M) := + finiteExtensionSpectralValuation_hasExtension K M + let : Algebra M U := + (M.inclusion (show M ≤ U from inf_le_left)).toRingHom.toAlgebra + let : IsScalarTower K M U := + IsScalarTower.of_algebraMap_eq' rfl + let : Valuation.HasExtension (ValuativeRel.valuation M) + (ValuativeRel.valuation U) := + finiteExtensionSpectralValuation_hasExtension_of_tower K M U + let : FiniteDimensional M U := + FiniteDimensional.right K M U + let : Algebra.IsSeparable M U := + Algebra.isSeparable_tower_top_of_isSeparable + (F := K) (L := M) (E := U) + let base := LocalFieldTheory.localCompleteDVF K + let middle := LocalFieldTheory.localCompleteDVF M + let unramified := LocalFieldTheory.localCompleteDVF U + let : base.valuation.HasExtension middle.valuation := + explicitLocalCompleteDVFValuation_hasExtension K M + let : base.valuation.HasExtension unramified.valuation := + explicitLocalCompleteDVFValuation_hasExtension K U + let : middle.valuation.HasExtension unramified.valuation := + explicitLocalCompleteDVFValuation_hasExtension M U + have hramificationUnramified : + unramified.maximalIdeal.ramificationIdx base.valuationSubring = 1 := by + change + (IsLocalRing.maximalIdeal + (ValuativeRel.valuation U).integer).ramificationIdx + (ValuativeRel.valuation K).integer = 1 + exact unramifiedValuation_ramificationIdx_eq_one K U + exact explicitLocalCompleteDVF_ramificationIdx_eq_one_of_top + K M U base middle unramified hramificationUnramified + +private theorem + localFiniteUnramifiedField_inf_lubinTateLevelField_inertiaDeg + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + {π : (standardLocalField K).valuationSubring} + (hπ : (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + (d : ℕ) (hd : 0 < d) (n : ℕ) : + let U := localFiniteUnramifiedField K d hd + let T := standardLubinTateLevelField hπ n + let M := U ⊓ T + letI : FiniteDimensional K T := + standardLubinTateLevelField_finiteDimensional hπ n + letI : FiniteDimensional K M := + FiniteDimensional.of_injective + (M.inclusion (show M ≤ U from inf_le_left)).toLinearMap + (M.inclusion (show M ≤ U from inf_le_left)).injective + letI : NontriviallyNormedField M := + finiteExtensionSpectralNormedField K M + letI : ValuativeRel M := + finiteExtensionSpectralValuativeRel K M + letI : IsNonarchimedeanLocalField M := + finiteExtensionSpectralIsNonarchimedeanLocalField K M + letI : Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation M) := + finiteExtensionSpectralValuation_hasExtension K M + let base := LocalFieldTheory.localCompleteDVF K + let middle := LocalFieldTheory.localCompleteDVF M + letI : base.valuation.HasExtension middle.valuation := + explicitLocalCompleteDVFValuation_hasExtension K M + middle.maximalIdeal.inertiaDeg base.valuationSubring = 1 := by + let U := localFiniteUnramifiedField K d hd + let T := standardLubinTateLevelField hπ n + let M := U ⊓ T + let : FiniteDimensional K T := + standardLubinTateLevelField_finiteDimensional hπ n + let : FiniteDimensional K M := + FiniteDimensional.of_injective + (M.inclusion (show M ≤ U from inf_le_left)).toLinearMap + (M.inclusion (show M ≤ U from inf_le_left)).injective + let : NontriviallyNormedField T := + finiteExtensionSpectralNormedField K T + let : ValuativeRel T := + finiteExtensionSpectralValuativeRel K T + let : IsNonarchimedeanLocalField T := + finiteExtensionSpectralIsNonarchimedeanLocalField K T + let : Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation T) := + finiteExtensionSpectralValuation_hasExtension K T + let : NontriviallyNormedField M := + finiteExtensionSpectralNormedField K M + let : ValuativeRel M := + finiteExtensionSpectralValuativeRel K M + let : IsNonarchimedeanLocalField M := + finiteExtensionSpectralIsNonarchimedeanLocalField K M + let : Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation M) := + finiteExtensionSpectralValuation_hasExtension K M + let : Algebra M T := + (M.inclusion (show M ≤ T from inf_le_right)).toRingHom.toAlgebra + let : IsScalarTower K M T := + IsScalarTower.of_algebraMap_eq' rfl + let : Valuation.HasExtension (ValuativeRel.valuation M) + (ValuativeRel.valuation T) := + finiteExtensionSpectralValuation_hasExtension_of_tower K M T + let base := LocalFieldTheory.localCompleteDVF K + let middle := LocalFieldTheory.localCompleteDVF M + let total := LocalFieldTheory.localCompleteDVF T + let : base.valuation.HasExtension middle.valuation := + explicitLocalCompleteDVFValuation_hasExtension K M + let : base.valuation.HasExtension total.valuation := + explicitLocalCompleteDVFValuation_hasExtension K T + let : middle.valuation.HasExtension total.valuation := + explicitLocalCompleteDVFValuation_hasExtension M T + let : IsScalarTower base.valuationSubring middle.valuationSubring + total.valuationSubring := + IsScalarTower.of_algebraMap_eq' rfl + have htotal : + total.maximalIdeal.inertiaDeg base.valuationSubring = 1 := by + exact lubinTateLevel_spectral_inertiaDeg_eq_one K hπ n + have hinertiaDvd : + middle.maximalIdeal.inertiaDeg base.valuationSubring ∣ + total.maximalIdeal.inertiaDeg base.valuationSubring := + middle.maximalIdeal.inertiaDeg_below_dvd total.maximalIdeal + rw [htotal] at hinertiaDvd + exact Nat.eq_one_of_dvd_one hinertiaDvd + +/-- A canonical finite unramified field and the Lubin--Tate level attached to +an explicit uniformizer have trivial intersection in the chosen separable +closure. -/ +theorem localFiniteUnramifiedField_inf_lubinTateLevelField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + {π : (standardLocalField K).valuationSubring} + (hπ : (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + (d : ℕ) (hd : 0 < d) (n : ℕ) : + localFiniteUnramifiedField K d hd ⊓ + standardLubinTateLevelField hπ n = + ⊥ := by + let U := localFiniteUnramifiedField K d hd + let T := standardLubinTateLevelField hπ n + let M := U ⊓ T + let : FiniteDimensional K T := + standardLubinTateLevelField_finiteDimensional hπ n + let : FiniteDimensional K M := + FiniteDimensional.of_injective + (M.inclusion (show M ≤ U from inf_le_left)).toLinearMap + (M.inclusion (show M ≤ U from inf_le_left)).injective + let : NontriviallyNormedField M := + finiteExtensionSpectralNormedField K M + let : ValuativeRel M := + finiteExtensionSpectralValuativeRel K M + let : IsNonarchimedeanLocalField M := + finiteExtensionSpectralIsNonarchimedeanLocalField K M + let : Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation M) := + finiteExtensionSpectralValuation_hasExtension K M + let base := LocalFieldTheory.localCompleteDVF K + let middle := LocalFieldTheory.localCompleteDVF M + let : base.valuation.HasExtension middle.valuation := + explicitLocalCompleteDVFValuation_hasExtension K M + have hramificationMiddle : + middle.maximalIdeal.ramificationIdx base.valuationSubring = 1 := by + exact + localFiniteUnramifiedField_inf_lubinTateLevelField_ramificationIdx + K hπ d hd n + have hinertiaMiddle : + middle.maximalIdeal.inertiaDeg base.valuationSubring = 1 := by + exact + localFiniteUnramifiedField_inf_lubinTateLevelField_inertiaDeg + K hπ d hd n + let : Module.Finite base.valuationSubring middle.valuationSubring := + moduleFinite_target_valuationSubring_of_finite_separable base middle + let : Module.IsTorsionFree base.valuationSubring + middle.valuationSubring := + moduleIsTorsionFree_target_valuationSubring_of_finite_separable + base middle + let : Module.Free base.valuationSubring middle.valuationSubring := + Module.free_of_finite_type_torsion_free' + have hbaseMaximalIdeal_ne : + (base.maximalIdeal : Ideal base.valuationSubring) ≠ ⊥ := + Ring.ne_bot_of_isMaximal_of_not_isField + (IsLocalRing.maximalIdeal.isMaximal base.valuationSubring) + (IsDiscreteValuationRing.not_isField base.valuationSubring) + have hdegree := + maximalIdeal_ramificationIdx_mul_inertiaDeg_eq_finrank K M + change + base.maximalIdeal.ramificationIdx' middle.maximalIdeal * + middle.maximalIdeal.inertiaDeg base.valuationSubring = + Module.finrank K M at hdegree + rw [Ideal.ramificationIdx'_eq_ramificationIdx + base.maximalIdeal middle.maximalIdeal hbaseMaximalIdeal_ne, + hramificationMiddle, hinertiaMiddle, one_mul] at hdegree + change M = ⊥ + exact IntermediateField.finrank_eq_one_iff.mp hdegree.symm + +/-- A canonical finite unramified field is linearly disjoint from the finite +Lubin--Tate level attached to an explicit uniformizer. -/ +theorem localFiniteUnramifiedField_linearDisjoint_lubinTateLevelField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + {π : (standardLocalField K).valuationSubring} + (hπ : (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + (d : ℕ) (hd : 0 < d) (n : ℕ) : + (localFiniteUnramifiedField K d hd).LinearDisjoint + (standardLubinTateLevelField hπ n) := by + let : FiniteDimensional K (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_finiteDimensional hπ n + apply IntermediateField.LinearDisjoint.of_inf_eq_bot + exact localFiniteUnramifiedField_inf_lubinTateLevelField + K hπ d hd n + +/-- The compositum on which arithmetic Frobenius and the inverse unit action +for an explicit uniformizer are combined. The unramified degree is exactly +the order of the unit action. -/ +abbrev lubinTateUniformizerDiagonalCompositumField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + {π : (standardLocalField K).valuationSubring} + (hπ : (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + (n : ℕ) (u : (standardLocalField K).valuationSubringˣ) : + IntermediateField K (SeparableClosure K) := + let T := standardLubinTateLevelField hπ n + letI : FiniteDimensional K T := + standardLubinTateLevelField_finiteDimensional hπ n + let σ : Gal(T/K) := + (standardLubinTateUnitParameterEquivGal + (standardLocalField K) hπ n + (standardLubinTateUnitParameterClass + (standardLocalField K) n u))⁻¹ + let d := orderOf σ + localFiniteUnramifiedField K d (orderOf_pos σ) ⊔ T + +/-- The explicit-uniformizer diagonal compositum is finite over the base +field. -/ +theorem lubinTateUniformizerDiagonalCompositumField_finiteDimensional + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + {π : (standardLocalField K).valuationSubring} + (hπ : (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + (n : ℕ) (u : (standardLocalField K).valuationSubringˣ) : + FiniteDimensional K + (lubinTateUniformizerDiagonalCompositumField K hπ n u) := by + let T := standardLubinTateLevelField hπ n + let : FiniteDimensional K T := + standardLubinTateLevelField_finiteDimensional hπ n + let σ : Gal(T/K) := + (standardLubinTateUnitParameterEquivGal + (standardLocalField K) hπ n + (standardLubinTateUnitParameterClass + (standardLocalField K) n u))⁻¹ + let d := orderOf σ + let hd : 0 < d := orderOf_pos σ + let U := localFiniteUnramifiedField K d hd + let C := U ⊔ T + change FiniteDimensional K C + exact U.finiteDimensional_sup T + +/-- The explicit-uniformizer diagonal compositum is Galois over the base +field. -/ +theorem lubinTateUniformizerDiagonalCompositumField_isGalois + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + {π : (standardLocalField K).valuationSubring} + (hπ : (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + (n : ℕ) (u : (standardLocalField K).valuationSubringˣ) : + IsGalois K + (lubinTateUniformizerDiagonalCompositumField K hπ n u) := by + let T := standardLubinTateLevelField hπ n + let : FiniteDimensional K T := + standardLubinTateLevelField_finiteDimensional hπ n + let σ : Gal(T/K) := + (standardLubinTateUnitParameterEquivGal + (standardLocalField K) hπ n + (standardLubinTateUnitParameterClass + (standardLocalField K) n u))⁻¹ + let d := orderOf σ + let hd : 0 < d := orderOf_pos σ + let U := localFiniteUnramifiedField K d hd + let C := U ⊔ T + let : IsGalois K U := inferInstance + let : IsGalois K T := + standardLubinTateLevelField_isGalois + (F := standardLocalField K) hπ n + let : Algebra.IsSeparable K C := inferInstance + change IsGalois K C + exact + { to_isSeparable := inferInstance + to_normal := inferInstance } + +private theorem explicitRestrictNormalHom_toAlgAut_eq_one + (K C : Type) [Field K] [Field C] [Algebra K C] + (B : IntermediateField K C) [Normal K B] + (δ : Gal(C/B)) : + AlgEquiv.restrictNormalHom B + (MulSemiringAction.toAlgAut Gal(C/B) K C δ) = + 1 := by + apply AlgEquiv.ext + intro x + apply Subtype.ext + rw [AlgEquiv.restrictNormalHom_apply] + exact δ.commutes x + +private theorem explicitRestrictNormalHom_mul_inv_eq_one + (K C : Type) [Field K] [Field C] [Algebra K C] + (A : IntermediateField K C) [Normal K A] + (σ τ : Gal(C/K)) (ρ : Gal(A/K)) + (hσ : AlgEquiv.restrictNormalHom A σ = ρ) + (hτ : AlgEquiv.restrictNormalHom A τ = ρ) : + AlgEquiv.restrictNormalHom A (σ * τ⁻¹) = 1 := by + rw [map_mul_inv, hσ, hτ, mul_inv_cancel] + +private theorem explicit_mem_fixingSubgroup_of_restrictNormalHom_eq_one + (K C : Type) [Field K] [Field C] [Algebra K C] + (A : IntermediateField K C) [Normal K A] + (σ : Gal(C/K)) + (hσ : AlgEquiv.restrictNormalHom A σ = 1) : + σ ∈ A.fixingSubgroup := by + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + let y : A := ⟨x, hx⟩ + have hy := congrArg (fun τ : Gal(A/K) => τ y) hσ + have hyval := congrArg Subtype.val hy + rw [AlgEquiv.restrictNormalHom_apply] at hyval + simpa [y] using hyval + +private theorem explicit_eq_one_of_mem_fixingSubgroup_of_sup_eq_top + (K C : Type) [Field K] [Field C] [Algebra K C] + (A B : IntermediateField K C) (σ : Gal(C/K)) + (hA : σ ∈ A.fixingSubgroup) (hB : σ ∈ B.fixingSubgroup) + (hSup : A ⊔ B = ⊤) : + σ = 1 := by + have hFixSup : σ ∈ (A ⊔ B).fixingSubgroup := by + rw [IntermediateField.fixingSubgroup_sup] + exact ⟨hA, hB⟩ + rw [hSup, IntermediateField.fixingSubgroup_top] at hFixSup + exact Subgroup.mem_bot.mp hFixSup + +private theorem explicitAlgEquiv_eq_of_restrict_eq_of_sup_eq_top + (K C : Type) [Field K] [Field C] [Algebra K C] + (A B : IntermediateField K C) [Normal K A] [Normal K B] + (σ τ : Gal(C/K)) + (hA : AlgEquiv.restrictNormalHom A σ = + AlgEquiv.restrictNormalHom A τ) + (hB : AlgEquiv.restrictNormalHom B σ = + AlgEquiv.restrictNormalHom B τ) + (hSup : A ⊔ B = ⊤) : + σ = τ := by + let δ := σ * τ⁻¹ + have hδA : AlgEquiv.restrictNormalHom A δ = 1 := by + exact explicitRestrictNormalHom_mul_inv_eq_one + K C A σ τ (AlgEquiv.restrictNormalHom A σ) rfl hA.symm + have hδB : AlgEquiv.restrictNormalHom B δ = 1 := by + exact explicitRestrictNormalHom_mul_inv_eq_one + K C B σ τ (AlgEquiv.restrictNormalHom B σ) rfl hB.symm + have hFixA : δ ∈ A.fixingSubgroup := + explicit_mem_fixingSubgroup_of_restrictNormalHom_eq_one + K C A δ hδA + have hFixB : δ ∈ B.fixingSubgroup := + explicit_mem_fixingSubgroup_of_restrictNormalHom_eq_one + K C B δ hδB + have hδ : δ = 1 := + explicit_eq_one_of_mem_fixingSubgroup_of_sup_eq_top + K C A B δ hFixA hFixB hSup + exact mul_inv_eq_one.mp hδ + +private theorem explicit_orderOf_eq_of_restrict_orders_of_sup_eq_top + (K C : Type) [Field K] [Field C] [Algebra K C] + (A B : IntermediateField K C) [Normal K A] [Normal K B] + [Finite (Gal(A/K))] [Finite (Gal(B/K))] + (σ : Gal(C/K)) (σA : Gal(A/K)) (σB : Gal(B/K)) (d : ℕ) + (hA : AlgEquiv.restrictNormalHom A σ = σA) + (hB : AlgEquiv.restrictNormalHom B σ = σB) + (hAOrder : orderOf σA = d) (hBOrder : orderOf σB = d) + (hSup : A ⊔ B = ⊤) : + orderOf σ = d := by + have hLower : d ∣ orderOf σ := by + rw [← hAOrder, ← hA] + exact orderOf_map_dvd (AlgEquiv.restrictNormalHom A) σ + have hPowA : + AlgEquiv.restrictNormalHom A (σ ^ d) = 1 := by + rw [map_pow, hA, ← hAOrder, pow_orderOf_eq_one] + have hPowB : + AlgEquiv.restrictNormalHom B (σ ^ d) = 1 := by + rw [map_pow, hB, ← hBOrder, pow_orderOf_eq_one] + have hFixA : σ ^ d ∈ A.fixingSubgroup := + explicit_mem_fixingSubgroup_of_restrictNormalHom_eq_one + K C A (σ ^ d) hPowA + have hFixB : σ ^ d ∈ B.fixingSubgroup := + explicit_mem_fixingSubgroup_of_restrictNormalHom_eq_one + K C B (σ ^ d) hPowB + have hPow : σ ^ d = 1 := + explicit_eq_one_of_mem_fixingSubgroup_of_sup_eq_top + K C A B (σ ^ d) hFixA hFixB hSup + exact Nat.dvd_antisymm (orderOf_dvd_of_pow_eq_one hPow) hLower + +private theorem exists_explicitAlgEquiv_with_disjoint_restrictions + (K C : Type) [Field K] [Field C] [Algebra K C] + (A B : IntermediateField K C) + [Normal K A] [Normal K B] [Normal K C] + [FiniteDimensional K A] [FiniteDimensional B C] [IsGalois B C] + (hInf : A ⊓ B = ⊥) (σA : Gal(A/K)) (σB : Gal(B/K)) : + ∃ σ : Gal(C/K), + AlgEquiv.restrictNormalHom A σ = σA ∧ + AlgEquiv.restrictNormalHom B σ = σB := by + obtain ⟨σ₀, hσ₀⟩ := + (AlgEquiv.restrictNormalHom_surjective + (F := K) (K₁ := B) (E := C)) σB + let error : Gal(A/K) := + σA * (AlgEquiv.restrictNormalHom A σ₀)⁻¹ + obtain ⟨δ, hδ⟩ := + (IntermediateField.restrictRestrictAlgEquivMapHom_surjective + (F := K) (E := C) A B hInf) error + let δK : Gal(C/K) := + MulSemiringAction.toAlgAut Gal(C/B) K C δ + have hδA : AlgEquiv.restrictNormalHom A δK = error := by + change AlgEquiv.restrictNormalHom A δK = error at hδ + exact hδ + have hδB : AlgEquiv.restrictNormalHom B δK = 1 := + explicitRestrictNormalHom_toAlgAut_eq_one K C B δ + refine ⟨δK * σ₀, ?_, ?_⟩ + · rw [map_mul, hδA] + simp [error] + · rw [map_mul, hδB, hσ₀, one_mul] + +private theorem exists_lubinTateUniformizerDiagonalAutomorphism + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + {π : (standardLocalField K).valuationSubring} + (hπ : (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + (n : ℕ) (u : (standardLocalField K).valuationSubringˣ) : + let T := standardLubinTateLevelField hπ n + letI : FiniteDimensional K T := + standardLubinTateLevelField_finiteDimensional hπ n + let σT : Gal(T/K) := + (standardLubinTateUnitParameterEquivGal + (standardLocalField K) hπ n + (standardLubinTateUnitParameterClass + (standardLocalField K) n u))⁻¹ + let d := orderOf σT + let hd : 0 < d := orderOf_pos σT + let U := localFiniteUnramifiedField K d hd + let C := U ⊔ T + let hUC : U ≤ C := le_sup_left + let hTC : T ≤ C := le_sup_right + let A := U.restrict hUC + let B := T.restrict hTC + let eU : U ≃ₐ[K] A := IntermediateField.restrictAlgEquiv hUC + let eT : T ≃ₐ[K] B := IntermediateField.restrictAlgEquiv hTC + letI : IsGalois K A := IsGalois.of_algEquiv eU + letI : IsGalois K B := IsGalois.of_algEquiv eT + let φ := + arithmeticFrobeniusOfUnramifiedValuation K U + let σA : Gal(A/K) := (eU.symm.trans φ).trans eU + let σB : Gal(B/K) := (eT.symm.trans σT).trans eT + ∃ σ : Gal(C/K), + AlgEquiv.restrictNormalHom A σ = σA ∧ + AlgEquiv.restrictNormalHom B σ = σB := by + let T := standardLubinTateLevelField hπ n + let : FiniteDimensional K T := + standardLubinTateLevelField_finiteDimensional hπ n + let σT : Gal(T/K) := + (standardLubinTateUnitParameterEquivGal + (standardLocalField K) hπ n + (standardLubinTateUnitParameterClass + (standardLocalField K) n u))⁻¹ + let d := orderOf σT + let hd : 0 < d := orderOf_pos σT + let U := localFiniteUnramifiedField K d hd + let C := U ⊔ T + let hUC : U ≤ C := le_sup_left + let hTC : T ≤ C := le_sup_right + let A := U.restrict hUC + let B := T.restrict hTC + let eU : U ≃ₐ[K] A := IntermediateField.restrictAlgEquiv hUC + let eT : T ≃ₐ[K] B := IntermediateField.restrictAlgEquiv hTC + let : IsGalois K U := inferInstance + let : IsGalois K T := + standardLubinTateLevelField_isGalois + (F := standardLocalField K) hπ n + let : IsGalois K A := IsGalois.of_algEquiv eU + let : IsGalois K B := IsGalois.of_algEquiv eT + let : FiniteDimensional K C := + lubinTateUniformizerDiagonalCompositumField_finiteDimensional + K hπ n u + let : IsGalois K C := + lubinTateUniformizerDiagonalCompositumField_isGalois + K hπ n u + let : FiniteDimensional B C := + FiniteDimensional.right K B C + let : IsGalois B C := + IsGalois.tower_top_of_isGalois K B C + let φ := + arithmeticFrobeniusOfUnramifiedValuation K U + let σA : Gal(A/K) := (eU.symm.trans φ).trans eU + let σB : Gal(B/K) := (eT.symm.trans σT).trans eT + have hInf : U ⊓ T = ⊥ := + localFiniteUnramifiedField_inf_lubinTateLevelField + K hπ d hd n + have hInf' : A ⊓ B = ⊥ := by + rw [← IntermediateField.lift_inj, + IntermediateField.lift_bot, + IntermediateField.lift_inf, + IntermediateField.lift_restrict hUC, + IntermediateField.lift_restrict hTC, + hInf] + exact exists_explicitAlgEquiv_with_disjoint_restrictions + K C A B hInf' σA σB + +/-- The diagonal automorphism whose restriction to the unramified factor is +arithmetic Frobenius and whose restriction to the explicit-uniformizer +Lubin--Tate level is the inverse unit action. -/ +noncomputable def lubinTateUniformizerDiagonalAutomorphism + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + {π : (standardLocalField K).valuationSubring} + (hπ : (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + (n : ℕ) (u : (standardLocalField K).valuationSubringˣ) : + Gal((lubinTateUniformizerDiagonalCompositumField K hπ n u)/K) := + Classical.choose + (show + let T := standardLubinTateLevelField hπ n + letI : FiniteDimensional K T := + standardLubinTateLevelField_finiteDimensional hπ n + let σT : Gal(T/K) := + (standardLubinTateUnitParameterEquivGal + (standardLocalField K) hπ n + (standardLubinTateUnitParameterClass + (standardLocalField K) n u))⁻¹ + let d := orderOf σT + let hd : 0 < d := orderOf_pos σT + let U := localFiniteUnramifiedField K d hd + let C := U ⊔ T + let hUC : U ≤ C := le_sup_left + let hTC : T ≤ C := le_sup_right + let A := U.restrict hUC + let B := T.restrict hTC + let eU : U ≃ₐ[K] A := IntermediateField.restrictAlgEquiv hUC + let eT : T ≃ₐ[K] B := IntermediateField.restrictAlgEquiv hTC + letI : IsGalois K A := IsGalois.of_algEquiv eU + letI : IsGalois K B := IsGalois.of_algEquiv eT + let φ := + arithmeticFrobeniusOfUnramifiedValuation K U + let σA : Gal(A/K) := (eU.symm.trans φ).trans eU + let σB : Gal(B/K) := (eT.symm.trans σT).trans eT + ∃ σ : Gal(C/K), + AlgEquiv.restrictNormalHom A σ = σA ∧ + AlgEquiv.restrictNormalHom B σ = σB from by + exact exists_lubinTateUniformizerDiagonalAutomorphism K hπ n u) + +/-- The explicit-uniformizer diagonal automorphism restricts to arithmetic +Frobenius on its unramified factor. -/ +theorem lubinTateUniformizerDiagonalAutomorphism_restrict_unramified + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + {π : (standardLocalField K).valuationSubring} + (hπ : (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + (n : ℕ) (u : (standardLocalField K).valuationSubringˣ) : + let T := standardLubinTateLevelField hπ n + letI : FiniteDimensional K T := + standardLubinTateLevelField_finiteDimensional hπ n + let σT : Gal(T/K) := + (standardLubinTateUnitParameterEquivGal + (standardLocalField K) hπ n + (standardLubinTateUnitParameterClass + (standardLocalField K) n u))⁻¹ + let d := orderOf σT + let hd : 0 < d := orderOf_pos σT + let U := localFiniteUnramifiedField K d hd + let C := U ⊔ T + let hUC : U ≤ C := le_sup_left + let A := U.restrict hUC + let eU : U ≃ₐ[K] A := IntermediateField.restrictAlgEquiv hUC + letI : IsGalois K A := IsGalois.of_algEquiv eU + let φA : Gal(A/K) := + (eU.symm.trans + (arithmeticFrobeniusOfUnramifiedValuation K U)).trans eU + AlgEquiv.restrictNormalHom A + (lubinTateUniformizerDiagonalAutomorphism K hπ n u) = + φA := + (Classical.choose_spec + (exists_lubinTateUniformizerDiagonalAutomorphism K hπ n u)).1 + +/-- The explicit-uniformizer diagonal automorphism restricts to the inverse +finite Lubin--Tate unit action on its ramified level. -/ +theorem lubinTateUniformizerDiagonalAutomorphism_restrict_level + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + {π : (standardLocalField K).valuationSubring} + (hπ : (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + (n : ℕ) (u : (standardLocalField K).valuationSubringˣ) : + let T := standardLubinTateLevelField hπ n + letI : FiniteDimensional K T := + standardLubinTateLevelField_finiteDimensional hπ n + let σT : Gal(T/K) := + (standardLubinTateUnitParameterEquivGal + (standardLocalField K) hπ n + (standardLubinTateUnitParameterClass + (standardLocalField K) n u))⁻¹ + let d := orderOf σT + let hd : 0 < d := orderOf_pos σT + let U := localFiniteUnramifiedField K d hd + let C := U ⊔ T + let hTC : T ≤ C := le_sup_right + let B := T.restrict hTC + let eT : T ≃ₐ[K] B := IntermediateField.restrictAlgEquiv hTC + letI : IsGalois K B := IsGalois.of_algEquiv eT + let σB : Gal(B/K) := (eT.symm.trans σT).trans eT + AlgEquiv.restrictNormalHom B + (lubinTateUniformizerDiagonalAutomorphism K hπ n u) = + σB := + (Classical.choose_spec + (exists_lubinTateUniformizerDiagonalAutomorphism K hπ n u)).2 + +/-- The two factor restrictions uniquely determine the diagonal automorphism. -/ +theorem lubinTateUniformizerDiagonalAutomorphism_unique + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + {π : (standardLocalField K).valuationSubring} + (hπ : (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + (n : ℕ) (u : (standardLocalField K).valuationSubringˣ) + (σ : Gal((lubinTateUniformizerDiagonalCompositumField K hπ n u)/K)) + (hσUnramified : + let T := standardLubinTateLevelField hπ n + letI : FiniteDimensional K T := + standardLubinTateLevelField_finiteDimensional hπ n + let σT : Gal(T/K) := + (standardLubinTateUnitParameterEquivGal + (standardLocalField K) hπ n + (standardLubinTateUnitParameterClass + (standardLocalField K) n u))⁻¹ + let d := orderOf σT + let hd : 0 < d := orderOf_pos σT + let U := localFiniteUnramifiedField K d hd + let C := U ⊔ T + let hUC : U ≤ C := le_sup_left + let A := U.restrict hUC + let eU : U ≃ₐ[K] A := IntermediateField.restrictAlgEquiv hUC + letI : IsGalois K A := IsGalois.of_algEquiv eU + let φA : Gal(A/K) := + (eU.symm.trans + (arithmeticFrobeniusOfUnramifiedValuation K U)).trans eU + AlgEquiv.restrictNormalHom A σ = φA) + (hσLevel : + let T := standardLubinTateLevelField hπ n + letI : FiniteDimensional K T := + standardLubinTateLevelField_finiteDimensional hπ n + let σT : Gal(T/K) := + (standardLubinTateUnitParameterEquivGal + (standardLocalField K) hπ n + (standardLubinTateUnitParameterClass + (standardLocalField K) n u))⁻¹ + let d := orderOf σT + let hd : 0 < d := orderOf_pos σT + let U := localFiniteUnramifiedField K d hd + let C := U ⊔ T + let hTC : T ≤ C := le_sup_right + let B := T.restrict hTC + let eT : T ≃ₐ[K] B := IntermediateField.restrictAlgEquiv hTC + letI : IsGalois K B := IsGalois.of_algEquiv eT + let σB : Gal(B/K) := (eT.symm.trans σT).trans eT + AlgEquiv.restrictNormalHom B σ = σB) : + σ = lubinTateUniformizerDiagonalAutomorphism K hπ n u := by + let T := standardLubinTateLevelField hπ n + let : FiniteDimensional K T := + standardLubinTateLevelField_finiteDimensional hπ n + let σT : Gal(T/K) := + (standardLubinTateUnitParameterEquivGal + (standardLocalField K) hπ n + (standardLubinTateUnitParameterClass + (standardLocalField K) n u))⁻¹ + let d := orderOf σT + let hd : 0 < d := orderOf_pos σT + let U := localFiniteUnramifiedField K d hd + let C := U ⊔ T + let hUC : U ≤ C := le_sup_left + let hTC : T ≤ C := le_sup_right + let A := U.restrict hUC + let B := T.restrict hTC + let eU : U ≃ₐ[K] A := IntermediateField.restrictAlgEquiv hUC + let eT : T ≃ₐ[K] B := IntermediateField.restrictAlgEquiv hTC + let : IsGalois K A := IsGalois.of_algEquiv eU + let : IsGalois K B := IsGalois.of_algEquiv eT + let φA : Gal(A/K) := + (eU.symm.trans + (arithmeticFrobeniusOfUnramifiedValuation K U)).trans eU + let σB : Gal(B/K) := (eT.symm.trans σT).trans eT + let chosen := lubinTateUniformizerDiagonalAutomorphism K hπ n u + have hσA : AlgEquiv.restrictNormalHom A σ = φA := by + change AlgEquiv.restrictNormalHom A σ = φA at hσUnramified + exact hσUnramified + have hσB : AlgEquiv.restrictNormalHom B σ = σB := by + change AlgEquiv.restrictNormalHom B σ = σB at hσLevel + exact hσLevel + have hchosenA : AlgEquiv.restrictNormalHom A chosen = φA := by + have h := + lubinTateUniformizerDiagonalAutomorphism_restrict_unramified K hπ n u + change AlgEquiv.restrictNormalHom A chosen = φA at h + exact h + have hchosenB : AlgEquiv.restrictNormalHom B chosen = σB := by + have h := lubinTateUniformizerDiagonalAutomorphism_restrict_level K hπ n u + change AlgEquiv.restrictNormalHom B chosen = σB at h + exact h + have hSup : A ⊔ B = ⊤ := by + rw [← IntermediateField.lift_inj, + IntermediateField.lift_top, + IntermediateField.lift_sup, + IntermediateField.lift_restrict hUC, + IntermediateField.lift_restrict hTC] + exact explicitAlgEquiv_eq_of_restrict_eq_of_sup_eq_top + K C A B σ chosen (hσA.trans hchosenA.symm) + (hσB.trans hchosenB.symm) hSup + +private theorem lubinTateUniformizerDiagonalAutomorphism_order + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + {π : (standardLocalField K).valuationSubring} + (hπ : (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + (n : ℕ) (u : (standardLocalField K).valuationSubringˣ) : + let T := standardLubinTateLevelField hπ n + letI : FiniteDimensional K T := + standardLubinTateLevelField_finiteDimensional hπ n + let σT : Gal(T/K) := + (standardLubinTateUnitParameterEquivGal + (standardLocalField K) hπ n + (standardLubinTateUnitParameterClass + (standardLocalField K) n u))⁻¹ + orderOf (lubinTateUniformizerDiagonalAutomorphism K hπ n u) = + orderOf σT := by + let T := standardLubinTateLevelField hπ n + let : FiniteDimensional K T := + standardLubinTateLevelField_finiteDimensional hπ n + let σT : Gal(T/K) := + (standardLubinTateUnitParameterEquivGal + (standardLocalField K) hπ n + (standardLubinTateUnitParameterClass + (standardLocalField K) n u))⁻¹ + let d := orderOf σT + let hd : 0 < d := orderOf_pos σT + let U := localFiniteUnramifiedField K d hd + let C := U ⊔ T + let hUC : U ≤ C := le_sup_left + let hTC : T ≤ C := le_sup_right + let A := U.restrict hUC + let B := T.restrict hTC + let eU : U ≃ₐ[K] A := IntermediateField.restrictAlgEquiv hUC + let eT : T ≃ₐ[K] B := IntermediateField.restrictAlgEquiv hTC + let : IsGalois K U := inferInstance + let : IsGalois K T := + standardLubinTateLevelField_isGalois + (F := standardLocalField K) hπ n + let : IsGalois K A := IsGalois.of_algEquiv eU + let : IsGalois K B := IsGalois.of_algEquiv eT + let φ := + arithmeticFrobeniusOfUnramifiedValuation K U + let σA : Gal(A/K) := (eU.symm.trans φ).trans eU + let σB : Gal(B/K) := (eT.symm.trans σT).trans eT + let σ := lubinTateUniformizerDiagonalAutomorphism K hπ n u + let transportU : Gal(U/K) ≃* Gal(A/K) := + { AlgEquiv.equivCongr eU eU with + map_mul' := by + intro g h + ext x + simp } + let transportT : Gal(T/K) ≃* Gal(B/K) := + { AlgEquiv.equivCongr eT eT with + map_mul' := by + intro g h + ext x + simp } + have hσAOrder : orderOf σA = d := by + rw [show σA = transportU φ by rfl, transportU.orderOf_eq, + localFiniteUnramifiedField_arithmeticFrobenius_order K d hd] + have hσBOrder : orderOf σB = d := by + rw [show σB = transportT σT by rfl, transportT.orderOf_eq] + have hrestrictA : + AlgEquiv.restrictNormalHom A σ = σA := by + have h := + lubinTateUniformizerDiagonalAutomorphism_restrict_unramified K hπ n u + change AlgEquiv.restrictNormalHom A σ = σA at h + exact h + have hrestrictB : + AlgEquiv.restrictNormalHom B σ = σB := by + have h := lubinTateUniformizerDiagonalAutomorphism_restrict_level K hπ n u + change AlgEquiv.restrictNormalHom B σ = σB at h + exact h + have hSup : A ⊔ B = ⊤ := by + rw [← IntermediateField.lift_inj, + IntermediateField.lift_top, + IntermediateField.lift_sup, + IntermediateField.lift_restrict hUC, + IntermediateField.lift_restrict hTC] + exact explicit_orderOf_eq_of_restrict_orders_of_sup_eq_top + K C A B σ σA σB d hrestrictA hrestrictB hσAOrder hσBOrder hSup + +/-- The field fixed by the explicit-uniformizer diagonal automorphism. -/ +def lubinTateUniformizerDiagonalFixedField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + {π : (standardLocalField K).valuationSubring} + (hπ : (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + (n : ℕ) (u : (standardLocalField K).valuationSubringˣ) : + IntermediateField K + (lubinTateUniformizerDiagonalCompositumField K hπ n u) := + IntermediateField.fixedField + (Subgroup.zpowers + (lubinTateUniformizerDiagonalAutomorphism K hπ n u)) + +/-- Diagonal fixed points remove the auxiliary unramified factor: the +fixed field has exactly the degree of the explicit-uniformizer Lubin--Tate +level. -/ +theorem lubinTateUniformizerDiagonalFixedField_finrank + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + {π : (standardLocalField K).valuationSubring} + (hπ : (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + (n : ℕ) (u : (standardLocalField K).valuationSubringˣ) : + Module.finrank K + (lubinTateUniformizerDiagonalFixedField K hπ n u) = + Module.finrank K (standardLubinTateLevelField hπ n) := by + let T := standardLubinTateLevelField hπ n + let : FiniteDimensional K T := + standardLubinTateLevelField_finiteDimensional hπ n + let σT : Gal(T/K) := + (standardLubinTateUnitParameterEquivGal + (standardLocalField K) hπ n + (standardLubinTateUnitParameterClass + (standardLocalField K) n u))⁻¹ + let d := orderOf σT + let hd : 0 < d := orderOf_pos σT + let U := localFiniteUnramifiedField K d hd + let C := U ⊔ T + let σ := lubinTateUniformizerDiagonalAutomorphism K hπ n u + let E := lubinTateUniformizerDiagonalFixedField K hπ n u + let : FiniteDimensional K C := + lubinTateUniformizerDiagonalCompositumField_finiteDimensional + K hπ n u + let : FiniteDimensional E C := + FiniteDimensional.right K E C + let : Module.Free E C := Module.Free.of_divisionRing E C + have hEC : Module.finrank E C = d := by + change Module.finrank + (IntermediateField.fixedField (Subgroup.zpowers σ)) C = d + rw [IntermediateField.finrank_fixedField_eq_card, + Nat.card_zpowers] + simpa [T, σT, d, C, σ] using + lubinTateUniformizerDiagonalAutomorphism_order K hπ n u + have hKC : + Module.finrank K C = d * Module.finrank K T := by + rw [show C = U ⊔ T by rfl, + (localFiniteUnramifiedField_linearDisjoint_lubinTateLevelField + K hπ d hd n).finrank_sup, + localFiniteUnramifiedField_finrank K d hd] + have hTower := Module.finrank_mul_finrank K E C + rw [hEC, hKC] at hTower + apply Nat.eq_of_mul_eq_mul_right hd + exact hTower.trans (Nat.mul_comm d (Module.finrank K T)) + +end LocalClassFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MathlibFieldClassification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MathlibFieldClassification.lean new file mode 100644 index 0000000000..931ec4856b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MathlibFieldClassification.lean @@ -0,0 +1,146 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.OpenFiniteIndexSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.Classification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal +/-! +# Mathlib intermediate fields and finite local class-field theory + +The finite-existence theorem is formulated internally using closed subgroups +of the absolute Galois group. Here we identify those objects with finite +abelian intermediate fields of Mathlib's chosen separable closure. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open ClassFormation RamificationTheory + +variable (K : Type) [Field K] + +/-- Regard a finite abelian intermediate field as an abstract subextension. -/ +def abstractExtensionOfFiniteAbelianField + (E : ClassFieldTheory.FiniteAbelianLocalExtension K) : + FiniteAbelianSubextension (intrinsicAbstractBase K) := + finiteAbelianAbstractExtensionOfEmbedding K E.1 E.1.val + +/-- Recover the intermediate field represented by an abstract finite abelian subextension. -/ +def finiteAbelianFieldOfAbstractExtension + (L : FiniteAbelianSubextension (intrinsicAbstractBase K)) : + ClassFieldTheory.FiniteAbelianLocalExtension K := + ⟨abstractFixedField K (SeparableClosure K) L.field, + abstractFixedField_finiteDimensional K (SeparableClosure K) L.field + (finiteAbelianSubextension_finite_over_absoluteBase K L), + finiteAbelianSubextension_fixedField_isAbelianGalois K L⟩ + +/-- The fixed field of the abstract package constructed from an intermediate +field is the original field. -/ +theorem finiteAbelianFieldOfAbstractExtension_ofField + (E : ClassFieldTheory.FiniteAbelianLocalExtension K) : + finiteAbelianFieldOfAbstractExtension K + (abstractExtensionOfFiniteAbelianField K E) = E := by + apply Subtype.ext + change IntermediateField.fixedField + (closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange E.1.val)).toSubgroup = E.1 + rw [IntermediateField.fieldRange_val] + exact InfiniteGalois.fixedField_fixingSubgroup E.1 + +/-- Abstracting the fixed field of an abstract extension recovers the same +closed subgroup, hence the same finite abelian extension. -/ +theorem abstractExtensionOfFiniteAbelianField_ofAbstract + (L : FiniteAbelianSubextension (intrinsicAbstractBase K)) : + abstractExtensionOfFiniteAbelianField K + (finiteAbelianFieldOfAbstractExtension K L) = L := by + apply FiniteAbelianSubextension.ext + change closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange + (abstractFixedField K (SeparableClosure K) L.field).val) = L.field + rw [IntermediateField.fieldRange_val] + exact closedFixingSubgroup_abstractFixedField_eq K (SeparableClosure K) L.field + +/-- Concrete finite abelian intermediate fields and the abstract extension +objects used by the local-existence theorem have the same order. -/ +def finiteAbelianFieldAbstractOrderIso : + ClassFieldTheory.FiniteAbelianLocalExtension K ≃o + FiniteAbelianSubextension (intrinsicAbstractBase K) where + toEquiv := { + toFun := abstractExtensionOfFiniteAbelianField K + invFun := finiteAbelianFieldOfAbstractExtension K + left_inv := finiteAbelianFieldOfAbstractExtension_ofField K + right_inv := abstractExtensionOfFiniteAbelianField_ofAbstract K + } + map_rel_iff' := by + intro E F + change + (closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange F.1.val)).toSubgroup ≤ + (closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange E.1.val)).toSubgroup ↔ E.1 ≤ F.1 + simp only [IntermediateField.fieldRange_val] + change F.1.fixingSubgroup ≤ E.1.fixingSubgroup ↔ E.1 ≤ F.1 + constructor + · intro h + have hf := IntermediateField.fixedField_le h + simpa only [InfiniteGalois.fixedField_fixingSubgroup] using hf + · intro h + exact E.1.fixingSubgroup_le h + +/-- The internal open-subgroup structure and the Mathlib-facing subtype +encode the same subgroup with the same inclusion order. -/ +def openFiniteIndexSubgroupMathlibOrderIso + [TopologicalSpace K] : + OpenFiniteIndexSubgroup K ≃o + ClassFieldTheory.OpenFiniteIndexSubgroup K where + toEquiv := { + toFun := fun H => ⟨H.subgroup, H.isOpen, H.finiteIndex⟩ + invFun := fun H => ⟨H.1, H.2.1, H.2.2⟩ + left_inv := by intro H; cases H; rfl + right_inv := by intro H; cases H; rfl + } + map_rel_iff' := by intro H J; rfl + +/-- The abstract norm subgroup is the actual field-norm subgroup after +identifying an abstract extension with its concrete fixed field. -/ +theorem finiteAbelianFieldOfAbstractExtension_normSubgroup + (L : FiniteAbelianSubextension (intrinsicAbstractBase K)) : + (finiteAbelianFieldOfAbstractExtension K L).normSubgroup = + finiteAbelianNormSubgroup K L := + rfl + +/-- The internal order classification, expressed entirely using concrete +finite abelian intermediate fields and Mathlib's subgroup subtype. -/ +def finiteAbelianFieldNormSubgroupOrderIso + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + ClassFieldTheory.FiniteAbelianLocalExtension K ≃o + (ClassFieldTheory.OpenFiniteIndexSubgroup K)ᵒᵈ := + (finiteAbelianFieldAbstractOrderIso K).trans + ((finiteAbelianNormSubgroupOrderIso K).trans + (openFiniteIndexSubgroupMathlibOrderIso K).dual) + +/-- The concrete classification sends each finite abelian extension to its +field-norm subgroup. -/ +theorem finiteAbelianFieldNormSubgroupOrderIso_apply + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (E : ClassFieldTheory.FiniteAbelianLocalExtension K) : + (OrderDual.ofDual (finiteAbelianFieldNormSubgroupOrderIso K E)).1 = + E.normSubgroup := by + change finiteAbelianNormSubgroup K + (abstractExtensionOfFiniteAbelianField K E) = E.normSubgroup + rw [← finiteAbelianFieldOfAbstractExtension_normSubgroup K] + rw [finiteAbelianFieldOfAbstractExtension_ofField] + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MaximalKummerNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MaximalKummerNorm.lean new file mode 100644 index 0000000000..c67cfd461f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MaximalKummerNorm.lean @@ -0,0 +1,169 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalMaximalKummerExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PowerClassFiniteness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main +/-! +# Norm group of the maximal Kummer extension + +When the base field contains the `n`-th roots of unity, Kummer duality and +finite local reciprocity identify the norm subgroup of the maximal +exponent-`n` Kummer extension with the subgroup of `n`-th powers. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open CyclicCohomology KummerTheory ClassFormation +open LocalFieldTheory.DiscreteValuationField LocalFieldTheory + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] +variable {Omega : Type} [Field Omega] [Algebra K Omega] [IsSepClosure K Omega] + +/-- The Galois group of the maximal exponent-`n` Kummer extension is +canonically equivalent to the local power-class group. -/ +noncomputable def chosenMaximalKummerGaloisEquivPowerQuotient + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + Gal(kummerRadicalExtension (K := K) (Omega := Omega) n + (KummerTheory.maximalKummerSubgroup K n).1/K) ≃* + Kˣ ⧸ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range := by + let Delta := KummerTheory.maximalKummerSubgroup K n + let E := kummerRadicalExtension (K := K) (Omega := Omega) n Delta.1 + let R := RestrictedRadicalQuotient n Delta + let M := nthRootsSubgroup E (n : ℕ) + letI : Finite R := + KummerTheory.finite_maximalRestrictedRadicalQuotient K n hnK + have hRExponent : ∀ r : R, r ^ (n : ℕ) = 1 := + restrictedRadicalQuotient_pow_eq_one n Delta + let dualR := Classical.choice (finiteNthRootsCharacterDuality + (G := R) (K := K) (L := E) n hmu hRExponent) + exact + (kummerRadicalExtensionRestrictedTransposeMulEquiv + (K := K) (Omega := Omega) n hnK hmu Delta).trans + (dualR.trans + (KummerTheory.maximalRestrictedRadicalQuotientEquiv K n).symm) + +/-- Local reciprocity and Kummer duality identify the norm quotient of the +maximal Kummer extension with the local power-class group. -/ +noncomputable def maximalKummerNormQuotientEquivPowerQuotient + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + let E := kummerRadicalExtension (K := K) (Omega := Omega) n + (KummerTheory.maximalKummerSubgroup K n).1 + NormQuotient K E ≃* Kˣ ⧸ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range := by + let Delta := KummerTheory.maximalKummerSubgroup K n + let E := kummerRadicalExtension (K := K) (Omega := Omega) n Delta.1 + letI : IsGalois K E := + kummerRadicalExtension_isGalois (K := K) (Omega := Omega) n Delta.1 + letI : FiniteDimensional K E := + KummerTheory.maximalKummerRadicalExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu + letI : IsMulCommutative Gal(E/K) := + kummerRadicalExtension_isMulCommutative + (K := K) (Omega := Omega) n hmu Delta.1 + letI : CommGroup Gal(E/K) := + CommGroup.mk (fun a b => IsMulCommutative.is_comm.comm a b) + exact + (abelianizationEquivNormQuotient K E).symm.trans + (Abelianization.equivOfComm.symm.trans + (chosenMaximalKummerGaloisEquivPowerQuotient + (K := K) (Omega := Omega) n hnK hmu)) + +/-- Every `n`-th power is a norm from the maximal exponent-`n` Kummer +extension. -/ +theorem powMonoidHom_range_le_maximalKummerNormSubgroup + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + let E := kummerRadicalExtension (K := K) (Omega := Omega) n + (KummerTheory.maximalKummerSubgroup K n).1 + (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range ≤ localNormSubgroup K E := by + let Delta := KummerTheory.maximalKummerSubgroup K n + let E := kummerRadicalExtension (K := K) (Omega := Omega) n Delta.1 + let : IsGalois K E := + kummerRadicalExtension_isGalois (K := K) (Omega := Omega) n Delta.1 + let : FiniteDimensional K E := + KummerTheory.maximalKummerRadicalExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu + let : IsMulCommutative Gal(E/K) := + kummerRadicalExtension_isMulCommutative + (K := K) (Omega := Omega) n hmu Delta.1 + let : CommGroup Gal(E/K) := + CommGroup.mk (fun a b => IsMulCommutative.is_comm.comm a b) + have habExponent : + ∀ a : Abelianization (Gal(E/K)), a ^ (n : ℕ) = 1 := by + intro a + apply (Abelianization.equivOfComm : + Gal(E/K) ≃* Abelianization (Gal(E/K))).symm.injective + rw [map_pow, map_one] + exact kummerRadicalExtension_galois_pow_eq_one + (K := K) (Omega := Omega) n hmu Delta.1 _ + change (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range ≤ localNormSubgroup K E + intro x hx + obtain ⟨y, rfl⟩ := + (MonoidHom.mem_range (G := Kˣ)).1 hx + rw [← localArtinMonoidHom_ker K E, MonoidHom.mem_ker, + powMonoidHom_apply, map_pow] + exact habExponent (localArtinMonoidHom K E y) + +/-- If the base field contains the `n`-th roots of unity, the norm subgroup +of the maximal exponent-`n` Kummer extension is exactly `Kˣⁿ`. -/ +theorem maximalKummerNormSubgroup_eq_powMonoidHom_range + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + let E := kummerRadicalExtension (K := K) (Omega := Omega) n + (KummerTheory.maximalKummerSubgroup K n).1 + localNormSubgroup K E = (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range := by + let Delta := KummerTheory.maximalKummerSubgroup K n + let E := kummerRadicalExtension (K := K) (Omega := Omega) n Delta.1 + let P := (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range + let N := localNormSubgroup K E + let : IsGalois K E := + kummerRadicalExtension_isGalois (K := K) (Omega := Omega) n Delta.1 + let : FiniteDimensional K E := + KummerTheory.maximalKummerRadicalExtension_finiteDimensional + (K := K) (Omega := Omega) n hnK hmu + let : Finite (Kˣ ⧸ P) := + LocalFieldTheory.finite_nthPowerQuotient_of_natCast_ne_zero + K (n : ℕ) hnK + let : P.FiniteIndex := P.finiteIndex_of_finite_quotient + have hle : P ≤ N := + powMonoidHom_range_le_maximalKummerNormSubgroup + (K := K) (Omega := Omega) n hnK hmu + let : Finite (NormQuotient K E) := + Finite.of_equiv (Kˣ ⧸ P) + (maximalKummerNormQuotientEquivPowerQuotient + (K := K) (Omega := Omega) n hnK hmu).symm.toEquiv + have hindex : N.index = P.index := by + change Nat.card (NormQuotient K E) = + Nat.card (Kˣ ⧸ P) + exact Nat.card_congr + (maximalKummerNormQuotientEquivPowerQuotient + (K := K) (Omega := Omega) n hnK hmu).toEquiv + apply le_antisymm + · by_contra hnot + have hne : P ≠ N := by + intro hPN + apply hnot + exact hPN.symm.le + have hlt : P < N := lt_of_le_of_ne hle hne + have hindexLt : N.index < P.index := Subgroup.index_strictAnti hlt + rw [hindex] at hindexLt + exact (Nat.lt_irrefl _ hindexLt) + · exact hle + +end LocalClassFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupOrderEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupOrderEmbedding.lean new file mode 100644 index 0000000000..4df470e58c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupOrderEmbedding.lean @@ -0,0 +1,449 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LocalAbsoluteData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +/-! +# Finite abelian subextensions and native norm subgroups + +A finite abelian subextension of the fixed separable closure determines an +ordinary norm subgroup of the local multiplicative group. This module proves +that the resulting assignment is an order embedding into the opposite poset +of native open finite-index subgroups. Surjectivity is the remaining local +existence-theorem input. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation + +variable (K : Type) [Field K] + +/-- Finiteness over the concrete ground-field fixing group implies +finiteness over the abstract class-formation `baseField`. -/ +theorem finiteAbelianSubextension_finite_over_absoluteBase + (L : FiniteAbelianSubextension (intrinsicAbstractBase K)) : + Finite ((baseField (intrinsicAbsoluteGalois K)).toSubgroup ⧸ + extensionSubgroup (baseField (intrinsicAbsoluteGalois K)) L.field + (le_baseField L.field)) := by + let : Finite ((intrinsicAbstractBase K).toSubgroup ⧸ + extensionSubgroup (intrinsicAbstractBase K) L.field L.below) := + L.finite + simpa only using + (FiniteGaloisSubextension.finite_extension_trans L.below + (le_baseField (intrinsicAbstractBase K))) + +/-- Normality over the concrete ground-field fixing group is normality over +the abstract class-formation `baseField`. -/ +theorem finiteAbelianSubextension_normal_over_absoluteBase + (L : FiniteAbelianSubextension (intrinsicAbstractBase K)) : + (extensionSubgroup (baseField (intrinsicAbsoluteGalois K)) L.field + (le_baseField L.field)).Normal := by + refine { conj_mem := fun h hh g ↦ ?_ } + rw [mem_extensionSubgroup_iff] at hh ⊢ + let h' : (intrinsicAbstractBase K).toSubgroup := ⟨h, L.below hh⟩ + let g' : (intrinsicAbstractBase K).toSubgroup := ⟨g, by + rw [show intrinsicAbstractBase K = + baseField (intrinsicAbsoluteGalois K) from + closedFixingSubgroup_bot_eq_baseField K (SeparableClosure K)] + exact g.property⟩ + have hh' : h' ∈ extensionSubgroup + (intrinsicAbstractBase K) L.field L.below := + (mem_extensionSubgroup_iff + (intrinsicAbstractBase K) L.field L.below h').2 hh + have hout := L.normal.conj_mem h' hh' g' + have hout' := (mem_extensionSubgroup_iff + (intrinsicAbstractBase K) L.field L.below _).1 hout + change ((g : intrinsicAbsoluteGalois K) * + (h : intrinsicAbsoluteGalois K) * + (g : intrinsicAbsoluteGalois K)⁻¹) ∈ L.field + change ((g' : intrinsicAbsoluteGalois K) * + (h' : intrinsicAbsoluteGalois K) * + (g' : intrinsicAbsoluteGalois K)⁻¹) ∈ L.field at hout' + exact hout' + +/-- The actual norm subgroup of the fixed field represented by an abstract +finite abelian extension. -/ +def finiteAbelianNormSubgroup + (L : FiniteAbelianSubextension (intrinsicAbstractBase K)) : Subgroup Kˣ := + localNormSubgroup K (abstractFixedField K (SeparableClosure K) L.field) + +/-- The fixed field represented by an abstract finite abelian extension is +an actual finite abelian extension of `K`. The commutativity assertion is +transported across the concrete quotient--Galois-group equivalence, rather +than being inferred merely from the name of the abstract package. -/ +theorem finiteAbelianSubextension_fixedField_isAbelianGalois + (L : FiniteAbelianSubextension (intrinsicAbstractBase K)) : + IsAbelianGalois K + (abstractFixedField K (SeparableClosure K) L.field) := by + let E := abstractFixedField K (SeparableClosure K) L.field + let : Finite ((baseField (intrinsicAbsoluteGalois K)).toSubgroup ⧸ + extensionSubgroup (baseField (intrinsicAbsoluteGalois K)) L.field + (le_baseField L.field)) := + finiteAbelianSubextension_finite_over_absoluteBase K L + let : FiniteDimensional K E := + abstractFixedField_finiteDimensional + K (SeparableClosure K) L.field inferInstance + let : IsGalois K E := + abstractFixedField_isGalois_of_base_normal K L.field + (finiteAbelianSubextension_normal_over_absoluteBase K L) + let : (extensionSubgroup + (intrinsicAbstractBase K) L.field L.below).Normal := L.normal + let e : L.extensionQuotient ≃* Gal(E/K) := by + let e₀ := baseFixingExtensionQuotientEquivGaloisGroup + K (SeparableClosure K) E + have hclosed : closedFixingSubgroup K (SeparableClosure K) E = + L.field := + closedFixingSubgroup_abstractFixedField_eq + K (SeparableClosure K) L.field + have hsub : + extensionSubgroup (intrinsicAbstractBase K) + (closedFixingSubgroup K (SeparableClosure K) E) + (fixingSubgroupLeBase K (SeparableClosure K) E) = + extensionSubgroup (intrinsicAbstractBase K) L.field L.below := by + ext σ + rw [mem_extensionSubgroup_iff, mem_extensionSubgroup_iff] + exact SetLike.ext_iff.mp hclosed σ.1 + exact L.extensionQuotientMulEquiv.trans + ((QuotientGroup.quotientMulEquivOfEq hsub.symm).trans e₀) + refine { is_comm.comm := fun σ τ ↦ ?_ } + exact e.symm.injective (by + simpa only [map_mul] using + mul_comm (e.symm σ) (e.symm τ)) + +/-- The concrete fixed field of an abstract compositum is the compositum of +the two concrete fixed fields inside the chosen separable closure. -/ +theorem finiteAbelianSubextension_compositum_fixedField + (U T : FiniteAbelianSubextension (intrinsicAbstractBase K)) : + abstractFixedField K (SeparableClosure K) (U.compositum T).field = + abstractFixedField K (SeparableClosure K) U.field ⊔ + abstractFixedField K (SeparableClosure K) T.field := by + let EU := abstractFixedField K (SeparableClosure K) U.field + let ET := abstractFixedField K (SeparableClosure K) T.field + rw [← InfiniteGalois.fixedField_fixingSubgroup (EU ⊔ ET)] + apply congrArg IntermediateField.fixedField + change + (U.field.toSubgroup ⊓ T.field.toSubgroup) = + (EU ⊔ ET).fixingSubgroup + rw [IntermediateField.fixingSubgroup_sup] + rw [show EU.fixingSubgroup = U.field.toSubgroup by + exact InfiniteGalois.fixingSubgroup_fixedField U.field, + show ET.fixingSubgroup = T.field.toSubgroup by + exact InfiniteGalois.fixingSubgroup_fixedField T.field] + +/-- The relative class-formation norm of a unit in an arbitrary abstract fixed +field is the ordinary field norm, before identifying the base fixed units +with `Kˣ`. -/ +theorem relativeNorm_abstractFixedFieldUnit_val_of_isGalois + (H : ClosedSubgroup (intrinsicAbsoluteGalois K)) + (hH : H.toSubgroup ≤ (intrinsicAbstractBase K).toSubgroup) + [Finite ((intrinsicAbstractBase K).toSubgroup ⧸ + extensionSubgroup (intrinsicAbstractBase K) H hH)] + [FiniteDimensional K + (abstractFixedField K (SeparableClosure K) H)] + [IsGalois K (abstractFixedField K (SeparableClosure K) H)] + (x : (abstractFixedField K (SeparableClosure K) H)ˣ) : + ((Additive.toMul + ((relativeNorm (intrinsicAbsoluteUnits K) (intrinsicAbstractBase K) + H hH (abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H (Additive.ofMul x))).1 : + Additive (SeparableClosure K)ˣ) : (SeparableClosure K)ˣ) : + SeparableClosure K) = + algebraMap K (SeparableClosure K) + (Algebra.norm K + (x : abstractFixedField K (SeparableClosure K) H)) := by + let E := abstractFixedField K (SeparableClosure K) H + let y : ambientFixedAddSubgroup (intrinsicAbsoluteUnits K) H := + abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H (Additive.ofMul x) + let yE := intermediateFieldUnitsEquivGaloisFixed + K (SeparableClosure K) E (Additive.ofMul x) + have hy : yE.1 = y.1 := by + rw [intermediateFieldUnitsEquivGaloisFixed_coe] + exact (abstractFixedFieldUnitsEquivGaloisFixed_coe + K (SeparableClosure K) H (Additive.ofMul x)).symm + have hnorm := + relativeNorm_intermediateFieldUnit_val_of_isSeparable + K (SeparableClosure K) E x + have htransport := relativeNorm_coe_eq_of_closedSubgroup_eq + (intrinsicAbsoluteUnits K) + (intrinsicAbstractBase K) (intrinsicAbstractBase K) + (closedFixingSubgroup K (SeparableClosure K) E) H + (fixingSubgroupLeBase K (SeparableClosure K) E) hH + rfl (closedFixingSubgroup_abstractFixedField_eq + K (SeparableClosure K) H) + yE y hy + have htransport' := congrArg + (fun z : Additive (SeparableClosure K)ˣ ↦ + ((Additive.toMul z : (SeparableClosure K)ˣ) : SeparableClosure K)) + htransport + change + ((Additive.toMul + ((relativeNorm (intrinsicAbsoluteUnits K) (intrinsicAbstractBase K) + H hH y).1 : Additive (SeparableClosure K)ˣ) : + (SeparableClosure K)ˣ) : SeparableClosure K) = _ + exact htransport'.symm.trans hnorm + +/-- The preceding norm identity after identifying the base fixed units with +`Additive Kˣ`. -/ +theorem baseUnitsEquivGaloisAmbientFixed_symm_relativeNorm_abstractFixedFieldUnit_eq_normUnits + (H : ClosedSubgroup (intrinsicAbsoluteGalois K)) + (hH : H.toSubgroup ≤ (intrinsicAbstractBase K).toSubgroup) + [Finite ((intrinsicAbstractBase K).toSubgroup ⧸ + extensionSubgroup (intrinsicAbstractBase K) H hH)] + [FiniteDimensional K + (abstractFixedField K (SeparableClosure K) H)] + [IsGalois K (abstractFixedField K (SeparableClosure K) H)] + (x : (abstractFixedField K (SeparableClosure K) H)ˣ) : + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm + (relativeNorm (intrinsicAbsoluteUnits K) (intrinsicAbstractBase K) + H hH (abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H (Additive.ofMul x))) = + Additive.ofMul + (normUnits K (abstractFixedField K (SeparableClosure K) H) x) := by + apply (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).injective + rw [(baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).apply_symm_apply] + apply Subtype.ext + apply Additive.ext + apply Units.ext + calc + _ = algebraMap K (SeparableClosure K) + (Algebra.norm K + (x : abstractFixedField K (SeparableClosure K) H)) := + relativeNorm_abstractFixedFieldUnit_val_of_isGalois K H hH x + _ = algebraMap K (SeparableClosure K) + ((normUnits K (abstractFixedField K (SeparableClosure K) H) x : + Kˣ) : K) := by + rw [LocalFieldTheory.normUnits_apply_coe] + _ = _ := + (baseUnitsEquivGaloisAmbientFixed_val K (SeparableClosure K) + (normUnits K (abstractFixedField K (SeparableClosure K) H) x)).symm + +/-- Transporting the abstract finite norm subgroup back to `Kˣ` gives +literally the ordinary norm subgroup of the represented fixed field. -/ +theorem map_finiteAbelianNormSubgroup_eq_additiveNormSubgroup + (L : FiniteAbelianSubextension (intrinsicAbstractBase K)) : + (L.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom = + additiveNormSubgroup K + (abstractFixedField K (SeparableClosure K) L.field) := by + let : Finite ((intrinsicAbstractBase K).toSubgroup ⧸ + extensionSubgroup (intrinsicAbstractBase K) L.field L.below) := + L.finite + let : Finite ((baseField (intrinsicAbsoluteGalois K)).toSubgroup ⧸ + extensionSubgroup (baseField (intrinsicAbsoluteGalois K)) L.field + (le_baseField L.field)) := + finiteAbelianSubextension_finite_over_absoluteBase K L + let E := abstractFixedField K (SeparableClosure K) L.field + let : FiniteDimensional K E := + abstractFixedField_finiteDimensional + K (SeparableClosure K) L.field inferInstance + let : IsGalois K E := + abstractFixedField_isGalois_of_base_normal K L.field + (finiteAbelianSubextension_normal_over_absoluteBase K L) + ext y + constructor + · rintro ⟨a, ha, rfl⟩ + rcases ha with ⟨b, rfl⟩ + let u : Eˣ := Additive.toMul + ((abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) L.field).symm b) + have hb : + abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) L.field (Additive.ofMul u) = b := by + change abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) L.field + ((abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) L.field).symm b) = b + exact (abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) L.field).apply_symm_apply b + rw [← hb] + change (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm + (relativeNorm (intrinsicAbsoluteUnits K) (intrinsicAbstractBase K) + L.field L.below (abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) L.field (Additive.ofMul u))) ∈ + additiveNormSubgroup K E + rw [baseUnitsEquivGaloisAmbientFixed_symm_relativeNorm_abstractFixedFieldUnit_eq_normUnits] + exact ⟨u, rfl⟩ + · intro hy + change Additive.toMul y ∈ localNormSubgroup K E at hy + rcases hy with ⟨u, hu⟩ + refine ⟨baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + (Additive.ofMul (normUnits K E u)), ?_, ?_⟩ + · refine ⟨abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) L.field (Additive.ofMul u), ?_⟩ + apply (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.injective + change (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm + (relativeNorm (intrinsicAbsoluteUnits K) (intrinsicAbstractBase K) + L.field L.below (abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) L.field (Additive.ofMul u))) = + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + (Additive.ofMul (normUnits K E u))) + rw [baseUnitsEquivGaloisAmbientFixed_symm_relativeNorm_abstractFixedFieldUnit_eq_normUnits, + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm_apply_apply] + · change (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + (Additive.ofMul (normUnits K E u))) = y + rw [(baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm_apply_apply] + exact congrArg Additive.ofMul hu + +/-- An abstract fixed-coefficient norm containment transports back to the +corresponding containment of ordinary norm subgroups in `Kˣ`. -/ +theorem finiteAbelianNormSubgroup_le_of_abstractNormSubgroup_le_map + (L : FiniteAbelianSubextension (intrinsicAbstractBase K)) + (H : Subgroup Kˣ) + (h : + L.normSubgroup (intrinsicAbsoluteUnits K) ≤ + H.toAddSubgroup.map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).toAddMonoidHom) : + finiteAbelianNormSubgroup K L ≤ H := by + let e := baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + intro x hx + have hxAdd : + Additive.ofMul x ∈ + additiveNormSubgroup K + (abstractFixedField K (SeparableClosure K) L.field) := by + exact hx + rw [← map_finiteAbelianNormSubgroup_eq_additiveNormSubgroup K L] at hxAdd + rcases hxAdd with ⟨y, hy, hyx⟩ + rcases h hy with ⟨z, hz, hzy⟩ + have hzEq : z = Additive.ofMul x := by + calc + z = e.symm (e z) := (e.symm_apply_apply z).symm + _ = e.symm y := congrArg e.symm hzy + _ = Additive.ofMul x := hyx + change Additive.ofMul x ∈ H.toAddSubgroup + simpa [hzEq] using hz + +section LocalField + +variable [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- States the theorem `finiteAbelianNormSubgroup_isOpen`. -/ +theorem finiteAbelianNormSubgroup_isOpen + (L : FiniteAbelianSubextension (intrinsicAbstractBase K)) : + IsOpen (finiteAbelianNormSubgroup K L : Set Kˣ) := by + let E := abstractFixedField K (SeparableClosure K) L.field + let : Finite ((baseField (intrinsicAbsoluteGalois K)).toSubgroup ⧸ + extensionSubgroup (baseField (intrinsicAbsoluteGalois K)) L.field + (le_baseField L.field)) := + finiteAbelianSubextension_finite_over_absoluteBase K L + let : FiniteDimensional K E := + abstractFixedField_finiteDimensional + K (SeparableClosure K) L.field inferInstance + let : IsGalois K E := + abstractFixedField_isGalois_of_base_normal K L.field + (finiteAbelianSubextension_normal_over_absoluteBase K L) + exact localNormSubgroup_isOpen K E + +/-- States the theorem `finiteAbelianNormSubgroup_finiteIndex`. -/ +theorem finiteAbelianNormSubgroup_finiteIndex + (L : FiniteAbelianSubextension (intrinsicAbstractBase K)) : + (finiteAbelianNormSubgroup K L).FiniteIndex := by + let E := abstractFixedField K (SeparableClosure K) L.field + let : Finite ((baseField (intrinsicAbsoluteGalois K)).toSubgroup ⧸ + extensionSubgroup (baseField (intrinsicAbsoluteGalois K)) L.field + (le_baseField L.field)) := + finiteAbelianSubextension_finite_over_absoluteBase K L + let : FiniteDimensional K E := + abstractFixedField_finiteDimensional + K (SeparableClosure K) L.field inferInstance + let : IsGalois K E := + abstractFixedField_isGalois_of_base_normal K L.field + (finiteAbelianSubextension_normal_over_absoluteBase K L) + let : Finite (Gal(E/K)) := by + apply Nat.finite_of_card_ne_zero + rw [IsGalois.card_aut_eq_finrank K E] + exact Nat.ne_of_gt Module.finrank_pos + let : Finite (Abelianization (Gal(E/K))) := + Finite.of_surjective Abelianization.of QuotientGroup.mk_surjective + let : Finite (NormQuotient K E) := + Finite.of_equiv (Abelianization (Gal(E/K))) + (abelianizationEquivNormQuotient K E).toEquiv + let : Finite (Kˣ ⧸ localNormSubgroup K E) := by + change Finite (NormQuotient K E) + infer_instance + change (localNormSubgroup K E).FiniteIndex + exact Subgroup.finiteIndex_of_finite_quotient + +/-- The norm-subgroup map, sending a finite abelian extension to its ordinary +norm subgroup, with native openness and finite index recorded. -/ +noncomputable def finiteAbelianNormSubgroupMap : + FiniteAbelianSubextension (intrinsicAbstractBase K) → + OpenFiniteIndexSubgroup K := + fun L ↦ ⟨finiteAbelianNormSubgroup K L, + finiteAbelianNormSubgroup_isOpen K L, + finiteAbelianNormSubgroup_finiteIndex K L⟩ + +/-- States the theorem `finiteAbelianNormSubgroupMap_injective`. -/ +theorem finiteAbelianNormSubgroupMap_injective : + Function.Injective (finiteAbelianNormSubgroupMap K) := by + intro L₁ L₂ hL + apply FiniteAbelianSubextension.normSubgroupMap_injective + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + (intrinsicFiniteAbstractBase K) + apply Subtype.ext + apply (AddSubgroup.map_injective + (f := (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom) + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.injective) + change (L₁.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom = + (L₂.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom + rw [map_finiteAbelianNormSubgroup_eq_additiveNormSubgroup, + map_finiteAbelianNormSubgroup_eq_additiveNormSubgroup] + have hsub : finiteAbelianNormSubgroup K L₁ = + finiteAbelianNormSubgroup K L₂ := + congrArg OpenFiniteIndexSubgroup.subgroup hL + exact congrArg Subgroup.toAddSubgroup hsub + +/-- The order reversal for finite abelian subextensions, expressed for the actual fixed fields and +their ordinary norm subgroups. -/ +theorem finiteAbelianSubextension_le_iff_normSubgroup_le + (L₁ L₂ : FiniteAbelianSubextension (intrinsicAbstractBase K)) : + L₁ ≤ L₂ ↔ + finiteAbelianNormSubgroup K L₂ ≤ + finiteAbelianNormSubgroup K L₁ := by + refine (FiniteAbelianSubextension.le_iff_normSubgroup_le + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + (intrinsicFiniteAbstractBase K) L₁ L₂).trans ?_ + rw [← AddSubgroup.map_le_map_iff_of_injective + (f := (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom) + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.injective] + rw [map_finiteAbelianNormSubgroup_eq_additiveNormSubgroup, + map_finiteAbelianNormSubgroup_eq_additiveNormSubgroup] + rfl + +/-- The ordinary norm-subgroup assignment is an order embedding into the +opposite poset of native open finite-index subgroups. -/ +noncomputable def finiteAbelianNormSubgroupOrderEmbedding : + FiniteAbelianSubextension (intrinsicAbstractBase K) ↪o + (OpenFiniteIndexSubgroup K)ᵒᵈ where + toFun := finiteAbelianNormSubgroupMap K + inj' := finiteAbelianNormSubgroupMap_injective K + map_rel_iff' := by + intro L₁ L₂ + change finiteAbelianNormSubgroup K L₂ ≤ + finiteAbelianNormSubgroup K L₁ ↔ L₁ ≤ L₂ + exact (finiteAbelianSubextension_le_iff_normSubgroup_le K L₁ L₂).symm + +end LocalField + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupRingEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupRingEquiv.lean new file mode 100644 index 0000000000..e8d2a85bc1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupRingEquiv.lean @@ -0,0 +1,70 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +public import Mathlib.RingTheory.Norm.Basic +/-! +# Transport of finite-extension norm subgroups + +Compatible field equivalences carry the actual group of field norms to the +actual group of field norms. This is the norm comparison needed when finite +local class-field theory is transported to a small representative. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u v w x + +variable {F : Type u} {M : Type v} {F' : Type w} {M' : Type x} + [Field F] [Field M] [Field F'] [Field M'] + [Algebra F M] [Algebra F' M'] + [FiniteDimensional F M] [FiniteDimensional F' M'] + +omit [FiniteDimensional F M] [FiniteDimensional F' M'] in +/-- The field-norm homomorphisms commute with compatible field equivalences. -/ +theorem fieldNormHom_map_ringEquiv + (eF : F ≃+* F') (eM : M ≃+* M') + (he : (algebraMap F' M').comp eF.toRingHom = + eM.toRingHom.comp (algebraMap F M)) + (y : Mˣ) : + (Units.mapEquiv eF.toMulEquiv) (fieldNormHom F M y) = + fieldNormHom F' M' (Units.mapEquiv eM.toMulEquiv y) := by + apply Units.ext + change eF (Algebra.norm F (y : M)) = + Algebra.norm F' (eM (y : M)) + rw [Algebra.norm_eq_of_equiv_equiv eF eM he] + exact eF.apply_symm_apply _ + +/-- The image of a field-norm subgroup under a base-field equivalence is +exactly the norm subgroup of the transported extension. -/ +theorem fieldNormSubgroup_map_ringEquiv + (eF : F ≃+* F') (eM : M ≃+* M') + (he : (algebraMap F' M').comp eF.toRingHom = + eM.toRingHom.comp (algebraMap F M)) : + (fieldNormSubgroup F M).map + (Units.mapEquiv eF.toMulEquiv).toMonoidHom = + fieldNormSubgroup F' M' := by + ext z + constructor + · rintro ⟨y, ⟨x, rfl⟩, rfl⟩ + exact ⟨Units.mapEquiv eM.toMulEquiv x, + (fieldNormHom_map_ringEquiv eF eM he x).symm⟩ + · rintro ⟨x, rfl⟩ + let y := (Units.mapEquiv eM.toMulEquiv).symm x + refine ⟨fieldNormHom F M y, ⟨y, rfl⟩, ?_⟩ + change (Units.mapEquiv eF.toMulEquiv) (fieldNormHom F M y) = + fieldNormHom F' M' x + simpa only [y, MulEquiv.apply_symm_apply] using + fieldNormHom_map_ringEquiv eF eM he y + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupSurjectivity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupSurjectivity.lean new file mode 100644 index 0000000000..d993ac69d1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupSurjectivity.lean @@ -0,0 +1,295 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupOrderEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm +/-! +# Surjectivity criteria for the local norm-subgroup map + +This file translates the abstract existence theorem into ordinary field norms. +It proves the compositum and intersection formulas, isolates the norm-topology +criterion which makes the ordinary norm-subgroup order embedding surjective, +and constructs norm-topology witnesses from concrete finite Galois extensions. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation + +variable (K : Type) [Field K] + +section LocalField + +variable [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The ordinary norm subgroup of a compositum is the intersection of the +two ordinary norm subgroups. -/ +theorem finiteAbelianNormSubgroup_compositum + (L₁ L₂ : FiniteAbelianSubextension (intrinsicAbstractBase K)) : + finiteAbelianNormSubgroup K (L₁.compositum L₂) = + finiteAbelianNormSubgroup K L₁ ⊓ + finiteAbelianNormSubgroup K L₂ := by + have habs := + FiniteAbelianSubextension.normSubgroup_compositum + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + (intrinsicFiniteAbstractBase K) L₁ L₂ + have hmapped := congrArg + (fun S : AddSubgroup + (ambientFixedAddSubgroup (intrinsicAbsoluteUnits K) + (intrinsicAbstractBase K)) ↦ + S.map (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom) habs + change ((L₁.compositum L₂).normSubgroup + (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom = + (L₁.normSubgroup (intrinsicAbsoluteUnits K) ⊓ + L₂.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom at hmapped + rw [AddSubgroup.map_inf _ _ _ + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.injective] at hmapped + rw [map_finiteAbelianNormSubgroup_eq_additiveNormSubgroup, + map_finiteAbelianNormSubgroup_eq_additiveNormSubgroup, + map_finiteAbelianNormSubgroup_eq_additiveNormSubgroup] at hmapped + apply Subgroup.ext + intro x + change Additive.ofMul x ∈ additiveNormSubgroup K + (abstractFixedField K (SeparableClosure K) + (L₁.compositum L₂).field) ↔ + Additive.ofMul x ∈ + (additiveNormSubgroup K + (abstractFixedField K (SeparableClosure K) L₁.field) ⊓ + additiveNormSubgroup K + (abstractFixedField K (SeparableClosure K) L₂.field)) + exact Iff.of_eq (congrArg + (fun S : AddSubgroup (Additive Kˣ) => Additive.ofMul x ∈ S) hmapped) + +/-- The ordinary norm subgroup of an intersection field is the supremum of +the two ordinary norm subgroups. -/ +theorem finiteAbelianNormSubgroup_intersection + (L₁ L₂ : FiniteAbelianSubextension (intrinsicAbstractBase K)) : + finiteAbelianNormSubgroup K (L₁.intersection L₂) = + finiteAbelianNormSubgroup K L₁ ⊔ + finiteAbelianNormSubgroup K L₂ := by + have habs := + FiniteAbelianSubextension.normSubgroup_intersection + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + (intrinsicFiniteAbstractBase K) L₁ L₂ + have hmapped := congrArg + (fun S : AddSubgroup + (ambientFixedAddSubgroup (intrinsicAbsoluteUnits K) + (intrinsicAbstractBase K)) ↦ + S.map (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom) habs + change ((L₁.intersection L₂).normSubgroup + (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom = + (L₁.normSubgroup (intrinsicAbsoluteUnits K) ⊔ + L₂.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom at hmapped + rw [AddSubgroup.map_sup] at hmapped + rw [map_finiteAbelianNormSubgroup_eq_additiveNormSubgroup, + map_finiteAbelianNormSubgroup_eq_additiveNormSubgroup, + map_finiteAbelianNormSubgroup_eq_additiveNormSubgroup] at hmapped + apply (Subgroup.toAddSubgroup : + Subgroup Kˣ ≃o AddSubgroup (Additive Kˣ)).injective + change additiveNormSubgroup K + (abstractFixedField K (SeparableClosure K) + (L₁.intersection L₂).field) = + Subgroup.toAddSubgroup + (finiteAbelianNormSubgroup K L₁ ⊔ + finiteAbelianNormSubgroup K L₂) + rw [(Subgroup.toAddSubgroup : + Subgroup Kˣ ≃o AddSubgroup (Additive Kˣ)).map_sup] + exact hmapped + +/-- A native open finite-index subgroup which is open for the abstract norm +topology is the ordinary norm subgroup of a finite abelian subextension. -/ +theorem exists_finiteAbelianNormSubgroup_eq_of_normOpen + (H : OpenFiniteIndexSubgroup K) + (hnormOpen : + IsNormOpen (intrinsicAbsoluteUnits K) (intrinsicAbstractBase K) + ((H.subgroup.toAddSubgroup.map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).toAddMonoidHom : + AddSubgroup (ambientFixedAddSubgroup (intrinsicAbsoluteUnits K) + (intrinsicAbstractBase K))) : Set _)) : + ∃ L, finiteAbelianNormSubgroupMap K L = H := by + let : H.subgroup.FiniteIndex := H.finiteIndex + let Habs : AddSubgroup + (ambientFixedAddSubgroup (intrinsicAbsoluteUnits K) + (intrinsicAbstractBase K)) := + H.subgroup.toAddSubgroup.map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).toAddMonoidHom + have hopen : + IsNormOpen (intrinsicAbsoluteUnits K) (intrinsicAbstractBase K) + (Habs : Set _) := by + simpa only [Habs] using hnormOpen + let Hopen : FiniteAbelianSubextension.NormOpenAddSubgroup + (intrinsicAbsoluteUnits K) (intrinsicAbstractBase K) := ⟨Habs, hopen⟩ + obtain ⟨L, hL⟩ := + FiniteAbelianSubextension.normSubgroupMap_surjective + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + (intrinsicFiniteAbstractBase K) Hopen + refine ⟨L, ?_⟩ + apply OpenFiniteIndexSubgroup.ext + have habs : L.normSubgroup (intrinsicAbsoluteUnits K) = Habs := + congrArg Subtype.val hL + have hmapped := congrArg + (fun S : AddSubgroup + (ambientFixedAddSubgroup (intrinsicAbsoluteUnits K) + (intrinsicAbstractBase K)) ↦ + S.map (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom) habs + change (L.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom = + Habs.map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom at hmapped + rw [map_finiteAbelianNormSubgroup_eq_additiveNormSubgroup] at hmapped + have hcancel : + Habs.map (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom = + H.subgroup.toAddSubgroup := by + ext x + constructor + · rintro ⟨y, ⟨z, hz, rfl⟩, rfl⟩ + simpa using hz + · intro hx + refine ⟨baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) x, ⟨x, hx, rfl⟩, ?_⟩ + exact (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm_apply_apply x + rw [hcancel] at hmapped + apply Subgroup.ext + intro x + change Additive.ofMul x ∈ additiveNormSubgroup K + (abstractFixedField K (SeparableClosure K) L.field) ↔ + Additive.ofMul x ∈ H.subgroup.toAddSubgroup + exact Iff.of_eq (congrArg + (fun S : AddSubgroup (Additive Kˣ) => Additive.ofMul x ∈ S) hmapped) + +/-- If all native finite-index subgroups are norm-open, the ordinary +norm-subgroup order embedding is surjective. -/ +theorem finiteAbelianNormSubgroupMap_surjective_of_normOpen + (hnormOpen : ∀ (H : Subgroup Kˣ) [H.FiniteIndex], + IsNormOpen (intrinsicAbsoluteUnits K) (intrinsicAbstractBase K) + ((H.toAddSubgroup.map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).toAddMonoidHom : + AddSubgroup (ambientFixedAddSubgroup (intrinsicAbsoluteUnits K) + (intrinsicAbstractBase K))) : Set _)) : + Function.Surjective (finiteAbelianNormSubgroupMap K) := by + intro H + let : H.subgroup.FiniteIndex := H.finiteIndex + apply exists_finiteAbelianNormSubgroup_eq_of_normOpen K H + exact hnormOpen H.subgroup + +omit [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] in +/-- A finite Galois extension whose ordinary norm subgroup is contained in +`H` witnesses that `H` is open for the abstract norm topology. -/ +theorem finiteIndexSubgroup_isNormOpen_of_normSubgroup_le + (E : Type) [Field E] [Algebra K E] + [FiniteDimensional K E] [IsGalois K E] + (H : Subgroup Kˣ) + (hnorm : localNormSubgroup K E ≤ H) : + let A := intrinsicAbsoluteUnits K + let B := intrinsicAbstractBase K + let e := baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + IsNormOpen A B + ((H.toAddSubgroup.map e.toAddMonoidHom : + AddSubgroup (ambientFixedAddSubgroup A B)) : + Set (ambientFixedAddSubgroup A B)) := by + let A := intrinsicAbsoluteUnits K + let B := intrinsicAbstractBase K + let e := baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + let i := AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K E + let R : IntermediateField K (SeparableClosure K) := AlgHom.fieldRange i + let : FiniteDimensional K R := + (AlgEquiv.ofInjectiveField i).toLinearEquiv.finiteDimensional + let : IsGalois K R := IsGalois.of_algEquiv (AlgEquiv.ofInjectiveField i) + let L : FiniteGaloisSubextension B := { + field := RamificationTheory.closedFixingSubgroup K (SeparableClosure K) R + below := fixingSubgroupLeBase K (SeparableClosure K) R + normal := inferInstance + finite := baseFixingExtensionQuotient_finite + K (SeparableClosure K) R } + have hnormLe : additiveNormSubgroup K R ≤ H.toAddSubgroup := by + intro x hx + change Additive.toMul x ∈ localNormSubgroup K R at hx + change Additive.toMul x ∈ H + apply hnorm + rw [← localNormSubgroup_fieldRange_eq K (SeparableClosure K) E i] + exact hx + have hmap : + (L.normSubgroup A).map e.symm.toAddMonoidHom = + additiveNormSubgroup K R := by + simpa [A, B, L, R, e, + FiniteGaloisSubextension.normSubgroup] using + (map_finiteNormSubgroup_eq_additiveNormSubgroup + K (SeparableClosure K) R) + have hLE : + L.normSubgroup A ≤ H.toAddSubgroup.map e.toAddMonoidHom := by + intro x hx + have hxmap : e.symm x ∈ + (L.normSubgroup A).map e.symm.toAddMonoidHom := + ⟨x, hx, rfl⟩ + rw [hmap] at hxmap + exact ⟨e.symm x, hnormLe hxmap, e.apply_symm_apply x⟩ + exact (normTopology_addSubgroup_isOpen_iff A B + (H.toAddSubgroup.map e.toAddMonoidHom)).2 ⟨L, hLE⟩ + +omit [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] in +/-- Package a concrete finite Galois extension in the absolute Galois model, +retaining a prescribed upper bound for its ordinary norm subgroup. -/ +theorem exists_finiteGaloisExtension_normSubgroup_map_le_of_normSubgroup_le + (E : Type) [Field E] [Algebra K E] + [FiniteDimensional K E] [IsGalois K E] + (J : Subgroup Kˣ) + (hnorm : localNormSubgroup K E ≤ J) : + ∃ T : FiniteGaloisSubextension (intrinsicAbstractBase K), + (T.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom ≤ + J.toAddSubgroup := by + let A := intrinsicAbsoluteUnits K + let B := intrinsicAbstractBase K + let e := baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + let i := AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K E + let R : IntermediateField K (SeparableClosure K) := AlgHom.fieldRange i + let : FiniteDimensional K R := + (AlgEquiv.ofInjectiveField i).toLinearEquiv.finiteDimensional + let : IsGalois K R := IsGalois.of_algEquiv (AlgEquiv.ofInjectiveField i) + let T : FiniteGaloisSubextension B := { + field := RamificationTheory.closedFixingSubgroup K (SeparableClosure K) R + below := fixingSubgroupLeBase K (SeparableClosure K) R + normal := inferInstance + finite := baseFixingExtensionQuotient_finite + K (SeparableClosure K) R } + have hmap : + (T.normSubgroup A).map e.symm.toAddMonoidHom = + additiveNormSubgroup K R := by + simpa [A, B, e, T, R, FiniteGaloisSubextension.normSubgroup] using + (map_finiteNormSubgroup_eq_additiveNormSubgroup + K (SeparableClosure K) R) + refine ⟨T, ?_⟩ + intro x hx + rw [hmap] at hx + change Additive.toMul x ∈ J + apply hnorm + rw [← localNormSubgroup_fieldRange_eq K (SeparableClosure K) E i] + exact hx + +end LocalField + +end LocalClassFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/OrderReversal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/OrderReversal.lean new file mode 100644 index 0000000000..5f30e6c443 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/OrderReversal.lean @@ -0,0 +1,187 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupOrderEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport +/-! +# Field-facing order reversal for finite abelian extensions + +This module realizes a finite abelian extension inside a fixed separable +closure and packages it as an abstract finite abelian subextension. It then +transports the abstract order reversal for norm subgroups back to ordinary +field norms. The final lemmas record the standard open subgroups contained in +the norm subgroup of a finite abelian extension. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation + +/-- A finite abelian extension, realized by an explicit embedding in the +fixed separable closure, as an abstract finite abelian subextension. -/ +def finiteAbelianAbstractExtensionOfEmbedding + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + (i : L →ₐ[K] SeparableClosure K) : + FiniteAbelianSubextension (intrinsicAbstractBase K) where + toFiniteGaloisExtension := + finiteGaloisAbstractExtensionOfEmbedding K L i + commutative := by + change IsMulCommutative + ((closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))).toSubgroup ⧸ + extensionSubgroup + (closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i))) + let e := finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i + exact + { is_comm.comm := fun x y => by + apply e.injective + simp only [map_mul] + exact + (inferInstance : + IsMulCommutative (Gal(L/K))).is_comm.comm (e x) (e y) } + +/-- Under the canonical identification of the abstract base fixed units with +`Kˣ`, the abstract norm subgroup of an embedded finite abelian extension is +its ordinary field-norm subgroup. -/ +theorem map_finiteAbelianAbstractExtension_normSubgroup_eq + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + (i : L →ₐ[K] SeparableClosure K) : + ((finiteAbelianAbstractExtensionOfEmbedding K L i).normSubgroup + (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom = + additiveNormSubgroup K L := by + let : FiniteDimensional K (AlgHom.fieldRange i) := + (AlgEquiv.ofInjectiveField i).toLinearEquiv.finiteDimensional + let : IsGalois K (AlgHom.fieldRange i) := + IsGalois.of_algEquiv (AlgEquiv.ofInjectiveField i) + rw [show additiveNormSubgroup K L = + additiveNormSubgroup K (AlgHom.fieldRange i) by + exact congrArg Subgroup.toAddSubgroup + (localNormSubgroup_fieldRange_eq K (SeparableClosure K) L i).symm] + exact map_finiteNormSubgroup_eq_additiveNormSubgroup K + (SeparableClosure K) (AlgHom.fieldRange i) + +/-- Reverse inclusion of ordinary norm subgroups produces an embedding of +finite abelian extensions over the common local base field. -/ +theorem nonempty_algHom_of_normSubgroup_le + (K L M : Type) [Field K] [Field L] [Field M] + [Algebra K L] [Algebra K M] + [FiniteDimensional K L] [FiniteDimensional K M] + [IsAbelianGalois K L] [IsAbelianGalois K M] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (h : localNormSubgroup K M ≤ localNormSubgroup K L) : + Nonempty (L →ₐ[K] M) := by + let iL := AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L + let iM := AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K M + let AL := finiteAbelianAbstractExtensionOfEmbedding K L iL + let AM := finiteAbelianAbstractExtensionOfEmbedding K M iM + let e := baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + have hAbs : AM.normSubgroup (intrinsicAbsoluteUnits K) ≤ + AL.normSubgroup (intrinsicAbsoluteUnits K) := by + intro x hx + have hxM : e.symm x ∈ additiveNormSubgroup K M := by + rw [← map_finiteAbelianAbstractExtension_normSubgroup_eq K M iM] + exact ⟨x, hx, rfl⟩ + have hxL : e.symm x ∈ additiveNormSubgroup K L := by + change Additive.toMul (e.symm x) ∈ localNormSubgroup K L + apply h + exact hxM + rw [← map_finiteAbelianAbstractExtension_normSubgroup_eq K L iL] at hxL + rcases hxL with ⟨y, hy, hyx⟩ + have hyEq : y = x := by + apply e.symm.injective + exact hyx + simpa [hyEq] using hy + have hALAM : AL ≤ AM := + (FiniteAbelianSubextension.le_iff_normSubgroup_le + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + (intrinsicFiniteAbstractBase K) AL AM).2 hAbs + have hRange : AlgHom.fieldRange iL ≤ AlgHom.fieldRange iM := by + rw [← InfiniteGalois.fixedField_fixingSubgroup (AlgHom.fieldRange iM)] + apply (IntermediateField.le_iff_le + (AlgHom.fieldRange iM).fixingSubgroup (AlgHom.fieldRange iL)).2 + exact hALAM + exact ⟨(finiteGaloisFieldRangeEquivOfEmbedding K M iM).symm.toAlgHom.comp + ((IntermediateField.inclusion hRange).comp + (finiteGaloisFieldRangeEquivOfEmbedding K L iL).toAlgHom)⟩ + +/-- For a prescribed prime element, the norm subgroup of a finite abelian +extension contains a standard subgroup `⟨ϖᵈ⟩ Uⁿ` for some positive +integers `d` and `n`. -/ +theorem exists_uniformizerPrincipalSubgroup_le_normSubgroup + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (ϖ : Kˣ) : + ∃ d n : ℕ, 0 < d ∧ 1 ≤ n ∧ + LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ d n ≤ + localNormSubgroup K L := by + let : Finite (Gal(L/K)) := by + apply Nat.finite_of_card_ne_zero + rw [IsGalois.card_aut_eq_finrank K L] + exact Nat.ne_of_gt Module.finrank_pos + let : Finite (Abelianization (Gal(L/K))) := + Finite.of_surjective Abelianization.of QuotientGroup.mk_surjective + let : Finite (NormQuotient K L) := + Finite.of_equiv + (Abelianization (Gal(L/K))) + (abelianizationEquivNormQuotient K L).toEquiv + let : Finite (Kˣ ⧸ localNormSubgroup K L) := by + change Finite (NormQuotient K L) + infer_instance + let : (localNormSubgroup K L).FiniteIndex := + Subgroup.finiteIndex_of_finite_quotient + obtain ⟨n, hn, hUn⟩ := + LocalFieldTheory.exists_fieldPrincipalUnits_le_of_isOpen K (localNormSubgroup K L) + (localNormSubgroup_isOpen K L) + refine ⟨(localNormSubgroup K L).index, n, + Nat.pos_of_ne_zero Subgroup.FiniteIndex.index_ne_zero, hn, ?_⟩ + apply sup_le + · exact (Subgroup.zpowers_le).2 + ((localNormSubgroup K L).pow_index_mem ϖ) + · exact hUn + +/-- If the prescribed prime element is itself a norm, the norm subgroup +contains a standard subgroup with uniformizer exponent one. -/ +theorem exists_uniformizerPrincipalSubgroup_one_le_normSubgroup + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (ϖ : Kˣ) (hϖ : ϖ ∈ localNormSubgroup K L) : + ∃ n : ℕ, 1 ≤ n ∧ + LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ 1 n ≤ + localNormSubgroup K L := by + obtain ⟨n, hn, hUn⟩ := + LocalFieldTheory.exists_fieldPrincipalUnits_le_of_isOpen K (localNormSubgroup K L) + (localNormSubgroup_isOpen K L) + refine ⟨n, hn, sup_le ?_ hUn⟩ + simpa using (Subgroup.zpowers_le).2 hϖ + +end LocalClassFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianFields.lean new file mode 100644 index 0000000000..468bb246ac --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianFields.lean @@ -0,0 +1,109 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnshrinkFiniteAbelianFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.FiniteAbelianIntermediateFieldAlgEquiv +/-! +# Finite abelian fields in the chosen small-base separable closure + +The base equivalence and the equivalence between the two chosen separable +closures together transport finite abelian intermediate fields, preserving +their inclusion order. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalFieldTheory + +universe u + +variable (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The underlying intermediate-field order equivalence, before imposing +finite-dimensional and abelian Galois conditions. -/ +def shrinkChosenIntermediateFieldOrderIso : + letI : Small.{0} K := nonarchimedeanLocalField_small K + IntermediateField K (SeparableClosure K) ≃o + IntermediateField (Shrink.{0} K) (SeparableClosure (Shrink.{0} K)) := by + let : Small.{0} K := nonarchimedeanLocalField_small K + let : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + exact (shrinkIntermediateFieldOrderIso K).trans + (ClassFieldTheory.intermediateFieldAlgEquivOrderIso + (shrinkSeparableClosureEquiv K).symm) + +/-- Move a finite abelian intermediate field of the chosen closure of `K` +to the chosen closure of `Shrink K`. -/ +def shrinkChosenFiniteAbelianField + (E : ClassFieldTheory.FiniteAbelianLocalExtension K) : + letI : Small.{0} K := nonarchimedeanLocalField_small K + ClassFieldTheory.FiniteAbelianLocalExtension (Shrink.{0} K) := by + let : Small.{0} K := nonarchimedeanLocalField_small K + let : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + let M := shrinkIntermediateField K E.1 + let c := shrinkSeparableClosureEquiv K + let : FiniteDimensional (Shrink.{0} K) M := + shrinkIntermediateField_finiteDimensional K E + let : IsAbelianGalois (Shrink.{0} K) M := + shrinkIntermediateField_isAbelianGalois K E + exact ⟨M.map c.symm.toAlgHom, + ClassFieldTheory.finiteDimensional_intermediateField_map_algEquiv c.symm M, + ClassFieldTheory.isAbelianGalois_intermediateField_map_algEquiv c.symm M⟩ + +/-- Undo the chosen-closure and small-base transports. -/ +def unshrinkChosenFiniteAbelianField : + letI : Small.{0} K := nonarchimedeanLocalField_small K + ClassFieldTheory.FiniteAbelianLocalExtension (Shrink.{0} K) → + ClassFieldTheory.FiniteAbelianLocalExtension K := by + let : Small.{0} K := nonarchimedeanLocalField_small K + let : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + intro F + let c := shrinkSeparableClosureEquiv K + let M := F.1.map c.toAlgHom + let : FiniteDimensional (Shrink.{0} K) F.1 := F.2.1 + let : IsAbelianGalois (Shrink.{0} K) F.1 := F.2.2 + let : FiniteDimensional (Shrink.{0} K) M := + ClassFieldTheory.finiteDimensional_intermediateField_map_algEquiv c F.1 + let : IsAbelianGalois (Shrink.{0} K) M := + ClassFieldTheory.isAbelianGalois_intermediateField_map_algEquiv c F.1 + exact ⟨unshrinkIntermediateField K M, + unshrinkIntermediateField_finiteDimensional K M inferInstance, + unshrinkIntermediateField_isAbelianGalois K M inferInstance⟩ + +/-- The finite abelian fields in both chosen separable closures are +order-isomorphic. -/ +def shrinkChosenFiniteAbelianOrderIso : + letI : Small.{0} K := nonarchimedeanLocalField_small K + ClassFieldTheory.FiniteAbelianLocalExtension K ≃o + ClassFieldTheory.FiniteAbelianLocalExtension (Shrink.{0} K) := by + let : Small.{0} K := nonarchimedeanLocalField_small K + exact { + toEquiv := { + toFun := shrinkChosenFiniteAbelianField K + invFun := unshrinkChosenFiniteAbelianField K + left_inv := by + intro E + apply Subtype.ext + exact (shrinkChosenIntermediateFieldOrderIso K).symm_apply_apply E.1 + right_inv := by + intro E + apply Subtype.ext + exact (shrinkChosenIntermediateFieldOrderIso K).apply_symm_apply E.1 + } + map_rel_iff' := by + intro E F + exact (shrinkChosenIntermediateFieldOrderIso K).le_iff_le + } + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianNorms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianNorms.lean new file mode 100644 index 0000000000..9d68cd14ba --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianNorms.lean @@ -0,0 +1,69 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianNorms +/-! +# Actual norm subgroups in the chosen small-base separable closure + +The finite-abelian-field order equivalence carries the actual field-norm +subgroup, not merely an abstract subgroup assigned by a classification. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalFieldTheory + +universe u + +variable (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The two-step finite-field transport preserves the actual field-norm +subgroup after identifying the multiplicative groups of `K` and `Shrink K`. -/ +theorem shrinkChosenFiniteAbelian_normSubgroup_map + (E : ClassFieldTheory.FiniteAbelianLocalExtension K) : + letI : Small.{0} K := nonarchimedeanLocalField_small K + (E.normSubgroup).map + (Units.mapEquiv (Shrink.ringEquiv K).symm.toMulEquiv).toMonoidHom = + (shrinkChosenFiniteAbelianField K E).normSubgroup := by + let : Small.{0} K := nonarchimedeanLocalField_small K + let : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + let M := shrinkIntermediateField K E.1 + let c := shrinkSeparableClosureEquiv K + let : FiniteDimensional (Shrink.{0} K) M := + shrinkIntermediateField_finiteDimensional K E + let : FiniteDimensional (Shrink.{0} K) (M.map c.symm.toAlgHom) := + ClassFieldTheory.finiteDimensional_intermediateField_map_algEquiv c.symm M + change (ClassFieldTheory.fieldNormSubgroup K E.1).map + (Units.mapEquiv (Shrink.ringEquiv K).symm.toMulEquiv).toMonoidHom = + ClassFieldTheory.fieldNormSubgroup (Shrink.{0} K) + (M.map c.symm.toAlgHom) + calc + _ = ClassFieldTheory.fieldNormSubgroup (Shrink.{0} K) M := + shrinkIntermediateField_normSubgroup_map K E + _ = ClassFieldTheory.fieldNormSubgroup (Shrink.{0} K) + (M.map c.symm.toAlgHom) := by + have h := ClassFieldTheory.fieldNormSubgroup_map_ringEquiv + (RingEquiv.refl (Shrink.{0} K)) + (IntermediateField.intermediateFieldMap c.symm M).toRingEquiv + (ClassFieldTheory.intermediateFieldMap_commutes c.symm M) + have hmapid : + (Units.mapEquiv + (RingEquiv.refl (Shrink.{0} K)).toMulEquiv).toMonoidHom = + MonoidHom.id (Shrink.{0} K)ˣ := by + ext x + rfl + rw [hmapid, Subgroup.map_id] at h + exact h + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianFields.lean new file mode 100644 index 0000000000..12ad783b73 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianFields.lean @@ -0,0 +1,107 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkIntermediateFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.AbelianGaloisEquiv +/-! +# Finite abelian intermediate fields under a small change of base + +The intermediate field itself is unchanged as a subfield of the original +separable closure. Its finite-dimensional and abelian Galois properties are +transported along the base-field equivalence. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalFieldTheory + +universe u + +variable (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The same underlying intermediate field, now considered over `Shrink K`. -/ +def shrinkIntermediateFieldRingEquiv + (E : IntermediateField K (SeparableClosure K)) : + letI : Small.{0} K := nonarchimedeanLocalField_small K + letI : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + E ≃+* shrinkIntermediateField K E := by + let : Small.{0} K := nonarchimedeanLocalField_small K + let : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + exact RingEquiv.refl E + +/-- The base-field and intermediate-field equivalences commute with their +algebra embeddings. -/ +theorem shrinkIntermediateFieldRingEquiv_commutes + (E : IntermediateField K (SeparableClosure K)) : + letI : Small.{0} K := nonarchimedeanLocalField_small K + letI : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + (algebraMap (Shrink.{0} K) (shrinkIntermediateField K E)).comp + (Shrink.ringEquiv K).symm.toRingHom = + (shrinkIntermediateFieldRingEquiv K E).toRingHom.comp + (algebraMap K E) := by + let : Small.{0} K := nonarchimedeanLocalField_small K + let : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + ext x + have hAlg (a : Shrink.{0} K) : + algebraMap (Shrink.{0} K) (SeparableClosure K) a = + algebraMap K (SeparableClosure K) (Shrink.ringEquiv K a) := by + rfl + have hbase : + algebraMap (Shrink.{0} K) (SeparableClosure K) + ((Shrink.ringEquiv K).symm x) = + algebraMap K (SeparableClosure K) x := by + rw [hAlg] + simp + have hfield : + algebraMap K (SeparableClosure K) x = + ((algebraMap K E x : E) : SeparableClosure K) := + (IntermediateField.coe_algebraMap_apply E x).symm + exact congrArg (fun y : SeparableClosure K => (y : AlgebraicClosure K)) + (hbase.trans hfield) + +/-- Finite-dimensionality is invariant under the base-field equivalence. -/ +theorem shrinkIntermediateField_finiteDimensional + (E : ClassFieldTheory.FiniteAbelianLocalExtension K) : + letI : Small.{0} K := nonarchimedeanLocalField_small K + letI : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + FiniteDimensional (Shrink.{0} K) (shrinkIntermediateField K E.1) := by + let : Small.{0} K := nonarchimedeanLocalField_small K + let : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + let : FiniteDimensional K E.1 := E.2.1 + exact Module.Finite.of_equiv_equiv + (Shrink.ringEquiv K).symm (shrinkIntermediateFieldRingEquiv K E.1) + (shrinkIntermediateFieldRingEquiv_commutes K E.1) + +/-- The abelian Galois property is invariant under the base-field +equivalence. -/ +theorem shrinkIntermediateField_isAbelianGalois + (E : ClassFieldTheory.FiniteAbelianLocalExtension K) : + letI : Small.{0} K := nonarchimedeanLocalField_small K + letI : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + IsAbelianGalois (Shrink.{0} K) (shrinkIntermediateField K E.1) := by + let : Small.{0} K := nonarchimedeanLocalField_small K + let : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + let : IsAbelianGalois K E.1 := E.2.2 + exact ClassFieldTheory.isAbelianGalois_of_equiv_equiv + (Shrink.ringEquiv K).symm (shrinkIntermediateFieldRingEquiv K E.1) + (shrinkIntermediateFieldRingEquiv_commutes K E.1) + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianNorms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianNorms.lean new file mode 100644 index 0000000000..6560a160e4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianNorms.lean @@ -0,0 +1,57 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupRingEquiv +/-! +# Norm subgroups under a small change of local base field + +The field norm from an intermediate field is unchanged after re-expressing +that intermediate field over the equivalent small base field. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalFieldTheory + +universe u + +variable (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The norm subgroup attached to an intermediate field is carried to the +norm subgroup of the same field viewed over `Shrink K`. -/ +theorem shrinkIntermediateField_normSubgroup_map + (E : ClassFieldTheory.FiniteAbelianLocalExtension K) : + letI : Small.{0} K := nonarchimedeanLocalField_small K + letI : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + letI : FiniteDimensional (Shrink.{0} K) (shrinkIntermediateField K E.1) := + shrinkIntermediateField_finiteDimensional K E + (E.normSubgroup).map + (Units.mapEquiv (Shrink.ringEquiv K).symm.toMulEquiv).toMonoidHom = + ClassFieldTheory.fieldNormSubgroup (Shrink.{0} K) + (shrinkIntermediateField K E.1) := by + let : Small.{0} K := nonarchimedeanLocalField_small K + let : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + let : FiniteDimensional (Shrink.{0} K) (shrinkIntermediateField K E.1) := + shrinkIntermediateField_finiteDimensional K E + change (ClassFieldTheory.fieldNormSubgroup K E.1).map + (Units.mapEquiv (Shrink.ringEquiv K).symm.toMulEquiv).toMonoidHom = + ClassFieldTheory.fieldNormSubgroup (Shrink.{0} K) + (shrinkIntermediateField K E.1) + exact ClassFieldTheory.fieldNormSubgroup_map_ringEquiv + (Shrink.ringEquiv K).symm + (shrinkIntermediateFieldRingEquiv K E.1) + (shrinkIntermediateFieldRingEquiv_commutes K E.1) + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkIntermediateFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkIntermediateFields.lean new file mode 100644 index 0000000000..4df5cec6ac --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkIntermediateFields.lean @@ -0,0 +1,109 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkSeparableClosure +public import Mathlib.FieldTheory.IntermediateField.Basic +/-! +# Intermediate fields under a small change of base field + +The base-field equivalence `Shrink K ≃+* K` does not change the subfields of +the original separable closure. This file records that fact as an order +isomorphism, with the actual underlying subfields unchanged. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalFieldTheory + +universe u + +variable (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- An intermediate field of the original separable closure, viewed over +the small representative of the base field. -/ +def shrinkIntermediateField + (E : IntermediateField K (SeparableClosure K)) : + letI : Small.{0} K := nonarchimedeanLocalField_small K + letI : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + IntermediateField (Shrink.{0} K) (SeparableClosure K) := by + let : Small.{0} K := nonarchimedeanLocalField_small K + let : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + refine E.toSubfield.toIntermediateField ?_ + intro x + change (algebraMap K (SeparableClosure K)) (Shrink.ringEquiv K x) ∈ E + exact E.algebraMap_mem _ + +/-- Undo the base-field change on an intermediate field. -/ +def unshrinkIntermediateField : + letI : Small.{0} K := nonarchimedeanLocalField_small K + letI : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + IntermediateField (Shrink.{0} K) (SeparableClosure K) → + IntermediateField K (SeparableClosure K) := by + let : Small.{0} K := nonarchimedeanLocalField_small K + let : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + intro F + refine F.toSubfield.toIntermediateField ?_ + intro x + have hx := F.algebraMap_mem ((Shrink.ringEquiv K).symm x) + change (algebraMap K (SeparableClosure K)) + (Shrink.ringEquiv K ((Shrink.ringEquiv K).symm x)) ∈ F at hx + simpa using hx + +/-- Re-expressing an original intermediate field over `Shrink K` and back +returns the same field. -/ +theorem unshrink_shrinkIntermediateField + (E : IntermediateField K (SeparableClosure K)) : + unshrinkIntermediateField K (shrinkIntermediateField K E) = E := by + apply SetLike.coe_injective + rfl + +/-- Re-expressing a small-base intermediate field over `K` and back returns +the same field. -/ +theorem shrink_unshrinkIntermediateField : + letI : Small.{0} K := nonarchimedeanLocalField_small K + letI : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + ∀ F : IntermediateField (Shrink.{0} K) (SeparableClosure K), + shrinkIntermediateField K (unshrinkIntermediateField K F) = F := by + let : Small.{0} K := nonarchimedeanLocalField_small K + let : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + intro F + apply SetLike.coe_injective + rfl + +/-- Intermediate fields of the two equivalent base-field presentations are +order-isomorphic. -/ +def shrinkIntermediateFieldOrderIso : + letI : Small.{0} K := nonarchimedeanLocalField_small K + letI : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + IntermediateField K (SeparableClosure K) ≃o + IntermediateField (Shrink.{0} K) (SeparableClosure K) := by + let : Small.{0} K := nonarchimedeanLocalField_small K + let : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + exact { + toEquiv := { + toFun := shrinkIntermediateField K + invFun := unshrinkIntermediateField K + left_inv := unshrink_shrinkIntermediateField K + right_inv := shrink_unshrinkIntermediateField K + } + map_rel_iff' := by intro E F; rfl + } + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkLocalClassification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkLocalClassification.lean new file mode 100644 index 0000000000..2b263910cb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkLocalClassification.lean @@ -0,0 +1,75 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MathlibFieldClassification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianNorms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkOpenSubgroups +/-! +# Finite abelian local classification in arbitrary universes + +The concrete classification for a small local field transfers to an arbitrary +nonarchimedean local field. The transfer respects the actual field-norm subgroup. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalFieldTheory + +universe u + +variable (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The finite abelian classification after moving through the small +representative of `K`. -/ +def shrinkFiniteAbelianFieldNormSubgroupOrderIso : + ClassFieldTheory.FiniteAbelianLocalExtension K ≃o + (ClassFieldTheory.OpenFiniteIndexSubgroup K)ᵒᵈ := by + letI : Small.{0} K := nonarchimedeanLocalField_small K + letI : ValuativeRel (Shrink.{0} K) := shrinkLocalFieldValuativeRel K + letI : IsNonarchimedeanLocalField (Shrink.{0} K) := + shrinkLocalField_isNonarchimedeanLocalField K + exact (shrinkChosenFiniteAbelianOrderIso K).trans + ((LocalClassFieldTheory.finiteAbelianFieldNormSubgroupOrderIso (Shrink.{0} K)).trans + (shrinkOpenFiniteIndexOrderIso K).dual) + +/-- The transported order equivalence sends a finite abelian field to its +actual field-norm subgroup. -/ +theorem shrinkFiniteAbelianFieldNormSubgroupOrderIso_apply + (E : ClassFieldTheory.FiniteAbelianLocalExtension K) : + (OrderDual.ofDual (shrinkFiniteAbelianFieldNormSubgroupOrderIso K E)).1 = + E.normSubgroup := by + let : Small.{0} K := nonarchimedeanLocalField_small K + let : ValuativeRel (Shrink.{0} K) := shrinkLocalFieldValuativeRel K + let : IsNonarchimedeanLocalField (Shrink.{0} K) := + shrinkLocalField_isNonarchimedeanLocalField K + let F := shrinkChosenFiniteAbelianField K E + have hsmall := LocalClassFieldTheory.finiteAbelianFieldNormSubgroupOrderIso_apply + (Shrink.{0} K) F + have hnorm := shrinkChosenFiniteAbelian_normSubgroup_map K E + have heq : + (Units.mapEquiv (Shrink.ringEquiv K).symm.toMulEquiv).toMonoidHom = + (shrinkUnitsContinuousMulEquiv K).symm.toMulEquiv.toMonoidHom := by + ext x + rfl + rw [heq] at hnorm + change ((OrderDual.ofDual + (LocalClassFieldTheory.finiteAbelianFieldNormSubgroupOrderIso + (Shrink.{0} K) F)).1.map + (shrinkUnitsContinuousMulEquiv K).toMulEquiv.toMonoidHom) = E.normSubgroup + rw [hsmall] + change (F.normSubgroup.map + (shrinkUnitsContinuousMulEquiv K).toMulEquiv.toMonoidHom) = E.normSubgroup + rw [← hnorm] + exact (shrinkUnitsContinuousMulEquiv K).toMulEquiv.mapSubgroup.apply_symm_apply + E.normSubgroup + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkOpenSubgroups.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkOpenSubgroups.lean new file mode 100644 index 0000000000..99d48b5b6c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkOpenSubgroups.lean @@ -0,0 +1,82 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ShrinkTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.OpenFiniteIndexSubgroup +public import Mathlib.Topology.Algebra.Group.Units +/-! +# Open finite-index subgroups under a small field equivalence + +The topological field equivalence between `K` and its small representative +induces an order equivalence between their open finite-index subgroups of +units. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalFieldTheory + +universe u + +variable (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The multiplicative groups of a local field and its small representative +are topologically isomorphic. -/ +def shrinkUnitsContinuousMulEquiv : + letI : Small.{0} K := nonarchimedeanLocalField_small K + (Shrink.{0} K)ˣ ≃ₜ* Kˣ := by + let : Small.{0} K := nonarchimedeanLocalField_small K + let h : Shrink.{0} K ≃ₜ K := (Shrink.homeomorph K).symm + exact Units.mapContinuousMulEquiv { + toMulEquiv := (Shrink.ringEquiv K).toMulEquiv + continuous_toFun := h.continuous + continuous_invFun := h.symm.continuous + } + +/-- Open finite-index subgroups correspond along the topological group +equivalence of unit groups. -/ +def shrinkOpenFiniteIndexOrderIso : + letI : Small.{0} K := nonarchimedeanLocalField_small K + ClassFieldTheory.OpenFiniteIndexSubgroup (Shrink.{0} K) ≃o + ClassFieldTheory.OpenFiniteIndexSubgroup K := by + let : Small.{0} K := nonarchimedeanLocalField_small K + let e := shrinkUnitsContinuousMulEquiv K + exact { + toEquiv := { + toFun := fun H => ⟨H.1.map e.toMulEquiv.toMonoidHom, by + change IsOpen (e '' (H.1 : Set (Shrink.{0} K)ˣ)) + exact e.toHomeomorph.isOpenMap _ H.2.1, by + let : H.1.FiniteIndex := H.2.2 + exact Subgroup.FiniteIndex.map_of_surjective H.1 e.surjective⟩ + invFun := fun H => ⟨H.1.map e.symm.toMulEquiv.toMonoidHom, by + change IsOpen (e.symm '' (H.1 : Set Kˣ)) + exact e.symm.toHomeomorph.isOpenMap _ H.2.1, by + let : H.1.FiniteIndex := H.2.2 + exact Subgroup.FiniteIndex.map_of_surjective H.1 e.symm.surjective⟩ + left_inv := by + intro H + apply Subtype.ext + exact (e.toMulEquiv.mapSubgroup).symm_apply_apply H.1 + right_inv := by + intro H + apply Subtype.ext + exact (e.toMulEquiv.mapSubgroup).apply_symm_apply H.1 + } + map_rel_iff' := by + intro H J + change e '' (H.1 : Set (Shrink.{0} K)ˣ) ⊆ + e '' (J.1 : Set (Shrink.{0} K)ˣ) ↔ + (H.1 : Set (Shrink.{0} K)ˣ) ⊆ J.1 + exact Set.image_subset_image_iff e.injective + } + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkSeparableClosure.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkSeparableClosure.lean new file mode 100644 index 0000000000..b50c10539e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkSeparableClosure.lean @@ -0,0 +1,83 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ShrinkTransport +public import Mathlib.FieldTheory.IsSepClosed +/-! +# Separable closures over the small local-field representative + +The existing separable closure of `K` is also a separable closure of +`Shrink.{0} K` after transporting the base-field embedding. This gives a +compatible equivalence with Mathlib's chosen separable closure of `Shrink K`. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalFieldTheory + +universe u + +variable (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The original separable closure, regarded as an extension of the small +representative of its base field. -/ +@[reducible] +noncomputable def shrinkSeparableClosureAlgebra : + letI : Small.{0} K := nonarchimedeanLocalField_small K + Algebra (Shrink.{0} K) (SeparableClosure K) := by + letI : Small.{0} K := nonarchimedeanLocalField_small K + exact ((algebraMap K (SeparableClosure K)).comp + (Shrink.ringEquiv K).toRingHom).toAlgebra + +/-- `SeparableClosure K` remains a separable closure after changing the base +field to its small representative. -/ +theorem shrinkSeparableClosure_isSepClosure : + letI : Small.{0} K := nonarchimedeanLocalField_small K + letI : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + IsSepClosure (Shrink.{0} K) (SeparableClosure K) := by + let : Small.{0} K := nonarchimedeanLocalField_small K + let : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + have hAlg (a : Shrink.{0} K) : + algebraMap (Shrink.{0} K) (SeparableClosure K) a = + algebraMap K (SeparableClosure K) (Shrink.ringEquiv K a) := by + rfl + have hcomp : + (algebraMap (Shrink.{0} K) (SeparableClosure K)).comp + (Shrink.ringEquiv K).symm.toRingHom = + (RingEquiv.refl (SeparableClosure K)).toRingHom.comp + (algebraMap K (SeparableClosure K)) := by + ext x + simp [hAlg] + exact ⟨IsSepClosure.sep_closed K, + Algebra.IsSeparable.of_equiv_equiv + (Shrink.ringEquiv K).symm + (RingEquiv.refl (SeparableClosure K)) hcomp⟩ + +/-- An equivalence between the chosen separable closure of the small base and +the original chosen separable closure, both viewed over the small base. -/ +noncomputable def shrinkSeparableClosureEquiv : + letI : Small.{0} K := nonarchimedeanLocalField_small K + letI : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + SeparableClosure (Shrink.{0} K) ≃ₐ[Shrink.{0} K] + SeparableClosure K := by + letI : Small.{0} K := nonarchimedeanLocalField_small K + letI : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + letI : IsSepClosure (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosure_isSepClosure K + exact IsSepClosure.equiv (Shrink.{0} K) + (SeparableClosure (Shrink.{0} K)) (SeparableClosure K) + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardDominatingExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardDominatingExtension.lean new file mode 100644 index 0000000000..673b83b19b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardDominatingExtension.lean @@ -0,0 +1,90 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardLubinTate +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +/-! +# Characteristic-independent dominating standard extensions + +Every finite abelian local extension embeds into the fixed field represented +by a compositum of a canonical unramified factor and a canonical standard +Lubin--Tate factor. Reverse inclusion of norm subgroups supplies the +embedding. +-/ + +@[expose] public section + +noncomputable +section + +open scoped ValuativeRel + +namespace LocalClassFieldTheory + +open ClassFormation CyclicCohomology +open LocalClassFieldTheory +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +/-- Source-producing form retaining the unramified degree, positive +principal-unit level, and the named characteristic-independent standard +compositum. -/ +theorem exists_finiteAbelianDominatingStandardLubinTateCompositum + (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [IsAbelianGalois K L] : + ∃ (d n : ℕ) (hd : 0 < d) (_hn : 0 < n), + Nonempty + (L →ₐ[K] + abstractFixedField K (SeparableClosure K) + (standardLubinTateFiniteAbelianCompositum K d n hd).field) := by + let ϖ := inverseIntegerRingUniformizerFieldUnit K + obtain ⟨d, n, hd, hn, hstandard⟩ := + exists_uniformizerPrincipalSubgroup_le_normSubgroup K L ϖ + let P := standardLubinTateFiniteAbelianCompositum K d n hd + have hP : + finiteAbelianNormSubgroup K P ≤ localNormSubgroup K L := by + simpa [P, ϖ] using + (standardLubinTateFiniteAbelianCompositum_nativeNormSubgroup_le + K (localNormSubgroup K L) d n hd hn hstandard) + refine ⟨d, n, hd, hn, ?_⟩ + let E := abstractFixedField K (SeparableClosure K) P.field + let : Finite + ((baseField (intrinsicAbsoluteGalois K)).toSubgroup ⧸ + extensionSubgroup + (baseField (intrinsicAbsoluteGalois K)) P.field + (le_baseField P.field)) := + finiteAbelianSubextension_finite_over_absoluteBase K P + let : FiniteDimensional K E := + abstractFixedField_finiteDimensional + K (SeparableClosure K) P.field inferInstance + let : IsAbelianGalois K E := + finiteAbelianSubextension_fixedField_isAbelianGalois K P + apply nonempty_algHom_of_normSubgroup_le K L E + simpa [E, P, finiteAbelianNormSubgroup] using hP + +/-- Every finite abelian local extension embeds in a represented finite +abelian fixed field obtained from the standard unramified/Lubin--Tate +construction. -/ +theorem exists_finiteAbelianDominatingStandardFixedField + (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [IsAbelianGalois K L] : + ∃ P : FiniteAbelianSubextension (intrinsicAbstractBase K), + Nonempty + (L →ₐ[K] + abstractFixedField K (SeparableClosure K) P.field) := by + obtain ⟨d, n, hd, _hn, hEmbed⟩ := + exists_finiteAbelianDominatingStandardLubinTateCompositum K L + exact + ⟨standardLubinTateFiniteAbelianCompositum K d n hd, hEmbed⟩ + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardLubinTate.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardLubinTate.lean new file mode 100644 index 0000000000..42aee6ba8a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardLubinTate.lean @@ -0,0 +1,195 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardSubgroupIntersection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormSubgroupExact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm +/-! +# Standard Lubin--Tate factors for finite local existence + +The canonical standard Lubin--Tate level is already an intermediate field +of the fixed separable closure. This module retains it as a named finite +abelian subextension, identifies its represented fixed field and norm +subgroup, and combines it with the canonical unramified factor. + +Unlike the earlier transported Laurent-series construction, this source is +characteristic-independent. +-/ + +@[expose] public section + +noncomputable +section + +open scoped ValuativeRel + +namespace LocalClassFieldTheory + +open ClassFormation +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField +open LubinTate + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- Canonical standard Lubin--Tate level `m`, retained as a finite abelian +subextension of the fixed local separable closure. -/ +noncomputable def standardLubinTateFiniteAbelianSubextension + (m : ℕ) : + FiniteAbelianSubextension (intrinsicAbstractBase K) := by + let hπ := standardLocalFieldUniformizer_isUniformizer K + let E := standardLubinTateLevelField hπ m + letI : FiniteDimensional K E := + standardLubinTateLevelField_finiteDimensional hπ m + letI : IsAbelianGalois K E := + standardLubinTateLevelField_isAbelianGalois + (standardLocalField K) hπ m + exact + finiteAbelianAbstractExtensionOfEmbedding K E E.val + +/-- The concrete standard level is base-linearly equivalent to the fixed +field represented by its named finite abelian subextension. -/ +noncomputable def standardLubinTateFiniteAbelianSubextensionFixedFieldEquiv + (m : ℕ) : + let hπ := standardLocalFieldUniformizer_isUniformizer K + let E := standardLubinTateLevelField hπ m + E ≃ₐ[K] + abstractFixedField K (SeparableClosure K) + (standardLubinTateFiniteAbelianSubextension K m).field := by + let hπ := standardLocalFieldUniformizer_isUniformizer K + let E := standardLubinTateLevelField hπ m + letI : FiniteDimensional K E := + standardLubinTateLevelField_finiteDimensional hπ m + letI : IsAbelianGalois K E := + standardLubinTateLevelField_isAbelianGalois + (standardLocalField K) hπ m + let i : E →ₐ[K] SeparableClosure K := E.val + let T := standardLubinTateFiniteAbelianSubextension K m + have hfixed : + abstractFixedField K (SeparableClosure K) T.field = + finiteGaloisFieldRangeOfEmbedding K E i := by + change + IntermediateField.fixedField + (finiteGaloisFieldRangeOfEmbedding K E i).fixingSubgroup = + finiteGaloisFieldRangeOfEmbedding K E i + exact + InfiniteGalois.fixedField_fixingSubgroup + (finiteGaloisFieldRangeOfEmbedding K E i) + rw [hfixed] + exact finiteGaloisFieldRangeEquivOfEmbedding K E i + +/-- The named standard level has exactly the canonical normalized +uniformizer/principal-unit norm subgroup. -/ +theorem + standardLubinTateFiniteAbelianSubextension_normSubgroup_map_eq + (m : ℕ) : + let T := standardLubinTateFiniteAbelianSubextension K m + (T.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom = + (LocalFieldTheory.uniformizerPrincipalSubgroup K + (inverseIntegerRingUniformizerFieldUnit K) 1 (m + 1)).toAddSubgroup := by + let hπ := standardLocalFieldUniformizer_isUniformizer K + let E := standardLubinTateLevelField hπ m + let : FiniteDimensional K E := + standardLubinTateLevelField_finiteDimensional hπ m + let : IsAbelianGalois K E := + standardLubinTateLevelField_isAbelianGalois + (standardLocalField K) hπ m + let i : E →ₐ[K] SeparableClosure K := E.val + let T := standardLubinTateFiniteAbelianSubextension K m + calc + (T.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom = + CyclicCohomology.additiveNormSubgroup K E := by + simpa [T, standardLubinTateFiniteAbelianSubextension, i, E, hπ] using + map_finiteAbelianAbstractExtension_normSubgroup_eq K E i + _ = + (LocalFieldTheory.uniformizerPrincipalSubgroup K + (inverseIntegerRingUniformizerFieldUnit K) + 1 (m + 1)).toAddSubgroup := by + simpa [CyclicCohomology.additiveNormSubgroup, E, hπ, + standardLubinTateNormSubgroup] using + congrArg Subgroup.toAddSubgroup + (standardLubinTateCanonicalNormSubgroup_eq_normalizedUniformizerPrincipalSubgroup + K m) + +/-- The characteristic-independent standard finite abelian compositum: +the canonical unramified degree-`d` factor together with standard +Lubin--Tate level `n - 1`. -/ +noncomputable def standardLubinTateFiniteAbelianCompositum + (d n : ℕ) (hd : 0 < d) : + FiniteAbelianSubextension (intrinsicAbstractBase K) := + (localFiniteUnramifiedAbelianSubextension K d hd).compositum + (standardLubinTateFiniteAbelianSubextension K (n - 1)) + +/-- The fixed field represented by the standard compositum is the +compositum of its unramified and Lubin--Tate fixed fields. -/ +theorem standardLubinTateFiniteAbelianCompositum_fixedField_eq_sup + (d n : ℕ) (hd : 0 < d) : + abstractFixedField K (SeparableClosure K) + (standardLubinTateFiniteAbelianCompositum K d n hd).field = + abstractFixedField K (SeparableClosure K) + (localFiniteUnramifiedAbelianSubextension K d hd).field ⊔ + abstractFixedField K (SeparableClosure K) + (standardLubinTateFiniteAbelianSubextension K (n - 1)).field := by + simpa [standardLubinTateFiniteAbelianCompositum] using + (finiteAbelianSubextension_compositum_fixedField K + (localFiniteUnramifiedAbelianSubextension K d hd) + (standardLubinTateFiniteAbelianSubextension K (n - 1))) + +/-- If an overgroup contains the canonical standard subgroup +`⟨ϖ^d⟩ U_K^n`, the ordinary norm subgroup of the standard unramified / +Lubin--Tate compositum is contained in that overgroup. -/ +theorem standardLubinTateFiniteAbelianCompositum_nativeNormSubgroup_le + (H : Subgroup Kˣ) (d n : ℕ) + (hd : 0 < d) (hn : 0 < n) + (hstandard : + LocalFieldTheory.uniformizerPrincipalSubgroup K + (inverseIntegerRingUniformizerFieldUnit K) d n ≤ + H) : + finiteAbelianNormSubgroup K + (standardLubinTateFiniteAbelianCompositum K d n hd) ≤ + H := by + let ϖ := inverseIntegerRingUniformizerFieldUnit K + let U := localFiniteUnramifiedAbelianSubextension K d hd + let T := standardLubinTateFiniteAbelianSubextension K (n - 1) + have hϖ : valuationMap K (Additive.ofMul ϖ) = 1 := by + rw [valuationMap_apply] + simpa only [ϖ] using v_inverseIntegerRingUniformizerFieldUnit K + have hUle : + (U.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom ≤ + (unramifiedNormSubgroup K d).toAddSubgroup := by + simpa only [U] using + localFiniteUnramifiedAbelianSubextension_normSubgroup_map_le + K d hd + have hTle : + (T.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom ≤ + (LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ 1 n).toAddSubgroup := by + have hT := + standardLubinTateFiniteAbelianSubextension_normSubgroup_map_eq + K (n - 1) + simpa only [T, ϖ, Nat.sub_add_cancel hn] using hT.le + have hP : + (U.compositum T).normSubgroup (intrinsicAbsoluteUnits K) ≤ + H.toAddSubgroup.map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).toAddMonoidHom := + finiteAbelianCompositum_normSubgroup_le_of_standard + K H ϖ d n hϖ hstandard U T hUle hTle + simpa [standardLubinTateFiniteAbelianCompositum, U, T] using + (finiteAbelianNormSubgroup_le_of_abstractNormSubgroup_le_map + K (U.compositum T) H hP) + +end LocalClassFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardSubgroupIntersection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardSubgroupIntersection.lean new file mode 100644 index 0000000000..3d1bf29b57 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardSubgroupIntersection.lean @@ -0,0 +1,181 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm +/-! +# Intersecting standard norm conditions + +The unramified degree-`d` factor forces the normalized valuation to be +divisible by `d`. The totally ramified Lubin--Tate factor forces an element +to lie in `⟨ϖ⟩ U^n`. Their intersection therefore lies in `⟨ϖ^d⟩ U^n`. +This is the elementary subgroup calculation used in local existence proofs. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open scoped ValuativeRel +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +universe u + +/-- The intersection of the unramified valuation condition and the +principal-unit condition is contained in the corresponding standard subgroup. -/ +theorem unramifiedNormSubgroup_inf_uniformizerPrincipalSubgroup_le + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (ϖ : Kˣ) (d n : ℕ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : + unramifiedNormSubgroup K d ⊓ + LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ 1 n ≤ + LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ d n := by + intro x hx + rcases Subgroup.mem_sup.mp hx.2 with ⟨y, hy, z, hz, hyz⟩ + rcases Subgroup.mem_zpowers_iff.mp hy with ⟨k, hky⟩ + have hky' : ϖ ^ k = y := by + simpa using hky + change z ∈ (principalUnits K n).map + (integerUnitsToFieldUnits K) at hz + rcases hz with ⟨u, hu, huz⟩ + have hvz : valuationMap K (Additive.ofMul z) = 0 := by + rw [← huz] + exact v_integerUnitsToFieldUnits K u + have hvx : valuationMap K (Additive.ofMul x) = k := by + calc + valuationMap K (Additive.ofMul x) = + valuationMap K (Additive.ofMul (y * z)) := + congrArg _ hyz.symm + _ = valuationMap K (Additive.ofMul y) + + valuationMap K (Additive.ofMul z) := + valuationMap_ofMul_mul K y z + _ = valuationMap K (Additive.ofMul (ϖ ^ k)) + 0 := by + rw [hky', hvz] + _ = k * 1 + 0 := by + rw [valuationMap_ofMul_zpow, hϖ] + _ = k := by ring + have hdk : (d : ℤ) ∣ k := by + rw [← hvx] + exact (mem_unramifiedNormSubgroup_iff K d x).1 hx.1 + obtain ⟨t, ht⟩ := hdk + have hyTarget : y ∈ Subgroup.zpowers (ϖ ^ d) := by + rw [← hky', Subgroup.mem_zpowers_iff] + refine ⟨t, ?_⟩ + calc + (ϖ ^ d) ^ t = (ϖ ^ (d : ℤ)) ^ t := by + rw [zpow_natCast] + _ = ϖ ^ ((d : ℤ) * t) := by + rw [zpow_mul] + _ = ϖ ^ k := by rw [← ht] + exact Subgroup.mem_sup.mpr + ⟨y, hyTarget, z, ⟨u, hu, huz⟩, hyz⟩ + +/-- If an unramified norm condition and a principal-unit norm condition are +realized by finite Galois subextensions, their compositum has norm subgroup +contained in every subgroup containing the corresponding standard subgroup. -/ +theorem finiteGaloisCompositum_normSubgroup_le_of_standard + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : Subgroup Kˣ) + (ϖ : Kˣ) (d n : ℕ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (hstandard : LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ d n ≤ H) + (U T : ClassFormation.FiniteGaloisSubextension (intrinsicAbstractBase K)) + (hUle : + (U.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom ≤ + (unramifiedNormSubgroup K d).toAddSubgroup) + (hTle : + (T.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom ≤ + (LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ 1 n).toAddSubgroup) : + (U.compositum T).normSubgroup (intrinsicAbsoluteUnits K) ≤ + H.toAddSubgroup.map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).toAddMonoidHom := by + let A := intrinsicAbsoluteUnits K + let e := baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + intro x hx + have hxU : x ∈ U.normSubgroup A := + U.normSubgroup_compositum_le_left A T hx + have hxT : x ∈ T.normSubgroup A := + U.normSubgroup_compositum_le_right A T hx + have hxUnramAdd : e.symm x ∈ + (unramifiedNormSubgroup K d).toAddSubgroup := + hUle ⟨x, hxU, rfl⟩ + have hxPrincipalAdd : e.symm x ∈ + (LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ 1 n).toAddSubgroup := + hTle ⟨x, hxT, rfl⟩ + have hxUnram : Additive.toMul (e.symm x) ∈ + unramifiedNormSubgroup K d := hxUnramAdd + have hxPrincipal : Additive.toMul (e.symm x) ∈ + LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ 1 n := hxPrincipalAdd + have hxStandard : Additive.toMul (e.symm x) ∈ + LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ d n := + unramifiedNormSubgroup_inf_uniformizerPrincipalSubgroup_le + K ϖ d n hϖ ⟨hxUnram, hxPrincipal⟩ + have hxH : e.symm x ∈ H.toAddSubgroup := by + change Additive.toMul (e.symm x) ∈ H + exact hstandard hxStandard + exact ⟨e.symm x, hxH, e.apply_symm_apply x⟩ + +/-- The same standard-subgroup containment while retaining both inputs and +their compositum as finite abelian subextensions. -/ +theorem finiteAbelianCompositum_normSubgroup_le_of_standard + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : Subgroup Kˣ) + (ϖ : Kˣ) (d n : ℕ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (hstandard : LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ d n ≤ H) + (U T : ClassFormation.FiniteAbelianSubextension + (intrinsicAbstractBase K)) + (hUle : + (U.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom ≤ + (unramifiedNormSubgroup K d).toAddSubgroup) + (hTle : + (T.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom ≤ + (LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ 1 n).toAddSubgroup) : + (U.compositum T).normSubgroup (intrinsicAbsoluteUnits K) ≤ + H.toAddSubgroup.map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).toAddMonoidHom := by + let A := intrinsicAbsoluteUnits K + let e := baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + intro x hx + have hxUT : + x ∈ U.normSubgroup A ⊓ T.normSubgroup A := + ClassFormation.FiniteAbelianSubextension.normSubgroup_compositum_le_inf + A U T hx + have hxUnramAdd : e.symm x ∈ + (unramifiedNormSubgroup K d).toAddSubgroup := + hUle ⟨x, hxUT.1, rfl⟩ + have hxPrincipalAdd : e.symm x ∈ + (LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ 1 n).toAddSubgroup := + hTle ⟨x, hxUT.2, rfl⟩ + have hxStandard : Additive.toMul (e.symm x) ∈ + LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ d n := + unramifiedNormSubgroup_inf_uniformizerPrincipalSubgroup_le + K ϖ d n hϖ ⟨hxUnramAdd, hxPrincipalAdd⟩ + have hxH : e.symm x ∈ H.toAddSubgroup := by + change Additive.toMul (e.symm x) ∈ H + exact hstandard hxStandard + exact ⟨e.symm x, hxH, e.apply_symm_apply x⟩ + +end LocalClassFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedLubinTateDiagonal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedLubinTateDiagonal.lean new file mode 100644 index 0000000000..3c2f6eab60 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedLubinTateDiagonal.lean @@ -0,0 +1,152 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LubinTateUniformizerDiagonal +/-! +# The unramified--Lubin--Tate diagonal field + +This module is the standard-uniformizer specialization of +`LubinTateUniformizerDiagonal`. The construction itself is carried out for +an arbitrary explicit uniformizer there; specializing it here keeps the +canonical API definitionally aligned with that reusable construction. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open scoped ValuativeRel +open LocalFieldTheory +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.IsNonarchimedeanLocalField +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension +open LubinTate + +/-- With the canonical spectral valuation, a standard Lubin--Tate level has +residue degree one over the topology-first local base field. -/ +theorem standardLubinTateLevel_spectral_inertiaDeg_eq_one + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (n : ℕ) : + let hπ := standardLocalFieldUniformizer_isUniformizer K + let T := standardLubinTateLevelField hπ n + letI : FiniteDimensional K T := + standardLubinTateLevelField_finiteDimensional hπ n + letI : NontriviallyNormedField T := + finiteExtensionSpectralNormedField K T + letI : ValuativeRel T := + finiteExtensionSpectralValuativeRel K T + letI : IsNonarchimedeanLocalField T := + finiteExtensionSpectralIsNonarchimedeanLocalField K T + letI : Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation T) := + finiteExtensionSpectralValuation_hasExtension K T + letI : + (LocalFieldTheory.localCompleteDVF K).valuation.HasExtension + (LocalFieldTheory.localCompleteDVF T).valuation := + localCompleteDVFValuation_hasExtension K T + (LocalFieldTheory.localCompleteDVF T).maximalIdeal.inertiaDeg + (LocalFieldTheory.localCompleteDVF K).valuationSubring = 1 := by + simpa only using lubinTateLevel_spectral_inertiaDeg_eq_one K + (standardLocalFieldUniformizer_isUniformizer K) n + +/-- The canonical degree-`d` unramified field and the standard Lubin--Tate +level have trivial intersection in the chosen separable closure. -/ +theorem localFiniteUnramifiedField_inf_standardLubinTateLevelField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) (n : ℕ) : + localFiniteUnramifiedField K d hd ⊓ + standardLubinTateLevelField + (standardLocalFieldUniformizer_isUniformizer K) n = + ⊥ := by + simpa only using localFiniteUnramifiedField_inf_lubinTateLevelField K + (standardLocalFieldUniformizer_isUniformizer K) d hd n + +/-- The canonical unramified field and standard Lubin--Tate level are +linearly disjoint over the local base field. -/ +theorem localFiniteUnramifiedField_linearDisjoint_standardLubinTateLevelField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) (n : ℕ) : + (localFiniteUnramifiedField K d hd).LinearDisjoint + (standardLubinTateLevelField + (standardLocalFieldUniformizer_isUniformizer K) n) := by + simpa only using + localFiniteUnramifiedField_linearDisjoint_lubinTateLevelField K + (standardLocalFieldUniformizer_isUniformizer K) d hd n + +/-- The standard-uniformizer instance of the unramified--Lubin--Tate +diagonal compositum. -/ +abbrev standardLubinTateDiagonalCompositumField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (n : ℕ) (u : (standardLocalField K).valuationSubringˣ) : + IntermediateField K (SeparableClosure K) := + lubinTateUniformizerDiagonalCompositumField K + (standardLocalFieldUniformizer_isUniformizer K) n u + +/-- The standard diagonal compositum is finite over the base field. -/ +theorem standardLubinTateDiagonalCompositumField_finiteDimensional + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (n : ℕ) (u : (standardLocalField K).valuationSubringˣ) : + FiniteDimensional K + (standardLubinTateDiagonalCompositumField K n u) := by + simpa only using + lubinTateUniformizerDiagonalCompositumField_finiteDimensional K + (standardLocalFieldUniformizer_isUniformizer K) n u + +/-- The standard diagonal compositum is Galois over the base field. -/ +theorem standardLubinTateDiagonalCompositumField_isGalois + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (n : ℕ) (u : (standardLocalField K).valuationSubringˣ) : + IsGalois K (standardLubinTateDiagonalCompositumField K n u) := by + simpa only using lubinTateUniformizerDiagonalCompositumField_isGalois K + (standardLocalFieldUniformizer_isUniformizer K) n u + +/-- The standard-uniformizer diagonal automorphism, restricting to arithmetic +Frobenius on the unramified factor and inverse unit action on the level. -/ +abbrev standardLubinTateDiagonalAutomorphism + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (n : ℕ) (u : (standardLocalField K).valuationSubringˣ) : + Gal((standardLubinTateDiagonalCompositumField K n u)/K) := + lubinTateUniformizerDiagonalAutomorphism K + (standardLocalFieldUniformizer_isUniformizer K) n u + +/-- The field fixed by the standard-uniformizer diagonal automorphism. -/ +abbrev standardLubinTateDiagonalFixedField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (n : ℕ) (u : (standardLocalField K).valuationSubringˣ) : + IntermediateField K + (standardLubinTateDiagonalCompositumField K n u) := + lubinTateUniformizerDiagonalFixedField K + (standardLocalFieldUniformizer_isUniformizer K) n u + +/-- The standard diagonal fixed field has the degree of its Lubin--Tate +level; the auxiliary unramified factor disappears after taking fixed points. -/ +theorem standardLubinTateDiagonalFixedField_finrank + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (n : ℕ) (u : (standardLocalField K).valuationSubringˣ) : + Module.finrank K (standardLubinTateDiagonalFixedField K n u) = + Module.finrank K + (standardLubinTateLevelField + (standardLocalFieldUniformizer_isUniformizer K) n) := by + simpa only using lubinTateUniformizerDiagonalFixedField_finrank K + (standardLocalFieldUniformizer_isUniformizer K) n u + +end LocalClassFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormContainment.lean new file mode 100644 index 0000000000..ec14359ba3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormContainment.lean @@ -0,0 +1,290 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ValuationContinuity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalResidueDatum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm +/-! +# The unramified norm containment + +For the canonical unramified extension of degree d, every relative norm has +normalized valuation divisible by d. This file transports that abstract norm +subgroup from fixed coefficients to the ordinary multiplicative group of the +local field. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open scoped ValuativeRel +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation LocalClassFieldTheory + +/-! The two transport lemmas below isolate propositionally equal presentations +of the ground field, making the main proof insensitive to proof terms carried +by extensionSubgroup. -/ + +private theorem valuationAt_coe_eq_of_closedSubgroup_eq + {G : Type} [Group G] [TopologicalSpace G] + {D : DegreeData G} {A : Rep ℤ G} + (v : ValuationData D A) + (H H' : FiniteAbstractField G) + (hHH' : H.field = H'.field) + (x : ambientFixedAddSubgroup A H.field) + (x' : ambientFixedAddSubgroup A H'.field) + (hxx' : x.1 = x'.1) : + ((v.valuationAt H x : v.valueGroup) : ZHat) = + ((v.valuationAt H' x' : v.valueGroup) : ZHat) := by + have hH : H = H' := by + cases H + cases H' + cases hHH' + rfl + subst H' + have hx : x = x' := Subtype.ext hxx' + subst x' + rfl + +/-- At the distinguished abstract base field, the normalized valuation is +the original henselian valuation. -/ +private theorem valuationAt_baseField_coe + {G : Type} [Group G] [TopologicalSpace G] + {D : DegreeData G} {A : Rep ℤ G} + (v : ValuationData D A) + (x : ambientFixedAddSubgroup A (baseField G)) : + ((v.valuationAt (FiniteAbstractField.base G) x : v.valueGroup) : ZHat) = + v.toAddMonoidHom x := by + have hdivided := + v.residueDegree_nsmul_dividedAt (FiniteAbstractField.base G) x + simp only [FiniteAbstractField.base_residueDegree, PNat.val_ofNat, one_smul] at hdivided + change v.dividedAt (FiniteAbstractField.base G) x = v.toAddMonoidHom x + rw [hdivided] + let : Finite ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) (baseField G) le_rfl) := by + simpa [FiniteAbstractField.base] using (FiniteAbstractField.base G).finite + change v.toAddMonoidHom + (relativeNorm A (baseField G) (baseField G) + (le_baseField (baseField G)) x) = v.toAddMonoidHom x + have hle : le_baseField (baseField G) = + (le_refl (baseField G).toSubgroup) := + Subsingleton.elim _ _ + rw [hle, relativeNorm_self] + +/-- The norm subgroup of the canonical unramified extension of degree d, +transported from fixed coefficients to the ordinary multiplicative group, is +contained in the subgroup whose normalized valuation is divisible by d. -/ +theorem finiteUnramifiedNormSubgroup_map_le_unramifiedNormSubgroup + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) : + let D := localResidueDatum K + let Kfinite : FiniteAbstractField (intrinsicAbsoluteGalois K) := + intrinsicFiniteAbstractBase K + let Kresidue := Kfinite.toFiniteResidueAbstractField D + let U := ClassFormation.DegreeData.finiteUnramifiedExtension D + Kresidue d hd + (ClassFormation.FiniteGaloisSubextension.normSubgroup (intrinsicAbsoluteUnits K) U).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom ≤ + (unramifiedNormSubgroup K d).toAddSubgroup := by + let G := intrinsicAbsoluteGalois K + let A := intrinsicAbsoluteUnits K + let D := localResidueDatum K + let v := localHenselianValuation K + let K₀ := intrinsicAbstractBase K + let Kfinite : FiniteAbstractField G := intrinsicFiniteAbstractBase K + let Kresidue := Kfinite.toFiniteResidueAbstractField D + let U : FiniteGaloisSubextension K₀ := by + have h := + ClassFormation.DegreeData.finiteUnramifiedExtension D Kresidue d hd + change FiniteGaloisSubextension K₀ at h + exact h + dsimp only + let hUfinite : Finite + (K₀.toSubgroup ⧸ extensionSubgroup K₀ U.field U.below) := + U.finite + let hK₀finite : Finite + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) K₀ (le_baseField K₀)) := + Kfinite.finite + let hUabsoluteFinite : Finite + ((baseField G).toSubgroup ⧸ + extensionSubgroup (baseField G) U.field + (le_baseField U.field)) := + relativeTowerQuotientFinite (baseField G) K₀ U.field U.below + (le_baseField K₀) + let Ufinite : FiniteAbstractField G := ⟨U.field, hUabsoluteFinite⟩ + let EU : FiniteAbstractFieldExtension G := + { field := Ufinite + base := Kfinite + below := U.below + finiteQuotient := U.finite } + intro x hx + rcases hx with ⟨y, hy, rfl⟩ + change y ∈ ClassFormation.FiniteGaloisSubextension.normSubgroup A U at hy + rcases hy with ⟨a, rfl⟩ + have hres : (EU.residueDegree D : ℕ) = d := by + have h := + ClassFormation.DegreeData.finiteUnramifiedExtension_residueDegree + D Kresidue d hd + change (EU.residueDegree D : ℕ) = d at h + exact h + have hvaluation : + ((v.valuationAt Kfinite + (relativeNorm A K₀ U.field U.below a) : v.valueGroup) : ZHat) = + d • ((v.valuationAt Ufinite a : v.valueGroup) : ZHat) := by + rw [← hres] + exact (v.normalizedValuation_tower EU a).symm + have hbase : K₀ = baseField G := by + exact closedFixingSubgroup_bot_eq_baseField K (SeparableClosure K) + let eBase : ambientFixedAddSubgroup A K₀ ≃+ + ambientFixedAddSubgroup A (baseField G) := + AddEquiv.addSubgroupCongr + (congrArg (ambientFixedAddSubgroup A) hbase) + let yBase : ambientFixedAddSubgroup A (baseField G) := + eBase (relativeNorm A K₀ U.field U.below a) + let BaseFinite : FiniteAbstractField G := + FiniteAbstractField.base G + have hyTransport : + ((v.valuationAt Kfinite + (relativeNorm A K₀ U.field U.below a) : v.valueGroup) : ZHat) = + ((v.valuationAt BaseFinite yBase : v.valueGroup) : ZHat) := by + apply valuationAt_coe_eq_of_closedSubgroup_eq v Kfinite BaseFinite hbase + rfl + have hyBase : yBase = baseFieldUnitsEquiv K + ((baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm + (relativeNorm A K₀ U.field U.below a)) := by + apply Subtype.ext + change (relativeNorm A K₀ U.field U.below a).1 = + ((baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)) + ((baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm + (relativeNorm A K₀ U.field U.below a))).1 + exact congrArg Subtype.val + ((baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).apply_symm_apply + (relativeNorm A K₀ U.field U.below a)).symm + have hnative : + ((v.valuationAt Kfinite + (relativeNorm A K₀ U.field U.below a) : v.valueGroup) : ZHat) = + Int.castRingHom ZHat + (LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + ((baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm + (relativeNorm A K₀ U.field U.below a))) := by + rw [hyTransport, valuationAt_baseField_coe, hyBase] + change localBaseValuation K + (baseFieldUnitsEquiv K + ((baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm + (relativeNorm A K₀ U.field U.below a))) = _ + exact localBaseValuation_baseFieldUnitsEquiv K _ + apply (mem_unramifiedNormSubgroup_iff K d _).2 + apply (ZMod.intCast_zmod_eq_zero_iff_dvd _ d).1 + rw [← zHatReduction_int d hd] + calc + zHatReduction d hd + (Int.castRingHom ZHat + (LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + ((baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm + (relativeNorm A K₀ U.field U.below a)))) = + zHatReduction d hd + ((v.valuationAt Kfinite + (relativeNorm A K₀ U.field U.below a) : v.valueGroup) : ZHat) := by + simpa only using congrArg (zHatReduction d hd) hnative.symm + _ = 0 := by + rw [hvaluation, map_nsmul] + simp + +/-- The canonical unramified extension of positive degree supplies a finite +Galois subextension whose transported norm subgroup consists of elements with +valuation divisible by that degree. -/ +theorem exists_unramifiedFiniteGaloisExtension_normSubgroup_map_le + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) : + ∃ U : FiniteGaloisSubextension (intrinsicAbstractBase K), + (U.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom ≤ + (unramifiedNormSubgroup K d).toAddSubgroup := by + let A := intrinsicAbsoluteUnits K + let B := intrinsicAbstractBase K + let e := baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + let D := localResidueDatum K + let Bfinite : FiniteAbstractField (intrinsicAbsoluteGalois K) := + intrinsicFiniteAbstractBase K + let Bresidue := Bfinite.toFiniteResidueAbstractField D + let U : FiniteGaloisSubextension B := by + have h := D.finiteUnramifiedExtension Bresidue d hd + change FiniteGaloisSubextension B at h + exact h + refine ⟨U, ?_⟩ + simpa [A, B, e, D, Bfinite, Bresidue, U] using + (finiteUnramifiedNormSubgroup_map_le_unramifiedNormSubgroup + K d hd) + +/-- The canonical degree-`d` unramified factor, retained as a named finite +abelian subextension of the local absolute Galois group. -/ +noncomputable def localFiniteUnramifiedAbelianSubextension + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) : + FiniteAbelianSubextension (intrinsicAbstractBase K) := by + let D := localResidueDatum K + let Bfinite : FiniteAbstractField (intrinsicAbsoluteGalois K) := + intrinsicFiniteAbstractBase K + let Bresidue := Bfinite.toFiniteResidueAbstractField D + exact D.finiteUnramifiedAbelianExtension Bresidue d hd + +/-- The named finite unramified abelian factor satisfies the expected +valuation-divisibility norm containment. -/ +theorem localFiniteUnramifiedAbelianSubextension_normSubgroup_map_le + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) : + let U := localFiniteUnramifiedAbelianSubextension K d hd + (U.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom ≤ + (unramifiedNormSubgroup K d).toAddSubgroup := by + let A := intrinsicAbsoluteUnits K + let B := intrinsicAbstractBase K + let e := baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + let D := localResidueDatum K + let Bfinite : FiniteAbstractField (intrinsicAbsoluteGalois K) := + intrinsicFiniteAbstractBase K + let Bresidue := Bfinite.toFiniteResidueAbstractField D + let U := localFiniteUnramifiedAbelianSubextension K d hd + simpa [A, B, e, D, Bfinite, Bresidue, U, + localFiniteUnramifiedAbelianSubextension, + FiniteAbstractField.toFiniteResidueAbstractField, + DegreeData.finiteUnramifiedAbelianExtension, + FiniteAbelianSubextension.normSubgroup, + FiniteGaloisSubextension.normSubgroup] using + (finiteUnramifiedNormSubgroup_map_le_unramifiedNormSubgroup + K d hd) + +/-- The canonical unramified extension can be retained as a finite abelian +subextension, with the same norm-subgroup containment. -/ +theorem exists_unramifiedFiniteAbelianExtension_normSubgroup_map_le + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) : + ∃ U : FiniteAbelianSubextension (intrinsicAbstractBase K), + (U.normSubgroup (intrinsicAbsoluteUnits K)).map + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm.toAddMonoidHom ≤ + (unramifiedNormSubgroup K d).toAddSubgroup := by + exact + ⟨localFiniteUnramifiedAbelianSubextension K d hd, + localFiniteUnramifiedAbelianSubextension_normSubgroup_map_le + K d hd⟩ + +end LocalClassFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormSubgroup.lean new file mode 100644 index 0000000000..f2b81817a8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormSubgroup.lean @@ -0,0 +1,308 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Norm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient +/-! +# Unramified norm subgroups + +For a nonarchimedean local field, the norm subgroup of an unramified +extension of degree n is characterized by divisibility of the normalized +valuation by n. This file packages that subgroup, its quotient map, and +the canonical identification of the quotient with ZMod n. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace LocalClassFieldTheory + +/-- The normalized valuation map reduced modulo a positive or zero degree n. -/ +noncomputable def valuationModDegree (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (n : Nat) : + Additive Kˣ →+ ZMod n := + (Int.castAddHom (ZMod n)).comp (LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K) + +/-- Evaluates the normalized valuation map after reduction modulo `n`. -/ +@[simp] +theorem valuationModDegree_apply (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (n : Nat) (x : Additive Kˣ) : + valuationModDegree K n x = + (LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K x : ZMod n) := + rfl + +/-- The normalized valuation remains surjective after reduction modulo `n`. -/ +theorem valuationModDegree_surjective (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (n : Nat) : + Function.Surjective (valuationModDegree K n) := by + intro z + rcases ZMod.intCast_surjective z with ⟨m, rfl⟩ + rcases LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_surjective K m with ⟨x, hx⟩ + exact ⟨x, by simp [hx]⟩ + +/-- A reduced valuation vanishes exactly when `n` divides the original valuation. -/ +theorem valuationModDegree_eq_zero_iff_dvd (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (n : Nat) (x : Additive Kˣ) : + valuationModDegree K n x = 0 ↔ + (n : Int) ∣ LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K x := by + rw [valuationModDegree_apply] + exact ZMod.intCast_zmod_eq_zero_iff_dvd + (LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K x) n + +/-- Two reduced valuations agree exactly when `n` divides their difference. -/ +theorem valuationModDegree_eq_iff_dvd_sub (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (n : Nat) (x y : Additive Kˣ) : + valuationModDegree K n x = valuationModDegree K n y ↔ + (n : Int) ∣ + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K x - + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K y := by + rw [← sub_eq_zero, ← map_sub, valuationModDegree_eq_zero_iff_dvd, map_sub] + +/-- Multiplicative form of the normalized valuation map modulo a degree. -/ +noncomputable def valuationModDegreeMulHom (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (n : Nat) : + Kˣ →* Multiplicative (ZMod n) := + AddMonoidHom.toMultiplicativeRight (valuationModDegree K n) + +/-- Evaluates the multiplicative form of the valuation-modulo-degree map. -/ +@[simp] +theorem valuationModDegreeMulHom_apply (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (n : Nat) (x : Kˣ) : + valuationModDegreeMulHom K n x = + Multiplicative.ofAdd + (LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul x) : ZMod n) := + rfl + +/-- The multiplicative valuation-modulo-degree map is surjective. -/ +theorem valuationModDegreeMulHom_surjective (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (n : Nat) : + Function.Surjective (valuationModDegreeMulHom K n) := by + intro z + rcases valuationModDegree_surjective K n (Multiplicative.toAdd z) with ⟨x, hx⟩ + refine ⟨Additive.toMul x, ?_⟩ + apply Multiplicative.toAdd.injective + simpa using hx + +/-- A unit maps to one exactly when its valuation is divisible by `n`. -/ +theorem valuationModDegreeMulHom_eq_one_iff_dvd (K : Type u) [Field K] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (n : Nat) (x : Kˣ) : + valuationModDegreeMulHom K n x = 1 ↔ + (n : Int) ∣ + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul x) := by + change valuationModDegree K n (Additive.ofMul x) = 0 ↔ _ + exact valuationModDegree_eq_zero_iff_dvd K n (Additive.ofMul x) + +/-- Two units have the same image exactly when `n` divides their valuation difference. -/ +theorem valuationModDegreeMulHom_eq_iff_dvd_sub (K : Type u) [Field K] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (n : Nat) (x y : Kˣ) : + valuationModDegreeMulHom K n x = valuationModDegreeMulHom K n y ↔ + (n : Int) ∣ + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul x) - + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul y) := by + change valuationModDegree K n (Additive.ofMul x) = + valuationModDegree K n (Additive.ofMul y) ↔ _ + exact valuationModDegree_eq_iff_dvd_sub K n (Additive.ofMul x) (Additive.ofMul y) + +/-- The unramified norm subgroup of degree `n`: field units whose normalized +valuation lies in `nℤ`. -/ +def unramifiedNormSubgroup (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (n : Nat) : Subgroup Kˣ where + carrier := {x | (n : Int) ∣ + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul x)} + one_mem' := by + change (n : Int) ∣ + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul (1 : Kˣ)) + rw [show Additive.ofMul (1 : Kˣ) = 0 by rfl, map_zero] + exact dvd_zero (n : Int) + mul_mem' := by + intro x y hx hy + change (n : Int) ∣ + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul (x * y)) + rw [show Additive.ofMul (x * y) = Additive.ofMul x + Additive.ofMul y by rfl, + map_add] + exact dvd_add hx hy + inv_mem' := by + intro x hx + change (n : Int) ∣ + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul x⁻¹) + rw [show Additive.ofMul x⁻¹ = -Additive.ofMul x by rfl, map_neg] + exact dvd_neg.mpr hx + +/-- Characterizes the unramified norm subgroup by divisibility of the normalized valuation. -/ +theorem mem_unramifiedNormSubgroup_iff (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (n : Nat) (x : Kˣ) : + x ∈ unramifiedNormSubgroup K n ↔ + (n : Int) ∣ LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul x) := + Iff.rfl + +/-- The quotient map from field units to degree-`n` unramified norm classes. -/ +def unramifiedNormClass (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (n : Nat) : + Kˣ →* Kˣ ⧸ unramifiedNormSubgroup K n := + QuotientGroup.mk' (unramifiedNormSubgroup K n) + +/-- Every unramified norm class is represented by a field unit. -/ +theorem unramifiedNormClass_surjective (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (n : Nat) : + Function.Surjective (unramifiedNormClass K n) := + QuotientGroup.mk'_surjective (unramifiedNormSubgroup K n) + +/-- The kernel of the quotient map is the unramified norm subgroup. -/ +theorem unramifiedNormClass_ker (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (n : Nat) : + MonoidHom.ker (unramifiedNormClass K n) = + unramifiedNormSubgroup K n := + QuotientGroup.ker_mk' (N := unramifiedNormSubgroup K n) + +/-- A unit has trivial norm class exactly when its valuation is divisible by the degree. -/ +theorem unramifiedNormClass_eq_one_iff (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (n : Nat) (x : Kˣ) : + unramifiedNormClass K n x = 1 ↔ + (n : Int) ∣ LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul x) + := by + exact (QuotientGroup.eq_one_iff (N := unramifiedNormSubgroup K n) x).trans + (mem_unramifiedNormSubgroup_iff K n x) + +/-- A unit has trivial norm class exactly when it belongs to the unramified norm subgroup. -/ +theorem unramifiedNormClass_eq_one_iff_mem (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (n : Nat) (x : Kˣ) : + unramifiedNormClass K n x = 1 ↔ x ∈ unramifiedNormSubgroup K n := by + rw [unramifiedNormClass_eq_one_iff, mem_unramifiedNormSubgroup_iff] + +/-- The unramified norm subgroup is the kernel of the multiplicative reduced valuation. -/ +theorem unramifiedNormSubgroup_eq_ker_valuationModDegreeMulHom (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (n : Nat) : + MonoidHom.ker (valuationModDegreeMulHom K n) = unramifiedNormSubgroup K n := by + ext x + rw [MonoidHom.mem_ker, mem_unramifiedNormSubgroup_iff, + valuationModDegreeMulHom_eq_one_iff_dvd] + +/-- Membership in the unramified norm subgroup is detected by the reduced valuation. -/ +theorem mem_unramifiedNormSubgroup_iff_valuationModDegreeMulHom_eq_one + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (n : Nat) (x : Kˣ) : + x ∈ unramifiedNormSubgroup K n ↔ valuationModDegreeMulHom K n x = 1 := by + rw [mem_unramifiedNormSubgroup_iff, valuationModDegreeMulHom_eq_one_iff_dvd] + +/-- The valuation quotient model +`Kˣ / {x | n ∣ v(x)} ≃ Z/nZ`, in multiplicative notation. -/ +noncomputable def unramifiedNormQuotientEquivZMod (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (n : Nat) : + Kˣ ⧸ unramifiedNormSubgroup K n ≃* Multiplicative (ZMod n) := + (QuotientGroup.quotientMulEquivOfEq + (unramifiedNormSubgroup_eq_ker_valuationModDegreeMulHom K n).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective (valuationModDegreeMulHom K n) + (valuationModDegreeMulHom_surjective K n)) + +/-- The quotient equivalence sends a unit class to its valuation modulo the degree. -/ +@[simp] +theorem unramifiedNormQuotientEquivZMod_mk (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (n : Nat) (x : Kˣ) : + unramifiedNormQuotientEquivZMod K n (QuotientGroup.mk x) = + valuationModDegreeMulHom K n x := by + simp only [unramifiedNormQuotientEquivZMod, MulEquiv.trans_apply, + QuotientGroup.quotientMulEquivOfEq_mk] + rw [QuotientGroup.quotientKerEquivOfSurjective, + QuotientGroup.quotientKerEquivOfRightInverse_apply, + QuotientGroup.kerLift_mk] + +/-- Cardinality of the valuation quotient for arbitrary `n`. This statement +remains meaningful at `n = 0`, when `ZMod 0` and the quotient are infinite. -/ +theorem unramifiedNormQuotient_cardinal_eq_zmod (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (n : Nat) : + Cardinal.mk (Kˣ ⧸ unramifiedNormSubgroup K n) = + Cardinal.lift (Cardinal.mk (ZMod n)) := by + simpa only [Cardinal.lift_id'] using Cardinal.mk_congr_lift + ((unramifiedNormQuotientEquivZMod K n).toEquiv.trans + (Multiplicative.toAdd : Multiplicative (ZMod n) ≃ ZMod n)) + +/-- A nonzero valuation modulus gives a finite norm quotient. -/ +noncomputable instance finiteUnramifiedNormQuotient (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (n : Nat) [NeZero n] : Finite (Kˣ ⧸ unramifiedNormSubgroup K n) := + Finite.of_equiv (Multiplicative (ZMod n)) + (unramifiedNormQuotientEquivZMod K n).symm.toEquiv + +/-- For nonzero degree, the unramified norm quotient has cardinality equal to that degree. -/ +theorem unramifiedNormQuotient_card_eq_degree (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (n : Nat) : + Nat.card (Kˣ ⧸ unramifiedNormSubgroup K n) = n := by + calc + Nat.card (Kˣ ⧸ unramifiedNormSubgroup K n) = + Nat.card (Multiplicative (ZMod n)) := + Nat.card_congr (unramifiedNormQuotientEquivZMod K n).toEquiv + _ = Nat.card (ZMod n) := Nat.card_congr Multiplicative.toAdd + _ = n := Nat.card_zmod n + +/-- Two units define the same norm class exactly when the degree divides their valuation +difference. -/ +theorem unramifiedNormClass_eq_iff (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (n : Nat) (x y : Kˣ) : + unramifiedNormClass K n x = + unramifiedNormClass K n y ↔ + (n : Int) ∣ + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul x) - + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul y) := by + change (QuotientGroup.mk x : Kˣ ⧸ unramifiedNormSubgroup K n) = + QuotientGroup.mk y ↔ _ + constructor + · intro h + have hmap := congrArg (unramifiedNormQuotientEquivZMod K n) h + rw [unramifiedNormQuotientEquivZMod_mk, + unramifiedNormQuotientEquivZMod_mk] at hmap + exact (valuationModDegreeMulHom_eq_iff_dvd_sub K n x y).1 hmap + · intro h + apply (unramifiedNormQuotientEquivZMod K n).injective + rw [unramifiedNormQuotientEquivZMod_mk, + unramifiedNormQuotientEquivZMod_mk] + exact (valuationModDegreeMulHom_eq_iff_dvd_sub K n x y).2 h + +/-- The quotient images agree exactly when the reduced valuation difference vanishes. -/ +theorem unramifiedNormQuotientEquivZMod_eq_iff_valuation_sub_eq_zero (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (n : Nat) (x y : Kˣ) : + unramifiedNormQuotientEquivZMod K n + (unramifiedNormClass K n x) = + unramifiedNormQuotientEquivZMod K n + (unramifiedNormClass K n y) ↔ + ((LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul x) - + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul y) : Int) : + ZMod n) = 0 := by + change unramifiedNormQuotientEquivZMod K n + (QuotientGroup.mk x : Kˣ ⧸ unramifiedNormSubgroup K n) = + unramifiedNormQuotientEquivZMod K n + (QuotientGroup.mk y : Kˣ ⧸ unramifiedNormSubgroup K n) ↔ _ + rw [unramifiedNormQuotientEquivZMod_mk, + unramifiedNormQuotientEquivZMod_mk, valuationModDegreeMulHom_apply, + valuationModDegreeMulHom_apply] + change + (LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul x) : ZMod n) = + (LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul y) : ZMod n) ↔ + ((LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul x) - + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul y) : Int) : + ZMod n) = 0 + rw [Int.cast_sub, sub_eq_zero] + + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnshrinkFiniteAbelianFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnshrinkFiniteAbelianFields.lean new file mode 100644 index 0000000000..10b99df448 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnshrinkFiniteAbelianFields.lean @@ -0,0 +1,109 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianFields +/-! +# Returning finite abelian intermediate fields from the small base + +The converse to the small-base transport: an intermediate field over +`Shrink K` in the original separable closure remains finite abelian over `K`. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalFieldTheory + +universe u + +variable (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The same underlying field after undoing the small base change. -/ +def unshrinkIntermediateFieldRingEquiv : + letI : Small.{0} K := nonarchimedeanLocalField_small K + letI : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + (F : IntermediateField (Shrink.{0} K) (SeparableClosure K)) → + F ≃+* unshrinkIntermediateField K F := by + let : Small.{0} K := nonarchimedeanLocalField_small K + let : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + intro F + exact RingEquiv.refl F + +/-- The inverse intermediate-field equivalence commutes with the base-field +embeddings. -/ +theorem unshrinkIntermediateFieldRingEquiv_commutes : + letI : Small.{0} K := nonarchimedeanLocalField_small K + letI : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + ∀ F : IntermediateField (Shrink.{0} K) (SeparableClosure K), + (algebraMap K (unshrinkIntermediateField K F)).comp + (Shrink.ringEquiv K).toRingHom = + (unshrinkIntermediateFieldRingEquiv K F).toRingHom.comp + (algebraMap (Shrink.{0} K) F) := by + let : Small.{0} K := nonarchimedeanLocalField_small K + let : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + intro F + ext x + have hbase : + algebraMap K (SeparableClosure K) (Shrink.ringEquiv K x) = + algebraMap (Shrink.{0} K) (SeparableClosure K) x := by + rfl + have hfieldK : + ((algebraMap K (unshrinkIntermediateField K F) + (Shrink.ringEquiv K x) : unshrinkIntermediateField K F) : + SeparableClosure K) = + algebraMap K (SeparableClosure K) (Shrink.ringEquiv K x) := + IntermediateField.coe_algebraMap_apply (unshrinkIntermediateField K F) _ + have hfieldS : + algebraMap (Shrink.{0} K) (SeparableClosure K) x = + ((algebraMap (Shrink.{0} K) F x : F) : SeparableClosure K) := + (IntermediateField.coe_algebraMap_apply F x).symm + exact congrArg (fun y : SeparableClosure K => (y : AlgebraicClosure K)) + (hfieldK.trans (hbase.trans hfieldS)) + +/-- Finite-dimensionality is preserved when returning to `K`. -/ +theorem unshrinkIntermediateField_finiteDimensional : + letI : Small.{0} K := nonarchimedeanLocalField_small K + letI : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + ∀ F : IntermediateField (Shrink.{0} K) (SeparableClosure K), + FiniteDimensional (Shrink.{0} K) F → + FiniteDimensional K (unshrinkIntermediateField K F) := by + let : Small.{0} K := nonarchimedeanLocalField_small K + let : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + intro F hF + let : FiniteDimensional (Shrink.{0} K) F := hF + exact Module.Finite.of_equiv_equiv + (Shrink.ringEquiv K) (unshrinkIntermediateFieldRingEquiv K F) + (unshrinkIntermediateFieldRingEquiv_commutes K F) + +/-- The abelian Galois property is preserved when returning to `K`. -/ +theorem unshrinkIntermediateField_isAbelianGalois : + letI : Small.{0} K := nonarchimedeanLocalField_small K + letI : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + ∀ F : IntermediateField (Shrink.{0} K) (SeparableClosure K), + IsAbelianGalois (Shrink.{0} K) F → + IsAbelianGalois K (unshrinkIntermediateField K F) := by + let : Small.{0} K := nonarchimedeanLocalField_small K + let : Algebra (Shrink.{0} K) (SeparableClosure K) := + shrinkSeparableClosureAlgebra K + intro F hF + let : IsAbelianGalois (Shrink.{0} K) F := hF + exact ClassFieldTheory.isAbelianGalois_of_equiv_equiv + (Shrink.ringEquiv K) (unshrinkIntermediateFieldRingEquiv K F) + (unshrinkIntermediateFieldRingEquiv_commutes K F) + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity.lean new file mode 100644 index 0000000000..bff47962bd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity.lean @@ -0,0 +1,66 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbsoluteUnitsFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityPrimeNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConjugationNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilySubgroupKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyUnramifiedCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteGaloisRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFinrankTransfer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueValuationComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteSubgroupResidueDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldContinuousNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldLocalData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldNormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldRelativeNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.HenselianValuationBase +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntermediateFieldNormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalClassFieldAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalResidueDatum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueActionIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicClosureDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicallyClosed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueDatum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SemilinearNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableFixedFieldNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableNormProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TateTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedResidueUniqueness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ValuationSemilinear + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbsoluteUnitsFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbsoluteUnitsFixedField.lean new file mode 100644 index 0000000000..984df0bffa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbsoluteUnitsFixedField.lean @@ -0,0 +1,199 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.ClosedFixingSubgroup +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerDelta +public import Mathlib.RepresentationTheory.Rep.Basic + +/-! # Absolute Units Fixed Field -/ + +@[expose] public section +namespace LocalClassFieldTheory + +open RamificationTheory KummerTheory CyclicCohomology + +/-! +# Finite local reciprocity: Galois units and fixed fields + +For local reciprocity the coefficient module in the abstract class formation is +`A = (K^sep)ˣ`. This file identifies its subgroup fixed by the actual closed +fixing subgroup of an intermediate field `E` with the image of `Eˣ`. + +The result is stated for an arbitrary Galois ambient extension. In particular +it applies to `SeparableClosure K / K` for every field `K`; no perfectness, +local-field, or finite-dimensional hypothesis is needed. Using the separable +closure is essential in positive characteristic: the fixed field of +`Aut(K^alg/K)` inside `K^alg` need not be `K` when `K` is imperfect. +-/ + +noncomputable +section + +variable (K Ω : Type) [Field K] [Field Ω] [Algebra K Ω] + +/-- The actual Galois representation on `Ωˣ`, written additively for the +group-cohomology API. -/ +abbrev galoisAmbientUnitsRep : Rep ℤ (Gal(Ω/K)) := + Rep.ofAlgebraAutOnUnits K Ω + +/-- Inclusion of the units of an intermediate field into the units of the +chosen Galois ambient field, in additive notation. -/ +def intermediateFieldUnitsToGaloisAmbient + (E : IntermediateField K Ω) : + Additive Eˣ →+ Additive Ωˣ := + MonoidHom.toAdditive (Units.map E.val.toRingHom) + +/-- States the theorem `intermediateFieldUnitsToGaloisAmbient_apply`. -/ +@[simp] +theorem intermediateFieldUnitsToGaloisAmbient_apply + (E : IntermediateField K Ω) (x : Eˣ) : + intermediateFieldUnitsToGaloisAmbient K Ω E (Additive.ofMul x) = + Additive.ofMul (Units.map E.val.toRingHom x) := + rfl + +variable [IsGalois K Ω] + +/-- An ambient unit is fixed by `Gal(Ω/E)` exactly when its underlying +field element belongs to `E`. -/ +theorem mem_galoisAmbientUnits_fixed_iff + (E : IntermediateField K Ω) + (x : Additive Ωˣ) : + x ∈ ambientFixedAddSubgroup (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω E) ↔ + ((Additive.toMul x : Ωˣ) : Ω) ∈ E := by + change + (show galoisAmbientUnitsRep K Ω from x) ∈ + ambientFixedAddSubgroup (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω E) ↔ + ((Additive.toMul x : Ωˣ) : Ω) ∈ E + rw [mem_ambientFixedAddSubgroup_iff] + constructor + · intro hx + rw [← InfiniteGalois.fixedField_fixingSubgroup E, + IntermediateField.mem_fixedField_iff] + intro σ hσ + have hσclosed : + σ ∈ (closedFixingSubgroup K Ω E).toSubgroup := by + simpa only [closedFixingSubgroup] using hσ + have hfixed := hx ⟨σ, hσclosed⟩ + have hρ : + (Rep.ofAlgebraAutOnUnits K Ω).ρ σ x = + Additive.ofMul + (Units.mapEquiv σ.toMulEquiv (Additive.toMul x)) := + rfl + rw [hρ] at hfixed + have hval := congrArg + (fun z : Additive Ωˣ ↦ ((Additive.toMul z : Ωˣ) : Ω)) hfixed + convert hval using 1 + rfl + · intro hx σ + have hσE : σ.1 ∈ E.fixingSubgroup := by + simpa only [closedFixingSubgroup] using σ.2 + have hρ : + (Rep.ofAlgebraAutOnUnits K Ω).ρ + (σ : Gal(Ω/K)) x = + Additive.ofMul + (Units.mapEquiv + (σ : Gal(Ω/K)).toMulEquiv (Additive.toMul x)) := + rfl + rw [hρ] + apply Additive.ext + rw [toMul_ofMul] + apply Units.ext + convert (IntermediateField.mem_fixingSubgroup_iff E σ.1).1 hσE _ hx using 1 + rfl + +/-- The image of `Eˣ` in `Ωˣ` is precisely the abstract fixed +subgroup `A_E` used in the abstract class-formation framework. -/ +theorem intermediateFieldUnitsToGaloisAmbient_range + (E : IntermediateField K Ω) : + (intermediateFieldUnitsToGaloisAmbient K Ω E).range = + ambientFixedAddSubgroup (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω E) := by + apply AddSubgroup.ext + intro x + constructor + · rintro ⟨y, rfl⟩ + change + (show galoisAmbientUnitsRep K Ω from + intermediateFieldUnitsToGaloisAmbient K Ω E y) ∈ + ambientFixedAddSubgroup (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω E) + apply (mem_galoisAmbientUnits_fixed_iff K Ω E _).2 + rw [← ofMul_toMul y, intermediateFieldUnitsToGaloisAmbient_apply, + toMul_ofMul, Units.coe_map] + exact (Additive.toMul y : Eˣ).1.property + · intro hx + have hxE : + ((Additive.toMul x : Ωˣ) : Ω) ∈ E := + (mem_galoisAmbientUnits_fixed_iff K Ω E x).1 hx + let y₀ : E := + ⟨((Additive.toMul x : Ωˣ) : Ω), hxE⟩ + have hy₀ : y₀ ≠ 0 := by + intro h + have h' : + ((Additive.toMul x : Ωˣ) : Ω) = 0 := + congrArg E.val h + exact (Additive.toMul x : Ωˣ).ne_zero h' + let y : Eˣ := Units.mk0 y₀ hy₀ + refine ⟨Additive.ofMul y, ?_⟩ + rw [intermediateFieldUnitsToGaloisAmbient_apply] + apply Additive.ext + rw [toMul_ofMul] + apply Units.ext + rw [Units.coe_map] + rfl + +/-- Canonical additive equivalence `Eˣ ≃ A_E` for the actual ambient-unit +representation. -/ +def intermediateFieldUnitsEquivGaloisFixed + (E : IntermediateField K Ω) : + Additive Eˣ ≃+ ambientFixedAddSubgroup (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω E) := by + let eRange : Additive Eˣ ≃+ + (intermediateFieldUnitsToGaloisAmbient K Ω E).range := + AddMonoidHom.ofInjective (by + intro x y hxy + apply Additive.toMul.injective + exact (Units.map_injective E.val.injective) (congrArg Additive.toMul hxy)) + exact eRange.trans + (AddEquiv.addSubgroupCongr + (intermediateFieldUnitsToGaloisAmbient_range K Ω E)) + +/-- States the theorem `intermediateFieldUnitsEquivGaloisFixed_coe`. -/ +@[simp] +theorem intermediateFieldUnitsEquivGaloisFixed_coe + (E : IntermediateField K Ω) (x : Additive Eˣ) : + (intermediateFieldUnitsEquivGaloisFixed K Ω E x).1 = + intermediateFieldUnitsToGaloisAmbient K Ω E x := + rfl + +/-- For an embedded extension `i : L → Ω`, the coefficient group fixed by +`Gal(Ω/i(L))` is canonically the actual unit group `Lˣ`. This is the form +needed when an abstract finite extension is realized inside a separable +closure. -/ +def embeddedFieldUnitsEquivGaloisFixed + (L : Type) [Field L] [Algebra K L] + (i : L →ₐ[K] Ω) : + Additive Lˣ ≃+ ambientFixedAddSubgroup (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (AlgHom.fieldRange i)) := + (MulEquiv.toAdditive + (Units.mapEquiv (AlgEquiv.ofInjectiveField i).toMulEquiv)).trans + (intermediateFieldUnitsEquivGaloisFixed K Ω (AlgHom.fieldRange i)) + +/-- States the theorem `embeddedFieldUnitsEquivGaloisFixed_coe`. -/ +@[simp] +theorem embeddedFieldUnitsEquivGaloisFixed_coe + (L : Type) [Field L] [Algebra K L] + (i : L →ₐ[K] Ω) (x : Lˣ) : + (embeddedFieldUnitsEquivGaloisFixed K Ω L i (Additive.ofMul x)).1 = + Additive.ofMul (Units.map i.toRingHom.toMonoidHom x) := + rfl + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean new file mode 100644 index 0000000000..f87260cded --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean @@ -0,0 +1,284 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.HenselianValuationBase +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableFixedFieldNorm + +/-! # Abstract Fixed Field Norm -/ + +@[expose] public section +namespace LocalClassFieldTheory +open RamificationTheory CyclicCohomology KummerTheory ClassFormation + +open LocalFieldTheory + +/-! +# Finite local reciprocity: the norm of an arbitrary finite abstract field + +The abstract class-formation framework indexes finite fields by + closed subgroups, whereas the local norm +calculation is stated for their concrete fixed intermediate fields. This file +identifies the two presentations. In particular, it does not assume that the +finite fixed field is normal over the local ground field. +-/ + +noncomputable +section + +open scoped ValuativeRel +variable (K Ω : Type) [Field K] [Field Ω] [Algebra K Ω] + [IsGalois K Ω] [IsSepClosed Ω] + +/-- The underlying value of a relative norm is unchanged when its two +closed-subgroup indices and its fixed coefficient are transported along +equalities. Keeping this congruence explicit avoids dependent rewriting +through the inclusion proof carried by `relativeNorm`. -/ +theorem relativeNorm_coe_eq_of_closedSubgroup_eq + {G : Type} [Group G] [TopologicalSpace G] + (A : Rep ℤ G) + (B B' C C' : ClosedSubgroup G) + (hCB : C.toSubgroup ≤ B.toSubgroup) + (hC'B' : C'.toSubgroup ≤ B'.toSubgroup) + [hfinite : Finite + (B.toSubgroup ⧸ extensionSubgroup B C hCB)] + [hfinite' : Finite + (B'.toSubgroup ⧸ extensionSubgroup B' C' hC'B')] + (hB : B = B') (hC : C = C') + (x : ambientFixedAddSubgroup A C) + (x' : ambientFixedAddSubgroup A C') + (hx : x.1 = x'.1) : + ((relativeNorm A B C hCB x : ambientFixedAddSubgroup A B) : A.V) = + ((relativeNorm A B' C' hC'B' x' : + ambientFixedAddSubgroup A B') : A.V) := by + subst B' + subst C' + have hle : hCB = hC'B' := Subsingleton.elim _ _ + subst hC'B' + have hfin : hfinite = hfinite' := Subsingleton.elim _ _ + subst hfinite' + have hxx' : x = x' := Subtype.ext hx + subst x' + rfl + +/-- For an arbitrary finite separable abstract field, the abstract class-formation norm on +fixed coefficients has the same underlying field element as the ordinary +field norm from its concrete fixed field. -/ +theorem normToBase_abstractFixedFieldUnit_val_of_isSeparable + (H : ClosedSubgroup (Gal(Ω/K))) + [Finite ((baseField (Gal(Ω/K))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/K))) H (le_baseField H))] + [FiniteDimensional K (abstractFixedField K Ω H)] + [Algebra.IsSeparable K (abstractFixedField K Ω H)] + (x : (abstractFixedField K Ω H)ˣ) : + ((Additive.toMul + ((normToBase (galoisAmbientUnitsRep K Ω) H + (abstractFixedFieldUnitsEquivGaloisFixed K Ω H + (Additive.ofMul x))).1 : Additive Ωˣ) : Ωˣ) : Ω) = + algebraMap K Ω (Algebra.norm K + (x : abstractFixedField K Ω H)) := by + let E := abstractFixedField K Ω H + let y : ambientFixedAddSubgroup (galoisAmbientUnitsRep K Ω) H := + abstractFixedFieldUnitsEquivGaloisFixed K Ω H (Additive.ofMul x) + let yE := intermediateFieldUnitsEquivGaloisFixed K Ω E (Additive.ofMul x) + have hy : yE.1 = y.1 := by + rw [intermediateFieldUnitsEquivGaloisFixed_coe] + exact (abstractFixedFieldUnitsEquivGaloisFixed_coe + K Ω H (Additive.ofMul x)).symm + have hnorm := + relativeNorm_intermediateFieldUnit_val_of_isSeparable K Ω E x + have htransport := relativeNorm_coe_eq_of_closedSubgroup_eq + (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (baseField (Gal(Ω/K))) + (closedFixingSubgroup K Ω E) H + (fixingSubgroupLeBase K Ω E) (le_baseField H) + (closedFixingSubgroup_bot_eq_baseField K Ω) + (closedFixingSubgroup_abstractFixedField_eq K Ω H) + yE y hy + have htransport' := congrArg + (fun z : Additive Ωˣ => ((Additive.toMul z : Ωˣ) : Ω)) htransport + change + ((Additive.toMul + ((normToBase (galoisAmbientUnitsRep K Ω) H y).1 : + Additive Ωˣ) : Ωˣ) : Ω) = _ + exact htransport'.symm.trans hnorm + +/-- The base normalized valuation of the abstract norm is the ordinary +normalized valuation of the concrete field norm. -/ +theorem localBaseValuation_normToBase_abstractFixedFieldUnit + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) + [Finite ((baseField (Gal(SeparableClosure K/K))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(SeparableClosure K/K))) H + (le_baseField H))] + [FiniteDimensional K + (abstractFixedField K (SeparableClosure K) H)] + (x : (abstractFixedField K (SeparableClosure K) H)ˣ) : + localBaseValuation K + (normToBase + (galoisAmbientUnitsRep K (SeparableClosure K)) H + (abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H (Additive.ofMul x))) = + Int.castRingHom ZHat + (LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul + (normUnits K (abstractFixedField K (SeparableClosure K) H) x))) := by + let E := abstractFixedField K (SeparableClosure K) H + let a := normToBase + (galoisAmbientUnitsRep K (SeparableClosure K)) H + (abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H (Additive.ofMul x)) + have ha : (baseFieldUnitsEquiv K).symm a = + Additive.ofMul (normUnits K E x) := by + apply (baseFieldUnitsEquiv K).injective + rw [(baseFieldUnitsEquiv K).apply_symm_apply] + apply Subtype.ext + apply Additive.ext + apply Units.ext + calc + ((Additive.toMul + ((normToBase + (galoisAmbientUnitsRep K (SeparableClosure K)) H + (abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H (Additive.ofMul x))).1 : + Additive (SeparableClosure K)ˣ) : + (SeparableClosure K)ˣ) : SeparableClosure K) = + algebraMap K (SeparableClosure K) + (Algebra.norm K (x : E)) := + normToBase_abstractFixedFieldUnit_val_of_isSeparable + K (SeparableClosure K) H x + _ = algebraMap K (SeparableClosure K) + ((normUnits K E x : Kˣ) : K) := by + rw [LocalFieldTheory.normUnits_apply_coe] + _ = + ((Additive.toMul + ((baseFieldUnitsEquiv K + (Additive.ofMul (normUnits K E x))).1 : + Additive (SeparableClosure K)ˣ) : + (SeparableClosure K)ˣ) : SeparableClosure K) := + (baseFieldUnitsEquiv_val K (normUnits K E x)).symm + rw [show normToBase + (galoisAmbientUnitsRep K (SeparableClosure K)) H + (abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H (Additive.ofMul x)) = a from rfl] + change Int.castRingHom ZHat + (LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + ((baseFieldUnitsEquiv K).symm a)) = _ + rw [ha] + +/-- For an arbitrary finite separable abstract field, the image of the +base valuation after the abstract class-formation norm is exactly the actual residue-degree +multiple of the base value group. -/ +theorem localBaseValuation_comp_normToBase_range_eq_residueFinrank + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) + [Finite ((baseField (Gal(SeparableClosure K/K))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(SeparableClosure K/K))) H + (le_baseField H))] + [FiniteDimensional K + (abstractFixedField K (SeparableClosure K) H)] + [ValuativeRel (abstractFixedField K (SeparableClosure K) H)] + [TopologicalSpace (abstractFixedField K (SeparableClosure K) H)] + [IsNonarchimedeanLocalField + (abstractFixedField K (SeparableClosure K) H)] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation + (abstractFixedField K (SeparableClosure K) H))] + [hIntegralClosure : IsIntegralClosure + 𝒪[abstractFixedField K (SeparableClosure K) H] 𝒪[K] + (abstractFixedField K (SeparableClosure K) H)] : + ((localBaseValuation K).comp + (normToBase + (galoisAmbientUnitsRep K (SeparableClosure K)) H)).range = + nsmulImage (localBaseValuation K).range + (Module.finrank 𝓀[K] + 𝓀[abstractFixedField K (SeparableClosure K) H]) := by + let f := Module.finrank 𝓀[K] + 𝓀[abstractFixedField K (SeparableClosure K) H] + ext z + constructor + · rintro ⟨a, rfl⟩ + let x : Additive + (abstractFixedField K (SeparableClosure K) H)ˣ := + (abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H).symm a + have hxa : abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H x = a := + (abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H).apply_symm_apply a + rw [← hxa] + change localBaseValuation K + (normToBase (galoisAmbientUnitsRep K (SeparableClosure K)) H + (abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H + (Additive.ofMul (Additive.toMul x)))) ∈ _ + rw [localBaseValuation_normToBase_abstractFixedFieldUnit] + have hnorm := + @v_normUnits_eq_residue_finrank_mul_of_isSeparable + K (abstractFixedField K (SeparableClosure K) H) + _ _ _ _ _ _ _ _ _ _ _ _ hIntegralClosure (Additive.toMul x) + have hnorm' : + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul + (normUnits K + (abstractFixedField K (SeparableClosure K) H) + (Additive.toMul x))) = + (f : Int) * + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap + (abstractFixedField K (SeparableClosure K) H) x := by + exact hnorm + rw [hnorm', mem_nsmulImage_iff] + refine ⟨Int.castRingHom ZHat + (LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap + (abstractFixedField K (SeparableClosure K) H) x), + intToProCInteger_mem_localBaseValuation_range K _, ?_⟩ + rw [← map_nsmul] + congr 1 + · rw [mem_nsmulImage_iff] + rintro ⟨w, hw, hwz⟩ + rw [localBaseValuation_range K] at hw + obtain ⟨m, rfl⟩ := hw + obtain ⟨x, hx⟩ := + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_surjective + (abstractFixedField K (SeparableClosure K) H) m + refine ⟨abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H x, ?_⟩ + change localBaseValuation K + (normToBase (galoisAmbientUnitsRep K (SeparableClosure K)) H + (abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H + (Additive.ofMul (Additive.toMul x)))) = z + rw [localBaseValuation_normToBase_abstractFixedFieldUnit] + have hnorm := + @v_normUnits_eq_residue_finrank_mul_of_isSeparable + K (abstractFixedField K (SeparableClosure K) H) + _ _ _ _ _ _ _ _ _ _ _ _ hIntegralClosure (Additive.toMul x) + have hnorm' : + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul + (normUnits K + (abstractFixedField K (SeparableClosure K) H) + (Additive.toMul x))) = + (f : Int) * + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap + (abstractFixedField K (SeparableClosure K) H) x := by + exact hnorm + rw [hnorm', hx] + calc + Int.castRingHom ZHat + ((f : Int) * m) = + f • Int.castRingHom ZHat m := by + rw [← map_nsmul] + congr 1 + _ = z := hwz + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldUnits.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldUnits.lean new file mode 100644 index 0000000000..166500a864 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldUnits.lean @@ -0,0 +1,306 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TateTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FieldRepresentation + +/-! # Abstract Fixed Field Units -/ + +@[expose] public section +namespace LocalClassFieldTheory +open RamificationTheory CyclicCohomology KummerTheory + +open LocalFieldTheory + +open ClassFormation + +/-! +# The local class-field-axiom theorem: units in an abstract finite fixed-field tower + +For a finite abstract tower represented by closed subgroups `L ≤ K`, this +file identifies the descended coefficient representation on `A_L` with the +ordinary representation of `Gal(L/K)` on the units of the concrete upper +fixed field. Both the carrier and the action are compared; the latter is +essential for transporting the actual Tate groups rather than only their +underlying norm quotients. +-/ + +noncomputable +section + +open CategoryTheory + +variable (k Ω : Type) [Field k] [Field Ω] [Algebra k Ω] [IsGalois k Ω] + +/-- Units of the concrete fixed field represented by an arbitrary closed +subgroup, identified directly with the corresponding fixed coefficients. -/ +def abstractFixedFieldUnitsEquivGaloisFixed + (H : ClosedSubgroup (Gal(Ω/k))) : + Additive (abstractFixedField k Ω H)ˣ ≃+ + ambientFixedAddSubgroup (galoisAmbientUnitsRep k Ω) H where + toFun x := ⟨intermediateFieldUnitsToGaloisAmbient k Ω + (abstractFixedField k Ω H) x, by + intro σ + apply Additive.ext + apply Units.ext + exact (IntermediateField.mem_fixedField_iff H.toSubgroup + ((Additive.toMul x : (abstractFixedField k Ω H)ˣ) : Ω)).1 + (Additive.toMul x : (abstractFixedField k Ω H)ˣ).1.property σ.1 σ.2⟩ + invFun a := by + have ha : ((Additive.toMul a.1 : Ωˣ) : Ω) ∈ + abstractFixedField k Ω H := by + rw [IntermediateField.mem_fixedField_iff] + intro σ hσ + have hfixed := a.2 ⟨σ, hσ⟩ + exact congrArg + (fun z : Additive Ωˣ => ((Additive.toMul z : Ωˣ) : Ω)) hfixed + let y₀ : abstractFixedField k Ω H := + ⟨((Additive.toMul a.1 : Ωˣ) : Ω), ha⟩ + have hy₀ : y₀ ≠ 0 := by + intro h + have h' : ((Additive.toMul a.1 : Ωˣ) : Ω) = 0 := + congrArg (abstractFixedField k Ω H).val h + exact (Additive.toMul a.1 : Ωˣ).ne_zero h' + exact Additive.ofMul (Units.mk0 y₀ hy₀) + left_inv x := by + apply Additive.ext + apply Units.ext + rfl + right_inv a := by + apply Subtype.ext + apply Additive.ext + apply Units.ext + rfl + map_add' _ _ := by + apply Subtype.ext + rfl + +omit [IsGalois k Ω] in +/-- States the theorem `abstractFixedFieldUnitsEquivGaloisFixed_coe`. -/ +@[simp] +theorem abstractFixedFieldUnitsEquivGaloisFixed_coe + (H : ClosedSubgroup (Gal(Ω/k))) + (x : Additive (abstractFixedField k Ω H)ˣ) : + ((abstractFixedFieldUnitsEquivGaloisFixed k Ω H x).1 : + Additive Ωˣ) = + intermediateFieldUnitsToGaloisAmbient k Ω + (abstractFixedField k Ω H) x := + rfl + +/-- Scalar extension from the lower fixed field does not change the +underlying upper field or its unit group. -/ +def abstractRelativeFixedFieldUnitsEquivGaloisFixed + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) : + Additive (abstractRelativeFixedField k Ω hLK)ˣ ≃+ + ambientFixedAddSubgroup (galoisAmbientUnitsRep k Ω) L := by + change Additive (abstractFixedField k Ω L)ˣ ≃+ _ + exact abstractFixedFieldUnitsEquivGaloisFixed k Ω L + +omit [IsGalois k Ω] in +/-- States the theorem `abstractRelativeFixedFieldUnitsEquivGaloisFixed_coe`. -/ +@[simp] +theorem abstractRelativeFixedFieldUnitsEquivGaloisFixed_coe + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (x : Additive (abstractRelativeFixedField k Ω hLK)ˣ) : + ((abstractRelativeFixedFieldUnitsEquivGaloisFixed + k Ω K L hLK x).1 : Additive Ωˣ) = + intermediateFieldUnitsToGaloisAmbient k Ω + (abstractFixedField k Ω L) x := + rfl + +/-- Carrier comparison between the descended class-formation representation and +the actual unit group of the upper concrete fixed field. -/ +def abstractExtensionFixedRepresentationUnitsEquiv + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) : + (extensionFixedRepresentation (galoisAmbientUnitsRep k Ω) + K L hLK hnormal).V ≃+ + Additive (abstractRelativeFixedField k Ω hLK)ˣ := + (extensionFixedRepresentationEquiv (galoisAmbientUnitsRep k Ω) + K L hLK hnormal).trans + (abstractRelativeFixedFieldUnitsEquivGaloisFixed + k Ω K L hLK).symm + +omit [IsGalois k Ω] in +/-- States the theorem `abstractRelativeUnitsEquiv_extensionUnitsEquiv`. -/ +@[simp] +theorem abstractRelativeUnitsEquiv_extensionUnitsEquiv + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (x : (extensionFixedRepresentation (galoisAmbientUnitsRep k Ω) + K L hLK hnormal).V) : + abstractRelativeFixedFieldUnitsEquivGaloisFixed k Ω K L hLK + (abstractExtensionFixedRepresentationUnitsEquiv + k Ω K L hLK hnormal x) = + extensionFixedRepresentationEquiv + (galoisAmbientUnitsRep k Ω) K L hLK hnormal x := by + exact (abstractRelativeFixedFieldUnitsEquivGaloisFixed + k Ω K L hLK).apply_symm_apply + (extensionFixedRepresentationEquiv + (galoisAmbientUnitsRep k Ω) K L hLK hnormal x) + +/-- On a quotient representative, the concrete relative Galois +automorphism is restriction of the same ambient automorphism. -/ +theorem abstractExtensionQuotientEquivGaloisGroup_mk_apply_val + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (σ : K.toSubgroup) + (x : abstractRelativeFixedField k Ω hLK) : + letI := hnormal + σ.1 (x : Ω) = + (((abstractExtensionQuotientEquivGaloisGroup + k Ω K L hLK hnormal + (QuotientGroup.mk' (extensionSubgroup K L hLK) σ)) x : + abstractRelativeFixedField k Ω hLK) : Ω) := by + let := hnormal + let : (abstractRelativeFixedField k Ω hLK).fixingSubgroup.Normal := + abstractRelativeFixingSubgroup_normal k Ω K L hLK hnormal + let H : ClosedSubgroup (Gal(Ω/abstractFixedField k Ω K)) := + closedFixingSubgroup (abstractFixedField k Ω K) Ω + (abstractRelativeFixedField k Ω hLK) + let : H.toSubgroup.Normal := + abstractRelativeFixingSubgroup_normal k Ω K L hLK hnormal + have hq : + abstractExtensionQuotientEquivAmbient k Ω K L hLK hnormal + (QuotientGroup.mk' (extensionSubgroup K L hLK) σ) = + QuotientGroup.mk' + (abstractRelativeFixedField k Ω hLK).fixingSubgroup + (abstractSubgroupEquivGaloisGroup k Ω K σ) := by + rfl + rw [abstractExtensionQuotientEquivGaloisGroup, MulEquiv.trans_apply, hq, + MulEquiv.trans_apply] + change σ.1 (x : Ω) = + ((((IntermediateField.equivOfEq + (InfiniteGalois.fixedField_fixingSubgroup + (abstractRelativeFixedField k Ω hLK))).autCongr + (InfiniteGalois.normalAutEquivQuotient + (closedFixingSubgroup (abstractFixedField k Ω K) Ω + (abstractRelativeFixedField k Ω hLK)) + ((abstractSubgroupEquivGaloisGroup k Ω K σ : + Gal(Ω/abstractFixedField k Ω K)) : + Gal(Ω/abstractFixedField k Ω K) ⧸ + (abstractRelativeFixedField k Ω hLK).fixingSubgroup))) x : + abstractRelativeFixedField k Ω hLK) : Ω) + rw [InfiniteGalois.normalAutEquivQuotient_apply, + AlgEquiv.autCongr_apply] + simp only [AlgEquiv.trans_apply, IntermediateField.equivOfEq_symm, + IntermediateField.equivOfEq_apply] + change σ.1 (x : Ω) = + (((AlgEquiv.restrictNormalHom + (IntermediateField.fixedField H.toSubgroup) + (abstractSubgroupEquivGaloisGroup k Ω K σ)) + ⟨(x : Ω), _⟩ : IntermediateField.fixedField H.toSubgroup) : Ω) + rw [AlgEquiv.restrictNormalHom_apply] + rfl + +/-- The abstract coset action on an upper fixed-field unit is the ordinary +action of the corresponding concrete relative Galois automorphism. -/ +theorem relativeCosetAction_abstractRelativeFixedFieldUnit_val + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (x : Additive (abstractRelativeFixedField k Ω hLK)ˣ) + (q : K.toSubgroup ⧸ extensionSubgroup K L hLK) : + letI := hnormal + ((Additive.toMul + (relativeCosetAction (galoisAmbientUnitsRep k Ω) + K L hLK + (abstractRelativeFixedFieldUnitsEquivGaloisFixed + k Ω K L hLK x) q) : Ωˣ) : Ω) = + (((Additive.toMul + ((Rep.ofAlgebraAutOnUnits (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK)).ρ + (abstractExtensionQuotientEquivGaloisGroup + k Ω K L hLK hnormal q) x) : + (abstractRelativeFixedField k Ω hLK)ˣ) : + abstractRelativeFixedField k Ω hLK) : Ω) := by + let := hnormal + refine Quotient.inductionOn' q ?_ + intro σ + rw [relativeCosetAction_mk] + change σ.1 ((Additive.toMul x : + (abstractRelativeFixedField k Ω hLK)ˣ) : Ω) = _ + exact abstractExtensionQuotientEquivGaloisGroup_mk_apply_val + k Ω K L hLK hnormal σ + (Additive.toMul x : (abstractRelativeFixedField k Ω hLK)ˣ) + +/-- The carrier comparison intertwines the descended quotient action with +the actual relative Galois action. -/ +theorem abstractExtensionFixedRepresentationUnitsEquiv_action + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (q : K.toSubgroup ⧸ extensionSubgroup K L hLK) + (x : (extensionFixedRepresentation (galoisAmbientUnitsRep k Ω) + K L hLK hnormal).V) : + letI := hnormal + abstractExtensionFixedRepresentationUnitsEquiv k Ω K L hLK hnormal + ((extensionFixedRepresentation (galoisAmbientUnitsRep k Ω) + K L hLK hnormal).ρ q x) = + (Rep.ofAlgebraAutOnUnits (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK)).ρ + (abstractExtensionQuotientEquivGaloisGroup + k Ω K L hLK hnormal q) + (abstractExtensionFixedRepresentationUnitsEquiv + k Ω K L hLK hnormal x) := by + let := hnormal + let eFixed := abstractRelativeFixedFieldUnitsEquivGaloisFixed + k Ω K L hLK + apply eFixed.injective + rw [abstractRelativeUnitsEquiv_extensionUnitsEquiv] + apply Subtype.ext + apply Additive.ext + apply Units.ext + have haction := extensionFixedRepresentation_action_coe + (galoisAmbientUnitsRep k Ω) K L hLK hnormal q x + change + ((Additive.toMul + ((extensionFixedRepresentation (galoisAmbientUnitsRep k Ω) + K L hLK hnormal).ρ q x).1 : Ωˣ) : Ω) = _ + rw [haction] + rw [← abstractRelativeUnitsEquiv_extensionUnitsEquiv + k Ω K L hLK hnormal x] + exact relativeCosetAction_abstractRelativeFixedFieldUnit_val + k Ω K L hLK hnormal + (abstractExtensionFixedRepresentationUnitsEquiv + k Ω K L hLK hnormal x) q + +/-- Representation-level form of the fixed-field unit comparison. The +concrete unit representation is reindexed along the canonical isomorphism +from the abstract class-formation quotient to the actual relative Galois group. -/ +def abstractExtensionFixedRepresentationIsoUnitsRes + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) : + letI := hnormal + extensionFixedRepresentation (galoisAmbientUnitsRep k Ω) + K L hLK hnormal ≅ + Rep.res + (abstractExtensionQuotientEquivGaloisGroup + k Ω K L hLK hnormal).toMonoidHom + (Rep.ofAlgebraAutOnUnits (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK)) := by + letI := hnormal + let e := abstractExtensionFixedRepresentationUnitsEquiv + k Ω K L hLK hnormal + refine Rep.mkIso (Representation.Equiv.mk e.toIntLinearEquiv ?_) + intro q + apply LinearMap.ext + intro x + exact abstractExtensionFixedRepresentationUnitsEquiv_action + k Ω K L hLK hnormal q x + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/All.lean new file mode 100644 index 0000000000..a6df126791 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/All.lean @@ -0,0 +1,69 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbsoluteUnitsFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityPrimeNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConjugationNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilySubgroupKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyUnramifiedCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteGaloisRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFinrankTransfer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueValuationComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteSubgroupResidueDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldContinuousNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldLocalData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldNormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldRelativeNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.HenselianValuationBase +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntermediateFieldNormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalClassFieldAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalResidueDatum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueActionIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicClosureDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicallyClosed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueDatum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SemilinearNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableFixedFieldNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableNormProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TateTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedResidueUniqueness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ValuationSemilinear +/-! +# Finite local reciprocity + +Exhaustive aggregate for the finite-level reciprocity equivalence, the continuous local Artin map, +its norm kernel and surjectivity, and the local class-formation construction beneath them. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean new file mode 100644 index 0000000000..f45d744c83 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean @@ -0,0 +1,1128 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData + +/-! # Concrete Reciprocity Canonical -/ + +@[expose] public section +namespace LocalClassFieldTheory +open RamificationTheory CyclicCohomology KummerTheory + +open LocalFieldTheory + +open ClassFormation + +/-! +# Finite local reciprocity: canonicity of local reciprocity + +The construction of local reciprocity realizes a finite Galois extension in +a fixed separable closure. This file proves that the transported reciprocity +isomorphism is independent of that realization. Two embeddings are extended +to an automorphism of the separable closure, and +the abstract reciprocity naturality theorem supplies the required naturality. +-/ + +noncomputable +section + +variable (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +local notation "G" => intrinsicAbsoluteGalois + +local notation "AG" => intrinsicAbsoluteUnits + +local notation "B" => intrinsicAbstractBase + +/-! ## Conjugating two realizations -/ + +/-- An automorphism of the separable closure carrying the image of `i` to +the image of `j`. -/ +def finiteGaloisEmbeddingConjugator + (i j : L →ₐ[K] SeparableClosure K) : G K := + ((finiteGaloisFieldRangeEquivOfEmbedding K L i).symm.trans + (finiteGaloisFieldRangeEquivOfEmbedding K L j)).liftNormal + (SeparableClosure K) + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- The chosen absolute Galois conjugator carries one embedding to the other on every element. -/ +@[simp] +theorem finiteGaloisEmbeddingConjugator_apply + (i j : L →ₐ[K] SeparableClosure K) (x : L) : + finiteGaloisEmbeddingConjugator K L i j (i x) = j x := by + let ei := finiteGaloisFieldRangeEquivOfEmbedding K L i + let ej := finiteGaloisFieldRangeEquivOfEmbedding K L j + let e := ei.symm.trans ej + have hi : + algebraMap (finiteGaloisFieldRangeOfEmbedding K L i) (SeparableClosure K) + (ei x) = i x := by + rfl + have hj : + algebraMap (finiteGaloisFieldRangeOfEmbedding K L j) (SeparableClosure K) + (e (ei x)) = j x := by + dsimp only [e] + rw [AlgEquiv.trans_apply, AlgEquiv.symm_apply_apply] + rfl + change e.liftNormal (SeparableClosure K) (i x) = j x + rw [← hi, e.liftNormal_commutes, hj] + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Composing the first embedding with its conjugator gives the second embedding. -/ +theorem finiteGaloisEmbeddingConjugator_comp + (i j : L →ₐ[K] SeparableClosure K) : + (finiteGaloisEmbeddingConjugator K L i j).toAlgHom.comp i = j := by + ext x + exact congrArg Subtype.val + (finiteGaloisEmbeddingConjugator_apply K L i j x) + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- The two embedded field ranges are related by the chosen Galois conjugator. -/ +theorem finiteGaloisFieldRange_conjugator + (i j : L →ₐ[K] SeparableClosure K) : + finiteGaloisFieldRangeOfEmbedding K L j = + (finiteGaloisFieldRangeOfEmbedding K L i).map + (finiteGaloisEmbeddingConjugator K L i j).toAlgHom := by + let σ := finiteGaloisEmbeddingConjugator K L i j + calc + finiteGaloisFieldRangeOfEmbedding K L j = + AlgHom.fieldRange (σ.toAlgHom.comp i) := by + exact congrArg AlgHom.fieldRange + (finiteGaloisEmbeddingConjugator_comp K L i j).symm + _ = (finiteGaloisFieldRangeOfEmbedding K L i).map σ.toAlgHom := + (AlgHom.map_fieldRange i σ.toAlgHom).symm + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- With the right-exponent convention for abstract reciprocity, the conjugating +element is the inverse of the automorphism carrying `i` to `j`. -/ +theorem finiteGaloisClosedFixingSubgroup_conjugator + (i j : L →ₐ[K] SeparableClosure K) : + conjugateClosedSubgroup + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) + (finiteGaloisEmbeddingConjugator K L i j)⁻¹ = + finiteGaloisClosedFixingSubgroupOfEmbedding K L j := by + let σ := finiteGaloisEmbeddingConjugator K L i j + apply ClosedSubgroup.ext + have hs : + (conjugateClosedSubgroup + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) σ⁻¹).toSubgroup = + (finiteGaloisClosedFixingSubgroupOfEmbedding K L j).toSubgroup := by + ext τ + have hc : τ ∈ (conjugateClosedSubgroup + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) σ⁻¹).toSubgroup ↔ + σ⁻¹ * τ * (σ⁻¹)⁻¹ ∈ + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i).toSubgroup := + conjugateClosedSubgroup_mem + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) σ⁻¹ τ + rw [hc] + change σ⁻¹ * τ * (σ⁻¹)⁻¹ ∈ + (finiteGaloisFieldRangeOfEmbedding K L i).fixingSubgroup ↔ + τ ∈ (finiteGaloisFieldRangeOfEmbedding K L j).fixingSubgroup + rw [finiteGaloisFieldRange_conjugator K L i j] + have hmap := IsGalois.map_fixingSubgroup + (finiteGaloisFieldRangeOfEmbedding K L i) + (finiteGaloisEmbeddingConjugator K L i j) + have hmapmem := congrArg (fun H : Subgroup (G K) => τ ∈ H) hmap + have hmem := Subgroup.mem_pointwise_smul_iff_inv_smul_mem + (a := MulAut.conj (finiteGaloisEmbeddingConjugator K L i j)) + (S := (finiteGaloisFieldRangeOfEmbedding K L i).fixingSubgroup) + (x := τ) + refine Iff.trans ?_ (Iff.of_eq hmapmem.symm) + refine Iff.trans ?_ hmem.symm + simp [σ, mul_assoc] + exact congrArg (fun H : Subgroup (G K) => H.carrier) hs + +/-- The abstract base field is the top subgroup and hence is fixed by every +conjugation. -/ +theorem finiteGaloisBase_conjugator + (σ : G K) : conjugateClosedSubgroup (B K) σ = B K := by + change conjugateClosedSubgroup + (closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))) σ = + closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K)) + apply ClosedSubgroup.ext + have hs : + (conjugateClosedSubgroup + (closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))) σ).toSubgroup = + (closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))).toSubgroup := by + ext τ + have hc : τ ∈ (conjugateClosedSubgroup + (closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))) σ).toSubgroup ↔ + σ * τ * σ⁻¹ ∈ + (closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))).toSubgroup := + conjugateClosedSubgroup_mem + (closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))) σ τ + rw [hc] + change σ * τ * σ⁻¹ ∈ + (⊥ : IntermediateField K (SeparableClosure K)).fixingSubgroup ↔ + τ ∈ (⊥ : IntermediateField K (SeparableClosure K)).fixingSubgroup + rw [IntermediateField.fixingSubgroup_bot] + simp + exact congrArg (fun H : Subgroup (G K) => H.carrier) hs + +/-- The finite quotient attached to an explicit finite Galois realization. -/ +noncomputable instance + finiteGaloisAbstractExtensionOfEmbedding_bundle_finite + (i : L →ₐ[K] SeparableClosure K) : + Finite ((B K).toSubgroup ⧸ + extensionSubgroup (B K) + (finiteGaloisAbstractExtensionOfEmbedding K L i).field + (finiteGaloisAbstractExtensionOfEmbedding K L i).below) := + (finiteGaloisAbstractExtensionOfEmbedding K L i).finite + +/-- Raw quotient bridge for the explicit closed-fixing-subgroup presentation. -/ +noncomputable instance finiteGaloisExtensionQuotientOfEmbedding_finite + (i : L →ₐ[K] SeparableClosure K) : + Finite ((B K).toSubgroup ⧸ + extensionSubgroup (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i))) := + baseFixingExtensionQuotient_finite K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i) + +/-- The representative in the base subgroup obtained by conjugating with +the automorphism carrying `i` to `j`. -/ +def finiteGaloisConjugateBaseElement + (i j : L →ₐ[K] SeparableClosure K) (τ : (B K).toSubgroup) : + (B K).toSubgroup := + ⟨finiteGaloisEmbeddingConjugator K L i j * τ.1 * + (finiteGaloisEmbeddingConjugator K L i j)⁻¹, by + change _ ∈ (⊥ : IntermediateField K (SeparableClosure K)).fixingSubgroup + rw [IntermediateField.fixingSubgroup_bot] + exact Subgroup.mem_top _⟩ + +/-! ## The two vertical maps of the abstract reciprocity naturality theorem -/ + +/-- Transport an extension quotient along equalities of the base and top subgroups. -/ +noncomputable def extensionQuotientCongr + {Γ : Type} [Group Γ] [TopologicalSpace Γ] + {K L K' L' : ClosedSubgroup Γ} + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + [hN : (extensionSubgroup K L hLK).Normal] + [hN' : (extensionSubgroup K' L' hL'K').Normal] + (hK : K = K') (hL : L = L') : + (K.toSubgroup ⧸ extensionSubgroup K L hLK) ≃* + (K'.toSubgroup ⧸ extensionSubgroup K' L' hL'K') := by + subst K' + subst L' + have hp : hLK = hL'K' := Subsingleton.elim _ _ + subst hL'K' + exact MulEquiv.refl _ + +@[simp] +private theorem extensionQuotientCongr_mk + {Γ : Type} [Group Γ] [TopologicalSpace Γ] + {K L K' L' : ClosedSubgroup Γ} + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + [hN : (extensionSubgroup K L hLK).Normal] + [hN' : (extensionSubgroup K' L' hL'K').Normal] + (hK : K = K') (hL : L = L') (x : K.toSubgroup) : + extensionQuotientCongr hLK hL'K' hK hL (QuotientGroup.mk x) = + QuotientGroup.mk + (MulEquiv.subgroupCongr + (congrArg (fun H : ClosedSubgroup Γ => H.toSubgroup) hK) x) := by + subst K' + subst L' + have hp : hLK = hL'K' := Subsingleton.elim _ _ + subst hL'K' + have hn : hN = hN' := Subsingleton.elim _ _ + subst hN' + rfl + +/-- Transport a finite norm quotient along equalities of its base and top subgroups. -/ +noncomputable def finiteNormQuotientCongr + {Γ : Type} [Group Γ] [TopologicalSpace Γ] + (A : Rep ℤ Γ) {K L K' L' : ClosedSubgroup Γ} + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + [hFinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [hFinite' : Finite (K'.toSubgroup ⧸ extensionSubgroup K' L' hL'K')] + (hK : K = K') (hL : L = L') : + FiniteNormQuotient A K L hLK ≃+ + FiniteNormQuotient A K' L' hL'K' := by + subst K' + subst L' + have hp : hLK = hL'K' := Subsingleton.elim _ _ + subst hL'K' + exact AddEquiv.refl _ + +@[simp] +private theorem finiteNormQuotientCongr_finiteNormClass + {Γ : Type} [Group Γ] [TopologicalSpace Γ] + (A : Rep ℤ Γ) {K L K' L' : ClosedSubgroup Γ} + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + [hFinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [hFinite' : Finite (K'.toSubgroup ⧸ extensionSubgroup K' L' hL'K')] + (hK : K = K') (hL : L = L') + (a : ambientFixedAddSubgroup A K) : + finiteNormQuotientCongr A hLK hL'K' hK hL + (finiteNormClass A K L hLK a) = + finiteNormClass A K' L' hL'K' + (AddEquiv.addSubgroupCongr + (congrArg (ambientFixedAddSubgroup A) hK) a) := by + subst K' + subst L' + have hp : hLK = hL'K' := Subsingleton.elim _ _ + subst hL'K' + have hf : hFinite = hFinite' := Subsingleton.elim _ _ + subst hFinite' + rfl + +/-- Equality transport of both sides of the norm-residue symbol. This is +the dependent-type form of replacing equal abstract fields in the abstract +reciprocity naturality theorem. -/ +private theorem normResidueSymbol_congr + {Γ : Type} [Group Γ] [TopologicalSpace Γ] + (D : DegreeData Γ) (A : Rep ℤ Γ) (v : ValuationData D A) + (hcf : SatisfiesClassFieldAxiom A) + [IsTopologicalGroup Γ] [CompactSpace Γ] [T2Space Γ] + [TotallyDisconnectedSpace Γ] + (K L K' L' : ClosedSubgroup Γ) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + [hNormal : (extensionSubgroup K L hLK).Normal] + [hNormal' : (extensionSubgroup K' L' hL'K').Normal] + [hFinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [hFinite' : Finite (K'.toSubgroup ⧸ extensionSubgroup K' L' hL'K')] + [hAbsolute : Finite ((baseField Γ).toSubgroup ⧸ + extensionSubgroup (baseField Γ) K (le_baseField K))] + [hAbsolute' : Finite ((baseField Γ).toSubgroup ⧸ + extensionSubgroup (baseField Γ) K' (le_baseField K'))] + (hK : K = K') (hL : L = L') : + let E : FiniteGaloisSubextension K := + ⟨L, hLK, hNormal, hFinite⟩ + let E' : FiniteGaloisSubextension K' := + ⟨L', hL'K', hNormal', hFinite'⟩ + let KF : FiniteAbstractField Γ := ⟨K, hAbsolute⟩ + let K'F : FiniteAbstractField Γ := ⟨K', hAbsolute'⟩ + let q := MulEquiv.toAdditive + ((extensionQuotientCongr hLK hL'K' hK hL).abelianizationCongr) + let b := finiteNormQuotientCongr A + (hFinite := hFinite) (hFinite' := hFinite') + hLK hL'K' hK hL + q.toAddMonoidHom.comp + (D.normResidueSymbol A v hcf KF E).toAddMonoidHom = + (D.normResidueSymbol A v hcf K'F E').toAddMonoidHom.comp + b.toAddMonoidHom := by + subst K' + subst L' + have hp : hLK = hL'K' := Subsingleton.elim _ _ + subst hL'K' + have hn : hNormal = hNormal' := Subsingleton.elim _ _ + subst hNormal' + have hf : hFinite = hFinite' := Subsingleton.elim _ _ + subst hFinite' + have ha : hAbsolute = hAbsolute' := Subsingleton.elim _ _ + subst hAbsolute' + simp only [extensionQuotientCongr, abelianizationCongr_refl, AddEquiv.toAddMonoidHom_eq_coe, + finiteNormQuotientCongr, AddEquiv.coe_addMonoidHom_refl, AddMonoidHom.comp_id] + apply AddMonoidHom.ext + intro x + rfl + +section EmbeddingConjugation + +private theorem finiteGaloisEmbeddingConjugate_normal + (i : L →ₐ[K] SeparableClosure K) (s : G K) : + (extensionSubgroup (conjugateClosedSubgroup (B K) s) + (conjugateClosedSubgroup + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) s) + (conjugateClosedSubgroup_mono + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i)) s)).Normal := + conjugateExtension_normal (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i)) s + (hLnormal := (finiteGaloisAbstractExtensionOfEmbedding K L i).normal) + +attribute [local instance] finiteGaloisEmbeddingConjugate_normal + +/-- Conjugation between the two concrete presentations of the abstract extension quotient. -/ +def finiteGaloisConjugationOfEmbeddings + (i j : L →ₐ[K] SeparableClosure K) : + (finiteGaloisAbstractExtensionOfEmbedding K L i).extensionQuotient ≃* + (finiteGaloisAbstractExtensionOfEmbedding K L j).extensionQuotient := by + let hLK : (finiteGaloisClosedFixingSubgroupOfEmbedding K L i).toSubgroup ≤ + (B K).toSubgroup := + fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i) + let s := (finiteGaloisEmbeddingConjugator K L i j)⁻¹ + have hB := finiteGaloisBase_conjugator K + (finiteGaloisEmbeddingConjugator K L i j)⁻¹ + have hH := finiteGaloisClosedFixingSubgroup_conjugator K L i j + letI : (extensionSubgroup (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) hLK).Normal := + (finiteGaloisAbstractExtensionOfEmbedding K L i).normal + letI : (extensionSubgroup (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L j) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L j))).Normal := + (finiteGaloisAbstractExtensionOfEmbedding K L j).normal + let e := finiteReciprocityNaturalityConjugation (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) + hLK s (hLnormal := (finiteGaloisAbstractExtensionOfEmbedding K L i).normal) + let c := extensionQuotientCongr + (hN := by exact finiteGaloisEmbeddingConjugate_normal K L i s) + (hN' := (finiteGaloisAbstractExtensionOfEmbedding K L j).normal) + (conjugateClosedSubgroup_mono hLK s) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L j)) hB hH + exact + ((finiteGaloisAbstractExtensionOfEmbedding K L i).extensionQuotientMulEquiv.trans + (e.trans c)).trans + (finiteGaloisAbstractExtensionOfEmbedding K L j).extensionQuotientMulEquiv.symm + +/-- Conjugation between embedding models sends a quotient representative to its conjugate class. -/ +@[simp] +theorem finiteGaloisConjugationOfEmbeddings_mk + (i j : L →ₐ[K] SeparableClosure K) (τ : (B K).toSubgroup) : + finiteGaloisConjugationOfEmbeddings K L i j (QuotientGroup.mk τ) = + QuotientGroup.mk (finiteGaloisConjugateBaseElement K L i j τ) := by + let hLK := fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i) + change (finiteGaloisClosedFixingSubgroupOfEmbedding K L i).toSubgroup ≤ + (B K).toSubgroup at hLK + let hLjK := fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L j) + change (finiteGaloisClosedFixingSubgroupOfEmbedding K L j).toSubgroup ≤ + (B K).toSubgroup at hLjK + let s := (finiteGaloisEmbeddingConjugator K L i j)⁻¹ + have hB := finiteGaloisBase_conjugator K s + have hH : conjugateClosedSubgroup + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) s = + finiteGaloisClosedFixingSubgroupOfEmbedding K L j := + finiteGaloisClosedFixingSubgroup_conjugator K L i j + change extensionQuotientCongr + (conjugateClosedSubgroup_mono hLK s) + hLjK hB hH + (finiteReciprocityNaturalityConjugation (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) hLK s + (QuotientGroup.mk τ)) = _ + rw [finiteReciprocityNaturalityConjugation_mk, extensionQuotientCongr_mk] + apply congrArg QuotientGroup.mk + apply Subtype.ext + simp [finiteGaloisConjugateBaseElement, + conjugateSubgroupEquiv_apply_coe, s, mul_assoc] + +private theorem finiteGaloisConjugationOfEmbeddings_apply_factor + (i j : L →ₐ[K] SeparableClosure K) + (z : (finiteGaloisAbstractExtensionOfEmbedding K L i).extensionQuotient) : + let hLK := fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i) + let s := (finiteGaloisEmbeddingConjugator K L i j)⁻¹ + let hB := finiteGaloisBase_conjugator K s + let hH := finiteGaloisClosedFixingSubgroup_conjugator K L i j + finiteGaloisConjugationOfEmbeddings K L i j z = + extensionQuotientCongr + (conjugateClosedSubgroup_mono hLK s) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L j)) hB hH + (finiteReciprocityNaturalityConjugation (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) hLK s z) := by + dsimp only + unfold finiteGaloisConjugationOfEmbeddings + rfl + +private theorem finiteGaloisConjugationOfEmbeddings_abelianization_factor + (i j : L →ₐ[K] SeparableClosure K) + (z : Abelianization + (finiteGaloisAbstractExtensionOfEmbedding K L i).extensionQuotient) : + let hLK := fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i) + let s := (finiteGaloisEmbeddingConjugator K L i j)⁻¹ + let hB := finiteGaloisBase_conjugator K s + let hH := finiteGaloisClosedFixingSubgroup_conjugator K L i j + (finiteGaloisConjugationOfEmbeddings K L i j).abelianizationCongr z = + (extensionQuotientCongr + (conjugateClosedSubgroup_mono hLK s) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L j)) hB hH).abelianizationCongr + ((finiteReciprocityNaturalityConjugation (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) + hLK s).abelianizationCongr z) := by + dsimp only + let hLK : (finiteGaloisClosedFixingSubgroupOfEmbedding K L i).toSubgroup ≤ + (B K).toSubgroup := + fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i) + let hLjK : (finiteGaloisClosedFixingSubgroupOfEmbedding K L j).toSubgroup ≤ + (B K).toSubgroup := + fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L j) + let s := (finiteGaloisEmbeddingConjugator K L i j)⁻¹ + let e := finiteReciprocityNaturalityConjugation (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) hLK s + let c := extensionQuotientCongr + (K := conjugateClosedSubgroup (B K) s) + (L := conjugateClosedSubgroup + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) s) + (K' := B K) (L' := finiteGaloisClosedFixingSubgroupOfEmbedding K L j) + (conjugateClosedSubgroup_mono hLK s) hLjK + (finiteGaloisBase_conjugator K s) + (finiteGaloisClosedFixingSubgroup_conjugator K L i j) + refine QuotientGroup.induction_on z ?_ + intro x + change + (finiteGaloisConjugationOfEmbeddings K L i j).abelianizationCongr + (Abelianization.of x) = + c.abelianizationCongr (e.abelianizationCongr (Abelianization.of x)) + exact (abelianizationCongr_of + (finiteGaloisConjugationOfEmbeddings K L i j) x).trans + ((congrArg Abelianization.of + (finiteGaloisConjugationOfEmbeddings_apply_factor K L i j x)).trans + ((abelianizationCongr_of c (e x)).symm.trans + (congrArg c.abelianizationCongr (abelianizationCongr_of e x).symm))) + +section EmbeddingNormConjugation + +@[instance_reducible] +private def finiteGaloisEmbeddingNormAddZeroClass + (i : L →ₐ[K] SeparableClosure K) := + letI : Finite ((B K).toSubgroup ⧸ + extensionSubgroup (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i))) := + finiteGaloisExtensionQuotientOfEmbedding_finite K L i + show AddZeroClass (FiniteNormQuotient (AG K) (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i))) from + (finiteNormQuotientAddCommGroup (AG K) (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i))).toAddZeroClass + +attribute [local instance] finiteGaloisEmbeddingNormAddZeroClass + +/-- Conjugation on the finite norm quotients, rewritten so that both its +source and target use the fixed concrete base subgroup. -/ +def finiteGaloisNormConjugationOfEmbeddings + (i j : L →ₐ[K] SeparableClosure K) : + FiniteNormQuotient (AG K) (B K) + (finiteGaloisAbstractExtensionOfEmbedding K L i).field + (finiteGaloisAbstractExtensionOfEmbedding K L i).below →+ + FiniteNormQuotient (AG K) (B K) + (finiteGaloisAbstractExtensionOfEmbedding K L j).field + (finiteGaloisAbstractExtensionOfEmbedding K L j).below := by + let hLK : (finiteGaloisClosedFixingSubgroupOfEmbedding K L i).toSubgroup ≤ + (B K).toSubgroup := + fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i) + let s := (finiteGaloisEmbeddingConjugator K L i j)⁻¹ + have hB := finiteGaloisBase_conjugator K + (finiteGaloisEmbeddingConjugator K L i j)⁻¹ + have hH := finiteGaloisClosedFixingSubgroup_conjugator K L i j + let e := finiteReciprocityNaturalityConjugationNormMap (AG K) (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) + hLK s + letI := finite_conjugateExtension (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) hLK s + letI : AddZeroClass (FiniteNormQuotient (AG K) + (conjugateClosedSubgroup (B K) s) + (conjugateClosedSubgroup (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) s) + (conjugateClosedSubgroup_mono hLK s)) := + (finiteNormQuotientAddCommGroup (AG K) + (conjugateClosedSubgroup (B K) s) + (conjugateClosedSubgroup (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) s) + (conjugateClosedSubgroup_mono hLK s)).toAddZeroClass + letI : AddZeroClass (FiniteNormQuotient (AG K) (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L j) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L j))) := + (finiteNormQuotientAddCommGroup (AG K) (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L j) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L j))).toAddZeroClass + let c := finiteNormQuotientCongr (AG K) + (K := conjugateClosedSubgroup (B K) s) + (L := conjugateClosedSubgroup + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) s) + (K' := B K) (L' := finiteGaloisClosedFixingSubgroupOfEmbedding K L j) + (hFinite := finite_conjugateExtension (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) hLK s) + (hFinite' := finiteGaloisExtensionQuotientOfEmbedding_finite K L j) + (conjugateClosedSubgroup_mono hLK s) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L j)) hB hH + have hi : + (finiteGaloisAbstractExtensionOfEmbedding K L i).field = + finiteGaloisClosedFixingSubgroupOfEmbedding K L i := rfl + have hj : + finiteGaloisClosedFixingSubgroupOfEmbedding K L j = + (finiteGaloisAbstractExtensionOfEmbedding K L j).field := rfl + let pre := finiteNormQuotientCongr (AG K) + (hFinite := + finiteGaloisAbstractExtensionOfEmbedding_bundle_finite K L i) + (hFinite' := finiteGaloisExtensionQuotientOfEmbedding_finite K L i) + (finiteGaloisAbstractExtensionOfEmbedding K L i).below hLK rfl hi + let post := finiteNormQuotientCongr (AG K) + (hFinite := finiteGaloisExtensionQuotientOfEmbedding_finite K L j) + (hFinite' := + finiteGaloisAbstractExtensionOfEmbedding_bundle_finite K L j) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L j)) + (finiteGaloisAbstractExtensionOfEmbedding K L j).below rfl hj + exact post.toAddMonoidHom.comp + (c.toAddMonoidHom.comp (e.comp pre.toAddMonoidHom)) + +end EmbeddingNormConjugation + +private theorem finiteGaloisNormConjugationOfEmbeddings_apply_factor + (i j : L →ₐ[K] SeparableClosure K) + (a : FiniteNormQuotient (AG K) (B K) + (finiteGaloisAbstractExtensionOfEmbedding K L i).field + (finiteGaloisAbstractExtensionOfEmbedding K L i).below) : + let hLK := fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i) + let s := (finiteGaloisEmbeddingConjugator K L i j)⁻¹ + let hB := finiteGaloisBase_conjugator K s + let hH := finiteGaloisClosedFixingSubgroup_conjugator K L i j + finiteGaloisNormConjugationOfEmbeddings K L i j a = + finiteNormQuotientCongr (AG K) + (hFinite := finite_conjugateExtension (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) hLK s) + (hFinite' := finiteGaloisExtensionQuotientOfEmbedding_finite K L j) + (conjugateClosedSubgroup_mono hLK s) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L j)) hB hH + (finiteReciprocityNaturalityConjugationNormMap (AG K) (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) hLK s a) := by + dsimp only + unfold finiteGaloisNormConjugationOfEmbeddings + rfl + +/-! ## Concrete comparison on representatives -/ + +private theorem baseFixingExtensionQuotientEquivGaloisGroup_mk_apply + (K Ω : Type) [Field K] [Field Ω] [Algebra K Ω] [IsGalois K Ω] + (E : IntermediateField K Ω) [FiniteDimensional K E] [IsGalois K E] + (τ : (closedFixingSubgroup K Ω + (⊥ : IntermediateField K Ω)).toSubgroup) (x : E) : + E.val ((baseFixingExtensionQuotientEquivGaloisGroup K Ω E + (QuotientGroup.mk τ)) x) = τ.1 (E.val x) := by + have hq : + baseFixingExtensionQuotientEquivAmbient K Ω E + (QuotientGroup.mk τ) = + QuotientGroup.mk' (closedFixingSubgroup K Ω E).toSubgroup τ.1 := by + rfl + have hn := InfiniteGalois.normalAutEquivQuotient_apply + (closedFixingSubgroup K Ω E) τ.1 + change InfiniteGalois.normalAutEquivQuotient (closedFixingSubgroup K Ω E) + (QuotientGroup.mk' _ τ.1) = _ at hn + rw [baseFixingExtensionQuotientEquivGaloisGroup, MulEquiv.trans_apply, hq, + MulEquiv.trans_apply, hn, AlgEquiv.autCongr_apply] + simp only [AlgEquiv.trans_apply, IntermediateField.equivOfEq_symm, + IntermediateField.equivOfEq_apply] + change + (((AlgEquiv.restrictNormalHom + (IntermediateField.fixedField + (closedFixingSubgroup K Ω E).toSubgroup) τ.1) + ⟨E.val x, _⟩ : IntermediateField.fixedField + (closedFixingSubgroup K Ω E).toSubgroup) : Ω) = + τ.1 (E.val x) + calc + (((AlgEquiv.restrictNormalHom + (IntermediateField.fixedField + (closedFixingSubgroup K Ω E).toSubgroup) τ.1) + ⟨E.val x, _⟩ : IntermediateField.fixedField + (closedFixingSubgroup K Ω E).toSubgroup) : Ω) = + τ.1 (E.val x) := by + rw [AlgEquiv.restrictNormalHom_apply] + +/-- Formula for the quotient equivalence on a representative, expressed +without mentioning the auxiliary fixed-field equality used internally. -/ +@[simp] +theorem finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding_mk_apply + (i : L →ₐ[K] SeparableClosure K) (τ : (B K).toSubgroup) (x : L) : + i ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i + (QuotientGroup.mk τ)) x) = τ.1 (i x) := by + let E := finiteGaloisFieldRangeOfEmbedding K L i + let e := finiteGaloisFieldRangeEquivOfEmbedding K L i + let g := baseFixingExtensionQuotientEquivGaloisGroup + K (SeparableClosure K) E (QuotientGroup.mk τ) + have hb := baseFixingExtensionQuotientEquivGaloisGroup_mk_apply + K (SeparableClosure K) E τ (e x) + have he (y : E) : i (e.symm y) = E.val y := by + exact congrArg Subtype.val (e.apply_symm_apply y) + change i (((e.autCongr).symm g) x) = τ.1 (i x) + calc + i (((e.autCongr).symm g) x) = E.val (g (e x)) := by + simpa only [AlgEquiv.autCongr_symm, AlgEquiv.autCongr_apply, + AlgEquiv.trans_apply, AlgEquiv.symm_symm] using he (g (e x)) + _ = τ.1 (E.val (e x)) := hb + _ = τ.1 (i x) := rfl + +/-- The explicit norm-quotient comparison sends a base-unit representative +to the same representative in the ordinary field norm quotient. -/ +@[simp] +theorem finiteNormQuotientEquivEmbeddedNormQuotient_finiteNormClass_baseUnit + (i : L →ₐ[K] SeparableClosure K) (x : Kˣ) : + finiteNormQuotientEquivEmbeddedNormQuotient + K (SeparableClosure K) L i + (finiteNormClass (AG K) (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i)) + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + (Additive.ofMul x))) = + (MonoidHom.toAdditive (normClass K L)) + (Additive.ofMul x) := by + calc + finiteNormQuotientEquivEmbeddedNormQuotient + K (SeparableClosure K) L i + (finiteNormClass (AG K) (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i)) + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + (Additive.ofMul x))) = + (MulEquiv.toAdditive + (normQuotientEquivOfNormSubgroupEq K (AlgHom.fieldRange i) L + (localNormSubgroup_fieldRange_eq K (SeparableClosure K) L i))) + ((MonoidHom.toAdditive (normClass K (AlgHom.fieldRange i))) + (Additive.ofMul x)) := by + simp [intrinsicAbsoluteUnits, intrinsicAbstractBase, + finiteGaloisClosedFixingSubgroupOfEmbedding, + finiteGaloisFieldRangeOfEmbedding] + _ = (MonoidHom.toAdditive (normClass K L)) (Additive.ofMul x) := by + change Additive.ofMul + ((normQuotientEquivOfNormSubgroupEq K (AlgHom.fieldRange i) L + (localNormSubgroup_fieldRange_eq K (SeparableClosure K) L i)) + (normClass K (AlgHom.fieldRange i) x)) = + Additive.ofMul (normClass K L x) + exact congrArg Additive.ofMul + (normQuotientEquivOfNormSubgroupEq_normClass K (AlgHom.fieldRange i) L + (localNormSubgroup_fieldRange_eq K (SeparableClosure K) L i) x) + +/-- On a base unit, conjugation of finite norm classes is the identity after +the target base subgroup is identified with the original base subgroup. -/ +@[simp] +theorem finiteGaloisNormConjugationOfEmbeddings_finiteNormClass_baseUnit + (i j : L →ₐ[K] SeparableClosure K) (x : Kˣ) : + finiteGaloisNormConjugationOfEmbeddings K L i j + (finiteNormClass (AG K) (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i)) + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + (Additive.ofMul x))) = + finiteNormClass (AG K) (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L j) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L j)) + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + (Additive.ofMul x)) := by + let hLK := fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i) + let s := (finiteGaloisEmbeddingConjugator K L i j)⁻¹ + have hB := finiteGaloisBase_conjugator K s + have hH : conjugateClosedSubgroup + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) s = + finiteGaloisClosedFixingSubgroupOfEmbedding K L j := + finiteGaloisClosedFixingSubgroup_conjugator K L i j + let hConjFinite := finite_conjugateExtension (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) hLK s + let a := baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + (Additive.ofMul x) + have ha : + AddEquiv.addSubgroupCongr + (congrArg (ambientFixedAddSubgroup (AG K)) hB) + (conjugateFixedElement (AG K) (B K) s a) = + baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + (Additive.ofMul x) := by + apply Subtype.ext + rw [AddEquiv.addSubgroupCongr_apply, + conjugateFixedElement_coe] + apply Additive.ext + apply Units.ext + change finiteGaloisEmbeddingConjugator K L i j + (algebraMap K (SeparableClosure K) (x : K)) = + algebraMap K (SeparableClosure K) (x : K) + exact (finiteGaloisEmbeddingConjugator K L i j).commutes (x : K) + let hLjK : (finiteGaloisClosedFixingSubgroupOfEmbedding K L j).toSubgroup ≤ + (B K).toSubgroup := + fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L j) + let c := finiteNormQuotientCongr (AG K) + (K := conjugateClosedSubgroup (B K) s) + (L := conjugateClosedSubgroup + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) s) + (K' := B K) (L' := finiteGaloisClosedFixingSubgroupOfEmbedding K L j) + (hFinite := hConjFinite) + (hFinite' := finiteGaloisExtensionQuotientOfEmbedding_finite K L j) + (conjugateClosedSubgroup_mono hLK s) hLjK hB hH + have hfactor := finiteGaloisNormConjugationOfEmbeddings_apply_factor K L i j + (finiteNormClass (AG K) (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) hLK a) + have hnorm := finiteReciprocityNaturalityConjugationNormMap_finiteNormClass + (AG K) (B K) (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) hLK s a + have hclass := finiteNormQuotientCongr_finiteNormClass (AG K) + (K := conjugateClosedSubgroup (B K) s) + (L := conjugateClosedSubgroup + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) s) + (K' := B K) (L' := finiteGaloisClosedFixingSubgroupOfEmbedding K L j) + (hFinite := hConjFinite) + (hFinite' := finiteGaloisExtensionQuotientOfEmbedding_finite K L j) + (conjugateClosedSubgroup_mono hLK s) hLjK hB hH + (conjugateFixedElement (AG K) (B K) s a) + exact hfactor.trans ((congrArg c hnorm).trans + (hclass.trans (congrArg (finiteNormClass (AG K) (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L j) hLjK) ha))) + +/-! ## The two outer comparison squares -/ + +/-- The concrete quotient identification is unchanged by conjugating the +chosen realization. -/ +theorem finiteGaloisAbstractQuotientEquivGaloisGroup_conjugation + (i j : L →ₐ[K] SeparableClosure K) + (z : Abelianization + (finiteGaloisAbstractExtensionOfEmbedding K L i).extensionQuotient) : + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L j).abelianizationCongr + ((finiteGaloisConjugationOfEmbeddings K L i j).abelianizationCongr z) = + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i).abelianizationCongr z := by + refine QuotientGroup.induction_on z ?_ + intro q + have hraw : + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L j + (finiteGaloisConjugationOfEmbeddings K L i j q) = + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i q := by + refine QuotientGroup.induction_on q ?_ + intro τ + rw [finiteGaloisConjugationOfEmbeddings_mk] + apply AlgEquiv.ext + intro x + apply j.injective + let σ := finiteGaloisEmbeddingConjugator K L i j + calc + j ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L j + (QuotientGroup.mk + (finiteGaloisConjugateBaseElement K L i j τ))) x) = + (finiteGaloisConjugateBaseElement K L i j τ).1 (j x) := + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding_mk_apply + K L j (finiteGaloisConjugateBaseElement K L i j τ) x + _ = σ (τ.1 (i x)) := by + have hinv : σ⁻¹ (j x) = i x := by + apply σ.injective + simp [σ] + simp [finiteGaloisConjugateBaseElement, σ, hinv] + _ = σ (i ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i + (QuotientGroup.mk τ)) x)) := by + exact congrArg σ + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding_mk_apply + K L i τ x).symm + _ = j ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i + (QuotientGroup.mk τ)) x) := + finiteGaloisEmbeddingConjugator_apply K L i j _ + calc + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L j).abelianizationCongr + ((finiteGaloisConjugationOfEmbeddings K L i j).abelianizationCongr + (Abelianization.of q)) = + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L j).abelianizationCongr + (Abelianization.of + (finiteGaloisConjugationOfEmbeddings K L i j q)) := + congrArg + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L j).abelianizationCongr + (abelianizationCongr_of + (finiteGaloisConjugationOfEmbeddings K L i j) q) + _ = Abelianization.of + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L j + (finiteGaloisConjugationOfEmbeddings K L i j q)) := + abelianizationCongr_of + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L j) _ + _ = Abelianization.of + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i q) := + congrArg Abelianization.of hraw + _ = (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i).abelianizationCongr + (Abelianization.of q) := + (abelianizationCongr_of + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i) q).symm + +/-- Additive form of the preceding source comparison. -/ +theorem finiteGaloisAbstractQuotientEquivGaloisGroup_conjugation_additive + (i j : L →ₐ[K] SeparableClosure K) + (z : Additive (Abelianization + (finiteGaloisAbstractExtensionOfEmbedding K L i).extensionQuotient)) : + MulEquiv.toAdditive + ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L j).abelianizationCongr) + (MulEquiv.toAdditive + ((finiteGaloisConjugationOfEmbeddings K L i j).abelianizationCongr) z) = + MulEquiv.toAdditive + ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i).abelianizationCongr) z + := by + apply Additive.toMul.injective + exact finiteGaloisAbstractQuotientEquivGaloisGroup_conjugation + K L i j z.toMul + +/-- The concrete norm-quotient identification is unchanged by conjugating +the chosen realization. -/ +theorem finiteNormQuotientEquivEmbeddedNormQuotient_conjugation + (i j : L →ₐ[K] SeparableClosure K) + (a : FiniteNormQuotient (AG K) (B K) + (finiteGaloisAbstractExtensionOfEmbedding K L i).field + (finiteGaloisAbstractExtensionOfEmbedding K L i).below) : + finiteNormQuotientEquivEmbeddedNormQuotient + K (SeparableClosure K) L j + (finiteGaloisNormConjugationOfEmbeddings K L i j a) = + finiteNormQuotientEquivEmbeddedNormQuotient + K (SeparableClosure K) L i a := by + refine FiniteNormQuotient.induction_on (AG K) (B K) + (finiteGaloisAbstractExtensionOfEmbedding K L i).field + (finiteGaloisAbstractExtensionOfEmbedding K L i).below a ?_ + intro a₀ + let e := baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + let x : Additive Kˣ := e.symm a₀ + have hx : e x = a₀ := e.apply_symm_apply a₀ + rw [← hx] + cases x with + | ofMul x => + change finiteNormQuotientEquivEmbeddedNormQuotient + K (SeparableClosure K) L j + (finiteGaloisNormConjugationOfEmbeddings K L i j + (finiteNormClass (AG K) (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i)) + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + (Additive.ofMul x)))) = + finiteNormQuotientEquivEmbeddedNormQuotient + K (SeparableClosure K) L i + (finiteNormClass (AG K) (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i)) + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + (Additive.ofMul x))) + rw [finiteGaloisNormConjugationOfEmbeddings_finiteNormClass_baseUnit, + finiteNormQuotientEquivEmbeddedNormQuotient_finiteNormClass_baseUnit, + finiteNormQuotientEquivEmbeddedNormQuotient_finiteNormClass_baseUnit] + +/-! ## The abstract reciprocity naturality theorem and embedding independence -/ + +/-- The final pointwise diagram chase: the source, middle, and target squares +determine the transported value without any further unfolding. -/ +private theorem reciprocityTransport_pointwise + {A B' C D E F : Type} + (q : A → B') (b : C → D) + (ri : A ≃ C) (rj : B' ≃ D) + (ni : C → E) (nj : D → E) + (si : A ≃ F) (sj : B' ≃ F) + (hsource : ∀ z, sj (q z) = si z) + (hnorm : ∀ a, nj (b a) = ni a) + (hforward : ∀ z, b (ri z) = rj (q z)) + (x : F) : + ni (ri (si.symm x)) = nj (rj (sj.symm x)) := by + have hq : q (si.symm x) = sj.symm x := by + apply sj.injective + calc + sj (q (si.symm x)) = si (si.symm x) := hsource (si.symm x) + _ = x := si.apply_symm_apply x + _ = sj (sj.symm x) := (sj.apply_symm_apply x).symm + calc + ni (ri (si.symm x)) = nj (b (ri (si.symm x))) := + (hnorm (ri (si.symm x))).symm + _ = nj (rj (q (si.symm x))) := congrArg nj (hforward (si.symm x)) + _ = nj (rj (sj.symm x)) := congrArg (fun z ↦ nj (rj z)) hq + +/-- The additive transported reciprocity equivalence is independent of the +embedding into the fixed separable closure. -/ +theorem concreteReciprocityAddEquivOfEmbedding_eq + (i j : L →ₐ[K] SeparableClosure K) + (D : DegreeData (G K)) (v : ValuationData D (AG K)) + (hcf : SatisfiesClassFieldAxiom (AG K)) : + concreteReciprocityAddEquivOfEmbedding K L i D v hcf = + concreteReciprocityAddEquivOfEmbedding K L j D v hcf := by + let : T2Space (G K) := krullTopology_t2 + let Ei := finiteGaloisAbstractExtensionOfEmbedding K L i + let Ej := finiteGaloisAbstractExtensionOfEmbedding K L j + let hBAbsolute : Finite ((baseField (G K)).toSubgroup ⧸ + extensionSubgroup (baseField (G K)) (B K) (le_baseField (B K))) := by + exact (intrinsicFiniteAbstractBase K).finite + let hEiNormal : + (extensionSubgroup + (intrinsicFiniteAbstractBase K).field Ei.field Ei.below).Normal := + Ei.normal + let hEjNormal : + (extensionSubgroup + (intrinsicFiniteAbstractBase K).field Ej.field Ej.below).Normal := + Ej.normal + let q := MulEquiv.toAdditive + ((finiteGaloisConjugationOfEmbeddings K L i j).abelianizationCongr) + let b := finiteGaloisNormConjugationOfEmbeddings K L i j + let ri := D.abstractReciprocityEquiv + (AG K) v hcf (intrinsicFiniteAbstractBase K) Ei + let rj := D.abstractReciprocityEquiv + (AG K) v hcf (intrinsicFiniteAbstractBase K) Ej + let ni := finiteNormQuotientEquivEmbeddedNormQuotient + K (SeparableClosure K) L i + let nj := finiteNormQuotientEquivEmbeddedNormQuotient + K (SeparableClosure K) L j + let si := MulEquiv.toAdditive + ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i).abelianizationCongr) + let sj := MulEquiv.toAdditive + ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L j).abelianizationCongr) + have hsource (z : Additive (Abelianization Ei.extensionQuotient)) : + sj (q z) = si z := by + exact finiteGaloisAbstractQuotientEquivGaloisGroup_conjugation_additive + K L i j z + have hnorm (a : FiniteNormQuotient (AG K) (B K) Ei.field Ei.below) : + nj (b a) = ni a := by + exact finiteNormQuotientEquivEmbeddedNormQuotient_conjugation + K L i j a + have hinv : + q.toAddMonoidHom.comp + (D.normResidueSymbol (AG K) v hcf + (intrinsicFiniteAbstractBase K) Ei).toAddMonoidHom = + (D.normResidueSymbol (AG K) v hcf + (intrinsicFiniteAbstractBase K) Ej).toAddMonoidHom.comp b := by + let σ := finiteGaloisEmbeddingConjugator K L i j + let Hi := finiteGaloisClosedFixingSubgroupOfEmbedding K L i + let Hj := finiteGaloisClosedFixingSubgroupOfEmbedding K L j + let hLK : Hi.toSubgroup ≤ (B K).toSubgroup := + fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i) + let hLjK : Hj.toSubgroup ≤ (B K).toSubgroup := + fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L j) + let s := σ⁻¹ + have hB := finiteGaloisBase_conjugator K σ⁻¹ + have hH := finiteGaloisClosedFixingSubgroup_conjugator K L i j + let hConj := conjugateClosedSubgroup_mono hLK s + let hHiNormal : + (extensionSubgroup + (intrinsicFiniteAbstractBase K).field Hi hLK).Normal := by + exact (finiteGaloisAbstractExtensionOfEmbedding K L i).normal + let hHiFinite : Finite + ((intrinsicFiniteAbstractBase K).field.toSubgroup ⧸ + extensionSubgroup (intrinsicFiniteAbstractBase K).field Hi hLK) := by + exact finiteGaloisExtensionQuotientOfEmbedding_finite K L i + let hConjNormal : + (extensionSubgroup ((intrinsicFiniteAbstractBase K).conjugate s).field + (conjugateClosedSubgroup Hi s) hConj).Normal := by + exact finiteGaloisEmbeddingConjugate_normal K L i s + let hConjFinite := finite_conjugateExtension (B K) Hi hLK s + let hConjAbsolute : Finite ((baseField (G K)).toSubgroup ⧸ + extensionSubgroup (baseField (G K)) + (conjugateClosedSubgroup (B K) s) + (le_baseField (conjugateClosedSubgroup (B K) s))) := + Finite.of_equiv + ((baseField (G K)).toSubgroup ⧸ + extensionSubgroup (baseField (G K)) (B K) (le_baseField (B K))) + (by + simpa [baseField] using + (absoluteConjugateCosetEquiv (B K) s).symm) + let q₀ := MonoidHom.toAdditive + (normResidueNaturalityAbelianizedConjugation (B K) Hi hLK s).toMonoidHom + let b₀ := finiteReciprocityNaturalityConjugationNormMap (AG K) (B K) Hi hLK s + let qt := MulEquiv.toAdditive + ((extensionQuotientCongr hConj hLjK hB hH).abelianizationCongr) + let bt := finiteNormQuotientCongr (AG K) + (hFinite := hConjFinite) + (hFinite' := finiteGaloisExtensionQuotientOfEmbedding_finite K L j) + hConj hLjK hB hH + have hraw := D.normResidueNaturality_conjugation (AG K) v hcf + (intrinsicFiniteAbstractBase K) Hi hLK s + have htransport := normResidueSymbol_congr D (AG K) v hcf + (conjugateClosedSubgroup (B K) s) + (conjugateClosedSubgroup Hi s) (B K) Hj hConj hLjK hB hH + apply AddMonoidHom.ext + intro a + have hrawa := DFunLike.congr_fun hraw a + have htransporta := DFunLike.congr_fun htransport (b₀ a) + have hcombined : + qt (q₀ (D.normResidueSymbol (AG K) v hcf + (intrinsicFiniteAbstractBase K) Ei a)) = + D.normResidueSymbol (AG K) v hcf + (intrinsicFiniteAbstractBase K) Ej (bt (b₀ a)) := by + exact (congrArg qt hrawa).trans htransporta + have hqfactor : + q (D.normResidueSymbol (AG K) v hcf + (intrinsicFiniteAbstractBase K) Ei a) = + qt (q₀ (D.normResidueSymbol (AG K) v hcf + (intrinsicFiniteAbstractBase K) Ei a)) := by + change Additive.ofMul + ((finiteGaloisConjugationOfEmbeddings K L i j).abelianizationCongr + (D.normResidueSymbol (AG K) v hcf + (intrinsicFiniteAbstractBase K) Ei a).toMul) = + Additive.ofMul + ((extensionQuotientCongr hConj hLjK hB hH).abelianizationCongr + ((finiteReciprocityNaturalityConjugation (B K) Hi hLK s).abelianizationCongr + (D.normResidueSymbol (AG K) v hcf + (intrinsicFiniteAbstractBase K) Ei a).toMul)) + exact congrArg Additive.ofMul + (finiteGaloisConjugationOfEmbeddings_abelianization_factor + K L i j + (D.normResidueSymbol (AG K) v hcf + (intrinsicFiniteAbstractBase K) Ei a).toMul) + have hbfactor : b a = bt (b₀ a) := by + exact finiteGaloisNormConjugationOfEmbeddings_apply_factor K L i j a + change q (D.normResidueSymbol (AG K) v hcf + (intrinsicFiniteAbstractBase K) Ei a) = + D.normResidueSymbol (AG K) v hcf + (intrinsicFiniteAbstractBase K) Ej (b a) + exact hqfactor.trans (hcombined.trans + (congrArg (D.normResidueSymbol (AG K) v hcf + (intrinsicFiniteAbstractBase K) Ej) hbfactor.symm)) + have hforward (z : Additive (Abelianization Ei.extensionQuotient)) : + b (ri z) = rj (q z) := by + have hz := DFunLike.congr_fun hinv (ri z) + change q (ri.symm (ri z)) = rj.symm (b (ri z)) at hz + calc + b (ri z) = rj (rj.symm (b (ri z))) := + (rj.apply_symm_apply (b (ri z))).symm + _ = rj (q (ri.symm (ri z))) := congrArg rj hz.symm + _ = rj (q z) := by rw [ri.symm_apply_apply] + apply AddEquiv.ext + intro x + change ni (ri (si.symm x)) = nj (rj (sj.symm x)) + exact reciprocityTransport_pointwise q b ri.toEquiv rj.toEquiv ni nj + si.toEquiv sj.toEquiv hsource hnorm hforward x + +end EmbeddingConjugation + +/-- Public multiplicative form of embedding independence. -/ +theorem concreteReciprocityEquivOfEmbedding_eq + (i j : L →ₐ[K] SeparableClosure K) + (D : DegreeData (G K)) (v : ValuationData D (AG K)) + (hcf : SatisfiesClassFieldAxiom (AG K)) : + concreteReciprocityEquivOfEmbedding K L i D v hcf = + concreteReciprocityEquivOfEmbedding K L j D v hcf := by + apply MulEquiv.ext + intro x + have h := DFunLike.congr_fun + (concreteReciprocityAddEquivOfEmbedding_eq K L i j D v hcf) + (Additive.ofMul x) + exact congrArg Additive.toMul h + +/-- Consequently the norm-residue symbol is also independent of the chosen +embedding. -/ +theorem concreteNormResidueSymbolOfEmbedding_eq + (i j : L →ₐ[K] SeparableClosure K) + (D : DegreeData (G K)) (v : ValuationData D (AG K)) + (hcf : SatisfiesClassFieldAxiom (AG K)) : + concreteNormResidueSymbolOfEmbedding K L i D v hcf = + concreteNormResidueSymbolOfEmbedding K L j D v hcf := by + rw [concreteNormResidueSymbolOfEmbedding, + concreteNormResidueSymbolOfEmbedding, + concreteReciprocityEquivOfEmbedding_eq K L i j D v hcf] + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityPrimeNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityPrimeNorm.lean new file mode 100644 index 0000000000..b5433e87cc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityPrimeNorm.lean @@ -0,0 +1,184 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +/-! +# Concrete prime-norm evaluation + +The abstract prime-norm formula is transported through an explicit +separable-closure realization. The resulting concrete norm-residue symbol +sends the transported base-field norm to the represented Galois automorphism. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation + +variable (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +variable (i : L →ₐ[K] SeparableClosure K) + +local notation "Eᵢ" => finiteGaloisAbstractExtensionOfEmbedding K L i + +/-- The intrinsic absolute Galois group has its canonical Hausdorff Krull topology. -/ +local instance concretePrimeNormAbsoluteGaloisT2Space : T2Space (intrinsicAbsoluteGalois K) := + krullTopology_t2 (K := K) (L := SeparableClosure K) + +/-- The concrete local norm-residue symbol evaluated on the norm of a prime +element in the fixed field of a positive Frobenius lift. + +The hypothesis on `x` identifies its image in the base fixed coefficient +group with the abstract relative norm, so the statement is independent of a +particular presentation of that norm. The right side is the abelianization +class of the actual `K`-automorphism of `L` represented by `q`. -/ +theorem concreteNormResidueSymbolOfEmbedding_apply_primeNorm + (D : DegreeData (intrinsicAbsoluteGalois K)) (v : ValuationData D (intrinsicAbsoluteUnits K)) + (hcf : SatisfiesClassFieldAxiom (intrinsicAbsoluteUnits K)) + (q : (Eᵢ).extensionQuotient) + (sigma : D.FrobeniusElements + ((intrinsicFiniteAbstractBase K).toFiniteResidueAbstractField D) (Eᵢ).field (Eᵢ).below) + (hsigma : D.frobeniusRestriction + ((intrinsicFiniteAbstractBase K).toFiniteResidueAbstractField D) (Eᵢ).field (Eᵢ).below + sigma = q) + (pi : ambientFixedAddSubgroup (intrinsicAbsoluteUnits K) + (D.frobeniusFixedField ((intrinsicFiniteAbstractBase K).toFiniteResidueAbstractField D) + (Eᵢ).field (Eᵢ).below sigma)) + (hpi : + letI : Finite ((intrinsicFiniteAbstractBase K).field.toSubgroup ⧸ + extensionSubgroup (intrinsicFiniteAbstractBase K).field (Eᵢ).field (Eᵢ).below) := by + change Finite ((intrinsicAbstractBase K).toSubgroup ⧸ + extensionSubgroup (intrinsicAbstractBase K) (Eᵢ).field (Eᵢ).below) + exact (Eᵢ).finite + let KR := (intrinsicFiniteAbstractBase K).toFiniteResidueAbstractField D + let S := D.frobeniusFixedField KR (Eᵢ).field (Eᵢ).below sigma + letI : Finite ((baseField (intrinsicAbsoluteGalois K)).toSubgroup ⧸ + extensionSubgroup (baseField (intrinsicAbsoluteGalois K)) S (le_baseField S)) := + D.frobeniusFixedField_absoluteFinite + (intrinsicFiniteAbstractBase K) (Eᵢ).field (Eᵢ).below sigma + let Sigma : FiniteAbstractField (intrinsicAbsoluteGalois K) := ⟨S, inferInstance⟩ + v.IsPrimeElement Sigma pi) + (x : Kˣ) + (hx : + let KR := (intrinsicFiniteAbstractBase K).toFiniteResidueAbstractField D + let S := D.frobeniusFixedField KR (Eᵢ).field (Eᵢ).below sigma + let hSB := D.frobeniusFixedField_le KR (Eᵢ).field (Eᵢ).below sigma + letI : Finite ((intrinsicAbstractBase K).toSubgroup ⧸ + extensionSubgroup (intrinsicAbstractBase K) S hSB) := + D.frobeniusFixedField_finite + KR (Eᵢ).field (Eᵢ).below sigma + baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + (Additive.ofMul x) = + relativeNorm + (intrinsicAbsoluteUnits K) (intrinsicAbstractBase K) S hSB pi) : + concreteNormResidueSymbolOfEmbedding K L i D v hcf x = + Abelianization.of + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i q) := by + dsimp only at hx + let BK := intrinsicFiniteAbstractBase K + let hEfinite : Finite ((intrinsicAbstractBase K).toSubgroup ⧸ + extensionSubgroup (intrinsicAbstractBase K) (Eᵢ).field (Eᵢ).below) := + (Eᵢ).finite + let hBKEfinite : Finite (BK.field.toSubgroup ⧸ + extensionSubgroup BK.field (Eᵢ).field (Eᵢ).below) := by + change Finite ((intrinsicAbstractBase K).toSubgroup ⧸ + extensionSubgroup (intrinsicAbstractBase K) (Eᵢ).field (Eᵢ).below) + exact hEfinite + let KR := BK.toFiniteResidueAbstractField D + let S := D.frobeniusFixedField KR (Eᵢ).field (Eᵢ).below sigma + let hSB := D.frobeniusFixedField_le + KR (Eᵢ).field (Eᵢ).below sigma + let hSBfinite : Finite ((intrinsicAbstractBase K).toSubgroup ⧸ + extensionSubgroup (intrinsicAbstractBase K) S hSB) := + D.frobeniusFixedField_finite + KR (Eᵢ).field (Eᵢ).below sigma + let e := baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + let a := relativeNorm (intrinsicAbsoluteUnits K) (intrinsicAbstractBase K) S hSB pi + have hbase : e (Additive.ofMul x) = a := by + simpa only [BK, KR, S, hSB, e, a] using hx + have hprimeNorm : + D.finiteReciprocityHom (intrinsicAbsoluteUnits K) v + (v.classFieldAxiom_implies_unramifiedUnitCohomology hcf) + BK (Eᵢ).field (Eᵢ).below (Additive.ofMul q) = + finiteNormClass (intrinsicAbsoluteUnits K) (intrinsicAbstractBase K) (Eᵢ).field + (Eᵢ).below a := by + simpa only [BK, KR, S, hSB, a] using + D.finiteReciprocityHom_apply_eq_primeNormClass + (intrinsicAbsoluteUnits K) v (v.classFieldAxiom_implies_unramifiedUnitCohomology hcf) + BK (Eᵢ).field (Eᵢ).below + (Additive.ofMul q) sigma hsigma pi hpi + have hreciprocity : + D.abstractReciprocityEquiv (intrinsicAbsoluteUnits K) v hcf BK Eᵢ + (Additive.ofMul (Abelianization.of q)) = + finiteNormClass (intrinsicAbsoluteUnits K) (intrinsicAbstractBase K) (Eᵢ).field + (Eᵢ).below a := by + rw [D.abstractReciprocityEquiv_apply_of (intrinsicAbsoluteUnits K) v hcf BK Eᵢ q] + exact hprimeNorm + have hnormTransport : + finiteNormQuotientEquivEmbeddedNormQuotient + K (SeparableClosure K) L i + (finiteNormClass (intrinsicAbsoluteUnits K) (intrinsicAbstractBase K) (Eᵢ).field + (Eᵢ).below a) = + Additive.ofMul (normClass K L x) := by + rw [← hbase] + convert + finiteNormQuotientEquivEmbeddedNormQuotient_finiteNormClass_baseUnit + K L i x using 1 <;> + rfl + have hsource : + MulEquiv.toAdditive + ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + K L i).abelianizationCongr.symm) + (Additive.ofMul (Abelianization.of + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i q))) = + Additive.ofMul (Abelianization.of q) := by + change + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + K L i).abelianizationCongr.symm + (Abelianization.of + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i q)) = + Abelianization.of q + rw [← abelianizationCongr_of + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i) q] + exact + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + K L i).abelianizationCongr.symm_apply_apply _ + have hforward : + concreteReciprocityAddEquivOfEmbedding K L i D v hcf + (Additive.ofMul (Abelianization.of + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i q))) = + Additive.ofMul (normClass K L x) := by + change + finiteNormQuotientEquivEmbeddedNormQuotient + K (SeparableClosure K) L i + (D.abstractReciprocityEquiv (intrinsicAbsoluteUnits K) v hcf BK Eᵢ + (MulEquiv.toAdditive + ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + K L i).abelianizationCongr.symm) + (Additive.ofMul (Abelianization.of + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + K L i q))))) = + Additive.ofMul (normClass K L x) + rw [hsource, hreciprocity, hnormTransport] + change + (concreteReciprocityEquivOfEmbedding K L i D v hcf).symm + (normClass K L x) = + Abelianization.of + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i q) + apply (concreteReciprocityEquivOfEmbedding K L i D v hcf).injective + rw [(concreteReciprocityEquivOfEmbedding K L i D v hcf).apply_symm_apply] + exact (congrArg Additive.toMul hforward).symm + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean new file mode 100644 index 0000000000..1275cb8a93 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean @@ -0,0 +1,181 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteGaloisRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm + +/-! # Concrete Reciprocity Transport -/ + +@[expose] public section +namespace LocalClassFieldTheory +open RamificationTheory KummerTheory CyclicCohomology + +open LocalFieldTheory + +open ClassFormation + +/-! +# Finite local reciprocity: transport of abstract reciprocity to a field extension + +This file contains the final comparison step in the proof of the local +reciprocity law. Once the actual absolute-Galois datum, henselian valuation, +and class-field axiom have been constructed, the abstract reciprocity theorem is transported +through the concrete finite Galois realization in a separable closure and +through the actual field norm. + +The coefficient module remains `(SeparableClosure K)ˣ`; this is essential in +imperfect positive characteristic. +-/ + +noncomputable +section + +variable (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +local notation "G" => intrinsicAbsoluteGalois + +local notation "A" => intrinsicAbsoluteUnits + +local notation "B" => intrinsicAbstractBase + +private noncomputable instance intrinsicAbsoluteGaloisT2 : T2Space (G K) := + krullTopology_t2 + +/-! ## Transport relative to an explicit embedding -/ + +/-- The finite abstract extension object determined by an explicit +embedding of `L` into the fixed separable closure. -/ +def finiteGaloisAbstractExtensionOfEmbedding + (i : L →ₐ[K] SeparableClosure K) : FiniteGaloisSubextension (B K) where + field := finiteGaloisClosedFixingSubgroupOfEmbedding K L i + below := fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i) + normal := inferInstance + finite := baseFixingExtensionQuotient_finite K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i) + +/-- The concrete realization of `L/K` as the finite Galois extension object +to which the abstract reciprocity theorem is applied. -/ +def finiteGaloisAbstractExtension : FiniteGaloisSubextension (B K) := + finiteGaloisAbstractExtensionOfEmbedding K L + (AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L) + +/-- The additive reciprocity equivalence transported through an explicit +realization of `L/K` in the separable closure. -/ +def concreteReciprocityAddEquivOfEmbedding + (i : L →ₐ[K] SeparableClosure K) + (D : DegreeData (G K)) (v : ValuationData D (A K)) + (hcf : SatisfiesClassFieldAxiom (A K)) : + Additive (Abelianization Gal(L/K)) ≃+ + Additive (NormQuotient K L) := by + haveI : T2Space (G K) := krullTopology_t2 + exact (MulEquiv.toAdditive + ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L + i).abelianizationCongr.symm)).trans + ((D.abstractReciprocityEquiv (A K) v hcf (intrinsicFiniteAbstractBase K) + (finiteGaloisAbstractExtensionOfEmbedding K L i)).trans + (finiteNormQuotientEquivEmbeddedNormQuotient + K (SeparableClosure K) L i)) + +/-- Multiplicative form of reciprocity transported through an explicit +embedding. -/ +def concreteReciprocityEquivOfEmbedding + (i : L →ₐ[K] SeparableClosure K) + (D : DegreeData (G K)) (v : ValuationData D (A K)) + (hcf : SatisfiesClassFieldAxiom (A K)) : + Abelianization Gal(L/K) ≃* NormQuotient K L := by + let e : Additive (Abelianization Gal(L/K)) ≃+ + Additive (NormQuotient K L) := + concreteReciprocityAddEquivOfEmbedding K L i D v hcf + let em : Multiplicative (Additive (Abelianization Gal(L/K))) ≃* + Multiplicative (Additive (NormQuotient K L)) := + @AddEquiv.toMultiplicative + (Additive (Abelianization Gal(L/K))) + (Additive (NormQuotient K L)) inferInstance inferInstance e + exact (MulEquiv.multiplicativeAdditive + (Abelianization Gal(L/K))).symm.trans + (em.trans + (MulEquiv.multiplicativeAdditive (NormQuotient K L))) + +/-- Norm-residue symbol obtained from an explicit separable-closure +realization. -/ +def concreteNormResidueSymbolOfEmbedding + (i : L →ₐ[K] SeparableClosure K) + (D : DegreeData (G K)) (v : ValuationData D (A K)) + (hcf : SatisfiesClassFieldAxiom (A K)) : + Kˣ →* Abelianization Gal(L/K) := + (concreteReciprocityEquivOfEmbedding K L i D v hcf).symm.toMonoidHom.comp + (normClass K L) + +/-- The additive form of the concrete reciprocity isomorphism. The inputs +are the three genuine structures constructed in the preceding part of the +proof, not additional reciprocity hypotheses. -/ +def concreteReciprocityAddEquiv + (D : DegreeData (G K)) (v : ValuationData D (A K)) + (hcf : SatisfiesClassFieldAxiom (A K)) : + Additive (Abelianization Gal(L/K)) ≃+ + Additive (NormQuotient K L) := + concreteReciprocityAddEquivOfEmbedding K L + (AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L) D v hcf + +/-- The public multiplicative form of the transported reciprocity +isomorphism `G(L/K)ᵃᵇ ≃ Kˣ/N_{L/K}Lˣ`. -/ +def concreteReciprocityEquiv + (D : DegreeData (G K)) (v : ValuationData D (A K)) + (hcf : SatisfiesClassFieldAxiom (A K)) : + Abelianization Gal(L/K) ≃* NormQuotient K L := + concreteReciprocityEquivOfEmbedding K L + (AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L) D v hcf + +/-- The local norm-residue symbol obtained by inverting reciprocity and +precomposing with the quotient map on `Kˣ`. -/ +def concreteNormResidueSymbol + (D : DegreeData (G K)) (v : ValuationData D (A K)) + (hcf : SatisfiesClassFieldAxiom (A K)) : + Kˣ →* Abelianization Gal(L/K) := + concreteNormResidueSymbolOfEmbedding K L + (AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L) D v hcf + +/-- The local norm-residue symbol is onto. -/ +theorem concreteNormResidueSymbol_surjective + (D : DegreeData (G K)) (v : ValuationData D (A K)) + (hcf : SatisfiesClassFieldAxiom (A K)) : + Function.Surjective (concreteNormResidueSymbol K L D v hcf) := + (concreteReciprocityEquiv K L D v hcf).symm.surjective.comp + (QuotientGroup.mk'_surjective (localNormSubgroup K L)) + +/-- The kernel of the local norm-residue symbol is exactly the field norm +subgroup. -/ +theorem concreteNormResidueSymbol_ker + (D : DegreeData (G K)) (v : ValuationData D (A K)) + (hcf : SatisfiesClassFieldAxiom (A K)) : + (concreteNormResidueSymbol K L D v hcf).ker = localNormSubgroup K L := by + ext x + rw [MonoidHom.mem_ker] + change + (concreteReciprocityEquiv K L D v hcf).symm + (normClass K L x) = 1 ↔ + x ∈ localNormSubgroup K L + constructor + · intro hx + have hx' := congrArg (concreteReciprocityEquiv K L D v hcf) hx + rw [(concreteReciprocityEquiv K L D v hcf).apply_symm_apply, + map_one] at hx' + exact (normClass_eq_one_iff_mem K L x).1 hx' + · intro hx + have hq : normClass K L x = 1 := + (normClass_eq_one_iff_mem K L x).2 hx + rw [hq, map_one] + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean new file mode 100644 index 0000000000..1b4383eee4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean @@ -0,0 +1,159 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +/-! +# Conjugation naturality of finite local reciprocity + +Two realizations of a finite Galois extension inside the fixed separable +closure are related by conjugation. This module transports that conjugation +to the actual Galois group, records the algebraic norm-residue square, and +bundles the resulting map on the topological abelianization continuously. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open scoped ValuativeRel +open LocalFieldTheory + +variable (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- Conjugation between two separable-closure realizations, transported to +the abelianization of the actual relative Galois group. -/ +noncomputable def abelianizedGaloisConjugationOfEmbeddings + (i j : L →ₐ[K] SeparableClosure K) : + Abelianization (Gal(L/K)) ≃* Abelianization (Gal(L/K)) := + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i).abelianizationCongr.symm.trans + ((finiteGaloisConjugationOfEmbeddings K L i j).abelianizationCongr.trans + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L j).abelianizationCongr) + +/-- After both realizations are identified with the actual extension, the +transported conjugation is the identity on the abelianization. -/ +theorem abelianizedGaloisConjugationOfEmbeddings_eq_refl + (i j : L →ₐ[K] SeparableClosure K) : + abelianizedGaloisConjugationOfEmbeddings K L i j = + MulEquiv.refl (Abelianization (Gal(L/K))) := by + apply MulEquiv.ext + intro z + change + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L j).abelianizationCongr + ((finiteGaloisConjugationOfEmbeddings K L i j).abelianizationCongr + ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L + i).abelianizationCongr.symm z)) = + z + exact + (finiteGaloisAbstractQuotientEquivGaloisGroup_conjugation + K L i j + ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + K L i).abelianizationCongr.symm z)).trans + ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + K L i).abelianizationCongr.apply_symm_apply z) + +/-- Algebraic conjugation naturality for the norm-residue symbols computed +from two explicit realizations of the same finite Galois extension. -/ +theorem concreteNormResidueSymbolOfEmbedding_conjugation + (i j : L →ₐ[K] SeparableClosure K) + (D : ClassFormation.DegreeData (Gal(SeparableClosure K/K))) + (v : ClassFormation.ValuationData D + (galoisAmbientUnitsRep K (SeparableClosure K))) + (hcf : ClassFormation.SatisfiesClassFieldAxiom + (galoisAmbientUnitsRep K (SeparableClosure K))) : + (abelianizedGaloisConjugationOfEmbeddings K L i j).toMonoidHom.comp + (concreteNormResidueSymbolOfEmbedding K L i D v hcf) = + concreteNormResidueSymbolOfEmbedding K L j D v hcf := by + rw [abelianizedGaloisConjugationOfEmbeddings_eq_refl] + change concreteNormResidueSymbolOfEmbedding K L i D v hcf = + concreteNormResidueSymbolOfEmbedding K L j D v hcf + unfold concreteNormResidueSymbolOfEmbedding + rw [concreteReciprocityEquivOfEmbedding_eq K L i j D v hcf] + +section LocalAlgebraic + +variable [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- Field-facing algebraic form of the second naturality diagram for the +canonical local class formation. -/ +theorem localArtinMonoidHom_conjugation + (i j : L →ₐ[K] SeparableClosure K) : + (abelianizedGaloisConjugationOfEmbeddings K L i j).toMonoidHom.comp + (concreteNormResidueSymbolOfEmbedding K L i + (localResidueDatum K) (localHenselianValuation K) + (separableClosureUnits_isClassFormation K)) = + concreteNormResidueSymbolOfEmbedding K L j + (localResidueDatum K) (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) := + concreteNormResidueSymbolOfEmbedding_conjugation K L i j + (localResidueDatum K) (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) +end LocalAlgebraic + + +/-- The conjugation of two realizations, bundled continuously on the +topological abelianization of the finite Krull Galois group. -/ +noncomputable def topologicalAbelianizationConjugationOfEmbeddings + (i j : L →ₐ[K] SeparableClosure K) : + TopologicalAbelianization (Gal(L/K)) ≃ₜ* + TopologicalAbelianization (Gal(L/K)) := by + letI : DiscreteTopology (TopologicalAbelianization (Gal(L/K))) := + QuotientGroup.discreteTopology (isOpen_discrete _) + let e : TopologicalAbelianization (Gal(L/K)) ≃* + TopologicalAbelianization (Gal(L/K)) := + (topologicalAbelianizationFiniteEquiv K L).symm.trans + ((abelianizedGaloisConjugationOfEmbeddings K L i j).trans + (topologicalAbelianizationFiniteEquiv K L)) + exact + { e with + continuous_toFun := continuous_of_discreteTopology + continuous_invFun := continuous_of_discreteTopology } + +/-- Forgetting topology identifies the bundled conjugation with the +algebraic conjugation through the finite abelianization comparison. -/ +theorem topologicalAbelianizationConjugationOfEmbeddings_toMonoidHom + (i j : L →ₐ[K] SeparableClosure K) : + (topologicalAbelianizationFiniteEquiv K L).symm.toMonoidHom.comp + (topologicalAbelianizationConjugationOfEmbeddings K L i j).toMonoidHom = + (abelianizedGaloisConjugationOfEmbeddings K L i j).toMonoidHom.comp + (topologicalAbelianizationFiniteEquiv K L).symm.toMonoidHom := by + ext x + rfl + +section LocalContinuous + +variable [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The continuous local Artin map is equivariant for conjugation between +two realizations of the finite Galois extension. -/ +theorem localArtinMap_conjugation + (i j : L →ₐ[K] SeparableClosure K) : + (ContinuousMonoidHom.toContinuousMonoidHom + (topologicalAbelianizationConjugationOfEmbeddings K L i j)).comp + (localArtinMap K L) = + localArtinMap K L := by + apply ContinuousMonoidHom.ext + intro x + change + (topologicalAbelianizationFiniteEquiv K L) + ((abelianizedGaloisConjugationOfEmbeddings K L i j) + ((topologicalAbelianizationFiniteEquiv K L).symm + (localArtinMap K L x))) = + localArtinMap K L x + rw [abelianizedGaloisConjugationOfEmbeddings_eq_refl] + exact (topologicalAbelianizationFiniteEquiv K L).apply_symm_apply _ + +end LocalContinuous + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Core.lean new file mode 100644 index 0000000000..31ae0a0f0e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Core.lean @@ -0,0 +1,81 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntermediateFieldNormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbsoluteUnitsFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldRelativeNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldNormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldContinuousNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeNormTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeSymbolSetup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitnessComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusQuotientTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.NormRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.PrimeComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConjugationNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteGaloisRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFinrankTransfer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueValuationComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteSubgroupResidueDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.HenselianValuationBase +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalClassFieldAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalResidueDatum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueActionIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicClosureDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicallyClosed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueDatum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableFixedFieldNorm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.SeparableNormValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TateTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityPrimeNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.CompositumRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SemilinearNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Compositum +/-! +# Finite local reciprocity core + +Lower acyclic aggregate for the finite reciprocity implementation. Filtered +specializations import this module without depending on the public aggregate +that later re-exports them. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered.lean new file mode 100644 index 0000000000..1d0d815e71 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.AbstractUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Compositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristicStandardCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.FiniteAbelian +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.InertiaUnramifiedExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.StandardCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Unramified + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/AbstractUnramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/AbstractUnramified.lean new file mode 100644 index 0000000000..3bc4177510 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/AbstractUnramified.lean @@ -0,0 +1,668 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Unramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.Arithmetic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.ContinuousFieldUnitLog +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.DenominatorValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpAdditivity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpComposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.ExpConvergence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCore +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoicePositions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.PowerSeriesComposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ProductArgument +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.BasicFactors +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoiceCountSystem +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ExplicitChoiceCounts +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalProduct +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.Homomorphisms +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.InverseEstimates +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.LogConvergence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitExp +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.SeriesTerms +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpContinuity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.PrincipalUnitExpLogEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogUniqueness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.ContinuousQuotientEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.IntegerMultipleSubgroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.PowerIndex +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.EqualCharacteristicLaurent +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicQp +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FiniteCoefficientLaurent +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormBase +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuedExtensionUnitMap +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.WithZeroValuationTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNorm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PolynomialRootProximity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.NormFiltration +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitInverseLimitSurjectivity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicLinearOfContinuous +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitFactors +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicModuleStructure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Quotients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaIndexing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaPrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitStructure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PowerIndex +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicPowerIndex +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitPowerIndexFormulas +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Units +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValueGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicValuationComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.AdditiveEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Norm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormContinuity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormSubgroupFunctoriality +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PowerClassFiniteness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitActions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ProfiniteUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.MultiplicativeDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueGalois +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnitTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Valuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuativeExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UniformizerPrincipalQuotient +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.ClosedAddSubgroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinPolynomial +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinRelation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.Existence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralTranslate +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.PrimeElement +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.RamificationIndex +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.ValuationRingEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.Unramified.ArithmeticFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.NonarchimedeanLocalField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.PrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.UnitDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChange +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChangeCore +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BasicInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Composition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.FiniteSupport +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselReduction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselianAlgebraicExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalResidue +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalSubextension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueEmbedding +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueLifting +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Separable +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NormUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupOrderEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Core +/-! +# Abstract unramified fixed fields and ramification groups + +This file transfers unramifiedness from the residue-degree datum on the +absolute Galois group to the concrete valuation on the corresponding finite +fixed field. It is the bridge from the canonical abstract unramified +extensions used in finite local reciprocity to the upper ramification groups +used in the Hasse--Arf development. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open RamificationTheory.LocalField +open LubinTate + +open ClassFormation +open CyclicCohomology +open LocalClassFieldTheory +open LocalFieldTheory +open RamificationTheory +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension +open scoped NNReal ValuativeRel + +private theorem residueFieldModule_eq_algebraModule + (R S : Type) [CommRing R] [IsLocalRing R] + [CommRing S] [IsLocalRing S] [Algebra R S] + [IsLocalHom (algebraMap R S)] : + (IsLocalRing.ResidueField.instModule : + Module (IsLocalRing.ResidueField R) (IsLocalRing.ResidueField S)) = + (Algebra.toModule : + Module (IsLocalRing.ResidueField R) (IsLocalRing.ResidueField S)) := by + apply Module.ext' + intro x y + obtain ⟨x, rfl⟩ := IsLocalRing.residue_surjective x + obtain ⟨y, rfl⟩ := IsLocalRing.residue_surjective y + simp [Algebra.smul_def] + +private theorem residueFieldAlgebra_eq_of_isIntegral + (R S : Type) [CommRing R] [IsLocalRing R] + [CommRing S] [IsLocalRing S] [Algebra R S] + [IsLocalHom (algebraMap R S)] + [Algebra.IsIntegral R (IsLocalRing.ResidueField S)] : + (IsLocalRing.ResidueField.instAlgebra : + Algebra (IsLocalRing.ResidueField R) (IsLocalRing.ResidueField S)) = + (IsLocalRing.ResidueField.algebraOfIsIntegral : + Algebra (IsLocalRing.ResidueField R) (IsLocalRing.ResidueField S)) := by + apply Algebra.algebra_ext + intro x + obtain ⟨x, rfl⟩ := IsLocalRing.residue_surjective x + rfl + +private theorem ramificationIdx_mul_residue_finrank_eq_finrank_compatible + (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [Algebra.IsSeparable K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + (𝓂[L] : Ideal 𝒪[L]).ramificationIdx 𝒪[K] * + @Module.finrank 𝓀[K] 𝓀[L] _ _ + (IsLocalRing.ResidueField.instModule + (R := 𝒪[K]) (S := 𝒪[L])) = + Module.finrank K L := by + have hdegree := + maximalIdeal_ramificationIdx_mul_residue_finrank_eq_finrank_of_isIntegralClosure + K L + have hp : (𝓂[K] : Ideal 𝒪[K]) ≠ ⊥ := + Ring.ne_bot_of_isMaximal_of_not_isField + (IsLocalRing.maximalIdeal.isMaximal 𝒪[K]) + (IsDiscreteValuationRing.not_isField 𝒪[K]) + rw [← Ideal.ramificationIdx'_eq_ramificationIdx _ _ hp] + rw [residueFieldModule_eq_algebraModule 𝒪[K] 𝒪[L]] at hdegree + rw [residueFieldAlgebra_eq_of_isIntegral 𝒪[K] 𝒪[L]] at hdegree + have hmodule : + (IsLocalRing.ResidueField.instModule : Module 𝓀[K] 𝓀[L]) = + (IsLocalRing.ResidueField.algebraOfIsIntegral : + Algebra 𝓀[K] 𝓀[L]).toModule := by + calc + (IsLocalRing.ResidueField.instModule : Module 𝓀[K] 𝓀[L]) = + (IsLocalRing.ResidueField.instAlgebra : + Algebra 𝓀[K] 𝓀[L]).toModule := + residueFieldModule_eq_algebraModule 𝒪[K] 𝒪[L] + _ = _ := congrArg + (fun alg : Algebra 𝓀[K] 𝓀[L] => + @Algebra.toModule 𝓀[K] 𝓀[L] _ _ alg) + (residueFieldAlgebra_eq_of_isIntegral 𝒪[K] 𝒪[L]) + rw [← hmodule] at hdegree + exact hdegree + +universe u + +private theorem baseFixingExtensionSubgroup_index_eq_finrank + (K Ω : Type) [Field K] [Field Ω] [Algebra K Ω] [IsGalois K Ω] + (E : IntermediateField K Ω) [FiniteDimensional K E] [IsGalois K E] : + (extensionSubgroup + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) + (fixingSubgroupLeBase K Ω E)).index = + Module.finrank K E := by + let : Finite + ((closedFixingSubgroup K Ω + (⊥ : IntermediateField K Ω)).toSubgroup ⧸ + extensionSubgroup + (closedFixingSubgroup K Ω + (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) + (fixingSubgroupLeBase K Ω E)) := + Finite.of_equiv (Gal(E/K)) + (baseFixingExtensionQuotientEquivGaloisGroup K Ω E).symm.toEquiv + calc + _ = Nat.card + ((closedFixingSubgroup K Ω + (⊥ : IntermediateField K Ω)).toSubgroup ⧸ + extensionSubgroup + (closedFixingSubgroup K Ω + (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) + (fixingSubgroupLeBase K Ω E)) := + Subgroup.index_eq_card _ + _ = Nat.card (Gal(E/K)) := + Nat.card_congr + (baseFixingExtensionQuotientEquivGaloisGroup K Ω E).toEquiv + _ = Module.finrank K E := + IsGalois.card_aut_eq_finrank K E + +/-- For a field finite over the distinguished abstract base, the absolute +residue degree agrees with its relative residue degree over that base. -/ +theorem finiteAbstractField_residueDegree_eq_relativeResidueDegree + {G : Type u} [Group G] [TopologicalSpace G] + (D : DegreeData G) (H : FiniteAbstractField G) : + (H.residueDegree D : ℕ) = + (H.toFiniteAbstractExtension.residueDegree D : ℕ) := by + apply Nat.cast_injective (R := Cardinal) + calc + ((H.residueDegree D : ℕ) : Cardinal) = + D.residueDegreeCardinal H.field := by + exact + (DegreeData.FiniteResidueAbstractField.residueDegreeCardinal_eq_coe + (H.toFiniteResidueAbstractField D)).symm + _ = + (H.toFiniteAbstractExtension.toAbstractExtension + |>.relativeResidueDegreeCardinal D) := by + have h := + H.toFiniteAbstractExtension.toAbstractExtension + |>.relativeResidueDegreeCardinal_mul_residueDegreeCardinal D + have hbase : + D.residueDegreeCardinal + H.toFiniteAbstractExtension.toAbstractExtension.base = 1 := by + change D.residueDegreeCardinal (baseField G) = 1 + exact D.residueDegreeCardinal_baseField + rw [hbase, mul_one] at h + exact h.symm + _ = + ((H.toFiniteAbstractExtension.residueDegree D : ℕ) : Cardinal) := + H.toFiniteAbstractExtension.relativeResidueDegreeCardinal_eq_coe D + +/-- The degree of a normal finite abstract field is the ordinary degree of +its concrete fixed field in the chosen separable closure. -/ +theorem finiteAbstractField_degree_eq_abstractFixedField_finrank + (K : Type) [Field K] + (H : FiniteAbstractField + (Gal(SeparableClosure K/K))) + (hnormal : + (extensionSubgroup + (baseField (Gal(SeparableClosure K/K))) H.field + (le_baseField H.field)).Normal) : + let E := + abstractFixedField K (SeparableClosure K) H.field + letI : FiniteDimensional K E := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : IsGalois K E := + abstractFixedField_isGalois_of_base_normal K H.field hnormal + (H.toFiniteAbstractExtension.degree : ℕ) = + Module.finrank K E := by + let E := + abstractFixedField K (SeparableClosure K) H.field + let : FiniteDimensional K E := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + let : IsGalois K E := + abstractFixedField_isGalois_of_base_normal K H.field hnormal + calc + (H.toFiniteAbstractExtension.degree : ℕ) = + (extensionSubgroup + (baseField (Gal(SeparableClosure K/K))) H.field + (le_baseField H.field)).index := + H.toFiniteAbstractExtension.extensionSubgroup_index_eq_degree.symm + _ = H.field.toSubgroup.index := by + symm + rw [← Subgroup.relIndex_top_right] + rfl + _ = E.fixingSubgroup.index := by + exact congrArg Subgroup.index + (InfiniteGalois.fixingSubgroup_fixedField H.field).symm + _ = Module.finrank K E := + (IntermediateField.finrank_eq_fixingSubgroup_index (SeparableClosure K) E).symm + +/-- Abstract unramifiedness of a normal finite fixed field gives actual +unramifiedness for its canonical spectral valuation. -/ +theorem abstractFixedField_isUnramifiedValuedExtension + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + (Gal(SeparableClosure K/K))) + (hnormal : + (extensionSubgroup + (baseField (Gal(SeparableClosure K/K))) H.field + (le_baseField H.field)).Normal) + (hunramified : + H.toFiniteAbstractExtension.IsUnramified + (localResidueDatum K)) : + let E := + abstractFixedField K (SeparableClosure K) H.field + letI : FiniteDimensional K E := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : IsGalois K E := + abstractFixedField_isGalois_of_base_normal K H.field hnormal + letI : NontriviallyNormedField K := + localFieldNontriviallyNormedField K + letI : IsUltrametricDist K := + localFieldIsUltrametricDist K + letI : CompleteSpace K := inferInstance + letI : NontriviallyNormedField E := + finiteExtensionSpectralNormedField K E + letI : ValuativeRel E := + finiteExtensionSpectralValuativeRel K E + letI : IsNonarchimedeanLocalField E := + finiteExtensionSpectralIsNonarchimedeanLocalField K E + letI : Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation E) := + finiteExtensionSpectralValuation_hasExtension K E + letI : IsIntegralClosure 𝒪[E] 𝒪[K] E := + localCompleteDVF_integerRing_isIntegralClosure K E + letI : Module.Finite 𝒪[K] 𝒪[E] := + localCompleteDVF_integerRing_moduleFinite K E + LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + K E := by + let E := + abstractFixedField K (SeparableClosure K) H.field + let : FiniteDimensional K E := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + let : IsGalois K E := + abstractFixedField_isGalois_of_base_normal K H.field hnormal + let : NontriviallyNormedField K := + localFieldNontriviallyNormedField K + let : IsUltrametricDist K := + localFieldIsUltrametricDist K + let : CompleteSpace K := inferInstance + let : NontriviallyNormedField E := + finiteExtensionSpectralNormedField K E + let : ValuativeRel E := + finiteExtensionSpectralValuativeRel K E + let : IsNonarchimedeanLocalField E := + finiteExtensionSpectralIsNonarchimedeanLocalField K E + let : Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation E) := + finiteExtensionSpectralValuation_hasExtension K E + let : IsIntegralClosure 𝒪[E] 𝒪[K] E := + localCompleteDVF_integerRing_isIntegralClosure K E + let : Module.Finite 𝒪[K] 𝒪[E] := + localCompleteDVF_integerRing_moduleFinite K E + let f : ℕ := + @Module.finrank 𝓀[K] 𝓀[E] _ _ + (IsLocalRing.ResidueField.instModule + (R := 𝒪[K]) (S := 𝒪[E])) + have hresidueDegree : + f = Module.finrank K E := by + calc + f = + (H.residueDegree (localResidueDatum K) : ℕ) := + (localResidueDatum_residueDegree_eq_residueFinrank K H).symm + _ = + (H.toFiniteAbstractExtension.residueDegree + (localResidueDatum K) : ℕ) := + finiteAbstractField_residueDegree_eq_relativeResidueDegree + (localResidueDatum K) H + _ = (H.toFiniteAbstractExtension.degree : ℕ) := + H.toFiniteAbstractExtension.residueDegree_eq_degree_of_isUnramified + (localResidueDatum K) hunramified + _ = Module.finrank K E := + finiteAbstractField_degree_eq_abstractFixedField_finrank + K H hnormal + have hdegree' : + (𝓂[E] : Ideal 𝒪[E]).ramificationIdx 𝒪[K] * + f = + Module.finrank K E := + ramificationIdx_mul_residue_finrank_eq_finrank_compatible K E + have hpos : 0 < f := by + rw [hresidueDegree] + exact Module.finrank_pos + apply + LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension.mk + apply Nat.eq_of_mul_eq_mul_right hpos + calc + (𝓂[E] : Ideal 𝒪[E]).ramificationIdx 𝒪[K] * + f = + Module.finrank K E := hdegree' + _ = f := hresidueDegree.symm + _ = 1 * f := (one_mul _).symm + +/-- Every nonnegative upper ramification group of an abstractly unramified +normal finite fixed field is trivial. -/ +theorem localUpperRamificationGroup_abstractFixedField_eq_bot + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + (Gal(SeparableClosure K/K))) + (hnormal : + (extensionSubgroup + (baseField (Gal(SeparableClosure K/K))) H.field + (le_baseField H.field)).Normal) + (hunramified : + H.toFiniteAbstractExtension.IsUnramified + (localResidueDatum K)) + (t : ℝ) (ht : 0 ≤ t) : + let E := + abstractFixedField K (SeparableClosure K) H.field + letI : FiniteDimensional K E := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : IsGalois K E := + abstractFixedField_isGalois_of_base_normal K H.field hnormal + localUpperRamificationGroup K E t = ⊥ := by + let E := + abstractFixedField K (SeparableClosure K) H.field + let : FiniteDimensional K E := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + let : IsGalois K E := + abstractFixedField_isGalois_of_base_normal K H.field hnormal + let : NontriviallyNormedField K := + localFieldNontriviallyNormedField K + let : IsUltrametricDist K := + localFieldIsUltrametricDist K + let : CompleteSpace K := inferInstance + let : NontriviallyNormedField E := + finiteExtensionSpectralNormedField K E + let : ValuativeRel E := + finiteExtensionSpectralValuativeRel K E + let : IsNonarchimedeanLocalField E := + finiteExtensionSpectralIsNonarchimedeanLocalField K E + let : Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation E) := + finiteExtensionSpectralValuation_hasExtension K E + let : IsIntegralClosure 𝒪[E] 𝒪[K] E := + localCompleteDVF_integerRing_isIntegralClosure K E + let : Module.Finite 𝒪[K] 𝒪[E] := + localCompleteDVF_integerRing_moduleFinite K E + let : + LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + K E := + abstractFixedField_isUnramifiedValuedExtension + K H hnormal hunramified + exact + localUpperRamificationGroup_eq_bot_of_unramifiedValuation + K E t ht + +/-! ## The canonical degree-`d` unramified factor -/ + +/-- The fixed-field endpoint of the canonical degree-`d` unramified +subextension, bundled as an abstract field finite over the distinguished +base. -/ +noncomputable def localFiniteUnramifiedAbstractField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) : + FiniteAbstractField (intrinsicAbsoluteGalois K) := by + let U := localFiniteUnramifiedAbelianSubextension K d hd + exact ⟨U.field, + finiteAbelianSubextension_finite_over_absoluteBase K U⟩ + +/-- The preceding absolute finite-field package has the subgroup underlying +the canonical finite unramified abelian subextension. -/ +@[simp] +theorem localFiniteUnramifiedAbstractField_field + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) : + (localFiniteUnramifiedAbstractField K d hd).field = + (localFiniteUnramifiedAbelianSubextension K d hd).field := by + rfl + +/-- The canonical degree-`d` unramified abstract field is normal over the +distinguished base. -/ +theorem localFiniteUnramifiedAbstractField_normal + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) : + (extensionSubgroup + (baseField (intrinsicAbsoluteGalois K)) + (localFiniteUnramifiedAbstractField K d hd).field + (le_baseField + (localFiniteUnramifiedAbstractField K d hd).field)).Normal := by + let U := localFiniteUnramifiedAbelianSubextension K d hd + change + (extensionSubgroup + (baseField (intrinsicAbsoluteGalois K)) U.field + (le_baseField U.field)).Normal + exact finiteAbelianSubextension_normal_over_absoluteBase K U + +/-- The canonical degree-`d` abstract field is unramified for the local +residue degree datum. -/ +theorem localFiniteUnramifiedAbstractField_isUnramified + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) : + (localFiniteUnramifiedAbstractField K d hd).toFiniteAbstractExtension.IsUnramified + (localResidueDatum K) := by + let D := localResidueDatum K + let Bfinite : FiniteAbstractField (intrinsicAbsoluteGalois K) := + intrinsicFiniteAbstractBase K + let Bresidue := Bfinite.toFiniteResidueAbstractField D + have h := + DegreeData.unramifiedExtensionOfDegree_isUnramified + D Bresidue d hd + have hbase : + intrinsicAbstractBase K = + baseField (intrinsicAbsoluteGalois K) := + closedFixingSubgroup_bot_eq_baseField K (SeparableClosure K) + change + (baseField (intrinsicAbsoluteGalois K)).toSubgroup ⊓ + D.degree.toMonoidHom.ker ≤ + (localFiniteUnramifiedAbelianSubextension K d hd).field.toSubgroup + intro g hg + have hgBase : g ∈ Bresidue.field := by + change g ∈ intrinsicAbstractBase K + rw [hbase] + exact hg.1 + have hgField := + h ⟨hgBase, hg.2⟩ + simpa [D, Bfinite, Bresidue, + localFiniteUnramifiedAbelianSubextension, + DegreeData.finiteUnramifiedAbelianExtension, + DegreeData.finiteUnramifiedExtension] using hgField + +/-- Every nonnegative upper ramification group of the canonical degree-`d` +unramified abelian fixed field is trivial. -/ +theorem localUpperRamificationGroup_finiteUnramifiedAbelianExtension_eq_bot + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) (t : ℝ) (ht : 0 ≤ t) : + let H := localFiniteUnramifiedAbstractField K d hd + let E := + abstractFixedField K (SeparableClosure K) H.field + letI : FiniteDimensional K E := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : IsGalois K E := + abstractFixedField_isGalois_of_base_normal K H.field + (localFiniteUnramifiedAbstractField_normal K d hd) + localUpperRamificationGroup K E t = ⊥ := by + exact + localUpperRamificationGroup_abstractFixedField_eq_bot + K (localFiniteUnramifiedAbstractField K d hd) + (localFiniteUnramifiedAbstractField_normal K d hd) + (localFiniteUnramifiedAbstractField_isUnramified K d hd) + t ht + +/-- The real Artin principal-unit step filtration of the canonical +degree-`d` unramified abelian fixed field is trivial at every index. -/ +theorem + artinPrincipalUnitStepGroup_finiteUnramifiedAbelianExtension_eq_bot + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) (t : ℝ) : + let H := localFiniteUnramifiedAbstractField K d hd + let E := + abstractFixedField K (SeparableClosure K) H.field + letI : FiniteDimensional K E := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : IsAbelianGalois K E := by + change IsAbelianGalois K + (abstractFixedField K (SeparableClosure K) + (localFiniteUnramifiedAbelianSubextension K d hd).field) + exact finiteAbelianSubextension_fixedField_isAbelianGalois K + (localFiniteUnramifiedAbelianSubextension K d hd) + artinPrincipalUnitStepGroup K E t = ⊥ := by + let H := localFiniteUnramifiedAbstractField K d hd + let E := + abstractFixedField K (SeparableClosure K) H.field + let : FiniteDimensional K E := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + let : IsAbelianGalois K E := by + change IsAbelianGalois K + (abstractFixedField K (SeparableClosure K) + (localFiniteUnramifiedAbelianSubextension K d hd).field) + exact finiteAbelianSubextension_fixedField_isAbelianGalois K + (localFiniteUnramifiedAbelianSubextension K d hd) + let : NontriviallyNormedField K := + localFieldNontriviallyNormedField K + let : IsUltrametricDist K := + localFieldIsUltrametricDist K + let : CompleteSpace K := inferInstance + let : NontriviallyNormedField E := + finiteExtensionSpectralNormedField K E + let : ValuativeRel E := + finiteExtensionSpectralValuativeRel K E + let : IsNonarchimedeanLocalField E := + finiteExtensionSpectralIsNonarchimedeanLocalField K E + let : Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation E) := + finiteExtensionSpectralValuation_hasExtension K E + let : + LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + K E := + abstractFixedField_isUnramifiedValuedExtension + K H + (localFiniteUnramifiedAbstractField_normal K d hd) + (localFiniteUnramifiedAbstractField_isUnramified K d hd) + exact + artinPrincipalUnitStepGroup_eq_bot_of_unramifiedValuation + K E t + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/All.lean new file mode 100644 index 0000000000..f016d7ee9b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/All.lean @@ -0,0 +1,24 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.AbstractUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Compositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristicStandardCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.FiniteAbelian +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.InertiaUnramifiedExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.StandardCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Unramified +/-! +# Filtered finite local reciprocity + +Public aggregate for the filtered Artin-map API and its unramified, +equal-characteristic, compositum, and finite-Abelian specializations. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Compositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Compositum.lean new file mode 100644 index 0000000000..05897d264e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Compositum.lean @@ -0,0 +1,90 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.CompositumRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified +/-! +# Filtered reciprocity for a compositum + +At a nonnegative ramification index, an unramified factor contributes +trivially to both the principal-unit Artin image and the upper ramification +group. Equality on the other factor can then be recovered upstairs from the +joint injectivity of the two restriction maps. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open RamificationTheory.LocalField +open RamificationTheory + +open LocalClassFieldTheory +open LocalFieldTheory +open scoped ValuativeRel + +/-- Filtered local reciprocity ascends from one factor of a compositum when +both filtrations restrict trivially to the other factor. -/ +theorem filteredLocalReciprocity_of_compositum + (K : Type) [Field K] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (E₁ E₂ F : IntermediateField K (SeparableClosure K)) + (hE₁ : E₁ ≤ F) (hE₂ : E₂ ≤ F) + [FiniteDimensional K E₁] [FiniteDimensional K E₂] + [FiniteDimensional K F] + [IsAbelianGalois K E₁] [IsAbelianGalois K E₂] + [IsAbelianGalois K F] + (hsup : E₁ ⊔ E₂ = F) + (t : ℝ) + (hArtin₁ : artinPrincipalUnitStepGroup K E₁ t = ⊥) + (hUpper₁ : localUpperRamificationGroup K E₁ t = ⊥) + (hfiltered₂ : + artinPrincipalUnitStepGroup K E₂ t = + localUpperRamificationGroup K E₂ t) : + artinPrincipalUnitStepGroup K F t = + localUpperRamificationGroup K F t := by + let r₁ := intermediateFieldRestrictNormalHom E₁ F hE₁ + let r₂ := intermediateFieldRestrictNormalHom E₂ F hE₂ + apply + subgroup_eq_of_prod_map_injective_of_left_maps_eq_bot + r₁ r₂ + (intermediateFieldRestrictNormalHom_prod_injective_of_sup_eq + K E₁ E₂ F hE₁ hE₂ hsup) + · calc + (artinPrincipalUnitStepGroup K F t).map r₁ = + artinPrincipalUnitStepGroup K E₁ t := by + simpa [r₁] using + artinPrincipalUnitStepGroup_map_intermediateFieldRestrict + K E₁ F hE₁ t + _ = ⊥ := hArtin₁ + · calc + (localUpperRamificationGroup K F t).map r₁ = + localUpperRamificationGroup K E₁ t := by + simpa [r₁] using + localUpperRamificationGroup_map_restrict K E₁ F hE₁ t + _ = ⊥ := hUpper₁ + · calc + (artinPrincipalUnitStepGroup K F t).map r₂ = + artinPrincipalUnitStepGroup K E₂ t := by + simpa [r₂] using + artinPrincipalUnitStepGroup_map_intermediateFieldRestrict + K E₂ F hE₂ t + _ = localUpperRamificationGroup K E₂ t := hfiltered₂ + _ = (localUpperRamificationGroup K F t).map r₂ := by + symm + simpa [r₂] using + localUpperRamificationGroup_map_restrict K E₂ F hE₂ t + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Core.lean new file mode 100644 index 0000000000..762b3a6ecd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Core.lean @@ -0,0 +1,225 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Order.Floor.Ring +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Conductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Filtration +/-! +# Filtered local reciprocity + +The principal-unit filtration transported to a finite Abelian Galois group by +the local Artin map. Its comparison with upper ramification groups is the +filtered reciprocity theorem; this file first records the Artin side and its +conductor cutoff without assuming that comparison. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalClassFieldTheory LocalFieldTheory RamificationTheory + +/-- The image of the `n`-th principal-unit group under finite Abelian local +reciprocity. -/ +def artinPrincipalUnitGroup + (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [IsAbelianGalois K L] + (n : ℕ) : Subgroup (Gal(L/K)) := + (LocalFieldTheory.fieldPrincipalUnits K n).map (abelianLocalArtinMonoidHom K L) + +/-- The Artin images of principal units form an antitone filtration. -/ +theorem artinPrincipalUnitGroup_antitone + (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [IsAbelianGalois K L] + {m n : ℕ} (hmn : m ≤ n) : + artinPrincipalUnitGroup K L n ≤ artinPrincipalUnitGroup K L m := + Subgroup.map_mono (fieldPrincipalUnits_antitone K hmn) + +/-- The Artin image of the `n`-th principal units is trivial exactly from the +conductor exponent onward. -/ +theorem artinPrincipalUnitGroup_eq_bot_iff + (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [IsAbelianGalois K L] + (n : ℕ) : + artinPrincipalUnitGroup K L n = ⊥ ↔ + localConductorExponent K L ≤ n := by + rw [localConductorExponent_le_iff] + constructor + · intro h x hx + rw [← abelianLocalArtinMonoidHom_ker K L, MonoidHom.mem_ker] + have hmem : + abelianLocalArtinMonoidHom K L x ∈ + artinPrincipalUnitGroup K L n := + ⟨x, hx, rfl⟩ + rw [h] at hmem + exact hmem + · intro h + apply le_antisymm + · rintro y ⟨x, hx, rfl⟩ + rw [← abelianLocalArtinMonoidHom_ker K L] at h + exact h hx + · exact bot_le + +/-- Before the conductor exponent the Artin image of principal units is +nontrivial, and only then. -/ +theorem artinPrincipalUnitGroup_ne_bot_iff + (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [IsAbelianGalois K L] + (n : ℕ) : + artinPrincipalUnitGroup K L n ≠ ⊥ ↔ + n < localConductorExponent K L := by + simpa only [not_le] using + not_congr (artinPrincipalUnitGroup_eq_bot_iff K L n) + +/-- Restriction along a tower of finite Abelian extensions carries the Artin +image of each principal-unit group onto the corresponding image downstairs. -/ +theorem artinPrincipalUnitGroup_map_intermediateFieldRestrict + (K : Type) [Field K] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (E F : IntermediateField K (SeparableClosure K)) (hEF : E ≤ F) + [FiniteDimensional K E] [FiniteDimensional K F] + [IsAbelianGalois K E] [IsAbelianGalois K F] + (n : ℕ) : + Subgroup.map + (intermediateFieldRestrictNormalHom E F hEF) + (artinPrincipalUnitGroup K F n) = + artinPrincipalUnitGroup K E n := by + unfold artinPrincipalUnitGroup + rw [Subgroup.map_map] + rw [abelianLocalArtinMonoidHom_restrict K E F hEF] + +/-- The real-indexed step filtration obtained by applying local reciprocity +to the principal-unit filtration. -/ +def artinPrincipalUnitStepGroup + (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [IsAbelianGalois K L] + (t : ℝ) : Subgroup (Gal(L/K)) := + natCeilStepFiltration (artinPrincipalUnitGroup K L) t + +/-- Restriction along a tower carries the real-indexed Artin principal-unit +step filtration onto the corresponding filtration downstairs. -/ +theorem artinPrincipalUnitStepGroup_map_intermediateFieldRestrict + (K : Type) [Field K] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (E F : IntermediateField K (SeparableClosure K)) (hEF : E ≤ F) + [FiniteDimensional K E] [FiniteDimensional K F] + [IsAbelianGalois K E] [IsAbelianGalois K F] + (t : ℝ) : + Subgroup.map + (intermediateFieldRestrictNormalHom E F hEF) + (artinPrincipalUnitStepGroup K F t) = + artinPrincipalUnitStepGroup K E t := by + exact artinPrincipalUnitGroup_map_intermediateFieldRestrict + K E F hEF ⌈t⌉₊ + +/-- Filtered reciprocity at nonnegative indices descends through a finite +Abelian tower whenever the chosen upper filtrations are compatible with +restriction. The index `-1` is outside the principal-unit comparison and is +handled separately in Hasse--Arf. -/ +theorem filteredLocalReciprocity_descends + (K : Type) [Field K] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (E F : IntermediateField K (SeparableClosure K)) (hEF : E ≤ F) + [FiniteDimensional K E] [FiniteDimensional K F] + [IsAbelianGalois K E] [IsAbelianGalois K F] + (upperE : ℝ → Subgroup (Gal(E/K))) + (upperF : ℝ → Subgroup (Gal(F/K))) + (hupper : ∀ t, + Subgroup.map + (intermediateFieldRestrictNormalHom E F hEF) + (upperF t) = + upperE t) + (hcover : ∀ t, 0 ≤ t → + artinPrincipalUnitStepGroup K F t = upperF t) + (t : ℝ) (ht : 0 ≤ t) : + artinPrincipalUnitStepGroup K E t = upperE t := by + rw [← hupper t, ← hcover t ht] + exact (artinPrincipalUnitStepGroup_map_intermediateFieldRestrict + K E F hEF t).symm + +/-- A jump of the Artin principal-unit step filtration. -/ +def IsArtinPrincipalUnitJump + (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [IsAbelianGalois K L] + (t : ℝ) : Prop := + IsNatCeilStepFiltrationJump (artinPrincipalUnitGroup K L) t + +/-- At an integer index, an Artin principal-unit jump is exactly a change +between two consecutive principal-unit images. -/ +theorem isArtinPrincipalUnitJump_natCast_iff + (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [IsAbelianGalois K L] + (n : ℕ) : + IsArtinPrincipalUnitJump K L (n : ℝ) ↔ + artinPrincipalUnitGroup K L n ≠ + artinPrincipalUnitGroup K L (n + 1) := by + exact isNatCeilStepFiltrationJump_natCast_iff + (fun _ _ hmn => artinPrincipalUnitGroup_antitone K L hmn) n + +/-- Every jump of the Artin principal-unit filtration is an integer. The +remaining filtered-reciprocity task is to identify this filtration with the +actual upper ramification filtration. -/ +theorem isArtinPrincipalUnitJump_integer + (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [IsAbelianGalois K L] + {t : ℝ} (ht : IsArtinPrincipalUnitJump K L t) : + ∃ n : ℕ, t = n := by + exact isNatCeilStepFiltrationJump_integer + (fun _ _ hmn => artinPrincipalUnitGroup_antitone K L hmn) ht + +/-- A positive conductor exponent produces a final nontrivial Artin +principal-unit jump one step before the conductor. -/ +theorem exists_lastArtinPrincipalUnitJump_of_conductor_pos + (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [IsAbelianGalois K L] + (hcond : 0 < localConductorExponent K L) : + ∃ n : ℕ, + localConductorExponent K L = n + 1 ∧ + IsArtinPrincipalUnitJump K L (n : ℝ) := by + obtain ⟨n, hn⟩ := + Nat.exists_eq_succ_of_ne_zero (Nat.ne_of_gt hcond) + refine ⟨n, hn, ?_⟩ + rw [isArtinPrincipalUnitJump_natCast_iff] + have hn_ne : + artinPrincipalUnitGroup K L n ≠ ⊥ := by + rw [artinPrincipalUnitGroup_ne_bot_iff] + omega + have hsucc : + artinPrincipalUnitGroup K L (n + 1) = ⊥ := by + rw [artinPrincipalUnitGroup_eq_bot_iff] + omega + intro hsame + apply hn_ne + rw [hsame, hsucc] + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristic.lean new file mode 100644 index 0000000000..76ffb7c49e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristic.lean @@ -0,0 +1,126 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristicDominatingExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristicStandardCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedFixedFieldComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified +/-! +# Filtered local reciprocity in equal characteristic + +Every finite abelian extension of a positive-characteristic local field +embeds in a standard finite abelian compositum. Passing to the field range +inside the fixed separable closure lets filtered reciprocity descend by +restriction. A base-linear equivalence from the original extension to that +field range then transports both the Artin and upper filtrations back. +-/ + +@[expose] public section + +noncomputable +section + +open scoped ValuativeRel + +namespace LocalClassFieldTheory + +open RamificationTheory.LocalField +open LubinTate + +open LocalClassFieldTheory +open LocalFieldTheory + +/-- Real filtered local reciprocity for an arbitrary finite abelian +extension of a positive-characteristic nonarchimedean local field. -/ +theorem equalCharacteristic_filteredLocalReciprocity + (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [IsAbelianGalois K L] + (p : ℕ) [Fact p.Prime] [CharP K p] + (t : ℝ) (ht : 0 ≤ t) : + artinPrincipalUnitStepGroup K L t = + localUpperRamificationGroup K L t := by + obtain ⟨ϖ, d, n, hϖ, hd, _hn, hEmbed⟩ := + exists_equalCharacteristicFiniteAbelianDominatingStandardCompositum + K L p + let P := + equalCharacteristicStandardFiniteAbelianCompositum + K p ϖ hϖ d n hd + let F := + abstractFixedField K (SeparableClosure K) P.field + let : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) P.field + (finiteAbelianSubextension_finite_over_absoluteBase K P) + let : IsAbelianGalois K F := + finiteAbelianSubextension_fixedField_isAbelianGalois K P + let i : L →ₐ[K] F := hEmbed.some + let j : L →ₐ[K] SeparableClosure K := F.val.comp i + let E : IntermediateField K (SeparableClosure K) := + AlgHom.fieldRange j + have hEF : E ≤ F := by + rintro x ⟨y, rfl⟩ + exact (i y).property + let e : L ≃ₐ[K] E := + AlgEquiv.ofInjectiveField j + let : FiniteDimensional K E := + e.toLinearEquiv.finiteDimensional + let : IsAbelianGalois K E := + IsAbelianGalois.of_algHom (IntermediateField.inclusion hEF) + have hcover : + ∀ s : ℝ, 0 ≤ s → + artinPrincipalUnitStepGroup K F s = + localUpperRamificationGroup K F s := by + intro s hs + exact + equalCharacteristicStandardFiniteAbelianCompositum_filteredLocalReciprocity + K p ϖ hϖ d n hd s hs + have hupper : + ∀ s : ℝ, + Subgroup.map + (RamificationTheory.intermediateFieldRestrictNormalHom E F hEF) + (localUpperRamificationGroup K F s) = + localUpperRamificationGroup K E s := by + intro s + exact localUpperRamificationGroup_map_restrict K E F hEF s + have hEfiltered : + artinPrincipalUnitStepGroup K E t = + localUpperRamificationGroup K E t := + filteredLocalReciprocity_descends + K E F hEF + (localUpperRamificationGroup K E) + (localUpperRamificationGroup K F) + hupper hcover t ht + let q : Gal(E/K) ≃* Gal(L/K) := + AlgEquiv.autCongr e.symm + have hArtin : + Subgroup.map q.toMonoidHom + (artinPrincipalUnitStepGroup K E t) = + artinPrincipalUnitStepGroup K L t := + artinPrincipalUnitStepGroup_map_autCongr K E L e.symm t + have hUpper : + Subgroup.map q.toMonoidHom + (localUpperRamificationGroup K E t) = + localUpperRamificationGroup K L t := + localUpperRamificationGroup_map_autCongr K E L e.symm t + calc + artinPrincipalUnitStepGroup K L t = + Subgroup.map q.toMonoidHom + (artinPrincipalUnitStepGroup K E t) := + hArtin.symm + _ = + Subgroup.map q.toMonoidHom + (localUpperRamificationGroup K E t) := by + rw [hEfiltered] + _ = localUpperRamificationGroup K L t := hUpper + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristicStandardCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristicStandardCompositum.lean new file mode 100644 index 0000000000..d9d60185c2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristicStandardCompositum.lean @@ -0,0 +1,128 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.AbstractUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Compositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedFixedFieldComparison +/-! +# Filtered reciprocity for the equal-characteristic standard compositum + +The fixed field of the standard finite abelian compositum is the compositum +of its canonical unramified factor and its named transported Lubin--Tate +factor. The first factor has trivial Artin and upper groups at nonnegative +indices, and filtered reciprocity holds on the second factor. Joint +injectivity of restriction therefore gives filtered reciprocity upstairs. +-/ + +@[expose] public section + +noncomputable +section + +open scoped ValuativeRel + +namespace LocalClassFieldTheory + +open RamificationTheory.LocalField +open LubinTate + +open LocalClassFieldTheory +open LocalFieldTheory + +/-- Real filtered local reciprocity for the fixed field represented by the +standard equal-characteristic finite abelian compositum. -/ +theorem + equalCharacteristicStandardFiniteAbelianCompositum_filteredLocalReciprocity + (K : Type) [Field K] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (p : ℕ) [Fact p.Prime] [CharP K p] + (ϖ : Kˣ) + (hϖ : + IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul ϖ) = 1) + (d n : ℕ) (hd : 0 < d) + (t : ℝ) (ht : 0 ≤ t) : + let P := + equalCharacteristicStandardFiniteAbelianCompositum + K p ϖ hϖ d n hd + let F := + abstractFixedField K (SeparableClosure K) P.field + letI : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) P.field + (finiteAbelianSubextension_finite_over_absoluteBase K P) + letI : IsAbelianGalois K F := + finiteAbelianSubextension_fixedField_isAbelianGalois K P + artinPrincipalUnitStepGroup K F t = + localUpperRamificationGroup K F t := by + let U := localFiniteUnramifiedAbelianSubextension K d hd + let H₁ := localFiniteUnramifiedAbstractField K d hd + let T := + equalCharacteristicTransportedLubinTateFiniteAbelianSubextension + K p ϖ hϖ (n - 1) + let P := + equalCharacteristicStandardFiniteAbelianCompositum + K p ϖ hϖ d n hd + let E₁ := + abstractFixedField K (SeparableClosure K) H₁.field + let E₂ := + abstractFixedField K (SeparableClosure K) T.field + let F := + abstractFixedField K (SeparableClosure K) P.field + let : FiniteDimensional K E₁ := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H₁.field H₁.finite + let : FiniteDimensional K E₂ := + abstractFixedField_finiteDimensional + K (SeparableClosure K) T.field + (finiteAbelianSubextension_finite_over_absoluteBase K T) + let : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) P.field + (finiteAbelianSubextension_finite_over_absoluteBase K P) + let : IsAbelianGalois K E₁ := + by + change IsAbelianGalois K + (abstractFixedField K (SeparableClosure K) U.field) + exact finiteAbelianSubextension_fixedField_isAbelianGalois K U + let : IsAbelianGalois K E₂ := + finiteAbelianSubextension_fixedField_isAbelianGalois K T + let : IsAbelianGalois K F := + finiteAbelianSubextension_fixedField_isAbelianGalois K P + have hsup : E₁ ⊔ E₂ = F := by + simpa only [E₁, E₂, F, H₁, U, T, P, + localFiniteUnramifiedAbstractField_field] using + (equalCharacteristicStandardFiniteAbelianCompositum_fixedField_eq_sup + K p ϖ hϖ d n hd).symm + have hE₁ : E₁ ≤ F := by + rw [← hsup] + exact le_sup_left + have hE₂ : E₂ ≤ F := by + rw [← hsup] + exact le_sup_right + have hArtin₁ : + artinPrincipalUnitStepGroup K E₁ t = ⊥ := by + simpa only [E₁, H₁] using + artinPrincipalUnitStepGroup_finiteUnramifiedAbelianExtension_eq_bot + K d hd t + have hUpper₁ : + localUpperRamificationGroup K E₁ t = ⊥ := by + simpa only [E₁, H₁] using + localUpperRamificationGroup_finiteUnramifiedAbelianExtension_eq_bot + K d hd t ht + have hfiltered₂ : + artinPrincipalUnitStepGroup K E₂ t = + localUpperRamificationGroup K E₂ t := by + simpa only [E₂, T] using + equalCharacteristicTransportedLubinTateFixedField_filteredLocalReciprocity + K p ϖ hϖ (n - 1) t ht + exact + filteredLocalReciprocity_of_compositum + K E₁ E₂ F hE₁ hE₂ hsup t hArtin₁ hUpper₁ hfiltered₂ + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/FiniteAbelian.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/FiniteAbelian.lean new file mode 100644 index 0000000000..1cab6c434f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/FiniteAbelian.lean @@ -0,0 +1,273 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.StandardCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardDominatingExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFixedFieldComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.FirstRamificationComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.InertiaCard +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteInertiaStructure +/-! +# Filtered reciprocity for arbitrary finite abelian local extensions + +An arbitrary finite abelian extension embeds into a standard finite +abelian compositum. Passing to its field range inside the fixed separable +closure permits descent by restriction, and the resulting algebra +equivalence transports both filtrations back to the original extension. +-/ + +@[expose] public section + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction_one_pos_le_one → + herbrandFunction_one_pos_le_one + +open _root_.RamificationTheory.HilbertRamification.Higher renaming + upperRamificationGroupOfUniqueExtension_herbrandFunction → + upperRamificationGroupOfUniqueExtension_herbrandFunction + +open _root_.RamificationTheory.HilbertRamification.ValuationSubring renaming + ramificationGroup_eq_bot_iff_residueChar_not_dvd_inertia_card → + ramificationGroup_eq_bot_iff_residueChar_not_dvd_inertia_card + + +noncomputable +section + +open scoped ValuativeRel + +namespace LocalClassFieldTheory + +open RamificationTheory.LocalField +open LubinTate + +open LocalClassFieldTheory +open LocalFieldTheory + +/-- Characteristic-independent real filtered local reciprocity for every +finite abelian extension of a nonarchimedean local field. -/ +theorem finiteAbelian_filteredLocalReciprocity + (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [IsAbelianGalois K L] + (t : ℝ) (ht : 0 ≤ t) : + artinPrincipalUnitStepGroup K L t = + localUpperRamificationGroup K L t := by + obtain ⟨d, n, hd, _hn, hEmbed⟩ := + exists_finiteAbelianDominatingStandardLubinTateCompositum K L + let P := standardLubinTateFiniteAbelianCompositum K d n hd + let F := + abstractFixedField K (SeparableClosure K) P.field + let : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) P.field + (finiteAbelianSubextension_finite_over_absoluteBase K P) + let : IsAbelianGalois K F := + finiteAbelianSubextension_fixedField_isAbelianGalois K P + let i : L →ₐ[K] F := hEmbed.some + let j : L →ₐ[K] SeparableClosure K := F.val.comp i + let E : IntermediateField K (SeparableClosure K) := + AlgHom.fieldRange j + have hEF : E ≤ F := by + rintro x ⟨y, rfl⟩ + exact (i y).property + let e : L ≃ₐ[K] E := + AlgEquiv.ofInjectiveField j + let : FiniteDimensional K E := + e.toLinearEquiv.finiteDimensional + let : IsAbelianGalois K E := + IsAbelianGalois.of_algHom (IntermediateField.inclusion hEF) + have hcover : + ∀ s : ℝ, 0 ≤ s → + artinPrincipalUnitStepGroup K F s = + localUpperRamificationGroup K F s := by + intro s hs + exact + standardLubinTateFiniteAbelianCompositum_filteredLocalReciprocity + K d n hd s hs + have hupper : + ∀ s : ℝ, + Subgroup.map + (RamificationTheory.intermediateFieldRestrictNormalHom E F hEF) + (localUpperRamificationGroup K F s) = + localUpperRamificationGroup K E s := by + intro s + exact localUpperRamificationGroup_map_restrict K E F hEF s + have hEfiltered : + artinPrincipalUnitStepGroup K E t = + localUpperRamificationGroup K E t := + filteredLocalReciprocity_descends + K E F hEF + (localUpperRamificationGroup K E) + (localUpperRamificationGroup K F) + hupper hcover t ht + let q : Gal(E/K) ≃* Gal(L/K) := + AlgEquiv.autCongr e.symm + have hArtin : + Subgroup.map q.toMonoidHom + (artinPrincipalUnitStepGroup K E t) = + artinPrincipalUnitStepGroup K L t := + artinPrincipalUnitStepGroup_map_standardFixedFieldEquiv + K E L e.symm t + have hUpper : + Subgroup.map q.toMonoidHom + (localUpperRamificationGroup K E t) = + localUpperRamificationGroup K L t := + localUpperRamificationGroup_map_autCongr K E L e.symm t + calc + artinPrincipalUnitStepGroup K L t = + Subgroup.map q.toMonoidHom + (artinPrincipalUnitStepGroup K E t) := + hArtin.symm + _ = + Subgroup.map q.toMonoidHom + (localUpperRamificationGroup K E t) := by + rw [hEfiltered] + _ = localUpperRamificationGroup K L t := hUpper + +/-- In a finite abelian local extension the first upper and lower groups +coincide. The normalization matters: `φ(1)` need not equal `1`, but it lies +in `(0, 1]`, where filtered reciprocity makes the upper group constant. -/ +theorem finiteAbelian_localUpperRamificationGroup_one_eq_localLowerRamificationGroup_one + (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [IsAbelianGalois K L] : + localUpperRamificationGroup K L 1 = + localLowerRamificationGroup K L 1 := by + let base := (localCompleteDVF K).toDVF + let target := (chosenLocalExtensionCompleteDVF K L).toDVF + let huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + base target := + chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension K L + let s : ℝ := + RamificationTheory.HilbertRamification.Higher.herbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq 1 + have hs : 0 < s ∧ s ≤ 1 := by + change 0 < + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + (RamificationTheory.HilbertRamification.Higher.lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq)) 1 ∧ + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + (RamificationTheory.HilbertRamification.Higher.lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq)) 1 ≤ 1 + exact + herbrandFunction_one_pos_le_one _ + have hStep (t : ℝ) (ht0 : 0 < t) (ht1 : t ≤ 1) : + localUpperRamificationGroup K L t = + artinPrincipalUnitGroup K L 1 := by + have hceil : ⌈t⌉₊ = 1 := + (Nat.ceil_eq_iff (by + decide : (1 : ℕ) ≠ 0)).2 (by + simpa using (show (0 : ℝ) < t ∧ t ≤ 1 from ⟨ht0, ht1⟩)) + calc + localUpperRamificationGroup K L t = + artinPrincipalUnitStepGroup K L t := + (finiteAbelian_filteredLocalReciprocity K L t ht0.le).symm + _ = artinPrincipalUnitGroup K L 1 := by + change artinPrincipalUnitGroup K L ⌈t⌉₊ = _ + rw [hceil] + have hAtS : + localUpperRamificationGroup K L s = + localLowerRamificationGroup K L 1 := by + change RamificationTheory.HilbertRamification.Higher.upperRamificationGroupOfUniqueExtension + (base := base) (target := target) huniq + (RamificationTheory.HilbertRamification.Higher.herbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq 1) = + RamificationTheory.HilbertRamification.Higher.lowerRamificationGroup + (base := base) (target := target) huniq 1 + exact + upperRamificationGroupOfUniqueExtension_herbrandFunction + (base := base) (target := target) huniq 1 + calc + localUpperRamificationGroup K L 1 = artinPrincipalUnitGroup K L 1 := + hStep 1 (by norm_num) le_rfl + _ = localUpperRamificationGroup K L s := (hStep s hs.1 hs.2).symm + _ = localLowerRamificationGroup K L 1 := hAtS + +/-- The first upper group of a finite abelian local extension is Hilbert's +ramification group for the chosen valuation ring, transported to `Gal(L/K)`. -/ +theorem finiteAbelian_localUpperRamificationGroup_one_eq_hilbertRamificationGroup + (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [IsAbelianGalois K L] : + localUpperRamificationGroup K L 1 = + Subgroup.comap + (RamificationTheory.HilbertRamification.CompleteDVF.galEquivDecompositionGroup + (base := localCompleteDVF K) + (target := chosenLocalExtensionCompleteDVF K L)).toMonoidHom + (RamificationTheory.HilbertRamification.ValuationSubring.ramificationGroupInDecomposition K + (chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring) := + (finiteAbelian_localUpperRamificationGroup_one_eq_localLowerRamificationGroup_one K L).trans + (localLowerRamificationGroup_one_eq_hilbertRamificationGroup K L) + +/-- For a finite abelian local extension, the conductor exponent is at most +one exactly when its first upper ramification group is trivial. This is the +filtered-reciprocity bridge used by the tame-ramification criterion. -/ +theorem localConductorExponent_le_one_iff_localUpperRamificationGroup_one_eq_bot + (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [IsAbelianGalois K L] : + localConductorExponent K L ≤ 1 ↔ + localUpperRamificationGroup K L 1 = ⊥ := by + have hstep : + artinPrincipalUnitStepGroup K L (1 : ℝ) = + artinPrincipalUnitGroup K L 1 := by + change artinPrincipalUnitGroup K L ⌈(1 : ℝ)⌉₊ = + artinPrincipalUnitGroup K L 1 + have hone : ⌈(1 : ℝ)⌉₊ = (1 : ℕ) := by norm_num + rw [hone] + rw [← finiteAbelian_filteredLocalReciprocity K L 1 (by norm_num), hstep] + exact (artinPrincipalUnitGroup_eq_bot_iff K L 1).symm + +/-- Conductor exponent at most one is equivalent to the absence of wild +ramification in the chosen valuation ring. -/ +theorem localConductorExponent_le_one_iff_hilbertRamificationGroup_eq_bot + (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [IsAbelianGalois K L] : + localConductorExponent K L ≤ 1 ↔ + RamificationTheory.HilbertRamification.ValuationSubring.ramificationGroup K + (chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring = ⊥ := by + rw [localConductorExponent_le_one_iff_localUpperRamificationGroup_one_eq_bot, + finiteAbelian_localUpperRamificationGroup_one_eq_localLowerRamificationGroup_one] + exact localLowerRamificationGroup_one_eq_bot_iff_hilbertRamificationGroup_eq_bot K L + +/-- The first conductor threshold is the usual tame criterion: the residue +characteristic does not divide the ramification index. -/ +theorem localConductorExponent_le_one_iff_residueChar_not_dvd_ramificationIndex + (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [IsAbelianGalois K L] + (p : ℕ) [Fact p.Prime] + [CharP (IsLocalRing.ResidueField + (chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring) p] : + localConductorExponent K L ≤ 1 ↔ + ¬ p ∣ ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + (localCompleteDVF K).toDVF + (chosenLocalExtensionCompleteDVF K L).toDVF := by + let A := (chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring + rw [localConductorExponent_le_one_iff_hilbertRamificationGroup_eq_bot] + exact + (ramificationGroup_eq_bot_iff_residueChar_not_dvd_inertia_card + K A p).trans (by + rw [RamificationTheory.LocalField.chosenLocalExtension_inertia_card_eq_ramificationIndex K L]) + +end LocalClassFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/InertiaUnramifiedExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/InertiaUnramifiedExtension.lean new file mode 100644 index 0000000000..b48d21fc2e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/InertiaUnramifiedExtension.lean @@ -0,0 +1,123 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.AbstractUnramified +/-! +# Finite local extensions fixed by inertia are unramified + +A finite Galois intermediate field of a local separable closure whose fixing +subgroup contains the kernel of the residue-degree map is unramified for its +canonical spectral valuation. The proof constructs its finite abstract field, +uses the existing abstract-to-valued unramifiedness theorem, and transports the +result along the infinite Galois correspondence. +-/ + +@[expose] public section + +open scoped ValuativeRel + +noncomputable +section + +namespace ClassFieldTower.Martinet.Shafarevich + +open LocalClassFieldTheory LocalFieldTheory RamificationTheory ClassFormation +open CyclicCohomology +open LocalFieldTheory.IsNonarchimedeanLocalField + +/- The private predicate isolates the canonical spectral instance setup for +equality transport. The public theorem below exposes the same instances +directly, so consumers need not use this implementation predicate. -/ +private def SpectrallyUnramifiedLocalIntermediateField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (E : IntermediateField K (SeparableClosure K)) + [FiniteDimensional K E] : Prop := by + letI : NontriviallyNormedField E := + finiteExtensionSpectralNormedField K E + letI : ValuativeRel E := finiteExtensionSpectralValuativeRel K E + letI : IsNonarchimedeanLocalField E := + finiteExtensionSpectralIsNonarchimedeanLocalField K E + letI : Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation E) := + finiteExtensionSpectralValuation_hasExtension K E + letI : Module.Finite 𝒪[K] 𝒪[E] := + localCompleteDVF_integerRing_moduleFinite K E + exact IsUnramifiedValuedExtension K E + +private theorem spectrallyUnramifiedLocalIntermediateField_congr + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (E F : IntermediateField K (SeparableClosure K)) + [hEfin : FiniteDimensional K E] [hFfin : FiniteDimensional K F] + (h : E = F) : + SpectrallyUnramifiedLocalIntermediateField K E ↔ + SpectrallyUnramifiedLocalIntermediateField K F := by + subst F + rfl + +/-- A finite Galois local intermediate field fixed by inertia is unramified +for its canonical spectral valuation. -/ +theorem localIntermediateField_isUnramified_of_inertia_le + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (E : IntermediateField K (SeparableClosure K)) + [FiniteDimensional K E] [IsGalois K E] + (hE : MonoidHom.ker (localResidueDegree K).toMonoidHom ≤ E.fixingSubgroup) : + letI : NontriviallyNormedField E := + finiteExtensionSpectralNormedField K E + letI : ValuativeRel E := finiteExtensionSpectralValuativeRel K E + letI : IsNonarchimedeanLocalField E := + finiteExtensionSpectralIsNonarchimedeanLocalField K E + letI : Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation E) := + finiteExtensionSpectralValuation_hasExtension K E + letI : Module.Finite 𝒪[K] 𝒪[E] := + localCompleteDVF_integerRing_moduleFinite K E + IsUnramifiedValuedExtension K E := by + let H : FiniteAbstractField (Gal(SeparableClosure K/K)) := + { field := closedFixingSubgroup K (SeparableClosure K) E + finite := by + apply Nat.finite_of_card_ne_zero + change (extensionSubgroup + (baseField (Gal(SeparableClosure K/K))) + (closedFixingSubgroup K (SeparableClosure K) E) + (le_baseField _)).index ≠ 0 + have hindex : (extensionSubgroup + (baseField (Gal(SeparableClosure K/K))) + (closedFixingSubgroup K (SeparableClosure K) E) + (le_baseField _)).index = E.fixingSubgroup.index := by + symm + rw [← Subgroup.relIndex_top_right] + rfl + rw [hindex, ← IntermediateField.finrank_eq_fixingSubgroup_index + (SeparableClosure K) E] + exact (Module.finrank_pos (R := K) (M := E)).ne' } + have hnormal : + (extensionSubgroup + (baseField (Gal(SeparableClosure K/K))) H.field + (le_baseField H.field)).Normal := by + change (E.fixingSubgroup.subgroupOf + (⊤ : Subgroup (Gal(SeparableClosure K/K)))).Normal + infer_instance + have hunramified : + H.toFiniteAbstractExtension.IsUnramified (localResidueDatum K) := by + change + (baseField (Gal(SeparableClosure K/K))).toSubgroup ⊓ + (localResidueDegree K).toMonoidHom.ker ≤ E.fixingSubgroup + exact inf_le_right.trans hE + have h := abstractFixedField_isUnramifiedValuedExtension K H hnormal hunramified + have hfixed : abstractFixedField K (SeparableClosure K) H.field = E := + InfiniteGalois.fixedField_fixingSubgroup E + exact + (spectrallyUnramifiedLocalIntermediateField_congr K + (abstractFixedField K (SeparableClosure K) H.field) E + (hEfin := abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite) hfixed).mp h + +end ClassFieldTower.Martinet.Shafarevich diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/StandardCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/StandardCompositum.lean new file mode 100644 index 0000000000..de08d05f6e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/StandardCompositum.lean @@ -0,0 +1,120 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.AbstractUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Compositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFixedFieldComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardLubinTate +/-! +# Filtered reciprocity for the standard finite abelian compositum + +The characteristic-independent standard compositum consists of the +canonical unramified factor and a canonical standard Lubin--Tate factor. +At nonnegative indices the unramified factor contributes trivially, while +filtered reciprocity holds on the Lubin--Tate factor. Joint injectivity of +the two restriction maps gives the equality on their compositum. +-/ + +@[expose] public section + +noncomputable +section + +open scoped ValuativeRel + +namespace LocalClassFieldTheory + +open RamificationTheory.LocalField +open LubinTate + +open LocalClassFieldTheory +open LocalFieldTheory + +/-- Real filtered local reciprocity for the fixed field represented by the +characteristic-independent standard finite abelian compositum. -/ +theorem standardLubinTateFiniteAbelianCompositum_filteredLocalReciprocity + (K : Type) [Field K] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d n : ℕ) (hd : 0 < d) + (t : ℝ) (ht : 0 ≤ t) : + let P := standardLubinTateFiniteAbelianCompositum K d n hd + let F := + abstractFixedField K (SeparableClosure K) P.field + letI : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) P.field + (finiteAbelianSubextension_finite_over_absoluteBase K P) + letI : IsAbelianGalois K F := + finiteAbelianSubextension_fixedField_isAbelianGalois K P + artinPrincipalUnitStepGroup K F t = + localUpperRamificationGroup K F t := by + let U := localFiniteUnramifiedAbelianSubextension K d hd + let H₁ := localFiniteUnramifiedAbstractField K d hd + let T := standardLubinTateFiniteAbelianSubextension K (n - 1) + let P := standardLubinTateFiniteAbelianCompositum K d n hd + let E₁ := + abstractFixedField K (SeparableClosure K) H₁.field + let E₂ := + abstractFixedField K (SeparableClosure K) T.field + let F := + abstractFixedField K (SeparableClosure K) P.field + let : FiniteDimensional K E₁ := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H₁.field H₁.finite + let : FiniteDimensional K E₂ := + abstractFixedField_finiteDimensional + K (SeparableClosure K) T.field + (finiteAbelianSubextension_finite_over_absoluteBase K T) + let : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) P.field + (finiteAbelianSubextension_finite_over_absoluteBase K P) + let : IsAbelianGalois K E₁ := + by + change IsAbelianGalois K + (abstractFixedField K (SeparableClosure K) U.field) + exact finiteAbelianSubextension_fixedField_isAbelianGalois K U + let : IsAbelianGalois K E₂ := + finiteAbelianSubextension_fixedField_isAbelianGalois K T + let : IsAbelianGalois K F := + finiteAbelianSubextension_fixedField_isAbelianGalois K P + have hsup : E₁ ⊔ E₂ = F := by + simpa only [E₁, E₂, F, H₁, U, T, P, + localFiniteUnramifiedAbstractField_field] using + (standardLubinTateFiniteAbelianCompositum_fixedField_eq_sup + K d n hd).symm + have hE₁ : E₁ ≤ F := by + rw [← hsup] + exact le_sup_left + have hE₂ : E₂ ≤ F := by + rw [← hsup] + exact le_sup_right + have hArtin₁ : + artinPrincipalUnitStepGroup K E₁ t = ⊥ := by + simpa only [E₁, H₁] using + artinPrincipalUnitStepGroup_finiteUnramifiedAbelianExtension_eq_bot + K d hd t + have hUpper₁ : + localUpperRamificationGroup K E₁ t = ⊥ := by + simpa only [E₁, H₁] using + localUpperRamificationGroup_finiteUnramifiedAbelianExtension_eq_bot + K d hd t ht + have hfiltered₂ : + artinPrincipalUnitStepGroup K E₂ t = + localUpperRamificationGroup K E₂ t := by + simpa only [E₂, T] using + standardLubinTateFiniteAbelianSubextension_filteredLocalReciprocity + K (n - 1) t ht + exact + filteredLocalReciprocity_of_compositum + K E₁ E₂ F hE₁ hE₂ hsup t hArtin₁ hUpper₁ hfiltered₂ + +end LocalClassFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Unramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Unramified.lean new file mode 100644 index 0000000000..64b3cf1e3f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Unramified.lean @@ -0,0 +1,103 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified +/-! +# Artin filtrations of unramified local extensions + +The Artin map kills valuation-ring units in an unramified finite extension, +so every positive principal-unit image is trivial. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalClassFieldTheory +open LocalFieldTheory +open RamificationTheory.LocalField +open RamificationTheory.HilbertRamification +open RamificationTheory.HilbertRamification.Higher +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension +open scoped ValuativeRel + +/-! ## The Artin principal-unit filtration -/ + +/-- Every valuation-ring unit has trivial actual abelian Artin symbol in an +unramified finite extension. -/ +theorem + abelianLocalArtinMonoidHom_integerUnits_eq_one_of_unramifiedValuation + (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsAbelianGalois K L] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (u : 𝒪[K]ˣ) : + abelianLocalArtinMonoidHom K L + (LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits + K u) = 1 := by + unfold abelianLocalArtinMonoidHom + rw [MonoidHom.comp_apply, + localArtinMonoidHom_eq_frobenius_zpow K L, + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_apply, + LocalFieldTheory.IsNonarchimedeanLocalField.v_integerUnitsToFieldUnits, + zpow_zero, map_one] + +/-- Every integral Artin principal-unit group of an unramified finite +abelian extension is trivial. -/ +theorem artinPrincipalUnitGroup_eq_bot_of_unramifiedValuation + (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsAbelianGalois K L] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : ℕ) : + artinPrincipalUnitGroup K L n = ⊥ := by + apply le_antisymm + · intro σ hσ + rcases hσ with ⟨x, hx, rfl⟩ + rcases hx with ⟨u, hu, rfl⟩ + rw [ + abelianLocalArtinMonoidHom_integerUnits_eq_one_of_unramifiedValuation + K L u] + exact Subgroup.one_mem ⊥ + · exact bot_le + +/-- The real ceiling-step Artin filtration is therefore trivial at every +index on an unramified finite abelian extension. -/ +theorem artinPrincipalUnitStepGroup_eq_bot_of_unramifiedValuation + (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsAbelianGalois K L] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (t : ℝ) : + artinPrincipalUnitStepGroup K L t = ⊥ := by + exact + artinPrincipalUnitGroup_eq_bot_of_unramifiedValuation + K L ⌈t⌉₊ + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyRigidity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyRigidity.lean new file mode 100644 index 0000000000..1da44e13bd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyRigidity.lean @@ -0,0 +1,77 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.GroupTheory.OrderOfElement +/-! +# Rigidity from a cyclic quotient and subgroup data + +A finite abelian quotient is determined by its action on all intermediate +subgroups together with its action on a sufficiently large cyclic quotient. +The group-theoretic statement below isolates the part of uniqueness of a +coherent local Artin family that does not involve fields or valuations. +-/ + +@[expose] public section + +namespace LocalClassFieldTheory + +/-- Two homomorphisms into an abelian group coincide if every subgroup +containing a value of the first also contains the corresponding value of the +second, and if they agree after passage to a cyclic quotient whose generator +order annihilates the target. In the local Artin application the cyclic +quotient is supplied by an unramified extension. -/ +theorem monoidHom_ext_of_cyclic_quotient_and_subgroups + {A G C : Type*} [Group A] [Group G] [Group C] + (f g : A →* G) (β : G →* C) (u : A) + (hgenerator : Subgroup.zpowers (β (f u)) = ⊤) + (hexponent : ∀ z : G, z ^ orderOf (β (f u)) = 1) + (hsubgroups : ∀ (S : Subgroup G) (x : A), f x ∈ S → g x ∈ S) + (hquotient : ∀ x : A, β (g x) = β (f x)) : + f = g := by + have hfix (x : A) (hx : β (f x) = β (f u)) : g x = f x := by + obtain ⟨k, hk⟩ := Subgroup.mem_zpowers_iff.mp + (hsubgroups (Subgroup.zpowers (f x)) x (Subgroup.mem_zpowers (f x))) + have hpow : (β (f u)) ^ k = (β (f u)) ^ (1 : ℤ) := by + calc + (β (f u)) ^ k = (β (f x)) ^ k := by rw [hx] + _ = β ((f x) ^ k) := (map_zpow β (f x) k).symm + _ = β (g x) := congrArg β hk + _ = β (f x) := hquotient x + _ = β (f u) := hx + _ = (β (f u)) ^ (1 : ℤ) := (zpow_one _).symm + have hmod : k ≡ 1 [ZMOD orderOf (β (f u))] := + (zpow_eq_zpow_iff_modEq).mp hpow + have hdiv : (orderOf (f x) : ℤ) ∣ k - 1 := + (Int.natCast_dvd_natCast.mpr + (orderOf_dvd_of_pow_eq_one (hexponent (f x)))).trans hmod.symm.dvd + calc + g x = (f x) ^ k := hk.symm + _ = (f x) ^ (1 : ℤ) := (orderOf_dvd_sub_iff_zpow_eq_zpow).mp hdiv + _ = f x := zpow_one _ + have hu : g u = f u := hfix u rfl + apply MonoidHom.ext + intro x + have hxmem : β (f x) ∈ Subgroup.zpowers (β (f u)) := by + rw [hgenerator] + exact Subgroup.mem_top _ + obtain ⟨m, hm⟩ := Subgroup.mem_zpowers_iff.mp hxmem + have hy : β (f (x * u ^ (1 - m))) = β (f u) := by + calc + β (f (x * u ^ (1 - m))) = + β (f x) * (β (f u)) ^ (1 - m) := by + rw [map_mul, map_zpow, map_mul, map_zpow] + _ = (β (f u)) ^ m * (β (f u)) ^ (1 - m) := by rw [hm] + _ = (β (f u)) ^ (m + (1 - m)) := (zpow_add ..).symm + _ = β (f u) := by + have hsum : m + (1 - m) = (1 : ℤ) := by omega + rw [hsum, zpow_one] + have hxy : g x * (f u) ^ (1 - m) = f x * (f u) ^ (1 - m) := by + simpa only [map_mul, map_zpow, hu] using hfix (x * u ^ (1 - m)) hy + exact (mul_right_cancel hxy).symm + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilySubgroupKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilySubgroupKernel.lean new file mode 100644 index 0000000000..3d856df2b9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilySubgroupKernel.lean @@ -0,0 +1,113 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +public import Mathlib.FieldTheory.Galois.Basic +public import Mathlib.FieldTheory.IntermediateField.Algebraic +public import Mathlib.Topology.Algebra.ContinuousMonoidHom +/-! +# Subgroup data of coherent finite local reciprocity families + +At a fixed finite abelian stage, every Galois subgroup is the fixing subgroup +of an intermediate field. Transporting that field into the chosen separable +closure lets the common norm-kernel and tower conditions compare two Artin +families on every Galois subgroup. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open ClassFieldTheory + +/-- If two coherent families have the same norm kernels, membership in any +Galois subgroup for one family implies membership for the other. Applying +the result with the two families swapped gives equality of preimages. -/ +theorem finiteAbelianArtinFamilies_subgroup_preimage_le + (K : Type) [Field K] [TopologicalSpace K] + (f g : (E : FiniteAbelianLocalExtension K) → + Kˣ →ₜ* (E.1 ≃ₐ[K] E.1)) + (hfker : ∀ E : FiniteAbelianLocalExtension K, + (f E).toMonoidHom.ker = E.normSubgroup) + (hgker : ∀ E : FiniteAbelianLocalExtension K, + (g E).toMonoidHom.ker = E.normSubgroup) + (hfcoh : ∀ (E F : FiniteAbelianLocalExtension K) + (hEF : E.1 ≤ F.1) (x : Kˣ) (y : E.1), + IntermediateField.inclusion hEF ((f E x) y) = + (f F x) (IntermediateField.inclusion hEF y)) + (hgcoh : ∀ (E F : FiniteAbelianLocalExtension K) + (hEF : E.1 ≤ F.1) (x : Kˣ) (y : E.1), + IntermediateField.inclusion hEF ((g E x) y) = + (g F x) (IntermediateField.inclusion hEF y)) + (F : FiniteAbelianLocalExtension K) + (S : Subgroup (F.1 ≃ₐ[K] F.1)) (x : Kˣ) : + f F x ∈ S → g F x ∈ S := by + let M₀ : IntermediateField K F.1 := IntermediateField.fixedField S + let M : IntermediateField K (SeparableClosure K) := M₀.map F.1.val + let e : M₀ ≃ₐ[K] M := IntermediateField.equivMap M₀ F.1.val + let : FiniteDimensional K M := + LinearEquiv.finiteDimensional e.toLinearEquiv + let : IsAbelianGalois K M := + IsAbelianGalois.of_algHom e.symm.toAlgHom + let Mpack : FiniteAbelianLocalExtension K := + ⟨M, inferInstance, inferInstance⟩ + have hMF : M ≤ F.1 := by + intro z hz + obtain ⟨y, _, rfl⟩ := (IntermediateField.mem_map M₀).mp hz + exact y.property + have heIncl (y : M₀) : + IntermediateField.inclusion hMF (e y) = (y : F.1) := by + apply Subtype.ext + exact IntermediateField.coe_equivMap_apply M₀ F.1.val y + have hFix (σ : F.1 ≃ₐ[K] F.1) : + σ ∈ S ↔ + ∀ z : M, σ (IntermediateField.inclusion hMF z) = + IntermediateField.inclusion hMF z := by + rw [← IntermediateField.fixingSubgroup_fixedField S] + rw [IntermediateField.mem_fixingSubgroup_iff] + constructor + · intro hσ z + obtain ⟨y, rfl⟩ := e.surjective z + rw [heIncl] + exact hσ y y.property + · intro hσ y hy + let z : M₀ := ⟨y, hy⟩ + have hz := hσ (e z) + rw [heIncl] at hz + exact hz + intro hσS + have hfM : f Mpack x = 1 := by + apply AlgEquiv.ext + intro z + change (f Mpack x) z = z + apply (IntermediateField.inclusion hMF).injective + calc + IntermediateField.inclusion hMF ((f Mpack x) z) = + (f F x) (IntermediateField.inclusion hMF z) := + hfcoh Mpack F hMF x z + _ = IntermediateField.inclusion hMF z := (hFix (f F x)).mp hσS z + have hnorm : x ∈ Mpack.normSubgroup := by + rw [← hfker Mpack] + exact hfM + have hgM : g Mpack x = 1 := by + have hmem : x ∈ (g Mpack).toMonoidHom.ker := by + rw [hgker Mpack] + exact hnorm + exact hmem + apply (hFix (g F x)).mpr + intro z + calc + (g F x) (IntermediateField.inclusion hMF z) = + IntermediateField.inclusion hMF ((g Mpack x) z) := + (hgcoh Mpack F hMF x z).symm + _ = IntermediateField.inclusion hMF z := by rw [hgM]; rfl + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyUnramifiedCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyUnramifiedCompositum.lean new file mode 100644 index 0000000000..383bc74c6b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyUnramifiedCompositum.lean @@ -0,0 +1,107 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.FiniteUnramifiedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +public import Mathlib.GroupTheory.SpecificGroups.Cyclic.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.CompositumRestriction +/-! +# An unramified factor large enough for finite Artin rigidity + +For a finite abelian local extension `E`, adjoining the unramified extension +of degree divisible by `|Gal(E/K)|` produces a Galois group annihilated by +that degree. Restriction to the unramified factor sends the normalized Artin +value of a valuation-one unit to a generator. These are the two field-level +inputs to cyclic-quotient rigidity. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open RamificationTheory LocalFieldTheory +open scoped ValuativeRel + +/-- The Galois group of the compositum is annihilated by the unramified +degree when that degree is divisible by the size of the first Galois group. -/ +theorem finiteAbelianUnramifiedCompositum_pow_eq_one + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (E : IntermediateField K (SeparableClosure K)) + [FiniteDimensional K E] [IsAbelianGalois K E] + (d : ℕ) (hd : 0 < d) + (hcard : Nat.card (E ≃ₐ[K] E) ∣ d) : + ∀ σ : Gal(↑(E ⊔ localFiniteUnramifiedField K d hd)/K), + σ ^ d = 1 := by + let U := localFiniteUnramifiedField K d hd + let F := E ⊔ U + let rE := intermediateFieldRestrictNormalHom E F le_sup_left + let rU := intermediateFieldRestrictNormalHom U F le_sup_right + have hUcard : Nat.card (U ≃ₐ[K] U) = d := by + rw [IsGalois.card_aut_eq_finrank] + exact localFiniteUnramifiedField_finrank K d hd + have hinj : Function.Injective (rE.prod rU) := + intermediateFieldRestrictNormalHom_prod_injective_of_sup_eq + K E U F le_sup_left le_sup_right rfl + intro σ + apply hinj + change (rE.prod rU) (σ ^ d) = (rE.prod rU) 1 + apply Prod.ext + · change rE (σ ^ d) = rE 1 + rw [map_pow, map_one] + exact (orderOf_dvd_iff_pow_eq_one).mp + ((orderOf_dvd_natCard (rE σ)).trans hcard) + · change rU (σ ^ d) = rU 1 + rw [map_pow, map_one] + exact (orderOf_dvd_iff_pow_eq_one).mp + (hUcard ▸ orderOf_dvd_natCard (rU σ)) + +/-- Restriction of the canonical local Artin value of a valuation-one unit +generates the Galois group of the standard unramified extension. -/ +theorem finiteAbelianArtin_unramifiedRestriction_zpowers_eq_top + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (d : ℕ) (hd : 0 < d) + (F : IntermediateField K (SeparableClosure K)) + [FiniteDimensional K F] [IsAbelianGalois K F] + (hUF : localFiniteUnramifiedField K d hd ≤ F) + (u : Kˣ) + (hu : LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul u) = 1) : + Subgroup.zpowers + (intermediateFieldRestrictNormalHom + (localFiniteUnramifiedField K d hd) F hUF + (abelianLocalArtinMap K F u)) = ⊤ := by + let U := localFiniteUnramifiedField K d hd + let rU := intermediateFieldRestrictNormalHom U F hUF + have hrestrict : rU (abelianLocalArtinMap K F u) = + arithmeticFrobeniusOfUnramifiedValuation K U := by + have h := DFunLike.congr_fun + (abelianLocalArtinMap_restrict K U F hUF) u + change rU (abelianLocalArtinMap K F u) = + abelianLocalArtinMap K U u at h + exact h.trans (ClassFieldTheory.finiteAbelianLocalArtinMap_uniformizer K U u hu) + have hUcard : Nat.card (U ≃ₐ[K] U) = d := by + rw [IsGalois.card_aut_eq_finrank] + exact localFiniteUnramifiedField_finrank K d hd + apply (Subgroup.card_eq_iff_eq_top + (Subgroup.zpowers (rU (abelianLocalArtinMap K F u)))).mp + calc + Nat.card (Subgroup.zpowers (rU (abelianLocalArtinMap K F u))) = + orderOf (rU (abelianLocalArtinMap K F u)) := Nat.card_zpowers _ + _ = d := by + rw [hrestrict] + exact localFiniteUnramifiedField_arithmeticFrobenius_order K d hd + _ = Nat.card (U ≃ₐ[K] U) := hUcard.symm + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean new file mode 100644 index 0000000000..c3b85a7907 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean @@ -0,0 +1,411 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension + +/-! # Finite Abstract Fixed Field -/ + +@[expose] public section +namespace LocalClassFieldTheory +open RamificationTheory KummerTheory CyclicCohomology + +open ClassFormation + +/-! +# Finite local reciprocity: finite abstract fields inside a separable closure + +The abstract fields to which the class field axiom is applied are the open +closed subgroups of the absolute Galois group. This file turns the explicit +finite-index witness from the abstract class-formation data into the corresponding finite fixed +field. It is the field-theoretic input needed before the local class-field-axiom theorem can be +applied. +-/ + +noncomputable +section + +variable (k Ω : Type) [Field k] [Field Ω] [Algebra k Ω] [IsGalois k Ω] + +/-- The concrete fixed field represented by an abstract closed subgroup. -/ +abbrev abstractFixedField (H : ClosedSubgroup (Gal(Ω/k))) : + IntermediateField k Ω := + IntermediateField.fixedField H.toSubgroup + +/-- Passing from an abstract field to its concrete fixed field +and back recovers the original closed subgroup. -/ +theorem closedFixingSubgroup_abstractFixedField_eq + (H : ClosedSubgroup (Gal(Ω/k))) : + closedFixingSubgroup k Ω (abstractFixedField k Ω H) = H := by + ext σ + change σ ∈ (abstractFixedField k Ω H).fixingSubgroup ↔ σ ∈ H + rw [InfiniteGalois.fixingSubgroup_fixedField H] + rfl + +omit [IsGalois k Ω] in +/-- Absolute finiteness in the abstract class-formation quotient presentation gives a +finite quotient of the ambient absolute Galois group by the same subgroup. -/ +theorem ambientQuotientFiniteOfAbstractFinite + (H : ClosedSubgroup (Gal(Ω/k))) + (hfinite : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) H (le_baseField H))) : + Finite (Gal(Ω/k) ⧸ H.toSubgroup) := by + apply Nat.finite_of_card_ne_zero + change H.toSubgroup.index ≠ 0 + rw [← Subgroup.relIndex_top_right] + change (extensionSubgroup (baseField (Gal(Ω/k))) H + (le_baseField H)).index ≠ 0 + exact @Subgroup.index_ne_zero_of_finite + (baseField (Gal(Ω/k))).toSubgroup _ + (extensionSubgroup (baseField (Gal(Ω/k))) H (le_baseField H)) + hfinite + +omit [IsGalois k Ω] in +/-- An abstract field finite over the distinguished base is represented by +an open subgroup of the absolute Galois group. -/ +theorem abstractFiniteClosedSubgroup_isOpen + (H : ClosedSubgroup (Gal(Ω/k))) + (hfinite : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) H (le_baseField H))) : + IsOpen H.carrier := by + let : Finite (Gal(Ω/k) ⧸ H.toSubgroup) := + ambientQuotientFiniteOfAbstractFinite k Ω H hfinite + let : Subgroup.FiniteIndex H.toSubgroup := + H.toSubgroup.finiteIndex_of_finite_quotient + exact Subgroup.isOpen_of_isClosed_of_finiteIndex H.toSubgroup H.isClosed' + +/-- The fixed field of an abstract field finite over the distinguished base +is an actual finite field extension. -/ +theorem abstractFixedField_finiteDimensional + (H : ClosedSubgroup (Gal(Ω/k))) + (hfinite : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) H (le_baseField H))) : + FiniteDimensional k (abstractFixedField k Ω H) := by + apply (InfiniteGalois.isOpen_iff_finite + (K := Ω) (abstractFixedField k Ω H)).1 + rw [InfiniteGalois.fixingSubgroup_fixedField H] + exact abstractFiniteClosedSubgroup_isOpen k Ω H hfinite + +omit [IsGalois k Ω] in +/-- Inclusion of abstract subgroups reverses to inclusion of their concrete +fixed fields. -/ +theorem abstractFixedField_le {K L : ClosedSubgroup (Gal(Ω/k))} + (hLK : L.toSubgroup ≤ K.toSubgroup) : + abstractFixedField k Ω K ≤ abstractFixedField k Ω L := + IntermediateField.fixedField_le hLK + +/-- The abstract subgroup representing a fixed field is canonically the +absolute Galois group of the ambient extension over that fixed field. -/ +def abstractSubgroupEquivGaloisGroup + (H : ClosedSubgroup (Gal(Ω/k))) : + H.toSubgroup ≃* Gal(Ω/abstractFixedField k Ω H) := + (MulEquiv.subgroupCongr + (InfiniteGalois.fixingSubgroup_fixedField H).symm).trans + (IntermediateField.fixingSubgroupEquiv (abstractFixedField k Ω H)) + +/-- States the theorem `abstractSubgroupEquivGaloisGroup_apply`. -/ +@[simp] +theorem abstractSubgroupEquivGaloisGroup_apply + (H : ClosedSubgroup (Gal(Ω/k))) (σ : H.toSubgroup) (x : Ω) : + abstractSubgroupEquivGaloisGroup k Ω H σ x = σ.1 x := + rfl + +/-- The upper fixed field, regarded as an intermediate field over the lower +fixed field in a relative abstract extension. -/ +abbrev abstractRelativeFixedField + {K L : ClosedSubgroup (Gal(Ω/k))} + (hLK : L.toSubgroup ≤ K.toSubgroup) : + IntermediateField (abstractFixedField k Ω K) Ω := + IntermediateField.extendScalars (abstractFixedField_le k Ω hLK) + +/-- Under the preceding Galois-group equivalence, the relative class-formation +subgroup is exactly the subgroup fixing the upper concrete field. -/ +theorem map_extensionSubgroup_abstractSubgroupEquiv + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) : + (extensionSubgroup K L hLK).map + (abstractSubgroupEquivGaloisGroup k Ω K).toMonoidHom = + (abstractRelativeFixedField k Ω hLK).fixingSubgroup := by + ext τ + constructor + · rintro ⟨σ, hσ, rfl⟩ + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + have hσL : (σ.1 : Gal(Ω/k)) ∈ L := + (mem_extensionSubgroup_iff K L hLK σ).1 hσ + have hfix : ∀ y ∈ abstractFixedField k Ω L, σ.1 y = y := by + have hσfix : σ.1 ∈ (abstractFixedField k Ω L).fixingSubgroup := by + rw [InfiniteGalois.fixingSubgroup_fixedField L] + exact hσL + exact (IntermediateField.mem_fixingSubgroup_iff + (abstractFixedField k Ω L) σ.1).1 hσfix + exact hfix x hx + · intro hτ + let σ : K.toSubgroup := + (abstractSubgroupEquivGaloisGroup k Ω K).symm τ + refine ⟨σ, ?_, (abstractSubgroupEquivGaloisGroup k Ω K).apply_symm_apply τ⟩ + apply (mem_extensionSubgroup_iff K L hLK σ).2 + have hσfix : (σ.1 : Gal(Ω/k)) ∈ + (abstractFixedField k Ω L).fixingSubgroup := by + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + have hτfix := (IntermediateField.mem_fixingSubgroup_iff + (abstractRelativeFixedField k Ω hLK) τ).1 hτ x hx + calc + σ.1 x = abstractSubgroupEquivGaloisGroup k Ω K σ x := + (abstractSubgroupEquivGaloisGroup_apply k Ω K σ x).symm + _ = τ x := by + rw [show abstractSubgroupEquivGaloisGroup k Ω K σ = τ by + exact (abstractSubgroupEquivGaloisGroup k Ω K).apply_symm_apply τ] + _ = x := hτfix + rw [InfiniteGalois.fixingSubgroup_fixedField L] at hσfix + exact hσfix + +/-- Relative normality in the abstract class-formation framework is the actual normality of the +subgroup +fixing the upper field inside the lower field's absolute Galois group. -/ +theorem abstractRelativeFixingSubgroup_normal + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) : + (abstractRelativeFixedField k Ω hLK).fixingSubgroup.Normal := by + have hmap : ((extensionSubgroup K L hLK).map + (abstractSubgroupEquivGaloisGroup k Ω K).toMonoidHom).Normal := + hnormal.map (abstractSubgroupEquivGaloisGroup k Ω K).toMonoidHom + (abstractSubgroupEquivGaloisGroup k Ω K).surjective + rw [map_extensionSubgroup_abstractSubgroupEquiv k Ω K L hLK] at hmap + exact hmap + +/-- The concrete relative fixed field is Galois precisely from the normality +witness occurring in the abstract cyclic extension. -/ +theorem abstractRelativeFixedField_isGalois + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) : + IsGalois (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK) := by + apply (InfiniteGalois.normal_iff_isGalois + (abstractRelativeFixedField k Ω hLK)).1 + exact abstractRelativeFixingSubgroup_normal k Ω K L hLK hnormal + +/-- Restriction through the lower fixed field, followed by quotienting by +the upper fixing subgroup. -/ +def abstractRelativeToAmbientQuotient + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) : + letI := abstractRelativeFixingSubgroup_normal k Ω K L hLK hnormal + K.toSubgroup →* + Gal(Ω/abstractFixedField k Ω K) ⧸ + (abstractRelativeFixedField k Ω hLK).fixingSubgroup := by + letI : (abstractRelativeFixedField k Ω hLK).fixingSubgroup.Normal := + abstractRelativeFixingSubgroup_normal k Ω K L hLK hnormal + exact (QuotientGroup.mk' + (abstractRelativeFixedField k Ω hLK).fixingSubgroup).comp + (abstractSubgroupEquivGaloisGroup k Ω K).toMonoidHom + +/-- The kernel of the preceding quotient map is the exact abstract class-formation +relative subgroup. -/ +theorem abstractRelativeToAmbientQuotient_ker + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) : + letI := abstractRelativeFixingSubgroup_normal k Ω K L hLK hnormal + (abstractRelativeToAmbientQuotient k Ω K L hLK hnormal).ker = + extensionSubgroup K L hLK := by + let : (abstractRelativeFixedField k Ω hLK).fixingSubgroup.Normal := + abstractRelativeFixingSubgroup_normal k Ω K L hLK hnormal + ext σ + change + QuotientGroup.mk' (abstractRelativeFixedField k Ω hLK).fixingSubgroup + (abstractSubgroupEquivGaloisGroup k Ω K σ) = 1 ↔ + σ ∈ extensionSubgroup K L hLK + rw [QuotientGroup.mk'_apply, QuotientGroup.eq_one_iff] + rw [← map_extensionSubgroup_abstractSubgroupEquiv k Ω K L hLK] + constructor + · rintro ⟨τ, hτ, hτσ⟩ + have : τ = σ := + (abstractSubgroupEquivGaloisGroup k Ω K).injective hτσ + simpa [this] using hτ + · intro hσ + exact ⟨σ, hσ, rfl⟩ + +/-- The quotient map from the abstract lower subgroup is surjective. -/ +theorem abstractRelativeToAmbientQuotient_surjective + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) : + letI := abstractRelativeFixingSubgroup_normal k Ω K L hLK hnormal + Function.Surjective + (abstractRelativeToAmbientQuotient k Ω K L hLK hnormal) := by + let : (abstractRelativeFixedField k Ω hLK).fixingSubgroup.Normal := + abstractRelativeFixingSubgroup_normal k Ω K L hLK hnormal + intro q + refine Quotient.inductionOn' q ?_ + intro τ + refine ⟨(abstractSubgroupEquivGaloisGroup k Ω K).symm τ, ?_⟩ + change QuotientGroup.mk + (abstractSubgroupEquivGaloisGroup k Ω K + ((abstractSubgroupEquivGaloisGroup k Ω K).symm τ)) = + QuotientGroup.mk τ + rw [(abstractSubgroupEquivGaloisGroup k Ω K).apply_symm_apply] + +/-- The exact abstract class-formation quotient of a relative normal extension is the +ordinary quotient of the lower absolute Galois group by the upper fixing +subgroup. -/ +def abstractExtensionQuotientEquivAmbient + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) : + letI := hnormal + letI := abstractRelativeFixingSubgroup_normal k Ω K L hLK hnormal + K.toSubgroup ⧸ extensionSubgroup K L hLK ≃* + Gal(Ω/abstractFixedField k Ω K) ⧸ + (abstractRelativeFixedField k Ω hLK).fixingSubgroup := by + letI := hnormal + letI : (abstractRelativeFixedField k Ω hLK).fixingSubgroup.Normal := + abstractRelativeFixingSubgroup_normal k Ω K L hLK hnormal + exact (QuotientGroup.quotientMulEquivOfEq + (abstractRelativeToAmbientQuotient_ker + k Ω K L hLK hnormal).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (abstractRelativeToAmbientQuotient k Ω K L hLK hnormal) + (abstractRelativeToAmbientQuotient_surjective + k Ω K L hLK hnormal)) + +/-- The quotient group appearing in the abstract class-field-axiom predicate is +canonically the actual Galois group of the two concrete fixed fields. -/ +def abstractExtensionQuotientEquivGaloisGroup + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) : + letI := hnormal + K.toSubgroup ⧸ extensionSubgroup K L hLK ≃* + Gal(abstractRelativeFixedField k Ω hLK/abstractFixedField k Ω K) := by + letI := hnormal + letI : (abstractRelativeFixedField k Ω hLK).fixingSubgroup.Normal := + abstractRelativeFixingSubgroup_normal k Ω K L hLK hnormal + let H : ClosedSubgroup (Gal(Ω/abstractFixedField k Ω K)) := + closedFixingSubgroup (abstractFixedField k Ω K) Ω + (abstractRelativeFixedField k Ω hLK) + letI : H.toSubgroup.Normal := by + exact abstractRelativeFixingSubgroup_normal k Ω K L hLK hnormal + exact (abstractExtensionQuotientEquivAmbient + k Ω K L hLK hnormal).trans + ((InfiniteGalois.normalAutEquivQuotient H).trans + (AlgEquiv.autCongr + (IntermediateField.equivOfEq + (InfiniteGalois.fixedField_fixingSubgroup + (abstractRelativeFixedField k Ω hLK))))) + +/-- In a finite abstract tower `L / K / k`, the concrete upper fixed field is +finite over the concrete lower fixed field. -/ +theorem abstractFixedField_relativeFiniteDimensional + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hKfinite : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K (le_baseField K))) + (hLKfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)) : + letI : Algebra (abstractFixedField k Ω K) (abstractFixedField k Ω L) := + RingHom.toAlgebra + (IntermediateField.inclusion (abstractFixedField_le k Ω hLK)) + FiniteDimensional (abstractFixedField k Ω K) + (abstractFixedField k Ω L) := by + let : Algebra (abstractFixedField k Ω K) (abstractFixedField k Ω L) := + RingHom.toAlgebra + (IntermediateField.inclusion (abstractFixedField_le k Ω hLK)) + let : IsScalarTower k (abstractFixedField k Ω K) + (abstractFixedField k Ω L) := + IsScalarTower.of_algebraMap_eq' rfl + let : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K (le_baseField K)) := + hKfinite + let : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := hLKfinite + let : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) L (le_baseField L)) := + FiniteGaloisSubextension.finite_extension_trans hLK (le_baseField K) + let : FiniteDimensional k (abstractFixedField k Ω L) := + abstractFixedField_finiteDimensional k Ω L inferInstance + exact FiniteDimensional.right k + (abstractFixedField k Ω K) (abstractFixedField k Ω L) + +/-- The same relative finiteness statement in the scalar-extended +intermediate-field presentation used by infinite Galois theory. -/ +theorem abstractRelativeFixedField_finiteDimensional + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hKfinite : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K (le_baseField K))) + (hLKfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)) : + FiniteDimensional (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK) := by + let : Algebra (abstractFixedField k Ω K) (abstractFixedField k Ω L) := + RingHom.toAlgebra + (IntermediateField.inclusion (abstractFixedField_le k Ω hLK)) + let : FiniteDimensional (abstractFixedField k Ω K) + (abstractFixedField k Ω L) := + abstractFixedField_relativeFiniteDimensional + k Ω K L hLK hKfinite hLKfinite + let e : abstractFixedField k Ω L ≃ₗ[abstractFixedField k Ω K] + abstractRelativeFixedField k Ω hLK := + { toFun := fun x => ⟨x.1, x.2⟩ + invFun := fun x => ⟨x.1, x.2⟩ + left_inv := fun _ => rfl + right_inv := fun _ => rfl + map_add' := fun _ _ => rfl + map_smul' := fun _ _ => rfl } + exact e.finiteDimensional + +/-- The abstract extension degree is the ordinary degree of the concrete +finite Galois extension represented by the same pair of fixed fields. -/ +theorem finiteAbstractExtension_degree_eq_finrank + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (hKfinite : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K (le_baseField K))) + (hLKfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)) : + ((DegreeData.FiniteAbstractExtension.ofInclusion L K hLK).degree : ℕ) = + Module.finrank (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK) := by + let := hnormal + let : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := hLKfinite + let : FiniteDimensional (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK) := + abstractRelativeFixedField_finiteDimensional + k Ω K L hLK hKfinite hLKfinite + let : IsGalois (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK) := + abstractRelativeFixedField_isGalois k Ω K L hLK hnormal + calc + ((DegreeData.FiniteAbstractExtension.ofInclusion L K hLK).degree : ℕ) = + (extensionSubgroup K L hLK).index := + (DegreeData.FiniteAbstractExtension.ofInclusion L K + hLK).extensionSubgroup_index_eq_degree.symm + _ = Nat.card + (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + Subgroup.index_eq_card (extensionSubgroup K L hLK) + _ = Nat.card (Gal(abstractRelativeFixedField k Ω hLK/abstractFixedField k Ω K)) := + Nat.card_congr + (abstractExtensionQuotientEquivGaloisGroup + k Ω K L hLK hnormal).toEquiv + _ = Module.finrank (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK) := + IsGalois.card_aut_eq_finrank + (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK) + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteExtensionClassFieldAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteExtensionClassFieldAxiom.lean new file mode 100644 index 0000000000..2a0c10ff8b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteExtensionClassFieldAxiom.lean @@ -0,0 +1,231 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import Mathlib.Analysis.Normed.Unbundled.SpectralNorm +public import Mathlib.Topology.Algebra.Module.FiniteDimension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Main + +/-! # Finite Extension Class Field Axiom -/ + +@[expose] public section +namespace LocalClassFieldTheory + +open LocalFieldTheory + +open ValuationTheory + +open CyclicCohomology + +/-! +# Finite local reciprocity + +The local class-field-axiom theorem on finite extensions of a local field. + +Mathlib's local-field predicate is topology-first, while the local class-field-axiom theorem also +needs a compatible local-field structure on the finite extension. This file +constructs that structure from the spectral norm. In particular, the target +valuation ring is proved integral over the base valuation ring; no local-field +structure on the target is assumed. +-/ + +noncomputable +section + +open scoped NNReal ValuativeRel + +/-- Finite-cardinality data for the two actual unit Tate groups. Bundling the +`H⁰` finiteness proof keeps `Nat.card` honest when the local-field +structure on the extension is constructed inside a theorem. -/ +structure UnitsTateCardinalityData + (K L : Type) [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] where + /-- Finiteness of the degree-zero Tate cohomology group of the unit representation. -/ + finiteH0 : Finite (tateCohomology (Rep.ofAlgebraAutOnUnits K L) 0) + /-- The degree-zero unit Tate group has cardinality equal to the extension degree. -/ + cardH0 : + letI := finiteH0 + Nat.card (tateCohomology (Rep.ofAlgebraAutOnUnits K L) 0) = Module.finrank K L + /-- The degree-minus-one unit Tate group is trivial at the level of cardinality. -/ + cardHminusOne : Nat.card (tateCohomology (Rep.ofAlgebraAutOnUnits K L) (-1)) = 1 + +/-- The local class-field-axiom theorem for an arbitrary finite Galois extension of a +nonarchimedean local field. All local-field data on the extension is +constructed from the spectral norm. -/ +theorem finiteExtensionUnits_tate_card_of_generator + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (g : Gal(L/K)) + (hg : ∀ sigma : Gal(L/K), sigma ∈ Subgroup.zpowers g) : + UnitsTateCardinalityData K L := by + let : UniformSpace K := IsTopologicalAddGroup.rightUniformSpace K + let : IsUniformAddGroup K := isUniformAddGroup_of_addCommGroup + let : (Valued.v : Valuation K (ValuativeRel.ValueGroupWithZero K)).RankOne := + { hom' := ValuativeRel.IsRankLeOne.nonempty.some.emb (R := K) |>.comp + MonoidWithZeroHom.ValueGroup₀.embedding + strictMono' := ValuativeRel.IsRankLeOne.nonempty.some.strictMono.comp + MonoidWithZeroHom.ValueGroup₀.embedding_strictMono } + let : NontriviallyNormedField K := + Valued.toNontriviallyNormedField + (L := K) (Γ₀ := ValuativeRel.ValueGroupWithZero K) + let : NontriviallyNormedField L := + spectralNorm.nontriviallyNormedField K L + let : NormedSpace K L := spectralNorm.normedSpace K L + let : CompleteSpace L := spectralNorm.completeSpace K L + let : LocallyCompactSpace L := + LocallyCompactSpace.of_finiteDimensional_of_complete K L + let : IsUltrametricDist L := + ⟨fun x y z => by + change ‖x - z‖ ≤ max ‖x - y‖ ‖y - z‖ + rw [← sub_add_sub_cancel x y z] + exact isNonarchimedean_spectralNorm + (K := K) (L := L) (x - y) (y - z)⟩ + let : Valued L ℝ≥0 := NormedField.toValued + let vL : Valuation L ℝ≥0 := Valued.v + let : vL.IsNontrivial := + (inferInstance : (NormedField.valuation (K := L)).IsNontrivial) + let : ValuativeRel L := ValuativeRel.ofValuation vL + let : vL.Compatible := Valuation.Compatible.ofValuation vL + let : ValuativeRel.IsNontrivial L := + (ValuativeRel.isNontrivial_iff_isNontrivial vL).2 inferInstance + let : IsValuativeTopology L := + isValuativeTopology_of_valued_ofValuation L ℝ≥0 + let : IsNonarchimedeanLocalField L := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + let : (ValuativeRel.valuation K).HasExtension + (ValuativeRel.valuation L) := by + apply Valuation.HasExtension.ofComapInteger + ext x + change ValuativeRel.valuation L (algebraMap K L x) ≤ 1 ↔ + ValuativeRel.valuation K x ≤ 1 + rw [← (ValuativeRel.valuation L).vle_one_iff, vL.vle_one_iff] + change spectralNorm K L (algebraMap K L x) ≤ 1 ↔ + ValuativeRel.valuation K x ≤ 1 + rw [spectralNorm_extends] + exact Valued.toNormedField.norm_le_one_iff + let : Algebra.IsIntegral + (ValuativeRel.valuation K).valuationSubring + (ValuativeRel.valuation L).valuationSubring := by + change Algebra.IsIntegral 𝒪[K] 𝒪[L] + refine ⟨?_⟩ + intro y + apply IsIntegral.tower_bot + (R := 𝒪[K]) (A := 𝒪[L]) (B := L) + (Subring.subtype_injective (ValuativeRel.valuation L).integer) + have hyv : vL (y : L) ≤ 1 := by + apply (vL.vle_one_iff).1 + apply ((ValuativeRel.valuation L).vle_one_iff).2 + exact y.property + have hynorm : ‖(y : L)‖ ≤ 1 := by + have hynormNN : ‖(y : L)‖₊ ≤ 1 := by + simpa [vL, NormedField.valuation_apply] using hyv + exact_mod_cast hynormNN + change spectralNorm K L (y : L) ≤ 1 at hynorm + have hcoeffNorm : + ∀ n : ℕ, ‖(minpoly K (y : L)).coeff n‖ ≤ 1 := + (spectralValue_le_one_iff + (minpoly.monic (Algebra.IsIntegral.isIntegral (y : L)))).1 + (by simpa [spectralNorm] using hynorm) + have hcoeff : + (↑(minpoly K (y : L)).coeffs : Set K) ⊆ + (ValuativeRel.valuation K).integer := by + intro c hc + obtain ⟨n, _hn, rfl⟩ := Polynomial.mem_coeffs_iff.mp hc + exact ((ValuativeRel.valuation K).mem_integer_iff _).2 + (Valued.toNormedField.norm_le_one_iff.mp (hcoeffNorm n)) + let p : Polynomial 𝒪[K] := + (minpoly K (y : L)).toSubring + (ValuativeRel.valuation K).integer hcoeff + refine ⟨p, ?_, ?_⟩ + · exact (Polynomial.monic_toSubring + (minpoly K (y : L)) (ValuativeRel.valuation K).integer hcoeff).2 + (minpoly.monic (Algebra.IsIntegral.isIntegral (y : L))) + · have hmaproot : + Polynomial.aeval (y : L) + (p.map (algebraMap 𝒪[K] K)) = 0 := by + dsimp only [p] + rw [show algebraMap 𝒪[K] K = + (ValuativeRel.valuation K).integer.subtype from rfl, + Polynomial.map_toSubring] + exact minpoly.aeval K (y : L) + rwa [Polynomial.aeval_map_algebraMap K (y : L) p] at hmaproot + let hIntegralClosure : IsIntegralClosure + (ValuativeRel.valuation L).valuationSubring + (ValuativeRel.valuation K).valuationSubring L := + DiscreteValuationField.Valuation.valuationSubring_isIntegralClosure_of_isIntegral + (ValuativeRel.valuation K) (ValuativeRel.valuation L) + let : IsIntegralClosure 𝒪[L] 𝒪[K] L := by + change IsIntegralClosure + (ValuativeRel.valuation L).valuationSubring + (ValuativeRel.valuation K).valuationSubring L + exact hIntegralClosure + let : Module.Finite 𝒪[K] 𝒪[L] := + integerRing_moduleFinite_of_isIntegralClosure K L + let : Finite (tateCohomology (Rep.ofAlgebraAutOnUnits K L) 0) := + localFieldUnitsTateH0FiniteOfGenerator K L g hg + have hcard := localFieldUnits_tate_card_of_generator K L g hg + exact + { finiteH0 := inferInstance + cardH0 := hcard.1 + cardHminusOne := hcard.2 } + +/-- Tower form of the local class-field-axiom theorem. It is enough that the lower field of the +cyclic extension be finite over a nonarchimedean local field; its local-field +structure is again supplied by the spectral norm. -/ +theorem finiteTowerUnits_tate_card_of_generator + (k K L : Type) [Field k] [Field K] [Field L] + [Algebra k K] [FiniteDimensional k K] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel k] [TopologicalSpace k] [IsNonarchimedeanLocalField k] + (g : Gal(L/K)) + (hg : ∀ sigma : Gal(L/K), sigma ∈ Subgroup.zpowers g) : + UnitsTateCardinalityData K L := by + let : UniformSpace k := IsTopologicalAddGroup.rightUniformSpace k + let : IsUniformAddGroup k := isUniformAddGroup_of_addCommGroup + let : (Valued.v : Valuation k (ValuativeRel.ValueGroupWithZero k)).RankOne := + { hom' := ValuativeRel.IsRankLeOne.nonempty.some.emb (R := k) |>.comp + MonoidWithZeroHom.ValueGroup₀.embedding + strictMono' := ValuativeRel.IsRankLeOne.nonempty.some.strictMono.comp + MonoidWithZeroHom.ValueGroup₀.embedding_strictMono } + let : NontriviallyNormedField k := + Valued.toNontriviallyNormedField + (L := k) (Γ₀ := ValuativeRel.ValueGroupWithZero k) + let : NontriviallyNormedField K := + spectralNorm.nontriviallyNormedField k K + let : NormedSpace k K := spectralNorm.normedSpace k K + let : CompleteSpace K := spectralNorm.completeSpace k K + let : LocallyCompactSpace K := + LocallyCompactSpace.of_finiteDimensional_of_complete k K + let : IsUltrametricDist K := + ⟨fun x y z => by + change ‖x - z‖ ≤ max ‖x - y‖ ‖y - z‖ + rw [← sub_add_sub_cancel x y z] + exact isNonarchimedean_spectralNorm + (K := k) (L := K) (x - y) (y - z)⟩ + let : Valued K ℝ≥0 := NormedField.toValued + let vK : Valuation K ℝ≥0 := Valued.v + let : vK.IsNontrivial := + (inferInstance : (NormedField.valuation (K := K)).IsNontrivial) + let : ValuativeRel K := ValuativeRel.ofValuation vK + let : vK.Compatible := Valuation.Compatible.ofValuation vK + let : ValuativeRel.IsNontrivial K := + (ValuativeRel.isNontrivial_iff_isNontrivial vK).2 inferInstance + let : IsValuativeTopology K := + isValuativeTopology_of_valued_ofValuation K ℝ≥0 + let : IsNonarchimedeanLocalField K := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + exact finiteExtensionUnits_tate_card_of_generator K L g hg + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteGaloisRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteGaloisRealization.lean new file mode 100644 index 0000000000..0f37dabde1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteGaloisRealization.lean @@ -0,0 +1,270 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import Mathlib.FieldTheory.SeparableClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient + +/-! # Finite Galois Realization -/ + +@[expose] public section +namespace LocalClassFieldTheory +open RamificationTheory CyclicCohomology KummerTheory + +/-! +# Finite local reciprocity: realizing finite Galois extensions in a separable closure + +Every finite Galois extension `L/K` is embedded into the chosen separable +closure of `K`. Its image supplies the concrete closed subgroup used by the +abstract class-field theory. The resulting abstract fixed coefficient group +is `Lˣ`, and the resulting abstract extension quotient is the actual +`Gal(L/K)`. + +No perfectness hypothesis is imposed; this includes equal-characteristic +local fields such as finite extensions of `𝔽_q((t))`. +-/ + +noncomputable +section + +variable (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-! ## Realization relative to an explicit embedding -/ + +/-- The embedded copy of `L` determined by an explicit embedding into the +fixed separable closure. Keeping the embedding visible is what makes the +canonicity argument in the finite local reciprocity theorem meaningful. -/ +def finiteGaloisFieldRangeOfEmbedding + (i : L →ₐ[K] SeparableClosure K) : + IntermediateField K (SeparableClosure K) := + AlgHom.fieldRange i + +/-- An explicit embedding identifies `L` with its field range. -/ +def finiteGaloisFieldRangeEquivOfEmbedding + (i : L →ₐ[K] SeparableClosure K) : + L ≃ₐ[K] finiteGaloisFieldRangeOfEmbedding K L i := + AlgEquiv.ofInjectiveField i + +/-- The image of an embedded finite Galois extension is again Galois over the base field. -/ +noncomputable instance finiteGaloisFieldRangeOfEmbedding_isGalois + (i : L →ₐ[K] SeparableClosure K) : + IsGalois K (finiteGaloisFieldRangeOfEmbedding K L i) := + IsGalois.of_algEquiv (finiteGaloisFieldRangeEquivOfEmbedding K L i) + +/-- The image of an embedded finite extension is finite-dimensional over the base field. -/ +noncomputable instance finiteGaloisFieldRangeOfEmbedding_finiteDimensional + (i : L →ₐ[K] SeparableClosure K) : + FiniteDimensional K (finiteGaloisFieldRangeOfEmbedding K L i) := + (finiteGaloisFieldRangeEquivOfEmbedding K L i).toLinearEquiv.finiteDimensional + +/-- The closed fixing subgroup attached to an explicit realization of +`L/K` in the separable closure. -/ +def finiteGaloisClosedFixingSubgroupOfEmbedding + (i : L →ₐ[K] SeparableClosure K) : + ClosedSubgroup (Gal(SeparableClosure K/K)) := + closedFixingSubgroup K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i) + +/-- The fixing subgroup of an embedded finite Galois extension is normal in the absolute +subgroup. -/ +noncomputable instance finiteGaloisExtensionSubgroupOfEmbedding_normal + (i : L →ₐ[K] SeparableClosure K) : + (extensionSubgroup + (closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i))).Normal := by + change + (extensionSubgroup + (closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))) + (closedFixingSubgroup K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i)) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i))).Normal + infer_instance + +/-- The fixed coefficient group attached to an explicit realization is +canonically the actual unit group `Lˣ`. -/ +def finiteGaloisUnitsEquivAbstractFixedOfEmbedding + (i : L →ₐ[K] SeparableClosure K) : + Additive Lˣ ≃+ + ambientFixedAddSubgroup + (galoisAmbientUnitsRep K (SeparableClosure K)) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) := + embeddedFieldUnitsEquivGaloisFixed K (SeparableClosure K) L i + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- The fixed-module equivalence sends a field unit to the unit induced by the chosen embedding. -/ +@[simp] +theorem finiteGaloisUnitsEquivAbstractFixedOfEmbedding_coe + (i : L →ₐ[K] SeparableClosure K) (x : Lˣ) : + (finiteGaloisUnitsEquivAbstractFixedOfEmbedding K L i + (Additive.ofMul x)).1 = + Additive.ofMul (Units.map i.toRingHom.toMonoidHom x) := + rfl + +/-- The abstract class-formation extension quotient attached to an explicit realization +of `L/K` is the actual relative Galois group. -/ +def finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + (i : L →ₐ[K] SeparableClosure K) : + ((closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))).toSubgroup ⧸ + extensionSubgroup + (closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i))) ≃* + Gal(L/K) := + (baseFixingExtensionQuotientEquivGaloisGroup K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i)).trans + (AlgEquiv.autCongr + (finiteGaloisFieldRangeEquivOfEmbedding K L i)).symm + +/-- The subgroup attached to an explicit finite Galois realization has +index equal to the ordinary field degree. -/ +theorem finiteGaloisExtensionSubgroupOfEmbedding_index_eq_finrank + (i : L →ₐ[K] SeparableClosure K) : + (extensionSubgroup + (closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i))).index = + Module.finrank K L := by + let : Finite + ((closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))).toSubgroup ⧸ + extensionSubgroup + (closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i))) := + Finite.of_equiv (Gal(L/K)) + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i).symm.toEquiv + calc + _ = Nat.card + ((closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))).toSubgroup ⧸ + extensionSubgroup + (closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRangeOfEmbedding K L i))) := + Subgroup.index_eq_card _ + _ = Nat.card (Gal(L/K)) := + Nat.card_congr + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i).toEquiv + _ = Module.finrank K L := IsGalois.card_aut_eq_finrank K L + +/-! ## The chosen realization -/ + +/-- The embedded copy of `L` inside the fixed separable closure. -/ +def finiteGaloisFieldRange : IntermediateField K (SeparableClosure K) := + finiteGaloisFieldRangeOfEmbedding K L + (AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L) + +/-- The chosen embedding identifies `L` with its actual field range. -/ +def finiteGaloisFieldRangeEquiv : + L ≃ₐ[K] finiteGaloisFieldRange K L := + finiteGaloisFieldRangeEquivOfEmbedding K L + (AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L) + +/-- The canonical realization of a finite Galois extension is Galois over the base field. -/ +instance finiteGaloisFieldRange_isGalois : + IsGalois K (finiteGaloisFieldRange K L) := + finiteGaloisFieldRangeOfEmbedding_isGalois K L + (AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L) + +/-- The canonical realization of a finite extension is finite-dimensional over the base field. -/ +instance finiteGaloisFieldRange_finiteDimensional : + FiniteDimensional K (finiteGaloisFieldRange K L) := + finiteGaloisFieldRangeOfEmbedding_finiteDimensional K L + (AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L) + +/-- The concrete closed subgroup of the absolute separable Galois group +attached to `L/K`. -/ +def finiteGaloisClosedFixingSubgroup : + ClosedSubgroup (Gal(SeparableClosure K/K)) := + finiteGaloisClosedFixingSubgroupOfEmbedding K L + (AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L) + +/-- The fixing subgroup of the canonical finite Galois realization is normal. -/ +instance finiteGaloisExtensionSubgroup_normal : + (extensionSubgroup + (closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))) + (finiteGaloisClosedFixingSubgroup K L) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRange K L))).Normal := by + change + (extensionSubgroup + (closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))) + (closedFixingSubgroup K (SeparableClosure K) + (finiteGaloisFieldRange K L)) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRange K L))).Normal + infer_instance + +/-- The actual coefficient group fixed by the concrete subgroup attached to +`L/K` is canonically `Lˣ`. -/ +def finiteGaloisUnitsEquivAbstractFixed : + Additive Lˣ ≃+ + ambientFixedAddSubgroup + (galoisAmbientUnitsRep K (SeparableClosure K)) + (finiteGaloisClosedFixingSubgroup K L) := + finiteGaloisUnitsEquivAbstractFixedOfEmbedding K L + (AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L) + +omit [FiniteDimensional K L] in +/-- The canonical fixed-module equivalence sends a unit through the chosen embedding. -/ +@[simp] +theorem finiteGaloisUnitsEquivAbstractFixed_coe (x : Lˣ) : + (finiteGaloisUnitsEquivAbstractFixed K L (Additive.ofMul x)).1 = + Additive.ofMul + (Units.map + (AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L).toRingHom.toMonoidHom + x) := + rfl + +/-- For the concrete realization of `L/K`, the exact quotient used by +the abstract class-formation framework is canonically the actual Galois group `Gal(L/K)`. -/ +def finiteGaloisAbstractQuotientEquivGaloisGroup : + ((closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))).toSubgroup ⧸ + extensionSubgroup + (closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))) + (finiteGaloisClosedFixingSubgroup K L) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRange K L))) ≃* + Gal(L/K) := + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L + (AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L) + +/-- The chosen realization has subgroup index equal to `[L : K]`. -/ +theorem finiteGaloisExtensionSubgroup_index_eq_finrank : + (extensionSubgroup + (closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))) + (finiteGaloisClosedFixingSubgroup K L) + (fixingSubgroupLeBase K (SeparableClosure K) + (finiteGaloisFieldRange K L))).index = + Module.finrank K L := + finiteGaloisExtensionSubgroupOfEmbedding_index_eq_finrank K L + (AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L) + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean new file mode 100644 index 0000000000..0b73782048 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean @@ -0,0 +1,280 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteSubgroupResidueDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueValuationComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.UniqueRing + +/-! # Finite Residue Finrank Transfer -/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + hasExtension_valuation_of_valuationSubring_pullback → + hasExtension_valuation_of_valuationSubring_pullback + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + valuationSubring_pullback_of_hasExtension_valuation → + valuationSubring_pullback_of_hasExtension_valuation + +namespace LocalClassFieldTheory +open CyclicCohomology RamificationTheory ClassFormation + +open LocalFieldTheory ValuationTheory + +/-! +# Finite local reciprocity: comparison of the two finite residue-field models + +The residue-action exact sequence presents the residue field of a +finite fixed field intrinsically, inside the selected residue algebraic +closure. The norm formula uses the literal residue field of the spectral +valuation on that fixed field. This file compares those presentations by +the uniqueness of the finite extension valuation. +-/ + +noncomputable +section + +open scoped ValuativeRel +open HilbertRamification.ValuationSubring + +universe u v + +/-- If the decomposition group of an ambient valuation ring is the whole +Galois group, its decomposition-field valuation ring is canonically +equivalent to the given valuation ring on the ground field. -/ +noncomputable def valuationSubringEquivDecompositionFieldOfEqTop + {F : Type u} {Omega : Type v} [Field F] [Field Omega] [Algebra F Omega] + [IsGalois F Omega] + (A : ValuationSubring Omega) (C : ValuationSubring F) + (hC : A.comap (algebraMap F Omega) = C) + (hA : decompositionGroup F A = ⊤) : + C ≃+* decompositionFieldValuationSubring F A := by + let Z := decompositionField F A + have hZ : Z = ⊥ := by + change IntermediateField.fixedField (decompositionGroup F A) = ⊥ + rw [hA] + simpa using + (InfiniteGalois.fixedField_fixingSubgroup + (⊥ : IntermediateField F Omega)) + let eFZ : F ≃ₐ[F] Z := + (IntermediateField.botEquiv F Omega).symm.trans + (IntermediateField.equivOfEq hZ.symm) + exact + { toFun := fun x => ⟨eFZ (x : F), by + change ((eFZ x : Z) : Omega) ∈ A + have he : ((eFZ x : Z) : Omega) = + algebraMap F Omega (x : F) := by + rfl + rw [he] + have hx : (x : F) ∈ A.comap (algebraMap F Omega) := by + rw [hC] + exact x.property + exact hx⟩ + invFun := fun z => ⟨eFZ.symm (z : Z), by + have hz : eFZ.symm (z : Z) ∈ A.comap (algebraMap F Omega) := by + change algebraMap F Omega (eFZ.symm (z : Z)) ∈ A + have he : algebraMap F Omega (eFZ.symm (z : Z)) = + ((z : Z) : Omega) := by + exact congrArg Subtype.val (eFZ.apply_symm_apply (z : Z)) + rw [he] + exact z.property + rw [hC] at hz + exact hz⟩ + left_inv := fun x => by + apply Subtype.ext + exact eFZ.symm_apply_apply (x : F) + right_inv := fun z => by + apply Subtype.ext + exact eFZ.apply_symm_apply (z : Z) + map_add' := fun x y => by + apply Subtype.ext + exact map_add eFZ (x : F) (y : F) + map_mul' := fun x y => by + apply Subtype.ext + exact map_mul eFZ (x : F) (y : F) } + +/-- The corresponding equivalence between literal and intrinsic residue +fields. -/ +noncomputable def residueFieldEquivDecompositionResidueOfEqTop + {F : Type u} {Omega : Type v} [Field F] [Field Omega] [Algebra F Omega] + [IsGalois F Omega] + (A : ValuationSubring Omega) (C : ValuationSubring F) + (hC : A.comap (algebraMap F Omega) = C) + (hA : decompositionGroup F A = ⊤) : + IsLocalRing.ResidueField C ≃+* decompositionResidueField F A := + (IsLocalRing.ResidueField.mapEquiv + (valuationSubringEquivDecompositionFieldOfEqTop A C hC hA)).trans + (decompositionFieldResidueEquiv (K := F) A) + +/-- Naturality of the preceding residue equivalence with reduction into the +selected residue field. -/ +theorem residueFieldEquivDecompositionResidueOfEqTop_algebraMap + {F : Type u} {Omega : Type v} [Field F] [Field Omega] [Algebra F Omega] + [IsGalois F Omega] + (A : ValuationSubring Omega) (C : ValuationSubring F) + (hC : A.comap (algebraMap F Omega) = C) + (hA : decompositionGroup F A = ⊤) (x : C) : + algebraMap (decompositionResidueField F A) (selectedResidueField A) + (residueFieldEquivDecompositionResidueOfEqTop A C hC hA + (IsLocalRing.residue C x)) = + IsLocalRing.residue A + (⟨algebraMap F Omega (x : F), by + have hx : (x : F) ∈ A.comap (algebraMap F Omega) := by + rw [hC] + exact x.property + exact hx⟩ : A) := by + rfl + +/-! ## The finite fixed-field comparison -/ + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- **Finite local reciprocity, residue-degree comparison.** For an arbitrary finite +closed subgroup field (not necessarily normal over `K`), the residue degree +defined by the absolute residue action is the degree of the literal residue +field of the unique finite extension valuation. -/ +theorem localResidueDatum_residueDegree_eq_residueFinrank + (H : FiniteAbstractField (Gal(SeparableClosure K/K))) + [FiniteDimensional K + (abstractFixedField K (SeparableClosure K) H.field)] + [ValuativeRel (abstractFixedField K (SeparableClosure K) H.field)] + [TopologicalSpace (abstractFixedField K (SeparableClosure K) H.field)] + [IsNonarchimedeanLocalField + (abstractFixedField K (SeparableClosure K) H.field)] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation + (abstractFixedField K (SeparableClosure K) H.field))] : + (H.residueDegree (localResidueDatum K) : ℕ) = + @Module.finrank 𝓀[K] + 𝓀[abstractFixedField K (SeparableClosure K) H.field] _ _ + (IsLocalRing.ResidueField.instModule + (R := 𝒪[K]) + (S := 𝒪[abstractFixedField K (SeparableClosure K) H.field])) := by + let E := abstractFixedField K (SeparableClosure K) H.field + let A := localSeparableValuationSubring K + let C := (ValuativeRel.valuation E).valuationSubring + let V := (localCompleteDVF K).valuation.valuationSubring + let kK := IsLocalRing.ResidueField + V + let kE := IsLocalRing.ResidueField C + let k₀ := decompositionResidueField K A + let kE' := decompositionResidueField E A + let Omega := selectedResidueField A + let F := localAbstractFixedResidueIntermediateField K H.field + let : Algebra kK kE := by + change Algebra 𝓀[K] 𝓀[E] + exact IsLocalRing.ResidueField.instAlgebra + let : Module kK kE := by + change Module 𝓀[K] 𝓀[E] + exact IsLocalRing.ResidueField.instModule + change (H.residueDegree (localResidueDatum K) : ℕ) = + Module.finrank kK kE + have hExtC : (localCompleteDVF K).valuation.HasExtension C.valuation := by + apply + hasExtension_valuation_of_valuationSubring_pullback + intro x + change ValuativeRel.valuation E (algebraMap K E x) ≤ 1 ↔ + (localCompleteDVF K).valuation x ≤ 1 + rw [_root_.Valuation.HasExtension.val_map_le_one_iff + (ValuativeRel.valuation K) (ValuativeRel.valuation E)] + rfl + let : (localCompleteDVF K).valuation.HasExtension C.valuation := hExtC + have hVC : V.valuation.HasExtension C.valuation := by + apply + hasExtension_valuation_of_valuationSubring_pullback + intro x + simpa only [V, ValuationSubring.valuationSubring_valuation] using + (valuationSubring_pullback_of_hasExtension_valuation + (localCompleteDVF K).valuation C x) + have hC : A.comap (algebraMap E (SeparableClosure K)) = C := by + simpa only [RamificationTheory.ValuationSubring.restrictIntermediateField_eq_comap] using + (ValuationSubring.restrictIntermediateField_eq_of_finite_separable + (localCompleteDVF K) A + (abstractFixedField K (SeparableClosure K) H.field) C) + have htop : decompositionGroup E A = ⊤ := + localAbstractFixedDecompositionGroup_eq_top K H.field + let eK : kK ≃+* k₀ := + localBaseResidueEquivDecompositionResidue K + let eE : kE ≃+* kE' := + residueFieldEquivDecompositionResidueOfEqTop A C hC htop + let i : V →+* C := + ValuationTheory.Valuations.valuationSubringMapOfHasExtension V C hVC + let bar : kE →+* Omega := + (algebraMap kE' Omega).comp eE.toRingHom + have hbar_base (x : kK) : + bar (algebraMap kK kE x) = + algebraMap k₀ Omega (eK x) := by + obtain ⟨a, rfl⟩ := IsLocalRing.residue_surjective x + have hres : + algebraMap kK kE + (IsLocalRing.residue V a) = + IsLocalRing.residue C + (i a) := by + change algebraMap 𝓀[K] 𝓀[E] + (IsLocalRing.residue 𝒪[K] a) = + IsLocalRing.residue 𝒪[E] (algebraMap 𝒪[K] 𝒪[E] a) + exact residueField_algebraMap_residue K E a + rw [hres] + change algebraMap kE' Omega + (eE (IsLocalRing.residue C + (i a))) = + algebraMap k₀ Omega + (eK (IsLocalRing.residue V a)) + rw [residueFieldEquivDecompositionResidueOfEqTop_algebraMap] + have hbase := + localBaseResidueEquivDecompositionResidue_algebraMap K a + change algebraMap k₀ Omega + (eK (IsLocalRing.residue V a)) = _ at hbase + rw [hbase] + congr 1 + let : Algebra k₀ kE := + ((algebraMap kK kE).comp eK.symm.toRingHom).toAlgebra + let barAlg : kE →ₐ[k₀] Omega := + { bar with + commutes' := fun z => by + change bar (algebraMap kK kE (eK.symm z)) = + algebraMap k₀ Omega z + simpa using hbar_base (eK.symm z) } + have hF : F = barAlg.fieldRange := by + change IntermediateField.adjoin k₀ + (Set.range (algebraMap kE' Omega)) = barAlg.fieldRange + apply le_antisymm + · apply IntermediateField.adjoin_le_iff.mpr + rintro y ⟨z, rfl⟩ + obtain ⟨x, rfl⟩ := eE.surjective z + exact ⟨x, rfl⟩ + · rintro y ⟨x, rfl⟩ + apply IntermediateField.subset_adjoin + exact ⟨eE x, rfl⟩ + let eRange : kE ≃+* barAlg.fieldRange := + (AlgEquiv.ofInjectiveField barAlg).toRingEquiv + let : Algebra k₀ barAlg.fieldRange := barAlg.fieldRange.algebra + let : Algebra k₀ F := + localAbstractFixedResidueIntermediateFieldAlgebra K H.field + let eTop : kE ≃+* F := + eRange.trans + (IntermediateField.equivOfEq hF.symm).toRingEquiv + have hcomm : + (algebraMap k₀ F).comp eK.toRingHom = + eTop.toRingHom.comp (algebraMap kK kE) := by + ext x + change algebraMap k₀ Omega (eK x) = + bar (algebraMap kK kE x) + exact (hbar_base x).symm + have hfinrankRaw : + Module.finrank kK kE = Module.finrank k₀ F := + Algebra.finrank_eq_of_equiv_equiv eK eTop hcomm + exact + (localResidueDatum_residueDegree_eq_selectedResidueFinrank K H).trans + hfinrankRaw.symm + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFrobenius.lean new file mode 100644 index 0000000000..54d9eccb1a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFrobenius.lean @@ -0,0 +1,296 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Fields +public import Mathlib.FieldTheory.Finite.Extension +public import Mathlib.FieldTheory.Galois.Profinite + +/-! # Finite Residue Frobenius -/ + +@[expose] public section +namespace LocalClassFieldTheory + +open ClassFormation + +/-! +# Finite local reciprocity: finite residue Frobenius coordinates + +The degree map used in local reciprocity comes from the arithmetic Frobenius +on the algebraic closure of the finite residue field. This file constructs +the finite-level source of that map: for every finite extension of a finite +field, exponentiation of Frobenius identifies its Galois group with the +appropriate cyclic quotient of `ℤ̂`. + +No cyclic generator is chosen. The generator is the actual arithmetic +Frobenius `x ↦ x ^ #k`, and the exponent map is obtained by factoring its +integer powers through `ZMod [L : k]`. +-/ + +noncomputable +section + +universe u v w + +variable (k : Type u) (L : Type v) + [Field k] [Fintype k] [Field L] [Finite L] [Algebra k L] + +/-- Integer powers of the arithmetic Frobenius, written additively. -/ +def finiteResidueFrobeniusIntegerPowers : + ℤ →+ Additive (L ≃ₐ[k] L) := + zmultiplesHom (Additive (L ≃ₐ[k] L)) (Additive.ofMul + (FiniteField.frobeniusAlgEquivOfAlgebraic k L)) + +/-- The order relation which lets integer Frobenius powers factor through +`ZMod [L : k]`. -/ +private theorem finiteResidueFrobeniusIntegerPowers_degree_eq_zero : + finiteResidueFrobeniusIntegerPowers k L (Module.finrank k L) = 0 := by + apply Additive.ext + change (FiniteField.frobeniusAlgEquivOfAlgebraic k L) ^ + (Module.finrank k L : ℤ) = 1 + rw [← FiniteField.orderOf_frobeniusAlgEquivOfAlgebraic (K := k) (L := L)] + rw [zpow_natCast, pow_orderOf_eq_one] + +/-- The canonical finite-level exponent homomorphism +`Z/[L:k]Z → Gal(L/k)`, sending `1` to arithmetic Frobenius. -/ +def finiteResidueFrobeniusExponentHom : + Multiplicative (ZMod (Module.finrank k L)) →* (L ≃ₐ[k] L) := + AddMonoidHom.toMultiplicative + (ZMod.lift (Module.finrank k L) + ⟨finiteResidueFrobeniusIntegerPowers k L, + by exact finiteResidueFrobeniusIntegerPowers_degree_eq_zero k L⟩) + +/-- An integer residue exponent maps to the corresponding power of Frobenius. -/ +@[simp] +theorem finiteResidueFrobeniusExponentHom_intCast (m : ℤ) : + finiteResidueFrobeniusExponentHom k L + (Multiplicative.ofAdd (m : ZMod (Module.finrank k L))) = + (FiniteField.frobeniusAlgEquivOfAlgebraic k L) ^ m := by + change + (ZMod.lift (Module.finrank k L) + ⟨finiteResidueFrobeniusIntegerPowers k L, + by exact finiteResidueFrobeniusIntegerPowers_degree_eq_zero k L⟩) + (m : ZMod (Module.finrank k L)) = + Additive.ofMul ((FiniteField.frobeniusAlgEquivOfAlgebraic k L) ^ m) + rw [ZMod.lift_coe] + rfl + +/-- Residue exponent one maps to the arithmetic Frobenius automorphism. -/ +@[simp] +theorem finiteResidueFrobeniusExponentHom_one : + finiteResidueFrobeniusExponentHom k L + (Multiplicative.ofAdd (1 : ZMod (Module.finrank k L))) = + FiniteField.frobeniusAlgEquivOfAlgebraic k L := by + simpa using finiteResidueFrobeniusExponentHom_intCast k L 1 + +/-- Every finite residue-field automorphism is a power of arithmetic +Frobenius, so the canonical exponent homomorphism is onto. -/ +theorem finiteResidueFrobeniusExponentHom_surjective : + Function.Surjective (finiteResidueFrobeniusExponentHom k L) := by + intro sigma + obtain ⟨m, hm⟩ := + (FiniteField.bijective_frobeniusAlgEquivOfAlgebraic_pow k L).2 sigma + refine ⟨Multiplicative.ofAdd + ((m.1 : ℤ) : ZMod (Module.finrank k L)), ?_⟩ + rw [finiteResidueFrobeniusExponentHom_intCast] + simpa [zpow_natCast] using hm + +/-- The finite-level Frobenius exponent homomorphism is injective. -/ +theorem finiteResidueFrobeniusExponentHom_injective : + Function.Injective (finiteResidueFrobeniusExponentHom k L) := by + let : NeZero (Module.finrank k L) := ⟨Module.finrank_pos.ne'⟩ + have hcard : + Nat.card (Multiplicative (ZMod (Module.finrank k L))) = + Nat.card (L ≃ₐ[k] L) := by + rw [Nat.card_congr Multiplicative.toAdd, + Nat.card_zmod, IsGalois.card_aut_eq_finrank] + exact ((finiteResidueFrobeniusExponentHom_surjective k L).bijective_of_nat_card_le + hcard.le).1 + +/-- Canonical finite-level Frobenius coordinates. -/ +def finiteResidueFrobeniusExponentEquiv : + Multiplicative (ZMod (Module.finrank k L)) ≃* (L ≃ₐ[k] L) := + MulEquiv.ofBijective (finiteResidueFrobeniusExponentHom k L) + ⟨finiteResidueFrobeniusExponentHom_injective k L, + finiteResidueFrobeniusExponentHom_surjective k L⟩ + +/-- The Frobenius exponent equivalence has the same underlying map as the exponent homomorphism. -/ +@[simp] +theorem finiteResidueFrobeniusExponentEquiv_apply (z) : + finiteResidueFrobeniusExponentEquiv k L z = + finiteResidueFrobeniusExponentHom k L z := + rfl + +/-- The Frobenius exponent equivalence sends one to arithmetic Frobenius. -/ +theorem finiteResidueFrobeniusExponentEquiv_one : + finiteResidueFrobeniusExponentEquiv k L + (Multiplicative.ofAdd (1 : ZMod (Module.finrank k L))) = + FiniteField.frobeniusAlgEquivOfAlgebraic k L := + finiteResidueFrobeniusExponentHom_one k L + +/-- A profinite exponent acts on a finite residue extension through reduction +modulo its degree. -/ +def finiteResidueFrobeniusFromZHat : + ZHatMul →ₜ* (L ≃ₐ[k] L) where + toFun z := finiteResidueFrobeniusExponentHom k L + (Multiplicative.ofAdd + (zHatReduction (Module.finrank k L) Module.finrank_pos z.toAdd)) + map_one' := by + apply (finiteResidueFrobeniusExponentHom k L).map_one + map_mul' x y := by + apply (finiteResidueFrobeniusExponentHom k L).map_mul + continuous_toFun := by + apply continuous_of_discreteTopology.comp + exact continuous_ofAdd.comp + ((zHatReduction (Module.finrank k L) Module.finrank_pos).continuous_toFun.comp + continuous_toAdd) + +/-- The profinite Frobenius map depends on reduction modulo the residue extension degree. -/ +@[simp] +theorem finiteResidueFrobeniusFromZHat_apply (z : ZHatMul) : + finiteResidueFrobeniusFromZHat k L z = + finiteResidueFrobeniusExponentHom k L + (Multiplicative.ofAdd + (zHatReduction (Module.finrank k L) Module.finrank_pos z.toAdd)) := + rfl + +/-- The distinguished profinite integer `1` acts as arithmetic Frobenius. -/ +theorem finiteResidueFrobeniusFromZHat_one : + finiteResidueFrobeniusFromZHat k L + (Multiplicative.ofAdd (1 : ZHat)) = + FiniteField.frobeniusAlgEquivOfAlgebraic k L := by + rw [finiteResidueFrobeniusFromZHat_apply] + exact finiteResidueFrobeniusExponentHom_one k L + +/-- Every automorphism of a finite residue extension is induced by a +profinite Frobenius exponent. -/ +theorem finiteResidueFrobeniusFromZHat_surjective : + Function.Surjective (finiteResidueFrobeniusFromZHat k L) := by + intro sigma + obtain ⟨a, ha⟩ := finiteResidueFrobeniusExponentHom_surjective k L sigma + obtain ⟨z, hz⟩ := zHatReduction_surjective + (Module.finrank k L) Module.finrank_pos a.toAdd + refine ⟨Multiplicative.ofAdd z, ?_⟩ + rw [finiteResidueFrobeniusFromZHat_apply] + change finiteResidueFrobeniusExponentHom k L + (Multiplicative.ofAdd + (zHatReduction (Module.finrank k L) Module.finrank_pos z)) = sigma + rw [hz] + exact ha + +/-- A profinite exponent acts trivially on a finite residue extension exactly +when it is zero modulo the extension degree. -/ +theorem finiteResidueFrobeniusFromZHat_eq_one_iff (z : ZHatMul) : + finiteResidueFrobeniusFromZHat k L z = 1 ↔ + zHatReduction (Module.finrank k L) Module.finrank_pos z.toAdd = 0 := by + rw [finiteResidueFrobeniusFromZHat_apply] + constructor + · intro h + have h' : + Multiplicative.ofAdd + (zHatReduction (Module.finrank k L) Module.finrank_pos z.toAdd) = + 1 := by + apply finiteResidueFrobeniusExponentHom_injective k L + simpa using h + exact congrArg Multiplicative.toAdd h' + · intro h + rw [h] + exact (finiteResidueFrobeniusExponentHom k L).map_one + +section Tower + +variable {E : Type v} {F : Type w} + [Field E] [Finite E] [Field F] [Finite F] + [Algebra k E] [Algebra k F] [Algebra E F] + [IsScalarTower k E F] [Normal k E] + +/-- Arithmetic Frobenius commutes with restriction in a tower of finite +extensions of a finite field. -/ +theorem restrictNormalHom_finiteResidueFrobenius : + AlgEquiv.restrictNormalHom E + (FiniteField.frobeniusAlgEquivOfAlgebraic k F) = + FiniteField.frobeniusAlgEquivOfAlgebraic k E := by + apply AlgEquiv.ext + intro x + apply (algebraMap E F).injective + calc + (algebraMap E F) + (((AlgEquiv.restrictNormalHom E) + (FiniteField.frobeniusAlgEquivOfAlgebraic k F)) x) = + FiniteField.frobeniusAlgEquivOfAlgebraic k F + (algebraMap E F x) := + AlgEquiv.restrictNormal_commutes + (FiniteField.frobeniusAlgEquivOfAlgebraic k F) E x + _ = (algebraMap E F + ((FiniteField.frobeniusAlgEquivOfAlgebraic k E) x) : F) := by + simp only [FiniteField.coe_frobeniusAlgEquivOfAlgebraic] + exact (map_pow (algebraMap E F) x (Fintype.card k)).symm + +/-- The finite Frobenius exponent coordinates commute with restriction. The +exponent on the smaller field is obtained by the canonical reduction +`Z/[F:k]Z → Z/[E:k]Z`. -/ +theorem restrictNormalHom_finiteResidueFrobeniusExponentHom + (z : Multiplicative (ZMod (Module.finrank k F))) : + AlgEquiv.restrictNormalHom E + (finiteResidueFrobeniusExponentHom k F z) = + finiteResidueFrobeniusExponentHom k E + (Multiplicative.ofAdd + (ZMod.castHom + (show Module.finrank k E ∣ Module.finrank k F from + ⟨Module.finrank E F, + (Module.finrank_mul_finrank k E F).symm⟩) + (ZMod (Module.finrank k E)) z.toAdd)) := by + rcases ZMod.intCast_surjective z.toAdd with ⟨m, hm⟩ + have hz : z = Multiplicative.ofAdd + (m : ZMod (Module.finrank k F)) := by + apply Multiplicative.ext + exact hm.symm + subst z + apply AlgEquiv.ext + intro x + rw [finiteResidueFrobeniusExponentHom_intCast] + simp only [toAdd_ofAdd] + have hred : + ZMod.castHom + (show Module.finrank k E ∣ Module.finrank k F from + ⟨Module.finrank E F, + (Module.finrank_mul_finrank k E F).symm⟩) + (ZMod (Module.finrank k E)) + (m : ZMod (Module.finrank k F)) = + (m : ZMod (Module.finrank k E)) := by + exact map_intCast _ m + rw [hred, finiteResidueFrobeniusExponentHom_intCast] + have hfrob := restrictNormalHom_finiteResidueFrobenius + (k := k) (E := E) (F := F) + have hpow := congrArg (fun sigma : E ≃ₐ[k] E => sigma ^ m) hfrob + rw [map_zpow] + exact DFunLike.congr_fun hpow x + +/-- The actions of `ℤ̂` on finite residue extensions commute with restriction +in finite towers. -/ +theorem restrictNormalHom_finiteResidueFrobeniusFromZHat (z : ZHatMul) : + AlgEquiv.restrictNormalHom E + (finiteResidueFrobeniusFromZHat k F z) = + finiteResidueFrobeniusFromZHat k E z := by + rw [finiteResidueFrobeniusFromZHat_apply, + restrictNormalHom_finiteResidueFrobeniusExponentHom, + finiteResidueFrobeniusFromZHat_apply] + congr 2 + apply Multiplicative.ext + exact zHatReduction_transition + (m := Module.finrank k E) (n := Module.finrank k F) + Module.finrank_pos Module.finrank_pos + (show Module.finrank k E ∣ Module.finrank k F from + ⟨Module.finrank E F, + (Module.finrank_mul_finrank k E F).symm⟩) + z.toAdd + +end Tower + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueValuationComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueValuationComparison.lean new file mode 100644 index 0000000000..7c85aa1915 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueValuationComparison.lean @@ -0,0 +1,66 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteExtensionCorrespondence + +/-! # Finite Residue Valuation Comparison -/ + +@[expose] public section +namespace LocalClassFieldTheory + +open ValuationTheory RamificationTheory + +/-! +# Finite-separable comparison of restricted valuation rings + +The valuation on an algebraic ambient field can be restricted to a finite +intermediate field. Over a complete discrete valuation field this +restriction is the unique extension valuation ring, so it agrees with any +other extension valuation ring on the finite field. This is the +valuation-ring comparison used in the finite local reciprocity construction before comparing residue +degrees. +-/ + +noncomputable +section + +universe u v w + +open DiscreteValuationField + +/-- Over a complete discrete valuation field, restricting an ambient +extension valuation ring to a finite separable intermediate field gives the +same valuation ring as any independently constructed extension valuation on +that intermediate field. -/ +theorem ValuationSubring.restrictIntermediateField_eq_of_finite_separable + {K : Type u} {Omega : Type v} [Field K] [Field Omega] [Algebra K Omega] + (base : CompleteDVF K) + (A : ValuationSubring Omega) [base.valuation.HasExtension A.valuation] + (E : IntermediateField K Omega) [FiniteDimensional K E] + [Algebra.IsSeparable K E] + (C : ValuationSubring E) [base.valuation.HasExtension C.valuation] : + A.restrictIntermediateField E = C := by + let B := A.restrictIntermediateField E + let : base.valuation.HasExtension B.valuation := + RamificationTheory.ValuationSubring.restrictIntermediateField_hasExtension + base.valuation A E + obtain ⟨target, hExt, _hIntegralClosure, _hFundamental⟩ := + DiscreteValuationField.ValuedExtension.exists_integralClosure_standard_fundamental_identity + (K := K) (L := E) base + let : base.valuation.HasExtension target.valuation := hExt + have hB : target.valuation.valuationSubring = B := + DiscreteValuationField.ValuedExtension.target_valuationSubring_eq_of_finite_separable + base target B + have hC : target.valuation.valuationSubring = C := + DiscreteValuationField.ValuedExtension.target_valuationSubring_eq_of_finite_separable + base target C + exact hB.symm.trans hC + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean new file mode 100644 index 0000000000..328697ecaa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean @@ -0,0 +1,468 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalResidueDatum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField + +/-! # Finite Subgroup Residue Degree -/ + +@[expose] public section +namespace LocalClassFieldTheory +open CyclicCohomology RamificationTheory ClassFormation + +open LocalFieldTheory + +/-! +# Finite local reciprocity: residue degree of a finite abstract field + +This file compares the residue action used by localResidueDatum with the +same residue action after changing the ground field to the fixed field of a +closed subgroup. The comparison is made on the common selected +residue field, so it also applies when the fixed field is not normal over the +original local field. +-/ + +noncomputable +section + +open scoped Pointwise ValuativeRel +open HilbertRamification.ValuationSubring +open Field.absoluteGaloisGroup + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The residue subfield inside the selected residue algebraic closure which +is generated by the residue field attached to the fixed field of `H`. + +We use `adjoin` rather than imposing a scalar-tower instance between the two +intrinsic residue-action quotient presentations. -/ +noncomputable def localAbstractFixedResidueIntermediateField + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) : + IntermediateField + (decompositionResidueField K (localSeparableValuationSubring K)) + (selectedResidueField (localSeparableValuationSubring K)) := by + let E := abstractFixedField K (SeparableClosure K) H + let A := localSeparableValuationSubring K + let k := decompositionResidueField K A + let Omega := selectedResidueField A + let kE := decompositionResidueField E A + exact IntermediateField.adjoin k + (Set.range (algebraMap kE Omega)) + +/-- The canonical scalar structure on the selected fixed residue field. +Naming these instances keeps typeclass search from unfolding the fixed-field +and residue-action constructions in finite-dimensionality statements. -/ +noncomputable local instance localAbstractFixedResidueIntermediateFieldAlgebra + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) : + Algebra + (decompositionResidueField K (localSeparableValuationSubring K)) + (localAbstractFixedResidueIntermediateField K H) := + (localAbstractFixedResidueIntermediateField K H).algebra + +/-- Scalar multiplication on the fixed residue intermediate field inherited from its residue-field +algebra structure. -/ +noncomputable local instance localAbstractFixedResidueIntermediateFieldSMul + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) : + SMul + (decompositionResidueField K (localSeparableValuationSubring K)) + (localAbstractFixedResidueIntermediateField K H) := + @Algebra.toSMul _ _ _ _ + (localAbstractFixedResidueIntermediateFieldAlgebra K H) + +/-- The fixed residue intermediate field is a module over the decomposition residue field of the +base. -/ +noncomputable local instance localAbstractFixedResidueIntermediateFieldModule + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) : + Module + (decompositionResidueField K (localSeparableValuationSubring K)) + (localAbstractFixedResidueIntermediateField K H) := + @Algebra.toModule _ _ _ _ + (localAbstractFixedResidueIntermediateFieldAlgebra K H) + +/-- Every automorphism over the fixed field preserves the selected extension +valuation. This is the base-change form of the full decomposition-group +statement proved for `K`. -/ +theorem localAbstractFixedDecompositionGroup_eq_top + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) : + decompositionGroup (abstractFixedField K (SeparableClosure K) H) + (localSeparableValuationSubring K) = ⊤ := by + let E := abstractFixedField K (SeparableClosure K) H + let A := localSeparableValuationSubring K + apply top_unique + intro tau _htau + let sigma : Gal(SeparableClosure K/K) := tau.restrictScalars K + have hsigma : sigma • A = A := by + change sigma ∈ decompositionGroup K A + rw [localSeparableDecompositionGroup_eq_top K] + exact Subgroup.mem_top sigma + change tau • A = A + exact hsigma + +/-- Restricting the local residue action to `H` gives the same underlying +automorphism of the selected residue field as applying the residue-action map +over the fixed field of `H`. -/ +theorem localAbstractFixedResidueAction_apply + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) + (sigma : H.toSubgroup) + (x : selectedResidueField (localSeparableValuationSubring K)) : + localSeparableResidueAlgAction K sigma.1 x = + residueAlgActionOfEqTop + (abstractFixedField K (SeparableClosure K) H) + (localSeparableValuationSubring K) + (localAbstractFixedDecompositionGroup_eq_top K H) + (abstractSubgroupEquivGaloisGroup K (SeparableClosure K) H sigma) x := by + let A := localSeparableValuationSubring K + obtain ⟨a, rfl⟩ := IsLocalRing.residue_surjective x + change IsLocalRing.residue A + ((toDecompositionGroupOfEqTop K A + (localSeparableDecompositionGroup_eq_top K) sigma.1) • a) = + IsLocalRing.residue A + ((toDecompositionGroupOfEqTop + (abstractFixedField K (SeparableClosure K) H) A + (localAbstractFixedDecompositionGroup_eq_top K H) + (abstractSubgroupEquivGaloisGroup K (SeparableClosure K) H sigma)) • a) + congr 1 + +/-- The image of `H` under the local residue action is exactly the subgroup +fixing the residue subfield of its fixed field. The reverse inclusion is the +surjectivity of the residue-action map after changing the base to that +fixed field. -/ +theorem localAbstractFixedResidueAction_map_eq_fixingSubgroup + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) : + H.toSubgroup.map (localSeparableResidueAlgAction K).toMonoidHom = + (localAbstractFixedResidueIntermediateField K H).fixingSubgroup := by + let E := abstractFixedField K (SeparableClosure K) H + let A := localSeparableValuationSubring K + let k := decompositionResidueField K A + let Omega := selectedResidueField A + let kE := decompositionResidueField E A + let rhoK := localSeparableResidueAlgAction K + let hE := localAbstractFixedDecompositionGroup_eq_top K H + let rhoE := residueAlgActionOfEqTop E A hE + let F := localAbstractFixedResidueIntermediateField K H + ext tau + constructor + · rintro ⟨sigma, hsigma, rfl⟩ + let sigmaH : H.toSubgroup := ⟨sigma, hsigma⟩ + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + let T : IntermediateField k Omega := + { carrier := {y | rhoK sigma y = y} + zero_mem' := by simp + one_mem' := by simp + add_mem' := by + intro y z hy hz + change rhoK sigma y = y at hy + change rhoK sigma z = z at hz + change rhoK sigma (y + z) = y + z + rw [map_add] + exact congrArg₂ (fun a b : Omega => a + b) hy hz + mul_mem' := by + intro y z hy hz + change rhoK sigma y = y at hy + change rhoK sigma z = z at hz + change rhoK sigma (y * z) = y * z + rw [map_mul] + exact congrArg₂ (fun a b : Omega => a * b) hy hz + algebraMap_mem' := fun y => (rhoK sigma).commutes y + inv_mem' := by + intro y hy + change rhoK sigma y = y at hy + simp [hy] } + have hrange : Set.range (algebraMap kE Omega) ⊆ T := by + rintro y ⟨z, rfl⟩ + have hbase : rhoK sigma (algebraMap kE Omega z) = + algebraMap kE Omega z := by + rw [localAbstractFixedResidueAction_apply K H sigmaH] + exact (rhoE (abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H sigmaH)).commutes z + change rhoK sigma (algebraMap kE Omega z) = + algebraMap kE Omega z + exact hbase + have hFT : F ≤ T := by + apply IntermediateField.adjoin_le_iff.mpr + exact hrange + have hxT : x ∈ T := hFT hx + change rhoK sigma x = x + change rhoK sigma x = x at hxT + exact hxT + · intro htau + let tauE : Omega ≃ₐ[kE] Omega := + { tau.toRingEquiv with + commutes' := fun z => by + have hzF : algebraMap kE Omega z ∈ F := by + apply IntermediateField.subset_adjoin + exact ⟨z, rfl⟩ + exact (IntermediateField.mem_fixingSubgroup_iff F tau).mp + htau (algebraMap kE Omega z) hzF } + obtain ⟨sigmaE, hsigmaE⟩ := + residueAlgActionOfEqTop_surjective E A hE tauE + let sigmaH : H.toSubgroup := + (abstractSubgroupEquivGaloisGroup K (SeparableClosure K) H).symm sigmaE + refine ⟨sigmaH.1, sigmaH.2, ?_⟩ + apply AlgEquiv.ext + intro x + change localSeparableResidueAlgAction K sigmaH.1 x = tau x + rw [localAbstractFixedResidueAction_apply K H sigmaH] + have hsigmaH : abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H sigmaH = sigmaE := + (abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H).apply_symm_apply sigmaE + rw [hsigmaH, hsigmaE] + rfl + +/-- The residue action of an element of `H` fixes the finite residue +subfield attached to the fixed field of `H`. -/ +theorem localAbstractFixedResidueAction_mem_fixingSubgroup + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) + (sigma : H.toSubgroup) : + localSeparableResidueAlgAction K sigma.1 ∈ + (localAbstractFixedResidueIntermediateField K H).fixingSubgroup := by + rw [← localAbstractFixedResidueAction_map_eq_fixingSubgroup K H] + exact ⟨sigma.1, sigma.2, rfl⟩ + +/-- The residue action of `H`, with scalars restricted to the actual finite +residue subfield selected by `H` inside the common residue algebraic +closure. -/ +noncomputable def localAbstractFixedResidueActionOverIntermediateField + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) : + H.toSubgroup →* + (selectedResidueField (localSeparableValuationSubring K) + ≃ₐ[localAbstractFixedResidueIntermediateField K H] + selectedResidueField (localSeparableValuationSubring K)) := by + let F := localAbstractFixedResidueIntermediateField K H + let rhoH : H.toSubgroup →* + (selectedResidueField (localSeparableValuationSubring K) ≃ₐ[decompositionResidueField K + (localSeparableValuationSubring K)] + selectedResidueField (localSeparableValuationSubring K)) := + (localSeparableResidueAlgAction K).toMonoidHom.comp H.toSubgroup.subtype + let rhoF : H.toSubgroup →* F.fixingSubgroup := + rhoH.codRestrict F.fixingSubgroup + (localAbstractFixedResidueAction_mem_fixingSubgroup K H) + exact + (IntermediateField.fixingSubgroupEquiv F).toMonoidHom.comp rhoF + +/-- Restricting residue scalars changes only the scalar-linearity proof, +not the underlying automorphism of the selected residue field. -/ +@[simp] +theorem localAbstractFixedResidueActionOverIntermediateField_apply + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) + (sigma : H.toSubgroup) + (x : selectedResidueField (localSeparableValuationSubring K)) : + localAbstractFixedResidueActionOverIntermediateField K H sigma x = + localSeparableResidueAlgAction K sigma.1 x := by + rfl + +/-- A finite abstract field has a genuinely finite residue subfield inside +the selected residue algebraic closure. Finiteness is deduced from the +finite index of `H`: surjectivity of the absolute residue action makes the +index of its image divide the index of `H`. -/ +theorem localAbstractFixedResidueIntermediateField_finiteDimensional + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) + [Finite + ((baseField (Gal(SeparableClosure K/K))).toSubgroup ⧸ + extensionSubgroup + (baseField (Gal(SeparableClosure K/K))) H + (le_baseField H))] : + FiniteDimensional + (decompositionResidueField K (localSeparableValuationSubring K)) + (localAbstractFixedResidueIntermediateField K H) := by + let G := Gal(SeparableClosure K/K) + let A := localSeparableValuationSubring K + let k := decompositionResidueField K A + let Omega := selectedResidueField A + let rho := (localSeparableResidueAlgAction K).toMonoidHom + let F := localAbstractFixedResidueIntermediateField K H + let : Finite (G ⧸ H.toSubgroup) := + ambientQuotientFiniteOfAbstractFinite + K (SeparableClosure K) H inferInstance + have hHindex : H.toSubgroup.index ≠ 0 := + Subgroup.index_ne_zero_of_finite + have hmapIndex : (H.toSubgroup.map rho).index ≠ 0 := by + intro hzero + have hdiv : (H.toSubgroup.map rho).index ∣ H.toSubgroup.index := + H.toSubgroup.index_map_dvd (localSeparableResidueAlgAction_surjective K) + rw [hzero] at hdiv + exact hHindex (eq_zero_of_zero_dvd hdiv) + let : Finite + ((Omega ≃ₐ[k] Omega) ⧸ H.toSubgroup.map rho) := + (Subgroup.index_ne_zero_iff_finite (H := H.toSubgroup.map rho)).mp + hmapIndex + have himage : H.toSubgroup.map rho = F.fixingSubgroup := + localAbstractFixedResidueAction_map_eq_fixingSubgroup K H + let : Finite ((Omega ≃ₐ[k] Omega) ⧸ F.fixingSubgroup) := by + rw [← himage] + infer_instance + let : Subgroup.FiniteIndex F.fixingSubgroup := + F.fixingSubgroup.finiteIndex_of_finite_quotient + apply (InfiniteGalois.isOpen_iff_finite (K := Omega) F).1 + exact Subgroup.isOpen_of_isClosed_of_finiteIndex + F.fixingSubgroup (InfiniteGalois.fixingSubgroup_isClosed F) + +/-- The finite residue subfield, packaged in the form used by the intrinsic +finite-field residue datum. -/ +noncomputable def localAbstractFixedResidueFiniteGaloisIntermediateField + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) + [Finite + ((baseField (Gal(SeparableClosure K/K))).toSubgroup ⧸ + extensionSubgroup + (baseField (Gal(SeparableClosure K/K))) H + (le_baseField H))] : + FiniteGaloisIntermediateField + (decompositionResidueField K (localSeparableValuationSubring K)) + (selectedResidueField (localSeparableValuationSubring K)) := by + let A := localSeparableValuationSubring K + let k := decompositionResidueField K A + let Omega := selectedResidueField A + let F := localAbstractFixedResidueIntermediateField K H + letI : Algebra k F := F.algebra + letI : FiniteDimensional k F := + localAbstractFixedResidueIntermediateField_finiteDimensional K H + letI : Finite F := Module.finite_of_finite k + letI : Fintype F := Fintype.ofFinite F + letI : IsGalois k F := by + obtain ⟨p, hp⟩ := CharP.exists k + let : CharP k p := hp + let : CharP F p := + charP_of_injective_algebraMap (R := k) (A := F) + (algebraMap k F).injective p + exact IsGalois.of_separable_splitting_field + (galois_poly_separable p (Fintype.card F) + (let ⟨n, _, hn⟩ := FiniteField.card F p + hn.symm ▸ dvd_pow_self p n.ne_zero)) + exact { toIntermediateField := F } + +/-- **Finite local reciprocity, finite-field index form.** The residue degree attached +by `localResidueDatum` to a finite abstract field is the degree of the actual +residue subfield selected by the residue action. -/ +theorem localResidueDatum_residueDegree_eq_selectedResidueFinrank + (H : FiniteAbstractField (Gal(SeparableClosure K/K))) : + (H.residueDegree (localResidueDatum K) : ℕ) = + Module.finrank + (decompositionResidueField K (localSeparableValuationSubring K)) + (localAbstractFixedResidueIntermediateField K H.field) := by + let A := localSeparableValuationSubring K + let k := decompositionResidueField K A + let Omega := selectedResidueField A + let rho := (localSeparableResidueAlgAction K).toMonoidHom + let R := localAbstractFixedResidueIntermediateField K H.field + let : Algebra k R := R.algebra + let : FiniteDimensional k R := + localAbstractFixedResidueIntermediateField_finiteDimensional K H.field + let F := localAbstractFixedResidueFiniteGaloisIntermediateField K H.field + let HR := H.toFiniteResidueAbstractField (localResidueDatum K) + let : Finite ((localResidueDatum K).residueQuotient H.field) := + HR.finiteResidueQuotient + have himage : H.field.toSubgroup.map rho = + F.toIntermediateField.fixingSubgroup := by + change H.field.toSubgroup.map + (localSeparableResidueAlgAction K).toMonoidHom = + (localAbstractFixedResidueIntermediateField K H.field).fixingSubgroup + exact localAbstractFixedResidueAction_map_eq_fixingSubgroup K H.field + have hindex : + ((localResidueDatum K).fieldImage HR.field).index = + Module.finrank k R := by + rw [(localResidueDatum K).fieldImage_eq_map] + change + (H.field.toSubgroup.map + ((residueAbsoluteDegreeIn k Omega).toMonoidHom.comp rho)).index = + Module.finrank k R + exact residueDegreeImage_index_eq_finrank_of_map_eq_fixingSubgroup + k Omega rho H.field.toSubgroup F himage + let : ((localResidueDatum K).fieldImage HR.field).IsFiniteRelIndex + (⊤ : Subgroup ZHatMul) := + ⟨by + rw [Subgroup.relIndex_top_right, hindex] + let : Module.IsTorsionFree k R := + (Module.isTorsionFree_iff_algebraMap_injective (R := k) (A := R)).mpr + (algebraMap k R).injective + exact (Module.finrank_pos (R := k) (M := R)).ne'⟩ + apply Nat.cast_injective (R := Cardinal) + change ((H.residueDegree (localResidueDatum K) : ℕ) : Cardinal) = + (Module.finrank k R : Cardinal) + rw [show H.residueDegree (localResidueDatum K) = HR.residueDegree from rfl, + ← HR.residueDegreeCardinal_eq_coe, + DegreeData.residueDegreeCardinal, + relativeIndexCardinal_eq_index_of_finite + (show (localResidueDatum K).fieldImage HR.field ≤ + (⊤ : Subgroup ZHatMul) from le_top)] + norm_cast + simpa only [Subgroup.relIndex_top_right] using hindex + +/-- **Finite local reciprocity, pointwise fixed-field degree comparison.** +The normalized degree on a finite abstract field is the ordinary intrinsic +absolute residue degree after changing the finite residue base to the +residue subfield selected by that fixed field. -/ +theorem localResidueDatum_normalizedDegree_eq_residueAbsoluteDegreeIn + (H : FiniteAbstractField (Gal(SeparableClosure K/K))) + (sigma : H.field.toSubgroup) : + let F := localAbstractFixedResidueIntermediateField K H.field + letI : Algebra + (decompositionResidueField K (localSeparableValuationSubring K)) + F := F.algebra + letI : Module + (decompositionResidueField K (localSeparableValuationSubring K)) + F := Algebra.toModule + letI : FiniteDimensional + (decompositionResidueField K (localSeparableValuationSubring K)) + F := + localAbstractFixedResidueIntermediateField_finiteDimensional K H.field + letI : Finite F := Module.finite_of_finite + (decompositionResidueField K (localSeparableValuationSubring K)) + letI : Fintype F := Fintype.ofFinite F + (localResidueDatum K).normalizedDegree + (H.toFiniteResidueAbstractField (localResidueDatum K)) sigma = + residueAbsoluteDegreeIn F + (selectedResidueField (localSeparableValuationSubring K)) + (localAbstractFixedResidueActionOverIntermediateField + K H.field sigma) := by + let A := localSeparableValuationSubring K + let k := decompositionResidueField K A + let Omega := selectedResidueField A + let F := localAbstractFixedResidueIntermediateField K H.field + let : Algebra k F := F.algebra + let : FiniteDimensional k F := + localAbstractFixedResidueIntermediateField_finiteDimensional K H.field + let : Finite F := Module.finite_of_finite k + let : Fintype F := Fintype.ofFinite F + let HF := H.toFiniteResidueAbstractField (localResidueDatum K) + let tau : Omega ≃ₐ[F] Omega := + localAbstractFixedResidueActionOverIntermediateField K H.field sigma + have htau : + tau.restrictScalars k = + localSeparableResidueAlgAction K sigma.1 := by + apply AlgEquiv.ext + intro x + rfl + have hbase := + residueAbsoluteDegreeIn_restrictScalars k Omega F tau + rw [htau] at hbase + have hdegree : + (HF.residueDegree : ℕ) = + Module.finrank k F := + localResidueDatum_residueDegree_eq_selectedResidueFinrank K H + apply Multiplicative.ext + apply zHatMulNat_injective + HF.residueDegree.property + change + (HF.residueDegree : ℕ) • + ((localResidueDatum K).normalizedDegree HF sigma).toAdd = + (HF.residueDegree : ℕ) • + (residueAbsoluteDegreeIn F Omega tau).toAdd + rw [(localResidueDatum K).residueDegree_nsmul_normalizedDegree HF, + hdegree] + change + (residueAbsoluteDegreeIn k Omega + (localSeparableResidueAlgAction K sigma.1)).toAdd = + Module.finrank k F • + (residueAbsoluteDegreeIn F Omega tau).toAdd + exact congrArg Multiplicative.toAdd hbase + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean new file mode 100644 index 0000000000..1454f89e4b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean @@ -0,0 +1,999 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldNormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology +/-! +# Continuous fixed-field naturality diagrams + +The algebraic norm--restriction and transfer--inclusion diagrams are upgraded +here to diagrams of continuous homomorphisms. Every finite fixed field uses +the spectral norm extended from the original local field. Thus no source is +made discrete merely to obtain continuity. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open scoped NNReal ValuativeRel +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation LocalClassFieldTheory + +variable (k Ω : Type) [Field k] [Field Ω] [Algebra k Ω] [IsGalois k Ω] + +/-- The quotient topology on the algebraic abelianization. Its underlying +quotient is opaque to typeclass search, so expose the canonical topology +locally while constructing the continuous finite maps. -/ +local instance abelianizationQuotientTopologicalSpace + (G : Type*) [Group G] [TopologicalSpace G] : + TopologicalSpace (Abelianization G) := by + change TopologicalSpace (G ⧸ commutator G) + exact QuotientGroup.instTopologicalSpace (commutator G) + +/-! ## Multiplicative forms of the algebraic arrows -/ + +/-- The fixed-field norm-residue symbol on the native multiplicative unit +group. This is the multiplicative form of +`abstractFixedFieldNormResidueSymbol`. -/ +noncomputable def abstractFixedFieldNormResidueMonoidHom + (D : DegreeData (Gal(Ω/k))) + (v : ValuationData D (galoisAmbientUnitsRep k Ω)) + (hcf : SatisfiesClassFieldAxiom (galoisAmbientUnitsRep k Ω)) + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup K L hLK).Normal] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [hKabsolute : Finite + ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K + (le_baseField K))] : + (abstractFixedField k Ω K)ˣ →* + Abelianization + Gal(abstractRelativeFixedField k Ω hLK/abstractFixedField k Ω K) := + MonoidHom.toAdditive.symm + (abstractFixedFieldNormResidueSymbol + k Ω D v hcf K L hLK) + +/-- The ordinary fixed-field norm on native multiplicative unit groups. -/ +def abstractFixedFieldNormUnitsMonoidHom + (K K' : ClosedSubgroup (Gal(Ω/k))) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) : + (abstractRelativeFixedField k Ω hK'K)ˣ →* + (abstractFixedField k Ω K)ˣ := + MonoidHom.toAdditive.symm + (abstractFixedFieldNormUnits k Ω K K' hK'K) + +/-- Inclusion of native multiplicative fixed-field unit groups. -/ +def abstractFixedFieldUnitsInclusionMonoidHom + (K K' : ClosedSubgroup (Gal(Ω/k))) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) : + (abstractFixedField k Ω K)ˣ →* + (abstractFixedField k Ω K')ˣ := + MonoidHom.toAdditive.symm + (abstractFixedFieldUnitsInclusion k Ω K K' hK'K) + +/-- Restriction on native multiplicative finite abelianizations. -/ +noncomputable def abstractFixedFieldAbelianizedRestrictionMonoidHom + (K K' L L' : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + [hL'normal : (extensionSubgroup K' L' hL'K').Normal] : + Abelianization + Gal(abstractRelativeFixedField k Ω hL'K'/abstractFixedField k Ω K') →* + Abelianization + Gal(abstractRelativeFixedField k Ω hLK/abstractFixedField k Ω K) := + MonoidHom.toAdditive.symm + (abstractFixedFieldAbelianizedRestriction + k Ω K K' L L' hLK hL'K' hK'K hL'L) + +/-- Transfer on native multiplicative finite abelianizations. -/ +noncomputable def abstractFixedFieldAbelianizedTransferMonoidHom + (K K' L : ClosedSubgroup (Gal(Ω/k))) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLK'.trans hK'K)).Normal] + [hLfinite : Finite + (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))] : + letI : (extensionSubgroup K' L hLK').Normal := + transferNormNaturality_intermediateExtension_normal + K K' L hLK' hK'K + letI : Finite + (K'.toSubgroup ⧸ extensionSubgroup K' L hLK') := + FiniteGaloisSubextension.finite_extension_over_intermediate + (hLK'.trans hK'K) hK'K hLK' + Abelianization + Gal(abstractRelativeFixedField k Ω + (hLK'.trans hK'K)/abstractFixedField k Ω K) →* + Abelianization + Gal(abstractRelativeFixedField k Ω hLK'/abstractFixedField k Ω K') := + MonoidHom.toAdditive.symm + (abstractFixedFieldAbelianizedTransfer + k Ω K K' L hLK' hK'K) + +/-! ## The norm kernel -/ + +/-- Under the concrete fixed-unit equivalence, the finite abstract norm +subgroup pulls back to the ordinary field-norm subgroup. -/ +theorem abstractFixedFieldUnitsEquiv_finiteNormSubgroup_preimage + [IsSepClosed Ω] + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [hKabsolute : Finite + ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K + (le_baseField K))] : + (finiteNormSubgroup (galoisAmbientUnitsRep k Ω) + K L hLK).comap + (abstractFixedFieldUnitsEquivGaloisFixed + k Ω K).toAddMonoidHom = + additiveNormSubgroup + (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK) := by + let uK := abstractFixedFieldUnitsEquivGaloisFixed k Ω K + let uL := abstractRelativeFixedFieldUnitsEquivGaloisFixed + k Ω K L hLK + ext x + constructor + · intro hx + change uK x ∈ finiteNormSubgroup + (galoisAmbientUnitsRep k Ω) K L hLK at hx + rcases hx with ⟨b, hb⟩ + let y : Additive (abstractRelativeFixedField k Ω hLK)ˣ := + uL.symm b + have hy : uL y = b := uL.apply_symm_apply b + have hnorm := + relativeNorm_abstractFixedFieldUnit_eq_normUnits + k Ω K L hLK (Additive.toMul y) + rw [show Additive.ofMul (Additive.toMul y) = y by rfl, hy] at hnorm + change Additive.toMul x ∈ (LocalFieldTheory.normUnits + (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK)).range + refine ⟨Additive.toMul y, ?_⟩ + apply Additive.ofMul.injective + apply uK.injective + exact hnorm.symm.trans hb + · intro hx + change Additive.toMul x ∈ (LocalFieldTheory.normUnits + (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK)).range at hx + rcases hx with ⟨y, hy⟩ + change uK x ∈ finiteNormSubgroup + (galoisAmbientUnitsRep k Ω) K L hLK + refine ⟨uL (Additive.ofMul y), ?_⟩ + rw [relativeNorm_abstractFixedFieldUnit_eq_normUnits + k Ω K L hLK y] + exact congrArg uK (congrArg Additive.ofMul hy) + +/-- The kernel of the additive fixed-field norm-residue symbol is the +ordinary norm subgroup, written additively. -/ +theorem abstractFixedFieldNormResidueSymbol_ker + (D : DegreeData (Gal(Ω/k))) + (v : ValuationData D (galoisAmbientUnitsRep k Ω)) + (hcf : SatisfiesClassFieldAxiom (galoisAmbientUnitsRep k Ω)) + [IsSepClosed Ω] + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup K L hLK).Normal] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [hKabsolute : Finite + ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K + (le_baseField K))] : + (abstractFixedFieldNormResidueSymbol + k Ω D v hcf K L hLK).ker = + additiveNormSubgroup + (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK) := by + let A := galoisAmbientUnitsRep k Ω + let KF : FiniteAbstractField (Gal(Ω/k)) := + ⟨K, hKabsolute⟩ + let E : FiniteGaloisSubextension K := + ⟨L, hLK, hnormal, hfinite⟩ + let q := abstractExtensionQuotientEquivGaloisGroup + k Ω K L hLK hnormal + let e := (D.normResidueSymbol A v hcf KF E).trans + (MulEquiv.toAdditive q.abelianizationCongr) + let uK := abstractFixedFieldUnitsEquivGaloisFixed k Ω K + calc + (abstractFixedFieldNormResidueSymbol + k Ω D v hcf K L hLK).ker = + (finiteNormSubgroup A K L hLK).comap + uK.toAddMonoidHom := by + ext x + change e + (finiteNormClass A K L hLK (uK x)) = 0 ↔ + uK x ∈ finiteNormSubgroup A K L hLK + rw [e.map_eq_zero_iff] + exact finiteNormClass_eq_zero_iff A K L hLK (uK x) + _ = additiveNormSubgroup + (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK) := + abstractFixedFieldUnitsEquiv_finiteNormSubgroup_preimage + k Ω K L hLK + +/-- The kernel of the multiplicative fixed-field norm-residue homomorphism +is the ordinary norm subgroup. -/ +theorem abstractFixedFieldNormResidueMonoidHom_ker + (D : DegreeData (Gal(Ω/k))) + (v : ValuationData D (galoisAmbientUnitsRep k Ω)) + (hcf : SatisfiesClassFieldAxiom (galoisAmbientUnitsRep k Ω)) + [IsSepClosed Ω] + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup K L hLK).Normal] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [hKabsolute : Finite + ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K + (le_baseField K))] : + (abstractFixedFieldNormResidueMonoidHom + k Ω D v hcf K L hLK).ker = + localNormSubgroup + (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK) := by + change (abstractFixedFieldNormResidueSymbol + k Ω D v hcf K L hLK).ker.toSubgroup = _ + rw [abstractFixedFieldNormResidueSymbol_ker + k Ω D v hcf K L hLK] + rfl + +/-! ## Continuous arrows -/ + +/-- The fixed-field norm-residue symbol, bundled as a genuinely continuous +homomorphism for the spectral topology on the source field. -/ +noncomputable def abstractFixedFieldNormResidueMap + [ValuativeRel k] [TopologicalSpace k] + [IsNonarchimedeanLocalField k] + [IsSepClosed Ω] + (D : DegreeData (Gal(Ω/k))) + (v : ValuationData D (galoisAmbientUnitsRep k Ω)) + (hcf : SatisfiesClassFieldAxiom (galoisAmbientUnitsRep k Ω)) + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup K L hLK).Normal] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [hKabsolute : Finite + ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K + (le_baseField K))] : + letI : FiniteDimensional k (abstractFixedField k Ω K) := + abstractFixedField_finiteDimensional k Ω K hKabsolute + letI : NontriviallyNormedField (abstractFixedField k Ω K) := + finiteExtensionSpectralNormedField k (abstractFixedField k Ω K) + (abstractFixedField k Ω K)ˣ →ₜ* + Abelianization + Gal(abstractRelativeFixedField k Ω hLK/abstractFixedField k Ω K) := by + let F := abstractFixedField k Ω K + let E := abstractRelativeFixedField k Ω hLK + letI : FiniteDimensional k F := + abstractFixedField_finiteDimensional k Ω K hKabsolute + letI : NontriviallyNormedField F := + finiteExtensionSpectralNormedField k F + letI : CompleteSpace F := finiteExtensionSpectralCompleteSpace k F + letI : ValuativeRel F := finiteExtensionSpectralValuativeRel k F + letI : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField k F + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + k Ω K L hLK hKabsolute hfinite + letI : IsGalois F E := + abstractRelativeFixedField_isGalois k Ω K L hLK hnormal + letI : DiscreteTopology (Abelianization Gal(E/F)) := + QuotientGroup.discreteTopology (isOpen_discrete _) + let f := abstractFixedFieldNormResidueMonoidHom + k Ω D v hcf K L hLK + refine { f with continuous_toFun := ?_ } + apply continuous_of_continuousAt_one f + rw [ContinuousAt, map_one, + @nhds_discrete (Abelianization Gal(E/F)) _ _, Filter.tendsto_pure] + have hopen : IsOpen (f.ker : Set Fˣ) := by + rw [abstractFixedFieldNormResidueMonoidHom_ker + k Ω D v hcf K L hLK] + exact localNormSubgroup_isOpen F E + exact hopen.mem_nhds (by simp) + +/-- Forgetting continuity recovers the algebraic fixed-field norm-residue homomorphism. -/ +theorem abstractFixedFieldNormResidueMap_toMonoidHom + [ValuativeRel k] [TopologicalSpace k] + [IsNonarchimedeanLocalField k] + [IsSepClosed Ω] + (D : DegreeData (Gal(Ω/k))) + (v : ValuationData D (galoisAmbientUnitsRep k Ω)) + (hcf : SatisfiesClassFieldAxiom (galoisAmbientUnitsRep k Ω)) + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup K L hLK).Normal] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [hKabsolute : Finite + ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K + (le_baseField K))] : + letI : FiniteDimensional k (abstractFixedField k Ω K) := + abstractFixedField_finiteDimensional k Ω K hKabsolute + letI : NontriviallyNormedField (abstractFixedField k Ω K) := + finiteExtensionSpectralNormedField k (abstractFixedField k Ω K) + (abstractFixedFieldNormResidueMap k Ω D v hcf K L hLK).toMonoidHom = + abstractFixedFieldNormResidueMonoidHom k Ω D v hcf K L hLK := rfl + +/-- The ordinary norm on fixed-field units, continuously bundled for the +two spectral topologies extended from the original local field. -/ +noncomputable def abstractFixedFieldNormUnitsMap + [ValuativeRel k] [TopologicalSpace k] + [IsNonarchimedeanLocalField k] + (K K' : ClosedSubgroup (Gal(Ω/k))) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hKabsolute : Finite + ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K + (le_baseField K))] + [hK'absolute : Finite + ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K' + (le_baseField K'))] + [hK'Kfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K K' hK'K)] : + letI : FiniteDimensional k (abstractFixedField k Ω K) := + abstractFixedField_finiteDimensional k Ω K hKabsolute + letI : FiniteDimensional k + (abstractRelativeFixedField k Ω hK'K) := + abstractFixedField_finiteDimensional k Ω K' hK'absolute + letI : NontriviallyNormedField (abstractFixedField k Ω K) := + finiteExtensionSpectralNormedField k (abstractFixedField k Ω K) + letI : NontriviallyNormedField + (abstractRelativeFixedField k Ω hK'K) := + finiteExtensionSpectralNormedField k + (abstractRelativeFixedField k Ω hK'K) + (abstractRelativeFixedField k Ω hK'K)ˣ →ₜ* + (abstractFixedField k Ω K)ˣ := by + let F := abstractFixedField k Ω K + let F' := abstractRelativeFixedField k Ω hK'K + letI : FiniteDimensional k F := + abstractFixedField_finiteDimensional k Ω K hKabsolute + letI : FiniteDimensional k F' := + abstractFixedField_finiteDimensional k Ω K' hK'absolute + letI : NontriviallyNormedField F := + finiteExtensionSpectralNormedField k F + letI : NontriviallyNormedField F' := + finiteExtensionSpectralNormedField k F' + letI : IsScalarTower k F F' := IsScalarTower.of_algebraMap_eq' rfl + letI : FiniteDimensional F F' := + abstractRelativeFixedField_finiteDimensional + k Ω K K' hK'K hKabsolute hK'Kfinite + letI : CompleteSpace F := finiteExtensionSpectralCompleteSpace k F + letI : NormedAlgebra F F' := + finiteExtensionSpectralNormedAlgebra k F F' + let f := abstractFixedFieldNormUnitsMonoidHom + k Ω K K' hK'K + refine { f with continuous_toFun := ?_ } + change Continuous (LocalFieldTheory.normUnits F F') + exact normUnits_continuous_of_finiteDimensional F F' + +/-- Forgetting continuity recovers the algebraic norm on fixed-field units. -/ +theorem abstractFixedFieldNormUnitsMap_toMonoidHom + [ValuativeRel k] [TopologicalSpace k] + [IsNonarchimedeanLocalField k] + (K K' : ClosedSubgroup (Gal(Ω/k))) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hKabsolute : Finite + ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K + (le_baseField K))] + [hK'absolute : Finite + ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K' + (le_baseField K'))] + [hK'Kfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K K' hK'K)] : + letI : FiniteDimensional k (abstractFixedField k Ω K) := + abstractFixedField_finiteDimensional k Ω K hKabsolute + letI : FiniteDimensional k + (abstractRelativeFixedField k Ω hK'K) := + abstractFixedField_finiteDimensional k Ω K' hK'absolute + letI : NontriviallyNormedField (abstractFixedField k Ω K) := + finiteExtensionSpectralNormedField k (abstractFixedField k Ω K) + letI : NontriviallyNormedField + (abstractRelativeFixedField k Ω hK'K) := + finiteExtensionSpectralNormedField k + (abstractRelativeFixedField k Ω hK'K) + (abstractFixedFieldNormUnitsMap k Ω K K' hK'K).toMonoidHom = + abstractFixedFieldNormUnitsMonoidHom k Ω K K' hK'K := rfl + +/-- Inclusion of fixed-field units, continuously bundled for the two +spectral topologies extended from the original local field. -/ +noncomputable def abstractFixedFieldUnitsInclusionMap + [ValuativeRel k] [TopologicalSpace k] + [IsNonarchimedeanLocalField k] + (K K' : ClosedSubgroup (Gal(Ω/k))) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hKabsolute : Finite + ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K + (le_baseField K))] + [hK'absolute : Finite + ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K' + (le_baseField K'))] : + letI : FiniteDimensional k (abstractFixedField k Ω K) := + abstractFixedField_finiteDimensional k Ω K hKabsolute + letI : FiniteDimensional k (abstractFixedField k Ω K') := + abstractFixedField_finiteDimensional k Ω K' hK'absolute + letI : NontriviallyNormedField (abstractFixedField k Ω K) := + finiteExtensionSpectralNormedField k (abstractFixedField k Ω K) + letI : NontriviallyNormedField (abstractFixedField k Ω K') := + finiteExtensionSpectralNormedField k (abstractFixedField k Ω K') + (abstractFixedField k Ω K)ˣ →ₜ* + (abstractFixedField k Ω K')ˣ := by + let F := abstractFixedField k Ω K + let F' := abstractFixedField k Ω K' + letI : FiniteDimensional k F := + abstractFixedField_finiteDimensional k Ω K hKabsolute + letI : FiniteDimensional k F' := + abstractFixedField_finiteDimensional k Ω K' hK'absolute + letI : NontriviallyNormedField F := + finiteExtensionSpectralNormedField k F + letI : NontriviallyNormedField F' := + finiteExtensionSpectralNormedField k F' + letI : NontriviallyNormedField k := + localFieldNontriviallyNormedField k + letI : IsUltrametricDist k := localFieldIsUltrametricDist k + letI : CompleteSpace k := inferInstance + letI : NormedSpace k F := spectralNorm.normedSpace k F + letI : NormedSpace k F' := spectralNorm.normedSpace k F' + let f := abstractFixedFieldUnitsInclusionMonoidHom + k Ω K K' hK'K + refine { f with continuous_toFun := ?_ } + exact Continuous.units_map _ + (IntermediateField.inclusion + (abstractFixedField_le k Ω hK'K)).toLinearMap.continuous_of_finiteDimensional + +/-- Abelianized restriction, continuously bundled for the finite native +Krull quotient topologies. -/ +noncomputable def abstractFixedFieldAbelianizedRestrictionMap + (K K' L L' : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + [hL'normal : (extensionSubgroup K' L' hL'K').Normal] + [hL'K'finite : Finite + (K'.toSubgroup ⧸ extensionSubgroup K' L' hL'K')] + [hK'absolute : Finite + ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K' + (le_baseField K'))] : + Abelianization + Gal(abstractRelativeFixedField k Ω hL'K'/abstractFixedField k Ω K') →ₜ* + Abelianization + Gal(abstractRelativeFixedField k Ω hLK/abstractFixedField k Ω K) := by + let F' := abstractFixedField k Ω K' + let E' := abstractRelativeFixedField k Ω hL'K' + letI : FiniteDimensional F' E' := + abstractRelativeFixedField_finiteDimensional + k Ω K' L' hL'K' hK'absolute hL'K'finite + letI : IsGalois F' E' := + abstractRelativeFixedField_isGalois + k Ω K' L' hL'K' hL'normal + letI : DiscreteTopology (Abelianization Gal(E'/F')) := + QuotientGroup.discreteTopology (isOpen_discrete _) + let f := abstractFixedFieldAbelianizedRestrictionMonoidHom + k Ω K K' L L' hLK hL'K' hK'K hL'L + exact { f with continuous_toFun := continuous_of_discreteTopology } + +/-- Abelianized transfer, continuously bundled for the finite native Krull +quotient topologies. -/ +noncomputable def abstractFixedFieldAbelianizedTransferMap + (K K' L : ClosedSubgroup (Gal(Ω/k))) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLK'.trans hK'K)).Normal] + [hLfinite : Finite + (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))] + [hKabsolute : Finite + ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K + (le_baseField K))] : + letI : (extensionSubgroup K' L hLK').Normal := + transferNormNaturality_intermediateExtension_normal + K K' L hLK' hK'K + letI : Finite + (K'.toSubgroup ⧸ extensionSubgroup K' L hLK') := + FiniteGaloisSubextension.finite_extension_over_intermediate + (hLK'.trans hK'K) hK'K hLK' + Abelianization + Gal(abstractRelativeFixedField k Ω + (hLK'.trans hK'K)/abstractFixedField k Ω K) →ₜ* + Abelianization + Gal(abstractRelativeFixedField k Ω hLK'/abstractFixedField k Ω K') := by + letI : (extensionSubgroup K' L hLK').Normal := + transferNormNaturality_intermediateExtension_normal + K K' L hLK' hK'K + letI : Finite + (K'.toSubgroup ⧸ extensionSubgroup K' L hLK') := + FiniteGaloisSubextension.finite_extension_over_intermediate + (hLK'.trans hK'K) hK'K hLK' + let F := abstractFixedField k Ω K + let E := abstractRelativeFixedField k Ω + (hLK'.trans hK'K) + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + k Ω K L (hLK'.trans hK'K) hKabsolute hLfinite + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + k Ω K L (hLK'.trans hK'K) hLnormal + letI : DiscreteTopology (Abelianization Gal(E/F)) := + QuotientGroup.discreteTopology (isOpen_discrete _) + let f := abstractFixedFieldAbelianizedTransferMonoidHom + k Ω K K' L hLK' hK'K + exact { f with continuous_toFun := continuous_of_discreteTopology } + +/-! ## Continuous norm--restriction square -/ + +namespace LocalFixedFieldNormRestrictionSquare + +variable {k : Type} [Field k] [ValuativeRel k] [TopologicalSpace k] + [IsNonarchimedeanLocalField k] + +/-- The lower horizontal norm-residue arrow as a continuous homomorphism. -/ +noncomputable def lowerNormResidueMap + (T : LocalFixedFieldNormRestrictionSquare k) : + letI : FiniteDimensional k + (abstractFixedField k (SeparableClosure k) T.lowerBase) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.lowerBase T.lowerAbsoluteFinite + letI : NontriviallyNormedField + (abstractFixedField k (SeparableClosure k) T.lowerBase) := + finiteExtensionSpectralNormedField k + (abstractFixedField k (SeparableClosure k) T.lowerBase) + (abstractFixedField k (SeparableClosure k) T.lowerBase)ˣ →ₜ* + Abelianization + Gal(abstractRelativeFixedField k (SeparableClosure k) + T.lowerTop_le_lowerBase/abstractFixedField k (SeparableClosure k) T.lowerBase) := by + letI := T.lowerNormal + letI := T.lowerFinite + letI := T.lowerAbsoluteFinite + exact abstractFixedFieldNormResidueMap + k (SeparableClosure k) + (localResidueDatum k) (localHenselianValuation k) + (separableClosureUnits_isClassFormation k) + T.lowerBase T.lowerTop T.lowerTop_le_lowerBase + +/-- Forgetting continuity recovers the lower algebraic norm-residue map. -/ +theorem lowerNormResidueMap_toMonoidHom + (T : LocalFixedFieldNormRestrictionSquare k) : + letI : FiniteDimensional k + (abstractFixedField k (SeparableClosure k) T.lowerBase) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.lowerBase T.lowerAbsoluteFinite + letI : NontriviallyNormedField + (abstractFixedField k (SeparableClosure k) T.lowerBase) := + finiteExtensionSpectralNormedField k + (abstractFixedField k (SeparableClosure k) T.lowerBase) + (lowerNormResidueMap T).toMonoidHom = + MonoidHom.toAdditive.symm (lowerNormResidueSymbol T) := rfl + +/-- The upper horizontal norm-residue arrow as a continuous homomorphism. -/ +noncomputable def upperNormResidueMap + (T : LocalFixedFieldNormRestrictionSquare k) : + letI : FiniteDimensional k + (abstractFixedField k (SeparableClosure k) T.upperBase) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.upperBase (upperAbsoluteFinite T) + letI : NontriviallyNormedField + (abstractFixedField k (SeparableClosure k) T.upperBase) := + finiteExtensionSpectralNormedField k + (abstractFixedField k (SeparableClosure k) T.upperBase) + (abstractFixedField k (SeparableClosure k) T.upperBase)ˣ →ₜ* + Abelianization + Gal(abstractRelativeFixedField k (SeparableClosure k) + T.upperTop_le_upperBase/abstractFixedField k (SeparableClosure k) T.upperBase) := by + letI := T.upperNormal + letI := T.upperFinite + letI := upperAbsoluteFinite T + exact abstractFixedFieldNormResidueMap + k (SeparableClosure k) + (localResidueDatum k) (localHenselianValuation k) + (separableClosureUnits_isClassFormation k) + T.upperBase T.upperTop T.upperTop_le_upperBase + +/-- Forgetting continuity recovers the upper algebraic norm-residue map. -/ +theorem upperNormResidueMap_toMonoidHom + (T : LocalFixedFieldNormRestrictionSquare k) : + letI : FiniteDimensional k + (abstractFixedField k (SeparableClosure k) T.upperBase) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.upperBase (upperAbsoluteFinite T) + letI : NontriviallyNormedField + (abstractFixedField k (SeparableClosure k) T.upperBase) := + finiteExtensionSpectralNormedField k + (abstractFixedField k (SeparableClosure k) T.upperBase) + (upperNormResidueMap T).toMonoidHom = + MonoidHom.toAdditive.symm (upperNormResidueSymbol T) := rfl + +/-- The vertical ordinary norm arrow as a continuous homomorphism. -/ +noncomputable def normUnitsMap + (T : LocalFixedFieldNormRestrictionSquare k) : + letI : FiniteDimensional k + (abstractFixedField k (SeparableClosure k) T.lowerBase) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.lowerBase T.lowerAbsoluteFinite + letI : FiniteDimensional k + (abstractRelativeFixedField k (SeparableClosure k) + T.upperBase_le_lowerBase) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.upperBase (upperAbsoluteFinite T) + letI : NontriviallyNormedField + (abstractFixedField k (SeparableClosure k) T.lowerBase) := + finiteExtensionSpectralNormedField k + (abstractFixedField k (SeparableClosure k) T.lowerBase) + letI : NontriviallyNormedField + (abstractRelativeFixedField k (SeparableClosure k) + T.upperBase_le_lowerBase) := + finiteExtensionSpectralNormedField k + (abstractRelativeFixedField k (SeparableClosure k) + T.upperBase_le_lowerBase) + (abstractRelativeFixedField k (SeparableClosure k) + T.upperBase_le_lowerBase)ˣ →ₜ* + (abstractFixedField k (SeparableClosure k) T.lowerBase)ˣ := by + letI := T.lowerAbsoluteFinite + letI := upperAbsoluteFinite T + letI := T.baseFinite + exact abstractFixedFieldNormUnitsMap + k (SeparableClosure k) + T.lowerBase T.upperBase T.upperBase_le_lowerBase + +/-- Forgetting continuity recovers the algebraic norm on units. -/ +theorem normUnitsMap_toMonoidHom + (T : LocalFixedFieldNormRestrictionSquare k) : + letI : FiniteDimensional k + (abstractFixedField k (SeparableClosure k) T.lowerBase) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.lowerBase T.lowerAbsoluteFinite + letI : FiniteDimensional k + (abstractRelativeFixedField k (SeparableClosure k) + T.upperBase_le_lowerBase) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.upperBase (upperAbsoluteFinite T) + letI : NontriviallyNormedField + (abstractFixedField k (SeparableClosure k) T.lowerBase) := + finiteExtensionSpectralNormedField k + (abstractFixedField k (SeparableClosure k) T.lowerBase) + letI : NontriviallyNormedField + (abstractRelativeFixedField k (SeparableClosure k) + T.upperBase_le_lowerBase) := + finiteExtensionSpectralNormedField k + (abstractRelativeFixedField k (SeparableClosure k) + T.upperBase_le_lowerBase) + (normUnitsMap T).toMonoidHom = + MonoidHom.toAdditive.symm (normUnits T) := rfl + +/-- The vertical abelianized restriction arrow as a continuous +homomorphism. -/ +noncomputable def abelianizedRestrictionMap + (T : LocalFixedFieldNormRestrictionSquare k) := + letI := T.lowerNormal + letI := T.upperNormal + letI := T.upperFinite + letI := upperAbsoluteFinite T + abstractFixedFieldAbelianizedRestrictionMap + k (SeparableClosure k) + T.lowerBase T.upperBase T.lowerTop T.upperTop + T.lowerTop_le_lowerBase T.upperTop_le_upperBase + T.upperBase_le_lowerBase T.upperTop_le_lowerTop + +/-- Forgetting continuity recovers algebraic abelianized restriction. -/ +theorem abelianizedRestrictionMap_toMonoidHom + (T : LocalFixedFieldNormRestrictionSquare k) : + (abelianizedRestrictionMap T).toMonoidHom = + MonoidHom.toAdditive.symm (abelianizedRestriction T) := rfl + +/-- Norm--restriction naturality as a commuting square of continuous +homomorphisms. -/ +theorem norm_restriction_commutes_continuous + (T : LocalFixedFieldNormRestrictionSquare k) : + letI : FiniteDimensional k + (abstractFixedField k (SeparableClosure k) T.lowerBase) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.lowerBase T.lowerAbsoluteFinite + letI : FiniteDimensional k + (abstractFixedField k (SeparableClosure k) T.upperBase) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.upperBase (upperAbsoluteFinite T) + letI : FiniteDimensional k + (abstractRelativeFixedField k (SeparableClosure k) + T.upperBase_le_lowerBase) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.upperBase (upperAbsoluteFinite T) + letI : NontriviallyNormedField + (abstractFixedField k (SeparableClosure k) T.lowerBase) := + finiteExtensionSpectralNormedField k + (abstractFixedField k (SeparableClosure k) T.lowerBase) + letI : NontriviallyNormedField + (abstractFixedField k (SeparableClosure k) T.upperBase) := + finiteExtensionSpectralNormedField k + (abstractFixedField k (SeparableClosure k) T.upperBase) + letI : NontriviallyNormedField + (abstractRelativeFixedField k (SeparableClosure k) + T.upperBase_le_lowerBase) := + finiteExtensionSpectralNormedField k + (abstractRelativeFixedField k (SeparableClosure k) + T.upperBase_le_lowerBase) + (abelianizedRestrictionMap T).comp (upperNormResidueMap T) = + (lowerNormResidueMap T).comp (normUnitsMap T) := by + let : FiniteDimensional k + (abstractFixedField k (SeparableClosure k) T.lowerBase) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.lowerBase T.lowerAbsoluteFinite + let : FiniteDimensional k + (abstractFixedField k (SeparableClosure k) T.upperBase) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.upperBase (upperAbsoluteFinite T) + let : FiniteDimensional k + (abstractRelativeFixedField k (SeparableClosure k) + T.upperBase_le_lowerBase) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.upperBase (upperAbsoluteFinite T) + let : NontriviallyNormedField + (abstractFixedField k (SeparableClosure k) T.lowerBase) := + finiteExtensionSpectralNormedField k + (abstractFixedField k (SeparableClosure k) T.lowerBase) + let : NontriviallyNormedField + (abstractFixedField k (SeparableClosure k) T.upperBase) := + finiteExtensionSpectralNormedField k + (abstractFixedField k (SeparableClosure k) T.upperBase) + let : NontriviallyNormedField + (abstractRelativeFixedField k (SeparableClosure k) + T.upperBase_le_lowerBase) := + finiteExtensionSpectralNormedField k + (abstractRelativeFixedField k (SeparableClosure k) + T.upperBase_le_lowerBase) + apply ContinuousMonoidHom.ext + intro x + change Additive.toMul + (abelianizedRestriction T + (upperNormResidueSymbol T (Additive.ofMul x))) = + Additive.toMul + (lowerNormResidueSymbol T + (normUnits T (Additive.ofMul x))) + exact congrArg Additive.toMul + (DFunLike.congr_fun (norm_restriction_commutes T) + (Additive.ofMul x)) + +end LocalFixedFieldNormRestrictionSquare + +/-! ## Continuous transfer--inclusion square -/ + +namespace LocalFixedFieldTransferTower + +variable {k : Type} [Field k] [ValuativeRel k] [TopologicalSpace k] + [IsNonarchimedeanLocalField k] + +/-- The total horizontal norm-residue arrow as a continuous homomorphism. -/ +noncomputable def baseNormResidueMap + (T : LocalFixedFieldTransferTower k) : + letI : FiniteDimensional k + (abstractFixedField k (SeparableClosure k) T.base) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.base T.baseAbsoluteFinite + letI : NontriviallyNormedField + (abstractFixedField k (SeparableClosure k) T.base) := + finiteExtensionSpectralNormedField k + (abstractFixedField k (SeparableClosure k) T.base) + (abstractFixedField k (SeparableClosure k) T.base)ˣ →ₜ* + Abelianization + Gal(abstractRelativeFixedField k (SeparableClosure k) + (T.top_le_intermediate.trans T.intermediate_le_base)/abstractFixedField k + (SeparableClosure k) T.base) := by + letI := T.totalNormal + letI := T.totalFinite + letI := T.baseAbsoluteFinite + exact abstractFixedFieldNormResidueMap + k (SeparableClosure k) + (localResidueDatum k) (localHenselianValuation k) + (separableClosureUnits_isClassFormation k) + T.base T.top + (T.top_le_intermediate.trans T.intermediate_le_base) + +/-- Forgetting continuity recovers the total algebraic norm-residue map. -/ +theorem baseNormResidueMap_toMonoidHom + (T : LocalFixedFieldTransferTower k) : + letI : FiniteDimensional k + (abstractFixedField k (SeparableClosure k) T.base) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.base T.baseAbsoluteFinite + letI : NontriviallyNormedField + (abstractFixedField k (SeparableClosure k) T.base) := + finiteExtensionSpectralNormedField k + (abstractFixedField k (SeparableClosure k) T.base) + (baseNormResidueMap T).toMonoidHom = + MonoidHom.toAdditive.symm (baseNormResidueSymbol T) := rfl + +/-- The intermediate horizontal norm-residue arrow as a continuous +homomorphism. -/ +noncomputable def intermediateNormResidueMap + (T : LocalFixedFieldTransferTower k) : + letI : FiniteDimensional k + (abstractFixedField k (SeparableClosure k) T.intermediate) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.intermediate + (intermediateAbsoluteFinite T) + letI : NontriviallyNormedField + (abstractFixedField k (SeparableClosure k) T.intermediate) := + finiteExtensionSpectralNormedField k + (abstractFixedField k (SeparableClosure k) T.intermediate) + (abstractFixedField k (SeparableClosure k) T.intermediate)ˣ →ₜ* + Abelianization + Gal(abstractRelativeFixedField k (SeparableClosure k) + T.top_le_intermediate/abstractFixedField k (SeparableClosure k) T.intermediate) := by + letI := intermediateNormal T + letI := intermediateFinite T + letI := intermediateAbsoluteFinite T + exact abstractFixedFieldNormResidueMap + k (SeparableClosure k) + (localResidueDatum k) (localHenselianValuation k) + (separableClosureUnits_isClassFormation k) + T.intermediate T.top T.top_le_intermediate + +/-- Forgetting continuity recovers the intermediate norm-residue map. -/ +theorem intermediateNormResidueMap_toMonoidHom + (T : LocalFixedFieldTransferTower k) : + letI : FiniteDimensional k + (abstractFixedField k (SeparableClosure k) T.intermediate) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.intermediate + (intermediateAbsoluteFinite T) + letI : NontriviallyNormedField + (abstractFixedField k (SeparableClosure k) T.intermediate) := + finiteExtensionSpectralNormedField k + (abstractFixedField k (SeparableClosure k) T.intermediate) + (intermediateNormResidueMap T).toMonoidHom = + MonoidHom.toAdditive.symm (intermediateNormResidueSymbol T) := rfl + +/-- The vertical inclusion of fixed-field units as a continuous +homomorphism. -/ +noncomputable def unitsInclusionMap + (T : LocalFixedFieldTransferTower k) : + letI : FiniteDimensional k + (abstractFixedField k (SeparableClosure k) T.base) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.base T.baseAbsoluteFinite + letI : FiniteDimensional k + (abstractFixedField k (SeparableClosure k) T.intermediate) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.intermediate + (intermediateAbsoluteFinite T) + letI : NontriviallyNormedField + (abstractFixedField k (SeparableClosure k) T.base) := + finiteExtensionSpectralNormedField k + (abstractFixedField k (SeparableClosure k) T.base) + letI : NontriviallyNormedField + (abstractFixedField k (SeparableClosure k) T.intermediate) := + finiteExtensionSpectralNormedField k + (abstractFixedField k (SeparableClosure k) T.intermediate) + (abstractFixedField k (SeparableClosure k) T.base)ˣ →ₜ* + (abstractFixedField k (SeparableClosure k) T.intermediate)ˣ := by + letI := T.baseAbsoluteFinite + letI := intermediateAbsoluteFinite T + exact abstractFixedFieldUnitsInclusionMap + k (SeparableClosure k) + T.base T.intermediate T.intermediate_le_base + +/-- Forgetting continuity recovers algebraic inclusion of fixed-field units. -/ +theorem unitsInclusionMap_toMonoidHom + (T : LocalFixedFieldTransferTower k) : + letI : FiniteDimensional k + (abstractFixedField k (SeparableClosure k) T.base) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.base T.baseAbsoluteFinite + letI : FiniteDimensional k + (abstractFixedField k (SeparableClosure k) T.intermediate) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.intermediate + (intermediateAbsoluteFinite T) + letI : NontriviallyNormedField + (abstractFixedField k (SeparableClosure k) T.base) := + finiteExtensionSpectralNormedField k + (abstractFixedField k (SeparableClosure k) T.base) + letI : NontriviallyNormedField + (abstractFixedField k (SeparableClosure k) T.intermediate) := + finiteExtensionSpectralNormedField k + (abstractFixedField k (SeparableClosure k) T.intermediate) + (unitsInclusionMap T).toMonoidHom = + MonoidHom.toAdditive.symm (unitsInclusion T) := rfl + +/-- The vertical abelianized transfer arrow as a continuous homomorphism. -/ +noncomputable def abelianizedTransferMap + (T : LocalFixedFieldTransferTower k) := + letI := T.totalNormal + letI := T.totalFinite + letI := T.baseAbsoluteFinite + abstractFixedFieldAbelianizedTransferMap + k (SeparableClosure k) + T.base T.intermediate T.top + T.top_le_intermediate T.intermediate_le_base + +/-- Forgetting continuity recovers algebraic abelianized transfer. -/ +theorem abelianizedTransferMap_toMonoidHom + (T : LocalFixedFieldTransferTower k) : + (abelianizedTransferMap T).toMonoidHom = + MonoidHom.toAdditive.symm (abelianizedTransfer T) := rfl + +/-- Transfer--inclusion naturality as a commuting square of continuous +homomorphisms. -/ +theorem transfer_inclusion_commutes_continuous + (T : LocalFixedFieldTransferTower k) : + letI : FiniteDimensional k + (abstractFixedField k (SeparableClosure k) T.base) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.base T.baseAbsoluteFinite + letI : FiniteDimensional k + (abstractFixedField k (SeparableClosure k) T.intermediate) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.intermediate + (intermediateAbsoluteFinite T) + letI : NontriviallyNormedField + (abstractFixedField k (SeparableClosure k) T.base) := + finiteExtensionSpectralNormedField k + (abstractFixedField k (SeparableClosure k) T.base) + letI : NontriviallyNormedField + (abstractFixedField k (SeparableClosure k) T.intermediate) := + finiteExtensionSpectralNormedField k + (abstractFixedField k (SeparableClosure k) T.intermediate) + (abelianizedTransferMap T).comp (baseNormResidueMap T) = + (intermediateNormResidueMap T).comp (unitsInclusionMap T) := by + let : FiniteDimensional k + (abstractFixedField k (SeparableClosure k) T.base) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.base T.baseAbsoluteFinite + let : FiniteDimensional k + (abstractFixedField k (SeparableClosure k) T.intermediate) := + abstractFixedField_finiteDimensional + k (SeparableClosure k) T.intermediate + (intermediateAbsoluteFinite T) + let : NontriviallyNormedField + (abstractFixedField k (SeparableClosure k) T.base) := + finiteExtensionSpectralNormedField k + (abstractFixedField k (SeparableClosure k) T.base) + let : NontriviallyNormedField + (abstractFixedField k (SeparableClosure k) T.intermediate) := + finiteExtensionSpectralNormedField k + (abstractFixedField k (SeparableClosure k) T.intermediate) + apply ContinuousMonoidHom.ext + intro x + change Additive.toMul + (abelianizedTransfer T + (baseNormResidueSymbol T (Additive.ofMul x))) = + Additive.toMul + (intermediateNormResidueSymbol T + (unitsInclusion T (Additive.ofMul x))) + exact congrArg Additive.toMul + (DFunLike.congr_fun (transfer_inclusion_commutes T) + (Additive.ofMul x)) + +end LocalFixedFieldTransferTower + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity.lean new file mode 100644 index 0000000000..ce39211168 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity.lean @@ -0,0 +1,26 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeNormTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeSymbolSetup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitnessComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusQuotientTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.NormRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.PrimeComparison + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/All.lean new file mode 100644 index 0000000000..4d80a7fa61 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/All.lean @@ -0,0 +1,30 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeNormTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeSymbolSetup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeTarget +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitnessComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusQuotientTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.NormRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.PrimeComparison +/-! +# Intrinsic fixed-field reciprocity + +Aggregate for the comparison of intrinsic Frobenius and norm-residue maps in +fixed fields, including their ambient-prime and base-change transports. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean new file mode 100644 index 0000000000..98c14a75cf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean @@ -0,0 +1,375 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport +public import Mathlib.GroupTheory.Abelianization.Defs +/-! +# Ambient embedded norm-residue values + +This module defines the ambient fixed-field norm-residue value attached +to a unit of the intrinsically presented base field, both before and +after identifying the abelianization of an abelian Galois group with +the group itself. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open scoped ValuativeRel +open scoped IsMulCommutative + +/-- The separable-closure equivalence used to compare the intrinsic extension +over `F` with its realization inside the ambient separable closure of `K`. -/ +abbrev ambientEmbeddedSeparableClosureEquiv + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + (j : E →ₐ[K] SeparableClosure K) := + @AlgEquiv F (SeparableClosure F) (SeparableClosure K) + _ _ _ + (separableClosure F (AlgebraicClosure F)).algebra + (j.comp (IsScalarTower.toAlgHom K F E)).toRingHom.toAlgebra + +/-- A finite fixed-field presentation of an embedded finite Galois extension. + +The object records the actual ambient fixed-field quotient, its realization of +the embedded base field, and the quotient map to the original Galois group. +It is the common interface for calculations that use the ambient +norm-residue value without unfolding the construction of that presentation. -/ +structure AmbientEmbeddedFixedFieldPresentation + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsGalois F E] + (j : E →ₐ[K] SeparableClosure K) where + /-- The given base field embedded in the ambient separable closure. -/ + baseEmbedding : F →ₐ[K] SeparableClosure K + /-- The finite ambient fixed field representing the embedded base field. -/ + base : FiniteAbstractField Gal(SeparableClosure K/K) + /-- The finite Galois ambient fixed-field extension representing `E / F`. -/ + extension : FiniteGaloisSubextension base.field + /-- The base embedding is induced by the embedding of the top field. -/ + baseEmbedding_eq : + baseEmbedding = j.comp (IsScalarTower.toAlgHom K F E) + /-- The ambient base subgroup fixes precisely the range of the base embedding. -/ + base_field_eq : + base.field = + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange baseEmbedding) + /-- The ambient top subgroup fixes precisely the range of the top embedding. -/ + extension_field_eq : + extension.field = + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + /-- The actual equivalence from the given base field to its ambient fixed field. -/ + baseEquiv : + F ≃ₐ[K] abstractFixedField K (SeparableClosure K) base.field + /-- The base-field equivalence realizes the chosen ambient embedding. -/ + baseEquiv_apply (x : F) : + ((baseEquiv x : + abstractFixedField K (SeparableClosure K) base.field) : + SeparableClosure K) = + baseEmbedding x + /-- The actual quotient equivalence to the original Galois group. -/ + quotientEquiv : extension.extensionQuotient ≃* Gal(E/F) + /-- The quotient equivalence acts through the supplied ambient embedding. -/ + quotientEquiv_mk_apply + (sigma : base.field.toSubgroup) (x : E) : + j (quotientEquiv (extension.extensionQuotientMk sigma) x) = + sigma.1 (j x) + +namespace AmbientEmbeddedFixedFieldPresentation + +/-- The canonical quotient equivalence from an ambient finite fixed-field +extension to the Galois group of its relative fixed field. -/ +noncomputable def fixedFieldQuotientEquiv + {K F E : Type} + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsGalois F E] + {j : E →ₐ[K] SeparableClosure K} + (P : AmbientEmbeddedFixedFieldPresentation K F E j) : + P.extension.extensionQuotient ≃* + Gal(abstractRelativeFixedField K (SeparableClosure K) + P.extension.below/abstractFixedField K (SeparableClosure K) P.base.field) := + P.extension.extensionQuotientMulEquiv.trans + (abstractExtensionQuotientEquivGaloisGroup + K (SeparableClosure K) P.base.field P.extension.field + P.extension.below P.extension.normal) + +/-- The actual additive equivalence obtained by transporting abelianized +relative fixed-field Galois elements through an ambient fixed-field +presentation. -/ +noncomputable def abelianizedTransport + {K F E : Type} + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsGalois F E] + {j : E →ₐ[K] SeparableClosure K} + (P : AmbientEmbeddedFixedFieldPresentation K F E j) : + Additive + (Abelianization + Gal(abstractRelativeFixedField K (SeparableClosure K) + P.extension.below/abstractFixedField K (SeparableClosure K) P.base.field)) ≃+ + Additive (Abelianization Gal(E/F)) := + (P.fixedFieldQuotientEquiv.abelianizationCongr.toAdditive.symm).trans + P.quotientEquiv.abelianizationCongr.toAdditive + +/-- Evaluate the ambient fixed-field norm-residue construction using this +presentation's actual finite quotient and base-field realization. -/ +noncomputable def normResidueAbelianElement + {K F E : Type} + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsGalois F E] + {j : E →ₐ[K] SeparableClosure K} + (P : AmbientEmbeddedFixedFieldPresentation K F E j) + (a : Fˣ) : Abelianization Gal(E/F) := by + letI : (extensionSubgroup + P.base.field P.extension.field P.extension.below).Normal := + P.extension.normal + letI : Finite + (P.base.field.toSubgroup ⧸ + extensionSubgroup P.base.field P.extension.field + P.extension.below) := + P.extension.finite + letI : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + P.base.field (le_baseField P.base.field)) := + P.base.finite + exact + Additive.toMul + (P.abelianizedTransport + (abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + P.base.field P.extension.field P.extension.below + (Additive.ofMul + (Units.mapEquiv P.baseEquiv.toMulEquiv a)))) + +/-- The presentation-level evaluation formula for the ambient norm-residue +value. It exposes only the actual finite quotient equivalences carried by +the presentation. -/ +theorem normResidueAbelianElement_apply + {K F E : Type} + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsGalois F E] + {j : E →ₐ[K] SeparableClosure K} + (P : AmbientEmbeddedFixedFieldPresentation K F E j) + (a : Fˣ) : + letI : (extensionSubgroup + P.base.field P.extension.field P.extension.below).Normal := + P.extension.normal + letI : Finite + (P.base.field.toSubgroup ⧸ + extensionSubgroup P.base.field P.extension.field + P.extension.below) := + P.extension.finite + letI : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + P.base.field (le_baseField P.base.field)) := + P.base.finite + P.normResidueAbelianElement a = + P.quotientEquiv.abelianizationCongr + (P.fixedFieldQuotientEquiv.abelianizationCongr.symm + (Additive.toMul + (abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + P.base.field P.extension.field P.extension.below + (Additive.ofMul + (Units.mapEquiv P.baseEquiv.toMulEquiv a))))) := + rfl + +end AmbientEmbeddedFixedFieldPresentation + +/-- The canonical ambient fixed-field presentation of an embedded finite +Galois local extension. -/ +noncomputable def ambientEmbeddedFixedFieldPresentation + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsGalois F E] + (j : E →ₐ[K] SeparableClosure K) + (e : ambientEmbeddedSeparableClosureEquiv K F E j) : + AmbientEmbeddedFixedFieldPresentation K F E j := by + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + letI _hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + letI _hTargetFinite : Finite + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) := + ambientEmbeddedExtensionQuotient_finite K F E j e + letI _hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, _hHabsolute⟩ + let T : FiniteGaloisSubextension H.field := + ⟨J₀, hJH, _hTargetNormal, _hTargetFinite⟩ + let F₀ := + abstractFixedField K (SeparableClosure K) H₀ + let hfixed : + F₀ = AlgHom.fieldRange i := + InfiniteGalois.fixedField_fixingSubgroup + (AlgHom.fieldRange i) + let phiF : F ≃ₐ[K] F₀ := + (i.equivFieldRange).trans + (IntermediateField.equivOfEq hfixed.symm) + let qE := + ambientEmbeddedExtensionQuotientEquivGaloisGroup + K F E j e + refine + { baseEmbedding := i + base := H + extension := T + baseEmbedding_eq := rfl + base_field_eq := rfl + extension_field_eq := rfl + baseEquiv := phiF + baseEquiv_apply := ?_ + quotientEquiv := T.extensionQuotientMulEquiv.trans qE + quotientEquiv_mk_apply := ?_ } + · intro x + rfl + · intro sigma x + change + j (qE + (T.extensionQuotientMulEquiv + (T.extensionQuotientMk sigma)) x) = + sigma.1 (j x) + rw [T.extensionQuotientMk_apply] + exact + ambientEmbeddedExtensionQuotientEquivGaloisGroup_mk_apply + K F E j e sigma x + +/-- The abelianized ambient fixed-field norm-residue value attached to a unit +of the intrinsically presented base field. -/ +noncomputable def ambientEmbeddedNormResidueAbelianElement + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsGalois F E] + (j : E →ₐ[K] SeparableClosure K) + (e : ambientEmbeddedSeparableClosureEquiv K F E j) + (a : Fˣ) : Abelianization Gal(E/F) := + (ambientEmbeddedFixedFieldPresentation K F E j e).normResidueAbelianElement a + +/-- The ambient fixed-field norm-residue value in `Gal(E/F)`, obtained +from its abelianized value using the canonical equivalence for an abelian extension. -/ +noncomputable def ambientEmbeddedNormResidueElement + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsAbelianGalois F E] + (j : E →ₐ[K] SeparableClosure K) + (e : ambientEmbeddedSeparableClosureEquiv K F E j) + (a : Fˣ) : Gal(E/F) := + (Abelianization.equivOfComm (H := Gal(E/F))).symm + (ambientEmbeddedNormResidueAbelianElement K F E j e a) + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeComparison.lean new file mode 100644 index 0000000000..a0ad41efa5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeComparison.lean @@ -0,0 +1,268 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.GroupTheory.Abelianization.Defs +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitnessComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue +/-! +# Ambient prime comparison + +The local Artin map and the ambient embedded norm-residue construction +agree on norm classes and therefore agree pointwise. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open scoped ValuativeRel +open scoped IsMulCommutative + +/-- Every abelianized Galois element is simultaneously represented by the local +Artin map and by the ambient embedded norm-residue construction. -/ +theorem + exists_localArtin_ambientEmbedded_prime + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsAbelianGalois F E] + (j : E →ₐ[K] SeparableClosure K) + (e : ambientEmbeddedSeparableClosureEquiv K F E j) + (z : Abelianization Gal(E/F)) : + ∃ x : Fˣ, + localArtinMonoidHom F E x = z ∧ + ambientEmbeddedNormResidueAbelianElement K F E j e x = z := by + exact + ⟨ambientEmbeddedPrimeWitness K F E j e z, + ambientEmbeddedPrimeWitness_local K F E j e z, + ambientEmbeddedPrimeWitness_ambient K F E j e z⟩ + +/-- The ambient embedded norm-residue element depends only on the unit's norm +class modulo norms from `E`. -/ +theorem + ambientEmbeddedNormResidueAbelianElement_eq_of_normClass_eq + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsAbelianGalois F E] + (j : E →ₐ[K] SeparableClosure K) + (e : ambientEmbeddedSeparableClosureEquiv K F E j) + (a x : Fˣ) + (h : normClass F E a = normClass F E x) : + ambientEmbeddedNormResidueAbelianElement K F E j e a = + ambientEmbeddedNormResidueAbelianElement K F E j e x := by + let i := + j.comp (IsScalarTower.toAlgHom K F E) + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro y hy + rcases hy with ⟨z, rfl⟩ + exact ⟨algebraMap F E z, rfl⟩ + let hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + let hTargetFinite : Finite + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) := + ambientEmbeddedExtensionQuotient_finite K F E j e + let hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let F₀ := + abstractFixedField K (SeparableClosure K) H₀ + have hfixed : + F₀ = AlgHom.fieldRange i := + InfiniteGalois.fixedField_fixingSubgroup + (AlgHom.fieldRange i) + let phiF : F ≃ₐ[K] F₀ := + (i.equivFieldRange).trans + (IntermediateField.equivOfEq hfixed.symm) + let E₀ := + abstractRelativeFixedField K (SeparableClosure K) hJH + have hfixedE : + abstractFixedField K (SeparableClosure K) J₀ = + AlgHom.fieldRange j := + InfiniteGalois.fixedField_fixingSubgroup + (AlgHom.fieldRange j) + let phiE : E ≃+* E₀ := by + change + E ≃+* + abstractFixedField K (SeparableClosure K) J₀ + exact + ((j.equivFieldRange).trans + (IntermediateField.equivOfEq hfixedE.symm)).toRingEquiv + let q₀ := + abstractExtensionQuotientEquivGaloisGroup + K (SeparableClosure K) H₀ J₀ hJH hTargetNormal + let qE := + ambientEmbeddedExtensionQuotientEquivGaloisGroup + K F E j e + let aF0 : F₀ˣ := + Units.mapEquiv phiF.toMulEquiv a + let xF0 : F₀ˣ := + Units.mapEquiv phiF.toMulEquiv x + have hnormClass0 : + normClass F₀ E₀ aF0 = + normClass F₀ E₀ xF0 := by + exact + normClass_mapEquiv F E F₀ E₀ + phiF.toRingEquiv phiE + (by + apply RingHom.ext + intro y + rfl) + a x h + have hambientSame : + abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H₀ J₀ hJH (Additive.ofMul aF0) = + abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H₀ J₀ hJH (Additive.ofMul xF0) := + abstractFixedFieldNormResidueSymbol_eq_of_normClass_eq + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H₀ J₀ hJH aF0 xF0 hnormClass0 + change + qE.abelianizationCongr + (q₀.abelianizationCongr.symm + (Additive.toMul + (abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H₀ J₀ hJH (Additive.ofMul aF0)))) = + qE.abelianizationCongr + (q₀.abelianizationCongr.symm + (Additive.toMul + (abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H₀ J₀ hJH (Additive.ofMul xF0)))) + rw [hambientSame] + +/-- For an embedded finite abelian local extension, the abelian local Artin +map agrees pointwise with the ambient norm-residue element transported through +a separable-closure equivalence. -/ +theorem + abelianLocalArtin_eq_ambientEmbeddedNormResidueSymbol_of_equiv + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsAbelianGalois F E] + (j : E →ₐ[K] SeparableClosure K) + (e : ambientEmbeddedSeparableClosureEquiv K F E j) + (a : Fˣ) : + abelianLocalArtinMonoidHom F E a = + ambientEmbeddedNormResidueElement K F E j e a := by + obtain ⟨x, hxLocal, hxAmbient⟩ := + exists_localArtin_ambientEmbedded_prime K F E j e + (localArtinMonoidHom F E a) + let i := + j.comp (IsScalarTower.toAlgHom K F E) + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun y => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + have hnormClass : + normClass F E a = normClass F E x := by + apply + (concreteReciprocityEquivOfEmbedding + F E jI + (localResidueDatum F) + (localHenselianValuation F) + (separableClosureUnits_isClassFormation F)).symm.injective + change + concreteNormResidueSymbolOfEmbedding + F E jI + (localResidueDatum F) + (localHenselianValuation F) + (separableClosureUnits_isClassFormation F) a = + concreteNormResidueSymbolOfEmbedding + F E jI + (localResidueDatum F) + (localHenselianValuation F) + (separableClosureUnits_isClassFormation F) x + have ha := + DFunLike.congr_fun + (localArtinMonoidHom_eq_of_embedding F E jI) a + have hx := + DFunLike.congr_fun + (localArtinMonoidHom_eq_of_embedding F E jI) x + rw [← ha, ← hx] + exact hxLocal.symm + have hxNormResidue := + ambientEmbeddedNormResidueAbelianElement_eq_of_normClass_eq + K F E j e a x hnormClass + change + (Abelianization.equivOfComm (H := Gal(E/F))).symm + (localArtinMonoidHom F E a) = + (Abelianization.equivOfComm (H := Gal(E/F))).symm + (ambientEmbeddedNormResidueAbelianElement K F E j e a) + apply congrArg (Abelianization.equivOfComm (H := Gal(E/F))).symm + calc + localArtinMonoidHom F E a = + ambientEmbeddedNormResidueAbelianElement K F E j e x := + hxAmbient.symm + _ = ambientEmbeddedNormResidueAbelianElement K F E j e a := + hxNormResidue.symm + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean new file mode 100644 index 0000000000..4668203dcc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean @@ -0,0 +1,696 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport +/-! +# Valuation-one units and abstract prime norm-residue transport + +This module transports valuation-one units and norm classes through +compatible field equivalences, and evaluates abstract fixed-field +norm-residue symbols on transported prime norms. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open scoped ValuativeRel + +/-- A valuation-subring-preserving ring equivalence carries some unit of +valuation one to a unit of valuation one. -/ +theorem exists_valuationOne_unit_of_ringEquiv + (L M : Type) + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Field M] [ValuativeRel M] [TopologicalSpace M] + [IsNonarchimedeanLocalField M] + (phi : L ≃+* M) + (hmem : ∀ x : L, + x ∈ (ValuativeRel.valuation L).valuationSubring ↔ + phi x ∈ (ValuativeRel.valuation M).valuationSubring) : + ∃ p : Lˣ, + IsNonarchimedeanLocalField.valuationMap L + (Additive.ofMul p) = 1 ∧ + IsNonarchimedeanLocalField.valuationMap M + (Additive.ofMul + (Units.mapEquiv phi.toMulEquiv p)) = 1 := by + let r : 𝒪[L] ≃+* 𝒪[M] := { + toFun := fun x => + ⟨phi (x : L), (hmem (x : L)).1 x.property⟩ + invFun := fun y => + ⟨phi.symm (y : M), (hmem (phi.symm (y : M))).2 (by + rw [phi.apply_symm_apply] + exact y.property)⟩ + left_inv := fun x => by + ext + simp + right_inv := fun y => by + ext + simp + map_mul' := fun x y => by + ext + simp + map_add' := fun x y => by + ext + simp } + let piOL : 𝒪[L] := + chosenIntegerRingUniformizer L + have hpiOL : Irreducible piOL := + chosenIntegerRingUniformizer_irreducible L + let piOM : 𝒪[M] := r piOL + have hpiOM : Irreducible piOM := + (MulEquiv.irreducible_iff r.toMulEquiv).2 hpiOL + let uL : Lˣ := + integerRingUniformizerFieldUnit L + let uM : Mˣ := + Units.mapEquiv phi.toMulEquiv uL + let pL : Lˣ := uL⁻¹ + let pM : Mˣ := + Units.mapEquiv phi.toMulEquiv pL + have huL : + (uL : L) = ((piOL : 𝒪[L]) : L) := rfl + have huM : + (uM : M) = ((piOM : 𝒪[M]) : M) := rfl + have hpM : pM = uM⁻¹ := by + simp [pM, pL, uM] + have hpLvalue : + IsNonarchimedeanLocalField.valuationMap L + (Additive.ofMul pL) = 1 := by + exact + v_integerRingIrreducibleFieldUnit_inv + L piOL hpiOL uL huL + have hpMvalue : + IsNonarchimedeanLocalField.valuationMap M + (Additive.ofMul pM) = 1 := by + rw [hpM] + exact + v_integerRingIrreducibleFieldUnit_inv + M piOM hpiOM uM huM + exact ⟨pL, hpLvalue, hpMvalue⟩ + +/-- A chosen valuation-one unit whose image under a valuation-compatible +ring equivalence also has valuation one. -/ +noncomputable def chosenValuationOneUnitOfRingEquiv + (L M : Type) + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Field M] [ValuativeRel M] [TopologicalSpace M] + [IsNonarchimedeanLocalField M] + (phi : L ≃+* M) + (hmem : ∀ x : L, + x ∈ (ValuativeRel.valuation L).valuationSubring ↔ + phi x ∈ (ValuativeRel.valuation M).valuationSubring) : + Lˣ := + Classical.choose + (exists_valuationOne_unit_of_ringEquiv L M phi hmem) + +/-- The chosen transported unit has valuation one in its source field. -/ +theorem chosenValuationOneUnitOfRingEquiv_source + (L M : Type) + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Field M] [ValuativeRel M] [TopologicalSpace M] + [IsNonarchimedeanLocalField M] + (phi : L ≃+* M) + (hmem : ∀ x : L, + x ∈ (ValuativeRel.valuation L).valuationSubring ↔ + phi x ∈ (ValuativeRel.valuation M).valuationSubring) : + IsNonarchimedeanLocalField.valuationMap L + (Additive.ofMul + (chosenValuationOneUnitOfRingEquiv L M phi hmem)) = 1 := + (Classical.choose_spec + (exists_valuationOne_unit_of_ringEquiv L M phi hmem)).1 + +/-- The image of the chosen transported unit has valuation one in the +target field. -/ +theorem chosenValuationOneUnitOfRingEquiv_target + (L M : Type) + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Field M] [ValuativeRel M] [TopologicalSpace M] + [IsNonarchimedeanLocalField M] + (phi : L ≃+* M) + (hmem : ∀ x : L, + x ∈ (ValuativeRel.valuation L).valuationSubring ↔ + phi x ∈ (ValuativeRel.valuation M).valuationSubring) : + IsNonarchimedeanLocalField.valuationMap M + (Additive.ofMul + (Units.mapEquiv phi.toMulEquiv + (chosenValuationOneUnitOfRingEquiv L M phi hmem))) = 1 := + (Classical.choose_spec + (exists_valuationOne_unit_of_ringEquiv L M phi hmem)).2 + +/-- Compatible ring equivalences between finite extensions preserve +valuation-subring membership when their separable-closure transport preserves +the local valuation subrings. -/ +theorem valuationSubring_mem_iff_of_separableClosureRingEquiv + (F K L M : Type) + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [Algebra F L] + [FiniteDimensional F L] [Algebra.IsSeparable F L] + [Valuation.HasExtension + (ValuativeRel.valuation F) (ValuativeRel.valuation L)] + [Field M] [ValuativeRel M] [Algebra K M] + [FiniteDimensional K M] [Algebra.IsSeparable K M] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation M)] + (jL : L →ₐ[F] SeparableClosure F) + (jM : M →ₐ[K] SeparableClosure K) + (psi : SeparableClosure F ≃+* SeparableClosure K) + (hpsi : + localSeparableValuationSubring F = + (localSeparableValuationSubring K).comap psi.toRingHom) + (phi : L ≃+* M) + (hphi : ∀ x : L, jM (phi x) = psi (jL x)) + (x : L) : + x ∈ (ValuativeRel.valuation L).valuationSubring ↔ + phi x ∈ (ValuativeRel.valuation M).valuationSubring := by + have hsourceRing : + (localSeparableValuationSubring F).comap jL.toRingHom = + (ValuativeRel.valuation L).valuationSubring := + localSeparableValuationSubring_comap_embedding F L jL + have htargetRing : + (localSeparableValuationSubring K).comap jM.toRingHom = + (ValuativeRel.valuation M).valuationSubring := + localSeparableValuationSubring_comap_embedding K M jM + rw [← hsourceRing, ← htargetRing] + change + jL x ∈ localSeparableValuationSubring F ↔ + jM (phi x) ∈ localSeparableValuationSubring K + rw [hphi x, hpsi] + rfl + +/-- Field norms on units commute with compatible ring equivalences of the +base and extension fields. -/ +theorem normUnits_mapEquiv + (F E F₀ E₀ : Type) + [Field F] [Field E] [Field F₀] [Field E₀] + [Algebra F E] [Algebra F₀ E₀] + (phiF : F ≃+* F₀) (phiE : E ≃+* E₀) + (hcomm : + RingHom.comp (algebraMap F₀ E₀) phiF.toRingHom = + RingHom.comp phiE.toRingHom (algebraMap F E)) + (y : Eˣ) : + normUnits F₀ E₀ (Units.mapEquiv phiE.toMulEquiv y) = + Units.mapEquiv phiF.toMulEquiv (normUnits F E y) := by + apply Units.ext + change + Algebra.norm F₀ (phiE (y : E)) = + phiF (Algebra.norm F (y : E)) + have hnorm := + Algebra.norm_eq_of_equiv_equiv + phiF phiE hcomm (y : E) + apply phiF.symm.injective + rw [phiF.symm_apply_apply] + exact hnorm.symm + +/-- Compatible ring equivalences preserve equality of unit norm classes. -/ +theorem normClass_mapEquiv + (F E F₀ E₀ : Type) + [Field F] [Field E] [Field F₀] [Field E₀] + [Algebra F E] [Algebra F₀ E₀] + (phiF : F ≃+* F₀) (phiE : E ≃+* E₀) + (hcomm : + RingHom.comp (algebraMap F₀ E₀) phiF.toRingHom = + RingHom.comp phiE.toRingHom (algebraMap F E)) + (a x : Fˣ) + (h : normClass F E a = normClass F E x) : + normClass F₀ E₀ (Units.mapEquiv phiF.toMulEquiv a) = + normClass F₀ E₀ + (Units.mapEquiv phiF.toMulEquiv x) := by + rw [normClass_eq_iff_exists_norm_div] at h ⊢ + rcases h with ⟨y, hy⟩ + refine ⟨Units.mapEquiv phiE.toMulEquiv y, ?_⟩ + have hnorm := + normUnits_mapEquiv F E F₀ E₀ phiF phiE hcomm y + rw [← map_div, hy] + exact hnorm.symm + +/-- A unit of valuation one in an abstract fixed field determines a prime +element for the ambient local henselian valuation datum. -/ +theorem + localHenselianValuation_isPrimeElement_abstractFixedField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) : + let L := + abstractFixedField K (SeparableClosure K) H.field + letI : FiniteDimensional K L := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField L := + finiteExtensionSpectralNormedField K L + letI : ValuativeRel L := + finiteExtensionSpectralValuativeRel K L + letI : IsNonarchimedeanLocalField L := + finiteExtensionSpectralIsNonarchimedeanLocalField K L + ∀ p : Lˣ, + IsNonarchimedeanLocalField.valuationMap L + (Additive.ofMul p) = 1 → + (localHenselianValuation K).IsPrimeElement H + (abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H.field + (Additive.ofMul p)) := by + dsimp only + intro p hp + change (localHenselianValuation K).valuationAt H + (abstractFixedFieldUnitsEquivGaloisFixed K (SeparableClosure K) H.field + (Additive.ofMul p)) = + (localHenselianValuation K).oneValue + apply Subtype.ext + change + ((((localHenselianValuation K).valuationAt H + (abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H.field (Additive.ofMul p)) : + (localHenselianValuation K).valueGroup) : ZHat)) = 1 + rw [localHenselianValuation_valuationAt_abstractFixedField K H p] + rw [hp] + simp + +/-- Under the canonical fixed-field unit identifications, the abstract +relative norm from an intrinsic fixed field is the ordinary field norm on +units. -/ +theorem + relativeNorm_intrinsicAbstractBase_abstractFixedFieldUnit + (F : Type) [Field F] + (S : ClosedSubgroup Gal(SeparableClosure F/F)) + (hSB : S.toSubgroup ≤ (intrinsicAbstractBase F).toSubgroup) + [Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup (intrinsicAbstractBase F) S hSB)] + [FiniteDimensional F + (abstractFixedField F (SeparableClosure F) S)] + (p : (abstractFixedField F (SeparableClosure F) S)ˣ) : + relativeNorm (intrinsicAbsoluteUnits F) + (intrinsicAbstractBase F) S hSB + (abstractFixedFieldUnitsEquivGaloisFixed + F (SeparableClosure F) S (Additive.ofMul p)) = + baseUnitsEquivGaloisAmbientFixed F (SeparableClosure F) + (Additive.ofMul + (normUnits F + (abstractFixedField F (SeparableClosure F) S) p)) := by + let L := + abstractFixedField F (SeparableClosure F) S + let S' := + closedFixingSubgroup F (SeparableClosure F) L + let hS'B : S'.toSubgroup ≤ + (intrinsicAbstractBase F).toSubgroup := + fixingSubgroupLeBase F (SeparableClosure F) L + have hS'S : S' = S := by + exact closedFixingSubgroup_abstractFixedField_eq + F (SeparableClosure F) S + let pi' : ambientFixedAddSubgroup + (intrinsicAbsoluteUnits F) S' := + intermediateFieldUnitsEquivGaloisFixed + F (SeparableClosure F) L (Additive.ofMul p) + let pi : ambientFixedAddSubgroup + (intrinsicAbsoluteUnits F) S := + abstractFixedFieldUnitsEquivGaloisFixed + F (SeparableClosure F) S (Additive.ofMul p) + let _hS'Finite : Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) S' hS'B) := + inferInstance + have hpiCoe : pi'.1 = pi.1 := by + rfl + have htransportCoe := + relativeNorm_coe_eq_of_closedSubgroup_eq + (intrinsicAbsoluteUnits F) + (intrinsicAbstractBase F) (intrinsicAbstractBase F) + S' S hS'B hSB rfl hS'S pi' pi hpiCoe + have htransport : + relativeNorm (intrinsicAbsoluteUnits F) + (intrinsicAbstractBase F) S' hS'B pi' = + relativeNorm (intrinsicAbsoluteUnits F) + (intrinsicAbstractBase F) S hSB pi := by + apply Subtype.ext + exact htransportCoe + have hnorm := + relativeNorm_intermediateFieldUnit_of_isSeparable + F (SeparableClosure F) L p + change + relativeNorm (intrinsicAbsoluteUnits F) + (intrinsicAbstractBase F) S' hS'B pi' = + baseUnitsEquivGaloisAmbientFixed F (SeparableClosure F) + (Additive.ofMul (normUnits F L p)) at hnorm + exact htransport.symm.trans hnorm + +/-- Translating an abstract relative fixed-field unit through the fixed-field +unit equivalences sends its abstract relative norm to its ordinary field norm. -/ +theorem + relativeNorm_preimage_abstractRelativeFixedFieldUnit + (K : Type) [Field K] + (H L : ClosedSubgroup Gal(SeparableClosure K/K)) + (hLH : L.toSubgroup ≤ H.toSubgroup) + [Finite + (H.toSubgroup ⧸ extensionSubgroup H L hLH)] + [Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H (le_baseField H))] + (p : (abstractRelativeFixedField + K (SeparableClosure K) hLH)ˣ) + (x : (abstractFixedField K (SeparableClosure K) H)ˣ) + (hnorm : + normUnits + (abstractFixedField K (SeparableClosure K) H) + (abstractRelativeFixedField K (SeparableClosure K) hLH) + p = + x) : + Additive.toMul + ((abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H).symm + (relativeNorm + (galoisAmbientUnitsRep K (SeparableClosure K)) + H L hLH + (abstractRelativeFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H L hLH + (Additive.ofMul p)))) = + x := by + have hrelative : + relativeNorm + (galoisAmbientUnitsRep K (SeparableClosure K)) + H L hLH + (abstractRelativeFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H L hLH + (Additive.ofMul p)) = + abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H + (Additive.ofMul x) := by + rw [relativeNorm_abstractFixedFieldUnit_eq_normUnits] + rw [hnorm] + apply Additive.ofMul.injective + change + (abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H).symm + (relativeNorm + (galoisAmbientUnitsRep K (SeparableClosure K)) + H L hLH + (abstractRelativeFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H L hLH + (Additive.ofMul p))) = + Additive.ofMul x + rw [hrelative, + (abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H).symm_apply_apply] + +/-- Evaluates the abstract fixed-field norm-residue symbol on the norm of a +prime element as the abelianized restriction of its Frobenius element. -/ +theorem + abstractFixedFieldNormResidueSymbol_eq_of_primeNorm + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup + Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : + (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ + extensionSubgroup H.field J hJH)] + (sigma : + (localResidueDatum K).FrobeniusElements + (H.toFiniteResidueAbstractField (localResidueDatum K)) + J hJH) : + let S := + (localResidueDatum K).frobeniusFixedField + (H.toFiniteResidueAbstractField (localResidueDatum K)) + J hJH sigma + let hSH := + (localResidueDatum K).frobeniusFixedField_le + (H.toFiniteResidueAbstractField (localResidueDatum K)) + J hJH sigma + let hSabsolute := + (localResidueDatum K).frobeniusFixedField_absoluteFinite + H J hJH sigma + ∀ (p : (abstractRelativeFixedField + K (SeparableClosure K) hSH)ˣ) + (x : (abstractFixedField + K (SeparableClosure K) H.field)ˣ), + (localHenselianValuation K).IsPrimeElement + ⟨S, hSabsolute⟩ + (abstractRelativeFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H.field S hSH + (Additive.ofMul p)) → + normUnits + (abstractFixedField K (SeparableClosure K) H.field) + (abstractRelativeFixedField K (SeparableClosure K) hSH) + p = + x → + abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H.field J hJH (Additive.ofMul x) = + Additive.ofMul + ((abstractExtensionQuotientEquivGaloisGroup + K (SeparableClosure K) H.field J hJH hJnormal + ).abelianizationCongr + (Abelianization.of + ((localResidueDatum K).frobeniusRestriction + (H.toFiniteResidueAbstractField (localResidueDatum K)) + J hJH sigma))) := by + dsimp only + intro p x hprime hnorm + let hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H.field (le_baseField H.field)) := + H.finite + let S := + (localResidueDatum K).frobeniusFixedField + (H.toFiniteResidueAbstractField (localResidueDatum K)) + J hJH sigma + let hSH := + (localResidueDatum K).frobeniusFixedField_le + (H.toFiniteResidueAbstractField (localResidueDatum K)) + J hJH sigma + let hSabsolute := + (localResidueDatum K).frobeniusFixedField_absoluteFinite + H J hJH sigma + let hSfinite : Finite + (H.field.toSubgroup ⧸ + extensionSubgroup H.field S hSH) := + (localResidueDatum K).frobeniusFixedField_finite + (H.toFiniteResidueAbstractField (localResidueDatum K)) + J hJH sigma + let SigmaS : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨S, hSabsolute⟩ + let pi : ambientFixedAddSubgroup + (galoisAmbientUnitsRep K (SeparableClosure K)) S := + abstractRelativeFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H.field S hSH + (Additive.ofMul p) + let qAmbient := + (localResidueDatum K).frobeniusRestriction + (H.toFiniteResidueAbstractField (localResidueDatum K)) + J hJH sigma + let qH := + abstractExtensionQuotientEquivGaloisGroup + K (SeparableClosure K) H.field J hJH hJnormal + have hx : + Additive.toMul + ((abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H.field).symm + (relativeNorm + (galoisAmbientUnitsRep K (SeparableClosure K)) + H.field S hSH pi)) = + x := by + exact + relativeNorm_preimage_abstractRelativeFixedFieldUnit + K H.field S hSH p x hnorm + have hsymbol := + abstractFixedFieldNormResidueSymbol_apply_primeNorm + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H.field J hJH qAmbient sigma rfl pi hprime + change + abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H.field J hJH + (Additive.ofMul + (Additive.toMul + ((abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H.field).symm + (relativeNorm + (galoisAmbientUnitsRep K (SeparableClosure K)) + H.field S hSH pi)))) = + Additive.ofMul + (qH.abelianizationCongr + (Abelianization.of qAmbient)) at hsymbol + rw [hx] at hsymbol + exact hsymbol + +/-- Transporting a valuation-one unit and its norm through compatible ring +equivalences evaluates the ambient fixed-field norm-residue symbol at the +associated Frobenius restriction. -/ +theorem + abstractFixedFieldNormResidueSymbol_eq_of_transportedValuationOneUnit + (K F L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [Field L] [Algebra F L] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup + Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : + (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ + extensionSubgroup H.field J hJH)] + (sigma : + (localResidueDatum K).FrobeniusElements + (H.toFiniteResidueAbstractField (localResidueDatum K)) + J hJH) : + let S := + (localResidueDatum K).frobeniusFixedField + (H.toFiniteResidueAbstractField (localResidueDatum K)) + J hJH sigma + let hSH := + (localResidueDatum K).frobeniusFixedField_le + (H.toFiniteResidueAbstractField (localResidueDatum K)) + J hJH sigma + let hSabsolute := + (localResidueDatum K).frobeniusFixedField_absoluteFinite + H J hJH sigma + let LH := + abstractRelativeFixedField K (SeparableClosure K) hSH + let F₀ := + abstractFixedField K (SeparableClosure K) H.field + ∀ [_hLHNorm : NontriviallyNormedField LH] + [_hLHVal : ValuativeRel LH] + [_hLHLocal : IsNonarchimedeanLocalField LH] + [_hF₀LHFinite : FiniteDimensional F₀ LH] + (phiF : F ≃+* F₀) (phi : L ≃+* LH) + (_hcomm : + RingHom.comp (algebraMap F₀ LH) phiF.toRingHom = + RingHom.comp phi.toRingHom (algebraMap F L)) + (hmem : ∀ y : L, + y ∈ (ValuativeRel.valuation L).valuationSubring ↔ + phi y ∈ (ValuativeRel.valuation LH).valuationSubring) + (_hprime : + (localHenselianValuation K).IsPrimeElement + ⟨S, hSabsolute⟩ + (abstractRelativeFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H.field S hSH + (Additive.ofMul + (Units.mapEquiv phi.toMulEquiv + (chosenValuationOneUnitOfRingEquiv + L LH phi hmem))))), + abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H.field J hJH + (Additive.ofMul + (Units.mapEquiv phiF.toMulEquiv + (normUnits F L + (chosenValuationOneUnitOfRingEquiv + L LH phi hmem)))) = + Additive.ofMul + ((abstractExtensionQuotientEquivGaloisGroup + K (SeparableClosure K) H.field J hJH hJnormal + ).abelianizationCongr + (Abelianization.of + ((localResidueDatum K).frobeniusRestriction + (H.toFiniteResidueAbstractField (localResidueDatum K)) + J hJH sigma))) := by + dsimp only + intro _hLHNorm _hLHVal _hLHLocal _hF₀LHFinite + phiF phi hcomm hmem hprime + let S := + (localResidueDatum K).frobeniusFixedField + (H.toFiniteResidueAbstractField (localResidueDatum K)) + J hJH sigma + let hSH := + (localResidueDatum K).frobeniusFixedField_le + (H.toFiniteResidueAbstractField (localResidueDatum K)) + J hJH sigma + let hSabsolute := + (localResidueDatum K).frobeniusFixedField_absoluteFinite + H J hJH sigma + let LH := + abstractRelativeFixedField K (SeparableClosure K) hSH + let F₀ := + abstractFixedField K (SeparableClosure K) H.field + let pF := + chosenValuationOneUnitOfRingEquiv L + (abstractRelativeFixedField K (SeparableClosure K) + ((localResidueDatum K).frobeniusFixedField_le + (H.toFiniteResidueAbstractField (localResidueDatum K)) + J hJH sigma)) + phi hmem + let pH := + Units.mapEquiv phi.toMulEquiv pF + let SigmaH : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨(localResidueDatum K).frobeniusFixedField + (H.toFiniteResidueAbstractField (localResidueDatum K)) + J hJH sigma, + (localResidueDatum K).frobeniusFixedField_absoluteFinite + H J hJH sigma⟩ + let piH := + abstractRelativeFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H.field SigmaH.field + ((localResidueDatum K).frobeniusFixedField_le + (H.toFiniteResidueAbstractField (localResidueDatum K)) + J hJH sigma) + (Additive.ofMul pH) + let xPrime0 := + Units.mapEquiv phiF.toMulEquiv (normUnits F L pF) + have hphiNorm : + normUnits + (abstractFixedField K (SeparableClosure K) H.field) + (abstractRelativeFixedField K (SeparableClosure K) + ((localResidueDatum K).frobeniusFixedField_le + (H.toFiniteResidueAbstractField (localResidueDatum K)) + J hJH sigma)) + pH = + xPrime0 := by + exact + normUnits_mapEquiv F L + (abstractFixedField K (SeparableClosure K) H.field) + (abstractRelativeFixedField K (SeparableClosure K) + ((localResidueDatum K).frobeniusFixedField_le + (H.toFiniteResidueAbstractField (localResidueDatum K)) + J hJH sigma)) + phiF phi hcomm pF + exact + abstractFixedFieldNormResidueSymbol_eq_of_primeNorm + K H J hJH sigma pH xPrime0 hprime hphiNorm + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeSymbolSetup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeSymbolSetup.lean new file mode 100644 index 0000000000..649f1e49fd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeSymbolSetup.lean @@ -0,0 +1,385 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitness +/-! +# Ambient prime symbol setup + +This module identifies the ambient norm-residue symbol of the chosen +prime witness with the Frobenius target transported back to the +original embedded Galois group. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open scoped ValuativeRel + +/-- The ambient fixed-field norm-residue value of the chosen prime +witness, transported to the original embedded Galois group. -/ +noncomputable def ambientEmbeddedPrimeTransportValue + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsAbelianGalois F E] + (j : E →ₐ[K] SeparableClosure K) + (e : ambientEmbeddedSeparableClosureEquiv K F E j) + (z : Abelianization Gal(E/F)) : + Abelianization Gal(E/F) := by + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + letI hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + letI hTargetFinite : Finite + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) := + ambientEmbeddedExtensionQuotient_finite K F E j e + letI hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let F₀ := + abstractFixedField K (SeparableClosure K) H₀ + let hfixed : + F₀ = AlgHom.fieldRange i := + InfiniteGalois.fixedField_fixingSubgroup + (AlgHom.fieldRange i) + let phiF : F ≃ₐ[K] F₀ := + (i.equivFieldRange).trans + (IntermediateField.equivOfEq hfixed.symm) + let q₀ := + abstractExtensionQuotientEquivGaloisGroup + K (SeparableClosure K) H₀ J₀ hJH hTargetNormal + let qE := + ambientEmbeddedExtensionQuotientEquivGaloisGroup + K F E j e + exact + qE.abelianizationCongr + (q₀.abelianizationCongr.symm + (Additive.toMul + (abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H₀ J₀ hJH + (Additive.ofMul + (Units.mapEquiv phiF.toMulEquiv + (ambientEmbeddedPrimeWitness K F E j e z)))))) + +/-- The fixed-field norm-residue symbol of the chosen prime witness is +the abelianized restriction of its ambient Frobenius lift. -/ +noncomputable def ambientEmbeddedPrimeSymbolProperty + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsAbelianGalois F E] + (j : E →ₐ[K] SeparableClosure K) + (e : ambientEmbeddedSeparableClosureEquiv K F E j) + (z : Abelianization Gal(E/F)) : Prop := by + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + letI _hSourceNormal : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).Normal := + EI.normal + letI hSourceFinite : Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) := + EI.finite + letI hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + letI hTargetFinite : Finite + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) := + ambientEmbeddedExtensionQuotient_finite K F E j e + letI hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, ambientEmbeddedAbsoluteQuotientFinite K F i⟩ + let F₀ := + abstractFixedField K (SeparableClosure K) H₀ + let hfixed : + F₀ = AlgHom.fieldRange i := + InfiniteGalois.fixedField_fixingSubgroup + (AlgHom.fieldRange i) + let phiF : F ≃ₐ[K] F₀ := + (i.equivFieldRange).trans + (IntermediateField.equivOfEq hfixed.symm) + let qF := + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + F E jI + let q₀ := + abstractExtensionQuotientEquivGaloisGroup + K (SeparableClosure K) H₀ J₀ hJH hTargetNormal + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + letI _hRFFinite : Finite + (RF.field.toSubgroup ⧸ + extensionSubgroup RF.field EI.field EI.below) := by + change Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) + exact hSourceFinite + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let zF : Abelianization EI.extensionQuotient := + qF.abelianizationCongr.symm z + let q := + Classical.choose (QuotientGroup.mk_surjective zF) + let sigma := + Classical.choose + ((localResidueDatum F).frobeniusRestriction_surjective + RF EI.field EI.below q) + let sigmaH := + intrinsicFrobeniusElementToAmbientEmbeddedField + K F E j e sigma + let qAmbient := + (localResidueDatum K).frobeniusRestriction + RH J₀ hJH sigmaH + exact + abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H₀ J₀ hJH + (Additive.ofMul + (Units.mapEquiv phiF.toMulEquiv + (ambientEmbeddedPrimeWitness K F E j e z))) = + Additive.ofMul + (q₀.abelianizationCongr + (Abelianization.of qAmbient)) + +/-- The explicit fixed-field symbol formula identifies the transported +prime value with its ambient Frobenius target. -/ +theorem + ambientEmbeddedPrimeTransportValue_eq_target_of_symbol + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsAbelianGalois F E] + (j : E →ₐ[K] SeparableClosure K) + (e : ambientEmbeddedSeparableClosureEquiv K F E j) + (z : Abelianization Gal(E/F)) : + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + letI _hSourceNormal : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).Normal := + EI.normal + letI hSourceFinite : Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) := + EI.finite + letI hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + letI hTargetFinite : Finite + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) := + ambientEmbeddedExtensionQuotient_finite K F E j e + letI hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, ambientEmbeddedAbsoluteQuotientFinite K F i⟩ + let F₀ := + abstractFixedField K (SeparableClosure K) H₀ + let hfixed : + F₀ = AlgHom.fieldRange i := + InfiniteGalois.fixedField_fixingSubgroup + (AlgHom.fieldRange i) + let phiF : F ≃ₐ[K] F₀ := + (i.equivFieldRange).trans + (IntermediateField.equivOfEq hfixed.symm) + let qF := + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + F E jI + let q₀ := + abstractExtensionQuotientEquivGaloisGroup + K (SeparableClosure K) H₀ J₀ hJH hTargetNormal + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + letI _hRFFinite : Finite + (RF.field.toSubgroup ⧸ + extensionSubgroup RF.field EI.field EI.below) := by + change Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) + exact hSourceFinite + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let zF : Abelianization EI.extensionQuotient := + qF.abelianizationCongr.symm z + let q := + Classical.choose (QuotientGroup.mk_surjective zF) + let sigma := + Classical.choose + ((localResidueDatum F).frobeniusRestriction_surjective + RF EI.field EI.below q) + let sigmaH := + intrinsicFrobeniusElementToAmbientEmbeddedField + K F E j e sigma + let qAmbient := + (localResidueDatum K).frobeniusRestriction + RH J₀ hJH sigmaH + ∀ (_hsymbol : + abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H₀ J₀ hJH + (Additive.ofMul + (Units.mapEquiv phiF.toMulEquiv + (ambientEmbeddedPrimeWitness K F E j e z))) = + Additive.ofMul + (q₀.abelianizationCongr + (Abelianization.of qAmbient))), + ambientEmbeddedPrimeTransportValue K F E j e z = + ambientEmbeddedPrimeTarget K F E j e z := by + dsimp only + intro hsymbol + let i := + j.comp (IsScalarTower.toAlgHom K F E) + let : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + let hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + exact + abelianizationCongr_symm_eq_primeTarget + _ _ _ _ hsymbol + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeTarget.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeTarget.lean new file mode 100644 index 0000000000..51b0897e6f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeTarget.lean @@ -0,0 +1,173 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeNormTransport +/-! +# Ambient Frobenius targets + +This module identifies the ambient abelianized Frobenius target associated with a chosen +intrinsic lift and proves its compatibility with quotient equivalences. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open scoped ValuativeRel + +/-- Transporting an identified abelianized prime value back through one +quotient equivalence and forward through another preserves its target. -/ +theorem abelianizationCongr_symm_eq_primeTarget + {Q₀ G₀ G : Type} + [Group Q₀] [Group G₀] [Group G] + (q₀ : Q₀ ≃* G₀) + (qE : Q₀ ≃* G) + (qAmbient : Q₀) + (r : Additive (Abelianization G₀)) + (hprime : + r = + Additive.ofMul + (q₀.abelianizationCongr + (Abelianization.of qAmbient))) : + qE.abelianizationCongr + (q₀.abelianizationCongr.symm + (Additive.toMul r)) = + qE.abelianizationCongr + (Abelianization.of qAmbient) := by + have hprimeMul := + congrArg Additive.toMul hprime + change + Additive.toMul r = + q₀.abelianizationCongr + (Abelianization.of qAmbient) at hprimeMul + calc + qE.abelianizationCongr + (q₀.abelianizationCongr.symm + (Additive.toMul r)) = + qE.abelianizationCongr + (q₀.abelianizationCongr.symm + (q₀.abelianizationCongr + (Abelianization.of qAmbient))) := + congrArg qE.abelianizationCongr + (congrArg q₀.abelianizationCongr.symm hprimeMul) + _ = qE.abelianizationCongr + (Abelianization.of qAmbient) := by + rw [q₀.abelianizationCongr.symm_apply_apply] + +/-- The ambient abelianized Frobenius target associated with the same +chosen intrinsic Frobenius lift as the prime witness. -/ +noncomputable def ambientEmbeddedPrimeTarget + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsAbelianGalois F E] + (j : E →ₐ[K] SeparableClosure K) + (e : ambientEmbeddedSeparableClosureEquiv K F E j) + (z : Abelianization Gal(E/F)) : + Abelianization Gal(E/F) := by + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + letI hSourceNormal : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).Normal := + EI.normal + letI hSourceFinite : Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) := + EI.finite + letI hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + letI hTargetFinite : Finite + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) := + ambientEmbeddedExtensionQuotient_finite K F E j e + letI hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, ambientEmbeddedAbsoluteQuotientFinite K F i⟩ + let qF := + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + F E jI + let qE := + ambientEmbeddedExtensionQuotientEquivGaloisGroup + K F E j e + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + letI _hRFFinite : Finite + (RF.field.toSubgroup ⧸ + extensionSubgroup RF.field EI.field EI.below) := by + change Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) + exact hSourceFinite + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let zF : Abelianization EI.extensionQuotient := + qF.abelianizationCongr.symm z + let q := + Classical.choose (QuotientGroup.mk_surjective zF) + let sigma := + Classical.choose + ((localResidueDatum F).frobeniusRestriction_surjective + RF EI.field EI.below q) + let sigmaH := + intrinsicFrobeniusElementToAmbientEmbeddedField + K F E j e sigma + let qAmbient := + (localResidueDatum K).frobeniusRestriction + RH J₀ hJH sigmaH + exact + qE.abelianizationCongr + (Abelianization.of qAmbient) + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.lean new file mode 100644 index 0000000000..59cfdf98f1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.lean @@ -0,0 +1,222 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeNormTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeTarget +/-! +# Ambient prime witnesses + +This module constructs a valuation-one prime witness for each abelianized Galois element +using the corresponding intrinsic Frobenius lift. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open scoped ValuativeRel + +/-- A prime-norm unit in the intrinsic base field chosen from a Frobenius +lift of an abelianized Galois element. -/ +noncomputable def ambientEmbeddedPrimeWitness + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsAbelianGalois F E] + (j : E →ₐ[K] SeparableClosure K) + (e : ambientEmbeddedSeparableClosureEquiv K F E j) + (z : Abelianization Gal(E/F)) : Fˣ := by + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + letI hSourceNormal : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).Normal := + EI.normal + letI hSourceFinite : Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) := + EI.finite + letI hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + letI hTargetFinite : Finite + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) := + ambientEmbeddedExtensionQuotient_finite K F E j e + letI hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, ambientEmbeddedAbsoluteQuotientFinite K F i⟩ + let qF := + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + F E jI + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + letI _hRFFinite : Finite + (RF.field.toSubgroup ⧸ + extensionSubgroup RF.field EI.field EI.below) := by + change Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) + exact hSourceFinite + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let zF : Abelianization EI.extensionQuotient := + qF.abelianizationCongr.symm z + let q := + Classical.choose (QuotientGroup.mk_surjective zF) + have hq := + Classical.choose_spec (QuotientGroup.mk_surjective zF) + let sigma := + Classical.choose + ((localResidueDatum F).frobeniusRestriction_surjective + RF EI.field EI.below q) + have hsigma := + Classical.choose_spec + ((localResidueDatum F).frobeniusRestriction_surjective + RF EI.field EI.below q) + let sigmaH := + intrinsicFrobeniusElementToAmbientEmbeddedField + K F E j e sigma + let SF := + (localResidueDatum F).frobeniusFixedField + RF EI.field EI.below sigma + let hSFabsolute := + (localResidueDatum F).frobeniusFixedField_absoluteFinite + (intrinsicFiniteAbstractBase F) EI.field EI.below sigma + let LF := + abstractFixedField F (SeparableClosure F) SF + let SH := + (localResidueDatum K).frobeniusFixedField + RH J₀ hJH sigmaH + let hSHH := + (localResidueDatum K).frobeniusFixedField_le + RH J₀ hJH sigmaH + let hSHabsolute := + (localResidueDatum K).frobeniusFixedField_absoluteFinite + H J₀ hJH sigmaH + let LH := + abstractRelativeFixedField K (SeparableClosure K) hSHH + let iLH : F →ₐ[K] LH := + i.codRestrict (LH.restrictScalars K).toSubalgebra (fun x => by + change i x ∈ IntermediateField.fixedField SH.toSubgroup + rw [IntermediateField.mem_fixedField_iff] + intro rho hrho + have hrhoH : rho ∈ H₀.toSubgroup := + hSHH hrho + change rho (i x) = i x + change + rho ∈ (AlgHom.fieldRange i).fixingSubgroup at hrhoH + rw [IntermediateField.mem_fixingSubgroup_iff] at hrhoH + exact hrhoH (i x) ⟨x, rfl⟩) + let phi : LF ≃+* LH := by + letI : Algebra F LH := iLH.toRingHom.toAlgebra + exact + (intrinsicFrobeniusFixedFieldEquivAmbientEmbeddedField + K F E j e sigma).toRingEquiv + have hphi (x : LF) : + ((phi x : LH) : SeparableClosure K) = + e (x : SeparableClosure F) := by + exact + intrinsicFrobeniusFixedFieldEquivAmbientEmbeddedField_apply_val + K F E j e sigma x + letI : FiniteDimensional F LF := + abstractFixedField_finiteDimensional + F (SeparableClosure F) SF hSFabsolute + letI : NontriviallyNormedField LF := + finiteExtensionSpectralNormedField F LF + letI : ValuativeRel LF := + finiteExtensionSpectralValuativeRel F LF + letI : IsNonarchimedeanLocalField LF := + finiteExtensionSpectralIsNonarchimedeanLocalField F LF + letI : Valuation.HasExtension + (ValuativeRel.valuation F) (ValuativeRel.valuation LF) := + finiteExtensionSpectralValuation_hasExtension F LF + letI : FiniteDimensional K LH := + abstractFixedField_finiteDimensional + K (SeparableClosure K) SH hSHabsolute + let iH : LH →ₐ[K] SeparableClosure K := + LH.val.restrictScalars K + letI : Algebra.IsSeparable K LH := by + let : IsScalarTower K LH (SeparableClosure K) := + IsScalarTower.of_algebraMap_eq' (by + apply RingHom.ext + intro x + exact (iH.commutes x).symm) + exact + Algebra.isSeparable_tower_bot_of_isSeparable + K LH (SeparableClosure K) + letI : NontriviallyNormedField LH := + finiteExtensionSpectralNormedField K LH + letI : ValuativeRel LH := + finiteExtensionSpectralValuativeRel K LH + letI : IsNonarchimedeanLocalField LH := + finiteExtensionSpectralIsNonarchimedeanLocalField K LH + letI : Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation LH) := + finiteExtensionSpectralValuation_hasExtension K LH + have hmem (x : LF) : + x ∈ (ValuativeRel.valuation LF).valuationSubring ↔ + phi x ∈ (ValuativeRel.valuation LH).valuationSubring := by + exact + valuationSubring_mem_iff_of_separableClosureRingEquiv + F K LF LH LF.val iH e.toRingEquiv + (localSeparableValuationSubring_eq_comap_finiteExtensionEquiv + K F i e) + phi hphi + x + let pF := + chosenValuationOneUnitOfRingEquiv LF LH phi hmem + exact normUnits F LF pF + + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean new file mode 100644 index 0000000000..e20babd9a3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean @@ -0,0 +1,642 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeSymbolSetup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityPrimeNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main +/-! +# Local and ambient comparison for prime witnesses + +The chosen ambient prime witness represents the prescribed abelianized +Galois element both under the concrete local Artin map and under the +ambient fixed-field norm-residue construction. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open scoped ValuativeRel + +/-- The chosen ambient prime witness maps to the prescribed abelianized +Galois element under the concrete local Artin map. -/ +theorem + ambientEmbeddedPrimeWitness_local + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsAbelianGalois F E] + (j : E →ₐ[K] SeparableClosure K) + (e : ambientEmbeddedSeparableClosureEquiv K F E j) + (z : Abelianization Gal(E/F)) : + localArtinMonoidHom F E + (ambientEmbeddedPrimeWitness K F E j e z) = + z := by + let i := + j.comp (IsScalarTower.toAlgHom K F E) + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + let hSourceNormal := EI.normal + let hSourceFinite := EI.finite + let hTargetNormal := ambientEmbeddedExtensionSubgroup_normal K F E j e + let hTargetFinite := ambientEmbeddedExtensionQuotient_finite K F E j e + let hHabsolute := ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, ambientEmbeddedAbsoluteQuotientFinite K F i⟩ + let qF := + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + F E jI + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let _hRFFinite := hSourceFinite + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let zF : Abelianization EI.extensionQuotient := + qF.abelianizationCongr.symm z + let q := + Classical.choose (QuotientGroup.mk_surjective zF) + have hq := + Classical.choose_spec (QuotientGroup.mk_surjective zF) + let sigma := + Classical.choose + ((localResidueDatum F).frobeniusRestriction_surjective + RF EI.field EI.below q) + have hsigma := + Classical.choose_spec + ((localResidueDatum F).frobeniusRestriction_surjective + RF EI.field EI.below q) + let sigmaH := + intrinsicFrobeniusElementToAmbientEmbeddedField + K F E j e sigma + let SF := + (localResidueDatum F).frobeniusFixedField + RF EI.field EI.below sigma + let hSFB := + (localResidueDatum F).frobeniusFixedField_le + RF EI.field EI.below sigma + let hSFabsolute := + (localResidueDatum F).frobeniusFixedField_absoluteFinite + (intrinsicFiniteAbstractBase F) EI.field EI.below sigma + let hSFfinite := + (localResidueDatum F).frobeniusFixedField_finite + RF EI.field EI.below sigma + let _hSFFinite : Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) SF hSFB) := by + change Finite + (RF.field.toSubgroup ⧸ + extensionSubgroup RF.field SF hSFB) + exact hSFfinite + let SigmaF : FiniteAbstractField + Gal(SeparableClosure F/F) := + ⟨SF, hSFabsolute⟩ + let LF := + abstractFixedField F (SeparableClosure F) SF + let SH := + (localResidueDatum K).frobeniusFixedField + RH J₀ hJH sigmaH + let hSHH := + (localResidueDatum K).frobeniusFixedField_le + RH J₀ hJH sigmaH + let hSHabsolute := + (localResidueDatum K).frobeniusFixedField_absoluteFinite + H J₀ hJH sigmaH + let LH := + abstractRelativeFixedField K (SeparableClosure K) hSHH + let iLH : F →ₐ[K] LH := + i.codRestrict (LH.restrictScalars K).toSubalgebra (fun x => by + change i x ∈ IntermediateField.fixedField SH.toSubgroup + rw [IntermediateField.mem_fixedField_iff] + intro rho hrho + have hrhoH : rho ∈ H₀.toSubgroup := + hSHH hrho + change rho (i x) = i x + change + rho ∈ (AlgHom.fieldRange i).fixingSubgroup at hrhoH + rw [IntermediateField.mem_fixingSubgroup_iff] at hrhoH + exact hrhoH (i x) ⟨x, rfl⟩) + let phi : LF ≃+* LH := by + letI : Algebra F LH := iLH.toRingHom.toAlgebra + exact + (intrinsicFrobeniusFixedFieldEquivAmbientEmbeddedField + K F E j e sigma).toRingEquiv + have hphi (x : LF) : + ((phi x : LH) : SeparableClosure K) = + e (x : SeparableClosure F) := by + exact + intrinsicFrobeniusFixedFieldEquivAmbientEmbeddedField_apply_val + K F E j e sigma x + let : FiniteDimensional F + (abstractFixedField F (SeparableClosure F) SF) := + abstractFixedField_finiteDimensional + F (SeparableClosure F) SF hSFabsolute + let : NontriviallyNormedField + (abstractFixedField F (SeparableClosure F) SF) := + finiteExtensionSpectralNormedField + F (abstractFixedField F (SeparableClosure F) SF) + let : ValuativeRel + (abstractFixedField F (SeparableClosure F) SF) := + finiteExtensionSpectralValuativeRel + F (abstractFixedField F (SeparableClosure F) SF) + let : IsNonarchimedeanLocalField + (abstractFixedField F (SeparableClosure F) SF) := + finiteExtensionSpectralIsNonarchimedeanLocalField + F (abstractFixedField F (SeparableClosure F) SF) + let : Valuation.HasExtension + (ValuativeRel.valuation F) + (ValuativeRel.valuation + (abstractFixedField F (SeparableClosure F) SF)) := + finiteExtensionSpectralValuation_hasExtension + F (abstractFixedField F (SeparableClosure F) SF) + let : FiniteDimensional K LH := + abstractFixedField_finiteDimensional + K (SeparableClosure K) SH hSHabsolute + let iH : LH →ₐ[K] SeparableClosure K := + LH.val.restrictScalars K + let : Algebra.IsSeparable K LH := by + let : IsScalarTower K LH (SeparableClosure K) := + IsScalarTower.of_algebraMap_eq' iH.comp_algebraMap.symm + exact + Algebra.isSeparable_tower_bot_of_isSeparable + K LH (SeparableClosure K) + let : NontriviallyNormedField LH := + finiteExtensionSpectralNormedField K LH + let : ValuativeRel LH := + finiteExtensionSpectralValuativeRel K LH + let : IsNonarchimedeanLocalField LH := + finiteExtensionSpectralIsNonarchimedeanLocalField K LH + let : Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation LH) := + finiteExtensionSpectralValuation_hasExtension K LH + have hmem (x : LF) : + x ∈ (ValuativeRel.valuation LF).valuationSubring ↔ + phi x ∈ (ValuativeRel.valuation LH).valuationSubring := + valuationSubring_mem_iff_of_separableClosureRingEquiv F K LF LH LF.val iH e.toRingEquiv + (localSeparableValuationSubring_eq_comap_finiteExtensionEquiv K F i e) phi hphi x + let pF := + chosenValuationOneUnitOfRingEquiv LF LH phi hmem + have hpFvalue := + chosenValuationOneUnitOfRingEquiv_source LF LH phi hmem + let piF : ambientFixedAddSubgroup + (intrinsicAbsoluteUnits F) SF := + abstractFixedFieldUnitsEquivGaloisFixed + F (SeparableClosure F) SF + (Additive.ofMul pF) + have hpiF : + (localHenselianValuation F).IsPrimeElement SigmaF piF := by + exact + localHenselianValuation_isPrimeElement_abstractFixedField + F SigmaF pF hpFvalue + let xPrime : Fˣ := + normUnits F LF pF + have hnormF : + relativeNorm (intrinsicAbsoluteUnits F) + (intrinsicAbstractBase F) SF hSFB piF = + baseUnitsEquivGaloisAmbientFixed F (SeparableClosure F) + (Additive.ofMul xPrime) := by + exact + relativeNorm_intrinsicAbstractBase_abstractFixedFieldUnit + F SF hSFB pF + have hconcretePrime := concreteNormResidueSymbolOfEmbedding_apply_primeNorm + F E jI (localResidueDatum F) (localHenselianValuation F) + (separableClosureUnits_isClassFormation F) q sigma hsigma piF hpiF xPrime + (by simpa only [RF, SF, hSFB] using hnormF.symm) + have hqz : qF.abelianizationCongr (Abelianization.of q) = z := + (congrArg qF.abelianizationCongr hq).trans (qF.abelianizationCongr.apply_symm_apply z) + have hxWitness : ambientEmbeddedPrimeWitness K F E j e z = xPrime := rfl + rw [hxWitness] + exact (DFunLike.congr_fun (localArtinMonoidHom_eq_of_embedding F E jI) xPrime).trans + (hconcretePrime.trans ((abelianizationCongr_of qF q).symm.trans hqz)) + +/-- The chosen prime witness satisfies the ambient fixed-field +norm-residue symbol formula. -/ +theorem + ambientEmbeddedPrimeWitness_symbol + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsAbelianGalois F E] + (j : E →ₐ[K] SeparableClosure K) + (e : ambientEmbeddedSeparableClosureEquiv K F E j) + (z : Abelianization Gal(E/F)) : + ambientEmbeddedPrimeSymbolProperty K F E j e z := by + let i := + j.comp (IsScalarTower.toAlgHom K F E) + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + let hSourceNormal := EI.normal + let hSourceFinite := EI.finite + let hTargetNormal := ambientEmbeddedExtensionSubgroup_normal K F E j e + let hTargetFinite := ambientEmbeddedExtensionQuotient_finite K F E j e + let hHabsolute := ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, ambientEmbeddedAbsoluteQuotientFinite K F i⟩ + let F₀ := + abstractFixedField K (SeparableClosure K) H₀ + have hfixed : + F₀ = AlgHom.fieldRange i := + InfiniteGalois.fixedField_fixingSubgroup + (AlgHom.fieldRange i) + let phiF : F ≃ₐ[K] F₀ := + (i.equivFieldRange).trans + (IntermediateField.equivOfEq hfixed.symm) + let qF := + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + F E jI + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let _hRFFinite := hSourceFinite + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let zF : Abelianization EI.extensionQuotient := + qF.abelianizationCongr.symm z + let q := + Classical.choose (QuotientGroup.mk_surjective zF) + let sigma := + Classical.choose + ((localResidueDatum F).frobeniusRestriction_surjective + RF EI.field EI.below q) + let sigmaH := + intrinsicFrobeniusElementToAmbientEmbeddedField + K F E j e sigma + let SF := + (localResidueDatum F).frobeniusFixedField + RF EI.field EI.below sigma + let hSFabsolute := + (localResidueDatum F).frobeniusFixedField_absoluteFinite + (intrinsicFiniteAbstractBase F) EI.field EI.below sigma + let LF := + abstractFixedField F (SeparableClosure F) SF + let SH := + (localResidueDatum K).frobeniusFixedField + RH J₀ hJH sigmaH + let hSHH := + (localResidueDatum K).frobeniusFixedField_le + RH J₀ hJH sigmaH + let hSHfinite := + (localResidueDatum K).frobeniusFixedField_finite + RH J₀ hJH sigmaH + let _hSHFinite := hSHfinite + let hSHabsolute := + (localResidueDatum K).frobeniusFixedField_absoluteFinite + H J₀ hJH sigmaH + let LH := + abstractRelativeFixedField K (SeparableClosure K) hSHH + let iLH : F →ₐ[K] LH := + i.codRestrict (LH.restrictScalars K).toSubalgebra (fun x => by + change i x ∈ IntermediateField.fixedField SH.toSubgroup + rw [IntermediateField.mem_fixedField_iff] + intro rho hrho + have hrhoH : rho ∈ H₀.toSubgroup := + hSHH hrho + change rho (i x) = i x + change + rho ∈ (AlgHom.fieldRange i).fixingSubgroup at hrhoH + rw [IntermediateField.mem_fixingSubgroup_iff] at hrhoH + exact hrhoH (i x) ⟨x, rfl⟩) + let phi : LF ≃+* LH := by + letI : Algebra F LH := iLH.toRingHom.toAlgebra + exact + (intrinsicFrobeniusFixedFieldEquivAmbientEmbeddedField + K F E j e sigma).toRingEquiv + have hphi (x : LF) : + ((phi x : LH) : SeparableClosure K) = + e (x : SeparableClosure F) := + intrinsicFrobeniusFixedFieldEquivAmbientEmbeddedField_apply_val K F E j e sigma x + have hphiComm : + RingHom.comp (algebraMap F₀ LH) phiF.toRingEquiv.toRingHom = + RingHom.comp phi.toRingHom + (algebraMap F LF) := by + let : Algebra F LH := iLH.toRingHom.toAlgebra + let phiAlg := + intrinsicFrobeniusFixedFieldEquivAmbientEmbeddedField + K F E j e sigma + apply RingHom.ext + intro x + change + algebraMap F₀ LH (phiF x) = + phiAlg (algebraMap F LF x) + calc + algebraMap F₀ LH (phiF x) = + algebraMap F LH x := by + apply LH.val.injective + rfl + _ = phiAlg (algebraMap F LF x) := + (phiAlg.commutes x).symm + let : FiniteDimensional F LF := + abstractFixedField_finiteDimensional + F (SeparableClosure F) SF hSFabsolute + let : NontriviallyNormedField LF := + finiteExtensionSpectralNormedField F LF + let : ValuativeRel LF := + finiteExtensionSpectralValuativeRel F LF + let : IsNonarchimedeanLocalField LF := + finiteExtensionSpectralIsNonarchimedeanLocalField F LF + let : Valuation.HasExtension + (ValuativeRel.valuation F) (ValuativeRel.valuation LF) := + finiteExtensionSpectralValuation_hasExtension F LF + let : FiniteDimensional K LH := + abstractFixedField_finiteDimensional + K (SeparableClosure K) SH hSHabsolute + let : FiniteDimensional K F₀ := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H₀ hHabsolute + let hF₀LHFinite : FiniteDimensional F₀ LH := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H₀ SH hSHH hHabsolute _hSHFinite + let iH : LH →ₐ[K] SeparableClosure K := + LH.val.restrictScalars K + let : Algebra.IsSeparable K LH := by + let : IsScalarTower K LH (SeparableClosure K) := + IsScalarTower.of_algebraMap_eq' iH.comp_algebraMap.symm + exact + Algebra.isSeparable_tower_bot_of_isSeparable + K LH (SeparableClosure K) + let hLHNorm : NontriviallyNormedField LH := + finiteExtensionSpectralNormedField K LH + let hLHVal : ValuativeRel LH := + finiteExtensionSpectralValuativeRel K LH + let hLHLocal : IsNonarchimedeanLocalField LH := + finiteExtensionSpectralIsNonarchimedeanLocalField K LH + let : Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation LH) := + finiteExtensionSpectralValuation_hasExtension K LH + have hmem (x : LF) : + x ∈ (ValuativeRel.valuation LF).valuationSubring ↔ + phi x ∈ (ValuativeRel.valuation LH).valuationSubring := + valuationSubring_mem_iff_of_separableClosureRingEquiv F K LF LH LF.val iH e.toRingEquiv + (localSeparableValuationSubring_eq_comap_finiteExtensionEquiv K F i e) phi hphi x + let pF := + chosenValuationOneUnitOfRingEquiv LF LH phi hmem + have hpHvalue := + chosenValuationOneUnitOfRingEquiv_target LF LH phi hmem + let pH : LHˣ := + Units.mapEquiv phi.toMulEquiv pF + change + IsNonarchimedeanLocalField.valuationMap LH + (Additive.ofMul pH) = 1 at hpHvalue + let SigmaH : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨SH, hSHabsolute⟩ + let piH : ambientFixedAddSubgroup + (galoisAmbientUnitsRep K (SeparableClosure K)) SH := + abstractRelativeFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H₀ SH hSHH + (Additive.ofMul pH) + have hpiH : + (localHenselianValuation K).IsPrimeElement SigmaH piH := by + exact + localHenselianValuation_isPrimeElement_abstractFixedField + K SigmaH pH hpHvalue + unfold ambientEmbeddedPrimeSymbolProperty + exact abstractFixedFieldNormResidueSymbol_eq_of_transportedValuationOneUnit + K F LF H J₀ hJH sigmaH (_hLHNorm := hLHNorm) (_hLHVal := hLHVal) + (_hLHLocal := hLHLocal) (_hF₀LHFinite := hF₀LHFinite) + phiF.toRingEquiv phi hphiComm hmem hpiH + +/-- The transported ambient symbol of the chosen prime witness equals +its ambient Frobenius target. -/ +theorem + ambientEmbeddedPrimeTransportValue_eq_target + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsAbelianGalois F E] + (j : E →ₐ[K] SeparableClosure K) + (e : ambientEmbeddedSeparableClosureEquiv K F E j) + (z : Abelianization Gal(E/F)) : + ambientEmbeddedPrimeTransportValue K F E j e z = + ambientEmbeddedPrimeTarget K F E j e z := by + have hsymbol := + ambientEmbeddedPrimeWitness_symbol K F E j e z + unfold ambientEmbeddedPrimeSymbolProperty at hsymbol + exact + (ambientEmbeddedPrimeTransportValue_eq_target_of_symbol + K F E j e z hsymbol) + +/-- The ambient Frobenius target recovers the original abelianized +Galois element. -/ +theorem + ambientEmbeddedPrimeTarget_eq + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsAbelianGalois F E] + (j : E →ₐ[K] SeparableClosure K) + (e : ambientEmbeddedSeparableClosureEquiv K F E j) + (z : Abelianization Gal(E/F)) : + ambientEmbeddedPrimeTarget K F E j e z = z := by + let i := + j.comp (IsScalarTower.toAlgHom K F E) + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + let hSourceNormal := EI.normal + let hSourceFinite := EI.finite + let hTargetNormal := ambientEmbeddedExtensionSubgroup_normal K F E j e + let hTargetFinite := ambientEmbeddedExtensionQuotient_finite K F E j e + let hHabsolute := ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, ambientEmbeddedAbsoluteQuotientFinite K F i⟩ + let qF := + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + F E jI + let qE := + ambientEmbeddedExtensionQuotientEquivGaloisGroup + K F E j e + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let _hRFFinite := hSourceFinite + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let zF : Abelianization EI.extensionQuotient := + qF.abelianizationCongr.symm z + let q := + Classical.choose (QuotientGroup.mk_surjective zF) + have hq := + Classical.choose_spec (QuotientGroup.mk_surjective zF) + let sigma := + Classical.choose + ((localResidueDatum F).frobeniusRestriction_surjective + RF EI.field EI.below q) + have hsigma := + Classical.choose_spec + ((localResidueDatum F).frobeniusRestriction_surjective + RF EI.field EI.below q) + let sigmaH := + intrinsicFrobeniusElementToAmbientEmbeddedField + K F E j e sigma + let qAmbient := + (localResidueDatum K).frobeniusRestriction + RH J₀ hJH sigmaH + have hrestriction : + qE qAmbient = qF q := by + calc + qE qAmbient = + qF ((localResidueDatum F).frobeniusRestriction + RF EI.field EI.below sigma) := + intrinsicFrobeniusRestriction_compatibility_ambientEmbeddedField + K F E j e sigma + _ = qF q := congrArg qF hsigma + have hqz : + qF.abelianizationCongr (Abelianization.of q) = z := by + calc + qF.abelianizationCongr (Abelianization.of q) = + qF.abelianizationCongr zF := + congrArg qF.abelianizationCongr hq + _ = z := + qF.abelianizationCongr.apply_symm_apply z + have htarget : + ambientEmbeddedPrimeTarget K F E j e z = + qE.abelianizationCongr + (Abelianization.of qAmbient) := by + rfl + rw [htarget] + calc + qE.abelianizationCongr + (Abelianization.of qAmbient) = + Abelianization.of (qE qAmbient) := + abelianizationCongr_of qE qAmbient + _ = Abelianization.of (qF q) := + congrArg Abelianization.of hrestriction + _ = qF.abelianizationCongr + (Abelianization.of q) := + (abelianizationCongr_of qF q).symm + _ = z := hqz + +/-- The ambient norm-residue value of the chosen prime witness is the +prescribed abelianized Galois element. -/ +theorem + ambientEmbeddedPrimeWitness_ambient + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsAbelianGalois F E] + (j : E →ₐ[K] SeparableClosure K) + (e : ambientEmbeddedSeparableClosureEquiv K F E j) + (z : Abelianization Gal(E/F)) : + ambientEmbeddedNormResidueAbelianElement K F E j e + (ambientEmbeddedPrimeWitness K F E j e z) = + z := by + calc + ambientEmbeddedNormResidueAbelianElement K F E j e + (ambientEmbeddedPrimeWitness K F E j e z) = + ambientEmbeddedPrimeTransportValue K F E j e z := rfl + _ = ambientEmbeddedPrimeTarget K F E j e z := + ambientEmbeddedPrimeTransportValue_eq_target K F E j e z + _ = z := + ambientEmbeddedPrimeTarget_eq K F E j e z + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison.lean new file mode 100644 index 0000000000..bf7bb762fe --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/All.lean new file mode 100644 index 0000000000..e6628e26ea --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/All.lean @@ -0,0 +1,20 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence +/-! +# Fixed-field base comparison + +This aggregate exposes the intrinsic-to-ambient base, extension, inertia, and +norm-quotient comparisons for finite fixed fields. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedExtensionQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedExtensionQuotient.lean new file mode 100644 index 0000000000..c03134d03b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedExtensionQuotient.lean @@ -0,0 +1,726 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence +/-! +# Embedded extension quotients + +This module identifies extension subgroups transported through an embedded finite Galois + extension and constructs the resulting ambient quotient equivalence with the actual Galois group. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open scoped ValuativeRel + +/-- Under the embedded-field base equivalence, membership in the intrinsic +extension subgroup for `E / F` is equivalent to membership in the ambient +extension subgroup determined by the two field ranges. -/ +theorem + intrinsicExtensionSubgroup_iff_ambientEmbeddedField + (K F E : Type) [Field K] [Field F] [Field E] + [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [FiniteDimensional F E] [IsGalois F E] + (j : E →ₐ[K] SeparableClosure K) : + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ (e : SeparableClosure F ≃ₐ[F] SeparableClosure K) + (tau : (intrinsicAbstractBase F).toSubgroup), + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + tau ∈ extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below ↔ + intrinsicBaseEquivAmbientEmbeddedField K F i e tau ∈ + extensionSubgroup H₀ J₀ hJH := by + dsimp only + let i := + j.comp (IsScalarTower.toAlgHom K F E) + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + intro e tau + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + change + tau.1 ∈ (AlgHom.fieldRange jI).fixingSubgroup ↔ + (intrinsicBaseEquivAmbientEmbeddedField + K F i e tau).1 ∈ + (AlgHom.fieldRange j).fixingSubgroup + rw [IntermediateField.mem_fixingSubgroup_iff, + IntermediateField.mem_fixingSubgroup_iff] + constructor + · intro htau x hx + obtain ⟨y, rfl⟩ := hx + change + (intrinsicBaseEquivAmbientEmbeddedField + K F i e tau).1.1 (j y) = j y + rw [ + intrinsicBaseEquivAmbientEmbeddedField_apply_val + K F i e tau] + change e (tau.1 (jI y)) = j y + rw [htau (jI y) ⟨y, rfl⟩] + exact e.apply_symm_apply (j y) + · intro hpsi x hx + obtain ⟨y, rfl⟩ := hx + apply e.injective + change + e (tau.1 (e.symm (j y))) = + e (e.symm (j y)) + rw [e.apply_symm_apply] + rw [← intrinsicBaseEquivAmbientEmbeddedField_apply_val + K F i e tau] + exact hpsi (j y) ⟨y, rfl⟩ + +/-- The embedded-field base equivalence maps the intrinsic extension subgroup +for `E / F` onto the ambient subgroup fixing the field range of `E`. -/ +theorem + map_intrinsicExtensionSubgroup_eq_ambientEmbeddedField + (K F E : Type) [Field K] [Field F] [Field E] + [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [FiniteDimensional F E] [IsGalois F E] + (j : E →ₐ[K] SeparableClosure K) : + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ e : SeparableClosure F ≃ₐ[F] SeparableClosure K, + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + let psi := + intrinsicBaseEquivAmbientEmbeddedField K F i e + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).map + psi.toMonoidHom = + extensionSubgroup H₀ J₀ hJH := by + dsimp only + let i := + j.comp (IsScalarTower.toAlgHom K F E) + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + intro e + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + have hRange : + AlgHom.fieldRange i ≤ AlgHom.fieldRange j := by + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + exact (AlgHom.fieldRange i).fixingSubgroup_le hRange + let psi := + intrinsicBaseEquivAmbientEmbeddedField K F i e + ext sigma + constructor + · rintro ⟨tau, htau, rfl⟩ + exact + (intrinsicExtensionSubgroup_iff_ambientEmbeddedField + K F E j e tau).1 htau + · intro hsigma + let tau : + (intrinsicAbstractBase F).toSubgroup := + psi.symm sigma + refine ⟨tau, ?_, psi.apply_symm_apply sigma⟩ + apply + (intrinsicExtensionSubgroup_iff_ambientEmbeddedField + K F E j e tau).2 + have htauImage : psi tau = sigma := + psi.apply_symm_apply sigma + rw [htauImage] + exact hsigma + +/-- The fixing subgroup cut out by an embedded finite Galois extension is +normal inside the fixing subgroup of its embedded base field. -/ +theorem ambientEmbeddedExtensionSubgroup_normal + (K F E : Type) [Field K] [Field F] [Field E] + [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [FiniteDimensional F E] [IsGalois F E] + (j : E →ₐ[K] SeparableClosure K) : + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ e : SeparableClosure F ≃ₐ[F] SeparableClosure K, + let _e := e + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + (extensionSubgroup H₀ J₀ hJH).Normal := by + dsimp only + let i := + j.comp (IsScalarTower.toAlgHom K F E) + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + intro e + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + have hRange : + AlgHom.fieldRange i ≤ AlgHom.fieldRange j := by + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + exact (AlgHom.fieldRange i).fixingSubgroup_le hRange + let psi := + intrinsicBaseEquivAmbientEmbeddedField K F i e + let hSourceNormal : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).Normal := + EI.normal + have hmap : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).map + psi.toMonoidHom = + extensionSubgroup H₀ J₀ hJH := by + simpa only [i, jF, jI, EI, H₀, J₀, hJH, psi] using + map_intrinsicExtensionSubgroup_eq_ambientEmbeddedField + K F E j e + rw [← hmap] + exact + Subgroup.Normal.map hSourceNormal + psi.toMonoidHom psi.surjective + +/-- The relative quotient of fixing subgroups attached to an embedded +finite Galois extension is finite. -/ +theorem ambientEmbeddedExtensionQuotient_finite + (K F E : Type) [Field K] [Field F] [Field E] + [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [FiniteDimensional F E] [IsGalois F E] + (j : E →ₐ[K] SeparableClosure K) : + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ e : SeparableClosure F ≃ₐ[F] SeparableClosure K, + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + letI _hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + Finite + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) := by + dsimp only + let i := + j.comp (IsScalarTower.toAlgHom K F E) + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + intro e + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + have hRange : + AlgHom.fieldRange i ≤ AlgHom.fieldRange j := by + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + exact (AlgHom.fieldRange i).fixingSubgroup_le hRange + let hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + let psi := + intrinsicBaseEquivAmbientEmbeddedField K F i e + let hSourceNormal : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).Normal := + EI.normal + let hSourceFinite : Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) := + EI.finite + have hmap : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).map + psi.toMonoidHom = + extensionSubgroup H₀ J₀ hJH := by + simpa only [i, jF, jI, EI, H₀, J₀, hJH, psi] using + map_intrinsicExtensionSubgroup_eq_ambientEmbeddedField + K F E j e + exact + Finite.of_equiv + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) + (QuotientGroup.congr + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) + (extensionSubgroup H₀ J₀ hJH) + psi hmap).toEquiv + +/-- The quotient of ambient fixing subgroups attached to an embedded +finite Galois extension is canonically its actual Galois group. -/ +noncomputable def + ambientEmbeddedExtensionQuotientEquivGaloisGroup + (K F E : Type) [Field K] [Field F] [Field E] + [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [FiniteDimensional F E] [IsGalois F E] + (j : E →ₐ[K] SeparableClosure K) : + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ e : SeparableClosure F ≃ₐ[F] SeparableClosure K, + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + letI hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) ≃* + Gal(E/F) := by + dsimp only + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + intro e + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + have hRange : + AlgHom.fieldRange i ≤ AlgHom.fieldRange j := by + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + exact (AlgHom.fieldRange i).fixingSubgroup_le hRange + let psi := + intrinsicBaseEquivAmbientEmbeddedField K F i e + letI hSourceNormal : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).Normal := + EI.normal + letI hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + have hmap : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).map + psi.toMonoidHom = + extensionSubgroup H₀ J₀ hJH := by + simpa only [i, jF, jI, EI, H₀, J₀, hJH, psi] using + map_intrinsicExtensionSubgroup_eq_ambientEmbeddedField + K F E j e + exact + (QuotientGroup.congr + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) + (extensionSubgroup H₀ J₀ hJH) + psi hmap).symm.trans + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + F E jI) + +/-- The ambient embedded quotient equivalence sends the class of a transported +intrinsic automorphism to its class in the finite Galois quotient. -/ +theorem + ambientEmbeddedExtensionQuotientEquivGaloisGroup_mk + (K F E : Type) [Field K] [Field F] [Field E] + [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [FiniteDimensional F E] [IsGalois F E] + (j : E →ₐ[K] SeparableClosure K) : + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ (e : SeparableClosure F ≃ₐ[F] SeparableClosure K) + (tau : (intrinsicAbstractBase F).toSubgroup), + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + letI _hSourceNormal : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).Normal := + EI.normal + letI _hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + ambientEmbeddedExtensionQuotientEquivGaloisGroup + K F E j e + (QuotientGroup.mk + (intrinsicBaseEquivAmbientEmbeddedField + K F i e tau)) = + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + F E jI (QuotientGroup.mk tau) := by + dsimp only + let i := + j.comp (IsScalarTower.toAlgHom K F E) + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + intro e tau + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + let hSourceNormal : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).Normal := + EI.normal + let hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + let psi := + intrinsicBaseEquivAmbientEmbeddedField K F i e + have hmap : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).map + psi.toMonoidHom = + extensionSubgroup H₀ J₀ hJH := by + simpa only [i, jF, jI, EI, H₀, J₀, hJH, psi] using + map_intrinsicExtensionSubgroup_eq_ambientEmbeddedField + K F E j e + change + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + F E jI + ((QuotientGroup.congr + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) + (extensionSubgroup H₀ J₀ hJH) + psi hmap).symm + (QuotientGroup.mk + (psi tau))) = + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + F E jI (QuotientGroup.mk tau) + congr 1 + change + QuotientGroup.mk + (psi.symm (psi tau)) = + QuotientGroup.mk tau + rw [psi.symm_apply_apply] + +/-- Evaluating the ambient embedded quotient class on an element of `E` +agrees, after applying the embedding, with the original ambient automorphism. -/ +theorem + ambientEmbeddedExtensionQuotientEquivGaloisGroup_mk_apply + (K F E : Type) [Field K] [Field F] [Field E] + [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [FiniteDimensional F E] [IsGalois F E] + (j : E →ₐ[K] SeparableClosure K) : + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ (e : SeparableClosure F ≃ₐ[F] SeparableClosure K) + (rho : + (closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i)).toSubgroup) + (x : E), + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro y hy + rcases hy with ⟨z, rfl⟩ + exact ⟨algebraMap F E z, rfl⟩ + letI _hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + j + (ambientEmbeddedExtensionQuotientEquivGaloisGroup + K F E j e (QuotientGroup.mk rho) x) = + rho.1.1 (j x) := by + dsimp only + let i := + j.comp (IsScalarTower.toAlgHom K F E) + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + intro e rho x + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun y => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + have hRange : + AlgHom.fieldRange i ≤ AlgHom.fieldRange j := by + intro y hy + rcases hy with ⟨z, rfl⟩ + exact ⟨algebraMap F E z, rfl⟩ + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + exact (AlgHom.fieldRange i).fixingSubgroup_le hRange + let hSourceNormal : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).Normal := + EI.normal + let hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + let psi := + intrinsicBaseEquivAmbientEmbeddedField K F i e + let tau : + (intrinsicAbstractBase F).toSubgroup := + psi.symm rho + have hpsi : psi tau = rho := + psi.apply_symm_apply rho + have hquotient : + ambientEmbeddedExtensionQuotientEquivGaloisGroup + K F E j e (QuotientGroup.mk rho) = + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + F E jI (QuotientGroup.mk tau) := by + rw [← hpsi] + exact + ambientEmbeddedExtensionQuotientEquivGaloisGroup_mk + K F E j e tau + rw [hquotient] + have haction := + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding_mk_apply + F E jI tau x + calc + j + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + F E jI (QuotientGroup.mk tau) x) = + e (tau.1 (jI x)) := by + rw [show + j + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + F E jI (QuotientGroup.mk tau) x) = + e + (jI + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + F E jI (QuotientGroup.mk tau) x)) by + change + j + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + F E jI (QuotientGroup.mk tau) x) = + e + (e.symm + (j + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + F E jI (QuotientGroup.mk tau) x))) + rw [e.apply_symm_apply]] + exact congrArg e haction + _ = (psi tau).1.1 (j x) := by + rw [intrinsicBaseEquivAmbientEmbeddedField_apply_val] + rfl + _ = rho.1.1 (j x) := by + rw [hpsi] + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedInertiaComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedInertiaComparison.lean new file mode 100644 index 0000000000..a333701a32 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedInertiaComparison.lean @@ -0,0 +1,286 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient +/-! +# Embedded inertia comparison + +This module transports extension inertia between an intrinsic finite extension and its + realization inside an ambient separable closure. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open scoped ValuativeRel + +/-- Under the embedded-field base equivalence, membership in intrinsic +extension inertia for `E / F` is equivalent to membership in the corresponding +ambient extension-inertia subgroup. -/ +theorem + intrinsicExtensionInertia_iff_ambientEmbeddedField + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsGalois F E] + (j : E →ₐ[K] SeparableClosure K) : + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ (e : SeparableClosure F ≃ₐ[F] SeparableClosure K) + (tau : (intrinsicAbstractBase F).toSubgroup), + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + tau ∈ (localResidueDatum F).extensionInertiaWithin + (intrinsicAbstractBase F) EI.field EI.below ↔ + intrinsicBaseEquivAmbientEmbeddedField K F i e tau ∈ + (localResidueDatum K).extensionInertiaWithin + H₀ J₀ hJH := by + dsimp only + let i := + j.comp (IsScalarTower.toAlgHom K F E) + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + intro e tau + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + have hRange : + AlgHom.fieldRange i ≤ AlgHom.fieldRange j := by + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + exact (AlgHom.fieldRange i).fixingSubgroup_le hRange + let hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, ambientEmbeddedAbsoluteQuotientFinite K F i⟩ + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let psi := + intrinsicBaseEquivAmbientEmbeddedField K F i e + let tauRF : RF.field.toSubgroup := + ⟨tau.1, tau.2⟩ + let psiTauRH : RH.field.toSubgroup := + ⟨(psi tau).1, (psi tau).2⟩ + have hdegree : + (localResidueDatum F).normalizedDegree RF tauRF = + (localResidueDatum K).normalizedDegree RH psiTauRH := by + simpa [RF, RH, psi, tauRF, psiTauRH] using + intrinsicBase_normalizedDegree_eq_ambientEmbeddedField + K F i e tau + change + (tau ∈ extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below ∧ + tau ∈ (localResidueDatum F).fieldInertiaWithin + (intrinsicAbstractBase F)) ↔ + (psi tau ∈ extensionSubgroup H₀ J₀ hJH ∧ + psi tau ∈ (localResidueDatum K).fieldInertiaWithin H₀) + constructor + · rintro ⟨htauExtension, htauInertia⟩ + refine + ⟨(intrinsicExtensionSubgroup_iff_ambientEmbeddedField + K F E j e tau).1 htauExtension, ?_⟩ + have htauRF : + tauRF ∈ + (localResidueDatum F).fieldInertiaWithin RF.field := by + exact htauInertia + have hnormalizedRF : + (localResidueDatum F).normalizedDegree RF tauRF = 1 := by + change + tauRF ∈ + ((localResidueDatum F).normalizedDegree RF).toMonoidHom.ker + rw [(localResidueDatum F).normalizedDegree_ker RF] + exact htauRF + have hnormalizedRH : + (localResidueDatum K).normalizedDegree RH psiTauRH = 1 := + hdegree.symm.trans hnormalizedRF + change + psiTauRH ∈ + (localResidueDatum K).fieldInertiaWithin RH.field + rw [← (localResidueDatum K).normalizedDegree_ker RH] + exact hnormalizedRH + · rintro ⟨hpsiExtension, hpsiInertia⟩ + refine + ⟨(intrinsicExtensionSubgroup_iff_ambientEmbeddedField + K F E j e tau).2 hpsiExtension, ?_⟩ + have hpsiTauRH : + psiTauRH ∈ + (localResidueDatum K).fieldInertiaWithin RH.field := by + exact hpsiInertia + have hnormalizedRH : + (localResidueDatum K).normalizedDegree RH psiTauRH = 1 := by + change + psiTauRH ∈ + ((localResidueDatum K).normalizedDegree RH).toMonoidHom.ker + rw [(localResidueDatum K).normalizedDegree_ker RH] + exact hpsiTauRH + have hnormalizedRF : + (localResidueDatum F).normalizedDegree RF tauRF = 1 := + hdegree.trans hnormalizedRH + change + tauRF ∈ + (localResidueDatum F).fieldInertiaWithin RF.field + rw [← (localResidueDatum F).normalizedDegree_ker RF] + exact hnormalizedRF + +/-- The embedded-field base equivalence maps the intrinsic extension-inertia +subgroup for `E / F` onto the corresponding ambient extension-inertia subgroup. -/ +theorem + map_intrinsicExtensionInertia_eq_ambientEmbeddedField + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsGalois F E] + (j : E →ₐ[K] SeparableClosure K) : + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ e : SeparableClosure F ≃ₐ[F] SeparableClosure K, + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + let psi := + intrinsicBaseEquivAmbientEmbeddedField K F i e + ((localResidueDatum F).extensionInertiaWithin + (intrinsicAbstractBase F) EI.field EI.below).map + psi.toMonoidHom = + (localResidueDatum K).extensionInertiaWithin + H₀ J₀ hJH := by + dsimp only + let i := + j.comp (IsScalarTower.toAlgHom K F E) + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + intro e + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + let psi := + intrinsicBaseEquivAmbientEmbeddedField K F i e + ext sigma + constructor + · rintro ⟨tau, htau, rfl⟩ + exact + (intrinsicExtensionInertia_iff_ambientEmbeddedField + K F E j e tau).1 htau + · intro hsigma + let tau : + (intrinsicAbstractBase F).toSubgroup := + psi.symm sigma + refine ⟨tau, ?_, psi.apply_symm_apply sigma⟩ + apply + (intrinsicExtensionInertia_iff_ambientEmbeddedField + K F E j e tau).2 + have htauImage : psi tau = sigma := + psi.apply_symm_apply sigma + rw [htauImage] + exact hsigma + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldNormQuotient.lean new file mode 100644 index 0000000000..66c4e8f684 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldNormQuotient.lean @@ -0,0 +1,530 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldNormResidueNaturality +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient +/-! +# Fixed-field norm quotients + +This module compares cohomological finite norm quotients with ordinary field-norm quotients and + records their compatibility with fixed-field norm-residue symbols. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open scoped ValuativeRel + +/-- The fixed-field units equivalence sends the cohomological finite norm +subgroup to the additive form of the ordinary field-norm subgroup. -/ +theorem map_fixedFieldFiniteNormSubgroup_eq_additiveNormSubgroup + (k Ω : Type) [Field k] [Field Ω] [Algebra k Ω] + [IsGalois k Ω] [IsSepClosed Ω] + (K L : ClosedSubgroup Gal(Ω/k)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [hKabsolute : Finite + ((baseField Gal(Ω/k)).toSubgroup ⧸ + extensionSubgroup (baseField Gal(Ω/k)) K + (le_baseField K))] : + (finiteNormSubgroup (galoisAmbientUnitsRep k Ω) K L hLK).map + (abstractFixedFieldUnitsEquivGaloisFixed + k Ω K).symm.toAddMonoidHom = + additiveNormSubgroup + (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK) := by + let F : IntermediateField k Ω := + abstractFixedField k Ω K + let E : IntermediateField F Ω := + abstractRelativeFixedField k Ω hLK + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + k Ω K L hLK hKabsolute hfinite + let e := abstractFixedFieldUnitsEquivGaloisFixed k Ω K + ext y + constructor + · rintro ⟨a, ha, rfl⟩ + rcases ha with ⟨b, rfl⟩ + let u : Eˣ := Additive.toMul + ((abstractRelativeFixedFieldUnitsEquivGaloisFixed + k Ω K L hLK).symm b) + have hb : + abstractRelativeFixedFieldUnitsEquivGaloisFixed + k Ω K L hLK (Additive.ofMul u) = b := by + change + abstractRelativeFixedFieldUnitsEquivGaloisFixed k Ω K L hLK + ((abstractRelativeFixedFieldUnitsEquivGaloisFixed + k Ω K L hLK).symm b) = b + exact + (abstractRelativeFixedFieldUnitsEquivGaloisFixed + k Ω K L hLK).apply_symm_apply b + rw [← hb, + relativeNorm_abstractFixedFieldUnit_eq_normUnits + k Ω K L hLK] + change e.symm + (e (Additive.ofMul (normUnits F E u))) ∈ additiveNormSubgroup F E + rw [e.symm_apply_apply] + exact ⟨u, rfl⟩ + · intro hy + change Additive.toMul y ∈ localNormSubgroup F E at hy + rcases hy with ⟨u, hu⟩ + refine + ⟨e (Additive.ofMul (normUnits F E u)), ?_, ?_⟩ + · refine + ⟨abstractRelativeFixedFieldUnitsEquivGaloisFixed + k Ω K L hLK (Additive.ofMul u), ?_⟩ + exact + relativeNorm_abstractFixedFieldUnit_eq_normUnits + k Ω K L hLK u + · change e.symm + (e (Additive.ofMul (normUnits F E u))) = y + rw [e.symm_apply_apply] + exact congrArg Additive.ofMul hu + +/-- The cohomological finite norm quotient for a pair of closed subgroups is +additively equivalent to the ordinary norm quotient of their fixed fields. -/ +noncomputable def fixedFieldFiniteNormQuotientEquivNormQuotient + (k Ω : Type) [Field k] [Field Ω] [Algebra k Ω] + [IsGalois k Ω] [IsSepClosed Ω] + (K L : ClosedSubgroup Gal(Ω/k)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [hKabsolute : Finite + ((baseField Gal(Ω/k)).toSubgroup ⧸ + extensionSubgroup (baseField Gal(Ω/k)) K + (le_baseField K))] : + FiniteNormQuotient (galoisAmbientUnitsRep k Ω) K L hLK ≃+ + Additive + (NormQuotient + (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK)) := by + let F : IntermediateField k Ω := + abstractFixedField k Ω K + let E : IntermediateField F Ω := + abstractRelativeFixedField k Ω hLK + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + k Ω K L hLK hKabsolute hfinite + let S := finiteNormSubgroup (galoisAmbientUnitsRep k Ω) K L hLK + let normAdd : Additive Fˣ →+ Additive (NormQuotient F E) := + MonoidHom.toAdditive (normClass F E) + let T := normAdd.ker + let e := abstractFixedFieldUnitsEquivGaloisFixed k Ω K + have hmap : S.map e.symm.toAddMonoidHom = T := by + simpa [S, T, normAdd, e] using + (map_fixedFieldFiniteNormSubgroup_eq_additiveNormSubgroup + k Ω K L hLK).trans + (additiveNormSubgroup_eq_ker_quotient_map F E) + have hforward : S ≤ AddSubgroup.comap e.symm.toAddMonoidHom T := by + intro x hx + change e.symm x ∈ T + rw [← hmap] + exact ⟨x, hx, rfl⟩ + have hinverse : T ≤ AddSubgroup.comap e.toAddMonoidHom S := by + intro y hy + change e y ∈ S + have hy' : y ∈ S.map e.symm.toAddMonoidHom := by + rw [hmap] + exact hy + rcases hy' with ⟨x, hx, hxy⟩ + have heq : e y = x := by + apply e.symm.injective + simpa using hxy.symm + rw [heq] + exact hx + let f : + (ambientFixedAddSubgroup (galoisAmbientUnitsRep k Ω) K ⧸ S) →+ + (Additive Fˣ ⧸ T) := + QuotientAddGroup.map S T e.symm.toAddMonoidHom hforward + let g : + (Additive Fˣ ⧸ T) →+ + (ambientFixedAddSubgroup (galoisAmbientUnitsRep k Ω) K ⧸ S) := + QuotientAddGroup.map T S e.toAddMonoidHom hinverse + let modelEquiv : + (ambientFixedAddSubgroup (galoisAmbientUnitsRep k Ω) K ⧸ S) ≃+ + (Additive Fˣ ⧸ T) := + { toFun := f + invFun := g + left_inv := by + intro q + refine QuotientAddGroup.induction_on q ?_ + intro x + change ↑(e (e.symm x)) = + (↑x : ambientFixedAddSubgroup + (galoisAmbientUnitsRep k Ω) K ⧸ S) + rw [e.apply_symm_apply] + right_inv := by + intro q + refine QuotientAddGroup.induction_on q ?_ + intro x + change ↑(e.symm (e x)) = (↑x : Additive Fˣ ⧸ T) + rw [e.symm_apply_apply] + map_add' := f.map_add } + let quotientEquiv : + (Additive Fˣ ⧸ T) ≃+ Additive (NormQuotient F E) := + QuotientAddGroup.quotientKerEquivOfSurjective normAdd + (QuotientGroup.mk'_surjective + (localNormSubgroup + (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK))) + exact + (finiteNormQuotientConcreteEquiv + (galoisAmbientUnitsRep k Ω) K L hLK).trans + (modelEquiv.trans quotientEquiv) + +/-- The fixed-field norm-quotient equivalence sends a cohomological finite norm +class to the ordinary norm class of the corresponding fixed-field unit. -/ +theorem fixedFieldFiniteNormQuotientEquivNormQuotient_finiteNormClass + (k Ω : Type) [Field k] [Field Ω] [Algebra k Ω] + [IsGalois k Ω] [IsSepClosed Ω] + (K L : ClosedSubgroup Gal(Ω/k)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [hKabsolute : Finite + ((baseField Gal(Ω/k)).toSubgroup ⧸ + extensionSubgroup (baseField Gal(Ω/k)) K + (le_baseField K))] + (a : ambientFixedAddSubgroup (galoisAmbientUnitsRep k Ω) K) : + fixedFieldFiniteNormQuotientEquivNormQuotient + k Ω K L hLK + (finiteNormClass (galoisAmbientUnitsRep k Ω) K L hLK a) = + MonoidHom.toAdditive + (normClass + (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK)) + ((abstractFixedFieldUnitsEquivGaloisFixed k Ω K).symm a) := by + let F : IntermediateField k Ω := + abstractFixedField k Ω K + let E : IntermediateField F Ω := + abstractRelativeFixedField k Ω hLK + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + k Ω K L hLK hKabsolute hfinite + let S := finiteNormSubgroup (galoisAmbientUnitsRep k Ω) K L hLK + let normAdd : Additive Fˣ →+ Additive (NormQuotient F E) := + MonoidHom.toAdditive (normClass F E) + let T := normAdd.ker + let e := abstractFixedFieldUnitsEquivGaloisFixed k Ω K + have hmap : S.map e.symm.toAddMonoidHom = T := by + simpa [S, T, normAdd, e] using + (map_fixedFieldFiniteNormSubgroup_eq_additiveNormSubgroup + k Ω K L hLK).trans + (additiveNormSubgroup_eq_ker_quotient_map F E) + have hforward : S ≤ AddSubgroup.comap e.symm.toAddMonoidHom T := by + intro x hx + change e.symm x ∈ T + rw [← hmap] + exact ⟨x, hx, rfl⟩ + simp only [fixedFieldFiniteNormQuotientEquivNormQuotient, + finiteNormQuotientConcreteEquiv_finiteNormClass, + AddEquiv.trans_apply, + QuotientAddGroup.quotientKerEquivOfSurjective, + QuotientAddGroup.quotientKerEquivOfRightInverse] + change QuotientAddGroup.kerLift normAdd + (QuotientAddGroup.map S T e.symm.toAddMonoidHom hforward + (QuotientAddGroup.mk' S a)) = + normAdd (e.symm a) + rw [QuotientAddGroup.map_mk', QuotientAddGroup.kerLift_mk] + rfl + +/-- The abstract fixed-field norm-residue symbol of the relative norm of a +prime element is the prescribed Frobenius quotient class. -/ +theorem abstractFixedFieldNormResidueSymbol_apply_primeNorm + (k Ω : Type) [Field k] [Field Ω] [Algebra k Ω] + [IsGalois k Ω] + (D : DegreeData Gal(Ω/k)) + (v : ValuationData D (galoisAmbientUnitsRep k Ω)) + (hcf : SatisfiesClassFieldAxiom + (galoisAmbientUnitsRep k Ω)) + (K L : ClosedSubgroup Gal(Ω/k)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup K L hLK).Normal] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [hKabsolute : Finite + ((baseField Gal(Ω/k)).toSubgroup ⧸ + extensionSubgroup (baseField Gal(Ω/k)) K + (le_baseField K))] + (q : K.toSubgroup ⧸ extensionSubgroup K L hLK) + (σ : D.FrobeniusElements + ((⟨K, hKabsolute⟩ : FiniteAbstractField + Gal(Ω/k)).toFiniteResidueAbstractField D) L hLK) + (hσ : D.frobeniusRestriction + ((⟨K, hKabsolute⟩ : FiniteAbstractField + Gal(Ω/k)).toFiniteResidueAbstractField D) L hLK σ = q) + (π : ambientFixedAddSubgroup (galoisAmbientUnitsRep k Ω) + (D.frobeniusFixedField + ((⟨K, hKabsolute⟩ : FiniteAbstractField + Gal(Ω/k)).toFiniteResidueAbstractField D) + L hLK σ)) + (hπ : + let KF : FiniteAbstractField Gal(Ω/k) := + ⟨K, hKabsolute⟩ + let KR := KF.toFiniteResidueAbstractField D + let S := D.frobeniusFixedField KR L hLK σ + let hSK := D.frobeniusFixedField_le KR L hLK σ + letI : Finite + (K.toSubgroup ⧸ extensionSubgroup K S hSK) := + D.frobeniusFixedField_finite KR L hLK σ + let Sigma : FiniteAbstractField Gal(Ω/k) := + ⟨S, D.frobeniusFixedField_absoluteFinite KF L hLK σ⟩ + v.IsPrimeElement Sigma π) : + let KF : FiniteAbstractField Gal(Ω/k) := + ⟨K, hKabsolute⟩ + let KR := KF.toFiniteResidueAbstractField D + let S := D.frobeniusFixedField KR L hLK σ + let hSK := D.frobeniusFixedField_le KR L hLK σ + letI : Finite + (K.toSubgroup ⧸ extensionSubgroup K S hSK) := + D.frobeniusFixedField_finite KR L hLK σ + let x : (abstractFixedField k Ω K)ˣ := + Additive.toMul + ((abstractFixedFieldUnitsEquivGaloisFixed k Ω K).symm + (relativeNorm (galoisAmbientUnitsRep k Ω) + K S hSK π)) + abstractFixedFieldNormResidueSymbol + k Ω D v hcf K L hLK (Additive.ofMul x) = + Additive.ofMul + ((abstractExtensionQuotientEquivGaloisGroup + k Ω K L hLK hnormal).abelianizationCongr + (Abelianization.of q)) := by + dsimp only + let KF : FiniteAbstractField Gal(Ω/k) := + ⟨K, hKabsolute⟩ + let E : FiniteGaloisSubextension KF.field := + ⟨L, hLK, hnormal, hfinite⟩ + let KR := KF.toFiniteResidueAbstractField D + let S := D.frobeniusFixedField KR L hLK σ + let hSK := D.frobeniusFixedField_le KR L hLK σ + let hSfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K S hSK) := + D.frobeniusFixedField_finite KR L hLK σ + let qGal := + abstractExtensionQuotientEquivGaloisGroup + k Ω K L hLK hnormal + let b := + abstractFixedFieldUnitsEquivGaloisFixed k Ω K + let a := + relativeNorm (galoisAmbientUnitsRep k Ω) K S hSK π + let x : (abstractFixedField k Ω K)ˣ := + Additive.toMul (b.symm a) + have hbase : b (Additive.ofMul x) = a := by + change b (b.symm a) = a + exact b.apply_symm_apply a + have hprime : + D.finiteReciprocityHom + (galoisAmbientUnitsRep k Ω) v + (v.classFieldAxiom_implies_unramifiedUnitCohomology hcf) + KF L hLK (Additive.ofMul q) = + finiteNormClass (galoisAmbientUnitsRep k Ω) + K L hLK a := by + simpa only [KF, KR, S, hSK, a] using + D.finiteReciprocityHom_apply_eq_primeNormClass + (galoisAmbientUnitsRep k Ω) v + (v.classFieldAxiom_implies_unramifiedUnitCohomology hcf) + KF L hLK (Additive.ofMul q) σ hσ π hπ + change + (MulEquiv.toAdditive qGal.abelianizationCongr) + (D.normResidueSymbol + (galoisAmbientUnitsRep k Ω) v hcf KF E + (finiteNormClass (galoisAmbientUnitsRep k Ω) + K L hLK (b (Additive.ofMul x)))) = + Additive.ofMul + (qGal.abelianizationCongr (Abelianization.of q)) + rw [hbase, ← hprime] + exact congrArg + (fun z : Additive (Abelianization E.extensionQuotient) => + MulEquiv.toAdditive qGal.abelianizationCongr z) + (D.normResidueSymbol_finiteReciprocityHom + (galoisAmbientUnitsRep k Ω) v hcf KF E + (show E.extensionQuotient from q)) + +/-- The abstract fixed-field norm-residue symbol depends only on the norm +class of the input unit. -/ +theorem abstractFixedFieldNormResidueSymbol_eq_of_normClass_eq + (k Ω : Type) [Field k] [Field Ω] [Algebra k Ω] + [IsGalois k Ω] [IsSepClosed Ω] + (D : DegreeData Gal(Ω/k)) + (v : ValuationData D (galoisAmbientUnitsRep k Ω)) + (hcf : SatisfiesClassFieldAxiom + (galoisAmbientUnitsRep k Ω)) + (K L : ClosedSubgroup Gal(Ω/k)) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup K L hLK).Normal] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [hKabsolute : Finite + ((baseField Gal(Ω/k)).toSubgroup ⧸ + extensionSubgroup (baseField Gal(Ω/k)) K + (le_baseField K))] + (x y : (abstractFixedField k Ω K)ˣ) + (hxy : + normClass (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK) x = + normClass (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK) y) : + abstractFixedFieldNormResidueSymbol + k Ω D v hcf K L hLK (Additive.ofMul x) = + abstractFixedFieldNormResidueSymbol + k Ω D v hcf K L hLK (Additive.ofMul y) := by + let F := abstractFixedField k Ω K + let E := abstractRelativeFixedField k Ω hLK + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + k Ω K L hLK hKabsolute hfinite + let b := + abstractFixedFieldUnitsEquivGaloisFixed k Ω K + have hfiniteClass : + finiteNormClass (galoisAmbientUnitsRep k Ω) + K L hLK (b (Additive.ofMul x)) = + finiteNormClass (galoisAmbientUnitsRep k Ω) + K L hLK (b (Additive.ofMul y)) := by + apply + (fixedFieldFiniteNormQuotientEquivNormQuotient + k Ω K L hLK).injective + rw [ + fixedFieldFiniteNormQuotientEquivNormQuotient_finiteNormClass, + fixedFieldFiniteNormQuotientEquivNormQuotient_finiteNormClass] + simpa [b, F, E] using congrArg Additive.ofMul hxy + change + (MulEquiv.toAdditive + (abstractExtensionQuotientEquivGaloisGroup + k Ω K L hLK hnormal).abelianizationCongr) + (D.normResidueSymbol + (galoisAmbientUnitsRep k Ω) v hcf + (⟨K, hKabsolute⟩ : FiniteAbstractField + Gal(Ω/k)) + (⟨L, hLK, hnormal, hfinite⟩ : + FiniteGaloisSubextension K) + (finiteNormClass (galoisAmbientUnitsRep k Ω) + K L hLK (b (Additive.ofMul x)))) = + (MulEquiv.toAdditive + (abstractExtensionQuotientEquivGaloisGroup + k Ω K L hLK hnormal).abelianizationCongr) + (D.normResidueSymbol + (galoisAmbientUnitsRep k Ω) v hcf + (⟨K, hKabsolute⟩ : FiniteAbstractField + Gal(Ω/k)) + (⟨L, hLK, hnormal, hfinite⟩ : + FiniteGaloisSubextension K) + (finiteNormClass (galoisAmbientUnitsRep k Ω) + K L hLK (b (Additive.ofMul y)))) + rw [hfiniteClass] + +/-- The ambient abstract quotient equivalence and the intrinsic finite-Galois +quotient equivalence agree on classes transported through a separable-closure +equivalence. -/ +theorem fixedFieldQuotientEquiv_mk_compatibility + (K : Type) [Field K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] : + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + ∀ (e : SeparableClosure F ≃ₐ[F] SeparableClosure K) + (τ : (intrinsicAbstractBase F).toSubgroup), + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let φ : + Gal(SeparableClosure F/F) ≃* + H.field.toSubgroup := + (AlgEquiv.autCongr e).trans + (abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H.field).symm + abstractExtensionQuotientEquivGaloisGroup + K (SeparableClosure K) H.field J hJH hJnormal + (QuotientGroup.mk (φ τ.1)) = + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + F E i (QuotientGroup.mk τ) := by + dsimp only + let F := abstractFixedField K (SeparableClosure K) H.field + let : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + intro e τ + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + let : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let φ : + Gal(SeparableClosure F/F) ≃* + H.field.toSubgroup := + (AlgEquiv.autCongr e).trans + (abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H.field).symm + let qH := + abstractExtensionQuotientEquivGaloisGroup + K (SeparableClosure K) H.field J hJH hJnormal + let qF := + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + F E i + apply AlgEquiv.ext + intro x + apply E.val.injective + have hφ : + abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H.field (φ τ.1) = + AlgEquiv.autCongr e τ.1 := + by + let A := + abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H.field + change A (A.symm (AlgEquiv.autCongr e τ.1)) = + AlgEquiv.autCongr e τ.1 + exact A.apply_symm_apply (AlgEquiv.autCongr e τ.1) + calc + E.val (qH (QuotientGroup.mk (φ τ.1)) x) = + (φ τ.1).1 (E.val x) := + (abstractExtensionQuotientEquivGaloisGroup_mk_apply_val + K (SeparableClosure K) H.field J hJH hJnormal + (φ τ.1) x).symm + _ = + abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H.field (φ τ.1) (E.val x) := by + exact + (abstractSubgroupEquivGaloisGroup_apply + K (SeparableClosure K) H.field (φ τ.1) (E.val x)).symm + _ = (AlgEquiv.autCongr e τ.1) (E.val x) := by + exact DFunLike.congr_fun hφ (E.val x) + _ = e (τ.1 (e.symm (E.val x))) := rfl + _ = e (τ.1 (i x)) := rfl + _ = e (i (qF (QuotientGroup.mk τ) x)) := by + exact congrArg e + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding_mk_apply + F E i τ x).symm + _ = E.val (qF (QuotientGroup.mk τ) x) := + e.apply_symm_apply (E.val (qF (QuotientGroup.mk τ) x)) + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldSpecialization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldSpecialization.lean new file mode 100644 index 0000000000..220a970a9f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldSpecialization.lean @@ -0,0 +1,328 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient +/-! +# Intrinsic fixed-field specialization + +This module specializes the embedded subgroup and inertia comparisons to actual finite fixed + fields and packages the intrinsic Frobenius quotient. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open scoped ValuativeRel + +private theorem mem_subgroup_iff_of_map_eq_of_ker_eq + {G H Q : Type*} [Group G] [Group H] [Group Q] + (f : G →* Q) (g : H →* Q) (I : Subgroup G) (J : Subgroup H) + (hf : f.ker = I) (hg : g.ker = J) (x : G) (y : H) + (hxy : f x = g y) : + x ∈ I ↔ y ∈ J := by + rw [← hf, ← hg, MonoidHom.mem_ker, MonoidHom.mem_ker, hxy] + +/-- Transport through a separable-closure equivalence identifies membership in +the intrinsic extension subgroup of a finite fixed-field extension with +membership in its ambient extension subgroup. -/ +theorem intrinsicExtensionSubgroup_iff_ambientFixedField + (K : Type) [Field K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] : + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + ∀ (e : SeparableClosure F ≃ₐ[F] SeparableClosure K) + (τ : (intrinsicAbstractBase F).toSubgroup), + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + let φ : + Gal(SeparableClosure F/F) ≃* + H.field.toSubgroup := + (AlgEquiv.autCongr e).trans + (abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H.field).symm + τ ∈ extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below ↔ + φ τ.1 ∈ extensionSubgroup H.field J hJH := by + dsimp only + let F := abstractFixedField K (SeparableClosure K) H.field + let : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + intro e τ + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + let : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + let φ : + Gal(SeparableClosure F/F) ≃* + H.field.toSubgroup := + (AlgEquiv.autCongr e).trans + (abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H.field).symm + let qH := + abstractExtensionQuotientEquivGaloisGroup + K (SeparableClosure K) H.field J hJH hJnormal + let qF := + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding F E i + have hcompat : + qH (QuotientGroup.mk (φ τ.1)) = + qF (QuotientGroup.mk τ) := + fixedFieldQuotientEquiv_mk_compatibility + K H J hJH e τ + constructor + · intro hτ + have hF : (QuotientGroup.mk τ : + (intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) = 1 := by + rw [QuotientGroup.eq_one_iff] + exact hτ + have hHimage : + qH (QuotientGroup.mk (φ τ.1)) = 1 := by + calc + qH (QuotientGroup.mk (φ τ.1)) = + qF (QuotientGroup.mk τ) := + hcompat + _ = qF 1 := congrArg qF hF + _ = 1 := map_one qF + have hHquotient : + (QuotientGroup.mk (φ τ.1) : + H.field.toSubgroup ⧸ + extensionSubgroup H.field J hJH) = 1 := by + apply qH.injective + exact hHimage.trans (map_one qH).symm + exact (QuotientGroup.eq_one_iff (φ τ.1)).1 hHquotient + · intro hφτ + have hHquotient : + (QuotientGroup.mk (φ τ.1) : + H.field.toSubgroup ⧸ + extensionSubgroup H.field J hJH) = 1 := by + rw [QuotientGroup.eq_one_iff] + exact hφτ + have hFimage : + qF (QuotientGroup.mk τ) = 1 := by + calc + qF (QuotientGroup.mk τ) = + qH (QuotientGroup.mk (φ τ.1)) := + hcompat.symm + _ = qH 1 := congrArg qH hHquotient + _ = 1 := map_one qH + have hFquotient : + (QuotientGroup.mk τ : + (intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) = 1 := by + apply qF.injective + exact hFimage.trans (map_one qF).symm + exact (QuotientGroup.eq_one_iff τ).1 hFquotient + +/-- Membership in intrinsic extension inertia is equivalent, under the +fixed-field base equivalence, to membership in the ambient extension inertia. -/ +theorem intrinsicExtensionInertia_iff_ambientFixedField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] : + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + ∀ (e : SeparableClosure F ≃ₐ[F] SeparableClosure K) + (τ : (intrinsicAbstractBase F).toSubgroup), + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + letI : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + letI : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + letI : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + let φ : + Gal(SeparableClosure F/F) ≃* + H.field.toSubgroup := + (AlgEquiv.autCongr e).trans + (abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H.field).symm + τ ∈ (localResidueDatum F).extensionInertiaWithin + (intrinsicAbstractBase F) EI.field EI.below ↔ + φ τ.1 ∈ (localResidueDatum K).extensionInertiaWithin + H.field J hJH := by + dsimp only + let F := abstractFixedField K (SeparableClosure K) H.field + let : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + intro e τ + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + let : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + let : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + let : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + let : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + let : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + let φ : + Gal(SeparableClosure F/F) ≃* + H.field.toSubgroup := + (AlgEquiv.autCongr e).trans + (abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H.field).symm + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let tauRF : RF.field.toSubgroup := + ⟨τ.1, τ.2⟩ + let phiTauRH : RH.field.toSubgroup := + ⟨(φ τ.1).1, (φ τ.1).2⟩ + have hRFker : + ((localResidueDatum F).normalizedDegree RF).toMonoidHom.ker = + (localResidueDatum F).fieldInertiaWithin RF.field := + (localResidueDatum F).normalizedDegree_ker RF + have hRHker : + ((localResidueDatum K).normalizedDegree RH).toMonoidHom.ker = + (localResidueDatum K).fieldInertiaWithin RH.field := + (localResidueDatum K).normalizedDegree_ker RH + have hdegree : + (localResidueDatum F).normalizedDegree RF tauRF = + (localResidueDatum K).normalizedDegree RH phiTauRH := by + simpa [RF, RH, φ, tauRF, phiTauRH] using + intrinsicBase_normalizedDegree_eq_ambientFixedField K H e τ + have hinertia : + tauRF ∈ (localResidueDatum F).fieldInertiaWithin RF.field ↔ + phiTauRH ∈ (localResidueDatum K).fieldInertiaWithin RH.field := + mem_subgroup_iff_of_map_eq_of_ker_eq + ((localResidueDatum F).normalizedDegree RF).toMonoidHom + ((localResidueDatum K).normalizedDegree RH).toMonoidHom + ((localResidueDatum F).fieldInertiaWithin RF.field) + ((localResidueDatum K).fieldInertiaWithin RH.field) + hRFker hRHker tauRF phiTauRH hdegree + change + (τ ∈ extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below ∧ + τ ∈ (localResidueDatum F).fieldInertiaWithin + (intrinsicAbstractBase F)) ↔ + (φ τ.1 ∈ extensionSubgroup H.field J hJH ∧ + φ τ.1 ∈ (localResidueDatum K).fieldInertiaWithin H.field) + constructor + · rintro ⟨hτextension, hτinertia⟩ + refine + ⟨(intrinsicExtensionSubgroup_iff_ambientFixedField + K H J hJH e τ).1 hτextension, ?_⟩ + exact hinertia.1 hτinertia + · rintro ⟨hφextension, hφinertia⟩ + refine + ⟨(intrinsicExtensionSubgroup_iff_ambientFixedField + K H J hJH e τ).2 hφextension, ?_⟩ + exact hinertia.2 hφinertia + +/-- The type of algebra equivalences from the intrinsic separable closure of a +finite fixed field to the ambient separable closure. -/ +abbrev intrinsicFixedFieldSeparableClosureEquiv + (K : Type) [Field K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) := + let F := abstractFixedField K (SeparableClosure K) H.field + @AlgEquiv F (SeparableClosure F) (SeparableClosure K) + _ _ _ + (separableClosure F (AlgebraicClosure F)).algebra + F.val.toRingHom.toAlgebra + +/-- The intrinsic base subgroup modulo extension inertia for a finite +fixed-field extension, using the chosen separable-closure equivalence. -/ +abbrev intrinsicFixedFieldFrobeniusQuotient + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] + (e : intrinsicFixedFieldSeparableClosureEquiv K H) := + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + letI : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + letI : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + letI : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + (intrinsicAbstractBase F).toSubgroup ⧸ + (localResidueDatum F).extensionInertiaWithin + (intrinsicAbstractBase F) EI.field EI.below + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/IntrinsicBaseEquivalence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/IntrinsicBaseEquivalence.lean new file mode 100644 index 0000000000..39e4033a7e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/IntrinsicBaseEquivalence.lean @@ -0,0 +1,652 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldLocalData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +/-! +# Intrinsic-to-ambient base equivalences + +This module compares the intrinsic absolute Galois base of a finite extension with its + realization as a fixing subgroup in an ambient separable closure. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open scoped ValuativeRel + +/-- The fixing subgroup of the image of a finite extension embedded in +`SeparableClosure K` has finite index in the ambient base-field subgroup. -/ +theorem ambientEmbeddedAbsoluteQuotientFinite + (K F : Type) [Field K] [Field F] + [Algebra K F] [FiniteDimensional K F] + (i : F →ₐ[K] SeparableClosure K) : + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let : FiniteDimensional K (AlgHom.fieldRange i) := + (AlgEquiv.ofInjectiveField i).toLinearEquiv.finiteDimensional + let G := Gal(SeparableClosure K/K) + let Bases := { B : ClosedSubgroup G // + H₀.toSubgroup ≤ B.toSubgroup } + let Bfix : Bases := + ⟨closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K)), + fixingSubgroupLeBase K (SeparableClosure K) + (AlgHom.fieldRange i)⟩ + let Bbase : Bases := + ⟨baseField G, le_baseField H₀⟩ + let Q : Bases → Type := fun B => + B.1.toSubgroup ⧸ extensionSubgroup B.1 H₀ B.2 + have hBase : Bfix = Bbase := by + apply Subtype.ext + exact closedFixingSubgroup_bot_eq_baseField + K (SeparableClosure K) + let : Finite (Q Bfix) := by + change Finite + ((closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))).toSubgroup ⧸ + extensionSubgroup + (closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))) + H₀ + (fixingSubgroupLeBase K (SeparableClosure K) + (AlgHom.fieldRange i))) + infer_instance + change Finite (Q Bbase) + exact Finite.of_equiv (Q Bfix) + (Equiv.cast (congrArg Q hBase)) + +/-- On the intrinsic base, the normalized degree from the local residue datum +agrees with the local residue degree of the underlying automorphism. -/ +theorem intrinsicBase_normalizedDegree_eq_localResidueDegree + (F : Type) [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + (τ : (intrinsicAbstractBase F).toSubgroup) : + (localResidueDatum F).normalizedDegree + ((intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F)) τ = + localResidueDegree F τ.1 := by + apply Multiplicative.ext + have h := + (localResidueDatum F).residueDegree_nsmul_normalizedDegree + ((intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F)) τ + rw [show + (((intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F)).residueDegree : ℕ) = 1 by + exact intrinsicFiniteAbstractBase_residueDegree_eq_one F] at h + simpa [localResidueDatum] using h + +/-- Transport along a separable-closure equivalence identifies the intrinsic +normalized degree over a finite fixed field with the ambient normalized degree. -/ +theorem intrinsicBase_normalizedDegree_eq_ambientFixedField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) : + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + ∀ (e : SeparableClosure F ≃ₐ[F] SeparableClosure K) + (τ : (intrinsicAbstractBase F).toSubgroup), + letI : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + letI : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + letI : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + (localResidueDatum F).normalizedDegree + ((intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F)) τ = + (localResidueDatum K).normalizedDegree + (H.toFiniteResidueAbstractField (localResidueDatum K)) + ((abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H.field).symm + (AlgEquiv.autCongr e τ.1)) := by + dsimp only + let F := abstractFixedField K (SeparableClosure K) H.field + let : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + intro e τ + let : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + let : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + let : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + let : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + rw [intrinsicBase_normalizedDegree_eq_localResidueDegree F τ] + exact + localResidueDegree_eq_normalizedDegree_abstractFixedFieldEquiv + K H e τ.1 + +/-- A separable-closure equivalence identifies the intrinsic base subgroup of a +finite fixed field with its defining subgroup in the ambient Galois group. -/ +noncomputable def intrinsicBaseEquivAmbientFixedField + (K : Type) [Field K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) : + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + (e : SeparableClosure F ≃ₐ[F] SeparableClosure K) → + (intrinsicAbstractBase F).toSubgroup ≃* + H.field.toSubgroup := by + dsimp only + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + intro e + let φ : + Gal(SeparableClosure F/F) ≃* + H.field.toSubgroup := + (AlgEquiv.autCongr e).trans + (abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H.field).symm + exact (intrinsicAbstractBaseEquivAbsolute F).trans φ + +/-- On underlying automorphisms, the intrinsic-to-ambient fixed-field +equivalence is conjugation followed by the standard fixed-field subgroup equivalence. -/ +@[simp] +theorem intrinsicBaseEquivAmbientFixedField_apply_val + (K : Type) [Field K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) : + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + ∀ (e : SeparableClosure F ≃ₐ[F] SeparableClosure K) + (τ : (intrinsicAbstractBase F).toSubgroup), + (intrinsicBaseEquivAmbientFixedField K H e τ).1 = + ((AlgEquiv.autCongr e).trans + (abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H.field).symm) τ.1 := by + dsimp only + rintro e τ + rfl + +/-- For an embedded finite separable extension, transport through a +separable-closure equivalence identifies its intrinsic base subgroup with the +ambient subgroup fixing the embedding's field range. -/ +noncomputable def + intrinsicBaseEquivAmbientEmbeddedField + (K F : Type) [Field K] [Field F] + [Algebra K F] [FiniteDimensional K F] + (i : F →ₐ[K] SeparableClosure K) : + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + (e : SeparableClosure F ≃ₐ[F] SeparableClosure K) → + (intrinsicAbstractBase F).toSubgroup ≃* + (closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i)).toSubgroup := by + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + intro e + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + letI hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, hHabsolute⟩ + let F₀ := + abstractFixedField K (SeparableClosure K) H₀ + letI : FiniteDimensional K F₀ := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H₀ hHabsolute + letI : Algebra.IsSeparable F₀ (SeparableClosure K) := + Algebra.isSeparable_tower_top_of_isSeparable + K F₀ (SeparableClosure K) + letI : IsSepClosure F₀ (SeparableClosure K) := + ⟨inferInstance, inferInstance⟩ + letI : Algebra F₀ (SeparableClosure F₀) := + (separableClosure F₀ (AlgebraicClosure F₀)).algebra + let e₀ : SeparableClosure F₀ ≃ₐ[F₀] SeparableClosure K := + IsSepClosure.equiv F₀ + (SeparableClosure F₀) (SeparableClosure K) + have hfixed : + F₀ = AlgHom.fieldRange i := + InfiniteGalois.fixedField_fixingSubgroup + (AlgHom.fieldRange i) + let phiAlg : F ≃ₐ[K] F₀ := + (i.equivFieldRange).trans + (IntermediateField.equivOfEq hfixed.symm) + let phi : F ≃+* F₀ := phiAlg.toRingEquiv + let c : SeparableClosure F ≃+* SeparableClosure F₀ := + e.toRingEquiv.trans e₀.symm.toRingEquiv + have hc (x : F) : + c (algebraMap F (SeparableClosure F) x) = + algebraMap F₀ (SeparableClosure F₀) (phi x) := by + change e₀.symm + (e (algebraMap F (SeparableClosure F) x)) = + algebraMap F₀ (SeparableClosure F₀) (phi x) + apply e₀.injective + rw [e₀.apply_symm_apply, e.commutes, e₀.commutes] + rfl + let theta : + Gal(SeparableClosure F/F) ≃* + Gal(SeparableClosure F₀/F₀) := { + toFun := fun sigma => + { c.symm.trans (sigma.toRingEquiv.trans c) with + commutes' := fun x => by + change c (sigma (c.symm + (algebraMap F₀ (SeparableClosure F₀) x))) = + algebraMap F₀ (SeparableClosure F₀) x + have hpre : + c.symm + (algebraMap F₀ (SeparableClosure F₀) x) = + algebraMap F (SeparableClosure F) (phi.symm x) := by + apply c.injective + rw [c.apply_symm_apply, hc, phi.apply_symm_apply] + rw [hpre, sigma.commutes, hc, phi.apply_symm_apply] } + invFun := fun tau => + { c.trans (tau.toRingEquiv.trans c.symm) with + commutes' := fun x => by + change c.symm (tau (c + (algebraMap F (SeparableClosure F) x))) = + algebraMap F (SeparableClosure F) x + rw [hc, tau.commutes] + apply c.injective + rw [c.apply_symm_apply, hc] } + left_inv := fun sigma => by + apply AlgEquiv.ext + intro x + change c.symm + (c (sigma (c.symm (c x)))) = sigma x + rw [c.symm_apply_apply, c.symm_apply_apply] + right_inv := fun tau => by + apply AlgEquiv.ext + intro x + change c + (c.symm (tau (c (c.symm x)))) = tau x + rw [c.apply_symm_apply, c.apply_symm_apply] + map_mul' := fun sigma tau => by + apply AlgEquiv.ext + intro x + change c (sigma (tau (c.symm x))) = + c (sigma (c.symm (c (tau (c.symm x))))) + rw [c.symm_apply_apply] } + let psi₀ := + intrinsicBaseEquivAmbientFixedField K H e₀ + exact + (intrinsicAbstractBaseEquivAbsolute F).trans + (theta.trans + ((intrinsicAbstractBaseEquivAbsolute F₀).symm.trans psi₀)) + +/-- The intrinsic-to-ambient equivalence is the fixed-field subgroup element +obtained by conjugating the intrinsic automorphism through the chosen +separable-closure equivalence. -/ +theorem + intrinsicBaseEquivAmbientEmbeddedField_apply + (K F : Type) [Field K] [Field F] + [Algebra K F] [FiniteDimensional K F] [Algebra.IsSeparable K F] + (i : F →ₐ[K] SeparableClosure K) : + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ (e : SeparableClosure F ≃ₐ[F] SeparableClosure K) + (tau : (intrinsicAbstractBase F).toSubgroup), + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + letI hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let _H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, hHabsolute⟩ + let F₀ := + abstractFixedField K (SeparableClosure K) H₀ + let hfixed : + F₀ = AlgHom.fieldRange i := + InfiniteGalois.fixedField_fixingSubgroup + (AlgHom.fieldRange i) + let phi : F ≃+* F₀ := + ((i.equivFieldRange).trans + (IntermediateField.equivOfEq hfixed.symm)).toRingEquiv + let rho : Gal(SeparableClosure K/F₀) := + { e.symm.toRingEquiv.trans + (tau.1.toRingEquiv.trans e.toRingEquiv) with + commutes' := fun x => by + change e (tau.1 (e.symm + (algebraMap F₀ (SeparableClosure K) x))) = + algebraMap F₀ (SeparableClosure K) x + have hpre : + e.symm + (algebraMap F₀ (SeparableClosure K) x) = + algebraMap F (SeparableClosure F) (phi.symm x) := by + apply e.injective + rw [e.apply_symm_apply, e.commutes] + change (x : SeparableClosure K) = + i (phi.symm x) + rw [← show + ((phi (phi.symm x) : F₀) : + SeparableClosure K) = + i (phi.symm x) by rfl, + phi.apply_symm_apply] + rw [hpre, tau.1.commutes, e.commutes] + change i (phi.symm x) = (x : SeparableClosure K) + rw [← show + ((phi (phi.symm x) : F₀) : + SeparableClosure K) = + i (phi.symm x) by rfl, + phi.apply_symm_apply] } + intrinsicBaseEquivAmbientEmbeddedField K F i e tau = + (abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H₀).symm rho := by + let : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + intro e tau + dsimp only + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, hHabsolute⟩ + let F₀ := + abstractFixedField K (SeparableClosure K) H₀ + let : FiniteDimensional K F₀ := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H₀ hHabsolute + let : Algebra.IsSeparable F₀ (SeparableClosure K) := + Algebra.isSeparable_tower_top_of_isSeparable + K F₀ (SeparableClosure K) + let : IsSepClosure F₀ (SeparableClosure K) := + ⟨inferInstance, inferInstance⟩ + let : Algebra F₀ (SeparableClosure F₀) := + (separableClosure F₀ (AlgebraicClosure F₀)).algebra + let e₀ : SeparableClosure F₀ ≃ₐ[F₀] SeparableClosure K := + IsSepClosure.equiv F₀ + (SeparableClosure F₀) (SeparableClosure K) + have hfixed : + F₀ = AlgHom.fieldRange i := + InfiniteGalois.fixedField_fixingSubgroup + (AlgHom.fieldRange i) + let phiAlg : F ≃ₐ[K] F₀ := + (i.equivFieldRange).trans + (IntermediateField.equivOfEq hfixed.symm) + let phi : F ≃+* F₀ := phiAlg.toRingEquiv + let c : SeparableClosure F ≃+* SeparableClosure F₀ := + e.toRingEquiv.trans e₀.symm.toRingEquiv + have hc (x : F) : + c (algebraMap F (SeparableClosure F) x) = + algebraMap F₀ (SeparableClosure F₀) (phi x) := by + change e₀.symm + (e (algebraMap F (SeparableClosure F) x)) = + algebraMap F₀ (SeparableClosure F₀) (phi x) + apply e₀.injective + rw [e₀.apply_symm_apply, e.commutes, e₀.commutes] + rfl + let thetaTau : Gal(SeparableClosure F₀/F₀) := + { c.symm.trans (tau.1.toRingEquiv.trans c) with + commutes' := fun x => by + change c (tau.1 (c.symm + (algebraMap F₀ (SeparableClosure F₀) x))) = + algebraMap F₀ (SeparableClosure F₀) x + have hpre : + c.symm + (algebraMap F₀ (SeparableClosure F₀) x) = + algebraMap F (SeparableClosure F) (phi.symm x) := by + apply c.injective + rw [c.apply_symm_apply, hc, phi.apply_symm_apply] + rw [hpre, tau.1.commutes, hc, phi.apply_symm_apply] } + let rho : Gal(SeparableClosure K/F₀) := + { e.symm.toRingEquiv.trans + (tau.1.toRingEquiv.trans e.toRingEquiv) with + commutes' := fun x => by + change e (tau.1 (e.symm + (algebraMap F₀ (SeparableClosure K) x))) = + algebraMap F₀ (SeparableClosure K) x + have hpre : + e.symm + (algebraMap F₀ (SeparableClosure K) x) = + algebraMap F (SeparableClosure F) (phi.symm x) := by + apply e.injective + rw [e.apply_symm_apply, e.commutes] + change (x : SeparableClosure K) = + i (phi.symm x) + rw [← show + ((phi (phi.symm x) : F₀) : + SeparableClosure K) = + i (phi.symm x) by rfl, + phi.apply_symm_apply] + rw [hpre, tau.1.commutes, e.commutes] + change i (phi.symm x) = (x : SeparableClosure K) + rw [← show + ((phi (phi.symm x) : F₀) : + SeparableClosure K) = + i (phi.symm x) by rfl, + phi.apply_symm_apply] } + have hrho : + AlgEquiv.autCongr e₀ thetaTau = rho := by + apply AlgEquiv.ext + intro x + simp only [AlgEquiv.autCongr_apply] + change + e₀ + (c (tau.1 (c.symm (e₀.symm x)))) = + e (tau.1 (e.symm x)) + rw [show c.symm (e₀.symm x) = e.symm x by + simp [c]] + change e₀ (e₀.symm (e (tau.1 (e.symm x)))) = + e (tau.1 (e.symm x)) + rw [e₀.apply_symm_apply] + change + intrinsicBaseEquivAmbientFixedField K H e₀ + ⟨thetaTau, by + rw [intrinsicAbstractBase, + closedFixingSubgroup_bot_eq_baseField] + trivial⟩ = + (abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H₀).symm rho + change + (abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H₀).symm + (AlgEquiv.autCongr e₀ thetaTau) = + (abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H₀).symm rho + rw [hrho] + +/-- The embedded-field base equivalence acts on the ambient separable closure +by conjugating the intrinsic automorphism through the chosen equivalence. -/ +theorem + intrinsicBaseEquivAmbientEmbeddedField_apply_val + (K F : Type) [Field K] [Field F] + [Algebra K F] [FiniteDimensional K F] [Algebra.IsSeparable K F] + (i : F →ₐ[K] SeparableClosure K) : + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ (e : SeparableClosure F ≃ₐ[F] SeparableClosure K) + (tau : (intrinsicAbstractBase F).toSubgroup) + (x : SeparableClosure K), + (intrinsicBaseEquivAmbientEmbeddedField + K F i e tau).1.1 x = + e (tau.1 (e.symm x)) := by + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + intro e tau x + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, hHabsolute⟩ + let F₀ := + abstractFixedField K (SeparableClosure K) H₀ + have hfixed : + F₀ = AlgHom.fieldRange i := + InfiniteGalois.fixedField_fixingSubgroup + (AlgHom.fieldRange i) + let phi : F ≃+* F₀ := + ((i.equivFieldRange).trans + (IntermediateField.equivOfEq hfixed.symm)).toRingEquiv + let rho : Gal(SeparableClosure K/F₀) := + { e.symm.toRingEquiv.trans + (tau.1.toRingEquiv.trans e.toRingEquiv) with + commutes' := fun y => by + change e (tau.1 (e.symm + (algebraMap F₀ (SeparableClosure K) y))) = + algebraMap F₀ (SeparableClosure K) y + have hpre : + e.symm + (algebraMap F₀ (SeparableClosure K) y) = + algebraMap F (SeparableClosure F) (phi.symm y) := by + apply e.injective + rw [e.apply_symm_apply, e.commutes] + change (y : SeparableClosure K) = + i (phi.symm y) + rw [← show + ((phi (phi.symm y) : F₀) : + SeparableClosure K) = + i (phi.symm y) by rfl, + phi.apply_symm_apply] + rw [hpre, tau.1.commutes, e.commutes] + change i (phi.symm y) = (y : SeparableClosure K) + rw [← show + ((phi (phi.symm y) : F₀) : + SeparableClosure K) = + i (phi.symm y) by rfl, + phi.apply_symm_apply] } + have happly := + intrinsicBaseEquivAmbientEmbeddedField_apply + K F i e tau + dsimp only at happly + rw [happly] + calc + ((abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H₀).symm rho).1.1 x = + abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H₀ + ((abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H₀).symm rho) x := rfl + _ = rho x := by + rw [(abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H₀).apply_symm_apply] + _ = e (tau.1 (e.symm x)) := rfl + +/-- The embedded-field base equivalence preserves normalized degree between +the intrinsic local residue datum and the ambient finite abstract field. -/ +theorem + intrinsicBase_normalizedDegree_eq_ambientEmbeddedField + (K F : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Algebra K F] [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + (i : F →ₐ[K] SeparableClosure K) : + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ (e : SeparableClosure F ≃ₐ[F] SeparableClosure K) + (tau : (intrinsicAbstractBase F).toSubgroup), + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + letI hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, hHabsolute⟩ + (localResidueDatum F).normalizedDegree + ((intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F)) tau = + (localResidueDatum K).normalizedDegree + (H.toFiniteResidueAbstractField (localResidueDatum K)) + (intrinsicBaseEquivAmbientEmbeddedField K F i e tau) := by + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + intro e tau + dsimp only + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, hHabsolute⟩ + rw [intrinsicBase_normalizedDegree_eq_localResidueDegree F tau] + have hdegree := + localResidueDegree_eq_normalizedDegree_finiteExtensionEquiv + K F i e tau.1 + have hpsi := + intrinsicBaseEquivAmbientEmbeddedField_apply + K F i e tau + dsimp only at hdegree hpsi + rw [hpsi] + exact hdegree + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean new file mode 100644 index 0000000000..c6184beb14 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport.Fields + +/-! +# Embedded Frobenius transport + +This facade preserves the import path for the subgroup transports and fixed-field equivalences. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Fields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Fields.lean new file mode 100644 index 0000000000..6bb65e0b2e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Fields.lean @@ -0,0 +1,393 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport.Groups + +/-! +# Embedded Frobenius fixed fields + +The transported Frobenius subgroups determine equivalent fixed fields. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open scoped ValuativeRel + +section EmbeddedFrobeniusTransport + +variable (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsGalois F E] + +/-- Restricting the ambient separable-closure equivalence gives an +`F`-algebra equivalence between the intrinsic and ambient Frobenius fixed +fields. -/ +noncomputable def + intrinsicFrobeniusFixedFieldEquivAmbientEmbeddedField + (j : E →ₐ[K] SeparableClosure K) : + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ e : SeparableClosure F ≃ₐ[F] SeparableClosure K, + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + letI _hSourceNormal : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).Normal := + EI.normal + letI _hSourceFinite : Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) := + EI.finite + letI _hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + letI _hTargetFinite : Finite + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) := + ambientEmbeddedExtensionQuotient_finite K F E j e + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, hHabsolute⟩ + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + ∀ sigma : + (localResidueDatum F).FrobeniusElements + RF EI.field EI.below, + let sigmaH := + intrinsicFrobeniusElementToAmbientEmbeddedField + K F E j e sigma + let SF := + (localResidueDatum F).frobeniusFixedField + RF EI.field EI.below sigma + let SH := + (localResidueDatum K).frobeniusFixedField + RH J₀ hJH sigmaH + let hSHH := + (localResidueDatum K).frobeniusFixedField_le + RH J₀ hJH sigmaH + let LH := + abstractRelativeFixedField K (SeparableClosure K) hSHH + let iLH : F →ₐ[K] LH := + i.codRestrict (LH.restrictScalars K).toSubalgebra (fun x => by + change + i x ∈ IntermediateField.fixedField SH.toSubgroup + rw [IntermediateField.mem_fixedField_iff] + intro rho hrho + have hrhoH : rho ∈ H₀.toSubgroup := + hSHH hrho + change rho (i x) = i x + change + rho ∈ (AlgHom.fieldRange i).fixingSubgroup at hrhoH + rw [IntermediateField.mem_fixingSubgroup_iff] at hrhoH + exact hrhoH (i x) ⟨x, rfl⟩) + letI : Algebra F LH := + iLH.toRingHom.toAlgebra + abstractFixedField F (SeparableClosure F) SF ≃ₐ[F] LH := by + dsimp only + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + intro e + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + letI hSourceNormal : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).Normal := + EI.normal + letI hSourceFinite : Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) := + EI.finite + letI hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + letI hTargetFinite : Finite + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) := + ambientEmbeddedExtensionQuotient_finite K F E j e + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + letI hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, ambientEmbeddedAbsoluteQuotientFinite K F i⟩ + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + intro sigma + let sigmaH := + intrinsicFrobeniusElementToAmbientEmbeddedField + K F E j e sigma + let SF := + (localResidueDatum F).frobeniusFixedField + RF EI.field EI.below sigma + let SH := + (localResidueDatum K).frobeniusFixedField + RH J₀ hJH sigmaH + let hSFB := + (localResidueDatum F).frobeniusFixedField_le + RF EI.field EI.below sigma + let hSHH := + (localResidueDatum K).frobeniusFixedField_le + RH J₀ hJH sigmaH + let LH := + abstractRelativeFixedField K (SeparableClosure K) hSHH + let iLH : F →ₐ[K] LH := + i.codRestrict (LH.restrictScalars K).toSubalgebra (fun x => by + change i x ∈ IntermediateField.fixedField SH.toSubgroup + rw [IntermediateField.mem_fixedField_iff] + intro rho hrho + have hrhoH : rho ∈ H₀.toSubgroup := + hSHH hrho + change rho (i x) = i x + change + rho ∈ (AlgHom.fieldRange i).fixingSubgroup at hrhoH + rw [IntermediateField.mem_fixingSubgroup_iff] at hrhoH + exact hrhoH (i x) ⟨x, rfl⟩) + letI : Algebra F LH := + iLH.toRingHom.toAlgebra + let psi := + intrinsicBaseEquivAmbientEmbeddedField K F i e + have hmem (x : SeparableClosure F) : + x ∈ IntermediateField.fixedField SF.toSubgroup ↔ + e x ∈ IntermediateField.fixedField SH.toSubgroup := by + apply mem_fixedField_iff_of_equivariant + (intrinsicAbstractBase F).toSubgroup SF.toSubgroup H₀.toSubgroup SH.toSubgroup + hSFB hSHH e.toRingEquiv psi + · intro tau y + change (intrinsicBaseEquivAmbientEmbeddedField K F i e tau).val.toEquiv (e y) = + e (tau.val y) + rw [intrinsicBaseEquivAmbientEmbeddedField_apply_val, e.symm_apply_apply] + · intro tau + change tau ∈ extensionSubgroup RF.field SF hSFB ↔ + psi tau ∈ extensionSubgroup RH.field SH hSHH + rw [(localResidueDatum F).extensionSubgroup_frobeniusFixedField, + (localResidueDatum K).extensionSubgroup_frobeniusFixedField] + exact intrinsicFrobeniusFixedSubgroup_iff_ambientEmbeddedField K F E j e sigma tau + exact { + toFun := fun x => + ⟨e (x : SeparableClosure F), + (hmem (x : SeparableClosure F)).1 x.property⟩ + invFun := fun y => + ⟨e.symm (y : SeparableClosure K), + (hmem (e.symm (y : SeparableClosure K))).2 + (by + rw [e.apply_symm_apply] + exact y.property)⟩ + left_inv := fun x => by + apply Subtype.ext + exact e.symm_apply_apply (x : SeparableClosure F) + right_inv := fun y => by + apply Subtype.ext + exact e.apply_symm_apply (y : SeparableClosure K) + map_mul' := fun x y => by + apply Subtype.ext + exact e.map_mul (x : SeparableClosure F) (y : SeparableClosure F) + map_add' := fun x y => by + apply Subtype.ext + exact e.map_add (x : SeparableClosure F) (y : SeparableClosure F) + commutes' := fun x => by + apply Subtype.ext + exact e.commutes x } + +/-- After coercion to `SeparableClosure K`, the Frobenius fixed-field +equivalence acts as the original separable-closure equivalence. -/ +theorem + intrinsicFrobeniusFixedFieldEquivAmbientEmbeddedField_apply_val + (j : E →ₐ[K] SeparableClosure K) : + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ (e : SeparableClosure F ≃ₐ[F] SeparableClosure K) + (sigma : + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + (localResidueDatum F).FrobeniusElements + RF EI.field EI.below) + (x : + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let SF := + (localResidueDatum F).frobeniusFixedField + RF EI.field EI.below sigma + abstractFixedField F (SeparableClosure F) SF), + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro y hy + rcases hy with ⟨z, rfl⟩ + exact ⟨algebraMap F E z, rfl⟩ + letI _hSourceNormal : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).Normal := + EI.normal + letI _hSourceFinite : Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) := + EI.finite + letI _hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + letI _hTargetFinite : Finite + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) := + ambientEmbeddedExtensionQuotient_finite K F E j e + let _RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, hHabsolute⟩ + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let sigmaH := + intrinsicFrobeniusElementToAmbientEmbeddedField + K F E j e sigma + let SH := + (localResidueDatum K).frobeniusFixedField + RH J₀ hJH sigmaH + let hSHH := + (localResidueDatum K).frobeniusFixedField_le + RH J₀ hJH sigmaH + let LH := + abstractRelativeFixedField K (SeparableClosure K) hSHH + let iLH : F →ₐ[K] LH := + i.codRestrict (LH.restrictScalars K).toSubalgebra (fun y => by + change + i y ∈ IntermediateField.fixedField SH.toSubgroup + rw [IntermediateField.mem_fixedField_iff] + intro rho hrho + have hrhoH : rho ∈ H₀.toSubgroup := + hSHH hrho + change rho (i y) = i y + change + rho ∈ (AlgHom.fieldRange i).fixingSubgroup at hrhoH + rw [IntermediateField.mem_fixingSubgroup_iff] at hrhoH + exact hrhoH (i y) ⟨y, rfl⟩) + letI : Algebra F LH := + iLH.toRingHom.toAlgebra + ((intrinsicFrobeniusFixedFieldEquivAmbientEmbeddedField + K F E j e sigma x : LH) : SeparableClosure K) = + e (x : SeparableClosure F) := by + dsimp only + intro e sigma x + rfl + +end EmbeddedFrobeniusTransport + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Groups.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Groups.lean new file mode 100644 index 0000000000..c0ee5c3d14 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Groups.lean @@ -0,0 +1,1331 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.ContinuousQuotientEquiv +/-! +# Embedded Frobenius transport + +This module transports inertia, Frobenius elements, and fixed fields across an explicit + equivalence of separable closures. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open scoped ValuativeRel + +/-- The separable-closure equivalence identifies the intrinsic extension +inertia subgroup of a fixed field with its ambient extension inertia +subgroup. -/ +theorem map_intrinsicExtensionInertia_eq_ambientFixedField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] : + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + ∀ (e : SeparableClosure F ≃ₐ[F] SeparableClosure K), + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + letI : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + letI : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + letI : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + let ψ := intrinsicBaseEquivAmbientFixedField K H e + ((localResidueDatum F).extensionInertiaWithin + (intrinsicAbstractBase F) EI.field EI.below).map + ψ.toMonoidHom = + (localResidueDatum K).extensionInertiaWithin + H.field J hJH := by + dsimp only + let F := abstractFixedField K (SeparableClosure K) H.field + let : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + intro e + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + let : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + let : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + let : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + let : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + let : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + let ψ := intrinsicBaseEquivAmbientFixedField K H e + ext σ + constructor + · rintro ⟨τ, hτ, rfl⟩ + exact + (intrinsicExtensionInertia_iff_ambientFixedField + K H J hJH e τ).1 hτ + · intro hσ + let τ : + (intrinsicAbstractBase F).toSubgroup := + ψ.symm σ + refine ⟨τ, ?_, ψ.apply_symm_apply σ⟩ + apply + (intrinsicExtensionInertia_iff_ambientFixedField + K H J hJH e τ).2 + change + ψ τ ∈ + (localResidueDatum K).extensionInertiaWithin + H.field J hJH + have hτImage : ψ τ = σ := + ψ.apply_symm_apply σ + rw [hτImage] + exact hσ + +/-- The equivalence on absolute Galois base subgroups induced by a fixed-field +separable-closure equivalence is continuous. -/ +theorem intrinsicBaseEquivAmbientFixedField_continuous + (K : Type) [Field K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) : + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + ∀ (e : SeparableClosure F ≃ₐ[F] SeparableClosure K), + Continuous (intrinsicBaseEquivAmbientFixedField K H e) := by + dsimp only + let F := abstractFixedField K (SeparableClosure K) H.field + let : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + intro e + let : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + apply continuous_induced_rng.mpr + change Continuous fun τ : + (intrinsicAbstractBase F).toSubgroup => + (AlgEquiv.autCongr e τ.1).restrictScalars K + exact + (Field.absoluteGaloisGroup.ofIntermediateFieldInExtension_continuous + F).comp + ((Field.absoluteGaloisGroup.algEquiv_autCongr_continuous e).comp + continuous_subtype_val) + +/-- The intrinsic absolute Galois equivalence induced by an embedding into the +ambient separable closure is continuous. -/ +theorem + intrinsicBaseEquivAmbientEmbeddedField_continuous + (K F : Type) [Field K] [Field F] + [Algebra K F] [FiniteDimensional K F] [Algebra.IsSeparable K F] + (i : F →ₐ[K] SeparableClosure K) : + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ e : SeparableClosure F ≃ₐ[F] SeparableClosure K, + Continuous + (intrinsicBaseEquivAmbientEmbeddedField K F i e) := by + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + intro e + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, ambientEmbeddedAbsoluteQuotientFinite K F i⟩ + let F₀ := + abstractFixedField K (SeparableClosure K) H₀ + let : FiniteDimensional K F₀ := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H₀ hHabsolute + let : Algebra.IsSeparable F₀ (SeparableClosure K) := + Algebra.isSeparable_tower_top_of_isSeparable + K F₀ (SeparableClosure K) + let : IsSepClosure F₀ (SeparableClosure K) := + ⟨inferInstance, inferInstance⟩ + let : Algebra F₀ (SeparableClosure F₀) := + (separableClosure F₀ (AlgebraicClosure F₀)).algebra + let e₀ : SeparableClosure F₀ ≃ₐ[F₀] SeparableClosure K := + IsSepClosure.equiv F₀ + (SeparableClosure F₀) (SeparableClosure K) + have hfixed : + F₀ = AlgHom.fieldRange i := + InfiniteGalois.fixedField_fixingSubgroup + (AlgHom.fieldRange i) + let phiAlg : F ≃ₐ[K] F₀ := + (i.equivFieldRange).trans + (IntermediateField.equivOfEq hfixed.symm) + let phi : F ≃+* F₀ := phiAlg.toRingEquiv + let c : SeparableClosure F ≃+* SeparableClosure F₀ := + e.toRingEquiv.trans e₀.symm.toRingEquiv + have hc (x : F) : + c (algebraMap F (SeparableClosure F) x) = + algebraMap F₀ (SeparableClosure F₀) (phi x) := by + change e₀.symm + (e (algebraMap F (SeparableClosure F) x)) = + algebraMap F₀ (SeparableClosure F₀) (phi x) + apply e₀.injective + rw [e₀.apply_symm_apply, e.commutes, e₀.commutes] + rfl + let theta : + Gal(SeparableClosure F/F) ≃* + Gal(SeparableClosure F₀/F₀) := { + toFun := fun sigma => + { c.symm.trans (sigma.toRingEquiv.trans c) with + commutes' := fun x => by + change c (sigma (c.symm + (algebraMap F₀ (SeparableClosure F₀) x))) = + algebraMap F₀ (SeparableClosure F₀) x + have hpre : + c.symm + (algebraMap F₀ (SeparableClosure F₀) x) = + algebraMap F (SeparableClosure F) (phi.symm x) := by + apply c.injective + rw [c.apply_symm_apply, hc, phi.apply_symm_apply] + rw [hpre, sigma.commutes, hc, phi.apply_symm_apply] } + invFun := fun tau => + { c.trans (tau.toRingEquiv.trans c.symm) with + commutes' := fun x => by + change c.symm (tau (c + (algebraMap F (SeparableClosure F) x))) = + algebraMap F (SeparableClosure F) x + rw [hc, tau.commutes] + apply c.injective + rw [c.apply_symm_apply, hc] } + left_inv := fun sigma => by + apply AlgEquiv.ext + intro x + change c.symm + (c (sigma (c.symm (c x)))) = sigma x + rw [c.symm_apply_apply, c.symm_apply_apply] + right_inv := fun tau => by + apply AlgEquiv.ext + intro x + change c + (c.symm (tau (c (c.symm x)))) = tau x + rw [c.apply_symm_apply, c.apply_symm_apply] + map_mul' := fun sigma tau => by + apply AlgEquiv.ext + intro x + change c (sigma (tau (c.symm x))) = + c (sigma (c.symm (c (tau (c.symm x))))) + rw [c.symm_apply_apply] } + have htheta : Continuous theta := by + apply + RamificationTheory.Field.absoluteGaloisGroup.semilinear_conjugation_continuous + phi c hc theta.toMonoidHom + intro sigma + rfl + let psi₀ := + intrinsicBaseEquivAmbientFixedField K H e₀ + have hpsi₀ : Continuous psi₀ := + intrinsicBaseEquivAmbientFixedField_continuous K H e₀ + have hlift : Continuous + (fun sigma : Gal(SeparableClosure F₀/F₀) => + (⟨sigma, by + rw [intrinsicAbstractBase, + closedFixingSubgroup_bot_eq_baseField] + trivial⟩ : + (intrinsicAbstractBase F₀).toSubgroup)) := by + apply continuous_induced_rng.mpr + exact continuous_id + change Continuous + (fun tau : (intrinsicAbstractBase F).toSubgroup => + psi₀ + ⟨theta tau.1, by + rw [intrinsicAbstractBase, + closedFixingSubgroup_bot_eq_baseField] + trivial⟩) + exact hpsi₀.comp + (hlift.comp (htheta.comp continuous_subtype_val)) + +/-- Bundles the intrinsic-to-ambient absolute Galois equivalence as a continuous +multiplicative equivalence. -/ +noncomputable def + intrinsicBaseContinuousEquivAmbientEmbeddedField + (K F : Type) [Field K] [Field F] + [Algebra K F] [FiniteDimensional K F] [Algebra.IsSeparable K F] + (i : F →ₐ[K] SeparableClosure K) : + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + (e : SeparableClosure F ≃ₐ[F] SeparableClosure K) → + (intrinsicAbstractBase F).toSubgroup ≃ₜ* + (closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i)).toSubgroup := by + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + intro e + let psi := + intrinsicBaseEquivAmbientEmbeddedField K F i e + have hpsi : Continuous psi := + intrinsicBaseEquivAmbientEmbeddedField_continuous + K F i e + letI : CompactSpace (intrinsicAbstractBase F).toSubgroup := + isCompact_iff_compactSpace.mp + ((intrinsicAbstractBase F).isClosed'.isCompact) + exact + { toMulEquiv := psi + continuous_toFun := hpsi + continuous_invFun := + hpsi.continuous_symm_of_equiv_compact_to_t2 } + +/-- Forgetting continuity recovers the original equivalence of intrinsic and ambient groups. -/ +theorem intrinsicBaseContinuousEquivAmbientEmbeddedField_toMulEquiv + (K F : Type) [Field K] [Field F] + [Algebra K F] [FiniteDimensional K F] [Algebra.IsSeparable K F] + (i : F →ₐ[K] SeparableClosure K) : + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ e : SeparableClosure F ≃ₐ[F] SeparableClosure K, + (intrinsicBaseContinuousEquivAmbientEmbeddedField K F i e).toMulEquiv = + intrinsicBaseEquivAmbientEmbeddedField K F i e := by + intro e + rfl + +/-- Descends the intrinsic-to-ambient Galois equivalence to a continuous +multiplicative equivalence between the quotients by extension inertia. -/ +noncomputable def + intrinsicFrobeniusQuotientContinuousEquivAmbientEmbeddedField + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsGalois F E] + (j : E →ₐ[K] SeparableClosure K) : + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ e : SeparableClosure F ≃ₐ[F] SeparableClosure K, + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + let _psi := + intrinsicBaseEquivAmbientEmbeddedField K F i e + letI hSourceNormal : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).Normal := + EI.normal + letI _hSourceFinite : Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) := + EI.finite + letI hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + letI _hTargetFinite : Finite + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) := + ambientEmbeddedExtensionQuotient_finite K F E j e + ((intrinsicAbstractBase F).toSubgroup ⧸ + (localResidueDatum F).extensionInertiaWithin + (intrinsicAbstractBase F) EI.field EI.below) ≃ₜ* + (H₀.toSubgroup ⧸ + (localResidueDatum K).extensionInertiaWithin + H₀ J₀ hJH) := by + dsimp only + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + intro e + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + have hRange : + AlgHom.fieldRange i ≤ AlgHom.fieldRange j := by + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + exact (AlgHom.fieldRange i).fixingSubgroup_le hRange + let psi := + intrinsicBaseEquivAmbientEmbeddedField K F i e + let psiC := + intrinsicBaseContinuousEquivAmbientEmbeddedField K F i e + letI hSourceNormal : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).Normal := + EI.normal + letI hSourceFinite : Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) := + EI.finite + have hmapExtension : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).map + psi.toMonoidHom = + extensionSubgroup H₀ J₀ hJH := by + simpa only [i, jF, jI, EI, H₀, J₀, hJH, psi] using + map_intrinsicExtensionSubgroup_eq_ambientEmbeddedField + K F E j e + letI hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + letI hTargetFinite : Finite + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) := + ambientEmbeddedExtensionQuotient_finite K F E j e + letI : + ((localResidueDatum F).extensionInertiaWithin + (intrinsicAbstractBase F) EI.field EI.below).Normal := + inferInstance + letI : + ((localResidueDatum K).extensionInertiaWithin + H₀ J₀ hJH).Normal := + inferInstance + have hmapInertia : + ((localResidueDatum F).extensionInertiaWithin + (intrinsicAbstractBase F) EI.field EI.below).map + psi.toMonoidHom = + (localResidueDatum K).extensionInertiaWithin + H₀ J₀ hJH := by + simpa only [i, jF, jI, EI, H₀, J₀, hJH, psi] using + map_intrinsicExtensionInertia_eq_ambientEmbeddedField + K F E j e + exact + LocalFieldTheory.QuotientGroup.continuousCongr + ((localResidueDatum F).extensionInertiaWithin + (intrinsicAbstractBase F) EI.field EI.below) + ((localResidueDatum K).extensionInertiaWithin + H₀ J₀ hJH) + psiC + (by + change + ((localResidueDatum F).extensionInertiaWithin + (intrinsicAbstractBase F) EI.field EI.below).map + psi.toMonoidHom = + (localResidueDatum K).extensionInertiaWithin + H₀ J₀ hJH + exact hmapInertia) + +/-- The intrinsic-to-ambient quotient equivalence preserves the normalized +degree of extension Frobenius classes. -/ +theorem + intrinsicFrobeniusQuotientContinuousEquivAmbientEmbeddedField_normalizedDegree + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsGalois F E] + (j : E →ₐ[K] SeparableClosure K) : + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ e : SeparableClosure F ≃ₐ[F] SeparableClosure K, + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + letI _hSourceNormal := + EI.normal + letI _hSourceFinite := + EI.finite + letI hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + letI _hTargetFinite : Finite + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) := + ambientEmbeddedExtensionQuotient_finite K F E j e + ∀ q : + (intrinsicAbstractBase F).toSubgroup ⧸ + (localResidueDatum F).extensionInertiaWithin + (intrinsicAbstractBase F) EI.field EI.below, + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let hHabsolute := ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, hHabsolute⟩ + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + (localResidueDatum K).extensionNormalizedDegree + RH J₀ hJH + (intrinsicFrobeniusQuotientContinuousEquivAmbientEmbeddedField + K F E j e q) = + (localResidueDatum F).extensionNormalizedDegree + RF EI.field EI.below q := by + dsimp only + let i := + j.comp (IsScalarTower.toAlgHom K F E) + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + intro e + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + have hRange : AlgHom.fieldRange i ≤ AlgHom.fieldRange j := + Set.range_comp_subset_range (algebraMap F E) j + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + exact (AlgHom.fieldRange i).fixingSubgroup_le hRange + let hSourceNormal := EI.normal + let hSourceFinite := EI.finite + let hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + let hTargetFinite : Finite + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) := + ambientEmbeddedExtensionQuotient_finite K F E j e + intro q + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let hHabsolute := ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, hHabsolute⟩ + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + refine Quotient.inductionOn' q ?_ + intro tau + have hquotientMk : + intrinsicFrobeniusQuotientContinuousEquivAmbientEmbeddedField + K F E j e (QuotientGroup.mk tau) = + QuotientGroup.mk + (intrinsicBaseEquivAmbientEmbeddedField K F i e tau) := + LocalFieldTheory.QuotientGroup.continuousCongr_mk _ _ _ _ tau + rw [hquotientMk, + (localResidueDatum K).extensionNormalizedDegree_mk, + (localResidueDatum F).extensionNormalizedDegree_mk] + simpa only [RF, RH, H] using + (intrinsicBase_normalizedDegree_eq_ambientEmbeddedField + K F i e tau).symm + +/-- Transports a positive Frobenius lift for an embedded extension from the +intrinsic separable closure of `F` to the ambient separable closure of `K`. -/ +noncomputable def + intrinsicFrobeniusElementToAmbientEmbeddedField + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsGalois F E] + (j : E →ₐ[K] SeparableClosure K) : + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ e : SeparableClosure F ≃ₐ[F] SeparableClosure K, + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + letI _hSourceNormal : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).Normal := + EI.normal + letI _hSourceFinite : Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) := + EI.finite + letI hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + letI _hTargetFinite : Finite + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) := + ambientEmbeddedExtensionQuotient_finite K F E j e + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, hHabsolute⟩ + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + (localResidueDatum F).FrobeniusElements + RF EI.field EI.below → + (localResidueDatum K).FrobeniusElements + RH J₀ hJH := by + dsimp only + letI : Algebra F (SeparableClosure K) := + (j.comp (IsScalarTower.toAlgHom K F E)).toRingHom.toAlgebra + intro e sigma + refine ⟨intrinsicFrobeniusQuotientContinuousEquivAmbientEmbeddedField + K F E j e sigma.1, ?_⟩ + rcases sigma.2 with ⟨n, hn, hdegree⟩ + refine ⟨n, hn, ?_⟩ + rw [intrinsicFrobeniusQuotientContinuousEquivAmbientEmbeddedField_normalizedDegree] + exact hdegree + +/-- Extension restriction commutes with the intrinsic-to-ambient quotient +equivalence and the corresponding quotient-to-Galois equivalences. -/ +theorem + intrinsicExtensionRestriction_compatibility_ambientEmbeddedField + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsGalois F E] + (j : E →ₐ[K] SeparableClosure K) : + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ e : SeparableClosure F ≃ₐ[F] SeparableClosure K, + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + letI hSourceNormal : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).Normal := + EI.normal + letI _hSourceFinite : Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) := + EI.finite + letI hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + letI _hTargetFinite : Finite + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) := + ambientEmbeddedExtensionQuotient_finite K F E j e + ∀ q : + (intrinsicAbstractBase F).toSubgroup ⧸ + (localResidueDatum F).extensionInertiaWithin + (intrinsicAbstractBase F) EI.field EI.below, + ambientEmbeddedExtensionQuotientEquivGaloisGroup + K F E j e + ((localResidueDatum K).extensionRestriction + H₀ J₀ hJH + (intrinsicFrobeniusQuotientContinuousEquivAmbientEmbeddedField + K F E j e q)) = + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + F E jI + ((localResidueDatum F).extensionRestriction + (intrinsicAbstractBase F) EI.field EI.below q) := by + dsimp only + let i := + j.comp (IsScalarTower.toAlgHom K F E) + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + intro e + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + have hRange : + AlgHom.fieldRange i ≤ AlgHom.fieldRange j := by + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + exact (AlgHom.fieldRange i).fixingSubgroup_le hRange + let hSourceNormal : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).Normal := + EI.normal + let hSourceFinite : Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) := + EI.finite + let hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + let hTargetFinite : Finite + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) := + ambientEmbeddedExtensionQuotient_finite K F E j e + intro q + refine Quotient.inductionOn' q ?_ + intro tau + have hquotientMk : + intrinsicFrobeniusQuotientContinuousEquivAmbientEmbeddedField + K F E j e (QuotientGroup.mk tau) = + QuotientGroup.mk + (intrinsicBaseEquivAmbientEmbeddedField K F i e tau) := by + exact + LocalFieldTheory.QuotientGroup.continuousCongr_mk + _ _ _ _ tau + have hAmbientRestriction : + (localResidueDatum K).extensionRestriction + H₀ J₀ hJH + (intrinsicFrobeniusQuotientContinuousEquivAmbientEmbeddedField + K F E j e (QuotientGroup.mk tau)) = + QuotientGroup.mk + (intrinsicBaseEquivAmbientEmbeddedField K F i e tau) := by + calc + _ = + (localResidueDatum K).extensionRestriction + H₀ J₀ hJH + (QuotientGroup.mk + (intrinsicBaseEquivAmbientEmbeddedField K F i e tau)) := + congrArg + ((localResidueDatum K).extensionRestriction H₀ J₀ hJH) + hquotientMk + _ = _ := + (localResidueDatum K).extensionRestriction_mk + H₀ J₀ hJH + (intrinsicBaseEquivAmbientEmbeddedField K F i e tau) + have hSourceRestriction : + (localResidueDatum F).extensionRestriction + (intrinsicAbstractBase F) EI.field EI.below + (QuotientGroup.mk tau) = + QuotientGroup.mk tau := + (localResidueDatum F).extensionRestriction_mk + (intrinsicAbstractBase F) EI.field EI.below tau + calc + _ = + ambientEmbeddedExtensionQuotientEquivGaloisGroup + K F E j e + (QuotientGroup.mk + (intrinsicBaseEquivAmbientEmbeddedField K F i e tau)) := + congrArg + (ambientEmbeddedExtensionQuotientEquivGaloisGroup K F E j e) + hAmbientRestriction + _ = + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + F E jI (QuotientGroup.mk tau) := + ambientEmbeddedExtensionQuotientEquivGaloisGroup_mk + K F E j e tau + _ = _ := + congrArg + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + F E jI) + hSourceRestriction.symm + +/-- Restriction of a transported Frobenius lift agrees, under the intrinsic +and ambient quotient--Galois equivalences, with restriction of the original +intrinsic lift. -/ +theorem + intrinsicFrobeniusRestriction_compatibility_ambientEmbeddedField + (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsGalois F E] + (j : E →ₐ[K] SeparableClosure K) : + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ e : SeparableClosure F ≃ₐ[F] SeparableClosure K, + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + letI _hSourceNormal : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).Normal := + EI.normal + letI _hSourceFinite : Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) := + EI.finite + letI hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + letI _hTargetFinite : Finite + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) := + ambientEmbeddedExtensionQuotient_finite K F E j e + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, hHabsolute⟩ + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + ∀ sigma : + (localResidueDatum F).FrobeniusElements + RF EI.field EI.below, + ambientEmbeddedExtensionQuotientEquivGaloisGroup + K F E j e + ((localResidueDatum K).frobeniusRestriction + RH J₀ hJH + (intrinsicFrobeniusElementToAmbientEmbeddedField + K F E j e sigma)) = + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + F E jI + ((localResidueDatum F).frobeniusRestriction + RF EI.field EI.below sigma) := by + dsimp only + intro e sigma + exact + intrinsicExtensionRestriction_compatibility_ambientEmbeddedField + K F E j e sigma.1 + +section EmbeddedFrobeniusTransport + +variable (K F E : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Field E] [Algebra K F] [Algebra F E] [Algebra K E] + [IsScalarTower K F E] + [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + [FiniteDimensional F E] [IsGalois F E] + +/-- The intrinsic-to-ambient quotient equivalence preserves and reflects +membership in the Frobenius closure generated by a Frobenius element. -/ +theorem + intrinsicFrobeniusClosure_iff_ambientEmbeddedField + (j : E →ₐ[K] SeparableClosure K) : + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ e : SeparableClosure F ≃ₐ[F] SeparableClosure K, + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + letI _hSourceNormal : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).Normal := + EI.normal + letI _hSourceFinite : Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) := + EI.finite + letI _hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + letI _hTargetFinite : Finite + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) := + ambientEmbeddedExtensionQuotient_finite K F E j e + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, hHabsolute⟩ + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + ∀ (sigma : + (localResidueDatum F).FrobeniusElements + RF EI.field EI.below) + (q : + (intrinsicAbstractBase F).toSubgroup ⧸ + (localResidueDatum F).extensionInertiaWithin + (intrinsicAbstractBase F) EI.field EI.below), + q ∈ ((localResidueDatum F).frobeniusClosure + RF EI.field EI.below sigma).toSubgroup ↔ + intrinsicFrobeniusQuotientContinuousEquivAmbientEmbeddedField + K F E j e q ∈ + ((localResidueDatum K).frobeniusClosure + RH J₀ hJH + (intrinsicFrobeniusElementToAmbientEmbeddedField + K F E j e sigma)).toSubgroup := by + dsimp only + let i := + j.comp (IsScalarTower.toAlgHom K F E) + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + intro e + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + have hRange : + AlgHom.fieldRange i ≤ AlgHom.fieldRange j := by + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + exact (AlgHom.fieldRange i).fixingSubgroup_le hRange + let hSourceNormal : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).Normal := + EI.normal + let hSourceFinite : Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) := + EI.finite + let hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + let hTargetFinite : Finite + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) := + ambientEmbeddedExtensionQuotient_finite K F E j e + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, hHabsolute⟩ + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + intro sigma q + let xi := + intrinsicFrobeniusQuotientContinuousEquivAmbientEmbeddedField + K F E j e + let xiHom := + ContinuousMonoidHom.toContinuousMonoidHom xi + let xiInvHom := + ContinuousMonoidHom.toContinuousMonoidHom xi.symm + simp only [DegreeData.frobeniusClosure, Set.range_const] + constructor + · exact map_mem_closedSubgroupGenerated_singleton xiHom sigma.1 + · intro hq + have hmap := map_mem_closedSubgroupGenerated_singleton xiInvHom (xi sigma.1) hq + change xi.symm (xi q) ∈ + (closedSubgroupGenerated ({xi.symm (xi sigma.1)} : Set _)).toSubgroup at hmap + simpa only [xi.symm_apply_apply] using hmap + +/-- The intrinsic-to-ambient absolute Galois equivalence preserves and reflects +membership in the Frobenius fixed subgroup. -/ +theorem + intrinsicFrobeniusFixedSubgroup_iff_ambientEmbeddedField + (j : E →ₐ[K] SeparableClosure K) : + let i := + j.comp (IsScalarTower.toAlgHom K F E) + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ e : SeparableClosure F ≃ₐ[F] SeparableClosure K, + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + letI _hSourceNormal : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).Normal := + EI.normal + letI _hSourceFinite : Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) := + EI.finite + letI _hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + letI _hTargetFinite : Finite + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) := + ambientEmbeddedExtensionQuotient_finite K F E j e + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, hHabsolute⟩ + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + ∀ (sigma : + (localResidueDatum F).FrobeniusElements + RF EI.field EI.below) + (tau : (intrinsicAbstractBase F).toSubgroup), + tau ∈ (localResidueDatum F).frobeniusFixedSubgroupWithin + RF EI.field EI.below sigma ↔ + intrinsicBaseEquivAmbientEmbeddedField K F i e tau ∈ + (localResidueDatum K).frobeniusFixedSubgroupWithin + RH J₀ hJH + (intrinsicFrobeniusElementToAmbientEmbeddedField + K F E j e sigma) := by + dsimp only + let i := + j.comp (IsScalarTower.toAlgHom K F E) + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + intro e + let jF : E →ₐ[F] SeparableClosure K := + { j with commutes' := fun x => rfl } + let jI : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp jF + let EI := + finiteGaloisAbstractExtensionOfEmbedding F E jI + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let J₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange j) + let hJH : J₀.toSubgroup ≤ H₀.toSubgroup := by + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange i).fixingSubgroup + apply (AlgHom.fieldRange i).fixingSubgroup_le + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap F E y, rfl⟩ + let hSourceNormal : + (extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below).Normal := + EI.normal + let hSourceFinite : Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) EI.field EI.below) := + EI.finite + let hTargetNormal : + (extensionSubgroup H₀ J₀ hJH).Normal := + ambientEmbeddedExtensionSubgroup_normal K F E j e + let hTargetFinite : Finite + (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) := + ambientEmbeddedExtensionQuotient_finite K F E j e + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let hHabsolute : Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H₀ (le_baseField H₀)) := by + exact ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := + ⟨H₀, ambientEmbeddedAbsoluteQuotientFinite K F i⟩ + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + intro sigma tau + have htransport := + intrinsicFrobeniusClosure_iff_ambientEmbeddedField + K F E j e sigma (QuotientGroup.mk tau) + have hquotientMk : + intrinsicFrobeniusQuotientContinuousEquivAmbientEmbeddedField + K F E j e (QuotientGroup.mk tau) = + QuotientGroup.mk + (intrinsicBaseEquivAmbientEmbeddedField K F i e tau) := by + exact + LocalFieldTheory.QuotientGroup.continuousCongr_mk + _ _ _ _ tau + rw [hquotientMk] at htransport + change + QuotientGroup.mk tau ∈ + ((localResidueDatum F).frobeniusClosure + RF EI.field EI.below sigma).toSubgroup ↔ + QuotientGroup.mk + (intrinsicBaseEquivAmbientEmbeddedField K F i e tau) ∈ + ((localResidueDatum K).frobeniusClosure + RH J₀ hJH + (intrinsicFrobeniusElementToAmbientEmbeddedField + K F E j e sigma)).toSubgroup + convert htransport using 1 <;> + simp only [ + i, jF, jI, EI, H₀, J₀, RF, H, RH] + · rfl + · rfl + +/-- An equivariant equivalence identifies the fixed fields of corresponding subgroups. -/ +theorem mem_fixedField_iff_of_equivariant + {F F' Ω Ω' : Type*} [Field F] [Field F'] [Field Ω] [Field Ω'] + [Algebra F Ω] [Algebra F' Ω'] + (B S : Subgroup (Ω ≃ₐ[F] Ω)) (C T : Subgroup (Ω' ≃ₐ[F'] Ω')) + (hSB : S ≤ B) (hTC : T ≤ C) (e : Ω ≃+* Ω') (psi : B ≃* C) + (hpsi : ∀ (sigma : B) (x : Ω), (psi sigma).1 (e x) = e (sigma.1 x)) + (hmem : ∀ sigma : B, sigma.1 ∈ S ↔ (psi sigma).1 ∈ T) (x : Ω) : + x ∈ IntermediateField.fixedField S ↔ e x ∈ IntermediateField.fixedField T := by + constructor + · intro hx + rw [IntermediateField.mem_fixedField_iff] + intro rho hrho + let rhoC : C := ⟨rho, hTC hrho⟩ + let sigma := psi.symm rhoC + have hsigma : sigma.1 ∈ S := (hmem sigma).2 (by + change (psi (psi.symm rhoC)).1 ∈ T + simpa only [psi.apply_symm_apply] using hrho) + have hfix := (IntermediateField.mem_fixedField_iff S x).1 hx sigma.1 hsigma + have heq := hpsi sigma x + change (psi (psi.symm rhoC)).1 (e x) = e (sigma.1 x) at heq + simpa only [psi.apply_symm_apply, hfix] using heq + · intro hx + rw [IntermediateField.mem_fixedField_iff] + intro sigma hsigma + let sigmaB : B := ⟨sigma, hSB hsigma⟩ + have hrho : (psi sigmaB).1 ∈ T := (hmem sigmaB).1 hsigma + have hfix := (IntermediateField.mem_fixedField_iff T (e x)).1 hx (psi sigmaB).1 hrho + apply e.injective + exact (hpsi sigmaB x).symm.trans hfix + +end EmbeddedFrobeniusTransport + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusArtinComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusArtinComparison.lean new file mode 100644 index 0000000000..26717a0912 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusArtinComparison.lean @@ -0,0 +1,121 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.PrimeComparison +/-! +# Intrinsic Frobenius Artin comparison + +This module identifies the canonical local Artin homomorphism of an actual +finite fixed-field extension with its ambient fixed-field norm-residue symbol. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open scoped ValuativeRel + +section IntrinsicFixedFieldArtinComparison + +variable + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] + +local instance intrinsicFixedFieldArtin_absoluteFinite : + Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H.field (le_baseField H.field)) := + H.finite + +/-- The canonical local Artin homomorphism of the actual finite fixed-field +extension agrees with the ambient fixed-field norm-residue symbol. The proof +uses the given valuation-preserving equivalence of separable closures to +construct actual norm-class representatives. -/ +theorem + intrinsicFixedFieldLocalArtinMonoidHom_eq_abstractFixedFieldNormResidueSymbol + (e : intrinsicFixedFieldSeparableClosureEquiv K H) : + intrinsicFixedFieldLocalArtinMonoidHom K H J hJH = + abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H.field J hJH := by + apply AddMonoidHom.ext + intro a + let aF : + (abstractFixedField K (SeparableClosure K) H.field)ˣ := + Additive.toMul a + obtain ⟨x, hnormClass, hprime⟩ := + exists_intrinsicFixedFieldNormClassRepresentative + K H J hJH e aF + have hambientSame : + abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H.field J hJH (Additive.ofMul aF) = + abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H.field J hJH (Additive.ofMul x) := + abstractFixedFieldNormResidueSymbol_eq_of_normClass_eq + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H.field J hJH aF x hnormClass + change + intrinsicFixedFieldLocalArtinMonoidHom + K H J hJH (Additive.ofMul aF) = + abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H.field J hJH (Additive.ofMul aF) + calc + intrinsicFixedFieldLocalArtinMonoidHom + K H J hJH (Additive.ofMul aF) = + abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H.field J hJH (Additive.ofMul x) := + hprime.symm + _ = abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H.field J hJH (Additive.ofMul aF) := + hambientSame.symm + +end IntrinsicFixedFieldArtinComparison + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusClosure.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusClosure.lean new file mode 100644 index 0000000000..e8153f339f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusClosure.lean @@ -0,0 +1,373 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusQuotientTransport +/-! +# Intrinsic Frobenius closure comparison + +This module compares the intrinsic and ambient Frobenius closures after +the quotient transport has been constructed. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open scoped ValuativeRel + +/-- Membership in the intrinsic Frobenius closure, expressed either with the +residue datum's carrier or with the canonical fixed-field quotient. -/ +theorem intrinsicFixedFieldFrobeniusClosure_mem_iff + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] + (e : intrinsicFixedFieldSeparableClosureEquiv K H) + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + letI : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + letI : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + letI : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + ∀ τ : (intrinsicAbstractBase F).toSubgroup, + let τRF : RF.field.toSubgroup := + ⟨τ.1, by + simpa only [RF, intrinsicFiniteAbstractBase, + FiniteAbstractField.toFiniteResidueAbstractField] using τ.2⟩ + QuotientGroup.mk τRF ∈ + ((localResidueDatum F).frobeniusClosure + RF EI.field EI.below σ).toSubgroup ↔ + (QuotientGroup.mk τ : + intrinsicFixedFieldFrobeniusQuotient K H J hJH e) ∈ + (closedSubgroupGenerated + ({σ.1} : Set + (intrinsicFixedFieldFrobeniusQuotient + K H J hJH e)) : Subgroup _) := by + dsimp only + let F := abstractFixedField K (SeparableClosure K) H.field + let : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + let : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + let : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + let : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + let : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + let : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + intro τ + let τRF : RF.field.toSubgroup := + ⟨τ.1, by + simpa only [RF, intrinsicFiniteAbstractBase, + FiniteAbstractField.toFiniteResidueAbstractField] using τ.2⟩ + constructor + · intro h + convert h using 1 + all_goals + simp only [DegreeData.frobeniusClosure, Set.range_unique, + intrinsicFixedFieldFrobeniusQuotient, + intrinsicFiniteAbstractBase, + FiniteAbstractField.toFiniteResidueAbstractField] + · intro h + convert h using 1 + all_goals + simp only [DegreeData.frobeniusClosure, Set.range_unique, + intrinsicFixedFieldFrobeniusQuotient, + intrinsicFiniteAbstractBase, + FiniteAbstractField.toFiniteResidueAbstractField] + +/-- Membership in the ambient Frobenius closure, expressed either with the +residue datum's carrier or with the canonical ambient quotient. -/ +theorem ambientFixedFieldFrobeniusClosure_mem_iff + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] + (e : intrinsicFixedFieldSeparableClosureEquiv K H) + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + letI : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + letI : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + letI : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let σH := + intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ + let ψ := intrinsicBaseEquivAmbientFixedField K H e + ∀ τ : (intrinsicAbstractBase F).toSubgroup, + let ψτRH : RH.field.toSubgroup := + ⟨(ψ τ).1, by + simpa only [RH, + FiniteAbstractField.toFiniteResidueAbstractField] using + (ψ τ).2⟩ + QuotientGroup.mk ψτRH ∈ + ((localResidueDatum K).frobeniusClosure + RH J hJH σH).toSubgroup ↔ + (QuotientGroup.mk (ψ τ) : + ambientFixedFieldFrobeniusQuotient K H J hJH) ∈ + (closedSubgroupGenerated + ({σH.1} : Set + (ambientFixedFieldFrobeniusQuotient + K H J hJH)) : Subgroup _) := by + dsimp only + let F := abstractFixedField K (SeparableClosure K) H.field + let : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + let : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + let : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + let : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + let : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + let : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let σH := + intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ + let ψ := intrinsicBaseEquivAmbientFixedField K H e + intro τ + let ψτRH : RH.field.toSubgroup := + ⟨(ψ τ).1, by + simpa only [RH, + FiniteAbstractField.toFiniteResidueAbstractField] using + (ψ τ).2⟩ + constructor + · intro h + simpa only [DegreeData.frobeniusClosure, Set.range_unique, + ambientFixedFieldFrobeniusQuotient, + FiniteAbstractField.toFiniteResidueAbstractField] using h + · intro h + simpa only [DegreeData.frobeniusClosure, Set.range_unique, + ambientFixedFieldFrobeniusQuotient, + FiniteAbstractField.toFiniteResidueAbstractField] using h + +/-- The canonical fixed-field quotient equivalence maps the intrinsic +Frobenius closure into the ambient Frobenius closure. -/ +theorem intrinsicFixedFieldFrobeniusClosure_le_ambientFixedField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] + (e : intrinsicFixedFieldSeparableClosureEquiv K H) + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) + (q : intrinsicFixedFieldFrobeniusQuotient K H J hJH e) + (hq : q ∈ + (closedSubgroupGenerated + ({σ.1} : Set + (intrinsicFixedFieldFrobeniusQuotient + K H J hJH e)) : Subgroup _)) : + intrinsicFrobeniusQuotientContinuousEquivAmbientFixedField + K H J hJH e q ∈ + (closedSubgroupGenerated + ({(intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ).1} : Set + (ambientFixedFieldFrobeniusQuotient + K H J hJH)) : Subgroup _) := by + let ξ := + intrinsicFrobeniusQuotientContinuousEquivAmbientFixedField + K H J hJH e + let σH := + intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ + let ξHom := + ContinuousMonoidHom.toContinuousMonoidHom ξ + have hmap := + map_mem_closedSubgroupGenerated_singleton + ξHom σ.1 hq + change + ξ q ∈ + (closedSubgroupGenerated + ({ξ σ.1} : Set + (ambientFixedFieldFrobeniusQuotient + K H J hJH)) : Subgroup _) at hmap + have hξσ : ξ σ.1 = σH.1 := + (intrinsicFrobeniusElementToAmbientFixedField_val + K H J hJH e σ).symm + simpa only [hξσ] using hmap + +/-- A continuous multiplicative equivalence reflects membership in the closed +subgroup generated by a singleton, after identifying both the generator and +the tested element. -/ +theorem + continuousMulEquiv_preimage_mem_closedSubgroupGenerated_singleton_of_eq + {G₁ G₂ : Type*} + [Group G₁] [TopologicalSpace G₁] [IsTopologicalGroup G₁] + [Group G₂] [TopologicalSpace G₂] [IsTopologicalGroup G₂] + (ξ : G₁ ≃ₜ* G₂) (x q : G₁) (x' q' : G₂) + (hx : ξ x = x') (hq : ξ q = q') + (h : q' ∈ + (closedSubgroupGenerated ({x'} : Set G₂) : Subgroup G₂)) : + q ∈ + (closedSubgroupGenerated ({x} : Set G₁) : Subgroup G₁) := by + subst x' + subst q' + have hmap := + map_mem_closedSubgroupGenerated_singleton + (ContinuousMonoidHom.toContinuousMonoidHom ξ.symm) + (ξ x) h + change + ξ.symm (ξ q) ∈ + (closedSubgroupGenerated + ({ξ.symm (ξ x)} : Set G₁) : Subgroup G₁) at hmap + simpa only [ξ.symm_apply_apply] using hmap + +/-- The canonical fixed-field quotient equivalence pulls the ambient +Frobenius closure back into the intrinsic Frobenius closure. -/ +theorem ambientFixedFieldFrobeniusClosure_le_intrinsicFixedField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] + (e : intrinsicFixedFieldSeparableClosureEquiv K H) + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) + (q : intrinsicFixedFieldFrobeniusQuotient K H J hJH e) + (hq : + intrinsicFrobeniusQuotientContinuousEquivAmbientFixedField + K H J hJH e q ∈ + (closedSubgroupGenerated + ({(intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ).1} : Set + (ambientFixedFieldFrobeniusQuotient + K H J hJH)) : Subgroup _)) : + q ∈ + (closedSubgroupGenerated + ({σ.1} : Set _) : Subgroup _) := by + let ξ := + intrinsicFrobeniusQuotientContinuousEquivAmbientFixedField + K H J hJH e + let σH := + intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ + have hξσ : ξ σ.1 = σH.1 := + (intrinsicFrobeniusElementToAmbientFixedField_val + K H J hJH e σ).symm + have hξq : ξ q = ξ q := rfl + exact + continuousMulEquiv_preimage_mem_closedSubgroupGenerated_singleton_of_eq + ξ σ.1 q σH.1 (ξ q) hξσ hξq hq + +/-- The canonical fixed-field quotient equivalence identifies the intrinsic +and ambient Frobenius closures. -/ +theorem intrinsicFrobeniusClosure_iff_ambientFixedField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] + (e : intrinsicFixedFieldSeparableClosureEquiv K H) + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) + (q : intrinsicFixedFieldFrobeniusQuotient K H J hJH e) : + q ∈ + (closedSubgroupGenerated + ({σ.1} : Set + (intrinsicFixedFieldFrobeniusQuotient + K H J hJH e)) : Subgroup _) ↔ + intrinsicFrobeniusQuotientContinuousEquivAmbientFixedField + K H J hJH e q ∈ + (closedSubgroupGenerated + ({(intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ).1} : Set + (ambientFixedFieldFrobeniusQuotient + K H J hJH)) : Subgroup _) := by + exact + ⟨intrinsicFixedFieldFrobeniusClosure_le_ambientFixedField + K H J hJH e σ q, + ambientFixedFieldFrobeniusClosure_le_intrinsicFixedField + K H J hJH e σ q⟩ + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusFixedField.lean new file mode 100644 index 0000000000..f071a1ec9e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusFixedField.lean @@ -0,0 +1,941 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusClosure +/-! +# Intrinsic Frobenius fixed-field transport + +This module transports Frobenius-fixed subgroups and fixed fields through +the intrinsic-to-ambient closure equivalence. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open scoped ValuativeRel + +/-- Intrinsic Frobenius-fixed elements map to ambient Frobenius-fixed +elements under the fixed-field Galois-group equivalence. -/ +theorem intrinsicFrobeniusFixedSubgroup_le_ambientFixedField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] + (e : intrinsicFixedFieldSeparableClosureEquiv K H) + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + letI : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + letI : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + letI : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let σH := + intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ + ∀ τ : (intrinsicAbstractBase F).toSubgroup, + let τRF : RF.field.toSubgroup := + ⟨τ.1, by + simpa only [RF, intrinsicFiniteAbstractBase, + FiniteAbstractField.toFiniteResidueAbstractField] using τ.2⟩ + let ψ := intrinsicBaseEquivAmbientFixedField K H e + let ψτRH : RH.field.toSubgroup := + ⟨(ψ τ).1, by + simpa only [RH, + FiniteAbstractField.toFiniteResidueAbstractField] using + (ψ τ).2⟩ + τRF ∈ (localResidueDatum F).frobeniusFixedSubgroupWithin + RF EI.field EI.below σ → + ψτRH ∈ (localResidueDatum K).frobeniusFixedSubgroupWithin + RH J hJH σH := by + dsimp only + let F := abstractFixedField K (SeparableClosure K) H.field + let : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + let : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + let : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + let : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + let : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + let : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let σH := + intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ + intro τ + let τRF : RF.field.toSubgroup := + ⟨τ.1, by + simpa only [RF, intrinsicFiniteAbstractBase, + FiniteAbstractField.toFiniteResidueAbstractField] using τ.2⟩ + let ψ := intrinsicBaseEquivAmbientFixedField K H e + let ψτRH : RH.field.toSubgroup := + ⟨(ψ τ).1, by + simpa only [RH, + FiniteAbstractField.toFiniteResidueAbstractField] using + (ψ τ).2⟩ + intro hτ + have hτclosureRF : + QuotientGroup.mk τRF ∈ + ((localResidueDatum F).frobeniusClosure + RF EI.field EI.below σ).toSubgroup := + ((localResidueDatum F).mem_frobeniusFixedSubgroupWithin_iff + RF EI.field EI.below σ τRF).1 hτ + let ξ := + intrinsicFrobeniusQuotientContinuousEquivAmbientFixedField + K H J hJH e + let qτ : intrinsicFixedFieldFrobeniusQuotient K H J hJH e := + QuotientGroup.mk τ + let qH : ambientFixedFieldFrobeniusQuotient K H J hJH := + QuotientGroup.mk (ψ τ) + have hτclosure : + qτ ∈ + (closedSubgroupGenerated + ({σ.1} : Set + (intrinsicFixedFieldFrobeniusQuotient + K H J hJH e)) : Subgroup _) := by + exact + (intrinsicFixedFieldFrobeniusClosure_mem_iff + K H J hJH e σ τ).1 hτclosureRF + have hξq : ξ qτ = qH := by + rfl + have htransport : + qH ∈ + (closedSubgroupGenerated + ({σH.1} : Set + (ambientFixedFieldFrobeniusQuotient + K H J hJH)) : Subgroup _) := by + rw [← hξq] + exact + intrinsicFixedFieldFrobeniusClosure_le_ambientFixedField + K H J hJH e σ qτ hτclosure + have hψclosureRH : + QuotientGroup.mk ψτRH ∈ + ((localResidueDatum K).frobeniusClosure + RH J hJH σH).toSubgroup := by + exact + (ambientFixedFieldFrobeniusClosure_mem_iff + K H J hJH e σ τ).2 htransport + exact + ((localResidueDatum K).mem_frobeniusFixedSubgroupWithin_iff + RH J hJH σH ψτRH).2 hψclosureRH + +/-- Ambient Frobenius-fixed elements pull back to intrinsic Frobenius-fixed +elements under the fixed-field Galois-group equivalence. -/ +theorem ambientFixedFieldFrobeniusFixedSubgroup_le_intrinsic + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] + (e : intrinsicFixedFieldSeparableClosureEquiv K H) + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + letI : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + letI : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + letI : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let σH := + intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ + ∀ τ : (intrinsicAbstractBase F).toSubgroup, + let τRF : RF.field.toSubgroup := + ⟨τ.1, by + simpa only [RF, intrinsicFiniteAbstractBase, + FiniteAbstractField.toFiniteResidueAbstractField] using τ.2⟩ + let ψ := intrinsicBaseEquivAmbientFixedField K H e + let ψτRH : RH.field.toSubgroup := + ⟨(ψ τ).1, by + simpa only [RH, + FiniteAbstractField.toFiniteResidueAbstractField] using + (ψ τ).2⟩ + ψτRH ∈ (localResidueDatum K).frobeniusFixedSubgroupWithin + RH J hJH σH → + τRF ∈ (localResidueDatum F).frobeniusFixedSubgroupWithin + RF EI.field EI.below σ := by + dsimp only + let F := abstractFixedField K (SeparableClosure K) H.field + let : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + let : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + let : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + let : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + let : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + let : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let σH := + intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ + intro τ + let τRF : RF.field.toSubgroup := + ⟨τ.1, by + simpa only [RF, intrinsicFiniteAbstractBase, + FiniteAbstractField.toFiniteResidueAbstractField] using τ.2⟩ + let ψ := intrinsicBaseEquivAmbientFixedField K H e + let ψτRH : RH.field.toSubgroup := + ⟨(ψ τ).1, by + simpa only [RH, + FiniteAbstractField.toFiniteResidueAbstractField] using + (ψ τ).2⟩ + intro hψτ + have hψclosureRH : + QuotientGroup.mk ψτRH ∈ + ((localResidueDatum K).frobeniusClosure + RH J hJH σH).toSubgroup := + ((localResidueDatum K).mem_frobeniusFixedSubgroupWithin_iff + RH J hJH σH ψτRH).1 hψτ + let ξ := + intrinsicFrobeniusQuotientContinuousEquivAmbientFixedField + K H J hJH e + let qτ : intrinsicFixedFieldFrobeniusQuotient K H J hJH e := + QuotientGroup.mk τ + let qH : ambientFixedFieldFrobeniusQuotient K H J hJH := + QuotientGroup.mk (ψ τ) + have hqHclosure : + qH ∈ + (closedSubgroupGenerated + ({σH.1} : Set + (ambientFixedFieldFrobeniusQuotient + K H J hJH)) : Subgroup _) := by + exact + (ambientFixedFieldFrobeniusClosure_mem_iff + K H J hJH e σ τ).1 hψclosureRH + have hξq : ξ qτ = qH := by + rfl + have hqHclosure' : + ξ qτ ∈ + (closedSubgroupGenerated + ({σH.1} : Set + (ambientFixedFieldFrobeniusQuotient + K H J hJH)) : Subgroup _) := by + rw [hξq] + exact hqHclosure + have htransport : + qτ ∈ + (closedSubgroupGenerated + ({σ.1} : Set + (intrinsicFixedFieldFrobeniusQuotient + K H J hJH e)) : Subgroup _) := by + exact + ambientFixedFieldFrobeniusClosure_le_intrinsicFixedField + K H J hJH e σ qτ hqHclosure' + have hτclosureRF : + QuotientGroup.mk τRF ∈ + ((localResidueDatum F).frobeniusClosure + RF EI.field EI.below σ).toSubgroup := by + exact + (intrinsicFixedFieldFrobeniusClosure_mem_iff + K H J hJH e σ τ).2 htransport + exact + ((localResidueDatum F).mem_frobeniusFixedSubgroupWithin_iff + RF EI.field EI.below σ τRF).2 hτclosureRF + +/-- The image of the intrinsic Frobenius fixed field is contained in the +ambient Frobenius fixed field. -/ +theorem map_intrinsicFrobeniusFixedField_le_ambientFixedField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] + (e : intrinsicFixedFieldSeparableClosureEquiv K H) + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + letI : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + letI : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + letI : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let σH := + intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ + let SF := + (localResidueDatum F).frobeniusFixedField + RF EI.field EI.below σ + let SH := + (localResidueDatum K).frobeniusFixedField + RH J hJH σH + let hSHH : SH.toSubgroup ≤ H.field.toSubgroup := by + simpa only [SH, RH, + FiniteAbstractField.toFiniteResidueAbstractField] using + (localResidueDatum K).frobeniusFixedField_le + RH J hJH σH + (abstractFixedField F (SeparableClosure F) SF).map e.toAlgHom ≤ + abstractRelativeFixedField K (SeparableClosure K) hSHH := by + dsimp only + let F := abstractFixedField K (SeparableClosure K) H.field + let : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + let : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + let : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + let : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + let : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + let : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let σH := + intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ + let SF := + (localResidueDatum F).frobeniusFixedField + RF EI.field EI.below σ + let SH := + (localResidueDatum K).frobeniusFixedField + RH J hJH σH + let hSHH : SH.toSubgroup ≤ H.field.toSubgroup := by + simpa only [SH, RH, + FiniteAbstractField.toFiniteResidueAbstractField] using + (localResidueDatum K).frobeniusFixedField_le + RH J hJH σH + let ψ := intrinsicBaseEquivAmbientFixedField K H e + intro x hx + rw [IntermediateField.mem_map] at hx + rcases hx with ⟨y, hy, rfl⟩ + change e y ∈ IntermediateField.fixedField SH.toSubgroup + rw [IntermediateField.mem_fixedField_iff] + intro ρ hρ + let ρH : H.field.toSubgroup := ⟨ρ, hSHH hρ⟩ + let ρRH : RH.field.toSubgroup := + ⟨ρ, by + simpa only [RH, + FiniteAbstractField.toFiniteResidueAbstractField] using + hSHH hρ⟩ + have hρinternalRH : + ρRH ∈ (localResidueDatum K).frobeniusFixedSubgroupWithin + RH J hJH σH := by + rcases + ((localResidueDatum K).mem_frobeniusFixedField_iff + RH J hJH σH ρ).1 hρ with + ⟨k, hk, hkρ⟩ + have hkeq : k = ρRH := by + apply Subtype.ext + exact hkρ + simpa only [hkeq] using hk + let τ : + (intrinsicAbstractBase F).toSubgroup := + ψ.symm ρH + have hψ : ψ τ = ρH := + ψ.apply_symm_apply ρH + let τRF : RF.field.toSubgroup := + ⟨τ.1, by + simpa only [RF, intrinsicFiniteAbstractBase, + FiniteAbstractField.toFiniteResidueAbstractField] using τ.2⟩ + let ψτRH : RH.field.toSubgroup := + ⟨(ψ τ).1, by + simpa only [RH, + FiniteAbstractField.toFiniteResidueAbstractField] using + (ψ τ).2⟩ + have hψτRH : ψτRH = ρRH := by + apply Subtype.ext + exact congrArg Subtype.val hψ + have hψinternalRH : + ψτRH ∈ (localResidueDatum K).frobeniusFixedSubgroupWithin + RH J hJH σH := by + rw [hψτRH] + exact hρinternalRH + have hτinternalRF : + τRF ∈ (localResidueDatum F).frobeniusFixedSubgroupWithin + RF EI.field EI.below σ := + ambientFixedFieldFrobeniusFixedSubgroup_le_intrinsic + K H J hJH e σ τ hψinternalRH + have hτSF : τ.1 ∈ SF.toSubgroup := by + exact + ((localResidueDatum F).mem_frobeniusFixedField_iff + RF EI.field EI.below σ τ.1).2 + ⟨τRF, hτinternalRF, rfl⟩ + have hyfix : τ.1 y = y := + (IntermediateField.mem_fixedField_iff SF.toSubgroup y).1 + hy τ.1 hτSF + have hρeq : (ψ τ).1 = ρ := + congrArg Subtype.val hψ + calc + ρ (e y) = (ψ τ).1 (e y) := by rw [hρeq] + _ = e (τ.1 y) := by + change e (τ.1 (e.symm (e y))) = e (τ.1 y) + exact + congrArg (fun z => e (τ.1 z)) + (e.symm_apply_apply y) + _ = e y := congrArg e hyfix +/-- The ambient Frobenius fixed field is contained in the image of the +intrinsic Frobenius fixed field. -/ +theorem ambientFixedField_le_map_intrinsicFrobeniusFixedField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] + (e : intrinsicFixedFieldSeparableClosureEquiv K H) + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + letI : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + letI : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + letI : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let σH := + intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ + let SF := + (localResidueDatum F).frobeniusFixedField + RF EI.field EI.below σ + let SH := + (localResidueDatum K).frobeniusFixedField + RH J hJH σH + let hSHH : SH.toSubgroup ≤ H.field.toSubgroup := by + simpa only [SH, RH, + FiniteAbstractField.toFiniteResidueAbstractField] using + (localResidueDatum K).frobeniusFixedField_le + RH J hJH σH + abstractRelativeFixedField K (SeparableClosure K) hSHH ≤ + (abstractFixedField F (SeparableClosure F) SF).map e.toAlgHom := by + dsimp only + let F := abstractFixedField K (SeparableClosure K) H.field + let : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + let : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + let : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + let : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + let : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + let : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let σH := + intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ + let SF := + (localResidueDatum F).frobeniusFixedField + RF EI.field EI.below σ + let SH := + (localResidueDatum K).frobeniusFixedField + RH J hJH σH + let hSHH : SH.toSubgroup ≤ H.field.toSubgroup := by + simpa only [SH, RH, + FiniteAbstractField.toFiniteResidueAbstractField] using + (localResidueDatum K).frobeniusFixedField_le + RH J hJH σH + let ψ := intrinsicBaseEquivAmbientFixedField K H e + intro x hx + change + ∃ y ∈ abstractFixedField F (SeparableClosure F) SF, + e y = x + refine ⟨e.symm x, ?_, e.apply_symm_apply x⟩ + change e.symm x ∈ IntermediateField.fixedField SF.toSubgroup + refine + (IntermediateField.mem_fixedField_iff + SF.toSubgroup (e.symm x)).2 ?_ + intro τ₀ hτ₀ + let τ : + (intrinsicAbstractBase F).toSubgroup := + (intrinsicAbstractBaseEquivAbsolute F).symm τ₀ + let τRF : RF.field.toSubgroup := + ⟨τ.1, by + simpa only [RF, intrinsicFiniteAbstractBase, + FiniteAbstractField.toFiniteResidueAbstractField] using τ.2⟩ + have hτinternalRF : + τRF ∈ (localResidueDatum F).frobeniusFixedSubgroupWithin + RF EI.field EI.below σ := by + have hτSF : τRF.1 ∈ SF.toSubgroup := by + simpa only [τRF, τ, + intrinsicAbstractBaseEquivAbsolute_symm_apply_val] using hτ₀ + have hτsub : + τRF ∈ extensionSubgroup RF.field + ((localResidueDatum F).frobeniusFixedField + RF EI.field EI.below σ) + ((localResidueDatum F).frobeniusFixedField_le + RF EI.field EI.below σ) := hτSF + simpa only [(localResidueDatum F).extensionSubgroup_frobeniusFixedField + RF EI.field EI.below σ] using hτsub + let ρRH : RH.field.toSubgroup := + ⟨(ψ τ).1, by + simpa only [RH, + FiniteAbstractField.toFiniteResidueAbstractField] using + (ψ τ).2⟩ + have hρinternalRH : + ρRH ∈ (localResidueDatum K).frobeniusFixedSubgroupWithin + RH J hJH σH := by + exact + intrinsicFrobeniusFixedSubgroup_le_ambientFixedField + K H J hJH e σ τ hτinternalRF + have hρSH : (ψ τ).1 ∈ SH.toSubgroup := by + exact + ((localResidueDatum K).mem_frobeniusFixedField_iff + RH J hJH σH ρRH.1).2 + ⟨ρRH, hρinternalRH, rfl⟩ + have hxfix : (ψ τ).1 x = x := + (IntermediateField.mem_fixedField_iff SH.toSubgroup x).1 + hx (ψ τ).1 hρSH + apply e.injective + calc + e (τ₀ (e.symm x)) = e (τ.1 (e.symm x)) := by + simp only [τ, + intrinsicAbstractBaseEquivAbsolute_symm_apply_val] + _ = (ψ τ).1 x := by + change e (τ.1 (e.symm x)) = + e (τ.1 (e.symm x)) + rfl + _ = x := hxfix + _ = e (e.symm x) := (e.apply_symm_apply x).symm + +/-- The image of the intrinsic Frobenius fixed field is exactly the ambient +Frobenius fixed field. -/ +theorem map_intrinsicFrobeniusFixedField_eq_ambientFixedField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] + (e : intrinsicFixedFieldSeparableClosureEquiv K H) + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + letI : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + letI : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + letI : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let σH := + intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ + let SF := + (localResidueDatum F).frobeniusFixedField + RF EI.field EI.below σ + let SH := + (localResidueDatum K).frobeniusFixedField + RH J hJH σH + let hSHH : SH.toSubgroup ≤ H.field.toSubgroup := by + simpa only [SH, RH, + FiniteAbstractField.toFiniteResidueAbstractField] using + (localResidueDatum K).frobeniusFixedField_le + RH J hJH σH + (abstractFixedField F (SeparableClosure F) SF).map e.toAlgHom = + abstractRelativeFixedField K (SeparableClosure K) hSHH := by + exact le_antisymm + (map_intrinsicFrobeniusFixedField_le_ambientFixedField + K H J hJH e σ) + (ambientFixedField_le_map_intrinsicFrobeniusFixedField + K H J hJH e σ) + +/-- The intrinsic Frobenius fixed field is canonically equivalent, over the +intrinsic base field, to the corresponding ambient Frobenius fixed field. -/ +noncomputable def + intrinsicFrobeniusFixedFieldEquivAmbientFixedField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] + (e : intrinsicFixedFieldSeparableClosureEquiv K H) + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + letI : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + letI : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + letI : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let σH := + intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ + let SF := + (localResidueDatum F).frobeniusFixedField + RF EI.field EI.below σ + let SH := + (localResidueDatum K).frobeniusFixedField + RH J hJH σH + let hSHH : SH.toSubgroup ≤ H.field.toSubgroup := by + simpa only [SH, RH, + FiniteAbstractField.toFiniteResidueAbstractField] using + (localResidueDatum K).frobeniusFixedField_le + RH J hJH σH + @AlgEquiv F + (abstractFixedField F (SeparableClosure F) SF) + (abstractRelativeFixedField K (SeparableClosure K) hSHH) + _ _ _ + (abstractFixedField F (SeparableClosure F) SF).algebra + (abstractRelativeFixedField K (SeparableClosure K) hSHH).algebra := by + dsimp only + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + letI : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + letI : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + letI : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let σH := + intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ + let SF := + (localResidueDatum F).frobeniusFixedField + RF EI.field EI.below σ + let SH := + (localResidueDatum K).frobeniusFixedField + RH J hJH σH + let hSHH : SH.toSubgroup ≤ H.field.toSubgroup := by + simpa only [SH, RH, + FiniteAbstractField.toFiniteResidueAbstractField] using + (localResidueDatum K).frobeniusFixedField_le + RH J hJH σH + let SFI := abstractFixedField F (SeparableClosure F) SF + let SHI := abstractRelativeFixedField K (SeparableClosure K) hSHH + let eSF : + @AlgEquiv F SFI (SFI.map e.toAlgHom) + _ _ _ SFI.algebra (SFI.map e.toAlgHom).algebra := + IntermediateField.equivMap SFI e.toAlgHom + let eMap : + @AlgEquiv F (SFI.map e.toAlgHom) SHI + _ _ _ (SFI.map e.toAlgHom).algebra SHI.algebra := + IntermediateField.equivOfEq + (map_intrinsicFrobeniusFixedField_eq_ambientFixedField + K H J hJH e σ) + exact + @AlgEquiv.trans F SFI (SFI.map e.toAlgHom) SHI + _ _ _ _ + SFI.algebra + (SFI.map e.toAlgHom).algebra + SHI.algebra + eSF eMap + +/-- On underlying elements, the canonical Frobenius fixed-field equivalence +is the restriction of the chosen separable-closure equivalence. -/ +@[simp] +theorem + intrinsicFrobeniusFixedFieldEquivAmbientFixedField_apply_val + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] + (e : intrinsicFixedFieldSeparableClosureEquiv K H) + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) + (x : + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + letI : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + letI : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + letI : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let SF := + (localResidueDatum F).frobeniusFixedField + RF EI.field EI.below σ + abstractFixedField F (SeparableClosure F) SF) : + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + letI : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + letI : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + letI : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + let σH := + intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ + let _SF := + (localResidueDatum F).frobeniusFixedField + RF EI.field EI.below σ + let SH := + (localResidueDatum K).frobeniusFixedField + RH J hJH σH + let hSHH : SH.toSubgroup ≤ H.field.toSubgroup := by + simpa only [SH, RH, + FiniteAbstractField.toFiniteResidueAbstractField] using + (localResidueDatum K).frobeniusFixedField_le + RH J hJH σH + ((intrinsicFrobeniusFixedFieldEquivAmbientFixedField + K H J hJH e σ x : + abstractRelativeFixedField K (SeparableClosure K) hSHH) : + SeparableClosure K) = + e (x : SeparableClosure F) := by + rfl + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusQuotientTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusQuotientTransport.lean new file mode 100644 index 0000000000..7ce6efc3aa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusQuotientTransport.lean @@ -0,0 +1,485 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport +/-! +# Intrinsic Frobenius quotient transport + +This module constructs the intrinsic-to-ambient quotient transport and +maps Frobenius elements before the closure comparisons. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open scoped ValuativeRel + +/-- The chosen equivalence of separable closures induces a continuous +multiplicative equivalence from the intrinsic absolute-base subgroup of the +finite fixed field to its ambient fixed subgroup. -/ +noncomputable def + intrinsicBaseContinuousEquivAmbientFixedField + (K : Type) [Field K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (e : intrinsicFixedFieldSeparableClosureEquiv K H) : + (intrinsicAbstractBase + (abstractFixedField K (SeparableClosure K) H.field)).toSubgroup ≃ₜ* + H.field.toSubgroup := by + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + letI : CompactSpace (intrinsicAbstractBase F).toSubgroup := + isCompact_iff_compactSpace.mp + (intrinsicAbstractBase F).isClosed'.isCompact + let ψ := intrinsicBaseEquivAmbientFixedField K H e + have hψ : Continuous ψ := + intrinsicBaseEquivAmbientFixedField_continuous K H e + exact + { toMulEquiv := ψ + continuous_toFun := hψ + continuous_invFun := + hψ.continuous_symm_of_equiv_compact_to_t2 } + +/-- Descend the continuous intrinsic-to-ambient base equivalence to the +quotients by the corresponding extension-inertia subgroups. -/ +noncomputable def + intrinsicFrobeniusQuotientContinuousEquivAmbientFixedField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] : + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + ∀ (e : SeparableClosure F ≃ₐ[F] SeparableClosure K), + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + letI : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + letI : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + letI : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + ((intrinsicAbstractBase F).toSubgroup ⧸ + (localResidueDatum F).extensionInertiaWithin + (intrinsicAbstractBase F) EI.field EI.below) ≃ₜ* + (H.field.toSubgroup ⧸ + (localResidueDatum K).extensionInertiaWithin + H.field J hJH) := by + dsimp only + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + intro e + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + letI : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + letI : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + letI : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + let ψ := intrinsicBaseContinuousEquivAmbientFixedField K H e + letI : + ((localResidueDatum F).extensionInertiaWithin + (intrinsicAbstractBase F) EI.field EI.below).Normal := + inferInstance + letI : + ((localResidueDatum K).extensionInertiaWithin + H.field J hJH).Normal := + inferInstance + exact + LocalFieldTheory.QuotientGroup.continuousCongr + ((localResidueDatum F).extensionInertiaWithin + (intrinsicAbstractBase F) EI.field EI.below) + ((localResidueDatum K).extensionInertiaWithin + H.field J hJH) + ψ + (map_intrinsicExtensionInertia_eq_ambientFixedField + K H J hJH e) + +/-- The multiplicative equivalence from the intrinsic extension-inertia +quotient of a finite fixed field to the corresponding quotient inside the +ambient absolute Galois group, induced by the chosen equivalence of separable +closures. -/ +noncomputable def intrinsicFrobeniusQuotientEquivAmbientFixedField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] : + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + ∀ (e : SeparableClosure F ≃ₐ[F] SeparableClosure K), + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + letI : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + letI : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + letI : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + ((intrinsicAbstractBase F).toSubgroup ⧸ + (localResidueDatum F).extensionInertiaWithin + (intrinsicAbstractBase F) EI.field EI.below) ≃* + (H.field.toSubgroup ⧸ + (localResidueDatum K).extensionInertiaWithin + H.field J hJH) := by + dsimp only + intro e + exact + (intrinsicFrobeniusQuotientContinuousEquivAmbientFixedField + K H J hJH e).toMulEquiv + +/-- The fixed-field quotient equivalence sends the class of an intrinsic +automorphism to the class of the corresponding ambient automorphism. -/ +@[simp] +theorem intrinsicFrobeniusQuotientEquivAmbientFixedField_mk + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] : + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + ∀ (e : SeparableClosure F ≃ₐ[F] SeparableClosure K) + (τ : (intrinsicAbstractBase F).toSubgroup), + intrinsicFrobeniusQuotientEquivAmbientFixedField + K H J hJH e (QuotientGroup.mk τ) = + QuotientGroup.mk + (intrinsicBaseEquivAmbientFixedField K H e τ) := by + dsimp only + rintro e τ + exact LocalFieldTheory.QuotientGroup.continuousCongr_mk _ _ _ _ _ + +/-- The intrinsic-to-ambient Frobenius quotient equivalence preserves the +normalized extension degree of every quotient class. -/ +theorem + intrinsicFrobeniusQuotientEquivAmbientFixedField_normalizedDegree + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] : + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + ∀ (e : SeparableClosure F ≃ₐ[F] SeparableClosure K), + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + letI : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + letI : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + letI : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + ∀ (q : + (intrinsicAbstractBase F).toSubgroup ⧸ + (localResidueDatum F).extensionInertiaWithin + (intrinsicAbstractBase F) EI.field EI.below), + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + (localResidueDatum K).extensionNormalizedDegree + RH J hJH + (intrinsicFrobeniusQuotientEquivAmbientFixedField + K H J hJH e q) = + (localResidueDatum F).extensionNormalizedDegree + RF EI.field EI.below q := by + dsimp only + let F := abstractFixedField K (SeparableClosure K) H.field + let : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + intro e + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + let : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + let : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + let : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + let : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + let : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + intro q + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + refine Quotient.inductionOn' q ?_ + intro τ + let τRF : RF.field.toSubgroup := + ⟨τ.1, τ.2⟩ + let ψτRH : RH.field.toSubgroup := + ⟨(intrinsicBaseEquivAmbientFixedField K H e τ).1, + (intrinsicBaseEquivAmbientFixedField K H e τ).2⟩ + change + (localResidueDatum K).normalizedDegree RH ψτRH = + (localResidueDatum F).normalizedDegree RF τRF + have hψτRH : + ψτRH = + (abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H.field).symm + (AlgEquiv.autCongr e τ.1) := by + apply Subtype.ext + exact + intrinsicBaseEquivAmbientFixedField_apply_val + K H e τ + rw [hψτRH] + exact + (intrinsicBase_normalizedDegree_eq_ambientFixedField + K H e τ).symm + +/-- Intrinsic extension-inertia quotient classes whose normalized degree is a +strictly positive power of the canonical Frobenius degree. -/ +abbrev intrinsicFixedFieldFrobeniusElements + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] + (e : intrinsicFixedFieldSeparableClosureEquiv K H) := + let F := abstractFixedField K (SeparableClosure K) H.field + letI : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let E := abstractRelativeFixedField K (SeparableClosure K) hJH + letI : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + letI : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + letI : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + letI : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + letI : IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + let i : E →ₐ[F] SeparableClosure F := + e.symm.toAlgHom.comp E.val + let EI := finiteGaloisAbstractExtensionOfEmbedding F E i + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + {q : + (intrinsicAbstractBase F).toSubgroup ⧸ + (localResidueDatum F).extensionInertiaWithin + (intrinsicAbstractBase F) EI.field EI.below // + ∃ n : ℕ, 0 < n ∧ + (localResidueDatum F).extensionNormalizedDegree + RF EI.field EI.below q = + (Multiplicative.ofAdd (1 : ZHat)) ^ n} + +/-- The ambient fixed subgroup modulo the extension-inertia subgroup attached +to the given finite Galois extension. -/ +abbrev ambientFixedFieldFrobeniusQuotient + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [_hJnormal : (extensionSubgroup H.field J hJH).Normal] := + H.field.toSubgroup ⧸ + (localResidueDatum K).extensionInertiaWithin + H.field J hJH + +/-- The property that an ambient quotient class has normalized degree equal to +a strictly positive power of the canonical Frobenius degree. -/ +abbrev ambientFixedFieldFrobeniusProperty + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + (q : ambientFixedFieldFrobeniusQuotient K H J hJH) : Prop := + ∃ n : ℕ, 0 < n ∧ + (localResidueDatum K).extensionNormalizedDegree + (H.toFiniteResidueAbstractField (localResidueDatum K)) + J hJH q = + (Multiplicative.ofAdd (1 : ZHat)) ^ n + +/-- Ambient extension-inertia quotient classes satisfying the positive +Frobenius-degree property. -/ +abbrev ambientFixedFieldFrobeniusElements + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] := + {q : ambientFixedFieldFrobeniusQuotient K H J hJH // + ambientFixedFieldFrobeniusProperty K H J hJH q} + +/-- Transporting an intrinsic Frobenius element to the ambient quotient +preserves its positive Frobenius-degree property. -/ +theorem + intrinsicFrobeniusElementToAmbientFixedField_property + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] + (e : intrinsicFixedFieldSeparableClosureEquiv K H) + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + ambientFixedFieldFrobeniusProperty K H J hJH + (intrinsicFrobeniusQuotientEquivAmbientFixedField + K H J hJH e σ.1) := by + change ∃ n : ℕ, 0 < n ∧ + (localResidueDatum K).extensionNormalizedDegree + (H.toFiniteResidueAbstractField (localResidueDatum K)) + J hJH + (intrinsicFrobeniusQuotientEquivAmbientFixedField + K H J hJH e σ.1) = + (Multiplicative.ofAdd (1 : ZHat)) ^ n + rw [intrinsicFrobeniusQuotientEquivAmbientFixedField_normalizedDegree + K H J hJH e σ.1] + exact σ.2 + +/-- Transport an intrinsic fixed-field Frobenius element to the ambient +extension-inertia quotient, together with its positive Frobenius-degree +property. -/ +noncomputable def + intrinsicFrobeniusElementToAmbientFixedField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] + (e : intrinsicFixedFieldSeparableClosureEquiv K H) + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + ambientFixedFieldFrobeniusElements K H J hJH := by + exact + ⟨intrinsicFrobeniusQuotientEquivAmbientFixedField + K H J hJH e σ.1, + intrinsicFrobeniusElementToAmbientFixedField_property + K H J hJH e σ⟩ + +/-- The quotient class underlying a transported intrinsic Frobenius element is +the image under the intrinsic-to-ambient quotient equivalence. -/ +@[simp] +theorem intrinsicFrobeniusElementToAmbientFixedField_val + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] + (e : intrinsicFixedFieldSeparableClosureEquiv K H) + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + (intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ).1 = + intrinsicFrobeniusQuotientEquivAmbientFixedField + K H J hJH e σ.1 := by + rfl + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean new file mode 100644 index 0000000000..0f774c5fb2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean @@ -0,0 +1,715 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.GroupTheory.Abelianization.Defs +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeComparison +/-! +# Norm--restriction for local Artin maps + +This module proves norm--restriction naturality for actual finite abelian local Artin maps. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open scoped IsMulCommutative ValuativeRel + +/-- A compatible restriction of concrete embedded Galois actions induces the +corresponding restriction map on ambient finite quotient representatives. -/ +theorem AmbientEmbeddedFixedFieldPresentation.quotientRestriction + (K K' L L' : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field K'] [ValuativeRel K'] [TopologicalSpace K'] + [IsNonarchimedeanLocalField K'] + [Field L] [Field L'] + [Algebra K K'] [Algebra K L] [Algebra K L'] + [Algebra K' L'] [Algebra L L'] + [IsScalarTower K K' L'] + [FiniteDimensional K K'] [Algebra.IsSeparable K K'] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation K')] + [FiniteDimensional K L] [IsAbelianGalois K L] + [FiniteDimensional K' L'] [IsAbelianGalois K' L'] + {jLower : L →ₐ[K] SeparableClosure K} + {jUpper : L' →ₐ[K] SeparableClosure K} + (lower : AmbientEmbeddedFixedFieldPresentation K K L jLower) + (upper : AmbientEmbeddedFixedFieldPresentation K K' L' jUpper) + (hH'H : upper.base.field.toSubgroup ≤ lower.base.field.toSubgroup) + (hJ'J : upper.extension.field.toSubgroup ≤ + lower.extension.field.toSubgroup) + [hJnormal : + (extensionSubgroup lower.base.field lower.extension.field + lower.extension.below).Normal] + [_hJfinite : Finite + (lower.base.field.toSubgroup ⧸ + extensionSubgroup lower.base.field lower.extension.field + lower.extension.below)] + [hJ'normal : + (extensionSubgroup upper.base.field upper.extension.field + upper.extension.below).Normal] + [_hJ'finite : Finite + (upper.base.field.toSubgroup ⧸ + extensionSubgroup upper.base.field upper.extension.field + upper.extension.below)] + [_hHabsolute : Finite + ((baseField Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + lower.base.field (le_baseField lower.base.field))] + [_hH'absolute : Finite + ((baseField Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + upper.base.field (le_baseField upper.base.field))] + [_hH'finite : Finite + (lower.base.field.toSubgroup ⧸ + extensionSubgroup lower.base.field upper.base.field hH'H)] + (restrictActual : Gal(L'/K') →* Gal(L/K)) + (hbase : ∀ x : L, + jUpper (algebraMap L L' x) = jLower x) + (hcompat : ∀ (τ : Gal(L'/K')) (x : L), + jLower (restrictActual τ x) = + jUpper (τ (algebraMap L L' x))) + (z : Abelianization + (upper.base.field.toSubgroup ⧸ + extensionSubgroup upper.base.field upper.extension.field + upper.extension.below)) : + restrictActual + ((Abelianization.equivOfComm (H := Gal(L'/K'))).symm + ((upper.extension.extensionQuotientMulEquiv.symm.trans + upper.quotientEquiv).abelianizationCongr z)) = + (Abelianization.equivOfComm (H := Gal(L/K))).symm + ((lower.extension.extensionQuotientMulEquiv.symm.trans + lower.quotientEquiv).abelianizationCongr + (normResidueNaturalityAbelianizedRestriction + lower.base.field upper.base.field + lower.extension.field upper.extension.field + lower.extension.below upper.extension.below + hH'H hJ'J z)) := by + let qLower := + lower.extension.extensionQuotientMulEquiv.symm.trans + lower.quotientEquiv + let qUpper := + upper.extension.extensionQuotientMulEquiv.symm.trans + upper.quotientEquiv + obtain ⟨q, rfl⟩ := QuotientGroup.mk_surjective z + obtain ⟨sigma, rfl⟩ := QuotientGroup.mk_surjective q + change + restrictActual + ((Abelianization.equivOfComm (H := Gal(L'/K'))).symm + (qUpper.abelianizationCongr + (Abelianization.of (QuotientGroup.mk sigma)))) = + (Abelianization.equivOfComm (H := Gal(L/K))).symm + (qLower.abelianizationCongr + (normResidueNaturalityAbelianizedRestriction + lower.base.field upper.base.field + lower.extension.field upper.extension.field + lower.extension.below upper.extension.below + hH'H hJ'J (Abelianization.of (QuotientGroup.mk sigma)))) + rw [normResidueNaturalityAbelianizedRestriction_of_mk, + abelianizationCongr_of, abelianizationCongr_of] + change + restrictActual (qUpper (QuotientGroup.mk sigma)) = + qLower (QuotientGroup.mk (Subgroup.inclusion hH'H sigma)) + have hqUpper_mk : + qUpper (QuotientGroup.mk sigma) = + upper.quotientEquiv + (upper.extension.extensionQuotientMk sigma) := by + dsimp [qUpper] + have hmk : + upper.extension.extensionQuotientMulEquiv.symm + (QuotientGroup.mk sigma) = + upper.extension.extensionQuotientMk sigma := by + exact + upper.extension.extensionQuotientMulEquiv.symm_apply_eq.mpr + (upper.extension.extensionQuotientMk_apply sigma).symm + rw [hmk] + have hqLower_mk : + qLower (QuotientGroup.mk (Subgroup.inclusion hH'H sigma)) = + lower.quotientEquiv + (lower.extension.extensionQuotientMk + (Subgroup.inclusion hH'H sigma)) := by + dsimp [qLower] + have hmk : + lower.extension.extensionQuotientMulEquiv.symm + (QuotientGroup.mk (Subgroup.inclusion hH'H sigma)) = + lower.extension.extensionQuotientMk + (Subgroup.inclusion hH'H sigma) := by + exact + lower.extension.extensionQuotientMulEquiv.symm_apply_eq.mpr + (lower.extension.extensionQuotientMk_apply + (Subgroup.inclusion hH'H sigma)).symm + rw [hmk] + apply AlgEquiv.ext + intro x + apply jLower.injective + calc + jLower + (restrictActual + (qUpper (QuotientGroup.mk sigma)) x) = + jUpper + ((qUpper (QuotientGroup.mk sigma)) + (algebraMap L L' x)) := + hcompat (qUpper (QuotientGroup.mk sigma)) x + _ = jUpper + (upper.quotientEquiv + (upper.extension.extensionQuotientMk sigma) + (algebraMap L L' x)) := by + rw [hqUpper_mk] + _ = sigma.1.1 + (jUpper (algebraMap L L' x)) := + upper.quotientEquiv_mk_apply sigma (algebraMap L L' x) + _ = (Subgroup.inclusion hH'H sigma).1.1 + (jLower x) := by + rw [hbase x] + change sigma.1.1 (jLower x) = sigma.1.1 (jLower x) + rfl + _ = jLower + (lower.quotientEquiv + (lower.extension.extensionQuotientMk + (Subgroup.inclusion hH'H sigma)) x) := + (lower.quotientEquiv_mk_apply + (Subgroup.inclusion hH'H sigma) x).symm + _ = jLower + (qLower (QuotientGroup.mk + (Subgroup.inclusion hH'H sigma)) x) := by + rw [hqLower_mk] + +/-- The actual abstract fixed-field norm-residue symbols commute with norm and +restriction through the canonical quotient equivalences of the presentations. -/ +theorem AmbientEmbeddedFixedFieldPresentation.fixedFieldNormResidueTransport + (K K' L L' : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field K'] [ValuativeRel K'] [TopologicalSpace K'] + [IsNonarchimedeanLocalField K'] + [Field L] [Field L'] + [Algebra K K'] [Algebra K L] [Algebra K L'] + [Algebra K' L'] [Algebra L L'] + [IsScalarTower K K' L'] [IsScalarTower K L L'] + [FiniteDimensional K K'] [Algebra.IsSeparable K K'] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation K')] + [FiniteDimensional K L] [IsAbelianGalois K L] + [FiniteDimensional K' L'] [IsAbelianGalois K' L'] + {jLower : L →ₐ[K] SeparableClosure K} + {jUpper : L' →ₐ[K] SeparableClosure K} + (lower : AmbientEmbeddedFixedFieldPresentation K K L jLower) + (upper : AmbientEmbeddedFixedFieldPresentation K K' L' jUpper) + (hH'H : upper.base.field.toSubgroup ≤ lower.base.field.toSubgroup) + (hJ'J : upper.extension.field.toSubgroup ≤ + lower.extension.field.toSubgroup) + [hJnormal : + (extensionSubgroup lower.base.field lower.extension.field + lower.extension.below).Normal] + [_hJfinite : Finite + (lower.base.field.toSubgroup ⧸ + extensionSubgroup lower.base.field lower.extension.field + lower.extension.below)] + [hJ'normal : + (extensionSubgroup upper.base.field upper.extension.field + upper.extension.below).Normal] + [_hJ'finite : Finite + (upper.base.field.toSubgroup ⧸ + extensionSubgroup upper.base.field upper.extension.field + upper.extension.below)] + [_hHabsolute : Finite + ((baseField Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + lower.base.field (le_baseField lower.base.field))] + [_hH'absolute : Finite + ((baseField Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + upper.base.field (le_baseField upper.base.field))] + [_hH'finite : Finite + (lower.base.field.toSubgroup ⧸ + extensionSubgroup lower.base.field upper.base.field hH'H)] + (hbase : ∀ x : L, + jUpper (algebraMap L L' x) = jLower x) + (a : K'ˣ) : + normResidueNaturalityAbelianizedRestriction + lower.base.field upper.base.field + lower.extension.field upper.extension.field + lower.extension.below upper.extension.below + hH'H hJ'J + ((upper.extension.extensionQuotientMulEquiv.symm.trans + upper.fixedFieldQuotientEquiv).abelianizationCongr.symm + (Additive.toMul + (abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + upper.base.field upper.extension.field + upper.extension.below + (Additive.ofMul + (Units.mapEquiv upper.baseEquiv.toMulEquiv a))))) = + (lower.extension.extensionQuotientMulEquiv.symm.trans + lower.fixedFieldQuotientEquiv).abelianizationCongr.symm + (Additive.toMul + (abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + lower.base.field lower.extension.field + lower.extension.below + (Additive.ofMul + (Units.mapEquiv lower.baseEquiv.toMulEquiv + (normUnits K K' a))))) := by + let H := lower.base.field + let H' := upper.base.field + let J := lower.extension.field + let J' := upper.extension.field + let hJH : J.toSubgroup ≤ H.toSubgroup := lower.extension.below + let hJ'H' : J'.toSubgroup ≤ H'.toSubgroup := upper.extension.below + let qActualLower := + lower.extension.extensionQuotientMulEquiv.symm.trans + lower.fixedFieldQuotientEquiv + let qActualUpper := + upper.extension.extensionQuotientMulEquiv.symm.trans + upper.fixedFieldQuotientEquiv + let FLower := + abstractFixedField K (SeparableClosure K) H + let phiLower : K ≃ₐ[K] FLower := + lower.baseEquiv + let FUpper := + abstractFixedField K (SeparableClosure K) H' + let : Algebra FLower FUpper := + RingHom.toAlgebra + (IntermediateField.inclusion + (abstractFixedField_le K (SeparableClosure K) hH'H)) + let phiUpper : K' ≃ₐ[K] FUpper := + upper.baseEquiv + have hphiComm : + RingHom.comp (algebraMap FLower FUpper) + phiLower.toRingEquiv.toRingHom = + RingHom.comp phiUpper.toRingEquiv.toRingHom + (algebraMap K K') := by + apply RingHom.ext + intro x + apply FUpper.val.injective + change + ((phiLower x : FLower) : SeparableClosure K) = + ((phiUpper (algebraMap K K' x) : FUpper) : SeparableClosure K) + rw [lower.baseEquiv_apply, upper.baseEquiv_apply, + lower.baseEmbedding_eq, upper.baseEmbedding_eq] + change + jLower (algebraMap K L x) = + jUpper (algebraMap K' L' (algebraMap K K' x)) + calc + jLower (algebraMap K L x) = + jUpper (algebraMap L L' (algebraMap K L x)) := + (hbase (algebraMap K L x)).symm + _ = jUpper (algebraMap K' L' (algebraMap K K' x)) := by + rw [← IsScalarTower.algebraMap_apply K L L', + ← IsScalarTower.algebraMap_apply K K' L'] + let aUpper : FUpperˣ := + Units.mapEquiv phiUpper.toMulEquiv a + let aLower : FLowerˣ := + Units.mapEquiv phiLower.toMulEquiv (normUnits K K' a) + have hbaseNorm : + abstractFixedFieldNormUnits + K (SeparableClosure K) H H' hH'H + (Additive.ofMul aUpper) = + Additive.ofMul aLower := by + exact + congrArg Additive.toMul + (normUnits_mapEquiv + K K' FLower FUpper + phiLower.toRingEquiv phiUpper.toRingEquiv + hphiComm a) + let symbolUpper := + abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H' J' hJ'H' + let symbolLower := + abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H J hJH + have hnaturality := + DFunLike.congr_fun + (abstractFixedFieldNormResidueSymbol_norm_restriction + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H H' J J' hJH hJ'H' hH'H hJ'J) + (Additive.ofMul aUpper) + have hrawActual : + normResidueNaturalityAbelianizedRestriction + H H' J J' hJH hJ'H' hH'H hJ'J + (qActualUpper.abelianizationCongr.symm + (Additive.toMul + (symbolUpper (Additive.ofMul aUpper)))) = + qActualLower.abelianizationCongr.symm + (Additive.toMul + (symbolLower (Additive.ofMul aLower))) := by + change + (abstractFixedFieldAbelianizedRestriction + K (SeparableClosure K) H H' J J' + hJH hJ'H' hH'H hJ'J) + (symbolUpper (Additive.ofMul aUpper)) = + symbolLower + (abstractFixedFieldNormUnits + K (SeparableClosure K) H H' hH'H + (Additive.ofMul aUpper)) at hnaturality + rw [hbaseNorm] at hnaturality + have hmul := congrArg Additive.toMul hnaturality + change + qActualLower.abelianizationCongr + (normResidueNaturalityAbelianizedRestriction + H H' J J' hJH hJ'H' hH'H hJ'J + (qActualUpper.abelianizationCongr.symm + (Additive.toMul + (symbolUpper (Additive.ofMul aUpper))))) = + Additive.toMul + (symbolLower (Additive.ofMul aLower)) at hmul + exact qActualLower.abelianizationCongr.eq_symm_apply.mpr hmul + simpa only [H, H', J, J', hJH, hJ'H', qActualLower, qActualUpper, + aUpper, aLower, symbolUpper, symbolLower] using + hrawActual + +/-- Canonical ambient fixed-field norm-residue values commute with restriction +and norm in an arbitrary finite square of nonarchimedean local fields. -/ +theorem ambientEmbeddedNormResidueElement_norm_restriction + (K K' L L' : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field K'] [ValuativeRel K'] [TopologicalSpace K'] + [IsNonarchimedeanLocalField K'] + [Field L] [Field L'] + [Algebra K K'] [Algebra K L] [Algebra K L'] + [Algebra K' L'] [Algebra L L'] + [IsScalarTower K K' L'] [IsScalarTower K L L'] + [FiniteDimensional K K'] [Algebra.IsSeparable K K'] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation K')] + [FiniteDimensional K L] [IsAbelianGalois K L] + [FiniteDimensional K' L'] [IsAbelianGalois K' L'] + (j : L' →ₐ[K] SeparableClosure K) + (eLower : + @AlgEquiv K (SeparableClosure K) (SeparableClosure K) + _ _ _ + (separableClosure K (AlgebraicClosure K)).algebra + (((j.comp (IsScalarTower.toAlgHom K L L')).comp + (IsScalarTower.toAlgHom K K L)).toRingHom.toAlgebra)) + (eUpper : + letI : Algebra K' (SeparableClosure K) := + (j.comp (IsScalarTower.toAlgHom K K' L')).toRingHom.toAlgebra + SeparableClosure K' ≃ₐ[K'] SeparableClosure K) + (a : K'ˣ) : + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)) + (ambientEmbeddedNormResidueElement K K' L' j eUpper a) = + ambientEmbeddedNormResidueElement K K L + (j.comp (IsScalarTower.toAlgHom K L L')) eLower + (normUnits K K' a) := by + let : FiniteDimensional K L' := + FiniteDimensional.trans K K' L' + let : Algebra.IsSeparable K L' := + Algebra.IsSeparable.trans K K' L' + let iUpper : K' →ₐ[K] SeparableClosure K := + j.comp (IsScalarTower.toAlgHom K K' L') + let jLower : L →ₐ[K] SeparableClosure K := + j.comp (IsScalarTower.toAlgHom K L L') + let iLower : K →ₐ[K] SeparableClosure K := + jLower.comp (IsScalarTower.toAlgHom K K L) + let lower := + ambientEmbeddedFixedFieldPresentation K K L jLower eLower + let upper := + ambientEmbeddedFixedFieldPresentation K K' L' j eUpper + let H := lower.base.field + let H' := upper.base.field + let J := lower.extension.field + let J' := upper.extension.field + have hRangeHH : + AlgHom.fieldRange iLower ≤ + AlgHom.fieldRange iUpper := by + intro x hx + rcases hx with ⟨y, rfl⟩ + refine ⟨algebraMap K K' y, ?_⟩ + change + j (algebraMap K' L' (algebraMap K K' y)) = + j (algebraMap L L' (algebraMap K L y)) + rw [← IsScalarTower.algebraMap_apply K K' L', + ← IsScalarTower.algebraMap_apply K L L'] + let hH'H : H'.toSubgroup ≤ H.toSubgroup := by + change upper.base.field.toSubgroup ≤ lower.base.field.toSubgroup + rw [lower.base_field_eq, upper.base_field_eq, + lower.baseEmbedding_eq, upper.baseEmbedding_eq] + change + (AlgHom.fieldRange iUpper).fixingSubgroup ≤ + (AlgHom.fieldRange iLower).fixingSubgroup + exact + (AlgHom.fieldRange iLower).fixingSubgroup_le + hRangeHH + have hRangeJJ : AlgHom.fieldRange jLower ≤ AlgHom.fieldRange j := + Set.range_comp_subset_range (algebraMap L L') j + let hJ'J : J'.toSubgroup ≤ J.toSubgroup := by + change upper.extension.field.toSubgroup ≤ lower.extension.field.toSubgroup + rw [lower.extension_field_eq, upper.extension_field_eq] + change + (AlgHom.fieldRange j).fixingSubgroup ≤ + (AlgHom.fieldRange jLower).fixingSubgroup + exact + (AlgHom.fieldRange jLower).fixingSubgroup_le + hRangeJJ + let hJH : J.toSubgroup ≤ H.toSubgroup := lower.extension.below + let hJ'H' : J'.toSubgroup ≤ H'.toSubgroup := upper.extension.below + let hJnormal := lower.extension.normal + let hJfinite := lower.extension.finite + let hJ'normal := upper.extension.normal + let hJ'finite := upper.extension.finite + let hHabsolute := lower.base.finite + let hH'absolute := upper.base.finite + let hH'finite : Finite + (H.toSubgroup ⧸ extensionSubgroup H H' hH'H) := by + let inclusion := + Subgroup.quotientSubgroupOfEmbeddingOfLE + H'.toSubgroup (le_baseField H) + exact Finite.of_injective inclusion inclusion.injective + let FLower := + abstractFixedField K (SeparableClosure K) H + let phiLower := lower.baseEquiv + let FUpper := + abstractFixedField K (SeparableClosure K) H' + let phiUpper := upper.baseEquiv + let restrictActual : + Gal(L'/K') →* Gal(L/K) := + (AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K) + have hcompat : ∀ (τ : Gal(L'/K')) (x : L), + jLower (restrictActual τ x) = + j (τ (algebraMap L L' x)) := by + intro τ x + exact congrArg j + (AlgEquiv.restrictNormal_commutes + ((AlgEquiv.restrictScalarsHom K) τ) L x) + have hbase : ∀ x : L, j (algebraMap L L' x) = jLower x := fun _ => rfl + let aUpper : FUpperˣ := + Units.mapEquiv phiUpper.toMulEquiv a + let aNorm := normUnits K K' a + let aLower : FLowerˣ := + Units.mapEquiv phiLower.toMulEquiv aNorm + let symbolUpper := + abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H' J' hJ'H' + let symbolLower := + abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H J hJH + let upperSymbolValue := + Additive.toMul + (symbolUpper (Additive.ofMul aUpper)) + let lowerSymbolValue := + Additive.toMul + (symbolLower (Additive.ofMul aLower)) + let upperQuotientValue := + upper.fixedFieldQuotientEquiv.abelianizationCongr.symm + upperSymbolValue + let lowerQuotientValue := + lower.fixedFieldQuotientEquiv.abelianizationCongr.symm + lowerSymbolValue + have hraw : + normResidueNaturalityAbelianizedRestriction + H H' J J' hJH hJ'H' hH'H hJ'J + ((upper.extension.extensionQuotientMulEquiv.symm.trans + upper.fixedFieldQuotientEquiv).abelianizationCongr.symm + upperSymbolValue) = + (lower.extension.extensionQuotientMulEquiv.symm.trans + lower.fixedFieldQuotientEquiv).abelianizationCongr.symm + lowerSymbolValue := by + simpa only [H, H', J, J', hJH, hJ'H', + aUpper, aLower, aNorm, symbolUpper, symbolLower, + upperSymbolValue, lowerSymbolValue] using + AmbientEmbeddedFixedFieldPresentation.fixedFieldNormResidueTransport + K K' L L' lower upper hH'H hJ'J + hbase a + have htarget + (z : Abelianization upper.extension.extensionQuotient) : + restrictActual + ((Abelianization.equivOfComm (H := Gal(L'/K'))).symm + (upper.quotientEquiv.abelianizationCongr z)) = + (Abelianization.equivOfComm (H := Gal(L/K))).symm + (lower.quotientEquiv.abelianizationCongr + (lower.extension.extensionQuotientMulEquiv.abelianizationCongr.symm + (normResidueNaturalityAbelianizedRestriction + H H' J J' hJH hJ'H' hH'H hJ'J + (upper.extension.extensionQuotientMulEquiv.abelianizationCongr + z)))) := by + simpa only [← abelianizationCongr_trans, + ← abelianizationCongr_symm, + MulEquiv.trans_apply, + MulEquiv.symm_apply_apply] using + AmbientEmbeddedFixedFieldPresentation.quotientRestriction + K K' L L' lower upper hH'H hJ'J restrictActual hbase hcompat + (upper.extension.extensionQuotientMulEquiv.abelianizationCongr z) + have hambient : + lower.extension.extensionQuotientMulEquiv.abelianizationCongr.symm + (normResidueNaturalityAbelianizedRestriction + H H' J J' hJH hJ'H' hH'H hJ'J + (upper.extension.extensionQuotientMulEquiv.abelianizationCongr + upperQuotientValue)) = + lowerQuotientValue := by + apply lower.extension.extensionQuotientMulEquiv.abelianizationCongr.symm_apply_eq.mpr + simpa only [← abelianizationCongr_trans, ← abelianizationCongr_symm, + MulEquiv.symm_trans_apply, MulEquiv.symm_symm, + upperQuotientValue, lowerQuotientValue] using hraw + have hupperEval : + upper.normResidueAbelianElement a = + upper.quotientEquiv.abelianizationCongr + upperQuotientValue := + upper.normResidueAbelianElement_apply a + have hlowerEval : + lower.normResidueAbelianElement aNorm = + lower.quotientEquiv.abelianizationCongr + lowerQuotientValue := + lower.normResidueAbelianElement_apply aNorm + let ambientUpper : Gal(L'/K') := + ambientEmbeddedNormResidueElement K K' L' j eUpper a + let ambientLower : Gal(L/K) := + ambientEmbeddedNormResidueElement K K L jLower eLower aNorm + have htransport : + restrictActual ambientUpper = ambientLower := by + dsimp only [ambientUpper, ambientLower, + ambientEmbeddedNormResidueElement, + ambientEmbeddedNormResidueAbelianElement] + change + restrictActual + ((Abelianization.equivOfComm (H := Gal(L'/K'))).symm + (upper.normResidueAbelianElement a)) = + (Abelianization.equivOfComm (H := Gal(L/K))).symm + (lower.normResidueAbelianElement aNorm) + rw [hupperEval, hlowerEval] + exact (htarget upperQuotientValue).trans + (congrArg (fun z => (Abelianization.equivOfComm (H := Gal(L/K))).symm + (lower.quotientEquiv.abelianizationCongr z)) hambient) + change + restrictActual ambientUpper = ambientLower + exact htransport + +/-- The actual finite abelian local Artin maps satisfy norm--restriction +naturality in an arbitrary finite square of nonarchimedean local fields. -/ +theorem abelianLocalArtinMonoidHom_norm_restriction + (K K' L L' : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field K'] [ValuativeRel K'] [TopologicalSpace K'] + [IsNonarchimedeanLocalField K'] + [Field L] [Field L'] + [Algebra K K'] [Algebra K L] [Algebra K L'] + [Algebra K' L'] [Algebra L L'] + [IsScalarTower K K' L'] [IsScalarTower K L L'] + [FiniteDimensional K K'] [Algebra.IsSeparable K K'] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation K')] + [FiniteDimensional K L] [IsAbelianGalois K L] + [FiniteDimensional K' L'] [IsAbelianGalois K' L'] : + ((AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K)).comp + (abelianLocalArtinMonoidHom K' L') = + (abelianLocalArtinMonoidHom K L).comp + (normUnits K K') := by + apply MonoidHom.ext + intro a + let : FiniteDimensional K L' := + FiniteDimensional.trans K K' L' + let : Algebra.IsSeparable K L' := + Algebra.IsSeparable.trans K K' L' + let j : L' →ₐ[K] SeparableClosure K := + IsSepClosed.lift + let jLower : L →ₐ[K] SeparableClosure K := + j.comp (IsScalarTower.toAlgHom K L L') + let iLower : K →ₐ[K] SeparableClosure K := + jLower.comp (IsScalarTower.toAlgHom K K L) + let eLower : + @AlgEquiv K (SeparableClosure K) (SeparableClosure K) + _ _ _ + (separableClosure K (AlgebraicClosure K)).algebra + iLower.toRingHom.toAlgebra := by + refine @AlgEquiv.ofRingEquiv + K (SeparableClosure K) (SeparableClosure K) + _ _ _ + (separableClosure K (AlgebraicClosure K)).algebra + iLower.toRingHom.toAlgebra + (RingEquiv.refl (SeparableClosure K)) ?_ + intro x + change algebraMap K (SeparableClosure K) x = iLower x + exact (iLower.commutes x).symm + let iUpper : K' →ₐ[K] SeparableClosure K := + j.comp (IsScalarTower.toAlgHom K K' L') + let eUpper : + letI : Algebra K' (SeparableClosure K) := + iUpper.toRingHom.toAlgebra + SeparableClosure K' ≃ₐ[K'] SeparableClosure K := by + letI : Algebra K' (SeparableClosure K) := + iUpper.toRingHom.toAlgebra + letI : Algebra.IsSeparable K' (SeparableClosure K) := + Algebra.isSeparable_tower_top_of_isSeparable + K K' (SeparableClosure K) + letI : IsSepClosure K' (SeparableClosure K) := + ⟨inferInstance, inferInstance⟩ + exact + IsSepClosure.equiv K' + (SeparableClosure K') (SeparableClosure K) + let restrictActual : + Gal(L'/K') →* Gal(L/K) := + (AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K) + let aNorm := normUnits K K' a + let ambientUpper : Gal(L'/K') := + ambientEmbeddedNormResidueElement K K' L' j eUpper a + let ambientLower : Gal(L/K) := + ambientEmbeddedNormResidueElement K K L jLower eLower aNorm + have hUpper : + abelianLocalArtinMonoidHom K' L' a = ambientUpper := + abelianLocalArtin_eq_ambientEmbeddedNormResidueSymbol_of_equiv + K K' L' j eUpper a + have hLower : + abelianLocalArtinMonoidHom K L aNorm = ambientLower := + abelianLocalArtin_eq_ambientEmbeddedNormResidueSymbol_of_equiv + K K L jLower eLower aNorm + have htransport : + restrictActual ambientUpper = ambientLower := by + simpa only [restrictActual, ambientUpper, ambientLower, aNorm, jLower] using + ambientEmbeddedNormResidueElement_norm_restriction + K K' L L' j eLower eUpper a + change + restrictActual (abelianLocalArtinMonoidHom K' L' a) = + abelianLocalArtinMonoidHom K L aNorm + calc + restrictActual (abelianLocalArtinMonoidHom K' L' a) = + restrictActual ambientUpper := by + exact congrArg restrictActual hUpper + _ = ambientLower := htransport + _ = abelianLocalArtinMonoidHom K L aNorm := hLower.symm + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean new file mode 100644 index 0000000000..29487f72b9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean @@ -0,0 +1,1287 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusFixedField +/-! +# Intrinsic fixed-field prime comparison + +This module compares intrinsic local Artin maps with the ambient fixed-field norm-residue symbol. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open scoped ValuativeRel + +section IntrinsicFixedFieldPrimeComparison + +variable + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField + Gal(SeparableClosure K/K)) + (J : ClosedSubgroup Gal(SeparableClosure K/K)) + (hJH : J.toSubgroup ≤ H.field.toSubgroup) + [hJnormal : (extensionSubgroup H.field J hJH).Normal] + [hJfinite : Finite + (H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH)] + (e : intrinsicFixedFieldSeparableClosureEquiv K H) + +local notation "F" => + abstractFixedField K (SeparableClosure K) H.field + +local notation "E" => + abstractRelativeFixedField K (SeparableClosure K) hJH + +local notation "iFE" => + e.symm.toAlgHom.comp + (IntermediateField.val + (abstractRelativeFixedField + K (SeparableClosure K) hJH)) + +local notation "EI" => + finiteGaloisAbstractExtensionOfEmbedding F E iFE + +local notation "RF" => + FiniteAbstractField.toFiniteResidueAbstractField + (intrinsicFiniteAbstractBase F) + (localResidueDatum F) + +local notation "RH" => + FiniteAbstractField.toFiniteResidueAbstractField + H (localResidueDatum K) + +local notation "qF" => + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding F E iFE + +local notation "qH" => + abstractExtensionQuotientEquivGaloisGroup + K (SeparableClosure K) H.field J hJH hJnormal + +/-- The separable closure of the comparison fixed field carries its canonical algebra structure +over that field. -/ +local instance intrinsicPrimeComparisonSeparableClosureAlgebra : + Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + +local instance intrinsicPrimeComparison_absoluteFinite : + Finite + ((baseField + Gal(SeparableClosure K/K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K/K)) + H.field (le_baseField H.field)) := + H.finite + +local instance intrinsicPrimeComparison_fixedFieldFiniteDimensional : + FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + +/-- The comparison fixed field carries the spectral norm extending the local base-field norm. -/ +local instance intrinsicPrimeComparisonFixedFieldNormed : + NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + +/-- The valuation relation on the comparison fixed field induced by its spectral norm. -/ +local instance intrinsicPrimeComparisonFixedFieldValuative : + ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + +local instance intrinsicPrimeComparison_fixedFieldLocal : + IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + +local instance intrinsicPrimeComparison_extensionFiniteDimensional : + FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field J hJH H.finite hJfinite + +local instance intrinsicPrimeComparison_extensionGalois : + IsGalois F E := + abstractRelativeFixedField_isGalois + K (SeparableClosure K) H.field J hJH hJnormal + +local instance intrinsicPrimeComparison_extensionNormal : + (extensionSubgroup + (intrinsicAbstractBase F) (EI).field (EI).below).Normal := + (EI).normal + +local instance intrinsicPrimeComparison_extensionFinite : + Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) (EI).field (EI).below) := + (EI).finite + +local instance intrinsicPrimeComparison_residueExtensionFinite : + Finite + ((RF).field.toSubgroup ⧸ + extensionSubgroup (RF).field (EI).field (EI).below) := by + change Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) (EI).field (EI).below) + exact intrinsicPrimeComparison_extensionFinite K H J hJH e + +/-- The local Artin homomorphism of the actual finite fixed-field extension, +using the canonical local structure constructed from the original field. -/ +noncomputable def intrinsicFixedFieldLocalArtinMonoidHom : + Additive Fˣ →+ Additive (Abelianization Gal(E/F)) := + MonoidHom.toAdditive (localArtinMonoidHom F E) + +/-- The concrete norm-residue symbol of the intrinsic finite extension, +evaluated at a unit of the finite fixed field. -/ +noncomputable def intrinsicFixedFieldConcreteSymbolValue + (x : Fˣ) : Abelianization Gal(E/F) := + concreteNormResidueSymbolOfEmbedding + F E iFE + (localResidueDatum F) + (localHenselianValuation F) + (separableClosureUnits_isClassFormation F) x + +private def intrinsicFixedFieldConcretePrimeComparison + (x : Fˣ) (z : Abelianization Gal(E/F)) : Prop := + intrinsicFixedFieldConcreteSymbolValue K H J hJH e x = + z + +private def intrinsicFixedFieldAmbientPrimeComparison + (_e : intrinsicFixedFieldSeparableClosureEquiv K H) + (x : Fˣ) (z : Abelianization Gal(E/F)) : Prop := + abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H.field J hJH (Additive.ofMul x) = + Additive.ofMul z + +/-- Map an intrinsic extension-quotient class to the abelianization of the +intrinsic finite-extension Galois group. -/ +def intrinsicFixedFieldSourceFrobeniusAbelianization + (q : (EI).extensionQuotient) : + Abelianization Gal(E/F) := + Abelianization.of (qF q) + +/-- Restrict a transported ambient Frobenius element and map the resulting +class to the abelianization of the intrinsic finite-extension Galois group. -/ +def intrinsicFixedFieldAmbientFrobeniusAbelianization + (σ : + (localResidueDatum F).FrobeniusElements + RF (EI).field (EI).below) : + Abelianization Gal(E/F) := + (qH).abelianizationCongr + (Abelianization.of + ((localResidueDatum K).frobeniusRestriction + RH J hJH + (intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ))) + +private structure IntrinsicFixedFieldPrimeComparisonData + (z : Abelianization Gal(E/F)) where + xPrime : Fˣ + concrete : + intrinsicFixedFieldConcretePrimeComparison + K H J hJH e xPrime z + ambient : + intrinsicFixedFieldAmbientPrimeComparison + K H J hJH e xPrime z + +/-- The intrinsic closed subgroup fixed by the Frobenius element associated to +the finite fixed-field extension. -/ +abbrev intrinsicFixedFieldFrobeniusSourceClosedField + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) := + (localResidueDatum F).frobeniusFixedField + RF (EI).field (EI).below σ + +/-- The intrinsic Frobenius-fixed closed subgroup lies below the intrinsic +absolute-base subgroup. -/ +theorem intrinsicFixedFieldFrobeniusSourceBelow + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + (intrinsicFixedFieldFrobeniusSourceClosedField + K H J hJH e σ).toSubgroup ≤ + (intrinsicAbstractBase F).toSubgroup := + (localResidueDatum F).frobeniusFixedField_le + RF (EI).field (EI).below σ + +/-- The intrinsic abstract fixed field cut out by the intrinsic +Frobenius-fixed closed subgroup. -/ +abbrev intrinsicFixedFieldFrobeniusSourceField + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) := + abstractFixedField F (SeparableClosure F) + (intrinsicFixedFieldFrobeniusSourceClosedField + K H J hJH e σ) + +/-- The ambient Frobenius-fixed closed subgroup obtained after transporting +the intrinsic Frobenius element. -/ +abbrev intrinsicFixedFieldFrobeniusAmbientClosedField + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) := + (localResidueDatum K).frobeniusFixedField + RH J hJH + (intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ) + +/-- The transported ambient Frobenius-fixed subgroup lies below the ambient +finite fixed subgroup. -/ +theorem intrinsicFixedFieldFrobeniusAmbientBelow + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + (intrinsicFixedFieldFrobeniusAmbientClosedField + K H J hJH e σ).toSubgroup ≤ H.field.toSubgroup := + (localResidueDatum K).frobeniusFixedField_le + RH J hJH + (intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ) + +/-- The ambient relative fixed field cut out by the transported +Frobenius-fixed subgroup. -/ +abbrev intrinsicFixedFieldFrobeniusAmbientField + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) := + abstractRelativeFixedField K (SeparableClosure K) + (intrinsicFixedFieldFrobeniusAmbientBelow + K H J hJH e σ) + +/-- The Frobenius source field is an algebra over the comparison fixed field through its +intermediate-field inclusion. -/ +local instance intrinsicPrimeComparisonFrobeniusSourceAlgebra + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + Algebra F + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ) := + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ).algebra + +local instance intrinsicPrimeComparison_frobeniusSourceFiniteDimensional + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + @FiniteDimensional F + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ) + _ _ + (@Algebra.toModule F + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ) + _ _ + (intrinsicPrimeComparisonFrobeniusSourceAlgebra + K H J hJH e σ)) := by + let : Algebra F + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ) := + intrinsicPrimeComparisonFrobeniusSourceAlgebra + K H J hJH e σ + let _hRFFinite : + Finite + ((RF).field.toSubgroup ⧸ + extensionSubgroup (RF).field (EI).field (EI).below) := + intrinsicPrimeComparison_residueExtensionFinite + K H J hJH e + exact + @abstractFixedField_finiteDimensional + F (SeparableClosure F) _ _ inferInstance inferInstance + (intrinsicFixedFieldFrobeniusSourceClosedField + K H J hJH e σ) + ((localResidueDatum F).frobeniusFixedField_absoluteFinite + (intrinsicFiniteAbstractBase F) (EI).field (EI).below σ) + +/-- The Frobenius source field carries the spectral norm of its finite extension over the +comparison fixed field. -/ +local instance intrinsicPrimeComparisonFrobeniusSourceNormed + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + NontriviallyNormedField + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ) := + finiteExtensionSpectralNormedField F + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ) + +/-- The spectral valuation relation on the Frobenius source field over the comparison fixed +field. -/ +local instance intrinsicPrimeComparisonFrobeniusSourceValuative + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + ValuativeRel + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ) := + finiteExtensionSpectralValuativeRel F + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ) + +local instance intrinsicPrimeComparison_frobeniusSourceLocal + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + IsNonarchimedeanLocalField + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ) := + finiteExtensionSpectralIsNonarchimedeanLocalField F + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ) + +local instance intrinsicPrimeComparison_frobeniusSourceValuationExtension + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + Valuation.HasExtension + (ValuativeRel.valuation F) + (ValuativeRel.valuation + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ)) := + finiteExtensionSpectralValuation_hasExtension F + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ) + +/-- The Frobenius ambient field is an algebra over the original local field through its +fixed-field inclusion. -/ +local instance intrinsicPrimeComparisonFrobeniusAmbientAlgebraK + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + Algebra K + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) := + (abstractFixedField K (SeparableClosure K) + (intrinsicFixedFieldFrobeniusAmbientClosedField + K H J hJH e σ)).algebra + +/-- The Frobenius ambient field is an algebra over the comparison fixed field through the +intermediate-field tower. -/ +local instance intrinsicPrimeComparisonFrobeniusAmbientAlgebraF + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + Algebra F + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) := + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ).algebra + +/-- The ambient Frobenius field extends the comparison fixed field by its usual inclusion. -/ +theorem intrinsicFixedFieldFrobeniusAmbientField_algebraMap_coe + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) (x : F) : + ((algebraMap F (intrinsicFixedFieldFrobeniusAmbientField K H J hJH e σ) x : + intrinsicFixedFieldFrobeniusAmbientField K H J hJH e σ) : SeparableClosure K) = + (x : SeparableClosure K) := rfl + +local instance intrinsicPrimeComparison_frobeniusAmbientFiniteDimensionalK + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + @FiniteDimensional K + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) + _ _ + (@Algebra.toModule K + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) + _ _ + (intrinsicPrimeComparisonFrobeniusAmbientAlgebraK + K H J hJH e σ)) := by + let : Algebra K + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) := + intrinsicPrimeComparisonFrobeniusAmbientAlgebraK + K H J hJH e σ + change FiniteDimensional K + (abstractFixedField K (SeparableClosure K) + (intrinsicFixedFieldFrobeniusAmbientClosedField + K H J hJH e σ)) + exact + abstractFixedField_finiteDimensional + K (SeparableClosure K) + (intrinsicFixedFieldFrobeniusAmbientClosedField + K H J hJH e σ) + ((localResidueDatum K).frobeniusFixedField_absoluteFinite + H J hJH + (intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ)) + +/-- The Frobenius ambient field carries the spectral norm extending the original local-field +norm. -/ +local instance intrinsicPrimeComparisonFrobeniusAmbientNormed + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + NontriviallyNormedField + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) := + finiteExtensionSpectralNormedField K + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) + +/-- The valuation relation on the Frobenius ambient field induced by the spectral extension from +the original base. -/ +local instance intrinsicPrimeComparisonFrobeniusAmbientValuative + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + ValuativeRel + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) := + finiteExtensionSpectralValuativeRel K + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) + +local instance intrinsicPrimeComparison_frobeniusAmbientLocal + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + IsNonarchimedeanLocalField + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) := + finiteExtensionSpectralIsNonarchimedeanLocalField K + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) + +local instance intrinsicPrimeComparison_frobeniusAmbientValuationExtension + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + Valuation.HasExtension + (ValuativeRel.valuation K) + (ValuativeRel.valuation + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ)) := + finiteExtensionSpectralValuation_hasExtension K + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) + +local instance intrinsicPrimeComparison_frobeniusAmbientFiniteDimensionalF + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + @FiniteDimensional F + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) + _ _ + (@Algebra.toModule F + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) + _ _ + (intrinsicPrimeComparisonFrobeniusAmbientAlgebraF + K H J hJH e σ)) := by + let : Algebra F + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) := + intrinsicPrimeComparisonFrobeniusAmbientAlgebraF + K H J hJH e σ + exact + abstractRelativeFixedField_finiteDimensional + K (SeparableClosure K) H.field + (intrinsicFixedFieldFrobeniusAmbientClosedField + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusAmbientBelow + K H J hJH e σ) + H.finite + ((localResidueDatum K).frobeniusFixedField_finite + RH J hJH + (intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ)) + +/-- The canonical algebra embedding of the ambient Frobenius fixed field into +the ambient separable closure. -/ +def intrinsicFixedFieldFrobeniusAmbientEmbedding + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ →ₐ[K] + SeparableClosure K := + (abstractFixedField K (SeparableClosure K) + (intrinsicFixedFieldFrobeniusAmbientClosedField + K H J hJH e σ)).val + +local instance intrinsicPrimeComparison_frobeniusAmbientSeparable + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + Algebra.IsSeparable K + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) := + by + change Algebra.IsSeparable K + (abstractFixedField K (SeparableClosure K) + (intrinsicFixedFieldFrobeniusAmbientClosedField + K H J hJH e σ)) + infer_instance + +/-- The canonical algebra equivalence from the intrinsic Frobenius fixed field +to the corresponding ambient Frobenius fixed field. -/ +noncomputable def intrinsicFixedFieldFrobeniusAlgEquiv + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) := + intrinsicFrobeniusFixedFieldEquivAmbientFixedField + K H J hJH e σ + +/-- The underlying ring equivalence of the canonical equivalence between the +intrinsic and ambient Frobenius fixed fields. -/ +noncomputable def intrinsicFixedFieldFrobeniusRingEquiv + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ ≃+* + intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ := + (intrinsicFixedFieldFrobeniusAlgEquiv + K H J hJH e σ).toRingEquiv + +/-- The canonical intrinsic-to-ambient Frobenius fixed-field equivalence +identifies their valuation subrings. -/ +theorem intrinsicFixedFieldFrobenius_valuationSubring_mem + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) + (x : + intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ) : + x ∈ + (ValuativeRel.valuation + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ)).valuationSubring ↔ + intrinsicFixedFieldFrobeniusRingEquiv + K H J hJH e σ x ∈ + (ValuativeRel.valuation + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ)).valuationSubring := by + exact + valuationSubring_mem_iff_of_separableClosureRingEquiv + F K + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ).val + (intrinsicFixedFieldFrobeniusAmbientEmbedding + K H J hJH e σ) + e.toRingEquiv + (localSeparableValuationSubring_eq_comap_abstractFixedFieldEquiv + K H e) + (intrinsicFixedFieldFrobeniusRingEquiv + K H J hJH e σ) + (fun y => by + calc + intrinsicFixedFieldFrobeniusAmbientEmbedding + K H J hJH e σ + (intrinsicFixedFieldFrobeniusRingEquiv + K H J hJH e σ y) = + ((intrinsicFrobeniusFixedFieldEquivAmbientFixedField + K H J hJH e σ y : + intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) : + SeparableClosure K) := rfl + _ = e (y : SeparableClosure F) := + intrinsicFrobeniusFixedFieldEquivAmbientFixedField_apply_val + K H J hJH e σ y) + x + +private noncomputable def intrinsicFixedFieldFrobeniusSourcePrimeUnit + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ)ˣ := + Classical.choose + (exists_valuationOne_unit_of_ringEquiv + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusRingEquiv + K H J hJH e σ) + (intrinsicFixedFieldFrobenius_valuationSubring_mem + K H J hJH e σ)) + +private theorem intrinsicFixedFieldFrobeniusSourcePrimeUnit_valuation + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + IsNonarchimedeanLocalField.valuationMap + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ) + (Additive.ofMul + (intrinsicFixedFieldFrobeniusSourcePrimeUnit + K H J hJH e σ)) = + 1 := + (Classical.choose_spec + (exists_valuationOne_unit_of_ringEquiv + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusRingEquiv + K H J hJH e σ) + (intrinsicFixedFieldFrobenius_valuationSubring_mem + K H J hJH e σ))).1 + +private noncomputable def intrinsicFixedFieldFrobeniusAmbientPrimeUnit + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ)ˣ := + Units.mapEquiv + (intrinsicFixedFieldFrobeniusRingEquiv + K H J hJH e σ).toMulEquiv + (intrinsicFixedFieldFrobeniusSourcePrimeUnit + K H J hJH e σ) + +private theorem intrinsicFixedFieldFrobeniusAmbientPrimeUnit_valuation + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + IsNonarchimedeanLocalField.valuationMap + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) + (Additive.ofMul + (intrinsicFixedFieldFrobeniusAmbientPrimeUnit + K H J hJH e σ)) = + 1 := + (Classical.choose_spec + (exists_valuationOne_unit_of_ringEquiv + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusRingEquiv + K H J hJH e σ) + (intrinsicFixedFieldFrobenius_valuationSubring_mem + K H J hJH e σ))).2 + +private noncomputable def intrinsicFixedFieldFrobeniusPrimeNorm + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : Fˣ := + normUnits F + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusSourcePrimeUnit + K H J hJH e σ) + +local instance intrinsicPrimeComparison_frobeniusSourceQuotientFinite + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) + (intrinsicFixedFieldFrobeniusSourceClosedField + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusSourceBelow + K H J hJH e σ)) := by + change Finite + ((RF).field.toSubgroup ⧸ + extensionSubgroup + (RF).field + (intrinsicFixedFieldFrobeniusSourceClosedField + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusSourceBelow + K H J hJH e σ)) + exact + (localResidueDatum F).frobeniusFixedField_finite + RF (EI).field (EI).below σ + +/-- Package the intrinsic Frobenius-fixed subgroup as a finite abstract field +inside the intrinsic absolute Galois group. -/ +def intrinsicFixedFieldFrobeniusSourceAbstractField + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + FiniteAbstractField Gal(SeparableClosure F/F) := by + letI _hExtensionFinite : + Finite + ((intrinsicAbstractBase F).toSubgroup ⧸ + extensionSubgroup + (intrinsicAbstractBase F) (EI).field (EI).below) := + intrinsicPrimeComparison_extensionFinite + K H J hJH e + letI _hResidueExtensionFinite : + Finite + ((RF).field.toSubgroup ⧸ + extensionSubgroup (RF).field (EI).field (EI).below) := + intrinsicPrimeComparison_residueExtensionFinite + K H J hJH e + exact + ⟨intrinsicFixedFieldFrobeniusSourceClosedField + K H J hJH e σ, + (localResidueDatum F).frobeniusFixedField_absoluteFinite + (intrinsicFiniteAbstractBase F) (EI).field (EI).below σ⟩ + +private noncomputable def intrinsicFixedFieldFrobeniusSourcePrimeElement + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + ambientFixedAddSubgroup + (intrinsicAbsoluteUnits F) + (intrinsicFixedFieldFrobeniusSourceClosedField + K H J hJH e σ) := + abstractFixedFieldUnitsEquivGaloisFixed + F (SeparableClosure F) + (intrinsicFixedFieldFrobeniusSourceClosedField + K H J hJH e σ) + (Additive.ofMul + (intrinsicFixedFieldFrobeniusSourcePrimeUnit + K H J hJH e σ)) + +private theorem intrinsicFixedFieldFrobeniusSourcePrimeElement_isPrime + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + (localHenselianValuation F).IsPrimeElement + (intrinsicFixedFieldFrobeniusSourceAbstractField + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusSourcePrimeElement + K H J hJH e σ) := + localHenselianValuation_isPrimeElement_abstractFixedField + F + (intrinsicFixedFieldFrobeniusSourceAbstractField + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusSourcePrimeUnit + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusSourcePrimeUnit_valuation + K H J hJH e σ) + +private theorem intrinsicFixedFieldFrobeniusPrimeNorm_relativeNorm + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + relativeNorm + (intrinsicAbsoluteUnits F) + (intrinsicAbstractBase F) + (intrinsicFixedFieldFrobeniusSourceClosedField + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusSourceBelow + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusSourcePrimeElement + K H J hJH e σ) = + baseUnitsEquivGaloisAmbientFixed F (SeparableClosure F) + (Additive.ofMul + (intrinsicFixedFieldFrobeniusPrimeNorm + K H J hJH e σ)) := + relativeNorm_intrinsicAbstractBase_abstractFixedFieldUnit + F + (intrinsicFixedFieldFrobeniusSourceClosedField + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusSourceBelow + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusSourcePrimeUnit + K H J hJH e σ) + +/-- Package the transported ambient Frobenius-fixed subgroup as a finite +abstract field inside the ambient absolute Galois group. -/ +def intrinsicFixedFieldFrobeniusAmbientAbstractField + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + FiniteAbstractField Gal(SeparableClosure K/K) := + ⟨intrinsicFixedFieldFrobeniusAmbientClosedField + K H J hJH e σ, + (localResidueDatum K).frobeniusFixedField_absoluteFinite + H J hJH + (intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ)⟩ + +private noncomputable def intrinsicFixedFieldFrobeniusAmbientPrimeElement + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + ambientFixedAddSubgroup + (galoisAmbientUnitsRep K (SeparableClosure K)) + (intrinsicFixedFieldFrobeniusAmbientClosedField + K H J hJH e σ) := + abstractRelativeFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H.field + (intrinsicFixedFieldFrobeniusAmbientClosedField + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusAmbientBelow + K H J hJH e σ) + (Additive.ofMul + (intrinsicFixedFieldFrobeniusAmbientPrimeUnit + K H J hJH e σ)) + +private theorem intrinsicFixedFieldFrobeniusAmbientPrimeElement_isPrime + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + (localHenselianValuation K).IsPrimeElement + (intrinsicFixedFieldFrobeniusAmbientAbstractField + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusAmbientPrimeElement + K H J hJH e σ) := + localHenselianValuation_isPrimeElement_abstractFixedField + K + (intrinsicFixedFieldFrobeniusAmbientAbstractField + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusAmbientPrimeUnit + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusAmbientPrimeUnit_valuation + K H J hJH e σ) + +private theorem intrinsicFixedFieldFrobeniusPrimeNorm_concrete + (q : (EI).extensionQuotient) + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) + (hσ : + (localResidueDatum F).frobeniusRestriction + RF (EI).field (EI).below σ = q) : + intrinsicFixedFieldConcretePrimeComparison + K H J hJH e + (intrinsicFixedFieldFrobeniusPrimeNorm + K H J hJH e σ) + (intrinsicFixedFieldSourceFrobeniusAbelianization + K H J hJH e q) := by + unfold intrinsicFixedFieldConcretePrimeComparison + unfold intrinsicFixedFieldSourceFrobeniusAbelianization + unfold intrinsicFixedFieldConcreteSymbolValue + exact + concreteNormResidueSymbolOfEmbedding_apply_primeNorm + F E iFE + (localResidueDatum F) + (localHenselianValuation F) + (separableClosureUnits_isClassFormation F) + q σ hσ + (intrinsicFixedFieldFrobeniusSourcePrimeElement + K H J hJH e σ) + (by + simpa only [intrinsicFixedFieldFrobeniusSourceAbstractField] using + (intrinsicFixedFieldFrobeniusSourcePrimeElement_isPrime + K H J hJH e σ)) + (intrinsicFixedFieldFrobeniusPrimeNorm + K H J hJH e σ) + (by + simpa only [intrinsicFixedFieldFrobeniusSourceClosedField] using + (intrinsicFixedFieldFrobeniusPrimeNorm_relativeNorm + K H J hJH e σ).symm) + +private theorem intrinsicFixedFieldFrobeniusPrimeNorm_ambient + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + intrinsicFixedFieldAmbientPrimeComparison + K H J hJH e + (intrinsicFixedFieldFrobeniusPrimeNorm + K H J hJH e σ) + (intrinsicFixedFieldAmbientFrobeniusAbelianization + K H J hJH e σ) := by + unfold intrinsicFixedFieldAmbientPrimeComparison + unfold intrinsicFixedFieldAmbientFrobeniusAbelianization + let phiF : F ≃+* F := RingEquiv.refl F + let phi := + intrinsicFixedFieldFrobeniusRingEquiv + K H J hJH e σ + have hcomm : + RingHom.comp + (algebraMap F + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ)) + phiF.toRingHom = + RingHom.comp phi.toRingHom + (algebraMap F + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ)) := by + apply RingHom.ext + intro x + exact + ((intrinsicFixedFieldFrobeniusAlgEquiv + K H J hJH e σ).commutes x).symm + exact + abstractFixedFieldNormResidueSymbol_eq_of_transportedValuationOneUnit + K F + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ) + H J hJH + (intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ) + (_hLHNorm := + intrinsicPrimeComparisonFrobeniusAmbientNormed + K H J hJH e σ) + (_hLHVal := + intrinsicPrimeComparisonFrobeniusAmbientValuative + K H J hJH e σ) + (_hLHLocal := + intrinsicPrimeComparison_frobeniusAmbientLocal + K H J hJH e σ) + (_hF₀LHFinite := + intrinsicPrimeComparison_frobeniusAmbientFiniteDimensionalF + K H J hJH e σ) + phiF phi hcomm + (intrinsicFixedFieldFrobenius_valuationSubring_mem + K H J hJH e σ) + (intrinsicFixedFieldFrobeniusAmbientPrimeElement_isPrime + K H J hJH e σ) + + +private noncomputable def intrinsicFixedFieldPrimeRepresentative + (z : Abelianization Gal(E/F)) : + (EI).extensionQuotient := + Classical.choose + (QuotientGroup.mk_surjective + ((qF).abelianizationCongr.symm z)) + +omit [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] in +private theorem intrinsicFixedFieldPrimeRepresentative_abelianization + (z : Abelianization Gal(E/F)) : + (qF).abelianizationCongr + (Abelianization.of + (intrinsicFixedFieldPrimeRepresentative + K H J hJH e z)) = + z := by + let zF : Abelianization (EI).extensionQuotient := + (qF).abelianizationCongr.symm z + have hq := + Classical.choose_spec (QuotientGroup.mk_surjective zF) + calc + (qF).abelianizationCongr + (Abelianization.of + (intrinsicFixedFieldPrimeRepresentative + K H J hJH e z)) = + (qF).abelianizationCongr zF := + congrArg (qF).abelianizationCongr hq + _ = z := (qF).abelianizationCongr.apply_symm_apply z + +private noncomputable def intrinsicFixedFieldPrimeFrobeniusLift + (z : Abelianization Gal(E/F)) : + intrinsicFixedFieldFrobeniusElements K H J hJH e := + Classical.choose + ((localResidueDatum F).frobeniusRestriction_surjective + RF (EI).field (EI).below + (intrinsicFixedFieldPrimeRepresentative + K H J hJH e z)) + +private theorem intrinsicFixedFieldPrimeFrobeniusLift_restriction + (z : Abelianization Gal(E/F)) : + (localResidueDatum F).frobeniusRestriction + RF (EI).field (EI).below + (intrinsicFixedFieldPrimeFrobeniusLift + K H J hJH e z) = + intrinsicFixedFieldPrimeRepresentative + K H J hJH e z := + Classical.choose_spec + ((localResidueDatum F).frobeniusRestriction_surjective + RF (EI).field (EI).below + (intrinsicFixedFieldPrimeRepresentative + K H J hJH e z)) + +private noncomputable def intrinsicFixedFieldPrimeComparisonWitness + (z : Abelianization Gal(E/F)) : Fˣ := + intrinsicFixedFieldFrobeniusPrimeNorm + K H J hJH e + (intrinsicFixedFieldPrimeFrobeniusLift + K H J hJH e z) + +private theorem intrinsicFixedFieldPrimeComparisonWitness_concrete + (z : Abelianization Gal(E/F)) : + intrinsicFixedFieldConcretePrimeComparison + K H J hJH e + (intrinsicFixedFieldPrimeComparisonWitness + K H J hJH e z) z := by + have hprime := + intrinsicFixedFieldFrobeniusPrimeNorm_concrete + K H J hJH e + (intrinsicFixedFieldPrimeRepresentative + K H J hJH e z) + (intrinsicFixedFieldPrimeFrobeniusLift + K H J hJH e z) + (intrinsicFixedFieldPrimeFrobeniusLift_restriction + K H J hJH e z) + unfold intrinsicFixedFieldPrimeComparisonWitness + unfold intrinsicFixedFieldConcretePrimeComparison at hprime ⊢ + unfold intrinsicFixedFieldSourceFrobeniusAbelianization at hprime + exact + hprime.trans + ((abelianizationCongr_of qF + (intrinsicFixedFieldPrimeRepresentative + K H J hJH e z)).symm.trans + (intrinsicFixedFieldPrimeRepresentative_abelianization + K H J hJH e z)) + +private noncomputable def intrinsicFixedFieldAmbientQuotientResult + (q : + H.field.toSubgroup ⧸ + extensionSubgroup H.field J hJH) : + Gal(E/F) := + qH q + +private noncomputable def intrinsicFixedFieldSourceQuotientResult + (q : (EI).extensionQuotient) : + Gal(E/F) := + qF q + +private noncomputable def + intrinsicFixedFieldFrobeniusAmbientRestrictionResult + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + Gal(E/F) := + intrinsicFixedFieldAmbientQuotientResult K H J hJH + ((localResidueDatum K).frobeniusRestriction + RH J hJH + (intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ)) + +private noncomputable def + intrinsicFixedFieldFrobeniusSourceRestrictionResult + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + Gal(E/F) := + intrinsicFixedFieldSourceQuotientResult K H J hJH e + ((localResidueDatum F).frobeniusRestriction + RF (EI).field (EI).below σ) + +omit [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] in +private theorem + intrinsicFixedFieldQuotientResult_mk_compatibility + (τ : (intrinsicAbstractBase F).toSubgroup) : + intrinsicFixedFieldAmbientQuotientResult K H J hJH + (QuotientGroup.mk + (intrinsicBaseEquivAmbientFixedField K H e τ)) = + intrinsicFixedFieldSourceQuotientResult K H J hJH e + (QuotientGroup.mk τ) := by + unfold intrinsicFixedFieldAmbientQuotientResult + unfold intrinsicFixedFieldSourceQuotientResult + exact fixedFieldQuotientEquiv_mk_compatibility + K H J hJH e τ + +private theorem + intrinsicFixedFieldFrobeniusRestriction_mk_compatibility + (τ : (intrinsicAbstractBase F).toSubgroup) : + intrinsicFixedFieldAmbientQuotientResult K H J hJH + ((localResidueDatum K).extensionRestriction + H.field J hJH + (intrinsicFrobeniusQuotientEquivAmbientFixedField + K H J hJH e (QuotientGroup.mk τ))) = + intrinsicFixedFieldSourceQuotientResult K H J hJH e + ((localResidueDatum F).extensionRestriction + (intrinsicAbstractBase F) (EI).field (EI).below + (QuotientGroup.mk τ)) := by + have hFrobenius : + intrinsicFrobeniusQuotientEquivAmbientFixedField + K H J hJH e (QuotientGroup.mk τ) = + QuotientGroup.mk + (intrinsicBaseEquivAmbientFixedField K H e τ) := + intrinsicFrobeniusQuotientEquivAmbientFixedField_mk + K H J hJH e τ + have hAmbientRestriction : + (localResidueDatum K).extensionRestriction + H.field J hJH + (intrinsicFrobeniusQuotientEquivAmbientFixedField + K H J hJH e (QuotientGroup.mk τ)) = + QuotientGroup.mk + (intrinsicBaseEquivAmbientFixedField K H e τ) := by + calc + _ = + (localResidueDatum K).extensionRestriction + H.field J hJH + (QuotientGroup.mk + (intrinsicBaseEquivAmbientFixedField K H e τ)) := + congrArg + ((localResidueDatum K).extensionRestriction + H.field J hJH) + hFrobenius + _ = _ := + (localResidueDatum K).extensionRestriction_mk + H.field J hJH + (intrinsicBaseEquivAmbientFixedField K H e τ) + have hSourceRestriction : + (localResidueDatum F).extensionRestriction + (intrinsicAbstractBase F) (EI).field (EI).below + (QuotientGroup.mk τ) = + QuotientGroup.mk τ := + (localResidueDatum F).extensionRestriction_mk + (intrinsicAbstractBase F) (EI).field (EI).below τ + calc + _ = + intrinsicFixedFieldAmbientQuotientResult K H J hJH + (QuotientGroup.mk + (intrinsicBaseEquivAmbientFixedField K H e τ)) := + congrArg + (intrinsicFixedFieldAmbientQuotientResult K H J hJH) + hAmbientRestriction + _ = + intrinsicFixedFieldSourceQuotientResult K H J hJH e + (QuotientGroup.mk τ) := + intrinsicFixedFieldQuotientResult_mk_compatibility + K H J hJH e τ + _ = _ := + congrArg + (intrinsicFixedFieldSourceQuotientResult K H J hJH e) + hSourceRestriction.symm + +private theorem + intrinsicFixedFieldFrobeniusAmbientRestrictionResult_eq + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + intrinsicFixedFieldFrobeniusAmbientRestrictionResult + K H J hJH e σ = + intrinsicFixedFieldFrobeniusSourceRestrictionResult + K H J hJH e σ := by + obtain ⟨τ, hτσ⟩ := + QuotientGroup.mk_surjective σ.1 + let ambient := + fun q : intrinsicFixedFieldFrobeniusQuotient K H J hJH e => + intrinsicFixedFieldAmbientQuotientResult K H J hJH + ((localResidueDatum K).extensionRestriction + H.field J hJH + (intrinsicFrobeniusQuotientEquivAmbientFixedField + K H J hJH e q)) + let source := + fun q : intrinsicFixedFieldFrobeniusQuotient K H J hJH e => + intrinsicFixedFieldSourceQuotientResult K H J hJH e + ((localResidueDatum F).extensionRestriction + (intrinsicAbstractBase F) (EI).field (EI).below q) + change ambient σ.1 = source σ.1 + calc + ambient σ.1 = ambient (QuotientGroup.mk τ) := + congrArg ambient hτσ.symm + _ = source (QuotientGroup.mk τ) := + intrinsicFixedFieldFrobeniusRestriction_mk_compatibility + K H J hJH e τ + _ = source σ.1 := + congrArg source hτσ + +private theorem + intrinsicFixedFieldPrimeFrobeniusSourceRestrictionResult_eq + (z : Abelianization Gal(E/F)) : + intrinsicFixedFieldFrobeniusSourceRestrictionResult + K H J hJH e + (intrinsicFixedFieldPrimeFrobeniusLift + K H J hJH e z) = + qF + (intrinsicFixedFieldPrimeRepresentative + K H J hJH e z) := by + unfold intrinsicFixedFieldFrobeniusSourceRestrictionResult + unfold intrinsicFixedFieldSourceQuotientResult + exact + congrArg qF + (intrinsicFixedFieldPrimeFrobeniusLift_restriction + K H J hJH e z) + +private theorem intrinsicFixedFieldPrimeFrobeniusLift_ambientRestriction + (z : Abelianization Gal(E/F)) : + intrinsicFixedFieldFrobeniusAmbientRestrictionResult + K H J hJH e + (intrinsicFixedFieldPrimeFrobeniusLift + K H J hJH e z) = + qF + (intrinsicFixedFieldPrimeRepresentative + K H J hJH e z) := by + calc + intrinsicFixedFieldFrobeniusAmbientRestrictionResult + K H J hJH e + (intrinsicFixedFieldPrimeFrobeniusLift + K H J hJH e z) = + intrinsicFixedFieldFrobeniusSourceRestrictionResult + K H J hJH e + (intrinsicFixedFieldPrimeFrobeniusLift + K H J hJH e z) := + intrinsicFixedFieldFrobeniusAmbientRestrictionResult_eq + K H J hJH e + (intrinsicFixedFieldPrimeFrobeniusLift + K H J hJH e z) + _ = + qF + (intrinsicFixedFieldPrimeRepresentative + K H J hJH e z) := + intrinsicFixedFieldPrimeFrobeniusSourceRestrictionResult_eq + K H J hJH e z + +private theorem intrinsicFixedFieldPrimeComparisonWitness_ambient + (z : Abelianization Gal(E/F)) : + intrinsicFixedFieldAmbientPrimeComparison + K H J hJH e + (intrinsicFixedFieldPrimeComparisonWitness + K H J hJH e z) z := by + let σ := + intrinsicFixedFieldPrimeFrobeniusLift + K H J hJH e z + let q := + intrinsicFixedFieldPrimeRepresentative + K H J hJH e z + let σH := + intrinsicFrobeniusElementToAmbientFixedField + K H J hJH e σ + let qAmbient := + (localResidueDatum K).frobeniusRestriction + RH J hJH σH + have hprime := + intrinsicFixedFieldFrobeniusPrimeNorm_ambient + K H J hJH e σ + have hrestriction : qH qAmbient = qF q := by + simpa only [ + intrinsicFixedFieldFrobeniusAmbientRestrictionResult, + intrinsicFixedFieldAmbientQuotientResult, + σ, q, σH, qAmbient + ] using + intrinsicFixedFieldPrimeFrobeniusLift_ambientRestriction + K H J hJH e z + unfold intrinsicFixedFieldPrimeComparisonWitness + unfold intrinsicFixedFieldAmbientPrimeComparison at hprime ⊢ + unfold intrinsicFixedFieldAmbientFrobeniusAbelianization at hprime + calc + _ = Additive.ofMul + ((qH).abelianizationCongr + (Abelianization.of qAmbient)) := + hprime + _ = Additive.ofMul z := by + apply Additive.ext + exact + (abelianizationCongr_of qH qAmbient).trans + ((congrArg Abelianization.of hrestriction).trans + ((abelianizationCongr_of qF q).symm.trans + (intrinsicFixedFieldPrimeRepresentative_abelianization + K H J hJH e z))) + +private noncomputable def intrinsicFixedFieldPrimeComparison + (z : Abelianization Gal(E/F)) : + IntrinsicFixedFieldPrimeComparisonData + K H J hJH e z := + { xPrime := + intrinsicFixedFieldPrimeComparisonWitness + K H J hJH e z + concrete := + intrinsicFixedFieldPrimeComparisonWitness_concrete + K H J hJH e z + ambient := + intrinsicFixedFieldPrimeComparisonWitness_ambient + K H J hJH e z } + +/-- Every abelianized Galois element of the intrinsic finite fixed-field +extension is represented by a unit with both its concrete norm-residue value +and its actual ambient fixed-field norm-residue value. -/ +theorem exists_intrinsicFixedFieldPrimeComparison + (z : Abelianization Gal(E/F)) : + ∃ x : Fˣ, + concreteNormResidueSymbolOfEmbedding + F E iFE + (localResidueDatum F) + (localHenselianValuation F) + (separableClosureUnits_isClassFormation F) x = z ∧ + abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H.field J hJH (Additive.ofMul x) = + Additive.ofMul z := by + let comparison := + intrinsicFixedFieldPrimeComparison + K H J hJH e z + exact + ⟨comparison.xPrime, comparison.concrete, comparison.ambient⟩ + +include e in +/-- Every unit of the intrinsic finite fixed field has a norm-class-equivalent +representative whose ambient fixed-field norm-residue value is the actual +local Artin value of the original unit. -/ +theorem exists_intrinsicFixedFieldNormClassRepresentative + (a : Fˣ) : + ∃ x : Fˣ, + normClass F E a = normClass F E x ∧ + abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H.field J hJH (Additive.ofMul x) = + intrinsicFixedFieldLocalArtinMonoidHom + K H J hJH (Additive.ofMul a) := by + let z : Abelianization Gal(E/F) := + concreteNormResidueSymbolOfEmbedding + F E iFE + (localResidueDatum F) + (localHenselianValuation F) + (separableClosureUnits_isClassFormation F) a + obtain ⟨x, hxconcrete, hxambient⟩ := + exists_intrinsicFixedFieldPrimeComparison K H J hJH e z + refine ⟨x, ?_, ?_⟩ + · apply + (concreteReciprocityEquivOfEmbedding + F E iFE + (localResidueDatum F) + (localHenselianValuation F) + (separableClosureUnits_isClassFormation F)).symm.injective + change + concreteNormResidueSymbolOfEmbedding + F E iFE + (localResidueDatum F) + (localHenselianValuation F) + (separableClosureUnits_isClassFormation F) a = + concreteNormResidueSymbolOfEmbedding + F E iFE + (localResidueDatum F) + (localHenselianValuation F) + (separableClosureUnits_isClassFormation F) x + simpa only [z] using hxconcrete.symm + · calc + abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H.field J hJH (Additive.ofMul x) = + Additive.ofMul z := + hxambient + _ = intrinsicFixedFieldLocalArtinMonoidHom + K H J hJH (Additive.ofMul a) := by + change Additive.ofMul z = + Additive.ofMul (localArtinMonoidHom F E a) + dsimp only [z] + exact + congrArg Additive.ofMul + (DFunLike.congr_fun + (localArtinMonoidHom_eq_of_embedding F E iFE) a).symm + +end IntrinsicFixedFieldPrimeComparison + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean new file mode 100644 index 0000000000..35d62cee61 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean @@ -0,0 +1,1345 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationTransport +/-! +# Canonical local data on finite fixed fields + +This file compares the normalized valuation induced on a finite abstract +field by the local class formation with the ordinary normalized valuation +of its concrete fixed field. The concrete field is equipped with the +canonical spectral extension of the topology on the original local field. +-/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + hasExtension_valuation_of_valuationSubring_pullback → + hasExtension_valuation_of_valuationSubring_pullback + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + valuationSubring_pullback_of_hasExtension_valuation → + valuationSubring_pullback_of_hasExtension_valuation + + +noncomputable +section + +namespace LocalClassFieldTheory + +open scoped NNReal Pointwise ValuativeRel +open ClassFormation LocalFieldTheory RamificationTheory CyclicCohomology +open RamificationTheory.HilbertRamification.ValuationSubring + +local notation "finiteFixedField" => + (fun (K : Type) [Field K] + (H : FiniteAbstractField (Gal(SeparableClosure K/K))) => + abstractFixedField K (SeparableClosure K) (FiniteAbstractField.field H)) + +/-- The separable closure of a finite fixed field is an algebra over that fixed field. -/ +local instance finiteFixedFieldSeparableClosureAlgebra + (K : Type) [Field K] + (H : FiniteAbstractField (Gal(SeparableClosure K/K))) : + Algebra (finiteFixedField K H) + (SeparableClosure (finiteFixedField K H)) := + (separableClosure (finiteFixedField K H) + (AlgebraicClosure (finiteFixedField K H))).algebra + +@[reducible] +private def valuationSubringEquivOfComapEq + {L M : Type} [Field L] [Field M] + (A : ValuationSubring M) (B : ValuationSubring L) + (e : L ≃+* M) (h : B = A.comap e.toRingHom) : + B ≃+* A where + toFun x := ⟨e x, by + change (x : L) ∈ A.comap e.toRingHom + rw [← h] + exact x.property⟩ + invFun y := ⟨e.symm y, by + rw [h] + change e (e.symm y) ∈ A + simp⟩ + left_inv x := by + ext + simp + right_inv y := by + ext + simp + map_mul' x y := by + ext + simp + map_add' x y := by + ext + simp + +private theorem semilinearConjugate_commutes + {k k' Omega Omega' : Type} + [Field k] [Field k'] [Field Omega] [Field Omega'] + [Algebra k Omega] [Algebra k' Omega'] + (tau : k ≃+* k') (e : Omega ≃+* Omega') + (he : + ∀ x : k, + e (algebraMap k Omega x) = + algebraMap k' Omega' (tau x)) + (sigma : Omega ≃ₐ[k] Omega) (x : k') : + e (sigma (e.symm (algebraMap k' Omega' x))) = + algebraMap k' Omega' x := by + have hpre : + e.symm (algebraMap k' Omega' x) = + algebraMap k Omega (tau.symm x) := by + apply e.injective + rw [e.apply_symm_apply, he, tau.apply_symm_apply] + rw [hpre, sigma.commutes, he, tau.apply_symm_apply] + +/-- On a finite fixed field, the normalized valuation induced by the local +class formation is the ordinary normalized local-field valuation. -/ +theorem localHenselianValuation_valuationAt_abstractFixedField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField (Gal(SeparableClosure K/K))) + (x : (abstractFixedField K (SeparableClosure K) H.field)ˣ) : + letI : FiniteDimensional K + (abstractFixedField K (SeparableClosure K) H.field) := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField + (abstractFixedField K (SeparableClosure K) H.field) := + finiteExtensionSpectralNormedField K + (abstractFixedField K (SeparableClosure K) H.field) + letI : ValuativeRel + (abstractFixedField K (SeparableClosure K) H.field) := + finiteExtensionSpectralValuativeRel K + (abstractFixedField K (SeparableClosure K) H.field) + letI : IsNonarchimedeanLocalField + (abstractFixedField K (SeparableClosure K) H.field) := + finiteExtensionSpectralIsNonarchimedeanLocalField K + (abstractFixedField K (SeparableClosure K) H.field) + ((((localHenselianValuation K).valuationAt H + (abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H.field (Additive.ofMul x))) : + (localHenselianValuation K).valueGroup) : ZHat) = + Int.castRingHom ZHat + (IsNonarchimedeanLocalField.valuationMap + (abstractFixedField K (SeparableClosure K) H.field) + (Additive.ofMul x)) := by + let F := abstractFixedField K (SeparableClosure K) H.field + let : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + let : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + let : ValuativeRel F := finiteExtensionSpectralValuativeRel K F + let : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + let : Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation F) := + finiteExtensionSpectralValuation_hasExtension K F + let hIntegralClosure : IsIntegralClosure 𝒪[F] 𝒪[K] F := + localCompleteDVF_integerRing_isIntegralClosure K F + let a := + abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H.field (Additive.ofMul x) + let f := Module.finrank 𝓀[K] 𝓀[F] + let z := + Int.castRingHom ZHat + (IsNonarchimedeanLocalField.valuationMap F (Additive.ofMul x)) + have hdegree : + (H.residueDegree (localResidueDatum K) : ℕ) = f := by + have hdegreeRaw := + localResidueDatum_residueDegree_eq_residueFinrank K H + exact hdegreeRaw.trans (by + apply Nat.pow_right_injective + (Finite.one_lt_card : 2 ≤ Nat.card 𝓀[K]) + calc + _ = Nat.card 𝓀[F] := by + symm + refine @Module.natCard_eq_pow_finrank 𝓀[K] 𝓀[F] _ _ ?_ ?_ + refine @Module.Finite.of_finite 𝓀[K] 𝓀[F] _ _ ?_ ?_ + infer_instance + _ = Nat.card 𝓀[F] := rfl + _ = _ := by + dsimp only [f] + refine @Module.natCard_eq_pow_finrank 𝓀[K] 𝓀[F] _ _ ?_ ?_ + refine @Module.Finite.of_finite 𝓀[K] 𝓀[F] _ _ ?_ ?_ + infer_instance) + have hnorm : + (localHenselianValuation K).normCompositeAt H a = + f • z := by + change localBaseValuation K + (normToBase + (galoisAmbientUnitsRep K (SeparableClosure K)) H.field a) = + f • z + rw [show a = + abstractFixedFieldUnitsEquivGaloisFixed + K (SeparableClosure K) H.field (Additive.ofMul x) from rfl] + rw [localBaseValuation_normToBase_abstractFixedFieldUnit] + change Int.castRingHom ZHat + (IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul (normUnits K F x))) = + f • Int.castRingHom ZHat + (IsNonarchimedeanLocalField.valuationMap F + (Additive.ofMul x)) + have hnormInt := + @v_normUnits_eq_residue_finrank_mul_of_isSeparable + K F _ _ _ _ _ _ _ _ _ _ _ _ hIntegralClosure x + change IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul (normUnits K F x)) = + (f : Int) * + IsNonarchimedeanLocalField.valuationMap F + (Additive.ofMul x) at hnormInt + rw [hnormInt, ← map_nsmul] + rfl + have hnorm' : + (localHenselianValuation K).normCompositeAt H a = + (H.residueDegree (localResidueDatum K) : ℕ) • z := by + rw [hdegree] + exact hnorm + rw [(localHenselianValuation K).valuationAt_coe] + change zHatDivide (H.residueDegree (localResidueDatum K) : ℕ) + (H.residueDegree (localResidueDatum K)).pos + ((localHenselianValuation K).normCompositeAtInResidueImage H a) = z + have hsub : + (localHenselianValuation K).normCompositeAtInResidueImage H a = + ⟨zHatMulNat (H.residueDegree (localResidueDatum K) : ℕ) z, + ⟨z, rfl⟩⟩ := by + apply Subtype.ext + change (localHenselianValuation K).normCompositeAt H a = + zHatMulNat (H.residueDegree (localResidueDatum K) : ℕ) z + simpa only [zHatMulNat_apply] using hnorm' + exact (congrArg (zHatDivide (H.residueDegree (localResidueDatum K) : ℕ) + (H.residueDegree (localResidueDatum K)).pos) hsub).trans + (zHatDivide_zHatMulNat (H.residueDegree (localResidueDatum K) : ℕ) + (H.residueDegree (localResidueDatum K)).pos z) + +/-- A separable-closure equivalence extending an embedding of a finite +separable local extension identifies the two uniquely extended local +valuation rings. -/ +theorem localSeparableValuationSubring_eq_comap_finiteExtensionEquiv + (K F : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Algebra K F] [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + (i : F →ₐ[K] SeparableClosure K) : + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + letI : Algebra.IsSeparable F (SeparableClosure K) := + Algebra.isSeparable_tower_top_of_isSeparable + K F (SeparableClosure K) + letI : IsSepClosure F (SeparableClosure K) := + ⟨inferInstance, inferInstance⟩ + ∀ e : SeparableClosure F ≃ₐ[F] SeparableClosure K, + localSeparableValuationSubring F = + (localSeparableValuationSubring K).comap e.toRingHom := by + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + let : Algebra.IsSeparable F (SeparableClosure K) := + Algebra.isSeparable_tower_top_of_isSeparable + K F (SeparableClosure K) + let : IsSepClosure F (SeparableClosure K) := + ⟨inferInstance, inferInstance⟩ + intro e + let A := localSeparableValuationSubring K + let B := A.comap e.toRingHom + have hcomap : + A.comap i.toRingHom = + (ValuativeRel.valuation F).valuationSubring := + localSeparableValuationSubring_comap_embedding K F i + have hBext : + (localCompleteDVF F).valuation.HasExtension B.valuation := by + apply + hasExtension_valuation_of_valuationSubring_pullback + intro x + change e (algebraMap F (SeparableClosure F) x) ∈ A ↔ + x ∈ (localCompleteDVF F).valuation.valuationSubring + rw [e.commutes] + change x ∈ A.comap i.toRingHom ↔ + x ∈ (ValuativeRel.valuation F).valuationSubring + rw [hcomap] + let : (localCompleteDVF F).valuation.HasExtension B.valuation := + hBext + exact localSeparableValuationSubring_eq_of_hasExtension F B + +/-- After identifying separable closures over a finite separable local +extension, the ambient selected valuation ring is stabilized by the whole +absolute Galois group of the extension field. -/ +theorem localSeparableDecompositionGroup_eq_top_finiteExtensionEquiv + (K F : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Algebra K F] [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + (i : F →ₐ[K] SeparableClosure K) : + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + letI : Algebra.IsSeparable F (SeparableClosure K) := + Algebra.isSeparable_tower_top_of_isSeparable + K F (SeparableClosure K) + letI : IsSepClosure F (SeparableClosure K) := + ⟨inferInstance, inferInstance⟩ + ∀ _e : SeparableClosure F ≃ₐ[F] SeparableClosure K, + decompositionGroup F (localSeparableValuationSubring K) = ⊤ := by + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + let : Algebra.IsSeparable F (SeparableClosure K) := + Algebra.isSeparable_tower_top_of_isSeparable + K F (SeparableClosure K) + let : IsSepClosure F (SeparableClosure K) := + ⟨inferInstance, inferInstance⟩ + intro e + let A := localSeparableValuationSubring K + let AF := localSeparableValuationSubring F + have hAF : + AF = A.comap e.toRingHom := + localSeparableValuationSubring_eq_comap_finiteExtensionEquiv + K F i e + have hAFtop : + decompositionGroup F AF = ⊤ := + localSeparableDecompositionGroup_eq_top F + apply top_unique + intro sigma _hsigma + let sigmaF : Gal(SeparableClosure F/F) := + AlgEquiv.autCongr e.symm sigma + have hsigmaF : + sigmaF • AF = AF := by + have : + sigmaF ∈ decompositionGroup F AF := by + rw [hAFtop] + trivial + change sigmaF • AF = AF at this + exact this + change sigma • A = A + ext x + rw [ValuationSubring.mem_pointwise_smul_iff_inv_smul_mem] + have hmem (z : SeparableClosure K) : + e.symm z ∈ AF ↔ z ∈ A := by + rw [hAF] + change e (e.symm z) ∈ A ↔ z ∈ A + rw [e.apply_symm_apply] + rw [← hmem (sigma⁻¹ • x), ← hmem x] + have hx := + congrArg + (fun B : ValuationSubring (SeparableClosure F) => + e.symm x ∈ B) + hsigmaF + rw [ValuationSubring.mem_pointwise_smul_iff_inv_smul_mem] at hx + simpa [sigmaF, AlgEquiv.autCongr_apply] using hx.to_iff + +@[implicit_reducible] +noncomputable def finiteExtensionDecompositionResidueFintype + (K F : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Algebra K F] [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + (i : F →ₐ[K] SeparableClosure K) : + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + letI : Algebra.IsSeparable F (SeparableClosure K) := + Algebra.isSeparable_tower_top_of_isSeparable + K F (SeparableClosure K) + letI : IsSepClosure F (SeparableClosure K) := + ⟨inferInstance, inferInstance⟩ + ∀ _e : SeparableClosure F ≃ₐ[F] SeparableClosure K, + Fintype (decompositionResidueField F + (localSeparableValuationSubring K)) := by + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + letI : Algebra.IsSeparable F (SeparableClosure K) := + Algebra.isSeparable_tower_top_of_isSeparable + K F (SeparableClosure K) + letI : IsSepClosure F (SeparableClosure K) := + ⟨inferInstance, inferInstance⟩ + intro _e + let A := localSeparableValuationSubring K + let C := (ValuativeRel.valuation F).valuationSubring + have hcomap : + A.comap (algebraMap F (SeparableClosure K)) = C := by + change A.comap i.toRingHom = + (ValuativeRel.valuation F).valuationSubring + exact localSeparableValuationSubring_comap_embedding K F i + have htop : decompositionGroup F A = ⊤ := + localSeparableDecompositionGroup_eq_top_finiteExtensionEquiv + K F i _e + let residueEquiv : + IsLocalRing.ResidueField C ≃+* + decompositionResidueField F A := + residueFieldEquivDecompositionResidueOfEqTop A C hcomap htop + letI : Finite (IsLocalRing.ResidueField C) := by + change Finite 𝓀[F] + infer_instance + letI : Fintype (IsLocalRing.ResidueField C) := + Fintype.ofFinite _ + exact Fintype.ofEquiv _ residueEquiv.toEquiv + +/-- The intrinsic residue degree of a finite separable local extension is +unchanged after moving its separable closure into the ambient separable +closure of the base field. -/ +theorem + localResidueDegree_eq_residueAbsoluteDegreeIn_finiteExtensionEquiv + (K F : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Algebra K F] [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + (i : F →ₐ[K] SeparableClosure K) : + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + letI : Algebra.IsSeparable F (SeparableClosure K) := + Algebra.isSeparable_tower_top_of_isSeparable + K F (SeparableClosure K) + letI : IsSepClosure F (SeparableClosure K) := + ⟨inferInstance, inferInstance⟩ + ∀ (e : SeparableClosure F ≃ₐ[F] SeparableClosure K) + (sigma : Gal(SeparableClosure F/F)), + letI : Fintype (decompositionResidueField F + (localSeparableValuationSubring K)) := + finiteExtensionDecompositionResidueFintype K F i e + localResidueDegree F sigma = + residueAbsoluteDegreeIn + (decompositionResidueField F + (localSeparableValuationSubring K)) + (selectedResidueField + (localSeparableValuationSubring K)) + (residueAlgActionOfEqTop F + (localSeparableValuationSubring K) + (localSeparableDecompositionGroup_eq_top_finiteExtensionEquiv + K F i e) + (AlgEquiv.autCongr e sigma)) := by + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + let : Algebra.IsSeparable F (SeparableClosure K) := + Algebra.isSeparable_tower_top_of_isSeparable + K F (SeparableClosure K) + let : IsSepClosure F (SeparableClosure K) := + ⟨inferInstance, inferInstance⟩ + intro e sigma + let : Fintype (decompositionResidueField F + (localSeparableValuationSubring K)) := + finiteExtensionDecompositionResidueFintype K F i e + let A := localSeparableValuationSubring K + let AF := localSeparableValuationSubring F + let C := (ValuativeRel.valuation F).valuationSubring + let kF := IsLocalRing.ResidueField C + let kA := decompositionResidueField F A + let kAF := decompositionResidueField F AF + let OmegaA := selectedResidueField A + let OmegaF := selectedResidueField AF + have hAcomap : + A.comap (algebraMap F (SeparableClosure K)) = C := by + change A.comap i.toRingHom = + (ValuativeRel.valuation F).valuationSubring + exact localSeparableValuationSubring_comap_embedding K F i + have hAFcomap : + AF.comap (algebraMap F (SeparableClosure F)) = C := by + ext x + exact localSeparableValuationSubring_pullback F x + have hAtop : + decompositionGroup F A = ⊤ := + localSeparableDecompositionGroup_eq_top_finiteExtensionEquiv + K F i e + have hAFtop : + decompositionGroup F AF = ⊤ := + localSeparableDecompositionGroup_eq_top F + let eA : kF ≃+* kA := + residueFieldEquivDecompositionResidueOfEqTop + A C hAcomap hAtop + let eAF : kF ≃+* kAF := + residueFieldEquivDecompositionResidueOfEqTop + AF C hAFcomap hAFtop + let tau : kAF ≃+* kA := + eAF.symm.trans eA + have hAF : + AF = A.comap e.toRingHom := + localSeparableValuationSubring_eq_comap_finiteExtensionEquiv + K F i e + let r : AF ≃+* A := + valuationSubringEquivOfComapEq A AF e.toRingEquiv hAF + let eResidue : OmegaF ≃+* OmegaA := + IsLocalRing.ResidueField.mapEquiv r + have hr (x : AF) : + ((r x : A) : SeparableClosure K) = + e (x : SeparableClosure F) := by + rfl + have heResidue (x : kAF) : + eResidue (algebraMap kAF OmegaF x) = + algebraMap kA OmegaA (tau x) := by + obtain ⟨y, rfl⟩ := eAF.surjective x + obtain ⟨a, rfl⟩ := IsLocalRing.residue_surjective y + rw [residueFieldEquivDecompositionResidueOfEqTop_algebraMap] + have htau : + tau (eAF (IsLocalRing.residue C a)) = + eA (IsLocalRing.residue C a) := by + simp [tau] + rw [htau] + change IsLocalRing.ResidueField.map r + (IsLocalRing.residue AF _) = + algebraMap kA OmegaA + (eA (IsLocalRing.residue C a)) + rw [IsLocalRing.ResidueField.map_residue, + residueFieldEquivDecompositionResidueOfEqTop_algebraMap] + congr 1 + apply Subtype.ext + exact (hr _).trans (e.commutes (a : F)) + let rhoF : OmegaF ≃ₐ[kAF] OmegaF := + localSeparableResidueAlgAction F sigma + let rhoA : OmegaA ≃ₐ[kA] OmegaA := + residueAlgActionOfEqTop F A hAtop + (AlgEquiv.autCongr e sigma) + let conjugate : OmegaA ≃ₐ[kA] OmegaA := + { eResidue.symm.trans (rhoF.toRingEquiv.trans eResidue) with + commutes' := fun x => by + change eResidue + (rhoF (eResidue.symm (algebraMap kA OmegaA x))) = + algebraMap kA OmegaA x + have hpre : + eResidue.symm (algebraMap kA OmegaA x) = + algebraMap kAF OmegaF (tau.symm x) := by + apply eResidue.injective + rw [eResidue.apply_symm_apply, heResidue, + tau.apply_symm_apply] + rw [hpre, rhoF.commutes, heResidue, + tau.apply_symm_apply] } + have hconjugate : conjugate = rhoA := by + apply AlgEquiv.ext + intro x + obtain ⟨y, rfl⟩ := eResidue.surjective x + obtain ⟨a, rfl⟩ := IsLocalRing.residue_surjective y + change eResidue + (rhoF (eResidue.symm + (eResidue (IsLocalRing.residue AF a)))) = + rhoA (eResidue (IsLocalRing.residue AF a)) + rw [eResidue.symm_apply_apply] + change IsLocalRing.ResidueField.map r + (residueAlgActionOfEqTop F AF hAFtop sigma + (IsLocalRing.residue AF a)) = + residueAlgActionOfEqTop F A hAtop + (AlgEquiv.autCongr e sigma) + (IsLocalRing.ResidueField.map r + (IsLocalRing.residue AF a)) + dsimp only [residueAlgActionOfEqTop] + rw [MonoidHom.comp_apply, MonoidHom.comp_apply, + decompositionGroupResidueAction_residue, + IsLocalRing.ResidueField.map_residue, + IsLocalRing.ResidueField.map_residue, + decompositionGroupResidueAction_residue] + congr 1 + apply Subtype.ext + change e (sigma (a : SeparableClosure F)) = + AlgEquiv.autCongr e sigma (e (a : SeparableClosure F)) + simp [AlgEquiv.autCongr_apply] + change residueAbsoluteDegreeIn kAF OmegaF rhoF = + residueAbsoluteDegreeIn kA OmegaA rhoA + rw [← hconjugate] + exact + (residueAbsoluteDegreeIn_semilinear_conjugation + kAF OmegaF tau eResidue heResidue rhoF).symm + +/-- Local residue degree is invariant under a semilinear equivalence of +local fields and separable closures that carries the selected extension +valuation ring to the selected extension valuation ring. -/ +theorem localResidueDegree_semilinear_conjugation + (K F : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + (phi : K ≃+* F) + (e : SeparableClosure K ≃+* SeparableClosure F) + (he : ∀ x : K, + e (algebraMap K (SeparableClosure K) x) = + algebraMap F (SeparableClosure F) (phi x)) + (hvaluation : + localSeparableValuationSubring K = + (localSeparableValuationSubring F).comap e.toRingHom) + (sigma : Gal(SeparableClosure K/K)) : + let sigmaF : Gal(SeparableClosure F/F) := + { e.symm.trans (sigma.toRingEquiv.trans e) with + commutes' := fun x => by + change e (sigma (e.symm + (algebraMap F (SeparableClosure F) x))) = + algebraMap F (SeparableClosure F) x + have hpre : + e.symm (algebraMap F (SeparableClosure F) x) = + algebraMap K (SeparableClosure K) (phi.symm x) := by + apply e.injective + rw [e.apply_symm_apply, he, phi.apply_symm_apply] + rw [hpre, sigma.commutes, he, phi.apply_symm_apply] } + localResidueDegree F sigmaF = + localResidueDegree K sigma := by + dsimp only + let AK := localSeparableValuationSubring K + let AF := localSeparableValuationSubring F + let CK := (localCompleteDVF K).valuation.valuationSubring + let CF := (localCompleteDVF F).valuation.valuationSubring + let kK := IsLocalRing.ResidueField CK + let kF := IsLocalRing.ResidueField CF + let kAK := decompositionResidueField K AK + let kAF := decompositionResidueField F AF + let OmegaK := selectedResidueField AK + let OmegaF := selectedResidueField AF + have hbase (x : K) : + x ∈ CK ↔ phi x ∈ CF := by + change + x ∈ (localCompleteDVF K).valuation.valuationSubring ↔ + phi x ∈ (localCompleteDVF F).valuation.valuationSubring + rw [← localSeparableValuationSubring_pullback K x, + ← localSeparableValuationSubring_pullback F (phi x)] + rw [hvaluation] + change + e (algebraMap K (SeparableClosure K) x) ∈ AF ↔ + algebraMap F (SeparableClosure F) (phi x) ∈ AF + rw [he] + let rBase : CK ≃+* CF := { + toFun := fun x => + ⟨phi (x : K), (hbase (x : K)).1 x.property⟩ + invFun := fun y => + ⟨phi.symm (y : F), (hbase (phi.symm (y : F))).2 (by + simpa only [phi.apply_symm_apply] using y.property)⟩ + left_inv := fun x => by + ext + simp + right_inv := fun y => by + ext + simp + map_mul' := fun x y => by + ext + simp + map_add' := fun x y => by + ext + simp } + let eBaseResidue : kK ≃+* kF := + IsLocalRing.ResidueField.mapEquiv rBase + let r : AK ≃+* AF := + valuationSubringEquivOfComapEq AF AK e hvaluation + let eResidue : OmegaK ≃+* OmegaF := + IsLocalRing.ResidueField.mapEquiv r + have hr (x : AK) : + ((r x : AF) : SeparableClosure F) = + e (x : SeparableClosure K) := by + rfl + let bK : kK ≃+* kAK := + localBaseResidueEquivDecompositionResidue K + let bF : kF ≃+* kAF := + localBaseResidueEquivDecompositionResidue F + let tau : kAK ≃+* kAF := + bK.symm.trans (eBaseResidue.trans bF) + have heResidue (x : kAK) : + eResidue (algebraMap kAK OmegaK x) = + algebraMap kAF OmegaF (tau x) := by + obtain ⟨y, rfl⟩ := bK.surjective x + obtain ⟨a, rfl⟩ := IsLocalRing.residue_surjective y + rw [localBaseResidueEquivDecompositionResidue_algebraMap] + have htau : + tau (bK (IsLocalRing.residue CK a)) = + bF (eBaseResidue (IsLocalRing.residue CK a)) := by + simp [tau] + rw [htau] + change IsLocalRing.ResidueField.map r + (IsLocalRing.residue AK _) = + algebraMap kAF OmegaF + (bF (IsLocalRing.ResidueField.map rBase + (IsLocalRing.residue CK a))) + rw [IsLocalRing.ResidueField.map_residue, + IsLocalRing.ResidueField.map_residue, + localBaseResidueEquivDecompositionResidue_algebraMap] + congr 1 + apply Subtype.ext + exact (hr _).trans (he (a : K)) + let sigmaF : Gal(SeparableClosure F/F) := + { e.symm.trans (sigma.toRingEquiv.trans e) with + commutes' := fun x => by + change e (sigma (e.symm + (algebraMap F (SeparableClosure F) x))) = + algebraMap F (SeparableClosure F) x + have hpre : + e.symm (algebraMap F (SeparableClosure F) x) = + algebraMap K (SeparableClosure K) (phi.symm x) := by + apply e.injective + rw [e.apply_symm_apply, he, phi.apply_symm_apply] + rw [hpre, sigma.commutes, he, phi.apply_symm_apply] } + let rhoK : OmegaK ≃ₐ[kAK] OmegaK := + localSeparableResidueAlgAction K sigma + let rhoF : OmegaF ≃ₐ[kAF] OmegaF := + localSeparableResidueAlgAction F sigmaF + let conjugate : OmegaF ≃ₐ[kAF] OmegaF := + { eResidue.symm.trans (rhoK.toRingEquiv.trans eResidue) with + commutes' := fun x => by + change eResidue + (rhoK (eResidue.symm (algebraMap kAF OmegaF x))) = + algebraMap kAF OmegaF x + have hpre : + eResidue.symm (algebraMap kAF OmegaF x) = + algebraMap kAK OmegaK (tau.symm x) := by + apply eResidue.injective + rw [eResidue.apply_symm_apply, heResidue, + tau.apply_symm_apply] + rw [hpre, rhoK.commutes, heResidue, + tau.apply_symm_apply] } + have hconjugate : conjugate = rhoF := by + apply AlgEquiv.ext + intro x + obtain ⟨y, rfl⟩ := eResidue.surjective x + obtain ⟨a, rfl⟩ := IsLocalRing.residue_surjective y + change eResidue + (rhoK (eResidue.symm + (eResidue (IsLocalRing.residue AK a)))) = + rhoF (eResidue (IsLocalRing.residue AK a)) + rw [eResidue.symm_apply_apply] + change IsLocalRing.ResidueField.map r + (residueAlgActionOfEqTop K AK + (localSeparableDecompositionGroup_eq_top K) sigma + (IsLocalRing.residue AK a)) = + residueAlgActionOfEqTop F AF + (localSeparableDecompositionGroup_eq_top F) sigmaF + (IsLocalRing.ResidueField.map r + (IsLocalRing.residue AK a)) + dsimp only [residueAlgActionOfEqTop] + rw [MonoidHom.comp_apply, MonoidHom.comp_apply, + decompositionGroupResidueAction_residue, + IsLocalRing.ResidueField.map_residue, + IsLocalRing.ResidueField.map_residue, + decompositionGroupResidueAction_residue] + congr 1 + apply Subtype.ext + change e (sigma (a : SeparableClosure K)) = + sigmaF (e (a : SeparableClosure K)) + simp [sigmaF] + change residueAbsoluteDegreeIn kAF OmegaF rhoF = + residueAbsoluteDegreeIn kAK OmegaK rhoK + rw [← hconjugate] + exact + residueAbsoluteDegreeIn_semilinear_conjugation + kAK OmegaK tau eResidue heResidue rhoK + +/-- Every `F`-algebra equivalence from the standard separable closure of a +finite fixed field `F` to the original ambient separable closure identifies +the two uniquely extended local valuation rings. -/ +theorem localSeparableValuationSubring_eq_comap_abstractFixedFieldEquiv + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField (Gal(SeparableClosure K/K))) + (e : SeparableClosure (finiteFixedField K H) ≃ₐ[finiteFixedField K H] SeparableClosure K) : + letI : FiniteDimensional K + (finiteFixedField K H) := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField + (finiteFixedField K H) := + finiteExtensionSpectralNormedField K + (finiteFixedField K H) + letI : ValuativeRel + (finiteFixedField K H) := + finiteExtensionSpectralValuativeRel K + (finiteFixedField K H) + letI : IsNonarchimedeanLocalField + (finiteFixedField K H) := + finiteExtensionSpectralIsNonarchimedeanLocalField K + (finiteFixedField K H) + localSeparableValuationSubring (finiteFixedField K H) = + (localSeparableValuationSubring K).comap e.toRingHom := by + let F := abstractFixedField K (SeparableClosure K) H.field + let : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + let : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + let : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + let : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + let : Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation F) := + finiteExtensionSpectralValuation_hasExtension K F + let A := localSeparableValuationSubring K + let B := A.comap e.toRingHom + have hcomap : + A.comap + (abstractFixedField K (SeparableClosure K) H.field).val.toRingHom = + (ValuativeRel.valuation F).valuationSubring := by + exact localSeparableValuationSubring_comap_embedding K F + (abstractFixedField K (SeparableClosure K) H.field).val + have hBext : + (localCompleteDVF F).valuation.HasExtension B.valuation := by + apply + hasExtension_valuation_of_valuationSubring_pullback + intro x + change e (algebraMap F (SeparableClosure F) x) ∈ A ↔ + x ∈ (localCompleteDVF F).valuation.valuationSubring + rw [e.commutes] + change x ∈ + A.comap + (abstractFixedField K (SeparableClosure K) H.field).val.toRingHom ↔ + x ∈ (ValuativeRel.valuation F).valuationSubring + rw [hcomap] + let : (localCompleteDVF F).valuation.HasExtension B.valuation := hBext + exact localSeparableValuationSubring_eq_of_hasExtension F B + +/-- The residue field presented through the ambient separable closure is +canonically equivalent to the residue intermediate field attached to the +finite fixing subgroup, compatibly with their embeddings into the selected +residue field. -/ +private theorem exists_abstractFixedFieldResidueEquiv + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField (Gal(SeparableClosure K/K))) + [FiniteDimensional K (finiteFixedField K H)] + [NontriviallyNormedField (finiteFixedField K H)] + [ValuativeRel (finiteFixedField K H)] + [IsNonarchimedeanLocalField (finiteFixedField K H)] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation (finiteFixedField K H))] + (e : SeparableClosure (finiteFixedField K H) ≃ₐ[finiteFixedField K H] SeparableClosure K) : + ∃ tau : + decompositionResidueField (finiteFixedField K H) + (localSeparableValuationSubring K) ≃+* + localAbstractFixedResidueIntermediateField K H.field, + ∀ x : decompositionResidueField (finiteFixedField K H) + (localSeparableValuationSubring K), + algebraMap + (decompositionResidueField (finiteFixedField K H) + (localSeparableValuationSubring K)) + (selectedResidueField (localSeparableValuationSubring K)) x = + algebraMap + (localAbstractFixedResidueIntermediateField K H.field) + (selectedResidueField (localSeparableValuationSubring K)) + (tau x) := by + let F := abstractFixedField K (SeparableClosure K) H.field + let A := localSeparableValuationSubring K + let C := (ValuativeRel.valuation F).valuationSubring + let V := (localCompleteDVF K).valuation.valuationSubring + let kK := IsLocalRing.ResidueField V + let kF := IsLocalRing.ResidueField C + let k₀ := decompositionResidueField K A + let kA := decompositionResidueField F A + let Omega := selectedResidueField A + let R := localAbstractFixedResidueIntermediateField K H.field + let j : F →ₐ[K] SeparableClosure K := + (abstractFixedField K (SeparableClosure K) H.field).val + let : (localCompleteDVF K).valuation.HasExtension C.valuation := by + apply + hasExtension_valuation_of_valuationSubring_pullback + intro x + change ValuativeRel.valuation F (algebraMap K F x) ≤ 1 ↔ + (localCompleteDVF K).valuation x ≤ 1 + rw [_root_.Valuation.HasExtension.val_map_le_one_iff + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + rfl + have hVC : V.valuation.HasExtension C.valuation := by + apply + hasExtension_valuation_of_valuationSubring_pullback + intro x + simpa only [V, ValuationSubring.valuationSubring_valuation] using + (valuationSubring_pullback_of_hasExtension_valuation + (localCompleteDVF K).valuation C x) + have hC : A.comap (algebraMap F (SeparableClosure K)) = C := by + simpa only [ + RamificationTheory.ValuationSubring.restrictIntermediateField_eq_comap] using + (ValuationSubring.restrictIntermediateField_eq_of_finite_separable + (localCompleteDVF K) A + (abstractFixedField K (SeparableClosure K) H.field) C) + have htop : decompositionGroup F A = ⊤ := + localSeparableDecompositionGroup_eq_top_finiteExtensionEquiv + K F j e + let eK : kK ≃+* k₀ := + localBaseResidueEquivDecompositionResidue K + let eA : kF ≃+* kA := + residueFieldEquivDecompositionResidueOfEqTop A C hC htop + let i : V →+* C := + ValuationTheory.Valuations.valuationSubringMapOfHasExtension V C hVC + let bar : kF →+* Omega := + (algebraMap kA Omega).comp eA.toRingHom + let : Algebra kK kF := by + change Algebra 𝓀[K] 𝓀[F] + exact IsLocalRing.ResidueField.instAlgebra + have hbar_base (x : kK) : + bar (algebraMap kK kF x) = + algebraMap k₀ Omega (eK x) := by + obtain ⟨a, rfl⟩ := IsLocalRing.residue_surjective x + have hres : + algebraMap kK kF (IsLocalRing.residue V a) = + IsLocalRing.residue C (i a) := by + change algebraMap 𝓀[K] 𝓀[F] + (IsLocalRing.residue 𝒪[K] a) = + IsLocalRing.residue 𝒪[F] (algebraMap 𝒪[K] 𝒪[F] a) + exact residueField_algebraMap_residue K F a + rw [hres] + change algebraMap kA Omega + (eA (IsLocalRing.residue C (i a))) = + algebraMap k₀ Omega + (eK (IsLocalRing.residue V a)) + rw [residueFieldEquivDecompositionResidueOfEqTop_algebraMap] + have hbase := + localBaseResidueEquivDecompositionResidue_algebraMap K a + change algebraMap k₀ Omega + (eK (IsLocalRing.residue V a)) = _ at hbase + rw [hbase] + congr 1 + let : Algebra k₀ kF := + ((algebraMap kK kF).comp eK.symm.toRingHom).toAlgebra + let barAlg : kF →ₐ[k₀] Omega := + { bar with + commutes' := fun z => by + change bar (algebraMap kK kF (eK.symm z)) = + algebraMap k₀ Omega z + simpa using hbar_base (eK.symm z) } + have hR : R = barAlg.fieldRange := by + change IntermediateField.adjoin k₀ + (Set.range (algebraMap kA Omega)) = barAlg.fieldRange + apply le_antisymm + · apply IntermediateField.adjoin_le_iff.mpr + rintro y ⟨z, rfl⟩ + obtain ⟨x, rfl⟩ := eA.surjective z + exact ⟨x, rfl⟩ + · rintro y ⟨x, rfl⟩ + apply IntermediateField.subset_adjoin + exact ⟨eA x, rfl⟩ + let eRange : kF ≃+* barAlg.fieldRange := + (AlgEquiv.ofInjectiveField barAlg).toRingEquiv + let eTop : kF ≃+* R := + eRange.trans + (IntermediateField.equivOfEq hR.symm).toRingEquiv + have heTop (x : kF) : + algebraMap R Omega (eTop x) = bar x := by + rfl + let tau : kA ≃+* R := eA.symm.trans eTop + refine ⟨tau, ?_⟩ + intro x + change algebraMap kA Omega x = + algebraMap R Omega (eTop (eA.symm x)) + rw [heTop] + simp [bar] + +private theorem residueAbsoluteDegreeIn_eq_normalizedDegree_abstractFixedFieldEquiv + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField (Gal(SeparableClosure K/K))) + [FiniteDimensional K (finiteFixedField K H)] + [NontriviallyNormedField (finiteFixedField K H)] + [ValuativeRel (finiteFixedField K H)] + [IsNonarchimedeanLocalField (finiteFixedField K H)] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation (finiteFixedField K H))] + [Fintype (decompositionResidueField (finiteFixedField K H) + (localSeparableValuationSubring K))] + (e : SeparableClosure (finiteFixedField K H) ≃ₐ[finiteFixedField K H] SeparableClosure K) + (sigma : Gal(SeparableClosure (finiteFixedField K H)/finiteFixedField K H)) + (htop : decompositionGroup (finiteFixedField K H) + (localSeparableValuationSubring K) = ⊤) + (tau : decompositionResidueField (finiteFixedField K H) + (localSeparableValuationSubring K) ≃+* + localAbstractFixedResidueIntermediateField K H.field) + (hTau : ∀ x : decompositionResidueField (finiteFixedField K H) + (localSeparableValuationSubring K), + algebraMap + (decompositionResidueField (finiteFixedField K H) + (localSeparableValuationSubring K)) + (selectedResidueField (localSeparableValuationSubring K)) x = + algebraMap + (localAbstractFixedResidueIntermediateField K H.field) + (selectedResidueField (localSeparableValuationSubring K)) + (tau x)) : + residueAbsoluteDegreeIn + (decompositionResidueField (finiteFixedField K H) + (localSeparableValuationSubring K)) + (selectedResidueField (localSeparableValuationSubring K)) + (residueAlgActionOfEqTop (finiteFixedField K H) + (localSeparableValuationSubring K) htop + (AlgEquiv.autCongr e sigma)) = + (localResidueDatum K).normalizedDegree + (H.toFiniteResidueAbstractField (localResidueDatum K)) + ((abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H.field).symm + (AlgEquiv.autCongr e sigma)) := by + let F := finiteFixedField K H + let : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let A := localSeparableValuationSubring K + let k₀ := decompositionResidueField K A + let kA := decompositionResidueField F A + let Omega := selectedResidueField A + let R := localAbstractFixedResidueIntermediateField K H.field + let eOmega : Omega ≃+* Omega := RingEquiv.refl Omega + have heOmega (x : kA) : + eOmega (algebraMap kA Omega x) = + algebraMap R Omega (tau x) := by + simpa [F, A, kA, Omega, R, eOmega] using hTau x + let sigmaH : H.field.toSubgroup := + (abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H.field).symm + (AlgEquiv.autCongr e sigma) + let rhoA : Omega ≃ₐ[kA] Omega := + residueAlgActionOfEqTop F A htop + (AlgEquiv.autCongr e sigma) + let rhoH : Omega ≃ₐ[R] Omega := + localAbstractFixedResidueActionOverIntermediateField + K H.field sigmaH + let conjugate : Omega ≃ₐ[R] Omega := + { eOmega.symm.trans (rhoA.toRingEquiv.trans eOmega) with + commutes' := + semilinearConjugate_commutes + tau eOmega heOmega rhoA } + have hconjugate : conjugate = rhoH := by + apply AlgEquiv.ext + intro x + change residueAlgActionOfEqTop F A htop + (AlgEquiv.autCongr e sigma) x = + localSeparableResidueAlgAction K sigmaH.1 x + have hsigmaH : + abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H.field sigmaH = + AlgEquiv.autCongr e sigma := + (abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H.field).apply_symm_apply + (AlgEquiv.autCongr e sigma) + exact + (congrArg + (fun tau : Gal(SeparableClosure K/F) => + residueAlgActionOfEqTop F A htop tau x) + hsigmaH).symm.trans + (localAbstractFixedResidueAction_apply K H.field sigmaH x).symm + let : Algebra k₀ R := R.algebra + let : FiniteDimensional k₀ R := + localAbstractFixedResidueIntermediateField_finiteDimensional K H.field + let : Finite R := Module.finite_of_finite k₀ + let : Fintype R := Fintype.ofFinite R + rw [localResidueDatum_normalizedDegree_eq_residueAbsoluteDegreeIn] + change residueAbsoluteDegreeIn kA Omega rhoA = + residueAbsoluteDegreeIn R Omega rhoH + rw [← hconjugate] + exact + (residueAbsoluteDegreeIn_semilinear_conjugation + kA Omega tau eOmega heOmega rhoA).symm + +/-- Changing from the canonical separable closure of a finite fixed field to +the original ambient separable closure identifies its intrinsic local +residue degree with the normalized degree on the corresponding abstract +field. -/ +theorem localResidueDegree_eq_normalizedDegree_abstractFixedFieldEquiv + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : FiniteAbstractField (Gal(SeparableClosure K/K))) + (e : SeparableClosure (finiteFixedField K H) ≃ₐ[finiteFixedField K H] SeparableClosure K) + (sigma : Gal(SeparableClosure (finiteFixedField K H)/finiteFixedField K H)) : + letI : FiniteDimensional K + (finiteFixedField K H) := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + letI : NontriviallyNormedField + (finiteFixedField K H) := + finiteExtensionSpectralNormedField K + (finiteFixedField K H) + letI : ValuativeRel + (finiteFixedField K H) := + finiteExtensionSpectralValuativeRel K + (finiteFixedField K H) + letI : IsNonarchimedeanLocalField + (finiteFixedField K H) := + finiteExtensionSpectralIsNonarchimedeanLocalField K + (finiteFixedField K H) + localResidueDegree (finiteFixedField K H) sigma = + (localResidueDatum K).normalizedDegree + (H.toFiniteResidueAbstractField (localResidueDatum K)) + ((abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H.field).symm + (AlgEquiv.autCongr e sigma)) := by + let F := abstractFixedField K (SeparableClosure K) H.field + let : Algebra F (SeparableClosure F) := + (separableClosure F (AlgebraicClosure F)).algebra + let : FiniteDimensional K F := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H.field H.finite + let : NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + let : ValuativeRel F := + finiteExtensionSpectralValuativeRel K F + let : IsNonarchimedeanLocalField F := + finiteExtensionSpectralIsNonarchimedeanLocalField K F + let : Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation F) := + finiteExtensionSpectralValuation_hasExtension K F + let A := localSeparableValuationSubring K + let kA := decompositionResidueField F A + let j : F →ₐ[K] SeparableClosure K := + (abstractFixedField K (SeparableClosure K) H.field).val + have htop : decompositionGroup F A = ⊤ := + localSeparableDecompositionGroup_eq_top_finiteExtensionEquiv + K F j e + obtain ⟨tau, hTau⟩ := exists_abstractFixedFieldResidueEquiv K H e + let : Fintype kA := + finiteExtensionDecompositionResidueFintype K F j e + have hlocal : + localResidueDegree F sigma = + residueAbsoluteDegreeIn kA (selectedResidueField A) + (residueAlgActionOfEqTop F A htop + (AlgEquiv.autCongr e sigma)) := + localResidueDegree_eq_residueAbsoluteDegreeIn_finiteExtensionEquiv + K F j e sigma + exact hlocal.trans + (residueAbsoluteDegreeIn_eq_normalizedDegree_abstractFixedFieldEquiv + K H e sigma htop tau hTau) + +/-- A finite field embedded in the separable closure has a fixing subgroup of finite index. -/ +private theorem finite_absoluteFixingQuotient_fieldRange + (K F : Type) [Field K] [Field F] [Algebra K F] [FiniteDimensional K F] + (i : F →ₐ[K] SeparableClosure K) : + Finite ((baseField (Gal(SeparableClosure K/K))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(SeparableClosure K/K))) + (closedFixingSubgroup K (SeparableClosure K) (AlgHom.fieldRange i)) + (le_baseField _)) := by + let H₀ := closedFixingSubgroup K (SeparableClosure K) (AlgHom.fieldRange i) + let : FiniteDimensional K (AlgHom.fieldRange i) := + (AlgEquiv.ofInjectiveField i).toLinearEquiv.finiteDimensional + let G := Gal(SeparableClosure K/K) + let Bases := { B : ClosedSubgroup G // + H₀.toSubgroup ≤ B.toSubgroup } + let Bfix : Bases := + ⟨closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K)), + fixingSubgroupLeBase K (SeparableClosure K) + (AlgHom.fieldRange i)⟩ + let Bbase : Bases := + ⟨baseField G, le_baseField H₀⟩ + let Q : Bases → Type := fun B => + B.1.toSubgroup ⧸ extensionSubgroup B.1 H₀ B.2 + have hBase : Bfix = Bbase := by + apply Subtype.ext + exact closedFixingSubgroup_bot_eq_baseField + K (SeparableClosure K) + let : Finite (Q Bfix) := by + change Finite + ((closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))).toSubgroup ⧸ + extensionSubgroup + (closedFixingSubgroup K (SeparableClosure K) + (⊥ : IntermediateField K (SeparableClosure K))) + H₀ + (fixingSubgroupLeBase K (SeparableClosure K) + (AlgHom.fieldRange i))) + infer_instance + change Finite (Q Bbase) + exact Finite.of_equiv (Q Bfix) + (Equiv.cast (congrArg Q hBase)) + +/-- A semilinear equivalence transports automorphisms fixing the corresponding base fields. -/ +def semilinearGaloisTransport + {k f Ω Ω' : Type} [Field k] [Field f] [Field Ω] [Field Ω'] + [Algebra k Ω] [Algebra f Ω'] (phi : k ≃+* f) (c : Ω ≃+* Ω') + (hc : ∀ x : k, c (algebraMap k Ω x) = algebraMap f Ω' (phi x)) + (sigma : Gal(Ω/k)) : Gal(Ω'/f) := + { c.symm.trans (sigma.toRingEquiv.trans c) with + commutes' := fun x => by + change c (sigma (c.symm (algebraMap f Ω' x))) = algebraMap f Ω' x + have hc' : c.symm (algebraMap f Ω' x) = algebraMap k Ω (phi.symm x) := by + apply c.injective + rw [c.apply_symm_apply, hc, phi.apply_symm_apply] + rw [hc', sigma.commutes, hc, phi.apply_symm_apply] } + +/-- The intrinsic residue degree of an arbitrary finite separable local +extension agrees with the normalized degree on the ambient fixing subgroup +cut out by an embedding into the base separable closure. Thus the +fixed-field comparison does not require the extension field itself to be +definitionally a fixed-field subtype. -/ +theorem + localResidueDegree_eq_normalizedDegree_finiteExtensionEquiv + (K F : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field F] [ValuativeRel F] [TopologicalSpace F] + [IsNonarchimedeanLocalField F] + [Algebra K F] [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation F)] + (i : F →ₐ[K] SeparableClosure K) : + letI : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + ∀ (e : SeparableClosure F ≃ₐ[F] SeparableClosure K) + (sigma : Gal(SeparableClosure F/F)), + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + letI hHabsolute : Finite + ((baseField + (Gal(SeparableClosure K/K))).toSubgroup ⧸ + extensionSubgroup + (baseField (Gal(SeparableClosure K/K))) + H₀ (le_baseField H₀)) := + by exact finite_absoluteFixingQuotient_fieldRange K F i + let H : FiniteAbstractField + (Gal(SeparableClosure K/K)) := + ⟨H₀, hHabsolute⟩ + let F₀ := + abstractFixedField K (SeparableClosure K) H₀ + let hfixed : + F₀ = AlgHom.fieldRange i := + InfiniteGalois.fixedField_fixingSubgroup + (AlgHom.fieldRange i) + let phi : F ≃+* F₀ := + ((i.equivFieldRange).trans + (IntermediateField.equivOfEq hfixed.symm)).toRingEquiv + let rho : Gal(SeparableClosure K/F₀) := + semilinearGaloisTransport phi e.toRingEquiv (fun x => by + change e (algebraMap F (SeparableClosure F) x) = + algebraMap F₀ (SeparableClosure K) (phi x) + rw [e.commutes] + rfl) sigma + localResidueDegree F sigma = + (localResidueDatum K).normalizedDegree + (H.toFiniteResidueAbstractField + (localResidueDatum K)) + ((abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H₀).symm + rho) := by + let : Algebra F (SeparableClosure K) := + i.toRingHom.toAlgebra + intro e sigma + dsimp only + let H₀ := + closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange i) + let hHabsolute : Finite + ((baseField + (Gal(SeparableClosure K/K))).toSubgroup ⧸ + extensionSubgroup + (baseField (Gal(SeparableClosure K/K))) + H₀ (le_baseField H₀)) := + finite_absoluteFixingQuotient_fieldRange K F i + let H : FiniteAbstractField + (Gal(SeparableClosure K/K)) := + ⟨H₀, hHabsolute⟩ + let F₀ := + abstractFixedField K (SeparableClosure K) H₀ + let : FiniteDimensional K F₀ := + abstractFixedField_finiteDimensional + K (SeparableClosure K) H₀ hHabsolute + let : NontriviallyNormedField F₀ := + finiteExtensionSpectralNormedField K F₀ + let : ValuativeRel F₀ := + finiteExtensionSpectralValuativeRel K F₀ + let : IsNonarchimedeanLocalField F₀ := + finiteExtensionSpectralIsNonarchimedeanLocalField K F₀ + let : Algebra.IsSeparable F₀ (SeparableClosure K) := + Algebra.isSeparable_tower_top_of_isSeparable + K F₀ (SeparableClosure K) + let : IsSepClosure F₀ (SeparableClosure K) := + ⟨inferInstance, inferInstance⟩ + let : Algebra F₀ (SeparableClosure F₀) := + (separableClosure F₀ (AlgebraicClosure F₀)).algebra + let e₀ : SeparableClosure F₀ ≃ₐ[F₀] SeparableClosure K := + IsSepClosure.equiv F₀ + (SeparableClosure F₀) (SeparableClosure K) + have hfixed : + F₀ = AlgHom.fieldRange i := + InfiniteGalois.fixedField_fixingSubgroup + (AlgHom.fieldRange i) + let phiAlg : F ≃ₐ[K] F₀ := + (i.equivFieldRange).trans + (IntermediateField.equivOfEq hfixed.symm) + let phi : F ≃+* F₀ := phiAlg.toRingEquiv + let c : SeparableClosure F ≃+* SeparableClosure F₀ := + e.toRingEquiv.trans e₀.symm.toRingEquiv + have hc (x : F) : + c (algebraMap F (SeparableClosure F) x) = + algebraMap F₀ (SeparableClosure F₀) (phi x) := by + change e₀.symm + (e (algebraMap F (SeparableClosure F) x)) = + algebraMap F₀ (SeparableClosure F₀) (phi x) + apply e₀.injective + rw [e₀.apply_symm_apply, e.commutes, e₀.commutes] + rfl + have hvaluation : + localSeparableValuationSubring F = + (localSeparableValuationSubring F₀).comap + c.toRingHom := by + have hF := + localSeparableValuationSubring_eq_comap_finiteExtensionEquiv + K F i e + have hF₀ := + localSeparableValuationSubring_eq_comap_abstractFixedFieldEquiv + K H e₀ + rw [hF, hF₀] + ext x + change + e x ∈ localSeparableValuationSubring K ↔ + e₀ (c x) ∈ localSeparableValuationSubring K + change + e x ∈ localSeparableValuationSubring K ↔ + e₀ (e₀.symm (e x)) ∈ localSeparableValuationSubring K + rw [e₀.apply_symm_apply] + let sigma₀ : Gal(SeparableClosure F₀/F₀) := + semilinearGaloisTransport phi c hc sigma + let rho : Gal(SeparableClosure K/F₀) := + semilinearGaloisTransport phi e.toRingEquiv (fun x => by + change e (algebraMap F (SeparableClosure F) x) = + algebraMap F₀ (SeparableClosure K) (phi x) + rw [e.commutes] + rfl) sigma + have hrho : + AlgEquiv.autCongr e₀ sigma₀ = rho := by + apply AlgEquiv.ext + intro x + simp only [AlgEquiv.autCongr_apply] + change + e₀ + (c (sigma (c.symm (e₀.symm x)))) = + e (sigma (e.symm x)) + rw [show c.symm (e₀.symm x) = e.symm x by + apply c.injective + rw [c.apply_symm_apply] + change e₀.symm x = e₀.symm (e (e.symm x)) + rw [e.apply_symm_apply]] + change e₀ (e₀.symm (e (sigma (e.symm x)))) = + e (sigma (e.symm x)) + rw [e₀.apply_symm_apply] + have hdegree : + localResidueDegree F₀ sigma₀ = + localResidueDegree F sigma := by + simpa only [sigma₀, semilinearGaloisTransport] using + localResidueDegree_semilinear_conjugation + F F₀ phi c hc hvaluation sigma + have hfixedDegree : + localResidueDegree F₀ sigma₀ = + (localResidueDatum K).normalizedDegree + (H.toFiniteResidueAbstractField + (localResidueDatum K)) + ((abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H₀).symm + (AlgEquiv.autCongr e₀ sigma₀)) := by + exact + localResidueDegree_eq_normalizedDegree_abstractFixedFieldEquiv + K H e₀ sigma₀ + rw [hrho] at hfixedDegree + change + localResidueDegree F sigma = + (localResidueDatum K).normalizedDegree + (H.toFiniteResidueAbstractField + (localResidueDatum K)) + ((abstractSubgroupEquivGaloisGroup + K (SeparableClosure K) H₀).symm rho) + exact hdegree.symm.trans hfixedDegree + + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean new file mode 100644 index 0000000000..732bc9c4ef --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean @@ -0,0 +1,741 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldRelativeNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalClassFieldAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main +public import Mathlib.FieldTheory.Galois.Notation +/-! +# Naturality of fixed-field norm-residue symbols + +This file transports norm-restriction and transfer-inclusion naturality +from the closed-subgroup class formation to actual fixed fields in a single +Galois ambient field. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation LocalClassFieldTheory + +variable (k Ω : Type) [Field k] [Field Ω] [Algebra k Ω] [IsGalois k Ω] + +/-- Inclusion of the units of the lower concrete fixed field in the units +of the larger concrete fixed field. -/ +def abstractFixedFieldUnitsInclusion + (K K' : ClosedSubgroup (Gal(Ω/k))) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) : + Additive (abstractFixedField k Ω K)ˣ →+ + Additive (abstractFixedField k Ω K')ˣ := + MonoidHom.toAdditive + (Units.map + (IntermediateField.inclusion + (abstractFixedField_le k Ω hK'K)).toRingHom) + +omit [IsGalois k Ω] in +/-- The concrete fixed-field unit equivalences identify actual unit +inclusion with inclusion of fixed coefficients. -/ +theorem abstractFixedFieldUnitsEquiv_inclusion + (K K' : ClosedSubgroup (Gal(Ω/k))) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + (x : Additive (abstractFixedField k Ω K)ˣ) : + abstractFixedFieldUnitsEquivGaloisFixed k Ω K' + (abstractFixedFieldUnitsInclusion k Ω K K' hK'K x) = + fixedFieldInclusion (galoisAmbientUnitsRep k Ω) + K K' hK'K + (abstractFixedFieldUnitsEquivGaloisFixed k Ω K x) := by + apply Subtype.ext + apply Additive.ext + apply Units.ext + rfl + +/-- The norm-residue symbol on the actual units of a concrete fixed field, +obtained from the abstract class-formation symbol through the canonical +fixed-unit and relative-Galois identifications. -/ +noncomputable def abstractFixedFieldNormResidueSymbol + (D : DegreeData (Gal(Ω/k))) + (v : ValuationData D (galoisAmbientUnitsRep k Ω)) + (hcf : SatisfiesClassFieldAxiom + (galoisAmbientUnitsRep k Ω)) + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup K L hLK).Normal] + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [hKabsolute : Finite + ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K + (le_baseField K))] : + Additive (abstractFixedField k Ω K)ˣ →+ + Additive (Abelianization + Gal(abstractRelativeFixedField k Ω hLK/abstractFixedField k Ω K)) := by + let KF : FiniteAbstractField (Gal(Ω/k)) := + ⟨K, hKabsolute⟩ + let E : FiniteGaloisSubextension KF.field := + ⟨L, hLK, hnormal, hfinite⟩ + exact + (MulEquiv.toAdditive + (abstractExtensionQuotientEquivGaloisGroup + k Ω K L hLK hnormal).abelianizationCongr).toAddMonoidHom.comp + ((D.normResidueSymbol (galoisAmbientUnitsRep k Ω) + v hcf KF E).toAddMonoidHom.comp + ((finiteNormClassHom (galoisAmbientUnitsRep k Ω) + K L hLK).comp + (abstractFixedFieldUnitsEquivGaloisFixed + k Ω K).toAddMonoidHom)) + +/-- The ordinary field norm on units between two concrete fixed fields. -/ +def abstractFixedFieldNormUnits + (K K' : ClosedSubgroup (Gal(Ω/k))) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) : + Additive (abstractRelativeFixedField k Ω hK'K)ˣ →+ + Additive (abstractFixedField k Ω K)ˣ := + MonoidHom.toAdditive + (normUnits (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hK'K)) + +/-- Restriction between the abelianized actual relative Galois groups in a +fixed-field square, transported through the canonical quotient/Galois +equivalences. -/ +noncomputable def abstractFixedFieldAbelianizedRestriction + (K K' L L' : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + [hL'normal : (extensionSubgroup K' L' hL'K').Normal] : + Additive (Abelianization + Gal(abstractRelativeFixedField k Ω hL'K'/abstractFixedField k Ω K')) →+ + Additive (Abelianization + Gal(abstractRelativeFixedField k Ω hLK/abstractFixedField k Ω K)) := + MonoidHom.toAdditive + ((abstractExtensionQuotientEquivGaloisGroup + k Ω K L hLK hLnormal).abelianizationCongr.toMonoidHom.comp + ((normResidueNaturalityAbelianizedRestriction K K' L L' + hLK hL'K' hK'K hL'L).comp + (abstractExtensionQuotientEquivGaloisGroup + k Ω K' L' hL'K' + hL'normal).abelianizationCongr.symm.toMonoidHom)) + +/-- On an ambient representative, the transported actual restriction is +restriction of that same automorphism to the smaller upper fixed field. -/ +theorem abstractFixedFieldAbelianizedRestriction_on_representative + (K K' L L' : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + [hL'normal : (extensionSubgroup K' L' hL'K').Normal] + (σ : K'.toSubgroup) : + let q := abstractExtensionQuotientEquivGaloisGroup + k Ω K L hLK hLnormal + let q' := abstractExtensionQuotientEquivGaloisGroup + k Ω K' L' hL'K' hL'normal + abstractFixedFieldAbelianizedRestriction + k Ω K K' L L' hLK hL'K' hK'K hL'L + (Additive.ofMul + (q'.abelianizationCongr + (Abelianization.of (QuotientGroup.mk σ)))) = + Additive.ofMul + (q.abelianizationCongr + (Abelianization.of + (QuotientGroup.mk (Subgroup.inclusion hK'K σ)))) := by + dsimp only + let q := abstractExtensionQuotientEquivGaloisGroup + k Ω K L hLK hLnormal + let q' := abstractExtensionQuotientEquivGaloisGroup + k Ω K' L' hL'K' hL'normal + change Additive.ofMul + (q.abelianizationCongr + (normResidueNaturalityAbelianizedRestriction K K' L L' + hLK hL'K' hK'K hL'L + (q'.abelianizationCongr.symm + (q'.abelianizationCongr + (Abelianization.of (QuotientGroup.mk σ)))))) = _ + rw [q'.abelianizationCongr.symm_apply_apply] + rw [normResidueNaturalityAbelianizedRestriction_of_mk] + +/-- Norm-restriction naturality for actual fixed fields. +Actual Galois restriction is compatible with the ordinary unit norm and +the unit-level norm-residue symbols. No normality of the intermediate +extension `K'/K` is assumed. -/ +theorem abstractFixedFieldNormResidueSymbol_norm_restriction + [IsSepClosed Ω] + (D : DegreeData (Gal(Ω/k))) + (v : ValuationData D (galoisAmbientUnitsRep k Ω)) + (hcf : SatisfiesClassFieldAxiom + (galoisAmbientUnitsRep k Ω)) + (K K' L L' : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + (hL'L : L'.toSubgroup ≤ L.toSubgroup) + [hLnormal : (extensionSubgroup K L hLK).Normal] + [hL'normal : (extensionSubgroup K' L' hL'K').Normal] + [hLKfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [hL'K'finite : Finite + (K'.toSubgroup ⧸ extensionSubgroup K' L' hL'K')] + [hK'Kfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K K' hK'K)] + [hKabsolute : Finite + ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K + (le_baseField K))] : + letI : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K' + (le_baseField K')) := + relativeTowerQuotientFinite (baseField (Gal(Ω/k))) K K' hK'K + (le_baseField K) + (abstractFixedFieldAbelianizedRestriction + k Ω K K' L L' hLK hL'K' hK'K hL'L).comp + (abstractFixedFieldNormResidueSymbol + k Ω D v hcf K' L' hL'K') = + (abstractFixedFieldNormResidueSymbol + k Ω D v hcf K L hLK).comp + (abstractFixedFieldNormUnits k Ω K K' hK'K) := by + let : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K' + (le_baseField K')) := + relativeTowerQuotientFinite (baseField (Gal(Ω/k))) K K' hK'K + (le_baseField K) + let KF : FiniteAbstractField (Gal(Ω/k)) := + ⟨K, hKabsolute⟩ + let K'F : FiniteAbstractField (Gal(Ω/k)) := + ⟨K', inferInstance⟩ + let T : FiniteAbstractFieldExtension (Gal(Ω/k)) := + { field := K'F + base := KF + below := hK'K + finiteQuotient := hK'Kfinite } + apply AddMonoidHom.ext + intro x + have h := DFunLike.congr_fun + (D.normResidueNaturality_norm_restriction + (galoisAmbientUnitsRep k Ω) v hcf + T L L' hLK hL'K' hL'L) + (finiteNormClass (galoisAmbientUnitsRep k Ω) K' L' hL'K' + (abstractFixedFieldUnitsEquivGaloisFixed k Ω K' x)) + dsimp only [T, KF, K'F] at h + let q := abstractExtensionQuotientEquivGaloisGroup + k Ω K L hLK hLnormal + let q' := abstractExtensionQuotientEquivGaloisGroup + k Ω K' L' hL'K' hL'normal + let E : FiniteGaloisSubextension KF.field := + ⟨L, hLK, hLnormal, hLKfinite⟩ + let E' : FiniteGaloisSubextension K'F.field := + ⟨L', hL'K', hL'normal, hL'K'finite⟩ + change Additive.ofMul + (q.abelianizationCongr + (normResidueNaturalityAbelianizedRestriction K K' L L' + hLK hL'K' hK'K hL'L + (q'.abelianizationCongr.symm + (q'.abelianizationCongr + (Additive.toMul + (D.normResidueSymbol + (galoisAmbientUnitsRep k Ω) v hcf K'F E' + (finiteNormClass (galoisAmbientUnitsRep k Ω) K' L' hL'K' + (abstractFixedFieldUnitsEquivGaloisFixed + k Ω K' x)))))))) = + Additive.ofMul + (q.abelianizationCongr + (Additive.toMul + (D.normResidueSymbol + (galoisAmbientUnitsRep k Ω) v hcf KF E + (finiteNormClass (galoisAmbientUnitsRep k Ω) K L hLK + (abstractFixedFieldUnitsEquivGaloisFixed k Ω K + (abstractFixedFieldNormUnits + k Ω K K' hK'K x)))))) + apply Additive.toMul.injective + change q.abelianizationCongr _ = q.abelianizationCongr _ + rw [q.abelianizationCongr.apply_eq_iff_eq] + rw [q'.abelianizationCongr.symm_apply_apply] + change _ = + D.normResidueSymbol + (galoisAmbientUnitsRep k Ω) v hcf KF E + (finiteReciprocityNaturalityNormMap + (galoisAmbientUnitsRep k Ω) K K' L L' + hLK hL'K' hK'K hL'L + (finiteNormClass (galoisAmbientUnitsRep k Ω) K' L' hL'K' + (abstractFixedFieldUnitsEquivGaloisFixed k Ω K' x))) at h + rw [finiteReciprocityNaturalityNormMap_finiteNormClass] at h + have hxFixed : + abstractFixedFieldUnitsEquivGaloisFixed k Ω K' x = + abstractRelativeFixedFieldUnitsEquivGaloisFixed + k Ω K K' hK'K + (Additive.ofMul (Additive.toMul x)) := by + rfl + rw [hxFixed] at h + rw [relativeNorm_abstractFixedFieldUnit_eq_normUnits + k Ω K K' hK'K (Additive.toMul x)] at h + exact congrArg Additive.toMul h + +/-- Transfer between the abelianized actual relative Galois groups in a +fixed-field tower, transported through the two canonical quotient/Galois +equivalences. -/ +noncomputable def abstractFixedFieldAbelianizedTransfer + (K K' L : ClosedSubgroup (Gal(Ω/k))) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLK'.trans hK'K)).Normal] + [hLfinite : Finite + (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))] : + letI : (extensionSubgroup K' L hLK').Normal := + transferNormNaturality_intermediateExtension_normal K K' L hLK' hK'K + letI : Finite + (K'.toSubgroup ⧸ extensionSubgroup K' L hLK') := + FiniteGaloisSubextension.finite_extension_over_intermediate + (hLK'.trans hK'K) hK'K hLK' + Additive (Abelianization + Gal(abstractRelativeFixedField k Ω (hLK'.trans hK'K)/abstractFixedField k Ω K)) →+ + Additive (Abelianization + Gal(abstractRelativeFixedField k Ω hLK'/abstractFixedField k Ω K')) := by + letI : (extensionSubgroup K' L hLK').Normal := + transferNormNaturality_intermediateExtension_normal K K' L hLK' hK'K + letI : Finite + (K'.toSubgroup ⧸ extensionSubgroup K' L hLK') := + FiniteGaloisSubextension.finite_extension_over_intermediate + (hLK'.trans hK'K) hK'K hLK' + exact MonoidHom.toAdditive + ((abstractExtensionQuotientEquivGaloisGroup + k Ω K' L hLK' inferInstance).abelianizationCongr.toMonoidHom.comp + ((transferNormNaturalityTransfer K K' L hLK' hK'K).comp + (abstractExtensionQuotientEquivGaloisGroup + k Ω K L (hLK'.trans hK'K) + hLnormal).abelianizationCongr.symm.toMonoidHom)) + +/-- Transfer-inclusion naturality for actual fixed fields. +Transfer of the actual relative Galois abelianizations is compatible with +inclusion of actual fixed-field units and the unit-level norm-residue +symbols. -/ +theorem abstractFixedFieldNormResidueSymbol_transfer_inclusion + (D : DegreeData (Gal(Ω/k))) + (v : ValuationData D (galoisAmbientUnitsRep k Ω)) + (hcf : SatisfiesClassFieldAxiom + (galoisAmbientUnitsRep k Ω)) + (K K' L : ClosedSubgroup (Gal(Ω/k))) + (hLK' : L.toSubgroup ≤ K'.toSubgroup) + (hK'K : K'.toSubgroup ≤ K.toSubgroup) + [hLnormal : + (extensionSubgroup K L (hLK'.trans hK'K)).Normal] + [hLfinite : Finite + (K.toSubgroup ⧸ + extensionSubgroup K L (hLK'.trans hK'K))] + [hKabsolute : Finite + ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K + (le_baseField K))] : + letI : (extensionSubgroup K' L hLK').Normal := + transferNormNaturality_intermediateExtension_normal K K' L hLK' hK'K + letI : Finite + (K'.toSubgroup ⧸ extensionSubgroup K' L hLK') := + FiniteGaloisSubextension.finite_extension_over_intermediate + (hLK'.trans hK'K) hK'K hLK' + letI : Finite + (K.toSubgroup ⧸ extensionSubgroup K K' hK'K) := + FiniteGaloisSubextension.finite_intermediate_extension + (hLK'.trans hK'K) hLK' hK'K + letI : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K' + (le_baseField K')) := + relativeTowerQuotientFinite (baseField (Gal(Ω/k))) K K' hK'K + (le_baseField K) + (abstractFixedFieldAbelianizedTransfer + k Ω K K' L hLK' hK'K).comp + (abstractFixedFieldNormResidueSymbol + k Ω D v hcf K L (hLK'.trans hK'K)) = + (abstractFixedFieldNormResidueSymbol + k Ω D v hcf K' L hLK').comp + (abstractFixedFieldUnitsInclusion k Ω K K' hK'K) := by + let : (extensionSubgroup K' L hLK').Normal := + transferNormNaturality_intermediateExtension_normal K K' L hLK' hK'K + let : Finite + (K'.toSubgroup ⧸ extensionSubgroup K' L hLK') := + FiniteGaloisSubextension.finite_extension_over_intermediate + (hLK'.trans hK'K) hK'K hLK' + let : Finite + (K.toSubgroup ⧸ extensionSubgroup K K' hK'K) := + FiniteGaloisSubextension.finite_intermediate_extension + (hLK'.trans hK'K) hLK' hK'K + let : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K' + (le_baseField K')) := + relativeTowerQuotientFinite (baseField (Gal(Ω/k))) K K' hK'K + (le_baseField K) + let KF : FiniteAbstractField (Gal(Ω/k)) := + ⟨K, hKabsolute⟩ + let K'F : FiniteAbstractField (Gal(Ω/k)) := + ⟨K', inferInstance⟩ + let T : FiniteAbstractFieldExtension (Gal(Ω/k)) := + { field := K'F + base := KF + below := hK'K + finiteQuotient := inferInstance } + apply AddMonoidHom.ext + intro x + have h := DFunLike.congr_fun + (D.normResidueNaturality_transfer_inclusion + (galoisAmbientUnitsRep k Ω) v hcf + T L hLK') + (finiteNormClass (galoisAmbientUnitsRep k Ω) + K L (hLK'.trans hK'K) + (abstractFixedFieldUnitsEquivGaloisFixed k Ω K x)) + dsimp only [T, KF, K'F] at h + let q := abstractExtensionQuotientEquivGaloisGroup + k Ω K L (hLK'.trans hK'K) hLnormal + let q' := abstractExtensionQuotientEquivGaloisGroup + k Ω K' L hLK' (inferInstance : + (extensionSubgroup K' L hLK').Normal) + let E : FiniteGaloisSubextension KF.field := + ⟨L, hLK'.trans hK'K, hLnormal, hLfinite⟩ + let E' : FiniteGaloisSubextension K'F.field := + ⟨L, hLK', inferInstance, inferInstance⟩ + change Additive.ofMul + (q'.abelianizationCongr + (transferNormNaturalityTransfer K K' L hLK' hK'K + (q.abelianizationCongr.symm + (q.abelianizationCongr + (Additive.toMul + (D.normResidueSymbol + (galoisAmbientUnitsRep k Ω) v hcf KF E + (finiteNormClass (galoisAmbientUnitsRep k Ω) + K L (hLK'.trans hK'K) + (abstractFixedFieldUnitsEquivGaloisFixed + k Ω K x)))))))) = + Additive.ofMul + (q'.abelianizationCongr + (Additive.toMul + (D.normResidueSymbol + (galoisAmbientUnitsRep k Ω) v hcf K'F E' + (finiteNormClass (galoisAmbientUnitsRep k Ω) K' L hLK' + (abstractFixedFieldUnitsEquivGaloisFixed k Ω K' + (abstractFixedFieldUnitsInclusion + k Ω K K' hK'K x)))))) + apply Additive.toMul.injective + change q'.abelianizationCongr _ = q'.abelianizationCongr _ + rw [q'.abelianizationCongr.apply_eq_iff_eq] + rw [q.abelianizationCongr.symm_apply_apply] + change _ = + D.normResidueSymbol + (galoisAmbientUnitsRep k Ω) v hcf K'F E' + (transferNormNaturalityNormQuotientInclusion + (galoisAmbientUnitsRep k Ω) K K' L hLK' hK'K + (finiteNormClass (galoisAmbientUnitsRep k Ω) + K L (hLK'.trans hK'K) + (abstractFixedFieldUnitsEquivGaloisFixed k Ω K x))) at h + rw [transferNormNaturality_normQuotientInclusion_finiteNormClass] at h + rw [← abstractFixedFieldUnitsEquiv_inclusion k Ω K K' hK'K x] at h + exact congrArg Additive.toMul h + +/-! ## Canonical local-field specializations -/ + +open scoped ValuativeRel + +/-- A finite fixed-field square encoding norm-restriction naturality +inside the separable closure of a local field. + +The two horizontal extensions are finite Galois. The vertical base extension +is finite but need not be normal. -/ +structure LocalFixedFieldNormRestrictionSquare + (k : Type) [Field k] [ValuativeRel k] [TopologicalSpace k] + [IsNonarchimedeanLocalField k] where + /-- The subgroup fixing the lower base field. -/ + lowerBase : ClosedSubgroup (Gal(SeparableClosure k/k)) + /-- The subgroup fixing the upper base field. -/ + upperBase : ClosedSubgroup (Gal(SeparableClosure k/k)) + /-- The subgroup fixing the top field of the lower horizontal extension. -/ + lowerTop : ClosedSubgroup (Gal(SeparableClosure k/k)) + /-- The subgroup fixing the top field of the upper horizontal extension. -/ + upperTop : ClosedSubgroup (Gal(SeparableClosure k/k)) + /-- The lower top subgroup lies in the lower base subgroup. -/ + lowerTop_le_lowerBase : lowerTop.toSubgroup ≤ lowerBase.toSubgroup + /-- The upper top subgroup lies in the upper base subgroup. -/ + upperTop_le_upperBase : upperTop.toSubgroup ≤ upperBase.toSubgroup + /-- The upper base subgroup lies in the lower base subgroup. -/ + upperBase_le_lowerBase : upperBase.toSubgroup ≤ lowerBase.toSubgroup + /-- The upper top subgroup lies in the lower top subgroup. -/ + upperTop_le_lowerTop : upperTop.toSubgroup ≤ lowerTop.toSubgroup + /-- The lower horizontal extension subgroup is normal. -/ + lowerNormal : + (extensionSubgroup lowerBase lowerTop lowerTop_le_lowerBase).Normal + /-- The upper horizontal extension subgroup is normal. -/ + upperNormal : + (extensionSubgroup upperBase upperTop upperTop_le_upperBase).Normal + /-- The lower horizontal extension has finite Galois group. -/ + lowerFinite : + Finite (lowerBase.toSubgroup ⧸ + extensionSubgroup lowerBase lowerTop lowerTop_le_lowerBase) + /-- The upper horizontal extension has finite Galois group. -/ + upperFinite : + Finite (upperBase.toSubgroup ⧸ + extensionSubgroup upperBase upperTop upperTop_le_upperBase) + /-- The vertical base extension has finite degree. -/ + baseFinite : + Finite (lowerBase.toSubgroup ⧸ + extensionSubgroup lowerBase upperBase upperBase_le_lowerBase) + /-- The lower base field is finite over the original local field. -/ + lowerAbsoluteFinite : + Finite + ((baseField (Gal(SeparableClosure k/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(SeparableClosure k/k))) + lowerBase (le_baseField lowerBase)) + +namespace LocalFixedFieldNormRestrictionSquare + +variable {k : Type} [Field k] [ValuativeRel k] [TopologicalSpace k] + [IsNonarchimedeanLocalField k] + +/-- The quotient from the absolute subgroup to the upper fixed-field subgroup is finite. -/ +theorem upperAbsoluteFinite + (T : LocalFixedFieldNormRestrictionSquare k) : + Finite + ((baseField (Gal(SeparableClosure k/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(SeparableClosure k/k))) + T.upperBase (le_baseField T.upperBase)) := by + let := T.lowerAbsoluteFinite + let := T.baseFinite + exact + relativeTowerQuotientFinite + (baseField (Gal(SeparableClosure k/k))) + T.lowerBase T.upperBase T.upperBase_le_lowerBase + (le_baseField T.lowerBase) + +/-- The fixed-field norm-residue symbol for the lower horizontal extension, +induced by the canonical local class formation. -/ +noncomputable def lowerNormResidueSymbol + (T : LocalFixedFieldNormRestrictionSquare k) := + letI := T.lowerNormal + letI := T.lowerFinite + letI := T.lowerAbsoluteFinite + abstractFixedFieldNormResidueSymbol k (SeparableClosure k) + (localResidueDatum k) (localHenselianValuation k) + (separableClosureUnits_isClassFormation k) + T.lowerBase T.lowerTop T.lowerTop_le_lowerBase + +/-- The fixed-field norm-residue symbol for the upper horizontal extension, +induced by the canonical local class formation. -/ +noncomputable def upperNormResidueSymbol + (T : LocalFixedFieldNormRestrictionSquare k) := + letI := T.upperNormal + letI := T.upperFinite + letI := upperAbsoluteFinite T + abstractFixedFieldNormResidueSymbol k (SeparableClosure k) + (localResidueDatum k) (localHenselianValuation k) + (separableClosureUnits_isClassFormation k) + T.upperBase T.upperTop T.upperTop_le_upperBase + +/-- The ordinary field norm on units along the vertical base extension. -/ +noncomputable def normUnits + (T : LocalFixedFieldNormRestrictionSquare k) := + abstractFixedFieldNormUnits k (SeparableClosure k) + T.lowerBase T.upperBase T.upperBase_le_lowerBase + +/-- Restriction between the abelianized actual relative Galois groups. -/ +noncomputable def abelianizedRestriction + (T : LocalFixedFieldNormRestrictionSquare k) := + letI := T.lowerNormal + letI := T.upperNormal + abstractFixedFieldAbelianizedRestriction k (SeparableClosure k) + T.lowerBase T.upperBase T.lowerTop T.upperTop + T.lowerTop_le_lowerBase T.upperTop_le_upperBase + T.upperBase_le_lowerBase T.upperTop_le_lowerTop + +/-- Canonical norm-restriction naturality for a local fixed-field square. +Restriction commutes with the ordinary field norm and the fixed-field +norm-residue symbols induced by the canonical local class formation for the +finite Galois square bundled by `T`; no normality of the vertical base +extension is required. -/ +theorem norm_restriction_commutes + (T : LocalFixedFieldNormRestrictionSquare k) : + (abelianizedRestriction T).comp (upperNormResidueSymbol T) = + (lowerNormResidueSymbol T).comp (normUnits T) := by + let := T.lowerNormal + let := T.upperNormal + let := T.lowerFinite + let := T.upperFinite + let := T.baseFinite + let := T.lowerAbsoluteFinite + let := upperAbsoluteFinite T + simpa [abelianizedRestriction, upperNormResidueSymbol, + lowerNormResidueSymbol, normUnits] using + (abstractFixedFieldNormResidueSymbol_norm_restriction + k (SeparableClosure k) + (localResidueDatum k) (localHenselianValuation k) + (separableClosureUnits_isClassFormation k) + T.lowerBase T.upperBase T.lowerTop T.upperTop + T.lowerTop_le_lowerBase T.upperTop_le_upperBase + T.upperBase_le_lowerBase T.upperTop_le_lowerTop) + +end LocalFixedFieldNormRestrictionSquare + +/-- A finite fixed-field tower encoding transfer-inclusion naturality +inside the separable closure of a local field. + +The total extension is finite Galois. Normality and finiteness of the upper +part of the tower are derived internally. -/ +structure LocalFixedFieldTransferTower + (k : Type) [Field k] [ValuativeRel k] [TopologicalSpace k] + [IsNonarchimedeanLocalField k] where + /-- The subgroup fixing the base field of the tower. -/ + base : ClosedSubgroup (Gal(SeparableClosure k/k)) + /-- The subgroup fixing the intermediate field of the tower. -/ + intermediate : ClosedSubgroup (Gal(SeparableClosure k/k)) + /-- The subgroup fixing the top field of the tower. -/ + top : ClosedSubgroup (Gal(SeparableClosure k/k)) + /-- The top subgroup lies in the intermediate subgroup. -/ + top_le_intermediate : top.toSubgroup ≤ intermediate.toSubgroup + /-- The intermediate subgroup lies in the base subgroup. -/ + intermediate_le_base : intermediate.toSubgroup ≤ base.toSubgroup + /-- The total extension subgroup is normal in the base subgroup. -/ + totalNormal : + (extensionSubgroup base top + (top_le_intermediate.trans intermediate_le_base)).Normal + /-- The total extension has finite Galois group. -/ + totalFinite : + Finite (base.toSubgroup ⧸ + extensionSubgroup base top + (top_le_intermediate.trans intermediate_le_base)) + /-- The base field is finite over the original local field. -/ + baseAbsoluteFinite : + Finite + ((baseField (Gal(SeparableClosure k/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(SeparableClosure k/k))) + base (le_baseField base)) + +namespace LocalFixedFieldTransferTower + +variable {k : Type} [Field k] [ValuativeRel k] [TopologicalSpace k] + [IsNonarchimedeanLocalField k] + +/-- The top extension subgroup is normal inside the intermediate subgroup. -/ +theorem intermediateNormal (T : LocalFixedFieldTransferTower k) : + (extensionSubgroup T.intermediate T.top + T.top_le_intermediate).Normal := by + let := T.totalNormal + exact + transferNormNaturality_intermediateExtension_normal + T.base T.intermediate T.top + T.top_le_intermediate T.intermediate_le_base + +/-- The quotient of the intermediate subgroup by the top extension subgroup is finite. -/ +theorem intermediateFinite (T : LocalFixedFieldTransferTower k) : + Finite (T.intermediate.toSubgroup ⧸ + extensionSubgroup T.intermediate T.top + T.top_le_intermediate) := by + let := T.totalNormal + let := T.totalFinite + exact + FiniteGaloisSubextension.finite_extension_over_intermediate + (T.top_le_intermediate.trans T.intermediate_le_base) + T.intermediate_le_base T.top_le_intermediate + +/-- The quotient of the base subgroup by the intermediate extension subgroup is finite. -/ +theorem baseIntermediateFinite + (T : LocalFixedFieldTransferTower k) : + Finite (T.base.toSubgroup ⧸ + extensionSubgroup T.base T.intermediate + T.intermediate_le_base) := by + let := T.totalNormal + let := T.totalFinite + exact + FiniteGaloisSubextension.finite_intermediate_extension + (T.top_le_intermediate.trans T.intermediate_le_base) + T.top_le_intermediate T.intermediate_le_base + +/-- The absolute quotient determined by the intermediate fixed field is finite. -/ +theorem intermediateAbsoluteFinite + (T : LocalFixedFieldTransferTower k) : + Finite + ((baseField (Gal(SeparableClosure k/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(SeparableClosure k/k))) + T.intermediate (le_baseField T.intermediate)) := by + let := T.baseAbsoluteFinite + let := baseIntermediateFinite T + exact + relativeTowerQuotientFinite + (baseField (Gal(SeparableClosure k/k))) + T.base T.intermediate T.intermediate_le_base + (le_baseField T.base) + +/-- The fixed-field norm-residue symbol for the total extension, induced by +the canonical local class formation. -/ +noncomputable def baseNormResidueSymbol + (T : LocalFixedFieldTransferTower k) := + letI := T.totalNormal + letI := T.totalFinite + letI := T.baseAbsoluteFinite + abstractFixedFieldNormResidueSymbol k (SeparableClosure k) + (localResidueDatum k) (localHenselianValuation k) + (separableClosureUnits_isClassFormation k) + T.base T.top + (T.top_le_intermediate.trans T.intermediate_le_base) + +/-- The fixed-field norm-residue symbol after changing the base to the +intermediate fixed field, induced by the canonical local class formation. -/ +noncomputable def intermediateNormResidueSymbol + (T : LocalFixedFieldTransferTower k) := + letI := intermediateNormal T + letI := intermediateFinite T + letI := intermediateAbsoluteFinite T + abstractFixedFieldNormResidueSymbol k (SeparableClosure k) + (localResidueDatum k) (localHenselianValuation k) + (separableClosureUnits_isClassFormation k) + T.intermediate T.top T.top_le_intermediate + +/-- Inclusion of actual fixed-field units along the base change. -/ +noncomputable def unitsInclusion + (T : LocalFixedFieldTransferTower k) := + abstractFixedFieldUnitsInclusion k (SeparableClosure k) + T.base T.intermediate T.intermediate_le_base + +/-- Transfer between the abelianized actual relative Galois groups. -/ +noncomputable def abelianizedTransfer + (T : LocalFixedFieldTransferTower k) := + letI := T.totalNormal + letI := T.totalFinite + abstractFixedFieldAbelianizedTransfer k (SeparableClosure k) + T.base T.intermediate T.top + T.top_le_intermediate T.intermediate_le_base + +/-- Canonical transfer-inclusion naturality for a local fixed-field tower. +Transfer commutes with inclusion of fixed-field units and the fixed-field +norm-residue symbols induced by the canonical local class formation for the +finite Galois tower bundled by `T`. -/ +theorem transfer_inclusion_commutes + (T : LocalFixedFieldTransferTower k) : + (abelianizedTransfer T).comp (baseNormResidueSymbol T) = + (intermediateNormResidueSymbol T).comp (unitsInclusion T) := by + let := T.totalNormal + let := T.totalFinite + let := T.baseAbsoluteFinite + let := intermediateNormal T + let := intermediateFinite T + let := baseIntermediateFinite T + let := intermediateAbsoluteFinite T + simpa [abelianizedTransfer, baseNormResidueSymbol, + intermediateNormResidueSymbol, unitsInclusion] using + (abstractFixedFieldNormResidueSymbol_transfer_inclusion + k (SeparableClosure k) + (localResidueDatum k) (localHenselianValuation k) + (separableClosureUnits_isClassFormation k) + T.base T.intermediate T.top + T.top_le_intermediate T.intermediate_le_base) + +end LocalFixedFieldTransferTower + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean new file mode 100644 index 0000000000..fe820ac704 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean @@ -0,0 +1,275 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import Mathlib.FieldTheory.PrimitiveElement +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableNormProduct +/-! +# Relative norms on actual fixed fields + +This file identifies the class-formation relative norm on ambient fixed units +with the ordinary field norm between two concrete fixed fields. The +intermediate extension need not be normal: relative left cosets are +identified with field embeddings into the common separably closed ambient +field, and both norms are then the same product of conjugates. +-/ + +@[expose] public section + +noncomputable +section + +open scoped BigOperators + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation LocalClassFieldTheory + +variable (k Ω : Type) [Field k] [Field Ω] [Algebra k Ω] + [IsGalois k Ω] [IsSepClosed Ω] + +/-- The embeddings of a finite separable extension into a field form a finite type, enumerated +using a power basis. -/ +noncomputable local instance finiteSeparableAlgHomFintypeRelative + {F E T : Type} [Field F] [Field E] [Field T] + [Algebra F E] [Algebra F T] + [FiniteDimensional F E] [Algebra.IsSeparable F E] : + Fintype (E →ₐ[F] T) := + PowerBasis.AlgHom.fintype (Field.powerBasisOfFiniteOfSeparable F E) + +/-- A left coset of the abstract fixing subgroup restricts to an embedding +of the upper concrete fixed field into the common ambient field. -/ +def abstractFixedFieldCosetToAlgHom + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) : + (K.toSubgroup ⧸ extensionSubgroup K L hLK) → + (abstractRelativeFixedField k Ω hLK →ₐ[ + abstractFixedField k Ω K] Ω) := fun q => + Quotient.liftOn' q + (fun σ => (abstractSubgroupEquivGaloisGroup k Ω K σ).toAlgHom.comp + (abstractRelativeFixedField k Ω hLK).val) + (by + intro σ τ hστ + have hmem : σ⁻¹ * τ ∈ extensionSubgroup K L hLK := + QuotientGroup.leftRel_apply.mp hστ + let η : L.toSubgroup := ⟨(σ⁻¹ * τ).1, hmem⟩ + have hτ : τ = σ * Subgroup.inclusion hLK η := by + apply Subtype.ext + change τ.1 = σ.1 * η.1 + simp [η] + apply AlgHom.ext + intro x + have hηfix : η.1 (x : Ω) = (x : Ω) := + (IntermediateField.mem_fixedField_iff L.toSubgroup + (x : Ω)).1 x.property η.1 η.2 + change σ.1 (x : Ω) = τ.1 (x : Ω) + calc + σ.1 (x : Ω) = σ.1 (η.1 (x : Ω)) := + congrArg σ.1 hηfix.symm + _ = (σ.1 * η.1) (x : Ω) := rfl + _ = τ.1 (x : Ω) := by + have hτ' := congrArg Subtype.val hτ + change τ.1 = σ.1 * η.1 at hτ' + rw [hτ']) + +omit [IsSepClosed Ω] in +/-- States the theorem `abstractFixedFieldCosetToAlgHom_mk`. -/ +@[simp] +theorem abstractFixedFieldCosetToAlgHom_mk + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) (σ : K.toSubgroup) : + abstractFixedFieldCosetToAlgHom k Ω K L hLK + (QuotientGroup.mk σ) = + (abstractSubgroupEquivGaloisGroup k Ω K σ).toAlgHom.comp + (abstractRelativeFixedField k Ω hLK).val := + rfl + +private theorem abstractFixedFieldCosetToAlgHom_surjective + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) : + Function.Surjective + (abstractFixedFieldCosetToAlgHom k Ω K L hLK) := by + intro f + let : Algebra.IsSeparable (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK) := + Algebra.isSeparable_tower_bot_of_isSeparable + (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK) Ω + let : Algebra.IsSeparable (abstractRelativeFixedField k Ω hLK) Ω := + Algebra.isSeparable_tower_top_of_isSeparable + (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK) Ω + obtain ⟨φ, hφ⟩ := + (IsSepClosed.surjective_domRestrict_of_isSeparable + (K := abstractFixedField k Ω K) + (L := abstractRelativeFixedField k Ω hLK) + (M := Ω) (E := Ω)) f + let σReal : Gal(Ω/abstractFixedField k Ω K) := + AlgEquiv.ofBijective φ + (Normal.toIsAlgebraic.algHom_bijective₂ + φ (AlgHom.id (abstractFixedField k Ω K) Ω)).1 + let σ : K.toSubgroup := + (abstractSubgroupEquivGaloisGroup k Ω K).symm σReal + refine ⟨QuotientGroup.mk σ, ?_⟩ + apply AlgHom.ext + intro x + have hx := congrArg + (fun ψ : abstractRelativeFixedField k Ω hLK →ₐ[ + abstractFixedField k Ω K] Ω => ψ x) hφ + change σReal (x : Ω) = f x + change φ (x : Ω) = f x at hx + exact hx + +omit [IsSepClosed Ω] in +private theorem abstractFixedFieldCosetToAlgHom_injective + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) : + Function.Injective + (abstractFixedFieldCosetToAlgHom k Ω K L hLK) := by + intro q r hqr + rw [← Quotient.out_eq q, ← Quotient.out_eq r] at hqr ⊢ + apply Quotient.sound' + apply QuotientGroup.leftRel_apply.mpr + apply (mem_extensionSubgroup_iff K L hLK + ((Quotient.out q)⁻¹ * Quotient.out r)).2 + have hfix : (Quotient.out q).1⁻¹ * (Quotient.out r).1 ∈ + (abstractFixedField k Ω L).fixingSubgroup := by + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + let y : abstractRelativeFixedField k Ω hLK := ⟨x, hx⟩ + have hy := congrArg + (fun ψ : abstractRelativeFixedField k Ω hLK →ₐ[ + abstractFixedField k Ω K] Ω => ψ y) hqr + change (Quotient.out q).1 (y : Ω) = + (Quotient.out r).1 (y : Ω) at hy + change (Quotient.out q).1⁻¹ ((Quotient.out r).1 x) = x + rw [← hy] + simp [y] + rw [InfiniteGalois.fixingSubgroup_fixedField L] at hfix + change (Quotient.out q).1⁻¹ * (Quotient.out r).1 ∈ L.toSubgroup + exact hfix + +/-- Abstract relative left cosets are precisely the embeddings of the upper +concrete fixed field into the ambient separably closed field. -/ +def abstractFixedFieldCosetEquivAlgHom + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) : + (K.toSubgroup ⧸ extensionSubgroup K L hLK) ≃ + (abstractRelativeFixedField k Ω hLK →ₐ[ + abstractFixedField k Ω K] Ω) := + Equiv.ofBijective (abstractFixedFieldCosetToAlgHom k Ω K L hLK) + ⟨by exact abstractFixedFieldCosetToAlgHom_injective k Ω K L hLK, + by exact abstractFixedFieldCosetToAlgHom_surjective k Ω K L hLK⟩ + +omit [IsSepClosed Ω] in +/-- States the theorem `relativeCosetAction_abstractFixedFieldUnit_val`. -/ +theorem relativeCosetAction_abstractFixedFieldUnit_val + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (x : (abstractRelativeFixedField k Ω hLK)ˣ) + (q : K.toSubgroup ⧸ extensionSubgroup K L hLK) : + ((Additive.toMul + (relativeCosetAction (galoisAmbientUnitsRep k Ω) + K L hLK + (abstractRelativeFixedFieldUnitsEquivGaloisFixed + k Ω K L hLK (Additive.ofMul x)) q) : Ωˣ) : Ω) = + abstractFixedFieldCosetToAlgHom k Ω K L hLK q + (x : abstractRelativeFixedField k Ω hLK) := by + refine Quotient.inductionOn' q ?_ + intro σ + rfl + +/-- The class-formation relative norm on fixed coefficients is the ordinary +field norm between the two concrete fixed fields, without a normality +assumption on the intermediate extension. -/ +theorem relativeNorm_abstractFixedFieldUnit_eq_normUnits + (K L : ClosedSubgroup (Gal(Ω/k))) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hfinite : Finite + (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + [hKabsolute : Finite + ((baseField Gal(Ω/k)).toSubgroup ⧸ + extensionSubgroup (baseField Gal(Ω/k)) K + (le_baseField K))] + (x : (abstractRelativeFixedField k Ω hLK)ˣ) : + relativeNorm (galoisAmbientUnitsRep k Ω) K L hLK + (abstractRelativeFixedFieldUnitsEquivGaloisFixed + k Ω K L hLK (Additive.ofMul x)) = + abstractFixedFieldUnitsEquivGaloisFixed k Ω K + (Additive.ofMul + (normUnits (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK) x)) := by + let : FiniteDimensional (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK) := + abstractRelativeFixedField_finiteDimensional + k Ω K L hLK hKabsolute hfinite + let : Algebra.IsSeparable (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK) := + Algebra.isSeparable_tower_bot_of_isSeparable + (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK) Ω + apply Subtype.ext + apply Additive.ext + apply Units.ext + let Q := K.toSubgroup ⧸ extensionSubgroup K L hLK + let := Fintype.ofFinite Q + change + ((Additive.toMul + (relativeNormValue (galoisAmbientUnitsRep k Ω) + K L hLK + (abstractRelativeFixedFieldUnitsEquivGaloisFixed + k Ω K L hLK (Additive.ofMul x))) : Ωˣ) : Ω) = _ + rw [relativeNormValue] + change + (↑(Additive.toMul (∑ q : Q, + relativeCosetAction (galoisAmbientUnitsRep k Ω) + K L hLK + (abstractRelativeFixedFieldUnitsEquivGaloisFixed + k Ω K L hLK (Additive.ofMul x)) q) : Ωˣ) : Ω) = _ + change (Units.coeHom Ω) (∏ q : Q, + Additive.toMul + (relativeCosetAction (galoisAmbientUnitsRep k Ω) + K L hLK + (abstractRelativeFixedFieldUnitsEquivGaloisFixed + k Ω K L hLK (Additive.ofMul x)) q)) = _ + rw [map_prod] + change + (∏ q : Q, + ((Additive.toMul + (relativeCosetAction (galoisAmbientUnitsRep k Ω) + K L hLK + (abstractRelativeFixedFieldUnitsEquivGaloisFixed + k Ω K L hLK (Additive.ofMul x)) q) : Ωˣ) : Ω)) = _ + calc + _ = ∏ σ : abstractRelativeFixedField k Ω hLK →ₐ[ + abstractFixedField k Ω K] Ω, + σ (x : abstractRelativeFixedField k Ω hLK) := by + exact Fintype.prod_equiv + (abstractFixedFieldCosetEquivAlgHom k Ω K L hLK) + (fun q : Q => + ((Additive.toMul + (relativeCosetAction (galoisAmbientUnitsRep k Ω) + K L hLK + (abstractRelativeFixedFieldUnitsEquivGaloisFixed + k Ω K L hLK (Additive.ofMul x)) q) : Ωˣ) : Ω)) + (fun σ : abstractRelativeFixedField k Ω hLK →ₐ[ + abstractFixedField k Ω K] Ω => + σ (x : abstractRelativeFixedField k Ω hLK)) + (relativeCosetAction_abstractFixedFieldUnit_val + k Ω K L hLK x) + _ = algebraMap (abstractFixedField k Ω K) Ω + (Algebra.norm (abstractFixedField k Ω K) + (x : abstractRelativeFixedField k Ω hLK)) := + (algebraMap_norm_eq_prod_embeddings_of_isSepClosed + (abstractFixedField k Ω K) Ω + (abstractRelativeFixedField k Ω hLK) + (x : abstractRelativeFixedField k Ω hLK)).symm + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GaloisExtensionQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GaloisExtensionQuotient.lean new file mode 100644 index 0000000000..d84a79f9a5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GaloisExtensionQuotient.lean @@ -0,0 +1,164 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbsoluteUnitsFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Valuation + +/-! # Galois Extension Quotient -/ + +@[expose] public section +namespace LocalClassFieldTheory +open RamificationTheory CyclicCohomology + +open ClassFormation + +/-! +# Finite local reciprocity: abstract extension quotients and actual Galois groups + +For a Galois ambient extension `Ω/K`, the abstract class-formation model represents `K` by the +closed fixing subgroup of the bottom intermediate field and an intermediate +normal extension `E/K` by the closed subgroup fixing `E`. This file proves +that the resulting abstract class-formation quotient is canonically the actual group +`Gal(E/K)`. +-/ + +noncomputable +section + +variable (K Ω : Type) [Field K] [Field Ω] [Algebra K Ω] [IsGalois K Ω] + +/-- The subgroup fixing the bottom intermediate field is the distinguished +base field of the class formation. -/ +theorem closedFixingSubgroup_bot_eq_baseField : + closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω) = + baseField (Gal(Ω/K)) := by + ext σ + change σ ∈ (⊥ : IntermediateField K Ω).fixingSubgroup ↔ + σ ∈ (⊤ : Subgroup (Gal(Ω/K))) + rw [IntermediateField.fixingSubgroup_bot] + +/-- The fixing subgroup of an intermediate field lies in the fixing subgroup +of the base field. -/ +theorem fixingSubgroupLeBase + (E : IntermediateField K Ω) : + (closedFixingSubgroup K Ω E).toSubgroup ≤ + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)).toSubgroup := + IntermediateField.fixingSubgroup_le bot_le + +/-- In the base fixing group, the abstract class-formation extension subgroup is exactly +the subgroup obtained from the ambient fixing subgroup by `subgroupOf`. -/ +theorem extensionSubgroup_base_eq_subgroupOf + (E : IntermediateField K Ω) : + extensionSubgroup + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) = + (closedFixingSubgroup K Ω E).toSubgroup.subgroupOf + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)).toSubgroup := by + rfl + +/-- The fixing subgroup of a Galois intermediate extension is normal in the +ambient Galois group. -/ +instance closedFixingSubgroup_normal + (E : IntermediateField K Ω) [IsGalois K E] : + (closedFixingSubgroup K Ω E).toSubgroup.Normal := + (InfiniteGalois.normal_iff_isGalois E).2 inferInstance + +/-- Normality of a Galois intermediate extension, in the exact subgroup +presentation used by the abstract class-formation framework. -/ +instance extensionSubgroupBase_normal + (E : IntermediateField K Ω) [IsGalois K E] : + (extensionSubgroup + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E)).Normal := by + rw [extensionSubgroup_base_eq_subgroupOf] + infer_instance + +/-- The quotient map from the abstract class-formation base fixing group to the ordinary +ambient quotient by `Gal(Ω/E)`. -/ +def baseFixingToAmbientQuotient + (E : IntermediateField K Ω) [IsGalois K E] : + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)).toSubgroup →* + Gal(Ω/K) ⧸ (closedFixingSubgroup K Ω E).toSubgroup := + (QuotientGroup.mk' (closedFixingSubgroup K Ω E).toSubgroup).comp + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)).toSubgroup.subtype + +/-- The kernel of the preceding map is the exact `extensionSubgroup` used in +the abstract theory. -/ +theorem baseFixingToAmbientQuotient_ker + (E : IntermediateField K Ω) [IsGalois K E] : + (baseFixingToAmbientQuotient K Ω E).ker = + extensionSubgroup + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) := by + rw [extensionSubgroup_base_eq_subgroupOf] + ext x + change + (QuotientGroup.mk' (closedFixingSubgroup K Ω E).toSubgroup x.1 = 1) ↔ + x.1 ∈ (closedFixingSubgroup K Ω E).toSubgroup + exact QuotientGroup.eq_one_iff x.1 + +/-- The base fixing group is the whole ambient Galois group, hence its map to +the ambient quotient is onto. -/ +theorem baseFixingToAmbientQuotient_surjective + (E : IntermediateField K Ω) [IsGalois K E] : + Function.Surjective (baseFixingToAmbientQuotient K Ω E) := by + intro q + refine Quotient.inductionOn' q ?_ + intro σ + have hσ : + σ ∈ (closedFixingSubgroup K Ω + (⊥ : IntermediateField K Ω)).toSubgroup := by + change σ ∈ (⊥ : IntermediateField K Ω).fixingSubgroup + rw [IntermediateField.fixingSubgroup_bot] + exact Subgroup.mem_top σ + exact ⟨⟨σ, hσ⟩, rfl⟩ + +/-- The abstract class-formation quotient for `E/K` is the ordinary quotient of the +ambient Galois group by the subgroup fixing `E`. -/ +def baseFixingExtensionQuotientEquivAmbient + (E : IntermediateField K Ω) [IsGalois K E] : + ((closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)).toSubgroup ⧸ + extensionSubgroup + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E)) ≃* + Gal(Ω/K) ⧸ (closedFixingSubgroup K Ω E).toSubgroup := + (QuotientGroup.quotientMulEquivOfEq + (baseFixingToAmbientQuotient_ker K Ω E).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (baseFixingToAmbientQuotient K Ω E) + (baseFixingToAmbientQuotient_surjective K Ω E)) + +/-- States the theorem `baseFixingExtensionQuotientEquivAmbient_mk`. -/ +@[simp] +theorem baseFixingExtensionQuotientEquivAmbient_mk + (E : IntermediateField K Ω) [IsGalois K E] + (σ : (closedFixingSubgroup K Ω + (⊥ : IntermediateField K Ω)).toSubgroup) : + baseFixingExtensionQuotientEquivAmbient K Ω E (QuotientGroup.mk σ) = + QuotientGroup.mk σ.1 := + rfl + +/-- The exact quotient group appearing in the abstract class-formation framework for the normal +intermediate extension `E/K` is canonically the actual `Gal(E/K)`. -/ +def baseFixingExtensionQuotientEquivGaloisGroup + (E : IntermediateField K Ω) [IsGalois K E] : + ((closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)).toSubgroup ⧸ + extensionSubgroup + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E)) ≃* + Gal(E/K) := by + let H : ClosedSubgroup (Gal(Ω/K)) := closedFixingSubgroup K Ω E + letI : H.toSubgroup.Normal := closedFixingSubgroup_normal K Ω E + exact (baseFixingExtensionQuotientEquivAmbient K Ω E).trans + ((InfiniteGalois.normalAutEquivQuotient H).trans + (AlgEquiv.autCongr + (IntermediateField.equivOfEq + (InfiniteGalois.fixedField_fixingSubgroup E)))) + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean new file mode 100644 index 0000000000..e971ca9979 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean @@ -0,0 +1,481 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.GroupTheory.Abelianization.Defs +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +/-! +# Restriction naturality in an arbitrary finite abelian tower + +The fixed-separable-closure form of finite local reciprocity naturality is +transported here to an arbitrary tower `K ⊂ E ⊂ L`. The two extensions are +realized compatibly in the chosen separable closure by first embedding `L` +and then restricting that embedding to `E`. Abstract norm--residue +naturality then becomes the actual restriction homomorphism +`Gal(L/K) → Gal(E/K)`. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation LocalClassFieldTheory +open scoped IsMulCommutative + +local notation "towerAbsoluteGalois" => intrinsicAbsoluteGalois + +local notation "towerAbsoluteUnits" => intrinsicAbsoluteUnits + +local notation "towerAbstractBase" => intrinsicAbstractBase + +def towerLowerEmbedding + (K E L : Type) + [Field K] [Field E] [Field L] + [Algebra K E] [Algebra E L] [Algebra K L] + [IsScalarTower K E L] + (iL : L →ₐ[K] SeparableClosure K) : + E →ₐ[K] SeparableClosure K := + iL.comp (IsScalarTower.toAlgHom K E L) + +private def towerEmbeddedBaseNormClass + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (i : L →ₐ[K] SeparableClosure K) (a : Kˣ) : + FiniteNormQuotient (towerAbsoluteUnits K) (towerAbstractBase K) + (finiteGaloisAbstractExtensionOfEmbedding K L i).field + (finiteGaloisAbstractExtensionOfEmbedding K L i).below := + finiteNormClass (towerAbsoluteUnits K) (towerAbstractBase K) + (finiteGaloisAbstractExtensionOfEmbedding K L i).field + (finiteGaloisAbstractExtensionOfEmbedding K L i).below + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + (Additive.ofMul a)) + +private theorem towerEmbeddedFieldRange_le + (K E L : Type) + [Field K] [Field E] [Field L] + [Algebra K E] [Algebra E L] [Algebra K L] + [IsScalarTower K E L] + (iL : L →ₐ[K] SeparableClosure K) : + AlgHom.fieldRange (towerLowerEmbedding K E L iL) ≤ + AlgHom.fieldRange iL := by + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap E L y, rfl⟩ + +private theorem towerEmbeddedAbstractExtension_field_le + (K E L : Type) + [Field K] [Field E] [Field L] + [Algebra K E] [Algebra E L] [Algebra K L] + [IsScalarTower K E L] + [FiniteDimensional K E] [FiniteDimensional K L] + [IsGalois K E] [IsGalois K L] + (iL : L →ₐ[K] SeparableClosure K) : + (finiteGaloisAbstractExtensionOfEmbedding K L iL).field.toSubgroup ≤ + (finiteGaloisAbstractExtensionOfEmbedding K E + (towerLowerEmbedding K E L iL)).field.toSubgroup := by + change + (closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange iL)).toSubgroup ≤ + (closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange (towerLowerEmbedding K E L iL))).toSubgroup + change + (AlgHom.fieldRange iL).fixingSubgroup ≤ + (AlgHom.fieldRange (towerLowerEmbedding K E L iL)).fixingSubgroup + exact + (AlgHom.fieldRange (towerLowerEmbedding K E L iL)).fixingSubgroup_le + (towerEmbeddedFieldRange_le K E L iL) + +private theorem towerRestrict_abstractQuotient_mk + (K E L : Type) + [Field K] [Field E] [Field L] + [Algebra K E] [Algebra E L] [Algebra K L] + [IsScalarTower K E L] + [FiniteDimensional K E] [FiniteDimensional K L] + [IsGalois K E] [IsGalois K L] + (iL : L →ₐ[K] SeparableClosure K) + (sigma : (towerAbstractBase K).toSubgroup) : + AlgEquiv.restrictNormalHom E + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + K L iL (QuotientGroup.mk sigma)) = + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + K E (towerLowerEmbedding K E L iL) + (QuotientGroup.mk (Subgroup.inclusion le_rfl sigma)) := by + let iE := towerLowerEmbedding K E L iL + apply AlgEquiv.ext + intro x + apply iE.injective + calc + iE ((AlgEquiv.restrictNormalHom E + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + K L iL (QuotientGroup.mk sigma))) x) = + iL ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + K L iL (QuotientGroup.mk sigma)) (algebraMap E L x)) := by + change + iL (algebraMap E L + ((AlgEquiv.restrictNormalHom E + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + K L iL (QuotientGroup.mk sigma))) x)) = + iL ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + K L iL (QuotientGroup.mk sigma)) (algebraMap E L x)) + exact congrArg iL + (AlgEquiv.restrictNormal_commutes + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + K L iL (QuotientGroup.mk sigma)) E x) + _ = sigma.1 (iL (algebraMap E L x)) := by + exact + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding_mk_apply + K L iL sigma (algebraMap E L x) + _ = sigma.1 (iE x) := rfl + _ = iE + ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + K E iE + (QuotientGroup.mk (Subgroup.inclusion le_rfl sigma))) x) := by + exact + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding_mk_apply + K E iE (Subgroup.inclusion le_rfl sigma) x).symm + +private theorem towerRestrict_abstractAbelianization + (K E L : Type) + [Field K] [Field E] [Field L] + [Algebra K E] [Algebra E L] [Algebra K L] + [IsScalarTower K E L] + [FiniteDimensional K E] [FiniteDimensional K L] + [IsAbelianGalois K E] [IsAbelianGalois K L] + (iL : L →ₐ[K] SeparableClosure K) + (z : Abelianization + (finiteGaloisAbstractExtensionOfEmbedding K L iL).extensionQuotient) : + AlgEquiv.restrictNormalHom E + ((Abelianization.equivOfComm (H := Gal(L/K))).symm + ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + K L iL).abelianizationCongr z)) = + (Abelianization.equivOfComm (H := Gal(E/K))).symm + ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + K E (towerLowerEmbedding K E L iL)).abelianizationCongr + (normResidueNaturalityAbelianizedRestriction + (towerAbstractBase K) (towerAbstractBase K) + (finiteGaloisAbstractExtensionOfEmbedding + K E (towerLowerEmbedding K E L iL)).field + (finiteGaloisAbstractExtensionOfEmbedding K L iL).field + (finiteGaloisAbstractExtensionOfEmbedding + K E (towerLowerEmbedding K E L iL)).below + (finiteGaloisAbstractExtensionOfEmbedding K L iL).below + le_rfl (towerEmbeddedAbstractExtension_field_le K E L iL) z)) := by + let B := towerAbstractBase K + let EE := + finiteGaloisAbstractExtensionOfEmbedding K E + (towerLowerEmbedding K E L iL) + let EL := finiteGaloisAbstractExtensionOfEmbedding K L iL + let qE := + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + K E (towerLowerEmbedding K E L iL) + let qL := + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L iL + let : (extensionSubgroup B EE.field EE.below).Normal := EE.normal + let : (extensionSubgroup B EL.field EL.below).Normal := EL.normal + obtain ⟨q, rfl⟩ := QuotientGroup.mk_surjective z + obtain ⟨sigma, rfl⟩ := QuotientGroup.mk_surjective q + change + AlgEquiv.restrictNormalHom E + ((Abelianization.equivOfComm (H := Gal(L/K))).symm + (qL.abelianizationCongr + (Abelianization.of (QuotientGroup.mk sigma)))) = + (Abelianization.equivOfComm (H := Gal(E/K))).symm + (qE.abelianizationCongr + (normResidueNaturalityAbelianizedRestriction + B B EE.field EL.field EE.below EL.below le_rfl + (towerEmbeddedAbstractExtension_field_le K E L iL) + (Abelianization.of (QuotientGroup.mk sigma)))) + rw [abelianizationCongr_of] + change + AlgEquiv.restrictNormalHom E + (qL (QuotientGroup.mk sigma)) = + (Abelianization.equivOfComm (H := Gal(E/K))).symm + (qE.abelianizationCongr + (normResidueNaturalityAbelianizedRestriction + B B EE.field EL.field EE.below EL.below le_rfl + (towerEmbeddedAbstractExtension_field_le K E L iL) + (Abelianization.of (QuotientGroup.mk sigma)))) + rw [normResidueNaturalityAbelianizedRestriction_of_mk] + change + AlgEquiv.restrictNormalHom E + (qL (QuotientGroup.mk sigma)) = + (Abelianization.equivOfComm (H := Gal(E/K))).symm + (qE.abelianizationCongr + (Abelianization.of + (QuotientGroup.mk (Subgroup.inclusion le_rfl sigma)))) + rw [abelianizationCongr_of] + change + AlgEquiv.restrictNormalHom E + (qL (QuotientGroup.mk sigma)) = + qE (QuotientGroup.mk (Subgroup.inclusion le_rfl sigma)) + exact towerRestrict_abstractQuotient_mk K E L iL sigma + +/-- Before specializing the local class-formation structures, compatible +embeddings of an arbitrary finite abelian tower identify abstract +norm--residue restriction with the actual Galois restriction map. -/ +theorem concreteNormResidueAutomorphism_restrict_tower + (K E L : Type) + [Field K] [Field E] [Field L] + [Algebra K E] [Algebra E L] [Algebra K L] + [IsScalarTower K E L] + [FiniteDimensional K E] [FiniteDimensional K L] + [IsAbelianGalois K E] [IsAbelianGalois K L] + (iL : L →ₐ[K] SeparableClosure K) + (D : DegreeData (towerAbsoluteGalois K)) + (v : ValuationData D (towerAbsoluteUnits K)) + (hcf : SatisfiesClassFieldAxiom (towerAbsoluteUnits K)) + (a : Kˣ) : + AlgEquiv.restrictNormalHom E + ((Abelianization.equivOfComm (H := Gal(L/K))).symm + (concreteNormResidueSymbolOfEmbedding + K L iL D v hcf a)) = + (Abelianization.equivOfComm (H := Gal(E/K))).symm + (concreteNormResidueSymbolOfEmbedding + K E (towerLowerEmbedding K E L iL) D v hcf a) := by + let B := towerAbstractBase K + let BF := intrinsicFiniteAbstractBase K + let EE := + finiteGaloisAbstractExtensionOfEmbedding K E + (towerLowerEmbedding K E L iL) + let EL := finiteGaloisAbstractExtensionOfEmbedding K L iL + let qE := + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + K E (towerLowerEmbedding K E L iL) + let qL := + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L iL + let xE := + towerEmbeddedBaseNormClass K E + (towerLowerEmbedding K E L iL) a + let xL := towerEmbeddedBaseNormClass K L iL a + have hLE : EL.field.toSubgroup ≤ EE.field.toSubgroup := + towerEmbeddedAbstractExtension_field_le K E L iL + let hEENormal : (extensionSubgroup B EE.field EE.below).Normal := + EE.normal + let hELNormal : (extensionSubgroup B EL.field EL.below).Normal := + EL.normal + let hEEFinite : Finite + (B.toSubgroup ⧸ extensionSubgroup B EE.field EE.below) := + EE.finite + let hELFinite : Finite + (B.toSubgroup ⧸ extensionSubgroup B EL.field EL.below) := + EL.finite + let hBBFinite : Finite + (B.toSubgroup ⧸ extensionSubgroup B B le_rfl) := by + have htop : extensionSubgroup B B le_rfl = ⊤ := by + ext sigma + constructor + · intro _ + trivial + · intro _ + exact sigma.2 + rw [htop] + infer_instance + let T : FiniteAbstractFieldExtension (towerAbsoluteGalois K) := { + field := BF + base := BF + below := le_rfl + finiteQuotient := hBBFinite } + let : (extensionSubgroup T.base.field EE.field EE.below).Normal := by + change (extensionSubgroup B EE.field EE.below).Normal + exact hEENormal + let : (extensionSubgroup T.field.field EL.field EL.below).Normal := by + change (extensionSubgroup B EL.field EL.below).Normal + exact hELNormal + let : Finite + (T.base.field.toSubgroup ⧸ + extensionSubgroup T.base.field EE.field EE.below) := by + change Finite (B.toSubgroup ⧸ extensionSubgroup B EE.field EE.below) + exact hEEFinite + let : Finite + (T.field.field.toSubgroup ⧸ + extensionSubgroup T.field.field EL.field EL.below) := by + change Finite (B.toSubgroup ⧸ extensionSubgroup B EL.field EL.below) + exact hELFinite + have hnorm : finiteReciprocityNaturalityNormMap (towerAbsoluteUnits K) + B B EE.field EL.field EE.below EL.below le_rfl hLE xL = xE := by + dsimp only [xL, xE, towerEmbeddedBaseNormClass] + rw [finiteReciprocityNaturalityNormMap_finiteNormClass, + relativeNorm_self] + have hraw := D.normResidueNaturality_norm_restriction + (towerAbsoluteUnits K) v hcf + T EE.field EL.field EE.below EL.below hLE + have hrawa := DFunLike.congr_fun hraw xL + change _ = + D.normResidueSymbol (towerAbsoluteUnits K) v hcf BF EE + (finiteReciprocityNaturalityNormMap (towerAbsoluteUnits K) + B B EE.field EL.field EE.below EL.below le_rfl hLE xL) at hrawa + rw [hnorm] at hrawa + let zL := + D.normResidueSymbol (towerAbsoluteUnits K) v hcf BF EL xL + let zE := + D.normResidueSymbol (towerAbsoluteUnits K) v hcf BF EE xE + have hz : normResidueNaturalityAbelianizedRestriction + B B EE.field EL.field EE.below EL.below le_rfl hLE + (Additive.toMul zL) = Additive.toMul zE := by + exact congrArg Additive.toMul hrawa + rw [concreteNormResidueSymbolOfEmbedding_eq_abstract + K L iL D v hcf a, + concreteNormResidueSymbolOfEmbedding_eq_abstract + K E (towerLowerEmbedding K E L iL) D v hcf a] + change + AlgEquiv.restrictNormalHom E + ((Abelianization.equivOfComm (H := Gal(L/K))).symm + (qL.abelianizationCongr (Additive.toMul zL))) = + (Abelianization.equivOfComm (H := Gal(E/K))).symm + (qE.abelianizationCongr (Additive.toMul zE)) + calc + AlgEquiv.restrictNormalHom E + ((Abelianization.equivOfComm (H := Gal(L/K))).symm + (qL.abelianizationCongr (Additive.toMul zL))) = + (Abelianization.equivOfComm (H := Gal(E/K))).symm + (qE.abelianizationCongr + (normResidueNaturalityAbelianizedRestriction + B B EE.field EL.field EE.below EL.below le_rfl hLE + (Additive.toMul zL))) := + towerRestrict_abstractAbelianization + K E L iL (Additive.toMul zL) + _ = (Abelianization.equivOfComm (H := Gal(E/K))).symm + (qE.abelianizationCongr (Additive.toMul zE)) := + congrArg + (fun w => (Abelianization.equivOfComm (H := Gal(E/K))).symm + (qE.abelianizationCongr w)) hz + +/-- Pointwise restriction naturality for the canonical local Artin +automorphism in an arbitrary finite abelian tower. -/ +theorem localArtinAutomorphism_restrict_tower + (K E L : Type) + [Field K] [Field E] [Field L] + [Algebra K E] [Algebra E L] [Algebra K L] + [IsScalarTower K E L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [FiniteDimensional K E] [FiniteDimensional K L] + [IsAbelianGalois K E] [IsAbelianGalois K L] + (a : Kˣ) : + AlgEquiv.restrictNormalHom E + ((Abelianization.equivOfComm (H := Gal(L/K))).symm + (localArtinMonoidHom K L a)) = + (Abelianization.equivOfComm (H := Gal(E/K))).symm + (localArtinMonoidHom K E a) := by + let iL := AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L + rw [localArtinMonoidHom_eq_of_embedding K L iL, + localArtinMonoidHom_eq_of_embedding K E + (towerLowerEmbedding K E L iL)] + exact + concreteNormResidueAutomorphism_restrict_tower + K E L iL + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) a + +/-- The actual finite abelian local Artin maps commute with the genuine +restriction homomorphism in every finite abelian tower `K ⊂ E ⊂ L`. -/ +theorem abelianLocalArtinMonoidHom_restrict_tower + (K E L : Type) + [Field K] [Field E] [Field L] + [Algebra K E] [Algebra E L] [Algebra K L] + [IsScalarTower K E L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [FiniteDimensional K E] [FiniteDimensional K L] + [IsAbelianGalois K E] [IsAbelianGalois K L] : + (AlgEquiv.restrictNormalHom E).comp + (abelianLocalArtinMonoidHom K L) = + abelianLocalArtinMonoidHom K E := by + apply MonoidHom.ext + intro a + exact localArtinAutomorphism_restrict_tower K E L a + +/-- When `L` is regarded as an `M`-algebra through the inverse of a +`K`-algebra equivalence, restriction from `L` to `M` is conjugation by that +equivalence. -/ +theorem restrictNormalHom_eq_autCongr + (K L M : Type) + [Field K] [Field L] [Field M] + [Algebra K L] [Algebra K M] + [Normal K M] + (e : L ≃ₐ[K] M) : + letI : Algebra M L := e.symm.toRingHom.toAlgebra + letI : IsScalarTower K M L := + IsScalarTower.of_algebraMap_eq' (by + apply RingHom.ext + intro x + exact (e.symm.commutes x).symm) + (AlgEquiv.restrictNormalHom M : + Gal(L/K) →* Gal(M/K)) = + (AlgEquiv.autCongr e).toMonoidHom := by + let : Algebra M L := e.symm.toRingHom.toAlgebra + let : IsScalarTower K M L := + IsScalarTower.of_algebraMap_eq' (by + apply RingHom.ext + intro x + exact (e.symm.commutes x).symm) + apply MonoidHom.ext + intro sigma + apply AlgEquiv.ext + intro x + apply e.symm.injective + calc + e.symm ((AlgEquiv.restrictNormalHom M sigma) x) = + sigma (e.symm x) := by + exact AlgEquiv.restrictNormal_commutes sigma M x + _ = e.symm ((AlgEquiv.autCongr e sigma) x) := by + simp [AlgEquiv.autCongr_apply] + +/-- Finite local Artin maps are natural under a `K`-algebra equivalence of +finite abelian extensions. The Galois groups are identified by conjugating +automorphisms with that equivalence. -/ +theorem abelianLocalArtinMonoidHom_autCongr + (K L M : Type) + [Field K] [Field L] [Field M] + [Algebra K L] [Algebra K M] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [FiniteDimensional K M] + [IsAbelianGalois K L] [IsAbelianGalois K M] + (e : L ≃ₐ[K] M) : + (AlgEquiv.autCongr e).toMonoidHom.comp + (abelianLocalArtinMonoidHom K L) = + abelianLocalArtinMonoidHom K M := by + let : Algebra M L := e.symm.toRingHom.toAlgebra + let : IsScalarTower K M L := + IsScalarTower.of_algebraMap_eq' (by + apply RingHom.ext + intro x + exact (e.symm.commutes x).symm) + rw [← restrictNormalHom_eq_autCongr K L M e] + exact abelianLocalArtinMonoidHom_restrict_tower K M L + +end LocalClassFieldTheory + +namespace ClassFieldTheory + +/-- Restriction of the canonical Artin map at the upper level is exactly the +canonical Artin map at the lower level of a finite abelian tower. -/ +theorem finiteAbelianLocalArtinMap_restrict_tower + (K E L : Type) + [Field K] [Field E] [Field L] + [Algebra K E] [Algebra E L] [Algebra K L] + [IsScalarTower K E L] + [FiniteDimensional K E] [FiniteDimensional K L] + [IsAbelianGalois K E] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + (AlgEquiv.restrictNormalHom E).comp + (LocalClassFieldTheory.abelianLocalArtinMap K L).toMonoidHom = + (LocalClassFieldTheory.abelianLocalArtinMap K E).toMonoidHom := by + rw [LocalClassFieldTheory.abelianLocalArtinMap_toMonoidHom K L, + LocalClassFieldTheory.abelianLocalArtinMap_toMonoidHom K E] + exact LocalClassFieldTheory.abelianLocalArtinMonoidHom_restrict_tower K E L + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/HenselianValuationBase.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/HenselianValuationBase.lean new file mode 100644 index 0000000000..44c112ce40 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/HenselianValuationBase.lean @@ -0,0 +1,194 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.SeparableNormValuation + +/-! # Henselian Valuation Base -/ + +@[expose] public section +namespace LocalClassFieldTheory +open RamificationTheory KummerTheory + +open LocalFieldTheory + +open ClassFormation + +/-! +# Finite local reciprocity: the value group of the local henselian valuation + +The normalized valuation of the base local field is transported to the +actual fixed coefficient group in the separable closure and then embedded +in `ℤ̂`. Its range is proved to be exactly the ordinary integers inside +`ℤ̂`, and the quotients by `nℤ` are identified with `ZMod n`. These are the +source-producing parts of the Henselian valuation condition. +-/ + +noncomputable +section + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- `Kˣ` is the coefficient group fixed by the distinguished base subgroup +of the absolute separable Galois group. -/ +def baseFieldUnitsEquiv : + Additive Kˣ ≃+ ambientFixedAddSubgroup + (galoisAmbientUnitsRep K (SeparableClosure K)) (baseField Gal(SeparableClosure K/K)) := + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).trans + (AddEquiv.addSubgroupCongr + (congrArg + (ambientFixedAddSubgroup (galoisAmbientUnitsRep K (SeparableClosure K))) + (closedFixingSubgroup_bot_eq_baseField K (SeparableClosure K)))) + +omit [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +/-- States the theorem `baseFieldUnitsEquiv_val`. -/ +@[simp] +theorem baseFieldUnitsEquiv_val (x : Kˣ) : + ((Additive.toMul + ((baseFieldUnitsEquiv K (Additive.ofMul x)).1 : + Additive (SeparableClosure K)ˣ) : (SeparableClosure K)ˣ) : + SeparableClosure K) = algebraMap K (SeparableClosure K) (x : K) := by + change + ((Additive.toMul + ((baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + (Additive.ofMul x)).1 : + Additive (SeparableClosure K)ˣ) : (SeparableClosure K)ˣ) : + SeparableClosure K) = algebraMap K (SeparableClosure K) (x : K) + exact baseUnitsEquivGaloisAmbientFixed_val K (SeparableClosure K) x + +/-- The normalized valuation `v_K : Kˣ → ℤ`, embedded in `ℤ̂` and written on +the actual fixed coefficient group. -/ +def localBaseValuation : + ambientFixedAddSubgroup (galoisAmbientUnitsRep K (SeparableClosure K)) + (baseField Gal(SeparableClosure K/K)) →+ ZHat := + (Int.castRingHom ZHat).toAddMonoidHom.comp + ((LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K).comp + (baseFieldUnitsEquiv K).symm.toAddMonoidHom) + +/-- States the theorem `localBaseValuation_baseFieldUnitsEquiv`. -/ +@[simp] +theorem localBaseValuation_baseFieldUnitsEquiv (x : Additive Kˣ) : + localBaseValuation K (baseFieldUnitsEquiv K x) = + Int.castRingHom ZHat + (LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K x) := by + simp [localBaseValuation] + +/-- The value group is exactly the image of the ordinary integers in the +profinite integers. -/ +theorem localBaseValuation_range : + (localBaseValuation K).range = + (Int.castRingHom ZHat).toAddMonoidHom.range := by + apply le_antisymm + · rintro z ⟨x, rfl⟩ + exact ⟨IsNonarchimedeanLocalField.valuationMap K + ((baseFieldUnitsEquiv K).symm x), rfl⟩ + · rintro z ⟨m, rfl⟩ + obtain ⟨x, hx⟩ := + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_surjective K m + refine ⟨baseFieldUnitsEquiv K x, ?_⟩ + rw [localBaseValuation_baseFieldUnitsEquiv, hx] + rfl + +/-- Every ordinary integer occurs as a value, as required in the Henselian valuation condition. -/ +theorem intToProCInteger_mem_localBaseValuation_range (m : ℤ) : + Int.castRingHom ZHat m ∈ + (localBaseValuation K).range := by + rw [localBaseValuation_range] + exact ⟨m, rfl⟩ + +/-- Reduction modulo `n` on the actual value group. -/ +def localValueGroupReduction (n : ℕ) (hn : 0 < n) : + (localBaseValuation K).range →+ ZMod n := + (zHatReduction n hn).toAddMonoidHom.comp + (localBaseValuation K).range.subtype + +/-- States the theorem `localValueGroupReduction_surjective`. -/ +theorem localValueGroupReduction_surjective (n : ℕ) (hn : 0 < n) : + Function.Surjective (localValueGroupReduction K n hn) := by + intro a + obtain ⟨m, rfl⟩ := ZMod.intCast_surjective a + let z : (localBaseValuation K).range := + ⟨Int.castRingHom ZHat m, + intToProCInteger_mem_localBaseValuation_range K m⟩ + refine ⟨z, ?_⟩ + exact zHatReduction_int n hn m + +/-- The kernel of reduction on the value group is precisely `nZ`. -/ +theorem localValueGroupReduction_ker (n : ℕ) (hn : 0 < n) : + (localValueGroupReduction K n hn).ker = + nsmulWithin (localBaseValuation K).range n := by + apply le_antisymm + · intro z hz + have hzInt : (z : ZHat) ∈ + (Int.castRingHom ZHat).toAddMonoidHom.range := by + rw [← localBaseValuation_range K] + exact z.property + obtain ⟨m, hm⟩ := hzInt + change Int.castRingHom ZHat m = (z : ZHat) at hm + have hmod : (m : ZMod n) = 0 := by + have hz0 : localValueGroupReduction K n hn z = 0 := hz + change zHatReduction n hn (z : ZHat) = 0 at hz0 + rw [← hm, zHatReduction_int] at hz0 + exact hz0 + have hdiv : (n : ℤ) ∣ m := by + rwa [ZMod.intCast_zmod_eq_zero_iff_dvd] at hmod + obtain ⟨k, hk⟩ := hdiv + let w : (localBaseValuation K).range := + ⟨Int.castRingHom ZHat k, + intToProCInteger_mem_localBaseValuation_range K k⟩ + refine ⟨w, ?_⟩ + apply Subtype.ext + change n • Int.castRingHom ZHat k = (z : ZHat) + rw [← map_nsmul] + have hnk : n • k = m := by + simpa [nsmul_eq_mul] using hk.symm + rw [hnk, hm] + · rintro z ⟨w, rfl⟩ + change zHatReduction n hn (n • (w : ZHat)) = 0 + rw [map_nsmul] + simp [nsmul_eq_mul] + +/-- The cyclic quotient condition in the Henselian valuation condition, for the actual local value +group. -/ +def localValueGroupQuotientEquivZMod (n : ℕ) (hn : 0 < n) : + ((localBaseValuation K).range ⧸ + nsmulWithin (localBaseValuation K).range n) ≃+ ZMod n := + (QuotientAddGroup.quotientAddEquivOfEq + (localValueGroupReduction_ker K n hn).symm).trans + (QuotientAddGroup.quotientKerEquivOfSurjective + (localValueGroupReduction K n hn) + (localValueGroupReduction_surjective K n hn)) + +/-- The inclusion-and-reduction quotient map of the Henselian valuation condition is +bijective for the actual local value group. -/ +theorem localCanonicalValueQuotientMap_bijective (n : ℕ) (hn : 0 < n) : + Function.Bijective + (canonicalValueQuotientMap (localBaseValuation K).range n hn) := by + constructor + · intro q₁ q₂ + refine Quotient.inductionOn' q₁ ?_ + intro z₁ + refine Quotient.inductionOn' q₂ ?_ + intro z₂ h + apply QuotientAddGroup.eq_iff_sub_mem.mpr + rw [← localValueGroupReduction_ker K n hn] + change localValueGroupReduction K n hn (z₁ - z₂) = 0 + rw [map_sub] + change localValueGroupReduction K n hn z₁ = + localValueGroupReduction K n hn z₂ at h + rw [h, sub_self] + · intro a + obtain ⟨z, hz⟩ := localValueGroupReduction_surjective K n hn a + refine ⟨QuotientAddGroup.mk' + (nsmulWithin (localBaseValuation K).range n) z, ?_⟩ + exact hz + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean new file mode 100644 index 0000000000..ba8be4ca2d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean @@ -0,0 +1,430 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.GroupTheory.Abelianization.Defs +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction +/-! +# Restriction naturality for the concrete local norm-residue symbol + +The abstract class formation supplies restriction naturality. This file +constructs the field-facing restriction map for two finite Galois intermediate +fields in the fixed separable closure and transports the naturality identity +to the concrete local norm-residue symbol. + +The intermediate-field restriction is packaged here so callers do not have +to install the auxiliary `Algebra E F` and scalar-tower instances attached +to an inclusion `E ≤ F`. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation LocalClassFieldTheory +open scoped IsMulCommutative + +universe u v + +variable {K : Type u} {Omega : Type v} + [Field K] [Field Omega] [Algebra K Omega] + +local notation "absoluteGalois" => intrinsicAbsoluteGalois + +local notation "absoluteUnits" => intrinsicAbsoluteUnits + +local notation "abstractBase" => intrinsicAbstractBase + +section AbstractToConcrete + +variable (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- The finite abstract norm class represented by a base-field unit in an +explicit separable-closure realization. -/ +def embeddedBaseNormClass + (i : L →ₐ[K] SeparableClosure K) (a : Kˣ) : + FiniteNormQuotient (absoluteUnits K) (abstractBase K) + (finiteGaloisAbstractExtensionOfEmbedding K L i).field + (finiteGaloisAbstractExtensionOfEmbedding K L i).below := + finiteNormClass (absoluteUnits K) (abstractBase K) + (finiteGaloisAbstractExtensionOfEmbedding K L i).field + (finiteGaloisAbstractExtensionOfEmbedding K L i).below + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + (Additive.ofMul a)) + +/-- Before specializing the local datum, the concrete norm-residue symbol is +the abstract norm-residue class transported through the canonical quotient +equivalence. This pointwise transport formula expresses abstract +restriction naturality as a statement about actual field automorphisms. -/ +theorem concreteNormResidueSymbolOfEmbedding_eq_abstract + (i : L →ₐ[K] SeparableClosure K) + (D : DegreeData (absoluteGalois K)) + (v : ValuationData D (absoluteUnits K)) + (hcf : SatisfiesClassFieldAxiom (absoluteUnits K)) (a : Kˣ) : + concreteNormResidueSymbolOfEmbedding K L i D v hcf a = + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + K L i).abelianizationCongr + (Additive.toMul + (D.normResidueSymbol (absoluteUnits K) v hcf (intrinsicFiniteAbstractBase K) + (finiteGaloisAbstractExtensionOfEmbedding K L i) + (embeddedBaseNormClass K L i a))) := by + let Eabs := finiteGaloisAbstractExtensionOfEmbedding K L i + let q := finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i + let xabs := embeddedBaseNormClass K L i a + let z := D.normResidueSymbol (absoluteUnits K) v hcf + (intrinsicFiniteAbstractBase K) Eabs xabs + have hnorm : + finiteNormQuotientEquivEmbeddedNormQuotient + K (SeparableClosure K) L i xabs = + Additive.ofMul + (normClass K L a) := by + convert + finiteNormQuotientEquivEmbeddedNormQuotient_finiteNormClass_baseUnit + K L i a using 1 <;> rfl + have hsource : + MulEquiv.toAdditive q.abelianizationCongr.symm + (Additive.ofMul (q.abelianizationCongr (Additive.toMul z))) = z := by + apply Additive.toMul.injective + exact q.abelianizationCongr.symm_apply_apply (Additive.toMul z) + have hforward : + concreteReciprocityAddEquivOfEmbedding K L i D v hcf + (Additive.ofMul (q.abelianizationCongr (Additive.toMul z))) = + Additive.ofMul + (normClass K L a) := by + change finiteNormQuotientEquivEmbeddedNormQuotient + K (SeparableClosure K) L i + (D.abstractReciprocityEquiv (absoluteUnits K) v hcf (intrinsicFiniteAbstractBase K) Eabs + (MulEquiv.toAdditive q.abelianizationCongr.symm + (Additive.ofMul + (q.abelianizationCongr (Additive.toMul z))))) = _ + rw [hsource] + change finiteNormQuotientEquivEmbeddedNormQuotient + K (SeparableClosure K) L i + (D.abstractReciprocityEquiv (absoluteUnits K) v hcf (intrinsicFiniteAbstractBase K) Eabs + ((D.abstractReciprocityEquiv + (absoluteUnits K) v hcf (intrinsicFiniteAbstractBase K) Eabs).symm xabs)) = _ + rw [(D.abstractReciprocityEquiv + (absoluteUnits K) v hcf (intrinsicFiniteAbstractBase K) Eabs).apply_symm_apply, + hnorm] + change (concreteReciprocityEquivOfEmbedding K L i D v hcf).symm + (normClass K L a) = + q.abelianizationCongr (Additive.toMul z) + apply (concreteReciprocityEquivOfEmbedding K L i D v hcf).injective + rw [(concreteReciprocityEquivOfEmbedding + K L i D v hcf).apply_symm_apply] + exact (congrArg Additive.toMul hforward).symm + +end AbstractToConcrete + +section IntermediateRestriction + +variable (K : Type) [Field K] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +private theorem commGroup_abelianizationCongr_of + {G H : Type*} [Group G] [CommGroup H] + (q : G ≃* H) (x : G) : + (Abelianization.equivOfComm (H := H)).symm + (q.abelianizationCongr (Abelianization.of x)) = + q x := by + exact + (congrArg (Abelianization.equivOfComm (H := H)).symm + (abelianizationCongr_of q x)).trans + ((Abelianization.equivOfComm (H := H)).symm_apply_apply (q x)) + +omit [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +private theorem intermediateFieldRestrict_abstractQuotient_mk + (E F : IntermediateField K (SeparableClosure K)) (hEF : E ≤ F) + [FiniteDimensional K E] [FiniteDimensional K F] + [IsGalois K E] [IsGalois K F] + (sigma : (abstractBase K).toSubgroup) : + intermediateFieldRestrictNormalHom E F hEF + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K F F.val + (QuotientGroup.mk sigma)) = + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K E E.val + (QuotientGroup.mk (Subgroup.inclusion le_rfl sigma)) := by + apply AlgEquiv.ext + intro x + apply E.val.injective + calc + E.val ((intermediateFieldRestrictNormalHom E F hEF) + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K F F.val + (QuotientGroup.mk sigma)) x) = + F.val + ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K F F.val + (QuotientGroup.mk sigma)) + (IntermediateField.inclusion hEF x)) := + intermediateFieldRestrictNormalHom_apply_val E F hEF _ x + _ = sigma.1 (F.val (IntermediateField.inclusion hEF x)) := by + exact finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding_mk_apply + K F F.val sigma (IntermediateField.inclusion hEF x) + _ = (Subgroup.inclusion le_rfl sigma).1 (E.val x) := rfl + _ = E.val + ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K E E.val + (QuotientGroup.mk (Subgroup.inclusion le_rfl sigma))) x) := by + exact (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding_mk_apply + K E E.val (Subgroup.inclusion le_rfl sigma) x).symm + +omit [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +private theorem embeddedAbstractExtension_field_le + (E F : IntermediateField K (SeparableClosure K)) (hEF : E ≤ F) + [FiniteDimensional K E] [FiniteDimensional K F] + [IsGalois K E] [IsGalois K F] : + (finiteGaloisAbstractExtensionOfEmbedding K F F.val).field.toSubgroup ≤ + (finiteGaloisAbstractExtensionOfEmbedding K E E.val).field.toSubgroup := by + change + (closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange F.val)).toSubgroup ≤ + (closedFixingSubgroup K (SeparableClosure K) + (AlgHom.fieldRange E.val)).toSubgroup + simp only [IntermediateField.fieldRange_val] + change F.fixingSubgroup ≤ E.fixingSubgroup + exact E.fixingSubgroup_le hEF + +omit [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +private theorem intermediateFieldRestrict_abstractAbelianization_of_mk + (E F : IntermediateField K (SeparableClosure K)) (hEF : E ≤ F) + [FiniteDimensional K E] [FiniteDimensional K F] + [IsAbelianGalois K E] [IsAbelianGalois K F] + (sigma : (abstractBase K).toSubgroup) : + intermediateFieldRestrictNormalHom E F hEF + ((Abelianization.equivOfComm (H := Gal(F/K))).symm + ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + K F F.val).abelianizationCongr + (Abelianization.of (QuotientGroup.mk sigma)))) = + (Abelianization.equivOfComm (H := Gal(E/K))).symm + ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding + K E E.val).abelianizationCongr + (normResidueNaturalityAbelianizedRestriction + (abstractBase K) (abstractBase K) + (finiteGaloisAbstractExtensionOfEmbedding K E E.val).field + (finiteGaloisAbstractExtensionOfEmbedding K F F.val).field + (finiteGaloisAbstractExtensionOfEmbedding K E E.val).below + (finiteGaloisAbstractExtensionOfEmbedding K F F.val).below + le_rfl (embeddedAbstractExtension_field_le K E F hEF) + (Abelianization.of (QuotientGroup.mk sigma)))) := by + let B := abstractBase K + let EE := finiteGaloisAbstractExtensionOfEmbedding K E E.val + let EF := finiteGaloisAbstractExtensionOfEmbedding K F F.val + let qE := finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K E E.val + let qF := finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K F F.val + have hrestriction : + normResidueNaturalityAbelianizedRestriction + B B EE.field EF.field EE.below EF.below le_rfl + (embeddedAbstractExtension_field_le K E F hEF) + (Abelianization.of (QuotientGroup.mk sigma)) = + Abelianization.of + (QuotientGroup.mk (Subgroup.inclusion le_rfl sigma)) := + normResidueNaturalityAbelianizedRestriction_of_mk + B B EE.field EF.field EE.below EF.below le_rfl + (embeddedAbstractExtension_field_le K E F hEF) sigma + calc + intermediateFieldRestrictNormalHom E F hEF + ((Abelianization.equivOfComm (H := Gal(F/K))).symm + (qF.abelianizationCongr + (Abelianization.of (QuotientGroup.mk sigma)))) = + intermediateFieldRestrictNormalHom E F hEF + (qF (QuotientGroup.mk sigma)) := + congrArg (intermediateFieldRestrictNormalHom E F hEF) + (commGroup_abelianizationCongr_of + qF (QuotientGroup.mk sigma)) + _ = qE (QuotientGroup.mk (Subgroup.inclusion le_rfl sigma)) := + intermediateFieldRestrict_abstractQuotient_mk K E F hEF sigma + _ = (Abelianization.equivOfComm (H := Gal(E/K))).symm + (qE.abelianizationCongr + (Abelianization.of + (QuotientGroup.mk (Subgroup.inclusion le_rfl sigma)))) := + (commGroup_abelianizationCongr_of qE + (QuotientGroup.mk (Subgroup.inclusion le_rfl sigma))).symm + _ = (Abelianization.equivOfComm (H := Gal(E/K))).symm + (qE.abelianizationCongr + (normResidueNaturalityAbelianizedRestriction + B B EE.field EF.field EE.below EF.below le_rfl + (embeddedAbstractExtension_field_le K E F hEF) + (Abelianization.of (QuotientGroup.mk sigma)))) := + congrArg + (fun w => (Abelianization.equivOfComm + (H := Gal(E/K))).symm (qE.abelianizationCongr w)) + hrestriction.symm + +omit [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +private theorem intermediateFieldRestrict_abstractAbelianization + (E F : IntermediateField K (SeparableClosure K)) (hEF : E ≤ F) + [FiniteDimensional K E] [FiniteDimensional K F] + [IsAbelianGalois K E] [IsAbelianGalois K F] + (z : Abelianization + (finiteGaloisAbstractExtensionOfEmbedding K F F.val).extensionQuotient) : + intermediateFieldRestrictNormalHom E F hEF + ((Abelianization.equivOfComm (H := Gal(F/K))).symm + ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K F F.val).abelianizationCongr + z)) = + (Abelianization.equivOfComm (H := Gal(E/K))).symm + ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K E E.val).abelianizationCongr + (normResidueNaturalityAbelianizedRestriction + (abstractBase K) (abstractBase K) + (finiteGaloisAbstractExtensionOfEmbedding K E E.val).field + (finiteGaloisAbstractExtensionOfEmbedding K F F.val).field + (finiteGaloisAbstractExtensionOfEmbedding K E E.val).below + (finiteGaloisAbstractExtensionOfEmbedding K F F.val).below + le_rfl (embeddedAbstractExtension_field_le K E F hEF) z)) := by + obtain ⟨q, rfl⟩ := QuotientGroup.mk_surjective z + obtain ⟨sigma, rfl⟩ := QuotientGroup.mk_surjective q + exact + intermediateFieldRestrict_abstractAbelianization_of_mk + K E F hEF sigma + +omit [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +/-- Restriction naturality for the concrete norm-residue symbol, before +specializing the three structures of the local class formation. Both +extensions are literal intermediate fields of the fixed separable closure, +so the vertical Galois map is the actual restriction map above. -/ +theorem concreteNormResidueAutomorphism_restrict + (E F : IntermediateField K (SeparableClosure K)) (hEF : E ≤ F) + [FiniteDimensional K E] [FiniteDimensional K F] + [IsAbelianGalois K E] [IsAbelianGalois K F] + (D : DegreeData (absoluteGalois K)) + (v : ValuationData D (absoluteUnits K)) + (hcf : SatisfiesClassFieldAxiom (absoluteUnits K)) (a : Kˣ) : + intermediateFieldRestrictNormalHom E F hEF + ((Abelianization.equivOfComm (H := Gal(F/K))).symm + (concreteNormResidueSymbolOfEmbedding + K F F.val D v hcf a)) = + (Abelianization.equivOfComm (H := Gal(E/K))).symm + (concreteNormResidueSymbolOfEmbedding + K E E.val D v hcf a) := by + let B := abstractBase K + let BF := intrinsicFiniteAbstractBase K + let EE := finiteGaloisAbstractExtensionOfEmbedding K E E.val + let EF := finiteGaloisAbstractExtensionOfEmbedding K F F.val + let qE := finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K E E.val + let qF := finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K F F.val + let xE := embeddedBaseNormClass K E E.val a + let xF := embeddedBaseNormClass K F F.val a + have hFE : EF.field.toSubgroup ≤ EE.field.toSubgroup := + embeddedAbstractExtension_field_le K E F hEF + let hEENormal : (extensionSubgroup B EE.field EE.below).Normal := + EE.normal + let hEFNormal : (extensionSubgroup B EF.field EF.below).Normal := + EF.normal + let hEEFinite : Finite + (B.toSubgroup ⧸ extensionSubgroup B EE.field EE.below) := + EE.finite + let hEFFinite : Finite + (B.toSubgroup ⧸ extensionSubgroup B EF.field EF.below) := + EF.finite + let hBBFinite : Finite + (B.toSubgroup ⧸ extensionSubgroup B B le_rfl) := by + have htop : extensionSubgroup B B le_rfl = ⊤ := by + ext sigma + constructor + · intro _ + trivial + · intro _ + exact sigma.2 + rw [htop] + infer_instance + let T : FiniteAbstractFieldExtension (absoluteGalois K) := { + field := BF + base := BF + below := le_rfl + finiteQuotient := hBBFinite } + let : (extensionSubgroup T.base.field EE.field EE.below).Normal := by + change (extensionSubgroup B EE.field EE.below).Normal + exact hEENormal + let : (extensionSubgroup T.field.field EF.field EF.below).Normal := by + change (extensionSubgroup B EF.field EF.below).Normal + exact hEFNormal + let : Finite + (T.base.field.toSubgroup ⧸ + extensionSubgroup T.base.field EE.field EE.below) := by + change Finite (B.toSubgroup ⧸ extensionSubgroup B EE.field EE.below) + exact hEEFinite + let : Finite + (T.field.field.toSubgroup ⧸ + extensionSubgroup T.field.field EF.field EF.below) := by + change Finite (B.toSubgroup ⧸ extensionSubgroup B EF.field EF.below) + exact hEFFinite + have hnorm : finiteReciprocityNaturalityNormMap (absoluteUnits K) + B B EE.field EF.field EE.below EF.below le_rfl hFE xF = xE := by + let aB := baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + (Additive.ofMul a) + have hmap := finiteReciprocityNaturalityNormMap_finiteNormClass + (absoluteUnits K) B B EE.field EF.field EE.below EF.below le_rfl hFE aB + exact hmap.trans (congrArg + (finiteNormClass (absoluteUnits K) B EE.field EE.below) + (relativeNorm_self (absoluteUnits K) B aB)) + have hraw := D.normResidueNaturality_norm_restriction + (absoluteUnits K) v hcf + T EE.field EF.field EE.below EF.below hFE + have hrawa := DFunLike.congr_fun hraw xF + change _ = + D.normResidueSymbol (absoluteUnits K) v hcf BF EE + (finiteReciprocityNaturalityNormMap (absoluteUnits K) B B EE.field EF.field EE.below + EF.below le_rfl hFE xF) at hrawa + rw [hnorm] at hrawa + let zF := D.normResidueSymbol (absoluteUnits K) v hcf BF EF xF + let zE := D.normResidueSymbol (absoluteUnits K) v hcf BF EE xE + have hz : normResidueNaturalityAbelianizedRestriction + B B EE.field EF.field EE.below EF.below le_rfl hFE + (Additive.toMul zF) = Additive.toMul zE := by + exact congrArg Additive.toMul hrawa + rw [concreteNormResidueSymbolOfEmbedding_eq_abstract + K F F.val D v hcf a, + concreteNormResidueSymbolOfEmbedding_eq_abstract + K E E.val D v hcf a] + change intermediateFieldRestrictNormalHom E F hEF + ((Abelianization.equivOfComm (H := Gal(F/K))).symm + (qF.abelianizationCongr (Additive.toMul zF))) = + (Abelianization.equivOfComm (H := Gal(E/K))).symm + (qE.abelianizationCongr (Additive.toMul zE)) + calc + intermediateFieldRestrictNormalHom E F hEF + ((Abelianization.equivOfComm (H := Gal(F/K))).symm + (qF.abelianizationCongr (Additive.toMul zF))) = + (Abelianization.equivOfComm (H := Gal(E/K))).symm + (qE.abelianizationCongr + (normResidueNaturalityAbelianizedRestriction + B B EE.field EF.field EE.below EF.below le_rfl hFE + (Additive.toMul zF))) := + intermediateFieldRestrict_abstractAbelianization + K E F hEF (Additive.toMul zF) + _ = (Abelianization.equivOfComm (H := Gal(E/K))).symm + (qE.abelianizationCongr (Additive.toMul zE)) := + congrArg + (fun w => (Abelianization.equivOfComm + (H := Gal(E/K))).symm (qE.abelianizationCongr w)) hz + +/-- Restriction naturality for the canonical local norm-residue symbol, +expressed through automorphisms of finite abelian intermediate fields. -/ +theorem localArtinAutomorphism_restrict + (E F : IntermediateField K (SeparableClosure K)) (hEF : E ≤ F) + [FiniteDimensional K E] [FiniteDimensional K F] + [IsAbelianGalois K E] [IsAbelianGalois K F] (a : Kˣ) : + intermediateFieldRestrictNormalHom E F hEF + ((Abelianization.equivOfComm (H := Gal(F/K))).symm + (localArtinMonoidHom K F a)) = + (Abelianization.equivOfComm (H := Gal(E/K))).symm + (localArtinMonoidHom K E a) := by + rw [localArtinMonoidHom_eq_of_embedding K F F.val, + localArtinMonoidHom_eq_of_embedding K E E.val] + exact concreteNormResidueAutomorphism_restrict + K E F hEF + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) a + +end IntermediateRestriction + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntrinsicAbsoluteData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntrinsicAbsoluteData.lean new file mode 100644 index 0000000000..24fc0d8940 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntrinsicAbsoluteData.lean @@ -0,0 +1,91 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.IsSepClosed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient +/-! +# Intrinsic absolute Galois data + +This module packages the absolute Galois group of a field, its integral unit +representation, and its distinguished abstract base field using the chosen +separable closure. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open RamificationTheory CyclicCohomology KummerTheory +open ClassFormation + +/-- The absolute Galois group of a field, formed using its chosen separable closure. -/ +abbrev intrinsicAbsoluteGalois + (F : Type) [Field F] := + Gal(SeparableClosure F/F) + +/-- The integral representation of the intrinsic absolute Galois group on the +units of the chosen separable closure. -/ +abbrev intrinsicAbsoluteUnits + (F : Type) [Field F] : + Rep ℤ (intrinsicAbsoluteGalois F) := + galoisAmbientUnitsRep F (SeparableClosure F) + +/-- The closed base subgroup of the intrinsic absolute Galois group, expressed +as the fixing subgroup of the bottom intermediate field. -/ +abbrev intrinsicAbstractBase + (F : Type) [Field F] : + ClosedSubgroup (intrinsicAbsoluteGalois F) := + closedFixingSubgroup F (SeparableClosure F) + (⊥ : IntermediateField F (SeparableClosure F)) + +/-- The canonical equivalence from the intrinsic abstract base subgroup to the +full absolute Galois group. -/ +noncomputable def intrinsicAbstractBaseEquivAbsolute + (F : Type) [Field F] : + (intrinsicAbstractBase F).toSubgroup ≃* + intrinsicAbsoluteGalois F := + (MulEquiv.subgroupCongr (by + rw [intrinsicAbstractBase, + closedFixingSubgroup_bot_eq_baseField, + baseField_toSubgroup])).trans Subgroup.topEquiv + +/-- The inverse intrinsic-base equivalence has underlying automorphism equal to +the supplied absolute Galois automorphism. -/ +@[simp] +theorem intrinsicAbstractBaseEquivAbsolute_symm_apply_val + (F : Type) [Field F] (σ : intrinsicAbsoluteGalois F) : + ((intrinsicAbstractBaseEquivAbsolute F).symm σ).1 = σ := by + simp [intrinsicAbstractBaseEquivAbsolute] + +/-- The intrinsic abstract base packaged as a finite abstract field; its +defining quotient is the trivial finite quotient. -/ +@[reducible] +noncomputable def intrinsicFiniteAbstractBase + (F : Type) [Field F] : + FiniteAbstractField (intrinsicAbsoluteGalois F) where + field := intrinsicAbstractBase F + finite := by + rw [intrinsicAbstractBase, closedFixingSubgroup_bot_eq_baseField] + exact (FiniteAbstractField.base (intrinsicAbsoluteGalois F)).finite + +/-- The finite intrinsic base is the distinguished finite base of the +abstract class formation. -/ +@[simp] +theorem intrinsicFiniteAbstractBase_eq_base + (F : Type) [Field F] : + intrinsicFiniteAbstractBase F = + FiniteAbstractField.base (intrinsicAbsoluteGalois F) := by + have h := closedFixingSubgroup_bot_eq_baseField F (SeparableClosure F) + change intrinsicAbstractBase F = + baseField (intrinsicAbsoluteGalois F) at h + exact FiniteAbstractField.eq_of_field_eq _ _ h + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalClassFieldAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalClassFieldAxiom.lean new file mode 100644 index 0000000000..f4aed649cb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalClassFieldAxiom.lean @@ -0,0 +1,159 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison + +/-! # Local Class Field Axiom -/ + +@[expose] public section +namespace LocalClassFieldTheory +open CyclicCohomology ClassFormation + +open LocalFieldTheory + +/-! +# The local multiplicative group satisfies the class-field axiom + +For a finite cyclic abstract tower `L / K / k`, the closed subgroups are +replaced by their concrete fixed fields. The lower fixed field is finite +over the local ground field and the upper fixed field is finite Galois over +it. The finite-tower form of the local class-field-axiom theorem therefore +applies. The fixed unit representation and cyclic Tate-complex comparisons +then transport its two cardinality statements back to the abstract +class-field-axiom predicate. +-/ + +noncomputable +section + +open CategoryTheory + +/-- **The local class-field-axiom theorem, abstract class-field-axiom form.** + +For any Galois ambient field over a nonarchimedean local field, its ambient +unit representation satisfies the abstract class-field-axiom predicate. +The predicate ranges only over towers whose lower field is finite over the +distinguished base, in the fixed-separable-closure model. -/ +private theorem galoisAmbientUnits_satisfiesClassFieldAxiom + (k Ω : Type) [Field k] [Field Ω] [Algebra k Ω] [IsGalois k Ω] + [ValuativeRel k] [TopologicalSpace k] [IsNonarchimedeanLocalField k] : + SatisfiesClassFieldAxiom (galoisAmbientUnitsRep k Ω) := by + rintro ⟨K, hKfinite⟩ + rintro ⟨L, hLK, hnormal, hfinite, g, hg⟩ + let := hKfinite + let := hnormal + let := hfinite + let Q := K.toSubgroup ⧸ extensionSubgroup K L hLK + let : Fintype Q := Fintype.ofFinite Q + let F := abstractFixedField k Ω K + let E := abstractRelativeFixedField k Ω hLK + let : FiniteDimensional k F := + abstractFixedField_finiteDimensional k Ω K hKfinite + let : FiniteDimensional F E := + abstractRelativeFixedField_finiteDimensional + k Ω K L hLK hKfinite hfinite + let : IsGalois F E := + abstractRelativeFixedField_isGalois k Ω K L hLK hnormal + let eQ : Q ≃* Gal(E/F) := + abstractExtensionQuotientEquivGaloisGroup k Ω K L hLK hnormal + let g' : Gal(E/F) := eQ g + have hg' : ∀ σ : Gal(E/F), σ ∈ Subgroup.zpowers g' := + map_cyclicGenerator eQ g hg + have hUnitsTateCard := finiteTowerUnits_tate_card_of_generator k F E g' hg' + let : IsCyclic Q := CyclicCohomology.isCyclic_of_generator g hg + let : CommGroup Q := IsCyclic.commGroup + let : IsCyclic (Gal(E/F)) := + CyclicCohomology.isCyclic_of_generator g' hg' + let : CommGroup (Gal(E/F)) := IsCyclic.commGroup + let M := extensionFixedRepresentation + (galoisAmbientUnitsRep k Ω) K L hLK hnormal + let U := Rep.ofAlgebraAutOnUnits F E + let eM : M ≅ + Rep.res eQ.toMonoidHom U := + abstractExtensionFixedRepresentationIsoUnitsRes + k Ω K L hLK hnormal + let eH0 : + (Rep.FiniteCyclicGroup.normHomCompSub M g).homology ≅ + (Rep.FiniteCyclicGroup.normHomCompSub U g').homology := + (normHomCompSubHomologyIsoOfRepIso eM g) ≪≫ + normHomCompSubHomologyResEquivIso eQ U g + let eHm1 : + (Rep.FiniteCyclicGroup.subCompNormHom M g).homology ≅ + (Rep.FiniteCyclicGroup.subCompNormHom U g').homology := + (subCompNormHomHomologyIsoOfRepIso eM g) ≪≫ + subCompNormHomHomologyResEquivIso eQ U g + let eTateH0 : + tateCohomology M 0 ≅ tateCohomology U 0 := + TateCohomology.isoFiniteCyclicZero M g hg ≪≫ eH0 ≪≫ + (TateCohomology.isoFiniteCyclicZero U g' hg').symm + let eTateHm1 : + tateCohomology M (-1) ≅ tateCohomology U (-1) := + TateCohomology.isoFiniteCyclicNegOne M g hg ≪≫ eHm1 ≪≫ + (TateCohomology.isoFiniteCyclicNegOne U g' hg').symm + let : Finite (tateCohomology U 0) := + hUnitsTateCard.finiteH0 + have hUTateMinusOneZero : + Limits.IsZero (tateCohomology U (-1)) := + hilbert90_unitsTateHminusOne_isZero F E g' hg' + let : Subsingleton (tateCohomology U (-1)) := + ModuleCat.subsingleton_of_isZero hUTateMinusOneZero + let : Finite (tateCohomology U (-1)) := by infer_instance + let : Finite (tateCohomology M 0) := + Finite.of_equiv (tateCohomology U 0) eTateH0.symm.toLinearEquiv.toEquiv + let : Finite (tateCohomology M (-1)) := + Finite.of_equiv (tateCohomology U (-1)) eTateHm1.symm.toLinearEquiv.toEquiv + have hH0actual : + Nat.card (tateCohomology U 0) = + Module.finrank F E := + hUnitsTateCard.cardH0 + have hHm1actual : + Nat.card (tateCohomology U (-1)) = 1 := + hUnitsTateCard.cardHminusOne + refine + { finiteTateHZero := by + change Finite (tateCohomology M 0) + infer_instance + finiteTateHMinusOne := by + change Finite (tateCohomology M (-1)) + infer_instance + tateHZero_card := ?_ + tateHMinusOne_card := ?_ } + · change Nat.card + (tateCohomology M 0) = + ((DegreeData.FiniteAbstractExtension.ofInclusion L K hLK).degree : ℕ) + calc + Nat.card (tateCohomology M 0) = + Nat.card (tateCohomology U 0) := + Nat.card_congr eTateH0.toLinearEquiv.toEquiv + _ = Module.finrank F E := hH0actual + _ = ((DegreeData.FiniteAbstractExtension.ofInclusion L K hLK).degree : ℕ) := + (finiteAbstractExtension_degree_eq_finrank + k Ω K L hLK hnormal hKfinite hfinite).symm + · change Nat.card + (tateCohomology M (-1)) = 1 + calc + Nat.card (tateCohomology M (-1)) = + Nat.card (tateCohomology U (-1)) := + Nat.card_congr eTateHm1.toLinearEquiv.toEquiv + _ = 1 := hHm1actual + +/-- The coefficient module A = (kˢᵉᵖ)ˣ satisfies the abstract +class-field axiom. This is the separable-closure specialization used for local +reciprocity. -/ +theorem separableClosureUnits_isClassFormation + (k : Type) [Field k] [ValuativeRel k] [TopologicalSpace k] + [IsNonarchimedeanLocalField k] : + SatisfiesClassFieldAxiom + (galoisAmbientUnitsRep k (SeparableClosure k)) := + galoisAmbientUnits_satisfiesClassFieldAxiom k (SeparableClosure k) + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalHenselianValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalHenselianValuation.lean new file mode 100644 index 0000000000..920100317a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalHenselianValuation.lean @@ -0,0 +1,170 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFinrankTransfer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom + +/-! # Local Henselian Valuation -/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + valuationSubring_isIntegralClosure_of_isIntegral → + valuationSubring_isIntegralClosure_of_isIntegral + +namespace LocalClassFieldTheory + +open ClassFormation LocalFieldTheory + +/-! +# Finite local reciprocity: the normalized local valuation is Henselian + +For a nonarchimedean local field, the normalized discrete valuation on the +base unit group satisfies the Henselian valuation condition. The value group is the copy of +the ordinary integers in the profinite integers. For every finite abstract +field, including a non-normal one, the image after the abstract norm is the +ordinary residue-degree multiple of that value group. +-/ + +noncomputable +section + +open scoped NNReal ValuativeRel +/-- **Finite local reciprocity.** The normalized valuation of a nonarchimedean local +field, on the actual fixed coefficient group in its separable closure, is a +Henselian valuation relative to the residue Frobenius degree datum. -/ +noncomputable def localHenselianValuation + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + ValuationData (localResidueDatum K) + (galoisAmbientUnitsRep K (SeparableClosure K)) := by + refine + { toAddMonoidHom := localBaseValuation K + integers_mem := intToProCInteger_mem_localBaseValuation_range K + canonical_value_quotient_bijective := + localCanonicalValueQuotientMap_bijective K + norm_range := ?_ } + intro F + let H := F.field + let := F.finite + let E := abstractFixedField K (SeparableClosure K) H + let : FiniteDimensional K E := + abstractFixedField_finiteDimensional K (SeparableClosure K) H F.finite + let : UniformSpace K := IsTopologicalAddGroup.rightUniformSpace K + let : IsUniformAddGroup K := isUniformAddGroup_of_addCommGroup + let : (Valued.v : Valuation K + (ValuativeRel.ValueGroupWithZero K)).RankOne := + { hom' := ValuativeRel.IsRankLeOne.nonempty.some.emb (R := K) |>.comp + MonoidWithZeroHom.ValueGroup₀.embedding + strictMono' := ValuativeRel.IsRankLeOne.nonempty.some.strictMono.comp + MonoidWithZeroHom.ValueGroup₀.embedding_strictMono } + let : NontriviallyNormedField K := + Valued.toNontriviallyNormedField + (L := K) (Γ₀ := ValuativeRel.ValueGroupWithZero K) + let : NontriviallyNormedField E := + spectralNorm.nontriviallyNormedField K E + let : NormedSpace K E := spectralNorm.normedSpace K E + let : CompleteSpace E := spectralNorm.completeSpace K E + let : LocallyCompactSpace E := + LocallyCompactSpace.of_finiteDimensional_of_complete K E + let : IsUltrametricDist E := + ⟨fun x y z => by + change ‖x - z‖ ≤ max ‖x - y‖ ‖y - z‖ + rw [← sub_add_sub_cancel x y z] + exact isNonarchimedean_spectralNorm + (K := K) (L := E) (x - y) (y - z)⟩ + let : Valued E ℝ≥0 := NormedField.toValued + let vE : Valuation E ℝ≥0 := Valued.v + let : vE.IsNontrivial := + (inferInstance : (NormedField.valuation (K := E)).IsNontrivial) + let : ValuativeRel E := ValuativeRel.ofValuation vE + let : vE.Compatible := Valuation.Compatible.ofValuation vE + let : ValuativeRel.IsNontrivial E := + (ValuativeRel.isNontrivial_iff_isNontrivial vE).2 inferInstance + let : IsValuativeTopology E := + isValuativeTopology_of_valued_ofValuation E ℝ≥0 + let : IsNonarchimedeanLocalField E := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + let : (ValuativeRel.valuation K).HasExtension + (ValuativeRel.valuation E) := by + apply Valuation.HasExtension.ofComapInteger + ext x + change ValuativeRel.valuation E (algebraMap K E x) ≤ 1 ↔ + ValuativeRel.valuation K x ≤ 1 + rw [← (ValuativeRel.valuation E).vle_one_iff, vE.vle_one_iff] + change spectralNorm K E (algebraMap K E x) ≤ 1 ↔ + ValuativeRel.valuation K x ≤ 1 + rw [spectralNorm_extends] + exact Valued.toNormedField.norm_le_one_iff + let : Algebra.IsIntegral 𝒪[K] 𝒪[E] := ⟨by + intro y + have hyv : vE (y : E) ≤ 1 := by + apply (vE.vle_one_iff).1 + apply ((ValuativeRel.valuation E).vle_one_iff).2 + exact y.property + have hynorm : ‖(y : E)‖ ≤ 1 := by + have hynnnorm : ‖(y : E)‖₊ ≤ 1 := by + simpa [vE, NormedField.valuation_apply] using hyv + exact_mod_cast hynnnorm + change spectralNorm K E (y : E) ≤ 1 at hynorm + have hcoeffNorm : + ∀ n : ℕ, ‖(minpoly K (y : E)).coeff n‖ ≤ 1 := + (spectralValue_le_one_iff + (minpoly.monic (Algebra.IsIntegral.isIntegral (y : E)))).1 + (by simpa [spectralNorm] using hynorm) + have hcoeff : + (↑(minpoly K (y : E)).coeffs : Set K) ⊆ + (ValuativeRel.valuation K).integer := by + intro c hc + obtain ⟨n, _hn, rfl⟩ := Polynomial.mem_coeffs_iff.mp hc + exact ((ValuativeRel.valuation K).mem_integer_iff _).2 + (Valued.toNormedField.norm_le_one_iff.mp (hcoeffNorm n)) + let p : Polynomial 𝒪[K] := + (minpoly K (y : E)).toSubring + (ValuativeRel.valuation K).integer hcoeff + refine ⟨p, ?_, ?_⟩ + · exact (Polynomial.monic_toSubring + (minpoly K (y : E)) (ValuativeRel.valuation K).integer hcoeff).2 + (minpoly.monic (Algebra.IsIntegral.isIntegral (y : E))) + · apply Subtype.ext + have hmaproot : + Polynomial.aeval (y : E) + (p.map (algebraMap 𝒪[K] K)) = 0 := by + dsimp only [p] + rw [show algebraMap 𝒪[K] K = + (ValuativeRel.valuation K).integer.subtype from rfl, + Polynomial.map_toSubring] + exact minpoly.aeval K (y : E) + change (ValuativeRel.valuation E).integer.subtype + (Polynomial.eval₂ (algebraMap 𝒪[K] 𝒪[E]) y p) = (0 : E) + rw [Polynomial.hom_eval₂] + change Polynomial.aeval (y : E) p = 0 + rwa [Polynomial.aeval_map_algebraMap K (y : E) p] at hmaproot⟩ + let : Algebra.IsIntegral + (ValuativeRel.valuation K).valuationSubring + (ValuativeRel.valuation E).valuationSubring := by + change Algebra.IsIntegral 𝒪[K] 𝒪[E] + infer_instance + let hIntegralClosure : IsIntegralClosure + (ValuativeRel.valuation E).valuationSubring + (ValuativeRel.valuation K).valuationSubring E := + valuationSubring_isIntegralClosure_of_isIntegral + (ValuativeRel.valuation K) (ValuativeRel.valuation E) + let : IsIntegralClosure 𝒪[E] 𝒪[K] E := by + change IsIntegralClosure + (ValuativeRel.valuation E).valuationSubring + (ValuativeRel.valuation K).valuationSubring E + exact hIntegralClosure + rw [localResidueDatum_residueDegree_eq_residueFinrank K F] + exact localBaseValuation_comp_normToBase_range_eq_residueFinrank K H + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean new file mode 100644 index 0000000000..c2d38b6565 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean @@ -0,0 +1,457 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueActionIndex +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteExtensionCorrespondence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF + +/-! # Local Residue Datum -/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + hasExtension_valuation_of_valuationSubring_pullback → + hasExtension_valuation_of_valuationSubring_pullback + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + exists_integralClosure_standard_fundamental_identity → + exists_integralClosure_standard_fundamental_identity + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + target_valuationSubring_eq_of_finite_separable → + target_valuationSubring_eq_of_finite_separable + +namespace LocalClassFieldTheory + +open ClassFormation + +open ValuationTheory RamificationTheory LocalFieldTheory + +/-! +# Finite local reciprocity: the local residue degree datum + +For a nonarchimedean local field `K`, this file makes the choices implicit in +the construction explicit. The canonical local valuation is packaged as a complete +DVF, Chevalley's theorem chooses an extension to `AlgebraicClosure K`, and +that valuation is pulled back to `SeparableClosure K`. Finite-separable +uniqueness shows that its decomposition subgroup is the whole Galois group. +The residue field of the decomposition field is then identified with the +finite residue field of `K`. + +The remaining step is topological: the reduction action is shown continuous +for the two Krull topologies and is composed with the intrinsic finite-field +degree map from `ResidueAlgebraicClosureDegree`. The selected residue field +is algebraically closed because its extension to the residue of +`AlgebraicClosure K` is purely inseparable and the selected residue field is +perfect over the finite base residue field. +-/ + +noncomputable +section + +open scoped Pointwise ValuativeRel +open HilbertRamification.ValuationSubring +open Field.absoluteGaloisGroup + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The algebraic closure is an algebra over the selected separable closure through its +inclusion. -/ +local instance localSeparableClosureAlgebra : + Algebra (SeparableClosure K) (AlgebraicClosure K) := + (separableClosure K (AlgebraicClosure K)).val.toRingHom.toAlgebra + +local instance localSeparableClosureScalarTower : + IsScalarTower K (SeparableClosure K) (AlgebraicClosure K) := + IsScalarTower.of_algebraMap_eq fun _ => rfl + +/-! ## The canonical complete discrete valuation and its absolute extension -/ + +/-- A Chevalley extension of the local valuation to the chosen algebraic +closure. This is the valuation choice `w | v` made in the finite local reciprocity construction. -/ +noncomputable def localAbsoluteValuationSubring : + ValuationSubring (AlgebraicClosure K) := + Classical.choose + (ValuationTheory.DiscreteValuationField.Valuation.exists_extension_valuationSubring + (L := AlgebraicClosure K) (localCompleteDVF K).valuation) + +/-- The chosen absolute valuation ring pulls back to the canonical valuation +ring of `K`. -/ +private theorem localAbsoluteValuationSubring_pullback (x : K) : + algebraMap K (AlgebraicClosure K) x ∈ + localAbsoluteValuationSubring K ↔ + x ∈ (localCompleteDVF K).valuation.valuationSubring := by + rcases Classical.choose_spec + (ValuationTheory.DiscreteValuationField.Valuation.exists_extension_valuationSubring + (L := AlgebraicClosure K) (localCompleteDVF K).valuation) with + ⟨_hmap, _hlocal, hpullback⟩ + exact hpullback x + +private noncomputable instance localAbsoluteValuationHasExtension : + (localCompleteDVF K).valuation.HasExtension + (localAbsoluteValuationSubring K).valuation := + hasExtension_valuation_of_valuationSubring_pullback + (localCompleteDVF K).valuation (localAbsoluteValuationSubring K) + (localAbsoluteValuationSubring_pullback K) + +/-- The valuation ring on the separable closure used in finite local reciprocity. +We choose it +as the pullback of the auxiliary valuation ring on the algebraic closure. -/ +noncomputable def localSeparableValuationSubring : + ValuationSubring (SeparableClosure K) := + (localAbsoluteValuationSubring K).comap + (algebraMap (SeparableClosure K) (AlgebraicClosure K)) + +/-- Pulling the separable valuation subring back to `K` recovers the base valuation ring. -/ +theorem localSeparableValuationSubring_pullback (x : K) : + algebraMap K (SeparableClosure K) x ∈ + localSeparableValuationSubring K ↔ + x ∈ (localCompleteDVF K).valuation.valuationSubring := by + change algebraMap (SeparableClosure K) (AlgebraicClosure K) + (algebraMap K (SeparableClosure K) x) ∈ + localAbsoluteValuationSubring K ↔ _ + rw [← IsScalarTower.algebraMap_apply K (SeparableClosure K) + (AlgebraicClosure K)] + exact localAbsoluteValuationSubring_pullback K x + +/-- The valuation on the separable closure extends the base discrete valuation. -/ +noncomputable instance localSeparableValuationHasExtension : + (localCompleteDVF K).valuation.HasExtension + (localSeparableValuationSubring K).valuation := + hasExtension_valuation_of_valuationSubring_pullback + (localCompleteDVF K).valuation (localSeparableValuationSubring K) + (localSeparableValuationSubring_pullback K) + +/-- The extension valuation on the separable closure is independent of the +auxiliary Chevalley choice. Equality is checked at the finite separable +field generated by one element and follows there from Henselian uniqueness. -/ +theorem localSeparableValuationSubring_eq_of_hasExtension + (B : ValuationSubring (SeparableClosure K)) + [(localCompleteDVF K).valuation.HasExtension B.valuation] : + localSeparableValuationSubring K = B := by + ext z + let E : IntermediateField K (SeparableClosure K) := + IntermediateField.adjoin K ({z} : Set (SeparableClosure K)) + let : FiniteDimensional K E := + IntermediateField.adjoin.finiteDimensional + (Algebra.IsIntegral.isIntegral z) + let : Algebra.IsSeparable K E := inferInstance + obtain ⟨target, hExt, _hIntegralClosure, _hFundamental⟩ := + exists_integralClosure_standard_fundamental_identity + (K := K) (L := E) (localCompleteDVF K) + let : (localCompleteDVF K).valuation.HasExtension target.valuation := hExt + let : IsScalarTower (localCompleteDVF K).valuationSubring + target.valuationSubring E := + ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_isScalarTower_of_hasExtension + (localCompleteDVF K).valuation target.valuation + let Ares := (localSeparableValuationSubring K).restrictIntermediateField E + let Bres := B.restrictIntermediateField E + let : (localCompleteDVF K).valuation.HasExtension Ares.valuation := + RamificationTheory.ValuationSubring.restrictIntermediateField_hasExtension + (localCompleteDVF K).valuation (localSeparableValuationSubring K) E + let : (localCompleteDVF K).valuation.HasExtension Bres.valuation := + RamificationTheory.ValuationSubring.restrictIntermediateField_hasExtension + (localCompleteDVF K).valuation B E + have hA : target.valuation.valuationSubring = Ares := + target_valuationSubring_eq_of_finite_separable + (localCompleteDVF K) target Ares + have hB : target.valuation.valuationSubring = Bres := + target_valuationSubring_eq_of_finite_separable + (localCompleteDVF K) target Bres + have hAB : Ares = Bres := hA.symm.trans hB + let zE : E := + ⟨z, IntermediateField.subset_adjoin (F := K) + (S := ({z} : Set (SeparableClosure K))) (by simp)⟩ + change zE ∈ Ares ↔ zE ∈ Bres + rw [hAB] + +/-- Every automorphism of the separable closure preserves the unique +extension of the Henselian local valuation. -/ +theorem localSeparableDecompositionGroup_eq_top : + decompositionGroup K (localSeparableValuationSubring K) = ⊤ := by + apply top_unique + intro sigma _hsigma + change sigma • localSeparableValuationSubring K = + localSeparableValuationSubring K + let : (localCompleteDVF K).valuation.HasExtension + (sigma • localSeparableValuationSubring K).valuation := + RamificationTheory.ValuationSubring.smul_hasExtension + (localCompleteDVF K).valuation (localSeparableValuationSubring K) sigma + exact (localSeparableValuationSubring_eq_of_hasExtension K + (sigma • localSeparableValuationSubring K)).symm + +/-! ## Identification of the finite base residue field -/ + +/-- When the decomposition subgroup is top, the valuation ring on the +decomposition field is the original local valuation ring. -/ +noncomputable def localBaseValuationSubringEquivDecompositionField : + (localCompleteDVF K).valuationSubring ≃+* + decompositionFieldValuationSubring K + (localSeparableValuationSubring K) := by + let A := localSeparableValuationSubring K + let Z := decompositionField K A + have hZ : Z = ⊥ := by + change IntermediateField.fixedField (decompositionGroup K A) = ⊥ + rw [localSeparableDecompositionGroup_eq_top K] + simpa using + (InfiniteGalois.fixedField_fixingSubgroup + (⊥ : IntermediateField K (SeparableClosure K))) + let eKZ : K ≃ₐ[K] Z := + (IntermediateField.botEquiv K (SeparableClosure K)).symm.trans + (IntermediateField.equivOfEq hZ.symm) + exact + { toFun := fun x => ⟨eKZ (x : K), by + change ((eKZ x : Z) : SeparableClosure K) ∈ A + have he : ((eKZ x : Z) : SeparableClosure K) = + algebraMap K (SeparableClosure K) (x : K) := by + rfl + rw [he] + exact (localSeparableValuationSubring_pullback K (x : K)).2 x.property⟩ + invFun := fun z => ⟨eKZ.symm (z : Z), by + change eKZ.symm (z : Z) ∈ + (localCompleteDVF K).valuation.valuationSubring + apply (localSeparableValuationSubring_pullback K (eKZ.symm (z : Z))).1 + have he : algebraMap K (SeparableClosure K) (eKZ.symm (z : Z)) = + ((z : Z) : SeparableClosure K) := by + exact congrArg Subtype.val (eKZ.apply_symm_apply (z : Z)) + rw [he] + exact z.property⟩ + left_inv := fun x => by + apply Subtype.ext + exact eKZ.symm_apply_apply (x : K) + right_inv := fun z => by + apply Subtype.ext + exact eKZ.apply_symm_apply (z : Z) + map_add' := fun x y => by + apply Subtype.ext + exact map_add eKZ (x : K) (y : K) + map_mul' := fun x y => by + apply Subtype.ext + exact map_mul eKZ (x : K) (y : K) } + +/-- The residue field in the residue-action exact sequence is canonically the finite residue +field of the original local field. -/ +noncomputable def localBaseResidueEquivDecompositionResidue : + (localCompleteDVF K).residueField ≃+* + decompositionResidueField K (localSeparableValuationSubring K) := + (IsLocalRing.ResidueField.mapEquiv + (localBaseValuationSubringEquivDecompositionField K)).trans + (decompositionFieldResidueEquiv (K := K) + (localSeparableValuationSubring K)) + +/-- Naturality of the base-residue comparison with the literal reduction +map into the selected residue field. This is the scalar square used when +transporting residue degrees from the residue-action presentation back +to the canonical residue fields of local extensions. -/ +theorem localBaseResidueEquivDecompositionResidue_algebraMap + (x : (localCompleteDVF K).valuationSubring) : + algebraMap + (decompositionResidueField K (localSeparableValuationSubring K)) + (selectedResidueField (localSeparableValuationSubring K)) + (localBaseResidueEquivDecompositionResidue K + (IsLocalRing.residue (localCompleteDVF K).valuationSubring x)) = + IsLocalRing.residue (localSeparableValuationSubring K) + (⟨algebraMap K (SeparableClosure K) (x : K), + (localSeparableValuationSubring_pullback K (x : K)).2 + x.property⟩ : localSeparableValuationSubring K) := by + rfl + +/-- The residue field attached to the local decomposition datum is finite. -/ +noncomputable instance localDecompositionResidueFinite : + Finite (decompositionResidueField K + (localSeparableValuationSubring K)) := by + have : Finite (localCompleteDVF K).residueField := by + change Finite 𝓀[K] + infer_instance + exact Finite.of_equiv (localCompleteDVF K).residueField + (localBaseResidueEquivDecompositionResidue K).toEquiv + +/-- The finite local decomposition residue field has a canonical finite enumeration. -/ +noncomputable instance localDecompositionResidueFintype : + Fintype (decompositionResidueField K + (localSeparableValuationSubring K)) := + Fintype.ofFinite _ + +/-- The selected residue field of the separable valuation is algebraically closed. -/ +instance localSelectedResidueIsAlgClosed : + IsAlgClosed (selectedResidueField + (localSeparableValuationSubring K)) := by + let A := localAbsoluteValuationSubring K + let B := localSeparableValuationSubring K + let barI := valuationSubringComapResidueMap + (F := SeparableClosure K) A + let : Algebra (selectedResidueField B) (selectedResidueField A) := + barI.toAlgebra + let : IsPurelyInseparable (SeparableClosure K) (AlgebraicClosure K) := + separableClosure.isPurelyInseparable K (AlgebraicClosure K) + let : IsPurelyInseparable (selectedResidueField B) + (selectedResidueField A) := + valuationSubring_comap_residueField_isPurelyInseparable + (F := SeparableClosure K) A + let : PerfectField (decompositionResidueField K B) := inferInstance + let : Algebra.IsAlgebraic (decompositionResidueField K B) + (selectedResidueField B) := inferInstance + let : PerfectField (selectedResidueField B) := + Algebra.IsAlgebraic.perfectField + (K := decompositionResidueField K B) + (L := selectedResidueField B) + let : Algebra.IsSeparable (selectedResidueField B) + (selectedResidueField A) := inferInstance + have hsurjective : Function.Surjective barI := + IsPurelyInseparable.surjective_algebraMap_of_isSeparable + (selectedResidueField B) (selectedResidueField A) + let e : selectedResidueField B ≃+* selectedResidueField A := + RingEquiv.ofBijective barI ⟨barI.injective, hsurjective⟩ + let : IsAlgClosed (selectedResidueField A) := + valuationSubring_residueField_isAlgClosed A + exact IsAlgClosed.of_ringEquiv (selectedResidueField A) + (selectedResidueField B) e.symm + +/-! ## Continuity of reduction and the local degree map -/ + +/-- A fixed representative in the chosen valuation ring of a residue class. -/ +private noncomputable def localSelectedResidueLift + (x : selectedResidueField (localSeparableValuationSubring K)) : + localSeparableValuationSubring K := + Classical.choose (IsLocalRing.residue_surjective x) + +@[simp] +private theorem localSelectedResidueLift_residue + (x : selectedResidueField (localSeparableValuationSubring K)) : + IsLocalRing.residue (localSeparableValuationSubring K) + (localSelectedResidueLift K x) = x := + Classical.choose_spec (IsLocalRing.residue_surjective x) + +/-- Reduction from the absolute Galois group to the absolute Galois group of +the residue field is continuous for the Krull topologies. A finite residue +subextension is controlled by adjoining to `K` one lift of each of its +finitely many elements. -/ +private theorem localSeparableResidueAlgAction_continuous : + Continuous + (residueAlgActionOfEqTop K + (localSeparableValuationSubring K) + (localSeparableDecompositionGroup_eq_top K)) := by + classical + let A := localSeparableValuationSubring K + let k : Type := decompositionResidueField K A + let Omega : Type := selectedResidueField A + let hA := localSeparableDecompositionGroup_eq_top K + let rho := residueAlgActionOfEqTop K A hA + refine continuous_of_continuousAt_one rho ?_ + rw [ContinuousAt, MonoidHom.map_one, Filter.Tendsto] + intro s hs + rw [Filter.mem_map] + rcases (krullTopology_mem_nhds_one_iff k Omega s).1 hs with + ⟨E, hE, hEs⟩ + let : Algebra k E := E.algebra + let : FiniteDimensional k E := hE + let : Finite E := Module.finite_of_finite + (decompositionResidueField K (localSeparableValuationSubring K)) + let : Fintype E := Fintype.ofFinite E + let lifts : Finset (SeparableClosure K) := + Finset.univ.image (fun x : E => + ((localSelectedResidueLift K (x : Omega) : A) : SeparableClosure K)) + let F : IntermediateField K (SeparableClosure K) := + IntermediateField.adjoin K (lifts : Set (SeparableClosure K)) + let : FiniteDimensional K F := + IntermediateField.finiteDimensional_adjoin (fun x _hx => + Algebra.IsIntegral.isIntegral x) + refine (krullTopology_mem_nhds_one_iff K (SeparableClosure K) + (rho ⁻¹' s)).2 ?_ + refine ⟨F, inferInstance, ?_⟩ + intro sigma hsigma + apply hEs + change rho sigma ∈ E.fixingSubgroup + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + let y : E := ⟨x, hx⟩ + let a : A := localSelectedResidueLift K (y : Omega) + have ha_lifts : (a : SeparableClosure K) ∈ lifts := by + apply Finset.mem_image.mpr + exact ⟨y, Finset.mem_univ y, rfl⟩ + have haF : (a : SeparableClosure K) ∈ F := + IntermediateField.subset_adjoin (F := K) + (S := (lifts : Set (SeparableClosure K))) ha_lifts + have hfix : sigma (a : SeparableClosure K) = (a : SeparableClosure K) := + (IntermediateField.mem_fixingSubgroup_iff F sigma).mp hsigma + (a : SeparableClosure K) haF + change rho sigma (y : Omega) = (y : Omega) + rw [← localSelectedResidueLift_residue K (y : Omega)] + change IsLocalRing.residue A + ((toDecompositionGroupOfEqTop + K A hA sigma) • a) = IsLocalRing.residue A a + congr 1 + apply Subtype.ext + exact hfix + +/-- The continuous residue action on the chosen residue algebraic closure. -/ +noncomputable def localSeparableResidueAlgAction : + Gal(SeparableClosure K/K) →ₜ* + (selectedResidueField (localSeparableValuationSubring K) ≃ₐ[decompositionResidueField K + (localSeparableValuationSubring K)] + selectedResidueField (localSeparableValuationSubring K)) where + toMonoidHom := + residueAlgActionOfEqTop K + (localSeparableValuationSubring K) + (localSeparableDecompositionGroup_eq_top K) + continuous_toFun := by exact localSeparableResidueAlgAction_continuous K + +/-- Every automorphism of the selected residue extension lifts to the separable Galois group. -/ +theorem localSeparableResidueAlgAction_surjective : + Function.Surjective (localSeparableResidueAlgAction K) := + residueAlgActionOfEqTop_surjective K + (localSeparableValuationSubring K) + (localSeparableDecompositionGroup_eq_top K) + +/-- **Finite local reciprocity, local degree map.** The residue Frobenius degree, +defined directly on the separable-closure model used by the local reciprocity +formalization. -/ +noncomputable def localResidueDegree : + Gal(SeparableClosure K/K) →ₜ* ZHatMul where + toMonoidHom := + (residueAbsoluteDegreeIn + (decompositionResidueField K (localSeparableValuationSubring K)) + (selectedResidueField (localSeparableValuationSubring K))).toMonoidHom.comp + (localSeparableResidueAlgAction K).toMonoidHom + continuous_toFun := + (residueAbsoluteDegreeIn + (decompositionResidueField K (localSeparableValuationSubring K)) + (selectedResidueField + (localSeparableValuationSubring K))).continuous_toFun.comp + (localSeparableResidueAlgAction K).continuous_toFun + +/-- The local residue-degree map onto the profinite integers is surjective. -/ +theorem localResidueDegree_surjective : + Function.Surjective (localResidueDegree K) := by + intro z + obtain ⟨tau, htau⟩ := + (residueDatumIn + (decompositionResidueField K (localSeparableValuationSubring K)) + (selectedResidueField + (localSeparableValuationSubring K))).degree_surjective z + obtain ⟨sigma, hsigma⟩ := + localSeparableResidueAlgAction_surjective K tau + refine ⟨sigma, ?_⟩ + change residueAbsoluteDegreeIn + (decompositionResidueField K (localSeparableValuationSubring K)) + (selectedResidueField (localSeparableValuationSubring K)) + (localSeparableResidueAlgAction K sigma) = z + rw [hsigma] + simpa [residueDatumIn] using htau + +/-- **Finite local reciprocity.** The actual abstract class-formation datum +`d : G_K -> ZHat` furnished by the residue action of a local field. -/ +noncomputable def localResidueDatum : + DegreeData (Gal(SeparableClosure K/K)) where + degree := localResidueDegree K + degree_surjective := localResidueDegree_surjective K + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Main.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Main.lean new file mode 100644 index 0000000000..54891cb36f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Main.lean @@ -0,0 +1,124 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalClassFieldAxiom +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation + +/-! # Main -/ + +@[expose] public section +namespace LocalClassFieldTheory + +open LocalFieldTheory + +/-! +# Finite local reciprocity: the local reciprocity law + +The residue Frobenius datum, the normalized henselian valuation, and the +class-field axiom constructed over the fixed separable closure are inserted +into the abstract reciprocity theorem. The resulting isomorphism is independent of the +embedding used to realize the finite Galois extension in that closure. +-/ + +noncomputable +section + +variable (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [IsGalois K L] + +/-- **Finite local reciprocity (Local Reciprocity Law).** For every finite Galois +extension of nonarchimedean local fields, reciprocity gives the canonical +isomorphism +`G(L/K)ᵃᵇ ≃ Kˣ / N_{L/K}(Lˣ)`. + +The coefficient module used in the construction is +`(SeparableClosure K)ˣ`, in the fixed-separable-closure model. -/ +noncomputable def abelianizationEquivNormQuotient : + Abelianization (Gal(L/K)) ≃* NormQuotient K L := + concreteReciprocityEquiv K L + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + +/-- The isomorphism in the finite local reciprocity construction is independent of the embedding +used to +realize `L/K` inside the fixed separable closure. -/ +private theorem abelianizationEquivNormQuotient_eq_of_embedding + (i : L →ₐ[K] SeparableClosure K) : + abelianizationEquivNormQuotient K L = + concreteReciprocityEquivOfEmbedding K L i + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) := by + simpa [abelianizationEquivNormQuotient, concreteReciprocityEquiv] using + (concreteReciprocityEquivOfEmbedding_eq K L + (AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L) i + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K)) + +/-- The local norm-residue symbol is the inverse of reciprocity, preceded by +the quotient map from `Kˣ`. -/ +noncomputable def localArtinMonoidHom : + Kˣ →* Abelianization (Gal(L/K)) := + (abelianizationEquivNormQuotient K L).symm.toMonoidHom.comp + (normClass K L) + +/-- The canonical local norm-residue symbol can be computed using any +explicit realization of the finite Galois extension in the fixed separable +closure. This is the symbol-level form of the embedding independence in +the finite local reciprocity construction. -/ +theorem localArtinMonoidHom_eq_of_embedding + (i : L →ₐ[K] SeparableClosure K) : + localArtinMonoidHom K L = + concreteNormResidueSymbolOfEmbedding K L i + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) := by + apply MonoidHom.ext + intro x + change (abelianizationEquivNormQuotient K L).symm + (normClass K L x) = + (concreteReciprocityEquivOfEmbedding K L i + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K)).symm + (normClass K L x) + rw [abelianizationEquivNormQuotient_eq_of_embedding K L i] + +/-- The local norm-residue symbol of the finite local reciprocity construction is surjective. -/ +theorem localArtinMonoidHom_surjective : + Function.Surjective (localArtinMonoidHom K L) := + (abelianizationEquivNormQuotient K L).symm.surjective.comp + (QuotientGroup.mk'_surjective (localNormSubgroup K L)) + +/-- The kernel of the local norm-residue symbol is exactly the norm +subgroup `N_{L/K}(Lˣ)`. -/ +theorem localArtinMonoidHom_ker : + (localArtinMonoidHom K L).ker = localNormSubgroup K L := by + ext x + rw [MonoidHom.mem_ker] + change + (abelianizationEquivNormQuotient K L).symm + (normClass K L x) = 1 ↔ + x ∈ localNormSubgroup K L + constructor + · intro hx + have hx' := congrArg (abelianizationEquivNormQuotient K L) hx + rw [(abelianizationEquivNormQuotient K L).apply_symm_apply, map_one] at hx' + exact (normClass_eq_one_iff_mem K L x).mp hx' + · intro hx + have hq : normClass K L x = 1 := + (normClass_eq_one_iff_mem K L x).2 hx + rw [hq, map_one] + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/MathlibInterface.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/MathlibInterface.lean new file mode 100644 index 0000000000..cb6788f096 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/MathlibInterface.lean @@ -0,0 +1,145 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.Classification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConjugationNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteLocalReciprocity +/-! +# Mathlib-facing finite local class field theory + +This is the implementation layer for the reader-facing local CFT module. +It collects the existing finite, absolute, naturality, normalization, and +existence results without renaming them or wrapping them in an existence +structure. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory.LocalCFT + +open ClassFormation + +/-- The local norm quotient has the quotient topology inherited from the multiplicative group of +the base field. -/ +noncomputable local instance localNormQuotientTopologicalSpace + (K L : Type) [Field K] [Field L] [Algebra K L] + [TopologicalSpace K] : + TopologicalSpace (LocalFieldTheory.NormQuotient K L) := by + change TopologicalSpace (Kˣ ⧸ LocalFieldTheory.localNormSubgroup K L) + infer_instance + +/-- The field-norm quotient has the quotient topology of base-field units modulo the norm +subgroup. -/ +noncomputable local instance fieldNormQuotientTopologicalSpace + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [TopologicalSpace K] : + TopologicalSpace (FieldNormQuotient K L) := by + change TopologicalSpace (Kˣ ⧸ fieldNormSubgroup K L) + infer_instance + +/-- Finite abelian local extensions are classified, contravariantly, by +open finite-index subgroups of `Kˣ`. -/ +theorem finiteAbelianLocalExistence + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + ∀ H : LocalClassFieldTheory.OpenFiniteIndexSubgroup K, + ∃ L : FiniteAbelianSubextension + (LocalClassFieldTheory.intrinsicAbstractBase K), + LocalClassFieldTheory.finiteAbelianNormSubgroupMap K L = H := + LocalClassFieldTheory.finiteAbelianNormSubgroupMap_surjective K + +/-- Order-isomorphism form of the finite abelian local existence theorem. -/ +theorem finiteAbelianLocalExistence_orderIso + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + Nonempty + (FiniteAbelianSubextension + (LocalClassFieldTheory.intrinsicAbstractBase K) ≃o + (LocalClassFieldTheory.OpenFiniteIndexSubgroup K)ᵒᵈ) := + ⟨LocalClassFieldTheory.finiteAbelianNormSubgroupOrderIso K⟩ + +/-- Construction of the Artin map in the finite abelian local reciprocity +theorem, expressed only through its mathematical universal properties. -/ +theorem finiteAbelianLocalReciprocity + (K L : Type) + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + ∃ artin : Kˣ →ₜ* (L ≃ₐ[K] L), + Function.Surjective artin ∧ + ∀ x : Kˣ, artin x = 1 ↔ IsFieldNorm K L x := by + refine ⟨LocalClassFieldTheory.abelianLocalArtinMap K L, + LocalClassFieldTheory.abelianLocalArtinMap_surjective K L, ?_⟩ + intro x + change x ∈ (LocalClassFieldTheory.abelianLocalArtinMap K L).toMonoidHom.ker ↔ + x ∈ fieldNormSubgroup K L + rw [LocalClassFieldTheory.abelianLocalArtinMap_ker] + rfl + +/-- The quotient form of finite abelian local reciprocity. -/ +theorem finiteAbelianLocalReciprocity_quotient + (K L : Type) + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + Nonempty + (FieldNormQuotient K L ≃ₜ* (L ≃ₐ[K] L)) := by + refine ⟨(LocalClassFieldTheory.localReciprocityEquiv K L).trans + (LocalClassFieldTheory.topologicalAbelianizationEquivSelf K L)⟩ + +/-- The field-norm subgroup is open in the native topology on `Kˣ`. -/ +theorem isOpen_fieldNormSubgroup + (K L : Type) + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + IsOpen (fieldNormSubgroup K L : Set Kˣ) := by + change IsOpen (LocalFieldTheory.localNormSubgroup K L : Set Kˣ) + exact LocalClassFieldTheory.localNormSubgroup_isOpen K L + +/-- The field-norm subgroup has finite index, by finite local reciprocity. -/ +theorem fieldNormSubgroup_finiteIndex + (K L : Type) + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + (fieldNormSubgroup K L).FiniteIndex := by + let : Finite (L ≃ₐ[K] L) := by + apply Nat.finite_of_card_ne_zero + rw [IsGalois.card_aut_eq_finrank K L] + exact Nat.ne_of_gt Module.finrank_pos + obtain ⟨e⟩ := finiteAbelianLocalReciprocity_quotient K L + let : Finite (FieldNormQuotient K L) := + Finite.of_equiv (L ≃ₐ[K] L) e.symm.toEquiv + exact Subgroup.finiteIndex_of_finite_quotient + +/-- The norm-subgroup index equals the degree of the abelian extension. -/ +theorem fieldNormSubgroup_index_eq_finrank + (K L : Type) + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + (fieldNormSubgroup K L).index = Module.finrank K L := by + obtain ⟨e⟩ := finiteAbelianLocalReciprocity_quotient K L + rw [Subgroup.index_eq_card] + exact (Nat.card_congr e.toEquiv).trans (IsGalois.card_aut_eq_finrank K L) + +end ClassFieldTheory.LocalCFT diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidue.lean new file mode 100644 index 0000000000..5b01e1c238 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidue.lean @@ -0,0 +1,112 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.GroupTheory.Abelianization.Defs +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +/-! +# The actual abelian local Artin map + +For a finite abelian Galois extension, finite local reciprocity takes values +in the actual Galois group, not merely its abelianization. This module +provides both the algebraic homomorphism and its continuous refinement for +the native topologies. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory +open scoped IsMulCommutative + +variable (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [IsAbelianGalois K L] + +/-- The finite local Artin homomorphism with values in the actual Galois +group of an abelian extension. -/ +noncomputable def abelianLocalArtinMonoidHom : + Kˣ →* Gal(L/K) := + ((Abelianization.equivOfComm (H := Gal(L/K))).symm).toMonoidHom.comp + (localArtinMonoidHom K L) + +/-- The actual abelian local Artin homomorphism is surjective. -/ +theorem abelianLocalArtinMonoidHom_surjective : + Function.Surjective (abelianLocalArtinMonoidHom K L) := + (Abelianization.equivOfComm (H := Gal(L/K))).symm.surjective.comp + (localArtinMonoidHom_surjective K L) + +/-- The kernel of the actual abelian local Artin homomorphism is the norm +subgroup. -/ +theorem abelianLocalArtinMonoidHom_ker : + MonoidHom.ker (abelianLocalArtinMonoidHom K L) = + localNormSubgroup K L := by + rw [← localArtinMonoidHom_ker K L] + ext a + simp only [MonoidHom.mem_ker, abelianLocalArtinMonoidHom, + MonoidHom.coe_comp, Function.comp_apply] + constructor + · intro ha + apply (Abelianization.equivOfComm (H := Gal(L/K))).symm.injective + simpa using ha + · intro ha + rw [ha, map_one] + +/-- For a finite abelian Galois extension, topological abelianization is +canonically homeomorphic to the actual Galois group. -/ +noncomputable def topologicalAbelianizationEquivSelf : + TopologicalAbelianization Gal(L/K) ≃ₜ* Gal(L/K) := by + letI : DiscreteTopology (TopologicalAbelianization Gal(L/K)) := + QuotientGroup.discreteTopology (isOpen_discrete _) + let e : TopologicalAbelianization Gal(L/K) ≃* Gal(L/K) := + (topologicalAbelianizationFiniteEquiv K L).symm.trans + (Abelianization.equivOfComm (H := Gal(L/K))).symm + exact + { e with + continuous_toFun := continuous_of_discreteTopology + continuous_invFun := continuous_of_discreteTopology } + +/-- The continuous local Artin map with values in the actual Galois group +of a finite abelian extension. -/ +noncomputable def abelianLocalArtinMap : + Kˣ →ₜ* Gal(L/K) := + (ContinuousMonoidHom.toContinuousMonoidHom + (topologicalAbelianizationEquivSelf K L)).comp + (localArtinMap K L) + +/-- Forgetting topology from the continuous actual Artin map recovers the +algebraic actual Artin homomorphism. -/ +theorem abelianLocalArtinMap_toMonoidHom : + (abelianLocalArtinMap K L).toMonoidHom = + abelianLocalArtinMonoidHom K L := by + change + ((Abelianization.equivOfComm (H := Gal(L/K))).symm).toMonoidHom.comp + ((topologicalAbelianizationFiniteEquiv K L).symm.toMonoidHom.comp + (localArtinMap K L).toMonoidHom) = + ((Abelianization.equivOfComm (H := Gal(L/K))).symm).toMonoidHom.comp + (localArtinMonoidHom K L) + rw [localArtinMap_toMonoidHom K L] + +/-- The continuous actual abelian local Artin map is surjective. -/ +theorem abelianLocalArtinMap_surjective : + Function.Surjective (abelianLocalArtinMap K L) := + (topologicalAbelianizationEquivSelf K L).surjective.comp + (localArtinMap_surjective K L) + +/-- The kernel of the continuous actual abelian local Artin map is the norm +subgroup. -/ +theorem abelianLocalArtinMap_ker : + (abelianLocalArtinMap K L).toMonoidHom.ker = + localNormSubgroup K L := by + rw [abelianLocalArtinMap_toMonoidHom, + abelianLocalArtinMonoidHom_ker] + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidueNaturality.lean new file mode 100644 index 0000000000..bca0975f4c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidueNaturality.lean @@ -0,0 +1,78 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntermediateFieldNormResidueNaturality +/-! +# Restriction naturality of the actual abelian local Artin map + +The actual algebraic and continuous Artin maps commute with restriction +between finite abelian intermediate fields of the fixed separable closure. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory +open RamificationTheory + +variable (K : Type) [Field K] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + +/-- Restriction between the actual Galois groups of two finite intermediate +fields, bundled as a continuous homomorphism for their finite Krull +topologies. -/ +noncomputable def intermediateFieldRestrictContinuous + (E F : IntermediateField K (SeparableClosure K)) (hEF : E ≤ F) + [FiniteDimensional K F] + [IsGalois K E] : + Gal(F/K) →ₜ* Gal(E/K) := + { intermediateFieldRestrictNormalHom E F hEF with + continuous_toFun := continuous_of_discreteTopology } + +/-- Finite Artin homomorphisms commute with restriction along a +tower of finite abelian intermediate fields. -/ +theorem abelianLocalArtinMonoidHom_restrict + (E F : IntermediateField K (SeparableClosure K)) (hEF : E ≤ F) + [FiniteDimensional K E] [FiniteDimensional K F] + [IsAbelianGalois K E] [IsAbelianGalois K F] : + (intermediateFieldRestrictNormalHom E F hEF).comp + (abelianLocalArtinMonoidHom K F) = + abelianLocalArtinMonoidHom K E := by + apply MonoidHom.ext + intro a + exact localArtinAutomorphism_restrict K E F hEF a + +/-- The continuous actual finite Artin maps commute with restriction along +a tower of finite abelian intermediate fields. -/ +theorem abelianLocalArtinMap_restrict + (E F : IntermediateField K (SeparableClosure K)) (hEF : E ≤ F) + [FiniteDimensional K E] [FiniteDimensional K F] + [IsAbelianGalois K E] [IsAbelianGalois K F] : + (intermediateFieldRestrictContinuous K E F hEF).comp + (abelianLocalArtinMap K F) = + abelianLocalArtinMap K E := by + apply ContinuousMonoidHom.ext + intro a + change intermediateFieldRestrictNormalHom E F hEF + (abelianLocalArtinMap K F a) = + abelianLocalArtinMap K E a + rw [show abelianLocalArtinMap K F a = + abelianLocalArtinMonoidHom K F a by + exact DFunLike.congr_fun (abelianLocalArtinMap_toMonoidHom K F) a, + show abelianLocalArtinMap K E a = + abelianLocalArtinMonoidHom K E a by + exact DFunLike.congr_fun (abelianLocalArtinMap_toMonoidHom K E) a] + exact DFunLike.congr_fun + (abelianLocalArtinMonoidHom_restrict K E F hEF) a + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean new file mode 100644 index 0000000000..551bb36f2c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean @@ -0,0 +1,324 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteFrobenius +public import Mathlib.FieldTheory.AbsoluteGaloisGroup +public import Mathlib.FieldTheory.Galois.Infinite +public import Mathlib.FieldTheory.IsSepClosed + +/-! # Residue Absolute Degree -/ + +@[expose] public section +namespace LocalClassFieldTheory + +open ClassFormation + +/-! +# Finite local reciprocity: the absolute residue degree map + +For a finite field `k`, arithmetic Frobenius identifies the absolute Galois +group of `k` with the profinite integers. This file proves the missing +global statement from the compatible finite Frobenius coordinates: + +* every positive integer occurs as the degree of an actual finite Galois + intermediate field of `AlgebraicClosure k`; +* those fields detect every finite coordinate of `ℤ̂`, hence the assembled + Frobenius map is injective; +* its compact image is all of the absolute Galois group; +* inversion gives the continuous degree map of the finite local reciprocity construction. +-/ + +noncomputable +section + +universe u + +open CategoryTheory Opposite +open FiniteGaloisIntermediateField ProfiniteGrp +open Polynomial + +variable (k : Type u) [Field k] [Fintype k] + +omit [Fintype k] in +/-- The characteristic of a finite field is prime. -/ +instance finiteFieldRingCharPrime [Finite k] : Fact (ringChar k).Prime := + ⟨CharP.char_is_prime k (ringChar k)⟩ + +/-- The absolute Galois group of the residue field has a Hausdorff Krull topology. -/ +noncomputable instance absoluteGaloisGroupT2 : + T2Space (Field.absoluteGaloisGroup k) := by + unfold Field.absoluteGaloisGroup + exact krullTopology_t2 + +/-- A chosen embedding of the degree-`n` finite extension of `k` into its +algebraic closure. -/ +noncomputable def finiteResidueExtensionEmbedding (n : ℕ) [NeZero n] : + FiniteField.Extension k (ringChar k) n →ₐ[k] AlgebraicClosure k := + IsAlgClosed.lift + +/-- The image in `AlgebraicClosure k` of the chosen degree-`n` extension. -/ +noncomputable def finiteResidueIntermediateField (n : ℕ) [NeZero n] : + IntermediateField k (AlgebraicClosure k) := + (⊤ : IntermediateField k (FiniteField.Extension k (ringChar k) n)).map + (finiteResidueExtensionEmbedding k n) + +/-- The chosen degree-`n` extension is isomorphic to its image in the +algebraic closure. -/ +noncomputable def finiteResidueExtensionEquivIntermediate (n : ℕ) [NeZero n] : + FiniteField.Extension k (ringChar k) n ≃ₐ[k] + finiteResidueIntermediateField k n := + IntermediateField.topEquiv.symm.trans + (IntermediateField.equivMap ⊤ (finiteResidueExtensionEmbedding k n)) + +/-- For every `n > 0`, an actual degree-`n` finite Galois intermediate field +inside `AlgebraicClosure k`. -/ +noncomputable def finiteResidueGaloisIntermediateField (n : ℕ) [NeZero n] : + FiniteGaloisIntermediateField k (AlgebraicClosure k) where + toIntermediateField := finiteResidueIntermediateField k n + finiteDimensional := Module.Finite.equiv + (finiteResidueExtensionEquivIntermediate k n).toLinearEquiv + isGalois := IsGalois.of_algEquiv + (finiteResidueExtensionEquivIntermediate k n) + +/-- The canonical finite residue subextension of level `n` has degree `n`. -/ +@[simp] +theorem finrank_finiteResidueGaloisIntermediateField (n : ℕ) [NeZero n] : + Module.finrank k (finiteResidueGaloisIntermediateField k n) = n := by + calc + Module.finrank k (finiteResidueGaloisIntermediateField k n) = + Module.finrank k (FiniteField.Extension k (ringChar k) n) := + (finiteResidueExtensionEquivIntermediate k n).toLinearEquiv.finrank_eq.symm + _ = n := FiniteField.finrank_extension k (ringChar k) n + +/-- Finite extensions of every degree detect all profinite coordinates, so +the assembled Frobenius map on the algebraic closure is injective. -/ +theorem residueAbsoluteFrobenius_algebraicClosure_injective : + Function.Injective + (residueAbsoluteFrobenius k (AlgebraicClosure k)) := by + intro z w hzw + apply Multiplicative.ext + apply ZHat.ext + intro n hn + let : NeZero n := ⟨Nat.ne_of_gt hn⟩ + let E := finiteResidueGaloisIntermediateField k n + have hrestriction := congrArg (AlgEquiv.restrictNormalHom E) hzw + rw [restrictNormalHom_residueAbsoluteFrobenius (z := z) (E := E), + restrictNormalHom_residueAbsoluteFrobenius (z := w) (E := E)] at hrestriction + let : Finite E := Module.finite_of_finite k + change finiteResidueFrobeniusFromZHat k E z = + finiteResidueFrobeniusFromZHat k E w at hrestriction + rw [finiteResidueFrobeniusFromZHat_apply, + finiteResidueFrobeniusFromZHat_apply] at hrestriction + have hcoordinate := congrArg Multiplicative.toAdd + (finiteResidueFrobeniusExponentHom_injective k E hrestriction) + have hdegree : Module.finrank k E = n := by + exact finrank_finiteResidueGaloisIntermediateField k n + simp only [toAdd_ofAdd] at hcoordinate + change zHatReduction (Module.finrank k E) Module.finrank_pos z.toAdd = + zHatReduction (Module.finrank k E) Module.finrank_pos w.toAdd at hcoordinate + have hdiv : n ∣ Module.finrank k E := by simp [hdegree] + have hcast := congrArg (ZMod.castHom hdiv (ZMod n)) hcoordinate + rw [zHatReduction_transition hn Module.finrank_pos hdiv z.toAdd, + zHatReduction_transition hn Module.finrank_pos hdiv w.toAdd] at hcast + exact hcast + +/-- In an algebraic closure of a finite field, the fixed points of arithmetic +Frobenius are exactly the elements of the base field. -/ +theorem mem_range_algebraMap_iff_frobenius_fixed + (x : AlgebraicClosure k) : + x ∈ Set.range (algebraMap k (AlgebraicClosure k)) ↔ + FiniteField.frobeniusAlgEquivOfAlgebraic k (AlgebraicClosure k) x = x := by + constructor + · rintro ⟨a, rfl⟩ + simp only [FiniteField.coe_frobeniusAlgEquivOfAlgebraic] + rw [← map_pow, FiniteField.pow_card] + · intro hx + have hxpow : x ^ Fintype.card k = x := by + simpa only [FiniteField.coe_frobeniusAlgEquivOfAlgebraic] using hx + let p : k[X] := X ^ Fintype.card k - X + have hpne : p ≠ 0 := by + exact FiniteField.X_pow_card_sub_X_ne_zero k Fintype.one_lt_card + have hxroot : x ∈ p.rootSet (AlgebraicClosure k) := by + rw [Polynomial.mem_rootSet_of_ne hpne] + simp [p, hxpow] + have hsplits : (p.map (algebraMap k k)).Splits := by + simpa only [p] using (FiniteField.isSplittingField_sub k k).splits + have himage := hsplits.image_rootSet + (Algebra.ofId k (AlgebraicClosure k)) + rw [← himage] at hxroot + rcases hxroot with ⟨a, _ha, hax⟩ + exact ⟨a, hax⟩ + +/-- The compact image of the assembled Frobenius map, as a closed subgroup +of the absolute Galois group. -/ +noncomputable def residueAbsoluteFrobeniusRange : + ClosedSubgroup (AlgebraicClosure k ≃ₐ[k] AlgebraicClosure k) where + toSubgroup := + (residueAbsoluteFrobenius k (AlgebraicClosure k)).toMonoidHom.range + isClosed' := by + change IsClosed + (Set.range (residueAbsoluteFrobenius k (AlgebraicClosure k))) + exact (isCompact_range + (residueAbsoluteFrobenius k + (AlgebraicClosure k)).continuous_toFun).isClosed + +/-- The compact Frobenius image fixes no elements beyond the base finite +field. -/ +theorem fixedField_residueAbsoluteFrobeniusRange : + IntermediateField.fixedField + (residueAbsoluteFrobeniusRange k).toSubgroup = ⊥ := by + apply le_antisymm + · intro x hx + have hfrobenius_mem : + FiniteField.frobeniusAlgEquivOfAlgebraic k (AlgebraicClosure k) ∈ + residueAbsoluteFrobeniusRange k := by + change FiniteField.frobeniusAlgEquivOfAlgebraic k (AlgebraicClosure k) ∈ + (residueAbsoluteFrobenius k + (AlgebraicClosure k)).toMonoidHom.range + exact ⟨Multiplicative.ofAdd (1 : ZHat), + residueAbsoluteFrobenius_one k (AlgebraicClosure k)⟩ + rw [IntermediateField.mem_fixedField_iff] at hx + have hxFrobenius := hx + (FiniteField.frobeniusAlgEquivOfAlgebraic k (AlgebraicClosure k)) + hfrobenius_mem + rw [IntermediateField.mem_bot] + exact (mem_range_algebraMap_iff_frobenius_fixed k x).mpr hxFrobenius + · exact bot_le + +/-- The closed Frobenius image is the whole absolute Galois group. -/ +theorem residueAbsoluteFrobeniusRange_eq_top : + (residueAbsoluteFrobeniusRange k).toSubgroup = ⊤ := by + have hfixed := InfiniteGalois.fixingSubgroup_fixedField + (residueAbsoluteFrobeniusRange k) + rw [fixedField_residueAbsoluteFrobeniusRange, + IntermediateField.fixingSubgroup_bot] at hfixed + exact hfixed.symm + +/-- The assembled Frobenius map onto the absolute Galois group of a finite +field is surjective. -/ +theorem residueAbsoluteFrobenius_algebraicClosure_surjective : + Function.Surjective + (residueAbsoluteFrobenius k (AlgebraicClosure k)) := by + intro sigma + have hsigma : sigma ∈ (residueAbsoluteFrobeniusRange k).toSubgroup := by + rw [residueAbsoluteFrobeniusRange_eq_top] + exact Subgroup.mem_top sigma + exact hsigma + +/-- The Frobenius parameter map is a bijection for the algebraic closure of +a finite field. -/ +theorem residueAbsoluteFrobenius_algebraicClosure_bijective : + Function.Bijective + (residueAbsoluteFrobenius k (AlgebraicClosure k)) := + ⟨residueAbsoluteFrobenius_algebraicClosure_injective k, + residueAbsoluteFrobenius_algebraicClosure_surjective k⟩ + +/-- The underlying multiplicative equivalence between profinite integers and +the absolute Galois group of a finite field. -/ +noncomputable def residueAbsoluteFrobeniusMulEquiv : + ZHatMul ≃* Field.absoluteGaloisGroup k := + MulEquiv.ofBijective + (residueAbsoluteFrobenius k (AlgebraicClosure k)).toMonoidHom + (residueAbsoluteFrobenius_algebraicClosure_bijective k) + +/-- Arithmetic Frobenius gives a topological group equivalence +`ℤ̂ ≃ Gal(k_bar/k)`. -/ +noncomputable def residueAbsoluteFrobeniusEquiv : + ZHatMul ≃ₜ* Field.absoluteGaloisGroup k where + toMulEquiv := residueAbsoluteFrobeniusMulEquiv k + continuous_toFun := + (residueAbsoluteFrobenius k + (AlgebraicClosure k)).continuous_toFun + continuous_invFun := + Continuous.continuous_symm_of_equiv_compact_to_t2 + (f := (residueAbsoluteFrobeniusMulEquiv k).toEquiv) + (residueAbsoluteFrobenius k + (AlgebraicClosure k)).continuous_toFun + +/-- **Finite local reciprocity, absolute residue degree.** The inverse of arithmetic +Frobenius coordinates, as a continuous surjective homomorphism +`Gal(k_bar/k) → ℤ̂`. -/ +noncomputable def residueAbsoluteDegree : + Field.absoluteGaloisGroup k →ₜ* ZHatMul := + ContinuousMonoidHom.toContinuousMonoidHom + (residueAbsoluteFrobeniusEquiv k).symm + +/-- The degree map is normalized by sending arithmetic Frobenius to `1`. -/ +@[simp] +theorem residueAbsoluteDegree_frobenius : + residueAbsoluteDegree k + (FiniteField.frobeniusAlgEquivOfAlgebraic k (AlgebraicClosure k)) = + Multiplicative.ofAdd (1 : ZHat) := by + apply (residueAbsoluteFrobeniusEquiv k).injective + change (residueAbsoluteFrobeniusEquiv k) + ((residueAbsoluteFrobeniusEquiv k).symm + (FiniteField.frobeniusAlgEquivOfAlgebraic k (AlgebraicClosure k))) = + (residueAbsoluteFrobeniusEquiv k) + (Multiplicative.ofAdd (1 : ZHat)) + exact ((residueAbsoluteFrobeniusEquiv k).apply_symm_apply + (show Field.absoluteGaloisGroup k from + FiniteField.frobeniusAlgEquivOfAlgebraic k (AlgebraicClosure k))).trans + (residueAbsoluteFrobenius_one k (AlgebraicClosure k)).symm + +/-- On every finite Galois residue subextension, the absolute degree of an +automorphism is exactly its canonical Frobenius exponent. This is the +finite-coordinate compatibility needed when the residue degree map is pulled +back to the absolute Galois group of a local field. -/ +theorem finiteResidueFrobeniusIntermediate_residueAbsoluteDegree + (sigma : Field.absoluteGaloisGroup k) + (E : FiniteGaloisIntermediateField k (AlgebraicClosure k)) : + finiteResidueFrobeniusIntermediate k (AlgebraicClosure k) E + (residueAbsoluteDegree k sigma) = + AlgEquiv.restrictNormalHom E sigma := by + calc + finiteResidueFrobeniusIntermediate k (AlgebraicClosure k) E + (residueAbsoluteDegree k sigma) = + AlgEquiv.restrictNormalHom E + (residueAbsoluteFrobenius k (AlgebraicClosure k) + (residueAbsoluteDegree k sigma)) := + (restrictNormalHom_residueAbsoluteFrobenius + (k := k) (Omega := AlgebraicClosure k) + (z := residueAbsoluteDegree k sigma) E).symm + _ = AlgEquiv.restrictNormalHom E sigma := by + exact congrArg (AlgEquiv.restrictNormalHom E) + ((residueAbsoluteFrobeniusEquiv k).apply_symm_apply sigma) + +/-- Coordinate form of +`finiteResidueFrobeniusIntermediate_residueAbsoluteDegree`: reducing the +absolute degree modulo `[E:k]` and exponentiating arithmetic Frobenius gives +the actual restriction of the automorphism to `E`. -/ +theorem finiteResidueFrobeniusExponentHom_degree_coordinate + (sigma : Field.absoluteGaloisGroup k) + (E : FiniteGaloisIntermediateField k (AlgebraicClosure k)) : + letI : Finite E := Module.finite_of_finite k + finiteResidueFrobeniusExponentHom k E + (Multiplicative.ofAdd + (zHatReduction (Module.finrank k E) Module.finrank_pos + (residueAbsoluteDegree k sigma).toAdd)) = + AlgEquiv.restrictNormalHom E sigma := by + let : Finite E := Module.finite_of_finite k + exact finiteResidueFrobeniusIntermediate_residueAbsoluteDegree k sigma E + +/-- Equivalently, the inverse finite Frobenius coordinate of a restriction +is the reduction of the absolute degree modulo the residue extension degree. -/ +theorem finiteResidueFrobeniusExponentEquiv_symm_restrict + (sigma : Field.absoluteGaloisGroup k) + (E : FiniteGaloisIntermediateField k (AlgebraicClosure k)) : + letI : Finite E := Module.finite_of_finite k + (finiteResidueFrobeniusExponentEquiv k E).symm + (AlgEquiv.restrictNormalHom E sigma) = + Multiplicative.ofAdd + (zHatReduction (Module.finrank k E) Module.finrank_pos + (residueAbsoluteDegree k sigma).toAdd) := by + let : Finite E := Module.finite_of_finite k + apply (finiteResidueFrobeniusExponentEquiv k E).injective + rw [(finiteResidueFrobeniusExponentEquiv k E).apply_symm_apply] + exact (finiteResidueFrobeniusExponentHom_degree_coordinate k sigma E).symm + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteFrobenius.lean new file mode 100644 index 0000000000..55d1dd4960 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteFrobenius.lean @@ -0,0 +1,183 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFrobenius + +/-! # Residue Absolute Frobenius -/ + +@[expose] public section +namespace LocalClassFieldTheory + +open ClassFormation + +/-! +# Finite local reciprocity: Frobenius on an infinite residue extension + +The finite Frobenius exponent maps are compatible with restriction. This +file therefore assembles them in the actual inverse-limit presentation of an +infinite Galois group. It produces the canonical continuous homomorphism +from the profinite integers to the Galois group of an algebraic Galois +extension of a finite field. + +For an algebraic closure this is the Frobenius map compared with the degree +map in finite local reciprocity. The construction itself does not require a +bijectivity hypothesis. +-/ + +noncomputable +section + +universe u v + +open CategoryTheory Opposite +open FiniteGaloisIntermediateField ProfiniteGrp +variable (k : Type u) (Omega : Type v) + [Field k] [Fintype k] [Field Omega] [Algebra k Omega] + [IsGalois k Omega] + +/-- The finite Frobenius action on an intermediate field, with finiteness +derived from finite-dimensionality over the finite base. -/ +def finiteResidueFrobeniusIntermediate + (E : FiniteGaloisIntermediateField k Omega) : + ZHatMul →ₜ* (E ≃ₐ[k] E) := by + letI : Finite E := Module.finite_of_finite k + exact finiteResidueFrobeniusFromZHat k E + +/-- The compatible finite Frobenius coordinates attached to one profinite +integer. -/ +def residueFrobeniusLimitPoint (z : ZHatMul) : + limit (InfiniteGalois.asProfiniteGaloisGroupFunctor k Omega) where + val := fun E => finiteResidueFrobeniusIntermediate k Omega E.unop z + property := by + intro E F f + algebraize [Subsemiring.inclusion <| leOfHom f.1] + have : IsScalarTower k F.unop E.unop := + IsScalarTower.of_algebraMap_eq (congrFun rfl) + let : Finite F.unop := Module.finite_of_finite k + let : Finite E.unop := Module.finite_of_finite k + change AlgEquiv.restrictNormalHom F.unop + (finiteResidueFrobeniusFromZHat k E.unop z) = + finiteResidueFrobeniusFromZHat k F.unop z + exact restrictNormalHom_finiteResidueFrobeniusFromZHat + (k := k) (E := F.unop) (F := E.unop) z + +/-- The compatible Frobenius coordinates as a continuous homomorphism into +the finite-Galois inverse limit. -/ +def residueFrobeniusToLimit : + ZHatMul →ₜ* limit (InfiniteGalois.asProfiniteGaloisGroupFunctor k Omega) where + toFun := residueFrobeniusLimitPoint k Omega + map_one' := by + apply Subtype.ext + funext E + exact (finiteResidueFrobeniusIntermediate k Omega E.unop).map_one + map_mul' x y := by + apply Subtype.ext + funext E + exact (finiteResidueFrobeniusIntermediate k Omega E.unop).map_mul x y + continuous_toFun := by + have hcontinuous (E : (FiniteGaloisIntermediateField k Omega)ᵒᵖ) : + @Continuous ZHatMul (E.unop ≃ₐ[k] E.unop) + inferInstance (krullTopology k E.unop) + (finiteResidueFrobeniusIntermediate k Omega E.unop) := + (finiteResidueFrobeniusIntermediate k Omega E.unop).continuous_toFun + let (E : (FiniteGaloisIntermediateField k Omega)ᵒᵖ) : + TopologicalSpace (E.unop ≃ₐ[k] E.unop) := + ((InfiniteGalois.asProfiniteGaloisGroupFunctor k Omega).obj E).toProfinite.toTop.str + apply Continuous.subtype_mk + exact continuous_pi fun E => by + change @Continuous ZHatMul (E.unop ≃ₐ[k] E.unop) + inferInstance inferInstance + (finiteResidueFrobeniusIntermediate k Omega E.unop) + rw [show + (inferInstance : TopologicalSpace (E.unop ≃ₐ[k] E.unop)) = + krullTopology k E.unop by + change (⊥ : TopologicalSpace (E.unop ≃ₐ[k] E.unop)) = krullTopology k E.unop + exact (@DiscreteTopology.eq_bot _ (krullTopology k E.unop) inferInstance).symm] + exact hcontinuous E + +omit [IsGalois k Omega] in +/-- States the theorem `residueFrobeniusToLimit_apply_component`. -/ +theorem residueFrobeniusToLimit_apply_component (z : ZHatMul) + (E : (FiniteGaloisIntermediateField k Omega)ᵒᵖ) : + (residueFrobeniusToLimit k Omega z).val E = + finiteResidueFrobeniusIntermediate k Omega E.unop z := + rfl + +/-- The canonical continuous Frobenius-parameter homomorphism +`ℤ̂ → Gal(Omega/k)` for a Galois algebraic extension of a finite field. -/ +def residueAbsoluteFrobenius : ZHatMul →ₜ* (Omega ≃ₐ[k] Omega) := + (ContinuousMonoidHom.toContinuousMonoidHom + (InfiniteGalois.continuousMulEquivToLimit k Omega).symm).comp + (residueFrobeniusToLimit k Omega) + +/-- Restricting the assembled Frobenius to a finite Galois intermediate +field gives exactly the finite Frobenius coordinate. -/ +theorem restrictNormalHom_residueAbsoluteFrobenius + (z : ZHatMul) (E : FiniteGaloisIntermediateField k Omega) : + AlgEquiv.restrictNormalHom E (residueAbsoluteFrobenius k Omega z) = + finiteResidueFrobeniusIntermediate k Omega E z := by + have hcomponent := congrArg (fun q => q.val (op E)) + ((InfiniteGalois.continuousMulEquivToLimit k Omega).apply_symm_apply + (residueFrobeniusToLimit k Omega z)) + exact hcomponent + +/-- The element `1 ∈ ℤ̂` gives the actual arithmetic Frobenius on every +finite Galois residue subextension. -/ +theorem restrictNormalHom_residueAbsoluteFrobenius_one + (E : FiniteGaloisIntermediateField k Omega) : + AlgEquiv.restrictNormalHom E + (residueAbsoluteFrobenius k Omega + (Multiplicative.ofAdd (1 : ZHat))) = + FiniteField.frobeniusAlgEquivOfAlgebraic k E := by + rw [restrictNormalHom_residueAbsoluteFrobenius] + let : Finite E := Module.finite_of_finite k + exact finiteResidueFrobeniusFromZHat_one k E + +/-- Arithmetic Frobenius on an algebraic Galois extension restricts to +arithmetic Frobenius on every finite Galois intermediate field. -/ +theorem restrictNormalHom_frobeniusAlgEquivOfAlgebraic + (E : FiniteGaloisIntermediateField k Omega) : + AlgEquiv.restrictNormalHom E + (FiniteField.frobeniusAlgEquivOfAlgebraic k Omega) = + FiniteField.frobeniusAlgEquivOfAlgebraic k E := by + apply AlgEquiv.ext + intro x + apply (algebraMap E Omega).injective + calc + algebraMap E Omega + ((AlgEquiv.restrictNormalHom E + (FiniteField.frobeniusAlgEquivOfAlgebraic k Omega)) x) = + FiniteField.frobeniusAlgEquivOfAlgebraic k Omega + (algebraMap E Omega x) := + AlgEquiv.restrictNormal_commutes + (FiniteField.frobeniusAlgEquivOfAlgebraic k Omega) E x + _ = algebraMap E Omega + (FiniteField.frobeniusAlgEquivOfAlgebraic k E x) := by + simp only [FiniteField.coe_frobeniusAlgEquivOfAlgebraic] + exact (map_pow (algebraMap E Omega) x (Fintype.card k)).symm + +/-- The distinguished element `1 ∈ ℤ̂` acts on the whole algebraic Galois +extension by the actual arithmetic Frobenius. -/ +@[simp] +theorem residueAbsoluteFrobenius_one : + residueAbsoluteFrobenius k Omega + (Multiplicative.ofAdd (1 : ZHat)) = + FiniteField.frobeniusAlgEquivOfAlgebraic k Omega := by + apply (InfiniteGalois.continuousMulEquivToLimit k Omega).injective + apply Subtype.ext + funext E + change AlgEquiv.restrictNormalHom E.unop + (residueAbsoluteFrobenius k Omega + (Multiplicative.ofAdd (1 : ZHat))) = + AlgEquiv.restrictNormalHom E.unop + (FiniteField.frobeniusAlgEquivOfAlgebraic k Omega) + rw [restrictNormalHom_residueAbsoluteFrobenius_one, + restrictNormalHom_frobeniusAlgEquivOfAlgebraic] + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueActionIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueActionIndex.lean new file mode 100644 index 0000000000..b0d8aa6cc8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueActionIndex.lean @@ -0,0 +1,117 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueDatum +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ResidueExactSequence + +/-! # Residue Action Index -/ + +@[expose] public section +namespace LocalClassFieldTheory + +open RamificationTheory + +open ClassFormation + +/-! +# Finite local reciprocity: residue-action image indices + +This file separates the two group-theoretic comparisons used by the local +degree map. The residue-action exact-sequence theorem supplies the actual action of an absolute +decomposition group on the selected residue algebraic closure. Once the +decomposition group is all of the absolute Galois group, that action is +surjective. If a finite-index subgroup has residue-action image equal to the +fixing group of a finite residue subextension, its degree image has the +ordinary residue-field index. +-/ + +noncomputable +section + +universe u v + +open HilbertRamification.ValuationSubring + +variable (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + [IsGalois K L] + +/-- View every ambient Galois automorphism as a decomposition-group element +when the chosen extension valuation has full decomposition group. This is +kept generic in the Galois ambient field: the ambient field is the +separable closure, not the algebraic closure (the latter need not be Galois +over an imperfect local field). -/ +noncomputable def toDecompositionGroupOfEqTop + (A : _root_.ValuationSubring L) + (hA : decompositionGroup K A = ⊤) : + (L ≃ₐ[K] L) →* decompositionGroup K A where + toFun sigma := ⟨sigma, by rw [hA]; exact Subgroup.mem_top sigma⟩ + map_one' := by ext; rfl + map_mul' _ _ := by ext; rfl + +omit [IsGalois K L] in +/-- States the theorem `toDecompositionGroupOfEqTop_coe`. -/ +@[simp] theorem toDecompositionGroupOfEqTop_coe + (A : _root_.ValuationSubring L) + (hA : decompositionGroup K A = ⊤) + (sigma : L ≃ₐ[K] L) : + (toDecompositionGroupOfEqTop K A hA sigma : L ≃ₐ[K] L) = sigma := + rfl + +/-- The residue action from the exact sequence, viewed on the whole Galois group +when the chosen extension valuation has full decomposition group. -/ +noncomputable def residueAlgActionOfEqTop + (A : _root_.ValuationSubring L) + (hA : decompositionGroup K A = ⊤) : + (L ≃ₐ[K] L) →* + (selectedResidueField A ≃ₐ[decompositionResidueField K A] + selectedResidueField A) := + (decompositionGroupResidueAction (K := K) A).comp + (toDecompositionGroupOfEqTop K A hA) + +/-- States the theorem `residueAlgActionOfEqTop_surjective`. -/ +theorem residueAlgActionOfEqTop_surjective + (A : _root_.ValuationSubring L) + (hA : decompositionGroup K A = ⊤) : + Function.Surjective (residueAlgActionOfEqTop K A hA) := by + intro tau + obtain ⟨sigma, hsigma⟩ := + decompositionGroupResidueAction_surjective (K := K) A tau + refine ⟨(sigma : L ≃ₐ[K] L), ?_⟩ + have heq : + toDecompositionGroupOfEqTop K A hA (sigma : L ≃ₐ[K] L) = sigma := by + ext + rfl + simpa [residueAlgActionOfEqTop, heq] using hsigma + +section FiniteImageIndex + +variable (k Omega : Type) + [Field k] [Fintype k] [Field Omega] [Algebra k Omega] + [Algebra.IsAlgebraic k Omega] [IsAlgClosed Omega] + +/-- Finite-subgroup coordinate/index comparison. If the residue action of a +subgroup is precisely the subgroup fixing a finite residue field `E`, then +the image of the composite degree map has index `[E:k]`. -/ +theorem residueDegreeImage_index_eq_finrank_of_map_eq_fixingSubgroup + {G : Type*} [Group G] + (rho : G →* (Omega ≃ₐ[k] Omega)) + (H : Subgroup G) + (E : FiniteGaloisIntermediateField k Omega) + (himage : H.map rho = E.toIntermediateField.fixingSubgroup) : + (H.map ((residueAbsoluteDegreeIn k Omega).toMonoidHom.comp rho)).index = + Module.finrank k E := by + rw [← Subgroup.map_map, himage] + have h := + Internal.residueDatumIn_fieldImage_index_closedFixingSubgroup k Omega E + rw [(residueDatumIn k Omega).fieldImage_eq_map] at h + simpa [residueDatumIn, closedFixingSubgroup] using h + +end FiniteImageIndex + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicClosureDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicClosureDegree.lean new file mode 100644 index 0000000000..163a5ec139 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicClosureDegree.lean @@ -0,0 +1,544 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteDegree +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.InfiniteGaloisCorrespondence + +/-! # Residue Algebraic Closure Degree -/ + +@[expose] public section +namespace LocalClassFieldTheory + +open ClassFormation + +/-! +# Finite local reciprocity: degree coordinates on any residue algebraic closure + +The residue field obtained from a valuation ring in a separable closure is +not definitionally Mathlib's chosen `AlgebraicClosure`. The construction of +the degree map must therefore work on any algebraically closed algebraic +extension of the finite residue field. + +This file repeats the inverse-limit detection argument in that intrinsic +setting. The resulting map is the inverse of the canonical arithmetic +Frobenius homomorphism itself; no equivalence with a chosen algebraic closure +and no generator of a finite cyclic group enters its definition. +-/ + +noncomputable +section + +universe u v + +open CategoryTheory Opposite +open FiniteGaloisIntermediateField ProfiniteGrp +open RamificationTheory.Field.absoluteGaloisGroup +open Polynomial + +variable (k : Type u) [Field k] [Fintype k] +variable (Omega : Type v) [Field Omega] [Algebra k Omega] + [Algebra.IsAlgebraic k Omega] [IsAlgClosed Omega] + +omit [Fintype k] in +/-- The finite residue base has prime characteristic. -/ +instance finiteResidueBaseRingCharPrime [Finite k] : Fact (ringChar k).Prime := + ⟨CharP.char_is_prime k (ringChar k)⟩ + +/-- An algebraically closed algebraic residue extension is an algebraic closure. -/ +instance residueAlgebraicClosureIsAlgClosure : IsAlgClosure k Omega := + ⟨inferInstance, inferInstance⟩ + +omit [Fintype k] in +/-- An algebraic closure of a finite residue field is Galois over that field. -/ +instance residueAlgebraicClosureIsGalois [Finite k] : IsGalois k Omega := by + let := Fintype.ofFinite k + infer_instance + +/-- The residue absolute Galois group has a Hausdorff Krull topology. -/ +instance residueAlgebraicClosureGaloisT2 : + T2Space (Omega ≃ₐ[k] Omega) := by + infer_instance + +/-- Embed the degree-`n` finite extension of `k` into the given residue +algebraic closure. This choice is used only to prove that all profinite +coordinates are detected. -/ +noncomputable def finiteResidueExtensionEmbeddingInto + (n : ℕ) [NeZero n] : + FiniteField.Extension k (ringChar k) n →ₐ[k] Omega := by + letI : Module.IsTorsionFree k Omega := + Module.isTorsionFree_iff_algebraMap_injective.mpr + (algebraMap k Omega).injective + exact IsAlgClosed.lift (R := k) + (S := FiniteField.Extension k (ringChar k) n) (M := Omega) + +/-- The image of the degree-`n` finite extension in the given residue +algebraic closure. -/ +noncomputable def finiteResidueIntermediateFieldIn + (n : ℕ) [NeZero n] : IntermediateField k Omega := + (⊤ : IntermediateField k + (FiniteField.Extension k (ringChar k) n)).map + (finiteResidueExtensionEmbeddingInto k Omega n) + +/-- The model finite field is canonically isomorphic to its embedded image. -/ +noncomputable def finiteResidueExtensionEquivIntermediateIn + (n : ℕ) [NeZero n] : + FiniteField.Extension k (ringChar k) n ≃ₐ[k] + finiteResidueIntermediateFieldIn k Omega n := + IntermediateField.topEquiv.symm.trans + (IntermediateField.equivMap ⊤ + (finiteResidueExtensionEmbeddingInto k Omega n)) + +/-- An actual degree-`n` finite Galois intermediate field in any residue +algebraic closure. -/ +noncomputable def finiteResidueGaloisIntermediateFieldIn + (n : ℕ) [NeZero n] : FiniteGaloisIntermediateField k Omega where + toIntermediateField := finiteResidueIntermediateFieldIn k Omega n + finiteDimensional := Module.Finite.equiv + (finiteResidueExtensionEquivIntermediateIn k Omega n).toLinearEquiv + isGalois := IsGalois.of_algEquiv + (finiteResidueExtensionEquivIntermediateIn k Omega n) + +omit [Algebra.IsAlgebraic k Omega] in +/-- States the theorem `finrank_finiteResidueGaloisIntermediateFieldIn`. -/ +@[simp] +theorem finrank_finiteResidueGaloisIntermediateFieldIn + (n : ℕ) [NeZero n] : + Module.finrank k + (finiteResidueGaloisIntermediateFieldIn k Omega n) = n := by + calc + Module.finrank k + (finiteResidueGaloisIntermediateFieldIn k Omega n) = + Module.finrank k + (FiniteField.Extension k (ringChar k) n) := + (finiteResidueExtensionEquivIntermediateIn k Omega n).toLinearEquiv.finrank_eq.symm + _ = n := FiniteField.finrank_extension k (ringChar k) n + +/-- Finite subextensions of every positive degree detect every coordinate of +the canonical Frobenius homomorphism on an arbitrary residue algebraic +closure. -/ +theorem residueAbsoluteFrobenius_isAlgClosure_injective : + Function.Injective (residueAbsoluteFrobenius k Omega) := by + intro z w hzw + apply Multiplicative.ext + apply ZHat.ext + intro n hn + let : NeZero n := ⟨Nat.ne_of_gt hn⟩ + let E := finiteResidueGaloisIntermediateFieldIn k Omega n + have hrestriction := congrArg (AlgEquiv.restrictNormalHom E) hzw + rw [restrictNormalHom_residueAbsoluteFrobenius (z := z) (E := E), + restrictNormalHom_residueAbsoluteFrobenius (z := w) (E := E)] at hrestriction + let : Finite E := Module.finite_of_finite k + change finiteResidueFrobeniusFromZHat k E z = + finiteResidueFrobeniusFromZHat k E w at hrestriction + rw [finiteResidueFrobeniusFromZHat_apply, + finiteResidueFrobeniusFromZHat_apply] at hrestriction + have hcoordinate := congrArg Multiplicative.toAdd + (finiteResidueFrobeniusExponentHom_injective k E hrestriction) + have hdegree : Module.finrank k E = n := by + exact finrank_finiteResidueGaloisIntermediateFieldIn + k Omega n + simp only [toAdd_ofAdd] at hcoordinate + change zHatReduction (Module.finrank k E) Module.finrank_pos z.toAdd = + zHatReduction (Module.finrank k E) Module.finrank_pos w.toAdd at hcoordinate + have hdiv : n ∣ Module.finrank k E := by simp [hdegree] + have hcast := congrArg (ZMod.castHom hdiv (ZMod n)) hcoordinate + rw [zHatReduction_transition hn Module.finrank_pos hdiv z.toAdd, + zHatReduction_transition hn Module.finrank_pos hdiv w.toAdd] at hcast + exact hcast + +omit [IsAlgClosed Omega] in +/-- In any algebraic closure of a finite field, the fixed points of arithmetic +Frobenius are exactly the base field. -/ +theorem mem_range_algebraMap_iff_frobenius_fixed_in + (x : Omega) : + x ∈ Set.range (algebraMap k Omega) ↔ + FiniteField.frobeniusAlgEquivOfAlgebraic k Omega x = x := by + constructor + · rintro ⟨a, rfl⟩ + simp only [FiniteField.coe_frobeniusAlgEquivOfAlgebraic] + rw [← map_pow, FiniteField.pow_card] + · intro hx + have hxpow : x ^ Fintype.card k = x := by + simpa only [FiniteField.coe_frobeniusAlgEquivOfAlgebraic] using hx + let p : k[X] := X ^ Fintype.card k - X + have hpne : p ≠ 0 := + FiniteField.X_pow_card_sub_X_ne_zero k Fintype.one_lt_card + have hxroot : x ∈ p.rootSet Omega := by + rw [Polynomial.mem_rootSet_of_ne hpne] + simp [p, hxpow] + have hsplits : (p.map (algebraMap k k)).Splits := by + simpa only [p] using (FiniteField.isSplittingField_sub k k).splits + have himage := hsplits.image_rootSet (Algebra.ofId k Omega) + rw [← himage] at hxroot + rcases hxroot with ⟨a, _ha, hax⟩ + exact ⟨a, hax⟩ + +/-- The compact image of the intrinsic Frobenius homomorphism. -/ +noncomputable def residueAbsoluteFrobeniusRangeIn : + ClosedSubgroup (Omega ≃ₐ[k] Omega) where + toSubgroup := (residueAbsoluteFrobenius k Omega).toMonoidHom.range + isClosed' := by + change IsClosed (Set.range (residueAbsoluteFrobenius k Omega)) + exact (isCompact_range + (residueAbsoluteFrobenius k Omega).continuous_toFun).isClosed + +/-- The compact Frobenius image fixes precisely the finite base field. -/ +theorem fixedField_residueAbsoluteFrobeniusRangeIn : + IntermediateField.fixedField + (residueAbsoluteFrobeniusRangeIn k Omega).toSubgroup = ⊥ := by + apply le_antisymm + · intro x hx + have hfrobenius_mem : + FiniteField.frobeniusAlgEquivOfAlgebraic k Omega ∈ + residueAbsoluteFrobeniusRangeIn k Omega := by + change FiniteField.frobeniusAlgEquivOfAlgebraic k Omega ∈ + (residueAbsoluteFrobenius k Omega).toMonoidHom.range + exact ⟨Multiplicative.ofAdd (1 : ZHat), + residueAbsoluteFrobenius_one k Omega⟩ + rw [IntermediateField.mem_fixedField_iff] at hx + have hxFrobenius := hx + (FiniteField.frobeniusAlgEquivOfAlgebraic k Omega) + hfrobenius_mem + rw [IntermediateField.mem_bot] + exact (mem_range_algebraMap_iff_frobenius_fixed_in k Omega x).mpr + hxFrobenius + · exact bot_le + +/-- The intrinsic Frobenius image is the whole residue absolute Galois group. -/ +theorem residueAbsoluteFrobeniusRangeIn_eq_top : + (residueAbsoluteFrobeniusRangeIn k Omega).toSubgroup = ⊤ := by + have hfixed := InfiniteGalois.fixingSubgroup_fixedField + (residueAbsoluteFrobeniusRangeIn k Omega) + rw [fixedField_residueAbsoluteFrobeniusRangeIn, + IntermediateField.fixingSubgroup_bot] at hfixed + exact hfixed.symm + +/-- The intrinsic Frobenius homomorphism is surjective. -/ +theorem residueAbsoluteFrobenius_isAlgClosure_surjective : + Function.Surjective (residueAbsoluteFrobenius k Omega) := by + intro sigma + have hsigma : sigma ∈ + (residueAbsoluteFrobeniusRangeIn k Omega).toSubgroup := by + rw [residueAbsoluteFrobeniusRangeIn_eq_top] + exact Subgroup.mem_top sigma + exact hsigma + +/-- Arithmetic Frobenius gives the canonical topological equivalence between +`ZHatMul` and the Galois group of any algebraic closure of a finite field. -/ +noncomputable def residueAbsoluteFrobeniusEquivIn : + ZHatMul ≃ₜ* (Omega ≃ₐ[k] Omega) where + toMulEquiv := MulEquiv.ofBijective + (residueAbsoluteFrobenius k Omega).toMonoidHom + ⟨residueAbsoluteFrobenius_isAlgClosure_injective k Omega, + residueAbsoluteFrobenius_isAlgClosure_surjective k Omega⟩ + continuous_toFun := (residueAbsoluteFrobenius k Omega).continuous_toFun + continuous_invFun := + Continuous.continuous_symm_of_equiv_compact_to_t2 + (f := (MulEquiv.ofBijective + (residueAbsoluteFrobenius k Omega).toMonoidHom + ⟨residueAbsoluteFrobenius_isAlgClosure_injective k Omega, + residueAbsoluteFrobenius_isAlgClosure_surjective k Omega⟩).toEquiv) + (residueAbsoluteFrobenius k Omega).continuous_toFun + +/-- **Finite local reciprocity, intrinsic residue degree.** This is the inverse of +arithmetic Frobenius coordinates on the actual residue algebraic closure. -/ +noncomputable def residueAbsoluteDegreeIn : + (Omega ≃ₐ[k] Omega) →ₜ* ZHatMul := + ContinuousMonoidHom.toContinuousMonoidHom + (residueAbsoluteFrobeniusEquivIn k Omega).symm + +/-- Intrinsic residue degree is unchanged by simultaneous semilinear +equivalence of the finite residue base and its algebraic closure. The +conjugate automorphism is written locally in the statement, so no parallel +restriction or automorphism-conjugation API is introduced. -/ +theorem residueAbsoluteDegreeIn_semilinear_conjugation + {k' : Type u} {Omega' : Type v} + [Field k'] [Fintype k'] + [Field Omega'] [Algebra k' Omega'] + [Algebra.IsAlgebraic k' Omega'] [IsAlgClosed Omega'] + (tau : k ≃+* k') (e : Omega ≃+* Omega') + (he : ∀ x : k, + e (algebraMap k Omega x) = algebraMap k' Omega' (tau x)) + (sigma : Omega ≃ₐ[k] Omega) : + let sigma' : Omega' ≃ₐ[k'] Omega' := + { e.symm.trans (sigma.toRingEquiv.trans e) with + commutes' := fun x => by + change e (sigma (e.symm (algebraMap k' Omega' x))) = + algebraMap k' Omega' x + have hpre : + e.symm (algebraMap k' Omega' x) = + algebraMap k Omega (tau.symm x) := by + apply e.injective + rw [e.apply_symm_apply, he, tau.apply_symm_apply] + rw [hpre, sigma.commutes, he, tau.apply_symm_apply] } + residueAbsoluteDegreeIn k' Omega' sigma' = + residueAbsoluteDegreeIn k Omega sigma := by + let conjugate (g : Omega ≃ₐ[k] Omega) : + Omega' ≃ₐ[k'] Omega' := + AlgEquiv.ofRingEquiv + (f := e.symm.trans (g.toRingEquiv.trans e)) (fun x => by + change e (g (e.symm (algebraMap k' Omega' x))) = + algebraMap k' Omega' x + have hpre : + e.symm (algebraMap k' Omega' x) = + algebraMap k Omega (tau.symm x) := by + apply e.injective + rw [e.apply_symm_apply, he, tau.apply_symm_apply] + rw [hpre, g.commutes, he, tau.apply_symm_apply]) + have conjugate_one : conjugate 1 = 1 := by + apply AlgEquiv.ext + intro x + simp [conjugate] + have conjugate_mul (g h : Omega ≃ₐ[k] Omega) : + conjugate (g * h) = conjugate g * conjugate h := by + apply AlgEquiv.ext + intro x + simp [conjugate, AlgEquiv.mul_apply] + let conjugation : + (Omega ≃ₐ[k] Omega) →* (Omega' ≃ₐ[k'] Omega') := + { toFun := conjugate + map_one' := conjugate_one + map_mul' := conjugate_mul } + let conjugationContinuous : + (Omega ≃ₐ[k] Omega) →ₜ* (Omega' ≃ₐ[k'] Omega') := + { toMonoidHom := conjugation + continuous_toFun := + RamificationTheory.Field.absoluteGaloisGroup.semilinear_conjugation_continuous + tau e he conjugation (fun _ => rfl) } + let lhs : ZHatMul →ₜ* (Omega' ≃ₐ[k'] Omega') := + conjugationContinuous.comp (residueAbsoluteFrobenius k Omega) + let rhs : ZHatMul →ₜ* (Omega' ≃ₐ[k'] Omega') := + residueAbsoluteFrobenius k' Omega' + have hgenerator : + lhs (Multiplicative.ofAdd (1 : ZHat)) = + rhs (Multiplicative.ofAdd (1 : ZHat)) := by + change conjugation + (residueAbsoluteFrobenius k Omega + (Multiplicative.ofAdd (1 : ZHat))) = + residueAbsoluteFrobenius k' Omega' + (Multiplicative.ofAdd (1 : ZHat)) + rw [residueAbsoluteFrobenius_one, residueAbsoluteFrobenius_one] + apply AlgEquiv.ext + intro x + change e ((e.symm x) ^ Fintype.card k) = + x ^ Fintype.card k' + rw [map_pow, e.apply_symm_apply, + Fintype.card_congr tau.toEquiv] + let iota : Multiplicative ℤ →* ZHatMul := + AddMonoidHom.toMultiplicative + (Int.castRingHom ZHat).toAddMonoidHom + have hiota : DenseRange iota := by + have hOfAdd : + DenseRange (Multiplicative.ofAdd : ZHat → ZHatMul) := + (show Function.Surjective + (Multiplicative.ofAdd : ZHat → ZHatMul) from + fun x => ⟨Multiplicative.toAdd x, rfl⟩).denseRange + have hCast : + DenseRange + (Multiplicative.ofAdd ∘ fun a : ℤ => (a : ZHat)) := + hOfAdd.comp denseRange_intCast_zHat continuous_id + have hToAdd : + DenseRange (Multiplicative.toAdd : Multiplicative ℤ → ℤ) := + (show Function.Surjective + (Multiplicative.toAdd : Multiplicative ℤ → ℤ) from + fun a => ⟨Multiplicative.ofAdd a, rfl⟩).denseRange + simpa [iota, Function.comp_def] using + hCast.comp hToAdd continuous_of_discreteTopology + have hcomp : + lhs.toMonoidHom.comp iota = rhs.toMonoidHom.comp iota := by + apply MonoidHom.ext_mint + simpa [iota] using hgenerator + have heq (w : ZHatMul) : lhs w = rhs w := by + have hfun := + hiota.equalizer lhs.continuous_toFun rhs.continuous_toFun <| by + funext n + exact DFunLike.congr_fun hcomp n + exact congrFun hfun w + let z := residueAbsoluteDegreeIn k Omega sigma + have hz : + conjugation (residueAbsoluteFrobenius k Omega z) = + residueAbsoluteFrobenius k' Omega' z := by + exact heq z + apply (residueAbsoluteFrobeniusEquivIn k' Omega').injective + change + (residueAbsoluteFrobeniusEquivIn k' Omega') + ((residueAbsoluteFrobeniusEquivIn k' Omega').symm + (conjugation sigma)) = + (residueAbsoluteFrobeniusEquivIn k' Omega') + ((residueAbsoluteFrobeniusEquivIn k Omega).symm sigma) + rw [(residueAbsoluteFrobeniusEquivIn k' Omega').apply_symm_apply] + change conjugation sigma = + residueAbsoluteFrobenius k' Omega' z + have hsigma : + sigma = residueAbsoluteFrobenius k Omega z := by + change sigma = + (residueAbsoluteFrobeniusEquivIn k Omega) + ((residueAbsoluteFrobeniusEquivIn k Omega).symm sigma) + exact + ((residueAbsoluteFrobeniusEquivIn k Omega).apply_symm_apply sigma).symm + exact (congrArg conjugation hsigma).trans hz + +/-- Arithmetic Frobenius is compatible with changing the finite residue +base from `k` to a finite intermediate field `E`: after forgetting the +`E`-linear structure, the Frobenius coordinate is multiplied by +`[E : k]`. -/ +theorem residueAbsoluteFrobenius_restrictScalars + (E : IntermediateField k Omega) [FiniteDimensional k E] + (z : ZHatMul) : + letI : Finite E := Module.finite_of_finite k + letI : Fintype E := Fintype.ofFinite E + (residueAbsoluteFrobenius E Omega z).restrictScalars k = + residueAbsoluteFrobenius k Omega + (Multiplicative.ofAdd + ((Module.finrank k E) • z.toAdd)) := by + let : Finite E := Module.finite_of_finite k + let : Fintype E := Fintype.ofFinite E + let scaleHom : ZHatMul →* ZHatMul := + AddMonoidHom.toMultiplicative + (zHatMulNat (Module.finrank k E)).toAddMonoidHom + let scale : ZHatMul →ₜ* ZHatMul := + { toMonoidHom := scaleHom + continuous_toFun := + continuous_ofAdd.comp + ((zHatMulNat (Module.finrank k E)).continuous_toFun.comp + continuous_toAdd) } + let inclusion : (Omega ≃ₐ[E] Omega) →ₜ* (Omega ≃ₐ[k] Omega) := + { toMonoidHom := ofIntermediateFieldInExtension E + continuous_toFun := ofIntermediateFieldInExtension_continuous E } + let lhs : ZHatMul →ₜ* (Omega ≃ₐ[k] Omega) := + inclusion.comp (residueAbsoluteFrobenius E Omega) + let rhs : ZHatMul →ₜ* (Omega ≃ₐ[k] Omega) := + (residueAbsoluteFrobenius k Omega).comp scale + have hgenerator : + lhs (Multiplicative.ofAdd (1 : ZHat)) = + rhs (Multiplicative.ofAdd (1 : ZHat)) := by + change + (residueAbsoluteFrobenius E Omega + (Multiplicative.ofAdd (1 : ZHat))).restrictScalars k = + residueAbsoluteFrobenius k Omega + (Multiplicative.ofAdd + ((Module.finrank k E) • (1 : ZHat))) + rw [residueAbsoluteFrobenius_one] + have hscale : + Multiplicative.ofAdd + ((Module.finrank k E) • (1 : ZHat)) = + (Multiplicative.ofAdd (1 : ZHat)) ^ Module.finrank k E := by + apply Multiplicative.ext + simp + rw [hscale, map_pow, residueAbsoluteFrobenius_one] + apply AlgEquiv.ext + intro x + change + FiniteField.frobeniusAlgEquivOfAlgebraic E Omega x = + (FiniteField.frobeniusAlgEquivOfAlgebraic k Omega ^ + Module.finrank k E) x + rw [FiniteField.coe_frobeniusAlgEquivOfAlgebraic, + AlgEquiv.coe_pow, + FiniteField.coe_frobeniusAlgEquivOfAlgebraic_iterate, + Module.card_eq_pow_finrank (K := k) (V := E)] + let iota : Multiplicative ℤ →* ZHatMul := + AddMonoidHom.toMultiplicative + (Int.castRingHom ZHat).toAddMonoidHom + have hiota : DenseRange iota := by + have hOfAdd : + DenseRange (Multiplicative.ofAdd : ZHat → ZHatMul) := + (show Function.Surjective + (Multiplicative.ofAdd : ZHat → ZHatMul) from + fun x => ⟨Multiplicative.toAdd x, rfl⟩).denseRange + have hCast : + DenseRange + (Multiplicative.ofAdd ∘ fun a : ℤ => (a : ZHat)) := + hOfAdd.comp denseRange_intCast_zHat continuous_id + have hToAdd : + DenseRange (Multiplicative.toAdd : Multiplicative ℤ → ℤ) := + (show Function.Surjective + (Multiplicative.toAdd : Multiplicative ℤ → ℤ) from + fun a => ⟨Multiplicative.ofAdd a, rfl⟩).denseRange + simpa [iota, Function.comp_def] using + hCast.comp hToAdd continuous_of_discreteTopology + have hcomp : + lhs.toMonoidHom.comp iota = rhs.toMonoidHom.comp iota := by + apply MonoidHom.ext_mint + simpa [iota] using hgenerator + have heq (w : ZHatMul) : lhs w = rhs w := by + have hfun := + hiota.equalizer lhs.continuous_toFun rhs.continuous_toFun <| by + funext n + exact DFunLike.congr_fun hcomp n + exact congrFun hfun w + exact heq z + +/-- The intrinsic absolute residue degree has the corresponding +finite-base-change formula. -/ +theorem residueAbsoluteDegreeIn_restrictScalars + (E : IntermediateField k Omega) [FiniteDimensional k E] + (sigma : Omega ≃ₐ[E] Omega) : + letI : Finite E := Module.finite_of_finite k + letI : Fintype E := Fintype.ofFinite E + residueAbsoluteDegreeIn k Omega (sigma.restrictScalars k) = + Multiplicative.ofAdd + ((Module.finrank k E) • + (residueAbsoluteDegreeIn E Omega sigma).toAdd) := by + let : Finite E := Module.finite_of_finite k + let : Fintype E := Fintype.ofFinite E + apply (residueAbsoluteFrobeniusEquivIn k Omega).injective + change + (residueAbsoluteFrobeniusEquivIn k Omega) + ((residueAbsoluteFrobeniusEquivIn k Omega).symm + (sigma.restrictScalars k)) = + (residueAbsoluteFrobeniusEquivIn k Omega) + (Multiplicative.ofAdd + ((Module.finrank k E) • + ((residueAbsoluteFrobeniusEquivIn E Omega).symm sigma).toAdd)) + rw [(residueAbsoluteFrobeniusEquivIn k Omega).apply_symm_apply] + change sigma.restrictScalars k = + residueAbsoluteFrobenius k Omega + (Multiplicative.ofAdd + ((Module.finrank k E) • + ((residueAbsoluteFrobeniusEquivIn E Omega).symm sigma).toAdd)) + rw [← residueAbsoluteFrobenius_restrictScalars] + exact congrArg (fun g : Omega ≃ₐ[E] Omega => g.restrictScalars k) + ((residueAbsoluteFrobeniusEquivIn E Omega).apply_symm_apply sigma).symm + +/-- The intrinsic degree map sends arithmetic Frobenius to `1`. -/ +@[simp] +theorem residueAbsoluteDegreeIn_frobenius : + residueAbsoluteDegreeIn k Omega + (FiniteField.frobeniusAlgEquivOfAlgebraic k Omega) = + Multiplicative.ofAdd (1 : ZHat) := by + apply (residueAbsoluteFrobeniusEquivIn k Omega).injective + change (residueAbsoluteFrobeniusEquivIn k Omega) + ((residueAbsoluteFrobeniusEquivIn k Omega).symm + (FiniteField.frobeniusAlgEquivOfAlgebraic k Omega)) = + (residueAbsoluteFrobeniusEquivIn k Omega) + (Multiplicative.ofAdd (1 : ZHat)) + rw [(residueAbsoluteFrobeniusEquivIn k Omega).apply_symm_apply] + exact (residueAbsoluteFrobenius_one k Omega).symm + +/-- Finite-coordinate compatibility for the intrinsic residue degree. -/ +theorem finiteResidueFrobeniusExponentEquiv_symm_restrict_in + (sigma : Omega ≃ₐ[k] Omega) + (E : FiniteGaloisIntermediateField k Omega) : + letI : Finite E := Module.finite_of_finite k + (finiteResidueFrobeniusExponentEquiv k E).symm + (AlgEquiv.restrictNormalHom E sigma) = + Multiplicative.ofAdd + (zHatReduction (Module.finrank k E) Module.finrank_pos + (residueAbsoluteDegreeIn k Omega sigma).toAdd) := by + let : Finite E := Module.finite_of_finite k + apply (finiteResidueFrobeniusExponentEquiv k E).injective + rw [(finiteResidueFrobeniusExponentEquiv k E).apply_symm_apply] + change AlgEquiv.restrictNormalHom E sigma = + finiteResidueFrobeniusIntermediate k Omega E + (residueAbsoluteDegreeIn k Omega sigma) + rw [← restrictNormalHom_residueAbsoluteFrobenius] + congr 1 + exact ((residueAbsoluteFrobeniusEquivIn k Omega).apply_symm_apply sigma).symm + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicallyClosed.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicallyClosed.lean new file mode 100644 index 0000000000..c6be1d8ce2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicallyClosed.lean @@ -0,0 +1,225 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicClosureDegree +public import Mathlib.FieldTheory.PurelyInseparable.Basic +public import Mathlib.RingTheory.Valuation.Integral +public import Mathlib.RingTheory.Valuation.ValuationSubring + +/-! # Residue Algebraically Closed -/ + +@[expose] public section +namespace LocalClassFieldTheory + +/-! +# Residues of algebraically closed valued fields + +The residue field of a valuation ring in an algebraically closed field is +algebraically closed. This is the missing source needed to apply the +intrinsic finite-field degree map to the residue of an algebraic closure of a +local field. +-/ + +noncomputable +section + +universe u + +variable {Omega : Type u} [Field Omega] [IsAlgClosed Omega] + +/-- The residue field of a valuation subring of an algebraically closed field +is algebraically closed. A monic irreducible residue polynomial is lifted +monically to the valuation ring. A root in the ambient algebraically closed +field is integral, hence lies back in the valuation ring and can be reduced. -/ +theorem valuationSubring_residueField_isAlgClosed + (A : ValuationSubring Omega) : + IsAlgClosed (IsLocalRing.ResidueField A) := by + apply IsAlgClosed.of_exists_root + intro p hpmonic hpirreducible + have hlifts : p ∈ Polynomial.lifts (IsLocalRing.residue A) := by + rw [Polynomial.mem_lifts] + exact (Polynomial.map_surjective + (IsLocalRing.residue A) IsLocalRing.residue_surjective) p + obtain ⟨q, hqmap, hqdegree, hqmonic⟩ := + Polynomial.lifts_and_degree_eq_and_monic hlifts hpmonic + have hqmapSubtypeDegree : + (q.map A.subtype).degree ≠ 0 := by + rw [Polynomial.degree_map_eq_of_injective A.subtype_injective q] + rw [hqdegree] + exact ne_of_gt (Polynomial.degree_pos_of_irreducible hpirreducible) + obtain ⟨x, hxroot⟩ := + IsAlgClosed.exists_root (q.map A.subtype) hqmapSubtypeDegree + have hxIntegral : IsIntegral A x := by + refine ⟨q, hqmonic, ?_⟩ + change Polynomial.eval₂ A.subtype x q = 0 + simpa [Polynomial.eval_map] using hxroot + have hxA : x ∈ A := by + let hAIntegers : A.valuation.Integers A := + { hom_inj := A.subtype_injective + map_le_one := fun a => + (A.valuation_le_one_iff (a : Omega)).mpr a.property + exists_of_le_one := fun {r} hr => + ⟨⟨r, (A.valuation_le_one_iff r).mp hr⟩, rfl⟩ } + have hxValuation : A.valuation x ≤ 1 := + (hAIntegers.isIntegral_iff_v_le_one).mp hxIntegral + exact (A.valuation_le_one_iff x).mp hxValuation + let xA : A := ⟨x, hxA⟩ + have hxrootEval₂ : Polynomial.eval₂ A.subtype x q = 0 := by + rw [← Polynomial.eval_map] + exact hxroot + have hxrootA : q.eval xA = 0 := by + apply A.subtype_injective + rw [← Polynomial.eval₂_at_apply A.subtype xA] + simpa [xA] using hxrootEval₂ + refine ⟨IsLocalRing.residue A xA, ?_⟩ + rw [← hqmap] + simp [Polynomial.eval_map, hxrootA] + +/-! ## Residues under a purely inseparable ambient extension -/ + +section PurelyInseparableComap + +variable {F Omega : Type u} [Field F] [Field Omega] [Algebra F Omega] + +/-- The inclusion from the pullback of a valuation ring to the ambient +valuation ring. -/ +def valuationSubringComapMap (A : ValuationSubring Omega) : + A.comap (algebraMap F Omega) →+* A where + toFun x := ⟨algebraMap F Omega x, x.property⟩ + map_one' := by ext; simp + map_mul' x y := by ext; simp + map_zero' := by ext; simp + map_add' x y := by ext; simp + +/-- Pullback along a field embedding gives a local map of valuation rings. -/ +theorem valuationSubringComapMap_isLocalHom (A : ValuationSubring Omega) : + IsLocalHom (valuationSubringComapMap (F := F) A) := by + constructor + intro x hx + obtain ⟨u, hu⟩ := hx + have hx0 : (x : F) ≠ 0 := by + intro hzero + have hmapZero : valuationSubringComapMap (F := F) A x = 0 := by + apply Subtype.ext + simp [valuationSubringComapMap, hzero] + exact Units.ne_zero u (hu.trans hmapZero) + let xinv : A.comap (algebraMap F Omega) := + ⟨(x : F)⁻¹, by + change algebraMap F Omega ((x : F)⁻¹) ∈ A + rw [map_inv₀] + have hu' : algebraMap F Omega (x : F) = ((u : A) : Omega) := by + have h := congrArg Subtype.val hu + exact h.symm + rw [hu'] + have hinv : (((u : A) : Omega))⁻¹ = (((u⁻¹ : Aˣ) : A) : Omega) := by + have hprod : + ((u : A) : Omega) * (((u⁻¹ : Aˣ) : A) : Omega) = 1 := by + have hprodA : (u : A) * ((u⁻¹ : Aˣ) : A) = 1 := u.val_inv + exact congrArg A.subtype hprodA + exact (eq_inv_of_mul_eq_one_right hprod).symm + rw [hinv] + exact (u⁻¹ : Aˣ).val.property⟩ + let xu : (A.comap (algebraMap F Omega))ˣ := + { val := x + inv := xinv + val_inv := by apply Subtype.ext; simp [xinv, hx0] + inv_val := by apply Subtype.ext; simp [xinv, hx0] } + exact ⟨xu, rfl⟩ + +/-- The residue-field embedding induced by pullback of a valuation ring. -/ +noncomputable def valuationSubringComapResidueMap + (A : ValuationSubring Omega) : + IsLocalRing.ResidueField (A.comap (algebraMap F Omega)) →+* + IsLocalRing.ResidueField A := by + letI : IsLocalHom (valuationSubringComapMap (F := F) A) := + valuationSubringComapMap_isLocalHom (F := F) A + exact IsLocalRing.ResidueField.map (valuationSubringComapMap (F := F) A) + +/-- States the theorem `valuationSubringComapResidueMap_residue`. -/ +@[simp] theorem valuationSubringComapResidueMap_residue + (A : ValuationSubring Omega) + (x : A.comap (algebraMap F Omega)) : + valuationSubringComapResidueMap (F := F) A + (IsLocalRing.residue (A.comap (algebraMap F Omega)) x) = + IsLocalRing.residue A (valuationSubringComapMap (F := F) A x) := + rfl + +/-- A purely inseparable extension remains purely inseparable after passing +to the residue fields of a valuation ring and its pullback. In positive +characteristic this is the same Frobenius-power argument; in characteristic +zero the ambient purely inseparable extension is already trivial. -/ +theorem valuationSubring_comap_residueField_isPurelyInseparable + [IsPurelyInseparable F Omega] (A : ValuationSubring Omega) : + letI : Algebra + (IsLocalRing.ResidueField (A.comap (algebraMap F Omega))) + (IsLocalRing.ResidueField A) := + (valuationSubringComapResidueMap (F := F) A).toAlgebra + IsPurelyInseparable + (IsLocalRing.ResidueField (A.comap (algebraMap F Omega))) + (IsLocalRing.ResidueField A) := by + let B := A.comap (algebraMap F Omega) + let barI := valuationSubringComapResidueMap (F := F) A + let : Algebra (IsLocalRing.ResidueField B) + (IsLocalRing.ResidueField A) := barI.toAlgebra + obtain ⟨q, hqF⟩ := ExpChar.exists F + let : ExpChar F q := hqF + cases hqF with + | zero => + let : Algebra.IsSeparable F Omega := inferInstance + rw [isPurelyInseparable_iff_pow_mem + (IsLocalRing.ResidueField B) + (ringExpChar (IsLocalRing.ResidueField B))] + intro y + obtain ⟨a, rfl⟩ := IsLocalRing.residue_surjective y + obtain ⟨z, hz⟩ := + IsPurelyInseparable.surjective_algebraMap_of_isSeparable F Omega + (a : Omega) + let zB : B := ⟨z, by + change algebraMap F Omega z ∈ A + rw [hz] + exact a.property⟩ + refine ⟨0, IsLocalRing.residue B zB, ?_⟩ + simp only [pow_zero, pow_one] + change barI (IsLocalRing.residue B zB) = IsLocalRing.residue A a + dsimp only [barI, B] + rw [valuationSubringComapResidueMap_residue] + apply congrArg (IsLocalRing.residue A) + apply Subtype.ext + exact hz + | prime hq => + let : CharP Omega q := + charP_of_injective_algebraMap (algebraMap F Omega).injective q + let : CharP A q := A.subtype.charP A.subtype_injective q + let : CharP (IsLocalRing.ResidueField A) q := + CharP.of_ringHom_of_ne_zero (IsLocalRing.residue A) q hq.ne_zero + let : CharP (IsLocalRing.ResidueField B) q := + barI.charP barI.injective q + let : ExpChar (IsLocalRing.ResidueField B) q := ExpChar.prime hq + rw [isPurelyInseparable_iff_pow_mem + (IsLocalRing.ResidueField B) q] + intro y + obtain ⟨a, rfl⟩ := IsLocalRing.residue_surjective y + obtain ⟨n, z, hz⟩ := IsPurelyInseparable.pow_mem F q (a : Omega) + let zB : B := ⟨z, by + change algebraMap F Omega z ∈ A + rw [hz] + exact pow_mem a.property _⟩ + refine ⟨n, IsLocalRing.residue B zB, ?_⟩ + change barI (IsLocalRing.residue B zB) = + (IsLocalRing.residue A a) ^ q ^ n + dsimp only [barI, B] + rw [valuationSubringComapResidueMap_residue] + rw [← map_pow] + apply congrArg (IsLocalRing.residue A) + apply Subtype.ext + exact hz + +end PurelyInseparableComap + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueDatum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueDatum.lean new file mode 100644 index 0000000000..6b3ffefc2c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueDatum.lean @@ -0,0 +1,125 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicallyClosed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Fields +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.ClosedFixingSubgroup + +/-! # Residue Datum -/ + +@[expose] public section +namespace LocalClassFieldTheory +open RamificationTheory + +open ClassFormation + +/-! +# Finite local reciprocity: the residue datum and its finite indices + +The arithmetic-Frobenius degree on an algebraic closure of a finite field is +packaged as the initial datum of the abstract class-formation framework. For every finite residue +subextension, the image of its fixing subgroup is proved to be exactly +`n ℤ̂`; consequently the abstract residue degree is the ordinary field +degree. This is the finite-coordinate comparison needed in the local-field +specialization. +-/ + +noncomputable +section + +variable (k Omega : Type) + [Field k] [Fintype k] [Field Omega] [Algebra k Omega] + [Algebra.IsAlgebraic k Omega] [IsAlgClosed Omega] + +/-- The abstract class-formation datum supplied by arithmetic Frobenius on the actual +residue algebraic closure. -/ +noncomputable def residueDatumIn : DegreeData (Omega ≃ₐ[k] Omega) where + degree := residueAbsoluteDegreeIn k Omega + degree_surjective := (residueAbsoluteFrobeniusEquivIn k Omega).symm.surjective + +omit [Fintype k] [Algebra.IsAlgebraic k Omega] [IsAlgClosed Omega] in +private theorem mem_fixingSubgroup_iff_restrictNormalHom_eq_one + (E : FiniteGaloisIntermediateField k Omega) + (sigma : Omega ≃ₐ[k] Omega) : + sigma ∈ E.toIntermediateField.fixingSubgroup ↔ + AlgEquiv.restrictNormalHom E sigma = 1 := by + constructor + · intro hsigma + rw [IntermediateField.mem_fixingSubgroup_iff] at hsigma + apply AlgEquiv.ext + intro x + apply Subtype.ext + change ((AlgEquiv.restrictNormalHom E sigma x : E) : Omega) = (x : Omega) + rw [AlgEquiv.restrictNormalHom_apply] + exact hsigma x x.property + · intro hsigma + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + let y : E := ⟨x, hx⟩ + have hy := congrArg (fun tau : E ≃ₐ[k] E => tau y) hsigma + have hyval := congrArg Subtype.val hy + rw [AlgEquiv.restrictNormalHom_apply] at hyval + simpa [y] using hyval + +/-- The degree image of the subgroup fixing a finite residue extension of +degree `n` is exactly `n ℤ̂`. -/ +theorem residueDatumIn_fieldImage_closedFixingSubgroup + (E : FiniteGaloisIntermediateField k Omega) : + (residueDatumIn k Omega).fieldImage + (closedFixingSubgroup k Omega E) = + (zHatMulNat (Module.finrank k E)).toAddMonoidHom.range.toSubgroup := by + ext z + let : Finite E := Module.finite_of_finite k + constructor + · rintro ⟨sigma, rfl⟩ + change (residueAbsoluteDegreeIn k Omega sigma.1).toAdd ∈ + (zHatMulNat (Module.finrank k E)).toAddMonoidHom.range + rw [zHatMulNat_range_eq_ker_reduction + (Module.finrank k E) Module.finrank_pos] + change zHatReduction (Module.finrank k E) Module.finrank_pos + (residueAbsoluteDegreeIn k Omega sigma.1).toAdd = 0 + have hrestrict : AlgEquiv.restrictNormalHom E sigma.1 = 1 := + (mem_fixingSubgroup_iff_restrictNormalHom_eq_one + k Omega E sigma.1).1 sigma.2 + have hcoordinate := + finiteResidueFrobeniusExponentEquiv_symm_restrict_in + k Omega sigma.1 E + rw [hrestrict, map_one] at hcoordinate + exact congrArg Multiplicative.toAdd hcoordinate |>.symm + · intro hz + change z.toAdd ∈ + (zHatMulNat (Module.finrank k E)).toAddMonoidHom.range at hz + rw [zHatMulNat_range_eq_ker_reduction + (Module.finrank k E) Module.finrank_pos] at hz + refine ⟨⟨residueAbsoluteFrobenius k Omega z, ?_⟩, ?_⟩ + · apply (mem_fixingSubgroup_iff_restrictNormalHom_eq_one + k Omega E (residueAbsoluteFrobenius k Omega z)).2 + rw [restrictNormalHom_residueAbsoluteFrobenius] + change finiteResidueFrobeniusFromZHat k E z = 1 + rw [finiteResidueFrobeniusFromZHat_apply] + change finiteResidueFrobeniusExponentHom k E + (Multiplicative.ofAdd + (zHatReduction (Module.finrank k E) Module.finrank_pos z.toAdd)) = 1 + rw [show zHatReduction (Module.finrank k E) Module.finrank_pos z.toAdd = 0 + from hz] + simp + · exact (residueAbsoluteFrobeniusEquivIn k Omega).symm_apply_apply z + +/-- Internal finite-coordinate calculation: the degree image of the fixing +subgroup has natural index equal to the ordinary residue-field degree. Public +residue-degree APIs use `Cardinal` or a finite residue-field bundle. -/ +theorem Internal.residueDatumIn_fieldImage_index_closedFixingSubgroup + (E : FiniteGaloisIntermediateField k Omega) : + ((residueDatumIn k Omega).fieldImage + (closedFixingSubgroup k Omega E)).index = Module.finrank k E := by + rw [residueDatumIn_fieldImage_closedFixingSubgroup k Omega E, + AddSubgroup.index_toSubgroup] + exact zHatMulNat_range_index (Module.finrank k E) Module.finrank_pos + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SemilinearNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SemilinearNaturality.lean new file mode 100644 index 0000000000..cc1fa5a158 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SemilinearNaturality.lean @@ -0,0 +1,360 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.NormRestriction +/-! +# Semilinear naturality of finite local reciprocity + +The actual finite local Artin map is natural when both the base local field +and the finite abelian extension are replaced by compatible field +equivalences. The proof realizes the base equivalence as a degree-one +vertical extension and applies the genuine norm--restriction theorem. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory +open scoped ValuativeRel + +/-- A base-field equivalence preserves the chosen valuations. Keeping the +transported `Algebra` structure behind this opaque predicate prevents every +consumer of semilinear Artin naturality from storing a dependent `letI` in +its public theorem type. -/ +def SemilinearValuationCompatible + (K K' : Type) + [Field K] [ValuativeRel K] + [Field K'] [ValuativeRel K'] + (eK : K ≃+* K') : Prop := + letI : Algebra K K' := eK.toRingHom.toAlgebra + (ValuativeRel.valuation K).HasExtension + (ValuativeRel.valuation K') + +/-- A certificate that an extension-field equivalence restricts to the +specified base-field equivalence. Its generic head is cheap to expose in +public APIs even when the concrete algebra towers are large. -/ +structure SemilinearBaseCompatible + (K K' L L' : Type) + [Field K] [Field K'] [Field L] [Field L'] + [Algebra K L] [Algebra K' L'] + (eK : K ≃+* K') (eL : L ≃+* L') : Prop where + /-- The extension equivalence agrees with the base equivalence. -/ + commutes : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x) + +/-- Conjugation of relative Galois groups by compatible equivalences of the +base and extension fields. Compatibility is semilinear: `eL` restricts to +`eK` on the base field. -/ +noncomputable def semilinearGaloisGroupCongr + (K K' L L' : Type) + [Field K] [Field K'] [Field L] [Field L'] + [Algebra K L] [Algebra K' L'] + (eK : K ≃+* K') (eL : L ≃+* L') + (hcomm : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) : + Gal(L/K) ≃* Gal(L'/K') := by + let conjugate (σ : Gal(L/K)) : + Gal(L'/K') := + AlgEquiv.ofRingEquiv + (f := eL.symm.trans (σ.toRingEquiv.trans eL)) + (fun x => by + change + eL (σ (eL.symm (algebraMap K' L' x))) = + algebraMap K' L' x + have hpre : + eL.symm (algebraMap K' L' x) = + algebraMap K L (eK.symm x) := by + apply eL.injective + rw [eL.apply_symm_apply, hcomm, eK.apply_symm_apply] + rw [hpre, σ.commutes, hcomm, eK.apply_symm_apply]) + let unconjugate (τ : Gal(L'/K')) : + Gal(L/K) := + AlgEquiv.ofRingEquiv + (f := eL.trans (τ.toRingEquiv.trans eL.symm)) + (fun x => by + change + eL.symm (τ (eL (algebraMap K L x))) = + algebraMap K L x + rw [hcomm, τ.commutes, ← hcomm, + eL.symm_apply_apply]) + refine + { toFun := conjugate + invFun := unconjugate + left_inv := ?_ + right_inv := ?_ + map_mul' := ?_ } + · intro σ + apply AlgEquiv.ext + intro x + simp [conjugate, unconjugate] + · intro τ + apply AlgEquiv.ext + intro x + simp [conjugate, unconjugate] + · intro σ τ + apply AlgEquiv.ext + intro x + simp [conjugate, AlgEquiv.mul_apply] + +/-- Semilinear conjugation intertwines the two actions through the target +field equivalence. -/ +@[simp] +theorem semilinearGaloisGroupCongr_apply_equiv + (K K' L L' : Type) + [Field K] [Field K'] [Field L] [Field L'] + [Algebra K L] [Algebra K' L'] + (eK : K ≃+* K') (eL : L ≃+* L') + (hcomm : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) + (σ : Gal(L/K)) (x : L) : + semilinearGaloisGroupCongr K K' L L' eK eL hcomm σ (eL x) = + eL (σ x) := by + change eL (σ (eL.symm (eL x))) = eL (σ x) + rw [eL.symm_apply_apply] + +/-- Evaluate certified semilinear conjugation on an element of the extension +field. -/ +theorem SemilinearBaseCompatible.conjugation_apply + {K K' L L' : Type} + [Field K] [Field K'] [Field L] [Field L'] + [Algebra K L] [Algebra K' L'] + {eK : K ≃+* K'} {eL : L ≃+* L'} + (h : SemilinearBaseCompatible K K' L L' eK eL) + (sigma : Gal(L/K)) (x : L) : + semilinearGaloisGroupCongr + K K' L L' eK eL h.commutes sigma (eL x) = + eL (sigma x) := + semilinearGaloisGroupCongr_apply_equiv + K K' L L' eK eL h.commutes sigma x + +/-- The actual finite abelian local Artin map commutes with simultaneous +semilinear equivalences of the base local field and the target extension. + +The valuation-extension condition says that the local-field valuation on +`K'`, pulled back through `eK`, is the valuation on `K`. It is the genuine +valued-field compatibility needed by norm--restriction, rather than an +assumption of the desired Artin equality. -/ +theorem abelianLocalArtinMonoidHom_semilinear_conjugation + (K K' L L' : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field K'] [ValuativeRel K'] [TopologicalSpace K'] + [IsNonarchimedeanLocalField K'] + [Field L] [Field L'] + [Algebra K L] [Algebra K' L'] + [FiniteDimensional K L] [IsAbelianGalois K L] + [FiniteDimensional K' L'] [IsAbelianGalois K' L'] + (eK : K ≃+* K') (eL : L ≃+* L') + (hcomm : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) + (hExt : SemilinearValuationCompatible K K' eK) : + (semilinearGaloisGroupCongr K K' L L' eK eL hcomm).toMonoidHom.comp + (abelianLocalArtinMonoidHom K L) = + (abelianLocalArtinMonoidHom K' L').comp + (Units.map eK.toMonoidHom) := by + let : Algebra K K' := eK.toRingHom.toAlgebra + change + (ValuativeRel.valuation K).HasExtension + (ValuativeRel.valuation K') at hExt + let : Algebra K L' := + ((algebraMap K' L').comp eK.toRingHom).toAlgebra + let : Algebra L L' := eL.toRingHom.toAlgebra + let : IsScalarTower K K' L' := + IsScalarTower.of_algebraMap_eq' rfl + let : IsScalarTower K L L' := + IsScalarTower.of_algebraMap_eq' (by + apply RingHom.ext + intro x + exact (hcomm x).symm) + let eKAlg : K ≃ₐ[K] K' := + { eK with + commutes' := fun _ => rfl } + let : FiniteDimensional K K' := + FiniteDimensional.of_surjective + eKAlg.toLinearMap eKAlg.surjective + let : Algebra.IsSeparable K K' := + AlgEquiv.Algebra.isSeparable eKAlg + let : + (ValuativeRel.valuation K).HasExtension + (ValuativeRel.valuation K') := + hExt + let conjugation := + semilinearGaloisGroupCongr K K' L L' eK eL hcomm + let restriction : + Gal(L'/K') →* Gal(L/K) := + (AlgEquiv.restrictNormalHom L).comp + (AlgEquiv.restrictScalarsHom K) + have hrestriction (τ : Gal(L'/K')) : + restriction τ = conjugation.symm τ := by + apply AlgEquiv.ext + intro x + apply eL.injective + calc + eL (restriction τ x) = + τ (eL x) := by + exact + AlgEquiv.restrictNormal_commutes + ((AlgEquiv.restrictScalarsHom K) τ) L x + _ = eL (conjugation.symm τ x) := by + simp [conjugation, semilinearGaloisGroupCongr] + have hnorm (a : Kˣ) : + normUnits K K' (Units.map eK.toMonoidHom a) = a := by + apply Units.ext + change Algebra.norm K (eK (a : K)) = (a : K) + have hnorm := + normUnits_mapEquiv + K K K K' + (RingEquiv.refl K) eK + (by + apply RingHom.ext + intro x + rfl) + a + simpa [normUnits_apply_coe, Units.coe_mapEquiv, Algebra.norm_self] using + congrArg Units.val hnorm + have hnaturality := + abelianLocalArtinMonoidHom_norm_restriction K K' L L' + apply MonoidHom.ext + intro a + have hpoint := + DFunLike.congr_fun hnaturality + (Units.map eK.toMonoidHom a) + change + restriction + (abelianLocalArtinMonoidHom K' L' + (Units.map eK.toMonoidHom a)) = + abelianLocalArtinMonoidHom K L + (normUnits K K' (Units.map eK.toMonoidHom a)) at hpoint + rw [hrestriction, hnorm] at hpoint + change + conjugation (abelianLocalArtinMonoidHom K L a) = + abelianLocalArtinMonoidHom K' L' + (Units.map eK.toMonoidHom a) + calc + conjugation (abelianLocalArtinMonoidHom K L a) = + conjugation + (conjugation.symm + (abelianLocalArtinMonoidHom K' L' + (Units.map eK.toMonoidHom a))) := + congrArg conjugation hpoint.symm + _ = + abelianLocalArtinMonoidHom K' L' + (Units.map eK.toMonoidHom a) := + conjugation.apply_symm_apply _ + +/-- Pointwise Galois-automorphism form of semilinear naturality for the +abelian local Artin map. Concrete consumers should use this opaque generic +boundary instead of specializing `DFunLike.congr_fun` to a large dependent +local-field instance tower. -/ +theorem abelianLocalArtinMonoidHom_semilinear_conjugation_apply + (K K' L L' : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field K'] [ValuativeRel K'] [TopologicalSpace K'] + [IsNonarchimedeanLocalField K'] + [Field L] [Field L'] + [Algebra K L] [Algebra K' L'] + [FiniteDimensional K L] [IsAbelianGalois K L] + [FiniteDimensional K' L'] [IsAbelianGalois K' L'] + (eK : K ≃+* K') (eL : L ≃+* L') + (hcomm : ∀ x : K, + eL (algebraMap K L x) = algebraMap K' L' (eK x)) + (hExt : SemilinearValuationCompatible K K' eK) + (u : Kˣ) : + semilinearGaloisGroupCongr K K' L L' eK eL hcomm + (abelianLocalArtinMonoidHom K L u) = + abelianLocalArtinMonoidHom K' L' + (Units.map eK.toMonoidHom u) := + DFunLike.congr_fun + (abelianLocalArtinMonoidHom_semilinear_conjugation + K K' L L' eK eL hcomm hExt) u + +/-- Triviality transports backwards through a semilinear equivalence of local +Artin data. Keeping the injectivity calculation generic prevents concrete +finite-place instance towers from entering consumer proof terms. -/ +theorem abelianLocalArtinMonoidHom_eq_one_of_semilinear + (K K' L L' : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field K'] [ValuativeRel K'] [TopologicalSpace K'] + [IsNonarchimedeanLocalField K'] + [Field L] [Field L'] + [Algebra K L] [Algebra K' L'] + [FiniteDimensional K L] [IsAbelianGalois K L] + [FiniteDimensional K' L'] [IsAbelianGalois K' L'] + (eK : K ≃+* K') (eL : L ≃+* L') + (hcomm : ∀ x : K, + eL (algebraMap K L x) = algebraMap K' L' (eK x)) + (hExt : SemilinearValuationCompatible K K' eK) + (u : Kˣ) + (htrivial : + abelianLocalArtinMonoidHom K' L' + (Units.map eK.toMonoidHom u) = 1) : + abelianLocalArtinMonoidHom K L u = 1 := by + let conjugation := + semilinearGaloisGroupCongr K K' L L' eK eL hcomm + apply conjugation.injective + calc + conjugation (abelianLocalArtinMonoidHom K L u) = + abelianLocalArtinMonoidHom K' L' + (Units.map eK.toMonoidHom u) := + abelianLocalArtinMonoidHom_semilinear_conjugation_apply + K K' L L' eK eL hcomm hExt u + _ = 1 := htrivial + _ = conjugation 1 := (map_one conjugation).symm + +/-- Pointwise form of semilinear naturality for the abelian local Artin map. + +This theorem keeps the equality of Galois automorphisms and its dependent +instance tower behind an opaque generic boundary. Concrete consumers can +transport the action on one element without specializing and then reducing +the full monoid-hom equality. -/ +theorem abelianLocalArtinMonoidHom_semilinear_action + (K K' L L' : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field K'] [ValuativeRel K'] [TopologicalSpace K'] + [IsNonarchimedeanLocalField K'] + [Field L] [Field L'] + [Algebra K L] [Algebra K' L'] + [FiniteDimensional K L] [IsAbelianGalois K L] + [FiniteDimensional K' L'] [IsAbelianGalois K' L'] + (eK : K ≃+* K') (eL : L ≃+* L') + (hcomm : ∀ x : K, + eL (algebraMap K L x) = + algebraMap K' L' (eK x)) + (hExt : SemilinearValuationCompatible K K' eK) + (u : Kˣ) (z : L) : + eL (abelianLocalArtinMonoidHom K L u z) = + abelianLocalArtinMonoidHom K' L' + (Units.map eK.toMonoidHom u) (eL z) := by + have hArtin := + DFunLike.congr_fun + (abelianLocalArtinMonoidHom_semilinear_conjugation + K K' L L' eK eL hcomm hExt) u + calc + eL (abelianLocalArtinMonoidHom K L u z) = + semilinearGaloisGroupCongr + K K' L L' eK eL hcomm + (abelianLocalArtinMonoidHom K L u) (eL z) := + (semilinearGaloisGroupCongr_apply_equiv + K K' L L' eK eL hcomm + (abelianLocalArtinMonoidHom K L u) z).symm + _ = abelianLocalArtinMonoidHom K' L' + (Units.map eK.toMonoidHom u) (eL z) := + congrArg (fun sigma : Gal(L'/K') => sigma (eL z)) hArtin + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean new file mode 100644 index 0000000000..067cd3f896 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean @@ -0,0 +1,284 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.PrimitiveElement +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableNormProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm + +/-! # Separable Fixed Field Norm -/ + +@[expose] public section +namespace LocalClassFieldTheory +open RamificationTheory KummerTheory + +open LocalFieldTheory + +open ClassFormation CyclicCohomology + +/-! +# Finite local reciprocity: norms from arbitrary finite separable fixed fields + +The henselian condition in the abstract class-formation framework quantifies over every finite + abstract +field, not only over normal ones. For an intermediate finite separable field +`E` in a separably closed Galois ambient field, the left cosets of +`Gal(Ω / E)` are canonically the `K`-embeddings `E → Ω`. This file uses that +identification to compare the abstract class-formation coset norm with the ordinary field +norm, without a normality assumption on `E / K`. +-/ + +noncomputable +section + +open scoped BigOperators + +variable (K Ω : Type) [Field K] [Field Ω] [Algebra K Ω] + [IsGalois K Ω] [IsSepClosed Ω] + +section CosetsAndEmbeddings + +variable (E : IntermediateField K Ω) + +/-- Restriction to `E` sends a left coset of `Gal(Ω/E)` to the corresponding +`K`-embedding of `E` into `Ω`. -/ +def baseFixingCosetToAlgHom : + ((closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)).toSubgroup ⧸ + extensionSubgroup + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E)) → + (E →ₐ[K] Ω) := fun q => + Quotient.liftOn' q + (fun σ => σ.1.toAlgHom.comp E.val) + (by + intro σ τ hστ + have hmem : σ⁻¹ * τ ∈ + extensionSubgroup + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) := + QuotientGroup.leftRel_apply.mp hστ + let η : (closedFixingSubgroup K Ω E).toSubgroup := + ⟨(σ⁻¹ * τ).1, hmem⟩ + have hτ : τ = σ * Subgroup.inclusion + (fixingSubgroupLeBase K Ω E) η := by + apply Subtype.ext + change τ.1 = σ.1 * η.1 + simp [η] + apply AlgHom.ext + intro x + have hηfix := + (IntermediateField.mem_fixingSubgroup_iff E η.1).mp η.2 + have hηx : η.1 (x : Ω) = (x : Ω) := hηfix x x.2 + have hτ' := congrArg Subtype.val hτ + change τ.1 = σ.1 * η.1 at hτ' + change σ.1 (x : Ω) = τ.1 (x : Ω) + calc + σ.1 (x : Ω) = σ.1 (η.1 (x : Ω)) := + congrArg σ.1 hηx.symm + _ = (σ.1 * η.1) (x : Ω) := rfl + _ = τ.1 (x : Ω) := by rw [hτ']) + +omit [IsSepClosed Ω] in +/-- States the theorem `baseFixingCosetToAlgHom_mk`. -/ +@[simp] +theorem baseFixingCosetToAlgHom_mk + (σ : (closedFixingSubgroup K Ω + (⊥ : IntermediateField K Ω)).toSubgroup) : + baseFixingCosetToAlgHom K Ω E (QuotientGroup.mk σ) = + σ.1.toAlgHom.comp E.val := + rfl + +private theorem baseFixingCosetToAlgHom_surjective : + Function.Surjective (baseFixingCosetToAlgHom K Ω E) := by + intro f + let : Algebra.IsSeparable E Ω := + Algebra.isSeparable_tower_top_of_isSeparable K E Ω + obtain ⟨φ, hφ⟩ := + (IsSepClosed.surjective_domRestrict_of_isSeparable + (K := K) (L := E) (M := Ω) (E := Ω)) f + let σ : Ω ≃ₐ[K] Ω := + AlgEquiv.ofBijective φ + (Normal.toIsAlgebraic.algHom_bijective₂ + φ (AlgHom.id K Ω)).1 + have hσ : σ ∈ (closedFixingSubgroup K Ω + (⊥ : IntermediateField K Ω)).toSubgroup := by + change σ ∈ (⊥ : IntermediateField K Ω).fixingSubgroup + rw [IntermediateField.fixingSubgroup_bot] + exact Subgroup.mem_top σ + let σbase : (closedFixingSubgroup K Ω + (⊥ : IntermediateField K Ω)).toSubgroup := ⟨σ, hσ⟩ + refine ⟨QuotientGroup.mk σbase, ?_⟩ + apply AlgHom.ext + intro x + have hx := congrArg (fun ψ : E →ₐ[K] Ω => ψ x) hφ + change φ (x : Ω) = f x + change φ (x : Ω) = f x at hx + exact hx + +omit [IsSepClosed Ω] in +private theorem baseFixingCosetToAlgHom_injective : + Function.Injective (baseFixingCosetToAlgHom K Ω E) := by + intro q r hqr + rw [← Quotient.out_eq q, ← Quotient.out_eq r] at hqr ⊢ + apply Quotient.sound' + apply QuotientGroup.leftRel_apply.mpr + apply (mem_extensionSubgroup_iff + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) + ((Quotient.out q)⁻¹ * Quotient.out r)).2 + change (Quotient.out q).1⁻¹ * (Quotient.out r).1 ∈ E.fixingSubgroup + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + let y : E := ⟨x, hx⟩ + have hy := congrArg (fun ψ : E →ₐ[K] Ω => ψ y) hqr + change (Quotient.out q).1 (y : Ω) = + (Quotient.out r).1 (y : Ω) at hy + change (Quotient.out q).1⁻¹ ((Quotient.out r).1 x) = x + rw [← hy] + simp [y] + +/-- Left cosets of the absolute subgroup fixing `E` are the actual +`K`-embeddings of `E` into the separably closed ambient field. -/ +def baseFixingCosetEquivAlgHom : + ((closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)).toSubgroup ⧸ + extensionSubgroup + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E)) ≃ + (E →ₐ[K] Ω) := + Equiv.ofBijective (baseFixingCosetToAlgHom K Ω E) + (by exact ⟨baseFixingCosetToAlgHom_injective K Ω E, + baseFixingCosetToAlgHom_surjective K Ω E⟩) + +/-- Provides the instance `baseFixingExtensionQuotient_finite_of_isSeparable`. -/ +noncomputable instance baseFixingExtensionQuotient_finite_of_isSeparable + [FiniteDimensional K E] [Algebra.IsSeparable K E] : + Finite + ((closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)).toSubgroup ⧸ + extensionSubgroup + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E)) := + (baseFixingCosetEquivAlgHom K Ω E).finite_iff.mpr inferInstance + +end CosetsAndEmbeddings + +section NormAsProduct + +/-- A power basis enumerates the algebra embeddings of a finite separable field extension. -/ +noncomputable local instance finiteSeparableAlgHomFintype + {k F T : Type} [Field k] [Field F] [Field T] + [Algebra k F] [Algebra k T] + [FiniteDimensional k F] [Algebra.IsSeparable k F] : + Fintype (F →ₐ[k] T) := + PowerBasis.AlgHom.fintype (Field.powerBasisOfFiniteOfSeparable k F) + +variable (E : IntermediateField K Ω) + [FiniteDimensional K E] [Algebra.IsSeparable K E] + +omit [IsSepClosed Ω] [FiniteDimensional K E] [Algebra.IsSeparable K E] in +/-- The abstract coset action on an `E`-unit is evaluation under the +corresponding actual `K`-embedding of `E`. -/ +theorem relativeCosetAction_intermediateFieldUnit_val_of_isSeparable + (x : Eˣ) + (q : (closedFixingSubgroup K Ω + (⊥ : IntermediateField K Ω)).toSubgroup ⧸ + extensionSubgroup + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E)) : + ((Additive.toMul + (relativeCosetAction (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) + (intermediateFieldUnitsEquivGaloisFixed K Ω E + (Additive.ofMul x)) q) : Ωˣ) : Ω) = + baseFixingCosetToAlgHom K Ω E q (x : E) := by + refine Quotient.inductionOn' q ?_ + intro σ + rfl + +/-- For every finite separable intermediate field, including a nonnormal +one, the abstract class-formation left-coset norm is the ordinary field norm. -/ +theorem relativeNorm_intermediateFieldUnit_val_of_isSeparable (x : Eˣ) : + ((Additive.toMul + ((relativeNorm (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) + (intermediateFieldUnitsEquivGaloisFixed K Ω E + (Additive.ofMul x))).1 : Additive Ωˣ) : Ωˣ) : Ω) = + algebraMap K Ω (Algebra.norm K (x : E)) := by + let Q := (closedFixingSubgroup K Ω + (⊥ : IntermediateField K Ω)).toSubgroup ⧸ + extensionSubgroup + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) + let := Fintype.ofFinite Q + change + ((Additive.toMul + (relativeNormValue (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) + (intermediateFieldUnitsEquivGaloisFixed K Ω E + (Additive.ofMul x))) : Ωˣ) : Ω) = _ + rw [relativeNormValue] + change + (↑(Additive.toMul (∑ q : Q, + relativeCosetAction (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) + (intermediateFieldUnitsEquivGaloisFixed K Ω E + (Additive.ofMul x)) q) : Ωˣ) : Ω) = _ + change (Units.coeHom Ω) (∏ q : Q, + Additive.toMul + (relativeCosetAction (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) + (intermediateFieldUnitsEquivGaloisFixed K Ω E + (Additive.ofMul x)) q)) = _ + rw [map_prod] + change + (∏ q : Q, + ((Additive.toMul + (relativeCosetAction (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) + (intermediateFieldUnitsEquivGaloisFixed K Ω E + (Additive.ofMul x)) q) : Ωˣ) : Ω)) = _ + calc + _ = ∏ σ : E →ₐ[K] Ω, σ (x : E) := by + exact Fintype.prod_equiv + (baseFixingCosetEquivAlgHom K Ω E) + (fun q : Q => + ((Additive.toMul + (relativeCosetAction (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) + (intermediateFieldUnitsEquivGaloisFixed K Ω E + (Additive.ofMul x)) q) : Ωˣ) : Ω)) + (fun σ : E →ₐ[K] Ω => σ (x : E)) + (relativeCosetAction_intermediateFieldUnit_val_of_isSeparable + K Ω E x) + _ = algebraMap K Ω (Algebra.norm K (x : E)) := + (algebraMap_norm_eq_prod_embeddings_of_isSepClosed + K Ω E (x : E)).symm + +/-- Equivariant form of the nonnormal finite-separable norm comparison. -/ +theorem relativeNorm_intermediateFieldUnit_of_isSeparable (x : Eˣ) : + relativeNorm (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) + (intermediateFieldUnitsEquivGaloisFixed K Ω E + (Additive.ofMul x)) = + baseUnitsEquivGaloisAmbientFixed K Ω + (Additive.ofMul (normUnits K E x)) := by + apply Subtype.ext + apply Additive.ext + apply Units.ext + exact relativeNorm_intermediateFieldUnit_val_of_isSeparable K Ω E x + +end NormAsProduct + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean new file mode 100644 index 0000000000..9e77275ad7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean @@ -0,0 +1,96 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.PrimitiveElement +public import Mathlib.FieldTheory.IsSepClosed +public import Mathlib.RingTheory.Norm.Transitivity +public import Mathlib.RingTheory.AlgebraTower +/-! +# Separable field norms as products of embeddings + +For a finite separable extension, the field norm becomes the product over all +base-field embeddings after mapping into a separably closed ambient field. +The ambient field need not be a normal extension of the base field. +-/ + +@[expose] public section + +noncomputable +section + +open scoped BigOperators + +namespace LocalClassFieldTheory + +/-- The finite type of embeddings used to express a field norm as a product over embeddings. -/ +noncomputable local instance finiteSeparableAlgHomFintypeForNormProduct + {k E T : Type} [Field k] [Field E] [Field T] + [Algebra k E] [Algebra k T] + [FiniteDimensional k E] [Algebra.IsSeparable k E] : + Fintype (E →ₐ[k] T) := + PowerBasis.AlgHom.fintype (Field.powerBasisOfFiniteOfSeparable k E) + +/-- The embeddings of a finite separable tower above a power-basis generator +split into embeddings of the lower field and their extensions. -/ +theorem prod_embeddings_algebraMap_powerBasisGen_eq + (k Ω : Type) [Field k] [Field Ω] [Algebra k Ω] [IsSepClosed Ω] + {L E : Type} [Field L] [Field E] + [Algebra k L] [Algebra k E] [Algebra L E] [IsScalarTower k L E] + [Algebra.IsSeparable k E] [FiniteDimensional k E] + (pb : PowerBasis k L) : + ∏ σ : E →ₐ[k] Ω, σ (algebraMap L E pb.gen) = + ((@Finset.univ (L →ₐ[k] Ω) (PowerBasis.AlgHom.fintype pb)).prod + (fun σ => σ pb.gen)) ^ Module.finrank L E := by + have : FiniteDimensional L E := FiniteDimensional.right k L E + have : Algebra.IsSeparable L E := + Algebra.isSeparable_tower_top_of_isSeparable k L E + let : Fintype (L →ₐ[k] Ω) := PowerBasis.AlgHom.fintype pb + rw [Fintype.prod_equiv algHomEquivSigma + (fun σ : E →ₐ[k] Ω => σ (algebraMap L E pb.gen)) + (fun σ => σ.1 pb.gen)] + · rw [← Finset.univ_sigma_univ, Finset.prod_sigma, ← Finset.prod_pow] + refine Finset.prod_congr rfl fun σ _ => ?_ + let : Algebra L Ω := σ.toRingHom.toAlgebra + simp_rw [Finset.prod_const] + congr + rw [Finset.card_univ, Fintype.card_eq_nat_card] + exact AlgHom.natCard_of_splits L E Ω (fun x => + IsSepClosed.splits_codomain _ (Algebra.IsSeparable.isSeparable L x)) + · intro σ + change σ (algebraMap L E pb.gen) = + (σ.comp (IsScalarTower.toAlgHom k L E)) pb.gen + exact (AlgHom.comp_apply σ (IsScalarTower.toAlgHom k L E) pb.gen).symm + +/-- Mapping the norm of an element of a finite separable extension into a +separably closed field gives the product of all base-field embeddings. -/ +theorem algebraMap_norm_eq_prod_embeddings_of_isSepClosed + (k Ω E : Type) [Field k] [Field Ω] [Field E] + [Algebra k Ω] [IsSepClosed Ω] [Algebra k E] + [FiniteDimensional k E] [Algebra.IsSeparable k E] + (x : E) : + algebraMap k Ω (Algebra.norm k x) = ∏ σ : E →ₐ[k] Ω, σ x := by + have hx := Algebra.IsSeparable.isIntegral k x + let : Algebra.IsSeparable k + (IntermediateField.adjoin k ({x} : Set E)) := + Algebra.isSeparable_tower_bot_of_isSeparable k + (IntermediateField.adjoin k ({x} : Set E)) E + rw [Algebra.norm_eq_norm_adjoin k x, map_pow, + ← IntermediateField.adjoin.powerBasis_gen hx, + Algebra.norm_eq_prod_embeddings_gen Ω + (IntermediateField.adjoin.powerBasis hx) + (IsSepClosed.splits_codomain _ + (Algebra.IsSeparable.isSeparable k + (IntermediateField.adjoin.powerBasis hx).gen))] + · simpa only [IntermediateField.adjoin.powerBasis_gen, + IntermediateField.AdjoinSimple.algebraMap_gen] using + (prod_embeddings_algebraMap_powerBasisGen_eq + (L := IntermediateField.adjoin k ({x} : Set E)) (E := E) + k Ω (IntermediateField.adjoin.powerBasis hx)).symm + · exact Algebra.IsSeparable.isSeparable k _ + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableUnitsNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableUnitsNorm.lean new file mode 100644 index 0000000000..2fcff8d96f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableUnitsNorm.lean @@ -0,0 +1,451 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RingTheory.Norm.Transitivity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.NormImage + +/-! # Separable Units Norm -/ + +@[expose] public section +namespace LocalClassFieldTheory +open RamificationTheory KummerTheory + +open LocalFieldTheory + +open ClassFormation CyclicCohomology + +/-! +# Finite local reciprocity: the abstract norm on separable-closure units + +The coefficient module in local class field theory is the unit group of a +separable closure. This file compares the norm defined in the abstract class-formation framework by + a +sum over abstract Galois cosets with the ordinary field norm. The comparison +is proved first for an arbitrary (possibly infinite) Galois ambient field, so +it does not require the ground field to be perfect. +-/ + +noncomputable +section + +open scoped BigOperators + +variable (K : Type) (Ω : Type) [Field K] [Field Ω] [Algebra K Ω] + [IsGalois K Ω] + +/-- Canonical identification of `Kˣ` with the coefficient group fixed by the +full absolute Galois group. -/ +def baseUnitsEquivGaloisAmbientFixed : + Additive Kˣ ≃+ ambientFixedAddSubgroup + (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) := by + let eBot : Additive Kˣ ≃+ + Additive (⊥ : IntermediateField K Ω)ˣ := + MulEquiv.toAdditive + (Units.mapEquiv (IntermediateField.botEquiv K Ω).symm.toMulEquiv) + exact eBot.trans + (intermediateFieldUnitsEquivGaloisFixed K Ω ⊥) + +/-- States the theorem `baseUnitsEquivGaloisAmbientFixed_val`. -/ +@[simp] +theorem baseUnitsEquivGaloisAmbientFixed_val (x : Kˣ) : + ((Additive.toMul + ((baseUnitsEquivGaloisAmbientFixed K Ω (Additive.ofMul x)).1 : + Additive Ωˣ) : Ωˣ) : Ω) = algebraMap K Ω (x : K) := by + rfl + +section FiniteGaloisIntermediate + +variable (E : IntermediateField K Ω) [FiniteDimensional K E] [IsGalois K E] + +/-- Provides the instance `baseFixingExtensionQuotient_finite`. -/ +noncomputable instance baseFixingExtensionQuotient_finite : + Finite ((closedFixingSubgroup K Ω + (⊥ : IntermediateField K Ω)).toSubgroup ⧸ + extensionSubgroup + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) + (fixingSubgroupLeBase K Ω E)) := + (baseFixingExtensionQuotientEquivGaloisGroup K Ω E).toEquiv.finite_iff.mpr + inferInstance + +omit [FiniteDimensional K E] in +/-- States the theorem `relativeCosetAction_intermediateFieldUnit_val`. -/ +theorem relativeCosetAction_intermediateFieldUnit_val + (x : Eˣ) + (q : (closedFixingSubgroup K Ω + (⊥ : IntermediateField K Ω)).toSubgroup ⧸ + extensionSubgroup + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) + (fixingSubgroupLeBase K Ω E)) : + ((Additive.toMul + (relativeCosetAction (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) + (intermediateFieldUnitsEquivGaloisFixed K Ω E + (Additive.ofMul x)) q) : Ωˣ) : Ω) = + E.val ((baseFixingExtensionQuotientEquivGaloisGroup K Ω E q) (x : E)) := by + refine Quotient.inductionOn' q ?_ + intro σ + rw [relativeCosetAction_mk] + change σ.1 (E.val (x : E)) = + E.val ((baseFixingExtensionQuotientEquivGaloisGroup K Ω E + (QuotientGroup.mk' _ σ)) (x : E)) + have hq : + baseFixingExtensionQuotientEquivAmbient K Ω E + (QuotientGroup.mk' _ σ) = + QuotientGroup.mk' (closedFixingSubgroup K Ω E).toSubgroup σ.1 := by + rfl + have hn := InfiniteGalois.normalAutEquivQuotient_apply + (closedFixingSubgroup K Ω E) σ.1 + change InfiniteGalois.normalAutEquivQuotient (closedFixingSubgroup K Ω E) + (QuotientGroup.mk' _ σ.1) = _ at hn + rw [baseFixingExtensionQuotientEquivGaloisGroup, MulEquiv.trans_apply, hq, + MulEquiv.trans_apply, hn, AlgEquiv.autCongr_apply] + simp only [AlgEquiv.trans_apply, IntermediateField.equivOfEq_symm, + IntermediateField.equivOfEq_apply] + change σ.1 (E.val (x : E)) = + (((AlgEquiv.restrictNormalHom + (IntermediateField.fixedField + (closedFixingSubgroup K Ω E).toSubgroup) σ.1) + ⟨E.val (x : E), _⟩ : IntermediateField.fixedField + (closedFixingSubgroup K Ω E).toSubgroup) : Ω) + rw [AlgEquiv.restrictNormalHom_apply] + +/-- On units coming from a finite Galois intermediate field, the abstract +relative norm is the ordinary field norm. -/ +theorem relativeNorm_intermediateFieldUnit_val (x : Eˣ) : + ((Additive.toMul + ((relativeNorm (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) + (intermediateFieldUnitsEquivGaloisFixed K Ω E + (Additive.ofMul x))).1 : Additive Ωˣ) : Ωˣ) : Ω) = + algebraMap K Ω (Algebra.norm K (x : E)) := by + let Q := (closedFixingSubgroup K Ω + (⊥ : IntermediateField K Ω)).toSubgroup ⧸ + extensionSubgroup + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) + (fixingSubgroupLeBase K Ω E) + let := Fintype.ofFinite Q + change + ((Additive.toMul + (relativeNormValue (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) + (intermediateFieldUnitsEquivGaloisFixed K Ω E + (Additive.ofMul x))) : Ωˣ) : Ω) = _ + rw [relativeNormValue] + let action : Q → Additive Ωˣ := fun q => + relativeCosetAction (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) + (intermediateFieldUnitsEquivGaloisFixed K Ω E + (Additive.ofMul x)) q + change (↑(Additive.toMul (∑ q : Q, action q)) : Ω) = _ + rw [toMul_sum] + change (Units.coeHom Ω) (∏ q : Q, Additive.toMul (action q)) = _ + rw [map_prod] + change + (∏ q : Q, + ((Additive.toMul + (relativeCosetAction (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) + (intermediateFieldUnitsEquivGaloisFixed K Ω E + (Additive.ofMul x)) q) : Ωˣ) : Ω)) = _ + calc + _ = ∏ σ : Gal(E/K), E.val (σ (x : E)) := by + exact Fintype.prod_equiv + (baseFixingExtensionQuotientEquivGaloisGroup K Ω E).toEquiv + (fun q : Q => ((Additive.toMul (action q) : Ωˣ) : Ω)) + (fun σ : Gal(E/K) => E.val (σ (x : E))) + (relativeCosetAction_intermediateFieldUnit_val K Ω E x) + _ = E.val (algebraMap K E (Algebra.norm K (x : E))) := by + rw [Algebra.norm_eq_prod_automorphisms, map_prod] + _ = algebraMap K Ω (Algebra.norm K (x : E)) := rfl + +/-- Equivariant form of the norm comparison, with both fixed coefficient +groups identified with the corresponding field unit groups. -/ +theorem relativeNorm_intermediateFieldUnit (x : Eˣ) : + relativeNorm (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) + (intermediateFieldUnitsEquivGaloisFixed K Ω E + (Additive.ofMul x)) = + baseUnitsEquivGaloisAmbientFixed K Ω + (Additive.ofMul (normUnits K E x)) := by + apply Subtype.ext + apply Additive.ext + apply Units.ext + exact relativeNorm_intermediateFieldUnit_val K Ω E x + +/-- Under the base-field fixed-unit equivalence, the abstract finite norm +subgroup is exactly the ordinary field-norm subgroup. -/ +theorem map_finiteNormSubgroup_eq_additiveNormSubgroup : + (finiteNormSubgroup (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E)).map + (baseUnitsEquivGaloisAmbientFixed K Ω).symm.toAddMonoidHom = + additiveNormSubgroup K E := by + ext y + constructor + · rintro ⟨a, ha, rfl⟩ + rcases ha with ⟨b, rfl⟩ + let u : Eˣ := Additive.toMul + ((intermediateFieldUnitsEquivGaloisFixed K Ω E).symm b) + have hb : + intermediateFieldUnitsEquivGaloisFixed K Ω E + (Additive.ofMul u) = b := by + change intermediateFieldUnitsEquivGaloisFixed K Ω E + ((intermediateFieldUnitsEquivGaloisFixed K Ω E).symm b) = b + exact (intermediateFieldUnitsEquivGaloisFixed K Ω E).apply_symm_apply b + rw [← hb, relativeNorm_intermediateFieldUnit] + change (baseUnitsEquivGaloisAmbientFixed K Ω).symm + (baseUnitsEquivGaloisAmbientFixed K Ω + (Additive.ofMul (normUnits K E u))) ∈ additiveNormSubgroup K E + rw [(baseUnitsEquivGaloisAmbientFixed K Ω).symm_apply_apply] + exact ⟨u, rfl⟩ + · intro hy + change Additive.toMul y ∈ localNormSubgroup K E at hy + rcases hy with ⟨u, hu⟩ + refine ⟨baseUnitsEquivGaloisAmbientFixed K Ω + (Additive.ofMul (normUnits K E u)), ?_, ?_⟩ + · refine ⟨intermediateFieldUnitsEquivGaloisFixed K Ω E + (Additive.ofMul u), ?_⟩ + exact relativeNorm_intermediateFieldUnit K Ω E u + · change (baseUnitsEquivGaloisAmbientFixed K Ω).symm + (baseUnitsEquivGaloisAmbientFixed K Ω + (Additive.ofMul (normUnits K E u))) = y + rw [(baseUnitsEquivGaloisAmbientFixed K Ω).symm_apply_apply] + exact congrArg Additive.ofMul hu + +/-- The abstract finite norm quotient is the actual multiplicative field +norm quotient, written additively for the abstract class-formation API. -/ +def finiteNormQuotientEquivNormQuotient : + FiniteNormQuotient (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) ≃+ + Additive (NormQuotient K E) := by + let S := finiteNormSubgroup (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) + let normAdd : Additive Kˣ →+ Additive (NormQuotient K E) := + MonoidHom.toAdditive (normClass K E) + let T := normAdd.ker + let e := baseUnitsEquivGaloisAmbientFixed K Ω + have hmap : S.map e.symm.toAddMonoidHom = T := by + simpa [S, T, normAdd, e] using + (map_finiteNormSubgroup_eq_additiveNormSubgroup K Ω E).trans + (additiveNormSubgroup_eq_ker_quotient_map K E) + have hforward : S ≤ AddSubgroup.comap e.symm.toAddMonoidHom T := by + intro x hx + change e.symm x ∈ T + rw [← hmap] + exact ⟨x, hx, rfl⟩ + have hinverse : T ≤ AddSubgroup.comap e.toAddMonoidHom S := by + intro y hy + change e y ∈ S + have hy' : y ∈ S.map e.symm.toAddMonoidHom := by + rw [hmap] + exact hy + rcases hy' with ⟨x, hx, hxy⟩ + have heq : e y = x := by + apply e.symm.injective + simpa using hxy.symm + rw [heq] + exact hx + let f : (ambientFixedAddSubgroup (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) ⧸ S) →+ + (Additive Kˣ ⧸ T) := + QuotientAddGroup.map S T e.symm.toAddMonoidHom hforward + let g : (Additive Kˣ ⧸ T) →+ + (ambientFixedAddSubgroup (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) ⧸ S) := + QuotientAddGroup.map T S e.toAddMonoidHom hinverse + let modelEquiv : + (ambientFixedAddSubgroup (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) ⧸ S) ≃+ + (Additive Kˣ ⧸ T) := + { toFun := f + invFun := g + left_inv := by + intro q + refine QuotientAddGroup.induction_on q ?_ + intro x + change ↑(e (e.symm x)) = (↑x : + ambientFixedAddSubgroup (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) ⧸ S) + rw [e.apply_symm_apply] + right_inv := by + intro q + refine QuotientAddGroup.induction_on q ?_ + intro x + change ↑(e.symm (e x)) = (↑x : Additive Kˣ ⧸ T) + rw [e.symm_apply_apply] + map_add' := f.map_add } + let firstIso : (Additive Kˣ ⧸ T) ≃+ Additive (NormQuotient K E) := + QuotientAddGroup.quotientKerEquivOfSurjective normAdd + (QuotientGroup.mk'_surjective (localNormSubgroup K E)) + exact (finiteNormQuotientConcreteEquiv (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E)).trans + (modelEquiv.trans firstIso) + +/-- The fixed-unit comparison carries the canonical finite norm class to the +canonical field norm class. The concrete quotient representation remains +private to the proof of this boundary theorem. -/ +@[simp] +theorem finiteNormQuotientEquivNormQuotient_finiteNormClass + (a : ambientFixedAddSubgroup (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω))) : + finiteNormQuotientEquivNormQuotient K Ω E + (finiteNormClass (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) a) = + (MonoidHom.toAdditive (normClass K E)) + ((baseUnitsEquivGaloisAmbientFixed K Ω).symm a) := by + let S := finiteNormSubgroup (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) + let normAdd : Additive Kˣ →+ Additive (NormQuotient K E) := + MonoidHom.toAdditive (normClass K E) + let T := normAdd.ker + let e := baseUnitsEquivGaloisAmbientFixed K Ω + have hmap : S.map e.symm.toAddMonoidHom = T := by + simpa [S, T, normAdd, e] using + (map_finiteNormSubgroup_eq_additiveNormSubgroup K Ω E).trans + (additiveNormSubgroup_eq_ker_quotient_map K E) + have hforward : S ≤ AddSubgroup.comap e.symm.toAddMonoidHom T := by + intro x hx + change e.symm x ∈ T + rw [← hmap] + exact ⟨x, hx, rfl⟩ + simp only [finiteNormQuotientEquivNormQuotient, + finiteNormQuotientConcreteEquiv_finiteNormClass, + AddEquiv.trans_apply, + QuotientAddGroup.quotientKerEquivOfSurjective, + QuotientAddGroup.quotientKerEquivOfRightInverse] + change QuotientAddGroup.kerLift normAdd + (QuotientAddGroup.map S T e.symm.toAddMonoidHom hforward + (QuotientAddGroup.mk' S a)) = normAdd (e.symm a) + rw [QuotientAddGroup.map_mk', QuotientAddGroup.kerLift_mk] + rfl + +end FiniteGaloisIntermediate + +section EmbeddedFiniteGaloisExtension + +variable (L : Type) [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (i : L →ₐ[K] Ω) + +noncomputable local instance embeddedFieldRangeFiniteDimensional : + FiniteDimensional K (AlgHom.fieldRange i) := + (AlgEquiv.ofInjectiveField i).toLinearEquiv.finiteDimensional + +noncomputable local instance embeddedFieldRangeIsGalois : + IsGalois K (AlgHom.fieldRange i) := + IsGalois.of_algEquiv (AlgEquiv.ofInjectiveField i) + +omit [IsGalois K Ω] [FiniteDimensional K L] [IsGalois K L] in +/-- The field norm is invariant under an algebra equivalence, at unit level. -/ +theorem normUnits_embeddedExtensionAlgEquiv (x : Lˣ) : + normUnits K (AlgHom.fieldRange i) + (Units.mapEquiv (AlgEquiv.ofInjectiveField i).toMulEquiv x) = + normUnits K L x := by + apply Units.ext + exact Algebra.norm_eq_of_algEquiv + (AlgEquiv.ofInjectiveField i) (x : L) + +omit [IsGalois K Ω] [FiniteDimensional K L] [IsGalois K L] in +/-- The ordinary norm subgroups are independent of the chosen realization of +the finite extension inside the ambient Galois extension. -/ +theorem localNormSubgroup_fieldRange_eq : + localNormSubgroup K (AlgHom.fieldRange i) = localNormSubgroup K L := by + ext x + constructor + · rintro ⟨y, rfl⟩ + let z : Lˣ := Units.mapEquiv + (AlgEquiv.ofInjectiveField i).symm.toMulEquiv y + refine ⟨z, ?_⟩ + have hz : Units.mapEquiv + (AlgEquiv.ofInjectiveField i).toMulEquiv z = y := by + exact (Units.mapEquiv + (AlgEquiv.ofInjectiveField i).toMulEquiv).apply_symm_apply y + rw [← hz, normUnits_embeddedExtensionAlgEquiv] + · rintro ⟨x, rfl⟩ + refine ⟨Units.mapEquiv + (AlgEquiv.ofInjectiveField i).toMulEquiv x, ?_⟩ + exact normUnits_embeddedExtensionAlgEquiv K Ω L i x + +/-- The abstract relative norm attached to an embedded finite Galois +extension is the actual field norm on its unit group. -/ +theorem relativeNorm_embeddedExtensionUnit (x : Lˣ) : + relativeNorm (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω (AlgHom.fieldRange i)) + (fixingSubgroupLeBase K Ω (AlgHom.fieldRange i)) + (embeddedFieldUnitsEquivGaloisFixed K Ω L i (Additive.ofMul x)) = + baseUnitsEquivGaloisAmbientFixed K Ω + (Additive.ofMul (normUnits K L x)) := by + let e : L ≃ₐ[K] i.fieldRange := AlgEquiv.ofInjectiveField i + let y : i.fieldRangeˣ := Units.mapEquiv e.toMulEquiv x + exact (relativeNorm_intermediateFieldUnit K Ω i.fieldRange y).trans + (congrArg (fun u : Kˣ => + baseUnitsEquivGaloisAmbientFixed K Ω (Additive.ofMul u)) + (normUnits_embeddedExtensionAlgEquiv K Ω L i x)) + +/-- For an embedded finite Galois extension `L/K`, the finite norm quotient +in the abstract class formation is the actual quotient `Kˣ/N_{L/K}Lˣ`. -/ +def finiteNormQuotientEquivEmbeddedNormQuotient : + FiniteNormQuotient (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω (AlgHom.fieldRange i)) + (fixingSubgroupLeBase K Ω (AlgHom.fieldRange i)) ≃+ + Additive (NormQuotient K L) := + (finiteNormQuotientEquivNormQuotient K Ω (AlgHom.fieldRange i)).trans + (MulEquiv.toAdditive + (normQuotientEquivOfNormSubgroupEq K (AlgHom.fieldRange i) L + (localNormSubgroup_fieldRange_eq K Ω L i))) + +/-- The embedded-extension comparison carries a canonical finite norm class +to the corresponding field norm class, followed by the canonical transport +from the embedded field range to `L`. -/ +@[simp] +theorem finiteNormQuotientEquivEmbeddedNormQuotient_finiteNormClass + (a : ambientFixedAddSubgroup (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω))) : + finiteNormQuotientEquivEmbeddedNormQuotient K Ω L i + (finiteNormClass (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω (AlgHom.fieldRange i)) + (fixingSubgroupLeBase K Ω (AlgHom.fieldRange i)) a) = + (MulEquiv.toAdditive + (normQuotientEquivOfNormSubgroupEq K (AlgHom.fieldRange i) L + (localNormSubgroup_fieldRange_eq K Ω L i))) + ((MonoidHom.toAdditive (normClass K (AlgHom.fieldRange i))) + ((baseUnitsEquivGaloisAmbientFixed K Ω).symm a)) := by + change (MulEquiv.toAdditive + (normQuotientEquivOfNormSubgroupEq K (AlgHom.fieldRange i) L + (localNormSubgroup_fieldRange_eq K Ω L i))) + (finiteNormQuotientEquivNormQuotient K Ω (AlgHom.fieldRange i) + (finiteNormClass (galoisAmbientUnitsRep K Ω) + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω (AlgHom.fieldRange i)) + (fixingSubgroupLeBase K Ω (AlgHom.fieldRange i)) a)) = _ + rw [finiteNormQuotientEquivNormQuotient_finiteNormClass] + +end EmbeddedFiniteGaloisExtension + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TateTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TateTransport.lean new file mode 100644 index 0000000000..c88e83aaed --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TateTransport.lean @@ -0,0 +1,180 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnitCohomologyAxiom + +/-! # Tate Transport -/ + +@[expose] public section +namespace LocalClassFieldTheory + +open ClassFormation + +/-! +# The local class-field-axiom theorem: transport of cyclic Tate complexes + +The fixed-field realization of an abstract extension changes both the +presentation of its cyclic group and the presentation of its coefficient +module. This file records the two honest functorial comparisons needed to +transport the local class-field-axiom theorem: reindexing a representation along a group +isomorphism and replacing a representation by an isomorphic one. +-/ + +noncomputable +section + +open CategoryTheory + +section CyclicGenerator + +variable {Q P : Type} [Group Q] [Group P] + +/-- A generator remains a generator after applying a group isomorphism. -/ +theorem map_cyclicGenerator (e : Q ≃* P) (g : Q) + (hg : ∀ q : Q, q ∈ Subgroup.zpowers g) : + ∀ p : P, p ∈ Subgroup.zpowers (e g) := by + intro p + obtain ⟨n, hn⟩ := Subgroup.mem_zpowers_iff.mp (hg (e.symm p)) + apply Subgroup.mem_zpowers_iff.mpr + refine ⟨n, ?_⟩ + rw [← map_zpow e, hn, e.apply_symm_apply] + +end CyclicGenerator + +section GroupEquiv + +variable {R Q P : Type} [CommRing R] + [CommGroup Q] [CommGroup P] [Fintype Q] [Fintype P] + +private theorem res_norm_eq (e : Q ≃* P) (A : Rep R P) : + let Ares : Rep R Q := + Rep.res e.toMonoidHom A + ModuleCat.ofHom Ares.norm.hom.toLinearMap = + ModuleCat.ofHom A.norm.hom.toLinearMap := by + let Ares : Rep R Q := + Rep.res e.toMonoidHom A + apply congrArg ModuleCat.ofHom + change Representation.norm Ares.ρ = Representation.norm A.ρ + simp only [Representation.norm] + exact Fintype.sum_equiv e.toEquiv + (fun q : Q => Ares.ρ q) + (fun p : P => A.ρ p) (fun _ => rfl) + +/-- Reindexing along a group isomorphism preserves the cyclic `H⁰` +short complex. -/ +def normHomCompSubResEquivIso + (e : Q ≃* P) (A : Rep R P) (g : Q) : + Rep.FiniteCyclicGroup.normHomCompSub + (Rep.res e.toMonoidHom A) g ≅ + Rep.FiniteCyclicGroup.normHomCompSub A (e g) := by + let Ares : Rep R Q := + Rep.res e.toMonoidHom A + let i : ModuleCat.of R Ares.V ≅ ModuleCat.of R A.V := Iso.refl _ + exact ShortComplex.isoMk i i i + (by simpa [Ares, i] using (res_norm_eq e A).symm) (by rfl) + +/-- Reindexing along a group isomorphism preserves the cyclic `H⁻¹` +short complex. -/ +def subCompNormHomResEquivIso + (e : Q ≃* P) (A : Rep R P) (g : Q) : + Rep.FiniteCyclicGroup.subCompNormHom + (Rep.res e.toMonoidHom A) g ≅ + Rep.FiniteCyclicGroup.subCompNormHom A (e g) := by + let Ares : Rep R Q := + Rep.res e.toMonoidHom A + let i : ModuleCat.of R Ares.V ≅ ModuleCat.of R A.V := Iso.refl _ + exact ShortComplex.isoMk i i i + (by rfl) (by simpa [Ares, i] using (res_norm_eq e A).symm) + +/-- Homology-level group-reindexing comparison in degree zero. -/ +def normHomCompSubHomologyResEquivIso + (e : Q ≃* P) (A : Rep R P) (g : Q) : + (Rep.FiniteCyclicGroup.normHomCompSub + (Rep.res e.toMonoidHom A) g).homology ≅ + (Rep.FiniteCyclicGroup.normHomCompSub A (e g)).homology := + ShortComplex.homologyMapIso (normHomCompSubResEquivIso e A g) + +/-- Homology-level group-reindexing comparison in degree minus one. -/ +def subCompNormHomHomologyResEquivIso + (e : Q ≃* P) (A : Rep R P) (g : Q) : + (Rep.FiniteCyclicGroup.subCompNormHom + (Rep.res e.toMonoidHom A) g).homology ≅ + (Rep.FiniteCyclicGroup.subCompNormHom A (e g)).homology := + ShortComplex.homologyMapIso (subCompNormHomResEquivIso e A g) + +end GroupEquiv + +section RepresentationIso + +variable {R Q : Type} [CommRing R] [CommGroup Q] [Fintype Q] + +/-- Isomorphic representations have isomorphic cyclic `H⁰` short +complexes. -/ +def normHomCompSubIsoOfRepIso + {M N : Rep R Q} (e : M ≅ N) (g : Q) : + Rep.FiniteCyclicGroup.normHomCompSub M g ≅ + Rep.FiniteCyclicGroup.normHomCompSub N g := by + let i : ModuleCat.of R M.V ≅ ModuleCat.of R N.V := + (forget₂ (Rep R Q) (ModuleCat R)).mapIso e + refine ShortComplex.isoMk i i i ?_ ?_ + · have h := congrArg + (fun f : M ⟶ N => ModuleCat.ofHom f.hom.toLinearMap) + (Rep.norm_comm e.hom) + simpa [i, Rep.norm] using h + · have hrep : + e.hom ≫ (Rep.applyAsHom N g - 𝟙 N) = + (Rep.applyAsHom M g - 𝟙 M) ≫ e.hom := by + rw [Preadditive.comp_sub, Preadditive.sub_comp, Category.comp_id, + Category.id_comp, Rep.applyAsHom_comm] + let F := forget₂ (Rep R Q) (ModuleCat R) + change F.map e.hom ≫ F.map (Rep.applyAsHom N g - 𝟙 N) = + F.map (Rep.applyAsHom M g - 𝟙 M) ≫ F.map e.hom + rw [← F.map_comp, ← F.map_comp, hrep] + +/-- Isomorphic representations have isomorphic cyclic `H⁻¹` short +complexes. -/ +def subCompNormHomIsoOfRepIso + {M N : Rep R Q} (e : M ≅ N) (g : Q) : + Rep.FiniteCyclicGroup.subCompNormHom M g ≅ + Rep.FiniteCyclicGroup.subCompNormHom N g := by + let i : ModuleCat.of R M.V ≅ ModuleCat.of R N.V := + (forget₂ (Rep R Q) (ModuleCat R)).mapIso e + refine ShortComplex.isoMk i i i ?_ ?_ + · have hrep : + e.hom ≫ (Rep.applyAsHom N g - 𝟙 N) = + (Rep.applyAsHom M g - 𝟙 M) ≫ e.hom := by + rw [Preadditive.comp_sub, Preadditive.sub_comp, Category.comp_id, + Category.id_comp, Rep.applyAsHom_comm] + let F := forget₂ (Rep R Q) (ModuleCat R) + change F.map e.hom ≫ F.map (Rep.applyAsHom N g - 𝟙 N) = + F.map (Rep.applyAsHom M g - 𝟙 M) ≫ F.map e.hom + rw [← F.map_comp, ← F.map_comp, hrep] + · have h := congrArg + (fun f : M ⟶ N => ModuleCat.ofHom f.hom.toLinearMap) + (Rep.norm_comm e.hom) + simpa [i, Rep.norm] using h + +/-- Homology-level representation-isomorphism comparison in degree zero. -/ +def normHomCompSubHomologyIsoOfRepIso + {M N : Rep R Q} (e : M ≅ N) (g : Q) : + (Rep.FiniteCyclicGroup.normHomCompSub M g).homology ≅ + (Rep.FiniteCyclicGroup.normHomCompSub N g).homology := + ShortComplex.homologyMapIso (normHomCompSubIsoOfRepIso e g) + +/-- Homology-level representation-isomorphism comparison in degree +minus one. -/ +def subCompNormHomHomologyIsoOfRepIso + {M N : Rep R Q} (e : M ≅ N) (g : Q) : + (Rep.FiniteCyclicGroup.subCompNormHom M g).homology ≅ + (Rep.FiniteCyclicGroup.subCompNormHom N g).homology := + ShortComplex.homologyMapIso (subCompNormHomIsoOfRepIso e g) + +end RepresentationIso + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean new file mode 100644 index 0000000000..ecd0f1894c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean @@ -0,0 +1,481 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormContinuity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnitTopology +public import Mathlib.FieldTheory.KrullTopology +public import Mathlib.Topology.Algebra.Group.Quotient +public import Mathlib.Topology.Algebra.Group.TopologicalAbelianization +public import Mathlib.Topology.Algebra.Group.Units +public import Mathlib.Topology.Algebra.OpenSubgroup +/-! +# Topological finite local reciprocity + +This module upgrades the algebraic finite local reciprocity isomorphism to a +homeomorphic group isomorphism. The key input is that the norm subgroup of a +finite Galois extension is open. Consequently its quotient is discrete, as +is the topological abelianization of the finite Krull Galois group. +-/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + valuationSubring_isIntegralClosure_of_isIntegral → + valuationSubring_isIntegralClosure_of_isIntegral + + +noncomputable +section + +namespace LocalClassFieldTheory + +open scoped NNReal ValuativeRel +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +/-- The norm quotient inherits its topology from the quotient of the base-field unit group. -/ +noncomputable local instance normQuotientTopologicalSpace + (K L : Type) [Field K] [Field L] [Algebra K L] + [TopologicalSpace K] : + TopologicalSpace (NormQuotient K L) := by + change TopologicalSpace (Kˣ ⧸ localNormSubgroup K L) + infer_instance + +section NormSubgroupTopology + +universe u + +/-- The norm map restricted to valuation-ring units upstairs. -/ +private def integerUnitNormMap + (K L : Type u) [Field K] [Field L] [Algebra K L] + [ValuativeRel L] : 𝒪[L]ˣ →* Kˣ := + (LocalFieldTheory.normUnits K L).comp (integerUnitsToFieldUnits L) + +/-- The image of valuation-ring units under the field norm. -/ +private def integerUnitNormSubgroup + (K L : Type u) [Field K] [Field L] [Algebra K L] + [ValuativeRel L] : Subgroup Kˣ := + MonoidHom.range (integerUnitNormMap K L) + +private theorem integerUnitNormSubgroup_isCompact + (K L : Type u) [NontriviallyNormedField K] [NormedField L] + [NormedAlgebra K L] [FiniteDimensional K L] [CompleteSpace K] + [ValuativeRel L] [CompactSpace 𝒪[L]] : + IsCompact (integerUnitNormSubgroup K L : Set Kˣ) := by + have hcontinuous : Continuous (integerUnitNormMap K L) := + (normUnits_continuous_of_finiteDimensional K L).comp + (integerUnitsToFieldUnits_continuous L) + have hcompact : IsCompact (Set.univ : Set 𝒪[L]ˣ) := isCompact_univ + have himage := hcompact.image hcontinuous + change IsCompact (Set.range (integerUnitNormMap K L)) + simpa only [Set.image_univ] using himage + +private theorem integerUnitNormSubgroup_eq_localNormSubgroup_inf_baseUnits + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [Algebra.IsSeparable K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + integerUnitNormSubgroup K L = + localNormSubgroup K L ⊓ localBaseUnitSubgroup K := by + ext x + constructor + · rintro ⟨a, rfl⟩ + refine ⟨⟨integerUnitsToFieldUnits L a, rfl⟩, ?_⟩ + refine ⟨normIntegerUnits K L a, ?_⟩ + apply Units.ext + rfl + · rintro ⟨⟨y, hy⟩, ⟨a, ha⟩⟩ + have hxv : v K (Additive.ofMul x) = 0 := by + rw [← ha] + exact v_integerUnitsToFieldUnits K a + have hnorm := v_normUnits_eq_residue_finrank_mul_of_isSeparable K L y + change v K (Additive.ofMul (LocalFieldTheory.normUnits K L y)) = + (@Module.finrank 𝓀[K] 𝓀[L] _ _ + (IsLocalRing.ResidueField.instModule (R := 𝒪[K]) (S := 𝒪[L])) : Int) * + v L (Additive.ofMul y) at hnorm + have hproduct : + (@Module.finrank 𝓀[K] 𝓀[L] _ _ + (IsLocalRing.ResidueField.instModule (R := 𝒪[K]) (S := 𝒪[L])) : Int) * + v L (Additive.ofMul y) = 0 := by + rw [← hnorm, hy] + exact hxv + have hfinrank : + (@Module.finrank 𝓀[K] 𝓀[L] _ _ + (IsLocalRing.ResidueField.instModule (R := 𝒪[K]) (S := 𝒪[L])) : Int) ≠ 0 := by + have hnat : + @Module.finrank 𝓀[K] 𝓀[L] _ _ + (IsLocalRing.ResidueField.instModule (R := 𝒪[K]) (S := 𝒪[L])) ≠ 0 := + Nat.ne_of_gt Module.finrank_pos + exact_mod_cast hnat + have hyv : v L (Additive.ofMul y) = 0 := + (mul_eq_zero.mp hproduct).resolve_left hfinrank + have hyvaluation : valuationMap L (Additive.ofMul y) = 0 := by + rw [valuationMap_apply] + exact hyv + obtain ⟨b, hb⟩ := + (integerUnitsToFieldUnits_mem_range_iff_valuationMap_eq_zero L y).2 hyvaluation + refine ⟨b, ?_⟩ + change LocalFieldTheory.normUnits K L (integerUnitsToFieldUnits L b) = x + rw [hb, hy] + +private theorem localNormSubgroup_isOpen_of_compatibleLocalField + (K L : Type) + [NontriviallyNormedField K] [NormedField L] [NormedAlgebra K L] + [CompleteSpace K] + [ValuativeRel K] [IsNonarchimedeanLocalField K] + [ValuativeRel L] [IsNonarchimedeanLocalField L] + [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + IsOpen (localNormSubgroup K L : Set Kˣ) := by + have hintersection : + integerUnitNormSubgroup K L = + localNormSubgroup K L ⊓ localBaseUnitSubgroup K := + integerUnitNormSubgroup_eq_localNormSubgroup_inf_baseUnits K L + have hcompact : IsCompact (integerUnitNormSubgroup K L : Set Kˣ) := + integerUnitNormSubgroup_isCompact K L + have hclosed : IsClosed (integerUnitNormSubgroup K L : Set Kˣ) := + hcompact.isClosed + let : Finite (Gal(L/K)) := by + apply Nat.finite_of_card_ne_zero + rw [IsGalois.card_aut_eq_finrank K L] + exact Nat.ne_of_gt Module.finrank_pos + let : Finite (Abelianization (Gal(L/K))) := + Finite.of_surjective Abelianization.of QuotientGroup.mk_surjective + let : Finite (NormQuotient K L) := + Finite.of_equiv + (Abelianization (Gal(L/K))) + (abelianizationEquivNormQuotient K L).toEquiv + let : Finite (Kˣ ⧸ localNormSubgroup K L) := by + change Finite (NormQuotient K L) + infer_instance + let : (localNormSubgroup K L).FiniteIndex := + Subgroup.finiteIndex_of_finite_quotient + let : ((localNormSubgroup K L).subgroupOf + (localBaseUnitSubgroup K)).FiniteIndex := inferInstance + have hrelativeClosed : + IsClosed + ((localNormSubgroup K L).subgroupOf (localBaseUnitSubgroup K) : + Set (localBaseUnitSubgroup K)) := by + have hpreimage : + IsClosed ((fun z : localBaseUnitSubgroup K => (z : Kˣ)) ⁻¹' + (integerUnitNormSubgroup K L : Set Kˣ)) := + hclosed.preimage continuous_subtype_val + rw [show + ((localNormSubgroup K L).subgroupOf (localBaseUnitSubgroup K) : + Set (localBaseUnitSubgroup K)) = + (fun z : localBaseUnitSubgroup K => (z : Kˣ)) ⁻¹' + (integerUnitNormSubgroup K L : Set Kˣ) by + ext z + change (z : Kˣ) ∈ localNormSubgroup K L ↔ + (z : Kˣ) ∈ integerUnitNormSubgroup K L + rw [hintersection] + constructor + · intro hz + exact ⟨hz, z.property⟩ + · exact fun hz => hz.1] + exact hpreimage + have hrelativeOpen : + IsOpen + ((localNormSubgroup K L).subgroupOf (localBaseUnitSubgroup K) : + Set (localBaseUnitSubgroup K)) := + Subgroup.isOpen_of_isClosed_of_finiteIndex _ hrelativeClosed + have himageOpen : + IsOpen (Subtype.val '' + ((localNormSubgroup K L).subgroupOf (localBaseUnitSubgroup K) : + Set (localBaseUnitSubgroup K))) := + (localBaseUnitSubgroup_isOpen K).isOpenMap_subtype_val _ hrelativeOpen + have himage : + Subtype.val '' + ((localNormSubgroup K L).subgroupOf (localBaseUnitSubgroup K) : + Set (localBaseUnitSubgroup K)) = + (integerUnitNormSubgroup K L : Set Kˣ) := by + ext x + constructor + · rintro ⟨z, hz, rfl⟩ + rw [hintersection] + exact ⟨hz, z.property⟩ + · intro hx + have hx' := hx + rw [hintersection] at hx' + exact ⟨⟨x, hx'.2⟩, hx'.1, rfl⟩ + rw [himage] at himageOpen + apply Subgroup.isOpen_mono + (H₁ := integerUnitNormSubgroup K L) + (H₂ := localNormSubgroup K L) ?_ himageOpen + intro x hx + rw [hintersection] at hx + exact hx.1 + +/-- The norm subgroup of a finite Galois extension of a nonarchimedean local +field is open in the native topology of the base-field unit group. -/ +theorem localNormSubgroup_isOpen + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + IsOpen (localNormSubgroup K L : Set Kˣ) := by + let : UniformSpace K := IsTopologicalAddGroup.rightUniformSpace K + let : IsUniformAddGroup K := isUniformAddGroup_of_addCommGroup + let : (Valued.v : Valuation K + (ValuativeRel.ValueGroupWithZero K)).RankOne := + { hom' := ValuativeRel.IsRankLeOne.nonempty.some.emb (R := K) |>.comp + MonoidWithZeroHom.ValueGroup₀.embedding + strictMono' := ValuativeRel.IsRankLeOne.nonempty.some.strictMono.comp + MonoidWithZeroHom.ValueGroup₀.embedding_strictMono } + let : NontriviallyNormedField K := + Valued.toNontriviallyNormedField + (L := K) (Γ₀ := ValuativeRel.ValueGroupWithZero K) + let : NontriviallyNormedField L := + spectralNorm.nontriviallyNormedField K L + let : NormedAlgebra K L := spectralNorm.normedAlgebra K L + let : CompleteSpace L := spectralNorm.completeSpace K L + let : LocallyCompactSpace L := + LocallyCompactSpace.of_finiteDimensional_of_complete K L + let : IsUltrametricDist L := + ⟨fun x y z => by + change ‖x - z‖ ≤ max ‖x - y‖ ‖y - z‖ + rw [← sub_add_sub_cancel x y z] + exact isNonarchimedean_spectralNorm + (K := K) (L := L) (x - y) (y - z)⟩ + let : Valued L ℝ≥0 := NormedField.toValued + let vL : Valuation L ℝ≥0 := Valued.v + let : vL.IsNontrivial := + (inferInstance : (NormedField.valuation (K := L)).IsNontrivial) + let : ValuativeRel L := ValuativeRel.ofValuation vL + let : vL.Compatible := Valuation.Compatible.ofValuation vL + let : ValuativeRel.IsNontrivial L := + (ValuativeRel.isNontrivial_iff_isNontrivial vL).2 inferInstance + let : IsValuativeTopology L := + isValuativeTopology_of_valued_ofValuation L ℝ≥0 + let : IsNonarchimedeanLocalField L := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + let : (ValuativeRel.valuation K).HasExtension + (ValuativeRel.valuation L) := by + apply Valuation.HasExtension.ofComapInteger + ext x + change ValuativeRel.valuation L (algebraMap K L x) ≤ 1 ↔ + ValuativeRel.valuation K x ≤ 1 + rw [← (ValuativeRel.valuation L).vle_one_iff, vL.vle_one_iff] + change spectralNorm K L (algebraMap K L x) ≤ 1 ↔ + ValuativeRel.valuation K x ≤ 1 + rw [spectralNorm_extends] + exact Valued.toNormedField.norm_le_one_iff + let : Algebra.IsIntegral 𝒪[K] 𝒪[L] := ⟨by + intro y + apply IsIntegral.tower_bot + (R := 𝒪[K]) (A := 𝒪[L]) (B := L) + (Subring.subtype_injective (ValuativeRel.valuation L).integer) + have hyv : vL (y : L) ≤ 1 := by + apply (vL.vle_one_iff).1 + apply ((ValuativeRel.valuation L).vle_one_iff).2 + exact y.property + have hynorm : ‖(y : L)‖ ≤ 1 := by + have hynormNN : ‖(y : L)‖₊ ≤ 1 := by + simpa [vL, NormedField.valuation_apply] using hyv + exact_mod_cast hynormNN + change spectralNorm K L (y : L) ≤ 1 at hynorm + have hcoeffNorm : + ∀ n : ℕ, ‖(minpoly K (y : L)).coeff n‖ ≤ 1 := + (spectralValue_le_one_iff + (minpoly.monic (Algebra.IsIntegral.isIntegral (y : L)))).1 + (by simpa [spectralNorm] using hynorm) + have hcoeff : + (↑(minpoly K (y : L)).coeffs : Set K) ⊆ + (ValuativeRel.valuation K).integer := by + intro c hc + obtain ⟨n, _hn, rfl⟩ := Polynomial.mem_coeffs_iff.mp hc + exact ((ValuativeRel.valuation K).mem_integer_iff _).2 + (Valued.toNormedField.norm_le_one_iff.mp (hcoeffNorm n)) + let p : Polynomial 𝒪[K] := + (minpoly K (y : L)).toSubring + (ValuativeRel.valuation K).integer hcoeff + refine ⟨p, ?_, ?_⟩ + · exact (Polynomial.monic_toSubring + (minpoly K (y : L)) (ValuativeRel.valuation K).integer hcoeff).2 + (minpoly.monic (Algebra.IsIntegral.isIntegral (y : L))) + · have hmaproot : + Polynomial.aeval (y : L) + (p.map (algebraMap 𝒪[K] K)) = 0 := by + dsimp only [p] + rw [show algebraMap 𝒪[K] K = + (ValuativeRel.valuation K).integer.subtype from rfl, + Polynomial.map_toSubring] + exact minpoly.aeval K (y : L) + rwa [Polynomial.aeval_map_algebraMap K (y : L) p] at hmaproot⟩ + let : Algebra.IsIntegral + (ValuativeRel.valuation K).valuationSubring + (ValuativeRel.valuation L).valuationSubring := by + change Algebra.IsIntegral 𝒪[K] 𝒪[L] + infer_instance + let hIntegralClosure : IsIntegralClosure + (ValuativeRel.valuation L).valuationSubring + (ValuativeRel.valuation K).valuationSubring L := + valuationSubring_isIntegralClosure_of_isIntegral + (ValuativeRel.valuation K) (ValuativeRel.valuation L) + let : IsIntegralClosure 𝒪[L] 𝒪[K] L := by + change IsIntegralClosure + (ValuativeRel.valuation L).valuationSubring + (ValuativeRel.valuation K).valuationSubring L + exact hIntegralClosure + exact localNormSubgroup_isOpen_of_compatibleLocalField K L + +/-- The native quotient topology on the finite norm quotient is discrete. -/ +theorem normQuotient_discrete + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + DiscreteTopology (NormQuotient K L) := by + let N := localNormSubgroup K L + change DiscreteTopology (Kˣ ⧸ N) + apply QuotientGroup.discreteTopology + simpa only [N] using localNormSubgroup_isOpen K L + +end NormSubgroupTopology + +section TopologicalReciprocity + +variable (K L : Type) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [FiniteDimensional K L] [IsGalois K L] + +private theorem commutator_topologicalClosure_eq + (G : Type) [Group G] [TopologicalSpace G] [IsTopologicalGroup G] + [DiscreteTopology G] : + Subgroup.topologicalClosure (commutator G) = commutator G := by + apply le_antisymm + · exact Subgroup.topologicalClosure_minimal _ le_rfl (isClosed_discrete _) + · exact Subgroup.le_topologicalClosure _ + +/-- For a finite-dimensional Galois extension, algebraic and topological +abelianization agree as multiplicative groups. -/ +noncomputable def topologicalAbelianizationFiniteEquiv : + Abelianization (Gal(L/K)) ≃* TopologicalAbelianization (Gal(L/K)) := by + exact QuotientGroup.quotientMulEquivOfEq (by + exact (commutator_topologicalClosure_eq (Gal(L/K))).symm) + +/-- Finite local reciprocity as a homeomorphic group isomorphism from the +norm quotient to the topological abelianization of the Krull Galois group. -/ +noncomputable def localReciprocityEquiv : + NormQuotient K L ≃ₜ* TopologicalAbelianization (Gal(L/K)) := by + letI : DiscreteTopology (NormQuotient K L) := normQuotient_discrete K L + letI : DiscreteTopology (TopologicalAbelianization (Gal(L/K))) := + QuotientGroup.discreteTopology (isOpen_discrete _) + let e : NormQuotient K L ≃* TopologicalAbelianization (Gal(L/K)) := + (abelianizationEquivNormQuotient K L).symm.trans + (topologicalAbelianizationFiniteEquiv K L) + exact + { e with + continuous_toFun := continuous_of_discreteTopology + continuous_invFun := continuous_of_discreteTopology } + +/-- The underlying multiplicative equivalence is the algebraic reciprocity +isomorphism followed by the finite abelianization comparison. -/ +theorem localReciprocityEquiv_toMulEquiv : + (localReciprocityEquiv K L).toMulEquiv = + (abelianizationEquivNormQuotient K L).symm.trans + (topologicalAbelianizationFiniteEquiv K L) := by + rfl + +/-- The quotient map to the norm quotient, bundled as a continuous +homomorphism for the native quotient topology. -/ +noncomputable def normClassContinuous : + Kˣ →ₜ* NormQuotient K L := + { normClass K L with + continuous_toFun := QuotientGroup.continuous_mk } + +/-- The continuous finite local Artin map. -/ +noncomputable def localArtinMap : + Kˣ →ₜ* TopologicalAbelianization (Gal(L/K)) := + (ContinuousMonoidHom.toContinuousMonoidHom (localReciprocityEquiv K L)).comp + (normClassContinuous K L) + +/-- Forgetting the topology and comparing finite abelianizations recovers the +algebraic local Artin homomorphism. -/ +theorem localArtinMap_toMonoidHom : + (topologicalAbelianizationFiniteEquiv K L).symm.toMonoidHom.comp + (localArtinMap K L).toMonoidHom = + localArtinMonoidHom K L := by + ext x + change + (topologicalAbelianizationFiniteEquiv K L).symm + (localReciprocityEquiv K L (normClass K L x)) = + (abelianizationEquivNormQuotient K L).symm + (normClass K L x) + rw [show localReciprocityEquiv K L (normClass K L x) = + topologicalAbelianizationFiniteEquiv K L + ((abelianizationEquivNormQuotient K L).symm + (normClass K L x)) by + change (localReciprocityEquiv K L).toMulEquiv + (normClass K L x) = _ + rw [localReciprocityEquiv_toMulEquiv] + rfl] + exact (topologicalAbelianizationFiniteEquiv K L).symm_apply_apply _ + +/-- The continuous local Artin map is canonical: after forgetting topology, +it agrees with the reciprocity symbol computed from any realization of the +extension in the fixed separable closure. -/ +theorem localArtinMap_embedding_independent + (i : L →ₐ[K] SeparableClosure K) : + (topologicalAbelianizationFiniteEquiv K L).symm.toMonoidHom.comp + (localArtinMap K L).toMonoidHom = + concreteNormResidueSymbolOfEmbedding K L i + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) := by + rw [localArtinMap_toMonoidHom, + localArtinMonoidHom_eq_of_embedding K L i] + +/-- The continuous finite local Artin map is surjective. -/ +theorem localArtinMap_surjective : + Function.Surjective (localArtinMap K L) := + (localReciprocityEquiv K L).surjective.comp + (QuotientGroup.mk'_surjective (localNormSubgroup K L)) + +/-- The kernel of the continuous finite local Artin map is the norm +subgroup. -/ +theorem localArtinMap_ker : + (localArtinMap K L).toMonoidHom.ker = localNormSubgroup K L := by + ext x + rw [MonoidHom.mem_ker] + change + localReciprocityEquiv K L (normClass K L x) = 1 ↔ + x ∈ localNormSubgroup K L + rw [← map_one (localReciprocityEquiv K L)] + rw [(localReciprocityEquiv K L).apply_eq_iff_eq] + exact normClass_eq_one_iff_mem K L x + +/-- The canonical first-isomorphism equivalence induced by the continuous +local Artin map. -/ +noncomputable def localArtinMapQuotientKerEquiv : + Kˣ ⧸ (localArtinMap K L).toMonoidHom.ker ≃* + TopologicalAbelianization (Gal(L/K)) := + QuotientGroup.quotientKerEquivOfSurjective + (localArtinMap K L).toMonoidHom (localArtinMap_surjective K L) + +/-- The first-isomorphism equivalence sends the class of a field unit to its +image under the local Artin map. -/ +theorem localArtinMap_quotientKerEquiv_mk (x : Kˣ) : + localArtinMapQuotientKerEquiv K L (QuotientGroup.mk x) = + localArtinMap K L x := by + rfl + +end TopologicalReciprocity + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean new file mode 100644 index 0000000000..a7c1ac0363 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean @@ -0,0 +1,436 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFinrankTransfer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +/-! +# Abstract and concrete unramified Frobenius + +This module compares the residue-degree construction on a fixed separable +closure with the ordinary unramified valuation extension and its arithmetic +Frobenius. +-/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + hasExtension_valuation_of_valuationSubring_pullback → + hasExtension_valuation_of_valuationSubring_pullback + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + exists_integralClosure_standard_fundamental_identity → + exists_integralClosure_standard_fundamental_identity + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + target_valuationSubring_eq_of_finite_separable → + target_valuationSubring_eq_of_finite_separable + + +noncomputable +section + +namespace LocalClassFieldTheory + +open scoped ValuativeRel +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open RamificationTheory.HilbertRamification.ValuationSubring + + +local notation "absoluteGalois" => intrinsicAbsoluteGalois + +local notation "abstractBase" => intrinsicAbstractBase + +/-- The intrinsic finite base field equipped with its local residue datum. -/ +noncomputable def finiteResidueAbstractBase + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + DegreeData.FiniteResidueAbstractField (localResidueDatum K) := + (intrinsicFiniteAbstractBase K).toFiniteResidueAbstractField (localResidueDatum K) + +section BaseResidueDegree + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The intrinsic finite abstract base has residue degree one for the local +datum. -/ +theorem intrinsicFiniteAbstractBase_residueDegree_eq_one : + ((intrinsicFiniteAbstractBase K).residueDegree (localResidueDatum K) : ℕ) = 1 := by + rw [intrinsicFiniteAbstractBase_eq_base, + FiniteAbstractField.base_residueDegree] + rfl + +private theorem finiteResidueAbstractBase_residueDegree_eq_one : + ((finiteResidueAbstractBase K).residueDegree : ℕ) = 1 := by + change ((intrinsicFiniteAbstractBase K).residueDegree (localResidueDatum K) : ℕ) = 1 + exact intrinsicFiniteAbstractBase_residueDegree_eq_one K + +end BaseResidueDegree + +section BaseFrobeniusLift + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The chosen degree-one lift used in the abstract unramified Frobenius. -/ +private noncomputable def abstractBaseFrobeniusLift : + (abstractBase K).toSubgroup := + Classical.choose + ((localResidueDatum K).normalizedDegree_surjective + (finiteResidueAbstractBase K) + (Multiplicative.ofAdd (1 : ZHat))) + +private theorem abstractBaseFrobeniusLift_normalizedDegree : + (localResidueDatum K).normalizedDegree + (finiteResidueAbstractBase K) + (abstractBaseFrobeniusLift K) = + Multiplicative.ofAdd (1 : ZHat) := + Classical.choose_spec + ((localResidueDatum K).normalizedDegree_surjective + (finiteResidueAbstractBase K) + (Multiplicative.ofAdd (1 : ZHat))) + +private theorem abstractBaseFrobeniusLift_degree : + localResidueDegree K (abstractBaseFrobeniusLift K).1 = + Multiplicative.ofAdd (1 : ZHat) := by + apply Multiplicative.ext + have h := + (localResidueDatum K).residueDegree_nsmul_normalizedDegree + (finiteResidueAbstractBase K) + (abstractBaseFrobeniusLift K) + rw [finiteResidueAbstractBase_residueDegree_eq_one K, one_nsmul, + abstractBaseFrobeniusLift_normalizedDegree K] at h + exact h.symm + +/-- A degree-one element of the local absolute Galois group acts by the +arithmetic Frobenius on the selected residue algebraic closure. -/ +private theorem localSeparableResidueAlgAction_eq_frobenius_of_degree_one + (sigma : Gal((SeparableClosure K)/K)) + (hsigma : localResidueDegree K sigma = + Multiplicative.ofAdd (1 : ZHat)) : + localSeparableResidueAlgAction K sigma = + FiniteField.frobeniusAlgEquivOfAlgebraic + (decompositionResidueField K (localSeparableValuationSubring K)) + (selectedResidueField (localSeparableValuationSubring K)) := by + let k := decompositionResidueField K (localSeparableValuationSubring K) + let Omega := selectedResidueField (localSeparableValuationSubring K) + let rho := localSeparableResidueAlgAction K sigma + change residueAbsoluteDegreeIn k Omega rho = + Multiplicative.ofAdd (1 : ZHat) at hsigma + calc + rho = residueAbsoluteFrobenius k Omega + (residueAbsoluteDegreeIn k Omega rho) := + ((residueAbsoluteFrobeniusEquivIn k Omega).apply_symm_apply rho).symm + _ = residueAbsoluteFrobenius k Omega + (Multiplicative.ofAdd (1 : ZHat)) := by rw [hsigma] + _ = FiniteField.frobeniusAlgEquivOfAlgebraic k Omega := + residueAbsoluteFrobenius_one k Omega + +end BaseFrobeniusLift + +section + +variable (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + +private noncomputable instance comparisonIntegerRingIsIntegralClosure : + IsIntegralClosure 𝒪[L] 𝒪[K] L := + localCompleteDVF_integerRing_isIntegralClosure K L + +/-- A finite Galois extension of nonarchimedean local fields has a finite +extension of valuation integer rings. The integral-closure proof is derived +from the chosen valuation extension, rather than exposed as an assumption. -/ +noncomputable instance finiteGaloisLocalField_integerRing_moduleFinite : + Module.Finite 𝒪[K] 𝒪[L] := + localCompleteDVF_integerRing_moduleFinite K L + +variable + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + +variable (i : L →ₐ[K] SeparableClosure K) + +omit [TopologicalSpace L] [IsNonarchimedeanLocalField L] [IsGalois K L] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] in +/-- Pulling the selected extension valuation on `Kˢᵉᵖ` back along a finite +separable embedding gives the given local valuation on the source field. -/ +theorem localSeparableValuationSubring_comap_embedding + [Algebra.IsSeparable K L] : + (localSeparableValuationSubring K).comap i.toRingHom = + (ValuativeRel.valuation L).valuationSubring := by + let A := localSeparableValuationSubring K + let B := A.comap i.toRingHom + let C := (ValuativeRel.valuation L).valuationSubring + have hBext : (localCompleteDVF K).valuation.HasExtension B.valuation := by + apply + hasExtension_valuation_of_valuationSubring_pullback + intro x + change i (algebraMap K L x) ∈ A ↔ + x ∈ (localCompleteDVF K).valuation.valuationSubring + rw [i.commutes] + exact localSeparableValuationSubring_pullback K x + have hCext : (localCompleteDVF K).valuation.HasExtension C.valuation := by + apply + hasExtension_valuation_of_valuationSubring_pullback + intro x + change ValuativeRel.valuation L (algebraMap K L x) ≤ 1 ↔ + (localCompleteDVF K).valuation x ≤ 1 + rw [_root_.Valuation.HasExtension.val_map_le_one_iff + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + rfl + obtain ⟨target, htarget, _hintegral, _hFundamental⟩ := + exists_integralClosure_standard_fundamental_identity + (K := K) (L := L) (localCompleteDVF K) + let : IsScalarTower (localCompleteDVF K).valuationSubring + target.valuationSubring L := + ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_isScalarTower_of_hasExtension + (localCompleteDVF K).valuation target.valuation + have hB : target.valuation.valuationSubring = B := + target_valuationSubring_eq_of_finite_separable + (localCompleteDVF K) target B + have hC : target.valuation.valuationSubring = C := + target_valuationSubring_eq_of_finite_separable + (localCompleteDVF K) target C + exact hB.symm.trans hC + +omit [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] in +/-- Reduction of an embedded finite extension into the selected residue +algebraic closure used by `localResidueDatum`. -/ +noncomputable def finiteGaloisResidueEmbeddingOfEmbedding : + 𝓀[L] →+* + selectedResidueField (localSeparableValuationSubring K) := by + letI : Algebra L (SeparableClosure K) := i.toRingHom.toAlgebra + have h := congrArg ValuationSubring.toSubring + (localSeparableValuationSubring_comap_embedding K L i) + change ((localSeparableValuationSubring K).comap i.toRingHom).toSubring = + (ValuativeRel.valuation L).integer at h + letI : IsLocalRing ((localSeparableValuationSubring K).comap i.toRingHom).toSubring := by + change IsLocalRing ((localSeparableValuationSubring K).comap i.toRingHom) + infer_instance + let e : (ValuativeRel.valuation L).integer ≃+* + ((localSeparableValuationSubring K).comap i.toRingHom).toSubring := + RingEquiv.subringCongr h.symm + exact (valuationSubringComapResidueMap + (F := L) (localSeparableValuationSubring K)).comp + (IsLocalRing.ResidueField.mapEquiv e).toRingHom + +omit [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] in +/-- The residue embedding is reduction of the original field embedding. -/ +@[simp] theorem finiteGaloisResidueEmbeddingOfEmbedding_residue + (x : 𝒪[L]) : + finiteGaloisResidueEmbeddingOfEmbedding K L i + (IsLocalRing.residue 𝒪[L] x) = + IsLocalRing.residue (localSeparableValuationSubring K) + (⟨i (x : L), by + have hx : (x : L) ∈ + (localSeparableValuationSubring K).comap i.toRingHom := by + rw [localSeparableValuationSubring_comap_embedding K L i] + exact x.property + exact hx⟩ : localSeparableValuationSubring K) := by + simp only [finiteGaloisResidueEmbeddingOfEmbedding] + rfl + +omit [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] in +/-- The concrete residue action is the restriction of the selected absolute +residue action along the chosen finite Galois embedding. -/ +theorem finiteGaloisResidueEmbeddingOfEmbedding_equivariant + (τ : (abstractBase K).toSubgroup) (x : 𝓀[L]) : + finiteGaloisResidueEmbeddingOfEmbedding K L i + (galoisGroupResidueAlgEquivOfIsIntegralClosure K L + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i + (QuotientGroup.mk τ)) x) = + localSeparableResidueAlgAction K τ.1 + (finiteGaloisResidueEmbeddingOfEmbedding K L i x) := by + let A := localSeparableValuationSubring K + let σ : Gal(L/K) := + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i + (QuotientGroup.mk τ) + obtain ⟨a, rfl⟩ := IsLocalRing.residue_surjective x + let jO : 𝒪[L] → A := fun y => + ⟨i (y : L), by + have hy : (y : L) ∈ A.comap i.toRingHom := by + rw [localSeparableValuationSubring_comap_embedding K L i] + exact y.property + exact hy⟩ + let σa : 𝒪[L] := + galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ a + let aA : A := jO a + let σaA : A := jO σa + let τD : decompositionGroup K A := + toDecompositionGroupOfEqTop K A + (localSeparableDecompositionGroup_eq_top K) τ.1 + have hσaA : σaA = τD • aA := by + apply Subtype.ext + exact finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding_mk_apply + K L i τ (a : L) + calc + finiteGaloisResidueEmbeddingOfEmbedding K L i + (galoisGroupResidueAlgEquivOfIsIntegralClosure K L σ + (IsLocalRing.residue 𝒪[L] a)) = + finiteGaloisResidueEmbeddingOfEmbedding K L i + (IsLocalRing.residue 𝒪[L] σa) := by + congr 1 + _ = IsLocalRing.residue A σaA := by + simpa only [jO, σaA] using + finiteGaloisResidueEmbeddingOfEmbedding_residue K L i σa + _ = IsLocalRing.residue A (τD • aA) := by rw [hσaA] + _ = localSeparableResidueAlgAction K τ.1 + (IsLocalRing.residue A aA) := by + change IsLocalRing.residue A (τD • aA) = + residueAlgActionOfEqTop K A + (localSeparableDecompositionGroup_eq_top K) τ.1 + (IsLocalRing.residue A aA) + exact (decompositionGroupResidueAction_residue + (K := K) A τD aA).symm + _ = localSeparableResidueAlgAction K τ.1 + (finiteGaloisResidueEmbeddingOfEmbedding K L i + (IsLocalRing.residue 𝒪[L] a)) := by + rw [finiteGaloisResidueEmbeddingOfEmbedding_residue] + +/-! ## Comparison of unramifiedness -/ + +/-- An actually unramified finite Galois extension gives an unramified +extension for the abstract local residue datum. -/ +theorem finiteGaloisAbstractExtensionOfEmbedding_isUnramified : + (finiteGaloisAbstractExtensionOfEmbedding K L i).IsUnramified + (localResidueDatum K) := by + apply ((finiteGaloisAbstractExtensionOfEmbedding K L i).isUnramified_iff_inertia_le + (localResidueDatum K)).2 + intro g hg + let A := localSeparableValuationSubring K + let k := decompositionResidueField K A + let Omega := selectedResidueField A + let τ : (abstractBase K).toSubgroup := ⟨g, hg.1⟩ + let q : Gal(L/K) := + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i + (QuotientGroup.mk τ) + have hdegree : localResidueDegree K g = 1 := hg.2 + have hdegree' : + residueAbsoluteDegreeIn k Omega + (localSeparableResidueAlgAction K g) = 1 := hdegree + have hlocal : + localSeparableResidueAlgAction K g = 1 := by + calc + localSeparableResidueAlgAction K g = + residueAbsoluteFrobenius k Omega + (residueAbsoluteDegreeIn k Omega + (localSeparableResidueAlgAction K g)) := + ((residueAbsoluteFrobeniusEquivIn k Omega).apply_symm_apply + (localSeparableResidueAlgAction K g)).symm + _ = residueAbsoluteFrobenius k Omega 1 := by rw [hdegree'] + _ = 1 := map_one _ + have hresidue : + galoisGroupResidueAlgEquivOfIsIntegralClosure K L q = 1 := by + apply AlgEquiv.ext + intro x + apply (finiteGaloisResidueEmbeddingOfEmbedding K L i).injective + rw [finiteGaloisResidueEmbeddingOfEmbedding_equivariant K L i τ x] + change localSeparableResidueAlgAction K g + (finiteGaloisResidueEmbeddingOfEmbedding K L i x) = + finiteGaloisResidueEmbeddingOfEmbedding K L i x + rw [hlocal] + rfl + have hq : q = 1 := by + apply + galoisGroupResidueAlgEquivHomOfIsIntegralClosure_injective_of_unramifiedValuation + K L + rw [map_one] + exact hresidue + change g ∈ + (finiteGaloisFieldRangeOfEmbedding K L i).fixingSubgroup + rw [IntermediateField.mem_fixingSubgroup_iff] + intro z hz + rcases hz with ⟨x, rfl⟩ + have hrestrict := + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding_mk_apply + K L i τ x + change i (q x) = g (i x) at hrestrict + rw [hq] at hrestrict + exact hrestrict.symm + +/-! ## Frobenius normalization -/ + +section AbstractUnramifiedFrobenius + +omit [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] in +private theorem finiteGaloisResidueBaseExtension_normal : + (extensionSubgroup (finiteResidueAbstractBase K).field + (finiteGaloisAbstractExtensionOfEmbedding K L i).field + (finiteGaloisAbstractExtensionOfEmbedding K L i).below).Normal := + (finiteGaloisAbstractExtensionOfEmbedding K L i).normal + +attribute [local instance] finiteGaloisResidueBaseExtension_normal + +/-- Under the field-facing quotient equivalence, the abstract degree-one +unramified Frobenius is the actual arithmetic Frobenius of the unramified +valuation extension. -/ +theorem finiteGaloisAbstractUnramifiedFrobenius_eq_arithmeticFrobenius : + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i + ((localResidueDatum K).unramifiedFrobenius + (finiteResidueAbstractBase K) + (finiteGaloisAbstractExtensionOfEmbedding K L i).field + (finiteGaloisAbstractExtensionOfEmbedding K L i).below + (hnormal := by exact (finiteGaloisAbstractExtensionOfEmbedding K L i).normal)) = + arithmeticFrobeniusOfUnramifiedValuation K L := by + let phi := abstractBaseFrobeniusLift K + let q : Gal(L/K) := + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i + (QuotientGroup.mk phi) + have hselected : + localSeparableResidueAlgAction K phi.1 = + FiniteField.frobeniusAlgEquivOfAlgebraic + (decompositionResidueField K + (localSeparableValuationSubring K)) + (selectedResidueField + (localSeparableValuationSubring K)) := + localSeparableResidueAlgAction_eq_frobenius_of_degree_one K phi.1 + (abstractBaseFrobeniusLift_degree K) + have hcard : + Nat.card + (decompositionResidueField K + (localSeparableValuationSubring K)) = + Nat.card 𝓀[K] := + (Nat.card_congr + (localBaseResidueEquivDecompositionResidue K).toEquiv).symm + have hresidue : + galoisGroupResidueAlgEquivOfIsIntegralClosure K L q = + galoisGroupResidueAlgEquivOfIsIntegralClosure K L + (arithmeticFrobeniusOfUnramifiedValuation K L) := by + apply AlgEquiv.ext + intro x + apply (finiteGaloisResidueEmbeddingOfEmbedding K L i).injective + rw [finiteGaloisResidueEmbeddingOfEmbedding_equivariant K L i phi x, + hselected] + simp only [FiniteField.coe_frobeniusAlgEquivOfAlgebraic] + rw [galoisGroupResidueAlgEquivOfIsIntegralClosure_arithmeticFrobenius_apply, + map_pow, ← Nat.card_eq_fintype_card, hcard] + have hq : q = arithmeticFrobeniusOfUnramifiedValuation K L := by + apply + galoisGroupResidueAlgEquivHomOfIsIntegralClosure_injective_of_unramifiedValuation + K L + exact hresidue + change q = arithmeticFrobeniusOfUnramifiedValuation K L + exact hq + +end AbstractUnramifiedFrobenius + +end + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormComparison.lean new file mode 100644 index 0000000000..0b70643934 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormComparison.lean @@ -0,0 +1,191 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.SeparableNormValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +/-! +# Norm quotients for unramified local extensions + +For a finite unramified Galois extension, the field-norm subgroup is exactly +the subgroup of elements whose normalized valuation is divisible by the +extension degree. The inclusion is the normalized norm formula; the reverse +inclusion follows from finite local reciprocity because the norm quotient and +the valuation quotient have the same finite cardinality. +-/ + +@[expose] public section + +noncomputable +section + + +namespace LocalClassFieldTheory + +open scoped ValuativeRel +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +variable (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [IsUnramifiedValuedExtension K L] + +/-- Every field norm has normalized valuation divisible by the degree. -/ +theorem localNormSubgroup_le_unramifiedNormSubgroup : + localNormSubgroup K L ≤ + unramifiedNormSubgroup K (Module.finrank K L) := by + intro x hx + obtain ⟨y, rfl⟩ := MonoidHom.mem_range.mp hx + apply (mem_unramifiedNormSubgroup_iff K (Module.finrank K L) _).2 + rw [valuationMap_apply] + change (Module.finrank K L : Int) ∣ + v K (Additive.ofMul + (LocalFieldTheory.normUnits K L y)) + rw [v_normUnits_eq_residue_finrank_mul_of_isGalois K L, + unramifiedValuation_residue_finrank_eq_finrank K L] + exact dvd_mul_right _ _ + +/-- The canonical map from the norm quotient to the valuation quotient. -/ +noncomputable def normQuotientToUnramifiedNormQuotient : + NormQuotient K L →* + Kˣ ⧸ unramifiedNormSubgroup K (Module.finrank K L) := + normQuotientLift + (unramifiedNormClass K (Module.finrank K L)) + (by + intro x hx + rw [MonoidHom.mem_ker] + exact (unramifiedNormClass_eq_one_iff_mem K (Module.finrank K L) x).2 + (localNormSubgroup_le_unramifiedNormSubgroup K L hx)) + +/-- The comparison map sends a norm class to the corresponding unramified valuation class. -/ +@[simp] +theorem normQuotientToUnramifiedNormQuotient_mk (x : Kˣ) : + normQuotientToUnramifiedNormQuotient K L + (normClass K L x) = + unramifiedNormClass K (Module.finrank K L) x := + rfl + +/-- Every unramified valuation class is represented by an actual norm quotient class. -/ +theorem normQuotientToUnramifiedNormQuotient_surjective : + Function.Surjective + (normQuotientToUnramifiedNormQuotient K L) := + normQuotientLift_surjective + (unramifiedNormClass K (Module.finrank K L)) + (by + intro x hx + rw [MonoidHom.mem_ker] + exact (unramifiedNormClass_eq_one_iff_mem K (Module.finrank K L) x).2 + (localNormSubgroup_le_unramifiedNormSubgroup K L hx)) + (unramifiedNormClass_surjective K (Module.finrank K L)) + +/-- Cyclicity identifies the unramified Galois group with its abelianization. -/ +noncomputable def galoisGroupEquivAbelianizationOfUnramifiedValuation : + Gal(L/K) ≃* Abelianization (Gal(L/K)) := by + letI : IsCyclic (Gal(L/K)) := + isCyclic_galoisGroup_of_unramifiedValuation K L + letI : CommGroup (Gal(L/K)) := + IsCyclic.commGroup (α := Gal(L/K)) + exact Abelianization.equivOfComm (H := Gal(L/K)) + +/-- The cyclic Galois-group equivalence is the canonical map to the abelianization. -/ +@[simp] +theorem galoisGroupEquivAbelianizationOfUnramifiedValuation_apply + (σ : Gal(L/K)) : + galoisGroupEquivAbelianizationOfUnramifiedValuation K L σ = + Abelianization.of σ := + rfl + +noncomputable local instance unramifiedNormComparisonNormQuotientFinite : + Finite (NormQuotient K L) := + Finite.of_equiv (Gal(L/K)) + ((galoisGroupEquivAbelianizationOfUnramifiedValuation K L).toEquiv.trans + (abelianizationEquivNormQuotient K L).toEquiv) + +private theorem normQuotient_card_eq_finrank : + Nat.card (NormQuotient K L) = Module.finrank K L := by + let : Finite (Abelianization (Gal(L/K))) := + Finite.of_surjective Abelianization.of QuotientGroup.mk_surjective + calc + Nat.card (NormQuotient K L) = + Nat.card (Abelianization (Gal(L/K))) := + Nat.card_congr (abelianizationEquivNormQuotient K L).symm.toEquiv + _ = Nat.card (Gal(L/K)) := + (Nat.card_congr + (galoisGroupEquivAbelianizationOfUnramifiedValuation K L).toEquiv).symm + _ = Module.finrank K L := + galoisGroup_card_eq_finrank_of_unramifiedValuation K L + +/-- The comparison from the actual norm quotient to the valuation quotient is injective. -/ +theorem normQuotientToUnramifiedNormQuotient_injective : + Function.Injective + (normQuotientToUnramifiedNormQuotient K L) := by + let : NeZero (Module.finrank K L) := ⟨Module.finrank_pos.ne'⟩ + let : Finite (NormQuotient K L) := + Finite.of_equiv (Gal(L/K)) + ((galoisGroupEquivAbelianizationOfUnramifiedValuation K L).trans + (abelianizationEquivNormQuotient K L)).toEquiv + have hcard : + Nat.card (NormQuotient K L) = + Nat.card + (Kˣ ⧸ unramifiedNormSubgroup K (Module.finrank K L)) := by + rw [normQuotient_card_eq_finrank K L] + exact + (unramifiedNormQuotient_card_eq_degree + K (Module.finrank K L)).symm + have hbij : Function.Bijective + (normQuotientToUnramifiedNormQuotient K L) := + (Nat.bijective_iff_surjective_and_card + (normQuotientToUnramifiedNormQuotient K L)).2 + ⟨normQuotientToUnramifiedNormQuotient_surjective K L, + hcard⟩ + exact hbij.1 + +/-- The actual norm subgroup is the valuation-divisibility subgroup. -/ +theorem normSubgroup_eq_unramifiedNormSubgroup_of_isIntegralClosure : + localNormSubgroup K L = + unramifiedNormSubgroup K (Module.finrank K L) := by + apply le_antisymm + · exact localNormSubgroup_le_unramifiedNormSubgroup K L + · intro x hx + apply (normClass_eq_one_iff_mem K L x).1 + apply normQuotientToUnramifiedNormQuotient_injective K L + rw [map_one] + rw [normQuotientToUnramifiedNormQuotient_mk] + exact (unramifiedNormClass_eq_one_iff_mem K (Module.finrank K L) x).2 hx + +/-- The actual unramified norm quotient is the normalized valuation quotient. -/ +noncomputable def normQuotientUnramifiedValuationEquivZModOfIsIntegralClosure : + NormQuotient K L ≃* + Multiplicative (ZMod (Module.finrank K L)) := + (normQuotientEquivOfSubgroupEq K L + (unramifiedNormSubgroup K (Module.finrank K L)) + (normSubgroup_eq_unramifiedNormSubgroup_of_isIntegralClosure K L)).trans + (unramifiedNormQuotientEquivZMod K (Module.finrank K L)) + +/-- The unramified norm-quotient equivalence sends a unit class to its reduced valuation. -/ +@[simp] +theorem normQuotientUnramifiedValuationEquivZModOfIsIntegralClosure_mk + (x : Kˣ) : + normQuotientUnramifiedValuationEquivZModOfIsIntegralClosure K L + (normClass K L x) = + valuationModDegreeMulHom K (Module.finrank K L) x := by + rw [normQuotientUnramifiedValuationEquivZModOfIsIntegralClosure, + MulEquiv.trans_apply, normQuotientEquivOfSubgroupEq_normClass, + unramifiedNormQuotientEquivZMod_mk] + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormalization.lean new file mode 100644 index 0000000000..372b4b4026 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormalization.lean @@ -0,0 +1,602 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.GroupTheory.Abelianization.Defs +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityPrimeNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedReciprocity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +/-! +# Canonical unramified normalization + +The canonical local norm-residue symbol is identified with the field-facing +unramified Artin map. An element of normalized valuation one maps to arithmetic +Frobenius, both algebraically and in the topological abelianization. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open scoped IsMulCommutative ValuativeRel +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation + +private abbrev G (K : Type) [Field K] := + intrinsicAbsoluteGalois K + +private abbrev A (K : Type) [Field K] : Rep ℤ (G K) := + intrinsicAbsoluteUnits K + +private abbrev B (K : Type) [Field K] : ClosedSubgroup (G K) := + intrinsicAbstractBase K + +private def extensionQuotientEquivOfEq + {Γ : Type} [Group Γ] [TopologicalSpace Γ] + {K L K' L' : ClosedSubgroup Γ} + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) + (hK : K = K') (hL : L = L') : + (K.toSubgroup ⧸ extensionSubgroup K L hLK) ≃ + (K'.toSubgroup ⧸ extensionSubgroup K' L' hL'K') := by + subst K' + subst L' + have hp : hLK = hL'K' := Subsingleton.elim _ _ + subst hL'K' + exact Equiv.refl _ + +section BasePrime + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +private theorem localHenselianValuation_valuationAt_baseUnit + (x : Kˣ) : + (((localHenselianValuation K).valuationAt (intrinsicFiniteAbstractBase K) + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + (Additive.ofMul x)) : + (localHenselianValuation K).valueGroup) : ZHat) = + Int.castRingHom ZHat + (LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul x)) := by + let : Finite ((baseField (G K)).toSubgroup ⧸ + extensionSubgroup (baseField (G K)) (B K) (le_baseField (B K))) := + (intrinsicFiniteAbstractBase K).finite + have h := + (localHenselianValuation K).residueDegree_nsmul_dividedAt + (intrinsicFiniteAbstractBase K) + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + (Additive.ofMul x)) + rw [intrinsicFiniteAbstractBase_residueDegree_eq_one K, one_nsmul] at h + rw [(localHenselianValuation K).valuationAt_coe, h] + change localBaseValuation K + (normToBase (A K) (B K) + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + (Additive.ofMul x))) = + Int.castRingHom ZHat + (LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul x)) + let a : ambientFixedAddSubgroup (A K) (baseField (G K)) := + baseFieldUnitsEquiv K (Additive.ofMul x) + have ha : + baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + (Additive.ofMul x) = + fixedFieldInclusion (A K) (baseField (G K)) (B K) + (le_baseField (B K)) a := by + apply Subtype.ext + rfl + rw [ha] + let E : DegreeData.FiniteAbstractExtension (G K) := { + field := B K + base := baseField (G K) + below := le_baseField (B K) + finiteQuotient := inferInstance } + change localBaseValuation K + (relativeNorm (A K) (baseField (G K)) (B K) + (le_baseField (B K)) + (fixedFieldInclusion (A K) (baseField (G K)) (B K) + (le_baseField (B K)) a)) = _ + rw [relativeNorm_fixedFieldInclusion (A K) E] + have hdegree : + (E.degree : ℕ) = 1 := by + rw [← E.relIndex_eq_degree] + change (B K).toSubgroup.relIndex (baseField (G K)).toSubgroup = 1 + rw [show B K = baseField (G K) from + closedFixingSubgroup_bot_eq_baseField K (SeparableClosure K)] + exact Subgroup.relIndex_self (H := (baseField (G K)).toSubgroup) + rw [hdegree, one_nsmul] + exact localBaseValuation_baseFieldUnitsEquiv K (Additive.ofMul x) + +/-- The concrete base-field unit represented by the canonical prime element +of the local henselian valuation. -/ +noncomputable def localAbstractPrimeFieldUnit : Kˣ := + Additive.toMul + ((baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).symm + ((localHenselianValuation K).chosenPrimeElement + (intrinsicFiniteAbstractBase K))) + +/-- The canonical abstract prime has normalized valuation one modulo every +positive integer after transport to the actual local field. -/ +theorem valuationMap_localAbstractPrimeFieldUnit_mod + (n : ℕ) (hn : 0 < n) : + (LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul (localAbstractPrimeFieldUnit K)) : ZMod n) = 1 := by + let v := localHenselianValuation K + let pi : ambientFixedAddSubgroup (A K) (B K) := + v.chosenPrimeElement (intrinsicFiniteAbstractBase K) + have htransport : + baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + (Additive.ofMul (localAbstractPrimeFieldUnit K)) = + pi := by + change + baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + ((baseUnitsEquivGaloisAmbientFixed K + (SeparableClosure K)).symm pi) = pi + exact + (baseUnitsEquivGaloisAmbientFixed K + (SeparableClosure K)).apply_symm_apply pi + have hvalue := + localHenselianValuation_valuationAt_baseUnit K + (localAbstractPrimeFieldUnit K) + rw [htransport, v.valuationAt_chosenPrimeElement] at hvalue + have hvalue := hvalue.symm + change Int.castRingHom ZHat + (LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul (localAbstractPrimeFieldUnit K))) = 1 at hvalue + have hred := congrArg (zHatReduction n hn) hvalue + simpa only [zHatReduction_int, zHatReduction_one] using hred + +end BasePrime + +section UnramifiedPrimeClass + +variable (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + +private noncomputable instance normalizationIntegerRingIsIntegralClosure : + IsIntegralClosure 𝒪[L] 𝒪[K] L := + localCompleteDVF_integerRing_isIntegralClosure K L + +variable + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + +omit [IsUniformAddGroup L] in +/-- In the actual unramified norm quotient, the canonical abstract prime and +the chosen inverse DVR uniformizer define the same normalized generator. -/ +theorem normClass_localAbstractPrimeFieldUnit_eq_uniformizer : + normClass K L (localAbstractPrimeFieldUnit K) = + normClass K L + (inverseIntegerRingUniformizerFieldUnit K) := by + apply + (normQuotientUnramifiedValuationEquivZModOfIsIntegralClosure K L).injective + rw [normQuotientUnramifiedValuationEquivZModOfIsIntegralClosure_mk, + normQuotientUnramifiedValuationEquivZModOfIsIntegralClosure_mk, + valuationModDegreeMulHom_apply, + valuationModDegreeMulHom_apply, + valuationMap_localAbstractPrimeFieldUnit_mod K + (Module.finrank K L) (Module.finrank_pos), + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_apply, + v_inverseIntegerRingUniformizerFieldUnit] + simp + +/-! ## Canonical norm-residue normalization -/ + +omit [IsUniformAddGroup L] in +/-- The canonical norm-residue symbol sends the transported abstract prime to +the arithmetic Frobenius class. -/ +theorem localArtinMonoidHom_localAbstractPrimeFieldUnit : + localArtinMonoidHom K L (localAbstractPrimeFieldUnit K) = + Abelianization.of + (arithmeticFrobeniusOfUnramifiedValuation K L) := by + let i := AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L + let D := localResidueDatum K + let v := localHenselianValuation K + let hcf := separableClosureUnits_isClassFormation K + let E := finiteGaloisAbstractExtensionOfEmbedding K L i + let Kbase := intrinsicFiniteAbstractBase K + let KR := Kbase.toFiniteResidueAbstractField D + let hEfinite : Finite ((B K).toSubgroup ⧸ + extensionSubgroup (B K) E.field E.below) := + E.finite + let hKbaseEfinite : Finite (Kbase.field.toSubgroup ⧸ + extensionSubgroup Kbase.field E.field E.below) := by + exact Finite.of_equiv + ((B K).toSubgroup ⧸ + extensionSubgroup (B K) E.field E.below) + (extensionQuotientEquivOfEq + (K := B K) (L := E.field) + (K' := Kbase.field) (L' := E.field) + E.below E.below rfl rfl) + let hKREfinite : Finite (KR.field.toSubgroup ⧸ + extensionSubgroup KR.field E.field E.below) := by + exact Finite.of_equiv + ((B K).toSubgroup ⧸ + extensionSubgroup (B K) E.field E.below) + (extensionQuotientEquivOfEq + (K := B K) (L := E.field) + (K' := KR.field) (L' := E.field) + E.below E.below rfl rfl) + let sigma := D.chosenUnramifiedFrobeniusLift KR E.field E.below + let q := D.unramifiedFrobenius KR E.field E.below + have hUnramified : E.IsUnramified D := by + simpa only [D, E, B] using + finiteGaloisAbstractExtensionOfEmbedding_isUnramified K L i + let S := D.frobeniusFixedField KR E.field E.below sigma + let hSB := D.frobeniusFixedField_le + KR E.field E.below sigma + let hSBfinite : + Finite ((B K).toSubgroup ⧸ + extensionSubgroup (B K) S hSB) := + D.frobeniusFixedField_finite + KR E.field E.below sigma + let hSabsoluteFinite : + Finite ((baseField (G K)).toSubgroup ⧸ + extensionSubgroup (baseField (G K)) S (le_baseField S)) := + D.frobeniusFixedField_absoluteFinite + Kbase E.field E.below sigma + let Sfinite : FiniteAbstractField (G K) := ⟨S, hSabsoluteFinite⟩ + let pi : ambientFixedAddSubgroup (A K) S := + fixedFieldInclusion (A K) (B K) S hSB + (v.chosenPrimeElement Kbase) + have hpi : v.IsPrimeElement Sfinite pi := by + simpa only [Kbase, KR, sigma, S, hSB, Sfinite, pi] using + v.unramifiedFrobenius_includedPrime_isPrime + Kbase E.field E.below hUnramified + have hnorm : + relativeNorm (A K) (B K) S hSB pi = + v.chosenPrimeElement Kbase := by + simpa only [Kbase, KR, sigma, S, hSB, pi] using + v.unramifiedFrobenius_primeNorm + Kbase E.field E.below hUnramified + let e := baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K) + let xNorm : Kˣ := + Additive.toMul + (e.symm (relativeNorm (A K) (B K) S hSB pi)) + have hxNorm : + e (Additive.ofMul xNorm) = + relativeNorm (A K) (B K) S hSB pi := by + exact e.apply_symm_apply _ + have hsymbol := + concreteNormResidueSymbolOfEmbedding_apply_primeNorm + K L i D v hcf q sigma (by rfl) pi hpi xNorm hxNorm + dsimp only [xNorm] at hsymbol + have hx : + Additive.toMul + (e.symm (relativeNorm (A K) (B K) S hSB pi)) = + localAbstractPrimeFieldUnit K := by + rw [hnorm] + rfl + change + concreteNormResidueSymbolOfEmbedding K L i D v hcf + (Additive.toMul + (e.symm (relativeNorm (A K) (B K) S hSB pi))) = + Abelianization.of + (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i q) + at hsymbol + rw [hx, ← localArtinMonoidHom_eq_of_embedding K L i] at hsymbol + have hq : + finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i q = + arithmeticFrobeniusOfUnramifiedValuation K L := by + rw [← + finiteGaloisAbstractUnramifiedFrobenius_eq_arithmeticFrobenius + K L i] + rfl + rw [hq] at hsymbol + exact hsymbol + +/-! ## Equality with the field-facing unramified reciprocity map -/ + +/-- On an unramified extension, the inverse of the canonical reciprocity +isomorphism is exactly the field-facing Frobenius-normalized isomorphism. -/ +theorem abelianizationEquivNormQuotient_symm_eq_unramifiedLocalReciprocityIso : + (abelianizationEquivNormQuotient K L).symm = + unramifiedLocalReciprocityIso K L := by + let p : NormQuotient K L := + normClass K L (localAbstractPrimeFieldUnit K) + let e := + normQuotientUnramifiedValuationEquivZModOfIsIntegralClosure K L + have hep : + e p = + Multiplicative.ofAdd + (1 : ZMod (Module.finrank K L)) := by + change e + (normClass K L (localAbstractPrimeFieldUnit K)) = _ + rw [normClass_localAbstractPrimeFieldUnit_eq_uniformizer + K L] + rw [normQuotientUnramifiedValuationEquivZModOfIsIntegralClosure_mk, + valuationModDegreeMulHom_apply, + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_apply, + v_inverseIntegerRingUniformizerFieldUnit] + simp + have hpowers (z : NormQuotient K L) : + ∃ m : ℤ, p ^ m = z := by + obtain ⟨m, hm⟩ := ZMod.intCast_surjective (e z).toAdd + refine ⟨m, ?_⟩ + apply e.injective + rw [map_zpow, hep] + rw [← ofAdd_zsmul] + apply Multiplicative.ext + simpa [zsmul_eq_mul] using hm + have hcanonical : + (abelianizationEquivNormQuotient K L).symm p = + Abelianization.of + (arithmeticFrobeniusOfUnramifiedValuation K L) := by + change localArtinMonoidHom K L (localAbstractPrimeFieldUnit K) = _ + exact localArtinMonoidHom_localAbstractPrimeFieldUnit K L + have hactual : + unramifiedLocalReciprocityIso K L p = + Abelianization.of + (arithmeticFrobeniusOfUnramifiedValuation K L) := by + change unramifiedLocalReciprocityIso K L + (normClass K L (localAbstractPrimeFieldUnit K)) = + _ + rw [normClass_localAbstractPrimeFieldUnit_eq_uniformizer + K L] + exact + unramifiedLocalReciprocityIso_inverseIntegerRingUniformizerFieldUnit + K L + apply MulEquiv.ext + intro z + obtain ⟨m, rfl⟩ := hpowers z + rw [map_zpow, map_zpow, hcanonical, hactual] + +/-- The canonical local norm-residue symbol is the field-facing unramified +Artin map. -/ +theorem localArtinMonoidHom_eq_unramifiedLocalArtinMap : + localArtinMonoidHom K L = + unramifiedLocalArtinMap K L := by + apply MonoidHom.ext + intro x + change + (abelianizationEquivNormQuotient K L).symm (normClass K L x) = + unramifiedLocalReciprocityIso K L + (normClass K L x) + rw [abelianizationEquivNormQuotient_symm_eq_unramifiedLocalReciprocityIso K L] + +/-- Frobenius normalization on the chosen inverse prime element. -/ +@[simp] +theorem localArtinMonoidHom_inverseIntegerRingUniformizerFieldUnit : + localArtinMonoidHom K L + (inverseIntegerRingUniformizerFieldUnit K) = + Abelianization.of + (arithmeticFrobeniusOfUnramifiedValuation K L) := by + rw [localArtinMonoidHom_eq_unramifiedLocalArtinMap K L] + change + unramifiedLocalReciprocityIso K L + (normClass K L + (inverseIntegerRingUniformizerFieldUnit K)) = + Abelianization.of + (arithmeticFrobeniusOfUnramifiedValuation K L) + exact + unramifiedLocalReciprocityIso_inverseIntegerRingUniformizerFieldUnit + K L + +/-- Full unramified Artin formula for the canonical local norm-residue symbol. -/ +theorem localArtinMonoidHom_eq_frobenius_zpow (x : Kˣ) : + localArtinMonoidHom K L x = + (Abelianization.of + (arithmeticFrobeniusOfUnramifiedValuation K L)) ^ + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul x) := by + rw [localArtinMonoidHom_eq_unramifiedLocalArtinMap K L] + exact unramifiedLocalArtinMap_eq_frobenius_zpow K L x + +/-! ## Continuous Frobenius normalization -/ + +/-- The continuous local Artin map sends every field unit to the topological +class of arithmetic Frobenius raised to its normalized valuation. -/ +theorem localArtinMap_eq_frobenius_zpow (x : Kˣ) : + localArtinMap K L x = + (topologicalAbelianizationFiniteEquiv K L + (Abelianization.of + (arithmeticFrobeniusOfUnramifiedValuation K L))) ^ + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul x) := by + apply (topologicalAbelianizationFiniteEquiv K L).symm.injective + rw [map_zpow, + (topologicalAbelianizationFiniteEquiv K L).symm_apply_apply] + change + (((topologicalAbelianizationFiniteEquiv K L).symm.toMonoidHom.comp + (localArtinMap K L).toMonoidHom) x) = + (Abelianization.of + (arithmeticFrobeniusOfUnramifiedValuation K L)) ^ + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul x) + rw [localArtinMap_toMonoidHom, + localArtinMonoidHom_eq_frobenius_zpow] + +omit [IsUniformAddGroup L] in +/-- The transported canonical abstract prime maps to arithmetic Frobenius in +the topological abelianization. -/ +@[simp] +theorem localArtinMap_localAbstractPrimeFieldUnit : + localArtinMap K L (localAbstractPrimeFieldUnit K) = + topologicalAbelianizationFiniteEquiv K L + (Abelianization.of + (arithmeticFrobeniusOfUnramifiedValuation K L)) := by + apply (topologicalAbelianizationFiniteEquiv K L).symm.injective + rw [(topologicalAbelianizationFiniteEquiv K L).symm_apply_apply] + change + (((topologicalAbelianizationFiniteEquiv K L).symm.toMonoidHom.comp + (localArtinMap K L).toMonoidHom) (localAbstractPrimeFieldUnit K)) = + Abelianization.of + (arithmeticFrobeniusOfUnramifiedValuation K L) + rw [localArtinMap_toMonoidHom] + exact localArtinMonoidHom_localAbstractPrimeFieldUnit K L + +/-- A chosen inverse DVR uniformizer maps to arithmetic Frobenius. -/ +@[simp] +theorem localArtinMap_uniformizer : + localArtinMap K L (inverseIntegerRingUniformizerFieldUnit K) = + topologicalAbelianizationFiniteEquiv K L + (Abelianization.of + (arithmeticFrobeniusOfUnramifiedValuation K L)) := by + rw [localArtinMap_eq_frobenius_zpow, + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_apply, + v_inverseIntegerRingUniformizerFieldUnit, zpow_one] + +/-- Elements of normalized valuation zero lie in the kernel of the +unramified local Artin map. -/ +theorem localArtinMap_eq_one_of_valuationMap_eq_zero + (x : Kˣ) + (hx : LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul x) = 0) : + localArtinMap K L x = 1 := by + rw [localArtinMap_eq_frobenius_zpow, hx, zpow_zero] + +/-- Every valuation-ring unit has trivial unramified Artin symbol. -/ +@[simp] +theorem localArtinMap_units_unramified (u : 𝒪[K]ˣ) : + localArtinMap K L (LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits K u) + = 1 := by + apply localArtinMap_eq_one_of_valuationMap_eq_zero K L + rw [LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_apply, + LocalFieldTheory.IsNonarchimedeanLocalField.v_integerUnitsToFieldUnits] + +end UnramifiedPrimeClass + +section AbelianUnramifiedPrimeClass + +variable (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsAbelianGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + +/-- The canonical local Artin map for an abelian unramified extension sends +each field unit to actual arithmetic Frobenius raised to its normalized valuation. -/ +theorem abelianLocalArtinMonoidHom_eq_frobenius_zpow (x : Kˣ) : + abelianLocalArtinMonoidHom K L x = + (arithmeticFrobeniusOfUnramifiedValuation K L) ^ + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul x) := by + simp only [abelianLocalArtinMonoidHom, MonoidHom.coe_comp, + Function.comp_apply] + rw [localArtinMonoidHom_eq_frobenius_zpow K L x, map_zpow] + exact + congrArg + (fun σ : Gal(L/K) => + σ ^ LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul x)) + ((Abelianization.equivOfComm (H := Gal(L/K))).symm_apply_apply + (arithmeticFrobeniusOfUnramifiedValuation K L)) + +end AbelianUnramifiedPrimeClass + +end LocalClassFieldTheory + +namespace ClassFieldTheory + +open scoped ValuativeRel + +/-- The canonical Artin map of an abelian unramified local extension is +arithmetic Frobenius raised to the normalized valuation. -/ +theorem finiteAbelianLocalArtinMap_eq_frobenius_zpow + (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsAbelianGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (x : Kˣ) : + LocalClassFieldTheory.abelianLocalArtinMap K L x = + (LocalFieldTheory.arithmeticFrobeniusOfUnramifiedValuation K L) ^ + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul x) := by + calc + LocalClassFieldTheory.abelianLocalArtinMap K L x = + LocalClassFieldTheory.abelianLocalArtinMonoidHom K L x := + DFunLike.congr_fun + (LocalClassFieldTheory.abelianLocalArtinMap_toMonoidHom K L) x + _ = _ := + LocalClassFieldTheory.abelianLocalArtinMonoidHom_eq_frobenius_zpow K L x + +/-- Every element of normalized valuation one maps to arithmetic Frobenius; +there is no further choice of an Artin map at this finite level. -/ +theorem finiteAbelianLocalArtinMap_uniformizer + (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsAbelianGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (π : Kˣ) + (hπ : LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul π) = 1) : + LocalClassFieldTheory.abelianLocalArtinMap K L π = + LocalFieldTheory.arithmeticFrobeniusOfUnramifiedValuation K L := by + rw [finiteAbelianLocalArtinMap_eq_frobenius_zpow K L π, hπ, zpow_one] + +/-- At an inverse uniformizer, the normalized local Artin automorphism acts +on the residue field by the arithmetic `q`-power Frobenius. This states the +normalization through the reduction of integral elements, without exposing +the implementation's chosen residue-field automorphism in the conclusion. -/ +theorem finiteAbelianLocalArtinMap_inverseUniformizer_residue_pow + (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsAbelianGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (π : Kˣ) + (hπ : LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul π) = 1) + (x : 𝒪[L]) : + ∃ z : 𝒪[L], + (z : L) = (LocalClassFieldTheory.abelianLocalArtinMap K L π) (x : L) ∧ + IsLocalRing.residue 𝒪[L] z = + (IsLocalRing.residue 𝒪[L] x) ^ Nat.card 𝓀[K] := by + let σ : Gal(L/K) := LocalClassFieldTheory.abelianLocalArtinMap K L π + let z : 𝒪[L] := + LocalFieldTheory.galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ x + refine ⟨z, ?_, ?_⟩ + · exact + LocalFieldTheory.galoisGroupIntegerRingEquivOfIsIntegralClosure_apply + K L σ x + · have hres := + (LocalFieldTheory.galoisGroupResidueFieldEquivOfIsIntegralClosure_residue + K L σ x).symm + change + IsLocalRing.residue 𝒪[L] z = + LocalFieldTheory.galoisGroupResidueAlgEquivOfIsIntegralClosure K L σ + (IsLocalRing.residue 𝒪[L] x) at hres + rw [show σ = + LocalFieldTheory.arithmeticFrobeniusOfUnramifiedValuation K L from + finiteAbelianLocalArtinMap_uniformizer K L π hπ] at hres + exact hres.trans + (LocalFieldTheory.galoisGroupResidueAlgEquivOfIsIntegralClosure_arithmeticFrobenius_apply + K L (IsLocalRing.residue 𝒪[L] x)) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedReciprocity.lean new file mode 100644 index 0000000000..1cca3aea97 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedReciprocity.lean @@ -0,0 +1,247 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +/-! +# Unramified reciprocity + +For a finite unramified Galois extension, this module composes the actual norm +quotient with its normalized valuation model, the generator-normalized +Frobenius model of the Galois group, and the canonical equivalence with the +abelianization of that cyclic group. +-/ + +@[expose] public section +noncomputable +section + +namespace LocalClassFieldTheory + +open scoped ValuativeRel +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +/-- The actual unramified local reciprocity equivalence with target `GaloisGroup`. +The norm-subgroup equality and the Frobenius/ZMod normalization are generated +internally from the preceding source lemmas, not passed as hypotheses. -/ +noncomputable def unramifiedLocalReciprocityIsoToGaloisGroup + (K L : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [UniformSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [IsUnramifiedValuedExtension K L] : + NormQuotient K L ≃* Gal(L/K) := + (normQuotientUnramifiedValuationEquivZModOfIsIntegralClosure K L).trans + (galoisGroupEquivZModOfUnramifiedValuationNormalized K L).symm + +/-- The chosen inverse prime element +maps to the arithmetic Frobenius under the actual reciprocity equivalence. -/ +@[simp] +theorem unramifiedLocalReciprocityIsoToGaloisGroup_inverseIntegerRingUniformizerFieldUnit + (K L : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [UniformSpace L] [IsUniformAddGroup L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [IsUnramifiedValuedExtension K L] : + unramifiedLocalReciprocityIsoToGaloisGroup K L + (normClass K L (inverseIntegerRingUniformizerFieldUnit K)) = + arithmeticFrobeniusOfUnramifiedValuation K L := by + unfold unramifiedLocalReciprocityIsoToGaloisGroup + change (galoisGroupEquivZModOfUnramifiedValuationNormalized K L).symm + (normQuotientUnramifiedValuationEquivZModOfIsIntegralClosure K L + (normClass K L (inverseIntegerRingUniformizerFieldUnit K))) = + arithmeticFrobeniusOfUnramifiedValuation K L + rw [normQuotientUnramifiedValuationEquivZModOfIsIntegralClosure_mk] + rw [LocalClassFieldTheory.valuationModDegreeMulHom_apply, + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_apply, + v_inverseIntegerRingUniformizerFieldUnit] + simp only [Int.cast_one] + rw [← galoisGroupEquivZModOfUnramifiedValuationNormalized_arithmeticFrobenius K L] + exact (galoisGroupEquivZModOfUnramifiedValuationNormalized K L).symm_apply_apply _ + +/-- Power form of the unramified reciprocity calculation for the chosen inverse +prime element. -/ +theorem unramifiedLocalReciprocityIsoToGaloisGroup_inverseIntegerRingUniformizerFieldUnit_zpow + (K L : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [UniformSpace L] [IsUniformAddGroup L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [IsUnramifiedValuedExtension K L] (m : Int) : + unramifiedLocalReciprocityIsoToGaloisGroup K L + ((normClass K L (inverseIntegerRingUniformizerFieldUnit K)) ^ m) = + (arithmeticFrobeniusOfUnramifiedValuation K L) ^ m := by + rw [map_zpow, + unramifiedLocalReciprocityIsoToGaloisGroup_inverseIntegerRingUniformizerFieldUnit] + +/-- The actual reciprocity equivalence to +`GaloisGroup` sends any field unit class to the corresponding power of arithmetic +Frobenius, with exponent its normalized valuation. -/ +theorem unramifiedLocalReciprocityIsoToGaloisGroup_normClass + (K L : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [UniformSpace L] [IsUniformAddGroup L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [IsUnramifiedValuedExtension K L] (x : Kˣ) : + unramifiedLocalReciprocityIsoToGaloisGroup K L (normClass K L x) = + (arithmeticFrobeniusOfUnramifiedValuation K L) ^ + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul x) := by + unfold unramifiedLocalReciprocityIsoToGaloisGroup + change (galoisGroupEquivZModOfUnramifiedValuationNormalized K L).symm + (normQuotientUnramifiedValuationEquivZModOfIsIntegralClosure K L + (normClass K L x)) = + (arithmeticFrobeniusOfUnramifiedValuation K L) ^ + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul x) + rw [normQuotientUnramifiedValuationEquivZModOfIsIntegralClosure_mk] + rw [LocalClassFieldTheory.valuationModDegreeMulHom_apply] + rw [← galoisGroupEquivZModOfUnramifiedValuationNormalized_arithmeticFrobenius_zpow K L + (LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul x))] + exact (galoisGroupEquivZModOfUnramifiedValuationNormalized K L).symm_apply_apply _ + +/-- The actual unramified local reciprocity equivalence with abelianized target. +It composes the valuation quotient and normalized Frobenius model, then +passes to the abelianization of the +cyclic Galois group. -/ +noncomputable def unramifiedLocalReciprocityIso + (K L : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [UniformSpace L] [IsUniformAddGroup L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [IsUnramifiedValuedExtension K L] : + NormQuotient K L ≃* Abelianization (Gal(L/K)) := + (unramifiedLocalReciprocityIsoToGaloisGroup K L).trans + (galoisGroupEquivAbelianizationOfUnramifiedValuation K L) + +/-- With abelianized target, the chosen +inverse prime element maps to the class of the arithmetic Frobenius. -/ +@[simp] +theorem unramifiedLocalReciprocityIso_inverseIntegerRingUniformizerFieldUnit + (K L : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [UniformSpace L] [IsUniformAddGroup L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [IsUnramifiedValuedExtension K L] : + unramifiedLocalReciprocityIso K L + (normClass K L (inverseIntegerRingUniformizerFieldUnit K)) = + Abelianization.of (arithmeticFrobeniusOfUnramifiedValuation K L) := by + unfold unramifiedLocalReciprocityIso + change galoisGroupEquivAbelianizationOfUnramifiedValuation K L + (unramifiedLocalReciprocityIsoToGaloisGroup K L + (normClass K L (inverseIntegerRingUniformizerFieldUnit K))) = + Abelianization.of (arithmeticFrobeniusOfUnramifiedValuation K L) + rw [unramifiedLocalReciprocityIsoToGaloisGroup_inverseIntegerRingUniformizerFieldUnit] + rfl + +/-- Power form of the unramified reciprocity calculation with abelianized +target. -/ +theorem unramifiedLocalReciprocityIso_inverseIntegerRingUniformizerFieldUnit_zpow + (K L : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [UniformSpace L] [IsUniformAddGroup L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [IsUnramifiedValuedExtension K L] (m : Int) : + unramifiedLocalReciprocityIso K L + ((normClass K L (inverseIntegerRingUniformizerFieldUnit K)) ^ m) = + (Abelianization.of (arithmeticFrobeniusOfUnramifiedValuation K L)) ^ m := by + rw [map_zpow, + unramifiedLocalReciprocityIso_inverseIntegerRingUniformizerFieldUnit] + +/-- The unramified reciprocity map +on a general field unit is the arithmetic Frobenius class raised to the +normalized valuation. -/ +theorem unramifiedLocalReciprocityIso_normClass + (K L : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [UniformSpace L] [IsUniformAddGroup L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [IsUnramifiedValuedExtension K L] (x : Kˣ) : + unramifiedLocalReciprocityIso K L (normClass K L x) = + (Abelianization.of (arithmeticFrobeniusOfUnramifiedValuation K L)) ^ + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul x) := by + unfold unramifiedLocalReciprocityIso + change galoisGroupEquivAbelianizationOfUnramifiedValuation K L + (unramifiedLocalReciprocityIsoToGaloisGroup K L (normClass K L x)) = + (Abelianization.of (arithmeticFrobeniusOfUnramifiedValuation K L)) ^ + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul x) + rw [unramifiedLocalReciprocityIsoToGaloisGroup_normClass] + rw [galoisGroupEquivAbelianizationOfUnramifiedValuation_apply] + rw [map_zpow] + +/-- The actual unramified Artin map induced by the certificate-free +reciprocity equivalence. This avoids introducing `LocalReciprocityDataReal` +as an assumption package. -/ +noncomputable def unramifiedLocalArtinMap + (K L : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [UniformSpace L] [IsUniformAddGroup L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [IsUnramifiedValuedExtension K L] : + Kˣ →* Abelianization (Gal(L/K)) := + (unramifiedLocalReciprocityIso K L).toMonoidHom.comp (normClass K L) + +/-- States the theorem `unramifiedLocalArtinMap_apply`. -/ +@[simp] +theorem unramifiedLocalArtinMap_apply + (K L : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [UniformSpace L] [IsUniformAddGroup L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [IsUnramifiedValuedExtension K L] (x : Kˣ) : + unramifiedLocalArtinMap K L x = + unramifiedLocalReciprocityIso K L (normClass K L x) := + rfl + +/-- In the arithmetic-Frobenius convention, +the actual local Artin map sends `x` to the arithmetic Frobenius class raised +to `v_K(x)`. -/ +theorem unramifiedLocalArtinMap_eq_frobenius_zpow + (K L : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [UniformSpace L] [IsUniformAddGroup L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [IsUnramifiedValuedExtension K L] (x : Kˣ) : + unramifiedLocalArtinMap K L x = + (Abelianization.of (arithmeticFrobeniusOfUnramifiedValuation K L)) ^ + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul x) := by + rw [unramifiedLocalArtinMap_apply, + unramifiedLocalReciprocityIso_normClass] + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean new file mode 100644 index 0000000000..1faf99361b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean @@ -0,0 +1,115 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified +/-! +# Uniqueness of arithmetic Frobenius from its residue action + +For an unramified finite abelian extension, the arithmetic `q`-power action +on residues determines the Galois automorphism uniquely. The canonical local +Artin map takes an inverse uniformizer to this automorphism. +-/ + +@[expose] public section + +open scoped ValuativeRel + +noncomputable +section + +namespace ClassFieldTheory + +variable (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsAbelianGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + +private noncomputable instance : IsIntegralClosure 𝒪[L] 𝒪[K] L := + LocalFieldTheory.localCompleteDVF_integerRing_isIntegralClosure K L + +private noncomputable instance : Module.Finite 𝒪[K] 𝒪[L] := + LocalFieldTheory.localCompleteDVF_integerRing_moduleFinite K L + +open _root_.LocalFieldTheory + (galoisGroupResidueAlgEquivHomOfIsIntegralClosure_injective_of_unramifiedValuation) in +/-- The residue `q`-power action characterizes the canonical local Artin +image of an inverse uniformizer in an unramified finite abelian extension. -/ +theorem finiteAbelianLocalArtinMap_inverseUniformizer_residue_pow_iff + (π : 𝒪[K]) + (hπ : (ValuativeRel.valuation K).IsUniformizer (π : K)) + (σ : L ≃ₐ[K] L) : + (∀ x : 𝒪[L], + ∃ z : 𝒪[L], + (z : L) = σ (x : L) ∧ + IsLocalRing.residue 𝒪[L] z = + (IsLocalRing.residue 𝒪[L] x) ^ Nat.card 𝓀[K]) ↔ + σ = LocalClassFieldTheory.abelianLocalArtinMap K L + ((Units.mk0 (π : K) hπ.ne_zero)⁻¹) := by + let u : Kˣ := (Units.mk0 (π : K) hπ.ne_zero)⁻¹ + have hvalUnit : + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul (Units.mk0 (π : K) hπ.ne_zero)) = -1 := + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_uniformizerFieldUnit + K π hπ + have hval : + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul u) = 1 := by + calc + _ = -LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul (Units.mk0 (π : K) hπ.ne_zero)) := by + change + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (-(Additive.ofMul (Units.mk0 (π : K) hπ.ne_zero))) = _ + exact + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_neg + K (Additive.ofMul (Units.mk0 (π : K) hπ.ne_zero)) + _ = 1 := by rw [hvalUnit]; norm_num + have hArtin (x : 𝒪[L]) := + finiteAbelianLocalArtinMap_inverseUniformizer_residue_pow K L u hval x + constructor + · intro hσ + apply + galoisGroupResidueAlgEquivHomOfIsIntegralClosure_injective_of_unramifiedValuation + K L + apply AlgEquiv.ext + intro y + obtain ⟨x, rfl⟩ := IsLocalRing.residue_surjective y + obtain ⟨zσ, hzσ, hresσ⟩ := hσ x + obtain ⟨za, hza, hresa⟩ := hArtin x + have hzσ' : + LocalFieldTheory.galoisGroupIntegerRingEquivOfIsIntegralClosure + K L σ x = zσ := by + apply Subtype.ext + exact (LocalFieldTheory.galoisGroupIntegerRingEquivOfIsIntegralClosure_apply + K L σ x).trans hzσ.symm + have hza' : + LocalFieldTheory.galoisGroupIntegerRingEquivOfIsIntegralClosure + K L (LocalClassFieldTheory.abelianLocalArtinMap K L u) x = za := by + apply Subtype.ext + exact (LocalFieldTheory.galoisGroupIntegerRingEquivOfIsIntegralClosure_apply + K L (LocalClassFieldTheory.abelianLocalArtinMap K L u) x).trans hza.symm + change IsLocalRing.residue 𝒪[L] + (LocalFieldTheory.galoisGroupIntegerRingEquivOfIsIntegralClosure + K L σ x) = + IsLocalRing.residue 𝒪[L] + (LocalFieldTheory.galoisGroupIntegerRingEquivOfIsIntegralClosure + K L (LocalClassFieldTheory.abelianLocalArtinMap K L u) x) + rw [hzσ', hza'] + exact hresσ.trans hresa.symm + · intro hσ + subst σ + exact hArtin + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ValuationSemilinear.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ValuationSemilinear.lean new file mode 100644 index 0000000000..3b9fe228a4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ValuationSemilinear.lean @@ -0,0 +1,58 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SemilinearNaturality +/-! +# The selected separable valuation under a semilinear equivalence + +The base valuation certificate supplies the pullback on base elements. +Henselian uniqueness then identifies the selected valuation rings on the +separable closures; no equality of the extension valuations is assumed. +-/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + hasExtension_valuation_of_valuationSubring_pullback → + hasExtension_valuation_of_valuationSubring_pullback + + +noncomputable +section + +namespace ClassFieldTower.Martinet.Shafarevich + +open LocalClassFieldTheory LocalFieldTheory + +/-- Valuation-compatible base and closure equivalences preserve the selected +valuation subrings used to define local residue degree. -/ +theorem localSeparableValuationSubring_comap_semilinear + (K K' : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field K'] [ValuativeRel K'] [TopologicalSpace K'] [IsNonarchimedeanLocalField K'] + (c : K ≃+* K') (e : SeparableClosure K ≃+* SeparableClosure K') + (he : ∀ x : K, e (algebraMap K (SeparableClosure K) x) = + algebraMap K' (SeparableClosure K') (c x)) + (hc : SemilinearValuationCompatible K K' c) : + localSeparableValuationSubring K = + (localSeparableValuationSubring K').comap e.toRingHom := by + let _ : Algebra K K' := c.toRingHom.toAlgebra + let _ : (ValuativeRel.valuation K).HasExtension (ValuativeRel.valuation K') := hc + let B := (localSeparableValuationSubring K').comap e.toRingHom + let _ : (localCompleteDVF K).valuation.HasExtension B.valuation := by + apply + hasExtension_valuation_of_valuationSubring_pullback + intro x + change e (algebraMap K (SeparableClosure K) x) ∈ localSeparableValuationSubring K' ↔ + x ∈ (localCompleteDVF K).valuation.valuationSubring + rw [he, localSeparableValuationSubring_pullback] + exact Valuation.HasExtension.val_map_le_one_iff + (ValuativeRel.valuation K) (ValuativeRel.valuation K') x + exact localSeparableValuationSubring_eq_of_hasExtension K B + +end ClassFieldTower.Martinet.Shafarevich diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified.lean new file mode 100644 index 0000000000..2804d014a1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Cohomology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Norm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.ResidueNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Uniformizer + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/All.lean new file mode 100644 index 0000000000..e91c35f978 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/All.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Cohomology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Norm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.ResidueNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Uniformizer +/-! Provides the public declarations in the `LocalClassFieldTheory.Finite.Unramified` Lean + module. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean new file mode 100644 index 0000000000..acf6ac5b18 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean @@ -0,0 +1,452 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientTower +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.IntegerUnitsHerbrand +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisCohomology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Norm +/-! +# Tate cohomology of units in unramified extensions + +For an unramified extension of local fields the actual low-degree Tate +cohomology of the integer units and of every principal-unit group is trivial. +The norm statements are the corresponding actual norm surjections. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace LocalClassFieldTheory + +open scoped ValuativeRel +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField +open CyclicCohomology +open CyclicCohomology.ProfiniteCohomology.Herbrand + +/-- The actual integral-closure Galois action on `U_L^n`, packaged as the +multiplicative action used by low-degree Tate cohomology. -/ +@[implicit_reducible] +def galoisGroupPrincipalUnitsMulDistribMulActionOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (n : Nat) : + MulDistribMulAction Gal(L/K) (principalUnits L n) where + smul sigma a := galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure K L n sigma a + one_smul := by + intro a + change galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure K L n 1 a = a + exact congrArg (fun e : principalUnits L n ≃* principalUnits L n => e a) + (map_one (galoisGroupPrincipalUnitsMapEquivHomOfIsIntegralClosure K L n)) + mul_smul := by + intro sigma tau a + change galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure K L n (sigma * tau) a = + galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure K L n sigma + (galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure K L n tau a) + exact congrArg (fun e : principalUnits L n ≃* principalUnits L n => e a) + (map_mul (galoisGroupPrincipalUnitsMapEquivHomOfIsIntegralClosure K L n) sigma tau) + smul_mul := by + intro sigma a b + exact map_mul (galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure K L n sigma) a b + smul_one := by + intro sigma + exact map_one (galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure K L n sigma) + +/-- States the theorem `galoisGroupPrincipalUnitsMulDistribMulActionOfIsIntegralClosure_smul`. -/ +@[simp] +theorem galoisGroupPrincipalUnitsMulDistribMulActionOfIsIntegralClosure_smul + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (n : Nat) + (sigma : Gal(L/K)) (a : principalUnits L n) : + letI := galoisGroupPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n + sigma • a = galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure K L n sigma a := + rfl + +/-- Inclusion in the actual short exact sequence +`1 → U_L^n → 𝒪_Lˣ → 𝒪_Lˣ/U_L^n → 1`. -/ +private def principalUnitsIntegerUnitsInclusion + (L : Type u) [Field L] [ValuativeRel L] (n : Nat) : + principalUnits L n →* 𝒪[L]ˣ := + (principalUnits L n).subtype + +/-- Quotient map in the actual short exact sequence +`1 → U_L^n → 𝒪_Lˣ → 𝒪_Lˣ/U_L^n → 1`. -/ +private def integerUnitsPrincipalUnitsQuotientMap + (L : Type u) [Field L] [ValuativeRel L] (n : Nat) : + 𝒪[L]ˣ →* IntegerUnitsModPrincipalUnitsAtLevel L n := + integerUnitsModPrincipalUnitsAtLevelMk L n + +/-- The standard principal-unit sequence is short exact and equivariant for +the actual integral-closure Galois actions. -/ +private theorem principalUnitsIntegerUnits_shortExact + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (n : Nat) : + letI := galoisGroupPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n + (∀ (sigma : Gal(L/K)) (a : principalUnits L n), + principalUnitsIntegerUnitsInclusion L n (sigma • a) = + sigma • principalUnitsIntegerUnitsInclusion L n a) ∧ + (∀ (sigma : Gal(L/K)) (a : 𝒪[L]ˣ), + integerUnitsPrincipalUnitsQuotientMap L n (sigma • a) = + sigma • integerUnitsPrincipalUnitsQuotientMap L n a) ∧ + (∀ a : 𝒪[L]ˣ, integerUnitsPrincipalUnitsQuotientMap L n a = 1 ↔ + ∃ v : principalUnits L n, + principalUnitsIntegerUnitsInclusion L n v = a) ∧ + Function.Injective (principalUnitsIntegerUnitsInclusion L n) ∧ + Function.Surjective (integerUnitsPrincipalUnitsQuotientMap L n) := by + let := galoisGroupPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + let := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n + refine ⟨?_, ?_, ?_, (principalUnits L n).subtype_injective, + integerUnitsModPrincipalUnitsAtLevelMk_surjective L n⟩ + · intro sigma a + rfl + · intro sigma a + rw [integerUnitsPrincipalUnitsQuotientMap, + galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure_smul, + galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure_smul, + galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure_mk] + · intro a + constructor + · intro ha + have ha' : a ∈ principalUnits L n := by + exact (integerUnitsModPrincipalUnitsAtLevelMk_eq_one_iff L n a).1 ha + exact ⟨⟨a, ha'⟩, rfl⟩ + · rintro ⟨v, rfl⟩ + exact (integerUnitsModPrincipalUnitsAtLevelMk_eq_one_iff L n + (v : 𝒪[L]ˣ)).2 v.2 + +/-- A Galois-fixed actual integer unit descends to a base integer unit. This +is valuation-ring descent, not an assumed comparison of fixed parts. -/ +private theorem exists_integerUnit_map_eq_of_galoisGroup_fixed + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (a : 𝒪[L]ˣ) + (ha : letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + ∀ sigma : Gal(L/K), sigma • a = a) : + ∃ b : 𝒪[K]ˣ, integerUnitsMapOfValuationExtension K L b = a := by + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + have hfixed : ∀ sigma : Gal(L/K), + sigma ((((a : 𝒪[L]ˣ) : 𝒪[L]) : L)) = (((a : 𝒪[L]ˣ) : 𝒪[L]) : L) := by + intro sigma + have h := congrArg (fun z : 𝒪[L]ˣ => (((z : 𝒪[L]ˣ) : 𝒪[L]) : L)) (ha sigma) + simpa [galoisGroupIntegerRingEquivOfIsIntegralClosure_apply] using h + have hmem : ((((a : 𝒪[L]ˣ) : 𝒪[L]) : L)) ∈ Set.range (algebraMap K L) := + (IsGalois.mem_range_algebraMap_iff_fixed + (F := K) (E := L) ((((a : 𝒪[L]ˣ) : 𝒪[L]) : L))).2 hfixed + rcases hmem with ⟨y, hy⟩ + have hy0 : y ≠ 0 := by + intro hzero + have : (((a : 𝒪[L]ˣ) : 𝒪[L]) : L) = 0 := by + rw [← hy, hzero, map_zero] + exact a.ne_zero (Subtype.ext this) + have hy_mem : ValuativeRel.valuation K y ≤ 1 := by + apply (Valuation.HasExtension.val_map_le_one_iff + (vR := ValuativeRel.valuation K) (vA := ValuativeRel.valuation L) y).1 + rw [hy] + exact (a : 𝒪[L]ˣ).val.property + have hy_inv_mem : ValuativeRel.valuation K y⁻¹ ≤ 1 := by + apply (Valuation.HasExtension.val_map_le_one_iff + (vR := ValuativeRel.valuation K) (vA := ValuativeRel.valuation L) y⁻¹).1 + rw [map_inv₀, hy] + have hinv : ValuativeRel.valuation L (((a.inv : 𝒪[L])) : L) ≤ 1 := + a.inv.property + have hmul : (((a.val : 𝒪[L])) : L) * (((a.inv : 𝒪[L])) : L) = 1 := by + exact congrArg (fun z : 𝒪[L] => (z : L)) a.val_inv + have hinvEq : (((a.inv : 𝒪[L])) : L) = (((a.val : 𝒪[L])) : L)⁻¹ := + eq_inv_of_mul_eq_one_right hmul + rw [hinvEq] at hinv + exact hinv + let b : 𝒪[K]ˣ := + { val := ⟨y, hy_mem⟩ + inv := ⟨y⁻¹, hy_inv_mem⟩ + val_inv := by ext; simp [hy0] + inv_val := by ext; simp [hy0] } + refine ⟨b, ?_⟩ + apply Units.ext + apply Subtype.ext + exact hy + +/-- The normal-basis construction, restricted to its actual +integer-unit conclusion `h(G,𝒪_Lˣ)=1`. -/ +private theorem integerUnits_herbrandQuotient_eq_one + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + (g : Gal(L/K)) (hg : ∀ sigma : Gal(L/K), sigma ∈ Subgroup.zpowers g) : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + ∃ _ : HerbrandQuotientDefined Gal(L/K) 𝒪[L]ˣ g, + @herbrandQuotient Gal(L/K) 𝒪[L]ˣ _ _ _ + (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) + g = 1 := by + rcases exists_chosenNormalBasisPrincipalUnitSubgroup (K := K) (L := L) with + ⟨cV, hcV⟩ + rcases exists_chosenNormalBasisPrincipalUnit_herbrand_subsingleton + (K := K) (L := L) g hg with ⟨cH, hcH⟩ + rcases exists_integerUnits_herbrandQuotient_eq_one_of_large_chosenNormalBasisLevel + (K := K) (L := L) with ⟨cU, hcU⟩ + let n : Nat := max cV (max cH cU) + have hcVn : cV ≤ n := le_max_left cV (max cH cU) + have hrest : max cH cU ≤ n := le_max_right cV (max cH cU) + have hcHn : cH ≤ n := le_trans (le_max_left cH cU) hrest + have hcUn : cU ≤ n := le_trans (le_max_right cH cU) hrest + rcases hcV n hcVn with ⟨V, hV, _⟩ + let := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + let := chosenNormalBasisIntegerUnitsQuotMulDistribMulAction K L n V hV + have hcoh := hcH n hcHn V hV + exact hcU n hcUn V hV g hg hcoh.1 hcoh.2 + +private theorem herbrandHMinusOne_subsingleton_of_h0_subsingleton_of_quotient_eq_one + (G A : Type u) [Group G] [Fintype G] [CommGroup A] + [MulDistribMulAction G A] (g : G) + [Finite (HerbrandH0 G A)] [Finite (HerbrandHMinusOne G A g)] + [Subsingleton (HerbrandH0 G A)] + (hquot : herbrandQuotient (G := G) (A := A) g = 1) : + Subsingleton (HerbrandHMinusOne G A g) := by + have hzero : Nat.card (HerbrandH0 G A) = 1 := by + exact Nat.card_unique + have hden : ((Nat.card (HerbrandHMinusOne G A g) : ℚ) ≠ 0) := + Nat.cast_ne_zero.mpr + (Finite.card_pos (α := HerbrandHMinusOne G A g)).ne' + have hcardQ : (1 : ℚ) = Nat.card (HerbrandHMinusOne G A g) := by + unfold herbrandQuotient at hquot + rw [hzero] at hquot + exact (div_eq_one_iff_eq hden).1 hquot + have hcard : Nat.card (HerbrandHMinusOne G A g) = 1 := by + exact_mod_cast hcardQ.symm + exact (Nat.card_eq_one_iff_unique.mp hcard).1 + +/-- The unramified unit-cohomology theorem for the actual integer-unit module: both low-degree Tate +groups are trivial in an unramified extension. -/ +private theorem unramified_integerUnits_herbrand_subsingleton + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [IsUnramifiedValuedExtension K L] + (g : Gal(L/K)) (hg : ∀ sigma : Gal(L/K), sigma ∈ Subgroup.zpowers g) : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + Subsingleton (HerbrandH0 Gal(L/K) 𝒪[L]ˣ) ∧ + Subsingleton (HerbrandHMinusOne Gal(L/K) 𝒪[L]ˣ g) := by + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + rcases integerUnits_herbrandQuotient_eq_one K L g hg with + ⟨hU, hUone⟩ + let : Finite (HerbrandH0 Gal(L/K) 𝒪[L]ˣ) := hU.1 + let : Finite (HerbrandHMinusOne Gal(L/K) 𝒪[L]ˣ g) := hU.2 + have hfixed : fixedSubgroup Gal(L/K) 𝒪[L]ˣ ≤ + tateNormSubgroup Gal(L/K) 𝒪[L]ˣ := by + intro a ha + rcases exists_integerUnit_map_eq_of_galoisGroup_fixed K L a ha with + ⟨b, hb⟩ + rcases normIntegerUnits_surjective_unramified_of_isIntegralClosure K L b with + ⟨z, hz⟩ + refine ⟨z, ?_⟩ + calc + tateNorm Gal(L/K) 𝒪[L]ˣ z = + Finset.univ.prod (fun sigma : Gal(L/K) => + Units.mapEquiv + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L sigma).toMulEquiv z) := rfl + _ = integerUnitsMapOfValuationExtension K L (normIntegerUnits K L z) := + (integerUnitsMap_normIntegerUnits_eq_galoisGroup_prod_of_isIntegralClosure K L z).symm + _ = integerUnitsMapOfValuationExtension K L b := by rw [hz] + _ = a := hb + let : Subsingleton (HerbrandH0 Gal(L/K) 𝒪[L]ˣ) := + herbrandH0_subsingleton_of_fixed_le_tateNormSubgroup hfixed + exact ⟨inferInstance, + herbrandHMinusOne_subsingleton_of_h0_subsingleton_of_quotient_eq_one + Gal(L/K) 𝒪[L]ˣ g hUone⟩ + +/-- The unramified unit-cohomology theorem for the actual `n`-th principal-unit module. The proof +uses the actual sequence `1 → U_L^n → 𝒪_Lˣ → 𝒪_Lˣ/U_L^n → 1`, +Herbrand-quotient multiplicativity, and the actual unramified norm lifting. -/ +private theorem unramified_principalUnits_herbrand_subsingleton + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) (g : Gal(L/K)) + (hg : ∀ sigma : Gal(L/K), sigma ∈ Subgroup.zpowers g) : + letI := galoisGroupPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n + Subsingleton (HerbrandH0 Gal(L/K) (principalUnits L n)) ∧ + Subsingleton + (HerbrandHMinusOne Gal(L/K) (principalUnits L n) g) := by + let := galoisGroupPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n + let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + let := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure + K L n + rcases integerUnits_herbrandQuotient_eq_one K L g hg with + ⟨hU, hUone⟩ + let : Finite (IntegerUnitsModPrincipalUnitsAtLevel L n) := + integerUnitsModPrincipalUnitsAtLevel_finite_of_isNonarchimedeanLocalField L n + let hQ : HerbrandQuotientDefined Gal(L/K) + (IntegerUnitsModPrincipalUnitsAtLevel L n) g := + ⟨inferInstance, inferInstance⟩ + have hQone : herbrandQuotient (G := Gal(L/K)) + (A := IntegerUnitsModPrincipalUnitsAtLevel L n) g = 1 := + integerUnitsModPrincipalUnitsAtLevel_herbrandQuotient_eq_one_of_isNonarchimedeanLocalField + K L n g hg + let hseq := principalUnitsIntegerUnits_shortExact K L n + let hP : HerbrandQuotientDefined Gal(L/K) (principalUnits L n) g := + herbrandQuotientDefined_left_of_middle_right + (G := Gal(L/K)) (A := principalUnits L n) (B := 𝒪[L]ˣ) + (C := IntegerUnitsModPrincipalUnitsAtLevel L n) + (principalUnitsIntegerUnitsInclusion L n) + (integerUnitsPrincipalUnitsQuotientMap L n) + hseq.1 hseq.2.1 hseq.2.2.1 hseq.2.2.2.1 hseq.2.2.2.2 + g hg hU hQ + let : Finite (HerbrandH0 Gal(L/K) 𝒪[L]ˣ) := hU.1 + let : Finite (HerbrandHMinusOne Gal(L/K) 𝒪[L]ˣ g) := hU.2 + let : Finite (HerbrandH0 Gal(L/K) + (IntegerUnitsModPrincipalUnitsAtLevel L n)) := hQ.1 + let : Finite (HerbrandHMinusOne Gal(L/K) + (IntegerUnitsModPrincipalUnitsAtLevel L n) g) := hQ.2 + let : Finite (HerbrandH0 Gal(L/K) (principalUnits L n)) := hP.1 + let : Finite (HerbrandHMinusOne Gal(L/K) + (principalUnits L n) g) := hP.2 + have hPone : herbrandQuotient (G := Gal(L/K)) + (A := principalUnits L n) g = 1 := by + have hmul := herbrandQuotient_multiplicative_of_shortExact + (G := Gal(L/K)) (A := principalUnits L n) (B := 𝒪[L]ˣ) + (C := IntegerUnitsModPrincipalUnitsAtLevel L n) + (principalUnitsIntegerUnitsInclusion L n) + (integerUnitsPrincipalUnitsQuotientMap L n) + hseq.1 hseq.2.1 hseq.2.2.1 hseq.2.2.2.1 hseq.2.2.2.2 g hg + rw [hUone, hQone, mul_one] at hmul + exact hmul.symm + have hfixed : fixedSubgroup Gal(L/K) (principalUnits L n) ≤ + tateNormSubgroup Gal(L/K) (principalUnits L n) := by + intro a ha + have haUnits : ∀ sigma : Gal(L/K), + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + sigma • ((a : principalUnits L n) : 𝒪[L]ˣ) = + ((a : principalUnits L n) : 𝒪[L]ˣ) := by + intro sigma + exact congrArg (fun z : principalUnits L n => (z : 𝒪[L]ˣ)) (ha sigma) + rcases exists_integerUnit_map_eq_of_galoisGroup_fixed K L (a : 𝒪[L]ˣ) haUnits with + ⟨b, hb⟩ + have hbmem : b ∈ principalUnits K n := + principalUnits_of_integerUnitsMap_mem_principalUnits_of_unramifiedValuation + K L n (by rw [hb]; exact a.2) + let bP : principalUnits K n := ⟨b, hbmem⟩ + rcases principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_surjective + K L n hn bP with ⟨z, hz⟩ + have hmap : principalUnitsMapOfUnramifiedValuation K L n bP = a := by + apply Subtype.ext + exact hb + refine ⟨z, ?_⟩ + calc + tateNorm Gal(L/K) (principalUnits L n) z = + Finset.univ.prod (fun sigma : Gal(L/K) => + galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure K L n sigma z) := rfl + _ = principalUnitsNormExtensionSideOfIsIntegralClosure K L n z := + (principalUnitsNormExtensionSideOfIsIntegralClosure_eq_galoisGroup_prod + K L n z).symm + _ = principalUnitsMapOfUnramifiedValuation K L n + (principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L n z) := + (principalUnitsMap_normOfUnramifiedValuationOfIsIntegralClosure_eq_normExtensionSide + K L n z).symm + _ = principalUnitsMapOfUnramifiedValuation K L n bP := by rw [hz] + _ = a := hmap + let : Subsingleton + (HerbrandH0 Gal(L/K) (principalUnits L n)) := + herbrandH0_subsingleton_of_fixed_le_tateNormSubgroup hfixed + exact ⟨inferInstance, + herbrandHMinusOne_subsingleton_of_h0_subsingleton_of_quotient_eq_one + Gal(L/K) (principalUnits L n) g hPone⟩ + +/-- Generator-explicit form of the unramified unit-cohomology theorem. The canonical +endpoint below supplies the canonical unramified arithmetic Frobenius. -/ +theorem unramified_units_tateCohomology_and_norm_surjective_for_generator + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [IsUnramifiedValuedExtension K L] + (g : Gal(L/K)) (hg : ∀ sigma : Gal(L/K), sigma ∈ Subgroup.zpowers g) : + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + (Subsingleton (HerbrandH0 Gal(L/K) 𝒪[L]ˣ) ∧ + Subsingleton (HerbrandHMinusOne Gal(L/K) 𝒪[L]ˣ g)) ∧ + (∀ n : Nat, 1 ≤ n → + letI := galoisGroupPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n + Subsingleton (HerbrandH0 Gal(L/K) (principalUnits L n)) ∧ + Subsingleton + (HerbrandHMinusOne Gal(L/K) (principalUnits L n) g)) ∧ + MonoidHom.range (normIntegerUnits K L) = ⊤ ∧ + ∀ n : Nat, 1 ≤ n → MonoidHom.range + (principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L n) = ⊤ := by + refine ⟨unramified_integerUnits_herbrand_subsingleton K L g hg, ?_, + MonoidHom.range_eq_top_of_surjective (normIntegerUnits K L) + (normIntegerUnits_surjective_unramified_of_isIntegralClosure K L), ?_⟩ + · intro n hn + exact unramified_principalUnits_herbrand_subsingleton K L n hn g hg + · intro n hn + exact MonoidHom.range_eq_top_of_surjective + (principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L n) + (principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_surjective + K L n hn) + +/-- The unramified unit-cohomology theorem. The arithmetic Frobenius and its generation +property are constructed from unramifiedness, so the canonical endpoint has no +extra chosen-generator argument. -/ +theorem unramified_units_tateCohomology_and_norm_surjective + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [IsUnramifiedValuedExtension K L] : + let phi := arithmeticFrobeniusOfUnramifiedValuation K L + letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L + (Subsingleton (HerbrandH0 Gal(L/K) 𝒪[L]ˣ) ∧ + Subsingleton (HerbrandHMinusOne Gal(L/K) 𝒪[L]ˣ phi)) ∧ + (∀ n : Nat, 1 ≤ n → + letI := galoisGroupPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n + Subsingleton (HerbrandH0 Gal(L/K) (principalUnits L n)) ∧ + Subsingleton + (HerbrandHMinusOne Gal(L/K) (principalUnits L n) phi)) ∧ + MonoidHom.range (normIntegerUnits K L) = ⊤ ∧ + ∀ n : Nat, 1 ≤ n → MonoidHom.range + (principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L n) = ⊤ := by + exact unramified_units_tateCohomology_and_norm_surjective_for_generator K L + (arithmeticFrobeniusOfUnramifiedValuation K L) + (arithmeticFrobeniusOfUnramifiedValuation_generates K L) + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Norm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Norm.lean new file mode 100644 index 0000000000..41df804379 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Norm.lean @@ -0,0 +1,303 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.ResidueNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup +/-! Provides the public declarations in the `LocalClassFieldTheory.Finite.Unramified.Norm` Lean + module. -/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace LocalClassFieldTheory + + +open scoped ValuativeRel +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +/-- For a finite unramified extension, actual integral-closure integer-unit +norm surjectivity: combine the quotient norm on `𝒪[L]ˣ/U_L¹` with the +actual `U_L¹ -> U_K¹` lifting. -/ +theorem normIntegerUnits_surjective_unramified_of_isIntegralClosure + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + Function.Surjective (normIntegerUnits K L) := by + intro y + obtain ⟨q, hq⟩ := + integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure_surjective_of_unramifiedValuation + K L (QuotientGroup.mk y : IntegerUnitsModPrincipalUnits K) + obtain ⟨u, rfl⟩ := Quotient.exists_rep q + have hclass : + (QuotientGroup.mk (normIntegerUnits K L u) : IntegerUnitsModPrincipalUnits K) = + QuotientGroup.mk y := by + change integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure K L + (integerUnitsModPrincipalUnitsMk L u) = + integerUnitsModPrincipalUnitsMk K y at hq + rw [integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure_mk] at hq + exact hq + have hresInv : normIntegerUnits K L u / y ∈ principalUnits K 1 := + (IntegerUnitsModPrincipalUnits_mk_eq_mk_iff K (normIntegerUnits K L u) y).1 hclass + have hres : y / normIntegerUnits K L u ∈ principalUnits K 1 := by + have hinv : (normIntegerUnits K L u / y)⁻¹ ∈ principalUnits K 1 := + (principalUnits K 1).inv_mem hresInv + simpa [div_eq_mul_inv, mul_assoc, mul_comm, mul_left_comm] using hinv + let r : principalUnits K 1 := ⟨y / normIntegerUnits K L u, hres⟩ + obtain ⟨z, hz⟩ := + principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_surjective + K L 1 (Nat.le_refl 1) r + refine ⟨u * (z : 𝒪[L]ˣ), ?_⟩ + have hzUnits : normIntegerUnits K L (z : 𝒪[L]ˣ) = y / normIntegerUnits K L u := by + have hzUnitsSub := congrArg (fun w : principalUnits K 1 => (w : 𝒪[K]ˣ)) hz + simpa [principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_apply, r] + using hzUnitsSub + calc + normIntegerUnits K L (u * (z : 𝒪[L]ˣ)) + = normIntegerUnits K L u * normIntegerUnits K L (z : 𝒪[L]ˣ) := by + rw [(normIntegerUnits K L).map_mul] + _ = normIntegerUnits K L u * (y / normIntegerUnits K L u) := by + rw [hzUnits] + _ = y := by + simp [div_eq_mul_inv, mul_left_comm] + +/-- For a finite unramified extension: the norm of an integer unit is again an integer unit, +so its normalized valuation is zero. + +This is the unit part of the standard decomposition `x = u * π^m`; it uses the +actual integer-unit norm, not a norm-valuation certificate. -/ +theorem v_normUnits_integerUnitsToFieldUnits + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [Algebra K L] [LocalFieldTheory.ValuativeExtension K L] + (u : 𝒪[L]ˣ) : + LocalFieldTheory.IsNonarchimedeanLocalField.v K + (Additive.ofMul (LocalFieldTheory.normUnits K L + (integerUnitsToFieldUnits L u))) = 0 := by + have hval : + LocalFieldTheory.IsNonarchimedeanLocalField.v K + (Additive.ofMul (integerUnitsToFieldUnits K (normIntegerUnits K L u))) = 0 := + LocalFieldTheory.IsNonarchimedeanLocalField.v_integerUnitsToFieldUnits K (normIntegerUnits K + L u) + simpa [LocalFieldTheory.normUnits, + normIntegerUnits_to_fieldUnits K L u] using hval + +/-- The norm of a base-field inverse uniformizer power has the expected +valuation. This is the `N(π_K^m) = π_K^{m[L:K]}` part of the unramified norm calculation, +proved from the algebra norm of a base element. -/ +theorem v_normUnits_mapBase_inverseIntegerRingUniformizerFieldUnit_zpow + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [Algebra K L] (m : Int) : + LocalFieldTheory.IsNonarchimedeanLocalField.v K + (Additive.ofMul + (LocalFieldTheory.normUnits K L + ((mapBaseUnitsToExtensionUnits K L + (inverseIntegerRingUniformizerFieldUnit K)) ^ m))) = + (Module.finrank K L : Int) * m := by + have hbase : + LocalFieldTheory.normUnits K L + ((mapBaseUnitsToExtensionUnits K L + (inverseIntegerRingUniformizerFieldUnit K)) ^ m) = + ((inverseIntegerRingUniformizerFieldUnit K) ^ m) ^ + Module.finrank K L := by + rw [← (mapBaseUnitsToExtensionUnits K L).map_zpow] + have hnorm := LocalFieldTheory.IsNonarchimedeanLocalField.normUnits_algebraMap_base + (K := K) (L := L) ((inverseIntegerRingUniformizerFieldUnit K) ^ m) + simpa [LocalFieldTheory.normUnits] using hnorm + rw [hbase] + rw [LocalFieldTheory.IsNonarchimedeanLocalField.v_pow, + LocalFieldTheory.IsNonarchimedeanLocalField.v_zpow, + v_inverseIntegerRingUniformizerFieldUnit] + rw [mul_one] + +/-- For a finite unramified extension: after decomposing an element into an integer-unit +part and a power of the chosen inverse uniformizer, the valuation of its norm is +determined by the exponent. -/ +theorem v_normUnits_integerUnit_mul_mapBase_inverseIntegerRingUniformizer_zpow + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [Algebra K L] [LocalFieldTheory.ValuativeExtension K L] + (u : 𝒪[L]ˣ) (m : Int) : + LocalFieldTheory.IsNonarchimedeanLocalField.v K + (Additive.ofMul + (LocalFieldTheory.normUnits K L + (integerUnitsToFieldUnits L u * + (mapBaseUnitsToExtensionUnits K L + (inverseIntegerRingUniformizerFieldUnit K)) ^ m))) = + (Module.finrank K L : Int) * m := by + rw [map_mul] + rw [LocalFieldTheory.IsNonarchimedeanLocalField.v_mul] + rw [v_normUnits_integerUnitsToFieldUnits, + v_normUnits_mapBase_inverseIntegerRingUniformizerFieldUnit_zpow] + rw [zero_add] + +/-- For a finite unramified extension, norm-valuation calculation in the actual unramified +valuation case. + +The proof uses the standard decomposition: choose the base inverse uniformizer, use +unramifiedness to know that it is also an upstairs normalized generator, +decompose `x = u * π^{v_L(x)}`, then combine the integer-unit norm with +`N(π^m) = π_K^{m[L:K]}`. No common-uniformizer value, norm-valuation formula, +or residue-degree equality is assumed as an extra input. -/ +theorem v_normUnits_unramifiedValuation + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [LocalFieldTheory.ValuativeExtension K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (x : Lˣ) : + LocalFieldTheory.IsNonarchimedeanLocalField.v K + (Additive.ofMul (LocalFieldTheory.normUnits K L x)) = + (Module.finrank K L : Int) * + LocalFieldTheory.IsNonarchimedeanLocalField.v L (Additive.ofMul x) := by + let ϖL : Lˣ := + mapBaseUnitsToExtensionUnits K L (inverseIntegerRingUniformizerFieldUnit K) + have hGenerator : valuationMap L (Additive.ofMul ϖL) = 1 := by + simpa [valuationMap_apply, ϖL] using + v_mapBaseUnitsToExtensionUnits_inverseIntegerRingUniformizerFieldUnit_of_unramifiedValuation + K L + rcases exists_integerUnit_mul_uniformizer_zpow L ϖL hGenerator x with ⟨u, hdecomp⟩ + have hnorm : + LocalFieldTheory.IsNonarchimedeanLocalField.v K + (Additive.ofMul (LocalFieldTheory.normUnits K L x)) = + LocalFieldTheory.IsNonarchimedeanLocalField.v K + (Additive.ofMul + (LocalFieldTheory.normUnits K L + (integerUnitsToFieldUnits L u * + ϖL ^ valuationMap L (Additive.ofMul x)))) := by + exact congrArg + (fun y : Lˣ => + LocalFieldTheory.IsNonarchimedeanLocalField.v K + (Additive.ofMul (LocalFieldTheory.normUnits K L y))) + hdecomp.symm + rw [hnorm] + simpa [ϖL, valuationMap_apply] using + v_normUnits_integerUnit_mul_mapBase_inverseIntegerRingUniformizer_zpow + K L u (valuationMap L (Additive.ofMul x)) + +/-- For a finite unramified extension, reverse containment source: every field norm has +valuation divisible by `[L : K]` in the actual unramified valuation case. -/ +theorem finrank_dvd_valuation_of_mem_normSubgroup_unramified + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [LocalFieldTheory.ValuativeExtension K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + {x : Kˣ} (hx : x ∈ localNormSubgroup K L) : + (Module.finrank K L : Int) ∣ valuationMap K (Additive.ofMul x) := by + rcases MonoidHom.mem_range.mp hx with ⟨y, hy⟩ + refine ⟨IsNonarchimedeanLocalField.v L (Additive.ofMul y), ?_⟩ + rw [← hy, valuationMap_apply] + exact v_normUnits_unramifiedValuation K L y + +/-- For a finite unramified extension, constructive reverse containment for the unramified norm +calculation, actual integral-closure source-producing half: if the valuation +of a base-field unit is divisible by `[L : K]`, then it is already a field norm. + +This is the standard argument `a = u * π_K^(m[L:K])`, with +`u = N(ε)` by the actual integer-unit norm theorem and +`π_K^(m[L:K]) = N(π_K^m)`. It uses the integral-closure version of the +integer-unit lifting, with no auxiliary invariant package. -/ +theorem mem_normSubgroup_of_finrank_dvd_valuation_unramified_of_isIntegralClosure + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + {x : Kˣ} + (hdiv : (Module.finrank K L : Int) ∣ valuationMap K (Additive.ofMul x)) : + x ∈ localNormSubgroup K L := by + rcases valuationMap_uniformiser K with ⟨ϖ, hϖ⟩ + rcases exists_integerUnit_mul_uniformizer_zpow K ϖ hϖ x with ⟨u, hdecomp⟩ + rcases hdiv with ⟨m, hm⟩ + obtain ⟨uL, huL⟩ := + normIntegerUnits_surjective_unramified_of_isIntegralClosure K L u + refine MonoidHom.mem_range.mpr ?_ + refine ⟨integerUnitsToFieldUnits L uL * mapBaseUnitsToExtensionUnits K L (ϖ ^ m), ?_⟩ + have hunitNorm : + LocalFieldTheory.normUnits K L (integerUnitsToFieldUnits L uL) = + integerUnitsToFieldUnits K u := by + have hfield : + LocalFieldTheory.normUnits K L (integerUnitsToFieldUnits L uL) = + integerUnitsToFieldUnits K u := by + rw [← normIntegerUnits_to_fieldUnits K L uL, huL] + simpa [LocalFieldTheory.normUnits] using hfield + have hbaseNorm : + LocalFieldTheory.normUnits K L + (mapBaseUnitsToExtensionUnits K L (ϖ ^ m)) = + ϖ ^ valuationMap K (Additive.ofMul x) := by + have hbase0 : + LocalFieldTheory.normUnits K L + (mapBaseUnitsToExtensionUnits K L (ϖ ^ m)) = + (ϖ ^ m) ^ Module.finrank K L := by + have hnorm := LocalFieldTheory.IsNonarchimedeanLocalField.normUnits_algebraMap_base + (K := K) (L := L) (ϖ ^ m) + simpa [LocalFieldTheory.normUnits] using hnorm + calc + LocalFieldTheory.normUnits K L + (mapBaseUnitsToExtensionUnits K L (ϖ ^ m)) + = (ϖ ^ m) ^ Module.finrank K L := hbase0 + _ = (ϖ ^ m) ^ (Module.finrank K L : Int) := by rw [zpow_natCast] + _ = ϖ ^ (m * (Module.finrank K L : Int)) := by rw [← zpow_mul] + _ = ϖ ^ valuationMap K (Additive.ofMul x) := by + rw [hm] + rw [mul_comm m (Module.finrank K L : Int)] + calc + LocalFieldTheory.normUnits K L + (integerUnitsToFieldUnits L uL * mapBaseUnitsToExtensionUnits K L (ϖ ^ m)) + = LocalFieldTheory.normUnits K L (integerUnitsToFieldUnits L uL) * + LocalFieldTheory.normUnits K L + (mapBaseUnitsToExtensionUnits K L (ϖ ^ m)) := by + rw [map_mul] + _ = integerUnitsToFieldUnits K u * ϖ ^ valuationMap K (Additive.ofMul x) := by + rw [hunitNorm, hbaseNorm] + _ = x := hdecomp + +/-- For a finite unramified extension, actual unramified norm image membership: +the norm subgroup consists exactly of elements whose normalized valuation is +divisible by `[L : K]`. + +This combines the actual norm-valuation calculation with the actual +integral-closure unit lifting. -/ +theorem mem_normSubgroup_unramifiedValuation_iff_finrank_dvd_valuation_of_isIntegralClosure + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (x : Kˣ) : + x ∈ localNormSubgroup K L ↔ + (Module.finrank K L : Int) ∣ valuationMap K (Additive.ofMul x) := by + constructor + · exact finrank_dvd_valuation_of_mem_normSubgroup_unramified K L + · exact mem_normSubgroup_of_finrank_dvd_valuation_unramified_of_isIntegralClosure K L + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits.lean new file mode 100644 index 0000000000..2de56cae05 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Lift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/All.lean new file mode 100644 index 0000000000..63b3f33e6b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/All.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Lift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace +/-! Provides the public declarations in the + `LocalClassFieldTheory.Finite.Unramified.PrincipalUnits` Lean module. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Basic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Basic.lean new file mode 100644 index 0000000000..0fd60f2e19 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Basic.lean @@ -0,0 +1,220 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide +/-! Provides the public declarations in the + `LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic` Lean module. -/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace LocalClassFieldTheory + +open scoped ValuativeRel +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField +open Filter + +/-- In an actual unramified valuation extension, the actual integer-unit norm +sends `U_L^n` into `U_K^n`. -/ +theorem normIntegerUnits_mem_principalUnits_of_unramifiedValuation_of_isIntegralClosure + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (u : 𝒪[L]ˣ) (hu : u ∈ principalUnits L n) : + normIntegerUnits K L u ∈ principalUnits K n := by + apply principalUnits_of_integerUnitsMap_mem_principalUnits_of_unramifiedValuation K L n + exact integerUnitsMap_normIntegerUnits_mem_principalUnits_of_isIntegralClosure K L n u hu + +/-- Actual integral-closure version of the integer-unit norm restricted to +principal units in an actual unramified valuation extension. -/ +noncomputable def principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] (n : Nat) : + principalUnits L n →* principalUnits K n where + toFun u := + ⟨normIntegerUnits K L u.1, + normIntegerUnits_mem_principalUnits_of_unramifiedValuation_of_isIntegralClosure + K L n u.1 u.2⟩ + map_one' := by + ext + simp + map_mul' := by + intro u v + ext + simp + +/-- States the theorem `principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_apply`. -/ +@[simp] +theorem principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_apply + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] (n : Nat) + (u : principalUnits L n) : + ((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L n u : + principalUnits K n) : 𝒪[K]ˣ) = + normIntegerUnits K L u.1 := + rfl + +/-- Base-extending the integral-closure unramified +principal-unit norm recovers the extension-side norm expressed through the +integral-closure Galois product. -/ +theorem principalUnitsMap_normOfUnramifiedValuationOfIsIntegralClosure_eq_normExtensionSide + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (u : principalUnits L n) : + principalUnitsMapOfUnramifiedValuation K L n + (principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L n u) = + principalUnitsNormExtensionSideOfIsIntegralClosure K L n u := by + ext + rfl + +namespace UnramifiedPrincipalUnits + +/-- The integral-closure norm-product calculation before residue trace +identification. -/ +theorem norm_oneAdd_sub_galoisSum_mem_next + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) (a : (𝓂[L] ^ n : Ideal 𝒪[L])) : + (((principalUnitsMapOfUnramifiedValuation K L n + (principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L n + (principalUnitOneAddOfMemPowSubgroup L hn (a : 𝒪[L]) a.2)) : + principalUnits L n) : 𝒪[L]ˣ) : 𝒪[L]) - 1 - + (Finset.univ.sum fun σ : Gal(L/K) => + galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ (a : 𝒪[L])) ∈ + (𝓂[L] ^ (n + 1) : Ideal 𝒪[L]) := by + rw [principalUnitsMap_normOfUnramifiedValuationOfIsIntegralClosure_eq_normExtensionSide + K L n (principalUnitOneAddOfMemPowSubgroup L hn (a : 𝒪[L]) a.2)] + exact + principalUnitsNormExtensionSide_oneAdd_sub_one_sub_sum_mem_maximalIdeal_pow_succ + K L n hn a + +end UnramifiedPrincipalUnits + +/-- The integral-closure norm on successive principal-unit +quotients. This is the quotient map used in the unramified norm calculation before +identifying the associated graded map with residue trace. -/ +noncomputable def principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] (n : Nat) : + PrincipalUnitsSuccQuot L n →* PrincipalUnitsSuccQuot K n := + principalUnitsSuccQuotLift n + ((principalUnitsSuccQuotMk K n).comp + (principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L n)) + (by + intro u hu + rw [MonoidHom.mem_ker, MonoidHom.comp_apply, + principalUnitsSuccQuotMk_eq_one_iff] + change ((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L n u : + principalUnits K n) : 𝒪[K]ˣ) ∈ principalUnits K (n + 1) + simpa [principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_apply] + using + normIntegerUnits_mem_principalUnits_of_unramifiedValuation_of_isIntegralClosure + K L (n + 1) u.1 hu) + +/-- States the theorem `principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure_mk`. -/ +@[simp] +theorem principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure_mk + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] (n : Nat) + (u : principalUnits L n) : + principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure K L n + (principalUnitsSuccQuotMk L n u) = + principalUnitsSuccQuotMk K n + (principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L n u) := + rfl + +/-- The integral-closure associated-graded norm-product +calculation in the unramified norm calculation. -/ +theorem principalUnitsSuccQuotMap_normOfUnramifiedValuationOfIsIntegralClosure_oneAdd_base_eq_sum + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) (a : (𝓂[L] ^ n : Ideal 𝒪[L])) : + let b : (𝓂[L] ^ n : Ideal 𝒪[L]) := + ⟨Finset.univ.sum fun σ : Gal(L/K) => + galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ (a : 𝒪[L]), + by + classical + exact Ideal.sum_mem _ fun σ _ => + (integerRingEquiv_mem_maximalIdeal_pow L + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) n + (a : 𝒪[L])).2 a.2⟩ + principalUnitsSuccQuotMapOfUnramifiedValuation K L n + (principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure K L n + (principalUnitsSuccQuotMk L n + (principalUnitOneAddOfMemPowSubgroup L hn (a : 𝒪[L]) a.2))) = + principalUnitsSuccQuotOfIdealPow L n hn b := by + classical + intro b + rw [principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure_mk, + principalUnitsSuccQuotMapOfUnramifiedValuation_mk] + exact principalUnitsSuccQuotMk_eq_oneAdd_of_sub_one_sub_mem_succ L n hn + (principalUnitsMapOfUnramifiedValuation K L n + (principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L n + (principalUnitOneAddOfMemPowSubgroup L hn (a : 𝒪[L]) a.2))) + b + (by + simpa [b] using + UnramifiedPrincipalUnits.norm_oneAdd_sub_galoisSum_mem_next + K L n hn a) + + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Lift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Lift.lean new file mode 100644 index 0000000000..26a0063f33 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Lift.lean @@ -0,0 +1,544 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace +/-! Provides the public declarations in the + `LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Lift` Lean module. -/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace LocalClassFieldTheory + +open scoped ValuativeRel +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField +open Filter + +/-- States the theorem +`principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_lift_mod_succ`. -/ +theorem principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_lift_mod_succ + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) (y : principalUnits K n) : + ∃ x : principalUnits L n, + principalUnitsSuccQuotMk K n + (principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L n x) = + principalUnitsSuccQuotMk K n y := by + obtain ⟨q, hq⟩ := + principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure_surjective + K L n hn (principalUnitsSuccQuotMk K n y) + obtain ⟨x, rfl⟩ := principalUnitsSuccQuotMk_surjective L n q + refine ⟨x, ?_⟩ + simpa [principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure_mk] + using hq + +/-- Actual integral-closure one-step correction form: the remaining error +after dividing the target by the chosen norm lies in the next principal-unit +filtration step. -/ +theorem principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_div_lift_mem_succ + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) (y : principalUnits K n) : + ∃ x : principalUnits L n, + y / principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L n x ∈ + (principalUnits K (n + 1)).subgroupOf (principalUnits K n) := by + obtain ⟨x, hx⟩ := + principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_lift_mod_succ K L n hn y + refine ⟨x, ?_⟩ + exact (principalUnitsSuccQuotMk_eq_iff_div_mem K n y + (principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L n x)).1 hx.symm + +/-- Actual integral-closure finite-depth iteration of the one-step +principal-unit norm correction. For every `d`, a target in `U_K^n` can be +matched by the norm of an element of `U_L^n` up to an error in `U_K^(n+d)`. + +This is the finite approximation stage of principal-unit norm surjectivity. -/ +theorem principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_approx_mem_add + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n d : Nat) (hn : 1 ≤ n) (y : principalUnits K n) : + ∃ x : principalUnits L n, + ((y : 𝒪[K]ˣ) / normIntegerUnits K L (x : 𝒪[L]ˣ)) ∈ + principalUnits K (n + d) := by + induction d with + | zero => + refine ⟨1, ?_⟩ + change (y : 𝒪[K]ˣ) / normIntegerUnits K L (1 : 𝒪[L]ˣ) ∈ + principalUnits K (n + 0) + rw [(normIntegerUnits K L).map_one, div_one, Nat.add_zero] + exact y.2 + | succ d ih => + obtain ⟨x, hx⟩ := ih + let r : principalUnits K (n + d) := + ⟨(y : 𝒪[K]ˣ) / normIntegerUnits K L (x : 𝒪[L]ˣ), hx⟩ + have hnd : 1 ≤ n + d := le_trans hn (Nat.le_add_right n d) + obtain ⟨z, hz⟩ := + principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_div_lift_mem_succ + K L (n + d) hnd r + let x' : principalUnits L n := + ⟨(x : 𝒪[L]ˣ) * (z : 𝒪[L]ˣ), + (principalUnits L n).mul_mem x.2 + (principalUnits_antitone L (Nat.le_add_right n d) z.2)⟩ + refine ⟨x', ?_⟩ + have hzUnit : + (((r / principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L + (n + d) z : principalUnits K (n + d)) : 𝒪[K]ˣ) ∈ + principalUnits K ((n + d) + 1)) := hz + have hresEq : + (y : 𝒪[K]ˣ) / normIntegerUnits K L ((x' : principalUnits L n) : + 𝒪[L]ˣ) = + ((r / principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L + (n + d) z : principalUnits K (n + d)) : 𝒪[K]ˣ) := by + change + (y : 𝒪[K]ˣ) / normIntegerUnits K L ((x' : principalUnits L n) : + 𝒪[L]ˣ) = + (r : 𝒪[K]ˣ) / + ((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L + (n + d) z : principalUnits K (n + d)) : 𝒪[K]ˣ) + simp only [x', r, principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_apply, + (normIntegerUnits K L).map_mul] + simp [div_eq_mul_inv, mul_assoc, mul_comm] + rw [hresEq] + simpa [Nat.add_assoc] using hzUnit + +/-- Actual integral-closure correction term selected from the current finite +approximation error. -/ +noncomputable def chosenPrincipalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxCorrection + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) (y : principalUnits K n) (d : Nat) + (s : {x : principalUnits L n // + ((y : 𝒪[K]ˣ) / normIntegerUnits K L (x : 𝒪[L]ˣ)) ∈ + principalUnits K (n + d)}) : + principalUnits L (n + d) := + let r : principalUnits K (n + d) := + ⟨(y : 𝒪[K]ˣ) / normIntegerUnits K L (s.1 : 𝒪[L]ˣ), s.2⟩ + have hnd : 1 ≤ n + d := le_trans hn (Nat.le_add_right n d) + Classical.choose + (principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_div_lift_mem_succ + K L (n + d) hnd r) + +/-- Actual integral-closure coherent update step for finite principal-unit +norm approximations. -/ +noncomputable def principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxStep + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) (y : principalUnits K n) (d : Nat) + (s : {x : principalUnits L n // + ((y : 𝒪[K]ˣ) / normIntegerUnits K L (x : 𝒪[L]ˣ)) ∈ + principalUnits K (n + d)}) : + {x : principalUnits L n // + ((y : 𝒪[K]ˣ) / normIntegerUnits K L (x : 𝒪[L]ˣ)) ∈ + principalUnits K (n + (d + 1))} := by + let r : principalUnits K (n + d) := + ⟨(y : 𝒪[K]ˣ) / normIntegerUnits K L (s.1 : 𝒪[L]ˣ), s.2⟩ + let z : principalUnits L (n + d) := + chosenPrincipalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxCorrection + K L n hn y d s + let x' : principalUnits L n := + ⟨(s.1 : 𝒪[L]ˣ) * (z : 𝒪[L]ˣ), + (principalUnits L n).mul_mem s.1.2 + (principalUnits_antitone L (Nat.le_add_right n d) z.2)⟩ + have hz : + (((r / principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L + (n + d) z : principalUnits K (n + d)) : 𝒪[K]ˣ) ∈ + principalUnits K ((n + d) + 1)) := + by + have hnd : 1 ≤ n + d := le_trans hn (Nat.le_add_right n d) + dsimp [z, chosenPrincipalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxCorrection] + exact Classical.choose_spec + (principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_div_lift_mem_succ + K L (n + d) hnd r) + refine ⟨x', ?_⟩ + have hresEq : + (y : 𝒪[K]ˣ) / normIntegerUnits K L (x' : 𝒪[L]ˣ) = + ((r / principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L + (n + d) z : principalUnits K (n + d)) : 𝒪[K]ˣ) := by + change + (y : 𝒪[K]ˣ) / normIntegerUnits K L (x' : 𝒪[L]ˣ) = + (r : 𝒪[K]ˣ) / + ((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L + (n + d) z : principalUnits K (n + d)) : 𝒪[K]ˣ) + simp only [x', r, principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_apply, + (normIntegerUnits K L).map_mul] + exact div_mul_eq_div_div _ _ _ + rw [hresEq] + simpa [Nat.add_assoc] using hz + +/-- The quotient between successive actual integral-closure approximation +states lies in the expected depth. -/ +theorem principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxStep_div_mem + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) (y : principalUnits K n) (d : Nat) + (s : {x : principalUnits L n // + ((y : 𝒪[K]ˣ) / normIntegerUnits K L (x : 𝒪[L]ˣ)) ∈ + principalUnits K (n + d)}) : + (((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxStep + K L n hn y d s).1 : 𝒪[L]ˣ) / + (s.1 : 𝒪[L]ˣ)) ∈ principalUnits L (n + d) := by + let z : principalUnits L (n + d) := + chosenPrincipalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxCorrection + K L n hn y d s + change (((s.1 : 𝒪[L]ˣ) * (z : 𝒪[L]ˣ)) / (s.1 : 𝒪[L]ˣ)) ∈ + principalUnits L (n + d) + rw [mul_div_cancel_left] + exact z.2 + +/-- Actual integral-closure coherent finite principal-unit norm +approximations. -/ +noncomputable def principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) (y : principalUnits K n) : + (d : Nat) → + {x : principalUnits L n // + ((y : 𝒪[K]ˣ) / normIntegerUnits K L (x : 𝒪[L]ˣ)) ∈ + principalUnits K (n + d)} + | 0 => by + refine ⟨1, ?_⟩ + change (y : 𝒪[K]ˣ) / normIntegerUnits K L (1 : 𝒪[L]ˣ) ∈ + principalUnits K (n + 0) + rw [(normIntegerUnits K L).map_one, div_one, Nat.add_zero] + exact y.2 + | d + 1 => + principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxStep K L n hn y d + (principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y d) + +/-- Consecutive actual integral-closure approximation states differ by a +correction term in the expected depth. -/ +theorem principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState_succ_div_mem + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) (y : principalUnits K n) (d : Nat) : + ((((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y (d + 1)).1 : principalUnits L n) : 𝒪[L]ˣ) / + (((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y d).1 : principalUnits L n) : 𝒪[L]ˣ)) ∈ + principalUnits L (n + d) := by + change + (((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxStep K L n hn y d + (principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y d)).1 : 𝒪[L]ˣ) / + ((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y d).1 : 𝒪[L]ˣ)) ∈ principalUnits L (n + d) + exact principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxStep_div_mem + K L n hn y d + (principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y d) + +/-- The actual integral-closure correction sequence encoded by consecutive +coherent approximation states. -/ +noncomputable def + chosenPrincipalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxCorrectionSeq + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) (y : principalUnits K n) : + ∀ d : Nat, principalUnits L (n + d) := + fun d => + ⟨(((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y (d + 1)).1 : principalUnits L n) : 𝒪[L]ˣ) / + (((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y d).1 : principalUnits L n) : 𝒪[L]ˣ), + principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState_succ_div_mem + K L n hn y d⟩ + +/-- The finite product of the actual integral-closure correction sequence is +the corresponding coherent approximation state. -/ +theorem principalUnitsCorrectionProduct_approxCorrectionSeqOfIsIntegralClosure + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) (y : principalUnits K n) (d : Nat) : + principalUnitsCorrectionProduct L n + (chosenPrincipalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxCorrectionSeq + K L n hn y) d = + (((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y d).1 : principalUnits L n) : 𝒪[L]ˣ) := by + induction d with + | zero => + simp [principalUnitsCorrectionProduct_zero, + principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState] + | succ d ih => + rw [principalUnitsCorrectionProduct_succ, ih] + change + (((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y d).1 : principalUnits L n) : 𝒪[L]ˣ) * + ((((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y (d + 1)).1 : principalUnits L n) : 𝒪[L]ˣ) / + (((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y d).1 : principalUnits L n) : 𝒪[L]ˣ)) = + (((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y (d + 1)).1 : principalUnits L n) : 𝒪[L]ˣ) + rw [mul_comm, div_mul_cancel] + +/-- The actual integral-closure coherent finite approximation states have a +principal-unit limit. This is the unramified infinite-product step specialized +to the actual correction terms generated above. -/ +theorem exists_tendsto_principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) (y : principalUnits K n) : + ∃ x : principalUnits L n, Filter.Tendsto + (fun d : Nat => + ((((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y d).1 : principalUnits L n) : 𝒪[L]ˣ) : 𝒪[L])) + Filter.atTop (nhds (((x : principalUnits L n) : 𝒪[L]ˣ) : 𝒪[L])) := by + obtain ⟨x, hx⟩ := + exists_tendsto_principalUnitsCorrectionProduct_principalUnit L n hn + (chosenPrincipalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxCorrectionSeq + K L n hn y) + refine ⟨x, ?_⟩ + have hseq : + (fun d : Nat => + ((principalUnitsCorrectionProduct L n + (chosenPrincipalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxCorrectionSeq + K L n hn y) d : 𝒪[L]ˣ) : 𝒪[L])) = + (fun d : Nat => + ((((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y d).1 : principalUnits L n) : 𝒪[L]ˣ) : 𝒪[L])) := by + funext d + rw [principalUnitsCorrectionProduct_approxCorrectionSeqOfIsIntegralClosure + K L n hn y d] + simpa [hseq] using hx + +/-- The actual integral-closure coherent approximation state has the +advertised finite-depth error bound. -/ +theorem principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState_error_mem + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) (y : principalUnits K n) (d : Nat) : + ((y : 𝒪[K]ˣ) / + normIntegerUnits K L + ((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y d).1 : 𝒪[L]ˣ)) ∈ + principalUnits K (n + d) := + (principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y d).2 + +/-- Actual integral-closure norm-continuity form used in principal-unit norm lifting. +It is derived from multiplicativity of the integer-unit norm and +the actual proof that the unramified norm preserves principal-unit levels. -/ +theorem eventually_normIntegerUnits_div_mem_principalUnits_of_tendsto_units_of_isIntegralClosure + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + {f : Nat → 𝒪[L]ˣ} {x : 𝒪[L]ˣ} (n : Nat) + (hf : Tendsto (fun d : Nat => ((f d : 𝒪[L]ˣ) : 𝒪[L])) atTop + (nhds ((x : 𝒪[L]ˣ) : 𝒪[L]))) : + ∀ᶠ d in atTop, + normIntegerUnits K L (f d) / normIntegerUnits K L x ∈ principalUnits K n := by + have hdiv := eventually_div_mem_principalUnits_of_tendsto_units L n hf + filter_upwards [hdiv] with d hd + have hnorm : normIntegerUnits K L (f d / x) ∈ principalUnits K n := + normIntegerUnits_mem_principalUnits_of_unramifiedValuation_of_isIntegralClosure + K L n (f d / x) hd + simpa [(normIntegerUnits K L).map_div] using hnorm + +/-- The limit of the actual integral-closure coherent approximation states +preserves all finite-depth error bounds. -/ +theorem + principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState_limit_error_mem_add_all + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) (y : principalUnits K n) + (x : principalUnits L n) + (hx : Tendsto + (fun d : Nat => + ((((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y d).1 : principalUnits L n) : 𝒪[L]ˣ) : 𝒪[L])) + atTop (nhds (((x : principalUnits L n) : 𝒪[L]ˣ) : 𝒪[L]))) : + ∀ d : Nat, + ((y : 𝒪[K]ˣ) / normIntegerUnits K L (x : 𝒪[L]ˣ)) ∈ + principalUnits K (n + d) := by + intro d + let f : Nat → 𝒪[L]ˣ := fun i => + (((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y i).1 : principalUnits L n) : 𝒪[L]ˣ) + have hnormEv : ∀ᶠ i in atTop, + normIntegerUnits K L (f i) / normIntegerUnits K L (x : 𝒪[L]ˣ) ∈ + principalUnits K (n + d) := by + exact + eventually_normIntegerUnits_div_mem_principalUnits_of_tendsto_units_of_isIntegralClosure + K L (n + d) hx + have hge : ∀ᶠ i : Nat in atTop, d ≤ i := eventually_ge_atTop d + rcases (hnormEv.and hge).exists with ⟨i, hboth⟩ + rcases hboth with ⟨hnorm, hdi⟩ + have herrDeep : + ((y : 𝒪[K]ˣ) / + normIntegerUnits K L + ((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y i).1 : 𝒪[L]ˣ)) ∈ + principalUnits K (n + i) := + principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState_error_mem + K L n hn y i + have herr : + ((y : 𝒪[K]ˣ) / + normIntegerUnits K L + ((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y i).1 : 𝒪[L]ˣ)) ∈ + principalUnits K (n + d) := + principalUnits_antitone K (Nat.add_le_add_left hdi n) herrDeep + have heq : + (y : 𝒪[K]ˣ) / normIntegerUnits K L (x : 𝒪[L]ˣ) = + ((y : 𝒪[K]ˣ) / + normIntegerUnits K L + ((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y i).1 : 𝒪[L]ˣ)) * + (normIntegerUnits K L + ((principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y i).1 : 𝒪[L]ˣ) / + normIntegerUnits K L (x : 𝒪[L]ˣ)) := by + simp [div_eq_mul_inv, mul_assoc, mul_comm, mul_left_comm] + rw [heq] + exact (principalUnits K (n + d)).mul_mem herr (by simpa [f] using hnorm) + +/-- Actual integral-closure separatedness step: if the error of a candidate +principal-unit norm lift lies in every deeper principal-unit subgroup, the +candidate is exact. -/ +theorem principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_eq_of_error_mem_add_all + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + (n : Nat) (y : principalUnits K n) (x : principalUnits L n) + (h : ∀ d : Nat, + ((y : 𝒪[K]ˣ) / normIntegerUnits K L (x : 𝒪[L]ˣ)) ∈ + principalUnits K (n + d)) : + (y : 𝒪[K]ˣ) = normIntegerUnits K L (x : 𝒪[L]ˣ) := by + have hOne : + (y : 𝒪[K]ˣ) / normIntegerUnits K L (x : 𝒪[L]ˣ) = 1 := + principalUnits_eq_one_of_mem_add_all K n + ((y : 𝒪[K]ˣ) / normIntegerUnits K L (x : 𝒪[L]ˣ)) h + exact div_eq_one.mp hOne + +/-- Principal-unit norm surjectivity for actual integral closures: in a finite +unramified valuation extension, the integer-unit norm is +surjective on every `U^n`, `n ≥ 1`. -/ +theorem principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_surjective + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) : + Function.Surjective (principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L n) := by + intro y + obtain ⟨x, hx⟩ := + exists_tendsto_principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState + K L n hn y + refine ⟨x, ?_⟩ + have hmem := + principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState_limit_error_mem_add_all + K L n hn y x hx + have hEq : + (y : 𝒪[K]ˣ) = normIntegerUnits K L (x : 𝒪[L]ˣ) := + principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_eq_of_error_mem_add_all + K L n y x hmem + apply Subtype.ext + simpa [principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_apply] using hEq.symm + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean new file mode 100644 index 0000000000..2aa24aee7f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean @@ -0,0 +1,250 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueGalois +/-! Provides the public declarations in the + `LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide` Lean module. -/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace LocalClassFieldTheory + +open scoped ValuativeRel +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +/-- States the theorem `normIntegerUnits_to_fieldUnits`. -/ +theorem normIntegerUnits_to_fieldUnits (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [LocalFieldTheory.ValuativeExtension K L] (u : 𝒪[L]ˣ) : + integerUnitsToFieldUnits K (normIntegerUnits K L u) = + LocalFieldTheory.normUnits K L (integerUnitsToFieldUnits L u) := by + ext + rfl + +/-- Actual integral-closure version of the integer-unit norm product formula. + +This is the unramified norm calculation input that embeds `N(u)` back into `𝒪[L]` and +identifies it with the product of Galois conjugates of `u`; the Galois action +on `𝒪[L]` is produced from integral closure, not from a valuation-invariance +certificate. -/ +theorem integerUnitsMap_normIntegerUnits_eq_galoisGroup_prod_of_isIntegralClosure + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [LocalFieldTheory.ValuativeExtension K L] + (u : 𝒪[L]ˣ) : + integerUnitsMapOfValuationExtension K L (normIntegerUnits K L u) = + Finset.univ.prod (fun σ : Gal(L/K) => + Units.mapEquiv + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ).toMulEquiv u) := by + ext + have hfield := mapBaseUnits_normUnits_eq_prod_gal (K := K) (L := L) + (integerUnitsToFieldUnits L u) + have hfield' := congrArg (fun z : Lˣ => (z : L)) hfield + simp only [mapBaseUnitsToExtensionUnits_apply_coe, normUnits_apply_coe, + integerUnitsToFieldUnits_apply] at hfield' + change (algebraMap K L (((normIntegerUnits K L u : 𝒪[K]ˣ) : 𝒪[K]) : K)) = + (((Finset.univ.prod (fun σ : Gal(L/K) => + Units.mapEquiv + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ).toMulEquiv u) : 𝒪[L]ˣ) : + 𝒪[L]) : L) + rw [normIntegerUnits_apply_coe] + simpa [galoisGroupIntegerRingEquivOfIsIntegralClosure_apply] using hfield' + +/-- The product of actual integral-closure Galois conjugates preserves every +principal-unit level. -/ +theorem galoisGroup_prod_mem_principalUnits_of_isIntegralClosure (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) (u : 𝒪[L]ˣ) (hu : u ∈ principalUnits L n) : + Finset.univ.prod (fun σ : Gal(L/K) => + Units.mapEquiv + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ).toMulEquiv u) ∈ + principalUnits L n := by + simpa using (Subgroup.prod_mem (principalUnits L n) (t := Finset.univ) + (f := fun σ : Gal(L/K) => + Units.mapEquiv + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ).toMulEquiv u) + (fun σ _ => + principalUnits_integerRingEquiv_mem_self L n + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) u hu)) + +/-- Actual integral-closure version: after embedding `N(u)` back into `𝒪[L]`, +the result remains in the same principal-unit level. -/ +theorem integerUnitsMap_normIntegerUnits_mem_principalUnits_of_isIntegralClosure + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [LocalFieldTheory.ValuativeExtension K L] + (n : Nat) (u : 𝒪[L]ˣ) (hu : u ∈ principalUnits L n) : + integerUnitsMapOfValuationExtension K L (normIntegerUnits K L u) ∈ + principalUnits L n := by + rw [integerUnitsMap_normIntegerUnits_eq_galoisGroup_prod_of_isIntegralClosure K L u] + exact galoisGroup_prod_mem_principalUnits_of_isIntegralClosure K L n u hu + +/-- Actual integral-closure version of the base-extended norm on `U_L^n`. + +This is the source map for the unramified norm product calculation; it +asserts only that the embedded norm remains in `U_L^n`. -/ +noncomputable def principalUnitsNormExtensionSideOfIsIntegralClosure (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [LocalFieldTheory.ValuativeExtension K L] (n : Nat) : + principalUnits L n →* principalUnits L n where + toFun u := + ⟨integerUnitsMapOfValuationExtension K L (normIntegerUnits K L u.1), + integerUnitsMap_normIntegerUnits_mem_principalUnits_of_isIntegralClosure + K L n u.1 u.2⟩ + map_one' := by + ext + simp [integerUnitsMapOfValuationExtension] + map_mul' := by + intro u v + ext + simp [integerUnitsMapOfValuationExtension] + +/-- States the theorem `principalUnitsNormExtensionSideOfIsIntegralClosure_apply`. -/ +@[simp] +theorem principalUnitsNormExtensionSideOfIsIntegralClosure_apply (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [LocalFieldTheory.ValuativeExtension K L] + (n : Nat) (u : principalUnits L n) : + ((principalUnitsNormExtensionSideOfIsIntegralClosure K L n u : + principalUnits L n) : 𝒪[L]ˣ) = + integerUnitsMapOfValuationExtension K L (normIntegerUnits K L u.1) := + rfl + +/-- Actual integral-closure version: the base-extended norm on `U_L^n` is the +product of the actual integral-closure real Galois actions. -/ +theorem principalUnitsNormExtensionSideOfIsIntegralClosure_eq_galoisGroup_prod + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [LocalFieldTheory.ValuativeExtension K L] + (n : Nat) (u : principalUnits L n) : + principalUnitsNormExtensionSideOfIsIntegralClosure K L n u = + Finset.univ.prod (fun σ : Gal(L/K) => + galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure K L n σ u) := by + apply Subtype.ext + simpa [principalUnitsNormExtensionSideOfIsIntegralClosure_apply, + galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure_apply] using + integerUnitsMap_normIntegerUnits_eq_galoisGroup_prod_of_isIntegralClosure K L u.1 + +/-- Actual integral-closure version of the first-order norm-product +calculation before residue trace identification. -/ +theorem + principalUnitsNormExtensionSide_oneAdd_sub_one_sub_sum_mem_maximalIdeal_pow_succ + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] [FiniteDimensional K L] + [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [LocalFieldTheory.ValuativeExtension K L] + (n : Nat) (hn : 1 ≤ n) (a : (𝓂[L] ^ n : Ideal 𝒪[L])) : + (((principalUnitsNormExtensionSideOfIsIntegralClosure K L n + (principalUnitOneAddOfMemPowSubgroup L hn (a : 𝒪[L]) a.2) : + principalUnits L n) : 𝒪[L]ˣ) : 𝒪[L]) - 1 - + (Finset.univ.sum fun σ : Gal(L/K) => + galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ (a : 𝒪[L])) ∈ + (𝓂[L] ^ (n + 1) : Ideal 𝒪[L]) := by + classical + rw [principalUnitsNormExtensionSideOfIsIntegralClosure_eq_galoisGroup_prod K L n + (principalUnitOneAddOfMemPowSubgroup L hn (a : 𝒪[L]) a.2)] + simpa [galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure, + principalUnitsMapEquivOfIntegerRingEquiv, + principalUnitOneAddOfMemPowSubgroup, principalUnitOneAddOfMemPow_val] + using + galoisGroup_prod_one_add_sub_one_sub_sum_mem_maximalIdeal_pow_succ_of_isIntegralClosure + K L n hn a + +/-- Actual integral-closure version of the base-extended norm on successive +principal-unit quotients. -/ +def principalUnitsSuccQuotNormExtensionSideOfIsIntegralClosure (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [LocalFieldTheory.ValuativeExtension K L] (n : Nat) : + PrincipalUnitsSuccQuot L n →* PrincipalUnitsSuccQuot L n := + QuotientGroup.map + ((principalUnits L (n + 1)).subgroupOf (principalUnits L n)) + ((principalUnits L (n + 1)).subgroupOf (principalUnits L n)) + (principalUnitsNormExtensionSideOfIsIntegralClosure K L n) + (by + intro u hu + change ((principalUnitsNormExtensionSideOfIsIntegralClosure K L n u : + principalUnits L n) : 𝒪[L]ˣ) ∈ principalUnits L (n + 1) + simpa [principalUnitsNormExtensionSideOfIsIntegralClosure_apply] using + integerUnitsMap_normIntegerUnits_mem_principalUnits_of_isIntegralClosure + K L (n + 1) u.1 hu) + +/-- States the theorem `principalUnitsSuccQuotNormExtensionSideOfIsIntegralClosure_mk`. -/ +@[simp] +theorem principalUnitsSuccQuotNormExtensionSideOfIsIntegralClosure_mk + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [LocalFieldTheory.ValuativeExtension K L] + (n : Nat) (u : principalUnits L n) : + principalUnitsSuccQuotNormExtensionSideOfIsIntegralClosure K L n + (QuotientGroup.mk u) = + QuotientGroup.mk + (principalUnitsNormExtensionSideOfIsIntegralClosure K L n u) := + rfl + +/-- Actual integral-closure version: on `U_L^n/U_L^(n+1)`, the base-extended +norm is the product of the induced actual real Galois actions. -/ +theorem principalUnitsSuccQuotNormExtensionSideOfIsIntegralClosure_eq_galoisGroup_prod + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [LocalFieldTheory.ValuativeExtension K L] + (n : Nat) (x : PrincipalUnitsSuccQuot L n) : + principalUnitsSuccQuotNormExtensionSideOfIsIntegralClosure K L n x = + Finset.univ.prod (fun σ : Gal(L/K) => + galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ x) := by + refine QuotientGroup.induction_on x ?_ + intro u + rw [principalUnitsSuccQuotNormExtensionSideOfIsIntegralClosure_mk, + principalUnitsNormExtensionSideOfIsIntegralClosure_eq_galoisGroup_prod] + change (principalUnitsSuccQuotMk L n) + (Finset.univ.prod (fun σ : Gal(L/K) => + galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure K L n σ u)) = + Finset.univ.prod (fun σ : Gal(L/K) => + (principalUnitsSuccQuotMk L n) + (galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure K L n σ u)) + exact map_prod (principalUnitsSuccQuotMk L n) + (fun σ : Gal(L/K) => + galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure K L n σ u) Finset.univ + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Trace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Trace.lean new file mode 100644 index 0000000000..09c2ff1d6a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Trace.lean @@ -0,0 +1,355 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic +/-! Provides the public declarations in the + `LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace` Lean module. -/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace LocalClassFieldTheory + +open scoped ValuativeRel +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField +open Filter + +namespace UnramifiedPrincipalUnits + +/-- For the integral-closure base-uniformizer representative +`1 + rϖ_L^n`, the norm after base extension back to `L` is residue trace on +the associated graded quotient. -/ +theorem quotientNorm_oneAdd_uniformizerPow_eq_trace + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) (r : 𝒪[L]) : + let πL := integerRingMapOfValuationExtension K L (chosenIntegerRingUniformizer K) + let hπL := integerRingMap_uniformizer_irreducible_of_unramifiedValuation K L + let a : (𝓂[L] ^ n : Ideal 𝒪[L]) := + maximalIdealPowMulUniformizerPowMap L πL hπL n r + Additive.ofMul + (principalUnitsSuccQuotMapOfUnramifiedValuation K L n + (principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure K L n + (principalUnitsSuccQuotMk L n + (principalUnitOneAddOfMemPowSubgroup L hn (a : 𝒪[L]) a.2)))) = + (principalUnitsSuccQuotAddEquivResidueOfIrreducible L πL hπL n hn).symm + (algebraMap 𝓀[K] 𝓀[L] + (Algebra.trace 𝓀[K] 𝓀[L] (IsLocalRing.residue 𝒪[L] r))) := by + classical + intro πL hπL a + let b : (𝓂[L] ^ n : Ideal 𝒪[L]) := + ⟨Finset.univ.sum fun σ : Gal(L/K) => + galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ (a : 𝒪[L]), + by + exact Ideal.sum_mem _ fun σ _ => + (integerRingEquiv_mem_maximalIdeal_pow L + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) n + (a : 𝒪[L])).2 a.2⟩ + have hnorm := + principalUnitsSuccQuotMap_normOfUnramifiedValuationOfIsIntegralClosure_oneAdd_base_eq_sum + K L n hn a + change Additive.ofMul + (principalUnitsSuccQuotMapOfUnramifiedValuation K L n + (principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure K L n + (principalUnitsSuccQuotMk L n + (principalUnitOneAddOfMemPowSubgroup L hn (a : 𝒪[L]) a.2)))) = + (principalUnitsSuccQuotAddEquivResidueOfIrreducible L πL hπL n hn).symm + (algebraMap 𝓀[K] 𝓀[L] + (Algebra.trace 𝓀[K] 𝓀[L] (IsLocalRing.residue 𝒪[L] r))) + rw [hnorm] + rw [principalUnitsSuccQuotAddEquivResidueOfIrreducible_symm_apply] + change Additive.ofMul (principalUnitsSuccQuotOfIdealPow L n hn b) = + principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd L n hn + (residueAddEquivMaximalIdealPowSuccQuotOfIrreducible L πL hπL n + (algebraMap 𝓀[K] 𝓀[L] + (Algebra.trace 𝓀[K] 𝓀[L] (IsLocalRing.residue 𝒪[L] r)))) + rw [← principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_mk L n hn b] + change principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd L n hn + (maximalIdealPowSuccQuotMk L n b) = + principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd L n hn + (residueAddEquivMaximalIdealPowSuccQuotOfIrreducible L πL hπL n + (algebraMap 𝓀[K] 𝓀[L] + (Algebra.trace 𝓀[K] 𝓀[L] (IsLocalRing.residue 𝒪[L] r)))) + congr 1 + have hb_eq : + (b : 𝒪[L]) = + (Finset.univ.sum fun σ : Gal(L/K) => + galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ r) * πL ^ n := by + simpa [b, a, πL] using + galoisGroup_sum_mul_base_uniformizer_pow_eq_coeff_sum_of_isIntegralClosure K L n r + rw [show maximalIdealPowSuccQuotMk L n b = + maximalIdealPowSuccQuotMulUniformizerPowMap L πL hπL n + (Finset.univ.sum fun σ : Gal(L/K) => + galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ r) by + rw [maximalIdealPowSuccQuotMulUniformizerPowMap_apply] + apply congrArg (maximalIdealPowSuccQuotMk L n) + apply Subtype.ext + calc + (b : 𝒪[L]) = (Finset.univ.sum fun σ : Gal(L/K) => + galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ r) * πL ^ n := hb_eq + _ = + ((maximalIdealPowMulUniformizerPowMap L πL hπL n + (Finset.univ.sum fun σ : Gal(L/K) => + galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ r) : + (𝓂[L] ^ n : Ideal 𝒪[L])) : 𝒪[L]) := by + rw [maximalIdealPowMulUniformizerPowMap_apply]] + exact + galoisSum_uniformizerGraded_eq_residueTrace + K L n r + +end UnramifiedPrincipalUnits + +/-- Actual integral-closure version: for the base-uniformizer representative +`1 + rϖ_L^n`, the norm on `U_L^n/U_L^(n+1)` is the residue-field trace class +on `U_K^n/U_K^(n+1)`. -/ +theorem + principalUnitsSuccQuotNorm_oneAdd_uniformizer_pow_eq_trace + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) (r : 𝒪[L]) : + let πK := chosenIntegerRingUniformizer K + let πL := integerRingMapOfValuationExtension K L πK + let hπL := integerRingMap_uniformizer_irreducible_of_unramifiedValuation K L + let a : (𝓂[L] ^ n : Ideal 𝒪[L]) := + maximalIdealPowMulUniformizerPowMap L πL hπL n r + Additive.ofMul + (principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure K L n + (principalUnitsSuccQuotMk L n + (principalUnitOneAddOfMemPowSubgroup L hn (a : 𝒪[L]) a.2))) = + (principalUnitsSuccQuotAddEquivResidueOfIrreducible K πK + (chosenIntegerRingUniformizer_irreducible K) n hn).symm + (Algebra.trace 𝓀[K] 𝓀[L] (IsLocalRing.residue 𝒪[L] r)) := by + classical + intro πK πL hπL a + let x := + principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure K L n + (principalUnitsSuccQuotMk L n + (principalUnitOneAddOfMemPowSubgroup L hn (a : 𝒪[L]) a.2)) + let y := + (principalUnitsSuccQuotAddEquivResidueOfIrreducible K πK + (chosenIntegerRingUniformizer_irreducible K) n hn).symm + (Algebra.trace 𝓀[K] 𝓀[L] (IsLocalRing.residue 𝒪[L] r)) + have hxmap : + MonoidHom.toAdditive (principalUnitsSuccQuotMapOfUnramifiedValuation K L n) + (Additive.ofMul x) = + (principalUnitsSuccQuotAddEquivResidueOfIrreducible L πL hπL n hn).symm + (algebraMap 𝓀[K] 𝓀[L] + (Algebra.trace 𝓀[K] 𝓀[L] (IsLocalRing.residue 𝒪[L] r))) := by + simpa [x, πK, πL, hπL, a] using + UnramifiedPrincipalUnits.quotientNorm_oneAdd_uniformizerPow_eq_trace + K L n hn r + have hymap : + MonoidHom.toAdditive (principalUnitsSuccQuotMapOfUnramifiedValuation K L n) y = + (principalUnitsSuccQuotAddEquivResidueOfIrreducible L πL hπL n hn).symm + (algebraMap 𝓀[K] 𝓀[L] + (Algebra.trace 𝓀[K] 𝓀[L] (IsLocalRing.residue 𝒪[L] r))) := by + simpa [y, πK, πL, hπL, residueFieldMapOfValuationExtension_eq_algebraMap] using + principalUnitsSuccQuotAddEquivResidueOfIrreducible_symm_map K L n hn + (Algebra.trace 𝓀[K] 𝓀[L] (IsLocalRing.residue 𝒪[L] r)) + have hmul : x = Additive.toMul y := by + apply principalUnitsSuccQuotMapOfUnramifiedValuation_injective K L n hn + apply Additive.ofMul.injective + change MonoidHom.toAdditive (principalUnitsSuccQuotMapOfUnramifiedValuation K L n) + (Additive.ofMul x) = + MonoidHom.toAdditive (principalUnitsSuccQuotMapOfUnramifiedValuation K L n) y + exact hxmap.trans hymap.symm + change Additive.ofMul x = y + simpa using congrArg Additive.ofMul hmul + +/-- Actual integral-closure version: in residue coordinates, the norm on the +successive principal-unit quotient is the finite residue-field trace. -/ +theorem principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure_trace_coord + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) (x : 𝓀[L]) : + let πK := chosenIntegerRingUniformizer K + let πL := integerRingMapOfValuationExtension K L πK + let hπL := integerRingMap_uniformizer_irreducible_of_unramifiedValuation K L + let eK := principalUnitsSuccQuotAddEquivResidueOfIrreducible K πK + (chosenIntegerRingUniformizer_irreducible K) n hn + let eL := principalUnitsSuccQuotAddEquivResidueOfIrreducible L πL hπL n hn + MonoidHom.toAdditive + (principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure K L n) + (eL.symm x) = + eK.symm (Algebra.trace 𝓀[K] 𝓀[L] x) := by + classical + intro πK πL hπL eK eL + obtain ⟨r, rfl⟩ := IsLocalRing.residue_surjective x + have hrep := + principalUnitsSuccQuotNorm_oneAdd_uniformizer_pow_eq_trace + K L n hn r + rw [principalUnitsSuccQuotAddEquivResidueOfIrreducible_symm_residue] + change Additive.ofMul _ = _ + simpa only [eK, eL, πK, πL, hπL, toMul_ofMul] using hrep + +/-- The residue-trace model for the actual unramified norm on +`U^n/U^(n+1)`, written in the base-uniformizer coordinates. -/ +noncomputable def principalUnitsSuccQuotTraceOfUnramifiedValuation (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) : + Additive (PrincipalUnitsSuccQuot L n) →+ Additive (PrincipalUnitsSuccQuot K n) := + let πK := chosenIntegerRingUniformizer K + let πL := integerRingMapOfValuationExtension K L πK + let hπL := integerRingMap_uniformizer_irreducible_of_unramifiedValuation K L + ((principalUnitsSuccQuotAddEquivResidueOfIrreducible K πK + (chosenIntegerRingUniformizer_irreducible K) n hn).symm.toAddMonoidHom).comp + ((Algebra.trace 𝓀[K] 𝓀[L]).toAddMonoidHom.comp + (principalUnitsSuccQuotAddEquivResidueOfIrreducible L πL hπL n hn).toAddMonoidHom) + +/-- States the theorem `principalUnitsSuccQuotTraceOfUnramifiedValuation_apply`. -/ +theorem principalUnitsSuccQuotTraceOfUnramifiedValuation_apply + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) (x : Additive (PrincipalUnitsSuccQuot L n)) : + let πK := chosenIntegerRingUniformizer K + let πL := integerRingMapOfValuationExtension K L πK + let hπL := integerRingMap_uniformizer_irreducible_of_unramifiedValuation K L + principalUnitsSuccQuotTraceOfUnramifiedValuation K L n hn x = + (principalUnitsSuccQuotAddEquivResidueOfIrreducible K πK + (chosenIntegerRingUniformizer_irreducible K) n hn).symm + (Algebra.trace 𝓀[K] 𝓀[L] + (principalUnitsSuccQuotAddEquivResidueOfIrreducible L πL hπL n hn x)) := + rfl + +/-- The residue-trace model on successive principal-unit quotients is +surjective in the unramified valuation case. -/ +theorem principalUnitsSuccQuotTraceOfUnramifiedValuation_surjective + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) : + Function.Surjective (principalUnitsSuccQuotTraceOfUnramifiedValuation K L n hn) := by + classical + intro y + let πK := chosenIntegerRingUniformizer K + let πL := integerRingMapOfValuationExtension K L πK + let hπL := integerRingMap_uniformizer_irreducible_of_unramifiedValuation K L + let eK := principalUnitsSuccQuotAddEquivResidueOfIrreducible K πK + (chosenIntegerRingUniformizer_irreducible K) n hn + let eL := principalUnitsSuccQuotAddEquivResidueOfIrreducible L πL hπL n hn + obtain ⟨x, hx⟩ := + residueField_trace_surjective_of_valuationExtension K L (eK y) + refine ⟨eL.symm x, ?_⟩ + change + (((eK.symm.toAddMonoidHom).comp + ((Algebra.trace 𝓀[K] 𝓀[L]).toAddMonoidHom.comp eL.toAddMonoidHom)) + (eL.symm x)) = y + simp [hx] + +/-- Actual integral-closure version: the unramified norm on every successive +principal-unit quotient is the finite residue-field trace in base-uniformizer +coordinates. -/ +theorem principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure_eq_trace + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) : + MonoidHom.toAdditive + (principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure K L n) = + principalUnitsSuccQuotTraceOfUnramifiedValuation K L n hn := by + apply AddMonoidHom.ext + intro x + let πK := chosenIntegerRingUniformizer K + let πL := integerRingMapOfValuationExtension K L πK + let hπL := integerRingMap_uniformizer_irreducible_of_unramifiedValuation K L + let eL := principalUnitsSuccQuotAddEquivResidueOfIrreducible L πL hπL n hn + have hcoord := + principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure_trace_coord + K L n hn (eL x) + simpa [principalUnitsSuccQuotTraceOfUnramifiedValuation, πK, πL, hπL, eL] + using hcoord + +/-- Actual integral-closure version: on every successive principal-unit +quotient, the unramified norm is surjective after writing the quotient +additively. -/ +theorem principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure_toAdditive_surjective + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) : + Function.Surjective + (MonoidHom.toAdditive + (principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure K L n)) := by + rw [principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure_eq_trace + K L n hn] + exact principalUnitsSuccQuotTraceOfUnramifiedValuation_surjective K L n hn + +/-- Actual integral-closure version: on every successive principal-unit +quotient, the unramified norm is surjective. -/ +theorem principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure_surjective + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) : + Function.Surjective + (principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure K L n) := by + intro y + obtain ⟨x, hx⟩ := + principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure_toAdditive_surjective + K L n hn (Additive.ofMul y) + refine ⟨Additive.toMul x, ?_⟩ + apply Additive.ofMul.injective + change MonoidHom.toAdditive + (principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure K L n) + (Additive.ofMul (Additive.toMul x)) = Additive.ofMul y + simpa using hx + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean new file mode 100644 index 0000000000..d74c8ae936 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean @@ -0,0 +1,220 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Lift +/-! Provides the public declarations in the + `LocalClassFieldTheory.Finite.Unramified.ResidueNorm` Lean module. -/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace LocalClassFieldTheory + +open scoped ValuativeRel +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +/-- The integral-closure quotient norm on first +principal-unit quotients in an unramified valuation extension. This is the +the unramified norm calculation residue-unit quotient before the later `U^1` lifting. -/ +noncomputable def integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + IntegerUnitsModPrincipalUnits L →* IntegerUnitsModPrincipalUnits K := + integerUnitsModPrincipalUnitsLift + ((integerUnitsModPrincipalUnitsMk K).comp (normIntegerUnits K L)) + (by + intro u hu + rw [MonoidHom.mem_ker, MonoidHom.comp_apply, + IntegerUnitsModPrincipalUnits_mk_eq_one_iff] + exact normIntegerUnits_mem_principalUnits_of_unramifiedValuation_of_isIntegralClosure + K L 1 u hu) + +/-- States the theorem `integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure_mk`. -/ +@[simp] +theorem integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure_mk + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (u : 𝒪[L]ˣ) : + integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure K L + (integerUnitsModPrincipalUnitsMk L u) = + integerUnitsModPrincipalUnitsMk K (normIntegerUnits K L u) := + integerUnitsModPrincipalUnitsLift_mk + ((integerUnitsModPrincipalUnitsMk K).comp (normIntegerUnits K L)) _ u + +/-- After extending the residue of the integer-unit norm back to `𝓀[L]`, it +is the product of the integral-closure residue actions. -/ +theorem residueUnitsMap_normIntegerUnits_eq_galoisGroup_residue_prod_of_isIntegralClosure + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (u : 𝒪[L]ˣ) : + residueUnitsMapOfValuationExtension K L + (integerUnitsToResidueUnits K (normIntegerUnits K L u)) = + Finset.univ.prod (fun σ : Gal(L/K) => + Units.mapEquiv + (galoisGroupResidueFieldEquivOfIsIntegralClosure K L σ).toMulEquiv + (integerUnitsToResidueUnits L u)) := by + rw [residueUnitsMap_integerUnitsToResidueUnits K L (normIntegerUnits K L u)] + rw [integerUnitsMap_normIntegerUnits_eq_galoisGroup_prod_of_isIntegralClosure K L u] + rw [map_prod] + apply Finset.prod_congr rfl + intro σ _ + exact + (galoisGroupResidueFieldEquivOfIsIntegralClosure_integerUnitsToResidueUnits + K L σ u).symm + +/-- AlgEquiv-typed form of +`residueUnitsMap_normIntegerUnits_eq_galoisGroup_residue_prod_of_isIntegralClosure`. -/ +theorem residueUnitsMap_normIntegerUnits_eq_galoisGroup_residue_algEquiv_prod_of_isIntegralClosure + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (u : 𝒪[L]ˣ) : + residueUnitsMapOfValuationExtension K L + (integerUnitsToResidueUnits K (normIntegerUnits K L u)) = + Finset.univ.prod (fun σ : Gal(L/K) => + Units.mapEquiv + (galoisGroupResidueAlgEquivOfIsIntegralClosure K L σ).toMulEquiv + (integerUnitsToResidueUnits L u)) := by + rw [residueUnitsMap_normIntegerUnits_eq_galoisGroup_residue_prod_of_isIntegralClosure + K L u] + apply Finset.prod_congr rfl + intro σ _ + apply Units.ext + rfl + +/-- Quotient-level form of the residue product formula for the +integer-unit norm. -/ +theorem integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure_residue_algEquiv_base_extend + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (x : IntegerUnitsModPrincipalUnits L) : + residueUnitsMapOfValuationExtension K L + (integerUnitsModPrincipalUnitsEquivResidueUnits K + (integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure K L x)) = + Finset.univ.prod (fun σ : Gal(L/K) => + Units.mapEquiv + (galoisGroupResidueAlgEquivOfIsIntegralClosure K L σ).toMulEquiv + (integerUnitsModPrincipalUnitsEquivResidueUnits L x)) := by + refine IntegerUnitsModPrincipalUnits.inductionOn + (motive := fun x => + residueUnitsMapOfValuationExtension K L + (integerUnitsModPrincipalUnitsEquivResidueUnits K + (integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure K L x)) = + Finset.univ.prod (fun σ : Gal(L/K) => + Units.mapEquiv + (galoisGroupResidueAlgEquivOfIsIntegralClosure K L σ).toMulEquiv + (integerUnitsModPrincipalUnitsEquivResidueUnits L x))) + x ?_ + intro u + rw [integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure_mk] + rw [integerUnitsModPrincipalUnitsEquivResidueUnits_mk] + rw [integerUnitsModPrincipalUnitsEquivResidueUnits_mk] + exact + residueUnitsMap_normIntegerUnits_eq_galoisGroup_residue_algEquiv_prod_of_isIntegralClosure + K L u + +/-- In the unramified valuation case, the integral-closure quotient norm +agrees after base extension with the quotient-level finite residue norm model. -/ +theorem + integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure_residue_base_extend_eq_residueNorm + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (x : IntegerUnitsModPrincipalUnits L) : + residueUnitsMapOfValuationExtension K L + (integerUnitsModPrincipalUnitsEquivResidueUnits K + (integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure K L x)) = + residueUnitsMapOfValuationExtension K L + (integerUnitsModPrincipalUnitsEquivResidueUnits K + (integerUnitsModPrincipalUnitsResidueNormOfValuationExtension K L x)) := by + rw [integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure_residue_algEquiv_base_extend] + rw [integerUnitsModPrincipalUnitsResidueNorm_base_extend_eq_prod_algEquiv] + exact + galoisGroupResidueAlgEquivOfIsIntegralClosure_prod_eq_prod_algEquiv_of_unramifiedValuation + K L (integerUnitsModPrincipalUnitsEquivResidueUnits L x) + +/-- In the unramified valuation case, the actual integral-closure quotient norm +on `𝒪[L]ˣ/U_L¹` is the quotient-level finite-field residue norm model. -/ +theorem + integerUnitsModPrincipalUnitsNorm_eq_residueNorm_of_unramifiedValuation + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure K L = + integerUnitsModPrincipalUnitsResidueNormOfValuationExtension K L := by + apply MonoidHom.ext + intro x + apply (integerUnitsModPrincipalUnitsEquivResidueUnits K).injective + apply residueUnitsMapOfValuationExtension_injective K L + exact + integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure_residue_base_extend_eq_residueNorm + K L x + +/-- The actual integral-closure quotient norm on `𝒪[L]ˣ/U_L¹` is surjective in +the unramified valuation case. -/ +theorem + integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure_surjective_of_unramifiedValuation + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [LocalFieldTheory.ValuativeExtension K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + Function.Surjective + (integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure K L) := by + rw [integerUnitsModPrincipalUnitsNorm_eq_residueNorm_of_unramifiedValuation + K L] + exact integerUnitsModPrincipalUnitsResidueNorm_surjective_of_valuationExtension K L + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Uniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Uniformizer.lean new file mode 100644 index 0000000000..40a16c55a5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Uniformizer.lean @@ -0,0 +1,63 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +/-! +# Actual unramified norm quotient uniformizer + +This file connects the real valuation quotient +`Kˣ / unramifiedNormSubgroup K n` from `NormSubgroup` with the chosen +inverse DVR uniformizer from `IdealQuotients`. This is the unramified norm calculation +uniformizer side of the local reciprocity construction, kept below +`NormSubgroup` to avoid importing the chosen-uniformizer layer into the generic +valuation quotient API. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace LocalClassFieldTheory + + +open scoped ValuativeRel +open LocalFieldTheory + +/-- the unramified norm calculation, valuation-quotient side: the chosen inverse prime +element has normalized value `1`, hence its class maps to `1 : ZMod n`. +This is the uniformizer-side source matching the normalized Frobenius model. -/ +theorem unramifiedNormQuotientEquivZMod_inverseIntegerRingUniformizerFieldUnit + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (n : Nat) : + unramifiedNormQuotientEquivZMod K n + (QuotientGroup.mk (inverseIntegerRingUniformizerFieldUnit K) : + Kˣ ⧸ unramifiedNormSubgroup K n) = + Multiplicative.ofAdd (1 : ZMod n) := by + rw [unramifiedNormQuotientEquivZMod_mk, valuationModDegreeMulHom_apply, + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_apply, + v_inverseIntegerRingUniformizerFieldUnit] + simp + +/-- Powers of the chosen inverse prime element in the valuation quotient. -/ +theorem unramifiedNormQuotientEquivZMod_inverseIntegerRingUniformizerFieldUnit_zpow + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (n : Nat) (m : Int) : + unramifiedNormQuotientEquivZMod K n + ((QuotientGroup.mk (inverseIntegerRingUniformizerFieldUnit K) : + Kˣ ⧸ unramifiedNormSubgroup K n) ^ m) = + Multiplicative.ofAdd (m : ZMod n) := by + rw [map_zpow, + unramifiedNormQuotientEquivZMod_inverseIntegerRingUniformizerFieldUnit] + rw [← ofAdd_zsmul] + simp [zsmul_eq_mul] + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean new file mode 100644 index 0000000000..0955cf53c8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean @@ -0,0 +1,347 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.GroupTheory.Abelianization.Defs +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Conductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison +/-! +# Conductors and unramified extensions + +For an unramified finite abelian extension, normalized valuation identifies +the norm subgroup and shows that all base-field units are norms. Hence its +conductor ideal is `1`. + +Conversely, conductor one identifies the norm quotient order with the residue +degree. Finite local reciprocity and the degree formula then force the +ramification index to be one. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open scoped ValuativeRel IsMulCommutative +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +private theorem normQuotientFiniteOfIsAbelianGalois + (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [Algebra K L] [FiniteDimensional K L] [IsAbelianGalois K L] : + Finite (NormQuotient K L) := by + exact Finite.of_equiv Gal(L/K) + ((Abelianization.equivOfComm (H := Gal(L/K))).trans + (abelianizationEquivNormQuotient K L)).toEquiv + +/-- If every base integer unit is a norm, the actual norm quotient is the +cyclic quotient of the normalized value group by the residue degree. + +This value-group comparison uses the separable norm-valuation formula for its +residue degree; no unramifiedness assumption is made here. -/ +noncomputable def + chosenNormQuotientEquivZModResidueFinrankOfFieldPrincipalUnitsZeroLe + (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (hU : LocalFieldTheory.fieldPrincipalUnits K 0 ≤ localNormSubgroup K L) : + NormQuotient K L ≃* + Multiplicative + (ZMod + (@Module.finrank 𝓀[K] 𝓀[L] _ _ + (IsLocalRing.ResidueField.instModule + (R := 𝒪[K]) + (S := 𝒪[L])))) := by + let vK := multiplicativeIntegerValuation K + let vL := multiplicativeIntegerValuation L + let ϖK := Classical.choose (multiplicativeIntegerValuation_exists_uniformizer K) + have hϖK := Classical.choose_spec (multiplicativeIntegerValuation_exists_uniformizer K) + let ϖL := Classical.choose (multiplicativeIntegerValuation_exists_uniformizer L) + have hϖL := Classical.choose_spec (multiplicativeIntegerValuation_exists_uniformizer L) + have hformula : + ∀ x : Lˣ, + vK.val (LocalFieldTheory.normUnits K L x) = + (@Module.finrank 𝓀[K] 𝓀[L] _ _ + (IsLocalRing.ResidueField.instModule + (R := 𝒪[K]) + (S := 𝒪[L])) : ℤ) * vL.val x := by + intro x + simpa [vK, vL, multiplicativeIntegerValuation] using + (v_normUnits_eq_residue_finrank_mul_of_isGalois K L x) + have hzero : + vK.zeroSubgroup ≤ LocalFieldTheory.DiscreteValuationField.fieldNormSubgroup K L := by + intro x hx + have hxval : valuationMap K (Additive.ofMul x) = 0 := by + change vK.val x = 0 at hx + simpa [vK, multiplicativeIntegerValuation, + valuationMap_apply] using hx + obtain ⟨u, hu⟩ := + (integerUnitsToFieldUnits_mem_range_iff_valuationMap_eq_zero K x).2 hxval + have hxU : x ∈ LocalFieldTheory.fieldPrincipalUnits K 0 := by + rw [← hu] + exact ⟨u, by simp, rfl⟩ + have hxnorm := hU hxU + simpa [LocalFieldTheory.DiscreteValuationField.fieldNormSubgroup, + localNormSubgroup] using hxnorm + have hsub : localNormSubgroup K L = + LocalFieldTheory.DiscreteValuationField.fieldNormSubgroup K L := by + rfl + exact (normQuotientEquivOfSubgroupEq K L + (LocalFieldTheory.DiscreteValuationField.fieldNormSubgroup K L) hsub).trans + (LocalFieldTheory.DiscreteValuationField.fieldNormQuotientEquivZMod + K L vK vL + (@Module.finrank 𝓀[K] 𝓀[L] _ _ + (IsLocalRing.ResidueField.instModule + (R := 𝒪[K]) + (S := 𝒪[L]))) + hformula hϖK hϖL hzero) + +/-- Finite local reciprocity gives the order of the norm quotient in a finite +abelian extension: it is the field degree. -/ +theorem card_normQuotient_eq_finrank_of_isAbelianGalois + (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [Algebra K L] [FiniteDimensional K L] [IsAbelianGalois K L] : + letI : Finite (NormQuotient K L) := + by exact normQuotientFiniteOfIsAbelianGalois K L + Nat.card (NormQuotient K L) = Module.finrank K L := by + let : Finite (NormQuotient K L) := + normQuotientFiniteOfIsAbelianGalois K L + let : Finite (Abelianization Gal(L/K)) := + Finite.of_equiv Gal(L/K) + (Abelianization.equivOfComm (H := Gal(L/K))).toEquiv + calc + Nat.card (NormQuotient K L) = + Nat.card (Abelianization Gal(L/K)) := + Nat.card_congr (abelianizationEquivNormQuotient K L).toEquiv.symm + _ = Nat.card Gal(L/K) := + Nat.card_congr (Abelianization.equivOfComm + (H := Gal(L/K))).toEquiv.symm + _ = Module.finrank K L := galoisGroup_card_eq_finrank K L + +/-- In an actual finite unramified abelian extension, every base-field +integer unit lies in the field-norm subgroup. -/ +theorem fieldPrincipalUnits_zero_le_normSubgroup_of_unramifiedValuation + (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsAbelianGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + LocalFieldTheory.fieldPrincipalUnits K 0 ≤ localNormSubgroup K L := by + rw [normSubgroup_eq_unramifiedNormSubgroup_of_isIntegralClosure K L] + rintro x ⟨u, _hu, rfl⟩ + apply (mem_unramifiedNormSubgroup_iff K (Module.finrank K L) _).2 + rw [valuationMap_apply, v_integerUnitsToFieldUnits] + exact dvd_zero _ + +/-- An unramified finite abelian extension has conductor exponent zero. -/ +theorem localConductorExponent_eq_zero_of_unramifiedValuation + (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsAbelianGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + localConductorExponent K L = 0 := by + exact (localConductorExponent_eq_zero_iff K L).2 + (fieldPrincipalUnits_zero_le_normSubgroup_of_unramifiedValuation K L) + +/-- An unramified finite abelian extension has conductor ideal `1`. -/ +theorem localConductorIdeal_eq_one_of_unramifiedValuation + (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsAbelianGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + localConductorIdeal K L = 1 := by + exact (localConductorIdeal_eq_one_iff_exponent_eq_zero K L).2 + (localConductorExponent_eq_zero_of_unramifiedValuation K L) + +/-- A finite abelian extension whose conductor ideal is `1` is unramified. + +The proof compares two computations of the actual norm quotient. Its order +is the residue degree by the norm-valuation formula and the conductor-one +unit inclusion, while finite local reciprocity gives the field degree. +Cancelling the positive residue degree gives ramification index one. -/ +theorem isFiniteUnramifiedValuationExtension_of_localConductorIdeal_eq_one + (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsAbelianGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + (hcond : localConductorIdeal K L = 1) : + LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L := by + have hU : LocalFieldTheory.fieldPrincipalUnits K 0 ≤ localNormSubgroup K L := + (localConductorIdeal_eq_one_iff K L).1 hcond + let hequiv := + chosenNormQuotientEquivZModResidueFinrankOfFieldPrincipalUnitsZeroLe + K L hU + let : Finite (NormQuotient K L) := + normQuotientFiniteOfIsAbelianGalois K L + have hcardResidue : + Nat.card (NormQuotient K L) = + @Module.finrank 𝓀[K] 𝓀[L] _ _ + (IsLocalRing.ResidueField.instModule + (R := 𝒪[K]) + (S := 𝒪[L])) := by + rw [Nat.card_congr hequiv.toEquiv] + exact Nat.card_zmod + (@Module.finrank 𝓀[K] 𝓀[L] _ _ + (IsLocalRing.ResidueField.instModule + (R := 𝒪[K]) + (S := 𝒪[L]))) + have hcardDegree : + Nat.card (NormQuotient K L) = Module.finrank K L := + card_normQuotient_eq_finrank_of_isAbelianGalois K L + have hDegreeEqResidue : + Module.finrank K L = + @Module.finrank 𝓀[K] 𝓀[L] _ _ + (IsLocalRing.ResidueField.instModule + (R := 𝒪[K]) + (S := 𝒪[L])) := + hcardDegree.symm.trans hcardResidue + have hdegree := + maximalIdeal_ramificationIdx_mul_residue_finrank_eq_finrank_of_isIntegralClosure + K L + have hp : (𝓂[K] : Ideal 𝒪[K]) ≠ ⊥ := + Ring.ne_bot_of_isMaximal_of_not_isField + (IsLocalRing.maximalIdeal.isMaximal 𝒪[K]) + (IsDiscreteValuationRing.not_isField 𝒪[K]) + have hdegreeNew : + (𝓂[L] : Ideal 𝒪[L]).ramificationIdx 𝒪[K] * + @Module.finrank 𝓀[K] 𝓀[L] _ _ + (IsLocalRing.ResidueField.instModule + (R := 𝒪[K]) + (S := 𝒪[L])) = + Module.finrank K L := by + rw [← Ideal.ramificationIdx'_eq_ramificationIdx _ _ hp] + exact hdegree + have hfpos : + 0 < @Module.finrank 𝓀[K] 𝓀[L] _ _ + (IsLocalRing.ResidueField.instModule + (R := 𝒪[K]) + (S := 𝒪[L])) := + Module.finrank_pos + have hcancel : + (𝓂[L] : Ideal 𝒪[L]).ramificationIdx 𝒪[K] * + @Module.finrank 𝓀[K] 𝓀[L] _ _ + (IsLocalRing.ResidueField.instModule + (R := 𝒪[K]) + (S := 𝒪[L])) = + 1 * @Module.finrank 𝓀[K] 𝓀[L] _ _ + (IsLocalRing.ResidueField.instModule + (R := 𝒪[K]) + (S := 𝒪[L])) := by + calc + _ = Module.finrank K L := hdegreeNew + _ = @Module.finrank 𝓀[K] 𝓀[L] _ _ + (IsLocalRing.ResidueField.instModule + (R := 𝒪[K]) + (S := 𝒪[L])) := hDegreeEqResidue + _ = 1 * @Module.finrank 𝓀[K] 𝓀[L] _ _ + (IsLocalRing.ResidueField.instModule + (R := 𝒪[K]) + (S := 𝒪[L])) := (one_mul _).symm + exact ⟨Nat.eq_of_mul_eq_mul_right hfpos hcancel⟩ + +/-- A finite abelian extension is unramified if and only if its conductor +ideal is `1`. -/ +theorem isFiniteUnramifiedValuationExtension_iff_localConductorIdeal_eq_one + (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsAbelianGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] : + LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L ↔ + localConductorIdeal K L = 1 := by + constructor + · intro hunramified + let : LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L := + hunramified + exact localConductorIdeal_eq_one_of_unramifiedValuation K L + · exact isFiniteUnramifiedValuationExtension_of_localConductorIdeal_eq_one K L + +/-- A concrete finite abelian local extension is unramified exactly when +its local conductor exponent is zero. -/ +theorem isUnramifiedValuedExtension_iff_localConductorExponent_eq_zero + (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsAbelianGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] : + IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L ↔ + localConductorExponent K L = 0 := + (isFiniteUnramifiedValuationExtension_iff_localConductorIdeal_eq_one + K L).trans + (localConductorIdeal_eq_one_iff_exponent_eq_zero K L) + +/-- Equivalently, a concrete finite abelian local extension is ramified +exactly when its local conductor exponent is nonzero. -/ +theorem + not_isUnramifiedValuedExtension_iff_localConductorExponent_ne_zero + (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsAbelianGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] : + ¬ IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L ↔ + localConductorExponent K L ≠ 0 := + not_congr + (isUnramifiedValuedExtension_iff_localConductorExponent_eq_zero + K L) + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite.lean new file mode 100644 index 0000000000..526d4bfd3b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite.lean @@ -0,0 +1,25 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtinRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotientTransitions +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotients +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteGaloisAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbstractProfiniteCompletionComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteAbelianQuotientKernels +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteReciprocityDiagram +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.LocalMultiplicativeCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletionCriteria +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteLocalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.TopologicalAbelianizationCongr + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtin.lean new file mode 100644 index 0000000000..58ff597e7d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtin.lean @@ -0,0 +1,246 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotientTransitions +/-! +# The absolute local Artin map from compatible finite quotients + +Finite local reciprocity supplies a surjective Artin map at every open +finite quotient of the absolute topological abelianization. This module +assembles those maps into the absolute Artin map and records its finite-stage +compatibility. +-/ + +@[expose] public section + +noncomputable +section + +open CategoryTheory + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The finite Artin coordinate at an open normal subgroup of the absolute +topological abelianization. -/ +noncomputable def absoluteFiniteArtinMap + (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) : + Kˣ →ₜ* (localAbsoluteAbelianProfinite K ⧸ N.toSubgroup) := + (ContinuousMonoidHom.toContinuousMonoidHom + (absoluteFiniteQuotientEquiv K N).symm).comp + (abelianLocalArtinMap K (absoluteFiniteQuotientField K N)) + +/-- Every finite coordinate of the absolute Artin map is onto. -/ +theorem absoluteFiniteArtinMap_surjective + (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) : + Function.Surjective (absoluteFiniteArtinMap K N) := + (absoluteFiniteQuotientEquiv K N).symm.surjective.comp + (abelianLocalArtinMap_surjective K + (absoluteFiniteQuotientField K N)) + +/-- The kernel of a finite absolute Artin coordinate is the ordinary norm +subgroup of its corresponding finite abelian fixed field. -/ +theorem absoluteFiniteArtinMap_ker + (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) : + (absoluteFiniteArtinMap K N).toMonoidHom.ker = + localNormSubgroup K (absoluteFiniteQuotientField K N) := by + rw [← abelianLocalArtinMap_ker K (absoluteFiniteQuotientField K N)] + ext a + simp only [MonoidHom.mem_ker, absoluteFiniteArtinMap] + constructor + · intro ha + apply (absoluteFiniteQuotientEquiv K N).symm.injective + simpa using ha + · intro ha + simpa using congrArg (absoluteFiniteQuotientEquiv K N).symm ha + +/-- Finite absolute Artin coordinates commute with quotient transition. -/ +theorem absoluteFiniteArtinMap_transition + {N M : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)} + (hNM : N ≤ M) : + (absoluteFiniteQuotientTransition hNM).comp + (absoluteFiniteArtinMap K N) = + absoluteFiniteArtinMap K M := by + apply ContinuousMonoidHom.ext + intro a + apply (absoluteFiniteQuotientEquiv K M).injective + change + absoluteFiniteQuotientEquiv K M + (absoluteFiniteQuotientTransition hNM + ((absoluteFiniteQuotientEquiv K N).symm + (abelianLocalArtinMap K + (absoluteFiniteQuotientField K N) a))) = + absoluteFiniteQuotientEquiv K M + ((absoluteFiniteQuotientEquiv K M).symm + (abelianLocalArtinMap K + (absoluteFiniteQuotientField K M) a)) + calc + _ = intermediateFieldRestrictContinuous K + (absoluteFiniteQuotientField K M) + (absoluteFiniteQuotientField K N) + (absoluteFiniteQuotientField_antitone hNM) + (absoluteFiniteQuotientEquiv K N + ((absoluteFiniteQuotientEquiv K N).symm + (abelianLocalArtinMap K + (absoluteFiniteQuotientField K N) a))) := by + exact (DFunLike.congr_fun + (absoluteFiniteQuotientEquiv_transition (K := K) hNM) + ((absoluteFiniteQuotientEquiv K N).symm + (abelianLocalArtinMap K + (absoluteFiniteQuotientField K N) a))).symm + _ = intermediateFieldRestrictContinuous K + (absoluteFiniteQuotientField K M) + (absoluteFiniteQuotientField K N) + (absoluteFiniteQuotientField_antitone hNM) + (abelianLocalArtinMap K + (absoluteFiniteQuotientField K N) a) := by + rw [(absoluteFiniteQuotientEquiv K N).apply_symm_apply] + _ = abelianLocalArtinMap K + (absoluteFiniteQuotientField K M) a := + DFunLike.congr_fun + (abelianLocalArtinMap_restrict K + (absoluteFiniteQuotientField K M) + (absoluteFiniteQuotientField K N) + (absoluteFiniteQuotientField_antitone hNM)) a + _ = _ := by + rw [(absoluteFiniteQuotientEquiv K M).apply_symm_apply] + +/-- The compatible cone of finite Artin coordinates, valued in the inverse +limit of all open finite quotients of the absolute abelianized Galois group. -/ +noncomputable def absoluteFiniteArtinLimit : ProfiniteGrp := + ProfiniteGrp.limit + ((localAbsoluteAbelianProfinite K).toFiniteQuotientFunctor ⋙ + forget₂ FiniteGrp ProfiniteGrp) + +/-- The topological abelianization of the absolute Galois group is +canonically the inverse limit of all of its finite quotients. -/ +noncomputable def absoluteGaloisAbelianizationLimitEquiv : + localAbsoluteAbelianProfinite K ≃ₜ* + absoluteFiniteArtinLimit K := + ProfiniteGrp.continuousMulEquivLimittoFiniteQuotientFunctor + (localAbsoluteAbelianProfinite K) + +/-- Defines `absoluteFiniteArtinLimitMap`. -/ +noncomputable def absoluteFiniteArtinLimitMap : + Kˣ →ₜ* (absoluteFiniteArtinLimit K : Type) where + toFun a := + ⟨fun N => absoluteFiniteArtinMap K N a, by + intro N M i + change + absoluteFiniteQuotientTransition (K := K) + (CategoryTheory.leOfHom i) + (absoluteFiniteArtinMap K N a) = + absoluteFiniteArtinMap K M a + exact DFunLike.congr_fun + (absoluteFiniteArtinMap_transition K + (CategoryTheory.leOfHom i)) a⟩ + map_one' := by + apply Subtype.ext + funext N + exact (absoluteFiniteArtinMap K N).map_one + map_mul' x y := by + apply Subtype.ext + funext N + exact (absoluteFiniteArtinMap K N).map_mul x y + continuous_toFun := by + apply continuous_induced_rng.mpr + apply continuous_pi + intro N + let : DiscreteTopology + (localAbsoluteAbelianProfinite K ⧸ N.toSubgroup) := + QuotientGroup.discreteTopology N.isOpen' + let q : + (localAbsoluteAbelianProfinite K ⧸ N.toSubgroup) →ₜ* + (((localAbsoluteAbelianProfinite K).toFiniteQuotientFunctor ⋙ + forget₂ FiniteGrp ProfiniteGrp).obj N : Type) := + { toFun := id + map_one' := rfl + map_mul' := by intro x y; rfl + continuous_toFun := continuous_of_discreteTopology } + exact q.continuous_toFun.comp + (absoluteFiniteArtinMap K N).continuous_toFun + +/-- States the theorem `absoluteFiniteArtinLimitMap_apply`. -/ +@[simp] +theorem absoluteFiniteArtinLimitMap_apply + (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) (a : Kˣ) : + (absoluteFiniteArtinLimitMap K a).1 N = + absoluteFiniteArtinMap K N a := + rfl + +/-- Surjectivity at every finite Artin coordinate makes the assembled cone +dense in the inverse limit. -/ +theorem absoluteFiniteArtinLimitMap_denseRange : + DenseRange (absoluteFiniteArtinLimitMap K) := by + apply dense_iff_inter_open.mpr + rintro U ⟨s, hsO, hsv⟩ ⟨⟨spc, hspc⟩, uDefaultSpec⟩ + rw [← hsv] at uDefaultSpec + rcases (isOpen_pi_iff.mp hsO) _ uDefaultSpec with ⟨J, fJ, hJ1, hJ2⟩ + let M := iInf (fun (j : J) => j.1.1.1) + have hM : M.Normal := + Subgroup.normal_iInf_normal fun j => j.1.isNormal' + have hMOpen : + IsOpen (M : Set (localAbsoluteAbelianProfinite K)) := by + rw [Subgroup.coe_iInf] + exact isOpen_iInter_of_finite fun i => i.1.1.isOpen' + let m : OpenNormalSubgroup (localAbsoluteAbelianProfinite K) := + { M with isOpen' := hMOpen } + rcases absoluteFiniteArtinMap_surjective K m (spc m) with + ⟨origin, horigin⟩ + use absoluteFiniteArtinLimitMap K origin + refine ⟨?_, origin, rfl⟩ + rw [← hsv] + apply hJ2 + intro a a_in_J + let M_to_Na : m ⟶ a := + (iInf_le (fun (j : J) => j.1.1.1) ⟨a, a_in_J⟩).hom + rw [← (absoluteFiniteArtinLimitMap K origin).property M_to_Na] + change + ((localAbsoluteAbelianProfinite K).toFiniteQuotientFunctor ⋙ + forget₂ FiniteGrp ProfiniteGrp).map M_to_Na + (absoluteFiniteArtinMap K m origin) ∈ _ + rw [horigin] + exact Set.mem_of_eq_of_mem (hspc M_to_Na) (hJ1 a a_in_J).2 + +/-- The absolute local Artin map into the topological abelianization of the +absolute Galois group of the fixed separable closure. -/ +noncomputable def separableAbsoluteLocalArtinMap : + Kˣ →ₜ* localAbsoluteAbelianProfinite K := + ((absoluteGaloisAbelianizationLimitEquiv K).symm : + _ →ₜ* localAbsoluteAbelianProfinite K).comp + (absoluteFiniteArtinLimitMap K) + +/-- Projection of the absolute local Artin map to an open finite quotient is +the corresponding finite local Artin coordinate. -/ +theorem separableAbsoluteLocalArtinMap_finiteProjection + (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) (a : Kˣ) : + QuotientGroup.mk' N.toSubgroup + (separableAbsoluteLocalArtinMap K a) = + absoluteFiniteArtinMap K N a := by + let e := absoluteGaloisAbelianizationLimitEquiv K + let y := absoluteFiniteArtinLimitMap K a + have h := congrArg (fun z => z.1 N) (e.apply_symm_apply y) + change + QuotientGroup.mk' N.toSubgroup (e.symm y) = + absoluteFiniteArtinMap K N a at h + simpa [separableAbsoluteLocalArtinMap, e, y] using h + +/-- The absolute local Artin map has dense image. -/ +theorem separableAbsoluteLocalArtinMap_denseRange : + DenseRange (separableAbsoluteLocalArtinMap K) := by + let e := absoluteGaloisAbelianizationLimitEquiv K + change DenseRange + (fun a => e.symm (absoluteFiniteArtinLimitMap K a)) + exact e.symm.surjective.denseRange.comp + (absoluteFiniteArtinLimitMap_denseRange K) e.symm.continuous + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtinRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtinRestriction.lean new file mode 100644 index 0000000000..047670373d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtinRestriction.lean @@ -0,0 +1,74 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteLocalReciprocity +/-! +# Actual finite values of the absolute local Artin map + +Projecting the absolute Artin map to a finite abelian subextension recovers +its canonical finite Artin map, not merely the same norm kernel. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTower.Martinet.Shafarevich + +open LocalClassFieldTheory + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +omit [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +private theorem absoluteAbelianRestriction_finiteProjection + (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) + (x : localAbsoluteAbelianProfinite K) : + absoluteAbelianRestriction K (absoluteFiniteQuotientField K N) x = + absoluteFiniteQuotientEquiv K N (QuotientGroup.mk x) := by + refine QuotientGroup.induction_on x fun sigma ↦ ?_ + rw [absoluteAbelianRestriction_mk, absoluteFiniteQuotientEquiv_mk_mk] + +private theorem separableAbsoluteLocalArtinMap_finiteQuotientRestriction + (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) (a : Kˣ) : + absoluteAbelianRestriction K (absoluteFiniteQuotientField K N) + (separableAbsoluteLocalArtinMap K a) = + abelianLocalArtinMap K (absoluteFiniteQuotientField K N) a := by + rw [absoluteAbelianRestriction_finiteProjection] + change absoluteFiniteQuotientEquiv K N + (QuotientGroup.mk' N.toSubgroup (separableAbsoluteLocalArtinMap K a)) = _ + rw [separableAbsoluteLocalArtinMap_finiteProjection] + exact (absoluteFiniteQuotientEquiv K N).apply_symm_apply _ + +/-- The actual absolute Artin value restricts to the actual finite abelian +local Artin value. -/ +theorem separableAbsoluteLocalArtinMap_restriction + (E : IntermediateField K (SeparableClosure K)) + [FiniteDimensional K E] [IsAbelianGalois K E] (a : Kˣ) : + absoluteAbelianRestriction K E (separableAbsoluteLocalArtinMap K a) = + abelianLocalArtinMap K E a := by + generalize hN : absoluteAbelianRestrictionKernel K E = N + have hfield : absoluteFiniteQuotientField K N = E := by + rw [← hN, absoluteFiniteQuotientField_restrictionKernel] + subst E + exact separableAbsoluteLocalArtinMap_finiteQuotientRestriction K N a + +/-- The same finite-value comparison for the usual algebraic-closure +absolute Artin map. -/ +theorem absoluteLocalArtinMap_restriction + (E : IntermediateField K (SeparableClosure K)) + [FiniteDimensional K E] [IsAbelianGalois K E] (a : Kˣ) : + absoluteAbelianRestriction K E + ((separableToStandardAbsoluteAbelianizationEquiv K).symm + (absoluteLocalArtinMap K a)) = + abelianLocalArtinMap K E a := by + rw [separableToStandardAbsoluteAbelianizationEquiv_symm_artinMap] + exact separableAbsoluteLocalArtinMap_restriction K E a + +end ClassFieldTower.Martinet.Shafarevich diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotientTransitions.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotientTransitions.lean new file mode 100644 index 0000000000..da2ac7d3c5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotientTransitions.lean @@ -0,0 +1,140 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotients +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +/-! +# Transition maps between absolute finite quotients + +The canonical finite quotient identifications commute with quotient +transition on the profinite side and restriction on the Galois side. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory +open RamificationTheory + +variable {K : Type} [Field K] + +/-- Pullback of open normal subgroups is monotone. -/ +theorem absoluteFiniteQuotientPreimage_mono + {N M : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)} + (hNM : N ≤ M) : + absoluteFiniteQuotientPreimage K N ≤ + absoluteFiniteQuotientPreimage K M := by + intro σ hσ + exact hNM hσ + +/-- Inclusion of open normal subgroups reverses the corresponding fixed +fields. -/ +theorem absoluteFiniteQuotientField_antitone + {N M : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)} + (hNM : N ≤ M) : + absoluteFiniteQuotientField K M ≤ + absoluteFiniteQuotientField K N := by + intro x hx + change x ∈ IntermediateField.fixedField + (absoluteFiniteQuotientPreimage K M).toSubgroup at hx + change x ∈ IntermediateField.fixedField + (absoluteFiniteQuotientPreimage K N).toSubgroup + rw [IntermediateField.mem_fixedField_iff] at hx ⊢ + intro σ hσ + exact hx σ (absoluteFiniteQuotientPreimage_mono hNM hσ) + +/-- The canonical transition map between two finite quotients. -/ +noncomputable def absoluteFiniteQuotientTransition + {N M : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)} + (hNM : N ≤ M) : + localAbsoluteAbelianProfinite K ⧸ N.toSubgroup →ₜ* + localAbsoluteAbelianProfinite K ⧸ M.toSubgroup := by + letI : DiscreteTopology + (localAbsoluteAbelianProfinite K ⧸ N.toSubgroup) := + QuotientGroup.discreteTopology N.isOpen' + let f : localAbsoluteAbelianProfinite K ⧸ N.toSubgroup →* + localAbsoluteAbelianProfinite K ⧸ M.toSubgroup := + QuotientGroup.map N.toSubgroup M.toSubgroup (MonoidHom.id _) + (fun x hx => hNM hx) + exact + { f with + continuous_toFun := continuous_of_discreteTopology } + +/-- States the theorem `absoluteFiniteQuotientTransition_mk`. -/ +@[simp] +theorem absoluteFiniteQuotientTransition_mk + {N M : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)} + (hNM : N ≤ M) (x : localAbsoluteAbelianProfinite K) : + absoluteFiniteQuotientTransition hNM (QuotientGroup.mk x) = + QuotientGroup.mk x := by + rfl + +/-- Under the finite quotient identifications, quotient transition is +exactly restriction of automorphisms to the smaller fixed field. -/ +theorem absoluteFiniteQuotientEquiv_transition + {N M : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)} + (hNM : N ≤ M) : + (intermediateFieldRestrictContinuous K + (absoluteFiniteQuotientField K M) + (absoluteFiniteQuotientField K N) + (absoluteFiniteQuotientField_antitone hNM)).comp + (ContinuousMonoidHom.toContinuousMonoidHom + (absoluteFiniteQuotientEquiv K N)) = + (ContinuousMonoidHom.toContinuousMonoidHom + (absoluteFiniteQuotientEquiv K M)).comp + (absoluteFiniteQuotientTransition hNM) := by + apply ContinuousMonoidHom.ext + intro x + obtain ⟨p, rfl⟩ := QuotientGroup.mk'_surjective N.toSubgroup x + obtain ⟨σ, rfl⟩ := QuotientGroup.mk'_surjective + (commutator (intrinsicAbsoluteGalois K)).topologicalClosure p + change intermediateFieldRestrictNormalHom + (absoluteFiniteQuotientField K M) + (absoluteFiniteQuotientField K N) + (absoluteFiniteQuotientField_antitone hNM) + (absoluteFiniteQuotientEquiv K N + (QuotientGroup.mk + (QuotientGroup.mk σ : localAbsoluteAbelianProfinite K))) = + absoluteFiniteQuotientEquiv K M + (absoluteFiniteQuotientTransition hNM + (QuotientGroup.mk + (QuotientGroup.mk σ : localAbsoluteAbelianProfinite K))) + let r := intermediateFieldRestrictNormalHom + (absoluteFiniteQuotientField K M) + (absoluteFiniteQuotientField K N) + (absoluteFiniteQuotientField_antitone hNM) + have hrestrict : + r (AlgEquiv.restrictNormalHom (absoluteFiniteQuotientField K N) σ) = + AlgEquiv.restrictNormalHom (absoluteFiniteQuotientField K M) σ := by + apply AlgEquiv.ext + intro y + apply Subtype.ext + exact (intermediateFieldRestrictNormalHom_apply_val + (absoluteFiniteQuotientField K M) + (absoluteFiniteQuotientField K N) + (absoluteFiniteQuotientField_antitone hNM) + (AlgEquiv.restrictNormalHom + (absoluteFiniteQuotientField K N) σ) y).trans + ((AlgEquiv.restrictNormal_commutes σ + (absoluteFiniteQuotientField K N) + (IntermediateField.inclusion + (absoluteFiniteQuotientField_antitone hNM) y)).trans + (AlgEquiv.restrictNormal_commutes σ + (absoluteFiniteQuotientField K M) y).symm) + have hright := (congrArg (absoluteFiniteQuotientEquiv K M) + (absoluteFiniteQuotientTransition_mk hNM + (QuotientGroup.mk σ : localAbsoluteAbelianProfinite K))).trans + (absoluteFiniteQuotientEquiv_mk_mk K M σ) + exact (congrArg r (absoluteFiniteQuotientEquiv_mk_mk K N σ)).trans + (hrestrict.trans hright.symm) + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean new file mode 100644 index 0000000000..1e06387af4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean @@ -0,0 +1,230 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteGaloisAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +public import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Limits +/-! +# Finite quotients of the absolute abelianized Galois group + +Every open normal subgroup of the profinite topological abelianization of +the absolute Galois group determines a finite abelian subextension of the +fixed separable closure. The corresponding finite quotient is canonically +identified, as a topological group, with the actual Galois group of that +subextension. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory + +variable (K : Type) [Field K] + +/-- The absolute topological abelianization, regarded as a stable profinite +group. -/ +noncomputable def localAbsoluteAbelianProfinite : ProfiniteGrp := + ProfiniteGrp.of + (TopologicalAbelianization (intrinsicAbsoluteGalois K)) + +/-- The profinite absolute abelianization carries the commutative group structure of the +topological abelianization. -/ +local instance localAbsoluteAbelianProfiniteCommGroup : + CommGroup (localAbsoluteAbelianProfinite K) := by + change CommGroup (TopologicalAbelianization (intrinsicAbsoluteGalois K)) + infer_instance + +/-- The quotient map from the absolute Galois group to its topological +abelianization. -/ +def localAbsoluteAbelianizationQuotientMap : + intrinsicAbsoluteGalois K →* + localAbsoluteAbelianProfinite K := + QuotientGroup.mk' + (commutator (intrinsicAbsoluteGalois K)).topologicalClosure + +/-- The open normal preimage in the absolute Galois group of an open normal +subgroup of its topological abelianization. -/ +def absoluteFiniteQuotientPreimage + (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) : + OpenNormalSubgroup (intrinsicAbsoluteGalois K) where + toSubgroup := N.toSubgroup.comap + (localAbsoluteAbelianizationQuotientMap K) + isOpen' := N.isOpen'.preimage QuotientGroup.continuous_mk + isNormal' := by infer_instance + +/-- The same preimage, packaged as a closed subgroup for infinite Galois +correspondence. -/ +def absoluteFiniteQuotientClosedPreimage + (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) : + ClosedSubgroup (intrinsicAbsoluteGalois K) where + toSubgroup := (absoluteFiniteQuotientPreimage K N).toSubgroup + isClosed' := Subgroup.isClosed_of_isOpen _ + (absoluteFiniteQuotientPreimage K N).isOpen' + +/-- The closed preimage of an open normal subgroup in the abelianization is normal. -/ +instance absoluteFiniteQuotientClosedPreimage_normal + (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) : + (absoluteFiniteQuotientClosedPreimage K N).Normal := by + change (absoluteFiniteQuotientPreimage K N).toSubgroup.Normal + infer_instance + +/-- The finite subextension cut out by an open normal subgroup of the +absolute topological abelianization. -/ +def absoluteFiniteQuotientField + (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) : + IntermediateField K (SeparableClosure K) := + IntermediateField.fixedField + (absoluteFiniteQuotientPreimage K N).toSubgroup + +/-- The fixed field attached to an open finite abelian quotient is Galois over `K`. -/ +instance absoluteFiniteQuotientField_isGalois + (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) : + IsGalois K (absoluteFiniteQuotientField K N) := by + apply (InfiniteGalois.normal_iff_isGalois + (absoluteFiniteQuotientField K N)).1 + change + (IntermediateField.fixedField + (absoluteFiniteQuotientClosedPreimage K N).toSubgroup).fixingSubgroup.Normal + rw [InfiniteGalois.fixingSubgroup_fixedField + (absoluteFiniteQuotientClosedPreimage K N)] + infer_instance + +/-- The fixed field attached to an open finite quotient is finite-dimensional over `K`. -/ +instance absoluteFiniteQuotientField_finiteDimensional + (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) : + FiniteDimensional K (absoluteFiniteQuotientField K N) := by + apply (InfiniteGalois.isOpen_iff_finite + (absoluteFiniteQuotientField K N)).1 + change IsOpen + ((IntermediateField.fixedField + (absoluteFiniteQuotientClosedPreimage K N).toSubgroup).fixingSubgroup : + Set (intrinsicAbsoluteGalois K)) + rw [InfiniteGalois.fixingSubgroup_fixedField + (absoluteFiniteQuotientClosedPreimage K N)] + exact (absoluteFiniteQuotientPreimage K N).isOpen' + +/-- The topological commutator closure is contained in every pulled-back +open normal subgroup. -/ +theorem localAbsoluteCommutatorClosure_le_finiteQuotientPreimage + (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) : + (commutator (intrinsicAbsoluteGalois K)).topologicalClosure ≤ + (absoluteFiniteQuotientPreimage K N).toSubgroup := by + intro σ hσ + change localAbsoluteAbelianizationQuotientMap K σ ∈ N + have hmk : localAbsoluteAbelianizationQuotientMap K σ = 1 := + (QuotientGroup.eq_one_iff σ).2 hσ + rw [hmk] + exact N.one_mem + +/-- Pullback followed by image under the abelianization quotient recovers +the original open normal subgroup. -/ +theorem finiteQuotientPreimage_map_eq + (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) : + (absoluteFiniteQuotientPreimage K N).toSubgroup.map + (localAbsoluteAbelianizationQuotientMap K) = + N.toSubgroup := by + change + (N.toSubgroup.comap (localAbsoluteAbelianizationQuotientMap K)).map + (localAbsoluteAbelianizationQuotientMap K) = N.toSubgroup + exact Subgroup.map_comap_eq_self_of_surjective + (QuotientGroup.mk'_surjective + (commutator (intrinsicAbsoluteGalois K)).topologicalClosure) + N.toSubgroup + +/-- Mapping the quotient preimage into the abelianization produces a normal subgroup. -/ +instance absoluteFiniteQuotientPreimageMap_normal + (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) : + ((absoluteFiniteQuotientPreimage K N).toSubgroup.map + (localAbsoluteAbelianizationQuotientMap K)).Normal := by + rw [finiteQuotientPreimage_map_eq K N] + exact N.isNormal' + +/-- The algebraic finite quotient identification, obtained from the third +isomorphism theorem and infinite Galois correspondence. -/ +noncomputable def absoluteFiniteQuotientMulEquiv + (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) : + localAbsoluteAbelianProfinite K ⧸ N.toSubgroup ≃* + Gal(absoluteFiniteQuotientField K N/K) := + (QuotientGroup.quotientMulEquivOfEq + (finiteQuotientPreimage_map_eq K N).symm).trans + ((QuotientGroup.quotientQuotientEquivQuotient + (commutator (intrinsicAbsoluteGalois K)).topologicalClosure + (absoluteFiniteQuotientPreimage K N).toSubgroup + (localAbsoluteCommutatorClosure_le_finiteQuotientPreimage K N)).trans + (InfiniteGalois.normalAutEquivQuotient + (absoluteFiniteQuotientClosedPreimage K N))) + +/-- The canonical topological finite quotient identification. -/ +noncomputable def absoluteFiniteQuotientEquiv + (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) : + localAbsoluteAbelianProfinite K ⧸ N.toSubgroup ≃ₜ* + Gal(absoluteFiniteQuotientField K N/K) := by + letI : DiscreteTopology + (localAbsoluteAbelianProfinite K ⧸ N.toSubgroup) := + QuotientGroup.discreteTopology N.isOpen' + exact + { absoluteFiniteQuotientMulEquiv K N with + continuous_toFun := continuous_of_discreteTopology + continuous_invFun := continuous_of_discreteTopology } + +/-- On representatives, the finite quotient identification is literal +restriction to the corresponding fixed field. -/ +@[simp] +theorem absoluteFiniteQuotientEquiv_mk_mk + (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) + (σ : intrinsicAbsoluteGalois K) : + absoluteFiniteQuotientEquiv K N + (QuotientGroup.mk + (QuotientGroup.mk σ : localAbsoluteAbelianProfinite K)) = + AlgEquiv.restrictNormalHom (absoluteFiniteQuotientField K N) σ := by + let q := QuotientGroup.quotientQuotientEquivQuotient + (commutator (intrinsicAbsoluteGalois K)).topologicalClosure + (absoluteFiniteQuotientPreimage K N).toSubgroup + (localAbsoluteCommutatorClosure_le_finiteQuotientPreimage K N) + let e := InfiniteGalois.normalAutEquivQuotient + (absoluteFiniteQuotientClosedPreimage K N) + have hcast := QuotientGroup.quotientMulEquivOfEq_mk + (finiteQuotientPreimage_map_eq K N).symm + (QuotientGroup.mk σ : localAbsoluteAbelianProfinite K) + have hquot := QuotientGroup.quotientQuotientEquivQuotientAux_mk_mk + (commutator (intrinsicAbsoluteGalois K)).topologicalClosure + (absoluteFiniteQuotientPreimage K N).toSubgroup + (localAbsoluteCommutatorClosure_le_finiteQuotientPreimage K N) σ + have hrestrict := InfiniteGalois.normalAutEquivQuotient_apply + (absoluteFiniteQuotientClosedPreimage K N) σ + exact (congrArg (fun z => e (q z)) hcast).trans + ((congrArg e hquot).trans hrestrict) + +/-- The fixed field attached to a finite quotient of the abelianization is abelian Galois. -/ +instance absoluteFiniteQuotientField_isAbelianGalois + (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) : + IsAbelianGalois K (absoluteFiniteQuotientField K N) := by + let : N.toSubgroup.Normal := N.isNormal' + have hquotient_comm + (x y : localAbsoluteAbelianProfinite K ⧸ N.toSubgroup) : + x * y = y * x := by + refine QuotientGroup.induction_on x ?_ + intro a + refine QuotientGroup.induction_on y ?_ + intro b + change QuotientGroup.mk (a * b) = QuotientGroup.mk (b * a) + have hab : a * b = b * a := mul_comm _ _ + exact congrArg QuotientGroup.mk hab + refine { is_comm.comm := fun σ τ => ?_ } + · exact (absoluteFiniteQuotientEquiv K N).symm.injective (by + simp only [map_mul] + exact hquotient_comm + ((absoluteFiniteQuotientEquiv K N).symm σ) + ((absoluteFiniteQuotientEquiv K N).symm τ)) + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteGaloisAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteGaloisAbelianization.lean new file mode 100644 index 0000000000..dcac2345d6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteGaloisAbelianization.lean @@ -0,0 +1,85 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.AbsoluteAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +/-! +# Compatibility names for the absolute abelianization + +The field-generic construction is owned by +`AlgebraicNumberTheory.Galois.AbsoluteAbelianization`. This module preserves +the established local names as definitional wrappers for downstream users. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +variable (K : Type) [Field K] + +/-- Compatibility name for the absolute commutator closure. -/ +abbrev localAbsoluteCommutatorClosure : + ClosedSubgroup (intrinsicAbsoluteGalois K) := + absoluteCommutatorClosure K + +/-- Compatibility instance for normality of the absolute commutator closure. -/ +instance localAbsoluteCommutatorClosure_normal : + (localAbsoluteCommutatorClosure K).Normal := + absoluteCommutatorClosure_normal K + +/-- Compatibility name for the maximal abelian subextension. -/ +abbrev localMaximalAbelianExtension : + IntermediateField K (SeparableClosure K) := + maximalAbelianExtension K + +/-- Compatibility instance for the Galois structure on the maximal abelian +subextension. -/ +instance localMaximalAbelianExtension_isGalois : + IsGalois K (localMaximalAbelianExtension K) := + maximalAbelianExtension_isGalois K + +/-- Compatibility name for the underlying multiplicative equivalence. -/ +noncomputable abbrev localAbsoluteAbelianizationMulEquiv : + TopologicalAbelianization (intrinsicAbsoluteGalois K) ≃* + Gal(localMaximalAbelianExtension K/K) := + absoluteAbelianizationMulEquivMaximalAbelianGalois K + +/-- The compatibility equivalence sends a quotient class to restriction. -/ +@[simp] +theorem localAbsoluteAbelianizationMulEquiv_mk + (sigma : intrinsicAbsoluteGalois K) : + localAbsoluteAbelianizationMulEquiv K (QuotientGroup.mk sigma) = + AlgEquiv.restrictNormalHom (localMaximalAbelianExtension K) sigma := + absoluteAbelianizationMulEquivMaximalAbelianGalois_mk K sigma + +/-- Compatibility form of continuity of the multiplicative equivalence. -/ +theorem localAbsoluteAbelianizationMulEquiv_continuous : + Continuous (localAbsoluteAbelianizationMulEquiv K) := + absoluteAbelianizationMulEquivMaximalAbelianGalois_continuous K + +/-- Compatibility name for the canonical topological equivalence. -/ +noncomputable abbrev localAbsoluteAbelianizationEquiv : + TopologicalAbelianization (intrinsicAbsoluteGalois K) ≃ₜ* + Gal(localMaximalAbelianExtension K/K) := + absoluteTopologicalAbelianizationEquivMaximalAbelianGalois K + +/-- Compatibility instance for total disconnectedness. -/ +instance localAbsoluteTopologicalAbelianization_totallyDisconnectedSpace : + TotallyDisconnectedSpace + (TopologicalAbelianization (intrinsicAbsoluteGalois K)) := + absoluteTopologicalAbelianization_totallyDisconnectedSpace K + +/-- Compatibility instance for the abelian Galois structure. -/ +instance localMaximalAbelianExtension_isAbelianGalois : + IsAbelianGalois K (localMaximalAbelianExtension K) := + maximalAbelianExtension_isAbelianGalois K + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbstractProfiniteCompletionComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbstractProfiniteCompletionComparison.lean new file mode 100644 index 0000000000..bd7f5380d2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbstractProfiniteCompletionComparison.lean @@ -0,0 +1,357 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletion +/-! +# Comparison with the abstract profinite completion + +The abstract profinite completion of a group is the completion formed from all +finite-index normal subgroups, without reference to a topology. We realize it +by applying the open-quotient construction to a discrete copy of the group. + +When every finite-index normal subgroup is open in the given topology, the +open-quotient completion and the abstract completion are canonically +isomorphic as topological groups. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Pointwise + +namespace LocalClassFieldTheory + +universe u v + +/-- A copy of a group equipped with the discrete topology. -/ +@[ext] +structure AbstractProfiniteSource (G : Type u) where + /-- The underlying group element. -/ + val : G + +namespace AbstractProfiniteSource + +variable (G : Type u) + +/-- The tautological equivalence between the discrete copy and the underlying type. -/ +def equiv : AbstractProfiniteSource G ≃ G where + toFun := val + invFun := mk + left_inv _ := rfl + right_inv _ := rfl + +/-- The discrete source copy inherits the group structure of `G`. -/ +instance [Group G] : Group (AbstractProfiniteSource G) := (equiv G).group + +/-- The abstract profinite source carries the discrete topology. -/ +instance : TopologicalSpace (AbstractProfiniteSource G) := ⊥ + +/-- The topology on the abstract profinite source is discrete. -/ +instance : DiscreteTopology (AbstractProfiniteSource G) := ⟨rfl⟩ + +/-- The discrete source copy of a group is a topological group. -/ +instance [Group G] : IsTopologicalGroup (AbstractProfiniteSource G) := inferInstance + +/-- The tautological multiplicative equivalence from the discrete copy. -/ +def mulEquiv [Group G] : AbstractProfiniteSource G ≃* G where + toEquiv := equiv G + map_mul' _ _ := rfl + +end AbstractProfiniteSource + +/-- The abstract profinite completion formed from all finite-index normal +subgroups. This is a stable, non-`abbrev` public object; its inverse-limit +realization is available through `abstractProfiniteCompletionEquivModel`. -/ +noncomputable def AbstractProfiniteCompletion + (G : Type u) [Group G] : ProfiniteGrp := + TopologicalProfiniteCompletion (AbstractProfiniteSource G) + +/-- Canonical comparison with the concrete open-finite-quotient model used +to construct the abstract profinite completion. -/ +noncomputable def abstractProfiniteCompletionEquivModel + (G : Type u) [Group G] : + AbstractProfiniteCompletion G ≃ₜ* + TopologicalProfiniteCompletion (AbstractProfiniteSource G) := by + change TopologicalProfiniteCompletion (AbstractProfiniteSource G) ≃ₜ* + TopologicalProfiniteCompletion (AbstractProfiniteSource G) + exact ContinuousMulEquiv.refl _ + +/-- The canonical dense class map from the discrete source into the stable +abstract completion. -/ +noncomputable def abstractProfiniteCompletionClass + (G : Type u) [Group G] : + AbstractProfiniteSource G →ₜ* AbstractProfiniteCompletion G := + (ContinuousMonoidHom.toContinuousMonoidHom + (abstractProfiniteCompletionEquivModel G).symm).comp + (topologicalProfiniteCompletionMap (AbstractProfiniteSource G)) + +/-- The model equivalence sends an abstract completion class to the canonical topological class. -/ +@[simp] theorem abstractProfiniteCompletionEquivModel_class + (G : Type u) [Group G] (g : AbstractProfiniteSource G) : + abstractProfiniteCompletionEquivModel G + (abstractProfiniteCompletionClass G g) = + topologicalProfiniteCompletionMap (AbstractProfiniteSource G) g := + (abstractProfiniteCompletionEquivModel G).apply_symm_apply _ + +/-- The canonical class map has dense range. Clients can use this theorem +without knowing which inverse-limit model realizes the abstract completion. -/ +theorem abstractProfiniteCompletionClass_denseRange + (G : Type u) [Group G] : + DenseRange (abstractProfiniteCompletionClass G) := by + let e := abstractProfiniteCompletionEquivModel G + have he : DenseRange e.symm := e.symm.surjective.denseRange + have hmap := + topologicalProfiniteCompletionMap_denseRange (AbstractProfiniteSource G) + change DenseRange + ((e.symm : TopologicalProfiniteCompletion (AbstractProfiniteSource G) → + AbstractProfiniteCompletion G) ∘ + topologicalProfiniteCompletionMap (AbstractProfiniteSource G)) + exact he.comp hmap e.symm.continuous_toFun + +/-- Extend a continuous homomorphism from the discrete source across the +stable abstract profinite completion. This is the representation-independent +universal-property entry point for `AbstractProfiniteCompletion`. -/ +noncomputable def abstractProfiniteCompletionLift + (G : Type u) [Group G] + (P : ProfiniteGrp.{v}) + (f : AbstractProfiniteSource G →ₜ* P) : + AbstractProfiniteCompletion G →ₜ* P := + (topologicalProfiniteCompletionLift P f).comp + (ContinuousMonoidHom.toContinuousMonoidHom + (abstractProfiniteCompletionEquivModel G)) + +/-- The universal lift agrees with the original map on abstract completion classes. -/ +@[simp] theorem abstractProfiniteCompletionLift_class + (G : Type u) [Group G] + (P : ProfiniteGrp.{v}) + (f : AbstractProfiniteSource G →ₜ* P) + (g : AbstractProfiniteSource G) : + abstractProfiniteCompletionLift G P f + (abstractProfiniteCompletionClass G g) = f g := by + unfold abstractProfiniteCompletionLift + change topologicalProfiniteCompletionLift P f + (abstractProfiniteCompletionEquivModel G + (abstractProfiniteCompletionClass G g)) = f g + rw [abstractProfiniteCompletionEquivModel_class, + topologicalProfiniteCompletionLift_map] + +/-- Composing the universal lift with the class map recovers the source homomorphism. -/ +@[simp] theorem abstractProfiniteCompletionLift_comp_class + (G : Type u) [Group G] + (P : ProfiniteGrp.{v}) + (f : AbstractProfiniteSource G →ₜ* P) : + (abstractProfiniteCompletionLift G P f).comp + (abstractProfiniteCompletionClass G) = f := by + ext g + exact abstractProfiniteCompletionLift_class G P f g + +/-- A continuous homomorphism out of the stable abstract completion is +determined by its values on the canonical dense class map. -/ +theorem abstractProfiniteCompletionLift_unique + (G : Type u) [Group G] + (P : ProfiniteGrp.{v}) + (f : AbstractProfiniteSource G →ₜ* P) + (h : AbstractProfiniteCompletion G →ₜ* P) + (hh : h.comp (abstractProfiniteCompletionClass G) = f) : + h = abstractProfiniteCompletionLift G P f := by + let e := abstractProfiniteCompletionEquivModel G + let hModel : + TopologicalProfiniteCompletion (AbstractProfiniteSource G) →ₜ* P := + h.comp (ContinuousMonoidHom.toContinuousMonoidHom e.symm) + have hModel_comp : + hModel.comp + (topologicalProfiniteCompletionMap (AbstractProfiniteSource G)) = f := by + ext g + simpa [hModel, e, abstractProfiniteCompletionClass] using + DFunLike.congr_fun hh g + have hModel_eq := + topologicalProfiniteCompletionLift_unique P f hModel hModel_comp + apply ContinuousMonoidHom.ext + intro x + have hx := DFunLike.congr_fun hModel_eq (e x) + change h (e.symm (e x)) = + topologicalProfiniteCompletionLift P f (e x) at hx + rw [e.symm_apply_apply] at hx + change h x = topologicalProfiniteCompletionLift P f (e x) + exact hx + +section Comparison + +variable (G : Type u) [Group G] [TopologicalSpace G] [IsTopologicalGroup G] + +/-- The model-valued completion map used internally to establish continuity. -/ +def abstractProfiniteCompletionModelMapMonoidHom : + G →* TopologicalProfiniteCompletion (AbstractProfiniteSource G) := + (topologicalProfiniteCompletionMap (AbstractProfiniteSource G)).toMonoidHom.comp + (AbstractProfiniteSource.mulEquiv G).symm.toMonoidHom + +/-- The abstract completion map, viewed as a homomorphism from the original group. -/ +def abstractProfiniteCompletionMapMonoidHom : G →* AbstractProfiniteCompletion G := + (ContinuousMonoidHom.toContinuousMonoidHom + (abstractProfiniteCompletionEquivModel G).symm).toMonoidHom.comp + (abstractProfiniteCompletionModelMapMonoidHom G) + +omit [TopologicalSpace G] [IsTopologicalGroup G] in +/-- The completion map sends `g` to the class of its discrete source copy. -/ +@[simp] theorem abstractProfiniteCompletionMapMonoidHom_apply (g : G) : + abstractProfiniteCompletionMapMonoidHom G g = + abstractProfiniteCompletionClass G + ((AbstractProfiniteSource.mulEquiv G).symm g) := + by + change (abstractProfiniteCompletionEquivModel G).symm + (topologicalProfiniteCompletionMap (AbstractProfiniteSource G) + ((AbstractProfiniteSource.mulEquiv G).symm g)) = + (abstractProfiniteCompletionEquivModel G).symm + (topologicalProfiniteCompletionMap (AbstractProfiniteSource G) + ((AbstractProfiniteSource.mulEquiv G).symm g)) + rfl + +/-- If every finite-index normal subgroup is open, the abstract completion map +is continuous for the original topology. -/ +private theorem abstractProfiniteCompletionModelMapMonoidHom_continuous + (hOpen : ∀ H : Subgroup G, H.Normal → H.FiniteIndex → IsOpen (H : Set G)) : + Continuous (abstractProfiniteCompletionModelMapMonoidHom G) := by + apply Continuous.subtype_mk + apply continuous_pi + intro H + let e : G ≃* AbstractProfiniteSource G := + (AbstractProfiniteSource.mulEquiv G).symm + let K : Subgroup G := H.toOpenNormalSubgroup.toSubgroup.comap e.toMonoidHom + have hKnormal : K.Normal := + H.toOpenNormalSubgroup.toSubgroup.normal_comap e.toMonoidHom + have hKfinite : K.FiniteIndex := by + constructor + rw [H.toOpenNormalSubgroup.toSubgroup.index_comap_of_surjective e.surjective] + exact H.finiteIndex'.index_ne_zero + have hKopen : IsOpen (K : Set G) := hOpen K hKnormal hKfinite + apply Continuous.mk + intro s _ + change IsOpen + ((fun g : G => + (QuotientGroup.mk (e g) : + AbstractProfiniteSource G ⧸ H.toOpenNormalSubgroup.toSubgroup)) ⁻¹' s) + let q : G → AbstractProfiniteSource G ⧸ H.toOpenNormalSubgroup.toSubgroup := + fun g => QuotientGroup.mk (e g) + change IsOpen (q ⁻¹' s) + rw [← Set.biUnion_preimage_singleton q s] + refine isOpen_iUnion (fun i => isOpen_iUnion (fun _ => ?_)) + let representative : G := e.symm (Quotient.out i) + convert IsOpen.leftCoset hKopen representative using 1 + ext x + simp only [Set.mem_preimage, Set.mem_singleton_iff] + nth_rw 1 [← QuotientGroup.out_eq' i, eq_comm, QuotientGroup.eq] + simp only [representative, Set.mem_smul_set_iff_inv_smul_mem] + change (Quotient.out i)⁻¹ * e x ∈ H.toOpenNormalSubgroup.toSubgroup ↔ + representative⁻¹ * x ∈ K + simp [K, representative] + +/-- If every finite-index normal subgroup is open, the abstract completion map +is continuous for the original topology. -/ +theorem abstractProfiniteCompletionMapMonoidHom_continuous + (hOpen : ∀ H : Subgroup G, H.Normal → H.FiniteIndex → IsOpen (H : Set G)) : + Continuous (abstractProfiniteCompletionMapMonoidHom G) := + (abstractProfiniteCompletionEquivModel G).symm.continuous_toFun.comp + (abstractProfiniteCompletionModelMapMonoidHom_continuous G hOpen) + +/-- The canonical continuous map from the topological completion to the +abstract completion. -/ +def topologicalProfiniteCompletionToAbstract + (hOpen : ∀ H : Subgroup G, H.Normal → H.FiniteIndex → IsOpen (H : Set G)) : + TopologicalProfiniteCompletion G →ₜ* AbstractProfiniteCompletion G := + topologicalProfiniteCompletionLift + (AbstractProfiniteCompletion G) + { toMonoidHom := abstractProfiniteCompletionMapMonoidHom G + continuous_toFun := abstractProfiniteCompletionMapMonoidHom_continuous G hOpen } + +/-- The comparison map agrees with the abstract completion map on the source group. -/ +theorem topologicalProfiniteCompletionToAbstract_map + (hOpen : ∀ H : Subgroup G, H.Normal → H.FiniteIndex → IsOpen (H : Set G)) + (g : G) : + topologicalProfiniteCompletionToAbstract G hOpen + (topologicalProfiniteCompletionMap G g) = + abstractProfiniteCompletionClass G + ((AbstractProfiniteSource.mulEquiv G).symm g) := by + unfold topologicalProfiniteCompletionToAbstract + rw [topologicalProfiniteCompletionLift_map] + exact abstractProfiniteCompletionMapMonoidHom_apply G g + +/-- The canonical continuous map from the abstract completion to the +topological completion. -/ +def abstractProfiniteCompletionToTopological : + AbstractProfiniteCompletion G →ₜ* TopologicalProfiniteCompletion G := + abstractProfiniteCompletionLift G + (TopologicalProfiniteCompletion G) + { toMonoidHom := + (topologicalProfiniteCompletionMap G).toMonoidHom.comp + (AbstractProfiniteSource.mulEquiv G).toMonoidHom + continuous_toFun := continuous_of_discreteTopology } + +/-- The reverse comparison map agrees with the topological completion map on the discrete source. -/ +theorem abstractProfiniteCompletionToTopological_map + (g : AbstractProfiniteSource G) : + abstractProfiniteCompletionToTopological G + (abstractProfiniteCompletionClass G g) = + topologicalProfiniteCompletionMap G (AbstractProfiniteSource.mulEquiv G g) := by + unfold abstractProfiniteCompletionToTopological + rw [abstractProfiniteCompletionLift_class] + rfl + +/-- Under the condition that all finite-index normal subgroups are open, the +open-quotient completion is canonically the abstract profinite completion. -/ +def topologicalProfiniteCompletionCompareAbstract + (hOpen : ∀ H : Subgroup G, H.Normal → H.FiniteIndex → IsOpen (H : Set G)) : + TopologicalProfiniteCompletion G ≃ₜ* AbstractProfiniteCompletion G := by + let forward := topologicalProfiniteCompletionToAbstract G hOpen + let backward := abstractProfiniteCompletionToTopological G + have hleft : backward.comp forward = ContinuousMonoidHom.id _ := by + calc + backward.comp forward = + topologicalProfiniteCompletionLift + (TopologicalProfiniteCompletion G) + (topologicalProfiniteCompletionMap G) := by + apply topologicalProfiniteCompletionLift_unique + ext g + simp [backward, forward, + topologicalProfiniteCompletionToAbstract_map, + abstractProfiniteCompletionToTopological_map] + _ = ContinuousMonoidHom.id _ := by + symm + apply topologicalProfiniteCompletionLift_unique + rfl + have hright : forward.comp backward = ContinuousMonoidHom.id _ := by + calc + forward.comp backward = + abstractProfiniteCompletionLift G + (AbstractProfiniteCompletion G) + (abstractProfiniteCompletionClass G) := by + apply abstractProfiniteCompletionLift_unique + ext g + simp [backward, forward, + topologicalProfiniteCompletionToAbstract_map, + abstractProfiniteCompletionToTopological_map] + _ = ContinuousMonoidHom.id _ := by + symm + apply abstractProfiniteCompletionLift_unique + rfl + let e : TopologicalProfiniteCompletion G ≃* AbstractProfiniteCompletion G := + { toFun := forward + invFun := backward + left_inv := fun x => by + have hx := congrArg (fun f => f x) hleft + simpa using hx + right_inv := fun y => by + have hy := congrArg (fun f => f y) hright + simpa using hy + map_mul' := forward.map_mul } + exact ContinuousMulEquiv.mk e forward.continuous_toFun backward.continuous_toFun + +end Comparison + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/All.lean new file mode 100644 index 0000000000..97bc244a0e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/All.lean @@ -0,0 +1,29 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtinRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotientTransitions +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotients +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteGaloisAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbstractProfiniteCompletionComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteAbelianQuotientKernels +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteReciprocityDiagram +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.LocalMultiplicativeCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletionCriteria +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteLocalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.TopologicalAbelianizationCongr +/-! +# Infinite local class field theory + +Public aggregate for the topological profinite completion, compatible finite +Artin maps, the absolute local Artin map, and the profinite local reciprocity +equivalence. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteAbelianQuotientKernels.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteAbelianQuotientKernels.lean new file mode 100644 index 0000000000..a303ac61c0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteAbelianQuotientKernels.lean @@ -0,0 +1,228 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletionCriteria +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.Classification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +/-! +# Kernels attached to finite abelian subextensions + +Every finite abelian subextension of the fixed separable closure determines +an open normal subgroup of the absolute topological abelianization. This +module identifies its pullback along the absolute Artin map with the ordinary +norm subgroup. The finite local existence theorem then shows that these +pullbacks are cofinal among the open finite-index subgroups of the local +multiplicative group. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open scoped IsMulCommutative + +open LocalFieldTheory RamificationTheory +open ClassFormation CyclicCohomology + +variable (K : Type) [Field K] + +/-- Restriction from the absolute topological abelianization to the Galois +group of a finite abelian subextension. -/ +noncomputable def absoluteAbelianRestriction + (E : IntermediateField K (SeparableClosure K)) + [FiniteDimensional K E] [IsAbelianGalois K E] : + localAbsoluteAbelianProfinite K →ₜ* Gal(E/K) := by + let r : intrinsicAbsoluteGalois K →* Gal(E/K) := + AlgEquiv.restrictNormalHom E + have hcomm : commutator (intrinsicAbsoluteGalois K) ≤ r.ker := + Abelianization.commutator_subset_ker r + have hkerClosed : IsClosed (r.ker : Set (intrinsicAbsoluteGalois K)) := by + rw [IntermediateField.restrictNormalHom_ker] + exact IntermediateField.fixingSubgroup_isClosed E + have hclosure : + (commutator (intrinsicAbsoluteGalois K)).topologicalClosure ≤ r.ker := + (commutator (intrinsicAbsoluteGalois K)).topologicalClosure_minimal + hcomm hkerClosed + let q : localAbsoluteAbelianProfinite K →* Gal(E/K) := + QuotientGroup.lift + (commutator (intrinsicAbsoluteGalois K)).topologicalClosure r + (fun σ hσ ↦ MonoidHom.mem_ker.mp (hclosure hσ)) + exact + { q with + continuous_toFun := by + apply (QuotientGroup.isQuotientMap_mk + (commutator (intrinsicAbsoluteGalois K)).topologicalClosure).continuous_iff.2 + refine (InfiniteGalois.restrictNormalHom_continuous E).congr ?_ + intro σ + rfl } + +/-- States the theorem `absoluteAbelianRestriction_mk`. -/ +@[simp] +theorem absoluteAbelianRestriction_mk + (E : IntermediateField K (SeparableClosure K)) + [FiniteDimensional K E] [IsAbelianGalois K E] + (σ : intrinsicAbsoluteGalois K) : + absoluteAbelianRestriction K E + (QuotientGroup.mk σ : localAbsoluteAbelianProfinite K) = + AlgEquiv.restrictNormalHom E σ := + rfl + +/-- Restriction to a finite Galois subextension is onto after passing to the +absolute topological abelianization. -/ +theorem absoluteAbelianRestriction_surjective + (E : IntermediateField K (SeparableClosure K)) + [FiniteDimensional K E] [IsAbelianGalois K E] : + Function.Surjective (absoluteAbelianRestriction K E) := by + intro τ + rcases AlgEquiv.restrictNormalHom_surjective + (F := K) (K₁ := E) (E := SeparableClosure K) τ with ⟨σ, rfl⟩ + exact ⟨QuotientGroup.mk σ, absoluteAbelianRestriction_mk K E σ⟩ + +/-- The open normal kernel attached to a finite abelian subextension. -/ +noncomputable def absoluteAbelianRestrictionKernel + (E : IntermediateField K (SeparableClosure K)) + [FiniteDimensional K E] [IsAbelianGalois K E] : + OpenNormalSubgroup (localAbsoluteAbelianProfinite K) where + toOpenSubgroup := + { toSubgroup := (absoluteAbelianRestriction K E).toMonoidHom.ker + isOpen' := by + change IsOpen ((absoluteAbelianRestriction K E) ⁻¹' {1}) + exact (isOpen_discrete {1}).preimage + (absoluteAbelianRestriction K E).continuous_toFun } + isNormal' := by infer_instance + +/-- States the theorem `mem_absoluteAbelianRestrictionKernel_iff`. -/ +@[simp] +theorem mem_absoluteAbelianRestrictionKernel_iff + (E : IntermediateField K (SeparableClosure K)) + [FiniteDimensional K E] [IsAbelianGalois K E] + (x : localAbsoluteAbelianProfinite K) : + x ∈ absoluteAbelianRestrictionKernel K E ↔ + absoluteAbelianRestriction K E x = 1 := + Iff.rfl + +/-- Pulling the restriction kernel back to the absolute Galois group gives +the fixing subgroup of the original finite subextension. -/ +theorem absoluteFiniteQuotientPreimage_restrictionKernel + (E : IntermediateField K (SeparableClosure K)) + [FiniteDimensional K E] [IsAbelianGalois K E] : + (absoluteFiniteQuotientPreimage K + (absoluteAbelianRestrictionKernel K E)).toSubgroup = + E.fixingSubgroup := by + ext σ + change absoluteAbelianRestriction K E + (QuotientGroup.mk σ : localAbsoluteAbelianProfinite K) = 1 ↔ + σ ∈ E.fixingSubgroup + rw [absoluteAbelianRestriction_mk, + ← IntermediateField.restrictNormalHom_ker E] + rfl + +/-- The finite field cut out by the restriction kernel is the original +finite abelian subextension. -/ +theorem absoluteFiniteQuotientField_restrictionKernel + (E : IntermediateField K (SeparableClosure K)) + [FiniteDimensional K E] [IsAbelianGalois K E] : + absoluteFiniteQuotientField K (absoluteAbelianRestrictionKernel K E) = E := by + change IntermediateField.fixedField + (absoluteFiniteQuotientPreimage K + (absoluteAbelianRestrictionKernel K E)).toSubgroup = E + rw [absoluteFiniteQuotientPreimage_restrictionKernel, + InfiniteGalois.fixedField_fixingSubgroup] + +section LocalField + +variable [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- Pulling a finite restriction kernel back along the absolute local Artin +map gives exactly the norm subgroup of that finite abelian extension. -/ +theorem separableAbsoluteLocalArtinMap_preimage_restrictionKernel + (E : IntermediateField K (SeparableClosure K)) + [FiniteDimensional K E] [IsAbelianGalois K E] : + (topologicalProfiniteCompletionPreimageIndex + (localAbsoluteAbelianProfinite K) + (separableAbsoluteLocalArtinMap K) + (absoluteAbelianRestrictionKernel K E)).toOpenNormalSubgroup.toSubgroup = + localNormSubgroup K E := by + let N := absoluteAbelianRestrictionKernel K E + ext a + change separableAbsoluteLocalArtinMap K a ∈ N ↔ + a ∈ localNormSubgroup K E + have hfield : absoluteFiniteQuotientField K N = E := by + dsimp only [N] + exact absoluteFiniteQuotientField_restrictionKernel K E + constructor + · intro ha + have hfinite : absoluteFiniteArtinMap K N a = 1 := by + rw [← separableAbsoluteLocalArtinMap_finiteProjection K N a] + exact (QuotientGroup.eq_one_iff + (separableAbsoluteLocalArtinMap K a)).2 ha + have hker : a ∈ (absoluteFiniteArtinMap K N).toMonoidHom.ker := + MonoidHom.mem_ker.mpr hfinite + rw [absoluteFiniteArtinMap_ker, hfield] at hker + exact hker + · intro ha + have hker : a ∈ (absoluteFiniteArtinMap K N).toMonoidHom.ker := by + rw [absoluteFiniteArtinMap_ker, hfield] + exact ha + apply (QuotientGroup.eq_one_iff + (separableAbsoluteLocalArtinMap K a)).mp + calc + (QuotientGroup.mk (separableAbsoluteLocalArtinMap K a) : + localAbsoluteAbelianProfinite K ⧸ N.toSubgroup) = + absoluteFiniteArtinMap K N a := + separableAbsoluteLocalArtinMap_finiteProjection K N a + _ = 1 := MonoidHom.mem_ker.mp hker + +/-- The pullbacks of finite abelian restriction kernels are cofinal among +the open finite-index normal subgroups of `Kˣ`. This is the arithmetic +input for injectivity of the canonical map from the topological profinite +completion. -/ +theorem separableAbsoluteLocalArtinMap_preimage_cofinal + (H : OpenFiniteIndexNormalSubgroup Kˣ) : + ∃ N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K), + topologicalProfiniteCompletionPreimageIndex + (localAbsoluteAbelianProfinite K) + (separableAbsoluteLocalArtinMap K) N ≤ H := by + let Hnative : OpenFiniteIndexSubgroup K := + ⟨H.toOpenNormalSubgroup.toSubgroup, + H.toOpenNormalSubgroup.isOpen', H.finiteIndex'⟩ + rcases finiteAbelianNormSubgroupMap_surjective K Hnative with ⟨L, hL⟩ + let E : IntermediateField K (SeparableClosure K) := + abstractFixedField K (SeparableClosure K) L.field + let : Finite ((baseField (intrinsicAbsoluteGalois K)).toSubgroup ⧸ + extensionSubgroup (baseField (intrinsicAbsoluteGalois K)) L.field + (le_baseField L.field)) := + finiteAbelianSubextension_finite_over_absoluteBase K L + let : FiniteDimensional K E := + abstractFixedField_finiteDimensional + K (SeparableClosure K) L.field inferInstance + let : IsAbelianGalois K E := + finiteAbelianSubextension_fixedField_isAbelianGalois K L + refine ⟨absoluteAbelianRestrictionKernel K E, ?_⟩ + change + (topologicalProfiniteCompletionPreimageIndex + (localAbsoluteAbelianProfinite K) + (separableAbsoluteLocalArtinMap K) + (absoluteAbelianRestrictionKernel K E)).toOpenNormalSubgroup.toSubgroup ≤ + H.toOpenNormalSubgroup.toSubgroup + rw [separableAbsoluteLocalArtinMap_preimage_restrictionKernel] + have hsubgroup : + localNormSubgroup K E = H.toOpenNormalSubgroup.toSubgroup := by + simpa only [finiteAbelianNormSubgroupMap, finiteAbelianNormSubgroup, + Hnative, E] using + congrArg OpenFiniteIndexSubgroup.subgroup hL + rw [hsubgroup] + +end LocalField + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean new file mode 100644 index 0000000000..5fc356c5aa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean @@ -0,0 +1,313 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtin +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormSubgroupFunctoriality +/-! +# Finite reciprocity as an isomorphism of diagrams + +The open normal subgroups of the absolute abelianized Galois group index +three covariant finite diagrams: its finite quotients, the corresponding +finite abelian Galois groups, and the corresponding norm quotients. This +file packages the canonical finite-stage identifications as natural +isomorphisms. +-/ + +@[expose] public section + +noncomputable +section + +open CategoryTheory + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] +/-- The open normal subgroups indexing the finite quotients of the absolute abelian Galois group. -/ +abbrev AbsoluteFiniteIndex := + OpenNormalSubgroup (localAbsoluteAbelianProfinite K) + +/-- Norm quotients in the finite reciprocity diagram carry their quotient topologies from +base-field units. -/ +noncomputable local instance finiteDiagramNormQuotientTopologicalSpace + (E L : Type) [Field E] [Field L] [Algebra E L] + [TopologicalSpace E] : + TopologicalSpace (NormQuotient E L) := by + change TopologicalSpace (Eˣ ⧸ localNormSubgroup E L) + infer_instance + +local instance finiteDiagramNormQuotientIsTopologicalGroup + (L : Type) [Field L] [Algebra K L] : + IsTopologicalGroup (NormQuotient K L) := by + change IsTopologicalGroup (Kˣ ⧸ localNormSubgroup K L) + infer_instance + +/-- The finite quotients of the absolute abelianized Galois group, carrying +their quotient topologies and the canonical quotient transition maps. -/ +noncomputable def absoluteFiniteQuotientDiagram : + AbsoluteFiniteIndex K ⥤ ProfiniteGrp where + obj N := ProfiniteGrp.of + (localAbsoluteAbelianProfinite K ⧸ N.toSubgroup) + map f := ProfiniteGrp.ofHom <| + absoluteFiniteQuotientTransition (leOfHom f) + map_id N := by + apply ProfiniteGrp.hom_ext + apply ContinuousMonoidHom.ext + intro x + refine QuotientGroup.induction_on x ?_ + intro x + rfl + map_comp {X Y Z} f g := by + apply ProfiniteGrp.hom_ext + apply ContinuousMonoidHom.ext + intro x + refine QuotientGroup.induction_on x ?_ + intro x + rfl +/-- The finite abelian Galois groups cut out by open normal subgroups of the +absolute abelianized Galois group, with restriction as transition map. -/ +noncomputable def finiteAbelianGaloisDiagram : + AbsoluteFiniteIndex K ⥤ ProfiniteGrp where + obj N := ProfiniteGrp.of + (Gal(absoluteFiniteQuotientField K N/K)) + map {N M} f := ProfiniteGrp.ofHom <| + intermediateFieldRestrictContinuous K + (absoluteFiniteQuotientField K M) + (absoluteFiniteQuotientField K N) + (absoluteFiniteQuotientField_antitone (leOfHom f)) + map_id N := by + apply ProfiniteGrp.hom_ext + apply ContinuousMonoidHom.ext + intro sigma + apply AlgEquiv.ext + intro x + apply Subtype.ext + exact intermediateFieldRestrictNormalHom_apply_val + (absoluteFiniteQuotientField K N) + (absoluteFiniteQuotientField K N) le_rfl sigma x + map_comp {N M L} f g := by + apply ProfiniteGrp.hom_ext + apply ContinuousMonoidHom.ext + intro sigma + apply AlgEquiv.ext + intro x + apply Subtype.ext + change + (absoluteFiniteQuotientField K L).val + (intermediateFieldRestrictNormalHom + (absoluteFiniteQuotientField K L) + (absoluteFiniteQuotientField K N) _ sigma x) = + (absoluteFiniteQuotientField K L).val + (intermediateFieldRestrictNormalHom + (absoluteFiniteQuotientField K L) + (absoluteFiniteQuotientField K M) _ + (intermediateFieldRestrictNormalHom + (absoluteFiniteQuotientField K M) + (absoluteFiniteQuotientField K N) _ sigma) x) + rw [intermediateFieldRestrictNormalHom_apply_val] + rw [intermediateFieldRestrictNormalHom_apply_val] + rw [intermediateFieldRestrictNormalHom_apply_val] + apply congrArg (fun y : absoluteFiniteQuotientField K N => + (absoluteFiniteQuotientField K N).val (sigma y)) + apply Subtype.ext + rfl + +/-- At every finite stage, the quotient of the absolute abelianized Galois +group is canonically the Galois group of its fixed field; these +identifications commute with all transition maps. -/ +noncomputable def absoluteFiniteQuotientNaturalIso : + absoluteFiniteQuotientDiagram K ≅ finiteAbelianGaloisDiagram K := + NatIso.ofComponents + (fun N => ProfiniteGrp.ContinuousMulEquiv.toProfiniteGrpIso + (absoluteFiniteQuotientEquiv K N)) + (fun {N M} f => by + apply ProfiniteGrp.hom_ext + apply ContinuousMonoidHom.ext + intro x + exact DFunLike.congr_fun + (absoluteFiniteQuotientEquiv_transition + (K := K) (leOfHom f)).symm x) + +omit [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +/-- Inclusion of open normal subgroups gives the corresponding inclusion of +finite norm subgroups. -/ +theorem absoluteFiniteNormSubgroup_mono + {N M : AbsoluteFiniteIndex K} (hNM : N ≤ M) : + localNormSubgroup K (absoluteFiniteQuotientField K N) ≤ + localNormSubgroup K (absoluteFiniteQuotientField K M) := by + let E := absoluteFiniteQuotientField K M + let F := absoluteFiniteQuotientField K N + let hEF : E ≤ F := + absoluteFiniteQuotientField_antitone (K := K) hNM + let EAlgebra : Algebra E F := + RingHom.toAlgebra (IntermediateField.inclusion hEF).toRingHom + let : SMul E F := + @Algebra.toSMul _ _ _ _ EAlgebra + let : Module E F := + @Algebra.toModule _ _ _ _ EAlgebra + let : IsScalarTower K E F := IsScalarTower.of_algebraMap_eq' rfl + let : FiniteDimensional E F := FiniteDimensional.right K E F + change localNormSubgroup K F ≤ localNormSubgroup K E + exact LocalFieldTheory.normSubgroup_le_of_tower K E F + +/-- The first isomorphism theorem for a finite coordinate of the absolute +Artin map, with its kernel identified with the corresponding norm subgroup. -/ +noncomputable def absoluteFiniteArtinQuotientEquiv + (N : AbsoluteFiniteIndex K) : + NormQuotient K (absoluteFiniteQuotientField K N) ≃ₜ* + (localAbsoluteAbelianProfinite K ⧸ N.toSubgroup) := by + letI : DiscreteTopology + (NormQuotient K (absoluteFiniteQuotientField K N)) := + normQuotient_discrete K (absoluteFiniteQuotientField K N) + letI : DiscreteTopology + (localAbsoluteAbelianProfinite K ⧸ N.toSubgroup) := + QuotientGroup.discreteTopology N.isOpen' + let e : NormQuotient K (absoluteFiniteQuotientField K N) ≃* + (localAbsoluteAbelianProfinite K ⧸ N.toSubgroup) := + normQuotientEquivOfSurjective + (absoluteFiniteArtinMap K N).toMonoidHom + (absoluteFiniteArtinMap_surjective K N) + (absoluteFiniteArtinMap_ker K N) + exact + { e with + continuous_toFun := continuous_of_discreteTopology + continuous_invFun := continuous_of_discreteTopology } + +/-- States the theorem `absoluteFiniteArtinQuotientEquiv_mk`. -/ +@[simp] +theorem absoluteFiniteArtinQuotientEquiv_mk + (N : AbsoluteFiniteIndex K) (a : Kˣ) : + absoluteFiniteArtinQuotientEquiv K N + (normClass K + (absoluteFiniteQuotientField K N) a) = + absoluteFiniteArtinMap K N a := by + exact normQuotientEquivOfSurjective_normClass + (absoluteFiniteArtinMap K N).toMonoidHom + (absoluteFiniteArtinMap_surjective K N) + (absoluteFiniteArtinMap_ker K N) a + +/-- The transition map on norm quotients induced by a tower of fixed fields. -/ +noncomputable def normQuotientTransition + {N M : AbsoluteFiniteIndex K} (hNM : N ≤ M) : + NormQuotient K (absoluteFiniteQuotientField K N) →ₜ* + NormQuotient K (absoluteFiniteQuotientField K M) := by + letI : DiscreteTopology + (NormQuotient K (absoluteFiniteQuotientField K N)) := + normQuotient_discrete K (absoluteFiniteQuotientField K N) + let f : NormQuotient K (absoluteFiniteQuotientField K N) →* + NormQuotient K (absoluteFiniteQuotientField K M) := + normQuotientMapOfLE K + (absoluteFiniteQuotientField K N) + (absoluteFiniteQuotientField K M) + (absoluteFiniteNormSubgroup_mono K hNM) + exact + { f with + continuous_toFun := continuous_of_discreteTopology } + +/-- States the theorem `normQuotientTransition_mk`. -/ +@[simp] +theorem normQuotientTransition_mk + {N M : AbsoluteFiniteIndex K} (hNM : N ≤ M) (a : Kˣ) : + normQuotientTransition K hNM + (normClass K + (absoluteFiniteQuotientField K N) a) = + normClass K + (absoluteFiniteQuotientField K M) a := by + exact normQuotientMapOfLE_normClass K + (absoluteFiniteQuotientField K N) + (absoluteFiniteQuotientField K M) + (absoluteFiniteNormSubgroup_mono K hNM) a + +/-- The finite norm quotients indexed by open normal subgroups, with the +canonical quotient maps induced by inclusions of norm subgroups. -/ +noncomputable def normQuotientDiagram : + AbsoluteFiniteIndex K ⥤ ProfiniteGrp where + obj N := ProfiniteGrp.ofContinuousMulEquiv + (G := (absoluteFiniteQuotientDiagram K).obj N) + (absoluteFiniteArtinQuotientEquiv K N).symm + map f := ConcreteCategory.ofHom (C := ProfiniteGrp) + (normQuotientTransition K (leOfHom f)) + map_id N := by + apply ProfiniteGrp.hom_ext + apply ContinuousMonoidHom.ext + intro x + change normQuotientTransition K (leOfHom (𝟙 N)) x = x + refine NormQuotient.inductionOn + (K := K) (L := absoluteFiniteQuotientField K N) + (motive := fun q => + normQuotientTransition K (leOfHom (𝟙 N)) q = q) x ?_ + intro a + exact normQuotientTransition_mk K (leOfHom (𝟙 N)) a + map_comp f g := by + apply ProfiniteGrp.hom_ext + apply ContinuousMonoidHom.ext + intro x + refine NormQuotient.inductionOn + (K := K) + (motive := fun q => + normQuotientTransition K (leOfHom (f ≫ g)) q = + normQuotientTransition K (leOfHom g) + (normQuotientTransition K (leOfHom f) q)) x ?_ + intro a + rw [normQuotientTransition_mk, normQuotientTransition_mk, + normQuotientTransition_mk] + +/-- The finite Artin first-isomorphism identifications form a natural +isomorphism from norm quotients to finite absolute Galois quotients. -/ +noncomputable def finiteArtinQuotientNaturalIso : + normQuotientDiagram K ≅ absoluteFiniteQuotientDiagram K := + NatIso.ofComponents + (fun N => by + let e : + ((normQuotientDiagram K).obj N : Type) ≃ₜ* + ((absoluteFiniteQuotientDiagram K).obj N : Type) := + { (absoluteFiniteArtinQuotientEquiv K N) with + continuous_toFun := by + change Continuous (absoluteFiniteArtinQuotientEquiv K N) + exact (absoluteFiniteArtinQuotientEquiv K N).continuous + continuous_invFun := by + change Continuous (absoluteFiniteArtinQuotientEquiv K N).symm + exact (absoluteFiniteArtinQuotientEquiv K N).symm.continuous } + exact ProfiniteGrp.ContinuousMulEquiv.toProfiniteGrpIso e) + (fun {N M} f => by + apply ProfiniteGrp.hom_ext + apply ContinuousMonoidHom.ext + intro x + refine QuotientGroup.induction_on x ?_ + intro a + simp only + change absoluteFiniteArtinQuotientEquiv K M + (normQuotientTransition K (leOfHom f) + (normClass K + (absoluteFiniteQuotientField K N) a)) = + absoluteFiniteQuotientTransition (leOfHom f) + (absoluteFiniteArtinQuotientEquiv K N + (normClass K + (absoluteFiniteQuotientField K N) a)) + rw [normQuotientTransition_mk] + rw [absoluteFiniteArtinQuotientEquiv_mk] + rw [absoluteFiniteArtinQuotientEquiv_mk] + exact DFunLike.congr_fun + (absoluteFiniteArtinMap_transition + (K := K) (leOfHom f)).symm a) + +/-- Finite local reciprocity, simultaneously at every open finite quotient: +norm quotients are naturally isomorphic to the corresponding finite abelian +Galois groups. -/ +noncomputable def finiteReciprocityNaturalIso : + normQuotientDiagram K ≅ finiteAbelianGaloisDiagram K := + (finiteArtinQuotientNaturalIso K).trans + (absoluteFiniteQuotientNaturalIso K) + + +end LocalClassFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/LocalMultiplicativeCompletion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/LocalMultiplicativeCompletion.lean new file mode 100644 index 0000000000..c930e50ceb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/LocalMultiplicativeCompletion.lean @@ -0,0 +1,156 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.MultiplicativeDecomposition +public import Mathlib.Data.ZMod.Basic +public import Mathlib.Tactic +/-! +# The profinite completion of a local multiplicative group + +Every nontrivial element of `Kˣ` is detected by an open finite quotient. A +nonzero valuation is detected by a finite cyclic quotient of `ℤ`; an element +of valuation zero is detected by a finite quotient of the profinite unit +group. Consequently the canonical map from `Kˣ` to its completion by open +finite quotients is injective. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace LocalClassFieldTheory + +open scoped ValuativeRel WithZero +open LocalFieldTheory.IsNonarchimedeanLocalField + +/-- The kernel of a continuous homomorphism to a finite discrete group is an +open finite-index normal subgroup. -/ +def finiteTargetKernelOpenFiniteIndexNormalSubgroup + {G : Type u} {F : Type v} + [Group G] [TopologicalSpace G] + [Group F] [Finite F] [TopologicalSpace F] [DiscreteTopology F] + (f : G →ₜ* F) : OpenFiniteIndexNormalSubgroup G := + ⟨ + { toOpenSubgroup := + { toSubgroup := f.toMonoidHom.ker + isOpen' := by + change IsOpen (f ⁻¹' {1}) + exact (isOpen_discrete {1}).preimage f.continuous_toFun } + isNormal' := by + infer_instance }, + Subgroup.finiteIndex_ker f.toMonoidHom⟩ + +/-- The normalized valuation reduced modulo `n`, as a continuous +multiplicative homomorphism. The topology on the finite target is supplied by +the caller so that no global instance is introduced for the type tag. -/ +def valuationModContinuousMonoidHom + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (n : ℕ) + [TopologicalSpace (Multiplicative (ZMod n))] + : + Kˣ →ₜ* Multiplicative (ZMod n) where + toMonoidHom := + (Int.castAddHom (ZMod n)).toMultiplicative.comp (valuationUnitsMulHom K) + continuous_toFun := by + exact (continuous_of_discreteTopology : Continuous + (Int.castAddHom (ZMod n)).toMultiplicative).comp + (valuationUnitsMulHom_continuous K) + +/-- Every nontrivial element of `Kˣ` is omitted by some open finite-index +normal subgroup. -/ +theorem exists_openFiniteIndexNormalSubgroup_not_mem_localMultiplicativeGroup + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (x : Kˣ) (hx : x ≠ 1) : + ∃ H : OpenFiniteIndexNormalSubgroup Kˣ, + x ∉ H.toOpenNormalSubgroup.toSubgroup := by + let valuationExponent : ℤ := valuationMap K (Additive.ofMul x) + by_cases hvaluation : valuationExponent = 0 + · have hvaluation' : valuationMap K (Additive.ofMul x) = 0 := by + simpa [valuationExponent] using hvaluation + let unitFactor : Kˣ →ₜ* LocalFieldTheory.localUnitsProfinite K := + localUnitFactorContinuousMonoidHom K + let ux : LocalFieldTheory.localUnitsProfinite K := unitFactor x + have hux : ux ≠ 1 := by + intro h + apply hx + have hembed : integerUnitsToFieldUnits K (unitFactor x) = x := by + change integerUnitsToFieldUnits K + (uniformizerUnitFactor K (chosenLocalUniformizer K) + (chosenLocalUniformizer_spec K) x) = x + rw [integerUnitsToFieldUnits_uniformizerUnitFactor, hvaluation'] + simp + calc + x = integerUnitsToFieldUnits K (unitFactor x) := hembed.symm + _ = integerUnitsToFieldUnits K ux := rfl + _ = integerUnitsToFieldUnits K 1 := congrArg _ h + _ = 1 := map_one (integerUnitsToFieldUnits K) + have hone : (1 : LocalFieldTheory.localUnitsProfinite K) ∈ + ({ux}ᶜ : Set (LocalFieldTheory.localUnitsProfinite K)) := by + simpa using hux.symm + obtain ⟨N, hN⟩ := + ProfiniteGrp.exist_openNormalSubgroup_sub_open_nhds_of_one + (isOpen_compl_singleton : IsOpen + ({ux}ᶜ : Set (LocalFieldTheory.localUnitsProfinite K))) hone + let H : OpenFiniteIndexNormalSubgroup Kˣ := + topologicalProfiniteCompletionPreimageIndex + (LocalFieldTheory.localUnitsProfinite K) unitFactor N + refine ⟨H, ?_⟩ + intro hmem + have hunit : unitFactor x ∈ N := hmem + have hnot : unitFactor x ∈ + ({ux}ᶜ : Set (LocalFieldTheory.localUnitsProfinite K)) := hN hunit + exact hnot (by rfl) + · let n : ℕ := valuationExponent.natAbs + 1 + let : TopologicalSpace (Multiplicative (ZMod n)) := ⊥ + let : DiscreteTopology (Multiplicative (ZMod n)) := ⟨rfl⟩ + let valuationMod : Kˣ →ₜ* Multiplicative (ZMod n) := + valuationModContinuousMonoidHom K n + let H : OpenFiniteIndexNormalSubgroup Kˣ := + finiteTargetKernelOpenFiniteIndexNormalSubgroup valuationMod + refine ⟨H, ?_⟩ + change valuationMod x ≠ 1 + have hcast : (valuationExponent : ZMod n) ≠ 0 := by + intro hzero + have hdvd : (n : ℤ) ∣ valuationExponent := + (ZMod.intCast_zmod_eq_zero_iff_dvd valuationExponent n).mp hzero + have hle := Int.natAbs_le_of_dvd_ne_zero hdvd hvaluation + simp only [Int.natAbs_natCast, n] at hle + omega + change Multiplicative.ofAdd ((valuationExponent : ℤ) : ZMod n) ≠ 1 + simpa using hcast + +/-- The intersection of the open finite-index normal subgroups of `Kˣ` is +trivial. -/ +theorem localMultiplicativeGroup_residuallyFinite + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + (⨅ H : OpenFiniteIndexNormalSubgroup Kˣ, + H.toOpenNormalSubgroup.toSubgroup) = ⊥ := by + apply le_antisymm + · intro x hx + rw [Subgroup.mem_bot] + by_contra hne + obtain ⟨H, hxH⟩ := + exists_openFiniteIndexNormalSubgroup_not_mem_localMultiplicativeGroup K x hne + exact hxH (Subgroup.mem_iInf.mp hx H) + · exact bot_le + +/-- The canonical map from a local multiplicative group to its completion by +open finite quotients is injective. -/ +theorem topologicalProfiniteCompletionMap_injective_localField + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + Function.Injective (topologicalProfiniteCompletionMap Kˣ) := + topologicalProfiniteCompletionMap_injective_of_iInf_eq_bot Kˣ + (localMultiplicativeGroup_residuallyFinite K) + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletion.lean new file mode 100644 index 0000000000..8cda805203 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletion.lean @@ -0,0 +1,595 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Basic +public import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Limits +public import Mathlib.Topology.Algebra.Group.Quotient +public import Mathlib.Topology.Algebra.OpenSubgroup +/-! +# Completion by open finite quotients + +This module constructs the topological profinite completion of a topological +group from its open finite-index normal subgroups. Unlike the abstract +completion by all finite quotients, the indexing category records the topology +on the source group. This is the completion needed for infinite local +reciprocity. + +The construction uses Mathlib's category of profinite groups, products, and +closed subgroups; it does not depend on a separate copied inverse-system implementation. +-/ + +@[expose] public section + +noncomputable +section + +open CategoryTheory +open scoped Pointwise + +namespace LocalClassFieldTheory + +universe u v w + +/-- An open normal subgroup whose quotient has finite cardinality. + +This is a property subtype of the standard `OpenNormalSubgroup`, so its order +and proof irrelevance come from the underlying object instead of a parallel +hand-written order implementation. -/ +def OpenFiniteIndexNormalSubgroup (G : Type u) [Group G] [TopologicalSpace G] := + { H : OpenNormalSubgroup G // H.toSubgroup.FiniteIndex } + +namespace OpenFiniteIndexNormalSubgroup + +variable {G : Type u} [Group G] [TopologicalSpace G] + +/-- The underlying open normal subgroup. -/ +def toOpenNormalSubgroup (H : OpenFiniteIndexNormalSubgroup G) : + OpenNormalSubgroup G := + H.1 + +/-- The finite-index witness carried by the subtype. -/ +theorem finiteIndex' (H : OpenFiniteIndexNormalSubgroup G) : + H.toOpenNormalSubgroup.toSubgroup.FiniteIndex := + H.2 + +/-- Finite-index open normal subgroups are determined by their underlying open normal subgroups. -/ +@[ext] +theorem ext {H K : OpenFiniteIndexNormalSubgroup G} + (h : H.toOpenNormalSubgroup = K.toOpenNormalSubgroup) : H = K := + Subtype.ext h + +/-- An indexed open normal subgroup carries its finite-index witness as an instance. -/ +instance (H : OpenFiniteIndexNormalSubgroup G) : + H.toOpenNormalSubgroup.toSubgroup.FiniteIndex := + H.finiteIndex' + +/-- Open finite-index normal subgroups are ordered by inclusion. -/ +instance : PartialOrder (OpenFiniteIndexNormalSubgroup G) := + Subtype.partialOrder + (fun H : OpenNormalSubgroup G => H.toSubgroup.FiniteIndex) + +/-- The inclusion preorder makes open finite-index normal subgroups a small thin category. -/ +instance : SmallCategory (OpenFiniteIndexNormalSubgroup G) := + Preorder.smallCategory _ + +/-- A morphism of open finite-index normal subgroups induces inclusion of the underlying +subgroups. -/ +theorem le_of_hom {H K : OpenFiniteIndexNormalSubgroup G} (f : H ⟶ K) : + H.toOpenNormalSubgroup.toSubgroup ≤ K.toOpenNormalSubgroup.toSubgroup := by + have h : H ≤ K := CategoryTheory.leOfHom f + change H.toOpenNormalSubgroup ≤ K.toOpenNormalSubgroup at h + exact h + +end OpenFiniteIndexNormalSubgroup + +section Completion + +variable (G : Type u) [Group G] [TopologicalSpace G] [IsTopologicalGroup G] + +/-- The functor of finite quotients attached to open finite-index normal +subgroups. Inclusion of subgroups induces the corresponding quotient map. -/ +def openFiniteQuotientFunctor : + OpenFiniteIndexNormalSubgroup G ⥤ FiniteGrp where + obj H := FiniteGrp.of (G ⧸ H.toOpenNormalSubgroup.toSubgroup) + map := fun hHK => FiniteGrp.ofHom <| + QuotientGroup.map _ _ (.id _) (by + simpa using OpenFiniteIndexNormalSubgroup.le_of_hom hHK) + map_id _ := ConcreteCategory.ext <| QuotientGroup.map_id _ + map_comp f g := ConcreteCategory.ext <| + (QuotientGroup.map_comp_map _ _ _ (.id _) (.id _) + (by simpa using OpenFiniteIndexNormalSubgroup.le_of_hom f) + (by simpa using OpenFiniteIndexNormalSubgroup.le_of_hom g)).symm + +/-- The same finite-quotient diagram, regarded in profinite groups with the +discrete topology on every finite stage. -/ +noncomputable def openFiniteQuotientDiagram : + OpenFiniteIndexNormalSubgroup G ⥤ ProfiniteGrp := + openFiniteQuotientFunctor G ⋙ forget₂ FiniteGrp ProfiniteGrp + +/-- The finite profinite quotient attached to an open finite-index normal +subgroup. -/ +noncomputable def openFiniteQuotient + (H : OpenFiniteIndexNormalSubgroup G) : ProfiniteGrp := + (openFiniteQuotientDiagram G).obj H + +/-- The product of all open finite quotients. -/ +abbrev openFiniteQuotientProduct : ProfiniteGrp := + ProfiniteGrp.pi (fun H : OpenFiniteIndexNormalSubgroup G => + openFiniteQuotient G H) + +/-- The diagonal homomorphism to the product of all open finite quotients. -/ +def openFiniteQuotientProductMapMonoidHom : + G →* openFiniteQuotientProduct G where + toFun g H := QuotientGroup.mk g + map_one' := by + funext H + rfl + map_mul' x y := by + funext H + rfl + +/-- The diagonal map into the product of open finite quotients is continuous. -/ +theorem openFiniteQuotientProductMapMonoidHom_continuous : + Continuous (openFiniteQuotientProductMapMonoidHom G) := by + apply continuous_pi + intro H + apply Continuous.mk + intro s _ + change IsOpen ((fun g : G => (QuotientGroup.mk g : G ⧸ H.toOpenNormalSubgroup.toSubgroup)) ⁻¹' s) + rw [← Set.biUnion_preimage_singleton QuotientGroup.mk s] + refine isOpen_iUnion (fun i => isOpen_iUnion (fun _ => ?_)) + convert IsOpen.leftCoset + H.toOpenNormalSubgroup.toOpenSubgroup.isOpen' (Quotient.out i) + ext x + simp only [Set.mem_preimage, Set.mem_singleton_iff] + nth_rw 1 [← QuotientGroup.out_eq' i, eq_comm, QuotientGroup.eq] + exact Iff.symm (Set.mem_smul_set_iff_inv_smul_mem) + +/-- The topological profinite completion over open finite quotients, realized +as the closure of the diagonal image in their product. -/ +noncomputable def TopologicalProfiniteCompletion : ProfiniteGrp := + ProfiniteGrp.ofClosedSubgroup + { toSubgroup := + (MonoidHom.range (openFiniteQuotientProductMapMonoidHom G)).topologicalClosure + isClosed' := Subgroup.isClosed_topologicalClosure _ } + +/-- The canonical continuous homomorphism into the open-quotient completion. -/ +def topologicalProfiniteCompletionMap : + G →ₜ* TopologicalProfiniteCompletion G where + toFun g := + ⟨openFiniteQuotientProductMapMonoidHom G g, + Subgroup.le_topologicalClosure + (MonoidHom.range (openFiniteQuotientProductMapMonoidHom G)) ⟨g, rfl⟩⟩ + map_one' := by + apply Subtype.ext + exact (openFiniteQuotientProductMapMonoidHom G).map_one + map_mul' x y := by + apply Subtype.ext + exact (openFiniteQuotientProductMapMonoidHom G).map_mul x y + continuous_toFun := + (openFiniteQuotientProductMapMonoidHom_continuous G).subtype_mk _ + +/-- The canonical map has dense image in the open-quotient completion. -/ +theorem topologicalProfiniteCompletionMap_denseRange : + DenseRange (topologicalProfiniteCompletionMap G) := by + let S : Subgroup (openFiniteQuotientProduct G) := + MonoidHom.range (openFiniteQuotientProductMapMonoidHom G) + let incl : S → S.topologicalClosure := + Set.inclusion (Subgroup.le_topologicalClosure S) + have hincl : DenseRange incl := + (denseRange_inclusion_iff + (Subgroup.le_topologicalClosure S : + (S : Set (openFiniteQuotientProduct G)) ⊆ + (S.topologicalClosure : Set (openFiniteQuotientProduct G)))).2 <| by + simp [Subgroup.topologicalClosure_coe] + have hrange : + Set.range (topologicalProfiniteCompletionMap G) = Set.range incl := by + ext x + constructor + · rintro ⟨g, rfl⟩ + exact ⟨(openFiniteQuotientProductMapMonoidHom G).rangeRestrict g, rfl⟩ + · rintro ⟨y, rfl⟩ + rcases y.2 with ⟨g, hg⟩ + refine ⟨g, ?_⟩ + apply Subtype.ext + change (openFiniteQuotientProductMapMonoidHom G) g = y + exact hg + intro x + rw [hrange] + exact hincl x + +/-- Projection of the completion to one of its defining finite quotients. -/ +def topologicalProfiniteCompletionProjection + (H : OpenFiniteIndexNormalSubgroup G) : + TopologicalProfiniteCompletion G →ₜ* openFiniteQuotient G H where + toFun x := x.1 H + map_one' := rfl + map_mul' _ _ := rfl + continuous_toFun := (continuous_apply H).comp continuous_subtype_val + +/-- Projecting the canonical completion image of `g` gives its quotient class. -/ +@[simp] +theorem topologicalProfiniteCompletionProjection_map + (H : OpenFiniteIndexNormalSubgroup G) (g : G) : + topologicalProfiniteCompletionProjection G H + (topologicalProfiniteCompletionMap G g) = + QuotientGroup.mk g := + rfl + +/-- Every defining finite quotient is reached by the canonical projection +from the topological profinite completion. -/ +theorem topologicalProfiniteCompletionProjection_surjective + (H : OpenFiniteIndexNormalSubgroup G) : + Function.Surjective (topologicalProfiniteCompletionProjection G H) := by + intro x + obtain ⟨g, rfl⟩ := QuotientGroup.mk_surjective x + exact ⟨topologicalProfiniteCompletionMap G g, + topologicalProfiniteCompletionProjection_map G H g⟩ + +/-- The kernel of the canonical completion map is the intersection of all +open finite-index normal subgroups. -/ +theorem topologicalProfiniteCompletionMap_ker : + (topologicalProfiniteCompletionMap G).ker = + ⨅ H : OpenFiniteIndexNormalSubgroup G, + H.toOpenNormalSubgroup.toSubgroup := by + ext g + rw [Subgroup.mem_iInf] + constructor + · intro hg H + have hval : + openFiniteQuotientProductMapMonoidHom G g = + (1 : openFiniteQuotientProduct G) := + congrArg Subtype.val hg + have hcoord := congrFun hval H + exact (QuotientGroup.eq_one_iff g).mp hcoord + · intro hg + change topologicalProfiniteCompletionMap G g = 1 + apply Subtype.ext + funext H + exact (QuotientGroup.eq_one_iff g).mpr (hg H) + +/-- The canonical completion map is injective exactly when the intersection +of all open finite-index normal subgroups is trivial. -/ +theorem topologicalProfiniteCompletionMap_injective_iff : + Function.Injective (topologicalProfiniteCompletionMap G) ↔ + (⨅ H : OpenFiniteIndexNormalSubgroup G, + H.toOpenNormalSubgroup.toSubgroup) = ⊥ := by + change Function.Injective (topologicalProfiniteCompletionMap G).toMonoidHom ↔ _ + rw [← MonoidHom.ker_eq_bot_iff, topologicalProfiniteCompletionMap_ker] + +/-- A separated open finite-quotient topology gives an injective canonical +completion map. -/ +theorem topologicalProfiniteCompletionMap_injective_of_iInf_eq_bot + (h : + (⨅ H : OpenFiniteIndexNormalSubgroup G, + H.toOpenNormalSubgroup.toSubgroup) = ⊥) : + Function.Injective (topologicalProfiniteCompletionMap G) := + (topologicalProfiniteCompletionMap_injective_iff G).2 h + +/-- The finite quotient projections commute with every transition map in the +open finite-quotient diagram. -/ +theorem topologicalProfiniteCompletionProjection_transition + {H K : OpenFiniteIndexNormalSubgroup G} (f : H ⟶ K) + (x : TopologicalProfiniteCompletion G) : + (openFiniteQuotientDiagram G).map f + (topologicalProfiniteCompletionProjection G H x) = + topologicalProfiniteCompletionProjection G K x := by + let lhs : TopologicalProfiniteCompletion G → openFiniteQuotient G K := + fun y => + (openFiniteQuotientDiagram G).map f + (topologicalProfiniteCompletionProjection G H y) + let rhs : TopologicalProfiniteCompletion G → openFiniteQuotient G K := + fun y => topologicalProfiniteCompletionProjection G K y + have hlhs : Continuous lhs := + ((openFiniteQuotientDiagram G).map f).hom.continuous_toFun.comp + (topologicalProfiniteCompletionProjection G H).continuous_toFun + have hrhs : Continuous rhs := + (topologicalProfiniteCompletionProjection G K).continuous_toFun + have heq : lhs = rhs := + (topologicalProfiniteCompletionMap_denseRange G).equalizer hlhs hrhs <| by + funext g + rfl + exact congrFun heq x + +end Completion + +/-! ### Universal property -/ + +variable {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G] + +/-- The open finite-index normal subgroup obtained by pulling an open normal +subgroup of a profinite target back along a continuous homomorphism. -/ +def topologicalProfiniteCompletionPreimageIndex + (P : ProfiniteGrp.{v}) (f : G →ₜ* P) (N : OpenNormalSubgroup P) : + OpenFiniteIndexNormalSubgroup G := + ⟨ + { toOpenSubgroup := N.toOpenSubgroup.comap f.toMonoidHom f.continuous_toFun + isNormal' := by + change ((N : Subgroup P).comap f.toMonoidHom).Normal + infer_instance }, + by + let q : G →* P ⧸ (N : Subgroup P) := + (QuotientGroup.mk' (N : Subgroup P)).comp f.toMonoidHom + let : q.ker.FiniteIndex := Subgroup.finiteIndex_ker q + apply Subgroup.finiteIndex_of_le (H := q.ker) + intro g hg + change f g ∈ N + exact (QuotientGroup.eq_one_iff (f g)).mp hg⟩ + +/-- The finite-stage map induced by a continuous homomorphism to a profinite +group, after quotienting by the pulled-back open normal subgroup. -/ +def topologicalProfiniteCompletionFiniteQuotientMap + (P : ProfiniteGrp.{v}) (f : G →ₜ* P) (N : OpenNormalSubgroup P) : + G ⧸ (topologicalProfiniteCompletionPreimageIndex P f N).toOpenNormalSubgroup.toSubgroup →* + P ⧸ (N : Subgroup P) := + QuotientGroup.lift _ + ((QuotientGroup.mk' (N : Subgroup P)).comp f.toMonoidHom) <| by + intro g hg + exact (QuotientGroup.eq_one_iff (f g)).mpr hg + +/-- The finite-stage map as a continuous homomorphism between the corresponding +finite profinite quotients. + +This is deliberately a `ContinuousMonoidHom`, rather than a categorical +`ProfiniteGrp` morphism: the latter forces source and target into the same +universe even though the universal property has no such mathematical +restriction. -/ +def topologicalProfiniteCompletionFiniteQuotientMorphism + (P : ProfiniteGrp.{v}) (f : G →ₜ* P) (N : OpenNormalSubgroup P) : + openFiniteQuotient G (topologicalProfiniteCompletionPreimageIndex P f N) →ₜ* + (P.toFiniteQuotientFunctor ⋙ forget₂ FiniteGrp ProfiniteGrp).obj N where + toMonoidHom := topologicalProfiniteCompletionFiniteQuotientMap P f N + continuous_toFun := by + let : DiscreteTopology + (openFiniteQuotient G + (topologicalProfiniteCompletionPreimageIndex P f N)) := + ⟨rfl⟩ + exact continuous_of_discreteTopology + +/-- The continuous projection from the open-quotient completion to an open +finite quotient of a profinite target. -/ +def topologicalProfiniteCompletionFiniteProjection + (P : ProfiniteGrp.{v}) (f : G →ₜ* P) (N : OpenNormalSubgroup P) : + TopologicalProfiniteCompletion G →ₜ* + (P.toFiniteQuotientFunctor ⋙ forget₂ FiniteGrp ProfiniteGrp).obj N := + (topologicalProfiniteCompletionFiniteQuotientMorphism P f N).comp + (topologicalProfiniteCompletionProjection G + (topologicalProfiniteCompletionPreimageIndex P f N)) + +/-- The induced finite projection sends the completion image of `g` to the class of `f g`. -/ +theorem topologicalProfiniteCompletionFiniteProjection_map + (P : ProfiniteGrp.{v}) (f : G →ₜ* P) (N : OpenNormalSubgroup P) (g : G) : + topologicalProfiniteCompletionFiniteProjection P f N + (topologicalProfiniteCompletionMap G g) = + QuotientGroup.mk' (N : Subgroup P) (f g) := + rfl + +/-- The finite projections induced by a map to a profinite group commute with +the transition maps between the target's open finite quotients. -/ +theorem topologicalProfiniteCompletionFiniteProjection_transition + (P : ProfiniteGrp.{v}) (f : G →ₜ* P) + {N M : OpenNormalSubgroup P} (i : N ⟶ M) + (x : TopologicalProfiniteCompletion G) : + (P.toFiniteQuotientFunctor ⋙ forget₂ FiniteGrp ProfiniteGrp).map i + (topologicalProfiniteCompletionFiniteProjection P f N x) = + topologicalProfiniteCompletionFiniteProjection P f M x := by + let lhs := + fun y => + (P.toFiniteQuotientFunctor ⋙ forget₂ FiniteGrp ProfiniteGrp).map i + (topologicalProfiniteCompletionFiniteProjection P f N y) + let rhs := + fun y => topologicalProfiniteCompletionFiniteProjection P f M y + have hlhs : Continuous lhs := + ((P.toFiniteQuotientFunctor ⋙ forget₂ FiniteGrp ProfiniteGrp).map i).hom.continuous_toFun.comp + (topologicalProfiniteCompletionFiniteProjection P f N).continuous_toFun + have hrhs : Continuous rhs := + (topologicalProfiniteCompletionFiniteProjection P f M).continuous_toFun + have heq : lhs = rhs := + (topologicalProfiniteCompletionMap_denseRange G).equalizer hlhs hrhs <| by + funext g + rfl + exact congrFun heq x + +/-- The map from the open-quotient completion to the inverse limit of all +finite quotients of a profinite target. -/ +noncomputable def topologicalProfiniteCompletionToFiniteQuotientLimit + (P : ProfiniteGrp.{v}) (f : G →ₜ* P) : + TopologicalProfiniteCompletion G →ₜ* + ProfiniteGrp.limit (ProfiniteGrp.diagram P) where + toFun x := + ⟨fun N => topologicalProfiniteCompletionFiniteProjection P f N x, + by + intro N M i + exact topologicalProfiniteCompletionFiniteProjection_transition P f i x⟩ + map_one' := by + apply Subtype.ext + funext N + exact (topologicalProfiniteCompletionFiniteProjection P f N).map_one + map_mul' x y := by + apply Subtype.ext + funext N + exact (topologicalProfiniteCompletionFiniteProjection P f N).map_mul x y + continuous_toFun := by + apply continuous_induced_rng.mpr + apply continuous_pi + intro N + exact (topologicalProfiniteCompletionFiniteProjection P f N).continuous_toFun + +/-- A continuous homomorphism from `G` to a profinite group extends canonically +to the completion of `G` by its open finite quotients. -/ +noncomputable def topologicalProfiniteCompletionLift + (P : ProfiniteGrp.{v}) (f : G →ₜ* P) : + TopologicalProfiniteCompletion G →ₜ* P := + (ContinuousMonoidHom.toContinuousMonoidHom + (ProfiniteGrp.continuousMulEquivLimittoFiniteQuotientFunctor P).symm).comp + (topologicalProfiniteCompletionToFiniteQuotientLimit P f) + +/-- The canonical lift agrees with the original homomorphism on the dense image of `G`. -/ +@[simp] +theorem topologicalProfiniteCompletionLift_map + (P : ProfiniteGrp.{v}) (f : G →ₜ* P) (g : G) : + topologicalProfiniteCompletionLift P f + (topologicalProfiniteCompletionMap G g) = + f g := by + let e := ProfiniteGrp.continuousMulEquivLimittoFiniteQuotientFunctor P + apply e.injective + change e (e.symm (topologicalProfiniteCompletionToFiniteQuotientLimit P f + (topologicalProfiniteCompletionMap G g))) = e (f g) + rw [e.apply_symm_apply] + apply Subtype.ext + funext N + rfl + +/-- The canonical lift composed with the completion map is the original +continuous homomorphism. -/ +@[simp] +theorem topologicalProfiniteCompletionLift_comp_map + (P : ProfiniteGrp.{v}) (f : G →ₜ* P) : + (topologicalProfiniteCompletionLift P f).comp + (topologicalProfiniteCompletionMap G) = f := by + ext g + exact topologicalProfiniteCompletionLift_map P f g + +/-- The canonical lift is the unique continuous homomorphism extending the +given map on the dense image of `G`. -/ +theorem topologicalProfiniteCompletionLift_unique + (P : ProfiniteGrp.{v}) (f : G →ₜ* P) + (h : TopologicalProfiniteCompletion G →ₜ* P) + (hh : h.comp (topologicalProfiniteCompletionMap G) = f) : + h = topologicalProfiniteCompletionLift P f := by + let lhs : TopologicalProfiniteCompletion G → P := fun x => h x + let rhs : TopologicalProfiniteCompletion G → P := + fun x => topologicalProfiniteCompletionLift P f x + have heq : lhs = rhs := + (topologicalProfiniteCompletionMap_denseRange G).equalizer + h.continuous_toFun + (topologicalProfiniteCompletionLift P f).continuous_toFun <| by + funext g + change h (topologicalProfiniteCompletionMap G g) = + topologicalProfiniteCompletionLift P f + (topologicalProfiniteCompletionMap G g) + rw [topologicalProfiniteCompletionLift_map] + exact DFunLike.congr_fun hh g + apply ContinuousMonoidHom.ext + intro x + exact congrFun heq x + +/-! ### Functorial action -/ + +variable {H : Type v} [Group H] [TopologicalSpace H] [IsTopologicalGroup H] + +/-- A continuous homomorphism induces the canonical map between open-quotient +completions. -/ +noncomputable def topologicalProfiniteCompletionMapHom (f : G →ₜ* H) : + TopologicalProfiniteCompletion G →ₜ* TopologicalProfiniteCompletion H := + topologicalProfiniteCompletionLift (TopologicalProfiniteCompletion H) + ((topologicalProfiniteCompletionMap H).comp f) + +/-- The map induced on completions carries canonical images to canonical images. -/ +@[simp] +theorem topologicalProfiniteCompletionMapHom_map + (f : G →ₜ* H) (g : G) : + topologicalProfiniteCompletionMapHom f + (topologicalProfiniteCompletionMap G g) = + topologicalProfiniteCompletionMap H (f g) := + topologicalProfiniteCompletionLift_map + (TopologicalProfiniteCompletion H) + ((topologicalProfiniteCompletionMap H).comp f) g + +/-- The homomorphism induced by the identity is the identity on the completion. -/ +@[simp] +theorem topologicalProfiniteCompletionMapHom_id : + topologicalProfiniteCompletionMapHom + (ContinuousMonoidHom.id G) = + ContinuousMonoidHom.id (TopologicalProfiniteCompletion G) := by + apply ContinuousMonoidHom.ext + intro x + let lhs : TopologicalProfiniteCompletion G → + TopologicalProfiniteCompletion G := + fun y => topologicalProfiniteCompletionMapHom + (ContinuousMonoidHom.id G) y + let rhs : TopologicalProfiniteCompletion G → + TopologicalProfiniteCompletion G := fun y => y + have heq : lhs = rhs := + (topologicalProfiniteCompletionMap_denseRange G).equalizer + (topologicalProfiniteCompletionMapHom + (ContinuousMonoidHom.id G)).continuous_toFun + continuous_id <| by + funext g + change topologicalProfiniteCompletionMapHom + (ContinuousMonoidHom.id G) + (topologicalProfiniteCompletionMap G g) = + topologicalProfiniteCompletionMap G g + rw [topologicalProfiniteCompletionMapHom_map] + rfl + exact congrFun heq x + +variable {J : Type w} [Group J] [TopologicalSpace J] [IsTopologicalGroup J] + +/-- Passing to topological profinite completions preserves composition. -/ +@[simp] +theorem topologicalProfiniteCompletionMapHom_comp + (f : G →ₜ* H) (g : H →ₜ* J) : + topologicalProfiniteCompletionMapHom (g.comp f) = + (topologicalProfiniteCompletionMapHom g).comp + (topologicalProfiniteCompletionMapHom f) := by + apply ContinuousMonoidHom.ext + intro x + let lhs : TopologicalProfiniteCompletion G → + TopologicalProfiniteCompletion J := + fun y => topologicalProfiniteCompletionMapHom (g.comp f) y + let rhs : TopologicalProfiniteCompletion G → + TopologicalProfiniteCompletion J := + fun y => topologicalProfiniteCompletionMapHom g + (topologicalProfiniteCompletionMapHom f y) + have heq : lhs = rhs := + (topologicalProfiniteCompletionMap_denseRange G).equalizer + (topologicalProfiniteCompletionMapHom + (g.comp f)).continuous_toFun + ((topologicalProfiniteCompletionMapHom g).continuous_toFun.comp + (topologicalProfiniteCompletionMapHom f).continuous_toFun) <| by + funext x + change topologicalProfiniteCompletionMapHom (g.comp f) + (topologicalProfiniteCompletionMap G x) = + topologicalProfiniteCompletionMapHom g + (topologicalProfiniteCompletionMapHom f + (topologicalProfiniteCompletionMap G x)) + rw [topologicalProfiniteCompletionMapHom_map, + topologicalProfiniteCompletionMapHom_map, + topologicalProfiniteCompletionMapHom_map] + rfl + exact congrFun heq x + +/-- Bundled universal-arrow formulation of completion by open finite +quotients. This is the adjunction data used by clients: maps from `G` to a +profinite group correspond to a unique continuous homomorphism out of its +completion. The target universe is independent of the source universe. -/ +structure ProfiniteCompletionUniversalProperty + (G : Type u) [Group G] [TopologicalSpace G] [IsTopologicalGroup G] + (C : ProfiniteGrp.{u}) (ι : G →ₜ* C) : Prop where + /-- The image of the canonical map `ι` is dense in the profinite completion candidate `C`. -/ + denseRange : DenseRange ι + /-- Every continuous homomorphism from `G` to a profinite group factors uniquely through `ι`. -/ + existsUniqueLift : + ∀ (P : ProfiniteGrp.{v}) (f : G →ₜ* P), + ∃! lift : C →ₜ* P, lift.comp ι = f + +/-- The constructed completion satisfies the bundled universal property. -/ +theorem topologicalProfiniteCompletion_universalProperty : + ProfiniteCompletionUniversalProperty G + (TopologicalProfiniteCompletion G) + (topologicalProfiniteCompletionMap G) where + denseRange := topologicalProfiniteCompletionMap_denseRange G + existsUniqueLift := by + intro P f + refine ⟨topologicalProfiniteCompletionLift P f, + topologicalProfiniteCompletionLift_comp_map P f, ?_⟩ + intro lift hlift + exact topologicalProfiniteCompletionLift_unique P f lift hlift + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletionCriteria.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletionCriteria.lean new file mode 100644 index 0000000000..248bdd57b0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletionCriteria.lean @@ -0,0 +1,131 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletion +/-! +# Bijectivity criteria for maps out of the open-quotient completion + +The universal lift to a profinite target is onto when the original map has +dense range. It is one-to-one when pullbacks of open normal subgroups of the +target are cofinal among the defining open finite-index normal subgroups of +the source. These criteria isolate the purely topological part of infinite +local reciprocity from the arithmetic existence theorem. +-/ + +@[expose] public section + +noncomputable +section + +open CategoryTheory + +namespace LocalClassFieldTheory + +universe u + +variable {G : Type u} [Group G] [TopologicalSpace G] + +/-- Quotienting by the exact pullback of an open normal subgroup gives an +injective map to the corresponding finite quotient of the target. -/ +theorem topologicalProfiniteCompletionFiniteQuotientMap_injective + (P : ProfiniteGrp.{u}) (f : G →ₜ* P) (N : OpenNormalSubgroup P) : + Function.Injective + (topologicalProfiniteCompletionFiniteQuotientMap P f N) := by + rw [← MonoidHom.ker_eq_bot_iff] + apply le_antisymm + · intro x hx + obtain ⟨g, rfl⟩ := QuotientGroup.mk'_surjective + (topologicalProfiniteCompletionPreimageIndex P f N).toOpenNormalSubgroup.toSubgroup x + change QuotientGroup.mk' (N : Subgroup P) (f g) = 1 at hx + apply (QuotientGroup.eq_one_iff g).2 + exact (QuotientGroup.eq_one_iff (f g)).1 hx + · exact bot_le + +variable [IsTopologicalGroup G] + +/-- Dense range of the original map implies surjectivity of its canonical +extension from the open-quotient completion. -/ +theorem topologicalProfiniteCompletionLift_surjective_of_denseRange + (P : ProfiniteGrp.{u}) (f : G →ₜ* P) (hf : DenseRange f) : + Function.Surjective (topologicalProfiniteCompletionLift P f) := by + let F := topologicalProfiniteCompletionLift P f + have hF_dense : DenseRange F := by + intro y + apply closure_mono (s := Set.range f) (t := Set.range F) ?_ (hf y) + rintro z ⟨g, rfl⟩ + exact ⟨topologicalProfiniteCompletionMap G g, + topologicalProfiniteCompletionLift_map P f g⟩ + have hclosed : IsClosed (Set.range F) := + F.continuous_toFun.isClosedMap.isClosed_range + rw [← Set.range_eq_univ, ← closure_eq_iff_isClosed.mpr hclosed] + exact hF_dense.closure_eq + +/-- Cofinality of pulled-back target quotients implies injectivity of the +canonical lift from the open-quotient completion. -/ +theorem topologicalProfiniteCompletionLift_injective_of_preimage_cofinal + (P : ProfiniteGrp.{u}) (f : G →ₜ* P) + (hcofinal : ∀ H : OpenFiniteIndexNormalSubgroup G, + ∃ N : OpenNormalSubgroup P, + topologicalProfiniteCompletionPreimageIndex P f N ≤ H) : + Function.Injective (topologicalProfiniteCompletionLift P f) := by + change Function.Injective + (topologicalProfiniteCompletionLift P f).toMonoidHom + rw [← MonoidHom.ker_eq_bot_iff] + apply le_antisymm + · intro x hx + change x = 1 + apply Subtype.ext + funext H + obtain ⟨N, hNH⟩ := hcofinal H + let e := ProfiniteGrp.continuousMulEquivLimittoFiniteQuotientFunctor P + have hlimit : + topologicalProfiniteCompletionToFiniteQuotientLimit P f x = 1 := by + have he := congrArg e hx + simpa [topologicalProfiniteCompletionLift, e] using he + have hfinite : + topologicalProfiniteCompletionFiniteProjection P f N x = 1 := by + exact congrFun (congrArg Subtype.val hlimit) N + have hpreimage : + topologicalProfiniteCompletionProjection G + (topologicalProfiniteCompletionPreimageIndex P f N) x = 1 := by + have hinjective : Function.Injective + (topologicalProfiniteCompletionFiniteQuotientMorphism P f N) := by + change Function.Injective + (topologicalProfiniteCompletionFiniteQuotientMap P f N) + exact topologicalProfiniteCompletionFiniteQuotientMap_injective P f N + change + topologicalProfiniteCompletionFiniteQuotientMorphism P f N + (topologicalProfiniteCompletionProjection G + (topologicalProfiniteCompletionPreimageIndex P f N) x) = 1 + at hfinite + apply hinjective + simpa only [map_one] using hfinite + let i : topologicalProfiniteCompletionPreimageIndex P f N ⟶ H := + hNH.hom + have htransition := + topologicalProfiniteCompletionProjection_transition G i x + have hmap : + (ProfiniteGrp.Hom.hom ((openFiniteQuotientDiagram G).map i)) + (topologicalProfiniteCompletionProjection G + (topologicalProfiniteCompletionPreimageIndex P f N) x) = + (ProfiniteGrp.Hom.hom ((openFiniteQuotientDiagram G).map i)) + (1 : (openFiniteQuotientDiagram G).obj + (topologicalProfiniteCompletionPreimageIndex P f N)) := + congrArg + (ProfiniteGrp.Hom.hom ((openFiniteQuotientDiagram G).map i)) + hpreimage + have hone : + (ProfiniteGrp.Hom.hom ((openFiniteQuotientDiagram G).map i)) + (1 : (openFiniteQuotientDiagram G).obj + (topologicalProfiniteCompletionPreimageIndex P f N)) = + (1 : (openFiniteQuotientDiagram G).obj H) := + map_one _ + exact htransition.symm.trans (hmap.trans hone) + · exact bot_le + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteLocalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteLocalReciprocity.lean new file mode 100644 index 0000000000..b9cb6ef04e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteLocalReciprocity.lean @@ -0,0 +1,402 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteAbelianQuotientKernels +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.LocalMultiplicativeCompletion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteGaloisAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.TopologicalAbelianizationCongr +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteExtensionCorrespondence +/-! +# Profinite local reciprocity + +The absolute Artin map constructed from the compatible finite reciprocity +maps is transported from the fixed separable closure to Mathlib's usual +algebraic-closure absolute Galois group. Its canonical extension to the +topological profinite completion is then automatically onto. Injectivity +is supplied by the arithmetic cofinality consequence of the finite local +existence theorem. +-/ + +@[expose] public section + +noncomputable +section + +open CategoryTheory + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- Restriction to the separable closure gives the canonical topological +identification between the usual and separable absolute Galois groups. -/ +noncomputable def standardToSeparableAbsoluteGaloisEquiv : + _root_.Field.absoluteGaloisGroup K ≃ₜ* intrinsicAbsoluteGalois K := + RamificationTheory.Field.absoluteGaloisGroup.separableClosureContinuousMulEquiv K + +/-- The induced canonical identification from the separable absolute +topological abelianization to Mathlib's usual one. -/ +noncomputable def separableToStandardAbsoluteAbelianizationEquiv : + TopologicalAbelianization (intrinsicAbsoluteGalois K) ≃ₜ* + _root_.Field.absoluteGaloisGroupAbelianization K := + (topologicalAbelianizationCongr + (standardToSeparableAbsoluteGaloisEquiv K)).symm + +/-- The separable model makes the standard absolute abelianization totally disconnected. -/ +noncomputable instance standardLocalAbsoluteAbelianization_totallyDisconnectedSpace : + TotallyDisconnectedSpace + (_root_.Field.absoluteGaloisGroupAbelianization K) := + Homeomorph.totallyDisconnectedSpace + (separableToStandardAbsoluteAbelianizationEquiv K).toHomeomorph + +/-- The standard absolute abelianization is compact via the separable-model equivalence. -/ +noncomputable instance standardLocalAbsoluteAbelianization_compactSpace : + CompactSpace (_root_.Field.absoluteGaloisGroupAbelianization K) := + Homeomorph.compactSpace + (separableToStandardAbsoluteAbelianizationEquiv K).toHomeomorph + +/-- The standard absolute abelianization is Hausdorff via the separable-model equivalence. -/ +noncomputable instance standardLocalAbsoluteAbelianization_t2Space : + T2Space (_root_.Field.absoluteGaloisGroupAbelianization K) := + by + have htarget : T2Space Gal(localMaximalAbelianExtension K/K) := + krullTopology_t2 + have hsource : T2Space + (TopologicalAbelianization (intrinsicAbsoluteGalois K)) := + @Homeomorph.t2Space _ _ _ _ htarget + (localAbsoluteAbelianizationEquiv K).symm.toHomeomorph + exact @Homeomorph.t2Space _ _ _ _ hsource + (separableToStandardAbsoluteAbelianizationEquiv K).toHomeomorph + +/-- The usual absolute Galois topological abelianization, packaged as a stable +profinite group. -/ +noncomputable def standardLocalAbsoluteAbelianProfinite + (K : Type) [Field K] : ProfiniteGrp := + ProfiniteGrp.of (_root_.Field.absoluteGaloisGroupAbelianization K) + +/-- The canonical extension of the separable absolute Artin map to the +open-finite-quotient completion of the local multiplicative group. -/ +noncomputable def separableProfiniteLocalReciprocityHom : + TopologicalProfiniteCompletion Kˣ →ₜ* + localAbsoluteAbelianProfinite K := + topologicalProfiniteCompletionLift + (localAbsoluteAbelianProfinite K) + (separableAbsoluteLocalArtinMap K) + +/-- The separable reciprocity lift agrees with the Artin map on canonical completion points. -/ +@[simp] +theorem separableProfiniteLocalReciprocityHom_map (a : Kˣ) : + separableProfiniteLocalReciprocityHom K + (topologicalProfiniteCompletionMap Kˣ a) = + separableAbsoluteLocalArtinMap K a := + topologicalProfiniteCompletionLift_map + (localAbsoluteAbelianProfinite K) + (separableAbsoluteLocalArtinMap K) a + +/-- Composing the separable reciprocity lift with the completion map recovers the Artin map. -/ +@[simp] +theorem separableProfiniteLocalReciprocityHom_comp_completionMap : + (separableProfiniteLocalReciprocityHom K).comp + (topologicalProfiniteCompletionMap Kˣ) = + separableAbsoluteLocalArtinMap K := + topologicalProfiniteCompletionLift_comp_map + (localAbsoluteAbelianProfinite K) + (separableAbsoluteLocalArtinMap K) + +/-- The separable profinite reciprocity homomorphism is onto. -/ +theorem separableProfiniteLocalReciprocityHom_surjective : + Function.Surjective (separableProfiniteLocalReciprocityHom K) := + topologicalProfiniteCompletionLift_surjective_of_denseRange + (localAbsoluteAbelianProfinite K) + (separableAbsoluteLocalArtinMap K) + (separableAbsoluteLocalArtinMap_denseRange K) + +/-- Finite local existence makes the separable profinite reciprocity +homomorphism one-to-one. -/ +theorem separableProfiniteLocalReciprocityHom_injective : + Function.Injective (separableProfiniteLocalReciprocityHom K) := + topologicalProfiniteCompletionLift_injective_of_preimage_cofinal + (localAbsoluteAbelianProfinite K) + (separableAbsoluteLocalArtinMap K) + (separableAbsoluteLocalArtinMap_preimage_cofinal K) + +/-- Profinite local reciprocity for the fixed separable closure. -/ +noncomputable def separableProfiniteLocalReciprocity : + TopologicalProfiniteCompletion Kˣ ≃ₜ* + localAbsoluteAbelianProfinite K := + { Continuous.homeoOfEquivCompactToT2 + (f := Equiv.ofBijective + (separableProfiniteLocalReciprocityHom K) + ⟨separableProfiniteLocalReciprocityHom_injective K, + separableProfiniteLocalReciprocityHom_surjective K⟩) + (separableProfiniteLocalReciprocityHom K).continuous_toFun with + map_mul' := (separableProfiniteLocalReciprocityHom K).map_mul } + +/-- The separable reciprocity equivalence has the same underlying map as its lifted homomorphism. -/ +@[simp] +theorem separableProfiniteLocalReciprocity_apply + (x : TopologicalProfiniteCompletion Kˣ) : + separableProfiniteLocalReciprocity K x = + separableProfiniteLocalReciprocityHom K x := + rfl + +/-- The forward transport from the separable to the usual absolute +topological abelianization, as a continuous homomorphism. -/ +noncomputable def separableToStandardAbsoluteAbelianizationHom : + localAbsoluteAbelianProfinite K →ₜ* + standardLocalAbsoluteAbelianProfinite K := + ContinuousMonoidHom.toContinuousMonoidHom + (separableToStandardAbsoluteAbelianizationEquiv K) + +/-- The absolute local Artin map with Mathlib's usual algebraic-closure +absolute Galois group as target. -/ +noncomputable def absoluteLocalArtinMap : + Kˣ →ₜ* standardLocalAbsoluteAbelianProfinite K := + (separableToStandardAbsoluteAbelianizationHom K).comp + (separableAbsoluteLocalArtinMap K) + +/-- Transporting the separable Artin map to the standard model gives the absolute Artin map. -/ +@[simp] +theorem separableToStandardAbsoluteAbelianizationEquiv_symm_artinMap + (a : Kˣ) : + (separableToStandardAbsoluteAbelianizationEquiv K).symm + (absoluteLocalArtinMap K a) = + separableAbsoluteLocalArtinMap K a := by + change + (separableToStandardAbsoluteAbelianizationEquiv K).symm + (separableToStandardAbsoluteAbelianizationEquiv K + (separableAbsoluteLocalArtinMap K a)) = + separableAbsoluteLocalArtinMap K a + exact (separableToStandardAbsoluteAbelianizationEquiv K).symm_apply_apply _ + +/-- The usual absolute local Artin map has dense image. -/ +theorem absoluteLocalArtinMap_denseRange : + DenseRange (absoluteLocalArtinMap K) := by + let e := separableToStandardAbsoluteAbelianizationEquiv K + change DenseRange (fun a => e (separableAbsoluteLocalArtinMap K a)) + exact e.surjective.denseRange.comp + (separableAbsoluteLocalArtinMap_denseRange K) e.continuous + +/-- The canonical homomorphism from the topological profinite completion of +`K×` to the usual absolute Galois topological abelianization. -/ +noncomputable def profiniteLocalReciprocityHom : + TopologicalProfiniteCompletion Kˣ →ₜ* + standardLocalAbsoluteAbelianProfinite K := + topologicalProfiniteCompletionLift + (standardLocalAbsoluteAbelianProfinite K) (absoluteLocalArtinMap K) + +/-- The standard reciprocity lift agrees with the absolute Artin map on canonical completion +points. -/ +@[simp] +theorem profiniteLocalReciprocityHom_map (a : Kˣ) : + profiniteLocalReciprocityHom K + (topologicalProfiniteCompletionMap Kˣ a) = + absoluteLocalArtinMap K a := + topologicalProfiniteCompletionLift_map + (standardLocalAbsoluteAbelianProfinite K) (absoluteLocalArtinMap K) a + +/-- The profinite reciprocity homomorphism extends the absolute Artin map. -/ +@[simp] +theorem profiniteLocalReciprocityHom_comp_completionMap : + (profiniteLocalReciprocityHom K).comp + (topologicalProfiniteCompletionMap Kˣ) = + absoluteLocalArtinMap K := + topologicalProfiniteCompletionLift_comp_map + (standardLocalAbsoluteAbelianProfinite K) (absoluteLocalArtinMap K) + +/-- Dense range of the absolute Artin map and compactness of the completion +make the profinite reciprocity homomorphism onto. -/ +theorem profiniteLocalReciprocityHom_surjective : + Function.Surjective (profiniteLocalReciprocityHom K) := + topologicalProfiniteCompletionLift_surjective_of_denseRange + (standardLocalAbsoluteAbelianProfinite K) (absoluteLocalArtinMap K) + (absoluteLocalArtinMap_denseRange K) + +/-- Finite target projections agree with projection of the absolute Artin +map on the dense copy of `K×`. -/ +theorem profiniteLocalReciprocityHom_finiteProjection_map + (N : OpenNormalSubgroup (standardLocalAbsoluteAbelianProfinite K)) + (a : Kˣ) : + topologicalProfiniteCompletionFiniteProjection + (standardLocalAbsoluteAbelianProfinite K) (absoluteLocalArtinMap K) N + (topologicalProfiniteCompletionMap Kˣ a) = + QuotientGroup.mk' N.toSubgroup (absoluteLocalArtinMap K a) := + topologicalProfiniteCompletionFiniteProjection_map + (standardLocalAbsoluteAbelianProfinite K) (absoluteLocalArtinMap K) N a + +/-- The profinite reciprocity homomorphism is the unique continuous +homomorphism extending the absolute local Artin map. -/ +theorem profiniteLocalReciprocityHom_unique + (f : TopologicalProfiniteCompletion Kˣ →ₜ* + standardLocalAbsoluteAbelianProfinite K) + (hf : f.comp (topologicalProfiniteCompletionMap Kˣ) = + absoluteLocalArtinMap K) : + f = profiniteLocalReciprocityHom K := + topologicalProfiniteCompletionLift_unique + (standardLocalAbsoluteAbelianProfinite K) (absoluteLocalArtinMap K) f hf + +/-- The canonical lift to the usual absolute abelianization is transport of +the corresponding separable lift. -/ +theorem profiniteLocalReciprocityHom_eq_transport : + profiniteLocalReciprocityHom K = + (separableToStandardAbsoluteAbelianizationHom K).comp + (separableProfiniteLocalReciprocityHom K) := by + symm + apply profiniteLocalReciprocityHom_unique K + apply ContinuousMonoidHom.ext + intro a + change + separableToStandardAbsoluteAbelianizationEquiv K + (separableProfiniteLocalReciprocityHom K + (topologicalProfiniteCompletionMap Kˣ a)) = + absoluteLocalArtinMap K a + rw [separableProfiniteLocalReciprocityHom_map] + rfl + +/-- The canonical lift to the usual absolute abelianization is one-to-one. -/ +theorem profiniteLocalReciprocityHom_injective : + Function.Injective (profiniteLocalReciprocityHom K) := by + rw [profiniteLocalReciprocityHom_eq_transport K] + exact (separableToStandardAbsoluteAbelianizationEquiv K).injective.comp + (separableProfiniteLocalReciprocityHom_injective K) + +/-- **Profinite local reciprocity.** The topological profinite completion of +the local multiplicative group is canonically continuously isomorphic to the +topological abelianization of Mathlib's usual absolute Galois group. -/ +noncomputable def profiniteLocalReciprocity : + TopologicalProfiniteCompletion Kˣ ≃ₜ* + standardLocalAbsoluteAbelianProfinite K := + { Continuous.homeoOfEquivCompactToT2 + (f := Equiv.ofBijective + (profiniteLocalReciprocityHom K) + ⟨profiniteLocalReciprocityHom_injective K, + profiniteLocalReciprocityHom_surjective K⟩) + (profiniteLocalReciprocityHom K).continuous_toFun with + map_mul' := (profiniteLocalReciprocityHom K).map_mul } + +/-- The standard reciprocity equivalence has the same underlying map as its lifted homomorphism. -/ +@[simp] +theorem profiniteLocalReciprocity_apply + (x : TopologicalProfiniteCompletion Kˣ) : + profiniteLocalReciprocity K x = + profiniteLocalReciprocityHom K x := + rfl + +/-- Profinite reciprocity restricts to the absolute local Artin map on the +dense copy of the local multiplicative group. -/ +theorem profiniteLocalReciprocity_completionMap (a : Kˣ) : + profiniteLocalReciprocity K + (topologicalProfiniteCompletionMap Kˣ a) = + absoluteLocalArtinMap K a := + profiniteLocalReciprocityHom_map K a + +/-- The absolute local Artin map is injective. -/ +theorem absoluteLocalArtinMap_injective : + Function.Injective (absoluteLocalArtinMap K) := by + intro x y hxy + apply topologicalProfiniteCompletionMap_injective_localField K + apply (profiniteLocalReciprocity K).injective + rw [profiniteLocalReciprocity_completionMap, + profiniteLocalReciprocity_completionMap] + exact hxy + +/-- Every finite quotient projection of profinite reciprocity is the finite +projection canonically induced by the absolute local Artin map. -/ +theorem profiniteLocalReciprocity_finiteProjection + (N : OpenNormalSubgroup (standardLocalAbsoluteAbelianProfinite K)) + (x : TopologicalProfiniteCompletion Kˣ) : + QuotientGroup.mk' N.toSubgroup (profiniteLocalReciprocity K x) = + topologicalProfiniteCompletionFiniteProjection + (standardLocalAbsoluteAbelianProfinite K) (absoluteLocalArtinMap K) N x := by + let lhs : TopologicalProfiniteCompletion Kˣ → + (((standardLocalAbsoluteAbelianProfinite K).toFiniteQuotientFunctor ⋙ + forget₂ FiniteGrp ProfiniteGrp).obj N : Type) := + fun y => QuotientGroup.mk' N.toSubgroup (profiniteLocalReciprocity K y) + let rhs : TopologicalProfiniteCompletion Kˣ → + (((standardLocalAbsoluteAbelianProfinite K).toFiniteQuotientFunctor ⋙ + forget₂ FiniteGrp ProfiniteGrp).obj N : Type) := + fun y => topologicalProfiniteCompletionFiniteProjection + (standardLocalAbsoluteAbelianProfinite K) (absoluteLocalArtinMap K) N y + have hlhs : Continuous lhs := by + let : DiscreteTopology + (standardLocalAbsoluteAbelianProfinite K ⧸ N.toSubgroup) := + QuotientGroup.discreteTopology N.isOpen' + let q : + (standardLocalAbsoluteAbelianProfinite K ⧸ N.toSubgroup) →ₜ* + (((standardLocalAbsoluteAbelianProfinite K).toFiniteQuotientFunctor ⋙ + forget₂ FiniteGrp ProfiniteGrp).obj N : Type) := + { toFun := id + map_one' := rfl + map_mul' := by intro a b; rfl + continuous_toFun := continuous_of_discreteTopology } + exact q.continuous_toFun.comp + (QuotientGroup.continuous_mk.comp + (profiniteLocalReciprocity K).continuous) + have hrhs : Continuous rhs := + (topologicalProfiniteCompletionFiniteProjection + (standardLocalAbsoluteAbelianProfinite K) + (absoluteLocalArtinMap K) N).continuous_toFun + have heq : lhs = rhs := + (topologicalProfiniteCompletionMap_denseRange Kˣ).equalizer + hlhs hrhs <| by + funext a + change + QuotientGroup.mk' N.toSubgroup + (profiniteLocalReciprocity K + (topologicalProfiniteCompletionMap Kˣ a)) = + topologicalProfiniteCompletionFiniteProjection + (standardLocalAbsoluteAbelianProfinite K) + (absoluteLocalArtinMap K) N + (topologicalProfiniteCompletionMap Kˣ a) + rw [profiniteLocalReciprocity_completionMap, + profiniteLocalReciprocityHom_finiteProjection_map] + exact congrFun heq x + +/-- Profinite local reciprocity is the unique continuous multiplicative +equivalence whose composite with the completion map is the absolute Artin +map. -/ +theorem profiniteLocalReciprocity_unique + (e : TopologicalProfiniteCompletion Kˣ ≃ₜ* + standardLocalAbsoluteAbelianProfinite K) + (he : (ContinuousMonoidHom.toContinuousMonoidHom e).comp + (topologicalProfiniteCompletionMap Kˣ) = + absoluteLocalArtinMap K) : + e = profiniteLocalReciprocity K := by + apply ContinuousMulEquiv.ext + intro x + have hhom := profiniteLocalReciprocityHom_unique K + (ContinuousMonoidHom.toContinuousMonoidHom e) he + exact DFunLike.congr_fun hhom x + +/-- Mathlib's absolute Galois abelianization is canonically the inverse limit +of its finite quotients, after transport from the fixed separable closure. -/ +noncomputable def standardAbsoluteGaloisAbelianizationLimitEquiv : + ContinuousMulEquiv (standardLocalAbsoluteAbelianProfinite K) + (absoluteFiniteArtinLimit K) := + (separableToStandardAbsoluteAbelianizationEquiv K).symm.trans + (absoluteGaloisAbelianizationLimitEquiv K) + +/-- Every finite projection of the absolute Artin map is its corresponding +finite local Artin coordinate after canonical transport to the separable +closure model. -/ +theorem absoluteLocalArtinMap_finiteProjection + (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) + (a : Units K) : + QuotientGroup.mk' N.toSubgroup + ((separableToStandardAbsoluteAbelianizationEquiv K).symm + (absoluteLocalArtinMap K a)) = + absoluteFiniteArtinMap K N a := by + rw [separableToStandardAbsoluteAbelianizationEquiv_symm_artinMap] + exact separableAbsoluteLocalArtinMap_finiteProjection K N a + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/TopologicalAbelianizationCongr.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/TopologicalAbelianizationCongr.lean new file mode 100644 index 0000000000..493ff6cd52 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/TopologicalAbelianizationCongr.lean @@ -0,0 +1,110 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Topology.Algebra.ContinuousMonoidHom +public import Mathlib.Topology.Algebra.Group.Quotient +public import Mathlib.Topology.Algebra.Group.TopologicalAbelianization +/-! +# Functoriality of topological abelianization under equivalence + +A continuous multiplicative equivalence carries the closure of the +commutator subgroup onto the corresponding closure. It therefore descends +to a continuous multiplicative equivalence of topological abelianizations. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +universe u v + +variable {G : Type u} {H : Type v} + [Group G] [Group H] + [TopologicalSpace G] [TopologicalSpace H] + [IsTopologicalGroup G] [IsTopologicalGroup H] + +private theorem topologicalCommutatorClosure_le_comap + (e : G ≃ₜ* H) : + (commutator G).topologicalClosure ≤ + (commutator H).topologicalClosure.comap + e.toMulEquiv.toMonoidHom := by + apply Subgroup.topologicalClosure_minimal + · intro x hx + change e x ∈ (commutator H).topologicalClosure + apply Subgroup.le_topologicalClosure + have hmap : + (commutator G).map e.toMulEquiv.toMonoidHom = + commutator H := by + rw [map_commutator_eq] + have hrange : e.toMulEquiv.toMonoidHom.range = ⊤ := + MonoidHom.range_eq_top.mpr e.surjective + rw [hrange] + rfl + rw [← hmap] + exact Subgroup.mem_map_of_mem e.toMulEquiv.toMonoidHom hx + · exact (Subgroup.isClosed_topologicalClosure _).preimage e.continuous + +/-- Descend a continuous group equivalence to the topological abelianizations. -/ +def topologicalAbelianizationMap (e : G ≃ₜ* H) : + TopologicalAbelianization G →* TopologicalAbelianization H := + QuotientGroup.map + (commutator G).topologicalClosure + (commutator H).topologicalClosure + e.toMulEquiv.toMonoidHom + (by exact topologicalCommutatorClosure_le_comap e) + +@[simp] +private theorem topologicalAbelianizationMap_mk + (e : G ≃ₜ* H) (x : G) : + topologicalAbelianizationMap e (QuotientGroup.mk x) = + QuotientGroup.mk (e x) := + rfl + +private theorem topologicalAbelianizationMap_continuous + (e : G ≃ₜ* H) : + Continuous (topologicalAbelianizationMap e) := by + apply (QuotientGroup.isQuotientMap_mk + (commutator G).topologicalClosure).continuous_iff.2 + change Continuous (QuotientGroup.mk ∘ e.toHomeomorph) + exact QuotientGroup.continuous_mk.comp e.continuous + +/-- The multiplicative equivalence induced on topological abelianizations. -/ +def topologicalAbelianizationMulEquiv (e : G ≃ₜ* H) : + TopologicalAbelianization G ≃* TopologicalAbelianization H where + toFun := topologicalAbelianizationMap e + invFun := topologicalAbelianizationMap e.symm + left_inv q := by + refine q.inductionOn' ?_ + intro x + simp + right_inv q := by + refine q.inductionOn' ?_ + intro x + simp + map_mul' x y := map_mul (topologicalAbelianizationMap e) x y + +/-- A continuous multiplicative equivalence induces the canonical +continuous multiplicative equivalence of topological abelianizations. -/ +noncomputable def topologicalAbelianizationCongr (e : G ≃ₜ* H) : + TopologicalAbelianization G ≃ₜ* TopologicalAbelianization H := + { topologicalAbelianizationMulEquiv e with + continuous_toFun := by exact topologicalAbelianizationMap_continuous e + continuous_invFun := by exact topologicalAbelianizationMap_continuous e.symm } + +/-- States the theorem `topologicalAbelianizationCongr_mk`. -/ +@[simp] +theorem topologicalAbelianizationCongr_mk + (e : G ≃ₜ* H) (x : G) : + topologicalAbelianizationCongr e (QuotientGroup.mk x) = + QuotientGroup.mk (e x) := + rfl + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer.lean new file mode 100644 index 0000000000..194786b77e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer.lean @@ -0,0 +1,24 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.CanonicalKummerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerExponentTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerNormPowerClassDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertExponentCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairingNondegeneracy +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbolLaws +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MathlibHilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MaximalLocalKummerPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.PowerResidueTameFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/All.lean new file mode 100644 index 0000000000..aa5c3d6f25 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/All.lean @@ -0,0 +1,27 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.CanonicalKummerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerExponentTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerNormPowerClassDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertExponentCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairingNondegeneracy +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbolLaws +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MathlibHilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MaximalLocalKummerPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.PowerResidueTameFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport +/-! +# Local Kummer reciprocity + +Aggregate for the local Hilbert symbol, its laws, and the maximal local Kummer +pairing, including the tame power-residue formula. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/CanonicalKummerNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/CanonicalKummerNorm.lean new file mode 100644 index 0000000000..cae697b7a3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/CanonicalKummerNorm.lean @@ -0,0 +1,485 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension +public import Mathlib.FieldTheory.KummerExtension +public import Mathlib.FieldTheory.Separable +public import Mathlib.FieldTheory.IntermediateField.Adjoin.Basic +public import Mathlib.RingTheory.Ideal.Quotient.Operations +public import Mathlib.RingTheory.Norm.Basic +/-! +# Norms from an irreducible Kummer algebra + +When `X^n - a` is irreducible, the canonical algebra obtained by adjoining a +root is isomorphic to the chosen simple Kummer field. This file transports +the algebra norm through that isomorphism. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory.Kummer + +/-- Algebra norms multiply across a product of finite algebras. -/ +private theorem norm_prod_apply + (K S T : Type) [Field K] [CommRing S] [CommRing T] + [Algebra K S] [Algebra K T] + [Module.Free K S] [Module.Finite K S] + [Module.Free K T] [Module.Finite K T] + (x : S × T) : + Algebra.norm K x = Algebra.norm K x.1 * Algebra.norm K x.2 := by + have hmul : Algebra.lmul K (S × T) x = + (Algebra.lmul K S x.1).prodMap (Algebra.lmul K T x.2) := by + apply LinearMap.ext + intro z + rcases z with ⟨s, t⟩ + rfl + rw [Algebra.norm_apply, hmul, LinearMap.det_prodMap, + ← Algebra.norm_apply, ← Algebra.norm_apply] + +/-- If `X^n - a` is irreducible, being a norm from its canonical root algebra +is equivalent to being a norm from the chosen simple Kummer field. -/ +theorem adjoinRoot_norm_iff_chosenSimpleKummerNorm_of_irreducible + (K : Type) [Field K] (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (a b : Kˣ) + (hirr : Irreducible + (Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K))) : + (∃ y : (AdjoinRoot + (Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K)))ˣ, + Algebra.norm K + (y : AdjoinRoot + (Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K))) = (b : K)) ↔ + ∃ y : (KummerTheory.chosenSimpleKummerExtension K n hnK a)ˣ, + Algebra.norm K + (y : KummerTheory.chosenSimpleKummerExtension K n hnK a) = (b : K) := by + let β : SeparableClosure K := KummerTheory.chosenSimpleKummerRoot K n hnK a + let p : Polynomial K := Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K) + have hβ : Polynomial.aeval β p = 0 := by + simp only [p, map_sub, map_pow, Polynomial.aeval_X, Polynomial.aeval_C, + β, KummerTheory.chosenSimpleKummerRoot_pow, sub_self] + have hp : p = minpoly K β := + minpoly.eq_of_irreducible_of_monic hirr hβ + (Polynomial.monic_X_pow_sub_C (a : K) n.pos.ne') + have hβint : IsIntegral K β := by + apply IsIntegral.of_pow n.pos + rw [show β ^ (n : ℕ) = algebraMap K (SeparableClosure K) (a : K) from + KummerTheory.chosenSimpleKummerRoot_pow K n hnK a] + exact isIntegral_algebraMap + let E := KummerTheory.chosenSimpleKummerExtension K n hnK a + let e : AdjoinRoot p ≃ₐ[K] E := + (AdjoinRoot.algEquivOfEq K p (minpoly K β) hp).trans + (IntermediateField.adjoinRootEquivAdjoin K hβint) + change (∃ y : (AdjoinRoot p)ˣ, Algebra.norm K (y : AdjoinRoot p) = (b : K)) ↔ + ∃ y : Eˣ, Algebra.norm K (y : E) = (b : K) + constructor + · rintro ⟨y, hy⟩ + refine ⟨Units.map e.toMonoidHom y, ?_⟩ + change Algebra.norm K (e (y : AdjoinRoot p)) = (b : K) + rw [Algebra.norm_eq_of_algEquiv e, hy] + · rintro ⟨y, hy⟩ + refine ⟨Units.map e.symm.toMonoidHom y, ?_⟩ + change Algebra.norm K (e.symm (y : E)) = (b : K) + rw [Algebra.norm_eq_of_algEquiv e.symm, hy] + +/-- The canonical Kummer algebra separates, by the Chinese remainder theorem, +into the factor containing the chosen radical and a complementary factor. +The two factors are coprime because `n` is nonzero in the base field. -/ +theorem adjoinRoot_decompose_chosenMinpoly + (K : Type) [Field K] (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (a : Kˣ) : + let p : Polynomial K := Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K) + let q : Polynomial K := + minpoly K (KummerTheory.chosenSimpleKummerRoot K n hnK a) + ∃ r : Polynomial K, p = q * r ∧ IsCoprime q r ∧ + Nonempty (AdjoinRoot p ≃ₐ[K] (AdjoinRoot q × AdjoinRoot r)) := by + let β : SeparableClosure K := KummerTheory.chosenSimpleKummerRoot K n hnK a + let p : Polynomial K := Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K) + let q : Polynomial K := minpoly K β + have hβ : Polynomial.aeval β p = 0 := by + simp only [p, map_sub, map_pow, Polynomial.aeval_X, Polynomial.aeval_C, + β, KummerTheory.chosenSimpleKummerRoot_pow, sub_self] + obtain ⟨r, hr⟩ := minpoly.dvd K β hβ + have hsep : p.Separable := by + exact Polynomial.separable_X_pow_sub_C (a : K) hnK (Units.ne_zero a) + have hcoprime : IsCoprime q r := by + apply Polynomial.Separable.isCoprime + rw [← hr] + exact hsep + let I : Ideal (Polynomial K) := Ideal.span {q} + let J : Ideal (Polynomial K) := Ideal.span {r} + have hIJ : Ideal.span ({p} : Set (Polynomial K)) = I * J := by + change Ideal.span {p} = Ideal.span {q} * Ideal.span {r} + rw [Ideal.span_singleton_mul_span_singleton, hr] + have hIcoprime : IsCoprime I J := + (Ideal.isCoprime_span_singleton_iff q r).2 hcoprime + let eRing : AdjoinRoot p ≃+* (AdjoinRoot q × AdjoinRoot r) := + (Ideal.quotEquivOfEq hIJ).trans + (Ideal.quotientMulEquivQuotientProd I J hIcoprime) + let e : AdjoinRoot p ≃ₐ[K] (AdjoinRoot q × AdjoinRoot r) := + AlgEquiv.ofRingEquiv (f := eRing) (fun _ => rfl) + exact ⟨r, hr, hcoprime, ⟨e⟩⟩ + +/-- The norm from the canonical Kummer algebra factors through the chosen +simple Kummer field and the complementary algebra. -/ +theorem adjoinRoot_norm_decompose_chosenMinpoly + (K : Type) [Field K] (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (a : Kˣ) : + let p : Polynomial K := Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K) + let E := KummerTheory.chosenSimpleKummerExtension K n hnK a + ∃ (r : Polynomial K), r.Monic ∧ r ∣ p ∧ + ∃ e : AdjoinRoot p ≃ₐ[K] (E × AdjoinRoot r), + ∀ y : AdjoinRoot p, + Algebra.norm K y = + Algebra.norm K (e y).1 * Algebra.norm K (e y).2 := by + let β : SeparableClosure K := KummerTheory.chosenSimpleKummerRoot K n hnK a + let p : Polynomial K := Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K) + let q : Polynomial K := minpoly K β + let E := KummerTheory.chosenSimpleKummerExtension K n hnK a + obtain ⟨r, hr, -, ⟨e₀⟩⟩ := + adjoinRoot_decompose_chosenMinpoly K n hnK a + have hβint : IsIntegral K β := by + apply IsIntegral.of_pow n.pos + rw [show β ^ (n : ℕ) = algebraMap K (SeparableClosure K) (a : K) from + KummerTheory.chosenSimpleKummerRoot_pow K n hnK a] + exact isIntegral_algebraMap + let e₁ : AdjoinRoot q ≃ₐ[K] E := + IntermediateField.adjoinRootEquivAdjoin K hβint + let e : AdjoinRoot p ≃ₐ[K] (E × AdjoinRoot r) := + e₀.trans (AlgEquiv.prodCongr e₁ AlgEquiv.refl) + have hpmonic : p.Monic := + Polynomial.monic_X_pow_sub_C (a : K) n.pos.ne' + have hqmonic : q.Monic := minpoly.monic hβint + have hrmonic : r.Monic := by + apply hqmonic.of_mul_monic_left + rw [← hr] + exact hpmonic + have : Module.Finite K E := + KummerTheory.chosenSimpleKummerExtension_finiteDimensional K n hnK a + have : Module.Free K (AdjoinRoot r) := hrmonic.free_adjoinRoot + have : Module.Finite K (AdjoinRoot r) := hrmonic.finite_adjoinRoot + have hrdiv : r ∣ p := by + refine ⟨q, ?_⟩ + exact hr.trans (mul_comm q r) + refine ⟨r, hrmonic, hrdiv, e, ?_⟩ + intro y + calc + Algebra.norm K y = Algebra.norm K (e y) := + (Algebra.norm_eq_of_algEquiv e y).symm + _ = Algebra.norm K (e y).1 * Algebra.norm K (e y).2 := + norm_prod_apply K E (AdjoinRoot r) (e y) + +/-- Every `n`-th root of `a` inside the chosen simple Kummer extension +generates that extension when the base contains the `n`-th roots of unity. -/ +theorem adjoin_root_eq_top_of_pow_eq + (K : Type) [Field K] (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a : Kˣ) + (γ : KummerTheory.chosenSimpleKummerExtension K n hnK a) + (hγ : γ ^ (n : ℕ) = + algebraMap K (KummerTheory.chosenSimpleKummerExtension K n hnK a) (a : K)) : + IntermediateField.adjoin K {γ} = ⊤ := by + let E := KummerTheory.chosenSimpleKummerExtension K n hnK a + let β : Eˣ := KummerTheory.chosenSimpleKummerRootUnit K n hnK a + have hγne : γ ≠ 0 := by + intro hz + rw [hz, zero_pow n.pos.ne'] at hγ + exact ((map_ne_zero (algebraMap K E)).2 (Units.ne_zero a)) hγ.symm + let γu : Eˣ := Units.mk0 γ hγne + have hγpow : γu ^ (n : ℕ) = + Units.map (algebraMap K E).toMonoidHom a := by + apply Units.ext + exact hγ + have hβpow : β ^ (n : ℕ) = + Units.map (algebraMap K E).toMonoidHom a := + KummerTheory.chosenSimpleKummerRootUnit_pow K n hnK a + let u : Eˣ := γu / β + have hu : u ^ (n : ℕ) = 1 := by + change (γu / β) ^ (n : ℕ) = 1 + rw [div_pow, hγpow, hβpow, div_self'] + obtain ⟨ζ, hζ⟩ := + KummerTheory.nthRootsOfUnityInBase_of_primitiveRoots + (K := K) (L := E) n hmu u hu + have hζβ : Units.map (algebraMap K E).toMonoidHom ζ * β = γu := by + rw [hζ] + exact div_mul_cancel γu β + have hβζ : β = + (Units.map (algebraMap K E).toMonoidHom ζ)⁻¹ * γu := by + have h := congrArg + (fun x : Eˣ => (Units.map (algebraMap K E).toMonoidHom ζ)⁻¹ * x) hζβ + simpa only [inv_mul_cancel_left] using h + have hβζE : (β : E) = + ((Units.map (algebraMap K E).toMonoidHom ζ : Eˣ) : E)⁻¹ * γ := by + have h := congrArg (fun x : Eˣ => (x : E)) hβζ + simpa only [Units.val_mul, Units.val_inv_eq_inv_val, γu, Units.val_mk0] using h + have hβmem : (β : E) ∈ IntermediateField.adjoin K {γ} := by + rw [hβζE] + have hζmem : ((Units.map (algebraMap K E).toMonoidHom ζ : Eˣ) : E) ∈ + IntermediateField.adjoin K {γ} := by + rw [Units.coe_map] + exact IntermediateField.algebraMap_mem _ (ζ : K) + exact mul_mem (inv_mem hζmem) + (IntermediateField.subset_adjoin K {γ} (Set.mem_singleton γ)) + have hle : IntermediateField.adjoin K {(β : E)} ≤ + IntermediateField.adjoin K {γ} := by + apply IntermediateField.adjoin_le_iff.mpr + intro x hx + have hx' : x = (β : E) := Set.mem_singleton_iff.mp hx + rw [hx'] + exact hβmem + have htop := KummerTheory.chosenSimpleKummerExtension_adjoin_root_eq_top K n hnK a + exact top_unique (htop ▸ hle) + +/-- Every monic irreducible factor of `X^n - a` defines the same Kummer +extension, because all of its roots are scalar multiples of the chosen one. -/ +theorem adjoinRoot_factor_equiv_chosenSimpleKummer + (K : Type) [Field K] (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a : Kˣ) + (f : Polynomial K) (hfmonic : f.Monic) (hfirr : Irreducible f) + (hfp : f ∣ Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K)) : + Nonempty (AdjoinRoot f ≃ₐ[K] + KummerTheory.chosenSimpleKummerExtension K n hnK a) := by + let E := KummerTheory.chosenSimpleKummerExtension K n hnK a + let p : Polynomial K := Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K) + let β : E := KummerTheory.chosenSimpleKummerRootUnit K n hnK a + have hβpow : β ^ (n : ℕ) = algebraMap K E (a : K) := by + simpa only [E, β, Units.val_pow_eq_pow_val, Units.coe_map, + RingHom.toMonoidHom_eq_coe, MonoidHom.coe_coe] using + congrArg (fun u : Eˣ => (u : E)) + (KummerTheory.chosenSimpleKummerRootUnit_pow K n hnK a) + obtain ⟨ζ, hζ⟩ := hmu + have hprim : IsPrimitiveRoot ζ (n : ℕ) := + (mem_primitiveRoots n.pos).1 hζ + have hsplit : (p.map (algebraMap K E)).Splits := by + dsimp only [p] + rw [Polynomial.map_sub, Polynomial.map_pow, Polynomial.map_C, + Polynomial.map_X] + exact X_pow_sub_C_splits_of_isPrimitiveRoot + (hprim.map_of_injective (algebraMap K E).injective) hβpow + have hpne : p.map (algebraMap K E) ≠ 0 := by + dsimp only [p] + rw [Polynomial.map_sub, Polynomial.map_pow, Polynomial.map_C, + Polynomial.map_X] + exact Polynomial.X_pow_sub_C_ne_zero n.pos _ + have hsplitf : (f.map (algebraMap K E)).Splits := + hsplit.of_dvd hpne (Polynomial.map_dvd (algebraMap K E) hfp) + have hfd : (f.map (algebraMap K E)).degree ≠ 0 := by + rw [Polynomial.degree_map_eq_of_injective (algebraMap K E).injective] + exact ne_of_gt (Polynomial.degree_pos_of_irreducible hfirr) + let γ : E := Polynomial.rootOfSplits hsplitf hfd + have hγf : Polynomial.aeval γ f = 0 := by + simpa only [Polynomial.aeval_def, Polynomial.eval_map] using + (Polynomial.eval_rootOfSplits hsplitf hfd) + have hγp : Polynomial.aeval γ p = 0 := by + obtain ⟨g, hg⟩ := hfp + change Polynomial.aeval γ (Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K)) = 0 + rw [hg, map_mul, hγf, zero_mul] + have hγpow : γ ^ (n : ℕ) = algebraMap K E (a : K) := by + have h := hγp + simp only [p, map_sub, map_pow, Polynomial.aeval_X, Polynomial.aeval_C, + sub_eq_zero] at h + exact h + have hγgen : IntermediateField.adjoin K {γ} = ⊤ := + adjoin_root_eq_top_of_pow_eq K n hnK ⟨ζ, hζ⟩ a γ hγpow + have hγint : IsIntegral K γ := by + apply IsIntegral.of_pow n.pos + rw [hγpow] + exact isIntegral_algebraMap + have hminpoly : f = minpoly K γ := + minpoly.eq_of_irreducible_of_monic hfirr hγf hfmonic + let e : AdjoinRoot f ≃ₐ[K] E := + (AdjoinRoot.algEquivOfEq K f (minpoly K γ) hminpoly).trans + ((IntermediateField.adjoinRootEquivAdjoin K hγint).trans + ((IntermediateField.equivOfEq hγgen).trans + IntermediateField.topEquiv)) + exact ⟨e⟩ + +/-- For coprime monic polynomials, the norm from an adjunction algebra is the +product of the norms from the two factors. -/ +theorem adjoinRoot_norm_decompose_coprime + (K : Type) [Field K] (q r : Polynomial K) + (hq : q.Monic) (hr : r.Monic) (hqr : IsCoprime q r) : + ∃ e : AdjoinRoot (q * r) ≃ₐ[K] (AdjoinRoot q × AdjoinRoot r), + ∀ y : AdjoinRoot (q * r), + Algebra.norm K y = + Algebra.norm K (e y).1 * Algebra.norm K (e y).2 := by + let I : Ideal (Polynomial K) := Ideal.span {q} + let J : Ideal (Polynomial K) := Ideal.span {r} + have hIJ : Ideal.span ({q * r} : Set (Polynomial K)) = I * J := by + change Ideal.span {q * r} = Ideal.span {q} * Ideal.span {r} + exact (Ideal.span_singleton_mul_span_singleton q r).symm + have hIcoprime : IsCoprime I J := + (Ideal.isCoprime_span_singleton_iff q r).2 hqr + let eRing : AdjoinRoot (q * r) ≃+* (AdjoinRoot q × AdjoinRoot r) := + (Ideal.quotEquivOfEq hIJ).trans + (Ideal.quotientMulEquivQuotientProd I J hIcoprime) + let e : AdjoinRoot (q * r) ≃ₐ[K] (AdjoinRoot q × AdjoinRoot r) := + AlgEquiv.ofRingEquiv (f := eRing) (fun _ => rfl) + have : Module.Free K (AdjoinRoot q) := hq.free_adjoinRoot + have : Module.Finite K (AdjoinRoot q) := hq.finite_adjoinRoot + have : Module.Free K (AdjoinRoot r) := hr.free_adjoinRoot + have : Module.Finite K (AdjoinRoot r) := hr.finite_adjoinRoot + refine ⟨e, ?_⟩ + intro y + calc + Algebra.norm K y = Algebra.norm K (e y) := + (Algebra.norm_eq_of_algEquiv e y).symm + _ = Algebra.norm K (e y).1 * Algebra.norm K (e y).2 := + norm_prod_apply K (AdjoinRoot q) (AdjoinRoot r) (e y) + +/-- The norm of a unit from any monic factor of `X^n - a` is a norm from the +chosen simple Kummer extension. This includes reducible factors. -/ +theorem adjoinRoot_factor_norm_is_chosenSimpleKummerNorm + (K : Type) [Field K] (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a : Kˣ) + (f : Polynomial K) (hfmonic : f.Monic) + (hfp : f ∣ Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K)) + (y : (AdjoinRoot f)ˣ) : + ∃ z : (KummerTheory.chosenSimpleKummerExtension K n hnK a)ˣ, + Algebra.norm K (y : AdjoinRoot f) = + Algebra.norm K + (z : KummerTheory.chosenSimpleKummerExtension K n hnK a) := by + let p : Polynomial K := Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K) + let E := KummerTheory.chosenSimpleKummerExtension K n hnK a + have hpsep : p.Separable := + Polynomial.separable_X_pow_sub_C (a : K) hnK (Units.ne_zero a) + suffices h : ∀ d : ℕ, ∀ g : Polynomial K, g.natDegree = d → g.Monic → + g ∣ p → ∀ u : (AdjoinRoot g)ˣ, + ∃ v : Eˣ, Algebra.norm K (u : AdjoinRoot g) = Algebra.norm K (v : E) from + h f.natDegree f rfl hfmonic hfp y + intro d + induction d using Nat.strong_induction_on with + | h d ih => + intro g hgd hgmonic hgp u + by_cases hd : d = 0 + · have hg1 : g = 1 := + Polynomial.eq_one_of_monic_natDegree_zero hgmonic (hgd.trans hd) + subst g + have hsub : Subsingleton (AdjoinRoot (1 : Polynomial K)) := by + change Subsingleton ((Polynomial K) ⧸ Ideal.span {1}) + exact Ideal.Quotient.subsingleton_iff.mpr (by simp) + have hu1 : (u : AdjoinRoot (1 : Polynomial K)) = 1 := + Subsingleton.elim _ _ + refine ⟨1, ?_⟩ + simp only [hu1, map_one, Units.val_one] + · have hgpos : 0 < g.natDegree := by omega + obtain ⟨q, hqmonic, hqirr, hqg⟩ := + Polynomial.exists_monic_irreducible_factor g + (Polynomial.not_isUnit_of_natDegree_pos g hgpos) + obtain ⟨r, hgr⟩ := hqg + have hrmonic : r.Monic := by + apply hqmonic.of_mul_monic_left + rw [← hgr] + exact hgmonic + have hqdiv : q ∣ p := dvd_trans ⟨r, hgr⟩ hgp + have hrdiv : r ∣ p := by + apply dvd_trans ?_ hgp + rw [hgr] + exact dvd_mul_left r q + have hgsep : g.Separable := hpsep.of_dvd hgp + have hqr : IsCoprime q r := by + apply Polynomial.Separable.isCoprime + rw [← hgr] + exact hgsep + have hqpos : 0 < q.natDegree := + Polynomial.natDegree_pos_iff_degree_pos.mpr + (Polynomial.degree_pos_of_irreducible hqirr) + have hrlt : r.natDegree < d := by + have hdeg : d = q.natDegree + r.natDegree := by + calc + d = g.natDegree := hgd.symm + _ = (q * r).natDegree := by rw [hgr] + _ = q.natDegree + r.natDegree := + Polynomial.natDegree_mul hqmonic.ne_zero hrmonic.ne_zero + omega + obtain ⟨eqv, hnorm⟩ := + adjoinRoot_norm_decompose_coprime K q r hqmonic hrmonic hqr + let eg : AdjoinRoot g ≃ₐ[K] (AdjoinRoot q × AdjoinRoot r) := + (AdjoinRoot.algEquivOfEq K g (q * r) hgr).trans eqv + let uq : (AdjoinRoot q)ˣ := + Units.map ((MonoidHom.fst _ _).comp eg.toMonoidHom) u + let ur : (AdjoinRoot r)ˣ := + Units.map ((MonoidHom.snd _ _).comp eg.toMonoidHom) u + obtain ⟨eq⟩ := + adjoinRoot_factor_equiv_chosenSimpleKummer K n hnK hmu a q + hqmonic hqirr hqdiv + let vq : Eˣ := Units.map eq.toMonoidHom uq + obtain ⟨vr, hvr⟩ := ih r.natDegree hrlt r rfl hrmonic hrdiv ur + have huq : Algebra.norm K (eg (u : AdjoinRoot g)).1 = + Algebra.norm K (vq : E) := by + change Algebra.norm K (eg (u : AdjoinRoot g)).1 = + Algebra.norm K (eq (eg (u : AdjoinRoot g)).1) + exact (Algebra.norm_eq_of_algEquiv eq _).symm + have hur : Algebra.norm K (eg (u : AdjoinRoot g)).2 = + Algebra.norm K (vr : E) := hvr + refine ⟨vq * vr, ?_⟩ + calc + Algebra.norm K (u : AdjoinRoot g) = + Algebra.norm K (eg (u : AdjoinRoot g)).1 * + Algebra.norm K (eg (u : AdjoinRoot g)).2 := by + rw [show Algebra.norm K (u : AdjoinRoot g) = + Algebra.norm K ((AdjoinRoot.algEquivOfEq K g (q * r) hgr) + (u : AdjoinRoot g)) from + (Algebra.norm_eq_of_algEquiv + (AdjoinRoot.algEquivOfEq K g (q * r) hgr) _).symm] + exact hnorm _ + _ = Algebra.norm K (vq : E) * Algebra.norm K (vr : E) := by + rw [huq, hur] + _ = Algebra.norm K ((vq * vr : Eˣ) : E) := by + simp only [Units.val_mul, map_mul] + +/-- For the (possibly reducible) canonical Kummer algebra, the norm image on +units agrees with that of the chosen simple Kummer extension. -/ +theorem adjoinRoot_norm_iff_chosenSimpleKummerNorm + (K : Type) [Field K] (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b : Kˣ) : + (∃ y : (AdjoinRoot + (Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K)))ˣ, + Algebra.norm K + (y : AdjoinRoot + (Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K))) = (b : K)) ↔ + ∃ z : (KummerTheory.chosenSimpleKummerExtension K n hnK a)ˣ, + Algebra.norm K + (z : KummerTheory.chosenSimpleKummerExtension K n hnK a) = (b : K) := by + let p : Polynomial K := Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K) + let E := KummerTheory.chosenSimpleKummerExtension K n hnK a + obtain ⟨r, hrmonic, hrdiv, e, hnorm⟩ := + adjoinRoot_norm_decompose_chosenMinpoly K n hnK a + change (∃ y : (AdjoinRoot p)ˣ, Algebra.norm K (y : AdjoinRoot p) = (b : K)) ↔ + ∃ z : Eˣ, Algebra.norm K (z : E) = (b : K) + constructor + · rintro ⟨y, hy⟩ + let t : (E × AdjoinRoot r)ˣ := Units.map e.toMonoidHom y + let z : Eˣ := Units.map (MonoidHom.fst _ _) t + let w : (AdjoinRoot r)ˣ := Units.map (MonoidHom.snd _ _) t + obtain ⟨v, hv⟩ := + adjoinRoot_factor_norm_is_chosenSimpleKummerNorm K n hnK hmu a r + hrmonic hrdiv w + refine ⟨z * v, ?_⟩ + have hzw : Algebra.norm K (y : AdjoinRoot p) = + Algebra.norm K (z : E) * Algebra.norm K (w : AdjoinRoot r) := + hnorm (y : AdjoinRoot p) + calc + Algebra.norm K ((z * v : Eˣ) : E) = + Algebra.norm K (z : E) * Algebra.norm K (v : E) := by + simp only [Units.val_mul, map_mul] + _ = Algebra.norm K (y : AdjoinRoot p) := by rw [← hv, ← hzw] + _ = (b : K) := hy + · rintro ⟨z, hz⟩ + let t : (E × AdjoinRoot r)ˣ := MulEquiv.prodUnits.symm (z, 1) + let y : (AdjoinRoot p)ˣ := Units.map e.symm.toMonoidHom t + refine ⟨y, ?_⟩ + have het : e (y : AdjoinRoot p) = ((z : E), 1) := by + calc + e (y : AdjoinRoot p) = e (e.symm (t : E × AdjoinRoot r)) := rfl + _ = (t : E × AdjoinRoot r) := e.apply_symm_apply _ + _ = ((z : E), 1) := rfl + rw [hnorm (y : AdjoinRoot p), het] + simpa only [map_one, mul_one] using hz + +end LocalClassFieldTheory.Kummer diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerExponentTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerExponentTower.lean new file mode 100644 index 0000000000..f51c08c5d5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerExponentTower.lean @@ -0,0 +1,100 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration +/-! +# Divisibility of simple Kummer extensions + +If `m ∣ n` and the base contains `μₘ`, an `m`-th root of `a` differs from +the `(n/m)`-th power of an `n`-th root by a base-field root of unity. Thus +the chosen simple extensions form an actual tower in the separable closure. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory.Kummer + +/-- A simple `m`-Kummer extension is contained in the corresponding +`n`-Kummer extension when `m ∣ n`. -/ +theorem chosenSimpleKummerExtension_le_of_dvd + (K : Type) [Field K] + (m n : ℕ+) (hmK : ((m : ℕ) : K) ≠ 0) + (hnK : ((n : ℕ) : K) ≠ 0) + (hmuM : (primitiveRoots (m : ℕ) K).Nonempty) + (hmn : (m : ℕ) ∣ (n : ℕ)) (a : Kˣ) : + KummerTheory.chosenSimpleKummerExtension K m hmK a ≤ + KummerTheory.chosenSimpleKummerExtension K n hnK a := by + obtain ⟨q, hq⟩ := hmn + let Ω := SeparableClosure K + let αm : Ω := KummerTheory.chosenSimpleKummerRoot K m hmK a + let αn : Ω := KummerTheory.chosenSimpleKummerRoot K n hnK a + let Em := KummerTheory.chosenSimpleKummerExtension K m hmK a + let En := KummerTheory.chosenSimpleKummerExtension K n hnK a + have hαm : αm ^ (m : ℕ) = algebraMap K Ω (a : K) := + KummerTheory.chosenSimpleKummerRoot_pow K m hmK a + have hαn : αn ^ (n : ℕ) = algebraMap K Ω (a : K) := + KummerTheory.chosenSimpleKummerRoot_pow K n hnK a + have hαmne : αm ≠ 0 := by + intro hz + rw [hz, zero_pow m.pos.ne'] at hαm + exact ((map_ne_zero (algebraMap K Ω)).2 (Units.ne_zero a)) hαm.symm + have hαnne : αn ≠ 0 := by + intro hz + rw [hz, zero_pow n.pos.ne'] at hαn + exact ((map_ne_zero (algebraMap K Ω)).2 (Units.ne_zero a)) hαn.symm + let um : Ωˣ := Units.mk0 αm hαmne + let un : Ωˣ := Units.mk0 αn hαnne + let ι : Kˣ →* Ωˣ := Units.map (algebraMap K Ω).toMonoidHom + have humpow : um ^ (m : ℕ) = ι a := by + apply Units.ext + exact hαm + have hunpow : un ^ (n : ℕ) = ι a := by + apply Units.ext + exact hαn + have hqm : q * (m : ℕ) = (n : ℕ) := by + rw [mul_comm, ← hq] + let u : Ωˣ := un ^ q / um + have hu : u ^ (m : ℕ) = 1 := by + change (un ^ q / um) ^ (m : ℕ) = 1 + rw [div_pow, ← pow_mul, hqm, hunpow, humpow, div_self'] + obtain ⟨ζ, hζ⟩ := + KummerTheory.nthRootsOfUnityInBase_of_primitiveRoots + (K := K) (L := Ω) m hmuM u hu + have hζmul : ι ζ * um = un ^ q := by + rw [hζ] + exact div_mul_cancel (un ^ q) um + have hum : um = (ι ζ)⁻¹ * un ^ q := by + calc + um = (ι ζ)⁻¹ * (ι ζ * um) := by + rw [← mul_assoc, inv_mul_cancel, one_mul] + _ = (ι ζ)⁻¹ * un ^ q := by rw [hζmul] + have hαmval : αm = (algebraMap K Ω (ζ : K))⁻¹ * αn ^ q := by + have h := congrArg Units.val hum + dsimp only [um, un, ι] at h + simpa only [Units.val_mul, Units.val_inv_eq_inv_val, + Units.val_pow_eq_pow_val, Units.coe_map, Units.val_mk0, + RingHom.toMonoidHom_eq_coe, MonoidHom.coe_coe] using h + have hαmmem : αm ∈ En := by + rw [hαmval] + have hζmem : algebraMap K Ω (ζ : K) ∈ En := + En.algebraMap_mem (ζ : K) + have hαnmem : αn ∈ En := + IntermediateField.subset_adjoin K {αn} (Set.mem_singleton αn) + exact mul_mem (inv_mem hζmem) (pow_mem hαnmem q) + change IntermediateField.adjoin K {αm} ≤ En + apply IntermediateField.adjoin_le_iff.mpr + intro x hx + have hx' : x = αm := Set.mem_singleton_iff.mp hx + rw [hx'] + exact hαmmem + +end LocalClassFieldTheory.Kummer diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerNormPowerClassDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerNormPowerClassDegree.lean new file mode 100644 index 0000000000..b7a0d5717b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerNormPowerClassDegree.lean @@ -0,0 +1,238 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebraNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.CanonicalKummerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration +public import Mathlib.FieldTheory.Galois.Basic +public import Mathlib.NumberTheory.LocalField.Basic +/-! +# Chosen Kummer radical: norm index and power-class degree + +Implementation-level comparisons for the chosen simple Kummer extension. The +reader-facing Hilbert-symbol theorems state these results without exposing this +particular choice of a radical in their types. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory.LocalClassFieldTheory.Kummer + +/-- The unit-norm image of a possibly reducible Kummer algebra has index +equal to the degree of the chosen simple radical field, not necessarily `n`. -/ +theorem kummerAlgebraNormSubgroup_index_eq_chosenRadicalDegree + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a : Kˣ) : + (kummerAlgebraNormSubgroup K n a).index = + Module.finrank K (KummerTheory.chosenSimpleKummerExtension K n hnK a) := by + let E := KummerTheory.chosenSimpleKummerExtension K n hnK a + let : FiniteDimensional K E := + KummerTheory.chosenSimpleKummerExtension_finiteDimensional K n hnK a + let : IsAbelianGalois K E := + KummerTheory.chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu a + have hnorm : kummerAlgebraNormSubgroup K n a = fieldNormSubgroup K E := by + apply Subgroup.ext + intro b + change + (∃ y : (KummerAlgebra K n a)ˣ, + Units.map (Algebra.norm K) y = b) ↔ + (∃ z : Eˣ, Units.map (Algebra.norm K) z = b) + have hcomparison := + LocalClassFieldTheory.Kummer.adjoinRoot_norm_iff_chosenSimpleKummerNorm + K n hnK hmu a b + constructor + · rintro ⟨y, hy⟩ + obtain ⟨z, hz⟩ := hcomparison.mp ⟨y, congrArg Units.val hy⟩ + refine ⟨z, ?_⟩ + apply Units.ext + exact hz + · rintro ⟨z, hz⟩ + obtain ⟨y, hy⟩ := hcomparison.mpr ⟨z, congrArg Units.val hz⟩ + refine ⟨y, ?_⟩ + apply Units.ext + exact hy + change (kummerAlgebraNormSubgroup K n a).index = Module.finrank K E + rw [hnorm] + exact LocalCFT.fieldNormSubgroup_index_eq_finrank K E + +private theorem chosenRoot_pow_mem_base_iff_powerClass_pow_eq_one + (K : Type) [Field K] (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a : Kˣ) (m : ℕ) : + let E := KummerTheory.chosenSimpleKummerExtension K n hnK a + let β := KummerTheory.chosenSimpleKummerRootUnit K n hnK a + ((β ^ m : Eˣ) : E) ∈ Set.range (algebraMap K E) ↔ + (powerClass K n a) ^ m = 1 := by + let E := KummerTheory.chosenSimpleKummerExtension K n hnK a + let β : Eˣ := KummerTheory.chosenSimpleKummerRootUnit K n hnK a + let ι : Kˣ →* Eˣ := Units.map (algebraMap K E).toMonoidHom + have hβ : β ^ (n : ℕ) = ι a := + KummerTheory.chosenSimpleKummerRootUnit_pow K n hnK a + have hι : Function.Injective ι := + Units.map_injective (algebraMap K E).injective + constructor + · rintro ⟨b, hb⟩ + have hbne : b ≠ 0 := by + intro hz + have hzero : ((β ^ m : Eˣ) : E) = 0 := by + simpa only [hz, map_zero] using hb.symm + exact (β ^ m).ne_zero hzero + let bu : Kˣ := Units.mk0 b hbne + have hβm : β ^ m = ι bu := by + apply Units.ext + exact hb.symm + have ha : a ^ m = bu ^ (n : ℕ) := by + apply hι + calc + ι (a ^ m) = (ι a) ^ m := map_pow ι a m + _ = (β ^ (n : ℕ)) ^ m := by rw [hβ] + _ = (β ^ m) ^ (n : ℕ) := pow_right_comm β (n : ℕ) m + _ = (ι bu) ^ (n : ℕ) := by rw [hβm] + _ = ι (bu ^ (n : ℕ)) := (map_pow ι bu (n : ℕ)).symm + rw [← map_pow (powerClass K n) a m] + exact (QuotientGroup.eq_one_iff (a ^ m)).2 ⟨bu, ha.symm⟩ + · intro hclass + have ha : a ^ m ∈ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range := + (QuotientGroup.eq_one_iff (a ^ m)).1 + ((map_pow (powerClass K n) a m).symm.trans hclass) + obtain ⟨bu, hbu⟩ := ha + have hbu' : bu ^ (n : ℕ) = a ^ m := hbu + let u : Eˣ := β ^ m / ι bu + have hu : u ^ (n : ℕ) = 1 := by + have hnum : (β ^ m) ^ (n : ℕ) = ι (a ^ m) := by + calc + (β ^ m) ^ (n : ℕ) = (β ^ (n : ℕ)) ^ m := pow_right_comm β m (n : ℕ) + _ = (ι a) ^ m := by rw [hβ] + _ = ι (a ^ m) := (map_pow ι a m).symm + have hden : (ι bu) ^ (n : ℕ) = ι (a ^ m) := by + rw [← map_pow, hbu'] + change (β ^ m / ι bu) ^ (n : ℕ) = 1 + rw [div_pow, hnum, hden, div_self'] + obtain ⟨ζ, hζ⟩ := + KummerTheory.nthRootsOfUnityInBase_of_primitiveRoots + (K := K) (L := E) n hmu u hu + refine ⟨(ζ * bu : Kˣ), ?_⟩ + have hβm : β ^ m = ι (ζ * bu) := by + calc + β ^ m = u * ι bu := by + dsimp only [u] + exact (div_mul_cancel (β ^ m) (ι bu)).symm + _ = ι ζ * ι bu := by rw [hζ] + _ = ι (ζ * bu) := (map_mul ι ζ bu).symm + exact (congrArg Units.val hβm).symm + +/-- A chosen simple Kummer extension has degree equal to the order of its +defining power class. This includes the reducible case `a = 1`. -/ +theorem chosenSimpleKummerExtension_finrank_eq_powerClassOrder + (K : Type) [Field K] (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a : Kˣ) : + Module.finrank K (KummerTheory.chosenSimpleKummerExtension K n hnK a) = + orderOf (powerClass K n a) := by + let E := KummerTheory.chosenSimpleKummerExtension K n hnK a + let β : Eˣ := KummerTheory.chosenSimpleKummerRootUnit K n hnK a + let ι : Kˣ →* Eˣ := Units.map (algebraMap K E).toMonoidHom + let : FiniteDimensional K E := + KummerTheory.chosenSimpleKummerExtension_finiteDimensional K n hnK a + let : IsAbelianGalois K E := + KummerTheory.chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu a + have hβ : β ^ (n : ℕ) = ι a := + KummerTheory.chosenSimpleKummerRootUnit_pow K n hnK a + have hβint : IsIntegral K (β : E) := by + apply IsIntegral.of_pow n.pos + have h := congrArg Units.val hβ + have hpow : (β : E) ^ (n : ℕ) = (ι a : E) := by + simpa only [Units.val_pow_eq_pow_val] using h + rw [hpow] + change IsIntegral K (algebraMap K E (a : K)) + exact isIntegral_algebraMap + have htop : IntermediateField.adjoin K {(β : E)} = ⊤ := + KummerTheory.chosenSimpleKummerExtension_adjoin_root_eq_top K n hnK a + have hdegree : Module.finrank K E = (minpoly K (β : E)).natDegree := by + calc + Module.finrank K E = + Module.finrank K (IntermediateField.adjoin K {(β : E)}) := by + rw [htop] + exact (IntermediateField.finrank_top').symm + _ = (minpoly K (β : E)).natDegree := + IntermediateField.adjoin.finrank hβint + let d := orderOf (powerClass K n a) + let e := Module.finrank K E + have hclass_n : (powerClass K n a) ^ (n : ℕ) = 1 := by + rw [← map_pow] + exact (QuotientGroup.eq_one_iff (a ^ (n : ℕ))).2 ⟨a, rfl⟩ + have hdpos : 0 < d := + (isOfFinOrder_iff_pow_eq_one.mpr ⟨(n : ℕ), n.pos, hclass_n⟩).orderOf_pos + have hβd : ((β ^ d : Eˣ) : E) ∈ Set.range (algebraMap K E) := + (chosenRoot_pow_mem_base_iff_powerClass_pow_eq_one K n hnK hmu a d).2 + (pow_orderOf_eq_one (powerClass K n a)) + obtain ⟨c, hc⟩ := hβd + have hpolyroot : Polynomial.aeval (β : E) + (Polynomial.X ^ d - Polynomial.C c) = 0 := by + simp only [map_sub, map_pow, Polynomial.aeval_X, Polynomial.aeval_C] + exact sub_eq_zero.mpr hc.symm + have hdegree_le : e ≤ d := by + rw [show e = (minpoly K (β : E)).natDegree from hdegree] + calc + (minpoly K (β : E)).natDegree ≤ + (Polynomial.X ^ d - Polynomial.C c).natDegree := + Polynomial.natDegree_le_of_dvd + (minpoly.dvd K (β : E) hpolyroot) + (Polynomial.X_pow_sub_C_ne_zero hdpos c) + _ = d := Polynomial.natDegree_X_pow_sub_C + let χ := KummerTheory.chosenSimpleKummerRootCharacter K n hnK hmu a + have hcard : Nat.card Gal(E/K) = e := + IsGalois.card_aut_eq_finrank K E + have hquot_pow (σ : Gal(E/K)) : + KummerTheory.rootQuotient (K := K) (L := E) β σ ^ e = 1 := by + have hσ : σ ^ e = 1 := by + rw [← hcard] + exact pow_card_eq_one' + have hχ : (χ σ) ^ e = 1 := by + rw [← map_pow, hσ, map_one] + have hval := congrArg Subtype.val hχ + rw [KummerTheory.chosenSimpleKummerRootCharacter_apply] at hval + exact hval + have hβe_fixed (σ : Gal(E/K)) : + Units.map σ.toMonoidHom (β ^ e) = β ^ e := by + have hσβ : Units.map σ.toMonoidHom β = + KummerTheory.rootQuotient (K := K) (L := E) β σ * β := by + simp only [KummerTheory.rootQuotient] + rw [div_mul_cancel] + simp only [AlgEquiv.smul_units_def] + apply Units.ext + rfl + calc + Units.map σ.toMonoidHom (β ^ e) = (Units.map σ.toMonoidHom β) ^ e := + map_pow (Units.map σ.toMonoidHom) β e + _ = (KummerTheory.rootQuotient (K := K) (L := E) β σ * β) ^ e := by + rw [hσβ] + _ = (KummerTheory.rootQuotient (K := K) (L := E) β σ) ^ e * β ^ e := + mul_pow _ _ _ + _ = β ^ e := by rw [hquot_pow σ, one_mul] + have hβe : ((β ^ e : Eˣ) : E) ∈ Set.range (algebraMap K E) := by + apply (IsGalois.mem_range_algebraMap_iff_fixed + (((β ^ e : Eˣ) : E))).2 + intro σ + have hval := congrArg Units.val (hβe_fixed σ) + change σ (((β ^ e : Eˣ) : E)) = ((β ^ e : Eˣ) : E) at hval + exact hval + have hclass_e : (powerClass K n a) ^ e = 1 := + (chosenRoot_pow_mem_base_iff_powerClass_pow_eq_one K n hnK hmu a e).1 hβe + have hdvd : d ∣ e := orderOf_dvd_of_pow_eq_one hclass_e + have hdegree_ge : d ≤ e := Nat.le_of_dvd Module.finrank_pos hdvd + exact Nat.le_antisymm hdegree_le hdegree_ge + +end ClassFieldTheory.LocalClassFieldTheory.Kummer diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertExponentCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertExponentCompatibility.lean new file mode 100644 index 0000000000..34a7373435 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertExponentCompatibility.lean @@ -0,0 +1,142 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerExponentTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +/-! +# Compatibility of local Hilbert symbols at divisible exponents + +The source Hilbert symbol uses its first argument as the local Artin input +and its second as the Kummer radical. Artin restriction along the actual +simple Kummer tower makes its values compatible as the exponent varies. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory.Kummer + +open RamificationTheory + +/-- If `m ∣ n`, the exponent-`m` Hilbert value is the `(n/m)`-th power of +the exponent-`n` value, compared as units of the base field. -/ +theorem localHilbertSymbol_exponentCompatibility + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (m n : ℕ+) (hmK : ((m : ℕ) : K) ≠ 0) + (hnK : ((n : ℕ) : K) ≠ 0) + (hmuM : (primitiveRoots (m : ℕ) K).Nonempty) + (hmuN : (primitiveRoots (n : ℕ) K).Nonempty) + (hmn : (m : ℕ) ∣ (n : ℕ)) (a b : Kˣ) : + (localHilbertSymbol K m hmK hmuM a b).1 = + (localHilbertSymbol K n hnK hmuN a b).1 ^ ((n : ℕ) / (m : ℕ)) := by + obtain ⟨q, hq⟩ := hmn + have hqm : q * (m : ℕ) = (n : ℕ) := by + rw [mul_comm, ← hq] + have hdiv : (n : ℕ) / (m : ℕ) = q := by + rw [hq, Nat.mul_div_cancel_left _ m.pos] + rw [hdiv] + let Em := KummerTheory.chosenSimpleKummerExtension K m hmK b + let En := KummerTheory.chosenSimpleKummerExtension K n hnK b + let hEF : Em ≤ En := + chosenSimpleKummerExtension_le_of_dvd K m n hmK hnK hmuM ⟨q, hq⟩ b + let : FiniteDimensional K Em := + KummerTheory.chosenSimpleKummerExtension_finiteDimensional K m hmK b + let : FiniteDimensional K En := + KummerTheory.chosenSimpleKummerExtension_finiteDimensional K n hnK b + let : IsAbelianGalois K Em := + KummerTheory.chosenSimpleKummerExtension_isAbelianGalois K m hmK hmuM b + let : IsAbelianGalois K En := + KummerTheory.chosenSimpleKummerExtension_isAbelianGalois K n hnK hmuN b + let βm : Emˣ := KummerTheory.chosenSimpleKummerRootUnit K m hmK b + let βn : Enˣ := KummerTheory.chosenSimpleKummerRootUnit K n hnK b + let βmN : Enˣ := Units.map (IntermediateField.inclusion hEF).toMonoidHom βm + let σm : Gal(Em/K) := + chosenSimpleKummerNormResidueAutomorphism K m hmK hmuM b a + let σn : Gal(En/K) := + chosenSimpleKummerNormResidueAutomorphism K n hnK hmuN b a + have hrestrict : + intermediateFieldRestrictNormalHom Em En hEF σn = σm := by + change intermediateFieldRestrictNormalHom Em En hEF + (LocalClassFieldTheory.abelianLocalArtinMonoidHom K En a) = + LocalClassFieldTheory.abelianLocalArtinMonoidHom K Em a + exact DFunLike.congr_fun + (LocalClassFieldTheory.abelianLocalArtinMonoidHom_restrict K Em En hEF) a + have hβmN : βmN ^ (m : ℕ) = + Units.map (algebraMap K En).toMonoidHom b := by + change (Units.map (IntermediateField.inclusion hEF).toMonoidHom βm) ^ + (m : ℕ) = _ + rw [← map_pow, KummerTheory.chosenSimpleKummerRootUnit_pow] + apply Units.ext + rfl + have hβnq : (βn ^ q) ^ (m : ℕ) = + Units.map (algebraMap K En).toMonoidHom b := by + rw [← pow_mul, hqm] + exact KummerTheory.chosenSimpleKummerRootUnit_pow K n hnK b + have hratio : (βmN / βn ^ q) ^ (m : ℕ) = 1 := by + rw [div_pow, hβmN, hβnq, div_self'] + obtain ⟨ζ, hζ⟩ := + KummerTheory.nthRootsOfUnityInBase_of_primitiveRoots + (K := K) (L := En) m hmuM (βmN / βn ^ q) hratio + have hrootEq : + KummerTheory.rootQuotient (K := K) (L := En) βmN σn = + KummerTheory.rootQuotient (K := K) (L := En) (βn ^ q) σn := by + apply div_eq_one.mp + rw [KummerTheory.rootQuotient_changeRoot] + rw [← hζ] + exact KummerTheory.rootQuotient_algebraMap_unit ζ σn + have hrootPow : + KummerTheory.rootQuotient (K := K) (L := En) (βn ^ q) σn = + (KummerTheory.rootQuotient (K := K) (L := En) βn σn) ^ q := by + apply Units.ext + simp only [KummerTheory.rootQuotient, AlgEquiv.smul_units_def, + Units.val_div_eq_div_val, Units.val_pow_eq_pow_val, Units.coe_map] + rw [map_pow, div_pow] + have hmval : + Units.map (algebraMap K Em).toMonoidHom + (localHilbertSymbol K m hmK hmuM a b).1 = + KummerTheory.rootQuotient (K := K) (L := Em) βm σm := by + have h := congrArg Subtype.val + (localHilbertSymbol_map_eq_rootQuotient K m hmK hmuM a b) + change Units.map (algebraMap K Em).toMonoidHom + (localHilbertSymbol K m hmK hmuM a b).1 = + KummerTheory.rootQuotient (K := K) (L := Em) βm σm at h + exact h + have hnval : + Units.map (algebraMap K En).toMonoidHom + (localHilbertSymbol K n hnK hmuN a b).1 = + KummerTheory.rootQuotient (K := K) (L := En) βn σn := by + have h := congrArg Subtype.val + (localHilbertSymbol_map_eq_rootQuotient K n hnK hmuN a b) + change Units.map (algebraMap K En).toMonoidHom + (localHilbertSymbol K n hnK hmuN a b).1 = + KummerTheory.rootQuotient (K := K) (L := En) βn σn at h + exact h + apply Units.map_injective (algebraMap K En).injective + calc + Units.map (algebraMap K En).toMonoidHom + (localHilbertSymbol K m hmK hmuM a b).1 = + Units.map (IntermediateField.inclusion hEF).toMonoidHom + (KummerTheory.rootQuotient (K := K) (L := Em) βm σm) := by + rw [← hmval] + apply Units.ext + rfl + _ = KummerTheory.rootQuotient (K := K) (L := En) βmN σn := by + rw [← hrestrict] + exact (KummerTheory.rootQuotient_map_intermediateFieldInclusion + Em En hEF βm σn).symm + _ = KummerTheory.rootQuotient (K := K) (L := En) (βn ^ q) σn := hrootEq + _ = (KummerTheory.rootQuotient (K := K) (L := En) βn σn) ^ q := hrootPow + _ = Units.map (algebraMap K En).toMonoidHom + ((localHilbertSymbol K n hnK hmuN a b).1 ^ q) := by + rw [← hnval, ← map_pow] + +end LocalClassFieldTheory.Kummer diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairing.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairing.lean new file mode 100644 index 0000000000..c4a0a3ac27 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairing.lean @@ -0,0 +1,347 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MaximalLocalKummerPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbolLaws +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtensionNorm +/-! +# Comparison of maximal and simple local Kummer pairings + +The chosen simple Kummer extension attached to one radical lies in the maximal +finite Kummer extension. Restriction of the maximal local Artin automorphism +to that simple extension, together with functoriality of root quotients, +identifies the maximal pairing with the existing local Hilbert symbol. +-/ + +@[expose] public section + +noncomputable +section + +namespace KummerTheory + +open RamificationTheory + +universe u v + +variable {K : Type u} {Omega : Type v} + [Field K] [Field Omega] [Algebra K Omega] + +/-- Root quotients commute with inclusion between normal intermediate +fields in a common ambient extension. -/ +theorem rootQuotient_map_intermediateFieldInclusion + (E F : IntermediateField K Omega) (hEF : E ≤ F) + [Normal K E] (beta : Eˣ) (sigma : Gal(F/K)) : + rootQuotient (K := K) (L := F) + (Units.map (IntermediateField.inclusion hEF).toMonoidHom beta) sigma = + Units.map (IntermediateField.inclusion hEF).toMonoidHom + (rootQuotient (K := K) (L := E) beta + (intermediateFieldRestrictNormalHom E F hEF sigma)) := by + have hcomm : + IntermediateField.inclusion hEF + (intermediateFieldRestrictNormalHom E F hEF sigma (beta : E)) = + sigma (IntermediateField.inclusion hEF (beta : E)) := by + apply F.val.injective + exact intermediateFieldRestrictNormalHom_apply_val E F hEF sigma beta + apply Units.ext + simp only [rootQuotient, AlgEquiv.smul_units_def, + Units.val_div_eq_div_val, Units.coe_map] + calc + sigma (IntermediateField.inclusion hEF (beta : E)) / + IntermediateField.inclusion hEF (beta : E) = + IntermediateField.inclusion hEF + (intermediateFieldRestrictNormalHom E F hEF sigma (beta : E)) / + IntermediateField.inclusion hEF (beta : E) := + congrArg + (fun x : F => x / IntermediateField.inclusion hEF (beta : E)) + hcomm.symm + _ = IntermediateField.inclusion hEF + (intermediateFieldRestrictNormalHom E F hEF sigma (beta : E) / + (beta : E)) := + (map_div₀ (IntermediateField.inclusion hEF).toRingHom + (intermediateFieldRestrictNormalHom E F hEF sigma (beta : E)) + (beta : E)).symm + +end KummerTheory + +namespace LocalClassFieldTheory +namespace Kummer + +open KummerTheory LocalFieldTheory RamificationTheory + +variable (K : Type) [Field K] +variable [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- Restricting the maximal Kummer Artin automorphism to the simple Kummer +extension gives its defining simple-extension Artin automorphism. -/ +theorem maximalLocalArtin_restrict_chosenSimpleKummer + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b : Kˣ) : + letI : IsAbelianGalois K (chosenSimpleKummerExtension K n hnK b) := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + intermediateFieldRestrictNormalHom + (chosenSimpleKummerExtension K n hnK b) + (maximalLocalKummerExtension K n) + (chosenSimpleKummerExtension_le_maximalKummerExtension K n hnK b) + (maximalLocalKummerNormResidueAutomorphism K n hnK hmu a) = + chosenSimpleKummerNormResidueAutomorphism K n hnK hmu b a := by + let E := chosenSimpleKummerExtension K n hnK b + let F := maximalLocalKummerExtension K n + let hEF : E ≤ F := + chosenSimpleKummerExtension_le_maximalKummerExtension K n hnK b + let Delta := maximalKummerSubgroup K n + let : FiniteDimensional K E := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let : IsAbelianGalois K E := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let : FiniteDimensional K F := + maximalKummerRadicalExtension_finiteDimensional K n hnK hmu + let : IsAbelianGalois K F := + kummerRadicalExtension_isAbelianGalois + (K := K) (Omega := SeparableClosure K) n hmu Delta.1 + change intermediateFieldRestrictNormalHom E F hEF + (abelianLocalArtinMonoidHom K F a) = + abelianLocalArtinMonoidHom K E a + exact DFunLike.congr_fun + (abelianLocalArtinMonoidHom_restrict K E F hEF) a + +/-- The maximal pairing evaluated at `(a,b)` agrees with the local Hilbert +symbol homomorphism for the simple extension generated by `b`. -/ +theorem maximalLocalKummerPairingRightHom_eq_localHilbertSymbolHom + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b : Kˣ) : + maximalLocalKummerPairingRightHom K n hnK hmu a b = + localHilbertSymbolHom K n hnK hmu b a := by + let E := chosenSimpleKummerExtension K n hnK b + let F := maximalLocalKummerExtension K n + let hEF : E ≤ F := + chosenSimpleKummerExtension_le_maximalKummerExtension K n hnK b + let betaE : Eˣ := chosenSimpleKummerRootUnit K n hnK b + let betaF : Fˣ := + Units.map (IntermediateField.inclusion hEF).toMonoidHom betaE + let sigmaF : Gal(F/K) := + maximalLocalKummerNormResidueAutomorphism K n hnK hmu a + let sigmaE : Gal(E/K) := + chosenSimpleKummerNormResidueAutomorphism K n hnK hmu b a + let : FiniteDimensional K E := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let : IsAbelianGalois K E := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + have hbetaF : + betaF ^ (n : ℕ) = Units.map (algebraMap K F).toMonoidHom b := by + change + (Units.map (IntermediateField.inclusion hEF).toMonoidHom betaE) ^ + (n : ℕ) = + Units.map (algebraMap K F).toMonoidHom b + rw [← map_pow, show betaE ^ (n : ℕ) = + Units.map (algebraMap K E).toMonoidHom b by + exact chosenSimpleKummerRootUnit_pow K n hnK b] + apply Units.ext + rfl + have hrestrict : + intermediateFieldRestrictNormalHom E F hEF sigmaF = sigmaE := by + simpa only [E, F, hEF, sigmaF, sigmaE] using + maximalLocalArtin_restrict_chosenSimpleKummer K n hnK hmu a b + have hmaxVal : + Units.map (algebraMap K F).toMonoidHom + (maximalLocalKummerPairingRightHom K n hnK hmu a b).1 = + rootQuotient (K := K) (L := F) betaF sigmaF := by + have h := congrArg Subtype.val + (maximalLocalKummerPairingRightHom_map_eq_rootQuotient_of_pow + K n hnK hmu a b betaF hbetaF) + exact h + have hlocalVal : + Units.map (algebraMap K E).toMonoidHom + (localHilbertSymbolHom K n hnK hmu b a).1 = + rootQuotient (K := K) (L := E) betaE sigmaE := by + have h := congrArg Subtype.val + (localHilbertSymbol_map_eq_rootQuotient K n hnK hmu a b) + change + Units.map + (algebraMap K (chosenSimpleKummerExtension K n hnK b)).toMonoidHom + (localHilbertSymbol K n hnK hmu a b).1 = + rootQuotient + (K := K) (L := chosenSimpleKummerExtension K n hnK b) + (chosenSimpleKummerRootUnit K n hnK b) + (chosenSimpleKummerNormResidueAutomorphism K n hnK hmu b a) at h + simpa only [localHilbertSymbolHom_apply, E, betaE, sigmaE] using h + apply nthRootsSubgroupMap_injective K F (n : ℕ) + apply Subtype.ext + change + Units.map (algebraMap K F).toMonoidHom + (maximalLocalKummerPairingRightHom K n hnK hmu a b).1 = + Units.map (algebraMap K F).toMonoidHom + (localHilbertSymbolHom K n hnK hmu b a).1 + calc + Units.map (algebraMap K F).toMonoidHom + (maximalLocalKummerPairingRightHom K n hnK hmu a b).1 = + rootQuotient (K := K) (L := F) betaF sigmaF := hmaxVal + _ = Units.map (IntermediateField.inclusion hEF).toMonoidHom + (rootQuotient (K := K) (L := E) betaE + (intermediateFieldRestrictNormalHom E F hEF sigmaF)) := by + exact rootQuotient_map_intermediateFieldInclusion E F hEF betaE sigmaF + _ = Units.map (IntermediateField.inclusion hEF).toMonoidHom + (rootQuotient (K := K) (L := E) betaE sigmaE) := by + rw [hrestrict] + _ = Units.map (algebraMap K F).toMonoidHom + (localHilbertSymbolHom K n hnK hmu b a).1 := by + rw [← hlocalVal] + apply Units.ext + rfl + +/-- The local Hilbert symbol is multiplicative in its second argument. -/ +@[simp] +theorem localHilbertSymbol_mul_right + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b c : Kˣ) : + localHilbertSymbol K n hnK hmu a (b * c) = + localHilbertSymbol K n hnK hmu a b * + localHilbertSymbol K n hnK hmu a c := by + calc + localHilbertSymbol K n hnK hmu a (b * c) = + maximalLocalKummerPairingRightHom K n hnK hmu a (b * c) := by + exact (maximalLocalKummerPairingRightHom_eq_localHilbertSymbolHom + K n hnK hmu a (b * c)).symm + _ = maximalLocalKummerPairingRightHom K n hnK hmu a b * + maximalLocalKummerPairingRightHom K n hnK hmu a c := + maximalLocalKummerPairing_mul_right K n hnK hmu a b c + _ = localHilbertSymbol K n hnK hmu a b * + localHilbertSymbol K n hnK hmu a c := by + rw [maximalLocalKummerPairingRightHom_eq_localHilbertSymbolHom, + maximalLocalKummerPairingRightHom_eq_localHilbertSymbolHom] + simp only [localHilbertSymbolHom_apply] + +/-- The local Hilbert symbol of a unit and its nonzero complement is one. -/ +@[simp] +theorem localHilbertSymbol_steinberg + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a : Kˣ) (h_one_sub : 1 - (a : K) ≠ 0) : + localHilbertSymbol K n hnK hmu a + (Units.mk0 (1 - (a : K)) h_one_sub) = 1 := by + apply + (localHilbertSymbol_eq_one_iff_mem_localNormSubgroup + K n hnK hmu a (Units.mk0 (1 - (a : K)) h_one_sub)).2 + exact + unit_mem_localNormSubgroup_chosenSimpleKummerExtension_one_sub + K n hnK hmu a h_one_sub + +/-- The local Hilbert symbol of a unit and its negative is one. -/ +@[simp] +theorem localHilbertSymbol_neg_self + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a : Kˣ) : + localHilbertSymbol K n hnK hmu a (-a) = 1 := by + let B : Kˣ → Kˣ → nthRootsSubgroup K (n : ℕ) := + fun x y => localHilbertSymbol K n hnK hmu x y + have hmul_right (x y z : Kˣ) : + B x (y * z) = B x y * B x z := by + exact localHilbertSymbol_mul_right K n hnK hmu x y z + have hinv_left (x y : Kˣ) : B x⁻¹ y = (B x y)⁻¹ := by + change + localHilbertSymbolHom K n hnK hmu y x⁻¹ = + (localHilbertSymbolHom K n hnK hmu y x)⁻¹ + exact map_inv (localHilbertSymbolHom K n hnK hmu y) x + have hone_left (y : Kˣ) : B 1 y = 1 := by + change localHilbertSymbolHom K n hnK hmu y 1 = 1 + exact map_one (localHilbertSymbolHom K n hnK hmu y) + have hone_right (x : Kˣ) : B x 1 = 1 := by + calc + B x 1 = maximalLocalKummerPairingRightHom K n hnK hmu x 1 := by + exact + (maximalLocalKummerPairingRightHom_eq_localHilbertSymbolHom + K n hnK hmu x 1).symm + _ = 1 := map_one (maximalLocalKummerPairingRightHom K n hnK hmu x) + have hinv_right (x y : Kˣ) : B x y⁻¹ = (B x y)⁻¹ := by + have hmul := hmul_right x y y⁻¹ + rw [mul_inv_cancel, hone_right] at hmul + exact eq_inv_of_mul_eq_one_right hmul.symm + change B a (-a) = 1 + by_cases ha : a = 1 + · subst a + exact hone_left (-1) + · have ha_val : (a : K) ≠ 1 := by + intro h + apply ha + apply Units.ext + exact h + have hc0 : 1 - (a : K) ≠ 0 := by + intro h + exact ha_val (sub_eq_zero.mp h).symm + have hd0 : 1 - ((a⁻¹ : Kˣ) : K) ≠ 0 := by + intro h + apply inv_ne_one.mpr ha_val + simpa only [Units.val_inv_eq_inv_val] using (sub_eq_zero.mp h).symm + let c : Kˣ := Units.mk0 (1 - (a : K)) hc0 + let d : Kˣ := Units.mk0 (1 - ((a⁻¹ : Kˣ) : K)) hd0 + have hd : d = (-c) * a⁻¹ := by + apply Units.ext + simp only [d, c, Units.val_mk0, Units.val_mul, Units.val_neg, + Units.val_inv_eq_inv_val] + change 1 - (a : K)⁻¹ = -(1 - (a : K)) * (a : K)⁻¹ + calc + 1 - (a : K)⁻¹ = ((a : K) - 1) * (a : K)⁻¹ := by + rw [sub_mul, mul_inv_cancel₀ (Units.ne_zero a), one_mul] + _ = -(1 - (a : K)) * (a : K)⁻¹ := by ring + have hs1 : B a c = 1 := by + exact localHilbertSymbol_steinberg K n hnK hmu a hc0 + have hs2 : B a⁻¹ d = 1 := by + exact localHilbertSymbol_steinberg K n hnK hmu a⁻¹ hd0 + have hs2' : B a d = 1 := by + rw [hinv_left] at hs2 + exact inv_eq_one.mp hs2 + have hdiag : B a (-c) = B a a := by + rw [hd, hmul_right, hinv_right] at hs2' + exact mul_inv_eq_one.mp hs2' + have hc : c = (-1 : Kˣ) * (-c) := by simp + have hneg_diag : B a (-1) * B a a = 1 := by + rw [hc, hmul_right, hdiag] at hs1 + exact hs1 + rw [show -a = (-1 : Kˣ) * a by simp, hmul_right] + exact hneg_diag + +/-- The local Hilbert symbol is skew-symmetric. -/ +theorem localHilbertSymbol_skew + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b : Kˣ) : + localHilbertSymbol K n hnK hmu a b = + (localHilbertSymbol K n hnK hmu b a)⁻¹ := by + let B : Kˣ → Kˣ → nthRootsSubgroup K (n : ℕ) := + fun x y => localHilbertSymbol K n hnK hmu x y + have hmul_left (x y z : Kˣ) : + B (x * y) z = B x z * B y z := by + change + localHilbertSymbolHom K n hnK hmu z (x * y) = + localHilbertSymbolHom K n hnK hmu z x * + localHilbertSymbolHom K n hnK hmu z y + exact map_mul (localHilbertSymbolHom K n hnK hmu z) x y + have hmul_right (x y z : Kˣ) : + B x (y * z) = B x y * B x z := by + exact localHilbertSymbol_mul_right K n hnK hmu x y z + have hneg_self (x : Kˣ) : B x (-x) = 1 := by + exact localHilbertSymbol_neg_self K n hnK hmu x + have hexpand : + B (a * b) (-(a * b)) = + (B a (-a) * B a b) * (B b (-b) * B b a) := by + rw [hmul_left] + congr 1 + · rw [show -(a * b) = (-a) * b by simp, hmul_right] + · rw [show -(a * b) = (-b) * a by simp [mul_comm], hmul_right] + have hprod : B a b * B b a = 1 := by + calc + B a b * B b a = + (B a (-a) * B a b) * (B b (-b) * B b a) := by + simp only [hneg_self, one_mul] + _ = B (a * b) (-(a * b)) := hexpand.symm + _ = 1 := hneg_self (a * b) + exact (eq_inv_iff_mul_eq_one).2 hprod + +end Kummer +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean new file mode 100644 index 0000000000..e3f0c08d79 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean @@ -0,0 +1,387 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MaximalKummerNorm +/-! +# Nondegeneracy of the local Hilbert pairing + +The maximal finite Kummer extension identifies the common kernel of the +local Hilbert-symbol characters with the subgroup of powers. The resulting +symbol therefore descends to a nondegenerate pairing on the local power-class +group. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory +namespace Kummer + +open KummerTheory LocalFieldTheory + +variable (K : Type) [Field K] +variable [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +private theorem maximalLocalKummerPairing_eq_transpose + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b : Kˣ) : + let Delta := maximalKummerSubgroup K n + let E := maximalLocalKummerExtension K n + letI : FiniteDimensional K E := + maximalKummerRadicalExtension_finiteDimensional K n hnK hmu + letI : IsAbelianGalois K E := + kummerRadicalExtension_isAbelianGalois + (K := K) (Omega := SeparableClosure K) n hmu Delta.1 + let hDelta : Delta.1 ≤ + finiteKummerRadicalSubgroup (K := K) (L := E) n := + le_finiteKummerRadicalSubgroup_kummerRadicalExtension + n hnK Delta.1 + maximalLocalKummerPairingRightHom K n hnK hmu a b = + (nthRootsSubgroupEquivOfPrimitiveRoots K E n hmu).symm + (restrictedKummerTranspose n hmu Delta hDelta + (maximalLocalKummerNormResidueAutomorphism K n hnK hmu a) + (maximalRestrictedRadicalQuotientEquiv K n + (QuotientGroup.mk' + (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range b))) := by + rfl + +/-- An element in the left kernel of every local Hilbert-symbol character +is exactly an `n`-th power. -/ +theorem localHilbertSymbol_left_kernel + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a : Kˣ) : + (∀ b : Kˣ, localHilbertSymbol K n hnK hmu a b = 1) ↔ + a ∈ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range := by + let Delta := maximalKummerSubgroup K n + let E := maximalLocalKummerExtension K n + let P := (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range + let hDelta : Delta.1 ≤ + finiteKummerRadicalSubgroup (K := K) (L := E) n := + le_finiteKummerRadicalSubgroup_kummerRadicalExtension + n hnK Delta.1 + let : FiniteDimensional K E := + maximalKummerRadicalExtension_finiteDimensional K n hnK hmu + let : IsAbelianGalois K E := + kummerRadicalExtension_isAbelianGalois + (K := K) (Omega := SeparableClosure K) n hmu Delta.1 + constructor + · intro h + let sigma : Gal(E/K) := + maximalLocalKummerNormResidueAutomorphism K n hnK hmu a + have hsigma : sigma = 1 := by + apply + (restrictedKummerTranspose_injective_of_adjoin + n hmu Delta hDelta + (kummerRadicalExtension_internalRoots_adjoin_eq_top + (K := K) (Omega := SeparableClosure K) n Delta)) + rw [map_one] + apply MonoidHom.ext + intro q + obtain ⟨q, rfl⟩ := + (maximalRestrictedRadicalQuotientEquiv K n).surjective q + obtain ⟨b, rfl⟩ := QuotientGroup.mk'_surjective P q + let e := nthRootsSubgroupEquivOfPrimitiveRoots K E n hmu + apply e.symm.injective + have hpair : maximalLocalKummerPairingRightHom K n hnK hmu a b = 1 := by + rw [maximalLocalKummerPairingRightHom_eq_localHilbertSymbolHom] + exact h b + have hcompare := maximalLocalKummerPairing_eq_transpose K n hnK hmu a b + change + maximalLocalKummerPairingRightHom K n hnK hmu a b = + e.symm + (restrictedKummerTranspose n hmu Delta hDelta sigma + (maximalRestrictedRadicalQuotientEquiv K n + (QuotientGroup.mk' P b))) at hcompare + rw [← hcompare, hpair] + change 1 = e.symm 1 + exact (map_one e.symm).symm + have haNorm : a ∈ localNormSubgroup K E := by + rw [← abelianLocalArtinMonoidHom_ker K E, MonoidHom.mem_ker] + change sigma = 1 + exact hsigma + have hmax := maximalKummerNormSubgroup_eq_powMonoidHom_range + (K := K) (Omega := SeparableClosure K) n hnK hmu + change localNormSubgroup K E = P at hmax + rw [hmax] at haNorm + exact haNorm + · intro ha b + obtain ⟨c, hc⟩ := (MonoidHom.mem_range (G := Kˣ)).1 ha + have hca : c ^ (n : ℕ) = a := by + simpa only [powMonoidHom_apply] using hc + rw [← hca] + change localHilbertSymbolHom K n hnK hmu b (c ^ (n : ℕ)) = 1 + rw [map_pow] + apply Subtype.ext + change (↑(localHilbertSymbol K n hnK hmu c b) : Kˣ) ^ (n : ℕ) = 1 + exact (KummerTheory.mem_nthRootsSubgroup_iff K).mp + (localHilbertSymbol K n hnK hmu c b).property + +/-- An element in the right kernel of every local Hilbert-symbol character +is exactly an `n`-th power. -/ +theorem localHilbertSymbol_right_kernel + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (b : Kˣ) : + (∀ a : Kˣ, localHilbertSymbol K n hnK hmu a b = 1) ↔ + b ∈ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range := by + rw [← localHilbertSymbol_left_kernel K n hnK hmu b] + constructor + · intro h a + rw [localHilbertSymbol_skew K n hnK hmu b a, h a, inv_one] + · intro h a + rw [localHilbertSymbol_skew K n hnK hmu a b, h a, inv_one] + +noncomputable def localHilbertRightPowerClassHom + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a : Kˣ) : + (Kˣ ⧸ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range) →* + nthRootsSubgroup K (n : ℕ) := + QuotientGroup.lift + (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range + (maximalLocalKummerPairingRightHom K n hnK hmu a) (by + intro b hb + rw [MonoidHom.mem_ker] + obtain ⟨c, rfl⟩ := (MonoidHom.mem_range (G := Kˣ)).1 hb + rw [powMonoidHom_apply, map_pow] + apply Subtype.ext + change + (↑(maximalLocalKummerPairingRightHom K n hnK hmu a c) : Kˣ) ^ + (n : ℕ) = 1 + exact (KummerTheory.mem_nthRootsSubgroup_iff K).mp + (maximalLocalKummerPairingRightHom K n hnK hmu a c).property) + +private theorem localHilbertRightPowerClassHom_mk + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b : Kˣ) : + localHilbertRightPowerClassHom K n hnK hmu a + (QuotientGroup.mk' + (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range b) = + maximalLocalKummerPairingRightHom K n hnK hmu a b := + rfl + +/-- The local Hilbert symbol as a homomorphism in the first variable with the second variable +descended to its power-class quotient. -/ +noncomputable def localHilbertPowerClassLeftHom + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + Kˣ →* + ((Kˣ ⧸ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range) →* + nthRootsSubgroup K (n : ℕ)) where + toFun a := localHilbertRightPowerClassHom K n hnK hmu a + map_one' := by + apply MonoidHom.ext + intro q + obtain ⟨b, rfl⟩ := QuotientGroup.mk'_surjective + (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range q + change maximalLocalKummerPairingRightHom K n hnK hmu 1 b = 1 + rw [maximalLocalKummerPairingRightHom_eq_localHilbertSymbolHom] + exact map_one (localHilbertSymbolHom K n hnK hmu b) + map_mul' := by + intro a c + apply MonoidHom.ext + intro q + obtain ⟨b, rfl⟩ := QuotientGroup.mk'_surjective + (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range q + change + maximalLocalKummerPairingRightHom K n hnK hmu (a * c) b = + maximalLocalKummerPairingRightHom K n hnK hmu a b * + maximalLocalKummerPairingRightHom K n hnK hmu c b + rw [maximalLocalKummerPairingRightHom_eq_localHilbertSymbolHom, + maximalLocalKummerPairingRightHom_eq_localHilbertSymbolHom, + maximalLocalKummerPairingRightHom_eq_localHilbertSymbolHom] + exact map_mul (localHilbertSymbolHom K n hnK hmu b) a c + +private theorem powMonoidHom_range_le_localHilbertPowerClassLeftHom_ker + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range ≤ + MonoidHom.ker (localHilbertPowerClassLeftHom K n hnK hmu) := by + intro a ha + rw [MonoidHom.mem_ker] + obtain ⟨c, hc⟩ := (MonoidHom.mem_range (G := Kˣ)).1 ha + have hca : c ^ (n : ℕ) = a := by + simpa only [powMonoidHom_apply] using hc + apply MonoidHom.ext + intro q + obtain ⟨b, rfl⟩ := QuotientGroup.mk'_surjective + (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range q + change maximalLocalKummerPairingRightHom K n hnK hmu a b = 1 + rw [← hca, maximalLocalKummerPairingRightHom_eq_localHilbertSymbolHom] + rw [map_pow] + apply Subtype.ext + change (↑(localHilbertSymbol K n hnK hmu c b) : Kˣ) ^ (n : ℕ) = 1 + exact (KummerTheory.mem_nthRootsSubgroup_iff K).mp + (localHilbertSymbol K n hnK hmu c b).property + +/-- The local Hilbert symbol descended in both variables to the local +power-class group. -/ +noncomputable def localHilbertPairing + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + (Kˣ ⧸ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range) →* + ((Kˣ ⧸ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range) →* + nthRootsSubgroup K (n : ℕ)) := + QuotientGroup.lift + (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range + (localHilbertPowerClassLeftHom K n hnK hmu) + (by exact powMonoidHom_range_le_localHilbertPowerClassLeftHom_ker K n hnK hmu) + +/-- Evaluation of the descended pairing agrees with the original local +Hilbert symbol on representatives. -/ +theorem localHilbertPairing_apply + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b : Kˣ) : + localHilbertPairing K n hnK hmu + (QuotientGroup.mk' + (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range a) + (QuotientGroup.mk' + (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range b) = + localHilbertSymbol K n hnK hmu a b := by + change maximalLocalKummerPairingRightHom K n hnK hmu a b = + localHilbertSymbol K n hnK hmu a b + exact maximalLocalKummerPairingRightHom_eq_localHilbertSymbolHom + K n hnK hmu a b + +/-- The transposed descended pairing, viewed as a homomorphism into the +character group. -/ +noncomputable def localHilbertPairingFlip + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + (Kˣ ⧸ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range) →* + ((Kˣ ⧸ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range) →* + nthRootsSubgroup K (n : ℕ)) where + toFun b := + { toFun := fun a => localHilbertPairing K n hnK hmu a b + map_one' := by + change localHilbertPairing K n hnK hmu 1 b = 1 + rw [map_one] + rfl + map_mul' := by + intro a c + change localHilbertPairing K n hnK hmu (a * c) b = + localHilbertPairing K n hnK hmu a b * + localHilbertPairing K n hnK hmu c b + rw [map_mul] + rfl } + map_one' := by + apply MonoidHom.ext + intro a + exact map_one (localHilbertPairing K n hnK hmu a) + map_mul' := by + intro b c + apply MonoidHom.ext + intro a + exact map_mul (localHilbertPairing K n hnK hmu a) b c + +/-- The descended local Hilbert pairing separates power classes in its +left variable. -/ +theorem localHilbertPairing_injective_left + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + Function.Injective (localHilbertPairing K n hnK hmu) := by + intro q r hqr + let P := (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range + obtain ⟨a, rfl⟩ := QuotientGroup.mk'_surjective P q + obtain ⟨c, rfl⟩ := QuotientGroup.mk'_surjective P r + apply (QuotientGroup.eq_iff_div_mem).2 + apply (localHilbertSymbol_left_kernel K n hnK hmu (a / c)).1 + intro b + have hv := DFunLike.congr_fun hqr (QuotientGroup.mk' P b) + change + maximalLocalKummerPairingRightHom K n hnK hmu a b = + maximalLocalKummerPairingRightHom K n hnK hmu c b at hv + have hvSymbol : + localHilbertSymbolHom K n hnK hmu b a = + localHilbertSymbolHom K n hnK hmu b c := by + change localHilbertSymbol K n hnK hmu a b = + localHilbertSymbol K n hnK hmu c b + exact + (maximalLocalKummerPairingRightHom_eq_localHilbertSymbolHom + K n hnK hmu a b).symm.trans + (hv.trans + (maximalLocalKummerPairingRightHom_eq_localHilbertSymbolHom + K n hnK hmu c b)) + change localHilbertSymbolHom K n hnK hmu b (a / c) = 1 + calc + localHilbertSymbolHom K n hnK hmu b (a / c) = + localHilbertSymbolHom K n hnK hmu b a / + localHilbertSymbolHom K n hnK hmu b c := + map_div (localHilbertSymbolHom K n hnK hmu b) a c + _ = localHilbertSymbolHom K n hnK hmu b c / + localHilbertSymbolHom K n hnK hmu b c := + congrArg + (fun z => z / localHilbertSymbolHom K n hnK hmu b c) hvSymbol + _ = 1 := div_self' (localHilbertSymbolHom K n hnK hmu b c) + +/-- The descended local Hilbert pairing separates power classes in its +right variable. -/ +theorem localHilbertPairing_injective_right + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + Function.Injective (localHilbertPairingFlip K n hnK hmu) := by + intro q r hqr + let P := (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range + obtain ⟨b, rfl⟩ := QuotientGroup.mk'_surjective P q + obtain ⟨c, rfl⟩ := QuotientGroup.mk'_surjective P r + apply (QuotientGroup.eq_iff_div_mem).2 + apply (localHilbertSymbol_right_kernel K n hnK hmu (b / c)).1 + intro a + have hv := DFunLike.congr_fun hqr (QuotientGroup.mk' P a) + change + localHilbertPairing K n hnK hmu + (QuotientGroup.mk' P a) (QuotientGroup.mk' P b) = + localHilbertPairing K n hnK hmu + (QuotientGroup.mk' P a) (QuotientGroup.mk' P c) at hv + change + maximalLocalKummerPairingRightHom K n hnK hmu a b = + maximalLocalKummerPairingRightHom K n hnK hmu a c at hv + calc + localHilbertSymbol K n hnK hmu a (b / c) = + maximalLocalKummerPairingRightHom K n hnK hmu a (b / c) := + (maximalLocalKummerPairingRightHom_eq_localHilbertSymbolHom + K n hnK hmu a (b / c)).symm + _ = maximalLocalKummerPairingRightHom K n hnK hmu a b / + maximalLocalKummerPairingRightHom K n hnK hmu a c := + map_div (maximalLocalKummerPairingRightHom K n hnK hmu a) b c + _ = maximalLocalKummerPairingRightHom K n hnK hmu a c / + maximalLocalKummerPairingRightHom K n hnK hmu a c := + congrArg + (fun z => + z / maximalLocalKummerPairingRightHom K n hnK hmu a c) hv + _ = 1 := div_self' + (maximalLocalKummerPairingRightHom K n hnK hmu a c) + +/-- The local Hilbert pairing on power classes is nondegenerate in both +variables. -/ +theorem localHilbertPairing_nondegenerate + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + (∀ a, + (∀ b, localHilbertPairing K n hnK hmu a b = 1) → a = 1) ∧ + (∀ b, + (∀ a, localHilbertPairing K n hnK hmu a b = 1) → b = 1) := by + constructor + · intro a ha + apply localHilbertPairing_injective_left K n hnK hmu + apply MonoidHom.ext + intro b + rw [ha b, map_one] + rfl + · intro b hb + apply localHilbertPairing_injective_right K n hnK hmu + apply MonoidHom.ext + intro a + change localHilbertPairing K n hnK hmu a b = + localHilbertPairing K n hnK hmu a 1 + rw [hb a, map_one] + +end Kummer +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbol.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbol.lean new file mode 100644 index 0000000000..04bfc5106d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbol.lean @@ -0,0 +1,227 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue +/-! +# Local Hilbert symbols + +This file constructs the local Hilbert symbol from the public Kummer-theory +and local-reciprocity APIs. + +For `b : Kˣ`, a root `β` of `X ^ n - b` is chosen in the separable closure +and the literal simple extension `K(β)` is formed. If `K` contains the +`n`-th roots of unity, Kummer theory makes this extension finite abelian +Galois. The Hilbert symbol is the root quotient of the local Artin +automorphism, transported back to `μₙ(K)`. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory +namespace Kummer + +open CyclicCohomology KummerTheory ClassFormation +open LocalFieldTheory LocalClassFieldTheory + +variable (K : Type) [Field K] + +variable [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The local Artin automorphism of the concrete Kummer extension. -/ +noncomputable def chosenSimpleKummerNormResidueAutomorphism + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (b : Kˣ) : + Kˣ →* Gal((chosenSimpleKummerExtension K n hnK b)/K) := by + let E := chosenSimpleKummerExtension K n hnK b + letI : FiniteDimensional K E := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + letI : IsAbelianGalois K E := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + exact abelianLocalArtinMonoidHom K E + +/-- The local Hilbert symbol `(a,b)ₙ`, valued in the actual subgroup +`μₙ(K)`. -/ +noncomputable def localHilbertSymbol + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b : Kˣ) : + nthRootsSubgroup K (n : ℕ) := + (nthRootsSubgroupEquivOfPrimitiveRoots + K (chosenSimpleKummerExtension K n hnK b) n hmu).symm + (chosenSimpleKummerRootCharacter K n hnK hmu b + (chosenSimpleKummerNormResidueAutomorphism K n hnK hmu b a)) + +/-- For fixed `b`, the local Hilbert symbol is a homomorphism in its first +argument. -/ +noncomputable def localHilbertSymbolHom + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (b : Kˣ) : + Kˣ →* nthRootsSubgroup K (n : ℕ) := + (nthRootsSubgroupEquivOfPrimitiveRoots + K (chosenSimpleKummerExtension K n hnK b) n hmu).symm.toMonoidHom.comp + ((chosenSimpleKummerRootCharacter K n hnK hmu b).comp + (chosenSimpleKummerNormResidueAutomorphism K n hnK hmu b)) + +@[simp] +theorem localHilbertSymbolHom_apply + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b : Kˣ) : + localHilbertSymbolHom K n hnK hmu b a = + localHilbertSymbol K n hnK hmu a b := + rfl + +/-- Base change sends the Hilbert symbol to its defining root quotient. -/ +theorem localHilbertSymbol_map_eq_rootQuotient + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b : Kˣ) : + nthRootsSubgroupMap K (chosenSimpleKummerExtension K n hnK b) (n : ℕ) + (localHilbertSymbol K n hnK hmu a b) = + ⟨rootQuotient + (K := K) (L := chosenSimpleKummerExtension K n hnK b) + (chosenSimpleKummerRootUnit K n hnK b) + (chosenSimpleKummerNormResidueAutomorphism K n hnK hmu b a), + chosenSimpleKummer_rootQuotient_mem K n hnK b + (chosenSimpleKummerNormResidueAutomorphism K n hnK hmu b a)⟩ := by + change + (nthRootsSubgroupEquivOfPrimitiveRoots + K (chosenSimpleKummerExtension K n hnK b) n hmu) + ((nthRootsSubgroupEquivOfPrimitiveRoots + K (chosenSimpleKummerExtension K n hnK b) n hmu).symm + (chosenSimpleKummerRootCharacter K n hnK hmu b + (chosenSimpleKummerNormResidueAutomorphism + K n hnK hmu b a))) = _ + rw [(nthRootsSubgroupEquivOfPrimitiveRoots + K (chosenSimpleKummerExtension K n hnK b) n hmu).apply_symm_apply] + exact + chosenSimpleKummerRootCharacter_apply K n hnK hmu b + (chosenSimpleKummerNormResidueAutomorphism K n hnK hmu b a) + +/-- The local Artin automorphism acts on the chosen radical by +multiplication with the Hilbert symbol. -/ +theorem normResidueAutomorphism_map_rootUnit_eq_hilbertSymbol_mul + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b : Kˣ) : + let E := chosenSimpleKummerExtension K n hnK b + let sigma : Gal(E/K) := + chosenSimpleKummerNormResidueAutomorphism K n hnK hmu b a + let beta : Eˣ := chosenSimpleKummerRootUnit K n hnK b + Units.map sigma beta = + Units.map (algebraMap K E).toMonoidHom + (localHilbertSymbol K n hnK hmu a b).1 * beta := by + let E := chosenSimpleKummerExtension K n hnK b + let sigma : Gal(E/K) := + chosenSimpleKummerNormResidueAutomorphism K n hnK hmu b a + let beta : Eˣ := chosenSimpleKummerRootUnit K n hnK b + change Units.map sigma beta = + Units.map (algebraMap K E).toMonoidHom + (localHilbertSymbol K n hnK hmu a b).1 * beta + have hmap0 := congrArg Subtype.val + (localHilbertSymbol_map_eq_rootQuotient K n hnK hmu a b) + have hmap : + Units.map (algebraMap K E).toMonoidHom + (localHilbertSymbol K n hnK hmu a b).1 = + rootQuotient (K := K) (L := E) beta sigma := by + change + Units.map + (algebraMap K (chosenSimpleKummerExtension K n hnK b)).toMonoidHom + (localHilbertSymbol K n hnK hmu a b).1 = + rootQuotient + (K := K) (L := chosenSimpleKummerExtension K n hnK b) + (chosenSimpleKummerRootUnit K n hnK b) + (chosenSimpleKummerNormResidueAutomorphism K n hnK hmu b a) at hmap0 + simpa only [E, beta, sigma] using hmap0 + rw [hmap] + simpa only [AlgEquiv.smul_units_def] using + (rootQuotient_mul_right + (K := K) (L := E) beta sigma).symm + +/-- Element-valued form of the defining Artin action. -/ +theorem normResidueAutomorphism_apply_root_eq_hilbertSymbol_mul + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b : Kˣ) : + let E := chosenSimpleKummerExtension K n hnK b + let beta : E := (chosenSimpleKummerRootUnit K n hnK b : Eˣ) + chosenSimpleKummerNormResidueAutomorphism K n hnK hmu b a beta = + algebraMap K E ((localHilbertSymbol K n hnK hmu a b).1 : K) * beta := by + let E := chosenSimpleKummerExtension K n hnK b + let betaUnit : Eˣ := chosenSimpleKummerRootUnit K n hnK b + have hunit : + Units.map + (chosenSimpleKummerNormResidueAutomorphism K n hnK hmu b a) betaUnit = + Units.map (algebraMap K E).toMonoidHom + (localHilbertSymbol K n hnK hmu a b).1 * betaUnit := by + simpa only [E, betaUnit] using + (normResidueAutomorphism_map_rootUnit_eq_hilbertSymbol_mul + K n hnK hmu a b) + exact congrArg (fun u : Eˣ => (u : E)) hunit + +/-- The concrete Artin homomorphism has precisely the local norm subgroup +as its kernel. -/ +theorem chosenSimpleKummerNormResidueAutomorphism_ker + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (b : Kˣ) : + (chosenSimpleKummerNormResidueAutomorphism K n hnK hmu b).ker = + LocalFieldTheory.localNormSubgroup K + (chosenSimpleKummerExtension K n hnK b) := by + let E := chosenSimpleKummerExtension K n hnK b + let : FiniteDimensional K E := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let : IsAbelianGalois K E := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + change (abelianLocalArtinMonoidHom K E).ker = + LocalFieldTheory.localNormSubgroup K E + exact abelianLocalArtinMonoidHom_ker K E + +/-- Every norm from `K(ⁿ√b)` is killed by the Hilbert-symbol character. -/ +theorem localNormSubgroup_le_localHilbertSymbolHom_ker + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (b : Kˣ) : + LocalFieldTheory.localNormSubgroup K + (chosenSimpleKummerExtension K n hnK b) ≤ + (localHilbertSymbolHom K n hnK hmu b).ker := by + intro a ha + have hartin : + chosenSimpleKummerNormResidueAutomorphism K n hnK hmu b a = 1 := by + have hker : + a ∈ (chosenSimpleKummerNormResidueAutomorphism K n hnK hmu b).ker := by + rw [chosenSimpleKummerNormResidueAutomorphism_ker K n hnK hmu b] + exact ha + exact hker + change localHilbertSymbolHom K n hnK hmu b a = 1 + simp [localHilbertSymbolHom, hartin] + +/-- The local Hilbert symbol descended to the concrete local norm +quotient. -/ +noncomputable def localHilbertSymbolFromNormQuotient + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (b : Kˣ) : + LocalFieldTheory.NormQuotient K + (chosenSimpleKummerExtension K n hnK b) →* + nthRootsSubgroup K (n : ℕ) := + LocalFieldTheory.normQuotientLift + (localHilbertSymbolHom K n hnK hmu b) + (localNormSubgroup_le_localHilbertSymbolHom_ker + K n hnK hmu b) + +@[simp] +theorem localHilbertSymbolFromNormQuotient_normClass + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b : Kˣ) : + localHilbertSymbolFromNormQuotient K n hnK hmu b + (LocalFieldTheory.normClass K + (chosenSimpleKummerExtension K n hnK b) a) = + localHilbertSymbol K n hnK hmu a b := by + rw [localHilbertSymbolFromNormQuotient] + exact localHilbertSymbolHom_apply K n hnK hmu a b + +end Kummer +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbolLaws.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbolLaws.lean new file mode 100644 index 0000000000..58cc0da2e6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbolLaws.lean @@ -0,0 +1,84 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol +/-! +# Kernel laws for the local Hilbert symbol + +The local Hilbert-symbol character is the composite of the local Artin map, +the injective character obtained by evaluating automorphisms on the chosen +Kummer radical, and the equivalence that transports roots of unity back to +the base field. Consequently its kernel is exactly the local norm subgroup. +This also makes the induced character on the concrete norm quotient +injective. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory +namespace Kummer + +open KummerTheory +open LocalFieldTheory + +variable (K : Type) [Field K] +variable [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The kernel of the local Hilbert-symbol character is exactly the norm +subgroup from the associated simple Kummer extension. -/ +theorem localHilbertSymbolHom_ker + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (b : Kˣ) : + (localHilbertSymbolHom K n hnK hmu b).ker = + localNormSubgroup K (chosenSimpleKummerExtension K n hnK b) := by + unfold localHilbertSymbolHom + rw [MonoidHom.ker_comp_of_injective _ _ + (nthRootsSubgroupEquivOfPrimitiveRoots + K (chosenSimpleKummerExtension K n hnK b) n hmu).symm.injective] + rw [MonoidHom.ker_comp_of_injective _ _ + (chosenSimpleKummerRootCharacter_injective K n hnK hmu b)] + exact chosenSimpleKummerNormResidueAutomorphism_ker K n hnK hmu b + +/-- A local Hilbert symbol is one exactly when its first argument is a norm +from the simple Kummer extension determined by its second argument. -/ +theorem localHilbertSymbol_eq_one_iff_mem_localNormSubgroup + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b : Kˣ) : + localHilbertSymbol K n hnK hmu a b = 1 ↔ + a ∈ localNormSubgroup K (chosenSimpleKummerExtension K n hnK b) := by + change localHilbertSymbolHom K n hnK hmu b a = 1 ↔ _ + rw [← MonoidHom.mem_ker, localHilbertSymbolHom_ker K n hnK hmu b] + +/-- The local Hilbert-symbol character induced on the corresponding norm +quotient is injective. -/ +theorem localHilbertSymbolFromNormQuotient_injective + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (b : Kˣ) : + Function.Injective + (localHilbertSymbolFromNormQuotient K n hnK hmu b) := by + apply + (localHilbertSymbolFromNormQuotient K n hnK hmu b).ker_eq_bot_iff.mp + ext q + refine NormQuotient.inductionOn + (motive := fun q => + q ∈ (localHilbertSymbolFromNormQuotient K n hnK hmu b).ker ↔ + q ∈ (⊥ : Subgroup + (NormQuotient K (chosenSimpleKummerExtension K n hnK b)))) + q ?_ + intro a + rw [MonoidHom.mem_ker, Subgroup.mem_bot, + localHilbertSymbolFromNormQuotient_normClass, + localHilbertSymbol_eq_one_iff_mem_localNormSubgroup, + normClass_eq_one_iff_mem] + +end Kummer +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MathlibHilbertPairing.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MathlibHilbertPairing.lean new file mode 100644 index 0000000000..6d97183a12 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MathlibHilbertPairing.lean @@ -0,0 +1,409 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.CanonicalKummerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairingNondegeneracy +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteDualSeparation +public import Mathlib.RingTheory.RootsOfUnity.PrimitiveRoots +/-! +# Mathlib-facing local Hilbert pairing + +The existing local Artin construction is transported to the public +power-class group and root-of-unity subgroup. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +variable (K : Type) [Field K] +variable [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The local norm-residue Hilbert symbol, expressed in Mathlib's +`rootsOfUnity` rather than the internal subgroup of units. -/ +noncomputable def localHilbertSymbol + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b : Kˣ) : + rootsOfUnity (n : ℕ) K := + (KummerTheory.nthRootsSubgroupEquivRootsOfUnity K (n : ℕ)) + (LocalClassFieldTheory.Kummer.localHilbertSymbol K n hnK hmu a b) + +/-- The descended local pairing, transported to Mathlib's +`PowerClassGroup` and `rootsOfUnity`. -/ +noncomputable def localHilbertPairing + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + HilbertPairing K n := + ((MonoidHom.compHom (M := PowerClassGroup K n) + (N := KummerTheory.nthRootsSubgroup K (n : ℕ)) + (P := rootsOfUnity (n : ℕ) K)) + (KummerTheory.nthRootsSubgroupEquivRootsOfUnity K (n : ℕ)).toMonoidHom).comp + (LocalClassFieldTheory.Kummer.localHilbertPairing K n hnK hmu) + +/-- The public pairing evaluates to the public Hilbert symbol on +representatives. -/ +theorem localHilbertPairing_powerClass + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b : Kˣ) : + localHilbertPairing K n hnK hmu (powerClass K n a) (powerClass K n b) = + localHilbertSymbol K n hnK hmu a b := by + let e := KummerTheory.nthRootsSubgroupEquivRootsOfUnity K (n : ℕ) + change + e (LocalClassFieldTheory.Kummer.localHilbertPairing K n hnK hmu + (QuotientGroup.mk' + (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range a) + (QuotientGroup.mk' + (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range b)) = + e (LocalClassFieldTheory.Kummer.localHilbertSymbol K n hnK hmu a b) + exact congrArg e + (LocalClassFieldTheory.Kummer.localHilbertPairing_apply + K n hnK hmu a b) + +/-- The local Hilbert symbol is multiplicative in its first variable. -/ +theorem localHilbertSymbol_mul_left + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b c : Kˣ) : + localHilbertSymbol K n hnK hmu (a * b) c = + localHilbertSymbol K n hnK hmu a c * + localHilbertSymbol K n hnK hmu b c := by + let e := KummerTheory.nthRootsSubgroupEquivRootsOfUnity K (n : ℕ) + let h := LocalClassFieldTheory.Kummer.localHilbertSymbolHom K n hnK hmu c + change e (h (a * b)) = e (h a) * e (h b) + calc + e (h (a * b)) = e (h a * h b) := congrArg e (map_mul h a b) + _ = e (h a) * e (h b) := map_mul e (h a) (h b) + +/-- The local Hilbert symbol is multiplicative in its second variable. -/ +theorem localHilbertSymbol_mul_right + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b c : Kˣ) : + localHilbertSymbol K n hnK hmu a (b * c) = + localHilbertSymbol K n hnK hmu a b * + localHilbertSymbol K n hnK hmu a c := by + let e := KummerTheory.nthRootsSubgroupEquivRootsOfUnity K (n : ℕ) + change + e (LocalClassFieldTheory.Kummer.localHilbertSymbol K n hnK hmu a (b * c)) = + e (LocalClassFieldTheory.Kummer.localHilbertSymbol K n hnK hmu a b) * + e (LocalClassFieldTheory.Kummer.localHilbertSymbol K n hnK hmu a c) + calc + e (LocalClassFieldTheory.Kummer.localHilbertSymbol K n hnK hmu a (b * c)) = + e (LocalClassFieldTheory.Kummer.localHilbertSymbol K n hnK hmu a b * + LocalClassFieldTheory.Kummer.localHilbertSymbol K n hnK hmu a c) := + congrArg e + (LocalClassFieldTheory.Kummer.localHilbertSymbol_mul_right + K n hnK hmu a b c) + _ = e (LocalClassFieldTheory.Kummer.localHilbertSymbol K n hnK hmu a b) * + e (LocalClassFieldTheory.Kummer.localHilbertSymbol K n hnK hmu a c) := + map_mul e _ _ + +/-- The local Hilbert symbol satisfies the Steinberg relation +`(a, 1 - a) = 1`. -/ +theorem localHilbertSymbol_steinberg + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a : Kˣ) (h_one_sub : 1 - (a : K) ≠ 0) : + localHilbertSymbol K n hnK hmu a + (Units.mk0 (1 - (a : K)) h_one_sub) = 1 := by + let e := KummerTheory.nthRootsSubgroupEquivRootsOfUnity K (n : ℕ) + change + e (LocalClassFieldTheory.Kummer.localHilbertSymbol K n hnK hmu a + (Units.mk0 (1 - (a : K)) h_one_sub)) = 1 + calc + e (LocalClassFieldTheory.Kummer.localHilbertSymbol K n hnK hmu a + (Units.mk0 (1 - (a : K)) h_one_sub)) = e 1 := + congrArg e + (LocalClassFieldTheory.Kummer.localHilbertSymbol_steinberg + K n hnK hmu a h_one_sub) + _ = 1 := map_one e + +/-- The local Hilbert symbol is skew-symmetric. -/ +theorem localHilbertSymbol_skew + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b : Kˣ) : + localHilbertSymbol K n hnK hmu a b = + (localHilbertSymbol K n hnK hmu b a)⁻¹ := by + let e := KummerTheory.nthRootsSubgroupEquivRootsOfUnity K (n : ℕ) + change + e (LocalClassFieldTheory.Kummer.localHilbertSymbol K n hnK hmu a b) = + (e (LocalClassFieldTheory.Kummer.localHilbertSymbol K n hnK hmu b a))⁻¹ + calc + e (LocalClassFieldTheory.Kummer.localHilbertSymbol K n hnK hmu a b) = + e ((LocalClassFieldTheory.Kummer.localHilbertSymbol + K n hnK hmu b a)⁻¹) := + congrArg e + (LocalClassFieldTheory.Kummer.localHilbertSymbol_skew + K n hnK hmu a b) + _ = (e (LocalClassFieldTheory.Kummer.localHilbertSymbol + K n hnK hmu b a))⁻¹ := map_inv e _ + +/-- The common left kernel of the local Hilbert symbol is the subgroup of +`n`-th powers. -/ +theorem localHilbertSymbol_left_kernel + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a : Kˣ) : + (∀ b : Kˣ, localHilbertSymbol K n hnK hmu a b = 1) ↔ + a ∈ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range := by + let e := KummerTheory.nthRootsSubgroupEquivRootsOfUnity K (n : ℕ) + constructor + · intro h + apply (LocalClassFieldTheory.Kummer.localHilbertSymbol_left_kernel + K n hnK hmu a).1 + intro b + apply e.injective + calc + e (LocalClassFieldTheory.Kummer.localHilbertSymbol K n hnK hmu a b) = + localHilbertSymbol K n hnK hmu a b := rfl + _ = 1 := h b + _ = e 1 := (map_one e).symm + · intro ha b + have hInternal := + (LocalClassFieldTheory.Kummer.localHilbertSymbol_left_kernel + K n hnK hmu a).2 ha b + calc + localHilbertSymbol K n hnK hmu a b = + e (LocalClassFieldTheory.Kummer.localHilbertSymbol + K n hnK hmu a b) := rfl + _ = e 1 := congrArg e hInternal + _ = 1 := map_one e + +/-- The common right kernel of the local Hilbert symbol is the subgroup of +`n`-th powers. -/ +theorem localHilbertSymbol_right_kernel + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (b : Kˣ) : + (∀ a : Kˣ, localHilbertSymbol K n hnK hmu a b = 1) ↔ + b ∈ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range := by + let e := KummerTheory.nthRootsSubgroupEquivRootsOfUnity K (n : ℕ) + constructor + · intro h + apply (LocalClassFieldTheory.Kummer.localHilbertSymbol_right_kernel + K n hnK hmu b).1 + intro a + apply e.injective + calc + e (LocalClassFieldTheory.Kummer.localHilbertSymbol K n hnK hmu a b) = + localHilbertSymbol K n hnK hmu a b := rfl + _ = 1 := h a + _ = e 1 := (map_one e).symm + · intro hb a + have hInternal := + (LocalClassFieldTheory.Kummer.localHilbertSymbol_right_kernel + K n hnK hmu b).2 hb a + calc + localHilbertSymbol K n hnK hmu a b = + e (LocalClassFieldTheory.Kummer.localHilbertSymbol + K n hnK hmu a b) := rfl + _ = e 1 := congrArg e hInternal + _ = 1 := map_one e + +/-- The local Hilbert pairing separates power classes in both variables. -/ +theorem localHilbertPairing_nondegenerate + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + (∀ a : PowerClassGroup K n, + (∀ b : PowerClassGroup K n, + localHilbertPairing K n hnK hmu a b = 1) → a = 1) ∧ + (∀ b : PowerClassGroup K n, + (∀ a : PowerClassGroup K n, + localHilbertPairing K n hnK hmu a b = 1) → b = 1) := by + let e := KummerTheory.nthRootsSubgroupEquivRootsOfUnity K (n : ℕ) + let B := LocalClassFieldTheory.Kummer.localHilbertPairing K n hnK hmu + have hB := LocalClassFieldTheory.Kummer.localHilbertPairing_nondegenerate + K n hnK hmu + constructor + · intro a ha + apply hB.1 a + intro b + apply e.injective + calc + e (B a b) = localHilbertPairing K n hnK hmu a b := rfl + _ = 1 := ha b + _ = e 1 := (map_one e).symm + · intro b hb + apply hB.2 b + intro a + apply e.injective + calc + e (B a b) = localHilbertPairing K n hnK hmu a b := rfl + _ = 1 := hb a + _ = e 1 := (map_one e).symm + +/-- A local Hilbert symbol vanishes exactly when its second argument is a +norm from the canonical, possibly reducible Kummer algebra of the first. -/ +theorem localHilbertSymbol_eq_one_iff_isKummerNorm + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b : Kˣ) : + localHilbertSymbol K n hnK hmu a b = 1 ↔ IsKummerNorm K n a b := by + let E := KummerTheory.chosenSimpleKummerExtension K n hnK a + let e := KummerTheory.nthRootsSubgroupEquivRootsOfUnity K (n : ℕ) + have hmap : localHilbertSymbol K n hnK hmu a b = 1 ↔ + LocalClassFieldTheory.Kummer.localHilbertSymbol K n hnK hmu a b = 1 := by + change e (LocalClassFieldTheory.Kummer.localHilbertSymbol + K n hnK hmu a b) = 1 ↔ _ + rw [← map_one e, e.injective.eq_iff] + have hskew : LocalClassFieldTheory.Kummer.localHilbertSymbol + K n hnK hmu a b = 1 ↔ + LocalClassFieldTheory.Kummer.localHilbertSymbol K n hnK hmu b a = 1 := by + rw [LocalClassFieldTheory.Kummer.localHilbertSymbol_skew K n hnK hmu a b] + simp only [inv_eq_one] + have hnorm : b ∈ LocalFieldTheory.localNormSubgroup K E ↔ + ∃ z : Eˣ, Algebra.norm K (z : E) = (b : K) := by + change (∃ z : Eˣ, LocalFieldTheory.normUnits K E z = b) ↔ _ + constructor + · rintro ⟨z, hz⟩ + refine ⟨z, ?_⟩ + exact congrArg (fun u : Kˣ => (u : K)) hz + · rintro ⟨z, hz⟩ + refine ⟨z, ?_⟩ + apply Units.ext + exact hz + calc + localHilbertSymbol K n hnK hmu a b = 1 ↔ + LocalClassFieldTheory.Kummer.localHilbertSymbol K n hnK hmu a b = 1 := + hmap + _ ↔ LocalClassFieldTheory.Kummer.localHilbertSymbol K n hnK hmu b a = 1 := + hskew + _ ↔ b ∈ LocalFieldTheory.localNormSubgroup K E := + LocalClassFieldTheory.Kummer.localHilbertSymbol_eq_one_iff_mem_localNormSubgroup + K n hnK hmu b a + _ ↔ (∃ z : Eˣ, Algebra.norm K (z : E) = (b : K)) := hnorm + _ ↔ IsKummerNorm K n a b := + (LocalClassFieldTheory.Kummer.adjoinRoot_norm_iff_chosenSimpleKummerNorm + K n hnK hmu a b).symm + +/-- The Mathlib-facing local Hilbert pairing obeys all local algebraic laws, +including the canonical Kummer norm-residue criterion. -/ +theorem localHilbertPairing_isLocalHilbertPairing + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + HilbertPairing.IsLocalHilbertPairing + (localHilbertPairing K n hnK hmu) := by + refine ⟨?_, ?_, ?_, ?_⟩ + · intro a ha + change localHilbertPairing K n hnK hmu (powerClass K n a) + (powerClass K n (Units.mk0 (1 - (a : K)) ha)) = 1 + rw [localHilbertPairing_powerClass] + exact localHilbertSymbol_steinberg K n hnK hmu a ha + · intro x y + refine QuotientGroup.induction_on x ?_ + intro a + refine QuotientGroup.induction_on y ?_ + intro b + change localHilbertPairing K n hnK hmu + (powerClass K n a) (powerClass K n b) = + (localHilbertPairing K n hnK hmu + (powerClass K n b) (powerClass K n a))⁻¹ + rw [localHilbertPairing_powerClass, localHilbertPairing_powerClass] + exact localHilbertSymbol_skew K n hnK hmu a b + · exact localHilbertPairing_nondegenerate K n hnK hmu + · intro a b + change localHilbertPairing K n hnK hmu (powerClass K n a) + (powerClass K n b) = 1 ↔ IsKummerNorm K n a b + rw [localHilbertPairing_powerClass] + exact localHilbertSymbol_eq_one_iff_isKummerNorm K n hnK hmu a b + +end ClassFieldTheory + +namespace ClassFieldTheory + +/-- After mapping the public Hilbert value into the simple Kummer extension, +it is the quotient of the Artin image of the chosen root by that root. +The left pairing argument is the input to the canonical local Artin map. -/ +theorem localHilbertPairing_artin_rootQuotient + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a b : Kˣ) : + let E := KummerTheory.chosenSimpleKummerExtension K n hnK a + Units.map (algebraMap K E).toMonoidHom + (localHilbertPairing K n hnK hmu + (powerClass K n b) (powerClass K n a)).1 = + KummerTheory.rootQuotient + (K := K) (L := E) + (KummerTheory.chosenSimpleKummerRootUnit K n hnK a) + (LocalClassFieldTheory.Kummer.chosenSimpleKummerNormResidueAutomorphism + K n hnK hmu a b) := by + dsimp only + rw [localHilbertPairing_powerClass] + have h := congrArg Subtype.val + (LocalClassFieldTheory.Kummer.localHilbertSymbol_map_eq_rootQuotient + K n hnK hmu b a) + change + Units.map + (algebraMap K (KummerTheory.chosenSimpleKummerExtension K n hnK a)).toMonoidHom + (LocalClassFieldTheory.Kummer.localHilbertSymbol K n hnK hmu b a).1 = + KummerTheory.rootQuotient + (K := K) (L := KummerTheory.chosenSimpleKummerExtension K n hnK a) + (KummerTheory.chosenSimpleKummerRootUnit K n hnK a) + (LocalClassFieldTheory.Kummer.chosenSimpleKummerNormResidueAutomorphism + K n hnK hmu a b) at h + exact h + +/-- The public Type 0 Hilbert value agrees with the Artin root quotient for +any root of `a` in the chosen simple Kummer extension, not only the root +used to construct that extension. The pairing remains Artin-first. -/ +theorem localHilbertPairing_artin_rootQuotient_of_same_pow + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a b : Kˣ) + (u : (KummerTheory.chosenSimpleKummerExtension K n hnK a)ˣ) + (hu : u ^ (n : ℕ) = + Units.map + (algebraMap K (KummerTheory.chosenSimpleKummerExtension K n hnK a)).toMonoidHom + a) : + Units.map + (algebraMap K (KummerTheory.chosenSimpleKummerExtension K n hnK a)).toMonoidHom + (localHilbertPairing K n hnK hmu + (powerClass K n b) (powerClass K n a)).1 = + KummerTheory.rootQuotient + (K := K) (L := KummerTheory.chosenSimpleKummerExtension K n hnK a) + u + (LocalClassFieldTheory.Kummer.chosenSimpleKummerNormResidueAutomorphism + K n hnK hmu a b) := by + let E := KummerTheory.chosenSimpleKummerExtension K n hnK a + let beta : Eˣ := KummerTheory.chosenSimpleKummerRootUnit K n hnK a + let sigma : E ≃ₐ[K] E := + LocalClassFieldTheory.Kummer.chosenSimpleKummerNormResidueAutomorphism + K n hnK hmu a b + have hbeta : beta ^ (n : ℕ) = Units.map (algebraMap K E).toMonoidHom a := + KummerTheory.chosenSimpleKummerRootUnit_pow K n hnK a + change u ^ (n : ℕ) = Units.map (algebraMap K E).toMonoidHom a at hu + have hpow : (u / beta) ^ (n : ℕ) = 1 := + KummerTheory.div_pow_eq_one_of_pow_eq_pow (hu.trans hbeta.symm) + obtain ⟨zeta, hzeta⟩ := + (KummerTheory.nthRootsOfUnityInBase_of_primitiveRoots + (K := K) (L := E) n hmu) (u / beta) hpow + have hquot : KummerTheory.rootQuotient (K := K) (L := E) + (u / beta) sigma = 1 := by + rw [← hzeta] + exact KummerTheory.rootQuotient_algebraMap_unit zeta sigma + have hroot : KummerTheory.rootQuotient (K := K) (L := E) u sigma = + KummerTheory.rootQuotient (K := K) (L := E) beta sigma := + div_eq_one.mp + ((KummerTheory.rootQuotient_changeRoot (K := K) (L := E) + u beta sigma).trans hquot) + have hchosen : + Units.map (algebraMap K E).toMonoidHom + (localHilbertPairing K n hnK hmu + (powerClass K n b) (powerClass K n a)).1 = + KummerTheory.rootQuotient (K := K) (L := E) beta sigma := by + simpa only [E, beta, sigma] using + (localHilbertPairing_artin_rootQuotient K n hnK hmu a b) + exact hchosen.trans hroot.symm + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MaximalLocalKummerPairing.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MaximalLocalKummerPairing.lean new file mode 100644 index 0000000000..317879d4f0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MaximalLocalKummerPairing.lean @@ -0,0 +1,162 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol +/-! +# The maximal local Kummer pairing + +The maximal exponent-`n` Kummer extension of a nonarchimedean local field is +finite. Evaluating its Kummer pairing at the local Artin automorphism therefore +gives a multiplicative character in the radical variable. This file packages +that evaluation as a right-variable monoid homomorphism. Its comparison with +the simple-extension definition of the local Hilbert symbol remains separate. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory +namespace Kummer + +open KummerTheory LocalFieldTheory RamificationTheory + +variable (K : Type) [Field K] +variable [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The extension obtained by adjoining all exponent-`n` Kummer radicals of +the local field. -/ +abbrev maximalLocalKummerExtension (n : ℕ+) := + kummerRadicalExtension + (K := K) (Omega := SeparableClosure K) n + (maximalKummerSubgroup K n).1 + +/-- The local Artin homomorphism valued in the maximal exponent-`n` Kummer +extension. -/ +noncomputable def maximalLocalKummerNormResidueAutomorphism + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + Kˣ →* Gal((maximalLocalKummerExtension K n)/K) := by + let Delta := maximalKummerSubgroup K n + let E := maximalLocalKummerExtension K n + letI : FiniteDimensional K E := + maximalKummerRadicalExtension_finiteDimensional K n hnK hmu + letI : IsAbelianGalois K E := + kummerRadicalExtension_isAbelianGalois + (K := K) (Omega := SeparableClosure K) n hmu Delta.1 + exact abelianLocalArtinMonoidHom K E + +/-- The local Artin action evaluated against Kummer characters, before descending roots of unity +from the maximal Kummer extension to the base field. -/ +noncomputable def maximalLocalKummerPairingSource + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a : Kˣ) : + Kˣ →* nthRootsSubgroup (maximalLocalKummerExtension K n) (n : ℕ) := by + let Delta := maximalKummerSubgroup K n + let E := maximalLocalKummerExtension K n + let hDelta : Delta.1 ≤ + finiteKummerRadicalSubgroup (K := K) (L := E) n := + le_finiteKummerRadicalSubgroup_kummerRadicalExtension n hnK Delta.1 + let incl : Kˣ →* Delta.1 := + { toFun := fun b => ⟨b, by simp [Delta, maximalKummerSubgroup]⟩ + map_one' := rfl + map_mul' := fun _ _ => rfl } + let sigma : Gal(E/K) := + maximalLocalKummerNormResidueAutomorphism K n hnK hmu a + let evaluate : (Gal(E/K) →* nthRootsSubgroup E (n : ℕ)) →* + nthRootsSubgroup E (n : ℕ) := + { toFun := fun chi => chi sigma + map_one' := rfl + map_mul' := fun _ _ => rfl } + exact evaluate.comp + ((restrictedSubgroupKummerCharacter n hmu Delta hDelta).comp incl) + +/-- The maximal finite Kummer pairing, evaluated at the local Artin +automorphism of `a`, is multiplicative in its radical variable. -/ +noncomputable def maximalLocalKummerPairingRightHom + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a : Kˣ) : + Kˣ →* nthRootsSubgroup K (n : ℕ) := + (nthRootsSubgroupEquivOfPrimitiveRoots + K (maximalLocalKummerExtension K n) n hmu).symm.toMonoidHom.comp + (maximalLocalKummerPairingSource K n hnK hmu a) + +@[simp] +theorem maximalLocalKummerPairingRightHom_apply + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b : Kˣ) : + maximalLocalKummerPairingRightHom K n hnK hmu a b = + (nthRootsSubgroupEquivOfPrimitiveRoots + K (maximalLocalKummerExtension K n) n hmu).symm + (maximalLocalKummerPairingSource K n hnK hmu a b) := + rfl + +/-- Mapping the maximal pairing into its defining extension identifies its +value with the root quotient of any radical having the prescribed power. -/ +theorem maximalLocalKummerPairingRightHom_map_eq_rootQuotient_of_pow + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b : Kˣ) + (beta : (maximalLocalKummerExtension K n)ˣ) + (hbeta : beta ^ (n : ℕ) = + Units.map + (algebraMap K (maximalLocalKummerExtension K n)).toMonoidHom b) : + nthRootsSubgroupMap K (maximalLocalKummerExtension K n) (n : ℕ) + (maximalLocalKummerPairingRightHom K n hnK hmu a b) = + ⟨rootQuotient + (K := K) (L := maximalLocalKummerExtension K n) beta + (maximalLocalKummerNormResidueAutomorphism K n hnK hmu a), + by + apply rootQuotient_mem_nthRootsSubgroup_of_pow_fixed + intro tau + rw [hbeta] + exact RadicalDatum.smul_algebraMap_unit + (K := K) (L := maximalLocalKummerExtension K n) tau b⟩ := by + let Delta := maximalKummerSubgroup K n + let E := maximalLocalKummerExtension K n + let hDelta : Delta.1 ≤ + finiteKummerRadicalSubgroup (K := K) (L := E) n := + le_finiteKummerRadicalSubgroup_kummerRadicalExtension n hnK Delta.1 + let incl : Kˣ →* Delta.1 := + { toFun := fun c => ⟨c, by simp [Delta, maximalKummerSubgroup]⟩ + map_one' := rfl + map_mul' := fun _ _ => rfl } + let sigma : Gal(E/K) := + maximalLocalKummerNormResidueAutomorphism K n hnK hmu a + let D := chosenFiniteKummerRadicalDatum (K := K) (L := E) n + let delta : D.carrier := + restrictedRadicalInclusion n Delta hDelta (incl b) + let hfixed := + restrictedKummerFixed (K := K) (L := E) n hmu + have hbeta' : + beta ^ (n : ℕ) = + Units.map (algebraMap K E).toMonoidHom delta.1 := by + change beta ^ (n : ℕ) = + Units.map (algebraMap K E).toMonoidHom b + exact hbeta + change + (nthRootsSubgroupEquivOfPrimitiveRoots K E n hmu) + ((nthRootsSubgroupEquivOfPrimitiveRoots K E n hmu).symm + (maximalLocalKummerPairingSource K n hnK hmu a b)) = _ + rw [(nthRootsSubgroupEquivOfPrimitiveRoots K E n hmu).apply_symm_apply] + apply Subtype.ext + change D.rootCharacter delta hfixed sigma = + rootQuotient (K := K) (L := E) beta sigma + exact (D.rootCharacter_eq_of_same_pow hfixed delta hbeta' sigma).symm + +theorem maximalLocalKummerPairing_mul_right + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b c : Kˣ) : + maximalLocalKummerPairingRightHom K n hnK hmu a (b * c) = + maximalLocalKummerPairingRightHom K n hnK hmu a b * + maximalLocalKummerPairingRightHom K n hnK hmu a c := + map_mul (maximalLocalKummerPairingRightHom K n hnK hmu a) b c + +end Kummer +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/PowerResidueTameFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/PowerResidueTameFormula.lean new file mode 100644 index 0000000000..510bdd73ed --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/PowerResidueTameFormula.lean @@ -0,0 +1,1036 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.FiniteField +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteDualSeparation +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalUnitKummerUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +/-! +# Tame local power-residue formula + +This file constructs reduction of local roots of unity, proves its injectivity, +identifies the arithmetic-Frobenius root quotient with the finite-field power +residue symbol, and derives the tame formula for the local Hilbert symbol. +-/ + +@[expose] public section + +open scoped ValuativeRel + +noncomputable +section + +namespace LocalClassFieldTheory +namespace Kummer + +open KummerTheory +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +open scoped Classical in +/-- Every field-valued `n`-th root of unity has normalized valuation zero. -/ +theorem nthRootsSubgroup_valuationMap_eq_zero + (n : ℕ+) (z : nthRootsSubgroup K (n : ℕ)) : + valuationMap K (Additive.ofMul z.1) = 0 := by + have hpow := valuationMap_ofMul_pow K z.1 (n : ℕ) + have hzero : + ((n : ℕ) : ℤ) * valuationMap K (Additive.ofMul z.1) = 0 := by + rw [z.2, valuationMap_ofMul_one] at hpow + exact hpow.symm + exact (mul_eq_zero.mp hzero).resolve_left (by exact_mod_cast n.ne_zero) + +open scoped Classical in +/-- The canonical valuation-ring unit underlying a local `n`-th root of +unity. -/ +noncomputable def nthRootIntegerUnit + (n : ℕ+) (z : nthRootsSubgroup K (n : ℕ)) : 𝒪[K]ˣ := + integerUnitOfValuationMapZero K z.1 + (nthRootsSubgroup_valuationMap_eq_zero K n z) + +open scoped Classical in +@[simp] +theorem integerUnitsToFieldUnits_nthRootIntegerUnit + (n : ℕ+) (z : nthRootsSubgroup K (n : ℕ)) : + integerUnitsToFieldUnits K (nthRootIntegerUnit K n z) = z.1 := + integerUnitOfValuationMapZero_spec K z.1 + (nthRootsSubgroup_valuationMap_eq_zero K n z) + +open scoped Classical in +theorem nthRootIntegerUnit_pow + (n : ℕ+) (z : nthRootsSubgroup K (n : ℕ)) : + nthRootIntegerUnit K n z ^ (n : ℕ) = 1 := by + apply integerUnitsToFieldUnits_injective K + rw [map_pow, integerUnitsToFieldUnits_nthRootIntegerUnit, z.2, map_one] + +open scoped Classical in +/-- Reduction of roots of unity from a nonarchimedean local field to its +residue field. -/ +noncomputable def localNthRootsReduction + (n : ℕ+) : + nthRootsSubgroup K (n : ℕ) →* rootsOfUnity (n : ℕ) 𝓀[K] where + toFun z := + ⟨integerUnitsToResidueUnits K (nthRootIntegerUnit K n z), by + change + integerUnitsToResidueUnits K (nthRootIntegerUnit K n z) ^ + (n : ℕ) = 1 + rw [← map_pow, nthRootIntegerUnit_pow, map_one]⟩ + map_one' := by + apply Subtype.ext + apply Units.ext + rfl + map_mul' := by + intro z w + apply Subtype.ext + apply Units.ext + rfl + +open scoped Classical in +@[simp] +theorem localNthRootsReduction_apply + (n : ℕ+) (z : nthRootsSubgroup K (n : ℕ)) : + (localNthRootsReduction K n z).1 = + integerUnitsToResidueUnits K (nthRootIntegerUnit K n z) := + rfl + +open scoped Classical in +/-- Reduction of roots of unity commutes with extension of valued fields. -/ +theorem localNthRootsReduction_nthRootsSubgroupMap + (L : Type) [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (n : ℕ+) (z : nthRootsSubgroup K (n : ℕ)) : + localNthRootsReduction L n + (nthRootsSubgroupMap K L (n : ℕ) z) = + ⟨residueUnitsMapOfValuationExtension K L + (localNthRootsReduction K n z).1, + by + change + residueUnitsMapOfValuationExtension K L + (localNthRootsReduction K n z).1 ^ (n : ℕ) = 1 + rw [← map_pow, (localNthRootsReduction K n z).2, map_one]⟩ := by + apply Subtype.ext + change + integerUnitsToResidueUnits L + (nthRootIntegerUnit L n + (nthRootsSubgroupMap K L (n : ℕ) z)) = + residueUnitsMapOfValuationExtension K L + (integerUnitsToResidueUnits K (nthRootIntegerUnit K n z)) + rw [residueUnitsMap_integerUnitsToResidueUnits] + congr 1 + apply Units.ext + apply Subtype.ext + rfl + +omit [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +open scoped Classical in +/-- An `n`-th root of the image of a valuation-ring unit again has normalized +valuation zero. -/ +theorem valuationMap_eq_zero_of_pow_eq_map_integerUnit + (L : Type) [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (n : ℕ+) (u : 𝒪[K]ˣ) (beta : Lˣ) + (hbetaPow : + beta ^ (n : ℕ) = + Units.map (algebraMap K L).toMonoidHom + (integerUnitsToFieldUnits K u)) : + valuationMap L (Additive.ofMul beta) = 0 := by + have hfieldUnits : + Units.map (algebraMap K L).toMonoidHom + (integerUnitsToFieldUnits K u) = + integerUnitsToFieldUnits L + (integerUnitsMapOfValuationExtension K L u) := by + apply Units.ext + rfl + have hbaseValuationMap : + valuationMap L + (Additive.ofMul + (Units.map (algebraMap K L).toMonoidHom + (integerUnitsToFieldUnits K u))) = 0 := by + rw [hfieldUnits, valuationMap_apply, v_integerUnitsToFieldUnits] + have hpow := valuationMap_ofMul_pow L beta (n : ℕ) + rw [hbetaPow, hbaseValuationMap] at hpow + exact (mul_eq_zero.mp hpow.symm).resolve_left (by + exact_mod_cast n.ne_zero) + +omit [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +open scoped Classical in +/-- The canonical valuation-ring lift of such a root has the prescribed +`n`-th power. -/ +theorem integerUnitOfValuationMapZero_pow_eq_integerUnitsMap + (L : Type) [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (n : ℕ+) (u : 𝒪[K]ˣ) (beta : Lˣ) + (hbetaPow : + beta ^ (n : ℕ) = + Units.map (algebraMap K L).toMonoidHom + (integerUnitsToFieldUnits K u)) : + integerUnitOfValuationMapZero L beta + (valuationMap_eq_zero_of_pow_eq_map_integerUnit + K L n u beta hbetaPow) ^ (n : ℕ) = + integerUnitsMapOfValuationExtension K L u := by + apply integerUnitsToFieldUnits_injective L + calc + integerUnitsToFieldUnits L + (integerUnitOfValuationMapZero L beta + (valuationMap_eq_zero_of_pow_eq_map_integerUnit + K L n u beta hbetaPow) ^ (n : ℕ)) = + beta ^ (n : ℕ) := by + rw [map_pow, integerUnitOfValuationMapZero_spec] + _ = Units.map (algebraMap K L).toMonoidHom + (integerUnitsToFieldUnits K u) := hbetaPow + _ = integerUnitsToFieldUnits L + (integerUnitsMapOfValuationExtension K L u) := by + apply Units.ext + rfl + +open scoped Classical in +/-- Arithmetic Frobenius divided by the original integer unit reduces to its +`q - 1` power, where `q` is the base residue-field cardinality. -/ +theorem residue_arithmeticFrobenius_integerUnitQuotient + (L : Type) [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [IsUnramifiedValuedExtension K L] + (u : 𝒪[L]ˣ) : + residueUnitsConcreteEquiv L + (integerUnitsToResidueUnits L + (Units.mapEquiv + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L + (arithmeticFrobeniusOfUnramifiedValuation K L)).toMulEquiv + u / u)) = + (residueUnitsConcreteEquiv L (integerUnitsToResidueUnits L u)) ^ + (Nat.card 𝓀[K] - 1) := by + let : Fintype 𝓀[K] := Fintype.ofFinite _ + let phi : Gal(L/K) := + arithmeticFrobeniusOfUnramifiedValuation K L + let uBar : 𝓀[L]ˣ := + residueUnitsConcreteEquiv L (integerUnitsToResidueUnits L u) + let uFrobenius : 𝒪[L]ˣ := + Units.mapEquiv + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L phi).toMulEquiv u + have hFrobeniusResidue : + residueUnitsConcreteEquiv L + (integerUnitsToResidueUnits L uFrobenius) = + uBar ^ Nat.card 𝓀[K] := by + calc + residueUnitsConcreteEquiv L + (integerUnitsToResidueUnits L uFrobenius) = + Units.mapEquiv + (galoisGroupResidueFieldEquivOfIsIntegralClosure K L phi).toMulEquiv + uBar := by + apply Units.ext + have hval := congrArg Units.val + (galoisGroupResidueFieldEquivOfIsIntegralClosure_integerUnitsToResidueUnits + K L phi u).symm + simpa only [uFrobenius, uBar, residueUnitsConcreteEquiv_apply, + Units.coe_mapEquiv] using hval + _ = uBar ^ Nat.card 𝓀[K] := by + apply Units.ext + change + galoisGroupResidueAlgEquivOfIsIntegralClosure K L phi + (uBar : 𝓀[L]) = + (uBar : 𝓀[L]) ^ Nat.card 𝓀[K] + simpa only [phi] using + galoisGroupResidueAlgEquivOfIsIntegralClosure_arithmeticFrobenius_apply + K L (uBar : 𝓀[L]) + have hcardPos : 0 < Nat.card 𝓀[K] := by + rw [Nat.card_eq_fintype_card] + exact Fintype.card_pos_iff.mpr ⟨0⟩ + change + residueUnitsConcreteEquiv L + (integerUnitsToResidueUnits L (uFrobenius / u)) = + uBar ^ (Nat.card 𝓀[K] - 1) + calc + residueUnitsConcreteEquiv L + (integerUnitsToResidueUnits L (uFrobenius / u)) = + residueUnitsConcreteEquiv L + (integerUnitsToResidueUnits L uFrobenius) / uBar := by + simp only [map_div, uBar] + _ = uBar ^ Nat.card 𝓀[K] / uBar := by + rw [hFrobeniusResidue] + _ = uBar ^ (Nat.card 𝓀[K] - 1) := by + have hcard : + Nat.card 𝓀[K] = (Nat.card 𝓀[K] - 1) + 1 := + (Nat.sub_add_cancel hcardPos).symm + rw [hcard, pow_succ] + simp + +open scoped Classical in +/-- If `n` is a valuation-ring unit, reduction is injective on the local +`n`-th roots of unity. -/ +theorem localNthRootsReduction_injective + (n : ℕ+) + (hn : ValuativeRel.valuation K ((n : ℕ) : K) = 1) : + Function.Injective (localNthRootsReduction K n) := by + intro z w hzw + let zO : 𝒪[K]ˣ := nthRootIntegerUnit K n z + let wO : 𝒪[K]ˣ := nthRootIntegerUnit K n w + have hzPow : zO ^ (n : ℕ) = 1 := by + simpa only [zO] using nthRootIntegerUnit_pow K n z + have hwPow : wO ^ (n : ℕ) = 1 := by + simpa only [wO] using nthRootIntegerUnit_pow K n w + let f : Polynomial 𝒪[K] := Polynomial.X ^ (n : ℕ) - 1 + have hzRoot : f.IsRoot (zO : 𝒪[K]) := by + rw [Polynomial.IsRoot.def] + dsimp only [f] + rw [Polynomial.eval_sub, Polynomial.eval_pow, Polynomial.eval_X, + Polynomial.eval_one] + apply sub_eq_zero.mpr + change (zO : 𝒪[K]) ^ (n : ℕ) = 1 + exact congrArg Units.val hzPow + have hwRoot : f.IsRoot (wO : 𝒪[K]) := by + rw [Polynomial.IsRoot.def] + dsimp only [f] + rw [Polynomial.eval_sub, Polynomial.eval_pow, Polynomial.eval_X, + Polynomial.eval_one] + apply sub_eq_zero.mpr + change (wO : 𝒪[K]) ^ (n : ℕ) = 1 + exact congrArg Units.val hwPow + have hresUnits : + residueUnitsConcreteEquiv K (integerUnitsToResidueUnits K wO) = + residueUnitsConcreteEquiv K (integerUnitsToResidueUnits K zO) := by + change + (localNthRootsReduction K n w).1 = + (localNthRootsReduction K n z).1 + exact congrArg Subtype.val hzw.symm + have hres : + IsLocalRing.residue 𝒪[K] (wO : 𝒪[K]) = + IsLocalRing.residue 𝒪[K] (zO : 𝒪[K]) := by + calc + IsLocalRing.residue 𝒪[K] (wO : 𝒪[K]) = + ((residueUnitsConcreteEquiv K + (integerUnitsToResidueUnits K wO) : 𝓀[K]ˣ) : 𝓀[K]) := + (integerUnitsToResidueUnits_apply K wO).symm + _ = ((residueUnitsConcreteEquiv K + (integerUnitsToResidueUnits K zO) : 𝓀[K]ˣ) : 𝓀[K]) := + congrArg Units.val hresUnits + _ = IsLocalRing.residue 𝒪[K] (zO : 𝒪[K]) := + integerUnitsToResidueUnits_apply K zO + have hnUnit : IsUnit ((n : ℕ) : 𝒪[K]) := by + apply + (Valuation.integer.integers + (ValuativeRel.valuation K)).isUnit_iff_valuation_eq_one.mpr + change ValuativeRel.valuation K ((n : ℕ) : K) = 1 + exact hn + have hzUnit : IsUnit (zO : 𝒪[K]) := zO.isUnit + have hderiv : IsUnit (f.derivative.eval (zO : 𝒪[K])) := by + simpa [f, Polynomial.derivative_sub, Polynomial.derivative_one, + Polynomial.derivative_X_pow, Polynomial.eval_mul] using + hnUnit.mul (hzUnit.pow ((n : ℕ) - 1)) + have hwz : (wO : 𝒪[K]) = (zO : 𝒪[K]) := + eq_of_simple_roots_of_residue_eq hzRoot hwRoot hres hderiv + have hO : zO = wO := by + apply Units.ext + exact hwz.symm + apply Subtype.ext + calc + z.1 = integerUnitsToFieldUnits K zO := by + simpa only [zO] using + (integerUnitsToFieldUnits_nthRootIntegerUnit K n z).symm + _ = integerUnitsToFieldUnits K wO := congrArg _ hO + _ = w.1 := by + simpa only [wO] using + integerUnitsToFieldUnits_nthRootIntegerUnit K n w + +open scoped Classical in +/-- Away from the residue characteristic, reduction identifies the local +and residue-field `n`-th roots of unity. -/ +noncomputable def localNthRootsReductionEquiv + (n : ℕ+) + (hn : ValuativeRel.valuation K ((n : ℕ) : K) = 1) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + nthRootsSubgroup K (n : ℕ) ≃* rootsOfUnity (n : ℕ) 𝓀[K] := by + letI : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + letI : Fintype (rootsOfUnity (n : ℕ) 𝓀[K]) := Fintype.ofFinite _ + have hsource : + Fintype.card (nthRootsSubgroup K (n : ℕ)) = (n : ℕ) := by + obtain ⟨zeta, hzeta⟩ := hmu + have hzetaPrimitive : IsPrimitiveRoot zeta (n : ℕ) := + (mem_primitiveRoots n.pos).1 hzeta + rw [← Nat.card_eq_fintype_card] + calc + Nat.card (nthRootsSubgroup K (n : ℕ)) = + Nat.card (rootsOfUnity (n : ℕ) K) := + Nat.card_congr + (nthRootsSubgroupEquivRootsOfUnity K (n : ℕ)).toEquiv + _ = (n : ℕ) := hzetaPrimitive.card_rootsOfUnity + have htargetLe : + Fintype.card (rootsOfUnity (n : ℕ) 𝓀[K]) ≤ (n : ℕ) := by + rw [← Nat.card_eq_fintype_card] + exact card_rootsOfUnity 𝓀[K] (n : ℕ) + have hsourceLe : + Fintype.card (nthRootsSubgroup K (n : ℕ)) ≤ + Fintype.card (rootsOfUnity (n : ℕ) 𝓀[K]) := + Fintype.card_le_of_injective (localNthRootsReduction K n) + (localNthRootsReduction_injective K n hn) + have htarget : + Fintype.card (rootsOfUnity (n : ℕ) 𝓀[K]) = (n : ℕ) := by + apply Nat.le_antisymm htargetLe + calc + (n : ℕ) = Fintype.card (nthRootsSubgroup K (n : ℕ)) := hsource.symm + _ ≤ Fintype.card (rootsOfUnity (n : ℕ) 𝓀[K]) := hsourceLe + apply MulEquiv.ofBijective (localNthRootsReduction K n) + apply (Fintype.bijective_iff_injective_and_card + (localNthRootsReduction K n)).2 + exact ⟨localNthRootsReduction_injective K n hn, + hsource.trans htarget.symm⟩ + +open scoped Classical in +/-- If `K` contains the `n`-th roots of unity and `n` is a local unit, then +`n` divides the order of the residue-field unit group. -/ +theorem dvd_residueCard_sub_one_of_primitiveRoots + (n : ℕ+) + (hn : ValuativeRel.valuation K ((n : ℕ) : K) = 1) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + (n : ℕ) ∣ Nat.card 𝓀[K] - 1 := by + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + have hroots : + Nat.card (rootsOfUnity (n : ℕ) 𝓀[K]) = (n : ℕ) := by + calc + Nat.card (rootsOfUnity (n : ℕ) 𝓀[K]) = + Nat.card (nthRootsSubgroup K (n : ℕ)) := + Nat.card_congr + (localNthRootsReductionEquiv K n hn hmu).symm.toEquiv + _ = Nat.card (rootsOfUnity (n : ℕ) K) := + Nat.card_congr + (nthRootsSubgroupEquivRootsOfUnity K (n : ℕ)).toEquiv + _ = (n : ℕ) := by + obtain ⟨zeta, hzeta⟩ := hmu + exact ((mem_primitiveRoots n.pos).1 hzeta).card_rootsOfUnity + have hdvd := + Subgroup.card_dvd_of_injective + (rootsOfUnity (n : ℕ) 𝓀[K]).subtype Subtype.val_injective + rw [hroots, Nat.card_units] at hdvd + exact hdvd + +open scoped Classical in +/-- For an `n`-th root of a base integer unit, the residue of its arithmetic +Frobenius quotient is the base residue unit raised to `(q - 1) / n`. -/ +theorem residue_arithmeticFrobenius_kummerRootQuotient + (L : Type) [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [IsUnramifiedValuedExtension K L] + (n : ℕ+) + (hn : ValuativeRel.valuation K ((n : ℕ) : K) = 1) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (u : 𝒪[K]ˣ) (beta : Lˣ) + (hbetaPow : + beta ^ (n : ℕ) = + Units.map (algebraMap K L).toMonoidHom + (integerUnitsToFieldUnits K u)) : + let betaO := + integerUnitOfValuationMapZero L beta + (valuationMap_eq_zero_of_pow_eq_map_integerUnit + K L n u beta hbetaPow) + residueUnitsConcreteEquiv L + (integerUnitsToResidueUnits L + (Units.mapEquiv + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L + (arithmeticFrobeniusOfUnramifiedValuation K L)).toMulEquiv + betaO / betaO)) = + residueUnitsConcreteEquiv L + (residueUnitsMapOfValuationExtension K L + (integerUnitsToResidueUnits K u)) ^ + ((Nat.card 𝓀[K] - 1) / (n : ℕ)) := by + let betaO : 𝒪[L]ˣ := + integerUnitOfValuationMapZero L beta + (valuationMap_eq_zero_of_pow_eq_map_integerUnit + K L n u beta hbetaPow) + let betaBar : 𝓀[L]ˣ := + residueUnitsConcreteEquiv L (integerUnitsToResidueUnits L betaO) + let uBar : 𝓀[L]ˣ := + residueUnitsConcreteEquiv L + (residueUnitsMapOfValuationExtension K L + (integerUnitsToResidueUnits K u)) + have hdvd : (n : ℕ) ∣ Nat.card 𝓀[K] - 1 := + dvd_residueCard_sub_one_of_primitiveRoots K n hn hmu + let m := (Nat.card 𝓀[K] - 1) / (n : ℕ) + have hcard : Nat.card 𝓀[K] - 1 = (n : ℕ) * m := by + exact (Nat.div_mul_cancel hdvd).symm.trans (Nat.mul_comm _ _) + have hbetaOPow : + betaO ^ (n : ℕ) = integerUnitsMapOfValuationExtension K L u := by + simpa only [betaO] using + integerUnitOfValuationMapZero_pow_eq_integerUnitsMap + K L n u beta hbetaPow + have hbetaBarPow : betaBar ^ (n : ℕ) = uBar := by + calc + betaBar ^ (n : ℕ) = + residueUnitsConcreteEquiv L + (integerUnitsToResidueUnits L (betaO ^ (n : ℕ))) := by + rw [map_pow, map_pow] + _ = residueUnitsConcreteEquiv L + (integerUnitsToResidueUnits L + (integerUnitsMapOfValuationExtension K L u)) := by + rw [hbetaOPow] + _ = uBar := by + rw [← residueUnitsMap_integerUnitsToResidueUnits K L u] + change + residueUnitsConcreteEquiv L + (integerUnitsToResidueUnits L + (Units.mapEquiv + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L + (arithmeticFrobeniusOfUnramifiedValuation K L)).toMulEquiv + betaO / betaO)) = uBar ^ m + calc + residueUnitsConcreteEquiv L + (integerUnitsToResidueUnits L + (Units.mapEquiv + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L + (arithmeticFrobeniusOfUnramifiedValuation K L)).toMulEquiv + betaO / betaO)) = + betaBar ^ (Nat.card 𝓀[K] - 1) := by + simpa only [betaBar] using + residue_arithmeticFrobenius_integerUnitQuotient K L betaO + _ = betaBar ^ ((n : ℕ) * m) := by rw [hcard] + _ = (betaBar ^ (n : ℕ)) ^ m := by rw [pow_mul] + _ = uBar ^ m := by rw [hbetaBarPow] + +open scoped Classical in +/-- The finite-field tame power-residue symbol, lifted canonically to the +local `n`-th roots of unity. -/ +noncomputable def localTamePowerResidueSymbol + (n : ℕ+) + (hn : ValuativeRel.valuation K ((n : ℕ) : K) = 1) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (u : 𝒪[K]ˣ) : + nthRootsSubgroup K (n : ℕ) := by + letI : Fintype 𝓀[K] := Fintype.ofFinite _ + exact + (localNthRootsReductionEquiv K n hn hmu).symm + (AlgebraicNumberTheory.PowerResidueSymbols.finiteFieldPowerResidueSymbol + 𝓀[K] n + (by + rw [← Nat.card_eq_fintype_card] + exact dvd_residueCard_sub_one_of_primitiveRoots K n hn hmu) + (integerUnitsToResidueUnits K u)) + +open scoped Classical in +/-- Reduction of the lifted tame symbol is the literal finite-field +power-residue symbol. -/ +theorem localNthRootsReductionEquiv_localTamePowerResidueSymbol + (n : ℕ+) + (hn : ValuativeRel.valuation K ((n : ℕ) : K) = 1) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (u : 𝒪[K]ˣ) : + letI : Fintype 𝓀[K] := Fintype.ofFinite _ + localNthRootsReductionEquiv K n hn hmu + (localTamePowerResidueSymbol K n hn hmu u) = + AlgebraicNumberTheory.PowerResidueSymbols.finiteFieldPowerResidueSymbol + 𝓀[K] n + (by + rw [← Nat.card_eq_fintype_card] + exact dvd_residueCard_sub_one_of_primitiveRoots K n hn hmu) + (integerUnitsToResidueUnits K u) := by + let : Fintype 𝓀[K] := Fintype.ofFinite _ + exact (localNthRootsReductionEquiv K n hn hmu).apply_symm_apply _ + +open scoped Classical in +/-- The tame power-residue symbol embedded in an unramified extension is the +root quotient of an `n`-th root by arithmetic Frobenius. -/ +theorem nthRootsSubgroupMap_localTamePowerResidueSymbol_eq_arithmeticFrobenius_rootQuotient + (L : Type) [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [IsUnramifiedValuedExtension K L] + (n : ℕ+) + (hn : ValuativeRel.valuation K ((n : ℕ) : K) = 1) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (u : 𝒪[K]ˣ) (beta : Lˣ) + (hbetaPow : + beta ^ (n : ℕ) = + Units.map (algebraMap K L).toMonoidHom + (integerUnitsToFieldUnits K u)) : + (nthRootsSubgroupMap K L (n : ℕ) + (localTamePowerResidueSymbol K n hn hmu u)).1 = + rootQuotient (K := K) (L := L) beta + (arithmeticFrobeniusOfUnramifiedValuation K L) := by + let : Fintype 𝓀[K] := Fintype.ofFinite _ + let phi : Gal(L/K) := + arithmeticFrobeniusOfUnramifiedValuation K L + have hbetaPowFixed : + ∀ sigma : Gal(L/K), sigma • (beta ^ (n : ℕ)) = beta ^ (n : ℕ) := by + intro sigma + rw [hbetaPow] + exact RadicalDatum.smul_algebraMap_unit + (K := K) (L := L) sigma (integerUnitsToFieldUnits K u) + let quotientRoot : nthRootsSubgroup L (n : ℕ) := + ⟨rootQuotient (K := K) (L := L) beta phi, by + exact rootQuotient_mem_nthRootsSubgroup_of_pow_fixed + (K := K) (L := L) hbetaPowFixed phi⟩ + have hnL : ValuativeRel.valuation L ((n : ℕ) : L) = 1 := by + have hmap := + (Valuation.HasExtension.val_map_eq_one_iff + (ValuativeRel.valuation K) (ValuativeRel.valuation L) + ((n : ℕ) : K)).2 hn + simpa only [map_natCast] using hmap + let betaO : 𝒪[L]ˣ := + integerUnitOfValuationMapZero L beta + (valuationMap_eq_zero_of_pow_eq_map_integerUnit + K L n u beta hbetaPow) + let betaFrobeniusO : 𝒪[L]ˣ := + Units.mapEquiv + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L phi).toMulEquiv + betaO + let quotientO : 𝒪[L]ˣ := betaFrobeniusO / betaO + have hbetaOField : integerUnitsToFieldUnits L betaO = beta := by + simpa only [betaO] using + integerUnitOfValuationMapZero_spec L beta + (valuationMap_eq_zero_of_pow_eq_map_integerUnit + K L n u beta hbetaPow) + have hbetaFrobeniusOField : + integerUnitsToFieldUnits L betaFrobeniusO = + phi • integerUnitsToFieldUnits L betaO := by + apply Units.ext + rfl + have hquotientOField : + integerUnitsToFieldUnits L quotientO = + rootQuotient (K := K) (L := L) beta phi := by + calc + integerUnitsToFieldUnits L quotientO = + integerUnitsToFieldUnits L betaFrobeniusO / + integerUnitsToFieldUnits L betaO := by + change + integerUnitsToFieldUnits L (betaFrobeniusO / betaO) = + integerUnitsToFieldUnits L betaFrobeniusO / + integerUnitsToFieldUnits L betaO + exact map_div (integerUnitsToFieldUnits L) betaFrobeniusO betaO + _ = phi • integerUnitsToFieldUnits L betaO / + integerUnitsToFieldUnits L betaO := by + rw [hbetaFrobeniusOField] + _ = phi • beta / beta := by rw [hbetaOField] + _ = rootQuotient (K := K) (L := L) beta phi := rfl + have hquotientIntegerUnit : + nthRootIntegerUnit L n quotientRoot = quotientO := by + apply integerUnitsToFieldUnits_injective L + rw [integerUnitsToFieldUnits_nthRootIntegerUnit] + simpa only [quotientRoot] using hquotientOField.symm + have hquotientResidue : + residueUnitsConcreteEquiv L + (integerUnitsToResidueUnits L quotientO) = + residueUnitsMapOfValuationExtension K L + (residueUnitsConcreteEquiv K + (integerUnitsToResidueUnits K u)) ^ + ((Nat.card 𝓀[K] - 1) / (n : ℕ)) := by + change + residueUnitsConcreteEquiv L + (integerUnitsToResidueUnits L quotientO) = + residueUnitsConcreteEquiv L + (residueUnitsMapOfValuationExtension K L + (integerUnitsToResidueUnits K u)) ^ + ((Nat.card 𝓀[K] - 1) / (n : ℕ)) + simpa only [quotientO, betaFrobeniusO, betaO, phi] using + residue_arithmeticFrobenius_kummerRootQuotient + K L n hn hmu u beta hbetaPow + have htameReduction : + localNthRootsReduction K n + (localTamePowerResidueSymbol K n hn hmu u) = + AlgebraicNumberTheory.PowerResidueSymbols.finiteFieldPowerResidueSymbol + 𝓀[K] n + (by + rw [← Nat.card_eq_fintype_card] + exact dvd_residueCard_sub_one_of_primitiveRoots K n hn hmu) + (integerUnitsToResidueUnits K u) := by + change + localNthRootsReductionEquiv K n hn hmu + (localTamePowerResidueSymbol K n hn hmu u) = _ + exact + localNthRootsReductionEquiv_localTamePowerResidueSymbol + K n hn hmu u + have htameReductionValue : + (localNthRootsReduction K n + (localTamePowerResidueSymbol K n hn hmu u)).1 = + residueUnitsConcreteEquiv K + (integerUnitsToResidueUnits K u) ^ + ((Nat.card 𝓀[K] - 1) / (n : ℕ)) := by + have hvalue := congrArg Subtype.val htameReduction + calc + (localNthRootsReduction K n + (localTamePowerResidueSymbol K n hn hmu u)).1 = + residueUnitsConcreteEquiv K + (integerUnitsToResidueUnits K u) ^ + ((Fintype.card 𝓀[K] - 1) / (n : ℕ)) := by + rw [← AlgebraicNumberTheory.PowerResidueSymbols.finiteFieldPowerResidueSymbol_apply] + exact hvalue + _ = residueUnitsConcreteEquiv K + (integerUnitsToResidueUnits K u) ^ + ((Nat.card 𝓀[K] - 1) / (n : ℕ)) := by + rw [Nat.card_eq_fintype_card] + let tameRoot : nthRootsSubgroup L (n : ℕ) := + nthRootsSubgroupMap K L (n : ℕ) + (localTamePowerResidueSymbol K n hn hmu u) + have htameQuotientReduction : + localNthRootsReduction L n tameRoot = + localNthRootsReduction L n quotientRoot := by + rw [show tameRoot = + nthRootsSubgroupMap K L (n : ℕ) + (localTamePowerResidueSymbol K n hn hmu u) from rfl] + rw [localNthRootsReduction_nthRootsSubgroupMap] + apply Subtype.ext + change + residueUnitsMapOfValuationExtension K L + (localNthRootsReduction K n + (localTamePowerResidueSymbol K n hn hmu u)).1 = + integerUnitsToResidueUnits L + (nthRootIntegerUnit L n quotientRoot) + rw [hquotientIntegerUnit, htameReductionValue, map_pow] + simpa only [residueUnitsConcreteEquiv_apply] using + hquotientResidue.symm + have hroot : tameRoot = quotientRoot := + localNthRootsReduction_injective L n hnL htameQuotientReduction + simpa only [tameRoot, quotientRoot, phi] using + congrArg Subtype.val hroot + +omit [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +open scoped Classical in +/-- If `n` is a valuation-ring unit, then its image in the local field is +nonzero. This supplies the characteristic hypothesis required by the chosen +simple Kummer extension without adding a redundant assumption to the tame +formula. -/ +theorem natCast_ne_zero_of_valuation_eq_one + (n : ℕ+) + (hn : ValuativeRel.valuation K ((n : ℕ) : K) = 1) : + ((n : ℕ) : K) ≠ 0 := by + intro hn0 + have hzero : + ValuativeRel.valuation K (0 : K) = 1 := by + simpa only [hn0] using hn + exact zero_ne_one ((ValuativeRel.valuation K).map_zero.symm.trans hzero) + +open scoped Classical in +/-- For a valuation-ring unit `u`, the Hilbert symbol with the chosen inverse +prime element in the first slot is the tame residue symbol of `u`. The proof +constructs the unramified certificate for the chosen simple Kummer extension +from its unit radical and then uses the arithmetic-Frobenius normalization of +the local Artin map. -/ +theorem + localHilbertSymbol_inverseIntegerRingUniformizerFieldUnit_integerUnit_eq_tame + (n : ℕ+) + (hn : ValuativeRel.valuation K ((n : ℕ) : K) = 1) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (u : 𝒪[K]ˣ) : + localHilbertSymbol K n + (natCast_ne_zero_of_valuation_eq_one K n hn) hmu + (inverseIntegerRingUniformizerFieldUnit K) + (integerUnitsToFieldUnits K u) = + localTamePowerResidueSymbol K n hn hmu u := by + let hnK : ((n : ℕ) : K) ≠ 0 := + natCast_ne_zero_of_valuation_eq_one K n hn + let b : Kˣ := integerUnitsToFieldUnits K u + let E := chosenSimpleKummerExtension K n hnK b + let beta : Eˣ := chosenSimpleKummerRootUnit K n hnK b + let : FiniteDimensional K E := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let : IsAbelianGalois K E := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let : NontriviallyNormedField E := + finiteExtensionSpectralNormedField K E + let : ValuativeRel E := + finiteExtensionSpectralValuativeRel K E + let : IsNonarchimedeanLocalField E := + finiteExtensionSpectralIsNonarchimedeanLocalField K E + let : Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation E) := + finiteExtensionSpectralValuation_hasExtension K E + let : Algebra 𝒪[K] E := Algebra.ofSubsemiring 𝒪[K] + let : IsIntegralClosure 𝒪[E] 𝒪[K] E := + localCompleteDVF_integerRing_isIntegralClosure K E + let : Module.Finite 𝒪[K] 𝒪[E] := + localCompleteDVF_integerRing_moduleFinite K E + have hbetaPowUnits : + beta ^ (n : ℕ) = Units.map (algebraMap K E).toMonoidHom b := by + simpa only [E, beta] using + chosenSimpleKummerRootUnit_pow K n hnK b + have hbetaPow : + (beta : E) ^ (n : ℕ) = algebraMap K E (b : K) := by + exact congrArg Units.val hbetaPowUnits + have hbVal : ValuativeRel.valuation K (b : K) = 1 := by + apply valuation_eq_one_of_valuationMap_eq_zero K + rw [valuationMap_apply] + simpa only [b] using v_integerUnitsToFieldUnits K u + have hbetaVal : ValuativeRel.valuation E (beta : E) = 1 := by + apply valuation_eq_one_of_valuationMap_eq_zero E + exact + valuationMap_eq_zero_of_pow_eq_map_integerUnit + K E n u beta (by simpa only [b] using hbetaPowUnits) + have hgenIntermediate : + IntermediateField.adjoin K {(beta : E)} = ⊤ := by + simpa only [E, beta] using + chosenSimpleKummerExtension_adjoin_root_eq_top K n hnK b + have hgen : Algebra.adjoin K {(beta : E)} = ⊤ := by + apply + (IntermediateField.adjoin_simple_eq_top_iff_of_isAlgebraic + (Algebra.IsAlgebraic.isAlgebraic (beta : E))).mp + exact hgenIntermediate + let : IsUnramifiedValuedExtension K E := + isUnramifiedValuedExtension_of_unit_kummer_generator + n (b : K) (beta : E) hbVal hn hbetaVal hbetaPow hgen + let piInv : Kˣ := inverseIntegerRingUniformizerFieldUnit K + have hArtin : + chosenSimpleKummerNormResidueAutomorphism K n hnK hmu b piInv = + arithmeticFrobeniusOfUnramifiedValuation K E := by + change abelianLocalArtinMonoidHom K E piInv = _ + rw [abelianLocalArtinMonoidHom_eq_frobenius_zpow, + valuationMap_apply, v_inverseIntegerRingUniformizerFieldUnit, zpow_one] + have hHilbertVal := congrArg Subtype.val + (localHilbertSymbol_map_eq_rootQuotient K n hnK hmu piInv b) + have hTameVal := + nthRootsSubgroupMap_localTamePowerResidueSymbol_eq_arithmeticFrobenius_rootQuotient + K E n hn hmu u beta (by simpa only [b] using hbetaPowUnits) + change localHilbertSymbol K n hnK hmu piInv b = + localTamePowerResidueSymbol K n hn hmu u + apply nthRootsSubgroupMap_injective K E (n : ℕ) + apply Subtype.ext + calc + (nthRootsSubgroupMap K E (n : ℕ) + (localHilbertSymbol K n hnK hmu piInv b)).1 = + rootQuotient (K := K) (L := E) beta + (chosenSimpleKummerNormResidueAutomorphism + K n hnK hmu b piInv) := by + simpa only [E, beta] using hHilbertVal + _ = rootQuotient (K := K) (L := E) beta + (arithmeticFrobeniusOfUnramifiedValuation K E) := by + rw [hArtin] + _ = (nthRootsSubgroupMap K E (n : ℕ) + (localTamePowerResidueSymbol K n hn hmu u)).1 := hTameVal.symm + +open scoped Classical in +/-- Tame local Hilbert-symbol formula in the unit-first convention. It is the +skew-symmetric form of the preceding arithmetic-Frobenius calculation. -/ +theorem + localHilbertSymbol_integerUnit_inverseIntegerRingUniformizerFieldUnit_eq_tame_inv + (n : ℕ+) + (hn : ValuativeRel.valuation K ((n : ℕ) : K) = 1) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (u : 𝒪[K]ˣ) : + localHilbertSymbol K n + (natCast_ne_zero_of_valuation_eq_one K n hn) hmu + (integerUnitsToFieldUnits K u) + (inverseIntegerRingUniformizerFieldUnit K) = + (localTamePowerResidueSymbol K n hn hmu u)⁻¹ := by + calc + localHilbertSymbol K n + (natCast_ne_zero_of_valuation_eq_one K n hn) hmu + (integerUnitsToFieldUnits K u) + (inverseIntegerRingUniformizerFieldUnit K) = + (localHilbertSymbol K n + (natCast_ne_zero_of_valuation_eq_one K n hn) hmu + (inverseIntegerRingUniformizerFieldUnit K) + (integerUnitsToFieldUnits K u))⁻¹ := + localHilbertSymbol_skew K n + (natCast_ne_zero_of_valuation_eq_one K n hn) hmu + (integerUnitsToFieldUnits K u) + (inverseIntegerRingUniformizerFieldUnit K) + _ = (localTamePowerResidueSymbol K n hn hmu u)⁻¹ := + congrArg Inv.inv + (localHilbertSymbol_inverseIntegerRingUniformizerFieldUnit_integerUnit_eq_tame + K n hn hmu u) + +open scoped Classical in +/-- The local Hilbert symbol is compatible with arbitrary integral powers in +its second argument. -/ +theorem localHilbertSymbol_zpow_right + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a b : Kˣ) (m : ℤ) : + localHilbertSymbol K n hnK hmu a (b ^ m) = + localHilbertSymbol K n hnK hmu a b ^ m := by + calc + localHilbertSymbol K n hnK hmu a (b ^ m) = + maximalLocalKummerPairingRightHom K n hnK hmu a (b ^ m) := by + simpa only [localHilbertSymbolHom_apply] using + (maximalLocalKummerPairingRightHom_eq_localHilbertSymbolHom + K n hnK hmu a (b ^ m)).symm + _ = maximalLocalKummerPairingRightHom K n hnK hmu a b ^ m := by + rw [map_zpow] + _ = localHilbertSymbol K n hnK hmu a b ^ m := by + rw [maximalLocalKummerPairingRightHom_eq_localHilbertSymbolHom, + localHilbertSymbolHom_apply] + +open scoped Classical in +/-- In the tame case, the local Hilbert symbol of two valuation-ring units is +trivial. The chosen simple Kummer extension generated by the second unit is +unramified, so the first unit has trivial local Artin symbol. -/ +theorem localHilbertSymbol_integerUnit_integerUnit_eq_one + (n : ℕ+) + (hn : ValuativeRel.valuation K ((n : ℕ) : K) = 1) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (u v : 𝒪[K]ˣ) : + localHilbertSymbol K n + (natCast_ne_zero_of_valuation_eq_one K n hn) hmu + (integerUnitsToFieldUnits K u) + (integerUnitsToFieldUnits K v) = 1 := by + let hnK : ((n : ℕ) : K) ≠ 0 := + natCast_ne_zero_of_valuation_eq_one K n hn + let a : Kˣ := integerUnitsToFieldUnits K u + let b : Kˣ := integerUnitsToFieldUnits K v + let E := chosenSimpleKummerExtension K n hnK b + let beta : Eˣ := chosenSimpleKummerRootUnit K n hnK b + let : FiniteDimensional K E := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let : IsAbelianGalois K E := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let : NontriviallyNormedField E := + finiteExtensionSpectralNormedField K E + let : ValuativeRel E := + finiteExtensionSpectralValuativeRel K E + let : IsNonarchimedeanLocalField E := + finiteExtensionSpectralIsNonarchimedeanLocalField K E + let : Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation E) := + finiteExtensionSpectralValuation_hasExtension K E + let : Algebra 𝒪[K] E := Algebra.ofSubsemiring 𝒪[K] + let : IsIntegralClosure 𝒪[E] 𝒪[K] E := + localCompleteDVF_integerRing_isIntegralClosure K E + let : Module.Finite 𝒪[K] 𝒪[E] := + localCompleteDVF_integerRing_moduleFinite K E + have hbetaPowUnits : + beta ^ (n : ℕ) = Units.map (algebraMap K E).toMonoidHom b := by + simpa only [E, beta] using + chosenSimpleKummerRootUnit_pow K n hnK b + have hbetaPow : + (beta : E) ^ (n : ℕ) = algebraMap K E (b : K) := by + exact congrArg Units.val hbetaPowUnits + have hbVal : ValuativeRel.valuation K (b : K) = 1 := by + apply valuation_eq_one_of_valuationMap_eq_zero K + rw [valuationMap_apply] + simpa only [b] using v_integerUnitsToFieldUnits K v + have hbetaVal : ValuativeRel.valuation E (beta : E) = 1 := by + apply valuation_eq_one_of_valuationMap_eq_zero E + exact + valuationMap_eq_zero_of_pow_eq_map_integerUnit + K E n v beta (by simpa only [b] using hbetaPowUnits) + have hgenIntermediate : + IntermediateField.adjoin K {(beta : E)} = ⊤ := by + simpa only [E, beta] using + chosenSimpleKummerExtension_adjoin_root_eq_top K n hnK b + have hgen : Algebra.adjoin K {(beta : E)} = ⊤ := by + apply + (IntermediateField.adjoin_simple_eq_top_iff_of_isAlgebraic + (Algebra.IsAlgebraic.isAlgebraic (beta : E))).mp + exact hgenIntermediate + let : IsUnramifiedValuedExtension K E := + isUnramifiedValuedExtension_of_unit_kummer_generator + n (b : K) (beta : E) hbVal hn hbetaVal hbetaPow hgen + have haVal : valuationMap K (Additive.ofMul a) = 0 := by + rw [valuationMap_apply] + simpa only [a] using v_integerUnitsToFieldUnits K u + have hArtin : + chosenSimpleKummerNormResidueAutomorphism K n hnK hmu b a = 1 := by + change abelianLocalArtinMonoidHom K E a = 1 + rw [abelianLocalArtinMonoidHom_eq_frobenius_zpow, haVal, zpow_zero] + have hHilbertVal := congrArg Subtype.val + (localHilbertSymbol_map_eq_rootQuotient K n hnK hmu a b) + change localHilbertSymbol K n hnK hmu a b = 1 + apply nthRootsSubgroupMap_injective K E (n : ℕ) + apply Subtype.ext + calc + (nthRootsSubgroupMap K E (n : ℕ) + (localHilbertSymbol K n hnK hmu a b)).1 = + rootQuotient (K := K) (L := E) beta + (chosenSimpleKummerNormResidueAutomorphism + K n hnK hmu b a) := by + simpa only [E, beta] using hHilbertVal + _ = rootQuotient (K := K) (L := E) beta 1 := by + rw [hArtin] + _ = 1 := rootQuotient_one beta + _ = (nthRootsSubgroupMap K E (n : ℕ) + (1 : nthRootsSubgroup K (n : ℕ))).1 := by simp + +open scoped Classical in +/-- General tame local Hilbert-symbol formula with a valuation-ring unit in +the first slot. Decomposing the second argument into its unit factor and the +chosen valuation-one prime power reduces the calculation to the unit-unit +vanishing and the inverse-prime special case above. -/ +theorem localHilbertSymbol_tame_formula + (n : ℕ+) + (hn : ValuativeRel.valuation K ((n : ℕ) : K) = 1) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (u : 𝒪[K]ˣ) (x : Kˣ) : + localHilbertSymbol K n + (natCast_ne_zero_of_valuation_eq_one K n hn) hmu + (integerUnitsToFieldUnits K u) x = + localTamePowerResidueSymbol K n hn hmu u ^ + (-valuationMap K (Additive.ofMul x)) := by + let piInv : Kˣ := inverseIntegerRingUniformizerFieldUnit K + have hpiInv : valuationMap K (Additive.ofMul piInv) = 1 := by + simpa only [piInv, valuationMap_apply] using + v_inverseIntegerRingUniformizerFieldUnit K + let xUnit : 𝒪[K]ˣ := uniformizerUnitFactor K piInv hpiInv x + have hxDecomp : + integerUnitsToFieldUnits K xUnit * + piInv ^ valuationMap K (Additive.ofMul x) = x := by + simpa only [xUnit] using + uniformizerUnitFactor_mul_uniformizer_zpow K piInv hpiInv x + calc + localHilbertSymbol K n + (natCast_ne_zero_of_valuation_eq_one K n hn) hmu + (integerUnitsToFieldUnits K u) x = + localHilbertSymbol K n + (natCast_ne_zero_of_valuation_eq_one K n hn) hmu + (integerUnitsToFieldUnits K u) + (integerUnitsToFieldUnits K xUnit * + piInv ^ valuationMap K (Additive.ofMul x)) := by + rw [hxDecomp] + _ = localHilbertSymbol K n + (natCast_ne_zero_of_valuation_eq_one K n hn) hmu + (integerUnitsToFieldUnits K u) + (integerUnitsToFieldUnits K xUnit) * + localHilbertSymbol K n + (natCast_ne_zero_of_valuation_eq_one K n hn) hmu + (integerUnitsToFieldUnits K u) + (piInv ^ valuationMap K (Additive.ofMul x)) := by + rw [localHilbertSymbol_mul_right] + _ = 1 * + localHilbertSymbol K n + (natCast_ne_zero_of_valuation_eq_one K n hn) hmu + (integerUnitsToFieldUnits K u) piInv ^ + valuationMap K (Additive.ofMul x) := by + rw [localHilbertSymbol_integerUnit_integerUnit_eq_one + K n hn hmu u xUnit, + localHilbertSymbol_zpow_right K n + (natCast_ne_zero_of_valuation_eq_one K n hn) hmu] + _ = (localTamePowerResidueSymbol K n hn hmu u)⁻¹ ^ + valuationMap K (Additive.ofMul x) := by + rw [one_mul] + simpa only [piInv] using congrArg + (fun z : nthRootsSubgroup K (n : ℕ) => + z ^ valuationMap K (Additive.ofMul x)) + (localHilbertSymbol_integerUnit_inverseIntegerRingUniformizerFieldUnit_eq_tame_inv + K n hn hmu u) + _ = localTamePowerResidueSymbol K n hn hmu u ^ + (-valuationMap K (Additive.ofMul x)) := by + exact inv_zpow' _ _ + +end Kummer +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/SmallHilbertPairingTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/SmallHilbertPairingTransport.lean new file mode 100644 index 0000000000..18e03cab9c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/SmallHilbertPairingTransport.lean @@ -0,0 +1,287 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MathlibHilbertPairing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ShrinkTransport +/-! +# Transport of Hilbert pairings across field equivalences + +The Type 0 local construction can be applied to a small representative of a +local field. This file transports its public power-class and Kummer-norm +statements back across the field equivalence. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- A field equivalence identifies the groups of `n`-th power classes. -/ +noncomputable def powerClassGroupEquivOfRingEquiv + {F : Type u} {G : Type v} [Field F] [Field G] + (e : F ≃+* G) (n : ℕ+) : + PowerClassGroup F n ≃* PowerClassGroup G n := by + let eu : Fˣ ≃* Gˣ := Units.mapEquiv e.toMulEquiv + let NF : Subgroup Fˣ := (powMonoidHom (n : ℕ) : Fˣ →* Fˣ).range + let NG : Subgroup Gˣ := (powMonoidHom (n : ℕ) : Gˣ →* Gˣ).range + have hfg : NF ≤ NG.comap eu.toMonoidHom := by + intro x hx + obtain ⟨y, rfl⟩ := hx + change eu (y ^ (n : ℕ)) ∈ NG + exact ⟨eu y, by simp⟩ + have hgf : NG ≤ NF.comap eu.symm.toMonoidHom := by + intro x hx + obtain ⟨y, rfl⟩ := hx + change eu.symm (y ^ (n : ℕ)) ∈ NF + exact ⟨eu.symm y, by simp⟩ + let fwd : Fˣ ⧸ NF →* Gˣ ⧸ NG := + QuotientGroup.map NF NG eu.toMonoidHom hfg + let bwd : Gˣ ⧸ NG →* Fˣ ⧸ NF := + QuotientGroup.map NG NF eu.symm.toMonoidHom hgf + change (Fˣ ⧸ NF) ≃* (Gˣ ⧸ NG) + refine MonoidHom.toMulEquiv fwd bwd ?_ ?_ + · ext x + simp [fwd, bwd] + · ext x + simp [fwd, bwd] + +/-- A field equivalence identifies the `n`-th roots of unity. -/ +noncomputable def rootsOfUnityEquivOfRingEquiv + {F : Type u} {G : Type v} [Field F] [Field G] + (e : F ≃+* G) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) F).Nonempty) : + rootsOfUnity (n : ℕ) F ≃* rootsOfUnity (n : ℕ) G := by + letI : NeZero (n : ℕ) := ⟨n.pos.ne'⟩ + exact rootsOfUnityEquivOfPrimitiveRoots e.injective hmu + +/-- The image of a representative under the induced power-class equivalence. -/ +theorem powerClassGroupEquivOfRingEquiv_powerClass + {F : Type u} {G : Type v} [Field F] [Field G] + (e : F ≃+* G) (n : ℕ+) (a : Fˣ) : + powerClassGroupEquivOfRingEquiv e n (powerClass F n a) = + powerClass G n (Units.mapEquiv e.toMulEquiv a) := by + rfl + +/-- A representative pulled back from the target power-class group. -/ +theorem powerClassGroupEquivOfRingEquiv_symm_powerClass + {F : Type u} {G : Type v} [Field F] [Field G] + (e : F ≃+* G) (n : ℕ+) (a : Gˣ) : + (powerClassGroupEquivOfRingEquiv e n).symm (powerClass G n a) = + powerClass F n ((Units.mapEquiv e.toMulEquiv).symm a) := by + apply (powerClassGroupEquivOfRingEquiv e n).injective + rw [MulEquiv.apply_symm_apply, powerClassGroupEquivOfRingEquiv_powerClass] + simp only [MulEquiv.apply_symm_apply] + +/-- Kummer-algebra norm membership is invariant under a field equivalence, +even when the Kummer polynomial is reducible. -/ +theorem isKummerNorm_iff_of_ringEquiv + {F : Type u} {G : Type v} [Field F] [Field G] + (e : F ≃+* G) (n : ℕ+) (a b : Fˣ) : + IsKummerNorm F n a b ↔ + IsKummerNorm G n + (Units.mapEquiv e.toMulEquiv a) + (Units.mapEquiv e.toMulEquiv b) := by + let eu : Fˣ ≃* Gˣ := Units.mapEquiv e.toMulEquiv + let pF : Polynomial F := Polynomial.X ^ (n : ℕ) - Polynomial.C (a : F) + let pG : Polynomial G := Polynomial.X ^ (n : ℕ) - Polynomial.C (eu a : G) + have hpmap : pF.map e.toRingHom = pG := by + simp [pF, pG, eu, Polynomial.map_sub, Polynomial.map_pow, + Polynomial.map_X, Polynomial.map_C, Units.coe_mapEquiv] + let eqv : AdjoinRoot pF ≃+* AdjoinRoot pG := + AdjoinRoot.mapRingEquiv e pF pG (Associated.of_eq hpmap) + have hcomp : RingHom.comp (algebraMap G (AdjoinRoot pG)) e.toRingHom = + RingHom.comp eqv.toRingHom (algebraMap F (AdjoinRoot pF)) := by + ext x + simp [eqv, AdjoinRoot.algebraMap_eq] + have hnorm (y : AdjoinRoot pF) : + e (Algebra.norm F y) = Algebra.norm G (eqv y) := by + have h := Algebra.norm_eq_of_equiv_equiv e eqv hcomp y + exact (congrArg e h).trans (e.apply_symm_apply _) + change (∃ y : (AdjoinRoot pF)ˣ, Algebra.norm F (y : AdjoinRoot pF) = (b : F)) ↔ + ∃ z : (AdjoinRoot pG)ˣ, Algebra.norm G (z : AdjoinRoot pG) = (eu b : G) + constructor + · rintro ⟨y, hy⟩ + let z : (AdjoinRoot pG)ˣ := Units.mapEquiv eqv.toMulEquiv y + refine ⟨z, ?_⟩ + change Algebra.norm G (eqv (y : AdjoinRoot pF)) = (eu b : G) + calc + Algebra.norm G (eqv (y : AdjoinRoot pF)) = + e (Algebra.norm F (y : AdjoinRoot pF)) := (hnorm _).symm + _ = e (b : F) := congrArg e hy + _ = (eu b : G) := by simp [eu] + · rintro ⟨z, hz⟩ + let y : (AdjoinRoot pF)ˣ := (Units.mapEquiv eqv.toMulEquiv).symm z + refine ⟨y, ?_⟩ + apply e.injective + calc + e (Algebra.norm F (y : AdjoinRoot pF)) = + Algebra.norm G (eqv (y : AdjoinRoot pF)) := hnorm _ + _ = Algebra.norm G (z : AdjoinRoot pG) := by + congr 1 + simp [y] + _ = (eu b : G) := hz + _ = e (b : F) := by simp [eu] + +/-- Pull a pairing on power classes across an equivalence of base fields. -/ +noncomputable def hilbertPairingOfRingEquiv + {F : Type u} {G : Type v} [Field F] [Field G] + (e : F ≃+* G) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) F).Nonempty) + (B : HilbertPairing F n) : HilbertPairing G n := + let pF := PowerClassGroup F n + let pG := PowerClassGroup G n + let rF := rootsOfUnity (n : ℕ) F + let rG := rootsOfUnity (n : ℕ) G + let ep := powerClassGroupEquivOfRingEquiv e n + let er := rootsOfUnityEquivOfRingEquiv e n hmu + ((MonoidHom.compHom (M := pG) (N := rF) (P := rG)) er.toMonoidHom).comp + (((MonoidHom.compHom' (M := pG) (N := pF) (P := rF)) + ep.symm.toMonoidHom).comp (B.comp ep.symm.toMonoidHom)) + +/-- Evaluation of a transported Hilbert pairing. -/ +theorem hilbertPairingOfRingEquiv_apply + {F : Type u} {G : Type v} [Field F] [Field G] + (e : F ≃+* G) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) F).Nonempty) + (B : HilbertPairing F n) + (x y : PowerClassGroup G n) : + hilbertPairingOfRingEquiv e n hmu B x y = + rootsOfUnityEquivOfRingEquiv e n hmu + (B ((powerClassGroupEquivOfRingEquiv e n).symm x) + ((powerClassGroupEquivOfRingEquiv e n).symm y)) := by + rfl + +/-- The Steinberg relation is preserved by base-field equivalence. -/ +theorem hilbertPairingOfRingEquiv_isSteinberg + {F : Type u} {G : Type v} [Field F] [Field G] + (e : F ≃+* G) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) F).Nonempty) + (B : HilbertPairing F n) (hB : B.IsSteinberg) : + (hilbertPairingOfRingEquiv e n hmu B).IsSteinberg := by + let eu : Fˣ ≃* Gˣ := Units.mapEquiv e.toMulEquiv + let er := rootsOfUnityEquivOfRingEquiv e n hmu + intro a ha + let a0 : Fˣ := eu.symm a + have ha0 : 1 - (a0 : F) ≠ 0 := by + intro hz + apply ha + have hzG := congrArg e hz + simpa [a0, eu] using hzG + let c0 : Fˣ := Units.mk0 (1 - (a0 : F)) ha0 + have hc0 : eu.symm (Units.mk0 (1 - (a : G)) ha) = c0 := by + apply Units.ext + change e.symm (1 - (a : G)) = 1 - (a0 : F) + simp [a0, eu] + change hilbertPairingOfRingEquiv e n hmu B (powerClass G n a) + (powerClass G n (Units.mk0 (1 - (a : G)) ha)) = 1 + rw [hilbertPairingOfRingEquiv_apply, + powerClassGroupEquivOfRingEquiv_symm_powerClass, + powerClassGroupEquivOfRingEquiv_symm_powerClass, hc0] + change er (B.symbol a0 c0) = 1 + rw [hB a0 ha0, map_one] + +/-- Skew-symmetry is preserved by base-field equivalence. -/ +theorem hilbertPairingOfRingEquiv_isSkewSymmetric + {F : Type u} {G : Type v} [Field F] [Field G] + (e : F ≃+* G) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) F).Nonempty) + (B : HilbertPairing F n) (hB : B.IsSkewSymmetric) : + (hilbertPairingOfRingEquiv e n hmu B).IsSkewSymmetric := by + intro x y + rw [hilbertPairingOfRingEquiv_apply, hilbertPairingOfRingEquiv_apply] + rw [hB ((powerClassGroupEquivOfRingEquiv e n).symm x) + ((powerClassGroupEquivOfRingEquiv e n).symm y), map_inv] + +/-- Nondegeneracy in both variables is preserved by field equivalence. -/ +theorem hilbertPairingOfRingEquiv_isNondegenerate + {F : Type u} {G : Type v} [Field F] [Field G] + (e : F ≃+* G) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) F).Nonempty) + (B : HilbertPairing F n) (hB : B.IsNondegenerate) : + (hilbertPairingOfRingEquiv e n hmu B).IsNondegenerate := by + let ep := powerClassGroupEquivOfRingEquiv e n + let er := rootsOfUnityEquivOfRingEquiv e n hmu + constructor + · intro x hx + have hx0 : ep.symm x = 1 := by + apply hB.1 + intro y + have hxy := hx (ep y) + rw [hilbertPairingOfRingEquiv_apply, ep.symm_apply_apply] at hxy + apply er.injective + simpa only [map_one] using hxy + calc + x = ep (ep.symm x) := (ep.apply_symm_apply x).symm + _ = ep 1 := congrArg ep hx0 + _ = 1 := map_one ep + · intro y hy + have hy0 : ep.symm y = 1 := by + apply hB.2 + intro x + have hxy := hy (ep x) + rw [hilbertPairingOfRingEquiv_apply, ep.symm_apply_apply] at hxy + apply er.injective + simpa only [map_one] using hxy + calc + y = ep (ep.symm y) := (ep.apply_symm_apply y).symm + _ = ep 1 := congrArg ep hy0 + _ = 1 := map_one ep + +/-- The canonical Kummer norm-residue law is preserved by field equivalence. -/ +theorem hilbertPairingOfRingEquiv_satisfiesNormResidueCriterion + {F : Type u} {G : Type v} [Field F] [Field G] + (e : F ≃+* G) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) F).Nonempty) + (B : HilbertPairing F n) (hB : B.SatisfiesNormResidueCriterion) : + (hilbertPairingOfRingEquiv e n hmu B).SatisfiesNormResidueCriterion := by + let eu : Fˣ ≃* Gˣ := Units.mapEquiv e.toMulEquiv + let er := rootsOfUnityEquivOfRingEquiv e n hmu + intro a b + let a0 : Fˣ := eu.symm a + let b0 : Fˣ := eu.symm b + have htr : (hilbertPairingOfRingEquiv e n hmu B).symbol a b = 1 ↔ + B.symbol a0 b0 = 1 := by + change hilbertPairingOfRingEquiv e n hmu B + (powerClass G n a) (powerClass G n b) = 1 ↔ _ + rw [hilbertPairingOfRingEquiv_apply, + powerClassGroupEquivOfRingEquiv_symm_powerClass, + powerClassGroupEquivOfRingEquiv_symm_powerClass] + change er (B.symbol a0 b0) = 1 ↔ B.symbol a0 b0 = 1 + rw [← map_one er, er.injective.eq_iff] + calc + (hilbertPairingOfRingEquiv e n hmu B).symbol a b = 1 ↔ + B.symbol a0 b0 = 1 := htr + _ ↔ IsKummerNorm F n a0 b0 := hB a0 b0 + _ ↔ IsKummerNorm G n a b := by + have ha : Units.mapEquiv e.toMulEquiv a0 = a := + eu.apply_symm_apply a + have hb : Units.mapEquiv e.toMulEquiv b0 = b := + eu.apply_symm_apply b + simpa only [ha, hb] using + (isKummerNorm_iff_of_ringEquiv e n a0 b0) + +/-- All public local-pairing properties are invariant under a field +equivalence. -/ +theorem hilbertPairingOfRingEquiv_isLocalHilbertPairing + {F : Type u} {G : Type v} [Field F] [Field G] + (e : F ≃+* G) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) F).Nonempty) + (B : HilbertPairing F n) + (hB : HilbertPairing.IsLocalHilbertPairing B) : + HilbertPairing.IsLocalHilbertPairing + (hilbertPairingOfRingEquiv e n hmu B) := by + exact ⟨hilbertPairingOfRingEquiv_isSteinberg e n hmu B hB.1, + hilbertPairingOfRingEquiv_isSkewSymmetric e n hmu B hB.2.1, + hilbertPairingOfRingEquiv_isNondegenerate e n hmu B hB.2.2.1, + hilbertPairingOfRingEquiv_satisfiesNormResidueCriterion e n hmu B hB.2.2.2⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication.lean new file mode 100644 index 0000000000..6ae322742d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication.lean @@ -0,0 +1,32 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicRealFilteredComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedFixedFieldComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedLevelTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedRealFilteredComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicUpperFiltration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LaurentPrincipalUnitTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LubinTateTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.PadicMultiplicativeArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFilteredArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFixedFieldComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormSubgroupExact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardSubgroupIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.TransportedNormSubgroupExact + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/All.lean new file mode 100644 index 0000000000..139abe0436 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/All.lean @@ -0,0 +1,39 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicRealFilteredComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedFixedFieldComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedLevelTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedRealFilteredComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicUpperFiltration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LaurentPrincipalUnitTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LubinTateTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.PadicMultiplicativeArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFilteredArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFixedFieldComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormSubgroupExact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardSubgroupIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.TransportedNormSubgroupExact +/-! +# Lubin--Tate application to local class field theory + +This is the dependency boundary between reusable Lubin--Tate theory and its +local-class-field-theory application. Finite local reciprocity identifies +the exact norm subgroup both for the canonical characteristic-independent +standard levels and for the transported Laurent-series model. The lower +`LubinTate` public root and all modules below it remain independent of +`LocalClassFieldTheory`. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicRealFilteredComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicRealFilteredComparison.lean new file mode 100644 index 0000000000..d02c8adb15 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicRealFilteredComparison.lean @@ -0,0 +1,425 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.RealIndexSteps +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardArtinComparison +/-! +# Real filtered reciprocity on equal-characteristic Lubin--Tate levels + +This file extends the integral comparison between standard local Artin images +and upper ramification groups to every nonnegative real index. It separately +packages the zeroth and terminal cases, then combines them with the positive +ceiling-step comparison. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries ValuativeRel + +namespace LocalClassFieldTheory + +open RamificationTheory.LocalField +open LubinTate + +open LocalClassFieldTheory +open LocalFieldTheory +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.IsNonarchimedeanLocalField +open LubinTate.EqualCharacteristic +open RamificationTheory.HilbertRamification.Higher + +universe v + +variable {K₀ : Type} [Field K₀] + +/-- The chosen lower ramification group at index zero is the full Galois +group for an equal-characteristic Lubin--Tate level. -/ +theorem + equalCharacteristicLubinTateRealLowerRamificationGroup_zero_eq_top + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicLubinTateRealLowerRamificationGroup F n 0 = ⊤ := by + apply top_unique + intro sigma _ + let e := equalCharacteristicLubinTateUnitParameterEquivGal F n + let a := e.symm sigma + have hsigma : e a = sigma := e.apply_symm_apply sigma + rw [← hsigma] + change + equalCharacteristicLubinTateUnitParameterToGal F n a ∈ + equalCharacteristicLubinTateRealLowerRamificationGroup F n 0 + have hqpos : + 0 < Nat.card F.residueField := + Nat.zero_lt_one.trans + (Finite.one_lt_card : 1 < Nat.card F.residueField) + have hpow : + 1 ≤ + Nat.card F.residueField ^ + (equalCharacteristicLubinTateUnitParameterSeries F n a - 1).order.toNat := + Nat.one_le_iff_ne_zero.mpr + (pow_ne_zero _ (Nat.ne_of_gt hqpos)) + have hm : + equalCharacteristicLubinTateUnitParameterToGal F n a ∈ + equalCharacteristicLubinTateRealLowerRamificationGroup F n + ((0 : ℕ) : ℝ) := + (mem_equalCharacteristicLubinTateRealLowerRamificationGroup_nat_iff_parameterPower + F n 0 a).mpr (Or.inr (by exact_mod_cast hpow)) + simpa only [Nat.cast_zero] using hm + +/-- The chosen upper ramification group at index zero is the full Galois +group for an equal-characteristic Lubin--Tate level. -/ +theorem + equalCharacteristicLubinTateRealUpperRamificationGroup_zero_eq_top + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicLubinTateRealUpperRamificationGroup F n 0 = ⊤ := by + calc + equalCharacteristicLubinTateRealUpperRamificationGroup F n 0 = + equalCharacteristicLubinTateRealLowerRamificationGroup F n 0 := by + simpa using + equalCharacteristicLubinTateRealUpperRamificationGroup_nat_eq_lower_pow_sub_one + F n 0 (by omega) + _ = ⊤ := + equalCharacteristicLubinTateRealLowerRamificationGroup_zero_eq_top F n + +/-- The canonical local upper ramification group at index zero is full on an +equal-characteristic Lubin--Tate level. -/ +theorem + equalCharacteristicLubinTateLocalUpperRamificationGroup_zero_eq_top + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + let B := F.residueField⸨X⸩ + let L := equalCharacteristicLubinTateLevelField F n + letI : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + letI : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + letI : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + localUpperRamificationGroup B L 0 = ⊤ := by + let B := F.residueField⸨X⸩ + let L := equalCharacteristicLubinTateLevelField F n + let : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + let : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + let : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + calc + localUpperRamificationGroup B L 0 = + equalCharacteristicLubinTateRealUpperRamificationGroup F n 0 := + (equalCharacteristicLubinTateRealUpperRamificationGroup_eq_localUpperRamificationGroup + F n 0).symm + _ = ⊤ := + equalCharacteristicLubinTateRealUpperRamificationGroup_zero_eq_top F n + +/-- The standard local Artin image of the full valuation-ring unit group +`U^0` is the full Galois group of an equal-characteristic Lubin--Tate level. -/ +theorem + equalCharacteristicLubinTateArtinPrincipalUnitsImage_zero_eq_top + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + let B := F.residueField⸨X⸩ + let L := equalCharacteristicLubinTateLevelField F n + letI : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + letI : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + letI : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + (LocalFieldTheory.fieldPrincipalUnits B 0).map (abelianLocalArtinMonoidHom B L) = ⊤ := by + let B := F.residueField⸨X⸩ + let L := equalCharacteristicLubinTateLevelField F n + let pi : Bˣ := (equalCharacteristicLaurentUniformizerUnit F)⁻¹ + let : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + let : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + let : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + have hpi : + valuationMap B (Additive.ofMul pi) = 1 := by + simpa only [B, pi] using + equalCharacteristicLaurentUniformizerUnit_inv_valuationMap F + have hpiKer : + Subgroup.zpowers pi ≤ (abelianLocalArtinMonoidHom B L).ker := by + rw [abelianLocalArtinMonoidHom_ker] + change Subgroup.zpowers pi ≤ + equalCharacteristicLubinTateNormSubgroup F n + rw [ + equalCharacteristicLubinTateNormSubgroup_eq_uniformizerPrincipalSubgroup] + simp [B, pi, LocalFieldTheory.uniformizerPrincipalSubgroup] + apply top_unique + intro sigma _ + obtain ⟨x, hx⟩ := + abelianLocalArtinMonoidHom_surjective B L sigma + obtain ⟨u, hdecomp⟩ := + exists_integerUnit_mul_uniformizer_zpow B pi hpi x + have hpowKer : + pi ^ valuationMap B (Additive.ofMul x) ∈ + (abelianLocalArtinMonoidHom B L).ker := + hpiKer (Subgroup.zpow_mem_zpowers pi _) + have hpow : + abelianLocalArtinMonoidHom B L + (pi ^ valuationMap B (Additive.ofMul x)) = 1 := + MonoidHom.mem_ker.mp hpowKer + refine ⟨integerUnitsToFieldUnits B u, ?_, ?_⟩ + · unfold LocalFieldTheory.fieldPrincipalUnits + exact ⟨u, by simp, rfl⟩ + · rw [← hx, ← hdecomp, map_mul, hpow, mul_one] + +/-- The zeroth Artin principal-unit group is full on an explicit +equal-characteristic Lubin--Tate level. -/ +theorem + equalCharacteristicLubinTateArtinPrincipalUnitGroup_zero_eq_top + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + let B := F.residueField⸨X⸩ + let L := equalCharacteristicLubinTateLevelField F n + letI : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + letI : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + letI : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + artinPrincipalUnitGroup B L 0 = ⊤ := by + simpa only [artinPrincipalUnitGroup] using + equalCharacteristicLubinTateArtinPrincipalUnitsImage_zero_eq_top F n + +/-- At the last visible integral upper index `n + 1`, the chosen upper group +is trivial. -/ +theorem + equalCharacteristicLubinTateRealUpperRamificationGroup_succ_eq_bot + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicLubinTateRealUpperRamificationGroup + F n ((n + 1 : ℕ) : ℝ) = ⊥ := by + have hcard : + Nat.card + (equalCharacteristicLubinTateRealUpperRamificationGroup + F n ((n + 1 : ℕ) : ℝ)) = 1 := by + simpa using + equalCharacteristicLubinTateRealUpperRamificationGroup_natCard + F n (n + 1) (by omega) (by omega) + exact Subgroup.eq_bot_of_card_le _ (by omega) + +/-- At the last visible integral upper index `n + 1`, the canonical local +upper group is trivial. -/ +theorem + equalCharacteristicLubinTateLocalUpperRamificationGroup_succ_eq_bot + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + let B := F.residueField⸨X⸩ + let L := equalCharacteristicLubinTateLevelField F n + letI : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + letI : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + letI : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + localUpperRamificationGroup B L ((n + 1 : ℕ) : ℝ) = ⊥ := by + let B := F.residueField⸨X⸩ + let L := equalCharacteristicLubinTateLevelField F n + let : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + let : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + let : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + calc + localUpperRamificationGroup B L ((n + 1 : ℕ) : ℝ) = + equalCharacteristicLubinTateRealUpperRamificationGroup + F n ((n + 1 : ℕ) : ℝ) := + (equalCharacteristicLubinTateRealUpperRamificationGroup_eq_localUpperRamificationGroup + F n ((n + 1 : ℕ) : ℝ)).symm + _ = ⊥ := + equalCharacteristicLubinTateRealUpperRamificationGroup_succ_eq_bot F n + +/-- The standard Artin image of `U^(n+1)` is trivial on the level `n + 1` +extension. -/ +theorem + equalCharacteristicLubinTateArtinPrincipalUnitGroup_succ_eq_bot + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + let B := F.residueField⸨X⸩ + let L := equalCharacteristicLubinTateLevelField F n + letI : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + letI : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + letI : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + artinPrincipalUnitGroup B L (n + 1) = ⊥ := by + let B := F.residueField⸨X⸩ + let L := equalCharacteristicLubinTateLevelField F n + let : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + let : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + let : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + change + (LocalFieldTheory.fieldPrincipalUnits B (n + 1)).map + (abelianLocalArtinMonoidHom B L) = ⊥ + exact + (equalCharacteristicLubinTateArtinPrincipalUnitsImage_eq_localUpperRamificationGroup + F n (n + 1) (by omega) (by omega)).trans + (equalCharacteristicLubinTateLocalUpperRamificationGroup_succ_eq_bot + F n) + +/-- Beyond the last visible level, the real Artin principal-unit step group is +trivial. -/ +theorem + equalCharacteristicLubinTateArtinPrincipalUnitStepGroup_eq_bot_of_level_lt_ceil + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) (t : ℝ) (hlevel : n + 1 < ⌈t⌉₊) : + let B := F.residueField⸨X⸩ + let L := equalCharacteristicLubinTateLevelField F n + letI : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + letI : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + letI : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + artinPrincipalUnitStepGroup B L t = ⊥ := by + let B := F.residueField⸨X⸩ + let L := equalCharacteristicLubinTateLevelField F n + let : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + let : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + let : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + unfold artinPrincipalUnitStepGroup RamificationTheory.natCeilStepFiltration + apply le_antisymm + · have hle := + artinPrincipalUnitGroup_antitone B L (Nat.le_of_lt hlevel) + rw [ + equalCharacteristicLubinTateArtinPrincipalUnitGroup_succ_eq_bot + F n] at hle + exact hle + · exact bot_le + +/-- Beyond the last visible level, the canonical local upper ramification +group is trivial. -/ +theorem + equalCharacteristicLubinTateLocalUpperRamificationGroup_eq_bot_of_level_lt_ceil + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) (t : ℝ) (hlevel : n + 1 < ⌈t⌉₊) : + let B := F.residueField⸨X⸩ + let L := equalCharacteristicLubinTateLevelField F n + letI : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + letI : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + letI : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + localUpperRamificationGroup B L t = ⊥ := by + let B := F.residueField⸨X⸩ + let L := equalCharacteristicLubinTateLevelField F n + let : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + let : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + let : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + have ht : + (((n + 1 : ℕ) : ℝ)) ≤ t := by + have hsucc : n + 1 + 1 ≤ ⌈t⌉₊ := by + omega + exact (Nat.add_one_le_ceil_iff.mp hsucc).le + apply le_antisymm + · have hle := localUpperRamificationGroup_antitone B L ht + rw [ + equalCharacteristicLubinTateLocalUpperRamificationGroup_succ_eq_bot + F n] at hle + exact hle + · exact bot_le + +/-- Real filtered local reciprocity for an explicit equal-characteristic +Lubin--Tate level: at every nonnegative real index, the standard Artin image +of the natural-ceiling principal-unit step is the canonical upper +ramification group. -/ +theorem + equalCharacteristicLubinTateArtinPrincipalUnitStepGroup_eq_localUpperRamificationGroup + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) (t : ℝ) (ht : 0 ≤ t) : + let B := F.residueField⸨X⸩ + let L := equalCharacteristicLubinTateLevelField F n + letI : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + letI : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + letI : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + artinPrincipalUnitStepGroup B L t = + localUpperRamificationGroup B L t := by + let B := F.residueField⸨X⸩ + let L := equalCharacteristicLubinTateLevelField F n + let k : ℕ := ⌈t⌉₊ + let : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + let : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + let : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + by_cases hkzero : k = 0 + · have hceilzero : ⌈t⌉₊ = 0 := by + simpa only [k] using hkzero + have htzero : t = 0 := + le_antisymm (Nat.ceil_eq_zero.mp hceilzero) ht + subst t + calc + artinPrincipalUnitStepGroup B L (0 : ℝ) = ⊤ := by + simpa [artinPrincipalUnitStepGroup, + RamificationTheory.natCeilStepFiltration] using + equalCharacteristicLubinTateArtinPrincipalUnitGroup_zero_eq_top + F n + _ = localUpperRamificationGroup B L 0 := + (equalCharacteristicLubinTateLocalUpperRamificationGroup_zero_eq_top + F n).symm + · have hk : 1 ≤ k := by + omega + by_cases hkn : k ≤ n + 1 + · have hLocalStep : + localUpperRamificationGroup B L t = + localUpperRamificationGroup B L (k : ℝ) := by + calc + localUpperRamificationGroup B L t = + equalCharacteristicLubinTateRealUpperRamificationGroup F n t := + (equalCharacteristicLubinTateRealUpperRamificationGroup_eq_localUpperRamificationGroup + F n t).symm + _ = + equalCharacteristicLubinTateRealUpperRamificationGroup + F n (k : ℝ) := by + have hstep := + equalCharacteristicLubinTateRealUpperRamificationGroup_eq_natCeil + F n t + (by simpa only [k] using hk) + (by simpa only [k] using hkn) + simpa only [k] using hstep + _ = localUpperRamificationGroup B L (k : ℝ) := + equalCharacteristicLubinTateRealUpperRamificationGroup_eq_localUpperRamificationGroup + F n (k : ℝ) + change + (LocalFieldTheory.fieldPrincipalUnits B k).map + (abelianLocalArtinMonoidHom B L) = + localUpperRamificationGroup B L t + exact + (equalCharacteristicLubinTateArtinPrincipalUnitsImage_eq_localUpperRamificationGroup + F n k hk hkn).trans hLocalStep.symm + · have hlevel : n + 1 < ⌈t⌉₊ := by + dsimp only [k] at hkn + omega + exact + (equalCharacteristicLubinTateArtinPrincipalUnitStepGroup_eq_bot_of_level_lt_ceil + F n t hlevel).trans + (equalCharacteristicLubinTateLocalUpperRamificationGroup_eq_bot_of_level_lt_ceil + F n t hlevel).symm + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedArtinComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedArtinComparison.lean new file mode 100644 index 0000000000..fc0c148e3a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedArtinComparison.lean @@ -0,0 +1,203 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRestriction +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.RestrictionKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.TransportedNormSubgroupExact +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality +/-! +# Local Artin comparison on transported Lubin--Tate levels + +The exact transported norm-subgroup formula and finite-tower naturality of +the local Artin map identify the image of a target-field principal-unit +group with the kernel of restriction to the corresponding lower transported +Lubin--Tate level. The transported upper-ramification calculation identifies +the same kernel, giving integral filtered reciprocity over the target field. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries ValuativeRel + +namespace LocalClassFieldTheory + +open RamificationTheory.LocalField +open LubinTate + +open LocalClassFieldTheory +open LocalFieldTheory +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.IsNonarchimedeanLocalField +open LubinTate.EqualCharacteristic + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- In a tower of transported levels `m + 1 ≤ n + 1`, the target-field +local Artin image of `U^(m+1)` is the kernel of actual restriction to the +lower transported level. -/ +theorem + equalCharacteristicTransportedLubinTateArtinPrincipalUnitsImage_eq_restrictKer + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + {m n : ℕ} (hmn : m ≤ n) : + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + let L := equalCharacteristicLubinTateLevelField F n + letI : Algebra B E := + equalCharacteristicLubinTateLevelAlgebra F m + letI : Algebra B L := + equalCharacteristicLubinTateLevelAlgebra F n + letI : CharP K p := hKp + letI : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ m + letI : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + letI : FiniteDimensional K E := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ m + letI : FiniteDimensional K L := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ n + letI : IsAbelianGalois K E := + equalCharacteristicTransportedLubinTateLevel_isAbelianGalois + K p ϖ hϖ m + letI : IsAbelianGalois K L := + equalCharacteristicTransportedLubinTateLevel_isAbelianGalois + K p ϖ hϖ n + (LocalFieldTheory.fieldPrincipalUnits K (m + 1)).map + (abelianLocalArtinMonoidHom K L) = + (equalCharacteristicTransportedLubinTateRestrictNormalHom + K p ϖ hϖ hmn).ker := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + let L := equalCharacteristicLubinTateLevelField F n + let : Algebra B E := + equalCharacteristicLubinTateLevelAlgebra F m + let : Algebra B L := + equalCharacteristicLubinTateLevelAlgebra F n + let hEL : E ≤ L := + equalCharacteristicLubinTateLevelField_mono F hmn + let : CharP K p := hKp + let : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ m + let : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + let : FiniteDimensional K E := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ m + let : FiniteDimensional K L := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ n + let : IsAbelianGalois K E := + equalCharacteristicTransportedLubinTateLevel_isAbelianGalois + K p ϖ hϖ m + let : IsAbelianGalois K L := + equalCharacteristicTransportedLubinTateLevel_isAbelianGalois + K p ϖ hϖ n + let ELAlgebra : Algebra E L := + RingHom.toAlgebra (IntermediateField.inclusion hEL).toRingHom + let : SMul E L := + @Algebra.toSMul _ _ _ _ ELAlgebra + let : IsScalarTower K E L := + IsScalarTower.of_algebraMap_eq' (R := K) (S := E) (A := L) (by + apply RingHom.ext + intro x + apply L.val.injective + rfl) + let φ := abelianLocalArtinMonoidHom K L + let ψ := + equalCharacteristicTransportedLubinTateRestrictNormalHom + K p ϖ hϖ hmn + have hrestrict : + ψ.comp φ = abelianLocalArtinMonoidHom K E := by + change + (AlgEquiv.restrictNormalHom E).comp + (abelianLocalArtinMonoidHom K L) = + abelianLocalArtinMonoidHom K E + exact abelianLocalArtinMonoidHom_restrict_tower K E L + have hker : + (ψ.comp φ).ker = + Subgroup.zpowers ϖ ⊔ LocalFieldTheory.fieldPrincipalUnits K (m + 1) := by + rw [hrestrict, abelianLocalArtinMonoidHom_ker] + change + equalCharacteristicTransportedLubinTateNormSubgroup + K p ϖ hϖ m = + Subgroup.zpowers ϖ ⊔ LocalFieldTheory.fieldPrincipalUnits K (m + 1) + simpa [LocalFieldTheory.uniformizerPrincipalSubgroup] using + equalCharacteristicTransportedLubinTateNormSubgroup_eq_uniformizerPrincipalSubgroup + K p ϖ hϖ m + have hZ : Subgroup.zpowers ϖ ≤ φ.ker := by + rw [abelianLocalArtinMonoidHom_ker] + change + Subgroup.zpowers ϖ ≤ + equalCharacteristicTransportedLubinTateNormSubgroup + K p ϖ hϖ n + rw [ + equalCharacteristicTransportedLubinTateNormSubgroup_eq_uniformizerPrincipalSubgroup] + simp [LocalFieldTheory.uniformizerPrincipalSubgroup] + exact Subgroup.map_eq_ker_of_comp_ker_eq_sup_of_left_le_ker + φ ψ (Subgroup.zpowers ϖ) (LocalFieldTheory.fieldPrincipalUnits K (m + 1)) + (abelianLocalArtinMonoidHom_surjective K L) hker hZ + +/-- Integral filtered local reciprocity for a transported +equal-characteristic Lubin--Tate level. -/ +theorem + transportedLubinTateArtinPrincipalUnitsImage_eq_upperRamificationGroup + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (n k : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) : + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let L := equalCharacteristicLubinTateLevelField F n + letI : Algebra B L := + equalCharacteristicLubinTateLevelAlgebra F n + letI : CharP K p := hKp + letI : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + letI : FiniteDimensional K L := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ n + letI : IsAbelianGalois K L := + equalCharacteristicTransportedLubinTateLevel_isAbelianGalois + K p ϖ hϖ n + (LocalFieldTheory.fieldPrincipalUnits K k).map + (abelianLocalArtinMonoidHom K L) = + localUpperRamificationGroup K L (k : ℝ) := by + let m := k - 1 + have hmn : m ≤ n := by + dsimp only [m] + omega + have hArtin := + equalCharacteristicTransportedLubinTateArtinPrincipalUnitsImage_eq_restrictKer + K p ϖ hϖ hmn + have hUpper := + equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_eq_restrictKer + K p ϖ hϖ n k hk hkn + simpa [m, Nat.sub_add_cancel hk] using + hArtin.trans hUpper.symm + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedFixedFieldComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedFixedFieldComparison.lean new file mode 100644 index 0000000000..00996408e4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedFixedFieldComparison.lean @@ -0,0 +1,143 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedRealFilteredComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Core +/-! +# Filtered reciprocity on the named transported Lubin--Tate fixed field + +The transported Lubin--Tate level used by equal-characteristic existence is +represented inside the fixed separable closure by a named finite abelian +subextension. The canonical algebra equivalence to that fixed field +transports both the local Artin filtration and the upper ramification +filtration, so real filtered reciprocity holds on the named factor. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries ValuativeRel + +namespace LocalClassFieldTheory + +open RamificationTheory.LocalField +open LubinTate + +open LocalClassFieldTheory +open LocalFieldTheory +open LubinTate.EqualCharacteristic + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- Mapping the Artin principal-unit step group along a base-linear +equivalence gives the corresponding group on the equivalent extension. -/ +theorem artinPrincipalUnitStepGroup_map_autCongr + (L M : Type) [Field L] [Field M] + [Algebra K L] [Algebra K M] + [FiniteDimensional K L] [FiniteDimensional K M] + [IsAbelianGalois K L] [IsAbelianGalois K M] + (e : L ≃ₐ[K] M) (t : ℝ) : + Subgroup.map (AlgEquiv.autCongr e).toMonoidHom + (artinPrincipalUnitStepGroup K L t) = + artinPrincipalUnitStepGroup K M t := by + unfold artinPrincipalUnitStepGroup RamificationTheory.natCeilStepFiltration + artinPrincipalUnitGroup + rw [Subgroup.map_map] + rw [abelianLocalArtinMonoidHom_autCongr K L M e] + +/-- Real filtered local reciprocity for the named fixed field representing +a transported equal-characteristic Lubin--Tate level. -/ +theorem + equalCharacteristicTransportedLubinTateFixedField_filteredLocalReciprocity + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : _root_.LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul ϖ) = 1) + (m : ℕ) (t : ℝ) (ht : 0 ≤ t) : + let F := equalCharacteristicTargetLocalField K + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + letI : CharP K p := hKp + letI : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ m + let T := + equalCharacteristicTransportedLubinTateFiniteAbelianSubextension + K p ϖ hϖ m + let M := + abstractFixedField K (SeparableClosure K) T.field + letI : FiniteDimensional K M := + abstractFixedField_finiteDimensional + K (SeparableClosure K) T.field + (finiteAbelianSubextension_finite_over_absoluteBase K T) + letI : IsAbelianGalois K M := + finiteAbelianSubextension_fixedField_isAbelianGalois K T + artinPrincipalUnitStepGroup K M t = + localUpperRamificationGroup K M t := by + let F := equalCharacteristicTargetLocalField K + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + let : CharP K p := hKp + let : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ m + let : FiniteDimensional K E := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ m + let : IsAbelianGalois K E := + equalCharacteristicTransportedLubinTateLevel_isAbelianGalois + K p ϖ hϖ m + let T := + equalCharacteristicTransportedLubinTateFiniteAbelianSubextension + K p ϖ hϖ m + let M := + abstractFixedField K (SeparableClosure K) T.field + let : FiniteDimensional K M := + abstractFixedField_finiteDimensional + K (SeparableClosure K) T.field + (finiteAbelianSubextension_finite_over_absoluteBase K T) + let : IsAbelianGalois K M := + finiteAbelianSubextension_fixedField_isAbelianGalois K T + let e : E ≃ₐ[K] M := + equalCharacteristicTransportedLubinTateFixedFieldEquiv + K p ϖ hϖ m + let q : Gal(E/K) ≃* Gal(M/K) := + AlgEquiv.autCongr e + have hArtin : + Subgroup.map q.toMonoidHom + (artinPrincipalUnitStepGroup K E t) = + artinPrincipalUnitStepGroup K M t := + artinPrincipalUnitStepGroup_map_autCongr K E M e t + have hUpper : + Subgroup.map q.toMonoidHom + (localUpperRamificationGroup K E t) = + localUpperRamificationGroup K M t := + localUpperRamificationGroup_map_autCongr K E M e t + have hExplicit : + artinPrincipalUnitStepGroup K E t = + localUpperRamificationGroup K E t := + transportedLubinTateArtinPrincipalUnitStep_eq_upperRamificationGroup + K p ϖ hϖ m t ht + calc + artinPrincipalUnitStepGroup K M t = + Subgroup.map q.toMonoidHom + (artinPrincipalUnitStepGroup K E t) := + hArtin.symm + _ = + Subgroup.map q.toMonoidHom + (localUpperRamificationGroup K E t) := by + rw [hExplicit] + _ = localUpperRamificationGroup K M t := hUpper + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedLevelTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedLevelTower.lean new file mode 100644 index 0000000000..019f59551d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedLevelTower.lean @@ -0,0 +1,289 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRamification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction +/-! +# Towers of transported equal-characteristic Lubin--Tate levels + +The explicit level fields form a tower inside the Laurent separable closure. +After transporting their base algebra to the target local field, the same +inclusions are target-field linear. This file packages the resulting +restriction homomorphism and its compatibility with the unchanged +underlying Galois automorphisms. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries ValuativeRel + +namespace LubinTate + +open LocalFieldTheory +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.IsNonarchimedeanLocalField +open LubinTate.EqualCharacteristic +open RamificationTheory + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- Restriction between two transported Lubin--Tate levels, viewed as +extensions of the target equal-characteristic local field. -/ +noncomputable def + equalCharacteristicTransportedLubinTateRestrictNormalHom + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + {m n : ℕ} (hmn : m ≤ n) : + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + let L := equalCharacteristicLubinTateLevelField F n + letI : Algebra B E := + equalCharacteristicLubinTateLevelAlgebra F m + letI : Algebra B L := + equalCharacteristicLubinTateLevelAlgebra F n + letI : CharP K p := hKp + letI : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ m + letI : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + Gal(L/K) →* Gal(E/K) := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI hKq : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + let L := equalCharacteristicLubinTateLevelField F n + letI : Algebra B E := + equalCharacteristicLubinTateLevelAlgebra F m + letI : Algebra B L := + equalCharacteristicLubinTateLevelAlgebra F n + let hEL : E ≤ L := + equalCharacteristicLubinTateLevelField_mono F hmn + letI : IsGalois B E := + equalCharacteristicLubinTateLevelField_isGalois F m + let restrictB := + intermediateFieldRestrictNormalHom E L hEL + letI : CharP K p := hKp + letI : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ m + letI : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + exact + (equalCharacteristicTransportedLubinTateGaloisEquiv + K p ϖ hϖ m).toMonoidHom.comp + (restrictB.comp + (equalCharacteristicTransportedLubinTateGaloisEquiv + K p ϖ hϖ n).symm.toMonoidHom) + +/-- Evaluation of transported restriction agrees in the common Laurent +separable closure with restricting the underlying automorphism. -/ +theorem + equalCharacteristicTransportedLubinTateRestrictNormalHom_apply_val + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + {m n : ℕ} (hmn : m ≤ n) + (σ : + let F := equalCharacteristicTargetLocalField K + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let L := equalCharacteristicLubinTateLevelField F n + letI : CharP K p := hKp + letI : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + Gal(L/K)) + (x : + let F := equalCharacteristicTargetLocalField K + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + equalCharacteristicLubinTateLevelField F m) : + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + let L := equalCharacteristicLubinTateLevelField F n + letI : Algebra B E := + equalCharacteristicLubinTateLevelAlgebra F m + letI : Algebra B L := + equalCharacteristicLubinTateLevelAlgebra F n + letI : CharP K p := hKp + letI : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ m + letI : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let hEL : E ≤ L := + equalCharacteristicLubinTateLevelField_mono F hmn + letI : CharP K p := hKp + E.val + (equalCharacteristicTransportedLubinTateRestrictNormalHom + K p ϖ hϖ hmn σ x) = + L.val (σ (IntermediateField.inclusion hEL x)) := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + let hKq : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + let L := equalCharacteristicLubinTateLevelField F n + let : Algebra B E := + equalCharacteristicLubinTateLevelAlgebra F m + let : Algebra B L := + equalCharacteristicLubinTateLevelAlgebra F n + let hEL : E ≤ L := + equalCharacteristicLubinTateLevelField_mono F hmn + let : IsGalois B E := + equalCharacteristicLubinTateLevelField_isGalois F m + let restrictB := + intermediateFieldRestrictNormalHom E L hEL + let : CharP K p := hKp + let : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ m + let : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + let qE := + equalCharacteristicTransportedLubinTateGaloisEquiv + K p ϖ hϖ m + let qL := + equalCharacteristicTransportedLubinTateGaloisEquiv + K p ϖ hϖ n + have hrestrict : + E.val (restrictB (qL.symm σ) x) = + L.val (qL.symm σ (IntermediateField.inclusion hEL x)) := + intermediateFieldRestrictNormalHom_apply_val + E L hEL (qL.symm σ) x + have hqL : + L.val (qL.symm σ (IntermediateField.inclusion hEL x)) = + L.val (σ (IntermediateField.inclusion hEL x)) := by + have h := + congrArg + (fun τ : Gal(L/K) => + L.val (τ (IntermediateField.inclusion hEL x))) + (qL.apply_symm_apply σ) + rw [equalCharacteristicTransportedLubinTateGaloisEquiv_apply] at h + exact h + change E.val (qE (restrictB (qL.symm σ)) x) = + L.val (σ (IntermediateField.inclusion hEL x)) + rw [equalCharacteristicTransportedLubinTateGaloisEquiv_apply] + exact hrestrict.trans hqL + +/-- The Galois-group identifications at two levels commute with restriction +between those levels. -/ +theorem + equalCharacteristicTransportedLubinTateGaloisEquiv_restrict + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + {m n : ℕ} (hmn : m ≤ n) + (σ : + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let L := equalCharacteristicLubinTateLevelField F n + letI : Algebra B L := + equalCharacteristicLubinTateLevelAlgebra F n + Gal(L/B)) : + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + let L := equalCharacteristicLubinTateLevelField F n + letI : Algebra B E := + equalCharacteristicLubinTateLevelAlgebra F m + letI : Algebra B L := + equalCharacteristicLubinTateLevelAlgebra F n + letI : CharP K p := hKp + letI : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ m + letI : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let hEL : E ≤ L := + equalCharacteristicLubinTateLevelField_mono F hmn + letI : CharP K p := hKp + equalCharacteristicTransportedLubinTateRestrictNormalHom + K p ϖ hϖ hmn + (equalCharacteristicTransportedLubinTateGaloisEquiv + K p ϖ hϖ n σ) = + equalCharacteristicTransportedLubinTateGaloisEquiv + K p ϖ hϖ m + (intermediateFieldRestrictNormalHom E L hEL σ) := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + let hKq : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + let L := equalCharacteristicLubinTateLevelField F n + let : Algebra B E := + equalCharacteristicLubinTateLevelAlgebra F m + let : Algebra B L := + equalCharacteristicLubinTateLevelAlgebra F n + let hEL : E ≤ L := + equalCharacteristicLubinTateLevelField_mono F hmn + let : IsGalois B E := + equalCharacteristicLubinTateLevelField_isGalois F m + let : CharP K p := hKp + let : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ m + let : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + apply AlgEquiv.ext + intro x + apply E.val.injective + calc + E.val + (equalCharacteristicTransportedLubinTateRestrictNormalHom + K p ϖ hϖ hmn + (equalCharacteristicTransportedLubinTateGaloisEquiv + K p ϖ hϖ n σ) x) = + L.val + (equalCharacteristicTransportedLubinTateGaloisEquiv + K p ϖ hϖ n σ + (IntermediateField.inclusion hEL x)) := + equalCharacteristicTransportedLubinTateRestrictNormalHom_apply_val + K p ϖ hϖ hmn _ x + _ = L.val (σ (IntermediateField.inclusion hEL x)) := by + rw [equalCharacteristicTransportedLubinTateGaloisEquiv_apply] + _ = + E.val + (intermediateFieldRestrictNormalHom E L hEL σ x) := + (intermediateFieldRestrictNormalHom_apply_val + E L hEL σ x).symm + _ = + E.val + (equalCharacteristicTransportedLubinTateGaloisEquiv + K p ϖ hϖ m + (intermediateFieldRestrictNormalHom E L hEL σ) x) := by + rw [equalCharacteristicTransportedLubinTateGaloisEquiv_apply] + +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedRealFilteredComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedRealFilteredComparison.lean new file mode 100644 index 0000000000..d0f809f606 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedRealFilteredComparison.lean @@ -0,0 +1,679 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicRealFilteredComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedArtinComparison +/-! +# Real filtered reciprocity on transported Lubin--Tate levels + +The integral target-field comparison is extended to every nonnegative real +index. The upper filtration is transported from the Laurent model, while +the zeroth and terminal Artin groups use the exact transported norm subgroup. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries ValuativeRel + +namespace LocalClassFieldTheory + +open RamificationTheory.LocalField +open LubinTate + +open LocalClassFieldTheory +open LocalFieldTheory +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.IsNonarchimedeanLocalField +open LubinTate.EqualCharacteristic + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The target-field upper ramification group at index zero is full on a +transported Lubin--Tate level. -/ +theorem + equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_zero_eq_top + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (n : ℕ) : + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let L := equalCharacteristicLubinTateLevelField F n + letI : ValuativeRel B := + equalCharacteristicLaurentValuativeRel F + letI : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + letI : Algebra B L := + equalCharacteristicLubinTateLevelAlgebra F n + letI : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + letI : IsGalois B L := + equalCharacteristicLubinTateLevelField_isGalois F n + letI : CharP K p := hKp + letI : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + letI : FiniteDimensional K L := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ n + letI : IsGalois K L := + equalCharacteristicTransportedLubinTateLevel_isGalois + K p ϖ hϖ n + localUpperRamificationGroup K L 0 = ⊤ := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let L := equalCharacteristicLubinTateLevelField F n + let : ValuativeRel B := + equalCharacteristicLaurentValuativeRel F + let : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + let finBL : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + let upperB := + @localUpperRamificationGroup B L + inferInstance inferInstance + inferInstance finBL inferInstance + inferInstance inferInstance inferInstance + have hSource : upperB 0 = ⊤ := by + simpa only [upperB, F, B, L] using + equalCharacteristicLubinTateLocalUpperRamificationGroup_zero_eq_top + F n + let algBL : Algebra B L := + equalCharacteristicLubinTateLevelAlgebra F n + let : CharP K p := hKp + let algKL : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + let : Module K L := Algebra.toModule + let galKL : IsGalois K L := + equalCharacteristicTransportedLubinTateLevel_isGalois + K p ϖ hϖ n + let finKL : FiniteDimensional K L := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ n + let upperK := + @localUpperRamificationGroup K L + inferInstance inferInstance + algKL finKL galKL + inferInstance inferInstance inferInstance + let q := + equalCharacteristicTransportedLubinTateGaloisEquiv + K p ϖ hϖ n + have hMap : + Subgroup.map q.toMonoidHom (upperB 0) = upperK 0 := by + simpa only [upperB, upperK, q, F, B, L] using + equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_map_eq + K p (hKp := hKp) ϖ hϖ n 0 + change upperK 0 = ⊤ + calc + upperK 0 = Subgroup.map q.toMonoidHom (upperB 0) := hMap.symm + _ = _ := congrArg (Subgroup.map q.toMonoidHom) hSource + _ = ⊤ := Subgroup.map_top_of_surjective q.toMonoidHom q.surjective + +private theorem principalUnitsImage_zero_eq_top_of_uniformizer_zpowers_le_ker + {G : Type} [Group G] + (φ : Kˣ →* G) + (hφ : Function.Surjective φ) + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (hϖKer : + Subgroup.zpowers ϖ ≤ + φ.ker) : + (LocalFieldTheory.fieldPrincipalUnits K 0).map + φ = ⊤ := by + apply top_unique + intro σ _ + obtain ⟨x, hx⟩ := hφ σ + obtain ⟨u, hdecomp⟩ := + exists_integerUnit_mul_uniformizer_zpow K ϖ hϖ x + have hpowKer : + ϖ ^ valuationMap K (Additive.ofMul x) ∈ + φ.ker := + hϖKer (Subgroup.zpow_mem_zpowers ϖ _) + have hpow : + φ (ϖ ^ valuationMap K (Additive.ofMul x)) = 1 := + MonoidHom.mem_ker.mp hpowKer + refine ⟨integerUnitsToFieldUnits K u, ?_, ?_⟩ + · unfold LocalFieldTheory.fieldPrincipalUnits + exact ⟨u, by simp, rfl⟩ + · rw [← hx, ← hdecomp, map_mul, hpow, mul_one] + +/-- The target-field Artin image of the valuation-ring unit group `U^0` is +the full Galois group of a transported Lubin--Tate level. -/ +theorem + equalCharacteristicTransportedLubinTateArtinPrincipalUnitsImage_zero_eq_top + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (n : ℕ) : + let F := equalCharacteristicTargetLocalField K + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let L := equalCharacteristicLubinTateLevelField F n + letI : CharP K p := hKp + letI : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + letI : FiniteDimensional K L := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ n + letI : IsAbelianGalois K L := + equalCharacteristicTransportedLubinTateLevel_isAbelianGalois + K p ϖ hϖ n + (LocalFieldTheory.fieldPrincipalUnits K 0).map + (abelianLocalArtinMonoidHom K L) = ⊤ := by + let F := equalCharacteristicTargetLocalField K + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let L := equalCharacteristicLubinTateLevelField F n + let : CharP K p := hKp + let : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + let : FiniteDimensional K L := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ n + let : IsAbelianGalois K L := + equalCharacteristicTransportedLubinTateLevel_isAbelianGalois + K p ϖ hϖ n + let φ : Kˣ →* Gal(L/K) := + abelianLocalArtinMonoidHom K L + have hφ : Function.Surjective φ := by + change Function.Surjective (abelianLocalArtinMonoidHom K L) + exact abelianLocalArtinMonoidHom_surjective K L + have hNorm : + Subgroup.zpowers ϖ ≤ + localNormSubgroup K L := by + change + Subgroup.zpowers ϖ ≤ + equalCharacteristicTransportedLubinTateNormSubgroup + K p ϖ hϖ n + rw [ + equalCharacteristicTransportedLubinTateNormSubgroup_eq_uniformizerPrincipalSubgroup] + simp [LocalFieldTheory.uniformizerPrincipalSubgroup] + have hφKer : φ.ker = localNormSubgroup K L := by + change + (abelianLocalArtinMonoidHom K L).ker = + localNormSubgroup K L + exact abelianLocalArtinMonoidHom_ker K L + have hϖKer : Subgroup.zpowers ϖ ≤ φ.ker := by + rw [hφKer] + exact hNorm + exact + principalUnitsImage_zero_eq_top_of_uniformizer_zpowers_le_ker + K φ hφ ϖ hϖ hϖKer + +/-- The zeroth target-field Artin principal-unit group is full. -/ +theorem + equalCharacteristicTransportedLubinTateArtinPrincipalUnitGroup_zero_eq_top + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (n : ℕ) : + let F := equalCharacteristicTargetLocalField K + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let L := equalCharacteristicLubinTateLevelField F n + letI : CharP K p := hKp + letI : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + letI : FiniteDimensional K L := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ n + letI : IsAbelianGalois K L := + equalCharacteristicTransportedLubinTateLevel_isAbelianGalois + K p ϖ hϖ n + artinPrincipalUnitGroup K L 0 = ⊤ := by + simpa only [artinPrincipalUnitGroup] using + equalCharacteristicTransportedLubinTateArtinPrincipalUnitsImage_zero_eq_top + K p ϖ hϖ n + +/-- At the last visible integral index, the target-field upper +ramification group is trivial. -/ +theorem + equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_succ_eq_bot + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (n : ℕ) : + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let L := equalCharacteristicLubinTateLevelField F n + letI : ValuativeRel B := + equalCharacteristicLaurentValuativeRel F + letI : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + letI : Algebra B L := + equalCharacteristicLubinTateLevelAlgebra F n + letI : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + letI : IsGalois B L := + equalCharacteristicLubinTateLevelField_isGalois F n + letI : CharP K p := hKp + letI : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + letI : FiniteDimensional K L := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ n + letI : IsGalois K L := + equalCharacteristicTransportedLubinTateLevel_isGalois + K p ϖ hϖ n + localUpperRamificationGroup K L ((n + 1 : ℕ) : ℝ) = ⊥ := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let L := equalCharacteristicLubinTateLevelField F n + let : ValuativeRel B := + equalCharacteristicLaurentValuativeRel F + let : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + let finBL : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + let upperB := + @localUpperRamificationGroup B L + inferInstance inferInstance + inferInstance finBL inferInstance + inferInstance inferInstance inferInstance + have hSource : upperB ((n + 1 : ℕ) : ℝ) = ⊥ := by + simpa only [upperB, F, B, L] using + equalCharacteristicLubinTateLocalUpperRamificationGroup_succ_eq_bot + F n + let algBL : Algebra B L := + equalCharacteristicLubinTateLevelAlgebra F n + let : CharP K p := hKp + let algKL : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + let : Module K L := Algebra.toModule + let galKL : IsGalois K L := + equalCharacteristicTransportedLubinTateLevel_isGalois + K p ϖ hϖ n + let finKL : FiniteDimensional K L := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ n + let upperK := + @localUpperRamificationGroup K L + inferInstance inferInstance + algKL finKL galKL + inferInstance inferInstance inferInstance + let q := + equalCharacteristicTransportedLubinTateGaloisEquiv + K p ϖ hϖ n + have hMap : + Subgroup.map q.toMonoidHom (upperB ((n + 1 : ℕ) : ℝ)) = + upperK ((n + 1 : ℕ) : ℝ) := by + simpa only [upperB, upperK, q, F, B, L] using + equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_map_eq + K p (hKp := hKp) ϖ hϖ n ((n + 1 : ℕ) : ℝ) + change upperK ((n + 1 : ℕ) : ℝ) = ⊥ + rw [Subgroup.eq_bot_iff_forall] + intro σ hσ + have hσ' : + σ ∈ Subgroup.map q.toMonoidHom + (upperB ((n + 1 : ℕ) : ℝ)) := by + rw [hMap] + exact hσ + rcases hσ' with ⟨τ, hτ, rfl⟩ + have hτ' : τ = 1 := by + rw [hSource] at hτ + exact hτ + rw [hτ', map_one] + +/-- The target-field Artin principal-unit group at level `n+1` is +trivial. -/ +theorem + equalCharacteristicTransportedLubinTateArtinPrincipalUnitGroup_succ_eq_bot + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (n : ℕ) : + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let L := equalCharacteristicLubinTateLevelField F n + letI : Algebra B L := + equalCharacteristicLubinTateLevelAlgebra F n + letI : CharP K p := hKp + letI : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + letI : FiniteDimensional K L := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ n + letI : IsAbelianGalois K L := + equalCharacteristicTransportedLubinTateLevel_isAbelianGalois + K p ϖ hϖ n + artinPrincipalUnitGroup K L (n + 1) = ⊥ := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let L := equalCharacteristicLubinTateLevelField F n + let : Algebra B L := + equalCharacteristicLubinTateLevelAlgebra F n + let : CharP K p := hKp + let : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + let : FiniteDimensional K L := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ n + let : IsAbelianGalois K L := + equalCharacteristicTransportedLubinTateLevel_isAbelianGalois + K p ϖ hϖ n + change + (LocalFieldTheory.fieldPrincipalUnits K (n + 1)).map + (abelianLocalArtinMonoidHom K L) = ⊥ + exact + (transportedLubinTateArtinPrincipalUnitsImage_eq_upperRamificationGroup + K p ϖ hϖ n (n + 1) (by omega) (by omega)).trans + (equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_succ_eq_bot + K p ϖ hϖ n) + +/-- On the visible positive range, the target-field upper filtration is the +natural-ceiling step extension of its integral values. -/ +theorem + equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_eq_natCeil + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (n : ℕ) (t : ℝ) + (hk : 1 ≤ ⌈t⌉₊) (hkn : ⌈t⌉₊ ≤ n + 1) : + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let L := equalCharacteristicLubinTateLevelField F n + letI : ValuativeRel B := + equalCharacteristicLaurentValuativeRel F + letI : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + letI : Algebra B L := + equalCharacteristicLubinTateLevelAlgebra F n + letI : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + letI : IsGalois B L := + equalCharacteristicLubinTateLevelField_isGalois F n + letI : CharP K p := hKp + letI : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + letI : FiniteDimensional K L := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ n + letI : IsGalois K L := + equalCharacteristicTransportedLubinTateLevel_isGalois + K p ϖ hϖ n + localUpperRamificationGroup K L t = + localUpperRamificationGroup K L (⌈t⌉₊ : ℝ) := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let L := equalCharacteristicLubinTateLevelField F n + let : ValuativeRel B := + equalCharacteristicLaurentValuativeRel F + let : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + let finBL : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + let upperB := + @localUpperRamificationGroup B L + inferInstance inferInstance + inferInstance finBL inferInstance + inferInstance inferInstance inferInstance + have hSource : + upperB t = upperB (⌈t⌉₊ : ℝ) := by + calc + upperB t = + equalCharacteristicLubinTateRealUpperRamificationGroup + F n t := by + simpa only [upperB, F, B, L] using + (equalCharacteristicLubinTateRealUpperRamificationGroup_eq_localUpperRamificationGroup + F n t).symm + _ = + equalCharacteristicLubinTateRealUpperRamificationGroup + F n (⌈t⌉₊ : ℝ) := + equalCharacteristicLubinTateRealUpperRamificationGroup_eq_natCeil + F n t hk hkn + _ = upperB (⌈t⌉₊ : ℝ) := by + simpa only [upperB, F, B, L] using + equalCharacteristicLubinTateRealUpperRamificationGroup_eq_localUpperRamificationGroup + F n (⌈t⌉₊ : ℝ) + let algBL : Algebra B L := + equalCharacteristicLubinTateLevelAlgebra F n + let : CharP K p := hKp + let algKL : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + let : Module K L := Algebra.toModule + let galKL : IsGalois K L := + equalCharacteristicTransportedLubinTateLevel_isGalois + K p ϖ hϖ n + let finKL : FiniteDimensional K L := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ n + let upperK := + @localUpperRamificationGroup K L + inferInstance inferInstance + algKL finKL galKL + inferInstance inferInstance inferInstance + let q := + equalCharacteristicTransportedLubinTateGaloisEquiv + K p ϖ hϖ n + have hMap : + Subgroup.map q.toMonoidHom (upperB t) = upperK t := by + simpa only [upperB, upperK, q, F, B, L] using + equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_map_eq + K p (hKp := hKp) ϖ hϖ n t + have hMapCeil : + Subgroup.map q.toMonoidHom (upperB (⌈t⌉₊ : ℝ)) = + upperK (⌈t⌉₊ : ℝ) := by + simpa only [upperB, upperK, q, F, B, L] using + equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_map_eq + K p (hKp := hKp) ϖ hϖ n (⌈t⌉₊ : ℝ) + change upperK t = upperK (⌈t⌉₊ : ℝ) + calc + upperK t = Subgroup.map q.toMonoidHom (upperB t) := hMap.symm + _ = Subgroup.map q.toMonoidHom (upperB (⌈t⌉₊ : ℝ)) := by + rw [hSource] + _ = upperK (⌈t⌉₊ : ℝ) := hMapCeil + +/-- Beyond the last visible level, the target-field Artin step group is +trivial. -/ +theorem + equalCharacteristicTransportedLubinTateArtinPrincipalUnitStepGroup_eq_bot_of_level_lt_ceil + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (n : ℕ) (t : ℝ) (hlevel : n + 1 < ⌈t⌉₊) : + let F := equalCharacteristicTargetLocalField K + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let L := equalCharacteristicLubinTateLevelField F n + letI : CharP K p := hKp + letI : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + letI : FiniteDimensional K L := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ n + letI : IsAbelianGalois K L := + equalCharacteristicTransportedLubinTateLevel_isAbelianGalois + K p ϖ hϖ n + artinPrincipalUnitStepGroup K L t = ⊥ := by + let F := equalCharacteristicTargetLocalField K + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let L := equalCharacteristicLubinTateLevelField F n + let : CharP K p := hKp + let : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + let : FiniteDimensional K L := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ n + let : IsAbelianGalois K L := + equalCharacteristicTransportedLubinTateLevel_isAbelianGalois + K p ϖ hϖ n + unfold artinPrincipalUnitStepGroup + RamificationTheory.natCeilStepFiltration + apply le_antisymm + · have hle := + artinPrincipalUnitGroup_antitone K L (Nat.le_of_lt hlevel) + rw [ + equalCharacteristicTransportedLubinTateArtinPrincipalUnitGroup_succ_eq_bot + K p ϖ hϖ n] at hle + exact hle + · exact bot_le + +/-- Beyond the last visible level, the target-field upper ramification +group is trivial. -/ +theorem + transportedLubinTateUpperRamificationGroup_eq_bot_of_level_lt_ceil + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (n : ℕ) (t : ℝ) (hlevel : n + 1 < ⌈t⌉₊) : + let F := equalCharacteristicTargetLocalField K + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let L := equalCharacteristicLubinTateLevelField F n + letI : CharP K p := hKp + letI : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + letI : FiniteDimensional K L := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ n + letI : IsGalois K L := + equalCharacteristicTransportedLubinTateLevel_isGalois + K p ϖ hϖ n + localUpperRamificationGroup K L t = ⊥ := by + let F := equalCharacteristicTargetLocalField K + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let L := equalCharacteristicLubinTateLevelField F n + let : CharP K p := hKp + let : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + let : FiniteDimensional K L := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ n + let : IsGalois K L := + equalCharacteristicTransportedLubinTateLevel_isGalois + K p ϖ hϖ n + have ht : (((n + 1 : ℕ) : ℝ)) ≤ t := by + have hsucc : n + 1 + 1 ≤ ⌈t⌉₊ := by + omega + exact (Nat.add_one_le_ceil_iff.mp hsucc).le + apply le_antisymm + · have hle := localUpperRamificationGroup_antitone K L ht + rw [ + equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_succ_eq_bot + K p ϖ hϖ n] at hle + exact hle + · exact bot_le + +/-- Real filtered local reciprocity for every transported +equal-characteristic Lubin--Tate level. -/ +theorem + transportedLubinTateArtinPrincipalUnitStep_eq_upperRamificationGroup + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (n : ℕ) (t : ℝ) (ht : 0 ≤ t) : + let F := equalCharacteristicTargetLocalField K + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let L := equalCharacteristicLubinTateLevelField F n + letI : CharP K p := hKp + letI : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + letI : FiniteDimensional K L := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ n + letI : IsAbelianGalois K L := + equalCharacteristicTransportedLubinTateLevel_isAbelianGalois + K p ϖ hϖ n + artinPrincipalUnitStepGroup K L t = + localUpperRamificationGroup K L t := by + let F := equalCharacteristicTargetLocalField K + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let L := equalCharacteristicLubinTateLevelField F n + let k : ℕ := ⌈t⌉₊ + let : CharP K p := hKp + let : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + let : FiniteDimensional K L := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ n + let : IsAbelianGalois K L := + equalCharacteristicTransportedLubinTateLevel_isAbelianGalois + K p ϖ hϖ n + by_cases hkzero : k = 0 + · have hceilzero : ⌈t⌉₊ = 0 := by + simpa only [k] using hkzero + have htzero : t = 0 := + le_antisymm (Nat.ceil_eq_zero.mp hceilzero) ht + subst t + calc + artinPrincipalUnitStepGroup K L (0 : ℝ) = ⊤ := by + simpa [artinPrincipalUnitStepGroup, + RamificationTheory.natCeilStepFiltration] using + equalCharacteristicTransportedLubinTateArtinPrincipalUnitGroup_zero_eq_top + K p ϖ hϖ n + _ = localUpperRamificationGroup K L 0 := + (equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_zero_eq_top + K p ϖ hϖ n).symm + · have hk : 1 ≤ k := by + omega + by_cases hkn : k ≤ n + 1 + · have hLocalStep : + localUpperRamificationGroup K L t = + localUpperRamificationGroup K L (k : ℝ) := by + simpa only [k] using + equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_eq_natCeil + K p ϖ hϖ n t + (by simpa only [k] using hk) + (by simpa only [k] using hkn) + change + (LocalFieldTheory.fieldPrincipalUnits K k).map + (abelianLocalArtinMonoidHom K L) = + localUpperRamificationGroup K L t + exact + (transportedLubinTateArtinPrincipalUnitsImage_eq_upperRamificationGroup + K p ϖ hϖ n k hk hkn).trans hLocalStep.symm + · have hlevel : n + 1 < ⌈t⌉₊ := by + dsimp only [k] at hkn + omega + exact + (equalCharacteristicTransportedLubinTateArtinPrincipalUnitStepGroup_eq_bot_of_level_lt_ceil + K p ϖ hϖ n t hlevel).trans + (transportedLubinTateUpperRamificationGroup_eq_bot_of_level_lt_ceil + K p ϖ hϖ n t hlevel).symm + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRamification.lean new file mode 100644 index 0000000000..4104967c18 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRamification.lean @@ -0,0 +1,414 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LaurentPrincipalUnitTransport +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedPrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedPolynomialEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizerNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusBaseEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldCoefficientDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPowerBasis +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPrimitive +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectBracketAtCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracketRecursion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectTargetLevelEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFirstIdentity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFrobeniusFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaIteration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaAtCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaLocalInverse +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FreeRankOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelFieldTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.UnitQuotientGalois +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.AmbientBracketAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.DivisionModuleEndomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateEndomorphism +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CoefficientFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CompletedUnramifiedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.ContractingEquation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.LaurentSeriesFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFrobeniusFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitsNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.LevelAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.StandardSubgroupNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitQuotientCard +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaCoefficients +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaUniqueness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.RealIndexSteps +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core +/-! +# Upper ramification groups on transported equal-characteristic levels + +The explicit Lubin--Tate level field is unchanged when its Laurent-series +base algebra is transported to an arbitrary equal-characteristic local +field. The normalized Laurent equivalence preserves the valuation rings, +so the general base-field transport theorem identifies the two upper +ramification filtrations. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries ValuativeRel + +namespace LubinTate + +open LocalFieldTheory +open RamificationTheory.LocalField +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.IsNonarchimedeanLocalField +open LubinTate.EqualCharacteristic + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The two algebra maps from the Laurent model and the target local field +to a transported Lubin--Tate level have the same image. -/ +theorem equalCharacteristicTransportedLubinTate_algebraMap_compat + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (n : ℕ) + (x : + let F := equalCharacteristicTargetLocalField K + F.residueField⸨X⸩) : + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F n + letI : Algebra B E := + equalCharacteristicLubinTateLevelAlgebra F n + letI : CharP K p := hKp + letI : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + algebraMap K E + (equalCharacteristicTargetLaurentRingEquiv K p ϖ hϖ x) = + algebraMap B E x := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F n + let : Algebra B E := + equalCharacteristicLubinTateLevelAlgebra F n + let : CharP K p := hKp + let : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + have hcomp := + DFunLike.congr_fun + (equalCharacteristicTransportedLubinTateLevelAlgebra_comp + K p ϖ hϖ n) x + simpa using hcomp + +/-- Identification of the Galois group over the Laurent base with the +Galois group for the transported target-field algebra. It leaves every +underlying automorphism of the level field unchanged. -/ +noncomputable def equalCharacteristicTransportedLubinTateGaloisEquiv + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (n : ℕ) : + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F n + letI : Algebra B E := + equalCharacteristicLubinTateLevelAlgebra F n + letI : CharP K p := hKp + letI : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + Gal(E/B) ≃* Gal(E/K) := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F n + letI : Algebra B E := + equalCharacteristicLubinTateLevelAlgebra F n + letI : CharP K p := hKp + letI : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + exact + galoisGroupEquivOfBaseRingEquiv B K E + (equalCharacteristicTargetLaurentRingEquiv K p ϖ hϖ) + (equalCharacteristicTransportedLubinTate_algebraMap_compat + K p ϖ hϖ n) + +@[simp] +theorem equalCharacteristicTransportedLubinTateGaloisEquiv_apply + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (n : ℕ) + (σ : + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F n + letI : Algebra B E := + equalCharacteristicLubinTateLevelAlgebra F n + Gal(E/B)) + (x : + let F := equalCharacteristicTargetLocalField K + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + equalCharacteristicLubinTateLevelField F n) : + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F n + letI : Algebra B E := + equalCharacteristicLubinTateLevelAlgebra F n + letI : CharP K p := hKp + letI : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + equalCharacteristicTransportedLubinTateGaloisEquiv + K p ϖ hϖ n σ x = + σ x := by + rfl + +private theorem + equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_map_eq_baseChange + [Fact + (equalCharacteristicTargetLocalField K).residueCharacteristic.Prime] + [CharP K + (equalCharacteristicTargetLocalField K).residueCharacteristic] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (n : ℕ) (t : ℝ) : + let F := equalCharacteristicTargetLocalField K + let q := F.residueCharacteristic + let B := F.residueField⸨X⸩ + let E := equalCharacteristicLubinTateLevelField F n + letI : ValuativeRel B := + equalCharacteristicLaurentValuativeRel F + letI : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + letI algBE : Algebra B E := + equalCharacteristicLubinTateLevelAlgebra F n + letI finBE : FiniteDimensional B E := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + letI galBE : IsGalois B E := + equalCharacteristicLubinTateLevelField_isGalois F n + let upperB := + @localUpperRamificationGroup B E + inferInstance inferInstance + algBE finBE galBE + inferInstance inferInstance inferInstance + letI algKE : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra + K q ϖ hϖ n + letI finKE : FiniteDimensional K E := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K q ϖ hϖ n + letI galKE : IsGalois K E := + equalCharacteristicTransportedLubinTateLevel_isGalois + K q ϖ hϖ n + let upperK := + @localUpperRamificationGroup K E + inferInstance inferInstance + algKE finKE galKE + inferInstance inferInstance inferInstance + Subgroup.map + (@galoisGroupEquivOfBaseRingEquiv + B K E + inferInstance inferInstance inferInstance + algBE algKE + (equalCharacteristicTargetLaurentRingEquiv K q ϖ hϖ) + (equalCharacteristicTransportedLubinTate_algebraMap_compat + K q ϖ hϖ n)).toMonoidHom + (upperB t) = + upperK t := by + let F := equalCharacteristicTargetLocalField K + let q := F.residueCharacteristic + let B := F.residueField⸨X⸩ + let E := equalCharacteristicLubinTateLevelField F n + let : ValuativeRel B := + equalCharacteristicLaurentValuativeRel F + let : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + let algBE : Algebra B E := + equalCharacteristicLubinTateLevelAlgebra F n + let finBE : FiniteDimensional B E := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + let galBE : IsGalois B E := + equalCharacteristicLubinTateLevelField_isGalois F n + let algKE : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra + K q ϖ hϖ n + let finKE : FiniteDimensional K E := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K q ϖ hϖ n + let galKE : IsGalois K E := + equalCharacteristicTransportedLubinTateLevel_isGalois + K q ϖ hϖ n + dsimp only + convert + @localUpperRamificationGroup_map_baseRingEquiv + B K E + inferInstance inferInstance inferInstance + algBE algKE finBE finKE galBE galKE + inferInstance inferInstance inferInstance + inferInstance inferInstance inferInstance + (equalCharacteristicTargetLaurentRingEquiv K q ϖ hϖ) + (equalCharacteristicTransportedLubinTate_algebraMap_compat + K q ϖ hϖ n) + (equalCharacteristicTargetLaurentRingEquiv_val_le_one_iff + K q ϖ hϖ) t using 1 + +private theorem + equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_map_eq_residueCharacteristic + [Fact + (equalCharacteristicTargetLocalField K).residueCharacteristic.Prime] + [CharP K + (equalCharacteristicTargetLocalField K).residueCharacteristic] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (n : ℕ) (t : ℝ) : + let F := equalCharacteristicTargetLocalField K + let q := F.residueCharacteristic + let B := F.residueField⸨X⸩ + let E := equalCharacteristicLubinTateLevelField F n + letI : ValuativeRel B := + equalCharacteristicLaurentValuativeRel F + letI : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + letI algBE : Algebra B E := + equalCharacteristicLubinTateLevelAlgebra F n + letI finBE : FiniteDimensional B E := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + letI galBE : IsGalois B E := + equalCharacteristicLubinTateLevelField_isGalois F n + let upperB := + @localUpperRamificationGroup B E + (by infer_instance) (by infer_instance) + algBE finBE galBE + (by infer_instance) (by infer_instance) (by infer_instance) + letI algKE : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra + K q ϖ hϖ n + letI finKE : FiniteDimensional K E := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K q ϖ hϖ n + letI galKE : IsGalois K E := + equalCharacteristicTransportedLubinTateLevel_isGalois + K q ϖ hϖ n + let upperK := + @localUpperRamificationGroup K E + (by infer_instance) (by infer_instance) + algKE finKE galKE + (by infer_instance) (by infer_instance) (by infer_instance) + Subgroup.map + (equalCharacteristicTransportedLubinTateGaloisEquiv + K q ϖ hϖ n).toMonoidHom + (upperB t) = + upperK t := by + simpa only [equalCharacteristicTransportedLubinTateGaloisEquiv] using + equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_map_eq_baseChange + K ϖ hϖ n t + +/-- The normalized base-field equivalence transports the canonical local +upper ramification group on every explicit Lubin--Tate level. -/ +theorem + equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_map_eq + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (n : ℕ) (t : ℝ) : + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F n + letI : ValuativeRel B := + equalCharacteristicLaurentValuativeRel F + letI : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + letI : FiniteDimensional B E := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + let upperB := localUpperRamificationGroup B E + letI : Algebra B E := + equalCharacteristicLubinTateLevelAlgebra F n + letI : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p (hKp := hKp) ϖ hϖ n + letI : Module K E := Algebra.toModule + letI : IsGalois K E := + equalCharacteristicTransportedLubinTateLevel_isGalois + K p (hKp := hKp) ϖ hϖ n + letI : FiniteDimensional K E := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p (hKp := hKp) ϖ hϖ n + let upperK := localUpperRamificationGroup K E + Subgroup.map + (equalCharacteristicTransportedLubinTateGaloisEquiv + K p (hKp := hKp) ϖ hϖ n).toMonoidHom + (upperB t) = + upperK t := by + let F := equalCharacteristicTargetLocalField K + have hp : F.residueCharacteristic = p := + F.residueCharacteristic_eq_of_charP p + ((Fact.out : Nat.Prime p).ne_zero) + subst p + convert + equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_map_eq_residueCharacteristic + K ϖ hϖ n t using 1 + +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRestriction.lean new file mode 100644 index 0000000000..6029a2dae9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRestriction.lean @@ -0,0 +1,197 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedLevelTower +/-! +# Restriction kernels for transported upper ramification groups + +At an integral upper index, the explicit Laurent Lubin--Tate upper group is +a restriction kernel. The base-field transport equivalences commute with +level restriction, so the same kernel description holds for the +transported target-field algebra. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries ValuativeRel + +namespace LocalClassFieldTheory + +open RamificationTheory.LocalField +open LubinTate + +open LocalClassFieldTheory +open LocalFieldTheory +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.IsNonarchimedeanLocalField +open LubinTate.EqualCharacteristic +open RamificationTheory + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- For `1 ≤ k ≤ n + 1`, the `k`-th upper ramification group of the +transported level `n + 1` is the kernel of restriction to level `k`. -/ +theorem + equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_eq_restrictKer + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (n k : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) : + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let m := k - 1 + let E := equalCharacteristicLubinTateLevelField F m + let L := equalCharacteristicLubinTateLevelField F n + letI : ValuativeRel B := + equalCharacteristicLaurentValuativeRel F + letI : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + letI : Algebra B E := + equalCharacteristicLubinTateLevelAlgebra F m + letI : Algebra B L := + equalCharacteristicLubinTateLevelAlgebra F n + letI : IsGalois B E := + equalCharacteristicLubinTateLevelField_isGalois F m + letI : IsGalois B L := + equalCharacteristicLubinTateLevelField_isGalois F n + letI : FiniteDimensional B E := + equalCharacteristicLubinTateLevelField_finiteDimensional F m + letI : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + letI : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p (hKp := hKp) ϖ hϖ m + letI : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p (hKp := hKp) ϖ hϖ n + letI : IsGalois K E := + equalCharacteristicTransportedLubinTateLevel_isGalois + K p (hKp := hKp) ϖ hϖ m + letI : IsGalois K L := + equalCharacteristicTransportedLubinTateLevel_isGalois + K p (hKp := hKp) ϖ hϖ n + letI : FiniteDimensional K E := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p (hKp := hKp) ϖ hϖ m + letI : FiniteDimensional K L := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p (hKp := hKp) ϖ hϖ n + localUpperRamificationGroup K L (k : ℝ) = + (equalCharacteristicTransportedLubinTateRestrictNormalHom + K p (hKp := hKp) ϖ hϖ (by omega : m ≤ n)).ker := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + let hKq : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let m := k - 1 + let E := equalCharacteristicLubinTateLevelField F m + let L := equalCharacteristicLubinTateLevelField F n + let : ValuativeRel B := + equalCharacteristicLaurentValuativeRel F + let : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + let : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + let upperB := localUpperRamificationGroup B L + let : Algebra B E := + equalCharacteristicLubinTateLevelAlgebra F m + let : Algebra B L := + equalCharacteristicLubinTateLevelAlgebra F n + let : IsGalois B E := + equalCharacteristicLubinTateLevelField_isGalois F m + let : IsGalois B L := + equalCharacteristicLubinTateLevelField_isGalois F n + let : FiniteDimensional B E := + equalCharacteristicLubinTateLevelField_finiteDimensional F m + have hmn : m ≤ n := by + dsimp only [m] + omega + let hEL : E ≤ L := + equalCharacteristicLubinTateLevelField_mono F hmn + let rB := intermediateFieldRestrictNormalHom E L hEL + have hRestrict : + equalCharacteristicLubinTateRealUpperRamificationGroup + F n (k : ℝ) = + rB.ker := by + simpa only [m, E, L, rB, hEL] using + equalCharacteristicLubinTateRealUpperRamificationGroup_eq_restrictKer + F n k hk hkn + have hSource : + upperB (k : ℝ) = rB.ker := + (equalCharacteristicLubinTateRealUpperRamificationGroup_eq_localUpperRamificationGroup + F n (k : ℝ)).symm.trans hRestrict + let : CharP K p := hKp + let : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ m + let : Algebra K L := + equalCharacteristicTransportedLubinTateLevelAlgebra + K p ϖ hϖ n + let : Module K L := Algebra.toModule + let : IsGalois K E := + equalCharacteristicTransportedLubinTateLevel_isGalois + K p ϖ hϖ m + let : IsGalois K L := + equalCharacteristicTransportedLubinTateLevel_isGalois + K p ϖ hϖ n + let : FiniteDimensional K E := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ m + let : FiniteDimensional K L := + equalCharacteristicTransportedLubinTateLevel_finiteDimensional + K p ϖ hϖ n + let upperK := localUpperRamificationGroup K L + let qE := + equalCharacteristicTransportedLubinTateGaloisEquiv + K p ϖ hϖ m + let qL := + equalCharacteristicTransportedLubinTateGaloisEquiv + K p ϖ hϖ n + let rK := + equalCharacteristicTransportedLubinTateRestrictNormalHom + K p ϖ hϖ hmn + have hcomm : + rK.comp qL.toMonoidHom = + qE.toMonoidHom.comp rB := by + apply MonoidHom.ext + intro σ + exact + equalCharacteristicTransportedLubinTateGaloisEquiv_restrict + K p ϖ hϖ hmn σ + have hkerMap : + rB.ker.map qL.toMonoidHom = rK.ker := + (Subgroup.map_symm_eq_iff_map_eq rB.ker (e := qL)).mp <| by + calc + rK.ker.map qL.symm.toMonoidHom = + (rK.comp qL.toMonoidHom).ker := + (MonoidHom.ker_comp_mulEquiv rK qL).symm + _ = (qE.toMonoidHom.comp rB).ker := + congrArg MonoidHom.ker hcomm + _ = rB.ker := MonoidHom.ker_mulEquiv_comp rB qE + have hMap : + Subgroup.map qL.toMonoidHom (upperB (k : ℝ)) = + upperK (k : ℝ) := by + exact + equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_map_eq + K p (hKp := hKp) ϖ hϖ n (k : ℝ) + change upperK (k : ℝ) = rK.ker + calc + upperK (k : ℝ) = + Subgroup.map qL.toMonoidHom (upperB (k : ℝ)) := hMap.symm + _ = Subgroup.map qL.toMonoidHom rB.ker := + congrArg (Subgroup.map qL.toMonoidHom) hSource + _ = rK.ker := hkerMap + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicUpperFiltration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicUpperFiltration.lean new file mode 100644 index 0000000000..c3a15c8579 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicUpperFiltration.lean @@ -0,0 +1,227 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.UnitQuotientGalois +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified +/-! +# Equal-characteristic Lubin--Tate upper filtration + +This file identifies the image of the `k`-th higher-unit subgroup under the +explicit finite-level Artin map `a ↦ [a⁻¹]` with the actual upper +ramification group `G^k`. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries PowerSeries + +universe u v + +namespace LocalClassFieldTheory + +open RamificationTheory.LocalField +open LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LubinTate.EqualCharacteristic + +variable {K : Type u} [Field K] + +private noncomputable def artinUnitParameter + (F : LocalField.{u, v} K) (n : ℕ) + (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicLubinTateUnitParameter F n := + equalCharacteristicLubinTateUnitParameterOfCoefficients F n + (Units.map (PowerSeries.constantCoeff (R := F.residueField)) a) + (fun i => PowerSeries.coeff (i + 1) + (a : F.residueField⟦X⟧)) + +private theorem artinUnitParameter_coeff + (F : LocalField.{u, v} K) (n : ℕ) + (a : F.residueField⟦X⟧ˣ) (j : ℕ) (hj : j ≤ n) : + PowerSeries.coeff j + (equalCharacteristicLubinTateUnitParameterSeries F n + (artinUnitParameter F n a)) = + PowerSeries.coeff j (a : F.residueField⟦X⟧) := by + cases j with + | zero => + rw [equalCharacteristicLubinTateUnitParameterSeries_coeff_zero] + change PowerSeries.constantCoeff (a : F.residueField⟦X⟧) = + PowerSeries.coeff 0 (a : F.residueField⟦X⟧) + exact (PowerSeries.coeff_zero_eq_constantCoeff_apply _).symm + | succ j => + have hjn : j < n := by omega + have hcoeff := + equalCharacteristicLubinTateUnitParameterSeries_coeff_succ + F n (artinUnitParameter F n a) ⟨j, hjn⟩ + change PowerSeries.coeff (j + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n + (artinUnitParameter F n a)) = + (artinUnitParameter F n a).higherCoeff ⟨j, hjn⟩ at hcoeff + rw [hcoeff] + rfl + +private theorem artinUnitParameter_reduction + (F : LocalField.{u, v} K) (n : ℕ) + (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicLubinTateUnitReduction F n + (equalCharacteristicLubinTateUnitParameterUnit F n + (artinUnitParameter F n a)) = + equalCharacteristicLubinTateUnitReduction F n a := by + apply Units.ext + change equalCharacteristicLubinTateTruncatedRingMk F n + (equalCharacteristicLubinTateUnitParameterSeries F n + (artinUnitParameter F n a)) = + equalCharacteristicLubinTateTruncatedRingMk F n + (a : F.residueField⟦X⟧) + rw [equalCharacteristicLubinTateTruncatedRingMk_eq_iff, + Ideal.mem_span_singleton] + apply PowerSeries.X_pow_dvd_iff.mpr + intro j hj + rw [map_sub, sub_eq_zero] + exact artinUnitParameter_coeff F n a j (Nat.lt_succ_iff.mp hj) + +private theorem artinUnitToGal_eq_parameter + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicLubinTateArtinUnitToGal F n a = + equalCharacteristicLubinTateUnitParameterToGal F n + (artinUnitParameter F n a⁻¹) := by + let p := artinUnitParameter F n a⁻¹ + let b := equalCharacteristicLubinTateUnitParameterUnit F n p + have hab : a * b ∈ + equalCharacteristicLubinTateHigherUnitSubgroup F n := by + change equalCharacteristicLubinTateUnitReduction F n (a * b) = 1 + rw [map_mul] + have hb : + equalCharacteristicLubinTateUnitReduction F n b = + equalCharacteristicLubinTateUnitReduction F n a⁻¹ := by + simpa [p, b] using artinUnitParameter_reduction F n a⁻¹ + rw [hb, map_inv, mul_inv_cancel] + have hprod : + equalCharacteristicLubinTateArtinUnitToGal F n a * + equalCharacteristicLubinTateArtinUnitToGal F n b = 1 := by + rw [← map_mul] + exact + (equalCharacteristicLubinTateArtinUnitToGal_eq_one_iff F n + (a * b)).2 hab + calc + equalCharacteristicLubinTateArtinUnitToGal F n a = + (equalCharacteristicLubinTateArtinUnitToGal F n b)⁻¹ := + eq_inv_of_mul_eq_one_left hprod + _ = equalCharacteristicLubinTateArtinUnitToGal F n b⁻¹ := by + exact + (map_inv (equalCharacteristicLubinTateArtinUnitToGal F n) b).symm + _ = equalCharacteristicLubinTateUnitParameterToGal F n p := by + simpa [b, equalCharacteristicLubinTateUnitParameterToGal] using + equalCharacteristicLubinTateArtinUnitToGal_parameterUnit_inv + F n p + _ = equalCharacteristicLubinTateUnitParameterToGal F n + (artinUnitParameter F n a⁻¹) := by rfl + +private theorem mem_span_X_pow_iff_coeff_zero + {k : Type u} [Field k] (f : k⟦X⟧) (m : ℕ) : + f ∈ Ideal.span ({PowerSeries.X ^ m} : Set k⟦X⟧) ↔ + ∀ j < m, PowerSeries.coeff j f = 0 := by + rw [Ideal.mem_span_singleton] + exact PowerSeries.X_pow_dvd_iff + +theorem equalCharacteristicLubinTateArtinHigherUnitImage_eq_upper + {K₀ : Type} [Field K₀] + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n k : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) : + (equalCharacteristicLubinTateHigherUnitSubgroup F (k - 1)).map + (equalCharacteristicLubinTateArtinUnitToGal F n) = + equalCharacteristicLubinTateRealUpperRamificationGroup F n (k : ℝ) := by + ext σ + constructor + · rintro ⟨a, ha, rfl⟩ + let p := artinUnitParameter F n a⁻¹ + rw [artinUnitToGal_eq_parameter F n a] + apply + (mem_equalCharacteristicLubinTateRealUpperRamificationGroup_nat_iff_coeff_zero + F n k hkn p).2 + have hainv : + a⁻¹ ∈ equalCharacteristicLubinTateHigherUnitSubgroup F (k - 1) := + (equalCharacteristicLubinTateHigherUnitSubgroup F (k - 1)).inv_mem ha + have hspan : + ((a⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) - 1 ∈ + Ideal.span + ({PowerSeries.X ^ k} : Set F.residueField⟦X⟧) := by + simpa [Nat.sub_add_cancel hk] using + (mem_equalCharacteristicLubinTateHigherUnitSubgroup + F (k - 1) a⁻¹).1 hainv + have hzero : + ∀ j < k, + PowerSeries.coeff j + (((a⁻¹ : F.residueField⟦X⟧ˣ) : + F.residueField⟦X⟧) - 1) = 0 := + (mem_span_X_pow_iff_coeff_zero + (((a⁻¹ : F.residueField⟦X⟧ˣ) : + F.residueField⟦X⟧) - 1) k).1 hspan + intro j hj + change PowerSeries.coeff j + (equalCharacteristicLubinTateUnitParameterSeries F n + (artinUnitParameter F n a⁻¹) - 1) = 0 + rw [map_sub, artinUnitParameter_coeff F n a⁻¹ j (by omega)] + simpa only [map_sub] using hzero j hj + · intro hσ + let p := + (equalCharacteristicLubinTateUnitParameterEquivGal F n).symm σ + let a := (equalCharacteristicLubinTateUnitParameterUnit F n p)⁻¹ + have hpσ : + equalCharacteristicLubinTateUnitParameterToGal F n p = σ := by + change + equalCharacteristicLubinTateUnitParameterEquivGal F n + ((equalCharacteristicLubinTateUnitParameterEquivGal F n).symm σ) = + σ + exact + (equalCharacteristicLubinTateUnitParameterEquivGal F n).apply_symm_apply σ + have hpupper : + equalCharacteristicLubinTateUnitParameterToGal F n p ∈ + equalCharacteristicLubinTateRealUpperRamificationGroup + F n (k : ℝ) := by + simpa [hpσ] using hσ + have hpzero : + ∀ j < k, + PowerSeries.coeff j + (equalCharacteristicLubinTateUnitParameterSeries F n p - 1) = 0 := + (mem_equalCharacteristicLubinTateRealUpperRamificationGroup_nat_iff_coeff_zero + F n k hkn p).1 hpupper + have hpunit : + equalCharacteristicLubinTateUnitParameterUnit F n p ∈ + equalCharacteristicLubinTateHigherUnitSubgroup F (k - 1) := by + apply + (mem_equalCharacteristicLubinTateHigherUnitSubgroup + F (k - 1) + (equalCharacteristicLubinTateUnitParameterUnit F n p)).2 + simpa [equalCharacteristicLubinTateUnitParameterUnit_val, + Nat.sub_add_cancel hk] using + (mem_span_X_pow_iff_coeff_zero + (equalCharacteristicLubinTateUnitParameterSeries F n p - 1) k).2 + hpzero + refine ⟨a, ?_, ?_⟩ + · exact + (equalCharacteristicLubinTateHigherUnitSubgroup F (k - 1)).inv_mem + hpunit + · calc + equalCharacteristicLubinTateArtinUnitToGal F n a = + equalCharacteristicLubinTateUnitParameterToGal F n p := by + simpa [a, equalCharacteristicLubinTateUnitParameterToGal] using + equalCharacteristicLubinTateArtinUnitToGal_parameterUnit_inv F n p + _ = σ := hpσ + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LaurentPrincipalUnitTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LaurentPrincipalUnitTransport.lean new file mode 100644 index 0000000000..ec0b000f64 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LaurentPrincipalUnitTransport.lean @@ -0,0 +1,362 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LubinTateTransport +/-! +# Exact principal-unit transport from the Laurent model + +The normalized Laurent-series equivalence used in the equal-characteristic +Lubin--Tate construction restricts to an equivalence between the +power-series coefficient ring and the target integer ring. Consequently it +carries every principal-unit level onto, rather than merely into, the +corresponding target principal-unit level. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries PowerSeries ValuativeRel + +namespace LubinTate +namespace EqualCharacteristic + +open LocalClassFieldTheory +open LocalFieldTheory +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.IsNonarchimedeanLocalField + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- Power-series evaluation at the chosen target uniformizer, with codomain +the canonical target valuation ring. -/ +noncomputable def equalCharacteristicTargetPowerSeriesEvalSubringHom + (p : ℕ) [Fact p.Prime] [CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : + let F := equalCharacteristicTargetLocalField K + F.residueField⟦X⟧ →+* F.valuationSubring := by + let F := equalCharacteristicTargetLocalField K + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + exact + CompleteDVF.EqualCharacteristicLaurent.adicPowerSeriesEvalSubringHom + (F := F.toCompleteDVF) F.residueCharacteristic + (n := equalCharacteristicResidueRank F) + (equalCharacteristicResidueCard F) + (equalCharacteristicTargetUniformizer K ϖ hϖ) + (equalCharacteristicTargetUniformizer_isUniformizer K ϖ hϖ) + +/-- Power-series evaluation agrees with the normalized Laurent equivalence +after both values are included in the target field. -/ +theorem equalCharacteristicTargetPowerSeriesEvalSubringHom_coe + (p : ℕ) [Fact p.Prime] [CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (f : + (equalCharacteristicTargetLocalField K).residueField⟦X⟧) : + (((equalCharacteristicTargetPowerSeriesEvalSubringHom + K p ϖ hϖ f : + (equalCharacteristicTargetLocalField K).valuationSubring)) : K) = + equalCharacteristicTargetLaurentRingEquiv K p ϖ hϖ + (algebraMap + (equalCharacteristicTargetLocalField K).residueField⟦X⟧ + (equalCharacteristicTargetLocalField K).residueField⸨X⸩ f) := by + let F := equalCharacteristicTargetLocalField K + let e := equalCharacteristicTargetLaurentRingEquiv K p ϖ hϖ + let eval := equalCharacteristicTargetPowerSeriesEvalSubringHom K p ϖ hϖ + let π := equalCharacteristicTargetUniformizer K ϖ hϖ + let hπ := equalCharacteristicTargetUniformizer_isUniformizer K ϖ hϖ + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + have hcomp := + congrArg DFunLike.coe + (CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom_comp_powerSeries + (F := F.toCompleteDVF) F.residueCharacteristic + (n := equalCharacteristicResidueRank F) + (equalCharacteristicResidueCard F) π hπ) + symm + change + equalCharacteristicLaurentRingEquiv F hπ + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩ f) = + (((eval f : F.valuationSubring)) : K) + rw [equalCharacteristicLaurentRingEquiv_apply] + exact congrFun hcomp f + +/-- The target power-series evaluation is bijective onto the target +valuation ring. -/ +theorem equalCharacteristicTargetPowerSeriesEvalSubringHom_bijective + (p : ℕ) [Fact p.Prime] [CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : + Function.Bijective + (equalCharacteristicTargetPowerSeriesEvalSubringHom K p ϖ hϖ) := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + let e := equalCharacteristicTargetLaurentRingEquiv K p ϖ hϖ + let eval := equalCharacteristicTargetPowerSeriesEvalSubringHom K p ϖ hϖ + have heval (f : F.residueField⟦X⟧) : + (((eval f : F.valuationSubring)) : K) = + e (algebraMap F.residueField⟦X⟧ B f) := by + exact + equalCharacteristicTargetPowerSeriesEvalSubringHom_coe + K p ϖ hϖ f + let π := equalCharacteristicTargetUniformizer K ϖ hϖ + let hπ := equalCharacteristicTargetUniformizer_isUniformizer K ϖ hϖ + change Function.Bijective eval + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + constructor + · intro f g hfg + apply HahnSeries.ofPowerSeries_injective (Γ := ℤ) (R := F.residueField) + apply e.injective + rw [← LaurentSeries.coe_algebraMap] + rw [← heval f, ← heval g] + exact congrArg F.valuation.valuationSubring.subtype hfg + · exact + CompleteDVF.EqualCharacteristicLaurent.adicPowerSeriesEvalSubringHom_surjective + (F := F.toCompleteDVF) F.residueCharacteristic + (n := equalCharacteristicResidueRank F) + (equalCharacteristicResidueCard F) + π hπ + +/-- The normalized Laurent-series equivalence identifies the source and +target valuation rings. This is the valuation-theoretic compatibility +needed to transport ramification groups across the change of base field. -/ +theorem equalCharacteristicTargetLaurentRingEquiv_val_le_one_iff + (p : ℕ) [Fact p.Prime] [CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (x : + let F := equalCharacteristicTargetLocalField K + F.residueField⸨X⸩) : + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + ValuativeRel.valuation B x ≤ 1 ↔ + ValuativeRel.valuation K + (equalCharacteristicTargetLaurentRingEquiv K p ϖ hϖ x) ≤ 1 := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + let e := equalCharacteristicTargetLaurentRingEquiv K p ϖ hϖ + let eval := equalCharacteristicTargetPowerSeriesEvalSubringHom K p ϖ hϖ + have heval (f : F.residueField⟦X⟧) : + (((eval f : F.valuationSubring)) : K) = + e (algebraMap F.residueField⟦X⟧ B f) := by + exact + equalCharacteristicTargetPowerSeriesEvalSubringHom_coe + K p ϖ hϖ f + have hbij : Function.Bijective eval := + equalCharacteristicTargetPowerSeriesEvalSubringHom_bijective + K p ϖ hϖ + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + let vB : Valuation B (WithZero (Multiplicative ℤ)) := Valued.v + let : vB.Compatible := Valuation.Compatible.ofValuation vB + change + ValuativeRel.valuation B x ≤ 1 ↔ + ValuativeRel.valuation K (e x) ≤ 1 + rw [← map_one (ValuativeRel.valuation B), + ← Valuation.Compatible.vle_iff_le + (v := ValuativeRel.valuation B), + Valuation.Compatible.vle_iff_le (v := vB)] + simp only [map_one] + constructor + · intro hx + obtain ⟨f, rfl⟩ := + (LaurentSeries.val_le_one_iff_eq_coe F.residueField x).1 hx + rw [← LaurentSeries.coe_algebraMap] + rw [← heval f] + rw [← equalCharacteristicTargetLocalField_valuation_eq K] + exact (eval f).property + · intro hx + let y : F.valuationSubring := ⟨e x, by + change F.valuation (e x) ≤ 1 + rw [equalCharacteristicTargetLocalField_valuation_eq K] + exact hx⟩ + obtain ⟨f, hf⟩ := + hbij.2 y + have hfield : + e (algebraMap F.residueField⟦X⟧ B f) = e x := by + rw [← heval f] + exact congrArg (fun z : F.valuationSubring => (z : K)) hf + have hsource : + algebraMap F.residueField⟦X⟧ B f = x := + e.injective hfield + rw [← hsource] + exact + (LaurentSeries.val_le_one_iff_eq_coe + F.residueField + (algebraMap F.residueField⟦X⟧ B f)).2 + ⟨f, rfl⟩ + +/-- The normalized evaluation identifies the power-series coefficient ring +with the target field's canonical integer ring. -/ +noncomputable def equalCharacteristicPowerSeriesEquivTargetInteger + (p : ℕ) [Fact p.Prime] [CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : + let F := equalCharacteristicTargetLocalField K + F.residueField⟦X⟧ ≃+* 𝒪[K] := + (RingEquiv.ofBijective + (equalCharacteristicTargetPowerSeriesEvalSubringHom K p ϖ hϖ) + (equalCharacteristicTargetPowerSeriesEvalSubringHom_bijective + K p ϖ hϖ)).trans + (equalCharacteristicTargetIntegerEquiv K).symm + +/-- The induced equivalence from power-series units to target integer +units. -/ +noncomputable def equalCharacteristicPowerSeriesUnitsEquivTargetInteger + (p : ℕ) [Fact p.Prime] [CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : + let F := equalCharacteristicTargetLocalField K + F.residueField⟦X⟧ˣ ≃* 𝒪[K]ˣ := + Units.mapEquiv + (equalCharacteristicPowerSeriesEquivTargetInteger + K p ϖ hϖ).toMulEquiv + +/-- The target integer-unit equivalence preserves every explicit +Lubin--Tate higher-unit level. -/ +theorem + equalCharacteristicPowerSeriesUnitsEquivTargetInteger_mem_principalUnits_iff + (p : ℕ) [Fact p.Prime] [CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (m : ℕ) + (a : (equalCharacteristicTargetLocalField K).residueField⟦X⟧ˣ) : + equalCharacteristicPowerSeriesUnitsEquivTargetInteger + K p ϖ hϖ a ∈ principalUnits K (m + 1) ↔ + a ∈ equalCharacteristicLubinTateHigherUnitSubgroup + (equalCharacteristicTargetLocalField K) m := by + let F := equalCharacteristicTargetLocalField K + let r := equalCharacteristicPowerSeriesEquivTargetInteger K p ϖ hϖ + rw [mem_principalUnits_iff, + mem_equalCharacteristicLubinTateHigherUnitSubgroup] + change + r (a : F.residueField⟦X⟧) - 1 ∈ + IsLocalRing.maximalIdeal 𝒪[K] ^ (m + 1) ↔ + (a : F.residueField⟦X⟧) - 1 ∈ + Ideal.span ({PowerSeries.X ^ (m + 1)} : + Set F.residueField⟦X⟧) + have h := + ValuationTheory.ringEquiv_mem_maximalIdeal_pow_iff + r (m + 1) ((a : F.residueField⟦X⟧) - 1) + simpa [map_sub, PowerSeries.maximalIdeal_eq_span_X, + Ideal.span_singleton_pow] using h + +/-- The explicit higher-unit subgroup maps exactly to the target principal +units. -/ +theorem + equalCharacteristicLubinTateHigherUnitSubgroup_map_eq_targetPrincipalUnits + (p : ℕ) [Fact p.Prime] [CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (m : ℕ) : + let F := equalCharacteristicTargetLocalField K + (equalCharacteristicLubinTateHigherUnitSubgroup F m).map + (equalCharacteristicPowerSeriesUnitsEquivTargetInteger + K p ϖ hϖ).toMonoidHom = + principalUnits K (m + 1) := by + let F := equalCharacteristicTargetLocalField K + let e := + equalCharacteristicPowerSeriesUnitsEquivTargetInteger K p ϖ hϖ + ext u + constructor + · rintro ⟨a, ha, rfl⟩ + exact + (equalCharacteristicPowerSeriesUnitsEquivTargetInteger_mem_principalUnits_iff + K p ϖ hϖ m a).2 ha + · intro hu + refine ⟨e.symm u, ?_, by simp [e]⟩ + exact + (equalCharacteristicPowerSeriesUnitsEquivTargetInteger_mem_principalUnits_iff + K p ϖ hϖ m (e.symm u)).1 (by simpa [e] using hu) + +/-- Evaluation through the target integer ring agrees with applying the +Laurent field-unit equivalence to the canonical power-series unit. -/ +theorem + integerUnitsToFieldUnits_equalCharacteristicPowerSeriesUnitsEquivTargetInteger + (p : ℕ) [Fact p.Prime] [CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (a : (equalCharacteristicTargetLocalField K).residueField⟦X⟧ˣ) : + integerUnitsToFieldUnits K + (equalCharacteristicPowerSeriesUnitsEquivTargetInteger + K p ϖ hϖ a) = + equalCharacteristicTargetLaurentUnitsEquiv K p ϖ hϖ + (equalCharacteristicPowerSeriesUnitToLaurentFieldUnit + (equalCharacteristicTargetLocalField K) a) := by + apply Units.ext + change + (((equalCharacteristicPowerSeriesEquivTargetInteger + K p ϖ hϖ) (a : + (equalCharacteristicTargetLocalField K).residueField⟦X⟧) : + 𝒪[K]) : K) = + equalCharacteristicTargetLaurentRingEquiv K p ϖ hϖ + (algebraMap + (equalCharacteristicTargetLocalField K).residueField⟦X⟧ + (equalCharacteristicTargetLocalField K).residueField⸨X⸩ + (a : + (equalCharacteristicTargetLocalField K).residueField⟦X⟧)) + exact + equalCharacteristicTargetPowerSeriesEvalSubringHom_coe + K p ϖ hϖ (a : + (equalCharacteristicTargetLocalField K).residueField⟦X⟧) + +/-- Exact subgroup form: the normalized Laurent equivalence carries +`U^(m+1)` onto the target group `U^(m+1)`. -/ +theorem equalCharacteristicTargetLaurent_fieldPrincipalUnits_map_eq + (p : ℕ) [Fact p.Prime] [CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (m : ℕ) : + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + (LocalFieldTheory.fieldPrincipalUnits B (m + 1)).map + (equalCharacteristicTargetLaurentUnitsEquiv + K p ϖ hϖ).toMonoidHom = + LocalFieldTheory.fieldPrincipalUnits K (m + 1) := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + let : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + let H := equalCharacteristicLubinTateHigherUnitSubgroup F m + let source := + equalCharacteristicPowerSeriesUnitToLaurentFieldUnit F + let target := + equalCharacteristicPowerSeriesUnitsEquivTargetInteger K p ϖ hϖ + let e := equalCharacteristicTargetLaurentUnitsEquiv K p ϖ hϖ + have hsource : H.map source = LocalFieldTheory.fieldPrincipalUnits B (m + 1) := by + simpa [H, source] using + equalCharacteristicLubinTateHigherUnitSubgroup_map_toLaurentField_eq + F m + have htarget : + H.map target.toMonoidHom = principalUnits K (m + 1) := by + simpa [H, target] using + equalCharacteristicLubinTateHigherUnitSubgroup_map_eq_targetPrincipalUnits + K p ϖ hϖ m + have hcomp : + e.toMonoidHom.comp source = + (integerUnitsToFieldUnits K).comp target.toMonoidHom := by + apply DFunLike.ext _ _ + intro a + exact + (integerUnitsToFieldUnits_equalCharacteristicPowerSeriesUnitsEquivTargetInteger + K p ϖ hϖ a).symm + change + (LocalFieldTheory.fieldPrincipalUnits B (m + 1)).map e.toMonoidHom = + LocalFieldTheory.fieldPrincipalUnits K (m + 1) + rw [← hsource, Subgroup.map_map, hcomp, ← Subgroup.map_map, htarget] + rfl + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean new file mode 100644 index 0000000000..36744afc27 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean @@ -0,0 +1,847 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.CharP.Subring +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormSubgroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv +/-! +# Lubin--Tate application: transport to an equal-characteristic local field + +The reusable Lubin--Tate calculation is carried out over the standard +Laurent-series model. This application-layer file transports its exact +norm-subgroup result to an arbitrary equal-characteristic local field. The +chosen field equivalence sends the inverse Laurent parameter to the prescribed +positive uniformizer, controls the required principal-unit filtration, and +transports both the finite Galois structure and the actual field-norm subgroup. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries PowerSeries ValuativeRel + +namespace LubinTate +namespace EqualCharacteristic + +open LocalClassFieldTheory + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +open CompleteDVF.higherPrincipalUnitGroup renaming + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank → + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank in +/-- The positive residue-field degree used by the equal-characteristic +Laurent-series model. -/ +noncomputable def equalCharacteristicResidueRank + {L : Type} [Field L] (F : LocalField L) : ℕ+ := + ⟨CompleteDVF.higherPrincipalUnitGroup.iwasawaResidueRank F, + Nat.pos_of_ne_zero fun hrank => by + have hcard := + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank + F + rw [hrank, pow_zero] at hcard + exact + (Finite.one_lt_card : 1 < Nat.card F.residueField).ne' hcard⟩ + +open CompleteDVF.higherPrincipalUnitGroup renaming + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank → + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank in +theorem equalCharacteristicResidueCard + {L : Type} [Field L] (F : LocalField L) : + Nat.card F.residueField = + F.residueCharacteristic ^ + (equalCharacteristicResidueRank F : ℕ) := by + simpa [equalCharacteristicResidueRank] using + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F + +/-! ## The prescribed prime element in the target local field -/ + +/-- The canonical complete-DVF package attached to the target local field. -/ +noncomputable def equalCharacteristicTargetLocalField : + LocalField K := by + exact + { toCompleteDVF := LocalFieldTheory.localCompleteDVF K + residueFinite := by + change Finite 𝓀[K] + infer_instance } + +/-- The target local-field package uses the canonical valuative relation on +the underlying field. -/ +theorem equalCharacteristicTargetLocalField_valuation_eq : + (equalCharacteristicTargetLocalField K).valuation = + ValuativeRel.valuation K := by + unfold equalCharacteristicTargetLocalField + unfold LocalFieldTheory.localCompleteDVF + unfold ValuationTheory.Valuations.completeDVFOfCompleteValuedField + rfl + +/-- The target valuation ring and the valuation ring in the chosen +complete-DVF package are the same subring of the field. -/ +noncomputable def equalCharacteristicTargetIntegerEquiv : + 𝒪[K] ≃+* (equalCharacteristicTargetLocalField K).valuationSubring where + toFun x := ⟨x, by + have hx := x.property + change ValuativeRel.valuation K (x : K) ≤ 1 at hx + change (equalCharacteristicTargetLocalField K).valuation (x : K) ≤ 1 + rw [equalCharacteristicTargetLocalField_valuation_eq] + exact hx⟩ + invFun x := ⟨x, by + have hx := x.property + change (equalCharacteristicTargetLocalField K).valuation (x : K) ≤ 1 at hx + rw [equalCharacteristicTargetLocalField_valuation_eq] at hx + change ValuativeRel.valuation K (x : K) ≤ 1 + exact hx⟩ + left_inv := fun _ => rfl + right_inv := fun _ => rfl + map_add' := fun _ _ => rfl + map_mul' := fun _ _ => rfl + +/-- The integer-ring equivalence preserves the underlying field element. -/ +@[simp] +theorem equalCharacteristicTargetIntegerEquiv_apply_coe (x : 𝒪[K]) : + (((equalCharacteristicTargetIntegerEquiv K x : + (equalCharacteristicTargetLocalField K).valuationSubring)) : K) = + (x : K) := by + rfl + +/-- The inverse integer-ring equivalence preserves the underlying field element. -/ +@[simp] +theorem equalCharacteristicTargetIntegerEquiv_symm_apply_coe + (x : (equalCharacteristicTargetLocalField K).valuationSubring) : + ((((equalCharacteristicTargetIntegerEquiv K).symm x : 𝒪[K])) : K) = + (x : K) := by + rfl + +/-- The residue characteristic in the canonical local-field package is the +given positive characteristic. -/ +theorem equalCharacteristicTargetResidueCharacteristicCharP + (p : ℕ) [Fact p.Prime] [CharP K p] : + CharP K (equalCharacteristicTargetLocalField K).residueCharacteristic := by + let F := equalCharacteristicTargetLocalField K + have hres : F.residueCharacteristic = p := + F.residueCharacteristic_eq_of_charP p + ((Fact.out : Nat.Prime p).ne_zero) + rw [hres] + infer_instance + +private theorem equalCharacteristicUniformizerRatio_valuationMap + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : + valuationMap K + (Additive.ofMul + (ϖ / inverseIntegerRingUniformizerFieldUnit K)) = 0 := by + have hcanonical : + valuationMap K + (Additive.ofMul (inverseIntegerRingUniformizerFieldUnit K)) = 1 := by + rw [valuationMap_apply] + exact v_inverseIntegerRingUniformizerFieldUnit K + rw [valuationMap_ofMul_div, hϖ, hcanonical, sub_self] + +/-- The unit by which the canonical prime element must be changed in order +to obtain the inverse of the prescribed positive uniformizer. -/ +noncomputable def equalCharacteristicUniformizerRatioIntegerUnit + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : + 𝒪[K]ˣ := + integerUnitOfValuationMapZero K + (ϖ / inverseIntegerRingUniformizerFieldUnit K) + (by exact equalCharacteristicUniformizerRatio_valuationMap K ϖ hϖ) + +/-- The uniformizer-ratio integer unit maps to the prescribed ratio of field units. -/ +@[simp] +theorem integerUnitsToFieldUnits_equalCharacteristicUniformizerRatioIntegerUnit + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : + integerUnitsToFieldUnits K + (equalCharacteristicUniformizerRatioIntegerUnit K ϖ hϖ) = + ϖ / inverseIntegerRingUniformizerFieldUnit K := + integerUnitOfValuationMapZero_spec K + (ϖ / inverseIntegerRingUniformizerFieldUnit K) + (equalCharacteristicUniformizerRatio_valuationMap K ϖ hϖ) + +/-- A prime element of the target integer ring whose inverse in the field is +the prescribed positive uniformizer. -/ +noncomputable def equalCharacteristicTargetUniformizerInteger + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : 𝒪[K] := + chosenIntegerRingUniformizer K * + ((equalCharacteristicUniformizerRatioIntegerUnit K ϖ hϖ)⁻¹ : 𝒪[K]ˣ) + +/-- The adjusted prime element in the target integer ring is irreducible. -/ +theorem equalCharacteristicTargetUniformizerInteger_irreducible + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : + Irreducible + (equalCharacteristicTargetUniformizerInteger K ϖ hϖ) := by + unfold equalCharacteristicTargetUniformizerInteger + exact + (irreducible_mul_units + (equalCharacteristicUniformizerRatioIntegerUnit K ϖ hϖ)⁻¹).2 + (chosenIntegerRingUniformizer_irreducible K) + +/-- The adjusted target prime element coerces to the inverse prescribed uniformizer. -/ +@[simp] +theorem equalCharacteristicTargetUniformizerInteger_coe + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : + ((equalCharacteristicTargetUniformizerInteger K ϖ hϖ : 𝒪[K]) : K) = + ((ϖ⁻¹ : Kˣ) : K) := by + let η := inverseIntegerRingUniformizerFieldUnit K + let u := equalCharacteristicUniformizerRatioIntegerUnit K ϖ hϖ + have hu : integerUnitsToFieldUnits K u = ϖ / η := by + exact + integerUnitsToFieldUnits_equalCharacteristicUniformizerRatioIntegerUnit + K ϖ hϖ + change + ((integerRingUniformizerFieldUnit K * + integerUnitsToFieldUnits K u⁻¹ : Kˣ) : K) = + ((ϖ⁻¹ : Kˣ) : K) + have hunit : + integerRingUniformizerFieldUnit K * + integerUnitsToFieldUnits K u⁻¹ = + ϖ⁻¹ := by + rw [map_inv, hu] + dsimp [η, inverseIntegerRingUniformizerFieldUnit] + rw [div_eq_mul_inv, inv_inv, mul_inv_rev] + rw [← mul_assoc, mul_inv_cancel, one_mul] + exact congrArg Units.val hunit + +/-- The preceding prime element, in the valuation ring of the canonical +complete-DVF package. -/ +noncomputable def equalCharacteristicTargetUniformizer + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : + (equalCharacteristicTargetLocalField K).valuationSubring := + equalCharacteristicTargetIntegerEquiv K + (equalCharacteristicTargetUniformizerInteger K ϖ hϖ) + +/-- The target valuation-ring uniformizer coerces to the inverse prescribed field unit. -/ +@[simp] +theorem equalCharacteristicTargetUniformizer_coe + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : + ((equalCharacteristicTargetUniformizer K ϖ hϖ : + (equalCharacteristicTargetLocalField K).valuationSubring) : K) = + ((ϖ⁻¹ : Kˣ) : K) := by + rw [equalCharacteristicTargetUniformizer, + equalCharacteristicTargetIntegerEquiv_apply_coe, + equalCharacteristicTargetUniformizerInteger_coe] + +/-- The adjusted target prime element is a uniformizer for the canonical valuation. -/ +theorem equalCharacteristicTargetUniformizer_isUniformizer + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : + (equalCharacteristicTargetLocalField K).valuation.IsUniformizer + (equalCharacteristicTargetUniformizer K ϖ hϖ : K) := by + have hirr : + Irreducible (equalCharacteristicTargetUniformizer K ϖ hϖ) := + (equalCharacteristicTargetUniformizerInteger_irreducible K ϖ hϖ).map + (equalCharacteristicTargetIntegerEquiv K) + exact Valuation.isUniformizer_of_maximalIdeal_eq_span + (v := (equalCharacteristicTargetLocalField K).valuation) + hirr.maximalIdeal_eq + +/-! ## The Laurent equivalence -/ + +/-- The Laurent-series model of the target equal-characteristic local field, +normalized by the prescribed positive uniformizer. -/ +noncomputable def equalCharacteristicTargetLaurentRingEquiv + (p : ℕ) [Fact p.Prime] [CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : + (equalCharacteristicTargetLocalField K).residueField⸨X⸩ ≃+* K := by + let F := equalCharacteristicTargetLocalField K + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + exact equalCharacteristicLaurentRingEquiv F + (equalCharacteristicTargetUniformizer_isUniformizer K ϖ hϖ) + +/-- The Laurent-series equivalence sends its formal uniformizer to the inverse prescribed unit. -/ +@[simp] +theorem equalCharacteristicTargetLaurentRingEquiv_uniformizer + (p : ℕ) [Fact p.Prime] [CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : + equalCharacteristicTargetLaurentRingEquiv K p ϖ hϖ + (equalCharacteristicLaurentUniformizer + (equalCharacteristicTargetLocalField K)) = + ((ϖ⁻¹ : Kˣ) : K) := by + let F := equalCharacteristicTargetLocalField K + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + change + equalCharacteristicLaurentRingEquiv F + (equalCharacteristicTargetUniformizer_isUniformizer K ϖ hϖ) + (equalCharacteristicLaurentUniformizer F) = + ((ϖ⁻¹ : Kˣ) : K) + unfold equalCharacteristicLaurentUniformizer + rw [equalCharacteristicLaurentRingEquiv_algebraMap_X, + equalCharacteristicTargetUniformizer_coe] + +/-- The induced equivalence of field-unit groups. -/ +noncomputable def equalCharacteristicTargetLaurentUnitsEquiv + (p : ℕ) [Fact p.Prime] [CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : + (equalCharacteristicTargetLocalField K).residueField⸨X⸩ˣ ≃* Kˣ := + Units.mapEquiv + (equalCharacteristicTargetLaurentRingEquiv K p ϖ hϖ).toMulEquiv + +/-- The Laurent parameter itself maps to the inverse prescribed +uniformizer, at the level of field units. -/ +@[simp] +theorem equalCharacteristicTargetLaurentUnitsEquiv_uniformizer + (p : ℕ) [Fact p.Prime] [CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : + equalCharacteristicTargetLaurentUnitsEquiv K p ϖ hϖ + (equalCharacteristicLaurentUniformizerUnit + (equalCharacteristicTargetLocalField K)) = + ϖ⁻¹ := by + apply Units.ext + exact equalCharacteristicTargetLaurentRingEquiv_uniformizer K p ϖ hϖ + +/-- The inverse Laurent parameter is sent exactly to the prescribed positive +uniformizer. -/ +@[simp] +theorem equalCharacteristicTargetLaurentUnitsEquiv_uniformizer_inv + (p : ℕ) [Fact p.Prime] [CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : + equalCharacteristicTargetLaurentUnitsEquiv K p ϖ hϖ + (equalCharacteristicLaurentUniformizerUnit + (equalCharacteristicTargetLocalField K))⁻¹ = + ϖ := by + rw [map_inv, + equalCharacteristicTargetLaurentUnitsEquiv_uniformizer] + simp + +/-! ## Principal-unit containment under the Laurent equivalence -/ + +/-- A power-series higher unit remains a principal unit after evaluating the +Laurent parameter at the prescribed target prime element. This pointwise +form is all that the equal-characteristic Laurent-series classification needs and avoids + constructing a second, expensive +integer-ring equivalence. -/ +theorem equalCharacteristicTargetLaurentUnitsEquiv_mem_fieldPrincipalUnits_of_mem_higherUnit + (p : ℕ) [Fact p.Prime] [CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (m : ℕ) + (a : + (equalCharacteristicTargetLocalField K).residueField⟦X⟧ˣ) + (ha : + a ∈ equalCharacteristicLubinTateHigherUnitSubgroup + (equalCharacteristicTargetLocalField K) m) : + equalCharacteristicTargetLaurentUnitsEquiv K p ϖ hϖ + (equalCharacteristicPowerSeriesUnitToLaurentFieldUnit + (equalCharacteristicTargetLocalField K) a) ∈ + LocalFieldTheory.fieldPrincipalUnits K (m + 1) := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + let π := equalCharacteristicTargetUniformizer K ϖ hϖ + let hπ := equalCharacteristicTargetUniformizer_isUniformizer K ϖ hϖ + let eval := + CompleteDVF.EqualCharacteristicLaurent.adicPowerSeriesEvalSubringHom + (F := F.toCompleteDVF) F.residueCharacteristic + (n := equalCharacteristicResidueRank F) + (equalCharacteristicResidueCard F) π hπ + let uF : F.valuationSubringˣ := Units.map eval.toMonoidHom a + let uK : 𝒪[K]ˣ := + Units.map (equalCharacteristicTargetIntegerEquiv K).symm.toMonoidHom uF + have hcomp := + congrArg DFunLike.coe + (CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom_comp_powerSeries + (F := F.toCompleteDVF) F.residueCharacteristic + (n := equalCharacteristicResidueRank F) + (equalCharacteristicResidueCard F) π hπ) + have heval (f : F.residueField⟦X⟧) : + equalCharacteristicLaurentRingEquiv F hπ + (algebraMap F.residueField⟦X⟧ B f) = + ((eval f : F.valuationSubring) : K) := by + rw [equalCharacteristicLaurentRingEquiv_apply] + exact congrFun hcomp f + have hX : + eval (PowerSeries.X : F.residueField⟦X⟧) = π := by + apply Subtype.ext + change + ((eval (PowerSeries.X : F.residueField⟦X⟧) : + F.valuationSubring) : K) = (π : K) + exact + (heval (PowerSeries.X : F.residueField⟦X⟧)).symm.trans + (equalCharacteristicLaurentRingEquiv_algebraMap_X F hπ) + have hev : + eval ((a : F.residueField⟦X⟧) - 1) ∈ + F.maximalIdeal ^ (m + 1) := by + have ha' := + (mem_equalCharacteristicLubinTateHigherUnitSubgroup F m a).1 ha + rw [F.maximalIdeal_pow_eq_span_uniformizer_pow hπ (m + 1), + Ideal.mem_span_singleton] + rw [Ideal.mem_span_singleton] at ha' + obtain ⟨c, hc⟩ := ha' + refine ⟨eval c, ?_⟩ + calc + eval ((a : F.residueField⟦X⟧) - 1) = + eval ((PowerSeries.X : F.residueField⟦X⟧) ^ (m + 1) * c) := + congrArg eval hc + _ = π ^ (m + 1) * eval c := by + rw [map_mul, map_pow, hX] + have huF : + (uF : F.valuationSubring) - 1 ∈ + F.maximalIdeal ^ (m + 1) := by + change + eval (a : F.residueField⟦X⟧) - 1 ∈ + F.maximalIdeal ^ (m + 1) + simpa only [map_sub, map_one] using hev + have huK : uK ∈ principalUnits K (m + 1) := by + rw [mem_principalUnits_iff] + have htransport : + (equalCharacteristicTargetIntegerEquiv K).symm + ((uF : F.valuationSubring) - 1) ∈ + IsLocalRing.maximalIdeal 𝒪[K] ^ (m + 1) := + (ValuationTheory.ringEquiv_mem_maximalIdeal_pow_iff + (equalCharacteristicTargetIntegerEquiv K).symm (m + 1) + ((uF : F.valuationSubring) - 1)).2 huF + change + (equalCharacteristicTargetIntegerEquiv K).symm + (uF : F.valuationSubring) - 1 ∈ + IsLocalRing.maximalIdeal 𝒪[K] ^ (m + 1) + simpa only [map_sub, map_one] using htransport + refine ⟨uK, huK, ?_⟩ + rw [equalCharacteristicPowerSeriesUnitToLaurentFieldUnit_apply] + apply Units.ext + change + (((equalCharacteristicTargetIntegerEquiv K).symm + (eval (a : F.residueField⟦X⟧)) : 𝒪[K]) : K) = + equalCharacteristicLaurentRingEquiv F hπ + (algebraMap F.residueField⟦X⟧ B + (a : F.residueField⟦X⟧)) + rw [equalCharacteristicTargetIntegerEquiv_symm_apply_coe] + exact (heval (a : F.residueField⟦X⟧)).symm + +/-- The normalized Laurent equivalence carries every level-m+1 principal +unit into the corresponding target principal-unit group. -/ +theorem equalCharacteristicTargetLaurent_fieldPrincipalUnits_map_le + (p : ℕ) [Fact p.Prime] [CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (m : ℕ) : + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + (LocalFieldTheory.fieldPrincipalUnits B (m + 1)).map + (equalCharacteristicTargetLaurentUnitsEquiv + K p ϖ hϖ).toMonoidHom ≤ + LocalFieldTheory.fieldPrincipalUnits K (m + 1) := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + let : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + change + (LocalFieldTheory.fieldPrincipalUnits B (m + 1)).map + (equalCharacteristicTargetLaurentUnitsEquiv + K p ϖ hϖ).toMonoidHom ≤ + LocalFieldTheory.fieldPrincipalUnits K (m + 1) + rw [← + equalCharacteristicLubinTateHigherUnitSubgroup_map_toLaurentField_eq + F m] + rintro x ⟨y, ⟨a, ha, rfl⟩, rfl⟩ + exact + equalCharacteristicTargetLaurentUnitsEquiv_mem_fieldPrincipalUnits_of_mem_higherUnit + K p ϖ hϖ m a ha + +/-- Consequently the explicit norm-subgroup computation maps the standard subgroup into the target +standard subgroup with the prescribed positive uniformizer. -/ +theorem equalCharacteristicTargetLaurent_uniformizerPrincipalSubgroup_map_le + (p : ℕ) [Fact p.Prime] [CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (m : ℕ) : + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + (LocalFieldTheory.uniformizerPrincipalSubgroup B + (equalCharacteristicLaurentUniformizerUnit F)⁻¹ + 1 (m + 1)).map + (equalCharacteristicTargetLaurentUnitsEquiv + K p ϖ hϖ).toMonoidHom ≤ + LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ 1 (m + 1) := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + let : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + change + (LocalFieldTheory.uniformizerPrincipalSubgroup B + (equalCharacteristicLaurentUniformizerUnit F)⁻¹ + 1 (m + 1)).map + (equalCharacteristicTargetLaurentUnitsEquiv + K p ϖ hϖ).toMonoidHom ≤ + LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ 1 (m + 1) + unfold LocalFieldTheory.uniformizerPrincipalSubgroup + rw [Subgroup.map_sup, MonoidHom.map_zpowers] + apply sup_le_sup + · apply (Subgroup.zpowers_le).2 + rw [map_pow] + change + (equalCharacteristicTargetLaurentUnitsEquiv K p ϖ hϖ + ((equalCharacteristicLaurentUniformizerUnit F)⁻¹)) ^ 1 ∈ + Subgroup.zpowers (ϖ ^ 1) + rw [equalCharacteristicTargetLaurentUnitsEquiv_uniformizer_inv] + exact Subgroup.mem_zpowers (ϖ ^ 1) + · exact + equalCharacteristicTargetLaurent_fieldPrincipalUnits_map_le + K p ϖ hϖ m + +/-! ## Transport of the finite Lubin--Tate extension and its norm subgroup -/ + +/-- The level field with its base algebra transported from the Laurent model +to the target field. -/ +@[reducible] +noncomputable def equalCharacteristicTransportedLubinTateLevelAlgebra + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (m : ℕ) : + let F := equalCharacteristicTargetLocalField K + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + Algebra K (equalCharacteristicLubinTateLevelField F m) := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + letI : Algebra B E := equalCharacteristicLubinTateLevelAlgebra F m + letI : CharP K p := hKp + exact RingHom.toAlgebra + ((algebraMap B E).comp + (equalCharacteristicTargetLaurentRingEquiv K p ϖ hϖ).symm.toRingHom) + +/-- The transported `K`-algebra map agrees with the original Laurent-series base map. -/ +theorem equalCharacteristicTransportedLubinTateLevelAlgebra_comp + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (m : ℕ) : + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + letI : Algebra B E := + equalCharacteristicLubinTateLevelAlgebra F m + letI : CharP K p := hKp + letI : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra K p ϖ hϖ m + (algebraMap K E).comp + (equalCharacteristicTargetLaurentRingEquiv K p ϖ hϖ).toRingHom = + (RingEquiv.refl E).toRingHom.comp (algebraMap B E) := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + let : Algebra B E := equalCharacteristicLubinTateLevelAlgebra F m + let : CharP K p := hKp + let : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra K p ϖ hϖ m + apply RingHom.ext + intro x + change + (algebraMap B E) + ((equalCharacteristicTargetLaurentRingEquiv K p ϖ hϖ).symm + (equalCharacteristicTargetLaurentRingEquiv K p ϖ hϖ x)) = + (algebraMap B E) x + rw [RingEquiv.symm_apply_apply] + +/-- Finite-dimensionality of the uniformizer norm identity survives the change of base field. -/ +theorem equalCharacteristicTransportedLubinTateLevel_finiteDimensional + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (m : ℕ) : + let F := equalCharacteristicTargetLocalField K + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + letI : CharP K p := hKp + letI : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra K p ϖ hϖ m + letI : Module K E := Algebra.toModule + Module.Finite K E := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + let algBE : Algebra B E := equalCharacteristicLubinTateLevelAlgebra F m + let : Algebra B E := algBE + let : Module B E := algBE.toModule + let : Module.Finite B E := + equalCharacteristicLubinTateLevelField_finiteDimensional F m + let : CharP K p := hKp + let algKE : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra K p ϖ hϖ m + let : Algebra K E := algKE + let : Module K E := algKE.toModule + exact Module.Finite.of_equiv_equiv + (equalCharacteristicTargetLaurentRingEquiv K p ϖ hϖ) + (RingEquiv.refl E) + (equalCharacteristicTransportedLubinTateLevelAlgebra_comp + K p ϖ hϖ m) + +/-- Galoisness of the uniformizer norm identity survives the same change of base field. -/ +theorem equalCharacteristicTransportedLubinTateLevel_isGalois + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (m : ℕ) : + let F := equalCharacteristicTargetLocalField K + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + letI : CharP K p := hKp + letI : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra K p ϖ hϖ m + IsGalois K E := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + let : Algebra B E := equalCharacteristicLubinTateLevelAlgebra F m + let : IsGalois B E := + equalCharacteristicLubinTateLevelField_isGalois F m + let : CharP K p := hKp + let : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra K p ϖ hϖ m + exact IsGalois.of_equiv_equiv + (F := B) («E» := E) + (f := equalCharacteristicTargetLaurentRingEquiv K p ϖ hϖ) + (g := RingEquiv.refl E) + (equalCharacteristicTransportedLubinTateLevelAlgebra_comp + K p ϖ hϖ m) + +/-- Abelian Galoisness of the Lubin--Tate level field is preserved when its +base algebra is transported from the Laurent model to the target field. -/ +theorem equalCharacteristicTransportedLubinTateLevel_isAbelianGalois + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (m : ℕ) : + let F := equalCharacteristicTargetLocalField K + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + letI : CharP K p := hKp + letI : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra K p ϖ hϖ m + IsAbelianGalois K E := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + let : Algebra B E := equalCharacteristicLubinTateLevelAlgebra F m + let : IsAbelianGalois B E := + equalCharacteristicLubinTateLevelField_isAbelianGalois F m + let : CharP K p := hKp + let : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra K p ϖ hϖ m + let e := equalCharacteristicTargetLaurentRingEquiv K p ϖ hϖ + have he (x : B) : + algebraMap K E (e x) = algebraMap B E x := by + have hcomp := + DFunLike.congr_fun + (equalCharacteristicTransportedLubinTateLevelAlgebra_comp + K p ϖ hϖ m) x + simpa [e] using hcomp + let : IsGalois K E := + equalCharacteristicTransportedLubinTateLevel_isGalois + K p ϖ hϖ m + let restrictToLaurent : + Gal(E/K) →* Gal(E/B) := + { toFun := fun (σ : Gal(E/K)) => + show Gal(E/B) from + { σ.toRingEquiv with + commutes' := fun x => by + rw [← he x] + exact σ.commutes (e x) } + map_one' := by + ext x + rfl + map_mul' σ τ := by + ext x + rfl } + have hrestrict : + Function.Injective restrictToLaurent := by + intro σ τ hστ + apply AlgEquiv.ext + intro x + exact DFunLike.congr_fun hστ x + refine { is_comm.comm := fun σ τ => hrestrict ?_ } + exact + (inferInstance : IsMulCommutative (Gal(E/B))).is_comm.comm + (restrictToLaurent σ) (restrictToLaurent τ) + +/-- The actual norm subgroup of the transported level field. -/ +noncomputable def equalCharacteristicTransportedLubinTateNormSubgroup + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (m : ℕ) : Subgroup Kˣ := by + let F := equalCharacteristicTargetLocalField K + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + letI : CharP K p := hKp + letI : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra K p ϖ hϖ m + exact _root_.LocalFieldTheory.localNormSubgroup K E + +private theorem equalCharacteristicTransported_normUnits + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (m : ℕ) + (x : + let F := equalCharacteristicTargetLocalField K + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + (equalCharacteristicLubinTateLevelField F m)ˣ) : + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + letI : Algebra B E := equalCharacteristicLubinTateLevelAlgebra F m + letI : CharP K p := hKp + letI : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra K p ϖ hϖ m + equalCharacteristicTargetLaurentUnitsEquiv K p ϖ hϖ + (LocalFieldTheory.normUnits B E x) = + LocalFieldTheory.normUnits K E x := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + let : Algebra B E := equalCharacteristicLubinTateLevelAlgebra F m + let : CharP K p := hKp + let : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra K p ϖ hϖ m + have hnorm := + Algebra.norm_eq_of_equiv_equiv + (equalCharacteristicTargetLaurentRingEquiv K p ϖ hϖ) + (RingEquiv.refl E) + (equalCharacteristicTransportedLubinTateLevelAlgebra_comp + K p ϖ hϖ m) + (x : E) + apply Units.ext + change + equalCharacteristicTargetLaurentRingEquiv K p ϖ hϖ + (Algebra.norm B (x : E)) = + Algebra.norm K (x : E) + rw [hnorm, + (equalCharacteristicTargetLaurentRingEquiv K p ϖ hϖ).apply_symm_apply] + rfl + +/-- Mapping the explicit norm-subgroup computation norm subgroup along the base-field +equivalence gives +the actual norm subgroup for the transported algebra. -/ +theorem equalCharacteristicLubinTateNormSubgroup_map_eq_transported + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (m : ℕ) : + let F := equalCharacteristicTargetLocalField K + letI : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let N := equalCharacteristicLubinTateNormSubgroup F m + letI : CharP K p := hKp + N.map + (equalCharacteristicTargetLaurentUnitsEquiv K p ϖ hϖ).toMonoidHom = + equalCharacteristicTransportedLubinTateNormSubgroup K p ϖ hϖ m := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let E := equalCharacteristicLubinTateLevelField F m + let : Algebra B E := equalCharacteristicLubinTateLevelAlgebra F m + let : CharP K p := hKp + let : Algebra K E := + equalCharacteristicTransportedLubinTateLevelAlgebra K p ϖ hϖ m + change + (_root_.LocalFieldTheory.localNormSubgroup B E).map + (equalCharacteristicTargetLaurentUnitsEquiv K p ϖ hϖ).toMonoidHom = + _root_.LocalFieldTheory.localNormSubgroup K E + ext x + constructor + · rintro ⟨y, ⟨z, rfl⟩, rfl⟩ + exact + ⟨z, + (equalCharacteristicTransported_normUnits K p ϖ hϖ m z).symm⟩ + · rintro ⟨z, rfl⟩ + refine ⟨LocalFieldTheory.normUnits B E z, ⟨z, rfl⟩, ?_⟩ + exact equalCharacteristicTransported_normUnits K p ϖ hϖ m z + +/-- The explicit norm-subgroup computation over an arbitrary equal-characteristic local field: the +transported actual norm subgroup is contained in the prescribed standard +subgroup at division level m+1. -/ +theorem equalCharacteristicTransportedLubinTateNormSubgroup_le_uniformizerPrincipalSubgroup + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (m : ℕ) : + equalCharacteristicTransportedLubinTateNormSubgroup K p ϖ hϖ m ≤ + LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ 1 (m + 1) := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + have hLubinTateNormSubgroup : + equalCharacteristicLubinTateNormSubgroup F m = + LocalFieldTheory.uniformizerPrincipalSubgroup B + (equalCharacteristicLaurentUniformizerUnit F)⁻¹ + 1 (m + 1) := + equalCharacteristicLubinTateNormSubgroup_eq_uniformizerPrincipalSubgroup + F m + let : CharP K p := hKp + rw [← equalCharacteristicLubinTateNormSubgroup_map_eq_transported + K p ϖ hϖ m, + hLubinTateNormSubgroup] + exact + equalCharacteristicTargetLaurent_uniformizerPrincipalSubgroup_map_le + K p ϖ hϖ m + +/-- The same containment indexed directly by a positive division level. -/ +theorem equalCharacteristicTransportedLubinTateNormSubgroup_le_of_pos + (p : ℕ) [Fact p.Prime] [CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (n : ℕ) (hn : 1 ≤ n) : + equalCharacteristicTransportedLubinTateNormSubgroup + K p ϖ hϖ (n - 1) ≤ + LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ 1 n := by + simpa [Nat.sub_add_cancel hn] using + (equalCharacteristicTransportedLubinTateNormSubgroup_le_uniformizerPrincipalSubgroup + K p ϖ hϖ (n - 1)) + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormIndex.lean new file mode 100644 index 0000000000..53788f25cb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormIndex.lean @@ -0,0 +1,75 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.UnramifiedConductor +/-! +# Lubin--Tate application: index of the explicit level norm subgroup + +The equality between the norm-subgroup index and the extension degree uses +finite local reciprocity. It therefore belongs to the concrete local class +field theory application layer, not to the reusable Lubin--Tate library. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries ValuativeRel + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory + +variable {K : Type} [Field K] + +private theorem normSubgroup_index_eq_finrank_of_isAbelianGalois + {B E : Type} [Field B] [Field E] [Algebra B E] + (hab : IsAbelianGalois B E) + (hfd : FiniteDimensional B E) + [ValuativeRel B] [TopologicalSpace B] + [IsNonarchimedeanLocalField B] : + (localNormSubgroup B E).index = Module.finrank B E := by + let : IsAbelianGalois B E := hab + let : FiniteDimensional B E := hfd + rw [Subgroup.index_eq_card] + exact LocalClassFieldTheory.card_normQuotient_eq_finrank_of_isAbelianGalois B E + +/-- The norm subgroup of the level-`n+1` Lubin--Tate extension has index +`(q - 1) q^n`, its extension degree. -/ +theorem equalCharacteristicLubinTateNormSubgroup_index + (F : LocalField K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + letI : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + (equalCharacteristicLubinTateNormSubgroup F n).index = + (Nat.card F.residueField - 1) * Nat.card F.residueField ^ n := by + let B := F.residueField⸨X⸩ + let E := equalCharacteristicLubinTateLevelField F n + let : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + let : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + let : Algebra B E := equalCharacteristicLubinTateLevelAlgebra F n + change (localNormSubgroup B E).index = _ + calc + (localNormSubgroup B E).index = Module.finrank B E := + normSubgroup_index_eq_finrank_of_isAbelianGalois + (equalCharacteristicLubinTateLevelField_isAbelianGalois F n) + (equalCharacteristicLubinTateLevelField_finiteDimensional F n) + _ = (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := + equalCharacteristicLubinTateLevelField_finrank F n + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormSubgroup.lean new file mode 100644 index 0000000000..1272d7efc4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormSubgroup.lean @@ -0,0 +1,91 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.StandardSubgroupNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitQuotientCard +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormIndex +/-! +# Lubin--Tate application: the exact norm subgroup + +The reusable Lubin--Tate layer proves containment of the standard subgroup and +computes its quotient. Finite local reciprocity computes the norm-subgroup +index here, in the application layer, so the containment becomes an equality. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries ValuativeRel + +namespace LubinTate +namespace EqualCharacteristic + +open LocalClassFieldTheory + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +variable {K : Type} [Field K] + +/-- The explicit norm-subgroup formula, with repository level `n` representing the canonical +level `n+1`: the norm subgroup is exactly `(T⁻¹) × U^(n+1)`. -/ +theorem equalCharacteristicLubinTateNormSubgroup_eq_uniformizerPrincipalSubgroup + (F : LocalField K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + letI : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + equalCharacteristicLubinTateNormSubgroup F n = + LocalFieldTheory.uniformizerPrincipalSubgroup F.residueField⸨X⸩ + (equalCharacteristicLaurentUniformizerUnit F)⁻¹ 1 (n + 1) := by + let B := F.residueField⸨X⸩ + let pi : Bˣ := (equalCharacteristicLaurentUniformizerUnit F)⁻¹ + let : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + let : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + let H := LocalFieldTheory.uniformizerPrincipalSubgroup B pi 1 (n + 1) + let N := equalCharacteristicLubinTateNormSubgroup F n + let d := (Nat.card F.residueField - 1) * Nat.card F.residueField ^ n + have hindexH : H.index = d := by + rw [Subgroup.index_eq_card] + simpa [B, H, pi, d] using + (equalCharacteristicLubinTateUniformizerPrincipalQuotient_natCard F n) + have hindexN : N.index = d := by + simpa [N, d] using + (equalCharacteristicLubinTateNormSubgroup_index F n) + have hdpos : 0 < d := by + dsimp [d] + exact Nat.mul_pos + (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (Nat.pow_pos Nat.card_pos) + let _ : H.FiniteIndex := ⟨by + rw [hindexH] + exact Nat.ne_of_gt hdpos⟩ + have hHN : H ≤ N := by + exact + equalCharacteristicLubinTate_uniformizerPrincipalSubgroup_le_normSubgroup + F n + apply Eq.symm + apply le_antisymm hHN + by_contra hNH + have hne : H ≠ N := by + intro heq + apply hNH + rw [heq] + have hstrict : H < N := lt_of_le_of_ne hHN hne + have hi := Subgroup.index_strictAnti hstrict + rw [hindexH, hindexN] at hi + exact Nat.lt_irrefl _ hi + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/PadicMultiplicativeArtinComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/PadicMultiplicativeArtinComparison.lean new file mode 100644 index 0000000000..71fc2309b4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/PadicMultiplicativeArtinComparison.lean @@ -0,0 +1,1000 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.NormRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HigherUnitLevelEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.Core +/-! +# The local Artin map on multiplicative p-adic Lubin--Tate levels + +This file compares the actual finite local Artin map with the explicit +multiplicative Lubin--Tate action. The first source-produced comparison is +on the deepest invisible principal-unit group: a unit in `U^(n + 1)` is an +actual norm from level `n`, while its finite Lubin--Tate parameter class is +trivial. Consequently the two automorphisms agree there, and the resulting +action on the chosen primitive root is the explicit cyclotomic action. +-/ + +@[expose] public section + +noncomputable +section + +open scoped ValuativeRel + +namespace LocalClassFieldTheory + +open LubinTate +open LocalFieldTheory +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open LocalFieldTheory.DiscreteValuationField.ValuedExtension +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +/-- The negative changed-uniformizer prime element as an actual unit of its +completed fixed field. Its norm is the changed base uniformizer `u p`. -/ +noncomputable def padicCompletedChangedUniformizerNegativePrimeUnit + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + (padicCompletedChangedUniformizerFixedField p u n)ˣ := + Units.mk0 + (-padicCompletedChangedUniformizerPrimeElement p u n) + (by + let D := padicCompletedChangedUniformizerFixedField p u n + let M := padicCompletedStandardChangedCompositum p u n + let : NontriviallyNormedField D := + finiteExtensionSpectralNormedField ℚ_[p] D + let : ValuativeRel D := + finiteExtensionSpectralValuativeRel ℚ_[p] D + let : IsNonarchimedeanLocalField D := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] D + let : NontriviallyNormedField M := + finiteExtensionSpectralNormedField ℚ_[p] M + let : ValuativeRel M := + finiteExtensionSpectralValuativeRel ℚ_[p] M + let : IsNonarchimedeanLocalField M := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] M + apply neg_ne_zero.mpr + exact + (padicCompletedChangedUniformizerPrimeElement_isUniformizer_in_changedField_and_compositum + p u n).1.ne_zero) + +/-- The underlying field element of the negative changed prime unit is +`-theta`. -/ +@[simp] +theorem padicCompletedChangedUniformizerNegativePrimeUnit_coe + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + (padicCompletedChangedUniformizerNegativePrimeUnit p n u : + padicCompletedChangedUniformizerFixedField p u n) = + -padicCompletedChangedUniformizerPrimeElement p u n := + rfl + +/-- The field-unit norm of the negative changed prime is the actual +changed base uniformizer. -/ +theorem padicCompletedChangedUniformizerNegativePrimeUnit_norm + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + normUnits ℚ_[p] + (padicCompletedChangedUniformizerFixedField p u n) + (padicCompletedChangedUniformizerNegativePrimeUnit p n u) = + standardLubinTateChangedUniformizerUnit + (padicMultiplicativeLubinTateSeries_isUniformizer p) u := by + apply Units.ext + simpa only [normUnits_apply_coe, + padicCompletedChangedUniformizerNegativePrimeUnit_coe] using + (padicCompletedChangedUniformizer_norm_neg_primeElement p u n).trans + (standardLubinTateChangedUniformizerUnit_coe + (padicMultiplicativeLubinTateSeries_isUniformizer p) u).symm + +/-- The negative changed prime has normalized additive value `-1` in its +completed fixed field. -/ +theorem padicCompletedChangedUniformizerNegativePrimeUnit_valuationMap + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + let D := padicCompletedChangedUniformizerFixedField p u n + letI : NontriviallyNormedField D := + finiteExtensionSpectralNormedField ℚ_[p] D + letI : ValuativeRel D := + finiteExtensionSpectralValuativeRel ℚ_[p] D + letI : IsNonarchimedeanLocalField D := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] D + IsNonarchimedeanLocalField.valuationMap D + (Additive.ofMul + (padicCompletedChangedUniformizerNegativePrimeUnit p n u)) = + -1 := by + let D := padicCompletedChangedUniformizerFixedField p u n + let M := padicCompletedStandardChangedCompositum p u n + let : NontriviallyNormedField D := + finiteExtensionSpectralNormedField ℚ_[p] D + let : ValuativeRel D := + finiteExtensionSpectralValuativeRel ℚ_[p] D + let : IsNonarchimedeanLocalField D := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] D + let : NontriviallyNormedField M := + finiteExtensionSpectralNormedField ℚ_[p] M + let : ValuativeRel M := + finiteExtensionSpectralValuativeRel ℚ_[p] M + let : IsNonarchimedeanLocalField M := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] M + obtain ⟨htheta, _⟩ := + padicCompletedChangedUniformizerPrimeElement_isUniformizer_in_changedField_and_compositum + p u n + have hnegative : + (localCompleteDVF D).valuation.IsUniformizer + (-padicCompletedChangedUniformizerPrimeElement p u n : D) := by + simpa only [Valuation.IsUniformizer.iff, + (localCompleteDVF D).valuation.map_neg] using htheta + let negativeInteger : (localCompleteDVF D).valuationSubring := + ⟨-padicCompletedChangedUniformizerPrimeElement p u n, + hnegative.val_lt_one.le⟩ + have hunit : + padicCompletedChangedUniformizerNegativePrimeUnit p n u = + IsNonarchimedeanLocalField.uniformizerFieldUnit + D negativeInteger hnegative := by + apply Units.ext + rfl + rw [hunit] + exact + IsNonarchimedeanLocalField.valuationMap_uniformizerFieldUnit + D negativeInteger hnegative + +/-- The actual relative local Artin image of the negative changed prime is +the explicit inverse-coefficient-Frobenius candidate. -/ +theorem + padicCompletedChangedUniformizerRelativeArtin_negativePrime + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + let D := padicCompletedChangedUniformizerFixedField p u n + let M := padicCompletedStandardChangedCompositum p u n + letI : NontriviallyNormedField D := + finiteExtensionSpectralNormedField ℚ_[p] D + letI : ValuativeRel D := + finiteExtensionSpectralValuativeRel ℚ_[p] D + letI : IsNonarchimedeanLocalField D := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] D + letI : NontriviallyNormedField M := + finiteExtensionSpectralNormedField ℚ_[p] M + letI : ValuativeRel M := + finiteExtensionSpectralValuativeRel ℚ_[p] M + letI : IsNonarchimedeanLocalField M := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] M + letI : + Valuation.HasExtension (ValuativeRel.valuation D) + (ValuativeRel.valuation M) := + finiteExtensionSpectralValuation_hasExtension_of_tower ℚ_[p] D M + letI : + IsNonarchimedeanLocalField.IsUnramifiedValuedExtension D M := + padicCompletedStandardChangedCompositum_isUnramifiedValuedExtension + p u n + abelianLocalArtinMonoidHom D M + (padicCompletedChangedUniformizerNegativePrimeUnit p n u) = + padicCompletedChangedUniformizerRelativeArtinCandidate p u n := by + let D := padicCompletedChangedUniformizerFixedField p u n + let M := padicCompletedStandardChangedCompositum p u n + let : NontriviallyNormedField D := + finiteExtensionSpectralNormedField ℚ_[p] D + let : ValuativeRel D := + finiteExtensionSpectralValuativeRel ℚ_[p] D + let : IsNonarchimedeanLocalField D := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] D + let : NontriviallyNormedField M := + finiteExtensionSpectralNormedField ℚ_[p] M + let : ValuativeRel M := + finiteExtensionSpectralValuativeRel ℚ_[p] M + let : IsNonarchimedeanLocalField M := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] M + let : + Valuation.HasExtension (ValuativeRel.valuation D) + (ValuativeRel.valuation M) := + finiteExtensionSpectralValuation_hasExtension_of_tower ℚ_[p] D M + let : + IsNonarchimedeanLocalField.IsUnramifiedValuedExtension D M := + padicCompletedStandardChangedCompositum_isUnramifiedValuedExtension + p u n + calc + abelianLocalArtinMonoidHom D M + (padicCompletedChangedUniformizerNegativePrimeUnit p n u) = + (arithmeticFrobeniusOfUnramifiedValuation D M) ^ + IsNonarchimedeanLocalField.valuationMap D + (Additive.ofMul + (padicCompletedChangedUniformizerNegativePrimeUnit p n u)) := + abelianLocalArtinMonoidHom_eq_frobenius_zpow D M _ + _ = (arithmeticFrobeniusOfUnramifiedValuation D M) ^ (-1 : ℤ) := by + rw [padicCompletedChangedUniformizerNegativePrimeUnit_valuationMap] + _ = (arithmeticFrobeniusOfUnramifiedValuation D M)⁻¹ := by + rw [zpow_neg_one] + _ = padicCompletedChangedUniformizerRelativeArtinCandidate p u n := + (padicCompletedChangedUniformizerRelativeArtinCandidate_eq_inverseArithmeticFrobenius + p u n).symm + +section PadicStandardLevelRestriction + +private theorem padicArtinStandardLevel_normal + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Normal ℚ_[p] + (standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) n) := + (standardLubinTateLevelField_isGalois (F := padicLocalField p) + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).to_normal + +attribute [local instance] padicArtinStandardLevel_normal + +/-- Restricting the relative changed-prime Artin candidate to the standard +multiplicative level gives the direct finite unit-parameter automorphism. -/ +theorem + padicCompletedChangedUniformizerRelativeArtinCandidate_restrict_standardLevel + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let T := standardLubinTateLevelField hπ n + let M := padicCompletedStandardChangedCompositum p u n + letI : Algebra T M := + (padicStandardLevelToCompletedChangedCompositum + p u n).toRingHom.toAlgebra + letI : IsScalarTower ℚ_[p] T M := + IsScalarTower.of_algebraMap_eq' + (padicStandardLevelToCompletedChangedCompositum p u n).comp_algebraMap.symm + ((AlgEquiv.restrictNormalHom T).comp + (AlgEquiv.restrictScalarsHom ℚ_[p])) + (padicCompletedChangedUniformizerRelativeArtinCandidate + p u n) = + standardLubinTateUnitParameterEquivGal + (padicLocalField p) hπ n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u) := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let T := standardLubinTateLevelField hπ n + let M := padicCompletedStandardChangedCompositum p u n + let : Algebra T M := + (padicStandardLevelToCompletedChangedCompositum + p u n).toRingHom.toAlgebra + let : IsScalarTower ℚ_[p] T M := + IsScalarTower.of_algebraMap_eq' + (padicStandardLevelToCompletedChangedCompositum p u n).comp_algebraMap.symm + apply AlgEquiv.ext + intro x + apply (algebraMap T M).injective + rw [MonoidHom.comp_apply, AlgEquiv.restrictScalarsHom_apply] + change + algebraMap T M + (AlgEquiv.restrictNormal + ((AlgEquiv.restrictScalarsHom ℚ_[p]) + (padicCompletedChangedUniformizerRelativeArtinCandidate p u n)) T x) = + algebraMap T M + (standardLubinTateUnitParameterEquivGal + (padicLocalField p) hπ n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u) x) + rw [AlgEquiv.restrictNormal_commutes] + change + padicCompletedChangedUniformizerRelativeArtinCandidate p u n + (padicStandardLevelToCompletedChangedCompositum p u n x) = + padicStandardLevelToCompletedChangedCompositum p u n + (standardLubinTateUnitParameterEquivGal + (padicLocalField p) hπ n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u) x) + rw [ + padicCompletedChangedUniformizerRelativeArtinCandidate_apply, + padicCompletedChangedUniformizerArtinCandidate_standardLevel] + exact congrArg + (fun σ : Gal(T/ℚ_[p]) => + padicStandardLevelToCompletedChangedCompositum p u n (σ x)) + (standardLubinTateUnitParameterEquivGal_apply (padicLocalField p) hπ n + (standardLubinTateUnitParameterClass (padicLocalField p) n u)).symm + +end PadicStandardLevelRestriction + +/-- The chosen p-adic Lubin--Tate uniformizer is an actual norm from every +finite multiplicative level, hence its actual local Artin image is trivial. -/ +theorem padicMultiplicativeAbelianLocalArtin_baseUniformizer + (p : ℕ) [Fact p.Prime] (n : ℕ) : + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional ℚ_[p] L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsAbelianGalois ℚ_[p] L := + standardLubinTateLevelField_isAbelianGalois + (padicLocalField p) hπ n + abelianLocalArtinMonoidHom ℚ_[p] L + (standardLubinTateBaseUniformizerUnit hπ) = + 1 := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + let : FiniteDimensional ℚ_[p] L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsAbelianGalois ℚ_[p] L := + standardLubinTateLevelField_isAbelianGalois + (padicLocalField p) hπ n + have hnorm := + standardLubinTateBaseUniformizerUnit_mem_normSubgroup hπ n + change + standardLubinTateBaseUniformizerUnit hπ ∈ + localNormSubgroup ℚ_[p] L at hnorm + rw [← abelianLocalArtinMonoidHom_ker, MonoidHom.mem_ker] at hnorm + exact hnorm + +open CompleteDVF.higherPrincipalUnitGroup renaming + valuationSubringUnitFieldUnitHom_fieldUnitUniformizerUnitPart → + valuationSubringUnitFieldUnitHom_fieldUnitUniformizerUnitPart in +/-- The actual Artin value of an arbitrary p-adic field unit is already +determined by its valuation-zero part. This is an equality of the actual +maps: the discarded uniformizer power is an explicit norm from the standard +Lubin--Tate level. -/ +theorem padicMultiplicativeAbelianLocalArtin_eq_uniformizerUnitPart + (p : ℕ) [Fact p.Prime] (n : ℕ) (x : ℚ_[p]ˣ) : + let F := padicLocalField p + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional ℚ_[p] L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsAbelianGalois ℚ_[p] L := + standardLubinTateLevelField_isAbelianGalois F hπ n + abelianLocalArtinMonoidHom ℚ_[p] L x = + abelianLocalArtinMonoidHom ℚ_[p] L + (standardLubinTateUnitFactorFieldUnit F + (CompleteDVF.higherPrincipalUnitGroup.fieldUnitUniformizerUnitPart + F.toCompleteDVF hπ x)) := by + let F := padicLocalField p + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + let : FiniteDimensional ℚ_[p] L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsAbelianGalois ℚ_[p] L := + standardLubinTateLevelField_isAbelianGalois F hπ n + let φ := abelianLocalArtinMonoidHom ℚ_[p] L + let ϖ : ℚ_[p]ˣ := standardLubinTateBaseUniformizerUnit hπ + let u : F.valuationSubringˣ := + CompleteDVF.higherPrincipalUnitGroup.fieldUnitUniformizerUnitPart + F.toCompleteDVF hπ x + let e : ℤ := + CompleteDVF.uniformizerValueExponent F.toCompleteDVF hπ x + have hϖone : φ ϖ = 1 := by + simpa only [φ, ϖ] using + padicMultiplicativeAbelianLocalArtin_baseUniformizer p n + have huField : + standardLubinTateUnitFactorFieldUnit F u = + x * ϖ ^ (-e) := by + apply Units.ext + simpa only [ + u, e, ϖ, + standardLubinTateUnitFactorFieldUnit_coe, + CompleteDVF.coe_valuationSubringUnitsToFieldUnits_apply, + CompleteDVF.higherPrincipalUnitGroup.coe_valuationSubringUnitFieldUnitHom_apply, + standardLubinTateBaseUniformizerUnit] using + congrArg (fun z : ℚ_[p]ˣ => (z : ℚ_[p])) + (valuationSubringUnitFieldUnitHom_fieldUnitUniformizerUnitPart + F.toCompleteDVF hπ x) + calc + φ x = φ x * φ ϖ ^ (-e) := by + rw [hϖone, one_zpow, mul_one] + _ = φ (x * ϖ ^ (-e)) := by + rw [map_mul, map_zpow] + _ = φ (standardLubinTateUnitFactorFieldUnit F u) := by + rw [huField] + +/-- Multiplying the chosen uniformizer by a p-adic valuation-ring unit does +not change the actual local Artin value of the unit factor. -/ +theorem padicMultiplicativeAbelianLocalArtin_changedUniformizer + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional ℚ_[p] L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsAbelianGalois ℚ_[p] L := + standardLubinTateLevelField_isAbelianGalois + (padicLocalField p) hπ n + abelianLocalArtinMonoidHom ℚ_[p] L + (standardLubinTateChangedUniformizerUnit hπ u) = + abelianLocalArtinMonoidHom ℚ_[p] L + (standardLubinTateUnitFactorFieldUnit (padicLocalField p) u) := by + let F := padicLocalField p + let π : F.valuationSubring := + padicIntEquivValuationSubring p (p : ℤ_[p]) + let hπ : F.toCompleteDVF.valuation.IsUniformizer (π : ℚ_[p]) := + padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField (F := F) (π := π) hπ n + let : FiniteDimensional ℚ_[p] L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsAbelianGalois ℚ_[p] L := + standardLubinTateLevelField_isAbelianGalois + F hπ n + have hchanged : + standardLubinTateChangedUniformizerUnit hπ u = + standardLubinTateUnitFactorFieldUnit F u * + standardLubinTateBaseUniformizerUnit hπ := + standardLubinTateChangedUniformizerUnit_eq_unit_mul (F := F) hπ u + calc + abelianLocalArtinMonoidHom ℚ_[p] L + (standardLubinTateChangedUniformizerUnit hπ u) = + abelianLocalArtinMonoidHom ℚ_[p] L + (standardLubinTateUnitFactorFieldUnit F u * + standardLubinTateBaseUniformizerUnit hπ) := + congrArg (abelianLocalArtinMonoidHom ℚ_[p] L) hchanged + _ = abelianLocalArtinMonoidHom ℚ_[p] L + (standardLubinTateUnitFactorFieldUnit F u) := by + rw [map_mul, padicMultiplicativeAbelianLocalArtin_baseUniformizer p n, + mul_one] + +/-- On every finite multiplicative Lubin--Tate level, the actual local +Artin image of a p-adic valuation-ring unit is the direct finite +unit-parameter automorphism. + +This is obtained from the genuine changed-uniformizer extension: the +negative changed prime has norm `u p`, its relative Artin image is the +inverse arithmetic Frobenius, and norm--restriction carries that image to +the direct `u`-action on the standard level. -/ +theorem padicMultiplicativeAbelianLocalArtin_eq_unitParameter + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let T := standardLubinTateLevelField hπ n + letI : FiniteDimensional ℚ_[p] T := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsAbelianGalois ℚ_[p] T := + standardLubinTateLevelField_isAbelianGalois + (padicLocalField p) hπ n + abelianLocalArtinMonoidHom ℚ_[p] T + (standardLubinTateUnitFactorFieldUnit (padicLocalField p) u) = + standardLubinTateUnitParameterEquivGal + (padicLocalField p) hπ n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u) := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let T := standardLubinTateLevelField hπ n + let D := padicCompletedChangedUniformizerFixedField p u n + let M := padicCompletedStandardChangedCompositum p u n + let : FiniteDimensional ℚ_[p] T := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsAbelianGalois ℚ_[p] T := + standardLubinTateLevelField_isAbelianGalois + (padicLocalField p) hπ n + let : Algebra T M := + (padicStandardLevelToCompletedChangedCompositum + p u n).toRingHom.toAlgebra + let : IsScalarTower ℚ_[p] T M := + IsScalarTower.of_algebraMap_eq' + (padicStandardLevelToCompletedChangedCompositum p u n).comp_algebraMap.symm + let : FiniteDimensional D M := + FiniteDimensional.right ℚ_[p] D M + let : NontriviallyNormedField D := + finiteExtensionSpectralNormedField ℚ_[p] D + let : ValuativeRel D := + finiteExtensionSpectralValuativeRel ℚ_[p] D + let : IsNonarchimedeanLocalField D := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] D + let : NontriviallyNormedField M := + finiteExtensionSpectralNormedField ℚ_[p] M + let : ValuativeRel M := + finiteExtensionSpectralValuativeRel ℚ_[p] M + let : IsNonarchimedeanLocalField M := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] M + let : + Valuation.HasExtension (ValuativeRel.valuation ℚ_[p]) + (ValuativeRel.valuation D) := + finiteExtensionSpectralValuation_hasExtension ℚ_[p] D + let : + Valuation.HasExtension (ValuativeRel.valuation D) + (ValuativeRel.valuation M) := + finiteExtensionSpectralValuation_hasExtension_of_tower + ℚ_[p] D M + let : + IsNonarchimedeanLocalField.IsUnramifiedValuedExtension D M := + padicCompletedStandardChangedCompositum_isUnramifiedValuedExtension + p u n + have hnormRestriction := + DFunLike.congr_fun + (abelianLocalArtinMonoidHom_norm_restriction + ℚ_[p] D T M) + (padicCompletedChangedUniformizerNegativePrimeUnit p n u) + have hrelative : + abelianLocalArtinMonoidHom D M + (padicCompletedChangedUniformizerNegativePrimeUnit p n u) = + padicCompletedChangedUniformizerRelativeArtinCandidate p u n := + padicCompletedChangedUniformizerRelativeArtin_negativePrime p n u + have hrestrict : + ((AlgEquiv.restrictNormalHom T).comp + (AlgEquiv.restrictScalarsHom ℚ_[p])) + (padicCompletedChangedUniformizerRelativeArtinCandidate p u n) = + standardLubinTateUnitParameterEquivGal + (padicLocalField p) hπ n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u) := + padicCompletedChangedUniformizerRelativeArtinCandidate_restrict_standardLevel + p n u + have hnorm : + normUnits ℚ_[p] D + (padicCompletedChangedUniformizerNegativePrimeUnit p n u) = + standardLubinTateChangedUniformizerUnit hπ u := + padicCompletedChangedUniformizerNegativePrimeUnit_norm p n u + have hchanged : + abelianLocalArtinMonoidHom ℚ_[p] T + (standardLubinTateChangedUniformizerUnit hπ u) = + abelianLocalArtinMonoidHom ℚ_[p] T + (standardLubinTateUnitFactorFieldUnit (padicLocalField p) u) := + padicMultiplicativeAbelianLocalArtin_changedUniformizer p n u + have h : + standardLubinTateUnitParameterEquivGal + (padicLocalField p) hπ n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u) = + abelianLocalArtinMonoidHom ℚ_[p] T + (standardLubinTateUnitFactorFieldUnit (padicLocalField p) u) := by + simpa only [MonoidHom.comp_apply, hrelative, hrestrict, hnorm, hchanged] using + hnormRestriction + exact h.symm + +/-- The actual local Artin action of a p-adic valuation-ring unit on the +genuine multiplicative primitive point is exponentiation by the direct +unit parameter. -/ +theorem padicMultiplicativeAbelianLocalArtin_primitiveRoot + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let T := standardLubinTateLevelField hπ n + letI : FiniteDimensional ℚ_[p] T := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsAbelianGalois ℚ_[p] T := + standardLubinTateLevelField_isAbelianGalois + (padicLocalField p) hπ n + abelianLocalArtinMonoidHom ℚ_[p] T + (standardLubinTateUnitFactorFieldUnit (padicLocalField p) u) + (padicMultiplicativePrimitiveRoot p n) = + (padicMultiplicativePrimitiveRoot p n) ^ + (PadicInt.toZModPow (n + 1) + ((padicIntEquivValuationSubring p).symm + (u : (padicLocalField p).valuationSubring))).val := by + let F := padicLocalField p + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let T := standardLubinTateLevelField hπ n + let : FiniteDimensional ℚ_[p] T := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsAbelianGalois ℚ_[p] T := + standardLubinTateLevelField_isAbelianGalois F hπ n + have hArtin : + abelianLocalArtinMonoidHom ℚ_[p] T + (standardLubinTateUnitFactorFieldUnit F u) = + standardLubinTateUnitParameterEquivGal F hπ n + (standardLubinTateUnitParameterClass F n u) := + padicMultiplicativeAbelianLocalArtin_eq_unitParameter p n u + exact + (congrArg (fun σ : Gal(T/ℚ_[p]) => + σ (padicMultiplicativePrimitiveRoot p n)) hArtin).trans + (padicMultiplicativePrimitiveRoot_unitParameterGaloisAction p n u) + +/-- A p-adic valuation-ring unit invisible at level `n` has trivial image +under the actual abelian local Artin map of the multiplicative Lubin--Tate +level. + +The source is the changed-uniformizer equivalence: it proves that the field +unit is an actual norm, rather than merely postulating membership in the +Artin kernel. -/ +theorem + padicMultiplicativeAbelianLocalArtin_eq_one_of_mem_higherPrincipalUnitGroup + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) + (hu : u ∈ + CompleteDVF.higherPrincipalUnitGroup + (padicLocalField p).toCompleteDVF (n + 1)) : + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional ℚ_[p] L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsAbelianGalois ℚ_[p] L := + standardLubinTateLevelField_isAbelianGalois + (padicLocalField p) hπ n + abelianLocalArtinMonoidHom ℚ_[p] L + (standardLubinTateUnitFactorFieldUnit (padicLocalField p) u) = + 1 := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + let : FiniteDimensional ℚ_[p] L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsAbelianGalois ℚ_[p] L := + standardLubinTateLevelField_isAbelianGalois + (padicLocalField p) hπ n + have hnorm := + standardLubinTateUnitFactorFieldUnit_mem_standardNormSubgroup_of_mem_higher + hπ u n hu + change + standardLubinTateUnitFactorFieldUnit (padicLocalField p) u ∈ + localNormSubgroup ℚ_[p] L at hnorm + rw [← abelianLocalArtinMonoidHom_ker, MonoidHom.mem_ker] at hnorm + exact hnorm + +/-- The actual local Artin homomorphism on p-adic valuation-ring units, +descended through the finite parameter quotient +`O_pˣ / U_p^(n + 1)`. -/ +noncomputable def padicMultiplicativeArtinUnitParameterHom + (p : ℕ) [Fact p.Prime] (n : ℕ) : + standardLubinTateUnitParameter (padicLocalField p) n →* + Gal((standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) n)/ℚ_[p]) := by + let F := padicLocalField p + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional ℚ_[p] L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsAbelianGalois ℚ_[p] L := + standardLubinTateLevelField_isAbelianGalois F hπ n + exact + QuotientGroup.lift + (CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1)) + ((abelianLocalArtinMonoidHom ℚ_[p] L).comp + (CompleteDVF.valuationSubringUnitsToFieldUnits F.toCompleteDVF)) + (fun u hu => by + change + abelianLocalArtinMonoidHom ℚ_[p] L + (standardLubinTateUnitFactorFieldUnit F u) = + 1 + exact + padicMultiplicativeAbelianLocalArtin_eq_one_of_mem_higherPrincipalUnitGroup + p n u hu) + +/-- Evaluating the descended actual Artin homomorphism on a parameter class +recovers the actual Artin value of its valuation-ring-unit representative. -/ +@[simp] +theorem padicMultiplicativeArtinUnitParameterHom_apply_class + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + let F := padicLocalField p + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional ℚ_[p] L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsAbelianGalois ℚ_[p] L := + standardLubinTateLevelField_isAbelianGalois F hπ n + padicMultiplicativeArtinUnitParameterHom p n + (standardLubinTateUnitParameterClass F n u) = + abelianLocalArtinMonoidHom ℚ_[p] L + (standardLubinTateUnitFactorFieldUnit F u) := by + dsimp only + rfl + +/-- The actual Artin homomorphism on finite p-adic unit parameters is +surjective. Given an Artin preimage in `ℚ_pˣ`, remove its uniformizer power; +that power has trivial Artin image because the chosen uniformizer is an +actual norm from the Lubin--Tate level. -/ +theorem padicMultiplicativeArtinUnitParameterHom_surjective + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Function.Surjective (padicMultiplicativeArtinUnitParameterHom p n) := by + let F := padicLocalField p + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + let : FiniteDimensional ℚ_[p] L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsAbelianGalois ℚ_[p] L := + standardLubinTateLevelField_isAbelianGalois F hπ n + let φ := abelianLocalArtinMonoidHom ℚ_[p] L + intro σ + obtain ⟨x, hx⟩ := + abelianLocalArtinMonoidHom_surjective ℚ_[p] L σ + let u : F.valuationSubringˣ := + CompleteDVF.higherPrincipalUnitGroup.fieldUnitUniformizerUnitPart + F.toCompleteDVF hπ x + refine + ⟨standardLubinTateUnitParameterClass F n u, ?_⟩ + rw [padicMultiplicativeArtinUnitParameterHom_apply_class] + calc + φ (standardLubinTateUnitFactorFieldUnit F u) = + φ x := by + simpa only [φ, u] using + (padicMultiplicativeAbelianLocalArtin_eq_uniformizerUnitPart + p n x).symm + _ = σ := hx + +/-- The finite unit-parameter quotient is multiplicatively equivalent to the +actual Galois group through the actual local Artin map. + +This equivalence is constructed from the descended Artin map itself. It +does not identify its orientation with the independently constructed +explicit Lubin--Tate equivalence. -/ +noncomputable def padicMultiplicativeArtinUnitParameterEquiv + (p : ℕ) [Fact p.Prime] (n : ℕ) : + standardLubinTateUnitParameter (padicLocalField p) n ≃* + Gal((standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) n)/ℚ_[p]) := by + let F := padicLocalField p + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional ℚ_[p] L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsAbelianGalois ℚ_[p] L := + standardLubinTateLevelField_isAbelianGalois F hπ n + refine + MulEquiv.ofBijective + (padicMultiplicativeArtinUnitParameterHom p n) ?_ + apply + (Nat.bijective_iff_surjective_and_card + (padicMultiplicativeArtinUnitParameterHom p n)).2 + refine + ⟨padicMultiplicativeArtinUnitParameterHom_surjective p n, ?_⟩ + rw [ + standardLubinTateUnitParameter_natCard F n, + ← standardLubinTateLevelField_finrank hπ n, + ← standardLubinTateLevelField_natCard_gal hπ n] + +/-- The actual Artin equivalence evaluates on a finite unit-parameter class +as the actual local Artin automorphism of its representative. -/ +@[simp] +theorem padicMultiplicativeArtinUnitParameterEquiv_apply_class + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + let F := padicLocalField p + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional ℚ_[p] L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsAbelianGalois ℚ_[p] L := + standardLubinTateLevelField_isAbelianGalois F hπ n + padicMultiplicativeArtinUnitParameterEquiv p n + (standardLubinTateUnitParameterClass F n u) = + abelianLocalArtinMonoidHom ℚ_[p] L + (standardLubinTateUnitFactorFieldUnit F u) := by + dsimp only + rfl + +/-- The subgroup of `ℚ_pˣ` generated by the chosen uniformizer and the +valuation-ring units in `U^(n + 1)`. -/ +noncomputable def + padicMultiplicativeUniformizerHigherPrincipalUnitSubgroup + (p : ℕ) [Fact p.Prime] (n : ℕ) : Subgroup ℚ_[p]ˣ := + let F := padicLocalField p + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + Subgroup.zpowers (standardLubinTateBaseUniformizerUnit hπ) ⊔ + (CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF (n + 1)).map + (CompleteDVF.valuationSubringUnitsToFieldUnits F.toCompleteDVF) + +open CompleteDVF.higherPrincipalUnitGroup renaming + valuationSubringUnitFieldUnitHom_fieldUnitUniformizerUnitPart → + valuationSubringUnitFieldUnitHom_fieldUnitUniformizerUnitPart in +/-- The kernel of the actual local Artin map for the multiplicative p-adic +level is exactly the subgroup generated by the chosen uniformizer and +`U^(n + 1)`. + +The reverse containment uses the actual-Artin equivalence on finite unit +parameters, not a postulated norm-subgroup formula. -/ +theorem padicMultiplicativeAbelianLocalArtin_ker + (p : ℕ) [Fact p.Prime] (n : ℕ) : + let F := padicLocalField p + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional ℚ_[p] L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsAbelianGalois ℚ_[p] L := + standardLubinTateLevelField_isAbelianGalois F hπ n + (abelianLocalArtinMonoidHom ℚ_[p] L).ker = + padicMultiplicativeUniformizerHigherPrincipalUnitSubgroup p n := by + let F := padicLocalField p + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + let : FiniteDimensional ℚ_[p] L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsAbelianGalois ℚ_[p] L := + standardLubinTateLevelField_isAbelianGalois F hπ n + let φ := abelianLocalArtinMonoidHom ℚ_[p] L + let ϖ : ℚ_[p]ˣ := standardLubinTateBaseUniformizerUnit hπ + let H : Subgroup F.valuationSubringˣ := + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1) + let j : F.valuationSubringˣ →* ℚ_[p]ˣ := + CompleteDVF.valuationSubringUnitsToFieldUnits F.toCompleteDVF + change φ.ker = Subgroup.zpowers ϖ ⊔ H.map j + apply le_antisymm + · intro x hx + let u : F.valuationSubringˣ := + CompleteDVF.higherPrincipalUnitGroup.fieldUnitUniformizerUnitPart + F.toCompleteDVF hπ x + let e : ℤ := + CompleteDVF.uniformizerValueExponent F.toCompleteDVF hπ x + have hxArtin : φ x = 1 := + MonoidHom.mem_ker.mp hx + have hreduce : + φ x = φ (standardLubinTateUnitFactorFieldUnit F u) := by + simpa only [φ, u] using + padicMultiplicativeAbelianLocalArtin_eq_uniformizerUnitPart + p n x + have huArtin : + φ (standardLubinTateUnitFactorFieldUnit F u) = 1 := + hreduce.symm.trans hxArtin + have huClass : + standardLubinTateUnitParameterClass F n u = 1 := by + apply (padicMultiplicativeArtinUnitParameterEquiv p n).injective + rw [ + padicMultiplicativeArtinUnitParameterEquiv_apply_class, + map_one] + exact huArtin + have hu : u ∈ H := by + exact + (QuotientGroup.eq_one_iff (N := H) u).1 huClass + have huMap : j u ∈ H.map j := + ⟨u, hu, rfl⟩ + have hunit : + j u ∈ Subgroup.zpowers ϖ ⊔ H.map j := + (show H.map j ≤ Subgroup.zpowers ϖ ⊔ H.map j from le_sup_right) + huMap + have hpow : + ϖ ^ e ∈ Subgroup.zpowers ϖ ⊔ H.map j := + (show Subgroup.zpowers ϖ ≤ + Subgroup.zpowers ϖ ⊔ H.map j from le_sup_left) + (Subgroup.zpow_mem_zpowers ϖ e) + have huField : + j u = x * ϖ ^ (-e) := by + apply Units.ext + simpa only [ + j, u, e, ϖ, + CompleteDVF.coe_valuationSubringUnitsToFieldUnits_apply, + CompleteDVF.higherPrincipalUnitGroup.coe_valuationSubringUnitFieldUnitHom_apply, + standardLubinTateBaseUniformizerUnit] using + congrArg (fun z : ℚ_[p]ˣ => (z : ℚ_[p])) + (valuationSubringUnitFieldUnitHom_fieldUnitUniformizerUnitPart + F.toCompleteDVF hπ x) + have hxDecomposition : + x = j u * ϖ ^ e := by + rw [huField] + simp [mul_assoc] + rw [hxDecomposition] + exact + (Subgroup.zpowers ϖ ⊔ H.map j).mul_mem hunit hpow + · apply sup_le + · apply Subgroup.zpowers_le_of_mem + rw [MonoidHom.mem_ker] + simpa only [φ, ϖ] using + padicMultiplicativeAbelianLocalArtin_baseUniformizer p n + · rintro _ ⟨u, hu, rfl⟩ + rw [MonoidHom.mem_ker] + change + abelianLocalArtinMonoidHom ℚ_[p] L + (standardLubinTateUnitFactorFieldUnit F u) = + 1 + exact + padicMultiplicativeAbelianLocalArtin_eq_one_of_mem_higherPrincipalUnitGroup + p n u hu + +/-- The actual norm subgroup of the multiplicative p-adic level is the +uniformizer subgroup times `U^(n + 1)`. -/ +theorem + padicMultiplicativeLocalNormSubgroup_eq_uniformizerHigherPrincipalUnitSubgroup + (p : ℕ) [Fact p.Prime] (n : ℕ) : + let F := padicLocalField p + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional ℚ_[p] L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsAbelianGalois ℚ_[p] L := + standardLubinTateLevelField_isAbelianGalois F hπ n + localNormSubgroup ℚ_[p] L = + padicMultiplicativeUniformizerHigherPrincipalUnitSubgroup p n := by + let F := padicLocalField p + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + let : FiniteDimensional ℚ_[p] L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsAbelianGalois ℚ_[p] L := + standardLubinTateLevelField_isAbelianGalois F hπ n + calc + localNormSubgroup ℚ_[p] L = + (abelianLocalArtinMonoidHom ℚ_[p] L).ker := + (abelianLocalArtinMonoidHom_ker ℚ_[p] L).symm + _ = padicMultiplicativeUniformizerHigherPrincipalUnitSubgroup p n := + padicMultiplicativeAbelianLocalArtin_ker p n + +/-- On `U^(n + 1)`, the actual local Artin map agrees with the inverse +finite Lubin--Tate unit-parameter automorphism. -/ +theorem + padicMultiplicativeAbelianLocalArtin_eq_unitParameter_of_mem_higherPrincipalUnitGroup + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) + (hu : u ∈ + CompleteDVF.higherPrincipalUnitGroup + (padicLocalField p).toCompleteDVF (n + 1)) : + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional ℚ_[p] L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsAbelianGalois ℚ_[p] L := + standardLubinTateLevelField_isAbelianGalois + (padicLocalField p) hπ n + abelianLocalArtinMonoidHom ℚ_[p] L + (standardLubinTateUnitFactorFieldUnit (padicLocalField p) u) = + (standardLubinTateUnitParameterEquivGal + (padicLocalField p) hπ n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u))⁻¹ := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + let : FiniteDimensional ℚ_[p] L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsAbelianGalois ℚ_[p] L := + standardLubinTateLevelField_isAbelianGalois + (padicLocalField p) hπ n + have hArtin : + abelianLocalArtinMonoidHom ℚ_[p] L + (standardLubinTateUnitFactorFieldUnit (padicLocalField p) u) = + 1 := + padicMultiplicativeAbelianLocalArtin_eq_one_of_mem_higherPrincipalUnitGroup + p n u hu + have hParameter : + standardLubinTateUnitParameterClass (padicLocalField p) n u = 1 := by + exact + (QuotientGroup.eq_one_iff + (N := + CompleteDVF.higherPrincipalUnitGroup + (padicLocalField p).toCompleteDVF (n + 1)) u).2 hu + calc + abelianLocalArtinMonoidHom ℚ_[p] L + (standardLubinTateUnitFactorFieldUnit (padicLocalField p) u) = 1 := + hArtin + _ = (standardLubinTateUnitParameterEquivGal + (padicLocalField p) hπ n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u))⁻¹ := by + rw [hParameter, map_one, inv_one] + +/-- On an invisible principal unit, the actual local Artin automorphism acts +on the chosen primitive `p ^ (n + 1)`-st root by the explicit inverse-unit +exponent. -/ +theorem + padicMultiplicativeAbelianLocalArtin_primitiveRoot_of_mem_higherPrincipalUnitGroup + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) + (hu : u ∈ + CompleteDVF.higherPrincipalUnitGroup + (padicLocalField p).toCompleteDVF (n + 1)) : + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional ℚ_[p] L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsAbelianGalois ℚ_[p] L := + standardLubinTateLevelField_isAbelianGalois + (padicLocalField p) hπ n + (abelianLocalArtinMonoidHom ℚ_[p] L + (standardLubinTateUnitFactorFieldUnit (padicLocalField p) u)) + (padicMultiplicativePrimitiveRoot p n) = + padicMultiplicativePrimitiveRoot p n ^ + (PadicInt.toZModPow (p := p) (n + 1) + ((padicIntEquivValuationSubring p).symm + ((u⁻¹ : (padicLocalField p).valuationSubringˣ) : + (padicLocalField p).valuationSubring))).val := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + let : FiniteDimensional ℚ_[p] L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsAbelianGalois ℚ_[p] L := + standardLubinTateLevelField_isAbelianGalois + (padicLocalField p) hπ n + let F := padicLocalField p + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + let : FiniteDimensional ℚ_[p] L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsAbelianGalois ℚ_[p] L := + standardLubinTateLevelField_isAbelianGalois F hπ n + have hArtin : + abelianLocalArtinMonoidHom ℚ_[p] L + (standardLubinTateUnitFactorFieldUnit F u) = + (standardLubinTateUnitParameterEquivGal F hπ n + (standardLubinTateUnitParameterClass F n u))⁻¹ := + padicMultiplicativeAbelianLocalArtin_eq_unitParameter_of_mem_higherPrincipalUnitGroup + p n u hu + exact + (congrArg (fun σ : Gal(L/ℚ_[p]) => + σ (padicMultiplicativePrimitiveRoot p n)) hArtin).trans + (padicMultiplicativePrimitiveRoot_galoisAction p n u) + +end LocalClassFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardArtinComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardArtinComparison.lean new file mode 100644 index 0000000000..51886d15ff --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardArtinComparison.lean @@ -0,0 +1,363 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormSubgroup +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.RestrictionKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelFieldTower +/-! +# Standard local Artin map on equal-characteristic Lubin--Tate levels + +This file compares the principal-unit filtration transported by the standard +finite local Artin map with the actual upper ramification filtration of an +explicit equal-characteristic Lubin--Tate level. + +The proof uses restriction to the lower Lubin--Tate level rather than a +pointwise comparison between the standard Artin map and the explicit +power-series action. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries ValuativeRel + +universe v + +namespace LocalClassFieldTheory + +open RamificationTheory.LocalField +open RamificationTheory +open LubinTate + +open LocalClassFieldTheory +open LocalFieldTheory +open LocalFieldTheory.DiscreteValuationField +open LubinTate.EqualCharacteristic +open RamificationTheory.HilbertRamification.Higher +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +private theorem natCard_ker_eq_pow_sub_of_surjective + {G H : Type*} [Group G] [Group H] + (ψ : G →* H) (hψ : Function.Surjective ψ) + (q m n : ℕ) (hmn : m ≤ n) (hq : 1 < q) + (hcardG : Nat.card G = (q - 1) * q ^ n) + (hcardH : Nat.card H = (q - 1) * q ^ m) : + Nat.card ψ.ker = q ^ (n - m) := by + have hindex : ψ.ker.index = Nat.card H := by + rw [Subgroup.index_ker, + ψ.range_eq_top_of_surjective hψ, + Subgroup.card_top] + have hcardKerMul : + Nat.card ψ.ker * Nat.card H = Nat.card G := by + rw [← hindex] + exact Subgroup.card_mul_index ψ.ker + rw [hcardH, hcardG] at hcardKerMul + have hfactor_pos : 0 < (q - 1) * q ^ m := by + exact Nat.mul_pos (Nat.sub_pos_of_lt hq) (Nat.pow_pos (by omega)) + have hpow : q ^ n = q ^ m * q ^ (n - m) := by + rw [← pow_add, Nat.add_sub_of_le hmn] + apply Nat.eq_of_mul_eq_mul_left hfactor_pos + calc + ((q - 1) * q ^ m) * Nat.card ψ.ker = + Nat.card ψ.ker * ((q - 1) * q ^ m) := Nat.mul_comm _ _ + _ = (q - 1) * q ^ n := hcardKerMul + _ = ((q - 1) * q ^ m) * q ^ (n - m) := by + rw [hpow, Nat.mul_assoc] + +variable {K₀ : Type} [Field K₀] + +/-- On a tower of explicit levels `m + 1 ≤ n + 1`, the standard local Artin +image of `U^(m + 1)` is the kernel of restriction to level `m + 1`. -/ +theorem + equalCharacteristicLubinTateArtinPrincipalUnitsImage_eq_restrictKer + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + {m n : ℕ} (hmn : m ≤ n) : + let B := F.residueField⸨X⸩ + let E := equalCharacteristicLubinTateLevelField F m + let L := equalCharacteristicLubinTateLevelField F n + letI : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + letI : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + letI : FiniteDimensional B E := + equalCharacteristicLubinTateLevelField_finiteDimensional F m + letI : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + (LocalFieldTheory.fieldPrincipalUnits B (m + 1)).map + (abelianLocalArtinMonoidHom B L) = + (intermediateFieldRestrictNormalHom E L + (equalCharacteristicLubinTateLevelField_mono F hmn)).ker := by + let B := F.residueField⸨X⸩ + let E := equalCharacteristicLubinTateLevelField F m + let L := equalCharacteristicLubinTateLevelField F n + let pi : Bˣ := (equalCharacteristicLaurentUniformizerUnit F)⁻¹ + let : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + let : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + let : FiniteDimensional B E := + equalCharacteristicLubinTateLevelField_finiteDimensional F m + let : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + let hEL : E ≤ L := equalCharacteristicLubinTateLevelField_mono F hmn + let φ := abelianLocalArtinMonoidHom B L + let ψ := intermediateFieldRestrictNormalHom E L hEL + have hker : + (ψ.comp φ).ker = + Subgroup.zpowers pi ⊔ LocalFieldTheory.fieldPrincipalUnits B (m + 1) := by + rw [show ψ.comp φ = abelianLocalArtinMonoidHom B E by + exact abelianLocalArtinMonoidHom_restrict B E L hEL] + rw [abelianLocalArtinMonoidHom_ker] + change equalCharacteristicLubinTateNormSubgroup F m = + Subgroup.zpowers pi ⊔ LocalFieldTheory.fieldPrincipalUnits B (m + 1) + simpa [B, pi, LocalFieldTheory.uniformizerPrincipalSubgroup] using + equalCharacteristicLubinTateNormSubgroup_eq_uniformizerPrincipalSubgroup + F m + have hZ : Subgroup.zpowers pi ≤ φ.ker := by + rw [abelianLocalArtinMonoidHom_ker] + change Subgroup.zpowers pi ≤ + equalCharacteristicLubinTateNormSubgroup F n + rw [ + equalCharacteristicLubinTateNormSubgroup_eq_uniformizerPrincipalSubgroup] + simp [B, pi, LocalFieldTheory.uniformizerPrincipalSubgroup] + exact Subgroup.map_eq_ker_of_comp_ker_eq_sup_of_left_le_ker + φ ψ (Subgroup.zpowers pi) (LocalFieldTheory.fieldPrincipalUnits B (m + 1)) + (abelianLocalArtinMonoidHom_surjective B L) hker hZ + +/-- The explicitly chosen complete-DVF upper group agrees with the canonical +local upper ramification group on the same Lubin--Tate level field. -/ +theorem + equalCharacteristicLubinTateRealUpperRamificationGroup_eq_localUpperRamificationGroup + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) (t : ℝ) : + let B := F.residueField⸨X⸩ + let L := equalCharacteristicLubinTateLevelField F n + letI : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + letI : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + letI : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + equalCharacteristicLubinTateRealUpperRamificationGroup F n t = + localUpperRamificationGroup B L t := by + let B := F.residueField⸨X⸩ + let L := equalCharacteristicLubinTateLevelField F n + let : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + let : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + let : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + let base := localCompleteDVF B + let targetLocal := chosenLocalExtensionCompleteDVF B L + let targetLT := equalCharacteristicLubinTateLevelCompleteDVF F n + let : base.valuation.HasExtension targetLT.valuation := by + change + (equalCharacteristicLubinTateBaseCompleteDVF F).valuation.HasExtension + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuation + exact equalCharacteristicLubinTateLevelCompleteDVF_hasExtension F n + let huniqLocal : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + base.toDVF targetLocal.toDVF := + chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension B L + let huniqLT : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + base.toDVF targetLT.toDVF := by + change + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF + (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF + exact + equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + F n + have hvaluationSubring : + targetLocal.valuation.valuationSubring = + targetLT.valuation.valuationSubring := by + exact + (_root_.Valuation.isEquiv_iff_valuationSubring + targetLocal.valuation targetLT.valuation).1 + (chosenLocalExtensionCompleteDVF_hasUniqueValuationExtension B L + targetLT.valuation) + change + upperRamificationGroupOfUniqueExtension + (base := base.toDVF) (target := targetLT.toDVF) + huniqLT t = + upperRamificationGroupOfUniqueExtension + (base := base.toDVF) (target := targetLocal.toDVF) + huniqLocal t + exact + (upperRamificationGroup_eq_of_valuationSubring_eq + huniqLocal huniqLT hvaluationSubring t).symm + +/-- For `1 ≤ k ≤ n + 1`, the `k`-th upper ramification group of level +`n + 1` is the kernel of restriction to level `k`. -/ +theorem + equalCharacteristicLubinTateRealUpperRamificationGroup_eq_restrictKer + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n k : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) : + let B := F.residueField⸨X⸩ + let m := k - 1 + let E := equalCharacteristicLubinTateLevelField F m + let L := equalCharacteristicLubinTateLevelField F n + letI : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + letI : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + letI : FiniteDimensional B E := + equalCharacteristicLubinTateLevelField_finiteDimensional F m + letI : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + equalCharacteristicLubinTateRealUpperRamificationGroup F n (k : ℝ) = + (intermediateFieldRestrictNormalHom E L + (equalCharacteristicLubinTateLevelField_mono F + (Nat.sub_le_iff_le_add.2 hkn))).ker := by + let B := F.residueField⸨X⸩ + let m := k - 1 + let E := equalCharacteristicLubinTateLevelField F m + let L := equalCharacteristicLubinTateLevelField F n + let : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + let : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + let : FiniteDimensional B E := + equalCharacteristicLubinTateLevelField_finiteDimensional F m + let : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + let : IsAbelianGalois B E := + equalCharacteristicLubinTateLevelField_isAbelianGalois F m + let : IsAbelianGalois B L := + equalCharacteristicLubinTateLevelField_isAbelianGalois F n + let hmn : m ≤ n := by + simpa only [m] using Nat.sub_le_iff_le_add.2 hkn + let hEL : E ≤ L := equalCharacteristicLubinTateLevelField_mono F hmn + let ψ := intermediateFieldRestrictNormalHom E L hEL + have hmap : + Subgroup.map ψ + (equalCharacteristicLubinTateRealUpperRamificationGroup + F n (k : ℝ)) = + equalCharacteristicLubinTateRealUpperRamificationGroup + F m (k : ℝ) := by + rw [ + equalCharacteristicLubinTateRealUpperRamificationGroup_eq_localUpperRamificationGroup, + equalCharacteristicLubinTateRealUpperRamificationGroup_eq_localUpperRamificationGroup] + exact localUpperRamificationGroup_map_restrict B E L hEL (k : ℝ) + have hkm : k ≤ m + 1 := by + dsimp only [m] + omega + have hcardLower : + Nat.card + (equalCharacteristicLubinTateRealUpperRamificationGroup + F m (k : ℝ)) = 1 := by + rw [ + equalCharacteristicLubinTateRealUpperRamificationGroup_natCard + F m k hk hkm] + have hmkeq : m + 1 = k := by + dsimp only [m] + omega + rw [hmkeq, Nat.sub_self, pow_zero] + have hLowerBot : + equalCharacteristicLubinTateRealUpperRamificationGroup + F m (k : ℝ) = ⊥ := by + exact Subgroup.eq_bot_of_card_le _ (by omega) + have hUpperLeKer : + equalCharacteristicLubinTateRealUpperRamificationGroup + F n (k : ℝ) ≤ ψ.ker := by + apply (Subgroup.map_eq_bot_iff + (equalCharacteristicLubinTateRealUpperRamificationGroup + F n (k : ℝ))).1 + exact hmap.trans hLowerBot + have hψ_surjective : Function.Surjective ψ := by + intro σ + obtain ⟨a, ha⟩ := + abelianLocalArtinMonoidHom_surjective B E σ + refine ⟨abelianLocalArtinMonoidHom B L a, ?_⟩ + exact + (DFunLike.congr_fun + (abelianLocalArtinMonoidHom_restrict B E L hEL) a).trans ha + let q := Nat.card F.residueField + have hcardGalE : + Nat.card (Gal(E/B)) = (q - 1) * q ^ m := by + calc + Nat.card (Gal(E/B)) = + Module.finrank B E := by + simpa [B, E] using + equalCharacteristicLubinTateLevelField_natCard_gal F m + _ = (q - 1) * q ^ m := by + simpa [B, E, q] using + equalCharacteristicLubinTateLevelField_finrank F m + have hcardGalL : + Nat.card (Gal(L/B)) = (q - 1) * q ^ n := by + calc + Nat.card (Gal(L/B)) = + Module.finrank B L := by + simpa [B, L] using + equalCharacteristicLubinTateLevelField_natCard_gal F n + _ = (q - 1) * q ^ n := by + simpa [B, L, q] using + equalCharacteristicLubinTateLevelField_finrank F n + have hcardKer : + Nat.card ψ.ker = q ^ (n - m) := by + exact + natCard_ker_eq_pow_sub_of_surjective + ψ hψ_surjective q m n hmn + (Finite.one_lt_card : 1 < Nat.card F.residueField) + hcardGalL hcardGalE + have hexponent : n - m = n + 1 - k := by + dsimp only [m] + omega + have hcardUpper : + Nat.card + (equalCharacteristicLubinTateRealUpperRamificationGroup + F n (k : ℝ)) = + q ^ (n + 1 - k) := by + simpa [q] using + equalCharacteristicLubinTateRealUpperRamificationGroup_natCard + F n k hk hkn + apply Subgroup.eq_of_le_of_card_ge hUpperLeKer + rw [hcardKer, hexponent, hcardUpper] + +/-- Filtered local reciprocity for an explicit equal-characteristic +Lubin--Tate level: the standard local Artin image of `U^k` is the actual +canonical upper ramification group `G^k`. -/ +theorem + equalCharacteristicLubinTateArtinPrincipalUnitsImage_eq_localUpperRamificationGroup + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n k : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) : + let B := F.residueField⸨X⸩ + let L := equalCharacteristicLubinTateLevelField F n + letI : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + letI : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + letI : FiniteDimensional B L := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + (LocalFieldTheory.fieldPrincipalUnits B k).map (abelianLocalArtinMonoidHom B L) = + localUpperRamificationGroup B L (k : ℝ) := by + let m := k - 1 + have hmn : m ≤ n := by + dsimp only [m] + omega + have hArtin := + equalCharacteristicLubinTateArtinPrincipalUnitsImage_eq_restrictKer + F hmn + have hUpper := + equalCharacteristicLubinTateRealUpperRamificationGroup_eq_restrictKer + F n k hk hkn + have hChoice := + equalCharacteristicLubinTateRealUpperRamificationGroup_eq_localUpperRamificationGroup + F n (k : ℝ) + simpa [m, Nat.sub_add_cancel hk] using + hArtin.trans (hUpper.symm.trans hChoice) + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFilteredArtinComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFilteredArtinComparison.lean new file mode 100644 index 0000000000..3fb0948b3b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFilteredArtinComparison.lean @@ -0,0 +1,648 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LocalUpperRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormSubgroupExact +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Filtration +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction +/-! +# Filtered Artin comparison for standard Lubin--Tate levels + +This module records the characteristic-independent part of the filtered +Artin comparison for the canonical standard Lubin--Tate tower. + +The local Artin image of a lower level's norm subgroup is the kernel of +restriction from a higher level, and powers of the chosen base uniformizer +lie in the Artin kernel. The source theorem +`standardLubinTateCanonicalUniformizerPrincipalSubgroup_eq_normSubgroup` +identifies the canonical norm subgroup with the canonical +uniformizer-principal subgroup. Rewriting by this equality and cancelling +the uniformizer factor gives the positive integral Artin comparison; +`standardLubinTateRealUpperRamificationGroup_eq_restrictKer` identifies the +same restriction kernel with the upper ramification group. Concretely, the +proof composes +`standardLubinTateNormSubgroup_map_artin_eq_restrictKer`, +`standardLubinTateBaseUniformizerUnit_zpowers_le_artinKer`, and +`standardLubinTateRealUpperRamificationGroup_eq_restrictKer`, using the exact +norm formula only as the source-produced rewrite between the first two steps. + +No norm-subgroup equality or containment is accepted as a theorem +hypothesis here. The imported equality is proved from the +changed-uniformizer construction, and the zero-index comparison needs only +the independently known uniformizer norm. +-/ + +@[expose] public section + +noncomputable +section + +open scoped ValuativeRel + +namespace LocalClassFieldTheory + +open RamificationTheory RamificationTheory.LocalField + +open LocalClassFieldTheory +open LocalFieldTheory +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.IsNonarchimedeanLocalField +open LubinTate +open RamificationTheory.HilbertRamification.Higher + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- Mapping the kernel of a composite through a surjective first map gives +the kernel of the second map. -/ +theorem map_composite_ker_eq_ker_of_surjective + {A G H : Type*} [Group A] [Group G] [Group H] + (φ : A →* G) (ψ : G →* H) + (hφ : Function.Surjective φ) : + (ψ.comp φ).ker.map φ = ψ.ker := by + rw [← MonoidHom.comap_ker, Subgroup.map_comap_eq, + φ.range_eq_top_of_surjective hφ, top_inf_eq] + +/-- In a tower of standard Lubin--Tate levels, the Artin image of the lower +level norm subgroup is exactly the kernel of restriction to that level. -/ +theorem standardLubinTateNormSubgroup_map_artin_eq_restrictKer + {π : (standardLocalField K).valuationSubring} + (hπ : + (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + {m n : ℕ} (hmn : m ≤ n) : + let F := standardLocalField K + let E := standardLubinTateLevelField hπ m + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional K E := + standardLubinTateLevelField_finiteDimensional hπ m + letI : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsAbelianGalois K E := + standardLubinTateLevelField_isAbelianGalois F hπ m + letI : IsAbelianGalois K L := + standardLubinTateLevelField_isAbelianGalois F hπ n + (standardLubinTateNormSubgroup hπ m).map + (abelianLocalArtinMonoidHom K L) = + (intermediateFieldRestrictNormalHom E L + (standardLubinTateLevelField_mono hπ hmn)).ker := by + let F := standardLocalField K + let E := standardLubinTateLevelField hπ m + let L := standardLubinTateLevelField hπ n + let : FiniteDimensional K E := + standardLubinTateLevelField_finiteDimensional hπ m + let : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsAbelianGalois K E := + standardLubinTateLevelField_isAbelianGalois F hπ m + let : IsAbelianGalois K L := + standardLubinTateLevelField_isAbelianGalois F hπ n + let hEL : E ≤ L := standardLubinTateLevelField_mono hπ hmn + let φ := abelianLocalArtinMonoidHom K L + let ψ := intermediateFieldRestrictNormalHom E L hEL + have hrestrict : + ψ.comp φ = abelianLocalArtinMonoidHom K E := + abelianLocalArtinMonoidHom_restrict K E L hEL + have hker : + (ψ.comp φ).ker = standardLubinTateNormSubgroup hπ m := by + rw [hrestrict, abelianLocalArtinMonoidHom_ker] + rfl + calc + (standardLubinTateNormSubgroup hπ m).map φ = + (ψ.comp φ).ker.map φ := by rw [hker] + _ = ψ.ker := + map_composite_ker_eq_ker_of_surjective + φ ψ (abelianLocalArtinMonoidHom_surjective K L) + +/-- Every integral power of the chosen standard base uniformizer lies in +the kernel of the standard finite Artin map. -/ +theorem standardLubinTateBaseUniformizerUnit_zpowers_le_artinKer + {π : (standardLocalField K).valuationSubring} + (hπ : + (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + (n : ℕ) : + let F := standardLocalField K + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsAbelianGalois K L := + standardLubinTateLevelField_isAbelianGalois F hπ n + Subgroup.zpowers (standardLubinTateBaseUniformizerUnit hπ) ≤ + (abelianLocalArtinMonoidHom K L).ker := by + let F := standardLocalField K + let L := standardLubinTateLevelField hπ n + let : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsAbelianGalois K L := + standardLubinTateLevelField_isAbelianGalois F hπ n + dsimp only + rw [abelianLocalArtinMonoidHom_ker] + change + Subgroup.zpowers (standardLubinTateBaseUniformizerUnit hπ) ≤ + standardLubinTateNormSubgroup hπ n + exact + standardLubinTateBaseUniformizerUnit_zpowers_le_normSubgroup hπ n + +/-- In a tower of canonical standard Lubin--Tate levels, the local Artin +image of `U_K^(m+1)` is exactly the kernel of restriction to level `m`. + +The exact norm-subgroup formula supplies the composite kernel +`⟨ϖ⟩ · U_K^(m+1)`. The uniformizer factor is already in the kernel of the +Artin map to the upper level, so only the principal-unit image remains. -/ +theorem + standardLubinTateCanonicalArtinPrincipalUnitsImage_eq_restrictKer + {m n : ℕ} (hmn : m ≤ n) : + let F := standardLocalField K + let hπ := standardLocalFieldUniformizer_isUniformizer K + let E := standardLubinTateLevelField hπ m + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional K E := + standardLubinTateLevelField_finiteDimensional hπ m + letI : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsAbelianGalois K E := + standardLubinTateLevelField_isAbelianGalois F hπ m + letI : IsAbelianGalois K L := + standardLubinTateLevelField_isAbelianGalois F hπ n + (LocalFieldTheory.fieldPrincipalUnits K (m + 1)).map + (abelianLocalArtinMonoidHom K L) = + (intermediateFieldRestrictNormalHom E L + (standardLubinTateLevelField_mono hπ hmn)).ker := by + let F := standardLocalField K + let hπ := standardLocalFieldUniformizer_isUniformizer K + let E := standardLubinTateLevelField hπ m + let L := standardLubinTateLevelField hπ n + let : FiniteDimensional K E := + standardLubinTateLevelField_finiteDimensional hπ m + let : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsAbelianGalois K E := + standardLubinTateLevelField_isAbelianGalois F hπ m + let : IsAbelianGalois K L := + standardLubinTateLevelField_isAbelianGalois F hπ n + let φ := abelianLocalArtinMonoidHom K L + let Z := Subgroup.zpowers (standardLubinTateBaseUniformizerUnit hπ) + let U := LocalFieldTheory.fieldPrincipalUnits K (m + 1) + have hZ : Z ≤ φ.ker := by + simpa only [Z, φ] using + standardLubinTateBaseUniformizerUnit_zpowers_le_artinKer + K hπ n + have hZU : + Z ⊔ U = standardLubinTateNormSubgroup hπ m := by + simpa [Z, U, LocalFieldTheory.uniformizerPrincipalSubgroup] using + standardLubinTateCanonicalUniformizerPrincipalSubgroup_eq_normSubgroup + K m + calc + (LocalFieldTheory.fieldPrincipalUnits K (m + 1)).map φ = + ⊥ ⊔ U.map φ := by simp [U] + _ = Z.map φ ⊔ U.map φ := by + rw [(Subgroup.map_eq_bot_iff Z).2 hZ] + _ = (Z ⊔ U).map φ := + (Subgroup.map_sup Z U φ).symm + _ = (standardLubinTateNormSubgroup hπ m).map φ := by + rw [hZU] + _ = + (intermediateFieldRestrictNormalHom E L + (standardLubinTateLevelField_mono hπ hmn)).ker := by + simpa [F, hπ, E, L, φ] using + standardLubinTateNormSubgroup_map_artin_eq_restrictKer + K hπ hmn + +/-- Integral filtered local reciprocity for a canonical standard +Lubin--Tate level. At every positive visible index `k`, the Artin image of +`U_K^k` is the canonical local upper ramification group at `k`. -/ +theorem + standardLubinTateCanonicalArtinPrincipalUnitsImage_eq_localUpperRamificationGroup + (n k : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) : + let F := standardLocalField K + let hπ := standardLocalFieldUniformizer_isUniformizer K + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsAbelianGalois K L := + standardLubinTateLevelField_isAbelianGalois F hπ n + artinPrincipalUnitGroup K L k = + localUpperRamificationGroup K L (k : ℝ) := by + let F := standardLocalField K + let hπ := standardLocalFieldUniformizer_isUniformizer K + let L := standardLubinTateLevelField hπ n + let m := k - 1 + let : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsAbelianGalois K L := + standardLubinTateLevelField_isAbelianGalois F hπ n + have hmn : m ≤ n := by + dsimp only [m] + omega + have hArtin := + standardLubinTateCanonicalArtinPrincipalUnitsImage_eq_restrictKer + K hmn + have hUpper := + standardLubinTateRealUpperRamificationGroup_eq_restrictKer + K hπ n k hk hkn + have hLocal := + standardLubinTateRealUpperRamificationGroup_eq_localUpperRamificationGroup + K hπ n (k : ℝ) + simpa [artinPrincipalUnitGroup, m, Nat.sub_add_cancel hk] using + hArtin.trans (hUpper.symm.trans hLocal) + +/-- The canonical local upper ramification group is trivial at the first +integral index beyond the nontrivial range of standard level `n`. -/ +theorem + standardLubinTateCanonicalLocalUpperRamificationGroup_succ_eq_bot + (n : ℕ) : + let F := standardLocalField K + let hπ := standardLocalFieldUniformizer_isUniformizer K + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsGalois K L := + standardLubinTateLevelField_isGalois (F := F) hπ n + localUpperRamificationGroup K L ((n + 1 : ℕ) : ℝ) = ⊥ := by + let F := standardLocalField K + let hπ := standardLocalFieldUniformizer_isUniformizer K + let L := standardLubinTateLevelField hπ n + let : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsGalois K L := + standardLubinTateLevelField_isGalois (F := F) hπ n + have hcard : + Nat.card + (standardLubinTateRealUpperRamificationGroup + hπ n ((n + 1 : ℕ) : ℝ)) = 1 := by + simpa using + standardLubinTateRealUpperRamificationGroup_natCard + F hπ n (n + 1) (by omega) (by omega) + have hbot : + standardLubinTateRealUpperRamificationGroup + hπ n ((n + 1 : ℕ) : ℝ) = ⊥ := + Subgroup.eq_bot_of_card_le _ (by omega) + calc + localUpperRamificationGroup K L ((n + 1 : ℕ) : ℝ) = + standardLubinTateRealUpperRamificationGroup + hπ n ((n + 1 : ℕ) : ℝ) := + (standardLubinTateRealUpperRamificationGroup_eq_localUpperRamificationGroup + K hπ n ((n + 1 : ℕ) : ℝ)).symm + _ = ⊥ := hbot + +/-- The Artin image of `U_K^(n+1)` is trivial on canonical standard level +`n`. -/ +theorem + standardLubinTateCanonicalArtinPrincipalUnitGroup_succ_eq_bot + (n : ℕ) : + let F := standardLocalField K + let hπ := standardLocalFieldUniformizer_isUniformizer K + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsAbelianGalois K L := + standardLubinTateLevelField_isAbelianGalois F hπ n + artinPrincipalUnitGroup K L (n + 1) = ⊥ := by + let F := standardLocalField K + let hπ := standardLocalFieldUniformizer_isUniformizer K + let L := standardLubinTateLevelField hπ n + let : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsAbelianGalois K L := + standardLubinTateLevelField_isAbelianGalois F hπ n + exact + (standardLubinTateCanonicalArtinPrincipalUnitsImage_eq_localUpperRamificationGroup + K n (n + 1) (by omega) (by omega)).trans + (standardLubinTateCanonicalLocalUpperRamificationGroup_succ_eq_bot + K n) + +/-- The canonical standard subgroup and the canonical standard norm +subgroup have the same index. -/ +theorem + standardLubinTateCanonicalUniformizerPrincipalSubgroup_index_eq_normSubgroup_index + (n : ℕ) : + (LocalFieldTheory.uniformizerPrincipalSubgroup K + (standardLubinTateBaseUniformizerUnit + (standardLocalFieldUniformizer_isUniformizer K)) + 1 (n + 1)).index = + (standardLubinTateNormSubgroup + (standardLocalFieldUniformizer_isUniformizer K) n).index := by + rw [ + standardLubinTateCanonicalUniformizerPrincipalSubgroup_index, + standardLubinTateCanonicalNormSubgroup_index] + +/-- The index of the canonical uniformizer-principal subgroup is nonzero, +so equality with a containing subgroup of the same index may be concluded +using `subgroup_eq_of_le_of_index_eq_of_ne_zero`. -/ +theorem + standardLubinTateCanonicalUniformizerPrincipalSubgroup_index_ne_zero + (n : ℕ) : + (LocalFieldTheory.uniformizerPrincipalSubgroup K + (standardLubinTateBaseUniformizerUnit + (standardLocalFieldUniformizer_isUniformizer K)) + 1 (n + 1)).index ≠ 0 := by + rw [standardLubinTateCanonicalUniformizerPrincipalSubgroup_index] + have hq : 1 < Nat.card 𝓀[K] := by + exact Finite.one_lt_card + exact + Nat.ne_of_gt + (Nat.mul_pos + (Nat.sub_pos_of_lt hq) + (Nat.pow_pos (Nat.zero_lt_one.trans hq))) + +omit [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] in +/-- The explicit lower ramification group of a standard Lubin--Tate level +is full at index zero. -/ +theorem standardLubinTateRealLowerRamificationGroup_zero_eq_top + (F : LocalField K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + standardLubinTateRealLowerRamificationGroup hπ n 0 = ⊤ := by + have hparameter : + standardLubinTateUnitParameterSubgroup F n 0 = ⊤ := by + apply top_unique + intro a _ha + rw [← standardLubinTateUnitParameterChosenRepresentative_spec F n a] + exact + (standardLubinTateUnitParameterClass_mem_subgroup_iff + F n 0 (Nat.zero_le (n + 1)) + (standardLubinTateUnitParameterChosenRepresentative F n a)).2 + (by simp) + ext σ + obtain ⟨a, rfl⟩ := + standardLubinTateUnitParameterToGal_surjective F hπ n σ + rw [show (0 : ℝ) = ((0 : ℕ) : ℝ) by norm_num] + rw [mem_standardLubinTateRealLowerRamificationGroup_nat_iff_primitivePoint] + simpa [hparameter] using + (standardLubinTateUnitParameterToGal_displacement_addVal_ge_iff_mem_parameterSubgroup + F hπ n a 0 (Nat.zero_le (n + 1))) + +omit [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] in +/-- The explicit upper ramification group of a standard Lubin--Tate level +is full at index zero. -/ +theorem standardLubinTateRealUpperRamificationGroup_zero_eq_top + (F : LocalField K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + standardLubinTateRealUpperRamificationGroup hπ n 0 = ⊤ := by + rw [show (0 : ℝ) = ((0 : ℕ) : ℝ) by norm_num] + rw [ + standardLubinTateRealUpperRamificationGroup_nat_eq_lower_pow_sub_one + F hπ n 0 (by omega)] + simpa using + standardLubinTateRealLowerRamificationGroup_zero_eq_top K F hπ n + +/-- The canonical local upper ramification group of a standard +Lubin--Tate level is full at index zero. -/ +theorem standardLubinTateLocalUpperRamificationGroup_zero_eq_top + {π : (standardLocalField K).valuationSubring} + (hπ : + (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + (n : ℕ) : + let F := standardLocalField K + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsGalois K L := + standardLubinTateLevelField_isGalois (F := F) hπ n + localUpperRamificationGroup K L 0 = ⊤ := by + let F := standardLocalField K + let L := standardLubinTateLevelField hπ n + let : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsGalois K L := + standardLubinTateLevelField_isGalois (F := F) hπ n + calc + localUpperRamificationGroup K L 0 = + standardLubinTateRealUpperRamificationGroup hπ n 0 := + (standardLubinTateRealUpperRamificationGroup_eq_localUpperRamificationGroup + K hπ n 0).symm + _ = ⊤ := + standardLubinTateRealUpperRamificationGroup_zero_eq_top K F hπ n + +/-- The Artin image of the full valuation-ring unit group is the full +Galois group of a canonical standard Lubin--Tate level. -/ +theorem + standardLubinTateCanonicalArtinPrincipalUnitGroup_zero_eq_top + (n : ℕ) : + let F := standardLocalField K + let hπ := standardLocalFieldUniformizer_isUniformizer K + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsAbelianGalois K L := + standardLubinTateLevelField_isAbelianGalois F hπ n + artinPrincipalUnitGroup K L 0 = ⊤ := by + let F := standardLocalField K + let hπ := standardLocalFieldUniformizer_isUniformizer K + let L := standardLubinTateLevelField hπ n + let : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsAbelianGalois K L := + standardLubinTateLevelField_isAbelianGalois F hπ n + let varpi : Kˣ := standardLubinTateBaseUniformizerUnit hπ + let pi : Kˣ := varpi⁻¹ + have hpi : valuationMap K (Additive.ofMul pi) = 1 := by + simpa only [pi, varpi] using + standardLubinTateCanonicalBaseUniformizerUnit_inv_valuationMap K + have hpiKer : + Subgroup.zpowers pi ≤ + (abelianLocalArtinMonoidHom K L).ker := by + rw [abelianLocalArtinMonoidHom_ker] + change + Subgroup.zpowers pi ≤ + standardLubinTateNormSubgroup hπ n + simpa only [pi, varpi, Subgroup.zpowers_inv] using + standardLubinTateBaseUniformizerUnit_zpowers_le_normSubgroup hπ n + unfold artinPrincipalUnitGroup + apply top_unique + intro σ _hσ + obtain ⟨x, hx⟩ := + abelianLocalArtinMonoidHom_surjective K L σ + obtain ⟨u, hdecomp⟩ := + exists_integerUnit_mul_uniformizer_zpow K pi hpi x + have hpowKer : + pi ^ valuationMap K (Additive.ofMul x) ∈ + (abelianLocalArtinMonoidHom K L).ker := + hpiKer (Subgroup.zpow_mem_zpowers pi _) + have hpow : + abelianLocalArtinMonoidHom K L + (pi ^ valuationMap K (Additive.ofMul x)) = 1 := + MonoidHom.mem_ker.mp hpowKer + refine ⟨integerUnitsToFieldUnits K u, ?_, ?_⟩ + · unfold LocalFieldTheory.fieldPrincipalUnits + exact ⟨u, by simp, rfl⟩ + · rw [← hx, ← hdecomp, map_mul, hpow, mul_one] + +/-- Filtered local reciprocity holds at real index zero for the canonical +standard Lubin--Tate level. -/ +theorem + standardLubinTateCanonicalArtinPrincipalUnitStepGroup_zero_eq_localUpper + (n : ℕ) : + let F := standardLocalField K + let hπ := standardLocalFieldUniformizer_isUniformizer K + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsAbelianGalois K L := + standardLubinTateLevelField_isAbelianGalois F hπ n + artinPrincipalUnitStepGroup K L 0 = + localUpperRamificationGroup K L 0 := by + let F := standardLocalField K + let hπ := standardLocalFieldUniformizer_isUniformizer K + let L := standardLubinTateLevelField hπ n + let : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsAbelianGalois K L := + standardLubinTateLevelField_isAbelianGalois F hπ n + calc + artinPrincipalUnitStepGroup K L 0 = + artinPrincipalUnitGroup K L 0 := by + simp [artinPrincipalUnitStepGroup, natCeilStepFiltration] + _ = ⊤ := + standardLubinTateCanonicalArtinPrincipalUnitGroup_zero_eq_top K n + _ = localUpperRamificationGroup K L 0 := + (standardLubinTateLocalUpperRamificationGroup_zero_eq_top + K hπ n).symm + +/-- Beyond the last visible standard level, the real Artin +principal-unit step group is trivial. -/ +theorem + standardLubinTateCanonicalArtinPrincipalUnitStepGroup_eq_bot_of_level_lt_ceil + (n : ℕ) (t : ℝ) (hlevel : n + 1 < ⌈t⌉₊) : + let F := standardLocalField K + let hπ := standardLocalFieldUniformizer_isUniformizer K + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsAbelianGalois K L := + standardLubinTateLevelField_isAbelianGalois F hπ n + artinPrincipalUnitStepGroup K L t = ⊥ := by + let F := standardLocalField K + let hπ := standardLocalFieldUniformizer_isUniformizer K + let L := standardLubinTateLevelField hπ n + let : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsAbelianGalois K L := + standardLubinTateLevelField_isAbelianGalois F hπ n + unfold artinPrincipalUnitStepGroup natCeilStepFiltration + apply le_antisymm + · have hle := + artinPrincipalUnitGroup_antitone K L (Nat.le_of_lt hlevel) + rw [ + standardLubinTateCanonicalArtinPrincipalUnitGroup_succ_eq_bot + K n] at hle + exact hle + · exact bot_le + +/-- Beyond the last visible standard level, the canonical local upper +ramification group is trivial. -/ +theorem + standardLubinTateCanonicalLocalUpperRamificationGroup_eq_bot_of_level_lt_ceil + (n : ℕ) (t : ℝ) (hlevel : n + 1 < ⌈t⌉₊) : + let F := standardLocalField K + let hπ := standardLocalFieldUniformizer_isUniformizer K + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsGalois K L := + standardLubinTateLevelField_isGalois (F := F) hπ n + localUpperRamificationGroup K L t = ⊥ := by + let F := standardLocalField K + let hπ := standardLocalFieldUniformizer_isUniformizer K + let L := standardLubinTateLevelField hπ n + let : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsGalois K L := + standardLubinTateLevelField_isGalois (F := F) hπ n + have ht : (((n + 1 : ℕ) : ℝ)) ≤ t := by + have hsucc : n + 1 + 1 ≤ ⌈t⌉₊ := by + omega + exact (Nat.add_one_le_ceil_iff.mp hsucc).le + apply le_antisymm + · have hle := localUpperRamificationGroup_antitone K L ht + rw [ + standardLubinTateCanonicalLocalUpperRamificationGroup_succ_eq_bot + K n] at hle + exact hle + · exact bot_le + +/-- Real filtered local reciprocity for every canonical standard +Lubin--Tate level. At each nonnegative real index, the Artin image of the +natural-ceiling principal-unit step is the canonical upper ramification +group. -/ +theorem + standardLubinTateCanonicalArtinPrincipalUnitStepGroup_eq_localUpperRamificationGroup + (n : ℕ) (t : ℝ) (ht : 0 ≤ t) : + let F := standardLocalField K + let hπ := standardLocalFieldUniformizer_isUniformizer K + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsAbelianGalois K L := + standardLubinTateLevelField_isAbelianGalois F hπ n + artinPrincipalUnitStepGroup K L t = + localUpperRamificationGroup K L t := by + let F := standardLocalField K + let hπ := standardLocalFieldUniformizer_isUniformizer K + let L := standardLubinTateLevelField hπ n + let k : ℕ := ⌈t⌉₊ + let : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsAbelianGalois K L := + standardLubinTateLevelField_isAbelianGalois F hπ n + by_cases hkzero : k = 0 + · have hceilzero : ⌈t⌉₊ = 0 := by + simpa only [k] using hkzero + have htzero : t = 0 := + le_antisymm (Nat.ceil_eq_zero.mp hceilzero) ht + subst t + exact + standardLubinTateCanonicalArtinPrincipalUnitStepGroup_zero_eq_localUpper + K n + · have hk : 1 ≤ k := by + omega + by_cases hkn : k ≤ n + 1 + · have hLocalStep : + localUpperRamificationGroup K L t = + localUpperRamificationGroup K L (k : ℝ) := by + calc + localUpperRamificationGroup K L t = + standardLubinTateRealUpperRamificationGroup hπ n t := + (standardLubinTateRealUpperRamificationGroup_eq_localUpperRamificationGroup + K hπ n t).symm + _ = + standardLubinTateRealUpperRamificationGroup + hπ n (k : ℝ) := by + have hstep := + standardLubinTateRealUpperRamificationGroup_eq_natCeil + F hπ n t + (by simpa only [k] using hk) + (by simpa only [k] using hkn) + simpa only [k] using hstep + _ = localUpperRamificationGroup K L (k : ℝ) := + standardLubinTateRealUpperRamificationGroup_eq_localUpperRamificationGroup + K hπ n (k : ℝ) + change + artinPrincipalUnitGroup K L k = + localUpperRamificationGroup K L t + exact + (standardLubinTateCanonicalArtinPrincipalUnitsImage_eq_localUpperRamificationGroup + K n k hk hkn).trans hLocalStep.symm + · have hlevel : n + 1 < ⌈t⌉₊ := by + dsimp only [k] at hkn + omega + exact + (standardLubinTateCanonicalArtinPrincipalUnitStepGroup_eq_bot_of_level_lt_ceil + K n t hlevel).trans + (standardLubinTateCanonicalLocalUpperRamificationGroup_eq_bot_of_level_lt_ceil + K n t hlevel).symm + +end LocalClassFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFixedFieldComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFixedFieldComparison.lean new file mode 100644 index 0000000000..9e0cd0b3c3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFixedFieldComparison.lean @@ -0,0 +1,119 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFilteredArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardLubinTate +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality +/-! +# Filtered reciprocity on the named standard Lubin--Tate fixed field + +The canonical standard Lubin--Tate level is retained by local existence as +a finite abelian subextension of the fixed separable closure. Its canonical +algebra equivalence with the represented fixed field transports both the +Artin principal-unit filtration and the local upper filtration. +-/ + +@[expose] public section + +noncomputable +section + +open scoped ValuativeRel + +namespace LocalClassFieldTheory + +open RamificationTheory.LocalField + +open LocalClassFieldTheory +open LocalFieldTheory +open LubinTate + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- Mapping the Artin principal-unit step group through a base-linear +equivalence gives the corresponding group on the equivalent extension. -/ +theorem artinPrincipalUnitStepGroup_map_standardFixedFieldEquiv + (L M : Type) [Field L] [Field M] + [Algebra K L] [Algebra K M] + [FiniteDimensional K L] [FiniteDimensional K M] + [IsAbelianGalois K L] [IsAbelianGalois K M] + (e : L ≃ₐ[K] M) (t : ℝ) : + Subgroup.map (AlgEquiv.autCongr e).toMonoidHom + (artinPrincipalUnitStepGroup K L t) = + artinPrincipalUnitStepGroup K M t := by + unfold artinPrincipalUnitStepGroup RamificationTheory.natCeilStepFiltration + artinPrincipalUnitGroup + rw [Subgroup.map_map] + rw [abelianLocalArtinMonoidHom_autCongr K L M e] + +/-- Real filtered local reciprocity for the named fixed field represented +by canonical standard Lubin--Tate level `m`. -/ +theorem standardLubinTateFiniteAbelianSubextension_filteredLocalReciprocity + (m : ℕ) (t : ℝ) (ht : 0 ≤ t) : + let T := standardLubinTateFiniteAbelianSubextension K m + let M := + abstractFixedField K (SeparableClosure K) T.field + letI : FiniteDimensional K M := + abstractFixedField_finiteDimensional + K (SeparableClosure K) T.field + (finiteAbelianSubextension_finite_over_absoluteBase K T) + letI : IsAbelianGalois K M := + finiteAbelianSubextension_fixedField_isAbelianGalois K T + artinPrincipalUnitStepGroup K M t = + localUpperRamificationGroup K M t := by + let hπ := standardLocalFieldUniformizer_isUniformizer K + let E := standardLubinTateLevelField hπ m + let : FiniteDimensional K E := + standardLubinTateLevelField_finiteDimensional hπ m + let : IsAbelianGalois K E := + standardLubinTateLevelField_isAbelianGalois + (standardLocalField K) hπ m + let T := standardLubinTateFiniteAbelianSubextension K m + let M := + abstractFixedField K (SeparableClosure K) T.field + let : FiniteDimensional K M := + abstractFixedField_finiteDimensional + K (SeparableClosure K) T.field + (finiteAbelianSubextension_finite_over_absoluteBase K T) + let : IsAbelianGalois K M := + finiteAbelianSubextension_fixedField_isAbelianGalois K T + let e : E ≃ₐ[K] M := + standardLubinTateFiniteAbelianSubextensionFixedFieldEquiv K m + let q : Gal(E/K) ≃* Gal(M/K) := + AlgEquiv.autCongr e + have hArtin : + Subgroup.map q.toMonoidHom + (artinPrincipalUnitStepGroup K E t) = + artinPrincipalUnitStepGroup K M t := + artinPrincipalUnitStepGroup_map_standardFixedFieldEquiv + K E M e t + have hUpper : + Subgroup.map q.toMonoidHom + (localUpperRamificationGroup K E t) = + localUpperRamificationGroup K M t := + localUpperRamificationGroup_map_autCongr K E M e t + have hStandard : + artinPrincipalUnitStepGroup K E t = + localUpperRamificationGroup K E t := + standardLubinTateCanonicalArtinPrincipalUnitStepGroup_eq_localUpperRamificationGroup + K m t ht + calc + artinPrincipalUnitStepGroup K M t = + Subgroup.map q.toMonoidHom + (artinPrincipalUnitStepGroup K E t) := + hArtin.symm + _ = + Subgroup.map q.toMonoidHom + (localUpperRamificationGroup K E t) := by + rw [hStandard] + _ = localUpperRamificationGroup K M t := hUpper + +end LocalClassFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormIndex.lean new file mode 100644 index 0000000000..2d4890ba23 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormIndex.lean @@ -0,0 +1,76 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.UnramifiedConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormSubgroup +/-! +# Norm indices for standard finite Lubin--Tate levels + +Finite local reciprocity identifies the cardinality of the norm quotient of a +finite abelian Galois extension with its field degree. Applied to a standard +Lubin--Tate level over the canonical local-field package, this gives index +`(q - 1) * q ^ n`. +-/ + +@[expose] public section + +noncomputable +section + +open scoped ValuativeRel + +namespace LubinTate + +open LocalClassFieldTheory +open LocalFieldTheory +open LocalFieldTheory.DiscreteValuationField + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The norm subgroup of a standard level over the canonical local-field +package has index equal to the standard Lubin--Tate degree. -/ +theorem standardLubinTateNormSubgroup_index + {π : (standardLocalField K).valuationSubring} + (hπ : + (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + (n : ℕ) : + (standardLubinTateNormSubgroup hπ n).index = + (Nat.card 𝓀[K] - 1) * Nat.card 𝓀[K] ^ n := by + let F := standardLocalField K + let E := standardLubinTateLevelField hπ n + let : FiniteDimensional K E := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsAbelianGalois K E := + standardLubinTateLevelField_isAbelianGalois F hπ n + change (localNormSubgroup K E).index = _ + calc + (localNormSubgroup K E).index = Module.finrank K E := by + rw [Subgroup.index_eq_card] + exact + LocalClassFieldTheory.card_normQuotient_eq_finrank_of_isAbelianGalois + K E + _ = (Nat.card 𝓀[K] - 1) * Nat.card 𝓀[K] ^ n := by + simpa only [E, F, standardLocalField_residueField_natCard] using + standardLubinTateLevelField_finrank (F := F) hπ n + +/-- The preceding index formula for the canonical chosen uniformizer of +`𝒪[K]`. -/ +theorem standardLubinTateCanonicalNormSubgroup_index (n : ℕ) : + (standardLubinTateNormSubgroup + (standardLocalFieldUniformizer_isUniformizer K) n).index = + (Nat.card 𝓀[K] - 1) * Nat.card 𝓀[K] ^ n := + standardLubinTateNormSubgroup_index K + (standardLocalFieldUniformizer_isUniformizer K) n + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormSubgroupExact.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormSubgroupExact.lean new file mode 100644 index 0000000000..a9486582b7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormSubgroupExact.lean @@ -0,0 +1,141 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardSubgroupIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HigherUnitLevelEquiv +/-! +# The norm subgroup of a standard Lubin--Tate level + +The changed-uniformizer comparison shows that every `(n + 1)`-st +principal unit is a norm from the standard level `n`. Together with the +known norm of the chosen uniformizer, this contains the canonical standard +open subgroup in the norm subgroup. Their independently computed, +nonzero indices are equal, so the containment is an equality. +-/ + +@[expose] public section + +noncomputable +section + +open scoped ValuativeRel + +namespace LubinTate + +open LocalClassFieldTheory +open LocalFieldTheory +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +open LocalFieldTheory.IsNonarchimedeanLocalField + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The topology-first inclusion of packaged valuation-ring units agrees +with the inclusion used in the changed-uniformizer norm calculation. -/ +@[simp] +theorem + standardLocalFieldValuationUnitsToFieldUnits_eq_standardLubinTateUnitFactorFieldUnit + (u : (standardLocalField K).valuationSubringˣ) : + standardLocalFieldValuationUnitsToFieldUnits K u = + standardLubinTateUnitFactorFieldUnit (standardLocalField K) u := by + apply Units.ext + simp only [ + standardLocalFieldValuationUnitsToFieldUnits_apply_coe, + standardLubinTateUnitFactorFieldUnit_coe] + +/-- Every `(n + 1)`-st field principal unit is a norm from the standard +Lubin--Tate level `n`. -/ +theorem standardLubinTateFieldPrincipalUnits_le_normSubgroup + {π : (standardLocalField K).valuationSubring} + (hπ : + (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + (n : ℕ) : + LocalFieldTheory.fieldPrincipalUnits K (n + 1) ≤ + standardLubinTateNormSubgroup hπ n := by + rw [ + ← standardLocalFieldHigherPrincipalUnitGroup_map_eq_fieldPrincipalUnits + K (n + 1)] + rintro x ⟨u, hu, rfl⟩ + rw [ + standardLocalFieldValuationUnitsToFieldUnits_eq_standardLubinTateUnitFactorFieldUnit] + exact + standardLubinTateUnitFactorFieldUnit_mem_standardNormSubgroup_of_mem_higher + hπ u n hu + +/-- The subgroup generated by the chosen uniformizer and +`U_K^(n+1)` is contained in the norm subgroup of the standard level `n`. -/ +theorem standardLubinTateUniformizerPrincipalSubgroup_le_normSubgroup + {π : (standardLocalField K).valuationSubring} + (hπ : + (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + (n : ℕ) : + LocalFieldTheory.uniformizerPrincipalSubgroup K + (standardLubinTateBaseUniformizerUnit hπ) 1 (n + 1) ≤ + standardLubinTateNormSubgroup hπ n := by + unfold LocalFieldTheory.uniformizerPrincipalSubgroup + apply sup_le + · simpa only [pow_one] using + standardLubinTateBaseUniformizerUnit_zpowers_le_normSubgroup hπ n + · exact + standardLubinTateFieldPrincipalUnits_le_normSubgroup K hπ n + +/-- For the canonical local-field package, the norm subgroup of standard +level `n` is exactly the subgroup generated by the canonical uniformizer +and `U_K^(n+1)`. -/ +theorem + standardLubinTateCanonicalUniformizerPrincipalSubgroup_eq_normSubgroup + (n : ℕ) : + LocalFieldTheory.uniformizerPrincipalSubgroup K + (standardLubinTateBaseUniformizerUnit + (standardLocalFieldUniformizer_isUniformizer K)) + 1 (n + 1) = + standardLubinTateNormSubgroup + (standardLocalFieldUniformizer_isUniformizer K) n := by + apply subgroup_eq_of_le_of_index_eq_of_ne_zero + · exact + standardLubinTateUniformizerPrincipalSubgroup_le_normSubgroup + K (standardLocalFieldUniformizer_isUniformizer K) n + · rw [ + standardLubinTateCanonicalUniformizerPrincipalSubgroup_index, + standardLubinTateCanonicalNormSubgroup_index] + · rw [standardLubinTateCanonicalUniformizerPrincipalSubgroup_index] + have hq : 1 < Nat.card 𝓀[K] := Finite.one_lt_card + exact + Nat.ne_of_gt + (Nat.mul_pos + (Nat.sub_pos_of_lt hq) + (Nat.pow_pos (Nat.zero_lt_one.trans hq))) + +/-- With the normalized positive-valuation convention, the same norm +subgroup is generated by the inverse canonical uniformizer and +`U_K^(n+1)`. -/ +theorem + standardLubinTateCanonicalNormSubgroup_eq_normalizedUniformizerPrincipalSubgroup + (n : ℕ) : + standardLubinTateNormSubgroup + (standardLocalFieldUniformizer_isUniformizer K) n = + LocalFieldTheory.uniformizerPrincipalSubgroup K + (inverseIntegerRingUniformizerFieldUnit K) 1 (n + 1) := by + rw [ + ← + standardLubinTateCanonicalUniformizerPrincipalSubgroup_eq_normSubgroup + K n] + simp only [ + LocalFieldTheory.uniformizerPrincipalSubgroup, + standardLubinTateCanonicalBaseUniformizerUnit_eq_integerRingUniformizerFieldUnit, + inverseIntegerRingUniformizerFieldUnit, + pow_one, + Subgroup.zpowers_inv] + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardSubgroupIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardSubgroupIndex.lean new file mode 100644 index 0000000000..f00aecfc03 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardSubgroupIndex.lean @@ -0,0 +1,145 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.GroupTheory.Index +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UniformizerPrincipalQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameters +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormSubgroup +/-! +# The canonical standard subgroup index + +For the topology-first nonarchimedean local field `K`, the canonical +Lubin--Tate uniformizer and the `(n + 1)`-st principal units generate a +subgroup of `Kˣ` of index + +`(Nat.card 𝓀[K] - 1) * Nat.card 𝓀[K] ^ n`. + +The proof passes from field units to integer units, transports the latter +through the canonical packaged local-field equivalence, and then uses the +finite standard Lubin--Tate unit-parameter count. +-/ + +@[expose] public section + +noncomputable +section + +open scoped ValuativeRel + +namespace LubinTate + +open LocalFieldTheory +open LocalFieldTheory +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +open LocalFieldTheory.IsNonarchimedeanLocalField + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The canonical packaged Lubin--Tate uniformizer is the topology-first +chosen integer-ring uniformizer, viewed as a field unit. -/ +@[simp] +theorem standardLubinTateCanonicalBaseUniformizerUnit_eq_integerRingUniformizerFieldUnit : + standardLubinTateBaseUniformizerUnit + (standardLocalFieldUniformizer_isUniformizer K) = + integerRingUniformizerFieldUnit K := by + apply Units.ext + rfl + +/-- The inverse of the canonical packaged Lubin--Tate uniformizer has +positive normalized additive valuation. -/ +theorem standardLubinTateCanonicalBaseUniformizerUnit_inv_valuationMap : + valuationMap K + (Additive.ofMul + (standardLubinTateBaseUniformizerUnit + (standardLocalFieldUniformizer_isUniformizer K))⁻¹) = + 1 := by + rw [valuationMap_apply, + standardLubinTateCanonicalBaseUniformizerUnit_eq_integerRingUniformizerFieldUnit] + exact v_inverseIntegerRingUniformizerFieldUnit K + +/-- The canonical integer-unit equivalence identifies the standard finite +Lubin--Tate unit parameters with the topology-first principal-unit +quotient. -/ +noncomputable def + standardLubinTateUnitParameterEquivIntegerUnitsPrincipalQuotient + (n : ℕ) : + standardLubinTateUnitParameter (standardLocalField K) n ≃* + IntegerUnitsPrincipalQuot K (n + 1) := + QuotientGroup.congr _ _ + (standardLocalFieldIntegerUnitsEquiv K).symm + (standardLocalFieldHigherPrincipalUnitGroup_map_eq_principalUnits + K (n + 1)) + +/-- The subgroup generated by the canonical Lubin--Tate uniformizer and +`U^(n+1)` has the expected standard finite-level index. -/ +theorem standardLubinTateCanonicalUniformizerPrincipalSubgroup_index + (n : ℕ) : + (LocalFieldTheory.uniformizerPrincipalSubgroup K + (standardLubinTateBaseUniformizerUnit + (standardLocalFieldUniformizer_isUniformizer K)) + 1 (n + 1)).index = + (Nat.card 𝓀[K] - 1) * Nat.card 𝓀[K] ^ n := by + let pi : Kˣ := + standardLubinTateBaseUniformizerUnit + (standardLocalFieldUniformizer_isUniformizer K) + change + (LocalFieldTheory.uniformizerPrincipalSubgroup K pi 1 (n + 1)).index = + (Nat.card 𝓀[K] - 1) * Nat.card 𝓀[K] ^ n + have hpi : valuationMap K (Additive.ofMul pi⁻¹) = 1 := by + simpa only [pi] using + standardLubinTateCanonicalBaseUniformizerUnit_inv_valuationMap K + have hinv : + LocalFieldTheory.uniformizerPrincipalSubgroup K pi 1 (n + 1) = + LocalFieldTheory.uniformizerPrincipalSubgroup K pi⁻¹ 1 (n + 1) := by + simp [LocalFieldTheory.uniformizerPrincipalSubgroup, Subgroup.zpowers_inv] + rw [hinv, Subgroup.index_eq_card] + calc + Nat.card + (Kˣ ⧸ LocalFieldTheory.uniformizerPrincipalSubgroup K pi⁻¹ 1 (n + 1)) = + Nat.card (IntegerUnitsPrincipalQuot K (n + 1)) := + Nat.card_congr + (LocalFieldTheory.uniformizerPrincipalQuotientEquivIntegerUnitsPrincipalQuotient + K pi⁻¹ hpi (n + 1)).toEquiv + _ = + Nat.card + (standardLubinTateUnitParameter (standardLocalField K) n) := + Nat.card_congr + (standardLubinTateUnitParameterEquivIntegerUnitsPrincipalQuotient + K n).symm.toEquiv + _ = (Nat.card 𝓀[K] - 1) * Nat.card 𝓀[K] ^ n := by + simpa only [standardLocalField_residueField_natCard] using + standardLubinTateUnitParameter_natCard + (standardLocalField K) n + +/-- A finite-index subgroup contained in another subgroup with the same +index is already equal to it. The nonzero-index hypothesis excludes the +infinite-index convention `index = 0`. -/ +theorem subgroup_eq_of_le_of_index_eq_of_ne_zero + {G : Type*} [Group G] {H N : Subgroup G} + (hHN : H ≤ N) (hindex : H.index = N.index) + (hindex_ne : H.index ≠ 0) : + H = N := by + let _ : H.FiniteIndex := ⟨hindex_ne⟩ + apply le_antisymm hHN + by_contra hNH + have hne : H ≠ N := by + intro heq + apply hNH + rw [heq] + have hstrict : H < N := lt_of_le_of_ne hHN hne + have hi := Subgroup.index_strictAnti hstrict + rw [hindex] at hi + exact Nat.lt_irrefl _ hi + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/TransportedNormSubgroupExact.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/TransportedNormSubgroupExact.lean new file mode 100644 index 0000000000..2bbd1f4dc9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/TransportedNormSubgroupExact.lean @@ -0,0 +1,81 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LaurentPrincipalUnitTransport +/-! +# Exact transported Lubin--Tate norm subgroup + +The exact principal-unit transport upgrades the transported +equal-characteristic Lubin--Tate norm containment to the sharp standard +subgroup formula. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries ValuativeRel + +namespace LubinTate +namespace EqualCharacteristic + +open LocalClassFieldTheory +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The transported level-`m+1` Lubin--Tate norm subgroup is exactly +`⟨ϖ⟩ · U^(m+1)` in the target local field. -/ +theorem + equalCharacteristicTransportedLubinTateNormSubgroup_eq_uniformizerPrincipalSubgroup + (p : ℕ) [Fact p.Prime] [hKp : CharP K p] + (ϖ : Kˣ) + (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (m : ℕ) : + equalCharacteristicTransportedLubinTateNormSubgroup + K p ϖ hϖ m = + LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ 1 (m + 1) := by + let F := equalCharacteristicTargetLocalField K + let B := F.residueField⸨X⸩ + let pi : Bˣ := (equalCharacteristicLaurentUniformizerUnit F)⁻¹ + let e := equalCharacteristicTargetLaurentUnitsEquiv K p ϖ hϖ + have htransport := + equalCharacteristicLubinTateNormSubgroup_map_eq_transported + K p ϖ hϖ m + have hepi : e pi = ϖ := by + change + equalCharacteristicTargetLaurentUnitsEquiv K p ϖ hϖ + (equalCharacteristicLaurentUniformizerUnit + (equalCharacteristicTargetLocalField K))⁻¹ = + ϖ + exact + equalCharacteristicTargetLaurentUnitsEquiv_uniformizer_inv + K p ϖ hϖ + have hprincipal := + equalCharacteristicTargetLaurent_fieldPrincipalUnits_map_eq + K p ϖ hϖ m + rw [← htransport] + let : CharP K F.residueCharacteristic := + equalCharacteristicTargetResidueCharacteristicCharP K p + let : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + rw [ + equalCharacteristicLubinTateNormSubgroup_eq_uniformizerPrincipalSubgroup] + unfold LocalFieldTheory.uniformizerPrincipalSubgroup + rw [Subgroup.map_sup, MonoidHom.map_zpowers, map_pow] + change + Subgroup.zpowers ((e pi) ^ 1) ⊔ + (LocalFieldTheory.fieldPrincipalUnits B (m + 1)).map e.toMonoidHom = + Subgroup.zpowers (ϖ ^ 1) ⊔ LocalFieldTheory.fieldPrincipalUnits K (m + 1) + rw [hepi] + rw [hprincipal] + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory.lean new file mode 100644 index 0000000000..4c4b54f23b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/All.lean new file mode 100644 index 0000000000..7b2db141ff --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/All.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.All +/-! +# Local field theory + +Public root for reusable local-field infrastructure. This layer may depend on `ValuationTheory`, +but not on `RamificationTheory`, `ClassFormation`, or `LocalClassFieldTheory`. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic.lean new file mode 100644 index 0000000000..8ed62a3f7b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/All.lean new file mode 100644 index 0000000000..501144a226 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/All.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.All +/-! +# P-adic local field theory + +Aggregate for p-adic additive subgroups, units, local-field instances, and +cyclotomic extensions. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic.lean new file mode 100644 index 0000000000..4630069379 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/All.lean new file mode 100644 index 0000000000..23cd570075 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/All.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.All +/-! +# Cyclotomic extensions of p-adic fields + +Aggregate for the totally ramified and unramified cyclotomic constructions. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified.lean new file mode 100644 index 0000000000..0efe7084b6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/All.lean new file mode 100644 index 0000000000..755eef8ba1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/All.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension +/-! +# Unramified p-adic cyclotomic extensions + +The prime-to-`p` cyclotomic construction and its arithmetic Frobenius. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean new file mode 100644 index 0000000000..91ba40fda5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean @@ -0,0 +1,930 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.Unramified.ArithmeticFrobenius +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.RamificationIndexTower +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ExponentialValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Complete +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +public import Mathlib.Analysis.Normed.Unbundled.RingSeminorm +/-! +# The canonical valuation on the unramified extension of `ℚ_p` + +The unramified cyclotomic construction is proved for the additive exponential +valuation. This file identifies that presentation, for +`ℚ_[p]`, with the concrete complete-DVF valuation used by the local class +field theory files. It also specializes the least-exponent degree formula +to roots of unity of order `p ^ f - 1`. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.ValuedExtension renaming + ramificationIndex_eq_one_iff_residueDegree_eq_degree_of_finite_separable → + ramificationIndex_eq_one_iff_residueDegree_eq_degree_of_finite_separable + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + exists_integralClosure_standard_fundamental_identity → + exists_integralClosure_standard_fundamental_identity + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + moduleFinite_target_valuationSubring_of_finite_separable → + moduleFinite_target_valuationSubring_of_finite_separable + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + residueField_finiteDimensional_of_moduleFinite → + residueField_finiteDimensional_of_moduleFinite + + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +open scoped WithZero + +/-- A prime is coprime to one less than a positive power of itself. -/ +theorem prime_coprime_pow_sub_one (p f : ℕ) [hp : Fact p.Prime] + (hf : 0 < f) : + p.Coprime (p ^ f - 1) := by + rw [hp.out.coprime_iff_not_dvd] + intro hdiv + have hpow : p ∣ p ^ f := dvd_pow_self p hf.ne' + have hpf : 1 ≤ p ^ f := one_le_pow₀ hp.out.one_le + have hdiff : p ^ f - (p ^ f - 1) = 1 := by omega + have hone : p ∣ 1 := by + rw [← hdiff] + exact Nat.dvd_sub hpow hdiv + exact hp.out.ne_one ((Nat.dvd_one.mp hone)) + +/-- For `m = p^f - 1`, the least positive exponent with `p^d = 1 mod m` +is exactly `f`. This is the arithmetic specialization used in +the unramified branch of local cyclotomic reciprocity. -/ +theorem padicCyclotomicUnramifiedResidueDegree_prime_pow_sub_one + (p f : ℕ) [hp : Fact p.Prime] (hf : 0 < f) : + padicCyclotomicUnramifiedResidueDegree (p ^ f - 1) p + (prime_coprime_pow_sub_one p f hf) = f := by + let m := p ^ f - 1 + let hcop : p.Coprime m := prime_coprime_pow_sub_one p f hf + let d := padicCyclotomicUnramifiedResidueDegree m p hcop + have hp1 : 1 < p := hp.out.one_lt + have hpf1 : 1 ≤ p ^ f := one_le_pow₀ hp.out.one_le + have hmodf : p ^ f ≡ 1 [MOD m] := by + apply Nat.ModEq.symm + apply (Nat.modEq_iff_dvd' hpf1).2 + exact dvd_rfl + have hdf : d ≤ f := + padicCyclotomicUnramifiedResidueDegree_le_of_modEq_one m p hcop hf hmodf + have hdpos : 0 < d := padicCyclotomicUnramifiedResidueDegree_pos m p hcop + have hdmod : p ^ d ≡ 1 [MOD m] := + padicCyclotomicUnramifiedResidueDegree_modEq_one m p hcop + have hpd1 : 1 ≤ p ^ d := one_le_pow₀ hp.out.one_le + have hmdiv : m ∣ p ^ d - 1 := + (Nat.modEq_iff_dvd' hpd1).1 hdmod.symm + have hfd : f ≤ d := by + by_contra hnot + have hdf' : d < f := Nat.lt_of_not_ge hnot + have hpdgt : 1 < p ^ d := Nat.one_lt_pow hdpos.ne' hp1 + have hmle : m ≤ p ^ d - 1 := Nat.le_of_dvd (by omega) hmdiv + have hpowlt : p ^ d < p ^ f := Nat.pow_lt_pow_right hp1 hdf' + dsimp [m] at hmle + omega + exact le_antisymm hdf hfd + +/-! ## The canonical exponential valuation on `ℚ_p` -/ + +/-- The norm absolute value on `ℚ_p` is nonarchimedean in the literal sense +used in the unramified-extension construction. -/ +theorem padicFieldAbsoluteValue_nonarchimedean + (p : ℕ) [Fact p.Prime] : + LubinTate.Valuations.NonarchimedeanAbsoluteValue + (NormedField.toAbsoluteValue ℚ_[p]) := by + apply LubinTate.Valuations.nonarchimedean_of_strong_triangle + intro x y + exact Padic.nonarchimedean x y + +/-- The norm absolute value on `ℚ_p` is complete. -/ +theorem padicFieldAbsoluteValue_complete + (p : ℕ) [Fact p.Prime] : + IsCompleteForAbsoluteValue (NormedField.toAbsoluteValue ℚ_[p]) := by + rw [IsCompleteForAbsoluteValue] + have huniform : + (NormedField.toAbsoluteValue ℚ_[p]).uniformSpace = + (inferInstance : UniformSpace ℚ_[p]) := by + ext s + rw [(AbsoluteValue.hasBasis_uniformity + (NormedField.toAbsoluteValue ℚ_[p])).mem_iff, + Metric.uniformity_basis_dist.mem_iff] + have hdist : ∀ q : ℚ_[p] × ℚ_[p], + dist q.1 q.2 = + (NormedField.toAbsoluteValue ℚ_[p]) (q.1 - q.2) := by + intro q + rw [dist_eq_norm] + rfl + simp [hdist, AbsoluteValue.map_sub] + rw [huniform] + exact @Padic.instCompleteSpace p (inferInstance : Fact p.Prime) + +/-- The norm absolute value on `ℚ_p` is nontrivial. -/ +theorem padicFieldAbsoluteValue_isNontrivial + (p : ℕ) [Fact p.Prime] : + (NormedField.toAbsoluteValue ℚ_[p]).IsNontrivial := by + refine ⟨(p : ℚ_[p]), ?_, ?_⟩ + · exact_mod_cast (Fact.out : Nat.Prime p).ne_zero + · apply ne_of_lt + exact Padic.norm_p_lt_one + +/-- The canonical additive exponential valuation on `ℚ_p`, obtained from +the standard norm by the conversion `v(x) = -log |x|`. -/ +noncomputable def padicFieldExponentialValuation + (p : ℕ) [Fact p.Prime] : + LubinTate.Valuations.ExponentialValuation ℚ_[p] := + absoluteValueExponentialValuation + (NormedField.toAbsoluteValue ℚ_[p]) + (padicFieldAbsoluteValue_nonarchimedean p) + +/-- The valuation ring of the preceding exponential valuation is literally the +valuation ring of the concrete complete-DVF package on `ℚ_p`. -/ +theorem padicFieldExponentialValuationSubring_eq_completeDVF + (p : ℕ) [Fact p.Prime] : + LubinTate.Valuations.exponentialValuationSubringAsValuationSubring + (padicFieldExponentialValuation p) = + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).valuation.valuationSubring := by + let a : AbsoluteValue ℚ_[p] ℝ := NormedField.toAbsoluteValue ℚ_[p] + let hn : LubinTate.Valuations.NonarchimedeanAbsoluteValue a := + padicFieldAbsoluteValue_nonarchimedean p + let v : LubinTate.Valuations.ExponentialValuation ℚ_[p] := + padicFieldExponentialValuation p + have hva : + LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v = + absoluteValueValuationSubring a hn := by + exact associatedAbsoluteValue_valuationSubring_eq + v (Real.exp 1) a hn + (absoluteValueExponentialValuation_associated a hn) + rw [hva] + ext x + rw [mem_absoluteValueValuationSubring_iff] + change ‖x‖ ≤ 1 ↔ + x ∈ (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p).valuationSubring + let e : ℤ_[p] ≃+* + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p).valuationSubring := + LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicIntEquivValuationSubring p + constructor + · intro hx + let z : ℤ_[p] := ⟨x, hx⟩ + have he : ((e z : + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation + p).valuationSubring) : + ℚ_[p]) = x := rfl + rw [← he] + exact (e z).property + · intro hx + let y : (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation + p).valuationSubring := + ⟨x, hx⟩ + let z : ℤ_[p] := e.symm y + have hez : e z = y := e.apply_symm_apply y + have hcoe : (z : ℚ_[p]) = x := by + calc + (z : ℚ_[p]) = ((e z : + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation + p).valuationSubring) : + ℚ_[p]) := rfl + _ = (y : ℚ_[p]) := congrArg + (fun w : (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation + p).valuationSubring => + (w : ℚ_[p])) hez + _ = x := rfl + have hz := PadicInt.norm_le_one z + change ‖(z : ℚ_[p])‖ ≤ 1 at hz + rw [hcoe] at hz + exact hz + +/-- The concrete complete `ℚ_p` valuation is Henselian, expressed through +the exponential valuation required by the unramified cyclotomic construction. -/ +theorem padicCyclotomicUnramified_padicExponentialValuation_henselian + (p : ℕ) [Fact p.Prime] : + ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring + (padicFieldExponentialValuation p)).valuation := by + let a : AbsoluteValue ℚ_[p] ℝ := NormedField.toAbsoluteValue ℚ_[p] + let hn : LubinTate.Valuations.NonarchimedeanAbsoluteValue a := + padicFieldAbsoluteValue_nonarchimedean p + have hva : + LubinTate.Valuations.exponentialValuationSubringAsValuationSubring + (padicFieldExponentialValuation p) = + absoluteValueValuationSubring a hn := by + exact associatedAbsoluteValue_valuationSubring_eq + (padicFieldExponentialValuation p) + (Real.exp 1) a hn + (absoluteValueExponentialValuation_associated a hn) + rw [hva] + intro f gbar hbar hne hfac hcop + exact henselianValuation_of_complete a + (padicFieldAbsoluteValue_complete p) hn hne hfac hcop + +/-! ## Residue field and the `p ^ f - 1` cyclotomic degree -/ + +/-- The residue field of the exponential valuation on `ℚ_p` is canonically `ZMod p`. +The construction passes through the same valuation-subring equivalence used +by the concrete complete-DVF package. -/ +noncomputable def padicCyclotomicUnramifiedPadicExponentialResidueFieldEquivZMod + (p : ℕ) [Fact p.Prime] : + padicCyclotomicUnramifiedResidueField + (padicFieldExponentialValuation p) ≃+* ZMod p := by + let v := padicFieldExponentialValuation p + let C := (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuation + have hV : LubinTate.Valuations.exponentialValuationSubring v = C.valuationSubring.toSubring := by + exact congrArg ValuationSubring.toSubring + (padicFieldExponentialValuationSubring_eq_completeDVF p) + let eVC : LubinTate.Valuations.exponentialValuationSubring v ≃+* C.valuationSubring := + { toFun := fun x => ⟨x, by + change (x : ℚ_[p]) ∈ C.valuationSubring.toSubring + rw [← hV] + exact x.property⟩ + invFun := fun x => ⟨x, by + rw [hV] + exact x.property⟩ + left_inv := fun x => Subtype.ext rfl + right_inv := fun x => Subtype.ext rfl + map_mul' := fun _ _ => Subtype.ext rfl + map_add' := fun _ _ => Subtype.ext rfl } + change IsLocalRing.ResidueField (LubinTate.Valuations.exponentialValuationSubring v) ≃+* ZMod p + exact ((IsLocalRing.ResidueField.mapEquiv eVC).trans + (IsLocalRing.ResidueField.mapEquiv + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicIntEquivValuationSubring + p)).symm).trans + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicIntResidueFieldEquivZMod p) + +/-- The residue field used by the unramified cyclotomic theorem has cardinality `p`. -/ +theorem padicCyclotomicUnramified_padicExponentialResidueField_card + (p : ℕ) [Fact p.Prime] + [Fintype (padicCyclotomicUnramifiedResidueField + (padicFieldExponentialValuation p))] : + Fintype.card (padicCyclotomicUnramifiedResidueField + (padicFieldExponentialValuation p)) = p := by + calc + Fintype.card (padicCyclotomicUnramifiedResidueField + (padicFieldExponentialValuation p)) = + Fintype.card (ZMod p) := + Fintype.card_congr + (padicCyclotomicUnramifiedPadicExponentialResidueFieldEquivZMod p).toEquiv + _ = p := ZMod.card p + +/-- the unramified cyclotomic theorem on the canonical `ℚ_p` valuation, specialized to +the unramified cyclotomic level of order `p ^ f - 1`: a field generated by a +primitive root of that exact order has degree `f`. -/ +theorem padicCyclotomic_finrank_prime_pow_sub_one + (p f : ℕ) [hp : Fact p.Prime] (hf : 0 < f) + {L : Type*} [Field L] [Algebra ℚ_[p] L] [FiniteDimensional ℚ_[p] L] + {ζ : L} (hζ : IsPrimitiveRoot ζ (p ^ f - 1)) + (hζgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) : + Module.finrank ℚ_[p] L = f := by + let v := padicFieldExponentialValuation p + let e := padicCyclotomicUnramifiedPadicExponentialResidueFieldEquivZMod p + let : Finite (padicCyclotomicUnramifiedResidueField v) := + Finite.of_equiv (ZMod p) e.symm.toEquiv + let : Fintype (padicCyclotomicUnramifiedResidueField v) := Fintype.ofFinite _ + have hk : Fintype.card (padicCyclotomicUnramifiedResidueField v) = p ^ 1 := by + simpa [v] using padicCyclotomicUnramified_padicExponentialResidueField_card p + let hcop : p.Coprime (p ^ f - 1) := prime_coprime_pow_sub_one p f hf + calc + Module.finrank ℚ_[p] L = + padicCyclotomicUnramifiedResidueDegree (p ^ f - 1) (p ^ 1) + (hcop.pow_left 1) := + padicCyclotomicUnramified_finrank_eq_residueDegree v + (padicCyclotomicUnramified_padicExponentialValuation_henselian p) + hk hcop hζ hζgen + _ = f := by + simpa using padicCyclotomicUnramifiedResidueDegree_prime_pow_sub_one p f hf + +/-! ## The actual finite-extension valuation and unramified conclusion -/ + +/-- The unique nonarchimedean absolute value on a finite extension of `ℚ_p`, +constructed by the norm formula in the norm-formula theorem. -/ +noncomputable def padicFiniteExtensionAbsoluteValue + (p : ℕ) [Fact p.Prime] + (L : Type*) [Field L] [Algebra ℚ_[p] L] [FiniteDimensional ℚ_[p] L] : + AbsoluteValue L ℝ := by + let a : AbsoluteValue ℚ_[p] ℝ := NormedField.toAbsoluteValue ℚ_[p] + let hn : LubinTate.Valuations.NonarchimedeanAbsoluteValue a := + padicFieldAbsoluteValue_nonarchimedean p + let hh : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (absoluteValueValuationSubring a hn).valuation := by + intro f gbar hbar hne hfac hcop + exact henselianValuation_of_complete a + (padicFieldAbsoluteValue_complete p) hn hne hfac hcop + let hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + (absoluteValueValuationSubring a hn) := + (henselianValuation_iff_henselFactorization a hn).1 hh + exact normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization + (K := ℚ_[p]) (L := L) a hn hv + +/-- The norm-formula absolute value is nonarchimedean. -/ +theorem padicFiniteExtensionAbsoluteValue_nonarchimedean + (p : ℕ) [Fact p.Prime] + (L : Type*) [Field L] [Algebra ℚ_[p] L] [FiniteDimensional ℚ_[p] L] : + LubinTate.Valuations.NonarchimedeanAbsoluteValue + (padicFiniteExtensionAbsoluteValue p L) := by + let a : AbsoluteValue ℚ_[p] ℝ := NormedField.toAbsoluteValue ℚ_[p] + let hn : LubinTate.Valuations.NonarchimedeanAbsoluteValue a := + padicFieldAbsoluteValue_nonarchimedean p + let hh : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (absoluteValueValuationSubring a hn).valuation := by + intro f gbar hbar hne hfac hcop + exact henselianValuation_of_complete a + (padicFieldAbsoluteValue_complete p) hn hne hfac hcop + simpa [padicFiniteExtensionAbsoluteValue, a, hn, hh] using + (normFormula_finite_extension_norm_formula + (K := ℚ_[p]) (L := L) a hn hh).1 + +/-- The norm-formula absolute value extends the standard `ℚ_p` absolute +value exactly. -/ +theorem padicFiniteExtensionAbsoluteValue_extends + (p : ℕ) [Fact p.Prime] + (L : Type*) [Field L] [Algebra ℚ_[p] L] [FiniteDimensional ℚ_[p] L] + (x : ℚ_[p]) : + padicFiniteExtensionAbsoluteValue p L + (algebraMap ℚ_[p] L x) = + NormedField.toAbsoluteValue ℚ_[p] x := by + let a : AbsoluteValue ℚ_[p] ℝ := NormedField.toAbsoluteValue ℚ_[p] + let hn : LubinTate.Valuations.NonarchimedeanAbsoluteValue a := + padicFieldAbsoluteValue_nonarchimedean p + let hh : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (absoluteValueValuationSubring a hn).valuation := by + intro f gbar hbar hne hfac hcop + exact henselianValuation_of_complete a + (padicFieldAbsoluteValue_complete p) hn hne hfac hcop + simpa [padicFiniteExtensionAbsoluteValue, a, hn, hh] using + (normFormula_finite_extension_norm_formula + (K := ℚ_[p]) (L := L) a hn hh).2.1 x + +/-- The canonical norm-formula absolute value on every finite extension of +`ℚ_p` is complete. -/ +theorem padicFiniteExtensionAbsoluteValue_complete + (p : ℕ) [Fact p.Prime] + (L : Type*) [Field L] [Algebra ℚ_[p] L] [FiniteDimensional ℚ_[p] L] : + IsCompleteForAbsoluteValue + (padicFiniteExtensionAbsoluteValue p L) := by + let v : AbsoluteValue ℚ_[p] ℝ := NormedField.toAbsoluteValue ℚ_[p] + let R := finiteNormExtensionNonarchimedeanFiniteExtension + (K := ℚ_[p]) (L := L) v + (padicFieldAbsoluteValue_complete p) + (padicFieldAbsoluteValue_nonarchimedean p) + (padicFieldAbsoluteValue_isNontrivial p) + have hEq : + padicFiniteExtensionAbsoluteValue p L = R.extension := + R.unique _ (padicFiniteExtensionAbsoluteValue_extends p L) + rw [hEq] + exact R.complete_extension + +/-- The canonical norm-formula absolute values on finite extensions of +`ℚ_p` are functorial for `ℚ_p`-algebra embeddings. This is the valued-field +tower bridge used in the global Kronecker--Weber argument: no compatibility +hypothesis has to be carried by the embedding. -/ +theorem padicCyclotomicUnramified_padicFiniteExtensionAbsoluteValue_comp_algHom + (p : ℕ) [Fact p.Prime] + {E D : Type*} [Field E] [Field D] + [Algebra ℚ_[p] E] [Algebra ℚ_[p] D] + [FiniteDimensional ℚ_[p] E] [FiniteDimensional ℚ_[p] D] + (i : E →ₐ[ℚ_[p]] D) : + (padicFiniteExtensionAbsoluteValue p D).comp + (f := i.toRingHom) i.injective = + padicFiniteExtensionAbsoluteValue p E := by + let v : AbsoluteValue ℚ_[p] ℝ := NormedField.toAbsoluteValue ℚ_[p] + let w : AbsoluteValue E ℝ := + (padicFiniteExtensionAbsoluteValue p D).comp + (f := i.toRingHom) i.injective + let : Algebra.IsAlgebraic ℚ_[p] E := + Algebra.IsAlgebraic.of_finite ℚ_[p] E + have hwExt : ∀ x : ℚ_[p], w (algebraMap ℚ_[p] E x) = v x := by + intro x + change padicFiniteExtensionAbsoluteValue p D + (i (algebraMap ℚ_[p] E x)) = + NormedField.toAbsoluteValue ℚ_[p] x + rw [i.commutes] + exact padicFiniteExtensionAbsoluteValue_extends p D x + have hvComplete : CompleteSpace (WithAbs v) := + completeSpace_withAbs_of_isCompleteForAbsoluteValue v + (padicFieldAbsoluteValue_complete p) + have hvNonarch : IsNonarchimedean (v : ℚ_[p] → ℝ) := + (LubinTate.Valuations.strong_triangle_iff_isNonarchimedean v).1 + (LubinTate.Valuations.strong_triangle_of_nonarchimedean v + (padicFieldAbsoluteValue_nonarchimedean p)) + have hw := AbsoluteValue.eq_spectralExtension_of_extends + v hvComplete hvNonarch + (padicFieldAbsoluteValue_isNontrivial p) w hwExt + have hE := AbsoluteValue.eq_spectralExtension_of_extends + v hvComplete hvNonarch + (padicFieldAbsoluteValue_isNontrivial p) + (padicFiniteExtensionAbsoluteValue p E) + (padicFiniteExtensionAbsoluteValue_extends p E) + exact hw.trans hE.symm + +/-- Pointwise form of +`padicCyclotomicUnramified_padicFiniteExtensionAbsoluteValue_comp_algHom`. -/ +theorem padicFiniteExtensionAbsoluteValue_algHom + (p : ℕ) [Fact p.Prime] + {E D : Type*} [Field E] [Field D] + [Algebra ℚ_[p] E] [Algebra ℚ_[p] D] + [FiniteDimensional ℚ_[p] E] [FiniteDimensional ℚ_[p] D] + (i : E →ₐ[ℚ_[p]] D) (x : E) : + padicFiniteExtensionAbsoluteValue p D (i x) = + padicFiniteExtensionAbsoluteValue p E x := by + exact congrArg (fun a : AbsoluteValue E ℝ => a x) + (padicCyclotomicUnramified_padicFiniteExtensionAbsoluteValue_comp_algHom p i) + +/-- Pulling the canonical valuation ring of a finite `ℚ_p`-extension back +along a `ℚ_p`-algebra embedding gives the canonical valuation ring of the +source. This is the valuation-subring form of the preceding functoriality +theorem, suitable for inertia maps. -/ +theorem padicCyclotomicUnramified_padicFiniteExtensionValuationSubring_comap_algHom + (p : ℕ) [Fact p.Prime] + {E D : Type*} [Field E] [Field D] + [Algebra ℚ_[p] E] [Algebra ℚ_[p] D] + [FiniteDimensional ℚ_[p] E] [FiniteDimensional ℚ_[p] D] + (i : E →ₐ[ℚ_[p]] D) : + (absoluteValueUnitBallSubring + (padicFiniteExtensionAbsoluteValue p D) + (padicFiniteExtensionAbsoluteValue_nonarchimedean p D)).comap + i.toRingHom = + absoluteValueUnitBallSubring + (padicFiniteExtensionAbsoluteValue p E) + (padicFiniteExtensionAbsoluteValue_nonarchimedean p E) := by + let iAlg : Algebra E D := i.toRingHom.toAlgebra + let : Algebra E D := iAlg + have hExt : ∀ x : E, + padicFiniteExtensionAbsoluteValue p D + (algebraMap E D x) = + padicFiniteExtensionAbsoluteValue p E x := by + intro x + change padicFiniteExtensionAbsoluteValue p D (i x) = + padicFiniteExtensionAbsoluteValue p E x + exact padicFiniteExtensionAbsoluteValue_algHom p i x + exact comap_absoluteValueUnitBallSubring_eq_of_extends + (padicFiniteExtensionAbsoluteValue p E) + (padicFiniteExtensionAbsoluteValue p D) + (padicFiniteExtensionAbsoluteValue_nonarchimedean p E) + (padicFiniteExtensionAbsoluteValue_nonarchimedean p D) + hExt + +/-- The preceding absolute value in the additive exponential presentation +used by the unramified cyclotomic theorem. -/ +noncomputable def padicFiniteExtensionExponentialValuation + (p : ℕ) [Fact p.Prime] + (L : Type*) [Field L] [Algebra ℚ_[p] L] [FiniteDimensional ℚ_[p] L] : + LubinTate.Valuations.ExponentialValuation L := + absoluteValueExponentialValuation + (padicFiniteExtensionAbsoluteValue p L) + (padicFiniteExtensionAbsoluteValue_nonarchimedean p L) + +/-- The finite-extension exponential valuation restricts exactly to the canonical +exponential valuation of `ℚ_p`. -/ +theorem padicFiniteExtensionExponentialValuation_extends + (p : ℕ) [Fact p.Prime] + (L : Type*) [Field L] [Algebra ℚ_[p] L] [FiniteDimensional ℚ_[p] L] + (x : ℚ_[p]) : + padicFiniteExtensionExponentialValuation p L + (algebraMap ℚ_[p] L x) = + padicFieldExponentialValuation p x := by + exact absoluteValueExponentialValuation_extends + (NormedField.toAbsoluteValue ℚ_[p]) + (padicFiniteExtensionAbsoluteValue p L) + (padicFieldAbsoluteValue_nonarchimedean p) + (padicFiniteExtensionAbsoluteValue_nonarchimedean p L) + (padicFiniteExtensionAbsoluteValue_extends p L) x + +/-- The canonical exponential valuations on finite extensions of `ℚ_p` are +functorial under `ℚ_p`-algebra embeddings. -/ +theorem padicFiniteExtensionExponentialValuation_algHom + (p : ℕ) [Fact p.Prime] + {E D : Type} [Field E] [Field D] + [Algebra ℚ_[p] E] [Algebra ℚ_[p] D] + [FiniteDimensional ℚ_[p] E] [FiniteDimensional ℚ_[p] D] + (i : E →ₐ[ℚ_[p]] D) (x : E) : + padicFiniteExtensionExponentialValuation p D (i x) = + padicFiniteExtensionExponentialValuation p E x := by + by_cases hx : x = 0 + · subst x + simp [padicFiniteExtensionExponentialValuation, + absoluteValueExponentialValuation] + · have hix : i x ≠ 0 := by simpa using i.injective.ne hx + simp [padicFiniteExtensionExponentialValuation, + absoluteValueExponentialValuation, hx, hix, + padicFiniteExtensionAbsoluteValue_algHom p i] + +/-- Ramification index is monotone under an embedding of finite extensions +of `ℚ_p`. The larger field's canonical valuation pulls back exactly to the +smaller field's canonical valuation, and multiplicativity in the resulting +valued-field tower gives the inequality. -/ +theorem padicFiniteExtension_exponentialRamificationIndex_le_of_algHom + (p : ℕ) [Fact p.Prime] + {E D : Type} [Field E] [Field D] + [Algebra ℚ_[p] E] [Algebra ℚ_[p] D] + [FiniteDimensional ℚ_[p] E] [FiniteDimensional ℚ_[p] D] + (i : E →ₐ[ℚ_[p]] D) : + exponentialRamificationIndex + (padicFieldExponentialValuation p) + (padicFiniteExtensionExponentialValuation p E) ≤ + exponentialRamificationIndex + (padicFieldExponentialValuation p) + (padicFiniteExtensionExponentialValuation p D) := by + apply exponentialRamificationIndex_le_of_algHom i + · exact padicFiniteExtensionExponentialValuation_extends p E + · intro x + exact padicFiniteExtensionExponentialValuation_algHom p i x + +/-- The valuation ring selected by the norm-formula extension is the actual +integral closure of the standard complete-DVF valuation ring of `ℚ_p`. +This is the ring-level uniqueness bridge between the exponential valuation and the +canonical finite-extension construction. -/ +theorem padicCyclotomicUnramified_padicFiniteExtensionValuationSubring_eq_integralClosure + (p : ℕ) [Fact p.Prime] + (L : Type*) [Field L] [Algebra ℚ_[p] L] [FiniteDimensional ℚ_[p] L] : + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring + (padicFiniteExtensionExponentialValuation p L)).toSubring = + (integralClosure + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuationSubring + L).toSubring := by + let : Algebra.IsAlgebraic ℚ_[p] L := Algebra.IsAlgebraic.of_finite ℚ_[p] L + have hclosure := + exponentialValuationSubring_eq_integralClosure_of_henselian + (padicFieldExponentialValuation p) + (padicFiniteExtensionExponentialValuation p L) + (padicFiniteExtensionExponentialValuation_extends p L) + (padicCyclotomicUnramified_padicExponentialValuation_henselian p) + rw [padicFieldExponentialValuationSubring_eq_completeDVF p] at hclosure + exact hclosure + +/-- An integral-closure valuation ring is equal, as a subring of the field, +to the usual `integralClosure` subring. -/ +private theorem padicCyclotomicUnramified_valuationSubring_eq_integralClosure + {K L : Type*} [Field K] [Field L] [Algebra K L] + (V : ValuationSubring K) (W : ValuationSubring L) + [IsIntegralClosure W V L] : + W.toSubring = (integralClosure V L).toSubring := by + ext x + constructor + · intro hx + exact (IsIntegralClosure.isIntegral_iff (A := W)).2 ⟨⟨x, hx⟩, rfl⟩ + · intro hx + obtain ⟨y, hy⟩ := + (IsIntegralClosure.isIntegral_iff (A := W)).1 hx + rw [← hy] + exact y.property + +/-- Identity-on-elements equivalence between the exponential valuation ring of +`ℚ_p` and the standard complete-DVF valuation ring. -/ +noncomputable def padicCyclotomicUnramifiedPadicExponentialValuationSubringEquivCompleteDVF + (p : ℕ) [Fact p.Prime] : + LubinTate.Valuations.exponentialValuationSubring + (padicFieldExponentialValuation p) ≃+* + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuationSubring + := by + let V := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring + (padicFieldExponentialValuation p) + let C : ValuationSubring ℚ_[p] := + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).valuation.valuationSubring + have hVC : V = C := + padicFieldExponentialValuationSubring_eq_completeDVF p + exact + { toFun := fun x => ⟨x, by + change (x : ℚ_[p]) ∈ C + rw [← hVC] + exact x.property⟩ + invFun := fun x => ⟨x, by + change (x : ℚ_[p]) ∈ V + rw [hVC] + exact x.property⟩ + left_inv := fun x => Subtype.ext rfl + right_inv := fun x => Subtype.ext rfl + map_mul' := fun _ _ => Subtype.ext rfl + map_add' := fun _ _ => Subtype.ext rfl } + +/-- If a complete-DVF target is the actual integral closure, its valuation +ring is identity-equivalent to the norm-formula valuation ring. -/ +noncomputable def padicCyclotomicUnramifiedPadicFiniteExtensionValuationSubringEquiv + (p : ℕ) [Fact p.Prime] + (L : Type*) [Field L] [Algebra ℚ_[p] L] [FiniteDimensional ℚ_[p] L] + (target : ValuationTheory.DiscreteValuationField.CompleteDVF L) + [IsIntegralClosure target.valuationSubring + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuationSubring L] : + LubinTate.Valuations.exponentialValuationSubring + (padicFiniteExtensionExponentialValuation p L) ≃+* + target.valuationSubring := by + let W := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring + (padicFiniteExtensionExponentialValuation p L) + let T : ValuationSubring L := target.valuation.valuationSubring + have hW : W.toSubring = + (integralClosure + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuationSubring + L).toSubring := + padicCyclotomicUnramified_padicFiniteExtensionValuationSubring_eq_integralClosure p L + exact + { toFun := fun x => ⟨x, by + change (x : L) ∈ T.toSubring + rw [padicCyclotomicUnramified_valuationSubring_eq_integralClosure + (K := ℚ_[p]) (L := L) + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).valuation.valuationSubring T, ← hW] + exact x.property⟩ + invFun := fun x => ⟨x, by + change (x : L) ∈ W.toSubring + rw [hW, ← padicCyclotomicUnramified_valuationSubring_eq_integralClosure + (K := ℚ_[p]) (L := L) + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).valuation.valuationSubring T] + exact x.property⟩ + left_inv := fun x => Subtype.ext rfl + right_inv := fun x => Subtype.ext rfl + map_mul' := fun _ _ => Subtype.ext rfl + map_add' := fun _ _ => Subtype.ext rfl } + +/-- The norm-formula valuation ring on a finite extension of `ℚ_p` is the +valuation ring of any complete-DVF model given by the integral closure. -/ +theorem padicFiniteExtensionExponentialValuationSubring_eq_completeDVF + (p : ℕ) [Fact p.Prime] + (L : Type*) [Field L] [Algebra ℚ_[p] L] [FiniteDimensional ℚ_[p] L] + (target : ValuationTheory.DiscreteValuationField.CompleteDVF L) + [IsIntegralClosure target.valuationSubring + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuationSubring L] : + LubinTate.Valuations.exponentialValuationSubringAsValuationSubring + (padicFiniteExtensionExponentialValuation p L) = + target.valuation.valuationSubring := by + let e := + padicCyclotomicUnramifiedPadicFiniteExtensionValuationSubringEquiv p L target + ext y + constructor + · intro hy + exact (e ⟨y, hy⟩).property + · intro hy + exact (e.symm ⟨y, hy⟩).property + +/-- the unramified cyclotomic theorem(i), specialized to the actual `ℚ_p` valuation: +adjoining roots of unity of any order prime to `p` is unramified in the +degree/residue-degree sense. -/ +theorem padicCyclotomic_finiteUnramified_of_coprime + (p r : ℕ) [hp : Fact p.Prime] (hpr : p.Coprime r) + {L : Type*} [Field L] [Algebra ℚ_[p] L] [FiniteDimensional ℚ_[p] L] + {ζ : L} (hζ : IsPrimitiveRoot ζ r) + (hζgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) : + FiniteUnramifiedExtension + (padicFieldExponentialValuation p) + (padicFiniteExtensionExponentialValuation p L) + (padicFiniteExtensionExponentialValuation_extends p L) := by + let v := padicFieldExponentialValuation p + let e := padicCyclotomicUnramifiedPadicExponentialResidueFieldEquivZMod p + let : Finite (padicCyclotomicUnramifiedResidueField v) := + Finite.of_equiv (ZMod p) e.symm.toEquiv + let : Fintype (padicCyclotomicUnramifiedResidueField v) := Fintype.ofFinite _ + have hk : Fintype.card (padicCyclotomicUnramifiedResidueField v) = p ^ 1 := by + simpa [v] using padicCyclotomicUnramified_padicExponentialResidueField_card p + exact padicCyclotomicUnramified_finiteUnramifiedExtension + v (padicFiniteExtensionExponentialValuation p L) + (padicFiniteExtensionExponentialValuation_extends p L) + (padicCyclotomicUnramified_padicExponentialValuation_henselian p) + hk hpr hζ hζgen + +/-- The `p ^ f - 1` form of +`padicCyclotomic_finiteUnramified_of_coprime`. -/ +theorem padicCyclotomicUnramified_padic_finiteUnramified_prime_pow_sub_one + (p f : ℕ) [hp : Fact p.Prime] (hf : 0 < f) + {L : Type*} [Field L] [Algebra ℚ_[p] L] [FiniteDimensional ℚ_[p] L] + {ζ : L} (hζ : IsPrimitiveRoot ζ (p ^ f - 1)) + (hζgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) : + FiniteUnramifiedExtension + (padicFieldExponentialValuation p) + (padicFiniteExtensionExponentialValuation p L) + (padicFiniteExtensionExponentialValuation_extends p L) := by + exact padicCyclotomic_finiteUnramified_of_coprime + p (p ^ f - 1) (prime_coprime_pow_sub_one p f hf) hζ hζgen + +/-- The canonical ramification index of the integral-closure +complete-DVF extension is one. This is the valuation-ring form of the +unramified conclusion, independent of the chosen valuation presentation. -/ +theorem padicCyclotomic_ramificationIndex_eq_one_prime_pow_sub_one + (p f : ℕ) [hp : Fact p.Prime] (hf : 0 < f) + {L : Type*} [Field L] [Algebra ℚ_[p] L] [FiniteDimensional ℚ_[p] L] + {ζ : L} (hζ : IsPrimitiveRoot ζ (p ^ f - 1)) + (hζgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) + (target : ValuationTheory.DiscreteValuationField.CompleteDVF L) + [hExt : + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).valuation.HasExtension + target.valuation] + [IsIntegralClosure target.valuationSubring + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuationSubring L] : + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).toDVF + target.toDVF = 1 := by + let base := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p + let v := padicFieldExponentialValuation p + let w := padicFiniteExtensionExponentialValuation p L + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let iExponential := exponentialValuationRingMap v w + (padicFiniteExtensionExponentialValuation_extends p L) + let iCanonical : base.valuationSubring →+* target.valuationSubring := + algebraMap base.valuationSubring target.valuationSubring + let eBase : V ≃+* base.valuationSubring := + padicCyclotomicUnramifiedPadicExponentialValuationSubringEquivCompleteDVF p + let eTarget : W ≃+* target.valuationSubring := + padicCyclotomicUnramifiedPadicFiniteExtensionValuationSubringEquiv p L target + let : IsDiscreteValuationRing base.valuationSubring := + base.valuationSubring_isDiscreteValuationRing + let : IsDiscreteValuationRing target.valuationSubring := + target.valuationSubring_isDiscreteValuationRing + let : IsDiscreteValuationRing V := + IsDiscreteValuationRing.RingEquivClass.isDiscreteValuationRing eBase.symm + let : IsDiscreteValuationRing W := + IsDiscreteValuationRing.RingEquivClass.isDiscreteValuationRing eTarget.symm + let : IsLocalHom iExponential := + exponentialValuationRingMap_isLocalHom v w + (padicFiniteExtensionExponentialValuation_extends p L) + let : Algebra V W := iExponential.toAlgebra + have hvdisc : LubinTate.Valuations.DiscreteExponentialValuation v := + discreteExponentialValuation_of_isDiscreteValuationRing v + have hUnramified : FiniteUnramifiedExtension v w + (padicFiniteExtensionExponentialValuation_extends p L) := by + simpa [v, w] using + padicCyclotomicUnramified_padic_finiteUnramified_prime_pow_sub_one + p f hf hζ hζgen + have hRamification : exponentialRamificationIndex v w = 1 := + exponentialRamificationIndex_eq_one_of_finiteUnramifiedExtension + v w (padicFiniteExtensionExponentialValuation_extends p L) + hUnramified + have hidealExponential : + Ideal.ramificationIdx' + (IsLocalRing.maximalIdeal V) (IsLocalRing.maximalIdeal W) = 1 := by + have hcompare := exponentialRamificationIndex_eq_ideal_ramificationIdx + v w (padicFiniteExtensionExponentialValuation_extends p L) hvdisc + change exponentialRamificationIndex v w = + Ideal.ramificationIdx' + (IsLocalRing.maximalIdeal V) (IsLocalRing.maximalIdeal W) at hcompare + rw [← hcompare] + exact hRamification + have hiExponential : Function.Injective iExponential := by + intro x y hxy + apply Subtype.ext + exact (algebraMap ℚ_[p] L).injective (congrArg Subtype.val hxy) + have hmapExponential : + Ideal.map iExponential (IsLocalRing.maximalIdeal V) = + IsLocalRing.maximalIdeal W := by + have hmap := + ValuationTheory.map_maximalIdeal_eq_pow_ramificationIdx hiExponential + rw [hidealExponential, pow_one] at hmap + exact hmap + have hmapBase : + Ideal.map eBase (IsLocalRing.maximalIdeal V) = + IsLocalRing.maximalIdeal base.valuationSubring := + ValuationTheory.ringEquiv_map_maximalIdeal eBase + have hmapTarget : + Ideal.map eTarget (IsLocalRing.maximalIdeal W) = + IsLocalRing.maximalIdeal target.valuationSubring := + ValuationTheory.ringEquiv_map_maximalIdeal eTarget + have hcommute : + eTarget.toRingHom.comp iExponential = iCanonical.comp eBase.toRingHom := by + ext x + rfl + have hmapCanonical : + Ideal.map iCanonical (IsLocalRing.maximalIdeal base.valuationSubring) = + IsLocalRing.maximalIdeal target.valuationSubring := by + calc + Ideal.map iCanonical (IsLocalRing.maximalIdeal base.valuationSubring) = + Ideal.map iCanonical + (Ideal.map eBase (IsLocalRing.maximalIdeal V)) := by rw [hmapBase] + _ = Ideal.map (iCanonical.comp eBase.toRingHom) + (IsLocalRing.maximalIdeal V) := + Ideal.map_map eBase.toRingHom iCanonical + _ = Ideal.map (eTarget.toRingHom.comp iExponential) + (IsLocalRing.maximalIdeal V) := by rw [hcommute] + _ = Ideal.map eTarget + (Ideal.map iExponential (IsLocalRing.maximalIdeal V)) := + (Ideal.map_map iExponential eTarget.toRingHom).symm + _ = Ideal.map eTarget (IsLocalRing.maximalIdeal W) := by rw [hmapExponential] + _ = IsLocalRing.maximalIdeal target.valuationSubring := hmapTarget + have hmapCanonicalAlg : + Ideal.map + (algebraMap base.valuationSubring target.valuationSubring) + (IsLocalRing.maximalIdeal base.valuationSubring) = + IsLocalRing.maximalIdeal target.valuationSubring := by + simpa only [iCanonical] using hmapCanonical + change Ideal.ramificationIdx' + (IsLocalRing.maximalIdeal base.valuationSubring) + (IsLocalRing.maximalIdeal target.valuationSubring) = 1 + apply Ideal.ramificationIdx'_spec + · rw [hmapCanonicalAlg, pow_one] + · rw [hmapCanonicalAlg] + simpa using not_le_of_gt (Ideal.pow_succ_lt_pow + (IsDiscreteValuationRing.not_a_field target.valuationSubring) 1) + +/-- Complete-DVF form of the unramified cyclotomic theorem(i): the canonical +integral-closure extension is finite unramified. -/ +theorem padicCyclotomicUnramified_padic_isFiniteUnramified_prime_pow_sub_one + (p f : ℕ) [hp : Fact p.Prime] (hf : 0 < f) + {L : Type*} [Field L] [Algebra ℚ_[p] L] [FiniteDimensional ℚ_[p] L] + {ζ : L} (hζ : IsPrimitiveRoot ζ (p ^ f - 1)) + (hζgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) + (target : ValuationTheory.DiscreteValuationField.CompleteDVF L) + [hExt : + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).valuation.HasExtension + target.valuation] + [IsIntegralClosure target.valuationSubring + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuationSubring L] : + ValuationTheory.DiscreteValuationField.ValuedExtension.IsFiniteUnramified + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).toDVF + target.toDVF := by + let base := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p + let : Algebra.IsSeparable ℚ_[p] L := by infer_instance + let : IsScalarTower base.valuationSubring target.valuationSubring L := by + apply IsScalarTower.of_algebraMap_eq + intro x + rfl + let : Module.Finite base.valuationSubring target.valuationSubring := + moduleFinite_target_valuationSubring_of_finite_separable + base target + let : FiniteDimensional base.residueField target.residueField := + residueField_finiteDimensional_of_moduleFinite + base target + let : Finite base.residueField := by + simpa [base] using + LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF_residueField_finite p + let : PerfectField base.residueField := by infer_instance + have hresidueSeparable : + Algebra.IsSeparable base.residueField target.residueField := by + infer_instance + refine ⟨hresidueSeparable, ?_⟩ + exact + ((ramificationIndex_eq_one_iff_residueDegree_eq_degree_of_finite_separable + base target).1 + (padicCyclotomic_ramificationIndex_eq_one_prime_pow_sub_one + p f hf hζ hζgen target)).symm + +/-- Canonical unramified cyclotomic endpoint over `ℚ_p`: the actual integral closure +supplies a complete-DVF extension which is finite unramified and has degree +exactly `f`. -/ +theorem exists_padicCyclotomic_completeDVF_isFiniteUnramified_degree_eq + (p f : ℕ) [hp : Fact p.Prime] (hf : 0 < f) + {L : Type*} [Field L] [Algebra ℚ_[p] L] [FiniteDimensional ℚ_[p] L] + {ζ : L} (hζ : IsPrimitiveRoot ζ (p ^ f - 1)) + (hζgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) : + ∃ target : ValuationTheory.DiscreteValuationField.CompleteDVF.{_, 0} L, + ∃ hExt : + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).valuation.HasExtension + target.valuation, + letI : + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).valuation.HasExtension + target.valuation := hExt + IsIntegralClosure target.valuationSubring + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).valuationSubring L ∧ + ValuationTheory.DiscreteValuationField.ValuedExtension.IsFiniteUnramified + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).toDVF + target.toDVF ∧ + ValuationTheory.DiscreteValuationField.ValuedExtension.degree + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).toDVF + target.toDVF = f := by + let : Algebra.IsSeparable ℚ_[p] L := by infer_instance + let base := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p + obtain ⟨target, hExt, hTarget, _hfundamental⟩ := + exists_integralClosure_standard_fundamental_identity + (K := ℚ_[p]) (L := L) base + let : base.valuation.HasExtension target.valuation := hExt + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := hTarget + refine ⟨target, hExt, hTarget, ?_, ?_⟩ + · exact padicCyclotomicUnramified_padic_isFiniteUnramified_prime_pow_sub_one + p f hf hζ hζgen target + · exact + (ValuationTheory.DiscreteValuationField.ValuedExtension.degree_eq_finrank + base.toDVF target.toDVF).trans + (padicCyclotomic_finrank_prime_pow_sub_one + p f hf hζ hζgen) + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate.lean new file mode 100644 index 0000000000..cc6c8ab881 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/All.lean new file mode 100644 index 0000000000..8f50c74c5a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/All.lean @@ -0,0 +1,27 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.All +/-! +# Lubin--Tate theory + +This is the public aggregate for Lubin--Tate theory. It exports the formal +module foundations, the characteristic-independent standard finite-level +division fields and their lower/upper ramification formulas, and the explicit +equal-characteristic construction. The +norm-subgroup calculation and transport used by local class field theory are +exported from `LocalClassFieldTheory.LubinTateApplication`, and the +field-facing existence theorem from +`LocalClassFieldTheory.Finite.Existence.EqualCharacteristic`. +The equal-characteristic construction is organized by its mathematical stages +below `LubinTate.EqualCharacteristic`. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic.lean new file mode 100644 index 0000000000..3b1a7432b9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.RealIndexSteps +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/All.lean new file mode 100644 index 0000000000..f1927ba124 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/All.lean @@ -0,0 +1,31 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.RealIndexSteps +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.All +/-! +# Equal-characteristic Lubin--Tate theory + +Public aggregate for the equal-characteristic Lubin--Tate construction. It +includes the Laurent-series model, finite and completed Lubin--Tate levels, +and the Frobenius and theta constructions. The local-class-field-theory +norm-subgroup calculation and its transport live in +`LocalClassFieldTheory.LubinTateApplication`. + +Each mathematical stage has a reader-facing aggregate below +`LubinTate.EqualCharacteristic`; declarations remain in the matching +namespace. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel.lean new file mode 100644 index 0000000000..8b1321d955 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel.lean @@ -0,0 +1,42 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedPrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedPolynomialEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizerNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusBaseEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldCoefficientDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPowerBasis +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPrimitive +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectBracketAtCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracketRecursion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectTargetLevelEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFirstIdentity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFrobeniusFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaIteration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaAtCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaLocalInverse + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/All.lean new file mode 100644 index 0000000000..e81ceb659c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/All.lean @@ -0,0 +1,45 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedPrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedPolynomialEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizerNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusBaseEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldCoefficientDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPowerBasis +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPrimitive +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectBracketAtCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracketRecursion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectTargetLevelEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFirstIdentity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFrobeniusFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaIteration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaAtCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaLocalInverse +/-! +# Completed Lubin--Tate levels in equal characteristic + +Public aggregate for completed level fields, Frobenius fixed fields, and +completed norm calculations. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean new file mode 100644 index 0000000000..78572edaab --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean @@ -0,0 +1,751 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer +/-! +# The completed theta-intertwining theorem: the completed changed-uniformizer level + +For `u ∈ κ⟦T⟧ˣ`, the theta construction used in the completed theta-intertwining theorem + intertwines the +target parameter `T` with the source parameter `u⁻¹T`. This file therefore +base-changes the primitive polynomial for `u⁻¹T` to the completed maximal- +unramified field, forms its genuine splitting field, and constructs the +primitive analytic evaluation point there. + +The repository's primitive polynomial indexed by `n` cuts out division level +`n + 1`; this shift is kept explicit throughout. +-/ + +@[expose] public section + +noncomputable +section + +open Filter +open scoped LaurentSeries NNReal Polynomial PowerSeries Topology WithZero + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The completed unramified base is an algebra over residue-field Laurent series through +coefficient extension. -/ +noncomputable local instance equalCharacteristicChangedCompletedBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +private instance equalCharacteristicChangedCompletedBaseCharP + (F : LocalField.{u, v} K) + : + CharP (equalCharacteristicCompletedUnramifiedField F.residueField) + F.residueCharacteristic := + charP_of_injective_algebraMap + (algebraMap F.residueField + (equalCharacteristicCompletedUnramifiedField F.residueField)).injective + F.residueCharacteristic + +noncomputable local instance equalCharacteristicChangedCompletedBaseValuationIsNontrivial + (k : Type v) [Field k] : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField k) ℤᵐ⁰).IsNontrivial := + equalCharacteristicCompletedBaseValuationIsNontrivial k + +/-- The Laurent-series valuation on the changed completed base has rank one. -/ +noncomputable local instance equalCharacteristicChangedCompletedBaseValuationRankOne + (k : Type v) [Field k] : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField k) ℤᵐ⁰).RankOne := + equalCharacteristicCompletedBaseValuationRankOne k + +/-- The changed completed base carries the nontrivial norm associated with its Laurent-series +valuation. -/ +noncomputable local instance equalCharacteristicChangedCompletedBaseNormedField + (k : Type v) [Field k] : + NontriviallyNormedField + (equalCharacteristicCompletedUnramifiedField k) := + equalCharacteristicCompletedBaseNormedField k + +/-- The source unit is `u⁻¹`; hence its parameter is `u⁻¹T`, in the +orientation of the theta intertwining relation. -/ +noncomputable def equalCharacteristicThetaSourceUnit + {k : Type*} [Field k] (u : k⟦X⟧ˣ) : k⟦X⟧ˣ := + u⁻¹ + +/-- The primitive polynomial for source parameter `u⁻¹T`, after base change +to `(AlgebraicClosure κ)((T))`. -/ +noncomputable def equalCharacteristicChangedCompletedPrimitivePolynomial + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Polynomial (equalCharacteristicCompletedUnramifiedField F.residueField) := + (equalCharacteristicChangedPrimitivePolynomial F + (equalCharacteristicThetaSourceUnit u) n).map + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField)) + +/-- The changed primitive polynomial remains monic after completion. -/ +theorem equalCharacteristicChangedCompletedPrimitivePolynomial_monic + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedCompletedPrimitivePolynomial F u n).Monic := + (equalCharacteristicChangedPrimitivePolynomial_monic F + (equalCharacteristicThetaSourceUnit u) n).map _ + +/-- The completed changed primitive polynomial has degree `(q - 1) * q ^ n`. -/ +theorem equalCharacteristicChangedCompletedPrimitivePolynomial_natDegree + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedCompletedPrimitivePolynomial F u n).natDegree = + (Nat.card F.residueField - 1) * Nat.card F.residueField ^ n := by + rw [equalCharacteristicChangedCompletedPrimitivePolynomial, + (equalCharacteristicChangedPrimitivePolynomial_monic F + (equalCharacteristicThetaSourceUnit u) n).natDegree_map, + equalCharacteristicChangedPrimitivePolynomial_natDegree] + +/-- The genuine splitting field of the source primitive polynomial. -/ +def equalCharacteristicChangedCompletedLevelField + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) := + (equalCharacteristicChangedCompletedPrimitivePolynomial F u n).SplittingField + +/-- The splitting field of the completed changed primitive polynomial is a field. -/ +instance equalCharacteristicChangedCompletedLevelFieldField + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Field (equalCharacteristicChangedCompletedLevelField F u n) := by + change Field + (equalCharacteristicChangedCompletedPrimitivePolynomial F u n).SplittingField + infer_instance + +/-- The changed completed level field is an algebra over the completed unramified field. -/ +noncomputable instance equalCharacteristicChangedCompletedLevelFieldAlgebra + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Algebra (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n) := by + change Algebra (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedPrimitivePolynomial F u n).SplittingField + infer_instance + +section + +/-- The changed completed Lubin–Tate level is a module over its completed unramified base via the +chosen algebra structure. -/ +local instance equalCharacteristicChangedCompletedLevelFieldModule + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + @Module (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n) + (inferInstance : DivisionRing + (equalCharacteristicCompletedUnramifiedField F.residueField)).toRing.toSemiring + (inferInstance : AddCommGroup + (equalCharacteristicChangedCompletedLevelField F u n)).toAddCommMonoid := + @Algebra.toModule + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n) _ _ + (equalCharacteristicChangedCompletedLevelFieldAlgebra F u n) + +/-- The changed completed level field is finite-dimensional over its completed base. -/ +instance equalCharacteristicChangedCompletedLevelField_finiteDimensionalInstance + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + FiniteDimensional + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n) := by + change FiniteDimensional + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedPrimitivePolynomial F u n).SplittingField + infer_instance + +local instance equalCharacteristicChangedCompletedLevelField_isAlgebraic + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Algebra.IsAlgebraic + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n) := + @Algebra.IsAlgebraic.of_finite + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n) _ _ _ + (equalCharacteristicChangedCompletedLevelFieldAlgebra F u n) + (equalCharacteristicChangedCompletedLevelField_finiteDimensionalInstance F u n) + +/-- The changed completed level field has the residue characteristic. -/ +instance equalCharacteristicChangedCompletedLevelField_charP + (F : LocalField.{u, v} K) [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + CharP (equalCharacteristicChangedCompletedLevelField F u n) + F.residueCharacteristic := + charP_of_injective_algebraMap + (algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n)).injective + F.residueCharacteristic + +/-- Comparison with the library splitting-field model. -/ +noncomputable def + equalCharacteristicChangedCompletedLevelFieldEquivSplittingField + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicChangedCompletedLevelField F u n + ≃ₐ[equalCharacteristicCompletedUnramifiedField F.residueField] + (equalCharacteristicChangedCompletedPrimitivePolynomial F u n).SplittingField := + AlgEquiv.refl + +/-- Construct a named changed-level element from the splitting-field +model. -/ +noncomputable def + equalCharacteristicChangedCompletedLevelFieldOfSplittingField + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedCompletedPrimitivePolynomial F u n).SplittingField + →ₐ[equalCharacteristicCompletedUnramifiedField F.residueField] + equalCharacteristicChangedCompletedLevelField F u n := + (equalCharacteristicChangedCompletedLevelFieldEquivSplittingField + F u n).symm.toAlgHom + +/-- The changed primitive polynomial splits over the named completed level +field. -/ +theorem equalCharacteristicChangedCompletedPrimitivePolynomial_splits + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + ((equalCharacteristicChangedCompletedPrimitivePolynomial F u n).map + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n))).Splits := by + exact Polynomial.SplittingField.splits + (equalCharacteristicChangedCompletedPrimitivePolynomial F u n) + +/-- The roots of the changed primitive polynomial generate the named +completed level field. -/ +theorem + equalCharacteristicChangedCompletedPrimitivePolynomial_adjoin_rootSet + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ((equalCharacteristicChangedCompletedPrimitivePolynomial F u n).rootSet + (equalCharacteristicChangedCompletedLevelField F u n) : + Set (equalCharacteristicChangedCompletedLevelField F u n)) = ⊤ := by + exact Polynomial.SplittingField.adjoin_rootSet + (equalCharacteristicChangedCompletedPrimitivePolynomial F u n) + +/-- Supplies finite-dimensionality of the changed completed level field explicitly. -/ +theorem equalCharacteristicChangedCompletedLevelField_finiteDimensional + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + FiniteDimensional + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n) := by + infer_instance + +private theorem equalCharacteristicChangedCompletedPrimitivePolynomial_map_degree_ne_zero + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + ((equalCharacteristicChangedCompletedPrimitivePolynomial F u n).map + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n))).degree ≠ 0 := by + have hmonic := + (equalCharacteristicChangedCompletedPrimitivePolynomial_monic F u n).map + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n)) + rw [Polynomial.degree_eq_natDegree hmonic.ne_zero, + (equalCharacteristicChangedCompletedPrimitivePolynomial_monic F u n).natDegree_map, + equalCharacteristicChangedCompletedPrimitivePolynomial_natDegree] + exact_mod_cast (Nat.mul_pos + (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (Nat.pow_pos Nat.card_pos)).ne' + +/-- A chosen primitive division-level `n + 1` point for source parameter +`u⁻¹T`. -/ +noncomputable def equalCharacteristicChangedCompletedPrimitiveRoot + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicChangedCompletedLevelField F u n := + equalCharacteristicChangedCompletedLevelFieldOfSplittingField F u n + (Polynomial.rootOfSplits + (Polynomial.SplittingField.splits + (equalCharacteristicChangedCompletedPrimitivePolynomial F u n)) + (by exact equalCharacteristicChangedCompletedPrimitivePolynomial_map_degree_ne_zero F u n)) + +/-- The distinguished completed primitive element is a root of the changed polynomial. -/ +theorem equalCharacteristicChangedCompletedPrimitiveRoot_isRoot + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + ((equalCharacteristicChangedCompletedPrimitivePolynomial F u n).map + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n))).IsRoot + (equalCharacteristicChangedCompletedPrimitiveRoot F u n) := by + exact Polynomial.eval_rootOfSplits + (Polynomial.SplittingField.splits + (equalCharacteristicChangedCompletedPrimitivePolynomial F u n)) + (equalCharacteristicChangedCompletedPrimitivePolynomial_map_degree_ne_zero F u n) + +/-- The spectral norm on the changed completed level field. -/ +@[reducible] +noncomputable def equalCharacteristicChangedCompletedLevelNormedField + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + NontriviallyNormedField + (equalCharacteristicChangedCompletedLevelField F u n) := + spectralNorm.nontriviallyNormedField + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n) + +/-- The changed completed Lubin–Tate level carries the spectral norm extending its completed +base. -/ +noncomputable local instance equalCharacteristicChangedCompletedLevelNormedFieldInstance + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + NontriviallyNormedField + (equalCharacteristicChangedCompletedLevelField F u n) := + equalCharacteristicChangedCompletedLevelNormedField F u n + +/-- The spectral norm on the changed completed level field is ultrametric. -/ +theorem equalCharacteristicChangedCompletedLevelIsUltrametric + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + IsUltrametricDist (equalCharacteristicChangedCompletedLevelField F u n) := + ⟨fun x y z ↦ by + rw [dist_eq_norm, dist_eq_norm, dist_eq_norm] + rw [← sub_add_sub_cancel x y z] + exact isNonarchimedean_spectralNorm + (K := equalCharacteristicCompletedUnramifiedField F.residueField) + (L := equalCharacteristicChangedCompletedLevelField F u n) + (x - y) (y - z)⟩ + +noncomputable local instance equalCharacteristicChangedCompletedLevelIsUltrametricInstance + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + IsUltrametricDist (equalCharacteristicChangedCompletedLevelField F u n) := + equalCharacteristicChangedCompletedLevelIsUltrametric F u n + +/-- The changed completed level field is complete for its spectral norm. -/ +theorem equalCharacteristicChangedCompletedLevelCompleteSpace + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + CompleteSpace (equalCharacteristicChangedCompletedLevelField F u n) := + spectralNorm.completeSpace + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n) + +noncomputable local instance equalCharacteristicChangedCompletedLevelCompleteSpaceInstance + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + CompleteSpace (equalCharacteristicChangedCompletedLevelField F u n) := + equalCharacteristicChangedCompletedLevelCompleteSpace F u n + +/-- Defines `equalCharacteristicChangedCompletedLevelValued`. -/ +@[reducible] +noncomputable def equalCharacteristicChangedCompletedLevelValued + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Valued (equalCharacteristicChangedCompletedLevelField F u n) ℝ≥0 := + NormedField.toValued (K := equalCharacteristicChangedCompletedLevelField F u n) + +/-- The spectral norm gives the changed completed Lubin–Tate level its real-valued valuation. -/ +noncomputable local instance equalCharacteristicChangedCompletedLevelValuedInstance + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Valued (equalCharacteristicChangedCompletedLevelField F u n) ℝ≥0 := + equalCharacteristicChangedCompletedLevelValued F u n + +/-- The source parameter `u⁻¹T` in the completed maximal-unramified base. -/ +noncomputable def equalCharacteristicChangedCompletedBaseUniformizer + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) : + equalCharacteristicCompletedUnramifiedField F.residueField := + algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedLaurentUniformizer F + (equalCharacteristicThetaSourceUnit u)) + +/-- The changed base uniformizer remains nonzero after completion. -/ +theorem equalCharacteristicChangedCompletedBaseUniformizer_ne_zero + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) : + equalCharacteristicChangedCompletedBaseUniformizer F u ≠ 0 := by + exact (map_ne_zero + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField))).2 + (equalCharacteristicChangedLaurentUniformizer_ne_zero F + (equalCharacteristicThetaSourceUnit u)) + +private theorem equalCharacteristicChangedLaurentUniformizer_valuation_le_exp_neg_one + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) : + (Valued.v : Valuation F.residueField⸨X⸩ ℤᵐ⁰) + (equalCharacteristicChangedLaurentUniformizer F + (equalCharacteristicThetaSourceUnit u)) ≤ + WithZero.exp (-1 : ℤ) := by + change (Valued.v : Valuation F.residueField⸨X⸩ ℤᵐ⁰) + ((equalCharacteristicChangedIntegralUniformizer F + (equalCharacteristicThetaSourceUnit u) : F.residueField⟦X⟧) : + F.residueField⸨X⸩) ≤ WithZero.exp (-1 : ℤ) + apply (LaurentSeries.intValuation_le_iff_coeff_lt_eq_zero + F.residueField _).2 + intro m hm + have hm0 : m = 0 := Nat.lt_one_iff.mp hm + subst m + simp [equalCharacteristicChangedIntegralUniformizer] + +/-- The completed source parameter `u⁻¹T` is topologically nilpotent. -/ +theorem equalCharacteristicChangedCompletedBaseUniformizer_norm_lt_one + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) : + ‖equalCharacteristicChangedCompletedBaseUniformizer F u‖ < 1 := by + rw [Valued.toNormedField.norm_lt_one_iff] + have hval : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField F.residueField) ℤᵐ⁰) + (equalCharacteristicChangedCompletedBaseUniformizer F u) ≤ + WithZero.exp (-1 : ℤ) := by + apply (LaurentSeries.valuation_le_iff_coeff_lt_eq_zero + (AlgebraicClosure F.residueField)).2 + intro m hm + change equalCharacteristicCompletedUnramifiedFieldCoeff F.residueField + (equalCharacteristicChangedCompletedBaseUniformizer F u) m = 0 + rw [equalCharacteristicChangedCompletedBaseUniformizer, + equalCharacteristicCompletedUnramifiedFieldCoeff_algebraMap_laurentSeries] + have hcoeff : + (equalCharacteristicChangedLaurentUniformizer F + (equalCharacteristicThetaSourceUnit u)).coeff m = 0 := + (LaurentSeries.valuation_le_iff_coeff_lt_eq_zero F.residueField).1 + (equalCharacteristicChangedLaurentUniformizer_valuation_le_exp_neg_one F u) + m hm + rw [hcoeff, map_zero] + exact lt_of_le_of_lt hval (by + rw [← WithZero.exp_zero, WithZero.exp_lt_exp] + omega) + +/-- The image of the source parameter in its completed splitting field. -/ +noncomputable def equalCharacteristicChangedCompletedLevelUniformizer + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicChangedCompletedLevelField F u n := + algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n) + (equalCharacteristicChangedCompletedBaseUniformizer F u) + +/-- The image of the changed uniformizer in the level field is nonzero. -/ +theorem equalCharacteristicChangedCompletedLevelUniformizer_ne_zero + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicChangedCompletedLevelUniformizer F u n ≠ 0 := by + exact (map_ne_zero + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n))).2 + (equalCharacteristicChangedCompletedBaseUniformizer_ne_zero F u) + +/-- The changed spectral norm extends the completed-base norm. -/ +theorem equalCharacteristicChangedCompletedLevelUniformizer_norm + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + ‖equalCharacteristicChangedCompletedLevelUniformizer F u n‖ = + ‖equalCharacteristicChangedCompletedBaseUniformizer F u‖ := by + change spectralNorm + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n) + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n) + (equalCharacteristicChangedCompletedBaseUniformizer F u)) = _ + exact spectralNorm_extends _ + +/-- The changed level uniformizer has norm strictly below one. -/ +theorem equalCharacteristicChangedCompletedLevelUniformizer_norm_lt_one + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + ‖equalCharacteristicChangedCompletedLevelUniformizer F u n‖ < 1 := by + rw [equalCharacteristicChangedCompletedLevelUniformizer_norm] + exact equalCharacteristicChangedCompletedBaseUniformizer_norm_lt_one F u + +private theorem equalCharacteristicChangedPiPolynomial_eval₂ + (F : LocalField.{u, v} K) + (u : F.residueField⟦X⟧ˣ) + {A : Type*} [Field A] [CharP A F.residueCharacteristic] + (φ : F.residueField⸨X⸩ →+* A) (x : A) : + Polynomial.eval₂ φ x + (equalCharacteristicChangedPiPolynomial F + (equalCharacteristicThetaSourceUnit u)) = + equalCharacteristicLubinTateAmbientPiEnd F + (φ (equalCharacteristicChangedLaurentUniformizer F + (equalCharacteristicThetaSourceUnit u))) x := by + rw [equalCharacteristicChangedPiPolynomial_eq] + simp [equalCharacteristicLubinTateAmbientPiEnd_apply] + +private theorem equalCharacteristicChangedPiPolynomialIterate_eval₂ + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) + {A : Type*} [Field A] [CharP A F.residueCharacteristic] + (φ : F.residueField⸨X⸩ →+* A) (n : ℕ) (x : A) : + Polynomial.eval₂ φ x + (equalCharacteristicChangedPiPolynomialIterate F + (equalCharacteristicThetaSourceUnit u) n) = + equalCharacteristicLubinTateAmbientPiIterate F + (φ (equalCharacteristicChangedLaurentUniformizer F + (equalCharacteristicThetaSourceUnit u))) n x := by + have hfun : + (fun y : A ↦ Polynomial.eval₂ φ y + (equalCharacteristicChangedPiPolynomial F + (equalCharacteristicThetaSourceUnit u))) = + (fun y : A ↦ equalCharacteristicLubinTateAmbientPiEnd F + (φ (equalCharacteristicChangedLaurentUniformizer F + (equalCharacteristicThetaSourceUnit u))) y) := by + funext y + exact equalCharacteristicChangedPiPolynomial_eval₂ F u φ y + calc + Polynomial.eval₂ φ x + (equalCharacteristicChangedPiPolynomialIterate F + (equalCharacteristicThetaSourceUnit u) n) = + (fun y : A ↦ Polynomial.eval₂ φ y + (equalCharacteristicChangedPiPolynomial F + (equalCharacteristicThetaSourceUnit u)))^[n] x := by + rw [equalCharacteristicChangedPiPolynomialIterate, + Polynomial.iterate_comp_eval₂, Polynomial.eval₂_X] + _ = (fun y : A ↦ equalCharacteristicLubinTateAmbientPiEnd F + (φ (equalCharacteristicChangedLaurentUniformizer F + (equalCharacteristicThetaSourceUnit u))) y)^[n] x := by + exact congrArg (fun f : A → A ↦ f^[n] x) hfun + _ = equalCharacteristicLubinTateAmbientPiIterate F + (φ (equalCharacteristicChangedLaurentUniformizer F + (equalCharacteristicThetaSourceUnit u))) n x := + (equalCharacteristicLubinTateAmbientPiIterate_eq_function_iterate F + (φ (equalCharacteristicChangedLaurentUniformizer F + (equalCharacteristicThetaSourceUnit u))) n x).symm + +private theorem equalCharacteristicChangedPrimitivePolynomial_eval₂ + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) + {A : Type*} [Field A] [CharP A F.residueCharacteristic] + (φ : F.residueField⸨X⸩ →+* A) (n : ℕ) (x : A) : + Polynomial.eval₂ φ x + (equalCharacteristicChangedPrimitivePolynomial F + (equalCharacteristicThetaSourceUnit u) n) = + equalCharacteristicLubinTateAmbientPiIterate F + (φ (equalCharacteristicChangedLaurentUniformizer F + (equalCharacteristicThetaSourceUnit u))) n x ^ + (Nat.card F.residueField - 1) + + φ (equalCharacteristicChangedLaurentUniformizer F + (equalCharacteristicThetaSourceUnit u)) := by + rw [equalCharacteristicChangedPrimitivePolynomial_eq, + Polynomial.eval₂_add, Polynomial.eval₂_pow, + equalCharacteristicChangedPiPolynomialIterate_eval₂, + Polynomial.eval₂_C] + +/-- The chosen source point satisfies the primitive `u⁻¹T` equation. -/ +theorem equalCharacteristicChangedCompletedPrimitiveRoot_equation + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicChangedCompletedLevelUniformizer F u n) n + (equalCharacteristicChangedCompletedPrimitiveRoot F u n) ^ + (Nat.card F.residueField - 1) + + equalCharacteristicChangedCompletedLevelUniformizer F u n = 0 := by + have hroot := equalCharacteristicChangedCompletedPrimitiveRoot_isRoot F u n + change Polynomial.eval + (equalCharacteristicChangedCompletedPrimitiveRoot F u n) + (((equalCharacteristicChangedPrimitivePolynomial F + (equalCharacteristicThetaSourceUnit u) n).map + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField))).map + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n))) = 0 at hroot + rw [Polynomial.map_map, Polynomial.eval_map, + equalCharacteristicChangedPrimitivePolynomial_eval₂] at hroot + have ht : + ((algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n)).comp + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField))) + (equalCharacteristicChangedLaurentUniformizer F + (equalCharacteristicThetaSourceUnit u)) = + equalCharacteristicChangedCompletedLevelUniformizer F u n := by + rfl + rwa [ht] at hroot + +/-- The root is killed at division level `n + 1`. -/ +theorem equalCharacteristicChangedCompletedPrimitiveRoot_torsion + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + IsEqualCharacteristicLubinTateAmbientTorsion F + (equalCharacteristicChangedCompletedLevelUniformizer F u n) (n + 1) + (equalCharacteristicChangedCompletedPrimitiveRoot F u n) := by + let z := equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicChangedCompletedLevelUniformizer F u n) n + (equalCharacteristicChangedCompletedPrimitiveRoot F u n) + have hz := equalCharacteristicChangedCompletedPrimitiveRoot_equation F u n + change equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicChangedCompletedLevelUniformizer F u n) (n + 1) + (equalCharacteristicChangedCompletedPrimitiveRoot F u n) = 0 + rw [show n + 1 = 1 + n by omega, + equalCharacteristicLubinTateAmbientPiIterate_add, + equalCharacteristicLubinTateAmbientPiIterate_one, + equalCharacteristicLubinTateAmbientPiEnd_apply] + change z ^ Nat.card F.residueField + + equalCharacteristicChangedCompletedLevelUniformizer F u n * z = 0 + have hq : Nat.card F.residueField ≠ 0 := Nat.card_pos.ne' + rw [← pow_sub_one_mul hq, ← add_mul, hz, zero_mul] + +/-- The chosen root is not already a division-level `n` point. -/ +theorem equalCharacteristicChangedCompletedPrimitiveRoot_not_torsion_pred + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + ¬ IsEqualCharacteristicLubinTateAmbientTorsion F + (equalCharacteristicChangedCompletedLevelUniformizer F u n) n + (equalCharacteristicChangedCompletedPrimitiveRoot F u n) := by + intro hpred + have heq := equalCharacteristicChangedCompletedPrimitiveRoot_equation F u n + rw [hpred, zero_pow, zero_add] at heq + · exact equalCharacteristicChangedCompletedLevelUniformizer_ne_zero F u n heq + · exact Nat.sub_ne_zero_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField) + +/-- If `x` is on or outside the unit sphere, the changed Lubin--Tate +endomorphism has the norm of its leading term. -/ +private theorem equalCharacteristicChangedCompletedAmbientPiEnd_norm_of_one_le + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) + (x : equalCharacteristicChangedCompletedLevelField F u n) + (hx : 1 ≤ ‖x‖) : + ‖equalCharacteristicLubinTateAmbientPiEnd F + (equalCharacteristicChangedCompletedLevelUniformizer F u n) x‖ = + ‖x‖ ^ Nat.card F.residueField := by + have hxpos : 0 < ‖x‖ := lt_of_lt_of_le zero_lt_one hx + have hqpos : 0 < Nat.card F.residueField := Nat.card_pos + have hself : ‖x‖ ≤ ‖x‖ ^ Nat.card F.residueField := by + calc + ‖x‖ = 1 * ‖x‖ := (one_mul _).symm + _ ≤ ‖x‖ ^ (Nat.card F.residueField - 1) * ‖x‖ := + mul_le_mul_of_nonneg_right (one_le_pow₀ hx) (norm_nonneg x) + _ = ‖x‖ ^ Nat.card F.residueField := by + rw [← pow_succ, + Nat.sub_add_cancel (Nat.one_le_iff_ne_zero.mpr hqpos.ne')] + have hterms : + ‖equalCharacteristicChangedCompletedLevelUniformizer F u n * x‖ < + ‖x ^ Nat.card F.residueField‖ := by + rw [norm_mul, norm_pow] + calc + ‖equalCharacteristicChangedCompletedLevelUniformizer F u n‖ * ‖x‖ < + 1 * ‖x‖ := + mul_lt_mul_of_pos_right + (equalCharacteristicChangedCompletedLevelUniformizer_norm_lt_one F u n) + hxpos + _ = ‖x‖ := one_mul _ + _ ≤ ‖x‖ ^ Nat.card F.residueField := hself + rw [equalCharacteristicLubinTateAmbientPiEnd_apply, + IsUltrametricDist.norm_add_eq_max_of_norm_ne_norm (ne_of_gt hterms), + max_eq_left hterms.le, norm_pow] + +/-- On or outside the unit sphere, every iterate has the norm of its +leading `q`-power term. -/ +private theorem equalCharacteristicChangedCompletedAmbientPiIterate_norm_of_one_le + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (level i : ℕ) + (x : equalCharacteristicChangedCompletedLevelField F u level) + (hx : 1 ≤ ‖x‖) : + ‖equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicChangedCompletedLevelUniformizer F u level) i x‖ = + ‖x‖ ^ (Nat.card F.residueField ^ i) := by + induction i generalizing x with + | zero => + simp [equalCharacteristicLubinTateAmbientPiIterate_zero] + | succ i ih => + have hend := equalCharacteristicChangedCompletedAmbientPiEnd_norm_of_one_le + F u level x hx + have hnext : 1 ≤ + ‖equalCharacteristicLubinTateAmbientPiEnd F + (equalCharacteristicChangedCompletedLevelUniformizer F u level) x‖ := by + rw [hend] + exact one_le_pow₀ hx + rw [equalCharacteristicLubinTateAmbientPiIterate_succ, + ih _ hnext, hend, ← pow_mul] + congr 1 + rw [pow_succ, Nat.mul_comm] + +/-- The primitive `u⁻¹T`-point lies strictly inside the spectral unit +ball. -/ +theorem equalCharacteristicChangedCompletedPrimitiveRoot_norm_lt_one + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + ‖equalCharacteristicChangedCompletedPrimitiveRoot F u n‖ < 1 := by + by_contra hnot + have hrootge : 1 ≤ + ‖equalCharacteristicChangedCompletedPrimitiveRoot F u n‖ := + le_of_not_gt hnot + let z : equalCharacteristicChangedCompletedLevelField F u n := + equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicChangedCompletedLevelUniformizer F u n) n + (equalCharacteristicChangedCompletedPrimitiveRoot F u n) + have hznorm : ‖z‖ = + ‖equalCharacteristicChangedCompletedPrimitiveRoot F u n‖ ^ + (Nat.card F.residueField ^ n) := + equalCharacteristicChangedCompletedAmbientPiIterate_norm_of_one_le + F u n n (equalCharacteristicChangedCompletedPrimitiveRoot F u n) hrootge + have hzge : 1 ≤ ‖z‖ := by + rw [hznorm] + exact one_le_pow₀ hrootge + have hzpowge : 1 ≤ ‖z ^ (Nat.card F.residueField - 1)‖ := by + rw [norm_pow] + exact one_le_pow₀ hzge + have heq := equalCharacteristicChangedCompletedPrimitiveRoot_equation F u n + change z ^ (Nat.card F.residueField - 1) + + equalCharacteristicChangedCompletedLevelUniformizer F u n = 0 at heq + have hnormeq : ‖z ^ (Nat.card F.residueField - 1)‖ = + ‖equalCharacteristicChangedCompletedLevelUniformizer F u n‖ := by + rw [eq_neg_of_add_eq_zero_left heq, norm_neg] + rw [hnormeq] at hzpowge + exact (not_le_of_gt + (equalCharacteristicChangedCompletedLevelUniformizer_norm_lt_one F u n)) hzpowge + +/-- The changed primitive root as an element of the spectral valuation +ring. -/ +noncomputable def equalCharacteristicChangedCompletedPrimitiveRootInteger + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Valued.integer (equalCharacteristicChangedCompletedLevelField F u n) := + ⟨equalCharacteristicChangedCompletedPrimitiveRoot F u n, by + change ‖equalCharacteristicChangedCompletedPrimitiveRoot F u n‖₊ ≤ 1 + exact_mod_cast + (equalCharacteristicChangedCompletedPrimitiveRoot_norm_lt_one F u n).le⟩ + +/-- Coercing the integral primitive root returns the underlying completed root. -/ +@[simp] +theorem equalCharacteristicChangedCompletedPrimitiveRootInteger_coe + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + ((equalCharacteristicChangedCompletedPrimitiveRootInteger F u n : + Valued.integer + (equalCharacteristicChangedCompletedLevelField F u n)) : + equalCharacteristicChangedCompletedLevelField F u n) = + equalCharacteristicChangedCompletedPrimitiveRoot F u n := + rfl + +/-- The integral primitive point lies in the maximal ideal. -/ +theorem equalCharacteristicChangedCompletedPrimitiveRootInteger_mem_maximalIdeal + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicChangedCompletedPrimitiveRootInteger F u n ∈ + Valued.maximalIdeal + (equalCharacteristicChangedCompletedLevelField F u n) := by + change equalCharacteristicChangedCompletedPrimitiveRootInteger F u n ∈ + IsLocalRing.maximalIdeal + (Valued.integer + (equalCharacteristicChangedCompletedLevelField F u n)) + apply (Valuation.mem_maximalIdeal_iff + (equalCharacteristicChangedCompletedLevelField F u n) + (Valued.v : Valuation + (equalCharacteristicChangedCompletedLevelField F u n) ℝ≥0)).2 + change ‖equalCharacteristicChangedCompletedPrimitiveRoot F u n‖₊ < 1 + exact_mod_cast + equalCharacteristicChangedCompletedPrimitiveRoot_norm_lt_one F u n + +/-- The maximal-ideal primitive point supports convergent power-series +evaluation. -/ +theorem equalCharacteristicChangedCompletedPrimitiveRootInteger_hasEval + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + PowerSeries.HasEval + (equalCharacteristicChangedCompletedPrimitiveRootInteger F u n) := by + change Tendsto + (fun i : ℕ ↦ equalCharacteristicChangedCompletedPrimitiveRootInteger F u n ^ i) + atTop (nhds 0) + apply tendsto_pow_atTop_nhds_zero_of_norm_lt_one + change ‖equalCharacteristicChangedCompletedPrimitiveRoot F u n‖ < 1 + exact equalCharacteristicChangedCompletedPrimitiveRoot_norm_lt_one F u n + +end + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedPrimitiveAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedPrimitiveAction.lean new file mode 100644 index 0000000000..316a33d94d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedPrimitiveAction.lean @@ -0,0 +1,776 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters +/-! +# The completed theta-intertwining theorem: primitive action for the changed completed level + +The theta relation in the completed theta-intertwining theorem uses the source parameter `u⁻¹T`. + We first +prove, genuinely by Eisenstein over `(AlgebraicClosure κ)[[T]]`, that its +primitive polynomial stays irreducible over the completed maximal-unramified +Laurent field. We then enumerate its roots by source Lubin--Tate unit +brackets and show that every such primitive point generates the splitting +field. + +The theta unit `u` and a source Lubin--Tate bracket unit `a` are deliberately +kept as distinct parameters. Repository index `n` is division level `n + 1`. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries Polynomial PowerSeries + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- Coefficient extension makes the completed unramified base an algebra over residue-field +Laurent series for the changed primitive action. -/ +noncomputable local instance equalCharacteristicChangedCompletedPrimitiveActionBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +/-- The image of the source unit `u⁻¹` in +`(AlgebraicClosure κ)[[T]]`. -/ +noncomputable def equalCharacteristicChangedCompletedSourceUnit + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) : + (AlgebraicClosure F.residueField)⟦X⟧ˣ := + Units.map + (PowerSeries.map + (algebraMap F.residueField (AlgebraicClosure F.residueField))) + (equalCharacteristicThetaSourceUnit u) + +/-- The integral primitive polynomial for source parameter `u⁻¹T`, +after coefficientwise extension to `(AlgebraicClosure κ)[[T]]`. -/ +noncomputable def equalCharacteristicChangedCompletedIntegralPrimitivePolynomial + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Polynomial (AlgebraicClosure F.residueField)⟦X⟧ := + (equalCharacteristicChangedIntegralPrimitivePolynomial F + (equalCharacteristicThetaSourceUnit u) n).map + (PowerSeries.map + (algebraMap F.residueField (AlgebraicClosure F.residueField))) + +/-- The changed integral primitive polynomial remains monic after scalar extension. -/ +theorem equalCharacteristicChangedCompletedIntegralPrimitivePolynomial_monic + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedCompletedIntegralPrimitivePolynomial F u n).Monic := + (equalCharacteristicChangedIntegralPrimitivePolynomial_monic F + (equalCharacteristicThetaSourceUnit u) n).map _ + +/-- The completed integral primitive polynomial has degree `(q - 1) * q ^ n`. -/ +theorem equalCharacteristicChangedCompletedIntegralPrimitivePolynomial_natDegree + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedCompletedIntegralPrimitivePolynomial F u n).natDegree = + (Nat.card F.residueField - 1) * Nat.card F.residueField ^ n := by + rw [equalCharacteristicChangedCompletedIntegralPrimitivePolynomial, + (equalCharacteristicChangedIntegralPrimitivePolynomial_monic F + (equalCharacteristicThetaSourceUnit u) n).natDegree_map, + equalCharacteristicChangedIntegralPrimitivePolynomial_natDegree] + +/-- Passage from the changed integral polynomial to Laurent series agrees +with the completed coefficientwise base change. -/ +theorem equalCharacteristicChangedCompletedIntegralPrimitivePolynomial_map + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedCompletedIntegralPrimitivePolynomial F u n).map + (algebraMap (AlgebraicClosure F.residueField)⟦X⟧ + (equalCharacteristicCompletedUnramifiedField F.residueField)) = + equalCharacteristicChangedCompletedPrimitivePolynomial F u n := by + rw [equalCharacteristicChangedCompletedIntegralPrimitivePolynomial, + Polynomial.map_map, + equalCharacteristicPowerSeriesLaurent_baseChange_commutes, + ← Polynomial.map_map] + rfl + +/-- Modulo `T`, the completed changed primitive polynomial is its single +leading monomial. -/ +theorem equalCharacteristicChangedCompletedIntegralPrimitivePolynomial_map_constantCoeff + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedCompletedIntegralPrimitivePolynomial F u n).map + (PowerSeries.constantCoeff + (R := AlgebraicClosure F.residueField)) = + Polynomial.X ^ + ((Nat.card F.residueField - 1) * Nat.card F.residueField ^ n) := by + rw [equalCharacteristicChangedCompletedIntegralPrimitivePolynomial, + Polynomial.map_map] + have hcomp : + (PowerSeries.constantCoeff + (R := AlgebraicClosure F.residueField)).comp + (PowerSeries.map + (algebraMap F.residueField (AlgebraicClosure F.residueField))) = + (algebraMap F.residueField (AlgebraicClosure F.residueField)).comp + (PowerSeries.constantCoeff (R := F.residueField)) := by + ext f + simp only [RingHom.comp_apply, + ← PowerSeries.coeff_zero_eq_constantCoeff_apply, + PowerSeries.coeff_map] + rw [hcomp, ← Polynomial.map_map, + equalCharacteristicChangedIntegralPrimitivePolynomial_map_constantCoeff] + simp + +/-- The constant coefficient is the mapped unit times `T`, rather than +merely `T`; this is the point at which the source `u⁻¹T` matters. -/ +theorem equalCharacteristicChangedCompletedIntegralPrimitivePolynomial_coeff_zero + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedCompletedIntegralPrimitivePolynomial F u n).coeff 0 = + (equalCharacteristicChangedCompletedSourceUnit F u : + (AlgebraicClosure F.residueField)⟦X⟧) * PowerSeries.X := by + rw [equalCharacteristicChangedCompletedIntegralPrimitivePolynomial, + Polynomial.coeff_map, + equalCharacteristicChangedIntegralPrimitivePolynomial_coeff_zero] + simp [equalCharacteristicChangedIntegralUniformizer, + equalCharacteristicChangedCompletedSourceUnit] + +private theorem equalCharacteristicChangedCompletedIntegralUniformizer_notMem_span_X_sq + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) : + (equalCharacteristicChangedCompletedSourceUnit F u : + (AlgebraicClosure F.residueField)⟦X⟧) * PowerSeries.X ∉ + (Ideal.span + ({PowerSeries.X} : + Set (AlgebraicClosure F.residueField)⟦X⟧)) ^ 2 := by + intro h + let a := equalCharacteristicChangedCompletedSourceUnit F u + have hmul := + ((Ideal.span + ({PowerSeries.X} : + Set (AlgebraicClosure F.residueField)⟦X⟧)) ^ 2).mul_mem_left + ((a⁻¹ : (AlgebraicClosure F.residueField)⟦X⟧ˣ) : + (AlgebraicClosure F.residueField)⟦X⟧) h + have hcancel : + ((a⁻¹ : (AlgebraicClosure F.residueField)⟦X⟧ˣ) : + (AlgebraicClosure F.residueField)⟦X⟧) * + ((a : (AlgebraicClosure F.residueField)⟦X⟧) * PowerSeries.X) = + PowerSeries.X := by + rw [← mul_assoc, Units.inv_mul, one_mul] + rw [hcancel] at hmul + exact powerSeries_X_notMem_span_X_sq + (AlgebraicClosure F.residueField) hmul + +/-- The completed integral source polynomial is genuinely Eisenstein at +`(T)`. -/ +theorem equalCharacteristicChangedCompletedIntegralPrimitivePolynomial_isEisensteinAt + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedCompletedIntegralPrimitivePolynomial F u n).IsEisensteinAt + (Ideal.span + ({PowerSeries.X} : + Set (AlgebraicClosure F.residueField)⟦X⟧)) := by + let Q := equalCharacteristicChangedCompletedIntegralPrimitivePolynomial F u n + let d := (Nat.card F.residueField - 1) * Nat.card F.residueField ^ n + have hmonic : Q.Monic := + equalCharacteristicChangedCompletedIntegralPrimitivePolynomial_monic F u n + refine hmonic.isEisensteinAt_of_mem_of_notMem + PowerSeries.span_X_isPrime.ne_top ?_ ?_ + · intro i hi + rw [Ideal.mem_span_singleton, PowerSeries.X_dvd_iff] + have hcoeff : + PowerSeries.constantCoeff + ((equalCharacteristicChangedCompletedIntegralPrimitivePolynomial + F u n).coeff i) = + (Polynomial.X ^ d : + Polynomial (AlgebraicClosure F.residueField)).coeff i := by + simpa only [Polynomial.coeff_map, d] using + congrArg + (fun p : Polynomial (AlgebraicClosure F.residueField) ↦ p.coeff i) + (equalCharacteristicChangedCompletedIntegralPrimitivePolynomial_map_constantCoeff + F u n) + have hid : i < d := by + simpa [Q, d, + equalCharacteristicChangedCompletedIntegralPrimitivePolynomial_natDegree] + using hi + simpa [d, Polynomial.coeff_X_pow, ne_of_lt hid] using hcoeff + · rw [equalCharacteristicChangedCompletedIntegralPrimitivePolynomial_coeff_zero] + exact equalCharacteristicChangedCompletedIntegralUniformizer_notMem_span_X_sq F u + +/-- The completed integral primitive polynomial is irreducible by Eisenstein's criterion. -/ +theorem equalCharacteristicChangedCompletedIntegralPrimitivePolynomial_irreducible + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Irreducible + (equalCharacteristicChangedCompletedIntegralPrimitivePolynomial F u n) := by + apply + (equalCharacteristicChangedCompletedIntegralPrimitivePolynomial_isEisensteinAt + F u n).irreducible + PowerSeries.span_X_isPrime + (equalCharacteristicChangedCompletedIntegralPrimitivePolynomial_monic + F u n).isPrimitive + rw [equalCharacteristicChangedCompletedIntegralPrimitivePolynomial_natDegree] + exact Nat.mul_pos + (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (Nat.pow_pos Nat.card_pos) + +/-- The source primitive polynomial remains irreducible over the completed +maximal-unramified Laurent field. -/ +theorem equalCharacteristicChangedCompletedPrimitivePolynomial_irreducible + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Irreducible (equalCharacteristicChangedCompletedPrimitivePolynomial F u n) := by + have hmap : + Irreducible + ((equalCharacteristicChangedCompletedIntegralPrimitivePolynomial F u n).map + (algebraMap (AlgebraicClosure F.residueField)⟦X⟧ + (equalCharacteristicCompletedUnramifiedField F.residueField))) := + (equalCharacteristicChangedCompletedIntegralPrimitivePolynomial_monic + F u n).irreducible_iff_irreducible_map_fraction_map.mp + (equalCharacteristicChangedCompletedIntegralPrimitivePolynomial_irreducible + F u n) + rwa [equalCharacteristicChangedCompletedIntegralPrimitivePolynomial_map] at hmap + +/-- The coefficientwise Laurent base map into the changed completed level. -/ +noncomputable def equalCharacteristicChangedCompletedLevelBaseHom + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + F.residueField⸨X⸩ →+* + equalCharacteristicChangedCompletedLevelField F u n := + (algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n)).comp + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField)) + +/-- The residue-field coefficient map into the changed completed level. -/ +noncomputable def equalCharacteristicChangedCompletedLevelResidueHom + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + F.residueField →+* + equalCharacteristicChangedCompletedLevelField F u n := + (equalCharacteristicChangedCompletedLevelBaseHom F u n).comp + (algebraMap F.residueField F.residueField⸨X⸩) + +/-- The completed base map sends the changed source uniformizer to the level uniformizer. -/ +@[simp] +theorem equalCharacteristicChangedCompletedLevelBaseHom_sourceUniformizer + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicChangedCompletedLevelBaseHom F u n + (equalCharacteristicChangedLaurentUniformizer F + (equalCharacteristicThetaSourceUnit u)) = + equalCharacteristicChangedCompletedLevelUniformizer F u n := by + rw [equalCharacteristicChangedCompletedLevelBaseHom, RingHom.comp_apply] + rfl + +/-- The chosen changed completed primitive point is nonzero. -/ +theorem equalCharacteristicChangedCompletedPrimitiveRoot_ne_zero + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicChangedCompletedPrimitiveRoot F u n ≠ 0 := by + intro hzero + apply equalCharacteristicChangedCompletedPrimitiveRoot_not_torsion_pred F u n + change equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicChangedCompletedLevelUniformizer F u n) n + (equalCharacteristicChangedCompletedPrimitiveRoot F u n) = 0 + rw [hzero, map_zero] + +/-- The source LT bracket image attached to a bracket unit `a`. The theta +unit is the separate parameter `u`. -/ +noncomputable def equalCharacteristicChangedCompletedUnitRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) + (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicChangedCompletedLevelField F u n := + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicChangedCompletedLevelResidueHom F u n) + (equalCharacteristicChangedCompletedLevelUniformizer F u n) (n + 1) + (a : F.residueField⟦X⟧) + (equalCharacteristicChangedCompletedPrimitiveRoot F u n) + +private theorem equalCharacteristicChangedActionPiPolynomial_eval₂ + (F : LocalField.{u, v} K) + (u : F.residueField⟦X⟧ˣ) + {A : Type*} [Field A] [CharP A F.residueCharacteristic] + (f : F.residueField⸨X⸩ →+* A) (x : A) : + Polynomial.eval₂ f x + (equalCharacteristicChangedPiPolynomial F + (equalCharacteristicThetaSourceUnit u)) = + equalCharacteristicLubinTateAmbientPiEnd F + (f (equalCharacteristicChangedLaurentUniformizer F + (equalCharacteristicThetaSourceUnit u))) x := by + rw [equalCharacteristicChangedPiPolynomial_eq] + simp [equalCharacteristicLubinTateAmbientPiEnd_apply] + +private theorem equalCharacteristicChangedActionPiPolynomialIterate_eval₂ + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) + {A : Type*} [Field A] [CharP A F.residueCharacteristic] + (f : F.residueField⸨X⸩ →+* A) (n : ℕ) (x : A) : + Polynomial.eval₂ f x + (equalCharacteristicChangedPiPolynomialIterate F + (equalCharacteristicThetaSourceUnit u) n) = + equalCharacteristicLubinTateAmbientPiIterate F + (f (equalCharacteristicChangedLaurentUniformizer F + (equalCharacteristicThetaSourceUnit u))) n x := by + have hfun : + (fun y : A ↦ Polynomial.eval₂ f y + (equalCharacteristicChangedPiPolynomial F + (equalCharacteristicThetaSourceUnit u))) = + (fun y : A ↦ equalCharacteristicLubinTateAmbientPiEnd F + (f (equalCharacteristicChangedLaurentUniformizer F + (equalCharacteristicThetaSourceUnit u))) y) := by + funext y + exact equalCharacteristicChangedActionPiPolynomial_eval₂ F u f y + calc + Polynomial.eval₂ f x + (equalCharacteristicChangedPiPolynomialIterate F + (equalCharacteristicThetaSourceUnit u) n) = + (fun y : A ↦ Polynomial.eval₂ f y + (equalCharacteristicChangedPiPolynomial F + (equalCharacteristicThetaSourceUnit u)))^[n] x := by + rw [equalCharacteristicChangedPiPolynomialIterate, + Polynomial.iterate_comp_eval₂, Polynomial.eval₂_X] + _ = (fun y : A ↦ equalCharacteristicLubinTateAmbientPiEnd F + (f (equalCharacteristicChangedLaurentUniformizer F + (equalCharacteristicThetaSourceUnit u))) y)^[n] x := by + exact congrArg (fun g : A → A ↦ g^[n] x) hfun + _ = equalCharacteristicLubinTateAmbientPiIterate F + (f (equalCharacteristicChangedLaurentUniformizer F + (equalCharacteristicThetaSourceUnit u))) n x := + (equalCharacteristicLubinTateAmbientPiIterate_eq_function_iterate F + (f (equalCharacteristicChangedLaurentUniformizer F + (equalCharacteristicThetaSourceUnit u))) n x).symm + +private theorem equalCharacteristicChangedActionPrimitivePolynomial_eval₂ + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) + {A : Type*} [Field A] [CharP A F.residueCharacteristic] + (f : F.residueField⸨X⸩ →+* A) (n : ℕ) (x : A) : + Polynomial.eval₂ f x + (equalCharacteristicChangedPrimitivePolynomial F + (equalCharacteristicThetaSourceUnit u) n) = + equalCharacteristicLubinTateAmbientPiIterate F + (f (equalCharacteristicChangedLaurentUniformizer F + (equalCharacteristicThetaSourceUnit u))) n x ^ + (Nat.card F.residueField - 1) + + f (equalCharacteristicChangedLaurentUniformizer F + (equalCharacteristicThetaSourceUnit u)) := by + rw [equalCharacteristicChangedPrimitivePolynomial_eq, + Polynomial.eval₂_add, Polynomial.eval₂_pow, + equalCharacteristicChangedActionPiPolynomialIterate_eval₂, + Polynomial.eval₂_C] + +/-- Every source LT unit bracket of the chosen point is again a root of the +completed source primitive polynomial. -/ +theorem equalCharacteristicChangedCompletedUnitRoot_isRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) + (a : F.residueField⟦X⟧ˣ) : + ((equalCharacteristicChangedCompletedPrimitivePolynomial F u n).map + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n))).IsRoot + (equalCharacteristicChangedCompletedUnitRoot F u n a) := by + let z := equalCharacteristicChangedCompletedUnitRoot F u n a + let x := equalCharacteristicChangedCompletedPrimitiveRoot F u n + let t := equalCharacteristicChangedCompletedLevelUniformizer F u n + let ι := equalCharacteristicChangedCompletedLevelResidueHom F u n + let c := PowerSeries.coeff 0 (a : F.residueField⟦X⟧) + have hc : c ≠ 0 := powerSeries_unit_coeff_zero_ne_zero a + have hcpow : c ^ (Nat.card F.residueField - 1) = 1 := by + let := Fintype.ofFinite F.residueField + simpa only [Nat.card_eq_fintype_card] using + FiniteField.pow_card_sub_one_eq_one c hc + have hziterate : + equalCharacteristicLubinTateAmbientPiIterate F t n z = + ι c * equalCharacteristicLubinTateAmbientPiIterate F t n x := by + simpa [z, x, t, ι, c, equalCharacteristicChangedCompletedUnitRoot] using + equalCharacteristicLubinTateAmbientPrimitive_iterate_bracket F + (equalCharacteristicChangedCompletedLevelResidueHom F u n) + (equalCharacteristicChangedCompletedLevelUniformizer F u n) n + (a : F.residueField⟦X⟧) + (equalCharacteristicChangedCompletedPrimitiveRoot F u n) + (equalCharacteristicChangedCompletedPrimitiveRoot_torsion F u n) + have hxEquation := + equalCharacteristicChangedCompletedPrimitiveRoot_equation F u n + have hzEquation : + equalCharacteristicLubinTateAmbientPiIterate F t n z ^ + (Nat.card F.residueField - 1) + t = 0 := by + rw [hziterate, mul_pow, ← map_pow, hcpow, map_one, one_mul] + exact hxEquation + change Polynomial.eval z + ((equalCharacteristicChangedCompletedPrimitivePolynomial F u n).map + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n))) = 0 + unfold equalCharacteristicChangedCompletedPrimitivePolynomial + rw [Polynomial.eval_map, Polynomial.eval₂_map, + equalCharacteristicChangedActionPrimitivePolynomial_eval₂] + have ht : + ((algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n)).comp + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField))) + (equalCharacteristicChangedLaurentUniformizer F + (equalCharacteristicThetaSourceUnit u)) = + equalCharacteristicChangedCompletedLevelUniformizer F u n := by + rfl + rw [ht] + exact hzEquation + +/-- A source LT bracket is a polynomial expression in its input over the +completed-unramified base. -/ +theorem equalCharacteristicChangedCompletedAmbientBracket_mem_adjoin + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n m : ℕ) + (a : F.residueField⟦X⟧) + (z : equalCharacteristicChangedCompletedLevelField F u n) : + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicChangedCompletedLevelResidueHom F u n) + (equalCharacteristicChangedCompletedLevelUniformizer F u n) m a z ∈ + Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ({z} : Set (equalCharacteristicChangedCompletedLevelField F u n)) := by + let A := equalCharacteristicCompletedUnramifiedField F.residueField + let E := equalCharacteristicChangedCompletedLevelField F u n + let t : E := equalCharacteristicChangedCompletedLevelUniformizer F u n + let S : Subalgebra A E := Algebra.adjoin A ({z} : Set E) + have hz : z ∈ S := Algebra.subset_adjoin (Set.mem_singleton z) + have ht : t ∈ S := by + change algebraMap A E + (equalCharacteristicChangedCompletedBaseUniformizer F u) ∈ S + exact S.algebraMap_mem _ + have hcoeff (c : F.residueField) : + equalCharacteristicChangedCompletedLevelResidueHom F u n c ∈ S := by + rw [equalCharacteristicChangedCompletedLevelResidueHom, RingHom.comp_apply, + equalCharacteristicChangedCompletedLevelBaseHom, RingHom.comp_apply] + exact S.algebraMap_mem _ + have hiterate (i : ℕ) : + equalCharacteristicLubinTateAmbientPiIterate F t i z ∈ S := by + induction i with + | zero => + simpa [equalCharacteristicLubinTateAmbientPiIterate_zero] using hz + | succ i ih => + rw [equalCharacteristicLubinTateAmbientPiIterate_succ, + ← equalCharacteristicLubinTateAmbientPiEnd_iterate, + equalCharacteristicLubinTateAmbientPiEnd_apply] + exact S.add_mem (S.pow_mem ih _) (S.mul_mem ht ih) + rw [equalCharacteristicLubinTateAmbientBracket_apply] + exact S.sum_mem fun i _ ↦ S.mul_mem (hcoeff _) (hiterate i) + +/-- The visible source unit parameter root. -/ +noncomputable def equalCharacteristicChangedCompletedUnitParameterRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) + (a : equalCharacteristicLubinTateUnitParameter F n) : + equalCharacteristicChangedCompletedLevelField F u n := + equalCharacteristicChangedCompletedUnitRoot F u n + (equalCharacteristicLubinTateUnitParameterUnit F n a) + +/-- Distinct visible source unit parameters give distinct roots. -/ +theorem equalCharacteristicChangedCompletedUnitParameterRoot_injective + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Function.Injective + (equalCharacteristicChangedCompletedUnitParameterRoot F u n) := by + intro a b hab + apply equalCharacteristicLubinTateUnitParameter_eq_of_coeff_eq F n a b + exact equalCharacteristicLubinTateAmbientPrimitive_bracket_eq_coeff F + (equalCharacteristicChangedCompletedLevelResidueHom F u n) + (equalCharacteristicChangedCompletedLevelUniformizer F u n) n + (equalCharacteristicChangedCompletedPrimitiveRoot F u n) + (equalCharacteristicChangedCompletedPrimitiveRoot_torsion F u n) + (equalCharacteristicChangedCompletedPrimitiveRoot_not_torsion_pred F u n) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (equalCharacteristicLubinTateUnitParameterSeries F n b) hab + +/-- Each unit parameter produces a root of the changed completed primitive polynomial. -/ +theorem equalCharacteristicChangedCompletedUnitParameterRoot_isRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) + (a : equalCharacteristicLubinTateUnitParameter F n) : + ((equalCharacteristicChangedCompletedPrimitivePolynomial F u n).map + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n))).IsRoot + (equalCharacteristicChangedCompletedUnitParameterRoot F u n a) := by + simpa [equalCharacteristicChangedCompletedUnitParameterRoot] using + equalCharacteristicChangedCompletedUnitRoot_isRoot F u n + (equalCharacteristicLubinTateUnitParameterUnit F n a) + +/-- The completed source primitive polynomial is separable. -/ +theorem equalCharacteristicChangedCompletedPrimitivePolynomial_separable + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedCompletedPrimitivePolynomial F u n).Separable := by + unfold equalCharacteristicChangedCompletedPrimitivePolynomial + exact (equalCharacteristicChangedPrimitivePolynomial_separable F + (equalCharacteristicThetaSourceUnit u) n).map + +/-- A visible source unit parameter as an element of the full root set. -/ +noncomputable def equalCharacteristicChangedCompletedUnitParameterRootSet + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) + (a : equalCharacteristicLubinTateUnitParameter F n) : + (equalCharacteristicChangedCompletedPrimitivePolynomial F u n).rootSet + (equalCharacteristicChangedCompletedLevelField F u n) := + ⟨equalCharacteristicChangedCompletedUnitParameterRoot F u n a, + Polynomial.mem_rootSet.mpr + ⟨(equalCharacteristicChangedCompletedPrimitivePolynomial_monic F u n).ne_zero, + by + rw [Polynomial.aeval_def, ← Polynomial.eval_map] + exact equalCharacteristicChangedCompletedUnitParameterRoot_isRoot F u n a⟩⟩ + +/-- Distinct unit parameters give distinct completed primitive roots. -/ +theorem equalCharacteristicChangedCompletedUnitParameterRootSet_injective + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Function.Injective + (equalCharacteristicChangedCompletedUnitParameterRootSet F u n) := by + intro a b hab + apply equalCharacteristicChangedCompletedUnitParameterRoot_injective F u n + exact congrArg Subtype.val hab + +/-- The completed changed primitive polynomial has the expected number of +roots in its splitting field. -/ +theorem equalCharacteristicChangedCompletedPrimitiveRootSet_natCard + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Nat.card + ((equalCharacteristicChangedCompletedPrimitivePolynomial F u n).rootSet + (equalCharacteristicChangedCompletedLevelField F u n)) = + (Nat.card F.residueField - 1) * Nat.card F.residueField ^ n := by + rw [Nat.card_eq_fintype_card, + Polynomial.card_rootSet_eq_natDegree + (equalCharacteristicChangedCompletedPrimitivePolynomial_separable F u n) + (equalCharacteristicChangedCompletedPrimitivePolynomial_splits F u n), + equalCharacteristicChangedCompletedPrimitivePolynomial_natDegree] + +/-- Visible source LT unit parameters enumerate every primitive root. -/ +theorem equalCharacteristicChangedCompletedUnitParameterRootSet_bijective + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Function.Bijective + (equalCharacteristicChangedCompletedUnitParameterRootSet F u n) := by + apply (Nat.bijective_iff_injective_and_card + (equalCharacteristicChangedCompletedUnitParameterRootSet F u n)).mpr + exact + ⟨equalCharacteristicChangedCompletedUnitParameterRootSet_injective F u n, + (equalCharacteristicLubinTateUnitParameter_natCard F n).trans + (equalCharacteristicChangedCompletedPrimitiveRootSet_natCard F u n).symm⟩ + +/-- Every visible parameter root is a source bracket polynomial in the +chosen primitive point. -/ +theorem equalCharacteristicChangedCompletedUnitParameterRoot_mem_adjoin + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) + (a : equalCharacteristicLubinTateUnitParameter F n) : + equalCharacteristicChangedCompletedUnitParameterRoot F u n a ∈ + Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ({equalCharacteristicChangedCompletedPrimitiveRoot F u n} : + Set (equalCharacteristicChangedCompletedLevelField F u n)) := by + let A := equalCharacteristicCompletedUnramifiedField F.residueField + let E := equalCharacteristicChangedCompletedLevelField F u n + let x : E := equalCharacteristicChangedCompletedPrimitiveRoot F u n + let t : E := equalCharacteristicChangedCompletedLevelUniformizer F u n + let S : Subalgebra A E := Algebra.adjoin A ({x} : Set E) + have hx : x ∈ S := Algebra.subset_adjoin (Set.mem_singleton x) + have ht : t ∈ S := by + change algebraMap A E + (equalCharacteristicChangedCompletedBaseUniformizer F u) ∈ S + exact S.algebraMap_mem _ + have hcoeff (c : F.residueField) : + equalCharacteristicChangedCompletedLevelResidueHom F u n c ∈ S := by + rw [equalCharacteristicChangedCompletedLevelResidueHom, RingHom.comp_apply, + equalCharacteristicChangedCompletedLevelBaseHom, RingHom.comp_apply] + exact S.algebraMap_mem _ + have hiterate (i : ℕ) : + equalCharacteristicLubinTateAmbientPiIterate F t i x ∈ S := by + induction i with + | zero => + simpa [equalCharacteristicLubinTateAmbientPiIterate_zero] using hx + | succ i ih => + rw [equalCharacteristicLubinTateAmbientPiIterate_succ, + ← equalCharacteristicLubinTateAmbientPiEnd_iterate, + equalCharacteristicLubinTateAmbientPiEnd_apply] + exact S.add_mem (S.pow_mem ih _) (S.mul_mem ht ih) + change equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicChangedCompletedLevelResidueHom F u n) t (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) x ∈ S + rw [equalCharacteristicLubinTateAmbientBracket_apply] + exact S.sum_mem fun i _ ↦ S.mul_mem (hcoeff _) (hiterate i) + +/-- Every root lies in the subfield generated by the chosen primitive +point. -/ +theorem equalCharacteristicChangedCompletedPrimitiveRootSet_subset_adjoin + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + ((equalCharacteristicChangedCompletedPrimitivePolynomial F u n).rootSet + (equalCharacteristicChangedCompletedLevelField F u n) : + Set (equalCharacteristicChangedCompletedLevelField F u n)) ⊆ + Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ({equalCharacteristicChangedCompletedPrimitiveRoot F u n} : + Set (equalCharacteristicChangedCompletedLevelField F u n)) := by + intro y hy + let yroot := + (show (equalCharacteristicChangedCompletedPrimitivePolynomial F u n).rootSet + (equalCharacteristicChangedCompletedLevelField F u n) from ⟨y, hy⟩) + obtain ⟨a, ha⟩ := + (equalCharacteristicChangedCompletedUnitParameterRootSet_bijective + F u n).surjective yroot + have hay : equalCharacteristicChangedCompletedUnitParameterRoot F u n a = y := + congrArg Subtype.val ha + rw [← hay] + exact equalCharacteristicChangedCompletedUnitParameterRoot_mem_adjoin F u n a + +/-- The chosen primitive source point generates its completed splitting +field. -/ +theorem equalCharacteristicChangedCompletedPrimitiveRoot_adjoin_eq_top + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ({equalCharacteristicChangedCompletedPrimitiveRoot F u n} : + Set (equalCharacteristicChangedCompletedLevelField F u n)) = ⊤ := by + have hall : + Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ((equalCharacteristicChangedCompletedPrimitivePolynomial F u n).rootSet + (equalCharacteristicChangedCompletedLevelField F u n) : + Set (equalCharacteristicChangedCompletedLevelField F u n)) ≤ + Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ({equalCharacteristicChangedCompletedPrimitiveRoot F u n} : + Set (equalCharacteristicChangedCompletedLevelField F u n)) := + Algebra.adjoin_le + (equalCharacteristicChangedCompletedPrimitiveRootSet_subset_adjoin F u n) + rw [equalCharacteristicChangedCompletedPrimitivePolynomial_adjoin_rootSet] at hall + exact top_unique hall + +/-- Every source LT unit bracket of the primitive point is itself a +primitive generator of the completed level field. -/ +theorem equalCharacteristicChangedCompletedUnitRoot_adjoin_eq_top + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) + (a : F.residueField⟦X⟧ˣ) : + Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ({equalCharacteristicChangedCompletedUnitRoot F u n a} : + Set (equalCharacteristicChangedCompletedLevelField F u n)) = ⊤ := by + let x := equalCharacteristicChangedCompletedPrimitiveRoot F u n + let y := equalCharacteristicChangedCompletedUnitRoot F u n a + let ι := equalCharacteristicChangedCompletedLevelResidueHom F u n + let t := equalCharacteristicChangedCompletedLevelUniformizer F u n + have hrecover : + equalCharacteristicLubinTateAmbientBracket F ι t (n + 1) + ((a⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) y = x := by + change equalCharacteristicLubinTateAmbientBracket F ι t (n + 1) + ((a⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) + (equalCharacteristicLubinTateAmbientBracket F ι t (n + 1) + (a : F.residueField⟦X⟧) x) = x + rw [← equalCharacteristicLubinTateAmbientBracket_mul_apply_of_torsion + F ι t (n + 1) + ((a⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) + (a : F.residueField⟦X⟧) x + (equalCharacteristicChangedCompletedPrimitiveRoot_torsion F u n)] + have hmul : + ((a⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) * + (a : F.residueField⟦X⟧) = 1 := by + exact Units.inv_mul a + rw [hmul] + simp [equalCharacteristicLubinTateAmbientBracket_apply] + have hxmem : + x ∈ Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ({y} : Set (equalCharacteristicChangedCompletedLevelField F u n)) := by + rw [← hrecover] + exact equalCharacteristicChangedCompletedAmbientBracket_mem_adjoin + F u n (n + 1) + ((a⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) y + have hle : + Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ({x} : Set (equalCharacteristicChangedCompletedLevelField F u n)) ≤ + Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ({y} : Set (equalCharacteristicChangedCompletedLevelField F u n)) := by + apply Algebra.adjoin_le + intro z hz + simpa only [Set.mem_singleton_iff] using hz ▸ hxmem + rw [show Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ({x} : Set (equalCharacteristicChangedCompletedLevelField F u n)) = ⊤ by + simpa [x] using + equalCharacteristicChangedCompletedPrimitiveRoot_adjoin_eq_top F u n] + at hle + exact top_unique hle + +/-- The chosen changed primitive point is integral over the completed +maximal-unramified base. -/ +theorem equalCharacteristicChangedCompletedPrimitiveRoot_isIntegral + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + IsIntegral + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedPrimitiveRoot F u n) := by + refine ⟨equalCharacteristicChangedCompletedPrimitivePolynomial F u n, + equalCharacteristicChangedCompletedPrimitivePolynomial_monic F u n, ?_⟩ + rw [← Polynomial.eval_map] + exact equalCharacteristicChangedCompletedPrimitiveRoot_isRoot F u n + +/-- The completed source primitive polynomial is the minimal polynomial of +the chosen primitive point. -/ +theorem equalCharacteristicChangedCompletedPrimitiveRoot_minpoly + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + minpoly (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedPrimitiveRoot F u n) = + equalCharacteristicChangedCompletedPrimitivePolynomial F u n := by + have hroot : + Polynomial.aeval (equalCharacteristicChangedCompletedPrimitiveRoot F u n) + (equalCharacteristicChangedCompletedPrimitivePolynomial F u n) = 0 := by + rw [Polynomial.aeval_def, ← Polynomial.eval_map] + exact equalCharacteristicChangedCompletedPrimitiveRoot_isRoot F u n + have hmin := minpoly.eq_of_irreducible + (equalCharacteristicChangedCompletedPrimitivePolynomial_irreducible F u n) + hroot + rw [(equalCharacteristicChangedCompletedPrimitivePolynomial_monic F u n).leadingCoeff, + inv_one, Polynomial.C_1, mul_one] at hmin + exact hmin.symm + +/-- The power basis generated by the completed primitive source point. -/ +noncomputable def equalCharacteristicChangedCompletedPrimitivePowerBasis + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + PowerBasis + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicChangedCompletedLevelField F u n) := + PowerBasis.ofAdjoinEqTop + (equalCharacteristicChangedCompletedPrimitiveRoot_isIntegral F u n) + (equalCharacteristicChangedCompletedPrimitiveRoot_adjoin_eq_top F u n) + +/-- The completed primitive power basis has the distinguished root as generator. -/ +@[simp] +theorem equalCharacteristicChangedCompletedPrimitivePowerBasis_gen + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedCompletedPrimitivePowerBasis F u n).gen = + equalCharacteristicChangedCompletedPrimitiveRoot F u n := + PowerBasis.ofAdjoinEqTop_gen _ _ + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedPolynomialEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedPolynomialEvaluation.lean new file mode 100644 index 0000000000..0f26141e3e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedPolynomialEvaluation.lean @@ -0,0 +1,140 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer +/-! +# The completed theta-intertwining theorem: evaluation of changed Lubin--Tate polynomials + +This small interface identifies the changed polynomials over `k((T))` +with their ambient Lubin--Tate endomorphisms. Keeping the evaluation layer +separate avoids rebuilding the larger algebraic changed-uniformizer +construction when it is used at completed points. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries PowerSeries Polynomial + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- Evaluation of the changed Lubin--Tate polynomial in any compatible +ambient field is the corresponding distinguished endomorphism. -/ +theorem equalCharacteristicChangedPiPolynomial_eval₂ + (F : LocalField.{u, v} K) + (a : F.residueField⟦X⟧ˣ) + {A : Type*} [Field A] [CharP A F.residueCharacteristic] + (φ : F.residueField⸨X⸩ →+* A) (x : A) : + Polynomial.eval₂ φ x (equalCharacteristicChangedPiPolynomial F a) = + equalCharacteristicLubinTateAmbientPiEnd F + (φ (equalCharacteristicChangedLaurentUniformizer F a)) x := by + rw [equalCharacteristicChangedPiPolynomial_eq] + simp [equalCharacteristicLubinTateAmbientPiEnd_apply] + +/-- Evaluation commutes with every compositional iterate of the changed +Lubin--Tate polynomial. -/ +theorem equalCharacteristicChangedPiPolynomialIterate_eval₂ + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) + {A : Type*} [Field A] [CharP A F.residueCharacteristic] + (φ : F.residueField⸨X⸩ →+* A) (n : ℕ) (x : A) : + Polynomial.eval₂ φ x + (equalCharacteristicChangedPiPolynomialIterate F a n) = + equalCharacteristicLubinTateAmbientPiIterate F + (φ (equalCharacteristicChangedLaurentUniformizer F a)) n x := by + have hfun : + (fun y : A ↦ Polynomial.eval₂ φ y + (equalCharacteristicChangedPiPolynomial F a)) = + (fun y : A ↦ equalCharacteristicLubinTateAmbientPiEnd F + (φ (equalCharacteristicChangedLaurentUniformizer F a)) y) := by + funext y + exact equalCharacteristicChangedPiPolynomial_eval₂ F a φ y + calc + Polynomial.eval₂ φ x + (equalCharacteristicChangedPiPolynomialIterate F a n) = + (fun y : A ↦ Polynomial.eval₂ φ y + (equalCharacteristicChangedPiPolynomial F a))^[n] x := by + rw [equalCharacteristicChangedPiPolynomialIterate, + Polynomial.iterate_comp_eval₂, Polynomial.eval₂_X] + _ = (fun y : A ↦ equalCharacteristicLubinTateAmbientPiEnd F + (φ (equalCharacteristicChangedLaurentUniformizer F a)) y)^[n] x := by + exact congrArg (fun f : A → A ↦ f^[n] x) hfun + _ = equalCharacteristicLubinTateAmbientPiIterate F + (φ (equalCharacteristicChangedLaurentUniformizer F a)) n x := + (equalCharacteristicLubinTateAmbientPiIterate_eq_function_iterate F + (φ (equalCharacteristicChangedLaurentUniformizer F a)) n x).symm + +/-- The changed primitive polynomial evaluates to the defining primitive +Lubin--Tate equation in every compatible ambient field. -/ +theorem equalCharacteristicChangedPrimitivePolynomial_eval₂ + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) + {A : Type*} [Field A] [CharP A F.residueCharacteristic] + (φ : F.residueField⸨X⸩ →+* A) (n : ℕ) (x : A) : + Polynomial.eval₂ φ x + (equalCharacteristicChangedPrimitivePolynomial F a n) = + equalCharacteristicLubinTateAmbientPiIterate F + (φ (equalCharacteristicChangedLaurentUniformizer F a)) n x ^ + (Nat.card F.residueField - 1) + + φ (equalCharacteristicChangedLaurentUniformizer F a) := by + rw [equalCharacteristicChangedPrimitivePolynomial_eq, + Polynomial.eval₂_add, Polynomial.eval₂_pow, + equalCharacteristicChangedPiPolynomialIterate_eval₂, + Polynomial.eval₂_C] + +/-- A point killed exactly at division level `n + 1` is a root of the changed +primitive polynomial indexed by `n`. -/ +theorem equalCharacteristicChangedPrimitivePolynomial_isRoot_of_primitive + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) + {A : Type*} [Field A] [CharP A F.residueCharacteristic] + (φ : F.residueField⸨X⸩ →+* A) (n : ℕ) (x : A) + (htors : IsEqualCharacteristicLubinTateAmbientTorsion F + (φ (equalCharacteristicChangedLaurentUniformizer F a)) (n + 1) x) + (hprimitive : ¬ IsEqualCharacteristicLubinTateAmbientTorsion F + (φ (equalCharacteristicChangedLaurentUniformizer F a)) n x) : + ((equalCharacteristicChangedPrimitivePolynomial F a n).map φ).IsRoot x := by + let t := φ (equalCharacteristicChangedLaurentUniformizer F a) + let z := equalCharacteristicLubinTateAmbientPiIterate F t n x + have hz : z ≠ 0 := hprimitive + have hend : equalCharacteristicLubinTateAmbientPiEnd F t z = 0 := by + rw [show equalCharacteristicLubinTateAmbientPiEnd F t z = + equalCharacteristicLubinTateAmbientPiIterate F t (1 + n) x by + rw [equalCharacteristicLubinTateAmbientPiIterate_add, + equalCharacteristicLubinTateAmbientPiIterate_one]] + rw [Nat.add_comm 1 n] + exact htors + have hfactor : z * (z ^ (Nat.card F.residueField - 1) + t) = 0 := by + rw [equalCharacteristicLubinTateAmbientPiEnd_apply] at hend + rw [mul_add, mul_comm z t, ← pow_succ'] + rw [Nat.sub_add_cancel + (Nat.one_le_iff_ne_zero.mpr Nat.card_pos.ne')] + exact hend + have hequation : z ^ (Nat.card F.residueField - 1) + t = 0 := + (mul_eq_zero.mp hfactor).resolve_left hz + change Polynomial.eval x + ((equalCharacteristicChangedPrimitivePolynomial F a n).map φ) = 0 + rw [Polynomial.eval_map, + equalCharacteristicChangedPrimitivePolynomial_eval₂] + exact hequation + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizer.lean new file mode 100644 index 0000000000..9e06a45b58 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizer.lean @@ -0,0 +1,686 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer +public import Mathlib.FieldTheory.IsSepClosed +/-! +# The completed theta-intertwining theorem: changing the equal-characteristic uniformizer + +If `u` is a unit of `κ[[T]]`, then `uT` is again a uniformizer. This file +repeats the mechanical part of the Lubin--Tate construction with + +`P_{uT}(Y) = Y^q + uT Y`. + +The primitive level polynomial is monic and Eisenstein at `(T)`, hence +irreducible over `κ((T))`; its simple root extension has degree +`(q - 1)q^n`, and the norm of the negative generator is exactly `uT`. +This is the changed-uniformizer algebra used in the proof of the completed theta-intertwining + theorem. +-/ + +@[expose] public section + +noncomputable +section + + +open scoped PowerSeries LaurentSeries Polynomial + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The changed integral uniformizer `uT`, for `u ∈ κ[[T]]ˣ`. -/ +noncomputable def equalCharacteristicChangedIntegralUniformizer + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) : + F.residueField⟦X⟧ := + (a : F.residueField⟦X⟧) * PowerSeries.X + +/-- The changed uniformizer `uT` in `κ((T))`. -/ +noncomputable def equalCharacteristicChangedLaurentUniformizer + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) : + F.residueField⸨X⸩ := + algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩ + (equalCharacteristicChangedIntegralUniformizer F a) + +/-- The Laurent-series unit corresponding to the integral unit `a`. -/ +noncomputable def equalCharacteristicChangedLaurentUnit + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) : + F.residueField⸨X⸩ˣ := + Units.map (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩) a + +/-- The changed parameter really is the changed parameter `uT`. -/ +theorem equalCharacteristicChangedLaurentUniformizer_eq_unit_mul + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicChangedLaurentUniformizer F a = + (equalCharacteristicChangedLaurentUnit F a : F.residueField⸨X⸩) * + equalCharacteristicLaurentUniformizer F := by + simp [equalCharacteristicChangedLaurentUniformizer, + equalCharacteristicChangedIntegralUniformizer, + equalCharacteristicChangedLaurentUnit, + equalCharacteristicLaurentUniformizer] + +/-- Changing the Laurent uniformizer by the unit one leaves it unchanged. -/ +@[simp] +theorem equalCharacteristicChangedLaurentUniformizer_one + (F : LocalField.{u, v} K) : + equalCharacteristicChangedLaurentUniformizer F 1 = + equalCharacteristicLaurentUniformizer F := by + simp [equalCharacteristicChangedLaurentUniformizer_eq_unit_mul, + equalCharacteristicChangedLaurentUnit] + +/-- A unit multiple of the integral uniformizer is nonzero. -/ +theorem equalCharacteristicChangedIntegralUniformizer_ne_zero + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicChangedIntegralUniformizer F a ≠ 0 := by + exact mul_ne_zero a.ne_zero PowerSeries.X_ne_zero + +/-- The changed Laurent uniformizer is nonzero. -/ +theorem equalCharacteristicChangedLaurentUniformizer_ne_zero + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicChangedLaurentUniformizer F a ≠ 0 := by + rw [equalCharacteristicChangedLaurentUniformizer] + intro h + apply equalCharacteristicChangedIntegralUniformizer_ne_zero F a + apply HahnSeries.ofPowerSeries_injective (Γ := ℤ) (R := F.residueField) + rw [map_zero] + change (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩) + (equalCharacteristicChangedIntegralUniformizer F a) = 0 + exact h + +/-- The integral Lubin--Tate polynomial attached to `uT`. -/ +noncomputable def equalCharacteristicChangedIntegralPiPolynomial + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) : + Polynomial F.residueField⟦X⟧ := + Polynomial.X ^ Nat.card F.residueField + + Polynomial.C (equalCharacteristicChangedIntegralUniformizer F a) * + Polynomial.X + +/-- The changed integral `π`-polynomial is monic. -/ +theorem equalCharacteristicChangedIntegralPiPolynomial_monic + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) : + (equalCharacteristicChangedIntegralPiPolynomial F a).Monic := by + rw [equalCharacteristicChangedIntegralPiPolynomial] + refine (Polynomial.monic_X_pow _).add_of_left ?_ + rw [Polynomial.degree_C_mul_X + (equalCharacteristicChangedIntegralUniformizer_ne_zero F a), + Polynomial.degree_X_pow] + exact_mod_cast (Finite.one_lt_card : 1 < Nat.card F.residueField) + +/-- The changed integral `π`-polynomial has degree equal to the residue-field cardinality. -/ +theorem equalCharacteristicChangedIntegralPiPolynomial_natDegree + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) : + (equalCharacteristicChangedIntegralPiPolynomial F a).natDegree = + Nat.card F.residueField := by + rw [equalCharacteristicChangedIntegralPiPolynomial, + Polynomial.natDegree_add_eq_left_of_natDegree_lt] + · exact Polynomial.natDegree_X_pow _ + · rw [Polynomial.natDegree_X_pow, + Polynomial.natDegree_C_mul_X _ + (equalCharacteristicChangedIntegralUniformizer_ne_zero F a)] + exact (Finite.one_lt_card : 1 < Nat.card F.residueField) + +/-- The compositional iterate of `P_{uT}` over `κ[[T]]`. -/ +noncomputable def equalCharacteristicChangedIntegralPiPolynomialIterate + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + Polynomial F.residueField⟦X⟧ := + (equalCharacteristicChangedIntegralPiPolynomial F a).comp^[n] Polynomial.X + +/-- The `n`-fold changed integral `π`-polynomial has degree `q ^ n`. -/ +theorem equalCharacteristicChangedIntegralPiPolynomialIterate_natDegree + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedIntegralPiPolynomialIterate F a n).natDegree = + Nat.card F.residueField ^ n := by + rw [equalCharacteristicChangedIntegralPiPolynomialIterate, + Polynomial.natDegree_iterate_comp, + equalCharacteristicChangedIntegralPiPolynomial_natDegree, + Polynomial.natDegree_X, mul_one] + +/-- The successor iterate is obtained by one more composition with the changed `π`-polynomial. -/ +theorem equalCharacteristicChangedIntegralPiPolynomialIterate_succ + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicChangedIntegralPiPolynomialIterate F a (n + 1) = + (equalCharacteristicChangedIntegralPiPolynomial F a).comp + (equalCharacteristicChangedIntegralPiPolynomialIterate F a n) := by + rw [equalCharacteristicChangedIntegralPiPolynomialIterate, + Function.iterate_succ_apply'] + rfl + +/-- Every iterate of the changed integral `π`-polynomial is monic. -/ +theorem equalCharacteristicChangedIntegralPiPolynomialIterate_monic + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedIntegralPiPolynomialIterate F a n).Monic := by + induction n with + | zero => simp [equalCharacteristicChangedIntegralPiPolynomialIterate] + | succ n ih => + rw [equalCharacteristicChangedIntegralPiPolynomialIterate_succ] + exact (equalCharacteristicChangedIntegralPiPolynomial_monic F a).comp ih + (by + rw [equalCharacteristicChangedIntegralPiPolynomialIterate_natDegree] + exact pow_ne_zero n (ne_of_gt + (Nat.zero_lt_one.trans + (Finite.one_lt_card : 1 < Nat.card F.residueField)))) + +/-- Reducing coefficients sends the changed integral `π`-polynomial to `X ^ q`. -/ +theorem equalCharacteristicChangedIntegralPiPolynomial_map_constantCoeff + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) : + (equalCharacteristicChangedIntegralPiPolynomial F a).map + (PowerSeries.constantCoeff (R := F.residueField)) = + Polynomial.X ^ Nat.card F.residueField := by + simp [equalCharacteristicChangedIntegralPiPolynomial, + equalCharacteristicChangedIntegralUniformizer] + +/-- Reducing coefficients sends the `n`-fold changed `π`-iterate to `X ^ (q ^ n)`. -/ +theorem equalCharacteristicChangedIntegralPiPolynomialIterate_map_constantCoeff + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedIntegralPiPolynomialIterate F a n).map + (PowerSeries.constantCoeff (R := F.residueField)) = + Polynomial.X ^ (Nat.card F.residueField ^ n) := by + induction n with + | zero => + simp [equalCharacteristicChangedIntegralPiPolynomialIterate] + | succ n ih => + rw [equalCharacteristicChangedIntegralPiPolynomialIterate_succ, + Polynomial.map_comp, + equalCharacteristicChangedIntegralPiPolynomial_map_constantCoeff, + ih] + simp [← pow_mul, pow_succ] + +/-- Every changed integral `π`-iterate vanishes at zero. -/ +theorem equalCharacteristicChangedIntegralPiPolynomialIterate_eval_zero + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedIntegralPiPolynomialIterate F a n).eval 0 = 0 := by + induction n with + | zero => + simp [equalCharacteristicChangedIntegralPiPolynomialIterate] + | succ n ih => + rw [equalCharacteristicChangedIntegralPiPolynomialIterate_succ, + Polynomial.eval_comp, ih] + simp [equalCharacteristicChangedIntegralPiPolynomial, + ne_of_gt (Nat.zero_lt_one.trans + (Finite.one_lt_card : 1 < Nat.card F.residueField))] + +/-- The integral primitive level-`n+1` polynomial for `uT`. -/ +noncomputable def equalCharacteristicChangedIntegralPrimitivePolynomial + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + Polynomial F.residueField⟦X⟧ := + equalCharacteristicChangedIntegralPiPolynomialIterate F a n ^ + (Nat.card F.residueField - 1) + + Polynomial.C (equalCharacteristicChangedIntegralUniformizer F a) + +/-- The changed integral primitive polynomial has degree `(q - 1) * q ^ n`. -/ +theorem equalCharacteristicChangedIntegralPrimitivePolynomial_natDegree + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedIntegralPrimitivePolynomial F a n).natDegree = + (Nat.card F.residueField - 1) * Nat.card F.residueField ^ n := by + rw [equalCharacteristicChangedIntegralPrimitivePolynomial] + have hpos : + 0 < (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := + Nat.mul_pos (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (Nat.pow_pos Nat.card_pos) + rw [Polynomial.natDegree_add_eq_left_of_natDegree_lt] + · rw [Polynomial.natDegree_pow, + equalCharacteristicChangedIntegralPiPolynomialIterate_natDegree] + · rw [Polynomial.natDegree_pow, + equalCharacteristicChangedIntegralPiPolynomialIterate_natDegree, + Polynomial.natDegree_C] + exact hpos + +/-- The changed integral primitive polynomial is monic. -/ +theorem equalCharacteristicChangedIntegralPrimitivePolynomial_monic + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedIntegralPrimitivePolynomial F a n).Monic := by + rw [equalCharacteristicChangedIntegralPrimitivePolynomial] + let A := equalCharacteristicChangedIntegralPiPolynomialIterate F a n + have hA : A.Monic := + equalCharacteristicChangedIntegralPiPolynomialIterate_monic F a n + have hmain : (A ^ (Nat.card F.residueField - 1)).Monic := hA.pow _ + refine hmain.add_of_left ?_ + rw [Polynomial.degree_C + (equalCharacteristicChangedIntegralUniformizer_ne_zero F a), + Polynomial.degree_eq_natDegree hmain.ne_zero, + Polynomial.natDegree_pow, + equalCharacteristicChangedIntegralPiPolynomialIterate_natDegree] + exact_mod_cast Nat.mul_pos + (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (Nat.pow_pos Nat.card_pos) + +/-- Reducing the changed integral primitive polynomial yields the expected monomial. -/ +theorem equalCharacteristicChangedIntegralPrimitivePolynomial_map_constantCoeff + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedIntegralPrimitivePolynomial F a n).map + (PowerSeries.constantCoeff (R := F.residueField)) = + Polynomial.X ^ + ((Nat.card F.residueField - 1) * Nat.card F.residueField ^ n) := by + simp [equalCharacteristicChangedIntegralPrimitivePolynomial, + equalCharacteristicChangedIntegralPiPolynomialIterate_map_constantCoeff, + equalCharacteristicChangedIntegralUniformizer, ← pow_mul, Nat.mul_comm] + +/-- The constant coefficient of the changed integral primitive polynomial is the changed +uniformizer. -/ +theorem equalCharacteristicChangedIntegralPrimitivePolynomial_coeff_zero + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedIntegralPrimitivePolynomial F a n).coeff 0 = + equalCharacteristicChangedIntegralUniformizer F a := by + rw [Polynomial.coeff_zero_eq_eval_zero] + simp [equalCharacteristicChangedIntegralPrimitivePolynomial, + equalCharacteristicChangedIntegralPiPolynomialIterate_eval_zero, + ne_of_gt (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField))] + +/-- The changed integral uniformizer does not lie in the square of the `X`-adic ideal. -/ +theorem equalCharacteristicChangedIntegralUniformizer_notMem_span_X_sq + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicChangedIntegralUniformizer F a ∉ + (Ideal.span ({PowerSeries.X} : Set F.residueField⟦X⟧)) ^ 2 := by + intro h + have hmul := + (Ideal.span ({PowerSeries.X} : Set F.residueField⟦X⟧) ^ 2).mul_mem_left + (↑a⁻¹ : F.residueField⟦X⟧) h + apply powerSeries_X_notMem_span_X_sq F.residueField + simpa [equalCharacteristicChangedIntegralUniformizer, mul_assoc] using hmul + +/-- The changed primitive polynomial is Eisenstein at `(T)`. -/ +theorem equalCharacteristicChangedIntegralPrimitivePolynomial_isEisensteinAt + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedIntegralPrimitivePolynomial F a n).IsEisensteinAt + (Ideal.span ({PowerSeries.X} : Set F.residueField⟦X⟧)) := by + let Q := equalCharacteristicChangedIntegralPrimitivePolynomial F a n + let d := (Nat.card F.residueField - 1) * Nat.card F.residueField ^ n + have hmonic : Q.Monic := + equalCharacteristicChangedIntegralPrimitivePolynomial_monic F a n + refine hmonic.isEisensteinAt_of_mem_of_notMem + PowerSeries.span_X_isPrime.ne_top ?_ ?_ + · intro i hi + rw [Ideal.mem_span_singleton, PowerSeries.X_dvd_iff] + have hcoeff : + PowerSeries.constantCoeff + ((equalCharacteristicChangedIntegralPrimitivePolynomial F a n).coeff i) = + (Polynomial.X ^ d : Polynomial F.residueField).coeff i := by + simpa only [Polynomial.coeff_map, d] using + congrArg (fun p : Polynomial F.residueField ↦ p.coeff i) + (equalCharacteristicChangedIntegralPrimitivePolynomial_map_constantCoeff + F a n) + have hid : i < d := by + simpa [Q, d, + equalCharacteristicChangedIntegralPrimitivePolynomial_natDegree] using hi + simpa [d, Polynomial.coeff_X_pow, ne_of_lt hid] using hcoeff + · rw [equalCharacteristicChangedIntegralPrimitivePolynomial_coeff_zero] + exact equalCharacteristicChangedIntegralUniformizer_notMem_span_X_sq F a + +/-- The changed integral primitive polynomial is irreducible by Eisenstein's criterion. -/ +theorem equalCharacteristicChangedIntegralPrimitivePolynomial_irreducible + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + Irreducible (equalCharacteristicChangedIntegralPrimitivePolynomial F a n) := by + apply (equalCharacteristicChangedIntegralPrimitivePolynomial_isEisensteinAt + F a n).irreducible + PowerSeries.span_X_isPrime + (equalCharacteristicChangedIntegralPrimitivePolynomial_monic F a n).isPrimitive + rw [equalCharacteristicChangedIntegralPrimitivePolynomial_natDegree] + exact Nat.mul_pos + (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (Nat.pow_pos Nat.card_pos) + +/-- The Laurent-series Lubin--Tate polynomial for the changed uniformizer. -/ +noncomputable def equalCharacteristicChangedPiPolynomial + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) : + Polynomial F.residueField⸨X⸩ := + (equalCharacteristicChangedIntegralPiPolynomial F a).map + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩) + +/-- Expands the changed Laurent `π`-polynomial as `X ^ q + π * X`. -/ +theorem equalCharacteristicChangedPiPolynomial_eq + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicChangedPiPolynomial F a = + Polynomial.X ^ Nat.card F.residueField + + Polynomial.C (equalCharacteristicChangedLaurentUniformizer F a) * + Polynomial.X := by + simp [equalCharacteristicChangedPiPolynomial, + equalCharacteristicChangedIntegralPiPolynomial, + equalCharacteristicChangedLaurentUniformizer] + +/-- The changed Laurent `π`-polynomial has degree equal to the residue-field cardinality. -/ +theorem equalCharacteristicChangedPiPolynomial_natDegree + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) : + (equalCharacteristicChangedPiPolynomial F a).natDegree = + Nat.card F.residueField := by + rw [equalCharacteristicChangedPiPolynomial, + (equalCharacteristicChangedIntegralPiPolynomial_monic F a).natDegree_map, + equalCharacteristicChangedIntegralPiPolynomial_natDegree] + +/-- The compositional iterate of `P_{uT}` over `κ((T))`. -/ +noncomputable def equalCharacteristicChangedPiPolynomialIterate + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + Polynomial F.residueField⸨X⸩ := + (equalCharacteristicChangedPiPolynomial F a).comp^[n] Polynomial.X + +/-- The `n`-fold changed Laurent `π`-iterate has degree `q ^ n`. -/ +theorem equalCharacteristicChangedPiPolynomialIterate_natDegree + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedPiPolynomialIterate F a n).natDegree = + Nat.card F.residueField ^ n := by + rw [equalCharacteristicChangedPiPolynomialIterate, + Polynomial.natDegree_iterate_comp, + equalCharacteristicChangedPiPolynomial_natDegree, + Polynomial.natDegree_X, mul_one] + +/-- A successor Laurent `π`-iterate is one further composition. -/ +theorem equalCharacteristicChangedPiPolynomialIterate_succ + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicChangedPiPolynomialIterate F a (n + 1) = + (equalCharacteristicChangedPiPolynomial F a).comp + (equalCharacteristicChangedPiPolynomialIterate F a n) := by + rw [equalCharacteristicChangedPiPolynomialIterate, + Function.iterate_succ_apply'] + rfl + +/-- Base change carries the integral `π`-iterate to the Laurent `π`-iterate. -/ +theorem equalCharacteristicChangedIntegralPiPolynomialIterate_map + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedIntegralPiPolynomialIterate F a n).map + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩) = + equalCharacteristicChangedPiPolynomialIterate F a n := by + induction n with + | zero => + simp [equalCharacteristicChangedIntegralPiPolynomialIterate, + equalCharacteristicChangedPiPolynomialIterate] + | succ n ih => + rw [equalCharacteristicChangedIntegralPiPolynomialIterate_succ, + equalCharacteristicChangedPiPolynomialIterate_succ, + Polynomial.map_comp, equalCharacteristicChangedPiPolynomial, ih] + +/-- The Laurent-series primitive polynomial for the changed uniformizer. -/ +noncomputable def equalCharacteristicChangedPrimitivePolynomial + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + Polynomial F.residueField⸨X⸩ := + (equalCharacteristicChangedIntegralPrimitivePolynomial F a n).map + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩) + +/-- Expands the changed primitive polynomial using the changed `π`-iterate. -/ +theorem equalCharacteristicChangedPrimitivePolynomial_eq + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicChangedPrimitivePolynomial F a n = + equalCharacteristicChangedPiPolynomialIterate F a n ^ + (Nat.card F.residueField - 1) + + Polynomial.C (equalCharacteristicChangedLaurentUniformizer F a) := by + simp [equalCharacteristicChangedPrimitivePolynomial, + equalCharacteristicChangedIntegralPrimitivePolynomial, + equalCharacteristicChangedIntegralPiPolynomialIterate_map, + equalCharacteristicChangedLaurentUniformizer] + +/-- The changed primitive polynomial has degree `(q - 1) * q ^ n`. -/ +theorem equalCharacteristicChangedPrimitivePolynomial_natDegree + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedPrimitivePolynomial F a n).natDegree = + (Nat.card F.residueField - 1) * Nat.card F.residueField ^ n := by + rw [equalCharacteristicChangedPrimitivePolynomial, + (equalCharacteristicChangedIntegralPrimitivePolynomial_monic F a n).natDegree_map, + equalCharacteristicChangedIntegralPrimitivePolynomial_natDegree] + +/-- The changed primitive polynomial over the Laurent field is monic. -/ +theorem equalCharacteristicChangedPrimitivePolynomial_monic + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedPrimitivePolynomial F a n).Monic := by + exact (equalCharacteristicChangedIntegralPrimitivePolynomial_monic F a n).map _ + +/-- The changed primitive polynomial over the Laurent field is irreducible. -/ +theorem equalCharacteristicChangedPrimitivePolynomial_irreducible + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + Irreducible (equalCharacteristicChangedPrimitivePolynomial F a n) := by + exact + (equalCharacteristicChangedIntegralPrimitivePolynomial_monic F a + n).irreducible_iff_irreducible_map_fraction_map.mp + (equalCharacteristicChangedIntegralPrimitivePolynomial_irreducible F a n) + +/-- The changed Laurent uniformizer is the primitive polynomial's constant coefficient. -/ +theorem equalCharacteristicChangedPrimitivePolynomial_coeff_zero + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedPrimitivePolynomial F a n).coeff 0 = + equalCharacteristicChangedLaurentUniformizer F a := by + rw [equalCharacteristicChangedPrimitivePolynomial, Polynomial.coeff_map, + equalCharacteristicChangedIntegralPrimitivePolynomial_coeff_zero] + rfl + +/-- The derivative of the changed `π`-polynomial is the constant changed uniformizer. -/ +theorem equalCharacteristicChangedPiPolynomial_derivative + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) : + (equalCharacteristicChangedPiPolynomial F a).derivative = + Polynomial.C (equalCharacteristicChangedLaurentUniformizer F a) := by + simp [equalCharacteristicChangedPiPolynomial_eq, + Polynomial.derivative_pow, residueField_natCard_cast_eq_zero F] + +/-- The derivative of the `n`-fold changed `π`-iterate is the `n`th uniformizer power. -/ +theorem equalCharacteristicChangedPiPolynomialIterate_derivative + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedPiPolynomialIterate F a n).derivative = + Polynomial.C (equalCharacteristicChangedLaurentUniformizer F a ^ n) := by + induction n with + | zero => simp [equalCharacteristicChangedPiPolynomialIterate] + | succ n ih => + rw [equalCharacteristicChangedPiPolynomialIterate_succ, + Polynomial.derivative_comp, ih, + equalCharacteristicChangedPiPolynomial_derivative] + simp [pow_succ] + +/-- Every iterate of the changed Laurent `π`-polynomial is separable. -/ +theorem equalCharacteristicChangedPiPolynomialIterate_separable + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedPiPolynomialIterate F a n).Separable := by + rw [Polynomial.separable_def'] + refine ⟨0, + Polynomial.C ((equalCharacteristicChangedLaurentUniformizer F a ^ n)⁻¹), ?_⟩ + rw [equalCharacteristicChangedPiPolynomialIterate_derivative] + simp only [zero_mul, zero_add] + rw [← map_mul, + inv_mul_cancel₀ (pow_ne_zero n + (equalCharacteristicChangedLaurentUniformizer_ne_zero F a)), map_one] + +/-- The successor `π`-iterate factors through the current iterate and primitive factor. -/ +theorem equalCharacteristicChangedPiPolynomialIterate_succ_factor + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicChangedPiPolynomialIterate F a (n + 1) = + equalCharacteristicChangedPiPolynomialIterate F a n * + equalCharacteristicChangedPrimitivePolynomial F a n := by + have hq : Nat.card F.residueField ≠ 0 := + ne_of_gt (Nat.zero_lt_one.trans + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + rw [equalCharacteristicChangedPiPolynomialIterate_succ, + equalCharacteristicChangedPiPolynomial_eq, + equalCharacteristicChangedPrimitivePolynomial_eq] + simp only [Polynomial.add_comp, Polynomial.pow_comp, + Polynomial.X_comp, Polynomial.mul_comp, Polynomial.C_comp] + rw [← pow_sub_one_mul hq] + ring + +/-- The changed primitive polynomial is separable. -/ +theorem equalCharacteristicChangedPrimitivePolynomial_separable + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedPrimitivePolynomial F a n).Separable := by + apply Polynomial.Separable.of_dvd + (equalCharacteristicChangedPiPolynomialIterate_separable F a (n + 1)) + exact ⟨equalCharacteristicChangedPiPolynomialIterate F a n, + by simpa [mul_comm] using + (equalCharacteristicChangedPiPolynomialIterate_succ_factor F a n)⟩ + +/-- The changed primitive polynomial has a root in the separable closure. -/ +theorem exists_equalCharacteristicChangedPrimitivePolynomial_root + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) + (n : ℕ) : + ∃ x : SeparableClosure F.residueField⸨X⸩, + ((equalCharacteristicChangedPrimitivePolynomial F a n).map + (equalCharacteristicSeparableBaseHom F)).IsRoot x := by + let φ := equalCharacteristicSeparableBaseHom F + let Q := equalCharacteristicChangedPrimitivePolynomial F a n + have hdeg : (Q.map φ).degree ≠ 0 := by + have hnat : 0 < (Q.map φ).natDegree := by + rw [Polynomial.natDegree_map_eq_of_injective φ.injective, + equalCharacteristicChangedPrimitivePolynomial_natDegree] + exact Nat.mul_pos + (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (Nat.pow_pos Nat.card_pos) + exact ne_of_gt (Polynomial.natDegree_pos_iff_degree_pos.mp hnat) + have hsep : (Q.map φ).Separable := + (equalCharacteristicChangedPrimitivePolynomial_separable F a n).map + exact IsSepClosed.exists_root (Q.map φ) hdeg hsep + +/-- A chosen changed-uniformizer primitive level root. -/ +noncomputable def chosenEqualCharacteristicChangedPrimitiveRoot + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) + [CharP K F.residueCharacteristic] (n : ℕ) : + SeparableClosure F.residueField⸨X⸩ := + Classical.choose (exists_equalCharacteristicChangedPrimitivePolynomial_root F a n) + +/-- The chosen changed primitive element is a root of the base-changed polynomial. -/ +theorem chosenEqualCharacteristicChangedPrimitiveRoot_isRoot + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) + [CharP K F.residueCharacteristic] (n : ℕ) : + ((equalCharacteristicChangedPrimitivePolynomial F a n).map + (equalCharacteristicSeparableBaseHom F)).IsRoot + (chosenEqualCharacteristicChangedPrimitiveRoot F a n) := + Classical.choose_spec + (exists_equalCharacteristicChangedPrimitivePolynomial_root F a n) + +/-- The chosen changed primitive root is integral over the Laurent base field. -/ +theorem chosenEqualCharacteristicChangedPrimitiveRoot_isIntegral + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) + [CharP K F.residueCharacteristic] (n : ℕ) : + IsIntegral F.residueField⸨X⸩ + (chosenEqualCharacteristicChangedPrimitiveRoot F a n) := by + refine ⟨equalCharacteristicChangedPrimitivePolynomial F a n, + equalCharacteristicChangedPrimitivePolynomial_monic F a n, ?_⟩ + rw [← equalCharacteristicSeparableBaseHom_eq_algebraMap] + simpa [Polynomial.IsRoot, Polynomial.eval_map] using + (chosenEqualCharacteristicChangedPrimitiveRoot_isRoot F a n) + +/-- The changed primitive polynomial is the minimal polynomial of the chosen root. -/ +theorem equalCharacteristicChangedPrimitivePolynomial_eq_minpoly + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) + [CharP K F.residueCharacteristic] (n : ℕ) : + equalCharacteristicChangedPrimitivePolynomial F a n = + minpoly F.residueField⸨X⸩ + (chosenEqualCharacteristicChangedPrimitiveRoot F a n) := by + apply minpoly.eq_of_irreducible_of_monic + (equalCharacteristicChangedPrimitivePolynomial_irreducible F a n) + _ (equalCharacteristicChangedPrimitivePolynomial_monic F a n) + rw [Polynomial.aeval_def, ← equalCharacteristicSeparableBaseHom_eq_algebraMap] + simpa [Polynomial.IsRoot, Polynomial.eval_map] using + (chosenEqualCharacteristicChangedPrimitiveRoot_isRoot F a n) + +/-- The simple level field for the changed uniformizer. -/ +@[reducible] +noncomputable def equalCharacteristicChangedLevelField + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) + [CharP K F.residueCharacteristic] (n : ℕ) : + IntermediateField F.residueField⸨X⸩ + (SeparableClosure F.residueField⸨X⸩) := + IntermediateField.adjoin F.residueField⸨X⸩ + {chosenEqualCharacteristicChangedPrimitiveRoot F a n} + +/-- The changed Lubin–Tate level field is finite-dimensional over the Laurent field. -/ +theorem equalCharacteristicChangedLevelField_finiteDimensional + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) + [CharP K F.residueCharacteristic] (n : ℕ) : + FiniteDimensional F.residueField⸨X⸩ + (equalCharacteristicChangedLevelField F a n) := + IntermediateField.adjoin.finiteDimensional + (chosenEqualCharacteristicChangedPrimitiveRoot_isIntegral F a n) + +/-- The changed level field has degree `(q - 1) * q ^ n`. -/ +theorem equalCharacteristicChangedLevelField_finrank + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) + [CharP K F.residueCharacteristic] (n : ℕ) : + Module.finrank F.residueField⸨X⸩ + (equalCharacteristicChangedLevelField F a n) = + (Nat.card F.residueField - 1) * Nat.card F.residueField ^ n := by + calc + Module.finrank F.residueField⸨X⸩ + (equalCharacteristicChangedLevelField F a n) = + (minpoly F.residueField⸨X⸩ + (chosenEqualCharacteristicChangedPrimitiveRoot F a n)).natDegree := by + unfold equalCharacteristicChangedLevelField + exact IntermediateField.adjoin.finrank + (chosenEqualCharacteristicChangedPrimitiveRoot_isIntegral F a n) + _ = (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := by + rw [← equalCharacteristicChangedPrimitivePolynomial_eq_minpoly, + equalCharacteristicChangedPrimitivePolynomial_natDegree] + +/-- The chosen root as a generator of its changed-uniformizer level field. -/ +noncomputable def equalCharacteristicChangedLevelGenerator + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) + [CharP K F.residueCharacteristic] (n : ℕ) : + equalCharacteristicChangedLevelField F a n := + IntermediateField.AdjoinSimple.gen F.residueField⸨X⸩ + (chosenEqualCharacteristicChangedPrimitiveRoot F a n) + +/-- The chosen changed level generator agrees with the generator of its power basis. -/ +theorem equalCharacteristicChangedLevelGenerator_eq_powerBasis_gen + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) + [CharP K F.residueCharacteristic] (n : ℕ) : + equalCharacteristicChangedLevelGenerator F a n = + (IntermediateField.adjoin.powerBasis + (chosenEqualCharacteristicChangedPrimitiveRoot_isIntegral F a n)).gen := by + apply Subtype.ext + simp [equalCharacteristicChangedLevelGenerator, + equalCharacteristicChangedLevelField, + IntermediateField.adjoin.powerBasis_gen] + +/-- The norm of a negative element, separated from the changed level field's +large concrete type. -/ +private theorem changedAlgebraNorm_neg + {R S : Type*} [Field R] [Field S] [Algebra R S] (x : S) : + Algebra.norm R (-x) = (-1) ^ Module.finrank R S * Algebra.norm R x := by + rw [show -x = algebraMap R S (-1) * x by simp] + rw [map_mul, Algebra.norm_algebraMap] + +/-- The completed theta-intertwining theorem, changed-uniformizer norm identity: +`N(-λ_{uT,n+1}) = uT`. -/ +theorem equalCharacteristicChanged_norm_neg_levelGenerator + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) + [CharP K F.residueCharacteristic] (n : ℕ) : + Algebra.norm F.residueField⸨X⸩ + (-equalCharacteristicChangedLevelGenerator F a n) = + equalCharacteristicChangedLaurentUniformizer F a := by + let pb := IntermediateField.adjoin.powerBasis + (chosenEqualCharacteristicChangedPrimitiveRoot_isIntegral F a n) + have hmin : minpoly F.residueField⸨X⸩ pb.gen = + equalCharacteristicChangedPrimitivePolynomial F a n := by + simpa [pb, IntermediateField.adjoin.powerBasis_gen, + IntermediateField.minpoly_gen] using + (equalCharacteristicChangedPrimitivePolynomial_eq_minpoly F a n).symm + have hfinrank : Module.finrank F.residueField⸨X⸩ + (equalCharacteristicChangedLevelField F a n) = pb.dim := by + unfold equalCharacteristicChangedLevelField + exact pb.finrank + rw [changedAlgebraNorm_neg, + equalCharacteristicChangedLevelGenerator_eq_powerBasis_gen, + Algebra.PowerBasis.norm_gen_eq_coeff_zero_minpoly] + change (-1) ^ Module.finrank F.residueField⸨X⸩ + (equalCharacteristicChangedLevelField F a n) * + ((-1) ^ pb.dim * + (minpoly F.residueField⸨X⸩ pb.gen).coeff 0) = + equalCharacteristicChangedLaurentUniformizer F a + rw [hmin, equalCharacteristicChangedPrimitivePolynomial_coeff_zero] + rw [hfinrank] + simp only [pb, IntermediateField.adjoin.powerBasis_dim] + rw [← mul_assoc, ← pow_add, ← two_mul, pow_mul] + simp + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizerNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizerNormalization.lean new file mode 100644 index 0000000000..0a30c2cfe3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizerNormalization.lean @@ -0,0 +1,111 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization +/-! +# The completed theta-intertwining theorem: normalization of a changed Laurent uniformizer + +The parameter `aT`, with `a` a power-series unit, is a prime element of the +canonical Laurent integer ring. Consequently its inverse has normalized +additive value one. This is the concrete prime certificate used in the +changed-level norm argument. +-/ + +@[expose] public section + +noncomputable +section + +open scoped PowerSeries LaurentSeries ValuativeRel WithZero + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The changed Laurent parameter in the canonical integer ring. -/ +noncomputable def equalCharacteristicChangedLaurentUniformizerInteger + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) : + letI := equalCharacteristicLaurentValuativeRel F + (ValuativeRel.valuation F.residueField⸨X⸩).integer := by + letI : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + exact powerSeriesEquivLaurentValuativeInteger F.residueField + (equalCharacteristicChangedIntegralUniformizer F a) + +/-- States the theorem `equalCharacteristicChangedLaurentUniformizerInteger_coe`. -/ +@[simp] +theorem equalCharacteristicChangedLaurentUniformizerInteger_coe + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) : + letI := equalCharacteristicLaurentValuativeRel F + (equalCharacteristicChangedLaurentUniformizerInteger F a).1 = + equalCharacteristicChangedLaurentUniformizer F a := by + let : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + rfl + +/-- Multiplying `T` by a power-series unit preserves primality in the +canonical Laurent integer ring. -/ +theorem equalCharacteristicChangedLaurentUniformizerInteger_irreducible + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) : + letI := equalCharacteristicLaurentValuativeRel F + Irreducible (equalCharacteristicChangedLaurentUniformizerInteger F a) := by + let : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + change Irreducible + (powerSeriesEquivLaurentValuativeInteger F.residueField + ((a : F.residueField⟦X⟧) * PowerSeries.X)) + have hprime : Irreducible + ((a : F.residueField⟦X⟧) * PowerSeries.X) := + (irreducible_isUnit_mul a.isUnit).2 PowerSeries.X_irreducible + exact hprime.map + (powerSeriesEquivLaurentValuativeInteger F.residueField) + +/-- The changed Laurent parameter as a nonzero field unit. -/ +noncomputable def equalCharacteristicChangedLaurentUniformizerUnit + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) : + F.residueField⸨X⸩ˣ := + Units.mk0 (equalCharacteristicChangedLaurentUniformizer F a) + (equalCharacteristicChangedLaurentUniformizer_ne_zero F a) + +/-- States the theorem `equalCharacteristicChangedLaurentUniformizerUnit_coe`. -/ +@[simp] +theorem equalCharacteristicChangedLaurentUniformizerUnit_coe + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) : + (equalCharacteristicChangedLaurentUniformizerUnit F a).1 = + equalCharacteristicChangedLaurentUniformizer F a := + rfl + +/-- In the normalized additive convention, `(aT)⁻¹` has value one. -/ +theorem equalCharacteristicChangedLaurentUniformizerUnit_inv_valuationMap + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) : + letI := equalCharacteristicLaurentValuativeRel F + letI := equalCharacteristicLaurentIsNonarchimedeanLocalField F + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap F.residueField⸨X⸩ + (Additive.ofMul + (equalCharacteristicChangedLaurentUniformizerUnit F a)⁻¹) = 1 := by + let L := F.residueField⸨X⸩ + let : ValuativeRel L := equalCharacteristicLaurentValuativeRel F + let : IsNonarchimedeanLocalField L := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + rw [LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_apply] + exact LocalFieldTheory.v_integerRingIrreducibleFieldUnit_inv L + (equalCharacteristicChangedLaurentUniformizerInteger F a) + (equalCharacteristicChangedLaurentUniformizerInteger_irreducible F a) + (equalCharacteristicChangedLaurentUniformizerUnit F a) (by + change equalCharacteristicChangedLaurentUniformizer F a = + equalCharacteristicChangedLaurentUniformizer F a + rfl) + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusBaseEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusBaseEquiv.lean new file mode 100644 index 0000000000..1617d5d1c0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusBaseEquiv.lean @@ -0,0 +1,108 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity +/-! +# The completed theta-intertwining theorem: the completed Frobenius lift over the Laurent base + +The prescribed completed lift is semilinear over the completed maximal +unramified field. Arithmetic Frobenius on that field fixes the embedded +Laurent base `k((T))`; hence the lift is an actual `k((T))`-automorphism. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries PowerSeries + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The Laurent-series algebra structure on the completed unramified base used to construct +Frobenius. -/ +noncomputable local instance equalCharacteristicCompletedFrobeniusBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +/-- The completed Lubin–Tate level is an algebra over residue-field Laurent series through its +completed base. -/ +noncomputable local instance equalCharacteristicCompletedFrobeniusLevelAlgebra + (F : LocalField.{u, v} K) (n : ℕ) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedLevelField F n) := + RingHom.toAlgebra + ((algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)).comp + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField))) + +local instance equalCharacteristicCompletedFrobeniusScalarTower + (F : LocalField.{u, v} K) (n : ℕ) : + IsScalarTower F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) := + IsScalarTower.of_algebraMap_eq' rfl + +/-- The completed theta-intertwining theorem completed lift fixes every element of the embedded +Laurent +base `k((T))`. -/ +@[simp] +theorem equalCharacteristicCompletedFrobeniusLiftEquiv_fixesLaurentBase + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) + (b : F.residueField⸨X⸩) : + equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹ + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedLevelField F n) b) = + algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedLevelField F n) b := by + change equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹ + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) b)) = _ + rw [equalCharacteristicCompletedFrobeniusLiftEquiv_algebraMap, + (equalCharacteristicCompletedUnramifiedFrobenius F.residueField).commutes] + rfl + +/-- The prescribed the completed theta-intertwining theorem lift, regarded as an automorphism +over the original +Laurent field `k((T))`. -/ +noncomputable def equalCharacteristicCompletedFrobeniusAlgEquiv + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicCompletedLevelField F n ≃ₐ[F.residueField⸨X⸩] + equalCharacteristicCompletedLevelField F n := + AlgEquiv.ofRingEquiv + (equalCharacteristicCompletedFrobeniusLiftEquiv_fixesLaurentBase F u n) + +/-- States the theorem `equalCharacteristicCompletedFrobeniusAlgEquiv_apply`. -/ +@[simp] +theorem equalCharacteristicCompletedFrobeniusAlgEquiv_apply + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) + (x : equalCharacteristicCompletedLevelField F n) : + equalCharacteristicCompletedFrobeniusAlgEquiv F u n x = + equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹ x := + rfl + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusContinuity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusContinuity.lean new file mode 100644 index 0000000000..b0bae2f624 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusContinuity.lean @@ -0,0 +1,219 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusLift +/-! +# The completed theta-intertwining theorem: continuity of the standard completed Frobenius lift + +For every prescribed bracket unit `a`, pullback of the completed-level +spectral norm along the semilinear Frobenius lift is a power-multiplicative +algebra norm extending the original norm of the completed maximal-unramified +base. Spectral-norm uniqueness therefore makes the lift an isometry and in +particular continuous. We also name the `a = u⁻¹` specialization used +directly in the completed theta-intertwining theorem. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries NNReal Polynomial PowerSeries Topology Valued WithZero + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The Laurent-series algebra structure on the completed unramified base used in Frobenius +continuity. -/ +noncomputable local instance equalCharacteristicFrobeniusContinuityBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +noncomputable local instance + equalCharacteristicFrobeniusContinuityBaseValuationIsNontrivial + (k : Type v) [Field k] : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField k) ℤᵐ⁰).IsNontrivial := + equalCharacteristicCompletedBaseValuationIsNontrivial k + +/-- The base valuation in the Frobenius continuity argument has rank one. -/ +noncomputable local instance + equalCharacteristicFrobeniusContinuityBaseValuationRankOne + (k : Type v) [Field k] : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField k) ℤᵐ⁰).RankOne := + equalCharacteristicCompletedBaseValuationRankOne k + +/-- The completed unramified base carries the nontrivial norm used in the Frobenius continuity +argument. -/ +@[reducible] +noncomputable local instance equalCharacteristicFrobeniusContinuityBaseNormedField + (k : Type v) [Field k] : + NontriviallyNormedField + (equalCharacteristicCompletedUnramifiedField k) := + equalCharacteristicCompletedBaseNormedField k + +/-- The completed Lubin–Tate level carries its spectral norm for the Frobenius continuity +argument. -/ +@[reducible] +noncomputable local instance equalCharacteristicFrobeniusContinuityLevelNormedField + (F : LocalField.{u, v} K) (n : ℕ) : + NontriviallyNormedField (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelNormedField F n + +/-- Base arithmetic Frobenius preserves the rank-one norm. -/ +private theorem equalCharacteristicCompletedFrobeniusBase_norm + (F : LocalField.{u, v} K) + (b : equalCharacteristicCompletedUnramifiedField F.residueField) : + ‖equalCharacteristicCompletedUnramifiedFrobenius F.residueField b‖ = + ‖b‖ := by + simp only [Valued.toNormedField.norm_def] + apply congrArg (fun z => + ((Valuation.RankOne.hom + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField F.residueField) ℤᵐ⁰) z : ℝ≥0) : ℝ)) + exact ((Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField F.residueField) ℤᵐ⁰).restrict_inj).mpr + (equalCharacteristicCompletedUnramifiedFrobenius_valuation F.residueField b) + +/-- Pullback of the standard completed-level spectral norm by the +prescribed-bracket Frobenius lift. -/ +noncomputable def equalCharacteristicCompletedFrobeniusPullbackAlgebraNorm + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + AlgebraNorm + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) where + toFun x := ‖equalCharacteristicCompletedFrobeniusLiftEquiv F n a x‖ + map_zero' := by simp + add_le' x y := by + rw [map_add] + exact norm_add_le _ _ + neg' x := by simp + mul_le' x y := by + rw [map_mul, norm_mul] + eq_zero_of_map_eq_zero' x hx := by + apply (equalCharacteristicCompletedFrobeniusLiftEquiv F n a).injective + rw [map_zero] + exact norm_eq_zero.mp hx + smul' b x := by + rw [Algebra.smul_def, map_mul, + equalCharacteristicCompletedFrobeniusLiftEquiv_algebraMap, + norm_mul] + congr 1 + change spectralNorm + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + (algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + (equalCharacteristicCompletedUnramifiedFrobenius + F.residueField b)) = ‖b‖ + rw [spectralNorm_extends, + equalCharacteristicCompletedFrobeniusBase_norm] + +/-- The pulled-back norm is power-multiplicative. -/ +theorem equalCharacteristicCompletedFrobeniusPullbackAlgebraNorm_isPowMul + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + IsPowMul (equalCharacteristicCompletedFrobeniusPullbackAlgebraNorm F n a) := by + intro x m _hm + change + ‖equalCharacteristicCompletedFrobeniusLiftEquiv F n a (x ^ m)‖ = + ‖equalCharacteristicCompletedFrobeniusLiftEquiv F n a x‖ ^ m + rw [map_pow, norm_pow] + +/-- Spectral-norm uniqueness identifies the pullback norm with the original +completed-level norm. -/ +theorem equalCharacteristicCompletedFrobeniusPullbackAlgebraNorm_eq + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicCompletedFrobeniusPullbackAlgebraNorm F n a = + spectralAlgNorm + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) := + spectralNorm_unique + (equalCharacteristicCompletedFrobeniusPullbackAlgebraNorm_isPowMul F n a) + +/-- Every prescribed-bracket standard completed Frobenius lift preserves +the spectral norm. -/ +theorem equalCharacteristicCompletedFrobeniusLiftEquiv_norm + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) + (x : equalCharacteristicCompletedLevelField F n) : + ‖equalCharacteristicCompletedFrobeniusLiftEquiv F n a x‖ = ‖x‖ := by + have h := DFunLike.congr_fun + (equalCharacteristicCompletedFrobeniusPullbackAlgebraNorm_eq F n a) x + change equalCharacteristicCompletedFrobeniusPullbackAlgebraNorm F n a x = + spectralAlgNorm + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) x + exact h + +/-- Every prescribed-bracket standard completed Frobenius lift is an +isometry. -/ +theorem equalCharacteristicCompletedFrobeniusLiftEquiv_isometry + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + Isometry (equalCharacteristicCompletedFrobeniusLiftEquiv F n a) := + AddMonoidHomClass.isometry_of_norm + (equalCharacteristicCompletedFrobeniusLiftEquiv F n a) + (equalCharacteristicCompletedFrobeniusLiftEquiv_norm F n a) + +/-- Every prescribed-bracket standard completed Frobenius lift is +continuous for the spectral-norm topology. -/ +theorem equalCharacteristicCompletedFrobeniusLiftEquiv_continuous + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + Continuous (equalCharacteristicCompletedFrobeniusLiftEquiv F n a) := + (equalCharacteristicCompletedFrobeniusLiftEquiv_isometry F n a).continuous + +/-- The completed theta-intertwining theorem specialization preserves the spectral norm. -/ +theorem equalCharacteristicCompletedFrobeniusLift_norm + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) + (x : equalCharacteristicCompletedLevelField F n) : + ‖equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹ x‖ = ‖x‖ := + equalCharacteristicCompletedFrobeniusLiftEquiv_norm F n u⁻¹ x + +/-- The completed theta-intertwining theorem specialization is an isometry. -/ +theorem equalCharacteristicCompletedFrobeniusLift_isometry + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Isometry (equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹) := + equalCharacteristicCompletedFrobeniusLiftEquiv_isometry F n u⁻¹ + +/-- The completed theta-intertwining theorem specialization is continuous for the standard +completed-level +spectral-norm topology. -/ +theorem equalCharacteristicCompletedFrobeniusLift_continuous + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Continuous (equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹) := + (equalCharacteristicCompletedFrobeniusLift_isometry F u n).continuous + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedField.lean new file mode 100644 index 0000000000..54c6046f15 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedField.lean @@ -0,0 +1,218 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusBaseEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFrobeniusFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectTargetLevelEmbedding +/-! +# The completed theta-intertwining theorem: the fixed field of the prescribed completed lift + +Let `delta` be the completed lift whose action on the standard primitive +point is `[u⁻¹]`. This file defines the Frobenius fixed field `Sigma`, places +the fixed analytic value `theta(lambda)` in it, and factors the finite +target `uT` Lubin--Tate level through `Sigma`. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries PowerSeries + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The Laurent-series algebra structure on the completed base used in the Frobenius fixed-field +construction. -/ +noncomputable local instance equalCharacteristicCompletedFrobeniusFixedBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +/-- The completed level is a Laurent-series algebra through its completed base in the Frobenius +fixed-field construction. -/ +noncomputable local instance equalCharacteristicCompletedFrobeniusFixedLevelAlgebra + (F : LocalField.{u, v} K) (n : ℕ) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedLevelField F n) := + RingHom.toAlgebra + ((algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)).comp + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField))) + +local instance equalCharacteristicCompletedFrobeniusFixedScalarTower + (F : LocalField.{u, v} K) (n : ℕ) : + IsScalarTower F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) := + IsScalarTower.of_algebraMap_eq' rfl + +/-- The cyclic subgroup generated by the completed theta-intertwining theorem completed +Frobenius lift. -/ +noncomputable def equalCharacteristicCompletedFrobeniusSubgroup + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + Subgroup + (equalCharacteristicCompletedLevelField F n ≃ₐ[F.residueField⸨X⸩] + equalCharacteristicCompletedLevelField F n) := + Subgroup.zpowers + (equalCharacteristicCompletedFrobeniusAlgEquiv F a n) + +/-- The field `Sigma` fixed by the prescribed lift in the completed theta-intertwining theorem. -/ +noncomputable def equalCharacteristicCompletedFrobeniusFixedField + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + IntermediateField F.residueField⸨X⸩ + (equalCharacteristicCompletedLevelField F n) := + IntermediateField.fixedField + (equalCharacteristicCompletedFrobeniusSubgroup F a n) + +/-- Fixedness under the generator puts `theta(lambda)` in the fixed field +of every integral power of the generator. -/ +theorem equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_mem_fixedField + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n) ∈ + equalCharacteristicCompletedFrobeniusFixedField F a n := by + rw [equalCharacteristicCompletedFrobeniusFixedField, + IntermediateField.mem_fixedField_iff] + intro σ hσ + obtain ⟨j, rfl⟩ := Subgroup.mem_zpowers_iff.mp hσ + have hfixed : + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n) ∈ + MulAction.fixedBy + (equalCharacteristicCompletedLevelField F n) + (equalCharacteristicCompletedFrobeniusAlgEquiv F a n) := by + rw [MulAction.mem_fixedBy] + change equalCharacteristicCompletedFrobeniusAlgEquiv F a n + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n) = _ + rw [equalCharacteristicCompletedFrobeniusAlgEquiv_apply] + exact + equalCharacteristicCompletedFrobeniusLift_directThetaFixed F a n + exact MulAction.mem_fixedBy_zpow hfixed j + +private theorem algHom_adjoin_singleton_mem_intermediateField + {k Omega L : Type*} [Field k] [Field Omega] [Field L] + [Algebra k Omega] [Algebra k L] + (r : Omega) + (ι : (IntermediateField.adjoin k ({r} : Set Omega)) →ₐ[k] L) + (S : IntermediateField k L) + (hr : ι + (⟨r, IntermediateField.subset_adjoin k ({r} : Set Omega) + (Set.mem_singleton r)⟩ : + IntermediateField.adjoin k ({r} : Set Omega)) ∈ S) + (x : IntermediateField.adjoin k ({r} : Set Omega)) : + ι x ∈ S := by + let M := IntermediateField.adjoin k ({r} : Set Omega) + have hall : ∀ y : Omega, ∀ hy : y ∈ M, ι ⟨y, hy⟩ ∈ S := by + intro y hy + induction hy using IntermediateField.adjoin_induction with + | mem y hy => + rw [Set.mem_singleton_iff] at hy + subst y + exact hr + | algebraMap c => + have hmem : ι (algebraMap k M c) ∈ S := by + rw [ι.commutes] + exact S.algebraMap_mem c + exact hmem + | add y z hy hz ihy ihz => + have hmem : ι ((⟨y, hy⟩ : M) + ⟨z, hz⟩) ∈ S := by + change ι.toRingHom ((⟨y, hy⟩ : M) + ⟨z, hz⟩) ∈ S + rw [ι.toRingHom.map_add (⟨y, hy⟩ : M) (⟨z, hz⟩ : M)] + exact S.add_mem ihy ihz + exact hmem + | inv y hy ihy => + have hmem : ι ((⟨y, hy⟩ : M)⁻¹) ∈ S := by + change ι.toRingHom ((⟨y, hy⟩ : M)⁻¹) ∈ S + rw [map_inv₀ ι.toRingHom (⟨y, hy⟩ : M)] + exact S.inv_mem ihy + exact hmem + | mul y z hy hz ihy ihz => + have hmem : ι ((⟨y, hy⟩ : M) * ⟨z, hz⟩) ∈ S := by + change ι.toRingHom ((⟨y, hy⟩ : M) * ⟨z, hz⟩) ∈ S + rw [ι.toRingHom.map_mul (⟨y, hy⟩ : M) (⟨z, hz⟩ : M)] + exact S.mul_mem ihy ihz + exact hmem + exact hall x.1 x.2 + +/-- Every element of the embedded finite target level is fixed by the +prescribed completed lift. -/ +theorem equalCharacteristicDirectTargetLevelFieldToCompleted_mem_fixedField + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) + (x : equalCharacteristicChangedLevelField F a n) : + equalCharacteristicDirectTargetLevelFieldToCompleted F a n x ∈ + equalCharacteristicCompletedFrobeniusFixedField F a n := by + let M := equalCharacteristicChangedLevelField F a n + let S := equalCharacteristicCompletedFrobeniusFixedField F a n + let ι := equalCharacteristicDirectTargetLevelFieldToCompleted F a n + have hrootmem : chosenEqualCharacteristicChangedPrimitiveRoot F a n ∈ M := by + exact IntermediateField.subset_adjoin F.residueField⸨X⸩ + {chosenEqualCharacteristicChangedPrimitiveRoot F a n} (Set.mem_singleton _) + have hgen : + (⟨chosenEqualCharacteristicChangedPrimitiveRoot F a n, hrootmem⟩ : M) = + equalCharacteristicChangedLevelGenerator F a n := by + apply Subtype.ext + rfl + have hroot : ι + (⟨chosenEqualCharacteristicChangedPrimitiveRoot F a n, hrootmem⟩ : M) ∈ S := by + rw [hgen, equalCharacteristicDirectTargetLevelFieldToCompleted_generator] + exact equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_mem_fixedField + F a n + exact algHom_adjoin_singleton_mem_intermediateField + (chosenEqualCharacteristicChangedPrimitiveRoot F a n) ι S hroot x + +/-- The target Lubin--Tate level as an algebra inside the canonical fixed +field `Sigma`. -/ +noncomputable def equalCharacteristicDirectTargetLevelFieldToFixedField + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicChangedLevelField F a n + →ₐ[F.residueField⸨X⸩] + equalCharacteristicCompletedFrobeniusFixedField F a n := + (equalCharacteristicDirectTargetLevelFieldToCompleted F a n).codRestrict + (equalCharacteristicCompletedFrobeniusFixedField F a n).toSubalgebra + (equalCharacteristicDirectTargetLevelFieldToCompleted_mem_fixedField + F a n) + +/-- States the theorem `equalCharacteristicDirectTargetLevelFieldToFixedField_generator`. -/ +@[simp] +theorem equalCharacteristicDirectTargetLevelFieldToFixedField_generator + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicDirectTargetLevelFieldToFixedField F a n + (equalCharacteristicChangedLevelGenerator F a n) = + ⟨(equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n), + equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_mem_fixedField + F a n⟩ := by + apply Subtype.ext + exact equalCharacteristicDirectTargetLevelFieldToCompleted_generator F a n + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldAlgebra.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldAlgebra.lean new file mode 100644 index 0000000000..98b77a4fa7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldAlgebra.lean @@ -0,0 +1,104 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField +/-! +# The completed theta-intertwining theorem: the canonical base algebra on the fixed field + +This light leaf names the base algebra already determined by the completed +Frobenius action. Naming it prevents repeated fallback searches through +generic scalar-action instances in later norm calculations. +-/ + +@[expose] public section + +noncomputable +section + + +open scoped LaurentSeries PowerSeries + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type} [Field K] + +/-- The fixed-field algebra construction uses the same Laurent-series scalar extension on the +completed base. -/ +noncomputable local instance equalCharacteristicFixedFieldAlgebraBaseAlgebra + (F : LocalField K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + equalCharacteristicCompletedFrobeniusFixedBaseAlgebra F + +/-- The fixed-field algebra construction uses the Laurent-series scalar action induced through the +completed level tower. -/ +noncomputable local instance equalCharacteristicFixedFieldAlgebraLevelAlgebra + (F : LocalField K) (n : ℕ) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedFrobeniusFixedLevelAlgebra F n + +local instance equalCharacteristicFixedFieldAlgebraScalarTower + (F : LocalField K) (n : ℕ) : + IsScalarTower F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) := + IsScalarTower.of_algebraMap_eq' rfl + +/-- The completed Frobenius fixed field, viewed only as a subring of the +completed level. This lightweight projection lets ring-homomorphism +consumers avoid reconstructing the ambient Laurent-base algebra. -/ +noncomputable def equalCharacteristicCompletedFrobeniusFixedFieldSubring + (F : LocalField K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + Subring (equalCharacteristicCompletedLevelField F n) := + (equalCharacteristicCompletedFrobeniusFixedField F a n).toSubring + +/-- The canonical `k((T))`-algebra structure on the completed theta-intertwining theorem fixed +field. -/ +@[reducible] +noncomputable def equalCharacteristicCompletedFrobeniusFixedFieldAlgebra + (F : LocalField K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedFrobeniusFixedField F a n) := + Subalgebra.algebra + (equalCharacteristicCompletedFrobeniusFixedField F a n).toSubalgebra + +/-- The scalar action induced by the canonical `k((T))`-algebra structure on +the completed Frobenius fixed field. Naming it lets downstream files reuse +the same structure without asking typeclass search to unfold the fixed field. -/ +@[reducible] +noncomputable def equalCharacteristicCompletedFrobeniusFixedFieldSMul + (F : LocalField K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + SMul F.residueField⸨X⸩ + (equalCharacteristicCompletedFrobeniusFixedField F a n) := + @Algebra.toSMul _ _ _ _ + (equalCharacteristicCompletedFrobeniusFixedFieldAlgebra F a n) + +/-- The module structure induced by the canonical `k((T))`-algebra structure +on the completed Frobenius fixed field. -/ +@[reducible] +noncomputable def equalCharacteristicCompletedFrobeniusFixedFieldModule + (F : LocalField K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + Module F.residueField⸨X⸩ + (equalCharacteristicCompletedFrobeniusFixedField F a n) := + @Algebra.toModule _ _ _ _ + (equalCharacteristicCompletedFrobeniusFixedFieldAlgebra F a n) + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldCoefficientDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldCoefficientDescent.lean new file mode 100644 index 0000000000..48d71b64f1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldCoefficientDescent.lean @@ -0,0 +1,144 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPowerBasis +/-! +# The completed theta-intertwining theorem: coefficient descent in the completed fixed field + +Expansion in the direct-theta power basis turns Frobenius fixedness into +coefficientwise fixedness. The coefficients therefore descend from the +completed unramified field to the original Laurent base. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries Polynomial PowerSeries + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The completed base is a Laurent-series algebra through coefficient extension in the +fixed-field coefficient descent. -/ +noncomputable local instance + equalCharacteristicCompletedFrobeniusFixedFieldCoefficientDescentBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +/-- The completed level is a Laurent-series algebra through the base tower in the fixed-field +coefficient descent. -/ +noncomputable local instance + equalCharacteristicCompletedFrobeniusFixedFieldCoefficientDescentLevelAlgebra + (F : LocalField.{u, v} K) (n : ℕ) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedLevelField F n) := + RingHom.toAlgebra + ((algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)).comp + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField))) + +local instance + equalCharacteristicCompletedFrobeniusFixedFieldCoefficientDescentScalarTower + (F : LocalField.{u, v} K) (n : ℕ) : + IsScalarTower F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) := + IsScalarTower.of_algebraMap_eq' rfl + +/-- States the theorem `equalCharacteristicCompletedFrobenius_fixed_mem_adjoin_directTheta`. -/ +theorem equalCharacteristicCompletedFrobenius_fixed_mem_adjoin_directTheta + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) + (x : equalCharacteristicCompletedLevelField F n) + (hx : equalCharacteristicCompletedFrobeniusAlgEquiv F a n x = x) : + x ∈ IntermediateField.adjoin F.residueField⸨X⸩ + ({(equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n)} : + Set (equalCharacteristicCompletedLevelField F n)) := by + let A := equalCharacteristicCompletedUnramifiedField F.residueField + let E := equalCharacteristicCompletedLevelField F n + let phi := equalCharacteristicCompletedUnramifiedFrobenius F.residueField + let delta := equalCharacteristicCompletedFrobeniusAlgEquiv F a n + let y : E := equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n + let pb : PowerBasis A E := + equalCharacteristicDirectThetaCompletedPowerBasis F a n + let S : IntermediateField F.residueField⸨X⸩ E := + IntermediateField.adjoin F.residueField⸨X⸩ ({y} : Set E) + have hdeltaCoeff (c : A) : + delta (algebraMap A E c) = algebraMap A E (phi c) := by + change equalCharacteristicCompletedFrobeniusLiftEquiv F n a⁻¹ + (algebraMap A E c) = algebraMap A E + (equalCharacteristicCompletedUnramifiedFrobenius F.residueField c) + exact equalCharacteristicCompletedFrobeniusLiftEquiv_algebraMap F n a⁻¹ c + have hdeltaY : delta y = y := by + change equalCharacteristicCompletedFrobeniusAlgEquiv F a n + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : E) = _ + rw [equalCharacteristicCompletedFrobeniusAlgEquiv_apply] + exact equalCharacteristicCompletedFrobeniusLift_directThetaFixed F a n + have hdeltaBasis (i : Fin pb.dim) : + delta (pb.basis i) = pb.basis i := by + rw [pb.coe_basis, map_pow, show pb.gen = y by + exact equalCharacteristicDirectThetaCompletedPowerBasis_gen F a n, hdeltaY] + have hsemisum : + (∑ i : Fin pb.dim, phi (pb.basis.repr x i) • pb.basis i) = x := by + calc + (∑ i : Fin pb.dim, phi (pb.basis.repr x i) • pb.basis i) = + delta (∑ i : Fin pb.dim, pb.basis.repr x i • pb.basis i) := by + rw [map_sum] + apply Finset.sum_congr rfl + intro i hi + rw [Algebra.smul_def, Algebra.smul_def, map_mul, + hdeltaCoeff, hdeltaBasis] + _ = delta x := by rw [pb.basis.sum_repr] + _ = x := hx + have hcoeff (i : Fin pb.dim) : + phi (pb.basis.repr x i) = pb.basis.repr x i := by + have hrepr := congrArg pb.basis.repr hsemisum + have hi := congrArg (fun c ↦ c i) hrepr + simp only [map_sum, map_smul, Module.Basis.repr_self, + Finsupp.smul_single', mul_one] at hi + rw [Finsupp.finsetSum_apply] at hi + rw [Finset.sum_eq_single i] at hi + · simpa only [Finsupp.single_eq_same] using hi + · intro j hj hji + exact Finsupp.single_eq_of_ne hji.symm + · simp + change x ∈ S + rw [← pb.basis.sum_repr x] + apply S.sum_mem + intro i hi + rw [pb.coe_basis, Algebra.smul_def] + apply S.mul_mem + · rcases + (equalCharacteristicCompletedUnramifiedFrobenius_fixed_iff + (k := F.residueField) (pb.basis.repr x i)).1 (hcoeff i) with + ⟨c, hc⟩ + change algebraMap A E (pb.basis.repr x i) ∈ S + rw [← hc] + exact S.algebraMap_mem c + · have hgen : pb.gen ∈ S := by + rw [show pb.gen = y by + exact equalCharacteristicDirectThetaCompletedPowerBasis_gen F a n] + exact IntermediateField.mem_adjoin_simple_self F.residueField⸨X⸩ y + simpa using S.pow_mem hgen i.val + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldDegree.lean new file mode 100644 index 0000000000..7feac7668e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldDegree.lean @@ -0,0 +1,170 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldGeneration +/-! +# The completed theta-intertwining theorem: degree of the completed Frobenius fixed field + +The direct theta value has the changed primitive polynomial over `k((T))`. +Together with the fixed-field generation theorem this gives the exact extension degree `(q - 1) + q^n`. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries Polynomial PowerSeries + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The Laurent-series algebra structure on the completed base used to compute fixed-field +degrees. -/ +noncomputable local instance + equalCharacteristicCompletedFrobeniusFixedFieldDegreeBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +/-- The Laurent-series algebra structure on the completed level used to compute fixed-field +degrees. -/ +noncomputable local instance + equalCharacteristicCompletedFrobeniusFixedFieldDegreeLevelAlgebra + (F : LocalField.{u, v} K) (n : ℕ) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedLevelField F n) := + RingHom.toAlgebra + ((algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)).comp + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField))) + +local instance + equalCharacteristicCompletedFrobeniusFixedFieldDegreeScalarTower + (F : LocalField.{u, v} K) (n : ℕ) : + IsScalarTower F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) := + IsScalarTower.of_algebraMap_eq' rfl + +/-- The Frobenius fixed field inherits its Laurent-series algebra structure from its +intermediate-field inclusion. -/ +noncomputable local instance + equalCharacteristicCompletedFrobeniusFixedFieldDegreeAlgebra + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedFrobeniusFixedField F a n) := + Subalgebra.algebra + (equalCharacteristicCompletedFrobeniusFixedField F a n).toSubalgebra + +/-- Laurent-series scalar multiplication on the Frobenius fixed field agrees with its inherited +algebra structure. -/ +noncomputable local instance + equalCharacteristicCompletedFrobeniusFixedFieldDegreeSMul + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + SMul F.residueField⸨X⸩ + (equalCharacteristicCompletedFrobeniusFixedField F a n) := + @Algebra.toSMul _ _ _ _ + (equalCharacteristicCompletedFrobeniusFixedFieldDegreeAlgebra F a n) + +/-- The Frobenius fixed field is a module over residue-field Laurent series through its inherited +algebra structure. -/ +noncomputable local instance + equalCharacteristicCompletedFrobeniusFixedFieldDegreeModule + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + Module F.residueField⸨X⸩ + (equalCharacteristicCompletedFrobeniusFixedField F a n) := + @Algebra.toModule _ _ _ _ + (equalCharacteristicCompletedFrobeniusFixedFieldDegreeAlgebra F a n) + +private theorem + equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_isIntegral_laurentBase + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + IsIntegral F.residueField⸨X⸩ + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n) := by + refine ⟨equalCharacteristicChangedPrimitivePolynomial F a n, + equalCharacteristicChangedPrimitivePolynomial_monic F a n, ?_⟩ + rw [← Polynomial.eval_map] + exact equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_isRoot_target F a n + +private theorem + equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_minpoly_laurentBase + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + minpoly F.residueField⸨X⸩ + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n) = + equalCharacteristicChangedPrimitivePolynomial F a n := by + have hroot : Polynomial.aeval + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n) + (equalCharacteristicChangedPrimitivePolynomial F a n) = 0 := by + rw [Polynomial.aeval_def, ← Polynomial.eval_map] + exact equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_isRoot_target F a n + have hmin := minpoly.eq_of_irreducible + (equalCharacteristicChangedPrimitivePolynomial_irreducible F a n) hroot + rw [(equalCharacteristicChangedPrimitivePolynomial_monic F a n).leadingCoeff, + inv_one, Polynomial.C_1, mul_one] at hmin + exact hmin.symm + +/-- The fixed field has the exact degree of the target division level `n + 1`: +`[Sigma : k((T))] = (q - 1) q^n`. -/ +theorem equalCharacteristicCompletedFrobeniusFixedField_finrank + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + Module.finrank F.residueField⸨X⸩ + (equalCharacteristicCompletedFrobeniusFixedField F a n) = + (Nat.card F.residueField - 1) * Nat.card F.residueField ^ n := by + let E := IntermediateField.adjoin F.residueField⸨X⸩ + ({(equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n)} : + Set (equalCharacteristicCompletedLevelField F n)) + let EAlgebra : Algebra F.residueField⸨X⸩ E := + Subalgebra.algebra E.toSubalgebra + let ESMul : SMul F.residueField⸨X⸩ E := + @Algebra.toSMul _ _ _ _ EAlgebra + let EModule : Module F.residueField⸨X⸩ E := + @Algebra.toModule _ _ _ _ EAlgebra + have hfield : equalCharacteristicCompletedFrobeniusFixedField F a n = E := + equalCharacteristicCompletedFrobeniusFixedField_eq_adjoin_directTheta F a n + calc + Module.finrank F.residueField⸨X⸩ + (equalCharacteristicCompletedFrobeniusFixedField F a n) = + Module.finrank F.residueField⸨X⸩ E := + (IntermediateField.equivOfEq hfield).toLinearEquiv.finrank_eq + _ = (Nat.card F.residueField - 1) * Nat.card F.residueField ^ n := by + dsimp only [E] + rw [IntermediateField.adjoin.finrank + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_isIntegral_laurentBase + F a n), + equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_minpoly_laurentBase, + equalCharacteristicChangedPrimitivePolynomial_natDegree] + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldGeneration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldGeneration.lean new file mode 100644 index 0000000000..f2e0fe3031 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldGeneration.lean @@ -0,0 +1,94 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldCoefficientDescent +/-! +# The completed theta-intertwining theorem: generation of the completed Frobenius fixed field + +The coefficient-descent inclusion and the already proved fixedness of the +direct theta value identify the fixed field with its simple Laurent-base +extension. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries Polynomial PowerSeries + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The completed base carries the Laurent-series scalar extension used in the fixed-field +generation argument. -/ +noncomputable local instance + equalCharacteristicCompletedFrobeniusFixedFieldGenerationBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +/-- The completed level carries the Laurent-series algebra structure induced by the tower in the +generation argument. -/ +noncomputable local instance + equalCharacteristicCompletedFrobeniusFixedFieldGenerationLevelAlgebra + (F : LocalField.{u, v} K) (n : ℕ) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedLevelField F n) := + RingHom.toAlgebra + ((algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)).comp + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField))) + +local instance + equalCharacteristicCompletedFrobeniusFixedFieldGenerationScalarTower + (F : LocalField.{u, v} K) (n : ℕ) : + IsScalarTower F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) := + IsScalarTower.of_algebraMap_eq' rfl + +/-- The Frobenius fixed field is exactly the finite target Lubin--Tate level +generated by `theta(lambda)` inside the completed field. -/ +theorem equalCharacteristicCompletedFrobeniusFixedField_eq_adjoin_directTheta + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicCompletedFrobeniusFixedField F a n = + IntermediateField.adjoin F.residueField⸨X⸩ + ({(equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n)} : + Set (equalCharacteristicCompletedLevelField F n)) := by + apply le_antisymm + · intro x hx + apply equalCharacteristicCompletedFrobenius_fixed_mem_adjoin_directTheta F a n x + change x ∈ IntermediateField.fixedField + (equalCharacteristicCompletedFrobeniusSubgroup F a n) at hx + exact (IntermediateField.mem_fixedField_iff + (H := equalCharacteristicCompletedFrobeniusSubgroup F a n) x).1 hx + (equalCharacteristicCompletedFrobeniusAlgEquiv F a n) + (Subgroup.mem_zpowers _) + · apply IntermediateField.adjoin_le_iff.mpr + intro x hx + rw [Set.mem_singleton_iff] at hx + subst x + exact + equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_mem_fixedField + F a n + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPowerBasis.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPowerBasis.lean new file mode 100644 index 0000000000..422df29777 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPowerBasis.lean @@ -0,0 +1,71 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPrimitive +/-! +# The completed theta-intertwining theorem: the fixed primitive completed power basis + +The direct theta value supplies the power basis used to descend coefficients +of elements fixed by the prescribed completed Frobenius. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries Polynomial PowerSeries + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The completed base is a Laurent-series algebra through coefficient extension for the +fixed-field power-basis construction. -/ +noncomputable local instance + equalCharacteristicCompletedFrobeniusFixedFieldCompletedPowerBasisBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +/-- Defines `equalCharacteristicDirectThetaCompletedPowerBasis`. -/ +noncomputable def equalCharacteristicDirectThetaCompletedPowerBasis + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + PowerBasis (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) := by + apply PowerBasis.ofAdjoinEqTop + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_isIntegral_completedBase + F a n) + rw [← IntermediateField.adjoin_simple_toSubalgebra_of_isAlgebraic + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_isIntegral_completedBase + F a n).isAlgebraic, + equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_adjoin_completedBase_eq_top, + IntermediateField.top_toSubalgebra] + +/-- States the theorem `equalCharacteristicDirectThetaCompletedPowerBasis_gen`. -/ +@[simp] +theorem equalCharacteristicDirectThetaCompletedPowerBasis_gen + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicDirectThetaCompletedPowerBasis F a n).gen = + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n) := + PowerBasis.ofAdjoinEqTop_gen _ _ + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPrimitive.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPrimitive.lean new file mode 100644 index 0000000000..17b62a54e1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPrimitive.lean @@ -0,0 +1,154 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedPrimitiveAction +/-! +# The completed theta-intertwining theorem: the fixed-field primitive point over the completed base + +The direct theta value has the changed completed primitive polynomial as +its minimal polynomial over the completed maximal-unramified Laurent field. +Comparing degrees shows that this point generates the whole completed level. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries Polynomial PowerSeries + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The completed base carries the Laurent-series algebra structure used for the completed +primitive element. -/ +noncomputable local instance + equalCharacteristicCompletedFrobeniusFixedFieldCompletedPrimitiveBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +/-- Provides the instance `equalCharacteristicCompletedFrobeniusIdentificationLevelCharP`. -/ +instance equalCharacteristicCompletedFrobeniusIdentificationLevelCharP + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] (n : ℕ) : + CharP (equalCharacteristicCompletedLevelField F n) + F.residueCharacteristic := + equalCharacteristicDirectThetaCompletedLevelCharP F n + +private theorem equalCharacteristicDirectTargetCompletedPrimitivePolynomial_eq + (F : LocalField.{u, v} K) + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicChangedCompletedPrimitivePolynomial F a⁻¹ n = + (equalCharacteristicChangedPrimitivePolynomial F a n).map + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField)) := by + simp [equalCharacteristicChangedCompletedPrimitivePolynomial, + equalCharacteristicThetaSourceUnit] + +private theorem + equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_isRoot_targetCompleted + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + ((equalCharacteristicChangedCompletedPrimitivePolynomial F a⁻¹ n).map + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n))).IsRoot + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n) := by + rw [equalCharacteristicDirectTargetCompletedPrimitivePolynomial_eq, + Polynomial.map_map] + simpa [equalCharacteristicCompletedLevelBaseHom] using + equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_isRoot_target F a n + +/-- States the theorem +`equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_isIntegral_completedBase`. -/ +theorem + equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_isIntegral_completedBase + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + IsIntegral (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n) := by + refine ⟨equalCharacteristicChangedCompletedPrimitivePolynomial F a⁻¹ n, + equalCharacteristicChangedCompletedPrimitivePolynomial_monic F a⁻¹ n, ?_⟩ + rw [← Polynomial.eval_map] + exact + equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_isRoot_targetCompleted + F a n + +private theorem + equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_minpoly_completedBase + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + minpoly (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n) = + equalCharacteristicChangedCompletedPrimitivePolynomial F a⁻¹ n := by + have hroot : Polynomial.aeval + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n) + (equalCharacteristicChangedCompletedPrimitivePolynomial F a⁻¹ n) = 0 := by + rw [Polynomial.aeval_def, ← Polynomial.eval_map] + exact + equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_isRoot_targetCompleted + F a n + have hmin := minpoly.eq_of_irreducible + (equalCharacteristicChangedCompletedPrimitivePolynomial_irreducible F a⁻¹ n) + hroot + rw [(equalCharacteristicChangedCompletedPrimitivePolynomial_monic F a⁻¹ n).leadingCoeff, + inv_one, Polynomial.C_1, mul_one] at hmin + exact hmin.symm + +/-- The fixed target primitive point generates the standard completed level +over the completed maximal-unramified Laurent field. -/ +theorem + equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_adjoin_completedBase_eq_top + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + IntermediateField.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ({(equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n)} : + Set (equalCharacteristicCompletedLevelField F n)) = ⊤ := by + apply (Field.primitive_element_iff_minpoly_natDegree_eq + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n)).2 + rw [equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_minpoly_completedBase, + equalCharacteristicChangedCompletedPrimitivePolynomial_natDegree] + let pb := equalCharacteristicCompletedPrimitivePowerBasis F n + calc + (Nat.card F.residueField - 1) * Nat.card F.residueField ^ n = + (equalCharacteristicCompletedPrimitivePolynomial F n).natDegree := + (equalCharacteristicCompletedPrimitivePolynomial_natDegree F n).symm + _ = (minpoly (equalCharacteristicCompletedUnramifiedField F.residueField) + pb.gen).natDegree := by + rw [show pb.gen = equalCharacteristicCompletedPrimitiveRoot F n by + exact equalCharacteristicCompletedPrimitivePowerBasis_gen F n] + rw [equalCharacteristicCompletedPrimitiveRoot_minpoly] + _ = pb.dim := pb.natDegree_minpoly + _ = Module.finrank + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) := pb.finrank.symm + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedNorm.lean new file mode 100644 index 0000000000..3adae08b0f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedNorm.lean @@ -0,0 +1,232 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree +/-! +# The completed theta-intertwining theorem: the fixed-field prime element and its norm + +The fixed field of the prescribed completed Frobenius lift is the finite +Lubin--Tate level for the changed uniformizer `aT`. Under this +identification its generator is the distinguished element +`pi_delta = theta(lambda)`. Its minimal polynomial is the genuine changed +primitive Eisenstein polynomial, and the chosen sign convention gives +`N(-pi_delta) = aT`. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries Polynomial PowerSeries + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The completed unramified base is a Laurent-series algebra in the Frobenius fixed-field norm +comparison. -/ +noncomputable local instance equalCharacteristicCompletedFrobeniusFixedNormBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra (LaurentSeries F.residueField) + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +/-- The completed level is a Laurent-series algebra through the completed base in the fixed-field +norm comparison. -/ +noncomputable local instance equalCharacteristicCompletedFrobeniusFixedNormLevelAlgebra + (F : LocalField.{u, v} K) (n : ℕ) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedLevelField F n) := + RingHom.toAlgebra + ((algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)).comp + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField))) + +local instance equalCharacteristicCompletedFrobeniusFixedNormScalarTower + (F : LocalField.{u, v} K) (n : ℕ) : + IsScalarTower F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) := + IsScalarTower.of_algebraMap_eq' rfl + +/-- The changed level field inherits its Laurent-series algebra structure from the selected +separable closure. -/ +noncomputable local instance + equalCharacteristicCompletedFrobeniusFixedNormChangedLevelAlgebra + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + Algebra (LaurentSeries F.residueField) + (equalCharacteristicChangedLevelField F a n) := + letI : Algebra (LaurentSeries F.residueField) + (SeparableClosure (LaurentSeries F.residueField)) := + (separableClosure (LaurentSeries F.residueField) + (AlgebraicClosure (LaurentSeries F.residueField))).algebra' + Subalgebra.algebra + (equalCharacteristicChangedLevelField F a n).toSubalgebra + +/-- Laurent-series scalar multiplication on the changed level field uses its selected +separable-closure algebra structure. -/ +noncomputable local instance + equalCharacteristicCompletedFrobeniusFixedNormChangedLevelSMul + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + SMul (LaurentSeries F.residueField) + (equalCharacteristicChangedLevelField F a n) := + @Algebra.toSMul _ _ _ _ + (equalCharacteristicCompletedFrobeniusFixedNormChangedLevelAlgebra + F a n) + +/-- The changed level field is a Laurent-series module through its selected separable-closure +algebra structure. -/ +noncomputable local instance + equalCharacteristicCompletedFrobeniusFixedNormChangedLevelModule + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + Module (LaurentSeries F.residueField) + (equalCharacteristicChangedLevelField F a n) := + @Algebra.toModule _ _ _ _ + (equalCharacteristicCompletedFrobeniusFixedNormChangedLevelAlgebra + F a n) + +/-- The target `aT` Lubin--Tate level is the fixed field of the prescribed +completed Frobenius lift. -/ +noncomputable def equalCharacteristicCompletedFrobeniusTargetLevelEquiv + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicChangedLevelField F a n + ≃ₐ[LaurentSeries F.residueField] + equalCharacteristicCompletedFrobeniusFixedField F a n := by + let f := equalCharacteristicDirectTargetLevelFieldToFixedField F a n + letI : FiniteDimensional (LaurentSeries F.residueField) + (equalCharacteristicChangedLevelField F a n) := + equalCharacteristicChangedLevelField_finiteDimensional F a n + letI : FiniteDimensional (LaurentSeries F.residueField) + (equalCharacteristicCompletedFrobeniusFixedField F a n) := + FiniteDimensional.of_finrank_pos (by + rw [equalCharacteristicCompletedFrobeniusFixedField_finrank] + exact Nat.mul_pos + (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (Nat.pow_pos Nat.card_pos)) + apply AlgEquiv.ofBijective f + refine ⟨f.injective, ?_⟩ + have hdim : Module.finrank (LaurentSeries F.residueField) + (equalCharacteristicChangedLevelField F a n) = + Module.finrank (LaurentSeries F.residueField) + (equalCharacteristicCompletedFrobeniusFixedField F a n) := by + rw [equalCharacteristicChangedLevelField_finrank, + equalCharacteristicCompletedFrobeniusFixedField_finrank] + exact + (LinearMap.injective_iff_surjective_of_finrank_eq_finrank + (f := f.toLinearMap) hdim).mp + f.injective + +/-- States the theorem `equalCharacteristicCompletedFrobeniusTargetLevelEquiv_generator`. -/ +@[simp] +theorem equalCharacteristicCompletedFrobeniusTargetLevelEquiv_generator + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicCompletedFrobeniusTargetLevelEquiv F a n + (equalCharacteristicChangedLevelGenerator F a n) = + ⟨(equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n), + equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_mem_fixedField + F a n⟩ := by + simp only [equalCharacteristicCompletedFrobeniusTargetLevelEquiv] + exact equalCharacteristicDirectTargetLevelFieldToFixedField_generator F a n + +/-- The distinguished element `pi_delta = theta(lambda)`, regarded as an element of +the fixed field. -/ +noncomputable def equalCharacteristicCompletedFrobeniusPrimeElement + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicCompletedFrobeniusFixedField F a n := + ⟨(equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n), + equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_mem_fixedField + F a n⟩ + +/-- States the theorem `equalCharacteristicCompletedFrobeniusPrimeElement_eq_equiv_generator`. -/ +theorem equalCharacteristicCompletedFrobeniusPrimeElement_eq_equiv_generator + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicCompletedFrobeniusPrimeElement F a n = + equalCharacteristicCompletedFrobeniusTargetLevelEquiv F a n + (equalCharacteristicChangedLevelGenerator F a n) := by + rw [equalCharacteristicCompletedFrobeniusTargetLevelEquiv_generator] + rfl + +/-- The minimal polynomial of the fixed-field generator is precisely the +target primitive polynomial for `aT`. -/ +theorem equalCharacteristicCompletedFrobeniusPrimeElement_minpoly + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + minpoly (LaurentSeries F.residueField) + (equalCharacteristicCompletedFrobeniusPrimeElement F a n) = + equalCharacteristicChangedPrimitivePolynomial F a n := by + rw [equalCharacteristicCompletedFrobeniusPrimeElement_eq_equiv_generator, + minpoly.algEquiv_eq] + simpa [equalCharacteristicChangedLevelGenerator, + equalCharacteristicChangedLevelField, + IntermediateField.minpoly_gen] using + (equalCharacteristicChangedPrimitivePolynomial_eq_minpoly F a n).symm + +/-- The genuine integral minimal polynomial is Eisenstein at `(T)`. This is +the prime-element (uniformizer) certificate used in the proof of the completed + theta-intertwining theorem. -/ +theorem equalCharacteristicCompletedFrobeniusPrimeElement_eisenstein + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + (equalCharacteristicChangedIntegralPrimitivePolynomial F a n).IsEisensteinAt + (Ideal.span ({PowerSeries.X} : Set F.residueField⟦X⟧)) ∧ + (equalCharacteristicChangedIntegralPrimitivePolynomial F a n).map + (algebraMap F.residueField⟦X⟧ + (LaurentSeries F.residueField)) = + minpoly (LaurentSeries F.residueField) + (equalCharacteristicCompletedFrobeniusPrimeElement F a n) := by + constructor + · exact + equalCharacteristicChangedIntegralPrimitivePolynomial_isEisensteinAt + F a n + · change equalCharacteristicChangedPrimitivePolynomial F a n = + minpoly (LaurentSeries F.residueField) + (equalCharacteristicCompletedFrobeniusPrimeElement F a n) + exact (equalCharacteristicCompletedFrobeniusPrimeElement_minpoly F a n).symm + +/-- The completed theta-intertwining theorem, with the canonical sign: +`N_{Sigma/k((T))}(-pi_delta) = aT`. -/ +theorem equalCharacteristicCompletedFrobenius_norm_neg_primeElement + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + Algebra.norm (LaurentSeries F.residueField) + (-equalCharacteristicCompletedFrobeniusPrimeElement F a n) = + equalCharacteristicChangedLaurentUniformizer F a := by + rw [equalCharacteristicCompletedFrobeniusPrimeElement_eq_equiv_generator, + ← map_neg] + rw [Algebra.norm_eq_of_algEquiv] + exact equalCharacteristicChanged_norm_neg_levelGenerator F a n + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusLift.lean new file mode 100644 index 0000000000..e49e67915e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusLift.lean @@ -0,0 +1,316 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction +/-! +# The completed theta-intertwining theorem: a prescribed Frobenius lift on the completed level + +Arithmetic Frobenius on `(AlgebraicClosure κ)((T))` fixes the primitive +Lubin--Tate polynomial. Using its primitive power basis, we extend +Frobenius to the completed level while prescribing the image of the +primitive point to be a chosen unit bracket. The resulting semilinear field +endomorphism is surjective because that bracket is again a primitive +generator. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries Polynomial PowerSeries + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The completed unramified base carries coefficient-extension scalars for lifting Frobenius. -/ +noncomputable local instance equalCharacteristicCompletedFrobeniusLiftBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +/-- The ordinary completed-base algebra structure on the splitting field, +named explicitly so it can coexist with its Frobenius twist. -/ +@[reducible] +noncomputable def equalCharacteristicCompletedLevelOriginalAlgebra + (F : LocalField.{u, v} K) (n : ℕ) : + Algebra (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) := + inferInstance + +/-- The codomain algebra structure whose scalar map is arithmetic +Frobenius followed by the ordinary scalar inclusion. -/ +@[reducible] +noncomputable def equalCharacteristicCompletedLevelFrobeniusAlgebra + (F : LocalField.{u, v} K) (n : ℕ) : + Algebra (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) := + RingHom.toAlgebra + ((algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)).comp + (equalCharacteristicCompletedUnramifiedFrobenius F.residueField).toAlgHom.toRingHom) + +/-- The twisted level algebra map applies completed Frobenius before scalar extension. -/ +theorem equalCharacteristicCompletedLevelFrobeniusAlgebra_algebraMap + (F : LocalField.{u, v} K) (n : ℕ) + (a : equalCharacteristicCompletedUnramifiedField F.residueField) : + @algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + _ _ (equalCharacteristicCompletedLevelFrobeniusAlgebra F n) a = + algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + (equalCharacteristicCompletedUnramifiedFrobenius F.residueField a) := + rfl + +/-- Arithmetic Frobenius fixes the completed primitive polynomial because +all of its coefficients descend to `κ((T))`. -/ +theorem equalCharacteristicCompletedPrimitivePolynomial_frobenius + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicCompletedPrimitivePolynomial F n).map + (equalCharacteristicCompletedUnramifiedFrobenius F.residueField).toAlgHom.toRingHom = + equalCharacteristicCompletedPrimitivePolynomial F n := by + unfold equalCharacteristicCompletedPrimitivePolynomial + have hcomp : + ((equalCharacteristicCompletedUnramifiedFrobenius F.residueField).toAlgHom.toRingHom).comp + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField)) = + algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := by + apply RingHom.ext + intro a + exact + (equalCharacteristicCompletedUnramifiedFrobenius F.residueField).commutes a + rw [Polynomial.map_map, hcomp] + +/-- A unit bracket is a root of the primitive minimal polynomial for the +Frobenius-twisted codomain algebra structure. -/ +theorem equalCharacteristicCompletedUnitRoot_aeval_minpoly_frobenius + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + @Polynomial.aeval + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + _ _ (equalCharacteristicCompletedLevelFrobeniusAlgebra F n) + (equalCharacteristicCompletedUnitRoot F n a) + (minpoly (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedPrimitiveRoot F n)) = 0 := by + rw [equalCharacteristicCompletedPrimitiveRoot_minpoly] + change Polynomial.eval₂ + ((algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)).comp + (equalCharacteristicCompletedUnramifiedFrobenius F.residueField).toAlgHom.toRingHom) + (equalCharacteristicCompletedUnitRoot F n a) + (equalCharacteristicCompletedPrimitivePolynomial F n) = 0 + rw [← Polynomial.eval₂_map, + equalCharacteristicCompletedPrimitivePolynomial_frobenius] + rw [← Polynomial.eval_map] + exact equalCharacteristicCompletedUnitRoot_isRoot F n a + +/-- The semilinear algebra homomorphism extending arithmetic Frobenius and +sending the primitive point to the prescribed unit bracket. -/ +noncomputable def equalCharacteristicCompletedFrobeniusLiftAlgHom + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + @AlgHom + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + (equalCharacteristicCompletedLevelField F n) + _ _ _ + (equalCharacteristicCompletedLevelOriginalAlgebra F n) + (equalCharacteristicCompletedLevelFrobeniusAlgebra F n) := + @PowerBasis.lift + (equalCharacteristicCompletedLevelField F n) _ + (equalCharacteristicCompletedUnramifiedField F.residueField) _ + (equalCharacteristicCompletedLevelOriginalAlgebra F n) + (equalCharacteristicCompletedLevelField F n) _ + (equalCharacteristicCompletedLevelFrobeniusAlgebra F n) + (equalCharacteristicCompletedPrimitivePowerBasis F n) + (equalCharacteristicCompletedUnitRoot F n a) (by + rw [equalCharacteristicCompletedPrimitivePowerBasis_gen] + exact equalCharacteristicCompletedUnitRoot_aeval_minpoly_frobenius F n a) + +/-- The semilinear Frobenius homomorphism sends the primitive root to its unit transform. -/ +@[simp] +theorem equalCharacteristicCompletedFrobeniusLiftAlgHom_primitiveRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicCompletedFrobeniusLiftAlgHom F n a + (equalCharacteristicCompletedPrimitiveRoot F n) = + equalCharacteristicCompletedUnitRoot F n a := by + change equalCharacteristicCompletedFrobeniusLiftAlgHom F n a + (equalCharacteristicCompletedPrimitivePowerBasis F n).gen = _ + exact @PowerBasis.lift_gen + (equalCharacteristicCompletedLevelField F n) _ + (equalCharacteristicCompletedUnramifiedField F.residueField) _ + (equalCharacteristicCompletedLevelOriginalAlgebra F n) + (equalCharacteristicCompletedLevelField F n) _ + (equalCharacteristicCompletedLevelFrobeniusAlgebra F n) + (equalCharacteristicCompletedPrimitivePowerBasis F n) + (equalCharacteristicCompletedUnitRoot F n a) + (equalCharacteristicCompletedUnitRoot_aeval_minpoly_frobenius F n a) + +/-- The underlying field homomorphism of the prescribed Frobenius lift. -/ +noncomputable def equalCharacteristicCompletedFrobeniusLift + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicCompletedLevelField F n →+* + equalCharacteristicCompletedLevelField F n := + @AlgHom.toRingHom + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + (equalCharacteristicCompletedLevelField F n) + _ _ _ + (equalCharacteristicCompletedLevelOriginalAlgebra F n) + (equalCharacteristicCompletedLevelFrobeniusAlgebra F n) + (equalCharacteristicCompletedFrobeniusLiftAlgHom F n a) + +/-- The Frobenius lift acts on base scalars by completed Frobenius. -/ +@[simp] +theorem equalCharacteristicCompletedFrobeniusLift_algebraMap + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) + (b : equalCharacteristicCompletedUnramifiedField F.residueField) : + equalCharacteristicCompletedFrobeniusLift F n a + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) b) = + algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + (equalCharacteristicCompletedUnramifiedFrobenius F.residueField b) := by + change equalCharacteristicCompletedFrobeniusLiftAlgHom F n a + (@algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + _ _ (equalCharacteristicCompletedLevelOriginalAlgebra F n) b) = + @algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + _ _ (equalCharacteristicCompletedLevelFrobeniusAlgebra F n) b + exact @AlgHom.commutes + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + (equalCharacteristicCompletedLevelField F n) + _ _ _ + (equalCharacteristicCompletedLevelOriginalAlgebra F n) + (equalCharacteristicCompletedLevelFrobeniusAlgebra F n) + (equalCharacteristicCompletedFrobeniusLiftAlgHom F n a) b + +/-- The Frobenius lift sends the primitive root to the corresponding unit root. -/ +@[simp] +theorem equalCharacteristicCompletedFrobeniusLift_primitiveRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicCompletedFrobeniusLift F n a + (equalCharacteristicCompletedPrimitiveRoot F n) = + equalCharacteristicCompletedUnitRoot F n a := + by + change equalCharacteristicCompletedFrobeniusLiftAlgHom F n a + (equalCharacteristicCompletedPrimitiveRoot F n) = _ + exact equalCharacteristicCompletedFrobeniusLiftAlgHom_primitiveRoot F n a + +/-- The prescribed semilinear Frobenius lift is onto: its range contains +the whole completed base and the primitive generator given by the unit +bracket. -/ +theorem equalCharacteristicCompletedFrobeniusLift_surjective + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + Function.Surjective (equalCharacteristicCompletedFrobeniusLift F n a) := by + let A := equalCharacteristicCompletedUnramifiedField F.residueField + let E := equalCharacteristicCompletedLevelField F n + let δ : E →+* E := equalCharacteristicCompletedFrobeniusLift F n a + let R : Subring E := δ.range + have hbase (b : A) : algebraMap A E b ∈ R := by + refine ⟨algebraMap A E + ((equalCharacteristicCompletedUnramifiedFrobenius F.residueField).symm b), ?_⟩ + change δ (algebraMap A E + ((equalCharacteristicCompletedUnramifiedFrobenius F.residueField).symm b)) = + algebraMap A E b + rw [show δ = equalCharacteristicCompletedFrobeniusLift F n a by rfl, + equalCharacteristicCompletedFrobeniusLift_algebraMap, + (equalCharacteristicCompletedUnramifiedFrobenius + F.residueField).apply_symm_apply] + let S : Subalgebra A E := + { R with + algebraMap_mem' := hbase } + have hy : equalCharacteristicCompletedUnitRoot F n a ∈ S := by + refine ⟨equalCharacteristicCompletedPrimitiveRoot F n, ?_⟩ + exact equalCharacteristicCompletedFrobeniusLift_primitiveRoot F n a + have hle : + Algebra.adjoin A + ({equalCharacteristicCompletedUnitRoot F n a} : Set E) ≤ S := by + apply Algebra.adjoin_le + intro z hz + rw [Set.mem_singleton_iff] at hz + subst z + exact hy + rw [show Algebra.adjoin A + ({equalCharacteristicCompletedUnitRoot F n a} : Set E) = ⊤ by + exact equalCharacteristicCompletedUnitRoot_adjoin_eq_top F n a] at hle + have hS : S = ⊤ := top_unique hle + intro z + have hz : z ∈ S := by rw [hS]; trivial + exact hz + +/-- The actual field automorphism extending arithmetic Frobenius and acting +on the primitive point by the prescribed unit bracket. -/ +noncomputable def equalCharacteristicCompletedFrobeniusLiftEquiv + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicCompletedLevelField F n ≃+* + equalCharacteristicCompletedLevelField F n := + RingEquiv.ofBijective (equalCharacteristicCompletedFrobeniusLift F n a) + ⟨(equalCharacteristicCompletedFrobeniusLift F n a).injective, + equalCharacteristicCompletedFrobeniusLift_surjective F n a⟩ + +/-- The Frobenius lift equivalence acts on base scalars by completed Frobenius. -/ +@[simp] +theorem equalCharacteristicCompletedFrobeniusLiftEquiv_algebraMap + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) + (b : equalCharacteristicCompletedUnramifiedField F.residueField) : + equalCharacteristicCompletedFrobeniusLiftEquiv F n a + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) b) = + algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + (equalCharacteristicCompletedUnramifiedFrobenius F.residueField b) := + equalCharacteristicCompletedFrobeniusLift_algebraMap F n a b + +/-- The Frobenius lift equivalence sends the primitive root to its unit transform. -/ +@[simp] +theorem equalCharacteristicCompletedFrobeniusLiftEquiv_primitiveRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicCompletedFrobeniusLiftEquiv F n a + (equalCharacteristicCompletedPrimitiveRoot F n) = + equalCharacteristicCompletedUnitRoot F n a := + equalCharacteristicCompletedFrobeniusLift_primitiveRoot F n a + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean new file mode 100644 index 0000000000..9c7df6901e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean @@ -0,0 +1,736 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CompletedUnramifiedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField +public import Mathlib.Analysis.Normed.Unbundled.SpectralNorm +public import Mathlib.FieldTheory.SplittingField.Construction +/-! +# The completed theta-intertwining theorem: a completed Lubin--Tate level field + +Let `k` be the residue field and put `K∞ = (AlgebraicClosure k)((T))`. +This file base-changes the primitive Lubin--Tate polynomial to `K∞`, takes +its genuine splitting field, and equips that finite extension with the +spectral norm. A chosen primitive root is proved to lie in the maximal ideal +of the resulting complete valued field, hence is an actual analytic +evaluation point for the theta series of the completed theta-intertwining theorem. +-/ + +@[expose] public section + +noncomputable +section + +open Filter +open scoped LaurentSeries NNReal Polynomial PowerSeries Topology WithZero + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The coefficientwise algebra structure +`k((T)) → (AlgebraicClosure k)((T))`. -/ +noncomputable local instance equalCharacteristicCompletedLevelBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +/-- The completed unramified base has the residue characteristic. -/ +local instance equalCharacteristicCompletedLevelBaseCharP + (F : LocalField.{u, v} K) + : + CharP (equalCharacteristicCompletedUnramifiedField F.residueField) + F.residueCharacteristic := + charP_of_injective_algebraMap + (algebraMap F.residueField + (equalCharacteristicCompletedUnramifiedField F.residueField)).injective + F.residueCharacteristic + +/-- The Laurent valuation on the completed maximal-unramified base is +nontrivial, witnessed by `T`. -/ +theorem equalCharacteristicCompletedBaseValuationIsNontrivial + (k : Type v) [Field k] : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField k) ℤᵐ⁰).IsNontrivial := by + let L := equalCharacteristicCompletedUnramifiedField k + let x : L := equalCharacteristicCompletedUnramifiedFieldSingle k 1 1 + have hxv : (Valued.v : Valuation L ℤᵐ⁰) x = + WithZero.exp (-1 : ℤ) := by + change (Valued.v : Valuation (AlgebraicClosure k)⸨X⸩ ℤᵐ⁰) + (HahnSeries.single 1 1) = WithZero.exp (-1 : ℤ) + simpa using LaurentSeries.valuation_X_pow (AlgebraicClosure k) 1 + apply (Valuation.isNontrivial_iff_exists_lt_one + (Valued.v : Valuation L ℤᵐ⁰)).2 + refine ⟨x, ?_, ?_⟩ + · intro hx + have hzero : (Valued.v : Valuation L ℤᵐ⁰) x = 0 := by + rw [hx, map_zero] + rw [hxv] at hzero + exact WithZero.exp_ne_zero hzero + · rw [hxv, ← WithZero.exp_zero, WithZero.exp_lt_exp] + omega + +noncomputable local instance equalCharacteristicCompletedBaseValuationIsNontrivialInstance + (k : Type v) [Field k] : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField k) ℤᵐ⁰).IsNontrivial := + equalCharacteristicCompletedBaseValuationIsNontrivial k + +/-- The rank-one structure on the discrete Laurent valuation. -/ +@[implicit_reducible] +noncomputable def equalCharacteristicCompletedBaseValuationRankOne + (k : Type v) [Field k] : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField k) ℤᵐ⁰).RankOne := + WithZeroValuation.rankOneOfUnitsIsCyclic + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField k) ℤᵐ⁰) + +/-- The Laurent-series valuation on the completed unramified base has rank one. -/ +noncomputable local instance equalCharacteristicCompletedBaseValuationRankOneInstance + (k : Type v) [Field k] : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField k) ℤᵐ⁰).RankOne := + equalCharacteristicCompletedBaseValuationRankOne k + +/-- The norm on the completed-unramified Laurent field induced by its +rank-one valuation. -/ +@[reducible] noncomputable def equalCharacteristicCompletedBaseNormedField + (k : Type v) [Field k] : + NontriviallyNormedField + (equalCharacteristicCompletedUnramifiedField k) := + Valued.toNontriviallyNormedField + (L := equalCharacteristicCompletedUnramifiedField k) (Γ₀ := ℤᵐ⁰) + +/-- The completed unramified base carries the nontrivial norm associated with its Laurent-series +valuation. -/ +noncomputable local instance equalCharacteristicCompletedBaseNormedFieldInstance + (k : Type v) [Field k] : + NontriviallyNormedField + (equalCharacteristicCompletedUnramifiedField k) := + equalCharacteristicCompletedBaseNormedField k + +/-- The primitive level-`n+1` polynomial after coefficientwise base change +to `(AlgebraicClosure k)((T))`. -/ +noncomputable def equalCharacteristicCompletedPrimitivePolynomial + (F : LocalField.{u, v} K) (n : ℕ) : + Polynomial (equalCharacteristicCompletedUnramifiedField F.residueField) := + (equalCharacteristicLubinTatePrimitivePolynomial F n).map + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField)) + +/-- The completed primitive polynomial is monic. -/ +theorem equalCharacteristicCompletedPrimitivePolynomial_monic + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicCompletedPrimitivePolynomial F n).Monic := + (equalCharacteristicLubinTatePrimitivePolynomial_monic F n).map _ + +/-- The completed primitive polynomial has degree `(q - 1) * q ^ n`. -/ +theorem equalCharacteristicCompletedPrimitivePolynomial_natDegree + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicCompletedPrimitivePolynomial F n).natDegree = + (Nat.card F.residueField - 1) * Nat.card F.residueField ^ n := by + rw [equalCharacteristicCompletedPrimitivePolynomial, + (equalCharacteristicLubinTatePrimitivePolynomial_monic F n).natDegree_map, + equalCharacteristicLubinTatePrimitivePolynomial_natDegree] + +/-- The actual finite completed level field used to evaluate theta. -/ +def equalCharacteristicCompletedLevelField + (F : LocalField.{u, v} K) (n : ℕ) := + (equalCharacteristicCompletedPrimitivePolynomial F n).SplittingField + +/-- The splitting field of the completed primitive polynomial is a field. -/ +instance equalCharacteristicCompletedLevelFieldField + (F : LocalField.{u, v} K) (n : ℕ) : + Field (equalCharacteristicCompletedLevelField F n) := by + change Field (equalCharacteristicCompletedPrimitivePolynomial F n).SplittingField + infer_instance + +/-- The completed level field is an algebra over the completed unramified field. -/ +noncomputable instance equalCharacteristicCompletedLevelFieldAlgebra + (F : LocalField.{u, v} K) (n : ℕ) : + Algebra (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) := by + change Algebra (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedPrimitivePolynomial F n).SplittingField + infer_instance + +/-- The completed Lubin–Tate level is a Laurent-series algebra by composition through the +completed unramified base. -/ +noncomputable local instance equalCharacteristicCompletedLevelLaurentAlgebra + (F : LocalField.{u, v} K) (n : ℕ) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedLevelField F n) := + ((algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)).comp + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField))).toAlgebra + +noncomputable local instance equalCharacteristicCompletedLevelScalarTower + (F : LocalField.{u, v} K) (n : ℕ) : + IsScalarTower F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) := + IsScalarTower.of_algebraMap_eq' rfl + +/-- The completed Lubin–Tate level has the residue characteristic. -/ +local instance equalCharacteristicCompletedLevelCharP + (F : LocalField.{u, v} K) [CharP K F.residueCharacteristic] + (n : ℕ) : + CharP (equalCharacteristicCompletedLevelField F n) + F.residueCharacteristic := + charP_of_injective_algebraMap + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)).injective + F.residueCharacteristic + +section + +/-- The completed Lubin–Tate level is a module over its completed unramified base via the chosen +algebra structure. -/ +local instance equalCharacteristicCompletedLevelFieldModule + (F : LocalField.{u, v} K) (n : ℕ) : + @Module (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + (inferInstance : DivisionRing + (equalCharacteristicCompletedUnramifiedField F.residueField)).toRing.toSemiring + (inferInstance : AddCommGroup + (equalCharacteristicCompletedLevelField F n)).toAddCommMonoid := + @Algebra.toModule + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) _ _ + (equalCharacteristicCompletedLevelFieldAlgebra F n) + +/-- The completed level field is finite-dimensional over its completed base. -/ +instance equalCharacteristicCompletedLevelField_finiteDimensionalInstance + (F : LocalField.{u, v} K) (n : ℕ) : + FiniteDimensional + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) := by + change FiniteDimensional + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedPrimitivePolynomial F n).SplittingField + infer_instance + +/-- The completed level field is algebraic over its completed base. -/ +instance equalCharacteristicCompletedLevelField_isAlgebraic + (F : LocalField.{u, v} K) (n : ℕ) : + Algebra.IsAlgebraic + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) := + @Algebra.IsAlgebraic.of_finite + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) _ _ _ + (equalCharacteristicCompletedLevelFieldAlgebra F n) + (equalCharacteristicCompletedLevelField_finiteDimensionalInstance F n) + +/-- Comparison with the library splitting-field model. -/ +noncomputable def equalCharacteristicCompletedLevelFieldEquivSplittingField + (F : LocalField.{u, v} K) (n : ℕ) : + equalCharacteristicCompletedLevelField F n ≃ₐ[equalCharacteristicCompletedUnramifiedField + F.residueField] + (equalCharacteristicCompletedPrimitivePolynomial F n).SplittingField := + AlgEquiv.refl + +/-- Construct a named completed-level element from the splitting-field +model. -/ +noncomputable def equalCharacteristicCompletedLevelFieldOfSplittingField + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicCompletedPrimitivePolynomial F n).SplittingField →ₐ[ + equalCharacteristicCompletedUnramifiedField F.residueField] + equalCharacteristicCompletedLevelField F n := + (equalCharacteristicCompletedLevelFieldEquivSplittingField F n).symm.toAlgHom + +/-- The defining primitive polynomial splits over the named completed level +field. -/ +theorem equalCharacteristicCompletedPrimitivePolynomial_splits + (F : LocalField.{u, v} K) (n : ℕ) : + ((equalCharacteristicCompletedPrimitivePolynomial F n).map + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n))).Splits := by + exact Polynomial.SplittingField.splits + (equalCharacteristicCompletedPrimitivePolynomial F n) + +/-- The roots of the defining polynomial generate the named completed level +field. -/ +theorem equalCharacteristicCompletedPrimitivePolynomial_adjoin_rootSet + (F : LocalField.{u, v} K) (n : ℕ) : + Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ((equalCharacteristicCompletedPrimitivePolynomial F n).rootSet + (equalCharacteristicCompletedLevelField F n) : + Set (equalCharacteristicCompletedLevelField F n)) = ⊤ := by + exact Polynomial.SplittingField.adjoin_rootSet + (equalCharacteristicCompletedPrimitivePolynomial F n) + +/-- The completed level field is finite-dimensional over the completed +maximal-unramified Laurent field. -/ +theorem equalCharacteristicCompletedLevelField_finiteDimensional + (F : LocalField.{u, v} K) (n : ℕ) : + FiniteDimensional + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) := by + infer_instance + +private theorem equalCharacteristicCompletedPrimitivePolynomial_map_degree_ne_zero + (F : LocalField.{u, v} K) (n : ℕ) : + ((equalCharacteristicCompletedPrimitivePolynomial F n).map + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n))).degree ≠ 0 := by + have hmonic := (equalCharacteristicCompletedPrimitivePolynomial_monic F n).map + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)) + rw [Polynomial.degree_eq_natDegree hmonic.ne_zero, + (equalCharacteristicCompletedPrimitivePolynomial_monic F n).natDegree_map, + equalCharacteristicCompletedPrimitivePolynomial_natDegree] + exact_mod_cast (Nat.mul_pos + (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (Nat.pow_pos Nat.card_pos)).ne' + +/-- A chosen primitive root in the completed level field. -/ +noncomputable def equalCharacteristicCompletedPrimitiveRoot + (F : LocalField.{u, v} K) (n : ℕ) : + equalCharacteristicCompletedLevelField F n := + equalCharacteristicCompletedLevelFieldOfSplittingField F n + (Polynomial.rootOfSplits + (Polynomial.SplittingField.splits + (equalCharacteristicCompletedPrimitivePolynomial F n)) + (by exact equalCharacteristicCompletedPrimitivePolynomial_map_degree_ne_zero F n)) + +/-- The chosen element is a root of the base-changed primitive polynomial. +-/ +theorem equalCharacteristicCompletedPrimitiveRoot_isRoot + (F : LocalField.{u, v} K) (n : ℕ) : + ((equalCharacteristicCompletedPrimitivePolynomial F n).map + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n))).IsRoot + (equalCharacteristicCompletedPrimitiveRoot F n) := by + exact Polynomial.eval_rootOfSplits + (Polynomial.SplittingField.splits + (equalCharacteristicCompletedPrimitivePolynomial F n)) + (equalCharacteristicCompletedPrimitivePolynomial_map_degree_ne_zero F n) + +/-- The spectral norm on the finite completed level field. -/ +@[reducible] noncomputable def equalCharacteristicCompletedLevelNormedField + (F : LocalField.{u, v} K) (n : ℕ) : + NontriviallyNormedField (equalCharacteristicCompletedLevelField F n) := + spectralNorm.nontriviallyNormedField + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + +/-- The completed Lubin–Tate level carries the spectral norm extending the norm on its completed +base. -/ +noncomputable local instance equalCharacteristicCompletedLevelNormedFieldInstance + (F : LocalField.{u, v} K) (n : ℕ) : + NontriviallyNormedField (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelNormedField F n + +/-- The spectral norm is nonarchimedean. -/ +theorem equalCharacteristicCompletedLevelIsUltrametric + (F : LocalField.{u, v} K) (n : ℕ) : + IsUltrametricDist (equalCharacteristicCompletedLevelField F n) := + ⟨fun x y z ↦ by + rw [dist_eq_norm, dist_eq_norm, dist_eq_norm] + rw [← sub_add_sub_cancel x y z] + exact isNonarchimedean_spectralNorm + (K := equalCharacteristicCompletedUnramifiedField F.residueField) + (L := equalCharacteristicCompletedLevelField F n) + (x - y) (y - z)⟩ + +noncomputable local instance equalCharacteristicCompletedLevelIsUltrametricInstance + (F : LocalField.{u, v} K) (n : ℕ) : + IsUltrametricDist (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelIsUltrametric F n + +/-- Finite dimensionality makes the spectral level field complete. -/ +theorem equalCharacteristicCompletedLevelCompleteSpace + (F : LocalField.{u, v} K) (n : ℕ) : + CompleteSpace (equalCharacteristicCompletedLevelField F n) := + spectralNorm.completeSpace + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + +noncomputable local instance equalCharacteristicCompletedLevelCompleteSpaceInstance + (F : LocalField.{u, v} K) (n : ℕ) : + CompleteSpace (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelCompleteSpace F n + +/-- The valuation attached to the spectral norm. -/ +@[reducible] noncomputable def equalCharacteristicCompletedLevelValued + (F : LocalField.{u, v} K) (n : ℕ) : + Valued (equalCharacteristicCompletedLevelField F n) ℝ≥0 := + NormedField.toValued (K := equalCharacteristicCompletedLevelField F n) + +/-- The completed Lubin–Tate level carries the real-valued valuation associated with its spectral +norm. -/ +noncomputable local instance equalCharacteristicCompletedLevelValuedInstance + (F : LocalField.{u, v} K) (n : ℕ) : + Valued (equalCharacteristicCompletedLevelField F n) ℝ≥0 := + equalCharacteristicCompletedLevelValued F n + +/-- The Laurent parameter in the completed maximal-unramified base. -/ +noncomputable def equalCharacteristicCompletedBaseUniformizer + (F : LocalField.{u, v} K) : + equalCharacteristicCompletedUnramifiedField F.residueField := + equalCharacteristicCompletedUnramifiedFieldSingle F.residueField 1 1 + +/-- Coefficientwise base change fixes the Laurent parameter. -/ +theorem equalCharacteristicCompletedBase_algebraMap_uniformizer + (F : LocalField.{u, v} K) : + algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicLaurentUniformizer F) = + equalCharacteristicCompletedBaseUniformizer F := by + apply + (equalCharacteristicCompletedUnramifiedFieldEquivLaurentSeries + F.residueField).injective + change + laurentSeriesCoefficientMap + (algebraMap F.residueField (AlgebraicClosure F.residueField)) + (equalCharacteristicLaurentUniformizer F) = + HahnSeries.single 1 1 + ext m + cases m with + | ofNat i => + by_cases hi : i = 1 + · subst i + simp [equalCharacteristicLaurentUniformizer, + laurentSeriesCoefficientMap] + · simp [equalCharacteristicLaurentUniformizer, + laurentSeriesCoefficientMap, HahnSeries.coeff_single_of_ne, hi] + | negSucc i => + simp [equalCharacteristicLaurentUniformizer, + laurentSeriesCoefficientMap] + +/-- The completed-base Laurent parameter has norm strictly less than one. +-/ +theorem equalCharacteristicCompletedBaseUniformizer_norm_lt_one + (F : LocalField.{u, v} K) : + ‖equalCharacteristicCompletedBaseUniformizer F‖ < 1 := by + rw [Valued.toNormedField.norm_lt_one_iff, + equalCharacteristicCompletedBaseUniformizer] + have hxv : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField F.residueField) ℤᵐ⁰) + (equalCharacteristicCompletedUnramifiedFieldSingle + F.residueField 1 1) = WithZero.exp (-1 : ℤ) := by + change (Valued.v : + Valuation (AlgebraicClosure F.residueField)⸨X⸩ ℤᵐ⁰) + (HahnSeries.single 1 1) = WithZero.exp (-1 : ℤ) + simpa using + LaurentSeries.valuation_X_pow (AlgebraicClosure F.residueField) 1 + rw [hxv, ← WithZero.exp_zero, WithZero.exp_lt_exp] + omega + +/-- The image of `T` in the completed level field. -/ +noncomputable def equalCharacteristicCompletedLevelUniformizer + (F : LocalField.{u, v} K) (n : ℕ) : + equalCharacteristicCompletedLevelField F n := + algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + (equalCharacteristicCompletedBaseUniformizer F) + +/-- The spectral norm extends the norm of the completed-unramified base. -/ +theorem equalCharacteristicCompletedLevelUniformizer_norm + (F : LocalField.{u, v} K) (n : ℕ) : + ‖equalCharacteristicCompletedLevelUniformizer F n‖ = + ‖equalCharacteristicCompletedBaseUniformizer F‖ := by + change spectralNorm + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + (equalCharacteristicCompletedBaseUniformizer F)) = _ + exact spectralNorm_extends _ + +/-- The completed level uniformizer has norm strictly below one. -/ +theorem equalCharacteristicCompletedLevelUniformizer_norm_lt_one + (F : LocalField.{u, v} K) (n : ℕ) : + ‖equalCharacteristicCompletedLevelUniformizer F n‖ < 1 := by + rw [equalCharacteristicCompletedLevelUniformizer_norm] + exact equalCharacteristicCompletedBaseUniformizer_norm_lt_one F + +/-- The chosen root satisfies the genuine primitive Lubin--Tate equation +over the completed-unramified base. -/ +theorem equalCharacteristicCompletedPrimitiveRoot_equation + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicCompletedLevelUniformizer F n) n + (equalCharacteristicCompletedPrimitiveRoot F n) ^ + (Nat.card F.residueField - 1) + + equalCharacteristicCompletedLevelUniformizer F n = 0 := by + have hroot := equalCharacteristicCompletedPrimitiveRoot_isRoot F n + change Polynomial.eval + (equalCharacteristicCompletedPrimitiveRoot F n) + (((equalCharacteristicLubinTatePrimitivePolynomial F n).map + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField))).map + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n))) = 0 at hroot + rw [Polynomial.map_map, Polynomial.eval_map, + equalCharacteristicLubinTatePrimitivePolynomial_eval₂] at hroot + have ht : + ((algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)).comp + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField))) + (equalCharacteristicLaurentUniformizer F) = + equalCharacteristicCompletedLevelUniformizer F n := by + rw [RingHom.comp_apply, + equalCharacteristicCompletedBase_algebraMap_uniformizer] + rfl + rwa [ht] at hroot + +/-- The original separable-closure level field embeds into the completed +level field, sending its primitive generator to the chosen completed root. +-/ +noncomputable def equalCharacteristicLubinTateLevelFieldToCompleted + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicLubinTateLevelField F n →ₐ[F.residueField⸨X⸩] + equalCharacteristicCompletedLevelField F n := by + have hrootAeval : Polynomial.aeval + (equalCharacteristicCompletedPrimitiveRoot F n) + (minpoly F.residueField⸨X⸩ + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n)) = 0 := by + rw [← equalCharacteristicLubinTatePrimitivePolynomial_eq_minpoly] + rw [Polynomial.aeval_def, + IsScalarTower.algebraMap_eq F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)] + have hc := equalCharacteristicCompletedPrimitiveRoot_isRoot F n + change Polynomial.eval + (equalCharacteristicCompletedPrimitiveRoot F n) + (((equalCharacteristicLubinTatePrimitivePolynomial F n).map + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField))).map + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n))) = 0 at hc + rwa [Polynomial.map_map, Polynomial.eval_map] at hc + let baseHom : + F.residueField⸨X⸩ →ₐ[F.residueField⸨X⸩] + equalCharacteristicCompletedLevelField F n := + Algebra.ofId F.residueField⸨X⸩ + (equalCharacteristicCompletedLevelField F n) + have hroot : + Polynomial.eval₂ baseHom + (equalCharacteristicCompletedPrimitiveRoot F n) + (minpoly F.residueField⸨X⸩ + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n)) = 0 := by + simpa only [baseHom, Polynomial.aeval_def, Algebra.toRingHom_ofId] using hrootAeval + let lift : + AdjoinRoot (minpoly F.residueField⸨X⸩ + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n)) →ₐ[F.residueField⸨X⸩] + equalCharacteristicCompletedLevelField F n := + AdjoinRoot.liftAlgHom _ baseHom + (equalCharacteristicCompletedPrimitiveRoot F n) hroot + exact lift.comp + (IntermediateField.adjoinRootEquivAdjoin F.residueField⸨X⸩ + (chosenEqualCharacteristicLubinTatePrimitiveRoot_isIntegral F n)).symm.toAlgHom + +/-- The canonical finite-level embedding sends its simple-extension generator +to the chosen primitive root in the completed level field. -/ +@[simp] +theorem equalCharacteristicLubinTateLevelFieldToCompleted_generator + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicLubinTateLevelFieldToCompleted F n + (IntermediateField.AdjoinSimple.gen F.residueField⸨X⸩ + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n)) = + equalCharacteristicCompletedPrimitiveRoot F n := by + rw [equalCharacteristicLubinTateLevelFieldToCompleted, AlgHom.comp_apply] + have hgen : + (IntermediateField.adjoinRootEquivAdjoin F.residueField⸨X⸩ + (chosenEqualCharacteristicLubinTatePrimitiveRoot_isIntegral F n)).symm.toAlgHom + (IntermediateField.AdjoinSimple.gen F.residueField⸨X⸩ + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n)) = + AdjoinRoot.root + (minpoly F.residueField⸨X⸩ + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n)) := + IntermediateField.adjoinRootEquivAdjoin_symm_apply_gen + F.residueField⸨X⸩ + (chosenEqualCharacteristicLubinTatePrimitiveRoot_isIntegral F n) + rw [hgen, AdjoinRoot.liftAlgHom_root] + +/-- If `x` has norm at least one, then `e(x) = x^q + Tx` has the +same norm as its leading term. -/ +private theorem equalCharacteristicCompletedAmbientPiEnd_norm_of_one_le + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (x : equalCharacteristicCompletedLevelField F n) + (hx : 1 ≤ ‖x‖) : + ‖equalCharacteristicLubinTateAmbientPiEnd F + (equalCharacteristicCompletedLevelUniformizer F n) x‖ = + ‖x‖ ^ Nat.card F.residueField := by + have hxpos : 0 < ‖x‖ := lt_of_lt_of_le zero_lt_one hx + have hqpos : 0 < Nat.card F.residueField := Nat.card_pos + have hself : ‖x‖ ≤ ‖x‖ ^ Nat.card F.residueField := by + calc + ‖x‖ = 1 * ‖x‖ := (one_mul _).symm + _ ≤ ‖x‖ ^ (Nat.card F.residueField - 1) * ‖x‖ := + mul_le_mul_of_nonneg_right + (by + exact one_le_pow₀ hx) + (norm_nonneg x) + _ = ‖x‖ ^ Nat.card F.residueField := by + rw [← pow_succ, + Nat.sub_add_cancel (Nat.one_le_iff_ne_zero.mpr hqpos.ne')] + have hterms : + ‖equalCharacteristicCompletedLevelUniformizer F n * x‖ < + ‖x ^ Nat.card F.residueField‖ := by + rw [norm_mul, norm_pow] + calc + ‖equalCharacteristicCompletedLevelUniformizer F n‖ * ‖x‖ < + 1 * ‖x‖ := + mul_lt_mul_of_pos_right + (equalCharacteristicCompletedLevelUniformizer_norm_lt_one F n) + hxpos + _ = ‖x‖ := one_mul _ + _ ≤ ‖x‖ ^ Nat.card F.residueField := hself + rw [equalCharacteristicLubinTateAmbientPiEnd_apply, + IsUltrametricDist.norm_add_eq_max_of_norm_ne_norm (ne_of_gt hterms), + max_eq_left hterms.le, norm_pow] + +/-- Above the unit sphere, every Lubin--Tate iterate has the norm of its +leading `q`-power term. -/ +private theorem equalCharacteristicCompletedAmbientPiIterate_norm_of_one_le + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (level i : ℕ) (x : equalCharacteristicCompletedLevelField F level) + (hx : 1 ≤ ‖x‖) : + ‖equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicCompletedLevelUniformizer F level) i x‖ = + ‖x‖ ^ (Nat.card F.residueField ^ i) := by + induction i generalizing x with + | zero => + rw [equalCharacteristicLubinTateAmbientPiIterate] + rw [pow_zero] + rw [pow_zero] + rw [pow_one] + rfl + | succ i ih => + have hend := equalCharacteristicCompletedAmbientPiEnd_norm_of_one_le + F level x hx + have hnext : 1 ≤ + ‖equalCharacteristicLubinTateAmbientPiEnd F + (equalCharacteristicCompletedLevelUniformizer F level) x‖ := by + rw [hend] + exact one_le_pow₀ hx + rw [equalCharacteristicLubinTateAmbientPiIterate_succ, + ih _ hnext, hend, ← pow_mul] + congr 1 + rw [pow_succ, Nat.mul_comm] + +/-- The primitive root lies strictly inside the unit ball. This follows +directly from its Lubin--Tate equation and the spectral norm. -/ +theorem equalCharacteristicCompletedPrimitiveRoot_norm_lt_one + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + ‖equalCharacteristicCompletedPrimitiveRoot F n‖ < 1 := by + by_contra hnot + have hrootge : 1 ≤ ‖equalCharacteristicCompletedPrimitiveRoot F n‖ := + le_of_not_gt hnot + let z : equalCharacteristicCompletedLevelField F n := + equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicCompletedLevelUniformizer F n) n + (equalCharacteristicCompletedPrimitiveRoot F n) + have hznorm : ‖z‖ = + ‖equalCharacteristicCompletedPrimitiveRoot F n‖ ^ + (Nat.card F.residueField ^ n) := + equalCharacteristicCompletedAmbientPiIterate_norm_of_one_le + F n n (equalCharacteristicCompletedPrimitiveRoot F n) hrootge + have hzge : 1 ≤ ‖z‖ := by + rw [hznorm] + exact one_le_pow₀ hrootge + have hzpowge : 1 ≤ ‖z ^ (Nat.card F.residueField - 1)‖ := by + rw [norm_pow] + exact one_le_pow₀ hzge + have heq := equalCharacteristicCompletedPrimitiveRoot_equation F n + change z ^ (Nat.card F.residueField - 1) + + equalCharacteristicCompletedLevelUniformizer F n = 0 at heq + have hnormeq : ‖z ^ (Nat.card F.residueField - 1)‖ = + ‖equalCharacteristicCompletedLevelUniformizer F n‖ := by + rw [eq_neg_of_add_eq_zero_left heq, norm_neg] + rw [hnormeq] at hzpowge + exact (not_le_of_gt + (equalCharacteristicCompletedLevelUniformizer_norm_lt_one F n)) hzpowge + +/-- The primitive root lifted to the spectral valuation ring. -/ +noncomputable def equalCharacteristicCompletedPrimitiveRootInteger + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Valued.integer (equalCharacteristicCompletedLevelField F n) := + ⟨equalCharacteristicCompletedPrimitiveRoot F n, by + change ‖equalCharacteristicCompletedPrimitiveRoot F n‖₊ ≤ 1 + exact_mod_cast + (equalCharacteristicCompletedPrimitiveRoot_norm_lt_one F n).le⟩ + +/-- Coercing the integral primitive root returns the underlying completed root. -/ +@[simp] +theorem equalCharacteristicCompletedPrimitiveRootInteger_coe + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + ((equalCharacteristicCompletedPrimitiveRootInteger F n : + Valued.integer (equalCharacteristicCompletedLevelField F n)) : + equalCharacteristicCompletedLevelField F n) = + equalCharacteristicCompletedPrimitiveRoot F n := + rfl + +/-- The integral primitive root belongs to the maximal ideal. -/ +theorem equalCharacteristicCompletedPrimitiveRootInteger_mem_maximalIdeal + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicCompletedPrimitiveRootInteger F n ∈ + Valued.maximalIdeal (equalCharacteristicCompletedLevelField F n) := by + change equalCharacteristicCompletedPrimitiveRootInteger F n ∈ + IsLocalRing.maximalIdeal + (Valued.integer (equalCharacteristicCompletedLevelField F n)) + apply (Valuation.mem_maximalIdeal_iff + (equalCharacteristicCompletedLevelField F n) + (Valued.v : Valuation (equalCharacteristicCompletedLevelField F n) ℝ≥0)).2 + change ‖equalCharacteristicCompletedPrimitiveRoot F n‖₊ < 1 + exact_mod_cast equalCharacteristicCompletedPrimitiveRoot_norm_lt_one F n + +/-- The primitive root is a genuine analytic evaluation point for outer +power series over the completed level integer ring. -/ +theorem equalCharacteristicCompletedPrimitiveRootInteger_hasEval + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + PowerSeries.HasEval + (equalCharacteristicCompletedPrimitiveRootInteger F n) := by + change Tendsto + (fun i : ℕ ↦ equalCharacteristicCompletedPrimitiveRootInteger F n ^ i) + atTop (nhds 0) + apply tendsto_pow_atTop_nhds_zero_of_norm_lt_one + change ‖equalCharacteristicCompletedPrimitiveRoot F n‖ < 1 + exact equalCharacteristicCompletedPrimitiveRoot_norm_lt_one F n + +end + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveAction.lean new file mode 100644 index 0000000000..c34a760a44 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveAction.lean @@ -0,0 +1,564 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters +/-! +# The completed theta-intertwining theorem: primitive division points in the completed level + +The completed level used in the proof of the completed theta-intertwining theorem is the + splitting field of the +base-changed primitive division polynomial. This file records that its chosen +root is genuinely primitive of level `n + 1`: it is killed by the next +Lubin--Tate iterate, but not by the preceding one. These statements are the +algebraic input for extending arithmetic Frobenius to the completed level. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries Polynomial PowerSeries + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +attribute [local instance] equalCharacteristicCompletedLevelCharP + +/-- The coefficientwise Laurent-series algebra used by the completed +unramified base. It is kept local so importing this file does not change +global type-class search. -/ +noncomputable local instance equalCharacteristicCompletedPrimitiveActionBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +/-- The coefficientwise Laurent base map into the completed level field. -/ +noncomputable def equalCharacteristicCompletedLevelBaseHom + (F : LocalField.{u, v} K) (n : ℕ) : + F.residueField⸨X⸩ →+* + equalCharacteristicCompletedLevelField F n := + (algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)).comp + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField)) + +/-- The residue-field coefficient map into the completed level. -/ +noncomputable def equalCharacteristicCompletedLevelResidueHom + (F : LocalField.{u, v} K) (n : ℕ) : + F.residueField →+* equalCharacteristicCompletedLevelField F n := + (equalCharacteristicCompletedLevelBaseHom F n).comp + (algebraMap F.residueField F.residueField⸨X⸩) + +/-- States the theorem `equalCharacteristicCompletedLevelBaseHom_uniformizer`. -/ +@[simp] +theorem equalCharacteristicCompletedLevelBaseHom_uniformizer + (F : LocalField.{u, v} K) (n : ℕ) : + equalCharacteristicCompletedLevelBaseHom F n + (equalCharacteristicLaurentUniformizer F) = + equalCharacteristicCompletedLevelUniformizer F n := by + rw [equalCharacteristicCompletedLevelBaseHom, RingHom.comp_apply, + equalCharacteristicCompletedBase_algebraMap_uniformizer] + rfl + +/-- The chosen root in the completed splitting field is killed at level +`n + 1`. -/ +theorem equalCharacteristicCompletedPrimitiveRoot_torsion + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + IsEqualCharacteristicLubinTateAmbientTorsion F + (equalCharacteristicCompletedLevelUniformizer F n) (n + 1) + (equalCharacteristicCompletedPrimitiveRoot F n) := by + let t := equalCharacteristicCompletedLevelUniformizer F n + let x := equalCharacteristicCompletedPrimitiveRoot F n + let y := equalCharacteristicLubinTateAmbientPiIterate F t n x + have heq : y ^ (Nat.card F.residueField - 1) + t = 0 := by + simpa only [t, x, y] using + (equalCharacteristicCompletedPrimitiveRoot_equation F n) + change equalCharacteristicLubinTateAmbientPiIterate F t (n + 1) x = 0 + rw [equalCharacteristicLubinTateAmbientPiIterate_succ, + ← equalCharacteristicLubinTateAmbientPiEnd_iterate] + change equalCharacteristicLubinTateAmbientPiEnd F t y = 0 + rw [equalCharacteristicLubinTateAmbientPiEnd_apply] + calc + y ^ Nat.card F.residueField + t * y = + y * (y ^ (Nat.card F.residueField - 1) + t) := by + rw [mul_add, mul_comm t y, ← pow_succ'] + rw [Nat.sub_add_cancel + (Nat.one_le_iff_ne_zero.mpr Nat.card_pos.ne')] + _ = 0 := by rw [heq, mul_zero] + +/-- The chosen completed root is not already killed at level `n`. -/ +theorem equalCharacteristicCompletedPrimitiveRoot_not_torsion_pred + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + ¬ IsEqualCharacteristicLubinTateAmbientTorsion F + (equalCharacteristicCompletedLevelUniformizer F n) n + (equalCharacteristicCompletedPrimitiveRoot F n) := by + intro hpred + have heq := equalCharacteristicCompletedPrimitiveRoot_equation F n + rw [hpred, zero_pow, zero_add] at heq + · have hne : + equalCharacteristicCompletedLevelBaseHom F n + (equalCharacteristicLaurentUniformizer F) ≠ + equalCharacteristicCompletedLevelBaseHom F n 0 := + (equalCharacteristicCompletedLevelBaseHom F n).injective.ne + (equalCharacteristicLaurentUniformizer_ne_zero F) + exact hne (by simpa using heq) + · exact Nat.sub_ne_zero_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField) + +/-- In particular, the chosen completed primitive point is nonzero. -/ +theorem equalCharacteristicCompletedPrimitiveRoot_ne_zero + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicCompletedPrimitiveRoot F n ≠ 0 := by + intro hzero + apply equalCharacteristicCompletedPrimitiveRoot_not_torsion_pred F n + change equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicCompletedLevelUniformizer F n) n + (equalCharacteristicCompletedPrimitiveRoot F n) = 0 + rw [hzero, map_zero] + +/-- The bracket image of the completed primitive point attached to a +power-series unit. -/ +noncomputable def equalCharacteristicCompletedUnitRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicCompletedLevelField F n := + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicCompletedLevelResidueHom F n) + (equalCharacteristicCompletedLevelUniformizer F n) (n + 1) + (a : F.residueField⟦X⟧) + (equalCharacteristicCompletedPrimitiveRoot F n) + +/-- Every unit bracket of the chosen completed point is again a root of the +completed primitive polynomial. -/ +theorem equalCharacteristicCompletedUnitRoot_isRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + ((equalCharacteristicCompletedPrimitivePolynomial F n).map + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n))).IsRoot + (equalCharacteristicCompletedUnitRoot F n a) := by + let z := equalCharacteristicCompletedUnitRoot F n a + let x := equalCharacteristicCompletedPrimitiveRoot F n + let t := equalCharacteristicCompletedLevelUniformizer F n + let ι := equalCharacteristicCompletedLevelResidueHom F n + let c := PowerSeries.coeff 0 (a : F.residueField⟦X⟧) + have hc : c ≠ 0 := powerSeries_unit_coeff_zero_ne_zero a + have hcpow : c ^ (Nat.card F.residueField - 1) = 1 := by + let := Fintype.ofFinite F.residueField + simpa only [Nat.card_eq_fintype_card] using + FiniteField.pow_card_sub_one_eq_one c hc + have hziterate : + equalCharacteristicLubinTateAmbientPiIterate F t n z = + ι c * equalCharacteristicLubinTateAmbientPiIterate F t n x := by + simpa [z, x, t, ι, c, equalCharacteristicCompletedUnitRoot] using + equalCharacteristicLubinTateAmbientPrimitive_iterate_bracket F + (equalCharacteristicCompletedLevelResidueHom F n) + (equalCharacteristicCompletedLevelUniformizer F n) n + (a : F.residueField⟦X⟧) + (equalCharacteristicCompletedPrimitiveRoot F n) + (equalCharacteristicCompletedPrimitiveRoot_torsion F n) + have hxEquation := equalCharacteristicCompletedPrimitiveRoot_equation F n + have hzEquation : + equalCharacteristicLubinTateAmbientPiIterate F t n z ^ + (Nat.card F.residueField - 1) + t = 0 := by + rw [hziterate, mul_pow, ← map_pow, hcpow, map_one, one_mul] + exact hxEquation + change Polynomial.eval z + ((equalCharacteristicCompletedPrimitivePolynomial F n).map + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n))) = 0 + unfold equalCharacteristicCompletedPrimitivePolynomial + rw [Polynomial.eval_map, Polynomial.eval₂_map, + equalCharacteristicLubinTatePrimitivePolynomial_eval₂] + have ht : + ((algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)).comp + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField))) + (equalCharacteristicLaurentUniformizer F) = + equalCharacteristicCompletedLevelUniformizer F n := by + rw [RingHom.comp_apply, + equalCharacteristicCompletedBase_algebraMap_uniformizer] + rfl + rw [ht] + exact hzEquation + +/-- A truncated bracket is a polynomial expression in its input over the +completed-unramified base. -/ +theorem equalCharacteristicCompletedAmbientBracket_mem_adjoin + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n m : ℕ) (a : F.residueField⟦X⟧) + (z : equalCharacteristicCompletedLevelField F n) : + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicCompletedLevelResidueHom F n) + (equalCharacteristicCompletedLevelUniformizer F n) m a z ∈ + Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ({z} : Set (equalCharacteristicCompletedLevelField F n)) := by + let A := equalCharacteristicCompletedUnramifiedField F.residueField + let E := equalCharacteristicCompletedLevelField F n + let t : E := equalCharacteristicCompletedLevelUniformizer F n + let S : Subalgebra A E := Algebra.adjoin A ({z} : Set E) + have hz : z ∈ S := Algebra.subset_adjoin (Set.mem_singleton z) + have ht : t ∈ S := by + change algebraMap A E (equalCharacteristicCompletedBaseUniformizer F) ∈ S + exact S.algebraMap_mem _ + have hcoeff (c : F.residueField) : + equalCharacteristicCompletedLevelResidueHom F n c ∈ S := by + rw [equalCharacteristicCompletedLevelResidueHom, RingHom.comp_apply, + equalCharacteristicCompletedLevelBaseHom, RingHom.comp_apply] + exact S.algebraMap_mem _ + have hiterate (i : ℕ) : + equalCharacteristicLubinTateAmbientPiIterate F t i z ∈ S := by + induction i with + | zero => + rw [equalCharacteristicLubinTateAmbientPiIterate, pow_zero] + exact hz + | succ i ih => + rw [equalCharacteristicLubinTateAmbientPiIterate_succ, + ← equalCharacteristicLubinTateAmbientPiEnd_iterate, + equalCharacteristicLubinTateAmbientPiEnd_apply] + exact S.add_mem (S.pow_mem ih _) (S.mul_mem ht ih) + rw [equalCharacteristicLubinTateAmbientBracket_apply] + exact S.sum_mem fun i _ ↦ S.mul_mem (hcoeff _) (hiterate i) + +/-- The image of the completed primitive point attached to a visible unit +parameter. -/ +noncomputable def equalCharacteristicCompletedUnitParameterRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : equalCharacteristicLubinTateUnitParameter F n) : + equalCharacteristicCompletedLevelField F n := + equalCharacteristicCompletedUnitRoot F n + (equalCharacteristicLubinTateUnitParameterUnit F n a) + +/-- Distinct visible unit parameters give distinct completed primitive +points. -/ +theorem equalCharacteristicCompletedUnitParameterRoot_injective + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Function.Injective (equalCharacteristicCompletedUnitParameterRoot F n) := by + intro a b hab + apply equalCharacteristicLubinTateUnitParameter_eq_of_coeff_eq F n a b + exact equalCharacteristicLubinTateAmbientPrimitive_bracket_eq_coeff F + (equalCharacteristicCompletedLevelResidueHom F n) + (equalCharacteristicCompletedLevelUniformizer F n) n + (equalCharacteristicCompletedPrimitiveRoot F n) + (equalCharacteristicCompletedPrimitiveRoot_torsion F n) + (equalCharacteristicCompletedPrimitiveRoot_not_torsion_pred F n) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (equalCharacteristicLubinTateUnitParameterSeries F n b) hab + +/-- Every visible unit bracket of the chosen completed point is again a +root of the completed primitive polynomial. -/ +theorem equalCharacteristicCompletedUnitParameterRoot_isRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : equalCharacteristicLubinTateUnitParameter F n) : + ((equalCharacteristicCompletedPrimitivePolynomial F n).map + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n))).IsRoot + (equalCharacteristicCompletedUnitParameterRoot F n a) := by + simpa [equalCharacteristicCompletedUnitParameterRoot] using + equalCharacteristicCompletedUnitRoot_isRoot F n + (equalCharacteristicLubinTateUnitParameterUnit F n a) + +/-- Base change to the completed maximal-unramified field preserves +separability of the primitive polynomial. -/ +theorem equalCharacteristicCompletedPrimitivePolynomial_separable + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicCompletedPrimitivePolynomial F n).Separable := by + unfold equalCharacteristicCompletedPrimitivePolynomial + exact (equalCharacteristicLubinTatePrimitivePolynomial_separable F n).map + +/-- A visible unit parameter, regarded as an element of the full root set +in the completed splitting field. -/ +noncomputable def equalCharacteristicCompletedUnitParameterRootSet + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : equalCharacteristicLubinTateUnitParameter F n) : + (equalCharacteristicCompletedPrimitivePolynomial F n).rootSet + (equalCharacteristicCompletedLevelField F n) := + ⟨equalCharacteristicCompletedUnitParameterRoot F n a, + Polynomial.mem_rootSet.mpr + ⟨(equalCharacteristicCompletedPrimitivePolynomial_monic F n).ne_zero, + by + rw [Polynomial.aeval_def, ← Polynomial.eval_map] + exact equalCharacteristicCompletedUnitParameterRoot_isRoot F n a⟩⟩ + +/-- States the theorem `equalCharacteristicCompletedUnitParameterRootSet_injective`. -/ +theorem equalCharacteristicCompletedUnitParameterRootSet_injective + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Function.Injective (equalCharacteristicCompletedUnitParameterRootSet F n) := by + intro a b hab + apply equalCharacteristicCompletedUnitParameterRoot_injective F n + exact congrArg Subtype.val hab + +/-- The completed primitive polynomial has precisely the expected number +of roots in its splitting field. -/ +theorem equalCharacteristicCompletedPrimitiveRootSet_natCard + (F : LocalField.{u, v} K) (n : ℕ) : + Nat.card + ((equalCharacteristicCompletedPrimitivePolynomial F n).rootSet + (equalCharacteristicCompletedLevelField F n)) = + (Nat.card F.residueField - 1) * Nat.card F.residueField ^ n := by + rw [Nat.card_eq_fintype_card, + Polynomial.card_rootSet_eq_natDegree + (equalCharacteristicCompletedPrimitivePolynomial_separable F n) + (equalCharacteristicCompletedPrimitivePolynomial_splits F n), + equalCharacteristicCompletedPrimitivePolynomial_natDegree] + +/-- Visible unit parameters enumerate every root after passage to the +completed maximal-unramified base. -/ +theorem equalCharacteristicCompletedUnitParameterRootSet_bijective + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Function.Bijective + (equalCharacteristicCompletedUnitParameterRootSet F n) := by + apply (Nat.bijective_iff_injective_and_card + (equalCharacteristicCompletedUnitParameterRootSet F n)).mpr + exact ⟨equalCharacteristicCompletedUnitParameterRootSet_injective F n, + (equalCharacteristicLubinTateUnitParameter_natCard F n).trans + (equalCharacteristicCompletedPrimitiveRootSet_natCard F n).symm⟩ + +/-- Every parameter root is a polynomial expression in the chosen completed +primitive point, with coefficients in the completed-unramified base. -/ +theorem equalCharacteristicCompletedUnitParameterRoot_mem_adjoin + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : equalCharacteristicLubinTateUnitParameter F n) : + equalCharacteristicCompletedUnitParameterRoot F n a ∈ + Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ({equalCharacteristicCompletedPrimitiveRoot F n} : + Set (equalCharacteristicCompletedLevelField F n)) := by + let A := equalCharacteristicCompletedUnramifiedField F.residueField + let E := equalCharacteristicCompletedLevelField F n + let x : E := equalCharacteristicCompletedPrimitiveRoot F n + let t : E := equalCharacteristicCompletedLevelUniformizer F n + let S : Subalgebra A E := Algebra.adjoin A ({x} : Set E) + have hx : x ∈ S := Algebra.subset_adjoin (Set.mem_singleton x) + have ht : t ∈ S := by + change algebraMap A E (equalCharacteristicCompletedBaseUniformizer F) ∈ S + exact S.algebraMap_mem _ + have hcoeff (c : F.residueField) : + equalCharacteristicCompletedLevelResidueHom F n c ∈ S := by + rw [equalCharacteristicCompletedLevelResidueHom, RingHom.comp_apply, + equalCharacteristicCompletedLevelBaseHom, RingHom.comp_apply] + exact S.algebraMap_mem _ + have hiterate (i : ℕ) : + equalCharacteristicLubinTateAmbientPiIterate F t i x ∈ S := by + induction i with + | zero => + rw [equalCharacteristicLubinTateAmbientPiIterate, pow_zero] + exact hx + | succ i ih => + rw [equalCharacteristicLubinTateAmbientPiIterate_succ, + ← equalCharacteristicLubinTateAmbientPiEnd_iterate, + equalCharacteristicLubinTateAmbientPiEnd_apply] + exact S.add_mem (S.pow_mem ih _) (S.mul_mem ht ih) + change equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicCompletedLevelResidueHom F n) t (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) x ∈ S + rw [equalCharacteristicLubinTateAmbientBracket_apply] + exact S.sum_mem fun i _ ↦ + S.mul_mem (hcoeff _) (hiterate i) + +/-- All roots of the completed primitive polynomial lie in the field +generated by the chosen primitive point. -/ +theorem equalCharacteristicCompletedPrimitiveRootSet_subset_adjoin + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + ((equalCharacteristicCompletedPrimitivePolynomial F n).rootSet + (equalCharacteristicCompletedLevelField F n) : + Set (equalCharacteristicCompletedLevelField F n)) ⊆ + Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ({equalCharacteristicCompletedPrimitiveRoot F n} : + Set (equalCharacteristicCompletedLevelField F n)) := by + intro y hy + let yroot : + (equalCharacteristicCompletedPrimitivePolynomial F n).rootSet + (equalCharacteristicCompletedLevelField F n) := ⟨y, hy⟩ + obtain ⟨a, ha⟩ := + (equalCharacteristicCompletedUnitParameterRootSet_bijective F n).surjective + yroot + have hay : equalCharacteristicCompletedUnitParameterRoot F n a = y := + congrArg Subtype.val ha + rw [← hay] + exact equalCharacteristicCompletedUnitParameterRoot_mem_adjoin F n a + +/-- The chosen completed primitive point generates the completed splitting +field. -/ +theorem equalCharacteristicCompletedPrimitiveRoot_adjoin_eq_top + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ({equalCharacteristicCompletedPrimitiveRoot F n} : + Set (equalCharacteristicCompletedLevelField F n)) = ⊤ := by + have hall : + Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ((equalCharacteristicCompletedPrimitivePolynomial F n).rootSet + (equalCharacteristicCompletedLevelField F n) : + Set (equalCharacteristicCompletedLevelField F n)) ≤ + Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ({equalCharacteristicCompletedPrimitiveRoot F n} : + Set (equalCharacteristicCompletedLevelField F n)) := + Algebra.adjoin_le + (equalCharacteristicCompletedPrimitiveRootSet_subset_adjoin F n) + rw [equalCharacteristicCompletedPrimitivePolynomial_adjoin_rootSet] at hall + exact top_unique hall + +/-- Every unit bracket of a primitive point is again a primitive generator +of the completed level field. -/ +theorem equalCharacteristicCompletedUnitRoot_adjoin_eq_top + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ({equalCharacteristicCompletedUnitRoot F n a} : + Set (equalCharacteristicCompletedLevelField F n)) = ⊤ := by + let x := equalCharacteristicCompletedPrimitiveRoot F n + let y := equalCharacteristicCompletedUnitRoot F n a + let ι := equalCharacteristicCompletedLevelResidueHom F n + let t := equalCharacteristicCompletedLevelUniformizer F n + have hrecover : + equalCharacteristicLubinTateAmbientBracket F ι t (n + 1) + ((a⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) y = x := by + change equalCharacteristicLubinTateAmbientBracket F ι t (n + 1) + ((a⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) + (equalCharacteristicLubinTateAmbientBracket F ι t (n + 1) + (a : F.residueField⟦X⟧) x) = x + rw [← equalCharacteristicLubinTateAmbientBracket_mul_apply_of_torsion + F ι t (n + 1) + ((a⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) + (a : F.residueField⟦X⟧) x + (equalCharacteristicCompletedPrimitiveRoot_torsion F n)] + have hmul : + ((a⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) * + (↑a : F.residueField⟦X⟧) = 1 := by + exact Units.inv_mul a + rw [hmul] + have hC := congrArg + (fun f : AddMonoid.End (equalCharacteristicCompletedLevelField F n) ↦ + f x) + (equalCharacteristicLubinTateAmbientBracket_C F ι t n + (1 : F.residueField)) + change equalCharacteristicLubinTateAmbientBracket F ι t (n + 1) + (PowerSeries.C 1) x = + equalCharacteristicLubinTateAmbientCoefficientEnd F ι 1 x at hC + simpa using hC + have hxmem : + x ∈ Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ({y} : Set (equalCharacteristicCompletedLevelField F n)) := by + rw [← hrecover] + exact equalCharacteristicCompletedAmbientBracket_mem_adjoin F n (n + 1) + ((a⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) y + have hle : + Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ({x} : Set (equalCharacteristicCompletedLevelField F n)) ≤ + Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ({y} : Set (equalCharacteristicCompletedLevelField F n)) := by + apply Algebra.adjoin_le + intro z hz + simpa only [Set.mem_singleton_iff] using hz ▸ hxmem + rw [show Algebra.adjoin + (equalCharacteristicCompletedUnramifiedField F.residueField) + ({x} : Set (equalCharacteristicCompletedLevelField F n)) = ⊤ by + simpa [x] using equalCharacteristicCompletedPrimitiveRoot_adjoin_eq_top F n] + at hle + exact top_unique hle + +/-- The chosen completed primitive point is integral over the completed +unramified base. -/ +theorem equalCharacteristicCompletedPrimitiveRoot_isIntegral + (F : LocalField.{u, v} K) (n : ℕ) : + IsIntegral + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedPrimitiveRoot F n) := by + refine ⟨equalCharacteristicCompletedPrimitivePolynomial F n, + equalCharacteristicCompletedPrimitivePolynomial_monic F n, ?_⟩ + rw [← Polynomial.eval_map] + exact equalCharacteristicCompletedPrimitiveRoot_isRoot F n + +/-- The completed primitive polynomial is the minimal polynomial of the +chosen primitive point. -/ +theorem equalCharacteristicCompletedPrimitiveRoot_minpoly + (F : LocalField.{u, v} K) (n : ℕ) : + minpoly (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedPrimitiveRoot F n) = + equalCharacteristicCompletedPrimitivePolynomial F n := by + have hroot : + Polynomial.aeval (equalCharacteristicCompletedPrimitiveRoot F n) + (equalCharacteristicCompletedPrimitivePolynomial F n) = 0 := by + rw [Polynomial.aeval_def, ← Polynomial.eval_map] + exact equalCharacteristicCompletedPrimitiveRoot_isRoot F n + have hmin := minpoly.eq_of_irreducible + (equalCharacteristicCompletedPrimitivePolynomial_irreducible F n) hroot + rw [(equalCharacteristicCompletedPrimitivePolynomial_monic F n).leadingCoeff, + inv_one, Polynomial.C_1, mul_one] at hmin + exact hmin.symm + +/-- The power basis generated by the completed primitive division point. -/ +noncomputable def equalCharacteristicCompletedPrimitivePowerBasis + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + PowerBasis + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) := + PowerBasis.ofAdjoinEqTop + (equalCharacteristicCompletedPrimitiveRoot_isIntegral F n) + (equalCharacteristicCompletedPrimitiveRoot_adjoin_eq_top F n) + +/-- States the theorem `equalCharacteristicCompletedPrimitivePowerBasis_gen`. -/ +@[simp] +theorem equalCharacteristicCompletedPrimitivePowerBasis_gen + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + (equalCharacteristicCompletedPrimitivePowerBasis F n).gen = + equalCharacteristicCompletedPrimitiveRoot F n := + PowerBasis.ofAdjoinEqTop_gen _ _ + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveIrreducible.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveIrreducible.lean new file mode 100644 index 0000000000..2b077e1cde --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveIrreducible.lean @@ -0,0 +1,211 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel +public import Mathlib.RingTheory.Polynomial.Eisenstein.Basic +public import Mathlib.RingTheory.PowerSeries.Ideal +/-! +# The completed theta-intertwining theorem: irreducibility after completed unramified base change + +The primitive Lubin--Tate polynomial remains Eisenstein after replacing the +finite residue field `κ` by its algebraic closure. Consequently it remains +irreducible over `(AlgebraicClosure κ)((T))`. This is the algebraic input +needed to prescribe the image of a primitive point when arithmetic Frobenius +is extended to the completed level field. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries Polynomial PowerSeries + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The completed base carries the Laurent-series algebra structure used in the +primitive-polynomial irreducibility argument. -/ +noncomputable local instance equalCharacteristicCompletedPrimitiveIrreducibleBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +/-- Coefficientwise extension of the integral primitive polynomial from +`κ[[T]]` to `(AlgebraicClosure κ)[[T]]`. -/ +noncomputable def equalCharacteristicCompletedIntegralPrimitivePolynomial + (F : LocalField.{u, v} K) (n : ℕ) : + Polynomial (AlgebraicClosure F.residueField)⟦X⟧ := + (equalCharacteristicLubinTateIntegralPrimitivePolynomial F n).map + (PowerSeries.map + (algebraMap F.residueField (AlgebraicClosure F.residueField))) + +/-- States the theorem `equalCharacteristicCompletedIntegralPrimitivePolynomial_monic`. -/ +theorem equalCharacteristicCompletedIntegralPrimitivePolynomial_monic + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicCompletedIntegralPrimitivePolynomial F n).Monic := by + exact (equalCharacteristicLubinTateIntegralPrimitivePolynomial_monic F n).map _ + +/-- States the theorem `equalCharacteristicCompletedIntegralPrimitivePolynomial_natDegree`. -/ +theorem equalCharacteristicCompletedIntegralPrimitivePolynomial_natDegree + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicCompletedIntegralPrimitivePolynomial F n).natDegree = + (Nat.card F.residueField - 1) * Nat.card F.residueField ^ n := by + rw [equalCharacteristicCompletedIntegralPrimitivePolynomial, + (equalCharacteristicLubinTateIntegralPrimitivePolynomial_monic F n).natDegree_map, + equalCharacteristicLubinTateIntegralPrimitivePolynomial_natDegree] + +/-- The power-series coefficient map commutes with passage to Laurent +series. -/ +theorem equalCharacteristicPowerSeriesLaurent_baseChange_commutes + (F : LocalField.{u, v} K) : + (algebraMap (AlgebraicClosure F.residueField)⟦X⟧ + (equalCharacteristicCompletedUnramifiedField F.residueField)).comp + (PowerSeries.map + (algebraMap F.residueField (AlgebraicClosure F.residueField))) = + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField)).comp + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩) := by + ext f m + cases m with + | ofNat i => + simp [RingHom.comp_apply] + | negSucc i => + simp only [RingHom.comp_apply] + change + ((↑(PowerSeries.map + (algebraMap F.residueField (AlgebraicClosure F.residueField)) f) : + (AlgebraicClosure F.residueField)⸨X⸩).coeff (Int.negSucc i)) = + algebraMap F.residueField (AlgebraicClosure F.residueField) + ((↑f : F.residueField⸨X⸩).coeff (Int.negSucc i)) + rw [PowerSeries.coeff_coe, PowerSeries.coeff_coe] + simp + +/-- Passing the integral polynomial to the Laurent fraction field gives +exactly the completed primitive polynomial. -/ +theorem equalCharacteristicCompletedIntegralPrimitivePolynomial_map + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicCompletedIntegralPrimitivePolynomial F n).map + (algebraMap (AlgebraicClosure F.residueField)⟦X⟧ + (equalCharacteristicCompletedUnramifiedField F.residueField)) = + equalCharacteristicCompletedPrimitivePolynomial F n := by + rw [equalCharacteristicCompletedIntegralPrimitivePolynomial, + Polynomial.map_map, + equalCharacteristicPowerSeriesLaurent_baseChange_commutes, + ← Polynomial.map_map, + equalCharacteristicLubinTateIntegralPrimitivePolynomial_map] + rfl + +/-- Reduction modulo `T` is the single leading monomial. -/ +theorem equalCharacteristicCompletedIntegralPrimitivePolynomial_map_constantCoeff + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicCompletedIntegralPrimitivePolynomial F n).map + (PowerSeries.constantCoeff + (R := AlgebraicClosure F.residueField)) = + Polynomial.X ^ + ((Nat.card F.residueField - 1) * Nat.card F.residueField ^ n) := by + rw [equalCharacteristicCompletedIntegralPrimitivePolynomial, + Polynomial.map_map] + have hcomp : + (PowerSeries.constantCoeff + (R := AlgebraicClosure F.residueField)).comp + (PowerSeries.map + (algebraMap F.residueField (AlgebraicClosure F.residueField))) = + (algebraMap F.residueField (AlgebraicClosure F.residueField)).comp + (PowerSeries.constantCoeff (R := F.residueField)) := by + ext f + simp only [RingHom.comp_apply, + ← PowerSeries.coeff_zero_eq_constantCoeff_apply, + PowerSeries.coeff_map] + rw [hcomp, ← Polynomial.map_map, + equalCharacteristicLubinTateIntegralPrimitivePolynomial_map_constantCoeff] + simp + +/-- States the theorem `equalCharacteristicCompletedIntegralPrimitivePolynomial_coeff_zero`. -/ +theorem equalCharacteristicCompletedIntegralPrimitivePolynomial_coeff_zero + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicCompletedIntegralPrimitivePolynomial F n).coeff 0 = + (PowerSeries.X : (AlgebraicClosure F.residueField)⟦X⟧) := by + rw [equalCharacteristicCompletedIntegralPrimitivePolynomial, + Polynomial.coeff_map, + equalCharacteristicLubinTateIntegralPrimitivePolynomial_coeff_zero, + PowerSeries.map_X] + +/-- The completed integral primitive polynomial is Eisenstein at `(T)`. -/ +theorem equalCharacteristicCompletedIntegralPrimitivePolynomial_isEisensteinAt + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicCompletedIntegralPrimitivePolynomial F n).IsEisensteinAt + (Ideal.span + ({PowerSeries.X} : + Set (AlgebraicClosure F.residueField)⟦X⟧)) := by + let Q := equalCharacteristicCompletedIntegralPrimitivePolynomial F n + let d := (Nat.card F.residueField - 1) * Nat.card F.residueField ^ n + have hmonic : Q.Monic := + equalCharacteristicCompletedIntegralPrimitivePolynomial_monic F n + refine hmonic.isEisensteinAt_of_mem_of_notMem + PowerSeries.span_X_isPrime.ne_top ?_ ?_ + · intro i hi + rw [Ideal.mem_span_singleton, PowerSeries.X_dvd_iff] + have hcoeff : + PowerSeries.constantCoeff + ((equalCharacteristicCompletedIntegralPrimitivePolynomial F n).coeff i) = + (Polynomial.X ^ d : + Polynomial (AlgebraicClosure F.residueField)).coeff i := by + simpa only [Polynomial.coeff_map, d] using + congrArg + (fun p : Polynomial (AlgebraicClosure F.residueField) ↦ p.coeff i) + (equalCharacteristicCompletedIntegralPrimitivePolynomial_map_constantCoeff + F n) + have hid : i < d := by + simpa [Q, d, + equalCharacteristicCompletedIntegralPrimitivePolynomial_natDegree] using hi + simpa [d, Polynomial.coeff_X_pow, ne_of_lt hid] using hcoeff + · rw [equalCharacteristicCompletedIntegralPrimitivePolynomial_coeff_zero] + exact powerSeries_X_notMem_span_X_sq + (AlgebraicClosure F.residueField) + +/-- States the theorem `equalCharacteristicCompletedIntegralPrimitivePolynomial_irreducible`. -/ +theorem equalCharacteristicCompletedIntegralPrimitivePolynomial_irreducible + (F : LocalField.{u, v} K) (n : ℕ) : + Irreducible (equalCharacteristicCompletedIntegralPrimitivePolynomial F n) := by + apply + (equalCharacteristicCompletedIntegralPrimitivePolynomial_isEisensteinAt F n).irreducible + PowerSeries.span_X_isPrime + (equalCharacteristicCompletedIntegralPrimitivePolynomial_monic F n).isPrimitive + rw [equalCharacteristicCompletedIntegralPrimitivePolynomial_natDegree] + exact Nat.mul_pos + (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (Nat.pow_pos Nat.card_pos) + +/-- The primitive polynomial remains irreducible over the completed maximal +unramified Laurent field. -/ +theorem equalCharacteristicCompletedPrimitivePolynomial_irreducible + (F : LocalField.{u, v} K) (n : ℕ) : + Irreducible (equalCharacteristicCompletedPrimitivePolynomial F n) := by + have hmap : + Irreducible + ((equalCharacteristicCompletedIntegralPrimitivePolynomial F n).map + (algebraMap (AlgebraicClosure F.residueField)⟦X⟧ + (equalCharacteristicCompletedUnramifiedField F.residueField))) := + (equalCharacteristicCompletedIntegralPrimitivePolynomial_monic F + n).irreducible_iff_irreducible_map_fraction_map.mp + (equalCharacteristicCompletedIntegralPrimitivePolynomial_irreducible F n) + rwa [equalCharacteristicCompletedIntegralPrimitivePolynomial_map] at hmap + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectBracketAtCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectBracketAtCompletedLevel.lean new file mode 100644 index 0000000000..1a38bdd4a3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectBracketAtCompletedLevel.lean @@ -0,0 +1,434 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracketRecursion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction +/-! +# The completed theta-intertwining theorem: the formal standard bracket at a completed division + point + +The first theta identity uses the independently constructed formal bracket, +whereas the completed Frobenius lift acts through the finite bracket from +the finite Lubin–Tate bracket construction. This file proves that the two actions agree on the + chosen primitive +division point. The proof analytically evaluates the recursive identity + +`[a](x) = a₀x + [tail(a)](e_T(x))` + +and follows the source torsion orbit until the finite bracket terminates. +-/ + +@[expose] public section + +noncomputable +section + +open Filter +open scoped LaurentSeries NNReal NormedField PowerSeries + PowerSeries.WithPiTopology Topology Valued WithZero + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +private instance equalCharacteristicDirectBracketLevelCharP + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] (n : ℕ) : + CharP (equalCharacteristicCompletedLevelField F n) + F.residueCharacteristic := + equalCharacteristicDirectThetaCompletedLevelCharP F n + +noncomputable local instance equalCharacteristicDirectBracketBaseValuationIsNontrivial + (F : LocalField.{u, v} K) : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField F.residueField) ℤᵐ⁰).IsNontrivial := + equalCharacteristicCompletedBaseValuationIsNontrivial F.residueField + +/-- The valuation on the completed unramified base of the direct-bracket construction has rank +one. -/ +noncomputable local instance equalCharacteristicDirectBracketBaseValuationRankOne + (F : LocalField.{u, v} K) : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField F.residueField) ℤᵐ⁰).RankOne := + equalCharacteristicCompletedBaseValuationRankOne F.residueField + +/-- The canonical nontrivial norm on the completed unramified coefficient field. -/ +noncomputable local instance equalCharacteristicDirectBracketBaseNormedField + (F : LocalField.{u, v} K) : + NontriviallyNormedField + (equalCharacteristicCompletedUnramifiedField F.residueField) := + equalCharacteristicCompletedBaseNormedField F.residueField + +/-- The canonical nontrivial norm on the completed Lubin–Tate field at level `n`. -/ +noncomputable local instance equalCharacteristicDirectBracketLevelNormedField + (F : LocalField.{u, v} K) (n : ℕ) : + NontriviallyNormedField (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelNormedField F n + +noncomputable local instance equalCharacteristicDirectBracketLevelIsUltrametric + (F : LocalField.{u, v} K) (n : ℕ) : + IsUltrametricDist (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelIsUltrametric F n + +noncomputable local instance equalCharacteristicDirectBracketLevelCompleteSpace + (F : LocalField.{u, v} K) (n : ℕ) : + CompleteSpace (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelCompleteSpace F n + +/-- The nonnegative-real-valued valuation on the completed Lubin–Tate field at level `n`. -/ +noncomputable local instance equalCharacteristicDirectBracketLevelValued + (F : LocalField.{u, v} K) (n : ℕ) : + Valued (equalCharacteristicCompletedLevelField F n) ℝ≥0 := + equalCharacteristicCompletedLevelValued F n + +noncomputable local instance equalCharacteristicDirectBracketIntegerLinearTopology + (F : LocalField.{u, v} K) (n : ℕ) : + IsLinearTopology + (Valued.integer (equalCharacteristicCompletedLevelField F n)) + (Valued.integer (equalCharacteristicCompletedLevelField F n)) := + valuedIntegerLinearTopology + +noncomputable local instance equalCharacteristicDirectBracketIntegerCompleteSpace + (F : LocalField.{u, v} K) (n : ℕ) : + CompleteSpace + (Valued.integer (equalCharacteristicCompletedLevelField F n)) := + valuedIntegerCompleteSpace + +noncomputable local instance equalCharacteristicDirectBracketIntegerUniformAddGroup + (F : LocalField.{u, v} K) (n : ℕ) : + IsUniformAddGroup + (Valued.integer (equalCharacteristicCompletedLevelField F n)) := + valuedIntegerIsUniformAddGroup + +private noncomputable local instance + equalCharacteristicDirectBracketCoefficientUniformSpace + (F : LocalField.{u, v} K) : + UniformSpace ((AlgebraicClosure F.residueField)⟦X⟧) := ⊥ + +private theorem equalCharacteristicDirectBracketCoefficientHom_continuous + (F : LocalField.{u, v} K) (n : ℕ) : + Continuous (equalCharacteristicCompletedLevelCoefficientHom F n) := + continuous_of_discreteTopology + +private noncomputable local instance equalCharacteristicDirectBracketCoefficientAlgebra + (F : LocalField.{u, v} K) (n : ℕ) : + Algebra ((AlgebraicClosure F.residueField)⟦X⟧) + (Valued.integer (equalCharacteristicCompletedLevelField F n)) := + (equalCharacteristicCompletedLevelCoefficientHom F n).toAlgebra + +/-- Genuine analytic value of the standard formal bracket at the `i`-th +point of the source orbit. -/ +noncomputable def equalCharacteristicCompletedDirectBracketAtSourceIterate + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n i : ℕ) (a : F.residueField⟦X⟧) : + Valued.integer (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicDirectThetaSourceIterateInteger F n i) + (equalCharacteristicDirectThetaSourceIterateInteger_hasEval F n i) + (equalCharacteristicCompletedDirectBracket a) + +private theorem equalCharacteristicDirectBracketEvaluation_hasEval_of_hasSubst + (F : LocalField.{u, v} K) (n : ℕ) + (x : Valued.integer (equalCharacteristicCompletedLevelField F n)) + (hx : PowerSeries.HasEval x) + (a : ((AlgebraicClosure F.residueField)⟦X⟧)⟦X⟧) + (ha : PowerSeries.HasSubst a) : + PowerSeries.HasEval + (equalCharacteristicCompletedLevelEvaluation F n x hx a) := by + exact ha.hasEval.map + (φ := equalCharacteristicCompletedLevelEvaluation F n x hx) + (by + rw [equalCharacteristicCompletedLevelEvaluation, + PowerSeries.coe_eval₂Hom] + exact PowerSeries.continuous_eval₂ + (equalCharacteristicDirectBracketCoefficientHom_continuous F n) hx) + +private theorem equalCharacteristicDirectBracketEvaluation_subst + (F : LocalField.{u, v} K) (n : ℕ) + (x : Valued.integer (equalCharacteristicCompletedLevelField F n)) + (hx : PowerSeries.HasEval x) + (a f : ((AlgebraicClosure F.residueField)⟦X⟧)⟦X⟧) + (ha : PowerSeries.HasSubst a) + (haEval : PowerSeries.HasEval + (equalCharacteristicCompletedLevelEvaluation F n x hx a)) : + equalCharacteristicCompletedLevelEvaluation F n x hx + (PowerSeries.subst a f) = + equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicCompletedLevelEvaluation F n x hx a) haEval f := by + let R := (AlgebraicClosure F.residueField)⟦X⟧ + let S := Valued.integer (equalCharacteristicCompletedLevelField F n) + simp only [equalCharacteristicCompletedLevelEvaluation, + PowerSeries.coe_eval₂Hom] + change PowerSeries.eval₂ (algebraMap R S) x (PowerSeries.subst a f) = + PowerSeries.eval₂ (algebraMap R S) + (PowerSeries.eval₂ (algebraMap R S) x a) f + simpa only [PowerSeries.eval₂, PowerSeries.subst, Function.const_apply] + using + (MvPowerSeries.eval₂_subst + (R := R) (S := R) (T := S) + (a := fun _ : Unit ↦ a) ha.const + (PowerSeries.hasEval hx) f) + +private theorem equalCharacteristicCompletedLevelEvaluation_eq_of_point_eq + (F : LocalField.{u, v} K) (n : ℕ) + (x y : Valued.integer (equalCharacteristicCompletedLevelField F n)) + (hx : PowerSeries.HasEval x) (hy : PowerSeries.HasEval y) + (hxy : x = y) : + equalCharacteristicCompletedLevelEvaluation F n x hx = + equalCharacteristicCompletedLevelEvaluation F n y hy := by + subst y + rfl + +private theorem equalCharacteristicCompletedLevelCoefficientHom_C_base + (F : LocalField.{u, v} K) (n : ℕ) (c : F.residueField) : + ((equalCharacteristicCompletedLevelCoefficientHom F n + (PowerSeries.C + (algebraMap F.residueField (AlgebraicClosure F.residueField) c)) : + Valued.integer (equalCharacteristicCompletedLevelField F n)) : + equalCharacteristicCompletedLevelField F n) = + equalCharacteristicCompletedLevelResidueHom F n c := by + change algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + (((equalCharacteristicPowerSeriesToCompletedInteger F.residueField) + (PowerSeries.C + (algebraMap F.residueField (AlgebraicClosure F.residueField) c)) : + Valued.integer + (equalCharacteristicCompletedUnramifiedField F.residueField)) : + equalCharacteristicCompletedUnramifiedField F.residueField) = + algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + ((laurentSeriesCoefficientMap + (algebraMap F.residueField (AlgebraicClosure F.residueField))) + (algebraMap F.residueField F.residueField⸨X⸩ c)) + apply congrArg (algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)) + change + ((PowerSeries.C + (algebraMap F.residueField (AlgebraicClosure F.residueField) c) : + (AlgebraicClosure F.residueField)⟦X⟧) : + (AlgebraicClosure F.residueField)⸨X⸩) = _ + rw [HahnSeries.ofPowerSeries_C, LaurentSeries.algebraMap_apply, + laurentSeriesCoefficientMap_C] + +/-- Analytic version of the recursive bracket identity along the standard +source orbit. -/ +theorem equalCharacteristicCompletedDirectBracketAtSourceIterate_recursion + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n i : ℕ) (a : F.residueField⟦X⟧) : + ((equalCharacteristicCompletedDirectBracketAtSourceIterate F n i a : + Valued.integer (equalCharacteristicCompletedLevelField F n)) : + equalCharacteristicCompletedLevelField F n) = + equalCharacteristicCompletedLevelResidueHom F n + (PowerSeries.coeff 0 a) * + equalCharacteristicDirectThetaSourceIterate F n i + + ((equalCharacteristicCompletedDirectBracketAtSourceIterate F n (i + 1) + (equalCharacteristicPowerSeriesTail a) : + Valued.integer (equalCharacteristicCompletedLevelField F n)) : + equalCharacteristicCompletedLevelField F n) := by + let x := equalCharacteristicDirectThetaSourceIterateInteger F n i + let hx := equalCharacteristicDirectThetaSourceIterateInteger_hasEval F n i + let E := equalCharacteristicCompletedLubinTateSeries + (k := F.residueField) + (PowerSeries.X : (AlgebraicClosure F.residueField)⟦X⟧) + let H := equalCharacteristicCompletedDirectBracket + (equalCharacteristicPowerSeriesTail a) + have hE : PowerSeries.HasSubst E := + equalCharacteristicCompletedLubinTateSeries_hasSubst _ + have hEeval : PowerSeries.HasEval + (equalCharacteristicCompletedLevelEvaluation F n x hx E) := + equalCharacteristicDirectBracketEvaluation_hasEval_of_hasSubst + F n x hx E hE + have hsubst := equalCharacteristicDirectBracketEvaluation_subst F n x hx + E H hE hEeval + have hformal := congrArg + (equalCharacteristicCompletedLevelEvaluation F n x hx) + (equalCharacteristicCompletedDirectBracket_recursion a) + rw [map_add, map_mul, + equalCharacteristicCompletedLevelEvaluation_X, + equalCharacteristicCompletedLevelEvaluation_C] at hformal + have hsource := equalCharacteristicDirectTheta_sourceLubinTate_evaluation + F n i + change equalCharacteristicCompletedLevelEvaluation F n x hx E = + equalCharacteristicDirectThetaSourceIterateInteger F n (i + 1) + at hsource + have htail : + equalCharacteristicCompletedLevelEvaluation F n x hx + (PowerSeries.subst E H) = + equalCharacteristicCompletedDirectBracketAtSourceIterate F n (i + 1) + (equalCharacteristicPowerSeriesTail a) := by + calc + _ = equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicCompletedLevelEvaluation F n x hx E) hEeval H := + hsubst + _ = _ := by + exact DFunLike.congr_fun + (equalCharacteristicCompletedLevelEvaluation_eq_of_point_eq F n + (equalCharacteristicCompletedLevelEvaluation F n x hx E) + (equalCharacteristicDirectThetaSourceIterateInteger F n (i + 1)) + hEeval + (equalCharacteristicDirectThetaSourceIterateInteger_hasEval + F n (i + 1)) hsource) H + rw [htail] at hformal + have hcoerce := congrArg + (fun z : Valued.integer (equalCharacteristicCompletedLevelField F n) ↦ + (z : equalCharacteristicCompletedLevelField F n)) hformal + change + ((equalCharacteristicCompletedDirectBracketAtSourceIterate F n i a : + Valued.integer (equalCharacteristicCompletedLevelField F n)) : + equalCharacteristicCompletedLevelField F n) = _ + rw [← equalCharacteristicDirectThetaSourceIterateInteger_coe F n i] + rw [← equalCharacteristicCompletedLevelCoefficientHom_C_base F n + (PowerSeries.coeff 0 a)] + simpa [equalCharacteristicCompletedDirectBracketAtSourceIterate, + x, hx, H, E, map_add, map_mul] using hcoerce + +/-- On a point killed at level `m`, the analytic formal bracket equals the +finite the finite Lubin–Tate bracket construction bracket with `m` terms. -/ +theorem equalCharacteristicCompletedDirectBracketAtSourceIterate_eq_ambient + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n m i : ℕ) (a : F.residueField⟦X⟧) + (htorsion : IsEqualCharacteristicLubinTateAmbientTorsion F + (equalCharacteristicCompletedLevelUniformizer F n) m + (equalCharacteristicDirectThetaSourceIterate F n i)) : + ((equalCharacteristicCompletedDirectBracketAtSourceIterate F n i a : + Valued.integer (equalCharacteristicCompletedLevelField F n)) : + equalCharacteristicCompletedLevelField F n) = + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicCompletedLevelResidueHom F n) + (equalCharacteristicCompletedLevelUniformizer F n) m a + (equalCharacteristicDirectThetaSourceIterate F n i) := by + induction m generalizing i a with + | zero => + change equalCharacteristicDirectThetaSourceIterate F n i = 0 at htorsion + have hxi : equalCharacteristicDirectThetaSourceIterateInteger F n i = 0 := by + apply Subtype.ext + exact htorsion + rw [equalCharacteristicLubinTateAmbientBracket_apply] + simp only [Finset.range_zero, Finset.sum_empty] + let x := equalCharacteristicDirectThetaSourceIterateInteger F n i + let hx := equalCharacteristicDirectThetaSourceIterateInteger_hasEval F n i + let H := equalCharacteristicCompletedDirectBracket a + have heval := DFunLike.congr_fun + (equalCharacteristicCompletedLevelEvaluation_eq_of_point_eq F n + x 0 hx PowerSeries.HasEval.zero hxi) H + change ((equalCharacteristicCompletedLevelEvaluation F n x hx H : + Valued.integer (equalCharacteristicCompletedLevelField F n)) : + equalCharacteristicCompletedLevelField F n) = 0 + rw [heval] + have hsub : + equalCharacteristicCompletedLevelEvaluation F n 0 + PowerSeries.HasEval.zero H = 0 := by + rw [equalCharacteristicCompletedLevelEvaluation, + PowerSeries.coe_eval₂Hom] + apply HasSum.unique + (PowerSeries.hasSum_eval₂ + (equalCharacteristicDirectBracketCoefficientHom_continuous F n) + PowerSeries.HasEval.zero H) + have hterm : + (fun d : ℕ ↦ + equalCharacteristicCompletedLevelCoefficientHom F n + (PowerSeries.coeff d H) * + (0 : Valued.integer + (equalCharacteristicCompletedLevelField F n)) ^ d) = + (fun _ : ℕ ↦ (0 : Valued.integer + (equalCharacteristicCompletedLevelField F n))) := by + funext d + cases d with + | zero => + simp [H, PowerSeries.coeff_zero_eq_constantCoeff_apply, + equalCharacteristicCompletedDirectBracket_constantCoeff] + | succ d => simp + rw [hterm] + exact hasSum_zero + exact congrArg Subtype.val hsub + | succ m ih => + have hsourceSucc : + equalCharacteristicDirectThetaSourceIterate F n (i + 1) = + equalCharacteristicLubinTateAmbientPiEnd F + (equalCharacteristicCompletedLevelUniformizer F n) + (equalCharacteristicDirectThetaSourceIterate F n i) := by + change equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicCompletedLevelUniformizer F n) (i + 1) + (equalCharacteristicCompletedPrimitiveRoot F n) = + equalCharacteristicLubinTateAmbientPiEnd F + (equalCharacteristicCompletedLevelUniformizer F n) + (equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicCompletedLevelUniformizer F n) i + (equalCharacteristicCompletedPrimitiveRoot F n)) + rw [equalCharacteristicLubinTateAmbientPiIterate_succ, + ← equalCharacteristicLubinTateAmbientPiEnd_iterate] + have hnext : IsEqualCharacteristicLubinTateAmbientTorsion F + (equalCharacteristicCompletedLevelUniformizer F n) m + (equalCharacteristicDirectThetaSourceIterate F n (i + 1)) := by + change equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicCompletedLevelUniformizer F n) m + (equalCharacteristicDirectThetaSourceIterate F n (i + 1)) = 0 + change equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicCompletedLevelUniformizer F n) (m + 1) + (equalCharacteristicDirectThetaSourceIterate F n i) = 0 at htorsion + rw [equalCharacteristicLubinTateAmbientPiIterate_succ] at htorsion + rw [hsourceSucc] + exact htorsion + rw [equalCharacteristicCompletedDirectBracketAtSourceIterate_recursion, + ih (i := i + 1) (a := equalCharacteristicPowerSeriesTail a) hnext, + equalCharacteristicLubinTateAmbientBracket_succ_apply] + rw [hsourceSucc] + +/-- At the chosen primitive point, the analytic formal bracket is exactly +the finite bracket used to define the completed Galois action. -/ +theorem equalCharacteristicCompletedDirectBracketAtPrimitiveRoot_eq_ambient + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧) : + ((equalCharacteristicCompletedDirectBracketAtSourceIterate F n 0 a : + Valued.integer (equalCharacteristicCompletedLevelField F n)) : + equalCharacteristicCompletedLevelField F n) = + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicCompletedLevelResidueHom F n) + (equalCharacteristicCompletedLevelUniformizer F n) (n + 1) a + (equalCharacteristicCompletedPrimitiveRoot F n) := by + have h := equalCharacteristicCompletedDirectBracketAtSourceIterate_eq_ambient + F n (n + 1) 0 a (equalCharacteristicCompletedPrimitiveRoot_torsion F n) + change + ((equalCharacteristicCompletedDirectBracketAtSourceIterate F n 0 a : + Valued.integer (equalCharacteristicCompletedLevelField F n)) : + equalCharacteristicCompletedLevelField F n) = + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicCompletedLevelResidueHom F n) + (equalCharacteristicCompletedLevelUniformizer F n) (n + 1) a + (equalCharacteristicCompletedPrimitiveRoot F n) at h + exact h + +/-- Unit specialization: the formal standard `[a]` at the primitive point +is the completed unit root used by the prescribed Frobenius lift. -/ +theorem equalCharacteristicCompletedDirectBracketAtPrimitiveRoot_eq_unitRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + ((equalCharacteristicCompletedDirectBracketAtSourceIterate F n 0 + (a : F.residueField⟦X⟧) : + Valued.integer (equalCharacteristicCompletedLevelField F n)) : + equalCharacteristicCompletedLevelField F n) = + equalCharacteristicCompletedUnitRoot F n a := by + exact equalCharacteristicCompletedDirectBracketAtPrimitiveRoot_eq_ambient + F n (a : F.residueField⟦X⟧) + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracket.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracket.lean new file mode 100644 index 0000000000..8cadc0c441 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracket.lean @@ -0,0 +1,277 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity +/-! +# The completed theta-intertwining theorem: the standard equal-characteristic Lubin--Tate bracket + +In the proof of the completed theta-intertwining theorem the standard Lubin--Tate series is + +`e_T(Y) = Y^q + T Y`. + +For a unit `u`, this file constructs the endomorphism `[u]` of this standard +Lubin--Tate group. Its linear coefficient is `u`; the higher additive +coefficients are the unique contracting solutions forced by commutation with +`e_T`. This is the orientation used in the completed theta-intertwining theorem itself, as + opposed to the +normalization `u⁻¹T -> T` used in Corollary the Lubin–Tate endomorphism commutation law. +-/ + +@[expose] public section + +noncomputable +section + +open scoped PowerSeries + + +universe u + +namespace LubinTate +namespace EqualCharacteristic + +variable {k : Type u} [Field k] [Finite k] + +/-- After division by `T`, the contracting coefficient in the recurrence for +the coefficients of the standard bracket `[u]`. -/ +noncomputable def equalCharacteristicDirectBracketGamma + (j : ℕ) : k⟦X⟧ := + PowerSeries.X ^ (Nat.card k ^ j - 1) + +/-- Positive-index direct bracket gamma terms have zero constant coefficient. -/ +theorem equalCharacteristicDirectBracketGamma_constantCoeff + (j : ℕ) (hj : 0 < j) : + PowerSeries.coeff 0 (equalCharacteristicDirectBracketGamma (k := k) j) = 0 := by + have hq : 1 < Nat.card k := Finite.one_lt_card + have hpow : 0 < Nat.card k ^ j - 1 := + Nat.sub_pos_of_lt (Nat.one_lt_pow hj.ne' hq) + simp [equalCharacteristicDirectBracketGamma, hpow.ne] + +/-- Division of `a-a^q` by the standard prime `T`. -/ +noncomputable def equalCharacteristicDirectBracketBeta + (a : k⟦X⟧) : k⟦X⟧ := + equalCharacteristicPowerSeriesTail + (equalCharacteristicSourceBracketNumerator a) + +/-- Additive coefficients of the standard Lubin--Tate endomorphism `[u]`. -/ +noncomputable def equalCharacteristicDirectBracketCoefficient + (u : k⟦X⟧) : ℕ → k⟦X⟧ + | 0 => u + | j + 1 => + contractingFrobeniusEquationSolution (R := k) + (RingHom.id k) + (equalCharacteristicDirectBracketGamma (k := k) (j + 1)) + (equalCharacteristicDirectBracketBeta + (equalCharacteristicDirectBracketCoefficient u j)) + +omit [Finite k] in +/-- The zeroth direct bracket coefficient is the input power series. -/ +@[simp] +theorem equalCharacteristicDirectBracketCoefficient_zero + (u : k⟦X⟧) : + equalCharacteristicDirectBracketCoefficient u 0 = u := + rfl + +/-- Successive direct bracket coefficients satisfy the defining contraction equation. -/ +theorem equalCharacteristicDirectBracketCoefficient_succ_equation + (u : k⟦X⟧) (j : ℕ) : + equalCharacteristicDirectBracketCoefficient u (j + 1) - + equalCharacteristicDirectBracketGamma (k := k) (j + 1) * + equalCharacteristicDirectBracketCoefficient u (j + 1) = + equalCharacteristicDirectBracketBeta + (equalCharacteristicDirectBracketCoefficient u j) := by + rw [equalCharacteristicDirectBracketCoefficient] + have hgamma := equalCharacteristicDirectBracketGamma_constantCoeff + (k := k) (j + 1) (Nat.zero_lt_succ j) + apply (sub_eq_iff_eq_add).2 + simpa using + (contractingFrobeniusEquationSolution_spec (R := k) + (RingHom.id k) + (equalCharacteristicDirectBracketGamma (k := k) (j + 1)) + (equalCharacteristicDirectBracketBeta + (equalCharacteristicDirectBracketCoefficient u j)) hgamma) + +/-- Coefficient comparison equivalent to commutation of `[u]` with +`e_T(Y)=Y^q+TY`. -/ +theorem equalCharacteristicDirectBracketCoefficient_succ_comparison + (u : k⟦X⟧) (j : ℕ) : + PowerSeries.X * + equalCharacteristicDirectBracketCoefficient u (j + 1) - + PowerSeries.X ^ (Nat.card k ^ (j + 1)) * + equalCharacteristicDirectBracketCoefficient u (j + 1) = + equalCharacteristicDirectBracketCoefficient u j - + equalCharacteristicDirectBracketCoefficient u j ^ Nat.card k := by + let qj := Nat.card k ^ (j + 1) + let a := equalCharacteristicDirectBracketCoefficient u (j + 1) + let b := equalCharacteristicDirectBracketCoefficient u j + have hqj : 1 ≤ qj := + Nat.one_le_iff_ne_zero.mpr (pow_ne_zero _ Nat.card_pos.ne') + have hXGamma : + PowerSeries.X * + equalCharacteristicDirectBracketGamma (k := k) (j + 1) = + (PowerSeries.X : k⟦X⟧) ^ qj := by + rw [equalCharacteristicDirectBracketGamma] + calc + PowerSeries.X * (PowerSeries.X : k⟦X⟧) ^ (qj - 1) = + PowerSeries.X ^ ((qj - 1) + 1) := by + rw [pow_succ'] + _ = PowerSeries.X ^ qj := by rw [Nat.sub_add_cancel hqj] + have htail : + PowerSeries.X * + equalCharacteristicPowerSeriesTail + (equalCharacteristicSourceBracketNumerator b) = + equalCharacteristicSourceBracketNumerator b := by + have hsplit := equalCharacteristicPowerSeries_eq_X_mul_tail_add_C + (equalCharacteristicSourceBracketNumerator b) + rw [equalCharacteristicSourceBracketNumerator_constantCoeff] at hsplit + simpa only [map_zero, add_zero] using hsplit.symm + have hrec := congrArg + (fun z : k⟦X⟧ ↦ PowerSeries.X * z) + (equalCharacteristicDirectBracketCoefficient_succ_equation u j) + change PowerSeries.X * + (a - equalCharacteristicDirectBracketGamma (k := k) (j + 1) * a) = + PowerSeries.X * equalCharacteristicDirectBracketBeta b at hrec + rw [mul_sub, ← mul_assoc, hXGamma, + equalCharacteristicDirectBracketBeta, htail] at hrec + simpa [a, b, qj, equalCharacteristicSourceBracketNumerator] using hrec + +/-- The standard Lubin--Tate endomorphism `[u]` over `k[[T]]`. -/ +noncomputable def equalCharacteristicDirectBracket + (u : k⟦X⟧) : (k⟦X⟧)⟦X⟧ := + equalCharacteristicQAdditiveSeries k + (equalCharacteristicDirectBracketCoefficient u) + +/-- The direct bracket coefficient at `q ^ j` is its `j`th recursive coefficient. -/ +@[simp] +theorem equalCharacteristicDirectBracket_coeff_pow + (u : k⟦X⟧) (j : ℕ) : + PowerSeries.coeff (Nat.card k ^ j) + (equalCharacteristicDirectBracket u) = + equalCharacteristicDirectBracketCoefficient u j := by + exact equalCharacteristicQAdditiveSeries_coeff_pow k _ j + +/-- The direct bracket has zero constant coefficient. -/ +@[simp] +theorem equalCharacteristicDirectBracket_constantCoeff + (u : k⟦X⟧) : + PowerSeries.constantCoeff (equalCharacteristicDirectBracket u) = 0 := by + exact equalCharacteristicQAdditiveSeries_constantCoeff k _ + +/-- The direct bracket is valid as a substitution series. -/ +theorem equalCharacteristicDirectBracket_hasSubst + (u : k⟦X⟧) : + PowerSeries.HasSubst (equalCharacteristicDirectBracket u) := + PowerSeries.HasSubst.of_constantCoeff_zero' + (equalCharacteristicDirectBracket_constantCoeff u) + +/-- Coefficients after extension to the completed maximal unramified integer +ring. -/ +noncomputable def equalCharacteristicCompletedDirectBracketCoefficient + (u : k⟦X⟧) (j : ℕ) : (AlgebraicClosure k)⟦X⟧ := + PowerSeries.map (algebraMap k (AlgebraicClosure k)) + (equalCharacteristicDirectBracketCoefficient u j) + +/-- The standard bracket over the completed maximal unramified integer ring. -/ +noncomputable def equalCharacteristicCompletedDirectBracket + (u : k⟦X⟧) : ((AlgebraicClosure k)⟦X⟧)⟦X⟧ := + equalCharacteristicQAdditiveSeries k + (equalCharacteristicCompletedDirectBracketCoefficient u) + +/-- The completed direct bracket records its `j`th coefficient at exponent `q ^ j`. -/ +@[simp] +theorem equalCharacteristicCompletedDirectBracket_coeff_pow + (u : k⟦X⟧) (j : ℕ) : + PowerSeries.coeff (Nat.card k ^ j) + (equalCharacteristicCompletedDirectBracket u) = + equalCharacteristicCompletedDirectBracketCoefficient u j := by + exact equalCharacteristicQAdditiveSeries_coeff_pow k _ j + +/-- The completed direct bracket has zero constant coefficient. -/ +@[simp] +theorem equalCharacteristicCompletedDirectBracket_constantCoeff + (u : k⟦X⟧) : + PowerSeries.constantCoeff + (equalCharacteristicCompletedDirectBracket u) = 0 := by + exact equalCharacteristicQAdditiveSeries_constantCoeff k _ + +/-- The completed direct bracket is valid as a substitution series. -/ +theorem equalCharacteristicCompletedDirectBracket_hasSubst + (u : k⟦X⟧) : + PowerSeries.HasSubst (equalCharacteristicCompletedDirectBracket u) := + PowerSeries.HasSubst.of_constantCoeff_zero' + (equalCharacteristicCompletedDirectBracket_constantCoeff u) + +omit [Finite k] in +/-- The zeroth completed direct coefficient is the scalar extension of the input. -/ +@[simp] +theorem equalCharacteristicCompletedDirectBracketCoefficient_zero + (u : k⟦X⟧) : + equalCharacteristicCompletedDirectBracketCoefficient u 0 = + PowerSeries.map (algebraMap k (AlgebraicClosure k)) u := by + simp [equalCharacteristicCompletedDirectBracketCoefficient] + +/-- Every coefficient of the standard bracket is defined over `k[[T]]`, so +coefficient Frobenius fixes the bracket. -/ +theorem equalCharacteristicCompletedDirectBracket_frobenius + (u : k⟦X⟧) : + PowerSeries.map (equalCharacteristicPowerSeriesFrobenius k) + (equalCharacteristicCompletedDirectBracket u) = + equalCharacteristicCompletedDirectBracket u := by + rw [equalCharacteristicCompletedDirectBracket, + equalCharacteristicQAdditiveSeries_map] + congr 1 + funext j + exact equalCharacteristicPowerSeriesFrobenius_map_algebraMap + (equalCharacteristicDirectBracketCoefficient u j) + +/-- The standard coefficient recurrence after extension to the completed +maximal unramified integer ring. -/ +theorem equalCharacteristicCompletedDirectBracketCoefficient_succ_comparison + (u : k⟦X⟧) (j : ℕ) : + PowerSeries.X * + equalCharacteristicCompletedDirectBracketCoefficient u (j + 1) - + PowerSeries.X ^ (Nat.card k ^ (j + 1)) * + equalCharacteristicCompletedDirectBracketCoefficient u (j + 1) = + equalCharacteristicCompletedDirectBracketCoefficient u j - + equalCharacteristicCompletedDirectBracketCoefficient u j ^ Nat.card k := by + have h := congrArg + (PowerSeries.map (algebraMap k (AlgebraicClosure k))) + (equalCharacteristicDirectBracketCoefficient_succ_comparison u j) + simpa [equalCharacteristicCompletedDirectBracketCoefficient, + map_sub, map_mul, map_pow] using h + +/-- The standard `[u]` commutes with `e_T(Y)=Y^q+TY`. -/ +theorem equalCharacteristicCompletedDirectBracket_commutes + (u : k⟦X⟧) : + PowerSeries.subst (equalCharacteristicCompletedDirectBracket u) + (equalCharacteristicCompletedLubinTateSeries (k := k) + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧)) = + PowerSeries.subst + (equalCharacteristicCompletedLubinTateSeries (k := k) + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧)) + (equalCharacteristicCompletedDirectBracket u) := by + rw [equalCharacteristicCompletedDirectBracket, + equalCharacteristicCompletedLubinTateSeries_subst_qAdditiveSeries, + equalCharacteristicQAdditiveSeries_subst_completedLubinTateSeries] + congr 1 + funext j + cases j with + | zero => + simp [equalCharacteristicLubinTatePostcompositionCoefficient, + equalCharacteristicLubinTateSubstitutionCoefficient, mul_comm] + | succ j => + rw [equalCharacteristicLubinTatePostcompositionCoefficient, + equalCharacteristicLubinTateSubstitutionCoefficient] + have h := + equalCharacteristicCompletedDirectBracketCoefficient_succ_comparison + u j + linear_combination h + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracketRecursion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracketRecursion.lean new file mode 100644 index 0000000000..63fc29f307 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracketRecursion.lean @@ -0,0 +1,360 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket +/-! +# The completed theta-intertwining theorem: recursion for the standard Lubin--Tate bracket + +The standard bracket constructed from its contracting coefficient equations +agrees with the recursive `T`-adic bracket used in the finite Lubin–Tate bracket construction. + At the formal +series level the required identity is + +`[a](Y) = a₀ Y + [tail(a)](e_T(Y))`. + +This file proves the identity from uniqueness of the commuting `q`-additive +series. It is the bridge from the formal bracket used in the theta identity +to the finite brackets acting on division points. +-/ + +@[expose] public section + +noncomputable +section + +open scoped PowerSeries + + +universe u + +namespace LubinTate +namespace EqualCharacteristic + +variable {k : Type u} [Field k] [Finite k] + +/-- The scalar-linear summand `a₀Y`, in sparse additive coordinates. -/ +noncomputable def equalCharacteristicDirectBracketScalarCoefficient + (a : k⟦X⟧) : ℕ → (AlgebraicClosure k)⟦X⟧ + | 0 => PowerSeries.C + (algebraMap k (AlgebraicClosure k) (PowerSeries.coeff 0 a)) + | _ + 1 => 0 + +/-- Coefficients of `[tail(a)] ∘ e_T`. -/ +noncomputable def equalCharacteristicDirectBracketTailCompositionCoefficient + (a : k⟦X⟧) : ℕ → (AlgebraicClosure k)⟦X⟧ := + equalCharacteristicLubinTateSubstitutionCoefficient + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧) + (equalCharacteristicCompletedDirectBracketCoefficient + (equalCharacteristicPowerSeriesTail a)) + +/-- Coefficients of the recursive candidate +`a₀Y + [tail(a)] ∘ e_T`. -/ +noncomputable def equalCharacteristicDirectBracketRecursiveCoefficient + (a : k⟦X⟧) : ℕ → (AlgebraicClosure k)⟦X⟧ := + fun j ↦ equalCharacteristicDirectBracketScalarCoefficient a j + + equalCharacteristicDirectBracketTailCompositionCoefficient a j + +private theorem equalCharacteristicDirectBracketScalarSeries_eq + (a : k⟦X⟧) : + equalCharacteristicQAdditiveSeries k + (equalCharacteristicDirectBracketScalarCoefficient a) = + PowerSeries.C (PowerSeries.C + (algebraMap k (AlgebraicClosure k) (PowerSeries.coeff 0 a))) * + PowerSeries.X := by + apply PowerSeries.ext + intro n + by_cases hn : IsEqualCharacteristicAdditiveExponent k n + · obtain ⟨j, rfl⟩ := hn + rw [equalCharacteristicQAdditiveSeries_coeff_pow, + PowerSeries.coeff_C_mul] + cases j with + | zero => + simp [equalCharacteristicDirectBracketScalarCoefficient] + | succ j => + have hpow : Nat.card k ^ (j + 1) ≠ 1 := by + intro h + have := natCard_pow_injective k (h.trans (pow_zero _).symm) + omega + rw [equalCharacteristicDirectBracketScalarCoefficient] + rw [PowerSeries.coeff_X, ite_eq_right hpow] + simp + · have hne : n ≠ 1 := by + intro h + subst n + exact hn ⟨0, by simp⟩ + rw [equalCharacteristicQAdditiveSeries_coeff_eq_zero k _ n hn, + PowerSeries.coeff_C_mul] + rw [PowerSeries.coeff_X, ite_eq_right hne] + simp + +/-- The recursive candidate is the sum of its scalar term and the genuine +formal substitution `[tail(a)] ∘ e_T`. -/ +theorem equalCharacteristicDirectBracketRecursiveSeries_eq + (a : k⟦X⟧) : + equalCharacteristicQAdditiveSeries k + (equalCharacteristicDirectBracketRecursiveCoefficient a) = + PowerSeries.C (PowerSeries.C + (algebraMap k (AlgebraicClosure k) (PowerSeries.coeff 0 a))) * + PowerSeries.X + + PowerSeries.subst + (equalCharacteristicCompletedLubinTateSeries (k := k) + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧)) + (equalCharacteristicCompletedDirectBracket + (equalCharacteristicPowerSeriesTail a)) := by + change equalCharacteristicQAdditiveSeries k + (fun j ↦ equalCharacteristicDirectBracketScalarCoefficient a j + + equalCharacteristicDirectBracketTailCompositionCoefficient a j) = _ + rw [← equalCharacteristicQAdditiveSeries_add, + equalCharacteristicDirectBracketScalarSeries_eq] + congr 1 + rw [equalCharacteristicCompletedDirectBracket, + equalCharacteristicQAdditiveSeries_subst_completedLubinTateSeries] + rfl + +/-- Coefficient recurrence read from commutation with `e_T`. -/ +theorem equalCharacteristicDirectQAdditiveEndomorphism_succ_comparison + (c : ℕ → (AlgebraicClosure k)⟦X⟧) + (hcommutes : + PowerSeries.subst (equalCharacteristicQAdditiveSeries k c) + (equalCharacteristicCompletedLubinTateSeries (k := k) + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧)) = + PowerSeries.subst + (equalCharacteristicCompletedLubinTateSeries (k := k) + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧)) + (equalCharacteristicQAdditiveSeries k c)) + (j : ℕ) : + PowerSeries.X * c (j + 1) - + PowerSeries.X ^ (Nat.card k ^ (j + 1)) * c (j + 1) = + c j - c j ^ Nat.card k := by + rw [equalCharacteristicCompletedLubinTateSeries_subst_qAdditiveSeries, + equalCharacteristicQAdditiveSeries_subst_completedLubinTateSeries] + at hcommutes + have hcoeff := congrArg + (PowerSeries.coeff (Nat.card k ^ (j + 1))) hcommutes + rw [equalCharacteristicQAdditiveSeries_coeff_pow, + equalCharacteristicQAdditiveSeries_coeff_pow, + equalCharacteristicLubinTatePostcompositionCoefficient, + equalCharacteristicLubinTateSubstitutionCoefficient] at hcoeff + linear_combination hcoeff + +private theorem equalCharacteristicDirectBracketScalarCoefficient_succ_comparison + (a : k⟦X⟧) (j : ℕ) : + PowerSeries.X * + equalCharacteristicDirectBracketScalarCoefficient a (j + 1) - + PowerSeries.X ^ (Nat.card k ^ (j + 1)) * + equalCharacteristicDirectBracketScalarCoefficient a (j + 1) = + equalCharacteristicDirectBracketScalarCoefficient a j - + equalCharacteristicDirectBracketScalarCoefficient a j ^ Nat.card k := by + let : Fintype k := Fintype.ofFinite k + cases j with + | zero => + simp [equalCharacteristicDirectBracketScalarCoefficient, + ← map_pow, Nat.card_eq_fintype_card, FiniteField.pow_card] + | succ j => simp [equalCharacteristicDirectBracketScalarCoefficient] + +private theorem equalCharacteristicDirectBracketTailCompositionSeries_commutes + (a : k⟦X⟧) : + PowerSeries.subst + (equalCharacteristicQAdditiveSeries k + (equalCharacteristicDirectBracketTailCompositionCoefficient a)) + (equalCharacteristicCompletedLubinTateSeries (k := k) + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧)) = + PowerSeries.subst + (equalCharacteristicCompletedLubinTateSeries (k := k) + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧)) + (equalCharacteristicQAdditiveSeries k + (equalCharacteristicDirectBracketTailCompositionCoefficient a)) := by + let E := equalCharacteristicCompletedLubinTateSeries (k := k) + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧) + let H := equalCharacteristicCompletedDirectBracket + (equalCharacteristicPowerSeriesTail a) + have hE : PowerSeries.HasSubst E := + equalCharacteristicCompletedLubinTateSeries_hasSubst + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧) + have hH : PowerSeries.HasSubst H := + equalCharacteristicCompletedDirectBracket_hasSubst + (equalCharacteristicPowerSeriesTail a) + have hcomp : + equalCharacteristicQAdditiveSeries k + (equalCharacteristicDirectBracketTailCompositionCoefficient a) = + PowerSeries.subst E H := by + unfold equalCharacteristicDirectBracketTailCompositionCoefficient + change equalCharacteristicQAdditiveSeries k + (equalCharacteristicLubinTateSubstitutionCoefficient + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧) + (equalCharacteristicCompletedDirectBracketCoefficient + (equalCharacteristicPowerSeriesTail a))) = + PowerSeries.subst E + (equalCharacteristicQAdditiveSeries k + (equalCharacteristicCompletedDirectBracketCoefficient + (equalCharacteristicPowerSeriesTail a))) + exact (equalCharacteristicQAdditiveSeries_subst_completedLubinTateSeries + (k := k) (PowerSeries.X : (AlgebraicClosure k)⟦X⟧) + (equalCharacteristicCompletedDirectBracketCoefficient + (equalCharacteristicPowerSeriesTail a))).symm + have hcomm : PowerSeries.subst H E = PowerSeries.subst E H := by + simpa only [H, E] using + equalCharacteristicCompletedDirectBracket_commutes + (equalCharacteristicPowerSeriesTail a) + rw [hcomp] + calc + PowerSeries.subst (PowerSeries.subst E H) E = + PowerSeries.subst E (PowerSeries.subst H E) := + (PowerSeries.subst_comp_subst_apply hH hE E).symm + _ = PowerSeries.subst E (PowerSeries.subst E H) := by rw [hcomm] + +private theorem + equalCharacteristicDirectBracketTailCompositionCoefficient_succ_comparison + (a : k⟦X⟧) (j : ℕ) : + PowerSeries.X * + equalCharacteristicDirectBracketTailCompositionCoefficient a (j + 1) - + PowerSeries.X ^ (Nat.card k ^ (j + 1)) * + equalCharacteristicDirectBracketTailCompositionCoefficient a (j + 1) = + equalCharacteristicDirectBracketTailCompositionCoefficient a j - + equalCharacteristicDirectBracketTailCompositionCoefficient a j ^ + Nat.card k := + equalCharacteristicDirectQAdditiveEndomorphism_succ_comparison + (equalCharacteristicDirectBracketTailCompositionCoefficient a) + (equalCharacteristicDirectBracketTailCompositionSeries_commutes a) j + +omit [Finite k] in +private theorem equalCharacteristicDirectBracketRecursiveCoefficient_zero + (a : k⟦X⟧) : + equalCharacteristicDirectBracketRecursiveCoefficient a 0 = + PowerSeries.map (algebraMap k (AlgebraicClosure k)) a := by + have hsplit := congrArg + (PowerSeries.map (algebraMap k (AlgebraicClosure k))) + (equalCharacteristicPowerSeries_eq_X_mul_tail_add_C a) + simp only [equalCharacteristicDirectBracketRecursiveCoefficient, + equalCharacteristicDirectBracketScalarCoefficient, + equalCharacteristicDirectBracketTailCompositionCoefficient, + equalCharacteristicLubinTateSubstitutionCoefficient, + equalCharacteristicCompletedDirectBracketCoefficient_zero] + simpa [map_add, map_mul, mul_comm, add_comm] using hsplit.symm + +private theorem + equalCharacteristicDirectBracketRecursiveCoefficient_succ_comparison + (a : k⟦X⟧) (j : ℕ) : + PowerSeries.X * + equalCharacteristicDirectBracketRecursiveCoefficient a (j + 1) - + PowerSeries.X ^ (Nat.card k ^ (j + 1)) * + equalCharacteristicDirectBracketRecursiveCoefficient a (j + 1) = + equalCharacteristicDirectBracketRecursiveCoefficient a j - + equalCharacteristicDirectBracketRecursiveCoefficient a j ^ Nat.card k := by + have hs := equalCharacteristicDirectBracketScalarCoefficient_succ_comparison + (k := k) a j + have ht := + equalCharacteristicDirectBracketTailCompositionCoefficient_succ_comparison + (k := k) a j + change PowerSeries.X * + (equalCharacteristicDirectBracketScalarCoefficient a (j + 1) + + equalCharacteristicDirectBracketTailCompositionCoefficient a (j + 1)) - + PowerSeries.X ^ (Nat.card k ^ (j + 1)) * + (equalCharacteristicDirectBracketScalarCoefficient a (j + 1) + + equalCharacteristicDirectBracketTailCompositionCoefficient a (j + 1)) = + (equalCharacteristicDirectBracketScalarCoefficient a j + + equalCharacteristicDirectBracketTailCompositionCoefficient a j) - + (equalCharacteristicDirectBracketScalarCoefficient a j + + equalCharacteristicDirectBracketTailCompositionCoefficient a j) ^ + Nat.card k + have hadd : + (equalCharacteristicDirectBracketScalarCoefficient a j + + equalCharacteristicDirectBracketTailCompositionCoefficient a j) ^ + Nat.card k = + equalCharacteristicDirectBracketScalarCoefficient a j ^ Nat.card k + + equalCharacteristicDirectBracketTailCompositionCoefficient a j ^ + Nat.card k := by + simpa using add_pow_natCard_pow (k := k) + (equalCharacteristicDirectBracketScalarCoefficient a j) + (equalCharacteristicDirectBracketTailCompositionCoefficient a j) 1 + rw [hadd] + linear_combination hs + ht + +/-- Uniqueness of a standard commuting `q`-additive endomorphism from its +linear coefficient. -/ +theorem equalCharacteristicCompletedDirectEndomorphismCoefficient_unique + (c d : ℕ → (AlgebraicClosure k)⟦X⟧) + (hzero : c 0 = d 0) + (hc : ∀ j : ℕ, + PowerSeries.X * c (j + 1) - + PowerSeries.X ^ (Nat.card k ^ (j + 1)) * c (j + 1) = + c j - c j ^ Nat.card k) + (hd : ∀ j : ℕ, + PowerSeries.X * d (j + 1) - + PowerSeries.X ^ (Nat.card k ^ (j + 1)) * d (j + 1) = + d j - d j ^ Nat.card k) : + c = d := by + funext j + induction j with + | zero => exact hzero + | succ j ih => + have hcj := hc j + have hdj := hd j + rw [ih] at hcj + let delta := c (j + 1) - d (j + 1) + have hdiff : + PowerSeries.X * delta - + PowerSeries.X ^ (Nat.card k ^ (j + 1)) * delta = 0 := by + dsimp only [delta] + linear_combination hcj - hdj + let qj := Nat.card k ^ (j + 1) + change PowerSeries.X * delta - PowerSeries.X ^ qj * delta = 0 at hdiff + let gamma : (AlgebraicClosure k)⟦X⟧ := + PowerSeries.X ^ (qj - 1) + have hq : 1 ≤ qj := + Nat.one_le_iff_ne_zero.mpr (pow_ne_zero _ Nat.card_pos.ne') + have hXGamma : PowerSeries.X * gamma = + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧) ^ qj := by + dsimp only [gamma] + calc + PowerSeries.X * PowerSeries.X ^ (qj - 1) = + PowerSeries.X ^ ((qj - 1) + 1) := by rw [pow_succ'] + _ = _ := by rw [Nat.sub_add_cancel hq] + have hhom : delta - gamma * delta = 0 := by + apply PowerSeries.X_mul_injective + change PowerSeries.X * (delta - gamma * delta) = PowerSeries.X * 0 + rw [mul_sub, ← mul_assoc, hXGamma, mul_zero] + exact hdiff + have hgamma : PowerSeries.coeff 0 gamma = 0 := by + have hcard : 1 < Nat.card k := Finite.one_lt_card + have hpow : 0 < qj - 1 := + Nat.sub_pos_of_lt (Nat.one_lt_pow (Nat.zero_lt_succ j).ne' hcard) + simp [gamma, hpow.ne] + have hunique := existsUnique_contractingFrobeniusEquation + (RingHom.id (AlgebraicClosure k)) gamma 0 hgamma + have hdelta : delta = 0 := hunique.unique (by simpa using hhom) (by simp) + exact sub_eq_zero.mp (by simpa only [delta] using hdelta) + +/-- Formal recursive identity for the standard bracket. -/ +theorem equalCharacteristicCompletedDirectBracket_recursion + (a : k⟦X⟧) : + equalCharacteristicCompletedDirectBracket a = + PowerSeries.C (PowerSeries.C + (algebraMap k (AlgebraicClosure k) (PowerSeries.coeff 0 a))) * + PowerSeries.X + + PowerSeries.subst + (equalCharacteristicCompletedLubinTateSeries (k := k) + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧)) + (equalCharacteristicCompletedDirectBracket + (equalCharacteristicPowerSeriesTail a)) := by + have hcoeff : + equalCharacteristicCompletedDirectBracketCoefficient a = + equalCharacteristicDirectBracketRecursiveCoefficient a := + equalCharacteristicCompletedDirectEndomorphismCoefficient_unique + (equalCharacteristicCompletedDirectBracketCoefficient a) + (equalCharacteristicDirectBracketRecursiveCoefficient a) + (equalCharacteristicDirectBracketRecursiveCoefficient_zero a).symm + (equalCharacteristicCompletedDirectBracketCoefficient_succ_comparison a) + (equalCharacteristicDirectBracketRecursiveCoefficient_succ_comparison a) + rw [equalCharacteristicCompletedDirectBracket, + ← equalCharacteristicDirectBracketRecursiveSeries_eq] + exact congrArg (equalCharacteristicQAdditiveSeries k) hcoeff + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectTargetLevelEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectTargetLevelEmbedding.lean new file mode 100644 index 0000000000..5f0716d1eb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectTargetLevelEmbedding.lean @@ -0,0 +1,195 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedPolynomialEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel +/-! +# The completed theta-intertwining theorem: the direct target level inside the completed source + level + +The analytic value `theta(lambda)` is primitive torsion for the target +parameter `uT`. We identify `uT` with the changed Laurent uniformizer, +deduce the actual primitive-polynomial equation, and obtain the canonical +embedding of the finite target Lubin--Tate level into the completed field. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries Polynomial PowerSeries + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The Laurent-series base acts on the completed unramified field through the coefficient +embedding. -/ +noncomputable local instance equalCharacteristicDirectTargetBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +/-- The completed level field is a Laurent-series algebra through the completed unramified base. -/ +noncomputable local instance equalCharacteristicDirectTargetLevelAlgebra + (F : LocalField.{u, v} K) (n : ℕ) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedLevelField F n) := + RingHom.toAlgebra + ((algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)).comp + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField))) + +local instance equalCharacteristicDirectTargetScalarTower + (F : LocalField.{u, v} K) (n : ℕ) : + IsScalarTower F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) := + IsScalarTower.of_algebraMap_eq' rfl + +private instance equalCharacteristicDirectTargetLevelCharP + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] (n : ℕ) : + CharP (equalCharacteristicCompletedLevelField F n) + F.residueCharacteristic := + equalCharacteristicDirectThetaCompletedLevelCharP F n + +/-- The direct analytic target parameter is exactly the image of the +changed Laurent uniformizer `uT`. -/ +theorem equalCharacteristicCompletedLevelBaseHom_changedUniformizer + (F : LocalField.{u, v} K) + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicCompletedLevelBaseHom F n + (equalCharacteristicChangedLaurentUniformizer F a) = + equalCharacteristicDirectThetaTargetUniformizer F a n := by + change algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩ + ((a : F.residueField⟦X⟧) * PowerSeries.X))) = + algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + (algebraMap (AlgebraicClosure F.residueField)⟦X⟧ + (equalCharacteristicCompletedUnramifiedField F.residueField) + (PowerSeries.map + (algebraMap F.residueField (AlgebraicClosure F.residueField)) + (a : F.residueField⟦X⟧) * PowerSeries.X)) + apply congrArg (algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)) + have h := DFunLike.congr_fun + (equalCharacteristicPowerSeriesLaurent_baseChange_commutes F) + ((a : F.residueField⟦X⟧) * PowerSeries.X) + simpa [RingHom.comp_apply, map_mul] using h.symm + +/-- The genuine analytic value `theta(lambda)` is a root of the target +primitive polynomial over `k((T))`. -/ +theorem equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_isRoot_target + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + ((equalCharacteristicChangedPrimitivePolynomial F a n).map + (equalCharacteristicCompletedLevelBaseHom F n)).IsRoot + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n) := by + apply equalCharacteristicChangedPrimitivePolynomial_isRoot_of_primitive + F a + · simpa [equalCharacteristicCompletedLevelBaseHom_changedUniformizer] + using equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_torsion F a n + · simpa [equalCharacteristicCompletedLevelBaseHom_changedUniformizer] + using + equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_not_torsion_pred + F a n + +/-- The finite target `uT` level embedded into the standard completed level, +sending its chosen generator to the analytic value `theta(lambda)`. -/ +noncomputable def equalCharacteristicDirectTargetLevelFieldToCompleted + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicChangedLevelField F a n + →ₐ[F.residueField⸨X⸩] + equalCharacteristicCompletedLevelField F n := by + have hrootAeval : Polynomial.aeval + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n) + (minpoly F.residueField⸨X⸩ + (chosenEqualCharacteristicChangedPrimitiveRoot F a n)) = 0 := by + rw [← equalCharacteristicChangedPrimitivePolynomial_eq_minpoly] + rw [Polynomial.aeval_def, + IsScalarTower.algebraMap_eq F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)] + simpa [Polynomial.IsRoot, Polynomial.eval_map, + equalCharacteristicCompletedLevelBaseHom] using + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_isRoot_target + F a n) + let baseHom : + F.residueField⸨X⸩ →ₐ[F.residueField⸨X⸩] + equalCharacteristicCompletedLevelField F n := + Algebra.ofId F.residueField⸨X⸩ + (equalCharacteristicCompletedLevelField F n) + have hroot : + Polynomial.eval₂ baseHom + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n) + (minpoly F.residueField⸨X⸩ + (chosenEqualCharacteristicChangedPrimitiveRoot F a n)) = 0 := by + simpa [baseHom, Polynomial.aeval_def] using hrootAeval + let lift : + AdjoinRoot (minpoly F.residueField⸨X⸩ + (chosenEqualCharacteristicChangedPrimitiveRoot F a n)) + →ₐ[F.residueField⸨X⸩] + equalCharacteristicCompletedLevelField F n := + AdjoinRoot.liftAlgHom _ baseHom + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n) hroot + exact lift.comp + (IntermediateField.adjoinRootEquivAdjoin F.residueField⸨X⸩ + (chosenEqualCharacteristicChangedPrimitiveRoot_isIntegral F a n)).symm.toAlgHom + +/-- The target-level embedding has the prescribed value on its chosen +primitive generator. -/ +@[simp] +theorem equalCharacteristicDirectTargetLevelFieldToCompleted_generator + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicDirectTargetLevelFieldToCompleted F a n + (equalCharacteristicChangedLevelGenerator F a n) = + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F a n : + equalCharacteristicCompletedLevelField F n) := by + simp only [equalCharacteristicDirectTargetLevelFieldToCompleted, + equalCharacteristicChangedLevelGenerator] + rw [AlgHom.comp_apply] + have hgen : + (IntermediateField.adjoinRootEquivAdjoin F.residueField⸨X⸩ + (chosenEqualCharacteristicChangedPrimitiveRoot_isIntegral F a n)).symm.toAlgHom + (IntermediateField.AdjoinSimple.gen F.residueField⸨X⸩ + (chosenEqualCharacteristicChangedPrimitiveRoot F a n)) = + AdjoinRoot.root + (minpoly F.residueField⸨X⸩ + (chosenEqualCharacteristicChangedPrimitiveRoot F a n)) := + IntermediateField.adjoinRootEquivAdjoin_symm_apply_gen + F.residueField⸨X⸩ + (chosenEqualCharacteristicChangedPrimitiveRoot_isIntegral F a n) + rw [hgen, AdjoinRoot.liftAlgHom_root] + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean new file mode 100644 index 0000000000..aea38fde5a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean @@ -0,0 +1,773 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaIteration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaLocalInverse +/-! +# The completed theta-intertwining theorem: direct theta at the standard completed level + +The standard completed primitive point `lambda` is a division-level `n + 1` +point for the source parameter `T`. This file genuinely evaluates the +direct theta series at `lambda`, iterates + +`theta^φ ∘ e_T = e_(uT) ∘ theta`, + +and proves that `theta(lambda)` is primitive target `uT`-torsion at the +same division level. +-/ + +@[expose] public section + +noncomputable +section + +open Filter +open scoped LaurentSeries NNReal NormedField PowerSeries + PowerSeries.WithPiTopology Topology Valued WithZero + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +private instance equalCharacteristicDirectThetaCompletedBaseCharP + (F : LocalField.{u, v} K) + : + CharP (equalCharacteristicCompletedUnramifiedField F.residueField) + F.residueCharacteristic := + charP_of_injective_algebraMap + (algebraMap F.residueField + (equalCharacteristicCompletedUnramifiedField F.residueField)).injective + F.residueCharacteristic + +/-- The completed Lubin–Tate level field has the residue characteristic of the base field. -/ +instance equalCharacteristicDirectThetaCompletedLevelCharP + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] (n : ℕ) : + CharP (equalCharacteristicCompletedLevelField F n) + F.residueCharacteristic := by + exact charP_of_injective_algebraMap + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)).injective + F.residueCharacteristic + +noncomputable local instance + equalCharacteristicDirectThetaBaseValuationIsNontrivial + (F : LocalField.{u, v} K) : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField F.residueField) ℤᵐ⁰).IsNontrivial := + equalCharacteristicCompletedBaseValuationIsNontrivial F.residueField + +/-- The discrete valuation on the completed unramified coefficient field has rank one. -/ +noncomputable local instance equalCharacteristicDirectThetaBaseValuationRankOne + (F : LocalField.{u, v} K) : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField F.residueField) ℤᵐ⁰).RankOne := + equalCharacteristicCompletedBaseValuationRankOne F.residueField + +/-- The canonical nontrivial norm on the completed unramified coefficient field. -/ +noncomputable local instance equalCharacteristicDirectThetaBaseNormedField + (F : LocalField.{u, v} K) : + NontriviallyNormedField + (equalCharacteristicCompletedUnramifiedField F.residueField) := + equalCharacteristicCompletedBaseNormedField F.residueField + +/-- The canonical nontrivial norm on the completed Lubin–Tate field at level `n`. -/ +noncomputable local instance equalCharacteristicDirectThetaLevelNormedField + (F : LocalField.{u, v} K) (n : ℕ) : + NontriviallyNormedField (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelNormedField F n + +noncomputable local instance equalCharacteristicDirectThetaLevelIsUltrametric + (F : LocalField.{u, v} K) (n : ℕ) : + IsUltrametricDist (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelIsUltrametric F n + +noncomputable local instance equalCharacteristicDirectThetaLevelCompleteSpace + (F : LocalField.{u, v} K) (n : ℕ) : + CompleteSpace (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelCompleteSpace F n + +/-- The nonnegative-real-valued valuation on the completed Lubin–Tate field at level `n`. -/ +noncomputable local instance equalCharacteristicDirectThetaLevelValued + (F : LocalField.{u, v} K) (n : ℕ) : + Valued (equalCharacteristicCompletedLevelField F n) ℝ≥0 := + equalCharacteristicCompletedLevelValued F n + +noncomputable local instance equalCharacteristicDirectThetaIntegerLinearTopology + (F : LocalField.{u, v} K) (n : ℕ) : + IsLinearTopology + (Valued.integer (equalCharacteristicCompletedLevelField F n)) + (Valued.integer (equalCharacteristicCompletedLevelField F n)) := + valuedIntegerLinearTopology + +noncomputable local instance equalCharacteristicDirectThetaIntegerCompleteSpace + (F : LocalField.{u, v} K) (n : ℕ) : + CompleteSpace + (Valued.integer (equalCharacteristicCompletedLevelField F n)) := + valuedIntegerCompleteSpace + +noncomputable local instance equalCharacteristicDirectThetaIntegerUniformAddGroup + (F : LocalField.{u, v} K) (n : ℕ) : + IsUniformAddGroup + (Valued.integer (equalCharacteristicCompletedLevelField F n)) := + valuedIntegerIsUniformAddGroup + +private noncomputable local instance + equalCharacteristicDirectThetaCoefficientUniformSpace + (F : LocalField.{u, v} K) : + UniformSpace ((AlgebraicClosure F.residueField)⟦X⟧) := ⊥ + +private theorem equalCharacteristicDirectThetaCoefficientHom_continuous + (F : LocalField.{u, v} K) (n : ℕ) : + Continuous (equalCharacteristicCompletedLevelCoefficientHom F n) := + continuous_of_discreteTopology + +private noncomputable local instance equalCharacteristicDirectThetaCoefficientAlgebra + (F : LocalField.{u, v} K) (n : ℕ) : + Algebra ((AlgebraicClosure F.residueField)⟦X⟧) + (Valued.integer (equalCharacteristicCompletedLevelField F n)) := + (equalCharacteristicCompletedLevelCoefficientHom F n).toAlgebra + +/-- The formal source `T` maps to the actual standard completed-level +uniformizer. -/ +@[simp] +theorem equalCharacteristicDirectThetaSourceUniformizerInteger_coe + (F : LocalField.{u, v} K) (n : ℕ) : + ((equalCharacteristicCompletedLevelUniformizerInteger F n : + Valued.integer (equalCharacteristicCompletedLevelField F n)) : + equalCharacteristicCompletedLevelField F n) = + equalCharacteristicCompletedLevelUniformizer F n := by + simp? [equalCharacteristicCompletedLevelUniformizerInteger, + equalCharacteristicCompletedLevelCoefficientHom, + equalCharacteristicCompletedBaseIntegerToLevel, + equalCharacteristicCompletedLevelUniformizer, + equalCharacteristicCompletedBaseUniformizer] + exact congrArg + (algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)) + (PowerSeries.coe_X (R := AlgebraicClosure F.residueField)) + +/-- The direct target parameter `uT` in the standard completed-level +valuation ring. -/ +noncomputable def equalCharacteristicDirectThetaTargetUniformizerInteger + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Valued.integer (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelCoefficientHom F n + (equalCharacteristicDirectCompletedTargetUniformizer u) + +/-- The same genuine target parameter in the ambient completed level field. -/ +noncomputable def equalCharacteristicDirectThetaTargetUniformizer + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicCompletedLevelField F n := + (equalCharacteristicDirectThetaTargetUniformizerInteger F u n : + equalCharacteristicCompletedLevelField F n) + +/-- Coercing the integral theta target uniformizer returns its field value. -/ +@[simp] +theorem equalCharacteristicDirectThetaTargetUniformizerInteger_coe + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + ((equalCharacteristicDirectThetaTargetUniformizerInteger F u n : + Valued.integer (equalCharacteristicCompletedLevelField F n)) : + equalCharacteristicCompletedLevelField F n) = + equalCharacteristicDirectThetaTargetUniformizer F u n := + rfl + +/-- The standard source orbit of the chosen primitive point. -/ +noncomputable def equalCharacteristicDirectThetaSourceIterate + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] (n i : ℕ) : + equalCharacteristicCompletedLevelField F n := + equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicCompletedLevelUniformizer F n) i + (equalCharacteristicCompletedPrimitiveRoot F n) + +private theorem equalCharacteristicDirectTheta_sourceIterate_norm_lt_one_aux + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] (n i : ℕ) + (x : equalCharacteristicCompletedLevelField F n) (hx : ‖x‖ < 1) : + ‖equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicCompletedLevelUniformizer F n) i x‖ < 1 := by + induction i generalizing x with + | zero => + rw [equalCharacteristicLubinTateAmbientPiIterate, pow_zero] + exact hx + | succ i ih => + rw [equalCharacteristicLubinTateAmbientPiIterate_succ] + apply ih + rw [equalCharacteristicLubinTateAmbientPiEnd_apply] + refine (IsUltrametricDist.norm_add_le_max _ _).trans_lt (max_lt ?_ ?_) + · rw [norm_pow] + exact pow_lt_one₀ (norm_nonneg x) hx Nat.card_pos.ne' + · rw [norm_mul] + exact + (mul_le_of_le_one_right (norm_nonneg _) hx.le).trans_lt + (equalCharacteristicCompletedLevelUniformizer_norm_lt_one F n) + +/-- Every direct theta source iterate has norm strictly below one. -/ +theorem equalCharacteristicDirectThetaSourceIterate_norm_lt_one + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] (n i : ℕ) : + ‖equalCharacteristicDirectThetaSourceIterate F n i‖ < 1 := + equalCharacteristicDirectTheta_sourceIterate_norm_lt_one_aux F n i + (equalCharacteristicCompletedPrimitiveRoot F n) + (equalCharacteristicCompletedPrimitiveRoot_norm_lt_one F n) + +/-- Each source iterate as a point of the spectral valuation ring. -/ +noncomputable def equalCharacteristicDirectThetaSourceIterateInteger + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] (n i : ℕ) : + Valued.integer (equalCharacteristicCompletedLevelField F n) := + ⟨equalCharacteristicDirectThetaSourceIterate F n i, by + change ‖equalCharacteristicDirectThetaSourceIterate F n i‖₊ ≤ 1 + exact_mod_cast + (equalCharacteristicDirectThetaSourceIterate_norm_lt_one F n i).le⟩ + +/-- Coercing an integral source iterate returns the underlying field element. -/ +@[simp] +theorem equalCharacteristicDirectThetaSourceIterateInteger_coe + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] (n i : ℕ) : + ((equalCharacteristicDirectThetaSourceIterateInteger F n i : + Valued.integer (equalCharacteristicCompletedLevelField F n)) : + equalCharacteristicCompletedLevelField F n) = + equalCharacteristicDirectThetaSourceIterate F n i := + rfl + +/-- Each integral source iterate has norm strictly below one. -/ +theorem equalCharacteristicDirectThetaSourceIterateInteger_norm_lt_one + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] (n i : ℕ) : + ‖equalCharacteristicDirectThetaSourceIterateInteger F n i‖ < 1 := by + change ‖equalCharacteristicDirectThetaSourceIterate F n i‖ < 1 + exact equalCharacteristicDirectThetaSourceIterate_norm_lt_one F n i + +/-- Power series can be evaluated at every integral direct source iterate. -/ +theorem equalCharacteristicDirectThetaSourceIterateInteger_hasEval + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] (n i : ℕ) : + PowerSeries.HasEval + (equalCharacteristicDirectThetaSourceIterateInteger F n i) := by + change Tendsto + (fun m : ℕ ↦ equalCharacteristicDirectThetaSourceIterateInteger + F n i ^ m) atTop (nhds 0) + exact tendsto_pow_atTop_nhds_zero_of_norm_lt_one + (equalCharacteristicDirectThetaSourceIterateInteger_norm_lt_one F n i) + +/-- Evaluating `e_T` moves one step along the actual source orbit. -/ +theorem equalCharacteristicDirectTheta_sourceLubinTate_evaluation + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] (n i : ℕ) : + equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicDirectThetaSourceIterateInteger F n i) + (equalCharacteristicDirectThetaSourceIterateInteger_hasEval F n i) + (equalCharacteristicCompletedLubinTateSeries + (PowerSeries.X : (AlgebraicClosure F.residueField)⟦X⟧)) = + equalCharacteristicDirectThetaSourceIterateInteger F n (i + 1) := by + rw [equalCharacteristicCompletedLubinTateSeries, + map_add, map_pow, map_mul, + equalCharacteristicCompletedLevelEvaluation_X, + equalCharacteristicCompletedLevelEvaluation_C] + apply Subtype.ext + change + ((equalCharacteristicDirectThetaSourceIterateInteger F n i : + Valued.integer (equalCharacteristicCompletedLevelField F n)) : + equalCharacteristicCompletedLevelField F n) ^ + Nat.card F.residueField + + ((equalCharacteristicCompletedLevelUniformizerInteger F n : + Valued.integer (equalCharacteristicCompletedLevelField F n)) : + equalCharacteristicCompletedLevelField F n) * + ((equalCharacteristicDirectThetaSourceIterateInteger F n i : + Valued.integer (equalCharacteristicCompletedLevelField F n)) : + equalCharacteristicCompletedLevelField F n) = + ((equalCharacteristicDirectThetaSourceIterateInteger F n (i + 1) : + Valued.integer (equalCharacteristicCompletedLevelField F n)) : + equalCharacteristicCompletedLevelField F n) + rw [equalCharacteristicDirectThetaSourceIterateInteger_coe, + equalCharacteristicDirectThetaSourceUniformizerInteger_coe, + equalCharacteristicDirectThetaSourceIterateInteger_coe] + rw [← equalCharacteristicLubinTateAmbientPiEnd_apply, + equalCharacteristicDirectThetaSourceIterate, + equalCharacteristicLubinTateAmbientPiEnd_iterate, + ← equalCharacteristicLubinTateAmbientPiIterate_succ] + rfl + +private theorem equalCharacteristicDirectThetaEvaluation_hasEval_of_hasSubst + (F : LocalField.{u, v} K) (n : ℕ) + (x : Valued.integer (equalCharacteristicCompletedLevelField F n)) + (hx : PowerSeries.HasEval x) + (a : ((AlgebraicClosure F.residueField)⟦X⟧)⟦X⟧) + (ha : PowerSeries.HasSubst a) : + PowerSeries.HasEval + (equalCharacteristicCompletedLevelEvaluation F n x hx a) := by + exact ha.hasEval.map + ( φ := equalCharacteristicCompletedLevelEvaluation F n x hx) + (by + rw [equalCharacteristicCompletedLevelEvaluation, + PowerSeries.coe_eval₂Hom] + exact PowerSeries.continuous_eval₂ + (equalCharacteristicDirectThetaCoefficientHom_continuous F n) hx) + +private theorem equalCharacteristicDirectThetaEvaluation_subst + (F : LocalField.{u, v} K) (n : ℕ) + (x : Valued.integer (equalCharacteristicCompletedLevelField F n)) + (hx : PowerSeries.HasEval x) + (a f : ((AlgebraicClosure F.residueField)⟦X⟧)⟦X⟧) + (ha : PowerSeries.HasSubst a) + (haEval : PowerSeries.HasEval + (equalCharacteristicCompletedLevelEvaluation F n x hx a)) : + equalCharacteristicCompletedLevelEvaluation F n x hx + (PowerSeries.subst a f) = + equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicCompletedLevelEvaluation F n x hx a) haEval f := by + let R := (AlgebraicClosure F.residueField)⟦X⟧ + let S := Valued.integer (equalCharacteristicCompletedLevelField F n) + simp only [equalCharacteristicCompletedLevelEvaluation, + PowerSeries.coe_eval₂Hom] + change PowerSeries.eval₂ (algebraMap R S) x (PowerSeries.subst a f) = + PowerSeries.eval₂ (algebraMap R S) + (PowerSeries.eval₂ (algebraMap R S) x a) f + simpa only [PowerSeries.eval₂, PowerSeries.subst, Function.const_apply] + using + (MvPowerSeries.eval₂_subst + (R := R) (S := R) (T := S) + (a := fun _ : Unit ↦ a) ha.const + (PowerSeries.hasEval hx) f) + +/-- The analytic value of the `i`-th direct Frobenius twist at the `i`-th +standard source iterate. -/ +noncomputable def + equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n i : ℕ) : + Valued.integer (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicDirectThetaSourceIterateInteger F n i) + (equalCharacteristicDirectThetaSourceIterateInteger_hasEval F n i) + (equalCharacteristicDirectThetaSeriesFrobeniusIterate u i) + +/-- The evaluated Frobenius theta iterate is summable at the matching source iterate. -/ +theorem + equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate_hasSum + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n i : ℕ) : + HasSum + (fun m : ℕ ↦ + equalCharacteristicCompletedLevelCoefficientHom F n + (PowerSeries.coeff m + (equalCharacteristicDirectThetaSeriesFrobeniusIterate u i)) * + equalCharacteristicDirectThetaSourceIterateInteger F n i ^ m) + (equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate + F u n i) := by + rw [equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate, + equalCharacteristicCompletedLevelEvaluation, PowerSeries.coe_eval₂Hom] + exact PowerSeries.hasSum_eval₂ + (equalCharacteristicDirectThetaCoefficientHom_continuous F n) + (equalCharacteristicDirectThetaSourceIterateInteger_hasEval F n i) + (equalCharacteristicDirectThetaSeriesFrobeniusIterate u i) + +/-- The Frobenius theta iterate admits evaluation at the matching source iterate. -/ +theorem + equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate_hasEval + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n i : ℕ) : + PowerSeries.HasEval + (equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate + F u n i) := by + rw [equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate] + exact equalCharacteristicDirectThetaEvaluation_hasEval_of_hasSubst + F n (equalCharacteristicDirectThetaSourceIterateInteger F n i) + (equalCharacteristicDirectThetaSourceIterateInteger_hasEval F n i) + (equalCharacteristicDirectThetaSeriesFrobeniusIterate u i) + (equalCharacteristicDirectThetaSeriesFrobeniusIterate_hasSubst u i) + +private theorem + equalCharacteristicDirectThetaSeriesFrobeniusIterate_coeff_one_isUnit + {k : Type*} [Field k] [Finite k] (u : k⟦X⟧ˣ) (i : ℕ) : + IsUnit (PowerSeries.coeff 1 + (equalCharacteristicDirectThetaSeriesFrobeniusIterate u i)) := by + induction i with + | zero => + rw [equalCharacteristicDirectThetaSeriesFrobeniusIterate_zero, + equalCharacteristicDirectThetaSeries_coeff_one, + PowerSeries.isUnit_iff_constantCoeff] + apply isUnit_iff_ne_zero.mpr + simpa [PowerSeries.coeff_zero_eq_constantCoeff_apply] using + (equalCharacteristicSemilinearUnit_constantCoeff_ne_zero + (u : k⟦X⟧) + (by + intro hzero + have hunit := PowerSeries.isUnit_constantCoeff + (u : k⟦X⟧) u.isUnit + apply hunit.ne_zero + simpa [PowerSeries.coeff_zero_eq_constantCoeff_apply] using hzero)) + | succ i ih => + rw [equalCharacteristicDirectThetaSeriesFrobeniusIterate_succ, + PowerSeries.coeff_map] + exact IsUnit.map (equalCharacteristicPowerSeriesFrobenius k) ih + +private theorem + equalCharacteristicDirectThetaFrobeniusIterateCoefficientOne_isUnit + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) + (n i : ℕ) : + IsUnit + (equalCharacteristicCompletedLevelCoefficientHom F n + (PowerSeries.coeff 1 + (equalCharacteristicDirectThetaSeriesFrobeniusIterate u i))) := + IsUnit.map (equalCharacteristicCompletedLevelCoefficientHom F n) + (equalCharacteristicDirectThetaSeriesFrobeniusIterate_coeff_one_isUnit u i) + +private theorem + equalCharacteristicDirectThetaFrobeniusIterateAtZero_hasSum + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) + (n i : ℕ) : + HasSum + (fun m : ℕ ↦ + equalCharacteristicCompletedLevelCoefficientHom F n + (PowerSeries.coeff m + (equalCharacteristicDirectThetaSeriesFrobeniusIterate u i)) * + (0 : Valued.integer + (equalCharacteristicCompletedLevelField F n)) ^ m) + 0 := by + have hterms : + (fun m : ℕ ↦ + equalCharacteristicCompletedLevelCoefficientHom F n + (PowerSeries.coeff m + (equalCharacteristicDirectThetaSeriesFrobeniusIterate u i)) * + (0 : Valued.integer + (equalCharacteristicCompletedLevelField F n)) ^ m) = + fun _ ↦ 0 := by + funext m + cases m with + | zero => + simp [PowerSeries.coeff_zero_eq_constantCoeff_apply, + equalCharacteristicDirectThetaSeriesFrobeniusIterate_constantCoeff] + | succ m => simp + rw [hterms] + exact hasSum_zero + +private theorem + equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate_norm + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n i : ℕ) : + ‖equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate F u n i‖ = + ‖equalCharacteristicDirectThetaSourceIterateInteger F n i‖ := by + have h := integralPowerSeriesEvaluation_norm_sub + (fun m : ℕ ↦ + equalCharacteristicCompletedLevelCoefficientHom F n + (PowerSeries.coeff m + (equalCharacteristicDirectThetaSeriesFrobeniusIterate u i))) + (equalCharacteristicDirectThetaFrobeniusIterateCoefficientOne_isUnit + F u n i) + (equalCharacteristicDirectThetaSourceIterateInteger F n i) 0 + (equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate F u n i) 0 + (equalCharacteristicDirectThetaSourceIterateInteger_norm_lt_one F n i) + (by simp) + (equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate_hasSum + F u n i) + (equalCharacteristicDirectThetaFrobeniusIterateAtZero_hasSum F u n i) + simpa using h + +/-- Analytic form of the `i`-th direct second identity. -/ +theorem equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate_succ + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n i : ℕ) : + equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate + F u n (i + 1) = + equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate F u n i ^ + Nat.card F.residueField + + equalCharacteristicDirectThetaTargetUniformizerInteger F u n * + equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate + F u n i := by + let x := equalCharacteristicDirectThetaSourceIterateInteger F n i + let hx := equalCharacteristicDirectThetaSourceIterateInteger_hasEval F n i + let source := equalCharacteristicCompletedLubinTateSeries + (PowerSeries.X : (AlgebraicClosure F.residueField)⟦X⟧) + let target := equalCharacteristicCompletedLubinTateSeries + (equalCharacteristicDirectCompletedTargetUniformizer u) + let twist := equalCharacteristicDirectThetaSeriesFrobeniusIterate u i + let nextTwist := + equalCharacteristicDirectThetaSeriesFrobeniusIterate u (i + 1) + have hsourceEval : PowerSeries.HasEval + (equalCharacteristicCompletedLevelEvaluation F n x hx source) := + equalCharacteristicDirectThetaEvaluation_hasEval_of_hasSubst + F n x hx source + (equalCharacteristicCompletedLubinTateSeries_hasSubst + (PowerSeries.X : (AlgebraicClosure F.residueField)⟦X⟧)) + have htwistEval : PowerSeries.HasEval + (equalCharacteristicCompletedLevelEvaluation F n x hx twist) := + equalCharacteristicDirectThetaEvaluation_hasEval_of_hasSubst + F n x hx twist + (equalCharacteristicDirectThetaSeriesFrobeniusIterate_hasSubst u i) + have hleft := equalCharacteristicDirectThetaEvaluation_subst + F n x hx source nextTwist + (equalCharacteristicCompletedLubinTateSeries_hasSubst + (PowerSeries.X : (AlgebraicClosure F.residueField)⟦X⟧)) hsourceEval + have hright := equalCharacteristicDirectThetaEvaluation_subst + F n x hx twist target + (equalCharacteristicDirectThetaSeriesFrobeniusIterate_hasSubst u i) + htwistEval + have hformal := congrArg + (equalCharacteristicCompletedLevelEvaluation F n x hx) + (equalCharacteristicDirectThetaSeriesFrobeniusIterate_intertwines u i) + have hevaluated : + equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicCompletedLevelEvaluation F n x hx source) + hsourceEval nextTwist = + equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicCompletedLevelEvaluation F n x hx twist) + htwistEval target := by + calc + _ = equalCharacteristicCompletedLevelEvaluation F n x hx + (PowerSeries.subst source nextTwist) := hleft.symm + _ = equalCharacteristicCompletedLevelEvaluation F n x hx + (PowerSeries.subst twist target) := by + simpa [source, nextTwist, twist, target] using hformal + _ = _ := hright + simp only [x, source, + equalCharacteristicDirectTheta_sourceLubinTate_evaluation] at hevaluated + simpa only [x, hx, source, target, twist, nextTwist, + equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate, + equalCharacteristicCompletedLubinTateSeries, + map_add, map_pow, map_mul, + equalCharacteristicCompletedLevelEvaluation_X, + equalCharacteristicCompletedLevelEvaluation_C, + equalCharacteristicDirectThetaTargetUniformizerInteger] using hevaluated + +/-- Genuine analytic evaluation of the direct theta series at the standard +completed primitive root `lambda`. -/ +noncomputable def equalCharacteristicDirectThetaAtCompletedPrimitiveRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Valued.integer (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicCompletedPrimitiveRootInteger F n) + (equalCharacteristicCompletedPrimitiveRootInteger_hasEval F n) + (equalCharacteristicDirectThetaSeries u) + +/-- The coefficient expansion defining the direct theta value converges. -/ +theorem equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_hasSum + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + HasSum + (fun m : ℕ ↦ + equalCharacteristicCompletedLevelCoefficientHom F n + (PowerSeries.coeff m (equalCharacteristicDirectThetaSeries u)) * + equalCharacteristicCompletedPrimitiveRootInteger F n ^ m) + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F u n) := by + rw [equalCharacteristicDirectThetaAtCompletedPrimitiveRoot, + equalCharacteristicCompletedLevelEvaluation, PowerSeries.coe_eval₂Hom] + exact PowerSeries.hasSum_eval₂ + (equalCharacteristicDirectThetaCoefficientHom_continuous F n) + (equalCharacteristicCompletedPrimitiveRootInteger_hasEval F n) + (equalCharacteristicDirectThetaSeries u) + +private theorem + equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate_zero + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate F u n 0 = + equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F u n := by + have hpoint : + equalCharacteristicDirectThetaSourceIterateInteger F n 0 = + equalCharacteristicCompletedPrimitiveRootInteger F n := by + apply Subtype.ext + change equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicCompletedLevelUniformizer F n) 0 + (equalCharacteristicCompletedPrimitiveRoot F n) = + equalCharacteristicCompletedPrimitiveRoot F n + rw [equalCharacteristicLubinTateAmbientPiIterate, pow_zero] + rfl + rw [equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate, + equalCharacteristicDirectThetaAtCompletedPrimitiveRoot, + equalCharacteristicDirectThetaSeriesFrobeniusIterate_zero] + simp only [equalCharacteristicCompletedLevelEvaluation, + PowerSeries.coe_eval₂Hom] + rw [hpoint] + +/-- The standard primitive root is killed by the source parameter `T` at +division level `n + 1`. -/ +private theorem equalCharacteristicDirectThetaSourceRoot_torsion + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] (n : ℕ) : + IsEqualCharacteristicLubinTateAmbientTorsion F + (equalCharacteristicCompletedLevelUniformizer F n) (n + 1) + (equalCharacteristicCompletedPrimitiveRoot F n) := by + let z := equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicCompletedLevelUniformizer F n) n + (equalCharacteristicCompletedPrimitiveRoot F n) + have hz := equalCharacteristicCompletedPrimitiveRoot_equation F n + change equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicCompletedLevelUniformizer F n) (n + 1) + (equalCharacteristicCompletedPrimitiveRoot F n) = 0 + rw [show n + 1 = 1 + n by omega, + equalCharacteristicLubinTateAmbientPiIterate_add, + equalCharacteristicLubinTateAmbientPiIterate_one, + equalCharacteristicLubinTateAmbientPiEnd_apply] + change z ^ Nat.card F.residueField + + equalCharacteristicCompletedLevelUniformizer F n * z = 0 + have hq : Nat.card F.residueField ≠ 0 := Nat.card_pos.ne' + rw [← pow_sub_one_mul hq, ← add_mul, hz, zero_mul] + +/-- The standard primitive root is not killed at source division level `n`. -/ +private theorem equalCharacteristicDirectThetaSourceRoot_not_torsion_pred + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] (n : ℕ) : + ¬ IsEqualCharacteristicLubinTateAmbientTorsion F + (equalCharacteristicCompletedLevelUniformizer F n) n + (equalCharacteristicCompletedPrimitiveRoot F n) := by + intro hpred + have heq := equalCharacteristicCompletedPrimitiveRoot_equation F n + rw [hpred, zero_pow, zero_add] at heq + · have ht : equalCharacteristicCompletedLevelUniformizer F n ≠ 0 := by + rw [equalCharacteristicCompletedLevelUniformizer] + apply (map_ne_zero + (algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n))).2 + change (HahnSeries.single 1 1 : + (AlgebraicClosure F.residueField)⸨X⸩) ≠ 0 + exact HahnSeries.single_ne_zero one_ne_zero + exact ht heq + · exact Nat.sub_ne_zero_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField) + +/-- Iterating the evaluated second identity identifies the target `uT` +orbit of `theta(lambda)` with the successive twisted source evaluations. -/ +theorem equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_targetIterate + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n i : ℕ) : + equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicDirectThetaTargetUniformizer F u n) i + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F u n : + equalCharacteristicCompletedLevelField F n) = + (equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate + F u n i : equalCharacteristicCompletedLevelField F n) := by + induction i with + | zero => + rw [equalCharacteristicLubinTateAmbientPiIterate, pow_zero] + exact congrArg Subtype.val + (equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate_zero + F u n).symm + | succ i ih => + rw [equalCharacteristicLubinTateAmbientPiIterate_succ, + ← equalCharacteristicLubinTateAmbientPiEnd_iterate, ih, + equalCharacteristicLubinTateAmbientPiEnd_apply] + have h := congrArg + (fun z : Valued.integer + (equalCharacteristicCompletedLevelField F n) ↦ + (z : equalCharacteristicCompletedLevelField F n)) + (equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate_succ + F u n i) + change + (equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate + F u n (i + 1) : + equalCharacteristicCompletedLevelField F n) = + (equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate + F u n i : + equalCharacteristicCompletedLevelField F n) ^ + Nat.card F.residueField + + (equalCharacteristicDirectThetaTargetUniformizerInteger F u n : + equalCharacteristicCompletedLevelField F n) * + (equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate + F u n i : + equalCharacteristicCompletedLevelField F n) at h + rw [equalCharacteristicDirectThetaTargetUniformizerInteger_coe] at h + exact h.symm + +/-- The direct theta value is killed by target `uT` at division level +`n + 1`. -/ +theorem equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_torsion + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + IsEqualCharacteristicLubinTateAmbientTorsion F + (equalCharacteristicDirectThetaTargetUniformizer F u n) (n + 1) + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F u n : + equalCharacteristicCompletedLevelField F n) := by + have hsource := equalCharacteristicDirectThetaSourceRoot_torsion F n + change equalCharacteristicDirectThetaSourceIterate F n (n + 1) = 0 + at hsource + change equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicDirectThetaTargetUniformizer F u n) (n + 1) + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F u n : + equalCharacteristicCompletedLevelField F n) = 0 + rw [equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_targetIterate] + apply norm_eq_zero.mp + change ‖equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate + F u n (n + 1)‖ = 0 + rw [equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate_norm] + change ‖equalCharacteristicDirectThetaSourceIterate F n (n + 1)‖ = 0 + rw [hsource, norm_zero] + +/-- The target value is not killed at division level `n`. -/ +theorem equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_not_torsion_pred + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + ¬ IsEqualCharacteristicLubinTateAmbientTorsion F + (equalCharacteristicDirectThetaTargetUniformizer F u n) n + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F u n : + equalCharacteristicCompletedLevelField F n) := by + intro htarget + have hsource := equalCharacteristicDirectThetaSourceRoot_not_torsion_pred F n + apply hsource + change equalCharacteristicDirectThetaSourceIterate F n n = 0 + have htarget' := htarget + change equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicDirectThetaTargetUniformizer F u n) n + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F u n : + equalCharacteristicCompletedLevelField F n) = 0 at htarget' + rw [equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_targetIterate] + at htarget' + have hvalue : + equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate + F u n n = 0 := by + apply Subtype.ext + exact htarget' + apply norm_eq_zero.mp + change ‖equalCharacteristicDirectThetaSourceIterateInteger F n n‖ = 0 + rw [← equalCharacteristicDirectThetaFrobeniusIterateAtSourceIterate_norm, + hvalue, norm_zero] + +/-- Hence `theta(lambda)` is a primitive target `uT`-division point at +division level `n + 1`. -/ +theorem equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_isPrimitive + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + IsEqualCharacteristicLubinTateAmbientTorsion F + (equalCharacteristicDirectThetaTargetUniformizer F u n) (n + 1) + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F u n : + equalCharacteristicCompletedLevelField F n) ∧ + ¬ IsEqualCharacteristicLubinTateAmbientTorsion F + (equalCharacteristicDirectThetaTargetUniformizer F u n) n + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F u n : + equalCharacteristicCompletedLevelField F n) := + ⟨equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_torsion F u n, + equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_not_torsion_pred + F u n⟩ + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFirstIdentity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFirstIdentity.lean new file mode 100644 index 0000000000..b2dc5b9bd3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFirstIdentity.lean @@ -0,0 +1,315 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket +/-! +# First theta identity for the completed change of parameter + +For the standard source prime `T` and target prime `uT`, this file proves + +`theta^φ = theta ∘ [u]`. + +The bracket `[u]` is the independently constructed endomorphism of the +standard Lubin--Tate group from `EqualCharacteristicDirectLubinTateBracket`. +The proof follows the uniqueness argument: both sides have +the same linear coefficient and satisfy the same contracting coefficient +recursion. +-/ + +@[expose] public section + +noncomputable +section + +open scoped PowerSeries + + +universe u + +namespace LubinTate +namespace EqualCharacteristic + +variable {k : Type u} [Field k] [Finite k] + +/-- Coefficients of the formal composite `theta ∘ [u]`. -/ +noncomputable def equalCharacteristicDirectThetaAfterBracketCoefficient + (u : k⟦X⟧ˣ) : ℕ → (AlgebraicClosure k)⟦X⟧ := + equalCharacteristicQAdditiveCompositionCoefficient (k := k) + (equalCharacteristicDirectThetaCoefficient u) + (equalCharacteristicCompletedDirectBracketCoefficient (u : k⟦X⟧)) + +/-- The composite `theta ∘ [u]` written as a sparse `q`-additive series. -/ +theorem equalCharacteristicDirectThetaSeries_subst_directBracket + (u : k⟦X⟧ˣ) : + PowerSeries.subst + (equalCharacteristicCompletedDirectBracket (u : k⟦X⟧)) + (equalCharacteristicDirectThetaSeries u) = + equalCharacteristicQAdditiveSeries k + (equalCharacteristicDirectThetaAfterBracketCoefficient u) := by + exact equalCharacteristicQAdditiveSeries_subst_qAdditiveSeries + (k := k) (equalCharacteristicDirectThetaCoefficient u) + (equalCharacteristicCompletedDirectBracketCoefficient (u : k⟦X⟧)) + +/-- The linear term of `theta ∘ [u]` is `φ(b₀)`. -/ +theorem equalCharacteristicDirectThetaAfterBracketCoefficient_zero + (u : k⟦X⟧ˣ) : + equalCharacteristicDirectThetaAfterBracketCoefficient u 0 = + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicDirectThetaCoefficient u 0) := by + have hsemi := equalCharacteristicPowerSeriesFrobenius_semilinearUnit + (k := k) (u : k⟦X⟧) + (by + intro hzero + have hunit := PowerSeries.isUnit_constantCoeff (u : k⟦X⟧) u.isUnit + apply hunit.ne_zero + simpa [PowerSeries.coeff_zero_eq_constantCoeff_apply] using hzero) + rw [equalCharacteristicDirectThetaCoefficient_zero] + simpa [equalCharacteristicDirectThetaAfterBracketCoefficient, + equalCharacteristicQAdditiveCompositionCoefficient, + equalCharacteristicCompletedDirectBracketCoefficient] using + (mul_comm _ _).trans hsemi.symm + +/-- Since `[u]` is Frobenius-fixed and commutes with `e_T`, the composite +`theta ∘ [u]` satisfies theta's direct Frobenius-intertwining equation. -/ +theorem equalCharacteristicDirectThetaSeries_subst_directBracket_intertwines + (u : k⟦X⟧ˣ) : + PowerSeries.subst + (equalCharacteristicCompletedLubinTateSeries (k := k) + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧)) + (PowerSeries.map (equalCharacteristicPowerSeriesFrobenius k) + (PowerSeries.subst + (equalCharacteristicCompletedDirectBracket (u : k⟦X⟧)) + (equalCharacteristicDirectThetaSeries u))) = + PowerSeries.subst + (PowerSeries.subst + (equalCharacteristicCompletedDirectBracket (u : k⟦X⟧)) + (equalCharacteristicDirectThetaSeries u)) + (equalCharacteristicCompletedLubinTateSeries (k := k) + (equalCharacteristicDirectCompletedTargetUniformizer u)) := by + let H := equalCharacteristicCompletedDirectBracket (u : k⟦X⟧) + let E := equalCharacteristicCompletedLubinTateSeries (k := k) + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧) + let Ebar := equalCharacteristicCompletedLubinTateSeries (k := k) + (equalCharacteristicDirectCompletedTargetUniformizer u) + let Theta := equalCharacteristicDirectThetaSeries u + let ThetaF := equalCharacteristicDirectThetaSeriesFrobenius u + have hH : PowerSeries.HasSubst H := + equalCharacteristicCompletedDirectBracket_hasSubst (u : k⟦X⟧) + have hE : PowerSeries.HasSubst E := + equalCharacteristicCompletedLubinTateSeries_hasSubst + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧) + have hTheta : PowerSeries.HasSubst Theta := + equalCharacteristicDirectThetaSeries_hasSubst u + have hmap : + PowerSeries.map (equalCharacteristicPowerSeriesFrobenius k) + (PowerSeries.subst H Theta) = + PowerSeries.subst H ThetaF := by + change (PowerSeries.subst H Theta).map + (equalCharacteristicPowerSeriesFrobenius k) = _ + rw [PowerSeries.map_subst hH] + have hHfixed : + PowerSeries.map (equalCharacteristicPowerSeriesFrobenius k) H = H := by + simpa only [H] using + equalCharacteristicCompletedDirectBracket_frobenius (u : k⟦X⟧) + change MvPowerSeries.map + (equalCharacteristicPowerSeriesFrobenius k) H = H at hHfixed + rw [hHfixed] + rfl + change PowerSeries.subst E + (PowerSeries.map (equalCharacteristicPowerSeriesFrobenius k) + (PowerSeries.subst H Theta)) = + PowerSeries.subst (PowerSeries.subst H Theta) Ebar + calc + _ = PowerSeries.subst E (PowerSeries.subst H ThetaF) := by rw [hmap] + _ = PowerSeries.subst (PowerSeries.subst E H) ThetaF := + PowerSeries.subst_comp_subst_apply hH hE ThetaF + _ = PowerSeries.subst (PowerSeries.subst H E) ThetaF := by + rw [equalCharacteristicCompletedDirectBracket_commutes (u : k⟦X⟧)] + _ = PowerSeries.subst H (PowerSeries.subst E ThetaF) := + (PowerSeries.subst_comp_subst_apply hE hH ThetaF).symm + _ = PowerSeries.subst H (PowerSeries.subst Theta Ebar) := by + rw [equalCharacteristicDirectThetaSeries_intertwines u] + _ = PowerSeries.subst (PowerSeries.subst H Theta) Ebar := + PowerSeries.subst_comp_subst_apply hTheta hH Ebar + +/-- Coefficient form of a direct-orientation Frobenius intertwiner. -/ +theorem equalCharacteristicDirectQAdditiveIntertwiner_succ_comparison + (u : k⟦X⟧ˣ) + (c : ℕ → (AlgebraicClosure k)⟦X⟧) + (hintertwines : + PowerSeries.subst + (equalCharacteristicCompletedLubinTateSeries (k := k) + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧)) + (equalCharacteristicQAdditiveSeries k + (fun i ↦ equalCharacteristicPowerSeriesFrobenius k (c i))) = + PowerSeries.subst (equalCharacteristicQAdditiveSeries k c) + (equalCharacteristicCompletedLubinTateSeries (k := k) + (equalCharacteristicDirectCompletedTargetUniformizer u))) + (j : ℕ) : + equalCharacteristicDirectCompletedTargetUniformizer u * c (j + 1) - + PowerSeries.X ^ (Nat.card k ^ (j + 1)) * + equalCharacteristicPowerSeriesFrobenius k (c (j + 1)) = + equalCharacteristicPowerSeriesFrobenius k (c j) - + c j ^ Nat.card k := by + rw [equalCharacteristicQAdditiveSeries_subst_completedLubinTateSeries, + equalCharacteristicCompletedLubinTateSeries_subst_qAdditiveSeries] + at hintertwines + have hcoeff := congrArg + (PowerSeries.coeff (Nat.card k ^ (j + 1))) hintertwines + rw [equalCharacteristicQAdditiveSeries_coeff_pow, + equalCharacteristicQAdditiveSeries_coeff_pow, + equalCharacteristicLubinTateSubstitutionCoefficient, + equalCharacteristicLubinTatePostcompositionCoefficient] at hcoeff + linear_combination -hcoeff + +/-- Direct-orientation intertwiners with the same linear coefficient are +equal. At every higher coefficient this is exactly the uniqueness clause of +the contracting Frobenius equation. -/ +theorem equalCharacteristicDirectQAdditiveIntertwinerCoefficient_unique + (u : k⟦X⟧ˣ) + (c d : ℕ → (AlgebraicClosure k)⟦X⟧) + (hzero : c 0 = d 0) + (hc : ∀ j : ℕ, + equalCharacteristicDirectCompletedTargetUniformizer u * c (j + 1) - + PowerSeries.X ^ (Nat.card k ^ (j + 1)) * + equalCharacteristicPowerSeriesFrobenius k (c (j + 1)) = + equalCharacteristicPowerSeriesFrobenius k (c j) - + c j ^ Nat.card k) + (hd : ∀ j : ℕ, + equalCharacteristicDirectCompletedTargetUniformizer u * d (j + 1) - + PowerSeries.X ^ (Nat.card k ^ (j + 1)) * + equalCharacteristicPowerSeriesFrobenius k (d (j + 1)) = + equalCharacteristicPowerSeriesFrobenius k (d j) - + d j ^ Nat.card k) : + c = d := by + funext j + induction j with + | zero => exact hzero + | succ j ih => + have hcj := hc j + have hdj := hd j + rw [ih] at hcj + let delta := c (j + 1) - d (j + 1) + have hdiff : + equalCharacteristicDirectCompletedTargetUniformizer u * delta - + PowerSeries.X ^ (Nat.card k ^ (j + 1)) * + equalCharacteristicPowerSeriesFrobenius k delta = 0 := by + dsimp only [delta] + rw [map_sub] + linear_combination hcj - hdj + have hmul : + equalCharacteristicDirectCompletedTargetUniformizer u * + (delta - equalCharacteristicDirectThetaGamma u (j + 1) * + equalCharacteristicPowerSeriesFrobenius k delta) = 0 := by + rw [mul_sub, ← mul_assoc, + equalCharacteristicDirectTargetUniformizer_mul_gamma u + (j + 1) (Nat.zero_lt_succ j)] + exact hdiff + have htarget : + equalCharacteristicDirectCompletedTargetUniformizer u ≠ 0 := by + rw [equalCharacteristicDirectCompletedTargetUniformizer] + exact mul_ne_zero + ((u.isUnit.map + (PowerSeries.map (algebraMap k (AlgebraicClosure k)))).ne_zero) + (PowerSeries.X_ne_zero (R := AlgebraicClosure k)) + have hhom : + delta - equalCharacteristicDirectThetaGamma u (j + 1) * + equalCharacteristicPowerSeriesFrobenius k delta = 0 := by + exact mul_left_cancel₀ htarget (by simpa using hmul) + have hgamma := equalCharacteristicDirectThetaGamma_constantCoeff u + (j + 1) (Nat.zero_lt_succ j) + have hunique := existsUnique_contractingFrobeniusEquation + (equalCharacteristicCoefficientFrobenius k).toRingHom + (equalCharacteristicDirectThetaGamma u (j + 1)) 0 hgamma + have hzeroSolution : + (0 : (AlgebraicClosure k)⟦X⟧) - + equalCharacteristicDirectThetaGamma u (j + 1) * + equalCharacteristicPowerSeriesFrobenius k 0 = 0 := by + simp + have hdelta : delta = 0 := + hunique.unique hhom hzeroSolution + exact sub_eq_zero.mp (by simpa only [delta] using hdelta) + +/-- The target prime `uT` is fixed by arithmetic Frobenius. -/ +theorem equalCharacteristicDirectCompletedTargetUniformizer_frobenius + (u : k⟦X⟧ˣ) : + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicDirectCompletedTargetUniformizer u) = + equalCharacteristicDirectCompletedTargetUniformizer u := by + rw [equalCharacteristicDirectCompletedTargetUniformizer, map_mul, + equalCharacteristicPowerSeriesFrobenius_map_algebraMap, + equalCharacteristicPowerSeriesFrobenius_X] + +/-- Applying Frobenius to theta's coefficient comparison gives the recursion +for the coefficients of `theta^φ`. -/ +theorem equalCharacteristicDirectThetaFrobeniusCoefficient_succ_comparison + (u : k⟦X⟧ˣ) (j : ℕ) : + equalCharacteristicDirectCompletedTargetUniformizer u * + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicDirectThetaCoefficient u (j + 1)) - + PowerSeries.X ^ (Nat.card k ^ (j + 1)) * + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicDirectThetaCoefficient u (j + 1))) = + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicDirectThetaCoefficient u j)) - + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicDirectThetaCoefficient u j) ^ Nat.card k := by + have h := congrArg (equalCharacteristicPowerSeriesFrobenius k) + (equalCharacteristicDirectThetaCoefficient_succ_comparison u j) + simpa [map_sub, map_mul, map_pow, + equalCharacteristicPowerSeriesFrobenius_X, + equalCharacteristicDirectCompletedTargetUniformizer_frobenius] using h + +/-- Coefficients of `theta ∘ [u]` obey the same direct recursion. -/ +theorem equalCharacteristicDirectThetaAfterBracketCoefficient_succ_comparison + (u : k⟦X⟧ˣ) (j : ℕ) : + equalCharacteristicDirectCompletedTargetUniformizer u * + equalCharacteristicDirectThetaAfterBracketCoefficient u (j + 1) - + PowerSeries.X ^ (Nat.card k ^ (j + 1)) * + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicDirectThetaAfterBracketCoefficient u (j + 1)) = + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicDirectThetaAfterBracketCoefficient u j) - + equalCharacteristicDirectThetaAfterBracketCoefficient u j ^ Nat.card k := by + have hintertwines := + equalCharacteristicDirectThetaSeries_subst_directBracket_intertwines u + rw [equalCharacteristicDirectThetaSeries_subst_directBracket, + equalCharacteristicQAdditiveSeries_map] at hintertwines + exact equalCharacteristicDirectQAdditiveIntertwiner_succ_comparison + u (equalCharacteristicDirectThetaAfterBracketCoefficient u) + hintertwines j + +/-- The completed theta-intertwining theorem, first theta identity in the direct orientation: +`theta^φ = theta ∘ [u]`. -/ +theorem equalCharacteristicDirectThetaSeriesFrobenius_eq_subst_directBracket + (u : k⟦X⟧ˣ) : + equalCharacteristicDirectThetaSeriesFrobenius u = + PowerSeries.subst + (equalCharacteristicCompletedDirectBracket (u : k⟦X⟧)) + (equalCharacteristicDirectThetaSeries u) := by + have hcoeff : + (fun j ↦ equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicDirectThetaCoefficient u j)) = + equalCharacteristicDirectThetaAfterBracketCoefficient u := + equalCharacteristicDirectQAdditiveIntertwinerCoefficient_unique u + (fun j ↦ equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicDirectThetaCoefficient u j)) + (equalCharacteristicDirectThetaAfterBracketCoefficient u) + (equalCharacteristicDirectThetaAfterBracketCoefficient_zero u).symm + (equalCharacteristicDirectThetaFrobeniusCoefficient_succ_comparison u) + (equalCharacteristicDirectThetaAfterBracketCoefficient_succ_comparison u) + rw [equalCharacteristicDirectThetaSeriesFrobenius_eq_qAdditiveSeries, + equalCharacteristicDirectThetaSeries_subst_directBracket] + exact congrArg (equalCharacteristicQAdditiveSeries k) hcoeff + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFrobeniusFixed.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFrobeniusFixed.lean new file mode 100644 index 0000000000..f16d307c90 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFrobeniusFixed.lean @@ -0,0 +1,626 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectBracketAtCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFirstIdentity +/-! +# The completed theta-intertwining theorem: Frobenius fixes the direct theta value + +For the direct change of parameter `T -> uT`, the completed +Frobenius lift is prescribed by `[u⁻¹]` on the standard primitive point. +This file proves that it fixes the genuine convergent value `theta(lambda)`. + +The proof first transports convergent power-series evaluations through the +semilinear Frobenius lift. The first theta identity then reduces fixedness to +`[u]([u⁻¹](lambda)) = lambda`, which is the genuine finite bracket action +on the completed division point. +-/ + +@[expose] public section + +noncomputable +section + +open Filter +open scoped LaurentSeries NNReal NormedField PowerSeries + PowerSeries.WithPiTopology Topology Valued WithZero + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +private instance equalCharacteristicDirectThetaFixedLevelCharP + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] (n : ℕ) : + CharP (equalCharacteristicCompletedLevelField F n) + F.residueCharacteristic := + equalCharacteristicDirectThetaCompletedLevelCharP F n + +/-- The Laurent-series base acts on the completed unramified field through the coefficient +embedding. -/ +noncomputable local instance equalCharacteristicDirectThetaFixedBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +noncomputable local instance + equalCharacteristicDirectThetaFixedBaseValuationIsNontrivial + (F : LocalField.{u, v} K) : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField F.residueField) ℤᵐ⁰).IsNontrivial := + equalCharacteristicCompletedBaseValuationIsNontrivial F.residueField + +/-- The discrete valuation on the completed unramified coefficient field has rank one. -/ +noncomputable local instance + equalCharacteristicDirectThetaFixedBaseValuationRankOne + (F : LocalField.{u, v} K) : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField F.residueField) ℤᵐ⁰).RankOne := + equalCharacteristicCompletedBaseValuationRankOne F.residueField + +/-- The canonical nontrivial norm on the completed unramified coefficient field. -/ +noncomputable local instance equalCharacteristicDirectThetaFixedBaseNormedField + (F : LocalField.{u, v} K) : + NontriviallyNormedField + (equalCharacteristicCompletedUnramifiedField F.residueField) := + equalCharacteristicCompletedBaseNormedField F.residueField + +/-- The canonical nontrivial norm on the completed Lubin–Tate field at level `n`. -/ +noncomputable local instance equalCharacteristicDirectThetaFixedLevelNormedField + (F : LocalField.{u, v} K) (n : ℕ) : + NontriviallyNormedField (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelNormedField F n + +noncomputable local instance equalCharacteristicDirectThetaFixedLevelIsUltrametric + (F : LocalField.{u, v} K) (n : ℕ) : + IsUltrametricDist (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelIsUltrametric F n + +noncomputable local instance equalCharacteristicDirectThetaFixedLevelCompleteSpace + (F : LocalField.{u, v} K) (n : ℕ) : + CompleteSpace (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelCompleteSpace F n + +/-- The nonnegative-real-valued valuation on the completed Lubin–Tate field at level `n`. -/ +noncomputable local instance equalCharacteristicDirectThetaFixedLevelValued + (F : LocalField.{u, v} K) (n : ℕ) : + Valued (equalCharacteristicCompletedLevelField F n) ℝ≥0 := + equalCharacteristicCompletedLevelValued F n + +noncomputable local instance equalCharacteristicDirectThetaFixedIntegerLinearTopology + (F : LocalField.{u, v} K) (n : ℕ) : + IsLinearTopology + (Valued.integer (equalCharacteristicCompletedLevelField F n)) + (Valued.integer (equalCharacteristicCompletedLevelField F n)) := + valuedIntegerLinearTopology + +noncomputable local instance equalCharacteristicDirectThetaFixedIntegerCompleteSpace + (F : LocalField.{u, v} K) (n : ℕ) : + CompleteSpace + (Valued.integer (equalCharacteristicCompletedLevelField F n)) := + valuedIntegerCompleteSpace + +noncomputable local instance equalCharacteristicDirectThetaFixedIntegerUniformAddGroup + (F : LocalField.{u, v} K) (n : ℕ) : + IsUniformAddGroup + (Valued.integer (equalCharacteristicCompletedLevelField F n)) := + valuedIntegerIsUniformAddGroup + +private noncomputable local instance + equalCharacteristicDirectThetaFixedCoefficientUniformSpace + (F : LocalField.{u, v} K) : + UniformSpace ((AlgebraicClosure F.residueField)⟦X⟧) := ⊥ + +private theorem equalCharacteristicDirectThetaFixedCoefficientHom_continuous + (F : LocalField.{u, v} K) (n : ℕ) : + Continuous (equalCharacteristicCompletedLevelCoefficientHom F n) := + continuous_of_discreteTopology + +private noncomputable local instance + equalCharacteristicDirectThetaFixedCoefficientAlgebra + (F : LocalField.{u, v} K) (n : ℕ) : + Algebra ((AlgebraicClosure F.residueField)⟦X⟧) + (Valued.integer (equalCharacteristicCompletedLevelField F n)) := + (equalCharacteristicCompletedLevelCoefficientHom F n).toAlgebra + +/-- Restriction of the completed theta-intertwining theorem Frobenius lift to the spectral +valuation ring. -/ +private noncomputable def equalCharacteristicCompletedIntegerFrobeniusLift + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Valued.integer (equalCharacteristicCompletedLevelField F n) →+* + Valued.integer (equalCharacteristicCompletedLevelField F n) where + toFun x := ⟨equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹ x, by + change ‖equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹ + (x : equalCharacteristicCompletedLevelField F n)‖₊ ≤ 1 + exact_mod_cast (show + ‖equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹ + (x : equalCharacteristicCompletedLevelField F n)‖ ≤ 1 by + rw [equalCharacteristicCompletedFrobeniusLift_norm] + exact_mod_cast x.property)⟩ + map_one' := by ext; simp + map_mul' x y := by ext; simp + map_zero' := by ext; simp + map_add' x y := by ext; simp + +@[simp] +private theorem equalCharacteristicCompletedIntegerFrobeniusLift_coe + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) + (x : Valued.integer (equalCharacteristicCompletedLevelField F n)) : + ((equalCharacteristicCompletedIntegerFrobeniusLift F u n x : + Valued.integer (equalCharacteristicCompletedLevelField F n)) : + equalCharacteristicCompletedLevelField F n) = + equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹ + (x : equalCharacteristicCompletedLevelField F n) := + rfl + +private theorem equalCharacteristicCompletedIntegerFrobeniusLift_continuous + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Continuous (equalCharacteristicCompletedIntegerFrobeniusLift F u n) := by + exact + ((equalCharacteristicCompletedFrobeniusLift_continuous F u n).comp + continuous_subtype_val).subtype_mk _ + +private theorem + equalCharacteristicCompletedIntegerFrobeniusLift_coefficientHom + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) + (f : (AlgebraicClosure F.residueField)⟦X⟧) : + equalCharacteristicCompletedIntegerFrobeniusLift F u n + (equalCharacteristicCompletedLevelCoefficientHom F n f) = + equalCharacteristicCompletedLevelCoefficientHom F n + (equalCharacteristicPowerSeriesFrobenius F.residueField f) := by + apply Subtype.ext + change equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹ + (algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + ((equalCharacteristicPowerSeriesToCompletedInteger F.residueField f : + Valued.integer + (equalCharacteristicCompletedUnramifiedField F.residueField)) : + equalCharacteristicCompletedUnramifiedField F.residueField)) = + algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + ((equalCharacteristicPowerSeriesToCompletedInteger F.residueField + (equalCharacteristicPowerSeriesFrobenius F.residueField f) : + Valued.integer + (equalCharacteristicCompletedUnramifiedField F.residueField)) : + equalCharacteristicCompletedUnramifiedField F.residueField) + rw [equalCharacteristicCompletedFrobeniusLiftEquiv_algebraMap] + apply congrArg (algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)) + change + equalCharacteristicCompletedUnramifiedFrobenius F.residueField + (algebraMap ((AlgebraicClosure F.residueField)⟦X⟧) + (equalCharacteristicCompletedUnramifiedField F.residueField) f) = + algebraMap ((AlgebraicClosure F.residueField)⟦X⟧) + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicPowerSeriesFrobenius F.residueField f) + exact + equalCharacteristicCompletedUnramifiedFrobenius_algebraMap_powerSeries + (k := F.residueField) f + +private theorem equalCharacteristicCompletedIntegerFrobeniusLift_hasEval + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) + (x : Valued.integer (equalCharacteristicCompletedLevelField F n)) + (hx : PowerSeries.HasEval x) : + PowerSeries.HasEval + (equalCharacteristicCompletedIntegerFrobeniusLift F u n x) := by + change Tendsto + (fun m : ℕ ↦ + (equalCharacteristicCompletedIntegerFrobeniusLift F u n x) ^ m) + atTop (nhds 0) + have h := + ((equalCharacteristicCompletedIntegerFrobeniusLift_continuous F u n).tendsto + 0).comp hx + have hpow : + (fun m : ℕ ↦ + (equalCharacteristicCompletedIntegerFrobeniusLift F u n x) ^ m) = + (equalCharacteristicCompletedIntegerFrobeniusLift F u n) ∘ + (fun m : ℕ ↦ x ^ m) := by + funext m + exact (map_pow (equalCharacteristicCompletedIntegerFrobeniusLift F u n) + x m).symm + rw [hpow] + simpa only [map_zero] using h + +/-- Convergent evaluation is semilinear for the completed theta-intertwining theorem Frobenius +lift. -/ +private theorem equalCharacteristicCompletedIntegerFrobeniusLift_evaluation + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) + (x : Valued.integer (equalCharacteristicCompletedLevelField F n)) + (hx : PowerSeries.HasEval x) + (f : ((AlgebraicClosure F.residueField)⟦X⟧)⟦X⟧) : + equalCharacteristicCompletedIntegerFrobeniusLift F u n + (equalCharacteristicCompletedLevelEvaluation F n x hx f) = + equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicCompletedIntegerFrobeniusLift F u n x) + (equalCharacteristicCompletedIntegerFrobeniusLift_hasEval F u n x hx) + (PowerSeries.map + (equalCharacteristicPowerSeriesFrobenius F.residueField) f) := by + have hsource : HasSum + (fun m : ℕ ↦ + equalCharacteristicCompletedLevelCoefficientHom F n + (PowerSeries.coeff m f) * x ^ m) + (equalCharacteristicCompletedLevelEvaluation F n x hx f) := by + rw [equalCharacteristicCompletedLevelEvaluation, + PowerSeries.coe_eval₂Hom] + exact PowerSeries.hasSum_eval₂ + (equalCharacteristicDirectThetaFixedCoefficientHom_continuous F n) + hx f + have hmapped := hsource.map + (equalCharacteristicCompletedIntegerFrobeniusLift F u n) + (equalCharacteristicCompletedIntegerFrobeniusLift_continuous F u n) + have hmapped' : HasSum + (fun m : ℕ ↦ + equalCharacteristicCompletedLevelCoefficientHom F n + (PowerSeries.coeff m + (PowerSeries.map + (equalCharacteristicPowerSeriesFrobenius F.residueField) f)) * + (equalCharacteristicCompletedIntegerFrobeniusLift F u n x) ^ m) + (equalCharacteristicCompletedIntegerFrobeniusLift F u n + (equalCharacteristicCompletedLevelEvaluation F n x hx f)) := by + convert hmapped using 1 + funext m + simp only [Function.comp_apply, map_mul, map_pow, + PowerSeries.coeff_map, + equalCharacteristicCompletedIntegerFrobeniusLift_coefficientHom] + apply HasSum.unique hmapped' + rw [equalCharacteristicCompletedLevelEvaluation, + PowerSeries.coe_eval₂Hom] + exact PowerSeries.hasSum_eval₂ + (equalCharacteristicDirectThetaFixedCoefficientHom_continuous F n) + (equalCharacteristicCompletedIntegerFrobeniusLift_hasEval F u n x hx) + (PowerSeries.map + (equalCharacteristicPowerSeriesFrobenius F.residueField) f) + +private theorem equalCharacteristicCompletedFrobeniusLift_residueHom + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) (c : F.residueField) : + equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹ + (equalCharacteristicCompletedLevelResidueHom F n c) = + equalCharacteristicCompletedLevelResidueHom F n c := by + rw [equalCharacteristicCompletedLevelResidueHom, RingHom.comp_apply, + equalCharacteristicCompletedLevelBaseHom, RingHom.comp_apply] + change equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹ + (algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) + (algebraMap F.residueField F.residueField⸨X⸩ c))) = _ + rw [equalCharacteristicCompletedFrobeniusLiftEquiv_algebraMap] + congr 1 + exact (equalCharacteristicCompletedUnramifiedFrobenius + F.residueField).commutes _ + +private theorem equalCharacteristicCompletedFrobeniusLift_uniformizer + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹ + (equalCharacteristicCompletedLevelUniformizer F n) = + equalCharacteristicCompletedLevelUniformizer F n := by + change equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹ + (algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + (equalCharacteristicCompletedBaseUniformizer F)) = _ + rw [equalCharacteristicCompletedFrobeniusLiftEquiv_algebraMap] + congr 1 + exact equalCharacteristicCompletedUnramifiedFrobenius_uniformizer + (k := F.residueField) + +private theorem equalCharacteristicCompletedFrobeniusLift_piEnd + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) + (x : equalCharacteristicCompletedLevelField F n) : + equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹ + (equalCharacteristicLubinTateAmbientPiEnd F + (equalCharacteristicCompletedLevelUniformizer F n) x) = + equalCharacteristicLubinTateAmbientPiEnd F + (equalCharacteristicCompletedLevelUniformizer F n) + (equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹ x) := by + simp only [equalCharacteristicLubinTateAmbientPiEnd_apply, + map_add, map_pow, map_mul, + equalCharacteristicCompletedFrobeniusLift_uniformizer] + +private theorem equalCharacteristicCompletedFrobeniusLift_piIterate + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n i : ℕ) + (x : equalCharacteristicCompletedLevelField F n) : + equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹ + (equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicCompletedLevelUniformizer F n) i x) = + equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicCompletedLevelUniformizer F n) i + (equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹ x) := by + induction i generalizing x with + | zero => + rw [equalCharacteristicLubinTateAmbientPiIterate_zero, + equalCharacteristicLubinTateAmbientPiIterate_zero] + | succ i ih => + rw [equalCharacteristicLubinTateAmbientPiIterate_succ, + equalCharacteristicLubinTateAmbientPiIterate_succ, ih, + equalCharacteristicCompletedFrobeniusLift_piEnd] + +private theorem equalCharacteristicCompletedFrobeniusLift_ambientBracket + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n m : ℕ) + (a : F.residueField⟦X⟧) + (x : equalCharacteristicCompletedLevelField F n) : + equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹ + (equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicCompletedLevelResidueHom F n) + (equalCharacteristicCompletedLevelUniformizer F n) m a x) = + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicCompletedLevelResidueHom F n) + (equalCharacteristicCompletedLevelUniformizer F n) m a + (equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹ x) := by + rw [equalCharacteristicLubinTateAmbientBracket_apply, map_sum, + equalCharacteristicLubinTateAmbientBracket_apply] + apply Finset.sum_congr rfl + intro i hi + rw [map_mul, + equalCharacteristicCompletedFrobeniusLift_residueHom, + equalCharacteristicCompletedFrobeniusLift_piIterate] + +/-- The finite bracket `[u]` sends the prescribed Frobenius image +`[u⁻¹](lambda)` back to `lambda`. -/ +private theorem + equalCharacteristicCompletedFrobeniusLift_directBracketAtPrimitiveRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹ + (equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicCompletedLevelResidueHom F n) + (equalCharacteristicCompletedLevelUniformizer F n) (n + 1) + (u : F.residueField⟦X⟧) + (equalCharacteristicCompletedPrimitiveRoot F n)) = + equalCharacteristicCompletedPrimitiveRoot F n := by + rw [equalCharacteristicCompletedFrobeniusLift_ambientBracket] + rw [show equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹ + (equalCharacteristicCompletedPrimitiveRoot F n) = + equalCharacteristicCompletedUnitRoot F n u⁻¹ by + exact equalCharacteristicCompletedFrobeniusLiftEquiv_primitiveRoot F n u⁻¹] + rw [equalCharacteristicCompletedUnitRoot] + rw [← equalCharacteristicLubinTateAmbientBracket_mul_apply_of_torsion + F (equalCharacteristicCompletedLevelResidueHom F n) + (equalCharacteristicCompletedLevelUniformizer F n) (n + 1) + (u : F.residueField⟦X⟧) ((u⁻¹ : F.residueField⟦X⟧ˣ) : + F.residueField⟦X⟧) + (equalCharacteristicCompletedPrimitiveRoot F n) + (equalCharacteristicCompletedPrimitiveRoot_torsion F n)] + have hu : (u : F.residueField⟦X⟧) * + ((u⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) = 1 := by + simp + rw [hu] + exact equalCharacteristicLubinTateAmbientBracket_one_apply_of_torsion + F (equalCharacteristicCompletedLevelResidueHom F n) + (equalCharacteristicCompletedLevelUniformizer F n) (n + 1) + (equalCharacteristicCompletedPrimitiveRoot F n) + (equalCharacteristicCompletedPrimitiveRoot_torsion F n) + +private theorem equalCharacteristicDirectThetaFixedEvaluation_hasEval_of_hasSubst + (F : LocalField.{u, v} K) (n : ℕ) + (x : Valued.integer (equalCharacteristicCompletedLevelField F n)) + (hx : PowerSeries.HasEval x) + (a : ((AlgebraicClosure F.residueField)⟦X⟧)⟦X⟧) + (ha : PowerSeries.HasSubst a) : + PowerSeries.HasEval + (equalCharacteristicCompletedLevelEvaluation F n x hx a) := by + exact ha.hasEval.map + (φ := equalCharacteristicCompletedLevelEvaluation F n x hx) + (by + rw [equalCharacteristicCompletedLevelEvaluation, + PowerSeries.coe_eval₂Hom] + exact PowerSeries.continuous_eval₂ + (equalCharacteristicDirectThetaFixedCoefficientHom_continuous F n) hx) + +private theorem equalCharacteristicDirectThetaFixedEvaluation_subst + (F : LocalField.{u, v} K) (n : ℕ) + (x : Valued.integer (equalCharacteristicCompletedLevelField F n)) + (hx : PowerSeries.HasEval x) + (a f : ((AlgebraicClosure F.residueField)⟦X⟧)⟦X⟧) + (ha : PowerSeries.HasSubst a) + (haEval : PowerSeries.HasEval + (equalCharacteristicCompletedLevelEvaluation F n x hx a)) : + equalCharacteristicCompletedLevelEvaluation F n x hx + (PowerSeries.subst a f) = + equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicCompletedLevelEvaluation F n x hx a) haEval f := by + let R := (AlgebraicClosure F.residueField)⟦X⟧ + let S := Valued.integer (equalCharacteristicCompletedLevelField F n) + simp only [equalCharacteristicCompletedLevelEvaluation, + PowerSeries.coe_eval₂Hom] + change PowerSeries.eval₂ (algebraMap R S) x (PowerSeries.subst a f) = + PowerSeries.eval₂ (algebraMap R S) + (PowerSeries.eval₂ (algebraMap R S) x a) f + simpa only [PowerSeries.eval₂, PowerSeries.subst, Function.const_apply] + using + (MvPowerSeries.eval₂_subst + (R := R) (S := R) (T := S) + (a := fun _ : Unit ↦ a) ha.const + (PowerSeries.hasEval hx) f) + +private theorem equalCharacteristicDirectThetaFixedEvaluation_eq_of_point_eq + (F : LocalField.{u, v} K) (n : ℕ) + (x y : Valued.integer (equalCharacteristicCompletedLevelField F n)) + (hx : PowerSeries.HasEval x) (hy : PowerSeries.HasEval y) + (hxy : x = y) : + equalCharacteristicCompletedLevelEvaluation F n x hx = + equalCharacteristicCompletedLevelEvaluation F n y hy := by + subst y + rfl + +private theorem + equalCharacteristicDirectBracketEvaluationAtPrimitiveRoot_eq_sourceIterate + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧) : + equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicCompletedPrimitiveRootInteger F n) + (equalCharacteristicCompletedPrimitiveRootInteger_hasEval F n) + (equalCharacteristicCompletedDirectBracket a) = + equalCharacteristicCompletedDirectBracketAtSourceIterate F n 0 a := by + have hpoint : equalCharacteristicDirectThetaSourceIterateInteger F n 0 = + equalCharacteristicCompletedPrimitiveRootInteger F n := by + apply Subtype.ext + change + equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicCompletedLevelUniformizer F n) 0 + (equalCharacteristicCompletedPrimitiveRoot F n) = + equalCharacteristicCompletedPrimitiveRoot F n + exact equalCharacteristicLubinTateAmbientPiIterate_zero F + (equalCharacteristicCompletedLevelUniformizer F n) + (equalCharacteristicCompletedPrimitiveRoot F n) + rw [equalCharacteristicCompletedDirectBracketAtSourceIterate] + simp only [equalCharacteristicCompletedLevelEvaluation, + PowerSeries.coe_eval₂Hom] + rw [hpoint] + +/-- Analytically evaluating `[u]` at the prescribed image +`[u⁻¹](lambda)` returns the original completed primitive point. -/ +private theorem + equalCharacteristicDirectBracketAtCompletedFrobeniusPrimitiveRoot_eq + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicCompletedIntegerFrobeniusLift F u n + (equalCharacteristicCompletedPrimitiveRootInteger F n)) + (equalCharacteristicCompletedIntegerFrobeniusLift_hasEval F u n + (equalCharacteristicCompletedPrimitiveRootInteger F n) + (equalCharacteristicCompletedPrimitiveRootInteger_hasEval F n)) + (equalCharacteristicCompletedDirectBracket + (u : F.residueField⟦X⟧)) = + equalCharacteristicCompletedPrimitiveRootInteger F n := by + have hsemi := equalCharacteristicCompletedIntegerFrobeniusLift_evaluation + F u n (equalCharacteristicCompletedPrimitiveRootInteger F n) + (equalCharacteristicCompletedPrimitiveRootInteger_hasEval F n) + (equalCharacteristicCompletedDirectBracket (u : F.residueField⟦X⟧)) + have hfixed : PowerSeries.map + (equalCharacteristicPowerSeriesFrobenius F.residueField) + (equalCharacteristicCompletedDirectBracket + (u : F.residueField⟦X⟧)) = + equalCharacteristicCompletedDirectBracket + (u : F.residueField⟦X⟧) := + equalCharacteristicCompletedDirectBracket_frobenius + (u : F.residueField⟦X⟧) + rw [hfixed] at hsemi + rw [← hsemi] + apply Subtype.ext + rw [equalCharacteristicCompletedIntegerFrobeniusLift_coe, + equalCharacteristicDirectBracketEvaluationAtPrimitiveRoot_eq_sourceIterate, + equalCharacteristicCompletedDirectBracketAtPrimitiveRoot_eq_ambient] + exact + equalCharacteristicCompletedFrobeniusLift_directBracketAtPrimitiveRoot + F u n + +private theorem + equalCharacteristicCompletedIntegerFrobeniusLift_directThetaFixed + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicCompletedIntegerFrobeniusLift F u n + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F u n) = + equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F u n := by + let x := equalCharacteristicCompletedPrimitiveRootInteger F n + let hx := equalCharacteristicCompletedPrimitiveRootInteger_hasEval F n + let δx := equalCharacteristicCompletedIntegerFrobeniusLift F u n x + let hδx := equalCharacteristicCompletedIntegerFrobeniusLift_hasEval + F u n x hx + let H := equalCharacteristicCompletedDirectBracket + (u : F.residueField⟦X⟧) + let Θ := equalCharacteristicDirectThetaSeries u + have hsemi := equalCharacteristicCompletedIntegerFrobeniusLift_evaluation + F u n x hx Θ + have hfirst : PowerSeries.map + (equalCharacteristicPowerSeriesFrobenius F.residueField) Θ = + PowerSeries.subst H Θ := by + simpa only [H, Θ, equalCharacteristicDirectThetaSeriesFrobenius] using + (equalCharacteristicDirectThetaSeriesFrobenius_eq_subst_directBracket u) + have hH : PowerSeries.HasSubst H := + equalCharacteristicCompletedDirectBracket_hasSubst + (u : F.residueField⟦X⟧) + have hHEval : PowerSeries.HasEval + (equalCharacteristicCompletedLevelEvaluation F n δx hδx H) := + equalCharacteristicDirectThetaFixedEvaluation_hasEval_of_hasSubst + F n δx hδx H hH + have hsubst := equalCharacteristicDirectThetaFixedEvaluation_subst + F n δx hδx H Θ hH hHEval + have hpoint : + equalCharacteristicCompletedLevelEvaluation F n δx hδx H = x := by + simpa only [x, hx, δx, hδx, H] using + (equalCharacteristicDirectBracketAtCompletedFrobeniusPrimitiveRoot_eq + F u n) + have hevaluation : + equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicCompletedLevelEvaluation F n δx hδx H) + hHEval Θ = + equalCharacteristicCompletedLevelEvaluation F n x hx Θ := + DFunLike.congr_fun + (equalCharacteristicDirectThetaFixedEvaluation_eq_of_point_eq F n + (equalCharacteristicCompletedLevelEvaluation F n δx hδx H) + x hHEval hx hpoint) Θ + change equalCharacteristicCompletedIntegerFrobeniusLift F u n + (equalCharacteristicCompletedLevelEvaluation F n x hx Θ) = + equalCharacteristicCompletedLevelEvaluation F n x hx Θ + calc + _ = equalCharacteristicCompletedLevelEvaluation F n δx hδx + (PowerSeries.map + (equalCharacteristicPowerSeriesFrobenius F.residueField) Θ) := hsemi + _ = equalCharacteristicCompletedLevelEvaluation F n δx hδx + (PowerSeries.subst H Θ) := by rw [hfirst] + _ = equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicCompletedLevelEvaluation F n δx hδx H) + hHEval Θ := hsubst + _ = equalCharacteristicCompletedLevelEvaluation F n x hx Θ := hevaluation + +/-- The completed theta-intertwining theorem in the direct orientation: the completed Frobenius lift +whose action on `lambda` is `[u⁻¹](lambda)` fixes the genuine analytic +theta value `theta(lambda)`. -/ +theorem equalCharacteristicCompletedFrobeniusLift_directThetaFixed + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹ + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F u n : + equalCharacteristicCompletedLevelField F n) = + (equalCharacteristicDirectThetaAtCompletedPrimitiveRoot F u n : + equalCharacteristicCompletedLevelField F n) := by + exact congrArg Subtype.val + (equalCharacteristicCompletedIntegerFrobeniusLift_directThetaFixed F u n) + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaIteration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaIteration.lean new file mode 100644 index 0000000000..dff3a461bb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaIteration.lean @@ -0,0 +1,174 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity +/-! +# The completed theta-intertwining theorem: iterating the direct second theta identity + +For the direct orientation `T → uT`, this file applies coefficient +Frobenius repeatedly to the formal identity +`theta^φ ∘ e_T = e_(uT) ∘ theta`. +-/ + +@[expose] public section + +noncomputable +section + +open scoped PowerSeries + + +namespace LubinTate +namespace EqualCharacteristic + +/-- The `i`-fold arithmetic-Frobenius twist of the direct theta series. -/ +noncomputable def equalCharacteristicDirectThetaSeriesFrobeniusIterate + {k : Type*} [Field k] [Finite k] (u : k⟦X⟧ˣ) : + ℕ → ((AlgebraicClosure k)⟦X⟧)⟦X⟧ + | 0 => equalCharacteristicDirectThetaSeries u + | i + 1 => PowerSeries.map (equalCharacteristicPowerSeriesFrobenius k) + (equalCharacteristicDirectThetaSeriesFrobeniusIterate u i) + +/-- States the theorem `equalCharacteristicDirectThetaSeriesFrobeniusIterate_zero`. -/ +@[simp] +theorem equalCharacteristicDirectThetaSeriesFrobeniusIterate_zero + {k : Type*} [Field k] [Finite k] (u : k⟦X⟧ˣ) : + equalCharacteristicDirectThetaSeriesFrobeniusIterate u 0 = + equalCharacteristicDirectThetaSeries u := + rfl + +/-- States the theorem `equalCharacteristicDirectThetaSeriesFrobeniusIterate_succ`. -/ +@[simp] +theorem equalCharacteristicDirectThetaSeriesFrobeniusIterate_succ + {k : Type*} [Field k] [Finite k] (u : k⟦X⟧ˣ) (i : ℕ) : + equalCharacteristicDirectThetaSeriesFrobeniusIterate u (i + 1) = + PowerSeries.map (equalCharacteristicPowerSeriesFrobenius k) + (equalCharacteristicDirectThetaSeriesFrobeniusIterate u i) := + rfl + +/-- States the theorem `equalCharacteristicDirectThetaSeriesFrobeniusIterate_constantCoeff`. -/ +@[simp] +theorem equalCharacteristicDirectThetaSeriesFrobeniusIterate_constantCoeff + {k : Type*} [Field k] [Finite k] (u : k⟦X⟧ˣ) (i : ℕ) : + PowerSeries.constantCoeff + (equalCharacteristicDirectThetaSeriesFrobeniusIterate u i) = 0 := by + induction i with + | zero => exact equalCharacteristicDirectThetaSeries_constantCoeff u + | succ i ih => + rw [← PowerSeries.coeff_zero_eq_constantCoeff_apply] at ih ⊢ + rw [equalCharacteristicDirectThetaSeriesFrobeniusIterate_succ, + PowerSeries.coeff_map, ih, map_zero] + +/-- States the theorem `equalCharacteristicDirectThetaSeriesFrobeniusIterate_hasSubst`. -/ +theorem equalCharacteristicDirectThetaSeriesFrobeniusIterate_hasSubst + {k : Type*} [Field k] [Finite k] (u : k⟦X⟧ˣ) (i : ℕ) : + PowerSeries.HasSubst + (equalCharacteristicDirectThetaSeriesFrobeniusIterate u i) := + PowerSeries.HasSubst.of_constantCoeff_zero' + (equalCharacteristicDirectThetaSeriesFrobeniusIterate_constantCoeff u i) + +private theorem equalCharacteristicDirectCompletedTargetUniformizer_frobenius + {k : Type*} [Field k] [Finite k] (u : k⟦X⟧ˣ) : + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicDirectCompletedTargetUniformizer u) = + equalCharacteristicDirectCompletedTargetUniformizer u := by + simp [equalCharacteristicDirectCompletedTargetUniformizer, + equalCharacteristicPowerSeriesFrobenius_map_algebraMap] + +private theorem equalCharacteristicDirectCompletedLubinTateSeries_map_frobenius + {k : Type*} [Field k] [Finite k] + (pi : (AlgebraicClosure k)⟦X⟧) : + PowerSeries.map (equalCharacteristicPowerSeriesFrobenius k) + (equalCharacteristicCompletedLubinTateSeries (k := k) pi) = + equalCharacteristicCompletedLubinTateSeries (k := k) + (equalCharacteristicPowerSeriesFrobenius k pi) := by + simp [equalCharacteristicCompletedLubinTateSeries] + +private theorem equalCharacteristicDirectSourceLubinTateSeries_frobenius + {k : Type*} [Field k] [Finite k] : + PowerSeries.map (equalCharacteristicPowerSeriesFrobenius k) + (equalCharacteristicCompletedLubinTateSeries (k := k) + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧)) = + equalCharacteristicCompletedLubinTateSeries (k := k) PowerSeries.X := by + rw [equalCharacteristicDirectCompletedLubinTateSeries_map_frobenius, + equalCharacteristicPowerSeriesFrobenius_X] + +private theorem equalCharacteristicDirectTargetLubinTateSeries_frobenius + {k : Type*} [Field k] [Finite k] (u : k⟦X⟧ˣ) : + PowerSeries.map (equalCharacteristicPowerSeriesFrobenius k) + (equalCharacteristicCompletedLubinTateSeries (k := k) + (equalCharacteristicDirectCompletedTargetUniformizer u)) = + equalCharacteristicCompletedLubinTateSeries (k := k) + (equalCharacteristicDirectCompletedTargetUniformizer u) := by + rw [equalCharacteristicDirectCompletedLubinTateSeries_map_frobenius, + equalCharacteristicDirectCompletedTargetUniformizer_frobenius] + +/-- Every direct Frobenius twist intertwines the next source and target +Lubin--Tate steps. -/ +theorem equalCharacteristicDirectThetaSeriesFrobeniusIterate_intertwines + {k : Type*} [Field k] [Finite k] (u : k⟦X⟧ˣ) (i : ℕ) : + PowerSeries.subst + (equalCharacteristicCompletedLubinTateSeries (k := k) + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧)) + (equalCharacteristicDirectThetaSeriesFrobeniusIterate u (i + 1)) = + PowerSeries.subst + (equalCharacteristicDirectThetaSeriesFrobeniusIterate u i) + (equalCharacteristicCompletedLubinTateSeries (k := k) + (equalCharacteristicDirectCompletedTargetUniformizer u)) := by + induction i with + | zero => + simpa [equalCharacteristicDirectThetaSeriesFrobeniusIterate_succ, + equalCharacteristicDirectThetaSeriesFrobenius] + using equalCharacteristicDirectThetaSeries_intertwines u + | succ i ih => + have h := congrArg + (PowerSeries.map (equalCharacteristicPowerSeriesFrobenius k)) ih + change + (PowerSeries.subst + (equalCharacteristicCompletedLubinTateSeries (k := k) + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧)) + (equalCharacteristicDirectThetaSeriesFrobeniusIterate + u (i + 1))).map + (equalCharacteristicPowerSeriesFrobenius k) = + (PowerSeries.subst + (equalCharacteristicDirectThetaSeriesFrobeniusIterate u i) + (equalCharacteristicCompletedLubinTateSeries (k := k) + (equalCharacteristicDirectCompletedTargetUniformizer u))).map + (equalCharacteristicPowerSeriesFrobenius k) at h + rw [PowerSeries.map_subst + (equalCharacteristicCompletedLubinTateSeries_hasSubst + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧)), + PowerSeries.map_subst + (equalCharacteristicDirectThetaSeriesFrobeniusIterate_hasSubst + u i)] at h + have hsource : + MvPowerSeries.map (equalCharacteristicPowerSeriesFrobenius k) + (equalCharacteristicCompletedLubinTateSeries (k := k) + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧)) = + equalCharacteristicCompletedLubinTateSeries (k := k) + PowerSeries.X := by + change PowerSeries.map (equalCharacteristicPowerSeriesFrobenius k) + (equalCharacteristicCompletedLubinTateSeries (k := k) + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧)) = _ + exact equalCharacteristicDirectSourceLubinTateSeries_frobenius + have htwist : + MvPowerSeries.map (equalCharacteristicPowerSeriesFrobenius k) + (equalCharacteristicDirectThetaSeriesFrobeniusIterate u i) = + equalCharacteristicDirectThetaSeriesFrobeniusIterate u (i + 1) := by + change PowerSeries.map (equalCharacteristicPowerSeriesFrobenius k) + (equalCharacteristicDirectThetaSeriesFrobeniusIterate u i) = _ + exact + (equalCharacteristicDirectThetaSeriesFrobeniusIterate_succ u i).symm + rw [hsource, htwist, + equalCharacteristicDirectTargetLubinTateSeries_frobenius] at h + simpa only [← equalCharacteristicDirectThetaSeriesFrobeniusIterate_succ] + using h + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaSeries.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaSeries.lean new file mode 100644 index 0000000000..7f0d27eb92 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaSeries.lean @@ -0,0 +1,319 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries +/-! +# The completed theta-intertwining theorem: the direct-orientation theta series + +This file constructs the theta series in the orientation used directly in +the completed theta-intertwining theorem: the source prime is `pi = T` and the target prime is +`bar_pi = uT`. Thus the second identity is + +`theta^φ ∘ e_T = e_(uT) ∘ theta`. + +This coefficient recursion is mathematically distinct from the +constructed specialization `u⁻¹T → T`. The first theta identity and +analytic evaluation at division points are developed in the corresponding +companion modules. +-/ + +@[expose] public section + +noncomputable +section + +open scoped PowerSeries + + +universe u + +namespace LubinTate +namespace EqualCharacteristic + +variable {k : Type u} [Field k] [Finite k] + +/-- The target prime `bar_pi = uT` in the completed maximal-unramified +coefficient ring. -/ +noncomputable def equalCharacteristicDirectCompletedTargetUniformizer + (u : k⟦X⟧ˣ) : (AlgebraicClosure k)⟦X⟧ := + PowerSeries.map (algebraMap k (AlgebraicClosure k)) (u : k⟦X⟧) * + PowerSeries.X + +/-- The direct-orientation contracting coefficient +`gamma_j = u⁻¹ T^(q^j-1)`. -/ +noncomputable def equalCharacteristicDirectThetaGamma + (u : k⟦X⟧ˣ) (j : ℕ) : (AlgebraicClosure k)⟦X⟧ := + PowerSeries.map (algebraMap k (AlgebraicClosure k)) + ((u⁻¹ : k⟦X⟧ˣ) : k⟦X⟧) * + PowerSeries.X ^ (Nat.card k ^ j - 1) + +/-- Positive-index direct theta gamma terms have zero constant coefficient. -/ +theorem equalCharacteristicDirectThetaGamma_constantCoeff + (u : k⟦X⟧ˣ) (j : ℕ) (hj : 0 < j) : + PowerSeries.coeff 0 (equalCharacteristicDirectThetaGamma u j) = 0 := by + have hq : 1 < Nat.card k := Finite.one_lt_card + have hpow : 0 < Nat.card k ^ j - 1 := + Nat.sub_pos_of_lt (Nat.one_lt_pow hj.ne' hq) + simp [equalCharacteristicDirectThetaGamma, hpow.ne'] + +/-- Clearing the direct gamma by the target prime `uT` gives +`T^(q^j)`. -/ +theorem equalCharacteristicDirectTargetUniformizer_mul_gamma + (u : k⟦X⟧ˣ) (j : ℕ) (hj : 0 < j) : + equalCharacteristicDirectCompletedTargetUniformizer u * + equalCharacteristicDirectThetaGamma u j = + PowerSeries.X ^ (Nat.card k ^ j) := by + have hq : 1 < Nat.card k := Finite.one_lt_card + have hpow : 1 ≤ Nat.card k ^ j := + (Nat.one_lt_pow hj.ne' hq).le + have huinv : + PowerSeries.map (algebraMap k (AlgebraicClosure k)) (u : k⟦X⟧) * + PowerSeries.map (algebraMap k (AlgebraicClosure k)) + ((u⁻¹ : k⟦X⟧ˣ) : k⟦X⟧) = 1 := by + rw [← map_mul] + simp + rw [equalCharacteristicDirectCompletedTargetUniformizer, + equalCharacteristicDirectThetaGamma] + calc + (PowerSeries.map (algebraMap k (AlgebraicClosure k)) (u : k⟦X⟧) * + PowerSeries.X) * + (PowerSeries.map (algebraMap k (AlgebraicClosure k)) + ((u⁻¹ : k⟦X⟧ˣ) : k⟦X⟧) * + PowerSeries.X ^ (Nat.card k ^ j - 1)) = + (PowerSeries.map (algebraMap k (AlgebraicClosure k)) (u : k⟦X⟧) * + PowerSeries.map (algebraMap k (AlgebraicClosure k)) + ((u⁻¹ : k⟦X⟧ˣ) : k⟦X⟧)) * + (PowerSeries.X ^ (Nat.card k ^ j - 1) * PowerSeries.X) := by + ring + _ = PowerSeries.X ^ (Nat.card k ^ j) := by + rw [huinv, one_mul, ← pow_succ, Nat.sub_add_cancel hpow] + +/-- The direct right-hand side +`beta(b) = u⁻¹ (phi(b)-b^q)/T` of the contracting recursion. -/ +noncomputable def equalCharacteristicDirectThetaBeta + (u : k⟦X⟧ˣ) (b : (AlgebraicClosure k)⟦X⟧) : + (AlgebraicClosure k)⟦X⟧ := + PowerSeries.map (algebraMap k (AlgebraicClosure k)) + ((u⁻¹ : k⟦X⟧ˣ) : k⟦X⟧) * + equalCharacteristicPowerSeriesTail + (equalCharacteristicPowerSeriesFrobenius k b - b ^ Nat.card k) + +/-- Clearing the direct beta by `uT` recovers its numerator +`phi(b)-b^q`. -/ +theorem equalCharacteristicDirectTargetUniformizer_mul_beta + (u : k⟦X⟧ˣ) (b : (AlgebraicClosure k)⟦X⟧) : + equalCharacteristicDirectCompletedTargetUniformizer u * + equalCharacteristicDirectThetaBeta u b = + equalCharacteristicPowerSeriesFrobenius k b - b ^ Nat.card k := by + have huinv : + PowerSeries.map (algebraMap k (AlgebraicClosure k)) (u : k⟦X⟧) * + PowerSeries.map (algebraMap k (AlgebraicClosure k)) + ((u⁻¹ : k⟦X⟧ˣ) : k⟦X⟧) = 1 := by + rw [← map_mul] + simp + rw [equalCharacteristicDirectCompletedTargetUniformizer, + equalCharacteristicDirectThetaBeta] + calc + (PowerSeries.map (algebraMap k (AlgebraicClosure k)) (u : k⟦X⟧) * + PowerSeries.X) * + (PowerSeries.map (algebraMap k (AlgebraicClosure k)) + ((u⁻¹ : k⟦X⟧ˣ) : k⟦X⟧) * + equalCharacteristicPowerSeriesTail + (equalCharacteristicPowerSeriesFrobenius k b - + b ^ Nat.card k)) = + (PowerSeries.map (algebraMap k (AlgebraicClosure k)) (u : k⟦X⟧) * + PowerSeries.map (algebraMap k (AlgebraicClosure k)) + ((u⁻¹ : k⟦X⟧ˣ) : k⟦X⟧)) * + (PowerSeries.X * equalCharacteristicPowerSeriesTail + (equalCharacteristicPowerSeriesFrobenius k b - + b ^ Nat.card k)) := by + ring + _ = equalCharacteristicPowerSeriesFrobenius k b - b ^ Nat.card k := by + rw [huinv, one_mul] + exact equalCharacteristicThetaBeta_mul_X b + +/-- Coefficients of the direct-orientation additive theta series. Its +linear coefficient solves `phi(b₀)=u b₀`; the later coefficients are the +actual recursively constructed solutions of the contracting equations. -/ +noncomputable def equalCharacteristicDirectThetaCoefficient + (u : k⟦X⟧ˣ) : ℕ → (AlgebraicClosure k)⟦X⟧ + | 0 => equalCharacteristicSemilinearUnit (u : k⟦X⟧) + (by + intro hzero + have hunit := PowerSeries.isUnit_constantCoeff (u : k⟦X⟧) u.isUnit + apply hunit.ne_zero + simpa [PowerSeries.coeff_zero_eq_constantCoeff_apply] using hzero) + | j + 1 => + contractingFrobeniusEquationSolution + (equalCharacteristicCoefficientFrobenius k).toRingHom + (equalCharacteristicDirectThetaGamma u (j + 1)) + (equalCharacteristicDirectThetaBeta u + (equalCharacteristicDirectThetaCoefficient u j)) + +/-- The zeroth direct theta coefficient is the semilinear source unit. -/ +@[simp] +theorem equalCharacteristicDirectThetaCoefficient_zero + (u : k⟦X⟧ˣ) : + equalCharacteristicDirectThetaCoefficient u 0 = + equalCharacteristicSemilinearUnit (u : k⟦X⟧) + (by + intro hzero + have hunit := PowerSeries.isUnit_constantCoeff (u : k⟦X⟧) u.isUnit + apply hunit.ne_zero + simpa [PowerSeries.coeff_zero_eq_constantCoeff_apply] using hzero) := + rfl + +/-- The direct contracting recursion +`b_(j+1) - gamma_(j+1) phi(b_(j+1)) = beta(b_j)`. -/ +theorem equalCharacteristicDirectThetaCoefficient_succ_equation + (u : k⟦X⟧ˣ) (j : ℕ) : + equalCharacteristicDirectThetaCoefficient u (j + 1) - + equalCharacteristicDirectThetaGamma u (j + 1) * + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicDirectThetaCoefficient u (j + 1)) = + equalCharacteristicDirectThetaBeta u + (equalCharacteristicDirectThetaCoefficient u j) := by + rw [equalCharacteristicDirectThetaCoefficient] + have hgamma := equalCharacteristicDirectThetaGamma_constantCoeff u + (j + 1) (Nat.zero_lt_succ j) + apply (sub_eq_iff_eq_add).2 + simpa [equalCharacteristicPowerSeriesFrobenius] using + (contractingFrobeniusEquationSolution_spec + (equalCharacteristicCoefficientFrobenius k).toRingHom + (equalCharacteristicDirectThetaGamma u (j + 1)) + (equalCharacteristicDirectThetaBeta u + (equalCharacteristicDirectThetaCoefficient u j)) hgamma) + +/-- The coefficient comparison obtained after clearing `uT`. -/ +theorem equalCharacteristicDirectThetaCoefficient_succ_comparison + (u : k⟦X⟧ˣ) (j : ℕ) : + equalCharacteristicDirectCompletedTargetUniformizer u * + equalCharacteristicDirectThetaCoefficient u (j + 1) - + PowerSeries.X ^ (Nat.card k ^ (j + 1)) * + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicDirectThetaCoefficient u (j + 1)) = + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicDirectThetaCoefficient u j) - + equalCharacteristicDirectThetaCoefficient u j ^ Nat.card k := by + have hrec := congrArg (fun z : (AlgebraicClosure k)⟦X⟧ ↦ + equalCharacteristicDirectCompletedTargetUniformizer u * z) + (equalCharacteristicDirectThetaCoefficient_succ_equation u j) + change equalCharacteristicDirectCompletedTargetUniformizer u * + (equalCharacteristicDirectThetaCoefficient u (j + 1) - + equalCharacteristicDirectThetaGamma u (j + 1) * + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicDirectThetaCoefficient u (j + 1))) = + equalCharacteristicDirectCompletedTargetUniformizer u * + equalCharacteristicDirectThetaBeta u + (equalCharacteristicDirectThetaCoefficient u j) at hrec + rw [mul_sub, ← mul_assoc, + equalCharacteristicDirectTargetUniformizer_mul_gamma u + (j + 1) (Nat.zero_lt_succ j), + equalCharacteristicDirectTargetUniformizer_mul_beta] at hrec + exact hrec + +/-- The genuine sparse outer theta series for the direct orientation +`T → uT`. -/ +noncomputable def equalCharacteristicDirectThetaSeries + (u : k⟦X⟧ˣ) : ((AlgebraicClosure k)⟦X⟧)⟦X⟧ := + equalCharacteristicQAdditiveSeries k + (equalCharacteristicDirectThetaCoefficient u) + +/-- The direct theta coefficient at `q ^ j` is its `j`th recursive coefficient. -/ +@[simp] +theorem equalCharacteristicDirectThetaSeries_coeff_pow + (u : k⟦X⟧ˣ) (j : ℕ) : + PowerSeries.coeff (Nat.card k ^ j) + (equalCharacteristicDirectThetaSeries u) = + equalCharacteristicDirectThetaCoefficient u j := + equalCharacteristicQAdditiveSeries_coeff_pow k + (equalCharacteristicDirectThetaCoefficient u) j + +/-- The direct theta series has zero constant coefficient. -/ +@[simp] +theorem equalCharacteristicDirectThetaSeries_constantCoeff + (u : k⟦X⟧ˣ) : + PowerSeries.constantCoeff (equalCharacteristicDirectThetaSeries u) = 0 := + equalCharacteristicQAdditiveSeries_constantCoeff k _ + +/-- The direct theta series is valid as a substitution series. -/ +theorem equalCharacteristicDirectThetaSeries_hasSubst + (u : k⟦X⟧ˣ) : + PowerSeries.HasSubst (equalCharacteristicDirectThetaSeries u) := + PowerSeries.HasSubst.of_constantCoeff_zero' + (equalCharacteristicDirectThetaSeries_constantCoeff u) + +/-- Arithmetic Frobenius on every coefficient of the direct theta series. -/ +noncomputable def equalCharacteristicDirectThetaSeriesFrobenius + (u : k⟦X⟧ˣ) : ((AlgebraicClosure k)⟦X⟧)⟦X⟧ := + PowerSeries.map (equalCharacteristicPowerSeriesFrobenius k) + (equalCharacteristicDirectThetaSeries u) + +/-- Frobenius of direct theta is the `q`-additive series of Frobenius coefficients. -/ +theorem equalCharacteristicDirectThetaSeriesFrobenius_eq_qAdditiveSeries + (u : k⟦X⟧ˣ) : + equalCharacteristicDirectThetaSeriesFrobenius u = + equalCharacteristicQAdditiveSeries k + (fun j ↦ equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicDirectThetaCoefficient u j)) := by + exact equalCharacteristicQAdditiveSeries_map k + (equalCharacteristicPowerSeriesFrobenius k) + (equalCharacteristicDirectThetaCoefficient u) + +/-- Direct the completed theta-intertwining theorem second identity: +`theta^φ ∘ e_T = e_(uT) ∘ theta`. -/ +theorem equalCharacteristicDirectThetaSeries_intertwines + (u : k⟦X⟧ˣ) : + PowerSeries.subst + (equalCharacteristicCompletedLubinTateSeries (k := k) + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧)) + (equalCharacteristicDirectThetaSeriesFrobenius u) = + PowerSeries.subst (equalCharacteristicDirectThetaSeries u) + (equalCharacteristicCompletedLubinTateSeries (k := k) + (equalCharacteristicDirectCompletedTargetUniformizer u)) := by + rw [equalCharacteristicDirectThetaSeriesFrobenius_eq_qAdditiveSeries, + equalCharacteristicQAdditiveSeries_subst_completedLubinTateSeries, + equalCharacteristicDirectThetaSeries, + equalCharacteristicCompletedLubinTateSeries_subst_qAdditiveSeries] + congr 1 + funext j + cases j with + | zero => + rw [equalCharacteristicLubinTateSubstitutionCoefficient, + equalCharacteristicLubinTatePostcompositionCoefficient, + equalCharacteristicDirectThetaCoefficient_zero, + equalCharacteristicPowerSeriesFrobenius_semilinearUnit, + equalCharacteristicDirectCompletedTargetUniformizer] + ring + | succ j => + rw [equalCharacteristicLubinTateSubstitutionCoefficient, + equalCharacteristicLubinTatePostcompositionCoefficient] + have h := equalCharacteristicDirectThetaCoefficient_succ_comparison u j + linear_combination -h + +/-- The direct theta series has the semilinear leading unit as its linear +coefficient. -/ +theorem equalCharacteristicDirectThetaSeries_coeff_one + (u : k⟦X⟧ˣ) : + PowerSeries.coeff 1 (equalCharacteristicDirectThetaSeries u) = + equalCharacteristicSemilinearUnit (u : k⟦X⟧) + (by + intro hzero + have hunit := PowerSeries.isUnit_constantCoeff (u : k⟦X⟧) u.isUnit + apply hunit.ne_zero + simpa [PowerSeries.coeff_zero_eq_constantCoeff_apply] using hzero) := by + calc + PowerSeries.coeff 1 (equalCharacteristicDirectThetaSeries u) = + equalCharacteristicDirectThetaCoefficient u 0 := by + simpa only [pow_zero] using + equalCharacteristicDirectThetaSeries_coeff_pow u 0 + _ = _ := equalCharacteristicDirectThetaCoefficient_zero u + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean new file mode 100644 index 0000000000..eb19122c98 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean @@ -0,0 +1,444 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaEvaluation +/-! +# The completed theta-intertwining theorem: theta at a completed Lubin--Tate level + +This file evaluates the theta series analytically at the chosen primitive +division point in the completed level field. +-/ + +@[expose] public section + +noncomputable +section + +open Filter +open scoped LaurentSeries NNReal PowerSeries PowerSeries.WithPiTopology + Topology Valued WithZero + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +noncomputable local instance equalCharacteristicThetaAtLevelBaseValuationIsNontrivial + (F : LocalField.{u, v} K) : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField F.residueField) ℤᵐ⁰).IsNontrivial := + equalCharacteristicCompletedBaseValuationIsNontrivial F.residueField + +/-- The discrete valuation on the completed unramified coefficient field has rank one. -/ +noncomputable local instance equalCharacteristicThetaAtLevelBaseValuationRankOne + (F : LocalField.{u, v} K) : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField F.residueField) ℤᵐ⁰).RankOne := + equalCharacteristicCompletedBaseValuationRankOne F.residueField + +/-- The canonical nontrivial norm on the completed unramified coefficient field. -/ +noncomputable local instance equalCharacteristicThetaAtLevelBaseNormedField + (F : LocalField.{u, v} K) : + NontriviallyNormedField + (equalCharacteristicCompletedUnramifiedField F.residueField) := + equalCharacteristicCompletedBaseNormedField F.residueField + +/-- The canonical nontrivial norm on the completed Lubin–Tate field at level `n`. -/ +noncomputable local instance equalCharacteristicThetaAtLevelNormedField + (F : LocalField.{u, v} K) (n : ℕ) : + NontriviallyNormedField (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelNormedField F n + +noncomputable local instance equalCharacteristicThetaAtLevelIsUltrametric + (F : LocalField.{u, v} K) (n : ℕ) : + IsUltrametricDist (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelIsUltrametric F n + +noncomputable local instance equalCharacteristicThetaAtLevelCompleteSpace + (F : LocalField.{u, v} K) (n : ℕ) : + CompleteSpace (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelCompleteSpace F n + +/-- The nonnegative-real-valued valuation on the completed Lubin–Tate field at level `n`. -/ +noncomputable local instance equalCharacteristicThetaAtLevelValued + (F : LocalField.{u, v} K) (n : ℕ) : + Valued (equalCharacteristicCompletedLevelField F n) ℝ≥0 := + equalCharacteristicCompletedLevelValued F n + +noncomputable local instance equalCharacteristicThetaAtLevelLinearTopology + (F : LocalField.{u, v} K) (n : ℕ) : + IsLinearTopology + (Valued.integer (equalCharacteristicCompletedLevelField F n)) + (Valued.integer (equalCharacteristicCompletedLevelField F n)) := + valuedIntegerLinearTopology + +noncomputable local instance equalCharacteristicThetaAtLevelCompleteInteger + (F : LocalField.{u, v} K) (n : ℕ) : + CompleteSpace + (Valued.integer (equalCharacteristicCompletedLevelField F n)) := + valuedIntegerCompleteSpace + +noncomputable local instance equalCharacteristicThetaAtLevelUniformAddGroup + (F : LocalField.{u, v} K) (n : ℕ) : + IsUniformAddGroup + (Valued.integer (equalCharacteristicCompletedLevelField F n)) := + valuedIntegerIsUniformAddGroup + +/-- The integral inclusion from the completed maximal-unramified base into +the completed level field. Integrality is preserved because the spectral +norm extends the base norm. -/ +noncomputable def equalCharacteristicCompletedBaseIntegerToLevel + (F : LocalField.{u, v} K) (n : ℕ) : + Valued.integer + (equalCharacteristicCompletedUnramifiedField F.residueField) →+* + Valued.integer (equalCharacteristicCompletedLevelField F n) where + toFun x := ⟨algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) x, by + change ‖algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) (x : + equalCharacteristicCompletedUnramifiedField F.residueField)‖₊ ≤ 1 + exact_mod_cast (show ‖algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) (x : + equalCharacteristicCompletedUnramifiedField F.residueField)‖ ≤ 1 by + change spectralNorm + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) + (algebraMap + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) (x : + equalCharacteristicCompletedUnramifiedField + F.residueField)) ≤ 1 + rw [spectralNorm_extends, + Valued.toNormedField.norm_le_one_iff] + exact x.property)⟩ + map_one' := by ext; simp + map_mul' x y := by ext; simp + map_zero' := by ext; simp + map_add' x y := by ext; simp + +/-- Coefficients in `(AlgebraicClosure k)[[T]]`, analytically included in +the valuation ring of the completed level field. -/ +noncomputable def equalCharacteristicCompletedLevelCoefficientHom + (F : LocalField.{u, v} K) (n : ℕ) : + (AlgebraicClosure F.residueField)⟦X⟧ →+* + Valued.integer (equalCharacteristicCompletedLevelField F n) := + (equalCharacteristicCompletedBaseIntegerToLevel F n).comp + (powerSeriesEquivLaurentInteger + (AlgebraicClosure F.residueField)).toRingHom + +/-- The discrete uniform structure on the coefficient power-series ring used for evaluation. -/ +noncomputable local instance equalCharacteristicThetaCoefficientUniformSpace + (F : LocalField.{u, v} K) : + UniformSpace ((AlgebraicClosure F.residueField)⟦X⟧) := ⊥ + +private theorem equalCharacteristicCompletedLevelCoefficientHom_continuous + (F : LocalField.{u, v} K) (n : ℕ) : + Continuous (equalCharacteristicCompletedLevelCoefficientHom F n) := + continuous_of_discreteTopology + +private noncomputable local instance equalCharacteristicThetaAtLevelCoefficientAlgebra + (F : LocalField.{u, v} K) (n : ℕ) : + Algebra ((AlgebraicClosure F.residueField)⟦X⟧) + (Valued.integer (equalCharacteristicCompletedLevelField F n)) := + (equalCharacteristicCompletedLevelCoefficientHom F n).toAlgebra + +/-- Analytic evaluation of an outer power series at an integral, +topologically nilpotent point of the completed level field. -/ +noncomputable def equalCharacteristicCompletedLevelEvaluation + (F : LocalField.{u, v} K) (n : ℕ) + (a : Valued.integer (equalCharacteristicCompletedLevelField F n)) + (ha : PowerSeries.HasEval a) : + ((AlgebraicClosure F.residueField)⟦X⟧)⟦X⟧ →+* + Valued.integer (equalCharacteristicCompletedLevelField F n) := + PowerSeries.eval₂Hom (φ := equalCharacteristicCompletedLevelCoefficientHom F n) + (by exact equalCharacteristicCompletedLevelCoefficientHom_continuous F n) ha + +/-- States the theorem `equalCharacteristicCompletedLevelEvaluation_X`. -/ +@[simp] +theorem equalCharacteristicCompletedLevelEvaluation_X + (F : LocalField.{u, v} K) (n : ℕ) + (a : Valued.integer (equalCharacteristicCompletedLevelField F n)) + (ha : PowerSeries.HasEval a) : + equalCharacteristicCompletedLevelEvaluation F n a ha PowerSeries.X = a := by + rw [equalCharacteristicCompletedLevelEvaluation, + PowerSeries.coe_eval₂Hom, PowerSeries.eval₂_X] + +/-- States the theorem `equalCharacteristicCompletedLevelEvaluation_C`. -/ +@[simp] +theorem equalCharacteristicCompletedLevelEvaluation_C + (F : LocalField.{u, v} K) (n : ℕ) + (a : Valued.integer (equalCharacteristicCompletedLevelField F n)) + (ha : PowerSeries.HasEval a) + (f : (AlgebraicClosure F.residueField)⟦X⟧) : + equalCharacteristicCompletedLevelEvaluation F n a ha (PowerSeries.C f) = + equalCharacteristicCompletedLevelCoefficientHom F n f := by + rw [equalCharacteristicCompletedLevelEvaluation, + PowerSeries.coe_eval₂Hom, PowerSeries.eval₂_C] + +/-- The image of `T` in the valuation ring of the completed level field. -/ +noncomputable def equalCharacteristicCompletedLevelUniformizerInteger + (F : LocalField.{u, v} K) (n : ℕ) : + Valued.integer (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelCoefficientHom F n PowerSeries.X + +/-- The genuine analytic value `theta(lambda_(n+1))`. -/ +noncomputable def equalCharacteristicThetaAtCompletedPrimitiveRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Valued.integer (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicCompletedPrimitiveRootInteger F n) + (equalCharacteristicCompletedPrimitiveRootInteger_hasEval F n) + (equalCharacteristicThetaSeries u) + +/-- The coefficient expansion defining `theta(lambda_(n+1))` converges in +the completed level field. -/ +theorem equalCharacteristicThetaAtCompletedPrimitiveRoot_hasSum + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + HasSum + (fun m : ℕ ↦ + equalCharacteristicCompletedLevelCoefficientHom F n + (PowerSeries.coeff m (equalCharacteristicThetaSeries u)) * + equalCharacteristicCompletedPrimitiveRootInteger F n ^ m) + (equalCharacteristicThetaAtCompletedPrimitiveRoot F u n) := by + rw [equalCharacteristicThetaAtCompletedPrimitiveRoot, + equalCharacteristicCompletedLevelEvaluation, + PowerSeries.coe_eval₂Hom] + exact PowerSeries.hasSum_eval₂ + (equalCharacteristicCompletedLevelCoefficientHom_continuous F n) + (equalCharacteristicCompletedPrimitiveRootInteger_hasEval F n) + (equalCharacteristicThetaSeries u) + +private theorem equalCharacteristicCompletedEvaluation_hasEval_of_hasSubst + (F : LocalField.{u, v} K) (n : ℕ) + [CharP K F.residueCharacteristic] + (a : ((AlgebraicClosure F.residueField)⟦X⟧)⟦X⟧) + (ha : PowerSeries.HasSubst a) : + PowerSeries.HasEval + (equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicCompletedPrimitiveRootInteger F n) + (equalCharacteristicCompletedPrimitiveRootInteger_hasEval F n) a) := by + let hcoeff := + equalCharacteristicCompletedLevelCoefficientHom_continuous F n + let hroot := + equalCharacteristicCompletedPrimitiveRootInteger_hasEval F n + have hformal : PowerSeries.HasEval a := ha.hasEval + exact hformal.map + (φ := equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicCompletedPrimitiveRootInteger F n) hroot) + (by + rw [equalCharacteristicCompletedLevelEvaluation, + PowerSeries.coe_eval₂Hom] + exact PowerSeries.continuous_eval₂ hcoeff hroot) + +/-- The theta value is itself topologically nilpotent. -/ +theorem equalCharacteristicThetaAtCompletedPrimitiveRoot_hasEval + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + PowerSeries.HasEval + (equalCharacteristicThetaAtCompletedPrimitiveRoot F u n) := by + rw [equalCharacteristicThetaAtCompletedPrimitiveRoot] + exact equalCharacteristicCompletedEvaluation_hasEval_of_hasSubst F n + (equalCharacteristicThetaSeries u) + (equalCharacteristicThetaSeries_hasSubst u) + +/-- The analytic value `[u](lambda_(n+1))` of the source Lubin--Tate +endomorphism occurring in the first theta identity. -/ +noncomputable def equalCharacteristicSourceBracketAtCompletedPrimitiveRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Valued.integer (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicCompletedPrimitiveRootInteger F n) + (equalCharacteristicCompletedPrimitiveRootInteger_hasEval F n) + (equalCharacteristicCompletedSourceBracket u) + +/-- The analytically evaluated bracket remains topologically nilpotent, so +theta can itself be evaluated at `[u](lambda_(n+1))`. -/ +theorem equalCharacteristicSourceBracketAtCompletedPrimitiveRoot_hasEval + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + PowerSeries.HasEval + (equalCharacteristicSourceBracketAtCompletedPrimitiveRoot F u n) := by + rw [equalCharacteristicSourceBracketAtCompletedPrimitiveRoot] + exact equalCharacteristicCompletedEvaluation_hasEval_of_hasSubst F n + (equalCharacteristicCompletedSourceBracket u) + (equalCharacteristicCompletedSourceBracket_hasSubst u) + +/-- Analytic evaluation commutes with a genuine formal substitution whose +inner series has nilpotent constant coefficient. -/ +private theorem equalCharacteristicCompletedLevelEvaluation_subst + (F : LocalField.{u, v} K) (n : ℕ) + [CharP K F.residueCharacteristic] + (a f : ((AlgebraicClosure F.residueField)⟦X⟧)⟦X⟧) + (ha : PowerSeries.HasSubst a) + (hroot : PowerSeries.HasEval + (equalCharacteristicCompletedPrimitiveRootInteger F n)) + (haEval : PowerSeries.HasEval + (equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicCompletedPrimitiveRootInteger F n) hroot a)) : + equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicCompletedPrimitiveRootInteger F n) hroot + (PowerSeries.subst a f) = + equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicCompletedPrimitiveRootInteger F n) hroot a) + haEval f := by + let R := (AlgebraicClosure F.residueField)⟦X⟧ + let S := Valued.integer (equalCharacteristicCompletedLevelField F n) + simp only [equalCharacteristicCompletedLevelEvaluation, + PowerSeries.coe_eval₂Hom] + change PowerSeries.eval₂ (algebraMap R S) + (equalCharacteristicCompletedPrimitiveRootInteger F n) + (PowerSeries.subst a f) = + PowerSeries.eval₂ (algebraMap R S) + (PowerSeries.eval₂ (algebraMap R S) + (equalCharacteristicCompletedPrimitiveRootInteger F n) a) f + simpa only [PowerSeries.eval₂, PowerSeries.subst, Function.const_apply] + using + (MvPowerSeries.eval₂_subst + (R := R) (S := R) (T := S) + (a := fun _ : Unit ↦ a) ha.const + (PowerSeries.hasEval hroot) f) + +/-- The left side `theta^phi(lambda_(n+1))` of the first theta identity. -/ +noncomputable def equalCharacteristicThetaFrobeniusAtCompletedPrimitiveRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Valued.integer (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicCompletedPrimitiveRootInteger F n) + (equalCharacteristicCompletedPrimitiveRootInteger_hasEval F n) + (equalCharacteristicThetaSeriesFrobenius u) + +/-- The completed theta-intertwining theorem, the first theta identity after genuine analytic +evaluation at the completed primitive point: + +`theta^phi(lambda_(n+1)) = theta([u](lambda_(n+1)))`. -/ +theorem equalCharacteristicTheta_firstIdentity_atCompletedPrimitiveRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicThetaFrobeniusAtCompletedPrimitiveRoot F u n = + equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicSourceBracketAtCompletedPrimitiveRoot F u n) + (equalCharacteristicSourceBracketAtCompletedPrimitiveRoot_hasEval + F u n) + (equalCharacteristicThetaSeries u) := by + rw [equalCharacteristicThetaFrobeniusAtCompletedPrimitiveRoot, + equalCharacteristicThetaSeriesFrobenius_eq_subst_sourceBracket] + exact equalCharacteristicCompletedLevelEvaluation_subst F n + (equalCharacteristicCompletedSourceBracket u) + (equalCharacteristicThetaSeries u) + (equalCharacteristicCompletedSourceBracket_hasSubst u) + (equalCharacteristicCompletedPrimitiveRootInteger_hasEval F n) + (equalCharacteristicSourceBracketAtCompletedPrimitiveRoot_hasEval F u n) + +/-- The analytic value of the source Lubin--Tate series +`Y^q + (u⁻¹T)Y` at the completed primitive root. -/ +noncomputable def equalCharacteristicSourceLubinTateAtCompletedPrimitiveRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Valued.integer (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicCompletedPrimitiveRootInteger F n) + (equalCharacteristicCompletedPrimitiveRootInteger_hasEval F n) + (equalCharacteristicCompletedLubinTateSeries + (equalCharacteristicCompletedSourceUniformizer u)) + +/-- States the theorem `equalCharacteristicSourceLubinTateAtCompletedPrimitiveRoot_hasEval`. -/ +theorem equalCharacteristicSourceLubinTateAtCompletedPrimitiveRoot_hasEval + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + PowerSeries.HasEval + (equalCharacteristicSourceLubinTateAtCompletedPrimitiveRoot F u n) := by + rw [equalCharacteristicSourceLubinTateAtCompletedPrimitiveRoot] + exact equalCharacteristicCompletedEvaluation_hasEval_of_hasSubst F n + (equalCharacteristicCompletedLubinTateSeries + (equalCharacteristicCompletedSourceUniformizer u)) + (equalCharacteristicCompletedLubinTateSeries_hasSubst + (equalCharacteristicCompletedSourceUniformizer u)) + +/-- The completed theta-intertwining theorem, the second theta identity after analytic evaluation: + +`theta^phi(e_(u⁻¹T)(lambda)) = e_T(theta(lambda))`. + +The right side is expanded inside the completed level valuation ring. -/ +theorem equalCharacteristicTheta_secondIdentity_atCompletedPrimitiveRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicSourceLubinTateAtCompletedPrimitiveRoot F u n) + (equalCharacteristicSourceLubinTateAtCompletedPrimitiveRoot_hasEval + F u n) + (equalCharacteristicThetaSeriesFrobenius u) = + equalCharacteristicThetaAtCompletedPrimitiveRoot F u n ^ + Nat.card F.residueField + + equalCharacteristicCompletedLevelUniformizerInteger F n * + equalCharacteristicThetaAtCompletedPrimitiveRoot F u n := by + let root := equalCharacteristicCompletedPrimitiveRootInteger F n + let hroot := equalCharacteristicCompletedPrimitiveRootInteger_hasEval F n + let source := equalCharacteristicCompletedLubinTateSeries + (equalCharacteristicCompletedSourceUniformizer u) + let theta := equalCharacteristicThetaSeries u + let target := equalCharacteristicCompletedLubinTateSeries + (k := F.residueField) PowerSeries.X + have hleft := equalCharacteristicCompletedLevelEvaluation_subst F n + source (equalCharacteristicThetaSeriesFrobenius u) + (equalCharacteristicCompletedLubinTateSeries_hasSubst + (equalCharacteristicCompletedSourceUniformizer u)) + hroot + (equalCharacteristicSourceLubinTateAtCompletedPrimitiveRoot_hasEval F u n) + have hright := equalCharacteristicCompletedLevelEvaluation_subst F n + theta target (equalCharacteristicThetaSeries_hasSubst u) hroot + (equalCharacteristicThetaAtCompletedPrimitiveRoot_hasEval F u n) + have hintertwines := congrArg + (equalCharacteristicCompletedLevelEvaluation F n root hroot) + (equalCharacteristicThetaSeries_intertwines u) + calc + _ = equalCharacteristicCompletedLevelEvaluation F n root hroot + (PowerSeries.subst source + (equalCharacteristicThetaSeriesFrobenius u)) := by + simpa [equalCharacteristicSourceLubinTateAtCompletedPrimitiveRoot, + source, root, hroot] using hleft.symm + _ = equalCharacteristicCompletedLevelEvaluation F n root hroot + (PowerSeries.subst theta target) := by + simpa [source, theta, target] using hintertwines + _ = equalCharacteristicCompletedLevelEvaluation F n + (equalCharacteristicThetaAtCompletedPrimitiveRoot F u n) + (equalCharacteristicThetaAtCompletedPrimitiveRoot_hasEval F u n) + target := by + simpa [equalCharacteristicThetaAtCompletedPrimitiveRoot, + theta, root, hroot] using hright + _ = _ := by + simp [target, equalCharacteristicCompletedLubinTateSeries, + equalCharacteristicCompletedLevelUniformizerInteger] + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaLocalInverse.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaLocalInverse.lean new file mode 100644 index 0000000000..b3daade980 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaLocalInverse.lean @@ -0,0 +1,344 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaAtCompletedLevel +public import Mathlib.Topology.Algebra.InfiniteSum.Nonarchimedean +/-! +# The completed theta-intertwining theorem: local injectivity of theta + +The theta series has a unit linear coefficient and integral higher +coefficients. This file records the resulting nonarchimedean local +isometry on the maximal ideal. +-/ + +@[expose] public section + +noncomputable +section + +open Filter +open scoped LaurentSeries NNReal NormedField PowerSeries + PowerSeries.WithPiTopology Topology Valued WithZero + + +universe u v w + +namespace LubinTate +namespace EqualCharacteristic + +variable {ι E : Type*} + +private theorem norm_finset_sum_le_of_norm_le + [SeminormedAddCommGroup E] [IsUltrametricDist E] + {f : ι → E} (t : Finset ι) {C : ℝ} + (hC : 0 ≤ C) (hf : ∀ i ∈ t, ‖f i‖ ≤ C) : + ‖∑ i ∈ t, f i‖ ≤ C := by + classical + induction t using Finset.induction_on with + | empty => simpa using hC + | @insert a t ha ih => + rw [Finset.sum_insert ha] + exact (IsUltrametricDist.norm_add_le_max (f a) (∑ i ∈ t, f i)).trans + (max_le (hf a (Finset.mem_insert_self a t)) + (ih fun i hi ↦ hf i (Finset.mem_insert_of_mem hi))) + +/-- A convergent series in an ultrametric group has norm bounded by any +common bound for all its terms. -/ +theorem norm_le_of_hasSum_of_norm_le + [SeminormedAddCommGroup E] [IsUltrametricDist E] + {f : ι → E} {s : E} {C : ℝ} + (hC : 0 ≤ C) (hf : ∀ i, ‖f i‖ ≤ C) (hs : HasSum f s) : + ‖s‖ ≤ C := by + classical + have hpartial : ∀ t : Finset ι, ‖∑ i ∈ t, f i‖ ≤ C := by + intro t + exact norm_finset_sum_le_of_norm_le t hC (fun i _ ↦ hf i) + have hsClosed : s ∈ Metric.closedBall (0 : E) C := + Metric.isClosed_closedBall.mem_of_tendsto hs + (Filter.Eventually.of_forall fun t ↦ by + simpa [Metric.mem_closedBall] using hpartial t) + simpa [Metric.mem_closedBall] using hsClosed + +/-- The two-variable geometric factor in `x^n-y^n` is bounded by the +larger of `‖x‖` and `‖y‖` on the open unit ball, once `n ≥ 2`. -/ +private theorem norm_geomSum₂_le_max + {L : Type*} [NontriviallyNormedField L] [IsUltrametricDist L] + (x y : Valued.integer L) (n : ℕ) (hn : 2 ≤ n) + (hx : ‖x‖ < 1) (hy : ‖y‖ < 1) : + ‖∑ i ∈ Finset.range n, x ^ i * y ^ (n - 1 - i)‖ ≤ + max ‖x‖ ‖y‖ := by + let r : ℝ := max ‖x‖ ‖y‖ + have hr0 : 0 ≤ r := le_trans (norm_nonneg x) (le_max_left _ _) + have hr1 : r < 1 := max_lt hx hy + apply norm_finset_sum_le_of_norm_le (Finset.range n) hr0 + intro i hiMem + have hi : i < n := Finset.mem_range.mp hiMem + have hxi : ‖x‖ ^ i ≤ r ^ i := + pow_le_pow_left₀ (norm_nonneg x) (le_max_left _ _) _ + have hyi : ‖y‖ ^ (n - 1 - i) ≤ r ^ (n - 1 - i) := + pow_le_pow_left₀ (norm_nonneg y) (le_max_right _ _) _ + rw [norm_mul, norm_pow, norm_pow] + calc + ‖x‖ ^ i * ‖y‖ ^ (n - 1 - i) ≤ r ^ i * r ^ (n - 1 - i) := + mul_le_mul hxi hyi (pow_nonneg (norm_nonneg y) _) (pow_nonneg hr0 _) + _ = r ^ (n - 1) := by + rw [← pow_add] + congr 1 + omega + _ = r ^ (n - 2) * r := by + rw [show n - 1 = (n - 2) + 1 by omega, pow_succ] + _ ≤ 1 * r := + mul_le_mul_of_nonneg_right (pow_le_one₀ hr0 hr1.le) hr0 + _ = r := one_mul r + +/-- Higher power differences contract strictly relative to `x-y` on the +open unit ball. -/ +private theorem norm_pow_sub_pow_le_max_mul_norm_sub + {L : Type*} [NontriviallyNormedField L] [IsUltrametricDist L] + (x y : Valued.integer L) (n : ℕ) (hn : 2 ≤ n) + (hx : ‖x‖ < 1) (hy : ‖y‖ < 1) : + ‖x ^ n - y ^ n‖ ≤ max ‖x‖ ‖y‖ * ‖x - y‖ := by + rw [← (Commute.all x y).mul_geom_sum₂ n, norm_mul, mul_comm] + exact mul_le_mul_of_nonneg_right + (norm_geomSum₂_le_max x y n hn hx hy) (norm_nonneg (x - y)) + +/-- Nonarchimedean inverse-function estimate for an integral power series. + +The coefficient sequence is valued in the valuation ring. A unit linear +coefficient makes any two convergent evaluations on the open unit ball an +isometry. No characteristic assumption is needed. -/ +theorem integralPowerSeriesEvaluation_norm_sub + {L : Type*} [NontriviallyNormedField L] [IsUltrametricDist L] + (c : ℕ → Valued.integer L) (hc₁ : IsUnit (c 1)) + (x y fx fy : Valued.integer L) + (hx : ‖x‖ < 1) (hy : ‖y‖ < 1) + (hfx : HasSum (fun m : ℕ ↦ c m * x ^ m) fx) + (hfy : HasSum (fun m : ℕ ↦ c m * y ^ m) fy) : + ‖fx - fy‖ = ‖x - y‖ := by + by_cases hxy : x = y + · subst y + have hvalue : fx = fy := hfx.unique hfy + subst fy + simp + let term : ℕ → Valued.integer L := + fun m ↦ c m * x ^ m - c m * y ^ m + let linear : Valued.integer L := c 1 * (x - y) + let remainder : Valued.integer L := (fx - fy) - linear + let r : ℝ := max ‖x‖ ‖y‖ + have hr0 : 0 ≤ r := le_trans (norm_nonneg x) (le_max_left _ _) + have hr1 : r < 1 := max_lt hx hy + have hdiff : HasSum term (fx - fy) := by + simpa only [term] using hfx.sub hfy + have hprefix : ∑ i ∈ Finset.range 2, term i = linear := by + simp only [Finset.sum_range_succ, Finset.sum_range_zero, zero_add] + dsimp only [term, linear] + ring + have htail : HasSum (fun m : ℕ ↦ term (m + 2)) remainder := by + have h := (hasSum_nat_add_iff' (f := term) 2).2 hdiff + rwa [hprefix] at h + have htermBound : ∀ m : ℕ, + ‖term (m + 2)‖ ≤ r * ‖x - y‖ := by + intro m + change ‖c (m + 2) * x ^ (m + 2) - + c (m + 2) * y ^ (m + 2)‖ ≤ r * ‖x - y‖ + rw [← mul_sub, norm_mul] + calc + ‖c (m + 2)‖ * ‖x ^ (m + 2) - y ^ (m + 2)‖ ≤ + 1 * (r * ‖x - y‖) := + mul_le_mul (Valued.integer.norm_le_one _) (by + simpa only [r] using + norm_pow_sub_pow_le_max_mul_norm_sub x y (m + 2) (by omega) hx hy) + (norm_nonneg _) zero_le_one + _ = r * ‖x - y‖ := one_mul _ + have hremainder_le : ‖remainder‖ ≤ r * ‖x - y‖ := + norm_le_of_hasSum_of_norm_le + (mul_nonneg hr0 (norm_nonneg (x - y))) htermBound htail + have hsubpos : 0 < ‖x - y‖ := norm_pos_iff.mpr (sub_ne_zero.mpr hxy) + have hremainder_lt : ‖remainder‖ < ‖x - y‖ := + hremainder_le.trans_lt (by + simpa only [one_mul] using mul_lt_mul_of_pos_right hr1 hsubpos) + have hlinear : ‖linear‖ = ‖x - y‖ := by + change ‖c 1 * (x - y)‖ = ‖x - y‖ + rw [norm_mul, + (Valued.integer.isUnit_iff_norm_eq_one.mp hc₁), one_mul] + have hdecomp : fx - fy = linear + remainder := by + simp [remainder] + rw [hdecomp] + calc + ‖linear + remainder‖ = max ‖linear‖ ‖remainder‖ := + IsUltrametricDist.norm_add_eq_max_of_norm_ne_norm + (hlinear.trans_ne hremainder_lt.ne') + _ = ‖x - y‖ := by + rw [hlinear, max_eq_left hremainder_lt.le] + +/-- Consequently, any analytic evaluation with integral coefficients and +unit linear coefficient is injective on the open unit ball. -/ +theorem integralPowerSeriesEvaluation_injectiveOn + {L : Type*} [NontriviallyNormedField L] [IsUltrametricDist L] + (c : ℕ → Valued.integer L) (hc₁ : IsUnit (c 1)) + (eval : Valued.integer L → Valued.integer L) + (hsum : ∀ x : Valued.integer L, ‖x‖ < 1 → + HasSum (fun m : ℕ ↦ c m * x ^ m) (eval x)) : + Set.InjOn eval {x | ‖x‖ < 1} := by + intro x hx y hy hxy + have hnorm := integralPowerSeriesEvaluation_norm_sub c hc₁ x y + (eval x) (eval y) hx hy (hsum x hx) (hsum y hy) + rw [hxy, sub_self, norm_zero] at hnorm + exact sub_eq_zero.mp (norm_eq_zero.mp hnorm.symm) + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The canonical nontrivial norm on the completed Lubin–Tate field at level `n`. -/ +noncomputable local instance equalCharacteristicThetaInverseLevelNormedField + (F : LocalField.{u, v} K) (n : ℕ) : + NontriviallyNormedField (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelNormedField F n + +noncomputable local instance equalCharacteristicThetaInverseLevelIsUltrametric + (F : LocalField.{u, v} K) (n : ℕ) : + IsUltrametricDist (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelIsUltrametric F n + +noncomputable local instance equalCharacteristicThetaInverseLevelCompleteSpace + (F : LocalField.{u, v} K) (n : ℕ) : + CompleteSpace (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelCompleteSpace F n + +/-- The nonnegative-real-valued valuation on the completed Lubin–Tate field at level `n`. -/ +noncomputable local instance equalCharacteristicThetaInverseLevelValued + (F : LocalField.{u, v} K) (n : ℕ) : + Valued (equalCharacteristicCompletedLevelField F n) ℝ≥0 := + equalCharacteristicCompletedLevelValued F n + +noncomputable local instance equalCharacteristicThetaInverseIntegerLinearTopology + (F : LocalField.{u, v} K) (n : ℕ) : + IsLinearTopology + (Valued.integer (equalCharacteristicCompletedLevelField F n)) + (Valued.integer (equalCharacteristicCompletedLevelField F n)) := + valuedIntegerLinearTopology + +noncomputable local instance equalCharacteristicThetaInverseIntegerCompleteSpace + (F : LocalField.{u, v} K) (n : ℕ) : + CompleteSpace + (Valued.integer (equalCharacteristicCompletedLevelField F n)) := + valuedIntegerCompleteSpace + +noncomputable local instance equalCharacteristicThetaInverseIntegerUniformAddGroup + (F : LocalField.{u, v} K) (n : ℕ) : + IsUniformAddGroup + (Valued.integer (equalCharacteristicCompletedLevelField F n)) := + valuedIntegerIsUniformAddGroup + +private noncomputable local instance equalCharacteristicThetaInverseCoefficientUniformSpace + (F : LocalField.{u, v} K) : + UniformSpace ((AlgebraicClosure F.residueField)⟦X⟧) := ⊥ + +private theorem equalCharacteristicThetaInverseCoefficientHom_continuous + (F : LocalField.{u, v} K) (n : ℕ) : + Continuous (equalCharacteristicCompletedLevelCoefficientHom F n) := + continuous_of_discreteTopology + +/-- Norm `< 1` supplies the analytic evaluation hypothesis for a point in +the completed-level valuation ring. -/ +theorem equalCharacteristicCompletedLevel_hasEval_of_norm_lt_one + (F : LocalField.{u, v} K) (n : ℕ) + (x : Valued.integer (equalCharacteristicCompletedLevelField F n)) + (hx : ‖x‖ < 1) : + PowerSeries.HasEval x := by + change Tendsto (fun m : ℕ ↦ x ^ m) atTop (nhds 0) + exact tendsto_pow_atTop_nhds_zero_of_norm_lt_one hx + +/-- The linear coefficient of theta stays a unit after inclusion into any +completed level valuation ring. -/ +theorem equalCharacteristicThetaCompletedCoefficientOne_isUnit + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + IsUnit + (equalCharacteristicCompletedLevelCoefficientHom F n + (PowerSeries.coeff 1 (equalCharacteristicThetaSeries u))) := by + apply IsUnit.map (equalCharacteristicCompletedLevelCoefficientHom F n) + rw [equalCharacteristicThetaSeries_coeff_one, + PowerSeries.isUnit_iff_constantCoeff] + apply isUnit_iff_ne_zero.mpr + simpa [PowerSeries.coeff_zero_eq_constantCoeff_apply] using + (equalCharacteristicSemilinearUnit_constantCoeff_ne_zero + (u : F.residueField⟦X⟧) + (by + intro hzero + have hunit := PowerSeries.isUnit_constantCoeff + (u : F.residueField⟦X⟧) u.isUnit + apply hunit.ne_zero + simpa [PowerSeries.coeff_zero_eq_constantCoeff_apply] using hzero)) + +/-- Theta evaluated at an arbitrary point of the completed-level maximal +ideal. -/ +noncomputable def equalCharacteristicThetaOnCompletedLevelMaximalIdeal + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) + (x : {x : Valued.integer (equalCharacteristicCompletedLevelField F n) // + ‖x‖ < 1}) : + Valued.integer (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelEvaluation F n x + (equalCharacteristicCompletedLevel_hasEval_of_norm_lt_one F n x x.property) + (equalCharacteristicThetaSeries u) + +/-- States the theorem `equalCharacteristicThetaOnCompletedLevelMaximalIdeal_hasSum`. -/ +theorem equalCharacteristicThetaOnCompletedLevelMaximalIdeal_hasSum + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) + (x : {x : Valued.integer (equalCharacteristicCompletedLevelField F n) // + ‖x‖ < 1}) : + HasSum + (fun m : ℕ ↦ + equalCharacteristicCompletedLevelCoefficientHom F n + (PowerSeries.coeff m (equalCharacteristicThetaSeries u)) * + (x : Valued.integer + (equalCharacteristicCompletedLevelField F n)) ^ m) + (equalCharacteristicThetaOnCompletedLevelMaximalIdeal F u n x) := by + rw [equalCharacteristicThetaOnCompletedLevelMaximalIdeal, + equalCharacteristicCompletedLevelEvaluation, + PowerSeries.coe_eval₂Hom] + exact PowerSeries.hasSum_eval₂ + (equalCharacteristicThetaInverseCoefficientHom_continuous F n) + (equalCharacteristicCompletedLevel_hasEval_of_norm_lt_one F n x x.property) + (equalCharacteristicThetaSeries u) + +/-- The faithful analytic conclusion used in the completed theta-intertwining theorem: theta is a +local isometry, hence injective, on the completed-level maximal ideal. -/ +theorem equalCharacteristicThetaOnCompletedLevelMaximalIdeal_norm_sub + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) + (x y : {x : Valued.integer (equalCharacteristicCompletedLevelField F n) // + ‖x‖ < 1}) : + ‖equalCharacteristicThetaOnCompletedLevelMaximalIdeal F u n x - + equalCharacteristicThetaOnCompletedLevelMaximalIdeal F u n y‖ = + ‖(x : Valued.integer (equalCharacteristicCompletedLevelField F n)) - y‖ := by + exact integralPowerSeriesEvaluation_norm_sub + (fun m : ℕ ↦ + equalCharacteristicCompletedLevelCoefficientHom F n + (PowerSeries.coeff m (equalCharacteristicThetaSeries u))) + (equalCharacteristicThetaCompletedCoefficientOne_isUnit F u n) + x y + (equalCharacteristicThetaOnCompletedLevelMaximalIdeal F u n x) + (equalCharacteristicThetaOnCompletedLevelMaximalIdeal F u n y) + x.property y.property + (equalCharacteristicThetaOnCompletedLevelMaximalIdeal_hasSum F u n x) + (equalCharacteristicThetaOnCompletedLevelMaximalIdeal_hasSum F u n y) + +/-- States the theorem `equalCharacteristicThetaOnCompletedLevelMaximalIdeal_injective`. -/ +theorem equalCharacteristicThetaOnCompletedLevelMaximalIdeal_injective + (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : + Function.Injective + (equalCharacteristicThetaOnCompletedLevelMaximalIdeal F u n) := by + intro x y hxy + apply Subtype.ext + have hnorm := + equalCharacteristicThetaOnCompletedLevelMaximalIdeal_norm_sub F u n x y + rw [hxy, sub_self, norm_zero] at hnorm + exact sub_eq_zero.mp (norm_eq_zero.mp hnorm.symm) + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence.lean new file mode 100644 index 0000000000..aca80da288 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/All.lean new file mode 100644 index 0000000000..6c2d93b317 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/All.lean @@ -0,0 +1,20 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization +/-! +# Equal-characteristic Laurent model for Lubin--Tate theory + +Public aggregate for the reusable Laurent-series model and its normalized +uniformizer. Transport of the exact norm-subgroup calculation to an arbitrary +equal-characteristic local field uses finite local reciprocity and is exported +by `LocalClassFieldTheory.LubinTateApplication`. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentLocalField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentLocalField.lean new file mode 100644 index 0000000000..5f1f3ab497 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentLocalField.lean @@ -0,0 +1,321 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel +public import Mathlib.RingTheory.PowerSeries.PiTopology +/-! +# The local-field structure on a finite-coefficient Laurent field + +For a finite field `k`, the valuation ring in `k((T))` is the image of +`k[[T]]`. With the coefficientwise product topology the latter is compact +by Tychonoff. This file proves that its inclusion into the native Laurent +valuation topology is continuous, transfers compactness to the valuation +ring, and obtains local compactness of `k((T))`. This supplies the genuine +`IsNonarchimedeanLocalField` input needed by the equal-characteristic +Lubin--Tate construction. +-/ + +@[expose] public section + +noncomputable +section + + +open Filter Set +open scoped PowerSeries LaurentSeries PowerSeries.WithPiTopology Topology Valued WithZero + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +universe u v w + +variable {k : Type u} [Field k] + +/-- A valuation topology is the topology of its associated valuative +relation. This is the universe-polymorphic form needed for the residue +field of a `LocalField`; the argument compares the two standard bases at +zero in both directions. -/ +private theorem isValuativeTopology_of_valued_ofValuation' + (L : Type u) (Γ : Type w) [Field L] + [LinearOrderedCommGroupWithZero Γ] + [Valued L Γ] + [Valuation.IsNontrivial (Valued.v : Valuation L Γ)] : + letI := ValuativeRel.ofValuation (Valued.v : Valuation L Γ) + IsValuativeTopology L := by + let vL : Valuation L Γ := Valued.v + let : ValuativeRel L := ValuativeRel.ofValuation vL + let : vL.Compatible := Valuation.Compatible.ofValuation vL + let : ValuativeRel.IsNontrivial L := + (ValuativeRel.isNontrivial_iff_isNontrivial vL).2 inferInstance + apply IsValuativeTopology.of_zero + intro s + rw [Valued.mem_nhds_zero] + constructor + · rintro ⟨δ, hδ⟩ + refine + ⟨δ.mapEquiv + (ValuativeRel.ValueGroupWithZero.orderMonoidIso vL).symm, ?_⟩ + intro z hz + apply hδ + exact + (ValuativeRel.valuation_lt_symm_orderMonoidIso + vL (δ : MonoidWithZeroHom.ValueGroup₀ (.ofClass vL)) z).1 + (by simpa using hz) + · rintro ⟨γ, hγ⟩ + refine + ⟨γ.mapEquiv + (ValuativeRel.ValueGroupWithZero.orderMonoidIso vL), ?_⟩ + intro z hz + apply hγ + have hz' : + vL.restrict z < + (ValuativeRel.ValueGroupWithZero.orderMonoidIso vL) + (γ : ValuativeRel.ValueGroupWithZero L) := by + exact hz + exact + (ValuativeRel.restrict_lt_orderMonoidIso + vL (γ : ValuativeRel.ValueGroupWithZero L) z).1 hz' + +/-- The coefficientwise inclusion `k[[T]] → k((T))` is continuous when +`k` is discrete. -/ +theorem continuous_laurentSeries_ofPowerSeries + [TopologicalSpace k] [DiscreteTopology k] : + Continuous (HahnSeries.ofPowerSeries ℤ k : k⟦X⟧ → k⸨X⸩) := by + apply continuous_of_continuousAt_zero + (HahnSeries.ofPowerSeries ℤ k).toAddMonoidHom + unfold ContinuousAt + simp only [map_zero] + rw [(Valued.hasBasis_nhds_zero k⸨X⸩ ℤᵐ⁰).tendsto_right_iff] + intro γ _ + let γ' : (ℤᵐ⁰)ˣ := + Units.map (MonoidWithZeroHom.ValueGroup₀.embedding + (f := (.ofClass (Valued.v : + Valuation k⸨X⸩ ℤᵐ⁰)))) γ + obtain ⟨N, hN⟩ := WithZero.exists_exp_neg_natCast_lt γ'.ne_zero + let U : Set k⟦X⟧ := + ⋂ n ∈ Finset.range N, {f | PowerSeries.coeff n f = 0} + have hU : U ∈ 𝓝 (0 : k⟦X⟧) := by + dsimp [U] + rw [Finset.iInter_mem_sets] + intro n hn + have hopen : IsOpen + ((PowerSeries.coeff n : k⟦X⟧ → k) ⁻¹' ({0} : Set k)) := + (isOpen_discrete ({0} : Set k)).preimage + (PowerSeries.WithPiTopology.continuous_coeff k n) + exact hopen.mem_nhds (by simp) + refine mem_of_superset hU ?_ + intro f hf + have hcoeff : ∀ n : ℕ, n < N → PowerSeries.coeff n f = 0 := by + intro n hn + simp only [U, Set.mem_iInter, Set.mem_ofPred_eq] at hf + exact hf n (Finset.mem_range.mpr hn) + change (Valued.v : Valuation k⸨X⸩ ℤᵐ⁰).restrict + ((f : k⟦X⟧) : k⸨X⸩) < γ.1 + rw [Valuation.restrict_lt_iff_lt_embedding] + exact lt_of_le_of_lt + ((LaurentSeries.intValuation_le_iff_coeff_lt_eq_zero k f).2 hcoeff) + (by simpa [γ'] using hN) + +/-- Power series as elements of the native Laurent valuation ring. -/ +noncomputable def powerSeriesToLaurentInteger (k : Type u) [Field k] : + k⟦X⟧ → Valued.integer k⸨X⸩ := + fun f => ⟨(f : k⸨X⸩), + (LaurentSeries.val_le_one_iff_eq_coe k (f : k⸨X⸩)).2 ⟨f, rfl⟩⟩ + +/-- Embedding power series into the Laurent valuation ring is continuous. -/ +theorem continuous_powerSeriesToLaurentInteger + [TopologicalSpace k] [DiscreteTopology k] : + Continuous (powerSeriesToLaurentInteger k) := + (continuous_laurentSeries_ofPowerSeries (k := k)).subtype_mk _ + +/-- Every integral Laurent series comes from a power series. -/ +theorem powerSeriesToLaurentInteger_surjective : + Function.Surjective (powerSeriesToLaurentInteger k) := by + intro x + obtain ⟨f, hf⟩ := + (LaurentSeries.val_le_one_iff_eq_coe k (x : k⸨X⸩)).1 x.property + refine ⟨f, Subtype.ext ?_⟩ + exact hf + +/-- The valuation ring of the native Laurent valuation is exactly the power +series ring. This algebraic equivalence is also the source of its prime +element; compactness above only used its continuous underlying map. -/ +noncomputable def powerSeriesEquivLaurentInteger + (k : Type u) [Field k] : + k⟦X⟧ ≃+* Valued.integer k⸨X⸩ where + toFun := powerSeriesToLaurentInteger k + invFun x := Classical.choose + ((LaurentSeries.val_le_one_iff_eq_coe k (x : k⸨X⸩)).1 x.property) + left_inv f := by + exact (HahnSeries.ofPowerSeries_injective (Γ := ℤ) (R := k)) + (Classical.choose_spec + ((LaurentSeries.val_le_one_iff_eq_coe k + ((powerSeriesToLaurentInteger k f : + Valued.integer k⸨X⸩) : k⸨X⸩)).1 + (powerSeriesToLaurentInteger k f).property)) + right_inv x := by + apply Subtype.ext + exact Classical.choose_spec + ((LaurentSeries.val_le_one_iff_eq_coe k (x : k⸨X⸩)).1 x.property) + map_add' f g := by + apply Subtype.ext + exact map_add (HahnSeries.ofPowerSeries ℤ k) f g + map_mul' f g := by + apply Subtype.ext + exact map_mul (HahnSeries.ofPowerSeries ℤ k) f g + +/-- The power-series equivalence preserves the underlying Laurent series. -/ +@[simp] +theorem powerSeriesEquivLaurentInteger_coe + (f : k⟦X⟧) : + ((powerSeriesEquivLaurentInteger k f : + Valued.integer k⸨X⸩) : k⸨X⸩) = (f : k⸨X⸩) := + rfl + +/-- The image of `X` is irreducible in the Laurent valuation ring. -/ +theorem powerSeriesEquivLaurentInteger_X_irreducible : + Irreducible + (powerSeriesEquivLaurentInteger k (PowerSeries.X : k⟦X⟧)) := + PowerSeries.X_irreducible.map (powerSeriesEquivLaurentInteger k) + +/-- The canonical integer ring attached to the valuative relation induced by +the Laurent valuation is the native valued-field integer ring. -/ +noncomputable def laurentValuativeIntegerEquiv + (k : Type u) [Field k] : + letI : ValuativeRel k⸨X⸩ := ValuativeRel.ofValuation + (Valued.v : Valuation k⸨X⸩ ℤᵐ⁰) + (ValuativeRel.valuation k⸨X⸩).integer ≃+* + Valued.integer k⸨X⸩ := by + let L := k⸨X⸩ + let vL := (Valued.v : Valuation L ℤᵐ⁰) + letI : ValuativeRel L := ValuativeRel.ofValuation vL + letI : vL.Compatible := Valuation.Compatible.ofValuation vL + let wL := ValuativeRel.valuation L + exact + { toFun := fun x => ⟨x, by + have hxrel : (x : L) ≤ᵥ (1 : L) := + wL.vle_iff_le.mpr x.property + change vL (x : L) ≤ 1 + simpa only [map_one] using vL.vle_iff_le.mp hxrel⟩ + invFun := fun x => ⟨x, by + have hxv : vL (x : L) ≤ 1 := x.property + have hxrel : (x : L) ≤ᵥ (1 : L) := + vL.vle_iff_le.mpr (by simpa only [map_one] using hxv) + exact wL.vle_iff_le.mp hxrel⟩ + left_inv := fun _ => rfl + right_inv := fun _ => rfl + map_add' := fun _ _ => rfl + map_mul' := fun _ _ => rfl } + +/-- Power series identify with the canonical integer ring of the valuative +relation generated by the native Laurent valuation. -/ +noncomputable def powerSeriesEquivLaurentValuativeInteger + (k : Type u) [Field k] : + letI : ValuativeRel k⸨X⸩ := ValuativeRel.ofValuation + (Valued.v : Valuation k⸨X⸩ ℤᵐ⁰) + k⟦X⟧ ≃+* (ValuativeRel.valuation k⸨X⸩).integer := by + letI : ValuativeRel k⸨X⸩ := ValuativeRel.ofValuation + (Valued.v : Valuation k⸨X⸩ ℤᵐ⁰) + exact (powerSeriesEquivLaurentInteger k).trans + (laurentValuativeIntegerEquiv k).symm + +/-- The image of `X` is irreducible in the valuative integer ring. -/ +theorem powerSeriesEquivLaurentValuativeInteger_X_irreducible : + letI : ValuativeRel k⸨X⸩ := ValuativeRel.ofValuation + (Valued.v : Valuation k⸨X⸩ ℤᵐ⁰) + Irreducible + (powerSeriesEquivLaurentValuativeInteger k + (PowerSeries.X : k⟦X⟧)) := by + let : ValuativeRel k⸨X⸩ := ValuativeRel.ofValuation + (Valued.v : Valuation k⸨X⸩ ℤᵐ⁰) + exact PowerSeries.X_irreducible.map + (powerSeriesEquivLaurentValuativeInteger k) + +/-- The native valuation ring of a Laurent series field over a finite field +is compact. -/ +theorem laurentSeriesIntegerCompactSpace + (k : Type u) [Field k] [Finite k] : + CompactSpace (Valued.integer k⸨X⸩) := by + let : TopologicalSpace k := ⊥ + let : DiscreteTopology k := ⟨rfl⟩ + let : CompactSpace k := Finite.compactSpace + let : CompactSpace k⟦X⟧ := + inferInstanceAs (CompactSpace ((Unit →₀ ℕ) → k)) + rw [← isCompact_univ_iff] + have h := (isCompact_univ : IsCompact (Set.univ : Set k⟦X⟧)).image + (continuous_powerSeriesToLaurentInteger (k := k)) + rw [Set.image_univ, + Set.range_eq_univ.mpr (powerSeriesToLaurentInteger_surjective (k := k))] at h + exact h + +/-- A Laurent series field over a finite field is locally compact in its +native valuation topology. -/ +theorem laurentSeriesLocallyCompactSpace + (k : Type u) [Field k] [Finite k] : + LocallyCompactSpace k⸨X⸩ := by + let : CompactSpace (Valued.integer k⸨X⸩) := + laurentSeriesIntegerCompactSpace k + have hcompact : IsCompact (X := k⸨X⸩) (Valued.integer k⸨X⸩) := + isCompact_iff_compactSpace.mpr inferInstance + apply IsCompact.locallyCompactSpace_of_mem_nhds_of_addGroup hcompact + rw [Valued.mem_nhds_zero] + refine ⟨1, ?_⟩ + intro x hx + change Valued.v x ≤ 1 + exact le_of_lt ((Valued.v : + Valuation k⸨X⸩ ℤᵐ⁰).restrict_lt_one_iff.mp hx) + +/-- The valuative relation used on the equal-characteristic Laurent field. -/ +@[reducible] noncomputable def equalCharacteristicLaurentValuativeRel + {K : Type u} [Field K] (F : LocalField.{u, v} K) : + ValuativeRel F.residueField⸨X⸩ := + ValuativeRel.ofValuation + (Valued.v : Valuation F.residueField⸨X⸩ ℤᵐ⁰) + +/-- The genuine nonarchimedean local-field structure on the finite-residue +Laurent field used in the equal-characteristic Lubin--Tate construction. -/ +theorem equalCharacteristicLaurentIsNonarchimedeanLocalField + {K : Type u} [Field K] (F : LocalField.{u, v} K) : + letI := equalCharacteristicLaurentValuativeRel F + IsNonarchimedeanLocalField F.residueField⸨X⸩ := by + let L := F.residueField⸨X⸩ + let vL := (Valued.v : Valuation L ℤᵐ⁰) + let : ValuativeRel L := equalCharacteristicLaurentValuativeRel F + let : vL.Compatible := Valuation.Compatible.ofValuation vL + let x : L := + ((PowerSeries.X : F.residueField⟦X⟧) : F.residueField⸨X⸩) + have hxv : vL x = WithZero.exp (-1 : ℤ) := by + change (Valued.v : Valuation F.residueField⸨X⸩ ℤᵐ⁰) + (((PowerSeries.X : F.residueField⟦X⟧) : + F.residueField⸨X⸩)) = _ + simpa using LaurentSeries.valuation_X_pow F.residueField 1 + have hx0 : x ≠ 0 := by + intro hx + have : vL x = 0 := by rw [hx, map_zero] + rw [hxv] at this + exact WithZero.exp_ne_zero this + have hxlt : vL x < 1 := by + rw [hxv, ← WithZero.exp_zero, WithZero.exp_lt_exp] + omega + let : vL.IsNontrivial := + (Valuation.isNontrivial_iff_exists_lt_one vL).2 ⟨x, hx0, hxlt⟩ + let : ValuativeRel.IsNontrivial L := + (ValuativeRel.isNontrivial_iff_isNontrivial vL).2 inferInstance + let : IsValuativeTopology L := + isValuativeTopology_of_valued_ofValuation' L ℤᵐ⁰ + let : LocallyCompactSpace L := + laurentSeriesLocallyCompactSpace F.residueField + exact + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentModel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentModel.lean new file mode 100644 index 0000000000..8e7b861b33 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentModel.lean @@ -0,0 +1,157 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaPrincipalUnits +/-! +# Equal-characteristic Laurent-series model + +For the positive-characteristic branch of the existence theorem, the local-field classification +identifies a local field with a Laurent-series field over its residue field. +The earlier complete-DVR development constructs the coefficient section and proves that Laurent +series evaluation is onto. Here we package that concrete evaluation as the +actual field equivalence needed by the Lubin--Tate construction; no existence +or norm-subgroup statement is assumed. +-/ + +@[expose] public section + +noncomputable +section + +open scoped PowerSeries LaurentSeries + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The Laurent-series parameter `T`, written through the localization map +from power series so its later transport to the local field is definitional. -/ +noncomputable def equalCharacteristicLaurentUniformizer + (F : LocalField.{u, v} K) : F.residueField⸨X⸩ := + algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩ + (PowerSeries.X : F.residueField⟦X⟧) + +open CompleteDVF.higherPrincipalUnitGroup renaming + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank → + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank in +/-- In equal characteristic, Laurent-series evaluation at a chosen +uniformizer is a field equivalence onto the local field. -/ +noncomputable def equalCharacteristicLaurentRingEquiv + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) : + F.residueField⸨X⸩ ≃+* K := by + let f := CompleteDVF.higherPrincipalUnitGroup.iwasawaResidueRank F + let n : ℕ+ := + ⟨f, Module.finrank_pos⟩ + let eval : F.residueField⸨X⸩ →+* K := + CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom + (F := F.toCompleteDVF) F.residueCharacteristic (n := n) + (by + simpa [f, n] using + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F) + pi hpi + exact RingEquiv.ofBijective eval + ⟨RingHom.injective eval, + CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom_surjective + (F := F.toCompleteDVF) F.residueCharacteristic (n := n) + (by + simpa [f, n] using + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F) + pi hpi⟩ + +open CompleteDVF.higherPrincipalUnitGroup renaming + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank → + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank in +/-- States the theorem `equalCharacteristicLaurentRingEquiv_apply`. -/ +@[simp] +theorem equalCharacteristicLaurentRingEquiv_apply + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (x : F.residueField⸨X⸩) : + equalCharacteristicLaurentRingEquiv F hpi x = + CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom + (F := F.toCompleteDVF) F.residueCharacteristic + (n := + ⟨CompleteDVF.higherPrincipalUnitGroup.iwasawaResidueRank F, + Module.finrank_pos⟩) + (by + simpa using + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F) + pi hpi x := by + rfl + +open CompleteDVF.higherPrincipalUnitGroup renaming + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank → + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank in +/-- States the theorem `equalCharacteristicLaurentRingEquiv_algebraMap_C`. -/ +theorem equalCharacteristicLaurentRingEquiv_algebraMap_C + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (a : F.residueField) : + equalCharacteristicLaurentRingEquiv F hpi + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩ + (PowerSeries.C a)) = + CompleteDVF.EqualCharacteristicLaurent.coeffHom + (F := F.toCompleteDVF) F.residueCharacteristic + (n := + ⟨CompleteDVF.higherPrincipalUnitGroup.iwasawaResidueRank F, + Module.finrank_pos⟩) + (by + simpa using + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F) + a := by + rw [equalCharacteristicLaurentRingEquiv_apply] + exact + CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom_algebraMap_C + (F := F.toCompleteDVF) F.residueCharacteristic + (n := + ⟨CompleteDVF.higherPrincipalUnitGroup.iwasawaResidueRank F, + Module.finrank_pos⟩) + (by + simpa using + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F) + pi hpi a + +open CompleteDVF.higherPrincipalUnitGroup renaming + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank → + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank in +/-- States the theorem `equalCharacteristicLaurentRingEquiv_algebraMap_X`. -/ +theorem equalCharacteristicLaurentRingEquiv_algebraMap_X + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) : + equalCharacteristicLaurentRingEquiv F hpi + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩ + (PowerSeries.X : F.residueField⟦X⟧)) = + (pi : K) := by + rw [equalCharacteristicLaurentRingEquiv_apply] + exact + CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom_algebraMap_X + (F := F.toCompleteDVF) F.residueCharacteristic + (n := + ⟨CompleteDVF.higherPrincipalUnitGroup.iwasawaResidueRank F, + Module.finrank_pos⟩) + (by + simpa using + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F) + pi hpi + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentUniformizerNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentUniformizerNormalization.lean new file mode 100644 index 0000000000..93ed42e5a9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentUniformizerNormalization.lean @@ -0,0 +1,122 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +/-! +# normalization of the equal-characteristic parameter + +The Laurent-series valuation sends `T` to `exp (-1)`. The power-series +description of its integer ring makes `T` a genuine prime element, so the +canonical normalized additive valuation sends `T⁻¹` to `1`. +-/ + +@[expose] public section + +noncomputable +section + +open scoped PowerSeries LaurentSeries ValuativeRel WithZero + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +universe u v + +variable {K : Type u} [Field K] + +/-- The explicit Laurent parameter has Laurent-series value `exp (-1)`. -/ +theorem equalCharacteristicLaurentUniformizer_laurentValuation + (F : LocalField.{u, v} K) : + (Valued.v : Valuation F.residueField⸨X⸩ ℤᵐ⁰) + (equalCharacteristicLaurentUniformizer F) = + WithZero.exp (-1 : ℤ) := by + change (Valued.v : Valuation F.residueField⸨X⸩ ℤᵐ⁰) + (((PowerSeries.X : F.residueField⟦X⟧) : + F.residueField⸨X⸩)) = _ + simpa using LaurentSeries.valuation_X_pow F.residueField 1 + +/-- The Laurent parameter in the canonical integer ring determined by the +native Laurent valuation. -/ +noncomputable def equalCharacteristicLaurentUniformizerInteger + (F : LocalField.{u, v} K) : + letI := equalCharacteristicLaurentValuativeRel F + (ValuativeRel.valuation F.residueField⸨X⸩).integer := by + letI : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + exact powerSeriesEquivLaurentValuativeInteger F.residueField + (PowerSeries.X : F.residueField⟦X⟧) + +/-- States the theorem `equalCharacteristicLaurentUniformizerInteger_coe`. -/ +@[simp] +theorem equalCharacteristicLaurentUniformizerInteger_coe + (F : LocalField.{u, v} K) : + letI := equalCharacteristicLaurentValuativeRel F + (equalCharacteristicLaurentUniformizerInteger F).1 = + equalCharacteristicLaurentUniformizer F := by + let : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + rfl + +/-- The explicit Laurent parameter is a prime element of the canonical +integer ring. -/ +theorem equalCharacteristicLaurentUniformizerInteger_irreducible + (F : LocalField.{u, v} K) : + letI := equalCharacteristicLaurentValuativeRel F + Irreducible (equalCharacteristicLaurentUniformizerInteger F) := by + let : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + change Irreducible + (powerSeriesEquivLaurentValuativeInteger F.residueField + (PowerSeries.X : F.residueField⟦X⟧)) + exact PowerSeries.X_irreducible.map + (powerSeriesEquivLaurentValuativeInteger F.residueField) + +/-- The Laurent parameter as a nonzero field unit. -/ +noncomputable def equalCharacteristicLaurentUniformizerUnit + (F : LocalField.{u, v} K) : F.residueField⸨X⸩ˣ := + Units.mk0 (equalCharacteristicLaurentUniformizer F) (by + intro hzero + have hval := equalCharacteristicLaurentUniformizer_laurentValuation F + rw [hzero, map_zero] at hval + exact WithZero.exp_ne_zero hval.symm) + +/-- States the theorem `equalCharacteristicLaurentUniformizerUnit_coe`. -/ +@[simp] +theorem equalCharacteristicLaurentUniformizerUnit_coe + (F : LocalField.{u, v} K) : + (equalCharacteristicLaurentUniformizerUnit F).1 = + equalCharacteristicLaurentUniformizer F := + rfl + +/-- In the normalized additive convention used here, the inverse Laurent +parameter has value one. -/ +theorem equalCharacteristicLaurentUniformizerUnit_inv_valuationMap + (F : LocalField.{u, v} K) : + letI := equalCharacteristicLaurentValuativeRel F + letI := equalCharacteristicLaurentIsNonarchimedeanLocalField F + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap F.residueField⸨X⸩ + (Additive.ofMul (equalCharacteristicLaurentUniformizerUnit F)⁻¹) = 1 := by + let L := F.residueField⸨X⸩ + let : ValuativeRel L := equalCharacteristicLaurentValuativeRel F + let : IsNonarchimedeanLocalField L := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + rw [LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_apply] + exact LocalFieldTheory.v_integerRingIrreducibleFieldUnit_inv L + (equalCharacteristicLaurentUniformizerInteger F) + (equalCharacteristicLaurentUniformizerInteger_irreducible F) + (equalCharacteristicLaurentUniformizerUnit F) (by + change equalCharacteristicLaurentUniformizer F = + equalCharacteristicLaurentUniformizer F + rfl) + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel.lean new file mode 100644 index 0000000000..dd3f31bbff --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel.lean @@ -0,0 +1,25 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FreeRankOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelFieldTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.UnitQuotientGalois + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/All.lean new file mode 100644 index 0000000000..b1e5366669 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/All.lean @@ -0,0 +1,28 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FreeRankOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelFieldTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.UnitQuotientGalois +/-! +# Finite Lubin--Tate levels in equal characteristic + +Public aggregate for division torsion, finite level fields, and their Galois +and norm structure. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/AmbientDivisionTorsion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/AmbientDivisionTorsion.lean new file mode 100644 index 0000000000..c7a05ffa3c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/AmbientDivisionTorsion.lean @@ -0,0 +1,214 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.AmbientBracketAction +/-! +# Ambient Lubin--Tate division groups + +The kernel of the `n`-fold distinguished endomorphism in any ambient field is +stable under all truncated brackets. Units of `κ⟦T⟧` therefore act on it by +actual additive automorphisms. This is the version needed in the separable +closure, where the nonzero division points live. +-/ + +@[expose] public section + +noncomputable +section + +open scoped PowerSeries LaurentSeries + +universe u v w + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The level-`n` division group inside an ambient field. -/ +noncomputable def equalCharacteristicLubinTateAmbientTorsionAddSubgroup + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (t : A) (n : ℕ) : AddSubgroup A := + (equalCharacteristicLubinTateAmbientPiIterate F t n).ker + +/-- States the theorem `mem_equalCharacteristicLubinTateAmbientTorsionAddSubgroup`. -/ +@[simp] +theorem mem_equalCharacteristicLubinTateAmbientTorsionAddSubgroup + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (t : A) (n : ℕ) (x : A) : + x ∈ equalCharacteristicLubinTateAmbientTorsionAddSubgroup F t n ↔ + IsEqualCharacteristicLubinTateAmbientTorsion F t n x := + Iff.rfl + +/-- Every iterate of `e` commutes with every ambient bracket. -/ +theorem equalCharacteristicLubinTateAmbientPiIterate_bracket + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (i n : ℕ) (a : F.residueField⟦X⟧) (x : A) : + equalCharacteristicLubinTateAmbientPiIterate F t i + (equalCharacteristicLubinTateAmbientBracket F ι t n a x) = + equalCharacteristicLubinTateAmbientBracket F ι t n a + (equalCharacteristicLubinTateAmbientPiIterate F t i x) := by + induction i generalizing x with + | zero => + simp [equalCharacteristicLubinTateAmbientPiIterate_zero] + | succ i ih => + rw [equalCharacteristicLubinTateAmbientPiIterate_succ, + equalCharacteristicLubinTateAmbientPiEnd_bracket, ih, + equalCharacteristicLubinTateAmbientPiIterate_succ] + +/-- Every bracket preserves the ambient division group. -/ +theorem equalCharacteristicLubinTateAmbientBracket_torsion + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (n : ℕ) (a : F.residueField⟦X⟧) (x : A) + (hx : IsEqualCharacteristicLubinTateAmbientTorsion F t n x) : + IsEqualCharacteristicLubinTateAmbientTorsion F t n + (equalCharacteristicLubinTateAmbientBracket F ι t n a x) := by + rw [IsEqualCharacteristicLubinTateAmbientTorsion, + equalCharacteristicLubinTateAmbientPiIterate_bracket, + hx, map_zero] + +/-- The endomorphism of the ambient level-`n` division group induced by a +bracket. -/ +noncomputable def equalCharacteristicLubinTateAmbientTorsionEnd + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (n : ℕ) (a : F.residueField⟦X⟧) : + AddMonoid.End + (equalCharacteristicLubinTateAmbientTorsionAddSubgroup F t n) where + toFun x := + ⟨equalCharacteristicLubinTateAmbientBracket F ι t n a x.1, + equalCharacteristicLubinTateAmbientBracket_torsion + F ι t n a x.1 x.2⟩ + map_zero' := by + apply Subtype.ext + exact (equalCharacteristicLubinTateAmbientBracket F ι t n a).map_zero + map_add' x y := by + apply Subtype.ext + exact (equalCharacteristicLubinTateAmbientBracket F ι t n a).map_add + x.1 y.1 + +/-- States the theorem `equalCharacteristicLubinTateAmbientTorsionEnd_apply`. -/ +@[simp] +theorem equalCharacteristicLubinTateAmbientTorsionEnd_apply + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (n : ℕ) (a : F.residueField⟦X⟧) + (x : equalCharacteristicLubinTateAmbientTorsionAddSubgroup F t n) : + (equalCharacteristicLubinTateAmbientTorsionEnd F ι t n a x).1 = + equalCharacteristicLubinTateAmbientBracket F ι t n a x.1 := + rfl + +/-- The bracket of `1` fixes all ambient division points, also at level +zero. -/ +theorem equalCharacteristicLubinTateAmbientBracket_one_apply_of_torsion + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (n : ℕ) (x : A) + (hx : IsEqualCharacteristicLubinTateAmbientTorsion F t n x) : + equalCharacteristicLubinTateAmbientBracket F ι t n 1 x = x := by + cases n with + | zero => + have hx0 : x = 0 := by + simpa [IsEqualCharacteristicLubinTateAmbientTorsion, + equalCharacteristicLubinTateAmbientPiIterate_zero] using hx + subst x + exact (equalCharacteristicLubinTateAmbientBracket F ι t 0 1).map_zero + | succ n => + have h := congrArg (fun f : AddMonoid.End A ↦ f x) + (equalCharacteristicLubinTateAmbientBracket_C F ι t n 1) + simpa [equalCharacteristicLubinTateAmbientCoefficientEnd_apply] using h + +/-- A unit power series acts by an automorphism of every ambient division +group. -/ +noncomputable def equalCharacteristicLubinTateAmbientTorsionUnitAut + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + AddEquiv + (equalCharacteristicLubinTateAmbientTorsionAddSubgroup F t n) + (equalCharacteristicLubinTateAmbientTorsionAddSubgroup F t n) where + toFun := equalCharacteristicLubinTateAmbientTorsionEnd F ι t n + (a : F.residueField⟦X⟧) + invFun := equalCharacteristicLubinTateAmbientTorsionEnd F ι t n + (↑(a⁻¹) : F.residueField⟦X⟧) + left_inv x := by + apply Subtype.ext + change equalCharacteristicLubinTateAmbientBracket F ι t n + (↑(a⁻¹) : F.residueField⟦X⟧) + (equalCharacteristicLubinTateAmbientBracket F ι t n + (a : F.residueField⟦X⟧) x.1) = x.1 + rw [← equalCharacteristicLubinTateAmbientBracket_mul_apply_of_torsion + F ι t n (↑(a⁻¹) : F.residueField⟦X⟧) + (a : F.residueField⟦X⟧) x.1 x.2] + simpa using + equalCharacteristicLubinTateAmbientBracket_one_apply_of_torsion + F ι t n x.1 x.2 + right_inv x := by + apply Subtype.ext + change equalCharacteristicLubinTateAmbientBracket F ι t n + (a : F.residueField⟦X⟧) + (equalCharacteristicLubinTateAmbientBracket F ι t n + (↑(a⁻¹) : F.residueField⟦X⟧) x.1) = x.1 + rw [← equalCharacteristicLubinTateAmbientBracket_mul_apply_of_torsion + F ι t n (a : F.residueField⟦X⟧) + (↑(a⁻¹) : F.residueField⟦X⟧) x.1 x.2] + simpa using + equalCharacteristicLubinTateAmbientBracket_one_apply_of_torsion + F ι t n x.1 x.2 + map_add' x y := + (equalCharacteristicLubinTateAmbientTorsionEnd F ι t n + (a : F.residueField⟦X⟧)).map_add x y + +/-- States the theorem `equalCharacteristicLubinTateAmbientTorsionUnitAut_apply`. -/ +@[simp] +theorem equalCharacteristicLubinTateAmbientTorsionUnitAut_apply + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (n : ℕ) (a : F.residueField⟦X⟧ˣ) + (x : equalCharacteristicLubinTateAmbientTorsionAddSubgroup F t n) : + (equalCharacteristicLubinTateAmbientTorsionUnitAut F ι t n a x).1 = + equalCharacteristicLubinTateAmbientBracket F ι t n + (a : F.residueField⟦X⟧) x.1 := + rfl + +/-- Equality of the first `n` coefficients makes two ambient brackets +equal. -/ +theorem equalCharacteristicLubinTateAmbientBracket_eq_of_coeff_eq + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (n : ℕ) (a b : F.residueField⟦X⟧) + (hab : ∀ i < n, PowerSeries.coeff i a = PowerSeries.coeff i b) : + equalCharacteristicLubinTateAmbientBracket F ι t n a = + equalCharacteristicLubinTateAmbientBracket F ι t n b := by + apply AddMonoidHom.ext + intro x + change + equalCharacteristicLubinTateAmbientBracket F ι t n a x = + equalCharacteristicLubinTateAmbientBracket F ι t n b x + rw [equalCharacteristicLubinTateAmbientBracket_apply, + equalCharacteristicLubinTateAmbientBracket_apply] + apply Finset.sum_congr rfl + intro i hi + rw [hab i (Finset.mem_range.mp hi)] + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/DivisionPolynomial.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/DivisionPolynomial.lean new file mode 100644 index 0000000000..d50d4b288b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/DivisionPolynomial.lean @@ -0,0 +1,356 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion +public import Mathlib.FieldTheory.IsSepClosed +/-! +# The uniformizer norm identity: equal-characteristic Lubin--Tate division polynomials + +Let `P(Y)=Y^q+TY`. Its `n`-fold compositional iterate has degree `q^n`. +The polynomial + +`Q_(n+1)(Y) = P^[n](Y)^(q-1) + T` + +cuts out the primitive level-`n+1` division points. Here we construct these +polynomials over `κ((T))`, prove the degree calculation, and choose an actual +primitive root in the separable closure. +-/ + +@[expose] public section + +noncomputable +section + +open scoped PowerSeries LaurentSeries Polynomial + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +private instance equalCharacteristicDivisionBaseCharP + (F : LocalField.{u, v} K) + : + CharP F.residueField⸨X⸩ F.residueCharacteristic := + charP_of_injective_algebraMap + (algebraMap F.residueField F.residueField⸨X⸩).injective + F.residueCharacteristic + +private instance equalCharacteristicDivisionClosureCharP + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] : + CharP (SeparableClosure F.residueField⸨X⸩) + F.residueCharacteristic := + charP_of_injective_algebraMap + (algebraMap F.residueField⸨X⸩ + (SeparableClosure F.residueField⸨X⸩)).injective + F.residueCharacteristic + +/-- The base Lubin--Tate polynomial `Y^q + TY` over `κ((T))`. -/ +noncomputable def equalCharacteristicLubinTatePiPolynomial + (F : LocalField.{u, v} K) : + Polynomial F.residueField⸨X⸩ := + Polynomial.X ^ Nat.card F.residueField + + Polynomial.C (equalCharacteristicLaurentUniformizer F) * Polynomial.X + +/-- The Laurent-series parameter `T` is nonzero. -/ +theorem equalCharacteristicLaurentUniformizer_ne_zero + (F : LocalField.{u, v} K) : + equalCharacteristicLaurentUniformizer F ≠ 0 := by + rw [equalCharacteristicLaurentUniformizer] + change HahnSeries.ofPowerSeries ℤ F.residueField PowerSeries.X ≠ 0 + intro hX + apply (PowerSeries.X_ne_zero (R := F.residueField)) + apply (HahnSeries.ofPowerSeries_injective + (Γ := ℤ) (R := F.residueField)) + simpa only [map_zero] using hX + +/-- The base Lubin--Tate polynomial has degree `q`. -/ +theorem equalCharacteristicLubinTatePiPolynomial_natDegree + (F : LocalField.{u, v} K) : + (equalCharacteristicLubinTatePiPolynomial F).natDegree = + Nat.card F.residueField := by + rw [equalCharacteristicLubinTatePiPolynomial] + calc + (Polynomial.X ^ Nat.card F.residueField + + Polynomial.C (equalCharacteristicLaurentUniformizer F) * + Polynomial.X).natDegree = + (Polynomial.X ^ Nat.card F.residueField).natDegree := + Polynomial.natDegree_add_eq_left_of_natDegree_lt (by + rw [Polynomial.natDegree_X_pow, + Polynomial.natDegree_C_mul_X _ + (equalCharacteristicLaurentUniformizer_ne_zero F)] + exact (Finite.one_lt_card : 1 < Nat.card F.residueField)) + _ = Nat.card F.residueField := Polynomial.natDegree_X_pow _ + +/-- The `n`-fold compositional iterate of the base Lubin--Tate polynomial, +starting from `Y`. -/ +noncomputable def equalCharacteristicLubinTatePiPolynomialIterate + (F : LocalField.{u, v} K) (n : ℕ) : + Polynomial F.residueField⸨X⸩ := + (equalCharacteristicLubinTatePiPolynomial F).comp^[n] Polynomial.X + +/-- The `n`-fold iterate has degree `q^n`. -/ +theorem equalCharacteristicLubinTatePiPolynomialIterate_natDegree + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicLubinTatePiPolynomialIterate F n).natDegree = + Nat.card F.residueField ^ n := by + rw [equalCharacteristicLubinTatePiPolynomialIterate, + Polynomial.natDegree_iterate_comp, + equalCharacteristicLubinTatePiPolynomial_natDegree, + Polynomial.natDegree_X, mul_one] + +/-- The polynomial whose roots are exactly the primitive level-`n+1` +division points. -/ +noncomputable def equalCharacteristicLubinTatePrimitivePolynomial + (F : LocalField.{u, v} K) (n : ℕ) : + Polynomial F.residueField⸨X⸩ := + equalCharacteristicLubinTatePiPolynomialIterate F n ^ + (Nat.card F.residueField - 1) + + Polynomial.C (equalCharacteristicLaurentUniformizer F) + +/-- The primitive level-`n+1` polynomial has the expected positive degree +`(q-1)q^n`. -/ +theorem equalCharacteristicLubinTatePrimitivePolynomial_natDegree + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicLubinTatePrimitivePolynomial F n).natDegree = + (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := by + rw [equalCharacteristicLubinTatePrimitivePolynomial] + have hpos : + 0 < (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := + Nat.mul_pos (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (Nat.pow_pos Nat.card_pos) + rw [Polynomial.natDegree_add_eq_left_of_natDegree_lt] + · rw [Polynomial.natDegree_pow, + equalCharacteristicLubinTatePiPolynomialIterate_natDegree] + · rw [Polynomial.natDegree_pow, + equalCharacteristicLubinTatePiPolynomialIterate_natDegree, + Polynomial.natDegree_C] + exact hpos + +/-- Evaluation of the base polynomial in any ambient field is the ambient +distinguished endomorphism. -/ +theorem equalCharacteristicLubinTatePiPolynomial_eval₂ + (F : LocalField.{u, v} K) + {A : Type*} [Field A] [CharP A F.residueCharacteristic] + (φ : F.residueField⸨X⸩ →+* A) (x : A) : + Polynomial.eval₂ φ x (equalCharacteristicLubinTatePiPolynomial F) = + equalCharacteristicLubinTateAmbientPiEnd F + (φ (equalCharacteristicLaurentUniformizer F)) x := by + simp [equalCharacteristicLubinTatePiPolynomial, + equalCharacteristicLubinTateAmbientPiEnd_apply] + +/-- The additive-endomorphism iterate agrees with ordinary function +iteration. -/ +theorem equalCharacteristicLubinTateAmbientPiIterate_eq_function_iterate + (F : LocalField.{u, v} K) + {A : Type*} [Field A] [CharP A F.residueCharacteristic] + (t : A) (n : ℕ) (x : A) : + equalCharacteristicLubinTateAmbientPiIterate F t n x = + (fun y : A ↦ equalCharacteristicLubinTateAmbientPiEnd F t y)^[n] x := by + induction n generalizing x with + | zero => simp [equalCharacteristicLubinTateAmbientPiIterate_zero] + | succ n ih => + rw [equalCharacteristicLubinTateAmbientPiIterate_succ, + Function.iterate_succ_apply, ih] + +/-- Evaluation of the compositional division polynomial is the actual +ambient iterate of `e`. -/ +theorem equalCharacteristicLubinTatePiPolynomialIterate_eval₂ + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {A : Type*} [Field A] [CharP A F.residueCharacteristic] + (φ : F.residueField⸨X⸩ →+* A) (n : ℕ) (x : A) : + Polynomial.eval₂ φ x + (equalCharacteristicLubinTatePiPolynomialIterate F n) = + equalCharacteristicLubinTateAmbientPiIterate F + (φ (equalCharacteristicLaurentUniformizer F)) n x := by + have hfun : + (fun y : A ↦ Polynomial.eval₂ φ y + (equalCharacteristicLubinTatePiPolynomial F)) = + (fun y : A ↦ equalCharacteristicLubinTateAmbientPiEnd F + (φ (equalCharacteristicLaurentUniformizer F)) y) := by + funext y + exact equalCharacteristicLubinTatePiPolynomial_eval₂ F φ y + calc + Polynomial.eval₂ φ x + (equalCharacteristicLubinTatePiPolynomialIterate F n) = + (fun y : A ↦ Polynomial.eval₂ φ y + (equalCharacteristicLubinTatePiPolynomial F))^[n] x := by + rw [equalCharacteristicLubinTatePiPolynomialIterate, + Polynomial.iterate_comp_eval₂, Polynomial.eval₂_X] + _ = + (fun y : A ↦ equalCharacteristicLubinTateAmbientPiEnd F + (φ (equalCharacteristicLaurentUniformizer F)) y)^[n] x := by + exact congrArg (fun f : A → A ↦ f^[n] x) hfun + _ = equalCharacteristicLubinTateAmbientPiIterate F + (φ (equalCharacteristicLaurentUniformizer F)) n x := + (equalCharacteristicLubinTateAmbientPiIterate_eq_function_iterate + F (φ (equalCharacteristicLaurentUniformizer F)) n x).symm + +/-- The residue-field cardinality is zero in the Laurent-series base field. -/ +theorem residueField_natCard_cast_eq_zero + (F : LocalField.{u, v} K) : + (Nat.card F.residueField : F.residueField⸨X⸩) = 0 := by + let := Fintype.ofFinite F.residueField + rw [Nat.card_eq_fintype_card] + rw [← map_natCast + (algebraMap F.residueField F.residueField⸨X⸩) + (Fintype.card F.residueField), + Nat.cast_card_eq_zero F.residueField, map_zero] + +/-- The derivative of `Y^q+TY` is the nonzero constant `T`. -/ +theorem equalCharacteristicLubinTatePiPolynomial_derivative + (F : LocalField.{u, v} K) : + (equalCharacteristicLubinTatePiPolynomial F).derivative = + Polynomial.C (equalCharacteristicLaurentUniformizer F) := by + simp [equalCharacteristicLubinTatePiPolynomial, + Polynomial.derivative_pow, residueField_natCard_cast_eq_zero F] + +/-- Recursive description of the compositional iterates. -/ +theorem equalCharacteristicLubinTatePiPolynomialIterate_succ + (F : LocalField.{u, v} K) (n : ℕ) : + equalCharacteristicLubinTatePiPolynomialIterate F (n + 1) = + (equalCharacteristicLubinTatePiPolynomial F).comp + (equalCharacteristicLubinTatePiPolynomialIterate F n) := by + rw [equalCharacteristicLubinTatePiPolynomialIterate, + Function.iterate_succ_apply'] + rfl + +/-- The derivative of the `n`-fold division polynomial is the nonzero +constant `T^n`. -/ +theorem equalCharacteristicLubinTatePiPolynomialIterate_derivative + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicLubinTatePiPolynomialIterate F n).derivative = + Polynomial.C (equalCharacteristicLaurentUniformizer F ^ n) := by + induction n with + | zero => + simp [equalCharacteristicLubinTatePiPolynomialIterate] + | succ n ih => + rw [equalCharacteristicLubinTatePiPolynomialIterate_succ, + Polynomial.derivative_comp, ih, + equalCharacteristicLubinTatePiPolynomial_derivative] + simp [pow_succ] + +/-- Every iterated division polynomial is separable. -/ +theorem equalCharacteristicLubinTatePiPolynomialIterate_separable + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicLubinTatePiPolynomialIterate F n).Separable := by + rw [Polynomial.separable_def'] + refine ⟨0, + Polynomial.C ((equalCharacteristicLaurentUniformizer F ^ n)⁻¹), ?_⟩ + rw [equalCharacteristicLubinTatePiPolynomialIterate_derivative] + simp only [zero_mul, zero_add] + rw [← map_mul, + inv_mul_cancel₀ (pow_ne_zero n + (equalCharacteristicLaurentUniformizer_ne_zero F)), map_one] + +/-- The next division polynomial factors as the preceding one times the +primitive factor. -/ +theorem equalCharacteristicLubinTatePiPolynomialIterate_succ_factor + (F : LocalField.{u, v} K) (n : ℕ) : + equalCharacteristicLubinTatePiPolynomialIterate F (n + 1) = + equalCharacteristicLubinTatePiPolynomialIterate F n * + equalCharacteristicLubinTatePrimitivePolynomial F n := by + have hq : Nat.card F.residueField ≠ 0 := + ne_of_gt (Nat.zero_lt_one.trans + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + rw [equalCharacteristicLubinTatePiPolynomialIterate_succ, + equalCharacteristicLubinTatePiPolynomial, + equalCharacteristicLubinTatePrimitivePolynomial] + simp only [Polynomial.add_comp, Polynomial.pow_comp, + Polynomial.X_comp, Polynomial.mul_comp, Polynomial.C_comp] + rw [← pow_sub_one_mul hq] + ring + +/-- The primitive factor is separable because it divides the next separable +division polynomial. -/ +theorem equalCharacteristicLubinTatePrimitivePolynomial_separable + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicLubinTatePrimitivePolynomial F n).Separable := by + apply Polynomial.Separable.of_dvd + (equalCharacteristicLubinTatePiPolynomialIterate_separable F (n + 1)) + exact ⟨equalCharacteristicLubinTatePiPolynomialIterate F n, + by simpa [mul_comm] using + (equalCharacteristicLubinTatePiPolynomialIterate_succ_factor F n)⟩ + +/-- The canonical base embedding into the chosen separable closure. -/ +noncomputable def equalCharacteristicSeparableBaseHom + (F : LocalField.{u, v} K) : + F.residueField⸨X⸩ →+* SeparableClosure F.residueField⸨X⸩ where + toFun x := + ⟨algebraMap F.residueField⸨X⸩ + (AlgebraicClosure F.residueField⸨X⸩) x, + (separableClosure F.residueField⸨X⸩ + (AlgebraicClosure F.residueField⸨X⸩)).algebraMap_mem x⟩ + map_zero' := by + apply Subtype.ext + exact (algebraMap F.residueField⸨X⸩ + (AlgebraicClosure F.residueField⸨X⸩)).map_zero + map_one' := by + apply Subtype.ext + exact (algebraMap F.residueField⸨X⸩ + (AlgebraicClosure F.residueField⸨X⸩)).map_one + map_add' x y := by + apply Subtype.ext + exact (algebraMap F.residueField⸨X⸩ + (AlgebraicClosure F.residueField⸨X⸩)).map_add x y + map_mul' x y := by + apply Subtype.ext + exact (algebraMap F.residueField⸨X⸩ + (AlgebraicClosure F.residueField⸨X⸩)).map_mul x y + +/-- The coefficient embedding of the residue field into the chosen +separable closure of `κ((T))`. -/ +noncomputable def equalCharacteristicSeparableCoefficientHom + (F : LocalField.{u, v} K) : + F.residueField →+* SeparableClosure F.residueField⸨X⸩ := + (equalCharacteristicSeparableBaseHom F).comp + (algebraMap F.residueField F.residueField⸨X⸩) + +/-- The image of `T` in the chosen separable closure. -/ +noncomputable def equalCharacteristicSeparableUniformizer + (F : LocalField.{u, v} K) : + SeparableClosure F.residueField⸨X⸩ := + equalCharacteristicSeparableBaseHom F + (equalCharacteristicLaurentUniformizer F) + +/-- A primitive level-`n+1` division polynomial has a root in the separable +closure. Separability of this polynomial is established below before the +root is used to define the level field. -/ +theorem exists_equalCharacteristicLubinTatePrimitivePolynomial_root + (F : LocalField.{u, v} K) + (n : ℕ) : + ∃ x : SeparableClosure F.residueField⸨X⸩, + ((equalCharacteristicLubinTatePrimitivePolynomial F n).map + (equalCharacteristicSeparableBaseHom F)).IsRoot x := by + let φ := equalCharacteristicSeparableBaseHom F + let Q := equalCharacteristicLubinTatePrimitivePolynomial F n + have hnat : 0 < (Q.map φ).natDegree := by + rw [Polynomial.natDegree_map_eq_of_injective φ.injective, + equalCharacteristicLubinTatePrimitivePolynomial_natDegree] + exact Nat.mul_pos + (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (Nat.pow_pos Nat.card_pos) + have hdeg : (Q.map φ).degree ≠ 0 := by + exact ne_of_gt (Polynomial.natDegree_pos_iff_degree_pos.mp hnat) + have hsep : (Q.map φ).Separable := + (equalCharacteristicLubinTatePrimitivePolynomial_separable F n).map + exact IsSepClosed.exists_root (Q.map φ) hdeg hsep + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FiniteParameters.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FiniteParameters.lean new file mode 100644 index 0000000000..1587882a77 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FiniteParameters.lean @@ -0,0 +1,210 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction +/-! +# The uniformizer norm identity: finite parameters for the Lubin--Tate action + +A unit power series modulo its first `n+1` coefficients is represented by a +nonzero constant coefficient and `n` arbitrary further coefficients. We use +the concrete finite parameter type `κˣ × (Fin n → κ)`, construct its genuine +power-series units, and prove that their bracket images of a primitive point +are pairwise distinct. Its cardinality is `(q - 1) q^n`, exactly the degree +of the primitive polynomial. +-/ + +@[expose] public section + +noncomputable +section + +open scoped PowerSeries LaurentSeries Polynomial + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The visible coefficients of a unit power series through level `n`. -/ +structure equalCharacteristicLubinTateUnitParameter + (F : LocalField.{u, v} K) (n : ℕ) where + /-- The nonzero constant coefficient of the represented unit power series. -/ + constantUnit : F.residueFieldˣ + /-- The coefficients in degrees `1` through `n`, indexed with degree shifted down by one. -/ + higherCoeff : Fin n → F.residueField + +/-- Unit parameters agree when their constant units and higher coefficients agree. -/ +@[ext] +theorem equalCharacteristicLubinTateUnitParameter_ext + (F : LocalField.{u, v} K) (n : ℕ) + {a b : equalCharacteristicLubinTateUnitParameter F n} + (hconstant : a.constantUnit = b.constantUnit) + (hhigher : a.higherCoeff = b.higherCoeff) : + a = b := by + cases a + cases b + cases hconstant + cases hhigher + rfl + +/-- Constructor exposing the mathematical coefficient data without relying +on the implementation of the finite parameter. -/ +def equalCharacteristicLubinTateUnitParameterOfCoefficients + (F : LocalField.{u, v} K) (n : ℕ) + (constantUnit : F.residueFieldˣ) + (higherCoeff : Fin n → F.residueField) : + equalCharacteristicLubinTateUnitParameter F n := + ⟨constantUnit, higherCoeff⟩ + +/-- Comparison with the elementary product of visible coefficients. -/ +def equalCharacteristicLubinTateUnitParameterEquiv + (F : LocalField.{u, v} K) (n : ℕ) : + equalCharacteristicLubinTateUnitParameter F n ≃ + F.residueFieldˣ × (Fin n → F.residueField) where + toFun a := (a.constantUnit, a.higherCoeff) + invFun a := equalCharacteristicLubinTateUnitParameterOfCoefficients + F n a.1 a.2 + left_inv a := by cases a; rfl + right_inv a := rfl + +/-- The finite-level unit parameter space is finite. -/ +instance equalCharacteristicLubinTateUnitParameter_finite + (F : LocalField.{u, v} K) (n : ℕ) : + Finite (equalCharacteristicLubinTateUnitParameter F n) := + Finite.of_equiv (F.residueFieldˣ × (Fin n → F.residueField)) + (equalCharacteristicLubinTateUnitParameterEquiv F n).symm + +/-- The finite polynomial power series represented by a visible unit +parameter. -/ +noncomputable def equalCharacteristicLubinTateUnitParameterSeries + (F : LocalField.{u, v} K) (n : ℕ) + (a : equalCharacteristicLubinTateUnitParameter F n) : + F.residueField⟦X⟧ := + PowerSeries.mk fun i => + if i = 0 then (a.constantUnit : F.residueField) + else if hi : i - 1 < n then a.higherCoeff ⟨i - 1, hi⟩ else 0 + +/-- The parameter series has the stored unit as its constant coefficient. -/ +@[simp] +theorem equalCharacteristicLubinTateUnitParameterSeries_coeff_zero + (F : LocalField.{u, v} K) (n : ℕ) + (a : equalCharacteristicLubinTateUnitParameter F n) : + PowerSeries.coeff 0 + (equalCharacteristicLubinTateUnitParameterSeries F n a) = + a.constantUnit := by + simp [equalCharacteristicLubinTateUnitParameterSeries] + +/-- Positive coefficients of the parameter series recover the stored higher coefficients. -/ +@[simp] +theorem equalCharacteristicLubinTateUnitParameterSeries_coeff_succ + (F : LocalField.{u, v} K) (n : ℕ) + (a : equalCharacteristicLubinTateUnitParameter F n) (i : Fin n) : + PowerSeries.coeff (i + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) = + a.higherCoeff i := by + simp [equalCharacteristicLubinTateUnitParameterSeries, i.isLt] + +/-- A represented series is a unit because its constant coefficient is the +nonzero value of a residue-field unit. -/ +theorem equalCharacteristicLubinTateUnitParameterSeries_isUnit + (F : LocalField.{u, v} K) (n : ℕ) + (a : equalCharacteristicLubinTateUnitParameter F n) : + IsUnit (equalCharacteristicLubinTateUnitParameterSeries F n a) := by + rw [PowerSeries.isUnit_iff_constantCoeff, + ← PowerSeries.coeff_zero_eq_constantCoeff_apply, + equalCharacteristicLubinTateUnitParameterSeries_coeff_zero] + exact a.constantUnit.isUnit + +/-- The actual power-series unit attached to a finite parameter. -/ +noncomputable def equalCharacteristicLubinTateUnitParameterUnit + (F : LocalField.{u, v} K) (n : ℕ) + (a : equalCharacteristicLubinTateUnitParameter F n) : + F.residueField⟦X⟧ˣ := + (equalCharacteristicLubinTateUnitParameterSeries_isUnit F n a).unit + +/-- The unit built from a parameter has the parameter series as its value. -/ +@[simp] +theorem equalCharacteristicLubinTateUnitParameterUnit_val + (F : LocalField.{u, v} K) (n : ℕ) + (a : equalCharacteristicLubinTateUnitParameter F n) : + (equalCharacteristicLubinTateUnitParameterUnit F n a : + F.residueField⟦X⟧) = + equalCharacteristicLubinTateUnitParameterSeries F n a := + (equalCharacteristicLubinTateUnitParameterSeries_isUnit F n a).unit_spec + +/-- Visible coefficient equality determines the finite parameter. -/ +theorem equalCharacteristicLubinTateUnitParameter_eq_of_coeff_eq + (F : LocalField.{u, v} K) (n : ℕ) + (a b : equalCharacteristicLubinTateUnitParameter F n) + (hcoeff : ∀ i ≤ n, + PowerSeries.coeff i + (equalCharacteristicLubinTateUnitParameterSeries F n a) = + PowerSeries.coeff i + (equalCharacteristicLubinTateUnitParameterSeries F n b)) : + a = b := by + apply equalCharacteristicLubinTateUnitParameter_ext F n + · apply Units.ext + simpa using hcoeff 0 (Nat.zero_le n) + · funext i + simpa using hcoeff (i + 1) (Nat.succ_le_iff.mpr i.isLt) + +/-- The primitive-root image attached to a finite unit parameter. -/ +noncomputable def equalCharacteristicLubinTateUnitParameterRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : equalCharacteristicLubinTateUnitParameter F n) : + SeparableClosure F.residueField⸨X⸩ := + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) + +/-- Distinct visible unit parameters give distinct primitive roots. -/ +theorem equalCharacteristicLubinTateUnitParameterRoot_injective + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Function.Injective + (equalCharacteristicLubinTateUnitParameterRoot F n) := by + intro a b hab + apply equalCharacteristicLubinTateUnitParameter_eq_of_coeff_eq F n a b + exact chosenEqualCharacteristicLubinTatePrimitiveRoot_bracket_eq_coeff F n + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (equalCharacteristicLubinTateUnitParameterSeries F n b) hab + +/-- Every parameter root is a root of the primitive polynomial. -/ +theorem equalCharacteristicLubinTateUnitParameterRoot_isRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : equalCharacteristicLubinTateUnitParameter F n) : + ((equalCharacteristicLubinTatePrimitivePolynomial F n).map + (equalCharacteristicSeparableBaseHom F)).IsRoot + (equalCharacteristicLubinTateUnitParameterRoot F n a) := by + simpa [equalCharacteristicLubinTateUnitParameterRoot, + equalCharacteristicLubinTateUnitParameterUnit_val] using + equalCharacteristicLubinTatePrimitivePolynomial_isRoot_bracket F n + (equalCharacteristicLubinTateUnitParameterUnit F n a) + +/-- The finite parameter set has the expected cardinality. -/ +theorem equalCharacteristicLubinTateUnitParameter_natCard + (F : LocalField.{u, v} K) (n : ℕ) : + Nat.card (equalCharacteristicLubinTateUnitParameter F n) = + (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := by + rw [Nat.card_congr + (equalCharacteristicLubinTateUnitParameterEquiv F n), + Nat.card_prod, Nat.card_units, Nat.card_fun, Nat.card_fin] + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FreeRankOne.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FreeRankOne.lean new file mode 100644 index 0000000000..016d9804ce --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FreeRankOne.lean @@ -0,0 +1,631 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters +public import Mathlib.Algebra.Module.RingHom +public import Mathlib.Data.Fintype.EquivFin +public import Mathlib.LinearAlgebra.FreeModule.Basic +/-! +# The primitive-division-module equivalence: equal-characteristic division points are free of + rank one + +For the standard equal-characteristic Lubin--Tate series, the points killed by +the `(n + 1)`-st iterate form a free rank-one module over +`κ⟦T⟧/(T^(n+1))`. The shift is intentional: the existing division-tower +The primitive polynomial is indexed by `n`, while its roots lie at division +level `n + 1`. +-/ + +@[expose] public section + +noncomputable +section + +open scoped PowerSeries LaurentSeries Polynomial + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- All coefficients visible at division level `n + 1`. In contrast with the +unit parameters used for the primitive roots in the uniformizer norm identity, the constant +coefficient is allowed to vanish; this is necessary to parametrize every +division point. -/ +structure equalCharacteristicLubinTateParameter + (F : LocalField.{u, v} K) (n : ℕ) where + /-- The coefficients in degrees `0` through `n` of the represented truncated series. -/ + coeff : Fin (n + 1) → F.residueField + +/-- A Lubin–Tate parameter evaluates to its finite coefficient function. -/ +instance equalCharacteristicLubinTateParameterCoeFun + (F : LocalField.{u, v} K) (n : ℕ) : + CoeFun (equalCharacteristicLubinTateParameter F n) + (fun _ => Fin (n + 1) → F.residueField) := + ⟨equalCharacteristicLubinTateParameter.coeff⟩ + +/-- Construct a finite parameter from its coefficient function. -/ +def equalCharacteristicLubinTateParameterOfFunction + (F : LocalField.{u, v} K) (n : ℕ) + (coeff : Fin (n + 1) → F.residueField) : + equalCharacteristicLubinTateParameter F n := + ⟨coeff⟩ + +/-- Comparison with the raw finite coefficient function. -/ +def equalCharacteristicLubinTateParameterEquiv + (F : LocalField.{u, v} K) (n : ℕ) : + equalCharacteristicLubinTateParameter F n ≃ + (Fin (n + 1) → F.residueField) where + toFun := equalCharacteristicLubinTateParameter.coeff + invFun := equalCharacteristicLubinTateParameterOfFunction F n + left_inv a := by cases a; rfl + right_inv _ := rfl + +/-- Lubin–Tate parameters are equal when all their coefficients agree. -/ +@[ext] +theorem equalCharacteristicLubinTateParameter_ext + (F : LocalField.{u, v} K) (n : ℕ) + {a b : equalCharacteristicLubinTateParameter F n} + (hcoeff : a.coeff = b.coeff) : + a = b := by + cases a + cases b + cases hcoeff + rfl + +/-- The finite coefficient parameter space is finite. -/ +instance equalCharacteristicLubinTateParameter_finite + (F : LocalField.{u, v} K) (n : ℕ) : + Finite (equalCharacteristicLubinTateParameter F n) := + Finite.of_equiv (Fin (n + 1) → F.residueField) + (equalCharacteristicLubinTateParameterEquiv F n).symm + +/-- The canonical polynomial representative of a finite parameter. -/ +noncomputable def equalCharacteristicLubinTateParameterSeries + (F : LocalField.{u, v} K) (n : ℕ) + (a : equalCharacteristicLubinTateParameter F n) : + F.residueField⟦X⟧ := + PowerSeries.mk fun i => + if hi : i < n + 1 then a ⟨i, hi⟩ else 0 + +/-- The parameter power series recovers each stored finite coefficient. -/ +@[simp] +theorem equalCharacteristicLubinTateParameterSeries_coeff + (F : LocalField.{u, v} K) (n : ℕ) + (a : equalCharacteristicLubinTateParameter F n) + (i : Fin (n + 1)) : + PowerSeries.coeff i + (equalCharacteristicLubinTateParameterSeries F n a) = a i := by + have hi : ¬ n < (i : ℕ) := + Nat.not_lt_of_ge (Nat.le_of_lt_succ i.isLt) + simp [equalCharacteristicLubinTateParameterSeries, hi] + +/-- Evaluation of a finite parameter at the chosen primitive division-level +`n + 1` point. -/ +noncomputable def equalCharacteristicLubinTateParameterRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : equalCharacteristicLubinTateParameter F n) : + equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1) := + ⟨equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (equalCharacteristicLubinTateParameterSeries F n a) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n), + equalCharacteristicLubinTateAmbientBracket_torsion F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (equalCharacteristicLubinTateParameterSeries F n a) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) + (chosenEqualCharacteristicLubinTatePrimitiveRoot_torsion F n)⟩ + +/-- The primitive point detects every coefficient modulo `T^(n+1)`. -/ +theorem equalCharacteristicLubinTateParameterRoot_injective + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Function.Injective (equalCharacteristicLubinTateParameterRoot F n) := by + intro a b hab + apply equalCharacteristicLubinTateParameter_ext F n + funext i + have hvalue : + (equalCharacteristicLubinTateParameterRoot F n a).1 = + (equalCharacteristicLubinTateParameterRoot F n b).1 := + congrArg Subtype.val hab + have hcoeff := + chosenEqualCharacteristicLubinTatePrimitiveRoot_bracket_eq_coeff F n + (equalCharacteristicLubinTateParameterSeries F n a) + (equalCharacteristicLubinTateParameterSeries F n b) hvalue + i (Nat.le_of_lt_succ i.isLt) + simpa using hcoeff + +/-- The full finite parameter type has `q^(n+1)` elements. -/ +theorem equalCharacteristicLubinTateParameter_natCard + (F : LocalField.{u, v} K) (n : ℕ) : + Nat.card (equalCharacteristicLubinTateParameter F n) = + Nat.card F.residueField ^ (n + 1) := by + rw [Nat.card_congr (equalCharacteristicLubinTateParameterEquiv F n), + Nat.card_fun, Nat.card_fin] + +/-- Level `n + 1` torsion is exactly the root set of the corresponding +division polynomial. -/ +noncomputable def equalCharacteristicLubinTateTorsionEquivRootSet + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1) ≃ + (equalCharacteristicLubinTatePiPolynomialIterate F (n + 1)).rootSet + (SeparableClosure F.residueField⸨X⸩) where + toFun x := ⟨x.1, by + have hP : equalCharacteristicLubinTatePiPolynomialIterate F (n + 1) ≠ 0 := by + apply Polynomial.ne_zero_of_natDegree_gt + · rw [equalCharacteristicLubinTatePiPolynomialIterate_natDegree] + exact Nat.pow_pos Nat.card_pos + rw [Polynomial.mem_rootSet_of_ne hP, Polynomial.aeval_def, + ← equalCharacteristicSeparableBaseHom_eq_algebraMap, + equalCharacteristicLubinTatePiPolynomialIterate_eval₂] + exact x.2⟩ + invFun x := ⟨x.1, by + have hP : equalCharacteristicLubinTatePiPolynomialIterate F (n + 1) ≠ 0 := by + apply Polynomial.ne_zero_of_natDegree_gt + · rw [equalCharacteristicLubinTatePiPolynomialIterate_natDegree] + exact Nat.pow_pos Nat.card_pos + have hx := (Polynomial.mem_rootSet_of_ne hP).mp x.2 + rw [Polynomial.aeval_def, + ← equalCharacteristicSeparableBaseHom_eq_algebraMap, + equalCharacteristicLubinTatePiPolynomialIterate_eval₂] at hx + exact hx⟩ + left_inv x := rfl + right_inv x := rfl + +/-- The ambient Lubin–Tate torsion module at finite level is finite. -/ +noncomputable instance equalCharacteristicLubinTateAmbientTorsion_finite + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Finite + (equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1)) := + Finite.of_injective + (equalCharacteristicLubinTateTorsionEquivRootSet F n) + (equalCharacteristicLubinTateTorsionEquivRootSet F n).injective + +/-- The level `n + 1` division group has `q^(n+1)` elements. -/ +theorem equalCharacteristicLubinTateAmbientTorsion_natCard + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Nat.card + (equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1)) = + Nat.card F.residueField ^ (n + 1) := by + rw [Nat.card_congr + (equalCharacteristicLubinTateTorsionEquivRootSet F n), + Nat.card_eq_fintype_card, + Polynomial.card_rootSet_eq_natDegree + (equalCharacteristicLubinTatePiPolynomialIterate_separable F (n + 1)) + (IsSepClosed.splits_codomain + (equalCharacteristicLubinTatePiPolynomialIterate F (n + 1)) + (equalCharacteristicLubinTatePiPolynomialIterate_separable F (n + 1))), + equalCharacteristicLubinTatePiPolynomialIterate_natDegree] + +/-- Every division-level `n + 1` division point is obtained uniquely by applying +one truncated coefficient series to the chosen primitive point. -/ +theorem equalCharacteristicLubinTateParameterRoot_bijective + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Function.Bijective (equalCharacteristicLubinTateParameterRoot F n) := by + let := Fintype.ofFinite (equalCharacteristicLubinTateParameter F n) + let := Fintype.ofFinite + (equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1)) + apply (Fintype.bijective_iff_injective_and_card + (equalCharacteristicLubinTateParameterRoot F n)).mpr + refine ⟨equalCharacteristicLubinTateParameterRoot_injective F n, ?_⟩ + calc + Fintype.card (equalCharacteristicLubinTateParameter F n) = + Nat.card (equalCharacteristicLubinTateParameter F n) := by + rw [Nat.card_eq_fintype_card] + _ = Nat.card F.residueField ^ (n + 1) := + equalCharacteristicLubinTateParameter_natCard F n + _ = Nat.card + (equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1)) := + (equalCharacteristicLubinTateAmbientTorsion_natCard F n).symm + _ = Fintype.card + (equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1)) := by + rw [Nat.card_eq_fintype_card] + +/-- The coefficient ring at division level `n + 1`. -/ +def equalCharacteristicLubinTateTruncatedRing + (F : LocalField.{u, v} K) (n : ℕ) := + F.residueField⟦X⟧ ⧸ + Ideal.span ({PowerSeries.X ^ (n + 1)} : Set F.residueField⟦X⟧) + +/-- The commutative ring structure on the named truncated coefficient +ring. -/ +instance equalCharacteristicLubinTateTruncatedRingCommRing + (F : LocalField.{u, v} K) (n : ℕ) : + CommRing (equalCharacteristicLubinTateTruncatedRing F n) := by + change CommRing + (F.residueField⟦X⟧ ⧸ + Ideal.span ({PowerSeries.X ^ (n + 1)} : Set F.residueField⟦X⟧)) + infer_instance + +/-- Comparison with the quotient-ring presentation used by the ring +library. -/ +def equalCharacteristicLubinTateTruncatedRingEquiv + (F : LocalField.{u, v} K) (n : ℕ) : + equalCharacteristicLubinTateTruncatedRing F n ≃+* + (F.residueField⟦X⟧ ⧸ + Ideal.span ({PowerSeries.X ^ (n + 1)} : Set F.residueField⟦X⟧)) := + RingEquiv.refl _ + +/-- The canonical projection to the named truncated coefficient ring. -/ +def equalCharacteristicLubinTateTruncatedRingMk + (F : LocalField.{u, v} K) (n : ℕ) : + F.residueField⟦X⟧ →+* equalCharacteristicLubinTateTruncatedRing F n := + Ideal.Quotient.mk + (Ideal.span ({PowerSeries.X ^ (n + 1)} : Set F.residueField⟦X⟧)) + +/-- Two truncated classes agree exactly when their difference is divisible by `X ^ (n + 1)`. -/ +@[simp] +theorem equalCharacteristicLubinTateTruncatedRingMk_eq_iff + (F : LocalField.{u, v} K) (n : ℕ) (a b : F.residueField⟦X⟧) : + equalCharacteristicLubinTateTruncatedRingMk F n a = + equalCharacteristicLubinTateTruncatedRingMk F n b ↔ + a - b ∈ + Ideal.span ({PowerSeries.X ^ (n + 1)} : Set F.residueField⟦X⟧) := by + change + Ideal.Quotient.mk + (Ideal.span ({PowerSeries.X ^ (n + 1)} : Set F.residueField⟦X⟧)) a = + Ideal.Quotient.mk + (Ideal.span ({PowerSeries.X ^ (n + 1)} : Set F.residueField⟦X⟧)) b ↔ _ + exact Ideal.Quotient.mk_eq_mk_iff_sub_mem + (I := Ideal.span + ({PowerSeries.X ^ (n + 1)} : Set F.residueField⟦X⟧)) a b + +/-- Every named truncated coefficient has a power-series representative. -/ +theorem equalCharacteristicLubinTateTruncatedRingMk_surjective + (F : LocalField.{u, v} K) (n : ℕ) : + Function.Surjective (equalCharacteristicLubinTateTruncatedRingMk F n) := by + change Function.Surjective + (Ideal.Quotient.mk + (Ideal.span ({PowerSeries.X ^ (n + 1)} : Set F.residueField⟦X⟧))) + exact Ideal.Quotient.mk_surjective + +/-- Eliminate two truncated coefficients simultaneously through canonical +representatives. -/ +theorem equalCharacteristicLubinTateTruncatedRing_inductionOn₂ + (F : LocalField.{u, v} K) (n : ℕ) + {motive : equalCharacteristicLubinTateTruncatedRing F n → + equalCharacteristicLubinTateTruncatedRing F n → Prop} + (q r : equalCharacteristicLubinTateTruncatedRing F n) + (mk : ∀ a b : F.residueField⟦X⟧, + motive (equalCharacteristicLubinTateTruncatedRingMk F n a) + (equalCharacteristicLubinTateTruncatedRingMk F n b)) : + motive q r := by + exact Quotient.inductionOn₂' q r mk + +/-- Descend a ring homomorphism through the named truncated coefficient +ring. -/ +def equalCharacteristicLubinTateTruncatedRingLift + {S : Type*} [Semiring S] + (F : LocalField.{u, v} K) (n : ℕ) + (f : F.residueField⟦X⟧ →+* S) + (hf : ∀ a ∈ + Ideal.span ({PowerSeries.X ^ (n + 1)} : Set F.residueField⟦X⟧), + f a = 0) : + equalCharacteristicLubinTateTruncatedRing F n →+* S := + (Ideal.Quotient.lift + (Ideal.span ({PowerSeries.X ^ (n + 1)} : Set F.residueField⟦X⟧)) + f hf).comp + (equalCharacteristicLubinTateTruncatedRingEquiv F n).toRingHom + +/-- A descended homomorphism evaluates a truncated representative by the original map. -/ +@[simp] +theorem equalCharacteristicLubinTateTruncatedRingLift_mk + {S : Type*} [Semiring S] + (F : LocalField.{u, v} K) (n : ℕ) + (f : F.residueField⟦X⟧ →+* S) + (hf : ∀ a ∈ + Ideal.span ({PowerSeries.X ^ (n + 1)} : Set F.residueField⟦X⟧), + f a = 0) (a : F.residueField⟦X⟧) : + equalCharacteristicLubinTateTruncatedRingLift F n f hf + (equalCharacteristicLubinTateTruncatedRingMk F n a) = f a := + rfl + +/-- The canonical scalar multiplication of the truncated coefficient ring on +itself, named to prevent typeclass search from unfolding the quotient. -/ +noncomputable local instance equalCharacteristicLubinTateTruncatedSelfSMul + (F : LocalField.{u, v} K) (n : ℕ) : + SMul (equalCharacteristicLubinTateTruncatedRing F n) + (equalCharacteristicLubinTateTruncatedRing F n) where + smul := (· * ·) + +/-- The truncated Lubin–Tate coefficient ring acts on itself by multiplication. -/ +noncomputable local instance equalCharacteristicLubinTateTruncatedSelfModule + (F : LocalField.{u, v} K) (n : ℕ) : + Module (equalCharacteristicLubinTateTruncatedRing F n) + (equalCharacteristicLubinTateTruncatedRing F n) := + Semiring.toModule + +/-- Genuine Lubin--Tate brackets give a ring action of the full power-series +ring on level `n + 1` torsion. -/ +noncomputable def equalCharacteristicLubinTateTorsionEndRingHom + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + F.residueField⟦X⟧ →+* + AddMonoid.End + (equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1)) where + toFun a := equalCharacteristicLubinTateAmbientTorsionEnd F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) a + map_zero' := by + apply AddMonoidHom.ext + intro x + apply Subtype.ext + exact congrArg (fun f : AddMonoid.End + (SeparableClosure F.residueField⸨X⸩) => + f x.1) (equalCharacteristicLubinTateAmbientBracket_zero F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1)) + map_one' := by + apply AddMonoidHom.ext + intro x + apply Subtype.ext + exact equalCharacteristicLubinTateAmbientBracket_one_apply_of_torsion F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) x.1 x.2 + map_add' a b := by + apply AddMonoidHom.ext + intro x + apply Subtype.ext + exact congrArg (fun f : AddMonoid.End + (SeparableClosure F.residueField⸨X⸩) => f x.1) + (equalCharacteristicLubinTateAmbientBracket_add F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) a b) + map_mul' a b := by + apply AddMonoidHom.ext + intro x + apply Subtype.ext + exact equalCharacteristicLubinTateAmbientBracket_mul_apply_of_torsion F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) a b x.1 x.2 + +/-- `T^(n+1)` acts trivially on division-level `n + 1` division points. -/ +theorem equalCharacteristicLubinTateTruncationIdeal_le_ker + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Ideal.span ({PowerSeries.X ^ (n + 1)} : Set F.residueField⟦X⟧) ≤ + RingHom.ker (equalCharacteristicLubinTateTorsionEndRingHom F n) := by + rw [Ideal.span_le] + intro a ha + rw [Set.mem_singleton_iff.mp ha] + change equalCharacteristicLubinTateTorsionEndRingHom F n + (PowerSeries.X ^ (n + 1)) = 0 + apply AddMonoidHom.ext + intro x + apply Subtype.ext + change equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (PowerSeries.X ^ (n + 1)) x.1 = 0 + rw [equalCharacteristicLubinTateAmbientBracket_apply] + apply Finset.sum_eq_zero + intro i hi + rw [PowerSeries.coeff_X_pow, + ite_eq_right (ne_of_lt (Finset.mem_range.mp hi)), map_zero, zero_mul] + +/-- The resulting action of the actual quotient +`κ⟦T⟧/(T^(n+1))`. -/ +noncomputable def equalCharacteristicLubinTateTruncatedScalarHom + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicLubinTateTruncatedRing F n →+* + AddMonoid.End + (equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1)) := + equalCharacteristicLubinTateTruncatedRingLift F n + (equalCharacteristicLubinTateTorsionEndRingHom F n) + fun _ ha => RingHom.mem_ker.mp + (equalCharacteristicLubinTateTruncationIdeal_le_ker F n ha) + +/-- The quotient-ring scalar action underlying the truncated torsion module. -/ +noncomputable instance equalCharacteristicLubinTateTruncatedSMul + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + SMul (equalCharacteristicLubinTateTruncatedRing F n) + (equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1)) := + SMul.comp + (equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1)) + (equalCharacteristicLubinTateTruncatedScalarHom F n) + +/-- The canonical `κ⟦T⟧/(T^(n+1))`-module structure on division-level `n + 1` +division points. -/ +noncomputable instance equalCharacteristicLubinTateTruncatedModule + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Module (equalCharacteristicLubinTateTruncatedRing F n) + (equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1)) := + Module.compHom _ (equalCharacteristicLubinTateTruncatedScalarHom F n) + +/-- The chosen primitive root, regarded as a division-level `n + 1` division +point. -/ +noncomputable def equalCharacteristicLubinTatePrimitiveTorsionPoint + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1) := + ⟨chosenEqualCharacteristicLubinTatePrimitiveRoot F n, + chosenEqualCharacteristicLubinTatePrimitiveRoot_torsion F n⟩ + +/-- Evaluation at the primitive point is linear for the quotient-ring +action. -/ +noncomputable def equalCharacteristicLubinTatePrimitiveEvaluation + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicLubinTateTruncatedRing F n →ₗ[ + equalCharacteristicLubinTateTruncatedRing F n] + equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1) := + LinearMap.toSpanSingleton + (equalCharacteristicLubinTateTruncatedRing F n) + (equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1)) + (equalCharacteristicLubinTatePrimitiveTorsionPoint F n) + +/-- Primitive evaluation of a truncated class is bracket evaluation of its representative. -/ +@[simp] +theorem equalCharacteristicLubinTatePrimitiveEvaluation_mk + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧) : + equalCharacteristicLubinTatePrimitiveEvaluation F n + (equalCharacteristicLubinTateTruncatedRingMk F n a) = + equalCharacteristicLubinTateAmbientTorsionEnd F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) a + (equalCharacteristicLubinTatePrimitiveTorsionPoint F n) := by + rfl + +/-- Evaluation at the primitive torsion point is injective on truncated coefficients. -/ +theorem equalCharacteristicLubinTatePrimitiveEvaluation_injective + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Function.Injective + (equalCharacteristicLubinTatePrimitiveEvaluation F n) := by + intro q r hqr + revert hqr + refine equalCharacteristicLubinTateTruncatedRing_inductionOn₂ F n + (motive := fun q r => + equalCharacteristicLubinTatePrimitiveEvaluation F n q = + equalCharacteristicLubinTatePrimitiveEvaluation F n r → q = r) + q r ?_ + intro a b hab + change equalCharacteristicLubinTatePrimitiveEvaluation F n + (equalCharacteristicLubinTateTruncatedRingMk F n a) = + equalCharacteristicLubinTatePrimitiveEvaluation F n + (equalCharacteristicLubinTateTruncatedRingMk F n b) at hab + rw [equalCharacteristicLubinTatePrimitiveEvaluation_mk, + equalCharacteristicLubinTatePrimitiveEvaluation_mk] at hab + apply (equalCharacteristicLubinTateTruncatedRingMk_eq_iff F n a b).2 + rw [Ideal.mem_span_singleton] + apply PowerSeries.X_pow_dvd_iff.mpr + intro i hi + have hvalue : + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) a + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) = + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) b + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) := by + exact congrArg Subtype.val hab + have hcoeff := + chosenEqualCharacteristicLubinTatePrimitiveRoot_bracket_eq_coeff F n a b + hvalue i (Nat.le_of_lt_succ hi) + calc + PowerSeries.coeff i (a - b) = + PowerSeries.coeff i a - PowerSeries.coeff i b := + (PowerSeries.coeff i).map_sub a b + _ = 0 := sub_eq_zero.mpr hcoeff + +/-- Every ambient torsion point is obtained by primitive evaluation. -/ +theorem equalCharacteristicLubinTatePrimitiveEvaluation_surjective + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Function.Surjective + (equalCharacteristicLubinTatePrimitiveEvaluation F n) := by + intro x + obtain ⟨a, ha⟩ := + (equalCharacteristicLubinTateParameterRoot_bijective F n).surjective x + refine ⟨equalCharacteristicLubinTateTruncatedRingMk F n + (equalCharacteristicLubinTateParameterSeries F n a), ?_⟩ + rw [equalCharacteristicLubinTatePrimitiveEvaluation_mk] + calc + equalCharacteristicLubinTateAmbientTorsionEnd F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (equalCharacteristicLubinTateParameterSeries F n a) + (equalCharacteristicLubinTatePrimitiveTorsionPoint F n) = + equalCharacteristicLubinTateParameterRoot F n a := by + rfl + _ = x := ha + +/-- The public the primitive-division-module equivalence equivalence: at positive division level +`n + 1`, +evaluation at a primitive division point identifies `κ⟦T⟧/(T^(n+1))` +with the entire division module. -/ +noncomputable def equalCharacteristicLubinTateFreeRankOneEquiv + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicLubinTateTruncatedRing F n ≃ₗ[ + equalCharacteristicLubinTateTruncatedRing F n] + equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1) := + LinearEquiv.ofBijective + (equalCharacteristicLubinTatePrimitiveEvaluation F n) + ⟨equalCharacteristicLubinTatePrimitiveEvaluation_injective F n, + equalCharacteristicLubinTatePrimitiveEvaluation_surjective F n⟩ + +/-- The free rank-one equivalence sends one to the primitive torsion point. -/ +@[simp] +theorem equalCharacteristicLubinTateFreeRankOneEquiv_apply_one + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicLubinTateFreeRankOneEquiv F n 1 = + equalCharacteristicLubinTatePrimitiveTorsionPoint F n := by + change (1 : equalCharacteristicLubinTateTruncatedRing F n) • + equalCharacteristicLubinTatePrimitiveTorsionPoint F n = + equalCharacteristicLubinTatePrimitiveTorsionPoint F n + exact one_smul _ _ + +/-- In particular the division module of the primitive-division-module equivalence is genuinely +free. The +displayed linear equivalence above supplies its one-element basis. -/ +noncomputable instance equalCharacteristicLubinTateDivisionModuleFree + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Module.Free (equalCharacteristicLubinTateTruncatedRing F n) + (equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1)) := + Module.Free.of_equiv' + (Module.Free.self (equalCharacteristicLubinTateTruncatedRing F n)) + (equalCharacteristicLubinTateFreeRankOneEquiv F n) + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAbelian.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAbelian.lean new file mode 100644 index 0000000000..24e46e1248 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAbelian.lean @@ -0,0 +1,359 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms +public import Mathlib.FieldTheory.Galois.Abelian +/-! +# The uniformizer norm identity: abelian equal-characteristic Lubin--Tate level fields + +The finite unit parameters constructed previously exhaust the automorphisms +of a level field. To prove commutativity genuinely, we express each truncated +bracket as evaluation of a polynomial over the Laurent-series base. Algebra +maps therefore commute with brackets. Multiplicativity of the genuine +truncated brackets on division points and commutativity of power-series +multiplication then show that any two parameter automorphisms commute on the +power-basis generator, hence everywhere. +-/ + +@[expose] public section + +noncomputable +section + + +open scoped PowerSeries LaurentSeries Polynomial + +universe u v w + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- Since the finite parameter injection and the Galois group have the same +cardinality, every level-field automorphism comes from a parameter. -/ +theorem equalCharacteristicLubinTateUnitParameterToGal_surjective + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Function.Surjective + (equalCharacteristicLubinTateUnitParameterToGal F n) := by + let : FiniteDimensional F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + let : Finite + (Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) := + equalCharacteristicLubinTateLevelField_galFinite F n + have hcard : + Nat.card (Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) ≤ + Nat.card (equalCharacteristicLubinTateUnitParameter F n) := by + rw [equalCharacteristicLubinTateLevelField_natCard_gal, + equalCharacteristicLubinTateLevelField_finrank, + equalCharacteristicLubinTateUnitParameter_natCard] + have hbijective : Function.Bijective + (equalCharacteristicLubinTateUnitParameterToGal F n) := + Function.Injective.bijective_of_nat_card_le + (equalCharacteristicLubinTateUnitParameterToGal_injective F n) hcard + exact hbijective.2 + +/-- Explicit exhaustion statement for the automorphisms of a level field. -/ +theorem equalCharacteristicLubinTateLevelField_exists_unitParameter + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) + (σ : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) : + ∃ a : equalCharacteristicLubinTateUnitParameter F n, + σ = equalCharacteristicLubinTateUnitParameterAlgEquiv F n a := by + obtain ⟨a, ha⟩ := + equalCharacteristicLubinTateUnitParameterToGal_surjective F n σ + exact ⟨a, ha.symm⟩ + +/-- The polynomial over the Laurent-series base whose evaluation is a +truncated Lubin--Tate bracket. -/ +noncomputable def equalCharacteristicLubinTateBracketPolynomial + (F : LocalField.{u, v} K) + (m : ℕ) (a : F.residueField⟦X⟧) : + Polynomial F.residueField⸨X⸩ := + ∑ i ∈ Finset.range m, + Polynomial.C + (algebraMap F.residueField F.residueField⸨X⸩ + (PowerSeries.coeff i a)) * + equalCharacteristicLubinTatePiPolynomialIterate F i + +/-- Evaluating the bracket polynomial in any ambient field gives the genuine +truncated bracket. -/ +theorem equalCharacteristicLubinTateBracketPolynomial_eval₂ + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (φ : F.residueField⸨X⸩ →+* A) + (m : ℕ) (a : F.residueField⟦X⟧) (x : A) : + Polynomial.eval₂ φ x + (equalCharacteristicLubinTateBracketPolynomial F m a) = + equalCharacteristicLubinTateAmbientBracket F + (φ.comp (algebraMap F.residueField F.residueField⸨X⸩)) + (φ (equalCharacteristicLaurentUniformizer F)) m a x := by + rw [equalCharacteristicLubinTateBracketPolynomial, + Polynomial.eval₂_finsetSum, + equalCharacteristicLubinTateAmbientBracket_apply] + apply Finset.sum_congr rfl + intro i hi + rw [Polynomial.eval₂_mul, Polynomial.eval₂_C, + equalCharacteristicLubinTatePiPolynomialIterate_eval₂] + rfl + +/-- A truncated bracket, regarded as an endomorphism of the simple level +field. Its membership proof is the previously established closure of the +level field under brackets. -/ +noncomputable def equalCharacteristicLubinTateLevelBracket + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n m : ℕ) (a : F.residueField⟦X⟧) + (x : equalCharacteristicLubinTateLevelField F n) : + equalCharacteristicLubinTateLevelField F n := + ⟨equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) m a x.1, + equalCharacteristicLubinTateAmbientBracket_mem_levelField_of_mem + F n m a x.2⟩ + +/-- States the theorem `equalCharacteristicLubinTateLevelBracket_coe`. -/ +@[simp] +theorem equalCharacteristicLubinTateLevelBracket_coe + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n m : ℕ) (a : F.residueField⟦X⟧) + (x : equalCharacteristicLubinTateLevelField F n) : + (equalCharacteristicLubinTateLevelBracket F n m a x : + SeparableClosure F.residueField⸨X⸩) = + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) m a x.1 := + rfl + +/-- Inside the level field, a truncated bracket is evaluation of its bracket +polynomial. -/ +theorem equalCharacteristicLubinTateLevelBracket_eq_aeval + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n m : ℕ) (a : F.residueField⟦X⟧) + (x : equalCharacteristicLubinTateLevelField F n) : + equalCharacteristicLubinTateLevelBracket F n m a x = + Polynomial.aeval x + (equalCharacteristicLubinTateBracketPolynomial F m a) := by + let ι : equalCharacteristicLubinTateLevelField F n →ₐ[F.residueField⸨X⸩] + SeparableClosure F.residueField⸨X⸩ := + IsScalarTower.toAlgHom F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) + (SeparableClosure F.residueField⸨X⸩) + apply ι.injective + change ι (equalCharacteristicLubinTateLevelBracket F n m a x) = + ι (Polynomial.aeval x + (equalCharacteristicLubinTateBracketPolynomial F m a)) + rw [← Polynomial.aeval_algHom_apply (f := ι)] + change + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) m a x.1 = + Polynomial.eval₂ (equalCharacteristicSeparableBaseHom F) x.1 + (equalCharacteristicLubinTateBracketPolynomial F m a) + rw [equalCharacteristicLubinTateBracketPolynomial_eval₂] + rfl + +/-- Algebra endomorphisms of the level field commute with its bracket +polynomials. -/ +theorem equalCharacteristicLubinTateLevelBracket_map + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n m : ℕ) (a : F.residueField⟦X⟧) + (σ : equalCharacteristicLubinTateLevelField F n →ₐ[F.residueField⸨X⸩] + equalCharacteristicLubinTateLevelField F n) + (x : equalCharacteristicLubinTateLevelField F n) : + σ (equalCharacteristicLubinTateLevelBracket F n m a x) = + equalCharacteristicLubinTateLevelBracket F n m a (σ x) := by + calc + σ (equalCharacteristicLubinTateLevelBracket F n m a x) = + σ (Polynomial.aeval x + (equalCharacteristicLubinTateBracketPolynomial F m a)) := + congrArg σ + (equalCharacteristicLubinTateLevelBracket_eq_aeval F n m a x) + _ = Polynomial.aeval (σ x) + (equalCharacteristicLubinTateBracketPolynomial F m a) := + (Polynomial.aeval_algHom_apply σ x + (equalCharacteristicLubinTateBracketPolynomial F m a)).symm + _ = equalCharacteristicLubinTateLevelBracket F n m a (σ x) := + (equalCharacteristicLubinTateLevelBracket_eq_aeval F n m a (σ x)).symm + +/-- The power-basis generator is the chosen primitive point in the ambient +separable closure. -/ +@[simp] +theorem equalCharacteristicLubinTateLevelPowerBasis_gen_coe + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + ((equalCharacteristicLubinTateLevelPowerBasis F n).gen : + SeparableClosure F.residueField⸨X⸩) = + chosenEqualCharacteristicLubinTatePrimitiveRoot F n := + rfl + +/-- Bracketing the power-basis generator with a parameter series gives the +corresponding parameter root. -/ +theorem equalCharacteristicLubinTateLevelBracket_gen + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : equalCharacteristicLubinTateUnitParameter F n) : + equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + equalCharacteristicLubinTateUnitParameterLevelRoot F n a := by + apply Subtype.ext + rfl + +/-- A parameter automorphism sends any parameter root by applying that +parameter's bracket to the automorphism's generator image. -/ +theorem equalCharacteristicLubinTateUnitParameterAlgEquiv_apply_levelRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a b : equalCharacteristicLubinTateUnitParameter F n) : + equalCharacteristicLubinTateUnitParameterAlgEquiv F n a + (equalCharacteristicLubinTateUnitParameterLevelRoot F n b) = + equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n b) + (equalCharacteristicLubinTateUnitParameterLevelRoot F n a) := by + calc + equalCharacteristicLubinTateUnitParameterAlgEquiv F n a + (equalCharacteristicLubinTateUnitParameterLevelRoot F n b) = + equalCharacteristicLubinTateUnitParameterAlgEquiv F n a + (equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n b) + (equalCharacteristicLubinTateLevelPowerBasis F n).gen) := + congrArg (equalCharacteristicLubinTateUnitParameterAlgEquiv F n a) + (equalCharacteristicLubinTateLevelBracket_gen F n b).symm + _ = equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n b) + (equalCharacteristicLubinTateUnitParameterAlgEquiv F n a + (equalCharacteristicLubinTateLevelPowerBasis F n).gen) := + equalCharacteristicLubinTateLevelBracket_map F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n b) + (equalCharacteristicLubinTateUnitParameterAlgEquiv F n a).toAlgHom + (equalCharacteristicLubinTateLevelPowerBasis F n).gen + _ = equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n b) + (equalCharacteristicLubinTateUnitParameterLevelRoot F n a) := by + rw [equalCharacteristicLubinTateUnitParameterAlgEquiv_apply_gen] + +/-- Commutativity of power-series multiplication makes the two possible +iterated parameter brackets agree on the primitive point. -/ +theorem equalCharacteristicLubinTateUnitParameterLevelBracket_comm + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a b : equalCharacteristicLubinTateUnitParameter F n) : + equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n b) + (equalCharacteristicLubinTateUnitParameterLevelRoot F n a) = + equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (equalCharacteristicLubinTateUnitParameterLevelRoot F n b) := by + apply Subtype.ext + change + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n b) + (equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n)) = + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n b) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n)) + rw [← equalCharacteristicLubinTateAmbientBracket_mul_apply_of_torsion + F (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n b) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) + (chosenEqualCharacteristicLubinTatePrimitiveRoot_torsion F n), + ← equalCharacteristicLubinTateAmbientBracket_mul_apply_of_torsion + F (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (equalCharacteristicLubinTateUnitParameterSeries F n b) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) + (chosenEqualCharacteristicLubinTatePrimitiveRoot_torsion F n), + mul_comm] + +/-- Any two automorphisms arising from finite unit parameters commute. -/ +theorem equalCharacteristicLubinTateUnitParameterAlgEquiv_comm + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a b : equalCharacteristicLubinTateUnitParameter F n) : + equalCharacteristicLubinTateUnitParameterAlgEquiv F n a * + equalCharacteristicLubinTateUnitParameterAlgEquiv F n b = + equalCharacteristicLubinTateUnitParameterAlgEquiv F n b * + equalCharacteristicLubinTateUnitParameterAlgEquiv F n a := by + apply MulSemiringAction.toAlgHom_injective F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) + apply (equalCharacteristicLubinTateLevelPowerBasis F n).algHom_ext + change + equalCharacteristicLubinTateUnitParameterAlgEquiv F n a + (equalCharacteristicLubinTateUnitParameterAlgEquiv F n b + (equalCharacteristicLubinTateLevelPowerBasis F n).gen) = + equalCharacteristicLubinTateUnitParameterAlgEquiv F n b + (equalCharacteristicLubinTateUnitParameterAlgEquiv F n a + (equalCharacteristicLubinTateLevelPowerBasis F n).gen) + rw [equalCharacteristicLubinTateUnitParameterAlgEquiv_apply_gen, + equalCharacteristicLubinTateUnitParameterAlgEquiv_apply_gen, + equalCharacteristicLubinTateUnitParameterAlgEquiv_apply_levelRoot, + equalCharacteristicLubinTateUnitParameterAlgEquiv_apply_levelRoot] + exact equalCharacteristicLubinTateUnitParameterLevelBracket_comm F n a b + +/-- The full finite-level Galois group is commutative. -/ +theorem equalCharacteristicLubinTateLevelField_gal_comm + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) + (σ τ : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) : + σ * τ = τ * σ := by + obtain ⟨a, rfl⟩ := equalCharacteristicLubinTateLevelField_exists_unitParameter F n σ + obtain ⟨b, rfl⟩ := equalCharacteristicLubinTateLevelField_exists_unitParameter F n τ + exact equalCharacteristicLubinTateUnitParameterAlgEquiv_comm F n a b + +/-- The Galois group of the explicit level field is a commutative group. -/ +instance equalCharacteristicLubinTateLevelField_isMulCommutative + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + IsMulCommutative + (Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) := + ⟨⟨equalCharacteristicLubinTateLevelField_gal_comm F n⟩⟩ + +/-- Every explicit equal-characteristic Lubin--Tate level extension is +abelian Galois over the Laurent-series base. -/ +instance equalCharacteristicLubinTateLevelField_isAbelianGalois + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + IsAbelianGalois F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) where + toIsGalois := equalCharacteristicLubinTateLevelField_isGalois F n + toIsMulCommutative := + equalCharacteristicLubinTateLevelField_isMulCommutative F n + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAutomorphisms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAutomorphisms.lean new file mode 100644 index 0000000000..1290be7fc7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAutomorphisms.lean @@ -0,0 +1,368 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters +public import Mathlib.FieldTheory.Galois.Basic +/-! +# The uniformizer norm identity: automorphisms of equal-characteristic Lubin--Tate level fields + +The explicit Lubin--Tate brackets preserve the simple level field. Each +finite unit parameter therefore gives a root of the generator's minimal +polynomial inside that field, hence an automorphism obtained from its power +basis. The parameter action is faithful and has as many elements as the +degree of the extension. Comparing this lower bound with the standard upper +bound for field automorphisms proves that the level extension is Galois. + +No commutativity of the automorphism group is asserted here: that requires +the multiplicative composition law for the bracket action, not merely the +root-counting argument below. +-/ + +@[expose] public section + +noncomputable +section + + +open scoped PowerSeries LaurentSeries Polynomial + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The image of the Laurent-series uniformizer belongs to every level +field. -/ +theorem equalCharacteristicSeparableUniformizer_mem_lubinTateLevelField + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicSeparableUniformizer F ∈ + equalCharacteristicLubinTateLevelField F n := by + rw [equalCharacteristicSeparableUniformizer, + equalCharacteristicSeparableBaseHom_eq_algebraMap] + exact (equalCharacteristicLubinTateLevelField F n).algebraMap_mem _ + +/-- Embedded residue-field coefficients belong to every level field. -/ +theorem equalCharacteristicSeparableCoefficient_mem_lubinTateLevelField + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (c : F.residueField) : + equalCharacteristicSeparableCoefficientHom F c ∈ + equalCharacteristicLubinTateLevelField F n := by + rw [equalCharacteristicSeparableCoefficientHom, + RingHom.comp_apply, equalCharacteristicSeparableBaseHom_eq_algebraMap] + exact (equalCharacteristicLubinTateLevelField F n).algebraMap_mem _ + +/-- The chosen primitive point belongs to its simple level field. -/ +theorem chosenEqualCharacteristicLubinTatePrimitiveRoot_mem_levelField + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + chosenEqualCharacteristicLubinTatePrimitiveRoot F n ∈ + equalCharacteristicLubinTateLevelField F n := by + rw [equalCharacteristicLubinTateLevelField] + exact IntermediateField.mem_adjoin_of_mem _ (Set.mem_singleton _) + +/-- Every iterate of the distinguished Lubin--Tate endomorphism preserves a +level field. -/ +theorem equalCharacteristicLubinTateAmbientPiIterate_mem_levelField_of_mem + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n i : ℕ) {x : SeparableClosure F.residueField⸨X⸩} + (hx : x ∈ equalCharacteristicLubinTateLevelField F n) : + equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicSeparableUniformizer F) i x ∈ + equalCharacteristicLubinTateLevelField F n := by + induction i generalizing x with + | zero => simpa using hx + | succ i ih => + rw [equalCharacteristicLubinTateAmbientPiIterate_succ, + equalCharacteristicLubinTateAmbientPiEnd_apply] + apply ih + exact (equalCharacteristicLubinTateLevelField F n).add_mem + ((equalCharacteristicLubinTateLevelField F n).toSubalgebra.pow_mem hx _) + ((equalCharacteristicLubinTateLevelField F n).mul_mem + (equalCharacteristicSeparableUniformizer_mem_lubinTateLevelField F n) hx) + +/-- In particular, every distinguished iterate of the chosen primitive point +lies in its level field. -/ +theorem chosenEqualCharacteristicLubinTatePrimitiveRoot_piIterate_mem_levelField + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n i : ℕ) : + equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicSeparableUniformizer F) i + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) ∈ + equalCharacteristicLubinTateLevelField F n := + equalCharacteristicLubinTateAmbientPiIterate_mem_levelField_of_mem F n i + (chosenEqualCharacteristicLubinTatePrimitiveRoot_mem_levelField F n) + +/-- Every truncated Lubin--Tate bracket preserves the level field. -/ +theorem equalCharacteristicLubinTateAmbientBracket_mem_levelField_of_mem + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n m : ℕ) (a : F.residueField⟦X⟧) + {x : SeparableClosure F.residueField⸨X⸩} + (hx : x ∈ equalCharacteristicLubinTateLevelField F n) : + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) m a x ∈ + equalCharacteristicLubinTateLevelField F n := by + rw [equalCharacteristicLubinTateAmbientBracket_apply] + apply (equalCharacteristicLubinTateLevelField F n).sum_mem + intro i hi + exact (equalCharacteristicLubinTateLevelField F n).mul_mem + (equalCharacteristicSeparableCoefficient_mem_lubinTateLevelField F n _) + (equalCharacteristicLubinTateAmbientPiIterate_mem_levelField_of_mem F n i hx) + +/-- The explicit root attached to a finite unit parameter lies in the simple +level field generated by the chosen primitive point. -/ +theorem equalCharacteristicLubinTateUnitParameterRoot_mem_levelField + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : equalCharacteristicLubinTateUnitParameter F n) : + equalCharacteristicLubinTateUnitParameterRoot F n a ∈ + equalCharacteristicLubinTateLevelField F n := by + rw [equalCharacteristicLubinTateUnitParameterRoot] + exact equalCharacteristicLubinTateAmbientBracket_mem_levelField_of_mem F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (chosenEqualCharacteristicLubinTatePrimitiveRoot_mem_levelField F n) + +/-- The parameter root, regarded as an element of the level field. -/ +noncomputable def equalCharacteristicLubinTateUnitParameterLevelRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : equalCharacteristicLubinTateUnitParameter F n) : + equalCharacteristicLubinTateLevelField F n := + ⟨equalCharacteristicLubinTateUnitParameterRoot F n a, + equalCharacteristicLubinTateUnitParameterRoot_mem_levelField F n a⟩ + +/-- States the theorem `equalCharacteristicLubinTateUnitParameterLevelRoot_coe`. -/ +@[simp] +theorem equalCharacteristicLubinTateUnitParameterLevelRoot_coe + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : equalCharacteristicLubinTateUnitParameter F n) : + (equalCharacteristicLubinTateUnitParameterLevelRoot F n a : + SeparableClosure F.residueField⸨X⸩) = + equalCharacteristicLubinTateUnitParameterRoot F n a := + rfl + +/-- Finite parameters remain distinct after their roots are regarded as +elements of the level field. -/ +theorem equalCharacteristicLubinTateUnitParameterLevelRoot_injective + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Function.Injective + (equalCharacteristicLubinTateUnitParameterLevelRoot F n) := by + intro a b hab + apply equalCharacteristicLubinTateUnitParameterRoot_injective F n + exact congrArg Subtype.val hab + +/-- The canonical power basis of the simple level extension. -/ +noncomputable def equalCharacteristicLubinTateLevelPowerBasis + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + PowerBasis F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + IntermediateField.adjoin.powerBasis + (chosenEqualCharacteristicLubinTatePrimitiveRoot_isIntegral F n) + +/-- The minimal polynomial of the power-basis generator is the primitive +division polynomial. -/ +theorem equalCharacteristicLubinTateLevelPowerBasis_minpoly + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + minpoly F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + equalCharacteristicLubinTatePrimitivePolynomial F n := by + change + minpoly F.residueField⸨X⸩ + (IntermediateField.adjoin.powerBasis + (chosenEqualCharacteristicLubinTatePrimitiveRoot_isIntegral F n)).gen = + equalCharacteristicLubinTatePrimitivePolynomial F n + rw [IntermediateField.adjoin.powerBasis_gen, + IntermediateField.minpoly_gen, + equalCharacteristicLubinTatePrimitivePolynomial_eq_minpoly] + +/-- A parameter root annihilates the minimal polynomial of the level-field +generator inside the level field itself. -/ +theorem equalCharacteristicLubinTateUnitParameterLevelRoot_aeval_minpoly + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : equalCharacteristicLubinTateUnitParameter F n) : + Polynomial.aeval (equalCharacteristicLubinTateUnitParameterLevelRoot F n a) + (minpoly F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelPowerBasis F n).gen) = 0 := by + rw [equalCharacteristicLubinTateLevelPowerBasis_minpoly] + let ι : equalCharacteristicLubinTateLevelField F n →ₐ[F.residueField⸨X⸩] + SeparableClosure F.residueField⸨X⸩ := + (equalCharacteristicLubinTateLevelField F n).val + apply ι.injective + change ι (Polynomial.aeval + (equalCharacteristicLubinTateUnitParameterLevelRoot F n a) + (equalCharacteristicLubinTatePrimitivePolynomial F n)) = ι 0 + rw [← Polynomial.aeval_algHom_apply (f := ι), map_zero] + rw [Polynomial.aeval_def, + ← equalCharacteristicSeparableBaseHom_eq_algebraMap] + change Polynomial.eval₂ + (equalCharacteristicSeparableBaseHom F) + (equalCharacteristicLubinTateUnitParameterRoot F n a) + (equalCharacteristicLubinTatePrimitivePolynomial F n) = 0 + simpa [Polynomial.IsRoot, Polynomial.eval_map] using + (equalCharacteristicLubinTateUnitParameterRoot_isRoot F n a) + +/-- The algebra endomorphism sending the chosen primitive generator to the +explicit root attached to a finite unit parameter. -/ +noncomputable def equalCharacteristicLubinTateUnitParameterAlgHom + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : equalCharacteristicLubinTateUnitParameter F n) : + equalCharacteristicLubinTateLevelField F n →ₐ[F.residueField⸨X⸩] + equalCharacteristicLubinTateLevelField F n := + (equalCharacteristicLubinTateLevelPowerBasis F n).lift + (equalCharacteristicLubinTateUnitParameterLevelRoot F n a) + (equalCharacteristicLubinTateUnitParameterLevelRoot_aeval_minpoly F n a) + +/-- States the theorem `equalCharacteristicLubinTateUnitParameterAlgHom_apply_gen`. -/ +@[simp] +theorem equalCharacteristicLubinTateUnitParameterAlgHom_apply_gen + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : equalCharacteristicLubinTateUnitParameter F n) : + equalCharacteristicLubinTateUnitParameterAlgHom F n a + (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + equalCharacteristicLubinTateUnitParameterLevelRoot F n a := by + exact (equalCharacteristicLubinTateLevelPowerBasis F n).lift_gen _ _ + +/-- The finite-dimensional algebra endomorphism is automatically an +automorphism. -/ +noncomputable def equalCharacteristicLubinTateUnitParameterAlgEquiv + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : equalCharacteristicLubinTateUnitParameter F n) : + equalCharacteristicLubinTateLevelField F n ≃ₐ[F.residueField⸨X⸩] + equalCharacteristicLubinTateLevelField F n := by + letI : FiniteDimensional F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + exact AlgEquiv.ofBijective + (equalCharacteristicLubinTateUnitParameterAlgHom F n a) + (AlgHom.bijective (equalCharacteristicLubinTateUnitParameterAlgHom F n a)) + +/-- States the theorem `equalCharacteristicLubinTateUnitParameterAlgEquiv_apply_gen`. -/ +@[simp] +theorem equalCharacteristicLubinTateUnitParameterAlgEquiv_apply_gen + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : equalCharacteristicLubinTateUnitParameter F n) : + equalCharacteristicLubinTateUnitParameterAlgEquiv F n a + (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + equalCharacteristicLubinTateUnitParameterLevelRoot F n a := by + rw [equalCharacteristicLubinTateUnitParameterAlgEquiv, + AlgEquiv.ofBijective_apply, + equalCharacteristicLubinTateUnitParameterAlgHom_apply_gen] + +/-- The explicit map from finite unit parameters to the finite-level Galois +group. -/ +noncomputable def equalCharacteristicLubinTateUnitParameterToGal + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicLubinTateUnitParameter F n → + Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩) := + equalCharacteristicLubinTateUnitParameterAlgEquiv F n + +/-- Faithfulness of the bracket action makes the parameter-to-automorphism +map injective. -/ +theorem equalCharacteristicLubinTateUnitParameterToGal_injective + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Function.Injective + (equalCharacteristicLubinTateUnitParameterToGal F n) := by + intro a b hab + apply equalCharacteristicLubinTateUnitParameterLevelRoot_injective F n + have hgen := congrArg + (fun σ : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩) => + σ (equalCharacteristicLubinTateLevelPowerBasis F n).gen) hab + simpa [equalCharacteristicLubinTateUnitParameterToGal] using hgen + +/-- Provides the instance `equalCharacteristicLubinTateLevelField_galFinite`. -/ +noncomputable instance equalCharacteristicLubinTateLevelField_galFinite + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Finite (Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) := by + let : FiniteDimensional F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + let : Module.Free F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + Module.Free.of_divisionRing _ _ + let : Finite + ((equalCharacteristicLubinTateLevelField F n) →ₐ[ + F.residueField⸨X⸩] + (equalCharacteristicLubinTateLevelField F n)) := + Finite.algHom _ _ _ + exact Finite.algEquiv + +/-- The automorphism group of a level field has cardinality equal to the +degree of the extension. -/ +theorem equalCharacteristicLubinTateLevelField_natCard_gal + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Nat.card (Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) = + Module.finrank F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := by + let : FiniteDimensional F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + apply Nat.le_antisymm + · rw [Nat.card_eq_fintype_card] + exact AlgEquiv.card_le + · calc + Module.finrank F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) = + Nat.card (equalCharacteristicLubinTateUnitParameter F n) := by + rw [equalCharacteristicLubinTateLevelField_finrank, + equalCharacteristicLubinTateUnitParameter_natCard] + _ ≤ Nat.card (Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) := + Nat.card_le_card_of_injective + (equalCharacteristicLubinTateUnitParameterToGal F n) + (equalCharacteristicLubinTateUnitParameterToGal_injective F n) + +/-- Every equal-characteristic Lubin--Tate level field constructed here is +Galois over the Laurent-series base. -/ +theorem equalCharacteristicLubinTateLevelField_isGalois + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + IsGalois F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := by + let : FiniteDimensional F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + exact IsGalois.of_card_aut_eq_finrank F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) + (equalCharacteristicLubinTateLevelField_natCard_gal F n) + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelField.lean new file mode 100644 index 0000000000..5ee484e71b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelField.lean @@ -0,0 +1,158 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion +/-! +# The uniformizer norm identity: equal-characteristic Lubin--Tate level fields + +The level-`n+1` field is the simple extension generated by a primitive +division point. Eisenstein irreducibility identifies its minimal polynomial +with the primitive division polynomial and gives the exact degree +`(q - 1) q^n`. +-/ + +@[expose] public section + +noncomputable +section + + +open scoped PowerSeries LaurentSeries Polynomial + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The explicit base embedding used to choose division roots is the +canonical algebra map of the separable closure. -/ +theorem equalCharacteristicSeparableBaseHom_eq_algebraMap + (F : LocalField.{u, v} K) : + equalCharacteristicSeparableBaseHom F = + algebraMap F.residueField⸨X⸩ + (SeparableClosure F.residueField⸨X⸩) := by + ext x + rfl + +/-- The simple extension generated by the chosen primitive level-`n+1` +division point. -/ +@[reducible] noncomputable def equalCharacteristicLubinTateLevelField + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + IntermediateField F.residueField⸨X⸩ + (SeparableClosure F.residueField⸨X⸩) := + IntermediateField.adjoin F.residueField⸨X⸩ + {chosenEqualCharacteristicLubinTatePrimitiveRoot F n} + +/-- The canonical base algebra on a Lubin--Tate level field. + +Naming this structure lets downstream files install the intended algebra +locally without unfolding the separable-closure construction. -/ +@[reducible] noncomputable def equalCharacteristicLubinTateLevelFieldAlgebra + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := by + change Algebra F.residueField⸨X⸩ + (IntermediateField.adjoin F.residueField⸨X⸩ + {chosenEqualCharacteristicLubinTatePrimitiveRoot F n}) + infer_instance + +/-- Defines `equalCharacteristicLubinTateLevelFieldSMul`. -/ +@[reducible] noncomputable def equalCharacteristicLubinTateLevelFieldSMul + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + SMul F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := by + change SMul F.residueField⸨X⸩ + (IntermediateField.adjoin F.residueField⸨X⸩ + {chosenEqualCharacteristicLubinTatePrimitiveRoot F n}) + infer_instance + +/-- Defines `equalCharacteristicLubinTateLevelFieldModule`. -/ +@[reducible] noncomputable def equalCharacteristicLubinTateLevelFieldModule + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Module F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := by + change Module F.residueField⸨X⸩ + (IntermediateField.adjoin F.residueField⸨X⸩ + {chosenEqualCharacteristicLubinTatePrimitiveRoot F n}) + infer_instance + +/-- The primitive division point is integral over `κ((T))`. -/ +theorem chosenEqualCharacteristicLubinTatePrimitiveRoot_isIntegral + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + IsIntegral F.residueField⸨X⸩ + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) := by + refine ⟨equalCharacteristicLubinTatePrimitivePolynomial F n, + equalCharacteristicLubinTatePrimitivePolynomial_monic F n, ?_⟩ + rw [← equalCharacteristicSeparableBaseHom_eq_algebraMap] + simpa [Polynomial.IsRoot, Polynomial.eval_map] using + (chosenEqualCharacteristicLubinTatePrimitiveRoot_isRoot F n) + +/-- The Eisenstein primitive polynomial is exactly the minimal polynomial +of the chosen primitive division point. -/ +theorem equalCharacteristicLubinTatePrimitivePolynomial_eq_minpoly + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicLubinTatePrimitivePolynomial F n = + minpoly F.residueField⸨X⸩ + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) := by + apply minpoly.eq_of_irreducible_of_monic + (equalCharacteristicLubinTatePrimitivePolynomial_irreducible F n) + _ + (equalCharacteristicLubinTatePrimitivePolynomial_monic F n) + rw [Polynomial.aeval_def, + ← equalCharacteristicSeparableBaseHom_eq_algebraMap] + simpa [Polynomial.IsRoot, Polynomial.eval_map] using + (chosenEqualCharacteristicLubinTatePrimitiveRoot_isRoot F n) + +/-- Every equal-characteristic Lubin--Tate level field is finite over the +Laurent-series base. -/ +theorem equalCharacteristicLubinTateLevelField_finiteDimensional + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + FiniteDimensional F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := by + exact IntermediateField.adjoin.finiteDimensional + (chosenEqualCharacteristicLubinTatePrimitiveRoot_isIntegral F n) + +/-- The exact degree of the primitive level-`n+1` extension. -/ +theorem equalCharacteristicLubinTateLevelField_finrank + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Module.finrank F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) = + (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := by + change Module.finrank F.residueField⸨X⸩ + (IntermediateField.adjoin F.residueField⸨X⸩ + {chosenEqualCharacteristicLubinTatePrimitiveRoot F n}) = _ + rw [IntermediateField.adjoin.finrank + (chosenEqualCharacteristicLubinTatePrimitiveRoot_isIntegral F n), + ← equalCharacteristicLubinTatePrimitivePolynomial_eq_minpoly, + equalCharacteristicLubinTatePrimitivePolynomial_natDegree] + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelFieldTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelFieldTower.lean new file mode 100644 index 0000000000..fa06fff688 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelFieldTower.lean @@ -0,0 +1,144 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.SplittingField.IsSplittingField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms +/-! +# Towers of equal-characteristic Lubin--Tate level fields + +The primitive roots used to define the finite levels are chosen independently +inside one separable closure. This file proves that the resulting standard +level fields nevertheless form an increasing tower. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries Polynomial + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The `(n - m)`-fold Lubin--Tate predecessor of a primitive level-`n + 1` +point is a root of the primitive level-`m + 1` polynomial. -/ +theorem equalCharacteristicLubinTatePrimitivePredecessor_isRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {m n : ℕ} (hmn : m ≤ n) : + let y := + equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicSeparableUniformizer F) (n - m) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) + ((equalCharacteristicLubinTatePrimitivePolynomial F m).map + (equalCharacteristicSeparableBaseHom F)).IsRoot y := by + let y := + equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicSeparableUniformizer F) (n - m) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) + have hyEquation : + equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicSeparableUniformizer F) m y ^ + (Nat.card F.residueField - 1) + + equalCharacteristicSeparableUniformizer F = 0 := by + rw [show + equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicSeparableUniformizer F) m y = + equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicSeparableUniformizer F) n + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) by + simp only [y] + rw [← equalCharacteristicLubinTateAmbientPiIterate_add, + Nat.add_sub_of_le hmn]] + exact chosenEqualCharacteristicLubinTatePrimitiveRoot_equation F n + change Polynomial.eval y + ((equalCharacteristicLubinTatePrimitivePolynomial F m).map + (equalCharacteristicSeparableBaseHom F)) = 0 + rw [Polynomial.eval_map, + equalCharacteristicLubinTatePrimitivePolynomial_eval₂] + exact hyEquation + +/-- The independently chosen equal-characteristic Lubin--Tate level fields +form an increasing tower inside the fixed separable closure. -/ +theorem equalCharacteristicLubinTateLevelField_mono + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {m n : ℕ} (hmn : m ≤ n) : + equalCharacteristicLubinTateLevelField F m ≤ + equalCharacteristicLubinTateLevelField F n := by + let B := F.residueField⸨X⸩ + let S := SeparableClosure B + let E := equalCharacteristicLubinTateLevelField F n + let p := equalCharacteristicLubinTatePrimitivePolynomial F m + let y : S := + equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicSeparableUniformizer F) (n - m) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) + have hy_mem : y ∈ E := by + exact + chosenEqualCharacteristicLubinTatePrimitiveRoot_piIterate_mem_levelField + F n (n - m) + let yE : E := ⟨y, hy_mem⟩ + have hyp : (p.map (algebraMap B E)).IsRoot yE := by + have hroot := + equalCharacteristicLubinTatePrimitivePredecessor_isRoot F hmn + change Polynomial.eval y + ((equalCharacteristicLubinTatePrimitivePolynomial F m).map + (equalCharacteristicSeparableBaseHom F)) = 0 at hroot + change Polynomial.eval yE (p.map (algebraMap B E)) = 0 + apply E.val.injective + rw [map_zero, Polynomial.eval_map, Polynomial.hom_eval₂] + have hcomp : + E.val.toRingHom.comp (algebraMap B E) = algebraMap B S := by + ext x + rfl + rw [hcomp] + simpa [yE, p, Polynomial.eval₂_eq_eval_map, + equalCharacteristicSeparableBaseHom_eq_algebraMap] using hroot + have hp_minpoly : p = minpoly B yE := by + apply minpoly.eq_of_irreducible_of_monic + (equalCharacteristicLubinTatePrimitivePolynomial_irreducible F m) + _ (equalCharacteristicLubinTatePrimitivePolynomial_monic F m) + simpa [Polynomial.IsRoot, Polynomial.aeval_def] using hyp + let : FiniteDimensional B E := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + let : IsGalois B E := + equalCharacteristicLubinTateLevelField_isGalois F n + have hp_split_E : (p.map (algebraMap B E)).Splits := by + rw [hp_minpoly] + exact IsGalois.splits B yE + have hp_split_S : (p.map (algebraMap B S)).Splits := by + have h := hp_split_E.map E.val.toRingHom + simpa [Polynomial.map_map] using h + have hchosen_mem : + chosenEqualCharacteristicLubinTatePrimitiveRoot F m ∈ E := by + apply + (IntermediateField.splits_iff_mem + (F := E) hp_split_S).1 hp_split_E + rw [Polynomial.mem_rootSet'] + constructor + · exact + ((equalCharacteristicLubinTatePrimitivePolynomial_monic F m).map + (algebraMap B S)).ne_zero + · simpa [Polynomial.aeval_def, p, + equalCharacteristicSeparableBaseHom_eq_algebraMap] using + chosenEqualCharacteristicLubinTatePrimitiveRoot_isRoot F m + change IntermediateField.adjoin B + {chosenEqualCharacteristicLubinTatePrimitiveRoot F m} ≤ E + rw [IntermediateField.adjoin_le_iff] + simpa using hchosen_mem + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/NormUniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/NormUniformizer.lean new file mode 100644 index 0000000000..6ffbcbc46c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/NormUniformizer.lean @@ -0,0 +1,106 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField +public import Mathlib.RingTheory.Norm.Basic +/-! +# The uniformizer norm identity: the uniformizer norm in the equal-characteristic level field + +For a primitive level-`n+1` division point `λ`, its Eisenstein minimal +polynomial has constant coefficient `T`. The power-basis norm formula +therefore gives the norm identity `N(-λ) = T`. +-/ + +@[expose] public section + +noncomputable +section + + +open scoped PowerSeries LaurentSeries Polynomial + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The constant coefficient of the primitive division polynomial is the +Laurent-series uniformizer `T`. -/ +theorem equalCharacteristicLubinTatePrimitivePolynomial_coeff_zero + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicLubinTatePrimitivePolynomial F n).coeff 0 = + equalCharacteristicLaurentUniformizer F := by + rw [← equalCharacteristicLubinTateIntegralPrimitivePolynomial_map] + rw [Polynomial.coeff_map, + equalCharacteristicLubinTateIntegralPrimitivePolynomial_coeff_zero] + rfl + +/-- The chosen primitive point, regarded as the generator of its level +field. -/ +noncomputable def equalCharacteristicLubinTateLevelGenerator + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : equalCharacteristicLubinTateLevelField F n := + IntermediateField.AdjoinSimple.gen F.residueField⸨X⸩ + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) + +/-- States the theorem `equalCharacteristicLubinTateLevelGenerator_eq_powerBasis_gen`. -/ +theorem equalCharacteristicLubinTateLevelGenerator_eq_powerBasis_gen + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicLubinTateLevelGenerator F n = + (IntermediateField.adjoin.powerBasis + (chosenEqualCharacteristicLubinTatePrimitiveRoot_isIntegral F n)).gen := by + apply Subtype.ext + simp [equalCharacteristicLubinTateLevelGenerator, + equalCharacteristicLubinTateLevelField, + IntermediateField.adjoin.powerBasis_gen] + +/-- The norm of a negative element, isolated from the large concrete +Lubin--Tate level-field expression. -/ +private theorem algebraNorm_neg + {R S : Type*} [Field R] [Field S] [Algebra R S] (x : S) : + Algebra.norm R (-x) = (-1) ^ Module.finrank R S * Algebra.norm R x := by + rw [show -x = algebraMap R S (-1) * x by simp] + rw [map_mul, Algebra.norm_algebraMap] + +/-- The uniformizer norm identity, uniformizer part: the norm of the negative primitive +division point is exactly `T`. -/ +theorem equalCharacteristicLubinTate_norm_neg_levelGenerator + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Algebra.norm F.residueField⸨X⸩ + (-equalCharacteristicLubinTateLevelGenerator F n) = + equalCharacteristicLaurentUniformizer F := by + let pb := IntermediateField.adjoin.powerBasis + (chosenEqualCharacteristicLubinTatePrimitiveRoot_isIntegral F n) + have hmin : minpoly F.residueField⸨X⸩ pb.gen = + equalCharacteristicLubinTatePrimitivePolynomial F n := by + simpa [pb, IntermediateField.adjoin.powerBasis_gen, + IntermediateField.minpoly_gen] using + (equalCharacteristicLubinTatePrimitivePolynomial_eq_minpoly F n).symm + have hfinrank : Module.finrank F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) = pb.dim := by + simpa [equalCharacteristicLubinTateLevelField, pb] using pb.finrank + rw [algebraNorm_neg, + equalCharacteristicLubinTateLevelGenerator_eq_powerBasis_gen, + Algebra.PowerBasis.norm_gen_eq_coeff_zero_minpoly, + hmin, equalCharacteristicLubinTatePrimitivePolynomial_coeff_zero] + rw [hfinrank] + simp only [pb, IntermediateField.adjoin.powerBasis_dim] + rw [← mul_assoc, ← pow_add, ← two_mul, pow_mul] + simp + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveAction.lean new file mode 100644 index 0000000000..af9dbe3236 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveAction.lean @@ -0,0 +1,285 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField +public import Mathlib.FieldTheory.Finite.Basic +/-! +# The uniformizer norm identity: the unit action on primitive division points + +The genuine truncated Lubin--Tate bracket attached to a unit power series +sends a primitive level-`n+1` point to another root of the same Eisenstein +polynomial. This is the source of the finite-level Galois action; no +automorphism or normality is assumed here. +-/ + +@[expose] public section + +noncomputable +section + + +open scoped PowerSeries LaurentSeries Polynomial + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- On a level-one torsion point, every longer bracket only sees the +constant coefficient of the power series. -/ +theorem equalCharacteristicLubinTateAmbientBracket_apply_of_levelOne_torsion + (F : LocalField.{u, v} K) + {A : Type*} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (m : ℕ) (a : F.residueField⟦X⟧) (x : A) + (hx : IsEqualCharacteristicLubinTateAmbientTorsion F t 1 x) : + equalCharacteristicLubinTateAmbientBracket F ι t (m + 1) a x = + ι (PowerSeries.coeff 0 a) * x := by + induction m with + | zero => + rw [equalCharacteristicLubinTateAmbientBracket_apply] + simp [equalCharacteristicLubinTateAmbientPiIterate_zero] + | succ m ih => + have hxm : + IsEqualCharacteristicLubinTateAmbientTorsion F t (m + 1) x := by + exact equalCharacteristicLubinTateAmbientPiIterate_eq_zero_of_le + F t (Nat.succ_le_succ (Nat.zero_le m)) x hx + rw [show m.succ + 1 = (m + 1) + 1 by omega, + equalCharacteristicLubinTateAmbientBracket_succ_eq_of_torsion + F ι t (m + 1) a x hxm, + ih] + +/-- Applying `e^n` after a bracket scales the level-one predecessor of any +primitive level-`n+1` point by the bracket's constant coefficient. -/ +theorem equalCharacteristicLubinTateAmbientPrimitive_iterate_bracket + (F : LocalField.{u, v} K) + {A : Type*} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (n : ℕ) (a : F.residueField⟦X⟧) (x : A) + (hx : IsEqualCharacteristicLubinTateAmbientTorsion F t (n + 1) x) : + equalCharacteristicLubinTateAmbientPiIterate F t n + (equalCharacteristicLubinTateAmbientBracket F ι t (n + 1) a x) = + ι (PowerSeries.coeff 0 a) * + equalCharacteristicLubinTateAmbientPiIterate F t n x := by + rw [equalCharacteristicLubinTateAmbientPiIterate_bracket] + apply equalCharacteristicLubinTateAmbientBracket_apply_of_levelOne_torsion + change equalCharacteristicLubinTateAmbientPiIterate F t 1 + (equalCharacteristicLubinTateAmbientPiIterate F t n x) = 0 + rw [← equalCharacteristicLubinTateAmbientPiIterate_add] + rw [Nat.add_comm 1 n] + exact hx + +/-- Applying `e^n` after a unit bracket scales the primitive level-one +predecessor by the unit's constant coefficient. -/ +theorem chosenEqualCharacteristicLubinTatePrimitiveRoot_iterate_bracket + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧) : + equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicSeparableUniformizer F) n + (equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) a + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n)) = + equalCharacteristicSeparableCoefficientHom F + (PowerSeries.coeff 0 a) * + equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicSeparableUniformizer F) n + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) := by + exact equalCharacteristicLubinTateAmbientPrimitive_iterate_bracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) n a + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) + (chosenEqualCharacteristicLubinTatePrimitiveRoot_torsion F n) + +/-- The constant coefficient of a unit power series is nonzero. -/ +theorem powerSeries_unit_coeff_zero_ne_zero + {k : Type*} [Field k] (a : k⟦X⟧ˣ) : + PowerSeries.coeff 0 (a : k⟦X⟧) ≠ 0 := by + rw [PowerSeries.coeff_zero_eq_constantCoeff_apply] + exact (PowerSeries.isUnit_iff_constantCoeff.mp a.isUnit).ne_zero + +/-- The ambient bracket is additive in its power-series coordinate, in +subtraction form. -/ +theorem equalCharacteristicLubinTateAmbientBracket_sub + (F : LocalField.{u, v} K) + {A : Type*} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (m : ℕ) (a b : F.residueField⟦X⟧) : + equalCharacteristicLubinTateAmbientBracket F ι t m (a - b) = + equalCharacteristicLubinTateAmbientBracket F ι t m a - + equalCharacteristicLubinTateAmbientBracket F ι t m b := by + apply AddMonoidHom.ext + intro x + change equalCharacteristicLubinTateAmbientBracket F ι t m (a - b) x = + equalCharacteristicLubinTateAmbientBracket F ι t m a x - + equalCharacteristicLubinTateAmbientBracket F ι t m b x + rw [equalCharacteristicLubinTateAmbientBracket_apply, + equalCharacteristicLubinTateAmbientBracket_apply, + equalCharacteristicLubinTateAmbientBracket_apply] + rw [← Finset.sum_sub_distrib] + apply Finset.sum_congr rfl + intro i _ + rw [(PowerSeries.coeff (R := F.residueField) i).map_sub a b, + ι.map_sub, sub_mul] + +/-- Faithfulness of the truncated bracket on any primitive level-`n+1` +point. This is the intrinsic Lubin--Tate statement used both before and +after passage to the completed maximal-unramified base. -/ +theorem equalCharacteristicLubinTateAmbientPrimitive_bracket_eq_coeff + (F : LocalField.{u, v} K) + {A : Type*} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (n : ℕ) (x : A) + (hx : IsEqualCharacteristicLubinTateAmbientTorsion F t (n + 1) x) + (hxpred : ¬ IsEqualCharacteristicLubinTateAmbientTorsion F t n x) + (a b : F.residueField⟦X⟧) + (hbracket : + equalCharacteristicLubinTateAmbientBracket F ι t (n + 1) a x = + equalCharacteristicLubinTateAmbientBracket F ι t (n + 1) b x) : + ∀ i ≤ n, PowerSeries.coeff i a = PowerSeries.coeff i b := by + intro i hi + induction i using Nat.strong_induction_on with + | h i ih => + let d := a - b + have hdx : + equalCharacteristicLubinTateAmbientBracket F ι t (n + 1) d x = 0 := by + change equalCharacteristicLubinTateAmbientBracket F ι t (n + 1) + (a - b) x = 0 + rw [equalCharacteristicLubinTateAmbientBracket_sub] + exact sub_eq_zero.mpr hbracket + have hshift : + equalCharacteristicLubinTateAmbientBracket F ι t (n + 1) d + (equalCharacteristicLubinTateAmbientPiIterate F t (n - i) x) = 0 := by + rw [← equalCharacteristicLubinTateAmbientPiIterate_bracket] + rw [hdx, map_zero] + have hynonzero : + equalCharacteristicLubinTateAmbientPiIterate F t n x ≠ 0 := + hxpred + rw [equalCharacteristicLubinTateAmbientBracket_apply] at hshift + have hsum : + (∑ j ∈ Finset.range (n + 1), + ι (PowerSeries.coeff j d) * + equalCharacteristicLubinTateAmbientPiIterate F t j + (equalCharacteristicLubinTateAmbientPiIterate F t (n - i) x)) = + ι (PowerSeries.coeff i d) * + equalCharacteristicLubinTateAmbientPiIterate F t n x := by + classical + rw [Finset.sum_eq_single i] + · rw [← equalCharacteristicLubinTateAmbientPiIterate_add, + Nat.add_sub_of_le hi] + · intro j hj hji + by_cases hji' : j < i + · have hcoeff : PowerSeries.coeff j d = 0 := by + change PowerSeries.coeff j (a - b) = 0 + rw [map_sub, ih j hji' (by omega), sub_self] + rw [hcoeff, map_zero, zero_mul] + · have hij : i < j := lt_of_le_of_ne (Nat.le_of_not_gt hji') + (Ne.symm hji) + have hkill : + equalCharacteristicLubinTateAmbientPiIterate F t j + (equalCharacteristicLubinTateAmbientPiIterate F t (n - i) x) = + 0 := by + rw [← equalCharacteristicLubinTateAmbientPiIterate_add] + apply equalCharacteristicLubinTateAmbientPiIterate_eq_zero_of_le + F t (n := n + 1) (m := j + (n - i)) _ x hx + omega + rw [hkill, mul_zero] + · intro hnot + exact (hnot (Finset.mem_range.mpr + (Nat.lt_succ_iff.mpr hi))).elim + rw [hsum] at hshift + have hcoeffMap : ι (PowerSeries.coeff i d) = 0 := + (mul_eq_zero.mp hshift).resolve_right hynonzero + have hcoeff : PowerSeries.coeff i d = 0 := by + apply ι.injective + simpa using hcoeffMap + simpa [d, sub_eq_zero] using hcoeff + +/-- Faithfulness on a primitive level-`n+1` point: equality of two bracket +images forces equality of all coefficients visible at that level. -/ +theorem chosenEqualCharacteristicLubinTatePrimitiveRoot_bracket_eq_coeff + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a b : F.residueField⟦X⟧) + (hbracket : + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) a + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) = + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) b + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n)) : + ∀ i ≤ n, PowerSeries.coeff i a = PowerSeries.coeff i b := by + exact equalCharacteristicLubinTateAmbientPrimitive_bracket_eq_coeff F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) n + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) + (chosenEqualCharacteristicLubinTatePrimitiveRoot_torsion F n) + (chosenEqualCharacteristicLubinTatePrimitiveRoot_not_torsion_pred F n) + a b hbracket + +/-- Every unit bracket of the chosen primitive point is again a root of +the primitive division polynomial. -/ +theorem equalCharacteristicLubinTatePrimitivePolynomial_isRoot_bracket + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + ((equalCharacteristicLubinTatePrimitivePolynomial F n).map + (equalCharacteristicSeparableBaseHom F)).IsRoot + (equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (a : F.residueField⟦X⟧) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n)) := by + let z := equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (a : F.residueField⟦X⟧) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) + let y := equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicSeparableUniformizer F) n + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) + let c := PowerSeries.coeff 0 (a : F.residueField⟦X⟧) + have hc : c ≠ 0 := powerSeries_unit_coeff_zero_ne_zero a + have hcpow : c ^ (Nat.card F.residueField - 1) = 1 := by + let := Fintype.ofFinite F.residueField + simpa only [Nat.card_eq_fintype_card] using + FiniteField.pow_card_sub_one_eq_one c hc + have hziterate : + equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicSeparableUniformizer F) n z = + equalCharacteristicSeparableCoefficientHom F c * y := by + simpa [z, y, c] using + chosenEqualCharacteristicLubinTatePrimitiveRoot_iterate_bracket F n + (a : F.residueField⟦X⟧) + have hy := chosenEqualCharacteristicLubinTatePrimitiveRoot_equation F n + have hzEquation : + equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicSeparableUniformizer F) n z ^ + (Nat.card F.residueField - 1) + + equalCharacteristicSeparableUniformizer F = 0 := by + rw [hziterate, mul_pow, ← map_pow, + hcpow, map_one, one_mul] + exact hy + change Polynomial.eval + z + ((equalCharacteristicLubinTatePrimitivePolynomial F n).map + (equalCharacteristicSeparableBaseHom F)) = 0 + rw [Polynomial.eval_map, + equalCharacteristicLubinTatePrimitivePolynomial_eval₂] + exact hzEquation + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveIrreducible.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveIrreducible.lean new file mode 100644 index 0000000000..0ffb2eeb91 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveIrreducible.lean @@ -0,0 +1,330 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial +public import Mathlib.RingTheory.Polynomial.Eisenstein.Basic +public import Mathlib.RingTheory.PowerSeries.Ideal +/-! +# The uniformizer norm identity: irreducibility of the equal-characteristic primitive polynomial + +The primitive level-`n+1` polynomial is lifted from `κ((T))` to `κ[[T]]`. +Modulo `T` this lift is the single monomial `Y ^ ((q - 1) * q ^ n)`, while +its constant coefficient is exactly `T`. It is therefore Eisenstein at +`(T)`, and Gauss's lemma gives irreducibility over `κ((T))`. +-/ + +@[expose] public section + +noncomputable +section + +open scoped PowerSeries LaurentSeries Polynomial + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The integral lift `Y ^ q + T * Y` of the equal-characteristic +Lubin--Tate polynomial. -/ +noncomputable def equalCharacteristicLubinTateIntegralPiPolynomial + (F : LocalField.{u, v} K) : + Polynomial F.residueField⟦X⟧ := + Polynomial.X ^ Nat.card F.residueField + + Polynomial.C (PowerSeries.X : F.residueField⟦X⟧) * Polynomial.X + +/-- The integral Lubin–Tate `π`-polynomial is monic. -/ +theorem equalCharacteristicLubinTateIntegralPiPolynomial_monic + (F : LocalField.{u, v} K) : + (equalCharacteristicLubinTateIntegralPiPolynomial F).Monic := by + rw [equalCharacteristicLubinTateIntegralPiPolynomial] + refine (Polynomial.monic_X_pow _).add_of_left ?_ + rw [Polynomial.degree_C_mul_X (PowerSeries.X_ne_zero), + Polynomial.degree_X_pow] + exact_mod_cast (Finite.one_lt_card : 1 < Nat.card F.residueField) + +/-- The integral Lubin–Tate `π`-polynomial has degree equal to the residue-field cardinality. -/ +theorem equalCharacteristicLubinTateIntegralPiPolynomial_natDegree + (F : LocalField.{u, v} K) : + (equalCharacteristicLubinTateIntegralPiPolynomial F).natDegree = + Nat.card F.residueField := by + rw [equalCharacteristicLubinTateIntegralPiPolynomial] + rw [Polynomial.natDegree_add_eq_left_of_natDegree_lt] + · exact Polynomial.natDegree_X_pow _ + · rw [Polynomial.natDegree_X_pow, + Polynomial.natDegree_C_mul_X _ (PowerSeries.X_ne_zero)] + exact (Finite.one_lt_card : 1 < Nat.card F.residueField) + +/-- The compositional division polynomial over `κ[[T]]`. -/ +noncomputable def equalCharacteristicLubinTateIntegralPiPolynomialIterate + (F : LocalField.{u, v} K) (n : ℕ) : + Polynomial F.residueField⟦X⟧ := + (equalCharacteristicLubinTateIntegralPiPolynomial F).comp^[n] Polynomial.X + +/-- The `n`-fold integral `π`-iterate has degree `q ^ n`. -/ +theorem equalCharacteristicLubinTateIntegralPiPolynomialIterate_natDegree + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicLubinTateIntegralPiPolynomialIterate F n).natDegree = + Nat.card F.residueField ^ n := by + rw [equalCharacteristicLubinTateIntegralPiPolynomialIterate, + Polynomial.natDegree_iterate_comp, + equalCharacteristicLubinTateIntegralPiPolynomial_natDegree, + Polynomial.natDegree_X, mul_one] + +/-- A successor integral `π`-iterate is obtained by one further composition. -/ +theorem equalCharacteristicLubinTateIntegralPiPolynomialIterate_succ + (F : LocalField.{u, v} K) (n : ℕ) : + equalCharacteristicLubinTateIntegralPiPolynomialIterate F (n + 1) = + (equalCharacteristicLubinTateIntegralPiPolynomial F).comp + (equalCharacteristicLubinTateIntegralPiPolynomialIterate F n) := by + rw [equalCharacteristicLubinTateIntegralPiPolynomialIterate, + Function.iterate_succ_apply'] + rfl + +/-- Every iterate of the integral Lubin–Tate `π`-polynomial is monic. -/ +theorem equalCharacteristicLubinTateIntegralPiPolynomialIterate_monic + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicLubinTateIntegralPiPolynomialIterate F n).Monic := by + induction n with + | zero => simp [equalCharacteristicLubinTateIntegralPiPolynomialIterate] + | succ n ih => + rw [equalCharacteristicLubinTateIntegralPiPolynomialIterate_succ] + exact (equalCharacteristicLubinTateIntegralPiPolynomial_monic F).comp ih + (by + rw [equalCharacteristicLubinTateIntegralPiPolynomialIterate_natDegree] + exact pow_ne_zero n (ne_of_gt + (Nat.zero_lt_one.trans + (Finite.one_lt_card : 1 < Nat.card F.residueField)))) + +/-- Base change carries the integral `π`-polynomial to the Laurent-field `π`-polynomial. -/ +theorem equalCharacteristicLubinTateIntegralPiPolynomial_map + (F : LocalField.{u, v} K) : + (equalCharacteristicLubinTateIntegralPiPolynomial F).map + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩) = + equalCharacteristicLubinTatePiPolynomial F := by + simp [equalCharacteristicLubinTateIntegralPiPolynomial, + equalCharacteristicLubinTatePiPolynomial, + equalCharacteristicLaurentUniformizer] + +/-- Base change commutes with iteration of the integral `π`-polynomial. -/ +theorem equalCharacteristicLubinTateIntegralPiPolynomialIterate_map + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicLubinTateIntegralPiPolynomialIterate F n).map + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩) = + equalCharacteristicLubinTatePiPolynomialIterate F n := by + induction n with + | zero => + simp [equalCharacteristicLubinTateIntegralPiPolynomialIterate, + equalCharacteristicLubinTatePiPolynomialIterate] + | succ n ih => + rw [equalCharacteristicLubinTateIntegralPiPolynomialIterate_succ, + equalCharacteristicLubinTatePiPolynomialIterate_succ, + Polynomial.map_comp, + equalCharacteristicLubinTateIntegralPiPolynomial_map, ih] + +/-- Reducing coefficients sends the integral `π`-polynomial to `X ^ q`. -/ +theorem equalCharacteristicLubinTateIntegralPiPolynomial_map_constantCoeff + (F : LocalField.{u, v} K) : + (equalCharacteristicLubinTateIntegralPiPolynomial F).map + (PowerSeries.constantCoeff (R := F.residueField)) = + Polynomial.X ^ Nat.card F.residueField := by + simp [equalCharacteristicLubinTateIntegralPiPolynomial] + +/-- Reducing coefficients sends the `n`-fold integral `π`-iterate to `X ^ (q ^ n)`. -/ +theorem equalCharacteristicLubinTateIntegralPiPolynomialIterate_map_constantCoeff + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicLubinTateIntegralPiPolynomialIterate F n).map + (PowerSeries.constantCoeff (R := F.residueField)) = + Polynomial.X ^ (Nat.card F.residueField ^ n) := by + induction n with + | zero => + simp [equalCharacteristicLubinTateIntegralPiPolynomialIterate] + | succ n ih => + rw [equalCharacteristicLubinTateIntegralPiPolynomialIterate_succ, + Polynomial.map_comp, + equalCharacteristicLubinTateIntegralPiPolynomial_map_constantCoeff, + ih] + simp [← pow_mul, pow_succ] + +/-- Every integral `π`-iterate vanishes at zero. -/ +theorem equalCharacteristicLubinTateIntegralPiPolynomialIterate_eval_zero + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicLubinTateIntegralPiPolynomialIterate F n).eval 0 = 0 := by + induction n with + | zero => + simp [equalCharacteristicLubinTateIntegralPiPolynomialIterate] + | succ n ih => + rw [equalCharacteristicLubinTateIntegralPiPolynomialIterate_succ, + Polynomial.eval_comp, ih] + simp [equalCharacteristicLubinTateIntegralPiPolynomial, + ne_of_gt (Nat.zero_lt_one.trans + (Finite.one_lt_card : 1 < Nat.card F.residueField))] + +/-- The integral lift of the primitive level-`n+1` polynomial. -/ +noncomputable def equalCharacteristicLubinTateIntegralPrimitivePolynomial + (F : LocalField.{u, v} K) (n : ℕ) : + Polynomial F.residueField⟦X⟧ := + equalCharacteristicLubinTateIntegralPiPolynomialIterate F n ^ + (Nat.card F.residueField - 1) + + Polynomial.C (PowerSeries.X : F.residueField⟦X⟧) + +/-- The integral primitive polynomial has degree `(q - 1) * q ^ n`. -/ +theorem equalCharacteristicLubinTateIntegralPrimitivePolynomial_natDegree + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicLubinTateIntegralPrimitivePolynomial F n).natDegree = + (Nat.card F.residueField - 1) * Nat.card F.residueField ^ n := by + rw [equalCharacteristicLubinTateIntegralPrimitivePolynomial] + have hpos : + 0 < (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := + Nat.mul_pos (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (Nat.pow_pos Nat.card_pos) + rw [Polynomial.natDegree_add_eq_left_of_natDegree_lt] + · rw [Polynomial.natDegree_pow, + equalCharacteristicLubinTateIntegralPiPolynomialIterate_natDegree] + · rw [Polynomial.natDegree_pow, + equalCharacteristicLubinTateIntegralPiPolynomialIterate_natDegree, + Polynomial.natDegree_C] + exact hpos + +/-- The integral primitive polynomial is monic. -/ +theorem equalCharacteristicLubinTateIntegralPrimitivePolynomial_monic + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicLubinTateIntegralPrimitivePolynomial F n).Monic := by + rw [equalCharacteristicLubinTateIntegralPrimitivePolynomial] + let A := equalCharacteristicLubinTateIntegralPiPolynomialIterate F n + have hA : A.Monic := + equalCharacteristicLubinTateIntegralPiPolynomialIterate_monic F n + have hmain : (A ^ (Nat.card F.residueField - 1)).Monic := + hA.pow _ + refine hmain.add_of_left ?_ + rw [Polynomial.degree_C (PowerSeries.X_ne_zero), + Polynomial.degree_eq_natDegree hmain.ne_zero, + Polynomial.natDegree_pow, + equalCharacteristicLubinTateIntegralPiPolynomialIterate_natDegree] + exact_mod_cast Nat.mul_pos + (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (Nat.pow_pos Nat.card_pos) + +/-- Base change carries the integral primitive polynomial to its Laurent-field counterpart. -/ +theorem equalCharacteristicLubinTateIntegralPrimitivePolynomial_map + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicLubinTateIntegralPrimitivePolynomial F n).map + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩) = + equalCharacteristicLubinTatePrimitivePolynomial F n := by + simp [equalCharacteristicLubinTateIntegralPrimitivePolynomial, + equalCharacteristicLubinTatePrimitivePolynomial, + equalCharacteristicLubinTateIntegralPiPolynomialIterate_map, + equalCharacteristicLaurentUniformizer] + +/-- Reducing the integral primitive polynomial yields its leading monomial. -/ +theorem equalCharacteristicLubinTateIntegralPrimitivePolynomial_map_constantCoeff + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicLubinTateIntegralPrimitivePolynomial F n).map + (PowerSeries.constantCoeff (R := F.residueField)) = + Polynomial.X ^ + ((Nat.card F.residueField - 1) * Nat.card F.residueField ^ n) := by + simp [equalCharacteristicLubinTateIntegralPrimitivePolynomial, + equalCharacteristicLubinTateIntegralPiPolynomialIterate_map_constantCoeff, + ← pow_mul, Nat.mul_comm] + +/-- The integral primitive polynomial has constant coefficient `X`. -/ +theorem equalCharacteristicLubinTateIntegralPrimitivePolynomial_coeff_zero + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicLubinTateIntegralPrimitivePolynomial F n).coeff 0 = + (PowerSeries.X : F.residueField⟦X⟧) := by + rw [Polynomial.coeff_zero_eq_eval_zero] + simp [equalCharacteristicLubinTateIntegralPrimitivePolynomial, + equalCharacteristicLubinTateIntegralPiPolynomialIterate_eval_zero, + ne_of_gt (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField))] + +/-- The power-series parameter `X` does not lie in the square of its principal ideal. -/ +theorem powerSeries_X_notMem_span_X_sq + (k : Type*) [Field k] : + (PowerSeries.X : k⟦X⟧) ∉ + (Ideal.span ({PowerSeries.X} : Set k⟦X⟧)) ^ 2 := by + rw [Ideal.span_singleton_pow, Ideal.mem_span_singleton] + intro h + obtain ⟨a, ha⟩ := h + have hunit : IsUnit (PowerSeries.X : k⟦X⟧) := by + rw [isUnit_iff_dvd_one] + refine ⟨a, ?_⟩ + apply mul_left_cancel₀ (PowerSeries.X_ne_zero (R := k)) + simpa [pow_two, mul_assoc] using ha.symm + exact PowerSeries.X_prime.not_isUnit hunit + +/-- The integral primitive polynomial is Eisenstein at `(T)`. -/ +theorem equalCharacteristicLubinTateIntegralPrimitivePolynomial_isEisensteinAt + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicLubinTateIntegralPrimitivePolynomial F n).IsEisensteinAt + (Ideal.span ({PowerSeries.X} : Set F.residueField⟦X⟧)) := by + let Q := equalCharacteristicLubinTateIntegralPrimitivePolynomial F n + let d := (Nat.card F.residueField - 1) * Nat.card F.residueField ^ n + have hmonic : Q.Monic := + equalCharacteristicLubinTateIntegralPrimitivePolynomial_monic F n + refine hmonic.isEisensteinAt_of_mem_of_notMem + PowerSeries.span_X_isPrime.ne_top ?_ ?_ + · intro i hi + rw [Ideal.mem_span_singleton, PowerSeries.X_dvd_iff] + have hcoeff : + PowerSeries.constantCoeff + ((equalCharacteristicLubinTateIntegralPrimitivePolynomial F n).coeff i) = + (Polynomial.X ^ d : Polynomial F.residueField).coeff i := by + simpa only [Polynomial.coeff_map, d] using + congrArg (fun p : Polynomial F.residueField ↦ p.coeff i) + (equalCharacteristicLubinTateIntegralPrimitivePolynomial_map_constantCoeff F n) + have hid : i < d := by + simpa [Q, d, + equalCharacteristicLubinTateIntegralPrimitivePolynomial_natDegree] using hi + simpa [d, Polynomial.coeff_X_pow, ne_of_lt hid] using hcoeff + · rw [equalCharacteristicLubinTateIntegralPrimitivePolynomial_coeff_zero] + exact powerSeries_X_notMem_span_X_sq F.residueField + +/-- The integral primitive polynomial is irreducible by Eisenstein's criterion. -/ +theorem equalCharacteristicLubinTateIntegralPrimitivePolynomial_irreducible + (F : LocalField.{u, v} K) (n : ℕ) : + Irreducible (equalCharacteristicLubinTateIntegralPrimitivePolynomial F n) := by + apply (equalCharacteristicLubinTateIntegralPrimitivePolynomial_isEisensteinAt F n).irreducible + PowerSeries.span_X_isPrime + (equalCharacteristicLubinTateIntegralPrimitivePolynomial_monic F n).isPrimitive + rw [equalCharacteristicLubinTateIntegralPrimitivePolynomial_natDegree] + exact Nat.mul_pos + (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (Nat.pow_pos Nat.card_pos) + +/-- The primitive polynomial over `κ((T))` is monic. -/ +theorem equalCharacteristicLubinTatePrimitivePolynomial_monic + (F : LocalField.{u, v} K) (n : ℕ) : + (equalCharacteristicLubinTatePrimitivePolynomial F n).Monic := by + rw [← equalCharacteristicLubinTateIntegralPrimitivePolynomial_map] + exact (equalCharacteristicLubinTateIntegralPrimitivePolynomial_monic F n).map _ + +/-- The primitive level-`n+1` polynomial over `κ((T))` is irreducible. -/ +theorem equalCharacteristicLubinTatePrimitivePolynomial_irreducible + (F : LocalField.{u, v} K) (n : ℕ) : + Irreducible (equalCharacteristicLubinTatePrimitivePolynomial F n) := by + have hmap : + Irreducible + ((equalCharacteristicLubinTateIntegralPrimitivePolynomial F n).map + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩)) := + (equalCharacteristicLubinTateIntegralPrimitivePolynomial_monic F + n).irreducible_iff_irreducible_map_fraction_map.mp + (equalCharacteristicLubinTateIntegralPrimitivePolynomial_irreducible F n) + simpa [equalCharacteristicLubinTateIntegralPrimitivePolynomial_map] using hmap + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveTorsion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveTorsion.lean new file mode 100644 index 0000000000..69e65cc40a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveTorsion.lean @@ -0,0 +1,150 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial +/-! +# The uniformizer norm identity: primitive equal-characteristic division points + +The primitive factor `Q_(n+1)` constructed in the preceding file has roots +which are killed by the `(n+1)`-st Lubin--Tate iterate but not by the `n`-th +iterate. This file chooses one such root in the fixed separable closure and +records that exact-level property. No irreducibility or Galois assertion is +used here. +-/ + +@[expose] public section + +noncomputable +section + +open scoped PowerSeries LaurentSeries Polynomial + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- A chosen root of the primitive level-`n+1` division polynomial in the +fixed separable closure of `κ((T))`. -/ +noncomputable def chosenEqualCharacteristicLubinTatePrimitiveRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : SeparableClosure F.residueField⸨X⸩ := + Classical.choose + (exists_equalCharacteristicLubinTatePrimitivePolynomial_root F n) + +/-- The chosen primitive division point is a root of `Q_(n+1)`. -/ +theorem chosenEqualCharacteristicLubinTatePrimitiveRoot_isRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + ((equalCharacteristicLubinTatePrimitivePolynomial F n).map + (equalCharacteristicSeparableBaseHom F)).IsRoot + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) := + Classical.choose_spec + (exists_equalCharacteristicLubinTatePrimitivePolynomial_root F n) + +/-- Evaluation of `Q_(n+1)` is the defining primitive-division equation. -/ +theorem equalCharacteristicLubinTatePrimitivePolynomial_eval₂ + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {A : Type*} [Field A] [CharP A F.residueCharacteristic] + (φ : F.residueField⸨X⸩ →+* A) (n : ℕ) (x : A) : + Polynomial.eval₂ φ x + (equalCharacteristicLubinTatePrimitivePolynomial F n) = + equalCharacteristicLubinTateAmbientPiIterate F + (φ (equalCharacteristicLaurentUniformizer F)) n x ^ + (Nat.card F.residueField - 1) + + φ (equalCharacteristicLaurentUniformizer F) := by + rw [equalCharacteristicLubinTatePrimitivePolynomial, + Polynomial.eval₂_add, Polynomial.eval₂_pow, + equalCharacteristicLubinTatePiPolynomialIterate_eval₂, + Polynomial.eval₂_C] + +/-- The chosen root satisfies the primitive-division equation. -/ +theorem chosenEqualCharacteristicLubinTatePrimitiveRoot_equation + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicSeparableUniformizer F) n + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) ^ + (Nat.card F.residueField - 1) + + equalCharacteristicSeparableUniformizer F = 0 := by + have hroot := chosenEqualCharacteristicLubinTatePrimitiveRoot_isRoot F n + change Polynomial.eval + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) + ((equalCharacteristicLubinTatePrimitivePolynomial F n).map + (equalCharacteristicSeparableBaseHom F)) = 0 at hroot + rw [Polynomial.eval_map, + equalCharacteristicLubinTatePrimitivePolynomial_eval₂] at hroot + exact hroot + +/-- A primitive level-`n+1` point is killed by the next division +polynomial. -/ +theorem chosenEqualCharacteristicLubinTatePrimitiveRoot_torsion + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + IsEqualCharacteristicLubinTateAmbientTorsion F + (equalCharacteristicSeparableUniformizer F) (n + 1) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) := by + change equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicSeparableUniformizer F) (n + 1) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) = 0 + have hroot := chosenEqualCharacteristicLubinTatePrimitiveRoot_isRoot F n + have hfactor := congrArg + (Polynomial.eval₂ (equalCharacteristicSeparableBaseHom F) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n)) + (equalCharacteristicLubinTatePiPolynomialIterate_succ_factor F n) + rw [Polynomial.eval₂_mul] at hfactor + have hQ : Polynomial.eval₂ (equalCharacteristicSeparableBaseHom F) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) + (equalCharacteristicLubinTatePrimitivePolynomial F n) = 0 := by + simpa [Polynomial.IsRoot, Polynomial.eval_map] using hroot + rw [hQ, mul_zero] at hfactor + rw [equalCharacteristicLubinTatePiPolynomialIterate_eval₂] at hfactor + exact hfactor + +/-- The chosen root is not already a level-`n` division point. -/ +theorem chosenEqualCharacteristicLubinTatePrimitiveRoot_not_torsion_pred + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + ¬ IsEqualCharacteristicLubinTateAmbientTorsion F + (equalCharacteristicSeparableUniformizer F) n + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) := by + intro hpred + have heq := chosenEqualCharacteristicLubinTatePrimitiveRoot_equation F n + rw [hpred, zero_pow, zero_add] at heq + · apply equalCharacteristicLaurentUniformizer_ne_zero F + apply (equalCharacteristicSeparableBaseHom F).injective + simpa [equalCharacteristicSeparableUniformizer] using heq + · exact Nat.sub_ne_zero_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField) + +/-- In particular, a primitive division point is nonzero. -/ +theorem chosenEqualCharacteristicLubinTatePrimitiveRoot_ne_zero + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + chosenEqualCharacteristicLubinTatePrimitiveRoot F n ≠ 0 := by + intro hzero + apply chosenEqualCharacteristicLubinTatePrimitiveRoot_not_torsion_pred F n + change equalCharacteristicLubinTateAmbientPiIterate F + (equalCharacteristicSeparableUniformizer F) n + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) = 0 + rw [hzero, map_zero] + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/UnitQuotientGalois.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/UnitQuotientGalois.lean new file mode 100644 index 0000000000..d2ac6a7afd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/UnitQuotientGalois.lean @@ -0,0 +1,453 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedPrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedPolynomialEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizerNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusBaseEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldCoefficientDescent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPowerBasis +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPrimitive +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectBracketAtCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracketRecursion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectTargetLevelEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFirstIdentity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFrobeniusFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaIteration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaAtCompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaLocalInverse +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.AmbientBracketAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.DivisionModuleEndomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateEndomorphism +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CoefficientFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CompletedUnramifiedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.ContractingEquation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.LaurentSeriesFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFrobeniusFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitsNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.LevelAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.StandardSubgroupNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitQuotientCard +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaCoefficients +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaUniqueness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.RealIndexSteps +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FreeRankOne +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelFieldTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion +/-! +# Equal-characteristic Lubin--Tate unit quotients and Galois groups + +This file constructs the finite-level Galois action of a power-series unit +with the local-Artin orientation: `a` sends the chosen primitive generator +to `[a⁻¹]`. Its kernel is the `(n + 1)`-st higher-unit subgroup, so the +action descends to a multiplicative equivalence from the finite unit +quotient to the Galois group. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries PowerSeries Polynomial + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LubinTate.EqualCharacteristic + +variable {K : Type u} [Field K] + +/-- The finite-level root obtained from the Artin-oriented bracket `[a⁻¹]`. -/ +noncomputable def equalCharacteristicLubinTateArtinUnitLevelRoot + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicLubinTateLevelField F n := + equalCharacteristicLubinTateLevelBracket F n (n + 1) + ((a⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) + (equalCharacteristicLubinTateLevelPowerBasis F n).gen + +/-- The Artin-oriented unit root annihilates the generator's minimal +polynomial. -/ +theorem equalCharacteristicLubinTateArtinUnitLevelRoot_aeval_minpoly + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + Polynomial.aeval + (equalCharacteristicLubinTateArtinUnitLevelRoot F n a) + (minpoly F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelPowerBasis F n).gen) = 0 := by + rw [equalCharacteristicLubinTateLevelPowerBasis_minpoly] + let ι : equalCharacteristicLubinTateLevelField F n →ₐ[ + F.residueField⸨X⸩] SeparableClosure F.residueField⸨X⸩ := + (equalCharacteristicLubinTateLevelField F n).val + apply ι.injective + change ι (Polynomial.aeval + (equalCharacteristicLubinTateArtinUnitLevelRoot F n a) + (equalCharacteristicLubinTatePrimitivePolynomial F n)) = ι 0 + rw [← Polynomial.aeval_algHom_apply (f := ι), map_zero] + rw [Polynomial.aeval_def, + ← equalCharacteristicSeparableBaseHom_eq_algebraMap] + change Polynomial.eval₂ + (equalCharacteristicSeparableBaseHom F) + (equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + ((a⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n)) + (equalCharacteristicLubinTatePrimitivePolynomial F n) = 0 + simpa [Polynomial.IsRoot, Polynomial.eval_map] using + (equalCharacteristicLubinTatePrimitivePolynomial_isRoot_bracket + F n a⁻¹) + +/-- The finite-level algebra endomorphism with Artin orientation. -/ +noncomputable def equalCharacteristicLubinTateArtinUnitAlgHom + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicLubinTateLevelField F n →ₐ[F.residueField⸨X⸩] + equalCharacteristicLubinTateLevelField F n := + (equalCharacteristicLubinTateLevelPowerBasis F n).lift + (equalCharacteristicLubinTateArtinUnitLevelRoot F n a) + (equalCharacteristicLubinTateArtinUnitLevelRoot_aeval_minpoly F n a) + +@[simp] +theorem equalCharacteristicLubinTateArtinUnitAlgHom_apply_gen + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicLubinTateArtinUnitAlgHom F n a + (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + equalCharacteristicLubinTateArtinUnitLevelRoot F n a := + (equalCharacteristicLubinTateLevelPowerBasis F n).lift_gen _ _ + +/-- The finite-level Galois automorphism whose generator action is +`[a⁻¹]`. -/ +noncomputable def equalCharacteristicLubinTateArtinUnitAlgEquiv + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicLubinTateLevelField F n ≃ₐ[F.residueField⸨X⸩] + equalCharacteristicLubinTateLevelField F n := by + letI : FiniteDimensional F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + exact AlgEquiv.ofBijective + (equalCharacteristicLubinTateArtinUnitAlgHom F n a) + (AlgHom.bijective (equalCharacteristicLubinTateArtinUnitAlgHom F n a)) + +@[simp] +theorem equalCharacteristicLubinTateArtinUnitAlgEquiv_apply_gen + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicLubinTateArtinUnitAlgEquiv F n a + (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + equalCharacteristicLubinTateArtinUnitLevelRoot F n a := by + rw [equalCharacteristicLubinTateArtinUnitAlgEquiv, + AlgEquiv.ofBijective_apply, + equalCharacteristicLubinTateArtinUnitAlgHom_apply_gen] + +theorem equalCharacteristicLubinTateArtinUnitAlgEquiv_one + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicLubinTateArtinUnitAlgEquiv F n 1 = 1 := by + apply MulSemiringAction.toAlgHom_injective F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) + apply (equalCharacteristicLubinTateLevelPowerBasis F n).algHom_ext + simp only [MulSemiringAction.toAlgHom_apply, one_smul, + AlgEquiv.smul_def] + rw [equalCharacteristicLubinTateArtinUnitAlgEquiv_apply_gen] + apply Subtype.ext + change + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (((1 : F.residueField⟦X⟧ˣ)⁻¹ : + F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) = + chosenEqualCharacteristicLubinTatePrimitiveRoot F n + simpa using + (equalCharacteristicLubinTateAmbientBracket_one_apply_of_torsion F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) + (chosenEqualCharacteristicLubinTatePrimitiveRoot_torsion F n)) + +theorem equalCharacteristicLubinTateArtinUnitAlgEquiv_mul + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a b : F.residueField⟦X⟧ˣ) : + equalCharacteristicLubinTateArtinUnitAlgEquiv F n (a * b) = + equalCharacteristicLubinTateArtinUnitAlgEquiv F n a * + equalCharacteristicLubinTateArtinUnitAlgEquiv F n b := by + apply MulSemiringAction.toAlgHom_injective F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) + apply (equalCharacteristicLubinTateLevelPowerBasis F n).algHom_ext + simp only [MulSemiringAction.toAlgHom_apply, mul_smul, + AlgEquiv.smul_def] + rw [equalCharacteristicLubinTateArtinUnitAlgEquiv_apply_gen, + equalCharacteristicLubinTateArtinUnitAlgEquiv_apply_gen] + unfold equalCharacteristicLubinTateArtinUnitLevelRoot + have hmap : + equalCharacteristicLubinTateArtinUnitAlgEquiv F n a + (equalCharacteristicLubinTateLevelBracket F n (n + 1) + ((b⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) + (equalCharacteristicLubinTateLevelPowerBasis F n).gen) = + equalCharacteristicLubinTateLevelBracket F n (n + 1) + ((b⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) + (equalCharacteristicLubinTateArtinUnitAlgEquiv F n a + (equalCharacteristicLubinTateLevelPowerBasis F n).gen) := by + simpa only [AlgEquiv.toAlgHom_apply] using + (equalCharacteristicLubinTateLevelBracket_map F n (n + 1) + ((b⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) + (equalCharacteristicLubinTateArtinUnitAlgEquiv F n a).toAlgHom + (equalCharacteristicLubinTateLevelPowerBasis F n).gen) + rw [hmap, equalCharacteristicLubinTateArtinUnitAlgEquiv_apply_gen] + apply Subtype.ext + change + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + ((((a * b)⁻¹ : F.residueField⟦X⟧ˣ)) : + F.residueField⟦X⟧) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) = + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + ((b⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) + (equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + ((a⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n)) + rw [← equalCharacteristicLubinTateAmbientBracket_mul_apply_of_torsion + F (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + ((b⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) + ((a⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) + (chosenEqualCharacteristicLubinTatePrimitiveRoot_torsion F n)] + congr 2 + +/-- Power-series units acting on the finite Lubin--Tate level with Artin +orientation. -/ +noncomputable def equalCharacteristicLubinTateArtinUnitToGal + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + F.residueField⟦X⟧ˣ →* + Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩) where + toFun := equalCharacteristicLubinTateArtinUnitAlgEquiv F n + map_one' := equalCharacteristicLubinTateArtinUnitAlgEquiv_one F n + map_mul' := equalCharacteristicLubinTateArtinUnitAlgEquiv_mul F n + +@[simp] +theorem equalCharacteristicLubinTateArtinUnitToGal_apply_gen + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicLubinTateArtinUnitToGal F n a + (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + equalCharacteristicLubinTateArtinUnitLevelRoot F n a := + equalCharacteristicLubinTateArtinUnitAlgEquiv_apply_gen F n a + +/-- The kernel of the Artin-oriented explicit unit action is the level +higher-unit subgroup. -/ +theorem equalCharacteristicLubinTateArtinUnitToGal_ker + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + MonoidHom.ker (equalCharacteristicLubinTateArtinUnitToGal F n) = + equalCharacteristicLubinTateHigherUnitSubgroup F n := by + ext a + rw [MonoidHom.mem_ker] + constructor + · intro ha + have hgen := congrArg + (fun σ : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩) => + σ (equalCharacteristicLubinTateLevelPowerBasis F n).gen) ha + rw [equalCharacteristicLubinTateArtinUnitToGal_apply_gen] at hgen + simp only [AlgEquiv.one_apply] at hgen + have hgen' := congrArg Subtype.val hgen + change + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + ((a⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) = + chosenEqualCharacteristicLubinTatePrimitiveRoot F n at hgen' + exact + (equalCharacteristicLubinTateAmbientBracket_inv_primitiveRoot_eq_iff_mem_higherUnitSubgroup + F n a).1 hgen' + · intro ha + apply MulSemiringAction.toAlgHom_injective F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) + apply (equalCharacteristicLubinTateLevelPowerBasis F n).algHom_ext + simp only [MulSemiringAction.toAlgHom_apply, one_smul, + AlgEquiv.smul_def] + rw [equalCharacteristicLubinTateArtinUnitToGal_apply_gen] + apply Subtype.ext + exact + (equalCharacteristicLubinTateAmbientBracket_inv_primitiveRoot_eq_iff_mem_higherUnitSubgroup + F n a).2 ha + +/-- A visible finite parameter is obtained from the Artin-oriented unit +action by inverting its represented power-series unit. -/ +theorem equalCharacteristicLubinTateArtinUnitToGal_parameterUnit_inv + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (p : equalCharacteristicLubinTateUnitParameter F n) : + equalCharacteristicLubinTateArtinUnitToGal F n + (equalCharacteristicLubinTateUnitParameterUnit F n p)⁻¹ = + equalCharacteristicLubinTateUnitParameterAlgEquiv F n p := by + apply MulSemiringAction.toAlgHom_injective F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) + apply (equalCharacteristicLubinTateLevelPowerBasis F n).algHom_ext + simp only [MulSemiringAction.toAlgHom_apply, AlgEquiv.smul_def] + rw [equalCharacteristicLubinTateArtinUnitToGal_apply_gen, + equalCharacteristicLubinTateUnitParameterAlgEquiv_apply_gen] + apply Subtype.ext + simp only [equalCharacteristicLubinTateArtinUnitLevelRoot, + equalCharacteristicLubinTateLevelBracket_coe, + equalCharacteristicLubinTateUnitParameterLevelRoot_coe, + equalCharacteristicLubinTateUnitParameterRoot, inv_inv, + equalCharacteristicLubinTateUnitParameterUnit_val, + equalCharacteristicLubinTateLevelPowerBasis_gen_coe] + +/-- Every finite-level Galois automorphism is induced by an Artin-oriented +power-series unit. -/ +theorem equalCharacteristicLubinTateArtinUnitToGal_surjective + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Function.Surjective + (equalCharacteristicLubinTateArtinUnitToGal F n) := by + intro σ + obtain ⟨p, hp⟩ := + equalCharacteristicLubinTateLevelField_exists_unitParameter F n σ + refine ⟨(equalCharacteristicLubinTateUnitParameterUnit F n p)⁻¹, ?_⟩ + exact (equalCharacteristicLubinTateArtinUnitToGal_parameterUnit_inv + F n p).trans hp.symm + +/-- The Artin-oriented explicit finite-level reciprocity equivalence from +the unit quotient. -/ +noncomputable def equalCharacteristicLubinTateArtinUnitQuotientEquivGal + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + F.residueField⟦X⟧ˣ ⧸ + equalCharacteristicLubinTateHigherUnitSubgroup F n ≃* + Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩) := + (QuotientGroup.quotientMulEquivOfEq + (equalCharacteristicLubinTateArtinUnitToGal_ker F n).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (equalCharacteristicLubinTateArtinUnitToGal F n) + (equalCharacteristicLubinTateArtinUnitToGal_surjective F n)) + +@[simp] +theorem equalCharacteristicLubinTateArtinUnitQuotientEquivGal_mk + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicLubinTateArtinUnitQuotientEquivGal F n + (QuotientGroup.mk a) = + equalCharacteristicLubinTateArtinUnitToGal F n a := by + simp only [equalCharacteristicLubinTateArtinUnitQuotientEquivGal, + MulEquiv.trans_apply, QuotientGroup.quotientMulEquivOfEq_mk] + rfl + +/-- On a representative, the quotient-to-Galois equivalence is the inverse +orientation of the existing quotient action on the primitive torsion +point. -/ +theorem + equalCharacteristicLubinTateArtinUnitQuotientEquivGal_mk_apply_gen_coe + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + ((equalCharacteristicLubinTateArtinUnitQuotientEquivGal F n + (QuotientGroup.mk a)) + (equalCharacteristicLubinTateLevelPowerBasis F n).gen : + SeparableClosure F.residueField⸨X⸩) = + (equalCharacteristicLubinTateUnitQuotientAutomorphismEquiv F n + (QuotientGroup.mk a⁻¹) + (⟨chosenEqualCharacteristicLubinTatePrimitiveRoot F n, + chosenEqualCharacteristicLubinTatePrimitiveRoot_torsion F n⟩ : + equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1))).1 := by + rw [equalCharacteristicLubinTateArtinUnitQuotientEquivGal_mk, + equalCharacteristicLubinTateArtinUnitToGal_apply_gen] + rw [equalCharacteristicLubinTateUnitQuotientAutomorphismEquiv_mk_apply] + rfl + +/-- Kernel membership in pointwise form. -/ +theorem equalCharacteristicLubinTateArtinUnitToGal_eq_one_iff + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicLubinTateArtinUnitToGal F n a = 1 ↔ + a ∈ equalCharacteristicLubinTateHigherUnitSubgroup F n := by + rw [← MonoidHom.mem_ker, + equalCharacteristicLubinTateArtinUnitToGal_ker] + +/-- The explicit congruence criterion for trivial finite-level action. -/ +theorem equalCharacteristicLubinTateArtinUnitToGal_eq_one_iff_sub_one_mem + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicLubinTateArtinUnitToGal F n a = 1 ↔ + (a : F.residueField⟦X⟧) - 1 ∈ + Ideal.span + ({PowerSeries.X ^ (n + 1)} : Set F.residueField⟦X⟧) := + (equalCharacteristicLubinTateArtinUnitToGal_eq_one_iff F n a).trans + (mem_equalCharacteristicLubinTateHigherUnitSubgroup F n a) + +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule.lean new file mode 100644 index 0000000000..3fad65924f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.AmbientBracketAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.DivisionModuleEndomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateEndomorphism + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/All.lean new file mode 100644 index 0000000000..879ca98ec0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/All.lean @@ -0,0 +1,19 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.AmbientBracketAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.DivisionModuleEndomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateEndomorphism +/-! +# Equal-characteristic Lubin--Tate formal modules + +Public aggregate for the Lubin--Tate action and its division-module +endomorphisms. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/AmbientBracketAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/AmbientBracketAction.lean new file mode 100644 index 0000000000..9617a5fedc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/AmbientBracketAction.lean @@ -0,0 +1,563 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction +/-! +# The finite Lubin–Tate bracket construction: Lubin--Tate brackets in an ambient extension field + +Division points do not in general lie in the base Laurent-series field. This +file therefore constructs the same genuine brackets in an arbitrary ambient +field `A` of the same characteristic, from a chosen coefficient embedding +`ι : κ →+* A` and the image `t : A` of the Laurent-series uniformizer. The +construction will be specialized to a separable closure when forming the +Lubin--Tate level fields. +-/ + +@[expose] public section + +noncomputable +section + +open scoped PowerSeries LaurentSeries + +universe u v w + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +private theorem ambientAddMonoidEnd_mul_apply + {A : Type*} [AddCommMonoid A] + (f g : AddMonoid.End A) (x : A) : + (f * g) x = f (g x) := + rfl + +private theorem ambientAddMonoidEnd_sum_apply + {A I : Type*} [AddCommMonoid A] + (s : Finset I) (f : I → AddMonoid.End A) (x : A) : + (∑ i ∈ s, f i) x = ∑ i ∈ s, f i x := by + classical + induction s using Finset.induction_on with + | empty => simp + | @insert i s hi ih => + rw [Finset.sum_insert hi, Finset.sum_insert hi] + change f i x + (∑ j ∈ s, f j) x = f i x + ∑ j ∈ s, f j x + rw [ih] + +private theorem ambientAddMonoidHom_map_finset_sum + {A I : Type*} [AddCommMonoid A] + (f : AddMonoid.End A) (s : Finset I) (g : I → A) : + f (∑ i ∈ s, g i) = ∑ i ∈ s, f (g i) := by + classical + induction s using Finset.induction_on with + | empty => simp + | @insert i s hi ih => + rw [Finset.sum_insert hi, Finset.sum_insert hi] + exact (f.map_add _ _).trans + (congrArg (fun x ↦ f (g i) + x) ih) + +/-- The distinguished endomorphism `Y ↦ Y^q + tY` in an ambient field. -/ +noncomputable def equalCharacteristicLubinTateAmbientPiEnd + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (t : A) : AddMonoid.End A where + toFun x := + iterateFrobenius A F.residueCharacteristic + (CompleteDVF.higherPrincipalUnitGroup.iwasawaResidueRank F) x + + t * x + map_zero' := by simp + map_add' x y := by + rw [(iterateFrobenius A F.residueCharacteristic + (CompleteDVF.higherPrincipalUnitGroup.iwasawaResidueRank F)).map_add, + mul_add] + abel + +open CompleteDVF.higherPrincipalUnitGroup renaming + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank → + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank in +/-- The ambient `π`-endomorphism is Frobenius plus multiplication by `t`. -/ +@[simp] +theorem equalCharacteristicLubinTateAmbientPiEnd_apply + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (t x : A) : + equalCharacteristicLubinTateAmbientPiEnd F t x = + x ^ Nat.card F.residueField + t * x := by + change + iterateFrobenius A F.residueCharacteristic + (CompleteDVF.higherPrincipalUnitGroup.iwasawaResidueRank F) x + + t * x = _ + rw [iterateFrobenius_def] + rw [residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F] + +/-- Multiplication by an embedded residue-field coefficient. -/ +noncomputable def equalCharacteristicLubinTateAmbientCoefficientEnd + (F : LocalField.{u, v} K) + {A : Type w} [Field A] + (ι : F.residueField →+* A) (a : F.residueField) : + AddMonoid.End A where + toFun x := ι a * x + map_zero' := mul_zero _ + map_add' := mul_add _ + +/-- A coefficient endomorphism acts by multiplication by the embedded coefficient. -/ +@[simp] +theorem equalCharacteristicLubinTateAmbientCoefficientEnd_apply + (F : LocalField.{u, v} K) + {A : Type w} [Field A] + (ι : F.residueField →+* A) (a : F.residueField) (x : A) : + equalCharacteristicLubinTateAmbientCoefficientEnd F ι a x = ι a * x := + rfl + +/-- The distinguished endomorphism commutes with the embedded coefficient +field. -/ +theorem equalCharacteristicLubinTateAmbientPiEnd_coefficient_mul + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (a : F.residueField) (x : A) : + equalCharacteristicLubinTateAmbientPiEnd F t (ι a * x) = + ι a * equalCharacteristicLubinTateAmbientPiEnd F t x := by + let : Fintype F.residueField := Fintype.ofFinite F.residueField + rw [equalCharacteristicLubinTateAmbientPiEnd_apply, + equalCharacteristicLubinTateAmbientPiEnd_apply, mul_pow, ← ι.map_pow] + have ha : a ^ Nat.card F.residueField = a := by + simpa only [Nat.card_eq_fintype_card] using FiniteField.pow_card a + rw [ha] + ring + +/-- The `i`-fold iterate of the ambient distinguished endomorphism. -/ +noncomputable def equalCharacteristicLubinTateAmbientPiIterate + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (t : A) (i : ℕ) : AddMonoid.End A := + (equalCharacteristicLubinTateAmbientPiEnd F t) ^ i + +/-- The zeroth ambient `π`-iterate is the identity. -/ +@[simp] +theorem equalCharacteristicLubinTateAmbientPiIterate_zero + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (t x : A) : + equalCharacteristicLubinTateAmbientPiIterate F t 0 x = x := by + simp [equalCharacteristicLubinTateAmbientPiIterate] + +/-- A successor ambient `π`-iterate applies one more `π`-endomorphism. -/ +@[simp] +theorem equalCharacteristicLubinTateAmbientPiIterate_succ + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (t : A) (i : ℕ) (x : A) : + equalCharacteristicLubinTateAmbientPiIterate F t (i + 1) x = + equalCharacteristicLubinTateAmbientPiIterate F t i + (equalCharacteristicLubinTateAmbientPiEnd F t x) := by + change + ((equalCharacteristicLubinTateAmbientPiEnd F t) ^ (i + 1)) x = + ((equalCharacteristicLubinTateAmbientPiEnd F t) ^ i) + (equalCharacteristicLubinTateAmbientPiEnd F t x) + rw [pow_succ] + rfl + +/-- Ambient iterates commute with residue-field scalar multiplication. -/ +theorem equalCharacteristicLubinTateAmbientPiIterate_coefficient_mul + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (i : ℕ) (a : F.residueField) (x : A) : + equalCharacteristicLubinTateAmbientPiIterate F t i (ι a * x) = + ι a * equalCharacteristicLubinTateAmbientPiIterate F t i x := by + induction i generalizing x with + | zero => simp + | succ i ih => + rw [equalCharacteristicLubinTateAmbientPiIterate_succ, + equalCharacteristicLubinTateAmbientPiEnd_coefficient_mul, + ih, equalCharacteristicLubinTateAmbientPiIterate_succ] + +/-- The genuine finite bracket in the ambient field. -/ +noncomputable def equalCharacteristicLubinTateAmbientBracket + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (n : ℕ) (a : F.residueField⟦X⟧) : AddMonoid.End A := + ∑ i ∈ Finset.range n, + equalCharacteristicLubinTateAmbientCoefficientEnd F ι + (PowerSeries.coeff i a) * + equalCharacteristicLubinTateAmbientPiIterate F t i + +/-- Ambient bracket evaluation expands as the finite coefficient-and-iterate sum. -/ +theorem equalCharacteristicLubinTateAmbientBracket_apply + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (n : ℕ) (a : F.residueField⟦X⟧) (x : A) : + equalCharacteristicLubinTateAmbientBracket F ι t n a x = + ∑ i ∈ Finset.range n, + ι (PowerSeries.coeff i a) * + equalCharacteristicLubinTateAmbientPiIterate F t i x := by + rw [equalCharacteristicLubinTateAmbientBracket, + ambientAddMonoidEnd_sum_apply] + apply Finset.sum_congr rfl + intro i hi + rw [ambientAddMonoidEnd_mul_apply, + equalCharacteristicLubinTateAmbientCoefficientEnd_apply] + +/-- The ambient bracket of the zero series is the zero endomorphism. -/ +@[simp] +theorem equalCharacteristicLubinTateAmbientBracket_zero + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) (n : ℕ) : + equalCharacteristicLubinTateAmbientBracket F ι t n 0 = 0 := by + apply AddMonoidHom.ext + intro x + change + equalCharacteristicLubinTateAmbientBracket F ι t n 0 x = + (0 : AddMonoid.End A) x + rw [equalCharacteristicLubinTateAmbientBracket_apply] + simp + +/-- The ambient bracket is additive in its power-series parameter. -/ +@[simp] +theorem equalCharacteristicLubinTateAmbientBracket_add + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (n : ℕ) (a b : F.residueField⟦X⟧) : + equalCharacteristicLubinTateAmbientBracket F ι t n (a + b) = + equalCharacteristicLubinTateAmbientBracket F ι t n a + + equalCharacteristicLubinTateAmbientBracket F ι t n b := by + apply AddMonoidHom.ext + intro x + change + equalCharacteristicLubinTateAmbientBracket F ι t n (a + b) x = + equalCharacteristicLubinTateAmbientBracket F ι t n a x + + equalCharacteristicLubinTateAmbientBracket F ι t n b x + rw [equalCharacteristicLubinTateAmbientBracket_apply, + equalCharacteristicLubinTateAmbientBracket_apply, + equalCharacteristicLubinTateAmbientBracket_apply, + ← Finset.sum_add_distrib] + apply Finset.sum_congr rfl + intro i hi + rw [(PowerSeries.coeff i).map_add, ι.map_add, add_mul] + +/-- The ambient bracket of a constant acts by the embedded scalar. -/ +@[simp] +theorem equalCharacteristicLubinTateAmbientBracket_C + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (n : ℕ) (a : F.residueField) : + equalCharacteristicLubinTateAmbientBracket F ι t (n + 1) + (PowerSeries.C a) = + equalCharacteristicLubinTateAmbientCoefficientEnd F ι a := by + apply AddMonoidHom.ext + intro x + change + equalCharacteristicLubinTateAmbientBracket F ι t (n + 1) + (PowerSeries.C a) x = + equalCharacteristicLubinTateAmbientCoefficientEnd F ι a x + rw [equalCharacteristicLubinTateAmbientBracket_apply, + equalCharacteristicLubinTateAmbientCoefficientEnd_apply] + classical + rw [Finset.sum_eq_single 0] + · simp [PowerSeries.coeff_C, + equalCharacteristicLubinTateAmbientPiIterate] + · intro i hi hi0 + simp [PowerSeries.coeff_C, hi0] + · simp + +/-- Ambient iterates add their exponents under composition. -/ +theorem equalCharacteristicLubinTateAmbientPiIterate_add + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (t : A) (i j : ℕ) (x : A) : + equalCharacteristicLubinTateAmbientPiIterate F t (i + j) x = + equalCharacteristicLubinTateAmbientPiIterate F t i + (equalCharacteristicLubinTateAmbientPiIterate F t j x) := by + change + ((equalCharacteristicLubinTateAmbientPiEnd F t) ^ (i + j)) x = + ((equalCharacteristicLubinTateAmbientPiEnd F t) ^ i) + (((equalCharacteristicLubinTateAmbientPiEnd F t) ^ j) x) + rw [pow_add] + rfl + +/-- A point in an ambient field killed by the level-`n` iterate. -/ +def IsEqualCharacteristicLubinTateAmbientTorsion + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (t : A) (n : ℕ) (x : A) : Prop := + equalCharacteristicLubinTateAmbientPiIterate F t n x = 0 + +/-- A level-`n` ambient torsion point is killed at every higher level. -/ +theorem equalCharacteristicLubinTateAmbientPiIterate_eq_zero_of_le + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (t : A) {n m : ℕ} (hnm : n ≤ m) (x : A) + (hx : IsEqualCharacteristicLubinTateAmbientTorsion F t n x) : + equalCharacteristicLubinTateAmbientPiIterate F t m x = 0 := by + rw [← Nat.sub_add_cancel hnm, + equalCharacteristicLubinTateAmbientPiIterate_add, hx, map_zero] + +/-- The image under `e` of level `n+1` torsion has level `n`. -/ +theorem equalCharacteristicLubinTateAmbientPiEnd_torsion_pred + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (t : A) (n : ℕ) (x : A) + (hx : IsEqualCharacteristicLubinTateAmbientTorsion F t (n + 1) x) : + IsEqualCharacteristicLubinTateAmbientTorsion F t n + (equalCharacteristicLubinTateAmbientPiEnd F t x) := + hx + +/-- Recursive evaluation formula for an ambient bracket. -/ +theorem equalCharacteristicLubinTateAmbientBracket_succ_apply + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (n : ℕ) (a : F.residueField⟦X⟧) (x : A) : + equalCharacteristicLubinTateAmbientBracket F ι t (n + 1) a x = + ι (PowerSeries.coeff 0 a) * x + + equalCharacteristicLubinTateAmbientBracket F ι t n + (equalCharacteristicPowerSeriesTail a) + (equalCharacteristicLubinTateAmbientPiEnd F t x) := by + rw [equalCharacteristicLubinTateAmbientBracket_apply, + Finset.sum_range_succ', add_comm, + equalCharacteristicLubinTateAmbientBracket_apply] + apply congrArg₂ (fun y z : A ↦ y + z) + · rfl + · apply Finset.sum_congr rfl + intro i hi + rw [equalCharacteristicPowerSeriesTail_coeff, + equalCharacteristicLubinTateAmbientPiIterate_succ] + +/-- The first ambient `π`-iterate is the ambient `π`-endomorphism. -/ +theorem equalCharacteristicLubinTateAmbientPiIterate_one + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (t x : A) : + equalCharacteristicLubinTateAmbientPiIterate F t 1 x = + equalCharacteristicLubinTateAmbientPiEnd F t x := by + simp [equalCharacteristicLubinTateAmbientPiIterate] + +/-- The distinguished ambient endomorphism commutes with its iterates. -/ +theorem equalCharacteristicLubinTateAmbientPiEnd_iterate + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (t : A) (i : ℕ) (x : A) : + equalCharacteristicLubinTateAmbientPiEnd F t + (equalCharacteristicLubinTateAmbientPiIterate F t i x) = + equalCharacteristicLubinTateAmbientPiIterate F t i + (equalCharacteristicLubinTateAmbientPiEnd F t x) := by + calc + equalCharacteristicLubinTateAmbientPiEnd F t + (equalCharacteristicLubinTateAmbientPiIterate F t i x) = + equalCharacteristicLubinTateAmbientPiIterate F t 1 + (equalCharacteristicLubinTateAmbientPiIterate F t i x) := + (equalCharacteristicLubinTateAmbientPiIterate_one F t + (equalCharacteristicLubinTateAmbientPiIterate F t i x)).symm + _ = equalCharacteristicLubinTateAmbientPiIterate F t (1 + i) x := + (equalCharacteristicLubinTateAmbientPiIterate_add F t 1 i x).symm + _ = equalCharacteristicLubinTateAmbientPiIterate F t (i + 1) x := by + rw [Nat.one_add] + _ = equalCharacteristicLubinTateAmbientPiIterate F t i + (equalCharacteristicLubinTateAmbientPiIterate F t 1 x) := + equalCharacteristicLubinTateAmbientPiIterate_add F t i 1 x + _ = equalCharacteristicLubinTateAmbientPiIterate F t i + (equalCharacteristicLubinTateAmbientPiEnd F t x) := by + exact congrArg (equalCharacteristicLubinTateAmbientPiIterate F t i) + (equalCharacteristicLubinTateAmbientPiIterate_one F t x) + +/-- Ambient brackets are linear for the embedded coefficient action. -/ +theorem equalCharacteristicLubinTateAmbientBracket_coefficient_mul_apply + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (n : ℕ) (a : F.residueField⟦X⟧) (c : F.residueField) (x : A) : + equalCharacteristicLubinTateAmbientBracket F ι t n a (ι c * x) = + ι c * equalCharacteristicLubinTateAmbientBracket F ι t n a x := by + rw [equalCharacteristicLubinTateAmbientBracket_apply, + equalCharacteristicLubinTateAmbientBracket_apply, Finset.mul_sum] + apply Finset.sum_congr rfl + intro i hi + rw [equalCharacteristicLubinTateAmbientPiIterate_coefficient_mul] + ring + +/-- Multiplication of coefficient series by `C(c)` scales an ambient +bracket by `ι(c)`. -/ +theorem equalCharacteristicLubinTateAmbientBracket_C_mul_apply + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (n : ℕ) (c : F.residueField) (a : F.residueField⟦X⟧) (x : A) : + equalCharacteristicLubinTateAmbientBracket F ι t n + (PowerSeries.C c * a) x = + ι c * equalCharacteristicLubinTateAmbientBracket F ι t n a x := by + rw [equalCharacteristicLubinTateAmbientBracket_apply, + equalCharacteristicLubinTateAmbientBracket_apply, Finset.mul_sum] + apply Finset.sum_congr rfl + intro i hi + rw [PowerSeries.coeff_C_mul, ι.map_mul] + ring + +/-- The ambient bracket commutes with the distinguished endomorphism. -/ +theorem equalCharacteristicLubinTateAmbientPiEnd_bracket + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (n : ℕ) (a : F.residueField⟦X⟧) (x : A) : + equalCharacteristicLubinTateAmbientPiEnd F t + (equalCharacteristicLubinTateAmbientBracket F ι t n a x) = + equalCharacteristicLubinTateAmbientBracket F ι t n a + (equalCharacteristicLubinTateAmbientPiEnd F t x) := by + rw [equalCharacteristicLubinTateAmbientBracket_apply, + ambientAddMonoidHom_map_finset_sum, + equalCharacteristicLubinTateAmbientBracket_apply] + apply Finset.sum_congr rfl + intro i hi + rw [equalCharacteristicLubinTateAmbientPiEnd_coefficient_mul, + equalCharacteristicLubinTateAmbientPiEnd_iterate] + +/-- On level-`n` torsion, adding the `(n+1)`-st bracket term changes +nothing. -/ +theorem equalCharacteristicLubinTateAmbientBracket_succ_eq_of_torsion + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (n : ℕ) (a : F.residueField⟦X⟧) (x : A) + (hx : IsEqualCharacteristicLubinTateAmbientTorsion F t n x) : + equalCharacteristicLubinTateAmbientBracket F ι t (n + 1) a x = + equalCharacteristicLubinTateAmbientBracket F ι t n a x := by + rw [equalCharacteristicLubinTateAmbientBracket_apply, + Finset.sum_range_succ, + equalCharacteristicLubinTateAmbientBracket_apply, + hx, mul_zero, add_zero] + +/-- Applying `e` to an `(n+1)`-term bracket on level `n+1` torsion drops +the bracket level by one. -/ +theorem equalCharacteristicLubinTateAmbientPiEnd_bracket_succ_of_torsion + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (n : ℕ) (a : F.residueField⟦X⟧) (x : A) + (hx : IsEqualCharacteristicLubinTateAmbientTorsion F t (n + 1) x) : + equalCharacteristicLubinTateAmbientPiEnd F t + (equalCharacteristicLubinTateAmbientBracket F ι t (n + 1) a x) = + equalCharacteristicLubinTateAmbientBracket F ι t n a + (equalCharacteristicLubinTateAmbientPiEnd F t x) := by + rw [equalCharacteristicLubinTateAmbientPiEnd_bracket] + exact equalCharacteristicLubinTateAmbientBracket_succ_eq_of_torsion + F ι t n a (equalCharacteristicLubinTateAmbientPiEnd F t x) + (equalCharacteristicLubinTateAmbientPiEnd_torsion_pred F t n x hx) + +/-- Multiplicativity of the genuine truncated brackets on ambient +`e^n`-division points. -/ +theorem equalCharacteristicLubinTateAmbientBracket_mul_apply_of_torsion + (F : LocalField.{u, v} K) + {A : Type w} [Field A] [CharP A F.residueCharacteristic] + (ι : F.residueField →+* A) (t : A) + (n : ℕ) (a b : F.residueField⟦X⟧) (x : A) + (hx : IsEqualCharacteristicLubinTateAmbientTorsion F t n x) : + equalCharacteristicLubinTateAmbientBracket F ι t n (a * b) x = + equalCharacteristicLubinTateAmbientBracket F ι t n a + (equalCharacteristicLubinTateAmbientBracket F ι t n b x) := by + induction n generalizing a b x with + | zero => + simp [equalCharacteristicLubinTateAmbientBracket_apply] + | succ n ih => + have hxpred : + IsEqualCharacteristicLubinTateAmbientTorsion F t n + (equalCharacteristicLubinTateAmbientPiEnd F t x) := + equalCharacteristicLubinTateAmbientPiEnd_torsion_pred F t n x hx + have hcoeff : + PowerSeries.coeff 0 (a * b) = + PowerSeries.coeff 0 a * PowerSeries.coeff 0 b := by + rw [PowerSeries.coeff_zero_eq_constantCoeff_apply, map_mul, + PowerSeries.coeff_zero_eq_constantCoeff_apply, + PowerSeries.coeff_zero_eq_constantCoeff_apply] + calc + equalCharacteristicLubinTateAmbientBracket F ι t (n + 1) (a * b) x = + ι (PowerSeries.coeff 0 (a * b)) * x + + equalCharacteristicLubinTateAmbientBracket F ι t n + (equalCharacteristicPowerSeriesTail (a * b)) + (equalCharacteristicLubinTateAmbientPiEnd F t x) := + equalCharacteristicLubinTateAmbientBracket_succ_apply + F ι t n (a * b) x + _ = + ι (PowerSeries.coeff 0 a * PowerSeries.coeff 0 b) * x + + equalCharacteristicLubinTateAmbientBracket F ι t n + (PowerSeries.C (PowerSeries.coeff 0 a) * + equalCharacteristicPowerSeriesTail b + + equalCharacteristicPowerSeriesTail a * b) + (equalCharacteristicLubinTateAmbientPiEnd F t x) := by + rw [hcoeff, equalCharacteristicPowerSeriesTail_mul] + _ = + ι (PowerSeries.coeff 0 a * PowerSeries.coeff 0 b) * x + + (equalCharacteristicLubinTateAmbientBracket F ι t n + (PowerSeries.C (PowerSeries.coeff 0 a) * + equalCharacteristicPowerSeriesTail b) + (equalCharacteristicLubinTateAmbientPiEnd F t x) + + equalCharacteristicLubinTateAmbientBracket F ι t n + (equalCharacteristicPowerSeriesTail a * b) + (equalCharacteristicLubinTateAmbientPiEnd F t x)) := by + congr 1 + exact congrArg + (fun f : AddMonoid.End A ↦ + f (equalCharacteristicLubinTateAmbientPiEnd F t x)) + (equalCharacteristicLubinTateAmbientBracket_add F ι t n + (PowerSeries.C (PowerSeries.coeff 0 a) * + equalCharacteristicPowerSeriesTail b) + (equalCharacteristicPowerSeriesTail a * b)) + _ = + ι (PowerSeries.coeff 0 a * PowerSeries.coeff 0 b) * x + + (ι (PowerSeries.coeff 0 a) * + equalCharacteristicLubinTateAmbientBracket F ι t n + (equalCharacteristicPowerSeriesTail b) + (equalCharacteristicLubinTateAmbientPiEnd F t x) + + equalCharacteristicLubinTateAmbientBracket F ι t n + (equalCharacteristicPowerSeriesTail a) + (equalCharacteristicLubinTateAmbientBracket F ι t n b + (equalCharacteristicLubinTateAmbientPiEnd F t x))) := by + rw [equalCharacteristicLubinTateAmbientBracket_C_mul_apply, + ih (equalCharacteristicPowerSeriesTail a) b + (equalCharacteristicLubinTateAmbientPiEnd F t x) hxpred] + _ = + ι (PowerSeries.coeff 0 a) * + (ι (PowerSeries.coeff 0 b) * x + + equalCharacteristicLubinTateAmbientBracket F ι t n + (equalCharacteristicPowerSeriesTail b) + (equalCharacteristicLubinTateAmbientPiEnd F t x)) + + equalCharacteristicLubinTateAmbientBracket F ι t n + (equalCharacteristicPowerSeriesTail a) + (equalCharacteristicLubinTateAmbientBracket F ι t n b + (equalCharacteristicLubinTateAmbientPiEnd F t x)) := by + rw [ι.map_mul] + ring + _ = + ι (PowerSeries.coeff 0 a) * + equalCharacteristicLubinTateAmbientBracket F ι t (n + 1) b x + + equalCharacteristicLubinTateAmbientBracket F ι t n + (equalCharacteristicPowerSeriesTail a) + (equalCharacteristicLubinTateAmbientPiEnd F t + (equalCharacteristicLubinTateAmbientBracket F ι t + (n + 1) b x)) := by + rw [equalCharacteristicLubinTateAmbientPiEnd_bracket_succ_of_torsion + F ι t n b x hx, + equalCharacteristicLubinTateAmbientBracket_succ_apply] + _ = + equalCharacteristicLubinTateAmbientBracket F ι t (n + 1) a + (equalCharacteristicLubinTateAmbientBracket F ι t + (n + 1) b x) := + (equalCharacteristicLubinTateAmbientBracket_succ_apply F ι t n a + (equalCharacteristicLubinTateAmbientBracket F ι t + (n + 1) b x)).symm + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/DivisionModuleEndomorphisms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/DivisionModuleEndomorphisms.lean new file mode 100644 index 0000000000..d73a2ab043 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/DivisionModuleEndomorphisms.lean @@ -0,0 +1,334 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FreeRankOne +public import Mathlib.LinearAlgebra.GeneralLinearGroup.Basic +public import Mathlib.GroupTheory.QuotientGroup.Basic +/-! +# The endomorphism-ring equivalence: endomorphisms and automorphisms of division modules + +For the standard equal-characteristic Lubin--Tate module, scalar brackets +identify the endomorphism ring of the level-`m` division module with +`κ⟦T⟧/(T^m)`, and its automorphism group with the quotient of `κ⟦T⟧ˣ` by +the `m`-th higher unit subgroup. The division-tower sources use a primitive +polynomial indexed by `n` for division level `m = n + 1`; every statement below +keeps this shift explicit. +-/ + +@[expose] public section + +noncomputable +section + + +open scoped PowerSeries LaurentSeries Polynomial + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +attribute [local instance] + equalCharacteristicLubinTateTruncatedSelfSMul + equalCharacteristicLubinTateTruncatedSelfModule + +private theorem scalarConjRingEquiv_apply + {R M : Type*} [CommSemiring R] [AddCommMonoid M] [Module R M] + (e : R ≃ₗ[R] M) (a : R) (x : M) : + (((RingEquiv.toOpposite R).trans (RingEquiv.moduleEndSelf R)).trans + e.conjRingEquiv) a x = a • x := by + change e (e.symm x * a) = a • x + calc + e (e.symm x * a) = e (a * e.symm x) := + congrArg e (mul_comm (e.symm x) a) + _ = e (a • e.symm x) := + congrArg e (smul_eq_mul a (e.symm x)).symm + _ = a • e (e.symm x) := e.map_smul a (e.symm x) + _ = a • x := congrArg (fun y => a • y) (e.apply_symm_apply x) + +/-- The public ring isomorphism `a ↦ [a]_F` of the endomorphism-ring equivalence. -/ +noncomputable def equalCharacteristicLubinTateScalarEndomorphismRingEquiv + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicLubinTateTruncatedRing F n ≃+* + Module.End (equalCharacteristicLubinTateTruncatedRing F n) + (equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1)) := + ((RingEquiv.toOpposite + (equalCharacteristicLubinTateTruncatedRing F n)).trans + (RingEquiv.moduleEndSelf + (equalCharacteristicLubinTateTruncatedRing F n))).trans + (equalCharacteristicLubinTateFreeRankOneEquiv F n).conjRingEquiv + +/-- The orientation printed in the endomorphism-ring equivalence: +`End_{κ⟦T⟧}(F[n+1]) ≃ κ⟦T⟧/(T^(n+1))`. -/ +noncomputable def equalCharacteristicLubinTateEndomorphismRingEquiv + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Module.End (equalCharacteristicLubinTateTruncatedRing F n) + (equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1)) ≃+* + equalCharacteristicLubinTateTruncatedRing F n := + (equalCharacteristicLubinTateScalarEndomorphismRingEquiv F n).symm + +/-- The scalar-endomorphism equivalence sends a truncated scalar to its action map. -/ +@[simp] +theorem equalCharacteristicLubinTateScalarEndomorphismRingEquiv_apply + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : equalCharacteristicLubinTateTruncatedRing F n) + (x : equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1)) : + equalCharacteristicLubinTateScalarEndomorphismRingEquiv F n a x = a • x := by + exact scalarConjRingEquiv_apply + (equalCharacteristicLubinTateFreeRankOneEquiv F n) a x + +/-- On a power-series representative, the scalar endomorphism is the +genuine finite Lubin--Tate bracket. -/ +theorem equalCharacteristicLubinTateScalarEndomorphismRingEquiv_mk_apply + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧) + (x : equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1)) : + (equalCharacteristicLubinTateScalarEndomorphismRingEquiv F n + (equalCharacteristicLubinTateTruncatedRingMk F n a) + x).1 = + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) a x.1 := by + rw [equalCharacteristicLubinTateScalarEndomorphismRingEquiv_apply] + rfl + +/-- Units of `κ⟦T⟧/(T^(n+1))` are precisely the linear automorphisms of the +division-level `n + 1` division module. -/ +noncomputable def equalCharacteristicLubinTateTruncatedUnitsAutomorphismEquiv + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + (equalCharacteristicLubinTateTruncatedRing F n)ˣ ≃* + (equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1) ≃ₗ[ + equalCharacteristicLubinTateTruncatedRing F n] + equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1)) := + (Units.mapEquiv + (equalCharacteristicLubinTateScalarEndomorphismRingEquiv F n).toMulEquiv).trans + (LinearMap.GeneralLinearGroup.generalLinearEquiv + (equalCharacteristicLubinTateTruncatedRing F n) + (equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1))) + +/-- A truncated unit acts on the division module by scalar multiplication. -/ +@[simp] +theorem equalCharacteristicLubinTateTruncatedUnitsAutomorphismEquiv_apply + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : (equalCharacteristicLubinTateTruncatedRing F n)ˣ) + (x : equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1)) : + equalCharacteristicLubinTateTruncatedUnitsAutomorphismEquiv F n a x = + (a : equalCharacteristicLubinTateTruncatedRing F n) • x := by + exact equalCharacteristicLubinTateScalarEndomorphismRingEquiv_apply + F n (a : equalCharacteristicLubinTateTruncatedRing F n) x + +/-- Reduction of integral coefficients modulo `T^(n+1)`. -/ +noncomputable def equalCharacteristicLubinTateTruncatedQuotientMap + (F : LocalField.{u, v} K) (n : ℕ) : + F.residueField⟦X⟧ →+* equalCharacteristicLubinTateTruncatedRing F n := + equalCharacteristicLubinTateTruncatedRingMk F n + +/-- Reduction of integral units modulo `T^(n+1)`. -/ +noncomputable def equalCharacteristicLubinTateUnitReduction + (F : LocalField.{u, v} K) (n : ℕ) : + F.residueField⟦X⟧ˣ →* + (equalCharacteristicLubinTateTruncatedRing F n)ˣ := + Units.map (equalCharacteristicLubinTateTruncatedQuotientMap F n) + +/-- The value of a reduced unit is the truncated class of its power series. -/ +@[simp] +theorem equalCharacteristicLubinTateUnitReduction_val + (F : LocalField.{u, v} K) (n : ℕ) + (u : F.residueField⟦X⟧ˣ) : + (equalCharacteristicLubinTateUnitReduction F n u : + equalCharacteristicLubinTateTruncatedRing F n) = + equalCharacteristicLubinTateTruncatedRingMk F n + (u : F.residueField⟦X⟧) := + rfl + +/-- The equal-characteristic realization of the higher unit group +`U_K^(n+1)`: units congruent to one modulo `T^(n+1)`. -/ +noncomputable def equalCharacteristicLubinTateHigherUnitSubgroup + (F : LocalField.{u, v} K) (n : ℕ) : + Subgroup F.residueField⟦X⟧ˣ := + MonoidHom.ker (equalCharacteristicLubinTateUnitReduction F n) + +/-- A unit is in the higher-unit kernel exactly when it is one modulo `X ^ (n + 1)`. -/ +theorem mem_equalCharacteristicLubinTateHigherUnitSubgroup + (F : LocalField.{u, v} K) (n : ℕ) + (u : F.residueField⟦X⟧ˣ) : + u ∈ equalCharacteristicLubinTateHigherUnitSubgroup F n ↔ + (u : F.residueField⟦X⟧) - 1 ∈ + Ideal.span ({PowerSeries.X ^ (n + 1)} : Set F.residueField⟦X⟧) := by + constructor + · intro hu + have hval := congrArg Units.val hu + change equalCharacteristicLubinTateTruncatedQuotientMap F n + (u : F.residueField⟦X⟧) = 1 at hval + rw [← map_one (equalCharacteristicLubinTateTruncatedQuotientMap F n)] at hval + exact (equalCharacteristicLubinTateTruncatedRingMk_eq_iff + F n (u : F.residueField⟦X⟧) 1).mp hval + · intro hu + apply Units.ext + change equalCharacteristicLubinTateTruncatedQuotientMap F n + (u : F.residueField⟦X⟧) = 1 + rw [← map_one (equalCharacteristicLubinTateTruncatedQuotientMap F n)] + exact (equalCharacteristicLubinTateTruncatedRingMk_eq_iff + F n (u : F.residueField⟦X⟧) 1).mpr hu + +private theorem equalCharacteristicLubinTateTruncationIdeal_le_constantCoeff_ker + (F : LocalField.{u, v} K) (n : ℕ) : + Ideal.span ({PowerSeries.X ^ (n + 1)} : Set F.residueField⟦X⟧) ≤ + RingHom.ker (PowerSeries.constantCoeff (R := F.residueField)) := by + rw [Ideal.span_le] + intro a ha + rw [Set.mem_singleton_iff.mp ha] + change PowerSeries.constantCoeff + (PowerSeries.X ^ (n + 1) : F.residueField⟦X⟧) = 0 + simp + +/-- Constant coefficient descends to every positive truncated power-series +ring. -/ +noncomputable def equalCharacteristicLubinTateTruncatedConstantCoeff + (F : LocalField.{u, v} K) (n : ℕ) : + equalCharacteristicLubinTateTruncatedRing F n →+* F.residueField := + equalCharacteristicLubinTateTruncatedRingLift F n + (PowerSeries.constantCoeff (R := F.residueField)) + (by + intro _ ha + exact RingHom.mem_ker.mp + (equalCharacteristicLubinTateTruncationIdeal_le_constantCoeff_ker F n ha)) + +/-- The descended constant-coefficient map evaluates any truncated representative. -/ +@[simp] +theorem equalCharacteristicLubinTateTruncatedConstantCoeff_mk + (F : LocalField.{u, v} K) (n : ℕ) (f : F.residueField⟦X⟧) : + equalCharacteristicLubinTateTruncatedConstantCoeff F n + (equalCharacteristicLubinTateTruncatedRingMk F n f) = + PowerSeries.constantCoeff f := + rfl + +/-- Every unit modulo `T^(n+1)` has a power-series unit lift. -/ +theorem equalCharacteristicLubinTateUnitReduction_surjective + (F : LocalField.{u, v} K) (n : ℕ) : + Function.Surjective (equalCharacteristicLubinTateUnitReduction F n) := by + intro u + obtain ⟨f, hf⟩ := equalCharacteristicLubinTateTruncatedRingMk_surjective + F n (u : equalCharacteristicLubinTateTruncatedRing F n) + have hconstant : IsUnit (PowerSeries.constantCoeff f) := by + have hu : IsUnit + (equalCharacteristicLubinTateTruncatedConstantCoeff F n + (u : equalCharacteristicLubinTateTruncatedRing F n)) := + u.isUnit.map (equalCharacteristicLubinTateTruncatedConstantCoeff F n) + rw [← hf] at hu + simpa only [equalCharacteristicLubinTateTruncatedConstantCoeff_mk] using hu + have hfUnit : IsUnit f := + PowerSeries.isUnit_iff_constantCoeff.mpr hconstant + let fu : F.residueField⟦X⟧ˣ := hfUnit.unit + refine ⟨fu, ?_⟩ + apply Units.ext + change equalCharacteristicLubinTateTruncatedQuotientMap F n + (fu : F.residueField⟦X⟧) = + (u : equalCharacteristicLubinTateTruncatedRing F n) + rw [hfUnit.unit_spec] + exact hf + +/-- The canonical first-isomorphism-theorem identification +`U_K/U_K^(n+1) ≃ (κ⟦T⟧/(T^(n+1)))ˣ`. -/ +noncomputable def equalCharacteristicLubinTateUnitQuotientEquivTruncatedUnits + (F : LocalField.{u, v} K) (n : ℕ) : + F.residueField⟦X⟧ˣ ⧸ + equalCharacteristicLubinTateHigherUnitSubgroup F n ≃* + (equalCharacteristicLubinTateTruncatedRing F n)ˣ := + QuotientGroup.quotientKerEquivOfSurjective + (equalCharacteristicLubinTateUnitReduction F n) + (equalCharacteristicLubinTateUnitReduction_surjective F n) + +/-- The higher-unit quotient equivalence sends a unit class to its truncation. -/ +@[simp] +theorem equalCharacteristicLubinTateUnitQuotientEquivTruncatedUnits_mk + (F : LocalField.{u, v} K) (n : ℕ) + (u : F.residueField⟦X⟧ˣ) : + equalCharacteristicLubinTateUnitQuotientEquivTruncatedUnits F n + (QuotientGroup.mk u) = + equalCharacteristicLubinTateUnitReduction F n u := + rfl + +/-- The canonical the endomorphism-ring equivalence map from the higher-unit quotient to linear +automorphisms, induced by `a ↦ [a]_F`. -/ +noncomputable def equalCharacteristicLubinTateUnitQuotientAutomorphismEquiv + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + F.residueField⟦X⟧ˣ ⧸ + equalCharacteristicLubinTateHigherUnitSubgroup F n ≃* + (equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1) ≃ₗ[ + equalCharacteristicLubinTateTruncatedRing F n] + equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1)) := + (equalCharacteristicLubinTateUnitQuotientEquivTruncatedUnits F n).trans + (equalCharacteristicLubinTateTruncatedUnitsAutomorphismEquiv F n) + +/-- The orientation printed in the endomorphism-ring equivalence: +`Aut_{κ⟦T⟧}(F[n+1]) ≃ U_K/U_K^(n+1)`. -/ +noncomputable def equalCharacteristicLubinTateAutomorphismEquivUnitQuotient + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + (equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1) ≃ₗ[ + equalCharacteristicLubinTateTruncatedRing F n] + equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1)) ≃* + F.residueField⟦X⟧ˣ ⧸ + equalCharacteristicLubinTateHigherUnitSubgroup F n := + (equalCharacteristicLubinTateUnitQuotientAutomorphismEquiv F n).symm + +/-- A representative unit acts through the actual Lubin--Tate bracket, so +the preceding automorphism isomorphism is the canonical one. -/ +theorem equalCharacteristicLubinTateUnitQuotientAutomorphismEquiv_mk_apply + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (u : F.residueField⟦X⟧ˣ) + (x : equalCharacteristicLubinTateAmbientTorsionAddSubgroup F + (equalCharacteristicSeparableUniformizer F) (n + 1)) : + (equalCharacteristicLubinTateUnitQuotientAutomorphismEquiv F n + (QuotientGroup.mk u) x).1 = + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (u : F.residueField⟦X⟧) x.1 := by + rw [equalCharacteristicLubinTateUnitQuotientAutomorphismEquiv, + MulEquiv.trans_apply, + equalCharacteristicLubinTateUnitQuotientEquivTruncatedUnits_mk, + equalCharacteristicLubinTateTruncatedUnitsAutomorphismEquiv_apply] + rw [equalCharacteristicLubinTateUnitReduction_val] + have h := equalCharacteristicLubinTateScalarEndomorphismRingEquiv_mk_apply + F n (u : F.residueField⟦X⟧) x + rw [equalCharacteristicLubinTateScalarEndomorphismRingEquiv_apply] at h + exact h + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateAction.lean new file mode 100644 index 0000000000..ae0f302b3a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateAction.lean @@ -0,0 +1,441 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateEndomorphism +/-! +# Equal-characteristic Lubin--Tate action + +This file proves the algebraic identities needed to turn the finite brackets +from `EqualCharacteristicLubinTateEnd` into the action of +`(κ⟦T⟧ / T^n)ˣ` on the `T^n`-division points. +-/ + +@[expose] public section + +noncomputable +section + +open scoped PowerSeries LaurentSeries + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +private theorem addMonoidHom_map_finset_sum + {A I : Type*} [AddCommMonoid A] + (f : AddMonoid.End A) (s : Finset I) (g : I → A) : + f (∑ i ∈ s, g i) = ∑ i ∈ s, f (g i) := by + classical + induction s using Finset.induction_on with + | empty => simp + | @insert i s hi ih => + rw [Finset.sum_insert hi, Finset.sum_insert hi] + exact (f.map_add _ _).trans + (congrArg (fun x ↦ f (g i) + x) ih) + +/-- Delete the constant coefficient of a power series and shift all +remaining coefficients down by one place. -/ +noncomputable def equalCharacteristicPowerSeriesTail + {k : Type*} [Semiring k] (a : k⟦X⟧) : k⟦X⟧ := + PowerSeries.mk fun i ↦ PowerSeries.coeff (i + 1) a + +/-- States the theorem `equalCharacteristicPowerSeriesTail_coeff`. -/ +@[simp] +theorem equalCharacteristicPowerSeriesTail_coeff + {k : Type*} [Semiring k] (a : k⟦X⟧) (i : ℕ) : + PowerSeries.coeff i (equalCharacteristicPowerSeriesTail a) = + PowerSeries.coeff (i + 1) a := by + simp [equalCharacteristicPowerSeriesTail] + +/-- Split a power series into its constant coefficient and shifted tail. -/ +theorem equalCharacteristicPowerSeries_eq_X_mul_tail_add_C + {k : Type*} [Semiring k] (a : k⟦X⟧) : + a = PowerSeries.X * equalCharacteristicPowerSeriesTail a + + PowerSeries.C (PowerSeries.coeff 0 a) := by + simpa [equalCharacteristicPowerSeriesTail, + PowerSeries.coeff_zero_eq_constantCoeff_apply] using + PowerSeries.eq_X_mul_shift_add_const a + +/-- Product rule for the shifted tail: +`tail(ab) = C(a₀) tail(b) + tail(a)b`. -/ +theorem equalCharacteristicPowerSeriesTail_mul + {k : Type*} [CommRing k] (a b : k⟦X⟧) : + equalCharacteristicPowerSeriesTail (a * b) = + PowerSeries.C (PowerSeries.coeff 0 a) * + equalCharacteristicPowerSeriesTail b + + equalCharacteristicPowerSeriesTail a * b := by + apply PowerSeries.X_mul_injective + have ha := equalCharacteristicPowerSeries_eq_X_mul_tail_add_C a + have hb := equalCharacteristicPowerSeries_eq_X_mul_tail_add_C b + have hab := equalCharacteristicPowerSeries_eq_X_mul_tail_add_C (a * b) + have hcoeff : + PowerSeries.coeff 0 (a * b) = + PowerSeries.coeff 0 a * PowerSeries.coeff 0 b := by + rw [PowerSeries.coeff_zero_eq_constantCoeff_apply, map_mul, + PowerSeries.coeff_zero_eq_constantCoeff_apply, + PowerSeries.coeff_zero_eq_constantCoeff_apply] + calc + PowerSeries.X * equalCharacteristicPowerSeriesTail (a * b) = + a * b - PowerSeries.C (PowerSeries.coeff 0 (a * b)) := by + calc + _ = + (PowerSeries.X * equalCharacteristicPowerSeriesTail (a * b) + + PowerSeries.C (PowerSeries.coeff 0 (a * b))) - + PowerSeries.C (PowerSeries.coeff 0 (a * b)) := by ring + _ = a * b - PowerSeries.C (PowerSeries.coeff 0 (a * b)) := by + rw [← hab] + _ = a * b - PowerSeries.C + (PowerSeries.coeff 0 a * PowerSeries.coeff 0 b) := by + rw [hcoeff] + _ = + (PowerSeries.X * equalCharacteristicPowerSeriesTail a + + PowerSeries.C (PowerSeries.coeff 0 a)) * b - + PowerSeries.C + (PowerSeries.coeff 0 a * PowerSeries.coeff 0 b) := by + exact congrArg + (fun z : k⟦X⟧ ↦ + z * b - PowerSeries.C + (PowerSeries.coeff 0 a * PowerSeries.coeff 0 b)) ha + _ = PowerSeries.X * (equalCharacteristicPowerSeriesTail a * b) + + (PowerSeries.C (PowerSeries.coeff 0 a) * b - + PowerSeries.C + (PowerSeries.coeff 0 a * PowerSeries.coeff 0 b)) := by + ring + _ = PowerSeries.X * (equalCharacteristicPowerSeriesTail a * b) + + PowerSeries.X * + (PowerSeries.C (PowerSeries.coeff 0 a) * + equalCharacteristicPowerSeriesTail b) := by + congr 1 + calc + PowerSeries.C (PowerSeries.coeff 0 a) * b - + PowerSeries.C + (PowerSeries.coeff 0 a * PowerSeries.coeff 0 b) = + PowerSeries.C (PowerSeries.coeff 0 a) * + (PowerSeries.X * equalCharacteristicPowerSeriesTail b + + PowerSeries.C (PowerSeries.coeff 0 b)) - + PowerSeries.C + (PowerSeries.coeff 0 a * PowerSeries.coeff 0 b) := by + exact congrArg + (fun z : k⟦X⟧ ↦ + PowerSeries.C (PowerSeries.coeff 0 a) * z - + PowerSeries.C + (PowerSeries.coeff 0 a * PowerSeries.coeff 0 b)) hb + _ = PowerSeries.X * + (PowerSeries.C (PowerSeries.coeff 0 a) * + equalCharacteristicPowerSeriesTail b) := by + rw [mul_add, + ← map_mul (PowerSeries.C : k →+* k⟦X⟧)] + ring + _ = PowerSeries.X * + (PowerSeries.C (PowerSeries.coeff 0 a) * + equalCharacteristicPowerSeriesTail b + + equalCharacteristicPowerSeriesTail a * b) := by + ring + +/-- A point killed by the `n`-fold distinguished endomorphism. -/ +def IsEqualCharacteristicLubinTateTorsion + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (x : F.residueField⸨X⸩) : Prop := + equalCharacteristicLubinTatePiIterate F n x = 0 + +/-- Iterating `e` `i+j` times is the same as first iterating `j` times and +then `i` times. -/ +theorem equalCharacteristicLubinTatePiIterate_add + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (i j : ℕ) (x : F.residueField⸨X⸩) : + equalCharacteristicLubinTatePiIterate F (i + j) x = + equalCharacteristicLubinTatePiIterate F i + (equalCharacteristicLubinTatePiIterate F j x) := by + change + ((equalCharacteristicLubinTatePiEnd F) ^ (i + j)) x = + ((equalCharacteristicLubinTatePiEnd F) ^ i) + (((equalCharacteristicLubinTatePiEnd F) ^ j) x) + rw [pow_add] + rfl + +/-- A point killed at level `n` is killed at every higher level. -/ +theorem equalCharacteristicLubinTatePiIterate_eq_zero_of_le + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {n m : ℕ} (hnm : n ≤ m) (x : F.residueField⸨X⸩) + (hx : IsEqualCharacteristicLubinTateTorsion F n x) : + equalCharacteristicLubinTatePiIterate F m x = 0 := by + rw [← Nat.sub_add_cancel hnm, + equalCharacteristicLubinTatePiIterate_add, hx, map_zero] + +/-- If `x` is killed at level `n+1`, then `e(x)` is killed at level `n`. -/ +theorem equalCharacteristicLubinTatePiEnd_torsion_pred + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (x : F.residueField⸨X⸩) + (hx : IsEqualCharacteristicLubinTateTorsion F (n + 1) x) : + IsEqualCharacteristicLubinTateTorsion F n + (equalCharacteristicLubinTatePiEnd F x) := by + exact hx + +/-- Recursive evaluation formula for a finite bracket. -/ +theorem equalCharacteristicLubinTateBracket_succ_apply + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧) + (x : F.residueField⸨X⸩) : + equalCharacteristicLubinTateBracket F (n + 1) a x = + algebraMap F.residueField F.residueField⸨X⸩ + (PowerSeries.coeff 0 a) * x + + equalCharacteristicLubinTateBracket F n + (equalCharacteristicPowerSeriesTail a) + (equalCharacteristicLubinTatePiEnd F x) := by + rw [equalCharacteristicLubinTateBracket_apply, + Finset.sum_range_succ', add_comm, + equalCharacteristicLubinTateBracket_apply] + apply congrArg₂ + (fun y z : F.residueField⸨X⸩ ↦ y + z) + · rfl + · apply Finset.sum_congr rfl + intro i hi + rw [equalCharacteristicPowerSeriesTail_coeff, + equalCharacteristicLubinTatePiIterate_succ] + +/-- States the theorem `equalCharacteristicLubinTatePiIterate_one`. -/ +theorem equalCharacteristicLubinTatePiIterate_one + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (x : F.residueField⸨X⸩) : + equalCharacteristicLubinTatePiIterate F 1 x = + equalCharacteristicLubinTatePiEnd F x := by + simp [equalCharacteristicLubinTatePiIterate] + +/-- The distinguished endomorphism commutes with all of its iterates. -/ +theorem equalCharacteristicLubinTatePiEnd_iterate + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (i : ℕ) (x : F.residueField⸨X⸩) : + equalCharacteristicLubinTatePiEnd F + (equalCharacteristicLubinTatePiIterate F i x) = + equalCharacteristicLubinTatePiIterate F i + (equalCharacteristicLubinTatePiEnd F x) := by + calc + equalCharacteristicLubinTatePiEnd F + (equalCharacteristicLubinTatePiIterate F i x) = + equalCharacteristicLubinTatePiIterate F 1 + (equalCharacteristicLubinTatePiIterate F i x) := + (equalCharacteristicLubinTatePiIterate_one F + (equalCharacteristicLubinTatePiIterate F i x)).symm + _ = equalCharacteristicLubinTatePiIterate F (1 + i) x := + (equalCharacteristicLubinTatePiIterate_add F 1 i x).symm + _ = equalCharacteristicLubinTatePiIterate F (i + 1) x := by + rw [Nat.one_add] + _ = equalCharacteristicLubinTatePiIterate F i + (equalCharacteristicLubinTatePiIterate F 1 x) := + equalCharacteristicLubinTatePiIterate_add F i 1 x + _ = equalCharacteristicLubinTatePiIterate F i + (equalCharacteristicLubinTatePiEnd F x) := by + exact congrArg (equalCharacteristicLubinTatePiIterate F i) + (equalCharacteristicLubinTatePiIterate_one F x) + +/-- A bracket is linear for the residue-field coefficient action on its +argument. -/ +theorem equalCharacteristicLubinTateBracket_coefficient_mul_apply + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧) (c : F.residueField) + (x : F.residueField⸨X⸩) : + equalCharacteristicLubinTateBracket F n a + (algebraMap F.residueField F.residueField⸨X⸩ c * x) = + algebraMap F.residueField F.residueField⸨X⸩ c * + equalCharacteristicLubinTateBracket F n a x := by + rw [equalCharacteristicLubinTateBracket_apply, + equalCharacteristicLubinTateBracket_apply, Finset.mul_sum] + apply Finset.sum_congr rfl + intro i hi + rw [equalCharacteristicLubinTatePiIterate_coefficient_mul] + ring + +/-- Multiplying the coefficient series by the constant series `C(c)` has +the same effect as multiplying the bracket value by `c`. -/ +theorem equalCharacteristicLubinTateBracket_C_mul_apply + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (c : F.residueField) (a : F.residueField⟦X⟧) + (x : F.residueField⸨X⸩) : + equalCharacteristicLubinTateBracket F n (PowerSeries.C c * a) x = + algebraMap F.residueField F.residueField⸨X⸩ c * + equalCharacteristicLubinTateBracket F n a x := by + rw [equalCharacteristicLubinTateBracket_apply, + equalCharacteristicLubinTateBracket_apply, Finset.mul_sum] + apply Finset.sum_congr rfl + intro i hi + rw [PowerSeries.coeff_C_mul, + (algebraMap F.residueField F.residueField⸨X⸩).map_mul] + ring + +/-- The bracket commutes with the distinguished endomorphism. -/ +theorem equalCharacteristicLubinTatePiEnd_bracket + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧) + (x : F.residueField⸨X⸩) : + equalCharacteristicLubinTatePiEnd F + (equalCharacteristicLubinTateBracket F n a x) = + equalCharacteristicLubinTateBracket F n a + (equalCharacteristicLubinTatePiEnd F x) := by + rw [equalCharacteristicLubinTateBracket_apply, + addMonoidHom_map_finset_sum, + equalCharacteristicLubinTateBracket_apply] + apply Finset.sum_congr rfl + intro i hi + rw [equalCharacteristicLubinTatePiEnd_coefficient_mul, + equalCharacteristicLubinTatePiEnd_iterate] + +/-- On a point killed by `e^n`, the `(n+1)`-term bracket equals the +`n`-term bracket. -/ +theorem equalCharacteristicLubinTateBracket_succ_eq_of_torsion + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧) + (x : F.residueField⸨X⸩) + (hx : IsEqualCharacteristicLubinTateTorsion F n x) : + equalCharacteristicLubinTateBracket F (n + 1) a x = + equalCharacteristicLubinTateBracket F n a x := by + rw [equalCharacteristicLubinTateBracket_apply, + Finset.sum_range_succ, equalCharacteristicLubinTateBracket_apply, + hx, mul_zero, add_zero] + +/-- If `x` is killed by `e^(n+1)`, applying `e` to an `(n+1)`-term bracket +drops it to the `n`-term bracket at `e(x)`. -/ +theorem equalCharacteristicLubinTatePiEnd_bracket_succ_of_torsion + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧) + (x : F.residueField⸨X⸩) + (hx : IsEqualCharacteristicLubinTateTorsion F (n + 1) x) : + equalCharacteristicLubinTatePiEnd F + (equalCharacteristicLubinTateBracket F (n + 1) a x) = + equalCharacteristicLubinTateBracket F n a + (equalCharacteristicLubinTatePiEnd F x) := by + rw [equalCharacteristicLubinTatePiEnd_bracket] + exact equalCharacteristicLubinTateBracket_succ_eq_of_torsion + F n a (equalCharacteristicLubinTatePiEnd F x) + (equalCharacteristicLubinTatePiEnd_torsion_pred F n x hx) + +/-- Multiplicativity of the genuine truncated Lubin--Tate brackets on +`e^n`-division points. -/ +theorem equalCharacteristicLubinTateBracket_mul_apply_of_torsion + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a b : F.residueField⟦X⟧) + (x : F.residueField⸨X⸩) + (hx : IsEqualCharacteristicLubinTateTorsion F n x) : + equalCharacteristicLubinTateBracket F n (a * b) x = + equalCharacteristicLubinTateBracket F n a + (equalCharacteristicLubinTateBracket F n b x) := by + induction n generalizing a b x with + | zero => + simp [equalCharacteristicLubinTateBracket_apply] + | succ n ih => + have hxpred : + IsEqualCharacteristicLubinTateTorsion F n + (equalCharacteristicLubinTatePiEnd F x) := + equalCharacteristicLubinTatePiEnd_torsion_pred F n x hx + have hcoeff : + PowerSeries.coeff 0 (a * b) = + PowerSeries.coeff 0 a * PowerSeries.coeff 0 b := by + rw [PowerSeries.coeff_zero_eq_constantCoeff_apply, map_mul, + PowerSeries.coeff_zero_eq_constantCoeff_apply, + PowerSeries.coeff_zero_eq_constantCoeff_apply] + calc + equalCharacteristicLubinTateBracket F (n + 1) (a * b) x = + algebraMap F.residueField F.residueField⸨X⸩ + (PowerSeries.coeff 0 (a * b)) * x + + equalCharacteristicLubinTateBracket F n + (equalCharacteristicPowerSeriesTail (a * b)) + (equalCharacteristicLubinTatePiEnd F x) := + equalCharacteristicLubinTateBracket_succ_apply F n (a * b) x + _ = + algebraMap F.residueField F.residueField⸨X⸩ + (PowerSeries.coeff 0 a * PowerSeries.coeff 0 b) * x + + equalCharacteristicLubinTateBracket F n + (PowerSeries.C (PowerSeries.coeff 0 a) * + equalCharacteristicPowerSeriesTail b + + equalCharacteristicPowerSeriesTail a * b) + (equalCharacteristicLubinTatePiEnd F x) := by + rw [hcoeff, equalCharacteristicPowerSeriesTail_mul] + _ = + algebraMap F.residueField F.residueField⸨X⸩ + (PowerSeries.coeff 0 a * PowerSeries.coeff 0 b) * x + + (equalCharacteristicLubinTateBracket F n + (PowerSeries.C (PowerSeries.coeff 0 a) * + equalCharacteristicPowerSeriesTail b) + (equalCharacteristicLubinTatePiEnd F x) + + equalCharacteristicLubinTateBracket F n + (equalCharacteristicPowerSeriesTail a * b) + (equalCharacteristicLubinTatePiEnd F x)) := by + congr 1 + exact congrArg + (fun f : AddMonoid.End F.residueField⸨X⸩ ↦ + f (equalCharacteristicLubinTatePiEnd F x)) + (equalCharacteristicLubinTateBracket_add F n + (PowerSeries.C (PowerSeries.coeff 0 a) * + equalCharacteristicPowerSeriesTail b) + (equalCharacteristicPowerSeriesTail a * b)) + _ = + algebraMap F.residueField F.residueField⸨X⸩ + (PowerSeries.coeff 0 a * PowerSeries.coeff 0 b) * x + + (algebraMap F.residueField F.residueField⸨X⸩ + (PowerSeries.coeff 0 a) * + equalCharacteristicLubinTateBracket F n + (equalCharacteristicPowerSeriesTail b) + (equalCharacteristicLubinTatePiEnd F x) + + equalCharacteristicLubinTateBracket F n + (equalCharacteristicPowerSeriesTail a) + (equalCharacteristicLubinTateBracket F n b + (equalCharacteristicLubinTatePiEnd F x))) := by + rw [equalCharacteristicLubinTateBracket_C_mul_apply, + ih (equalCharacteristicPowerSeriesTail a) b + (equalCharacteristicLubinTatePiEnd F x) hxpred] + _ = + algebraMap F.residueField F.residueField⸨X⸩ + (PowerSeries.coeff 0 a) * + (algebraMap F.residueField F.residueField⸨X⸩ + (PowerSeries.coeff 0 b) * x + + equalCharacteristicLubinTateBracket F n + (equalCharacteristicPowerSeriesTail b) + (equalCharacteristicLubinTatePiEnd F x)) + + equalCharacteristicLubinTateBracket F n + (equalCharacteristicPowerSeriesTail a) + (equalCharacteristicLubinTateBracket F n b + (equalCharacteristicLubinTatePiEnd F x)) := by + rw [(algebraMap F.residueField + F.residueField⸨X⸩).map_mul] + ring + _ = + algebraMap F.residueField F.residueField⸨X⸩ + (PowerSeries.coeff 0 a) * + equalCharacteristicLubinTateBracket F (n + 1) b x + + equalCharacteristicLubinTateBracket F n + (equalCharacteristicPowerSeriesTail a) + (equalCharacteristicLubinTatePiEnd F + (equalCharacteristicLubinTateBracket F (n + 1) b x)) := by + rw [equalCharacteristicLubinTatePiEnd_bracket_succ_of_torsion + F n b x hx, + equalCharacteristicLubinTateBracket_succ_apply] + _ = + equalCharacteristicLubinTateBracket F (n + 1) a + (equalCharacteristicLubinTateBracket F (n + 1) b x) := + (equalCharacteristicLubinTateBracket_succ_apply F n a + (equalCharacteristicLubinTateBracket F (n + 1) b x)).symm + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean new file mode 100644 index 0000000000..865c746b59 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean @@ -0,0 +1,311 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel +public import Mathlib.Algebra.CharP.Algebra +public import Mathlib.Algebra.CharP.Frobenius +/-! +# The equal-characteristic Lubin–Tate action: the equal-characteristic Lubin--Tate endomorphism + +After identifying an equal-characteristic local field with `κ((T))`, the +Lubin--Tate polynomial used in the equal-characteristic construction is + +`e(Y) = Y ^ q + T * Y`, where `q = #κ`. + +This file constructs `e` as an actual additive endomorphism and constructs +the finite bracket + +`[a]_ = ∑_{i simp + | @insert i s hi ih => + rw [Finset.sum_insert hi, Finset.sum_insert hi] + change f i x + (∑ j ∈ s, f j) x = f i x + ∑ j ∈ s, f j x + rw [ih] + +/-- The residue Laurent-series field has the local field's residue characteristic. -/ +instance equalCharacteristicLaurentCharP + (F : LocalField.{u, v} K) + : + CharP F.residueField⸨X⸩ F.residueCharacteristic := + charP_of_injective_algebraMap + (algebraMap F.residueField F.residueField⸨X⸩).injective + F.residueCharacteristic + +/-- The additive Lubin--Tate endomorphism `Y ↦ Y^q + T Y` on `κ((T))`. +The `q`-power map is the Frobenius iterate supplied by the residue-cardinality +formula from the general Lubin–Tate construction. -/ +noncomputable def equalCharacteristicLubinTatePiEnd + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] : + AddMonoid.End F.residueField⸨X⸩ where + toFun x := + iterateFrobenius F.residueField⸨X⸩ F.residueCharacteristic + (CompleteDVF.higherPrincipalUnitGroup.iwasawaResidueRank F) x + + equalCharacteristicLaurentUniformizer F * x + map_zero' := by simp + map_add' x y := by + rw [(iterateFrobenius F.residueField⸨X⸩ F.residueCharacteristic + (CompleteDVF.higherPrincipalUnitGroup.iwasawaResidueRank F)).map_add, + mul_add] + abel + +open CompleteDVF.higherPrincipalUnitGroup renaming + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank → + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank in +/-- The Lubin–Tate `π`-endomorphism is Frobenius plus uniformizer multiplication. -/ +@[simp] +theorem equalCharacteristicLubinTatePiEnd_apply + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (x : F.residueField⸨X⸩) : + equalCharacteristicLubinTatePiEnd F x = + x ^ Nat.card F.residueField + + equalCharacteristicLaurentUniformizer F * x := by + change + iterateFrobenius F.residueField⸨X⸩ F.residueCharacteristic + (CompleteDVF.higherPrincipalUnitGroup.iwasawaResidueRank F) x + + equalCharacteristicLaurentUniformizer F * x = _ + rw [iterateFrobenius_def] + rw [residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F] + +/-- Multiplication by a residue-field coefficient, regarded as an additive +endomorphism of the Laurent-series field. -/ +noncomputable def equalCharacteristicCoefficientEnd + (F : LocalField.{u, v} K) (a : F.residueField) : + AddMonoid.End F.residueField⸨X⸩ where + toFun x := + algebraMap F.residueField F.residueField⸨X⸩ a * x + map_zero' := mul_zero _ + map_add' := mul_add _ + +/-- A residue coefficient endomorphism acts by scalar multiplication. -/ +@[simp] +theorem equalCharacteristicCoefficientEnd_apply + (F : LocalField.{u, v} K) (a : F.residueField) + (x : F.residueField⸨X⸩) : + equalCharacteristicCoefficientEnd F a x = + algebraMap F.residueField F.residueField⸨X⸩ a * x := + rfl + +/-- The distinguished endomorphism commutes with the genuine coefficient +action. -/ +theorem equalCharacteristicLubinTatePiEnd_coefficient_mul + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (a : F.residueField) (x : F.residueField⸨X⸩) : + equalCharacteristicLubinTatePiEnd F + (algebraMap F.residueField F.residueField⸨X⸩ a * x) = + algebraMap F.residueField F.residueField⸨X⸩ a * + equalCharacteristicLubinTatePiEnd F x := by + let : Fintype F.residueField := Fintype.ofFinite F.residueField + rw [equalCharacteristicLubinTatePiEnd_apply, + equalCharacteristicLubinTatePiEnd_apply, mul_pow, ← map_pow] + have ha : a ^ Nat.card F.residueField = a := by + simpa only [Nat.card_eq_fintype_card] using FiniteField.pow_card a + rw [ha] + ring + +/-- The `i`-fold iterate of the distinguished Lubin--Tate endomorphism. -/ +noncomputable def equalCharacteristicLubinTatePiIterate + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (i : ℕ) : AddMonoid.End F.residueField⸨X⸩ := + (equalCharacteristicLubinTatePiEnd F) ^ i + +/-- The zeroth Lubin–Tate `π`-iterate is the identity. -/ +@[simp] +theorem equalCharacteristicLubinTatePiIterate_zero + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (x : F.residueField⸨X⸩) : + equalCharacteristicLubinTatePiIterate F 0 x = x := by + simp [equalCharacteristicLubinTatePiIterate] + +/-- A successor `π`-iterate applies one more Lubin–Tate `π`-endomorphism. -/ +@[simp] +theorem equalCharacteristicLubinTatePiIterate_succ + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (i : ℕ) (x : F.residueField⸨X⸩) : + equalCharacteristicLubinTatePiIterate F (i + 1) x = + equalCharacteristicLubinTatePiIterate F i + (equalCharacteristicLubinTatePiEnd F x) := by + change + ((equalCharacteristicLubinTatePiEnd F) ^ (i + 1)) x = + ((equalCharacteristicLubinTatePiEnd F) ^ i) + (equalCharacteristicLubinTatePiEnd F x) + rw [pow_succ] + rfl + +/-- Every iterate of `e` commutes with multiplication by a residue-field +coefficient. -/ +theorem equalCharacteristicLubinTatePiIterate_coefficient_mul + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (i : ℕ) (a : F.residueField) (x : F.residueField⸨X⸩) : + equalCharacteristicLubinTatePiIterate F i + (algebraMap F.residueField F.residueField⸨X⸩ a * x) = + algebraMap F.residueField F.residueField⸨X⸩ a * + equalCharacteristicLubinTatePiIterate F i x := by + induction i generalizing x with + | zero => simp + | succ i ih => + rw [equalCharacteristicLubinTatePiIterate_succ, + equalCharacteristicLubinTatePiEnd_coefficient_mul, + ih, + equalCharacteristicLubinTatePiIterate_succ] + +/-- The genuine finite-level bracket +`[a]_ = ∑_{i + rw [equalCharacteristicCompletedUnramifiedFrobenius_coeff] + change + ((f : (AlgebraicClosure k)⸨X⸩).coeff (Int.ofNat n)) ^ + Nat.card k = + ((equalCharacteristicPowerSeriesFrobenius k f : + (AlgebraicClosure k)⟦X⟧) : + (AlgebraicClosure k)⸨X⸩).coeff (Int.ofNat n) + rw [PowerSeries.coeff_coe, PowerSeries.coeff_coe, + equalCharacteristicPowerSeriesFrobenius_coeff] + simp [hcard] + | negSucc n => + rw [equalCharacteristicCompletedUnramifiedFrobenius_coeff] + change + ((f : (AlgebraicClosure k)⸨X⸩).coeff (Int.negSucc n)) ^ + Nat.card k = + ((equalCharacteristicPowerSeriesFrobenius k f : + (AlgebraicClosure k)⟦X⟧) : + (AlgebraicClosure k)⸨X⸩).coeff (Int.negSucc n) + rw [PowerSeries.coeff_coe, PowerSeries.coeff_coe] + simp [hcard] + +/-- Every coefficient of a Frobenius-fixed completed Laurent series comes +from the original finite coefficient field. -/ +theorem equalCharacteristicCompletedUnramified_fixed_coeff_mem_range + (x : equalCharacteristicCompletedUnramifiedField k) + (hx : equalCharacteristicCompletedUnramifiedFrobenius k x = x) + (m : ℤ) : + equalCharacteristicCompletedUnramifiedFieldCoeff k x m ∈ + (algebraMap k (AlgebraicClosure k)).range := by + apply (equalCharacteristicCoefficientFrobenius_fixed_iff k + (equalCharacteristicCompletedUnramifiedFieldCoeff k x m)).1 + rw [equalCharacteristicCoefficientFrobenius_apply] + have hcoeff := congrArg + (fun y : equalCharacteristicCompletedUnramifiedField k ↦ + equalCharacteristicCompletedUnramifiedFieldCoeff k y m) hx + change equalCharacteristicCompletedUnramifiedFieldCoeff k + (equalCharacteristicCompletedUnramifiedFrobenius k x) m = + equalCharacteristicCompletedUnramifiedFieldCoeff k x m at hcoeff + rw [equalCharacteristicCompletedUnramifiedFrobenius_coeff] at hcoeff + exact hcoeff + +/-- A chosen coefficient in `k` lifting one coefficient of a +Frobenius-fixed completed Laurent series. -/ +noncomputable def equalCharacteristicCompletedUnramifiedFixedCoeff + (x : equalCharacteristicCompletedUnramifiedField k) + (hx : equalCharacteristicCompletedUnramifiedFrobenius k x = x) + (m : ℤ) : k := + Classical.choose + (equalCharacteristicCompletedUnramified_fixed_coeff_mem_range k x hx m) + +/-- The chosen base coefficient embeds to the coefficient of the fixed series. -/ +@[simp] +theorem algebraMap_equalCharacteristicCompletedUnramifiedFixedCoeff + (x : equalCharacteristicCompletedUnramifiedField k) + (hx : equalCharacteristicCompletedUnramifiedFrobenius k x = x) + (m : ℤ) : + algebraMap k (AlgebraicClosure k) + (equalCharacteristicCompletedUnramifiedFixedCoeff k x hx m) = + equalCharacteristicCompletedUnramifiedFieldCoeff k x m := + Classical.choose_spec + (equalCharacteristicCompletedUnramified_fixed_coeff_mem_range k x hx m) + +/-- A Frobenius-fixed series, descended coefficientwise to `k((T))`. -/ +noncomputable def equalCharacteristicCompletedUnramifiedFixedPreimage + (x : equalCharacteristicCompletedUnramifiedField k) + (hx : equalCharacteristicCompletedUnramifiedFrobenius k x = x) : + k⸨X⸩ := + HahnSeries.ofSuppBddBelow + (fun m : ℤ ↦ + equalCharacteristicCompletedUnramifiedFixedCoeff k x hx m) + (by + refine ⟨x.order, ?_⟩ + intro m hm + by_contra hnot + have hxzero : + equalCharacteristicCompletedUnramifiedFieldCoeff k x m = 0 := by + exact HahnSeries.coeff_eq_zero_of_lt_order (not_le.mp hnot) + apply hm + apply (algebraMap k (AlgebraicClosure k)).injective + rw [map_zero, + algebraMap_equalCharacteristicCompletedUnramifiedFixedCoeff, + hxzero]) + +/-- The descended Laurent series has the chosen fixed coefficients. -/ +@[simp] +theorem equalCharacteristicCompletedUnramifiedFixedPreimage_coeff + (x : equalCharacteristicCompletedUnramifiedField k) + (hx : equalCharacteristicCompletedUnramifiedFrobenius k x = x) + (m : ℤ) : + (equalCharacteristicCompletedUnramifiedFixedPreimage k x hx).coeff m = + equalCharacteristicCompletedUnramifiedFixedCoeff k x hx m := by + rw [equalCharacteristicCompletedUnramifiedFixedPreimage] + exact congrFun HahnSeries.coeff_ofSuppBddBelow m + +/-- The fixed field of coefficientwise Frobenius is exactly the embedded +Laurent-series base `k((T))`. -/ +theorem equalCharacteristicCompletedUnramifiedFrobenius_fixed_iff + (x : equalCharacteristicCompletedUnramifiedField k) : + equalCharacteristicCompletedUnramifiedFrobenius k x = x ↔ + x ∈ (algebraMap k⸨X⸩ + (equalCharacteristicCompletedUnramifiedField k)).range := by + constructor + · intro hx + refine ⟨equalCharacteristicCompletedUnramifiedFixedPreimage k x hx, ?_⟩ + ext m + exact algebraMap_equalCharacteristicCompletedUnramifiedFixedCoeff k x hx m + · rintro ⟨y, rfl⟩ + exact (equalCharacteristicCompletedUnramifiedFrobenius k).commutes y + +/-- The Frobenius fixes the Laurent uniformizer `T`. -/ +@[simp] +theorem equalCharacteristicCompletedUnramifiedFrobenius_uniformizer : + equalCharacteristicCompletedUnramifiedFrobenius k + (equalCharacteristicCompletedUnramifiedFieldSingle k 1 1) = + equalCharacteristicCompletedUnramifiedFieldSingle k 1 1 := by + have hcard : Nat.card k ≠ 0 := Nat.card_pos.ne' + ext m + by_cases h : m = 1 + · subst m + simp [equalCharacteristicCompletedUnramifiedFieldSingle] + · simp [equalCharacteristicCompletedUnramifiedFieldSingle, h, hcard] + +/-- Evaluation of an outer power series with coefficients in +`(AlgebraicClosure k)[[T]]` at a topologically nilpotent point of the +completed-unramified integer ring. This is the analytic evaluation map +needed for the theta series in the completed theta-intertwining theorem. -/ +noncomputable def equalCharacteristicPowerSeriesToCompletedInteger : + (AlgebraicClosure k)⟦X⟧ →+* + Valued.integer (equalCharacteristicCompletedUnramifiedField k) := by + change (AlgebraicClosure k)⟦X⟧ →+* + Valued.integer ((AlgebraicClosure k)⸨X⸩) + exact + (powerSeriesEquivLaurentInteger (AlgebraicClosure k)).toRingHom + +omit [Finite k] in +/-- The embedding of power series into the completed valuation ring is continuous. -/ +theorem equalCharacteristicPowerSeriesToCompletedInteger_continuous : + Continuous (equalCharacteristicPowerSeriesToCompletedInteger k) := by + change Continuous + (powerSeriesEquivLaurentInteger (AlgebraicClosure k)).toRingHom + exact continuous_powerSeriesToLaurentInteger + +/-- Defines `equalCharacteristicCompletedIntegerEvaluation`. -/ +noncomputable def equalCharacteristicCompletedIntegerEvaluation + (a : Valued.integer (equalCharacteristicCompletedUnramifiedField k)) + (ha : PowerSeries.HasEval a) : + ((AlgebraicClosure k)⟦X⟧)⟦X⟧ →+* + Valued.integer (equalCharacteristicCompletedUnramifiedField k) := by + letI : IsLinearTopology + (Valued.integer (equalCharacteristicCompletedUnramifiedField k)) + (Valued.integer (equalCharacteristicCompletedUnramifiedField k)) := + valuedIntegerLinearTopology + letI : CompleteSpace + (Valued.integer (equalCharacteristicCompletedUnramifiedField k)) := + valuedIntegerCompleteSpace + letI : IsUniformAddGroup + (Valued.integer (equalCharacteristicCompletedUnramifiedField k)) := + valuedIntegerIsUniformAddGroup + exact PowerSeries.eval₂Hom + (equalCharacteristicPowerSeriesToCompletedInteger_continuous k) ha + +/-- The Laurent uniformizer, viewed in the completed-unramified integer +ring. -/ +noncomputable def equalCharacteristicCompletedIntegerUniformizer : + Valued.integer (equalCharacteristicCompletedUnramifiedField k) := + equalCharacteristicPowerSeriesToCompletedInteger k PowerSeries.X + +omit [Finite k] in +/-- The completed-unramified uniformizer is topologically nilpotent. -/ +theorem equalCharacteristicCompletedIntegerUniformizer_hasEval : + PowerSeries.HasEval + (equalCharacteristicCompletedIntegerUniformizer k) := by + have hX : PowerSeries.HasEval + (PowerSeries.X : (AlgebraicClosure k)⟦X⟧) := + PowerSeries.HasEval.X + exact hX.map + (equalCharacteristicPowerSeriesToCompletedInteger_continuous k) + +omit [Finite k] in +/-- Completed power-series evaluation sends `X` to the chosen integral element. -/ +@[simp] +theorem equalCharacteristicCompletedIntegerEvaluation_X + (a : Valued.integer (equalCharacteristicCompletedUnramifiedField k)) + (ha : PowerSeries.HasEval a) : + equalCharacteristicCompletedIntegerEvaluation k a ha PowerSeries.X = a := by + rw [equalCharacteristicCompletedIntegerEvaluation, + PowerSeries.coe_eval₂Hom, PowerSeries.eval₂_X] + +omit [Finite k] in +/-- Completed evaluation sends a constant series to its canonical embedded value. -/ +@[simp] +theorem equalCharacteristicCompletedIntegerEvaluation_C + (a : Valued.integer (equalCharacteristicCompletedUnramifiedField k)) + (ha : PowerSeries.HasEval a) + (f : (AlgebraicClosure k)⟦X⟧) : + equalCharacteristicCompletedIntegerEvaluation k a ha (PowerSeries.C f) = + equalCharacteristicPowerSeriesToCompletedInteger k f := by + rw [equalCharacteristicCompletedIntegerEvaluation, + PowerSeries.coe_eval₂Hom, PowerSeries.eval₂_C] + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/ContractingEquation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/ContractingEquation.lean new file mode 100644 index 0000000000..cee6dd7763 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/ContractingEquation.lean @@ -0,0 +1,151 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RingTheory.PowerSeries.Basic +public import Mathlib.Algebra.BigOperators.NatAntidiagonal +/-! +# LubinTate the contracting Frobenius equation: the contracting Frobenius equation + +The coefficient recursion in the proof of the contracting Frobenius equation repeatedly solves + +`α - γ φ(α) = β` + +in a complete discrete valuation ring, where `γ` has positive valuation. +For an equal-characteristic power-series ring, positive valuation is exactly +the vanishing of the constant coefficient. The equation can therefore be +solved algebraically, coefficient by coefficient: the coefficient of degree +`n` on the right only involves coefficients of `α` of degree strictly less +than `n`. + +This file records that source-producing recursion directly. No completeness +or external existence assumption is needed. +-/ + +@[expose] public section + +noncomputable +section + +open scoped PowerSeries + +namespace LubinTate +namespace EqualCharacteristic + +variable {R : Type*} [CommRing R] + +/-- The recursively determined coefficients of the solution of +`α = β + γ * φ(α)` when `γ(0)=0`. -/ +noncomputable def contractingFrobeniusEquationCoeff + (φ : R →+* R) (γ β : R⟦X⟧) : ℕ → R := + Nat.strongRec fun n previous ↦ + PowerSeries.coeff n β + + ∑ k : Fin n, + PowerSeries.coeff (k.1 + 1) γ * + φ (previous (n - 1 - k.1) (by omega)) + +/-- States the theorem `contractingFrobeniusEquationCoeff_eq`. -/ +theorem contractingFrobeniusEquationCoeff_eq + (φ : R →+* R) (γ β : R⟦X⟧) (n : ℕ) : + contractingFrobeniusEquationCoeff φ γ β n = + PowerSeries.coeff n β + + ∑ k : Fin n, + PowerSeries.coeff (k.1 + 1) γ * + φ (contractingFrobeniusEquationCoeff φ γ β (n - 1 - k.1)) := by + rw [contractingFrobeniusEquationCoeff, Nat.strongRec_eq] + rfl + +/-- The power series obtained from the contracting coefficient recursion. -/ +noncomputable def contractingFrobeniusEquationSolution + (φ : R →+* R) (γ β : R⟦X⟧) : R⟦X⟧ := + PowerSeries.mk (contractingFrobeniusEquationCoeff φ γ β) + +/-- States the theorem `contractingFrobeniusEquationSolution_coeff`. -/ +@[simp] +theorem contractingFrobeniusEquationSolution_coeff + (φ : R →+* R) (γ β : R⟦X⟧) (n : ℕ) : + PowerSeries.coeff n + (contractingFrobeniusEquationSolution φ γ β) = + contractingFrobeniusEquationCoeff φ γ β n := by + simp [contractingFrobeniusEquationSolution] + +private theorem sum_range_succ_convolution_of_constantCoeff_eq_zero + (φ : R →+* R) (γ α : R⟦X⟧) + (hγ : PowerSeries.coeff 0 γ = 0) (n : ℕ) : + ∑ k ∈ Finset.range (n + 1), + PowerSeries.coeff k γ * φ (PowerSeries.coeff (n - k) α) = + ∑ k ∈ Finset.range n, + PowerSeries.coeff (k + 1) γ * + φ (PowerSeries.coeff (n - 1 - k) α) := by + rw [Finset.sum_range_succ'] + simp only [hγ, zero_mul, add_zero] + apply Finset.sum_congr rfl + intro k hk + congr 2 + rw [Nat.sub_sub, Nat.add_comm] + +/-- The recursively constructed series solves the contracting Frobenius +equation from the contracting Frobenius equation. -/ +theorem contractingFrobeniusEquationSolution_spec + (φ : R →+* R) (γ β : R⟦X⟧) + (hγ : PowerSeries.coeff 0 γ = 0) : + contractingFrobeniusEquationSolution φ γ β = + β + γ * PowerSeries.map φ + (contractingFrobeniusEquationSolution φ γ β) := by + apply PowerSeries.ext + intro n + rw [map_add, PowerSeries.coeff_mul, + Finset.Nat.sum_antidiagonal_eq_sum_range_succ_mk] + simp only [PowerSeries.coeff_map] + rw [sum_range_succ_convolution_of_constantCoeff_eq_zero φ γ _ hγ n, + ← Fin.sum_univ_eq_sum_range, + contractingFrobeniusEquationSolution_coeff, + contractingFrobeniusEquationCoeff_eq] + simp only [contractingFrobeniusEquationSolution_coeff] + +/-- Uniqueness of the contracting Frobenius equation. This is the +coefficientwise replacement for a global valuation argument. -/ +theorem contractingFrobeniusEquationSolution_unique + (φ : R →+* R) (γ β α : R⟦X⟧) + (hγ : PowerSeries.coeff 0 γ = 0) + (hα : α = β + γ * PowerSeries.map φ α) : + α = contractingFrobeniusEquationSolution φ γ β := by + apply PowerSeries.ext + intro n + induction n using Nat.strongRecOn with + | ind n ih => + have hcoeff := congrArg (PowerSeries.coeff n) hα + rw [map_add, PowerSeries.coeff_mul, + Finset.Nat.sum_antidiagonal_eq_sum_range_succ_mk] at hcoeff + simp only [PowerSeries.coeff_map] at hcoeff + rw [sum_range_succ_convolution_of_constantCoeff_eq_zero + φ γ α hγ n, ← Fin.sum_univ_eq_sum_range] at hcoeff + rw [contractingFrobeniusEquationSolution_coeff, + contractingFrobeniusEquationCoeff_eq, hcoeff] + congr 1 + apply Finset.sum_congr rfl + intro k _ + congr 2 + rw [← contractingFrobeniusEquationSolution_coeff] + apply ih + omega + +/-- traditional notation form: the unique solution of `α - γ φ(α) = β`. -/ +theorem existsUnique_contractingFrobeniusEquation + (φ : R →+* R) (γ β : R⟦X⟧) + (hγ : PowerSeries.coeff 0 γ = 0) : + ∃! α : R⟦X⟧, α - γ * PowerSeries.map φ α = β := by + refine ⟨contractingFrobeniusEquationSolution φ γ β, ?_, ?_⟩ + · apply (sub_eq_iff_eq_add).2 + exact contractingFrobeniusEquationSolution_spec φ γ β hγ + · intro α hα + apply contractingFrobeniusEquationSolution_unique φ γ β α hγ + rw [sub_eq_iff_eq_add] at hα + exact hα + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean new file mode 100644 index 0000000000..e8fd61491d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean @@ -0,0 +1,577 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FiniteCoefficientLaurent +public import Mathlib.FieldTheory.Finite.Extension +public import Mathlib.FieldTheory.Galois.Profinite +public import Mathlib.LinearAlgebra.Basis.Basic +public import Mathlib.LinearAlgebra.Dimension.Free +/-! +# The equal-characteristic completed-unramified construction: finite unramified coefficient + extensions in equal characteristic + +For a finite extension `l / k` of finite fields, coefficientwise extension +makes `l((T))` a finite extension of `k((T))` of the same degree. Every +automorphism of `l / k` extends coefficientwise, and these extensions exhaust +the Galois group of `l((T)) / k((T))`. In particular, arithmetic Frobenius +on `l` gives the genuine Frobenius automorphism of this finite Laurent-series +base change and fixes `T`. + +This is the finite unramified source used to model the completed maximal +unramified field in the equal-characteristic completed-unramified construction. The + construction is coefficientwise and does not +postulate an abstract unramified extension. +-/ + +@[expose] public section + +noncomputable +section + + +open scoped LaurentSeries PowerSeries + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +variable {k : Type u} {l : Type v} + +/-- The coefficientwise map `k((T)) -> l((T))` induced by a ring map +`k -> l`. -/ +noncomputable def laurentSeriesCoefficientMap + {k : Type u} {l : Type v} [Field k] [Field l] + (f : k →+* l) : k⸨X⸩ →+* l⸨X⸩ where + toFun x := HahnSeries.map x f + map_zero' := by + change HahnSeries.map (0 : k⸨X⸩) f.toZeroHom = 0 + exact HahnSeries.map_zero (Γ := ℤ) f.toZeroHom + map_one' := by + change HahnSeries.map (1 : k⸨X⸩) f.toMonoidWithZeroHom = 1 + exact HahnSeries.map_one (Γ := ℤ) f.toMonoidWithZeroHom + map_add' x y := by + change HahnSeries.map (x + y) f.toAddMonoidHom = + HahnSeries.map x f.toAddMonoidHom + HahnSeries.map y f.toAddMonoidHom + exact HahnSeries.map_add (Γ := ℤ) f.toAddMonoidHom + map_mul' x y := by + change HahnSeries.map (x * y) f.toNonUnitalRingHom = + HahnSeries.map x f.toNonUnitalRingHom * HahnSeries.map y f.toNonUnitalRingHom + exact HahnSeries.map_mul (Γ := ℤ) f.toNonUnitalRingHom + +/-- Mapping Laurent-series coefficients applies the ring homomorphism coefficientwise. -/ +@[simp] +theorem laurentSeriesCoefficientMap_coeff + [Field k] [Field l] (f : k →+* l) (x : k⸨X⸩) (m : ℤ) : + (laurentSeriesCoefficientMap f x).coeff m = f (x.coeff m) := + rfl + +/-- The coefficient map sends a constant series to the mapped constant series. -/ +theorem laurentSeriesCoefficientMap_C + [Field k] [Field l] (f : k →+* l) (a : k) : + laurentSeriesCoefficientMap f (HahnSeries.C (Γ := ℤ) a) = + HahnSeries.C (Γ := ℤ) (f a) := by + change HahnSeries.map (HahnSeries.C (Γ := ℤ) a) f = _ + exact HahnSeries.map_C a f + +/-- The coefficient map fixes the Laurent uniformizer monomial. -/ +@[simp] +theorem laurentSeriesCoefficientMap_single_one + [Field k] [Field l] (f : k →+* l) : + laurentSeriesCoefficientMap f (HahnSeries.single (1 : ℤ) 1) = + (HahnSeries.single (1 : ℤ) 1 : l⸨X⸩) := by + ext m + by_cases h : m = 1 + · subst m + simp + · simp [HahnSeries.coeff_single_of_ne h] + +/-- The induced `k((T))`-algebra structure on `l((T))`. -/ +@[reducible] +noncomputable def laurentSeriesCoefficientAlgebra + [Field k] [Field l] [Algebra k l] : Algebra k⸨X⸩ l⸨X⸩ := + RingHom.toAlgebra + (laurentSeriesCoefficientMap (algebraMap k l)) + +/-- The induced Laurent-series algebra map is the coefficientwise scalar map. -/ +theorem laurentSeriesCoefficientAlgebra_algebraMap + [Field k] [Field l] [Algebra k l] : + letI : Algebra k⸨X⸩ l⸨X⸩ := laurentSeriesCoefficientAlgebra + algebraMap k⸨X⸩ l⸨X⸩ = + laurentSeriesCoefficientMap (algebraMap k l) := + rfl + +attribute [local instance] laurentSeriesCoefficientAlgebra + +/-- One coefficient coordinate of a Laurent series with respect to a basis +of the coefficient extension. -/ +noncomputable def laurentSeriesCoefficientCoord + [Field k] [Field l] [Algebra k l] + {ι : Type*} (b : Module.Basis ι k l) + (x : l⸨X⸩) (i : ι) : k⸨X⸩ := + HahnSeries.ofSuppBddBelow + (fun m : ℤ ↦ b.repr (x.coeff m) i) + (by + refine ⟨x.order, ?_⟩ + intro m hm + by_contra hnot + have hxzero : x.coeff m = 0 := + HahnSeries.coeff_eq_zero_of_lt_order (not_le.mp hnot) + exact hm (by simp [hxzero])) + +/-- A Laurent coordinate series records the corresponding basis coordinate coefficientwise. -/ +@[simp] +theorem laurentSeriesCoefficientCoord_coeff + [Field k] [Field l] [Algebra k l] + {ι : Type*} (b : Module.Basis ι k l) + (x : l⸨X⸩) (i : ι) (m : ℤ) : + (laurentSeriesCoefficientCoord b x i).coeff m = + b.repr (x.coeff m) i := by + rfl + +section FiniteBasis + +variable [Field k] [Field l] [Algebra k l] + {ι : Type*} [Fintype ι] + +omit [Fintype ι] in +private theorem laurentSeriesCoefficientBasis_linearIndependent [Finite ι] + (b : Module.Basis ι k l) : + LinearIndependent k⸨X⸩ + (fun i : ι ↦ (HahnSeries.C (Γ := ℤ) (b i) : l⸨X⸩)) := by + classical + let := Fintype.ofFinite ι + let : Algebra k⸨X⸩ l⸨X⸩ := laurentSeriesCoefficientAlgebra + classical + rw [Fintype.linearIndependent_iff] + intro g hg i + ext m + have hcoeff := congrArg (fun x : l⸨X⸩ ↦ x.coeff m) hg + have halgebraMap_coeff (x : k⸨X⸩) : + (algebraMap k⸨X⸩ l⸨X⸩ x).coeff m = + algebraMap k l (x.coeff m) := by + change + (laurentSeriesCoefficientMap (algebraMap k l) x).coeff m = + algebraMap k l (x.coeff m) + exact laurentSeriesCoefficientMap_coeff (algebraMap k l) x m + have hsum : + ∑ j : ι, algebraMap k l ((g j).coeff m) * b j = 0 := by + simpa [Algebra.smul_def, laurentSeriesCoefficientAlgebra, + laurentSeriesCoefficientMap, halgebraMap_coeff, mul_comm] using hcoeff + have hrepr : ∀ j : ι, (g j).coeff m = 0 := by + intro j + have hb := Fintype.linearIndependent_iff.mp b.linearIndependent + (fun t : ι ↦ (g t).coeff m) (by + simpa [Algebra.smul_def] using hsum) j + exact hb + exact hrepr i + +omit [Fintype ι] in +private theorem laurentSeriesCoefficientBasis_span [Finite ι] + (b : Module.Basis ι k l) : + Submodule.span k⸨X⸩ + (Set.range (fun i : ι ↦ + (HahnSeries.C (Γ := ℤ) (b i) : l⸨X⸩))) = ⊤ := by + classical + let := Fintype.ofFinite ι + let : Algebra k⸨X⸩ l⸨X⸩ := laurentSeriesCoefficientAlgebra + classical + rw [eq_top_iff] + intro x _hx + let coord : ι → k⸨X⸩ := fun i ↦ laurentSeriesCoefficientCoord b x i + have hsum : + (∑ i : ι, coord i • + (HahnSeries.C (Γ := ℤ) (b i) : l⸨X⸩)) = x := by + ext m + rw [HahnSeries.coeff_sum] + calc + (∑ i : ι, (coord i • + (HahnSeries.C (Γ := ℤ) (b i) : l⸨X⸩) : l⸨X⸩).coeff m) = + ∑ i : ι, algebraMap k l (b.repr (x.coeff m) i) * b i := by + apply Finset.sum_congr rfl + intro i _ + change + ((HahnSeries.map (coord i) (algebraMap k l)) * + (HahnSeries.C (Γ := ℤ) (b i) : l⸨X⸩)).coeff m = _ + rw [mul_comm] + simp [coord, mul_comm] + _ = x.coeff m := by + simpa [Algebra.smul_def] using b.sum_repr (x.coeff m) + rw [← hsum] + exact Submodule.sum_mem _ fun i _ ↦ + Submodule.smul_mem _ (coord i) + (Submodule.subset_span ⟨i, rfl⟩) + +/-- A finite coefficient basis extends coefficientwise to a Laurent-series +basis. -/ +noncomputable def laurentSeriesCoefficientBasis + (b : Module.Basis ι k l) : Module.Basis ι k⸨X⸩ l⸨X⸩ := by + letI : Algebra k⸨X⸩ l⸨X⸩ := laurentSeriesCoefficientAlgebra + exact Module.Basis.mk (v := fun i => (HahnSeries.C (Γ := ℤ) (b i) : l⸨X⸩)) + (by exact laurentSeriesCoefficientBasis_linearIndependent b) + (by exact (laurentSeriesCoefficientBasis_span b).ge) + +/-- The induced Laurent-series basis consists of constant images of the coefficient basis. -/ +@[simp] +theorem laurentSeriesCoefficientBasis_apply + (b : Module.Basis ι k l) (i : ι) : + letI : Algebra k⸨X⸩ l⸨X⸩ := laurentSeriesCoefficientAlgebra + laurentSeriesCoefficientBasis b i = + (HahnSeries.C (Γ := ℤ) (b i) : l⸨X⸩) := by + let : Algebra k⸨X⸩ l⸨X⸩ := laurentSeriesCoefficientAlgebra + exact Module.Basis.mk_apply _ _ _ + +end FiniteBasis + +/-- Finite-dimensionality is preserved by coefficientwise Laurent-series +extension. -/ +theorem laurentSeriesCoefficient_finiteDimensional + [Field k] [Field l] [Algebra k l] [FiniteDimensional k l] : + letI : Algebra k⸨X⸩ l⸨X⸩ := laurentSeriesCoefficientAlgebra + FiniteDimensional k⸨X⸩ l⸨X⸩ := by + let : Algebra k⸨X⸩ l⸨X⸩ := laurentSeriesCoefficientAlgebra + let b : Module.Basis (Fin (Module.finrank k l)) k l := Module.finBasis k l + exact (laurentSeriesCoefficientBasis b).finiteDimensional_of_finite + +/-- Coefficient extension does not change the finite extension degree. -/ +theorem laurentSeriesCoefficient_finrank + [Field k] [Field l] [Algebra k l] [FiniteDimensional k l] : + letI : Algebra k⸨X⸩ l⸨X⸩ := laurentSeriesCoefficientAlgebra + Module.finrank k⸨X⸩ l⸨X⸩ = Module.finrank k l := by + let : Algebra k⸨X⸩ l⸨X⸩ := laurentSeriesCoefficientAlgebra + let b : Module.Basis (Fin (Module.finrank k l)) k l := Module.finBasis k l + let B := laurentSeriesCoefficientBasis b + let : FiniteDimensional k⸨X⸩ l⸨X⸩ := + B.finiteDimensional_of_finite + simpa [B] using Module.finrank_eq_card_basis B + +/-- A coefficient-field ring equivalence extends coefficientwise to Laurent +series. -/ +noncomputable def laurentSeriesCoefficientRingEquiv + [Field k] [Field l] (e : k ≃+* l) : k⸨X⸩ ≃+* l⸨X⸩ where + toFun := laurentSeriesCoefficientMap e.toRingHom + invFun := laurentSeriesCoefficientMap e.symm.toRingHom + left_inv x := by + ext m + simp + right_inv x := by + ext m + simp + map_add' := map_add (laurentSeriesCoefficientMap e.toRingHom) + map_mul' := map_mul (laurentSeriesCoefficientMap e.toRingHom) + +/-- A coefficientwise ring equivalence applies the base equivalence at every exponent. -/ +@[simp] +theorem laurentSeriesCoefficientRingEquiv_coeff + [Field k] [Field l] (e : k ≃+* l) (x : k⸨X⸩) (m : ℤ) : + (laurentSeriesCoefficientRingEquiv e x).coeff m = e (x.coeff m) := + rfl + +/-- An automorphism of the coefficient extension acts coefficientwise as an +automorphism over the Laurent-series base. -/ +noncomputable def laurentSeriesCoefficientAlgEquiv + [Field k] [Field l] [Algebra k l] + (e : l ≃ₐ[k] l) : l⸨X⸩ ≃ₐ[k⸨X⸩] l⸨X⸩ := by + letI : Algebra k⸨X⸩ l⸨X⸩ := laurentSeriesCoefficientAlgebra + refine + { laurentSeriesCoefficientRingEquiv e.toRingEquiv with + commutes' := ?_ } + intro x + change laurentSeriesCoefficientMap e.toRingHom + (laurentSeriesCoefficientMap (algebraMap k l) x) = + laurentSeriesCoefficientMap (algebraMap k l) x + ext m + change e (algebraMap k l (x.coeff m)) = algebraMap k l (x.coeff m) + exact e.commutes (x.coeff m) + +/-- A coefficientwise algebra equivalence applies the base automorphism at every exponent. -/ +@[simp] +theorem laurentSeriesCoefficientAlgEquiv_coeff + [Field k] [Field l] [Algebra k l] + (e : l ≃ₐ[k] l) (x : l⸨X⸩) (m : ℤ) : + letI : Algebra k⸨X⸩ l⸨X⸩ := laurentSeriesCoefficientAlgebra + (laurentSeriesCoefficientAlgEquiv e x).coeff m = e (x.coeff m) := + rfl + +/-- Coefficientwise extension is faithful on automorphisms. -/ +theorem laurentSeriesCoefficientAlgEquiv_injective + [Field k] [Field l] [Algebra k l] : + Function.Injective + (fun e : l ≃ₐ[k] l ↦ + letI : Algebra k⸨X⸩ l⸨X⸩ := laurentSeriesCoefficientAlgebra + laurentSeriesCoefficientAlgEquiv e) := by + intro e f hef + apply AlgEquiv.ext + intro x + have h := DFunLike.congr_fun hef (HahnSeries.C (Γ := ℤ) x : l⸨X⸩) + have hc := congrArg (fun y : l⸨X⸩ ↦ y.coeff 0) h + simpa using hc + +/-- Coefficientwise extension as a homomorphism between the two Galois +groups. -/ +noncomputable def laurentSeriesCoefficientGalHom + [Field k] [Field l] [Algebra k l] : + (l ≃ₐ[k] l) →* (l⸨X⸩ ≃ₐ[k⸨X⸩] l⸨X⸩) := by + letI : Algebra k⸨X⸩ l⸨X⸩ := laurentSeriesCoefficientAlgebra + exact + { toFun := laurentSeriesCoefficientAlgEquiv + map_one' := by + apply AlgEquiv.ext + intro x + ext m + simp + map_mul' := by + intro e f + apply AlgEquiv.ext + intro x + ext m + simp } + +/-- The Galois homomorphism sends an automorphism to its coefficientwise Laurent action. -/ +@[simp] +theorem laurentSeriesCoefficientGalHom_apply + [Field k] [Field l] [Algebra k l] + (e : l ≃ₐ[k] l) : + letI : Algebra k⸨X⸩ l⸨X⸩ := laurentSeriesCoefficientAlgebra + laurentSeriesCoefficientGalHom e = laurentSeriesCoefficientAlgEquiv e := + rfl + +/-- Distinct coefficient automorphisms induce distinct Laurent-series automorphisms. -/ +theorem laurentSeriesCoefficientGalHom_injective + [Field k] [Field l] [Algebra k l] : + Function.Injective + (letI : Algebra k⸨X⸩ l⸨X⸩ := laurentSeriesCoefficientAlgebra + laurentSeriesCoefficientGalHom : + (l ≃ₐ[k] l) → (l⸨X⸩ ≃ₐ[k⸨X⸩] l⸨X⸩)) := + laurentSeriesCoefficientAlgEquiv_injective + +section FiniteFields + +variable [Field k] [Finite k] [Field l] [Finite l] [Algebra k l] + +omit [Finite k] in +/-- For finite coefficient fields, all Laurent-series automorphisms come +from coefficient automorphisms. -/ +theorem laurentSeriesCoefficientGalHom_surjective : + letI : Algebra k⸨X⸩ l⸨X⸩ := laurentSeriesCoefficientAlgebra + Function.Surjective (laurentSeriesCoefficientGalHom : + (l ≃ₐ[k] l) → (l⸨X⸩ ≃ₐ[k⸨X⸩] l⸨X⸩)) := by + let : Module.Finite k l := Module.Finite.of_finite + let : FiniteDimensional k⸨X⸩ l⸨X⸩ := + laurentSeriesCoefficient_finiteDimensional + have hcard : + Nat.card (l⸨X⸩ ≃ₐ[k⸨X⸩] l⸨X⸩) ≤ Nat.card (l ≃ₐ[k] l) := by + calc + Nat.card (l⸨X⸩ ≃ₐ[k⸨X⸩] l⸨X⸩) ≤ + Module.finrank k⸨X⸩ l⸨X⸩ := by + simpa only [Nat.card_eq_fintype_card] using + (AlgEquiv.card_le (F := k⸨X⸩) (K := l⸨X⸩)) + _ = Module.finrank k l := laurentSeriesCoefficient_finrank + _ = Nat.card (l ≃ₐ[k] l) := + (IsGalois.card_aut_eq_finrank k l).symm + have hbijective : Function.Bijective + (laurentSeriesCoefficientGalHom : + (l ≃ₐ[k] l) → (l⸨X⸩ ≃ₐ[k⸨X⸩] l⸨X⸩)) := + Function.Injective.bijective_of_nat_card_le + laurentSeriesCoefficientGalHom_injective hcard + exact hbijective.2 + +omit [Finite k] in +/-- The coefficient Laurent-series extension is Galois. -/ +theorem laurentSeriesCoefficient_isGalois : + letI : Algebra k⸨X⸩ l⸨X⸩ := laurentSeriesCoefficientAlgebra + IsGalois k⸨X⸩ l⸨X⸩ := by + let : Module.Finite k l := Module.Finite.of_finite + let : FiniteDimensional k⸨X⸩ l⸨X⸩ := + laurentSeriesCoefficient_finiteDimensional + apply IsGalois.of_card_aut_eq_finrank + apply Nat.le_antisymm + · simpa only [Nat.card_eq_fintype_card] using + (AlgEquiv.card_le (F := k⸨X⸩) (K := l⸨X⸩)) + · calc + Module.finrank k⸨X⸩ l⸨X⸩ = Nat.card (l ≃ₐ[k] l) := by + exact laurentSeriesCoefficient_finrank.trans + (IsGalois.card_aut_eq_finrank k l).symm + _ ≤ Nat.card (l⸨X⸩ ≃ₐ[k⸨X⸩] l⸨X⸩) := + Nat.card_le_card_of_injective + (laurentSeriesCoefficientGalHom : + (l ≃ₐ[k] l) → (l⸨X⸩ ≃ₐ[k⸨X⸩] l⸨X⸩)) + laurentSeriesCoefficientGalHom_injective + +/-- Arithmetic Frobenius on the coefficient field, extended to Laurent +series. -/ +noncomputable def equalCharacteristicLaurentFrobenius : + letI : Algebra k⸨X⸩ l⸨X⸩ := laurentSeriesCoefficientAlgebra + l⸨X⸩ ≃ₐ[k⸨X⸩] l⸨X⸩ := by + letI : Fintype k := Fintype.ofFinite k + exact laurentSeriesCoefficientAlgEquiv + (k := k) (l := l) + (FiniteField.frobeniusAlgEquivOfAlgebraic k l) + +/-- Laurent Frobenius raises each coefficient to the residue-field cardinality. -/ +@[simp] +theorem equalCharacteristicLaurentFrobenius_coeff + (x : l⸨X⸩) (m : ℤ) : + letI : Algebra k⸨X⸩ l⸨X⸩ := laurentSeriesCoefficientAlgebra + (equalCharacteristicLaurentFrobenius (k := k) (l := l) x).coeff m = + (x.coeff m) ^ Nat.card k := by + let : Fintype k := Fintype.ofFinite k + simp [equalCharacteristicLaurentFrobenius, + Nat.card_eq_fintype_card] + +/-- Laurent Frobenius fixes the Laurent uniformizer. -/ +@[simp] +theorem equalCharacteristicLaurentFrobenius_single_one : + letI : Algebra k⸨X⸩ l⸨X⸩ := laurentSeriesCoefficientAlgebra + equalCharacteristicLaurentFrobenius (k := k) (l := l) + (HahnSeries.single (1 : ℤ) 1 : l⸨X⸩) = + HahnSeries.single (1 : ℤ) 1 := by + let : Fintype k := Fintype.ofFinite k + ext m + by_cases h : m = 1 + · subst m + simp + · simp [HahnSeries.coeff_single_of_ne h] + +end FiniteFields + +section ChosenFiniteExtension + +variable (k : Type u) [Field k] [Finite k] + (p n : ℕ) [Fact p.Prime] [CharP k p] [NeZero n] + +/-- The finite unramified Laurent-series extension obtained from the chosen +degree-`n` extension of the residue field. -/ +def equalCharacteristicFiniteUnramifiedExtension := + (FiniteField.Extension k p n)⸨X⸩ + +/-- The finite unramified Laurent-series extension is a field. -/ +instance equalCharacteristicFiniteUnramifiedExtensionField : + Field (equalCharacteristicFiniteUnramifiedExtension k p n) := by + change Field ((FiniteField.Extension k p n)⸨X⸩) + infer_instance + +/-- The finite unramified extension is an algebra over the base Laurent field. -/ +noncomputable instance equalCharacteristicFiniteUnramifiedAlgebra : + Algebra k⸨X⸩ (equalCharacteristicFiniteUnramifiedExtension k p n) := + laurentSeriesCoefficientAlgebra + +section + +/-- The finite unramified Laurent extension carries the module structure of its coefficient +algebra. -/ +local instance equalCharacteristicFiniteUnramifiedModule : + @Module k⸨X⸩ (equalCharacteristicFiniteUnramifiedExtension k p n) + (inferInstance : DivisionRing k⸨X⸩).toRing.toSemiring + (inferInstance : AddCommGroup + (equalCharacteristicFiniteUnramifiedExtension k p n)).toAddCommMonoid := + @Algebra.toModule k⸨X⸩ (equalCharacteristicFiniteUnramifiedExtension k p n) + _ _ (equalCharacteristicFiniteUnramifiedAlgebra k p n) + +/-- The finite unramified Laurent extension is finite-dimensional over the base. -/ +instance equalCharacteristicFiniteUnramifiedFiniteDimensional : + FiniteDimensional k⸨X⸩ + (equalCharacteristicFiniteUnramifiedExtension k p n) := + laurentSeriesCoefficient_finiteDimensional + +end + +/-- Comparison with the Laurent-series presentation over the chosen finite +coefficient extension. -/ +def equalCharacteristicFiniteUnramifiedExtensionEquivLaurentSeries : + equalCharacteristicFiniteUnramifiedExtension k p n ≃+* + (FiniteField.Extension k p n)⸨X⸩ := + RingEquiv.refl _ + +/-- Algebra-linear comparison with the Laurent-series presentation. This is +the degree-preserving bridge for the named finite unramified extension. -/ +def equalCharacteristicFiniteUnramifiedExtensionAlgEquivLaurentSeries : + equalCharacteristicFiniteUnramifiedExtension k p n ≃ₐ[k⸨X⸩] + (FiniteField.Extension k p n)⸨X⸩ := by + change (FiniteField.Extension k p n)⸨X⸩ ≃ₐ[k⸨X⸩] + (FiniteField.Extension k p n)⸨X⸩ + exact AlgEquiv.refl + +/-- Construct a named finite unramified element from a Laurent series. -/ +def equalCharacteristicFiniteUnramifiedExtensionOfLaurentSeries : + (FiniteField.Extension k p n)⸨X⸩ →+* + equalCharacteristicFiniteUnramifiedExtension k p n := + (equalCharacteristicFiniteUnramifiedExtensionEquivLaurentSeries + k p n).symm.toRingHom + +/-- Read a named finite unramified element as a Laurent series. -/ +def equalCharacteristicFiniteUnramifiedExtensionToLaurentSeries : + equalCharacteristicFiniteUnramifiedExtension k p n →+* + (FiniteField.Extension k p n)⸨X⸩ := + (equalCharacteristicFiniteUnramifiedExtensionEquivLaurentSeries + k p n).toRingHom + +/-- The coefficient of a named finite unramified Laurent element. -/ +def equalCharacteristicFiniteUnramifiedExtensionCoeff + (x : equalCharacteristicFiniteUnramifiedExtension k p n) (m : ℤ) : + FiniteField.Extension k p n := + (equalCharacteristicFiniteUnramifiedExtensionToLaurentSeries + k p n x).coeff m + +/-- The chosen coefficient extension has exactly the requested Laurent +degree. -/ +theorem equalCharacteristicFiniteUnramifiedExtension_finrank : + Module.finrank k⸨X⸩ + (equalCharacteristicFiniteUnramifiedExtension k p n) = n := by + calc + Module.finrank k⸨X⸩ + (equalCharacteristicFiniteUnramifiedExtension k p n) = + Module.finrank k⸨X⸩ (FiniteField.Extension k p n)⸨X⸩ := + (equalCharacteristicFiniteUnramifiedExtensionAlgEquivLaurentSeries + k p n).toLinearEquiv.finrank_eq + _ = Module.finrank k (FiniteField.Extension k p n) := + laurentSeriesCoefficient_finrank + _ = n := FiniteField.finrank_extension k p n + +/-- The chosen finite unramified Laurent-series extension is Galois. -/ +theorem equalCharacteristicFiniteUnramifiedExtension_isGalois : + IsGalois k⸨X⸩ + (equalCharacteristicFiniteUnramifiedExtension k p n) := + laurentSeriesCoefficient_isGalois + +/-- Its distinguished arithmetic Frobenius. -/ +noncomputable def equalCharacteristicFiniteUnramifiedFrobenius : + Gal(equalCharacteristicFiniteUnramifiedExtension k p n/k⸨X⸩) := + laurentSeriesCoefficientGalHom (FiniteField.Extension.frob k p n) + +/-- Finite unramified Frobenius applies finite-field Frobenius coefficientwise. -/ +@[simp] +theorem equalCharacteristicFiniteUnramifiedFrobenius_coeff + (x : equalCharacteristicFiniteUnramifiedExtension k p n) (m : ℤ) : + equalCharacteristicFiniteUnramifiedExtensionCoeff k p n + (equalCharacteristicFiniteUnramifiedFrobenius k p n x) m = + (equalCharacteristicFiniteUnramifiedExtensionCoeff k p n x m) ^ + Nat.card k := + by + change ((FiniteField.Extension.frob k p n) + (equalCharacteristicFiniteUnramifiedExtensionCoeff k p n x m)) = _ + exact FiniteField.Extension.frob_apply k p n + +/-- Every automorphism of the chosen unramified factor is a power of its +arithmetic Frobenius. -/ +theorem equalCharacteristicFiniteUnramifiedFrobenius_pow_surjective + (σ : Gal(equalCharacteristicFiniteUnramifiedExtension k p n/k⸨X⸩)) : + ∃ i < n, equalCharacteristicFiniteUnramifiedFrobenius k p n ^ i = σ := by + obtain ⟨τ, rfl⟩ := (laurentSeriesCoefficientGalHom_surjective + (k := k) (l := FiniteField.Extension k p n)) σ + obtain ⟨i, hi, hτ⟩ := FiniteField.Extension.exists_frob_pow_eq k p n τ + refine ⟨i, hi, ?_⟩ + rw [← hτ] + exact (map_pow laurentSeriesCoefficientGalHom + (FiniteField.Extension.frob k p n) i).symm + +end ChosenFiniteExtension + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup.lean new file mode 100644 index 0000000000..31c07dad19 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup.lean @@ -0,0 +1,25 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFrobeniusFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitsNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.LevelAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.StandardSubgroupNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitQuotientCard +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitTransport + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/All.lean new file mode 100644 index 0000000000..b15d45af18 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/All.lean @@ -0,0 +1,31 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFrobeniusFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitsNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.LevelAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.StandardSubgroupNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitQuotientCard +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitTransport +/-! +# Reusable Lubin--Tate norm calculations in equal characteristic + +Public aggregate for higher-unit norms, containment of the standard subgroup +in the finite-level norm subgroup, and the corresponding finite quotient +calculation. The exact norm-subgroup equality, which uses finite local +reciprocity, is exported by +`LocalClassFieldTheory.LubinTateApplication`. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEmbedding.lean new file mode 100644 index 0000000000..05707bade6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEmbedding.lean @@ -0,0 +1,83 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldAlgebra +/-! +# LubinTate the explicit norm-subgroup computation: the standard level embedded in the + higher-unit fixed field + +For a coefficient unit in `U^(n+1)`, the standard completed-level embedding +lands in the completed theta-intertwining theorem fixed field. This leaf packages its canonical +codomain restriction for the finite-dimensional comparison. +-/ + +@[expose] public section + +noncomputable +section + + +open scoped LaurentSeries PowerSeries + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type} [Field K] + +attribute [local instance] + equalCharacteristicCompletedFrobeniusFixedBaseAlgebra + equalCharacteristicLubinTateLevelFieldAlgebra + equalCharacteristicLubinTateLevelFieldSMul + equalCharacteristicLubinTateLevelFieldModule + equalCharacteristicCompletedFrobeniusFixedFieldAlgebra + equalCharacteristicCompletedFrobeniusFixedFieldSMul + equalCharacteristicCompletedFrobeniusFixedFieldModule + +/-- The canonical standard-level embedding into the fixed field attached to +a higher unit, regarded as a ring homomorphism. This lightweight helper +keeps the codomain restriction independent of algebra-instance search. -/ +noncomputable def + equalCharacteristicLubinTateLevelFieldToFixedFieldOfHigherUnitRingHom + (F : LocalField K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) + (ha : a ∈ equalCharacteristicLubinTateHigherUnitSubgroup F n) : + equalCharacteristicLubinTateLevelField F n →+* + equalCharacteristicCompletedFrobeniusFixedField F a n := + (equalCharacteristicLubinTateLevelFieldToCompletedRingHom F n).codRestrict + (equalCharacteristicCompletedFrobeniusFixedFieldSubring F a n) + (equalCharacteristicLubinTateLevelFieldToCompleted_mem_fixedField_of_mem_higherUnit + F a n ha) + +/-- The canonical standard-level algebra embedding into the fixed field +attached to a higher unit. -/ +noncomputable def equalCharacteristicLubinTateLevelFieldToFixedFieldOfHigherUnit + (F : LocalField K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) + (ha : a ∈ equalCharacteristicLubinTateHigherUnitSubgroup F n) : + @AlgHom + F.residueField⸨X⸩ + ↥(equalCharacteristicLubinTateLevelField F n) + ↥(equalCharacteristicCompletedFrobeniusFixedField F a n) + inferInstance + inferInstance + inferInstance + (equalCharacteristicLubinTateLevelFieldAlgebra F n) + (equalCharacteristicCompletedFrobeniusFixedFieldAlgebra F a n) := + AlgHom.mk + (equalCharacteristicLubinTateLevelFieldToFixedFieldOfHigherUnitRingHom + F a n ha) + (fun b => Subtype.ext + (equalCharacteristicLubinTateLevelFieldToCompletedRingHom_algebraMap F n b)) + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEquiv.lean new file mode 100644 index 0000000000..3b0e55c6d6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEquiv.lean @@ -0,0 +1,67 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective +/-! +# LubinTate the explicit norm-subgroup computation: the standard level is the higher-unit fixed + field + +The standard-level embedding is an equivalence because its source and target +have the same degree `(q - 1) q^n`. +-/ + +@[expose] public section + +noncomputable +section + + +open scoped LaurentSeries PowerSeries + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type} [Field K] + +attribute [local instance] + equalCharacteristicCompletedFrobeniusFixedBaseAlgebra + equalCharacteristicLubinTateLevelFieldAlgebra + equalCharacteristicLubinTateLevelFieldSMul + equalCharacteristicLubinTateLevelFieldModule + equalCharacteristicCompletedFrobeniusFixedFieldAlgebra + equalCharacteristicCompletedFrobeniusFixedFieldSMul + equalCharacteristicCompletedFrobeniusFixedFieldModule + +/-- Defines `equalCharacteristicLubinTateLevelFieldEquivFixedFieldOfHigherUnit`. -/ +noncomputable def + equalCharacteristicLubinTateLevelFieldEquivFixedFieldOfHigherUnit + (F : LocalField K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) + (ha : a ∈ equalCharacteristicLubinTateHigherUnitSubgroup F n) : + @AlgEquiv + F.residueField⸨X⸩ + ↥(equalCharacteristicLubinTateLevelField F n) + ↥(equalCharacteristicCompletedFrobeniusFixedField F a n) + inferInstance + inferInstance + inferInstance + (equalCharacteristicLubinTateLevelFieldAlgebra F n) + (equalCharacteristicCompletedFrobeniusFixedFieldAlgebra F a n) := + AlgEquiv.ofBijective + (equalCharacteristicLubinTateLevelFieldToFixedFieldOfHigherUnit F a n ha) + ⟨fun _ _ h => + (equalCharacteristicLubinTateLevelFieldToCompletedRingHom F n).injective + (congrArg Subtype.val h), + equalCharacteristicLubinTateLevelFieldToFixedFieldOfHigherUnit_surjective + F a n ha⟩ + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldMembership.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldMembership.lean new file mode 100644 index 0000000000..9298eb32b2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldMembership.lean @@ -0,0 +1,78 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed +/-! +# LubinTate the explicit norm-subgroup computation: the standard level lies in the higher-unit + fixed field +-/ + +@[expose] public section + +noncomputable +section + + +open scoped LaurentSeries PowerSeries + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type} [Field K] + +/-- The Laurent-series base acts on the completed unramified field through the coefficient +embedding. -/ +noncomputable local instance equalCharacteristicHigherUnitMembershipBaseAlgebra + (F : LocalField K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + equalCharacteristicCompletedFrobeniusFixedBaseAlgebra F + +/-- The completed level field is a Laurent-series algebra through the completed unramified base. -/ +noncomputable local instance equalCharacteristicHigherUnitMembershipLevelAlgebra + (F : LocalField K) (n : ℕ) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedFrobeniusFixedLevelAlgebra F n + +local instance equalCharacteristicHigherUnitMembershipScalarTower + (F : LocalField K) (n : ℕ) : + IsScalarTower F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) := + IsScalarTower.of_algebraMap_eq' rfl + +/-- States the theorem +`equalCharacteristicLubinTateLevelFieldToCompleted_mem_fixedField_of_mem_higherUnit`. -/ +theorem + equalCharacteristicLubinTateLevelFieldToCompleted_mem_fixedField_of_mem_higherUnit + (F : LocalField K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) + (ha : a ∈ equalCharacteristicLubinTateHigherUnitSubgroup F n) + (x : equalCharacteristicLubinTateLevelField F n) : + equalCharacteristicLubinTateLevelFieldToCompleted F n x ∈ + equalCharacteristicCompletedFrobeniusFixedField F a n := by + rw [equalCharacteristicCompletedFrobeniusFixedField, + IntermediateField.mem_fixedField_iff] + intro sigma hsigma + obtain ⟨j, rfl⟩ := Subgroup.mem_zpowers_iff.mp hsigma + have hfixed : + equalCharacteristicLubinTateLevelFieldToCompleted F n x ∈ + MulAction.fixedBy (equalCharacteristicCompletedLevelField F n) + (equalCharacteristicCompletedFrobeniusAlgEquiv F a n) := by + rw [MulAction.mem_fixedBy] + exact + equalCharacteristicCompletedFrobeniusAlgEquiv_comp_levelFieldToCompleted_of_mem_higherUnit + F a n ha x + exact MulAction.mem_fixedBy_zpow hfixed j + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldSurjective.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldSurjective.lean new file mode 100644 index 0000000000..42c7ae9d30 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldSurjective.lean @@ -0,0 +1,95 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree +/-! +# LubinTate the explicit norm-subgroup computation: surjectivity of the higher-unit fixed-field + embedding + +The standard level and the fixed field have the same finite degree +`(q - 1) q^n`; hence the canonical injective embedding is surjective. +-/ + +@[expose] public section + +noncomputable +section + + +open scoped LaurentSeries PowerSeries + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type} [Field K] + +attribute [local instance] + equalCharacteristicCompletedFrobeniusFixedBaseAlgebra + equalCharacteristicCompletedFrobeniusFixedFieldAlgebra + equalCharacteristicCompletedFrobeniusFixedFieldSMul + equalCharacteristicCompletedFrobeniusFixedFieldModule + +private theorem ringHom_surjective_of_finrank_eq + {B E L : Type*} + [Field B] [Field E] [Field L] + [Algebra B E] [Algebra B L] + [FiniteDimensional B E] [FiniteDimensional B L] + (f : E →+* L) + (hcomm : ∀ b : B, + f (algebraMap B E b) = algebraMap B L b) + (hdim : Module.finrank B E = Module.finrank B L) : + Function.Surjective f := by + let fAlg : E →ₐ[B] L := + { f with commutes' := hcomm } + exact + (LinearMap.injective_iff_surjective_of_finrank_eq_finrank + (f := fAlg.toLinearMap) hdim).mp fAlg.injective + +/-- The canonical standard-level embedding onto the higher-unit fixed field +is surjective. -/ +theorem equalCharacteristicLubinTateLevelFieldToFixedFieldOfHigherUnit_surjective + (F : LocalField K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) + (ha : a ∈ equalCharacteristicLubinTateHigherUnitSubgroup F n) : + Function.Surjective + (equalCharacteristicLubinTateLevelFieldToFixedFieldOfHigherUnit + F a n ha) := by + change Function.Surjective + (equalCharacteristicLubinTateLevelFieldToFixedFieldOfHigherUnitRingHom + F a n ha) + let f := + equalCharacteristicLubinTateLevelFieldToFixedFieldOfHigherUnitRingHom + F a n ha + let : FiniteDimensional F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + let : FiniteDimensional F.residueField⸨X⸩ + (equalCharacteristicCompletedFrobeniusFixedField F a n) := + FiniteDimensional.of_finrank_pos (by + rw [equalCharacteristicCompletedFrobeniusFixedField_finrank] + exact Nat.mul_pos + (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (Nat.pow_pos Nat.card_pos)) + have hdim : Module.finrank F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) = + Module.finrank F.residueField⸨X⸩ + (equalCharacteristicCompletedFrobeniusFixedField F a n) := by + rw [equalCharacteristicLubinTateLevelField_finrank, + equalCharacteristicCompletedFrobeniusFixedField_finrank] + exact ringHom_surjective_of_finrank_eq f (by + intro b + apply Subtype.ext + exact equalCharacteristicLubinTateLevelFieldToCompletedRingHom_algebraMap F n b) hdim + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFrobeniusFixed.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFrobeniusFixed.lean new file mode 100644 index 0000000000..539e578d9f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFrobeniusFixed.lean @@ -0,0 +1,97 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField +/-! +# LubinTate the explicit norm-subgroup computation: higher units fix the primitive point + +If `a` is congruent to one modulo `T^(n+1)`, the completed the completed theta-intertwining theorem +Frobenius attached to `a` acts trivially on the standard primitive +`(n+1)`-division point. +-/ + +@[expose] public section + +noncomputable +section + + +open scoped LaurentSeries PowerSeries + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type} [Field K] + +/-- The Laurent-series base acts on the completed unramified field through the coefficient +embedding. -/ +noncomputable local instance equalCharacteristicHigherUnitFixedBaseAlgebra + (F : LocalField K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + equalCharacteristicCompletedFrobeniusFixedBaseAlgebra F + +/-- States the theorem +`equalCharacteristicCompletedFrobeniusAlgEquiv_primitiveRoot_fixed_of_mem_higherUnit`. -/ +theorem + equalCharacteristicCompletedFrobeniusAlgEquiv_primitiveRoot_fixed_of_mem_higherUnit + (F : LocalField K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) + (ha : a ∈ equalCharacteristicLubinTateHigherUnitSubgroup F n) : + equalCharacteristicCompletedFrobeniusAlgEquiv F a n + (equalCharacteristicCompletedPrimitiveRoot F n) = + equalCharacteristicCompletedPrimitiveRoot F n := by + have hainv : a⁻¹ ∈ equalCharacteristicLubinTateHigherUnitSubgroup F n := + (equalCharacteristicLubinTateHigherUnitSubgroup F n).inv_mem ha + have hdvd : PowerSeries.X ^ (n + 1) ∣ + ((a⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) - 1 := by + rw [← Ideal.mem_span_singleton] + exact + (mem_equalCharacteristicLubinTateHigherUnitSubgroup F n a⁻¹).1 hainv + have hcoeff : ∀ j < n + 1, + PowerSeries.coeff j + ((a⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) = + PowerSeries.coeff j (1 : F.residueField⟦X⟧) := by + intro j hj + have hz := PowerSeries.X_pow_dvd_iff.mp hdvd j hj + rw [map_sub, sub_eq_zero] at hz + exact hz + have hbracket : + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicCompletedLevelResidueHom F n) + (equalCharacteristicCompletedLevelUniformizer F n) (n + 1) + ((a⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) + (equalCharacteristicCompletedPrimitiveRoot F n) = + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicCompletedLevelResidueHom F n) + (equalCharacteristicCompletedLevelUniformizer F n) (n + 1) 1 + (equalCharacteristicCompletedPrimitiveRoot F n) := + DFunLike.congr_fun + (equalCharacteristicLubinTateAmbientBracket_eq_of_coeff_eq F + (equalCharacteristicCompletedLevelResidueHom F n) + (equalCharacteristicCompletedLevelUniformizer F n) (n + 1) + ((a⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) 1 hcoeff) + (equalCharacteristicCompletedPrimitiveRoot F n) + rw [equalCharacteristicCompletedFrobeniusAlgEquiv_apply] + change equalCharacteristicCompletedFrobeniusLiftEquiv F n a⁻¹ + (equalCharacteristicCompletedPrimitiveRoot F n) = _ + rw [equalCharacteristicCompletedFrobeniusLiftEquiv_primitiveRoot, + equalCharacteristicCompletedUnitRoot] + exact hbracket.trans + (equalCharacteristicLubinTateAmbientBracket_one_apply_of_torsion F + (equalCharacteristicCompletedLevelResidueHom F n) + (equalCharacteristicCompletedLevelUniformizer F n) (n + 1) + (equalCharacteristicCompletedPrimitiveRoot F n) + (equalCharacteristicCompletedPrimitiveRoot_torsion F n)) + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitLevelMapFixed.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitLevelMapFixed.lean new file mode 100644 index 0000000000..f6376b7497 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitLevelMapFixed.lean @@ -0,0 +1,187 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFrobeniusFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms +/-! +# LubinTate the explicit norm-subgroup computation: higher-unit Frobenius fixes the standard + level map +-/ + +@[expose] public section + +noncomputable +section + + +open scoped LaurentSeries PowerSeries + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type} [Field K] + +/-- Two ring homomorphisms out of a power-basis extension agree pointwise +once they agree on the base field and on the power-basis generator. -/ +private theorem ringHom_apply_eq_of_powerBasis + {B L C : Type*} [Field B] [Field L] [Algebra B L] [Field C] + (pb : PowerBasis B L) (delta : C →+* C) (f : L →+* C) + (hgen : delta (f pb.gen) = f pb.gen) + (hbase : ∀ b : B, + delta (f (algebraMap B L b)) = f (algebraMap B L b)) + (x : L) : + delta (f x) = f x := by + let phi : L →+* C := delta.comp f + let : Algebra B C := (f.comp (algebraMap B L)).toAlgebra + let phiAlg : L →ₐ[B] C := + { phi with commutes' := hbase } + let fAlg : L →ₐ[B] C := + { f with commutes' := fun _ => rfl } + have h : phiAlg = fAlg := pb.algHom_ext hgen + exact DFunLike.congr_fun h x + +/-- The Laurent-series base acts on the completed unramified field through the coefficient +embedding. -/ +@[reducible] noncomputable local instance equalCharacteristicHigherUnitMapBaseAlgebra + (F : LocalField K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + equalCharacteristicCompletedLevelBaseAlgebra F + +/-- The completed level field is a Laurent-series algebra through the completed unramified base. -/ +@[reducible] noncomputable local instance equalCharacteristicHigherUnitMapLevelAlgebra + (F : LocalField K) (n : ℕ) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedLevelField F n) := + equalCharacteristicCompletedLevelLaurentAlgebra F n + +local instance equalCharacteristicHigherUnitMapScalarTower + (F : LocalField K) (n : ℕ) : + IsScalarTower F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n) := + IsScalarTower.of_algebraMap_eq' rfl + +private noncomputable def higherUnitLevelMapRingHom + (F : LocalField K) [CharP K F.residueCharacteristic] (n : ℕ) : + equalCharacteristicLubinTateLevelField F n →+* + equalCharacteristicCompletedLevelField F n := + (equalCharacteristicLubinTateLevelFieldToCompleted F n).toRingHom + +private theorem higherUnitLevelMapRingHom_apply + (F : LocalField K) [CharP K F.residueCharacteristic] (n : ℕ) + (x : equalCharacteristicLubinTateLevelField F n) : + higherUnitLevelMapRingHom F n x = + equalCharacteristicLubinTateLevelFieldToCompleted F n x := + rfl + +/-- The canonical finite-level embedding into the completed level, regarded +as a ring homomorphism. This is the lightweight interface used by consumers +that do not need to reconstruct its concrete algebra structures. -/ +noncomputable def equalCharacteristicLubinTateLevelFieldToCompletedRingHom + (F : LocalField K) [CharP K F.residueCharacteristic] (n : ℕ) : + equalCharacteristicLubinTateLevelField F n →+* + equalCharacteristicCompletedLevelField F n := + (equalCharacteristicLubinTateLevelFieldToCompleted F n).toRingHom + +/-- States the theorem `equalCharacteristicLubinTateLevelFieldToCompletedRingHom_algebraMap`. -/ +@[simp] +theorem equalCharacteristicLubinTateLevelFieldToCompletedRingHom_algebraMap + (F : LocalField K) [CharP K F.residueCharacteristic] + (n : ℕ) (b : F.residueField⸨X⸩) : + equalCharacteristicLubinTateLevelFieldToCompletedRingHom F n + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) b) = + algebraMap F.residueField⸨X⸩ + (equalCharacteristicCompletedLevelField F n) b := by + change (equalCharacteristicLubinTateLevelFieldToCompleted F n) + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) b) = _ + exact (equalCharacteristicLubinTateLevelFieldToCompleted F n).commutes b + +private noncomputable def higherUnitFrobeniusRingHom + (F : LocalField K) [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) : + equalCharacteristicCompletedLevelField F n →+* + equalCharacteristicCompletedLevelField F n := + (equalCharacteristicCompletedFrobeniusAlgEquiv F a n).toRingEquiv.toRingHom + +private theorem higherUnitFrobeniusRingHom_apply + (F : LocalField K) [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) + (x : equalCharacteristicCompletedLevelField F n) : + higherUnitFrobeniusRingHom F a n x = + equalCharacteristicCompletedFrobeniusAlgEquiv F a n x := + rfl + +private theorem higherUnitLevelMapRingHom_gen + (F : LocalField K) [CharP K F.residueCharacteristic] (n : ℕ) : + higherUnitLevelMapRingHom F n + (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + equalCharacteristicCompletedPrimitiveRoot F n := by + change (equalCharacteristicLubinTateLevelFieldToCompleted F n) + (equalCharacteristicLubinTateLevelPowerBasis F n).gen = _ + rw [equalCharacteristicLubinTateLevelPowerBasis, + IntermediateField.adjoin.powerBasis_gen, + equalCharacteristicLubinTateLevelFieldToCompleted_generator] + +private theorem higherUnitFrobeniusRingHom_levelMap_algebraMap + (F : LocalField K) [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) (b : F.residueField⸨X⸩) : + higherUnitFrobeniusRingHom F a n + (higherUnitLevelMapRingHom F n + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) b)) = + higherUnitLevelMapRingHom F n + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) b) := by + rw [higherUnitFrobeniusRingHom_apply, + higherUnitLevelMapRingHom_apply] + rw [(equalCharacteristicLubinTateLevelFieldToCompleted F n).commutes b] + exact (equalCharacteristicCompletedFrobeniusAlgEquiv F a n).commutes b + +private theorem higherUnitLevelMap_fixed_core + (F : LocalField K) [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) + (ha : a ∈ equalCharacteristicLubinTateHigherUnitSubgroup F n) + (x : equalCharacteristicLubinTateLevelField F n) : + higherUnitFrobeniusRingHom F a n (higherUnitLevelMapRingHom F n x) = + higherUnitLevelMapRingHom F n x := by + apply ringHom_apply_eq_of_powerBasis + (equalCharacteristicLubinTateLevelPowerBasis F n) + (higherUnitFrobeniusRingHom F a n) + (higherUnitLevelMapRingHom F n) + · rw [higherUnitLevelMapRingHom_gen, + higherUnitFrobeniusRingHom_apply] + exact + equalCharacteristicCompletedFrobeniusAlgEquiv_primitiveRoot_fixed_of_mem_higherUnit + F a n ha + · exact higherUnitFrobeniusRingHom_levelMap_algebraMap F a n + +/-- States the theorem +`equalCharacteristicCompletedFrobeniusAlgEquiv_comp_levelFieldToCompleted_of_mem_higherUnit`. -/ +theorem + equalCharacteristicCompletedFrobeniusAlgEquiv_comp_levelFieldToCompleted_of_mem_higherUnit + (F : LocalField K) + [CharP K F.residueCharacteristic] + (a : F.residueField⟦X⟧ˣ) (n : ℕ) + (ha : a ∈ equalCharacteristicLubinTateHigherUnitSubgroup F n) + (x : equalCharacteristicLubinTateLevelField F n) : + equalCharacteristicCompletedFrobeniusAlgEquiv F a n + (equalCharacteristicLubinTateLevelFieldToCompleted F n x) = + equalCharacteristicLubinTateLevelFieldToCompleted F n x := by + have h := higherUnitLevelMap_fixed_core F a n ha x + rw [higherUnitFrobeniusRingHom_apply, + higherUnitLevelMapRingHom_apply] at h + exact h + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnits.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnits.lean new file mode 100644 index 0000000000..a10fc3816e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnits.lean @@ -0,0 +1,260 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.DivisionModuleEndomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups +/-! +# LubinTate the explicit norm-subgroup computation: higher units in the Laurent-series model + +The power-series coefficient ring `k[[T]]` is the canonical integer ring of +`k((T))`. The induced equivalence on units carries the explicit kernel used +in the Lubin--Tate construction to the canonical principal-unit filtration. +The construction uses index `n`, while the corresponding division-level +unit group is `U^(n+1)`. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries PowerSeries ValuativeRel WithZero + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +variable {K : Type u} [Field K] + +private theorem ringEquiv_map_maximalIdeal + {R S : Type*} [CommRing R] [CommRing S] + [IsLocalRing R] [IsLocalRing S] (e : R ≃+* S) : + Ideal.map e.toRingHom (IsLocalRing.maximalIdeal R) = + IsLocalRing.maximalIdeal S := by + apply le_antisymm + · rw [Ideal.map_le_iff_le_comap] + intro x hx + change e x ∈ IsLocalRing.maximalIdeal S + rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] at hx ⊢ + intro h + have h' := h.map e.symm.toRingHom + exact hx (by simpa using h') + · intro y hy + obtain ⟨x, rfl⟩ := e.surjective y + apply Ideal.mem_map_of_mem + rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] at hy ⊢ + intro h + exact hy (h.map e.toRingHom) + +private theorem ringEquiv_map_maximalIdeal_pow + {R S : Type*} [CommRing R] [CommRing S] + [IsLocalRing R] [IsLocalRing S] (e : R ≃+* S) (n : ℕ) : + Ideal.map e.toRingHom (IsLocalRing.maximalIdeal R ^ n) = + IsLocalRing.maximalIdeal S ^ n := by + rw [Ideal.map_pow, ringEquiv_map_maximalIdeal] + +private theorem ringEquiv_mem_maximalIdeal_pow_iff + {R S : Type*} [CommRing R] [CommRing S] + [IsLocalRing R] [IsLocalRing S] (e : R ≃+* S) (n : ℕ) (x : R) : + e x ∈ IsLocalRing.maximalIdeal S ^ n ↔ + x ∈ IsLocalRing.maximalIdeal R ^ n := by + rw [← ringEquiv_map_maximalIdeal_pow e n] + constructor + · intro hx + rcases (Ideal.mem_map_iff_of_surjective e.toRingHom e.surjective).1 hx with + ⟨y, hy, hey⟩ + exact e.injective hey ▸ hy + · exact Ideal.mem_map_of_mem e.toRingHom + +/-- The genuine equivalence between power-series units and the units of the +canonical integer ring of the Laurent-series field. -/ +noncomputable def equalCharacteristicPowerSeriesUnitsEquivLaurentInteger + (k : Type u) [Field k] : + letI : ValuativeRel k⸨X⸩ := ValuativeRel.ofValuation + (Valued.v : Valuation k⸨X⸩ ℤᵐ⁰) + k⟦X⟧ˣ ≃* 𝒪[k⸨X⸩]ˣ := by + letI : ValuativeRel k⸨X⸩ := ValuativeRel.ofValuation + (Valued.v : Valuation k⸨X⸩ ℤᵐ⁰) + exact Units.mapEquiv + (powerSeriesEquivLaurentValuativeInteger k).toMulEquiv + +/-- States the theorem `equalCharacteristicPowerSeriesUnitsEquivLaurentInteger_mem_iff`. -/ +theorem equalCharacteristicPowerSeriesUnitsEquivLaurentInteger_mem_iff + (k : Type u) [Field k] (n : ℕ) (a : k⟦X⟧ˣ) : + letI : ValuativeRel k⸨X⸩ := ValuativeRel.ofValuation + (Valued.v : Valuation k⸨X⸩ ℤᵐ⁰) + equalCharacteristicPowerSeriesUnitsEquivLaurentInteger k a ∈ + principalUnits k⸨X⸩ n ↔ + (a : k⟦X⟧) - 1 ∈ + Ideal.span ({PowerSeries.X ^ n} : Set k⟦X⟧) := by + let : ValuativeRel k⸨X⸩ := ValuativeRel.ofValuation + (Valued.v : Valuation k⸨X⸩ ℤᵐ⁰) + rw [mem_principalUnits_iff] + change powerSeriesEquivLaurentValuativeInteger k + (a : k⟦X⟧) - 1 ∈ + IsLocalRing.maximalIdeal 𝒪[k⸨X⸩] ^ n ↔ _ + simpa [PowerSeries.maximalIdeal_eq_span_X, + Ideal.span_singleton_pow] using + (ringEquiv_mem_maximalIdeal_pow_iff + (powerSeriesEquivLaurentValuativeInteger k) n + ((a : k⟦X⟧) - 1)) + +/-- The explicit Lubin--Tate higher-unit kernel is exactly the canonical +principal-unit group `U^(n+1)` under the integer-unit equivalence. -/ +theorem equalCharacteristicLubinTateHigherUnitSubgroup_map_eq_principalUnits + (F : LocalField.{u, v} K) (n : ℕ) : + letI : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + (equalCharacteristicLubinTateHigherUnitSubgroup F n).map + (equalCharacteristicPowerSeriesUnitsEquivLaurentInteger + F.residueField).toMonoidHom = + principalUnits F.residueField⸨X⸩ (n + 1) := by + let : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + let E := equalCharacteristicPowerSeriesUnitsEquivLaurentInteger + F.residueField + ext u + constructor + · rintro ⟨a, ha, rfl⟩ + apply + (equalCharacteristicPowerSeriesUnitsEquivLaurentInteger_mem_iff + F.residueField (n + 1) a).2 + exact (mem_equalCharacteristicLubinTateHigherUnitSubgroup F n a).1 ha + · intro hu + refine ⟨E.symm u, ?_, ?_⟩ + · apply + (mem_equalCharacteristicLubinTateHigherUnitSubgroup F n + (E.symm u)).2 + apply + (equalCharacteristicPowerSeriesUnitsEquivLaurentInteger_mem_iff + F.residueField (n + 1) (E.symm u)).1 + simpa [E] using hu + · exact E.apply_symm_apply u + +/-- After inclusion of integer units into field units, the explicit higher +unit kernel is the canonical field subgroup `U^(n+1)`. -/ +theorem equalCharacteristicLubinTateHigherUnitSubgroup_map_eq_fieldPrincipalUnits + (F : LocalField.{u, v} K) (n : ℕ) : + letI : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + ((equalCharacteristicLubinTateHigherUnitSubgroup F n).map + (equalCharacteristicPowerSeriesUnitsEquivLaurentInteger + F.residueField).toMonoidHom).map + (integerUnitsToFieldUnits F.residueField⸨X⸩) = + LocalFieldTheory.fieldPrincipalUnits F.residueField⸨X⸩ (n + 1) := by + let : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + rw [equalCharacteristicLubinTateHigherUnitSubgroup_map_eq_principalUnits] + rfl + +private theorem + equalCharacteristicLubinTateAmbientBracket_primitiveRoot_eq_iff_mem_higherUnitSubgroup + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (u : F.residueField⟦X⟧ˣ) : + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (u : F.residueField⟦X⟧) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) = + chosenEqualCharacteristicLubinTatePrimitiveRoot F n ↔ + u ∈ equalCharacteristicLubinTateHigherUnitSubgroup F n := by + let I : Ideal F.residueField⟦X⟧ := + Ideal.span ({PowerSeries.X ^ (n + 1)} : Set F.residueField⟦X⟧) + constructor + · intro hfix + change equalCharacteristicLubinTateUnitReduction F n u = 1 + apply Units.ext + change equalCharacteristicLubinTateTruncatedRingMk F n + (u : F.residueField⟦X⟧) = + equalCharacteristicLubinTateTruncatedRingMk F n 1 + apply equalCharacteristicLubinTatePrimitiveEvaluation_injective F n + rw [equalCharacteristicLubinTatePrimitiveEvaluation_mk, + equalCharacteristicLubinTatePrimitiveEvaluation_mk] + apply Subtype.ext + change equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (u : F.residueField⟦X⟧) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) = + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) 1 + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) + rw [equalCharacteristicLubinTateAmbientBracket_one_apply_of_torsion F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) + (chosenEqualCharacteristicLubinTatePrimitiveRoot_torsion F n)] + exact hfix + · intro hu + change equalCharacteristicLubinTateUnitReduction F n u = 1 at hu + have hq := congrArg Units.val hu + change equalCharacteristicLubinTateTruncatedRingMk F n + (u : F.residueField⟦X⟧) = + equalCharacteristicLubinTateTruncatedRingMk F n 1 at hq + have heval := congrArg + (equalCharacteristicLubinTatePrimitiveEvaluation F n) hq + rw [equalCharacteristicLubinTatePrimitiveEvaluation_mk, + equalCharacteristicLubinTatePrimitiveEvaluation_mk] at heval + have hval := congrArg Subtype.val heval + change equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (u : F.residueField⟦X⟧) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) = + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) 1 + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) at hval + exact hval.trans + (equalCharacteristicLubinTateAmbientBracket_one_apply_of_torsion F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) + (chosenEqualCharacteristicLubinTatePrimitiveRoot_torsion F n)) + +/-- The `[u⁻¹]` action occurring in the completed theta-intertwining theorem fixes the standard +primitive +division-level `n + 1` division point exactly when `u` is an `(n + 1)`-st higher +unit. This is the faithful-action kernel needed in the proof of the explicit norm-subgroup + computation. -/ +theorem equalCharacteristicLubinTateAmbientBracket_inv_primitiveRoot_eq_iff_mem_higherUnitSubgroup + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (u : F.residueField⟦X⟧ˣ) : + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + ((u⁻¹ : F.residueField⟦X⟧ˣ) : F.residueField⟦X⟧) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) = + chosenEqualCharacteristicLubinTatePrimitiveRoot F n ↔ + u ∈ equalCharacteristicLubinTateHigherUnitSubgroup F n := by + constructor + · intro hfix + have hinv := + (equalCharacteristicLubinTateAmbientBracket_primitiveRoot_eq_iff_mem_higherUnitSubgroup + F n u⁻¹).1 hfix + have hu := (equalCharacteristicLubinTateHigherUnitSubgroup F n).inv_mem hinv + simpa using hu + · intro hu + apply + (equalCharacteristicLubinTateAmbientBracket_primitiveRoot_eq_iff_mem_higherUnitSubgroup + F n u⁻¹).2 + exact (equalCharacteristicLubinTateHigherUnitSubgroup F n).inv_mem hu + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitsNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitsNorm.lean new file mode 100644 index 0000000000..fd68fd7a78 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitsNorm.lean @@ -0,0 +1,106 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormSubgroupFunctoriality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedNorm +/-! +# LubinTate the explicit norm-subgroup computation: higher units are norms from the standard level + +The fixed-field norm `N(-pi_delta) = aT` from the completed theta-intertwining theorem is + transported through +the standard-level equivalence. Cancelling the already known norm `T` +then puts every level-`n+1` higher unit in the standard norm subgroup. +-/ + +@[expose] public section + +noncomputable +section + + +open scoped LaurentSeries PowerSeries + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory +open LocalFieldTheory + +variable {K : Type} [Field K] + +attribute [local instance] + equalCharacteristicCompletedFrobeniusFixedBaseAlgebra + equalCharacteristicLubinTateLevelFieldAlgebra + equalCharacteristicLubinTateLevelFieldSMul + equalCharacteristicLubinTateLevelFieldModule + equalCharacteristicCompletedFrobeniusFixedFieldAlgebra + equalCharacteristicCompletedFrobeniusFixedFieldSMul + equalCharacteristicCompletedFrobeniusFixedFieldModule + +/-- The sharp higher-unit inclusion in LubinTate the explicit norm-subgroup computation. -/ +theorem + equalCharacteristicPowerSeriesUnitToLaurentFieldUnit_mem_normSubgroup_of_mem_higherUnit + (F : LocalField K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) + (ha : a ∈ equalCharacteristicLubinTateHigherUnitSubgroup F n) : + equalCharacteristicPowerSeriesUnitToLaurentFieldUnit F a ∈ + equalCharacteristicLubinTateNormSubgroup F n := by + let : FiniteDimensional F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + let : FiniteDimensional F.residueField⸨X⸩ + (equalCharacteristicCompletedFrobeniusFixedField F a n) := + FiniteDimensional.of_finrank_pos (by + rw [equalCharacteristicCompletedFrobeniusFixedField_finrank] + exact Nat.mul_pos + (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (Nat.pow_pos Nat.card_pos)) + have hprime : -equalCharacteristicCompletedFrobeniusPrimeElement F a n ≠ 0 := by + intro hzero + have hnorm := equalCharacteristicCompletedFrobenius_norm_neg_primeElement F a n + rw [hzero, Algebra.norm_zero] at hnorm + exact equalCharacteristicChangedLaurentUniformizer_ne_zero F a hnorm.symm + let y : (equalCharacteristicCompletedFrobeniusFixedField F a n)ˣ := + Units.mk0 (-equalCharacteristicCompletedFrobeniusPrimeElement F a n) hprime + have hyNorm : normUnits F.residueField⸨X⸩ + (equalCharacteristicCompletedFrobeniusFixedField F a n) y = + equalCharacteristicChangedLaurentUniformizerUnit F a := by + apply Units.ext + exact equalCharacteristicCompletedFrobenius_norm_neg_primeElement F a n + have hyMem : + normUnits F.residueField⸨X⸩ + (equalCharacteristicCompletedFrobeniusFixedField F a n) y ∈ + localNormSubgroup F.residueField⸨X⸩ + (equalCharacteristicCompletedFrobeniusFixedField F a n) := + ⟨y, rfl⟩ + rw [hyNorm] at hyMem + let e := equalCharacteristicLubinTateLevelFieldEquivFixedFieldOfHigherUnit + F a n ha + have hchanged : equalCharacteristicChangedLaurentUniformizerUnit F a ∈ + equalCharacteristicLubinTateNormSubgroup F n := by + change equalCharacteristicChangedLaurentUniformizerUnit F a ∈ + localNormSubgroup F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) + rw [← LocalFieldTheory.normSubgroup_algEquiv F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) + (equalCharacteristicCompletedFrobeniusFixedField F a n) e] + exact hyMem + have hunit : equalCharacteristicChangedLaurentUnit F a ∈ + equalCharacteristicLubinTateNormSubgroup F n := + (equalCharacteristicChangedLaurentUniformizerUnit_mem_normSubgroup_iff + F n a).1 hchanged + simpa only [equalCharacteristicPowerSeriesUnitToLaurentFieldUnit_apply] + using hunit + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/LevelAlgebra.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/LevelAlgebra.lean new file mode 100644 index 0000000000..e1ea220ff0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/LevelAlgebra.lean @@ -0,0 +1,74 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient +/-! +# LubinTate the explicit norm-subgroup computation: canonical algebra and norm subgroup at a + finite level + +This light leaf names the canonical base algebra and its norm subgroup once, +so the later inclusion and index arguments do not repeat expensive fallback +typeclass searches. +-/ + +@[expose] public section + +noncomputable +section + + +open scoped LaurentSeries + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type} [Field K] + +/-- The Laurent-series field over the residue field, with its Hahn-series field structure. -/ +noncomputable local instance equalCharacteristicLaurentSeriesField + (F : LocalField K) : Field F.residueField⸨X⸩ := + @HahnSeries.instField ℤ F.residueField Int.instAddCommGroup + Int.instLinearOrder Int.instIsOrderedAddMonoid inferInstance + +/-- Multiplication on the Laurent-series field uses the same field structure as the level-field +tower. -/ +noncomputable local instance equalCharacteristicLaurentSeriesMonoid + (F : LocalField K) : Monoid F.residueField⸨X⸩ := + @CommMonoid.toMonoid F.residueField⸨X⸩ + (@CommRing.toCommMonoid F.residueField⸨X⸩ + (@Field.toCommRing F.residueField⸨X⸩ + (equalCharacteristicLaurentSeriesField F))) + +attribute [local instance] + equalCharacteristicLubinTateLevelFieldAlgebra + equalCharacteristicLubinTateLevelFieldSMul + equalCharacteristicLubinTateLevelFieldModule + +/-- The canonical base algebra on the explicit Lubin--Tate level field. -/ +@[reducible] noncomputable def equalCharacteristicLubinTateLevelAlgebra + (F : LocalField K) [CharP K F.residueCharacteristic] (n : ℕ) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelFieldAlgebra F n + +/-- The norm subgroup of the explicit Lubin--Tate level, with the canonical +base algebra fixed once for downstream statements. -/ +noncomputable def equalCharacteristicLubinTateNormSubgroup + (F : LocalField K) [CharP K F.residueCharacteristic] (n : ℕ) : + Subgroup F.residueField⸨X⸩ˣ := by + letI : Algebra F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelAlgebra F n + exact LocalFieldTheory.localNormSubgroup F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/StandardSubgroupNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/StandardSubgroupNorm.lean new file mode 100644 index 0000000000..a0ea0c2e47 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/StandardSubgroupNorm.lean @@ -0,0 +1,76 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitsNorm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups +/-! +# LubinTate the explicit norm-subgroup computation: the sharp standard subgroup consists of norms + +The higher-unit norm calculation and the uniformizer norm combine to give +the division-level inclusion `(T⁻¹) × U^(n+1) ≤ N(L_n/K)`. +-/ + +@[expose] public section + +noncomputable +section + + +open scoped LaurentSeries PowerSeries ValuativeRel + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type} [Field K] + +/-- The canonical field principal-unit subgroup `U^(n+1)` consists of +norms from the standard level. -/ +theorem equalCharacteristicLubinTate_fieldPrincipalUnits_le_normSubgroup + (F : LocalField K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + letI : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + LocalFieldTheory.fieldPrincipalUnits F.residueField⸨X⸩ (n + 1) ≤ + equalCharacteristicLubinTateNormSubgroup F n := by + let : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + rw [← equalCharacteristicLubinTateHigherUnitSubgroup_map_toLaurentField_eq] + rintro x ⟨a, ha, rfl⟩ + exact + equalCharacteristicPowerSeriesUnitToLaurentFieldUnit_mem_normSubgroup_of_mem_higherUnit + F n a ha + +/-- The sharp standard subgroup `(T⁻¹) × U^(n+1)` is contained in the norm +subgroup. -/ +theorem + equalCharacteristicLubinTate_uniformizerPrincipalSubgroup_le_normSubgroup + (F : LocalField K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + letI : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + LocalFieldTheory.uniformizerPrincipalSubgroup F.residueField⸨X⸩ + ((equalCharacteristicLaurentUniformizerUnit F)⁻¹) 1 (n + 1) ≤ + equalCharacteristicLubinTateNormSubgroup F n := by + let : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + rw [LocalFieldTheory.uniformizerPrincipalSubgroup] + apply sup_le + · simpa using + equalCharacteristicLubinTate_normalizedUniformizer_zpowers_le_normSubgroup + F n + · exact + equalCharacteristicLubinTate_fieldPrincipalUnits_le_normSubgroup F n + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UniformizerNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UniformizerNorm.lean new file mode 100644 index 0000000000..78cc45cf22 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UniformizerNorm.lean @@ -0,0 +1,83 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.LevelAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization +/-! +# LubinTate the explicit norm-subgroup computation: the uniformizer factor is a norm + +The normalized Laurent uniformizer `T⁻¹` is the inverse of the norm of the +negative primitive Lubin--Tate division point. This light leaf isolates the +valuation factor of the norm-subgroup calculation from the later openness +and index arguments. +-/ + +@[expose] public section + +noncomputable +section + + +open scoped LaurentSeries ValuativeRel + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type} [Field K] + +universe u + +private theorem inverse_mem_normSubgroup_of_normUnits_eq + {B E : Type u} [Field B] [Field E] [Algebra B E] + (y : Eˣ) (pi : Bˣ) + (hyNorm : LocalFieldTheory.normUnits B E y = pi) : + pi⁻¹ ∈ LocalFieldTheory.localNormSubgroup B E := by + have hyMem : + LocalFieldTheory.normUnits B E y ∈ + LocalFieldTheory.localNormSubgroup B E := + ⟨y, rfl⟩ + rw [hyNorm] at hyMem + exact (LocalFieldTheory.localNormSubgroup B E).inv_mem hyMem + +/-- The normalized Laurent uniformizer `T⁻¹` is an actual norm from every +explicit Lubin--Tate level field. -/ +theorem equalCharacteristicLubinTate_normalizedUniformizer_mem_normSubgroup + (F : LocalField K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + (equalCharacteristicLaurentUniformizerUnit F)⁻¹ ∈ + equalCharacteristicLubinTateNormSubgroup F n := by + let : FiniteDimensional F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + let y : (equalCharacteristicLubinTateLevelField F n)ˣ := + Units.mk0 (-equalCharacteristicLubinTateLevelGenerator F n) + (neg_ne_zero.mpr (by + intro hzero + apply chosenEqualCharacteristicLubinTatePrimitiveRoot_ne_zero F n + simpa [equalCharacteristicLubinTateLevelGenerator] using + congrArg Subtype.val hzero)) + apply inverse_mem_normSubgroup_of_normUnits_eq + y (equalCharacteristicLaurentUniformizerUnit F) + apply Units.ext + exact equalCharacteristicLubinTate_norm_neg_levelGenerator F n + +/-- Every integral power of the normalized Laurent uniformizer is a norm. -/ +theorem equalCharacteristicLubinTate_normalizedUniformizer_zpowers_le_normSubgroup + (F : LocalField K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + Subgroup.zpowers ((equalCharacteristicLaurentUniformizerUnit F)⁻¹) ≤ + equalCharacteristicLubinTateNormSubgroup F n := by + rw [Subgroup.zpowers_le] + exact equalCharacteristicLubinTate_normalizedUniformizer_mem_normSubgroup F n + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitQuotientCard.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitQuotientCard.lean new file mode 100644 index 0000000000..b645355a95 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitQuotientCard.lean @@ -0,0 +1,309 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UniformizerPrincipalQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters +/-! +# LubinTate the explicit norm-subgroup computation: cardinality of the standard Lubin--Tate quotient + +At repository level `n`, reduction modulo `T^(n+1)` identifies the quotient +of the power-series unit group by its explicit higher-unit kernel with the +units of the truncated power-series ring. Its elements are parametrized by +one nonzero constant coefficient and `n` arbitrary further coefficients, so +the quotient has cardinality `(q - 1) q^n`. + +The power-series/integer-ring equivalence, the light quotient equivalence +from the unramified norm-index formula, and the normalized Laurent uniformizer then give +the same cardinality for `K^x / ( U^(n+1))`. +-/ + +@[expose] public section + +noncomputable +section + + +open scoped LaurentSeries PowerSeries ValuativeRel WithZero + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +variable {K : Type u} [Field K] + +private noncomputable def unitParameterReduction + (F : LocalField.{u, v} K) (n : ℕ) : + equalCharacteristicLubinTateUnitParameter F n → + (equalCharacteristicLubinTateTruncatedRing F n)ˣ := + fun a => equalCharacteristicLubinTateUnitReduction F n + (equalCharacteristicLubinTateUnitParameterUnit F n a) + +private theorem unitParameterReduction_injective + (F : LocalField.{u, v} K) (n : ℕ) : + Function.Injective (unitParameterReduction F n) := by + intro a b hab + apply equalCharacteristicLubinTateUnitParameter_eq_of_coeff_eq F n a b + intro i hi + have hmk := congrArg Units.val hab + change equalCharacteristicLubinTateTruncatedRingMk F n + (equalCharacteristicLubinTateUnitParameterSeries F n a) = + equalCharacteristicLubinTateTruncatedRingMk F n + (equalCharacteristicLubinTateUnitParameterSeries F n b) at hmk + have hdvd : PowerSeries.X ^ (n + 1) ∣ + equalCharacteristicLubinTateUnitParameterSeries F n a - + equalCharacteristicLubinTateUnitParameterSeries F n b := by + rw [← Ideal.mem_span_singleton, + ← equalCharacteristicLubinTateTruncatedRingMk_eq_iff F n] + exact hmk + have hz := PowerSeries.X_pow_dvd_iff.mp hdvd i + (Nat.lt_succ_iff.mpr hi) + rw [map_sub, sub_eq_zero] at hz + exact hz + +private theorem unitParameterReduction_surjective + (F : LocalField.{u, v} K) (n : ℕ) : + Function.Surjective (unitParameterReduction F n) := by + intro z + obtain ⟨u, hu⟩ := + equalCharacteristicLubinTateUnitReduction_surjective F n z + let a : equalCharacteristicLubinTateUnitParameter F n := + equalCharacteristicLubinTateUnitParameterOfCoefficients F n + (Units.map (PowerSeries.constantCoeff (R := F.residueField)) u) + (fun i => PowerSeries.coeff (i + 1) (u : F.residueField⟦X⟧)) + refine ⟨a, ?_⟩ + change equalCharacteristicLubinTateUnitReduction F n + (equalCharacteristicLubinTateUnitParameterUnit F n a) = z + rw [← hu] + apply Units.ext + change equalCharacteristicLubinTateTruncatedRingMk F n + (equalCharacteristicLubinTateUnitParameterSeries F n a) = + equalCharacteristicLubinTateTruncatedRingMk F n + (u : F.residueField⟦X⟧) + rw [equalCharacteristicLubinTateTruncatedRingMk_eq_iff, + Ideal.mem_span_singleton] + apply PowerSeries.X_pow_dvd_iff.mpr + intro j hj + rw [map_sub, sub_eq_zero] + cases j with + | zero => + rw [equalCharacteristicLubinTateUnitParameterSeries_coeff_zero] + change PowerSeries.constantCoeff (u : F.residueField⟦X⟧) = + PowerSeries.coeff 0 (u : F.residueField⟦X⟧) + exact (PowerSeries.coeff_zero_eq_constantCoeff_apply _).symm + | succ j => + have hjn : j < n := by omega + have hcoeff := + equalCharacteristicLubinTateUnitParameterSeries_coeff_succ + F n a ⟨j, hjn⟩ + change PowerSeries.coeff (j + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) = + a.higherCoeff ⟨j, hjn⟩ at hcoeff + rw [hcoeff] + rfl + +private noncomputable def unitParameterReductionEquiv + (F : LocalField.{u, v} K) (n : ℕ) : + equalCharacteristicLubinTateUnitParameter F n ≃ + (equalCharacteristicLubinTateTruncatedRing F n)ˣ := + Equiv.ofBijective (unitParameterReduction F n) + ⟨unitParameterReduction_injective F n, + unitParameterReduction_surjective F n⟩ + +private theorem truncatedUnitsFinite + (F : LocalField.{u, v} K) (n : ℕ) : + Finite (equalCharacteristicLubinTateTruncatedRing F n)ˣ := + Finite.of_equiv (equalCharacteristicLubinTateUnitParameter F n) + (unitParameterReductionEquiv F n) + +private theorem unitQuotientFinite + (F : LocalField.{u, v} K) (n : ℕ) : + Finite + (F.residueField⟦X⟧ˣ ⧸ + equalCharacteristicLubinTateHigherUnitSubgroup F n) := by + let : Finite (equalCharacteristicLubinTateTruncatedRing F n)ˣ := + truncatedUnitsFinite F n + exact + Finite.of_equiv (equalCharacteristicLubinTateTruncatedRing F n)ˣ + (equalCharacteristicLubinTateUnitQuotientEquivTruncatedUnits + F n).symm.toEquiv + +/-- The explicit unit quotient at repository level `n` has order +`(q - 1) q^n`, where `q` is the residue-field cardinality. -/ +theorem equalCharacteristicLubinTateUnitQuotient_natCard + (F : LocalField.{u, v} K) (n : ℕ) : + letI : Finite + (F.residueField⟦X⟧ˣ ⧸ + equalCharacteristicLubinTateHigherUnitSubgroup F n) := + by exact unitQuotientFinite F n + Nat.card + (F.residueField⟦X⟧ˣ ⧸ + equalCharacteristicLubinTateHigherUnitSubgroup F n) = + (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := by + let : Finite + (F.residueField⟦X⟧ˣ ⧸ + equalCharacteristicLubinTateHigherUnitSubgroup F n) := + unitQuotientFinite F n + let : Finite (equalCharacteristicLubinTateTruncatedRing F n)ˣ := + truncatedUnitsFinite F n + calc + Nat.card + (F.residueField⟦X⟧ˣ ⧸ + equalCharacteristicLubinTateHigherUnitSubgroup F n) = + Nat.card (equalCharacteristicLubinTateTruncatedRing F n)ˣ := + Nat.card_congr + (equalCharacteristicLubinTateUnitQuotientEquivTruncatedUnits + F n).toEquiv + _ = Nat.card (equalCharacteristicLubinTateUnitParameter F n) := + Nat.card_congr + (unitParameterReductionEquiv F n).symm + _ = (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := + equalCharacteristicLubinTateUnitParameter_natCard F n + +/-- The canonical power-series unit quotient is the integer-unit quotient of +the Laurent valuation ring at the same depth. -/ +private noncomputable def + unitQuotientCard_powerSeriesQuotientEquivLaurentIntegerQuotient + (F : LocalField.{u, v} K) (n : ℕ) : + letI : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + F.residueField⟦X⟧ˣ ⧸ + equalCharacteristicLubinTateHigherUnitSubgroup F n ≃* + IntegerUnitsPrincipalQuot F.residueField⸨X⸩ (n + 1) := by + let B := F.residueField⸨X⸩ + letI : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + let e := equalCharacteristicPowerSeriesUnitsEquivLaurentInteger + F.residueField + let phi : F.residueField⟦X⟧ˣ →* + IntegerUnitsPrincipalQuot B (n + 1) := + (integerUnitsPrincipalQuotMk B (n + 1)).comp e.toMonoidHom + have hsurjective : Function.Surjective phi := by + intro q + obtain ⟨a, rfl⟩ := + integerUnitsPrincipalQuotMk_surjective B (n + 1) q + refine ⟨e.symm a, ?_⟩ + change integerUnitsPrincipalQuotMk B (n + 1) + (e (e.symm a)) = integerUnitsPrincipalQuotMk B (n + 1) a + rw [e.apply_symm_apply] + have hker : MonoidHom.ker phi = + equalCharacteristicLubinTateHigherUnitSubgroup F n := by + ext a + change integerUnitsPrincipalQuotMk B (n + 1) (e a) = 1 ↔ + a ∈ equalCharacteristicLubinTateHigherUnitSubgroup F n + rw [integerUnitsPrincipalQuotMk_eq_one_iff] + exact + (equalCharacteristicPowerSeriesUnitsEquivLaurentInteger_mem_iff + F.residueField (n + 1) a).trans + (mem_equalCharacteristicLubinTateHigherUnitSubgroup F n a).symm + exact + (QuotientGroup.quotientMulEquivOfEq hker.symm).trans + (QuotientGroup.quotientKerEquivOfSurjective phi hsurjective) + +private theorem uniformizerPrincipalQuotientFinite + (F : LocalField.{u, v} K) (n : ℕ) : + letI : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + letI : IsNonarchimedeanLocalField F.residueField⸨X⸩ := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + Finite + (F.residueField⸨X⸩ˣ ⧸ + LocalFieldTheory.uniformizerPrincipalSubgroup F.residueField⸨X⸩ + (equalCharacteristicLaurentUniformizerUnit F)⁻¹ 1 (n + 1)) := by + let B := F.residueField⸨X⸩ + let pi : Bˣ := (equalCharacteristicLaurentUniformizerUnit F)⁻¹ + let : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + let : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + let : Finite + (F.residueField⟦X⟧ˣ ⧸ + equalCharacteristicLubinTateHigherUnitSubgroup F n) := + unitQuotientFinite F n + let : Finite (IntegerUnitsPrincipalQuot B (n + 1)) := + Finite.of_equiv + (F.residueField⟦X⟧ˣ ⧸ + equalCharacteristicLubinTateHigherUnitSubgroup F n) + (unitQuotientCard_powerSeriesQuotientEquivLaurentIntegerQuotient + F n).toEquiv + have hpi : valuationMap B (Additive.ofMul pi) = 1 := by + simpa [B, pi] using + equalCharacteristicLaurentUniformizerUnit_inv_valuationMap F + exact Finite.of_equiv (IntegerUnitsPrincipalQuot B (n + 1)) + (LocalFieldTheory.uniformizerPrincipalQuotientEquivIntegerUnitsPrincipalQuotient + B pi hpi (n + 1)).symm.toEquiv + +/-- The standard subgroup generated by the normalized Laurent uniformizer +and `U^(n+1)` has quotient cardinality `(q - 1) q^n`. -/ +theorem equalCharacteristicLubinTateUniformizerPrincipalQuotient_natCard + (F : LocalField.{u, v} K) (n : ℕ) : + letI : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + letI : IsNonarchimedeanLocalField F.residueField⸨X⸩ := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + letI : Finite + (F.residueField⸨X⸩ˣ ⧸ + LocalFieldTheory.uniformizerPrincipalSubgroup F.residueField⸨X⸩ + (equalCharacteristicLaurentUniformizerUnit F)⁻¹ 1 (n + 1)) := + by exact uniformizerPrincipalQuotientFinite F n + Nat.card + (F.residueField⸨X⸩ˣ ⧸ + LocalFieldTheory.uniformizerPrincipalSubgroup F.residueField⸨X⸩ + (equalCharacteristicLaurentUniformizerUnit F)⁻¹ 1 (n + 1)) = + (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := by + let B := F.residueField⸨X⸩ + let pi : Bˣ := (equalCharacteristicLaurentUniformizerUnit F)⁻¹ + let : ValuativeRel B := equalCharacteristicLaurentValuativeRel F + let : IsNonarchimedeanLocalField B := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + let : Finite + (Bˣ ⧸ + LocalFieldTheory.uniformizerPrincipalSubgroup B pi 1 (n + 1)) := by + simpa [B, pi] using uniformizerPrincipalQuotientFinite F n + let : Finite + (F.residueField⟦X⟧ˣ ⧸ + equalCharacteristicLubinTateHigherUnitSubgroup F n) := + unitQuotientFinite F n + let : Finite (IntegerUnitsPrincipalQuot B (n + 1)) := + Finite.of_equiv + (F.residueField⟦X⟧ˣ ⧸ + equalCharacteristicLubinTateHigherUnitSubgroup F n) + (unitQuotientCard_powerSeriesQuotientEquivLaurentIntegerQuotient + F n).toEquiv + have hpi : valuationMap B (Additive.ofMul pi) = 1 := by + simpa [B, pi] using + equalCharacteristicLaurentUniformizerUnit_inv_valuationMap F + calc + Nat.card + (Bˣ ⧸ LocalFieldTheory.uniformizerPrincipalSubgroup B pi 1 (n + 1)) = + Nat.card (IntegerUnitsPrincipalQuot B (n + 1)) := + Nat.card_congr + (LocalFieldTheory.uniformizerPrincipalQuotientEquivIntegerUnitsPrincipalQuotient + B pi hpi (n + 1)).toEquiv + _ = Nat.card + (F.residueField⟦X⟧ˣ ⧸ + equalCharacteristicLubinTateHigherUnitSubgroup F n) := + Nat.card_congr + (unitQuotientCard_powerSeriesQuotientEquivLaurentIntegerQuotient + F n).symm.toEquiv + _ = (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := + equalCharacteristicLubinTateUnitQuotient_natCard F n + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitTransport.lean new file mode 100644 index 0000000000..b5aa048f5d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitTransport.lean @@ -0,0 +1,174 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizerNormalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnitTopology +/-! +# LubinTate the explicit norm-subgroup computation: power-series units as Laurent field units + +This file packages the genuine composite + +`k[[T]]ˣ ≃ 𝒪[k((T))]ˣ → k((T))ˣ` + +used in the sharp norm-subgroup calculation. Its range is the full +valuation-zero unit subgroup, and it carries the explicit Lubin--Tate kernel +to the higher-unit subgroup `U^(n+1)`. The same composite is definitionally the +Laurent unit multiplying `T` in the changed uniformizer of the completed theta-intertwining theorem. +-/ + +@[expose] public section + +noncomputable +section + + +open scoped LaurentSeries PowerSeries ValuativeRel + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +variable {K : Type u} [Field K] + +/-- The canonical inclusion of a power-series unit into the Laurent field +unit group, through the actual valuation ring. -/ +noncomputable def equalCharacteristicPowerSeriesUnitToLaurentFieldUnit + (F : LocalField.{u, v} K) : + F.residueField⟦X⟧ˣ →* F.residueField⸨X⸩ˣ := by + letI : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + exact + (integerUnitsToFieldUnits F.residueField⸨X⸩).comp + (equalCharacteristicPowerSeriesUnitsEquivLaurentInteger + F.residueField).toMonoidHom + +/-- The canonical unit inclusion is the Laurent unit used in the changed +uniformizer `uT` of the completed theta-intertwining theorem. -/ +@[simp] +theorem equalCharacteristicPowerSeriesUnitToLaurentFieldUnit_apply + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicPowerSeriesUnitToLaurentFieldUnit F a = + equalCharacteristicChangedLaurentUnit F a := by + apply Units.ext + rfl + +/-- In the field unit group, the changed uniformizer is the product of its +power-series unit factor and `T`. -/ +theorem equalCharacteristicChangedLaurentUniformizerUnit_eq_unit_mul + (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicChangedLaurentUniformizerUnit F a = + equalCharacteristicChangedLaurentUnit F a * + equalCharacteristicLaurentUniformizerUnit F := by + apply Units.ext + exact equalCharacteristicChangedLaurentUniformizer_eq_unit_mul F a + +/-- Multiplication by `T` does not change norm membership for a Lubin--Tate +level, because both `T⁻¹` and `T` are already norms. Thus the prime norm +`uT` used in the completed theta-intertwining theorem detects exactly whether the unit `u` is a + norm. -/ +theorem equalCharacteristicChangedLaurentUniformizerUnit_mem_normSubgroup_iff + {K₀ : Type} [Field K₀] + (F : LocalField K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + equalCharacteristicChangedLaurentUniformizerUnit F a ∈ + equalCharacteristicLubinTateNormSubgroup F n ↔ + equalCharacteristicChangedLaurentUnit F a ∈ + equalCharacteristicLubinTateNormSubgroup F n := by + let N := equalCharacteristicLubinTateNormSubgroup F n + let T := equalCharacteristicLaurentUniformizerUnit F + have hTinv : T⁻¹ ∈ N := + equalCharacteristicLubinTate_normalizedUniformizer_mem_normSubgroup F n + have hT : T ∈ N := by + simpa using N.inv_mem hTinv + constructor + · intro hprod + rw [equalCharacteristicChangedLaurentUniformizerUnit_eq_unit_mul] at hprod + have h := N.mul_mem hprod hTinv + change equalCharacteristicChangedLaurentUnit F a ∈ N + simpa [T, mul_assoc] using h + · intro hu + rw [equalCharacteristicChangedLaurentUniformizerUnit_eq_unit_mul] + change + equalCharacteristicChangedLaurentUnit F a * T ∈ N + exact N.mul_mem hu hT + +/-- The positive-valuation inverse prime norm used by the normalized +normalized additive valuation has the same norm-membership test. -/ +theorem equalCharacteristicChangedLaurentUniformizerUnit_inv_mem_normSubgroup_iff + {K₀ : Type} [Field K₀] + (F : LocalField K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) (a : F.residueField⟦X⟧ˣ) : + (equalCharacteristicChangedLaurentUniformizerUnit F a)⁻¹ ∈ + equalCharacteristicLubinTateNormSubgroup F n ↔ + equalCharacteristicChangedLaurentUnit F a ∈ + equalCharacteristicLubinTateNormSubgroup F n := by + let N := equalCharacteristicLubinTateNormSubgroup F n + constructor + · intro hinv + apply + (equalCharacteristicChangedLaurentUniformizerUnit_mem_normSubgroup_iff + F n a).1 + simpa using N.inv_mem hinv + · intro hu + exact N.inv_mem + ((equalCharacteristicChangedLaurentUniformizerUnit_mem_normSubgroup_iff + F n a).2 hu) + +/-- Every valuation-zero Laurent field unit, and only such a unit, comes +from a power-series unit under the canonical inclusion. -/ +theorem equalCharacteristicPowerSeriesUnitToLaurentFieldUnit_range + (F : LocalField.{u, v} K) : + letI : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + MonoidHom.range (equalCharacteristicPowerSeriesUnitToLaurentFieldUnit F) = + LocalFieldTheory.localBaseUnitSubgroup F.residueField⸨X⸩ := by + let : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + let e := equalCharacteristicPowerSeriesUnitsEquivLaurentInteger + F.residueField + change MonoidHom.range + ((integerUnitsToFieldUnits F.residueField⸨X⸩).comp e.toMonoidHom) = + MonoidHom.range (integerUnitsToFieldUnits F.residueField⸨X⸩) + ext x + constructor + · rintro ⟨a, rfl⟩ + exact ⟨e a, rfl⟩ + · rintro ⟨b, rfl⟩ + refine ⟨e.symm b, ?_⟩ + simp [e] + +/-- The explicit Lubin--Tate higher-unit kernel maps to the canonical field +principal-unit group `U^(n+1)` in one step. -/ +theorem equalCharacteristicLubinTateHigherUnitSubgroup_map_toLaurentField_eq + (F : LocalField.{u, v} K) (n : ℕ) : + letI : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + (equalCharacteristicLubinTateHigherUnitSubgroup F n).map + (equalCharacteristicPowerSeriesUnitToLaurentFieldUnit F) = + LocalFieldTheory.fieldPrincipalUnits F.residueField⸨X⸩ (n + 1) := by + let : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + simpa only [equalCharacteristicPowerSeriesUnitToLaurentFieldUnit, + Subgroup.map_map] using + (equalCharacteristicLubinTateHigherUnitSubgroup_map_eq_fieldPrincipalUnits + F n) + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification.lean new file mode 100644 index 0000000000..4bb6d626f0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.DisplacementValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.GaloisAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.LowerGroups +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.PrimitivePoint + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/All.lean new file mode 100644 index 0000000000..639897964c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/All.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.DisplacementValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.GaloisAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.LowerGroups +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.PrimitivePoint + +/-! # All -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/Core.lean new file mode 100644 index 0000000000..b143473ab1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/Core.lean @@ -0,0 +1,387 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.LowerGroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.GaloisAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.PrimitivePoint +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.DisplacementValuation +/-! +# Herbrand function and upper ramification groups of Lubin--Tate levels + +The lower-group calculation is integrated here to compute the actual Herbrand +function and the resulting upper ramification groups of the chosen +equal-characteristic Lubin--Tate level. +-/ + +@[expose] public section + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandSlope → + herbrandSlope + + +noncomputable +section + +open scoped LaurentSeries Pointwise PowerSeries + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LubinTate.EqualCharacteristic +open RamificationTheory.HilbertRamification.Higher +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +universe u v y + +variable {K : Type u} [Field K] + +section ChosenRamificationTarget + +variable {K₀ : Type} [Field K₀] + +attribute [local instance] + equalCharacteristicLubinTateLevelField_finiteDimensional_forLowerGroups + equalCharacteristicLubinTateLevelField_isGalois_forLowerGroups + +private theorem + equalCharacteristicLubinTateUnitParameterToGal_mem_lowerRamificationGroup_zero + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) (a : equalCharacteristicLubinTateUnitParameter F n) : + equalCharacteristicLubinTateUnitParameterToGal F n a ∈ + equalCharacteristicLubinTateRealLowerRamificationGroup F n 0 := by + have hqpos : + 0 < Nat.card F.residueField := + Nat.zero_lt_one.trans + (Finite.one_lt_card : 1 < Nat.card F.residueField) + have hpow : + 1 ≤ + Nat.card F.residueField ^ + (equalCharacteristicLubinTateUnitParameterSeries F n a - 1).order.toNat := + Nat.one_le_iff_ne_zero.mpr + (pow_ne_zero _ (Nat.ne_of_gt hqpos)) + have hm : + equalCharacteristicLubinTateUnitParameterToGal F n a ∈ + equalCharacteristicLubinTateRealLowerRamificationGroup F n + ((0 : ℕ) : ℝ) := + (mem_equalCharacteristicLubinTateRealLowerRamificationGroup_nat_iff_parameterPower + F n 0 a).mpr (Or.inr (by exact_mod_cast hpow)) + simpa only [Nat.cast_zero] using hm + +private noncomputable def + equalCharacteristicLubinTateUnitParameterEquivLowerRamificationGroupZero + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicLubinTateUnitParameter F n ≃ + equalCharacteristicLubinTateRealLowerRamificationGroup F n 0 where + toFun a := + ⟨equalCharacteristicLubinTateUnitParameterToGal F n a, + equalCharacteristicLubinTateUnitParameterToGal_mem_lowerRamificationGroup_zero + F n a⟩ + invFun sigma := + (equalCharacteristicLubinTateUnitParameterEquivGal F n).symm sigma.1 + left_inv a := + (equalCharacteristicLubinTateUnitParameterEquivGal F n).symm_apply_apply a + right_inv sigma := by + apply Subtype.ext + exact + (equalCharacteristicLubinTateUnitParameterEquivGal F n).apply_symm_apply + sigma.1 + +private theorem equalCharacteristicLubinTateRealLowerRamificationGroup_zero_natCard + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + Nat.card (equalCharacteristicLubinTateRealLowerRamificationGroup F n 0) = + (Nat.card F.residueField - 1) * Nat.card F.residueField ^ n := by + calc + Nat.card (equalCharacteristicLubinTateRealLowerRamificationGroup F n 0) = + Nat.card (equalCharacteristicLubinTateUnitParameter F n) := + (Nat.card_congr + (equalCharacteristicLubinTateUnitParameterEquivLowerRamificationGroupZero + F n)).symm + _ = (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := + equalCharacteristicLubinTateUnitParameter_natCard F n + +private noncomputable def + equalCharacteristicLubinTateLowerRamificationFiltration + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration + Gal((equalCharacteristicLubinTateLevelField F n)/LaurentSeries F.residueField) := + lowerRamificationFiltrationOfUniqueExtension + (base := (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF) + (target := (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF) + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + F n) + +private theorem equalCharacteristicLubinTateHerbrandSlope_eq_of_pow_interval + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n k i : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) + (hlow : Nat.card F.residueField ^ (k - 1) ≤ i + 1) + (hhigh : i + 1 < Nat.card F.residueField ^ k) : + herbrandSlope + (equalCharacteristicLubinTateLowerRamificationFiltration F n) i = + (Nat.card F.residueField ^ (n + 1 - k) : ℕ) / + ((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n : ℕ) := by + rw [ + herbrandSlope] + change + (Nat.card + (equalCharacteristicLubinTateRealLowerRamificationGroup F n + ((i + 1 : ℕ) : ℝ)) : ℝ) / + Nat.card + (equalCharacteristicLubinTateRealLowerRamificationGroup F n + ((0 : ℕ) : ℝ)) = + _ + rw [ + equalCharacteristicLubinTateRealLowerRamificationGroup_natCard_of_pow_interval + F n k (i + 1) hk hkn hlow hhigh, + show + Nat.card + (equalCharacteristicLubinTateRealLowerRamificationGroup F n + ((0 : ℕ) : ℝ)) = + (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n by + simpa only [Nat.cast_zero] using + equalCharacteristicLubinTateRealLowerRamificationGroup_zero_natCard + F n] + +private theorem equalCharacteristicLubinTateHerbrandValueNat_pow_sub_one + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n k : ℕ) (hkn : k ≤ n + 1) : + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandValueNat + (equalCharacteristicLubinTateLowerRamificationFiltration F n) + (Nat.card F.residueField ^ k - 1) = + (k : ℝ) := by + let q := Nat.card F.residueField + let filtration := + equalCharacteristicLubinTateLowerRamificationFiltration F n + have hqone : 1 < q := + (Finite.one_lt_card : 1 < Nat.card F.residueField) + have hqpos : 0 < q := Nat.zero_lt_one.trans hqone + revert hkn + induction k with + | zero => + intro _ + simp + | succ k ih => + intro hsucc + have hkn : k ≤ n := by omega + have ihval := ih (by omega : k ≤ n + 1) + let a := q ^ k - 1 + let b := q ^ (k + 1) - q ^ k + have hqpowpos : 1 ≤ q ^ k := + Nat.one_le_iff_ne_zero.mpr + (pow_ne_zero _ (Nat.ne_of_gt hqpos)) + have hqpowle : q ^ k ≤ q ^ (k + 1) := + Nat.pow_le_pow_right hqpos (Nat.le_succ k) + have hdecomp : q ^ (k + 1) - 1 = a + b := by + dsimp [a, b] + omega + have hslope : + ∀ x ∈ Finset.range b, + herbrandSlope + filtration (a + x) = + (q ^ (n + 1 - (k + 1)) : ℕ) / + ((q - 1) * q ^ n : ℕ) := by + intro x hx + apply + equalCharacteristicLubinTateHerbrandSlope_eq_of_pow_interval + F n (k + 1) (a + x) (by omega) hsucc + · change q ^ k ≤ a + x + 1 + dsimp [a] + omega + · change a + x + 1 < q ^ (k + 1) + have hxlt : x < b := Finset.mem_range.mp hx + dsimp [a, b] at * + omega + have hb : b = (q - 1) * q ^ k := by + dsimp [b] + calc + q ^ (k + 1) - q ^ k = q * q ^ k - q ^ k := by + rw [pow_succ, Nat.mul_comm] + _ = (q - 1) * q ^ k := by + rw [Nat.mul_sub_right_distrib] + simp + have hexponent : n + 1 - (k + 1) = n - k := by omega + have hpowSplit : q ^ n = q ^ k * q ^ (n - k) := by + rw [← pow_add] + congr + omega + have hproduct : + b * q ^ (n + 1 - (k + 1)) = (q - 1) * q ^ n := by + rw [hb, hexponent, hpowSplit] + simp [Nat.mul_assoc] + have hdenpos : 0 < (q - 1) * q ^ n := + Nat.mul_pos (Nat.sub_pos_of_lt hqone) (Nat.pow_pos hqpos) + have htail : + (∑ x ∈ Finset.range b, + herbrandSlope + filtration (a + x)) = 1 := by + calc + _ = ∑ _x ∈ Finset.range b, + ((q ^ (n + 1 - (k + 1)) : ℕ) / + ((q - 1) * q ^ n : ℕ) : ℝ) := by + apply Finset.sum_congr rfl + intro x hx + exact hslope x hx + _ = (b : ℝ) * + ((q ^ (n + 1 - (k + 1)) : ℕ) / + ((q - 1) * q ^ n : ℕ) : ℝ) := by + simp + _ = 1 := by + rw [← mul_div_assoc, ← Nat.cast_mul, hproduct, div_self] + exact_mod_cast (Nat.ne_of_gt hdenpos) + change + (∑ i ∈ Finset.range (q ^ (k + 1) - 1), + herbrandSlope + filtration i) = ((k + 1 : ℕ) : ℝ) + rw [hdecomp, Finset.sum_range_add] + change + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandValueNat + filtration a + + (∑ x ∈ Finset.range b, + herbrandSlope + filtration (a + x)) = + ((k + 1 : ℕ) : ℝ) + rw [show a = q ^ k - 1 by rfl, ihval, htail] + norm_num + +/-- The Herbrand function of the chosen equal-characteristic Lubin--Tate +level and its chosen complete discrete valuation. -/ +noncomputable def equalCharacteristicLubinTateHerbrandFunction + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) (s : ℝ) : ℝ := + herbrandFunctionOfUniqueExtension + (base := (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF) + (target := (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF) + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + F n) + s + +/-- The lower endpoints `q^k - 1` map to the integral upper endpoints `k`. +This also includes the harmless endpoint `k = 0`. -/ +theorem equalCharacteristicLubinTateHerbrandFunction_pow_sub_one + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n k : ℕ) (hkn : k ≤ n + 1) : + equalCharacteristicLubinTateHerbrandFunction F n + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) = + (k : ℝ) := by + change + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + (equalCharacteristicLubinTateLowerRamificationFiltration F n) + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) = + (k : ℝ) + rw [ + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_nat] + exact + equalCharacteristicLubinTateHerbrandValueNat_pow_sub_one + F n k hkn + +/-- The actual real upper ramification group of the chosen +equal-characteristic Lubin--Tate level valuation. -/ +noncomputable def equalCharacteristicLubinTateRealUpperRamificationGroup + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) (s : ℝ) : + Subgroup Gal((equalCharacteristicLubinTateLevelField F n)/LaurentSeries F.residueField) := + upperRamificationGroupOfUniqueExtension + (base := (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF) + (target := (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF) + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + F n) + s + +/-- At an integral upper index `k ≤ n + 1`, the actual upper group is the +actual lower group at `q^k - 1`. -/ +theorem + equalCharacteristicLubinTateRealUpperRamificationGroup_nat_eq_lower_pow_sub_one + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n k : ℕ) (hkn : k ≤ n + 1) : + equalCharacteristicLubinTateRealUpperRamificationGroup F n (k : ℝ) = + equalCharacteristicLubinTateRealLowerRamificationGroup F n + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) := by + let : FiniteDimensional (LaurentSeries F.residueField) + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + change + upperRamificationGroupOfUniqueExtension + (base := (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF) + (target := (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF) + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + F n) + (k : ℝ) = + lowerRamificationGroup + (base := (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF) + (target := (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF) + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + F n) + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) + rw [← equalCharacteristicLubinTateHerbrandFunction_pow_sub_one F n k hkn] + exact + upperRamificationGroupOfUniqueExtension_herbrandFunction + (base := (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF) + (target := (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF) + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + F n) + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) + +/-- For `1 ≤ k ≤ n + 1`, the integral upper group has order +`q^(n + 1 - k)`. -/ +theorem equalCharacteristicLubinTateRealUpperRamificationGroup_natCard + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n k : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) : + Nat.card + (equalCharacteristicLubinTateRealUpperRamificationGroup + F n (k : ℝ)) = + Nat.card F.residueField ^ (n + 1 - k) := by + rw [ + equalCharacteristicLubinTateRealUpperRamificationGroup_nat_eq_lower_pow_sub_one + F n k hkn, + equalCharacteristicLubinTateRealLowerRamificationGroup_natCard_pow_sub_one + F n k hk hkn] + +/-- Parameter membership in the integral upper group is equivalent to +vanishing of the first `k` visible coefficients. -/ +theorem + mem_equalCharacteristicLubinTateRealUpperRamificationGroup_nat_iff_coeff_zero + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n k : ℕ) (hkn : k ≤ n + 1) + (a : equalCharacteristicLubinTateUnitParameter F n) : + equalCharacteristicLubinTateUnitParameterToGal F n a ∈ + equalCharacteristicLubinTateRealUpperRamificationGroup + F n (k : ℝ) ↔ + ∀ j < k, + PowerSeries.coeff j + (equalCharacteristicLubinTateUnitParameterSeries F n a - 1) = 0 := by + rw [ + equalCharacteristicLubinTateRealUpperRamificationGroup_nat_eq_lower_pow_sub_one + F n k hkn, + mem_equalCharacteristicLubinTateRealLowerRamificationGroup_pow_sub_one_iff_coeff_zero] + + +end ChosenRamificationTarget + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/DisplacementValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/DisplacementValuation.lean new file mode 100644 index 0000000000..de126c6571 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/DisplacementValuation.lean @@ -0,0 +1,630 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.PrimitivePoint +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PolynomialRootProximity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationKrasner +/-! +# Valuation of primitive-point displacement + +This module computes the normalized additive valuation of the displacement of +the chosen primitive Lubin--Tate point from the first visible coefficient of +the corresponding unit parameter. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries Pointwise PowerSeries + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LubinTate.EqualCharacteristic +open RamificationTheory.HilbertRamification.Higher +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +universe u v y + +variable {K : Type u} [Field K] + +section ChosenRamificationTarget + +variable {K₀ : Type} [Field K₀] + +section PrimitivePointDisplacementValuation + +attribute [local instance] + equalCharacteristicLubinTateLevelField_finiteDimensional_forDisplacementValuation + equalCharacteristicLubinTateLevelField_isGalois_forDisplacementValuation + +private noncomputable def equalCharacteristicLubinTateCoefficientInteger + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) (c : F.residueField) : + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring := + integerMap + (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF + (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF + (equalCharacteristicPowerSeriesEquivLubinTateBaseValuationSubring F + (PowerSeries.C c)) + +@[simp] +private theorem equalCharacteristicLubinTateCoefficientInteger_zero + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicLubinTateCoefficientInteger F n 0 = 0 := by + simp [equalCharacteristicLubinTateCoefficientInteger] + +@[simp] +private theorem equalCharacteristicLubinTateCoefficientInteger_coe + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) (c : F.residueField) : + (equalCharacteristicLubinTateCoefficientInteger F n c : + equalCharacteristicLubinTateLevelField F n) = + algebraMap F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) + (algebraMap F.residueField F.residueField⸨X⸩ c) := by + rfl + +private noncomputable def equalCharacteristicLubinTatePiEndInteger + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) + (x : + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring) : + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring := + x ^ Nat.card F.residueField + + integerMap + (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF + (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF + (equalCharacteristicLubinTateBaseUniformizerInteger F) * x + +@[simp] +private theorem equalCharacteristicLubinTatePiEndInteger_coe + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) + (x : + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring) : + (equalCharacteristicLubinTatePiEndInteger F n x : + equalCharacteristicLubinTateLevelField F n) = + equalCharacteristicLubinTateAmbientPiEnd F + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) + (equalCharacteristicLaurentUniformizer F)) + (x : equalCharacteristicLubinTateLevelField F n) := by + simp [equalCharacteristicLubinTatePiEndInteger, + equalCharacteristicLubinTateAmbientPiEnd_apply, + integerMap_apply, + equalCharacteristicLubinTateBaseUniformizerInteger_coe] + +private noncomputable def equalCharacteristicLubinTatePiIterateInteger + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + ℕ → + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring + | 0 => equalCharacteristicLubinTatePrimitivePointInteger F n + | i + 1 => + equalCharacteristicLubinTatePiEndInteger F n + (equalCharacteristicLubinTatePiIterateInteger F n i) + +private theorem equalCharacteristicLubinTateAmbientPiIterate_succ_left + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n i : ℕ) (x : equalCharacteristicLubinTateLevelField F n) : + equalCharacteristicLubinTateAmbientPiIterate F + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) + (equalCharacteristicLaurentUniformizer F)) + (i + 1) x = + equalCharacteristicLubinTateAmbientPiEnd F + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) + (equalCharacteristicLaurentUniformizer F)) + (equalCharacteristicLubinTateAmbientPiIterate F + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) + (equalCharacteristicLaurentUniformizer F)) + i x) := by + change + ((equalCharacteristicLubinTateAmbientPiEnd F + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) + (equalCharacteristicLaurentUniformizer F))) ^ (i + 1)) x = + equalCharacteristicLubinTateAmbientPiEnd F + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) + (equalCharacteristicLaurentUniformizer F)) + (((equalCharacteristicLubinTateAmbientPiEnd F + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) + (equalCharacteristicLaurentUniformizer F))) ^ i) x) + rw [pow_succ'] + rfl + +@[simp] +private theorem equalCharacteristicLubinTatePiIterateInteger_coe + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n i : ℕ) : + (equalCharacteristicLubinTatePiIterateInteger F n i : + equalCharacteristicLubinTateLevelField F n) = + equalCharacteristicLubinTateAmbientPiIterate F + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) + (equalCharacteristicLaurentUniformizer F)) + i (equalCharacteristicLubinTateLevelPowerBasis F n).gen := by + induction i with + | zero => + simp [equalCharacteristicLubinTatePiIterateInteger] + | succ i ih => + rw [equalCharacteristicLubinTatePiIterateInteger, + equalCharacteristicLubinTatePiEndInteger_coe, ih, + equalCharacteristicLubinTateAmbientPiIterate_succ_left] + +private theorem equalCharacteristicLubinTateCoefficientInteger_isUnit + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) {c : F.residueField} (hc : c ≠ 0) : + IsUnit (equalCharacteristicLubinTateCoefficientInteger F n c) := by + rw [equalCharacteristicLubinTateCoefficientInteger, + integerMap_isUnit_iff] + have hC : IsUnit (PowerSeries.C c : F.residueField⟦X⟧) := by + rw [PowerSeries.isUnit_iff_constantCoeff] + simpa using hc + exact + (equalCharacteristicPowerSeriesEquivLubinTateBaseValuationSubring F).toRingHom.isUnit_map + hC + +private theorem equalCharacteristicLubinTateCoefficientInteger_addVal + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) {c : F.residueField} (hc : c ≠ 0) : + IsDiscreteValuationRing.addVal + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring + (equalCharacteristicLubinTateCoefficientInteger F n c) = 0 := + (IsDiscreteValuationRing.addVal_eq_zero_iff).2 + (equalCharacteristicLubinTateCoefficientInteger_isUnit F n hc) + +private theorem equalCharacteristicLubinTatePiIterateInteger_addVal + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n i : ℕ) (hi : i ≤ n) : + IsDiscreteValuationRing.addVal + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring + (equalCharacteristicLubinTatePiIterateInteger F n i) = + (Nat.card F.residueField ^ i : ℕ) := by + induction i with + | zero => + simpa [equalCharacteristicLubinTatePiIterateInteger] using + equalCharacteristicLubinTatePrimitivePointInteger_addVal F n + | succ i ih => + let target := equalCharacteristicLubinTateLevelCompleteDVF F n + let q := Nat.card F.residueField + let d := (q - 1) * q ^ n + let y := equalCharacteristicLubinTatePiIterateInteger F n i + have hi' : i ≤ n := Nat.le_trans (Nat.le_succ i) hi + have hiy : + IsDiscreteValuationRing.addVal target.valuationSubring y = + (q ^ i : ℕ) := by + exact ih hi' + have hT : + IsDiscreteValuationRing.addVal target.valuationSubring + (integerMap + (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF + target.toDVF + (equalCharacteristicLubinTateBaseUniformizerInteger F)) = + (d : ℕ) := by + exact + equalCharacteristicLubinTateBaseUniformizerInteger_map_addVal_eq_degree + F n + have hpow : + IsDiscreteValuationRing.addVal target.valuationSubring (y ^ q) = + (q ^ (i + 1) : ℕ) := by + rw [IsDiscreteValuationRing.addVal_pow, hiy] + simp [nsmul_eq_mul, pow_succ, Nat.mul_comm] + have hmul : + IsDiscreteValuationRing.addVal target.valuationSubring + (integerMap + (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF + target.toDVF + (equalCharacteristicLubinTateBaseUniformizerInteger F) * + y) = + (d + q ^ i : ℕ) := by + rw [IsDiscreteValuationRing.addVal_mul, hT, hiy] + rfl + have hqone : 1 < q := by + exact (Finite.one_lt_card : 1 < Nat.card F.residueField) + have hqpos : 0 < q := Nat.zero_lt_one.trans hqone + have hpowle : q ^ (i + 1) ≤ q ^ n := + Nat.pow_le_pow_right hqpos hi + have hqsub : 1 ≤ q - 1 := by + omega + have hdegreele : q ^ n ≤ d := by + calc + q ^ n = 1 * q ^ n := by simp + _ ≤ (q - 1) * q ^ n := Nat.mul_le_mul_right (q ^ n) hqsub + have htailpos : 0 < q ^ i := Nat.pow_pos hqpos + have hnatlt : q ^ (i + 1) < d + q ^ i := + hpowle.trans_lt (hdegreele.trans_lt (Nat.lt_add_of_pos_right htailpos)) + have henatlt : (q ^ (i + 1) : ℕ∞) < (d + q ^ i : ℕ) := by + exact_mod_cast hnatlt + have hdistinct : + IsDiscreteValuationRing.addVal target.valuationSubring (y ^ q) ≠ + IsDiscreteValuationRing.addVal target.valuationSubring + (integerMap + (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF + target.toDVF + (equalCharacteristicLubinTateBaseUniformizerInteger F) * + y) := by + rw [hpow, hmul] + exact ne_of_lt henatlt + rw [equalCharacteristicLubinTatePiIterateInteger, + equalCharacteristicLubinTatePiEndInteger] + rw [(IsDiscreteValuationRing.addVal target.valuationSubring).map_add_of_distinct_val + hdistinct, hpow, hmul] + rw [min_eq_left] + exact henatlt.le + +private noncomputable def equalCharacteristicLubinTateBracketInteger + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) (u : F.residueField⟦X⟧) : + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring := + ∑ i ∈ Finset.range (n + 1), + equalCharacteristicLubinTateCoefficientInteger F n + (PowerSeries.coeff i u) * + equalCharacteristicLubinTatePiIterateInteger F n i + +@[simp] +private theorem equalCharacteristicLubinTateBracketInteger_coe + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) (u : F.residueField⟦X⟧) : + (equalCharacteristicLubinTateBracketInteger F n u : + equalCharacteristicLubinTateLevelField F n) = + equalCharacteristicLubinTateAmbientBracket F + ((algebraMap F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n)).comp + (algebraMap F.residueField F.residueField⸨X⸩)) + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) + (equalCharacteristicLaurentUniformizer F)) + (n + 1) u (equalCharacteristicLubinTateLevelPowerBasis F n).gen := by + rw [equalCharacteristicLubinTateBracketInteger, + equalCharacteristicLubinTateAmbientBracket_apply] + change + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuation.valuationSubring.subtype + (∑ i ∈ Finset.range (n + 1), + equalCharacteristicLubinTateCoefficientInteger F n + (PowerSeries.coeff i u) * + equalCharacteristicLubinTatePiIterateInteger F n i) = + _ + rw [map_sum] + apply Finset.sum_congr rfl + intro i hi + rw [map_mul] + change + (equalCharacteristicLubinTateCoefficientInteger F n + (PowerSeries.coeff i u) : + equalCharacteristicLubinTateLevelField F n) * + (equalCharacteristicLubinTatePiIterateInteger F n i : + equalCharacteristicLubinTateLevelField F n) = + _ + rw [equalCharacteristicLubinTateCoefficientInteger_coe, + equalCharacteristicLubinTatePiIterateInteger_coe] + rfl + +private theorem natCast_lt_addVal_finsetSum_of_forall_lt + {R I : Type*} [CommRing R] [IsDomain R] [IsDiscreteValuationRing R] + (c : ℕ) (s : Finset I) (f : I → R) + (h : ∀ i ∈ s, + (c : ℕ∞) < IsDiscreteValuationRing.addVal R (f i)) : + (c : ℕ∞) < + IsDiscreteValuationRing.addVal R (∑ i ∈ s, f i) := by + classical + induction s using Finset.induction_on with + | empty => simp + | @insert i s hi ih => + rw [Finset.sum_insert hi] + have hmin : + (c : ℕ∞) < + min + (IsDiscreteValuationRing.addVal R (f i)) + (IsDiscreteValuationRing.addVal R (∑ j ∈ s, f j)) := + lt_min (h i (Finset.mem_insert_self i s)) + (ih fun j hj => h j (Finset.mem_insert_of_mem hj)) + exact hmin.trans_le IsDiscreteValuationRing.addVal_add + +private theorem equalCharacteristicLubinTateBracketInteger_addVal_eq_order + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) (u : F.residueField⟦X⟧) + (hu : u ≠ 0) (hk : u.order.toNat ≤ n) : + IsDiscreteValuationRing.addVal + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring + (equalCharacteristicLubinTateBracketInteger F n u) = + (Nat.card F.residueField ^ u.order.toNat : ℕ) := by + classical + let target := equalCharacteristicLubinTateLevelCompleteDVF F n + let q := Nat.card F.residueField + let k := u.order.toNat + let term : + ℕ → target.valuationSubring := fun i => + equalCharacteristicLubinTateCoefficientInteger F n + (PowerSeries.coeff i u) * + equalCharacteristicLubinTatePiIterateInteger F n i + let s := Finset.range (n + 1) + have hk_mem : k ∈ s := by + simpa [s, k] using hk + have hkcoeff : PowerSeries.coeff k u ≠ 0 := by + exact PowerSeries.coeff_order hu + have hterm : + IsDiscreteValuationRing.addVal target.valuationSubring (term k) = + (q ^ k : ℕ) := by + change + IsDiscreteValuationRing.addVal target.valuationSubring + (equalCharacteristicLubinTateCoefficientInteger F n + (PowerSeries.coeff k u) * + equalCharacteristicLubinTatePiIterateInteger F n k) = + _ + rw [IsDiscreteValuationRing.addVal_mul, + equalCharacteristicLubinTateCoefficientInteger_addVal F n hkcoeff, + equalCharacteristicLubinTatePiIterateInteger_addVal F n k hk, + zero_add] + have hqone : 1 < q := by + exact (Finite.one_lt_card : 1 < Nat.card F.residueField) + have htailTerm : + ∀ i ∈ s.erase k, + (q ^ k : ℕ∞) < + IsDiscreteValuationRing.addVal target.valuationSubring (term i) := by + intro i hi + have his : i ∈ s := (Finset.mem_erase.mp hi).2 + have hine : i ≠ k := (Finset.mem_erase.mp hi).1 + have hin : i ≤ n := by + simpa [s, Nat.lt_succ_iff] using his + rcases lt_or_gt_of_ne hine with hik | hki + · have hcoeffzero : PowerSeries.coeff i u = 0 := by + exact PowerSeries.coeff_of_lt_order_toNat i (by simpa [k] using hik) + simp [term, hcoeffzero] + · by_cases hcoeffzero : PowerSeries.coeff i u = 0 + · simp [term, hcoeffzero] + · have hpowlt : q ^ k < q ^ i := + Nat.pow_lt_pow_right hqone hki + change + (q ^ k : ℕ∞) < + IsDiscreteValuationRing.addVal target.valuationSubring + (equalCharacteristicLubinTateCoefficientInteger F n + (PowerSeries.coeff i u) * + equalCharacteristicLubinTatePiIterateInteger F n i) + rw [IsDiscreteValuationRing.addVal_mul, + equalCharacteristicLubinTateCoefficientInteger_addVal F n hcoeffzero, + equalCharacteristicLubinTatePiIterateInteger_addVal F n i hin, + zero_add] + exact_mod_cast hpowlt + have htail : + (q ^ k : ℕ∞) < + IsDiscreteValuationRing.addVal target.valuationSubring + (∑ i ∈ s.erase k, term i) := + natCast_lt_addVal_finsetSum_of_forall_lt + (q ^ k) (s.erase k) term htailTerm + have hdistinct : + IsDiscreteValuationRing.addVal target.valuationSubring (term k) ≠ + IsDiscreteValuationRing.addVal target.valuationSubring + (∑ i ∈ s.erase k, term i) := by + rw [hterm] + exact ne_of_lt htail + rw [equalCharacteristicLubinTateBracketInteger] + change + IsDiscreteValuationRing.addVal target.valuationSubring + (∑ i ∈ s, term i) = _ + rw [← Finset.add_sum_erase s term hk_mem] + rw [(IsDiscreteValuationRing.addVal target.valuationSubring).map_add_of_distinct_val + hdistinct, hterm] + rw [min_eq_left] + exact htail.le + +/-- The first nonzero coefficient of a nontrivial visible parameter occurs +at an index at most `n`. -/ +theorem equalCharacteristicLubinTateUnitParameterSeries_sub_one_order_toNat_le + (F : LocalField.{0, v} K₀) + (n : ℕ) (a : equalCharacteristicLubinTateUnitParameter F n) + (hu : equalCharacteristicLubinTateUnitParameterSeries F n a - 1 ≠ 0) : + (equalCharacteristicLubinTateUnitParameterSeries F n a - 1).order.toNat ≤ + n := by + let u := equalCharacteristicLubinTateUnitParameterSeries F n a - 1 + let k := u.order.toNat + have hkcoeff : PowerSeries.coeff k u ≠ 0 := + PowerSeries.coeff_order hu + by_contra hk + have hnk : n < k := Nat.lt_of_not_ge hk + have hk0 : k ≠ 0 := by omega + have hklarge : ¬ k - 1 < n := by omega + apply hkcoeff + simp [u, equalCharacteristicLubinTateUnitParameterSeries, hk0, hklarge] + +private theorem equalCharacteristicLubinTateBracketInteger_coe_eq_aeval + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) (u : F.residueField⟦X⟧) : + (equalCharacteristicLubinTateBracketInteger F n u : + equalCharacteristicLubinTateLevelField F n) = + Polynomial.aeval (equalCharacteristicLubinTateLevelPowerBasis F n).gen + (equalCharacteristicLubinTateBracketPolynomial F (n + 1) u) := by + rw [equalCharacteristicLubinTateBracketInteger_coe] + symm + change + Polynomial.eval₂ + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n)) + (equalCharacteristicLubinTateLevelPowerBasis F n).gen + (equalCharacteristicLubinTateBracketPolynomial F (n + 1) u) = + _ + exact + equalCharacteristicLubinTateBracketPolynomial_eval₂ F + (algebraMap F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n)) + (n + 1) u (equalCharacteristicLubinTateLevelPowerBasis F n).gen + +private theorem + equalCharacteristicLubinTatePrimitivePointInteger_displacement_eq_bracketInteger + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) + (sigma : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) + (a : equalCharacteristicLubinTateUnitParameter F n) + (ha : + sigma (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (equalCharacteristicLubinTateLevelPowerBasis F n).gen) : + valuationSubringAutOfUniqueExtension + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + F n) + sigma (equalCharacteristicLubinTatePrimitivePointInteger F n) - + equalCharacteristicLubinTatePrimitivePointInteger F n = + equalCharacteristicLubinTateBracketInteger F n + (equalCharacteristicLubinTateUnitParameterSeries F n a - 1) := by + apply Subtype.ext + rw [ + equalCharacteristicLubinTatePrimitivePointInteger_displacement_coe_eq_aeval + F n sigma a ha, + equalCharacteristicLubinTateBracketInteger_coe_eq_aeval] + +private theorem + equalCharacteristicLubinTatePrimitivePointInteger_displacement_addVal + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) + (sigma : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) + (a : equalCharacteristicLubinTateUnitParameter F n) + (ha : + sigma (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (equalCharacteristicLubinTateLevelPowerBasis F n).gen) + (hu : equalCharacteristicLubinTateUnitParameterSeries F n a - 1 ≠ 0) : + IsDiscreteValuationRing.addVal + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring + (valuationSubringAutOfUniqueExtension + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + F n) + sigma (equalCharacteristicLubinTatePrimitivePointInteger F n) - + equalCharacteristicLubinTatePrimitivePointInteger F n) = + (Nat.card F.residueField ^ + (equalCharacteristicLubinTateUnitParameterSeries F n a - 1).order.toNat : + ℕ) := by + rw [ + equalCharacteristicLubinTatePrimitivePointInteger_displacement_eq_bracketInteger + F n sigma a ha] + exact + equalCharacteristicLubinTateBracketInteger_addVal_eq_order F n + (equalCharacteristicLubinTateUnitParameterSeries F n a - 1) hu + (equalCharacteristicLubinTateUnitParameterSeries_sub_one_order_toNat_le + F n a hu) + +/-- A nonidentity automorphism has a genuinely nonzero visible coefficient +difference from the identity parameter. -/ +theorem + equalCharacteristicLubinTateUnitParameterSeries_sub_one_ne_zero_of_sigma_ne_one + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) + (sigma : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) + (a : equalCharacteristicLubinTateUnitParameter F n) + (ha : + sigma (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (equalCharacteristicLubinTateLevelPowerBasis F n).gen) + (hsigma : sigma ≠ 1) : + equalCharacteristicLubinTateUnitParameterSeries F n a - 1 ≠ 0 := by + intro hu + apply hsigma + have hseries : + equalCharacteristicLubinTateUnitParameterSeries F n a = 1 := + sub_eq_zero.mp hu + have hone : + equalCharacteristicLubinTateLevelBracket F n (n + 1) 1 + (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + (equalCharacteristicLubinTateLevelPowerBasis F n).gen := by + apply Subtype.ext + change + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) 1 + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) = + chosenEqualCharacteristicLubinTatePrimitiveRoot F n + exact + equalCharacteristicLubinTateAmbientBracket_one_apply_of_torsion F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) + (chosenEqualCharacteristicLubinTatePrimitiveRoot_torsion F n) + apply AlgEquiv.coe_toAlgHom_injective + apply (equalCharacteristicLubinTateLevelPowerBasis F n).algHom_ext + change + sigma (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + (equalCharacteristicLubinTateLevelPowerBasis F n).gen + calc + sigma (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (equalCharacteristicLubinTateLevelPowerBasis F n).gen := ha + _ = equalCharacteristicLubinTateLevelBracket F n (n + 1) 1 + (equalCharacteristicLubinTateLevelPowerBasis F n).gen := by + rw [hseries] + _ = (equalCharacteristicLubinTateLevelPowerBasis F n).gen := hone + +/-- If `k` is the first visible coefficient where a nonidentity Galois +parameter differs from `1`, then its displacement of the primitive +uniformizer has normalized additive valuation exactly `q^k`. -/ +theorem + equalCharacteristicLubinTatePrimitivePointInteger_displacement_addVal_of_ne_one + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) + (sigma : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) + (a : equalCharacteristicLubinTateUnitParameter F n) + (ha : + sigma (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (equalCharacteristicLubinTateLevelPowerBasis F n).gen) + (hsigma : sigma ≠ 1) : + IsDiscreteValuationRing.addVal + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring + (valuationSubringAutOfUniqueExtension + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + F n) + sigma (equalCharacteristicLubinTatePrimitivePointInteger F n) - + equalCharacteristicLubinTatePrimitivePointInteger F n) = + (Nat.card F.residueField ^ + (equalCharacteristicLubinTateUnitParameterSeries F n a - 1).order.toNat : + ℕ) := by + exact + equalCharacteristicLubinTatePrimitivePointInteger_displacement_addVal + F n sigma a ha + (equalCharacteristicLubinTateUnitParameterSeries_sub_one_ne_zero_of_sigma_ne_one + F n sigma a ha hsigma) + +end PrimitivePointDisplacementValuation + + +end ChosenRamificationTarget + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/GaloisAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/GaloisAction.lean new file mode 100644 index 0000000000..2486cb3c74 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/GaloisAction.lean @@ -0,0 +1,75 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic +/-! +# Galois action at an equal-characteristic Lubin--Tate level + +This module identifies the action of every finite-level Galois automorphism on +the chosen primitive division point with the corresponding truncated +Lubin--Tate bracket. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LubinTate.EqualCharacteristic + +universe u v + +variable {K : Type u} [Field K] + +/-- Equal-characteristic Lubin--Tate action frontier: every automorphism of +the explicit level-`n+1` field acts on +the primitive generator through a unique visible unit-parameter bracket. -/ +theorem equalCharacteristicLubinTate_galoisAction_eq_bracket_unique + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) + (σ : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) : + ∃! a : equalCharacteristicLubinTateUnitParameter F n, + σ (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (equalCharacteristicLubinTateLevelPowerBasis F n).gen := by + obtain ⟨a, hσ⟩ := + equalCharacteristicLubinTateLevelField_exists_unitParameter F n σ + have ha : + σ (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (equalCharacteristicLubinTateLevelPowerBasis F n).gen := by + calc + σ (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + equalCharacteristicLubinTateUnitParameterAlgEquiv F n a + (equalCharacteristicLubinTateLevelPowerBasis F n).gen := by + rw [hσ] + _ = equalCharacteristicLubinTateUnitParameterLevelRoot F n a := + equalCharacteristicLubinTateUnitParameterAlgEquiv_apply_gen F n a + _ = equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (equalCharacteristicLubinTateLevelPowerBasis F n).gen := + (equalCharacteristicLubinTateLevelBracket_gen F n a).symm + refine ⟨a, ha, ?_⟩ + intro b hb + apply equalCharacteristicLubinTateUnitParameterLevelRoot_injective F n + rw [← equalCharacteristicLubinTateLevelBracket_gen F n b, + ← equalCharacteristicLubinTateLevelBracket_gen F n a] + exact hb.symm.trans ha + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/LowerGroups.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/LowerGroups.lean new file mode 100644 index 0000000000..b0f87f2b5e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/LowerGroups.lean @@ -0,0 +1,756 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.DisplacementValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumber +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal +/-! +# Lower ramification groups of equal-characteristic Lubin--Tate levels + +This module identifies the actual lower ramification groups attached to the +chosen complete valuation, both by visible unit-parameter coefficients and by +their exact cardinalities. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries Pointwise PowerSeries + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LubinTate.EqualCharacteristic +open RamificationTheory.HilbertRamification.Higher +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +universe u v y + +variable {K : Type u} [Field K] + +section ChosenRamificationTarget + +variable {K₀ : Type} [Field K₀] + +/-- The actual real lower ramification group of the explicit +equal-characteristic Lubin--Tate level, formed from the chosen +integral-closure valuation. -/ +noncomputable def equalCharacteristicLubinTateRealLowerRamificationGroup + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) (s : ℝ) : + Subgroup Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩) := + RamificationTheory.HilbertRamification.Higher.lowerRamificationGroup + (base := (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF) + (target := (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF) + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + F n) + s + +/-- Finite-dimensionality for the explicit level while computing its lower +ramification groups. -/ +noncomputable local instance + equalCharacteristicLubinTateLevelField_finiteDimensional_forLowerGroups + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + FiniteDimensional F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + +/-- Galoisness for the explicit level while computing its lower +ramification groups. -/ +noncomputable local instance + equalCharacteristicLubinTateLevelField_isGalois_forLowerGroups + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + IsGalois F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_isGalois F n + +/-- At a natural lower index, membership in the actual Lubin--Tate lower +ramification group is detected by the displacement of its primitive +uniformizer alone. -/ +theorem + mem_equalCharacteristicLubinTateRealLowerRamificationGroup_nat_iff_primitivePoint + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n i : ℕ) + (sigma : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) : + sigma ∈ equalCharacteristicLubinTateRealLowerRamificationGroup + F n (i : ℝ) ↔ + ((i + 1 : ℕ) : ℕ∞) ≤ + IsDiscreteValuationRing.addVal + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring + (valuationSubringAutOfUniqueExtension + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + F n) + sigma (equalCharacteristicLubinTatePrimitivePointInteger F n) - + equalCharacteristicLubinTatePrimitivePointInteger F n) := by + change + sigma ∈ lowerRamificationGroup + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + F n) (i : ℝ) ↔ _ + constructor + · intro hsigma + have hall := + (mem_lowerRamificationGroup_nat_iff + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + F n) + i sigma).mp hsigma + exact + (IsDiscreteValuationRing.mem_maximalIdeal_pow_iff_addVal_ge + (valuationSubringAutOfUniqueExtension + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + F n) + sigma (equalCharacteristicLubinTatePrimitivePointInteger F n) - + equalCharacteristicLubinTatePrimitivePointInteger F n) + (i + 1)).mp + (hall (equalCharacteristicLubinTatePrimitivePointInteger F n)) + · intro hdisplacement + apply + (mem_lowerRamificationGroup_nat_iff + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + F n) + i sigma).mpr + intro z + apply + valuationSubringAutOfUniqueExtension_sub_mem_of_mem_adjoin + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + F n) + · exact + (IsDiscreteValuationRing.mem_maximalIdeal_pow_iff_addVal_ge + (valuationSubringAutOfUniqueExtension + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + F n) + sigma (equalCharacteristicLubinTatePrimitivePointInteger F n) - + equalCharacteristicLubinTatePrimitivePointInteger F n) + (i + 1)).mpr hdisplacement + · exact + (equalCharacteristicLubinTatePrimitivePointInteger_adjoin_eq_top + F n).symm.le + (show z ∈ + (⊤ : Subalgebra + (equalCharacteristicLubinTateBaseCompleteDVF F).valuationSubring + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring) from + by simp) + +/-- Elementwise lower-ramification form: if a nonidentity +automorphism first differs from the identity unit parameter in degree `k`, +then it belongs to the natural lower group `G_i` exactly when +`i + 1 ≤ q^k`. -/ +theorem + mem_equalCharacteristicLubinTateRealLowerRamificationGroup_nat_iff_parameterPower_of_ne_one + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n i : ℕ) + (sigma : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) + (a : equalCharacteristicLubinTateUnitParameter F n) + (ha : + sigma (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (equalCharacteristicLubinTateLevelPowerBasis F n).gen) + (hsigma : sigma ≠ 1) : + sigma ∈ equalCharacteristicLubinTateRealLowerRamificationGroup + F n (i : ℝ) ↔ + ((i + 1 : ℕ) : ℕ∞) ≤ + (Nat.card F.residueField ^ + (equalCharacteristicLubinTateUnitParameterSeries F n a - 1).order.toNat : + ℕ) := by + rw [ + mem_equalCharacteristicLubinTateRealLowerRamificationGroup_nat_iff_primitivePoint] + rw [ + equalCharacteristicLubinTatePrimitivePointInteger_displacement_addVal_of_ne_one + F n sigma a ha hsigma] + +/-- The explicit finite unit-parameter bijection with the Galois group of the +chosen equal-characteristic Lubin--Tate level. -/ +noncomputable def equalCharacteristicLubinTateUnitParameterEquivGal + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicLubinTateUnitParameter F n ≃ + Gal((equalCharacteristicLubinTateLevelField F n)/LaurentSeries F.residueField) := + Equiv.ofBijective + (equalCharacteristicLubinTateUnitParameterToGal F n) + ⟨equalCharacteristicLubinTateUnitParameterToGal_injective F n, + equalCharacteristicLubinTateUnitParameterToGal_surjective F n⟩ + +@[simp] +theorem equalCharacteristicLubinTateUnitParameterEquivGal_apply + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (a : equalCharacteristicLubinTateUnitParameter F n) : + equalCharacteristicLubinTateUnitParameterEquivGal F n a = + equalCharacteristicLubinTateUnitParameterToGal F n a := + rfl + +/-- For the automorphism attached to a finite unit parameter, membership in a +natural lower group is the parameter-power inequality, with the identity case +included explicitly and no side hypotheses. -/ +theorem mem_equalCharacteristicLubinTateRealLowerRamificationGroup_nat_iff_parameterPower + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n i : ℕ) + (a : equalCharacteristicLubinTateUnitParameter F n) : + equalCharacteristicLubinTateUnitParameterToGal F n a ∈ + equalCharacteristicLubinTateRealLowerRamificationGroup F n (i : ℝ) ↔ + equalCharacteristicLubinTateUnitParameterToGal F n a = 1 ∨ + ((i + 1 : ℕ) : ℕ∞) ≤ + (Nat.card F.residueField ^ + (equalCharacteristicLubinTateUnitParameterSeries F n a - 1).order.toNat : + ℕ) := by + let sigma := + equalCharacteristicLubinTateUnitParameterToGal F n a + have ha : + sigma (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (equalCharacteristicLubinTateLevelPowerBasis F n).gen := by + calc + sigma (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + equalCharacteristicLubinTateUnitParameterLevelRoot F n a := by + exact equalCharacteristicLubinTateUnitParameterAlgEquiv_apply_gen F n a + _ = equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (equalCharacteristicLubinTateLevelPowerBasis F n).gen := + (equalCharacteristicLubinTateLevelBracket_gen F n a).symm + by_cases hsigma : sigma = 1 + · constructor + · exact fun _ => Or.inl hsigma + · intro _ + simp [sigma, hsigma] + · rw [ + mem_equalCharacteristicLubinTateRealLowerRamificationGroup_nat_iff_parameterPower_of_ne_one + F n i sigma a ha hsigma] + change _ ↔ sigma = 1 ∨ _ + exact (or_iff_right hsigma).symm + +private def equalCharacteristicLubinTateOneUnitParameter + (F : LocalField.{u, v} K) (n : ℕ) : + equalCharacteristicLubinTateUnitParameter F n := + equalCharacteristicLubinTateUnitParameterOfCoefficients F n 1 (fun _ => 0) + +@[simp] +private theorem equalCharacteristicLubinTateOneUnitParameterSeries + (F : LocalField.{u, v} K) (n : ℕ) : + equalCharacteristicLubinTateUnitParameterSeries F n + (equalCharacteristicLubinTateOneUnitParameter F n) = 1 := by + ext i + cases i with + | zero => + simp [equalCharacteristicLubinTateOneUnitParameter, + equalCharacteristicLubinTateUnitParameterOfCoefficients] + | succ i => + by_cases hi : i < n + · let j : Fin n := ⟨i, hi⟩ + simpa [j, equalCharacteristicLubinTateOneUnitParameter, + equalCharacteristicLubinTateUnitParameterOfCoefficients] using + equalCharacteristicLubinTateUnitParameterSeries_coeff_succ + F n (equalCharacteristicLubinTateOneUnitParameter F n) j + · simp [equalCharacteristicLubinTateUnitParameterSeries, + equalCharacteristicLubinTateOneUnitParameter, + equalCharacteristicLubinTateUnitParameterOfCoefficients] + +@[simp] +private theorem equalCharacteristicLubinTateOneUnitParameterToGal + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + equalCharacteristicLubinTateUnitParameterToGal F n + (equalCharacteristicLubinTateOneUnitParameter F n) = 1 := by + let a := equalCharacteristicLubinTateOneUnitParameter F n + let sigma := equalCharacteristicLubinTateUnitParameterToGal F n a + have ha : + sigma (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (equalCharacteristicLubinTateLevelPowerBasis F n).gen := by + calc + sigma (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + equalCharacteristicLubinTateUnitParameterLevelRoot F n a := by + exact equalCharacteristicLubinTateUnitParameterAlgEquiv_apply_gen F n a + _ = equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (equalCharacteristicLubinTateLevelPowerBasis F n).gen := + (equalCharacteristicLubinTateLevelBracket_gen F n a).symm + by_contra hsigma + have hne := + equalCharacteristicLubinTateUnitParameterSeries_sub_one_ne_zero_of_sigma_ne_one + F n sigma a ha hsigma + apply hne + simp [a, equalCharacteristicLubinTateOneUnitParameterSeries] + +private theorem equalCharacteristicLubinTateUnitParameterToGal_eq_one_iff + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) + (a : equalCharacteristicLubinTateUnitParameter F n) : + equalCharacteristicLubinTateUnitParameterToGal F n a = 1 ↔ + a = equalCharacteristicLubinTateOneUnitParameter F n := by + constructor + · intro ha + apply equalCharacteristicLubinTateUnitParameterToGal_injective F n + rw [ha, equalCharacteristicLubinTateOneUnitParameterToGal] + · rintro rfl + exact equalCharacteristicLubinTateOneUnitParameterToGal F n + +@[simp] +private theorem equalCharacteristicLubinTateUnitParameterSeries_sub_one_eq_zero_iff + (F : LocalField.{u, v} K) + (n : ℕ) + (a : equalCharacteristicLubinTateUnitParameter F n) : + equalCharacteristicLubinTateUnitParameterSeries F n a - 1 = 0 ↔ + a = equalCharacteristicLubinTateOneUnitParameter F n := by + constructor + · intro ha + have hseries : + equalCharacteristicLubinTateUnitParameterSeries F n a = 1 := + sub_eq_zero.mp ha + apply equalCharacteristicLubinTateUnitParameter_eq_of_coeff_eq F n + intro i hi + rw [hseries, equalCharacteristicLubinTateOneUnitParameterSeries] + · rintro rfl + rw [equalCharacteristicLubinTateOneUnitParameterSeries, sub_self] + +/-- At the lower endpoint `q^k - 1`, membership is equivalent to vanishing of +the first `k` coefficients of the visible difference from the identity. -/ +theorem mem_equalCharacteristicLubinTateRealLowerRamificationGroup_pow_sub_one_iff_coeff_zero + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n k : ℕ) + (a : equalCharacteristicLubinTateUnitParameter F n) : + equalCharacteristicLubinTateUnitParameterToGal F n a ∈ + equalCharacteristicLubinTateRealLowerRamificationGroup F n + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) ↔ + ∀ j < k, + PowerSeries.coeff j + (equalCharacteristicLubinTateUnitParameterSeries F n a - 1) = 0 := by + let q := Nat.card F.residueField + let u := equalCharacteristicLubinTateUnitParameterSeries F n a - 1 + have hqone : 1 < q := + (Finite.one_lt_card : 1 < Nat.card F.residueField) + have hqpos : 0 < q := Nat.zero_lt_one.trans hqone + have hqpow : 1 ≤ q ^ k := by + exact Nat.one_le_iff_ne_zero.mpr (pow_ne_zero _ (Nat.ne_of_gt hqpos)) + rw [ + mem_equalCharacteristicLubinTateRealLowerRamificationGroup_nat_iff_parameterPower, + Nat.sub_add_cancel hqpow] + change + equalCharacteristicLubinTateUnitParameterToGal F n a = 1 ∨ + ((q ^ k : ℕ) : ℕ∞) ≤ ((q ^ u.order.toNat : ℕ) : ℕ∞) ↔ + ∀ j < k, PowerSeries.coeff j u = 0 + constructor + · rintro (hsigma | hpow) + · have ha : + a = equalCharacteristicLubinTateOneUnitParameter F n := + (equalCharacteristicLubinTateUnitParameterToGal_eq_one_iff + F n a).mp hsigma + subst a + simp [u, equalCharacteristicLubinTateOneUnitParameterSeries] + · intro j hj + have hpowNat : q ^ k ≤ q ^ u.order.toNat := by + exact_mod_cast hpow + have hkorder : k ≤ u.order.toNat := by + by_contra hk + have horderlt : u.order.toNat < k := Nat.lt_of_not_ge hk + have hp := + Nat.pow_lt_pow_right hqone horderlt + omega + exact + PowerSeries.coeff_of_lt_order_toNat j + (lt_of_lt_of_le hj hkorder) + · intro hcoeff + by_cases ha : + a = equalCharacteristicLubinTateOneUnitParameter F n + · left + exact + (equalCharacteristicLubinTateUnitParameterToGal_eq_one_iff + F n a).mpr ha + · right + have hu : u ≠ 0 := by + intro hu + apply ha + exact + (equalCharacteristicLubinTateUnitParameterSeries_sub_one_eq_zero_iff + F n a).mp hu + have horder : (k : ℕ∞) ≤ u.order := + PowerSeries.nat_le_order u k hcoeff + have hordertop : u.order ≠ ⊤ := by + intro htop + exact hu (PowerSeries.order_eq_top.mp htop) + have hcoe : ((u.order.toNat : ℕ) : ℕ∞) = u.order := + ENat.natCast_toNat hordertop + have hkorder : k ≤ u.order.toNat := by + rw [← hcoe] at horder + exact_mod_cast horder + have hpowNat : q ^ k ≤ q ^ u.order.toNat := + Nat.pow_le_pow_right hqpos hkorder + exact_mod_cast hpowNat + +private def equalCharacteristicLubinTateUnitParameterVanishesBefore + (F : LocalField.{u, v} K) (n k : ℕ) + (a : equalCharacteristicLubinTateUnitParameter F n) : Prop := + a.constantUnit = 1 ∧ + ∀ i : Fin n, i.val + 1 < k → a.higherCoeff i = 0 + +private theorem equalCharacteristicLubinTateUnitParameter_coeff_zero_iff_vanishesBefore + (F : LocalField.{u, v} K) + (n k : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) + (a : equalCharacteristicLubinTateUnitParameter F n) : + (∀ j < k, + PowerSeries.coeff j + (equalCharacteristicLubinTateUnitParameterSeries F n a - 1) = 0) ↔ + equalCharacteristicLubinTateUnitParameterVanishesBefore + F n k a := by + constructor + · intro hcoeff + constructor + · apply Units.ext + have hzero := hcoeff 0 hk + rw [map_sub] at hzero + have hconstant : + (a.constantUnit : F.residueField) = 1 := by + simpa only [ + equalCharacteristicLubinTateUnitParameterSeries_coeff_zero, + PowerSeries.coeff_one, ite_eq_left] using sub_eq_zero.mp hzero + exact hconstant + · intro i hi + have hcoeffi := hcoeff (i.val + 1) hi + rw [map_sub, + equalCharacteristicLubinTateUnitParameterSeries_coeff_succ, + PowerSeries.coeff_one, ite_eq_right (Nat.succ_ne_zero i.val)] at hcoeffi + simpa using hcoeffi + · rintro ⟨hconstant, hhigher⟩ j hj + cases j with + | zero => + rw [map_sub, + equalCharacteristicLubinTateUnitParameterSeries_coeff_zero, + PowerSeries.coeff_one, ite_eq_left rfl, hconstant] + simp + | succ j => + have hjn : j < n := by omega + let i : Fin n := ⟨j, hjn⟩ + have hi : i.val + 1 < k := by simpa [i] using hj + have hz := hhigher i hi + rw [map_sub] + change + PowerSeries.coeff (i.val + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) - + PowerSeries.coeff (i.val + 1) 1 = 0 + rw [equalCharacteristicLubinTateUnitParameterSeries_coeff_succ, + PowerSeries.coeff_one, ite_eq_right (Nat.succ_ne_zero j)] + simpa [i] using hz + +private def equalCharacteristicLubinTateTailIndex + (n k : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) + (j : Fin (n + 1 - k)) : Fin n := + ⟨k - 1 + j.val, by omega⟩ + +private def equalCharacteristicLubinTateTailOffset + (n k : ℕ) (_hk : 1 ≤ k) (hkn : k ≤ n + 1) + (i : Fin n) (hi : k ≤ i.val + 1) : Fin (n + 1 - k) := + ⟨i.val + 1 - k, by omega⟩ + +private theorem equalCharacteristicLubinTateTailIndex_offset + (n k : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) + (i : Fin n) (hi : k ≤ i.val + 1) : + equalCharacteristicLubinTateTailIndex n k hk hkn + (equalCharacteristicLubinTateTailOffset n k hk hkn i hi) = i := by + apply Fin.ext + simp [equalCharacteristicLubinTateTailIndex, + equalCharacteristicLubinTateTailOffset] + omega + +private theorem equalCharacteristicLubinTateTailOffset_index + (n k : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) + (j : Fin (n + 1 - k)) : + equalCharacteristicLubinTateTailOffset n k hk hkn + (equalCharacteristicLubinTateTailIndex n k hk hkn j) + (by + simp [equalCharacteristicLubinTateTailIndex] + omega) = j := by + apply Fin.ext + simp [equalCharacteristicLubinTateTailIndex, + equalCharacteristicLubinTateTailOffset] + omega + +private def equalCharacteristicLubinTateUnitParameterVanishesBeforeEquiv + (F : LocalField.{u, v} K) + (n k : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) : + {a : equalCharacteristicLubinTateUnitParameter F n // + equalCharacteristicLubinTateUnitParameterVanishesBefore + F n k a} ≃ + (Fin (n + 1 - k) → F.residueField) where + toFun a j := + a.1.higherCoeff + (equalCharacteristicLubinTateTailIndex n k hk hkn j) + invFun g := + ⟨equalCharacteristicLubinTateUnitParameterOfCoefficients F n 1 + (fun i => + if hi : k ≤ i.val + 1 then + g (equalCharacteristicLubinTateTailOffset + n k hk hkn i hi) + else 0), + by + constructor + · rfl + · intro i hi + simp [equalCharacteristicLubinTateUnitParameterOfCoefficients, + not_le.mpr hi]⟩ + left_inv a := by + apply Subtype.ext + apply equalCharacteristicLubinTateUnitParameter_ext F n + · change 1 = a.1.constantUnit + exact a.2.1.symm + · funext i + by_cases hi : k ≤ i.val + 1 + · change + (if h : k ≤ i.val + 1 then + a.1.higherCoeff + (equalCharacteristicLubinTateTailIndex n k hk hkn + (equalCharacteristicLubinTateTailOffset + n k hk hkn i h)) + else 0) = + a.1.higherCoeff i + rw [dite_eq_left hi, + equalCharacteristicLubinTateTailIndex_offset + n k hk hkn i] + · change + (if h : k ≤ i.val + 1 then + a.1.higherCoeff + (equalCharacteristicLubinTateTailIndex n k hk hkn + (equalCharacteristicLubinTateTailOffset + n k hk hkn i h)) + else 0) = + a.1.higherCoeff i + rw [dite_eq_right hi] + exact (a.2.2 i (Nat.lt_of_not_ge hi)).symm + right_inv g := by + funext j + change + (if hi : + k ≤ + (equalCharacteristicLubinTateTailIndex + n k hk hkn j).val + 1 then + g (equalCharacteristicLubinTateTailOffset n k hk hkn + (equalCharacteristicLubinTateTailIndex + n k hk hkn j) hi) + else 0) = g j + have hi : + k ≤ + (equalCharacteristicLubinTateTailIndex + n k hk hkn j).val + 1 := by + simp [equalCharacteristicLubinTateTailIndex] + omega + rw [dite_eq_left hi, + equalCharacteristicLubinTateTailOffset_index n k hk hkn j] + +private theorem equalCharacteristicLubinTateUnitParameterVanishesBefore_natCard + (F : LocalField.{u, v} K) + (n k : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) : + Nat.card + {a : equalCharacteristicLubinTateUnitParameter F n // + equalCharacteristicLubinTateUnitParameterVanishesBefore + F n k a} = + Nat.card F.residueField ^ (n + 1 - k) := by + rw [Nat.card_congr + (equalCharacteristicLubinTateUnitParameterVanishesBeforeEquiv + F n k hk hkn), + Nat.card_fun, Nat.card_fin] + +private noncomputable def + equalCharacteristicLubinTateRealLowerRamificationGroupEquivVanishesBefore + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n k : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) : + equalCharacteristicLubinTateRealLowerRamificationGroup F n + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) ≃ + {a : equalCharacteristicLubinTateUnitParameter F n // + equalCharacteristicLubinTateUnitParameterVanishesBefore + F n k a} where + toFun sigma := by + let e := equalCharacteristicLubinTateUnitParameterEquivGal F n + let a := e.symm sigma.1 + refine ⟨a, ?_⟩ + apply + (equalCharacteristicLubinTateUnitParameter_coeff_zero_iff_vanishesBefore + F n k hk hkn a).mp + apply + (mem_equalCharacteristicLubinTateRealLowerRamificationGroup_pow_sub_one_iff_coeff_zero + F n k a).mp + change e (e.symm sigma.1) ∈ + equalCharacteristicLubinTateRealLowerRamificationGroup F n + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) + simpa using sigma.2 + invFun a := by + let e := equalCharacteristicLubinTateUnitParameterEquivGal F n + refine ⟨e a.1, ?_⟩ + change equalCharacteristicLubinTateUnitParameterToGal F n a.1 ∈ + equalCharacteristicLubinTateRealLowerRamificationGroup F n + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) + apply + (mem_equalCharacteristicLubinTateRealLowerRamificationGroup_pow_sub_one_iff_coeff_zero + F n k a.1).mpr + exact + (equalCharacteristicLubinTateUnitParameter_coeff_zero_iff_vanishesBefore + F n k hk hkn a.1).mpr a.2 + left_inv sigma := by + apply Subtype.ext + exact + (equalCharacteristicLubinTateUnitParameterEquivGal F n).apply_symm_apply + sigma.1 + right_inv a := by + apply Subtype.ext + exact + (equalCharacteristicLubinTateUnitParameterEquivGal F n).symm_apply_apply + a.1 + +/-- For `1 ≤ k ≤ n + 1`, the lower group at `q^k - 1` has order +`q^(n + 1 - k)`. -/ +theorem equalCharacteristicLubinTateRealLowerRamificationGroup_natCard_pow_sub_one + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n k : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) : + Nat.card + (equalCharacteristicLubinTateRealLowerRamificationGroup F n + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ)) = + Nat.card F.residueField ^ (n + 1 - k) := by + rw [Nat.card_congr + (equalCharacteristicLubinTateRealLowerRamificationGroupEquivVanishesBefore + F n k hk hkn), + equalCharacteristicLubinTateUnitParameterVanishesBefore_natCard + F n k hk hkn] + +/-- On the whole interval `q^(k-1) ≤ r < q^k`, lower-group membership is +controlled by the same first-`k` coefficient condition. -/ +theorem + mem_equalCharacteristicLubinTateRealLowerRamificationGroup_nat_iff_coeff_zero_of_pow_interval + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n k r : ℕ) (hk : 1 ≤ k) + (hlow : Nat.card F.residueField ^ (k - 1) ≤ r) + (hhigh : r < Nat.card F.residueField ^ k) + (a : equalCharacteristicLubinTateUnitParameter F n) : + equalCharacteristicLubinTateUnitParameterToGal F n a ∈ + equalCharacteristicLubinTateRealLowerRamificationGroup F n (r : ℝ) ↔ + ∀ j < k, + PowerSeries.coeff j + (equalCharacteristicLubinTateUnitParameterSeries F n a - 1) = 0 := by + let q := Nat.card F.residueField + let u := equalCharacteristicLubinTateUnitParameterSeries F n a - 1 + have hqone : 1 < q := + (Finite.one_lt_card : 1 < Nat.card F.residueField) + have hqpos : 0 < q := Nat.zero_lt_one.trans hqone + change q ^ (k - 1) ≤ r at hlow + change r < q ^ k at hhigh + rw [ + mem_equalCharacteristicLubinTateRealLowerRamificationGroup_nat_iff_parameterPower] + change + equalCharacteristicLubinTateUnitParameterToGal F n a = 1 ∨ + (((r + 1 : ℕ) : ℕ∞) ≤ ((q ^ u.order.toNat : ℕ) : ℕ∞)) ↔ + ∀ j < k, PowerSeries.coeff j u = 0 + constructor + · rintro (hsigma | hpow) + · have ha : + a = equalCharacteristicLubinTateOneUnitParameter F n := + (equalCharacteristicLubinTateUnitParameterToGal_eq_one_iff + F n a).mp hsigma + subst a + simp [u, equalCharacteristicLubinTateOneUnitParameterSeries] + · intro j hj + have hpowNat : r + 1 ≤ q ^ u.order.toNat := by + exact_mod_cast hpow + have hlower : q ^ (k - 1) < q ^ u.order.toNat := + lt_of_le_of_lt hlow (lt_of_lt_of_le (Nat.lt_succ_self r) hpowNat) + have hkorder : k ≤ u.order.toNat := by + have hpred : k - 1 < u.order.toNat := by + by_contra hnot + have horder : u.order.toNat ≤ k - 1 := + Nat.le_of_not_gt hnot + have hp := + Nat.pow_le_pow_right hqpos horder + omega + omega + exact + PowerSeries.coeff_of_lt_order_toNat j + (lt_of_lt_of_le hj hkorder) + · intro hcoeff + by_cases ha : + a = equalCharacteristicLubinTateOneUnitParameter F n + · left + exact + (equalCharacteristicLubinTateUnitParameterToGal_eq_one_iff + F n a).mpr ha + · right + have hu : u ≠ 0 := by + intro hu + apply ha + exact + (equalCharacteristicLubinTateUnitParameterSeries_sub_one_eq_zero_iff + F n a).mp hu + have horder : (k : ℕ∞) ≤ u.order := + PowerSeries.nat_le_order u k hcoeff + have hordertop : u.order ≠ ⊤ := by + intro htop + exact hu (PowerSeries.order_eq_top.mp htop) + have hcoe : ((u.order.toNat : ℕ) : ℕ∞) = u.order := + ENat.natCast_toNat hordertop + have hkorder : k ≤ u.order.toNat := by + rw [← hcoe] at horder + exact_mod_cast horder + have hpowNat : r + 1 ≤ q ^ u.order.toNat := + (by omega : r + 1 ≤ q ^ k).trans + (Nat.pow_le_pow_right hqpos hkorder) + exact_mod_cast hpowNat + +/-- The lower-group order is constant on `q^(k-1) ≤ r < q^k`. -/ +theorem equalCharacteristicLubinTateRealLowerRamificationGroup_natCard_of_pow_interval + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n k r : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) + (hlow : Nat.card F.residueField ^ (k - 1) ≤ r) + (hhigh : r < Nat.card F.residueField ^ k) : + Nat.card + (equalCharacteristicLubinTateRealLowerRamificationGroup F n (r : ℝ)) = + Nat.card F.residueField ^ (n + 1 - k) := by + have hgroup : + equalCharacteristicLubinTateRealLowerRamificationGroup F n (r : ℝ) = + equalCharacteristicLubinTateRealLowerRamificationGroup F n + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) := by + ext sigma + let e := equalCharacteristicLubinTateUnitParameterEquivGal F n + let a := e.symm sigma + have hsigma : e a = sigma := e.apply_symm_apply sigma + rw [← hsigma] + change + equalCharacteristicLubinTateUnitParameterToGal F n a ∈ + equalCharacteristicLubinTateRealLowerRamificationGroup F n (r : ℝ) ↔ + equalCharacteristicLubinTateUnitParameterToGal F n a ∈ + equalCharacteristicLubinTateRealLowerRamificationGroup F n + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) + rw [ + mem_equalCharacteristicLubinTateRealLowerRamificationGroup_nat_iff_coeff_zero_of_pow_interval + F n k r hk hlow hhigh a, + mem_equalCharacteristicLubinTateRealLowerRamificationGroup_pow_sub_one_iff_coeff_zero] + rw [hgroup, + equalCharacteristicLubinTateRealLowerRamificationGroup_natCard_pow_sub_one + F n k hk hkn] + + +end ChosenRamificationTarget + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean new file mode 100644 index 0000000000..14f700d995 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean @@ -0,0 +1,1111 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.GaloisAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups +public import Mathlib.RingTheory.Discriminant +public import Mathlib.RingTheory.Polynomial.Eisenstein.IsIntegral +/-! +# The chosen complete valuation and primitive Lubin--Tate point + +This module constructs the actual complete discrete valuation on an explicit +finite equal-characteristic Lubin--Tate level. It proves that the chosen +primitive point generates the integral closure and is a uniformizer. +-/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + exists_integralClosure_standard_fundamental_identity → + exists_integralClosure_standard_fundamental_identity + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + hasUniqueValuationExtension_of_finite_separable → + hasUniqueValuationExtension_of_finite_separable + + +noncomputable +section + +open scoped LaurentSeries Pointwise PowerSeries + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.ValuedExtension +open LubinTate.EqualCharacteristic +open RamificationTheory.HilbertRamification.Higher +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +universe u v y + +variable {K : Type u} [Field K] + +private theorem isEisensteinAt_map_ringEquiv + {R S : Type*} [CommRing R] [CommRing S] + (e : R ≃+* S) {f : Polynomial R} {I : Ideal R} + (hf : f.IsEisensteinAt I) : + (f.map e).IsEisensteinAt (I.map e) := by + have hmem_iff (J : Ideal R) (x : R) : + e.toRingHom x ∈ J.map e.toRingHom ↔ x ∈ J := by + constructor + · intro hx + rcases + (Ideal.mem_map_iff_of_surjective e.toRingHom e.surjective).1 hx with + ⟨y, hy, hey⟩ + exact e.injective hey ▸ hy + · exact Ideal.mem_map_of_mem e.toRingHom + constructor + · rw [Polynomial.leadingCoeff_map_of_injective e.injective] + change e.toRingHom f.leadingCoeff ∉ I.map e.toRingHom + rw [hmem_iff I] + exact hf.leading + · intro i hi + rw [Polynomial.natDegree_map_eq_of_injective e.injective] at hi + rw [Polynomial.coeff_map] + change e.toRingHom (f.coeff i) ∈ I.map e.toRingHom + rw [hmem_iff I] + exact hf.mem hi + · rw [Polynomial.coeff_map, ← Ideal.map_pow] + change e.toRingHom (f.coeff 0) ∉ (I ^ 2).map e.toRingHom + rw [hmem_iff (I ^ 2)] + exact hf.notMem + +private theorem + isIntegral_mem_adjoin_of_powerBasis_minpoly_isEisensteinAt + {R K L : Type*} [CommRing R] [IsDomain R] + [IsDiscreteValuationRing R] [Field K] [Field L] + [Algebra R K] [Algebra K L] [Algebra R L] + [IsScalarTower R K L] [IsFractionRing R K] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (B : PowerBasis K L) (pi : R) (hpi : Irreducible pi) + (hBint : IsIntegral R B.gen) + (hei : (minpoly R B.gen).IsEisensteinAt + (Ideal.span ({pi} : Set R))) + {z : L} (hzint : IsIntegral R z) : + z ∈ Algebra.adjoin R ({B.gen} : Set L) := by + have hdiscInt : + IsIntegral R (Algebra.discr K B.basis) := + Algebra.discr_isIntegral K (fun i => by + simpa using hBint.pow (i : ℕ)) + obtain ⟨d, hd⟩ := + IsIntegrallyClosed.isIntegral_iff.mp hdiscInt + have hd0 : d ≠ 0 := by + intro hd0 + have hdisc0 : Algebra.discr K B.basis ≠ 0 := + Algebra.discr_not_zero_of_basis K B.basis + apply hdisc0 + rw [← hd, hd0, map_zero] + obtain ⟨m, unit, hdu⟩ := + IsDiscreteValuationRing.eq_unit_mul_pow_irreducible hd0 hpi + have H := + Algebra.discr_mul_isIntegral_mem_adjoin K hBint hzint + rw [← hd, hdu, map_mul, map_pow] at H + have Hpow : + pi ^ m • z ∈ Algebra.adjoin R ({B.gen} : Set L) := by + have HR : + ((↑unit : R) * pi ^ m) • z ∈ + Algebra.adjoin R ({B.gen} : Set L) := by + rw [← IsScalarTower.algebraMap_smul K] + simpa [map_mul, map_pow] using H + have Hu := + Subalgebra.smul_mem + (Algebra.adjoin R ({B.gen} : Set L)) HR (↑(unit⁻¹) : R) + simpa [smul_smul, ← mul_assoc] using Hu + exact mem_adjoin_of_smul_prime_pow_smul_of_minpoly_isEisensteinAt + (UniqueFactorizationMonoid.irreducible_iff_prime.mp hpi) + hBint hzint Hpow hei + +private theorem + integralClosure_adjoin_eq_top_of_powerBasis_minpoly_isEisensteinAt + {R K L A : Type*} [CommRing R] [IsDomain R] + [IsDiscreteValuationRing R] [Field K] [Field L] [CommRing A] + [Algebra R K] [Algebra K L] [Algebra R L] + [Algebra R A] [Algebra A L] + [IsScalarTower R K L] [IsScalarTower R A L] + [IsFractionRing R K] [FiniteDimensional K L] + [Algebra.IsSeparable K L] [IsIntegralClosure A R L] + (B : PowerBasis K L) (pi : R) (hpi : Irreducible pi) + (a : A) (ha : algebraMap A L a = B.gen) + (hmap_injective : Function.Injective (algebraMap A L)) + (hBint : IsIntegral R B.gen) + (hei : (minpoly R B.gen).IsEisensteinAt + (Ideal.span ({pi} : Set R))) : + Algebra.adjoin R ({a} : Set A) = ⊤ := by + apply top_unique + intro z _hz + let j : A →ₐ[R] L := IsScalarTower.toAlgHom R A L + have hzint : IsIntegral R (j z) := + IsIntegralClosure.isIntegral_iff.mpr ⟨z, rfl⟩ + have hzfield : + j z ∈ Algebra.adjoin R ({B.gen} : Set L) := + isIntegral_mem_adjoin_of_powerBasis_minpoly_isEisensteinAt + B pi hpi hBint hei hzint + have hmap : + (Algebra.adjoin R ({a} : Set A)).map j = + Algebra.adjoin R ({B.gen} : Set L) := by + rw [AlgHom.map_adjoin_singleton] + congr 2 + rw [← hmap] at hzfield + rcases hzfield with ⟨y, hy, hyz⟩ + have hya : y = z := hmap_injective hyz + exact hya ▸ hy + +section ChosenRamificationTarget + +variable {K₀ : Type} [Field K₀] + +/-- The canonical complete discrete valuation on the equal-characteristic +Laurent-series base used by the explicit Lubin--Tate level construction. -/ +noncomputable def equalCharacteristicLubinTateBaseCompleteDVF + (F : LocalField.{0, v} K₀) : + ValuationTheory.DiscreteValuationField.CompleteDVF.{0, 0} + F.residueField⸨X⸩ := by + letI : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + letI : IsNonarchimedeanLocalField F.residueField⸨X⸩ := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + exact LocalFieldTheory.localCompleteDVF F.residueField⸨X⸩ + +/-- The valuation packaged by the chosen Laurent-series base is the canonical +valuation induced by the equal-characteristic valuative relation. -/ +theorem equalCharacteristicLubinTateBaseCompleteDVF_valuation_eq + (F : LocalField.{0, v} K₀) : + (equalCharacteristicLubinTateBaseCompleteDVF F).valuation = + letI : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + ValuativeRel.valuation F.residueField⸨X⸩ := by + let : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + let : IsNonarchimedeanLocalField F.residueField⸨X⸩ := + equalCharacteristicLaurentIsNonarchimedeanLocalField F + change + (LocalFieldTheory.localCompleteDVF F.residueField⸨X⸩).valuation = + ValuativeRel.valuation F.residueField⸨X⸩ + unfold LocalFieldTheory.localCompleteDVF + unfold ValuationTheory.Valuations.completeDVFOfCompleteValuedField + rfl + +/-- Identity on Laurent-series elements identifies the canonical valuative +integer ring with the valuation ring packaged by the chosen complete DVF. -/ +noncomputable def + equalCharacteristicLaurentValuativeIntegerEquivLubinTateBaseValuationSubring + (F : LocalField.{0, v} K₀) : + letI : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + (ValuativeRel.valuation F.residueField⸨X⸩).integer ≃+* + (equalCharacteristicLubinTateBaseCompleteDVF F).valuationSubring := by + letI : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + let hval := + equalCharacteristicLubinTateBaseCompleteDVF_valuation_eq F + exact + { toFun := fun x => ⟨x, by + change + (equalCharacteristicLubinTateBaseCompleteDVF F).valuation + (x : F.residueField⸨X⸩) ≤ 1 + rw [hval] + exact x.property⟩ + invFun := fun x => ⟨x, by + change + ValuativeRel.valuation F.residueField⸨X⸩ + (x : F.residueField⸨X⸩) ≤ 1 + rw [← hval] + exact x.property⟩ + left_inv := fun _ => rfl + right_inv := fun _ => rfl + map_mul' := fun _ _ => rfl + map_add' := fun _ _ => rfl } + +/-- Power series are exactly the valuation ring of the chosen +equal-characteristic Laurent-series base. -/ +noncomputable def + equalCharacteristicPowerSeriesEquivLubinTateBaseValuationSubring + (F : LocalField.{0, v} K₀) : + F.residueField⟦X⟧ ≃+* + (equalCharacteristicLubinTateBaseCompleteDVF F).valuationSubring := by + letI : ValuativeRel F.residueField⸨X⸩ := + equalCharacteristicLaurentValuativeRel F + exact + (powerSeriesEquivLaurentValuativeInteger F.residueField).trans + (equalCharacteristicLaurentValuativeIntegerEquivLubinTateBaseValuationSubring + F) + +/-- The power-series/valuation-ring equivalence is the usual inclusion after +coercion to the Laurent-series field. -/ +@[simp] +theorem + equalCharacteristicPowerSeriesEquivLubinTateBaseValuationSubring_coe + (F : LocalField.{0, v} K₀) (f : F.residueField⟦X⟧) : + ((equalCharacteristicPowerSeriesEquivLubinTateBaseValuationSubring F f : + (equalCharacteristicLubinTateBaseCompleteDVF F).valuationSubring) : + F.residueField⸨X⸩) = + (f : F.residueField⸨X⸩) := by + rfl + +/-- The Laurent parameter `T`, now regarded as an element of the valuation +ring packaged by the chosen base complete DVF. -/ +noncomputable def equalCharacteristicLubinTateBaseUniformizerInteger + (F : LocalField.{0, v} K₀) : + (equalCharacteristicLubinTateBaseCompleteDVF F).valuationSubring := + equalCharacteristicPowerSeriesEquivLubinTateBaseValuationSubring F + (PowerSeries.X : F.residueField⟦X⟧) + +/-- The chosen base valuation-ring parameter has Laurent-series value `T`. -/ +@[simp] +theorem equalCharacteristicLubinTateBaseUniformizerInteger_coe + (F : LocalField.{0, v} K₀) : + (equalCharacteristicLubinTateBaseUniformizerInteger F : + F.residueField⸨X⸩) = + equalCharacteristicLaurentUniformizer F := by + rw [equalCharacteristicLubinTateBaseUniformizerInteger, + equalCharacteristicPowerSeriesEquivLubinTateBaseValuationSubring_coe] + rfl + +/-- The Laurent parameter is irreducible in the valuation ring packaged by +the chosen base complete DVF. -/ +theorem equalCharacteristicLubinTateBaseUniformizerInteger_irreducible + (F : LocalField.{0, v} K₀) : + Irreducible (equalCharacteristicLubinTateBaseUniformizerInteger F) := by + exact + PowerSeries.X_irreducible.map + (equalCharacteristicPowerSeriesEquivLubinTateBaseValuationSubring F) + +/-- The integral primitive division polynomial, with its coefficients +transported from `κ[[T]]` to the chosen base valuation ring. -/ +noncomputable def + equalCharacteristicLubinTatePrimitivePolynomialInBaseValuationSubring + (F : LocalField.{0, v} K₀) (n : ℕ) : + Polynomial + (equalCharacteristicLubinTateBaseCompleteDVF F).valuationSubring := + (equalCharacteristicLubinTateIntegralPrimitivePolynomial F n).map + (equalCharacteristicPowerSeriesEquivLubinTateBaseValuationSubring F) + +/-- The primitive division polynomial remains monic after transport to the +chosen base valuation ring. -/ +theorem + equalCharacteristicLubinTatePrimitivePolynomialInBaseValuationSubring_monic + (F : LocalField.{0, v} K₀) (n : ℕ) : + (equalCharacteristicLubinTatePrimitivePolynomialInBaseValuationSubring + F n).Monic := + (equalCharacteristicLubinTateIntegralPrimitivePolynomial_monic F n).map _ + +/-- Mapping the valuation-ring primitive polynomial into the Laurent-series +field recovers the original primitive division polynomial. -/ +theorem + equalCharacteristicLubinTatePrimitivePolynomialInBaseValuationSubring_map + (F : LocalField.{0, v} K₀) (n : ℕ) : + (equalCharacteristicLubinTatePrimitivePolynomialInBaseValuationSubring + F n).map + (algebraMap + (equalCharacteristicLubinTateBaseCompleteDVF F).valuationSubring + F.residueField⸨X⸩) = + equalCharacteristicLubinTatePrimitivePolynomial F n := by + rw [equalCharacteristicLubinTatePrimitivePolynomialInBaseValuationSubring, + Polynomial.map_map, + ← equalCharacteristicLubinTateIntegralPrimitivePolynomial_map] + congr 1 + +private theorem equalCharacteristicLubinTateLevelCompleteDVFData_exists + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + ∃ target : + ValuationTheory.DiscreteValuationField.CompleteDVF.{0, 0} + (equalCharacteristicLubinTateLevelField F n), + ∃ hExt : + (equalCharacteristicLubinTateBaseCompleteDVF F).valuation.HasExtension + target.valuation, + letI : + (equalCharacteristicLubinTateBaseCompleteDVF F).valuation.HasExtension + target.valuation := hExt + IsIntegralClosure target.valuationSubring + (equalCharacteristicLubinTateBaseCompleteDVF F).valuationSubring + (equalCharacteristicLubinTateLevelField F n) ∧ + ValuationTheory.DiscreteValuationField.ValuedExtension.degree + (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF + target.toDVF = + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF + target.toDVF * + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF + target.toDVF := by + let : FiniteDimensional F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + let : IsGalois F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_isGalois F n + exact + exists_integralClosure_standard_fundamental_identity + (K := F.residueField⸨X⸩) + (L := equalCharacteristicLubinTateLevelField F n) + (equalCharacteristicLubinTateBaseCompleteDVF F) + +/-- A complete-DVF structure on the explicit equal-characteristic +Lubin--Tate level field, chosen from its actual integral closure over +`κ((T))`. -/ +noncomputable def equalCharacteristicLubinTateLevelCompleteDVF + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + ValuationTheory.DiscreteValuationField.CompleteDVF.{0, 0} + (equalCharacteristicLubinTateLevelField F n) := + Classical.choose + (show + ∃ target : + ValuationTheory.DiscreteValuationField.CompleteDVF.{0, 0} + (equalCharacteristicLubinTateLevelField F n), + ∃ hExt : + (equalCharacteristicLubinTateBaseCompleteDVF F).valuation.HasExtension + target.valuation, + letI : + (equalCharacteristicLubinTateBaseCompleteDVF F).valuation.HasExtension + target.valuation := hExt + IsIntegralClosure target.valuationSubring + (equalCharacteristicLubinTateBaseCompleteDVF F).valuationSubring + (equalCharacteristicLubinTateLevelField F n) ∧ + ValuationTheory.DiscreteValuationField.ValuedExtension.degree + (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF + target.toDVF = + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF + target.toDVF * + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF + target.toDVF from by + exact equalCharacteristicLubinTateLevelCompleteDVFData_exists F n) + +/-- The chosen level valuation extends the canonical Laurent-series base +valuation. -/ +theorem equalCharacteristicLubinTateLevelCompleteDVF_hasExtension + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + (equalCharacteristicLubinTateBaseCompleteDVF F).valuation.HasExtension + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuation := + Classical.choose + (Classical.choose_spec + (equalCharacteristicLubinTateLevelCompleteDVFData_exists F n)) + +/-- Provides the canonical extension instance for the chosen +equal-characteristic Lubin--Tate level valuation. -/ +noncomputable instance + equalCharacteristicLubinTateLevelCompleteDVF_hasExtensionInstance + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + (equalCharacteristicLubinTateBaseCompleteDVF F).valuation.HasExtension + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuation := + equalCharacteristicLubinTateLevelCompleteDVF_hasExtension F n + +/-- The valuation ring of the chosen level target is the actual integral +closure of the Laurent-series base valuation ring. -/ +theorem equalCharacteristicLubinTateLevelCompleteDVF_isIntegralClosure + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + IsIntegralClosure + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring + (equalCharacteristicLubinTateBaseCompleteDVF F).valuationSubring + (equalCharacteristicLubinTateLevelField F n) := + (Classical.choose_spec + (Classical.choose_spec + (equalCharacteristicLubinTateLevelCompleteDVFData_exists F n))).1 + +/-- The chosen integral-closure valuation realizes the fundamental identity +for the explicit finite Lubin--Tate level. -/ +theorem equalCharacteristicLubinTateLevelCompleteDVF_fundamentalIdentity + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + ValuationTheory.DiscreteValuationField.ValuedExtension.degree + (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF + (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF = + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF + (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF * + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF + (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF := + (Classical.choose_spec + (Classical.choose_spec + (equalCharacteristicLubinTateLevelCompleteDVFData_exists F n))).2 + +/-- The power-basis generator is integral over the chosen base valuation +ring. Its witness is the transported integral primitive polynomial, not a +field-level integrality surrogate. -/ +theorem + equalCharacteristicLubinTateLevelPowerBasis_gen_isIntegral_over_baseValuationSubring + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + IsIntegral + (equalCharacteristicLubinTateBaseCompleteDVF F).valuationSubring + (equalCharacteristicLubinTateLevelPowerBasis F n).gen := by + let P := + equalCharacteristicLubinTatePrimitivePolynomialInBaseValuationSubring F n + refine + ⟨P, + equalCharacteristicLubinTatePrimitivePolynomialInBaseValuationSubring_monic + F n, ?_⟩ + calc + Polynomial.aeval + (equalCharacteristicLubinTateLevelPowerBasis F n).gen P = + Polynomial.aeval + (equalCharacteristicLubinTateLevelPowerBasis F n).gen + (P.map + (algebraMap + (equalCharacteristicLubinTateBaseCompleteDVF F).valuationSubring + F.residueField⸨X⸩)) := by + symm + exact Polynomial.aeval_map_algebraMap + F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelPowerBasis F n).gen P + _ = Polynomial.aeval + (equalCharacteristicLubinTateLevelPowerBasis F n).gen + (equalCharacteristicLubinTatePrimitivePolynomial F n) := by + rw [ + equalCharacteristicLubinTatePrimitivePolynomialInBaseValuationSubring_map] + _ = Polynomial.aeval + (equalCharacteristicLubinTateLevelPowerBasis F n).gen + (minpoly F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelPowerBasis F n).gen) := by + rw [equalCharacteristicLubinTateLevelPowerBasis_minpoly] + _ = 0 := + minpoly.aeval F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelPowerBasis F n).gen + +/-- The chosen primitive Lubin--Tate division point belongs to the actual +integral-closure valuation ring selected on the level field. -/ +theorem + equalCharacteristicLubinTateLevelPowerBasis_gen_mem_valuationSubring + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + (equalCharacteristicLubinTateLevelPowerBasis F n).gen ∈ + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuation.valuationSubring := by + let : + IsIntegralClosure + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring + (equalCharacteristicLubinTateBaseCompleteDVF F).valuationSubring + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelCompleteDVF_isIntegralClosure F n + rcases + (IsIntegralClosure.isIntegral_iff + (A := + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring) + (R := + (equalCharacteristicLubinTateBaseCompleteDVF F).valuationSubring) + (B := equalCharacteristicLubinTateLevelField F n)).1 + (equalCharacteristicLubinTateLevelPowerBasis_gen_isIntegral_over_baseValuationSubring + F n) with + ⟨x, hx⟩ + change + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuation + (equalCharacteristicLubinTateLevelPowerBasis F n).gen ≤ 1 + rw [← hx] + exact x.property + +/-- The primitive level-`n+1` division point as an element of the chosen +target valuation ring. Its norm computation below proves that this element +is a uniformizer. -/ +noncomputable def equalCharacteristicLubinTatePrimitivePointInteger + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring := + ⟨(equalCharacteristicLubinTateLevelPowerBasis F n).gen, + equalCharacteristicLubinTateLevelPowerBasis_gen_mem_valuationSubring F n⟩ + +/-- The valuation-ring primitive point has the original power-basis generator +as its underlying level-field element. -/ +@[simp] +theorem equalCharacteristicLubinTatePrimitivePointInteger_coe + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + (equalCharacteristicLubinTatePrimitivePointInteger F n : + equalCharacteristicLubinTateLevelField F n) = + (equalCharacteristicLubinTateLevelPowerBasis F n).gen := + rfl + +/-- The transported integral primitive polynomial is Eisenstein at the +chosen Laurent uniformizer. -/ +theorem + equalCharacteristicLubinTatePrimitivePolynomialInBaseValuationSubring_isEisensteinAt + (F : LocalField.{0, v} K₀) + (n : ℕ) : + (equalCharacteristicLubinTatePrimitivePolynomialInBaseValuationSubring + F n).IsEisensteinAt + (Ideal.span + ({equalCharacteristicLubinTateBaseUniformizerInteger F} : + Set + (equalCharacteristicLubinTateBaseCompleteDVF F).valuationSubring)) := by + have h := + isEisensteinAt_map_ringEquiv + (equalCharacteristicPowerSeriesEquivLubinTateBaseValuationSubring F) + (equalCharacteristicLubinTateIntegralPrimitivePolynomial_isEisensteinAt + F n) + change + (equalCharacteristicLubinTatePrimitivePolynomialInBaseValuationSubring + F n).IsEisensteinAt + (Ideal.map + (equalCharacteristicPowerSeriesEquivLubinTateBaseValuationSubring F) + (Ideal.span ({PowerSeries.X} : Set F.residueField⟦X⟧))) at h + convert h using 1 + rw [Ideal.map_span] + simp [equalCharacteristicLubinTateBaseUniformizerInteger] + +/-- The integral minimal polynomial of the primitive point is the transported +Lubin--Tate primitive polynomial. -/ +theorem equalCharacteristicLubinTatePrimitivePoint_minpoly + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + minpoly + (equalCharacteristicLubinTateBaseCompleteDVF F).valuationSubring + (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + equalCharacteristicLubinTatePrimitivePolynomialInBaseValuationSubring + F n := by + apply Polynomial.map_injective + (algebraMap + (equalCharacteristicLubinTateBaseCompleteDVF F).valuationSubring + F.residueField⸨X⸩) + (fun x y h => Subtype.ext h) + rw [← minpoly.isIntegrallyClosed_eq_field_fractions' + F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelPowerBasis_gen_isIntegral_over_baseValuationSubring + F n), + equalCharacteristicLubinTatePrimitivePolynomialInBaseValuationSubring_map, + equalCharacteristicLubinTateLevelPowerBasis_minpoly] + +/-- The primitive Lubin--Tate point generates the entire chosen integral +closure over the Laurent-series valuation ring. -/ +theorem equalCharacteristicLubinTatePrimitivePointInteger_adjoin_eq_top + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + Algebra.adjoin + (equalCharacteristicLubinTateBaseCompleteDVF F).valuationSubring + ({equalCharacteristicLubinTatePrimitivePointInteger F n} : + Set + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring) = + ⊤ := by + let : + FiniteDimensional F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + let : + IsGalois F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_isGalois F n + let : + IsScalarTower + (equalCharacteristicLubinTateBaseCompleteDVF F).valuationSubring + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring + (equalCharacteristicLubinTateLevelField F n) := + IsScalarTower.of_algebraMap_eq' rfl + let : + IsIntegralClosure + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring + (equalCharacteristicLubinTateBaseCompleteDVF F).valuationSubring + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelCompleteDVF_isIntegralClosure F n + apply + integralClosure_adjoin_eq_top_of_powerBasis_minpoly_isEisensteinAt + (equalCharacteristicLubinTateLevelPowerBasis F n) + (equalCharacteristicLubinTateBaseUniformizerInteger F) + (equalCharacteristicLubinTateBaseUniformizerInteger_irreducible F) + (equalCharacteristicLubinTatePrimitivePointInteger F n) + (by rfl) + (fun x y h => Subtype.ext h) + (equalCharacteristicLubinTateLevelPowerBasis_gen_isIntegral_over_baseValuationSubring + F n) + simpa only [equalCharacteristicLubinTatePrimitivePoint_minpoly F n] using + equalCharacteristicLubinTatePrimitivePolynomialInBaseValuationSubring_isEisensteinAt + F n + +/-- Finite separability gives uniqueness of the chosen complete valuation +extension on the explicit level field. -/ +theorem + equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueValuationExtension + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + ValuationTheory.DiscreteValuationField.ValuedExtension.HasUniqueValuationExtension.{0, 0, 0, + 0, y} + (base := equalCharacteristicLubinTateBaseCompleteDVF F) + (target := equalCharacteristicLubinTateLevelCompleteDVF F n) := by + let : FiniteDimensional F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + let : IsGalois F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_isGalois F n + exact + (hasUniqueValuationExtension_of_finite_separable + (equalCharacteristicLubinTateBaseCompleteDVF F) + (equalCharacteristicLubinTateLevelCompleteDVF F n) : + ValuationTheory.DiscreteValuationField.ValuedExtension.HasUniqueValuationExtension.{0, 0, + 0, 0, y} + (base := equalCharacteristicLubinTateBaseCompleteDVF F) + (target := equalCharacteristicLubinTateLevelCompleteDVF F n)) + +/-- Uniqueness after forgetting completeness, in the form required by the +real lower ramification groups. -/ +theorem + equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{0, 0, 0, 0, y} + (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF + (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF := + equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueValuationExtension F n + +private theorem addVal_prod_valuationSubringAut + {K₁ L₁ : Type} [Field K₁] [Field L₁] [Algebra K₁ L₁] + [FiniteDimensional K₁ L₁] + (base : DVF.{0, 0} K₁) (target : DVF.{0, 0} L₁) + [base.valuation.HasExtension target.valuation] + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{0, 0, 0, 0, 0} + base target) + (a : target.valuationSubring) : + IsDiscreteValuationRing.addVal target.valuationSubring + (∏ sigma : Gal(L₁/K₁), + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a) = + Nat.card Gal(L₁/K₁) • + IsDiscreteValuationRing.addVal target.valuationSubring a := by + classical + have hprod : ∀ s : Finset Gal(L₁/K₁), + IsDiscreteValuationRing.addVal target.valuationSubring + (∏ sigma ∈ s, + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a) = + ∑ sigma ∈ s, + IsDiscreteValuationRing.addVal target.valuationSubring + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a) := by + intro s + induction s using Finset.induction_on with + | empty => simp + | @insert sigma s hs ih => + rw [Finset.prod_insert hs, Finset.sum_insert hs, + IsDiscreteValuationRing.addVal_mul, ih] + simpa [IsDiscreteValuationRing.addVal_ringEquiv, + Nat.card_eq_fintype_card] using + hprod Finset.univ + +section PrimitivePointUniformizer + +noncomputable local instance + equalCharacteristicLubinTateLevelField_finiteDimensional_forUniformizer + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + FiniteDimensional F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + +noncomputable local instance + equalCharacteristicLubinTateLevelField_isGalois_forUniformizer + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + IsGalois F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_isGalois F n + +private theorem + equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension_zero + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{0, 0, 0, 0, 0} + (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF + (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF := + equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension F n + +/-- The image of the Laurent parameter in a Lubin--Tate level has additive +valuation equal to the ramification index. -/ +theorem equalCharacteristicLubinTateBaseUniformizerInteger_map_addVal + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + IsDiscreteValuationRing.addVal + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring + (integerMap + (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF + (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF + (equalCharacteristicLubinTateBaseUniformizerInteger F)) = + (ramificationIndex + (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF + (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF : ℕ∞) := by + exact + addVal_integerMap_eq_ramificationIndex_of_irreducible + (equalCharacteristicLubinTateBaseCompleteDVF F) + (equalCharacteristicLubinTateLevelCompleteDVF F n) + (equalCharacteristicLubinTateBaseUniformizerInteger_irreducible F) + +/-- The norm identity for the negative primitive point, lifted to the chosen +valuation rings as the product of its full Galois orbit. -/ +theorem equalCharacteristicLubinTateBaseUniformizer_orbitProduct + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + let base := equalCharacteristicLubinTateBaseCompleteDVF F + let target := equalCharacteristicLubinTateLevelCompleteDVF F n + integerMap base.toDVF target.toDVF + (equalCharacteristicLubinTateBaseUniformizerInteger F) = + ∏ sigma : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩), + valuationSubringAutOfUniqueExtension + (base := base.toDVF) (target := target.toDVF) + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension F n) + sigma (-equalCharacteristicLubinTatePrimitivePointInteger F n) := by + classical + dsimp only + apply Subtype.ext + simp only [integerMap_apply, + equalCharacteristicLubinTateBaseUniformizerInteger_coe] + change + algebraMap F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) + (equalCharacteristicLaurentUniformizer F) = + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuation.valuationSubring.subtype + (∏ sigma : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩), + valuationSubringAutOfUniqueExtension + (base := + (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF) + (target := + (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF) + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension_zero + F n) + sigma (-equalCharacteristicLubinTatePrimitivePointInteger F n)) + rw [map_prod] + calc + algebraMap F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) + (equalCharacteristicLaurentUniformizer F) = + algebraMap F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) + (Algebra.norm F.residueField⸨X⸩ + (-equalCharacteristicLubinTateLevelGenerator F n)) := by + rw [equalCharacteristicLubinTate_norm_neg_levelGenerator] + _ = ∏ sigma : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩), + sigma (-equalCharacteristicLubinTateLevelGenerator F n) := + Algebra.norm_eq_prod_automorphisms + F.residueField⸨X⸩ + (-equalCharacteristicLubinTateLevelGenerator F n) + _ = ∏ sigma : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩), + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuation.valuationSubring.subtype + (valuationSubringAutOfUniqueExtension + (base := + (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF) + (target := + (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF) + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension_zero + F n) + sigma (-equalCharacteristicLubinTatePrimitivePointInteger F n)) := by + apply Finset.prod_congr rfl + intro sigma _hsigma + change + sigma (-equalCharacteristicLubinTateLevelGenerator F n) = + sigma (-(equalCharacteristicLubinTateLevelPowerBasis F n).gen) + rfl + +/-- The chosen primitive Lubin--Tate division point has normalized additive +valuation one in the integral-closure valuation ring. -/ +theorem equalCharacteristicLubinTatePrimitivePointInteger_addVal + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + IsDiscreteValuationRing.addVal + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring + (equalCharacteristicLubinTatePrimitivePointInteger F n) = 1 := by + let base := equalCharacteristicLubinTateBaseCompleteDVF F + let target := equalCharacteristicLubinTateLevelCompleteDVF F n + let e := ramificationIndex base.toDVF target.toDVF + let d := degree base.toDVF target.toDVF + let lambda := equalCharacteristicLubinTatePrimitivePointInteger F n + have hbase : + IsDiscreteValuationRing.addVal target.valuationSubring + (integerMap base.toDVF target.toDVF + (equalCharacteristicLubinTateBaseUniformizerInteger F)) = + (e : ℕ∞) := by + exact equalCharacteristicLubinTateBaseUniformizerInteger_map_addVal F n + have horbit := + equalCharacteristicLubinTateBaseUniformizer_orbitProduct F n + have hadd := congrArg + (IsDiscreteValuationRing.addVal target.valuationSubring) horbit + have hnorm : + (e : ℕ∞) = + Nat.card Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩) • + IsDiscreteValuationRing.addVal target.valuationSubring lambda := by + rw [hbase] at hadd + rw [addVal_prod_valuationSubringAut + base.toDVF target.toDVF + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension_zero + F n)] at hadd + simpa [lambda] using hadd + have hcard : + Nat.card Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩) = d := by + simpa [d, degree] using + (IsGalois.card_aut_eq_finrank F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n)) + have hnorm' : + (e : ℕ∞) = + (d : ℕ∞) * + IsDiscreteValuationRing.addVal target.valuationSubring lambda := by + rw [hcard] at hnorm + simpa [nsmul_eq_mul] using hnorm + have hdpos : 0 < d := by + rw [← hcard] + exact Nat.card_pos + have hdne : d ≠ 0 := Nat.ne_of_gt hdpos + have hfund : + d = e * residueDegree base.toDVF target.toDVF := by + simpa [d, e] using + equalCharacteristicLubinTateLevelCompleteDVF_fundamentalIdentity F n + have hene : e ≠ 0 := by + intro he + apply hdne + rw [hfund, he, zero_mul] + have hfne : residueDegree base.toDVF target.toDVF ≠ 0 := by + intro hf + apply hdne + rw [hfund, hf, mul_zero] + have hele : e ≤ d := by + rw [hfund] + exact Nat.le_mul_of_pos_right e (Nat.pos_of_ne_zero hfne) + have hvne : + IsDiscreteValuationRing.addVal target.valuationSubring lambda ≠ 0 := by + intro hv + have hecoe : (e : ℕ∞) ≠ 0 := by + exact_mod_cast hene + apply hecoe + simpa [hv] using hnorm' + have hdcoe : (d : ℕ∞) ≠ 0 := by + exact_mod_cast hdne + have hmul_le : + (d : ℕ∞) * + IsDiscreteValuationRing.addVal target.valuationSubring lambda ≤ + (d : ℕ∞) * 1 := by + rw [← hnorm'] + have hcast : (e : ℕ∞) ≤ (d : ℕ∞) := by + exact_mod_cast hele + simpa using hcast + have hvle : + IsDiscreteValuationRing.addVal target.valuationSubring lambda ≤ 1 := + (ENat.mul_le_mul_left_iff hdcoe (ENat.natCast_ne_top d)).1 hmul_le + have honele : + 1 ≤ IsDiscreteValuationRing.addVal target.valuationSubring lambda := + Order.one_le_iff_ne_zero.mpr hvne + exact le_antisymm hvle honele + +/-- The chosen primitive point is irreducible in the integral-closure +valuation ring. -/ +theorem equalCharacteristicLubinTatePrimitivePointInteger_irreducible + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + Irreducible (equalCharacteristicLubinTatePrimitivePointInteger F n) := by + let target := equalCharacteristicLubinTateLevelCompleteDVF F n + let lambda := equalCharacteristicLubinTatePrimitivePointInteger F n + obtain ⟨varpi, hvarpi⟩ := + IsDiscreteValuationRing.exists_irreducible target.valuationSubring + have hv : + IsDiscreteValuationRing.addVal target.valuationSubring lambda = + IsDiscreteValuationRing.addVal target.valuationSubring varpi := by + rw [equalCharacteristicLubinTatePrimitivePointInteger_addVal, + IsDiscreteValuationRing.addVal_uniformizer hvarpi] + exact + ((IsDiscreteValuationRing.addVal_eq_iff_associated lambda varpi).1 hv).symm.irreducible + hvarpi + +/-- The chosen primitive Lubin--Tate division point is a uniformizer of the +explicit level field with its integral-closure valuation. -/ +theorem equalCharacteristicLubinTatePrimitivePoint_isUniformizer + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuation.IsUniformizer + (equalCharacteristicLubinTatePrimitivePointInteger F n : + equalCharacteristicLubinTateLevelField F n) := by + exact Valuation.isUniformizer_of_maximalIdeal_eq_span + (v := (equalCharacteristicLubinTateLevelCompleteDVF F n).valuation) + (equalCharacteristicLubinTatePrimitivePointInteger_irreducible F n).maximalIdeal_eq + +end PrimitivePointUniformizer + +/-- After passing the primitive point to the chosen valuation ring, its +Galois displacement is still the evaluation of the genuine Lubin--Tate +bracket polynomial for `a - 1`. The normalized valuation is computed below +from the first nonzero visible coefficient. -/ +theorem + equalCharacteristicLubinTatePrimitivePointInteger_displacement_coe_eq_aeval + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) + (σ : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) + (a : equalCharacteristicLubinTateUnitParameter F n) + (ha : + σ (equalCharacteristicLubinTateLevelPowerBasis F n).gen = + equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (equalCharacteristicLubinTateLevelPowerBasis F n).gen) : + ((RamificationTheory.HilbertRamification.Higher.valuationSubringAutOfUniqueExtension + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + F n) + σ (equalCharacteristicLubinTatePrimitivePointInteger F n) - + equalCharacteristicLubinTatePrimitivePointInteger F n : + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring) : + equalCharacteristicLubinTateLevelField F n) = + Polynomial.aeval + (equalCharacteristicLubinTateLevelPowerBasis F n).gen + (equalCharacteristicLubinTateBracketPolynomial F (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a - 1)) := by + let x := (equalCharacteristicLubinTateLevelPowerBasis F n).gen + have hone : + equalCharacteristicLubinTateLevelBracket F n (n + 1) 1 x = x := by + apply Subtype.ext + change + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) 1 + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) = + chosenEqualCharacteristicLubinTatePrimitiveRoot F n + exact + equalCharacteristicLubinTateAmbientBracket_one_apply_of_torsion F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) + (chosenEqualCharacteristicLubinTatePrimitiveRoot_torsion F n) + change + σ x - x = + Polynomial.aeval x + (equalCharacteristicLubinTateBracketPolynomial F (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a - 1)) + rw [ha, + ← equalCharacteristicLubinTateLevelBracket_eq_aeval F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a - 1) x] + calc + equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) x - x = + equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) x - + equalCharacteristicLubinTateLevelBracket F n (n + 1) 1 x := by + rw [hone] + _ = equalCharacteristicLubinTateLevelBracket F n (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a - 1) x := by + apply Subtype.ext + change + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) - + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) 1 + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) = + equalCharacteristicLubinTateAmbientBracket F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a - 1) + (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) + exact + (congrArg + (fun f : + AddMonoid.End + (SeparableClosure F.residueField⸨X⸩) => + f (chosenEqualCharacteristicLubinTatePrimitiveRoot F n)) + (equalCharacteristicLubinTateAmbientBracket_sub F + (equalCharacteristicSeparableCoefficientHom F) + (equalCharacteristicSeparableUniformizer F) (n + 1) + (equalCharacteristicLubinTateUnitParameterSeries F n a) 1)).symm + +section PrimitivePointDisplacementValuation + +noncomputable local instance + equalCharacteristicLubinTateLevelField_finiteDimensional_forDisplacementValuation + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + FiniteDimensional F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + +noncomputable local instance + equalCharacteristicLubinTateLevelField_isGalois_forDisplacementValuation + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + IsGalois F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_isGalois F n + +/-- In the chosen level valuation, the Laurent parameter has additive +valuation equal to the explicit Lubin--Tate degree `(q - 1)q^n`. -/ +theorem equalCharacteristicLubinTateBaseUniformizerInteger_map_addVal_eq_degree + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + IsDiscreteValuationRing.addVal + (equalCharacteristicLubinTateLevelCompleteDVF F n).valuationSubring + (integerMap + (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF + (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF + (equalCharacteristicLubinTateBaseUniformizerInteger F)) = + ((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n : ℕ) := by + let base := equalCharacteristicLubinTateBaseCompleteDVF F + let target := equalCharacteristicLubinTateLevelCompleteDVF F n + have horbit := + equalCharacteristicLubinTateBaseUniformizer_orbitProduct F n + have hadd := congrArg + (IsDiscreteValuationRing.addVal target.valuationSubring) horbit + rw [addVal_prod_valuationSubringAut + base.toDVF target.toDVF + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension_zero + F n)] at hadd + rw [(IsDiscreteValuationRing.addVal target.valuationSubring).map_neg, + equalCharacteristicLubinTatePrimitivePointInteger_addVal] at hadd + rw [nsmul_one, Nat.card_eq_fintype_card] at hadd + calc + _ = (Fintype.card Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩) : ℕ∞) + := hadd + _ = ((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n : ℕ) := by + congr 1 + rw [← Nat.card_eq_fintype_card] + exact + (IsGalois.card_aut_eq_finrank F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n)).trans + (equalCharacteristicLubinTateLevelField_finrank F n) + + +end PrimitivePointDisplacementValuation + +end ChosenRamificationTarget + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/RealIndexSteps.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/RealIndexSteps.lean new file mode 100644 index 0000000000..b41f43eb2e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/RealIndexSteps.lean @@ -0,0 +1,253 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic +/-! +# Real-index steps for equal-characteristic Lubin--Tate levels + +This file packages the ceiling behavior of the chosen real lower filtration +and the integral values of its inverse Herbrand function. Together they show +that, on the positive range covered by an explicit finite Lubin--Tate level, +the real upper filtration is constant on the natural-ceiling steps. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries + +namespace LubinTate + +open LubinTate.EqualCharacteristic +open LocalFieldTheory.DiscreteValuationField +open RamificationTheory.HilbertRamification.Higher + +universe v + +variable {K₀ : Type} [Field K₀] + +/-- Finite-dimensionality for explicit levels while forming the real-index +Herbrand functions in this module. -/ +noncomputable local instance + equalCharacteristicLubinTateLevelField_finiteDimensional_forRealIndexSteps + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + FiniteDimensional F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_finiteDimensional F n + +/-- Galoisness for explicit levels while forming the real-index Herbrand +functions in this module. -/ +noncomputable local instance + equalCharacteristicLubinTateLevelField_isGalois_forRealIndexSteps + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) : + IsGalois F.residueField⸨X⸩ + (equalCharacteristicLubinTateLevelField F n) := + equalCharacteristicLubinTateLevelField_isGalois F n + +/-- At a nonnegative real lower index, the chosen equal-characteristic +Lubin--Tate lower group is the group at the natural-number ceiling. -/ +theorem + equalCharacteristicLubinTateRealLowerRamificationGroup_eq_natCeil + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) (s : ℝ) (hs : 0 ≤ s) : + equalCharacteristicLubinTateRealLowerRamificationGroup F n s = + equalCharacteristicLubinTateRealLowerRamificationGroup + F n (⌈s⌉₊ : ℝ) := by + have hexponent : + realRamificationExponent s = + realRamificationExponent (⌈s⌉₊ : ℝ) := by + rw [realRamificationExponent_nat] + unfold realRamificationExponent + rw [Int.ceil_toNat, Nat.ceil_add_one hs] + have hideal : + realRamificationIdeal + (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF s = + realRamificationIdeal + (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF + (⌈s⌉₊ : ℝ) := by + unfold realRamificationIdeal + rw [hexponent] + unfold equalCharacteristicLubinTateRealLowerRamificationGroup + ext sigma + change + (∀ a, _ ∈ + realRamificationIdeal + (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF s) ↔ + ∀ a, _ ∈ + realRamificationIdeal + (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF + (⌈s⌉₊ : ℝ) + rw [hideal] + +/-- The inverse Herbrand function attached to the chosen complete-DVF +structure on an equal-characteristic Lubin--Tate level. -/ +noncomputable def equalCharacteristicLubinTateInverseHerbrandFunction + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) (t : ℝ) : ℝ := + inverseHerbrandFunctionOfUniqueExtension + (base := (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF) + (target := (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF) + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + F n) + t + +/-- At every integral upper endpoint visible at level `n + 1`, the chosen +inverse Herbrand function returns the lower endpoint `q^k - 1`. -/ +theorem + equalCharacteristicLubinTateInverseHerbrandFunction_nat_eq_pow_sub_one + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n k : ℕ) (hkn : k ≤ n + 1) : + equalCharacteristicLubinTateInverseHerbrandFunction F n (k : ℝ) = + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) := by + change + inverseHerbrandFunctionOfUniqueExtension + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + F n) + (k : ℝ) = + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) + rw [← equalCharacteristicLubinTateHerbrandFunction_pow_sub_one F n k hkn] + exact + inverseHerbrandFunctionOfUniqueExtension_eta + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + F n) + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) + +/-- On a lower-numbering power interval, the chosen lower group is the group +at the right endpoint `q^k - 1`. -/ +theorem + equalCharacteristicLubinTateRealLowerRamificationGroup_nat_eq_pow_sub_one_of_pow_interval + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n k r : ℕ) (hk : 1 ≤ k) + (hlow : Nat.card F.residueField ^ (k - 1) ≤ r) + (hhigh : r < Nat.card F.residueField ^ k) : + equalCharacteristicLubinTateRealLowerRamificationGroup F n (r : ℝ) = + equalCharacteristicLubinTateRealLowerRamificationGroup F n + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) := by + ext sigma + let e := equalCharacteristicLubinTateUnitParameterEquivGal F n + let a := e.symm sigma + have hsigma : e a = sigma := e.apply_symm_apply sigma + rw [← hsigma] + change + equalCharacteristicLubinTateUnitParameterToGal F n a ∈ + equalCharacteristicLubinTateRealLowerRamificationGroup F n (r : ℝ) ↔ + equalCharacteristicLubinTateUnitParameterToGal F n a ∈ + equalCharacteristicLubinTateRealLowerRamificationGroup F n + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) + rw [ + mem_equalCharacteristicLubinTateRealLowerRamificationGroup_nat_iff_coeff_zero_of_pow_interval + F n k r hk hlow hhigh a, + mem_equalCharacteristicLubinTateRealLowerRamificationGroup_pow_sub_one_iff_coeff_zero] + +/-- On the positive range visible at level `n + 1`, the chosen real upper +filtration is the natural-ceiling step extension of its integral values. -/ +theorem + equalCharacteristicLubinTateRealUpperRamificationGroup_eq_natCeil + (F : LocalField.{0, v} K₀) + [CharP K₀ F.residueCharacteristic] + (n : ℕ) (t : ℝ) + (hk : 1 ≤ ⌈t⌉₊) (hkn : ⌈t⌉₊ ≤ n + 1) : + equalCharacteristicLubinTateRealUpperRamificationGroup F n t = + equalCharacteristicLubinTateRealUpperRamificationGroup + F n (⌈t⌉₊ : ℝ) := by + let k : ℕ := ⌈t⌉₊ + let q : ℕ := Nat.card F.residueField + let ψ : ℝ → ℝ := + equalCharacteristicLubinTateInverseHerbrandFunction F n + have hk' : 1 ≤ k := by + simpa only [k] using hk + have hkn' : k ≤ n + 1 := by + simpa only [k] using hkn + have ht_interval : ((k - 1 : ℕ) : ℝ) < t ∧ t ≤ (k : ℝ) := by + apply (Nat.ceil_eq_iff (by omega : k ≠ 0)).mp + rfl + have hψ_strict : StrictMono ψ := by + dsimp only [ψ, equalCharacteristicLubinTateInverseHerbrandFunction] + exact + inverseHerbrandFunctionOfUniqueExtension_strictMono + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + F n) + have hψ_endpoint : + ∀ j : ℕ, j ≤ n + 1 → + ψ (j : ℝ) = ((q ^ j - 1 : ℕ) : ℝ) := by + intro j hj + simpa only [ψ, q] using + equalCharacteristicLubinTateInverseHerbrandFunction_nat_eq_pow_sub_one + F n j hj + have hψ_zero : ψ 0 = 0 := by + simpa using hψ_endpoint 0 (by omega) + have hψ_nonneg : 0 ≤ ψ t := by + calc + 0 = ψ 0 := hψ_zero.symm + _ ≤ ψ t := hψ_strict.monotone (by + exact (Nat.one_le_ceil_iff.mp hk).le) + have hψ_lower : + (((q ^ (k - 1) - 1 : ℕ) : ℝ)) < ψ t := by + calc + (((q ^ (k - 1) - 1 : ℕ) : ℝ)) = + ψ ((k - 1 : ℕ) : ℝ) := + (hψ_endpoint (k - 1) (by omega)).symm + _ < ψ t := hψ_strict ht_interval.1 + have hψ_upper : + ψ t ≤ ((q ^ k - 1 : ℕ) : ℝ) := by + calc + ψ t ≤ ψ (k : ℝ) := hψ_strict.monotone ht_interval.2 + _ = ((q ^ k - 1 : ℕ) : ℝ) := hψ_endpoint k hkn' + have hqone : 1 < q := by + simpa only [q] using + (Finite.one_lt_card : 1 < Nat.card F.residueField) + have hqpos : 0 < q := Nat.zero_lt_one.trans hqone + have hqpow_previous : 1 ≤ q ^ (k - 1) := by + exact + Nat.one_le_iff_ne_zero.mpr + (pow_ne_zero _ (Nat.ne_of_gt hqpos)) + have hqpow_current : 1 ≤ q ^ k := by + exact + Nat.one_le_iff_ne_zero.mpr + (pow_ne_zero _ (Nat.ne_of_gt hqpos)) + have hlow : q ^ (k - 1) ≤ ⌈ψ t⌉₊ := by + rw [← Nat.sub_add_cancel hqpow_previous] + exact Nat.add_one_le_ceil_iff.mpr hψ_lower + have hceil_upper : ⌈ψ t⌉₊ ≤ q ^ k - 1 := + Nat.ceil_le.mpr hψ_upper + have hhigh : ⌈ψ t⌉₊ < q ^ k := by + omega + change + equalCharacteristicLubinTateRealUpperRamificationGroup F n t = + equalCharacteristicLubinTateRealUpperRamificationGroup F n (k : ℝ) + rw [ + equalCharacteristicLubinTateRealUpperRamificationGroup_nat_eq_lower_pow_sub_one + F n k hkn'] + change + equalCharacteristicLubinTateRealLowerRamificationGroup F n (ψ t) = + equalCharacteristicLubinTateRealLowerRamificationGroup F n + ((q ^ k - 1 : ℕ) : ℝ) + calc + equalCharacteristicLubinTateRealLowerRamificationGroup F n (ψ t) = + equalCharacteristicLubinTateRealLowerRamificationGroup + F n (⌈ψ t⌉₊ : ℝ) := + equalCharacteristicLubinTateRealLowerRamificationGroup_eq_natCeil + F n (ψ t) hψ_nonneg + _ = + equalCharacteristicLubinTateRealLowerRamificationGroup F n + ((q ^ k - 1 : ℕ) : ℝ) := + equalCharacteristicLubinTateRealLowerRamificationGroup_nat_eq_pow_sub_one_of_pow_interval + F n k ⌈ψ t⌉₊ hk' hlow hhigh + +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta.lean new file mode 100644 index 0000000000..02ff26a032 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaCoefficients +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaUniqueness + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/All.lean new file mode 100644 index 0000000000..30ef7db1c5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/All.lean @@ -0,0 +1,20 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaCoefficients +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaUniqueness +/-! +# The theta construction in equal-characteristic Lubin--Tate theory + +Public aggregate for theta coefficients, the theta series, evaluation, and +the first theta identity. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaCoefficients.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaCoefficients.lean new file mode 100644 index 0000000000..b11fc8217c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaCoefficients.lean @@ -0,0 +1,411 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.LaurentSeriesFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.ContractingEquation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CoefficientFrobenius +public import Mathlib.FieldTheory.IsAlgClosed.Basic +public import Mathlib.RingTheory.PowerSeries.Basic +/-! +# LubinTate the equal-characteristic theta construction: equal-characteristic theta coefficients + +This file constructs the coefficient sources behind the power series +`theta` in the equal-characteristic specialization of the equal-characteristic theta construction. +For a finite field `k`, the completed maximal unramified coefficient ring of +`k((T))` is modeled by `(AlgebraicClosure k)[[T]]`, with arithmetic +Frobenius acting coefficientwise. + +The first construction solves the exact semilinear equation + +`phi(epsilon) = u * epsilon` + +for every unit `u in k[[T]]`. This is the linear coefficient equation forced +by `theta^phi o e_bar = e o theta` when `pi = u * bar_pi`. +-/ + +@[expose] public section + +noncomputable +section + + +open scoped PowerSeries Polynomial + +universe u + +namespace LubinTate +namespace EqualCharacteristic + +variable (k : Type u) [Field k] [Finite k] + +private theorem exists_frobenius_eq_mul_add + (a c : AlgebraicClosure k) : + ∃ x : AlgebraicClosure k, + x ^ Nat.card k = a * x + c := by + let q := Nat.card k + let P : Polynomial (AlgebraicClosure k) := + Polynomial.X ^ q - Polynomial.C a * Polynomial.X - Polynomial.C c + have hq : 1 < q := Finite.one_lt_card + have hmain : (Polynomial.X ^ q : Polynomial (AlgebraicClosure k)).Monic := + Polynomial.monic_X_pow q + have hlowerDegree : + (Polynomial.C a * Polynomial.X + Polynomial.C c : + Polynomial (AlgebraicClosure k)).degree < + (Polynomial.X ^ q : Polynomial (AlgebraicClosure k)).degree := by + rw [Polynomial.degree_X_pow] + apply lt_of_le_of_lt (Polynomial.degree_add_le _ _) + rw [max_lt_iff] + constructor + · by_cases ha : a = 0 + · simp [ha] + · rw [Polynomial.degree_C_mul_X ha] + exact_mod_cast hq + · by_cases hc : c = 0 + · simp [hc] + · rw [Polynomial.degree_C hc] + exact_mod_cast Nat.zero_lt_one.trans hq + have hPdegree : P.degree = (q : WithBot ℕ) := by + dsimp only [P] + rw [sub_sub] + rw [Polynomial.degree_sub_eq_left_of_degree_lt hlowerDegree, + Polynomial.degree_X_pow] + obtain ⟨x, hx⟩ := IsAlgClosed.exists_root P (by + rw [hPdegree] + exact_mod_cast + (ne_of_gt (Nat.zero_lt_one.trans hq))) + refine ⟨x, ?_⟩ + change Polynomial.eval x P = 0 at hx + have hxc : x ^ q - a * x = c := by + apply sub_eq_zero.mp + simpa [P, q] using hx + calc + x ^ Nat.card k = c + a * x := sub_eq_iff_eq_add.mp hxc + _ = a * x + c := add_comm _ _ + +variable {k} + +/-- The constant coefficient chosen for a solution of +`phi(epsilon)=u*epsilon`. -/ +noncomputable def chosenEqualCharacteristicSemilinearLeadingCoefficient + (u : k⟦X⟧) : + AlgebraicClosure k := + Classical.choose + (IsAlgClosed.exists_pow_nat_eq + (algebraMap k (AlgebraicClosure k) (PowerSeries.coeff 0 u)) + (Nat.sub_pos_of_lt (Finite.one_lt_card : 1 < Nat.card k))) + +/-- The chosen leading coefficient is a `(q - 1)`st root of the source constant term. -/ +theorem chosenEqualCharacteristicSemilinearLeadingCoefficient_pow + (u : k⟦X⟧) : + chosenEqualCharacteristicSemilinearLeadingCoefficient u ^ + (Nat.card k - 1) = + algebraMap k (AlgebraicClosure k) (PowerSeries.coeff 0 u) := + Classical.choose_spec + (IsAlgClosed.exists_pow_nat_eq + (algebraMap k (AlgebraicClosure k) (PowerSeries.coeff 0 u)) + (Nat.sub_pos_of_lt (Finite.one_lt_card : 1 < Nat.card k))) + +/-- A nonzero source constant term gives a nonzero chosen leading coefficient. -/ +theorem chosenEqualCharacteristicSemilinearLeadingCoefficient_ne_zero + (u : k⟦X⟧) (hu : PowerSeries.coeff 0 u ≠ 0) : + chosenEqualCharacteristicSemilinearLeadingCoefficient u ≠ 0 := by + intro hzero + have hpow := chosenEqualCharacteristicSemilinearLeadingCoefficient_pow u + rw [hzero, zero_pow] at hpow + · apply hu + apply (algebraMap k (AlgebraicClosure k)).injective + simpa using hpow.symm + · exact Nat.sub_ne_zero_of_lt + (Finite.one_lt_card : 1 < Nat.card k) + +/-- Coefficients of the exact semilinear solution. At stage `n+1`, the +new coefficient is chosen as a root of the separable additive polynomial +forced by the first `n+1` coefficient equations. -/ +noncomputable def chosenEqualCharacteristicSemilinearCoefficient + (u : k⟦X⟧) (hu : PowerSeries.coeff 0 u ≠ 0) : + (n : ℕ) → AlgebraicClosure k + | 0 => chosenEqualCharacteristicSemilinearLeadingCoefficient u + | n + 1 => + let a := algebraMap k (AlgebraicClosure k) (PowerSeries.coeff 0 u) + let c := ∑ j : Fin (n + 1), + algebraMap k (AlgebraicClosure k) (PowerSeries.coeff (j + 1) u) * + chosenEqualCharacteristicSemilinearCoefficient u hu (n - j) + Classical.choose + (show ∃ x : AlgebraicClosure k, x ^ Nat.card k = a * x + c from by + exact exists_frobenius_eq_mul_add k a c) +termination_by n => n +decreasing_by + all_goals exact Nat.lt_succ_of_le (Nat.sub_le _ _) + +/-- The zeroth semilinear coefficient is the chosen leading coefficient. -/ +@[simp] +theorem chosenEqualCharacteristicSemilinearCoefficient_zero + (u : k⟦X⟧) (hu : PowerSeries.coeff 0 u ≠ 0) : + chosenEqualCharacteristicSemilinearCoefficient u hu 0 = + chosenEqualCharacteristicSemilinearLeadingCoefficient u := by + rw [chosenEqualCharacteristicSemilinearCoefficient] + +/-- Successive semilinear coefficients satisfy the defining Frobenius recursion. -/ +theorem chosenEqualCharacteristicSemilinearCoefficient_succ + (u : k⟦X⟧) (hu : PowerSeries.coeff 0 u ≠ 0) (n : ℕ) : + chosenEqualCharacteristicSemilinearCoefficient u hu (n + 1) ^ Nat.card k = + algebraMap k (AlgebraicClosure k) (PowerSeries.coeff 0 u) * + chosenEqualCharacteristicSemilinearCoefficient u hu (n + 1) + + ∑ j : Fin (n + 1), + algebraMap k (AlgebraicClosure k) + (PowerSeries.coeff (j + 1) u) * + chosenEqualCharacteristicSemilinearCoefficient u hu (n - j) := by + rw [chosenEqualCharacteristicSemilinearCoefficient] + exact Classical.choose_spec + (exists_frobenius_eq_mul_add k + (algebraMap k (AlgebraicClosure k) (PowerSeries.coeff 0 u)) + (∑ j : Fin (n + 1), + algebraMap k (AlgebraicClosure k) + (PowerSeries.coeff (j + 1) u) * + chosenEqualCharacteristicSemilinearCoefficient u hu (n - j))) + +/-- The exact power-series solution of the semilinear Hilbert--90 equation +in the completed maximal unramified coefficient ring. -/ +noncomputable def equalCharacteristicSemilinearUnit + (u : k⟦X⟧) (hu : PowerSeries.coeff 0 u ≠ 0) : + (AlgebraicClosure k)⟦X⟧ := + PowerSeries.mk (chosenEqualCharacteristicSemilinearCoefficient u hu) + +/-- The semilinear unit records the recursively chosen coefficients. -/ +@[simp] +theorem equalCharacteristicSemilinearUnit_coeff + (u : k⟦X⟧) (hu : PowerSeries.coeff 0 u ≠ 0) (n : ℕ) : + PowerSeries.coeff n (equalCharacteristicSemilinearUnit u hu) = + chosenEqualCharacteristicSemilinearCoefficient u hu n := by + simp [equalCharacteristicSemilinearUnit] + +/-- The semilinear unit has nonzero constant coefficient. -/ +theorem equalCharacteristicSemilinearUnit_constantCoeff_ne_zero + (u : k⟦X⟧) (hu : PowerSeries.coeff 0 u ≠ 0) : + PowerSeries.coeff 0 (equalCharacteristicSemilinearUnit u hu) ≠ 0 := by + rw [equalCharacteristicSemilinearUnit_coeff, + chosenEqualCharacteristicSemilinearCoefficient_zero] + exact chosenEqualCharacteristicSemilinearLeadingCoefficient_ne_zero u hu + +/-- The completed theta-intertwining theorem, linear theta-coefficient equation: +`phi(epsilon) = u * epsilon`. -/ +theorem equalCharacteristicPowerSeriesFrobenius_semilinearUnit + (u : k⟦X⟧) (hu : PowerSeries.coeff 0 u ≠ 0) : + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicSemilinearUnit u hu) = + PowerSeries.map (algebraMap k (AlgebraicClosure k)) u * + equalCharacteristicSemilinearUnit u hu := by + apply PowerSeries.ext + intro n + rw [equalCharacteristicPowerSeriesFrobenius_coeff, + PowerSeries.coeff_mul, + Finset.Nat.sum_antidiagonal_eq_sum_range_succ_mk, + equalCharacteristicSemilinearUnit_coeff] + simp only [PowerSeries.coeff_map, + equalCharacteristicSemilinearUnit_coeff] + cases n with + | zero => + rw [chosenEqualCharacteristicSemilinearCoefficient_zero] + simp only [Finset.sum_range_one, Nat.zero_sub, + chosenEqualCharacteristicSemilinearCoefficient_zero] + calc + chosenEqualCharacteristicSemilinearLeadingCoefficient u ^ Nat.card k = + chosenEqualCharacteristicSemilinearLeadingCoefficient u ^ + (Nat.card k - 1) * + chosenEqualCharacteristicSemilinearLeadingCoefficient u := by + have hq : 1 < Nat.card k := Finite.one_lt_card + rw [← pow_succ] + congr 1 + omega + _ = algebraMap k (AlgebraicClosure k) (PowerSeries.coeff 0 u) * + chosenEqualCharacteristicSemilinearLeadingCoefficient u := by + rw [chosenEqualCharacteristicSemilinearLeadingCoefficient_pow] + | succ n => + rw [chosenEqualCharacteristicSemilinearCoefficient_succ, + Finset.sum_range_succ'] + simp only [Nat.sub_zero, Nat.succ_sub_succ_eq_sub] + rw [← Fin.sum_univ_eq_sum_range] + ac_rfl + +section ThetaRecursion + +variable (u : k⟦X⟧ˣ) + +/-- The image in the completed maximal-unramified coefficient ring of the +unit relating the two prime elements. -/ +noncomputable def equalCharacteristicCompletedUnit : + (AlgebraicClosure k)⟦X⟧ := + PowerSeries.map (algebraMap k (AlgebraicClosure k)) (u : k⟦X⟧) + +/-- We normalize the target prime to `T`; the source prime is therefore +`bar_pi = u^{-1} T`. -/ +noncomputable def equalCharacteristicCompletedSourceUniformizer : + (AlgebraicClosure k)⟦X⟧ := + PowerSeries.map (algebraMap k (AlgebraicClosure k)) ((u⁻¹ : k⟦X⟧ˣ) : k⟦X⟧) * + PowerSeries.X + +/-- The contracting coefficient +`gamma_j = bar_pi^(q^j) / T` in the `j`-th theta recursion. -/ +noncomputable def equalCharacteristicThetaGamma (j : ℕ) : + (AlgebraicClosure k)⟦X⟧ := + PowerSeries.map (algebraMap k (AlgebraicClosure k)) ((u⁻¹ : k⟦X⟧ˣ) : k⟦X⟧) ^ + (Nat.card k ^ j) * + PowerSeries.X ^ (Nat.card k ^ j - 1) + +/-- Positive-index theta gamma terms have zero constant coefficient. -/ +theorem equalCharacteristicThetaGamma_constantCoeff + (j : ℕ) (hj : 0 < j) : + PowerSeries.coeff 0 (equalCharacteristicThetaGamma u j) = 0 := by + have hq : 1 < Nat.card k := Finite.one_lt_card + have hpow : 0 < Nat.card k ^ j - 1 := + Nat.sub_pos_of_lt (Nat.one_lt_pow hj.ne' hq) + simp [equalCharacteristicThetaGamma, hpow.ne'] + +/-- Multiplying theta gamma by `X` gives the corresponding source-uniformizer power. -/ +theorem equalCharacteristicThetaGamma_mul_X + (j : ℕ) (hj : 0 < j) : + PowerSeries.X * equalCharacteristicThetaGamma u j = + equalCharacteristicCompletedSourceUniformizer u ^ (Nat.card k ^ j) := by + have hq : 1 < Nat.card k := Finite.one_lt_card + have hpow : 1 ≤ Nat.card k ^ j := + (Nat.one_lt_pow hj.ne' hq).le + rw [equalCharacteristicThetaGamma, + equalCharacteristicCompletedSourceUniformizer, mul_pow] + calc + PowerSeries.X * + (PowerSeries.map (algebraMap k (AlgebraicClosure k)) + (((u⁻¹ : k⟦X⟧ˣ) : k⟦X⟧)) ^ (Nat.card k ^ j) * + PowerSeries.X ^ (Nat.card k ^ j - 1)) = + PowerSeries.map (algebraMap k (AlgebraicClosure k)) + (((u⁻¹ : k⟦X⟧ˣ) : k⟦X⟧)) ^ (Nat.card k ^ j) * + (PowerSeries.X ^ (Nat.card k ^ j - 1) * PowerSeries.X) := by + ac_rfl + _ = PowerSeries.map (algebraMap k (AlgebraicClosure k)) + (((u⁻¹ : k⟦X⟧ˣ) : k⟦X⟧)) ^ (Nat.card k ^ j) * + PowerSeries.X ^ ((Nat.card k ^ j - 1) + 1) := by + rw [pow_succ] + _ = PowerSeries.map (algebraMap k (AlgebraicClosure k)) + (((u⁻¹ : k⟦X⟧ˣ) : k⟦X⟧)) ^ (Nat.card k ^ j) * + PowerSeries.X ^ (Nat.card k ^ j) := by + rw [Nat.sub_add_cancel hpow] + +/-- The numerator occurring on the right of the `j`-th theta recursion. -/ +noncomputable def equalCharacteristicThetaBetaNumerator + (b : (AlgebraicClosure k)⟦X⟧) : + (AlgebraicClosure k)⟦X⟧ := + equalCharacteristicPowerSeriesFrobenius k b - b ^ Nat.card k + +/-- The theta beta numerator has zero constant coefficient. -/ +theorem equalCharacteristicThetaBetaNumerator_constantCoeff + (b : (AlgebraicClosure k)⟦X⟧) : + PowerSeries.coeff 0 (equalCharacteristicThetaBetaNumerator b) = 0 := by + rw [equalCharacteristicThetaBetaNumerator, map_sub, + equalCharacteristicPowerSeriesFrobenius_coeff] + simp + +/-- The quotient +`beta(b) = (phi(b) - b^q) / T`. -/ +noncomputable def equalCharacteristicThetaBeta + (b : (AlgebraicClosure k)⟦X⟧) : + (AlgebraicClosure k)⟦X⟧ := + equalCharacteristicPowerSeriesTail + (equalCharacteristicThetaBetaNumerator b) + +/-- Multiplying theta beta by `X` recovers its numerator. -/ +theorem equalCharacteristicThetaBeta_mul_X + (b : (AlgebraicClosure k)⟦X⟧) : + PowerSeries.X * equalCharacteristicThetaBeta b = + equalCharacteristicThetaBetaNumerator b := by + have hsplit := equalCharacteristicPowerSeries_eq_X_mul_tail_add_C + (equalCharacteristicThetaBetaNumerator b) + rw [equalCharacteristicThetaBetaNumerator_constantCoeff] at hsplit + simp only [map_zero, add_zero] at hsplit + exact hsplit.symm + +/-- The coefficients `b_j` of the additive theta series +`theta(X)=sum_j b_j X^(q^j)`. The leading coefficient is the exact +semilinear unit constructed above; every later coefficient is the unique +contracting solution supplied by the contracting Frobenius equation. -/ +noncomputable def equalCharacteristicThetaCoefficient : + ℕ → (AlgebraicClosure k)⟦X⟧ + | 0 => equalCharacteristicSemilinearUnit (u : k⟦X⟧) + (by + intro hzero + have hunit := PowerSeries.isUnit_constantCoeff (u : k⟦X⟧) u.isUnit + apply hunit.ne_zero + simpa [PowerSeries.coeff_zero_eq_constantCoeff_apply] using hzero) + | j + 1 => + contractingFrobeniusEquationSolution + (equalCharacteristicCoefficientFrobenius k).toRingHom + (equalCharacteristicThetaGamma u (j + 1)) + (equalCharacteristicThetaBeta + (equalCharacteristicThetaCoefficient j)) + +/-- The zeroth theta coefficient is the semilinear source unit. -/ +@[simp] +theorem equalCharacteristicThetaCoefficient_zero : + equalCharacteristicThetaCoefficient u 0 = + equalCharacteristicSemilinearUnit (u : k⟦X⟧) + (by + intro hzero + have hunit := PowerSeries.isUnit_constantCoeff (u : k⟦X⟧) u.isUnit + apply hunit.ne_zero + simpa [PowerSeries.coeff_zero_eq_constantCoeff_apply] using hzero) := + rfl + +/-- The canonical contracting recursion for the non-leading theta +coefficients. -/ +theorem equalCharacteristicThetaCoefficient_succ_equation (j : ℕ) : + equalCharacteristicThetaCoefficient u (j + 1) - + equalCharacteristicThetaGamma u (j + 1) * + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicThetaCoefficient u (j + 1)) = + equalCharacteristicThetaBeta + (equalCharacteristicThetaCoefficient u j) := by + rw [equalCharacteristicThetaCoefficient] + have hgamma := equalCharacteristicThetaGamma_constantCoeff u + (j + 1) (Nat.zero_lt_succ j) + apply (sub_eq_iff_eq_add).2 + simpa [equalCharacteristicPowerSeriesFrobenius] using + (contractingFrobeniusEquationSolution_spec + (equalCharacteristicCoefficientFrobenius k).toRingHom + (equalCharacteristicThetaGamma u (j + 1)) + (equalCharacteristicThetaBeta + (equalCharacteristicThetaCoefficient u j)) hgamma) + +/-- Clearing the factor `T` gives the coefficient comparison in +`theta^phi o e_bar = e_T o theta`. -/ +theorem equalCharacteristicThetaCoefficient_succ_comparison (j : ℕ) : + PowerSeries.X * equalCharacteristicThetaCoefficient u (j + 1) - + equalCharacteristicCompletedSourceUniformizer u ^ + (Nat.card k ^ (j + 1)) * + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicThetaCoefficient u (j + 1)) = + equalCharacteristicThetaBetaNumerator + (equalCharacteristicThetaCoefficient u j) := by + have hrec := congrArg (fun z : (AlgebraicClosure k)⟦X⟧ ↦ + PowerSeries.X * z) + (equalCharacteristicThetaCoefficient_succ_equation u j) + change PowerSeries.X * + (equalCharacteristicThetaCoefficient u (j + 1) - + equalCharacteristicThetaGamma u (j + 1) * + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicThetaCoefficient u (j + 1))) = + PowerSeries.X * equalCharacteristicThetaBeta + (equalCharacteristicThetaCoefficient u j) at hrec + rw [mul_sub, ← mul_assoc, + equalCharacteristicThetaGamma_mul_X u (j + 1) (Nat.zero_lt_succ j), + equalCharacteristicThetaBeta_mul_X] at hrec + exact hrec + +end ThetaRecursion + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaEvaluation.lean new file mode 100644 index 0000000000..2ed2c1bacb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaEvaluation.lean @@ -0,0 +1,119 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CompletedUnramifiedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries +/-! +# Analytic evaluation for theta + +The theta series of the completed theta-intertwining theorem has coefficients in +`(AlgebraicClosure k)[[T]]`. This file evaluates it at a topologically +nilpotent element of the valued integer ring of the completed unramified +Laurent field. The value is accompanied by its convergent coefficient sum, +and the formal intertwining identity is transported through this genuine +analytic evaluation map. +-/ + +@[expose] public section + +noncomputable +section + +open scoped LaurentSeries PowerSeries PowerSeries.WithPiTopology Topology Valued WithZero + + +universe u + +namespace LubinTate +namespace EqualCharacteristic + +variable (k : Type u) [Field k] [Finite k] + +omit [Finite k] in +/-- The algebraic closure of the coefficient field carries the discrete uniformity. -/ +noncomputable local instance equalCharacteristicThetaEvaluationCoefficientUniformSpace : + UniformSpace (AlgebraicClosure k) := ⊥ + +noncomputable local instance equalCharacteristicThetaEvaluationLinearTopology : + IsLinearTopology + (Valued.integer (equalCharacteristicCompletedUnramifiedField k)) + (Valued.integer (equalCharacteristicCompletedUnramifiedField k)) := + valuedIntegerLinearTopology + +noncomputable local instance equalCharacteristicThetaEvaluationCompleteSpace : + CompleteSpace + (Valued.integer (equalCharacteristicCompletedUnramifiedField k)) := + valuedIntegerCompleteSpace + +noncomputable local instance equalCharacteristicThetaEvaluationUniformAddGroup : + IsUniformAddGroup + (Valued.integer (equalCharacteristicCompletedUnramifiedField k)) := + valuedIntegerIsUniformAddGroup + +/-- The analytic value of the theta series at a topologically nilpotent +element of the completed-unramified integer ring. -/ +noncomputable def equalCharacteristicCompletedThetaValue + (u : k⟦X⟧ˣ) + (a : Valued.integer (equalCharacteristicCompletedUnramifiedField k)) + (ha : PowerSeries.HasEval a) : + Valued.integer (equalCharacteristicCompletedUnramifiedField k) := + equalCharacteristicCompletedIntegerEvaluation k a ha + (equalCharacteristicThetaSeries u) + +/-- The defining coefficient series for the analytic theta value converges. +This records every natural degree, including the zero coefficients away from +the additive exponents `q^j`. -/ +theorem equalCharacteristicCompletedThetaValue_hasSum + (u : k⟦X⟧ˣ) + (a : Valued.integer (equalCharacteristicCompletedUnramifiedField k)) + (ha : PowerSeries.HasEval a) : + HasSum + (fun n : ℕ ↦ + equalCharacteristicPowerSeriesToCompletedInteger k + (PowerSeries.coeff n (equalCharacteristicThetaSeries u)) * + a ^ n) + (equalCharacteristicCompletedThetaValue k u a ha) := by + rw [equalCharacteristicCompletedThetaValue, + equalCharacteristicCompletedIntegerEvaluation, + PowerSeries.coe_eval₂Hom] + exact PowerSeries.hasSum_eval₂ + (equalCharacteristicPowerSeriesToCompletedInteger_continuous k) + ha (equalCharacteristicThetaSeries u) + +/-- Analytic evaluation of the theta intertwining identity. The right-hand +formal composition is evaluated explicitly as +`theta(a)^q + T * theta(a)` in the completed-unramified integer ring. -/ +theorem equalCharacteristicThetaSeries_intertwines_evaluated + (u : k⟦X⟧ˣ) + (a : Valued.integer (equalCharacteristicCompletedUnramifiedField k)) + (ha : PowerSeries.HasEval a) : + equalCharacteristicCompletedIntegerEvaluation k a ha + (PowerSeries.subst + (equalCharacteristicCompletedLubinTateSeries (k := k) + (equalCharacteristicCompletedSourceUniformizer u)) + (equalCharacteristicThetaSeriesFrobenius u)) = + equalCharacteristicCompletedThetaValue k u a ha ^ Nat.card k + + equalCharacteristicCompletedIntegerUniformizer k * + equalCharacteristicCompletedThetaValue k u a ha := by + rw [equalCharacteristicThetaSeries_intertwines u] + have htheta := equalCharacteristicThetaSeries_hasSubst u + rw [equalCharacteristicCompletedLubinTateSeries, + ← PowerSeries.smul_eq_C_mul, + PowerSeries.subst_add htheta, + PowerSeries.subst_pow htheta, + PowerSeries.subst_smul htheta, + PowerSeries.subst_X htheta, + PowerSeries.smul_eq_C_mul] + simp only [map_add, map_pow, map_mul, + equalCharacteristicCompletedIntegerEvaluation_C, + equalCharacteristicCompletedThetaValue, + equalCharacteristicCompletedIntegerUniformizer] + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaFirstIdentity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaFirstIdentity.lean new file mode 100644 index 0000000000..115d00a070 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaFirstIdentity.lean @@ -0,0 +1,765 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaUniqueness +/-! +# The Lubin–Tate endomorphism commutation law: the first theta identity in equal characteristic + +For the normalization `pi = T` and `bar_pi = u⁻¹ T`, this file constructs +the Lubin--Tate endomorphism `[u]` over the base integer ring `k[[T]]` and +proves the first identity of Corollary the Lubin–Tate endomorphism commutation law, + +`theta^phi = theta o [u]`. + +The endomorphism `[u]` is constructed independently from `theta`: its +linear coefficient is `u`, and its higher additive coefficients are the +unique contracting solutions forced by commutation with +`Y^q + bar_pi Y`. +-/ + +@[expose] public section + +noncomputable +section + +open scoped PowerSeries + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +variable {k : Type u} [Field k] [Finite k] + +/-- The source prime `bar_pi = u⁻¹ T`, before extension of coefficients to +the completed maximal unramified ring. -/ +noncomputable def equalCharacteristicSourceUniformizer + (u : k⟦X⟧ˣ) : k⟦X⟧ := + ((u⁻¹ : k⟦X⟧ˣ) : k⟦X⟧) * PowerSeries.X + +/-- The contracting coefficient obtained after dividing the commutation +equation for `[u]` by `bar_pi`. -/ +noncomputable def equalCharacteristicSourceBracketGamma + (u : k⟦X⟧ˣ) (j : ℕ) : k⟦X⟧ := + (u : k⟦X⟧) * + ((u⁻¹ : k⟦X⟧ˣ) : k⟦X⟧) ^ (Nat.card k ^ j) * + PowerSeries.X ^ (Nat.card k ^ j - 1) + +/-- Positive-index source bracket gamma terms have zero constant coefficient. -/ +theorem equalCharacteristicSourceBracketGamma_constantCoeff + (u : k⟦X⟧ˣ) (j : ℕ) (hj : 0 < j) : + PowerSeries.coeff 0 (equalCharacteristicSourceBracketGamma u j) = 0 := by + have hq : 1 < Nat.card k := Finite.one_lt_card + have hpow : 0 < Nat.card k ^ j - 1 := + Nat.sub_pos_of_lt (Nat.one_lt_pow hj.ne' hq) + simp [equalCharacteristicSourceBracketGamma, hpow.ne'] + +/-- The numerator on the right of the coefficient equation for `[u]`. -/ +noncomputable def equalCharacteristicSourceBracketNumerator + (a : k⟦X⟧) : k⟦X⟧ := + a - a ^ Nat.card k + +/-- The source bracket numerator has zero constant coefficient. -/ +theorem equalCharacteristicSourceBracketNumerator_constantCoeff + (a : k⟦X⟧) : + PowerSeries.coeff 0 (equalCharacteristicSourceBracketNumerator a) = 0 := by + let : Fintype k := Fintype.ofFinite k + rw [PowerSeries.coeff_zero_eq_constantCoeff_apply, + equalCharacteristicSourceBracketNumerator, + map_sub, map_pow, Nat.card_eq_fintype_card, + FiniteField.pow_card, sub_self] + +/-- Division of `a-a^q` by `bar_pi = u⁻¹T`. -/ +noncomputable def equalCharacteristicSourceBracketBeta + (u : k⟦X⟧ˣ) (a : k⟦X⟧) : k⟦X⟧ := + (u : k⟦X⟧) * + equalCharacteristicPowerSeriesTail + (equalCharacteristicSourceBracketNumerator a) + +/-- The additive coefficients of the Lubin--Tate endomorphism `[u]` for +the source series `Y^q + (u⁻¹T)Y`. -/ +noncomputable def equalCharacteristicSourceBracketCoefficient + (u : k⟦X⟧ˣ) : ℕ → k⟦X⟧ + | 0 => (u : k⟦X⟧) + | j + 1 => + contractingFrobeniusEquationSolution (R := k) + (RingHom.id k) + (equalCharacteristicSourceBracketGamma u (j + 1)) + (equalCharacteristicSourceBracketBeta u + (equalCharacteristicSourceBracketCoefficient u j)) + +omit [Finite k] in +/-- The zeroth source bracket coefficient is the source unit itself. -/ +@[simp] +theorem equalCharacteristicSourceBracketCoefficient_zero + (u : k⟦X⟧ˣ) : + equalCharacteristicSourceBracketCoefficient u 0 = (u : k⟦X⟧) := + rfl + +/-- Successive source bracket coefficients satisfy the defining Artin–Schreier equation. -/ +theorem equalCharacteristicSourceBracketCoefficient_succ_equation + (u : k⟦X⟧ˣ) (j : ℕ) : + equalCharacteristicSourceBracketCoefficient u (j + 1) - + equalCharacteristicSourceBracketGamma u (j + 1) * + equalCharacteristicSourceBracketCoefficient u (j + 1) = + equalCharacteristicSourceBracketBeta u + (equalCharacteristicSourceBracketCoefficient u j) := by + rw [equalCharacteristicSourceBracketCoefficient] + have hgamma := equalCharacteristicSourceBracketGamma_constantCoeff + u (j + 1) (Nat.zero_lt_succ j) + apply (sub_eq_iff_eq_add).2 + simpa using + (contractingFrobeniusEquationSolution_spec (R := k) + (RingHom.id k) + (equalCharacteristicSourceBracketGamma u (j + 1)) + (equalCharacteristicSourceBracketBeta u + (equalCharacteristicSourceBracketCoefficient u j)) hgamma) + +/-- The coefficient comparison equivalent to commutation of `[u]` with +`Y^q + bar_pi Y`. -/ +theorem equalCharacteristicSourceBracketCoefficient_succ_comparison + (u : k⟦X⟧ˣ) (j : ℕ) : + equalCharacteristicSourceUniformizer u * + equalCharacteristicSourceBracketCoefficient u (j + 1) - + equalCharacteristicSourceUniformizer u ^ + (Nat.card k ^ (j + 1)) * + equalCharacteristicSourceBracketCoefficient u (j + 1) = + equalCharacteristicSourceBracketCoefficient u j - + equalCharacteristicSourceBracketCoefficient u j ^ Nat.card k := by + let qj := Nat.card k ^ (j + 1) + let a := equalCharacteristicSourceBracketCoefficient u (j + 1) + let b := equalCharacteristicSourceBracketCoefficient u j + let v : k⟦X⟧ := ((u⁻¹ : k⟦X⟧ˣ) : k⟦X⟧) + have hqj : 1 ≤ qj := by + exact Nat.one_le_iff_ne_zero.mpr + (pow_ne_zero _ Nat.card_pos.ne') + have hvu : v * (u : k⟦X⟧) = 1 := by + change (((u⁻¹ * u : k⟦X⟧ˣ) : k⟦X⟧)) = 1 + simp + have hpiGamma : + equalCharacteristicSourceUniformizer u * + equalCharacteristicSourceBracketGamma u (j + 1) = + equalCharacteristicSourceUniformizer u ^ qj := by + rw [equalCharacteristicSourceUniformizer, + equalCharacteristicSourceBracketGamma, mul_pow] + change (v * PowerSeries.X) * + ((u : k⟦X⟧) * v ^ qj * PowerSeries.X ^ (qj - 1)) = + v ^ qj * PowerSeries.X ^ qj + calc + _ = (v * (u : k⟦X⟧)) * v ^ qj * + (PowerSeries.X ^ (qj - 1) * PowerSeries.X) := by + ac_rfl + _ = v ^ qj * PowerSeries.X ^ qj := by + rw [hvu, one_mul, ← pow_succ, Nat.sub_add_cancel hqj] + have htail : + PowerSeries.X * + equalCharacteristicPowerSeriesTail + (equalCharacteristicSourceBracketNumerator b) = + equalCharacteristicSourceBracketNumerator b := by + have hsplit := equalCharacteristicPowerSeries_eq_X_mul_tail_add_C + (equalCharacteristicSourceBracketNumerator b) + rw [equalCharacteristicSourceBracketNumerator_constantCoeff] at hsplit + simpa only [map_zero, add_zero] using hsplit.symm + have hpiBeta : + equalCharacteristicSourceUniformizer u * + equalCharacteristicSourceBracketBeta u b = + equalCharacteristicSourceBracketNumerator b := by + rw [equalCharacteristicSourceUniformizer, + equalCharacteristicSourceBracketBeta] + change (v * PowerSeries.X) * + ((u : k⟦X⟧) * + equalCharacteristicPowerSeriesTail + (equalCharacteristicSourceBracketNumerator b)) = _ + calc + _ = (v * (u : k⟦X⟧)) * + (PowerSeries.X * + equalCharacteristicPowerSeriesTail + (equalCharacteristicSourceBracketNumerator b)) := by + ac_rfl + _ = _ := by rw [hvu, one_mul, htail] + have hrec := congrArg + (fun z : k⟦X⟧ ↦ equalCharacteristicSourceUniformizer u * z) + (equalCharacteristicSourceBracketCoefficient_succ_equation u j) + change equalCharacteristicSourceUniformizer u * + (a - equalCharacteristicSourceBracketGamma u (j + 1) * a) = + equalCharacteristicSourceUniformizer u * + equalCharacteristicSourceBracketBeta u b at hrec + rw [mul_sub, ← mul_assoc, hpiGamma, hpiBeta] at hrec + simpa [a, b, qj, equalCharacteristicSourceBracketNumerator] using hrec + +/-- The Lubin--Tate endomorphism `[u]` over the base integer ring. -/ +noncomputable def equalCharacteristicSourceBracket + (u : k⟦X⟧ˣ) : (k⟦X⟧)⟦X⟧ := + equalCharacteristicQAdditiveSeries k + (equalCharacteristicSourceBracketCoefficient u) + +/-- The source bracket coefficient at `q ^ j` is its `j`th recursive coefficient. -/ +@[simp] +theorem equalCharacteristicSourceBracket_coeff_pow + (u : k⟦X⟧ˣ) (j : ℕ) : + PowerSeries.coeff (Nat.card k ^ j) + (equalCharacteristicSourceBracket u) = + equalCharacteristicSourceBracketCoefficient u j := by + exact equalCharacteristicQAdditiveSeries_coeff_pow k _ j + +/-- The source bracket has zero constant coefficient. -/ +@[simp] +theorem equalCharacteristicSourceBracket_constantCoeff + (u : k⟦X⟧ˣ) : + PowerSeries.constantCoeff (equalCharacteristicSourceBracket u) = 0 := by + exact equalCharacteristicQAdditiveSeries_constantCoeff k _ + +/-- The source bracket may be substituted into another power series. -/ +theorem equalCharacteristicSourceBracket_hasSubst + (u : k⟦X⟧ˣ) : + PowerSeries.HasSubst (equalCharacteristicSourceBracket u) := + PowerSeries.HasSubst.of_constantCoeff_zero' + (equalCharacteristicSourceBracket_constantCoeff u) + +/-- Coefficients of `[u]` after passing to the completed maximal unramified +integer ring. -/ +noncomputable def equalCharacteristicCompletedSourceBracketCoefficient + (u : k⟦X⟧ˣ) (j : ℕ) : (AlgebraicClosure k)⟦X⟧ := + PowerSeries.map (algebraMap k (AlgebraicClosure k)) + (equalCharacteristicSourceBracketCoefficient u j) + +/-- The same base-defined Lubin--Tate endomorphism `[u]`, viewed over the +completed maximal unramified integer ring. -/ +noncomputable def equalCharacteristicCompletedSourceBracket + (u : k⟦X⟧ˣ) : ((AlgebraicClosure k)⟦X⟧)⟦X⟧ := + equalCharacteristicQAdditiveSeries k + (equalCharacteristicCompletedSourceBracketCoefficient u) + +/-- The completed source bracket records its `j`th coefficient at exponent `q ^ j`. -/ +@[simp] +theorem equalCharacteristicCompletedSourceBracket_coeff_pow + (u : k⟦X⟧ˣ) (j : ℕ) : + PowerSeries.coeff (Nat.card k ^ j) + (equalCharacteristicCompletedSourceBracket u) = + equalCharacteristicCompletedSourceBracketCoefficient u j := by + exact equalCharacteristicQAdditiveSeries_coeff_pow k _ j + +/-- The completed source bracket has zero constant coefficient. -/ +@[simp] +theorem equalCharacteristicCompletedSourceBracket_constantCoeff + (u : k⟦X⟧ˣ) : + PowerSeries.constantCoeff + (equalCharacteristicCompletedSourceBracket u) = 0 := by + exact equalCharacteristicQAdditiveSeries_constantCoeff k _ + +/-- The completed source bracket is valid as a substitution series. -/ +theorem equalCharacteristicCompletedSourceBracket_hasSubst + (u : k⟦X⟧ˣ) : + PowerSeries.HasSubst (equalCharacteristicCompletedSourceBracket u) := + PowerSeries.HasSubst.of_constantCoeff_zero' + (equalCharacteristicCompletedSourceBracket_constantCoeff u) + +omit [Finite k] in +/-- The zeroth completed bracket coefficient is the scalar extension of the source unit. -/ +@[simp] +theorem equalCharacteristicCompletedSourceBracketCoefficient_zero + (u : k⟦X⟧ˣ) : + equalCharacteristicCompletedSourceBracketCoefficient u 0 = + PowerSeries.map (algebraMap k (AlgebraicClosure k)) (u : k⟦X⟧) := by + simp [equalCharacteristicCompletedSourceBracketCoefficient] + +omit [Finite k] in +/-- Scalar extension sends the source uniformizer to its completed counterpart. -/ +theorem equalCharacteristicSourceUniformizer_map + (u : k⟦X⟧ˣ) : + PowerSeries.map (algebraMap k (AlgebraicClosure k)) + (equalCharacteristicSourceUniformizer u) = + equalCharacteristicCompletedSourceUniformizer u := by + simp [equalCharacteristicSourceUniformizer, + equalCharacteristicCompletedSourceUniformizer] + +/-- Frobenius fixes every coefficient coming from the base integer ring. -/ +theorem equalCharacteristicPowerSeriesFrobenius_map_algebraMap + (a : k⟦X⟧) : + equalCharacteristicPowerSeriesFrobenius k + (PowerSeries.map (algebraMap k (AlgebraicClosure k)) a) = + PowerSeries.map (algebraMap k (AlgebraicClosure k)) a := by + let : Fintype k := Fintype.ofFinite k + apply PowerSeries.ext + intro n + rw [equalCharacteristicPowerSeriesFrobenius_coeff, + PowerSeries.coeff_map] + calc + (algebraMap k (AlgebraicClosure k) (PowerSeries.coeff n a)) ^ + Nat.card k = + algebraMap k (AlgebraicClosure k) + ((PowerSeries.coeff n a) ^ Nat.card k) := by + rw [map_pow] + _ = _ := by + rw [Nat.card_eq_fintype_card, + FiniteField.pow_card] + +/-- In particular the base-defined endomorphism `[u]` is fixed by +coefficient Frobenius. -/ +theorem equalCharacteristicCompletedSourceBracket_frobenius + (u : k⟦X⟧ˣ) : + PowerSeries.map (equalCharacteristicPowerSeriesFrobenius k) + (equalCharacteristicCompletedSourceBracket u) = + equalCharacteristicCompletedSourceBracket u := by + rw [equalCharacteristicCompletedSourceBracket, + equalCharacteristicQAdditiveSeries_map] + congr 1 + funext j + exact equalCharacteristicPowerSeriesFrobenius_map_algebraMap + (equalCharacteristicSourceBracketCoefficient u j) + +/-- The coefficient equation for `[u]`, after extension to the completed +maximal unramified integer ring. -/ +theorem equalCharacteristicCompletedSourceBracketCoefficient_succ_comparison + (u : k⟦X⟧ˣ) (j : ℕ) : + equalCharacteristicCompletedSourceUniformizer u * + equalCharacteristicCompletedSourceBracketCoefficient u (j + 1) - + equalCharacteristicCompletedSourceUniformizer u ^ + (Nat.card k ^ (j + 1)) * + equalCharacteristicCompletedSourceBracketCoefficient u (j + 1) = + equalCharacteristicCompletedSourceBracketCoefficient u j - + equalCharacteristicCompletedSourceBracketCoefficient u j ^ Nat.card k := by + have h := congrArg + (PowerSeries.map (algebraMap k (AlgebraicClosure k))) + (equalCharacteristicSourceBracketCoefficient_succ_comparison u j) + simpa [equalCharacteristicCompletedSourceBracketCoefficient, + map_sub, map_mul, map_pow, + equalCharacteristicSourceUniformizer_map] using h + +/-- The Lubin–Tate endomorphism commutation law: the independently constructed `[u]` commutes +with the +source Lubin--Tate series `Y^q + (u⁻¹T)Y`. -/ +theorem equalCharacteristicCompletedSourceBracket_commutes + (u : k⟦X⟧ˣ) : + PowerSeries.subst (equalCharacteristicCompletedSourceBracket u) + (equalCharacteristicCompletedLubinTateSeries (k := k) + (equalCharacteristicCompletedSourceUniformizer u)) = + PowerSeries.subst + (equalCharacteristicCompletedLubinTateSeries (k := k) + (equalCharacteristicCompletedSourceUniformizer u)) + (equalCharacteristicCompletedSourceBracket u) := by + rw [equalCharacteristicCompletedSourceBracket, + equalCharacteristicCompletedLubinTateSeries_subst_qAdditiveSeries, + equalCharacteristicQAdditiveSeries_subst_completedLubinTateSeries] + congr 1 + funext j + cases j with + | zero => + simp [equalCharacteristicLubinTatePostcompositionCoefficient, + equalCharacteristicLubinTateSubstitutionCoefficient, mul_comm] + | succ j => + rw [equalCharacteristicLubinTatePostcompositionCoefficient, + equalCharacteristicLubinTateSubstitutionCoefficient] + have h := + equalCharacteristicCompletedSourceBracketCoefficient_succ_comparison + u j + linear_combination h + +section QAdditiveComposition + +variable {R : Type v} [CommRing R] [Nontrivial R] [Algebra k R] + +/-- A `q^i`-th power shifts additive exponents by `i`; the coefficient at +`q^n` is zero for `n + simp + | succ i ih => + rw [pow_succ, pow_mul, ih, + equalCharacteristicQAdditiveSeries_pow_card] + congr 1 + funext n + cases n with + | zero => + simp [equalCharacteristicQAdditiveShift] + | succ n => + by_cases hin : i ≤ n + · have hisucc : i + 1 ≤ n + 1 := Nat.succ_le_succ hin + simp [equalCharacteristicQAdditiveShift, hin, hisucc, + pow_mul] + · have hisucc : ¬ i + 1 ≤ n + 1 := by omega + simp [equalCharacteristicQAdditiveShift, hin, hisucc, + Nat.card_pos.ne'] + +/-- Coefficient form of the preceding shift formula. -/ +theorem equalCharacteristicQAdditiveSeries_pow_card_pow_coeff + (a : ℕ → R) (i n : ℕ) : + PowerSeries.coeff (Nat.card k ^ n) + (equalCharacteristicQAdditiveSeries k a ^ (Nat.card k ^ i)) = + if i ≤ n then a (n - i) ^ (Nat.card k ^ i) else 0 := by + rw [equalCharacteristicQAdditiveSeries_pow_card_pow, + equalCharacteristicQAdditiveSeries_coeff_pow] + +/-- The finite convolution of coefficients occurring in the composition +of two `q`-additive series. -/ +def equalCharacteristicQAdditiveCompositionCoefficient + (b a : ℕ → R) (n : ℕ) : R := + ∑ i ∈ Finset.range (n + 1), + b i * a (n - i) ^ (Nat.card k ^ i) + +/-- Composition of two `q`-additive series is again `q`-additive, with the +usual finite Frobenius convolution of coefficients. -/ +theorem equalCharacteristicQAdditiveSeries_subst_qAdditiveSeries + (b a : ℕ → R) : + PowerSeries.subst (equalCharacteristicQAdditiveSeries k a) + (equalCharacteristicQAdditiveSeries k b) = + equalCharacteristicQAdditiveSeries k + (equalCharacteristicQAdditiveCompositionCoefficient (k := k) b a) := by + let A := equalCharacteristicQAdditiveSeries k a + let B := equalCharacteristicQAdditiveSeries k b + have hA : PowerSeries.HasSubst A := + PowerSeries.HasSubst.of_constantCoeff_zero' + (equalCharacteristicQAdditiveSeries_constantCoeff k a) + apply PowerSeries.ext + intro n + by_cases hn : IsEqualCharacteristicAdditiveExponent k n + · obtain ⟨r, rfl⟩ := hn + rw [equalCharacteristicQAdditiveSeries_coeff_pow, + PowerSeries.coeff_subst' hA] + let F : ℕ → R := fun d ↦ + PowerSeries.coeff d B • + PowerSeries.coeff (Nat.card k ^ r) (A ^ d) + change ∑ᶠ d : ℕ, F d = _ + have hsupport : Function.support F ⊆ + (((Finset.range (r + 1)).image (fun i ↦ Nat.card k ^ i) : + Finset ℕ) : Set ℕ) := by + intro d hd + change F d ≠ 0 at hd + by_cases hde : IsEqualCharacteristicAdditiveExponent k d + · obtain ⟨i, rfl⟩ := hde + by_cases hir : i ≤ r + · exact Finset.mem_coe.mpr (Finset.mem_image.mpr + ⟨i, Finset.mem_range.mpr (Nat.lt_succ_iff.mpr hir), rfl⟩) + · have hzero := + equalCharacteristicQAdditiveSeries_pow_card_pow_coeff + (k := k) a i r + rw [ite_eq_right hir] at hzero + simp [F, A, hzero] at hd + · have hzero := + equalCharacteristicQAdditiveSeries_coeff_eq_zero k b d hde + simp [F, B, hzero] at hd + rw [finsum_eq_sum_of_support_subset F hsupport, + Finset.sum_image] + · simp only [F, A, B, + equalCharacteristicQAdditiveSeries_coeff_pow, + equalCharacteristicQAdditiveSeries_pow_card_pow_coeff, + equalCharacteristicQAdditiveCompositionCoefficient] + apply Finset.sum_congr rfl + intro i hi + have hir : i ≤ r := by + exact Nat.lt_succ_iff.mp (Finset.mem_range.mp hi) + simp [hir, smul_eq_mul] + · intro i hi j hj hij + exact (natCard_pow_injective k hij) + · rw [equalCharacteristicQAdditiveSeries_coeff_eq_zero k _ n hn, + PowerSeries.coeff_subst' hA, + finsum_eq_zero_of_forall_eq_zero] + intro d + by_cases hde : IsEqualCharacteristicAdditiveExponent k d + · obtain ⟨i, rfl⟩ := hde + rw [equalCharacteristicQAdditiveSeries_pow_card_pow] + have hzero := equalCharacteristicQAdditiveSeries_coeff_eq_zero + k (fun m ↦ if i ≤ m then a (m - i) ^ (Nat.card k ^ i) else 0) + n hn + simp [hzero] + · rw [equalCharacteristicQAdditiveSeries_coeff_eq_zero k b d hde] + simp + +end QAdditiveComposition + +/-- Coefficients of `theta o [u]`. The sum is finite at every additive +exponent. -/ +noncomputable def equalCharacteristicThetaAfterBracketCoefficient + (u : k⟦X⟧ˣ) : ℕ → (AlgebraicClosure k)⟦X⟧ := + equalCharacteristicQAdditiveCompositionCoefficient (k := k) + (equalCharacteristicThetaCoefficient u) + (equalCharacteristicCompletedSourceBracketCoefficient u) + +/-- The formal composite `theta o [u]` is the additive series with the +preceding finite convolution coefficients. -/ +theorem equalCharacteristicThetaSeries_subst_sourceBracket + (u : k⟦X⟧ˣ) : + PowerSeries.subst (equalCharacteristicCompletedSourceBracket u) + (equalCharacteristicThetaSeries u) = + equalCharacteristicQAdditiveSeries k + (equalCharacteristicThetaAfterBracketCoefficient u) := by + exact equalCharacteristicQAdditiveSeries_subst_qAdditiveSeries + (k := k) (equalCharacteristicThetaCoefficient u) + (equalCharacteristicCompletedSourceBracketCoefficient u) + +/-- The linear term of `theta o [u]` is `phi(b₀)`, by the semilinear +equation `phi(b₀)=u b₀`. -/ +theorem equalCharacteristicThetaAfterBracketCoefficient_zero + (u : k⟦X⟧ˣ) : + equalCharacteristicThetaAfterBracketCoefficient u 0 = + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicThetaCoefficient u 0) := by + have hsemi := equalCharacteristicPowerSeriesFrobenius_semilinearUnit + (k := k) (u : k⟦X⟧) + (by + intro hzero + have hunit := PowerSeries.isUnit_constantCoeff (u : k⟦X⟧) u.isUnit + apply hunit.ne_zero + simpa [PowerSeries.coeff_zero_eq_constantCoeff_apply] using hzero) + rw [equalCharacteristicThetaCoefficient_zero] + simpa [equalCharacteristicThetaAfterBracketCoefficient, + equalCharacteristicQAdditiveCompositionCoefficient, + equalCharacteristicCompletedSourceBracketCoefficient] using + (mul_comm _ _).trans hsemi.symm + +/-- The first-identity candidate `theta o [u]` satisfies the same +Frobenius-intertwining equation as `theta^phi`. This is the formal-series +calculation in the proof of Corollary the Lubin–Tate endomorphism commutation law. -/ +theorem equalCharacteristicThetaSeries_subst_sourceBracket_intertwines + (u : k⟦X⟧ˣ) : + PowerSeries.subst + (equalCharacteristicCompletedLubinTateSeries (k := k) + (equalCharacteristicCompletedSourceUniformizer u)) + (PowerSeries.map (equalCharacteristicPowerSeriesFrobenius k) + (PowerSeries.subst (equalCharacteristicCompletedSourceBracket u) + (equalCharacteristicThetaSeries u))) = + PowerSeries.subst + (PowerSeries.subst (equalCharacteristicCompletedSourceBracket u) + (equalCharacteristicThetaSeries u)) + (equalCharacteristicCompletedLubinTateSeries + (k := k) PowerSeries.X) := by + let H := equalCharacteristicCompletedSourceBracket u + let Ebar := equalCharacteristicCompletedLubinTateSeries (k := k) + (equalCharacteristicCompletedSourceUniformizer u) + let E := equalCharacteristicCompletedLubinTateSeries + (k := k) (PowerSeries.X : (AlgebraicClosure k)⟦X⟧) + let Theta := equalCharacteristicThetaSeries u + let ThetaF := equalCharacteristicThetaSeriesFrobenius u + have hH : PowerSeries.HasSubst H := + equalCharacteristicCompletedSourceBracket_hasSubst u + have hEbar : PowerSeries.HasSubst Ebar := + equalCharacteristicCompletedLubinTateSeries_hasSubst + (equalCharacteristicCompletedSourceUniformizer u) + have hTheta : PowerSeries.HasSubst Theta := + equalCharacteristicThetaSeries_hasSubst u + have hmap : + PowerSeries.map (equalCharacteristicPowerSeriesFrobenius k) + (PowerSeries.subst H Theta) = + PowerSeries.subst H ThetaF := by + change (PowerSeries.subst H Theta).map + (equalCharacteristicPowerSeriesFrobenius k) = _ + rw [PowerSeries.map_subst hH] + have hHfixed : + PowerSeries.map (equalCharacteristicPowerSeriesFrobenius k) H = H := by + simpa only [H] using + equalCharacteristicCompletedSourceBracket_frobenius u + change MvPowerSeries.map + (equalCharacteristicPowerSeriesFrobenius k) H = H at hHfixed + rw [hHfixed] + rfl + change PowerSeries.subst Ebar + (PowerSeries.map (equalCharacteristicPowerSeriesFrobenius k) + (PowerSeries.subst H Theta)) = + PowerSeries.subst (PowerSeries.subst H Theta) E + calc + _ = PowerSeries.subst Ebar (PowerSeries.subst H ThetaF) := by rw [hmap] + _ = PowerSeries.subst (PowerSeries.subst Ebar H) ThetaF := + PowerSeries.subst_comp_subst_apply hH hEbar ThetaF + _ = PowerSeries.subst (PowerSeries.subst H Ebar) ThetaF := by + rw [equalCharacteristicCompletedSourceBracket_commutes u] + _ = PowerSeries.subst H (PowerSeries.subst Ebar ThetaF) := + (PowerSeries.subst_comp_subst_apply hEbar hH ThetaF).symm + _ = PowerSeries.subst H (PowerSeries.subst Theta E) := by + rw [equalCharacteristicThetaSeries_intertwines u] + _ = PowerSeries.subst (PowerSeries.subst H Theta) E := + PowerSeries.subst_comp_subst_apply hTheta hH E + +/-- Reading the coefficient at `q^(j+1)` in a `q`-additive Frobenius +intertwiner gives exactly the contracting recursion from the contracting Frobenius equation. -/ +theorem equalCharacteristicQAdditiveIntertwiner_succ_comparison + (u : k⟦X⟧ˣ) + (c : ℕ → (AlgebraicClosure k)⟦X⟧) + (hintertwines : + PowerSeries.subst + (equalCharacteristicCompletedLubinTateSeries (k := k) + (equalCharacteristicCompletedSourceUniformizer u)) + (equalCharacteristicQAdditiveSeries k + (fun i ↦ equalCharacteristicPowerSeriesFrobenius k (c i))) = + PowerSeries.subst (equalCharacteristicQAdditiveSeries k c) + (equalCharacteristicCompletedLubinTateSeries + (k := k) PowerSeries.X)) + (j : ℕ) : + PowerSeries.X * c (j + 1) - + equalCharacteristicCompletedSourceUniformizer u ^ + (Nat.card k ^ (j + 1)) * + equalCharacteristicPowerSeriesFrobenius k (c (j + 1)) = + equalCharacteristicPowerSeriesFrobenius k (c j) - + c j ^ Nat.card k := by + rw [equalCharacteristicQAdditiveSeries_subst_completedLubinTateSeries, + equalCharacteristicCompletedLubinTateSeries_subst_qAdditiveSeries] + at hintertwines + have hcoeff := congrArg + (PowerSeries.coeff (Nat.card k ^ (j + 1))) hintertwines + rw [equalCharacteristicQAdditiveSeries_coeff_pow, + equalCharacteristicQAdditiveSeries_coeff_pow, + equalCharacteristicLubinTateSubstitutionCoefficient, + equalCharacteristicLubinTatePostcompositionCoefficient] at hcoeff + linear_combination -hcoeff + +/-- Two `q`-additive Frobenius intertwiners with the same linear +coefficient coincide. This is the uniqueness step of the contracting Frobenius equation, +in the coefficient recursion used by Corollary the Lubin–Tate endomorphism commutation law. -/ +theorem equalCharacteristicQAdditiveIntertwinerCoefficient_unique + (u : k⟦X⟧ˣ) + (c d : ℕ → (AlgebraicClosure k)⟦X⟧) + (hzero : c 0 = d 0) + (hc : ∀ j : ℕ, + PowerSeries.X * c (j + 1) - + equalCharacteristicCompletedSourceUniformizer u ^ + (Nat.card k ^ (j + 1)) * + equalCharacteristicPowerSeriesFrobenius k (c (j + 1)) = + equalCharacteristicPowerSeriesFrobenius k (c j) - + c j ^ Nat.card k) + (hd : ∀ j : ℕ, + PowerSeries.X * d (j + 1) - + equalCharacteristicCompletedSourceUniformizer u ^ + (Nat.card k ^ (j + 1)) * + equalCharacteristicPowerSeriesFrobenius k (d (j + 1)) = + equalCharacteristicPowerSeriesFrobenius k (d j) - + d j ^ Nat.card k) : + c = d := by + funext j + induction j with + | zero => exact hzero + | succ j ih => + have hcj := hc j + have hdj := hd j + rw [ih] at hcj + let delta := c (j + 1) - d (j + 1) + have hdiff : + PowerSeries.X * delta - + equalCharacteristicCompletedSourceUniformizer u ^ + (Nat.card k ^ (j + 1)) * + equalCharacteristicPowerSeriesFrobenius k delta = 0 := by + dsimp only [delta] + rw [map_sub] + linear_combination hcj - hdj + have hhom : + delta - equalCharacteristicThetaGamma u (j + 1) * + equalCharacteristicPowerSeriesFrobenius k delta = 0 := by + apply PowerSeries.X_mul_injective + change PowerSeries.X * + (delta - equalCharacteristicThetaGamma u (j + 1) * + equalCharacteristicPowerSeriesFrobenius k delta) = + PowerSeries.X * 0 + rw [mul_sub, ← mul_assoc, + equalCharacteristicThetaGamma_mul_X u (j + 1) + (Nat.zero_lt_succ j), mul_zero] + exact hdiff + have hgamma := equalCharacteristicThetaGamma_constantCoeff u + (j + 1) (Nat.zero_lt_succ j) + have hunique := existsUnique_contractingFrobeniusEquation + (equalCharacteristicCoefficientFrobenius k).toRingHom + (equalCharacteristicThetaGamma u (j + 1)) 0 hgamma + have hzeroSolution : + (0 : (AlgebraicClosure k)⟦X⟧) - + equalCharacteristicThetaGamma u (j + 1) * + equalCharacteristicPowerSeriesFrobenius k 0 = 0 := by + simp + have hdelta : delta = 0 := + hunique.unique hhom hzeroSolution + exact sub_eq_zero.mp (by simpa only [delta] using hdelta) + +/-- The source prime is fixed by arithmetic Frobenius because it is +defined over the base field. -/ +theorem equalCharacteristicCompletedSourceUniformizer_frobenius + (u : k⟦X⟧ˣ) : + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicCompletedSourceUniformizer u) = + equalCharacteristicCompletedSourceUniformizer u := by + rw [← equalCharacteristicSourceUniformizer_map] + exact equalCharacteristicPowerSeriesFrobenius_map_algebraMap + (equalCharacteristicSourceUniformizer u) + +/-- Applying Frobenius to theta's defining coefficient comparison gives +the recursion for the coefficient sequence of `theta^phi`. -/ +theorem equalCharacteristicThetaFrobeniusCoefficient_succ_comparison + (u : k⟦X⟧ˣ) (j : ℕ) : + PowerSeries.X * + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicThetaCoefficient u (j + 1)) - + equalCharacteristicCompletedSourceUniformizer u ^ + (Nat.card k ^ (j + 1)) * + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicThetaCoefficient u (j + 1))) = + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicThetaCoefficient u j)) - + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicThetaCoefficient u j) ^ Nat.card k := by + have h := congrArg (equalCharacteristicPowerSeriesFrobenius k) + (equalCharacteristicThetaCoefficient_succ_comparison u j) + simpa [map_sub, map_mul, map_pow, + equalCharacteristicThetaBetaNumerator, + equalCharacteristicPowerSeriesFrobenius_X, + equalCharacteristicCompletedSourceUniformizer_frobenius] using h + +/-- The finite convolution coefficients of `theta o [u]` satisfy the same +recursion, because `[u]` commutes with the source Lubin--Tate series. -/ +theorem equalCharacteristicThetaAfterBracketCoefficient_succ_comparison + (u : k⟦X⟧ˣ) (j : ℕ) : + PowerSeries.X * + equalCharacteristicThetaAfterBracketCoefficient u (j + 1) - + equalCharacteristicCompletedSourceUniformizer u ^ + (Nat.card k ^ (j + 1)) * + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicThetaAfterBracketCoefficient u (j + 1)) = + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicThetaAfterBracketCoefficient u j) - + equalCharacteristicThetaAfterBracketCoefficient u j ^ Nat.card k := by + have hintertwines := + equalCharacteristicThetaSeries_subst_sourceBracket_intertwines u + rw [equalCharacteristicThetaSeries_subst_sourceBracket, + equalCharacteristicQAdditiveSeries_map] at hintertwines + exact equalCharacteristicQAdditiveIntertwiner_succ_comparison + u (equalCharacteristicThetaAfterBracketCoefficient u) + hintertwines j + +/-- The Lubin–Tate endomorphism commutation law, first theta identity in the equal-characteristic +specialization: + +`theta^phi = theta o [u]`. + +Here `[u]` is the base-defined Lubin--Tate endomorphism constructed above, +not a series defined from the desired identity. -/ +theorem equalCharacteristicThetaSeriesFrobenius_eq_subst_sourceBracket + (u : k⟦X⟧ˣ) : + equalCharacteristicThetaSeriesFrobenius u = + PowerSeries.subst (equalCharacteristicCompletedSourceBracket u) + (equalCharacteristicThetaSeries u) := by + have hcoeff : + (fun j ↦ equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicThetaCoefficient u j)) = + equalCharacteristicThetaAfterBracketCoefficient u := + equalCharacteristicQAdditiveIntertwinerCoefficient_unique u + (fun j ↦ equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicThetaCoefficient u j)) + (equalCharacteristicThetaAfterBracketCoefficient u) + (equalCharacteristicThetaAfterBracketCoefficient_zero u).symm + (equalCharacteristicThetaFrobeniusCoefficient_succ_comparison u) + (equalCharacteristicThetaAfterBracketCoefficient_succ_comparison u) + rw [equalCharacteristicThetaSeriesFrobenius_eq_qAdditiveSeries, + equalCharacteristicThetaSeries_subst_sourceBracket] + exact congrArg (equalCharacteristicQAdditiveSeries k) hcoeff + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaSeries.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaSeries.lean new file mode 100644 index 0000000000..39a67e59ff --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaSeries.lean @@ -0,0 +1,733 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaCoefficients +public import Mathlib.RingTheory.PowerSeries.Expand +/-! +# LubinTate the equal-characteristic theta construction: the equal-characteristic theta series + +The coefficient recursion of the contracting Frobenius equation produces a sequence `b_j` in the +completed maximal-unramified integer ring. The series used in the completed theta-intertwining + theorem is the +genuine sparse power series + +`theta(Y) = sum_j b_j Y^(q^j)`. + +This file packages that outer series as an actual `PowerSeries`; no +convergence or evaluation hypothesis is inserted into its definition. +-/ + +@[expose] public section + +noncomputable +section + +open scoped PowerSeries + + +universe u v w + +namespace LubinTate +namespace EqualCharacteristic + +/-- Classical decidability for propositions used in the equal-characteristic theta series. -/ +local instance thetaSeriesPropDecidable (p : Prop) : Decidable p := Classical.propDecidable p + +variable (k : Type u) [Field k] [Finite k] + +/-- The predicate saying that a degree is one of the additive exponents +`q^j`, where `q = #k`. -/ +def IsEqualCharacteristicAdditiveExponent (n : ℕ) : Prop := + ∃ j : ℕ, Nat.card k ^ j = n + +/-- The unique index of an additive exponent. It is only used under a proof +that the degree really has the required form. -/ +noncomputable def equalCharacteristicAdditiveExponentIndex + (n : ℕ) (hn : IsEqualCharacteristicAdditiveExponent k n) : ℕ := + Nat.find hn + +omit [Field k] [Finite k] in +/-- The chosen additive exponent index realizes `n` as a power of `q`. -/ +theorem equalCharacteristicAdditiveExponentIndex_spec + (n : ℕ) (hn : IsEqualCharacteristicAdditiveExponent k n) : + Nat.card k ^ equalCharacteristicAdditiveExponentIndex k n hn = n := + Nat.find_spec hn + +omit [Field k] [Finite k] in +/-- The selected additive-exponent index is no larger than any index +realizing the same exponent. -/ +theorem equalCharacteristicAdditiveExponentIndex_min + (n : ℕ) (hn : IsEqualCharacteristicAdditiveExponent k n) + (j : ℕ) (hj : Nat.card k ^ j = n) : + equalCharacteristicAdditiveExponentIndex k n hn ≤ j := + Nat.find_min' hn hj + +/-- The selected additive-exponent index equals every index representing +the same power. In particular it is independent of the existence proof +used to define it. -/ +theorem equalCharacteristicAdditiveExponentIndex_eq_of_pow_eq + (n : ℕ) (hn : IsEqualCharacteristicAdditiveExponent k n) + (j : ℕ) (hj : Nat.card k ^ j = n) : + equalCharacteristicAdditiveExponentIndex k n hn = j := by + apply Nat.pow_right_injective + (Finite.one_lt_card : 2 ≤ Nat.card k) + exact (equalCharacteristicAdditiveExponentIndex_spec k n hn).trans hj.symm + +/-- The chosen index of `q ^ j` is `j`. -/ +theorem equalCharacteristicAdditiveExponentIndex_pow (j : ℕ) : + equalCharacteristicAdditiveExponentIndex k (Nat.card k ^ j) ⟨j, rfl⟩ = j := by + exact equalCharacteristicAdditiveExponentIndex_eq_of_pow_eq + k (Nat.card k ^ j) ⟨j, rfl⟩ j rfl + +/-- Powers of the cardinality of a nontrivial finite field have unique +exponents. -/ +theorem natCard_pow_injective : Function.Injective (Nat.card k ^ ·) := + Nat.pow_right_injective (Finite.one_lt_card : 2 ≤ Nat.card k) + +/-- A power of the nontrivial finite-field cardinality is one only at exponent zero. -/ +theorem natCard_pow_eq_one_iff (j : ℕ) : Nat.card k ^ j = 1 ↔ j = 0 := by + rw [← pow_zero (Nat.card k)] + exact (natCard_pow_injective k).eq_iff + +variable {R : Type v} [CommRing R] + +/-- The `q`-additive sparse power series attached to a coefficient sequence +`b`: its coefficient at `q^j` is `b_j`, and every other coefficient is zero. +-/ +noncomputable def equalCharacteristicQAdditiveSeries (b : ℕ → R) : R⟦X⟧ := + PowerSeries.mk fun n ↦ + if hn : IsEqualCharacteristicAdditiveExponent k n then + b (equalCharacteristicAdditiveExponentIndex k n hn) + else 0 + +omit [Field k] [Finite k] in +/-- The `n`th coefficient of a `q`-additive series is selected by its power index. -/ +theorem equalCharacteristicQAdditiveSeries_coeff + (b : ℕ → R) (n : ℕ) : + PowerSeries.coeff n (equalCharacteristicQAdditiveSeries k b) = + if hn : IsEqualCharacteristicAdditiveExponent k n then + b (equalCharacteristicAdditiveExponentIndex k n hn) + else 0 := by + simp [equalCharacteristicQAdditiveSeries] + +/-- The coefficient at exponent `q ^ j` is the prescribed coefficient `b j`. -/ +@[simp] +theorem equalCharacteristicQAdditiveSeries_coeff_pow + (b : ℕ → R) (j : ℕ) : + PowerSeries.coeff (Nat.card k ^ j) + (equalCharacteristicQAdditiveSeries k b) = b j := by + rw [equalCharacteristicQAdditiveSeries_coeff] + split_ifs with h + · rw [equalCharacteristicAdditiveExponentIndex_pow] + · exact (h ⟨j, rfl⟩).elim + +omit [Field k] [Finite k] in +/-- Coefficients away from powers of `q` vanish in a `q`-additive series. -/ +theorem equalCharacteristicQAdditiveSeries_coeff_eq_zero + (b : ℕ → R) (n : ℕ) + (hn : ¬ IsEqualCharacteristicAdditiveExponent k n) : + PowerSeries.coeff n (equalCharacteristicQAdditiveSeries k b) = 0 := by + rw [equalCharacteristicQAdditiveSeries_coeff] + simp [hn] + +/-- Every `q`-additive series has zero constant coefficient. -/ +@[simp] +theorem equalCharacteristicQAdditiveSeries_constantCoeff + (b : ℕ → R) : + PowerSeries.constantCoeff (equalCharacteristicQAdditiveSeries k b) = 0 := by + rw [← PowerSeries.coeff_zero_eq_constantCoeff] + apply equalCharacteristicQAdditiveSeries_coeff_eq_zero + rintro ⟨j, hj⟩ + have hpositive : 0 < Nat.card k ^ j := pow_pos Nat.card_pos j + omega + +/-- The linear coefficient of a `q`-additive series is its zeroth parameter. -/ +@[simp] +theorem equalCharacteristicQAdditiveSeries_coeff_one + (b : ℕ → R) : + PowerSeries.coeff 1 (equalCharacteristicQAdditiveSeries k b) = b 0 := by + simpa using equalCharacteristicQAdditiveSeries_coeff_pow k b 0 + +variable {S : Type w} [CommRing S] + +omit [Field k] [Finite k] in +/-- Mapping the coefficient ring maps a `q`-additive series coefficientwise. +-/ +theorem equalCharacteristicQAdditiveSeries_map + (f : R →+* S) (b : ℕ → R) : + PowerSeries.map f (equalCharacteristicQAdditiveSeries k b) = + equalCharacteristicQAdditiveSeries k (fun j ↦ f (b j)) := by + apply PowerSeries.ext + intro n + rw [PowerSeries.coeff_map, + equalCharacteristicQAdditiveSeries_coeff, + equalCharacteristicQAdditiveSeries_coeff] + split_ifs <;> simp + +omit [Field k] [Finite k] in +/-- Multiplication by a constant acts coefficientwise on a `q`-additive +series. -/ +theorem equalCharacteristicQAdditiveSeries_C_mul + (a : R) (b : ℕ → R) : + PowerSeries.C a * equalCharacteristicQAdditiveSeries k b = + equalCharacteristicQAdditiveSeries k (fun j ↦ a * b j) := by + apply PowerSeries.ext + intro n + rw [PowerSeries.coeff_C_mul, + equalCharacteristicQAdditiveSeries_coeff, + equalCharacteristicQAdditiveSeries_coeff] + split_ifs <;> simp + +omit [Field k] [Finite k] in +/-- Addition of `q`-additive series is coefficientwise. -/ +theorem equalCharacteristicQAdditiveSeries_add + (a b : ℕ → R) : + equalCharacteristicQAdditiveSeries k a + + equalCharacteristicQAdditiveSeries k b = + equalCharacteristicQAdditiveSeries k (fun j ↦ a j + b j) := by + apply PowerSeries.ext + intro n + rw [map_add, equalCharacteristicQAdditiveSeries_coeff, + equalCharacteristicQAdditiveSeries_coeff, + equalCharacteristicQAdditiveSeries_coeff] + split_ifs <;> simp + +section FrobeniusPowers + +variable {A : Type w} [CommRing A] [Algebra k A] + +/-- In every algebra over the finite field `k`, raising to a `q^j`-th power +is additive. This is the characteristic-`p` calculation used when composing +additive power series. -/ +theorem add_pow_natCard_pow (a b : A) (j : ℕ) : + (a + b) ^ (Nat.card k ^ j) = + a ^ (Nat.card k ^ j) + b ^ (Nat.card k ^ j) := by + let : Fintype k := Fintype.ofFinite k + induction j with + | zero => simp + | succ j ih => + rw [pow_succ, pow_mul, pow_mul, pow_mul, ih] + simpa only [FiniteField.coe_frobeniusAlgHom, + Nat.card_eq_fintype_card] using + map_add (FiniteField.frobeniusAlgHom k A) + (a ^ Nat.card k ^ j) (b ^ Nat.card k ^ j) + +/-- The `q`-power Frobenius on an algebra over the finite field `k`. Unlike +the completed-unramified Frobenius used above, this raises the whole algebra +element to its `q`-th power. -/ +noncomputable def equalCharacteristicCardFrobenius + {B : Type w} [CommRing B] [Algebra k B] : B →+* B := by + letI : Fintype k := Fintype.ofFinite k + exact (FiniteField.frobeniusAlgHom k B).toRingHom + +/-- Cardinal Frobenius raises an element to the finite-field cardinality. -/ +theorem equalCharacteristicCardFrobenius_apply + {B : Type w} [CommRing B] [Algebra k B] (x : B) : + equalCharacteristicCardFrobenius k x = x ^ Nat.card k := by + let : Fintype k := Fintype.ofFinite k + simp [equalCharacteristicCardFrobenius, Nat.card_eq_fintype_card] + +/-- Frobenius on a power-series algebra is coefficient Frobenius followed by +the exponent expansion `Y ↦ Y^q`. -/ +theorem powerSeries_pow_natCard_eq_expand_map_cardFrobenius + {B : Type w} [CommRing B] [Nontrivial B] [Algebra k B] + (f : B⟦X⟧) : + f ^ Nat.card k = + PowerSeries.expand (Nat.card k) Nat.card_pos.ne' + (PowerSeries.map (equalCharacteristicCardFrobenius k) f) := by + let : Fintype k := Fintype.ofFinite k + obtain ⟨p, hpchar, n, hp, hcard⟩ := FiniteField.card' k + let : CharP k p := hpchar + let : ExpChar k p := ExpChar.prime hp + let : ExpChar B p := + expChar_of_injective_algebraMap (algebraMap k B).injective p + have hiter : + iterateFrobenius B p (n : ℕ) = + equalCharacteristicCardFrobenius k := by + ext x + rw [equalCharacteristicCardFrobenius_apply] + rw [Nat.card_eq_fintype_card, hcard] + rw [show (iterateFrobenius B p (n : ℕ)) x = x ^ p ^ (n : ℕ) by + rw [congrFun (coe_iterateFrobenius B p (n : ℕ)) x] + rw [show (⇑(frobenius B p) : B → B) = fun y ↦ y ^ p by + funext y + exact frobenius_def p y] + exact congrFun (pow_iterate p (n : ℕ)) x] + have hmain := MvPowerSeries.map_iterateFrobenius_expand + (R := B) p hp.ne_zero (f : MvPowerSeries Unit B) (n : ℕ) + rw [hiter] at hmain + change + PowerSeries.map (equalCharacteristicCardFrobenius k) + (PowerSeries.expand (p ^ (n : ℕ)) + (pow_ne_zero (n : ℕ) hp.ne_zero) f) = + f ^ p ^ (n : ℕ) at hmain + have hcardNat : Nat.card k = p ^ (n : ℕ) := by + simpa only [Nat.card_eq_fintype_card] using hcard + have hmain' : + PowerSeries.map (equalCharacteristicCardFrobenius k) + (PowerSeries.expand (Nat.card k) Nat.card_pos.ne' f) = + f ^ Nat.card k := by + simpa only [hcardNat] using hmain + rw [← hmain'] + exact PowerSeries.map_expand (Nat.card k) Nat.card_pos.ne' + (equalCharacteristicCardFrobenius k) f + +end FrobeniusPowers + +/-- Shift of a coefficient sequence induced by `Y ↦ Y^q`. -/ +def equalCharacteristicQAdditiveShift (b : ℕ → R) : ℕ → R + | 0 => 0 + | j + 1 => b j + +/-- Expanding exponents by `q` shifts a `q`-additive coefficient sequence by +one place. -/ +theorem equalCharacteristicQAdditiveSeries_expand + (b : ℕ → R) : + PowerSeries.expand (Nat.card k) Nat.card_pos.ne' + (equalCharacteristicQAdditiveSeries k b) = + equalCharacteristicQAdditiveSeries k + (equalCharacteristicQAdditiveShift b) := by + apply PowerSeries.ext + intro n + by_cases hn : IsEqualCharacteristicAdditiveExponent k n + · obtain ⟨j, rfl⟩ := hn + cases j with + | zero => + rw [pow_zero, PowerSeries.coeff_expand, + equalCharacteristicQAdditiveSeries_coeff_one] + have hnot : ¬ Nat.card k ∣ 1 := by + intro h + have hq : Nat.card k = 1 := Nat.eq_one_of_dvd_one h + exact (Finite.one_lt_card : 1 < Nat.card k).ne hq.symm + simp [hnot, equalCharacteristicQAdditiveShift] + | succ j => + rw [equalCharacteristicQAdditiveSeries_coeff_pow] + change PowerSeries.coeff (Nat.card k ^ (j + 1)) + (PowerSeries.expand (Nat.card k) Nat.card_pos.ne' + (equalCharacteristicQAdditiveSeries k b)) = b j + calc + _ = PowerSeries.coeff (Nat.card k * Nat.card k ^ j) + (PowerSeries.expand (Nat.card k) Nat.card_pos.ne' + (equalCharacteristicQAdditiveSeries k b)) := by + congr 2 + rw [pow_succ, Nat.mul_comm] + _ = PowerSeries.coeff (Nat.card k ^ j) + (equalCharacteristicQAdditiveSeries k b) := + PowerSeries.coeff_expand_mul (Nat.card k) Nat.card_pos.ne' + (equalCharacteristicQAdditiveSeries k b) (Nat.card k ^ j) + _ = b j := equalCharacteristicQAdditiveSeries_coeff_pow k b j + · rw [PowerSeries.coeff_expand, + equalCharacteristicQAdditiveSeries_coeff_eq_zero k _ n hn] + split_ifs with hdvd + · obtain ⟨m, hm⟩ := hdvd + have hmexp : ¬ IsEqualCharacteristicAdditiveExponent k m := by + rintro ⟨j, hj⟩ + apply hn + refine ⟨j + 1, ?_⟩ + calc + Nat.card k ^ (j + 1) = Nat.card k * Nat.card k ^ j := by + rw [pow_succ, Nat.mul_comm] + _ = Nat.card k * m := by rw [hj] + _ = n := hm.symm + have hdiv : n / Nat.card k = m := by + rw [hm, Nat.mul_div_cancel_left m Nat.card_pos] + rw [hdiv, + equalCharacteristicQAdditiveSeries_coeff_eq_zero k b m hmexp] + · rfl + +/-- Taking a `q`-th power shifts the additive series and raises every +coefficient to its `q`-th power. -/ +theorem equalCharacteristicQAdditiveSeries_pow_card + [Nontrivial R] [Algebra k R] (b : ℕ → R) : + equalCharacteristicQAdditiveSeries k b ^ Nat.card k = + equalCharacteristicQAdditiveSeries k + (equalCharacteristicQAdditiveShift + (fun j ↦ b j ^ Nat.card k)) := by + rw [powerSeries_pow_natCard_eq_expand_map_cardFrobenius k, + equalCharacteristicQAdditiveSeries_map, + equalCharacteristicQAdditiveSeries_expand] + congr 2 + funext j + exact equalCharacteristicCardFrobenius_apply k (b j) + +variable {k} + +/-- The actual outer theta series from the completed theta-intertwining theorem. -/ +noncomputable def equalCharacteristicThetaSeries + (u : k⟦X⟧ˣ) : ((AlgebraicClosure k)⟦X⟧)⟦X⟧ := + equalCharacteristicQAdditiveSeries k + (equalCharacteristicThetaCoefficient u) + +/-- The theta series coefficient at `q ^ j` is the `j`th theta coefficient. -/ +@[simp] +theorem equalCharacteristicThetaSeries_coeff_pow + (u : k⟦X⟧ˣ) (j : ℕ) : + PowerSeries.coeff (Nat.card k ^ j) + (equalCharacteristicThetaSeries u) = + equalCharacteristicThetaCoefficient u j := by + exact equalCharacteristicQAdditiveSeries_coeff_pow k + (equalCharacteristicThetaCoefficient u) j + +/-- The equal-characteristic theta series has zero constant coefficient. -/ +@[simp] +theorem equalCharacteristicThetaSeries_constantCoeff + (u : k⟦X⟧ˣ) : + PowerSeries.constantCoeff (equalCharacteristicThetaSeries u) = 0 := by + exact equalCharacteristicQAdditiveSeries_constantCoeff k _ + +/-- The zero constant coefficient makes theta a valid formal substitution. +-/ +theorem equalCharacteristicThetaSeries_hasSubst + (u : k⟦X⟧ˣ) : + PowerSeries.HasSubst (equalCharacteristicThetaSeries u) := + PowerSeries.HasSubst.of_constantCoeff_zero' + (equalCharacteristicThetaSeries_constantCoeff u) + +/-- Frobenius acts on the completed-unramified coefficients of theta. -/ +noncomputable def equalCharacteristicThetaSeriesFrobenius + (u : k⟦X⟧ˣ) : ((AlgebraicClosure k)⟦X⟧)⟦X⟧ := + PowerSeries.map (equalCharacteristicPowerSeriesFrobenius k) + (equalCharacteristicThetaSeries u) + +/-- Coefficientwise Frobenius of theta is the `q`-additive series of Frobenius coefficients. -/ +theorem equalCharacteristicThetaSeriesFrobenius_eq_qAdditiveSeries + (u : k⟦X⟧ˣ) : + equalCharacteristicThetaSeriesFrobenius u = + equalCharacteristicQAdditiveSeries k + (fun j ↦ equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicThetaCoefficient u j)) := by + exact equalCharacteristicQAdditiveSeries_map k + (equalCharacteristicPowerSeriesFrobenius k) + (equalCharacteristicThetaCoefficient u) + +/-- The Frobenius theta coefficient at `q ^ j` is Frobenius of the `j`th coefficient. -/ +@[simp] +theorem equalCharacteristicThetaSeriesFrobenius_coeff_pow + (u : k⟦X⟧ˣ) (j : ℕ) : + PowerSeries.coeff (Nat.card k ^ j) + (equalCharacteristicThetaSeriesFrobenius u) = + equalCharacteristicPowerSeriesFrobenius k + (equalCharacteristicThetaCoefficient u j) := by + rw [equalCharacteristicThetaSeriesFrobenius_eq_qAdditiveSeries, + equalCharacteristicQAdditiveSeries_coeff_pow] + +/-- The additive Lubin--Tate series `Y^q + pi Y`, now with coefficients in +the completed maximal-unramified integer ring. -/ +noncomputable def equalCharacteristicCompletedLubinTateSeries + (pi : (AlgebraicClosure k)⟦X⟧) : + ((AlgebraicClosure k)⟦X⟧)⟦X⟧ := + PowerSeries.X ^ Nat.card k + PowerSeries.C pi * PowerSeries.X + +/-- The completed Lubin–Tate series has zero constant coefficient. -/ +@[simp] +theorem equalCharacteristicCompletedLubinTateSeries_constantCoeff + (pi : (AlgebraicClosure k)⟦X⟧) : + PowerSeries.constantCoeff + (equalCharacteristicCompletedLubinTateSeries (k := k) pi) = 0 := by + have hq : Nat.card k ≠ 0 := Nat.card_pos.ne' + simp [equalCharacteristicCompletedLubinTateSeries, hq] + +/-- A Lubin--Tate series has zero constant coefficient and can therefore be +substituted into theta. -/ +theorem equalCharacteristicCompletedLubinTateSeries_hasSubst + (pi : (AlgebraicClosure k)⟦X⟧) : + PowerSeries.HasSubst + (equalCharacteristicCompletedLubinTateSeries (k := k) pi) := + PowerSeries.HasSubst.of_constantCoeff_zero' + (equalCharacteristicCompletedLubinTateSeries_constantCoeff pi) + +/-- A `q^j`-th power of `Y^q + pi Y` has exactly the two expected additive +monomials. -/ +theorem equalCharacteristicCompletedLubinTateSeries_pow_card_pow + (pi : (AlgebraicClosure k)⟦X⟧) (j : ℕ) : + equalCharacteristicCompletedLubinTateSeries (k := k) pi ^ + (Nat.card k ^ j) = + PowerSeries.X ^ (Nat.card k ^ (j + 1)) + + PowerSeries.C (pi ^ (Nat.card k ^ j)) * + PowerSeries.X ^ (Nat.card k ^ j) := by + rw [equalCharacteristicCompletedLubinTateSeries, + add_pow_natCard_pow k, mul_pow, map_pow] + congr 1 + rw [← pow_mul, pow_succ, Nat.mul_comm] + +/-- Coefficient form of the preceding two-monomial calculation. -/ +theorem equalCharacteristicCompletedLubinTateSeries_pow_card_pow_coeff + (pi : (AlgebraicClosure k)⟦X⟧) (j n : ℕ) : + PowerSeries.coeff n + (equalCharacteristicCompletedLubinTateSeries (k := k) pi ^ + (Nat.card k ^ j)) = + (if n = Nat.card k ^ (j + 1) then 1 else 0) + + (if n = Nat.card k ^ j then pi ^ (Nat.card k ^ j) else 0) := by + rw [equalCharacteristicCompletedLubinTateSeries_pow_card_pow] + simp only [map_add, PowerSeries.coeff_X_pow, PowerSeries.coeff_C_mul] + split_ifs <;> simp_all + +/-- Coefficients obtained by substituting `Y^q + pi Y` into a `q`-additive +series. -/ +def equalCharacteristicLubinTateSubstitutionCoefficient + (pi : (AlgebraicClosure k)⟦X⟧) + (b : ℕ → (AlgebraicClosure k)⟦X⟧) : + ℕ → (AlgebraicClosure k)⟦X⟧ + | 0 => b 0 * pi + | j + 1 => b j + b (j + 1) * pi ^ (Nat.card k ^ (j + 1)) + +/-- Substitution into an additive series cannot create a non-additive +exponent. -/ +theorem equalCharacteristicQAdditiveSeries_subst_coeff_eq_zero + (pi : (AlgebraicClosure k)⟦X⟧) + (b : ℕ → (AlgebraicClosure k)⟦X⟧) + (n : ℕ) (hn : ¬ IsEqualCharacteristicAdditiveExponent k n) : + PowerSeries.coeff n + (PowerSeries.subst + (equalCharacteristicCompletedLubinTateSeries (k := k) pi) + (equalCharacteristicQAdditiveSeries k b)) = 0 := by + rw [PowerSeries.coeff_subst' + (equalCharacteristicCompletedLubinTateSeries_hasSubst pi)] + apply finsum_eq_zero_of_forall_eq_zero + intro d + by_cases hd : IsEqualCharacteristicAdditiveExponent k d + · obtain ⟨j, rfl⟩ := hd + rw [equalCharacteristicCompletedLubinTateSeries_pow_card_pow_coeff] + have hnSucc : n ≠ Nat.card k ^ (j + 1) := by + intro h + exact hn ⟨j + 1, h.symm⟩ + have hnSelf : n ≠ Nat.card k ^ j := by + intro h + exact hn ⟨j, h.symm⟩ + simp [hnSucc, hnSelf] + · rw [equalCharacteristicQAdditiveSeries_coeff_eq_zero k b d hd] + simp + +/-- The linear coefficient after substitution is `b_0 pi`. -/ +theorem equalCharacteristicQAdditiveSeries_subst_coeff_one + (pi : (AlgebraicClosure k)⟦X⟧) + (b : ℕ → (AlgebraicClosure k)⟦X⟧) : + PowerSeries.coeff 1 + (PowerSeries.subst + (equalCharacteristicCompletedLubinTateSeries (k := k) pi) + (equalCharacteristicQAdditiveSeries k b)) = b 0 * pi := by + rw [PowerSeries.coeff_subst' + (equalCharacteristicCompletedLubinTateSeries_hasSubst pi), + finsum_eq_single _ 1] + · rw [equalCharacteristicQAdditiveSeries_coeff_one] + have hpow : (1 : ℕ) = Nat.card k ^ 0 := by simp + conv_lhs => + rhs + rw [hpow, + equalCharacteristicCompletedLubinTateSeries_pow_card_pow_coeff] + have hq : (1 : ℕ) ≠ Nat.card k := + ne_of_lt (Finite.one_lt_card : 1 < Nat.card k) + simp [hq] + · intro d hd + by_cases hde : IsEqualCharacteristicAdditiveExponent k d + · obtain ⟨j, rfl⟩ := hde + rw [equalCharacteristicCompletedLubinTateSeries_pow_card_pow_coeff] + have hj : j ≠ 0 := by + intro hj + subst j + simp at hd + have hSelf : (1 : ℕ) ≠ Nat.card k ^ j := by + intro h + exact hj ((natCard_pow_eq_one_iff k j).1 h.symm) + have hSucc : (1 : ℕ) ≠ Nat.card k ^ (j + 1) := by + intro h + have : j + 1 = 0 := + (natCard_pow_eq_one_iff k (j + 1)).1 h.symm + omega + simp [hSelf, hSucc] + · rw [equalCharacteristicQAdditiveSeries_coeff_eq_zero k b d hde] + simp + +/-- At the next additive exponent, substitution receives one contribution +from the preceding `q`-power term and one from the linear term. -/ +theorem equalCharacteristicQAdditiveSeries_subst_coeff_pow_succ + (pi : (AlgebraicClosure k)⟦X⟧) + (b : ℕ → (AlgebraicClosure k)⟦X⟧) (r : ℕ) : + PowerSeries.coeff (Nat.card k ^ (r + 1)) + (PowerSeries.subst + (equalCharacteristicCompletedLubinTateSeries (k := k) pi) + (equalCharacteristicQAdditiveSeries k b)) = + b r + b (r + 1) * pi ^ (Nat.card k ^ (r + 1)) := by + rw [PowerSeries.coeff_subst' + (equalCharacteristicCompletedLubinTateSeries_hasSubst pi)] + let F : ℕ → (AlgebraicClosure k)⟦X⟧ := fun d ↦ + PowerSeries.coeff d (equalCharacteristicQAdditiveSeries k b) • + PowerSeries.coeff (Nat.card k ^ (r + 1)) + (equalCharacteristicCompletedLubinTateSeries (k := k) pi ^ d) + change ∑ᶠ d : ℕ, F d = _ + have hsupport : Function.support F ⊆ + (({Nat.card k ^ r, Nat.card k ^ (r + 1)} : Finset ℕ) : Set ℕ) := by + intro d hd + change F d ≠ 0 at hd + by_cases hde : IsEqualCharacteristicAdditiveExponent k d + · obtain ⟨j, rfl⟩ := hde + dsimp only [F] at hd + rw [equalCharacteristicCompletedLubinTateSeries_pow_card_pow_coeff] at hd + by_cases hHigh : Nat.card k ^ (r + 1) = Nat.card k ^ (j + 1) + · have hrj : r = j := by + have := natCard_pow_injective k hHigh + omega + simp [hrj] + · by_cases hLow : Nat.card k ^ (r + 1) = Nat.card k ^ j + · have hj : j = r + 1 := + (natCard_pow_injective k hLow).symm + simp [hj] + · simp [hHigh, hLow] at hd + · dsimp only [F] at hd + rw [equalCharacteristicQAdditiveSeries_coeff_eq_zero k b d hde] at hd + simp at hd + rw [finsum_eq_sum_of_support_subset F hsupport] + have hne : Nat.card k ^ r ≠ Nat.card k ^ (r + 1) := by + intro h + have := natCard_pow_injective k h + omega + rw [Finset.sum_pair hne] + dsimp only [F] + rw [equalCharacteristicQAdditiveSeries_coeff_pow, + equalCharacteristicQAdditiveSeries_coeff_pow, + equalCharacteristicCompletedLubinTateSeries_pow_card_pow_coeff, + equalCharacteristicCompletedLubinTateSeries_pow_card_pow_coeff] + have hSelf : Nat.card k ^ (r + 1) ≠ Nat.card k ^ r := hne.symm + have hNext : Nat.card k ^ (r + 1) ≠ Nat.card k ^ (r + 1 + 1) := by + intro h + have := natCard_pow_injective k h + omega + simp [hSelf, hNext] + +/-- Formal substitution formula for a `q`-additive series. -/ +theorem equalCharacteristicQAdditiveSeries_subst_completedLubinTateSeries + (pi : (AlgebraicClosure k)⟦X⟧) + (b : ℕ → (AlgebraicClosure k)⟦X⟧) : + PowerSeries.subst + (equalCharacteristicCompletedLubinTateSeries (k := k) pi) + (equalCharacteristicQAdditiveSeries k b) = + equalCharacteristicQAdditiveSeries k + (equalCharacteristicLubinTateSubstitutionCoefficient pi b) := by + apply PowerSeries.ext + intro n + by_cases hn : IsEqualCharacteristicAdditiveExponent k n + · obtain ⟨j, rfl⟩ := hn + cases j with + | zero => + rw [pow_zero, + equalCharacteristicQAdditiveSeries_subst_coeff_one, + equalCharacteristicQAdditiveSeries_coeff_one] + rfl + | succ j => + rw [equalCharacteristicQAdditiveSeries_subst_coeff_pow_succ, + equalCharacteristicQAdditiveSeries_coeff_pow] + rfl + · rw [equalCharacteristicQAdditiveSeries_subst_coeff_eq_zero pi b n hn, + equalCharacteristicQAdditiveSeries_coeff_eq_zero k _ n hn] + +/-- Coefficients obtained by applying `Y^q + pi Y` after a `q`-additive +series. -/ +def equalCharacteristicLubinTatePostcompositionCoefficient + (pi : (AlgebraicClosure k)⟦X⟧) + (b : ℕ → (AlgebraicClosure k)⟦X⟧) : + ℕ → (AlgebraicClosure k)⟦X⟧ + | 0 => pi * b 0 + | j + 1 => b j ^ Nat.card k + pi * b (j + 1) + +/-- Formal postcomposition formula +`(Y^q + pi Y) ∘ (Σ b_j Y^(q^j))`. -/ +theorem equalCharacteristicCompletedLubinTateSeries_subst_qAdditiveSeries + (pi : (AlgebraicClosure k)⟦X⟧) + (b : ℕ → (AlgebraicClosure k)⟦X⟧) : + PowerSeries.subst (equalCharacteristicQAdditiveSeries k b) + (equalCharacteristicCompletedLubinTateSeries (k := k) pi) = + equalCharacteristicQAdditiveSeries k + (equalCharacteristicLubinTatePostcompositionCoefficient pi b) := by + have hsubst : PowerSeries.HasSubst + (equalCharacteristicQAdditiveSeries k b) := + PowerSeries.HasSubst.of_constantCoeff_zero' + (equalCharacteristicQAdditiveSeries_constantCoeff k b) + rw [equalCharacteristicCompletedLubinTateSeries, + ← PowerSeries.smul_eq_C_mul] + rw [PowerSeries.subst_add hsubst, + PowerSeries.subst_pow hsubst, + PowerSeries.subst_smul hsubst, + PowerSeries.subst_X hsubst, + equalCharacteristicQAdditiveSeries_pow_card k, + PowerSeries.smul_eq_C_mul, + equalCharacteristicQAdditiveSeries_C_mul, + equalCharacteristicQAdditiveSeries_add] + congr 2 + funext j + cases j <;> + simp [equalCharacteristicQAdditiveShift, + equalCharacteristicLubinTatePostcompositionCoefficient] + +/-- The completed theta-intertwining theorem, the second theta identity +`theta^phi o e_bar_pi = e_T o theta`. + +Both sides are genuine formal substitutions. At the linear coefficient the +claim is the semilinear unit equation `phi(b_0) = u b_0`; at every higher +`q`-power coefficient it is exactly the contracting recursion defining +`b_(j+1)`. -/ +theorem equalCharacteristicThetaSeries_intertwines + (u : k⟦X⟧ˣ) : + PowerSeries.subst + (equalCharacteristicCompletedLubinTateSeries (k := k) + (equalCharacteristicCompletedSourceUniformizer u)) + (equalCharacteristicThetaSeriesFrobenius u) = + PowerSeries.subst (equalCharacteristicThetaSeries u) + (equalCharacteristicCompletedLubinTateSeries (k := k) PowerSeries.X) := by + rw [equalCharacteristicThetaSeriesFrobenius_eq_qAdditiveSeries, + equalCharacteristicQAdditiveSeries_subst_completedLubinTateSeries, + equalCharacteristicThetaSeries, + equalCharacteristicCompletedLubinTateSeries_subst_qAdditiveSeries] + congr 1 + funext j + cases j with + | zero => + rw [equalCharacteristicLubinTateSubstitutionCoefficient, + equalCharacteristicLubinTatePostcompositionCoefficient, + equalCharacteristicThetaCoefficient_zero, + equalCharacteristicPowerSeriesFrobenius_semilinearUnit, + equalCharacteristicCompletedSourceUniformizer] + have huinv : + PowerSeries.map (algebraMap k (AlgebraicClosure k)) (u : k⟦X⟧) * + PowerSeries.map (algebraMap k (AlgebraicClosure k)) + ((u⁻¹ : k⟦X⟧ˣ) : k⟦X⟧) = 1 := by + rw [← map_mul] + simp + calc + _ = (PowerSeries.map (algebraMap k (AlgebraicClosure k)) (u : k⟦X⟧) * + PowerSeries.map (algebraMap k (AlgebraicClosure k)) + ((u⁻¹ : k⟦X⟧ˣ) : k⟦X⟧)) * + (equalCharacteristicSemilinearUnit (u : k⟦X⟧) _ * PowerSeries.X) := by + ring + _ = _ := by rw [huinv]; simp [mul_comm] + | succ j => + rw [equalCharacteristicLubinTateSubstitutionCoefficient, + equalCharacteristicLubinTatePostcompositionCoefficient] + have h := equalCharacteristicThetaCoefficient_succ_comparison u j + rw [equalCharacteristicThetaBetaNumerator] at h + linear_combination -h + +/-- The linear coefficient of theta is the semilinear unit constructed from +`phi(epsilon) = u * epsilon`. -/ +theorem equalCharacteristicThetaSeries_coeff_one + (u : k⟦X⟧ˣ) : + PowerSeries.coeff 1 (equalCharacteristicThetaSeries u) = + equalCharacteristicSemilinearUnit (u : k⟦X⟧) + (by + intro hzero + have hunit := PowerSeries.isUnit_constantCoeff (u : k⟦X⟧) u.isUnit + apply hunit.ne_zero + simpa [PowerSeries.coeff_zero_eq_constantCoeff_apply] using hzero) := by + calc + PowerSeries.coeff 1 (equalCharacteristicThetaSeries u) = + equalCharacteristicThetaCoefficient u 0 := by + simpa only [pow_zero] using equalCharacteristicThetaSeries_coeff_pow u 0 + _ = _ := equalCharacteristicThetaCoefficient_zero u + +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaUniqueness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaUniqueness.lean new file mode 100644 index 0000000000..946e641bc1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaUniqueness.lean @@ -0,0 +1,84 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries +/-! +# The Lubin–Tate endomorphism commutation law: uniqueness source for the first theta identity + +This file proves the uniqueness lemma used for the first theta identity in +the equal-characteristic specialization. The identity +`theta^phi = theta o [u]` itself is a separate required endpoint. +-/ + +@[expose] public section + +noncomputable +section + +open scoped PowerSeries + +namespace LubinTate +namespace EqualCharacteristic + + +variable {k : Type*} [Field k] [Finite k] + +/-- A `q`-additive theta intertwiner is uniquely determined by its linear +coefficient. This is the uniqueness part of the contracting Frobenius equation specialized to the +coefficient recursion used in the completed theta-intertwining theorem. -/ +theorem equalCharacteristicThetaCoefficient_unique + (u : k⟦X⟧ˣ) + (c : ℕ → (AlgebraicClosure k)⟦X⟧) + (hc0 : c 0 = equalCharacteristicThetaCoefficient u 0) + (hrec : ∀ j : ℕ, + PowerSeries.X * c (j + 1) - + equalCharacteristicCompletedSourceUniformizer u ^ + (Nat.card k ^ (j + 1)) * + equalCharacteristicPowerSeriesFrobenius k (c (j + 1)) = + equalCharacteristicThetaBetaNumerator (c j)) : + c = equalCharacteristicThetaCoefficient u := by + funext j + induction j with + | zero => exact hc0 + | succ j ih => + have hcleared := hrec j + rw [ih] at hcleared + have hgamma := equalCharacteristicThetaGamma_constantCoeff u + (j + 1) (Nat.zero_lt_succ j) + have hmul : PowerSeries.X * + (c (j + 1) - + equalCharacteristicThetaGamma u (j + 1) * + equalCharacteristicPowerSeriesFrobenius k (c (j + 1)) - + equalCharacteristicThetaBeta + (equalCharacteristicThetaCoefficient u j)) = 0 := by + rw [mul_sub, mul_sub, ← mul_assoc, + equalCharacteristicThetaGamma_mul_X u (j + 1) + (Nat.zero_lt_succ j), + equalCharacteristicThetaBeta_mul_X] + exact sub_eq_zero.mpr hcleared + have hcontract : + c (j + 1) = + equalCharacteristicThetaBeta + (equalCharacteristicThetaCoefficient u j) + + equalCharacteristicThetaGamma u (j + 1) * + equalCharacteristicPowerSeriesFrobenius k (c (j + 1)) := by + apply sub_eq_zero.mp + apply PowerSeries.X_mul_injective + simpa [sub_eq_add_neg, add_assoc] using hmul + have huniq := contractingFrobeniusEquationSolution_unique + (equalCharacteristicCoefficientFrobenius k).toRingHom + (equalCharacteristicThetaGamma u (j + 1)) + (equalCharacteristicThetaBeta + (equalCharacteristicThetaCoefficient u j)) + (c (j + 1)) hgamma + (by + simpa [equalCharacteristicPowerSeriesFrobenius] using hcontract) + simpa [equalCharacteristicThetaCoefficient] using huniq +end EqualCharacteristic +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel.lean new file mode 100644 index 0000000000..283bbb0d17 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel.lean @@ -0,0 +1,41 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedLevelCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedPrimitiveEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedIterates +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.DivisionPolynomial +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameterFiltration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameters +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.GaloisParameterFiltration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HerbrandFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HigherUnitLevelEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelFieldTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LocalUpperRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamificationFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ParameterCongruence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveDisplacement +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveEisenstein +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveRoot +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveTorsion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.UpperRamification + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/All.lean new file mode 100644 index 0000000000..8480591d53 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/All.lean @@ -0,0 +1,48 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedLevelCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedPrimitiveEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedIterates +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.DivisionPolynomial +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameterFiltration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameters +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.GaloisParameterFiltration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HerbrandFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HigherUnitLevelEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelFieldTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LocalUpperRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamificationFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ParameterCongruence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveDisplacement +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveEisenstein +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveRoot +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveTorsion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.UpperRamification +/-! +# General finite-level Lubin--Tate theory + +Public aggregate for the characteristic-independent standard division +polynomials, primitive torsion fields, analytic formal-module action, explicit +finite Galois parameterization, integral-closure valuation, ramification +filtrations and their Herbrand formula, level-field tower, and the norm of a +primitive uniformizer. It also exports stability of a standard level under +a principal-unit change of its defining uniformizer. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedLevelCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedLevelCompositum.lean new file mode 100644 index 0000000000..ab646aeb10 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedLevelCompositum.lean @@ -0,0 +1,1000 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal +/-! +# A common valued field for original and changed Lubin--Tate levels + +The standard level for a uniformizer `π` and the standard level for a unit +change `uπ` both live in the fixed separable closure of the base field. Their +compositum therefore gives a literal common overfield. This file chooses the +complete discrete valuation supplied by the integral closure of the base +valuation ring in that compositum. + +Uniqueness of valuation extension from the complete base shows that the +chosen compositum valuation extends the already chosen valuation on each +level. The two inclusions consequently preserve valuation-ring and +maximal-ideal membership. Their normalized additive valuations scale by the +corresponding ramification index; no equality between the two levels and no +higher-unit hypothesis is used. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.ValuedExtension +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +variable {K : Type u} [Field K] + +/-- The compositum of the standard `π`-level and the standard `uπ`-level +inside the fixed separable closure. -/ +abbrev standardLubinTateChangedLevelCompositumField + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + IntermediateField K (SeparableClosure K) := + standardLubinTateLevelField hπ n ⊔ + standardLubinTateChangedLevelField hπ u n + +/-- The original and changed finite levels have a finite-dimensional +compositum over the base field. -/ +theorem standardLubinTateChangedLevelCompositumField_finiteDimensional + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + FiniteDimensional K + (standardLubinTateChangedLevelCompositumField hπ u n) := by + let L := standardLubinTateLevelField hπ n + let L' := standardLubinTateChangedLevelField hπ u n + let hπ' := + standardLubinTateChangedUniformizer_isUniformizer hπ u + let : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + let : FiniteDimensional K L' := + standardLubinTateLevelField_finiteDimensional hπ' n + exact L.finiteDimensional_sup L' + +/-- The compositum is separable over the base field. -/ +theorem standardLubinTateChangedLevelCompositumField_isSeparable + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + Algebra.IsSeparable K + (standardLubinTateChangedLevelCompositumField hπ u n) := by + let L := standardLubinTateLevelField hπ n + let L' := standardLubinTateChangedLevelField hπ u n + let hπ' := + standardLubinTateChangedUniformizer_isUniformizer hπ u + let : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + let : FiniteDimensional K L' := + standardLubinTateLevelField_finiteDimensional hπ' n + let : IsGalois K L := + standardLubinTateLevelField_isGalois (F := F) hπ n + let : IsGalois K L' := + standardLubinTateLevelField_isGalois (F := F) hπ' n + infer_instance + +/-- The compositum is Galois over the base field. -/ +theorem standardLubinTateChangedLevelCompositumField_isGalois + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + IsGalois K + (standardLubinTateChangedLevelCompositumField hπ u n) := by + let L := standardLubinTateLevelField hπ n + let L' := standardLubinTateChangedLevelField hπ u n + let M := standardLubinTateChangedLevelCompositumField hπ u n + let hπ' := + standardLubinTateChangedUniformizer_isUniformizer hπ u + let : IsGalois K L := + standardLubinTateLevelField_isGalois (F := F) hπ n + let : IsGalois K L' := + standardLubinTateLevelField_isGalois (F := F) hπ' n + let : Algebra.IsSeparable K M := + standardLubinTateChangedLevelCompositumField_isSeparable hπ u n + exact + { to_isSeparable := inferInstance + to_normal := inferInstance } + +private theorem + standardLubinTateChangedLevelCompositumCompleteDVFData_exists + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + ∃ target : CompleteDVF.{u, 0} + (standardLubinTateChangedLevelCompositumField hπ u n), + ∃ hExt : + F.toCompleteDVF.valuation.HasExtension target.valuation, + letI : + F.toCompleteDVF.valuation.HasExtension target.valuation := + hExt + IsIntegralClosure target.valuationSubring F.valuationSubring + (standardLubinTateChangedLevelCompositumField hπ u n) ∧ + degree F.toCompleteDVF.toDVF target.toDVF = + ramificationIndex F.toCompleteDVF.toDVF target.toDVF * + residueDegree F.toCompleteDVF.toDVF target.toDVF := by + let M := standardLubinTateChangedLevelCompositumField hπ u n + let : FiniteDimensional K M := + standardLubinTateChangedLevelCompositumField_finiteDimensional + hπ u n + let : Algebra.IsSeparable K M := + standardLubinTateChangedLevelCompositumField_isSeparable hπ u n + exact + exists_integralClosure_standard_fundamental_identity + (K := K) (L := M) F.toCompleteDVF + +/-- The complete discrete valuation on the common compositum selected from +the integral closure of the base valuation ring. -/ +noncomputable def standardLubinTateChangedLevelCompositumCompleteDVF + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + CompleteDVF.{u, 0} + (standardLubinTateChangedLevelCompositumField hπ u n) := + Classical.choose + (show ∃ target : CompleteDVF.{u, 0} + (standardLubinTateChangedLevelCompositumField hπ u n), + ∃ hExt : + F.toCompleteDVF.valuation.HasExtension target.valuation, + letI : + F.toCompleteDVF.valuation.HasExtension target.valuation := + hExt + IsIntegralClosure target.valuationSubring F.valuationSubring + (standardLubinTateChangedLevelCompositumField hπ u n) ∧ + degree F.toCompleteDVF.toDVF target.toDVF = + ramificationIndex F.toCompleteDVF.toDVF target.toDVF * + residueDegree F.toCompleteDVF.toDVF target.toDVF from by + exact standardLubinTateChangedLevelCompositumCompleteDVFData_exists hπ u n) + +/-- The compositum valuation extends the base valuation. -/ +theorem + standardLubinTateChangedLevelCompositumCompleteDVF_hasExtension + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + F.toCompleteDVF.valuation.HasExtension + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuation := + Classical.choose + (Classical.choose_spec + (standardLubinTateChangedLevelCompositumCompleteDVFData_exists + hπ u n)) + +noncomputable instance + standardLubinTateChangedLevelCompositumCompleteDVF_hasExtensionInstance + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + F.toCompleteDVF.valuation.HasExtension + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuation := + standardLubinTateChangedLevelCompositumCompleteDVF_hasExtension + hπ u n + +/-- The chosen compositum valuation ring is the integral closure of the base +valuation ring. -/ +theorem + standardLubinTateChangedLevelCompositumCompleteDVF_isIntegralClosure + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + IsIntegralClosure + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuationSubring + F.valuationSubring + (standardLubinTateChangedLevelCompositumField hπ u n) := + (Classical.choose_spec + (Classical.choose_spec + (standardLubinTateChangedLevelCompositumCompleteDVFData_exists + hπ u n))).1 + +/-- The chosen compositum valuation satisfies the finite-extension +fundamental identity. -/ +theorem + standardLubinTateChangedLevelCompositumCompleteDVF_fundamentalIdentity + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + degree F.toCompleteDVF.toDVF target.toDVF = + ramificationIndex F.toCompleteDVF.toDVF target.toDVF * + residueDegree F.toCompleteDVF.toDVF target.toDVF := + (Classical.choose_spec + (Classical.choose_spec + (standardLubinTateChangedLevelCompositumCompleteDVFData_exists + hπ u n))).2 + +/-- Completeness of the base makes the chosen compositum valuation the unique +extension of the base valuation. -/ +theorem + standardLubinTateChangedLevelCompositumCompleteDVF_hasUniqueValuationExtension + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + ValuationTheory.DiscreteValuationField.ValuedExtension.HasUniqueValuationExtension.{u, v, u, + 0, 0} + (base := F.toCompleteDVF) + (target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n) := by + let M := standardLubinTateChangedLevelCompositumField hπ u n + let : FiniteDimensional K M := + standardLubinTateChangedLevelCompositumField_finiteDimensional + hπ u n + let : Algebra.IsSeparable K M := + standardLubinTateChangedLevelCompositumField_isSeparable hπ u n + intro Gamma' _ v' + exact + (hasUniqueValuationExtension_of_finite_separable.{u, v, u, 0, 0} + F.toCompleteDVF + (standardLubinTateChangedLevelCompositumCompleteDVF hπ u n)) v' + +/-- The same uniqueness statement after forgetting completeness. -/ +theorem + standardLubinTateChangedLevelCompositumCompleteDVF_hasUniqueDVFValuationExtension + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, u, 0, 0} + F.toCompleteDVF.toDVF + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).toDVF := + standardLubinTateChangedLevelCompositumCompleteDVF_hasUniqueValuationExtension + hπ u n + +/-- The literal inclusion of the original level into the common +compositum. -/ +noncomputable def standardLubinTateLevelToChangedLevelCompositum + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + standardLubinTateLevelField hπ n →ₐ[K] + standardLubinTateChangedLevelCompositumField hπ u n := + IntermediateField.inclusion le_sup_left + +/-- The literal inclusion of the changed level into the common +compositum. -/ +noncomputable def standardLubinTateChangedLevelToCompositum + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + standardLubinTateChangedLevelField hπ u n →ₐ[K] + standardLubinTateChangedLevelCompositumField hπ u n := + IntermediateField.inclusion le_sup_right + +/-- The original-level inclusion is the ambient identity on separable-closure +elements. -/ +@[simp] +theorem standardLubinTateLevelToChangedLevelCompositum_coe + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + (x : standardLubinTateLevelField hπ n) : + ((standardLubinTateLevelToChangedLevelCompositum hπ u n x : + standardLubinTateChangedLevelCompositumField hπ u n) : + SeparableClosure K) = + (x : SeparableClosure K) := + IntermediateField.coe_inclusion le_sup_left x + +/-- The changed-level inclusion is the ambient identity on +separable-closure elements. -/ +@[simp] +theorem standardLubinTateChangedLevelToCompositum_coe + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + (x : standardLubinTateChangedLevelField hπ u n) : + ((standardLubinTateChangedLevelToCompositum hπ u n x : + standardLubinTateChangedLevelCompositumField hπ u n) : + SeparableClosure K) = + (x : SeparableClosure K) := + IntermediateField.coe_inclusion le_sup_right x + +/-- The original primitive generator has the same ambient value after +inclusion in the compositum. -/ +theorem + standardLubinTateLevelToChangedLevelCompositum_levelGenerator_coe + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + ((standardLubinTateLevelToChangedLevelCompositum hπ u n + (standardLubinTateLevelGenerator hπ n) : + standardLubinTateChangedLevelCompositumField hπ u n) : + SeparableClosure K) = + chosenStandardLubinTatePrimitiveRoot hπ n := by + simp + +/-- The changed primitive generator has the same ambient value after +inclusion in the compositum. -/ +theorem + standardLubinTateChangedLevelToCompositum_levelGenerator_coe + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + ((standardLubinTateChangedLevelToCompositum hπ u n + (standardLubinTateChangedLevelGenerator hπ u n) : + standardLubinTateChangedLevelCompositumField hπ u n) : + SeparableClosure K) = + chosenStandardLubinTatePrimitiveRoot + (standardLubinTateChangedUniformizer_isUniformizer hπ u) n := by + simp + +/-- The algebra structure corresponding to the original-level inclusion. -/ +@[reducible] +noncomputable def standardLubinTateLevelToChangedLevelCompositumAlgebra + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + Algebra (standardLubinTateLevelField hπ n) + (standardLubinTateChangedLevelCompositumField hπ u n) := + RingHom.toAlgebra + (standardLubinTateLevelToChangedLevelCompositum + hπ u n).toRingHom + +/-- The algebra structure corresponding to the changed-level inclusion. -/ +@[reducible] +noncomputable def standardLubinTateChangedLevelToCompositumAlgebra + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + Algebra (standardLubinTateChangedLevelField hπ u n) + (standardLubinTateChangedLevelCompositumField hπ u n) := + RingHom.toAlgebra + (standardLubinTateChangedLevelToCompositum + hπ u n).toRingHom + +/-- The compositum valuation extends the chosen valuation on the original +level. -/ +theorem standardLubinTateLevelToChangedLevelCompositum_hasExtension + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + letI : Algebra (standardLubinTateLevelField hπ n) + (standardLubinTateChangedLevelCompositumField hπ u n) := + standardLubinTateLevelToChangedLevelCompositumAlgebra hπ u n + (standardLubinTateLevelCompleteDVF hπ n).valuation.HasExtension + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuation := by + let L := standardLubinTateLevelField hπ n + let M := standardLubinTateChangedLevelCompositumField hπ u n + let level := standardLubinTateLevelCompleteDVF hπ n + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + let : Algebra L M := + standardLubinTateLevelToChangedLevelCompositumAlgebra hπ u n + let : IsScalarTower K L M := + IsScalarTower.of_algebraMap_eq' rfl + let vcomap := target.valuation.comap (algebraMap L M) + let : F.toCompleteDVF.valuation.HasExtension vcomap := + { val_isEquiv_comap := by + rw [_root_.Valuation.isEquiv_iff_val_le_one] + intro a + change + F.toCompleteDVF.valuation a ≤ 1 ↔ + target.valuation + (algebraMap L M (algebraMap K L a)) ≤ 1 + rw [← IsScalarTower.algebraMap_apply K L M] + exact + (_root_.Valuation.HasExtension.val_map_le_one_iff + (vR := F.toCompleteDVF.valuation) + (vA := target.valuation) a).symm } + exact + { val_isEquiv_comap := by + simpa only [vcomap] using + standardLubinTateLevelCompleteDVF_hasUniqueValuationExtension + hπ n vcomap } + +/-- The compositum valuation extends the chosen valuation on the changed +level. -/ +theorem standardLubinTateChangedLevelToCompositum_hasExtension + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + letI : Algebra (standardLubinTateChangedLevelField hπ u n) + (standardLubinTateChangedLevelCompositumField hπ u n) := + standardLubinTateChangedLevelToCompositumAlgebra hπ u n + (standardLubinTateLevelCompleteDVF + (standardLubinTateChangedUniformizer_isUniformizer + hπ u) n).valuation.HasExtension + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuation := by + let hπ' := + standardLubinTateChangedUniformizer_isUniformizer hπ u + let L' := standardLubinTateChangedLevelField hπ u n + let M := standardLubinTateChangedLevelCompositumField hπ u n + let level := standardLubinTateLevelCompleteDVF hπ' n + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + let : Algebra L' M := + standardLubinTateChangedLevelToCompositumAlgebra hπ u n + let : IsScalarTower K L' M := + IsScalarTower.of_algebraMap_eq' rfl + let vcomap := target.valuation.comap (algebraMap L' M) + let : F.toCompleteDVF.valuation.HasExtension vcomap := + { val_isEquiv_comap := by + rw [_root_.Valuation.isEquiv_iff_val_le_one] + intro a + change + F.toCompleteDVF.valuation a ≤ 1 ↔ + target.valuation + (algebraMap L' M (algebraMap K L' a)) ≤ 1 + rw [← IsScalarTower.algebraMap_apply K L' M] + exact + (_root_.Valuation.HasExtension.val_map_le_one_iff + (vR := F.toCompleteDVF.valuation) + (vA := target.valuation) a).symm } + exact + { val_isEquiv_comap := by + simpa only [vcomap] using + standardLubinTateLevelCompleteDVF_hasUniqueValuationExtension + hπ' n vcomap } + +/-- The common valuation detects integrality of an original-level element +exactly as the chosen original-level valuation does. -/ +theorem + standardLubinTateLevelToChangedLevelCompositum_val_le_one_iff + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + (x : standardLubinTateLevelField hπ n) : + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuation + (standardLubinTateLevelToChangedLevelCompositum + hπ u n x) ≤ 1 ↔ + (standardLubinTateLevelCompleteDVF hπ n).valuation x ≤ 1 := by + let L := standardLubinTateLevelField hπ n + let M := standardLubinTateChangedLevelCompositumField hπ u n + let level := standardLubinTateLevelCompleteDVF hπ n + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + let : Algebra L M := + standardLubinTateLevelToChangedLevelCompositumAlgebra hπ u n + let : level.valuation.HasExtension target.valuation := + standardLubinTateLevelToChangedLevelCompositum_hasExtension + hπ u n + change + target.valuation (algebraMap L M x) ≤ 1 ↔ + level.valuation x ≤ 1 + exact + _root_.Valuation.HasExtension.val_map_le_one_iff + (vR := level.valuation) (vA := target.valuation) x + +/-- The common valuation detects maximal-ideal membership of an +original-level element. -/ +theorem + standardLubinTateLevelToChangedLevelCompositum_val_lt_one_iff + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + (x : standardLubinTateLevelField hπ n) : + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuation + (standardLubinTateLevelToChangedLevelCompositum + hπ u n x) < 1 ↔ + (standardLubinTateLevelCompleteDVF hπ n).valuation x < 1 := by + let L := standardLubinTateLevelField hπ n + let M := standardLubinTateChangedLevelCompositumField hπ u n + let level := standardLubinTateLevelCompleteDVF hπ n + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + let : Algebra L M := + standardLubinTateLevelToChangedLevelCompositumAlgebra hπ u n + let : level.valuation.HasExtension target.valuation := + standardLubinTateLevelToChangedLevelCompositum_hasExtension + hπ u n + change + target.valuation (algebraMap L M x) < 1 ↔ + level.valuation x < 1 + exact + _root_.Valuation.HasExtension.val_map_lt_one_iff + (vR := level.valuation) (vA := target.valuation) x + +/-- The common valuation detects integrality of a changed-level element +exactly as the chosen changed-level valuation does. -/ +theorem + standardLubinTateChangedLevelToCompositum_val_le_one_iff + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + (x : standardLubinTateChangedLevelField hπ u n) : + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuation + (standardLubinTateChangedLevelToCompositum hπ u n x) ≤ 1 ↔ + (standardLubinTateLevelCompleteDVF + (standardLubinTateChangedUniformizer_isUniformizer + hπ u) n).valuation x ≤ 1 := by + let hπ' := + standardLubinTateChangedUniformizer_isUniformizer hπ u + let L' := standardLubinTateChangedLevelField hπ u n + let M := standardLubinTateChangedLevelCompositumField hπ u n + let level := standardLubinTateLevelCompleteDVF hπ' n + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + let : Algebra L' M := + standardLubinTateChangedLevelToCompositumAlgebra hπ u n + let : level.valuation.HasExtension target.valuation := + standardLubinTateChangedLevelToCompositum_hasExtension hπ u n + change + target.valuation (algebraMap L' M x) ≤ 1 ↔ + level.valuation x ≤ 1 + exact + _root_.Valuation.HasExtension.val_map_le_one_iff + (vR := level.valuation) (vA := target.valuation) x + +/-- The common valuation detects maximal-ideal membership of a changed-level +element. -/ +theorem + standardLubinTateChangedLevelToCompositum_val_lt_one_iff + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + (x : standardLubinTateChangedLevelField hπ u n) : + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuation + (standardLubinTateChangedLevelToCompositum hπ u n x) < 1 ↔ + (standardLubinTateLevelCompleteDVF + (standardLubinTateChangedUniformizer_isUniformizer + hπ u) n).valuation x < 1 := by + let hπ' := + standardLubinTateChangedUniformizer_isUniformizer hπ u + let L' := standardLubinTateChangedLevelField hπ u n + let M := standardLubinTateChangedLevelCompositumField hπ u n + let level := standardLubinTateLevelCompleteDVF hπ' n + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + let : Algebra L' M := + standardLubinTateChangedLevelToCompositumAlgebra hπ u n + let : level.valuation.HasExtension target.valuation := + standardLubinTateChangedLevelToCompositum_hasExtension hπ u n + change + target.valuation (algebraMap L' M x) < 1 ↔ + level.valuation x < 1 + exact + _root_.Valuation.HasExtension.val_map_lt_one_iff + (vR := level.valuation) (vA := target.valuation) x + +/-- The ramification index of the original level inside the common +compositum. -/ +noncomputable def + standardLubinTateLevelToChangedLevelCompositumRamificationIndex + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : ℕ := by + let L := standardLubinTateLevelField hπ n + let M := standardLubinTateChangedLevelCompositumField hπ u n + let level := standardLubinTateLevelCompleteDVF hπ n + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + letI : Algebra L M := + standardLubinTateLevelToChangedLevelCompositumAlgebra hπ u n + letI : level.valuation.HasExtension target.valuation := + standardLubinTateLevelToChangedLevelCompositum_hasExtension + hπ u n + exact ramificationIndex level.toDVF target.toDVF + +/-- The ramification index of the changed level inside the common +compositum. -/ +noncomputable def + standardLubinTateChangedLevelToCompositumRamificationIndex + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : ℕ := by + let hπ' := + standardLubinTateChangedUniformizer_isUniformizer hπ u + let L' := standardLubinTateChangedLevelField hπ u n + let M := standardLubinTateChangedLevelCompositumField hπ u n + let level := standardLubinTateLevelCompleteDVF hπ' n + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + letI : Algebra L' M := + standardLubinTateChangedLevelToCompositumAlgebra hπ u n + letI : level.valuation.HasExtension target.valuation := + standardLubinTateChangedLevelToCompositum_hasExtension hπ u n + exact ramificationIndex level.toDVF target.toDVF + +/-- The valuation-ring map induced by the original-level inclusion. -/ +noncomputable def + standardLubinTateLevelToChangedLevelCompositumIntegerMap + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring →+* + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuationSubring := by + let L := standardLubinTateLevelField hπ n + let M := standardLubinTateChangedLevelCompositumField hπ u n + let level := standardLubinTateLevelCompleteDVF hπ n + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + letI : Algebra L M := + standardLubinTateLevelToChangedLevelCompositumAlgebra hπ u n + letI : level.valuation.HasExtension target.valuation := + standardLubinTateLevelToChangedLevelCompositum_hasExtension + hπ u n + exact integerMap level.toDVF target.toDVF + +/-- The valuation-ring map induced by the changed-level inclusion. -/ +noncomputable def + standardLubinTateChangedLevelToCompositumIntegerMap + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + (standardLubinTateLevelCompleteDVF + (standardLubinTateChangedUniformizer_isUniformizer + hπ u) n).valuationSubring →+* + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuationSubring := by + let hπ' := + standardLubinTateChangedUniformizer_isUniformizer hπ u + let L' := standardLubinTateChangedLevelField hπ u n + let M := standardLubinTateChangedLevelCompositumField hπ u n + let level := standardLubinTateLevelCompleteDVF hπ' n + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + letI : Algebra L' M := + standardLubinTateChangedLevelToCompositumAlgebra hπ u n + letI : level.valuation.HasExtension target.valuation := + standardLubinTateChangedLevelToCompositum_hasExtension hπ u n + exact integerMap level.toDVF target.toDVF + +/-- Coercion of the original-level integer map is the field inclusion. -/ +@[simp] +theorem + standardLubinTateLevelToChangedLevelCompositumIntegerMap_apply_coe + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + (a : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) : + (((standardLubinTateLevelToChangedLevelCompositumIntegerMap + hπ u n a : + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuationSubring)) : + standardLubinTateChangedLevelCompositumField hπ u n) = + standardLubinTateLevelToChangedLevelCompositum + hπ u n (a : + standardLubinTateLevelField hπ n) := by + let L := standardLubinTateLevelField hπ n + let M := standardLubinTateChangedLevelCompositumField hπ u n + let level := standardLubinTateLevelCompleteDVF hπ n + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + let : Algebra L M := + standardLubinTateLevelToChangedLevelCompositumAlgebra hπ u n + let : level.valuation.HasExtension target.valuation := + standardLubinTateLevelToChangedLevelCompositum_hasExtension + hπ u n + change + (((integerMap level.toDVF target.toDVF a : + target.valuationSubring)) : M) = + standardLubinTateLevelToChangedLevelCompositum hπ u n (a : L) + rw [integerMap_apply] + rfl + +/-- Coercion of the changed-level integer map is the field inclusion. -/ +@[simp] +theorem + standardLubinTateChangedLevelToCompositumIntegerMap_apply_coe + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + (a : + (standardLubinTateLevelCompleteDVF + (standardLubinTateChangedUniformizer_isUniformizer + hπ u) n).valuationSubring) : + (((standardLubinTateChangedLevelToCompositumIntegerMap + hπ u n a : + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuationSubring)) : + standardLubinTateChangedLevelCompositumField hπ u n) = + standardLubinTateChangedLevelToCompositum + hπ u n (a : + standardLubinTateChangedLevelField hπ u n) := by + let hπ' := + standardLubinTateChangedUniformizer_isUniformizer hπ u + let L' := standardLubinTateChangedLevelField hπ u n + let M := standardLubinTateChangedLevelCompositumField hπ u n + let level := standardLubinTateLevelCompleteDVF hπ' n + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + let : Algebra L' M := + standardLubinTateChangedLevelToCompositumAlgebra hπ u n + let : level.valuation.HasExtension target.valuation := + standardLubinTateChangedLevelToCompositum_hasExtension hπ u n + change + (((integerMap level.toDVF target.toDVF a : + target.valuationSubring)) : M) = + standardLubinTateChangedLevelToCompositum hπ u n (a : L') + rw [integerMap_apply] + rfl + +/-- Normalized additive valuation along the original-level inclusion scales +by its ramification index in the compositum. -/ +theorem standardLubinTateLevelToChangedLevelCompositum_addVal + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + (a : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) : + IsDiscreteValuationRing.addVal + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuationSubring + (standardLubinTateLevelToChangedLevelCompositumIntegerMap + hπ u n a) = + standardLubinTateLevelToChangedLevelCompositumRamificationIndex + hπ u n • + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF + hπ n).valuationSubring a := by + let L := standardLubinTateLevelField hπ n + let M := standardLubinTateChangedLevelCompositumField hπ u n + let level := standardLubinTateLevelCompleteDVF hπ n + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + let : Algebra L M := + standardLubinTateLevelToChangedLevelCompositumAlgebra hπ u n + let : level.valuation.HasExtension target.valuation := + standardLubinTateLevelToChangedLevelCompositum_hasExtension + hπ u n + change + IsDiscreteValuationRing.addVal target.valuationSubring + (integerMap level.toDVF target.toDVF a) = + ramificationIndex level.toDVF target.toDVF • + IsDiscreteValuationRing.addVal level.valuationSubring a + exact + addVal_integerMap_eq_ramificationIndex_nsmul level target a + +/-- Normalized additive valuation along the changed-level inclusion scales +by its ramification index in the compositum. -/ +theorem standardLubinTateChangedLevelToCompositum_addVal + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + (a : + (standardLubinTateLevelCompleteDVF + (standardLubinTateChangedUniformizer_isUniformizer + hπ u) n).valuationSubring) : + IsDiscreteValuationRing.addVal + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuationSubring + (standardLubinTateChangedLevelToCompositumIntegerMap + hπ u n a) = + standardLubinTateChangedLevelToCompositumRamificationIndex + hπ u n • + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF + (standardLubinTateChangedUniformizer_isUniformizer + hπ u) n).valuationSubring a := by + let hπ' := + standardLubinTateChangedUniformizer_isUniformizer hπ u + let L' := standardLubinTateChangedLevelField hπ u n + let M := standardLubinTateChangedLevelCompositumField hπ u n + let level := standardLubinTateLevelCompleteDVF hπ' n + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + let : Algebra L' M := + standardLubinTateChangedLevelToCompositumAlgebra hπ u n + let : level.valuation.HasExtension target.valuation := + standardLubinTateChangedLevelToCompositum_hasExtension hπ u n + change + IsDiscreteValuationRing.addVal target.valuationSubring + (integerMap level.toDVF target.toDVF a) = + ramificationIndex level.toDVF target.toDVF • + IsDiscreteValuationRing.addVal level.valuationSubring a + exact + addVal_integerMap_eq_ramificationIndex_nsmul level target a + +private theorem nat_eq_of_nsmul_enat_eq + {a b d : ℕ} (hd : 0 < d) + (h : a • (d : ℕ∞) = b • (d : ℕ∞)) : + a = b := by + have hmul : + (a : ℕ∞) * (d : ℕ∞) = (b : ℕ∞) * (d : ℕ∞) := by + simpa only [nsmul_eq_mul] using h + have hmulNat := congrArg ENat.toNat hmul + have habd : a * d = b * d := by + simpa only [ENat.toNat_mul, ENat.toNat_natCast] using hmulNat + exact Nat.eq_of_mul_eq_mul_right hd habd + +/-- The original and changed levels have the same ramification index inside +their common compositum. + +Both relative indices scale the valuation of the same base uniformizer. +That uniformizer has the common finite-level valuation +`(q - 1) * q ^ n` on either side, and its two images in the literal +compositum agree. Positivity of the finite-level degree then permits +cancellation. -/ +theorem + standardLubinTateLevelToChangedLevelCompositumRamificationIndex_eq + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + standardLubinTateLevelToChangedLevelCompositumRamificationIndex + hπ u n = + standardLubinTateChangedLevelToCompositumRamificationIndex + hπ u n := by + let hπ' := + standardLubinTateChangedUniformizer_isUniformizer hπ u + let L := standardLubinTateLevelField hπ n + let L' := standardLubinTateChangedLevelField hπ u n + let M := standardLubinTateChangedLevelCompositumField hπ u n + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + let : Algebra L M := + standardLubinTateLevelToChangedLevelCompositumAlgebra hπ u n + let : Algebra L' M := + standardLubinTateChangedLevelToCompositumAlgebra hπ u n + let : IsScalarTower K L M := + IsScalarTower.of_algebraMap_eq' rfl + let : IsScalarTower K L' M := + IsScalarTower.of_algebraMap_eq' rfl + let d := + (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n + have holdBase : + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (standardLubinTateLevelCoefficientHom hπ n π) = + (d : ℕ∞) := by + simpa only [standardLubinTateLevelCoefficientHom, d] using + standardLubinTateUniformizerInteger_map_addVal hπ hπ n + have hchangedBase : + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ' n).valuationSubring + (standardLubinTateLevelCoefficientHom hπ' n π) = + (d : ℕ∞) := by + simpa only [standardLubinTateLevelCoefficientHom, d] using + standardLubinTateUniformizerInteger_map_addVal hπ' hπ n + have hmap : + standardLubinTateLevelToChangedLevelCompositumIntegerMap + hπ u n (standardLubinTateLevelCoefficientHom hπ n π) = + standardLubinTateChangedLevelToCompositumIntegerMap + hπ u n (standardLubinTateLevelCoefficientHom hπ' n π) := by + apply Subtype.ext + rw [ + standardLubinTateLevelToChangedLevelCompositumIntegerMap_apply_coe, + standardLubinTateChangedLevelToCompositumIntegerMap_apply_coe] + change + algebraMap L M + (standardLubinTateLevelCoefficientHom hπ n π : L) = + algebraMap L' M + (standardLubinTateLevelCoefficientHom hπ' n π : L') + rw [ + standardLubinTateLevelCoefficientHom_apply, + standardLubinTateLevelCoefficientHom_apply] + rw [← IsScalarTower.algebraMap_apply K L M, + ← IsScalarTower.algebraMap_apply K L' M] + have hold := + standardLubinTateLevelToChangedLevelCompositum_addVal hπ u n + (standardLubinTateLevelCoefficientHom hπ n π) + have hchanged := + standardLubinTateChangedLevelToCompositum_addVal hπ u n + (standardLubinTateLevelCoefficientHom hπ' n π) + rw [holdBase] at hold + rw [hchangedBase] at hchanged + have hscaled : + standardLubinTateLevelToChangedLevelCompositumRamificationIndex + hπ u n • (d : ℕ∞) = + standardLubinTateChangedLevelToCompositumRamificationIndex + hπ u n • (d : ℕ∞) := by + calc + standardLubinTateLevelToChangedLevelCompositumRamificationIndex + hπ u n • (d : ℕ∞) = + IsDiscreteValuationRing.addVal target.valuationSubring + (standardLubinTateLevelToChangedLevelCompositumIntegerMap + hπ u n + (standardLubinTateLevelCoefficientHom hπ n π)) := + hold.symm + _ = + IsDiscreteValuationRing.addVal target.valuationSubring + (standardLubinTateChangedLevelToCompositumIntegerMap + hπ u n + (standardLubinTateLevelCoefficientHom hπ' n π)) := by + rw [hmap] + _ = + standardLubinTateChangedLevelToCompositumRamificationIndex + hπ u n • (d : ℕ∞) := + hchanged + have hdpos : 0 < d := by + exact Nat.mul_pos + (Nat.sub_pos_of_lt (Finite.one_lt_card : + 1 < Nat.card F.residueField)) + (pow_pos + (Nat.zero_lt_one.trans (Finite.one_lt_card : + 1 < Nat.card F.residueField)) n) + exact nat_eq_of_nsmul_enat_eq hdpos hscaled + +/-- Original-level maximal-ideal depth scales by the ramification index in +the compositum. -/ +theorem + standardLubinTateLevelToChangedLevelCompositumIntegerMap_mem_maximalIdeal_pow + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n r : ℕ) + {a : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring} + (ha : + a ∈ (standardLubinTateLevelCompleteDVF + hπ n).maximalIdeal ^ r) : + standardLubinTateLevelToChangedLevelCompositumIntegerMap hπ u n a ∈ + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).maximalIdeal ^ + (standardLubinTateLevelToChangedLevelCompositumRamificationIndex + hπ u n * r) := by + let L := standardLubinTateLevelField hπ n + let M := standardLubinTateChangedLevelCompositumField hπ u n + let level := standardLubinTateLevelCompleteDVF hπ n + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + let : Algebra L M := + standardLubinTateLevelToChangedLevelCompositumAlgebra hπ u n + let : level.valuation.HasExtension target.valuation := + standardLubinTateLevelToChangedLevelCompositum_hasExtension + hπ u n + change + integerMap level.toDVF target.toDVF a ∈ + target.maximalIdeal ^ + (ramificationIndex level.toDVF target.toDVF * r) + exact + integerMap_mem_target_maximalIdeal_pow_mul_ramificationIndex + level target ha + +/-- Changed-level maximal-ideal depth scales by the ramification index in +the compositum. -/ +theorem + standardLubinTateChangedLevelToCompositumIntegerMap_mem_maximalIdeal_pow + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n r : ℕ) + {a : + (standardLubinTateLevelCompleteDVF + (standardLubinTateChangedUniformizer_isUniformizer + hπ u) n).valuationSubring} + (ha : + a ∈ (standardLubinTateLevelCompleteDVF + (standardLubinTateChangedUniformizer_isUniformizer + hπ u) n).maximalIdeal ^ r) : + standardLubinTateChangedLevelToCompositumIntegerMap hπ u n a ∈ + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).maximalIdeal ^ + (standardLubinTateChangedLevelToCompositumRamificationIndex + hπ u n * r) := by + let hπ' := + standardLubinTateChangedUniformizer_isUniformizer hπ u + let L' := standardLubinTateChangedLevelField hπ u n + let M := standardLubinTateChangedLevelCompositumField hπ u n + let level := standardLubinTateLevelCompleteDVF hπ' n + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + let : Algebra L' M := + standardLubinTateChangedLevelToCompositumAlgebra hπ u n + let : level.valuation.HasExtension target.valuation := + standardLubinTateChangedLevelToCompositum_hasExtension hπ u n + change + integerMap level.toDVF target.toDVF a ∈ + target.maximalIdeal ^ + (ramificationIndex level.toDVF target.toDVF * r) + exact + integerMap_mem_target_maximalIdeal_pow_mul_ramificationIndex + level target ha + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedPrimitiveEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedPrimitiveEvaluation.lean new file mode 100644 index 0000000000..cad5a58c7c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedPrimitiveEvaluation.lean @@ -0,0 +1,194 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ParameterCongruence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueQuotient +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumber +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal +/-! +# Evaluating a changed primitive polynomial at the original primitive point + +Let `π` be a uniformizer, let `u` be a unit with +`u - 1 ∈ m^(n+1)`, and put `π' = uπ`. The parameter difference +`π' - π` then lies in `m^(n+2)`. At the standard primitive level `n + 1`, +whose ramification index is + +`d = (q - 1) q^n`, + +this difference maps into the `d(n+2)`-th power of the target maximal ideal. +The parameter-congruence theorem consequently shows that the changed +primitive polynomial evaluated at the original primitive point has additive +valuation at least `d(n+2)`. + +This is the quantitative algebraic input for the characteristic-independent +Krasner comparison of the original and changed finite levels. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.ValuedExtension +open RamificationTheory.HilbertRamification.Higher +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +variable {K : Type u} [Field K] + +/-- A depth-`n+1` unit changes a uniformizer only in depth `n+2`. -/ +theorem standardLubinTateChangedUniformizer_sub_mem_maximalIdeal_pow + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + (hu : u ∈ + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1)) : + standardLubinTateChangedUniformizer F π u - π ∈ + F.maximalIdeal ^ (n + 2) := by + have hu' : + (u : F.valuationSubring) - 1 ∈ + F.maximalIdeal ^ (n + 1) := + (CompleteDVF.higherPrincipalUnitGroup.mem_iff + F.toCompleteDVF (n + 1) u).1 hu + have hπmem : π ∈ F.maximalIdeal := + F.toCompleteDVF.uniformizer_mem_maximalIdeal hπ + have hmul : + ((u : F.valuationSubring) - 1) * π ∈ + (F.maximalIdeal ^ (n + 1)) * F.maximalIdeal := + Ideal.mul_mem_mul hu' hπmem + have heq : + standardLubinTateChangedUniformizer F π u - π = + ((u : F.valuationSubring) - 1) * π := by + simp only [standardLubinTateChangedUniformizer] + ring + rw [heq] + simpa [pow_succ, Nat.add_assoc] using hmul + +/-- In the original standard level, the changed and original parameters +remain congruent through target depth `d(n+2)`. -/ +theorem + standardLubinTateChangedUniformizer_map_sub_mem_levelMaximalIdeal_pow + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + (hu : u ∈ + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1)) : + standardLubinTateLevelCoefficientHom hπ n + (standardLubinTateChangedUniformizer F π u) - + standardLubinTateLevelCoefficientHom hπ n π ∈ + (standardLubinTateLevelCompleteDVF hπ n).maximalIdeal ^ + (((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n) * (n + 2)) := by + let base := F.toCompleteDVF + let target := standardLubinTateLevelCompleteDVF hπ n + have hbase : + standardLubinTateChangedUniformizer F π u - π ∈ + base.maximalIdeal ^ (n + 2) := + standardLubinTateChangedUniformizer_sub_mem_maximalIdeal_pow + hπ u n hu + have hmapped : + integerMap base.toDVF target.toDVF + (standardLubinTateChangedUniformizer F π u - π) ∈ + target.maximalIdeal ^ + (ramificationIndex base.toDVF target.toDVF * (n + 2)) := + integerMap_mem_target_maximalIdeal_pow_mul_ramificationIndex + base target hbase + have he : + ramificationIndex base.toDVF target.toDVF = + (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := by + rw [standardLubinTateLevel_ramificationIndex_eq_degree hπ n, + degree_eq_finrank, + standardLubinTateLevelField_finrank hπ n] + rw [he] at hmapped + simpa [base, target, standardLubinTateLevelCoefficientHom] using hmapped + +/-- The changed primitive polynomial, evaluated at the original primitive +point, lies in target depth `d(n+2)`. -/ +theorem standardLubinTateChangedPrimitivePolynomial_eval_mem_maximalIdeal_pow + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + (hu : u ∈ + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1)) : + Polynomial.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePrimitivePolynomial F + (standardLubinTateChangedUniformizer F π u) n) ∈ + (standardLubinTateLevelCompleteDVF hπ n).maximalIdeal ^ + (((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n) * (n + 2)) := by + let target := standardLubinTateLevelCompleteDVF hπ n + let I := + target.maximalIdeal ^ + (((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n) * (n + 2)) + have hparameter : + standardLubinTateLevelCoefficientHom hπ n + (standardLubinTateChangedUniformizer F π u) - + standardLubinTateLevelCoefficientHom hπ n π ∈ I := by + simpa [target, I] using + standardLubinTateChangedUniformizer_map_sub_mem_levelMaximalIdeal_pow + hπ u n hu + have hcongr := + standardLubinTatePrimitivePolynomial_eval₂_sub_mem_of_parameter_sub_mem + F (standardLubinTateLevelCoefficientHom hπ n) I + hparameter n (standardLubinTatePrimitivePointInteger hπ n) + have horiginal : + Polynomial.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePrimitivePolynomial F π n) = 0 := by + simpa [Polynomial.aeval_def, standardLubinTateLevelCoefficientHom, + integerMap] using + standardLubinTatePrimitivePointInteger_aeval hπ n + simpa [I, horiginal] using hcongr + +/-- Quantitative form of the changed-polynomial evaluation estimate. -/ +theorem standardLubinTateChangedPrimitivePolynomial_eval_addVal_ge + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + (hu : u ∈ + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1)) : + ((((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n) * (n + 2) : ℕ) : ℕ∞) ≤ + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (Polynomial.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePrimitivePolynomial F + (standardLubinTateChangedUniformizer F π u) n)) := by + exact + (IsDiscreteValuationRing.mem_maximalIdeal_pow_iff_addVal_ge + (Polynomial.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePrimitivePolynomial F + (standardLubinTateChangedUniformizer F π u) n)) + (((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n) * (n + 2))).1 + (standardLubinTateChangedPrimitivePolynomial_eval_mem_maximalIdeal_pow + hπ u n hu) + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedUniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedUniformizer.lean new file mode 100644 index 0000000000..aba7db466d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedUniformizer.lean @@ -0,0 +1,286 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormSubgroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuedExtensionUnitMap +/-! +# Unit changes of a standard Lubin--Tate uniformizer + +For a local field `F`, a chosen uniformizer `π`, and a valuation-ring unit +`u`, the product `uπ` is again a uniformizer. Consequently all of the +standard finite-level Lubin--Tate constructions are available for `uπ`. + +This file packages that elementary, characteristic-independent part of the +changed-uniformizer norm argument. In particular, the negative primitive +generator at the changed level has norm `uπ`. It also records the +cancellation step saying that, inside the norm subgroup of the original +`π`-level, membership of `uπ` is equivalent to membership of `u`, since `π` +is already a norm. + +The remaining comparison between the `π`-level and the `uπ`-level requires +an actual finite-level intertwining equivalence; no such equivalence is +assumed here. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The unit change `uπ` of a chosen integral uniformizer. -/ +def standardLubinTateChangedUniformizer + (F : LocalField.{u, v} K) (π : F.valuationSubring) + (u : F.valuationSubringˣ) : + F.valuationSubring := + (u : F.valuationSubring) * π + +/-- The changed parameter is literally the unit factor times the original +uniformizer. -/ +theorem standardLubinTateChangedUniformizer_eq_unit_mul + (F : LocalField.{u, v} K) (π : F.valuationSubring) + (u : F.valuationSubringˣ) : + standardLubinTateChangedUniformizer F π u = + (u : F.valuationSubring) * π := + rfl + +/-- Multiplication by a valuation-ring unit preserves the uniformizer +property. -/ +theorem standardLubinTateChangedUniformizer_isUniformizer + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) : + F.toCompleteDVF.valuation.IsUniformizer + (standardLubinTateChangedUniformizer F π u : K) := by + exact hπ.of_associated + (associated_unit_mul_right π (u : F.valuationSubring) u.isUnit) + +/-- The standard finite Lubin--Tate level attached to the changed +uniformizer `uπ`. -/ +abbrev standardLubinTateChangedLevelField + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) := + standardLubinTateLevelField + (standardLubinTateChangedUniformizer_isUniformizer hπ u) n + +/-- The chosen primitive generator of the changed standard level. -/ +noncomputable abbrev standardLubinTateChangedLevelGenerator + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + standardLubinTateChangedLevelField hπ u n := + standardLubinTateLevelGenerator + (standardLubinTateChangedUniformizer_isUniformizer hπ u) n + +/-- The local norm subgroup of the changed standard level. -/ +def standardLubinTateChangedNormSubgroup + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + Subgroup Kˣ := + standardLubinTateNormSubgroup + (standardLubinTateChangedUniformizer_isUniformizer hπ u) n + +/-- A valuation-ring unit regarded as a unit of the base field. -/ +noncomputable def standardLubinTateUnitFactorFieldUnit + (F : LocalField.{u, v} K) (u : F.valuationSubringˣ) : + Kˣ := + CompleteDVF.valuationSubringUnitsToFieldUnits F.toCompleteDVF u + +/-- The unit-factor inclusion has the expected underlying field element. -/ +@[simp] +theorem standardLubinTateUnitFactorFieldUnit_coe + (F : LocalField.{u, v} K) (u : F.valuationSubringˣ) : + (standardLubinTateUnitFactorFieldUnit F u : K) = + (u : F.valuationSubring) := by + exact CompleteDVF.coe_valuationSubringUnitsToFieldUnits_apply + F.toCompleteDVF u + +/-- The changed uniformizer, regarded as a nonzero base-field unit. -/ +noncomputable def standardLubinTateChangedUniformizerUnit + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) : + Kˣ := + standardLubinTateBaseUniformizerUnit + (standardLubinTateChangedUniformizer_isUniformizer hπ u) + +/-- The changed uniformizer unit has underlying field element `uπ`. -/ +@[simp] +theorem standardLubinTateChangedUniformizerUnit_coe + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) : + (standardLubinTateChangedUniformizerUnit hπ u : K) = + (standardLubinTateChangedUniformizer F π u : K) := by + exact standardLubinTateBaseUniformizerUnit_coe + (standardLubinTateChangedUniformizer_isUniformizer hπ u) + +/-- In the base-field unit group, the changed uniformizer is the product +of the included valuation-ring unit and the original uniformizer. -/ +theorem standardLubinTateChangedUniformizerUnit_eq_unit_mul + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) : + standardLubinTateChangedUniformizerUnit hπ u = + standardLubinTateUnitFactorFieldUnit F u * + standardLubinTateBaseUniformizerUnit hπ := by + apply Units.ext + simp [standardLubinTateChangedUniformizer] + +/-- Equivalently, the unit factor is the quotient of the changed and +original uniformizers. -/ +theorem standardLubinTateUnitFactorFieldUnit_eq_changed_mul_uniformizer_inv + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) : + standardLubinTateUnitFactorFieldUnit F u = + standardLubinTateChangedUniformizerUnit hπ u * + (standardLubinTateBaseUniformizerUnit hπ)⁻¹ := by + rw [standardLubinTateChangedUniformizerUnit_eq_unit_mul] + simp + +/-- The negative primitive generator at the changed level has norm `uπ`. -/ +theorem standardLubinTateChanged_norm_neg_levelGenerator + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + Algebra.norm K + (-standardLubinTateChangedLevelGenerator hπ u n) = + (standardLubinTateChangedUniformizer F π u : K) := + standardLubinTate_norm_neg_levelGenerator + (standardLubinTateChangedUniformizer_isUniformizer hπ u) n + +/-- The changed uniformizer is an actual norm from its own standard +finite level. -/ +theorem standardLubinTateChangedUniformizerUnit_mem_changedNormSubgroup + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + standardLubinTateChangedUniformizerUnit hπ u ∈ + standardLubinTateChangedNormSubgroup hπ u n := by + exact standardLubinTateBaseUniformizerUnit_mem_normSubgroup + (standardLubinTateChangedUniformizer_isUniformizer hπ u) n + +/-- Inside the original level's norm subgroup, the changed uniformizer +belongs exactly when its unit factor belongs. This is the cancellation +step used after transporting the changed-level norm through a future +finite-level intertwining equivalence. -/ +theorem + standardLubinTateChangedUniformizerUnit_mem_standardNormSubgroup_iff + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + standardLubinTateChangedUniformizerUnit hπ u ∈ + standardLubinTateNormSubgroup hπ n ↔ + standardLubinTateUnitFactorFieldUnit F u ∈ + standardLubinTateNormSubgroup hπ n := by + let N := standardLubinTateNormSubgroup hπ n + let ϖ := standardLubinTateBaseUniformizerUnit hπ + have hϖ : ϖ ∈ N := + standardLubinTateBaseUniformizerUnit_mem_normSubgroup hπ n + have hϖinv : ϖ⁻¹ ∈ N := + standardLubinTateBaseUniformizerUnit_inv_mem_normSubgroup hπ n + constructor + · intro hchanged + rw [standardLubinTateChangedUniformizerUnit_eq_unit_mul] at hchanged + have hcancel := N.mul_mem hchanged hϖinv + change standardLubinTateUnitFactorFieldUnit F u ∈ N + simpa [ϖ, mul_assoc] using hcancel + · intro hu + rw [standardLubinTateChangedUniformizerUnit_eq_unit_mul] + change standardLubinTateUnitFactorFieldUnit F u * ϖ ∈ N + exact N.mul_mem hu hϖ + +/-- The inverse changed uniformizer gives the same norm-membership test. -/ +theorem + standardLubinTateChangedUniformizerUnit_inv_mem_standardNormSubgroup_iff + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + (standardLubinTateChangedUniformizerUnit hπ u)⁻¹ ∈ + standardLubinTateNormSubgroup hπ n ↔ + standardLubinTateUnitFactorFieldUnit F u ∈ + standardLubinTateNormSubgroup hπ n := by + let N := standardLubinTateNormSubgroup hπ n + constructor + · intro hinv + apply + (standardLubinTateChangedUniformizerUnit_mem_standardNormSubgroup_iff + hπ u n).1 + simpa using N.inv_mem hinv + · intro hu + exact N.inv_mem + ((standardLubinTateChangedUniformizerUnit_mem_standardNormSubgroup_iff + hπ u n).2 hu) + +/-- An actual equivalence from the changed level to the original level +transports the changed prime-element norm and therefore makes the unit +factor a norm from the original level. This is the characteristic-free +terminal step of a changed-uniformizer comparison; constructing `e` is the +remaining substantive input. -/ +theorem + standardLubinTateUnitFactorFieldUnit_mem_standardNormSubgroup_of_algEquiv + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + (e : standardLubinTateChangedLevelField hπ u n ≃ₐ[K] + standardLubinTateLevelField hπ n) : + standardLubinTateUnitFactorFieldUnit F u ∈ + standardLubinTateNormSubgroup hπ n := by + have hchanged : + standardLubinTateChangedUniformizerUnit hπ u ∈ + standardLubinTateChangedNormSubgroup hπ u n := + standardLubinTateChangedUniformizerUnit_mem_changedNormSubgroup + hπ u n + have htransport : + standardLubinTateChangedUniformizerUnit hπ u ∈ + standardLubinTateNormSubgroup hπ n := by + change standardLubinTateChangedUniformizerUnit hπ u ∈ + LocalFieldTheory.localNormSubgroup K + (standardLubinTateChangedLevelField hπ u n) at hchanged + rcases hchanged with ⟨y, hy⟩ + change standardLubinTateChangedUniformizerUnit hπ u ∈ + LocalFieldTheory.localNormSubgroup K + (standardLubinTateLevelField hπ n) + refine ⟨Units.mapEquiv e.toMulEquiv y, ?_⟩ + calc + LocalFieldTheory.normUnits K + (standardLubinTateLevelField hπ n) + (Units.mapEquiv e.toMulEquiv y) = + LocalFieldTheory.normUnits K + (standardLubinTateChangedLevelField hπ u n) y := by + apply Units.ext + exact Algebra.norm_eq_of_algEquiv e + (y : standardLubinTateChangedLevelField hπ u n) + _ = standardLubinTateChangedUniformizerUnit hπ u := hy + exact + (standardLubinTateChangedUniformizerUnit_mem_standardNormSubgroup_iff + hπ u n).1 htransport + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedEvaluation.lean new file mode 100644 index 0000000000..181de3497d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedEvaluation.lean @@ -0,0 +1,368 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup +public import Mathlib.RingTheory.AdicCompletion.Topology +public import Mathlib.RingTheory.PowerSeries.Evaluation +public import Mathlib.Topology.Algebra.Nonarchimedean.AdicTopology +/-! +# Analytic evaluation in standard Lubin--Tate level fields + +The scalar endomorphisms of a Lubin--Tate formal module are genuine infinite +power series. This file evaluates them in the complete valuation ring of a +standard finite level. + +The coefficient map is the canonical map of valuation rings attached to the +valued extension. The target carries its maximal-ideal adic topology. The +chosen primitive division point is a uniformizer, hence is topologically +nilpotent and is therefore a valid evaluation point. +-/ + +@[expose] public section + +noncomputable +section + +open Filter +open scoped PowerSeries +open scoped PowerSeries.WithPiTopology + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension +open SameUniformizer + +variable {K : Type u} [Field K] + +/-- The discrete uniformity on the coefficient valuation ring used for analytic evaluation. -/ +noncomputable local instance (priority := 50) + standardLubinTateLevelCoefficientUniformSpace + (F : LocalField.{u, v} K) : + UniformSpace F.valuationSubring := + ⊥ + +/-- The maximal ideal defining the adic topology on the level valuation ring. -/ +noncomputable local instance + standardLubinTateLevelTargetWithIdeal + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + WithIdeal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring where + i := (standardLubinTateLevelCompleteDVF hπ n).maximalIdeal + +/-- The level valuation ring is complete for its maximal-ideal adic topology. -/ +noncomputable local instance + standardLubinTateLevelTargetCompleteSpace + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + CompleteSpace + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := by + let target := standardLubinTateLevelCompleteDVF hπ n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).1 + +/-- The maximal-ideal adic topology on the level valuation ring is Hausdorff. -/ +noncomputable local instance + standardLubinTateLevelTargetT2Space + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + T2Space + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := by + let target := standardLubinTateLevelCompleteDVF hπ n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).2 + +/-- The canonical coefficient map from the base valuation ring to the +valuation ring of a standard Lubin--Tate level. -/ +noncomputable def standardLubinTateLevelCoefficientHom + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + F.valuationSubring →+* + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := + integerMap F.toCompleteDVF.toDVF + (standardLubinTateLevelCompleteDVF hπ n).toDVF + +/-- The level coefficient map is the ambient field algebra map after +coercion from the two valuation rings. -/ +@[simp] +theorem standardLubinTateLevelCoefficientHom_apply + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : F.valuationSubring) : + ((standardLubinTateLevelCoefficientHom hπ n a : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) : + standardLubinTateLevelField hπ n) = + algebraMap K (standardLubinTateLevelField hπ n) (a : K) := by + exact integerMap_apply F.toCompleteDVF.toDVF + (standardLubinTateLevelCompleteDVF hπ n).toDVF a + +/-- The primitive point is topologically nilpotent for the maximal-ideal +adic topology of the level valuation ring. -/ +theorem standardLubinTatePrimitivePointInteger_hasEval + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + PowerSeries.HasEval + (standardLubinTatePrimitivePointInteger hπ n) := by + apply WithIdeal.isTopologicallyNilpotent_of_mem + exact + (standardLubinTateLevelCompleteDVF hπ n).uniformizer_mem_maximalIdeal + (standardLubinTatePrimitivePoint_isUniformizer hπ n) + +/-- Analytic evaluation of power series at a topologically nilpotent +integer of a standard Lubin--Tate level. -/ +noncomputable def standardLubinTateLevelPowerSeriesEval + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (x : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) + (hx : PowerSeries.HasEval x) : + F.valuationSubring⟦X⟧ →+* + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := + PowerSeries.eval₂Hom + (φ := standardLubinTateLevelCoefficientHom hπ n) + continuous_of_discreteTopology hx + +/-- Evaluation sends the power-series variable to the chosen point. -/ +@[simp] +theorem standardLubinTateLevelPowerSeriesEval_X + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (x : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) + (hx : PowerSeries.HasEval x) : + standardLubinTateLevelPowerSeriesEval hπ n x hx PowerSeries.X = x := by + rw [standardLubinTateLevelPowerSeriesEval, + PowerSeries.coe_eval₂Hom, PowerSeries.eval₂_X] + +/-- Evaluation sends a constant power series through the canonical +coefficient map. -/ +@[simp] +theorem standardLubinTateLevelPowerSeriesEval_C + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (x : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) + (hx : PowerSeries.HasEval x) (a : F.valuationSubring) : + standardLubinTateLevelPowerSeriesEval hπ n x hx + (PowerSeries.C a) = + standardLubinTateLevelCoefficientHom hπ n a := by + rw [standardLubinTateLevelPowerSeriesEval, + PowerSeries.coe_eval₂Hom, PowerSeries.eval₂_C] + +/-- On polynomial power series, analytic evaluation agrees with ordinary +polynomial evaluation. -/ +@[simp] +theorem standardLubinTateLevelPowerSeriesEval_coe + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (x : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) + (hx : PowerSeries.HasEval x) + (P : Polynomial F.valuationSubring) : + standardLubinTateLevelPowerSeriesEval hπ n x hx + (P : PowerSeries F.valuationSubring) = + Polynomial.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) x P := by + rw [standardLubinTateLevelPowerSeriesEval, + PowerSeries.coe_eval₂Hom, PowerSeries.eval₂_coe] + +/-- Evaluation at a topologically nilpotent level integer is continuous. -/ +theorem standardLubinTateLevelPowerSeriesEval_continuous + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (x : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) + (hx : PowerSeries.HasEval x) : + Continuous + (standardLubinTateLevelPowerSeriesEval hπ n x hx) := by + rw [standardLubinTateLevelPowerSeriesEval, + PowerSeries.coe_eval₂Hom] + exact PowerSeries.continuous_eval₂ + (φ := standardLubinTateLevelCoefficientHom hπ n) + continuous_of_discreteTopology hx + +/-- Evaluating a series with zero constant coefficient produces another +topologically nilpotent level integer. -/ +theorem standardLubinTateLevelPowerSeriesEval_hasEval + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (x : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) + (hx : PowerSeries.HasEval x) + (f : PowerSeries F.valuationSubring) + (hf : PowerSeries.HasSubst f) : + PowerSeries.HasEval + (standardLubinTateLevelPowerSeriesEval hπ n x hx f) := by + exact hf.hasEval.map + (standardLubinTateLevelPowerSeriesEval_continuous hπ n x hx) + +/-- Analytic evaluation commutes with one-variable formal substitution. -/ +theorem standardLubinTateLevelPowerSeriesEval_subst + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (x : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) + (hx : PowerSeries.HasEval x) + (a f : PowerSeries F.valuationSubring) + (ha : PowerSeries.HasSubst a) + (haEval : PowerSeries.HasEval + (standardLubinTateLevelPowerSeriesEval hπ n x hx a)) : + standardLubinTateLevelPowerSeriesEval hπ n x hx + (PowerSeries.subst a f) = + standardLubinTateLevelPowerSeriesEval hπ n + (standardLubinTateLevelPowerSeriesEval hπ n x hx a) + haEval f := by + let R := F.valuationSubring + let S := + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + simp only [standardLubinTateLevelPowerSeriesEval, + PowerSeries.coe_eval₂Hom] + change PowerSeries.eval₂ (algebraMap R S) x + (PowerSeries.subst a f) = + PowerSeries.eval₂ (algebraMap R S) + (PowerSeries.eval₂ (algebraMap R S) x a) f + simpa only [PowerSeries.eval₂, PowerSeries.subst, + Function.const_apply] using + (MvPowerSeries.eval₂_subst + (R := R) (S := R) (T := S) + (a := fun _ : Unit ↦ a) ha.const + (PowerSeries.hasEval hx) f) + +/-- The canonical evaluation homomorphism at the primitive point. -/ +noncomputable def standardLubinTatePrimitivePointEvaluation + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + F.valuationSubring⟦X⟧ →+* + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := + standardLubinTateLevelPowerSeriesEval hπ n + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePrimitivePointInteger_hasEval hπ n) + +/-- The value of the standard scalar endomorphism `[a]` at an arbitrary +topologically nilpotent integer of a finite level. -/ +noncomputable def standardLubinTateEndomorphismEvalAt + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (x : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) + (hx : PowerSeries.HasEval x) (a : F.valuationSubring) : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := + standardLubinTateLevelPowerSeriesEval hπ n x hx + (standardLubinTateEndomorphism hπ a) + +/-- Every evaluated scalar endomorphism remains topologically nilpotent. -/ +theorem standardLubinTateEndomorphismEvalAt_hasEval + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (x : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) + (hx : PowerSeries.HasEval x) (a : F.valuationSubring) : + PowerSeries.HasEval + (standardLubinTateEndomorphismEvalAt hπ n x hx a) := by + exact standardLubinTateLevelPowerSeriesEval_hasEval hπ n x hx + (standardLubinTateEndomorphism hπ a) + (standardLubinTateEndomorphism_hasLinearTerm hπ a).hasSubst + +/-- The value `[a](lambda_(n+1))` at the chosen primitive division point. -/ +noncomputable def standardLubinTateEndomorphismValue + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : F.valuationSubring) : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := + standardLubinTateEndomorphismEvalAt hπ n + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePrimitivePointInteger_hasEval hπ n) a + +/-- Every scalar value at the primitive point is again topologically +nilpotent. -/ +theorem standardLubinTateEndomorphismValue_hasEval + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : F.valuationSubring) : + PowerSeries.HasEval + (standardLubinTateEndomorphismValue hπ n a) := + standardLubinTateEndomorphismEvalAt_hasEval hπ n + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePrimitivePointInteger_hasEval hπ n) a + +/-- The value of `[1]` is the evaluation point. -/ +@[simp] +theorem standardLubinTateEndomorphismEvalAt_one + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (x : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) + (hx : PowerSeries.HasEval x) : + standardLubinTateEndomorphismEvalAt hπ n x hx 1 = x := by + rw [standardLubinTateEndomorphismEvalAt, + standardLubinTateEndomorphism_one, + standardLubinTateLevelPowerSeriesEval_X] + +/-- The value of `[0]` is zero. -/ +@[simp] +theorem standardLubinTateEndomorphismEvalAt_zero + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (x : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) + (hx : PowerSeries.HasEval x) : + standardLubinTateEndomorphismEvalAt hπ n x hx 0 = 0 := by + rw [standardLubinTateEndomorphismEvalAt, + standardLubinTateEndomorphism_zero, map_zero] + +/-- Multiplication of scalars becomes composition after analytic +evaluation. -/ +theorem standardLubinTateEndomorphismEvalAt_mul + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (x : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) + (hx : PowerSeries.HasEval x) (a b : F.valuationSubring) : + standardLubinTateEndomorphismEvalAt hπ n x hx (a * b) = + standardLubinTateEndomorphismEvalAt hπ n + (standardLubinTateEndomorphismEvalAt hπ n x hx b) + (standardLubinTateEndomorphismEvalAt_hasEval hπ n x hx b) a := by + rw [standardLubinTateEndomorphismEvalAt, + standardLubinTateEndomorphism_mul] + exact standardLubinTateLevelPowerSeriesEval_subst hπ n x hx + (standardLubinTateEndomorphism hπ b) + (standardLubinTateEndomorphism hπ a) + (standardLubinTateEndomorphism_hasLinearTerm hπ b).hasSubst + (standardLubinTateEndomorphismEvalAt_hasEval hπ n x hx b) + +/-- At the primitive point, multiplication of scalars is analytic +composition of their values. -/ +theorem standardLubinTateEndomorphismValue_mul + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a b : F.valuationSubring) : + standardLubinTateEndomorphismValue hπ n (a * b) = + standardLubinTateEndomorphismEvalAt hπ n + (standardLubinTateEndomorphismValue hπ n b) + (standardLubinTateEndomorphismValue_hasEval hπ n b) a := + standardLubinTateEndomorphismEvalAt_mul hπ n + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePrimitivePointInteger_hasEval hπ n) a b + +/-- The primitive-point value of `[1]` is the primitive point itself. -/ +@[simp] +theorem standardLubinTateEndomorphismValue_one + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + standardLubinTateEndomorphismValue hπ n 1 = + standardLubinTatePrimitivePointInteger hπ n := + standardLubinTateEndomorphismEvalAt_one hπ n + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePrimitivePointInteger_hasEval hπ n) + +/-- The primitive-point value of `[0]` is zero. -/ +@[simp] +theorem standardLubinTateEndomorphismValue_zero + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + standardLubinTateEndomorphismValue hπ n 0 = 0 := + standardLubinTateEndomorphismEvalAt_zero hπ n + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePrimitivePointInteger_hasEval hπ n) + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedIterates.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedIterates.lean new file mode 100644 index 0000000000..3b81c4384b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedIterates.lean @@ -0,0 +1,158 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedEvaluation +/-! +# Valuations of standard Lubin--Tate iterates at a primitive point + +At primitive level `n + 1`, the `i`-fold standard Lubin--Tate iterate has +normalized additive valuation `q ^ i` for `i ≤ n`. The proof uses the +two-term formula + +`f(y) = y ^ q + π y`. + +The first summand has valuation `q ^ (i + 1)`. The second has strictly +larger valuation because the image of the base uniformizer has valuation +equal to the totally ramified level degree `(q - 1) q ^ n`. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The `i`-fold standard polynomial iterate, evaluated at the primitive +point in the complete level valuation ring. -/ +noncomputable def standardLubinTatePrimitivePointIterateInteger + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n i : ℕ) : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := + Polynomial.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePolynomialIterate F π i) + +/-- The zeroth iterate is the primitive point itself. -/ +@[simp] +theorem standardLubinTatePrimitivePointIterateInteger_zero + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + standardLubinTatePrimitivePointIterateInteger hπ n 0 = + standardLubinTatePrimitivePointInteger hπ n := by + simp [standardLubinTatePrimitivePointIterateInteger] + +/-- One more iterate is evaluation of `y ↦ y ^ q + π y`. -/ +theorem standardLubinTatePrimitivePointIterateInteger_succ + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n i : ℕ) : + standardLubinTatePrimitivePointIterateInteger hπ n (i + 1) = + standardLubinTatePrimitivePointIterateInteger hπ n i ^ + Nat.card F.residueField + + standardLubinTateLevelCoefficientHom hπ n π * + standardLubinTatePrimitivePointIterateInteger hπ n i := by + rw [standardLubinTatePrimitivePointIterateInteger, + standardLubinTatePolynomialIterate_succ, + Polynomial.eval₂_comp, + standardLubinTatePolynomial_formula, + Polynomial.eval₂_add, Polynomial.eval₂_pow, + Polynomial.eval₂_X, Polynomial.eval₂_mul, + Polynomial.eval₂_C] + simp only [Polynomial.eval₂_X, standardLubinTatePrimitivePointIterateInteger] + +/-- Before the annihilating level, the evaluated iterates have exact +normalized additive valuations `1, q, ..., q ^ n`. -/ +theorem standardLubinTatePrimitivePointIterateInteger_addVal + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n i : ℕ) (hi : i ≤ n) : + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (standardLubinTatePrimitivePointIterateInteger hπ n i) = + (Nat.card F.residueField ^ i : ℕ) := by + induction i with + | zero => + simpa using + standardLubinTatePrimitivePointInteger_addVal hπ n + | succ i ih => + let target := standardLubinTateLevelCompleteDVF hπ n + let q := Nat.card F.residueField + let d := (q - 1) * q ^ n + let y := standardLubinTatePrimitivePointIterateInteger hπ n i + have hi' : i ≤ n := Nat.le_trans (Nat.le_succ i) hi + have hiy : + IsDiscreteValuationRing.addVal target.valuationSubring y = + (q ^ i : ℕ) := by + exact ih hi' + have hπval : + IsDiscreteValuationRing.addVal target.valuationSubring + (standardLubinTateLevelCoefficientHom hπ n π) = + (d : ℕ) := by + simpa [target, q, d, standardLubinTateLevelCoefficientHom] using + standardLubinTateBaseUniformizerInteger_map_addVal hπ n + have hpow : + IsDiscreteValuationRing.addVal target.valuationSubring + (y ^ q) = + (q ^ (i + 1) : ℕ) := by + rw [IsDiscreteValuationRing.addVal_pow, hiy] + simp [nsmul_eq_mul, pow_succ, Nat.mul_comm] + have hmul : + IsDiscreteValuationRing.addVal target.valuationSubring + (standardLubinTateLevelCoefficientHom hπ n π * y) = + (d + q ^ i : ℕ) := by + rw [IsDiscreteValuationRing.addVal_mul, hπval, hiy] + rfl + have hqone : 1 < q := by + exact Finite.one_lt_card + have hqpos : 0 < q := Nat.zero_lt_one.trans hqone + have hpowle : q ^ (i + 1) ≤ q ^ n := + Nat.pow_le_pow_right hqpos hi + have hqsub : 1 ≤ q - 1 := by + omega + have hdegreele : q ^ n ≤ d := by + calc + q ^ n = 1 * q ^ n := by simp + _ ≤ (q - 1) * q ^ n := + Nat.mul_le_mul_right (q ^ n) hqsub + have htailpos : 0 < q ^ i := Nat.pow_pos hqpos + have hnatlt : q ^ (i + 1) < d + q ^ i := + hpowle.trans_lt + (hdegreele.trans_lt (Nat.lt_add_of_pos_right htailpos)) + have henatlt : + (q ^ (i + 1) : ℕ∞) < (d + q ^ i : ℕ) := by + exact_mod_cast hnatlt + have hdistinct : + IsDiscreteValuationRing.addVal target.valuationSubring + (y ^ q) ≠ + IsDiscreteValuationRing.addVal target.valuationSubring + (standardLubinTateLevelCoefficientHom hπ n π * y) := by + rw [hpow, hmul] + exact ne_of_lt henatlt + rw [standardLubinTatePrimitivePointIterateInteger_succ] + rw [AddValuation.map_add_of_distinct_val + (IsDiscreteValuationRing.addVal target.valuationSubring) hdistinct, + hpow, hmul] + rw [min_eq_left] + exact henatlt.le + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/DivisionPolynomial.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/DivisionPolynomial.lean new file mode 100644 index 0000000000..4dc9b3833d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/DivisionPolynomial.lean @@ -0,0 +1,295 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardSeries +public import Mathlib.Algebra.Polynomial.Monic +/-! +# Standard Lubin--Tate division polynomials + +For a local field `F` and an element `π` of its valuation ring, this file +packages the polynomial + +`f(X) = X ^ q + π * X`, + +where `q` is the cardinality of the residue field. Its compositional iterates +and the factors + +`Qₙ(X) = (f^[n](X)) ^ (q - 1) + π` + +are defined over the valuation ring itself. These constructions do not use +an equal-characteristic model. In particular, they apply unchanged to the +standard Lubin--Tate series over a mixed-characteristic local field. + +The factorization + +`f^[n+1](X) = f^[n](X) * Qₙ(X)` + +is purely polynomial. No assertion about roots, irreducibility, or finite +Lubin--Tate extensions is made here. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial PowerSeries + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The polynomial `X ^ q + π * X` underlying the standard Lubin--Tate +series. -/ +noncomputable def standardLubinTatePolynomial + (F : LocalField.{u, v} K) (π : F.valuationSubring) : + Polynomial F.valuationSubring := + Polynomial.X ^ Nat.card F.residueField + + Polynomial.C π * Polynomial.X + +/-- The defining formula for the standard Lubin--Tate polynomial. -/ +theorem standardLubinTatePolynomial_formula + (F : LocalField.{u, v} K) (π : F.valuationSubring) : + standardLubinTatePolynomial F π = + Polynomial.X ^ Nat.card F.residueField + + Polynomial.C π * Polynomial.X := + rfl + +/-- Evaluation of the standard polynomial has the expected two-term +formula. -/ +@[simp] +theorem standardLubinTatePolynomial_eval + (F : LocalField.{u, v} K) (π : F.valuationSubring) + (x : F.valuationSubring) : + (standardLubinTatePolynomial F π).eval x = + x ^ Nat.card F.residueField + π * x := by + simp [standardLubinTatePolynomial] + +/-- Coercing the standard polynomial to a power series gives the standard +Lubin--Tate power series. -/ +@[simp] +theorem standardLubinTatePolynomial_toPowerSeries + (F : LocalField.{u, v} K) (π : F.valuationSubring) : + ((standardLubinTatePolynomial F π : + Polynomial F.valuationSubring) : + PowerSeries F.valuationSubring) = + standardLubinTatePowerSeries F π := by + simp [standardLubinTatePolynomial, standardLubinTatePowerSeries, + add_comm] + +/-- For a uniformizer, coercing the standard polynomial gives the underlying +series of the bundled standard Lubin--Tate input. -/ +theorem standardLubinTatePolynomial_toPowerSeries_eq_series + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + ((standardLubinTatePolynomial F π : + Polynomial F.valuationSubring) : + PowerSeries F.valuationSubring) = + (standardLubinTateSeries hπ).toPowerSeries := by + rw [standardLubinTatePolynomial_toPowerSeries, + LubinTateSeries.standardLubinTateSeries_toPowerSeries] + +/-- The standard Lubin--Tate polynomial has degree `q`. -/ +theorem standardLubinTatePolynomial_natDegree + (F : LocalField.{u, v} K) (π : F.valuationSubring) : + (standardLubinTatePolynomial F π).natDegree = + Nat.card F.residueField := by + rw [standardLubinTatePolynomial] + rw [Polynomial.natDegree_add_eq_left_of_natDegree_lt] + · exact Polynomial.natDegree_X_pow _ + · rw [Polynomial.natDegree_X_pow] + calc + (Polynomial.C π * Polynomial.X).natDegree ≤ 1 := by + simpa only [pow_one] using + Polynomial.natDegree_C_mul_X_pow_le π 1 + _ < Nat.card F.residueField := + (Finite.one_lt_card : 1 < Nat.card F.residueField) + +/-- The standard Lubin--Tate polynomial is monic. -/ +theorem standardLubinTatePolynomial_monic + (F : LocalField.{u, v} K) (π : F.valuationSubring) : + (standardLubinTatePolynomial F π).Monic := by + rw [standardLubinTatePolynomial] + refine (Polynomial.monic_X_pow _).add_of_left ?_ + calc + (Polynomial.C π * Polynomial.X).degree ≤ 1 := + Polynomial.degree_C_mul_X_le π + _ < (Polynomial.X ^ Nat.card F.residueField : + Polynomial F.valuationSubring).degree := by + rw [Polynomial.degree_X_pow] + exact_mod_cast (Finite.one_lt_card : 1 < Nat.card F.residueField) + +/-- The `n`-fold compositional iterate of the standard polynomial, starting +from `X`. -/ +noncomputable def standardLubinTatePolynomialIterate + (F : LocalField.{u, v} K) (π : F.valuationSubring) (n : ℕ) : + Polynomial F.valuationSubring := + (standardLubinTatePolynomial F π).comp^[n] Polynomial.X + +/-- The zeroth compositional iterate is `X`. -/ +@[simp] +theorem standardLubinTatePolynomialIterate_zero + (F : LocalField.{u, v} K) (π : F.valuationSubring) : + standardLubinTatePolynomialIterate F π 0 = Polynomial.X := by + simp [standardLubinTatePolynomialIterate] + +/-- A successor iterate is obtained by one further composition with the +standard polynomial. -/ +theorem standardLubinTatePolynomialIterate_succ + (F : LocalField.{u, v} K) (π : F.valuationSubring) (n : ℕ) : + standardLubinTatePolynomialIterate F π (n + 1) = + (standardLubinTatePolynomial F π).comp + (standardLubinTatePolynomialIterate F π n) := by + rw [standardLubinTatePolynomialIterate, + Function.iterate_succ_apply'] + rfl + +/-- The `n`-fold standard compositional iterate has degree `q ^ n`. -/ +theorem standardLubinTatePolynomialIterate_natDegree + (F : LocalField.{u, v} K) (π : F.valuationSubring) (n : ℕ) : + (standardLubinTatePolynomialIterate F π n).natDegree = + Nat.card F.residueField ^ n := by + rw [standardLubinTatePolynomialIterate, + Polynomial.natDegree_iterate_comp, + standardLubinTatePolynomial_natDegree, + Polynomial.natDegree_X, mul_one] + +/-- Every compositional iterate of the standard polynomial is monic. -/ +theorem standardLubinTatePolynomialIterate_monic + (F : LocalField.{u, v} K) (π : F.valuationSubring) (n : ℕ) : + (standardLubinTatePolynomialIterate F π n).Monic := by + induction n with + | zero => + simp [standardLubinTatePolynomialIterate] + | succ n ih => + rw [standardLubinTatePolynomialIterate_succ] + exact (standardLubinTatePolynomial_monic F π).comp ih + (by + rw [standardLubinTatePolynomialIterate_natDegree] + exact pow_ne_zero n + (ne_of_gt + (Nat.zero_lt_one.trans + (Finite.one_lt_card : 1 < Nat.card F.residueField)))) + +/-- Every standard compositional iterate vanishes at zero. -/ +@[simp] +theorem standardLubinTatePolynomialIterate_eval_zero + (F : LocalField.{u, v} K) (π : F.valuationSubring) (n : ℕ) : + (standardLubinTatePolynomialIterate F π n).eval 0 = 0 := by + induction n with + | zero => + simp [standardLubinTatePolynomialIterate] + | succ n ih => + rw [standardLubinTatePolynomialIterate_succ, + Polynomial.eval_comp, ih] + simp [standardLubinTatePolynomial, + ne_of_gt + (Nat.zero_lt_one.trans + (Finite.one_lt_card : 1 < Nat.card F.residueField))] + +/-- The primitive quotient polynomial at level `n + 1`. -/ +noncomputable def standardLubinTatePrimitivePolynomial + (F : LocalField.{u, v} K) (π : F.valuationSubring) (n : ℕ) : + Polynomial F.valuationSubring := + standardLubinTatePolynomialIterate F π n ^ + (Nat.card F.residueField - 1) + + Polynomial.C π + +/-- The defining formula for the primitive quotient polynomial. -/ +theorem standardLubinTatePrimitivePolynomial_formula + (F : LocalField.{u, v} K) (π : F.valuationSubring) (n : ℕ) : + standardLubinTatePrimitivePolynomial F π n = + standardLubinTatePolynomialIterate F π n ^ + (Nat.card F.residueField - 1) + + Polynomial.C π := + rfl + +/-- The primitive quotient polynomial has degree `(q - 1) * q ^ n`. -/ +theorem standardLubinTatePrimitivePolynomial_natDegree + (F : LocalField.{u, v} K) (π : F.valuationSubring) (n : ℕ) : + (standardLubinTatePrimitivePolynomial F π n).natDegree = + (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := by + rw [standardLubinTatePrimitivePolynomial] + have hpos : + 0 < (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := + Nat.mul_pos + (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (Nat.pow_pos Nat.card_pos) + rw [Polynomial.natDegree_add_eq_left_of_natDegree_lt] + · rw [Polynomial.natDegree_pow, + standardLubinTatePolynomialIterate_natDegree] + · rw [Polynomial.natDegree_pow, + standardLubinTatePolynomialIterate_natDegree, + Polynomial.natDegree_C] + exact hpos + +/-- The primitive quotient polynomial is monic. -/ +theorem standardLubinTatePrimitivePolynomial_monic + (F : LocalField.{u, v} K) (π : F.valuationSubring) (n : ℕ) : + (standardLubinTatePrimitivePolynomial F π n).Monic := by + rw [standardLubinTatePrimitivePolynomial] + let A := standardLubinTatePolynomialIterate F π n + have hA : A.Monic := + standardLubinTatePolynomialIterate_monic F π n + have hmain : + (A ^ (Nat.card F.residueField - 1)).Monic := + hA.pow _ + refine hmain.add_of_left ?_ + calc + (Polynomial.C π).degree ≤ 0 := + Polynomial.degree_C_le + _ < (A ^ (Nat.card F.residueField - 1)).degree := by + rw [Polynomial.degree_eq_natDegree hmain.ne_zero, + Polynomial.natDegree_pow, + standardLubinTatePolynomialIterate_natDegree] + exact_mod_cast Nat.mul_pos + (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (Nat.pow_pos Nat.card_pos) + +/-- The constant coefficient of the primitive quotient polynomial is `π`. -/ +@[simp] +theorem standardLubinTatePrimitivePolynomial_coeff_zero + (F : LocalField.{u, v} K) (π : F.valuationSubring) (n : ℕ) : + (standardLubinTatePrimitivePolynomial F π n).coeff 0 = π := by + rw [Polynomial.coeff_zero_eq_eval_zero] + simp [standardLubinTatePrimitivePolynomial, + standardLubinTatePolynomialIterate_eval_zero, + ne_of_gt + (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField))] + +/-- The next compositional iterate is the current iterate times its primitive +quotient polynomial. -/ +theorem standardLubinTatePolynomialIterate_succ_factor + (F : LocalField.{u, v} K) (π : F.valuationSubring) (n : ℕ) : + standardLubinTatePolynomialIterate F π (n + 1) = + standardLubinTatePolynomialIterate F π n * + standardLubinTatePrimitivePolynomial F π n := by + have hq : Nat.card F.residueField ≠ 0 := + ne_of_gt + (Nat.zero_lt_one.trans + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + rw [standardLubinTatePolynomialIterate_succ, + standardLubinTatePolynomial, + standardLubinTatePrimitivePolynomial] + simp only [Polynomial.add_comp, Polynomial.pow_comp, + Polynomial.X_comp, Polynomial.mul_comp, Polynomial.C_comp] + rw [← pow_sub_one_mul hq] + ring + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameterFiltration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameterFiltration.lean new file mode 100644 index 0000000000..b9ad3085c7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameterFiltration.lean @@ -0,0 +1,116 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameters +/-! +# Principal-unit filtration on finite Lubin--Tate parameters + +The parameter group at primitive level `n + 1` is +`O_Fˣ / U_F^(n + 1)`. The image of `U_F^k` gives its natural decreasing +filtration. For `1 ≤ k ≤ n + 1`, that image has cardinality +`q ^ (n + 1 - k)`. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.CompleteDVF + +variable {K : Type u} [Field K] + +/-- The image of the `k`-th higher principal-unit group in the finite +parameter quotient at primitive level `n + 1`. -/ +def standardLubinTateUnitParameterSubgroup + (F : LocalField.{u, v} K) (n k : ℕ) : + Subgroup (standardLubinTateUnitParameter F n) := + (higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubgroupClassInQuotient + k (n + 1) + +/-- A represented finite parameter belongs to the `k`-th parameter subgroup +exactly when its representative lies in `U_F^k`. -/ +theorem standardLubinTateUnitParameterClass_mem_subgroup_iff + (F : LocalField.{u, v} K) (n k : ℕ) (hk : k ≤ n + 1) + (u : F.valuationSubringˣ) : + standardLubinTateUnitParameterClass F n u ∈ + standardLubinTateUnitParameterSubgroup F n k ↔ + u ∈ higherPrincipalUnitGroup F.toCompleteDVF k := by + change + QuotientGroup.mk' + (higherPrincipalUnitGroup F.toCompleteDVF (n + 1)) u ∈ + (higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubgroupClassInQuotient + k (n + 1) ↔ + u ∈ higherPrincipalUnitGroup F.toCompleteDVF k + exact + AntitoneSubgroupFiltration.quotient_principalUnitSubgroup_mk_mem_classInQuotient_iff + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F.toCompleteDVF) + hk u + +/-- The `k`-th finite parameter subgroup has cardinality +`q ^ (n + 1 - k)` throughout the principal-unit range. -/ +theorem standardLubinTateUnitParameterSubgroup_natCard + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n k : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) : + Nat.card (standardLubinTateUnitParameterSubgroup F n k) = + Nat.card F.residueField ^ (n + 1 - k) := by + let D := F.toCompleteDVF + let U := higherPrincipalUnitGroup.toPrincipalUnitFiltration D + let hfinite (i j : ℕ) : Finite (U.principalUnitSubquotient i j) := + higherPrincipalUnitGroup.finite_principalUnitSubquotient_of_finite_residue D i j + have hnormal : ∀ i : ℕ, (U.principalUnitSubgroup i).Normal := by + intro i + change (higherPrincipalUnitGroup D i).Normal + infer_instance + have hend : k + (n + 1 - k) = n + 1 := + Nat.add_sub_of_le hkn + calc + Nat.card (standardLubinTateUnitParameterSubgroup F n k) = + Nat.card (U.principalUnitSubquotient k (n + 1)) := by + exact + (Nat.card_congr + (U.principalUnitSubquotientEquivClassInQuotientOfLe hkn).toEquiv).symm + _ = Nat.card + (U.principalUnitSubquotient k (k + (n + 1 - k))) := by + rw [hend] + _ = + ∏ i ∈ Finset.range (n + 1 - k), + Nat.card (U.principalUnitGradedPiece (k + i)) := by + rw [U.card_principalUnitSubquotient_eq_prod_gradedPiece + hnormal k (n + 1 - k)] + _ = + ∏ _i ∈ Finset.range (n + 1 - k), + Nat.card F.residueField := by + apply Finset.prod_congr rfl + intro i _hi + have hki : 1 ≤ k + i := by omega + calc + Nat.card (U.principalUnitGradedPiece (k + i)) = + Nat.card + (higherPrincipalUnitGroup.principalUnitSuccQuot + D (k + i)) := + Nat.card_congr + (higherPrincipalUnitGroup.principalUnitSuccQuotEquivGradedPiece + D (k + i)).symm.toEquiv + _ = Nat.card F.residueField := + higherPrincipalUnitGroup.card_principalUnitSuccQuot_eq_residue_of_uniformizer + D hπ (k + i) hki + _ = Nat.card F.residueField ^ (n + 1 - k) := by + simp + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameters.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameters.lean new file mode 100644 index 0000000000..e247a60499 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameters.lean @@ -0,0 +1,229 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveAction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core +public import Mathlib.GroupTheory.Coset.Card +/-! +# Finite unit parameters for standard Lubin--Tate levels + +For a local field `F`, the unit parameters visible at primitive level `n + 1` +are the valuation-ring units modulo the higher principal-unit subgroup +`U^(n + 1)`. This file records that quotient, chooses representatives, and +computes its cardinality as + +`(q - 1) * q ^ n`, + +where `q` is the residue-field cardinality. The final declarations descend +the standard Lubin--Tate action on the chosen primitive point to this finite +parameter quotient. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.CompleteDVF + +variable {K : Type u} [Field K] + +/-- The finite unit parameters visible on the primitive level-`n + 1` +standard Lubin--Tate torsion point. -/ +def standardLubinTateUnitParameter + (F : LocalField.{u, v} K) (n : ℕ) : Type u := + F.valuationSubringˣ ⧸ + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1) + +/-- The finite unit parameter quotient carries its canonical commutative +group structure. -/ +instance standardLubinTateUnitParameterCommGroup + (F : LocalField.{u, v} K) (n : ℕ) : + CommGroup (standardLubinTateUnitParameter F n) := by + change CommGroup + (F.valuationSubringˣ ⧸ + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1)) + infer_instance + +/-- The canonical class of a valuation-ring unit at primitive level +`n + 1`. -/ +def standardLubinTateUnitParameterClass + (F : LocalField.{u, v} K) (n : ℕ) : + F.valuationSubringˣ →* standardLubinTateUnitParameter F n := + QuotientGroup.mk' + (CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1)) + +/-- The finite-level unit parameter space is finite. -/ +noncomputable instance standardLubinTateUnitParameter_finite + (F : LocalField.{u, v} K) (n : ℕ) : + Finite (standardLubinTateUnitParameter F n) := by + change Finite + (F.valuationSubringˣ ⧸ + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1)) + exact + higherPrincipalUnitGroup.finite_unitsModHigherPrincipalUnitGroup_of_finite_residue + F.toCompleteDVF (n + 1) + +/-- A chosen valuation-ring unit representing a finite unit parameter. -/ +noncomputable def standardLubinTateUnitParameterChosenRepresentative + (F : LocalField.{u, v} K) (n : ℕ) + (a : standardLubinTateUnitParameter F n) : + F.valuationSubringˣ := + Classical.choose + (QuotientGroup.mk'_surjective + (CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1)) a) + +/-- The chosen representative has the prescribed quotient class. -/ +@[simp] +theorem standardLubinTateUnitParameterChosenRepresentative_spec + (F : LocalField.{u, v} K) (n : ℕ) + (a : standardLubinTateUnitParameter F n) : + standardLubinTateUnitParameterClass F n + (standardLubinTateUnitParameterChosenRepresentative F n a) = a := + Classical.choose_spec + (QuotientGroup.mk'_surjective + (CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1)) a) + +/-- Two valuation-ring units determine the same finite parameter exactly +when their quotient belongs to `U^(n + 1)`. -/ +theorem standardLubinTateUnitParameterClass_eq_iff_div_mem + (F : LocalField.{u, v} K) (n : ℕ) + (a b : F.valuationSubringˣ) : + standardLubinTateUnitParameterClass F n a = + standardLubinTateUnitParameterClass F n b ↔ + a / b ∈ + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1) := by + change + QuotientGroup.mk' + (CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1)) a = + QuotientGroup.mk' + (CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1)) b ↔ + _ + exact QuotientGroup.eq_iff_div_mem + +/-- The finite standard unit parameter set has cardinality +`(q - 1) * q ^ n`. -/ +theorem standardLubinTateUnitParameter_natCard + (F : LocalField.{u, v} K) (n : ℕ) : + Nat.card (standardLubinTateUnitParameter F n) = + (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := by + let D := F.toCompleteDVF + let U := CompleteDVF.higherPrincipalUnitGroup.toPrincipalUnitFiltration D + let Q := + F.valuationSubringˣ ⧸ + CompleteDVF.higherPrincipalUnitGroup D (n + 1) + let H : Subgroup Q := + U.principalUnitSubgroupClassInQuotient 1 (n + 1) + have hlevel : 1 ≤ n + 1 := by omega + obtain ⟨π, hπ⟩ := F.exists_uniformizer + have hquotient : + Nat.card (Q ⧸ H) = Nat.card F.residueField - 1 := by + calc + Nat.card (Q ⧸ H) = + Nat.card + (F.valuationSubringˣ ⧸ + CompleteDVF.higherPrincipalUnitGroup D 1) := by + exact Nat.card_congr + (U.quotientModuloPrincipalUnitClassEquivQuotientOfLe + hlevel).toEquiv + _ = Nat.card F.residueFieldˣ := by + exact Nat.card_congr + (higherPrincipalUnitGroup.unitsModOneEquivResidueFieldUnits D).toEquiv + _ = Nat.card F.residueField - 1 := Nat.card_units F.residueField + have hsubquotient : + Nat.card H = Nat.card F.residueField ^ n := by + calc + Nat.card H = + Nat.card (U.principalUnitSubquotient 1 (n + 1)) := by + exact + (Nat.card_congr + (U.principalUnitSubquotientEquivClassInQuotientOfLe + hlevel).toEquiv).symm + _ = + Nat.card + (CompleteDVF.higherPrincipalUnitGroup D 1 ⧸ + (CompleteDVF.higherPrincipalUnitGroup D (n + 1)).subgroupOf + (CompleteDVF.higherPrincipalUnitGroup D 1)) := by + exact Nat.card_congr + (U.principalUnitSubquotientConcreteEquiv 1 (n + 1)).toEquiv + _ = Nat.card F.residueField ^ n := by + simpa [D] using + (higherPrincipalUnitGroup.card_principalUnitSubquotient_one_eq_residue_pow_of_uniformizer + D hπ hlevel) + change Nat.card Q = + (Nat.card F.residueField - 1) * Nat.card F.residueField ^ n + rw [Subgroup.card_eq_card_quotient_mul_card_subgroup H, + hquotient, hsubquotient] + +/-- The primitive root attached to a finite unit parameter. A representative +is chosen only to evaluate the primitive action; the theorem below shows that +the value depends only on its quotient class. -/ +noncomputable def standardLubinTateUnitParameterRoot + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : standardLubinTateUnitParameter F n) : + SeparableClosure K := + standardLubinTatePrimitiveRootAction hπ n + (standardLubinTateUnitParameterChosenRepresentative F n a) + +/-- The parameter root can be evaluated using any representative of its +quotient class. -/ +theorem standardLubinTateUnitParameterRoot_eq_action_of_class_eq + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : standardLubinTateUnitParameter F n) + (u : F.valuationSubringˣ) + (hu : standardLubinTateUnitParameterClass F n u = a) : + standardLubinTateUnitParameterRoot F hπ n a = + standardLubinTatePrimitiveRootAction hπ n u := by + apply + standardLubinTatePrimitiveRootAction_eq_of_div_mem_higherPrincipalUnitGroup + hπ n + exact + (standardLubinTateUnitParameterClass_eq_iff_div_mem F n + (standardLubinTateUnitParameterChosenRepresentative F n a) u).mp + ((standardLubinTateUnitParameterChosenRepresentative_spec F n a).trans + hu.symm) + +/-- Evaluating at a canonical quotient class recovers the primitive action +of the original valuation-ring unit. -/ +@[simp] +theorem standardLubinTateUnitParameterRoot_class + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (u : F.valuationSubringˣ) : + standardLubinTateUnitParameterRoot F hπ n + (standardLubinTateUnitParameterClass F n u) = + standardLubinTatePrimitiveRootAction hπ n u := + standardLubinTateUnitParameterRoot_eq_action_of_class_eq + F hπ n _ u rfl + +/-- Every finite unit parameter gives a root of the primitive level +polynomial. -/ +theorem standardLubinTateUnitParameterRoot_isRoot + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : standardLubinTateUnitParameter F n) : + ((standardLubinTatePrimitivePolynomialOverField F π n).map + (algebraMap K (SeparableClosure K))).IsRoot + (standardLubinTateUnitParameterRoot F hπ n a) := by + simpa [standardLubinTateUnitParameterRoot] using + standardLubinTatePrimitiveRootAction_isRoot hπ n + (standardLubinTateUnitParameterChosenRepresentative F n a) + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/GaloisParameterFiltration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/GaloisParameterFiltration.lean new file mode 100644 index 0000000000..79ed2717a4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/GaloisParameterFiltration.lean @@ -0,0 +1,127 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameterFiltration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian +/-! +# Principal-unit filtration on finite Lubin--Tate Galois groups + +The multiplicative equivalence between finite unit parameters and the +Galois group transports the image of `U_F^k` to a subgroup of the Galois +group. This file records membership both for quotient parameters and for +valuation-ring unit representatives, and preserves the expected cardinality +`q ^ (n + 1 - k)`. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.CompleteDVF + +variable {K : Type u} [Field K] + +/-- The image of the `k`-th finite unit-parameter subgroup in the Galois +group of the standard level-`n + 1` Lubin--Tate extension. -/ +noncomputable def standardLubinTateGaloisParameterSubgroup + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n k : ℕ) : + Subgroup (Gal((standardLubinTateLevelField hπ n)/K)) := + Subgroup.map (standardLubinTateUnitParameterToGalHom F hπ n) + (standardLubinTateUnitParameterSubgroup F n k) + +/-- The explicit parameter-to-Galois map reflects membership in every +transported parameter subgroup. -/ +theorem standardLubinTateUnitParameterToGal_mem_galoisParameterSubgroup_iff + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n k : ℕ) (a : standardLubinTateUnitParameter F n) : + standardLubinTateUnitParameterToGal F hπ n a ∈ + standardLubinTateGaloisParameterSubgroup F hπ n k ↔ + a ∈ standardLubinTateUnitParameterSubgroup F n k := by + change + standardLubinTateUnitParameterToGalHom F hπ n a ∈ + Subgroup.map (standardLubinTateUnitParameterToGalHom F hπ n) + (standardLubinTateUnitParameterSubgroup F n k) ↔ + a ∈ standardLubinTateUnitParameterSubgroup F n k + constructor + · rintro ⟨b, hb, hba⟩ + have hba' : b = a := by + apply standardLubinTateUnitParameterToGal_injective F hπ n + simpa only [standardLubinTateUnitParameterToGalHom_apply] using hba + change a ∈ + (standardLubinTateUnitParameterSubgroup F n k : + Set (standardLubinTateUnitParameter F n)) + simpa only [hba'] using hb + · intro ha + exact ⟨a, ha, rfl⟩ + +/-- On a valuation-ring unit representative, membership in the transported +Galois subgroup is exactly membership in `U_F^k`. -/ +theorem + standardLubinTateUnitParameterToGal_class_mem_galoisParameterSubgroup_iff + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n k : ℕ) (hkn : k ≤ n + 1) (u : F.valuationSubringˣ) : + standardLubinTateUnitParameterToGal F hπ n + (standardLubinTateUnitParameterClass F n u) ∈ + standardLubinTateGaloisParameterSubgroup F hπ n k ↔ + u ∈ higherPrincipalUnitGroup F.toCompleteDVF k := by + rw [standardLubinTateUnitParameterToGal_mem_galoisParameterSubgroup_iff, + standardLubinTateUnitParameterClass_mem_subgroup_iff F n k hkn u] + +/-- Restricting the parameter-to-Galois homomorphism gives a multiplicative +equivalence onto the transported subgroup. -/ +noncomputable def + standardLubinTateUnitParameterSubgroupEquivGaloisParameterSubgroup + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n k : ℕ) : + standardLubinTateUnitParameterSubgroup F n k ≃* + standardLubinTateGaloisParameterSubgroup F hπ n k := by + let f := standardLubinTateUnitParameterToGalHom F hπ n + let H := standardLubinTateUnitParameterSubgroup F n k + refine MulEquiv.ofBijective (f.subgroupMap H) ⟨?_, ?_⟩ + · intro a b hab + have hval := congrArg Subtype.val hab + apply Subtype.ext + apply standardLubinTateUnitParameterToGal_injective F hπ n + change f (a : standardLubinTateUnitParameter F n) = + f (b : standardLubinTateUnitParameter F n) at hval + simpa only [f, standardLubinTateUnitParameterToGalHom_apply] using hval + · exact f.subgroupMap_surjective H + +/-- The transported Galois filtration has the same cardinality as its +finite unit-parameter source. -/ +theorem standardLubinTateGaloisParameterSubgroup_natCard + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n k : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) : + Nat.card (standardLubinTateGaloisParameterSubgroup F hπ n k) = + Nat.card F.residueField ^ (n + 1 - k) := by + calc + Nat.card (standardLubinTateGaloisParameterSubgroup F hπ n k) = + Nat.card (standardLubinTateUnitParameterSubgroup F n k) := by + exact + (Nat.card_congr + (standardLubinTateUnitParameterSubgroupEquivGaloisParameterSubgroup + F hπ n k).toEquiv).symm + _ = Nat.card F.residueField ^ (n + 1 - k) := + standardLubinTateUnitParameterSubgroup_natCard + F hπ n k hk hkn + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HerbrandFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HerbrandFormula.lean new file mode 100644 index 0000000000..0ad81e35b4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HerbrandFormula.lean @@ -0,0 +1,449 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamificationFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.UpperRamification +/-! +# Herbrand formula for finite Lubin--Tate levels + +The explicit lower ramification groups determine the slopes of the Herbrand +function. Summing those slopes sends the lower breaks `q ^ k - 1` to the +integral upper breaks `k`. Consequently the upper ramification group at `k` +is the Galois image of the `k`-th principal-unit subgroup and has order +`q ^ (n + 1 - k)`. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +open RamificationTheory.DiscreteValuationField +open RamificationTheory.HilbertRamification.Higher + +variable {K : Type u} [Field K] + +noncomputable local instance + standardLubinTateLevelField_finiteDimensional_forHerbrandFormula + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + FiniteDimensional K (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_finiteDimensional hπ n + +noncomputable local instance + standardLubinTateLevelField_isGalois_forHerbrandFormula + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + IsGalois K (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_isGalois hπ n + +private theorem standardLubinTateUnitParameterSubgroup_zero_eq_top + (F : LocalField.{u, v} K) (n : ℕ) : + standardLubinTateUnitParameterSubgroup F n 0 = ⊤ := by + apply top_unique + intro a _ha + rw [← standardLubinTateUnitParameterChosenRepresentative_spec F n a] + exact + (standardLubinTateUnitParameterClass_mem_subgroup_iff + F n 0 (Nat.zero_le (n + 1)) + (standardLubinTateUnitParameterChosenRepresentative F n a)).2 (by + simp) + +private theorem standardLubinTateRealLowerRamificationGroup_zero_eq_top + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + standardLubinTateRealLowerRamificationGroup hπ n 0 = ⊤ := by + ext σ + obtain ⟨a, rfl⟩ := + standardLubinTateUnitParameterToGal_surjective F hπ n σ + rw [show (0 : ℝ) = ((0 : ℕ) : ℝ) by norm_num] + rw [mem_standardLubinTateRealLowerRamificationGroup_nat_iff_primitivePoint] + simpa [standardLubinTateUnitParameterSubgroup_zero_eq_top] using + (standardLubinTateUnitParameterToGal_displacement_addVal_ge_iff_mem_parameterSubgroup + F hπ n a 0 (Nat.zero_le (n + 1))) + +private theorem standardLubinTateRealLowerRamificationGroup_zero_natCard + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + Nat.card (standardLubinTateRealLowerRamificationGroup hπ n 0) = + (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := by + rw [standardLubinTateRealLowerRamificationGroup_zero_eq_top F hπ n, + Subgroup.card_top, + standardLubinTateLevelField_natCard_gal (F := F) hπ n, + standardLubinTateLevelField_finrank (F := F) hπ n] + +/-- On a lower-numbering power interval, the Herbrand slope is the ratio of +the corresponding lower-group order to the inertia-group order. -/ +theorem standardLubinTateHerbrandSlope_eq_of_pow_interval + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n k i : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) + (hlow : Nat.card F.residueField ^ (k - 1) ≤ i + 1) + (hhigh : i + 1 < Nat.card F.residueField ^ k) : + AntitoneNormalSubgroupFiltration.herbrandSlope + (standardLubinTateLowerRamificationFiltration hπ n) i = + (Nat.card F.residueField ^ (n + 1 - k) : ℕ) / + ((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n : ℕ) := by + rw [AntitoneNormalSubgroupFiltration.herbrandSlope] + change + (Nat.card + (standardLubinTateRealLowerRamificationGroup hπ n + ((i + 1 : ℕ) : ℝ)) : ℝ) / + Nat.card + (standardLubinTateRealLowerRamificationGroup hπ n + ((0 : ℕ) : ℝ)) = + _ + rw [standardLubinTateRealLowerRamificationGroup_natCard_of_pow_interval + F hπ n k (i + 1) hk hkn hlow hhigh, + show + Nat.card + (standardLubinTateRealLowerRamificationGroup hπ n + ((0 : ℕ) : ℝ)) = + (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n by + simpa only [Nat.cast_zero] using + standardLubinTateRealLowerRamificationGroup_zero_natCard F hπ n] + +private theorem standardLubinTateHerbrandValueNat_pow_sub_one + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n k : ℕ) (hkn : k ≤ n + 1) : + AntitoneNormalSubgroupFiltration.herbrandValueNat + (standardLubinTateLowerRamificationFiltration hπ n) + (Nat.card F.residueField ^ k - 1) = + (k : ℝ) := by + let q := Nat.card F.residueField + let filtration := + standardLubinTateLowerRamificationFiltration hπ n + have hqone : 1 < q := + (Finite.one_lt_card : 1 < Nat.card F.residueField) + have hqpos : 0 < q := Nat.zero_lt_one.trans hqone + revert hkn + induction k with + | zero => + intro _ + simp + | succ k ih => + intro hsucc + have hkn : k ≤ n := by omega + have ihval := ih (by omega : k ≤ n + 1) + let a := q ^ k - 1 + let b := q ^ (k + 1) - q ^ k + have hqpowpos : 1 ≤ q ^ k := + Nat.one_le_iff_ne_zero.mpr + (pow_ne_zero _ (Nat.ne_of_gt hqpos)) + have hqpowle : q ^ k ≤ q ^ (k + 1) := + Nat.pow_le_pow_right hqpos (Nat.le_succ k) + have hdecomp : q ^ (k + 1) - 1 = a + b := by + dsimp [a, b] + omega + have hslope : + ∀ x ∈ Finset.range b, + AntitoneNormalSubgroupFiltration.herbrandSlope + filtration (a + x) = + (q ^ (n + 1 - (k + 1)) : ℕ) / + ((q - 1) * q ^ n : ℕ) := by + intro x hx + apply + standardLubinTateHerbrandSlope_eq_of_pow_interval + F hπ n (k + 1) (a + x) (by omega) hsucc + · change q ^ k ≤ a + x + 1 + dsimp [a] + omega + · change a + x + 1 < q ^ (k + 1) + have hxlt : x < b := Finset.mem_range.mp hx + dsimp [a, b] at * + omega + have hb : b = (q - 1) * q ^ k := by + dsimp [b] + calc + q ^ (k + 1) - q ^ k = q * q ^ k - q ^ k := by + rw [pow_succ, Nat.mul_comm] + _ = (q - 1) * q ^ k := by + rw [Nat.mul_sub_right_distrib] + simp + have hexponent : n + 1 - (k + 1) = n - k := by omega + have hpowSplit : q ^ n = q ^ k * q ^ (n - k) := by + rw [← pow_add] + congr + omega + have hproduct : + b * q ^ (n + 1 - (k + 1)) = (q - 1) * q ^ n := by + rw [hb, hexponent, hpowSplit] + simp [Nat.mul_assoc] + have hdenpos : 0 < (q - 1) * q ^ n := + Nat.mul_pos (Nat.sub_pos_of_lt hqone) (Nat.pow_pos hqpos) + have htail : + (∑ x ∈ Finset.range b, + AntitoneNormalSubgroupFiltration.herbrandSlope + filtration (a + x)) = 1 := by + calc + _ = ∑ _x ∈ Finset.range b, + ((q ^ (n + 1 - (k + 1)) : ℕ) / + ((q - 1) * q ^ n : ℕ) : ℝ) := by + apply Finset.sum_congr rfl + intro x hx + exact hslope x hx + _ = (b : ℝ) * + ((q ^ (n + 1 - (k + 1)) : ℕ) / + ((q - 1) * q ^ n : ℕ) : ℝ) := by + simp + _ = 1 := by + rw [← mul_div_assoc, ← Nat.cast_mul, hproduct, div_self] + exact_mod_cast (Nat.ne_of_gt hdenpos) + change + (∑ i ∈ Finset.range (q ^ (k + 1) - 1), + AntitoneNormalSubgroupFiltration.herbrandSlope filtration i) = + ((k + 1 : ℕ) : ℝ) + rw [hdecomp, Finset.sum_range_add] + change + AntitoneNormalSubgroupFiltration.herbrandValueNat filtration a + + (∑ x ∈ Finset.range b, + AntitoneNormalSubgroupFiltration.herbrandSlope + filtration (a + x)) = + ((k + 1 : ℕ) : ℝ) + rw [show a = q ^ k - 1 by rfl, ihval, htail] + norm_num + +/-- The lower endpoints `q ^ k - 1` map to the integral upper endpoints +`k`, including the endpoint `k = 0`. -/ +theorem standardLubinTateHerbrandFunction_pow_sub_one + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n k : ℕ) (hkn : k ≤ n + 1) : + standardLubinTateHerbrandFunction hπ n + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) = + (k : ℝ) := by + change + AntitoneNormalSubgroupFiltration.herbrandFunction + (standardLubinTateLowerRamificationFiltration hπ n) + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) = + (k : ℝ) + rw [AntitoneNormalSubgroupFiltration.herbrandFunction_nat] + exact standardLubinTateHerbrandValueNat_pow_sub_one + F hπ n k hkn + +/-- At an integral upper endpoint, the inverse Herbrand function returns the +lower endpoint `q ^ k - 1`. -/ +theorem standardLubinTateInverseHerbrandFunction_nat_eq_pow_sub_one + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n k : ℕ) (hkn : k ≤ n + 1) : + standardLubinTateInverseHerbrandFunction hπ n (k : ℝ) = + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) := by + change + inverseHerbrandFunctionOfUniqueExtension + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + hπ n) + (k : ℝ) = + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) + rw [← standardLubinTateHerbrandFunction_pow_sub_one F hπ n k hkn] + exact + inverseHerbrandFunctionOfUniqueExtension_eta + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + hπ n) + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) + +/-- At an integral upper index, the upper group is the lower group at the +corresponding power break. -/ +theorem + standardLubinTateRealUpperRamificationGroup_nat_eq_lower_pow_sub_one + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n k : ℕ) (hkn : k ≤ n + 1) : + standardLubinTateRealUpperRamificationGroup hπ n (k : ℝ) = + standardLubinTateRealLowerRamificationGroup hπ n + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) := by + rw [← standardLubinTateHerbrandFunction_pow_sub_one F hπ n k hkn] + exact + standardLubinTateRealUpperRamificationGroup_herbrandFunction + hπ n ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) + +/-- For `1 ≤ k ≤ n + 1`, the integral upper group is the Galois image of +the `k`-th finite principal-unit subgroup. -/ +theorem + standardLubinTateRealUpperRamificationGroup_nat_eq_galoisParameterSubgroup + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n k : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) : + standardLubinTateRealUpperRamificationGroup hπ n (k : ℝ) = + standardLubinTateGaloisParameterSubgroup F hπ n k := by + rw [ + standardLubinTateRealUpperRamificationGroup_nat_eq_lower_pow_sub_one + F hπ n k hkn, + standardLubinTateRealLowerRamificationGroup_pow_sub_one_eq_galoisParameterSubgroup + F hπ n k hk hkn] + +/-- For `1 ≤ k ≤ n + 1`, the integral upper group has order +`q ^ (n + 1 - k)`. -/ +theorem standardLubinTateRealUpperRamificationGroup_natCard + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n k : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) : + Nat.card + (standardLubinTateRealUpperRamificationGroup hπ n (k : ℝ)) = + Nat.card F.residueField ^ (n + 1 - k) := by + rw [ + standardLubinTateRealUpperRamificationGroup_nat_eq_galoisParameterSubgroup + F hπ n k hk hkn, + standardLubinTateGaloisParameterSubgroup_natCard F hπ n k hk hkn] + +/-- On a lower-numbering power interval, the lower group is the group at the +right endpoint `q ^ k - 1`. -/ +theorem standardLubinTateRealLowerRamificationGroup_eq_break_of_pow_interval + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n k r : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) + (hlow : Nat.card F.residueField ^ (k - 1) ≤ r) + (hhigh : r < Nat.card F.residueField ^ k) : + standardLubinTateRealLowerRamificationGroup hπ n (r : ℝ) = + standardLubinTateRealLowerRamificationGroup hπ n + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) := by + rw [ + standardLubinTateRealLowerRamificationGroup_eq_galoisParameterSubgroup_of_pow_interval + F hπ n k r hk hkn hlow hhigh, + standardLubinTateRealLowerRamificationGroup_pow_sub_one_eq_galoisParameterSubgroup + F hπ n k hk hkn] + +/-- On the positive range visible at level `n + 1`, the real upper +filtration is the natural-ceiling extension of its integral values. -/ +theorem standardLubinTateRealUpperRamificationGroup_eq_natCeil + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (t : ℝ) + (hk : 1 ≤ ⌈t⌉₊) (hkn : ⌈t⌉₊ ≤ n + 1) : + standardLubinTateRealUpperRamificationGroup hπ n t = + standardLubinTateRealUpperRamificationGroup + hπ n (⌈t⌉₊ : ℝ) := by + let k : ℕ := ⌈t⌉₊ + let q : ℕ := Nat.card F.residueField + let ψ : ℝ → ℝ := + standardLubinTateInverseHerbrandFunction hπ n + have hk' : 1 ≤ k := by + simpa only [k] using hk + have hkn' : k ≤ n + 1 := by + simpa only [k] using hkn + have ht_interval : ((k - 1 : ℕ) : ℝ) < t ∧ t ≤ (k : ℝ) := by + apply (Nat.ceil_eq_iff (by omega : k ≠ 0)).mp + rfl + have hψ_strict : StrictMono ψ := by + dsimp only [ψ, standardLubinTateInverseHerbrandFunction] + exact + inverseHerbrandFunctionOfUniqueExtension_strictMono + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + hπ n) + have hψ_endpoint : + ∀ j : ℕ, j ≤ n + 1 → + ψ (j : ℝ) = ((q ^ j - 1 : ℕ) : ℝ) := by + intro j hj + simpa only [ψ, q] using + standardLubinTateInverseHerbrandFunction_nat_eq_pow_sub_one + F hπ n j hj + have hψ_zero : ψ 0 = 0 := by + simpa using hψ_endpoint 0 (by omega) + have hψ_nonneg : 0 ≤ ψ t := by + calc + 0 = ψ 0 := hψ_zero.symm + _ ≤ ψ t := hψ_strict.monotone (by + exact (Nat.one_le_ceil_iff.mp hk).le) + have hψ_lower : + (((q ^ (k - 1) - 1 : ℕ) : ℝ)) < ψ t := by + calc + (((q ^ (k - 1) - 1 : ℕ) : ℝ)) = + ψ ((k - 1 : ℕ) : ℝ) := + (hψ_endpoint (k - 1) (by omega)).symm + _ < ψ t := hψ_strict ht_interval.1 + have hψ_upper : + ψ t ≤ ((q ^ k - 1 : ℕ) : ℝ) := by + calc + ψ t ≤ ψ (k : ℝ) := hψ_strict.monotone ht_interval.2 + _ = ((q ^ k - 1 : ℕ) : ℝ) := hψ_endpoint k hkn' + have hqone : 1 < q := by + simpa only [q] using + (Finite.one_lt_card : 1 < Nat.card F.residueField) + have hqpos : 0 < q := Nat.zero_lt_one.trans hqone + have hqpow_previous : 1 ≤ q ^ (k - 1) := by + exact + Nat.one_le_iff_ne_zero.mpr + (pow_ne_zero _ (Nat.ne_of_gt hqpos)) + have hqpow_current : 1 ≤ q ^ k := by + exact + Nat.one_le_iff_ne_zero.mpr + (pow_ne_zero _ (Nat.ne_of_gt hqpos)) + have hlow : q ^ (k - 1) ≤ ⌈ψ t⌉₊ := by + rw [← Nat.sub_add_cancel hqpow_previous] + exact Nat.add_one_le_ceil_iff.mpr hψ_lower + have hceil_upper : ⌈ψ t⌉₊ ≤ q ^ k - 1 := + Nat.ceil_le.mpr hψ_upper + have hhigh : ⌈ψ t⌉₊ < q ^ k := by + omega + change + standardLubinTateRealUpperRamificationGroup hπ n t = + standardLubinTateRealUpperRamificationGroup hπ n (k : ℝ) + rw [ + standardLubinTateRealUpperRamificationGroup_nat_eq_lower_pow_sub_one + F hπ n k hkn'] + change + standardLubinTateRealLowerRamificationGroup hπ n (ψ t) = + standardLubinTateRealLowerRamificationGroup hπ n + ((q ^ k - 1 : ℕ) : ℝ) + calc + standardLubinTateRealLowerRamificationGroup hπ n (ψ t) = + standardLubinTateRealLowerRamificationGroup + hπ n (⌈ψ t⌉₊ : ℝ) := + standardLubinTateRealLowerRamificationGroup_eq_natCeil + hπ n (ψ t) hψ_nonneg + _ = + standardLubinTateRealLowerRamificationGroup hπ n + ((q ^ k - 1 : ℕ) : ℝ) := + standardLubinTateRealLowerRamificationGroup_eq_break_of_pow_interval + F hπ n k ⌈ψ t⌉₊ hk' hkn' hlow hhigh + +/-- On the positive visible range, the real upper group is the Galois image +at its natural-ceiling principal-unit level. -/ +theorem + standardLubinTateRealUpperRamificationGroup_eq_galoisParameterSubgroup_of_ceil + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (t : ℝ) + (hk : 1 ≤ ⌈t⌉₊) (hkn : ⌈t⌉₊ ≤ n + 1) : + standardLubinTateRealUpperRamificationGroup hπ n t = + standardLubinTateGaloisParameterSubgroup F hπ n ⌈t⌉₊ := by + rw [standardLubinTateRealUpperRamificationGroup_eq_natCeil + F hπ n t hk hkn, + standardLubinTateRealUpperRamificationGroup_nat_eq_galoisParameterSubgroup + F hπ n ⌈t⌉₊ hk hkn] + +/-- On the positive visible range, the real upper group has the order +prescribed by its natural-ceiling principal-unit level. -/ +theorem standardLubinTateRealUpperRamificationGroup_natCard_of_ceil + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (t : ℝ) + (hk : 1 ≤ ⌈t⌉₊) (hkn : ⌈t⌉₊ ≤ n + 1) : + Nat.card (standardLubinTateRealUpperRamificationGroup hπ n t) = + Nat.card F.residueField ^ (n + 1 - ⌈t⌉₊) := by + rw [ + standardLubinTateRealUpperRamificationGroup_eq_galoisParameterSubgroup_of_ceil + F hπ n t hk hkn, + standardLubinTateGaloisParameterSubgroup_natCard + F hπ n ⌈t⌉₊ hk hkn] + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean new file mode 100644 index 0000000000..d743ed839f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean @@ -0,0 +1,1420 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedPrimitiveEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedLevelCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveDisplacement +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PolynomialRootProximity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.GaloisStabilizer +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationKrasner +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal +/-! +# Stability of a standard Lubin--Tate level under a deep unit change + +This file develops the quantitative inputs for comparing the standard +level attached to a uniformizer `π` with the standard level attached to +`uπ`, when `u` is a sufficiently deep principal unit. + +`ChangedPrimitiveEvaluation` supplies the first input: at depth `n + 1`, +the changed primitive polynomial evaluated at the old primitive point has +additive valuation at least `(n + 2) d`. + +The new input proved here is the exact additive valuation of the derivative of the +primitive polynomial at the distinguished primitive point. If + +`d = (q - 1) q^n`, + +then that valuation is + +`n d + (q - 2) q^n = (n + 1) d - q^n`. + +Together these are the two numerical terms in the root-product/Krasner +comparison: the evaluation estimate controls the changed polynomial at the +old primitive point, and the derivative exponent controls the product of the +other changed-root displacements. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + isUnit_one_add_of_mem_maximalIdeal_pow → + isUnit_one_add_of_mem_maximalIdeal_pow + + +noncomputable +section + +open scoped Polynomial IntermediateField + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +open RamificationTheory.HilbertRamification.Higher +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +variable {K : Type u} [Field K] + +/-- Every integral primitive polynomial splits already over the valuation +ring of its standard level. The finite unit parameters give as many +distinct integral roots as the degree of the polynomial. -/ +theorem + standardLubinTatePrimitivePolynomial_map_levelCoefficientHom_splits + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + ((standardLubinTatePrimitivePolynomial F π n).map + (standardLubinTateLevelCoefficientHom hπ n)).Splits := by + classical + let target := standardLubinTateLevelCompleteDVF hπ n + let p := + (standardLubinTatePrimitivePolynomial F π n).map + (standardLubinTateLevelCoefficientHom hπ n) + let root : + standardLubinTateUnitParameter F n → + target.valuationSubring := + fun a => + standardLubinTatePrimitivePointIntegerAction hπ n + (standardLubinTateUnitParameterChosenRepresentative F n a) + have hpmonic : p.Monic := by + exact + (standardLubinTatePrimitivePolynomial_monic F π n).map + (standardLubinTateLevelCoefficientHom hπ n) + have hpne : p ≠ 0 := hpmonic.ne_zero + have hroot (a : standardLubinTateUnitParameter F n) : + p.eval (root a) = 0 := by + apply standardLubinTateLevelIntegerToSeparableClosure_injective hπ n + rw [map_zero] + simp only [p, Polynomial.eval_map] + rw [Polynomial.hom_eval₂, + standardLubinTateLevelIntegerToSeparableClosure_comp_coefficientHom] + simpa [p, root, Polynomial.IsRoot, + standardLubinTatePrimitivePolynomialOverField, + standardLubinTatePrimitiveRootAction, + Polynomial.eval_map, Polynomial.eval₂_map] using + standardLubinTatePrimitiveRootAction_isRoot hπ n + (standardLubinTateUnitParameterChosenRepresentative F n a) + have hroot_mem (a : standardLubinTateUnitParameter F n) : + root a ∈ p.roots := + (Polynomial.mem_roots hpne).2 (hroot a) + have hroot_injective : Function.Injective root := by + intro a b hab + apply standardLubinTateUnitParameterLevelRoot_injective F hπ n + change + (root a : standardLubinTateLevelField hπ n) = + (root b : standardLubinTateLevelField hπ n) + exact congrArg Subtype.val hab + let := Fintype.ofFinite (standardLubinTateUnitParameter F n) + let rootEmbedding : + standardLubinTateUnitParameter F n ↪ target.valuationSubring := + ⟨root, hroot_injective⟩ + let roots : Finset target.valuationSubring := + Finset.univ.map rootEmbedding + have hroots_le : roots.1 ≤ p.roots := by + rw [Finset.val_le_iff_val_subset] + intro z hz + obtain ⟨a, -, rfl⟩ := Finset.mem_map.mp hz + exact hroot_mem a + have hroots_card : + roots.card = + (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := by + calc + roots.card = + Fintype.card (standardLubinTateUnitParameter F n) := by + simp [roots, rootEmbedding] + _ = Nat.card (standardLubinTateUnitParameter F n) := + Nat.card_eq_fintype_card.symm + _ = _ := standardLubinTateUnitParameter_natCard F n + have hpdegree : + p.natDegree = + (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := by + calc + p.natDegree = + (standardLubinTatePrimitivePolynomial F π n).natDegree := by + simpa [p] using + (standardLubinTatePrimitivePolynomial_monic F π n).natDegree_map + (standardLubinTateLevelCoefficientHom hπ n) + _ = + (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := + standardLubinTatePrimitivePolynomial_natDegree F π n + apply Polynomial.splits_iff_card_roots.mpr + apply Nat.le_antisymm + · exact Polynomial.card_roots' p + · rw [hpdegree, ← hroots_card] + exact Multiset.card_le_card hroots_le + +/-- Evaluation of the derivative of a successor iterate is the old +derivative value multiplied by `q y^(q-1) + π`, where `y` is the old +iterate value. -/ +private theorem + standardLubinTatePolynomialIterate_derivative_eval₂_succ + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n i : ℕ) : + Polynomial.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePolynomialIterate F π (i + 1)).derivative = + (standardLubinTateLevelCoefficientHom hπ n + (Nat.card F.residueField : F.valuationSubring) * + standardLubinTatePrimitivePointIterateInteger hπ n i ^ + (Nat.card F.residueField - 1) + + standardLubinTateLevelCoefficientHom hπ n π) * + Polynomial.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePolynomialIterate F π i).derivative := by + rw [standardLubinTatePolynomialIterate_succ, + Polynomial.derivative_comp, Polynomial.eval₂_mul, + Polynomial.eval₂_comp, standardLubinTatePolynomial, + Polynomial.derivative_add, Polynomial.derivative_pow, + Polynomial.derivative_mul, Polynomial.derivative_X, + Polynomial.derivative_C] + simp [standardLubinTatePrimitivePointIterateInteger] + ring + +/-- The derivative factor `q y^(q-1) + π` occurring at every iterate has +the same additive valuation as the image of the base uniformizer. -/ +private theorem standardLubinTate_iterate_derivative_factor_addVal + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n i : ℕ) (hi : i ≤ n) : + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (standardLubinTateLevelCoefficientHom hπ n + (Nat.card F.residueField : F.valuationSubring) * + standardLubinTatePrimitivePointIterateInteger hπ n i ^ + (Nat.card F.residueField - 1) + + standardLubinTateLevelCoefficientHom hπ n π) = + (((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n : ℕ) : ℕ∞) := by + let target := standardLubinTateLevelCompleteDVF hπ n + let y := standardLubinTatePrimitivePointIterateInteger hπ n i + let q := Nat.card F.residueField + let d := (q - 1) * q ^ n + have hqres : + F.residueMap (q : F.valuationSubring) = 0 := by + let := Fintype.ofFinite F.residueField + change (Nat.card F.residueField : F.residueField) = 0 + rw [Nat.card_eq_fintype_card] + exact Nat.cast_card_eq_zero F.residueField + have hqmem : + (q : F.valuationSubring) ∈ F.maximalIdeal := + (F.toCompleteDVF.residue_eq_zero_iff + (q : F.valuationSubring)).1 hqres + have hqid : π ∣ (q : F.valuationSubring) := by + simpa using + (F.toCompleteDVF.mem_maximalIdeal_pow_iff_uniformizer_pow_dvd + hπ 1).1 (by simpa using hqmem) + rcases hqid with ⟨c, hc⟩ + have hyval : + IsDiscreteValuationRing.addVal target.valuationSubring y = + (q ^ i : ℕ) := by + simpa [target, y, q] using + standardLubinTatePrimitivePointIterateInteger_addVal hπ n i hi + have hymem : y ∈ target.maximalIdeal := by + have hymemPow : y ∈ target.maximalIdeal ^ 1 := by + apply + (IsDiscreteValuationRing.mem_maximalIdeal_pow_iff_addVal_ge y 1).2 + rw [hyval] + exact_mod_cast Nat.one_le_iff_ne_zero.mpr + (pow_ne_zero i (Nat.ne_of_gt + (Nat.zero_lt_one.trans + (Finite.one_lt_card : 1 < Nat.card F.residueField)))) + simpa using hymemPow + have hqsubpos : 0 < q - 1 := + Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField) + obtain ⟨r, hr⟩ := Nat.exists_eq_succ_of_ne_zero + (Nat.ne_of_gt hqsubpos) + have hypowmem : y ^ (q - 1) ∈ target.maximalIdeal := by + rw [hr, pow_succ] + exact target.maximalIdeal.mul_mem_left (y ^ r) hymem + have hzmem : + standardLubinTateLevelCoefficientHom hπ n c * + y ^ (q - 1) ∈ target.maximalIdeal := + target.maximalIdeal.mul_mem_left + (standardLubinTateLevelCoefficientHom hπ n c) hypowmem + have hunit : + IsUnit + (1 + standardLubinTateLevelCoefficientHom hπ n c * + y ^ (q - 1)) := + isUnit_one_add_of_mem_maximalIdeal_pow + target (n := 1) le_rfl + (standardLubinTateLevelCoefficientHom hπ n c * + y ^ (q - 1)) (by + simpa only [pow_one] using hzmem) + have hfactor : + standardLubinTateLevelCoefficientHom hπ n + (q : F.valuationSubring) * y ^ (q - 1) + + standardLubinTateLevelCoefficientHom hπ n π = + standardLubinTateLevelCoefficientHom hπ n π * + (1 + standardLubinTateLevelCoefficientHom hπ n c * + y ^ (q - 1)) := by + rw [hc, map_mul] + ring + rw [hfactor, IsDiscreteValuationRing.addVal_mul, + (IsDiscreteValuationRing.addVal_eq_zero_iff).2 hunit, add_zero] + simpa [target, q, d, standardLubinTateLevelCoefficientHom] using + standardLubinTateBaseUniformizerInteger_map_addVal hπ n + +/-- The derivative of the `i`-fold standard iterate at the primitive point +has additive valuation `i * d`, where `d = (q - 1) q^n`. -/ +private theorem + standardLubinTatePolynomialIterate_derivative_eval₂_addVal + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n i : ℕ) (hi : i ≤ n) : + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (Polynomial.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePolynomialIterate F π i).derivative) = + ((i * ((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n) : ℕ) : ℕ∞) := by + induction i with + | zero => + simp [standardLubinTatePolynomialIterate] + | succ i ih => + have hi' : i ≤ n := Nat.le_trans (Nat.le_succ i) hi + rw [standardLubinTatePolynomialIterate_derivative_eval₂_succ, + IsDiscreteValuationRing.addVal_mul, + standardLubinTate_iterate_derivative_factor_addVal hπ n i hi', + ih hi'] + exact_mod_cast + (by + ring : + (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n + + i * ((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n) = + (i + 1) * ((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n)) + +/-- Exact derivative valuation of the integral primitive polynomial at the +distinguished primitive point. -/ +theorem standardLubinTatePrimitivePolynomial_derivative_eval₂_addVal + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (Polynomial.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePrimitivePolynomial F π n).derivative) = + ((n * ((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n) + + (Nat.card F.residueField - 2) * + Nat.card F.residueField ^ n : ℕ) : ℕ∞) := by + let target := standardLubinTateLevelCompleteDVF hπ n + let q := Nat.card F.residueField + let y := standardLubinTatePrimitivePointIterateInteger hπ n n + have hqsubres : + F.residueMap ((q - 1 : ℕ) : F.valuationSubring) = + ((q - 1 : ℕ) : F.residueField) := by + exact map_natCast F.residueMap (q - 1) + have hqsubres_ne : + F.residueMap (q - 1 : ℕ) ≠ 0 := by + let := Fintype.ofFinite F.residueField + rw [hqsubres] + have hqzero : (q : F.residueField) = 0 := by + change (Nat.card F.residueField : F.residueField) = 0 + rw [Nat.card_eq_fintype_card] + exact Nat.cast_card_eq_zero F.residueField + rw [Nat.cast_sub + (Nat.le_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)), hqzero] + simp + have hqsubunitBase : + IsUnit ((q - 1 : ℕ) : F.valuationSubring) := + (F.toCompleteDVF.residue_ne_zero_iff_isUnit + ((q - 1 : ℕ) : F.valuationSubring)).1 hqsubres_ne + have hqsubunitTarget : + IsUnit + (standardLubinTateLevelCoefficientHom hπ n + ((q - 1 : ℕ) : F.valuationSubring)) := + hqsubunitBase.map + (standardLubinTateLevelCoefficientHom hπ n) + have hyval : + IsDiscreteValuationRing.addVal target.valuationSubring y = + (q ^ n : ℕ) := by + simpa [target, q, y] using + standardLubinTatePrimitivePointIterateInteger_addVal + hπ n n le_rfl + rw [standardLubinTatePrimitivePolynomial, + Polynomial.derivative_add, Polynomial.derivative_pow, + Polynomial.derivative_C, add_zero, Polynomial.eval₂_mul, + Polynomial.eval₂_mul, Polynomial.eval₂_C, + Polynomial.eval₂_pow] + rw [IsDiscreteValuationRing.addVal_mul, + IsDiscreteValuationRing.addVal_mul, + (IsDiscreteValuationRing.addVal_eq_zero_iff).2 hqsubunitTarget, + zero_add, IsDiscreteValuationRing.addVal_pow] + change + (q - 1 - 1) • + IsDiscreteValuationRing.addVal target.valuationSubring y + + IsDiscreteValuationRing.addVal target.valuationSubring + (Polynomial.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePolynomialIterate F π n).derivative) = + ((n * ((q - 1) * q ^ n) + (q - 2) * q ^ n : ℕ) : ℕ∞) + rw [hyval, + standardLubinTatePolynomialIterate_derivative_eval₂_addVal + hπ n n le_rfl] + simp only [nsmul_eq_mul] + exact_mod_cast + (by + ring : + (q - 2) * q ^ n + + n * ((q - 1) * q ^ n) = + n * ((q - 1) * q ^ n) + + (q - 2) * q ^ n) + +/-- Every integral root of the primitive polynomial in its standard level +has the same derivative valuation as the distinguished primitive point. -/ +theorem + standardLubinTatePrimitivePolynomial_map_levelCoefficientHom_derivative_addVal + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) + {y : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring} + (hy : + y ∈ + ((standardLubinTatePrimitivePolynomial F π n).map + (standardLubinTateLevelCoefficientHom hπ n)).roots) : + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (((standardLubinTatePrimitivePolynomial F π n).map + (standardLubinTateLevelCoefficientHom hπ n)).derivative.eval y) = + ((n * ((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n) + + (Nat.card F.residueField - 2) * + Nat.card F.residueField ^ n : ℕ) : ℕ∞) := by + let L := standardLubinTateLevelField hπ n + let target := standardLubinTateLevelCompleteDVF hπ n + let p := + (standardLubinTatePrimitivePolynomial F π n).map + (standardLubinTateLevelCoefficientHom hπ n) + let lambda := standardLubinTatePrimitivePointInteger hπ n + let : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsGalois K L := + standardLubinTateLevelField_isGalois (F := F) hπ n + have hpne : p ≠ 0 := + ((standardLubinTatePrimitivePolynomial_monic F π n).map + (standardLubinTateLevelCoefficientHom hπ n)).ne_zero + have hyeval : p.eval y = 0 := + (Polynomial.mem_roots hpne).1 (by simpa [p] using hy) + have hymin : + Polynomial.aeval (y : L) + (minpoly K (standardLubinTateLevelPowerBasis hπ n).gen) = 0 := by + rw [standardLubinTateLevelPowerBasis_minpoly] + let ι : target.valuationSubring →+* L := + target.valuation.valuationSubring.subtype + have hyevalL := congrArg ι hyeval + rw [map_zero] at hyevalL + simp only [p, Polynomial.eval_map] at hyevalL + rw [Polynomial.hom_eval₂] at hyevalL + have hcomp : + ι.comp (standardLubinTateLevelCoefficientHom hπ n) = + (algebraMap K L).comp (algebraMap F.valuationSubring K) := by + apply RingHom.ext + intro a + exact standardLubinTateLevelCoefficientHom_apply hπ n a + rw [hcomp] at hyevalL + simpa [ι, p, Polynomial.aeval_def, + standardLubinTatePrimitivePolynomialOverField, + Polynomial.eval_map, Polynomial.eval₂_map] using hyevalL + obtain ⟨sigma, hsigma⟩ := + minpoly.exists_algEquiv_of_root' + (Algebra.IsAlgebraic.isAlgebraic + (standardLubinTateLevelPowerBasis hπ n).gen) + hymin + let r := + valuationSubringAutOfUniqueExtension + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + hπ n) sigma + have r_comp : + r.toRingHom.comp (standardLubinTateLevelCoefficientHom hπ n) = + standardLubinTateLevelCoefficientHom hπ n := by + apply RingHom.ext + intro a + simp only [RingHom.comp_apply] + apply Subtype.ext + change + sigma (algebraMap K L (a : K)) = + algebraMap K L (a : K) + exact sigma.commutes (a : K) + have r_lambda : r lambda = y := by + apply Subtype.ext + change + sigma (standardLubinTateLevelPowerBasis hπ n).gen = (y : L) + simpa [standardLubinTateLevelGenerator, lambda] using hsigma + have heval : + r (p.derivative.eval lambda) = + p.derivative.eval y := by + simp only [p, Polynomial.derivative_map, Polynomial.eval_map] + change + r.toRingHom + (Polynomial.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) lambda + (standardLubinTatePrimitivePolynomial F π n).derivative) = + Polynomial.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) y + (standardLubinTatePrimitivePolynomial F π n).derivative + rw [Polynomial.hom_eval₂, r_comp, + show r.toRingHom lambda = y from r_lambda] + calc + IsDiscreteValuationRing.addVal target.valuationSubring + (p.derivative.eval y) = + IsDiscreteValuationRing.addVal target.valuationSubring + (r (p.derivative.eval lambda)) := by rw [heval] + _ = + IsDiscreteValuationRing.addVal target.valuationSubring + (p.derivative.eval lambda) := + addVal_valuationSubringAutOfUniqueExtension + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + hπ n) sigma (p.derivative.eval lambda) + _ = _ := by + simpa [p, lambda, Polynomial.derivative_map, + Polynomial.eval_map] using + standardLubinTatePrimitivePolynomial_derivative_eval₂_addVal + hπ n + +/-- Arithmetic form of the derivative exponent used by the +root-product comparison. -/ +theorem standardLubinTatePrimitivePolynomial_derivativeExponent_eq + (F : LocalField.{u, v} K) (n : ℕ) : + n * ((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n) + + (Nat.card F.residueField - 2) * + Nat.card F.residueField ^ n = + (n + 1) * ((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n) - + Nat.card F.residueField ^ n := by + let q := Nat.card F.residueField + have hq : 2 ≤ q := + (Finite.one_lt_card : 1 < Nat.card F.residueField) + have hqsub : q - 1 = (q - 2) + 1 := by + omega + have hsum : + (n + 1) * ((q - 1) * q ^ n) = + q ^ n + + (n * ((q - 1) * q ^ n) + (q - 2) * q ^ n) := by + rw [hqsub] + ring + change + n * ((q - 1) * q ^ n) + (q - 2) * q ^ n = + (n + 1) * ((q - 1) * q ^ n) - q ^ n + rw [hsum, Nat.add_sub_cancel_left] + +/-- The changed primitive polynomial after passing through the changed +level and then into the common compositum valuation ring. -/ +noncomputable def + standardLubinTateChangedPrimitivePolynomialInCompositum + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuationSubring[X] := + let hπ' := + standardLubinTateChangedUniformizer_isUniformizer hπ u + ((standardLubinTatePrimitivePolynomial F + (standardLubinTateChangedUniformizer F π u) n).map + (standardLubinTateLevelCoefficientHom hπ' n)).map + (standardLubinTateChangedLevelToCompositumIntegerMap hπ u n) + +/-- The original distinguished primitive point in the common compositum +valuation ring. -/ +noncomputable def + standardLubinTateOriginalPrimitivePointInChangedLevelCompositum + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuationSubring := + standardLubinTateLevelToChangedLevelCompositumIntegerMap hπ u n + (standardLubinTatePrimitivePointInteger hπ n) + +/-- The distinguished changed primitive point in the common compositum +valuation ring. -/ +noncomputable def + standardLubinTateChangedPrimitivePointInCompositum + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuationSubring := + let hπ' := + standardLubinTateChangedUniformizer_isUniformizer hπ u + standardLubinTateChangedLevelToCompositumIntegerMap hπ u n + (standardLubinTatePrimitivePointInteger hπ' n) + +/-- The two routes from base coefficients into the common compositum +valuation ring agree. -/ +private theorem + standardLubinTateChangedLevelCompositum_coefficientHom_eq + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + (standardLubinTateChangedLevelToCompositumIntegerMap hπ u n).comp + (standardLubinTateLevelCoefficientHom + (standardLubinTateChangedUniformizer_isUniformizer hπ u) n) = + (standardLubinTateLevelToChangedLevelCompositumIntegerMap + hπ u n).comp + (standardLubinTateLevelCoefficientHom hπ n) := by + let L := standardLubinTateLevelField hπ n + let L' := standardLubinTateChangedLevelField hπ u n + let M := standardLubinTateChangedLevelCompositumField hπ u n + let : Algebra L M := + standardLubinTateLevelToChangedLevelCompositumAlgebra hπ u n + let : Algebra L' M := + standardLubinTateChangedLevelToCompositumAlgebra hπ u n + let : IsScalarTower K L M := + IsScalarTower.of_algebraMap_eq' rfl + let : IsScalarTower K L' M := + IsScalarTower.of_algebraMap_eq' rfl + apply RingHom.ext + intro a + simp only [RingHom.comp_apply] + apply Subtype.ext + rw [ + standardLubinTateChangedLevelToCompositumIntegerMap_apply_coe, + standardLubinTateLevelToChangedLevelCompositumIntegerMap_apply_coe] + change + algebraMap L' M + (standardLubinTateLevelCoefficientHom + (standardLubinTateChangedUniformizer_isUniformizer hπ u) n a : + L') = + algebraMap L M + (standardLubinTateLevelCoefficientHom hπ n a : L) + rw [standardLubinTateLevelCoefficientHom_apply, + standardLubinTateLevelCoefficientHom_apply] + rw [← IsScalarTower.algebraMap_apply K L' M, + ← IsScalarTower.algebraMap_apply K L M] + +/-- The changed primitive polynomial is monic in the common valuation +ring. -/ +theorem standardLubinTateChangedPrimitivePolynomialInCompositum_monic + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + (standardLubinTateChangedPrimitivePolynomialInCompositum + hπ u n).Monic := by + exact + ((standardLubinTatePrimitivePolynomial_monic F + (standardLubinTateChangedUniformizer F π u) n).map + (standardLubinTateLevelCoefficientHom + (standardLubinTateChangedUniformizer_isUniformizer hπ u) + n)).map + (standardLubinTateChangedLevelToCompositumIntegerMap hπ u n) + +/-- The changed primitive polynomial splits in the common valuation ring. -/ +theorem standardLubinTateChangedPrimitivePolynomialInCompositum_splits + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + (standardLubinTateChangedPrimitivePolynomialInCompositum + hπ u n).Splits := by + exact + (standardLubinTatePrimitivePolynomial_map_levelCoefficientHom_splits + (standardLubinTateChangedUniformizer_isUniformizer hπ u) n).map + (standardLubinTateChangedLevelToCompositumIntegerMap hπ u n) + +/-- The changed primitive polynomial remains nonconstant in the common +valuation ring. -/ +theorem + standardLubinTateChangedPrimitivePolynomialInCompositum_natDegree_ne_zero + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + (standardLubinTateChangedPrimitivePolynomialInCompositum + hπ u n).natDegree ≠ 0 := by + let hπ' := + standardLubinTateChangedUniformizer_isUniformizer hπ u + change + ((((standardLubinTatePrimitivePolynomial F + (standardLubinTateChangedUniformizer F π u) n).map + (standardLubinTateLevelCoefficientHom hπ' n)).map + (standardLubinTateChangedLevelToCompositumIntegerMap + hπ u n)).natDegree ≠ 0) + rw [ + ((standardLubinTatePrimitivePolynomial_monic F + (standardLubinTateChangedUniformizer F π u) n).map + (standardLubinTateLevelCoefficientHom hπ' n)).natDegree_map, + (standardLubinTatePrimitivePolynomial_monic F + (standardLubinTateChangedUniformizer F π u) n).natDegree_map, + standardLubinTatePrimitivePolynomial_natDegree] + exact mul_ne_zero + (Nat.sub_ne_zero_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (pow_ne_zero n + (Nat.ne_of_gt + (Nat.zero_lt_one.trans + (Finite.one_lt_card : 1 < Nat.card F.residueField)))) + +/-- Evaluation in the common compositum agrees with first evaluating at +the original primitive point and then applying the original-level +valuation-ring inclusion. -/ +private theorem + standardLubinTateChangedPrimitivePolynomialInCompositum_eval_original + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + (standardLubinTateChangedPrimitivePolynomialInCompositum + hπ u n).eval + (standardLubinTateOriginalPrimitivePointInChangedLevelCompositum + hπ u n) = + standardLubinTateLevelToChangedLevelCompositumIntegerMap hπ u n + (Polynomial.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePrimitivePolynomial F + (standardLubinTateChangedUniformizer F π u) n)) := by + rw [standardLubinTateChangedPrimitivePolynomialInCompositum, + Polynomial.eval_map, Polynomial.eval₂_map] + rw [Polynomial.hom_eval₂] + rw [standardLubinTateChangedLevelCompositum_coefficientHom_eq] + rfl + +/-- The changed-polynomial evaluation lower bound after transport to the +common compositum. -/ +theorem + standardLubinTateChangedPrimitivePolynomialInCompositum_eval_addVal_ge + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + (hu : u ∈ + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1)) : + ((standardLubinTateLevelToChangedLevelCompositumRamificationIndex + hπ u n * + (((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n) * (n + 2)) : ℕ) : ℕ∞) ≤ + IsDiscreteValuationRing.addVal + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuationSubring + ((standardLubinTateChangedPrimitivePolynomialInCompositum + hπ u n).eval + (standardLubinTateOriginalPrimitivePointInChangedLevelCompositum + hπ u n)) := by + let oldValue := + Polynomial.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePrimitivePolynomial F + (standardLubinTateChangedUniformizer F π u) n) + have hlower := + standardLubinTateChangedPrimitivePolynomial_eval_addVal_ge + hπ u n hu + have hscaled := + nsmul_le_nsmul_right hlower + (standardLubinTateLevelToChangedLevelCompositumRamificationIndex + hπ u n) + have hmap := + standardLubinTateLevelToChangedLevelCompositum_addVal + hπ u n oldValue + rw [ + standardLubinTateChangedPrimitivePolynomialInCompositum_eval_original] + rw [hmap] + simpa [oldValue, nsmul_eq_mul] using hscaled + +/-- Every changed root in the compositum has the transported exact +derivative valuation. -/ +theorem + standardLubinTateChangedPrimitivePolynomialInCompositum_derivative_addVal + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + {beta : + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuationSubring} + (hbeta : + beta ∈ + (standardLubinTateChangedPrimitivePolynomialInCompositum + hπ u n).roots) : + IsDiscreteValuationRing.addVal + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuationSubring + ((standardLubinTateChangedPrimitivePolynomialInCompositum + hπ u n).derivative.eval beta) = + standardLubinTateChangedLevelToCompositumRamificationIndex hπ u n • + ((n * ((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n) + + (Nat.card F.residueField - 2) * + Nat.card F.residueField ^ n : ℕ) : ℕ∞) := by + let hπ' := + standardLubinTateChangedUniformizer_isUniformizer hπ u + let level := standardLubinTateLevelCompleteDVF hπ' n + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + let p := + (standardLubinTatePrimitivePolynomial F + (standardLubinTateChangedUniformizer F π u) n).map + (standardLubinTateLevelCoefficientHom hπ' n) + let j := + standardLubinTateChangedLevelToCompositumIntegerMap hπ u n + have hj : Function.Injective j := by + intro a b hab + apply Subtype.ext + have hfield := + congrArg (fun z : target.valuationSubring => + (z : standardLubinTateChangedLevelCompositumField hπ u n)) hab + change + standardLubinTateChangedLevelToCompositum hπ u n + (a : standardLubinTateChangedLevelField hπ u n) = + standardLubinTateChangedLevelToCompositum hπ u n + (b : standardLubinTateChangedLevelField hπ u n) at hfield + exact + (standardLubinTateChangedLevelToCompositum + hπ u n).injective hfield + have hroots : + (p.map j).roots = p.roots.map j := + (standardLubinTatePrimitivePolynomial_map_levelCoefficientHom_splits + hπ' n).roots_map_of_injective hj + have hbeta' : beta ∈ (p.map j).roots := by + simpa [p, j, + standardLubinTateChangedPrimitivePolynomialInCompositum] using + hbeta + rw [hroots] at hbeta' + obtain ⟨y, hy, hxy⟩ := Multiset.mem_map.mp hbeta' + have hderivative : + (standardLubinTateChangedPrimitivePolynomialInCompositum + hπ u n).derivative.eval beta = + j (p.derivative.eval y) := by + rw [← hxy] + simp [standardLubinTateChangedPrimitivePolynomialInCompositum, + p, j, Polynomial.derivative_map, Polynomial.eval_map] + rw [hderivative] + rw [ + standardLubinTateChangedLevelToCompositum_addVal hπ u n + (p.derivative.eval y)] + rw [ + standardLubinTatePrimitivePolynomial_map_levelCoefficientHom_derivative_addVal + hπ' n hy] + +/-- The relative ramification index of the original level in the common +compositum is positive. -/ +private theorem + standardLubinTateLevelToChangedLevelCompositumRamificationIndex_pos + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) : + 0 < + standardLubinTateLevelToChangedLevelCompositumRamificationIndex + hπ u n := by + let L := standardLubinTateLevelField hπ n + let M := standardLubinTateChangedLevelCompositumField hπ u n + let level := standardLubinTateLevelCompleteDVF hπ n + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + let : Algebra L M := + standardLubinTateLevelToChangedLevelCompositumAlgebra hπ u n + let : level.valuation.HasExtension target.valuation := + standardLubinTateLevelToChangedLevelCompositum_hasExtension + hπ u n + let : Module.IsTorsionFree + level.valuationSubring target.valuationSubring := + Module.IsTorsionFree.of_smul_eq_zero fun a b hab => by + rw [Algebra.smul_def] at hab + rcases mul_eq_zero.mp hab with ha | hb + · exact Or.inl (integerMap_injective level.toDVF target.toDVF ha) + · exact Or.inr hb + change + 0 < + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + level.toDVF target.toDVF + exact + LocalFieldTheory.DiscreteValuationField.ValuedExtension.ramificationIndex_pos + level target + +/-- At principal-unit depth `n + 1`, the changed primitive polynomial has +a root in the common compositum which is closer to the old primitive point +than the transported level-`n` Galois displacement bound. + +The root-product estimate first gives the stronger lower bound +`e * q^(n+1)` for the distance. Here `e` is the relative ramification +index of the original level in the compositum. -/ +theorem + exists_standardLubinTateChangedPrimitiveRootInCompositum_close + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + (hu : u ∈ + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1)) : + ∃ beta : + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuationSubring, + beta ∈ + (standardLubinTateChangedPrimitivePolynomialInCompositum + hπ u n).roots ∧ + ((standardLubinTateLevelToChangedLevelCompositumRamificationIndex + hπ u n * + Nat.card F.residueField ^ n : ℕ) : ℕ∞) < + IsDiscreteValuationRing.addVal + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuationSubring + (standardLubinTateOriginalPrimitivePointInChangedLevelCompositum + hπ u n - + beta) := by + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + let p := + standardLubinTateChangedPrimitivePolynomialInCompositum hπ u n + let alpha := + standardLubinTateOriginalPrimitivePointInChangedLevelCompositum + hπ u n + let q := Nat.card F.residueField + let d := (q - 1) * q ^ n + let derivativeExponent := + n * d + (q - 2) * q ^ n + let e := + standardLubinTateLevelToChangedLevelCompositumRamificationIndex + hπ u n + obtain ⟨beta, hbeta, hproximity⟩ := + Polynomial.Splits.exists_root_addVal_eval_le_sub_add_derivative + p + (standardLubinTateChangedPrimitivePolynomialInCompositum_splits + hπ u n) + (standardLubinTateChangedPrimitivePolynomialInCompositum_monic + hπ u n) + (standardLubinTateChangedPrimitivePolynomialInCompositum_natDegree_ne_zero + hπ u n) + alpha + refine ⟨beta, hbeta, ?_⟩ + have hevaluation : + ((e * (d * (n + 2)) : ℕ) : ℕ∞) ≤ + IsDiscreteValuationRing.addVal target.valuationSubring + (p.eval alpha) := by + simpa [target, p, alpha, q, d, e] using + standardLubinTateChangedPrimitivePolynomialInCompositum_eval_addVal_ge + hπ u n hu + have hderivative : + IsDiscreteValuationRing.addVal target.valuationSubring + (p.derivative.eval beta) = + ((e * derivativeExponent : ℕ) : ℕ∞) := by + rw [ + standardLubinTateChangedPrimitivePolynomialInCompositum_derivative_addVal + hπ u n hbeta, + ← + standardLubinTateLevelToChangedLevelCompositumRamificationIndex_eq + hπ u n] + simp [q, d, derivativeExponent, e, nsmul_eq_mul] + ring + have hcombined : + ((e * (d * (n + 2)) : ℕ) : ℕ∞) ≤ + IsDiscreteValuationRing.addVal target.valuationSubring + (alpha - beta) + + ((e * derivativeExponent : ℕ) : ℕ∞) := by + exact hevaluation.trans (hproximity.trans_eq (by rw [hderivative])) + have hsubtracted : + ((e * (d * (n + 2)) : ℕ) : ℕ∞) - + ((e * derivativeExponent : ℕ) : ℕ∞) ≤ + IsDiscreteValuationRing.addVal target.valuationSubring + (alpha - beta) := by + rw [tsub_le_iff_right] + exact hcombined + have hq : 2 ≤ q := + (Finite.one_lt_card : 1 < Nat.card F.residueField) + have hqPred : q = (q - 1) + 1 := by + omega + have hqPredPred : q - 1 = (q - 2) + 1 := by + omega + have hqPower : + q ^ (n + 1) = d + q ^ n := by + calc + q ^ (n + 1) = q ^ n * q := by + rw [pow_succ] + _ = q ^ n * ((q - 1) + 1) := + congrArg (fun z => q ^ n * z) hqPred + _ = d + q ^ n := by + dsimp [d] + ring + have hdSplit : + d = (q - 2) * q ^ n + q ^ n := by + calc + d = (q - 1) * q ^ n := rfl + _ = ((q - 2) + 1) * q ^ n := + congrArg (fun z => z * q ^ n) hqPredPred + _ = (q - 2) * q ^ n + q ^ n := by + ring + have hdepth : + d * (n + 2) = q ^ (n + 1) + derivativeExponent := by + calc + d * (n + 2) = + n * d + d + d := by + ring + _ = + (d + q ^ n) + + (n * d + (q - 2) * q ^ n) := by + rw [hdSplit] + ring + _ = q ^ (n + 1) + derivativeExponent := by + rw [hqPower] + have hdepthScaled : + e * (d * (n + 2)) = + e * q ^ (n + 1) + e * derivativeExponent := by + rw [hdepth] + ring + have hnatSub : + e * (d * (n + 2)) - e * derivativeExponent = + e * q ^ (n + 1) := by + rw [hdepthScaled, Nat.add_sub_cancel_right] + have hdeep : + ((e * q ^ (n + 1) : ℕ) : ℕ∞) ≤ + IsDiscreteValuationRing.addVal target.valuationSubring + (alpha - beta) := by + have h := hsubtracted + rw [← ENat.natCast_sub, hnatSub] at h + exact h + have hqpow : q ^ n < q ^ (n + 1) := + pow_lt_pow_right₀ + (Finite.one_lt_card : 1 < Nat.card F.residueField) + (Nat.lt_succ_self n) + have hepos : 0 < e := by + simpa [e] using + standardLubinTateLevelToChangedLevelCompositumRamificationIndex_pos + hπ u n + have hstrictNat : e * q ^ n < e * q ^ (n + 1) := + Nat.mul_lt_mul_of_pos_left hqpow hepos + have hstrict : + ((e * q ^ n : ℕ) : ℕ∞) < + ((e * q ^ (n + 1) : ℕ) : ℕ∞) := by + exact (ENat.natCast_lt_natCast).2 hstrictNat + exact hstrict.trans_le hdeep + +/-- A nontrivial displacement of the old primitive point by a Galois +automorphism of the common compositum is bounded by the old level-`n` +bound, scaled by the relative ramification index. -/ +private theorem + standardLubinTateOriginalPrimitivePointInChangedLevelCompositum_displacement_addVal_le + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + (σ : + Gal(standardLubinTateChangedLevelCompositumField hπ u n/K)) + (hne : + valuationSubringAutOfUniqueExtension + (standardLubinTateChangedLevelCompositumCompleteDVF_hasUniqueDVFValuationExtension + hπ u n) + σ + (standardLubinTateOriginalPrimitivePointInChangedLevelCompositum + hπ u n) ≠ + standardLubinTateOriginalPrimitivePointInChangedLevelCompositum + hπ u n) : + IsDiscreteValuationRing.addVal + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuationSubring + (valuationSubringAutOfUniqueExtension + (standardLubinTateChangedLevelCompositumCompleteDVF_hasUniqueDVFValuationExtension + hπ u n) + σ + (standardLubinTateOriginalPrimitivePointInChangedLevelCompositum + hπ u n) - + standardLubinTateOriginalPrimitivePointInChangedLevelCompositum + hπ u n) ≤ + ((standardLubinTateLevelToChangedLevelCompositumRamificationIndex + hπ u n * + Nat.card F.residueField ^ n : ℕ) : ℕ∞) := by + let L := standardLubinTateLevelField hπ n + let M := standardLubinTateChangedLevelCompositumField hπ u n + let level := standardLubinTateLevelCompleteDVF hπ n + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + let lambda := standardLubinTatePrimitivePointInteger hπ n + let alpha := + standardLubinTateOriginalPrimitivePointInChangedLevelCompositum + hπ u n + have hmiddle : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + F.toCompleteDVF.toDVF level.toDVF := + standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + hπ n + have htarget : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + F.toCompleteDVF.toDVF target.toDVF := + standardLubinTateChangedLevelCompositumCompleteDVF_hasUniqueDVFValuationExtension + hπ u n + let : Algebra L M := + standardLubinTateLevelToChangedLevelCompositumAlgebra hπ u n + let : IsScalarTower K L M := + IsScalarTower.of_algebraMap_eq' rfl + let : IsGalois K L := + standardLubinTateLevelField_isGalois (F := F) hπ n + let : level.valuation.HasExtension target.valuation := + standardLubinTateLevelToChangedLevelCompositum_hasExtension + hπ u n + let tau : Gal(L/K) := σ.restrictNormal L + have hrestrict := + valuationSubringAutOfUniqueExtension_integerMap_restrictNormal + (base := F.toCompleteDVF.toDVF) + (middle := level.toDVF) + (target := target.toDVF) + hmiddle htarget σ lambda + have hneLevel : + valuationSubringAutOfUniqueExtension hmiddle tau lambda ≠ + lambda := by + intro heq + apply hne + change + valuationSubringAutOfUniqueExtension htarget σ + (integerMap level.toDVF target.toDVF lambda) = + integerMap level.toDVF target.toDVF lambda + rw [hrestrict, heq] + have hlevel := + standardLubinTateGal_displacement_addVal_le_of_ne + F hπ n tau hneLevel + have hdisplacement : + valuationSubringAutOfUniqueExtension htarget σ alpha - alpha = + integerMap level.toDVF target.toDVF + (valuationSubringAutOfUniqueExtension hmiddle tau lambda - + lambda) := by + change + valuationSubringAutOfUniqueExtension htarget σ + (integerMap level.toDVF target.toDVF lambda) - + integerMap level.toDVF target.toDVF lambda = + integerMap level.toDVF target.toDVF + (valuationSubringAutOfUniqueExtension hmiddle tau lambda - + lambda) + rw [hrestrict, map_sub] + rw [hdisplacement] + change + IsDiscreteValuationRing.addVal target.valuationSubring + (standardLubinTateLevelToChangedLevelCompositumIntegerMap hπ u n + (valuationSubringAutOfUniqueExtension hmiddle tau lambda - + lambda)) ≤ + ((standardLubinTateLevelToChangedLevelCompositumRamificationIndex + hπ u n * + Nat.card F.residueField ^ n : ℕ) : ℕ∞) + rw [ + standardLubinTateLevelToChangedLevelCompositum_addVal + hπ u n + (valuationSubringAutOfUniqueExtension hmiddle tau lambda - lambda)] + have hscaled := + nsmul_le_nsmul_right hlevel + (standardLubinTateLevelToChangedLevelCompositumRamificationIndex + hπ u n) + simpa [nsmul_eq_mul] using hscaled + +/-- A changed primitive root in the compositum lies in the restricted copy +of the changed standard level. -/ +private theorem + standardLubinTateChangedPrimitiveRootInCompositum_mem_changedRestrict + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + {beta : + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuationSubring} + (hbeta : + beta ∈ + (standardLubinTateChangedPrimitivePolynomialInCompositum + hπ u n).roots) : + (beta : standardLubinTateChangedLevelCompositumField hπ u n) ∈ + IntermediateField.restrict + (le_sup_right : + standardLubinTateChangedLevelField hπ u n ≤ + standardLubinTateChangedLevelCompositumField hπ u n) := by + let hπ' := + standardLubinTateChangedUniformizer_isUniformizer hπ u + let level := standardLubinTateLevelCompleteDVF hπ' n + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + let p := + (standardLubinTatePrimitivePolynomial F + (standardLubinTateChangedUniformizer F π u) n).map + (standardLubinTateLevelCoefficientHom hπ' n) + let j := + standardLubinTateChangedLevelToCompositumIntegerMap hπ u n + have hj : Function.Injective j := by + intro a b hab + apply Subtype.ext + have hfield := + congrArg (fun z : target.valuationSubring => + (z : standardLubinTateChangedLevelCompositumField hπ u n)) hab + change + standardLubinTateChangedLevelToCompositum hπ u n + (a : standardLubinTateChangedLevelField hπ u n) = + standardLubinTateChangedLevelToCompositum hπ u n + (b : standardLubinTateChangedLevelField hπ u n) at hfield + exact + (standardLubinTateChangedLevelToCompositum + hπ u n).injective hfield + have hroots : + (p.map j).roots = p.roots.map j := + (standardLubinTatePrimitivePolynomial_map_levelCoefficientHom_splits + hπ' n).roots_map_of_injective hj + have hbeta' : beta ∈ (p.map j).roots := by + simpa [p, j, + standardLubinTateChangedPrimitivePolynomialInCompositum] using + hbeta + rw [hroots] at hbeta' + obtain ⟨y, -, hy⟩ := Multiset.mem_map.mp hbeta' + rw [IntermediateField.mem_restrict] + change + (((beta : + standardLubinTateChangedLevelCompositumField hπ u n) : + SeparableClosure K)) ∈ + standardLubinTateChangedLevelField hπ u n + rw [← hy, + standardLubinTateChangedLevelToCompositumIntegerMap_apply_coe, + standardLubinTateChangedLevelToCompositum_coe] + exact (y : standardLubinTateChangedLevelField hπ u n).property + +/-- A compositum automorphism fixing a sufficiently close changed root also +fixes the old primitive point. -/ +private theorem + standardLubinTateOriginalPrimitivePointInChangedLevelCompositum_fixed_of_fixed_close + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + {beta : + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuationSubring} + (hclose : + ((standardLubinTateLevelToChangedLevelCompositumRamificationIndex + hπ u n * + Nat.card F.residueField ^ n : ℕ) : ℕ∞) < + IsDiscreteValuationRing.addVal + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuationSubring + (standardLubinTateOriginalPrimitivePointInChangedLevelCompositum + hπ u n - + beta)) + (σ : + Gal(standardLubinTateChangedLevelCompositumField hπ u n/K)) + (hfix : + σ (beta : + standardLubinTateChangedLevelCompositumField hπ u n) = + (beta : + standardLubinTateChangedLevelCompositumField hπ u n)) : + σ + (standardLubinTateOriginalPrimitivePointInChangedLevelCompositum + hπ u n : + standardLubinTateChangedLevelCompositumField hπ u n) = + (standardLubinTateOriginalPrimitivePointInChangedLevelCompositum + hπ u n : + standardLubinTateChangedLevelCompositumField hπ u n) := by + let target := + standardLubinTateChangedLevelCompositumCompleteDVF hπ u n + have htarget : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + F.toCompleteDVF.toDVF target.toDVF := + standardLubinTateChangedLevelCompositumCompleteDVF_hasUniqueDVFValuationExtension + hπ u n + let alpha := + standardLubinTateOriginalPrimitivePointInChangedLevelCompositum + hπ u n + have hfixInteger : + valuationSubringAutOfUniqueExtension htarget σ beta = beta := by + apply Subtype.ext + simpa only [ + valuationSubringAutOfUniqueExtension_apply_coe] using hfix + have hfixedInteger : + valuationSubringAutOfUniqueExtension htarget σ alpha = alpha := by + apply + valuationSubringAutOfUniqueExtension_eq_of_fixed_of_close + htarget σ alpha beta hfixInteger + intro hne + exact + (standardLubinTateOriginalPrimitivePointInChangedLevelCompositum_displacement_addVal_le + hπ u n σ hne).trans_lt hclose + have hfixedField := congrArg Subtype.val hfixedInteger + simpa only [ + valuationSubringAutOfUniqueExtension_apply_coe] using hfixedField + +/-- Inside the common compositum, the restricted copies of the original and +changed standard levels coincide at principal-unit depth `n + 1`. -/ +private theorem + standardLubinTateHigherUnit_restrict_changedLevel_eq_originalLevel + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + (hu : u ∈ + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1)) : + IntermediateField.restrict + (le_sup_right : + standardLubinTateChangedLevelField hπ u n ≤ + standardLubinTateChangedLevelCompositumField hπ u n) = + IntermediateField.restrict + (le_sup_left : + standardLubinTateLevelField hπ n ≤ + standardLubinTateChangedLevelCompositumField hπ u n) := by + let hπ' := + standardLubinTateChangedUniformizer_isUniformizer hπ u + let L := standardLubinTateLevelField hπ n + let L' := standardLubinTateChangedLevelField hπ u n + let M := standardLubinTateChangedLevelCompositumField hπ u n + let oldLevel : IntermediateField K M := + IntermediateField.restrict (le_sup_left : L ≤ M) + let changedLevel : IntermediateField K M := + IntermediateField.restrict (le_sup_right : L' ≤ M) + let alpha := + standardLubinTateOriginalPrimitivePointInChangedLevelCompositum + hπ u n + let : FiniteDimensional K M := + standardLubinTateChangedLevelCompositumField_finiteDimensional + hπ u n + let : IsGalois K M := + standardLubinTateChangedLevelCompositumField_isGalois hπ u n + obtain ⟨beta, hbeta, hclose⟩ := + exists_standardLubinTateChangedPrimitiveRootInCompositum_close + hπ u n hu + have hstabilizer : + ∀ σ : Gal(M/K), + σ (beta : M) = (beta : M) → + σ (alpha : M) = (alpha : M) := by + intro σ hfix + exact + standardLubinTateOriginalPrimitivePointInChangedLevelCompositum_fixed_of_fixed_close + hπ u n hclose σ hfix + have hadjoin : + K⟮(alpha : M)⟯ ≤ K⟮(beta : M)⟯ := + adjoin_le_adjoin_of_forall_fixed_imp_fixed + (alpha : M) (beta : M) hstabilizer + have hbetaChanged : (beta : M) ∈ changedLevel := by + exact + standardLubinTateChangedPrimitiveRootInCompositum_mem_changedRestrict + hπ u n hbeta + have hbetaAdjoinLe : K⟮(beta : M)⟯ ≤ changedLevel := by + rw [IntermediateField.adjoin_le_iff] + intro x hx + rw [Set.mem_singleton_iff] at hx + subst x + exact hbetaChanged + have halphaChanged : (alpha : M) ∈ changedLevel := by + exact + hbetaAdjoinLe + (hadjoin + (IntermediateField.mem_adjoin_simple_self K (alpha : M))) + let oldEquiv : L ≃ₐ[K] oldLevel := + IntermediateField.restrictAlgEquiv (le_sup_left : L ≤ M) + let changedEquiv : L' ≃ₐ[K] changedLevel := + IntermediateField.restrictAlgEquiv (le_sup_right : L' ≤ M) + let oldPowerBasis : PowerBasis K oldLevel := + (standardLubinTateLevelPowerBasis hπ n).map oldEquiv + let oldInclusion : oldLevel →ₐ[K] M := oldLevel.val + have hgen : + oldInclusion oldPowerBasis.gen = (alpha : M) := by + simp only [oldPowerBasis, PowerBasis.map_gen] + change + standardLubinTateLevelToChangedLevelCompositum hπ u n + (standardLubinTateLevelGenerator hπ n) = + ((standardLubinTateLevelToChangedLevelCompositumIntegerMap + hπ u n + (standardLubinTatePrimitivePointInteger hπ n) : + (standardLubinTateChangedLevelCompositumCompleteDVF + hπ u n).valuationSubring) : + M) + rw [ + standardLubinTateLevelToChangedLevelCompositumIntegerMap_apply_coe] + rfl + have hgenComap : + oldPowerBasis.gen ∈ + changedLevel.toSubalgebra.comap oldInclusion := by + change oldInclusion oldPowerBasis.gen ∈ changedLevel + rw [hgen] + exact halphaChanged + have hadjoinLe : + Algebra.adjoin K ({oldPowerBasis.gen} : Set oldLevel) ≤ + changedLevel.toSubalgebra.comap oldInclusion := by + apply Algebra.adjoin_le + intro x hx + rw [Set.mem_singleton_iff] at hx + subst x + exact hgenComap + have holdLeChanged : oldLevel ≤ changedLevel := by + intro x hx + let xOld : oldLevel := ⟨x, hx⟩ + have hxAdjoin : + xOld ∈ Algebra.adjoin K + ({oldPowerBasis.gen} : Set oldLevel) := by + rw [oldPowerBasis.adjoin_gen_eq_top] + trivial + have hxComap := hadjoinLe hxAdjoin + change oldInclusion xOld ∈ changedLevel at hxComap + simpa [oldInclusion, xOld] using hxComap + let q := Nat.card F.residueField + let d := (q - 1) * q ^ n + have hfinrankOld : + Module.finrank K oldLevel = d := by + calc + Module.finrank K oldLevel = + Module.finrank K L := + oldEquiv.toLinearEquiv.finrank_eq.symm + _ = d := by + simpa [L, q, d] using + standardLubinTateLevelField_finrank hπ n + have hfinrankChanged : + Module.finrank K changedLevel = d := by + calc + Module.finrank K changedLevel = + Module.finrank K L' := + changedEquiv.toLinearEquiv.finrank_eq.symm + _ = d := by + simpa [L', hπ', q, d] using + standardLubinTateLevelField_finrank hπ' n + have heq : oldLevel = changedLevel := + IntermediateField.eq_of_le_of_finrank_eq + holdLeChanged (hfinrankOld.trans hfinrankChanged.symm) + exact heq.symm + +/-- The changed standard level is `K`-isomorphic to the original standard +level when the unit factor is congruent to one at depth `n + 1`. -/ +noncomputable def standardLubinTateHigherUnitChangedLevelAlgEquiv + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + (hu : u ∈ + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1)) : + standardLubinTateChangedLevelField hπ u n ≃ₐ[K] + standardLubinTateLevelField hπ n := by + let L := standardLubinTateLevelField hπ n + let L' := standardLubinTateChangedLevelField hπ u n + let M := standardLubinTateChangedLevelCompositumField hπ u n + let oldLevel : IntermediateField K M := + IntermediateField.restrict (le_sup_left : L ≤ M) + let changedLevel : IntermediateField K M := + IntermediateField.restrict (le_sup_right : L' ≤ M) + let oldEquiv : L ≃ₐ[K] oldLevel := + IntermediateField.restrictAlgEquiv (le_sup_left : L ≤ M) + let changedEquiv : L' ≃ₐ[K] changedLevel := + IntermediateField.restrictAlgEquiv (le_sup_right : L' ≤ M) + exact changedEquiv.trans + ((IntermediateField.equivOfEq (by + exact standardLubinTateHigherUnit_restrict_changedLevel_eq_originalLevel + hπ u n hu)).trans oldEquiv.symm) + +/-- A unit factor congruent to one at depth `n + 1` is a norm from the +original standard level. -/ +theorem + standardLubinTateUnitFactorFieldUnit_mem_standardNormSubgroup_of_mem_higher + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (u : F.valuationSubringˣ) (n : ℕ) + (hu : u ∈ + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1)) : + standardLubinTateUnitFactorFieldUnit F u ∈ + standardLubinTateNormSubgroup hπ n := + standardLubinTateUnitFactorFieldUnit_mem_standardNormSubgroup_of_algEquiv + hπ u n + (standardLubinTateHigherUnitChangedLevelAlgEquiv + hπ u n hu) + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean new file mode 100644 index 0000000000..a9c470a2c6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean @@ -0,0 +1,162 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms +public import Mathlib.FieldTheory.Galois.Abelian +/-! +# Abelian standard Lubin--Tate level fields + +The finite unit parameter group + +`O_F^* / U_F^(n + 1)` + +acts multiplicatively and faithfully on the primitive level-`n + 1` +division point. The finite-level automorphism calculation identifies this +parameter group bijectively with the full Galois group. We package that +identification as a multiplicative equivalence and transport commutativity +to the Galois group. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The multiplicative map from finite unit parameters to automorphisms of +the standard Lubin--Tate level field. -/ +noncomputable def standardLubinTateUnitParameterToGalHom + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + standardLubinTateUnitParameter F n →* + Gal((standardLubinTateLevelField hπ n)/K) where + toFun := standardLubinTateUnitParameterToGal F hπ n + map_one' := standardLubinTateUnitParameterToGal_one F hπ n + map_mul' := standardLubinTateUnitParameterToGal_mul F hπ n + +/-- The homomorphism has the original parameter-to-Galois map as its +underlying function. -/ +@[simp] +theorem standardLubinTateUnitParameterToGalHom_apply + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : standardLubinTateUnitParameter F n) : + standardLubinTateUnitParameterToGalHom F hπ n a = + standardLubinTateUnitParameterToGal F hπ n a := + rfl + +/-- Finite unit parameters are multiplicatively equivalent to the full +Galois group of the standard level field. -/ +noncomputable def standardLubinTateUnitParameterEquivGal + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + standardLubinTateUnitParameter F n ≃* + Gal((standardLubinTateLevelField hπ n)/K) := + MulEquiv.ofBijective + (standardLubinTateUnitParameterToGalHom F hπ n) + (by + change Function.Bijective + (standardLubinTateUnitParameterToGal F hπ n) + exact standardLubinTateUnitParameterToGal_bijective F hπ n) + +/-- The multiplicative equivalence evaluates as the original explicit +parameter automorphism. -/ +@[simp] +theorem standardLubinTateUnitParameterEquivGal_apply + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : standardLubinTateUnitParameter F n) : + standardLubinTateUnitParameterEquivGal F hπ n a = + standardLubinTateUnitParameterToGal F hπ n a := + rfl + +/-- The inverse of the explicit unit-parameter automorphism acts on the +chosen primitive generator through the inverse Lubin--Tate unit action. + +This is the pointwise `[u⁻¹]` target needed for the later comparison with +the actual local Artin map; it does not identify the two maps merely from +their kernels. -/ +theorem standardLubinTateUnitParameterEquivGal_inv_class_apply_gen + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (u : F.valuationSubringˣ) : + (standardLubinTateUnitParameterEquivGal F hπ n + (standardLubinTateUnitParameterClass F n u))⁻¹ + (standardLubinTateLevelPowerBasis hπ n).gen = + standardLubinTatePrimitiveLevelAction hπ n u⁻¹ := by + have hgal : + (standardLubinTateUnitParameterEquivGal F hπ n + (standardLubinTateUnitParameterClass F n u))⁻¹ = + standardLubinTateUnitParameterEquivGal F hπ n + (standardLubinTateUnitParameterClass F n u)⁻¹ := + ((standardLubinTateUnitParameterEquivGal F hπ n).map_inv _).symm + rw [hgal] + have hclass : + (standardLubinTateUnitParameterClass F n u)⁻¹ = + standardLubinTateUnitParameterClass F n u⁻¹ := + ((standardLubinTateUnitParameterClass F n).map_inv u).symm + rw [hclass, standardLubinTateUnitParameterEquivGal_apply] + change + standardLubinTateUnitParameterAlgEquiv F hπ n + (standardLubinTateUnitParameterClass F n u⁻¹) + (standardLubinTateLevelPowerBasis hπ n).gen = + standardLubinTatePrimitiveLevelAction hπ n u⁻¹ + rw [standardLubinTateUnitParameterAlgEquiv_apply_gen] + apply Subtype.ext + rw [standardLubinTateUnitParameterLevelRoot_coe, + standardLubinTatePrimitiveLevelAction_coe, + standardLubinTateUnitParameterRoot_class] + +/-- The full Galois group of a standard finite Lubin--Tate level is +commutative. -/ +theorem standardLubinTateLevelField_gal_comm + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) + (σ τ : Gal((standardLubinTateLevelField hπ n)/K)) : + σ * τ = τ * σ := by + let e := standardLubinTateUnitParameterEquivGal F hπ n + apply e.symm.injective + calc + e.symm (σ * τ) = e.symm σ * e.symm τ := e.symm.map_mul σ τ + _ = e.symm τ * e.symm σ := mul_comm _ _ + _ = e.symm (τ * σ) := (e.symm.map_mul τ σ).symm + +/-- The Galois group of the standard level field is a commutative group. -/ +instance standardLubinTateLevelField_isMulCommutative + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + IsMulCommutative + (Gal((standardLubinTateLevelField hπ n)/K)) := + ⟨⟨standardLubinTateLevelField_gal_comm F hπ n⟩⟩ + +/-- Every standard finite Lubin--Tate level is abelian Galois over its base +local field. -/ +instance standardLubinTateLevelField_isAbelianGalois + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + IsAbelianGalois K (standardLubinTateLevelField hπ n) where + toIsGalois := + standardLubinTateLevelField_isGalois (F := F) hπ n + toIsMulCommutative := + standardLubinTateLevelField_isMulCommutative F hπ n + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAutomorphisms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAutomorphisms.lean new file mode 100644 index 0000000000..af3ffed149 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAutomorphisms.lean @@ -0,0 +1,670 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameters +public import Mathlib.FieldTheory.Galois.Basic +public import Mathlib.SetTheory.Cardinal.Finite +/-! +# Automorphisms of standard Lubin--Tate level fields + +The finite unit parameters at primitive level `n + 1` act on the chosen +primitive division point. Once the resulting roots are regarded as elements +of the simple level field, the canonical power basis lifts them to algebra +automorphisms. Faithfulness of the finite action and the parameter-cardinality +formula then show that the automorphism group has cardinality equal to the +field degree, hence that every standard level is Galois. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial PowerSeries + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +open ValuationTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +private noncomputable local instance (priority := 50) + standardLubinTateLevelAutomorphismCoefficientUniformSpace + (F : LocalField.{u, v} K) : + UniformSpace F.valuationSubring := + ⊥ + +private noncomputable local instance + standardLubinTateLevelAutomorphismTargetWithIdeal + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + WithIdeal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring where + i := (standardLubinTateLevelCompleteDVF hπ n).maximalIdeal + +private noncomputable local instance + standardLubinTateLevelAutomorphismTargetCompleteSpace + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + CompleteSpace + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := by + let target := standardLubinTateLevelCompleteDVF hπ n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).1 + +private noncomputable local instance + standardLubinTateLevelAutomorphismTargetT2Space + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + T2Space + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := by + let target := standardLubinTateLevelCompleteDVF hπ n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).2 + +/-- A finite parameter root, regarded as an element of its standard level +field through the analytically constructed integral action. -/ +noncomputable def standardLubinTateUnitParameterLevelRoot + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : standardLubinTateUnitParameter F n) : + standardLubinTateLevelField hπ n := + standardLubinTatePrimitiveLevelAction hπ n + (standardLubinTateUnitParameterChosenRepresentative F n a) + +/-- The level-field realization of a parameter root agrees with its ambient +separable-closure realization. -/ +@[simp] +theorem standardLubinTateUnitParameterLevelRoot_coe + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : standardLubinTateUnitParameter F n) : + (standardLubinTateUnitParameterLevelRoot F hπ n a : + SeparableClosure K) = + standardLubinTateUnitParameterRoot F hπ n a := by + simp [standardLubinTateUnitParameterLevelRoot, + standardLubinTateUnitParameterRoot] + +/-- Distinct finite unit parameters give distinct roots inside the standard +level field. -/ +theorem standardLubinTateUnitParameterLevelRoot_injective + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + Function.Injective + (standardLubinTateUnitParameterLevelRoot F hπ n) := by + intro a b hab + let u := + standardLubinTateUnitParameterChosenRepresentative F n a + let w := + standardLubinTateUnitParameterChosenRepresentative F n b + have hroot : + standardLubinTatePrimitiveRootAction hπ n u = + standardLubinTatePrimitiveRootAction hπ n w := by + have hcoe := congrArg + (fun z : standardLubinTateLevelField hπ n => + (z : SeparableClosure K)) hab + simpa [standardLubinTateUnitParameterLevelRoot, + standardLubinTatePrimitiveLevelAction_coe] using hcoe + have hdiv : + u / w ∈ + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1) := + (standardLubinTatePrimitiveRootAction_eq_iff_div_mem_higherPrincipalUnitGroup + hπ n u w).mp hroot + calc + a = standardLubinTateUnitParameterClass F n u := by + simp [u] + _ = standardLubinTateUnitParameterClass F n w := + (standardLubinTateUnitParameterClass_eq_iff_div_mem + F n u w).2 hdiv + _ = b := by + simp [w] + +/-- The identity parameter gives the chosen power-basis generator. -/ +@[simp] +theorem standardLubinTateUnitParameterLevelRoot_one + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + standardLubinTateUnitParameterLevelRoot F hπ n 1 = + (standardLubinTateLevelPowerBasis hπ n).gen := by + apply Subtype.ext + rw [standardLubinTateUnitParameterLevelRoot_coe] + have hroot : + standardLubinTateUnitParameterRoot F hπ n 1 = + standardLubinTatePrimitiveRootAction hπ n + (1 : F.valuationSubringˣ) := by + simpa only [map_one] using + standardLubinTateUnitParameterRoot_class F hπ n + (1 : F.valuationSubringˣ) + rw [hroot, standardLubinTatePrimitiveRootAction_one] + simpa only [standardLubinTateLevelGenerator] using + (standardLubinTateLevelGenerator_coe hπ n).symm + +/-- A parameter root annihilates the minimal polynomial of the canonical +level-field generator. -/ +theorem standardLubinTateUnitParameterLevelRoot_aeval_minpoly + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : standardLubinTateUnitParameter F n) : + Polynomial.aeval (standardLubinTateUnitParameterLevelRoot F hπ n a) + (minpoly K (standardLubinTateLevelPowerBasis hπ n).gen) = 0 := by + rw [standardLubinTateLevelPowerBasis_minpoly] + let ι : standardLubinTateLevelField hπ n →ₐ[K] SeparableClosure K := + (standardLubinTateLevelField hπ n).val + apply ι.injective + change ι (Polynomial.aeval + (standardLubinTateUnitParameterLevelRoot F hπ n a) + (standardLubinTatePrimitivePolynomialOverField F π n)) = ι 0 + rw [← Polynomial.aeval_algHom_apply (f := ι), map_zero] + change Polynomial.eval₂ + (algebraMap K (SeparableClosure K)) + (standardLubinTateUnitParameterRoot F hπ n a) + (standardLubinTatePrimitivePolynomialOverField F π n) = 0 + simpa [Polynomial.IsRoot, Polynomial.eval_map] using + standardLubinTateUnitParameterRoot_isRoot F hπ n a + +/-- The algebra endomorphism sending the chosen primitive generator to the +root attached to a finite unit parameter. -/ +noncomputable def standardLubinTateUnitParameterAlgHom + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : standardLubinTateUnitParameter F n) : + standardLubinTateLevelField hπ n →ₐ[K] + standardLubinTateLevelField hπ n := + (standardLubinTateLevelPowerBasis hπ n).lift + (standardLubinTateUnitParameterLevelRoot F hπ n a) + (standardLubinTateUnitParameterLevelRoot_aeval_minpoly F hπ n a) + +/-- The parameter endomorphism sends the power-basis generator to the +corresponding parameter root. -/ +@[simp] +theorem standardLubinTateUnitParameterAlgHom_apply_gen + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : standardLubinTateUnitParameter F n) : + standardLubinTateUnitParameterAlgHom F hπ n a + (standardLubinTateLevelPowerBasis hπ n).gen = + standardLubinTateUnitParameterLevelRoot F hπ n a := + (standardLubinTateLevelPowerBasis hπ n).lift_gen _ _ + +/-- The finite-dimensional parameter endomorphism is an automorphism. -/ +noncomputable def standardLubinTateUnitParameterAlgEquiv + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : standardLubinTateUnitParameter F n) : + standardLubinTateLevelField hπ n ≃ₐ[K] + standardLubinTateLevelField hπ n := by + letI : FiniteDimensional K (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_finiteDimensional hπ n + exact AlgEquiv.ofBijective + (standardLubinTateUnitParameterAlgHom F hπ n a) + (AlgHom.bijective + (standardLubinTateUnitParameterAlgHom F hπ n a)) + +/-- The parameter automorphism sends the power-basis generator to the +corresponding parameter root. -/ +@[simp] +theorem standardLubinTateUnitParameterAlgEquiv_apply_gen + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : standardLubinTateUnitParameter F n) : + standardLubinTateUnitParameterAlgEquiv F hπ n a + (standardLubinTateLevelPowerBasis hπ n).gen = + standardLubinTateUnitParameterLevelRoot F hπ n a := by + rw [standardLubinTateUnitParameterAlgEquiv, + AlgEquiv.ofBijective_apply, + standardLubinTateUnitParameterAlgHom_apply_gen] + +private theorem + standardLubinTateLevelAlgEquiv_mem_valuationSubring_iff + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) + (σ : Gal((standardLubinTateLevelField hπ n)/K)) + (x : standardLubinTateLevelField hπ n) : + x ∈ (standardLubinTateLevelCompleteDVF hπ n).valuation.valuationSubring ↔ + σ x ∈ + (standardLubinTateLevelCompleteDVF hπ n).valuation.valuationSubring := by + let target := standardLubinTateLevelCompleteDVF hπ n + let : IsScalarTower F.valuationSubring target.valuationSubring + (standardLubinTateLevelField hπ n) := + IsScalarTower.of_algebraMap_eq' rfl + let : IsIntegralClosure target.valuationSubring F.valuationSubring + (standardLubinTateLevelField hπ n) := + standardLubinTateLevelCompleteDVF_isIntegralClosure hπ n + have hforward + (τ : Gal((standardLubinTateLevelField hπ n)/K)) + {y : standardLubinTateLevelField hπ n} + (hy : y ∈ target.valuation.valuationSubring) : + τ y ∈ target.valuation.valuationSubring := by + have hyIntegral : IsIntegral F.valuationSubring y := + (IsIntegralClosure.isIntegral_iff + (A := target.valuationSubring) + (R := F.valuationSubring) + (B := standardLubinTateLevelField hπ n)).2 + ⟨⟨y, hy⟩, rfl⟩ + have hτIntegral : IsIntegral F.valuationSubring (τ y) := + IsIntegral.map τ.toAlgHom hyIntegral + rcases + (IsIntegralClosure.isIntegral_iff + (A := target.valuationSubring) + (R := F.valuationSubring) + (B := standardLubinTateLevelField hπ n)).1 hτIntegral + with ⟨z, hz⟩ + exact hz ▸ z.property + constructor + · exact hforward σ + · intro hσx + have hback := hforward σ.symm hσx + simpa using hback + +private noncomputable def + standardLubinTateLevelAutomorphismIntegerRingEquiv + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) + (σ : Gal((standardLubinTateLevelField hπ n)/K)) : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring ≃+* + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := + higherPrincipalUnitGroup.valuationSubringRingEquivOfPreserves + (standardLubinTateLevelCompleteDVF hπ n) + σ.toRingEquiv + (standardLubinTateLevelAlgEquiv_mem_valuationSubring_iff + hπ n σ) + +@[simp] +private theorem + standardLubinTateLevelAutomorphismIntegerRingEquiv_apply + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) + (σ : Gal((standardLubinTateLevelField hπ n)/K)) + (x : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) : + ((standardLubinTateLevelAutomorphismIntegerRingEquiv hπ n σ x : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) : + standardLubinTateLevelField hπ n) = + σ (x : standardLubinTateLevelField hπ n) := + rfl + +private theorem + standardLubinTateLevelAutomorphismIntegerRingEquiv_continuous + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) + (σ : Gal((standardLubinTateLevelField hπ n)/K)) : + Continuous + (standardLubinTateLevelAutomorphismIntegerRingEquiv hπ n σ) := by + let target := standardLubinTateLevelCompleteDVF hπ n + let r := + standardLubinTateLevelAutomorphismIntegerRingEquiv hπ n σ + apply continuous_of_continuousAt_zero r + rw [ContinuousAt, map_zero] + have hadic : IsAdic target.maximalIdeal := rfl + apply (hadic.hasBasis_nhds_zero.tendsto_right_iff).2 + intro m _ + apply (hadic.hasBasis_nhds_zero.mem_iff).2 + refine ⟨m, trivial, ?_⟩ + intro x hx + exact + (higherPrincipalUnitGroup.valuationSubringRingEquivOfPreserves_mem_maximalIdeal_pow_iff + target σ.toRingEquiv + (standardLubinTateLevelAlgEquiv_mem_valuationSubring_iff + hπ n σ) + m x).2 hx + +private theorem + standardLubinTateLevelAutomorphismIntegerRingEquiv_comp_coefficientHom + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) + (σ : Gal((standardLubinTateLevelField hπ n)/K)) : + (standardLubinTateLevelAutomorphismIntegerRingEquiv hπ n σ : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring →+* + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring).comp + (standardLubinTateLevelCoefficientHom hπ n) = + standardLubinTateLevelCoefficientHom hπ n := by + ext a : 1 + apply Subtype.ext + simp only [RingHom.comp_apply, + standardLubinTateLevelCoefficientHom_apply] + exact σ.commutes (a : K) + +private theorem + standardLubinTateLevelAutomorphismIntegerRingEquiv_primitivePoint_hasEval + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) + (σ : Gal((standardLubinTateLevelField hπ n)/K)) : + PowerSeries.HasEval + (standardLubinTateLevelAutomorphismIntegerRingEquiv hπ n σ + (standardLubinTatePrimitivePointInteger hπ n)) := by + let r := + standardLubinTateLevelAutomorphismIntegerRingEquiv hπ n σ + let lambda := standardLubinTatePrimitivePointInteger hπ n + have hlambda : + Filter.Tendsto (fun m : ℕ => lambda ^ m) Filter.atTop + (nhds (0 : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring)) := + standardLubinTatePrimitivePointInteger_hasEval hπ n + have hr : + Filter.Tendsto (fun m : ℕ => r (lambda ^ m)) Filter.atTop + (nhds (r 0)) := + Filter.Tendsto.comp + (standardLubinTateLevelAutomorphismIntegerRingEquiv_continuous + hπ n σ).continuousAt + hlambda + change Filter.Tendsto + (fun m : ℕ => (r lambda) ^ m) Filter.atTop (nhds 0) + simpa only [map_pow, map_zero] using hr + +private theorem + standardLubinTateLevelAutomorphismIntegerRingEquiv_endomorphismValue + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) + (σ : Gal((standardLubinTateLevelField hπ n)/K)) + (a : F.valuationSubring) : + standardLubinTateLevelAutomorphismIntegerRingEquiv hπ n σ + (standardLubinTateEndomorphismValue hπ n a) = + standardLubinTateEndomorphismEvalAt hπ n + (standardLubinTateLevelAutomorphismIntegerRingEquiv hπ n σ + (standardLubinTatePrimitivePointInteger hπ n)) + (standardLubinTateLevelAutomorphismIntegerRingEquiv_primitivePoint_hasEval + hπ n σ) + a := by + let r := + standardLubinTateLevelAutomorphismIntegerRingEquiv hπ n σ + have hcomp := + PowerSeries.comp_eval₂ + (φ := standardLubinTateLevelCoefficientHom hπ n) + continuous_of_discreteTopology + (standardLubinTatePrimitivePointInteger_hasEval hπ n) + (ε := (r : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring →+* + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring)) + (standardLubinTateLevelAutomorphismIntegerRingEquiv_continuous + hπ n σ) + have happ := congrArg + (fun f => + f (SameUniformizer.standardLubinTateEndomorphism hπ a)) + hcomp + rw [ + standardLubinTateLevelAutomorphismIntegerRingEquiv_comp_coefficientHom + hπ n σ] at happ + simpa [standardLubinTateEndomorphismValue, + standardLubinTateEndomorphismEvalAt, + standardLubinTateLevelPowerSeriesEval, + PowerSeries.coe_eval₂Hom, Function.comp_apply, r] using happ + +/-- A parameter automorphism transports every parameter root according to +multiplication of finite unit parameters. -/ +theorem standardLubinTateUnitParameterAlgEquiv_apply_levelRoot + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a b : standardLubinTateUnitParameter F n) : + standardLubinTateUnitParameterAlgEquiv F hπ n a + (standardLubinTateUnitParameterLevelRoot F hπ n b) = + standardLubinTateUnitParameterLevelRoot F hπ n (a * b) := by + let u := + standardLubinTateUnitParameterChosenRepresentative F n a + let w := + standardLubinTateUnitParameterChosenRepresentative F n b + let z := + standardLubinTateUnitParameterChosenRepresentative F n (a * b) + let σ := standardLubinTateUnitParameterAlgEquiv F hπ n a + let r := + standardLubinTateLevelAutomorphismIntegerRingEquiv hπ n σ + have hrgen : + r (standardLubinTatePrimitivePointInteger hπ n) = + standardLubinTatePrimitivePointIntegerAction hπ n u := by + apply Subtype.ext + rw [standardLubinTateLevelAutomorphismIntegerRingEquiv_apply, + standardLubinTatePrimitivePointInteger_coe] + simp [σ, u, standardLubinTateLevelGenerator, + standardLubinTateUnitParameterLevelRoot, + standardLubinTatePrimitiveLevelAction] + have hrw : + r (standardLubinTatePrimitivePointIntegerAction hπ n w) = + standardLubinTatePrimitivePointIntegerAction hπ n (w * u) := by + calc + r (standardLubinTatePrimitivePointIntegerAction hπ n w) = + standardLubinTateEndomorphismEvalAt hπ n + (r (standardLubinTatePrimitivePointInteger hπ n)) + (standardLubinTateLevelAutomorphismIntegerRingEquiv_primitivePoint_hasEval + hπ n σ) + (w : F.valuationSubring) := by + simpa [standardLubinTatePrimitivePointIntegerAction] using + standardLubinTateLevelAutomorphismIntegerRingEquiv_endomorphismValue + hπ n σ (w : F.valuationSubring) + _ = + standardLubinTateEndomorphismEvalAt hπ n + (standardLubinTatePrimitivePointIntegerAction hπ n u) + (standardLubinTatePrimitivePointIntegerAction_hasEval hπ n u) + (w : F.valuationSubring) := by + simp only [hrgen] + _ = standardLubinTatePrimitivePointIntegerAction hπ n (w * u) := + (standardLubinTatePrimitivePointIntegerAction_mul + hπ n w u).symm + have hclass : + standardLubinTateUnitParameterClass F n (w * u) = + standardLubinTateUnitParameterClass F n z := by + calc + standardLubinTateUnitParameterClass F n (w * u) = + b * a := by + rw [map_mul] + simp [u, w] + _ = a * b := mul_comm b a + _ = standardLubinTateUnitParameterClass F n z := by + simp [z] + have hdiv : + w * u / z ∈ + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1) := + (standardLubinTateUnitParameterClass_eq_iff_div_mem + F n (w * u) z).mp hclass + have hwuz : + standardLubinTatePrimitivePointIntegerAction hπ n (w * u) = + standardLubinTatePrimitivePointIntegerAction hπ n z := + (standardLubinTatePrimitivePointIntegerAction_eq_iff_div_mem_higherPrincipalUnitGroup + hπ n (w * u) z).2 hdiv + change + σ + ((standardLubinTatePrimitivePointIntegerAction hπ n w : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) : + standardLubinTateLevelField hπ n) = + ((standardLubinTatePrimitivePointIntegerAction hπ n z : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) : + standardLubinTateLevelField hπ n) + calc + σ + ((standardLubinTatePrimitivePointIntegerAction hπ n w : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) : + standardLubinTateLevelField hπ n) = + (r (standardLubinTatePrimitivePointIntegerAction hπ n w) : + standardLubinTateLevelField hπ n) := by + rw [ + standardLubinTateLevelAutomorphismIntegerRingEquiv_apply] + _ = + (standardLubinTatePrimitivePointIntegerAction hπ n (w * u) : + standardLubinTateLevelField hπ n) := + congrArg Subtype.val hrw + _ = + (standardLubinTatePrimitivePointIntegerAction hπ n z : + standardLubinTateLevelField hπ n) := + congrArg Subtype.val hwuz + +/-- The identity parameter gives the identity level-field automorphism. -/ +theorem standardLubinTateUnitParameterAlgEquiv_one + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + standardLubinTateUnitParameterAlgEquiv F hπ n 1 = 1 := by + apply MulSemiringAction.toAlgHom_injective K + (standardLubinTateLevelField hπ n) + apply (standardLubinTateLevelPowerBasis hπ n).algHom_ext + simp only [MulSemiringAction.toAlgHom_apply, one_smul, + AlgEquiv.smul_def] + rw [standardLubinTateUnitParameterAlgEquiv_apply_gen, + standardLubinTateUnitParameterLevelRoot_one] + +/-- Multiplication of finite parameters is composition of the associated +level-field automorphisms. -/ +theorem standardLubinTateUnitParameterAlgEquiv_mul + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a b : standardLubinTateUnitParameter F n) : + standardLubinTateUnitParameterAlgEquiv F hπ n (a * b) = + standardLubinTateUnitParameterAlgEquiv F hπ n a * + standardLubinTateUnitParameterAlgEquiv F hπ n b := by + apply MulSemiringAction.toAlgHom_injective K + (standardLubinTateLevelField hπ n) + apply (standardLubinTateLevelPowerBasis hπ n).algHom_ext + simp only [MulSemiringAction.toAlgHom_apply, mul_smul, + AlgEquiv.smul_def] + rw [standardLubinTateUnitParameterAlgEquiv_apply_gen, + standardLubinTateUnitParameterAlgEquiv_apply_gen, + standardLubinTateUnitParameterAlgEquiv_apply_levelRoot] + +/-- The explicit map from finite unit parameters to the finite-level Galois +group. -/ +noncomputable def standardLubinTateUnitParameterToGal + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + standardLubinTateUnitParameter F n → + Gal((standardLubinTateLevelField hπ n)/K) := + standardLubinTateUnitParameterAlgEquiv F hπ n + +/-- Faithfulness of the primitive action makes the parameter-to-automorphism +map injective. -/ +theorem standardLubinTateUnitParameterToGal_injective + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + Function.Injective + (standardLubinTateUnitParameterToGal F hπ n) := by + intro a b hab + apply standardLubinTateUnitParameterLevelRoot_injective F hπ n + have hgen := congrArg + (fun σ : Gal((standardLubinTateLevelField hπ n)/K) => + σ (standardLubinTateLevelPowerBasis hπ n).gen) hab + simpa [standardLubinTateUnitParameterToGal] using hgen + +/-- The explicit parameter map preserves the identity element. -/ +theorem standardLubinTateUnitParameterToGal_one + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + standardLubinTateUnitParameterToGal F hπ n 1 = 1 := by + simpa [standardLubinTateUnitParameterToGal] using + standardLubinTateUnitParameterAlgEquiv_one F hπ n + +/-- The explicit parameter map preserves multiplication. -/ +theorem standardLubinTateUnitParameterToGal_mul + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a b : standardLubinTateUnitParameter F n) : + standardLubinTateUnitParameterToGal F hπ n (a * b) = + standardLubinTateUnitParameterToGal F hπ n a * + standardLubinTateUnitParameterToGal F hπ n b := by + simpa [standardLubinTateUnitParameterToGal] using + standardLubinTateUnitParameterAlgEquiv_mul F hπ n a b + +/-- The automorphism group of a standard finite level is finite. -/ +noncomputable instance standardLubinTateLevelField_galFinite + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + Finite (Gal((standardLubinTateLevelField hπ n)/K)) := by + let : FiniteDimensional K (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_finiteDimensional hπ n + let : Module.Free K (standardLubinTateLevelField hπ n) := + Module.Free.of_divisionRing _ _ + let : Finite + ((standardLubinTateLevelField hπ n) →ₐ[K] + (standardLubinTateLevelField hπ n)) := + Finite.algHom _ _ _ + exact Finite.algEquiv + +/-- The number of base-field automorphisms of a standard level is at most +its field degree. -/ +theorem standardLubinTateLevelField_natCard_gal_le_finrank + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + Nat.card (Gal((standardLubinTateLevelField hπ n)/K)) ≤ + Module.finrank K (standardLubinTateLevelField hπ n) := by + let : FiniteDimensional K (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_finiteDimensional hπ n + rw [Nat.card_eq_fintype_card] + exact AlgEquiv.card_le + +/-- The automorphism group of a standard finite level has cardinality equal +to the field degree. -/ +theorem standardLubinTateLevelField_natCard_gal + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + Nat.card (Gal((standardLubinTateLevelField hπ n)/K)) = + Module.finrank K (standardLubinTateLevelField hπ n) := by + let : FiniteDimensional K (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_finiteDimensional hπ n + apply Nat.le_antisymm + · exact standardLubinTateLevelField_natCard_gal_le_finrank hπ n + · calc + Module.finrank K (standardLubinTateLevelField hπ n) = + Nat.card (standardLubinTateUnitParameter F n) := by + rw [standardLubinTateLevelField_finrank hπ n, + standardLubinTateUnitParameter_natCard F n] + _ ≤ Nat.card (Gal((standardLubinTateLevelField hπ n)/K)) := + Nat.card_le_card_of_injective + (standardLubinTateUnitParameterToGal F hπ n) + (standardLubinTateUnitParameterToGal_injective F hπ n) + +/-- The parameter-to-Galois map is bijective. -/ +theorem standardLubinTateUnitParameterToGal_bijective + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + Function.Bijective + (standardLubinTateUnitParameterToGal F hπ n) := by + apply (Nat.bijective_iff_injective_and_card + (standardLubinTateUnitParameterToGal F hπ n)).2 + refine + ⟨standardLubinTateUnitParameterToGal_injective F hπ n, ?_⟩ + rw [standardLubinTateUnitParameter_natCard F n, + ← standardLubinTateLevelField_finrank hπ n, + ← standardLubinTateLevelField_natCard_gal hπ n] + +/-- Every finite-level automorphism is obtained from a finite unit +parameter. -/ +theorem standardLubinTateUnitParameterToGal_surjective + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + Function.Surjective + (standardLubinTateUnitParameterToGal F hπ n) := + (standardLubinTateUnitParameterToGal_bijective F hπ n).2 + +/-- Every standard finite Lubin--Tate level field is Galois over its base +field. -/ +theorem standardLubinTateLevelField_isGalois + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + IsGalois K (standardLubinTateLevelField hπ n) := by + let : FiniteDimensional K (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_finiteDimensional hπ n + exact IsGalois.of_card_aut_eq_finrank K + (standardLubinTateLevelField hπ n) + (standardLubinTateLevelField_natCard_gal hπ n) + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelFieldTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelFieldTower.lean new file mode 100644 index 0000000000..c5c9d2b003 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelFieldTower.lean @@ -0,0 +1,146 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms +public import Mathlib.FieldTheory.SplittingField.IsSplittingField +/-! +# The tower of standard Lubin--Tate level fields + +The primitive roots defining the standard finite levels are chosen +independently in one separable closure. Exact torsion and normality show +that the resulting simple fields nevertheless form an increasing tower. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The polynomial predecessor of the primitive level-`n + 1` generator, +regarded as an element of the level-`n + 1` field itself. -/ +noncomputable def standardLubinTatePrimitivePredecessorInLevelField + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + {m n : ℕ} (_hmn : m ≤ n) : + standardLubinTateLevelField hπ n := + Polynomial.eval₂ + (algebraMap K (standardLubinTateLevelField hπ n)) + (standardLubinTateLevelGenerator hπ n) + (standardLubinTatePolynomialIterateOverField F π (n - m)) + +/-- Coercing the internal predecessor to the separable closure gives the +ambient polynomial predecessor used by the exact-torsion theorem. -/ +@[simp] +theorem standardLubinTatePrimitivePredecessorInLevelField_coe + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + {m n : ℕ} (hmn : m ≤ n) : + (standardLubinTatePrimitivePredecessorInLevelField hπ hmn : + SeparableClosure K) = + (standardLubinTatePolynomialIterateOverSeparableClosure + F π (n - m)).eval + (chosenStandardLubinTatePrimitiveRoot hπ n) := by + let E := standardLubinTateLevelField hπ n + let ι : E →ₐ[K] SeparableClosure K := E.val + change ι.toRingHom + (Polynomial.eval₂ (algebraMap K E) + (standardLubinTateLevelGenerator hπ n) + (standardLubinTatePolynomialIterateOverField F π (n - m))) = + _ + rw [Polynomial.hom_eval₂] + have hcomp : + ι.toRingHom.comp (algebraMap K E) = + algebraMap K (SeparableClosure K) := by + ext x + rfl + rw [hcomp] + change Polynomial.eval₂ (algebraMap K (SeparableClosure K)) + ((standardLubinTateLevelGenerator hπ n : E) : SeparableClosure K) + (standardLubinTatePolynomialIterateOverField F π (n - m)) = + _ + rw [standardLubinTateLevelGenerator_coe] + simp [standardLubinTatePolynomialIterateOverField, + standardLubinTatePolynomialIterateOverSeparableClosure, + Polynomial.eval_map, Polynomial.eval₂_map] + +/-- The independently chosen standard Lubin--Tate level fields form an +increasing tower inside the fixed separable closure. -/ +theorem standardLubinTateLevelField_mono + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + {m n : ℕ} (hmn : m ≤ n) : + standardLubinTateLevelField hπ m ≤ + standardLubinTateLevelField hπ n := by + let S := SeparableClosure K + let E := standardLubinTateLevelField hπ n + let p := standardLubinTatePrimitivePolynomialOverField F π m + let yE : E := + standardLubinTatePrimitivePredecessorInLevelField hπ hmn + have hyp : (p.map (algebraMap K E)).IsRoot yE := by + have hroot := + chosenStandardLubinTatePrimitivePredecessor_isRoot hπ hmn + change Polynomial.eval + ((standardLubinTatePolynomialIterateOverSeparableClosure + F π (n - m)).eval + (chosenStandardLubinTatePrimitiveRoot hπ n)) + (p.map (algebraMap K S)) = 0 at hroot + change Polynomial.eval yE (p.map (algebraMap K E)) = 0 + apply E.val.injective + rw [map_zero, Polynomial.eval_map, Polynomial.hom_eval₂] + have hcomp : + E.val.toRingHom.comp (algebraMap K E) = + algebraMap K S := by + ext x + rfl + rw [hcomp] + simpa [yE, p, Polynomial.eval₂_eq_eval_map] using hroot + have hp_minpoly : p = minpoly K yE := by + apply minpoly.eq_of_irreducible_of_monic + (standardLubinTatePrimitivePolynomialOverField_irreducible hπ m) + _ (standardLubinTatePrimitivePolynomialOverField_monic F π m) + simpa [Polynomial.IsRoot, Polynomial.aeval_def] using hyp + let : FiniteDimensional K E := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsGalois K E := + standardLubinTateLevelField_isGalois hπ n + have hp_split_E : (p.map (algebraMap K E)).Splits := by + rw [hp_minpoly] + exact IsGalois.splits K yE + have hp_split_S : (p.map (algebraMap K S)).Splits := by + have h := hp_split_E.map E.val.toRingHom + simpa [Polynomial.map_map] using h + have hchosen_mem : + chosenStandardLubinTatePrimitiveRoot hπ m ∈ E := by + apply + (IntermediateField.splits_iff_mem + (F := E) hp_split_S).1 hp_split_E + rw [Polynomial.mem_rootSet'] + constructor + · exact + ((standardLubinTatePrimitivePolynomialOverField_monic F π m).map + (algebraMap K S)).ne_zero + · simpa [Polynomial.aeval_def, p] using + chosenStandardLubinTatePrimitiveRoot_isRoot hπ m + change IntermediateField.adjoin K + {chosenStandardLubinTatePrimitiveRoot hπ m} ≤ E + rw [IntermediateField.adjoin_le_iff] + simpa using hchosen_mem + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelValuation.lean new file mode 100644 index 0000000000..cd586c2400 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelValuation.lean @@ -0,0 +1,63 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CompleteDVF +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups +/-! +# Uniqueness of the valuation on standard Lubin--Tate levels + +The standard level field is finite and Galois over the local base field. +Consequently the complete discrete valuation selected from its integral +closure is the unique extension of the base valuation. This is the bridge +needed by the genuine lower- and upper-numbering ramification groups. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +variable {K : Type u} [Field K] + +/-- The chosen complete valuation on a standard Lubin--Tate level is the +unique extension of the base valuation. -/ +theorem standardLubinTateLevelCompleteDVF_hasUniqueValuationExtension + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + ValuationTheory.DiscreteValuationField.ValuedExtension.HasUniqueValuationExtension.{u, v, u, + 0, 0} + (base := F.toCompleteDVF) + (target := standardLubinTateLevelCompleteDVF hπ n) := by + let : FiniteDimensional K (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsGalois K (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_isGalois hπ n + intro Gamma' _ v' + exact + (hasUniqueValuationExtension_of_finite_separable.{u, v, u, 0, 0} + F.toCompleteDVF (standardLubinTateLevelCompleteDVF hπ n)) v' + +/-- The same uniqueness statement after forgetting completeness, in the form +used by the real ramification-group API. -/ +theorem standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, u, 0, 0} + F.toCompleteDVF.toDVF + (standardLubinTateLevelCompleteDVF hπ n).toDVF := + standardLubinTateLevelCompleteDVF_hasUniqueValuationExtension hπ n + +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LocalUpperRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LocalUpperRamification.lean new file mode 100644 index 0000000000..df1974c74c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LocalUpperRamification.lean @@ -0,0 +1,266 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HerbrandFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelFieldTower +/-! +# Upper ramification groups of standard Lubin--Tate levels + +For the canonical `LocalField` package attached to a nonarchimedean local +field, the explicit complete-DVF valuation chosen in the standard +Lubin--Tate construction is equivalent to the valuation chosen by the local +upper-ramification API. This identifies their upper filtrations. + +The explicit Herbrand formula and the finite-level tower then identify the +integral upper group at `k` with the kernel of restriction to level `k - 1`. +-/ + +@[expose] public section + +noncomputable +section + +open scoped ValuativeRel + +namespace LubinTate + +open LocalFieldTheory +open LocalFieldTheory.DiscreteValuationField +open LubinTate +open RamificationTheory.HilbertRamification.Higher +open RamificationTheory.LocalField +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The explicit complete-DVF upper group on a standard Lubin--Tate level +agrees with the canonical local upper ramification group. -/ +theorem + standardLubinTateRealUpperRamificationGroup_eq_localUpperRamificationGroup + {π : (standardLocalField K).valuationSubring} + (hπ : + (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + (n : ℕ) (t : ℝ) : + let F := standardLocalField K + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsGalois K L := + standardLubinTateLevelField_isGalois (F := F) hπ n + standardLubinTateRealUpperRamificationGroup hπ n t = + localUpperRamificationGroup K L t := by + let F := standardLocalField K + let L := standardLubinTateLevelField hπ n + let : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsGalois K L := + standardLubinTateLevelField_isGalois (F := F) hπ n + let base := localCompleteDVF K + let targetLocal := chosenLocalExtensionCompleteDVF K L + let targetLT := standardLubinTateLevelCompleteDVF hπ n + let : base.valuation.HasExtension targetLT.valuation := by + change F.toCompleteDVF.valuation.HasExtension targetLT.valuation + exact standardLubinTateLevelCompleteDVF_hasExtension hπ n + let huniqLocal : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + base.toDVF targetLocal.toDVF := + chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension K L + let huniqLT : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + base.toDVF targetLT.toDVF := by + change + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + F.toCompleteDVF.toDVF targetLT.toDVF + exact + standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + hπ n + have hvaluationSubring : + targetLocal.valuation.valuationSubring = + targetLT.valuation.valuationSubring := by + exact + (_root_.Valuation.isEquiv_iff_valuationSubring + targetLocal.valuation targetLT.valuation).1 + (chosenLocalExtensionCompleteDVF_hasUniqueValuationExtension + K L targetLT.valuation) + change + upperRamificationGroupOfUniqueExtension + (base := base.toDVF) (target := targetLT.toDVF) + huniqLT t = + upperRamificationGroupOfUniqueExtension + (base := base.toDVF) (target := targetLocal.toDVF) + huniqLocal t + exact + (upperRamificationGroup_eq_of_valuationSubring_eq + huniqLocal huniqLT hvaluationSubring t).symm + +/-- For `1 ≤ k ≤ n + 1`, the `k`-th upper ramification group of the +standard level `n + 1` is the kernel of restriction to level `k`. -/ +theorem standardLubinTateRealUpperRamificationGroup_eq_restrictKer + {π : (standardLocalField K).valuationSubring} + (hπ : + (standardLocalField K).toCompleteDVF.valuation.IsUniformizer + (π : K)) + (n k : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) : + let F := standardLocalField K + let m := k - 1 + let E := standardLubinTateLevelField hπ m + let L := standardLubinTateLevelField hπ n + letI : FiniteDimensional K E := + standardLubinTateLevelField_finiteDimensional hπ m + letI : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + letI : IsGalois K E := + standardLubinTateLevelField_isGalois (F := F) hπ m + letI : IsGalois K L := + standardLubinTateLevelField_isGalois (F := F) hπ n + let hEL : E ≤ L := + standardLubinTateLevelField_mono hπ (by omega) + standardLubinTateRealUpperRamificationGroup hπ n (k : ℝ) = + (RamificationTheory.intermediateFieldRestrictNormalHom E L hEL).ker := by + let F := standardLocalField K + let m := k - 1 + let E := standardLubinTateLevelField hπ m + let L := standardLubinTateLevelField hπ n + let : FiniteDimensional K E := + standardLubinTateLevelField_finiteDimensional hπ m + let : FiniteDimensional K L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsGalois K E := + standardLubinTateLevelField_isGalois (F := F) hπ m + let : IsGalois K L := + standardLubinTateLevelField_isGalois (F := F) hπ n + let hmn : m ≤ n := by + dsimp only [m] + omega + let hEL : E ≤ L := standardLubinTateLevelField_mono hπ hmn + let ψ := RamificationTheory.intermediateFieldRestrictNormalHom E L hEL + have hmap : + Subgroup.map ψ + (standardLubinTateRealUpperRamificationGroup + hπ n (k : ℝ)) = + standardLubinTateRealUpperRamificationGroup + hπ m (k : ℝ) := by + rw [ + standardLubinTateRealUpperRamificationGroup_eq_localUpperRamificationGroup + K hπ n (k : ℝ), + standardLubinTateRealUpperRamificationGroup_eq_localUpperRamificationGroup + K hπ m (k : ℝ)] + exact localUpperRamificationGroup_map_restrict K E L hEL (k : ℝ) + have hkm : k ≤ m + 1 := by + dsimp only [m] + omega + have hcardLower : + Nat.card + (standardLubinTateRealUpperRamificationGroup + hπ m (k : ℝ)) = 1 := by + rw [ + standardLubinTateRealUpperRamificationGroup_natCard + F hπ m k hk hkm] + have hmkeq : m + 1 = k := by + dsimp only [m] + omega + rw [hmkeq, Nat.sub_self, pow_zero] + have hLowerBot : + standardLubinTateRealUpperRamificationGroup + hπ m (k : ℝ) = ⊥ := by + exact Subgroup.eq_bot_of_card_le _ (by omega) + have hUpperLeKer : + standardLubinTateRealUpperRamificationGroup + hπ n (k : ℝ) ≤ ψ.ker := by + apply (Subgroup.map_eq_bot_iff + (standardLubinTateRealUpperRamificationGroup + hπ n (k : ℝ))).1 + exact hmap.trans hLowerBot + have hψ_surjective : Function.Surjective ψ := by + let : Algebra E L := + RingHom.toAlgebra (IntermediateField.inclusion hEL).toRingHom + let : IsScalarTower K E L := + IsScalarTower.of_algebraMap_eq' rfl + change Function.Surjective + (AlgEquiv.restrictNormalHom E : + Gal(L/K) →* Gal(E/K)) + exact + AlgEquiv.restrictNormalHom_surjective + (F := K) (K₁ := E) (E := L) + let q := Nat.card F.residueField + have hcardGalE : + Nat.card (Gal(E/K)) = (q - 1) * q ^ m := by + calc + Nat.card (Gal(E/K)) = + Module.finrank K E := by + simpa [E] using + standardLubinTateLevelField_natCard_gal + (F := F) hπ m + _ = (q - 1) * q ^ m := by + simpa [E, q] using + standardLubinTateLevelField_finrank + (F := F) hπ m + have hcardGalL : + Nat.card (Gal(L/K)) = (q - 1) * q ^ n := by + calc + Nat.card (Gal(L/K)) = + Module.finrank K L := by + simpa [L] using + standardLubinTateLevelField_natCard_gal + (F := F) hπ n + _ = (q - 1) * q ^ n := by + simpa [L, q] using + standardLubinTateLevelField_finrank + (F := F) hπ n + have hindex : + ψ.ker.index = Nat.card (Gal(E/K)) := by + rw [Subgroup.index_ker, + ψ.range_eq_top_of_surjective hψ_surjective, + Subgroup.card_top] + have hcardKerMul : + Nat.card ψ.ker * Nat.card (Gal(E/K)) = + Nat.card (Gal(L/K)) := by + rw [← hindex] + exact Subgroup.card_mul_index ψ.ker + rw [hcardGalE, hcardGalL] at hcardKerMul + have hfactor_pos : 0 < (q - 1) * q ^ m := by + exact Nat.mul_pos + (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (Nat.pow_pos Nat.card_pos) + have hcardKer : + Nat.card ψ.ker = q ^ (n - m) := by + have hpow : q ^ n = q ^ m * q ^ (n - m) := by + rw [← pow_add, Nat.add_sub_of_le hmn] + apply Nat.eq_of_mul_eq_mul_left hfactor_pos + calc + ((q - 1) * q ^ m) * Nat.card ψ.ker = + Nat.card ψ.ker * ((q - 1) * q ^ m) := by + exact Nat.mul_comm _ _ + _ = (q - 1) * q ^ n := hcardKerMul + _ = ((q - 1) * q ^ m) * q ^ (n - m) := by + rw [hpow, Nat.mul_assoc] + have hexponent : n - m = n + 1 - k := by + dsimp only [m] + omega + have hcardUpper : + Nat.card + (standardLubinTateRealUpperRamificationGroup + hπ n (k : ℝ)) = + q ^ (n + 1 - k) := by + simpa [q] using + standardLubinTateRealUpperRamificationGroup_natCard + F hπ n k hk hkn + apply Subgroup.eq_of_le_of_card_ge hUpperLeKer + rw [hcardKer, hexponent, hcardUpper] + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamification.lean new file mode 100644 index 0000000000..5299fbf04b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamification.lean @@ -0,0 +1,164 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumber +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal +/-! +# Lower ramification groups of standard Lubin--Tate levels + +This file places the genuine real lower ramification filtration on a standard +Lubin--Tate level. Since the integral closure is generated by the primitive +Lubin--Tate uniformizer, membership at a natural index is detected by the +displacement of that one element. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open RamificationTheory.HilbertRamification.Higher +open ValuationTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The actual real lower ramification group of a standard Lubin--Tate +level, formed using its integral-closure valuation. -/ +noncomputable def standardLubinTateRealLowerRamificationGroup + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (s : ℝ) : + Subgroup Gal((standardLubinTateLevelField hπ n)/K) := + lowerRamificationGroup + (base := F.toCompleteDVF.toDVF) + (target := (standardLubinTateLevelCompleteDVF hπ n).toDVF) + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension hπ n) + s + +noncomputable local instance + standardLubinTateLevelField_finiteDimensional_forLowerRamification + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + FiniteDimensional K (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_finiteDimensional hπ n + +noncomputable local instance + standardLubinTateLevelField_isGalois_forLowerRamification + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + IsGalois K (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_isGalois hπ n + +/-- At a natural lower index, an automorphism belongs to the lower +ramification group exactly when its displacement of the primitive +Lubin--Tate uniformizer has additive valuation at least `i + 1`. -/ +theorem mem_standardLubinTateRealLowerRamificationGroup_nat_iff_primitivePoint + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n i : ℕ) + (σ : Gal((standardLubinTateLevelField hπ n)/K)) : + σ ∈ standardLubinTateRealLowerRamificationGroup hπ n (i : ℝ) ↔ + ((i + 1 : ℕ) : ℕ∞) ≤ + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (valuationSubringAutOfUniqueExtension + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + hπ n) + σ (standardLubinTatePrimitivePointInteger hπ n) - + standardLubinTatePrimitivePointInteger hπ n) := by + change + σ ∈ lowerRamificationGroup + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + hπ n) (i : ℝ) ↔ _ + constructor + · intro hσ + have hall := + (mem_lowerRamificationGroup_nat_iff + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + hπ n) + i σ).mp hσ + exact + (IsDiscreteValuationRing.mem_maximalIdeal_pow_iff_addVal_ge + (valuationSubringAutOfUniqueExtension + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + hπ n) + σ (standardLubinTatePrimitivePointInteger hπ n) - + standardLubinTatePrimitivePointInteger hπ n) + (i + 1)).mp + (hall (standardLubinTatePrimitivePointInteger hπ n)) + · intro hdisplacement + apply + (mem_lowerRamificationGroup_nat_iff + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + hπ n) + i σ).mpr + intro z + apply + valuationSubringAutOfUniqueExtension_sub_mem_of_mem_adjoin + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + hπ n) + · exact + (IsDiscreteValuationRing.mem_maximalIdeal_pow_iff_addVal_ge + (valuationSubringAutOfUniqueExtension + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + hπ n) + σ (standardLubinTatePrimitivePointInteger hπ n) - + standardLubinTatePrimitivePointInteger hπ n) + (i + 1)).mpr hdisplacement + · exact + (standardLubinTatePrimitivePointInteger_adjoin_eq_top hπ n).symm.le + (show z ∈ + (⊤ : Subalgebra F.valuationSubring + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) from + by simp) + +/-- At a nonnegative real lower index, the standard lower group is already +the group at the natural-number ceiling of that index. -/ +theorem standardLubinTateRealLowerRamificationGroup_eq_natCeil + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (s : ℝ) (hs : 0 ≤ s) : + standardLubinTateRealLowerRamificationGroup hπ n s = + standardLubinTateRealLowerRamificationGroup + hπ n (⌈s⌉₊ : ℝ) := by + have hexponent : + realRamificationExponent s = + realRamificationExponent (⌈s⌉₊ : ℝ) := by + rw [realRamificationExponent_nat] + unfold realRamificationExponent + rw [Int.ceil_toNat, Nat.ceil_add_one hs] + have hideal : + realRamificationIdeal + (standardLubinTateLevelCompleteDVF hπ n).toDVF s = + realRamificationIdeal + (standardLubinTateLevelCompleteDVF hπ n).toDVF + (⌈s⌉₊ : ℝ) := by + unfold realRamificationIdeal + rw [hexponent] + unfold standardLubinTateRealLowerRamificationGroup + ext σ + change + (∀ a, _ ∈ + realRamificationIdeal + (standardLubinTateLevelCompleteDVF hπ n).toDVF s) ↔ + ∀ a, _ ∈ + realRamificationIdeal + (standardLubinTateLevelCompleteDVF hπ n).toDVF + (⌈s⌉₊ : ℝ) + rw [hideal] + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamificationFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamificationFormula.lean new file mode 100644 index 0000000000..b67b83b546 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamificationFormula.lean @@ -0,0 +1,171 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveDisplacement +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.GaloisParameterFiltration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamification +/-! +# Explicit lower ramification groups of finite Lubin--Tate levels + +The displacement formula for a primitive Lubin--Tate point identifies the +lower ramification filtration with the principal-unit filtration transported +to the finite-level Galois group. At the break `q ^ k - 1`, and throughout +the interval `q ^ (k - 1) ≤ r < q ^ k`, the group is the image of `U_F^k`. +Its cardinality is therefore `q ^ (n + 1 - k)`. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open RamificationTheory.HilbertRamification.Higher +open ValuationTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The primitive-point displacement threshold for a finite parameter is +equivalent to membership in the corresponding finite principal-unit +subgroup. -/ +theorem + standardLubinTateUnitParameterToGal_displacement_addVal_ge_iff_mem_parameterSubgroup + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : standardLubinTateUnitParameter F n) (k : ℕ) + (hkn : k ≤ n + 1) : + ((Nat.card F.residueField ^ k : ℕ) : ℕ∞) ≤ + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (valuationSubringAutOfUniqueExtension + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + hπ n) + (standardLubinTateUnitParameterToGal F hπ n a) + (standardLubinTatePrimitivePointInteger hπ n) - + standardLubinTatePrimitivePointInteger hπ n) ↔ + a ∈ standardLubinTateUnitParameterSubgroup F n k := by + rw [ + standardLubinTateUnitParameterToGal_displacement_addVal_ge_iff_chosenRepresentative_mem + F hπ n a k hkn] + simpa only [standardLubinTateUnitParameterChosenRepresentative_spec] using + (standardLubinTateUnitParameterClass_mem_subgroup_iff + F n k hkn + (standardLubinTateUnitParameterChosenRepresentative F n a)).symm + +/-- At the lower break `q ^ k - 1`, the real lower ramification group is the +Galois image of the `k`-th finite principal-unit subgroup. -/ +theorem + standardLubinTateRealLowerRamificationGroup_pow_sub_one_eq_galoisParameterSubgroup + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n k : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) : + standardLubinTateRealLowerRamificationGroup hπ n + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ) = + standardLubinTateGaloisParameterSubgroup F hπ n k := by + ext σ + obtain ⟨a, rfl⟩ := + standardLubinTateUnitParameterToGal_surjective F hπ n σ + have hkpos : 0 < k := lt_of_lt_of_le Nat.zero_lt_one hk + have hqpow : 1 ≤ Nat.card F.residueField ^ k := + (Nat.one_lt_pow hkpos.ne' + (Finite.one_lt_card : 1 < Nat.card F.residueField)).le + rw [mem_standardLubinTateRealLowerRamificationGroup_nat_iff_primitivePoint, + Nat.sub_add_cancel hqpow, + standardLubinTateUnitParameterToGal_displacement_addVal_ge_iff_mem_parameterSubgroup + F hπ n a k hkn, + standardLubinTateUnitParameterToGal_mem_galoisParameterSubgroup_iff] + +/-- The lower ramification group at `q ^ k - 1` has order +`q ^ (n + 1 - k)`. -/ +theorem standardLubinTateRealLowerRamificationGroup_pow_sub_one_natCard + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n k : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) : + Nat.card + (standardLubinTateRealLowerRamificationGroup hπ n + ((Nat.card F.residueField ^ k - 1 : ℕ) : ℝ)) = + Nat.card F.residueField ^ (n + 1 - k) := by + rw [ + standardLubinTateRealLowerRamificationGroup_pow_sub_one_eq_galoisParameterSubgroup + F hπ n k hk hkn, + standardLubinTateGaloisParameterSubgroup_natCard F hπ n k hk hkn] + +/-- On a full power interval, the primitive-point displacement threshold for +a finite parameter is equivalent to membership in the `k`-th finite +principal-unit subgroup. -/ +theorem + standardLubinTateUnitParameterToGal_interval_displacement_iff_mem_parameterSubgroup + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : standardLubinTateUnitParameter F n) (k r : ℕ) + (hk : 1 ≤ k) (hkn : k ≤ n + 1) + (hlower : Nat.card F.residueField ^ (k - 1) ≤ r) + (hupper : r < Nat.card F.residueField ^ k) : + (((r + 1 : ℕ) : ℕ∞) ≤ + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (valuationSubringAutOfUniqueExtension + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + hπ n) + (standardLubinTateUnitParameterToGal F hπ n a) + (standardLubinTatePrimitivePointInteger hπ n) - + standardLubinTatePrimitivePointInteger hπ n)) ↔ + a ∈ standardLubinTateUnitParameterSubgroup F n k := by + rw [standardLubinTateUnitParameterToGal_apply_primitivePointInteger] + rw [ + standardLubinTatePrimitivePointIntegerAction_sub_self_addVal_ge_iff_mem_of_pow_interval + hπ n (standardLubinTateUnitParameterChosenRepresentative F n a) + k r hk hkn hlower hupper] + simpa only [standardLubinTateUnitParameterChosenRepresentative_spec] using + (standardLubinTateUnitParameterClass_mem_subgroup_iff + F n k hkn + (standardLubinTateUnitParameterChosenRepresentative F n a)).symm + +/-- Throughout `q ^ (k - 1) ≤ r < q ^ k`, the real lower ramification group +is the Galois image of the `k`-th finite principal-unit subgroup. -/ +theorem + standardLubinTateRealLowerRamificationGroup_eq_galoisParameterSubgroup_of_pow_interval + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n k r : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) + (hlower : Nat.card F.residueField ^ (k - 1) ≤ r) + (hupper : r < Nat.card F.residueField ^ k) : + standardLubinTateRealLowerRamificationGroup hπ n (r : ℝ) = + standardLubinTateGaloisParameterSubgroup F hπ n k := by + ext σ + obtain ⟨a, rfl⟩ := + standardLubinTateUnitParameterToGal_surjective F hπ n σ + rw [mem_standardLubinTateRealLowerRamificationGroup_nat_iff_primitivePoint, + standardLubinTateUnitParameterToGal_interval_displacement_iff_mem_parameterSubgroup + F hπ n a k r hk hkn hlower hupper, + standardLubinTateUnitParameterToGal_mem_galoisParameterSubgroup_iff] + +/-- Throughout a full power interval, the real lower ramification group has +order `q ^ (n + 1 - k)`. -/ +theorem + standardLubinTateRealLowerRamificationGroup_natCard_of_pow_interval + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n k r : ℕ) (hk : 1 ≤ k) (hkn : k ≤ n + 1) + (hlower : Nat.card F.residueField ^ (k - 1) ≤ r) + (hupper : r < Nat.card F.residueField ^ k) : + Nat.card + (standardLubinTateRealLowerRamificationGroup hπ n (r : ℝ)) = + Nat.card F.residueField ^ (n + 1 - k) := by + rw [ + standardLubinTateRealLowerRamificationGroup_eq_galoisParameterSubgroup_of_pow_interval + F hπ n k r hk hkn hlower hupper, + standardLubinTateGaloisParameterSubgroup_natCard F hπ n k hk hkn] + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormSubgroup.lean new file mode 100644 index 0000000000..c253600487 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormSubgroup.lean @@ -0,0 +1,126 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormUniformizer +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient +/-! +# The norm subgroup of a standard Lubin--Tate level + +This file introduces the local norm subgroup attached to a standard finite +Lubin--Tate level. The norm identity for the negative primitive generator +shows that the chosen base uniformizer is an actual norm. Consequently its +entire cyclic subgroup of integral powers lies in the norm subgroup. + +The higher-principal-unit contribution is intentionally left to the later +norm calculation. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The local norm subgroup attached to a standard finite Lubin--Tate +level. -/ +def standardLubinTateNormSubgroup + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : Subgroup Kˣ := + LocalFieldTheory.localNormSubgroup K + (standardLubinTateLevelField hπ n) + +/-- The chosen base uniformizer, regarded as a nonzero field unit. -/ +noncomputable def standardLubinTateBaseUniformizerUnit + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + Kˣ := + Units.mk0 (π : K) hπ.ne_zero + +/-- The chosen uniformizer unit has the expected underlying field +element. -/ +@[simp] +theorem standardLubinTateBaseUniformizerUnit_coe + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + (standardLubinTateBaseUniformizerUnit hπ : K) = (π : K) := + rfl + +/-- The chosen base uniformizer is an actual norm from every standard +finite level. -/ +theorem standardLubinTateBaseUniformizerUnit_mem_normSubgroup + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + standardLubinTateBaseUniformizerUnit hπ ∈ + standardLubinTateNormSubgroup hπ n := by + let : FiniteDimensional K (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_finiteDimensional hπ n + let y : (standardLubinTateLevelField hπ n)ˣ := + Units.mk0 (-standardLubinTateLevelGenerator hπ n) + (neg_ne_zero.mpr (by + intro hzero + apply chosenStandardLubinTatePrimitiveRoot_ne_zero hπ n + simpa using congrArg Subtype.val hzero)) + have hyNorm : + LocalFieldTheory.normUnits K + (standardLubinTateLevelField hπ n) y = + standardLubinTateBaseUniformizerUnit hπ := by + apply Units.ext + exact standardLubinTate_norm_neg_levelGenerator hπ n + have hyMem : + LocalFieldTheory.normUnits K + (standardLubinTateLevelField hπ n) y ∈ + LocalFieldTheory.localNormSubgroup K + (standardLubinTateLevelField hπ n) := + ⟨y, rfl⟩ + rw [hyNorm] at hyMem + exact hyMem + +/-- The inverse uniformizer is also a norm, for conventions that choose the +inverse generator of the valuation factor. -/ +theorem standardLubinTateBaseUniformizerUnit_inv_mem_normSubgroup + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + (standardLubinTateBaseUniformizerUnit hπ)⁻¹ ∈ + standardLubinTateNormSubgroup hπ n := + (standardLubinTateNormSubgroup hπ n).inv_mem + (standardLubinTateBaseUniformizerUnit_mem_normSubgroup hπ n) + +/-- Every integral power of the chosen base uniformizer is a norm. -/ +theorem standardLubinTateBaseUniformizerUnit_zpowers_le_normSubgroup + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + Subgroup.zpowers (standardLubinTateBaseUniformizerUnit hπ) ≤ + standardLubinTateNormSubgroup hπ n := by + rw [Subgroup.zpowers_le] + exact standardLubinTateBaseUniformizerUnit_mem_normSubgroup hπ n + +/-- The same cyclic norm-subgroup inclusion using the inverse-uniformizer +convention. -/ +theorem standardLubinTateBaseUniformizerUnit_inv_zpowers_le_normSubgroup + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + Subgroup.zpowers ((standardLubinTateBaseUniformizerUnit hπ)⁻¹) ≤ + standardLubinTateNormSubgroup hπ n := by + rw [Subgroup.zpowers_le] + exact standardLubinTateBaseUniformizerUnit_inv_mem_normSubgroup hπ n + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormUniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormUniformizer.lean new file mode 100644 index 0000000000..20f93f62e2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormUniformizer.lean @@ -0,0 +1,72 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer +public import Mathlib.RingTheory.Norm.Basic +/-! +# Norm of a primitive standard Lubin--Tate point + +The minimal polynomial of the chosen primitive level generator is the +standard Eisenstein polynomial, whose constant coefficient is the base +uniformizer. The power-basis norm formula therefore gives +`N(-lambda) = pi`. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +private theorem algebraNorm_neg + {R S : Type*} [Field R] [Field S] [Algebra R S] (x : S) : + Algebra.norm R (-x) = + (-1) ^ Module.finrank R S * Algebra.norm R x := by + rw [show -x = algebraMap R S (-1) * x by simp] + rw [map_mul, Algebra.norm_algebraMap] + +/-- The standard primitive polynomial over the base field has constant +coefficient `pi`. -/ +@[simp] +theorem standardLubinTatePrimitivePolynomialOverField_coeff_zero + (F : LocalField.{u, v} K) (π : F.valuationSubring) (n : ℕ) : + (standardLubinTatePrimitivePolynomialOverField F π n).coeff 0 = + (π : K) := by + simp [standardLubinTatePrimitivePolynomialOverField] + +/-- The norm of the negative primitive level generator is exactly the +chosen base uniformizer. -/ +theorem standardLubinTate_norm_neg_levelGenerator + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + Algebra.norm K (-standardLubinTateLevelGenerator hπ n) = (π : K) := by + let pb := standardLubinTateLevelPowerBasis hπ n + have hfinrank : + Module.finrank K (standardLubinTateLevelField hπ n) = pb.dim := by + simpa [pb] using pb.finrank + rw [algebraNorm_neg, + show standardLubinTateLevelGenerator hπ n = pb.gen by rfl, + Algebra.PowerBasis.norm_gen_eq_coeff_zero_minpoly, + standardLubinTateLevelPowerBasis_minpoly hπ n, + standardLubinTatePrimitivePolynomialOverField_coeff_zero] + rw [hfinrank] + rw [← mul_assoc, ← pow_add, ← two_mul, pow_mul] + simp + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ParameterCongruence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ParameterCongruence.lean new file mode 100644 index 0000000000..00b9eed123 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ParameterCongruence.lean @@ -0,0 +1,151 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.DivisionPolynomial +public import Mathlib.RingTheory.Ideal.Quotient.Operations +/-! +# Parameter congruences for standard Lubin--Tate polynomials + +The standard polynomial + +`f_π(X) = X ^ q + π * X` + +depends polynomially on its parameter. Hence two parameters which become +equal after applying a ring homomorphism give the same polynomial, all the +same compositional iterates, and the same primitive quotient polynomial. + +The final theorem records the corresponding ideal-congruence statement for +evaluations. It is the algebraic input needed when comparing primitive +levels attached to two sufficiently close uniformizers; it is independent +of the characteristic and does not assume an equivalence between the two +levels. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +universe u v w + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- Equal images of two parameters give equal images of their standard +Lubin--Tate polynomials. -/ +theorem standardLubinTatePolynomial_map_eq_of_parameter_eq + (F : LocalField.{u, v} K) + {R : Type w} [CommRing R] + (f : F.valuationSubring →+* R) + {π ϖ : F.valuationSubring} (h : f π = f ϖ) : + (standardLubinTatePolynomial F π).map f = + (standardLubinTatePolynomial F ϖ).map f := by + simp [standardLubinTatePolynomial, h] + +/-- Equal images of two parameters give equal images of every compositional +iterate of the corresponding standard polynomials. -/ +theorem standardLubinTatePolynomialIterate_map_eq_of_parameter_eq + (F : LocalField.{u, v} K) + {R : Type w} [CommRing R] + (f : F.valuationSubring →+* R) + {π ϖ : F.valuationSubring} (h : f π = f ϖ) (n : ℕ) : + (standardLubinTatePolynomialIterate F π n).map f = + (standardLubinTatePolynomialIterate F ϖ n).map f := by + induction n with + | zero => + simp [standardLubinTatePolynomialIterate] + | succ n ih => + rw [standardLubinTatePolynomialIterate_succ, + standardLubinTatePolynomialIterate_succ, + Polynomial.map_comp, Polynomial.map_comp, + standardLubinTatePolynomial_map_eq_of_parameter_eq F f h, ih] + +/-- Equal images of two parameters give equal images of their primitive +quotient polynomials at every finite level. -/ +theorem standardLubinTatePrimitivePolynomial_map_eq_of_parameter_eq + (F : LocalField.{u, v} K) + {R : Type w} [CommRing R] + (f : F.valuationSubring →+* R) + {π ϖ : F.valuationSubring} (h : f π = f ϖ) (n : ℕ) : + (standardLubinTatePrimitivePolynomial F π n).map f = + (standardLubinTatePrimitivePolynomial F ϖ n).map f := by + simp only [standardLubinTatePrimitivePolynomial, + Polynomial.map_add, Polynomial.map_pow, Polynomial.map_C, + standardLubinTatePolynomialIterate_map_eq_of_parameter_eq F f h n, h] + +/-- Equal parameter images make the two primitive polynomials have equal +evaluations at every point of the target ring. -/ +theorem standardLubinTatePrimitivePolynomial_eval₂_eq_of_parameter_eq + (F : LocalField.{u, v} K) + {R : Type w} [CommRing R] + (f : F.valuationSubring →+* R) + {π ϖ : F.valuationSubring} (h : f π = f ϖ) + (n : ℕ) (x : R) : + Polynomial.eval₂ f x + (standardLubinTatePrimitivePolynomial F π n) = + Polynomial.eval₂ f x + (standardLubinTatePrimitivePolynomial F ϖ n) := by + have hpoly := + standardLubinTatePrimitivePolynomial_map_eq_of_parameter_eq + F f h n + simpa only [Polynomial.eval_map] using + congrArg (fun p : Polynomial R ↦ p.eval x) hpoly + +/-- If two parameters are congruent modulo an ideal after mapping into a +commutative ring, then the evaluations of their primitive quotient +polynomials at the same point are congruent modulo that ideal. -/ +theorem standardLubinTatePrimitivePolynomial_eval₂_sub_mem_of_parameter_sub_mem + (F : LocalField.{u, v} K) + {R : Type w} [CommRing R] + (f : F.valuationSubring →+* R) (I : Ideal R) + {π ϖ : F.valuationSubring} (h : f π - f ϖ ∈ I) + (n : ℕ) (x : R) : + Polynomial.eval₂ f x + (standardLubinTatePrimitivePolynomial F π n) - + Polynomial.eval₂ f x + (standardLubinTatePrimitivePolynomial F ϖ n) ∈ I := by + let q : R →+* R ⧸ I := Ideal.Quotient.mk I + have hparameter : q (f π) = q (f ϖ) := by + exact + (Ideal.Quotient.mk_eq_mk_iff_sub_mem + (I := I) (f π) (f ϖ)).2 h + have heval : + Polynomial.eval₂ (q.comp f) (q x) + (standardLubinTatePrimitivePolynomial F π n) = + Polynomial.eval₂ (q.comp f) (q x) + (standardLubinTatePrimitivePolynomial F ϖ n) := + standardLubinTatePrimitivePolynomial_eval₂_eq_of_parameter_eq + F (q.comp f) hparameter n (q x) + apply + (Ideal.Quotient.mk_eq_mk_iff_sub_mem + (I := I) + (Polynomial.eval₂ f x + (standardLubinTatePrimitivePolynomial F π n)) + (Polynomial.eval₂ f x + (standardLubinTatePrimitivePolynomial F ϖ n))).1 + calc + q (Polynomial.eval₂ f x + (standardLubinTatePrimitivePolynomial F π n)) = + Polynomial.eval₂ (q.comp f) (q x) + (standardLubinTatePrimitivePolynomial F π n) := by + exact Polynomial.hom_eval₂ _ _ _ _ + _ = Polynomial.eval₂ (q.comp f) (q x) + (standardLubinTatePrimitivePolynomial F ϖ n) := + heval + _ = q (Polynomial.eval₂ f x + (standardLubinTatePrimitivePolynomial F ϖ n)) := by + exact (Polynomial.hom_eval₂ _ _ _ _).symm + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveAction.lean new file mode 100644 index 0000000000..352fd54d56 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveAction.lean @@ -0,0 +1,906 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueQuotient +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerDecomposition +/-! +# The standard Lubin--Tate action on primitive division points + +The formal scalar endomorphism `[a]` is in general an infinite power +series. It is therefore evaluated on the primitive point only after that +point has been placed in the complete integral closure constructed in +`PrimitiveUniformizer`. Unit scalars preserve the exact torsion level, so +their analytic values are again roots of the primitive division +polynomial. + +The action is faithful precisely modulo the higher principal-unit subgroup +`U^(n + 1)`. This is the finite-level congruence needed to descend the +action from valuation-ring units to the standard finite unit parameters. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial PowerSeries + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +open ValuationTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +namespace SameUniformizer + +variable {F : LocalField.{u, v} K} {π : F.valuationSubring} + +/-- The standard Lubin--Tate series itself has the prescribed linear term +`π X`. -/ +private theorem standardLubinTateSeries_hasLinearTerm + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + HasLinearTerm (standardLubinTateSeries hπ).toPowerSeries + (fun _ : Unit => π) := by + have hlinear : + (standardLubinTateSeries hπ).toPowerSeries - + linearForm (fun _ : Unit => π) = + (PowerSeries.X : PowerSeries F.valuationSubring) ^ + Nat.card F.residueField := by + simp only [LubinTateSeries.standardLubinTateSeries_toPowerSeries, + standardLubinTatePowerSeries, linearForm, Finset.univ_unique, PUnit.default_eq_unit, + Finset.sum_singleton] + rw [PowerSeries.C_apply, PowerSeries.X_apply] + ring + rw [HasLinearTerm, hlinear, ← PowerSeries.order_eq_order, + PowerSeries.order_X_pow] + exact_mod_cast (Finite.one_lt_card : 1 < Nat.card F.residueField) + +/-- The scalar endomorphism attached to the uniformizer is the defining +standard Lubin--Tate series. -/ +theorem standardLubinTateEndomorphism_uniformizer + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + standardLubinTateEndomorphism hπ π = + (standardLubinTateSeries hπ).toPowerSeries := by + apply + eq_of_hasLinearTerm_of_intertwines hπ + (standardLubinTateSeries hπ) (standardLubinTateSeries hπ) + (fun _ : Unit => π) + (standardLubinTateEndomorphism_hasLinearTerm hπ π) + (standardLubinTateEndomorphism_intertwines hπ π) + (standardLubinTateSeries_hasLinearTerm hπ) + rw [Intertwines] + change + MvPowerSeries.subst + (fun _ : Unit => + (standardLubinTateSeries hπ).toPowerSeries) + (standardLubinTateSeries hπ).toPowerSeries = + MvPowerSeries.subst + (fun i : Unit => + inVariable (standardLubinTateSeries hπ) i) + (standardLubinTateSeries hπ).toPowerSeries + congr 1 + funext i + cases i + exact + (PowerSeries.X_subst + (standardLubinTateSeries hπ).toPowerSeries).symm + +end SameUniformizer + +section AnalyticAction + +variable {F : LocalField.{u, v} K} {π : F.valuationSubring} + +/-- The coefficient ring carries the discrete uniformity for formal evaluation. -/ +noncomputable local instance + standardLubinTatePrimitiveActionCoefficientUniformSpace : + UniformSpace F.valuationSubring := + ⊥ + +/-- The finite-level valuation ring is equipped with its maximal adic ideal. -/ +noncomputable local instance + standardLubinTatePrimitiveActionTargetWithIdeal + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + WithIdeal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring where + i := (standardLubinTateLevelCompleteDVF hπ n).maximalIdeal + +/-- The finite-level valuation ring is complete for the maximal-ideal topology. -/ +noncomputable local instance + standardLubinTatePrimitiveActionTargetCompleteSpace + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + CompleteSpace + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := by + let target := standardLubinTateLevelCompleteDVF hπ n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).1 + +/-- The finite-level valuation ring has a Hausdorff maximal-ideal topology. -/ +noncomputable local instance + standardLubinTatePrimitiveActionTargetT2Space + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + T2Space + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := by + let target := standardLubinTateLevelCompleteDVF hπ n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).2 + +/-- The coefficient homomorphism supplies the finite-level valuation-ring algebra. -/ +noncomputable local instance + standardLubinTatePrimitiveActionAlgebra + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + Algebra F.valuationSubring + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := + (standardLubinTateLevelCoefficientHom hπ n).toAlgebra + +/-- Analytic addition in the standard formal group on the integer ring of a +finite level. -/ +noncomputable def standardLubinTateFormalAdd + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (x y : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := + MvPowerSeries.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) ![x, y] + (SameUniformizer.standardFormalGroupPowerSeries hπ) + +/-- Analytic evaluation of scalar addition is addition in the standard +formal group. -/ +theorem standardLubinTateEndomorphismEvalAt_add + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (x : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) + (hx : PowerSeries.HasEval x) (a b : F.valuationSubring) : + standardLubinTateEndomorphismEvalAt hπ n x hx (a + b) = + standardLubinTateFormalAdd hπ n + (standardLubinTateEndomorphismEvalAt hπ n x hx a) + (standardLubinTateEndomorphismEvalAt hπ n x hx b) := by + let ea := SameUniformizer.standardLubinTateEndomorphism hπ a + let eb := SameUniformizer.standardLubinTateEndomorphism hπ b + have hea0 : PowerSeries.constantCoeff ea = 0 := + (SameUniformizer.standardLubinTateEndomorphism_hasLinearTerm + hπ a).constantCoeff_eq_zero + have heb0 : PowerSeries.constantCoeff eb = 0 := + (SameUniformizer.standardLubinTateEndomorphism_hasLinearTerm + hπ b).constantCoeff_eq_zero + have hab : + MvPowerSeries.HasSubst (![ea, eb] : + Fin 2 → PowerSeries F.valuationSubring) := + MvPowerSeries.hasSubst_of_constantCoeff_zero + (fun i => by + fin_cases i + · exact hea0 + · exact heb0) + rw [standardLubinTateEndomorphismEvalAt, + SameUniformizer.standardLubinTateEndomorphism_add] + simp only [standardLubinTateFormalAdd, + standardLubinTateLevelPowerSeriesEval, + PowerSeries.coe_eval₂Hom] + have hcoeff : + algebraMap F.valuationSubring + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring = + standardLubinTateLevelCoefficientHom hπ n := by + rfl + have hsubst := + MvPowerSeries.eval₂_subst + (R := F.valuationSubring) (S := F.valuationSubring) + (T := + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) + (a := (![ea, eb] : + Fin 2 → PowerSeries F.valuationSubring)) + hab (b := fun _ : Unit => x) (PowerSeries.hasEval hx) + (SameUniformizer.standardFormalGroupPowerSeries hπ) + rw [hcoeff] at hsubst + have hvalues : + (fun s : Fin 2 => + MvPowerSeries.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) + (fun _ : Unit => x) (![ea, eb] s)) = + ![ + MvPowerSeries.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) + (fun _ : Unit => x) ea, + MvPowerSeries.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) + (fun _ : Unit => x) eb] := by + funext s + fin_cases s <;> rfl + rw [hvalues] at hsubst + simpa only [ea, eb, standardLubinTateEndomorphismEvalAt, + standardLubinTateLevelPowerSeriesEval, + PowerSeries.coe_eval₂Hom, PowerSeries.eval₂, + Function.const_apply] using hsubst + +/-- At the primitive point, addition of scalars is analytic formal-group +addition of their values. -/ +theorem standardLubinTateEndomorphismValue_add + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (a b : F.valuationSubring) : + standardLubinTateEndomorphismValue hπ n (a + b) = + standardLubinTateFormalAdd hπ n + (standardLubinTateEndomorphismValue hπ n a) + (standardLubinTateEndomorphismValue hπ n b) := + standardLubinTateEndomorphismEvalAt_add hπ n + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePrimitivePointInteger_hasEval hπ n) a b + +private theorem standardLubinTateEndomorphismEvalAt_eq_of_point_eq + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (x y : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) + (hx : PowerSeries.HasEval x) (hy : PowerSeries.HasEval y) + (hxy : x = y) (a : F.valuationSubring) : + standardLubinTateEndomorphismEvalAt hπ n x hx a = + standardLubinTateEndomorphismEvalAt hπ n y hy a := by + subst y + rfl + +/-- Every standard scalar endomorphism fixes the zero point. -/ +theorem standardLubinTateEndomorphismEvalAt_zero_point + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (a : F.valuationSubring) : + standardLubinTateEndomorphismEvalAt hπ n 0 + PowerSeries.HasEval.zero a = 0 := by + have h := + standardLubinTateEndomorphismEvalAt_mul hπ n 0 + PowerSeries.HasEval.zero a 0 + simpa using h.symm + +/-- A unit scalar acts injectively on the topologically nilpotent elements +of a finite-level integer ring. -/ +theorem standardLubinTateEndomorphismEvalAt_unit_injective + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (u : F.valuationSubringˣ) + {x y : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring} + (hx : PowerSeries.HasEval x) (hy : PowerSeries.HasEval y) + (hxy : + standardLubinTateEndomorphismEvalAt hπ n x hx + (u : F.valuationSubring) = + standardLubinTateEndomorphismEvalAt hπ n y hy + (u : F.valuationSubring)) : + x = y := by + let ux := + standardLubinTateEndomorphismEvalAt hπ n x hx + (u : F.valuationSubring) + let uy := + standardLubinTateEndomorphismEvalAt hπ n y hy + (u : F.valuationSubring) + let hux : PowerSeries.HasEval ux := + standardLubinTateEndomorphismEvalAt_hasEval hπ n x hx + (u : F.valuationSubring) + let huy : PowerSeries.HasEval uy := + standardLubinTateEndomorphismEvalAt_hasEval hπ n y hy + (u : F.valuationSubring) + calc + x = + standardLubinTateEndomorphismEvalAt hπ n x hx + (((u⁻¹ : F.valuationSubringˣ) : F.valuationSubring) * + (u : F.valuationSubring)) := by simp + _ = + standardLubinTateEndomorphismEvalAt hπ n ux hux + ((u⁻¹ : F.valuationSubringˣ) : F.valuationSubring) := + standardLubinTateEndomorphismEvalAt_mul hπ n x hx + ((u⁻¹ : F.valuationSubringˣ) : F.valuationSubring) + (u : F.valuationSubring) + _ = + standardLubinTateEndomorphismEvalAt hπ n uy huy + ((u⁻¹ : F.valuationSubringˣ) : F.valuationSubring) := by + apply + standardLubinTateEndomorphismEvalAt_eq_of_point_eq + hπ n ux uy hux huy + exact hxy + _ = + standardLubinTateEndomorphismEvalAt hπ n y hy + (((u⁻¹ : F.valuationSubringˣ) : F.valuationSubring) * + (u : F.valuationSubring)) := + (standardLubinTateEndomorphismEvalAt_mul hπ n y hy + ((u⁻¹ : F.valuationSubringˣ) : F.valuationSubring) + (u : F.valuationSubring)).symm + _ = y := by simp + +/-- Evaluating `[π ^ r]` is the same as evaluating the `r`-fold standard +division-polynomial iterate. -/ +theorem standardLubinTateEndomorphismEvalAt_uniformizer_pow + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (x : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) + (hx : PowerSeries.HasEval x) (r : ℕ) : + standardLubinTateEndomorphismEvalAt hπ n x hx (π ^ r) = + Polynomial.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) x + (standardLubinTatePolynomialIterate F π r) := by + induction r with + | zero => + simp [standardLubinTatePolynomialIterate_zero] + | succ r ih => + rw [pow_succ', + standardLubinTateEndomorphismEvalAt_mul] + rw [standardLubinTateEndomorphismEvalAt, + SameUniformizer.standardLubinTateEndomorphism_uniformizer, + ← standardLubinTatePolynomial_toPowerSeries_eq_series hπ, + standardLubinTateLevelPowerSeriesEval_coe, ih, + standardLubinTatePolynomialIterate_succ, + Polynomial.eval₂_comp] + +/-- A valuation-ring unit acts on the chosen primitive point by analytic +evaluation of its standard scalar endomorphism. -/ +noncomputable def standardLubinTatePrimitivePointIntegerAction + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (u : F.valuationSubringˣ) : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := + standardLubinTateEndomorphismValue hπ n + (u : F.valuationSubring) + +/-- A unit translate of the primitive point is still topologically +nilpotent. -/ +theorem standardLubinTatePrimitivePointIntegerAction_hasEval + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (u : F.valuationSubringˣ) : + PowerSeries.HasEval + (standardLubinTatePrimitivePointIntegerAction hπ n u) := + standardLubinTateEndomorphismValue_hasEval hπ n + (u : F.valuationSubring) + +/-- The unit `1` fixes the chosen primitive point. -/ +@[simp] +theorem standardLubinTatePrimitivePointIntegerAction_one + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + standardLubinTatePrimitivePointIntegerAction hπ n 1 = + standardLubinTatePrimitivePointInteger hπ n := by + simp [standardLubinTatePrimitivePointIntegerAction] + +/-- Multiplication of unit parameters is composition of their analytic +actions. -/ +theorem standardLubinTatePrimitivePointIntegerAction_mul + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (u w : F.valuationSubringˣ) : + standardLubinTatePrimitivePointIntegerAction hπ n (u * w) = + standardLubinTateEndomorphismEvalAt hπ n + (standardLubinTatePrimitivePointIntegerAction hπ n w) + (standardLubinTatePrimitivePointIntegerAction_hasEval hπ n w) + (u : F.valuationSubring) := by + simpa [standardLubinTatePrimitivePointIntegerAction] using + standardLubinTateEndomorphismValue_mul hπ n + (u : F.valuationSubring) (w : F.valuationSubring) + +/-- The primitive level-`n + 1` point has exact scalar annihilator +`m^(n + 1)`. -/ +theorem standardLubinTateEndomorphismValue_eq_zero_iff_mem_maximalIdeal_pow + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (a : F.valuationSubring) : + standardLubinTateEndomorphismValue hπ n a = 0 ↔ + a ∈ F.toCompleteDVF.maximalIdeal ^ (n + 1) := by + let lambda := standardLubinTatePrimitivePointInteger hπ n + let hlambda := standardLubinTatePrimitivePointInteger_hasEval hπ n + constructor + · intro haZero + by_cases ha : a = 0 + · subst a + exact (F.toCompleteDVF.maximalIdeal ^ (n + 1)).zero_mem + have hπirr : Irreducible π := + (IsDiscreteValuationRing.irreducible_iff_uniformizer π).2 + (F.toCompleteDVF.maximalIdeal_eq_span_uniformizer hπ) + obtain ⟨r, u, hu⟩ := + IsDiscreteValuationRing.eq_unit_mul_pow_irreducible ha hπirr + let z := + standardLubinTateEndomorphismEvalAt hπ n lambda hlambda + (π ^ r) + let hz : PowerSeries.HasEval z := + standardLubinTateEndomorphismEvalAt_hasEval hπ n + lambda hlambda (π ^ r) + have huzero : + standardLubinTateEndomorphismEvalAt hπ n z hz + (u : F.valuationSubring) = 0 := by + calc + standardLubinTateEndomorphismEvalAt hπ n z hz + (u : F.valuationSubring) = + standardLubinTateEndomorphismValue hπ n + ((u : F.valuationSubring) * π ^ r) := by + exact + (standardLubinTateEndomorphismEvalAt_mul hπ n + lambda hlambda (u : F.valuationSubring) (π ^ r)).symm + _ = standardLubinTateEndomorphismValue hπ n a := by + rw [hu] + _ = 0 := haZero + have hzZero : z = 0 := by + apply + standardLubinTateEndomorphismEvalAt_unit_injective + hπ n u hz PowerSeries.HasEval.zero + rw [huzero, + standardLubinTateEndomorphismEvalAt_zero_point] + have hnr : n + 1 ≤ r := by + by_contra hnot + have hrn : r ≤ n := by omega + have hne := + standardLubinTatePrimitivePointInteger_iterate_ne_zero_of_le + hπ n hrn + apply hne + change + Polynomial.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) lambda + (standardLubinTatePolynomialIterate F π r) = 0 + calc + _ = + standardLubinTateEndomorphismEvalAt hπ n lambda hlambda + (π ^ r) := + (standardLubinTateEndomorphismEvalAt_uniformizer_pow + hπ n lambda hlambda r).symm + _ = 0 := by simpa [z] using hzZero + rw [F.toCompleteDVF.maximalIdeal_eq_span_uniformizer hπ, + Ideal.span_singleton_pow, Ideal.mem_span_singleton] + rw [hu] + rcases pow_dvd_pow π hnr with ⟨c, hc⟩ + refine ⟨(u : F.valuationSubring) * c, ?_⟩ + rw [hc] + ring + · intro ha + rw [F.toCompleteDVF.maximalIdeal_eq_span_uniformizer hπ, + Ideal.span_singleton_pow, Ideal.mem_span_singleton] at ha + rcases ha with ⟨d, hd⟩ + have ha' : a = d * π ^ (n + 1) := by + rw [hd, mul_comm] + have hkill : + standardLubinTateEndomorphismValue hπ n (π ^ (n + 1)) = + 0 := by + rw [standardLubinTateEndomorphismValue, + standardLubinTateEndomorphismEvalAt_uniformizer_pow] + simpa [standardLubinTateLevelCoefficientHom] using + standardLubinTatePrimitivePointInteger_iterate_succ_eq_zero + hπ n + calc + standardLubinTateEndomorphismValue hπ n a = + standardLubinTateEndomorphismValue hπ n + (d * π ^ (n + 1)) := by rw [ha'] + _ = + standardLubinTateEndomorphismEvalAt hπ n + (standardLubinTateEndomorphismValue hπ n + (π ^ (n + 1))) + (standardLubinTateEndomorphismValue_hasEval hπ n + (π ^ (n + 1))) d := + standardLubinTateEndomorphismValue_mul hπ n d + (π ^ (n + 1)) + _ = + standardLubinTateEndomorphismEvalAt hπ n 0 + PowerSeries.HasEval.zero d := by + apply + standardLubinTateEndomorphismEvalAt_eq_of_point_eq + hπ n + exact hkill + _ = 0 := + standardLubinTateEndomorphismEvalAt_zero_point hπ n d + +/-- A unit fixes the primitive level-`n + 1` point exactly when it belongs +to `U^(n + 1)`. -/ +theorem + standardLubinTatePrimitivePointIntegerAction_eq_self_iff_mem_higherPrincipalUnitGroup + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (u : F.valuationSubringˣ) : + standardLubinTatePrimitivePointIntegerAction hπ n u = + standardLubinTatePrimitivePointInteger hπ n ↔ + u ∈ CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF + (n + 1) := by + rw [CompleteDVF.higherPrincipalUnitGroup.mem_iff] + constructor + · intro hu + apply + (standardLubinTateEndomorphismValue_eq_zero_iff_mem_maximalIdeal_pow + hπ n ((u : F.valuationSubring) - 1)).mp + have huone : + standardLubinTateEndomorphismValue hπ n + (u : F.valuationSubring) = + standardLubinTateEndomorphismValue hπ n 1 := by + calc + standardLubinTateEndomorphismValue hπ n + (u : F.valuationSubring) = + standardLubinTatePrimitivePointIntegerAction hπ n u := + rfl + _ = standardLubinTatePrimitivePointInteger hπ n := hu + _ = standardLubinTateEndomorphismValue hπ n 1 := + (standardLubinTateEndomorphismValue_one hπ n).symm + calc + standardLubinTateEndomorphismValue hπ n + ((u : F.valuationSubring) - 1) = + standardLubinTateFormalAdd hπ n + (standardLubinTateEndomorphismValue hπ n + (u : F.valuationSubring)) + (standardLubinTateEndomorphismValue hπ n (-1)) := by + simpa [sub_eq_add_neg] using + standardLubinTateEndomorphismValue_add hπ n + (u : F.valuationSubring) (-1) + _ = + standardLubinTateFormalAdd hπ n + (standardLubinTateEndomorphismValue hπ n 1) + (standardLubinTateEndomorphismValue hπ n (-1)) := by + rw [huone] + _ = standardLubinTateEndomorphismValue hπ n (1 + (-1)) := + (standardLubinTateEndomorphismValue_add hπ n 1 (-1)).symm + _ = 0 := by simp + · intro hu + have hzero : + standardLubinTateEndomorphismValue hπ n + ((u : F.valuationSubring) - 1) = 0 := + (standardLubinTateEndomorphismValue_eq_zero_iff_mem_maximalIdeal_pow + hπ n ((u : F.valuationSubring) - 1)).2 hu + change + standardLubinTateEndomorphismValue hπ n + (u : F.valuationSubring) = + standardLubinTatePrimitivePointInteger hπ n + calc + standardLubinTateEndomorphismValue hπ n + (u : F.valuationSubring) = + standardLubinTateEndomorphismValue hπ n + (1 + ((u : F.valuationSubring) - 1)) := by + congr 1 + ring + _ = + standardLubinTateFormalAdd hπ n + (standardLubinTateEndomorphismValue hπ n 1) + (standardLubinTateEndomorphismValue hπ n + ((u : F.valuationSubring) - 1)) := + standardLubinTateEndomorphismValue_add hπ n 1 + ((u : F.valuationSubring) - 1) + _ = + standardLubinTateFormalAdd hπ n + (standardLubinTateEndomorphismValue hπ n 1) + (standardLubinTateEndomorphismValue hπ n 0) := by + rw [hzero, standardLubinTateEndomorphismValue_zero] + _ = standardLubinTateEndomorphismValue hπ n (1 + 0) := + (standardLubinTateEndomorphismValue_add hπ n 1 0).symm + _ = standardLubinTatePrimitivePointInteger hπ n := by simp + +/-- Two unit actions give the same primitive integer point exactly when +their quotient lies in `U^(n + 1)`. -/ +theorem + standardLubinTatePrimitivePointIntegerAction_eq_iff_div_mem_higherPrincipalUnitGroup + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (u w : F.valuationSubringˣ) : + standardLubinTatePrimitivePointIntegerAction hπ n u = + standardLubinTatePrimitivePointIntegerAction hπ n w ↔ + u / w ∈ CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF + (n + 1) := by + constructor + · intro huw + apply + (standardLubinTatePrimitivePointIntegerAction_eq_self_iff_mem_higherPrincipalUnitGroup + hπ n (u / w)).mp + calc + standardLubinTatePrimitivePointIntegerAction hπ n (u / w) = + standardLubinTatePrimitivePointIntegerAction hπ n + (w⁻¹ * u) := by + congr 1 + simp [div_eq_mul_inv, mul_comm] + _ = + standardLubinTateEndomorphismEvalAt hπ n + (standardLubinTatePrimitivePointIntegerAction hπ n u) + (standardLubinTatePrimitivePointIntegerAction_hasEval hπ n u) + ((w⁻¹ : F.valuationSubringˣ) : F.valuationSubring) := + standardLubinTatePrimitivePointIntegerAction_mul hπ n w⁻¹ u + _ = + standardLubinTateEndomorphismEvalAt hπ n + (standardLubinTatePrimitivePointIntegerAction hπ n w) + (standardLubinTatePrimitivePointIntegerAction_hasEval hπ n w) + ((w⁻¹ : F.valuationSubringˣ) : F.valuationSubring) := by + apply + standardLubinTateEndomorphismEvalAt_eq_of_point_eq + hπ n + exact huw + _ = + standardLubinTatePrimitivePointIntegerAction hπ n (w⁻¹ * w) := + (standardLubinTatePrimitivePointIntegerAction_mul + hπ n w⁻¹ w).symm + _ = standardLubinTatePrimitivePointInteger hπ n := by simp + · intro huw + have hfixed := + (standardLubinTatePrimitivePointIntegerAction_eq_self_iff_mem_higherPrincipalUnitGroup + hπ n (u / w)).2 huw + calc + standardLubinTatePrimitivePointIntegerAction hπ n u = + standardLubinTatePrimitivePointIntegerAction hπ n + (w * (u / w)) := by + congr 1 + simp [div_eq_mul_inv, mul_left_comm] + _ = + standardLubinTateEndomorphismEvalAt hπ n + (standardLubinTatePrimitivePointIntegerAction hπ n (u / w)) + (standardLubinTatePrimitivePointIntegerAction_hasEval + hπ n (u / w)) + (w : F.valuationSubring) := + standardLubinTatePrimitivePointIntegerAction_mul hπ n w (u / w) + _ = + standardLubinTateEndomorphismEvalAt hπ n + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePrimitivePointInteger_hasEval hπ n) + (w : F.valuationSubring) := by + apply + standardLubinTateEndomorphismEvalAt_eq_of_point_eq + hπ n + exact hfixed + _ = standardLubinTatePrimitivePointIntegerAction hπ n w := rfl + +/-- The analytic unit action, viewed in the finite-level field. -/ +noncomputable def standardLubinTatePrimitiveLevelAction + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (u : F.valuationSubringˣ) : + standardLubinTateLevelField hπ n := + (standardLubinTatePrimitivePointIntegerAction hπ n u : + standardLubinTateLevelField hπ n) + +/-- The natural embedding of the finite-level integer ring into the fixed +separable closure. -/ +noncomputable def standardLubinTateLevelIntegerToSeparableClosure + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring →+* + SeparableClosure K := + (standardLubinTateLevelField hπ n).val.toRingHom.comp + (standardLubinTateLevelCompleteDVF hπ n).valuation.valuationSubring.subtype + +/-- The natural embedding of the finite-level integer ring into the fixed +separable closure is injective. -/ +theorem standardLubinTateLevelIntegerToSeparableClosure_injective + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + Function.Injective + (standardLubinTateLevelIntegerToSeparableClosure hπ n) := by + intro x y hxy + change + (standardLubinTateLevelField hπ n).val + (x : standardLubinTateLevelField hπ n) = + (standardLubinTateLevelField hπ n).val + (y : standardLubinTateLevelField hπ n) at hxy + apply Subtype.ext + exact (standardLubinTateLevelField hπ n).val.injective hxy + +/-- On base coefficients, the level-integer embedding is the fixed +embedding of the base field into its separable closure. -/ +theorem standardLubinTateLevelIntegerToSeparableClosure_comp_coefficientHom + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + (standardLubinTateLevelIntegerToSeparableClosure hπ n).comp + (standardLubinTateLevelCoefficientHom hπ n) = + (algebraMap K (SeparableClosure K)).comp + (algebraMap F.valuationSubring K) := by + apply RingHom.ext + intro a + simp only [RingHom.comp_apply] + change + ((standardLubinTateLevelField hπ n).val + (((standardLubinTateLevelCoefficientHom hπ n) a : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) : + standardLubinTateLevelField hπ n)) = + algebraMap K (SeparableClosure K) + (algebraMap F.valuationSubring K a) + rw [standardLubinTateLevelCoefficientHom_apply] + exact (standardLubinTateLevelField hπ n).val.commutes + (algebraMap F.valuationSubring K a) + +/-- The analytic unit action, transported from the level integer ring to +the chosen finite-level field. -/ +noncomputable def standardLubinTatePrimitiveRootAction + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (u : F.valuationSubringˣ) : + SeparableClosure K := + standardLubinTateLevelIntegerToSeparableClosure hπ n + (standardLubinTatePrimitivePointIntegerAction hπ n u) + +/-- Coercing the finite-level action to the fixed separable closure gives +the primitive-root action. -/ +@[simp] +theorem standardLubinTatePrimitiveLevelAction_coe + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (u : F.valuationSubringˣ) : + ((standardLubinTatePrimitiveLevelAction hπ n u : + standardLubinTateLevelField hπ n) : SeparableClosure K) = + standardLubinTatePrimitiveRootAction hπ n u := + rfl + +/-- The identity unit fixes the chosen primitive root. -/ +@[simp] +theorem standardLubinTatePrimitiveRootAction_one + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + standardLubinTatePrimitiveRootAction hπ n 1 = + chosenStandardLubinTatePrimitiveRoot hπ n := by + change + standardLubinTateLevelIntegerToSeparableClosure hπ n + (standardLubinTatePrimitivePointIntegerAction hπ n 1) = + chosenStandardLubinTatePrimitiveRoot hπ n + rw [standardLubinTatePrimitivePointIntegerAction_one] + change + ((standardLubinTatePrimitivePointInteger hπ n : + standardLubinTateLevelField hπ n) : SeparableClosure K) = + chosenStandardLubinTatePrimitiveRoot hπ n + rw [standardLubinTatePrimitivePointInteger_coe] + exact standardLubinTateLevelGenerator_coe hπ n + +/-- Equality of primitive-root actions can be checked already in the +finite-level integer ring. -/ +theorem standardLubinTatePrimitiveRootAction_eq_iff_integerAction_eq + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (u w : F.valuationSubringˣ) : + standardLubinTatePrimitiveRootAction hπ n u = + standardLubinTatePrimitiveRootAction hπ n w ↔ + standardLubinTatePrimitivePointIntegerAction hπ n u = + standardLubinTatePrimitivePointIntegerAction hπ n w := by + change + standardLubinTateLevelIntegerToSeparableClosure hπ n + (standardLubinTatePrimitivePointIntegerAction hπ n u) = + standardLubinTateLevelIntegerToSeparableClosure hπ n + (standardLubinTatePrimitivePointIntegerAction hπ n w) ↔ + standardLubinTatePrimitivePointIntegerAction hπ n u = + standardLubinTatePrimitivePointIntegerAction hπ n w + constructor + · intro h + exact + (standardLubinTateLevelIntegerToSeparableClosure_injective hπ n) h + · exact congrArg (standardLubinTateLevelIntegerToSeparableClosure hπ n) + +/-- Two unit actions give the same primitive root exactly when their +quotient lies in `U^(n + 1)`. -/ +theorem + standardLubinTatePrimitiveRootAction_eq_iff_div_mem_higherPrincipalUnitGroup + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (u w : F.valuationSubringˣ) : + standardLubinTatePrimitiveRootAction hπ n u = + standardLubinTatePrimitiveRootAction hπ n w ↔ + u / w ∈ CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF + (n + 1) := by + rw [standardLubinTatePrimitiveRootAction_eq_iff_integerAction_eq, + standardLubinTatePrimitivePointIntegerAction_eq_iff_div_mem_higherPrincipalUnitGroup] + +/-- Unit parameters in the same higher-principal-unit coset give the same +primitive root. -/ +theorem + standardLubinTatePrimitiveRootAction_eq_of_div_mem_higherPrincipalUnitGroup + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + {u w : F.valuationSubringˣ} + (huw : + u / w ∈ CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF + (n + 1)) : + standardLubinTatePrimitiveRootAction hπ n u = + standardLubinTatePrimitiveRootAction hπ n w := + (standardLubinTatePrimitiveRootAction_eq_iff_div_mem_higherPrincipalUnitGroup + hπ n u w).2 huw + +/-- A unit translate of the chosen primitive point is again a root of the +level-`n + 1` primitive division polynomial. -/ +theorem standardLubinTatePrimitiveRootAction_isRoot + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (u : F.valuationSubringˣ) : + ((standardLubinTatePrimitivePolynomialOverField F π n).map + (algebraMap K (SeparableClosure K))).IsRoot + (standardLubinTatePrimitiveRootAction hπ n u) := by + let lambda := standardLubinTatePrimitivePointInteger hπ n + let hlambda : PowerSeries.HasEval lambda := + standardLubinTatePrimitivePointInteger_hasEval hπ n + let y := standardLubinTatePrimitivePointIntegerAction hπ n u + let hy : PowerSeries.HasEval y := + standardLubinTatePrimitivePointIntegerAction_hasEval hπ n u + have hkillLambda : + standardLubinTateEndomorphismValue hπ n (π ^ (n + 1)) = 0 := by + rw [standardLubinTateEndomorphismValue, + standardLubinTateEndomorphismEvalAt_uniformizer_pow] + simpa [standardLubinTateLevelCoefficientHom] using + standardLubinTatePrimitivePointInteger_iterate_succ_eq_zero hπ n + have hySucc : + Polynomial.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) y + (standardLubinTatePolynomialIterate F π (n + 1)) = 0 := by + rw [← standardLubinTateEndomorphismEvalAt_uniformizer_pow + hπ n y hy (n + 1)] + calc + standardLubinTateEndomorphismEvalAt hπ n y hy + (π ^ (n + 1)) = + standardLubinTateEndomorphismValue hπ n + (π ^ (n + 1) * (u : F.valuationSubring)) := by + simpa [y, standardLubinTatePrimitivePointIntegerAction] using + (standardLubinTateEndomorphismValue_mul hπ n + (π ^ (n + 1)) (u : F.valuationSubring)).symm + _ = + standardLubinTateEndomorphismValue hπ n + ((u : F.valuationSubring) * π ^ (n + 1)) := by + rw [mul_comm] + _ = + standardLubinTateEndomorphismEvalAt hπ n + (standardLubinTateEndomorphismValue hπ n (π ^ (n + 1))) + (standardLubinTateEndomorphismValue_hasEval hπ n + (π ^ (n + 1))) + (u : F.valuationSubring) := + standardLubinTateEndomorphismValue_mul hπ n + (u : F.valuationSubring) (π ^ (n + 1)) + _ = + standardLubinTateEndomorphismEvalAt hπ n 0 + PowerSeries.HasEval.zero (u : F.valuationSubring) := by + apply + standardLubinTateEndomorphismEvalAt_eq_of_point_eq + hπ n + exact hkillLambda + _ = 0 := + standardLubinTateEndomorphismEvalAt_zero_point hπ n + (u : F.valuationSubring) + have hyN : + Polynomial.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) y + (standardLubinTatePolynomialIterate F π n) ≠ 0 := by + intro hyNZero + have hyEvalZero : + standardLubinTateEndomorphismEvalAt hπ n y hy (π ^ n) = 0 := by + rw [standardLubinTateEndomorphismEvalAt_uniformizer_pow] + exact hyNZero + let z := standardLubinTateEndomorphismValue hπ n (π ^ n) + let hz : PowerSeries.HasEval z := + standardLubinTateEndomorphismValue_hasEval hπ n (π ^ n) + have huzero : + standardLubinTateEndomorphismEvalAt hπ n z hz + (u : F.valuationSubring) = 0 := by + calc + standardLubinTateEndomorphismEvalAt hπ n z hz + (u : F.valuationSubring) = + standardLubinTateEndomorphismValue hπ n + ((u : F.valuationSubring) * π ^ n) := by + simpa [z] using + (standardLubinTateEndomorphismValue_mul hπ n + (u : F.valuationSubring) (π ^ n)).symm + _ = + standardLubinTateEndomorphismValue hπ n + (π ^ n * (u : F.valuationSubring)) := by + rw [mul_comm] + _ = + standardLubinTateEndomorphismEvalAt hπ n y hy (π ^ n) := by + simpa [y, standardLubinTatePrimitivePointIntegerAction] using + standardLubinTateEndomorphismValue_mul hπ n + (π ^ n) (u : F.valuationSubring) + _ = 0 := hyEvalZero + have hzZero : z = 0 := by + apply + standardLubinTateEndomorphismEvalAt_unit_injective + hπ n u hz PowerSeries.HasEval.zero + rw [huzero, + standardLubinTateEndomorphismEvalAt_zero_point] + have hne := + standardLubinTatePrimitivePointInteger_iterate_ne_zero_of_le + hπ n (show n ≤ n from le_rfl) + apply hne + change + Polynomial.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) lambda + (standardLubinTatePolynomialIterate F π n) = 0 + calc + _ = + standardLubinTateEndomorphismEvalAt hπ n lambda hlambda + (π ^ n) := + (standardLubinTateEndomorphismEvalAt_uniformizer_pow + hπ n lambda hlambda n).symm + _ = standardLubinTateEndomorphismValue hπ n (π ^ n) := rfl + _ = 0 := by simpa [z] using hzZero + have hfactor := + congrArg + (Polynomial.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) y) + (standardLubinTatePolynomialIterate_succ_factor F π n) + rw [hySucc, Polynomial.eval₂_mul] at hfactor + have hprimitive : + Polynomial.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) y + (standardLubinTatePrimitivePolynomial F π n) = 0 := + (mul_eq_zero.mp hfactor.symm).resolve_left hyN + have hprimitiveMap := + congrArg (standardLubinTateLevelIntegerToSeparableClosure hπ n) + hprimitive + rw [map_zero, Polynomial.hom_eval₂, + standardLubinTateLevelIntegerToSeparableClosure_comp_coefficientHom] + at hprimitiveMap + simpa [Polynomial.IsRoot, + standardLubinTatePrimitivePolynomialOverField, + standardLubinTatePrimitiveRootAction, + Polynomial.eval_map, Polynomial.eval₂_map, y] using hprimitiveMap + +end AnalyticAction + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean new file mode 100644 index 0000000000..8dab267f1c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean @@ -0,0 +1,997 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedIterates +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelValuation +public import Mathlib.RingTheory.MvPowerSeries.Inverse +public import Mathlib.RingTheory.PowerSeries.Inverse +/-! +# Displacements of primitive Lubin--Tate points + +For the primitive point at level `n + 1`, a unit whose first nontrivial +principal-unit layer is `k` displaces that point by an element of normalized +additive valuation `q ^ k`. + +The analytic input is proved here rather than assumed. A unit scalar +endomorphism is `X` times an invertible power series. Likewise +`F(X, Y) - X` for the standard formal group is `Y` times an invertible +two-variable power series. Consequently neither operation changes the +valuation of the topologically nilpotent input that it multiplies. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial PowerSeries + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +open RamificationTheory.HilbertRamification.Higher +open ValuationTheory.DiscreteValuationField + +variable {K : Type u} [Field K] +variable {F : LocalField.{u, v} K} {π : F.valuationSubring} + +section FormalFactors + +private theorem coeff_subst_X_zero + {R : Type*} [CommRing R] + (f : MvPowerSeries (Fin 2) R) (d : Fin 2 →₀ ℕ) + (hd : d 1 = 0) : + PowerSeries.coeff (d 0) + (MvPowerSeries.subst + ![(PowerSeries.X : PowerSeries R), 0] f) = + MvPowerSeries.coeff d f := by + rw [PowerSeries.coeff, MvPowerSeries.coeff_subst, + finsum_eq_single _ d] + · simp [hd, PowerSeries.coeff_X_pow] + · intro e hed + by_cases he : e 1 = 0 + · have he0 : e 0 ≠ d 0 := by + intro he0 + apply hed + ext i + fin_cases i + · exact he0 + · exact he.trans hd.symm + simp [he, PowerSeries.coeff_X_pow, he0.symm] + · simp [he] + · exact MvPowerSeries.HasSubst.X_zero + +/-- The standard formal-group difference `F(X,Y) - X` is divisible by +`Y`. -/ +private theorem standardLubinTateFormalGroup_rightDisplacement_dvd + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + (MvPowerSeries.X (1 : Fin 2) : + MvPowerSeries (Fin 2) F.valuationSubring) ∣ + SameUniformizer.standardFormalGroupPowerSeries hπ - + MvPowerSeries.X (0 : Fin 2) := by + rw [MvPowerSeries.X_dvd_iff] + intro d hd + let D := + SameUniformizer.standardFormalGroupPowerSeries hπ - + MvPowerSeries.X (0 : Fin 2) + have hhas : + MvPowerSeries.HasSubst + (![(PowerSeries.X : PowerSeries F.valuationSubring), 0] : + Fin 2 → PowerSeries F.valuationSubring) := by + apply MvPowerSeries.hasSubst_of_constantCoeff_zero + intro i + fin_cases i + · simpa only [Fin.zero_eta, Matrix.cons_val_zero, + PowerSeries.X_apply] using + (MvPowerSeries.constantCoeff_X + (R := F.valuationSubring) ()) + · simp + have hsubst : + MvPowerSeries.subst + ![(PowerSeries.X : PowerSeries F.valuationSubring), 0] D = + 0 := by + dsimp only [D] + rw [MvPowerSeries.subst_sub hhas] + have hformal : + MvPowerSeries.subst + ![(PowerSeries.X : PowerSeries F.valuationSubring), 0] + (SameUniformizer.standardFormalGroupPowerSeries hπ) = + PowerSeries.X := by + simpa only [PowerSeries.X_apply] using + SameUniformizer.standardFormalGroupPowerSeries_subst_X_zero hπ + rw [hformal, MvPowerSeries.subst_X hhas] + exact sub_self _ + have hcoeff := + congrArg (PowerSeries.coeff (d 0)) hsubst + rw [coeff_subst_X_zero D d hd] at hcoeff + simpa [D] using hcoeff + +/-- The quotient of `F(X,Y) - X` by `Y`. -/ +private noncomputable def standardLubinTateFormalGroupRightDisplacementFactor + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + MvPowerSeries (Fin 2) F.valuationSubring := + Classical.choose + (standardLubinTateFormalGroup_rightDisplacement_dvd hπ) + +/-- Factorization of the ordinary displacement in the standard formal +group. -/ +private theorem standardLubinTateFormalGroup_rightDisplacement_factor + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + SameUniformizer.standardFormalGroupPowerSeries hπ - + MvPowerSeries.X (0 : Fin 2) = + MvPowerSeries.X (1 : Fin 2) * + standardLubinTateFormalGroupRightDisplacementFactor hπ := + Classical.choose_spec + (standardLubinTateFormalGroup_rightDisplacement_dvd hπ) + +/-- The formal-group displacement factor has constant coefficient one. -/ +private theorem + standardLubinTateFormalGroupRightDisplacementFactor_constantCoeff + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + MvPowerSeries.constantCoeff + (standardLubinTateFormalGroupRightDisplacementFactor hπ) = 1 := by + let H := standardLubinTateFormalGroupRightDisplacementFactor hπ + have hfactor := + congrArg + (MvPowerSeries.coeff + (Finsupp.single (1 : Fin 2) 1)) + (standardLubinTateFormalGroup_rightDisplacement_factor hπ) + have hleft : + MvPowerSeries.coeff (Finsupp.single (1 : Fin 2) 1) + (SameUniformizer.standardFormalGroupPowerSeries hπ - + MvPowerSeries.X (0 : Fin 2)) = 1 := by + rw [map_sub, + (SameUniformizer.standardFormalGroupPowerSeries_hasLinearTerm + hπ).coeff_single] + simp [MvPowerSeries.coeff_index_single_X] + have hright : + MvPowerSeries.coeff (Finsupp.single (1 : Fin 2) 1) + (MvPowerSeries.X (1 : Fin 2) * H) = + MvPowerSeries.constantCoeff H := by + rw [MvPowerSeries.X_def] + simpa only [add_zero, one_mul, + MvPowerSeries.coeff_zero_eq_constantCoeff_apply] using + (MvPowerSeries.coeff_add_monomial_mul + (m := Finsupp.single (1 : Fin 2) 1) + (n := 0) H 1) + rw [hleft, hright] at hfactor + exact hfactor.symm + +/-- The formal-group displacement factor is invertible. -/ +private theorem standardLubinTateFormalGroupRightDisplacementFactor_isUnit + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + IsUnit (standardLubinTateFormalGroupRightDisplacementFactor hπ) := by + rw [MvPowerSeries.isUnit_iff_constantCoeff, + standardLubinTateFormalGroupRightDisplacementFactor_constantCoeff] + exact isUnit_one + +/-- The factor left after removing `X` from the scalar endomorphism +`[a](X)`. -/ +private noncomputable def standardLubinTateEndomorphismLinearFactor + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (a : F.valuationSubring) : + PowerSeries F.valuationSubring := + PowerSeries.mk fun m => + PowerSeries.coeff (m + 1) + (SameUniformizer.standardLubinTateEndomorphism hπ a) + +/-- A standard scalar endomorphism is `X` times its linear factor. -/ +private theorem standardLubinTateEndomorphism_eq_X_mul_linearFactor + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (a : F.valuationSubring) : + SameUniformizer.standardLubinTateEndomorphism hπ a = + PowerSeries.X * + standardLubinTateEndomorphismLinearFactor hπ a := by + have hsplit := + PowerSeries.eq_X_mul_shift_add_const + (SameUniformizer.standardLubinTateEndomorphism hπ a) + have hconstant : + PowerSeries.constantCoeff + (SameUniformizer.standardLubinTateEndomorphism hπ a) = 0 := + (SameUniformizer.standardLubinTateEndomorphism_hasLinearTerm + hπ a).constantCoeff_eq_zero + calc + SameUniformizer.standardLubinTateEndomorphism hπ a = + PowerSeries.X * + standardLubinTateEndomorphismLinearFactor hπ a + + PowerSeries.C + (PowerSeries.constantCoeff + (SameUniformizer.standardLubinTateEndomorphism hπ a)) := hsplit + _ = PowerSeries.X * + standardLubinTateEndomorphismLinearFactor hπ a := by + rw [hconstant, map_zero, add_zero] + +/-- The constant coefficient of the linear factor is the scalar. -/ +private theorem standardLubinTateEndomorphismLinearFactor_constantCoeff + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (a : F.valuationSubring) : + PowerSeries.constantCoeff + (standardLubinTateEndomorphismLinearFactor hπ a) = a := by + change + PowerSeries.coeff 1 + (SameUniformizer.standardLubinTateEndomorphism hπ a) = a + exact SameUniformizer.standardLubinTateEndomorphism_coeff_one hπ a + +/-- The linear factor of a unit scalar endomorphism is invertible. -/ +private theorem standardLubinTateEndomorphismLinearFactor_isUnit + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (a : F.valuationSubringˣ) : + IsUnit + (standardLubinTateEndomorphismLinearFactor hπ + (a : F.valuationSubring)) := by + rw [PowerSeries.isUnit_iff_constantCoeff, + standardLubinTateEndomorphismLinearFactor_constantCoeff] + exact a.isUnit + +end FormalFactors + +section AnalyticValuation + +/-- Use the discrete uniform structure on the coefficient valuation ring. -/ +noncomputable local instance + standardLubinTatePrimitiveDisplacementCoefficientUniformSpace : + UniformSpace F.valuationSubring := + ⊥ + +/-- Use the target maximal ideal for its adic topology. -/ +noncomputable local instance + standardLubinTatePrimitiveDisplacementTargetWithIdeal + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + WithIdeal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring where + i := (standardLubinTateLevelCompleteDVF hπ n).maximalIdeal + +/-- The target valuation ring is complete in its adic topology. -/ +noncomputable local instance + standardLubinTatePrimitiveDisplacementTargetCompleteSpace + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + CompleteSpace + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := by + let target := standardLubinTateLevelCompleteDVF hπ n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).1 + +/-- The target valuation ring has a Hausdorff adic topology. -/ +noncomputable local instance + standardLubinTatePrimitiveDisplacementTargetT2Space + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + T2Space + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := by + let target := standardLubinTateLevelCompleteDVF hπ n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).2 + +/-- The level coefficient map gives the target valuation ring its coefficient algebra. -/ +noncomputable local instance + standardLubinTatePrimitiveDisplacementAlgebra + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + Algebra F.valuationSubring + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := + (standardLubinTateLevelCoefficientHom hπ n).toAlgebra + +private theorem hasEval_fin_two + {R : Type*} [CommRing R] [TopologicalSpace R] + {x y : R} (hx : PowerSeries.HasEval x) + (hy : PowerSeries.HasEval y) : + MvPowerSeries.HasEval (![x, y] : Fin 2 → R) := by + constructor + · intro i + fin_cases i + · exact hx + · exact hy + · simp [Filter.cofinite_eq_bot] + +private theorem + standardLubinTateEndomorphismEvalAt_congr_point_forPrimitiveDisplacement + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (x y : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) + (hx : PowerSeries.HasEval x) (hy : PowerSeries.HasEval y) + (hxy : x = y) (a : F.valuationSubring) : + standardLubinTateEndomorphismEvalAt hπ n x hx a = + standardLubinTateEndomorphismEvalAt hπ n y hy a := by + subst y + rfl + +/-- Ordinary subtraction after standard formal-group addition has the same +additive valuation as the added topologically nilpotent point. -/ +theorem standardLubinTateFormalAdd_sub_left_addVal + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (x z : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) + (hx : PowerSeries.HasEval x) (hz : PowerSeries.HasEval z) : + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (standardLubinTateFormalAdd hπ n x z - x) = + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring z := by + let hvec : MvPowerSeries.HasEval (![x, z] : Fin 2 → + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) := + hasEval_fin_two hx hz + let ev : + MvPowerSeries (Fin 2) F.valuationSubring →+* + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := + MvPowerSeries.eval₂Hom + (φ := standardLubinTateLevelCoefficientHom hπ n) + continuous_of_discreteTopology hvec + let e := + ev (standardLubinTateFormalGroupRightDisplacementFactor hπ) + have he : IsUnit e := + (standardLubinTateFormalGroupRightDisplacementFactor_isUnit hπ).map ev + have hfactor := congrArg ev + (standardLubinTateFormalGroup_rightDisplacement_factor hπ) + have hdisplacement : + standardLubinTateFormalAdd hπ n x z - x = z * e := by + calc + standardLubinTateFormalAdd hπ n x z - x = + ev (SameUniformizer.standardFormalGroupPowerSeries hπ) - + ev (MvPowerSeries.X (0 : Fin 2)) := by + simp [standardLubinTateFormalAdd, ev, + MvPowerSeries.coe_eval₂Hom] + _ = + ev + (SameUniformizer.standardFormalGroupPowerSeries hπ - + MvPowerSeries.X (0 : Fin 2)) := + (map_sub ev _ _).symm + _ = + ev + (MvPowerSeries.X (1 : Fin 2) * + standardLubinTateFormalGroupRightDisplacementFactor hπ) := + hfactor + _ = + ev (MvPowerSeries.X (1 : Fin 2)) * + ev (standardLubinTateFormalGroupRightDisplacementFactor hπ) := + map_mul ev _ _ + _ = z * e := by + simp [ev, e, MvPowerSeries.coe_eval₂Hom] + rw [hdisplacement, IsDiscreteValuationRing.addVal_mul, + (IsDiscreteValuationRing.addVal_eq_zero_iff).2 he, add_zero] + +/-- A unit scalar endomorphism preserves normalized additive valuation on +every topologically nilpotent point of a finite level. -/ +theorem standardLubinTateEndomorphismEvalAt_unit_addVal + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + (x : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) + (hx : PowerSeries.HasEval x) (a : F.valuationSubringˣ) : + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (standardLubinTateEndomorphismEvalAt hπ n x hx + (a : F.valuationSubring)) = + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring x := by + let ev := + standardLubinTateLevelPowerSeriesEval hπ n x hx + let e := + ev (standardLubinTateEndomorphismLinearFactor hπ + (a : F.valuationSubring)) + have he : IsUnit e := + (standardLubinTateEndomorphismLinearFactor_isUnit hπ a).map ev + have hfactor := congrArg ev + (standardLubinTateEndomorphism_eq_X_mul_linearFactor + hπ (a : F.valuationSubring)) + have heval : + standardLubinTateEndomorphismEvalAt hπ n x hx + (a : F.valuationSubring) = + x * e := by + simpa [standardLubinTateEndomorphismEvalAt, ev, e] using hfactor + rw [heval, IsDiscreteValuationRing.addVal_mul, + (IsDiscreteValuationRing.addVal_eq_zero_iff).2 he, add_zero] + +/-- The analytic value of `[π^k]` is the evaluated standard polynomial +iterate. -/ +theorem standardLubinTateEndomorphismValue_uniformizer_pow + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n k : ℕ) : + standardLubinTateEndomorphismValue hπ n (π ^ k) = + standardLubinTatePrimitivePointIterateInteger hπ n k := by + exact + standardLubinTateEndomorphismEvalAt_uniformizer_pow hπ n + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePrimitivePointInteger_hasEval hπ n) k + +/-- Every evaluated standard iterate before the annihilating level is +topologically nilpotent. -/ +theorem standardLubinTatePrimitivePointIterateInteger_hasEval + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n k : ℕ) : + PowerSeries.HasEval + (standardLubinTatePrimitivePointIterateInteger hπ n k) := by + rw [← standardLubinTateEndomorphismValue_uniformizer_pow hπ n k] + exact standardLubinTateEndomorphismValue_hasEval hπ n (π ^ k) + +/-- An element in the exact `k`th principal-unit layer is a unit times +`π^k`. -/ +private theorem exists_unit_mul_uniformizer_pow_of_exactDepth + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (a : F.valuationSubringˣ) (k : ℕ) + (ha : + a ∈ CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF k) + (hnot : + a ∉ CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (k + 1)) : + ∃ c : F.valuationSubringˣ, + (a : F.valuationSubring) - 1 = + (c : F.valuationSubring) * π ^ k := by + have hamem : + (a : F.valuationSubring) - 1 ∈ + F.toCompleteDVF.maximalIdeal ^ k := + (CompleteDVF.higherPrincipalUnitGroup.mem_iff + F.toCompleteDVF k a).mp ha + have hanot : + (a : F.valuationSubring) - 1 ∉ + F.toCompleteDVF.maximalIdeal ^ (k + 1) := by + intro h + exact hnot + ((CompleteDVF.higherPrincipalUnitGroup.mem_iff + F.toCompleteDVF (k + 1) a).mpr h) + have hdiv : + π ^ k ∣ (a : F.valuationSubring) - 1 := + (F.toCompleteDVF.mem_maximalIdeal_pow_iff_uniformizer_pow_dvd + hπ k).mp hamem + rcases hdiv with ⟨c, hc⟩ + have hcnot : c ∉ F.toCompleteDVF.maximalIdeal := by + intro hcmem + have hdeep : + c * π ^ k ∈ F.toCompleteDVF.maximalIdeal ^ (k + 1) := + (F.toCompleteDVF.toDVF + |>.mul_uniformizer_pow_mem_maximalIdeal_pow_succ_iff + hπ k c).mpr hcmem + apply hanot + rw [hc, mul_comm] + exact hdeep + have hcunit : IsUnit c := + (IsLocalRing.notMem_maximalIdeal).mp hcnot + rcases hcunit with ⟨cunit, rfl⟩ + refine ⟨cunit, ?_⟩ + simpa [mul_comm] using hc + +/-- Exact principal-unit depth controls the valuation of `[a - 1]` at the +primitive point. -/ +theorem standardLubinTateEndomorphismValue_sub_one_addVal_of_exactDepth + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : F.valuationSubringˣ) (k : ℕ) + (ha : + a ∈ CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF k) + (hnot : + a ∉ CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (k + 1)) + (hk : k ≤ n) : + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (standardLubinTateEndomorphismValue hπ n + ((a : F.valuationSubring) - 1)) = + (Nat.card F.residueField ^ k : ℕ) := by + obtain ⟨c, hc⟩ := + exists_unit_mul_uniformizer_pow_of_exactDepth hπ a k ha hnot + calc + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (standardLubinTateEndomorphismValue hπ n + ((a : F.valuationSubring) - 1)) = + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (standardLubinTateEndomorphismEvalAt hπ n + (standardLubinTatePrimitivePointIterateInteger hπ n k) + (standardLubinTatePrimitivePointIterateInteger_hasEval hπ n k) + (c : F.valuationSubring)) := by + rw [hc, standardLubinTateEndomorphismValue_mul] + apply congrArg + (IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) + exact + standardLubinTateEndomorphismEvalAt_congr_point_forPrimitiveDisplacement + hπ n + (standardLubinTateEndomorphismValue hπ n (π ^ k)) + (standardLubinTatePrimitivePointIterateInteger hπ n k) + (standardLubinTateEndomorphismValue_hasEval hπ n (π ^ k)) + (standardLubinTatePrimitivePointIterateInteger_hasEval hπ n k) + (standardLubinTateEndomorphismValue_uniformizer_pow hπ n k) + (c : F.valuationSubring) + _ = + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (standardLubinTatePrimitivePointIterateInteger hπ n k) := + standardLubinTateEndomorphismEvalAt_unit_addVal hπ n + (standardLubinTatePrimitivePointIterateInteger hπ n k) + (standardLubinTatePrimitivePointIterateInteger_hasEval hπ n k) c + _ = (Nat.card F.residueField ^ k : ℕ) := + standardLubinTatePrimitivePointIterateInteger_addVal hπ n k hk + +/-- If a unit first differs from `1` in principal-unit depth `k`, its +ordinary displacement of the primitive point has valuation exactly +`q^k`. -/ +theorem + standardLubinTatePrimitivePointIntegerAction_sub_self_addVal_of_exactDepth + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : F.valuationSubringˣ) (k : ℕ) + (ha : + a ∈ CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF k) + (hnot : + a ∉ CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (k + 1)) + (hk : k ≤ n) : + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (standardLubinTatePrimitivePointIntegerAction hπ n a - + standardLubinTatePrimitivePointInteger hπ n) = + (Nat.card F.residueField ^ k : ℕ) := by + let lambda := standardLubinTatePrimitivePointInteger hπ n + let z := + standardLubinTateEndomorphismValue hπ n + ((a : F.valuationSubring) - 1) + have haction : + standardLubinTatePrimitivePointIntegerAction hπ n a = + standardLubinTateFormalAdd hπ n lambda z := by + change + standardLubinTateEndomorphismValue hπ n + (a : F.valuationSubring) = + standardLubinTateFormalAdd hπ n lambda z + calc + standardLubinTateEndomorphismValue hπ n + (a : F.valuationSubring) = + standardLubinTateEndomorphismValue hπ n + (1 + ((a : F.valuationSubring) - 1)) := by + congr 1 + ring + _ = + standardLubinTateFormalAdd hπ n + (standardLubinTateEndomorphismValue hπ n 1) + (standardLubinTateEndomorphismValue hπ n + ((a : F.valuationSubring) - 1)) := + standardLubinTateEndomorphismValue_add hπ n 1 + ((a : F.valuationSubring) - 1) + _ = standardLubinTateFormalAdd hπ n lambda z := by + rw [standardLubinTateEndomorphismValue_one] + rw [haction] + calc + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (standardLubinTateFormalAdd hπ n lambda z - lambda) = + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring z := + standardLubinTateFormalAdd_sub_left_addVal hπ n lambda z + (standardLubinTatePrimitivePointInteger_hasEval hπ n) + (standardLubinTateEndomorphismValue_hasEval hπ n + ((a : F.valuationSubring) - 1)) + _ = (Nat.card F.residueField ^ k : ℕ) := + standardLubinTateEndomorphismValue_sub_one_addVal_of_exactDepth + hπ n a k ha hnot hk + +/-- Principal-unit membership is antitone in the depth index. -/ +private theorem higherPrincipalUnitGroup_mem_of_le + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (a : F.valuationSubringˣ) {k r : ℕ} (hkr : k ≤ r) + (ha : + a ∈ CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF r) : + a ∈ CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF k := by + rw [CompleteDVF.higherPrincipalUnitGroup.mem_iff] at ha ⊢ + rw [F.toCompleteDVF.mem_maximalIdeal_pow_iff_uniformizer_pow_dvd + hπ r] at ha + rw [F.toCompleteDVF.mem_maximalIdeal_pow_iff_uniformizer_pow_dvd + hπ k] + exact (pow_dvd_pow π hkr).trans ha + +/-- If `a - 1` is a unit times `π^r`, then membership in `U^k` is +equivalent to `k ≤ r`. -/ +private theorem + mem_higherPrincipalUnitGroup_iff_le_of_sub_eq_unit_mul_uniformizer_pow + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (a c : F.valuationSubringˣ) (r k : ℕ) + (hsub : + (a : F.valuationSubring) - 1 = + (c : F.valuationSubring) * π ^ r) : + a ∈ CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF k ↔ + k ≤ r := by + rw [CompleteDVF.higherPrincipalUnitGroup.mem_iff, + F.toCompleteDVF.mem_maximalIdeal_pow_iff_uniformizer_pow_dvd hπ k] + constructor + · intro hdiv + by_contra hkr + have hrk : r + 1 ≤ k := by omega + have hdeepDiv : + π ^ (r + 1) ∣ (a : F.valuationSubring) - 1 := + (pow_dvd_pow π hrk).trans hdiv + have hdeep : + (a : F.valuationSubring) - 1 ∈ + F.toCompleteDVF.maximalIdeal ^ (r + 1) := + (F.toCompleteDVF.mem_maximalIdeal_pow_iff_uniformizer_pow_dvd + hπ (r + 1)).mpr hdeepDiv + have hcmem : (c : F.valuationSubring) ∈ + F.toCompleteDVF.maximalIdeal := by + exact + (F.toCompleteDVF.toDVF + |>.mul_uniformizer_pow_mem_maximalIdeal_pow_succ_iff + hπ r (c : F.valuationSubring)).mp (by + simpa [hsub] using hdeep) + exact + ((IsLocalRing.notMem_maximalIdeal).mpr c.isUnit) hcmem + · intro hkr + rcases pow_dvd_pow π hkr with ⟨b, hb⟩ + refine ⟨(c : F.valuationSubring) * b, ?_⟩ + rw [hsub, hb] + ring + +/-- At a standard finite level, the valuation threshold `q^k` detects +exactly the `k`th principal-unit subgroup. The statement includes the +identity action, whose displacement has infinite additive valuation. -/ +theorem + standardLubinTatePrimitivePointIntegerAction_sub_self_addVal_ge_iff_mem + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : F.valuationSubringˣ) (k : ℕ) + (hk : k ≤ n + 1) : + ((Nat.card F.residueField ^ k : ℕ) : ℕ∞) ≤ + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (standardLubinTatePrimitivePointIntegerAction hπ n a - + standardLubinTatePrimitivePointInteger hπ n) ↔ + a ∈ CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF k := by + by_cases hdeep : + a ∈ CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1) + · have hfix := + (standardLubinTatePrimitivePointIntegerAction_eq_self_iff_mem_higherPrincipalUnitGroup + hπ n a).2 hdeep + have hmem := + higherPrincipalUnitGroup_mem_of_le hπ a hk hdeep + constructor + · intro + exact hmem + · intro + rw [hfix, sub_self] + simp + · have hsubne : + (a : F.valuationSubring) - 1 ≠ 0 := by + intro hzero + apply hdeep + rw [CompleteDVF.higherPrincipalUnitGroup.mem_iff] + simp [hzero] + have hπirr : Irreducible π := + (IsDiscreteValuationRing.irreducible_iff_uniformizer π).2 + (F.toCompleteDVF.maximalIdeal_eq_span_uniformizer hπ) + obtain ⟨r, c, hsub⟩ := + IsDiscreteValuationRing.eq_unit_mul_pow_irreducible + hsubne hπirr + have hr : r ≤ n := by + by_contra hrn + apply hdeep + exact + (mem_higherPrincipalUnitGroup_iff_le_of_sub_eq_unit_mul_uniformizer_pow + hπ a c r (n + 1) hsub).2 (by omega) + have hrmem : + a ∈ CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF r := + (mem_higherPrincipalUnitGroup_iff_le_of_sub_eq_unit_mul_uniformizer_pow + hπ a c r r hsub).2 le_rfl + have hrnot : + a ∉ CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (r + 1) := by + rw [ + mem_higherPrincipalUnitGroup_iff_le_of_sub_eq_unit_mul_uniformizer_pow + hπ a c r (r + 1) hsub] + omega + have hval := + standardLubinTatePrimitivePointIntegerAction_sub_self_addVal_of_exactDepth + hπ n a r hrmem hrnot hr + rw [hval, + mem_higherPrincipalUnitGroup_iff_le_of_sub_eq_unit_mul_uniformizer_pow + hπ a c r k hsub] + have hqone : 1 < Nat.card F.residueField := + Finite.one_lt_card + constructor + · intro hpow + by_contra hkr + have hrk : r < k := Nat.lt_of_not_ge hkr + have hltNat : + Nat.card F.residueField ^ r < + Nat.card F.residueField ^ k := + Nat.pow_lt_pow_right hqone hrk + have hlt : + (Nat.card F.residueField ^ r : ℕ∞) < + (Nat.card F.residueField ^ k : ℕ) := by + exact_mod_cast hltNat + exact (not_lt_of_ge hpow) hlt + · intro hkr + have hpowNat : + Nat.card F.residueField ^ k ≤ + Nat.card F.residueField ^ r := + Nat.pow_le_pow_right (Nat.zero_lt_one.trans hqone) hkr + exact_mod_cast hpowNat + +/-- On the interval +`q^(k-1) - 1 ≤ r ≤ q^k - 1`, the lower displacement bound `r + 1` +detects the `k`th principal-unit subgroup. -/ +theorem + standardLubinTatePrimitivePointIntegerAction_sub_self_addVal_ge_iff_mem_of_pow_interval + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : F.valuationSubringˣ) (k r : ℕ) + (hkpos : 1 ≤ k) (hk : k ≤ n + 1) + (hlower : Nat.card F.residueField ^ (k - 1) ≤ r) + (hupper : r < Nat.card F.residueField ^ k) : + (((r + 1 : ℕ) : ℕ∞) ≤ + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (standardLubinTatePrimitivePointIntegerAction hπ n a - + standardLubinTatePrimitivePointInteger hπ n)) ↔ + a ∈ CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF k := by + constructor + · intro hdisplacement + by_contra hnot + have hnotDeep : + a ∉ CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF + (n + 1) := by + intro hdeep + exact hnot + (higherPrincipalUnitGroup_mem_of_le hπ a hk hdeep) + have hsubne : + (a : F.valuationSubring) - 1 ≠ 0 := by + intro hzero + apply hnotDeep + rw [CompleteDVF.higherPrincipalUnitGroup.mem_iff] + simp [hzero] + have hπirr : Irreducible π := + (IsDiscreteValuationRing.irreducible_iff_uniformizer π).2 + (F.toCompleteDVF.maximalIdeal_eq_span_uniformizer hπ) + obtain ⟨j, c, hsub⟩ := + IsDiscreteValuationRing.eq_unit_mul_pow_irreducible + hsubne hπirr + have hj : j ≤ n := by + by_contra hjn + apply hnotDeep + exact + (mem_higherPrincipalUnitGroup_iff_le_of_sub_eq_unit_mul_uniformizer_pow + hπ a c j (n + 1) hsub).2 (by omega) + have hjmem : + a ∈ CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF j := + (mem_higherPrincipalUnitGroup_iff_le_of_sub_eq_unit_mul_uniformizer_pow + hπ a c j j hsub).2 le_rfl + have hjnot : + a ∉ CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (j + 1) := by + rw [ + mem_higherPrincipalUnitGroup_iff_le_of_sub_eq_unit_mul_uniformizer_pow + hπ a c j (j + 1) hsub] + omega + have hjk : j < k := by + by_contra hjk + apply hnot + exact + (mem_higherPrincipalUnitGroup_iff_le_of_sub_eq_unit_mul_uniformizer_pow + hπ a c j k hsub).2 (by omega) + have hval := + standardLubinTatePrimitivePointIntegerAction_sub_self_addVal_of_exactDepth + hπ n a j hjmem hjnot hj + rw [hval] at hdisplacement + have hdisplacementNat : + r + 1 ≤ Nat.card F.residueField ^ j := by + exact_mod_cast hdisplacement + have hqpos : 0 < Nat.card F.residueField := + Nat.zero_lt_one.trans Finite.one_lt_card + have hjpred : j ≤ k - 1 := by omega + have hjpow : + Nat.card F.residueField ^ j ≤ + Nat.card F.residueField ^ (k - 1) := + Nat.pow_le_pow_right hqpos hjpred + omega + · intro hmem + have hthreshold := + (standardLubinTatePrimitivePointIntegerAction_sub_self_addVal_ge_iff_mem + hπ n a k hk).2 hmem + have hrqNat : + r + 1 ≤ Nat.card F.residueField ^ k := + Nat.succ_le_of_lt hupper + have hrq : + ((r + 1 : ℕ) : ℕ∞) ≤ + (Nat.card F.residueField ^ k : ℕ) := by + exact_mod_cast hrqNat + exact hrq.trans hthreshold + +section ParameterDisplacement + +/-- The standard Lubin–Tate level field is finite-dimensional over the base. -/ +noncomputable local instance + standardLubinTateLevelField_finiteDimensional_forPrimitiveDisplacement + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + FiniteDimensional K (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_finiteDimensional hπ n + +/-- The standard Lubin–Tate level field is Galois over the base. -/ +noncomputable local instance + standardLubinTateLevelField_isGalois_forPrimitiveDisplacement + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + IsGalois K (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_isGalois hπ n + +/-- The valuation-ring action of the automorphism attached to a finite unit +parameter agrees with the analytic action of its chosen representative on +the primitive point. -/ +theorem standardLubinTateUnitParameterToGal_apply_primitivePointInteger + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : standardLubinTateUnitParameter F n) : + valuationSubringAutOfUniqueExtension + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + hπ n) + (standardLubinTateUnitParameterToGal F hπ n a) + (standardLubinTatePrimitivePointInteger hπ n) = + standardLubinTatePrimitivePointIntegerAction hπ n + (standardLubinTateUnitParameterChosenRepresentative F n a) := by + apply Subtype.ext + change + standardLubinTateUnitParameterToGal F hπ n a + (standardLubinTateLevelGenerator hπ n) = + (standardLubinTatePrimitivePointIntegerAction hπ n + (standardLubinTateUnitParameterChosenRepresentative F n a) : + standardLubinTateLevelField hπ n) + change + standardLubinTateUnitParameterAlgEquiv F hπ n a + (standardLubinTateLevelPowerBasis hπ n).gen = + standardLubinTateUnitParameterLevelRoot F hπ n a + exact standardLubinTateUnitParameterAlgEquiv_apply_gen F hπ n a + +/-- Exact depth of a chosen finite-parameter representative computes the +displacement of the corresponding Galois automorphism. -/ +theorem + standardLubinTateUnitParameterToGal_displacement_addVal_of_chosenRepresentative_exactDepth + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : standardLubinTateUnitParameter F n) (k : ℕ) + (ha : + standardLubinTateUnitParameterChosenRepresentative F n a ∈ + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF k) + (hnot : + standardLubinTateUnitParameterChosenRepresentative F n a ∉ + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (k + 1)) + (hk : k ≤ n) : + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (valuationSubringAutOfUniqueExtension + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + hπ n) + (standardLubinTateUnitParameterToGal F hπ n a) + (standardLubinTatePrimitivePointInteger hπ n) - + standardLubinTatePrimitivePointInteger hπ n) = + (Nat.card F.residueField ^ k : ℕ) := by + rw [standardLubinTateUnitParameterToGal_apply_primitivePointInteger] + exact + standardLubinTatePrimitivePointIntegerAction_sub_self_addVal_of_exactDepth + hπ n + (standardLubinTateUnitParameterChosenRepresentative F n a) + k ha hnot hk + +/-- The `q^k` displacement threshold for a finite-parameter automorphism is +equivalent to its chosen representative belonging to `U^k`. -/ +theorem + standardLubinTateUnitParameterToGal_displacement_addVal_ge_iff_chosenRepresentative_mem + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : standardLubinTateUnitParameter F n) (k : ℕ) + (hk : k ≤ n + 1) : + ((Nat.card F.residueField ^ k : ℕ) : ℕ∞) ≤ + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (valuationSubringAutOfUniqueExtension + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + hπ n) + (standardLubinTateUnitParameterToGal F hπ n a) + (standardLubinTatePrimitivePointInteger hπ n) - + standardLubinTatePrimitivePointInteger hπ n) ↔ + standardLubinTateUnitParameterChosenRepresentative F n a ∈ + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF k := by + rw [standardLubinTateUnitParameterToGal_apply_primitivePointInteger] + exact + standardLubinTatePrimitivePointIntegerAction_sub_self_addVal_ge_iff_mem + hπ n + (standardLubinTateUnitParameterChosenRepresentative F n a) k hk + +/-- The power-interval form of the finite-parameter displacement criterion, +stated using its chosen representative. -/ +theorem + unitParameterToGal_displacement_addVal_ge_iff_representative_mem_of_pow_interval + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (a : standardLubinTateUnitParameter F n) (k r : ℕ) + (hkpos : 1 ≤ k) (hk : k ≤ n + 1) + (hlower : Nat.card F.residueField ^ (k - 1) ≤ r) + (hupper : r < Nat.card F.residueField ^ k) : + (((r + 1 : ℕ) : ℕ∞) ≤ + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (valuationSubringAutOfUniqueExtension + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + hπ n) + (standardLubinTateUnitParameterToGal F hπ n a) + (standardLubinTatePrimitivePointInteger hπ n) - + standardLubinTatePrimitivePointInteger hπ n)) ↔ + standardLubinTateUnitParameterChosenRepresentative F n a ∈ + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF k := by + rw [standardLubinTateUnitParameterToGal_apply_primitivePointInteger] + exact + standardLubinTatePrimitivePointIntegerAction_sub_self_addVal_ge_iff_mem_of_pow_interval + hπ n + (standardLubinTateUnitParameterChosenRepresentative F n a) + k r hkpos hk hlower hupper + +/-- Every nontrivial displacement of the primitive point by a level Galois +automorphism has additive valuation at most `q ^ n`. + +Surjectivity of the finite unit-parameter action supplies a representative. +If that representative fixed the point, it would lie in `U^(n+1)`. +Otherwise its first nontrivial depth is some `k ≤ n`, where the exact +displacement formula is `q^k`. -/ +theorem standardLubinTateGal_displacement_addVal_le_of_ne + (F : LocalField.{u, v} K) {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (σ : Gal(standardLubinTateLevelField hπ n/K)) + (hne : + valuationSubringAutOfUniqueExtension + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + hπ n) + σ (standardLubinTatePrimitivePointInteger hπ n) ≠ + standardLubinTatePrimitivePointInteger hπ n) : + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (valuationSubringAutOfUniqueExtension + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension + hπ n) + σ (standardLubinTatePrimitivePointInteger hπ n) - + standardLubinTatePrimitivePointInteger hπ n) ≤ + ((Nat.card F.residueField ^ n : ℕ) : ℕ∞) := by + obtain ⟨a, rfl⟩ := + standardLubinTateUnitParameterToGal_surjective F hπ n σ + let representative := + standardLubinTateUnitParameterChosenRepresentative F n a + have hnotDeep : + representative ∉ + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1) := by + intro hdeep + apply hne + rw [standardLubinTateUnitParameterToGal_apply_primitivePointInteger] + exact + (standardLubinTatePrimitivePointIntegerAction_eq_self_iff_mem_higherPrincipalUnitGroup + hπ n representative).2 hdeep + have hsubne : + (representative : F.valuationSubring) - 1 ≠ 0 := by + intro hzero + apply hnotDeep + rw [CompleteDVF.higherPrincipalUnitGroup.mem_iff] + simp [hzero] + have hπirr : Irreducible π := + (IsDiscreteValuationRing.irreducible_iff_uniformizer π).2 + (F.toCompleteDVF.maximalIdeal_eq_span_uniformizer hπ) + obtain ⟨k, c, hsub⟩ := + IsDiscreteValuationRing.eq_unit_mul_pow_irreducible + hsubne hπirr + have hk : k ≤ n := by + by_contra hkn + apply hnotDeep + exact + (mem_higherPrincipalUnitGroup_iff_le_of_sub_eq_unit_mul_uniformizer_pow + hπ representative c k (n + 1) hsub).2 (by omega) + have hkmem : + representative ∈ + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF k := + (mem_higherPrincipalUnitGroup_iff_le_of_sub_eq_unit_mul_uniformizer_pow + hπ representative c k k hsub).2 le_rfl + have hknot : + representative ∉ + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (k + 1) := by + rw [ + mem_higherPrincipalUnitGroup_iff_le_of_sub_eq_unit_mul_uniformizer_pow + hπ representative c k (k + 1) hsub] + omega + have hval := + standardLubinTateUnitParameterToGal_displacement_addVal_of_chosenRepresentative_exactDepth + F hπ n a k hkmem hknot hk + rw [hval] + exact_mod_cast + Nat.pow_le_pow_right + (Nat.zero_lt_one.trans Finite.one_lt_card) hk + +end ParameterDisplacement + +end AnalyticValuation + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveEisenstein.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveEisenstein.lean new file mode 100644 index 0000000000..61aaaff2a0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveEisenstein.lean @@ -0,0 +1,143 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.DivisionPolynomial +public import Mathlib.RingTheory.Polynomial.Eisenstein.Basic +/-! +# Eisenstein property of the standard primitive division polynomials + +Let `F` be a local field, let `π` be a uniformizer, and put + +`f(X) = X ^ q + π * X`, + +where `q` is the cardinality of the residue field. Reduction modulo the +maximal ideal sends the `n`-fold compositional iterate of `f` to +`X ^ (q ^ n)`. Consequently, the primitive quotient polynomial + +`Qₙ(X) = (f^[n](X)) ^ (q - 1) + π` + +reduces to its leading monomial. Its constant coefficient is the +uniformizer itself, so `Qₙ` is Eisenstein at the maximal ideal and hence +irreducible over the valuation ring. + +The argument is independent of the characteristic of `F`. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- Reduction modulo the maximal ideal sends the standard Lubin--Tate +polynomial to `X ^ q`. -/ +theorem standardLubinTatePolynomial_map_residue + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + (standardLubinTatePolynomial F π).map F.residueMap = + Polynomial.X ^ Nat.card F.residueField := by + simp [standardLubinTatePolynomial, + SameUniformizer.residueMap_uniformizer_eq_zero hπ] + +/-- Reduction modulo the maximal ideal sends the `n`-fold standard iterate +to `X ^ (q ^ n)`. -/ +theorem standardLubinTatePolynomialIterate_map_residue + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + (standardLubinTatePolynomialIterate F π n).map F.residueMap = + Polynomial.X ^ (Nat.card F.residueField ^ n) := by + induction n with + | zero => + simp [standardLubinTatePolynomialIterate] + | succ n ih => + rw [standardLubinTatePolynomialIterate_succ, + Polynomial.map_comp, + standardLubinTatePolynomial_map_residue hπ, + ih] + simp [← pow_mul, pow_succ] + +/-- Reduction modulo the maximal ideal sends the primitive quotient +polynomial to its leading monomial. -/ +theorem standardLubinTatePrimitivePolynomial_map_residue + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + (standardLubinTatePrimitivePolynomial F π n).map F.residueMap = + Polynomial.X ^ + ((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n) := by + simp [standardLubinTatePrimitivePolynomial, + standardLubinTatePolynomialIterate_map_residue hπ, + SameUniformizer.residueMap_uniformizer_eq_zero hπ, + ← pow_mul, Nat.mul_comm] + +/-- The standard primitive quotient polynomial is Eisenstein at the maximal +ideal of the valuation ring. -/ +theorem standardLubinTatePrimitivePolynomial_isEisensteinAt + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + (standardLubinTatePrimitivePolynomial F π n).IsEisensteinAt + F.maximalIdeal := by + let Q := standardLubinTatePrimitivePolynomial F π n + let d := + (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n + have hmonic : Q.Monic := + standardLubinTatePrimitivePolynomial_monic F π n + have hprime : F.maximalIdeal.IsPrime := + (IsLocalRing.maximalIdeal.isMaximal F.valuationSubring).isPrime + refine hmonic.isEisensteinAt_of_mem_of_notMem hprime.ne_top ?_ ?_ + · intro i hi + have hcoeff : + F.residueMap (Q.coeff i) = + (Polynomial.X ^ d : Polynomial F.residueField).coeff i := by + simpa only [Q, d, Polynomial.coeff_map] using + congrArg (fun p : Polynomial F.residueField ↦ p.coeff i) + (standardLubinTatePrimitivePolynomial_map_residue hπ n) + have hid : i < d := by + simpa [Q, d, + standardLubinTatePrimitivePolynomial_natDegree] using hi + have hzero : F.residueMap (Q.coeff i) = 0 := by + rw [hcoeff] + simp [Polynomial.coeff_X_pow, ne_of_lt hid] + exact (F.toCompleteDVF.residue_eq_zero_iff (Q.coeff i)).1 hzero + · simpa [Q] using + F.toCompleteDVF.uniformizer_not_mem_maximalIdeal_sq hπ + +/-- Every standard primitive quotient polynomial is primitive. -/ +theorem standardLubinTatePrimitivePolynomial_isPrimitive + (F : LocalField.{u, v} K) (π : F.valuationSubring) (n : ℕ) : + (standardLubinTatePrimitivePolynomial F π n).IsPrimitive := + (standardLubinTatePrimitivePolynomial_monic F π n).isPrimitive + +/-- The standard primitive quotient polynomial is irreducible by +Eisenstein's criterion. -/ +theorem standardLubinTatePrimitivePolynomial_irreducible + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + Irreducible (standardLubinTatePrimitivePolynomial F π n) := by + apply (standardLubinTatePrimitivePolynomial_isEisensteinAt hπ n).irreducible + (IsLocalRing.maximalIdeal.isMaximal F.valuationSubring).isPrime + (standardLubinTatePrimitivePolynomial_isPrimitive F π n) + rw [standardLubinTatePrimitivePolynomial_natDegree] + exact Nat.mul_pos + (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (Nat.pow_pos Nat.card_pos) + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveRoot.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveRoot.lean new file mode 100644 index 0000000000..86b1e97c32 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveRoot.lean @@ -0,0 +1,303 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveEisenstein +public import Mathlib.FieldTheory.IsSepClosed +public import Mathlib.RingTheory.Polynomial.GaussLemma +public import Mathlib.SetTheory.Cardinal.Finite +/-! +# Primitive roots and standard Lubin--Tate level fields + +For a local field `F` with uniformizer `π`, this file maps the primitive +division polynomial from the valuation ring to the fraction field. Gauss's +lemma transfers its Eisenstein irreducibility to the field. We also prove +separability directly, choose a root in `SeparableClosure K`, and identify +the degree of the simple extension generated by that root. + +The separability argument works in both mixed and equal characteristic. It +uses the identity + +`(f^[n])'(0) = π ^ n` + +for `f(X) = X ^ q + π * X`, together with the fact that `q - 1` is nonzero +in the base field. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The derivative of the standard polynomial at zero is its linear +coefficient. -/ +@[simp] +theorem standardLubinTatePolynomial_derivative_eval_zero + (F : LocalField.{u, v} K) (π : F.valuationSubring) : + (standardLubinTatePolynomial F π).derivative.eval 0 = π := by + simp [standardLubinTatePolynomial, Polynomial.derivative_pow, + Nat.sub_ne_zero_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)] + +/-- The derivative at zero of the `n`-fold standard iterate is `π ^ n`. -/ +@[simp] +theorem standardLubinTatePolynomialIterate_derivative_eval_zero + (F : LocalField.{u, v} K) (π : F.valuationSubring) (n : ℕ) : + (standardLubinTatePolynomialIterate F π n).derivative.eval 0 = + π ^ n := by + induction n with + | zero => + simp [standardLubinTatePolynomialIterate] + | succ n ih => + rw [standardLubinTatePolynomialIterate_succ, + Polynomial.derivative_comp, Polynomial.eval_mul, ih, + Polynomial.eval_comp, + standardLubinTatePolynomialIterate_eval_zero, + standardLubinTatePolynomial_derivative_eval_zero] + simp [pow_succ] + +/-- The primitive division polynomial after extending coefficients from the +valuation ring to the base field. -/ +noncomputable def standardLubinTatePrimitivePolynomialOverField + (F : LocalField.{u, v} K) (π : F.valuationSubring) (n : ℕ) : + Polynomial K := + (standardLubinTatePrimitivePolynomial F π n).map + (algebraMap F.valuationSubring K) + +/-- The field-valued primitive polynomial has the expected formula. -/ +theorem standardLubinTatePrimitivePolynomialOverField_formula + (F : LocalField.{u, v} K) (π : F.valuationSubring) (n : ℕ) : + standardLubinTatePrimitivePolynomialOverField F π n = + (standardLubinTatePolynomialIterate F π n).map + (algebraMap F.valuationSubring K) ^ + (Nat.card F.residueField - 1) + + Polynomial.C (π : K) := by + simp [standardLubinTatePrimitivePolynomialOverField, + standardLubinTatePrimitivePolynomial] + +/-- The field-valued primitive polynomial is monic. -/ +theorem standardLubinTatePrimitivePolynomialOverField_monic + (F : LocalField.{u, v} K) (π : F.valuationSubring) (n : ℕ) : + (standardLubinTatePrimitivePolynomialOverField F π n).Monic := + (standardLubinTatePrimitivePolynomial_monic F π n).map _ + +/-- The field-valued primitive polynomial has degree +`(q - 1) * q ^ n`. -/ +theorem standardLubinTatePrimitivePolynomialOverField_natDegree + (F : LocalField.{u, v} K) (π : F.valuationSubring) (n : ℕ) : + (standardLubinTatePrimitivePolynomialOverField F π n).natDegree = + (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := by + rw [standardLubinTatePrimitivePolynomialOverField, + (standardLubinTatePrimitivePolynomial_monic F π n).natDegree_map, + standardLubinTatePrimitivePolynomial_natDegree] + +/-- Gauss's lemma transfers Eisenstein irreducibility from the valuation +ring to the base field. -/ +theorem standardLubinTatePrimitivePolynomialOverField_irreducible + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + Irreducible (standardLubinTatePrimitivePolynomialOverField F π n) := by + let : IsFractionRing F.valuationSubring K := + F.toCompleteDVF.toDVF.valuationSubring_isFractionRing + let : IsIntegrallyClosed F.valuationSubring := + F.toCompleteDVF.toDVF.valuationSubring_isIntegrallyClosed + exact + (standardLubinTatePrimitivePolynomial_monic F π + n).irreducible_iff_irreducible_map_fraction_map.mp + (standardLubinTatePrimitivePolynomial_irreducible hπ n) + +/-- The natural number `q - 1` is nonzero in the local field. -/ +theorem residueFieldNatCard_sub_one_cast_ne_zero + (F : LocalField.{u, v} K) : + ((Nat.card F.residueField - 1 : ℕ) : K) ≠ 0 := by + have hcard : + (Nat.card F.residueField : F.residueField) = 0 := by + let := Fintype.ofFinite F.residueField + rw [Nat.card_eq_fintype_card, Nat.cast_card_eq_zero] + have hres : + ((Nat.card F.residueField - 1 : ℕ) : F.residueField) ≠ 0 := by + rw [Nat.cast_sub + (Nat.le_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)), hcard] + simp + intro hfield + have hvaluation : + ((Nat.card F.residueField - 1 : ℕ) : F.valuationSubring) = 0 := by + apply Subtype.ext + simpa using hfield + have hreszero : + ((Nat.card F.residueField - 1 : ℕ) : F.residueField) = 0 := by + simpa using congrArg F.residueMap hvaluation + exact hres hreszero + +/-- The field-valued primitive polynomial has nonzero derivative. -/ +theorem standardLubinTatePrimitivePolynomialOverField_derivative_ne_zero + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + (standardLubinTatePrimitivePolynomialOverField F π n).derivative ≠ 0 := by + let A := + (standardLubinTatePolynomialIterate F π n).map + (algebraMap F.valuationSubring K) + have hAmonic : A.Monic := + (standardLubinTatePolynomialIterate_monic F π n).map _ + have hAderivativeAtZero : + A.derivative.eval 0 = (π : K) ^ n := by + calc + A.derivative.eval 0 = + algebraMap F.valuationSubring K + ((standardLubinTatePolynomialIterate F π n).derivative.eval 0) := by + dsimp [A] + rw [Polynomial.derivative_map, Polynomial.eval_zero_map, + Algebra.algebraMap_ofSubsemiring_apply] + _ = (π : K) ^ n := by + rw [standardLubinTatePolynomialIterate_derivative_eval_zero, + map_pow] + rfl + have hAderivative : A.derivative ≠ 0 := by + intro hzero + apply pow_ne_zero n hπ.ne_zero + calc + (π : K) ^ n = A.derivative.eval 0 := + hAderivativeAtZero.symm + _ = 0 := by rw [hzero, Polynomial.eval_zero] + rw [standardLubinTatePrimitivePolynomialOverField_formula] + change + (A ^ (Nat.card F.residueField - 1) + + Polynomial.C (π : K)).derivative ≠ 0 + rw [Polynomial.derivative_add, Polynomial.derivative_pow, + Polynomial.derivative_C, add_zero] + exact mul_ne_zero + (mul_ne_zero + (Polynomial.C_ne_zero.mpr + (residueFieldNatCard_sub_one_cast_ne_zero F)) + (pow_ne_zero _ hAmonic.ne_zero)) + hAderivative + +/-- The field-valued primitive polynomial is separable. -/ +theorem standardLubinTatePrimitivePolynomialOverField_separable + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + (standardLubinTatePrimitivePolynomialOverField F π n).Separable := + (Polynomial.separable_iff_derivative_ne_zero + (standardLubinTatePrimitivePolynomialOverField_irreducible hπ n)).2 + (standardLubinTatePrimitivePolynomialOverField_derivative_ne_zero hπ n) + +/-- The primitive polynomial has a root in the chosen separable closure. -/ +theorem exists_standardLubinTatePrimitivePolynomialOverField_root + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + ∃ x : SeparableClosure K, + ((standardLubinTatePrimitivePolynomialOverField F π n).map + (algebraMap K (SeparableClosure K))).IsRoot x := by + let ι := algebraMap K (SeparableClosure K) + let Q := standardLubinTatePrimitivePolynomialOverField F π n + have hnat : 0 < (Q.map ι).natDegree := by + rw [Polynomial.natDegree_map_eq_of_injective ι.injective, + standardLubinTatePrimitivePolynomialOverField_natDegree] + exact Nat.mul_pos + (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (Nat.pow_pos Nat.card_pos) + have hdegree : (Q.map ι).degree ≠ 0 := + ne_of_gt (Polynomial.natDegree_pos_iff_degree_pos.mp hnat) + have hseparable : (Q.map ι).Separable := + (standardLubinTatePrimitivePolynomialOverField_separable hπ n).map + exact IsSepClosed.exists_root (Q.map ι) hdegree hseparable + +/-- A chosen primitive level-`n+1` root in `SeparableClosure K`. -/ +noncomputable def chosenStandardLubinTatePrimitiveRoot + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + SeparableClosure K := + Classical.choose + (exists_standardLubinTatePrimitivePolynomialOverField_root hπ n) + +/-- The chosen primitive element is a root of the field-valued primitive +polynomial. -/ +theorem chosenStandardLubinTatePrimitiveRoot_isRoot + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + ((standardLubinTatePrimitivePolynomialOverField F π n).map + (algebraMap K (SeparableClosure K))).IsRoot + (chosenStandardLubinTatePrimitiveRoot hπ n) := + Classical.choose_spec + (exists_standardLubinTatePrimitivePolynomialOverField_root hπ n) + +/-- The chosen primitive root is integral over the base field. -/ +theorem chosenStandardLubinTatePrimitiveRoot_isIntegral + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + IsIntegral K (chosenStandardLubinTatePrimitiveRoot hπ n) := by + refine + ⟨standardLubinTatePrimitivePolynomialOverField F π n, + standardLubinTatePrimitivePolynomialOverField_monic F π n, ?_⟩ + simpa [Polynomial.IsRoot, Polynomial.eval_map] using + (chosenStandardLubinTatePrimitiveRoot_isRoot hπ n) + +/-- The field-valued primitive polynomial is the minimal polynomial of the +chosen root. -/ +theorem standardLubinTatePrimitivePolynomialOverField_eq_minpoly + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + standardLubinTatePrimitivePolynomialOverField F π n = + minpoly K (chosenStandardLubinTatePrimitiveRoot hπ n) := by + apply minpoly.eq_of_irreducible_of_monic + (standardLubinTatePrimitivePolynomialOverField_irreducible hπ n) + _ + (standardLubinTatePrimitivePolynomialOverField_monic F π n) + rw [Polynomial.aeval_def] + simpa [Polynomial.IsRoot, Polynomial.eval_map] using + (chosenStandardLubinTatePrimitiveRoot_isRoot hπ n) + +/-- The simple extension generated by the chosen primitive root. -/ +@[reducible] +noncomputable def standardLubinTateLevelField + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + IntermediateField K (SeparableClosure K) := + IntermediateField.adjoin K + {chosenStandardLubinTatePrimitiveRoot hπ n} + +/-- Every standard Lubin--Tate level field is finite-dimensional over the +base field. -/ +theorem standardLubinTateLevelField_finiteDimensional + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + FiniteDimensional K (standardLubinTateLevelField hπ n) := + IntermediateField.adjoin.finiteDimensional + (chosenStandardLubinTatePrimitiveRoot_isIntegral hπ n) + +/-- The standard primitive level-`n+1` extension has degree +`(q - 1) * q ^ n`. -/ +theorem standardLubinTateLevelField_finrank + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + Module.finrank K (standardLubinTateLevelField hπ n) = + (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := by + change Module.finrank K + (IntermediateField.adjoin K + {chosenStandardLubinTatePrimitiveRoot hπ n}) = _ + rw [IntermediateField.adjoin.finrank + (chosenStandardLubinTatePrimitiveRoot_isIntegral hπ n), + ← standardLubinTatePrimitivePolynomialOverField_eq_minpoly hπ n, + standardLubinTatePrimitivePolynomialOverField_natDegree] + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveTorsion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveTorsion.lean new file mode 100644 index 0000000000..a82062e198 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveTorsion.lean @@ -0,0 +1,289 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveRoot +/-! +# Primitive Lubin--Tate torsion points + +This file records the exact torsion level of the primitive roots chosen in +`PrimitiveRoot`. The standard division-polynomial iterates are first mapped +from the valuation ring to the base field and to its fixed separable closure. +Their evaluations satisfy the expected additivity under composition. + +For a root of the primitive level-`n + 1` factor, the factorization of the +next iterate shows that the level-`n + 1` iterate vanishes. The primitive +equation and nonvanishing of the uniformizer show that the level-`n` iterate +does not vanish. All arguments are characteristic-independent. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The `n`-fold standard iterate after extending coefficients from the +valuation ring to the base field. -/ +noncomputable def standardLubinTatePolynomialIterateOverField + (F : LocalField.{u, v} K) (π : F.valuationSubring) (n : ℕ) : + Polynomial K := + (standardLubinTatePolynomialIterate F π n).map + (algebraMap F.valuationSubring K) + +/-- The `n`-fold standard iterate after extending coefficients to the fixed +separable closure of the base field. -/ +noncomputable def standardLubinTatePolynomialIterateOverSeparableClosure + (F : LocalField.{u, v} K) (π : F.valuationSubring) (n : ℕ) : + Polynomial (SeparableClosure K) := + (standardLubinTatePolynomialIterate F π n).map + ((algebraMap K (SeparableClosure K)).comp + (algebraMap F.valuationSubring K)) + +/-- Evaluation of the field-valued iterate is evaluation over the valuation +ring with the coefficient embedding. -/ +@[simp] +theorem standardLubinTatePolynomialIterateOverField_eval + (F : LocalField.{u, v} K) (π : F.valuationSubring) + (n : ℕ) (x : K) : + (standardLubinTatePolynomialIterateOverField F π n).eval x = + Polynomial.eval₂ (algebraMap F.valuationSubring K) x + (standardLubinTatePolynomialIterate F π n) := by + rw [standardLubinTatePolynomialIterateOverField, + Polynomial.eval_map] + +/-- Evaluation of the separable-closure-valued iterate is evaluation over +the valuation ring with the composite coefficient embedding. -/ +@[simp] +theorem standardLubinTatePolynomialIterateOverSeparableClosure_eval + (F : LocalField.{u, v} K) (π : F.valuationSubring) + (n : ℕ) (x : SeparableClosure K) : + (standardLubinTatePolynomialIterateOverSeparableClosure F π n).eval x = + Polynomial.eval₂ + ((algebraMap K (SeparableClosure K)).comp + (algebraMap F.valuationSubring K)) + x (standardLubinTatePolynomialIterate F π n) := by + rw [standardLubinTatePolynomialIterateOverSeparableClosure, + Polynomial.eval_map] + +/-- Evaluating a compositional iterate is the corresponding iterate of the +evaluation function. -/ +theorem standardLubinTatePolynomialIterate_eval₂_eq_iterate + (F : LocalField.{u, v} K) (π : F.valuationSubring) + {A : Type*} [CommSemiring A] + (φ : F.valuationSubring →+* A) (n : ℕ) (x : A) : + Polynomial.eval₂ φ x + (standardLubinTatePolynomialIterate F π n) = + (fun y : A => + Polynomial.eval₂ φ y (standardLubinTatePolynomial F π))^[n] x := by + simp [standardLubinTatePolynomialIterate] + +/-- Standard iterate indices add under evaluated composition. -/ +theorem standardLubinTatePolynomialIterate_eval₂_add + (F : LocalField.{u, v} K) (π : F.valuationSubring) + {A : Type*} [CommSemiring A] + (φ : F.valuationSubring →+* A) (m n : ℕ) (x : A) : + Polynomial.eval₂ φ x + (standardLubinTatePolynomialIterate F π (m + n)) = + Polynomial.eval₂ φ + (Polynomial.eval₂ φ x + (standardLubinTatePolynomialIterate F π n)) + (standardLubinTatePolynomialIterate F π m) := by + let g : A → A := fun y => + Polynomial.eval₂ φ y (standardLubinTatePolynomial F π) + calc + Polynomial.eval₂ φ x + (standardLubinTatePolynomialIterate F π (m + n)) = + g^[m + n] x := by + exact + standardLubinTatePolynomialIterate_eval₂_eq_iterate + F π φ (m + n) x + _ = g^[m] (g^[n] x) := by + rw [Function.iterate_add_apply] + _ = Polynomial.eval₂ φ + (Polynomial.eval₂ φ x + (standardLubinTatePolynomialIterate F π n)) + (standardLubinTatePolynomialIterate F π m) := by + simp only [g, + standardLubinTatePolynomialIterate_eval₂_eq_iterate] + +/-- In the fixed separable closure, evaluation of standard iterates is +additive in the iterate index. -/ +theorem standardLubinTatePolynomialIterateOverSeparableClosure_eval_add + (F : LocalField.{u, v} K) (π : F.valuationSubring) + (m n : ℕ) (x : SeparableClosure K) : + (standardLubinTatePolynomialIterateOverSeparableClosure + F π (m + n)).eval x = + (standardLubinTatePolynomialIterateOverSeparableClosure F π m).eval + ((standardLubinTatePolynomialIterateOverSeparableClosure + F π n).eval x) := by + simpa only [ + standardLubinTatePolynomialIterateOverSeparableClosure_eval] using + standardLubinTatePolynomialIterate_eval₂_add F π + ((algebraMap K (SeparableClosure K)).comp + (algebraMap F.valuationSubring K)) + m n x + +/-- Evaluation of the primitive polynomial after a further coefficient map +is the primitive division equation for the mapped iterate. -/ +theorem standardLubinTatePrimitivePolynomialOverField_eval₂ + (F : LocalField.{u, v} K) (π : F.valuationSubring) + {A : Type*} [CommRing A] (φ : K →+* A) + (n : ℕ) (x : A) : + Polynomial.eval₂ φ x + (standardLubinTatePrimitivePolynomialOverField F π n) = + Polynomial.eval₂ + (φ.comp (algebraMap F.valuationSubring K)) x + (standardLubinTatePolynomialIterate F π n) ^ + (Nat.card F.residueField - 1) + + φ (π : K) := by + rw [standardLubinTatePrimitivePolynomialOverField_formula, + Polynomial.eval₂_add, Polynomial.eval₂_pow, + Polynomial.eval₂_map, Polynomial.eval₂_C] + +/-- The chosen primitive root satisfies its primitive division equation in +the fixed separable closure. -/ +theorem chosenStandardLubinTatePrimitiveRoot_equation + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + (standardLubinTatePolynomialIterateOverSeparableClosure F π n).eval + (chosenStandardLubinTatePrimitiveRoot hπ n) ^ + (Nat.card F.residueField - 1) + + algebraMap K (SeparableClosure K) (π : K) = 0 := by + have hroot := + chosenStandardLubinTatePrimitiveRoot_isRoot hπ n + change Polynomial.eval + (chosenStandardLubinTatePrimitiveRoot hπ n) + ((standardLubinTatePrimitivePolynomialOverField F π n).map + (algebraMap K (SeparableClosure K))) = 0 at hroot + rw [Polynomial.eval_map, + standardLubinTatePrimitivePolynomialOverField_eval₂] at hroot + simpa only [ + standardLubinTatePolynomialIterateOverSeparableClosure_eval] using + hroot + +/-- The chosen primitive level-`n + 1` root is killed by the +level-`n + 1` standard iterate. -/ +theorem chosenStandardLubinTatePrimitiveRoot_iterate_succ_eq_zero + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + (standardLubinTatePolynomialIterateOverSeparableClosure + F π (n + 1)).eval + (chosenStandardLubinTatePrimitiveRoot hπ n) = 0 := by + let φ : F.valuationSubring →+* SeparableClosure K := + (algebraMap K (SeparableClosure K)).comp + (algebraMap F.valuationSubring K) + let x := chosenStandardLubinTatePrimitiveRoot hπ n + have hfactor := congrArg + (Polynomial.eval₂ φ x) + (standardLubinTatePolynomialIterate_succ_factor F π n) + rw [Polynomial.eval₂_mul] at hfactor + have hQ : + Polynomial.eval₂ φ x + (standardLubinTatePrimitivePolynomial F π n) = 0 := by + have hroot := + chosenStandardLubinTatePrimitiveRoot_isRoot hπ n + simpa [Polynomial.IsRoot, + standardLubinTatePrimitivePolynomialOverField, + Polynomial.eval_map, Polynomial.eval₂_map, φ, x] using hroot + rw [hQ, mul_zero] at hfactor + simpa only [ + standardLubinTatePolynomialIterateOverSeparableClosure_eval, + φ, x] using hfactor + +/-- The chosen primitive level-`n + 1` root is not already killed by the +level-`n` standard iterate. -/ +theorem chosenStandardLubinTatePrimitiveRoot_iterate_ne_zero + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + (standardLubinTatePolynomialIterateOverSeparableClosure F π n).eval + (chosenStandardLubinTatePrimitiveRoot hπ n) ≠ 0 := by + intro hzero + have hequation := + chosenStandardLubinTatePrimitiveRoot_equation hπ n + rw [hzero, zero_pow, zero_add] at hequation + · apply hπ.ne_zero + apply (algebraMap K (SeparableClosure K)).injective + simpa using hequation + · exact Nat.sub_ne_zero_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField) + +/-- In particular, the chosen primitive root is nonzero. -/ +theorem chosenStandardLubinTatePrimitiveRoot_ne_zero + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + chosenStandardLubinTatePrimitiveRoot hπ n ≠ 0 := by + intro hzero + apply chosenStandardLubinTatePrimitiveRoot_iterate_ne_zero hπ n + rw [hzero, + standardLubinTatePolynomialIterateOverSeparableClosure, + Polynomial.eval_zero_map, + standardLubinTatePolynomialIterate_eval_zero, + map_zero] + +/-- Applying the `(n - m)`-fold standard iterate to a primitive +level-`n + 1` point gives a root of the primitive level-`m + 1` +polynomial. -/ +theorem chosenStandardLubinTatePrimitivePredecessor_isRoot + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + {m n : ℕ} (hmn : m ≤ n) : + let y := + (standardLubinTatePolynomialIterateOverSeparableClosure + F π (n - m)).eval + (chosenStandardLubinTatePrimitiveRoot hπ n) + ((standardLubinTatePrimitivePolynomialOverField F π m).map + (algebraMap K (SeparableClosure K))).IsRoot y := by + let y := + (standardLubinTatePolynomialIterateOverSeparableClosure + F π (n - m)).eval + (chosenStandardLubinTatePrimitiveRoot hπ n) + have hyIterate : + (standardLubinTatePolynomialIterateOverSeparableClosure F π m).eval + y = + (standardLubinTatePolynomialIterateOverSeparableClosure F π n).eval + (chosenStandardLubinTatePrimitiveRoot hπ n) := by + calc + (standardLubinTatePolynomialIterateOverSeparableClosure F π m).eval + y = + (standardLubinTatePolynomialIterateOverSeparableClosure + F π (m + (n - m))).eval + (chosenStandardLubinTatePrimitiveRoot hπ n) := + (standardLubinTatePolynomialIterateOverSeparableClosure_eval_add + F π m (n - m) + (chosenStandardLubinTatePrimitiveRoot hπ n)).symm + _ = + (standardLubinTatePolynomialIterateOverSeparableClosure F π n).eval + (chosenStandardLubinTatePrimitiveRoot hπ n) := by + rw [Nat.add_sub_of_le hmn] + have hyEquation : + (standardLubinTatePolynomialIterateOverSeparableClosure F π m).eval + y ^ (Nat.card F.residueField - 1) + + algebraMap K (SeparableClosure K) (π : K) = 0 := by + rw [hyIterate] + exact chosenStandardLubinTatePrimitiveRoot_equation hπ n + change Polynomial.eval y + ((standardLubinTatePrimitivePolynomialOverField F π m).map + (algebraMap K (SeparableClosure K))) = 0 + rw [Polynomial.eval_map, + standardLubinTatePrimitivePolynomialOverField_eval₂] + simpa only [ + standardLubinTatePolynomialIterateOverSeparableClosure_eval] using + hyEquation + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveUniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveUniformizer.lean new file mode 100644 index 0000000000..4dbd618ae7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveUniformizer.lean @@ -0,0 +1,946 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveTorsion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +public import Mathlib.RingTheory.Finiteness.Cardinality +public import Mathlib.RingTheory.Discriminant +public import Mathlib.RingTheory.Polynomial.Eisenstein.IsIntegral +/-! +# Uniformizers in standard Lubin--Tate level fields + +Let `F` be a local field, let `π` be a chosen uniformizer, and let +`Lₙ = K(λₙ)` be the simple extension generated by a chosen root of the +standard primitive division polynomial. This file puts the integral-closure +complete discrete valuation on `Lₙ` and proves that `λₙ` is a uniformizer. + +The valuation calculation uses the actual Eisenstein polynomial. Its +constant coefficient has target additive valuation equal to the ramification +index, while every nonconstant lower term lies one step deeper in the target +maximal-ideal filtration. Comparing with the leading term and the +fundamental identity forces the normalized additive valuation of `λₙ` to be +one. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +universe u v w x + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.ValuedExtension +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +variable {K : Type u} [Field K] + +private theorem + isIntegral_mem_adjoin_of_powerBasis_minpoly_isEisensteinAt + {R K' L : Type*} [CommRing R] [IsDomain R] + [IsDiscreteValuationRing R] [Field K'] [Field L] + [Algebra R K'] [Algebra K' L] [Algebra R L] + [IsScalarTower R K' L] [IsFractionRing R K'] + [FiniteDimensional K' L] [Algebra.IsSeparable K' L] + (B : PowerBasis K' L) (pi : R) (hpi : Irreducible pi) + (hBint : IsIntegral R B.gen) + (hei : (minpoly R B.gen).IsEisensteinAt + (Ideal.span ({pi} : Set R))) + {z : L} (hzint : IsIntegral R z) : + z ∈ Algebra.adjoin R ({B.gen} : Set L) := by + have hdiscInt : + IsIntegral R (Algebra.discr K' B.basis) := + Algebra.discr_isIntegral K' (fun i => by + simpa using hBint.pow (i : ℕ)) + obtain ⟨d, hd⟩ := + IsIntegrallyClosed.isIntegral_iff.mp hdiscInt + have hd0 : d ≠ 0 := by + intro hd0 + have hdisc0 : Algebra.discr K' B.basis ≠ 0 := + Algebra.discr_not_zero_of_basis K' B.basis + apply hdisc0 + rw [← hd, hd0, map_zero] + obtain ⟨m, unit, hdu⟩ := + IsDiscreteValuationRing.eq_unit_mul_pow_irreducible hd0 hpi + have H := + Algebra.discr_mul_isIntegral_mem_adjoin K' hBint hzint + rw [← hd, hdu, map_mul, map_pow] at H + have Hpow : + pi ^ m • z ∈ Algebra.adjoin R ({B.gen} : Set L) := by + have HR : + ((↑unit : R) * pi ^ m) • z ∈ + Algebra.adjoin R ({B.gen} : Set L) := by + rw [← IsScalarTower.algebraMap_smul K'] + simpa [map_mul, map_pow] using H + have Hu := + Subalgebra.smul_mem + (Algebra.adjoin R ({B.gen} : Set L)) HR (↑(unit⁻¹) : R) + simpa [smul_smul, ← mul_assoc] using Hu + exact mem_adjoin_of_smul_prime_pow_smul_of_minpoly_isEisensteinAt + (UniqueFactorizationMonoid.irreducible_iff_prime.mp hpi) + hBint hzint Hpow hei + +private theorem + integralClosure_adjoin_eq_top_of_powerBasis_minpoly_isEisensteinAt + {R K' L A : Type*} [CommRing R] [IsDomain R] + [IsDiscreteValuationRing R] [Field K'] [Field L] [CommRing A] + [Algebra R K'] [Algebra K' L] [Algebra R L] + [Algebra R A] [Algebra A L] + [IsScalarTower R K' L] [IsScalarTower R A L] + [IsFractionRing R K'] [FiniteDimensional K' L] + [Algebra.IsSeparable K' L] [IsIntegralClosure A R L] + (B : PowerBasis K' L) (pi : R) (hpi : Irreducible pi) + (a : A) (ha : algebraMap A L a = B.gen) + (hmap_injective : Function.Injective (algebraMap A L)) + (hBint : IsIntegral R B.gen) + (hei : (minpoly R B.gen).IsEisensteinAt + (Ideal.span ({pi} : Set R))) : + Algebra.adjoin R ({a} : Set A) = ⊤ := by + apply top_unique + intro z _hz + let j : A →ₐ[R] L := IsScalarTower.toAlgHom R A L + have hzint : IsIntegral R (j z) := + IsIntegralClosure.isIntegral_iff.mpr ⟨z, rfl⟩ + have hzfield : + j z ∈ Algebra.adjoin R ({B.gen} : Set L) := + isIntegral_mem_adjoin_of_powerBasis_minpoly_isEisensteinAt + B pi hpi hBint hei hzint + have hmap : + (Algebra.adjoin R ({a} : Set A)).map j = + Algebra.adjoin R ({B.gen} : Set L) := by + rw [AlgHom.map_adjoin_singleton] + congr 2 + rw [← hmap] at hzfield + rcases hzfield with ⟨y, hy, hyz⟩ + have hya : y = z := hmap_injective hyz + exact hya ▸ hy + +/-- The canonical power basis of the simple standard Lubin--Tate level +extension. -/ +noncomputable def standardLubinTateLevelPowerBasis + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + PowerBasis K (standardLubinTateLevelField hπ n) := + IntermediateField.adjoin.powerBasis + (chosenStandardLubinTatePrimitiveRoot_isIntegral hπ n) + +/-- The chosen primitive root, regarded as an element of its standard level +field. -/ +noncomputable def standardLubinTateLevelGenerator + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + standardLubinTateLevelField hπ n := + (standardLubinTateLevelPowerBasis hπ n).gen + +/-- The level-field generator is the chosen primitive root after inclusion +into the separable closure. -/ +@[simp] +theorem standardLubinTateLevelGenerator_coe + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + ((standardLubinTateLevelGenerator hπ n : + standardLubinTateLevelField hπ n) : SeparableClosure K) = + chosenStandardLubinTatePrimitiveRoot hπ n := by + simp [standardLubinTateLevelGenerator, + standardLubinTateLevelPowerBasis, + IntermediateField.adjoin.powerBasis_gen] + +/-- The minimal polynomial of the level-field generator is the standard +primitive division polynomial over the base field. -/ +theorem standardLubinTateLevelPowerBasis_minpoly + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + minpoly K (standardLubinTateLevelPowerBasis hπ n).gen = + standardLubinTatePrimitivePolynomialOverField F π n := by + change + minpoly K + (IntermediateField.adjoin.powerBasis + (chosenStandardLubinTatePrimitiveRoot_isIntegral hπ n)).gen = + standardLubinTatePrimitivePolynomialOverField F π n + rw [IntermediateField.adjoin.powerBasis_gen, + IntermediateField.minpoly_gen, + ← standardLubinTatePrimitivePolynomialOverField_eq_minpoly hπ n] + +/-- The integral primitive polynomial annihilates the level-field +generator. -/ +theorem standardLubinTateLevelGenerator_aeval_primitivePolynomial + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + Polynomial.aeval (standardLubinTateLevelGenerator hπ n) + (standardLubinTatePrimitivePolynomial F π n) = 0 := by + let Q := standardLubinTatePrimitivePolynomial F π n + calc + Polynomial.aeval (standardLubinTateLevelGenerator hπ n) Q = + Polynomial.aeval (standardLubinTateLevelGenerator hπ n) + (Q.map (algebraMap F.valuationSubring K)) := by + symm + exact Polynomial.aeval_map_algebraMap K + (standardLubinTateLevelGenerator hπ n) Q + _ = Polynomial.aeval (standardLubinTateLevelGenerator hπ n) + (minpoly K (standardLubinTateLevelPowerBasis hπ n).gen) := by + rw [standardLubinTateLevelPowerBasis_minpoly hπ n] + rfl + _ = 0 := + minpoly.aeval K (standardLubinTateLevelPowerBasis hπ n).gen + +noncomputable local instance + standardLubinTateLevelField_finiteDimensionalInstance + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + FiniteDimensional K (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_finiteDimensional hπ n + +local instance standardLubinTateLevelField_isSeparableInstance + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + Algebra.IsSeparable K (standardLubinTateLevelField hπ n) := + (IntermediateField.isSeparable_adjoin_simple_iff_isSeparable + (F := K) (E := SeparableClosure K)).2 + (Algebra.IsSeparable.isSeparable K + (chosenStandardLubinTatePrimitiveRoot hπ n)) + +private theorem standardLubinTateLevelCompleteDVFData_exists + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + ∃ target : CompleteDVF.{u, 0} (standardLubinTateLevelField hπ n), + ∃ hExt : F.toCompleteDVF.valuation.HasExtension target.valuation, + letI : F.toCompleteDVF.valuation.HasExtension target.valuation := hExt + IsIntegralClosure target.valuationSubring F.valuationSubring + (standardLubinTateLevelField hπ n) ∧ + degree F.toCompleteDVF.toDVF target.toDVF = + ramificationIndex F.toCompleteDVF.toDVF target.toDVF * + residueDegree F.toCompleteDVF.toDVF target.toDVF := by + exact + exists_integralClosure_standard_fundamental_identity + (K := K) (L := standardLubinTateLevelField hπ n) + F.toCompleteDVF + +/-- The complete discrete valuation on a standard Lubin--Tate level field +selected from its actual integral closure over the base valuation ring. -/ +noncomputable def standardLubinTateLevelCompleteDVF + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + CompleteDVF.{u, 0} (standardLubinTateLevelField hπ n) := + Classical.choose (show ∃ target : CompleteDVF.{u, 0} (standardLubinTateLevelField hπ n), + ∃ hExt : F.toCompleteDVF.valuation.HasExtension target.valuation, + letI : F.toCompleteDVF.valuation.HasExtension target.valuation := hExt + IsIntegralClosure target.valuationSubring F.valuationSubring + (standardLubinTateLevelField hπ n) ∧ + degree F.toCompleteDVF.toDVF target.toDVF = + ramificationIndex F.toCompleteDVF.toDVF target.toDVF * + residueDegree F.toCompleteDVF.toDVF target.toDVF from by + exact standardLubinTateLevelCompleteDVFData_exists hπ n) + +/-- The chosen level valuation extends the given base valuation. -/ +theorem standardLubinTateLevelCompleteDVF_hasExtension + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + F.toCompleteDVF.valuation.HasExtension + (standardLubinTateLevelCompleteDVF hπ n).valuation := + Classical.choose + (Classical.choose_spec + (standardLubinTateLevelCompleteDVFData_exists hπ n)) + +noncomputable instance + standardLubinTateLevelCompleteDVF_hasExtensionInstance + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + F.toCompleteDVF.valuation.HasExtension + (standardLubinTateLevelCompleteDVF hπ n).valuation := + standardLubinTateLevelCompleteDVF_hasExtension hπ n + +local instance standardLubinTateLevelValuationSubring_isScalarTower + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + IsScalarTower F.valuationSubring + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (standardLubinTateLevelField hπ n) := + IsScalarTower.of_algebraMap_eq' rfl + +/-- The target valuation ring is the actual integral closure of the base +valuation ring in the standard level field. -/ +theorem standardLubinTateLevelCompleteDVF_isIntegralClosure + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + IsIntegralClosure + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + F.valuationSubring (standardLubinTateLevelField hπ n) := + (Classical.choose_spec + (Classical.choose_spec + (standardLubinTateLevelCompleteDVFData_exists hπ n))).1 + +/-- The chosen integral-closure valuation satisfies the fundamental identity +at the standard Lubin--Tate level. -/ +theorem standardLubinTateLevelCompleteDVF_fundamentalIdentity + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + degree F.toCompleteDVF.toDVF + (standardLubinTateLevelCompleteDVF hπ n).toDVF = + ramificationIndex F.toCompleteDVF.toDVF + (standardLubinTateLevelCompleteDVF hπ n).toDVF * + residueDegree F.toCompleteDVF.toDVF + (standardLubinTateLevelCompleteDVF hπ n).toDVF := + (Classical.choose_spec + (Classical.choose_spec + (standardLubinTateLevelCompleteDVFData_exists hπ n))).2 + +noncomputable instance + standardLubinTateLevelValuationSubring_moduleFinite + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + Module.Finite F.valuationSubring + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := by + let : IsIntegralClosure + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + F.valuationSubring (standardLubinTateLevelField hπ n) := + standardLubinTateLevelCompleteDVF_isIntegralClosure hπ n + let : IsFractionRing F.valuationSubring K := + base_valuationSubring_isFractionRing (K := K) F.toCompleteDVF + let : IsIntegrallyClosed F.valuationSubring := + base_valuationSubring_isIntegrallyClosed (K := K) F.toCompleteDVF + let : IsNoetherianRing F.valuationSubring := + base_valuationSubring_isNoetherianRing (K := K) F.toCompleteDVF + exact IsIntegralClosure.finite F.valuationSubring K + (standardLubinTateLevelField hπ n) + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + +/-- The chosen complete-DVF structure is a local-field structure: its +residue field is finite over the finite residue field of `F`. -/ +noncomputable def standardLubinTateLevelLocalField + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + LocalField.{u, 0} (standardLubinTateLevelField hπ n) := by + let target := standardLubinTateLevelCompleteDVF hπ n + letI : FiniteDimensional F.residueField target.residueField := + residueField_finiteDimensional_of_moduleFinite F.toCompleteDVF target + letI : Finite target.residueField := + Module.finite_of_finite F.residueField + exact { toCompleteDVF := target } + +/-- The level generator is integral over the base valuation ring, witnessed +by the genuine integral primitive division polynomial. -/ +theorem standardLubinTateLevelGenerator_isIntegral_over_valuationSubring + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + IsIntegral F.valuationSubring + (standardLubinTateLevelGenerator hπ n) := + ⟨standardLubinTatePrimitivePolynomial F π n, + standardLubinTatePrimitivePolynomial_monic F π n, + standardLubinTateLevelGenerator_aeval_primitivePolynomial hπ n⟩ + +/-- The integral minimal polynomial of the primitive level generator is the +standard primitive division polynomial. -/ +theorem standardLubinTatePrimitivePoint_minpoly + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + minpoly F.valuationSubring + (standardLubinTateLevelPowerBasis hπ n).gen = + standardLubinTatePrimitivePolynomial F π n := by + have hgen : + IsIntegral F.valuationSubring + (standardLubinTateLevelPowerBasis hπ n).gen := by + simpa only [standardLubinTateLevelGenerator] using + standardLubinTateLevelGenerator_isIntegral_over_valuationSubring + hπ n + apply Polynomial.map_injective + (algebraMap F.valuationSubring K) + (fun x y h => Subtype.ext h) + rw [← minpoly.isIntegrallyClosed_eq_field_fractions' K + hgen, + standardLubinTateLevelPowerBasis_minpoly hπ n] + rfl + +/-- The chosen primitive root belongs to the selected integral-closure +valuation ring. -/ +theorem standardLubinTateLevelGenerator_mem_valuationSubring + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + standardLubinTateLevelGenerator hπ n ∈ + (standardLubinTateLevelCompleteDVF hπ n).valuation.valuationSubring := by + let : IsIntegralClosure + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + F.valuationSubring (standardLubinTateLevelField hπ n) := + standardLubinTateLevelCompleteDVF_isIntegralClosure hπ n + rcases + (IsIntegralClosure.isIntegral_iff + (A := (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) + (R := F.valuationSubring) + (B := standardLubinTateLevelField hπ n)).1 + (standardLubinTateLevelGenerator_isIntegral_over_valuationSubring + hπ n) with + ⟨z, hz⟩ + change + (standardLubinTateLevelCompleteDVF hπ n).valuation + (standardLubinTateLevelGenerator hπ n) ≤ 1 + rw [← hz] + exact z.property + +/-- The primitive division point as an element of the chosen level valuation +ring. -/ +noncomputable def standardLubinTatePrimitivePointInteger + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := + ⟨standardLubinTateLevelGenerator hπ n, + standardLubinTateLevelGenerator_mem_valuationSubring hπ n⟩ + +/-- The valuation-ring primitive point has the chosen level generator as its +underlying field element. -/ +@[simp] +theorem standardLubinTatePrimitivePointInteger_coe + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + (standardLubinTatePrimitivePointInteger hπ n : + standardLubinTateLevelField hπ n) = + standardLubinTateLevelGenerator hπ n := + rfl + +/-- The primitive Lubin--Tate point generates the entire integral-closure +valuation ring over the base valuation ring. -/ +theorem standardLubinTatePrimitivePointInteger_adjoin_eq_top + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + Algebra.adjoin F.valuationSubring + ({standardLubinTatePrimitivePointInteger hπ n} : + Set + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) = + ⊤ := by + let : FiniteDimensional K (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsScalarTower F.valuationSubring + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (standardLubinTateLevelField hπ n) := + IsScalarTower.of_algebraMap_eq' rfl + let : IsIntegralClosure + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + F.valuationSubring (standardLubinTateLevelField hπ n) := + standardLubinTateLevelCompleteDVF_isIntegralClosure hπ n + have hπIrreducible : Irreducible π := + (IsDiscreteValuationRing.irreducible_iff_uniformizer π).2 + (F.toCompleteDVF.maximalIdeal_eq_span_uniformizer hπ) + apply + integralClosure_adjoin_eq_top_of_powerBasis_minpoly_isEisensteinAt + (standardLubinTateLevelPowerBasis hπ n) + π hπIrreducible + (standardLubinTatePrimitivePointInteger hπ n) + (by rfl) + (fun x y h => Subtype.ext h) + (standardLubinTateLevelGenerator_isIntegral_over_valuationSubring + hπ n) + rw [standardLubinTatePrimitivePoint_minpoly hπ n] + rw [← F.toCompleteDVF.maximalIdeal_eq_span_uniformizer hπ] + exact standardLubinTatePrimitivePolynomial_isEisensteinAt hπ n + +private noncomputable def + standardLubinTatePrimitivePointIntegerToSeparableClosure + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring →+* + SeparableClosure K := + (standardLubinTateLevelField hπ n).val.toRingHom.comp + (standardLubinTateLevelCompleteDVF hπ n).valuation.valuationSubring.subtype + +private theorem + standardLubinTatePrimitivePointIntegerToSeparableClosure_injective + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + Function.Injective + (standardLubinTatePrimitivePointIntegerToSeparableClosure hπ n) := by + intro a b hab + change + (standardLubinTateLevelField hπ n).val + (a : standardLubinTateLevelField hπ n) = + (standardLubinTateLevelField hπ n).val + (b : standardLubinTateLevelField hπ n) at hab + apply Subtype.ext + exact (standardLubinTateLevelField hπ n).val.injective hab + +private theorem + standardLubinTatePrimitivePointIntegerToSeparableClosure_comp_integerMap + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + (standardLubinTatePrimitivePointIntegerToSeparableClosure hπ n).comp + (integerMap F.toCompleteDVF.toDVF + (standardLubinTateLevelCompleteDVF hπ n).toDVF) = + (algebraMap K (SeparableClosure K)).comp + (algebraMap F.valuationSubring K) := by + apply RingHom.ext + intro a + change + ((standardLubinTateLevelField hπ n).val + (((integerMap F.toCompleteDVF.toDVF + (standardLubinTateLevelCompleteDVF hπ n).toDVF) a : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) : + standardLubinTateLevelField hπ n)) = + algebraMap K (SeparableClosure K) + (algebraMap F.valuationSubring K a) + rw [integerMap_apply] + exact (standardLubinTateLevelField hπ n).val.commutes + (algebraMap F.valuationSubring K a) + +private theorem + standardLubinTatePrimitivePointIntegerToSeparableClosure_apply + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + standardLubinTatePrimitivePointIntegerToSeparableClosure hπ n + (standardLubinTatePrimitivePointInteger hπ n) = + chosenStandardLubinTatePrimitiveRoot hπ n := by + change + ((standardLubinTateLevelGenerator hπ n : + standardLubinTateLevelField hπ n) : SeparableClosure K) = + chosenStandardLubinTatePrimitiveRoot hπ n + exact standardLubinTateLevelGenerator_coe hπ n + +private theorem polynomial_eval₂_mem_ideal_of_coeff_mem + {R S : Type*} [CommSemiring R] [CommSemiring S] + (f : R →+* S) (I : Ideal S) (P : Polynomial R) (z : S) + (hcoeff : ∀ i, f (P.coeff i) ∈ I) : + P.eval₂ f z ∈ I := by + rw [Polynomial.eval₂_eq_sum_range] + exact Ideal.sum_mem _ fun i _ => + Ideal.mul_mem_right (z ^ i) I (hcoeff i) + +/-- The integral primitive polynomial annihilates the primitive point in the +valuation ring of the standard finite level. -/ +theorem standardLubinTatePrimitivePointInteger_aeval + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + Polynomial.aeval (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePrimitivePolynomial F π n) = 0 := by + let target := standardLubinTateLevelCompleteDVF hπ n + let i : target.valuationSubring →ₐ[F.valuationSubring] + standardLubinTateLevelField hπ n := + IsScalarTower.toAlgHom F.valuationSubring target.valuationSubring + (standardLubinTateLevelField hπ n) + apply Subtype.ext + change + i (Polynomial.aeval (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePrimitivePolynomial F π n)) = i 0 + rw [← Polynomial.aeval_algHom_apply (f := i), map_zero] + simpa [i] using + standardLubinTateLevelGenerator_aeval_primitivePolynomial hπ n + +private theorem enat_eq_one_of_mul_eq_nat + {d e : ℕ} {a : ℕ∞} (hd : d ≠ 0) (he : e ≤ d) + (ha : 1 ≤ a) (hmul : (d : ℕ∞) * a = (e : ℕ∞)) : + a = 1 ∧ e = d := by + have hdcoe : (d : ℕ∞) ≠ 0 := by exact_mod_cast hd + have hmul_le : (d : ℕ∞) * a ≤ (d : ℕ∞) * 1 := by + rw [hmul] + have hcast : (e : ℕ∞) ≤ (d : ℕ∞) := by exact_mod_cast he + simpa using hcast + have hav : a = 1 := le_antisymm + ((ENat.mul_le_mul_left_iff hdcoe (ENat.natCast_ne_top d)).1 hmul_le) ha + refine ⟨hav, ?_⟩ + rw [hav, mul_one] at hmul + exact_mod_cast hmul.symm + +private theorem + standardLubinTatePrimitivePointInteger_addVal_and_ramificationIndex + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (standardLubinTatePrimitivePointInteger hπ n) = 1 ∧ + ramificationIndex F.toCompleteDVF.toDVF + (standardLubinTateLevelCompleteDVF hπ n).toDVF = + degree F.toCompleteDVF.toDVF + (standardLubinTateLevelCompleteDVF hπ n).toDVF := by + let base := F.toCompleteDVF + let target := standardLubinTateLevelCompleteDVF hπ n + let Q := standardLubinTatePrimitivePolynomial F π n + let d := + (Nat.card F.residueField - 1) * Nat.card F.residueField ^ n + let e := ramificationIndex base.toDVF target.toDVF + let f := residueDegree base.toDVF target.toDVF + let p := base.maximalIdeal + let P := target.maximalIdeal + let j := integerMap base.toDVF target.toDVF + let lambda := standardLubinTatePrimitivePointInteger hπ n + let R := Q - Polynomial.X ^ d + have hdpos : 0 < d := by + dsimp [d] + exact Nat.mul_pos + (Nat.sub_pos_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField)) + (Nat.pow_pos Nat.card_pos) + have hdne : d ≠ 0 := Nat.ne_of_gt hdpos + have hdegree : degree base.toDVF target.toDVF = d := by + simpa [base, target, d, degree] using + standardLubinTateLevelField_finrank hπ n + have hfund : d = e * f := by + calc + d = degree base.toDVF target.toDVF := hdegree.symm + _ = e * f := by + simpa [base, target, e, f] using + standardLubinTateLevelCompleteDVF_fundamentalIdentity hπ n + have he_ne : e ≠ 0 := by + intro he + apply hdne + rw [hfund, he, zero_mul] + have hf_ne : f ≠ 0 := by + intro hf + apply hdne + rw [hfund, hf, mul_zero] + have hele : e ≤ d := by + rw [hfund] + exact Nat.le_mul_of_pos_right e (Nat.pos_of_ne_zero hf_ne) + have hRmap : R.map F.residueMap = 0 := by + change + (standardLubinTatePrimitivePolynomial F π n - + Polynomial.X ^ d).map F.residueMap = 0 + rw [Polynomial.map_sub, + standardLubinTatePrimitivePolynomial_map_residue hπ n, + Polynomial.map_pow, Polynomial.map_X, sub_self] + have hRcoeff (i : ℕ) : R.coeff i ∈ p := by + apply (base.residue_eq_zero_iff (R.coeff i)).1 + simpa [base, p] using + congrArg (fun S : Polynomial F.residueField => S.coeff i) hRmap + have hR_eval_mem_map : + R.eval₂ j lambda ∈ Ideal.map j p := + polynomial_eval₂_mem_ideal_of_coeff_mem j (Ideal.map j p) R lambda + (fun i => Ideal.mem_map_of_mem j (hRcoeff i)) + have hmap : + Ideal.map j p = P ^ e := by + simpa [base, target, p, P, j, e] using + maximalIdeal_map_eq_target_maximalIdeal_pow_ramificationIndex + base target + have hR_eval_mem_pow : R.eval₂ j lambda ∈ P ^ e := by + rw [← hmap] + exact hR_eval_mem_map + have hR_eval_mem_P : R.eval₂ j lambda ∈ P := + by + simpa only [pow_one] using + Ideal.pow_le_pow_right (Nat.pos_of_ne_zero he_ne) + hR_eval_mem_pow + have hroot : Q.eval₂ j lambda = 0 := by + simpa only [Polynomial.aeval_def, Q, j, lambda, base, target, + integerMap] using + standardLubinTatePrimitivePointInteger_aeval hπ n + have hQdecomp : Q = Polynomial.X ^ d + R := by + calc + Q = (Q - Polynomial.X ^ d) + Polynomial.X ^ d := + (sub_add_cancel Q (Polynomial.X ^ d)).symm + _ = Polynomial.X ^ d + R := by + rw [add_comm] + have hrootDecomp : lambda ^ d + R.eval₂ j lambda = 0 := by + rw [hQdecomp, Polynomial.eval₂_add, Polynomial.eval₂_pow, + Polynomial.eval₂_X] at hroot + exact hroot + have hlambdaPowMem : lambda ^ d ∈ P := by + have heq : lambda ^ d = -(R.eval₂ j lambda) := + eq_neg_of_add_eq_zero_left hrootDecomp + rw [heq] + exact P.neg_mem hR_eval_mem_P + have hPprime : P.IsPrime := + (IsLocalRing.maximalIdeal.isMaximal target.valuationSubring).isPrime + have hlambdaMem : lambda ∈ P := + hPprime.mem_of_pow_mem d hlambdaPowMem + have hdivCoeff (i : ℕ) : (R.divX.coeff i) ∈ p := by + rw [Polynomial.coeff_divX] + exact hRcoeff (i + 1) + let tail := R.divX.eval₂ j lambda + have htail_mem_map : tail ∈ Ideal.map j p := + polynomial_eval₂_mem_ideal_of_coeff_mem j (Ideal.map j p) R.divX + lambda (fun i => Ideal.mem_map_of_mem j (hdivCoeff i)) + have htail_mem_pow : tail ∈ P ^ e := by + rw [← hmap] + exact htail_mem_map + have hlambdaTailMem : lambda * tail ∈ P ^ (e + 1) := by + rw [pow_succ] + have hmul : + tail * lambda ∈ P ^ e * P := + Ideal.mul_mem_mul htail_mem_pow hlambdaMem + rwa [mul_comm tail lambda] at hmul + have hRcoeffZero : R.coeff 0 = π := by + change + (standardLubinTatePrimitivePolynomial F π n - + Polynomial.X ^ d).coeff 0 = π + rw [Polynomial.coeff_sub, + standardLubinTatePrimitivePolynomial_coeff_zero] + simp only [Polynomial.coeff_X_pow, ite_eq_right hdne.symm, sub_zero] + have hpiIrreducible : Irreducible π := + (IsDiscreteValuationRing.irreducible_iff_uniformizer π).2 + (base.maximalIdeal_eq_span_uniformizer hπ) + have hconst : + IsDiscreteValuationRing.addVal target.valuationSubring + (j (R.coeff 0)) = (e : ℕ∞) := by + rw [hRcoeffZero] + exact addVal_integerMap_eq_ramificationIndex_of_irreducible base target + hpiIrreducible + have hR_eval : + R.eval₂ j lambda = j (R.coeff 0) + lambda * tail := by + have h := + congrArg (Polynomial.eval₂ j lambda) + (Polynomial.X_mul_divX_add R) + rw [Polynomial.eval₂_add, Polynomial.eval₂_mul, + Polynomial.eval₂_X, Polynomial.eval₂_C] at h + calc + R.eval₂ j lambda = lambda * tail + j (R.coeff 0) := by + simpa [tail] using h.symm + _ = j (R.coeff 0) + lambda * tail := + add_comm _ _ + have htailVal : + ((e + 1 : ℕ) : ℕ∞) ≤ + IsDiscreteValuationRing.addVal target.valuationSubring + (lambda * tail) := + (IsDiscreteValuationRing.mem_maximalIdeal_pow_iff_addVal_ge + (lambda * tail) (e + 1)).1 hlambdaTailMem + have heCastLt : + (e : ℕ∞) < + IsDiscreteValuationRing.addVal target.valuationSubring + (lambda * tail) := by + exact + (show (e : ℕ∞) < ((e + 1 : ℕ) : ℕ∞) by + exact_mod_cast Nat.lt_succ_self e).trans_le htailVal + have hdistinct : + IsDiscreteValuationRing.addVal target.valuationSubring + (j (R.coeff 0)) ≠ + IsDiscreteValuationRing.addVal target.valuationSubring + (lambda * tail) := by + rw [hconst] + exact ne_of_lt heCastLt + have hRval : + IsDiscreteValuationRing.addVal target.valuationSubring + (R.eval₂ j lambda) = (e : ℕ∞) := by + rw [hR_eval, + (IsDiscreteValuationRing.addVal target.valuationSubring).map_add_of_distinct_val + hdistinct, + hconst, min_eq_left] + exact heCastLt.le + have hpowEq : + lambda ^ d = -(R.eval₂ j lambda) := + eq_neg_of_add_eq_zero_left hrootDecomp + have hmul : + (d : ℕ∞) * + IsDiscreteValuationRing.addVal target.valuationSubring lambda = + (e : ℕ∞) := by + calc + (d : ℕ∞) * + IsDiscreteValuationRing.addVal target.valuationSubring lambda = + d • IsDiscreteValuationRing.addVal + target.valuationSubring lambda := by + rw [nsmul_eq_mul] + _ = IsDiscreteValuationRing.addVal target.valuationSubring + (lambda ^ d) := by + symm + exact IsDiscreteValuationRing.addVal_pow lambda d + _ = IsDiscreteValuationRing.addVal target.valuationSubring + (-(R.eval₂ j lambda)) := by rw [hpowEq] + _ = IsDiscreteValuationRing.addVal target.valuationSubring + (R.eval₂ j lambda) := + (IsDiscreteValuationRing.addVal target.valuationSubring).map_neg _ + _ = (e : ℕ∞) := hRval + have honele : + 1 ≤ IsDiscreteValuationRing.addVal target.valuationSubring lambda := by + simpa using + (IsDiscreteValuationRing.mem_maximalIdeal_pow_iff_addVal_ge + lambda 1).1 + (by simpa only [pow_one] using hlambdaMem) + obtain ⟨hlambdaVal, hed⟩ := enat_eq_one_of_mul_eq_nat hdne hele honele hmul + have heramDegree : + ramificationIndex F.toCompleteDVF.toDVF + (standardLubinTateLevelCompleteDVF hπ n).toDVF = + degree F.toCompleteDVF.toDVF + (standardLubinTateLevelCompleteDVF hπ n).toDVF := by + simpa [base, target, e] using hed.trans hdegree.symm + exact ⟨hlambdaVal, heramDegree⟩ + +/-- The chosen primitive division point has normalized additive valuation one +in the integral-closure valuation ring. -/ +theorem standardLubinTatePrimitivePointInteger_addVal + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (standardLubinTatePrimitivePointInteger hπ n) = 1 := + (standardLubinTatePrimitivePointInteger_addVal_and_ramificationIndex + hπ n).1 + +/-- The standard finite Lubin--Tate level is totally ramified: its +ramification index equals its field degree. -/ +theorem standardLubinTateLevel_ramificationIndex_eq_degree + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + ramificationIndex F.toCompleteDVF.toDVF + (standardLubinTateLevelCompleteDVF hπ n).toDVF = + degree F.toCompleteDVF.toDVF + (standardLubinTateLevelCompleteDVF hπ n).toDVF := + (standardLubinTatePrimitivePointInteger_addVal_and_ramificationIndex + hπ n).2 + +/-- The image of any base-field uniformizer in a standard finite level has +additive valuation equal to the degree of that level. The uniformizer used +here need not be the parameter defining the Lubin--Tate level. -/ +theorem standardLubinTateUniformizerInteger_map_addVal + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + {ϖ : F.valuationSubring} + (hϖ : F.toCompleteDVF.valuation.IsUniformizer (ϖ : K)) + (n : ℕ) : + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (integerMap F.toCompleteDVF.toDVF + (standardLubinTateLevelCompleteDVF hπ n).toDVF ϖ) = + (((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n : ℕ) : ℕ∞) := by + let target := standardLubinTateLevelCompleteDVF hπ n + have hϖIrreducible : Irreducible ϖ := by + exact + (IsDiscreteValuationRing.irreducible_iff_uniformizer ϖ).2 + (F.toCompleteDVF.maximalIdeal_eq_span_uniformizer hϖ) + have hdegree : + degree F.toCompleteDVF.toDVF target.toDVF = + (Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n := by + simpa [target, degree] using + standardLubinTateLevelField_finrank hπ n + calc + IsDiscreteValuationRing.addVal target.valuationSubring + (integerMap F.toCompleteDVF.toDVF target.toDVF ϖ) = + (ramificationIndex F.toCompleteDVF.toDVF target.toDVF : ℕ∞) := + addVal_integerMap_eq_ramificationIndex_of_irreducible + F.toCompleteDVF target + hϖIrreducible + _ = (degree F.toCompleteDVF.toDVF target.toDVF : ℕ∞) := by + rw [standardLubinTateLevel_ramificationIndex_eq_degree hπ n] + _ = (((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n : ℕ) : ℕ∞) := by + exact_mod_cast hdegree + +/-- The image of the parameter uniformizer has additive valuation equal to +the standard finite-level degree. -/ +theorem standardLubinTateBaseUniformizerInteger_map_addVal + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + IsDiscreteValuationRing.addVal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring + (integerMap F.toCompleteDVF.toDVF + (standardLubinTateLevelCompleteDVF hπ n).toDVF π) = + (((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n : ℕ) : ℕ∞) := + standardLubinTateUniformizerInteger_map_addVal hπ hπ n + +/-- The primitive point is irreducible in the integral-closure valuation +ring. -/ +theorem standardLubinTatePrimitivePointInteger_irreducible + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + Irreducible (standardLubinTatePrimitivePointInteger hπ n) := by + let target := standardLubinTateLevelCompleteDVF hπ n + let lambda := standardLubinTatePrimitivePointInteger hπ n + obtain ⟨varpi, hvarpi⟩ := + IsDiscreteValuationRing.exists_irreducible target.valuationSubring + have hval : + IsDiscreteValuationRing.addVal target.valuationSubring lambda = + IsDiscreteValuationRing.addVal target.valuationSubring varpi := by + rw [standardLubinTatePrimitivePointInteger_addVal hπ n, + IsDiscreteValuationRing.addVal_uniformizer hvarpi] + exact + ((IsDiscreteValuationRing.addVal_eq_iff_associated lambda varpi).1 hval).symm.irreducible + hvarpi + +/-- The chosen primitive division point is a uniformizer of the standard +Lubin--Tate level field with its integral-closure valuation. -/ +theorem standardLubinTatePrimitivePoint_isUniformizer + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + (standardLubinTateLevelCompleteDVF hπ n).valuation.IsUniformizer + (standardLubinTatePrimitivePointInteger hπ n : + standardLubinTateLevelField hπ n) := by + exact Valuation.isUniformizer_of_maximalIdeal_eq_span + (v := (standardLubinTateLevelCompleteDVF hπ n).valuation) + (standardLubinTatePrimitivePointInteger_irreducible hπ n).maximalIdeal_eq + +/-- Evaluation in the chosen target valuation ring records that the primitive +level-`n + 1` point is killed by the level-`n + 1` standard iterate. -/ +theorem standardLubinTatePrimitivePointInteger_iterate_succ_eq_zero + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + Polynomial.eval₂ + (integerMap F.toCompleteDVF.toDVF + (standardLubinTateLevelCompleteDVF hπ n).toDVF) + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePolynomialIterate F π (n + 1)) = 0 := by + apply + standardLubinTatePrimitivePointIntegerToSeparableClosure_injective + hπ n + rw [map_zero, Polynomial.hom_eval₂, + standardLubinTatePrimitivePointIntegerToSeparableClosure_comp_integerMap + hπ n, + standardLubinTatePrimitivePointIntegerToSeparableClosure_apply hπ n] + simpa only [ + standardLubinTatePolynomialIterateOverSeparableClosure_eval] using + chosenStandardLubinTatePrimitiveRoot_iterate_succ_eq_zero hπ n + +/-- No iterate of index at most `n` already kills the primitive +level-`n + 1` point, now expressed inside the chosen target valuation ring. -/ +theorem standardLubinTatePrimitivePointInteger_iterate_ne_zero_of_le + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) + {r : ℕ} (hr : r ≤ n) : + Polynomial.eval₂ + (integerMap F.toCompleteDVF.toDVF + (standardLubinTateLevelCompleteDVF hπ n).toDVF) + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePolynomialIterate F π r) ≠ 0 := by + intro hzero + have hzeroMap := + congrArg + (standardLubinTatePrimitivePointIntegerToSeparableClosure hπ n) + hzero + rw [map_zero, Polynomial.hom_eval₂, + standardLubinTatePrimitivePointIntegerToSeparableClosure_comp_integerMap + hπ n, + standardLubinTatePrimitivePointIntegerToSeparableClosure_apply hπ n] + at hzeroMap + have hzeroSeparable : + (standardLubinTatePolynomialIterateOverSeparableClosure F π r).eval + (chosenStandardLubinTatePrimitiveRoot hπ n) = 0 := by + simpa only [ + standardLubinTatePolynomialIterateOverSeparableClosure_eval] using + hzeroMap + have hnzero : + (standardLubinTatePolynomialIterateOverSeparableClosure F π n).eval + (chosenStandardLubinTatePrimitiveRoot hπ n) = 0 := by + calc + (standardLubinTatePolynomialIterateOverSeparableClosure F π n).eval + (chosenStandardLubinTatePrimitiveRoot hπ n) = + (standardLubinTatePolynomialIterateOverSeparableClosure + F π ((n - r) + r)).eval + (chosenStandardLubinTatePrimitiveRoot hπ n) := by + rw [Nat.sub_add_cancel hr] + _ = + (standardLubinTatePolynomialIterateOverSeparableClosure + F π (n - r)).eval + ((standardLubinTatePolynomialIterateOverSeparableClosure + F π r).eval + (chosenStandardLubinTatePrimitiveRoot hπ n)) := + standardLubinTatePolynomialIterateOverSeparableClosure_eval_add + F π (n - r) r + (chosenStandardLubinTatePrimitiveRoot hπ n) + _ = + (standardLubinTatePolynomialIterateOverSeparableClosure + F π (n - r)).eval 0 := by + rw [hzeroSeparable] + _ = 0 := by + rw [standardLubinTatePolynomialIterateOverSeparableClosure, + Polynomial.eval_zero_map, + standardLubinTatePolynomialIterate_eval_zero, map_zero] + exact chosenStandardLubinTatePrimitiveRoot_iterate_ne_zero hπ n hnzero + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/StandardLocalField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/StandardLocalField.lean new file mode 100644 index 0000000000..1aada7c154 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/StandardLocalField.lean @@ -0,0 +1,318 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueQuotient +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups +/-! +# The canonical local-field package for Lubin--Tate applications + +A topology-first nonarchimedean local field carries the canonical valuation +used by finite local reciprocity. This file packages that valuation as a +`LocalField` and identifies its valuation ring and principal-unit filtration +with the pre-existing `𝒪[K]`, `principalUnits`, and `LocalFieldTheory.fieldPrincipalUnits` +interfaces. +-/ + +@[expose] public section + +noncomputable +section + +open scoped ValuativeRel + +namespace LubinTate + +open LocalFieldTheory +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +open LocalFieldTheory.IsNonarchimedeanLocalField + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The canonical complete discrete valuation on `K`, together with its +finite residue field, packaged for the standard Lubin--Tate construction. -/ +noncomputable def standardLocalField : LocalField K where + toCompleteDVF := LocalFieldTheory.localCompleteDVF K + residueFinite := by + change Finite 𝓀[K] + infer_instance + +/-- Forgetting residue-field finiteness recovers the canonical complete-DVF +package used by finite local reciprocity. -/ +@[simp] +theorem standardLocalField_toCompleteDVF : + (standardLocalField K).toCompleteDVF = + LocalFieldTheory.localCompleteDVF K := + rfl + +/-- The valuation in the canonical local-field package is the valuation +attached to the given valuative relation. -/ +theorem standardLocalField_valuation_eq : + (standardLocalField K).valuation = + ValuativeRel.valuation K := by + unfold standardLocalField + unfold LocalFieldTheory.localCompleteDVF + unfold ValuationTheory.Valuations.completeDVFOfCompleteValuedField + rfl + +/-- The residue field in the canonical package has the same finite +cardinality as the topology-first residue field. -/ +@[simp] +theorem standardLocalField_residueField_natCard : + Nat.card (standardLocalField K).residueField = + Nat.card 𝓀[K] := + rfl + +/-- Identity on underlying field elements identifies the topology-first +integer ring with the valuation ring of the canonical package. -/ +noncomputable def standardLocalFieldIntegerEquiv : + 𝒪[K] ≃+* (standardLocalField K).valuationSubring where + toFun x := ⟨x, by + change (standardLocalField K).valuation (x : K) ≤ 1 + rw [standardLocalField_valuation_eq] + exact x.property⟩ + invFun x := ⟨x, by + change ValuativeRel.valuation K (x : K) ≤ 1 + rw [← standardLocalField_valuation_eq] + exact x.property⟩ + left_inv := fun _ => rfl + right_inv := fun _ => rfl + map_add' := fun _ _ => rfl + map_mul' := fun _ _ => rfl + +/-- The canonical integer-ring equivalence preserves the underlying field +element. -/ +@[simp] +theorem standardLocalFieldIntegerEquiv_apply_coe (x : 𝒪[K]) : + (((standardLocalFieldIntegerEquiv K x : + (standardLocalField K).valuationSubring)) : K) = + (x : K) := + rfl + +/-- The inverse canonical integer-ring equivalence preserves the underlying +field element. -/ +@[simp] +theorem standardLocalFieldIntegerEquiv_symm_apply_coe + (x : (standardLocalField K).valuationSubring) : + ((((standardLocalFieldIntegerEquiv K).symm x : 𝒪[K])) : K) = + (x : K) := + rfl + +/-- The canonical integer-ring equivalence sends the maximal ideal to the +maximal ideal of the packaged valuation ring. -/ +theorem standardLocalFieldIntegerEquiv_map_maximalIdeal : + Ideal.map (standardLocalFieldIntegerEquiv K).toRingHom + (𝓂[K] : Ideal 𝒪[K]) = + (standardLocalField K).maximalIdeal := by + let e := standardLocalFieldIntegerEquiv K + change + Ideal.map e.toRingHom (IsLocalRing.maximalIdeal 𝒪[K]) = + IsLocalRing.maximalIdeal (standardLocalField K).valuationSubring + apply le_antisymm + · rw [Ideal.map_le_iff_le_comap] + intro x hx + change e x ∈ + IsLocalRing.maximalIdeal (standardLocalField K).valuationSubring + rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] at hx ⊢ + intro h + have h' := h.map e.symm.toRingHom + exact hx (by simpa using h') + · intro y hy + obtain ⟨x, rfl⟩ := e.surjective y + apply Ideal.mem_map_of_mem + rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] at hy ⊢ + intro h + exact hy (h.map e.toRingHom) + +/-- The canonical integer-ring equivalence preserves every maximal-ideal +power. -/ +theorem standardLocalFieldIntegerEquiv_map_maximalIdeal_pow (n : ℕ) : + Ideal.map (standardLocalFieldIntegerEquiv K).toRingHom + ((𝓂[K] : Ideal 𝒪[K]) ^ n) = + (standardLocalField K).maximalIdeal ^ n := by + rw [Ideal.map_pow, + standardLocalFieldIntegerEquiv_map_maximalIdeal] + +/-- Membership in a maximal-ideal power is reflected by the canonical +integer-ring equivalence. -/ +theorem standardLocalFieldIntegerEquiv_mem_maximalIdeal_pow_iff + (n : ℕ) (x : 𝒪[K]) : + standardLocalFieldIntegerEquiv K x ∈ + (standardLocalField K).maximalIdeal ^ n ↔ + x ∈ (𝓂[K] : Ideal 𝒪[K]) ^ n := by + rw [← standardLocalFieldIntegerEquiv_map_maximalIdeal_pow K n] + constructor + · intro hx + rcases + (Ideal.mem_map_iff_of_surjective + (standardLocalFieldIntegerEquiv K).toRingHom + (standardLocalFieldIntegerEquiv K).surjective).1 hx with + ⟨y, hy, hey⟩ + exact (standardLocalFieldIntegerEquiv K).injective hey ▸ hy + · exact + Ideal.mem_map_of_mem + (standardLocalFieldIntegerEquiv K).toRingHom + +/-- The induced multiplicative equivalence between the two valuation-ring +unit groups. -/ +noncomputable def standardLocalFieldIntegerUnitsEquiv : + 𝒪[K]ˣ ≃* + (standardLocalField K).valuationSubringˣ := + Units.mapEquiv + (standardLocalFieldIntegerEquiv K).toMulEquiv + +/-- The induced unit equivalence preserves the underlying field element. -/ +@[simp] +theorem standardLocalFieldIntegerUnitsEquiv_apply_coe (u : 𝒪[K]ˣ) : + ((((standardLocalFieldIntegerUnitsEquiv K u : + (standardLocalField K).valuationSubringˣ) : + (standardLocalField K).valuationSubring)) : K) = + (((u : 𝒪[K]ˣ) : 𝒪[K]) : K) := + rfl + +/-- Under the canonical unit equivalence, packaged higher principal units +are exactly the topology-first principal units. -/ +theorem + standardLocalFieldIntegerUnitsEquiv_mem_higherPrincipalUnitGroup_iff + (n : ℕ) (u : 𝒪[K]ˣ) : + standardLocalFieldIntegerUnitsEquiv K u ∈ + higherPrincipalUnitGroup + (standardLocalField K).toCompleteDVF n ↔ + u ∈ principalUnits K n := by + let F := standardLocalField K + let e := standardLocalFieldIntegerEquiv K + rw [higherPrincipalUnitGroup.mem_iff, + mem_principalUnits_iff] + change + e (u : 𝒪[K]) - 1 ∈ F.maximalIdeal ^ n ↔ + (u : 𝒪[K]) - 1 ∈ (𝓂[K] : Ideal 𝒪[K]) ^ n + have h := + standardLocalFieldIntegerEquiv_mem_maximalIdeal_pow_iff + K n ((u : 𝒪[K]) - 1) + simpa only [e, map_sub, map_one] using h + +/-- Mapping packaged higher principal units back through the canonical +integer-unit equivalence gives the topology-first principal-unit subgroup. -/ +theorem standardLocalFieldHigherPrincipalUnitGroup_map_eq_principalUnits + (n : ℕ) : + (higherPrincipalUnitGroup + (standardLocalField K).toCompleteDVF n).map + (standardLocalFieldIntegerUnitsEquiv K).symm.toMonoidHom = + principalUnits K n := by + let e := standardLocalFieldIntegerUnitsEquiv K + ext u + constructor + · rintro ⟨a, ha, rfl⟩ + change a ∈ + higherPrincipalUnitGroup + (standardLocalField K).toCompleteDVF n at ha + exact + (standardLocalFieldIntegerUnitsEquiv_mem_higherPrincipalUnitGroup_iff + K n (e.symm a)).1 + (by simpa only [e, MulEquiv.apply_symm_apply] using ha) + · intro hu + have heu : + e u ∈ higherPrincipalUnitGroup + (standardLocalField K).toCompleteDVF n := + (standardLocalFieldIntegerUnitsEquiv_mem_higherPrincipalUnitGroup_iff + K n u).2 hu + exact ⟨e u, heu, e.symm_apply_apply u⟩ + +/-- Inclusion of packaged valuation-ring units into field units, expressed +through the canonical integer-ring identification. -/ +noncomputable def standardLocalFieldValuationUnitsToFieldUnits : + (standardLocalField K).valuationSubringˣ →* Kˣ := + (integerUnitsToFieldUnits K).comp + (standardLocalFieldIntegerUnitsEquiv K).symm.toMonoidHom + +/-- The packaged valuation-unit inclusion preserves the underlying field +element. -/ +@[simp] +theorem standardLocalFieldValuationUnitsToFieldUnits_apply_coe + (u : (standardLocalField K).valuationSubringˣ) : + ((standardLocalFieldValuationUnitsToFieldUnits K u : Kˣ) : K) = + (((u : (standardLocalField K).valuationSubringˣ) : + (standardLocalField K).valuationSubring) : K) := + rfl + +/-- The packaged higher principal-unit subgroup maps exactly to the +topology-first field principal-unit subgroup. -/ +theorem standardLocalFieldHigherPrincipalUnitGroup_map_eq_fieldPrincipalUnits + (n : ℕ) : + (higherPrincipalUnitGroup + (standardLocalField K).toCompleteDVF n).map + (standardLocalFieldValuationUnitsToFieldUnits K) = + LocalFieldTheory.fieldPrincipalUnits K n := by + change + (higherPrincipalUnitGroup + (standardLocalField K).toCompleteDVF n).map + ((integerUnitsToFieldUnits K).comp + (standardLocalFieldIntegerUnitsEquiv K).symm.toMonoidHom) = + (principalUnits K n).map (integerUnitsToFieldUnits K) + rw [← Subgroup.map_map, + standardLocalFieldHigherPrincipalUnitGroup_map_eq_principalUnits] + +/-- A packaged valuation-ring unit lies in `U^n` exactly when its field-unit +image lies in `LocalFieldTheory.fieldPrincipalUnits K n`. -/ +theorem + standardLocalFieldValuationUnit_mem_fieldPrincipalUnits_iff_mem_higher + (n : ℕ) (u : (standardLocalField K).valuationSubringˣ) : + standardLocalFieldValuationUnitsToFieldUnits K u ∈ + LocalFieldTheory.fieldPrincipalUnits K n ↔ + u ∈ higherPrincipalUnitGroup + (standardLocalField K).toCompleteDVF n := by + let e := standardLocalFieldIntegerUnitsEquiv K + change + integerUnitsToFieldUnits K (e.symm u) ∈ + (principalUnits K n).map (integerUnitsToFieldUnits K) ↔ + u ∈ higherPrincipalUnitGroup + (standardLocalField K).toCompleteDVF n + rw [Subgroup.mem_map_iff_mem + (integerUnitsToFieldUnits_injective K)] + simpa only [e, MulEquiv.apply_symm_apply] using + (standardLocalFieldIntegerUnitsEquiv_mem_higherPrincipalUnitGroup_iff + K n (e.symm u)).symm + +/-- The canonical chosen uniformizer of `𝒪[K]`, transported to the +valuation ring of the standard local-field package. -/ +noncomputable def standardLocalFieldUniformizer : + (standardLocalField K).valuationSubring := + standardLocalFieldIntegerEquiv K + (chosenIntegerRingUniformizer K) + +/-- The transported canonical uniformizer has the expected underlying field +element. -/ +@[simp] +theorem standardLocalFieldUniformizer_coe : + ((standardLocalFieldUniformizer K : + (standardLocalField K).valuationSubring) : K) = + ((chosenIntegerRingUniformizer K : 𝒪[K]) : K) := + rfl + +/-- The transported canonical prime element is a uniformizer for the +valuation in the standard local-field package. -/ +theorem standardLocalFieldUniformizer_isUniformizer : + (standardLocalField K).valuation.IsUniformizer + (standardLocalFieldUniformizer K : K) := by + have hirr : + Irreducible (standardLocalFieldUniformizer K) := + (chosenIntegerRingUniformizer_irreducible K).map + (standardLocalFieldIntegerEquiv K) + exact + Valuation.isUniformizer_of_maximalIdeal_eq_span + (v := (standardLocalField K).valuation) + hirr.maximalIdeal_eq + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/UpperRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/UpperRamification.lean new file mode 100644 index 0000000000..2a0c7000d5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/UpperRamification.lean @@ -0,0 +1,112 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandFunction +/-! +# Herbrand functions and upper groups of standard Lubin--Tate levels + +This file names the lower filtration, Herbrand function, inverse Herbrand +function, and genuine real upper ramification groups attached to the chosen +integral-closure valuation on a standard finite Lubin--Tate level. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open RamificationTheory.HilbertRamification.Higher + +variable {K : Type u} [Field K] + +noncomputable local instance + standardLubinTateLevelField_finiteDimensional_forUpperRamification + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + FiniteDimensional K (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_finiteDimensional hπ n + +noncomputable local instance + standardLubinTateLevelField_isGalois_forUpperRamification + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + IsGalois K (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_isGalois hπ n + +/-- The lower ramification filtration packaged for the Herbrand API. -/ +noncomputable def standardLubinTateLowerRamificationFiltration + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) : + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration + Gal((standardLubinTateLevelField hπ n)/K) := + lowerRamificationFiltrationOfUniqueExtension + (base := F.toCompleteDVF.toDVF) + (target := (standardLubinTateLevelCompleteDVF hπ n).toDVF) + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension hπ n) + +/-- The Herbrand function of a standard finite Lubin--Tate level. -/ +noncomputable def standardLubinTateHerbrandFunction + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (s : ℝ) : ℝ := + herbrandFunctionOfUniqueExtension + (base := F.toCompleteDVF.toDVF) + (target := (standardLubinTateLevelCompleteDVF hπ n).toDVF) + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension hπ n) + s + +/-- The inverse Herbrand function of a standard finite Lubin--Tate level. -/ +noncomputable def standardLubinTateInverseHerbrandFunction + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (t : ℝ) : ℝ := + inverseHerbrandFunctionOfUniqueExtension + (base := F.toCompleteDVF.toDVF) + (target := (standardLubinTateLevelCompleteDVF hπ n).toDVF) + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension hπ n) + t + +/-- The genuine real upper ramification group of a standard finite +Lubin--Tate level. -/ +noncomputable def standardLubinTateRealUpperRamificationGroup + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (t : ℝ) : + Subgroup Gal((standardLubinTateLevelField hπ n)/K) := + upperRamificationGroupOfUniqueExtension + (base := F.toCompleteDVF.toDVF) + (target := (standardLubinTateLevelCompleteDVF hπ n).toDVF) + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension hπ n) + t + +/-- Evaluating the upper filtration at a Herbrand value recovers the +corresponding lower group. -/ +theorem standardLubinTateRealUpperRamificationGroup_herbrandFunction + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (n : ℕ) (s : ℝ) : + standardLubinTateRealUpperRamificationGroup hπ n + (standardLubinTateHerbrandFunction hπ n s) = + standardLubinTateRealLowerRamificationGroup hπ n s := by + exact + upperRamificationGroupOfUniqueExtension_herbrandFunction + (base := F.toCompleteDVF.toDVF) + (target := (standardLubinTateLevelCompleteDVF hπ n).toDVF) + (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension hπ n) + s + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule.lean new file mode 100644 index 0000000000..ff55e4bd1b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule.lean @@ -0,0 +1,23 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.CoefficientEquation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.DegreeStabilization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Intertwiner +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.LinearTerm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCoefficient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCorrection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveIntertwiner +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Reduction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Series +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardSeries + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/All.lean new file mode 100644 index 0000000000..33bd08fd2a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/All.lean @@ -0,0 +1,29 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.CoefficientEquation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.DegreeStabilization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Intertwiner +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.LinearTerm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCoefficient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCorrection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveIntertwiner +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Reduction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Series +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardSeries +/-! +# Lubin--Tate formal modules + +Public aggregate for the formal-series constructions used by Lubin--Tate +theory: composition, linear terms, intertwiners, coefficient equations, +reduction, the standard Lubin--Tate series, and the coefficientwise recursive +existence-and-uniqueness construction, including the resulting standard +commutative formal group and its coefficient-ring endomorphisms. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/CoefficientEquation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/CoefficientEquation.lean new file mode 100644 index 0000000000..95a7cc2af7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/CoefficientEquation.lean @@ -0,0 +1,95 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Series +/-! +# Coefficient equations for a fixed uniformizer + +For a positive degree, the scalar factor 1 - π ^ r is a unit whenever π +is a uniformizer. Consequently the corresponding scalar coefficient equation +has a unique solution in the valuation ring. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace LubinTate +namespace SameUniformizer + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] +variable {F : LocalField.{u, v} K} {π : F.valuationSubring} + +/-- A chosen uniformizer reduces to zero in the residue field. -/ +theorem residueMap_uniformizer_eq_zero + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + F.residueMap π = 0 := + (F.toCompleteDVF.residue_eq_zero_iff π).2 + (F.toCompleteDVF.uniformizer_mem_maximalIdeal hπ) + +/-- An element reducing to zero is divisible by the chosen uniformizer. -/ +theorem uniformizer_dvd_of_residueMap_eq_zero + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + {a : F.valuationSubring} (ha : F.residueMap a = 0) : + π ∣ a := by + have hmem : a ∈ F.maximalIdeal := + (F.toCompleteDVF.residue_eq_zero_iff a).1 ha + have hspan : + a ∈ Ideal.span ({π} : Set F.valuationSubring) := by + simpa [F.toCompleteDVF.maximalIdeal_eq_span_uniformizer hπ] using hmem + exact Ideal.mem_span_singleton.mp hspan + +/-- Every positive power of a uniformizer reduces to zero. -/ +theorem residueMap_uniformizer_pow_eq_zero + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + {r : ℕ} (hr : r ≠ 0) : + F.residueMap (π ^ r) = 0 := by + simp [map_pow, residueMap_uniformizer_eq_zero hπ, hr] + +/-- For positive `r`, the factor `1 - pi ^ r` is a unit of `O_K`. -/ +theorem isUnit_one_sub_uniformizer_pow + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + {r : ℕ} (hr : r ≠ 0) : + IsUnit (1 - π ^ r) := by + apply IsLocalRing.isUnit_one_sub_self_of_mem_nonunits + intro hunit + have hresidue_ne : F.residueMap (π ^ r) ≠ 0 := + (F.toCompleteDVF.residue_ne_zero_iff_isUnit (π ^ r)).2 hunit + exact hresidue_ne (residueMap_uniformizer_pow_eq_zero hπ hr) + +/-- Left multiplication by a unit has a unique preimage for every +right-hand side. -/ +theorem existsUnique_mul_eq_of_isUnit + {R : Type*} [CommRing R] {a : R} (ha : IsUnit a) (b : R) : + ∃! x : R, a * x = b := by + rcases ha with ⟨u, rfl⟩ + refine ⟨(↑(u⁻¹) : R) * b, by simp, ?_⟩ + intro y hy + calc + y = ((↑(u⁻¹) : R) * (u : R)) * y := by simp + _ = (↑(u⁻¹) : R) * ((u : R) * y) := by rw [mul_assoc] + _ = (↑(u⁻¹) : R) * b := by rw [hy] + +/-- The scalar coefficient equation in positive total degree has a +unique solution in the valuation ring. -/ +theorem existsUnique_one_sub_uniformizer_pow_mul_eq + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + {r : ℕ} (hr : r ≠ 0) (b : F.valuationSubring) : + ∃! x : F.valuationSubring, (1 - π ^ r) * x = b := + existsUnique_mul_eq_of_isUnit + (isUnit_one_sub_uniformizer_pow hπ hr) b + +end SameUniformizer +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/DegreeStabilization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/DegreeStabilization.lean new file mode 100644 index 0000000000..6ea0bec17a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/DegreeStabilization.lean @@ -0,0 +1,958 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCoefficient +public import Mathlib.RingTheory.MvPowerSeries.Trunc +/-! +# Finite-degree stabilization for Lubin--Tate intertwining defects + +The coefficient of an intertwining defect in total degree at most `m` +depends only on the coefficients of the proposed intertwiner in total degree +at most `m`. This is the finite-degree continuity statement needed to pass +from recursively corrected finite approximations to one full multivariable +power series. + +The proof uses total-degree truncation. On the left side of the +intertwining equation, truncation commutes with substituting a series with +zero constant coefficient into the fixed Lubin--Tate series. On the right +side, truncation of multivariable substitution depends only on the same +truncation of the outer series. +-/ + +@[expose] public section + +noncomputable +section + +open scoped BigOperators +attribute [local instance] Classical.propDecidable + +universe u v w + +namespace LubinTate +namespace SameUniformizer + +open LocalFieldTheory.DiscreteValuationField + +/-- Equality of total-degree truncations through degree `m` is equivalent to +coefficientwise equality in every total degree at most `m`. -/ +theorem truncTotal_succ_eq_iff_coeff_eq_degree_le + {R : Type*} [CommSemiring R] + {τ : Type*} [Finite τ] + {H H' : MvPowerSeries τ R} (m : ℕ) : + H.truncTotal (m + 1) = H'.truncTotal (m + 1) ↔ + ∀ d : τ →₀ ℕ, d.degree ≤ m → + MvPowerSeries.coeff d H = MvPowerSeries.coeff d H' := by + constructor + · intro h d hd + have hd' : d.degree < m + 1 := Nat.lt_succ_iff.mpr hd + calc + MvPowerSeries.coeff d H = + (H.truncTotal (m + 1)).coeff d := + (MvPowerSeries.coeff_truncTotal H hd').symm + _ = (H'.truncTotal (m + 1)).coeff d := by rw [h] + _ = MvPowerSeries.coeff d H' := + MvPowerSeries.coeff_truncTotal H' hd' + · intro h + ext d + by_cases hd : d.degree < m + 1 + · rw [MvPowerSeries.coeff_truncTotal H hd, + MvPowerSeries.coeff_truncTotal H' hd] + exact h d (Nat.lt_succ_iff.mp hd) + · rw [MvPowerSeries.coeff_truncTotal_eq_zero H (not_lt.mp hd), + MvPowerSeries.coeff_truncTotal_eq_zero H' (not_lt.mp hd)] + +variable {K : Type u} [Field K] +variable {F : LocalField.{u, v} K} {π : F.valuationSubring} +variable {σ : Type w} [Fintype σ] + +omit [Fintype σ] in +private theorem truncTotal_powerSeries_subst_eq_of_truncTotal_eq [Finite σ] + (e : LubinTateSeries F π) + {H H' : MvPowerSeries σ F.valuationSubring} + (hH : MvPowerSeries.constantCoeff H = 0) + (hH' : MvPowerSeries.constantCoeff H' = 0) + {k : ℕ} (htrunc : H.truncTotal k = H'.truncTotal k) : + (PowerSeries.subst H e.toPowerSeries).truncTotal k = + (PowerSeries.subst H' e.toPowerSeries).truncTotal k := by + classical + let := Fintype.ofFinite σ + have hHsubst : PowerSeries.HasSubst H := + PowerSeries.HasSubst.of_constantCoeff_zero hH + have hH'subst : PowerSeries.HasSubst H' := + PowerSeries.HasSubst.of_constantCoeff_zero hH' + change + (MvPowerSeries.subst (fun _ : Unit ↦ H) e.toPowerSeries).truncTotal k = + (MvPowerSeries.subst (fun _ : Unit ↦ H') e.toPowerSeries).truncTotal k + calc + (MvPowerSeries.subst (fun _ : Unit ↦ H) e.toPowerSeries).truncTotal k = + (MvPowerSeries.subst + (fun _ : Unit ↦ (H.truncTotal k).toMvPowerSeries) + e.toPowerSeries).truncTotal k := by + exact + MvPowerSeries.truncTotal_subst_eq_truncTotal_subst_truncTotal_of_le + (f := e.toPowerSeries) (a := fun _ : Unit ↦ H) + (x := fun _ : Unit ↦ k) hHsubst.const (fun _ ↦ le_rfl) + _ = (MvPowerSeries.subst + (fun _ : Unit ↦ (H'.truncTotal k).toMvPowerSeries) + e.toPowerSeries).truncTotal k := by + rw [htrunc] + _ = (MvPowerSeries.subst (fun _ : Unit ↦ H') + e.toPowerSeries).truncTotal k := by + exact + (MvPowerSeries.truncTotal_subst_eq_truncTotal_subst_truncTotal_of_le + (f := e.toPowerSeries) (a := fun _ : Unit ↦ H') + (x := fun _ : Unit ↦ k) hH'subst.const + (fun _ ↦ le_rfl)).symm + +omit [Fintype σ] in +private theorem truncTotal_inVariables_subst_eq_of_truncTotal_eq [Finite σ] + (ebar : LubinTateSeries F π) + {H H' : MvPowerSeries σ F.valuationSubring} + {k : ℕ} (htrunc : H.truncTotal k = H'.truncTotal k) : + (MvPowerSeries.subst (fun i : σ ↦ inVariable ebar i) H).truncTotal k = + (MvPowerSeries.subst (fun i : σ ↦ inVariable ebar i) H').truncTotal k := by + classical + let := Fintype.ofFinite σ + have hconstant : + ∀ i : σ, + MvPowerSeries.constantCoeff (inVariable ebar i) = 0 := + fun i ↦ constantCoeff_inVariable ebar i + calc + (MvPowerSeries.subst (fun i : σ ↦ inVariable ebar i) H).truncTotal k = + (MvPowerSeries.subst (fun i : σ ↦ inVariable ebar i) + (H.truncTotal k).toMvPowerSeries).truncTotal k := by + exact + MvPowerSeries.truncTotal_subst_eq_truncTotal_truncTotal_subst + (f := H) (a := fun i : σ ↦ inVariable ebar i) hconstant + _ = (MvPowerSeries.subst (fun i : σ ↦ inVariable ebar i) + (H'.truncTotal k).toMvPowerSeries).truncTotal k := by + rw [htrunc] + _ = (MvPowerSeries.subst (fun i : σ ↦ inVariable ebar i) H').truncTotal k := by + exact + (MvPowerSeries.truncTotal_subst_eq_truncTotal_truncTotal_subst + (f := H') (a := fun i : σ ↦ inVariable ebar i) hconstant).symm + +omit [Fintype σ] in +/-- The degree-`d` coefficient of the same-uniformizer intertwining defect +depends only on coefficients of the proposed intertwiner through total degree +`d.degree`. + +The slightly more general bound `m` is convenient for a recursive tower of +finite approximations: agreement through degree `m` makes every defect +coefficient of degree at most `m` stable. -/ +theorem coeff_defect_eq_of_coeff_eq_degree_le [Finite σ] + (e ebar : LubinTateSeries F π) + {H H' : MvPowerSeries σ F.valuationSubring} + (hH : MvPowerSeries.constantCoeff H = 0) + (hH' : MvPowerSeries.constantCoeff H' = 0) + {m : ℕ} + (hcoeff : ∀ q : σ →₀ ℕ, q.degree ≤ m → + MvPowerSeries.coeff q H = MvPowerSeries.coeff q H') + {d : σ →₀ ℕ} (hd : d.degree ≤ m) : + MvPowerSeries.coeff d (defect e ebar H) = + MvPowerSeries.coeff d (defect e ebar H') := by + classical + let := Fintype.ofFinite σ + let k := m + 1 + have htrunc : H.truncTotal k = H'.truncTotal k := by + exact + (truncTotal_succ_eq_iff_coeff_eq_degree_le + (H := H) (H' := H') m).2 hcoeff + have hleft : + (PowerSeries.subst H e.toPowerSeries).truncTotal k = + (PowerSeries.subst H' e.toPowerSeries).truncTotal k := + truncTotal_powerSeries_subst_eq_of_truncTotal_eq + e hH hH' htrunc + have hright : + (MvPowerSeries.subst (fun i : σ ↦ inVariable ebar i) H).truncTotal k = + (MvPowerSeries.subst + (fun i : σ ↦ inVariable ebar i) H').truncTotal k := + truncTotal_inVariables_subst_eq_of_truncTotal_eq ebar htrunc + have hdefect : + (defect e ebar H).truncTotal k = + (defect e ebar H').truncTotal k := by + calc + (defect e ebar H).truncTotal k = + (PowerSeries.subst H e.toPowerSeries).truncTotal k - + (MvPowerSeries.subst + (fun i : σ ↦ inVariable ebar i) H).truncTotal k := by + rw [defect, map_sub] + _ = (PowerSeries.subst H' e.toPowerSeries).truncTotal k - + (MvPowerSeries.subst + (fun i : σ ↦ inVariable ebar i) H').truncTotal k := by + rw [hleft, hright] + _ = (defect e ebar H').truncTotal k := by + rw [defect, map_sub] + have hd' : d.degree < k := by + dsimp only [k] + exact Nat.lt_succ_iff.mpr hd + calc + MvPowerSeries.coeff d (defect e ebar H) = + ((defect e ebar H).truncTotal k).coeff d := + (MvPowerSeries.coeff_truncTotal (defect e ebar H) hd').symm + _ = ((defect e ebar H').truncTotal k).coeff d := by + rw [hdefect] + _ = MvPowerSeries.coeff d (defect e ebar H') := + MvPowerSeries.coeff_truncTotal (defect e ebar H') hd' + +private theorem degree_le_order_monomial_stabilization + {R : Type*} [CommRing R] {τ : Type*} + (d : τ →₀ ℕ) (c : R) : + (d.degree : ℕ∞) ≤ (MvPowerSeries.monomial d c).order := by + classical + by_cases hc : c = 0 + · simp [hc] + · rw [MvPowerSeries.order_monomial_of_ne_zero hc] + +private theorem natCast_le_order_pow_of_one_le_order_stabilization + {R : Type*} [CommRing R] {τ : Type*} + (f : MvPowerSeries τ R) (n : ℕ) + (hf : (1 : ℕ∞) ≤ f.order) : + (n : ℕ∞) ≤ (f ^ n).order := by + calc + (n : ℕ∞) = n • (1 : ℕ∞) := by simp + _ ≤ n • f.order := nsmul_le_nsmul_right hf n + _ ≤ (f ^ n).order := MvPowerSeries.le_order_pow n + +private theorem le_order_finset_sum_stabilization + {R : Type*} [CommRing R] {τ ι : Type*} + {s : Finset ι} {f : ι → MvPowerSeries τ R} {m : ℕ∞} + (h : ∀ i ∈ s, m ≤ (f i).order) : + m ≤ (∑ i ∈ s, f i).order := by + classical + induction s using Finset.induction_on with + | empty => simp + | @insert i s hi ih => + rw [Finset.sum_insert hi] + exact + (le_min + (h i (Finset.mem_insert_self i s)) + (ih fun j hj => h j (Finset.mem_insert_of_mem hj))).trans + MvPowerSeries.min_order_le_add + +private theorem natCast_sum_le_order_finset_prod_pow_stabilization + {R : Type*} [CommRing R] {τ ι : Type*} + {s : Finset ι} (f : ι → MvPowerSeries τ R) (n : ι → ℕ) + (hf : ∀ i ∈ s, (1 : ℕ∞) ≤ (f i).order) : + ((∑ i ∈ s, n i : ℕ) : ℕ∞) ≤ + (∏ i ∈ s, (f i) ^ n i).order := by + classical + induction s using Finset.induction_on with + | empty => simp + | @insert i s hi ih => + rw [Finset.sum_insert hi, Finset.prod_insert hi] + calc + ((n i + ∑ j ∈ s, n j : ℕ) : ℕ∞) = + (n i : ℕ∞) + ((∑ j ∈ s, n j : ℕ) : ℕ∞) := by + norm_cast + _ ≤ ((f i) ^ n i).order + + (∏ j ∈ s, (f j) ^ n j).order := + add_le_add + (natCast_le_order_pow_of_one_le_order_stabilization + (f i) (n i) (hf i (Finset.mem_insert_self i s))) + (ih fun j hj => hf j (Finset.mem_insert_of_mem hj)) + _ ≤ ((f i) ^ n i * ∏ j ∈ s, (f j) ^ n j).order := + MvPowerSeries.le_order_mul + +private theorem order_sub_add_pred_le_order_pow_sub_pow_stabilization + {R : Type*} [CommRing R] {τ : Type*} + (f g : MvPowerSeries τ R) + (hf : (1 : ℕ∞) ≤ f.order) + (hg : (1 : ℕ∞) ≤ g.order) + (n : ℕ) : + (f - g).order + ((n - 1 : ℕ) : ℕ∞) ≤ + (f ^ n - g ^ n).order := by + let q := + ∑ i ∈ Finset.range n, f ^ i * g ^ (n - 1 - i) + have hq : ((n - 1 : ℕ) : ℕ∞) ≤ q.order := by + apply le_order_finset_sum_stabilization + intro i hi + have hi' : i < n := Finset.mem_range.mp hi + calc + ((n - 1 : ℕ) : ℕ∞) = + (i : ℕ∞) + ((n - 1 - i : ℕ) : ℕ∞) := by + norm_cast + omega + _ ≤ (f ^ i).order + (g ^ (n - 1 - i)).order := + add_le_add + (natCast_le_order_pow_of_one_le_order_stabilization f i hf) + (natCast_le_order_pow_of_one_le_order_stabilization + g (n - 1 - i) hg) + _ ≤ (f ^ i * g ^ (n - 1 - i)).order := + MvPowerSeries.le_order_mul + have hfactor : + (f - g) * q = f ^ n - g ^ n := by + exact (Commute.all f g).mul_geom_sum₂ n + calc + (f - g).order + ((n - 1 : ℕ) : ℕ∞) ≤ + (f - g).order + q.order := + add_le_add_right hq _ + _ ≤ ((f - g) * q).order := + MvPowerSeries.le_order_mul + _ = (f ^ n - g ^ n).order := + congrArg (fun h : MvPowerSeries τ R => h.order) hfactor + +private theorem natCast_sum_add_one_le_order_prod_pow_sub_prod_pow_stabilization + {R : Type*} [CommRing R] {τ ι : Type*} + {s : Finset ι} + (f g : ι → MvPowerSeries τ R) (n : ι → ℕ) + (hn : ∀ i ∈ s, n i ≠ 0) + (hf : ∀ i ∈ s, (1 : ℕ∞) ≤ (f i).order) + (hg : ∀ i ∈ s, (1 : ℕ∞) ≤ (g i).order) + (hfg : ∀ i ∈ s, (2 : ℕ∞) ≤ (f i - g i).order) : + (((∑ i ∈ s, n i) + 1 : ℕ) : ℕ∞) ≤ + ((∏ i ∈ s, (f i) ^ n i) - + ∏ i ∈ s, (g i) ^ n i).order := by + classical + induction s using Finset.induction_on with + | empty => simp + | @insert i s hi ih => + have hni : n i ≠ 0 := + hn i (Finset.mem_insert_self i s) + have hpowDifference : + ((n i + 1 : ℕ) : ℕ∞) ≤ + ((f i) ^ n i - (g i) ^ n i).order := by + calc + ((n i + 1 : ℕ) : ℕ∞) = + (2 : ℕ∞) + ((n i - 1 : ℕ) : ℕ∞) := by + norm_cast + omega + _ ≤ (f i - g i).order + + ((n i - 1 : ℕ) : ℕ∞) := + add_le_add_left + (hfg i (Finset.mem_insert_self i s)) _ + _ ≤ ((f i) ^ n i - (g i) ^ n i).order := + order_sub_add_pred_le_order_pow_sub_pow_stabilization + (f i) (g i) + (hf i (Finset.mem_insert_self i s)) + (hg i (Finset.mem_insert_self i s)) + (n i) + have hprodF : + ((∑ j ∈ s, n j : ℕ) : ℕ∞) ≤ + (∏ j ∈ s, (f j) ^ n j).order := + natCast_sum_le_order_finset_prod_pow_stabilization f n + (fun j hj => hf j (Finset.mem_insert_of_mem hj)) + have hpowG : + (n i : ℕ∞) ≤ ((g i) ^ n i).order := + natCast_le_order_pow_of_one_le_order_stabilization + (g i) (n i) (hg i (Finset.mem_insert_self i s)) + have hprodDifference : + (((∑ j ∈ s, n j) + 1 : ℕ) : ℕ∞) ≤ + ((∏ j ∈ s, (f j) ^ n j) - + ∏ j ∈ s, (g j) ^ n j).order := + ih + (fun j hj => hn j (Finset.mem_insert_of_mem hj)) + (fun j hj => hf j (Finset.mem_insert_of_mem hj)) + (fun j hj => hg j (Finset.mem_insert_of_mem hj)) + (fun j hj => hfg j (Finset.mem_insert_of_mem hj)) + have hleft : + (((n i + ∑ j ∈ s, n j) + 1 : ℕ) : ℕ∞) ≤ + (((f i) ^ n i - (g i) ^ n i) * + ∏ j ∈ s, (f j) ^ n j).order := by + calc + (((n i + ∑ j ∈ s, n j) + 1 : ℕ) : ℕ∞) = + ((n i + 1 : ℕ) : ℕ∞) + + ((∑ j ∈ s, n j : ℕ) : ℕ∞) := by + norm_cast + omega + _ ≤ ((f i) ^ n i - (g i) ^ n i).order + + (∏ j ∈ s, (f j) ^ n j).order := + add_le_add hpowDifference hprodF + _ ≤ (((f i) ^ n i - (g i) ^ n i) * + ∏ j ∈ s, (f j) ^ n j).order := + MvPowerSeries.le_order_mul + have hright : + (((n i + ∑ j ∈ s, n j) + 1 : ℕ) : ℕ∞) ≤ + ((g i) ^ n i * + ((∏ j ∈ s, (f j) ^ n j) - + ∏ j ∈ s, (g j) ^ n j)).order := by + calc + (((n i + ∑ j ∈ s, n j) + 1 : ℕ) : ℕ∞) = + (n i : ℕ∞) + + (((∑ j ∈ s, n j) + 1 : ℕ) : ℕ∞) := by + norm_cast + _ ≤ ((g i) ^ n i).order + + ((∏ j ∈ s, (f j) ^ n j) - + ∏ j ∈ s, (g j) ^ n j).order := + add_le_add hpowG hprodDifference + _ ≤ ((g i) ^ n i * + ((∏ j ∈ s, (f j) ^ n j) - + ∏ j ∈ s, (g j) ^ n j)).order := + MvPowerSeries.le_order_mul + rw [Finset.sum_insert hi, Finset.prod_insert hi, + Finset.prod_insert hi] + rw [show + (f i) ^ n i * (∏ j ∈ s, (f j) ^ n j) - + (g i) ^ n i * (∏ j ∈ s, (g j) ^ n j) = + ((f i) ^ n i - (g i) ^ n i) * + (∏ j ∈ s, (f j) ^ n j) + + (g i) ^ n i * + ((∏ j ∈ s, (f j) ^ n j) - + ∏ j ∈ s, (g j) ^ n j) by ring] + exact + (le_min hleft hright).trans + MvPowerSeries.min_order_le_add + +private noncomputable def linearInVariableStabilization + (π : F.valuationSubring) (i : σ) : + MvPowerSeries σ F.valuationSubring := + MvPowerSeries.C π * MvPowerSeries.X i + +omit [Fintype σ] in +private theorem linearInVariableStabilization_constantCoeff + (π : F.valuationSubring) (i : σ) : + MvPowerSeries.constantCoeff + (linearInVariableStabilization π i) = 0 := by + rw [linearInVariableStabilization, map_mul, + MvPowerSeries.constantCoeff_C, + ← MvPowerSeries.coeff_zero_eq_constantCoeff_apply, + MvPowerSeries.coeff_zero_X, mul_zero] + +omit [Fintype σ] in +private theorem linearInVariableStabilization_hasSubst [Finite σ] + (π : F.valuationSubring) : + MvPowerSeries.HasSubst + (linearInVariableStabilization (σ := σ) π) := by + classical + let := Fintype.ofFinite σ + exact + MvPowerSeries.hasSubst_of_constantCoeff_zero + (linearInVariableStabilization_constantCoeff π) + +omit [Fintype σ] in +private theorem one_le_order_inVariable_stabilization + (ebar : LubinTateSeries F π) (i : σ) : + (1 : ℕ∞) ≤ (inVariable ebar i).order := + MvPowerSeries.one_le_order_iff_constCoeff_eq_zero.mpr + (constantCoeff_inVariable ebar i) + +omit [Fintype σ] in +private theorem one_le_order_linearInVariableStabilization + (π : F.valuationSubring) (i : σ) : + (1 : ℕ∞) ≤ (linearInVariableStabilization π i).order := + MvPowerSeries.one_le_order_iff_constCoeff_eq_zero.mpr + (linearInVariableStabilization_constantCoeff π i) + +omit [Fintype σ] in +private theorem two_le_order_inVariable_sub_linearInVariableStabilization + (ebar : LubinTateSeries F π) (i : σ) : + (2 : ℕ∞) ≤ + (inVariable ebar i - + linearInVariableStabilization π i).order := by + classical + apply MvPowerSeries.nat_le_order + intro d hd + rw [map_sub] + by_cases hdi : d = Finsupp.single i (d i) + · by_cases hzero : d i = 0 + · have hd0 : d = 0 := by + rw [hdi, hzero] + simp + subst d + simp [inVariable, linearInVariableStabilization, + PowerSeries.coeff_subst_single, + LubinTateSeries.constantCoeff_eq_zero] + · have hone : d i = 1 := by + have hdegree : d.degree = d i := by + simpa only [Finsupp.degree_single] using + congrArg Finsupp.degree hdi + have hlt : d i < 2 := by + rw [← hdegree] + exact hd + omega + have hd1 : d = Finsupp.single i 1 := by + rw [hdi, hone] + subst d + simp [inVariable, linearInVariableStabilization, + PowerSeries.coeff_subst_single, + LubinTateSeries.coeff_one_eq_uniformizer] + · have hsingle : d ≠ Finsupp.single i 1 := by + intro h + apply hdi + rw [h] + simp + have hX : + MvPowerSeries.coeff d + (MvPowerSeries.X i : + MvPowerSeries σ F.valuationSubring) = 0 := by + rw [MvPowerSeries.coeff_X, ite_eq_right hsingle] + simp [inVariable, linearInVariableStabilization, + PowerSeries.coeff_subst_single, hdi, hX] + +omit [Fintype σ] in +private theorem degree_add_one_le_order_subst_monomial_sub_linear_stabilization [Finite σ] + (ebar : LubinTateSeries F π) + (d : σ →₀ ℕ) (c : F.valuationSubring) : + ((d.degree + 1 : ℕ) : ℕ∞) ≤ + (MvPowerSeries.subst (fun i : σ => inVariable ebar i) + (MvPowerSeries.monomial d c) - + MvPowerSeries.subst + (linearInVariableStabilization (σ := σ) π) + (MvPowerSeries.monomial d c)).order := by + classical + let := Fintype.ofFinite σ + have hprod : + ((d.degree + 1 : ℕ) : ℕ∞) ≤ + (d.prod (fun i n => (inVariable ebar i) ^ n) - + d.prod (fun i n => + (linearInVariableStabilization π i) ^ n)).order := by + simpa only [Finsupp.prod, Finsupp.degree_apply] using + natCast_sum_add_one_le_order_prod_pow_sub_prod_pow_stabilization + (s := d.support) + (fun i : σ => inVariable ebar i) + (linearInVariableStabilization (σ := σ) π) + (fun i => d i) + (fun i hi => Finsupp.mem_support_iff.mp hi) + (fun i _ => one_le_order_inVariable_stabilization ebar i) + (fun i _ => + one_le_order_linearInVariableStabilization π i) + (fun i _ => + two_le_order_inVariable_sub_linearInVariableStabilization + ebar i) + rw [ + MvPowerSeries.subst_monomial + (inVariable_hasSubst ebar) d c, + MvPowerSeries.subst_monomial + (linearInVariableStabilization_hasSubst (σ := σ) π) d c, + ← MvPowerSeries.c_eq_algebraMap] + rw [show + MvPowerSeries.C c * + d.prod (fun i n => (inVariable ebar i) ^ n) - + MvPowerSeries.C c * + d.prod (fun i n => + (linearInVariableStabilization π i) ^ n) = + c • + (d.prod (fun i n => (inVariable ebar i) ^ n) - + d.prod (fun i n => + (linearInVariableStabilization π i) ^ n)) by + rw [MvPowerSeries.smul_eq_C_mul] + ring] + exact hprod.trans MvPowerSeries.le_order_smul + +omit [Fintype σ] in +private theorem coeff_subst_linearInVariableStabilization_monomial + (q d : σ →₀ ℕ) (c : F.valuationSubring) : + MvPowerSeries.coeff q + (MvPowerSeries.subst + (linearInVariableStabilization (σ := σ) π) + (MvPowerSeries.monomial d c)) = + if q = d then π ^ d.degree * c else 0 := by + have hlinear : + (Function.const σ π • + (MvPowerSeries.X : + σ → MvPowerSeries σ F.valuationSubring)) = + linearInVariableStabilization (σ := σ) π := by + funext i + simp [linearInVariableStabilization, Pi.smul_apply', + MvPowerSeries.smul_eq_C_mul] + rw [← hlinear, ← MvPowerSeries.rescale_eq_subst, + MvPowerSeries.coeff_rescale] + by_cases hqd : q = d + · subst q + rw [MvPowerSeries.coeff_monomial_same, ite_eq_left rfl] + simp only [Finsupp.prod, Function.const_apply, + Finset.prod_pow_eq_pow_sum, Finsupp.degree_apply] + · rw [MvPowerSeries.coeff_monomial_ne hqd, mul_zero, + ite_eq_right hqd] + +omit [Fintype σ] in +private theorem coeff_subst_inVariables_monomial_of_degree_le [Finite σ] + (ebar : LubinTateSeries F π) + (q d : σ →₀ ℕ) (hq : q.degree ≤ d.degree) + (c : F.valuationSubring) : + MvPowerSeries.coeff q + (MvPowerSeries.subst (fun i : σ => inVariable ebar i) + (MvPowerSeries.monomial d c)) = + if q = d then π ^ d.degree * c else 0 := by + classical + let := Fintype.ofFinite σ + have horder := + degree_add_one_le_order_subst_monomial_sub_linear_stabilization + ebar d c + have hlt : + (q.degree : ℕ∞) < + (MvPowerSeries.subst (fun i : σ => inVariable ebar i) + (MvPowerSeries.monomial d c) - + MvPowerSeries.subst + (linearInVariableStabilization (σ := σ) π) + (MvPowerSeries.monomial d c)).order := + by + have hqNat : q.degree < d.degree + 1 := + Nat.lt_succ_of_le hq + have hqCast : + (q.degree : ℕ∞) < ((d.degree + 1 : ℕ) : ℕ∞) := by + exact_mod_cast hqNat + exact hqCast.trans_le horder + have hcoeff := + MvPowerSeries.coeff_of_lt_order hlt + rw [map_sub, sub_eq_zero] at hcoeff + rw [hcoeff, + coeff_subst_linearInVariableStabilization_monomial] + +omit [Fintype σ] in +private theorem coeff_subst_inVariables_add_monomial_of_degree_le [Finite σ] + (ebar : LubinTateSeries F π) + (H : MvPowerSeries σ F.valuationSubring) + (q d : σ →₀ ℕ) (hq : q.degree ≤ d.degree) + (c : F.valuationSubring) : + MvPowerSeries.coeff q + (MvPowerSeries.subst (fun i : σ => inVariable ebar i) + (H + MvPowerSeries.monomial d c)) = + MvPowerSeries.coeff q + (MvPowerSeries.subst (fun i : σ => inVariable ebar i) H) + + if q = d then π ^ d.degree * c else 0 := by + classical + let := Fintype.ofFinite σ + rw [ + MvPowerSeries.subst_add (inVariable_hasSubst ebar), + map_add, + coeff_subst_inVariables_monomial_of_degree_le ebar q d hq c] + +private theorem constantCoeff_monomial_eq_zero_stabilization + {R : Type*} [CommRing R] {τ : Type*} + {d : τ →₀ ℕ} (hd : d ≠ 0) (c : R) : + MvPowerSeries.constantCoeff (MvPowerSeries.monomial d c) = 0 := by + rw [← MvPowerSeries.coeff_zero_eq_constantCoeff_apply, + MvPowerSeries.coeff_monomial_ne] + exact Ne.symm hd + +private theorem coeff_pow_add_monomial_sub_pow_of_degree_le + {R : Type*} [CommRing R] {τ : Type*} + {H : MvPowerSeries τ R} + (hH : MvPowerSeries.constantCoeff H = 0) + (q d : τ →₀ ℕ) (hq : q.degree ≤ d.degree) + (hd : 1 ≤ d.degree) (c : R) (n : ℕ) : + MvPowerSeries.coeff q + ((H + MvPowerSeries.monomial d c) ^ n - H ^ n) = + if n = 1 then (if q = d then c else 0) else 0 := by + classical + have hd0 : d ≠ 0 := by + intro h + subst d + simp at hd + by_cases hn : n = 1 + · subst n + simp [MvPowerSeries.coeff_monomial] + · rcases n with _ | n + · simp + · have hn0 : n ≠ 0 := by + intro h + apply hn + omega + let M := MvPowerSeries.monomial d c + let A := H + M + have hMconstant : + MvPowerSeries.constantCoeff M = 0 := + constantCoeff_monomial_eq_zero_stabilization hd0 c + have hAconstant : + MvPowerSeries.constantCoeff A = 0 := by + simp [A, hH, hMconstant] + have hHorder : (1 : ℕ∞) ≤ H.order := + MvPowerSeries.one_le_order_iff_constCoeff_eq_zero.mpr hH + have hAorder : (1 : ℕ∞) ≤ A.order := + MvPowerSeries.one_le_order_iff_constCoeff_eq_zero.mpr hAconstant + have hpow : + M.order + (n : ℕ∞) ≤ + (A ^ (n + 1) - H ^ (n + 1)).order := by + simpa [A, M, add_sub_cancel_left] using + order_sub_add_pred_le_order_pow_sub_pow_stabilization + A H hAorder hHorder (n + 1) + have hdegree : (d.degree : ℕ∞) ≤ M.order := + degree_le_order_monomial_stabilization d c + have hn' : (1 : ℕ∞) ≤ (n : ℕ∞) := by + exact_mod_cast Nat.one_le_iff_ne_zero.mpr hn0 + have horder : + ((d.degree + 1 : ℕ) : ℕ∞) ≤ + (A ^ (n + 1) - H ^ (n + 1)).order := by + calc + ((d.degree + 1 : ℕ) : ℕ∞) = + (d.degree : ℕ∞) + 1 := by norm_cast + _ ≤ M.order + (n : ℕ∞) := + add_le_add hdegree hn' + _ ≤ (A ^ (n + 1) - H ^ (n + 1)).order := + hpow + have hlt : + (q.degree : ℕ∞) < + (A ^ (n + 1) - H ^ (n + 1)).order := + by + have hqNat : q.degree < d.degree + 1 := + Nat.lt_succ_of_le hq + have hqCast : + (q.degree : ℕ∞) < + ((d.degree + 1 : ℕ) : ℕ∞) := by + exact_mod_cast hqNat + exact hqCast.trans_le horder + have hzero := MvPowerSeries.coeff_of_lt_order hlt + simpa [A, M, hn, hn0] using hzero + +private theorem coeff_pow_add_monomial_of_degree_le + {R : Type*} [CommRing R] {τ : Type*} + {H : MvPowerSeries τ R} + (hH : MvPowerSeries.constantCoeff H = 0) + (q d : τ →₀ ℕ) (hq : q.degree ≤ d.degree) + (hd : 1 ≤ d.degree) (c : R) (n : ℕ) : + MvPowerSeries.coeff q + ((H + MvPowerSeries.monomial d c) ^ n) = + MvPowerSeries.coeff q (H ^ n) + + if n = 1 then (if q = d then c else 0) else 0 := by + have h := + coeff_pow_add_monomial_sub_pow_of_degree_le + hH q d hq hd c n + rw [map_sub, sub_eq_iff_eq_add] at h + simpa [add_comm] using h + +omit [Fintype σ] in +private theorem coeff_subst_lubinTateSeries_add_monomial_of_degree_le + (e : LubinTateSeries F π) + {H : MvPowerSeries σ F.valuationSubring} + (hH : MvPowerSeries.constantCoeff H = 0) + (q d : σ →₀ ℕ) (hq : q.degree ≤ d.degree) + (hd : 1 ≤ d.degree) (c : F.valuationSubring) : + MvPowerSeries.coeff q + (PowerSeries.subst + (H + MvPowerSeries.monomial d c) + e.toPowerSeries) = + MvPowerSeries.coeff q + (PowerSeries.subst H e.toPowerSeries) + + π * (if q = d then c else 0) := by + have hd0 : d ≠ 0 := by + intro h + subst d + simp at hd + have hMconstant : + MvPowerSeries.constantCoeff + (MvPowerSeries.monomial d c) = 0 := + constantCoeff_monomial_eq_zero_stabilization hd0 c + have hnewSubst : + PowerSeries.HasSubst + (H + MvPowerSeries.monomial d c) := + PowerSeries.HasSubst.of_constantCoeff_zero (by + simp [hH, hMconstant]) + have hHsubst : PowerSeries.HasSubst H := + PowerSeries.HasSubst.of_constantCoeff_zero hH + let oldTerm : ℕ → F.valuationSubring := fun n => + PowerSeries.coeff n e.toPowerSeries • + MvPowerSeries.coeff q (H ^ n) + let deltaTerm : ℕ → F.valuationSubring := fun n => + PowerSeries.coeff n e.toPowerSeries • + if n = 1 then (if q = d then c else 0) else 0 + have hold : Function.HasFiniteSupport oldTerm := by + simpa only [oldTerm] using + PowerSeries.coeff_subst_finite hHsubst e.toPowerSeries q + have hdelta : Function.HasFiniteSupport deltaTerm := by + rw [Function.HasFiniteSupport] + refine (Set.finite_singleton 1).subset ?_ + intro n hn + simp only [Function.mem_support] at hn + simp only [Set.mem_singleton_iff] + by_contra hne + apply hn + simp [deltaTerm, hne] + rw [ + PowerSeries.coeff_subst hnewSubst e.toPowerSeries q, + PowerSeries.coeff_subst hHsubst e.toPowerSeries q] + calc + ∑ᶠ n : ℕ, + PowerSeries.coeff n e.toPowerSeries • + MvPowerSeries.coeff q + ((H + MvPowerSeries.monomial d c) ^ n) = + (∑ᶠ n : ℕ, (oldTerm n + deltaTerm n)) := by + apply finsum_congr + intro n + rw [coeff_pow_add_monomial_of_degree_le + hH q d hq hd c n, smul_add] + _ = (∑ᶠ n : ℕ, oldTerm n) + + ∑ᶠ n : ℕ, deltaTerm n := + finsum_add_distrib hold hdelta + _ = (∑ᶠ n : ℕ, oldTerm n) + + PowerSeries.coeff 1 e.toPowerSeries * + (if q = d then c else 0) := by + congr 1 + rw [finsum_eq_single _ 1] + · simp [deltaTerm, smul_eq_mul] + · intro n hn + simp [deltaTerm, hn] + _ = (∑ᶠ n : ℕ, oldTerm n) + + π * (if q = d then c else 0) := by + rw [LubinTateSeries.coeff_one_eq_uniformizer] + +omit [Fintype σ] in +private theorem coeff_defect_add_monomial_eq_of_degree_le_constantCoeff [Finite σ] + (e ebar : LubinTateSeries F π) + {H : MvPowerSeries σ F.valuationSubring} + (hH : MvPowerSeries.constantCoeff H = 0) + (q d : σ →₀ ℕ) (hq : q.degree ≤ d.degree) + (hd : 1 ≤ d.degree) (c : F.valuationSubring) : + MvPowerSeries.coeff q + (defect e ebar (H + MvPowerSeries.monomial d c)) = + MvPowerSeries.coeff q (defect e ebar H) + + if q = d then + π * ((1 - π ^ (d.degree - 1)) * c) + else 0 := by + classical + let := Fintype.ofFinite σ + simp only [ + defect, + map_sub, + coeff_subst_lubinTateSeries_add_monomial_of_degree_le + e hH q d hq hd c, + coeff_subst_inVariables_add_monomial_of_degree_le + ebar H q d hq c] + by_cases hqd : q = d + · subst q + simp only [ite_eq_left] + have hdegree : d.degree = (d.degree - 1) + 1 := by + omega + have hpow : + π ^ d.degree = π * π ^ (d.degree - 1) := by + calc + π ^ d.degree = + π ^ ((d.degree - 1) + 1) := + congrArg (fun n : ℕ => π ^ n) hdegree + _ = π * π ^ (d.degree - 1) := by + rw [pow_succ, mul_comm] + rw [hpow] + ring + · simp [hqd] + +/-- Adding a monomial of degree `d.degree` changes no defect coefficient in +lower total degree and changes the same-degree block only in the `d` +coordinate. -/ +theorem coeff_defect_add_monomial_eq_of_degree_le + (e ebar : LubinTateSeries F π) + {H : MvPowerSeries σ F.valuationSubring} + {L : σ → F.valuationSubring} (hH : HasLinearTerm H L) + (q d : σ →₀ ℕ) (hq : q.degree ≤ d.degree) + (hd : 2 ≤ d.degree) (c : F.valuationSubring) : + MvPowerSeries.coeff q + (defect e ebar (H + MvPowerSeries.monomial d c)) = + MvPowerSeries.coeff q (defect e ebar H) + + if q = d then + π * ((1 - π ^ (d.degree - 1)) * c) + else 0 := + coeff_defect_add_monomial_eq_of_degree_le_constantCoeff + e ebar hH.constantCoeff_eq_zero q d hq (by omega) c + +private theorem linearForm_eq_sum_monomial_stabilization + (L : σ → F.valuationSubring) : + linearForm L = + ∑ i, MvPowerSeries.monomial + (Finsupp.single i 1) (L i) := by + rw [linearForm] + apply Finset.sum_congr rfl + intro i _ + rw [← MvPowerSeries.monomial_zero_eq_C_apply, + MvPowerSeries.X_def, + MvPowerSeries.monomial_mul_monomial] + simp + +omit [Fintype σ] in +private theorem coeff_defect_sum_linear_monomials_eq_zero [Finite σ] + (e ebar : LubinTateSeries F π) + (L : σ → F.valuationSubring) + (s : Finset σ) (q : σ →₀ ℕ) (hq : q.degree ≤ 1) : + MvPowerSeries.coeff q + (defect e ebar + (∑ i ∈ s, MvPowerSeries.monomial + (Finsupp.single i 1) (L i))) = 0 := by + classical + let := Fintype.ofFinite σ + classical + induction s using Finset.induction_on with + | empty => + simp only [Finset.sum_empty] + have hleft : + PowerSeries.subst + (0 : MvPowerSeries σ F.valuationSubring) + e.toPowerSeries = 0 := + PowerSeries.subst_zero_of_constantCoeff_zero + e.constantCoeff_eq_zero + have hright : + MvPowerSeries.subst + (fun i : σ => inVariable ebar i) + (0 : MvPowerSeries σ F.valuationSubring) = 0 := by + rw [← MvPowerSeries.substAlgHom_apply + (inVariable_hasSubst ebar), map_zero] + simp [defect, hleft, hright] + | @insert i s hi ih => + rw [Finset.sum_insert hi, add_comm] + have hconstant : + MvPowerSeries.constantCoeff + (∑ j ∈ s, MvPowerSeries.monomial + (Finsupp.single j 1) (L j)) = 0 := by + rw [map_sum] + apply Finset.sum_eq_zero + intro j _ + exact + constantCoeff_monomial_eq_zero_stabilization + (Finsupp.single_ne_zero.mpr one_ne_zero) (L j) + have hq' : + q.degree ≤ (Finsupp.single i 1).degree := by + simpa only [Finsupp.degree_single] using hq + rw [ + coeff_defect_add_monomial_eq_of_degree_le_constantCoeff + e ebar hconstant q (Finsupp.single i 1) hq' + (by simp) (L i), + ih] + simp + +private theorem coeff_defect_linearForm_eq_zero_of_degree_le_one + (e ebar : LubinTateSeries F π) + (L : σ → F.valuationSubring) + (q : σ →₀ ℕ) (hq : q.degree ≤ 1) : + MvPowerSeries.coeff q (defect e ebar (linearForm L)) = 0 := by + rw [linearForm_eq_sum_monomial_stabilization] + simpa using + coeff_defect_sum_linear_monomials_eq_zero + e ebar L Finset.univ q hq + +/-- The same-uniformizer defect of a series with prescribed linear term has +no constant or linear coefficient. -/ +theorem two_le_order_defect + (e ebar : LubinTateSeries F π) + {H : MvPowerSeries σ F.valuationSubring} + {L : σ → F.valuationSubring} (hH : HasLinearTerm H L) : + (2 : ℕ∞) ≤ (defect e ebar H).order := by + classical + apply MvPowerSeries.nat_le_order + intro q hq + have hqle : q.degree ≤ 1 := + Nat.le_of_lt_succ (by simpa using hq) + have hcoeff : + ∀ r : σ →₀ ℕ, r.degree ≤ 1 → + MvPowerSeries.coeff r H = + MvPowerSeries.coeff r (linearForm L) := by + intro r hr + have hlt : + (r.degree : ℕ∞) < (H - linearForm L).order := + by + have hrNat : r.degree < 2 := Nat.lt_succ_of_le hr + have hrCast : (r.degree : ℕ∞) < (2 : ℕ∞) := by + exact_mod_cast hrNat + exact hrCast.trans_le hH + have hzero := MvPowerSeries.coeff_of_lt_order hlt + rw [map_sub, sub_eq_zero] at hzero + exact hzero + have hdefect : + MvPowerSeries.coeff q (defect e ebar H) = + MvPowerSeries.coeff q + (defect e ebar (linearForm L)) := + coeff_defect_eq_of_coeff_eq_degree_le + e ebar hH.constantCoeff_eq_zero + (constantCoeff_linearForm L) + (m := 1) hcoeff hqle + rw [hdefect] + exact + coeff_defect_linearForm_eq_zero_of_degree_le_one + e ebar L q hqle + +end SameUniformizer +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Intertwiner.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Intertwiner.lean new file mode 100644 index 0000000000..5001581882 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Intertwiner.lean @@ -0,0 +1,88 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Series +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.LinearTerm +public import Mathlib.RingTheory.MvPowerSeries.Substitution +/-! +# Intertwining equations for Lubin--Tate series + +For two Lubin--Tate series with the same prescribed linear coefficient, this +module defines the multivariable intertwining equation and its additive defect. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace LubinTate +namespace SameUniformizer + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] +variable {F : LocalField.{u, v} K} {π : F.valuationSubring} +variable {σ : Type*} + +/-- Insert a one-variable Lubin--Tate series into the variable `X_i`. -/ +noncomputable def inVariable (e : LubinTateSeries F π) (i : σ) : + MvPowerSeries σ F.valuationSubring := + PowerSeries.subst (MvPowerSeries.X i) e.toPowerSeries + +/-- States the theorem `constantCoeff_inVariable`. -/ +@[simp] +theorem constantCoeff_inVariable (e : LubinTateSeries F π) (i : σ) : + MvPowerSeries.constantCoeff (inVariable e i) = 0 := by + exact PowerSeries.constantCoeff_subst_eq_zero + (MvPowerSeries.constantCoeff_X (R := F.valuationSubring) i) + e.toPowerSeries e.constantCoeff_eq_zero + +/-- The family `i |-> e(X_i)` admits genuine multivariable +substitution. -/ +theorem inVariable_hasSubst [Finite σ] (e : LubinTateSeries F π) : + MvPowerSeries.HasSubst (fun i : σ ↦ inVariable e i) := + MvPowerSeries.hasSubst_of_constantCoeff_zero + (fun i ↦ constantCoeff_inVariable e i) + +/-- The literal same-uniformizer equation +`e(H(X_i)) = H(ebar(X_i))`. -/ +def Intertwines (e ebar : LubinTateSeries F π) + (H : MvPowerSeries σ F.valuationSubring) : Prop := + PowerSeries.subst H e.toPowerSeries = + MvPowerSeries.subst (fun i : σ ↦ inVariable ebar i) H + +/-- The coefficientwise defect whose vanishing is the intertwining +equation. -/ +noncomputable def defect (e ebar : LubinTateSeries F π) + (H : MvPowerSeries σ F.valuationSubring) : + MvPowerSeries σ F.valuationSubring := + PowerSeries.subst H e.toPowerSeries - + MvPowerSeries.subst (fun i : σ ↦ inVariable ebar i) H + +/-- States the theorem `intertwines_iff_defect_eq_zero`. -/ +theorem intertwines_iff_defect_eq_zero + (e ebar : LubinTateSeries F π) + (H : MvPowerSeries σ F.valuationSubring) : + Intertwines e ebar H ↔ defect e ebar H = 0 := by + simp only [Intertwines, defect, sub_eq_zero] + +/-- Each variable itself intertwines a Lubin--Tate series with itself. -/ +theorem intertwines_X [Finite σ] + (e : LubinTateSeries F π) (i : σ) : + Intertwines e e (MvPowerSeries.X i) := by + rw [Intertwines, + MvPowerSeries.subst_X (inVariable_hasSubst e)] + rfl + +end SameUniformizer +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/LinearTerm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/LinearTerm.lean new file mode 100644 index 0000000000..0353230886 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/LinearTerm.lean @@ -0,0 +1,69 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RingTheory.MvPowerSeries.Order +public import Mathlib.RingTheory.PowerSeries.Substitution +/-! +# Prescribed linear terms for multivariable power series + +A multivariable power series has a prescribed linear term when its difference +from the corresponding linear form has total order at least two. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate +namespace SameUniformizer + +variable {R : Type*} [CommRing R] +variable {σ : Type*} [Fintype σ] + +/-- The multivariable linear form `sum_i L_i X_i`. -/ +noncomputable def linearForm (L : σ → R) : MvPowerSeries σ R := + ∑ i, MvPowerSeries.C (L i) * MvPowerSeries.X i + +/-- States the theorem `constantCoeff_linearForm`. -/ +@[simp] +theorem constantCoeff_linearForm (L : σ → R) : + MvPowerSeries.constantCoeff (linearForm L) = 0 := by + simp [linearForm] + +/-- A series has prescribed linear term `L` when its difference from +`sum_i L_i X_i` has total order at least two. -/ +def HasLinearTerm (H : MvPowerSeries σ R) (L : σ → R) : Prop := + (2 : ℕ∞) ≤ (H - linearForm L).order + +namespace HasLinearTerm + +variable {H : MvPowerSeries σ R} {L : σ → R} + +/-- A series with a prescribed linear term has zero constant +coefficient. -/ +theorem constantCoeff_eq_zero (h : HasLinearTerm H L) : + MvPowerSeries.constantCoeff H = 0 := by + have horder : (1 : ℕ∞) ≤ (H - linearForm L).order := + (by norm_num : (1 : ℕ∞) ≤ 2).trans h + have hconstant := + MvPowerSeries.one_le_order_iff_constCoeff_eq_zero.mp horder + simpa using hconstant + +/-- Consequently the series can genuinely be substituted into a +one-variable power series. -/ +theorem hasSubst (h : HasLinearTerm H L) : + PowerSeries.HasSubst H := + PowerSeries.HasSubst.of_constantCoeff_zero h.constantCoeff_eq_zero + +end HasLinearTerm + +end SameUniformizer +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCoefficient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCoefficient.lean new file mode 100644 index 0000000000..45aa01aff6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCoefficient.lean @@ -0,0 +1,118 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Reduction +/-! +# Recursive coefficients for Lubin--Tate intertwiners + +This module connects the two coefficient-level inputs for the recursive +construction of a same-uniformizer Lubin--Tate intertwiner. Reduction makes +every coefficient of the current defect divisible by the uniformizer. In +total degree `m ≥ 2`, the remaining scalar equation has factor +`1 - π ^ (m - 1)`, which is a unit. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w + +namespace LubinTate +namespace SameUniformizer + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] +variable {F : LocalField.{u, v} K} {π : F.valuationSubring} +variable {σ : Type w} [Fintype σ] + +/-- The coefficient of an intertwining defect after removing one factor of +the chosen uniformizer. -/ +noncomputable def normalizedDefectCoefficient + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (e ebar : LubinTateSeries F π) + {H : MvPowerSeries σ F.valuationSubring} + {L : σ → F.valuationSubring} (hH : HasLinearTerm H L) + (d : σ →₀ ℕ) : + F.valuationSubring := + Classical.choose (uniformizer_dvd_coeff_defect hπ e ebar hH d) + +/-- Multiplying the normalized defect coefficient by the uniformizer recovers +the original coefficient. -/ +theorem uniformizer_mul_normalizedDefectCoefficient + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (e ebar : LubinTateSeries F π) + {H : MvPowerSeries σ F.valuationSubring} + {L : σ → F.valuationSubring} (hH : HasLinearTerm H L) + (d : σ →₀ ℕ) : + π * normalizedDefectCoefficient hπ e ebar hH d = + MvPowerSeries.coeff d (defect e ebar H) := by + exact + (Classical.choose_spec + (uniformizer_dvd_coeff_defect hπ e ebar hH d)).symm + +/-- The coefficient added in total degree `d.degree` by the recursive +same-uniformizer intertwiner construction. + +Its defining equation is the one which cancels the normalized defect in that +degree. The hypothesis `2 ≤ d.degree` ensures that the exponent +`d.degree - 1` is positive. -/ +noncomputable def correctionCoefficient + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (e ebar : LubinTateSeries F π) + {H : MvPowerSeries σ F.valuationSubring} + {L : σ → F.valuationSubring} (hH : HasLinearTerm H L) + (d : σ →₀ ℕ) (hd : 2 ≤ d.degree) : + F.valuationSubring := + Classical.choose + (existsUnique_one_sub_uniformizer_pow_mul_eq hπ + (by omega : d.degree - 1 ≠ 0) + (-normalizedDefectCoefficient hπ e ebar hH d)) + +/-- The recursive correction coefficient satisfies its defining scalar +equation. -/ +theorem correctionCoefficient_spec + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (e ebar : LubinTateSeries F π) + {H : MvPowerSeries σ F.valuationSubring} + {L : σ → F.valuationSubring} (hH : HasLinearTerm H L) + (d : σ →₀ ℕ) (hd : 2 ≤ d.degree) : + (1 - π ^ (d.degree - 1)) * + correctionCoefficient hπ e ebar hH d hd = + -normalizedDefectCoefficient hπ e ebar hH d := by + exact + (Classical.choose_spec + (existsUnique_one_sub_uniformizer_pow_mul_eq hπ + (by omega : d.degree - 1 ≠ 0) + (-normalizedDefectCoefficient hπ e ebar hH d))).1 + +/-- The defining scalar equation determines the recursive correction +coefficient uniquely. -/ +theorem correctionCoefficient_unique + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (e ebar : LubinTateSeries F π) + {H : MvPowerSeries σ F.valuationSubring} + {L : σ → F.valuationSubring} (hH : HasLinearTerm H L) + (d : σ →₀ ℕ) (hd : 2 ≤ d.degree) + {c : F.valuationSubring} + (hc : + (1 - π ^ (d.degree - 1)) * c = + -normalizedDefectCoefficient hπ e ebar hH d) : + c = correctionCoefficient hπ e ebar hH d hd := by + exact + (Classical.choose_spec + (existsUnique_one_sub_uniformizer_pow_mul_eq hπ + (by omega : d.degree - 1 ≠ 0) + (-normalizedDefectCoefficient hπ e ebar hH d))).2 c hc + +end SameUniformizer +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCorrection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCorrection.lean new file mode 100644 index 0000000000..741d15f274 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCorrection.lean @@ -0,0 +1,677 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCoefficient +/-! +# Recursive monomial corrections for Lubin--Tate intertwiners + +The coefficient selected in `RecursiveCoefficient` is inserted as a single +monomial. This file proves that the insertion preserves the prescribed linear +term and cancels the defect coefficient in precisely that total degree. +-/ + +@[expose] public section + +noncomputable +section + +open scoped BigOperators + +universe u v w + +namespace LubinTate +namespace SameUniformizer + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] +variable {F : LocalField.{u, v} K} {π : F.valuationSubring} +variable {σ : Type w} [Fintype σ] + +/-- The single monomial inserted at one step of the recursive construction. -/ +noncomputable def monomialCorrection + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (e ebar : LubinTateSeries F π) + {H : MvPowerSeries σ F.valuationSubring} + {L : σ → F.valuationSubring} (hH : HasLinearTerm H L) + (d : σ →₀ ℕ) (hd : 2 ≤ d.degree) : + MvPowerSeries σ F.valuationSubring := + MvPowerSeries.monomial d + (correctionCoefficient hπ e ebar hH d hd) + +/-- Insert the recursive correction into the current approximation. -/ +noncomputable def correctedIntertwiner + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (e ebar : LubinTateSeries F π) + {H : MvPowerSeries σ F.valuationSubring} + {L : σ → F.valuationSubring} (hH : HasLinearTerm H L) + (d : σ →₀ ℕ) (hd : 2 ≤ d.degree) : + MvPowerSeries σ F.valuationSubring := + H + monomialCorrection hπ e ebar hH d hd + +private theorem degree_le_order_monomial + {R : Type*} [CommRing R] {τ : Type*} + (d : τ →₀ ℕ) (c : R) : + (d.degree : ℕ∞) ≤ (MvPowerSeries.monomial d c).order := by + classical + by_cases hc : c = 0 + · simp [hc] + · rw [MvPowerSeries.order_monomial_of_ne_zero hc] + +private theorem natCast_le_order_pow_of_one_le_order + {R : Type*} [CommRing R] {τ : Type*} + (f : MvPowerSeries τ R) (n : ℕ) + (hf : (1 : ℕ∞) ≤ f.order) : + (n : ℕ∞) ≤ (f ^ n).order := by + calc + (n : ℕ∞) = n • (1 : ℕ∞) := by simp + _ ≤ n • f.order := nsmul_le_nsmul_right hf n + _ ≤ (f ^ n).order := MvPowerSeries.le_order_pow n + +private theorem le_order_finset_sum + {R : Type*} [CommRing R] {τ ι : Type*} + {s : Finset ι} {f : ι → MvPowerSeries τ R} {m : ℕ∞} + (h : ∀ i ∈ s, m ≤ (f i).order) : + m ≤ (∑ i ∈ s, f i).order := by + classical + induction s using Finset.induction_on with + | empty => simp + | @insert i s hi ih => + rw [Finset.sum_insert hi] + exact + (le_min + (h i (Finset.mem_insert_self i s)) + (ih fun j hj => h j (Finset.mem_insert_of_mem hj))).trans + MvPowerSeries.min_order_le_add + +private theorem natCast_sum_le_order_finset_prod_pow + {R : Type*} [CommRing R] {τ ι : Type*} + {s : Finset ι} (f : ι → MvPowerSeries τ R) (n : ι → ℕ) + (hf : ∀ i ∈ s, (1 : ℕ∞) ≤ (f i).order) : + ((∑ i ∈ s, n i : ℕ) : ℕ∞) ≤ + (∏ i ∈ s, (f i) ^ n i).order := by + classical + induction s using Finset.induction_on with + | empty => simp + | @insert i s hi ih => + rw [Finset.sum_insert hi, Finset.prod_insert hi] + calc + ((n i + ∑ j ∈ s, n j : ℕ) : ℕ∞) = + (n i : ℕ∞) + ((∑ j ∈ s, n j : ℕ) : ℕ∞) := by + norm_cast + _ ≤ ((f i) ^ n i).order + + (∏ j ∈ s, (f j) ^ n j).order := + add_le_add + (natCast_le_order_pow_of_one_le_order + (f i) (n i) (hf i (Finset.mem_insert_self i s))) + (ih fun j hj => hf j (Finset.mem_insert_of_mem hj)) + _ ≤ ((f i) ^ n i * ∏ j ∈ s, (f j) ^ n j).order := + MvPowerSeries.le_order_mul + +private theorem order_sub_add_pred_le_order_pow_sub_pow + {R : Type*} [CommRing R] {τ : Type*} + (f g : MvPowerSeries τ R) + (hf : (1 : ℕ∞) ≤ f.order) + (hg : (1 : ℕ∞) ≤ g.order) + (n : ℕ) : + (f - g).order + ((n - 1 : ℕ) : ℕ∞) ≤ + (f ^ n - g ^ n).order := by + let q := + ∑ i ∈ Finset.range n, f ^ i * g ^ (n - 1 - i) + have hq : ((n - 1 : ℕ) : ℕ∞) ≤ q.order := by + apply le_order_finset_sum + intro i hi + have hi' : i < n := Finset.mem_range.mp hi + calc + ((n - 1 : ℕ) : ℕ∞) = + (i : ℕ∞) + ((n - 1 - i : ℕ) : ℕ∞) := by + norm_cast + omega + _ ≤ (f ^ i).order + (g ^ (n - 1 - i)).order := + add_le_add + (natCast_le_order_pow_of_one_le_order f i hf) + (natCast_le_order_pow_of_one_le_order + g (n - 1 - i) hg) + _ ≤ (f ^ i * g ^ (n - 1 - i)).order := + MvPowerSeries.le_order_mul + have hfactor : + (f - g) * q = f ^ n - g ^ n := by + exact (Commute.all f g).mul_geom_sum₂ n + calc + (f - g).order + ((n - 1 : ℕ) : ℕ∞) ≤ + (f - g).order + q.order := + add_le_add (le_refl _) hq + _ ≤ ((f - g) * q).order := + MvPowerSeries.le_order_mul + _ = (f ^ n - g ^ n).order := + congrArg (fun h : MvPowerSeries τ R => h.order) hfactor + +private theorem natCast_sum_add_one_le_order_prod_pow_sub_prod_pow + {R : Type*} [CommRing R] {τ ι : Type*} + {s : Finset ι} + (f g : ι → MvPowerSeries τ R) (n : ι → ℕ) + (hn : ∀ i ∈ s, n i ≠ 0) + (hf : ∀ i ∈ s, (1 : ℕ∞) ≤ (f i).order) + (hg : ∀ i ∈ s, (1 : ℕ∞) ≤ (g i).order) + (hfg : ∀ i ∈ s, (2 : ℕ∞) ≤ (f i - g i).order) : + (((∑ i ∈ s, n i) + 1 : ℕ) : ℕ∞) ≤ + ((∏ i ∈ s, (f i) ^ n i) - + ∏ i ∈ s, (g i) ^ n i).order := by + classical + induction s using Finset.induction_on with + | empty => simp + | @insert i s hi ih => + have hni : n i ≠ 0 := + hn i (Finset.mem_insert_self i s) + have hpowDifference : + ((n i + 1 : ℕ) : ℕ∞) ≤ + ((f i) ^ n i - (g i) ^ n i).order := by + calc + ((n i + 1 : ℕ) : ℕ∞) = + (2 : ℕ∞) + ((n i - 1 : ℕ) : ℕ∞) := by + norm_cast + omega + _ ≤ (f i - g i).order + + ((n i - 1 : ℕ) : ℕ∞) := + add_le_add + (hfg i (Finset.mem_insert_self i s)) (le_refl _) + _ ≤ ((f i) ^ n i - (g i) ^ n i).order := + order_sub_add_pred_le_order_pow_sub_pow + (f i) (g i) + (hf i (Finset.mem_insert_self i s)) + (hg i (Finset.mem_insert_self i s)) + (n i) + have hprodF : + ((∑ j ∈ s, n j : ℕ) : ℕ∞) ≤ + (∏ j ∈ s, (f j) ^ n j).order := + natCast_sum_le_order_finset_prod_pow f n + (fun j hj => hf j (Finset.mem_insert_of_mem hj)) + have hpowG : + (n i : ℕ∞) ≤ ((g i) ^ n i).order := + natCast_le_order_pow_of_one_le_order + (g i) (n i) (hg i (Finset.mem_insert_self i s)) + have hprodDifference : + (((∑ j ∈ s, n j) + 1 : ℕ) : ℕ∞) ≤ + ((∏ j ∈ s, (f j) ^ n j) - + ∏ j ∈ s, (g j) ^ n j).order := + ih + (fun j hj => hn j (Finset.mem_insert_of_mem hj)) + (fun j hj => hf j (Finset.mem_insert_of_mem hj)) + (fun j hj => hg j (Finset.mem_insert_of_mem hj)) + (fun j hj => hfg j (Finset.mem_insert_of_mem hj)) + have hleft : + (((n i + ∑ j ∈ s, n j) + 1 : ℕ) : ℕ∞) ≤ + (((f i) ^ n i - (g i) ^ n i) * + ∏ j ∈ s, (f j) ^ n j).order := by + calc + (((n i + ∑ j ∈ s, n j) + 1 : ℕ) : ℕ∞) = + ((n i + 1 : ℕ) : ℕ∞) + + ((∑ j ∈ s, n j : ℕ) : ℕ∞) := by + norm_cast + omega + _ ≤ ((f i) ^ n i - (g i) ^ n i).order + + (∏ j ∈ s, (f j) ^ n j).order := + add_le_add hpowDifference hprodF + _ ≤ (((f i) ^ n i - (g i) ^ n i) * + ∏ j ∈ s, (f j) ^ n j).order := + MvPowerSeries.le_order_mul + have hright : + (((n i + ∑ j ∈ s, n j) + 1 : ℕ) : ℕ∞) ≤ + ((g i) ^ n i * + ((∏ j ∈ s, (f j) ^ n j) - + ∏ j ∈ s, (g j) ^ n j)).order := by + calc + (((n i + ∑ j ∈ s, n j) + 1 : ℕ) : ℕ∞) = + (n i : ℕ∞) + + (((∑ j ∈ s, n j) + 1 : ℕ) : ℕ∞) := by + norm_cast + _ ≤ ((g i) ^ n i).order + + ((∏ j ∈ s, (f j) ^ n j) - + ∏ j ∈ s, (g j) ^ n j).order := + add_le_add hpowG hprodDifference + _ ≤ ((g i) ^ n i * + ((∏ j ∈ s, (f j) ^ n j) - + ∏ j ∈ s, (g j) ^ n j)).order := + MvPowerSeries.le_order_mul + rw [Finset.sum_insert hi, Finset.prod_insert hi, + Finset.prod_insert hi] + rw [show + (f i) ^ n i * (∏ j ∈ s, (f j) ^ n j) - + (g i) ^ n i * (∏ j ∈ s, (g j) ^ n j) = + ((f i) ^ n i - (g i) ^ n i) * + (∏ j ∈ s, (f j) ^ n j) + + (g i) ^ n i * + ((∏ j ∈ s, (f j) ^ n j) - + ∏ j ∈ s, (g j) ^ n j) by ring] + exact + (le_min hleft hright).trans + MvPowerSeries.min_order_le_add + +/-- The linear part of `e(X_i)` for a same-uniformizer Lubin--Tate series. -/ +private noncomputable def linearInVariable + (π : F.valuationSubring) (i : σ) : + MvPowerSeries σ F.valuationSubring := + MvPowerSeries.C π * MvPowerSeries.X i + +omit [Fintype σ] in +private theorem linearInVariable_constantCoeff + (π : F.valuationSubring) (i : σ) : + MvPowerSeries.constantCoeff (linearInVariable π i) = 0 := by + rw [linearInVariable, map_mul, + MvPowerSeries.constantCoeff_C, + ← MvPowerSeries.coeff_zero_eq_constantCoeff_apply, + MvPowerSeries.coeff_zero_X, mul_zero] + +omit [Fintype σ] in +private theorem linearInVariable_hasSubst [Finite σ] + (π : F.valuationSubring) : + MvPowerSeries.HasSubst (linearInVariable (σ := σ) π) := by + classical + let := Fintype.ofFinite σ + exact + MvPowerSeries.hasSubst_of_constantCoeff_zero + (linearInVariable_constantCoeff π) + +omit [Fintype σ] in +private theorem one_le_order_inVariable + (ebar : LubinTateSeries F π) (i : σ) : + (1 : ℕ∞) ≤ (inVariable ebar i).order := + MvPowerSeries.one_le_order_iff_constCoeff_eq_zero.mpr + (constantCoeff_inVariable ebar i) + +omit [Fintype σ] in +private theorem one_le_order_linearInVariable + (π : F.valuationSubring) (i : σ) : + (1 : ℕ∞) ≤ (linearInVariable π i).order := + MvPowerSeries.one_le_order_iff_constCoeff_eq_zero.mpr + (linearInVariable_constantCoeff π i) + +omit [Fintype σ] in +private theorem two_le_order_inVariable_sub_linearInVariable + (ebar : LubinTateSeries F π) (i : σ) : + (2 : ℕ∞) ≤ (inVariable ebar i - linearInVariable π i).order := by + classical + apply MvPowerSeries.nat_le_order + intro d hd + have hdNat : d.degree < 2 := by + exact_mod_cast hd + rw [map_sub] + by_cases hdi : d = Finsupp.single i (d i) + · by_cases hzero : d i = 0 + · have hd0 : d = 0 := by + rw [hdi, hzero] + simp + subst d + simp [inVariable, linearInVariable, + PowerSeries.coeff_subst_single, + LubinTateSeries.constantCoeff_eq_zero] + · have hone : d i = 1 := by + rw [hdi, Finsupp.degree_single] at hdNat + omega + have hd1 : d = Finsupp.single i 1 := by + rw [hdi, hone] + subst d + simp [inVariable, linearInVariable, + PowerSeries.coeff_subst_single, + LubinTateSeries.coeff_one_eq_uniformizer] + · have hsingle : d ≠ Finsupp.single i 1 := by + intro h + apply hdi + rw [h] + simp + simp [inVariable, linearInVariable, + PowerSeries.coeff_subst_single, hdi, + MvPowerSeries.coeff_X, hsingle] + +omit [Fintype σ] in +private theorem degree_add_one_le_order_subst_monomial_sub_linear [Finite σ] + (ebar : LubinTateSeries F π) + (d : σ →₀ ℕ) (c : F.valuationSubring) : + ((d.degree + 1 : ℕ) : ℕ∞) ≤ + (MvPowerSeries.subst (fun i : σ => inVariable ebar i) + (MvPowerSeries.monomial d c) - + MvPowerSeries.subst (linearInVariable (σ := σ) π) + (MvPowerSeries.monomial d c)).order := by + classical + let := Fintype.ofFinite σ + have hprod : + ((d.degree + 1 : ℕ) : ℕ∞) ≤ + (d.prod (fun i n => (inVariable ebar i) ^ n) - + d.prod (fun i n => (linearInVariable π i) ^ n)).order := by + simpa only [Finsupp.prod, Finsupp.degree_apply] using + natCast_sum_add_one_le_order_prod_pow_sub_prod_pow + (s := d.support) + (fun i : σ => inVariable ebar i) + (linearInVariable (σ := σ) π) + (fun i => d i) + (fun i hi => Finsupp.mem_support_iff.mp hi) + (fun i _ => one_le_order_inVariable ebar i) + (fun i _ => one_le_order_linearInVariable π i) + (fun i _ => + two_le_order_inVariable_sub_linearInVariable ebar i) + rw [ + MvPowerSeries.subst_monomial + (inVariable_hasSubst ebar) d c, + MvPowerSeries.subst_monomial + (linearInVariable_hasSubst (σ := σ) π) d c, + ← MvPowerSeries.c_eq_algebraMap] + rw [show + MvPowerSeries.C c * + d.prod (fun i n => (inVariable ebar i) ^ n) - + MvPowerSeries.C c * + d.prod (fun i n => (linearInVariable π i) ^ n) = + c • + (d.prod (fun i n => (inVariable ebar i) ^ n) - + d.prod (fun i n => (linearInVariable π i) ^ n)) by + rw [MvPowerSeries.smul_eq_C_mul] + ring] + exact hprod.trans MvPowerSeries.le_order_smul + +omit [Fintype σ] in +private theorem coeff_subst_linearInVariable_monomial + (d : σ →₀ ℕ) (c : F.valuationSubring) : + MvPowerSeries.coeff d + (MvPowerSeries.subst (linearInVariable (σ := σ) π) + (MvPowerSeries.monomial d c)) = + π ^ d.degree * c := by + have hlinear : + (Function.const σ π • + (MvPowerSeries.X : + σ → MvPowerSeries σ F.valuationSubring)) = + linearInVariable (σ := σ) π := by + funext i + simp [linearInVariable, MvPowerSeries.smul_eq_C_mul] + rw [← hlinear, ← MvPowerSeries.rescale_eq_subst, + MvPowerSeries.coeff_rescale, + MvPowerSeries.coeff_monomial_same] + simp only [Finsupp.prod, Function.const_apply, + Finset.prod_pow_eq_pow_sum, Finsupp.degree_apply] + +omit [Fintype σ] in +private theorem coeff_subst_inVariables_monomial [Finite σ] + (ebar : LubinTateSeries F π) + (d : σ →₀ ℕ) (c : F.valuationSubring) : + MvPowerSeries.coeff d + (MvPowerSeries.subst (fun i : σ => inVariable ebar i) + (MvPowerSeries.monomial d c)) = + π ^ d.degree * c := by + classical + let := Fintype.ofFinite σ + have horder := + degree_add_one_le_order_subst_monomial_sub_linear ebar d c + have hlt : + (d.degree : ℕ∞) < + (MvPowerSeries.subst (fun i : σ => inVariable ebar i) + (MvPowerSeries.monomial d c) - + MvPowerSeries.subst (linearInVariable (σ := σ) π) + (MvPowerSeries.monomial d c)).order := + by + have hdegree_lt : + (d.degree : ℕ∞) < ((d.degree + 1 : ℕ) : ℕ∞) := by + exact_mod_cast Nat.lt_succ_self d.degree + exact hdegree_lt.trans_le horder + have hcoeff := + MvPowerSeries.coeff_of_lt_order hlt + rw [map_sub, sub_eq_zero] at hcoeff + rw [hcoeff, coeff_subst_linearInVariable_monomial] + +omit [Fintype σ] in +private theorem coeff_subst_inVariables_add_monomial [Finite σ] + (ebar : LubinTateSeries F π) + (H : MvPowerSeries σ F.valuationSubring) + (d : σ →₀ ℕ) (c : F.valuationSubring) : + MvPowerSeries.coeff d + (MvPowerSeries.subst (fun i : σ ↦ inVariable ebar i) + (H + MvPowerSeries.monomial d c)) = + MvPowerSeries.coeff d + (MvPowerSeries.subst (fun i : σ ↦ inVariable ebar i) H) + + π ^ d.degree * c := by + classical + let := Fintype.ofFinite σ + rw [ + MvPowerSeries.subst_add (inVariable_hasSubst ebar), + map_add, + coeff_subst_inVariables_monomial] + +private theorem constantCoeff_monomial_eq_zero + {R : Type*} [CommRing R] {τ : Type*} + {d : τ →₀ ℕ} (hd : d ≠ 0) (c : R) : + MvPowerSeries.constantCoeff (MvPowerSeries.monomial d c) = 0 := by + rw [← MvPowerSeries.coeff_zero_eq_constantCoeff_apply, + MvPowerSeries.coeff_monomial_ne] + exact Ne.symm hd + +private theorem coeff_pow_add_monomial_sub_pow + {R : Type*} [CommRing R] {τ : Type*} + {H : MvPowerSeries τ R} + (hH : MvPowerSeries.constantCoeff H = 0) + (d : τ →₀ ℕ) (hd : 2 ≤ d.degree) (c : R) (n : ℕ) : + MvPowerSeries.coeff d + ((H + MvPowerSeries.monomial d c) ^ n - H ^ n) = + if n = 1 then c else 0 := by + classical + have hd0 : d ≠ 0 := by + intro h + subst d + simp at hd + by_cases hn : n = 1 + · subst n + simp [MvPowerSeries.coeff_monomial_same] + · rcases n with _ | n + · simp + · have hn0 : n ≠ 0 := by + intro h + apply hn + omega + let M := MvPowerSeries.monomial d c + let A := H + M + have hMconstant : + MvPowerSeries.constantCoeff M = 0 := + constantCoeff_monomial_eq_zero hd0 c + have hAconstant : + MvPowerSeries.constantCoeff A = 0 := by + simp [A, hH, hMconstant] + have hHorder : (1 : ℕ∞) ≤ H.order := + MvPowerSeries.one_le_order_iff_constCoeff_eq_zero.mpr hH + have hAorder : (1 : ℕ∞) ≤ A.order := + MvPowerSeries.one_le_order_iff_constCoeff_eq_zero.mpr hAconstant + have hpow : + M.order + (n : ℕ∞) ≤ + (A ^ (n + 1) - H ^ (n + 1)).order := by + simpa [A, M, add_sub_cancel_left] using + order_sub_add_pred_le_order_pow_sub_pow + A H hAorder hHorder (n + 1) + have hdegree : (d.degree : ℕ∞) ≤ M.order := + degree_le_order_monomial d c + have hn' : (1 : ℕ∞) ≤ (n : ℕ∞) := by + exact_mod_cast Nat.one_le_iff_ne_zero.mpr hn0 + have horder : + ((d.degree + 1 : ℕ) : ℕ∞) ≤ + (A ^ (n + 1) - H ^ (n + 1)).order := by + calc + ((d.degree + 1 : ℕ) : ℕ∞) = + (d.degree : ℕ∞) + 1 := by norm_cast + _ ≤ M.order + (n : ℕ∞) := + add_le_add hdegree hn' + _ ≤ (A ^ (n + 1) - H ^ (n + 1)).order := + hpow + have hlt : + (d.degree : ℕ∞) < + (A ^ (n + 1) - H ^ (n + 1)).order := + by + have hdegree_lt : + (d.degree : ℕ∞) < ((d.degree + 1 : ℕ) : ℕ∞) := by + exact_mod_cast Nat.lt_succ_self d.degree + exact hdegree_lt.trans_le horder + have hzero := MvPowerSeries.coeff_of_lt_order hlt + simpa [A, M, hn0] using hzero + +private theorem coeff_pow_add_monomial + {R : Type*} [CommRing R] {τ : Type*} + {H : MvPowerSeries τ R} + (hH : MvPowerSeries.constantCoeff H = 0) + (d : τ →₀ ℕ) (hd : 2 ≤ d.degree) (c : R) (n : ℕ) : + MvPowerSeries.coeff d + ((H + MvPowerSeries.monomial d c) ^ n) = + MvPowerSeries.coeff d (H ^ n) + + if n = 1 then c else 0 := by + have h := + coeff_pow_add_monomial_sub_pow hH d hd c n + rw [map_sub, sub_eq_iff_eq_add] at h + simpa [add_comm] using h + +private theorem coeff_subst_lubinTateSeries_add_monomial + (e : LubinTateSeries F π) + {H : MvPowerSeries σ F.valuationSubring} + {L : σ → F.valuationSubring} (hH : HasLinearTerm H L) + (d : σ →₀ ℕ) (hd : 2 ≤ d.degree) + (c : F.valuationSubring) : + MvPowerSeries.coeff d + (PowerSeries.subst + (H + MvPowerSeries.monomial d c) + e.toPowerSeries) = + MvPowerSeries.coeff d + (PowerSeries.subst H e.toPowerSeries) + + π * c := by + have hd0 : d ≠ 0 := by + intro h + subst d + simp at hd + have hMconstant : + MvPowerSeries.constantCoeff + (MvPowerSeries.monomial d c) = 0 := + constantCoeff_monomial_eq_zero hd0 c + have hHconstant : + MvPowerSeries.constantCoeff H = 0 := + hH.constantCoeff_eq_zero + have hnewSubst : + PowerSeries.HasSubst + (H + MvPowerSeries.monomial d c) := + PowerSeries.HasSubst.of_constantCoeff_zero (by + simp [hHconstant, hMconstant]) + let oldTerm : ℕ → F.valuationSubring := fun n => + PowerSeries.coeff n e.toPowerSeries • + MvPowerSeries.coeff d (H ^ n) + let deltaTerm : ℕ → F.valuationSubring := fun n => + PowerSeries.coeff n e.toPowerSeries • + if n = 1 then c else 0 + have hold : Function.HasFiniteSupport oldTerm := by + simpa only [oldTerm] using + PowerSeries.coeff_subst_finite hH.hasSubst e.toPowerSeries d + have hdelta : Function.HasFiniteSupport deltaTerm := by + rw [Function.HasFiniteSupport] + refine (Set.finite_singleton 1).subset ?_ + intro n hn + simp only [Function.mem_support] at hn + simp only [Set.mem_singleton_iff] + by_contra hne + apply hn + simp [deltaTerm, hne] + rw [ + PowerSeries.coeff_subst hnewSubst e.toPowerSeries d, + PowerSeries.coeff_subst hH.hasSubst e.toPowerSeries d] + calc + ∑ᶠ n : ℕ, + PowerSeries.coeff n e.toPowerSeries • + MvPowerSeries.coeff d + ((H + MvPowerSeries.monomial d c) ^ n) = + ∑ᶠ n : ℕ, (oldTerm n + deltaTerm n) := by + apply finsum_congr + intro n + rw [coeff_pow_add_monomial hHconstant d hd c n, + smul_add] + _ = (∑ᶠ n : ℕ, oldTerm n) + + ∑ᶠ n : ℕ, deltaTerm n := + finsum_add_distrib hold hdelta + _ = (∑ᶠ n : ℕ, oldTerm n) + + PowerSeries.coeff 1 e.toPowerSeries * c := by + congr 1 + rw [finsum_eq_single _ 1] + · simp [deltaTerm, smul_eq_mul] + · intro n hn + simp [deltaTerm, hn] + _ = (∑ᶠ n : ℕ, oldTerm n) + π * c := by + rw [LubinTateSeries.coeff_one_eq_uniformizer] + +private theorem coeff_defect_add_monomial + (e ebar : LubinTateSeries F π) + {H : MvPowerSeries σ F.valuationSubring} + {L : σ → F.valuationSubring} (hH : HasLinearTerm H L) + (d : σ →₀ ℕ) (hd : 2 ≤ d.degree) + (c : F.valuationSubring) : + MvPowerSeries.coeff d + (defect e ebar (H + MvPowerSeries.monomial d c)) = + MvPowerSeries.coeff d (defect e ebar H) + + π * ((1 - π ^ (d.degree - 1)) * c) := by + have hdegree : d.degree = (d.degree - 1) + 1 := by + omega + have hpow : + π ^ d.degree = π * π ^ (d.degree - 1) := by + calc + π ^ d.degree = π ^ ((d.degree - 1) + 1) := + congrArg (fun n : ℕ => π ^ n) hdegree + _ = π ^ (d.degree - 1) * π := by + rw [pow_succ] + _ = π * π ^ (d.degree - 1) := by + rw [mul_comm] + simp only [ + defect, + map_sub, + coeff_subst_lubinTateSeries_add_monomial e hH d hd c, + coeff_subst_inVariables_add_monomial ebar H d c, + hpow] + ring + +/-- A correction in total degree at least two does not change the prescribed +linear term. -/ +theorem correctedIntertwiner_hasLinearTerm + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (e ebar : LubinTateSeries F π) + {H : MvPowerSeries σ F.valuationSubring} + {L : σ → F.valuationSubring} (hH : HasLinearTerm H L) + (d : σ →₀ ℕ) (hd : 2 ≤ d.degree) : + HasLinearTerm (correctedIntertwiner hπ e ebar hH d hd) L := by + rw [correctedIntertwiner, HasLinearTerm] + have hd' : (2 : ℕ∞) ≤ (d.degree : ℕ∞) := by + exact_mod_cast hd + have hcorrection : + (2 : ℕ∞) ≤ (monomialCorrection hπ e ebar hH d hd).order := + hd'.trans + (degree_le_order_monomial d + (correctionCoefficient hπ e ebar hH d hd)) + rw [show + H + monomialCorrection hπ e ebar hH d hd - linearForm L = + (H - linearForm L) + + monomialCorrection hπ e ebar hH d hd by ring] + exact + (le_min hH hcorrection).trans + MvPowerSeries.min_order_le_add + +/-- The recursively selected degree-`d` monomial cancels the degree-`d` +coefficient of the intertwining defect. -/ +theorem coeff_defect_correctedIntertwiner_eq_zero + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (e ebar : LubinTateSeries F π) + {H : MvPowerSeries σ F.valuationSubring} + {L : σ → F.valuationSubring} (hH : HasLinearTerm H L) + (d : σ →₀ ℕ) (hd : 2 ≤ d.degree) : + MvPowerSeries.coeff d + (defect e ebar + (correctedIntertwiner hπ e ebar hH d hd)) = 0 := by + rw [ + correctedIntertwiner, + monomialCorrection, + coeff_defect_add_monomial e ebar hH d hd, + ← uniformizer_mul_normalizedDefectCoefficient hπ e ebar hH d, + correctionCoefficient_spec hπ e ebar hH d hd] + ring + +end SameUniformizer +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveIntertwiner.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveIntertwiner.lean new file mode 100644 index 0000000000..2c1d0c9dbf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveIntertwiner.lean @@ -0,0 +1,1040 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.DegreeStabilization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCorrection +/-! +# Finite-degree approximations to Lubin--Tate intertwiners + +For a fixed total degree there are only finitely many monomials. This file +orders those monomials, applies the coefficient correction from +`RecursiveCorrection` one at a time, and then iterates the resulting +degreewise correction. + +The construction is genuinely recursive: stage `n + 1` corrects every +monomial of total degree `n + 2`. Corrections in that degree leave all lower +coefficients unchanged. The stabilized coefficient series and its +intertwining equation are established below after the finite-degree +construction. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w + +namespace LubinTate +namespace SameUniformizer + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] +variable {F : LocalField.{u, v} K} {pi : F.valuationSubring} +variable {sigma : Type w} [Fintype sigma] + +/-- The prescribed linear form itself has the prescribed linear term. -/ +theorem linearForm_hasLinearTerm + (L : sigma → F.valuationSubring) : + HasLinearTerm (linearForm L) L := by + simp [HasLinearTerm] + +/-- Formal series with the prescribed linear term. -/ +abbrev Approximation + (L : sigma → F.valuationSubring) := + {H : MvPowerSeries sigma F.valuationSubring // HasLinearTerm H L} + +/-- The finite list of all monomials of a fixed total degree. -/ +noncomputable def degreeIndexList (m : ℕ) : + List {d : sigma →₀ ℕ // d.degree = m} := + letI : Fintype {d : sigma →₀ ℕ // d.degree = m} := + (Finsupp.finite_of_degree_eq m).fintype + Finset.univ.toList + +private theorem degreeIndexList_nodup (m : ℕ) : + (degreeIndexList (sigma := sigma) m).Nodup := by + classical + simp [degreeIndexList, Finset.nodup_toList] + +private theorem mem_degreeIndexList + (m : ℕ) (d : {d : sigma →₀ ℕ // d.degree = m}) : + d ∈ degreeIndexList (sigma := sigma) m := by + classical + simp [degreeIndexList] + +/-- One step in a fixed-degree correction list, bundled with preservation of +the prescribed linear term. -/ +noncomputable def correctionStep + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + {L : sigma → F.valuationSubring} + {m : ℕ} (hm : 2 ≤ m) + (H : Approximation (F := F) L) + (d : {d : sigma →₀ ℕ // d.degree = m}) : + Approximation (F := F) L := by + have hd : 2 ≤ d.1.degree := by + simpa only [d.2] using hm + exact + ⟨correctedIntertwiner hpi e ebar H.2 d.1 hd, + correctedIntertwiner_hasLinearTerm hpi e ebar H.2 d.1 hd⟩ + +/-- Apply a list of fixed-degree monomial corrections from left to right. -/ +noncomputable def correctList + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + {L : sigma → F.valuationSubring} + {m : ℕ} (hm : 2 ≤ m) + (ds : List {d : sigma →₀ ℕ // d.degree = m}) + (H : Approximation (F := F) L) : + Approximation (F := F) L := + ds.foldl (correctionStep hpi e ebar hm) H + +private theorem coeff_correctionStep_eq_of_degree_lt + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + {L : sigma → F.valuationSubring} + {m : ℕ} (hm : 2 ≤ m) + (H : Approximation (F := F) L) + (d : {d : sigma →₀ ℕ // d.degree = m}) + (q : sigma →₀ ℕ) (hq : q.degree < m) : + MvPowerSeries.coeff q (correctionStep hpi e ebar hm H d).1 = + MvPowerSeries.coeff q H.1 := by + have hqd : q ≠ d.1 := by + intro h + have hdegree : q.degree = d.1.degree := + congrArg (fun x : sigma →₀ ℕ => x.degree) h + rw [d.2] at hdegree + omega + simp only [correctionStep, correctedIntertwiner, + monomialCorrection, map_add, + MvPowerSeries.coeff_monomial_ne hqd, add_zero] + +private theorem coeff_correctList_eq_of_degree_lt + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + {L : sigma → F.valuationSubring} + {m : ℕ} (hm : 2 ≤ m) + (ds : List {d : sigma →₀ ℕ // d.degree = m}) + (H : Approximation (F := F) L) + (q : sigma →₀ ℕ) (hq : q.degree < m) : + MvPowerSeries.coeff q (correctList hpi e ebar hm ds H).1 = + MvPowerSeries.coeff q H.1 := by + induction ds generalizing H with + | nil => rfl + | cons d ds ih => + calc + MvPowerSeries.coeff q + (correctList hpi e ebar hm (d :: ds) H).1 = + MvPowerSeries.coeff q + (correctList hpi e ebar hm ds + (correctionStep hpi e ebar hm H d)).1 := by + rfl + _ = MvPowerSeries.coeff q + (correctionStep hpi e ebar hm H d).1 := + ih (correctionStep hpi e ebar hm H d) + _ = MvPowerSeries.coeff q H.1 := + coeff_correctionStep_eq_of_degree_lt + hpi e ebar hm H d q hq + +private theorem coeff_defect_correctionStep_eq_of_ne + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + {L : sigma → F.valuationSubring} + {m : ℕ} (hm : 2 ≤ m) + (H : Approximation (F := F) L) + (q d : {d : sigma →₀ ℕ // d.degree = m}) + (hqd : q ≠ d) : + MvPowerSeries.coeff q.1 + (defect e ebar (correctionStep hpi e ebar hm H d).1) = + MvPowerSeries.coeff q.1 (defect e ebar H.1) := by + have hval : q.1 ≠ d.1 := by + intro h + exact hqd (Subtype.ext h) + change + MvPowerSeries.coeff q.1 + (defect e ebar + (H.1 + MvPowerSeries.monomial d.1 _)) = + MvPowerSeries.coeff q.1 (defect e ebar H.1) + rw [coeff_defect_add_monomial_eq_of_degree_le + e ebar H.2 q.1 d.1 (by omega) (by omega)] + simp [hval] + +private theorem coeff_defect_correctList_eq_of_not_mem + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + {L : sigma → F.valuationSubring} + {m : ℕ} (hm : 2 ≤ m) + (ds : List {d : sigma →₀ ℕ // d.degree = m}) + (H : Approximation (F := F) L) + (q : {d : sigma →₀ ℕ // d.degree = m}) + (hq : q ∉ ds) : + MvPowerSeries.coeff q.1 + (defect e ebar (correctList hpi e ebar hm ds H).1) = + MvPowerSeries.coeff q.1 (defect e ebar H.1) := by + induction ds generalizing H with + | nil => rfl + | cons d ds ih => + have hqd : q ≠ d := by + intro h + apply hq + simp [h] + have hqds : q ∉ ds := by + intro h + exact hq (List.mem_cons_of_mem d h) + calc + MvPowerSeries.coeff q.1 + (defect e ebar + (correctList hpi e ebar hm (d :: ds) H).1) = + MvPowerSeries.coeff q.1 + (defect e ebar + (correctList hpi e ebar hm ds + (correctionStep hpi e ebar hm H d)).1) := by + rfl + _ = MvPowerSeries.coeff q.1 + (defect e ebar + (correctionStep hpi e ebar hm H d).1) := + ih (correctionStep hpi e ebar hm H d) hqds + _ = MvPowerSeries.coeff q.1 (defect e ebar H.1) := + coeff_defect_correctionStep_eq_of_ne + hpi e ebar hm H q d hqd + +private theorem coeff_defect_correctList_eq_zero_of_mem + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + {L : sigma → F.valuationSubring} + {m : ℕ} (hm : 2 ≤ m) + (ds : List {d : sigma →₀ ℕ // d.degree = m}) + (H : Approximation (F := F) L) + (hds : ds.Nodup) + (q : {d : sigma →₀ ℕ // d.degree = m}) + (hq : q ∈ ds) : + MvPowerSeries.coeff q.1 + (defect e ebar (correctList hpi e ebar hm ds H).1) = 0 := by + induction ds generalizing H with + | nil => simp at hq + | cons d ds ih => + have hdnot : d ∉ ds := (List.nodup_cons.mp hds).1 + have hds' : ds.Nodup := (List.nodup_cons.mp hds).2 + by_cases hqd : q = d + · subst q + calc + MvPowerSeries.coeff d.1 + (defect e ebar + (correctList hpi e ebar hm (d :: ds) H).1) = + MvPowerSeries.coeff d.1 + (defect e ebar + (correctList hpi e ebar hm ds + (correctionStep hpi e ebar hm H d)).1) := by + rfl + _ = MvPowerSeries.coeff d.1 + (defect e ebar + (correctionStep hpi e ebar hm H d).1) := + coeff_defect_correctList_eq_of_not_mem + hpi e ebar hm ds + (correctionStep hpi e ebar hm H d) d hdnot + _ = 0 := by + change + MvPowerSeries.coeff d.1 + (defect e ebar + (correctedIntertwiner hpi e ebar H.2 d.1 _)) = 0 + exact + coeff_defect_correctedIntertwiner_eq_zero + hpi e ebar H.2 d.1 (by omega) + · have hqds : q ∈ ds := by + exact (List.mem_cons.mp hq).resolve_left hqd + change + MvPowerSeries.coeff q.1 + (defect e ebar + (correctList hpi e ebar hm ds + (correctionStep hpi e ebar hm H d)).1) = 0 + exact + ih (correctionStep hpi e ebar hm H d) hds' hqds + +/-- Correct every monomial in one fixed total degree. -/ +noncomputable def correctDegree + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + {L : sigma → F.valuationSubring} + (H : Approximation (F := F) L) + (m : ℕ) (hm : 2 ≤ m) : + Approximation (F := F) L := + correctList hpi e ebar hm (degreeIndexList (sigma := sigma) m) H + +private theorem coeff_correctDegree_eq_of_degree_lt + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + {L : sigma → F.valuationSubring} + (H : Approximation (F := F) L) + (m : ℕ) (hm : 2 ≤ m) + (q : sigma →₀ ℕ) (hq : q.degree < m) : + MvPowerSeries.coeff q (correctDegree hpi e ebar H m hm).1 = + MvPowerSeries.coeff q H.1 := + coeff_correctList_eq_of_degree_lt + hpi e ebar hm (degreeIndexList (sigma := sigma) m) H q hq + +private theorem coeff_defect_correctDegree_eq_zero + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + {L : sigma → F.valuationSubring} + (H : Approximation (F := F) L) + (m : ℕ) (hm : 2 ≤ m) + (q : sigma →₀ ℕ) (hq : q.degree = m) : + MvPowerSeries.coeff q + (defect e ebar (correctDegree hpi e ebar H m hm).1) = 0 := by + let q' : {d : sigma →₀ ℕ // d.degree = m} := ⟨q, hq⟩ + change + MvPowerSeries.coeff q'.1 + (defect e ebar + (correctList hpi e ebar hm + (degreeIndexList (sigma := sigma) m) H).1) = 0 + exact + coeff_defect_correctList_eq_zero_of_mem + hpi e ebar hm (degreeIndexList (sigma := sigma) m) H + (degreeIndexList_nodup (sigma := sigma) m) q' + (mem_degreeIndexList (sigma := sigma) m q') + +/-- The bundled finite-degree approximations. Stage zero is the prescribed +linear form, and stage `n + 1` corrects total degree `n + 2`. -/ +noncomputable def approximation + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + (L : sigma → F.valuationSubring) : + ℕ → Approximation (F := F) L + | 0 => ⟨linearForm L, linearForm_hasLinearTerm L⟩ + | n + 1 => + correctDegree hpi e ebar + (approximation hpi e ebar L n) (n + 2) (by omega) + +/-- The stage-`n` finite-degree approximation to the intertwiner with linear +term `L`. -/ +noncomputable def intertwinerApproximation + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + (L : sigma → F.valuationSubring) (n : ℕ) : + MvPowerSeries sigma F.valuationSubring := + (approximation hpi e ebar L n).1 + +/-- Every finite-degree approximation retains the prescribed linear term. -/ +theorem intertwinerApproximation_hasLinearTerm + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + (L : sigma → F.valuationSubring) (n : ℕ) : + HasLinearTerm (intertwinerApproximation hpi e ebar L n) L := + (approximation hpi e ebar L n).2 + +/-- Stage zero is exactly the prescribed linear form. -/ +@[simp] +theorem intertwinerApproximation_zero + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + (L : sigma → F.valuationSubring) : + intertwinerApproximation hpi e ebar L 0 = linearForm L := + rfl + +/-- Passing from stage `n` to stage `n + 1` leaves every coefficient below +total degree `n + 2` unchanged. -/ +theorem coeff_intertwinerApproximation_succ_eq_of_degree_lt + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + (L : sigma → F.valuationSubring) + (n : ℕ) (q : sigma →₀ ℕ) (hq : q.degree < n + 2) : + MvPowerSeries.coeff q + (intertwinerApproximation hpi e ebar L (n + 1)) = + MvPowerSeries.coeff q + (intertwinerApproximation hpi e ebar L n) := by + exact + coeff_correctDegree_eq_of_degree_lt + hpi e ebar (approximation hpi e ebar L n) + (n + 2) (by omega) q hq + +/-- Stage `n + 1` has zero defect in every coordinate of total degree +`n + 2`. -/ +theorem coeff_defect_intertwinerApproximation_succ_eq_zero + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + (L : sigma → F.valuationSubring) + (n : ℕ) (q : sigma →₀ ℕ) (hq : q.degree = n + 2) : + MvPowerSeries.coeff q + (defect e ebar + (intertwinerApproximation hpi e ebar L (n + 1))) = 0 := by + exact + coeff_defect_correctDegree_eq_zero + hpi e ebar (approximation hpi e ebar L n) + (n + 2) (by omega) q hq + +/-- Once a coefficient lies below the next correction degree, it remains +unchanged at every later finite stage. -/ +theorem coeff_intertwinerApproximation_eq_of_le + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + (L : sigma → F.valuationSubring) + (q : sigma →₀ ℕ) {m n : ℕ} (hmn : m ≤ n) + (hq : q.degree < m + 2) : + MvPowerSeries.coeff q + (intertwinerApproximation hpi e ebar L n) = + MvPowerSeries.coeff q + (intertwinerApproximation hpi e ebar L m) := by + induction n, hmn using Nat.le_induction with + | base => rfl + | succ n hmn ih => + rw [ + coeff_intertwinerApproximation_succ_eq_of_degree_lt + hpi e ebar L n q (by omega)] + exact ih + +/-- The full recursive series takes the coefficient of a monomial of degree +`m` from the first stage which has already corrected degree `m`. -/ +noncomputable def recursiveIntertwiner + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + (L : sigma → F.valuationSubring) : + MvPowerSeries sigma F.valuationSubring := + fun d => + MvPowerSeries.coeff d + (intertwinerApproximation hpi e ebar L (d.degree - 1)) + +/-- The defining stabilized-coefficient formula. -/ +@[simp] +theorem coeff_recursiveIntertwiner + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + (L : sigma → F.valuationSubring) (d : sigma →₀ ℕ) : + MvPowerSeries.coeff d (recursiveIntertwiner hpi e ebar L) = + MvPowerSeries.coeff d + (intertwinerApproximation hpi e ebar L (d.degree - 1)) := + rfl + +/-- Through degree `n + 1`, the stabilized series agrees with the stage-`n` +finite approximation. -/ +theorem coeff_recursiveIntertwiner_eq_intertwinerApproximation + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + (L : sigma → F.valuationSubring) + (n : ℕ) (d : sigma →₀ ℕ) (hd : d.degree ≤ n + 1) : + MvPowerSeries.coeff d (recursiveIntertwiner hpi e ebar L) = + MvPowerSeries.coeff d + (intertwinerApproximation hpi e ebar L n) := by + rw [coeff_recursiveIntertwiner] + symm + exact + coeff_intertwinerApproximation_eq_of_le + hpi e ebar L d (by omega) (by omega) + +/-- The stabilized recursive series retains the prescribed linear term. -/ +theorem recursiveIntertwiner_hasLinearTerm + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + (L : sigma → F.valuationSubring) : + HasLinearTerm (recursiveIntertwiner hpi e ebar L) L := by + rw [HasLinearTerm] + apply MvPowerSeries.nat_le_order + intro d hd + have hdNat : d.degree < 2 := by + exact_mod_cast hd + rw [map_sub, + coeff_recursiveIntertwiner_eq_intertwinerApproximation + hpi e ebar L 0 d (by omega), + intertwinerApproximation_zero, + sub_self] + +/-- Every coefficient of the defect of the stabilized recursive series +vanishes. -/ +theorem coeff_defect_recursiveIntertwiner_eq_zero + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + (L : sigma → F.valuationSubring) + (d : sigma →₀ ℕ) : + MvPowerSeries.coeff d + (defect e ebar (recursiveIntertwiner hpi e ebar L)) = 0 := by + by_cases hd : d.degree < 2 + · have hlt : + (d.degree : ℕ∞) < + (defect e ebar (recursiveIntertwiner hpi e ebar L)).order := by + have hd' : (d.degree : ℕ∞) < (2 : ℕ∞) := by + exact_mod_cast hd + exact + hd'.trans_le + (two_le_order_defect e ebar + (recursiveIntertwiner_hasLinearTerm hpi e ebar L)) + exact MvPowerSeries.coeff_of_lt_order hlt + · let n := d.degree - 2 + have hdegree : d.degree = n + 2 := by + dsimp only [n] + omega + have hcoeff : + ∀ q : sigma →₀ ℕ, q.degree ≤ d.degree → + MvPowerSeries.coeff q + (recursiveIntertwiner hpi e ebar L) = + MvPowerSeries.coeff q + (intertwinerApproximation hpi e ebar L (n + 1)) := by + intro q hq + apply + coeff_recursiveIntertwiner_eq_intertwinerApproximation + hpi e ebar L (n + 1) q + omega + have hstable := + coeff_defect_eq_of_coeff_eq_degree_le + e ebar + (recursiveIntertwiner_hasLinearTerm + hpi e ebar L).constantCoeff_eq_zero + (intertwinerApproximation_hasLinearTerm + hpi e ebar L (n + 1)).constantCoeff_eq_zero + (m := d.degree) hcoeff (d := d) (by rfl) + rw [hstable] + exact + coeff_defect_intertwinerApproximation_succ_eq_zero + hpi e ebar L n d hdegree + +/-- The stabilized recursive series solves the same-uniformizer +Lubin--Tate intertwining equation. -/ +theorem recursiveIntertwiner_intertwines + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + (L : sigma → F.valuationSubring) : + Intertwines e ebar (recursiveIntertwiner hpi e ebar L) := by + rw [intertwines_iff_defect_eq_zero] + apply MvPowerSeries.ext + intro d + exact coeff_defect_recursiveIntertwiner_eq_zero hpi e ebar L d + +private theorem hasLinearTerm_add_monomial + {H : MvPowerSeries sigma F.valuationSubring} + {L : sigma → F.valuationSubring} + (hH : HasLinearTerm H L) + (d : sigma →₀ ℕ) (hd : 2 ≤ d.degree) + (c : F.valuationSubring) : + HasLinearTerm (H + MvPowerSeries.monomial d c) L := by + rw [HasLinearTerm] + have hmonomial : + (2 : ℕ∞) ≤ (MvPowerSeries.monomial d c).order := by + apply MvPowerSeries.nat_le_order + intro q hq + have hqNat : q.degree < 2 := by + exact_mod_cast hq + have hqd : q ≠ d := by + intro h + have hdegree := + congrArg (fun x : sigma →₀ ℕ => x.degree) h + omega + rw [MvPowerSeries.coeff_monomial_ne hqd] + rw [show + H + MvPowerSeries.monomial d c - linearForm L = + (H - linearForm L) + MvPowerSeries.monomial d c by ring] + exact + (le_min hH hmonomial).trans + MvPowerSeries.min_order_le_add + +/-- Replace one coefficient in a fixed total degree by the corresponding +coefficient of a target series. -/ +private noncomputable def replacementStep + {L : sigma → F.valuationSubring} + {m : ℕ} (hm : 2 ≤ m) + (target : MvPowerSeries sigma F.valuationSubring) + (H : Approximation (F := F) L) + (d : {d : sigma →₀ ℕ // d.degree = m}) : + Approximation (F := F) L := + ⟨H.1 + MvPowerSeries.monomial d.1 + (MvPowerSeries.coeff d.1 target - + MvPowerSeries.coeff d.1 H.1), + hasLinearTerm_add_monomial H.2 d.1 (by omega) + (MvPowerSeries.coeff d.1 target - + MvPowerSeries.coeff d.1 H.1)⟩ + +/-- Replace the coefficients indexed by a list in a fixed total degree. -/ +private noncomputable def replaceList + {L : sigma → F.valuationSubring} + {m : ℕ} (hm : 2 ≤ m) + (target : MvPowerSeries sigma F.valuationSubring) + (ds : List {d : sigma →₀ ℕ // d.degree = m}) + (H : Approximation (F := F) L) : + Approximation (F := F) L := + ds.foldl (replacementStep hm target) H + +private theorem coeff_replacementStep_self + {L : sigma → F.valuationSubring} + {m : ℕ} (hm : 2 ≤ m) + (target : MvPowerSeries sigma F.valuationSubring) + (H : Approximation (F := F) L) + (d : {d : sigma →₀ ℕ // d.degree = m}) : + MvPowerSeries.coeff d.1 (replacementStep hm target H d).1 = + MvPowerSeries.coeff d.1 target := by + simp [replacementStep, MvPowerSeries.coeff_monomial_same] + +private theorem coeff_replacementStep_eq_of_ne + {L : sigma → F.valuationSubring} + {m : ℕ} (hm : 2 ≤ m) + (target : MvPowerSeries sigma F.valuationSubring) + (H : Approximation (F := F) L) + (q d : {d : sigma →₀ ℕ // d.degree = m}) + (hqd : q ≠ d) : + MvPowerSeries.coeff q.1 (replacementStep hm target H d).1 = + MvPowerSeries.coeff q.1 H.1 := by + have hval : q.1 ≠ d.1 := by + intro h + exact hqd (Subtype.ext h) + simp [replacementStep, MvPowerSeries.coeff_monomial_ne hval] + +private theorem coeff_replaceList_eq_of_degree_lt + {L : sigma → F.valuationSubring} + {m : ℕ} (hm : 2 ≤ m) + (target : MvPowerSeries sigma F.valuationSubring) + (ds : List {d : sigma →₀ ℕ // d.degree = m}) + (H : Approximation (F := F) L) + (q : sigma →₀ ℕ) (hq : q.degree < m) : + MvPowerSeries.coeff q (replaceList hm target ds H).1 = + MvPowerSeries.coeff q H.1 := by + induction ds generalizing H with + | nil => rfl + | cons d ds ih => + have hqd : q ≠ d.1 := by + intro h + have hdegree := + congrArg (fun x : sigma →₀ ℕ => x.degree) h + omega + calc + MvPowerSeries.coeff q + (replaceList hm target (d :: ds) H).1 = + MvPowerSeries.coeff q + (replaceList hm target ds + (replacementStep hm target H d)).1 := by + rfl + _ = MvPowerSeries.coeff q + (replacementStep hm target H d).1 := + ih (replacementStep hm target H d) + _ = MvPowerSeries.coeff q H.1 := by + simp [replacementStep, + MvPowerSeries.coeff_monomial_ne hqd] + +private theorem coeff_replaceList_eq_of_not_mem + {L : sigma → F.valuationSubring} + {m : ℕ} (hm : 2 ≤ m) + (target : MvPowerSeries sigma F.valuationSubring) + (ds : List {d : sigma →₀ ℕ // d.degree = m}) + (H : Approximation (F := F) L) + (q : {d : sigma →₀ ℕ // d.degree = m}) + (hq : q ∉ ds) : + MvPowerSeries.coeff q.1 (replaceList hm target ds H).1 = + MvPowerSeries.coeff q.1 H.1 := by + induction ds generalizing H with + | nil => rfl + | cons d ds ih => + have hqd : q ≠ d := by + intro h + apply hq + simp [h] + have hqds : q ∉ ds := by + intro h + exact hq (List.mem_cons_of_mem d h) + calc + MvPowerSeries.coeff q.1 + (replaceList hm target (d :: ds) H).1 = + MvPowerSeries.coeff q.1 + (replaceList hm target ds + (replacementStep hm target H d)).1 := by + rfl + _ = MvPowerSeries.coeff q.1 + (replacementStep hm target H d).1 := + ih (replacementStep hm target H d) hqds + _ = MvPowerSeries.coeff q.1 H.1 := + coeff_replacementStep_eq_of_ne + hm target H q d hqd + +private theorem coeff_replaceList_eq_target_of_mem + {L : sigma → F.valuationSubring} + {m : ℕ} (hm : 2 ≤ m) + (target : MvPowerSeries sigma F.valuationSubring) + (ds : List {d : sigma →₀ ℕ // d.degree = m}) + (H : Approximation (F := F) L) + (hds : ds.Nodup) + (q : {d : sigma →₀ ℕ // d.degree = m}) + (hq : q ∈ ds) : + MvPowerSeries.coeff q.1 (replaceList hm target ds H).1 = + MvPowerSeries.coeff q.1 target := by + induction ds generalizing H with + | nil => simp at hq + | cons d ds ih => + have hdnot : d ∉ ds := (List.nodup_cons.mp hds).1 + have hds' : ds.Nodup := (List.nodup_cons.mp hds).2 + by_cases hqd : q = d + · subst q + calc + MvPowerSeries.coeff d.1 + (replaceList hm target (d :: ds) H).1 = + MvPowerSeries.coeff d.1 + (replaceList hm target ds + (replacementStep hm target H d)).1 := by + rfl + _ = MvPowerSeries.coeff d.1 + (replacementStep hm target H d).1 := + coeff_replaceList_eq_of_not_mem + hm target ds (replacementStep hm target H d) d hdnot + _ = MvPowerSeries.coeff d.1 target := + coeff_replacementStep_self hm target H d + · have hqds : q ∈ ds := + (List.mem_cons.mp hq).resolve_left hqd + change + MvPowerSeries.coeff q.1 + (replaceList hm target ds + (replacementStep hm target H d)).1 = + MvPowerSeries.coeff q.1 target + exact + ih (replacementStep hm target H d) hds' hqds + +private theorem coeff_defect_replacementStep_eq_of_ne + (e ebar : LubinTateSeries F pi) + {L : sigma → F.valuationSubring} + {m : ℕ} (hm : 2 ≤ m) + (target : MvPowerSeries sigma F.valuationSubring) + (H : Approximation (F := F) L) + (q d : {d : sigma →₀ ℕ // d.degree = m}) + (hqd : q ≠ d) : + MvPowerSeries.coeff q.1 + (defect e ebar (replacementStep hm target H d).1) = + MvPowerSeries.coeff q.1 (defect e ebar H.1) := by + have hval : q.1 ≠ d.1 := by + intro h + exact hqd (Subtype.ext h) + change + MvPowerSeries.coeff q.1 + (defect e ebar + (H.1 + MvPowerSeries.monomial d.1 _)) = + MvPowerSeries.coeff q.1 (defect e ebar H.1) + rw [coeff_defect_add_monomial_eq_of_degree_le + e ebar H.2 q.1 d.1 (by omega) (by omega)] + simp [hval] + +private theorem coeff_defect_replaceList_eq_of_not_mem + (e ebar : LubinTateSeries F pi) + {L : sigma → F.valuationSubring} + {m : ℕ} (hm : 2 ≤ m) + (target : MvPowerSeries sigma F.valuationSubring) + (ds : List {d : sigma →₀ ℕ // d.degree = m}) + (H : Approximation (F := F) L) + (q : {d : sigma →₀ ℕ // d.degree = m}) + (hq : q ∉ ds) : + MvPowerSeries.coeff q.1 + (defect e ebar (replaceList hm target ds H).1) = + MvPowerSeries.coeff q.1 (defect e ebar H.1) := by + induction ds generalizing H with + | nil => rfl + | cons d ds ih => + have hqd : q ≠ d := by + intro h + apply hq + simp [h] + have hqds : q ∉ ds := by + intro h + exact hq (List.mem_cons_of_mem d h) + calc + MvPowerSeries.coeff q.1 + (defect e ebar + (replaceList hm target (d :: ds) H).1) = + MvPowerSeries.coeff q.1 + (defect e ebar + (replaceList hm target ds + (replacementStep hm target H d)).1) := by + rfl + _ = MvPowerSeries.coeff q.1 + (defect e ebar + (replacementStep hm target H d).1) := + ih (replacementStep hm target H d) hqds + _ = MvPowerSeries.coeff q.1 + (defect e ebar H.1) := + coeff_defect_replacementStep_eq_of_ne + e ebar hm target H q d hqd + +private theorem coeff_defect_replaceList_of_mem + (e ebar : LubinTateSeries F pi) + {L : sigma → F.valuationSubring} + {m : ℕ} (hm : 2 ≤ m) + (target : MvPowerSeries sigma F.valuationSubring) + (ds : List {d : sigma →₀ ℕ // d.degree = m}) + (H : Approximation (F := F) L) + (hds : ds.Nodup) + (q : {d : sigma →₀ ℕ // d.degree = m}) + (hq : q ∈ ds) : + MvPowerSeries.coeff q.1 + (defect e ebar (replaceList hm target ds H).1) = + MvPowerSeries.coeff q.1 (defect e ebar H.1) + + pi * ((1 - pi ^ (m - 1)) * + (MvPowerSeries.coeff q.1 target - + MvPowerSeries.coeff q.1 H.1)) := by + induction ds generalizing H with + | nil => simp at hq + | cons d ds ih => + have hdnot : d ∉ ds := (List.nodup_cons.mp hds).1 + have hds' : ds.Nodup := (List.nodup_cons.mp hds).2 + by_cases hqd : q = d + · subst q + have htail : + MvPowerSeries.coeff d.1 + (defect e ebar + (replaceList hm target ds + (replacementStep hm target H d)).1) = + MvPowerSeries.coeff d.1 + (defect e ebar + (replacementStep hm target H d).1) := by + exact + coeff_defect_replaceList_eq_of_not_mem + e ebar hm target ds + (replacementStep hm target H d) d hdnot + calc + MvPowerSeries.coeff d.1 + (defect e ebar + (replaceList hm target (d :: ds) H).1) = + MvPowerSeries.coeff d.1 + (defect e ebar + (replacementStep hm target H d).1) := by + rw [show + replaceList hm target (d :: ds) H = + replaceList hm target ds + (replacementStep hm target H d) by rfl] + exact htail + _ = MvPowerSeries.coeff d.1 (defect e ebar H.1) + + pi * ((1 - pi ^ (m - 1)) * + (MvPowerSeries.coeff d.1 target - + MvPowerSeries.coeff d.1 H.1)) := by + change + MvPowerSeries.coeff d.1 + (defect e ebar + (H.1 + MvPowerSeries.monomial d.1 _)) = + _ + rw [coeff_defect_add_monomial_eq_of_degree_le + e ebar H.2 d.1 d.1 (by rfl) (by omega)] + simp [d.2] + · have hqds : q ∈ ds := + (List.mem_cons.mp hq).resolve_left hqd + calc + MvPowerSeries.coeff q.1 + (defect e ebar + (replaceList hm target (d :: ds) H).1) = + MvPowerSeries.coeff q.1 + (defect e ebar + (replaceList hm target ds + (replacementStep hm target H d)).1) := by + rfl + _ = MvPowerSeries.coeff q.1 + (defect e ebar + (replacementStep hm target H d).1) + + pi * ((1 - pi ^ (m - 1)) * + (MvPowerSeries.coeff q.1 target - + MvPowerSeries.coeff q.1 + (replacementStep hm target H d).1)) := + ih (replacementStep hm target H d) hds' hqds + _ = MvPowerSeries.coeff q.1 (defect e ebar H.1) + + pi * ((1 - pi ^ (m - 1)) * + (MvPowerSeries.coeff q.1 target - + MvPowerSeries.coeff q.1 H.1)) := by + rw [ + coeff_defect_replacementStep_eq_of_ne + e ebar hm target H q d hqd, + coeff_replacementStep_eq_of_ne + hm target H q d hqd] + +/-- Replace every coefficient of one total degree by the corresponding +coefficient of a target series. -/ +private noncomputable def replaceDegree + {L : sigma → F.valuationSubring} + (target : MvPowerSeries sigma F.valuationSubring) + (H : Approximation (F := F) L) + (m : ℕ) (hm : 2 ≤ m) : + Approximation (F := F) L := + replaceList hm target (degreeIndexList (sigma := sigma) m) H + +private theorem coeff_replaceDegree_eq_target_of_degree_le + {L : sigma → F.valuationSubring} + (target : MvPowerSeries sigma F.valuationSubring) + (H : Approximation (F := F) L) + (m : ℕ) (hm : 2 ≤ m) + (hlower : ∀ q : sigma →₀ ℕ, q.degree < m → + MvPowerSeries.coeff q H.1 = + MvPowerSeries.coeff q target) + (q : sigma →₀ ℕ) (hq : q.degree ≤ m) : + MvPowerSeries.coeff q (replaceDegree target H m hm).1 = + MvPowerSeries.coeff q target := by + by_cases hlt : q.degree < m + · calc + MvPowerSeries.coeff q (replaceDegree target H m hm).1 = + MvPowerSeries.coeff q H.1 := + coeff_replaceList_eq_of_degree_lt + hm target (degreeIndexList (sigma := sigma) m) H q hlt + _ = MvPowerSeries.coeff q target := hlower q hlt + · have heq : q.degree = m := by omega + let q' : {d : sigma →₀ ℕ // d.degree = m} := ⟨q, heq⟩ + exact + coeff_replaceList_eq_target_of_mem + hm target (degreeIndexList (sigma := sigma) m) H + (degreeIndexList_nodup m) q' + (mem_degreeIndexList m q') + +private theorem coeff_defect_replaceDegree + (e ebar : LubinTateSeries F pi) + {L : sigma → F.valuationSubring} + (target : MvPowerSeries sigma F.valuationSubring) + (H : Approximation (F := F) L) + (m : ℕ) (hm : 2 ≤ m) + (q : sigma →₀ ℕ) (hq : q.degree = m) : + MvPowerSeries.coeff q + (defect e ebar (replaceDegree target H m hm).1) = + MvPowerSeries.coeff q (defect e ebar H.1) + + pi * ((1 - pi ^ (m - 1)) * + (MvPowerSeries.coeff q target - + MvPowerSeries.coeff q H.1)) := by + let q' : {d : sigma →₀ ℕ // d.degree = m} := ⟨q, hq⟩ + exact + coeff_defect_replaceList_of_mem + e ebar hm target (degreeIndexList (sigma := sigma) m) H + (degreeIndexList_nodup m) q' + (mem_degreeIndexList m q') + +private theorem coeff_eq_linearForm_of_hasLinearTerm + {H : MvPowerSeries sigma F.valuationSubring} + {L : sigma → F.valuationSubring} + (hH : HasLinearTerm H L) + (d : sigma →₀ ℕ) (hd : d.degree < 2) : + MvPowerSeries.coeff d H = + MvPowerSeries.coeff d (linearForm L) := by + have hd' : (d.degree : ℕ∞) < (2 : ℕ∞) := by + exact_mod_cast hd + have hzero := + MvPowerSeries.coeff_of_lt_order (hd'.trans_le hH) + rw [map_sub, sub_eq_zero] at hzero + exact hzero + +/-- Any intertwiner with a prescribed linear term is the recursively +constructed intertwiner. -/ +theorem eq_recursiveIntertwiner_of_hasLinearTerm_of_intertwines + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + (L : sigma → F.valuationSubring) + {H : MvPowerSeries sigma F.valuationSubring} + (hH : HasLinearTerm H L) + (hI : Intertwines e ebar H) : + H = recursiveIntertwiner hpi e ebar L := by + let R := recursiveIntertwiner hpi e ebar L + have hRlin : HasLinearTerm R L := + recursiveIntertwiner_hasLinearTerm hpi e ebar L + have hHdef : defect e ebar H = 0 := + (intertwines_iff_defect_eq_zero e ebar H).mp hI + have hRdef : defect e ebar R = 0 := + (intertwines_iff_defect_eq_zero e ebar R).mp + (recursiveIntertwiner_intertwines hpi e ebar L) + apply MvPowerSeries.ext + intro d + have hall : + ∀ m : ℕ, ∀ q : sigma →₀ ℕ, q.degree = m → + MvPowerSeries.coeff q H = + MvPowerSeries.coeff q R := by + intro m + induction m using Nat.strongRecOn with + | ind m ih => + intro q hq + by_cases hm : m < 2 + · have hq2 : q.degree < 2 := by omega + calc + MvPowerSeries.coeff q H = + MvPowerSeries.coeff q (linearForm L) := + coeff_eq_linearForm_of_hasLinearTerm hH q hq2 + _ = MvPowerSeries.coeff q R := + (coeff_eq_linearForm_of_hasLinearTerm + hRlin q hq2).symm + · have hm2 : 2 ≤ m := by omega + let HA : Approximation (F := F) L := ⟨H, hH⟩ + let J := replaceDegree R HA m hm2 + have hlower : + ∀ r : sigma →₀ ℕ, r.degree < m → + MvPowerSeries.coeff r H = + MvPowerSeries.coeff r R := by + intro r hr + exact ih r.degree hr r rfl + have hthrough : + ∀ r : sigma →₀ ℕ, r.degree ≤ m → + MvPowerSeries.coeff r J.1 = + MvPowerSeries.coeff r R := by + intro r hr + exact + coeff_replaceDegree_eq_target_of_degree_le + R HA m hm2 hlower r hr + have hdefeq : + MvPowerSeries.coeff q (defect e ebar J.1) = + MvPowerSeries.coeff q (defect e ebar R) := + coeff_defect_eq_of_coeff_eq_degree_le + e ebar J.2.constantCoeff_eq_zero + hRlin.constantCoeff_eq_zero + (m := m) hthrough (d := q) (by omega) + have hJzero : + MvPowerSeries.coeff q (defect e ebar J.1) = 0 := by + rw [hdefeq, hRdef, MvPowerSeries.coeff_zero] + have hformula := + coeff_defect_replaceDegree + e ebar R HA m hm2 q hq + have hproduct : + pi * ((1 - pi ^ (m - 1)) * + (MvPowerSeries.coeff q R - + MvPowerSeries.coeff q H)) = 0 := by + rw [show J = replaceDegree R HA m hm2 by rfl] at hJzero + rw [hJzero, hHdef, MvPowerSeries.coeff_zero, + zero_add] at hformula + exact hformula.symm + have hpine : pi ≠ (0 : F.valuationSubring) := by + intro hp + apply hpi.ne_zero + simpa using congrArg + (fun x : F.valuationSubring => (x : K)) hp + have hunit : + IsUnit (1 - pi ^ (m - 1)) := + isUnit_one_sub_uniformizer_pow hpi (by omega) + have hrest : + (1 - pi ^ (m - 1)) * + (MvPowerSeries.coeff q R - + MvPowerSeries.coeff q H) = 0 := + (mul_eq_zero.mp hproduct).resolve_left hpine + have hdiff : + MvPowerSeries.coeff q R - + MvPowerSeries.coeff q H = 0 := + (mul_eq_zero.mp hrest).resolve_left hunit.ne_zero + exact (sub_eq_zero.mp hdiff).symm + exact hall d.degree d rfl + +/-- Two same-uniformizer intertwiners with the same prescribed linear term +are equal. -/ +theorem eq_of_hasLinearTerm_of_intertwines + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + (L : sigma → F.valuationSubring) + {H H' : MvPowerSeries sigma F.valuationSubring} + (hH : HasLinearTerm H L) (hI : Intertwines e ebar H) + (hH' : HasLinearTerm H' L) (hI' : Intertwines e ebar H') : + H = H' := + (eq_recursiveIntertwiner_of_hasLinearTerm_of_intertwines + hpi e ebar L hH hI).trans + (eq_recursiveIntertwiner_of_hasLinearTerm_of_intertwines + hpi e ebar L hH' hI').symm + +/-- There is a unique same-uniformizer intertwiner with any prescribed +linear term. -/ +theorem existsUnique_intertwiner + (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) + (e ebar : LubinTateSeries F pi) + (L : sigma → F.valuationSubring) : + ∃! H : MvPowerSeries sigma F.valuationSubring, + HasLinearTerm H L ∧ Intertwines e ebar H := by + refine + ⟨recursiveIntertwiner hpi e ebar L, + ⟨recursiveIntertwiner_hasLinearTerm hpi e ebar L, + recursiveIntertwiner_intertwines hpi e ebar L⟩, ?_⟩ + intro H hH + exact + eq_recursiveIntertwiner_of_hasLinearTerm_of_intertwines + hpi e ebar L hH.1 hH.2 + +end SameUniformizer +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Reduction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Reduction.lean new file mode 100644 index 0000000000..b668655962 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Reduction.lean @@ -0,0 +1,142 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.CoefficientEquation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Intertwiner +public import Mathlib.FieldTheory.Finite.Basic +public import Mathlib.RingTheory.MvPowerSeries.Expand +/-! +# Reduction of a Lubin--Tate intertwining defect + +After reduction to the finite residue field, both series become the Frobenius +power series. The two sides of the intertwining equation then agree, so every +coefficient of the defect is divisible by the chosen uniformizer. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w + +namespace LubinTate +namespace SameUniformizer + +open LocalFieldTheory.DiscreteValuationField + +/-- Multivariable finite-field Frobenius: replacing each variable by its +`q`th power is the same as taking the `q`th power of the whole series. -/ +theorem mvPowerSeries_expand_natCard + {k : Type u} [Field k] [Finite k] + {σ : Type w} (f : MvPowerSeries σ k) : + MvPowerSeries.expand (Nat.card k) (Nat.ne_of_gt Nat.card_pos) f = + f ^ Nat.card k := by + let : Fintype k := Fintype.ofFinite k + obtain ⟨p, hp⟩ := CharP.exists k + rcases FiniteField.card k p with ⟨⟨n, npos⟩, ⟨hpprime, hn⟩⟩ + let : Fact p.Prime := ⟨hpprime⟩ + have hncard : Fintype.card k = p ^ n := by + simpa using hn + have hn' : Nat.card k = p ^ n := by + simpa only [Nat.card_eq_fintype_card] using hncard + have hpow : + MvPowerSeries.expand (p ^ n) (pow_ne_zero n hpprime.ne_zero) f = + f ^ (p ^ n) := by + rw [← MvPowerSeries.map_iterateFrobenius_expand, + iterateFrobenius_eq_pow, FiniteField.frobenius_pow hncard, + RingHom.one_def, MvPowerSeries.map_id] + · rfl + · exact hpprime.ne_zero + simpa only [hn'] using hpow + +variable {K : Type u} [Field K] +variable {F : LocalField.{u, v} K} {π : F.valuationSubring} +variable {σ : Type w} [Fintype σ] + +omit [Fintype σ] in +/-- Reduction of `e(X_i)` is `X_i ^ q`. -/ +theorem map_inVariable (e : LubinTateSeries F π) (i : σ) : + MvPowerSeries.map F.residueMap (inVariable e i) = + (MvPowerSeries.X i : MvPowerSeries σ F.residueField) ^ + Nat.card F.residueField := by + have hX : PowerSeries.HasSubst + (MvPowerSeries.X i : MvPowerSeries σ F.valuationSubring) := + PowerSeries.HasSubst.X i + have hXbar : PowerSeries.HasSubst + (MvPowerSeries.X i : MvPowerSeries σ F.residueField) := + PowerSeries.HasSubst.X i + rw [inVariable, PowerSeries.map_subst hX e.toPowerSeries, + e.map_residue_eq_frobenius, MvPowerSeries.map_X, + PowerSeries.subst_pow hXbar, PowerSeries.subst_X hXbar] + +/-- The reduced left side `e(H)` is `Hbar ^ q`. -/ +theorem map_subst_lubinTateSeries + (e : LubinTateSeries F π) + {H : MvPowerSeries σ F.valuationSubring} + {L : σ → F.valuationSubring} (hH : HasLinearTerm H L) : + MvPowerSeries.map F.residueMap + (PowerSeries.subst H e.toPowerSeries) = + (MvPowerSeries.map F.residueMap H) ^ + Nat.card F.residueField := by + have hmap : PowerSeries.HasSubst + (MvPowerSeries.map F.residueMap H) := + PowerSeries.HasSubst.of_constantCoeff_zero (by + simp [hH.constantCoeff_eq_zero]) + rw [PowerSeries.map_subst hH.hasSubst e.toPowerSeries, + e.map_residue_eq_frobenius, PowerSeries.subst_pow hmap, + PowerSeries.subst_X hmap] + +omit [Fintype σ] in +/-- The reduced right side `H(ebar(X_i))` is the expansion +`Hbar(X_i ^ q)`. -/ +theorem map_subst_inVariables [Finite σ] + (ebar : LubinTateSeries F π) + (H : MvPowerSeries σ F.valuationSubring) : + MvPowerSeries.map F.residueMap + (MvPowerSeries.subst + (fun i : σ ↦ inVariable ebar i) H) = + MvPowerSeries.expand (Nat.card F.residueField) + (Nat.ne_of_gt Nat.card_pos) + (MvPowerSeries.map F.residueMap H) := by + classical + let := Fintype.ofFinite σ + rw [MvPowerSeries.map_subst (inVariable_hasSubst ebar) H] + simp_rw [map_inVariable] + rw [MvPowerSeries.expand, MvPowerSeries.substAlgHom_apply] + +/-- The same-uniformizer intertwining defect vanishes after reduction. -/ +theorem map_defect_eq_zero + (e ebar : LubinTateSeries F π) + {H : MvPowerSeries σ F.valuationSubring} + {L : σ → F.valuationSubring} (hH : HasLinearTerm H L) : + MvPowerSeries.map F.residueMap (defect e ebar H) = 0 := by + rw [defect, map_sub, map_subst_lubinTateSeries e hH, + map_subst_inVariables ebar H, + mvPowerSeries_expand_natCard] + exact sub_self _ + +/-- Every coefficient of the defect is divisible by the chosen +uniformizer. -/ +theorem uniformizer_dvd_coeff_defect + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (e ebar : LubinTateSeries F π) + {H : MvPowerSeries σ F.valuationSubring} + {L : σ → F.valuationSubring} (hH : HasLinearTerm H L) + (d : σ →₀ ℕ) : + π ∣ MvPowerSeries.coeff d (defect e ebar H) := by + apply uniformizer_dvd_of_residueMap_eq_zero hπ + have hcoeff := congrArg (MvPowerSeries.coeff d) + (map_defect_eq_zero e ebar hH) + simpa using hcoeff + +end SameUniformizer +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Series.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Series.lean new file mode 100644 index 0000000000..f217727d30 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Series.lean @@ -0,0 +1,76 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic +public import Mathlib.RingTheory.PowerSeries.Basic +/-! +# Lubin--Tate power series + +A Lubin--Tate power series over a chosen valuation ring has zero constant +coefficient, prescribed linear coefficient, and reduces to the residue-field +Frobenius power series. The chosen element is not required to be a uniformizer +in the structure itself, so the coefficient package can be reused independently. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- A Lubin--Tate series with prescribed linear coefficient π. + +The first two fields specify the constant and linear terms. The final field +specifies coefficientwise reduction to the residue-field Frobenius series. -/ +structure LubinTateSeries + (F : LocalField.{u, v} K) (π : F.valuationSubring) where + /-- The underlying one-variable formal power series over `O_K`. -/ + toPowerSeries : PowerSeries F.valuationSubring + /-- The constant coefficient of a Lubin--Tate series vanishes. -/ + constantCoeff_eq_zero : + PowerSeries.constantCoeff toPowerSeries = 0 + /-- The linear coefficient is the chosen element `π`. -/ + coeff_one_eq_uniformizer : + PowerSeries.coeff 1 toPowerSeries = π + /-- Reduction to the residue field is the `q`-power Frobenius series. -/ + map_residue_eq_frobenius : + PowerSeries.map F.residueMap toPowerSeries = + (PowerSeries.X : PowerSeries F.residueField) ^ + Nat.card F.residueField + +attribute [simp] LubinTateSeries.constantCoeff_eq_zero + LubinTateSeries.coeff_one_eq_uniformizer + LubinTateSeries.map_residue_eq_frobenius + +namespace LubinTateSeries + +variable {F : LocalField.{u, v} K} {π : F.valuationSubring} + +/-- Two Lubin--Tate series are equal when their underlying power series +are equal. -/ +@[ext] +theorem ext {e e' : LubinTateSeries F π} + (h : e.toPowerSeries = e'.toPowerSeries) : e = e' := by + cases e + cases e' + cases h + rfl + +end LubinTateSeries + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardFormalGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardFormalGroup.lean new file mode 100644 index 0000000000..ca125b238f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardFormalGroup.lean @@ -0,0 +1,1001 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveIntertwiner +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardSeries +public import Mathlib.RingTheory.FormalGroup.Basic +/-! +# The standard Lubin--Tate formal group + +The recursive same-uniformizer intertwiner applied to the standard +Lubin--Tate series produces the formal group law and all of its scalar +endomorphisms. The structural identities are proved from the uniqueness of +an intertwiner with prescribed linear term. + +This file also records the substitution closure properties of +`SameUniformizer.Intertwines`. They are useful independently of the +standard series: intertwiners remain intertwiners after a change of +variables, after substituting an intertwining family, and after +one-variable power-series composition. +-/ + +@[expose] public section + +noncomputable +section + +open scoped BigOperators +attribute [local instance] Classical.propDecidable + +universe u v w w' + +namespace LubinTate +namespace SameUniformizer + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] +variable {F : LocalField.{u, v} K} {π : F.valuationSubring} + +section LinearTerms + +variable {R : Type*} [CommRing R] +variable {σ : Type w} [Fintype σ] +variable {τ : Type w'} [Fintype τ] + +namespace HasLinearTerm + +/-- In total degree less than two, a series with prescribed linear term +agrees coefficientwise with that linear form. -/ +theorem coeff_eq_linearForm + {H : MvPowerSeries σ R} {L : σ → R} + (hH : HasLinearTerm H L) + (d : σ →₀ ℕ) (hd : d.degree < 2) : + MvPowerSeries.coeff d H = + MvPowerSeries.coeff d (linearForm L) := by + have hd' : (d.degree : ℕ∞) < (2 : ℕ∞) := by + exact_mod_cast hd + have hzero := + MvPowerSeries.coeff_of_lt_order (hd'.trans_le hH) + rw [map_sub, sub_eq_zero] at hzero + exact hzero + +/-- The coefficient of `X_i` is the prescribed coefficient `L_i`. -/ +theorem coeff_single + {H : MvPowerSeries σ R} {L : σ → R} + (hH : HasLinearTerm H L) (i : σ) : + MvPowerSeries.coeff (Finsupp.single i 1) H = L i := by + rw [hH.coeff_eq_linearForm (Finsupp.single i 1) (by simp)] + classical + simp [linearForm, MvPowerSeries.coeff_index_single_X] + +private theorem linearForm_weighted_sum + (L : σ → R) (M : σ → τ → R) : + (∑ i, MvPowerSeries.C (L i) * linearForm (M i)) = + linearForm (fun j => ∑ i, L i * M i j) := by + classical + apply MvPowerSeries.ext + intro d + simp only [linearForm, map_sum, MvPowerSeries.coeff_C_mul, + Finset.mul_sum, Finset.sum_mul] + rw [Finset.sum_comm] + simp only [mul_assoc] + +/-- Substituting series with prescribed linear terms composes their linear +coefficient matrices. -/ +theorem subst + {H : MvPowerSeries σ R} {L : σ → R} + (hH : HasLinearTerm H L) + {G : σ → MvPowerSeries τ R} {M : σ → τ → R} + (hG : ∀ i, HasLinearTerm (G i) (M i)) : + HasLinearTerm (MvPowerSeries.subst G H) + (fun j => ∑ i, L i * M i j) := by + have hGsubst : MvPowerSeries.HasSubst G := + MvPowerSeries.hasSubst_of_constantCoeff_zero + (fun i => (hG i).constantCoeff_eq_zero) + have hGorder : ∀ i, (1 : ℕ∞) ≤ (G i).order := + fun i => + MvPowerSeries.one_le_order_iff_constCoeff_eq_zero.mpr + (hG i).constantCoeff_eq_zero + have hinf : (1 : ℕ∞) ≤ ⨅ i, (G i).order := + le_iInf hGorder + have houter : + (2 : ℕ∞) ≤ + (MvPowerSeries.subst G (H - linearForm L)).order := by + refine + (show + (2 : ℕ∞) ≤ + (⨅ i, (G i).order) * (H - linearForm L).order by + calc + (2 : ℕ∞) = 1 * 2 := by norm_num + _ ≤ (⨅ i, (G i).order) * + (H - linearForm L).order := + mul_le_mul hinf hH (by simp) (by simp)).trans + (MvPowerSeries.le_order_subst hGsubst + (H - linearForm L)) + have hsubstLinear : + MvPowerSeries.subst G (linearForm L) = + ∑ i, MvPowerSeries.C (L i) * G i := by + classical + rw [linearForm, + ← MvPowerSeries.substAlgHom_apply hGsubst, map_sum] + apply Finset.sum_congr rfl + intro i _ + rw [map_mul, MvPowerSeries.substAlgHom_X] + simp + have hlinearIdentity : + MvPowerSeries.subst G (linearForm L) - + linearForm (fun j => ∑ i, L i * M i j) = + ∑ i, MvPowerSeries.C (L i) * + (G i - linearForm (M i)) := by + rw [hsubstLinear, ← linearForm_weighted_sum L M, + ← Finset.sum_sub_distrib] + apply Finset.sum_congr rfl + intro i _ + ring + have hlinear : + (2 : ℕ∞) ≤ + (MvPowerSeries.subst G (linearForm L) - + linearForm (fun j => ∑ i, L i * M i j)).order := by + rw [hlinearIdentity] + apply MvPowerSeries.nat_le_order + intro d hd + rw [map_sum] + apply Finset.sum_eq_zero + intro i _ + rw [MvPowerSeries.coeff_C_mul] + have hd' : (d.degree : ℕ∞) < (2 : ℕ∞) := by + exact_mod_cast hd + rw [MvPowerSeries.coeff_of_lt_order + (hd'.trans_le (hG i)), mul_zero] + rw [HasLinearTerm] + have hdecompose : + MvPowerSeries.subst G H - + linearForm (fun j => ∑ i, L i * M i j) = + MvPowerSeries.subst G (H - linearForm L) + + (MvPowerSeries.subst G (linearForm L) - + linearForm (fun j => ∑ i, L i * M i j)) := by + rw [MvPowerSeries.subst_sub hGsubst] + ring + rw [hdecompose] + exact + (le_min houter hlinear).trans + MvPowerSeries.min_order_le_add + +end HasLinearTerm + +private theorem linearForm_basis (i : σ) : + linearForm (R := R) + (fun j : σ => if j = i then (1 : R) else 0) = + (MvPowerSeries.X i : MvPowerSeries σ R) := by + classical + simp [linearForm] + +/-- A variable has the corresponding standard-basis linear term. -/ +theorem hasLinearTerm_X (i : σ) : + HasLinearTerm (MvPowerSeries.X i : MvPowerSeries σ R) + (fun j => if j = i then (1 : R) else 0) := by + rw [HasLinearTerm, linearForm_basis i, sub_self] + simp + +/-- Zero has zero linear term. -/ +theorem hasLinearTerm_zero : + HasLinearTerm (0 : MvPowerSeries σ R) (fun _ => 0) := by + simp [HasLinearTerm, linearForm] + +end LinearTerms + +section SubstitutionClosure + +variable {σ : Type w} +variable {τ : Type w'} + +/-- Multivariable substitution commutes with substituting a multivariable +series into a one-variable power series. -/ +theorem subst_powerSeries_subst + {H : MvPowerSeries σ F.valuationSubring} + (hH : PowerSeries.HasSubst H) + {G : σ → MvPowerSeries τ F.valuationSubring} + (hG : MvPowerSeries.HasSubst G) + (f : PowerSeries F.valuationSubring) : + MvPowerSeries.subst G (PowerSeries.subst H f) = + PowerSeries.subst (MvPowerSeries.subst G H) f := by + change + MvPowerSeries.subst G + (MvPowerSeries.subst (fun _ : Unit => H) f) = + MvPowerSeries.subst + (fun _ : Unit => MvPowerSeries.subst G H) f + exact MvPowerSeries.subst_comp_subst_apply hH.const hG f + +/-- Substituting a family into `e(X_i)` gives `e` evaluated at the +corresponding member of that family. -/ +theorem subst_inVariable + (e : LubinTateSeries F π) + {G : σ → MvPowerSeries τ F.valuationSubring} + (hG : MvPowerSeries.HasSubst G) (i : σ) : + MvPowerSeries.subst G (inVariable e i) = + PowerSeries.subst (G i) e.toPowerSeries := by + rw [inVariable] + rw [subst_powerSeries_subst (PowerSeries.HasSubst.X i) hG] + simp [MvPowerSeries.subst_X hG] + +namespace Intertwines + +/-- An intertwiner remains an intertwiner after substituting a family of +intertwiners. -/ +theorem subst + [Finite σ] [Finite τ] + {e ebar ehat : LubinTateSeries F π} + {H : MvPowerSeries σ F.valuationSubring} + (hH : Intertwines e ebar H) + (hHsubst : PowerSeries.HasSubst H) + {G : σ → MvPowerSeries τ F.valuationSubring} + (hGsubst : MvPowerSeries.HasSubst G) + (hG : ∀ i, Intertwines ebar ehat (G i)) : + Intertwines e ehat (MvPowerSeries.subst G H) := by + let := Fintype.ofFinite σ + let := Fintype.ofFinite τ + rw [Intertwines] at hH ⊢ + calc + PowerSeries.subst (MvPowerSeries.subst G H) e.toPowerSeries = + MvPowerSeries.subst G + (PowerSeries.subst H e.toPowerSeries) := + (subst_powerSeries_subst hHsubst hGsubst + e.toPowerSeries).symm + _ = MvPowerSeries.subst G + (MvPowerSeries.subst + (fun i : σ => inVariable ebar i) H) := by + rw [hH] + _ = MvPowerSeries.subst + (fun i : σ => + MvPowerSeries.subst G (inVariable ebar i)) H := + MvPowerSeries.subst_comp_subst_apply + (inVariable_hasSubst ebar) hGsubst H + _ = MvPowerSeries.subst + (fun i : σ => + PowerSeries.subst (G i) ebar.toPowerSeries) H := by + congr 1 + funext i + exact subst_inVariable ebar hGsubst i + _ = MvPowerSeries.subst + (fun i : σ => + MvPowerSeries.subst + (fun j : τ => inVariable ehat j) (G i)) H := by + congr 1 + funext i + exact hG i + _ = MvPowerSeries.subst + (fun j : τ => inVariable ehat j) + (MvPowerSeries.subst G H) := + (MvPowerSeries.subst_comp_subst_apply + hGsubst (inVariable_hasSubst ehat) H).symm + +/-- Reindexing variables preserves the intertwining equation. -/ +theorem reindex + [Finite σ] [Finite τ] + {e ebar : LubinTateSeries F π} + {H : MvPowerSeries σ F.valuationSubring} + (hH : Intertwines e ebar H) + (hHsubst : PowerSeries.HasSubst H) + (f : σ → τ) : + Intertwines e ebar + (MvPowerSeries.subst + (fun i => MvPowerSeries.X (f i)) H) := by + classical + let := Fintype.ofFinite σ + let := Fintype.ofFinite τ + apply hH.subst hHsubst + (MvPowerSeries.hasSubst_of_constantCoeff_zero + (fun _ => by simp)) + intro i + exact intertwines_X ebar (f i) + +/-- One-variable power-series composition is a special case of +substitution by an intertwining family. -/ +theorem powerSeries_subst + [Finite τ] + {e ebar ehat : LubinTateSeries F π} + {H : PowerSeries F.valuationSubring} + (hH : Intertwines e ebar H) + (hHsubst : PowerSeries.HasSubst H) + {G : MvPowerSeries τ F.valuationSubring} + (hG : Intertwines ebar ehat G) + (hGsubst : PowerSeries.HasSubst G) : + Intertwines e ehat (PowerSeries.subst G H) := by + classical + let := Fintype.ofFinite τ + exact hH.subst hHsubst hGsubst.const (fun _ => hG) + +end Intertwines + +/-- Zero intertwines any two series with zero constant coefficient. -/ +theorem intertwines_zero + [Finite σ] + (e ebar : LubinTateSeries F π) : + Intertwines e ebar + (0 : MvPowerSeries σ F.valuationSubring) := by + classical + let := Fintype.ofFinite σ + rw [Intertwines] + change + MvPowerSeries.subst + (0 : Unit → + MvPowerSeries σ F.valuationSubring) + e.toPowerSeries = + MvPowerSeries.subst + (fun i : σ => inVariable ebar i) 0 + rw [MvPowerSeries.subst_zero_of_constantCoeff_zero + e.constantCoeff_eq_zero] + rw [← MvPowerSeries.substAlgHom_apply + (inVariable_hasSubst ebar), map_zero] + +end SubstitutionClosure + +section StandardFormalGroup + +variable (hπ : + F.toCompleteDVF.valuation.IsUniformizer (π : K)) + +/-- The standard Lubin–Tate series used to construct the two-variable formal group. -/ +abbrev standardSeries : + LubinTateSeries F π := + standardLubinTateSeries hπ + +/-- The unique two-variable series with linear term `X + Y` commuting with +the standard Lubin--Tate series. -/ +noncomputable def standardFormalGroupPowerSeries : + MvPowerSeries (Fin 2) F.valuationSubring := + recursiveIntertwiner hπ (standardSeries hπ) + (standardSeries hπ) (fun _ => 1) + +/-- The standard formal-group series has linear term `X + Y`. -/ +theorem standardFormalGroupPowerSeries_hasLinearTerm : + HasLinearTerm (standardFormalGroupPowerSeries hπ) + (fun _ : Fin 2 => 1) := + recursiveIntertwiner_hasLinearTerm hπ + (standardSeries hπ) (standardSeries hπ) (fun _ => 1) + +/-- The standard formal-group series commutes with the standard +Lubin--Tate series. -/ +theorem standardFormalGroupPowerSeries_intertwines : + Intertwines (standardSeries hπ) (standardSeries hπ) + (standardFormalGroupPowerSeries hπ) := + recursiveIntertwiner_intertwines hπ + (standardSeries hπ) (standardSeries hπ) (fun _ => 1) + +/-- The standard formal-group series is the unique two-variable +intertwiner with linear term `X + Y`. -/ +theorem existsUnique_standardFormalGroupPowerSeries : + ∃! H : MvPowerSeries (Fin 2) F.valuationSubring, + HasLinearTerm H (fun _ : Fin 2 => 1) ∧ + Intertwines (standardSeries hπ) (standardSeries hπ) H := + existsUnique_intertwiner hπ + (standardSeries hπ) (standardSeries hπ) (fun _ => 1) + +private theorem standardFormalGroupPowerSeries_subst_hasLinearTerm + {τ : Type w} [Fintype τ] + {G₀ G₁ : MvPowerSeries τ F.valuationSubring} + {M₀ M₁ : τ → F.valuationSubring} + (hG₀ : HasLinearTerm G₀ M₀) + (hG₁ : HasLinearTerm G₁ M₁) : + HasLinearTerm + (MvPowerSeries.subst ![G₀, G₁] + (standardFormalGroupPowerSeries hπ)) + (fun j => M₀ j + M₁ j) := by + have h := + (standardFormalGroupPowerSeries_hasLinearTerm hπ).subst + (G := ![G₀, G₁]) (M := ![M₀, M₁]) + (by + intro i + fin_cases i + · exact hG₀ + · exact hG₁) + simpa [Fin.sum_univ_two] using h + +private theorem standardFormalGroupPowerSeries_subst_intertwines + {τ : Type w} [Fintype τ] + {G₀ G₁ : MvPowerSeries τ F.valuationSubring} + {M₀ M₁ : τ → F.valuationSubring} + (hG₀ : HasLinearTerm G₀ M₀) + (hG₁ : HasLinearTerm G₁ M₁) + (hI₀ : Intertwines (standardSeries hπ) + (standardSeries hπ) G₀) + (hI₁ : Intertwines (standardSeries hπ) + (standardSeries hπ) G₁) : + Intertwines (standardSeries hπ) (standardSeries hπ) + (MvPowerSeries.subst ![G₀, G₁] + (standardFormalGroupPowerSeries hπ)) := by + apply + (standardFormalGroupPowerSeries_intertwines hπ).subst + (standardFormalGroupPowerSeries_hasLinearTerm hπ).hasSubst + (MvPowerSeries.hasSubst_of_constantCoeff_zero + (fun i => by + fin_cases i + · exact hG₀.constantCoeff_eq_zero + · exact hG₁.constantCoeff_eq_zero)) + intro i + fin_cases i + · exact hI₀ + · exact hI₁ + +/-- The left identity law, proved by uniqueness of the linear-term-one +intertwiner. -/ +theorem standardFormalGroupPowerSeries_subst_X_zero : + MvPowerSeries.subst + ![(MvPowerSeries.X () : + PowerSeries F.valuationSubring), 0] + (standardFormalGroupPowerSeries hπ) = + (MvPowerSeries.X () : + PowerSeries F.valuationSubring) := by + have hX : + HasLinearTerm + (MvPowerSeries.X () : + PowerSeries F.valuationSubring) + (fun _ : Unit => 1) := by + simpa using + (hasLinearTerm_X (R := F.valuationSubring) ()) + have hzero : + HasLinearTerm + (0 : PowerSeries F.valuationSubring) + (fun _ : Unit => 0) := + hasLinearTerm_zero + have hleft := + standardFormalGroupPowerSeries_subst_hasLinearTerm + hπ hX hzero + have hleft' : + HasLinearTerm + (MvPowerSeries.subst + ![(MvPowerSeries.X () : + PowerSeries F.valuationSubring), 0] + (standardFormalGroupPowerSeries hπ)) + (fun _ : Unit => 1) := by + simpa using hleft + have hIleft := + standardFormalGroupPowerSeries_subst_intertwines + hπ hX hzero + (intertwines_X (standardSeries hπ) ()) + (intertwines_zero + (standardSeries hπ) (standardSeries hπ)) + exact + eq_of_hasLinearTerm_of_intertwines hπ + (standardSeries hπ) (standardSeries hπ) + (fun _ : Unit => 1) + hleft' hIleft hX + (intertwines_X (standardSeries hπ) ()) + +/-- The right identity law, proved by uniqueness. -/ +theorem standardFormalGroupPowerSeries_subst_zero_X : + MvPowerSeries.subst + ![0, (MvPowerSeries.X () : + PowerSeries F.valuationSubring)] + (standardFormalGroupPowerSeries hπ) = + (MvPowerSeries.X () : + PowerSeries F.valuationSubring) := by + have hX : + HasLinearTerm + (MvPowerSeries.X () : + PowerSeries F.valuationSubring) + (fun _ : Unit => 1) := by + simpa using + (hasLinearTerm_X (R := F.valuationSubring) ()) + have hzero : + HasLinearTerm + (0 : PowerSeries F.valuationSubring) + (fun _ : Unit => 0) := + hasLinearTerm_zero + have hright := + standardFormalGroupPowerSeries_subst_hasLinearTerm + hπ hzero hX + have hright' : + HasLinearTerm + (MvPowerSeries.subst + ![0, (MvPowerSeries.X () : + PowerSeries F.valuationSubring)] + (standardFormalGroupPowerSeries hπ)) + (fun _ : Unit => 1) := by + simpa using hright + have hIright := + standardFormalGroupPowerSeries_subst_intertwines + hπ hzero hX + (intertwines_zero + (standardSeries hπ) (standardSeries hπ)) + (intertwines_X (standardSeries hπ) ()) + exact + eq_of_hasLinearTerm_of_intertwines hπ + (standardSeries hπ) (standardSeries hπ) + (fun _ : Unit => 1) + hright' hIright hX + (intertwines_X (standardSeries hπ) ()) + +/-- Associativity of the standard formal-group series, proved by comparing +the two three-variable intertwiners with linear term `X + Y + Z`. -/ +theorem standardFormalGroupPowerSeries_assoc : + MvPowerSeries.subst + ![ + MvPowerSeries.subst + ![ + (MvPowerSeries.X 0 : + MvPowerSeries (Fin 3) F.valuationSubring), + MvPowerSeries.X 1] + (standardFormalGroupPowerSeries hπ), + MvPowerSeries.X 2] + (standardFormalGroupPowerSeries hπ) = + MvPowerSeries.subst + ![ + (MvPowerSeries.X 0 : + MvPowerSeries (Fin 3) F.valuationSubring), + MvPowerSeries.subst + ![MvPowerSeries.X 1, MvPowerSeries.X 2] + (standardFormalGroupPowerSeries hπ)] + (standardFormalGroupPowerSeries hπ) := by + let B : Fin 3 → Fin 3 → F.valuationSubring := + fun i j => + @ite F.valuationSubring (j = i) + (Classical.propDecidable (j = i)) 1 0 + have hX (i : Fin 3) : + HasLinearTerm + (MvPowerSeries.X i : + MvPowerSeries (Fin 3) F.valuationSubring) + (B i) := by + simpa [B] using + (hasLinearTerm_X (R := F.valuationSubring) i) + have hIX (i : Fin 3) : + Intertwines (standardSeries hπ) (standardSeries hπ) + (MvPowerSeries.X i : + MvPowerSeries (Fin 3) F.valuationSubring) := + intertwines_X (standardSeries hπ) i + have hF₀₁ : + HasLinearTerm + (MvPowerSeries.subst + ![ + (MvPowerSeries.X 0 : + MvPowerSeries (Fin 3) F.valuationSubring), + MvPowerSeries.X 1] + (standardFormalGroupPowerSeries hπ)) + (fun j => B 0 j + B 1 j) := + standardFormalGroupPowerSeries_subst_hasLinearTerm + hπ (hX 0) (hX 1) + have hIF₀₁ : + Intertwines (standardSeries hπ) (standardSeries hπ) + (MvPowerSeries.subst + ![ + (MvPowerSeries.X 0 : + MvPowerSeries (Fin 3) F.valuationSubring), + MvPowerSeries.X 1] + (standardFormalGroupPowerSeries hπ)) := + standardFormalGroupPowerSeries_subst_intertwines + hπ (hX 0) (hX 1) (hIX 0) (hIX 1) + have hF₁₂ : + HasLinearTerm + (MvPowerSeries.subst + ![ + (MvPowerSeries.X 1 : + MvPowerSeries (Fin 3) F.valuationSubring), + MvPowerSeries.X 2] + (standardFormalGroupPowerSeries hπ)) + (fun j => B 1 j + B 2 j) := + standardFormalGroupPowerSeries_subst_hasLinearTerm + hπ (hX 1) (hX 2) + have hIF₁₂ : + Intertwines (standardSeries hπ) (standardSeries hπ) + (MvPowerSeries.subst + ![ + (MvPowerSeries.X 1 : + MvPowerSeries (Fin 3) F.valuationSubring), + MvPowerSeries.X 2] + (standardFormalGroupPowerSeries hπ)) := + standardFormalGroupPowerSeries_subst_intertwines + hπ (hX 1) (hX 2) (hIX 1) (hIX 2) + have hleft := + standardFormalGroupPowerSeries_subst_hasLinearTerm + hπ hF₀₁ (hX 2) + have hright := + standardFormalGroupPowerSeries_subst_hasLinearTerm + hπ (hX 0) hF₁₂ + have hleft' : + HasLinearTerm + (MvPowerSeries.subst + ![ + MvPowerSeries.subst + ![ + (MvPowerSeries.X 0 : + MvPowerSeries (Fin 3) + F.valuationSubring), + MvPowerSeries.X 1] + (standardFormalGroupPowerSeries hπ), + MvPowerSeries.X 2] + (standardFormalGroupPowerSeries hπ)) + (fun _ : Fin 3 => 1) := by + convert hleft using 1 + funext j + fin_cases j <;> simp [B] + have hright' : + HasLinearTerm + (MvPowerSeries.subst + ![ + (MvPowerSeries.X 0 : + MvPowerSeries (Fin 3) F.valuationSubring), + MvPowerSeries.subst + ![MvPowerSeries.X 1, MvPowerSeries.X 2] + (standardFormalGroupPowerSeries hπ)] + (standardFormalGroupPowerSeries hπ)) + (fun _ : Fin 3 => 1) := by + convert hright using 1 + funext j + fin_cases j <;> simp [B] + have hIleft := + standardFormalGroupPowerSeries_subst_intertwines + hπ hF₀₁ (hX 2) hIF₀₁ (hIX 2) + have hIright := + standardFormalGroupPowerSeries_subst_intertwines + hπ (hX 0) hF₁₂ (hIX 0) hIF₁₂ + exact + eq_of_hasLinearTerm_of_intertwines hπ + (standardSeries hπ) (standardSeries hπ) + (fun _ : Fin 3 => 1) + hleft' hIleft hright' hIright + +/-- Commutativity of the standard formal-group series, proved by +uniqueness. -/ +theorem standardFormalGroupPowerSeries_comm : + standardFormalGroupPowerSeries hπ = + MvPowerSeries.subst + ![ + (MvPowerSeries.X 1 : + MvPowerSeries (Fin 2) F.valuationSubring), + MvPowerSeries.X 0] + (standardFormalGroupPowerSeries hπ) := by + let B : Fin 2 → Fin 2 → F.valuationSubring := + fun i j => + @ite F.valuationSubring (j = i) + (Classical.propDecidable (j = i)) 1 0 + have hX (i : Fin 2) : + HasLinearTerm + (MvPowerSeries.X i : + MvPowerSeries (Fin 2) F.valuationSubring) + (B i) := by + simpa [B] using + (hasLinearTerm_X (R := F.valuationSubring) i) + have hswap := + standardFormalGroupPowerSeries_subst_hasLinearTerm + hπ (hX 1) (hX 0) + have hswap' : + HasLinearTerm + (MvPowerSeries.subst + ![ + (MvPowerSeries.X 1 : + MvPowerSeries (Fin 2) F.valuationSubring), + MvPowerSeries.X 0] + (standardFormalGroupPowerSeries hπ)) + (fun _ : Fin 2 => 1) := by + convert hswap using 1 + funext j + fin_cases j <;> simp [B] + have hIswap := + standardFormalGroupPowerSeries_subst_intertwines + hπ (hX 1) (hX 0) + (intertwines_X (standardSeries hπ) 1) + (intertwines_X (standardSeries hπ) 0) + exact + eq_of_hasLinearTerm_of_intertwines hπ + (standardSeries hπ) (standardSeries hπ) + (fun _ : Fin 2 => 1) + (standardFormalGroupPowerSeries_hasLinearTerm hπ) + (standardFormalGroupPowerSeries_intertwines hπ) + hswap' hIswap + +/-- The formal group law attached to the standard Lubin--Tate series. -/ +noncomputable def standardFormalGroup : + FormalGroup F.valuationSubring where + toPowerSeries := standardFormalGroupPowerSeries hπ + zero_constantCoeff := + (standardFormalGroupPowerSeries_hasLinearTerm + hπ).constantCoeff_eq_zero + lin_coeff_X := + (standardFormalGroupPowerSeries_hasLinearTerm + hπ).coeff_single 0 + lin_coeff_Y := + (standardFormalGroupPowerSeries_hasLinearTerm + hπ).coeff_single 1 + assoc := standardFormalGroupPowerSeries_assoc hπ + +/-- The standard Lubin--Tate formal group is commutative. -/ +noncomputable instance standardFormalGroup_isComm : + (standardFormalGroup hπ).IsComm where + comm := standardFormalGroupPowerSeries_comm hπ + +end StandardFormalGroup + +section StandardEndomorphisms + +variable (hπ : + F.toCompleteDVF.valuation.IsUniformizer (π : K)) + +/-- The standard Lubin–Tate series used to construct the scalar endomorphisms. -/ +abbrev standardSeries' : + LubinTateSeries F π := + standardLubinTateSeries hπ + +/-- The one-variable standard Lubin--Tate endomorphism with linear +coefficient `a`. -/ +noncomputable def standardLubinTateEndomorphism + (a : F.valuationSubring) : + PowerSeries F.valuationSubring := + recursiveIntertwiner hπ (standardSeries' hπ) + (standardSeries' hπ) (fun _ : Unit => a) + +/-- The endomorphism `[a]` has linear coefficient `a`. -/ +theorem standardLubinTateEndomorphism_hasLinearTerm + (a : F.valuationSubring) : + HasLinearTerm (standardLubinTateEndomorphism hπ a) + (fun _ : Unit => a) := + recursiveIntertwiner_hasLinearTerm hπ + (standardSeries' hπ) (standardSeries' hπ) + (fun _ : Unit => a) + +/-- The endomorphism `[a]` commutes with the standard Lubin--Tate +series. -/ +theorem standardLubinTateEndomorphism_intertwines + (a : F.valuationSubring) : + Intertwines (standardSeries' hπ) (standardSeries' hπ) + (standardLubinTateEndomorphism hπ a) := + recursiveIntertwiner_intertwines hπ + (standardSeries' hπ) (standardSeries' hπ) + (fun _ : Unit => a) + +/-- `[a]` is the unique one-variable intertwiner with linear coefficient +`a`. -/ +theorem existsUnique_standardLubinTateEndomorphism + (a : F.valuationSubring) : + ∃! f : PowerSeries F.valuationSubring, + HasLinearTerm f (fun _ : Unit => a) ∧ + Intertwines (standardSeries' hπ) (standardSeries' hπ) f := + existsUnique_intertwiner hπ + (standardSeries' hπ) (standardSeries' hπ) + (fun _ : Unit => a) + +/-- The coefficient of `X` in `[a]` is `a`. -/ +@[simp] +theorem standardLubinTateEndomorphism_coeff_one + (a : F.valuationSubring) : + PowerSeries.coeff 1 + (standardLubinTateEndomorphism hπ a) = a := by + exact + (standardLubinTateEndomorphism_hasLinearTerm + hπ a).coeff_single () + +/-- The scalar `1` acts by the identity series. -/ +theorem standardLubinTateEndomorphism_one : + standardLubinTateEndomorphism hπ 1 = + PowerSeries.X := by + have hX : + HasLinearTerm + (PowerSeries.X : + PowerSeries F.valuationSubring) + (fun _ : Unit => 1) := by + simpa [PowerSeries.X] using + (hasLinearTerm_X (R := F.valuationSubring) ()) + exact + eq_of_hasLinearTerm_of_intertwines hπ + (standardSeries' hπ) (standardSeries' hπ) + (fun _ : Unit => 1) + (standardLubinTateEndomorphism_hasLinearTerm hπ 1) + (standardLubinTateEndomorphism_intertwines hπ 1) + hX (intertwines_X (standardSeries' hπ) ()) + +/-- The scalar `0` acts by the zero series. -/ +theorem standardLubinTateEndomorphism_zero : + standardLubinTateEndomorphism hπ 0 = 0 := by + exact + eq_of_hasLinearTerm_of_intertwines hπ + (standardSeries' hπ) (standardSeries' hπ) + (fun _ : Unit => 0) + (standardLubinTateEndomorphism_hasLinearTerm hπ 0) + (standardLubinTateEndomorphism_intertwines hπ 0) + hasLinearTerm_zero + (intertwines_zero + (standardSeries' hπ) (standardSeries' hπ)) + +/-- Addition of scalars is addition in the standard formal group. -/ +theorem standardLubinTateEndomorphism_add + (a b : F.valuationSubring) : + standardLubinTateEndomorphism hπ (a + b) = + MvPowerSeries.subst + ![ + standardLubinTateEndomorphism hπ a, + standardLubinTateEndomorphism hπ b] + (standardFormalGroupPowerSeries hπ) := by + have hright := + standardFormalGroupPowerSeries_subst_hasLinearTerm + hπ + (standardLubinTateEndomorphism_hasLinearTerm hπ a) + (standardLubinTateEndomorphism_hasLinearTerm hπ b) + have hright' : + HasLinearTerm + (MvPowerSeries.subst + ![ + standardLubinTateEndomorphism hπ a, + standardLubinTateEndomorphism hπ b] + (standardFormalGroupPowerSeries hπ)) + (fun _ : Unit => a + b) := by + simpa using hright + have hIright := + standardFormalGroupPowerSeries_subst_intertwines + hπ + (standardLubinTateEndomorphism_hasLinearTerm hπ a) + (standardLubinTateEndomorphism_hasLinearTerm hπ b) + (standardLubinTateEndomorphism_intertwines hπ a) + (standardLubinTateEndomorphism_intertwines hπ b) + exact + eq_of_hasLinearTerm_of_intertwines hπ + (standardSeries' hπ) (standardSeries' hπ) + (fun _ : Unit => a + b) + (standardLubinTateEndomorphism_hasLinearTerm hπ (a + b)) + (standardLubinTateEndomorphism_intertwines hπ (a + b)) + hright' hIright + +/-- Multiplication of scalars is composition of endomorphisms: +`[ab](X) = [a]([b](X))`. -/ +theorem standardLubinTateEndomorphism_mul + (a b : F.valuationSubring) : + standardLubinTateEndomorphism hπ (a * b) = + PowerSeries.subst + (standardLubinTateEndomorphism hπ b) + (standardLubinTateEndomorphism hπ a) := by + have hcomp := + (standardLubinTateEndomorphism_hasLinearTerm hπ a).subst + (G := fun _ : Unit => + standardLubinTateEndomorphism hπ b) + (M := fun _ : Unit => fun _ : Unit => b) + (fun _ => + standardLubinTateEndomorphism_hasLinearTerm hπ b) + have hcomp' : + HasLinearTerm + (PowerSeries.subst + (standardLubinTateEndomorphism hπ b) + (standardLubinTateEndomorphism hπ a)) + (fun _ : Unit => a * b) := by + simpa [PowerSeries.subst_def] using hcomp + have hIcomp := + (standardLubinTateEndomorphism_intertwines + hπ a).powerSeries_subst + (standardLubinTateEndomorphism_hasLinearTerm + hπ a).hasSubst + (standardLubinTateEndomorphism_intertwines hπ b) + (standardLubinTateEndomorphism_hasLinearTerm + hπ b).hasSubst + exact + eq_of_hasLinearTerm_of_intertwines hπ + (standardSeries' hπ) (standardSeries' hπ) + (fun _ : Unit => a * b) + (standardLubinTateEndomorphism_hasLinearTerm hπ (a * b)) + (standardLubinTateEndomorphism_intertwines hπ (a * b)) + hcomp' hIcomp + +/-- The series `[a](X_i)` in a chosen variable. -/ +noncomputable def standardLubinTateEndomorphismInVariable + {σ : Type w} (a : F.valuationSubring) (i : σ) : + MvPowerSeries σ F.valuationSubring := + PowerSeries.subst (MvPowerSeries.X i) + (standardLubinTateEndomorphism hπ a) + +/-- The linear term of `[a](X_i)` is `a X_i`. -/ +theorem standardLubinTateEndomorphismInVariable_hasLinearTerm + {σ : Type w} [Fintype σ] + (a : F.valuationSubring) (i : σ) : + HasLinearTerm + (standardLubinTateEndomorphismInVariable hπ a i) + (fun j => if j = i then a else 0) := by + have h := + (standardLubinTateEndomorphism_hasLinearTerm hπ a).subst + (G := fun _ : Unit => + (MvPowerSeries.X i : + MvPowerSeries σ F.valuationSubring)) + (M := fun _ : Unit => + fun j : σ => if j = i then 1 else 0) + (fun _ => + hasLinearTerm_X (R := F.valuationSubring) i) + simpa [standardLubinTateEndomorphismInVariable, + PowerSeries.subst_def] using h + +/-- The reindexed series `[a](X_i)` remains an intertwiner. -/ +theorem standardLubinTateEndomorphismInVariable_intertwines + {σ : Type w} [Finite σ] + (a : F.valuationSubring) (i : σ) : + Intertwines (standardSeries' hπ) (standardSeries' hπ) + (standardLubinTateEndomorphismInVariable hπ a i) := by + classical + let := Fintype.ofFinite σ + simpa [standardLubinTateEndomorphismInVariable, + PowerSeries.subst_def] using + (standardLubinTateEndomorphism_intertwines + hπ a).reindex + (standardLubinTateEndomorphism_hasLinearTerm + hπ a).hasSubst + (fun _ : Unit => i) + +/-- The full scalar endomorphism identity +`[a](F(X,Y)) = F([a](X),[a](Y))`. -/ +theorem standardLubinTateEndomorphism_map_formalGroup + (a : F.valuationSubring) : + PowerSeries.subst + (standardFormalGroupPowerSeries hπ) + (standardLubinTateEndomorphism hπ a) = + MvPowerSeries.subst + ![ + standardLubinTateEndomorphismInVariable hπ a + (0 : Fin 2), + standardLubinTateEndomorphismInVariable hπ a + (1 : Fin 2)] + (standardFormalGroupPowerSeries hπ) := by + have hleft := + (standardLubinTateEndomorphism_hasLinearTerm hπ a).subst + (G := fun _ : Unit => + standardFormalGroupPowerSeries hπ) + (M := fun _ : Unit => + fun _ : Fin 2 => 1) + (fun _ => + standardFormalGroupPowerSeries_hasLinearTerm hπ) + have hleft' : + HasLinearTerm + (PowerSeries.subst + (standardFormalGroupPowerSeries hπ) + (standardLubinTateEndomorphism hπ a)) + (fun _ : Fin 2 => a) := by + simpa [PowerSeries.subst_def] using hleft + have hIleft := + (standardLubinTateEndomorphism_intertwines + hπ a).powerSeries_subst + (standardLubinTateEndomorphism_hasLinearTerm + hπ a).hasSubst + (standardFormalGroupPowerSeries_intertwines hπ) + (standardFormalGroupPowerSeries_hasLinearTerm + hπ).hasSubst + have hright := + standardFormalGroupPowerSeries_subst_hasLinearTerm + hπ + (standardLubinTateEndomorphismInVariable_hasLinearTerm + hπ a (0 : Fin 2)) + (standardLubinTateEndomorphismInVariable_hasLinearTerm + hπ a (1 : Fin 2)) + have hright' : + HasLinearTerm + (MvPowerSeries.subst + ![ + standardLubinTateEndomorphismInVariable hπ a + (0 : Fin 2), + standardLubinTateEndomorphismInVariable hπ a + (1 : Fin 2)] + (standardFormalGroupPowerSeries hπ)) + (fun _ : Fin 2 => a) := by + convert hright using 1 + funext j + fin_cases j <;> simp + have hIright := + standardFormalGroupPowerSeries_subst_intertwines + hπ + (standardLubinTateEndomorphismInVariable_hasLinearTerm + hπ a (0 : Fin 2)) + (standardLubinTateEndomorphismInVariable_hasLinearTerm + hπ a (1 : Fin 2)) + (standardLubinTateEndomorphismInVariable_intertwines + hπ a (0 : Fin 2)) + (standardLubinTateEndomorphismInVariable_intertwines + hπ a (1 : Fin 2)) + exact + eq_of_hasLinearTerm_of_intertwines hπ + (standardSeries' hπ) (standardSeries' hπ) + (fun _ : Fin 2 => a) + hleft' hIleft hright' hIright + +end StandardEndomorphisms + +end SameUniformizer +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardSeries.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardSeries.lean new file mode 100644 index 0000000000..2d5ecf65b9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardSeries.lean @@ -0,0 +1,76 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.CoefficientEquation +/-! +# The standard Lubin--Tate series + +For a uniformizer `π`, the polynomial power series + +`π X + X ^ q`, + +where `q` is the cardinality of the residue field, is a Lubin--Tate +series. This gives the general formal-module construction a canonical +polynomial input without making an equal-characteristic assumption. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] +variable {F : LocalField.{u, v} K} {π : F.valuationSubring} + +/-- The polynomial power series `π X + X ^ q`, where `q` is the residue +field cardinality. -/ +noncomputable def standardLubinTatePowerSeries + (F : LocalField.{u, v} K) (π : F.valuationSubring) : + PowerSeries F.valuationSubring := + PowerSeries.C π * PowerSeries.X + + PowerSeries.X ^ Nat.card F.residueField + +/-- A uniformizer makes `π X + X ^ q` into a Lubin--Tate series. -/ +noncomputable def standardLubinTateSeries + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + LubinTateSeries F π where + toPowerSeries := standardLubinTatePowerSeries F π + constantCoeff_eq_zero := by + have hq0 : Nat.card F.residueField ≠ 0 := + Nat.ne_of_gt (lt_trans Nat.zero_lt_one + (Finite.one_lt_card (α := F.residueField))) + simp [standardLubinTatePowerSeries, hq0] + coeff_one_eq_uniformizer := by + have hq : 1 ≠ Nat.card F.residueField := + (Finite.one_lt_card (α := F.residueField)).ne + simp [standardLubinTatePowerSeries, PowerSeries.coeff_X_pow, hq] + map_residue_eq_frobenius := by + simp [standardLubinTatePowerSeries, + SameUniformizer.residueMap_uniformizer_eq_zero hπ] + +namespace LubinTateSeries + +/-- The underlying series of the standard Lubin--Tate input is literally +`π X + X ^ q`. -/ +@[simp] +theorem standardLubinTateSeries_toPowerSeries + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + (standardLubinTateSeries hπ).toPowerSeries = + standardLubinTatePowerSeries F π := + rfl + +end LubinTateSeries +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic.lean new file mode 100644 index 0000000000..edf01288e1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic.lean @@ -0,0 +1,35 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerCoefficient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerPrimitive +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerThetaFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedResidueFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedStandardLevelTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedFrobeniusFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeIntertwiner +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeSeries + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/All.lean new file mode 100644 index 0000000000..5f9a79872f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/All.lean @@ -0,0 +1,38 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerCoefficient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerPrimitive +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerThetaFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedLevel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedResidueFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedStandardLevelTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedFrobeniusFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeIntertwiner +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeSeries +/-! +# P-adic Lubin--Tate theory + +Aggregate for the multiplicative Lubin--Tate series and its completed-level, +Frobenius, residue, fixed-field, and changed-uniformizer constructions. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerCoefficient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerCoefficient.lean new file mode 100644 index 0000000000..df0af80700 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerCoefficient.lean @@ -0,0 +1,310 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +public import Mathlib.RingTheory.WittVector.Compare +public import Mathlib.RingTheory.WittVector.Complete +public import Mathlib.RingTheory.WittVector.FrobeniusFractionField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicContractingFixedPoint +/-! +# The coefficient source for the p-adic changed-uniformizer intertwiner + +Let `k` be an algebraic closure of `ZMod p`. The Witt ring `W(k)` is the +integer ring of the completed maximal-unramified coefficient field used in +the changed-uniformizer construction. Mathlib's `WittVector.frobeniusRotation` supplies the +actual unit `ε ∈ W(k)ˣ` satisfying + +`φ(ε) = ε u` + +for every p-adic integer unit `u`. This is precisely the linear-coefficient +equation for the semilinear changed-uniformizer intertwiner. + +No second p-adic integer ring or Frobenius is introduced here: the base map +uses mathlib's equivalence `W(ZMod p) ≃+* ℤ_[p]`, and `φ` is +`WittVector.frobenius`. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp + +/-- The canonical Witt integer ring over an algebraic closure of the +residue field. This is the coefficient ring used for the mixed-characteristic +completed-unramified descent. -/ +abbrev padicCompletedUnramifiedWittRing (p : ℕ) [Fact p.Prime] := + WittVector p (AlgebraicClosure (ZMod p)) + +/-- The canonical inclusion `ℤ_[p] → W(AlgebraicClosure (ZMod p))`. -/ +noncomputable def padicIntToCompletedUnramifiedWittRing + (p : ℕ) [Fact p.Prime] : + ℤ_[p] →+* padicCompletedUnramifiedWittRing p := + (WittVector.map + (algebraMap (ZMod p) (AlgebraicClosure (ZMod p)))).comp + (WittVector.equiv p).symm.toRingHom + +/-- Witt Frobenius fixes the canonical p-adic integer coefficients. -/ +theorem padicIntToCompletedUnramifiedWittRing_frobenius + (p : ℕ) [Fact p.Prime] (z : ℤ_[p]) : + WittVector.frobenius + (padicIntToCompletedUnramifiedWittRing p z) = + padicIntToCompletedUnramifiedWittRing p z := by + apply WittVector.ext + intro n + simp only [padicIntToCompletedUnramifiedWittRing, + RingHom.comp_apply, WittVector.coeff_frobenius_charP, + WittVector.map_coeff] + rw [← map_pow, ZMod.pow_card] + +/-- The chosen valuation ring of `ℚ_[p]` maps canonically into the +completed-unramified Witt ring. -/ +noncomputable def padicValuationSubringToCompletedUnramifiedWittRing + (p : ℕ) [Fact p.Prime] : + (padicLocalField p).valuationSubring →+* + padicCompletedUnramifiedWittRing p := by + change (padicDVRValuation p).valuationSubring →+* + padicCompletedUnramifiedWittRing p + exact + (padicIntToCompletedUnramifiedWittRing p).comp + (padicIntEquivValuationSubring p).symm.toRingHom + +/-- The canonical map from the valuation ring of `ℚ_[p]` sends its standard +uniformizer to the Witt-vector prime. -/ +theorem padicValuationSubringToCompletedUnramifiedWittRing_uniformizer + (p : ℕ) [Fact p.Prime] : + padicValuationSubringToCompletedUnramifiedWittRing p + (padicIntEquivValuationSubring p (p : ℤ_[p])) = + (p : padicCompletedUnramifiedWittRing p) := by + change + padicIntToCompletedUnramifiedWittRing p + ((padicIntEquivValuationSubring p).symm + (padicIntEquivValuationSubring p (p : ℤ_[p]))) = + (p : padicCompletedUnramifiedWittRing p) + rw [RingEquiv.symm_apply_apply, map_natCast] + +/-- Witt Frobenius fixes the chosen p-adic valuation-ring coefficients. -/ +theorem padicValuationSubringToCompletedUnramifiedWittRing_frobenius + (p : ℕ) [Fact p.Prime] + (z : (padicLocalField p).valuationSubring) : + WittVector.frobenius + (padicValuationSubringToCompletedUnramifiedWittRing p z) = + padicValuationSubringToCompletedUnramifiedWittRing p z := by + change + WittVector.frobenius + (padicIntToCompletedUnramifiedWittRing p + ((padicIntEquivValuationSubring p).symm z)) = + padicIntToCompletedUnramifiedWittRing p + ((padicIntEquivValuationSubring p).symm z) + exact + padicIntToCompletedUnramifiedWittRing_frobenius p + ((padicIntEquivValuationSubring p).symm z) + +/-- The induced map on p-adic integer units. -/ +noncomputable def padicValuationUnitToCompletedUnramifiedWittUnit + (p : ℕ) [Fact p.Prime] : + (padicLocalField p).valuationSubringˣ →* + (padicCompletedUnramifiedWittRing p)ˣ := + Units.map + (padicValuationSubringToCompletedUnramifiedWittRing p).toMonoidHom + +private theorem completedUnramifiedWittUnit_coeff_zero_ne_zero + (p : ℕ) [Fact p.Prime] + (u : (padicCompletedUnramifiedWittRing p)ˣ) : + ((u : padicCompletedUnramifiedWittRing p).coeff 0) ≠ 0 := by + have hu : + IsUnit + (WittVector.constantCoeff + (u : padicCompletedUnramifiedWittRing p)) := + u.isUnit.map WittVector.constantCoeff + simpa only [WittVector.constantCoeff_apply] using hu.ne_zero + +private theorem padicChangedUniformizerRotation_coeff_zero_ne_zero + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + (WittVector.frobeniusRotation p + (a₂ := (padicValuationUnitToCompletedUnramifiedWittUnit p u : + padicCompletedUnramifiedWittRing p)) + (show + ((1 : padicCompletedUnramifiedWittRing p).coeff 0) ≠ 0 by + simp) + (completedUnramifiedWittUnit_coeff_zero_ne_zero p + (padicValuationUnitToCompletedUnramifiedWittUnit p u))).coeff 0 ≠ 0 := by + simpa only [WittVector.frobeniusRotation, + WittVector.coeff_mk, WittVector.frobeniusRotationCoeff] using + (WittVector.RecursionBase.solution_nonzero p + (show + ((1 : padicCompletedUnramifiedWittRing p).coeff 0) ≠ 0 by + simp) + (completedUnramifiedWittUnit_coeff_zero_ne_zero p + (padicValuationUnitToCompletedUnramifiedWittUnit p u))) + +/-- The actual unit `ε` used as the linear coefficient of the p-adic +changed-uniformizer intertwiner. -/ +noncomputable def padicChangedUniformizerLinearCoefficient + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + (padicCompletedUnramifiedWittRing p)ˣ := + Classical.choose + (WittVector.isUnit_of_coeff_zero_ne_zero + (WittVector.frobeniusRotation p + (a₂ := (padicValuationUnitToCompletedUnramifiedWittUnit p u : + padicCompletedUnramifiedWittRing p)) + (show + ((1 : padicCompletedUnramifiedWittRing p).coeff 0) ≠ 0 by + simp) + (by + exact completedUnramifiedWittUnit_coeff_zero_ne_zero p + (padicValuationUnitToCompletedUnramifiedWittUnit p u))) + (by exact padicChangedUniformizerRotation_coeff_zero_ne_zero p u)) + +@[simp] +private theorem padicChangedUniformizerLinearCoefficient_coe + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + (padicChangedUniformizerLinearCoefficient p u : + padicCompletedUnramifiedWittRing p) = + WittVector.frobeniusRotation p + (a₂ := (padicValuationUnitToCompletedUnramifiedWittUnit p u : + padicCompletedUnramifiedWittRing p)) + (show + ((1 : padicCompletedUnramifiedWittRing p).coeff 0) ≠ 0 by + simp) + (by + exact completedUnramifiedWittUnit_coeff_zero_ne_zero p + (padicValuationUnitToCompletedUnramifiedWittUnit p u)) := + Classical.choose_spec + (WittVector.isUnit_of_coeff_zero_ne_zero + (WittVector.frobeniusRotation p + (a₂ := (padicValuationUnitToCompletedUnramifiedWittUnit p u : + padicCompletedUnramifiedWittRing p)) + (show + ((1 : padicCompletedUnramifiedWittRing p).coeff 0) ≠ 0 by + simp) + (by + exact completedUnramifiedWittUnit_coeff_zero_ne_zero p + (padicValuationUnitToCompletedUnramifiedWittUnit p u))) + (by exact padicChangedUniformizerRotation_coeff_zero_ne_zero p u)) + +/-- The linear coefficient satisfies the semilinear equation +`φ(ε) = ε u`. -/ +theorem padicChangedUniformizerLinearCoefficient_frobenius + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + WittVector.frobenius + (padicChangedUniformizerLinearCoefficient p u : + padicCompletedUnramifiedWittRing p) = + (padicChangedUniformizerLinearCoefficient p u : + padicCompletedUnramifiedWittRing p) * + (padicValuationUnitToCompletedUnramifiedWittUnit p u : + padicCompletedUnramifiedWittRing p) := by + rw [padicChangedUniformizerLinearCoefficient_coe] + simpa only [mul_one] using + (WittVector.frobenius_frobeniusRotation p + (show + ((1 : padicCompletedUnramifiedWittRing p).coeff 0) ≠ 0 by + simp) + (completedUnramifiedWittUnit_coeff_zero_ne_zero p + (padicValuationUnitToCompletedUnramifiedWittUnit p u))) + +private noncomputable def padicChangedUniformizerCoefficientOperator + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (m : ℕ) : + padicCompletedUnramifiedWittRing p →+ + padicCompletedUnramifiedWittRing p where + toFun a := + (↑((padicValuationUnitToCompletedUnramifiedWittUnit p u)⁻¹) : + padicCompletedUnramifiedWittRing p) * + (p : padicCompletedUnramifiedWittRing p) ^ (m - 1) * + WittVector.frobenius a + map_zero' := by simp + map_add' a b := by + simp only [map_add, mul_add] + +private theorem padicChangedUniformizerCoefficientOperator_maps_pow_succ + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (m : ℕ) (hm : 2 ≤ m) : + let I : Ideal (padicCompletedUnramifiedWittRing p) := + Ideal.span ({(p : padicCompletedUnramifiedWittRing p)} : Set _) + ∀ (n : ℕ) {x : padicCompletedUnramifiedWittRing p}, + x ∈ I ^ n → + padicChangedUniformizerCoefficientOperator p u m x ∈ + I ^ (n + 1) := by + dsimp only + let W := padicCompletedUnramifiedWittRing p + let I : Ideal W := Ideal.span ({(p : W)} : Set W) + let φ : W →+* W := WittVector.frobenius + have hφI : I.map φ = I := by + dsimp only [I] + rw [Ideal.map_span, Set.image_singleton] + dsimp only [φ] + rw [map_natCast] + have hpI : (p : W) ∈ I := + Ideal.subset_span (Set.mem_singleton (p : W)) + have hmPos : 0 < m - 1 := by omega + have hpPowI : (p : W) ^ (m - 1) ∈ I := + I.pow_mem_of_mem hpI (m - 1) hmPos + have hcI : + (↑((padicValuationUnitToCompletedUnramifiedWittUnit p u)⁻¹) : W) * + (p : W) ^ (m - 1) ∈ I := + I.mul_mem_left + (↑((padicValuationUnitToCompletedUnramifiedWittUnit p u)⁻¹) : W) + hpPowI + intro n x hx + have hφxMap : φ x ∈ (I ^ n).map φ := + Ideal.mem_map_of_mem φ hx + have hφx : φ x ∈ I ^ n := by + rw [Ideal.map_pow φ I n, hφI] at hφxMap + exact hφxMap + have hmul : + ((↑((padicValuationUnitToCompletedUnramifiedWittUnit p u)⁻¹) : W) * + (p : W) ^ (m - 1)) * φ x ∈ I * I ^ n := + Ideal.mul_mem_mul hcI hφx + change + ((↑((padicValuationUnitToCompletedUnramifiedWittUnit p u)⁻¹) : W) * + (p : W) ^ (m - 1)) * φ x ∈ I ^ (n + 1) + rw [pow_succ, mul_comm (I ^ n) I] + exact hmul + +/-- Every coefficient equation of degree at least two in the p-adic +semilinear intertwiner has a unique solution in the completed-unramified +Witt ring. -/ +theorem existsUnique_padicChangedUniformizerCoefficient + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (m : ℕ) (hm : 2 ≤ m) + (b : padicCompletedUnramifiedWittRing p) : + ∃! a : padicCompletedUnramifiedWittRing p, + a = + b + + (↑((padicValuationUnitToCompletedUnramifiedWittUnit p u)⁻¹) : + padicCompletedUnramifiedWittRing p) * + (p : padicCompletedUnramifiedWittRing p) ^ (m - 1) * + WittVector.frobenius a := by + let I : Ideal (padicCompletedUnramifiedWittRing p) := + Ideal.span + ({(p : padicCompletedUnramifiedWittRing p)} : Set _) + change + ∃! a : padicCompletedUnramifiedWittRing p, + a = b + padicChangedUniformizerCoefficientOperator p u m a + exact + IsAdicComplete.existsUnique_eq_add_of_maps_pow_succ + I (padicChangedUniformizerCoefficientOperator p u m) + (padicChangedUniformizerCoefficientOperator_maps_pow_succ + p u m hm) + b + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner.lean new file mode 100644 index 0000000000..e36d55c0dc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.CompletedSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.DefectCorrection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.IntertwinerConstruction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarEndomorphisms + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/All.lean new file mode 100644 index 0000000000..bc805acb03 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/All.lean @@ -0,0 +1,20 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.CompletedSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.DefectCorrection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.IntertwinerConstruction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarEndomorphisms +/-! +# The p-adic changed-uniformizer intertwiner + +This aggregate exposes the completed series, defect correction, intertwiner +construction, scalar endomorphisms, and final semilinear compatibilities. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/CompletedSeries.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/CompletedSeries.lean new file mode 100644 index 0000000000..466bf81445 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/CompletedSeries.lean @@ -0,0 +1,207 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeSeries +/-! +# Completed p-adic Lubin--Tate series + +This module extends the multiplicative and changed-standard Lubin--Tate series to the completed +unramified Witt ring and records their coefficients and residue reductions. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open SameUniformizer + +/-- The multiplicative Lubin--Tate series after extending its coefficients +to the completed unramified Witt ring. -/ +noncomputable def padicCompletedMultiplicativeSeries + (p : ℕ) [Fact p.Prime] : + PowerSeries (padicCompletedUnramifiedWittRing p) := + PowerSeries.map + (padicValuationSubringToCompletedUnramifiedWittRing p) + (padicMultiplicativeLubinTateSeries p).toPowerSeries + +/-- The standard Lubin--Tate series for the changed uniformizer `u p`, +after extending its coefficients to the completed unramified Witt ring. -/ +noncomputable def padicCompletedChangedStandardSeries + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + PowerSeries (padicCompletedUnramifiedWittRing p) := + PowerSeries.map + (padicValuationSubringToCompletedUnramifiedWittRing p) + (standardLubinTateSeries + (standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u)).toPowerSeries + +/-- The completed multiplicative Lubin--Tate series is the binomial series +`(1 + X) ^ p - 1`. -/ +theorem padicCompletedMultiplicativeSeries_eq + (p : ℕ) [Fact p.Prime] : + padicCompletedMultiplicativeSeries p = + (1 + PowerSeries.X) ^ p - 1 := by + rw [padicCompletedMultiplicativeSeries, + LubinTateSeries.padicMultiplicativeLubinTateSeries_toPowerSeries, + PowerSeries.binomialSeries_nat] + simp only [map_sub, map_pow, map_add, map_one, PowerSeries.map_X] + +/-- The completed changed-standard series has linear coefficient `u p` and +degree-`p` term `X ^ p`. -/ +theorem padicCompletedChangedStandardSeries_eq + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + padicCompletedChangedStandardSeries p u = + PowerSeries.C + (((padicValuationUnitToCompletedUnramifiedWittUnit p u : + (padicCompletedUnramifiedWittRing p)ˣ) : padicCompletedUnramifiedWittRing p) * + (p : padicCompletedUnramifiedWittRing p)) * + PowerSeries.X + + PowerSeries.X ^ p := by + have hcard : + Nat.card (padicLocalField p).residueField = p := by + simpa [padicLocalField] using + padicCompleteDVF_residueField_card p + rw [padicCompletedChangedStandardSeries, + LubinTateSeries.standardLubinTateSeries_toPowerSeries] + simp only [standardLubinTatePowerSeries, + standardLubinTateChangedUniformizer, + map_add, map_mul, map_pow, PowerSeries.map_C, + PowerSeries.map_X, hcard] + have hcoeff : + padicValuationSubringToCompletedUnramifiedWittRing p + ((u : (padicLocalField p).valuationSubring) * + (show (padicLocalField p).valuationSubring from + padicIntEquivValuationSubring p (p : ℤ_[p]))) = + padicValuationSubringToCompletedUnramifiedWittRing p u * + (p : padicCompletedUnramifiedWittRing p) := + (map_mul (padicValuationSubringToCompletedUnramifiedWittRing p) + (u : (padicLocalField p).valuationSubring) + (show (padicLocalField p).valuationSubring from + padicIntEquivValuationSubring p (p : ℤ_[p]))).trans + (congrArg (fun z : padicCompletedUnramifiedWittRing p => + padicValuationSubringToCompletedUnramifiedWittRing p u * z) + (padicValuationSubringToCompletedUnramifiedWittRing_uniformizer p)) + exact congrArg (fun z : PowerSeries (padicCompletedUnramifiedWittRing p) => + z * PowerSeries.X + PowerSeries.X ^ p) + ((congrArg PowerSeries.C hcoeff).trans + (map_mul PowerSeries.C + (padicValuationSubringToCompletedUnramifiedWittRing p u) + (p : padicCompletedUnramifiedWittRing p))) + +theorem padicCompletedMultiplicativeSeries_constantCoeff + (p : ℕ) [Fact p.Prime] : + PowerSeries.constantCoeff + (padicCompletedMultiplicativeSeries p) = 0 := by + rw [← PowerSeries.coeff_zero_eq_constantCoeff, + padicCompletedMultiplicativeSeries, + PowerSeries.coeff_map, + PowerSeries.coeff_zero_eq_constantCoeff_apply] + exact + (congrArg (padicValuationSubringToCompletedUnramifiedWittRing p) + (padicMultiplicativeLubinTateSeries p).constantCoeff_eq_zero).trans + (map_zero (padicValuationSubringToCompletedUnramifiedWittRing p)) + +/-- The linear coefficient of the completed multiplicative series is `p`. -/ +theorem padicCompletedMultiplicativeSeries_coeff_one + (p : ℕ) [Fact p.Prime] : + PowerSeries.coeff 1 + (padicCompletedMultiplicativeSeries p) = + (p : padicCompletedUnramifiedWittRing p) := by + rw [padicCompletedMultiplicativeSeries, + PowerSeries.coeff_map] + exact + (congrArg (padicValuationSubringToCompletedUnramifiedWittRing p) + (padicMultiplicativeLubinTateSeries p).coeff_one_eq_uniformizer).trans + (padicValuationSubringToCompletedUnramifiedWittRing_uniformizer p) + +theorem padicCompletedChangedStandardSeries_constantCoeff + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + PowerSeries.constantCoeff + (padicCompletedChangedStandardSeries p u) = 0 := by + rw [← PowerSeries.coeff_zero_eq_constantCoeff, + padicCompletedChangedStandardSeries, + PowerSeries.coeff_map, + PowerSeries.coeff_zero_eq_constantCoeff_apply, + LubinTateSeries.constantCoeff_eq_zero, + map_zero] + +/-- The completed multiplicative Lubin--Tate series admits formal +substitution. -/ +theorem padicCompletedMultiplicativeSeries_hasSubst + (p : ℕ) [Fact p.Prime] : + PowerSeries.HasSubst (padicCompletedMultiplicativeSeries p) := + PowerSeries.HasSubst.of_constantCoeff_zero' + (padicCompletedMultiplicativeSeries_constantCoeff p) + +/-- The completed changed standard Lubin--Tate series admits formal +substitution. -/ +theorem padicCompletedChangedStandardSeries_hasSubst + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + PowerSeries.HasSubst (padicCompletedChangedStandardSeries p u) := + PowerSeries.HasSubst.of_constantCoeff_zero' + (padicCompletedChangedStandardSeries_constantCoeff p u) + +/-- Reduction of the completed multiplicative series modulo `p` is `X ^ p`. -/ +theorem padicCompletedMultiplicativeSeries_map_constantCoeff + (p : ℕ) [Fact p.Prime] : + PowerSeries.map WittVector.constantCoeff + (padicCompletedMultiplicativeSeries p) = + (PowerSeries.X : + PowerSeries (AlgebraicClosure (ZMod p))) ^ p := by + let : CharP (PowerSeries (AlgebraicClosure (ZMod p))) p := + charP_of_injective_ringHom PowerSeries.C_injective p + rw [padicCompletedMultiplicativeSeries_eq] + simp only [map_sub, map_pow, map_add, map_one, PowerSeries.map_X] + rw [add_pow_char] + simp + +/-- Reduction of the completed changed-standard series modulo `p` is +`X ^ p`. -/ +theorem padicCompletedChangedStandardSeries_map_constantCoeff + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + PowerSeries.map WittVector.constantCoeff + (padicCompletedChangedStandardSeries p u) = + (PowerSeries.X : + PowerSeries (AlgebraicClosure (ZMod p))) ^ p := by + let : CharP (PowerSeries (AlgebraicClosure (ZMod p))) p := + charP_of_injective_ringHom PowerSeries.C_injective p + rw [padicCompletedChangedStandardSeries_eq] + simp only [map_add, map_mul, map_pow, PowerSeries.map_C, + PowerSeries.map_X, map_natCast] + rw [CharP.cast_eq_zero (PowerSeries (AlgebraicClosure (ZMod p))) p] + simp + +/-- Coefficientwise Witt-vector Frobenius preserves a zero constant +coefficient. -/ +theorem padicChangedUniformizerFrobenius_constantCoeff_eq_zero + (p : ℕ) [Fact p.Prime] + (H : PowerSeries (padicCompletedUnramifiedWittRing p)) + (hH : PowerSeries.constantCoeff H = 0) : + PowerSeries.constantCoeff + (PowerSeries.map WittVector.frobenius H) = 0 := by + rw [← PowerSeries.coeff_zero_eq_constantCoeff, + PowerSeries.coeff_map, + PowerSeries.coeff_zero_eq_constantCoeff_apply, + hH, map_zero] + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/DefectCorrection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/DefectCorrection.lean new file mode 100644 index 0000000000..d2927c3802 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/DefectCorrection.lean @@ -0,0 +1,704 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.CompletedSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerCoefficient +public import Mathlib.RingTheory.PowerSeries.Expand +public import Mathlib.RingTheory.PowerSeries.Order +public import Mathlib.RingTheory.PowerSeries.Trunc +/-! +# Changed-uniformizer defect correction + +This module computes how a degreewise correction changes the semilinear substitution defect and + constructs the unique coefficient that kills that defect. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open SameUniformizer + +/-- The defect of a candidate changed-uniformizer intertwiner: the difference +between its Frobenius-twisted multiplicative substitution and its +changed-standard substitution. -/ +noncomputable def padicChangedUniformizerDefect + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (H : PowerSeries (padicCompletedUnramifiedWittRing p)) : + PowerSeries (padicCompletedUnramifiedWittRing p) := + PowerSeries.subst + (padicCompletedMultiplicativeSeries p) + (PowerSeries.map WittVector.frobenius H) - + PowerSeries.subst H + (padicCompletedChangedStandardSeries p u) + +/-- Reduction modulo `p` commutes with coefficientwise Witt-vector Frobenius +through residue-field Frobenius. -/ +theorem padicChangedUniformizerFrobenius_map_constantCoeff + (p : ℕ) [Fact p.Prime] + (H : PowerSeries (padicCompletedUnramifiedWittRing p)) : + PowerSeries.map WittVector.constantCoeff + (PowerSeries.map WittVector.frobenius H) = + PowerSeries.map + (frobenius (AlgebraicClosure (ZMod p)) p) + (PowerSeries.map WittVector.constantCoeff H) := by + apply PowerSeries.ext + intro n + simp [PowerSeries.coeff_map, WittVector.constantCoeff_apply, + WittVector.coeff_frobenius_charP, frobenius_def] + +/-- The changed-uniformizer defect vanishes after coefficientwise reduction +modulo `p`. -/ +theorem padicChangedUniformizerDefect_map_constantCoeff + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (H : PowerSeries (padicCompletedUnramifiedWittRing p)) + (hH : PowerSeries.constantCoeff H = 0) : + PowerSeries.map WittVector.constantCoeff + (padicChangedUniformizerDefect p u H) = 0 := by + have hM : + PowerSeries.HasSubst (padicCompletedMultiplicativeSeries p) := + PowerSeries.HasSubst.of_constantCoeff_zero' + (padicCompletedMultiplicativeSeries_constantCoeff p) + have hHsubst : PowerSeries.HasSubst H := + PowerSeries.HasSubst.of_constantCoeff_zero' hH + have hHbar : + PowerSeries.HasSubst + (PowerSeries.map WittVector.constantCoeff H) := + PowerSeries.HasSubst.of_constantCoeff_zero' (by + change WittVector.constantCoeff + (PowerSeries.constantCoeff H) = 0 + rw [hH, map_zero]) + rw [padicChangedUniformizerDefect, map_sub] + change + MvPowerSeries.map WittVector.constantCoeff + (PowerSeries.subst (padicCompletedMultiplicativeSeries p) + (PowerSeries.map WittVector.frobenius H)) - + MvPowerSeries.map WittVector.constantCoeff + (PowerSeries.subst H + (padicCompletedChangedStandardSeries p u)) = + 0 + rw [PowerSeries.map_subst hM, + PowerSeries.map_subst hHsubst] + change + PowerSeries.subst + (PowerSeries.map WittVector.constantCoeff + (padicCompletedMultiplicativeSeries p)) + (PowerSeries.map WittVector.constantCoeff + (PowerSeries.map WittVector.frobenius H)) - + PowerSeries.subst + (PowerSeries.map WittVector.constantCoeff H) + (PowerSeries.map WittVector.constantCoeff + (padicCompletedChangedStandardSeries p u)) = + 0 + rw [padicCompletedMultiplicativeSeries_map_constantCoeff, + padicCompletedChangedStandardSeries_map_constantCoeff, + padicChangedUniformizerFrobenius_map_constantCoeff] + rw [← PowerSeries.expand_apply, ← PowerSeries.map_expand] + change + MvPowerSeries.map + (frobenius (AlgebraicClosure (ZMod p)) p) + (MvPowerSeries.expand p (Fact.out : p.Prime).ne_zero + (PowerSeries.map WittVector.constantCoeff H)) - + PowerSeries.subst + (PowerSeries.map WittVector.constantCoeff H) + (PowerSeries.X ^ p) = + 0 + rw [MvPowerSeries.map_frobenius_expand p + (Fact.out : p.Prime).ne_zero] + rw [PowerSeries.subst_pow hHbar, + PowerSeries.subst_X hHbar] + exact sub_self _ + +/-- Every coefficient of the changed-uniformizer defect is divisible by +`p` in the completed unramified Witt ring. -/ +theorem padicChangedUniformizerDefect_coeff_mem_span_p + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (H : PowerSeries (padicCompletedUnramifiedWittRing p)) + (hH : PowerSeries.constantCoeff H = 0) + (m : ℕ) : + PowerSeries.coeff m (padicChangedUniformizerDefect p u H) ∈ + Ideal.span ({(p : padicCompletedUnramifiedWittRing p)} : Set _) := by + rw [← WittVector.ker_constantCoeff] + change + WittVector.constantCoeff + (PowerSeries.coeff m + (padicChangedUniformizerDefect p u H)) = 0 + rw [← PowerSeries.coeff_map, + padicChangedUniformizerDefect_map_constantCoeff p u H hH, + map_zero] + +private theorem exists_padicChangedUniformizerNormalizedDefect + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (H : PowerSeries (padicCompletedUnramifiedWittRing p)) + (hH : PowerSeries.constantCoeff H = 0) + (m : ℕ) : + ∃ b : padicCompletedUnramifiedWittRing p, + (p : padicCompletedUnramifiedWittRing p) * b = + PowerSeries.coeff m + (padicChangedUniformizerDefect p u H) := by + have hmem := + padicChangedUniformizerDefect_coeff_mem_span_p p u H hH m + rw [Ideal.mem_span_singleton] at hmem + rcases hmem with ⟨b, hb⟩ + exact ⟨b, hb.symm⟩ + +/-- The degree-`m` changed-uniformizer defect coefficient divided by `p`. -/ +noncomputable def padicChangedUniformizerNormalizedDefect + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (H : PowerSeries (padicCompletedUnramifiedWittRing p)) + (hH : PowerSeries.constantCoeff H = 0) + (m : ℕ) : + padicCompletedUnramifiedWittRing p := + Classical.choose + (show ∃ b : padicCompletedUnramifiedWittRing p, + (p : padicCompletedUnramifiedWittRing p) * b = + PowerSeries.coeff m (padicChangedUniformizerDefect p u H) from by + exact exists_padicChangedUniformizerNormalizedDefect p u H hH m) + +private theorem padicChangedUniformizerNormalizedDefect_spec + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (H : PowerSeries (padicCompletedUnramifiedWittRing p)) + (hH : PowerSeries.constantCoeff H = 0) + (m : ℕ) : + (p : padicCompletedUnramifiedWittRing p) * + padicChangedUniformizerNormalizedDefect p u H hH m = + PowerSeries.coeff m + (padicChangedUniformizerDefect p u H) := + Classical.choose_spec + (exists_padicChangedUniformizerNormalizedDefect p u H hH m) + +/-- The completed multiplicative Lubin--Tate series has order one. -/ +theorem padicCompletedMultiplicativeSeries_order + (p : ℕ) [Fact p.Prime] : + (padicCompletedMultiplicativeSeries p).order = 1 := by + apply PowerSeries.order_eq_nat.mpr + constructor + · rw [padicCompletedMultiplicativeSeries_coeff_one] + exact + WittVector.p_nonzero p (AlgebraicClosure (ZMod p)) + · intro i hi + have hi0 : i = 0 := by omega + subst i + simpa [PowerSeries.coeff_zero_eq_constantCoeff_apply] using + padicCompletedMultiplicativeSeries_constantCoeff p + +/-- The degree-`m` coefficient of the `m`-th power of the completed +multiplicative series is `p ^ m`. -/ +theorem padicCompletedMultiplicativeSeries_coeff_pow_self + (p : ℕ) [Fact p.Prime] (m : ℕ) : + PowerSeries.coeff m + ((padicCompletedMultiplicativeSeries p) ^ m) = + (p : padicCompletedUnramifiedWittRing p) ^ m := by + let M := padicCompletedMultiplicativeSeries p + have hMorder : M.order = 1 := + padicCompletedMultiplicativeSeries_order p + calc + PowerSeries.coeff m (M ^ m) = + PowerSeries.constantCoeff + (PowerSeries.divXPowOrder (M ^ m)) := by + rw [PowerSeries.constantCoeff_divXPowOrder, + PowerSeries.order_pow, hMorder] + simp + _ = + PowerSeries.constantCoeff + ((PowerSeries.divXPowOrder M) ^ m) := by + rw [PowerSeries.divXPowOrder_pow] + _ = + (PowerSeries.constantCoeff + (PowerSeries.divXPowOrder M)) ^ m := by + exact map_pow PowerSeries.constantCoeff _ _ + _ = (PowerSeries.coeff 1 M) ^ m := by + rw [PowerSeries.constantCoeff_divXPowOrder, hMorder] + rfl + _ = (p : padicCompletedUnramifiedWittRing p) ^ m := by + rw [padicCompletedMultiplicativeSeries_coeff_one] + +private theorem padicChangedUniformizer_coeff_pow_add_monomial + (p : ℕ) [Fact p.Prime] + (H : PowerSeries (padicCompletedUnramifiedWittRing p)) + (hH : PowerSeries.constantCoeff H = 0) + (m : ℕ) (hm : 2 ≤ m) + (c : padicCompletedUnramifiedWittRing p) : + PowerSeries.coeff m + ((H + PowerSeries.monomial m c) ^ p) = + PowerSeries.coeff m (H ^ p) := by + let N := PowerSeries.monomial m c + let A := H + N + have hm0 : m ≠ 0 := by omega + have hNconstant : PowerSeries.constantCoeff N = 0 := by + rw [← PowerSeries.coeff_zero_eq_constantCoeff, + PowerSeries.coeff_monomial, ite_eq_right (Ne.symm hm0)] + have hAconstant : PowerSeries.constantCoeff A = 0 := by + simp [A, hH, hNconstant] + let Q := + ∑ i ∈ Finset.range p, A ^ i * H ^ (p - 1 - i) + have hQ : + ((p - 1 : ℕ) : ℕ∞) ≤ Q.order := by + classical + have hterm : ∀ i ∈ Finset.range p, + ((p - 1 : ℕ) : ℕ∞) ≤ + (A ^ i * H ^ (p - 1 - i)).order := by + intro i hi + have hi' : i < p := Finset.mem_range.mp hi + calc + ((p - 1 : ℕ) : ℕ∞) = + (i : ℕ∞) + ((p - 1 - i : ℕ) : ℕ∞) := by + norm_cast + omega + _ ≤ (A ^ i).order + (H ^ (p - 1 - i)).order := + add_le_add + (PowerSeries.le_order_pow_of_constantCoeff_eq_zero + i hAconstant) + (PowerSeries.le_order_pow_of_constantCoeff_eq_zero + (p - 1 - i) hH) + _ ≤ (A ^ i * H ^ (p - 1 - i)).order := + PowerSeries.le_order_mul _ _ + have hsum (s : Finset ℕ) + (hs : ∀ i ∈ s, + ((p - 1 : ℕ) : ℕ∞) ≤ + (A ^ i * H ^ (p - 1 - i)).order) : + ((p - 1 : ℕ) : ℕ∞) ≤ + (∑ i ∈ s, A ^ i * H ^ (p - 1 - i)).order := by + induction s using Finset.induction_on with + | empty => simp + | @insert i s hi ih => + rw [Finset.sum_insert hi] + exact + (le_min + (hs i (Finset.mem_insert_self i s)) + (ih fun j hj => + hs j (Finset.mem_insert_of_mem hj))).trans + (PowerSeries.min_order_le_order_add _ _) + simpa only [Q] using hsum (Finset.range p) hterm + have hNorder : (m : ℕ∞) ≤ N.order := by + apply PowerSeries.nat_le_order + intro i hi + rw [PowerSeries.coeff_monomial, ite_eq_right] + exact Nat.ne_of_lt hi + have hfactor : + (A - H) * Q = A ^ p - H ^ p := by + exact (Commute.all A H).mul_geom_sum₂ p + have horder : + ((m + (p - 1) : ℕ) : ℕ∞) ≤ + (A ^ p - H ^ p).order := by + calc + ((m + (p - 1) : ℕ) : ℕ∞) = + (m : ℕ∞) + ((p - 1 : ℕ) : ℕ∞) := by + norm_cast + _ ≤ (A - H).order + Q.order := by + apply add_le_add + · simpa [A, N] using hNorder + · exact hQ + _ ≤ ((A - H) * Q).order := + PowerSeries.le_order_mul _ _ + _ = (A ^ p - H ^ p).order := by + rw [hfactor] + have hpTwo : 2 ≤ p := (Fact.out : p.Prime).two_le + have hltNat : m < m + (p - 1) := by omega + have hlt : + (m : ℕ∞) < (A ^ p - H ^ p).order := by + have hcast : + (m : ℕ∞) < ((m + (p - 1) : ℕ) : ℕ∞) := by + exact_mod_cast hltNat + exact hcast.trans_le horder + have hcoeff := + PowerSeries.coeff_of_lt_order m hlt + rw [map_sub, sub_eq_zero] at hcoeff + exact hcoeff + +/-- Substituting the completed multiplicative series into a monomial scales +its `m`-th power by the monomial coefficient. -/ +theorem padicChangedUniformizer_subst_monomial + (p : ℕ) [Fact p.Prime] + (m : ℕ) (c : padicCompletedUnramifiedWittRing p) : + PowerSeries.subst + (padicCompletedMultiplicativeSeries p) + (PowerSeries.monomial m c) = + PowerSeries.C c * + (padicCompletedMultiplicativeSeries p) ^ m := by + have hM : + PowerSeries.HasSubst (padicCompletedMultiplicativeSeries p) := + PowerSeries.HasSubst.of_constantCoeff_zero' + (padicCompletedMultiplicativeSeries_constantCoeff p) + rw [PowerSeries.monomial_eq_C_mul_X_pow, + PowerSeries.subst_mul hM, + PowerSeries.subst_C, + PowerSeries.subst_pow hM, + PowerSeries.subst_X hM] + rfl + +private theorem + padicChangedUniformizerFrobenius_add_monomial + (p : ℕ) [Fact p.Prime] + (H : PowerSeries (padicCompletedUnramifiedWittRing p)) + (m : ℕ) (c : padicCompletedUnramifiedWittRing p) : + PowerSeries.map WittVector.frobenius + (H + PowerSeries.monomial m c) = + PowerSeries.map WittVector.frobenius H + + PowerSeries.monomial m (WittVector.frobenius c) := by + apply PowerSeries.ext + intro i + by_cases hi : i = m + · subst i + simp [PowerSeries.coeff_map] + · simp [PowerSeries.coeff_map, PowerSeries.coeff_monomial, hi] + +private theorem padicChangedUniformizer_coeff_subst_frobenius_add_monomial + (p : ℕ) [Fact p.Prime] + (H : PowerSeries (padicCompletedUnramifiedWittRing p)) + (m : ℕ) (c : padicCompletedUnramifiedWittRing p) : + PowerSeries.coeff m + (PowerSeries.subst + (padicCompletedMultiplicativeSeries p) + (PowerSeries.map WittVector.frobenius + (H + PowerSeries.monomial m c))) = + PowerSeries.coeff m + (PowerSeries.subst + (padicCompletedMultiplicativeSeries p) + (PowerSeries.map WittVector.frobenius H)) + + (p : padicCompletedUnramifiedWittRing p) ^ m * + WittVector.frobenius c := by + have hM : + PowerSeries.HasSubst (padicCompletedMultiplicativeSeries p) := + PowerSeries.HasSubst.of_constantCoeff_zero' + (padicCompletedMultiplicativeSeries_constantCoeff p) + rw [padicChangedUniformizerFrobenius_add_monomial, + PowerSeries.subst_add hM, map_add, + padicChangedUniformizer_subst_monomial, + PowerSeries.coeff_C_mul, + padicCompletedMultiplicativeSeries_coeff_pow_self] + ring + +private theorem padicChangedUniformizer_coeff_subst_changed_add_monomial + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (H : PowerSeries (padicCompletedUnramifiedWittRing p)) + (hH : PowerSeries.constantCoeff H = 0) + (m : ℕ) (hm : 2 ≤ m) + (c : padicCompletedUnramifiedWittRing p) : + PowerSeries.coeff m + (PowerSeries.subst + (H + PowerSeries.monomial m c) + (padicCompletedChangedStandardSeries p u)) = + PowerSeries.coeff m + (PowerSeries.subst H + (padicCompletedChangedStandardSeries p u)) + + ((padicValuationUnitToCompletedUnramifiedWittUnit p u) : + padicCompletedUnramifiedWittRing p) * + (p : padicCompletedUnramifiedWittRing p) * c := by + let a : padicCompletedUnramifiedWittRing p := + (padicValuationUnitToCompletedUnramifiedWittUnit p u : + padicCompletedUnramifiedWittRing p) * (p : padicCompletedUnramifiedWittRing p) + let N := PowerSeries.monomial m c + let A := H + N + have hHsubst : PowerSeries.HasSubst H := + PowerSeries.HasSubst.of_constantCoeff_zero' hH + have hm0 : m ≠ 0 := by omega + have hNconstant : PowerSeries.constantCoeff N = 0 := by + rw [← PowerSeries.coeff_zero_eq_constantCoeff, + PowerSeries.coeff_monomial, ite_eq_right (Ne.symm hm0)] + have hAsubst : PowerSeries.HasSubst A := + PowerSeries.HasSubst.of_constantCoeff_zero' (by + change PowerSeries.constantCoeff H + + PowerSeries.constantCoeff N = 0 + rw [hH, hNconstant, zero_add]) + rw [padicCompletedChangedStandardSeries_eq, + PowerSeries.subst_add hAsubst, + PowerSeries.subst_mul hAsubst, + PowerSeries.subst_C, + PowerSeries.subst_X hAsubst, + PowerSeries.subst_pow hAsubst, + PowerSeries.subst_X hAsubst, + PowerSeries.subst_add hHsubst, + PowerSeries.subst_mul hHsubst, + PowerSeries.subst_C, + PowerSeries.subst_X hHsubst, + PowerSeries.subst_pow hHsubst, + PowerSeries.subst_X hHsubst] + change + PowerSeries.coeff m (PowerSeries.C a * A + A ^ p) = + PowerSeries.coeff m (PowerSeries.C a * H + H ^ p) + a * c + rw [map_add, map_add, PowerSeries.coeff_C_mul, + PowerSeries.coeff_C_mul] + change + a * PowerSeries.coeff m A + PowerSeries.coeff m (A ^ p) = + a * PowerSeries.coeff m H + PowerSeries.coeff m (H ^ p) + + a * c + rw [show PowerSeries.coeff m A = + PowerSeries.coeff m H + c by + simp [A, N], + padicChangedUniformizer_coeff_pow_add_monomial p H hH m hm c] + ring + +/-- Adding a monomial in degree `m` changes the degree-`m` defect by the +explicit Frobenius-linear correction term. -/ +theorem padicChangedUniformizerDefect_coeff_add_monomial + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (H : PowerSeries (padicCompletedUnramifiedWittRing p)) + (hH : PowerSeries.constantCoeff H = 0) + (m : ℕ) (hm : 2 ≤ m) + (c : padicCompletedUnramifiedWittRing p) : + PowerSeries.coeff m + (padicChangedUniformizerDefect p u + (H + PowerSeries.monomial m c)) = + PowerSeries.coeff m + (padicChangedUniformizerDefect p u H) + + (p : padicCompletedUnramifiedWittRing p) ^ m * + WittVector.frobenius c - + ((padicValuationUnitToCompletedUnramifiedWittUnit p u) : + padicCompletedUnramifiedWittRing p) * + (p : padicCompletedUnramifiedWittRing p) * c := by + rw [padicChangedUniformizerDefect, map_sub, + padicChangedUniformizer_coeff_subst_frobenius_add_monomial, + padicChangedUniformizer_coeff_subst_changed_add_monomial + p u H hH m hm c] + rw [padicChangedUniformizerDefect, map_sub] + ring + +/-- The unique coefficient that corrects the changed-uniformizer defect in +degree `m`. -/ +noncomputable def padicChangedUniformizerCorrectionCoefficient + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (H : PowerSeries (padicCompletedUnramifiedWittRing p)) + (hH : PowerSeries.constantCoeff H = 0) + (m : ℕ) (hm : 2 ≤ m) : + padicCompletedUnramifiedWittRing p := + Classical.choose + (existsUnique_padicChangedUniformizerCoefficient p u m hm + ((↑((padicValuationUnitToCompletedUnramifiedWittUnit p u)⁻¹) : + padicCompletedUnramifiedWittRing p) * + padicChangedUniformizerNormalizedDefect p u H hH m)) + +/-- The correction coefficient satisfies its defining Frobenius fixed-point +equation. -/ +theorem padicChangedUniformizerCorrectionCoefficient_spec + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (H : PowerSeries (padicCompletedUnramifiedWittRing p)) + (hH : PowerSeries.constantCoeff H = 0) + (m : ℕ) (hm : 2 ≤ m) : + padicChangedUniformizerCorrectionCoefficient p u H hH m hm = + (↑((padicValuationUnitToCompletedUnramifiedWittUnit p u)⁻¹) : + padicCompletedUnramifiedWittRing p) * + padicChangedUniformizerNormalizedDefect p u H hH m + + (↑((padicValuationUnitToCompletedUnramifiedWittUnit p u)⁻¹) : + padicCompletedUnramifiedWittRing p) * + (p : padicCompletedUnramifiedWittRing p) ^ (m - 1) * + WittVector.frobenius + (padicChangedUniformizerCorrectionCoefficient + p u H hH m hm) := + (Classical.choose_spec + (existsUnique_padicChangedUniformizerCoefficient p u m hm + ((↑((padicValuationUnitToCompletedUnramifiedWittUnit p u)⁻¹) : + padicCompletedUnramifiedWittRing p) * + padicChangedUniformizerNormalizedDefect p u H hH m))).1 + +/-- Adding the correction coefficient in degree `m` kills the degree-`m` +defect. -/ +theorem padicChangedUniformizerCorrectionCoefficient_kills_defect + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (H : PowerSeries (padicCompletedUnramifiedWittRing p)) + (hH : PowerSeries.constantCoeff H = 0) + (m : ℕ) (hm : 2 ≤ m) : + PowerSeries.coeff m + (padicChangedUniformizerDefect p u + (H + PowerSeries.monomial m + (padicChangedUniformizerCorrectionCoefficient + p u H hH m hm))) = 0 := by + let V : (padicCompletedUnramifiedWittRing p)ˣ := + padicValuationUnitToCompletedUnramifiedWittUnit p u + let b := + padicChangedUniformizerNormalizedDefect p u H hH m + let c := + padicChangedUniformizerCorrectionCoefficient p u H hH m hm + rw [padicChangedUniformizerDefect_coeff_add_monomial + p u H hH m hm c, + ← padicChangedUniformizerNormalizedDefect_spec p u H hH m] + have hc := + padicChangedUniformizerCorrectionCoefficient_spec + p u H hH m hm + change c = + (↑(V⁻¹) : padicCompletedUnramifiedWittRing p) * b + + (↑(V⁻¹) : padicCompletedUnramifiedWittRing p) * + (p : padicCompletedUnramifiedWittRing p) ^ (m - 1) * + WittVector.frobenius c at hc + have hc' : + (V : padicCompletedUnramifiedWittRing p) * c = + b + (p : padicCompletedUnramifiedWittRing p) ^ (m - 1) * + WittVector.frobenius c := by + calc + (V : padicCompletedUnramifiedWittRing p) * c = + (V : padicCompletedUnramifiedWittRing p) * + ((↑(V⁻¹) : padicCompletedUnramifiedWittRing p) * b + + (↑(V⁻¹) : padicCompletedUnramifiedWittRing p) * + (p : padicCompletedUnramifiedWittRing p) ^ (m - 1) * + WittVector.frobenius c) := + congrArg (fun z : padicCompletedUnramifiedWittRing p => + (V : padicCompletedUnramifiedWittRing p) * z) hc + _ = b + (p : padicCompletedUnramifiedWittRing p) ^ (m - 1) * + WittVector.frobenius c := by + simp [mul_add, mul_assoc] + have hpow : + (p : padicCompletedUnramifiedWittRing p) ^ m = + (p : padicCompletedUnramifiedWittRing p) ^ (m - 1) * + (p : padicCompletedUnramifiedWittRing p) := by + calc + (p : padicCompletedUnramifiedWittRing p) ^ m = + (p : padicCompletedUnramifiedWittRing p) ^ ((m - 1) + 1) := by + congr 1 + omega + _ = (p : padicCompletedUnramifiedWittRing p) ^ (m - 1) * + (p : padicCompletedUnramifiedWittRing p) := by + rw [pow_succ] + rw [show + (V : padicCompletedUnramifiedWittRing p) * + (p : padicCompletedUnramifiedWittRing p) * c = + (p : padicCompletedUnramifiedWittRing p) * + ((V : padicCompletedUnramifiedWittRing p) * c) by ring, + hc', hpow] + ring + +/-- Two one-variable power series have the same total truncation through +degree `m` when their coefficients agree through degree `m`. -/ +theorem powerSeries_truncTotal_succ_eq_of_coeff_eq_le + {R : Type*} [CommRing R] + {H H' : PowerSeries R} (m : ℕ) + (hcoeff : ∀ q : ℕ, q ≤ m → + PowerSeries.coeff q H = PowerSeries.coeff q H') : + H.truncTotal (m + 1) = H'.truncTotal (m + 1) := by + ext d + by_cases hd : d.degree < m + 1 + · rw [MvPowerSeries.coeff_truncTotal H hd, + MvPowerSeries.coeff_truncTotal H' hd] + have hdegree : d.degree = d () := + Finset.sum_eq_single () (by simp) (by simp) + simpa only [PowerSeries.coeff_def (R := R) (s := d) rfl] using + hcoeff (d ()) (by omega) + · rw [MvPowerSeries.coeff_truncTotal_eq_zero H (not_lt.mp hd), + MvPowerSeries.coeff_truncTotal_eq_zero H' (not_lt.mp hd)] + +/-- The degree-`m` defect depends only on coefficients through degree `m`. -/ +theorem padicChangedUniformizerDefect_coeff_eq_of_coeff_eq_le + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + {H H' : PowerSeries (padicCompletedUnramifiedWittRing p)} + (hH : PowerSeries.constantCoeff H = 0) + (hH' : PowerSeries.constantCoeff H' = 0) + (m : ℕ) + (hcoeff : ∀ q : ℕ, q ≤ m → + PowerSeries.coeff q H = PowerSeries.coeff q H') : + PowerSeries.coeff m + (padicChangedUniformizerDefect p u H) = + PowerSeries.coeff m + (padicChangedUniformizerDefect p u H') := by + let M := padicCompletedMultiplicativeSeries p + let E := padicCompletedChangedStandardSeries p u + let ΦH := PowerSeries.map WittVector.frobenius H + let ΦH' := PowerSeries.map WittVector.frobenius H' + let k := m + 1 + have htruncH : H.truncTotal k = H'.truncTotal k := + powerSeries_truncTotal_succ_eq_of_coeff_eq_le m hcoeff + have hcoeffΦ : ∀ q : ℕ, q ≤ m → + PowerSeries.coeff q ΦH = PowerSeries.coeff q ΦH' := by + intro q hq + simp [ΦH, ΦH', PowerSeries.coeff_map, hcoeff q hq] + have htruncΦ : ΦH.truncTotal k = ΦH'.truncTotal k := + powerSeries_truncTotal_succ_eq_of_coeff_eq_le m hcoeffΦ + have hHsubst : PowerSeries.HasSubst H := + PowerSeries.HasSubst.of_constantCoeff_zero' hH + have hH'subst : PowerSeries.HasSubst H' := + PowerSeries.HasSubst.of_constantCoeff_zero' hH' + have hMconstant : PowerSeries.constantCoeff M = 0 := + padicCompletedMultiplicativeSeries_constantCoeff p + have hleft : + (PowerSeries.subst H E).truncTotal k = + (PowerSeries.subst H' E).truncTotal k := by + change + (MvPowerSeries.subst (fun _ : Unit ↦ H) E).truncTotal k = + (MvPowerSeries.subst (fun _ : Unit ↦ H') E).truncTotal k + calc + (MvPowerSeries.subst (fun _ : Unit ↦ H) E).truncTotal k = + (MvPowerSeries.subst + (fun _ : Unit ↦ (H.truncTotal k).toMvPowerSeries) + E).truncTotal k := by + exact + MvPowerSeries.truncTotal_subst_eq_truncTotal_subst_truncTotal_of_le + (f := E) (a := fun _ : Unit ↦ H) + (x := fun _ : Unit ↦ k) hHsubst.const (fun _ ↦ le_rfl) + _ = (MvPowerSeries.subst + (fun _ : Unit ↦ (H'.truncTotal k).toMvPowerSeries) + E).truncTotal k := by + rw [htruncH] + _ = (MvPowerSeries.subst (fun _ : Unit ↦ H') E).truncTotal k := by + exact + (MvPowerSeries.truncTotal_subst_eq_truncTotal_subst_truncTotal_of_le + (f := E) (a := fun _ : Unit ↦ H') + (x := fun _ : Unit ↦ k) hH'subst.const + (fun _ ↦ le_rfl)).symm + have hright : + (PowerSeries.subst M ΦH).truncTotal k = + (PowerSeries.subst M ΦH').truncTotal k := by + change + (MvPowerSeries.subst (fun _ : Unit ↦ M) ΦH).truncTotal k = + (MvPowerSeries.subst (fun _ : Unit ↦ M) ΦH').truncTotal k + calc + (MvPowerSeries.subst (fun _ : Unit ↦ M) ΦH).truncTotal k = + (MvPowerSeries.subst (fun _ : Unit ↦ M) + (ΦH.truncTotal k).toMvPowerSeries).truncTotal k := by + exact + MvPowerSeries.truncTotal_subst_eq_truncTotal_truncTotal_subst + (f := ΦH) (a := fun _ : Unit ↦ M) + (fun _ ↦ hMconstant) + _ = (MvPowerSeries.subst (fun _ : Unit ↦ M) + (ΦH'.truncTotal k).toMvPowerSeries).truncTotal k := by + rw [htruncΦ] + _ = (MvPowerSeries.subst (fun _ : Unit ↦ M) ΦH').truncTotal k := by + exact + (MvPowerSeries.truncTotal_subst_eq_truncTotal_truncTotal_subst + (f := ΦH') (a := fun _ : Unit ↦ M) + (fun _ ↦ hMconstant)).symm + have hdefect : + (padicChangedUniformizerDefect p u H).truncTotal k = + (padicChangedUniformizerDefect p u H').truncTotal k := by + unfold padicChangedUniformizerDefect + rw [map_sub, map_sub, hright, hleft] + have hmDegree : + (Finsupp.single () m).degree < k := by + simp [k] + calc + PowerSeries.coeff m + (padicChangedUniformizerDefect p u H) = + MvPowerSeries.coeff (Finsupp.single () m) + ((padicChangedUniformizerDefect p u H).truncTotal k) := + (MvPowerSeries.coeff_truncTotal + (padicChangedUniformizerDefect p u H) hmDegree).symm + _ = MvPowerSeries.coeff (Finsupp.single () m) + ((padicChangedUniformizerDefect p u H').truncTotal k) := by + rw [hdefect] + _ = PowerSeries.coeff m + (padicChangedUniformizerDefect p u H') := + MvPowerSeries.coeff_truncTotal + (padicChangedUniformizerDefect p u H') hmDegree + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/IntertwinerConstruction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/IntertwinerConstruction.lean new file mode 100644 index 0000000000..ac19a0e5a4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/IntertwinerConstruction.lean @@ -0,0 +1,620 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.DefectCorrection +/-! +# Changed-uniformizer intertwiner construction + +This module builds compatible finite-degree approximations, assembles the changed-uniformizer + intertwiner, proves its functional equation, and establishes uniqueness. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open SameUniformizer + +/-- A finite correction stage with zero constant term and the prescribed linear coefficient. -/ +structure PadicChangedUniformizerApproximation + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) where + /-- The power series at this correction stage. -/ + series : PowerSeries (padicCompletedUnramifiedWittRing p) + /-- Every correction preserves the zero constant term. -/ + constantCoeff_eq_zero : + PowerSeries.constantCoeff series = 0 + /-- Every correction preserves the selected linear coefficient. -/ + coeff_one_eq : + PowerSeries.coeff 1 series = + (padicChangedUniformizerLinearCoefficient p u : + padicCompletedUnramifiedWittRing p) + +/-- Successive higher-degree corrections to the linear changed-uniformizer series. -/ +noncomputable def padicChangedUniformizerApproximation + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + ℕ → PadicChangedUniformizerApproximation p u + | 0 => + { series := + PowerSeries.monomial 1 + (padicChangedUniformizerLinearCoefficient p u : + padicCompletedUnramifiedWittRing p) + constantCoeff_eq_zero := by + rw [← PowerSeries.coeff_zero_eq_constantCoeff, + PowerSeries.coeff_monomial] + simp + coeff_one_eq := by simp } + | n + 1 => + let A := padicChangedUniformizerApproximation p u n + let m := n + 2 + let c := + padicChangedUniformizerCorrectionCoefficient + p u A.series A.constantCoeff_eq_zero m (by omega) + { series := A.series + PowerSeries.monomial m c + constantCoeff_eq_zero := by + rw [map_add, A.constantCoeff_eq_zero, + ← PowerSeries.coeff_zero_eq_constantCoeff, + PowerSeries.coeff_monomial] + simp [m] + coeff_one_eq := by + rw [map_add, A.coeff_one_eq, + PowerSeries.coeff_monomial] + simp [m] } + +private theorem padicChangedUniformizerApproximation_succ + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (n : ℕ) : + (padicChangedUniformizerApproximation p u (n + 1)).series = + (padicChangedUniformizerApproximation p u n).series + + PowerSeries.monomial (n + 2) + (padicChangedUniformizerCorrectionCoefficient p u + (padicChangedUniformizerApproximation p u n).series + (padicChangedUniformizerApproximation p u n).constantCoeff_eq_zero + (n + 2) (by omega)) := + rfl + +private theorem + padicChangedUniformizerApproximation_coeff_succ_eq_of_lt + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (n q : ℕ) (hq : q < n + 2) : + PowerSeries.coeff q + (padicChangedUniformizerApproximation p u (n + 1)).series = + PowerSeries.coeff q + (padicChangedUniformizerApproximation p u n).series := by + rw [padicChangedUniformizerApproximation_succ, map_add, + PowerSeries.coeff_monomial, ite_eq_right (Nat.ne_of_lt hq)] + exact add_zero _ + +private theorem padicChangedUniformizerApproximation_coeff_eq_of_le + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (q : ℕ) {a b : ℕ} (hab : a ≤ b) + (hq : q < a + 2) : + PowerSeries.coeff q + (padicChangedUniformizerApproximation p u b).series = + PowerSeries.coeff q + (padicChangedUniformizerApproximation p u a).series := by + induction b, hab using Nat.le_induction with + | base => rfl + | succ b hab ih => + rw [padicChangedUniformizerApproximation_coeff_succ_eq_of_lt + p u b q (by omega)] + exact ih + +private theorem + padicChangedUniformizerApproximation_succ_defect_coeff + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (n : ℕ) : + PowerSeries.coeff (n + 2) + (padicChangedUniformizerDefect p u + (padicChangedUniformizerApproximation p u (n + 1)).series) = + 0 := by + rw [padicChangedUniformizerApproximation_succ] + exact + padicChangedUniformizerCorrectionCoefficient_kills_defect + p u + (padicChangedUniformizerApproximation p u n).series + (padicChangedUniformizerApproximation p u n).constantCoeff_eq_zero + (n + 2) (by omega) + +/-- The actual semilinear changed-uniformizer series over the completed +unramified Witt ring. -/ +noncomputable def padicChangedUniformizerIntertwiner + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + PowerSeries (padicCompletedUnramifiedWittRing p) := + PowerSeries.mk fun m => + PowerSeries.coeff m + (padicChangedUniformizerApproximation p u m).series + +@[simp] +theorem padicChangedUniformizerIntertwiner_coeff + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (m : ℕ) : + PowerSeries.coeff m + (padicChangedUniformizerIntertwiner p u) = + PowerSeries.coeff m + (padicChangedUniformizerApproximation p u m).series := by + simp [padicChangedUniformizerIntertwiner] + +theorem padicChangedUniformizerIntertwiner_constantCoeff + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + PowerSeries.constantCoeff + (padicChangedUniformizerIntertwiner p u) = 0 := by + rw [← PowerSeries.coeff_zero_eq_constantCoeff, + padicChangedUniformizerIntertwiner_coeff] + simpa only [PowerSeries.coeff_zero_eq_constantCoeff_apply] using + (padicChangedUniformizerApproximation p u 0).constantCoeff_eq_zero + +theorem padicChangedUniformizerIntertwiner_coeff_one + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + PowerSeries.coeff 1 + (padicChangedUniformizerIntertwiner p u) = + (padicChangedUniformizerLinearCoefficient p u : + padicCompletedUnramifiedWittRing p) := by + rw [padicChangedUniformizerIntertwiner_coeff] + exact + (padicChangedUniformizerApproximation p u 1).coeff_one_eq + +theorem padicChangedUniformizerIntertwiner_hasSubst + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + PowerSeries.HasSubst + (padicChangedUniformizerIntertwiner p u) := + PowerSeries.HasSubst.of_constantCoeff_zero' + (padicChangedUniformizerIntertwiner_constantCoeff p u) + +private theorem padicChangedUniformizerIntertwiner_coeff_eq_approximation + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (q a : ℕ) (hq : q < a + 2) : + PowerSeries.coeff q + (padicChangedUniformizerIntertwiner p u) = + PowerSeries.coeff q + (padicChangedUniformizerApproximation p u a).series := by + rw [padicChangedUniformizerIntertwiner_coeff] + by_cases hqa : q ≤ a + · exact + (padicChangedUniformizerApproximation_coeff_eq_of_le + p u q (a := q) (b := a) hqa (by omega)).symm + · have haq : a + 1 = q := by omega + subst q + rw [padicChangedUniformizerApproximation_coeff_succ_eq_of_lt + p u a (a + 1) (by omega)] + +private theorem padicChangedUniformizerDefect_coeff_zero + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + PowerSeries.coeff 0 + (padicChangedUniformizerDefect p u + (padicChangedUniformizerIntertwiner p u)) = 0 := by + let H := padicChangedUniformizerIntertwiner p u + have hH := padicChangedUniformizerIntertwiner_constantCoeff p u + have hM := padicCompletedMultiplicativeSeries_constantCoeff p + have hE := padicCompletedChangedStandardSeries_constantCoeff p u + have hΦ : + PowerSeries.constantCoeff + (PowerSeries.map WittVector.frobenius H) = 0 := + padicChangedUniformizerFrobenius_constantCoeff_eq_zero p H hH + rw [PowerSeries.coeff_zero_eq_constantCoeff_apply, + padicChangedUniformizerDefect, map_sub] + change + MvPowerSeries.constantCoeff + (PowerSeries.subst + (padicCompletedMultiplicativeSeries p) + (PowerSeries.map WittVector.frobenius H)) - + MvPowerSeries.constantCoeff + (PowerSeries.subst H + (padicCompletedChangedStandardSeries p u)) = 0 + rw [PowerSeries.constantCoeff_subst_eq_zero hM + (PowerSeries.map WittVector.frobenius H) hΦ, + PowerSeries.constantCoeff_subst_eq_zero hH + (padicCompletedChangedStandardSeries p u) hE, + sub_zero] + +private theorem padicChangedUniformizerDefect_coeff_one + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + PowerSeries.coeff 1 + (padicChangedUniformizerDefect p u + (padicChangedUniformizerIntertwiner p u)) = 0 := by + let ε : padicCompletedUnramifiedWittRing p := + (padicChangedUniformizerLinearCoefficient p u : + padicCompletedUnramifiedWittRing p) + let V : (padicCompletedUnramifiedWittRing p)ˣ := + padicValuationUnitToCompletedUnramifiedWittUnit p u + let H := padicChangedUniformizerIntertwiner p u + have hH := padicChangedUniformizerIntertwiner_constantCoeff p u + have hcoeff := + padicChangedUniformizerIntertwiner_coeff_one p u + have hlinear := + padicChangedUniformizerLinearCoefficient_frobenius p u + have hcongr : + PowerSeries.coeff 1 + (padicChangedUniformizerDefect p u H) = + PowerSeries.coeff 1 + (padicChangedUniformizerDefect p u + (PowerSeries.monomial 1 ε)) := by + apply padicChangedUniformizerDefect_coeff_eq_of_coeff_eq_le + p u hH + · rw [← PowerSeries.coeff_zero_eq_constantCoeff, + PowerSeries.coeff_monomial] + simp + · intro q hq + interval_cases q + · rw [PowerSeries.coeff_zero_eq_constantCoeff_apply, hH, + PowerSeries.coeff_monomial] + simp + · simpa [H, ε] using hcoeff + let P : PowerSeries (padicCompletedUnramifiedWittRing p) := + PowerSeries.monomial 1 ε + have hPconstant : PowerSeries.constantCoeff P = 0 := by + rw [← PowerSeries.coeff_zero_eq_constantCoeff, + PowerSeries.coeff_monomial] + simp + have hPsubst : PowerSeries.HasSubst P := + PowerSeries.HasSubst.of_constantCoeff_zero' hPconstant + have hΦP : + PowerSeries.map WittVector.frobenius P = + PowerSeries.monomial 1 (WittVector.frobenius ε) := by + apply PowerSeries.ext + intro q + rw [PowerSeries.coeff_map] + change + WittVector.frobenius + (PowerSeries.coeff q (PowerSeries.monomial 1 ε)) = + PowerSeries.coeff q + (PowerSeries.monomial 1 (WittVector.frobenius ε)) + rw [PowerSeries.coeff_monomial, PowerSeries.coeff_monomial] + by_cases hq : q = 1 + · simp [hq] + · simp [hq] + have hright : + PowerSeries.coeff 1 + (PowerSeries.subst (padicCompletedMultiplicativeSeries p) + (PowerSeries.map WittVector.frobenius P)) = + WittVector.frobenius ε * (p : padicCompletedUnramifiedWittRing p) := by + rw [hΦP, padicChangedUniformizer_subst_monomial, + PowerSeries.coeff_C_mul, + padicCompletedMultiplicativeSeries_coeff_pow_self] + simp + have hleft : + PowerSeries.coeff 1 + (PowerSeries.subst P + (padicCompletedChangedStandardSeries p u)) = + ((V : padicCompletedUnramifiedWittRing p) * (p : padicCompletedUnramifiedWittRing p)) * + ε := by + rw [padicCompletedChangedStandardSeries_eq, + PowerSeries.subst_add hPsubst, + PowerSeries.subst_mul hPsubst, + PowerSeries.subst_C, + PowerSeries.subst_X hPsubst, + PowerSeries.subst_pow hPsubst, + PowerSeries.subst_X hPsubst, + map_add] + change + PowerSeries.coeff 1 + (PowerSeries.C + ((V : padicCompletedUnramifiedWittRing p) * + (p : padicCompletedUnramifiedWittRing p)) * P) + + PowerSeries.coeff 1 (P ^ p) = + (V : padicCompletedUnramifiedWittRing p) * (p : padicCompletedUnramifiedWittRing p) * ε + rw [PowerSeries.coeff_C_mul] + have hpOne : 1 ≠ p := (Fact.out : p.Prime).one_lt.ne + have hpOneMul : 1 ≠ p * 1 := by + simpa only [mul_one] using hpOne + rw [show P = PowerSeries.monomial 1 ε from rfl, + PowerSeries.coeff_monomial, ite_eq_left rfl, + PowerSeries.monomial_pow, PowerSeries.coeff_monomial, + ite_eq_right hpOneMul] + ring + rw [hcongr, padicChangedUniformizerDefect, map_sub, + hright, hleft] + change WittVector.frobenius ε * (p : padicCompletedUnramifiedWittRing p) - + ((V : padicCompletedUnramifiedWittRing p) * (p : padicCompletedUnramifiedWittRing p)) * ε = 0 + change WittVector.frobenius ε = ε * (V : padicCompletedUnramifiedWittRing p) at hlinear + rw [hlinear] + ring + +private theorem padicChangedUniformizerDefect_coeff_succ_succ + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (n : ℕ) : + PowerSeries.coeff (n + 2) + (padicChangedUniformizerDefect p u + (padicChangedUniformizerIntertwiner p u)) = 0 := by + let H := padicChangedUniformizerIntertwiner p u + let A := padicChangedUniformizerApproximation p u (n + 1) + calc + PowerSeries.coeff (n + 2) + (padicChangedUniformizerDefect p u H) = + PowerSeries.coeff (n + 2) + (padicChangedUniformizerDefect p u A.series) := by + apply padicChangedUniformizerDefect_coeff_eq_of_coeff_eq_le + p u + (padicChangedUniformizerIntertwiner_constantCoeff p u) + A.constantCoeff_eq_zero + intro q hq + exact + padicChangedUniformizerIntertwiner_coeff_eq_approximation + p u q (n + 1) (by omega) + _ = 0 := + padicChangedUniformizerApproximation_succ_defect_coeff p u n + +/-- The completed changed standard series after the actual intertwiner is +the Frobenius transform of the intertwiner after the multiplicative +series. This is the first changed-uniformizer identity. -/ +theorem padicChangedUniformizerIntertwiner_functionalEquation + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + PowerSeries.subst + (padicChangedUniformizerIntertwiner p u) + (PowerSeries.map + (padicValuationSubringToCompletedUnramifiedWittRing p) + (standardLubinTateSeries + (standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u)).toPowerSeries) = + PowerSeries.subst + (PowerSeries.map + (padicValuationSubringToCompletedUnramifiedWittRing p) + (padicMultiplicativeLubinTateSeries p).toPowerSeries) + (PowerSeries.map WittVector.frobenius + (padicChangedUniformizerIntertwiner p u)) := by + change + PowerSeries.subst + (padicChangedUniformizerIntertwiner p u) + (padicCompletedChangedStandardSeries p u) = + PowerSeries.subst + (padicCompletedMultiplicativeSeries p) + (PowerSeries.map WittVector.frobenius + (padicChangedUniformizerIntertwiner p u)) + rw [← sub_eq_zero] + apply PowerSeries.ext + intro m + rw [map_sub, map_zero] + have hrewrite : + PowerSeries.coeff m + (PowerSeries.subst + (padicChangedUniformizerIntertwiner p u) + (padicCompletedChangedStandardSeries p u)) - + PowerSeries.coeff m + (PowerSeries.subst + (padicCompletedMultiplicativeSeries p) + (PowerSeries.map WittVector.frobenius + (padicChangedUniformizerIntertwiner p u))) = + -PowerSeries.coeff m + (padicChangedUniformizerDefect p u + (padicChangedUniformizerIntertwiner p u)) := by + unfold padicChangedUniformizerDefect + rw [map_sub] + ring + rw [hrewrite] + cases m with + | zero => + rw [padicChangedUniformizerDefect_coeff_zero, neg_zero] + | succ m => + cases m with + | zero => + rw [padicChangedUniformizerDefect_coeff_one, neg_zero] + | succ n => + rw [show n + 1 + 1 = n + 2 by omega, + padicChangedUniformizerDefect_coeff_succ_succ, neg_zero] + +/-- A zero-constant-coefficient solution of the changed-uniformizer +functional equation is determined by its linear coefficient. -/ +theorem padicChangedUniformizerIntertwiner_unique + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + {H H' : PowerSeries (padicCompletedUnramifiedWittRing p)} + (hHconstant : PowerSeries.constantCoeff H = 0) + (hH'fixedValue : PowerSeries.constantCoeff H' = 0) + (hlinear : + PowerSeries.coeff 1 H = PowerSeries.coeff 1 H') + (hH : + PowerSeries.subst H + (padicCompletedChangedStandardSeries p u) = + PowerSeries.subst + (padicCompletedMultiplicativeSeries p) + (PowerSeries.map WittVector.frobenius H)) + (hH' : + PowerSeries.subst H' + (padicCompletedChangedStandardSeries p u) = + PowerSeries.subst + (padicCompletedMultiplicativeSeries p) + (PowerSeries.map WittVector.frobenius H')) : + H = H' := by + have hHdefect : + padicChangedUniformizerDefect p u H = 0 := by + rw [padicChangedUniformizerDefect, hH, sub_self] + have hH'defect : + padicChangedUniformizerDefect p u H' = 0 := by + rw [padicChangedUniformizerDefect, hH', sub_self] + apply PowerSeries.ext + intro m + induction m using Nat.strongRecOn with + | ind m ih => + by_cases hm0 : m = 0 + · subst m + simp only [PowerSeries.coeff_zero_eq_constantCoeff_apply, + hHconstant, hH'fixedValue] + by_cases hm1 : m = 1 + · subst m + exact hlinear + have hm : 2 ≤ m := by omega + let c : padicCompletedUnramifiedWittRing p := + PowerSeries.coeff m H - PowerSeries.coeff m H' + let A : PowerSeries (padicCompletedUnramifiedWittRing p) := + H' + PowerSeries.monomial m c + have hAconstant : PowerSeries.constantCoeff A = 0 := by + change PowerSeries.constantCoeff H' + + PowerSeries.constantCoeff (PowerSeries.monomial m c) = 0 + rw [hH'fixedValue, + ← PowerSeries.coeff_zero_eq_constantCoeff, + PowerSeries.coeff_monomial, ite_eq_right (Ne.symm hm0), + zero_add] + have hcoeff : + ∀ q : ℕ, q ≤ m → + PowerSeries.coeff q H = PowerSeries.coeff q A := by + intro q hqm + by_cases hq : q = m + · subst q + change PowerSeries.coeff m H = + PowerSeries.coeff m H' + + PowerSeries.coeff m (PowerSeries.monomial m c) + rw [PowerSeries.coeff_monomial, ite_eq_left rfl] + dsimp only [c] + ring + · have hqLt : q < m := lt_of_le_of_ne hqm hq + change PowerSeries.coeff q H = + PowerSeries.coeff q H' + + PowerSeries.coeff q (PowerSeries.monomial m c) + rw [PowerSeries.coeff_monomial, ite_eq_right hq] + simp only [add_zero] + exact ih q hqLt + have hdefectA : + PowerSeries.coeff m + (padicChangedUniformizerDefect p u A) = + 0 := by + calc + PowerSeries.coeff m + (padicChangedUniformizerDefect p u A) = + PowerSeries.coeff m + (padicChangedUniformizerDefect p u H) := by + symm + exact + padicChangedUniformizerDefect_coeff_eq_of_coeff_eq_le + p u hHconstant hAconstant m hcoeff + _ = 0 := by rw [hHdefect, map_zero] + have hcHomogeneous : + (p : padicCompletedUnramifiedWittRing p) ^ m * + WittVector.frobenius c - + ((padicValuationUnitToCompletedUnramifiedWittUnit p u) : + padicCompletedUnramifiedWittRing p) * + (p : padicCompletedUnramifiedWittRing p) * c = + 0 := by + have hformula := + padicChangedUniformizerDefect_coeff_add_monomial + p u H' hH'fixedValue m hm c + change + PowerSeries.coeff m + (padicChangedUniformizerDefect p u A) = + PowerSeries.coeff m + (padicChangedUniformizerDefect p u H') + + (p : padicCompletedUnramifiedWittRing p) ^ m * + WittVector.frobenius c - + ((padicValuationUnitToCompletedUnramifiedWittUnit p u) : + padicCompletedUnramifiedWittRing p) * + (p : padicCompletedUnramifiedWittRing p) * c at hformula + rw [hdefectA, hH'defect, map_zero, + zero_add] at hformula + exact hformula.symm + let V : (padicCompletedUnramifiedWittRing p)ˣ := + padicValuationUnitToCompletedUnramifiedWittUnit p u + have hpne : (p : padicCompletedUnramifiedWittRing p) ≠ 0 := + WittVector.p_nonzero p (AlgebraicClosure (ZMod p)) + have hpow : + (p : padicCompletedUnramifiedWittRing p) ^ m = + (p : padicCompletedUnramifiedWittRing p) ^ (m - 1) * + (p : padicCompletedUnramifiedWittRing p) := by + calc + (p : padicCompletedUnramifiedWittRing p) ^ m = + (p : padicCompletedUnramifiedWittRing p) ^ ((m - 1) + 1) := by + congr 1 + omega + _ = (p : padicCompletedUnramifiedWittRing p) ^ (m - 1) * + (p : padicCompletedUnramifiedWittRing p) := by + rw [pow_succ] + have hpCancel : + (p : padicCompletedUnramifiedWittRing p) ^ (m - 1) * + WittVector.frobenius c = + (V : padicCompletedUnramifiedWittRing p) * c := by + apply mul_left_cancel₀ hpne + have heq := sub_eq_zero.mp hcHomogeneous + change + (p : padicCompletedUnramifiedWittRing p) * + ((p : padicCompletedUnramifiedWittRing p) ^ (m - 1) * + WittVector.frobenius c) = + (p : padicCompletedUnramifiedWittRing p) * + ((V : padicCompletedUnramifiedWittRing p) * c) + calc + (p : padicCompletedUnramifiedWittRing p) * + ((p : padicCompletedUnramifiedWittRing p) ^ (m - 1) * + WittVector.frobenius c) = + (p : padicCompletedUnramifiedWittRing p) ^ m * + WittVector.frobenius c := by + rw [hpow] + ring + _ = + (V : padicCompletedUnramifiedWittRing p) * + (p : padicCompletedUnramifiedWittRing p) * c := + heq + _ = + (p : padicCompletedUnramifiedWittRing p) * + ((V : padicCompletedUnramifiedWittRing p) * c) := by + ring + have hcFixed : + c = + ((V⁻¹ : (padicCompletedUnramifiedWittRing p)ˣ) : + padicCompletedUnramifiedWittRing p) * + (p : padicCompletedUnramifiedWittRing p) ^ (m - 1) * + WittVector.frobenius c := by + calc + c = + ((V⁻¹ : (padicCompletedUnramifiedWittRing p)ˣ) : + padicCompletedUnramifiedWittRing p) * + ((V : padicCompletedUnramifiedWittRing p) * c) := by + simp + _ = + ((V⁻¹ : (padicCompletedUnramifiedWittRing p)ˣ) : + padicCompletedUnramifiedWittRing p) * + ((p : padicCompletedUnramifiedWittRing p) ^ (m - 1) * + WittVector.frobenius c) := by + rw [← hpCancel] + _ = + ((V⁻¹ : (padicCompletedUnramifiedWittRing p)ˣ) : + padicCompletedUnramifiedWittRing p) * + (p : padicCompletedUnramifiedWittRing p) ^ (m - 1) * + WittVector.frobenius c := by + ring + have hunique := + existsUnique_padicChangedUniformizerCoefficient p u m hm 0 + have hcSolution : + c = + 0 + + ((V⁻¹ : (padicCompletedUnramifiedWittRing p)ˣ) : + padicCompletedUnramifiedWittRing p) * + (p : padicCompletedUnramifiedWittRing p) ^ (m - 1) * + WittVector.frobenius c := by + simpa only [zero_add] using hcFixed + have hzeroSolution : + (0 : padicCompletedUnramifiedWittRing p) = + 0 + + ((V⁻¹ : (padicCompletedUnramifiedWittRing p)ˣ) : + padicCompletedUnramifiedWittRing p) * + (p : padicCompletedUnramifiedWittRing p) ^ (m - 1) * + WittVector.frobenius 0 := by + simp + have hcZero : c = 0 := + hunique.unique hcSolution hzeroSolution + exact sub_eq_zero.mp (by simpa only [c] using hcZero) + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarCompatibility.lean new file mode 100644 index 0000000000..a67fc632f1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarCompatibility.lean @@ -0,0 +1,377 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarEndomorphisms +/-! +# Changed-uniformizer scalar compatibility + +This module proves that the changed-uniformizer intertwiner commutes with every scalar + endomorphism and identifies its coefficientwise Frobenius twist. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open SameUniformizer + +/-- The semilinear changed-uniformizer comparison intertwines every scalar +endomorphism. This is the formal-series compatibility used in the +cyclotomic action formula for the Lubin--Tate character. -/ +theorem padicChangedUniformizerIntertwiner_endomorphism + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (a : (padicLocalField p).valuationSubring) : + PowerSeries.subst + (padicCompletedMultiplicativeScalarEndomorphism p a) + (padicChangedUniformizerIntertwiner p u) = + PowerSeries.subst + (padicChangedUniformizerIntertwiner p u) + (padicCompletedChangedStandardScalarEndomorphism p u a) := by + let H := padicChangedUniformizerIntertwiner p u + let M := padicCompletedMultiplicativeScalarEndomorphism p a + let S := padicCompletedChangedStandardScalarEndomorphism p u a + let E := padicCompletedMultiplicativeSeries p + let Ebar := padicCompletedChangedStandardSeries p u + let Phi := PowerSeries.map WittVector.frobenius H + let epsilon : padicCompletedUnramifiedWittRing p := + (padicChangedUniformizerLinearCoefficient p u : + padicCompletedUnramifiedWittRing p) + let alpha : padicCompletedUnramifiedWittRing p := + padicValuationSubringToCompletedUnramifiedWittRing p a + let A := PowerSeries.subst M H + let B := PowerSeries.subst H S + have hHconstant : PowerSeries.constantCoeff H = 0 := by + simpa only [H] using + padicChangedUniformizerIntertwiner_constantCoeff p u + have hHlinear : + HasLinearTerm H (fun _ : Unit => epsilon) := by + apply powerSeries_hasLinearTerm_of_constantCoeff_coeff_one + H epsilon hHconstant + simpa only [H, epsilon] using + padicChangedUniformizerIntertwiner_coeff_one p u + have hMlinear : + HasLinearTerm M (fun _ : Unit => alpha) := by + simpa only [M, alpha] using + padicCompletedMultiplicativeScalarEndomorphism_hasLinearTerm p a + have hSlinear : + HasLinearTerm S (fun _ : Unit => alpha) := by + simpa only [S, alpha] using + padicCompletedChangedStandardScalarEndomorphism_hasLinearTerm p u a + have hHsubst : PowerSeries.HasSubst H := + hHlinear.hasSubst + have hMsubst : PowerSeries.HasSubst M := + hMlinear.hasSubst + have hSsubst : PowerSeries.HasSubst S := + hSlinear.hasSubst + have hEsubst : PowerSeries.HasSubst E := + PowerSeries.HasSubst.of_constantCoeff_zero' (by + simpa only [E] using + padicCompletedMultiplicativeSeries_constantCoeff p) + have hEbarSubst : PowerSeries.HasSubst Ebar := + PowerSeries.HasSubst.of_constantCoeff_zero' (by + simpa only [Ebar] using + padicCompletedChangedStandardSeries_constantCoeff p u) + have hPhiSubst : PowerSeries.HasSubst Phi := + PowerSeries.HasSubst.of_constantCoeff_zero' (by + simpa only [Phi] using + padicChangedUniformizerFrobenius_constantCoeff_eq_zero + p H hHconstant) + have hHfunctional : + PowerSeries.subst H Ebar = + PowerSeries.subst E Phi := by + simpa only [H, Ebar, E, Phi, + padicCompletedChangedStandardSeries, + padicCompletedMultiplicativeSeries] using + padicChangedUniformizerIntertwiner_functionalEquation p u + have hMcommutes : + PowerSeries.subst M E = + PowerSeries.subst E M := by + simpa only [M, E] using + padicCompletedMultiplicativeScalarEndomorphism_commutes p a + have hScommutes : + PowerSeries.subst S Ebar = + PowerSeries.subst Ebar S := by + simpa only [S, Ebar] using + padicCompletedChangedStandardScalarEndomorphism_commutes p u a + have hmapA : + PowerSeries.map WittVector.frobenius A = + PowerSeries.subst M Phi := by + simp only [A, Phi] + change MvPowerSeries.map _ _ = _ + rw [PowerSeries.map_subst hMsubst] + change + PowerSeries.subst (PowerSeries.map _ _) (PowerSeries.map _ _) = _ + rw [padicCompletedMultiplicativeScalarEndomorphism_frobenius] + have hmapB : + PowerSeries.map WittVector.frobenius B = + PowerSeries.subst Phi S := by + simp only [B, Phi] + change MvPowerSeries.map _ _ = _ + rw [PowerSeries.map_subst hHsubst] + change + PowerSeries.subst (PowerSeries.map _ _) (PowerSeries.map _ _) = _ + rw [padicCompletedChangedStandardScalarEndomorphism_frobenius] + have hAfunctional : + PowerSeries.subst A Ebar = + PowerSeries.subst E + (PowerSeries.map WittVector.frobenius A) := by + calc + PowerSeries.subst A Ebar = + PowerSeries.subst M + (PowerSeries.subst H Ebar) := by + simpa only [A] using + (PowerSeries.subst_comp_subst_apply + hHsubst hMsubst Ebar).symm + _ = PowerSeries.subst M + (PowerSeries.subst E Phi) := by + rw [hHfunctional] + _ = PowerSeries.subst + (PowerSeries.subst M E) Phi := + PowerSeries.subst_comp_subst_apply + hEsubst hMsubst Phi + _ = PowerSeries.subst + (PowerSeries.subst E M) Phi := by + rw [hMcommutes] + _ = PowerSeries.subst E + (PowerSeries.subst M Phi) := + (PowerSeries.subst_comp_subst_apply + hMsubst hEsubst Phi).symm + _ = PowerSeries.subst E + (PowerSeries.map WittVector.frobenius A) := by + rw [hmapA] + have hBfunctional : + PowerSeries.subst B Ebar = + PowerSeries.subst E + (PowerSeries.map WittVector.frobenius B) := by + calc + PowerSeries.subst B Ebar = + PowerSeries.subst H + (PowerSeries.subst S Ebar) := by + simpa only [B] using + (PowerSeries.subst_comp_subst_apply + hSsubst hHsubst Ebar).symm + _ = PowerSeries.subst H + (PowerSeries.subst Ebar S) := by + rw [hScommutes] + _ = PowerSeries.subst + (PowerSeries.subst H Ebar) S := + PowerSeries.subst_comp_subst_apply + hEbarSubst hHsubst S + _ = PowerSeries.subst + (PowerSeries.subst E Phi) S := by + rw [hHfunctional] + _ = PowerSeries.subst E + (PowerSeries.subst Phi S) := + (PowerSeries.subst_comp_subst_apply + hPhiSubst hEsubst S).symm + _ = PowerSeries.subst E + (PowerSeries.map WittVector.frobenius B) := by + rw [hmapB] + have hAlinearRaw := + hHlinear.subst + (G := fun _ : Unit => M) + (M := fun _ : Unit => fun _ : Unit => alpha) + (fun _ => hMlinear) + have hAlinear : + HasLinearTerm A + (fun _ : Unit => epsilon * alpha) := by + simpa [A, PowerSeries.subst_def] using hAlinearRaw + have hBlinearRaw := + hSlinear.subst + (G := fun _ : Unit => H) + (M := fun _ : Unit => fun _ : Unit => epsilon) + (fun _ => hHlinear) + have hBlinear : + HasLinearTerm B + (fun _ : Unit => alpha * epsilon) := by + simpa [B, PowerSeries.subst_def] using hBlinearRaw + have hlinear : + PowerSeries.coeff 1 A = + PowerSeries.coeff 1 B := by + calc + PowerSeries.coeff 1 A = + epsilon * alpha := + hAlinear.coeff_single () + _ = alpha * epsilon := mul_comm _ _ + _ = PowerSeries.coeff 1 B := + (hBlinear.coeff_single ()).symm + exact + padicChangedUniformizerIntertwiner_unique p u + hAlinear.constantCoeff_eq_zero + hBlinear.constantCoeff_eq_zero + hlinear hAfunctional hBfunctional + +/-- Witt-vector Frobenius on the coefficients of the changed-uniformizer +intertwiner is substitution by the multiplicative endomorphism attached to +the unit changing the uniformizer. -/ +theorem padicChangedUniformizerIntertwiner_frobenius + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + PowerSeries.map WittVector.frobenius + (padicChangedUniformizerIntertwiner p u) = + PowerSeries.subst + (padicCompletedMultiplicativeScalarEndomorphism p + (u : (padicLocalField p).valuationSubring)) + (padicChangedUniformizerIntertwiner p u) := by + let H := padicChangedUniformizerIntertwiner p u + let U := + padicCompletedMultiplicativeScalarEndomorphism p + (u : (padicLocalField p).valuationSubring) + let E := padicCompletedMultiplicativeSeries p + let Ebar := padicCompletedChangedStandardSeries p u + let Phi := PowerSeries.map WittVector.frobenius H + let Phi2 := PowerSeries.map WittVector.frobenius Phi + let epsilon : padicCompletedUnramifiedWittRing p := + (padicChangedUniformizerLinearCoefficient p u : + padicCompletedUnramifiedWittRing p) + let alpha : padicCompletedUnramifiedWittRing p := + (padicValuationUnitToCompletedUnramifiedWittUnit p u : + padicCompletedUnramifiedWittRing p) + let A := PowerSeries.subst U H + have hHconstant : PowerSeries.constantCoeff H = 0 := by + simpa only [H] using + padicChangedUniformizerIntertwiner_constantCoeff p u + have hHlinear : + HasLinearTerm H (fun _ : Unit => epsilon) := by + apply powerSeries_hasLinearTerm_of_constantCoeff_coeff_one + H epsilon hHconstant + simpa only [H, epsilon] using + padicChangedUniformizerIntertwiner_coeff_one p u + have hUlinear : + HasLinearTerm U (fun _ : Unit => alpha) := by + have h := + padicCompletedMultiplicativeScalarEndomorphism_hasLinearTerm p + (u : (padicLocalField p).valuationSubring) + change HasLinearTerm U + (fun _ : Unit => + padicValuationSubringToCompletedUnramifiedWittRing p + (u : (padicLocalField p).valuationSubring)) + simpa only [U] using h + have hHsubst : PowerSeries.HasSubst H := + hHlinear.hasSubst + have hUsubst : PowerSeries.HasSubst U := + hUlinear.hasSubst + have hEsubst : PowerSeries.HasSubst E := + PowerSeries.HasSubst.of_constantCoeff_zero' (by + simpa only [E] using + padicCompletedMultiplicativeSeries_constantCoeff p) + have hHfunctional : + PowerSeries.subst H Ebar = + PowerSeries.subst E Phi := by + simpa only [H, Ebar, E, Phi, + padicCompletedChangedStandardSeries, + padicCompletedMultiplicativeSeries] using + padicChangedUniformizerIntertwiner_functionalEquation p u + have hUcommutes : + PowerSeries.subst U E = + PowerSeries.subst E U := by + simpa only [U, E] using + padicCompletedMultiplicativeScalarEndomorphism_commutes p + (u : (padicLocalField p).valuationSubring) + have hmapA : + PowerSeries.map WittVector.frobenius A = + PowerSeries.subst U Phi := by + simp only [A, Phi] + change MvPowerSeries.map _ _ = _ + rw [PowerSeries.map_subst hUsubst] + change + PowerSeries.subst (PowerSeries.map _ _) (PowerSeries.map _ _) = _ + rw [padicCompletedMultiplicativeScalarEndomorphism_frobenius] + have hPhiFunctional : + PowerSeries.subst Phi Ebar = + PowerSeries.subst E Phi2 := by + have h := + congrArg (PowerSeries.map WittVector.frobenius) hHfunctional + change MvPowerSeries.map _ _ = MvPowerSeries.map _ _ at h + rw [PowerSeries.map_subst hHsubst, + PowerSeries.map_subst hEsubst] at h + change + PowerSeries.subst (PowerSeries.map _ _) (PowerSeries.map _ _) = + PowerSeries.subst (PowerSeries.map _ _) (PowerSeries.map _ _) at h + rw [ + padicCompletedChangedStandardSeries_frobenius, + padicCompletedMultiplicativeSeries_frobenius] at h + simpa only [Phi, Phi2] using h + have hAfunctional : + PowerSeries.subst A Ebar = + PowerSeries.subst E + (PowerSeries.map WittVector.frobenius A) := by + calc + PowerSeries.subst A Ebar = + PowerSeries.subst U + (PowerSeries.subst H Ebar) := by + simpa only [A] using + (PowerSeries.subst_comp_subst_apply + hHsubst hUsubst Ebar).symm + _ = PowerSeries.subst U + (PowerSeries.subst E Phi) := by + rw [hHfunctional] + _ = PowerSeries.subst + (PowerSeries.subst U E) Phi := + PowerSeries.subst_comp_subst_apply + hEsubst hUsubst Phi + _ = PowerSeries.subst + (PowerSeries.subst E U) Phi := by + rw [hUcommutes] + _ = PowerSeries.subst E + (PowerSeries.subst U Phi) := + (PowerSeries.subst_comp_subst_apply + hUsubst hEsubst Phi).symm + _ = PowerSeries.subst E + (PowerSeries.map WittVector.frobenius A) := by + rw [hmapA] + have hAlinearRaw := + hHlinear.subst + (G := fun _ : Unit => U) + (M := fun _ : Unit => fun _ : Unit => alpha) + (fun _ => hUlinear) + have hAlinear : + HasLinearTerm A + (fun _ : Unit => epsilon * alpha) := by + simpa [A, PowerSeries.subst_def] using hAlinearRaw + have hPhiConstant : PowerSeries.constantCoeff Phi = 0 := by + simpa only [Phi] using + padicChangedUniformizerFrobenius_constantCoeff_eq_zero + p H hHconstant + have hPhiLinear : + PowerSeries.coeff 1 Phi = epsilon * alpha := by + change + WittVector.frobenius + (PowerSeries.coeff 1 H) = + epsilon * alpha + rw [show PowerSeries.coeff 1 H = epsilon by + simpa only [H, epsilon] using + padicChangedUniformizerIntertwiner_coeff_one p u] + simpa only [epsilon, alpha] using + padicChangedUniformizerLinearCoefficient_frobenius p u + have hPhiFunctional' : + PowerSeries.subst Phi Ebar = + PowerSeries.subst E + (PowerSeries.map WittVector.frobenius Phi) := by + simpa only [Phi2] using hPhiFunctional + have hAfunctional' : + PowerSeries.subst A Ebar = + PowerSeries.subst E + (PowerSeries.map WittVector.frobenius A) := + hAfunctional + exact + padicChangedUniformizerIntertwiner_unique p u + hPhiConstant + hAlinear.constantCoeff_eq_zero + (hPhiLinear.trans (hAlinear.coeff_single ()).symm) + hPhiFunctional' hAfunctional' + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarEndomorphisms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarEndomorphisms.lean new file mode 100644 index 0000000000..6618827b4b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarEndomorphisms.lean @@ -0,0 +1,576 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveIntertwiner +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.IntertwinerConstruction +/-! +# Completed scalar endomorphisms + +This module constructs the completed multiplicative and changed-standard scalar endomorphisms + and proves their linear terms, composition laws, Frobenius invariance, and substitution + commutation. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open SameUniformizer + +/-- The multiplicative Lubin--Tate scalar endomorphism with coefficient +`a`, after extending coefficients to the completed unramified Witt ring. -/ +noncomputable def padicCompletedMultiplicativeScalarEndomorphism + (p : ℕ) [Fact p.Prime] + (a : (padicLocalField p).valuationSubring) : + PowerSeries (padicCompletedUnramifiedWittRing p) := + PowerSeries.map + (padicValuationSubringToCompletedUnramifiedWittRing p) + (recursiveIntertwiner + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => a)) + +private theorem padicMultiplicativeScalarEndomorphism_mul + (p : ℕ) [Fact p.Prime] + (a b : (padicLocalField p).valuationSubring) : + recursiveIntertwiner + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => a * b) = + PowerSeries.subst + (recursiveIntertwiner + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => b)) + (recursiveIntertwiner + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => a)) := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let E := padicMultiplicativeLubinTateSeries p + let A := + recursiveIntertwiner hπ E E (fun _ : Unit => a) + let B := + recursiveIntertwiner hπ E E (fun _ : Unit => b) + have hAlinear := + recursiveIntertwiner_hasLinearTerm hπ E E + (fun _ : Unit => a) + have hBlinear := + recursiveIntertwiner_hasLinearTerm hπ E E + (fun _ : Unit => b) + have hcomp := + hAlinear.subst + (G := fun _ : Unit => B) + (M := fun _ : Unit => fun _ : Unit => b) + (fun _ => hBlinear) + have hcomp' : + HasLinearTerm (PowerSeries.subst B A) + (fun _ : Unit => a * b) := by + simpa only [A, B, PowerSeries.subst_def, Finset.univ_unique, + Finset.sum_singleton] using hcomp + have hIntertwines := + (recursiveIntertwiner_intertwines hπ E E + (fun _ : Unit => a)).powerSeries_subst + hAlinear.hasSubst + (recursiveIntertwiner_intertwines hπ E E + (fun _ : Unit => b)) + hBlinear.hasSubst + exact + eq_of_hasLinearTerm_of_intertwines hπ E E + (fun _ : Unit => a * b) + (recursiveIntertwiner_hasLinearTerm hπ E E + (fun _ : Unit => a * b)) + (recursiveIntertwiner_intertwines hπ E E + (fun _ : Unit => a * b)) + hcomp' hIntertwines + +/-- The standard scalar endomorphism for the changed uniformizer `u p`, +after extending coefficients to the completed unramified Witt ring. -/ +noncomputable def padicCompletedChangedStandardScalarEndomorphism + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (a : (padicLocalField p).valuationSubring) : + PowerSeries (padicCompletedUnramifiedWittRing p) := + PowerSeries.map + (padicValuationSubringToCompletedUnramifiedWittRing p) + (standardLubinTateEndomorphism + (standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u) + a) + +/-- A one-variable power series with zero constant coefficient and prescribed +coefficient of `X` has the corresponding `HasLinearTerm` predicate. -/ +theorem powerSeries_hasLinearTerm_of_constantCoeff_coeff_one + {R : Type*} [CommRing R] + (H : PowerSeries R) (a : R) + (hconstant : PowerSeries.constantCoeff H = 0) + (hone : PowerSeries.coeff 1 H = a) : + SameUniformizer.HasLinearTerm H (fun _ : Unit => a) := by + rw [SameUniformizer.HasLinearTerm] + apply MvPowerSeries.nat_le_order + intro d hd + have hdegree : d.degree = d () := + by simp [Finsupp.degree_eq_sum] + have hd' : d () < 2 := by + simpa only [hdegree] using hd + by_cases hd0 : d () = 0 + · have hdeq : d = 0 := by + apply Finsupp.ext + intro i + cases i + simp [hd0] + subst d + simp only [map_sub, + MvPowerSeries.coeff_zero_eq_constantCoeff_apply, + ← PowerSeries.constantCoeff_eq, hconstant, + SameUniformizer.constantCoeff_linearForm, + sub_self] + · have hd1 : d () = 1 := by omega + have hdeq : d = Finsupp.single () 1 := by + apply Finsupp.ext + intro i + cases i + simp [hd1] + subst d + change + PowerSeries.coeff 1 H - + MvPowerSeries.coeff (Finsupp.single () 1) + (SameUniformizer.linearForm (fun _ : Unit => a)) = + 0 + rw [hone] + classical + simp [SameUniformizer.linearForm] + +theorem + padicCompletedMultiplicativeScalarEndomorphism_constantCoeff + (p : ℕ) [Fact p.Prime] + (a : (padicLocalField p).valuationSubring) : + PowerSeries.constantCoeff + (padicCompletedMultiplicativeScalarEndomorphism p a) = 0 := by + have hconstant := + (recursiveIntertwiner_hasLinearTerm + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => a)).constantCoeff_eq_zero + change + padicValuationSubringToCompletedUnramifiedWittRing p + (PowerSeries.constantCoeff + (recursiveIntertwiner + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => a))) = 0 + rw [PowerSeries.constantCoeff_eq, hconstant, map_zero] + +@[simp] +theorem padicCompletedMultiplicativeScalarEndomorphism_coeff_one + (p : ℕ) [Fact p.Prime] + (a : (padicLocalField p).valuationSubring) : + PowerSeries.coeff 1 + (padicCompletedMultiplicativeScalarEndomorphism p a) = + padicValuationSubringToCompletedUnramifiedWittRing p a := by + rw [padicCompletedMultiplicativeScalarEndomorphism, + PowerSeries.coeff_map] + congr 1 + exact + (recursiveIntertwiner_hasLinearTerm + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => a)).coeff_single () + +theorem + padicCompletedChangedStandardScalarEndomorphism_constantCoeff + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (a : (padicLocalField p).valuationSubring) : + PowerSeries.constantCoeff + (padicCompletedChangedStandardScalarEndomorphism p u a) = 0 := by + have hconstant := + (standardLubinTateEndomorphism_hasLinearTerm + (standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u) + a).constantCoeff_eq_zero + change + padicValuationSubringToCompletedUnramifiedWittRing p + (PowerSeries.constantCoeff + (standardLubinTateEndomorphism + (standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u) + a)) = 0 + rw [PowerSeries.constantCoeff_eq, hconstant, map_zero] + +@[simp] +theorem + padicCompletedChangedStandardScalarEndomorphism_coeff_one + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (a : (padicLocalField p).valuationSubring) : + PowerSeries.coeff 1 + (padicCompletedChangedStandardScalarEndomorphism p u a) = + padicValuationSubringToCompletedUnramifiedWittRing p a := by + rw [padicCompletedChangedStandardScalarEndomorphism, + PowerSeries.coeff_map, + standardLubinTateEndomorphism_coeff_one] + +private theorem padicMultiplicativeScalarEndomorphism_commutes + (p : ℕ) [Fact p.Prime] + (a : (padicLocalField p).valuationSubring) : + PowerSeries.subst + (recursiveIntertwiner + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => a)) + (padicMultiplicativeLubinTateSeries p).toPowerSeries = + PowerSeries.subst + (padicMultiplicativeLubinTateSeries p).toPowerSeries + (recursiveIntertwiner + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => a)) := by + have h := + recursiveIntertwiner_intertwines + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => a) + calc + _ = + MvPowerSeries.subst + (fun i : Unit => + inVariable (padicMultiplicativeLubinTateSeries p) i) + (recursiveIntertwiner + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => a)) := + h + _ = _ := by + rw [PowerSeries.subst_def] + congr 1 + funext i + cases i + exact + PowerSeries.X_subst + (padicMultiplicativeLubinTateSeries p).toPowerSeries + +private theorem padicChangedStandardScalarEndomorphism_commutes + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (a : (padicLocalField p).valuationSubring) : + PowerSeries.subst + (standardLubinTateEndomorphism + (standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u) + a) + (standardLubinTateSeries + (standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u)).toPowerSeries = + PowerSeries.subst + (standardLubinTateSeries + (standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u)).toPowerSeries + (standardLubinTateEndomorphism + (standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u) + a) := by + let hπ := + standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u + have h := + standardLubinTateEndomorphism_intertwines hπ a + calc + _ = + MvPowerSeries.subst + (fun i : Unit => inVariable (standardLubinTateSeries hπ) i) + (standardLubinTateEndomorphism hπ a) := + h + _ = _ := by + rw [PowerSeries.subst_def] + congr 1 + funext i + cases i + exact PowerSeries.X_subst (standardLubinTateSeries hπ).toPowerSeries + +/-- A completed multiplicative scalar endomorphism commutes with the +completed multiplicative Lubin--Tate series under substitution. -/ +theorem padicCompletedMultiplicativeScalarEndomorphism_commutes + (p : ℕ) [Fact p.Prime] + (a : (padicLocalField p).valuationSubring) : + PowerSeries.subst + (padicCompletedMultiplicativeScalarEndomorphism p a) + (padicCompletedMultiplicativeSeries p) = + PowerSeries.subst + (padicCompletedMultiplicativeSeries p) + (padicCompletedMultiplicativeScalarEndomorphism p a) := by + have hscalar : + PowerSeries.HasSubst + (recursiveIntertwiner + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => a)) := + (recursiveIntertwiner_hasLinearTerm + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => a)).hasSubst + have hseries : + PowerSeries.HasSubst + (padicMultiplicativeLubinTateSeries p).toPowerSeries := + PowerSeries.HasSubst.of_constantCoeff_zero' + (padicMultiplicativeLubinTateSeries p).constantCoeff_eq_zero + have h := + congrArg + (PowerSeries.map + (padicValuationSubringToCompletedUnramifiedWittRing p)) + (padicMultiplicativeScalarEndomorphism_commutes p a) + change MvPowerSeries.map _ _ = MvPowerSeries.map _ _ at h + rw [PowerSeries.map_subst hscalar, + PowerSeries.map_subst hseries] at h + change + PowerSeries.subst (PowerSeries.map _ _) (PowerSeries.map _ _) = + PowerSeries.subst (PowerSeries.map _ _) (PowerSeries.map _ _) at h + simpa only [padicCompletedMultiplicativeScalarEndomorphism, + padicCompletedMultiplicativeSeries] using h + +/-- A completed changed-standard scalar endomorphism commutes with the +completed changed-standard series under substitution. -/ +theorem padicCompletedChangedStandardScalarEndomorphism_commutes + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (a : (padicLocalField p).valuationSubring) : + PowerSeries.subst + (padicCompletedChangedStandardScalarEndomorphism p u a) + (padicCompletedChangedStandardSeries p u) = + PowerSeries.subst + (padicCompletedChangedStandardSeries p u) + (padicCompletedChangedStandardScalarEndomorphism p u a) := by + let hπ := + standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u + have hscalar : + PowerSeries.HasSubst + (standardLubinTateEndomorphism hπ a) := + (standardLubinTateEndomorphism_hasLinearTerm hπ a).hasSubst + have hseries : + PowerSeries.HasSubst + (standardLubinTateSeries hπ).toPowerSeries := + PowerSeries.HasSubst.of_constantCoeff_zero' + (standardLubinTateSeries hπ).constantCoeff_eq_zero + have h := + congrArg + (PowerSeries.map + (padicValuationSubringToCompletedUnramifiedWittRing p)) + (padicChangedStandardScalarEndomorphism_commutes p u a) + change MvPowerSeries.map _ _ = MvPowerSeries.map _ _ at h + rw [PowerSeries.map_subst hscalar, + PowerSeries.map_subst hseries] at h + change + PowerSeries.subst (PowerSeries.map _ _) (PowerSeries.map _ _) = + PowerSeries.subst (PowerSeries.map _ _) (PowerSeries.map _ _) at h + simpa only [padicCompletedChangedStandardScalarEndomorphism, + padicCompletedChangedStandardSeries] using h + +/-- Completed multiplicative scalar endomorphisms are fixed by coefficientwise +Witt-vector Frobenius. -/ +theorem padicCompletedMultiplicativeScalarEndomorphism_frobenius + (p : ℕ) [Fact p.Prime] + (a : (padicLocalField p).valuationSubring) : + PowerSeries.map WittVector.frobenius + (padicCompletedMultiplicativeScalarEndomorphism p a) = + padicCompletedMultiplicativeScalarEndomorphism p a := by + apply PowerSeries.ext + intro n + simp [padicCompletedMultiplicativeScalarEndomorphism, + PowerSeries.coeff_map, + padicValuationSubringToCompletedUnramifiedWittRing_frobenius] + +/-- Completed changed-standard scalar endomorphisms are fixed by +coefficientwise Witt-vector Frobenius. -/ +theorem padicCompletedChangedStandardScalarEndomorphism_frobenius + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (a : (padicLocalField p).valuationSubring) : + PowerSeries.map WittVector.frobenius + (padicCompletedChangedStandardScalarEndomorphism p u a) = + padicCompletedChangedStandardScalarEndomorphism p u a := by + apply PowerSeries.ext + intro n + simp [padicCompletedChangedStandardScalarEndomorphism, + PowerSeries.coeff_map, + padicValuationSubringToCompletedUnramifiedWittRing_frobenius] + +/-- The completed multiplicative series is fixed by coefficientwise +Witt-vector Frobenius. -/ +theorem padicCompletedMultiplicativeSeries_frobenius + (p : ℕ) [Fact p.Prime] : + PowerSeries.map WittVector.frobenius + (padicCompletedMultiplicativeSeries p) = + padicCompletedMultiplicativeSeries p := by + apply PowerSeries.ext + intro n + simp [padicCompletedMultiplicativeSeries] + +/-- The completed changed-standard series is fixed by coefficientwise +Witt-vector Frobenius. -/ +theorem padicCompletedChangedStandardSeries_frobenius + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + PowerSeries.map WittVector.frobenius + (padicCompletedChangedStandardSeries p u) = + padicCompletedChangedStandardSeries p u := by + apply PowerSeries.ext + intro n + simp [padicCompletedChangedStandardSeries, + PowerSeries.coeff_map, + padicValuationSubringToCompletedUnramifiedWittRing_frobenius] + +theorem + padicCompletedMultiplicativeScalarEndomorphism_hasLinearTerm + (p : ℕ) [Fact p.Prime] + (a : (padicLocalField p).valuationSubring) : + HasLinearTerm + (padicCompletedMultiplicativeScalarEndomorphism p a) + (fun _ : Unit => + padicValuationSubringToCompletedUnramifiedWittRing p a) := + powerSeries_hasLinearTerm_of_constantCoeff_coeff_one + (padicCompletedMultiplicativeScalarEndomorphism p a) + (padicValuationSubringToCompletedUnramifiedWittRing p a) + (padicCompletedMultiplicativeScalarEndomorphism_constantCoeff p a) + (padicCompletedMultiplicativeScalarEndomorphism_coeff_one p a) + +/-- Every completed multiplicative scalar endomorphism admits formal +substitution. -/ +theorem padicCompletedMultiplicativeScalarEndomorphism_hasSubst + (p : ℕ) [Fact p.Prime] + (a : (padicLocalField p).valuationSubring) : + PowerSeries.HasSubst + (padicCompletedMultiplicativeScalarEndomorphism p a) := + (padicCompletedMultiplicativeScalarEndomorphism_hasLinearTerm p a).hasSubst + +/-- Multiplication of p-adic scalars is composition of their completed +multiplicative Lubin--Tate endomorphisms. -/ +theorem padicCompletedMultiplicativeScalarEndomorphism_mul + (p : ℕ) [Fact p.Prime] + (a b : (padicLocalField p).valuationSubring) : + padicCompletedMultiplicativeScalarEndomorphism p (a * b) = + PowerSeries.subst + (padicCompletedMultiplicativeScalarEndomorphism p b) + (padicCompletedMultiplicativeScalarEndomorphism p a) := by + have h := + congrArg + (PowerSeries.map + (padicValuationSubringToCompletedUnramifiedWittRing p)) + (padicMultiplicativeScalarEndomorphism_mul p a b) + change MvPowerSeries.map _ _ = MvPowerSeries.map _ _ at h + rw [PowerSeries.map_subst + (recursiveIntertwiner_hasLinearTerm + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => b)).hasSubst] at h + change + PowerSeries.map _ _ = + PowerSeries.subst (PowerSeries.map _ _) (PowerSeries.map _ _) at h + simpa only [padicCompletedMultiplicativeScalarEndomorphism] using h + +theorem + padicCompletedChangedStandardScalarEndomorphism_hasLinearTerm + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (a : (padicLocalField p).valuationSubring) : + HasLinearTerm + (padicCompletedChangedStandardScalarEndomorphism p u a) + (fun _ : Unit => + padicValuationSubringToCompletedUnramifiedWittRing p a) := + powerSeries_hasLinearTerm_of_constantCoeff_coeff_one + (padicCompletedChangedStandardScalarEndomorphism p u a) + (padicValuationSubringToCompletedUnramifiedWittRing p a) + (padicCompletedChangedStandardScalarEndomorphism_constantCoeff p u a) + (padicCompletedChangedStandardScalarEndomorphism_coeff_one p u a) + +/-- Every completed changed-standard scalar endomorphism admits formal +substitution. -/ +theorem padicCompletedChangedStandardScalarEndomorphism_hasSubst + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (a : (padicLocalField p).valuationSubring) : + PowerSeries.HasSubst + (padicCompletedChangedStandardScalarEndomorphism p u a) := + (padicCompletedChangedStandardScalarEndomorphism_hasLinearTerm + p u a).hasSubst + +/-- The changed uniformizer itself acts by the defining completed changed +standard Lubin--Tate series. -/ +theorem padicCompletedChangedStandardScalarEndomorphism_uniformizer + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + padicCompletedChangedStandardScalarEndomorphism p u + (standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u) = + padicCompletedChangedStandardSeries p u := by + rw [padicCompletedChangedStandardScalarEndomorphism, + padicCompletedChangedStandardSeries, + SameUniformizer.standardLubinTateEndomorphism_uniformizer] + +/-- Multiplication of changed-standard scalars is composition after +completed coefficient extension. -/ +theorem padicCompletedChangedStandardScalarEndomorphism_mul + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (a b : (padicLocalField p).valuationSubring) : + padicCompletedChangedStandardScalarEndomorphism p u (a * b) = + PowerSeries.subst + (padicCompletedChangedStandardScalarEndomorphism p u b) + (padicCompletedChangedStandardScalarEndomorphism p u a) := by + let hπ := + standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u + have h := + congrArg + (PowerSeries.map + (padicValuationSubringToCompletedUnramifiedWittRing p)) + (standardLubinTateEndomorphism_mul hπ a b) + change MvPowerSeries.map _ _ = MvPowerSeries.map _ _ at h + rw [PowerSeries.map_subst + (standardLubinTateEndomorphism_hasLinearTerm hπ b).hasSubst] at h + change + PowerSeries.map _ _ = + PowerSeries.subst (PowerSeries.map _ _) (PowerSeries.map _ _) at h + simpa only [padicCompletedChangedStandardScalarEndomorphism] using h + +/-- The scalar `1` acts by the identity changed-standard series. -/ +@[simp] +theorem padicCompletedChangedStandardScalarEndomorphism_one + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + padicCompletedChangedStandardScalarEndomorphism p u 1 = + PowerSeries.X := by + rw [padicCompletedChangedStandardScalarEndomorphism, + standardLubinTateEndomorphism_one, PowerSeries.map_X] + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardCompositum.lean new file mode 100644 index 0000000000..876695d969 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardCompositum.lean @@ -0,0 +1,394 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.FiniteAbelianCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedStandardLevelTransport +/-! +# The finite standard/changed compositum in the completed p-adic level + +The completed level contains two finite abelian extensions of `ℚ_[p]`: + +* the image of the ordinary standard multiplicative Lubin--Tate level; +* the fixed field of the inverse-unit completed Frobenius lift, identified + with the changed-uniformizer level. + +Their compositum is therefore a genuine finite abelian extension. The +inverse of the Frobenius lift preserves this compositum, fixes the changed +factor, and acts on the standard factor by the direct unit parameter. This +is the finite automorphism which the changed-uniformizer norm calculation +will identify with the actual local Artin symbol. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp + +/-- The copy of the ordinary standard multiplicative level inside the +completed level. -/ +def padicCompletedStandardLevelField + (p : ℕ) [Fact p.Prime] (n : ℕ) : + IntermediateField ℚ_[p] (padicCompletedLevelField p n) := + (padicStandardLevelEmbedding p n).fieldRange + +/-- The ordinary standard level is equivalent to its image in the completed +level. -/ +noncomputable def padicStandardLevelEquivCompletedStandardLevelField + (p : ℕ) [Fact p.Prime] (n : ℕ) : + standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + ≃ₐ[ℚ_[p]] + padicCompletedStandardLevelField p n := + AlgEquiv.ofInjectiveField (padicStandardLevelEmbedding p n) + +noncomputable instance + padicCompletedStandardLevelField_finiteDimensional + (p : ℕ) [Fact p.Prime] (n : ℕ) : + FiniteDimensional ℚ_[p] + (padicCompletedStandardLevelField p n) := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let : FiniteDimensional ℚ_[p] + (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_finiteDimensional hπ n + let e := padicStandardLevelEquivCompletedStandardLevelField p n + exact e.toLinearEquiv.finiteDimensional + +noncomputable instance + padicCompletedStandardLevelField_isAbelianGalois + (p : ℕ) [Fact p.Prime] (n : ℕ) : + IsAbelianGalois ℚ_[p] + (padicCompletedStandardLevelField p n) := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let : IsAbelianGalois ℚ_[p] (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_isAbelianGalois (padicLocalField p) + (π := padicIntEquivValuationSubring p (p : ℤ_[p])) hπ n + exact IsAbelianGalois.of_algHom + (padicStandardLevelEquivCompletedStandardLevelField p n).symm.toAlgHom + +noncomputable instance + padicCompletedChangedUniformizerFixedField_finiteDimensional + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + FiniteDimensional ℚ_[p] + (padicCompletedChangedUniformizerFixedField p u n) := by + let hπ := + standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u + let : FiniteDimensional ℚ_[p] + (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_finiteDimensional hπ n + let e := padicChangedUniformizerLevelEquivCompletedFixedField p u n + exact e.toLinearEquiv.finiteDimensional + +noncomputable instance + padicCompletedChangedUniformizerFixedField_isAbelianGalois + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + IsAbelianGalois ℚ_[p] + (padicCompletedChangedUniformizerFixedField p u n) := + IsAbelianGalois.of_algHom + (padicChangedUniformizerLevelEquivCompletedFixedField p u n).symm.toAlgHom + +/-- The finite compositum of the standard level and the actual +changed-uniformizer fixed field inside the completed level. -/ +def padicCompletedStandardChangedCompositum + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + IntermediateField ℚ_[p] (padicCompletedLevelField p n) := + padicCompletedStandardLevelField p n ⊔ + padicCompletedChangedUniformizerFixedField p u n + +noncomputable instance + padicCompletedStandardChangedCompositum_finiteDimensional + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + FiniteDimensional ℚ_[p] + (padicCompletedStandardChangedCompositum p u n) := + IntermediateField.finiteDimensional_sup + (padicCompletedStandardLevelField p n) + (padicCompletedChangedUniformizerFixedField p u n) + +noncomputable instance + padicCompletedStandardChangedCompositum_isAbelianGalois + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + IsAbelianGalois ℚ_[p] + (padicCompletedStandardChangedCompositum p u n) := + AlgebraicNumberTheory.isAbelianGalois_sup ℚ_[p] + (padicCompletedStandardLevelField p n) + (padicCompletedChangedUniformizerFixedField p u n) + +noncomputable instance + padicCompletedStandardChangedCompositumChangedFieldAlgebra + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + Algebra (padicCompletedChangedUniformizerFixedField p u n) + (padicCompletedStandardChangedCompositum p u n) := + (IntermediateField.inclusion le_sup_right).toRingHom.toAlgebra + +instance padicCompletedStandardChangedCompositum_changedFieldScalarTower + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + IsScalarTower ℚ_[p] + (padicCompletedChangedUniformizerFixedField p u n) + (padicCompletedStandardChangedCompositum p u n) := + IsScalarTower.of_algebraMap_eq' rfl + +/-- The standard/changed compositum is also abelian Galois over its +changed-uniformizer factor. Relative automorphisms embed faithfully into +the already commutative Galois group over `ℚ_p`. -/ +noncomputable instance + padicCompletedStandardChangedCompositum_relative_isAbelianGalois + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + IsAbelianGalois + (padicCompletedChangedUniformizerFixedField p u n) + (padicCompletedStandardChangedCompositum p u n) := + IsAbelianGalois.tower_top ℚ_[p] + (padicCompletedChangedUniformizerFixedField p u n) + (padicCompletedStandardChangedCompositum p u n) + +/-- The standard finite level embedded into the finite standard/changed +compositum. -/ +noncomputable def padicStandardLevelToCompletedChangedCompositum + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + →ₐ[ℚ_[p]] + padicCompletedStandardChangedCompositum p u n := + (padicStandardLevelEmbedding p n).codRestrict + (padicCompletedStandardChangedCompositum p u n).toSubalgebra + (fun x => + (show padicCompletedStandardLevelField p n ≤ + padicCompletedStandardChangedCompositum p u n from le_sup_left) + (show padicStandardLevelEmbedding p n x ∈ + padicCompletedStandardLevelField p n from + ⟨x, rfl⟩)) + +/-- The changed fixed field included into the finite standard/changed +compositum. -/ +noncomputable def + padicCompletedChangedFixedFieldToStandardChangedCompositum + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + padicCompletedChangedUniformizerFixedField p u n + →ₐ[ℚ_[p]] + padicCompletedStandardChangedCompositum p u n := + IntermediateField.inclusion le_sup_right + +/-- The inverse-unit Frobenius inverse carries the standard completed copy +to itself. -/ +theorem + padicCompletedChangedUniformizerFrobenius_symm_map_standard_le + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + (padicCompletedStandardLevelField p n).map + (padicCompletedChangedUniformizerFrobeniusAlgEquiv + p u n).symm.toAlgHom ≤ + padicCompletedStandardLevelField p n := by + rw [IntermediateField.map_le_iff_le_comap] + intro x hx + change + (padicCompletedChangedUniformizerFrobeniusAlgEquiv p u n).symm x ∈ + padicCompletedStandardLevelField p n + change x ∈ (padicStandardLevelEmbedding p n).fieldRange at hx + change + (padicCompletedChangedUniformizerFrobeniusAlgEquiv p u n).symm x ∈ + (padicStandardLevelEmbedding p n).fieldRange + rw [AlgHom.mem_fieldRange] at hx ⊢ + obtain ⟨y, rfl⟩ := hx + refine + ⟨standardLubinTateUnitParameterAlgEquiv + (padicLocalField p) + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u) y, ?_⟩ + exact + (padicCompletedInverseUnitFrobeniusLiftEquiv_standardLevelEmbedding + p n u y).symm + +/-- Every element of the changed fixed field is fixed by the inverse of its +defining Frobenius lift. -/ +theorem + padicCompletedChangedUniformizerFrobenius_symm_fixed + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) + (x : padicCompletedChangedUniformizerFixedField p u n) : + (padicCompletedChangedUniformizerFrobeniusAlgEquiv p u n).symm + (x : padicCompletedLevelField p n) = + x := by + have hxFixed : + padicCompletedChangedUniformizerFrobeniusAlgEquiv p u n + (x : padicCompletedLevelField p n) = + x := by + have hxmem := x.property + change + (x : padicCompletedLevelField p n) ∈ + IntermediateField.fixedField + (padicCompletedChangedUniformizerFrobeniusSubgroup p u n) + at hxmem + rw [IntermediateField.mem_fixedField_iff] at hxmem + exact hxmem + (padicCompletedChangedUniformizerFrobeniusAlgEquiv p u n) + (Subgroup.mem_zpowers + (padicCompletedChangedUniformizerFrobeniusAlgEquiv p u n)) + calc + (padicCompletedChangedUniformizerFrobeniusAlgEquiv p u n).symm + (x : padicCompletedLevelField p n) = + (padicCompletedChangedUniformizerFrobeniusAlgEquiv p u n).symm + (padicCompletedChangedUniformizerFrobeniusAlgEquiv p u n x) := by + rw [hxFixed] + _ = x := + (padicCompletedChangedUniformizerFrobeniusAlgEquiv p u n).symm_apply_apply x + +/-- The inverse defining Frobenius carries the changed fixed field to +itself. -/ +theorem + padicCompletedChangedUniformizerFrobenius_symm_map_fixedField_le + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + (padicCompletedChangedUniformizerFixedField p u n).map + (padicCompletedChangedUniformizerFrobeniusAlgEquiv + p u n).symm.toAlgHom ≤ + padicCompletedChangedUniformizerFixedField p u n := by + rw [IntermediateField.map_le_iff_le_comap] + intro x hx + change + (padicCompletedChangedUniformizerFrobeniusAlgEquiv p u n).symm x ∈ + padicCompletedChangedUniformizerFixedField p u n + have hfixed := + padicCompletedChangedUniformizerFrobenius_symm_fixed p u n + ⟨x, hx⟩ + rw [hfixed] + exact hx + +/-- The inverse defining Frobenius preserves the finite standard/changed +compositum. -/ +theorem + padicCompletedChangedUniformizerFrobenius_symm_map_compositum_le + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + (padicCompletedStandardChangedCompositum p u n).map + (padicCompletedChangedUniformizerFrobeniusAlgEquiv + p u n).symm.toAlgHom ≤ + padicCompletedStandardChangedCompositum p u n := by + rw [padicCompletedStandardChangedCompositum, + IntermediateField.map_sup] + exact sup_le_sup + (padicCompletedChangedUniformizerFrobenius_symm_map_standard_le + p u n) + (padicCompletedChangedUniformizerFrobenius_symm_map_fixedField_le + p u n) + +/-- The inverse defining Frobenius restricted to the genuine finite +standard/changed compositum. -/ +noncomputable def padicCompletedChangedUniformizerArtinCandidateAlgHom + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + padicCompletedStandardChangedCompositum p u n + →ₐ[ℚ_[p]] + padicCompletedStandardChangedCompositum p u n := + (((padicCompletedChangedUniformizerFrobeniusAlgEquiv p u n).symm.toAlgHom).comp + (padicCompletedStandardChangedCompositum p u n).val).codRestrict + (padicCompletedStandardChangedCompositum p u n).toSubalgebra + (fun x => by + apply + padicCompletedChangedUniformizerFrobenius_symm_map_compositum_le + p u n + rw [IntermediateField.mem_map] + exact ⟨x, x.property, rfl⟩) + +/-- The finite Artin candidate is an automorphism. -/ +noncomputable def padicCompletedChangedUniformizerArtinCandidate + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + padicCompletedStandardChangedCompositum p u n + ≃ₐ[ℚ_[p]] + padicCompletedStandardChangedCompositum p u n := by + let f := + padicCompletedChangedUniformizerArtinCandidateAlgHom p u n + apply AlgEquiv.ofBijective f + refine ⟨f.injective, ?_⟩ + exact + (LinearMap.injective_iff_surjective_of_finrank_eq_finrank + (f := f.toLinearMap) rfl).mp f.injective + +/-- On the standard factor, the finite Artin candidate is the direct +unit-parameter automorphism. -/ +@[simp] +theorem + padicCompletedChangedUniformizerArtinCandidate_standardLevel + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) + (x : + standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) n) : + padicCompletedChangedUniformizerArtinCandidate p u n + (padicStandardLevelToCompletedChangedCompositum p u n x) = + padicStandardLevelToCompletedChangedCompositum p u n + (standardLubinTateUnitParameterAlgEquiv + (padicLocalField p) + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u) x) := by + apply Subtype.ext + exact + padicCompletedInverseUnitFrobeniusLiftEquiv_standardLevelEmbedding + p n u x + +/-- On the changed factor, the finite Artin candidate is the identity. -/ +@[simp] +theorem + padicCompletedChangedUniformizerArtinCandidate_fixedField + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) + (x : padicCompletedChangedUniformizerFixedField p u n) : + padicCompletedChangedUniformizerArtinCandidate p u n + (padicCompletedChangedFixedFieldToStandardChangedCompositum + p u n x) = + padicCompletedChangedFixedFieldToStandardChangedCompositum + p u n x := by + apply Subtype.ext + exact + padicCompletedChangedUniformizerFrobenius_symm_fixed p u n x + +/-- The finite Artin candidate as an automorphism over the changed fixed +field that it fixes pointwise. -/ +noncomputable def + padicCompletedChangedUniformizerRelativeArtinCandidate + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + padicCompletedStandardChangedCompositum p u n + ≃ₐ[padicCompletedChangedUniformizerFixedField p u n] + padicCompletedStandardChangedCompositum p u n where + __ := (padicCompletedChangedUniformizerArtinCandidate p u n).toRingEquiv + commutes' x := + padicCompletedChangedUniformizerArtinCandidate_fixedField + p u n x + +/-- Forgetting the changed-field scalar structure recovers the original +finite candidate. -/ +@[simp] +theorem padicCompletedChangedUniformizerRelativeArtinCandidate_apply + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) + (x : padicCompletedStandardChangedCompositum p u n) : + padicCompletedChangedUniformizerRelativeArtinCandidate p u n x = + padicCompletedChangedUniformizerArtinCandidate p u n x := + rfl + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFixedField.lean new file mode 100644 index 0000000000..4fca061705 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFixedField.lean @@ -0,0 +1,188 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardCompositum +/-! +# Fixed field of the finite changed-uniformizer Artin candidate + +Inside the finite standard/changed compositum, the cyclic subgroup generated +by the inverse completed Frobenius has fixed field exactly the changed +Lubin--Tate factor. Thus the automorphisms over the changed factor are +precisely the powers of the finite Artin candidate. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp + +/-- The changed fixed field, now regarded as an intermediate field of the +finite standard/changed compositum. -/ +def padicCompletedChangedFieldInStandardChangedCompositum + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + IntermediateField ℚ_[p] + (padicCompletedStandardChangedCompositum p u n) := + (padicCompletedChangedUniformizerFixedField p u n).restrict + (show + padicCompletedChangedUniformizerFixedField p u n ≤ + padicCompletedStandardChangedCompositum p u n from + le_sup_right) + +/-- The fixed field of the cyclic finite Artin candidate is the actual +changed-uniformizer factor. -/ +theorem + padicCompletedChangedUniformizerArtinCandidate_fixedField_eq_changed + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + IntermediateField.fixedField + (Subgroup.zpowers + (padicCompletedChangedUniformizerArtinCandidate p u n)) = + padicCompletedChangedFieldInStandardChangedCompositum p u n := by + let E := padicCompletedLevelField p n + let T := padicCompletedChangedUniformizerFixedField p u n + let M := padicCompletedStandardChangedCompositum p u n + let δ := + padicCompletedChangedUniformizerFrobeniusAlgEquiv p u n + let τ := + padicCompletedChangedUniformizerArtinCandidate p u n + apply le_antisymm + · intro x hx + have hτ : + τ x = x := by + exact + (IntermediateField.mem_fixedField_iff + (H := Subgroup.zpowers τ) x).1 hx τ + (Subgroup.mem_zpowers τ) + have hτAmbient : + δ.symm (x : E) = (x : E) := by + have hcoe := congrArg (fun z : M => (z : E)) hτ + change δ.symm (x : E) = (x : E) at hcoe + exact hcoe + have hδAmbient : + δ (x : E) = (x : E) := by + have h := congrArg δ hτAmbient + simpa only [δ, AlgEquiv.apply_symm_apply] using h.symm + rw [padicCompletedChangedFieldInStandardChangedCompositum, + IntermediateField.mem_restrict] + change + (x : E) ∈ IntermediateField.fixedField + (padicCompletedChangedUniformizerFrobeniusSubgroup p u n) + rw [IntermediateField.mem_fixedField_iff] + intro σ hσ + obtain ⟨j, rfl⟩ := Subgroup.mem_zpowers_iff.mp hσ + have hfixed : + (x : E) ∈ MulAction.fixedBy E δ := by + rw [MulAction.mem_fixedBy] + exact hδAmbient + exact MulAction.mem_fixedBy_zpow hfixed j + · intro x hx + rw [IntermediateField.mem_fixedField_iff] + intro σ hσ + obtain ⟨j, rfl⟩ := Subgroup.mem_zpowers_iff.mp hσ + have hxT : (x : E) ∈ T := by + simpa only [padicCompletedChangedFieldInStandardChangedCompositum, + IntermediateField.mem_restrict] using hx + let y : T := ⟨(x : E), hxT⟩ + have hτ : + τ x = x := by + have hy := + padicCompletedChangedUniformizerArtinCandidate_fixedField + p u n y + apply Subtype.ext + exact congrArg + (fun z : M => (z : E)) hy + have hfixed : + x ∈ MulAction.fixedBy M τ := by + rw [MulAction.mem_fixedBy] + exact hτ + exact MulAction.mem_fixedBy_zpow hfixed j + +/-- The relative Galois group of the finite standard/changed compositum over +the changed factor is cyclic and generated by the finite Artin candidate. -/ +theorem + padicCompletedChangedUniformizerArtinCandidate_zpowers_eq_fixingSubgroup + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + Subgroup.zpowers + (padicCompletedChangedUniformizerArtinCandidate p u n) = + (padicCompletedChangedFieldInStandardChangedCompositum + p u n).fixingSubgroup := by + let τ := + padicCompletedChangedUniformizerArtinCandidate p u n + calc + Subgroup.zpowers τ = + (IntermediateField.fixedField + (Subgroup.zpowers τ)).fixingSubgroup := + (IntermediateField.fixingSubgroup_fixedField + (Subgroup.zpowers τ)).symm + _ = + (padicCompletedChangedFieldInStandardChangedCompositum + p u n).fixingSubgroup := by + rw [ + padicCompletedChangedUniformizerArtinCandidate_fixedField_eq_changed] + +/-- Over the changed field itself, the relative finite Artin candidate +generates the full relative Galois group. -/ +theorem + padicCompletedChangedUniformizerRelativeArtinCandidate_zpowers_eq_top + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + Subgroup.zpowers + (padicCompletedChangedUniformizerRelativeArtinCandidate p u n) = + ⊤ := by + let D := padicCompletedChangedUniformizerFixedField p u n + let M := padicCompletedStandardChangedCompositum p u n + let Dinside := + padicCompletedChangedFieldInStandardChangedCompositum p u n + let τ := + padicCompletedChangedUniformizerRelativeArtinCandidate p u n + let σ := + padicCompletedChangedUniformizerArtinCandidate p u n + let forget : Gal(M/D) →* Gal(M/ℚ_[p]) := + AlgEquiv.restrictScalarsHom ℚ_[p] + apply top_unique + intro g _ + have hfix : forget g ∈ Dinside.fixingSubgroup := by + rw [IntermediateField.mem_fixingSubgroup_iff] + intro z hz + have hzD : + (((z : M) : padicCompletedLevelField p n)) ∈ D := by + simpa only [Dinside, + padicCompletedChangedFieldInStandardChangedCompositum, + IntermediateField.mem_restrict] using hz + let x : D := + ⟨((z : M) : + padicCompletedLevelField p n), hzD⟩ + have hx : algebraMap D M x = z := by + apply Subtype.ext + rfl + change g z = z + rw [← hx] + exact g.commutes x + have hpower : forget g ∈ Subgroup.zpowers σ := by + rw [ + padicCompletedChangedUniformizerArtinCandidate_zpowers_eq_fixingSubgroup] + exact hfix + obtain ⟨j, hj⟩ := Subgroup.mem_zpowers_iff.mp hpower + apply Subgroup.mem_zpowers_iff.mpr + refine ⟨j, ?_⟩ + apply AlgEquiv.restrictScalars_injective ℚ_[p] + change forget (τ ^ j) = forget g + rw [map_zpow] + change σ ^ j = forget g + exact hj + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFrobenius.lean new file mode 100644 index 0000000000..9fac774a79 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFrobenius.lean @@ -0,0 +1,205 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedResidueFrobenius +/-! +# Frobenius orientation in the completed standard/changed compositum + +The finite standard/changed compositum is unramified over the completed +changed-uniformizer fixed field. Its explicit relative Artin candidate is +the restriction of inverse completed coefficient Frobenius. + +Both automorphisms can be compared faithfully on residue fields. Completed +coefficient Frobenius and relative residue arithmetic Frobenius are the same +`p`-power map, so the explicit candidate is the inverse of the actual +arithmetic Frobenius of the finite unramified extension. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate + +open scoped ValuativeRel + +open LocalFieldTheory +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +/-- The explicit changed-uniformizer relative Artin candidate is the +inverse of the actual arithmetic Frobenius of the unramified finite +standard/changed compositum. -/ +theorem + padicCompletedChangedUniformizerRelativeArtinCandidate_eq_inverseArithmeticFrobenius + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + let D := padicCompletedChangedUniformizerFixedField p u n + let M := padicCompletedStandardChangedCompositum p u n + let : FiniteDimensional D M := + FiniteDimensional.right ℚ_[p] D M + let : IsGalois D M := + IsGalois.tower_top_of_isGalois ℚ_[p] D M + letI : NontriviallyNormedField D := + finiteExtensionSpectralNormedField ℚ_[p] D + letI : ValuativeRel D := + finiteExtensionSpectralValuativeRel ℚ_[p] D + let : IsNonarchimedeanLocalField D := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] D + letI : NontriviallyNormedField M := + finiteExtensionSpectralNormedField ℚ_[p] M + letI : ValuativeRel M := + finiteExtensionSpectralValuativeRel ℚ_[p] M + let : IsNonarchimedeanLocalField M := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] M + let : + Valuation.HasExtension (ValuativeRel.valuation D) + (ValuativeRel.valuation M) := + finiteExtensionSpectralValuation_hasExtension_of_tower + ℚ_[p] D M + let : + Module.Finite + (ValuativeRel.valuation D).integer + (ValuativeRel.valuation M).integer := + integerRing_moduleFinite_of_finite_separable D M + let : + IsIntegralClosure + (ValuativeRel.valuation M).integer + (ValuativeRel.valuation D).integer M := + padicCompletedStandardChangedCompositum_integerRing_isIntegralClosure + p u n + let : + IsNonarchimedeanLocalField.IsUnramifiedValuedExtension D M := + padicCompletedStandardChangedCompositum_isUnramifiedValuedExtension + p u n + padicCompletedChangedUniformizerRelativeArtinCandidate p u n = + (arithmeticFrobeniusOfUnramifiedValuation D M)⁻¹ := by + let D := padicCompletedChangedUniformizerFixedField p u n + let M := padicCompletedStandardChangedCompositum p u n + let : FiniteDimensional D M := + FiniteDimensional.right ℚ_[p] D M + let : IsGalois D M := + IsGalois.tower_top_of_isGalois ℚ_[p] D M + let : NontriviallyNormedField D := + finiteExtensionSpectralNormedField ℚ_[p] D + let : ValuativeRel D := + finiteExtensionSpectralValuativeRel ℚ_[p] D + let : IsNonarchimedeanLocalField D := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] D + let : NontriviallyNormedField M := + finiteExtensionSpectralNormedField ℚ_[p] M + let : ValuativeRel M := + finiteExtensionSpectralValuativeRel ℚ_[p] M + let : IsNonarchimedeanLocalField M := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] M + let : + Valuation.HasExtension (ValuativeRel.valuation D) + (ValuativeRel.valuation M) := + finiteExtensionSpectralValuation_hasExtension_of_tower + ℚ_[p] D M + let : + Module.Finite + (ValuativeRel.valuation D).integer + (ValuativeRel.valuation M).integer := + integerRing_moduleFinite_of_finite_separable D M + let : + IsIntegralClosure + (ValuativeRel.valuation M).integer + (ValuativeRel.valuation D).integer M := + padicCompletedStandardChangedCompositum_integerRing_isIntegralClosure + p u n + let : + IsNonarchimedeanLocalField.IsUnramifiedValuedExtension D M := + padicCompletedStandardChangedCompositum_isUnramifiedValuedExtension + p u n + have hM : + IsLocalRing.ResidueField + (localCompleteDVF M).valuation.valuationSubring = + 𝓀[M] := by + rw [localCompleteDVF_valuation_eq M] + rfl + have hD : + IsLocalRing.ResidueField + (localCompleteDVF D).valuation.valuationSubring = + 𝓀[D] := by + rw [localCompleteDVF_valuation_eq D] + rfl + cases hM + cases hD + apply + galoisGroupResidueAlgEquivHomOfIsIntegralClosure_injective_of_unramifiedValuation + D M + calc + galoisGroupResidueAlgEquivHomOfIsIntegralClosure D M + (padicCompletedChangedUniformizerRelativeArtinCandidate p u n) = + (residueExtensionArithmeticFrobeniusOfValuationExtension D M)⁻¹ := by + apply AlgEquiv.ext + intro a + rw [galoisGroupResidueAlgEquivHomOfIsIntegralClosure_apply D M] + let embedding := + padicCompletedStandardChangedCompositumResidueEmbedding p u n + let completedFrobenius := + IsLocalRing.ResidueField.mapEquiv + (padicCompletedUnitFrobeniusIntegerEquiv p n u⁻¹) + let x : + IsLocalRing.ResidueField + (localCompleteDVF M).valuation.valuationSubring := + (residueExtensionArithmeticFrobeniusOfValuationExtension D M)⁻¹ a + apply embedding.injective + change + embedding + (galoisGroupResidueFieldEquivOfIsIntegralClosure + D M + (padicCompletedChangedUniformizerRelativeArtinCandidate + p u n) a) = + embedding x + rw [show + embedding + (galoisGroupResidueFieldEquivOfIsIntegralClosure + D M + (padicCompletedChangedUniformizerRelativeArtinCandidate + p u n) a) = + IsLocalRing.ResidueField.mapEquiv + (padicCompletedUnitFrobeniusIntegerEquiv p n u⁻¹).symm + (embedding a) by + simpa only [localCompleteDVF_valuation_eq] using + padicCompletedStandardChangedCompositumResidueEmbedding_artinCandidate + p u n a] + apply completedFrobenius.symm_apply_eq.2 + symm + calc + completedFrobenius (embedding x) = embedding x ^ p := by + exact + padicCompletedUnitFrobeniusIntegerEquiv_residue_apply_eq_pow + p n u⁻¹ (embedding x) + _ = embedding (x ^ p) := (embedding.map_pow x p).symm + _ = + embedding + (residueExtensionArithmeticFrobeniusOfValuationExtension D M x) := by + congr 1 + exact + (padicCompletedStandardChangedCompositum_residueArithmeticFrobenius_apply + p u n x).symm + _ = embedding a := by + exact congrArg embedding + ((residueExtensionArithmeticFrobeniusOfValuationExtension + D M).apply_symm_apply a) + _ = + (galoisGroupResidueAlgEquivHomOfIsIntegralClosure D M + (arithmeticFrobeniusOfUnramifiedValuation D M))⁻¹ := by + apply congrArg (fun σ => σ⁻¹) + simpa only [galoisGroupResidueAlgEquivHomOfIsIntegralClosure_apply] using + (galoisGroupResidueAlgEquivOfIsIntegralClosure_arithmeticFrobenius D M).symm + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardResidue.lean new file mode 100644 index 0000000000..9d9ac8874c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardResidue.lean @@ -0,0 +1,693 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusEvaluation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation +/-! +# Residue embedding for the completed standard/changed compositum + +The finite standard/changed compositum is realized inside the completed +Lubin--Tate level. Uniqueness of the finite extension of the p-adic +valuation therefore gives a canonical injection from its residue field into +the residue field of the ambient completed level. + +This injection is the faithful comparison map used to identify the finite +relative Artin candidate with inverse arithmetic Frobenius. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate + +open scoped ValuativeRel + +open LocalFieldTheory +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +/-- The actual finite changed-uniformizer Lubin--Tate level is totally +ramified, hence its residue field is still `𝔽_p`. -/ +theorem padicChangedUniformizerLevelResidueField_card + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + let hπ := + standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u + Nat.card + (standardLubinTateLevelCompleteDVF hπ n).residueField = + p := by + let F := padicLocalField p + have h₀ := padicMultiplicativeLubinTateSeries_isUniformizer p + let hπ := + standardLubinTateChangedUniformizer_isUniformizer + h₀ u + let base := F.toCompleteDVF + let target := standardLubinTateLevelCompleteDVF hπ n + let d := degree base.toDVF target.toDVF + let f := residueDegree base.toDVF target.toDVF + have hbaseCard : Nat.card base.residueField = p := by + change Nat.card (padicCompleteDVF p).residueField = p + exact padicCompleteDVF_residueField_card p + have hd : 0 < d := by + rw [show d = + Module.finrank ℚ_[p] + (standardLubinTateLevelField hπ n) by + rfl, + standardLubinTateLevelField_finrank hπ n, + hbaseCard] + exact Nat.mul_pos + (Nat.sub_pos_of_lt (Fact.out : p.Prime).one_lt) + (Nat.pow_pos (Fact.out : p.Prime).pos) + have hf : f = 1 := by + have hfund := + standardLubinTateLevelCompleteDVF_fundamentalIdentity hπ n + rw [standardLubinTateLevel_ramificationIndex_eq_degree hπ n] + at hfund + apply Nat.eq_of_mul_eq_mul_left hd + simpa only [mul_one, d, f] using hfund.symm + let : FiniteDimensional base.residueField target.residueField := + residueField_finiteDimensional_of_moduleFinite base target + have hfinrank : + f = Module.finrank base.residueField target.residueField := by + exact residueDegree_eq_finrank_quotient base target + calc + Nat.card target.residueField = + Nat.card base.residueField ^ + Module.finrank base.residueField target.residueField := + Module.natCard_eq_pow_finrank + _ = Nat.card base.residueField ^ f := by + rw [← hfinrank] + _ = p := by rw [hf, pow_one, hbaseCard] + +/-- The completed changed-uniformizer fixed field has residue field +cardinality `p`. The proof transports the residue field in both directions +along the genuine equivalence with the finite changed Lubin--Tate level and +uses uniqueness of finite extensions of the p-adic valuation. -/ +theorem padicCompletedChangedUniformizerFixedField_residueField_card + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + let D := padicCompletedChangedUniformizerFixedField p u n + letI : NontriviallyNormedField D := + finiteExtensionSpectralNormedField ℚ_[p] D + letI : ValuativeRel D := + finiteExtensionSpectralValuativeRel ℚ_[p] D + letI : IsNonarchimedeanLocalField D := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] D + Nat.card (localCompleteDVF D).residueField = p := by + let F := padicLocalField p + let hπ := + standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u + let L := standardLubinTateLevelField hπ n + let D := padicCompletedChangedUniformizerFixedField p u n + let padicBase := F.toCompleteDVF + let targetL := standardLubinTateLevelCompleteDVF hπ n + let e : L ≃ₐ[ℚ_[p]] D := + padicChangedUniformizerLevelEquivCompletedFixedField p u n + let : FiniteDimensional ℚ_[p] L := + standardLubinTateLevelField_finiteDimensional hπ n + let : IsAbelianGalois ℚ_[p] L := + standardLubinTateLevelField_isAbelianGalois F hπ n + let : NontriviallyNormedField D := + finiteExtensionSpectralNormedField ℚ_[p] D + let : ValuativeRel D := + finiteExtensionSpectralValuativeRel ℚ_[p] D + let : IsNonarchimedeanLocalField D := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] D + let targetD := localCompleteDVF D + let : + Valuation.HasExtension (ValuativeRel.valuation ℚ_[p]) + (ValuativeRel.valuation D) := + finiteExtensionSpectralValuation_hasExtension ℚ_[p] D + let : + (localCompleteDVF ℚ_[p]).valuation.HasExtension + targetD.valuation := + localCompleteDVFValuation_hasExtension ℚ_[p] D + let : padicBase.valuation.HasExtension targetD.valuation := + padicLocalFieldValuation_hasExtension_of_localCompleteDVF + p targetD.valuation + let inclusionLD : L →+* D := e.toRingHom + have inclusionLD_comp : + inclusionLD.comp (algebraMap ℚ_[p] L) = + algebraMap ℚ_[p] D := by + apply RingHom.ext + intro x + exact e.commutes x + let : + padicBase.valuation.HasExtension + (targetD.valuation.comap inclusionLD) := + hasExtension_comap_of_algebraMap_compatible + inclusionLD inclusionLD_comp + have hEquivLD : + targetL.valuation.IsEquiv + (targetD.valuation.comap inclusionLD) := + valuation_isEquiv_of_finite_separable + padicBase targetL (targetD.valuation.comap inclusionLD) + let residueLD : targetL.residueField →+* targetD.residueField := + residueFieldMapOfIsEquivComap + targetL.valuation targetD.valuation inclusionLD hEquivLD + let inclusionDL : D →+* L := e.symm.toRingHom + have inclusionDL_comp : + inclusionDL.comp (algebraMap ℚ_[p] D) = + algebraMap ℚ_[p] L := by + apply RingHom.ext + intro x + exact e.symm.commutes x + let : + padicBase.valuation.HasExtension + (targetL.valuation.comap inclusionDL) := + hasExtension_comap_of_algebraMap_compatible + inclusionDL inclusionDL_comp + have hEquivDL : + targetD.valuation.IsEquiv + (targetL.valuation.comap inclusionDL) := + valuation_isEquiv_of_finite_separable + padicBase targetD (targetL.valuation.comap inclusionDL) + let residueDL : targetD.residueField →+* targetL.residueField := + residueFieldMapOfIsEquivComap + targetD.valuation targetL.valuation inclusionDL hEquivDL + let : FiniteDimensional padicBase.residueField targetL.residueField := + residueField_finiteDimensional_of_moduleFinite + padicBase targetL + let : Finite padicBase.residueField := by + change Finite (padicCompleteDVF p).residueField + exact padicCompleteDVF_residueField_finite p + let : Finite targetL.residueField := + Module.finite_of_finite padicBase.residueField + let : Finite targetD.residueField := by + change Finite 𝓀[D] + infer_instance + have hLD : + Nat.card targetL.residueField ≤ Nat.card targetD.residueField := + Nat.card_le_card_of_injective residueLD residueLD.injective + have hDL : + Nat.card targetD.residueField ≤ Nat.card targetL.residueField := + Nat.card_le_card_of_injective residueDL residueDL.injective + calc + Nat.card targetD.residueField = + Nat.card targetL.residueField := + le_antisymm hDL hLD + _ = p := + padicChangedUniformizerLevelResidueField_card p u n + +/-- Relative residue arithmetic Frobenius for the finite +standard/changed compositum is the `p`-power map. -/ +theorem + padicCompletedStandardChangedCompositum_residueArithmeticFrobenius_apply + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + let D := padicCompletedChangedUniformizerFixedField p u n + let M := padicCompletedStandardChangedCompositum p u n + letI : NontriviallyNormedField D := + finiteExtensionSpectralNormedField ℚ_[p] D + letI : ValuativeRel D := + finiteExtensionSpectralValuativeRel ℚ_[p] D + letI : IsNonarchimedeanLocalField D := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] D + letI : NontriviallyNormedField M := + finiteExtensionSpectralNormedField ℚ_[p] M + letI : ValuativeRel M := + finiteExtensionSpectralValuativeRel ℚ_[p] M + let : IsNonarchimedeanLocalField M := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] M + let : + Valuation.HasExtension (ValuativeRel.valuation D) + (ValuativeRel.valuation M) := + finiteExtensionSpectralValuation_hasExtension_of_tower + ℚ_[p] D M + ∀ x : IsLocalRing.ResidueField + (localCompleteDVF M).valuation.valuationSubring, + residueExtensionArithmeticFrobeniusOfValuationExtension + D M x = + x ^ p := by + dsimp only + let D := padicCompletedChangedUniformizerFixedField p u n + let M := padicCompletedStandardChangedCompositum p u n + let : NontriviallyNormedField D := + finiteExtensionSpectralNormedField ℚ_[p] D + let : ValuativeRel D := + finiteExtensionSpectralValuativeRel ℚ_[p] D + let : IsNonarchimedeanLocalField D := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] D + let : NontriviallyNormedField M := + finiteExtensionSpectralNormedField ℚ_[p] M + let : ValuativeRel M := + finiteExtensionSpectralValuativeRel ℚ_[p] M + let : IsNonarchimedeanLocalField M := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] M + let : + Valuation.HasExtension (ValuativeRel.valuation D) + (ValuativeRel.valuation M) := + finiteExtensionSpectralValuation_hasExtension_of_tower + ℚ_[p] D M + have hM : + IsLocalRing.ResidueField + (localCompleteDVF M).valuation.valuationSubring = + 𝓀[M] := by + rw [localCompleteDVF_valuation_eq M] + rfl + have hD : + IsLocalRing.ResidueField + (localCompleteDVF D).valuation.valuationSubring = + 𝓀[D] := by + rw [localCompleteDVF_valuation_eq D] + rfl + have hcard := + padicCompletedChangedUniformizerFixedField_residueField_card p u n + dsimp only at hcard + have hcardRaw : Nat.card 𝓀[D] = p := by + rw [← hD] + exact hcard + cases hM + cases hD + intro x + exact + (residueExtensionArithmeticFrobeniusOfValuationExtension_apply D M + (show 𝓀[M] from x)).trans + (congrArg (fun k : ℕ => (show 𝓀[M] from x) ^ k) hcardRaw) + +/-- The residue field of the completed changed-uniformizer fixed field embeds +into the residue field of the ambient completed Lubin--Tate level. -/ +noncomputable def padicCompletedChangedFieldResidueEmbedding + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + let D := padicCompletedChangedUniformizerFixedField p u n + letI : NontriviallyNormedField D := + finiteExtensionSpectralNormedField ℚ_[p] D + letI : ValuativeRel D := + finiteExtensionSpectralValuativeRel ℚ_[p] D + letI : IsNonarchimedeanLocalField D := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] D + IsLocalRing.ResidueField + (localCompleteDVF D).valuationSubring →+* + IsLocalRing.ResidueField + (padicCompletedLevelCompleteDVF p n).valuationSubring := by + let D := padicCompletedChangedUniformizerFixedField p u n + let E := padicCompletedLevelField p n + let padicBase := (padicLocalField p).toCompleteDVF + let canonicalBase := localCompleteDVF ℚ_[p] + let coefficient := padicCompletedUnramifiedCompleteDVF p + let ambient := padicCompletedLevelCompleteDVF p n + letI : NontriviallyNormedField D := + finiteExtensionSpectralNormedField ℚ_[p] D + letI : ValuativeRel D := + finiteExtensionSpectralValuativeRel ℚ_[p] D + let : IsNonarchimedeanLocalField D := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] D + let : + Valuation.HasExtension (ValuativeRel.valuation ℚ_[p]) + (ValuativeRel.valuation D) := + finiteExtensionSpectralValuation_hasExtension ℚ_[p] D + let : + canonicalBase.valuation.HasExtension + (localCompleteDVF D).valuation := + localCompleteDVFValuation_hasExtension ℚ_[p] D + let : padicBase.valuation.HasExtension coefficient.valuation := + padicCompletedUnramifiedValuation_hasExtension p + let : coefficient.valuation.HasExtension ambient.valuation := + padicCompletedLevelCompleteDVF_hasExtension p n + let : padicBase.valuation.HasExtension ambient.valuation := + ValuationTheory.DiscreteValuationField.Valuation.hasExtension_trans + padicBase.valuation coefficient.valuation + ambient.valuation + let : + canonicalBase.valuation.HasExtension ambient.valuation := + localCompleteDVFValuation_hasExtension_of_padicLocalField + p ambient.valuation + let inclusion : D →+* E := D.val.toRingHom + have inclusion_comp : inclusion.comp (algebraMap ℚ_[p] D) = algebraMap ℚ_[p] E := + RingHom.ext fun x => D.val.commutes x + let : + canonicalBase.valuation.HasExtension + (ambient.valuation.comap inclusion) := + hasExtension_comap_of_algebraMap_compatible + inclusion inclusion_comp + have hEquiv : + (localCompleteDVF D).valuation.IsEquiv + (ambient.valuation.comap inclusion) := + valuation_isEquiv_of_finite_separable + canonicalBase (localCompleteDVF D) + (ambient.valuation.comap inclusion) + exact + residueFieldMapOfIsEquivComap + (localCompleteDVF D).valuation ambient.valuation + inclusion hEquiv + +/-- The residue field of the finite standard/changed compositum embeds into +the residue field of the ambient completed Lubin--Tate level. -/ +noncomputable def + padicCompletedStandardChangedCompositumResidueEmbedding + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + let M := padicCompletedStandardChangedCompositum p u n + letI : NontriviallyNormedField M := + finiteExtensionSpectralNormedField ℚ_[p] M + letI : ValuativeRel M := + finiteExtensionSpectralValuativeRel ℚ_[p] M + let : IsNonarchimedeanLocalField M := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] M + IsLocalRing.ResidueField + (localCompleteDVF M).valuationSubring →+* + IsLocalRing.ResidueField + (padicCompletedLevelCompleteDVF p n).valuationSubring := by + let M := padicCompletedStandardChangedCompositum p u n + let E := padicCompletedLevelField p n + let padicBase := (padicLocalField p).toCompleteDVF + let canonicalBase := localCompleteDVF ℚ_[p] + let coefficient := padicCompletedUnramifiedCompleteDVF p + let ambient := padicCompletedLevelCompleteDVF p n + letI : NontriviallyNormedField M := + finiteExtensionSpectralNormedField ℚ_[p] M + letI : ValuativeRel M := + finiteExtensionSpectralValuativeRel ℚ_[p] M + let : IsNonarchimedeanLocalField M := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] M + let : + Valuation.HasExtension (ValuativeRel.valuation ℚ_[p]) + (ValuativeRel.valuation M) := + finiteExtensionSpectralValuation_hasExtension ℚ_[p] M + let : + canonicalBase.valuation.HasExtension + (localCompleteDVF M).valuation := + localCompleteDVFValuation_hasExtension ℚ_[p] M + let : padicBase.valuation.HasExtension coefficient.valuation := + padicCompletedUnramifiedValuation_hasExtension p + let : coefficient.valuation.HasExtension ambient.valuation := + padicCompletedLevelCompleteDVF_hasExtension p n + let : padicBase.valuation.HasExtension ambient.valuation := + ValuationTheory.DiscreteValuationField.Valuation.hasExtension_trans + padicBase.valuation coefficient.valuation + ambient.valuation + let : + canonicalBase.valuation.HasExtension ambient.valuation := + localCompleteDVFValuation_hasExtension_of_padicLocalField + p ambient.valuation + let inclusion : M →+* E := M.val.toRingHom + have inclusion_comp : inclusion.comp (algebraMap ℚ_[p] M) = algebraMap ℚ_[p] E := + RingHom.ext fun x => M.val.commutes x + let : + canonicalBase.valuation.HasExtension + (ambient.valuation.comap inclusion) := + hasExtension_comap_of_algebraMap_compatible + inclusion inclusion_comp + have hEquiv : + (localCompleteDVF M).valuation.IsEquiv + (ambient.valuation.comap inclusion) := + valuation_isEquiv_of_finite_separable + canonicalBase (localCompleteDVF M) + (ambient.valuation.comap inclusion) + exact + residueFieldMapOfIsEquivComap + (localCompleteDVF M).valuation ambient.valuation + inclusion hEquiv + +/-- The ambient residue comparison for the finite standard/changed +compositum is injective. -/ +theorem + padicCompletedStandardChangedCompositumResidueEmbedding_injective + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + Function.Injective + (padicCompletedStandardChangedCompositumResidueEmbedding + p u n) := + (padicCompletedStandardChangedCompositumResidueEmbedding + p u n).injective + +/-- The finite standard/changed compositum is finite-dimensional over its +changed-uniformizer fixed subfield. -/ +noncomputable instance + padicCompletedStandardChangedCompositum_finiteDimensional_over_changedField + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + FiniteDimensional + (padicCompletedChangedUniformizerFixedField p u n) + (padicCompletedStandardChangedCompositum p u n) := + FiniteDimensional.right ℚ_[p] + (padicCompletedChangedUniformizerFixedField p u n) + (padicCompletedStandardChangedCompositum p u n) + +/-- The finite standard/changed compositum is Galois over its changed fixed +subfield. -/ +noncomputable instance + padicCompletedStandardChangedCompositum_isGalois_over_changedField + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + IsGalois + (padicCompletedChangedUniformizerFixedField p u n) + (padicCompletedStandardChangedCompositum p u n) := + IsGalois.tower_top_of_isGalois ℚ_[p] + (padicCompletedChangedUniformizerFixedField p u n) + (padicCompletedStandardChangedCompositum p u n) + +/-- The changed fixed field carries its canonical finite-extension spectral +norm. -/ +noncomputable instance + padicCompletedChangedUniformizerFixedFieldNontriviallyNormedField + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + NontriviallyNormedField + (padicCompletedChangedUniformizerFixedField p u n) := + finiteExtensionSpectralNormedField ℚ_[p] + (padicCompletedChangedUniformizerFixedField p u n) + +/-- The standard/changed compositum carries its canonical finite-extension +spectral norm. -/ +noncomputable instance + padicCompletedStandardChangedCompositumNontriviallyNormedField + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + NontriviallyNormedField + (padicCompletedStandardChangedCompositum p u n) := + finiteExtensionSpectralNormedField ℚ_[p] + (padicCompletedStandardChangedCompositum p u n) + +/-- The changed fixed field has the canonical valuative relation induced by +its finite p-adic spectral norm. -/ +noncomputable instance + padicCompletedChangedUniformizerFixedFieldValuativeRel + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + ValuativeRel + (padicCompletedChangedUniformizerFixedField p u n) := + finiteExtensionSpectralValuativeRel ℚ_[p] + (padicCompletedChangedUniformizerFixedField p u n) + +/-- The standard/changed compositum has the canonical valuative relation +induced by its finite p-adic spectral norm. -/ +noncomputable instance + padicCompletedStandardChangedCompositumValuativeRel + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + ValuativeRel + (padicCompletedStandardChangedCompositum p u n) := + finiteExtensionSpectralValuativeRel ℚ_[p] + (padicCompletedStandardChangedCompositum p u n) + +/-- The changed fixed field is a nonarchimedean local field for its canonical +finite p-adic spectral topology. -/ +noncomputable instance + padicCompletedChangedUniformizerFixedField_isNonarchimedeanLocalField + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + IsNonarchimedeanLocalField + (padicCompletedChangedUniformizerFixedField p u n) := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] + (padicCompletedChangedUniformizerFixedField p u n) + +/-- The standard/changed compositum is a nonarchimedean local field for its +canonical finite p-adic spectral topology. -/ +noncomputable instance + padicCompletedStandardChangedCompositum_isNonarchimedeanLocalField + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + IsNonarchimedeanLocalField + (padicCompletedStandardChangedCompositum p u n) := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] + (padicCompletedStandardChangedCompositum p u n) + +/-- The canonical spectral valuation of the standard/changed compositum +extends that of the changed fixed field. -/ +noncomputable instance + padicCompletedStandardChangedCompositum_valuation_hasExtension + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + Valuation.HasExtension + (ValuativeRel.valuation + (padicCompletedChangedUniformizerFixedField p u n)) + (ValuativeRel.valuation + (padicCompletedStandardChangedCompositum p u n)) := + finiteExtensionSpectralValuation_hasExtension_of_tower ℚ_[p] + (padicCompletedChangedUniformizerFixedField p u n) + (padicCompletedStandardChangedCompositum p u n) + +/-- The canonical complete-DVF valuation of the standard/changed compositum +extends the one on the changed fixed field. -/ +noncomputable instance + padicCompletedStandardChangedCompositum_localCompleteDVFValuation_hasExtension + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + (localCompleteDVF + (padicCompletedChangedUniformizerFixedField p u n)).valuation.HasExtension + (localCompleteDVF + (padicCompletedStandardChangedCompositum p u n)).valuation := + localCompleteDVFValuation_hasExtension + (padicCompletedChangedUniformizerFixedField p u n) + (padicCompletedStandardChangedCompositum p u n) + +/-- The canonical valuation ring of the standard/changed compositum is the +integral closure of that of the changed fixed field. -/ +noncomputable instance + padicCompletedStandardChangedCompositum_valuationSubring_isIntegralClosure + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + IsIntegralClosure + (localCompleteDVF + (padicCompletedStandardChangedCompositum p u n)).valuationSubring + (localCompleteDVF + (padicCompletedChangedUniformizerFixedField p u n)).valuationSubring + (padicCompletedStandardChangedCompositum p u n) := + target_valuationSubring_isIntegralClosure_of_finite_separable + (localCompleteDVF + (padicCompletedChangedUniformizerFixedField p u n)) + (localCompleteDVF + (padicCompletedStandardChangedCompositum p u n)) + +/-- The actual valuative integer ring of the standard/changed compositum is +the integral closure of the actual valuative integer ring of the changed +fixed field. -/ +noncomputable instance + padicCompletedStandardChangedCompositum_integerRing_isIntegralClosure + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + IsIntegralClosure + 𝒪[padicCompletedStandardChangedCompositum p u n] + 𝒪[padicCompletedChangedUniformizerFixedField p u n] + (padicCompletedStandardChangedCompositum p u n) := by + have h := + padicCompletedStandardChangedCompositum_valuationSubring_isIntegralClosure + p u n + change IsIntegralClosure + (localCompleteDVF + (padicCompletedStandardChangedCompositum p u n)).valuation.valuationSubring + (localCompleteDVF + (padicCompletedChangedUniformizerFixedField p u n)).valuation.valuationSubring + (padicCompletedStandardChangedCompositum p u n) at h + rw [localCompleteDVF_valuation_eq, + localCompleteDVF_valuation_eq] at h + exact h + +/-- Under the ambient residue embedding, the residue action of the finite +relative Artin candidate is the residue action of inverse completed +Frobenius. -/ +theorem + padicCompletedStandardChangedCompositumResidueEmbedding_artinCandidate + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) + (a : IsLocalRing.ResidueField + (localCompleteDVF + (padicCompletedStandardChangedCompositum p u n)).valuationSubring) : + padicCompletedStandardChangedCompositumResidueEmbedding p u n + (galoisGroupResidueFieldEquivOfIsIntegralClosure + (padicCompletedChangedUniformizerFixedField p u n) + (padicCompletedStandardChangedCompositum p u n) + (padicCompletedChangedUniformizerRelativeArtinCandidate + p u n) a) = + IsLocalRing.ResidueField.mapEquiv + (padicCompletedUnitFrobeniusIntegerEquiv p n u⁻¹).symm + (padicCompletedStandardChangedCompositumResidueEmbedding + p u n a) := by + let D := padicCompletedChangedUniformizerFixedField p u n + let M := padicCompletedStandardChangedCompositum p u n + let E := padicCompletedLevelField p n + let padicBase := (padicLocalField p).toCompleteDVF + let canonicalBase := localCompleteDVF ℚ_[p] + let coefficient := padicCompletedUnramifiedCompleteDVF p + let ambient := padicCompletedLevelCompleteDVF p n + let : + Valuation.HasExtension (ValuativeRel.valuation ℚ_[p]) + (ValuativeRel.valuation M) := + finiteExtensionSpectralValuation_hasExtension ℚ_[p] M + let : + canonicalBase.valuation.HasExtension + (localCompleteDVF M).valuation := + localCompleteDVFValuation_hasExtension ℚ_[p] M + let : padicBase.valuation.HasExtension coefficient.valuation := + padicCompletedUnramifiedValuation_hasExtension p + let : coefficient.valuation.HasExtension ambient.valuation := + padicCompletedLevelCompleteDVF_hasExtension p n + let : padicBase.valuation.HasExtension ambient.valuation := + ValuationTheory.DiscreteValuationField.Valuation.hasExtension_trans + padicBase.valuation coefficient.valuation + ambient.valuation + let : + canonicalBase.valuation.HasExtension ambient.valuation := + localCompleteDVFValuation_hasExtension_of_padicLocalField + p ambient.valuation + let inclusion : M →+* E := M.val.toRingHom + have inclusion_comp : inclusion.comp (algebraMap ℚ_[p] M) = algebraMap ℚ_[p] E := + RingHom.ext fun x => M.val.commutes x + let : + canonicalBase.valuation.HasExtension + (ambient.valuation.comap inclusion) := + hasExtension_comap_of_algebraMap_compatible + inclusion inclusion_comp + have hEquiv : + (localCompleteDVF M).valuation.IsEquiv + (ambient.valuation.comap inclusion) := + valuation_isEquiv_of_finite_separable + canonicalBase (localCompleteDVF M) + (ambient.valuation.comap inclusion) + let τ := + padicCompletedChangedUniformizerRelativeArtinCandidate p u n + let σM : + (localCompleteDVF M).valuationSubring ≃+* + (localCompleteDVF M).valuationSubring := + galoisGroupIntegerRingEquivOfIsIntegralClosure D M τ + let σE : + ambient.valuationSubring ≃+* ambient.valuationSubring := + (padicCompletedUnitFrobeniusIntegerEquiv p n u⁻¹).symm + have hcompat : + ∀ b : (localCompleteDVF M).valuationSubring, + valuationSubringMapOfIsEquivComap + (localCompleteDVF M).valuation ambient.valuation + inclusion hEquiv (σM b) = + σE + (valuationSubringMapOfIsEquivComap + (localCompleteDVF M).valuation ambient.valuation + inclusion hEquiv b) := by + intro b + apply Subtype.ext + change + M.val (τ (b : M)) = + (padicCompletedUnitFrobeniusLiftEquiv p n u⁻¹).symm + (M.val (b : M)) + rfl + change + residueFieldMapOfIsEquivComap + (localCompleteDVF M).valuation ambient.valuation + inclusion hEquiv + (IsLocalRing.ResidueField.mapEquiv σM a) = + IsLocalRing.ResidueField.mapEquiv σE + (residueFieldMapOfIsEquivComap + (localCompleteDVF M).valuation ambient.valuation + inclusion hEquiv a) + exact + residueFieldMapOfIsEquivComap_mapEquiv + (localCompleteDVF M).valuation ambient.valuation + inclusion hEquiv σM σE hcompat a + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardUnramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardUnramified.lean new file mode 100644 index 0000000000..90da1e0fa3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardUnramified.lean @@ -0,0 +1,367 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicValuationComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFixedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveUniformizer +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AmbientUniformizer +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness +/-! +# The completed standard/changed compositum is unramified over the changed field + +The genuine changed-uniformizer theta point is a uniformizer of the ambient +completed Lubin--Tate level. Uniqueness of finite separable extensions of +the p-adic valuation transports this fact to both the changed fixed field and +the finite standard/changed compositum. Since the same element is a +uniformizer on both sides, their relative ramification index is one. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.ValuedExtension renaming + ramificationIndex_eq_one_of_integerMap_uniformizer → + ramificationIndex_eq_one_of_integerMap_uniformizer + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + moduleFinite_target_valuationSubring_of_finite_separable → + moduleFinite_target_valuationSubring_of_finite_separable + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + moduleIsTorsionFree_target_valuationSubring_of_finite_separable → + moduleIsTorsionFree_target_valuationSubring_of_finite_separable + + +noncomputable +section + +namespace LubinTate + +open scoped ValuativeRel + +open LocalFieldTheory +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +/-- The changed prime element is a uniformizer both in the changed fixed +field and in the finite standard/changed compositum, when both finite fields +carry their canonical p-adic spectral valuations. -/ +theorem + padicCompletedChangedUniformizerPrimeElement_isUniformizer_in_changedField_and_compositum + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + let D := padicCompletedChangedUniformizerFixedField p u n + let M := padicCompletedStandardChangedCompositum p u n + letI : NontriviallyNormedField D := + finiteExtensionSpectralNormedField ℚ_[p] D + letI : ValuativeRel D := + finiteExtensionSpectralValuativeRel ℚ_[p] D + let : IsNonarchimedeanLocalField D := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] D + letI : NontriviallyNormedField M := + finiteExtensionSpectralNormedField ℚ_[p] M + letI : ValuativeRel M := + finiteExtensionSpectralValuativeRel ℚ_[p] M + let : IsNonarchimedeanLocalField M := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] M + (localCompleteDVF D).valuation.IsUniformizer + (padicCompletedChangedUniformizerPrimeElement p u n : D) ∧ + (localCompleteDVF M).valuation.IsUniformizer + (algebraMap D M + (padicCompletedChangedUniformizerPrimeElement p u n)) := by + let D := padicCompletedChangedUniformizerFixedField p u n + let M := padicCompletedStandardChangedCompositum p u n + let A := padicCompletedUnramifiedField p + let E := padicCompletedLevelField p n + let padicBase := (padicLocalField p).toCompleteDVF + let canonicalBase := localCompleteDVF ℚ_[p] + let coefficient := padicCompletedUnramifiedCompleteDVF p + let ambient := padicCompletedLevelCompleteDVF p n + let : NontriviallyNormedField D := + finiteExtensionSpectralNormedField ℚ_[p] D + let : ValuativeRel D := + finiteExtensionSpectralValuativeRel ℚ_[p] D + let : IsNonarchimedeanLocalField D := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] D + let : NontriviallyNormedField M := + finiteExtensionSpectralNormedField ℚ_[p] M + let : ValuativeRel M := + finiteExtensionSpectralValuativeRel ℚ_[p] M + let : IsNonarchimedeanLocalField M := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] M + let : + Valuation.HasExtension (ValuativeRel.valuation ℚ_[p]) + (ValuativeRel.valuation D) := + finiteExtensionSpectralValuation_hasExtension ℚ_[p] D + let : + Valuation.HasExtension (ValuativeRel.valuation ℚ_[p]) + (ValuativeRel.valuation M) := + finiteExtensionSpectralValuation_hasExtension ℚ_[p] M + let : + canonicalBase.valuation.HasExtension + (localCompleteDVF D).valuation := + localCompleteDVFValuation_hasExtension ℚ_[p] D + let : + canonicalBase.valuation.HasExtension + (localCompleteDVF M).valuation := + localCompleteDVFValuation_hasExtension ℚ_[p] M + let : padicBase.valuation.HasExtension coefficient.valuation := + padicCompletedUnramifiedValuation_hasExtension p + let : coefficient.valuation.HasExtension ambient.valuation := + padicCompletedLevelCompleteDVF_hasExtension p n + let : padicBase.valuation.HasExtension ambient.valuation := + ValuationTheory.DiscreteValuationField.Valuation.hasExtension_trans + padicBase.valuation coefficient.valuation + ambient.valuation + let : canonicalBase.valuation.HasExtension ambient.valuation := + localCompleteDVFValuation_hasExtension_of_padicLocalField + p ambient.valuation + let inclusionD : D →+* E := D.val.toRingHom + have inclusionD_comp : + inclusionD.comp (algebraMap ℚ_[p] D) = + algebraMap ℚ_[p] E := by + ext x + exact D.val.commutes x + let : + canonicalBase.valuation.HasExtension + (ambient.valuation.comap inclusionD) := + hasExtension_comap_of_algebraMap_compatible + inclusionD inclusionD_comp + let inclusionM : M →+* E := M.val.toRingHom + have inclusionM_comp : + inclusionM.comp (algebraMap ℚ_[p] M) = + algebraMap ℚ_[p] E := by + ext x + exact M.val.commutes x + let : + canonicalBase.valuation.HasExtension + (ambient.valuation.comap inclusionM) := + hasExtension_comap_of_algebraMap_compatible + inclusionM inclusionM_comp + have hthetaAmbient : + ambient.valuation.IsUniformizer + (((padicChangedUniformizerThetaValue p u n : + ambient.valuationSubring) : E)) := + padicChangedUniformizerThetaValue_isUniformizer p u n + have hthetaD : + (localCompleteDVF D).valuation.IsUniformizer + (padicCompletedChangedUniformizerPrimeElement p u n : D) := by + apply + isUniformizer_of_ambient_image_isUniformizer + canonicalBase (localCompleteDVF D) ambient inclusionD + change + ambient.valuation.IsUniformizer + (((padicChangedUniformizerThetaValue p u n : + ambient.valuationSubring) : E)) + exact hthetaAmbient + have hthetaM : + (localCompleteDVF M).valuation.IsUniformizer + (algebraMap D M + (padicCompletedChangedUniformizerPrimeElement p u n)) := by + apply + isUniformizer_of_ambient_image_isUniformizer + canonicalBase (localCompleteDVF M) ambient inclusionM + change + ambient.valuation.IsUniformizer + (((padicChangedUniformizerThetaValue p u n : + ambient.valuationSubring) : E)) + exact hthetaAmbient + exact ⟨hthetaD, hthetaM⟩ + +/-- The finite standard/changed compositum has relative ramification index +one over the changed fixed field. -/ +theorem + padicCompletedStandardChangedCompositum_ramificationIndex_eq_one + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + let D := padicCompletedChangedUniformizerFixedField p u n + let M := padicCompletedStandardChangedCompositum p u n + letI : NontriviallyNormedField D := + finiteExtensionSpectralNormedField ℚ_[p] D + letI : ValuativeRel D := + finiteExtensionSpectralValuativeRel ℚ_[p] D + let : IsNonarchimedeanLocalField D := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] D + letI : NontriviallyNormedField M := + finiteExtensionSpectralNormedField ℚ_[p] M + letI : ValuativeRel M := + finiteExtensionSpectralValuativeRel ℚ_[p] M + let : IsNonarchimedeanLocalField M := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] M + let : + Valuation.HasExtension (ValuativeRel.valuation D) + (ValuativeRel.valuation M) := + finiteExtensionSpectralValuation_hasExtension_of_tower ℚ_[p] D M + let : + (localCompleteDVF D).valuation.HasExtension + (localCompleteDVF M).valuation := + localCompleteDVFValuation_hasExtension D M + ramificationIndex (localCompleteDVF D).toDVF + (localCompleteDVF M).toDVF = 1 := by + let D := padicCompletedChangedUniformizerFixedField p u n + let M := padicCompletedStandardChangedCompositum p u n + let : NontriviallyNormedField D := + finiteExtensionSpectralNormedField ℚ_[p] D + let : ValuativeRel D := + finiteExtensionSpectralValuativeRel ℚ_[p] D + let : IsNonarchimedeanLocalField D := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] D + let : NontriviallyNormedField M := + finiteExtensionSpectralNormedField ℚ_[p] M + let : ValuativeRel M := + finiteExtensionSpectralValuativeRel ℚ_[p] M + let : IsNonarchimedeanLocalField M := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] M + let : + Valuation.HasExtension (ValuativeRel.valuation D) + (ValuativeRel.valuation M) := + finiteExtensionSpectralValuation_hasExtension_of_tower ℚ_[p] D M + let : + (localCompleteDVF D).valuation.HasExtension + (localCompleteDVF M).valuation := + localCompleteDVFValuation_hasExtension D M + let base := localCompleteDVF D + let target := localCompleteDVF M + obtain ⟨hthetaD, hthetaM⟩ := + padicCompletedChangedUniformizerPrimeElement_isUniformizer_in_changedField_and_compositum + p u n + let thetaInteger : base.valuationSubring := + ⟨padicCompletedChangedUniformizerPrimeElement p u n, + hthetaD.val_lt_one.le⟩ + have hthetaMap : + target.valuation.IsUniformizer + (((integerMap base.toDVF target.toDVF thetaInteger : + target.valuationSubring) : M)) := by + rw [integerMap_apply] + exact hthetaM + exact + ramificationIndex_eq_one_of_integerMap_uniformizer + base target thetaInteger + (by simpa only [thetaInteger] using hthetaD) + hthetaMap + +/-- With the canonical p-adic spectral valuations, the finite +standard/changed compositum is an unramified valued extension of the changed +fixed field. -/ +theorem + padicCompletedStandardChangedCompositum_isUnramifiedValuedExtension + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + let D := padicCompletedChangedUniformizerFixedField p u n + let M := padicCompletedStandardChangedCompositum p u n + let : FiniteDimensional D M := + FiniteDimensional.right ℚ_[p] D M + let : Algebra.IsSeparable D M := + Algebra.isSeparable_tower_top_of_isSeparable + (F := ℚ_[p]) (L := D) (E := M) + letI : NontriviallyNormedField D := + finiteExtensionSpectralNormedField ℚ_[p] D + letI : ValuativeRel D := + finiteExtensionSpectralValuativeRel ℚ_[p] D + let : IsNonarchimedeanLocalField D := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] D + letI : NontriviallyNormedField M := + finiteExtensionSpectralNormedField ℚ_[p] M + letI : ValuativeRel M := + finiteExtensionSpectralValuativeRel ℚ_[p] M + let : IsNonarchimedeanLocalField M := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] M + let : + Valuation.HasExtension (ValuativeRel.valuation D) + (ValuativeRel.valuation M) := + finiteExtensionSpectralValuation_hasExtension_of_tower ℚ_[p] D M + let : + (localCompleteDVF D).valuation.HasExtension + (localCompleteDVF M).valuation := + localCompleteDVFValuation_hasExtension D M + let : + IsScalarTower (localCompleteDVF D).valuationSubring + (localCompleteDVF M).valuationSubring M := + IsScalarTower.of_algebraMap_eq' rfl + let : + Module.Finite (ValuativeRel.valuation D).integer + (ValuativeRel.valuation M).integer := by + change + Module.Finite (localCompleteDVF D).valuationSubring + (localCompleteDVF M).valuationSubring + exact + moduleFinite_target_valuationSubring_of_finite_separable + (localCompleteDVF D) (localCompleteDVF M) + LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + D M := by + let D := padicCompletedChangedUniformizerFixedField p u n + let M := padicCompletedStandardChangedCompositum p u n + let : FiniteDimensional D M := + FiniteDimensional.right ℚ_[p] D M + let : Algebra.IsSeparable D M := + Algebra.isSeparable_tower_top_of_isSeparable + (F := ℚ_[p]) (L := D) (E := M) + let : NontriviallyNormedField D := + finiteExtensionSpectralNormedField ℚ_[p] D + let : ValuativeRel D := + finiteExtensionSpectralValuativeRel ℚ_[p] D + let : IsNonarchimedeanLocalField D := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] D + let : NontriviallyNormedField M := + finiteExtensionSpectralNormedField ℚ_[p] M + let : ValuativeRel M := + finiteExtensionSpectralValuativeRel ℚ_[p] M + let : IsNonarchimedeanLocalField M := + finiteExtensionSpectralIsNonarchimedeanLocalField ℚ_[p] M + let : + Valuation.HasExtension (ValuativeRel.valuation D) + (ValuativeRel.valuation M) := + finiteExtensionSpectralValuation_hasExtension_of_tower ℚ_[p] D M + let : + (localCompleteDVF D).valuation.HasExtension + (localCompleteDVF M).valuation := + localCompleteDVFValuation_hasExtension D M + let : + IsScalarTower (localCompleteDVF D).valuationSubring + (localCompleteDVF M).valuationSubring M := + IsScalarTower.of_algebraMap_eq' rfl + let : + Module.Finite (ValuativeRel.valuation D).integer + (ValuativeRel.valuation M).integer := by + change + Module.Finite (localCompleteDVF D).valuationSubring + (localCompleteDVF M).valuationSubring + exact + moduleFinite_target_valuationSubring_of_finite_separable + (localCompleteDVF D) (localCompleteDVF M) + let base := localCompleteDVF D + let target := localCompleteDVF M + let : + Module.IsTorsionFree base.valuationSubring target.valuationSubring := + moduleIsTorsionFree_target_valuationSubring_of_finite_separable + base target + have hramification : + ramificationIndex base.toDVF target.toDVF = 1 := + padicCompletedStandardChangedCompositum_ramificationIndex_eq_one + p u n + exact { + maximalIdeal_ramificationIdx_eq_one := by + change target.maximalIdeal.ramificationIdx base.valuationSubring = 1 + have hbaseMaximal_ne : + (base.maximalIdeal : Ideal base.valuationSubring) ≠ ⊥ := + Ring.ne_bot_of_isMaximal_of_not_isField + (IsLocalRing.maximalIdeal.isMaximal base.valuationSubring) + (IsDiscreteValuationRing.not_isField base.valuationSubring) + rw [← Ideal.ramificationIdx'_eq_ramificationIdx + base.maximalIdeal target.maximalIdeal hbaseMaximal_ne] + exact hramification + } + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerFixedField.lean new file mode 100644 index 0000000000..2eba84f3c0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerFixedField.lean @@ -0,0 +1,564 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerPrimitive +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerThetaFixed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedFrobeniusFixed +/-! +# The changed p-adic Lubin--Tate level as a completed Frobenius fixed field + +The completed Frobenius lift whose action on the standard primitive point is +indexed by `u⁻¹` is an actual `ℚ_[p]`-automorphism. Its fixed field is +exactly the finite changed-uniformizer Lubin--Tate level generated by the +genuine theta value. + +The key reverse inclusion is coefficient descent in the theta power basis: +fixedness makes every completed-unramified coefficient Frobenius-fixed, and +the fixed-field theorem for Witt Frobenius puts that coefficient in +`ℚ_[p]`. The final norm formula is therefore transported from the actual +finite changed level, with no comparison hypothesis. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp + +/-- The inverse-unit completed Frobenius lift, regarded as an actual +automorphism over `ℚ_[p]`. -/ +noncomputable def padicCompletedChangedUniformizerFrobeniusAlgEquiv + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + padicCompletedLevelField p n ≃ₐ[ℚ_[p]] + padicCompletedLevelField p n := + AlgEquiv.ofRingEquiv (f := padicCompletedUnitFrobeniusLiftEquiv p n u⁻¹) (by + intro b + change + padicCompletedUnitFrobeniusLiftEquiv p n u⁻¹ + (algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + (algebraMap ℚ_[p] + (padicCompletedUnramifiedField p) b)) = + algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + (algebraMap ℚ_[p] + (padicCompletedUnramifiedField p) b) + rw [padicCompletedUnitFrobeniusLiftEquiv_algebraMap, + (padicCompletedUnramifiedFrobenius p).commutes]) + +/-- The underlying action of the changed-uniformizer Frobenius +automorphism is the actual completed inverse-unit lift. -/ +@[simp] +theorem padicCompletedChangedUniformizerFrobeniusAlgEquiv_apply + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) + (x : padicCompletedLevelField p n) : + padicCompletedChangedUniformizerFrobeniusAlgEquiv p u n x = + padicCompletedUnitFrobeniusLiftEquiv p n u⁻¹ x := + rfl + +/-- The cyclic subgroup generated by the completed changed-uniformizer +Frobenius automorphism. -/ +noncomputable def padicCompletedChangedUniformizerFrobeniusSubgroup + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + Subgroup + (padicCompletedLevelField p n ≃ₐ[ℚ_[p]] + padicCompletedLevelField p n) := + Subgroup.zpowers + (padicCompletedChangedUniformizerFrobeniusAlgEquiv p u n) + +/-- The field fixed by the actual inverse-unit completed Frobenius lift. -/ +noncomputable def padicCompletedChangedUniformizerFixedField + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + IntermediateField ℚ_[p] (padicCompletedLevelField p n) := + IntermediateField.fixedField + (padicCompletedChangedUniformizerFrobeniusSubgroup p u n) + +/-- The genuine theta value belongs to the completed Frobenius fixed field. -/ +theorem padicChangedUniformizerThetaValue_mem_completedFixedField + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) ∈ + padicCompletedChangedUniformizerFixedField p u n := by + rw [padicCompletedChangedUniformizerFixedField, + IntermediateField.mem_fixedField_iff] + intro σ hσ + obtain ⟨j, rfl⟩ := Subgroup.mem_zpowers_iff.mp hσ + have hfixed : + (((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n)) ∈ + MulAction.fixedBy + (padicCompletedLevelField p n) + (padicCompletedChangedUniformizerFrobeniusAlgEquiv + p u n) := by + rw [MulAction.mem_fixedBy] + change + padicCompletedUnitFrobeniusLiftEquiv p n u⁻¹ + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) = + _ + exact + padicCompletedChangedUniformizerThetaValue_fixed_by_diagonalFrobenius + p u n + exact MulAction.mem_fixedBy_zpow hfixed j + +/-- The completed changed-level embedding is pointwise fixed by the +inverse-unit Frobenius lift. -/ +theorem padicChangedUniformizerLevelEmbedding_mem_completedFixedField + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) + (x : + standardLubinTateChangedLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) u n) : + padicChangedUniformizerLevelEmbedding p u n x ∈ + padicCompletedChangedUniformizerFixedField p u n := by + let hπ := + standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u + let L := standardLubinTateLevelField hπ n + let E := padicCompletedLevelField p n + let ι : L →ₐ[ℚ_[p]] E := + padicChangedUniformizerLevelEmbedding p u n + let δ : E ≃ₐ[ℚ_[p]] E := + padicCompletedChangedUniformizerFrobeniusAlgEquiv p u n + have hintertwine : δ.toAlgHom.comp ι = ι := by + apply (standardLubinTateLevelPowerBasis hπ n).algHom_ext + change + δ (ι (standardLubinTateLevelPowerBasis hπ n).gen) = + ι (standardLubinTateLevelPowerBasis hπ n).gen + rw [show + ι (standardLubinTateLevelPowerBasis hπ n).gen = + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) by + exact padicChangedUniformizerLevelEmbedding_apply_gen p u n] + exact + padicCompletedChangedUniformizerThetaValue_fixed_by_diagonalFrobenius + p u n + rw [padicCompletedChangedUniformizerFixedField, + IntermediateField.mem_fixedField_iff] + intro σ hσ + obtain ⟨j, rfl⟩ := Subgroup.mem_zpowers_iff.mp hσ + have hfixed : + ι x ∈ MulAction.fixedBy E δ := by + rw [MulAction.mem_fixedBy] + exact DFunLike.congr_fun hintertwine x + exact MulAction.mem_fixedBy_zpow hfixed j + +/-- The finite changed Lubin--Tate level embedded directly into the +completed Frobenius fixed field. -/ +noncomputable def padicChangedUniformizerLevelToCompletedFixedField + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + standardLubinTateChangedLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) u n + →ₐ[ℚ_[p]] + padicCompletedChangedUniformizerFixedField p u n := + (padicChangedUniformizerLevelEmbedding p u n).codRestrict + (padicCompletedChangedUniformizerFixedField p u n).toSubalgebra + (padicChangedUniformizerLevelEmbedding_mem_completedFixedField + p u n) + +/-- The fixed-field embedding sends the finite changed-level generator to +the genuine theta value. -/ +@[simp] +theorem padicChangedUniformizerLevelToCompletedFixedField_apply_gen + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + let hπ := + standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u + padicChangedUniformizerLevelToCompletedFixedField p u n + (standardLubinTateLevelPowerBasis hπ n).gen = + ⟨((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n), + padicChangedUniformizerThetaValue_mem_completedFixedField + p u n⟩ := by + apply Subtype.ext + exact padicChangedUniformizerLevelEmbedding_apply_gen p u n + +/-- A Frobenius-fixed element of the completed level belongs to the +`ℚ_[p]`-field generated by the theta value. -/ +theorem padicCompletedChangedUniformizerFrobenius_fixed_mem_adjoin_theta + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) + (x : padicCompletedLevelField p n) + (hx : + padicCompletedChangedUniformizerFrobeniusAlgEquiv p u n x = x) : + x ∈ IntermediateField.adjoin ℚ_[p] + ({((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n)} : + Set (padicCompletedLevelField p n)) := by + let A := padicCompletedUnramifiedField p + let E := padicCompletedLevelField p n + let φ := padicCompletedUnramifiedFrobenius p + let δ := + padicCompletedChangedUniformizerFrobeniusAlgEquiv p u n + let y : E := + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : E) + let pb : PowerBasis A E := + padicChangedUniformizerThetaPowerBasis p u n + let S : IntermediateField ℚ_[p] E := + IntermediateField.adjoin ℚ_[p] ({y} : Set E) + have hδCoeff (c : A) : + δ (algebraMap A E c) = + algebraMap A E (φ c) := by + change + padicCompletedUnitFrobeniusLiftEquiv p n u⁻¹ + (algebraMap A E c) = + algebraMap A E + (padicCompletedUnramifiedFrobenius p c) + exact + padicCompletedUnitFrobeniusLiftEquiv_algebraMap p n u⁻¹ c + have hδY : δ y = y := by + change + padicCompletedUnitFrobeniusLiftEquiv p n u⁻¹ + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : E) = + _ + exact + padicCompletedChangedUniformizerThetaValue_fixed_by_diagonalFrobenius + p u n + have hδBasis (i : Fin pb.dim) : + δ (pb.basis i) = pb.basis i := by + rw [pb.coe_basis, map_pow, show pb.gen = y by + exact padicChangedUniformizerThetaPowerBasis_gen p u n, hδY] + have hsemisum : + (∑ i : Fin pb.dim, φ (pb.basis.repr x i) • pb.basis i) = + x := by + calc + (∑ i : Fin pb.dim, φ (pb.basis.repr x i) • pb.basis i) = + δ (∑ i : Fin pb.dim, + pb.basis.repr x i • pb.basis i) := by + rw [map_sum] + apply Finset.sum_congr rfl + intro i hi + rw [Algebra.smul_def, Algebra.smul_def, map_mul, + hδCoeff, hδBasis] + _ = δ x := by rw [pb.basis.sum_repr] + _ = x := hx + have hcoeff (i : Fin pb.dim) : + φ (pb.basis.repr x i) = pb.basis.repr x i := by + have hrepr := congrArg pb.basis.repr hsemisum + have hi := congrArg (fun c ↦ c i) hrepr + simp only [map_sum, map_smul, Module.Basis.repr_self, + Finsupp.smul_single', mul_one] at hi + rw [Finsupp.finsetSum_apply] at hi + rw [Finset.sum_eq_single i] at hi + · simpa only [Finsupp.single_eq_same] using hi + · intro j hj hji + exact Finsupp.single_eq_of_ne hji.symm + · simp + change x ∈ S + rw [← pb.basis.sum_repr x] + apply S.sum_mem + intro i hi + rw [pb.coe_basis, Algebra.smul_def] + apply S.mul_mem + · obtain ⟨c, hc⟩ := + (padicCompletedUnramifiedFrobenius_fixed_iff + p (pb.basis.repr x i)).1 (hcoeff i) + change algebraMap A E (pb.basis.repr x i) ∈ S + rw [← hc, ← IsScalarTower.algebraMap_apply ℚ_[p] A E] + exact S.algebraMap_mem c + · have hgen : pb.gen ∈ S := by + rw [show pb.gen = y by + exact padicChangedUniformizerThetaPowerBasis_gen p u n] + exact IntermediateField.mem_adjoin_simple_self ℚ_[p] y + simpa using S.pow_mem hgen i.val + +/-- The completed inverse-unit Frobenius fixed field is exactly the +`ℚ_[p]`-field generated by the theta value. -/ +theorem padicCompletedChangedUniformizerFixedField_eq_adjoin_theta + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + padicCompletedChangedUniformizerFixedField p u n = + IntermediateField.adjoin ℚ_[p] + ({((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n)} : + Set (padicCompletedLevelField p n)) := by + apply le_antisymm + · intro x hx + apply + padicCompletedChangedUniformizerFrobenius_fixed_mem_adjoin_theta + p u n x + change x ∈ IntermediateField.fixedField + (padicCompletedChangedUniformizerFrobeniusSubgroup p u n) at hx + exact + (IntermediateField.mem_fixedField_iff + (H := padicCompletedChangedUniformizerFrobeniusSubgroup + p u n) x).1 hx + (padicCompletedChangedUniformizerFrobeniusAlgEquiv p u n) + (Subgroup.mem_zpowers _) + · apply IntermediateField.adjoin_le_iff.mpr + intro x hx + rw [Set.mem_singleton_iff] at hx + subst x + exact + padicChangedUniformizerThetaValue_mem_completedFixedField p u n + +/-- The theta value is integral over `ℚ_[p]`. -/ +theorem padicChangedUniformizerThetaValue_isIntegral_padicBase + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + IsIntegral ℚ_[p] + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) := by + let πu := + standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u + refine + ⟨standardLubinTatePrimitivePolynomialOverField + (padicLocalField p) πu n, + standardLubinTatePrimitivePolynomialOverField_monic + (padicLocalField p) πu n, ?_⟩ + rw [← Polynomial.eval_map] + exact padicChangedUniformizerThetaValue_field_isRoot p u n + +/-- Over `ℚ_[p]`, the theta value has the actual changed Lubin--Tate +primitive polynomial as its minimal polynomial. -/ +theorem padicChangedUniformizerThetaValue_minpoly_padicBase + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + minpoly ℚ_[p] + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) = + standardLubinTatePrimitivePolynomialOverField + (padicLocalField p) + (standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u) n := by + let hπ := + standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u + let P := + standardLubinTatePrimitivePolynomialOverField + (padicLocalField p) + (standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u) n + have hroot : + Polynomial.aeval + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) P = + 0 := by + rw [Polynomial.aeval_def, ← Polynomial.eval_map] + exact padicChangedUniformizerThetaValue_field_isRoot p u n + have hmin := + minpoly.eq_of_irreducible + (standardLubinTatePrimitivePolynomialOverField_irreducible + hπ n) hroot + rw [(standardLubinTatePrimitivePolynomialOverField_monic + (padicLocalField p) + (standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u) n).leadingCoeff, + inv_one, Polynomial.C_1, mul_one] at hmin + exact hmin.symm + +/-- The completed changed-uniformizer fixed field inherits its `ℚ_[p]`-algebra from the ambient +field. -/ +noncomputable local instance + padicCompletedChangedUniformizerFixedFieldAlgebra + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + Algebra ℚ_[p] + (padicCompletedChangedUniformizerFixedField p u n) := + Subalgebra.algebra + (padicCompletedChangedUniformizerFixedField p u n).toSubalgebra + +/-- Scalar multiplication on the changed-uniformizer fixed field comes from its `ℚ_[p]`-algebra. -/ +noncomputable local instance + padicCompletedChangedUniformizerFixedFieldSMul + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + SMul ℚ_[p] + (padicCompletedChangedUniformizerFixedField p u n) := + @Algebra.toSMul _ _ _ _ + (padicCompletedChangedUniformizerFixedFieldAlgebra p u n) + +/-- The changed-uniformizer fixed field is a `ℚ_[p]`-module via its inherited algebra structure. -/ +noncomputable local instance + padicCompletedChangedUniformizerFixedFieldModule + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + Module ℚ_[p] + (padicCompletedChangedUniformizerFixedField p u n) := + @Algebra.toModule _ _ _ _ + (padicCompletedChangedUniformizerFixedFieldAlgebra p u n) + +/-- The completed changed-uniformizer fixed field has degree +`(p - 1) * p ^ n` over `ℚ_[p]`. -/ +theorem padicCompletedChangedUniformizerFixedField_finrank + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + Module.finrank ℚ_[p] + (padicCompletedChangedUniformizerFixedField p u n) = + (p - 1) * p ^ n := by + let y : padicCompletedLevelField p n := + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) + let S := IntermediateField.adjoin ℚ_[p] ({y} : + Set (padicCompletedLevelField p n)) + let SAlgebra : Algebra ℚ_[p] S := + Subalgebra.algebra S.toSubalgebra + let SSMul : SMul ℚ_[p] S := + @Algebra.toSMul _ _ _ _ SAlgebra + let SModule : Module ℚ_[p] S := + @Algebra.toModule _ _ _ _ SAlgebra + have hfield : + padicCompletedChangedUniformizerFixedField p u n = S := + padicCompletedChangedUniformizerFixedField_eq_adjoin_theta p u n + have hcard : + Nat.card (padicLocalField p).residueField = p := by + simpa [padicLocalField] using + padicCompleteDVF_residueField_card p + calc + Module.finrank ℚ_[p] + (padicCompletedChangedUniformizerFixedField p u n) = + Module.finrank ℚ_[p] S := + (IntermediateField.equivOfEq hfield).toLinearEquiv.finrank_eq + _ = (p - 1) * p ^ n := by + dsimp only [S, y] + rw [IntermediateField.adjoin.finrank + (padicChangedUniformizerThetaValue_isIntegral_padicBase + p u n), + padicChangedUniformizerThetaValue_minpoly_padicBase, + standardLubinTatePrimitivePolynomialOverField_natDegree, + hcard] + +/-- The actual finite changed Lubin--Tate level is algebraically equivalent +to the completed inverse-unit Frobenius fixed field. -/ +noncomputable def padicChangedUniformizerLevelEquivCompletedFixedField + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + standardLubinTateChangedLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) u n + ≃ₐ[ℚ_[p]] + padicCompletedChangedUniformizerFixedField p u n := by + let hπ := + standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u + let f := + padicChangedUniformizerLevelToCompletedFixedField p u n + letI : FiniteDimensional ℚ_[p] + (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_finiteDimensional hπ n + letI : FiniteDimensional ℚ_[p] + (padicCompletedChangedUniformizerFixedField p u n) := + FiniteDimensional.of_finrank_pos (by + rw [padicCompletedChangedUniformizerFixedField_finrank] + exact Nat.mul_pos + (Nat.sub_pos_of_lt (Fact.out : p.Prime).one_lt) + (Nat.pow_pos (Fact.out : p.Prime).pos)) + apply AlgEquiv.ofBijective f + refine ⟨f.injective, ?_⟩ + have hcard : + Nat.card (padicLocalField p).residueField = p := by + simpa [padicLocalField] using + padicCompleteDVF_residueField_card p + have hdim : + Module.finrank ℚ_[p] + (standardLubinTateLevelField hπ n) = + Module.finrank ℚ_[p] + (padicCompletedChangedUniformizerFixedField p u n) := by + rw [standardLubinTateLevelField_finrank, + padicCompletedChangedUniformizerFixedField_finrank, hcard] + exact + (LinearMap.injective_iff_surjective_of_finrank_eq_finrank + (f := f.toLinearMap) hdim).mp f.injective + +/-- The fixed-field equivalence sends the changed finite-level generator +to the genuine theta value. -/ +@[simp] +theorem + padicChangedUniformizerLevelEquivCompletedFixedField_apply_generator + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + padicChangedUniformizerLevelEquivCompletedFixedField p u n + (standardLubinTateChangedLevelGenerator + (padicMultiplicativeLubinTateSeries_isUniformizer p) u n) = + ⟨((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n), + padicChangedUniformizerThetaValue_mem_completedFixedField + p u n⟩ := by + simp only [padicChangedUniformizerLevelEquivCompletedFixedField] + exact + padicChangedUniformizerLevelToCompletedFixedField_apply_gen p u n + +/-- The theta value, regarded as an element of the completed Frobenius +fixed field. -/ +noncomputable def padicCompletedChangedUniformizerPrimeElement + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + padicCompletedChangedUniformizerFixedField p u n := + ⟨((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n), + padicChangedUniformizerThetaValue_mem_completedFixedField + p u n⟩ + +/-- The fixed-field prime element is the image of the changed finite-level +generator. -/ +theorem + padicCompletedChangedUniformizerPrimeElement_eq_equiv_generator + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + padicCompletedChangedUniformizerPrimeElement p u n = + padicChangedUniformizerLevelEquivCompletedFixedField p u n + (standardLubinTateChangedLevelGenerator + (padicMultiplicativeLubinTateSeries_isUniformizer p) u n) := by + rw [ + padicChangedUniformizerLevelEquivCompletedFixedField_apply_generator] + rfl + +/-- The completed changed-uniformizer norm formula: +`N(-theta) = u * p`. -/ +theorem padicCompletedChangedUniformizer_norm_neg_primeElement + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + Algebra.norm ℚ_[p] + (-padicCompletedChangedUniformizerPrimeElement p u n) = + (standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u : + ℚ_[p]) := by + rw [ + padicCompletedChangedUniformizerPrimeElement_eq_equiv_generator, + ← map_neg, Algebra.norm_eq_of_algEquiv] + exact + standardLubinTateChanged_norm_neg_levelGenerator + (padicMultiplicativeLubinTateSeries_isUniformizer p) u n + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerPrimitive.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerPrimitive.lean new file mode 100644 index 0000000000..1a2b80abd8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerPrimitive.lean @@ -0,0 +1,409 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RingTheory.Polynomial.Eisenstein.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveAction +/-! +# Primitive changed-uniformizer points in the completed p-adic level + +For a p-adic valuation-ring unit `u`, the primitive polynomial attached to +the changed uniformizer `u * p` remains Eisenstein after extension to the +completed-unramified Witt valuation ring. Consequently the genuine theta +value constructed in the standard completed level has the changed +primitive polynomial as its minimal polynomial and generates the whole +completed level over the completed-unramified coefficient field. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open ValuationTheory.DiscreteValuationField + +/-- The integral primitive polynomial for the changed uniformizer `u * p` +over the completed-unramified Witt valuation ring. -/ +noncomputable def padicChangedCompletedPrimitivePolynomialInteger + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + Polynomial + (padicCompletedUnramifiedCompleteDVF p).valuationSubring := + (standardLubinTatePrimitivePolynomial + (padicLocalField p) + (standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u) n).map + (padicCompletedUnramifiedIntegerMap p) + +/-- The field-valued changed primitive polynomial after extension from +`ℚ_[p]` to the completed-unramified fraction field. -/ +noncomputable def padicChangedCompletedPrimitivePolynomial + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + Polynomial (padicCompletedUnramifiedField p) := + (standardLubinTatePrimitivePolynomialOverField + (padicLocalField p) + (standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u) n).map + (algebraMap ℚ_[p] (padicCompletedUnramifiedField p)) + +/-- Passing the integral changed primitive polynomial to the fraction field +gives the field-valued changed primitive polynomial. -/ +theorem padicChangedCompletedPrimitivePolynomialInteger_map + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + (padicChangedCompletedPrimitivePolynomialInteger p u n).map + (algebraMap + (padicCompletedUnramifiedCompleteDVF p).valuationSubring + (padicCompletedUnramifiedField p)) = + padicChangedCompletedPrimitivePolynomial p u n := by + let O := (padicLocalField p).valuationSubring + let A := (padicCompletedUnramifiedCompleteDVF p).valuationSubring + let E := padicCompletedUnramifiedField p + let πu := + standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u + let Q := + standardLubinTatePrimitivePolynomial + (padicLocalField p) πu n + have hmaps : + (algebraMap A E).comp + (padicCompletedUnramifiedIntegerMap p) = + (algebraMap ℚ_[p] E).comp (algebraMap O ℚ_[p]) := by + ext z + exact padicCompletedUnramifiedIntegerMap_coe p z + change + (Q.map (padicCompletedUnramifiedIntegerMap p)).map + (algebraMap A E) = + (Q.map (algebraMap O ℚ_[p])).map + (algebraMap ℚ_[p] E) + rw [Polynomial.map_map, Polynomial.map_map, hmaps] + +/-- The integral changed primitive polynomial is monic. -/ +theorem padicChangedCompletedPrimitivePolynomialInteger_monic + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + (padicChangedCompletedPrimitivePolynomialInteger p u n).Monic := + (standardLubinTatePrimitivePolynomial_monic + (padicLocalField p) + (standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u) n).map _ + +/-- The field-valued changed primitive polynomial is monic. -/ +theorem padicChangedCompletedPrimitivePolynomial_monic + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + (padicChangedCompletedPrimitivePolynomial p u n).Monic := + (standardLubinTatePrimitivePolynomialOverField_monic + (padicLocalField p) + (standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u) n).map _ + +/-- The integral changed primitive polynomial has degree +`(p - 1) * p ^ n`. -/ +theorem padicChangedCompletedPrimitivePolynomialInteger_natDegree + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + (padicChangedCompletedPrimitivePolynomialInteger p u n).natDegree = + (p - 1) * p ^ n := by + have hcard : + Nat.card (padicLocalField p).residueField = p := by + simpa [padicLocalField] using + padicCompleteDVF_residueField_card p + rw [padicChangedCompletedPrimitivePolynomialInteger, + (standardLubinTatePrimitivePolynomial_monic + (padicLocalField p) + (standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u) n).natDegree_map, + standardLubinTatePrimitivePolynomial_natDegree, hcard] + +/-- The changed primitive polynomial has degree `(p - 1) * p ^ n`. -/ +theorem padicChangedCompletedPrimitivePolynomial_natDegree + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + (padicChangedCompletedPrimitivePolynomial p u n).natDegree = + (p - 1) * p ^ n := by + have hcard : + Nat.card (padicLocalField p).residueField = p := by + simpa [padicLocalField] using + padicCompleteDVF_residueField_card p + rw [padicChangedCompletedPrimitivePolynomial, + (standardLubinTatePrimitivePolynomialOverField_monic + (padicLocalField p) + (standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u) n).natDegree_map, + standardLubinTatePrimitivePolynomialOverField_natDegree, hcard] + +/-- The image of the changed uniformizer `u * p` is a uniformizer of the +completed-unramified coefficient field. -/ +theorem padicChangedCompletedUniformizer_isUniformizer + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + let π := + padicIntEquivValuationSubring p (p : ℤ_[p]) + let πu := + standardLubinTateChangedUniformizer + (padicLocalField p) π u + (padicCompletedUnramifiedCompleteDVF p).valuation.IsUniformizer + ((padicCompletedUnramifiedIntegerMap p πu : + (padicCompletedUnramifiedCompleteDVF p).valuationSubring) : + padicCompletedUnramifiedField p) := by + let target := padicCompletedUnramifiedCompleteDVF p + let π := padicIntEquivValuationSubring p (p : ℤ_[p]) + let πu := + standardLubinTateChangedUniformizer + (padicLocalField p) π u + let πE : target.valuationSubring := + padicCompletedUnramifiedIntegerMap p π + let uE : target.valuationSubring := + padicCompletedUnramifiedIntegerMap p + (u : (padicLocalField p).valuationSubring) + have hπ : + target.valuation.IsUniformizer + (πE : padicCompletedUnramifiedField p) := by + simpa only [target, π, πE] using + padicCompletedUnramifiedIntegerMap_isUniformizer p + have huE : IsUnit uE := + u.isUnit.map (padicCompletedUnramifiedIntegerMap p) + apply hπ.of_associated + have hmul : padicCompletedUnramifiedIntegerMap p πu = uE * πE := + map_mul (padicCompletedUnramifiedIntegerMap p) + (u : (padicLocalField p).valuationSubring) π + exact hmul.symm ▸ (associated_unit_mul_right πE uE huE) + +/-- The integral changed primitive polynomial is weakly Eisenstein after +base change to the completed-unramified valuation ring. -/ +theorem + padicChangedCompletedPrimitivePolynomialInteger_isWeaklyEisensteinAt + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + (padicChangedCompletedPrimitivePolynomialInteger p u n).IsWeaklyEisensteinAt + (padicCompletedUnramifiedCompleteDVF p).maximalIdeal := by + rw [← padicCompletedUnramifiedIntegerMap_map_maximalIdeal p] + exact + (standardLubinTatePrimitivePolynomial_isEisensteinAt + (standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u) + n).isWeaklyEisensteinAt.map + (padicCompletedUnramifiedIntegerMap p) + +/-- The integral changed primitive polynomial is genuinely Eisenstein over +the completed-unramified valuation ring. -/ +theorem padicChangedCompletedPrimitivePolynomialInteger_isEisensteinAt + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + (padicChangedCompletedPrimitivePolynomialInteger p u n).IsEisensteinAt + (padicCompletedUnramifiedCompleteDVF p).maximalIdeal := by + let target := padicCompletedUnramifiedCompleteDVF p + let π := padicIntEquivValuationSubring p (p : ℤ_[p]) + let πu := + standardLubinTateChangedUniformizer + (padicLocalField p) π u + let πuE : target.valuationSubring := + padicCompletedUnramifiedIntegerMap p πu + have hmonic : + (padicChangedCompletedPrimitivePolynomialInteger p u n).Monic := + padicChangedCompletedPrimitivePolynomialInteger_monic p u n + refine hmonic.isEisensteinAt_of_mem_of_notMem + (IsLocalRing.maximalIdeal.isMaximal target.valuationSubring).ne_top + ?_ ?_ + · intro i hi + exact + (padicChangedCompletedPrimitivePolynomialInteger_isWeaklyEisensteinAt + p u n).mem hi + · have hπu : + target.valuation.IsUniformizer + (πuE : padicCompletedUnramifiedField p) := by + simpa only [target, π, πu, πuE] using + padicChangedCompletedUniformizer_isUniformizer p u + have hnotMem : + πuE ∉ target.maximalIdeal ^ 2 := + target.uniformizer_not_mem_maximalIdeal_sq hπu + simpa only [padicChangedCompletedPrimitivePolynomialInteger, + Polynomial.coeff_map, + standardLubinTatePrimitivePolynomial_coeff_zero, + π, πu, πuE] using hnotMem + +/-- The integral changed primitive polynomial is irreducible. -/ +theorem padicChangedCompletedPrimitivePolynomialInteger_irreducible + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + Irreducible + (padicChangedCompletedPrimitivePolynomialInteger p u n) := by + apply + (padicChangedCompletedPrimitivePolynomialInteger_isEisensteinAt + p u n).irreducible + (IsLocalRing.maximalIdeal.isMaximal + (padicCompletedUnramifiedCompleteDVF p).valuationSubring).isPrime + (padicChangedCompletedPrimitivePolynomialInteger_monic + p u n).isPrimitive + rw [padicChangedCompletedPrimitivePolynomialInteger_natDegree] + exact Nat.mul_pos + (Nat.sub_pos_of_lt (Fact.out : p.Prime).one_lt) + (Nat.pow_pos (Fact.out : p.Prime).pos) + +/-- The changed primitive polynomial remains irreducible over the completed +maximal-unramified fraction field. -/ +theorem padicChangedCompletedPrimitivePolynomial_irreducible + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + Irreducible (padicChangedCompletedPrimitivePolynomial p u n) := by + have hmap : + Irreducible + ((padicChangedCompletedPrimitivePolynomialInteger p u n).map + (algebraMap + (padicCompletedUnramifiedCompleteDVF p).valuationSubring + (padicCompletedUnramifiedField p))) := by + have hmonic := + padicChangedCompletedPrimitivePolynomialInteger_monic p u n + exact hmonic.irreducible_iff_irreducible_map_fraction_map.mp + (padicChangedCompletedPrimitivePolynomialInteger_irreducible + p u n) + rwa [padicChangedCompletedPrimitivePolynomialInteger_map] at hmap + +/-- The theta value is a root of the named changed primitive polynomial +over the completed-unramified field. -/ +theorem padicChangedUniformizerThetaValue_isRoot_completedPrimitivePolynomial + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + ((padicChangedCompletedPrimitivePolynomial p u n).map + (algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n))).IsRoot + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) := by + simpa only [padicChangedCompletedPrimitivePolynomial, + Polynomial.map_map, + IsScalarTower.algebraMap_eq ℚ_[p] + (padicCompletedUnramifiedField p) (padicCompletedLevelField p n)] + using + padicChangedUniformizerThetaValue_field_isRoot p u n + +/-- The theta value is integral over the completed-unramified field. -/ +theorem padicChangedUniformizerThetaValue_isIntegral_completedBase + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + IsIntegral (padicCompletedUnramifiedField p) + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) := by + refine + ⟨padicChangedCompletedPrimitivePolynomial p u n, + padicChangedCompletedPrimitivePolynomial_monic p u n, ?_⟩ + rw [← Polynomial.eval_map] + exact + padicChangedUniformizerThetaValue_isRoot_completedPrimitivePolynomial + p u n + +/-- The minimal polynomial of the theta value over the completed-unramified +field is the genuine changed primitive polynomial. -/ +theorem padicChangedUniformizerThetaValue_minpoly_completedBase + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + minpoly (padicCompletedUnramifiedField p) + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) = + padicChangedCompletedPrimitivePolynomial p u n := by + have hroot : + Polynomial.aeval + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) + (padicChangedCompletedPrimitivePolynomial p u n) = + 0 := by + rw [Polynomial.aeval_def, ← Polynomial.eval_map] + exact + padicChangedUniformizerThetaValue_isRoot_completedPrimitivePolynomial + p u n + have hmin := + minpoly.eq_of_irreducible + (padicChangedCompletedPrimitivePolynomial_irreducible p u n) + hroot + rw [(padicChangedCompletedPrimitivePolynomial_monic + p u n).leadingCoeff, inv_one, Polynomial.C_1, mul_one] at hmin + exact hmin.symm + +/-- The fixed theta point generates the entire standard completed level +over the completed-unramified coefficient field. -/ +theorem padicChangedUniformizerThetaValue_adjoin_completedBase_eq_top + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + IntermediateField.adjoin + (padicCompletedUnramifiedField p) + ({((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n)} : + Set (padicCompletedLevelField p n)) = + ⊤ := by + apply + (Field.primitive_element_iff_minpoly_natDegree_eq + (padicCompletedUnramifiedField p) + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n)).2 + rw [padicChangedUniformizerThetaValue_minpoly_completedBase, + padicChangedCompletedPrimitivePolynomial_natDegree] + let pb := padicCompletedPrimitivePowerBasis p n + calc + (p - 1) * p ^ n = + (padicCompletedPrimitivePolynomial p n).natDegree := + (padicCompletedPrimitivePolynomial_natDegree p n).symm + _ = + (minpoly (padicCompletedUnramifiedField p) pb.gen).natDegree := by + rw [show pb.gen = padicCompletedPrimitiveRoot p n by + exact padicCompletedPrimitivePowerBasis_gen p n] + rw [padicCompletedPrimitiveRoot_minpoly] + _ = pb.dim := pb.natDegree_minpoly + _ = + Module.finrank (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) := + pb.finrank.symm + +/-- The theta value supplies a power basis of the completed standard level +over the completed-unramified field. -/ +noncomputable def padicChangedUniformizerThetaPowerBasis + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + PowerBasis (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) := by + apply PowerBasis.ofAdjoinEqTop + (padicChangedUniformizerThetaValue_isIntegral_completedBase p u n) + rw [← IntermediateField.adjoin_simple_toSubalgebra_of_isAlgebraic + (padicChangedUniformizerThetaValue_isIntegral_completedBase + p u n).isAlgebraic, + padicChangedUniformizerThetaValue_adjoin_completedBase_eq_top, + IntermediateField.top_toSubalgebra] + +/-- The generator of the theta power basis is the genuine evaluated theta +value. -/ +@[simp] +theorem padicChangedUniformizerThetaPowerBasis_gen + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + (padicChangedUniformizerThetaPowerBasis p u n).gen = + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) := + PowerBasis.ofAdjoinEqTop_gen _ _ + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerThetaFixed.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerThetaFixed.lean new file mode 100644 index 0000000000..dab9a432fc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerThetaFixed.lean @@ -0,0 +1,211 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusEvaluation +/-! +# Fixedness of completed p-adic changed-uniformizer theta values + +The Frobenius lift whose primitive-point action is indexed by the inverse +unit is the genuine diagonal action relevant to change of uniformizer. +Semilinear evaluation changes theta coefficients by Witt Frobenius, while +the first changed-uniformizer identity changes the evaluation point by the +unit itself. The unit and inverse-unit actions cancel, so the actual +convergent theta value is fixed. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp + +private noncomputable local instance (priority := 50) + padicCompletedThetaFixedWittUniformSpace + (p : ℕ) [Fact p.Prime] : + UniformSpace (padicCompletedUnramifiedWittRing p) := + ⊥ + +private noncomputable local instance + padicCompletedThetaFixedTargetWithIdeal + (p : ℕ) [Fact p.Prime] (n : ℕ) : + WithIdeal + (padicCompletedLevelCompleteDVF p n).valuationSubring where + i := (padicCompletedLevelCompleteDVF p n).maximalIdeal + +private noncomputable local instance + padicCompletedThetaFixedTargetCompleteSpace + (p : ℕ) [Fact p.Prime] (n : ℕ) : + CompleteSpace + (padicCompletedLevelCompleteDVF p n).valuationSubring := by + let target := padicCompletedLevelCompleteDVF p n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).1 + +private noncomputable local instance + padicCompletedThetaFixedTargetT2Space + (p : ℕ) [Fact p.Prime] (n : ℕ) : + T2Space + (padicCompletedLevelCompleteDVF p n).valuationSubring := by + let target := padicCompletedLevelCompleteDVF p n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).2 + +private theorem padicCompletedThetaFixedEvaluation_eq_of_point_eq + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x y : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) (hy : PowerSeries.HasEval y) + (hxy : x = y) : + padicCompletedLevelPowerSeriesEval p n x hx = + padicCompletedLevelPowerSeriesEval p n y hy := by + subst y + rfl + +/-- On the genuine multiplicative primitive point, the multiplicative +unit action cancels the inverse-unit action prescribed by the diagonal +completed Frobenius lift. -/ +theorem padicCompletedDiagonalFrobenius_multiplicativeUnitAction + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + let r := + padicCompletedUnitFrobeniusIntegerEquiv p n u⁻¹ + let x := padicCompletedMultiplicativePrimitivePoint p n + let hx := padicCompletedMultiplicativePrimitivePoint_hasEval p n + padicCompletedMultiplicativeScalarEndomorphismValue p n + (r x) + (padicCompletedUnitFrobeniusIntegerEquiv_hasEval + p n u⁻¹ x hx) + (u : (padicLocalField p).valuationSubring) = + x := by + let r := + padicCompletedUnitFrobeniusIntegerEquiv p n u⁻¹ + let x := padicCompletedMultiplicativePrimitivePoint p n + let hx := padicCompletedMultiplicativePrimitivePoint_hasEval p n + have hpoint : + r x = + padicCompletedMultiplicativePrimitivePointUnitAction p u⁻¹ n := by + simpa only [r, x] using + padicCompletedUnitFrobeniusIntegerEquiv_multiplicativePrimitivePoint + p n u⁻¹ + have htransport := + DFunLike.congr_fun + (padicCompletedThetaFixedEvaluation_eq_of_point_eq p n + (r x) + (padicCompletedMultiplicativePrimitivePointUnitAction p u⁻¹ n) + (padicCompletedUnitFrobeniusIntegerEquiv_hasEval + p n u⁻¹ x hx) + (padicCompletedMultiplicativePrimitivePointUnitAction_hasEval + p u⁻¹ n) + hpoint) + (padicCompletedMultiplicativeUnitEndomorphism p u) + calc + padicCompletedMultiplicativeScalarEndomorphismValue p n + (r x) + (padicCompletedUnitFrobeniusIntegerEquiv_hasEval + p n u⁻¹ x hx) + (u : (padicLocalField p).valuationSubring) = + padicCompletedMultiplicativeScalarEndomorphismValue p n + (padicCompletedMultiplicativePrimitivePointUnitAction p u⁻¹ n) + (padicCompletedMultiplicativePrimitivePointUnitAction_hasEval + p u⁻¹ n) + (u : (padicLocalField p).valuationSubring) := by + simpa only [padicCompletedMultiplicativeUnitEndomorphism, + padicCompletedMultiplicativeScalarEndomorphismValue] using + htransport + _ = x := by + simpa only [x, hx, + padicCompletedMultiplicativePrimitivePointUnitAction, + padicCompletedMultiplicativeUnitEndomorphism, + padicCompletedMultiplicativeScalarEndomorphismValue] using + (padicCompletedMultiplicativeScalarEndomorphismValue_unit_after_inverse + p n + (padicCompletedMultiplicativePrimitivePoint p n) + (padicCompletedMultiplicativePrimitivePoint_hasEval p n) u) + +/-- The inverse-unit diagonal completed Frobenius fixes the genuine +changed-uniformizer theta value in the completed-level valuation ring. -/ +theorem + padicCompletedChangedUniformizerThetaValue_fixed_by_diagonalFrobeniusInteger + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + padicCompletedUnitFrobeniusIntegerEquiv p n u⁻¹ + (padicChangedUniformizerThetaValue p u n) = + padicChangedUniformizerThetaValue p u n := by + let r := + padicCompletedUnitFrobeniusIntegerEquiv p n u⁻¹ + let x := padicCompletedMultiplicativePrimitivePoint p n + let hx := padicCompletedMultiplicativePrimitivePoint_hasEval p n + let rx := r x + let hrx := + padicCompletedUnitFrobeniusIntegerEquiv_hasEval + p n u⁻¹ x hx + let U := padicCompletedMultiplicativeUnitEndomorphism p u + let xBack := + padicCompletedLevelPowerSeriesEval p n rx hrx U + let hxBack := + padicCompletedLevelPowerSeriesEval_hasEval p n rx hrx U + (padicCompletedMultiplicativeUnitEndomorphism_hasSubst p u) + let Θ := padicChangedUniformizerIntertwiner p u + have hsemi := + padicCompletedUnitFrobeniusIntegerEquiv_evaluation + p n u⁻¹ x hx Θ + have hfrobenius := + padicChangedUniformizerIntertwiner_frobenius_evaluation + p u n rx hrx + have hpoint : xBack = x := by + change + padicCompletedMultiplicativeScalarEndomorphismValue p n rx hrx + (u : (padicLocalField p).valuationSubring) = + x + simpa only [r, x, hx, rx, hrx] using + (padicCompletedDiagonalFrobenius_multiplicativeUnitAction p u n) + have hevaluation : + padicCompletedLevelPowerSeriesEval p n xBack hxBack Θ = + padicCompletedLevelPowerSeriesEval p n x hx Θ := + DFunLike.congr_fun + (padicCompletedThetaFixedEvaluation_eq_of_point_eq + p n xBack x hxBack hx hpoint) Θ + change + r (padicCompletedLevelPowerSeriesEval p n x hx Θ) = + padicCompletedLevelPowerSeriesEval p n x hx Θ + calc + _ = + padicCompletedLevelPowerSeriesEval p n rx hrx + (PowerSeries.map WittVector.frobenius Θ) := by + simpa only [r, x, hx, rx, hrx, Θ] using hsemi + _ = padicCompletedLevelPowerSeriesEval p n xBack hxBack Θ := by + simpa only [xBack, hxBack, U, Θ] using hfrobenius + _ = padicCompletedLevelPowerSeriesEval p n x hx Θ := + hevaluation + +/-- The inverse-unit diagonal completed Frobenius field automorphism fixes +the genuine changed-uniformizer theta value. -/ +theorem + padicCompletedChangedUniformizerThetaValue_fixed_by_diagonalFrobenius + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + padicCompletedUnitFrobeniusLiftEquiv p n u⁻¹ + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) = + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) := by + simpa only [padicCompletedUnitFrobeniusIntegerEquiv_coe] using + congrArg + (fun z : (padicCompletedLevelCompleteDVF p n).valuationSubring => + (z : padicCompletedLevelField p n)) + (padicCompletedChangedUniformizerThetaValue_fixed_by_diagonalFrobeniusInteger + p u n) + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusEvaluation.lean new file mode 100644 index 0000000000..3cd08da19d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusEvaluation.lean @@ -0,0 +1,526 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusLift +public import Mathlib.Topology.Algebra.Nonarchimedean.AdicTopology +/-! +# Semilinear evaluation for completed p-adic Frobenius lifts + +The completed unit-indexed Frobenius lift preserves the actual integral +closure valuation ring. Its restriction is continuous for the maximal- +ideal adic topology and transports convergent Witt-coefficient power-series +evaluation by Witt Frobenius on coefficients. + +Applying this to the standard-to-multiplicative comparison identifies the +image of the genuine completed multiplicative primitive point with its +actual multiplicative unit translate. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open ValuationTheory.DiscreteValuationField + +private noncomputable local instance (priority := 50) + padicCompletedFrobeniusEvaluationWittUniformSpace + (p : ℕ) [Fact p.Prime] : + UniformSpace (padicCompletedUnramifiedWittRing p) := + ⊥ + +/-- The maximal ideal defining the adic topology on the completed level valuation ring. -/ +noncomputable local instance + padicCompletedFrobeniusEvaluationTargetWithIdeal + (p : ℕ) [Fact p.Prime] (n : ℕ) : + WithIdeal + (padicCompletedLevelCompleteDVF p n).valuationSubring where + i := (padicCompletedLevelCompleteDVF p n).maximalIdeal + +private noncomputable local instance + padicCompletedFrobeniusEvaluationTargetCompleteSpace + (p : ℕ) [Fact p.Prime] (n : ℕ) : + CompleteSpace + (padicCompletedLevelCompleteDVF p n).valuationSubring := by + let target := padicCompletedLevelCompleteDVF p n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).1 + +private noncomputable local instance + padicCompletedFrobeniusEvaluationTargetT2Space + (p : ℕ) [Fact p.Prime] (n : ℕ) : + T2Space + (padicCompletedLevelCompleteDVF p n).valuationSubring := by + let target := padicCompletedLevelCompleteDVF p n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).2 + +/-- Arithmetic Frobenius restricted to the valuation ring of the completed +maximal-unramified p-adic field. -/ +noncomputable def padicCompletedUnramifiedFrobeniusIntegerEquiv + (p : ℕ) [Fact p.Prime] : + (padicCompletedUnramifiedCompleteDVF p).valuationSubring ≃+* + (padicCompletedUnramifiedCompleteDVF p).valuationSubring where + toFun x := + ⟨padicCompletedUnramifiedFrobenius p + (x : padicCompletedUnramifiedField p), by + change + padicCompletedUnramifiedValuation p + (padicCompletedUnramifiedFrobenius p + (x : padicCompletedUnramifiedField p)) ≤ 1 + rw [padicCompletedUnramifiedFrobenius_valuation] + exact x.property⟩ + invFun x := + ⟨(padicCompletedUnramifiedFrobenius p).symm + (x : padicCompletedUnramifiedField p), by + change + padicCompletedUnramifiedValuation p + ((padicCompletedUnramifiedFrobenius p).symm + (x : padicCompletedUnramifiedField p)) ≤ 1 + rw [← padicCompletedUnramifiedFrobenius_valuation p + ((padicCompletedUnramifiedFrobenius p).symm + (x : padicCompletedUnramifiedField p)), + (padicCompletedUnramifiedFrobenius p).apply_symm_apply] + exact x.property⟩ + left_inv x := by + apply Subtype.ext + exact (padicCompletedUnramifiedFrobenius p).symm_apply_apply x + right_inv x := by + apply Subtype.ext + exact (padicCompletedUnramifiedFrobenius p).apply_symm_apply x + map_mul' x y := by + apply Subtype.ext + exact map_mul (padicCompletedUnramifiedFrobenius p) + (x : padicCompletedUnramifiedField p) + (y : padicCompletedUnramifiedField p) + map_add' x y := by + apply Subtype.ext + exact map_add (padicCompletedUnramifiedFrobenius p) + (x : padicCompletedUnramifiedField p) + (y : padicCompletedUnramifiedField p) + +/-- Coercion of the integral Frobenius restriction agrees with arithmetic +Frobenius on the completed-unramified fraction field. -/ +@[simp] +theorem padicCompletedUnramifiedFrobeniusIntegerEquiv_coe + (p : ℕ) [Fact p.Prime] + (x : (padicCompletedUnramifiedCompleteDVF p).valuationSubring) : + ((padicCompletedUnramifiedFrobeniusIntegerEquiv p x : + (padicCompletedUnramifiedCompleteDVF p).valuationSubring) : + padicCompletedUnramifiedField p) = + padicCompletedUnramifiedFrobenius p + (x : padicCompletedUnramifiedField p) := + rfl + +/-- Coercion of the inverse integral Frobenius restriction agrees with +inverse arithmetic Frobenius on the fraction field. -/ +@[simp] +theorem padicCompletedUnramifiedFrobeniusIntegerEquiv_symm_coe + (p : ℕ) [Fact p.Prime] + (x : (padicCompletedUnramifiedCompleteDVF p).valuationSubring) : + (((padicCompletedUnramifiedFrobeniusIntegerEquiv p).symm x : + (padicCompletedUnramifiedCompleteDVF p).valuationSubring) : + padicCompletedUnramifiedField p) = + (padicCompletedUnramifiedFrobenius p).symm + (x : padicCompletedUnramifiedField p) := + rfl + +/-- The inverse of a unit-indexed completed Frobenius lift acts on base +scalars through inverse arithmetic Frobenius. -/ +@[simp] +theorem padicCompletedUnitFrobeniusLiftEquiv_symm_algebraMap + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) + (b : padicCompletedUnramifiedField p) : + (padicCompletedUnitFrobeniusLiftEquiv p n u).symm + (algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) b) = + algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + ((padicCompletedUnramifiedFrobenius p).symm b) := by + apply (padicCompletedUnitFrobeniusLiftEquiv p n u).injective + rw [(padicCompletedUnitFrobeniusLiftEquiv p n u).apply_symm_apply, + padicCompletedUnitFrobeniusLiftEquiv_algebraMap, + (padicCompletedUnramifiedFrobenius p).apply_symm_apply] + +/-- A unit-indexed completed Frobenius lift carries every element of the +selected completed-level valuation ring back into that valuation ring. -/ +theorem padicCompletedUnitFrobeniusLiftEquiv_mem_valuationSubring + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) + (x : padicCompletedLevelField p n) + (hx : + x ∈ (padicCompletedLevelCompleteDVF p n).valuation.valuationSubring) : + padicCompletedUnitFrobeniusLiftEquiv p n u x ∈ + (padicCompletedLevelCompleteDVF p n).valuation.valuationSubring := by + let base := padicCompletedUnramifiedCompleteDVF p + let target := padicCompletedLevelCompleteDVF p n + let E := padicCompletedUnramifiedField p + let L := padicCompletedLevelField p n + let φ : + base.valuationSubring ≃+* base.valuationSubring := + padicCompletedUnramifiedFrobeniusIntegerEquiv p + let σ : L ≃+* L := + padicCompletedUnitFrobeniusLiftEquiv p n u + let : IsIntegralClosure target.valuationSubring + base.valuationSubring L := + padicCompletedLevelCompleteDVF_isIntegralClosure p n + have hxIntegral : IsIntegral base.valuationSubring x := + (IsIntegralClosure.isIntegral_iff + (A := target.valuationSubring) + (R := base.valuationSubring) + (B := L)).2 ⟨⟨x, hx⟩, rfl⟩ + have hcomp : + (algebraMap base.valuationSubring L).comp φ.toRingHom = + σ.toRingHom.comp (algebraMap base.valuationSubring L) := by + apply RingHom.ext + intro b + change + algebraMap E L ((φ b : base.valuationSubring) : E) = + σ (algebraMap E L (b : E)) + rw [show φ = padicCompletedUnramifiedFrobeniusIntegerEquiv p by rfl, + padicCompletedUnramifiedFrobeniusIntegerEquiv_coe, + show σ = padicCompletedUnitFrobeniusLiftEquiv p n u by rfl, + padicCompletedUnitFrobeniusLiftEquiv_algebraMap] + have hσIntegral : IsIntegral base.valuationSubring (σ x) := + IsIntegral.map_of_comp_eq φ.toRingHom σ.toRingHom hcomp hxIntegral + rcases + (IsIntegralClosure.isIntegral_iff + (A := target.valuationSubring) + (R := base.valuationSubring) + (B := L)).1 hσIntegral with + ⟨z, hz⟩ + change target.valuation (σ x) ≤ 1 + rw [← hz] + exact z.property + +/-- The inverse of a unit-indexed completed Frobenius lift also preserves +the selected completed-level valuation ring. -/ +theorem padicCompletedUnitFrobeniusLiftEquiv_symm_mem_valuationSubring + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) + (x : padicCompletedLevelField p n) + (hx : + x ∈ (padicCompletedLevelCompleteDVF p n).valuation.valuationSubring) : + (padicCompletedUnitFrobeniusLiftEquiv p n u).symm x ∈ + (padicCompletedLevelCompleteDVF p n).valuation.valuationSubring := by + let base := padicCompletedUnramifiedCompleteDVF p + let target := padicCompletedLevelCompleteDVF p n + let E := padicCompletedUnramifiedField p + let L := padicCompletedLevelField p n + let φ : + base.valuationSubring ≃+* base.valuationSubring := + (padicCompletedUnramifiedFrobeniusIntegerEquiv p).symm + let σ : L ≃+* L := + (padicCompletedUnitFrobeniusLiftEquiv p n u).symm + let : IsIntegralClosure target.valuationSubring + base.valuationSubring L := + padicCompletedLevelCompleteDVF_isIntegralClosure p n + have hxIntegral : IsIntegral base.valuationSubring x := + (IsIntegralClosure.isIntegral_iff + (A := target.valuationSubring) + (R := base.valuationSubring) + (B := L)).2 ⟨⟨x, hx⟩, rfl⟩ + have hcomp : + (algebraMap base.valuationSubring L).comp φ.toRingHom = + σ.toRingHom.comp (algebraMap base.valuationSubring L) := by + apply RingHom.ext + intro b + change + algebraMap E L ((φ b : base.valuationSubring) : E) = + σ (algebraMap E L (b : E)) + rw [show φ = + (padicCompletedUnramifiedFrobeniusIntegerEquiv p).symm by rfl, + padicCompletedUnramifiedFrobeniusIntegerEquiv_symm_coe, + show σ = + (padicCompletedUnitFrobeniusLiftEquiv p n u).symm by rfl, + padicCompletedUnitFrobeniusLiftEquiv_symm_algebraMap] + have hσIntegral : IsIntegral base.valuationSubring (σ x) := + IsIntegral.map_of_comp_eq φ.toRingHom σ.toRingHom hcomp hxIntegral + rcases + (IsIntegralClosure.isIntegral_iff + (A := target.valuationSubring) + (R := base.valuationSubring) + (B := L)).1 hσIntegral with + ⟨z, hz⟩ + change target.valuation (σ x) ≤ 1 + rw [← hz] + exact z.property + +/-- Membership in the selected completed-level valuation ring is invariant +under every unit-indexed completed Frobenius lift. -/ +theorem padicCompletedUnitFrobeniusLiftEquiv_mem_valuationSubring_iff + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) + (x : padicCompletedLevelField p n) : + x ∈ (padicCompletedLevelCompleteDVF p n).valuation.valuationSubring ↔ + padicCompletedUnitFrobeniusLiftEquiv p n u x ∈ + (padicCompletedLevelCompleteDVF p n).valuation.valuationSubring := by + constructor + · exact padicCompletedUnitFrobeniusLiftEquiv_mem_valuationSubring p n u x + · intro hx + have hback := + padicCompletedUnitFrobeniusLiftEquiv_symm_mem_valuationSubring + p n u + (padicCompletedUnitFrobeniusLiftEquiv p n u x) hx + simpa using hback + +/-- The actual valuation-ring automorphism induced by a unit-indexed +completed Frobenius lift. -/ +noncomputable def padicCompletedUnitFrobeniusIntegerEquiv + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + (padicCompletedLevelCompleteDVF p n).valuationSubring ≃+* + (padicCompletedLevelCompleteDVF p n).valuationSubring := + higherPrincipalUnitGroup.valuationSubringRingEquivOfPreserves + (padicCompletedLevelCompleteDVF p n) + (padicCompletedUnitFrobeniusLiftEquiv p n u) + (padicCompletedUnitFrobeniusLiftEquiv_mem_valuationSubring_iff + p n u) + +/-- Coercion of the integral completed Frobenius restriction agrees with +the ambient field automorphism. -/ +@[simp] +theorem padicCompletedUnitFrobeniusIntegerEquiv_coe + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) : + ((padicCompletedUnitFrobeniusIntegerEquiv p n u x : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) = + padicCompletedUnitFrobeniusLiftEquiv p n u + (x : padicCompletedLevelField p n) := + rfl + +/-- Coercion of the inverse integral completed Frobenius restriction agrees +with the inverse ambient field automorphism. -/ +@[simp] +theorem padicCompletedUnitFrobeniusIntegerEquiv_symm_coe + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) : + (((padicCompletedUnitFrobeniusIntegerEquiv p n u).symm x : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) = + (padicCompletedUnitFrobeniusLiftEquiv p n u).symm + (x : padicCompletedLevelField p n) := by + apply (padicCompletedUnitFrobeniusLiftEquiv p n u).injective + rw [(padicCompletedUnitFrobeniusLiftEquiv p n u).apply_symm_apply] + simpa using + (padicCompletedUnitFrobeniusIntegerEquiv_coe + p n u + ((padicCompletedUnitFrobeniusIntegerEquiv p n u).symm x)).symm + +/-- The integral completed Frobenius restriction is continuous for the +maximal-ideal adic topology. -/ +theorem padicCompletedUnitFrobeniusIntegerEquiv_continuous + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + Continuous (padicCompletedUnitFrobeniusIntegerEquiv p n u) := by + let target := padicCompletedLevelCompleteDVF p n + let σ : padicCompletedLevelField p n ≃+* + padicCompletedLevelField p n := + padicCompletedUnitFrobeniusLiftEquiv p n u + let hpreserve : + ∀ x : padicCompletedLevelField p n, + x ∈ target.valuation.valuationSubring ↔ + σ x ∈ target.valuation.valuationSubring := + padicCompletedUnitFrobeniusLiftEquiv_mem_valuationSubring_iff p n u + let r : target.valuationSubring ≃+* target.valuationSubring := + padicCompletedUnitFrobeniusIntegerEquiv p n u + apply continuous_of_continuousAt_zero r + rw [ContinuousAt, map_zero] + have hadic : IsAdic target.maximalIdeal := rfl + apply (hadic.hasBasis_nhds_zero.tendsto_right_iff).2 + intro m _ + apply (hadic.hasBasis_nhds_zero.mem_iff).2 + refine ⟨m, trivial, ?_⟩ + intro x hx + exact + (higherPrincipalUnitGroup.valuationSubringRingEquivOfPreserves_mem_maximalIdeal_pow_iff + target σ hpreserve m x).2 hx + +/-- The integral completed Frobenius restriction transports the canonical +Witt coefficient map by Witt-vector Frobenius. -/ +theorem padicCompletedUnitFrobeniusIntegerEquiv_wittCoefficientHom + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) + (a : padicCompletedUnramifiedWittRing p) : + padicCompletedUnitFrobeniusIntegerEquiv p n u + (padicCompletedLevelWittCoefficientHom p n a) = + padicCompletedLevelWittCoefficientHom p n + (WittVector.frobenius a) := by + apply Subtype.ext + change + padicCompletedUnitFrobeniusLiftEquiv p n u + (((padicCompletedLevelWittCoefficientHom p n a : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n)) = + (((padicCompletedLevelWittCoefficientHom p n + (WittVector.frobenius a) : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n)) + rw [padicCompletedLevelWittCoefficientHom_apply, + padicCompletedUnitFrobeniusLiftEquiv_algebraMap, + padicCompletedUnramifiedFrobenius_algebraMap_witt, + padicCompletedLevelWittCoefficientHom_apply] + +private theorem padicCompletedHasEval_map_continuous + (p : ℕ) [Fact p.Prime] (n : ℕ) + (r : + (padicCompletedLevelCompleteDVF p n).valuationSubring →+* + (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hr : Continuous r) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) : + PowerSeries.HasEval (r x) := + hx.map hr + +/-- A convergent completed-level evaluation point remains convergent after +applying the integral completed Frobenius restriction. -/ +theorem padicCompletedUnitFrobeniusIntegerEquiv_hasEval + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) : + PowerSeries.HasEval + (padicCompletedUnitFrobeniusIntegerEquiv p n u x) := by + exact + padicCompletedHasEval_map_continuous p n + (padicCompletedUnitFrobeniusIntegerEquiv p n u).toRingHom + (padicCompletedUnitFrobeniusIntegerEquiv_continuous p n u) x hx + +/-- Convergent completed-level evaluation is semilinear for every +unit-indexed completed Frobenius lift: the point is acted on by the +integral lift and coefficients by Witt Frobenius. -/ +theorem padicCompletedUnitFrobeniusIntegerEquiv_evaluation + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) + (f : PowerSeries (padicCompletedUnramifiedWittRing p)) : + padicCompletedUnitFrobeniusIntegerEquiv p n u + (padicCompletedLevelPowerSeriesEval p n x hx f) = + padicCompletedLevelPowerSeriesEval p n + (padicCompletedUnitFrobeniusIntegerEquiv p n u x) + (padicCompletedUnitFrobeniusIntegerEquiv_hasEval p n u x hx) + (PowerSeries.map WittVector.frobenius f) := by + have hsource : HasSum + (fun m : ℕ => + padicCompletedLevelWittCoefficientHom p n + (PowerSeries.coeff m f) * x ^ m) + (padicCompletedLevelPowerSeriesEval p n x hx f) := by + rw [padicCompletedLevelPowerSeriesEval, + PowerSeries.coe_eval₂Hom] + exact PowerSeries.hasSum_eval₂ + (padicCompletedLevelWittCoefficientHom_continuous p n) + hx f + have hmapped := hsource.map + (padicCompletedUnitFrobeniusIntegerEquiv p n u) + (padicCompletedUnitFrobeniusIntegerEquiv_continuous p n u) + have hmapped' : HasSum + (fun m : ℕ => + padicCompletedLevelWittCoefficientHom p n + (PowerSeries.coeff m + (PowerSeries.map WittVector.frobenius f)) * + (padicCompletedUnitFrobeniusIntegerEquiv p n u x) ^ m) + (padicCompletedUnitFrobeniusIntegerEquiv p n u + (padicCompletedLevelPowerSeriesEval p n x hx f)) := by + convert hmapped using 1 + funext m + simp only [Function.comp_apply, map_mul, map_pow, + PowerSeries.coeff_map, + padicCompletedUnitFrobeniusIntegerEquiv_wittCoefficientHom] + apply HasSum.unique hmapped' + rw [padicCompletedLevelPowerSeriesEval, + PowerSeries.coe_eval₂Hom] + exact PowerSeries.hasSum_eval₂ + (padicCompletedLevelWittCoefficientHom_continuous p n) + (padicCompletedUnitFrobeniusIntegerEquiv_hasEval p n u x hx) + (PowerSeries.map WittVector.frobenius f) + +/-- The integral completed Frobenius restriction sends the chosen +primitive point to its actual completed standard unit translate. -/ +@[simp] +theorem padicCompletedUnitFrobeniusIntegerEquiv_primitiveRoot + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + padicCompletedUnitFrobeniusIntegerEquiv p n u + (padicCompletedPrimitiveRootInteger p n) = + padicCompletedStandardPrimitivePointUnitAction p n u := by + apply Subtype.ext + change + padicCompletedUnitFrobeniusLiftEquiv p n u + (padicCompletedPrimitiveRoot p n) = + (((padicCompletedStandardPrimitivePointUnitAction p n u : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n)) + exact padicCompletedUnitFrobeniusLiftEquiv_primitiveRoot p n u + +/-- The integral completed Frobenius restriction sends the genuine +multiplicative primitive point to its actual multiplicative unit +translate. -/ +theorem + padicCompletedUnitFrobeniusIntegerEquiv_multiplicativePrimitivePoint + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + padicCompletedUnitFrobeniusIntegerEquiv p n u + (padicCompletedMultiplicativePrimitivePoint p n) = + padicCompletedMultiplicativePrimitivePointUnitAction p u n := by + let lambda := padicCompletedPrimitiveRootInteger p n + let hlambda := padicCompletedPrimitiveRootInteger_hasEval p n + let H := padicCompletedStandardToMultiplicativeIntertwiner p + let r := + padicCompletedUnitFrobeniusIntegerEquiv p n u + have hpoint : + r lambda = + padicCompletedStandardPrimitivePointUnitAction p n u := by + simpa only [r, lambda] using + padicCompletedUnitFrobeniusIntegerEquiv_primitiveRoot p n u + calc + r (padicCompletedMultiplicativePrimitivePoint p n) = + padicCompletedLevelPowerSeriesEval p n + (r lambda) + (padicCompletedUnitFrobeniusIntegerEquiv_hasEval + p n u lambda hlambda) + (PowerSeries.map WittVector.frobenius H) := by + simpa only [r, lambda, hlambda, H, + padicCompletedMultiplicativePrimitivePoint] using + (padicCompletedUnitFrobeniusIntegerEquiv_evaluation + p n u lambda hlambda H) + _ = + padicCompletedLevelPowerSeriesEval p n + (padicCompletedStandardPrimitivePointUnitAction p n u) + (padicCompletedStandardPrimitivePointUnitAction_hasEval p n u) + H := by + rw [padicCompletedStandardToMultiplicativeIntertwiner_frobenius] + exact + padicCompletedLevelPowerSeriesEval_congr_point p n + (padicCompletedUnitFrobeniusIntegerEquiv_hasEval + p n u lambda hlambda) + (padicCompletedStandardPrimitivePointUnitAction_hasEval p n u) + hpoint H + _ = padicCompletedMultiplicativePrimitivePointUnitAction p u n := by + simpa only [lambda, hlambda, H, + padicCompletedStandardPrimitivePointUnitAction, + padicCompletedMultiplicativePrimitivePointUnitAction, + padicCompletedMultiplicativeUnitEndomorphism, + padicCompletedMultiplicativeScalarEndomorphismValue, + padicCompletedMultiplicativePrimitivePoint] using + (padicCompletedStandardToMultiplicativeIntertwiner_eval_endomorphism + p n lambda hlambda + (u : (padicLocalField p).valuationSubring)) + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusLift.lean new file mode 100644 index 0000000000..9a810e157d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusLift.lean @@ -0,0 +1,525 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveAction +/-! +# Frobenius lifts on completed p-adic Lubin--Tate levels + +Arithmetic Frobenius on the completed maximal-unramified p-adic field fixes +the standard primitive Lubin--Tate polynomial, since that polynomial descends +to `ℚ_[p]`. Using the completed primitive power basis, it therefore extends +to a semilinear automorphism of every completed level. A finite unit +parameter prescribes the image of the primitive root. + +The construction is an actual field automorphism. Surjectivity follows from +the theorem that every completed unit-parameter root generates the completed +level. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp + +/-- The ordinary completed-base algebra structure on a completed level, +named so it can coexist with the Frobenius-twisted structure. -/ +@[reducible] +noncomputable def padicCompletedLevelOriginalAlgebra + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Algebra (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) := + inferInstance + +/-- The codomain algebra structure whose scalar map is arithmetic +Frobenius followed by the ordinary scalar inclusion. -/ +@[reducible] +noncomputable def padicCompletedLevelFrobeniusAlgebra + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Algebra (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) := + RingHom.toAlgebra + ((algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n)).comp + (padicCompletedUnramifiedFrobenius p).toAlgHom.toRingHom) + +/-- The twisted level algebra map applies completed Frobenius before scalar +extension. -/ +theorem padicCompletedLevelFrobeniusAlgebra_algebraMap + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : padicCompletedUnramifiedField p) : + @algebraMap + (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + _ _ (padicCompletedLevelFrobeniusAlgebra p n) a = + algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + (padicCompletedUnramifiedFrobenius p a) := + rfl + +/-- Arithmetic Frobenius fixes the completed primitive polynomial because +its coefficients descend to `ℚ_[p]`. -/ +theorem padicCompletedPrimitivePolynomial_frobenius + (p : ℕ) [Fact p.Prime] (n : ℕ) : + (padicCompletedPrimitivePolynomial p n).map + (padicCompletedUnramifiedFrobenius p).toAlgHom.toRingHom = + padicCompletedPrimitivePolynomial p n := by + unfold padicCompletedPrimitivePolynomial + have hcomp : + ((padicCompletedUnramifiedFrobenius p).toAlgHom.toRingHom).comp + (algebraMap ℚ_[p] (padicCompletedUnramifiedField p)) = + algebraMap ℚ_[p] (padicCompletedUnramifiedField p) := by + apply RingHom.ext + intro a + exact (padicCompletedUnramifiedFrobenius p).commutes a + rw [Polynomial.map_map, hcomp] + +/-- A completed unit-parameter root annihilates the primitive minimal +polynomial for the Frobenius-twisted codomain algebra structure. -/ +theorem padicCompletedUnitParameterRoot_aeval_minpoly_frobenius + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : standardLubinTateUnitParameter (padicLocalField p) n) : + @Polynomial.aeval + (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + _ _ (padicCompletedLevelFrobeniusAlgebra p n) + (padicCompletedUnitParameterRoot p n a) + (minpoly (padicCompletedUnramifiedField p) + (padicCompletedPrimitiveRoot p n)) = + 0 := by + rw [padicCompletedPrimitiveRoot_minpoly] + change Polynomial.eval₂ + ((algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n)).comp + (padicCompletedUnramifiedFrobenius p).toAlgHom.toRingHom) + (padicCompletedUnitParameterRoot p n a) + (padicCompletedPrimitivePolynomial p n) = 0 + rw [← Polynomial.eval₂_map, + padicCompletedPrimitivePolynomial_frobenius] + rw [← Polynomial.eval_map] + exact padicCompletedUnitParameterRoot_isRoot p n a + +/-- The semilinear algebra homomorphism extending arithmetic Frobenius and +sending the chosen primitive root to the prescribed unit-parameter root. -/ +noncomputable def padicCompletedFrobeniusLiftAlgHom + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : standardLubinTateUnitParameter (padicLocalField p) n) : + @AlgHom + (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + (padicCompletedLevelField p n) + _ _ _ + (padicCompletedLevelOriginalAlgebra p n) + (padicCompletedLevelFrobeniusAlgebra p n) := + @PowerBasis.lift + (padicCompletedLevelField p n) _ + (padicCompletedUnramifiedField p) _ + (padicCompletedLevelOriginalAlgebra p n) + (padicCompletedLevelField p n) _ + (padicCompletedLevelFrobeniusAlgebra p n) + (padicCompletedPrimitivePowerBasis p n) + (padicCompletedUnitParameterRoot p n a) (by + rw [padicCompletedPrimitivePowerBasis_gen] + exact + padicCompletedUnitParameterRoot_aeval_minpoly_frobenius p n a) + +/-- The semilinear Frobenius homomorphism has the prescribed value on the +primitive root. -/ +@[simp] +theorem padicCompletedFrobeniusLiftAlgHom_primitiveRoot + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : standardLubinTateUnitParameter (padicLocalField p) n) : + padicCompletedFrobeniusLiftAlgHom p n a + (padicCompletedPrimitiveRoot p n) = + padicCompletedUnitParameterRoot p n a := by + change padicCompletedFrobeniusLiftAlgHom p n a + (padicCompletedPrimitivePowerBasis p n).gen = _ + exact @PowerBasis.lift_gen + (padicCompletedLevelField p n) _ + (padicCompletedUnramifiedField p) _ + (padicCompletedLevelOriginalAlgebra p n) + (padicCompletedLevelField p n) _ + (padicCompletedLevelFrobeniusAlgebra p n) + (padicCompletedPrimitivePowerBasis p n) + (padicCompletedUnitParameterRoot p n a) + (padicCompletedUnitParameterRoot_aeval_minpoly_frobenius p n a) + +/-- The underlying field homomorphism of the prescribed completed +Frobenius lift. -/ +noncomputable def padicCompletedFrobeniusLift + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : standardLubinTateUnitParameter (padicLocalField p) n) : + padicCompletedLevelField p n →+* + padicCompletedLevelField p n := + @AlgHom.toRingHom + (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + (padicCompletedLevelField p n) + _ _ _ + (padicCompletedLevelOriginalAlgebra p n) + (padicCompletedLevelFrobeniusAlgebra p n) + (padicCompletedFrobeniusLiftAlgHom p n a) + +/-- A completed Frobenius lift acts on base scalars by arithmetic +Frobenius. -/ +@[simp] +theorem padicCompletedFrobeniusLift_algebraMap + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : standardLubinTateUnitParameter (padicLocalField p) n) + (b : padicCompletedUnramifiedField p) : + padicCompletedFrobeniusLift p n a + (algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) b) = + algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + (padicCompletedUnramifiedFrobenius p b) := by + change padicCompletedFrobeniusLiftAlgHom p n a + (@algebraMap + (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + _ _ (padicCompletedLevelOriginalAlgebra p n) b) = + @algebraMap + (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + _ _ (padicCompletedLevelFrobeniusAlgebra p n) b + exact @AlgHom.commutes + (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + (padicCompletedLevelField p n) + _ _ _ + (padicCompletedLevelOriginalAlgebra p n) + (padicCompletedLevelFrobeniusAlgebra p n) + (padicCompletedFrobeniusLiftAlgHom p n a) b + +/-- A completed Frobenius lift sends the primitive root to its prescribed +unit-parameter transform. -/ +@[simp] +theorem padicCompletedFrobeniusLift_primitiveRoot + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : standardLubinTateUnitParameter (padicLocalField p) n) : + padicCompletedFrobeniusLift p n a + (padicCompletedPrimitiveRoot p n) = + padicCompletedUnitParameterRoot p n a := + padicCompletedFrobeniusLiftAlgHom_primitiveRoot p n a + +/-- The prescribed completed Frobenius lift is surjective. -/ +theorem padicCompletedFrobeniusLift_surjective + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : standardLubinTateUnitParameter (padicLocalField p) n) : + Function.Surjective (padicCompletedFrobeniusLift p n a) := by + let E := padicCompletedUnramifiedField p + let L := padicCompletedLevelField p n + let σ : L →+* L := padicCompletedFrobeniusLift p n a + let R : Subring L := σ.range + have hbase (b : E) : algebraMap E L b ∈ R := by + refine + ⟨algebraMap E L + ((padicCompletedUnramifiedFrobenius p).symm b), ?_⟩ + change σ + (algebraMap E L + ((padicCompletedUnramifiedFrobenius p).symm b)) = + algebraMap E L b + rw [show σ = padicCompletedFrobeniusLift p n a by rfl, + padicCompletedFrobeniusLift_algebraMap, + (padicCompletedUnramifiedFrobenius p).apply_symm_apply] + let S : Subalgebra E L := + { R with + algebraMap_mem' := hbase } + have hy : padicCompletedUnitParameterRoot p n a ∈ S := by + refine ⟨padicCompletedPrimitiveRoot p n, ?_⟩ + exact padicCompletedFrobeniusLift_primitiveRoot p n a + have hle : + Algebra.adjoin E + ({padicCompletedUnitParameterRoot p n a} : Set L) ≤ + S := by + apply Algebra.adjoin_le + intro z hz + rw [Set.mem_singleton_iff] at hz + subst z + exact hy + rw [show Algebra.adjoin E + ({padicCompletedUnitParameterRoot p n a} : Set L) = ⊤ by + exact padicCompletedUnitParameterRoot_adjoin_eq_top p n a] at hle + have hS : S = ⊤ := top_unique hle + intro z + have hz : z ∈ S := by rw [hS]; trivial + exact hz + +/-- The actual field automorphism extending arithmetic Frobenius and +having the prescribed action on the completed primitive root. -/ +noncomputable def padicCompletedFrobeniusLiftEquiv + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : standardLubinTateUnitParameter (padicLocalField p) n) : + padicCompletedLevelField p n ≃+* + padicCompletedLevelField p n := + RingEquiv.ofBijective (padicCompletedFrobeniusLift p n a) + ⟨(padicCompletedFrobeniusLift p n a).injective, + padicCompletedFrobeniusLift_surjective p n a⟩ + +/-- The completed Frobenius-lift equivalence acts on base scalars by +arithmetic Frobenius. -/ +@[simp] +theorem padicCompletedFrobeniusLiftEquiv_algebraMap + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : standardLubinTateUnitParameter (padicLocalField p) n) + (b : padicCompletedUnramifiedField p) : + padicCompletedFrobeniusLiftEquiv p n a + (algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) b) = + algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + (padicCompletedUnramifiedFrobenius p b) := + padicCompletedFrobeniusLift_algebraMap p n a b + +/-- The completed Frobenius-lift equivalence has the prescribed value on +the primitive root. -/ +@[simp] +theorem padicCompletedFrobeniusLiftEquiv_primitiveRoot + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : standardLubinTateUnitParameter (padicLocalField p) n) : + padicCompletedFrobeniusLiftEquiv p n a + (padicCompletedPrimitiveRoot p n) = + padicCompletedUnitParameterRoot p n a := + padicCompletedFrobeniusLift_primitiveRoot p n a + +/-- The direct completed standard unit action annihilates the primitive +minimal polynomial for the Frobenius-twisted codomain structure. -/ +theorem + padicCompletedStandardPrimitivePointUnitAction_aeval_minpoly_frobenius + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + @Polynomial.aeval + (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + _ _ (padicCompletedLevelFrobeniusAlgebra p n) + (((padicCompletedStandardPrimitivePointUnitAction p n u : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n)) + (minpoly (padicCompletedUnramifiedField p) + (padicCompletedPrimitiveRoot p n)) = + 0 := by + rw [padicCompletedPrimitiveRoot_minpoly] + change Polynomial.eval₂ + ((algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n)).comp + (padicCompletedUnramifiedFrobenius p).toAlgHom.toRingHom) + (((padicCompletedStandardPrimitivePointUnitAction p n u : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n)) + (padicCompletedPrimitivePolynomial p n) = 0 + rw [← Polynomial.eval₂_map, + padicCompletedPrimitivePolynomial_frobenius] + rw [← Polynomial.eval_map] + exact + padicCompletedStandardPrimitivePointUnitAction_isRoot p n u + +/-- The semilinear algebra homomorphism extending arithmetic Frobenius and +sending the primitive root to its actual completed standard unit action. -/ +noncomputable def padicCompletedUnitFrobeniusLiftAlgHom + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + @AlgHom + (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + (padicCompletedLevelField p n) + _ _ _ + (padicCompletedLevelOriginalAlgebra p n) + (padicCompletedLevelFrobeniusAlgebra p n) := + @PowerBasis.lift + (padicCompletedLevelField p n) _ + (padicCompletedUnramifiedField p) _ + (padicCompletedLevelOriginalAlgebra p n) + (padicCompletedLevelField p n) _ + (padicCompletedLevelFrobeniusAlgebra p n) + (padicCompletedPrimitivePowerBasis p n) + (((padicCompletedStandardPrimitivePointUnitAction p n u : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n)) (by + rw [padicCompletedPrimitivePowerBasis_gen] + exact + padicCompletedStandardPrimitivePointUnitAction_aeval_minpoly_frobenius + p n u) + +/-- The direct unit-indexed semilinear homomorphism sends the primitive +root to the actual completed standard unit action. -/ +@[simp] +theorem padicCompletedUnitFrobeniusLiftAlgHom_primitiveRoot + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + padicCompletedUnitFrobeniusLiftAlgHom p n u + (padicCompletedPrimitiveRoot p n) = + (((padicCompletedStandardPrimitivePointUnitAction p n u : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n)) := by + change padicCompletedUnitFrobeniusLiftAlgHom p n u + (padicCompletedPrimitivePowerBasis p n).gen = _ + exact @PowerBasis.lift_gen + (padicCompletedLevelField p n) _ + (padicCompletedUnramifiedField p) _ + (padicCompletedLevelOriginalAlgebra p n) + (padicCompletedLevelField p n) _ + (padicCompletedLevelFrobeniusAlgebra p n) + (padicCompletedPrimitivePowerBasis p n) + (((padicCompletedStandardPrimitivePointUnitAction p n u : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n)) + (padicCompletedStandardPrimitivePointUnitAction_aeval_minpoly_frobenius + p n u) + +/-- The underlying field homomorphism of the unit-indexed completed +Frobenius lift. -/ +noncomputable def padicCompletedUnitFrobeniusLift + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + padicCompletedLevelField p n →+* + padicCompletedLevelField p n := + @AlgHom.toRingHom + (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + (padicCompletedLevelField p n) + _ _ _ + (padicCompletedLevelOriginalAlgebra p n) + (padicCompletedLevelFrobeniusAlgebra p n) + (padicCompletedUnitFrobeniusLiftAlgHom p n u) + +/-- The direct unit-indexed completed Frobenius lift acts on base scalars +by arithmetic Frobenius. -/ +@[simp] +theorem padicCompletedUnitFrobeniusLift_algebraMap + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) + (b : padicCompletedUnramifiedField p) : + padicCompletedUnitFrobeniusLift p n u + (algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) b) = + algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + (padicCompletedUnramifiedFrobenius p b) := by + change padicCompletedUnitFrobeniusLiftAlgHom p n u + (@algebraMap + (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + _ _ (padicCompletedLevelOriginalAlgebra p n) b) = + @algebraMap + (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + _ _ (padicCompletedLevelFrobeniusAlgebra p n) b + exact @AlgHom.commutes + (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + (padicCompletedLevelField p n) + _ _ _ + (padicCompletedLevelOriginalAlgebra p n) + (padicCompletedLevelFrobeniusAlgebra p n) + (padicCompletedUnitFrobeniusLiftAlgHom p n u) b + +/-- The direct unit-indexed completed Frobenius lift has its prescribed +action on the primitive root. -/ +@[simp] +theorem padicCompletedUnitFrobeniusLift_primitiveRoot + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + padicCompletedUnitFrobeniusLift p n u + (padicCompletedPrimitiveRoot p n) = + (((padicCompletedStandardPrimitivePointUnitAction p n u : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n)) := + padicCompletedUnitFrobeniusLiftAlgHom_primitiveRoot p n u + +/-- The direct unit-indexed completed Frobenius lift is surjective. -/ +theorem padicCompletedUnitFrobeniusLift_surjective + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + Function.Surjective (padicCompletedUnitFrobeniusLift p n u) := by + let E := padicCompletedUnramifiedField p + let L := padicCompletedLevelField p n + let y : L := + ((padicCompletedStandardPrimitivePointUnitAction p n u : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : L) + let σ : L →+* L := padicCompletedUnitFrobeniusLift p n u + let R : Subring L := σ.range + have hbase (b : E) : algebraMap E L b ∈ R := by + refine + ⟨algebraMap E L + ((padicCompletedUnramifiedFrobenius p).symm b), ?_⟩ + change σ + (algebraMap E L + ((padicCompletedUnramifiedFrobenius p).symm b)) = + algebraMap E L b + rw [show σ = padicCompletedUnitFrobeniusLift p n u by rfl, + padicCompletedUnitFrobeniusLift_algebraMap, + (padicCompletedUnramifiedFrobenius p).apply_symm_apply] + let S : Subalgebra E L := + { R with + algebraMap_mem' := hbase } + have hy : y ∈ S := by + refine ⟨padicCompletedPrimitiveRoot p n, ?_⟩ + exact padicCompletedUnitFrobeniusLift_primitiveRoot p n u + have hle : Algebra.adjoin E ({y} : Set L) ≤ S := by + apply Algebra.adjoin_le + intro z hz + rw [Set.mem_singleton_iff] at hz + subst z + exact hy + rw [show Algebra.adjoin E ({y} : Set L) = ⊤ by + simpa only [E, L, y] using + padicCompletedStandardPrimitivePointUnitAction_adjoin_eq_top + p n u] at hle + have hS : S = ⊤ := top_unique hle + intro z + have hz : z ∈ S := by rw [hS]; trivial + exact hz + +/-- The actual field automorphism extending arithmetic Frobenius and acting +on the primitive root by the direct completed standard unit action. -/ +noncomputable def padicCompletedUnitFrobeniusLiftEquiv + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + padicCompletedLevelField p n ≃+* + padicCompletedLevelField p n := + RingEquiv.ofBijective (padicCompletedUnitFrobeniusLift p n u) + ⟨(padicCompletedUnitFrobeniusLift p n u).injective, + padicCompletedUnitFrobeniusLift_surjective p n u⟩ + +/-- The unit-indexed Frobenius-lift equivalence acts on completed base +scalars by arithmetic Frobenius. -/ +@[simp] +theorem padicCompletedUnitFrobeniusLiftEquiv_algebraMap + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) + (b : padicCompletedUnramifiedField p) : + padicCompletedUnitFrobeniusLiftEquiv p n u + (algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) b) = + algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + (padicCompletedUnramifiedFrobenius p b) := + padicCompletedUnitFrobeniusLift_algebraMap p n u b + +/-- The unit-indexed Frobenius-lift equivalence acts on the primitive root +by the direct completed standard unit action. -/ +@[simp] +theorem padicCompletedUnitFrobeniusLiftEquiv_primitiveRoot + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + padicCompletedUnitFrobeniusLiftEquiv p n u + (padicCompletedPrimitiveRoot p n) = + (((padicCompletedStandardPrimitivePointUnitAction p n u : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n)) := + padicCompletedUnitFrobeniusLift_primitiveRoot p n u + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean new file mode 100644 index 0000000000..72cbe8458c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean @@ -0,0 +1,679 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeSeries +public import Mathlib.FieldTheory.SplittingField.Construction +public import Mathlib.RingTheory.AdicCompletion.Topology +public import Mathlib.RingTheory.PowerSeries.Evaluation +public import Mathlib.Topology.Algebra.Nonarchimedean.AdicTopology +/-! +# Completed p-adic Lubin--Tate levels + +For the completed maximal-unramified coefficient field + +`E = Frac(W(AlgebraicClosure (ZMod p)))`, + +this file base-changes the standard primitive Lubin--Tate polynomial from +`ℚ_[p]` to `E` and takes its actual splitting field. The complete discrete +valuation on that finite separable extension is selected from the integral +closure of the canonical Witt valuation ring. This is the mixed- +characteristic evaluation field needed by the changed-uniformizer descent. + +The integral polynomial, splitting field, and valuations below are the +existing mathlib/LCFT objects. No parallel p-adic field, integer ring, or +completion is introduced. +-/ + +@[expose] public section + +noncomputable +section + +open Filter +open scoped Polynomial +open scoped PowerSeries +open scoped PowerSeries.WithPiTopology + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +/-- The primitive standard Lubin--Tate polynomial over the canonical +valuation ring of the completed-unramified field. -/ +noncomputable def padicCompletedPrimitivePolynomialInteger + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Polynomial + (padicCompletedUnramifiedCompleteDVF p).valuationSubring := + (standardLubinTatePrimitivePolynomial + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) n).map + (padicCompletedUnramifiedIntegerMap p) + +/-- The primitive standard Lubin--Tate polynomial after base change from +`ℚ_[p]` to the completed-unramified fraction field. -/ +noncomputable def padicCompletedPrimitivePolynomial + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Polynomial (padicCompletedUnramifiedField p) := + (standardLubinTatePrimitivePolynomialOverField + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) n).map + (algebraMap ℚ_[p] (padicCompletedUnramifiedField p)) + +/-- Mapping the integral completed primitive polynomial to the fraction +field gives the field-valued base change. -/ +theorem padicCompletedPrimitivePolynomialInteger_map + (p : ℕ) [Fact p.Prime] (n : ℕ) : + (padicCompletedPrimitivePolynomialInteger p n).map + (algebraMap + (padicCompletedUnramifiedCompleteDVF p).valuationSubring + (padicCompletedUnramifiedField p)) = + padicCompletedPrimitivePolynomial p n := by + let O := (padicLocalField p).valuationSubring + let A := (padicCompletedUnramifiedCompleteDVF p).valuationSubring + let E := padicCompletedUnramifiedField p + let Q := + standardLubinTatePrimitivePolynomial + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) n + have hmaps : + (algebraMap A E).comp + (padicCompletedUnramifiedIntegerMap p) = + (algebraMap ℚ_[p] E).comp (algebraMap O ℚ_[p]) := by + ext z + exact padicCompletedUnramifiedIntegerMap_coe p z + change + (Q.map (padicCompletedUnramifiedIntegerMap p)).map + (algebraMap A E) = + (Q.map (algebraMap O ℚ_[p])).map + (algebraMap ℚ_[p] E) + rw [Polynomial.map_map, Polynomial.map_map, hmaps] + +/-- The integral completed primitive polynomial is monic. -/ +theorem padicCompletedPrimitivePolynomialInteger_monic + (p : ℕ) [Fact p.Prime] (n : ℕ) : + (padicCompletedPrimitivePolynomialInteger p n).Monic := + (standardLubinTatePrimitivePolynomial_monic + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) n).map _ + +/-- The field-valued completed primitive polynomial is monic. -/ +theorem padicCompletedPrimitivePolynomial_monic + (p : ℕ) [Fact p.Prime] (n : ℕ) : + (padicCompletedPrimitivePolynomial p n).Monic := + (standardLubinTatePrimitivePolynomialOverField_monic + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) n).map _ + +/-- The completed primitive polynomial has degree `(p - 1) * p ^ n`. -/ +theorem padicCompletedPrimitivePolynomial_natDegree + (p : ℕ) [Fact p.Prime] (n : ℕ) : + (padicCompletedPrimitivePolynomial p n).natDegree = + (p - 1) * p ^ n := by + have hcard : + Nat.card (padicLocalField p).residueField = p := by + simpa [padicLocalField] using + padicCompleteDVF_residueField_card p + let π : (padicLocalField p).valuationSubring := + padicIntEquivValuationSubring p (p : ℤ_[p]) + calc + (padicCompletedPrimitivePolynomial p n).natDegree = + (standardLubinTatePrimitivePolynomialOverField + (padicLocalField p) π n).natDegree := + (standardLubinTatePrimitivePolynomialOverField_monic + (padicLocalField p) π n).natDegree_map + (algebraMap ℚ_[p] (padicCompletedUnramifiedField p)) + _ = (Nat.card (padicLocalField p).residueField - 1) * + Nat.card (padicLocalField p).residueField ^ n := + standardLubinTatePrimitivePolynomialOverField_natDegree + (padicLocalField p) π n + _ = (p - 1) * p ^ n := by rw [hcard] + +/-- The completed primitive polynomial remains separable after base change. -/ +theorem padicCompletedPrimitivePolynomial_separable + (p : ℕ) [Fact p.Prime] (n : ℕ) : + (padicCompletedPrimitivePolynomial p n).Separable := + (standardLubinTatePrimitivePolynomialOverField_separable + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).map + +/-- The actual finite splitting field over the completed-unramified +coefficient field. -/ +def padicCompletedLevelField + (p : ℕ) [Fact p.Prime] (n : ℕ) := + (padicCompletedPrimitivePolynomial p n).SplittingField + +@[reducible] +instance padicCompletedLevelFieldField + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Field (padicCompletedLevelField p n) := by + change Field (padicCompletedPrimitivePolynomial p n).SplittingField + infer_instance + +@[reducible] +noncomputable instance padicCompletedLevelFieldAlgebra + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Algebra (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) := by + change Algebra (padicCompletedUnramifiedField p) + (padicCompletedPrimitivePolynomial p n).SplittingField + infer_instance + +section + +/-- The completed Lubin–Tate level field is a module over the completed unramified base. -/ +local instance padicCompletedLevelFieldModule + (p : ℕ) [Fact p.Prime] (n : ℕ) : + @Module (padicCompletedUnramifiedField p) (padicCompletedLevelField p n) + (inferInstance : DivisionRing (padicCompletedUnramifiedField p)).toRing.toSemiring + (inferInstance : AddCommGroup (padicCompletedLevelField p n)).toAddCommMonoid := + @Algebra.toModule (padicCompletedUnramifiedField p) (padicCompletedLevelField p n) + _ _ (padicCompletedLevelFieldAlgebra p n) + +instance padicCompletedLevelField_finiteDimensional + (p : ℕ) [Fact p.Prime] (n : ℕ) : + FiniteDimensional (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) := by + change FiniteDimensional (padicCompletedUnramifiedField p) + (padicCompletedPrimitivePolynomial p n).SplittingField + infer_instance + +end + +/-- The completed level is the splitting field of a separable polynomial, +hence is Galois over its completed-unramified base. -/ +noncomputable instance padicCompletedLevelField_isGalois + (p : ℕ) [Fact p.Prime] (n : ℕ) : + IsGalois (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) := by + change IsGalois (padicCompletedUnramifiedField p) + (padicCompletedPrimitivePolynomial p n).SplittingField + exact + IsGalois.of_separable_splitting_field + (padicCompletedPrimitivePolynomial_separable p n) + +/-- The completed primitive polynomial splits over the completed level. -/ +theorem padicCompletedPrimitivePolynomial_splits + (p : ℕ) [Fact p.Prime] (n : ℕ) : + ((padicCompletedPrimitivePolynomial p n).map + (algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n))).Splits := + Polynomial.SplittingField.splits + (padicCompletedPrimitivePolynomial p n) + +/-- The roots of the completed primitive polynomial generate its splitting +field. -/ +theorem padicCompletedPrimitivePolynomial_adjoin_rootSet + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Algebra.adjoin (padicCompletedUnramifiedField p) + ((padicCompletedPrimitivePolynomial p n).rootSet + (padicCompletedLevelField p n) : + Set (padicCompletedLevelField p n)) = + ⊤ := + Polynomial.SplittingField.adjoin_rootSet + (padicCompletedPrimitivePolynomial p n) + +private theorem padicCompletedPrimitivePolynomial_map_degree_ne_zero + (p : ℕ) [Fact p.Prime] (n : ℕ) : + ((padicCompletedPrimitivePolynomial p n).map + (algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n))).degree ≠ 0 := by + have hmonic := + (padicCompletedPrimitivePolynomial_monic p n).map + (algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n)) + rw [Polynomial.degree_eq_natDegree hmonic.ne_zero, + (padicCompletedPrimitivePolynomial_monic p n).natDegree_map, + padicCompletedPrimitivePolynomial_natDegree] + exact_mod_cast + (Nat.mul_pos + (Nat.sub_pos_of_lt (Fact.out : p.Prime).one_lt) + (Nat.pow_pos (Fact.out : p.Prime).pos)).ne' + +/-- A chosen primitive standard division point in the completed level. -/ +noncomputable def padicCompletedPrimitiveRoot + (p : ℕ) [Fact p.Prime] (n : ℕ) : + padicCompletedLevelField p n := + Polynomial.rootOfSplits + (Polynomial.SplittingField.splits + (padicCompletedPrimitivePolynomial p n)) + (by exact padicCompletedPrimitivePolynomial_map_degree_ne_zero p n) + +/-- The chosen completed primitive point is a root of the genuine +base-changed primitive polynomial. -/ +theorem padicCompletedPrimitiveRoot_isRoot + (p : ℕ) [Fact p.Prime] (n : ℕ) : + ((padicCompletedPrimitivePolynomial p n).map + (algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n))).IsRoot + (padicCompletedPrimitiveRoot p n) := + Polynomial.eval_rootOfSplits + (Polynomial.SplittingField.splits + (padicCompletedPrimitivePolynomial p n)) + (padicCompletedPrimitivePolynomial_map_degree_ne_zero p n) + +/-- The integral completed primitive polynomial annihilates the chosen +root in the actual splitting field. -/ +theorem padicCompletedPrimitiveRoot_aeval_integerPolynomial + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Polynomial.aeval (padicCompletedPrimitiveRoot p n) + (padicCompletedPrimitivePolynomialInteger p n) = 0 := by + calc + Polynomial.aeval (padicCompletedPrimitiveRoot p n) + (padicCompletedPrimitivePolynomialInteger p n) = + Polynomial.aeval (padicCompletedPrimitiveRoot p n) + ((padicCompletedPrimitivePolynomialInteger p n).map + (algebraMap + (padicCompletedUnramifiedCompleteDVF p).valuationSubring + (padicCompletedUnramifiedField p))) := by + symm + exact + Polynomial.aeval_map_algebraMap + (padicCompletedUnramifiedField p) + (padicCompletedPrimitiveRoot p n) + (padicCompletedPrimitivePolynomialInteger p n) + _ = + Polynomial.aeval (padicCompletedPrimitiveRoot p n) + (padicCompletedPrimitivePolynomial p n) := by + rw [padicCompletedPrimitivePolynomialInteger_map] + _ = 0 := by + simpa [Polynomial.IsRoot, Polynomial.aeval_def] using + padicCompletedPrimitiveRoot_isRoot p n + +/-- The chosen primitive point is integral over the canonical Witt +valuation ring. -/ +theorem padicCompletedPrimitiveRoot_isIntegral + (p : ℕ) [Fact p.Prime] (n : ℕ) : + IsIntegral + (padicCompletedUnramifiedCompleteDVF p).valuationSubring + (padicCompletedPrimitiveRoot p n) := + ⟨padicCompletedPrimitivePolynomialInteger p n, + padicCompletedPrimitivePolynomialInteger_monic p n, + padicCompletedPrimitiveRoot_aeval_integerPolynomial p n⟩ + +private theorem padicCompletedLevelCompleteDVFData_exists + (p : ℕ) [Fact p.Prime] (n : ℕ) : + ∃ target : CompleteDVF.{0, 0} (padicCompletedLevelField p n), + ∃ hExt : + (padicCompletedUnramifiedCompleteDVF p).valuation.HasExtension + target.valuation, + letI : + (padicCompletedUnramifiedCompleteDVF p).valuation.HasExtension + target.valuation := hExt + IsIntegralClosure target.valuationSubring + (padicCompletedUnramifiedCompleteDVF p).valuationSubring + (padicCompletedLevelField p n) ∧ + degree (padicCompletedUnramifiedCompleteDVF p).toDVF target.toDVF = + ramificationIndex + (padicCompletedUnramifiedCompleteDVF p).toDVF target.toDVF * + residueDegree + (padicCompletedUnramifiedCompleteDVF p).toDVF target.toDVF := by + exact + exists_integralClosure_standard_fundamental_identity + (K := padicCompletedUnramifiedField p) + (L := padicCompletedLevelField p n) + (padicCompletedUnramifiedCompleteDVF p) + +/-- The complete discrete valuation on the completed level selected from its +actual integral closure over the Witt valuation ring. -/ +noncomputable def padicCompletedLevelCompleteDVF + (p : ℕ) [Fact p.Prime] (n : ℕ) : + CompleteDVF.{0, 0} (padicCompletedLevelField p n) := + Classical.choose (show + ∃ target : CompleteDVF.{0, 0} (padicCompletedLevelField p n), + ∃ hExt : + (padicCompletedUnramifiedCompleteDVF p).valuation.HasExtension + target.valuation, + letI : + (padicCompletedUnramifiedCompleteDVF p).valuation.HasExtension + target.valuation := hExt + IsIntegralClosure target.valuationSubring + (padicCompletedUnramifiedCompleteDVF p).valuationSubring + (padicCompletedLevelField p n) ∧ + degree (padicCompletedUnramifiedCompleteDVF p).toDVF target.toDVF = + ramificationIndex + (padicCompletedUnramifiedCompleteDVF p).toDVF target.toDVF * + residueDegree + (padicCompletedUnramifiedCompleteDVF p).toDVF target.toDVF from by + exact padicCompletedLevelCompleteDVFData_exists p n) + +/-- The selected completed-level valuation extends the completed-unramified +base valuation. -/ +theorem padicCompletedLevelCompleteDVF_hasExtension + (p : ℕ) [Fact p.Prime] (n : ℕ) : + (padicCompletedUnramifiedCompleteDVF p).valuation.HasExtension + (padicCompletedLevelCompleteDVF p n).valuation := + Classical.choose + (Classical.choose_spec + (padicCompletedLevelCompleteDVFData_exists p n)) + +noncomputable instance padicCompletedLevelCompleteDVF_hasExtensionInstance + (p : ℕ) [Fact p.Prime] (n : ℕ) : + (padicCompletedUnramifiedCompleteDVF p).valuation.HasExtension + (padicCompletedLevelCompleteDVF p n).valuation := + padicCompletedLevelCompleteDVF_hasExtension p n + +/-- The completed-level valuation ring is the actual integral closure of the +completed-unramified valuation ring. -/ +theorem padicCompletedLevelCompleteDVF_isIntegralClosure + (p : ℕ) [Fact p.Prime] (n : ℕ) : + IsIntegralClosure + (padicCompletedLevelCompleteDVF p n).valuationSubring + (padicCompletedUnramifiedCompleteDVF p).valuationSubring + (padicCompletedLevelField p n) := + (Classical.choose_spec + (Classical.choose_spec + (padicCompletedLevelCompleteDVFData_exists p n))).1 + +/-- The chosen completed primitive root belongs to the selected +integral-closure valuation ring. -/ +theorem padicCompletedPrimitiveRoot_mem_valuationSubring + (p : ℕ) [Fact p.Prime] (n : ℕ) : + padicCompletedPrimitiveRoot p n ∈ + (padicCompletedLevelCompleteDVF p n).valuation.valuationSubring := by + let : IsIntegralClosure + (padicCompletedLevelCompleteDVF p n).valuationSubring + (padicCompletedUnramifiedCompleteDVF p).valuationSubring + (padicCompletedLevelField p n) := + padicCompletedLevelCompleteDVF_isIntegralClosure p n + rcases + (IsIntegralClosure.isIntegral_iff + (A := (padicCompletedLevelCompleteDVF p n).valuationSubring) + (R := (padicCompletedUnramifiedCompleteDVF p).valuationSubring) + (B := padicCompletedLevelField p n)).1 + (padicCompletedPrimitiveRoot_isIntegral p n) with + ⟨z, hz⟩ + change + (padicCompletedLevelCompleteDVF p n).valuation + (padicCompletedPrimitiveRoot p n) ≤ 1 + rw [← hz] + exact z.property + +/-- The chosen primitive point as an element of the completed-level +valuation ring. -/ +noncomputable def padicCompletedPrimitiveRootInteger + (p : ℕ) [Fact p.Prime] (n : ℕ) : + (padicCompletedLevelCompleteDVF p n).valuationSubring := + ⟨padicCompletedPrimitiveRoot p n, + padicCompletedPrimitiveRoot_mem_valuationSubring p n⟩ + +/-- Coercing the integral primitive point returns the chosen splitting-field +root. -/ +@[simp] +theorem padicCompletedPrimitiveRootInteger_coe + (p : ℕ) [Fact p.Prime] (n : ℕ) : + (padicCompletedPrimitiveRootInteger p n : + padicCompletedLevelField p n) = + padicCompletedPrimitiveRoot p n := + rfl + +/-- The integral primitive polynomial annihilates the primitive point in +the completed-level valuation ring. -/ +theorem padicCompletedPrimitiveRootInteger_aeval + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Polynomial.aeval (padicCompletedPrimitiveRootInteger p n) + (padicCompletedPrimitivePolynomialInteger p n) = 0 := by + let base := padicCompletedUnramifiedCompleteDVF p + let target := padicCompletedLevelCompleteDVF p n + let i : target.valuationSubring →ₐ[base.valuationSubring] + padicCompletedLevelField p n := + IsScalarTower.toAlgHom base.valuationSubring target.valuationSubring + (padicCompletedLevelField p n) + apply Subtype.ext + change + i (Polynomial.aeval (padicCompletedPrimitiveRootInteger p n) + (padicCompletedPrimitivePolynomialInteger p n)) = i 0 + rw [← Polynomial.aeval_algHom_apply (f := i), map_zero] + simpa [i] using + padicCompletedPrimitiveRoot_aeval_integerPolynomial p n + +/-- Base change preserves the weak Eisenstein condition for the completed +primitive polynomial. -/ +theorem padicCompletedPrimitivePolynomialInteger_isWeaklyEisensteinAt + (p : ℕ) [Fact p.Prime] (n : ℕ) : + (padicCompletedPrimitivePolynomialInteger p n).IsWeaklyEisensteinAt + (padicCompletedUnramifiedCompleteDVF p).maximalIdeal := by + rw [← padicCompletedUnramifiedIntegerMap_map_maximalIdeal p] + exact + (standardLubinTatePrimitivePolynomial_isEisensteinAt + (padicMultiplicativeLubinTateSeries_isUniformizer p) + n).isWeaklyEisensteinAt.map + (padicCompletedUnramifiedIntegerMap p) + +/-- The completed primitive point lies in the maximal ideal of the selected +level valuation ring. -/ +theorem padicCompletedPrimitiveRootInteger_mem_maximalIdeal + (p : ℕ) [Fact p.Prime] (n : ℕ) : + padicCompletedPrimitiveRootInteger p n ∈ + (padicCompletedLevelCompleteDVF p n).maximalIdeal := by + let base := padicCompletedUnramifiedCompleteDVF p + let target := padicCompletedLevelCompleteDVF p n + let Q := padicCompletedPrimitivePolynomialInteger p n + let lambda := padicCompletedPrimitiveRootInteger p n + have hlambdaPow : + lambda ^ + ((Q.map + (algebraMap base.valuationSubring + target.valuationSubring)).natDegree) ∈ + base.maximalIdeal.map + (algebraMap base.valuationSubring target.valuationSubring) := + (padicCompletedPrimitivePolynomialInteger_isWeaklyEisensteinAt + p n).pow_natDegree_le_of_aeval_zero_of_monic_mem_map + (by + simpa [base, target, Q, lambda] using + padicCompletedPrimitiveRootInteger_aeval p n) + (by + simpa [Q] using + padicCompletedPrimitivePolynomialInteger_monic p n) + _ le_rfl + have hlambdaPow' : + lambda ^ + ((Q.map + (algebraMap base.valuationSubring + target.valuationSubring)).natDegree) ∈ + target.maximalIdeal := + (maximalIdeal_map_integerMap_le base.toDVF target.toDVF) hlambdaPow + exact + (IsLocalRing.maximalIdeal.isMaximal + target.valuationSubring).isPrime.mem_of_pow_mem _ hlambdaPow' + +/-- The discrete uniformity on Witt coefficients used for convergent power-series evaluation. -/ +noncomputable local instance (priority := 50) + padicCompletedLevelWittUniformSpace + (p : ℕ) [Fact p.Prime] : + UniformSpace (padicCompletedUnramifiedWittRing p) := + ⊥ + +/-- The completed level carries the adic topology of its maximal ideal. -/ +noncomputable local instance + padicCompletedLevelTargetWithIdeal + (p : ℕ) [Fact p.Prime] (n : ℕ) : + WithIdeal + (padicCompletedLevelCompleteDVF p n).valuationSubring where + i := (padicCompletedLevelCompleteDVF p n).maximalIdeal + +/-- The completed-level valuation ring is complete for its maximal-ideal topology. -/ +noncomputable local instance + padicCompletedLevelTargetCompleteSpace + (p : ℕ) [Fact p.Prime] (n : ℕ) : + CompleteSpace + (padicCompletedLevelCompleteDVF p n).valuationSubring := by + let target := padicCompletedLevelCompleteDVF p n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).1 + +/-- The completed-level maximal-ideal topology is Hausdorff. -/ +noncomputable local instance + padicCompletedLevelTargetT2Space + (p : ℕ) [Fact p.Prime] (n : ℕ) : + T2Space + (padicCompletedLevelCompleteDVF p n).valuationSubring := by + let target := padicCompletedLevelCompleteDVF p n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).2 + +/-- The chosen completed primitive point is a genuine convergent evaluation +point for Witt-coefficient power series. -/ +theorem padicCompletedPrimitiveRootInteger_hasEval + (p : ℕ) [Fact p.Prime] (n : ℕ) : + PowerSeries.HasEval (padicCompletedPrimitiveRootInteger p n) := by + apply WithIdeal.isTopologicallyNilpotent_of_mem + exact padicCompletedPrimitiveRootInteger_mem_maximalIdeal p n + +/-- The canonical Witt-coefficient map into the valuation ring of the +actual completed level. -/ +noncomputable def padicCompletedLevelWittCoefficientHom + (p : ℕ) [Fact p.Prime] (n : ℕ) : + padicCompletedUnramifiedWittRing p →+* + (padicCompletedLevelCompleteDVF p n).valuationSubring := + (integerMap + (padicCompletedUnramifiedCompleteDVF p).toDVF + (padicCompletedLevelCompleteDVF p n).toDVF).comp + (padicCompletedUnramifiedWittRingEquivValuationSubring p).toRingHom + +/-- The Witt-coefficient map is the ambient fraction-field algebra map +after coercion. -/ +@[simp] +theorem padicCompletedLevelWittCoefficientHom_apply + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : padicCompletedUnramifiedWittRing p) : + ((padicCompletedLevelWittCoefficientHom p n a : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) = + algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + (algebraMap (padicCompletedUnramifiedWittRing p) + (padicCompletedUnramifiedField p) a) := by + rfl + +/-- With the discrete coefficient topology, the canonical Witt map into +the completed level is continuous. -/ +theorem padicCompletedLevelWittCoefficientHom_continuous + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Continuous (padicCompletedLevelWittCoefficientHom p n) := + continuous_of_discreteTopology + +/-- The Witt algebra structure on the completed level is induced by its coefficient map. -/ +noncomputable local instance + padicCompletedLevelWittAlgebra + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Algebra (padicCompletedUnramifiedWittRing p) + (padicCompletedLevelCompleteDVF p n).valuationSubring := + (padicCompletedLevelWittCoefficientHom p n).toAlgebra + +/-- Analytic evaluation of Witt-coefficient power series in the actual +completed level. -/ +noncomputable def padicCompletedLevelPowerSeriesEval + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) : + (padicCompletedUnramifiedWittRing p)⟦X⟧ →+* + (padicCompletedLevelCompleteDVF p n).valuationSubring := + PowerSeries.eval₂Hom + (padicCompletedLevelWittCoefficientHom_continuous p n) hx + +/-- Completed-level evaluation sends the power-series variable to the +chosen evaluation point. -/ +@[simp] +theorem padicCompletedLevelPowerSeriesEval_X + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) : + padicCompletedLevelPowerSeriesEval p n x hx PowerSeries.X = x := by + rw [padicCompletedLevelPowerSeriesEval, + PowerSeries.coe_eval₂Hom, PowerSeries.eval₂_X] + +/-- Completed-level evaluation sends constants through the canonical Witt +coefficient map. -/ +@[simp] +theorem padicCompletedLevelPowerSeriesEval_C + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) + (a : padicCompletedUnramifiedWittRing p) : + padicCompletedLevelPowerSeriesEval p n x hx (PowerSeries.C a) = + padicCompletedLevelWittCoefficientHom p n a := by + rw [padicCompletedLevelPowerSeriesEval, + PowerSeries.coe_eval₂Hom, PowerSeries.eval₂_C] + +/-- On polynomial power series, completed-level analytic evaluation agrees +with ordinary polynomial evaluation. -/ +@[simp] +theorem padicCompletedLevelPowerSeriesEval_coe + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) + (P : Polynomial (padicCompletedUnramifiedWittRing p)) : + padicCompletedLevelPowerSeriesEval p n x hx + (P : PowerSeries (padicCompletedUnramifiedWittRing p)) = + Polynomial.eval₂ + (padicCompletedLevelWittCoefficientHom p n) x P := by + rw [padicCompletedLevelPowerSeriesEval, + PowerSeries.coe_eval₂Hom, PowerSeries.eval₂_coe] + +/-- Evaluation at a topologically nilpotent completed-level integer is +continuous. -/ +theorem padicCompletedLevelPowerSeriesEval_continuous + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) : + Continuous (padicCompletedLevelPowerSeriesEval p n x hx) := by + rw [padicCompletedLevelPowerSeriesEval, + PowerSeries.coe_eval₂Hom] + exact PowerSeries.continuous_eval₂ + (padicCompletedLevelWittCoefficientHom_continuous p n) hx + +/-- Evaluating a Witt-coefficient series with zero constant coefficient +produces another topologically nilpotent completed-level integer. -/ +theorem padicCompletedLevelPowerSeriesEval_hasEval + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) + (f : PowerSeries (padicCompletedUnramifiedWittRing p)) + (hf : PowerSeries.HasSubst f) : + PowerSeries.HasEval + (padicCompletedLevelPowerSeriesEval p n x hx f) := + hf.hasEval.map + (padicCompletedLevelPowerSeriesEval_continuous p n x hx) + +/-- Completed-level analytic evaluation commutes with one-variable formal +substitution. -/ +theorem padicCompletedLevelPowerSeriesEval_subst + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) + (a f : PowerSeries (padicCompletedUnramifiedWittRing p)) + (ha : PowerSeries.HasSubst a) + (haEval : PowerSeries.HasEval + (padicCompletedLevelPowerSeriesEval p n x hx a)) : + padicCompletedLevelPowerSeriesEval p n x hx + (PowerSeries.subst a f) = + padicCompletedLevelPowerSeriesEval p n + (padicCompletedLevelPowerSeriesEval p n x hx a) + haEval f := by + let W := padicCompletedUnramifiedWittRing p + let S := (padicCompletedLevelCompleteDVF p n).valuationSubring + simp only [padicCompletedLevelPowerSeriesEval, + PowerSeries.coe_eval₂Hom] + change PowerSeries.eval₂ (algebraMap W S) x + (PowerSeries.subst a f) = + PowerSeries.eval₂ (algebraMap W S) + (PowerSeries.eval₂ (algebraMap W S) x a) f + simpa only [PowerSeries.eval₂, PowerSeries.subst, + Function.const_apply] using + (MvPowerSeries.eval₂_subst + (R := W) (S := W) (T := S) + (a := fun _ : Unit ↦ a) ha.const + (PowerSeries.hasEval hx) f) + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveAction.lean new file mode 100644 index 0000000000..b12e097a32 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveAction.lean @@ -0,0 +1,766 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveIrreducible +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.Core +public import Mathlib.SetTheory.Cardinal.Finite +/-! +# Primitive unit action on a completed p-adic Lubin--Tate level + +The completed level is defined as the splitting field of the standard +primitive Lubin--Tate polynomial over the completed maximal-unramified +field. This file identifies all of its roots with the genuine finite +unit-parameter quotient of the original p-adic field. + +The construction first embeds the ordinary standard Lubin--Tate level into +the completed splitting field by sending its canonical primitive generator +to the chosen completed root. The already constructed finite-level +unit-parameter automorphisms then give every completed root. Comparing +cardinalities proves that these are all the roots, and hence that each one +generates the completed splitting field. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial PowerSeries + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp + +/-- The maximal ideal supplies the adic topology on the completed primitive-action target. -/ +noncomputable local instance + padicCompletedActionTargetWithIdeal + (p : ℕ) [Fact p.Prime] (n : ℕ) : + WithIdeal + (padicCompletedLevelCompleteDVF p n).valuationSubring where + i := (padicCompletedLevelCompleteDVF p n).maximalIdeal + +private noncomputable local instance + padicCompletedActionTargetCompleteSpace + (p : ℕ) [Fact p.Prime] (n : ℕ) : + CompleteSpace + (padicCompletedLevelCompleteDVF p n).valuationSubring := by + let target := padicCompletedLevelCompleteDVF p n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).1 + +private noncomputable local instance + padicCompletedActionTargetT2Space + (p : ℕ) [Fact p.Prime] (n : ℕ) : + T2Space + (padicCompletedLevelCompleteDVF p n).valuationSubring := by + let target := padicCompletedLevelCompleteDVF p n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).2 + +/-- The chosen completed primitive root annihilates the original standard +primitive polynomial over `ℚ_[p]`. -/ +theorem padicCompletedPrimitiveRoot_aeval_standardPrimitivePolynomial + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Polynomial.aeval (padicCompletedPrimitiveRoot p n) + (standardLubinTatePrimitivePolynomialOverField + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) n) = + 0 := by + have hroot := padicCompletedPrimitiveRoot_isRoot p n + simpa [Polynomial.IsRoot, padicCompletedPrimitivePolynomial, + standardLubinTatePrimitivePolynomialOverField, + Polynomial.aeval_def, Polynomial.eval_map, Polynomial.eval₂_map, + IsScalarTower.algebraMap_eq ℚ_[p] + (padicCompletedUnramifiedField p) (padicCompletedLevelField p n), + padicCompletedLevelPadicFieldCoefficientHom] using hroot + +/-- The ordinary standard Lubin--Tate level embeds into the completed +splitting field by sending its canonical generator to the chosen completed +root. -/ +noncomputable def padicStandardLevelEmbedding + (p : ℕ) [Fact p.Prime] (n : ℕ) : + let hπ := + padicMultiplicativeLubinTateSeries_isUniformizer p + standardLubinTateLevelField hπ n →ₐ[ℚ_[p]] + padicCompletedLevelField p n := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + exact + (standardLubinTateLevelPowerBasis hπ n).lift + (padicCompletedPrimitiveRoot p n) (by + exact (congrArg + (fun f : Polynomial ℚ_[p] => + Polynomial.aeval (padicCompletedPrimitiveRoot p n) f) + (standardLubinTateLevelPowerBasis_minpoly + (F := padicLocalField p) + (π := padicIntEquivValuationSubring p (p : ℤ_[p])) hπ n)).trans + (padicCompletedPrimitiveRoot_aeval_standardPrimitivePolynomial p n)) + +/-- The standard-level embedding has the prescribed value on the canonical +primitive generator. -/ +@[simp] +theorem padicStandardLevelEmbedding_apply_gen + (p : ℕ) [Fact p.Prime] (n : ℕ) : + let hπ := + padicMultiplicativeLubinTateSeries_isUniformizer p + padicStandardLevelEmbedding p n + (standardLubinTateLevelPowerBasis hπ n).gen = + padicCompletedPrimitiveRoot p n := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + simp only [padicStandardLevelEmbedding, PowerBasis.lift_gen] + +/-- A finite unit parameter, realized as a root in the completed splitting +field. -/ +noncomputable def padicCompletedUnitParameterRoot + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : standardLubinTateUnitParameter (padicLocalField p) n) : + padicCompletedLevelField p n := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + exact + padicStandardLevelEmbedding p n + (standardLubinTateUnitParameterLevelRoot + (padicLocalField p) hπ n a) + +/-- The identity unit parameter gives the chosen completed primitive root. -/ +@[simp] +theorem padicCompletedUnitParameterRoot_one + (p : ℕ) [Fact p.Prime] (n : ℕ) : + padicCompletedUnitParameterRoot p n 1 = + padicCompletedPrimitiveRoot p n := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + exact (congrArg (padicStandardLevelEmbedding p n) + (standardLubinTateUnitParameterLevelRoot_one (padicLocalField p) + (π := padicIntEquivValuationSubring p (p : ℤ_[p])) hπ n)).trans + (padicStandardLevelEmbedding_apply_gen p n) + +/-- Distinct finite unit parameters give distinct roots in the completed +level. -/ +theorem padicCompletedUnitParameterRoot_injective + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Function.Injective (padicCompletedUnitParameterRoot p n) := by + intro a b hab + apply + standardLubinTateUnitParameterLevelRoot_injective + (padicLocalField p) + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + exact (padicStandardLevelEmbedding p n).injective hab + +/-- A completed parameter root annihilates the original primitive +polynomial over `ℚ_[p]`. -/ +theorem padicCompletedUnitParameterRoot_aeval_standardPrimitivePolynomial + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : standardLubinTateUnitParameter (padicLocalField p) n) : + Polynomial.aeval (padicCompletedUnitParameterRoot p n a) + (standardLubinTatePrimitivePolynomialOverField + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) n) = + 0 := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + have hlevel := + standardLubinTateUnitParameterLevelRoot_aeval_minpoly + (padicLocalField p) hπ n a + have hpoly := congrArg + (fun f : Polynomial ℚ_[p] => Polynomial.aeval + (standardLubinTateUnitParameterLevelRoot (padicLocalField p) hπ n a) f) + (standardLubinTateLevelPowerBasis_minpoly + (F := padicLocalField p) + (π := padicIntEquivValuationSubring p (p : ℤ_[p])) hπ n) + have hmap := congrArg (padicStandardLevelEmbedding p n) (hpoly.symm.trans hlevel) + simpa only [map_zero, Polynomial.aeval_algHom_apply, + padicCompletedUnitParameterRoot] using hmap + +/-- Every completed finite-parameter point is a root of the genuine +completed primitive polynomial. -/ +theorem padicCompletedUnitParameterRoot_isRoot + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : standardLubinTateUnitParameter (padicLocalField p) n) : + ((padicCompletedPrimitivePolynomial p n).map + (algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n))).IsRoot + (padicCompletedUnitParameterRoot p n a) := by + have hroot := + padicCompletedUnitParameterRoot_aeval_standardPrimitivePolynomial + p n a + simpa [Polynomial.IsRoot, padicCompletedPrimitivePolynomial, + standardLubinTatePrimitivePolynomialOverField, + Polynomial.aeval_def, Polynomial.eval_map, Polynomial.eval₂_map, + IsScalarTower.algebraMap_eq ℚ_[p] + (padicCompletedUnramifiedField p) (padicCompletedLevelField p n), + padicCompletedLevelPadicFieldCoefficientHom] using hroot + +private theorem + padicCompletedStandardScalarEndomorphismValue_congr_point + (p : ℕ) [Fact p.Prime] (n : ℕ) + {x y : (padicCompletedLevelCompleteDVF p n).valuationSubring} + (hx : PowerSeries.HasEval x) (hy : PowerSeries.HasEval y) + (hxy : x = y) (a : (padicLocalField p).valuationSubring) : + padicCompletedStandardScalarEndomorphismValue p n x hx a = + padicCompletedStandardScalarEndomorphismValue p n y hy a := by + subst y + rfl + +/-- The direct completed standard Lubin--Tate action of a p-adic unit on +the chosen integral primitive point. -/ +noncomputable def padicCompletedStandardPrimitivePointUnitAction + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + (padicCompletedLevelCompleteDVF p n).valuationSubring := + padicCompletedStandardScalarEndomorphismValue p n + (padicCompletedPrimitiveRootInteger p n) + (padicCompletedPrimitiveRootInteger_hasEval p n) + (u : (padicLocalField p).valuationSubring) + +/-- A direct completed standard unit translate remains a convergent +evaluation point. -/ +theorem padicCompletedStandardPrimitivePointUnitAction_hasEval + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + PowerSeries.HasEval + (padicCompletedStandardPrimitivePointUnitAction p n u) := + padicCompletedStandardScalarEndomorphismValue_hasEval p n + (padicCompletedPrimitiveRootInteger p n) + (padicCompletedPrimitiveRootInteger_hasEval p n) + (u : (padicLocalField p).valuationSubring) + +/-- The identity unit fixes the chosen completed standard primitive point. -/ +@[simp] +theorem padicCompletedStandardPrimitivePointUnitAction_one + (p : ℕ) [Fact p.Prime] (n : ℕ) : + padicCompletedStandardPrimitivePointUnitAction p n 1 = + padicCompletedPrimitiveRootInteger p n := by + simp [padicCompletedStandardPrimitivePointUnitAction] + +/-- A direct completed standard unit translate is killed at level +`n + 1`. -/ +theorem + padicCompletedStandardPrimitivePointUnitAction_iterate_succ_eq_zero + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) + (padicCompletedStandardPrimitivePointUnitAction p n u) + (standardLubinTatePolynomialIterate + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) (n + 1)) = + 0 := by + let π : (padicLocalField p).valuationSubring := + padicIntEquivValuationSubring p (p : ℤ_[p]) + let x := padicCompletedPrimitiveRootInteger p n + let hx := padicCompletedPrimitiveRootInteger_hasEval p n + let y := padicCompletedStandardPrimitivePointUnitAction p n u + let hy := padicCompletedStandardPrimitivePointUnitAction_hasEval p n u + have hkill : + padicCompletedStandardScalarEndomorphismValue p n x hx + (π ^ (n + 1)) = + 0 := by + exact + (padicCompletedStandardScalarEndomorphismValue_uniformizer_pow + p n x hx (n + 1)).trans (by + simpa only [x] using + padicCompletedPrimitiveRootInteger_iterate_succ_eq_zero p n) + rw [← padicCompletedStandardScalarEndomorphismValue_uniformizer_pow + p n y hy (n + 1)] + calc + padicCompletedStandardScalarEndomorphismValue p n y hy + (π ^ (n + 1)) = + padicCompletedStandardScalarEndomorphismValue p n x hx + (π ^ (n + 1) * + (u : (padicLocalField p).valuationSubring)) := by + simpa only [y, + padicCompletedStandardPrimitivePointUnitAction] using + (padicCompletedStandardScalarEndomorphismValue_mul + p n x hx (π ^ (n + 1)) + (u : (padicLocalField p).valuationSubring)).symm + _ = + padicCompletedStandardScalarEndomorphismValue p n x hx + ((u : (padicLocalField p).valuationSubring) * + π ^ (n + 1)) := by + rw [mul_comm] + _ = + padicCompletedStandardScalarEndomorphismValue p n + (padicCompletedStandardScalarEndomorphismValue p n x hx + (π ^ (n + 1))) + (padicCompletedStandardScalarEndomorphismValue_hasEval + p n x hx (π ^ (n + 1))) + (u : (padicLocalField p).valuationSubring) := + padicCompletedStandardScalarEndomorphismValue_mul + p n x hx (u : (padicLocalField p).valuationSubring) + (π ^ (n + 1)) + _ = + padicCompletedStandardScalarEndomorphismValue p n + 0 PowerSeries.HasEval.zero + (u : (padicLocalField p).valuationSubring) := by + exact + padicCompletedStandardScalarEndomorphismValue_congr_point + p n + (padicCompletedStandardScalarEndomorphismValue_hasEval + p n x hx (π ^ (n + 1))) + PowerSeries.HasEval.zero hkill + (u : (padicLocalField p).valuationSubring) + _ = 0 := + padicCompletedStandardScalarEndomorphismValue_zero p n + (u : (padicLocalField p).valuationSubring) + +/-- A direct completed standard unit translate is not killed one level +early. -/ +theorem + padicCompletedStandardPrimitivePointUnitAction_iterate_ne_zero + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) + (padicCompletedStandardPrimitivePointUnitAction p n u) + (standardLubinTatePolynomialIterate + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) n) ≠ + 0 := by + let π : (padicLocalField p).valuationSubring := + padicIntEquivValuationSubring p (p : ℤ_[p]) + let x := padicCompletedPrimitiveRootInteger p n + let hx := padicCompletedPrimitiveRootInteger_hasEval p n + let y := padicCompletedStandardPrimitivePointUnitAction p n u + let hy := padicCompletedStandardPrimitivePointUnitAction_hasEval p n u + intro hyzero + have hyEvalZero : + padicCompletedStandardScalarEndomorphismValue p n y hy (π ^ n) = + 0 := by + exact + (padicCompletedStandardScalarEndomorphismValue_uniformizer_pow + p n y hy n).trans (by + simpa only [y] using hyzero) + let z := + padicCompletedStandardScalarEndomorphismValue p n x hx (π ^ n) + let hz : PowerSeries.HasEval z := + padicCompletedStandardScalarEndomorphismValue_hasEval + p n x hx (π ^ n) + have huzero : + padicCompletedStandardScalarEndomorphismValue p n z hz + (u : (padicLocalField p).valuationSubring) = + 0 := by + calc + _ = + padicCompletedStandardScalarEndomorphismValue p n x hx + ((u : (padicLocalField p).valuationSubring) * π ^ n) := by + simpa only [z] using + (padicCompletedStandardScalarEndomorphismValue_mul + p n x hx (u : (padicLocalField p).valuationSubring) + (π ^ n)).symm + _ = + padicCompletedStandardScalarEndomorphismValue p n x hx + (π ^ n * (u : (padicLocalField p).valuationSubring)) := by + rw [mul_comm] + _ = + padicCompletedStandardScalarEndomorphismValue p n y hy + (π ^ n) := by + simpa only [y, + padicCompletedStandardPrimitivePointUnitAction] using + padicCompletedStandardScalarEndomorphismValue_mul + p n x hx (π ^ n) + (u : (padicLocalField p).valuationSubring) + _ = 0 := hyEvalZero + have hzzero : z = 0 := by + apply + padicCompletedStandardScalarEndomorphismValue_unit_injective + p n u hz PowerSeries.HasEval.zero + rw [huzero, + padicCompletedStandardScalarEndomorphismValue_zero] + apply padicCompletedPrimitiveRootInteger_iterate_ne_zero p n + rw [← padicCompletedStandardScalarEndomorphismValue_uniformizer_pow + p n x hx n] + exact hzzero + +/-- The direct completed standard action of every p-adic unit is a root of +the genuine completed primitive polynomial. -/ +theorem padicCompletedStandardPrimitivePointUnitAction_isRoot + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + ((padicCompletedPrimitivePolynomial p n).map + (algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n))).IsRoot + ((padicCompletedStandardPrimitivePointUnitAction p n u : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) := by + let F := padicLocalField p + let π : F.valuationSubring := + padicIntEquivValuationSubring p (p : ℤ_[p]) + let y := padicCompletedStandardPrimitivePointUnitAction p n u + have hsucc := + padicCompletedStandardPrimitivePointUnitAction_iterate_succ_eq_zero + p n u + have hn := + padicCompletedStandardPrimitivePointUnitAction_iterate_ne_zero + p n u + have hfactor := + congrArg + (Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) y) + (standardLubinTatePolynomialIterate_succ_factor F π n) + rw [hsucc, Polynomial.eval₂_mul] at hfactor + have hprimitive : + Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) y + (standardLubinTatePrimitivePolynomial F π n) = + 0 := + (mul_eq_zero.mp hfactor.symm).resolve_left hn + have hcoe := congrArg + (fun z : (padicCompletedLevelCompleteDVF p n).valuationSubring => + (z : padicCompletedLevelField p n)) hprimitive + change + ((Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) y + (standardLubinTatePrimitivePolynomial F π n) : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) = + 0 at hcoe + rw [padicCompletedLevelPadicIntegerPolynomialEval_coe] at hcoe + simpa [Polynomial.IsRoot, padicCompletedPrimitivePolynomial, + standardLubinTatePrimitivePolynomialOverField, + Polynomial.eval_map, Polynomial.eval₂_map, + padicCompletedLevelPadicFieldCoefficientHom, F, π, y] using hcoe + +/-- A finite unit parameter, regarded as an element of the full root set in +the completed splitting field. -/ +noncomputable def padicCompletedUnitParameterRootSet + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : standardLubinTateUnitParameter (padicLocalField p) n) : + (padicCompletedPrimitivePolynomial p n).rootSet + (padicCompletedLevelField p n) := + ⟨padicCompletedUnitParameterRoot p n a, + Polynomial.mem_rootSet.mpr + ⟨(padicCompletedPrimitivePolynomial_monic p n).ne_zero, + by + rw [Polynomial.aeval_def, ← Polynomial.eval_map] + exact padicCompletedUnitParameterRoot_isRoot p n a⟩⟩ + +/-- The root-set realization of finite unit parameters is injective. -/ +theorem padicCompletedUnitParameterRootSet_injective + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Function.Injective (padicCompletedUnitParameterRootSet p n) := by + intro a b hab + apply padicCompletedUnitParameterRoot_injective p n + exact congrArg Subtype.val hab + +/-- The completed primitive polynomial has exactly its degree many roots in +the completed splitting field. -/ +theorem padicCompletedPrimitiveRootSet_natCard + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Nat.card + ((padicCompletedPrimitivePolynomial p n).rootSet + (padicCompletedLevelField p n)) = + (p - 1) * p ^ n := by + rw [Nat.card_eq_fintype_card, + Polynomial.card_rootSet_eq_natDegree + (padicCompletedPrimitivePolynomial_separable p n) + (padicCompletedPrimitivePolynomial_splits p n), + padicCompletedPrimitivePolynomial_natDegree] + +/-- The finite p-adic unit-parameter quotient has the degree of the +completed primitive polynomial. -/ +theorem padicStandardUnitParameter_natCard + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Nat.card (standardLubinTateUnitParameter (padicLocalField p) n) = + (p - 1) * p ^ n := by + have hcard : + Nat.card (padicLocalField p).residueField = p := by + simpa [padicLocalField] using + padicCompleteDVF_residueField_card p + rw [standardLubinTateUnitParameter_natCard, hcard] + +/-- Finite p-adic unit parameters enumerate every root of the completed +primitive polynomial. -/ +theorem padicCompletedUnitParameterRootSet_bijective + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Function.Bijective (padicCompletedUnitParameterRootSet p n) := by + apply + (Nat.bijective_iff_injective_and_card + (padicCompletedUnitParameterRootSet p n)).mpr + exact + ⟨padicCompletedUnitParameterRootSet_injective p n, + (padicStandardUnitParameter_natCard p n).trans + (padicCompletedPrimitiveRootSet_natCard p n).symm⟩ + +/-- A parameter root is itself a power-basis generator of the ordinary +standard level. -/ +noncomputable def padicStandardLevelUnitParameterPowerBasis + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : standardLubinTateUnitParameter (padicLocalField p) n) : + let hπ := + padicMultiplicativeLubinTateSeries_isUniformizer p + PowerBasis ℚ_[p] (standardLubinTateLevelField hπ n) := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + exact + (standardLubinTateLevelPowerBasis hπ n).map + (standardLubinTateUnitParameterAlgEquiv + (padicLocalField p) hπ n a) + +/-- The generator of the parameter power basis is the corresponding +finite-level parameter root. -/ +@[simp] +theorem padicStandardLevelUnitParameterPowerBasis_gen + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : standardLubinTateUnitParameter (padicLocalField p) n) : + let hπ := + padicMultiplicativeLubinTateSeries_isUniformizer p + (padicStandardLevelUnitParameterPowerBasis p n a).gen = + standardLubinTateUnitParameterLevelRoot + (padicLocalField p) hπ n a := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + simp only [padicStandardLevelUnitParameterPowerBasis, + PowerBasis.map_gen] + exact standardLubinTateUnitParameterAlgEquiv_apply_gen + (padicLocalField p) + (π := padicIntEquivValuationSubring p (p : ℤ_[p])) hπ n a + +private theorem padicPolynomialAeval_mem_completedUnramifiedAdjoin + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : padicCompletedLevelField p n) (f : Polynomial ℚ_[p]) : + Polynomial.aeval x f ∈ + Algebra.adjoin (padicCompletedUnramifiedField p) + ({x} : Set (padicCompletedLevelField p n)) := by + let g := + f.map (algebraMap ℚ_[p] (padicCompletedUnramifiedField p)) + have hmem := + g.aeval_mem_adjoin_singleton (padicCompletedUnramifiedField p) x + simpa only [Polynomial.aeval_def, Polynomial.eval₂_map, + IsScalarTower.algebraMap_eq ℚ_[p] + (padicCompletedUnramifiedField p) (padicCompletedLevelField p n), + g] + using hmem + +/-- Every completed parameter root is a polynomial expression in any other +completed parameter root, with coefficients in the completed-unramified +base. -/ +theorem padicCompletedUnitParameterRoot_mem_adjoin + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a b : standardLubinTateUnitParameter (padicLocalField p) n) : + padicCompletedUnitParameterRoot p n b ∈ + Algebra.adjoin (padicCompletedUnramifiedField p) + ({padicCompletedUnitParameterRoot p n a} : + Set (padicCompletedLevelField p n)) := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let pb := padicStandardLevelUnitParameterPowerBasis p n a + let z := + standardLubinTateUnitParameterLevelRoot + (padicLocalField p) hπ n b + let S : Subalgebra (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) := + Algebra.adjoin (padicCompletedUnramifiedField p) + ({padicCompletedUnitParameterRoot p n a} : + Set (padicCompletedLevelField p n)) + obtain ⟨f, hf⟩ := pb.exists_eq_aeval' z + have hgen : + padicStandardLevelEmbedding p n pb.gen = + padicCompletedUnitParameterRoot p n a := by + rw [padicStandardLevelUnitParameterPowerBasis_gen] + rfl + have hzimage : + padicStandardLevelEmbedding p n z = + Polynomial.aeval (padicCompletedUnitParameterRoot p n a) f := by + calc + padicStandardLevelEmbedding p n z = + padicStandardLevelEmbedding p n + (Polynomial.aeval pb.gen f) := + congrArg (padicStandardLevelEmbedding p n) hf + _ = Polynomial.aeval + (padicStandardLevelEmbedding p n pb.gen) f := + (Polynomial.aeval_algHom_apply + (padicStandardLevelEmbedding p n) pb.gen f).symm + _ = Polynomial.aeval + (padicCompletedUnitParameterRoot p n a) f := by + rw [hgen] + change padicStandardLevelEmbedding p n z ∈ S + rw [hzimage] + exact + padicPolynomialAeval_mem_completedUnramifiedAdjoin + p n (padicCompletedUnitParameterRoot p n a) f + +/-- All roots of the completed primitive polynomial lie in the field +generated by any chosen parameter root. -/ +theorem padicCompletedPrimitiveRootSet_subset_adjoin_parameter + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : standardLubinTateUnitParameter (padicLocalField p) n) : + ((padicCompletedPrimitivePolynomial p n).rootSet + (padicCompletedLevelField p n) : + Set (padicCompletedLevelField p n)) ⊆ + Algebra.adjoin (padicCompletedUnramifiedField p) + ({padicCompletedUnitParameterRoot p n a} : + Set (padicCompletedLevelField p n)) := by + intro y hy + let yroot : + (padicCompletedPrimitivePolynomial p n).rootSet + (padicCompletedLevelField p n) := + ⟨y, hy⟩ + obtain ⟨b, hb⟩ := + (padicCompletedUnitParameterRootSet_bijective p n).surjective yroot + have hby : + padicCompletedUnitParameterRoot p n b = y := + congrArg Subtype.val hb + rw [← hby] + exact padicCompletedUnitParameterRoot_mem_adjoin p n a b + +/-- Every completed parameter root generates the completed splitting field +over the completed maximal-unramified base. -/ +theorem padicCompletedUnitParameterRoot_adjoin_eq_top + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : standardLubinTateUnitParameter (padicLocalField p) n) : + Algebra.adjoin (padicCompletedUnramifiedField p) + ({padicCompletedUnitParameterRoot p n a} : + Set (padicCompletedLevelField p n)) = + ⊤ := by + have hall : + Algebra.adjoin (padicCompletedUnramifiedField p) + ((padicCompletedPrimitivePolynomial p n).rootSet + (padicCompletedLevelField p n) : + Set (padicCompletedLevelField p n)) ≤ + Algebra.adjoin (padicCompletedUnramifiedField p) + ({padicCompletedUnitParameterRoot p n a} : + Set (padicCompletedLevelField p n)) := + Algebra.adjoin_le + (padicCompletedPrimitiveRootSet_subset_adjoin_parameter p n a) + rw [padicCompletedPrimitivePolynomial_adjoin_rootSet] at hall + exact top_unique hall + +/-- Every direct completed standard unit translate generates the completed +splitting field over the completed maximal-unramified base. -/ +theorem + padicCompletedStandardPrimitivePointUnitAction_adjoin_eq_top + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + Algebra.adjoin (padicCompletedUnramifiedField p) + ({((padicCompletedStandardPrimitivePointUnitAction p n u : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n)} : + Set (padicCompletedLevelField p n)) = + ⊤ := by + let y : padicCompletedLevelField p n := + ((padicCompletedStandardPrimitivePointUnitAction p n u : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) + let yroot : + (padicCompletedPrimitivePolynomial p n).rootSet + (padicCompletedLevelField p n) := + ⟨y, Polynomial.mem_rootSet.mpr + ⟨(padicCompletedPrimitivePolynomial_monic p n).ne_zero, + by + rw [Polynomial.aeval_def, ← Polynomial.eval_map] + exact + padicCompletedStandardPrimitivePointUnitAction_isRoot + p n u⟩⟩ + obtain ⟨a, ha⟩ := + (padicCompletedUnitParameterRootSet_bijective p n).surjective yroot + have hay : + padicCompletedUnitParameterRoot p n a = y := + congrArg Subtype.val ha + change + Algebra.adjoin (padicCompletedUnramifiedField p) + ({y} : Set (padicCompletedLevelField p n)) = + ⊤ + rw [← hay] + exact padicCompletedUnitParameterRoot_adjoin_eq_top p n a + +/-- The chosen completed primitive root generates the completed splitting +field. -/ +theorem padicCompletedPrimitiveRoot_adjoin_eq_top + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Algebra.adjoin (padicCompletedUnramifiedField p) + ({padicCompletedPrimitiveRoot p n} : + Set (padicCompletedLevelField p n)) = + ⊤ := by + simpa using + (padicCompletedUnitParameterRoot_adjoin_eq_top p n + (1 : standardLubinTateUnitParameter (padicLocalField p) n)) + +/-- The completed primitive polynomial is the minimal polynomial of the +chosen completed root. -/ +theorem padicCompletedPrimitiveRoot_minpoly + (p : ℕ) [Fact p.Prime] (n : ℕ) : + minpoly (padicCompletedUnramifiedField p) + (padicCompletedPrimitiveRoot p n) = + padicCompletedPrimitivePolynomial p n := by + have hroot : + Polynomial.aeval (padicCompletedPrimitiveRoot p n) + (padicCompletedPrimitivePolynomial p n) = 0 := by + rw [Polynomial.aeval_def, ← Polynomial.eval_map] + exact padicCompletedPrimitiveRoot_isRoot p n + have hmin := + minpoly.eq_of_irreducible + (padicCompletedPrimitivePolynomial_irreducible p n) hroot + rw [(padicCompletedPrimitivePolynomial_monic p n).leadingCoeff, + inv_one, Polynomial.C_1, mul_one] at hmin + exact hmin.symm + +/-- The chosen primitive root is integral over the completed-unramified +field. -/ +theorem padicCompletedPrimitiveRoot_isIntegral_over_completedUnramified + (p : ℕ) [Fact p.Prime] (n : ℕ) : + IsIntegral (padicCompletedUnramifiedField p) + (padicCompletedPrimitiveRoot p n) := by + refine + ⟨padicCompletedPrimitivePolynomial p n, + padicCompletedPrimitivePolynomial_monic p n, ?_⟩ + have hroot := padicCompletedPrimitiveRoot_isRoot p n + simpa [Polynomial.IsRoot, Polynomial.aeval_def, + Polynomial.eval_map, Polynomial.eval₂_map] using hroot + +/-- The power basis of the completed level generated by the chosen +primitive root. -/ +noncomputable def padicCompletedPrimitivePowerBasis + (p : ℕ) [Fact p.Prime] (n : ℕ) : + PowerBasis (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) := + PowerBasis.ofAdjoinEqTop + (padicCompletedPrimitiveRoot_isIntegral_over_completedUnramified p n) + (padicCompletedPrimitiveRoot_adjoin_eq_top p n) + +/-- The generator of the completed primitive power basis is the chosen +completed root. -/ +@[simp] +theorem padicCompletedPrimitivePowerBasis_gen + (p : ℕ) [Fact p.Prime] (n : ℕ) : + (padicCompletedPrimitivePowerBasis p n).gen = + padicCompletedPrimitiveRoot p n := + PowerBasis.ofAdjoinEqTop_gen _ _ + +/-- Every parameter root is integral over the completed-unramified base. -/ +theorem padicCompletedUnitParameterRoot_isIntegral + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : standardLubinTateUnitParameter (padicLocalField p) n) : + IsIntegral (padicCompletedUnramifiedField p) + (padicCompletedUnitParameterRoot p n a) := by + refine + ⟨padicCompletedPrimitivePolynomial p n, + padicCompletedPrimitivePolynomial_monic p n, ?_⟩ + have hroot := padicCompletedUnitParameterRoot_isRoot p n a + simpa [Polynomial.IsRoot, Polynomial.aeval_def, + Polynomial.eval_map, Polynomial.eval₂_map] using hroot + +/-- The power basis of the completed level generated by a prescribed finite +unit parameter. -/ +noncomputable def padicCompletedUnitParameterPowerBasis + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : standardLubinTateUnitParameter (padicLocalField p) n) : + PowerBasis (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) := + PowerBasis.ofAdjoinEqTop + (padicCompletedUnitParameterRoot_isIntegral p n a) + (padicCompletedUnitParameterRoot_adjoin_eq_top p n a) + +/-- The generator of a completed unit-parameter power basis is the +corresponding completed root. -/ +@[simp] +theorem padicCompletedUnitParameterPowerBasis_gen + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : standardLubinTateUnitParameter (padicLocalField p) n) : + (padicCompletedUnitParameterPowerBasis p n a).gen = + padicCompletedUnitParameterRoot p n a := + PowerBasis.ofAdjoinEqTop_gen _ _ + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveIrreducible.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveIrreducible.lean new file mode 100644 index 0000000000..701dc46e2e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveIrreducible.lean @@ -0,0 +1,155 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedLevel +public import Mathlib.RingTheory.Polynomial.Eisenstein.Basic +/-! +# Irreducibility of the completed p-adic primitive polynomial + +The standard multiplicative Lubin--Tate primitive polynomial remains +Eisenstein after extending its integer coefficients to the valuation ring of +the completed maximal unramified field. In particular it remains +irreducible over the completed-unramified fraction field. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open ValuationTheory.DiscreteValuationField + +/-- The image of the canonical p-adic uniformizer is a uniformizer of the +completed-unramified coefficient field. -/ +theorem padicCompletedUnramifiedIntegerMap_isUniformizer + (p : ℕ) [Fact p.Prime] : + let π := + padicIntEquivValuationSubring p (p : ℤ_[p]) + (padicCompletedUnramifiedCompleteDVF p).valuation.IsUniformizer + ((padicCompletedUnramifiedIntegerMap p π : + (padicCompletedUnramifiedCompleteDVF p).valuationSubring) : + padicCompletedUnramifiedField p) := by + let F := padicLocalField p + let base := F.toCompleteDVF + let target := padicCompletedUnramifiedCompleteDVF p + let π : (padicLocalField p).valuationSubring := + padicIntEquivValuationSubring p (p : ℤ_[p]) + let πE : target.valuationSubring := + padicCompletedUnramifiedIntegerMap p π + have hπ : base.valuation.IsUniformizer (π : ℚ_[p]) := by + simpa only [F, base, π] using + padicMultiplicativeLubinTateSeries_isUniformizer p + obtain ⟨ϖ, hϖ⟩ := target.exists_uniformizer + apply hϖ.of_associated + rw [← Ideal.span_singleton_eq_span_singleton] + calc + Ideal.span ({ϖ} : Set target.valuationSubring) = + target.maximalIdeal := + (target.maximalIdeal_eq_span_uniformizer hϖ).symm + _ = + Ideal.map (padicCompletedUnramifiedIntegerMap p) + base.maximalIdeal := by + simpa only [F, base, target] using + (padicCompletedUnramifiedIntegerMap_map_maximalIdeal p).symm + _ = + Ideal.map (padicCompletedUnramifiedIntegerMap p) + (Ideal.span + ({π} : Set (padicLocalField p).valuationSubring)) := by + exact congrArg (Ideal.map (padicCompletedUnramifiedIntegerMap p)) + (base.maximalIdeal_eq_span_uniformizer hπ) + _ = Ideal.span ({πE} : Set target.valuationSubring) := by + rw [Ideal.map_span, Set.image_singleton] + +/-- The completed integral primitive polynomial has the same positive degree +as the original finite multiplicative Lubin--Tate polynomial. -/ +theorem padicCompletedPrimitivePolynomialInteger_natDegree + (p : ℕ) [Fact p.Prime] (n : ℕ) : + (padicCompletedPrimitivePolynomialInteger p n).natDegree = + (p - 1) * p ^ n := by + exact ((padicCompletedPrimitivePolynomialInteger_monic p n).natDegree_map + (algebraMap + (padicCompletedUnramifiedCompleteDVF p).valuationSubring + (padicCompletedUnramifiedField p))).symm.trans + ((congrArg Polynomial.natDegree + (padicCompletedPrimitivePolynomialInteger_map p n)).trans + (padicCompletedPrimitivePolynomial_natDegree p n)) + +/-- The completed integral primitive polynomial is genuinely Eisenstein at +the maximal ideal of the completed-unramified valuation ring. -/ +theorem padicCompletedPrimitivePolynomialInteger_isEisensteinAt + (p : ℕ) [Fact p.Prime] (n : ℕ) : + (padicCompletedPrimitivePolynomialInteger p n).IsEisensteinAt + (padicCompletedUnramifiedCompleteDVF p).maximalIdeal := by + let target := padicCompletedUnramifiedCompleteDVF p + let π : (padicLocalField p).valuationSubring := + padicIntEquivValuationSubring p (p : ℤ_[p]) + let πE : target.valuationSubring := + padicCompletedUnramifiedIntegerMap p π + have hmonic : + (padicCompletedPrimitivePolynomialInteger p n).Monic := + padicCompletedPrimitivePolynomialInteger_monic p n + refine hmonic.isEisensteinAt_of_mem_of_notMem + (IsLocalRing.maximalIdeal.isMaximal target.valuationSubring).ne_top + ?_ ?_ + · intro i hi + exact + (padicCompletedPrimitivePolynomialInteger_isWeaklyEisensteinAt + p n).mem hi + · have hπE : + target.valuation.IsUniformizer + (πE : padicCompletedUnramifiedField p) := by + simpa only [target, π, πE] using + padicCompletedUnramifiedIntegerMap_isUniformizer p + have hnotMem : + πE ∉ target.maximalIdeal ^ 2 := + target.uniformizer_not_mem_maximalIdeal_sq hπE + change ((standardLubinTatePrimitivePolynomial (padicLocalField p) π n).map + (padicCompletedUnramifiedIntegerMap p)).coeff 0 ∉ target.maximalIdeal ^ 2 + rw [Polynomial.coeff_map, standardLubinTatePrimitivePolynomial_coeff_zero] + exact hnotMem + +/-- The completed integral primitive polynomial is irreducible in the +completed-unramified valuation ring. -/ +theorem padicCompletedPrimitivePolynomialInteger_irreducible + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Irreducible (padicCompletedPrimitivePolynomialInteger p n) := by + apply + (padicCompletedPrimitivePolynomialInteger_isEisensteinAt p n).irreducible + (IsLocalRing.maximalIdeal.isMaximal + (padicCompletedUnramifiedCompleteDVF p).valuationSubring).isPrime + (padicCompletedPrimitivePolynomialInteger_monic p n).isPrimitive + rw [padicCompletedPrimitivePolynomialInteger_natDegree] + exact Nat.mul_pos + (Nat.sub_pos_of_lt (Fact.out : p.Prime).one_lt) + (Nat.pow_pos (Fact.out : p.Prime).pos) + +/-- The primitive polynomial remains irreducible over the completed maximal +unramified p-adic field. -/ +theorem padicCompletedPrimitivePolynomial_irreducible + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Irreducible (padicCompletedPrimitivePolynomial p n) := by + have hmap : + Irreducible + ((padicCompletedPrimitivePolynomialInteger p n).map + (algebraMap + (padicCompletedUnramifiedCompleteDVF p).valuationSubring + (padicCompletedUnramifiedField p))) := + (Polynomial.Monic.irreducible_iff_irreducible_map_fraction_map + (padicCompletedPrimitivePolynomialInteger_monic p n)).mp + (padicCompletedPrimitivePolynomialInteger_irreducible p n) + rwa [padicCompletedPrimitivePolynomialInteger_map] at hmap + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveUniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveUniformizer.lean new file mode 100644 index 0000000000..08f5fe88e8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveUniformizer.lean @@ -0,0 +1,645 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerPrimitive +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal +/-! +# The completed p-adic primitive point is a uniformizer + +The primitive multiplicative Lubin--Tate polynomial remains Eisenstein over +the completed-unramified valuation ring. This file uses that actual +Eisenstein equation and the fundamental ramification identity to prove that +the chosen completed primitive point has normalized additive valuation one. +Consequently it is a genuine uniformizer of the completed level. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial Topology + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.ValuedExtension +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +private noncomputable local instance + padicCompletedPrimitiveUniformizerTargetWithIdeal + (p : ℕ) [Fact p.Prime] (n : ℕ) : + WithIdeal + (padicCompletedLevelCompleteDVF p n).valuationSubring where + i := (padicCompletedLevelCompleteDVF p n).maximalIdeal + +private noncomputable local instance + padicCompletedPrimitiveUniformizerTargetCompleteSpace + (p : ℕ) [Fact p.Prime] (n : ℕ) : + CompleteSpace + (padicCompletedLevelCompleteDVF p n).valuationSubring := by + let target := padicCompletedLevelCompleteDVF p n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).1 + +private noncomputable local instance + padicCompletedPrimitiveUniformizerTargetT2Space + (p : ℕ) [Fact p.Prime] (n : ℕ) : + T2Space + (padicCompletedLevelCompleteDVF p n).valuationSubring := by + let target := padicCompletedLevelCompleteDVF p n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).2 + +private theorem completedPolynomial_eval₂_mem_ideal_of_coeff_mem + {R S : Type*} [CommSemiring R] [CommSemiring S] + (f : R →+* S) (I : Ideal S) (P : Polynomial R) (z : S) + (hcoeff : ∀ i, f (P.coeff i) ∈ I) : + P.eval₂ f z ∈ I := by + rw [Polynomial.eval₂_eq_sum_range] + exact Ideal.sum_mem _ fun i _ => + Ideal.mul_mem_right (z ^ i) I (hcoeff i) + +private theorem eisenstein_sub_X_pow_coeff_mem + {R : Type*} [CommRing R] [IsDomain R] (I : Ideal R) (Q : Polynomial R) + (d : ℕ) (hQnatDegree : Q.natDegree = d) (hQmonic : Q.Monic) + (hQeisenstein : Q.IsEisensteinAt I) (i : ℕ) : + (Q - Polynomial.X ^ d).coeff i ∈ I := by + rcases lt_trichotomy i d with hi | hi | hi + · have hQi : Q.coeff i ∈ I := by + apply hQeisenstein.mem + rwa [hQnatDegree] + change (Q - Polynomial.X ^ d).coeff i ∈ I + rw [Polynomial.coeff_sub, Polynomial.coeff_X_pow, + ite_eq_right (ne_of_lt hi), sub_zero] + exact hQi + · subst i + have hQd : Q.coeff d = 1 := by + rw [← hQnatDegree] + exact hQmonic.coeff_natDegree + change (Q - Polynomial.X ^ d).coeff d ∈ I + rw [Polynomial.coeff_sub, hQd, Polynomial.coeff_X_pow, + ite_eq_left rfl, sub_self] + exact I.zero_mem + · have hQi : Q.coeff i = 0 := by + apply Polynomial.coeff_eq_zero_of_natDegree_lt + rwa [hQnatDegree] + change (Q - Polynomial.X ^ d).coeff i ∈ I + rw [Polynomial.coeff_sub, hQi, Polynomial.coeff_X_pow, + ite_eq_right (ne_of_gt hi), sub_zero] + exact I.zero_mem + +private theorem addVal_mul_degree_of_polynomial_tail + {R S : Type*} [CommRing R] [CommRing S] [IsDomain S] [IsDiscreteValuationRing S] + (j : R →+* S) (P : Polynomial R) (x : S) (e d : ℕ) + (hconst : IsDiscreteValuationRing.addVal S (j (P.coeff 0)) = (e : ℕ∞)) + (htail : x * P.divX.eval₂ j x ∈ IsLocalRing.maximalIdeal S ^ (e + 1)) + (hrootDecomp : x ^ d + P.eval₂ j x = 0) : + (d : ℕ∞) * IsDiscreteValuationRing.addVal S x = (e : ℕ∞) := by + let tail := P.divX.eval₂ j x + have hR_eval : + P.eval₂ j x = j (P.coeff 0) + x * tail := by + have h := + congrArg (Polynomial.eval₂ j x) + (Polynomial.X_mul_divX_add P) + rw [Polynomial.eval₂_add, Polynomial.eval₂_mul, + Polynomial.eval₂_X, Polynomial.eval₂_C] at h + calc + P.eval₂ j x = x * tail + j (P.coeff 0) := by + simpa only [tail] using h.symm + _ = j (P.coeff 0) + x * tail := add_comm _ _ + have htailVal : + ((e + 1 : ℕ) : ℕ∞) ≤ + IsDiscreteValuationRing.addVal S + (x * tail) := + (IsDiscreteValuationRing.mem_maximalIdeal_pow_iff_addVal_ge + (x * tail) (e + 1)).1 htail + have heCastLt : + (e : ℕ∞) < + IsDiscreteValuationRing.addVal S + (x * tail) := by + exact + (show (e : ℕ∞) < ((e + 1 : ℕ) : ℕ∞) by + exact_mod_cast Nat.lt_succ_self e).trans_le htailVal + have hdistinct : + IsDiscreteValuationRing.addVal S + (j (P.coeff 0)) ≠ + IsDiscreteValuationRing.addVal S + (x * tail) := by + rw [hconst] + exact ne_of_lt heCastLt + have hRval : + IsDiscreteValuationRing.addVal S + (P.eval₂ j x) = (e : ℕ∞) := by + rw [hR_eval, + (IsDiscreteValuationRing.addVal + S).map_add_of_distinct_val hdistinct, + hconst, min_eq_left] + exact heCastLt.le + have hpowEq : x ^ d = -(P.eval₂ j x) := + eq_neg_of_add_eq_zero_left hrootDecomp + have hmul : + (d : ℕ∞) * + IsDiscreteValuationRing.addVal S x = + (e : ℕ∞) := by + calc + (d : ℕ∞) * + IsDiscreteValuationRing.addVal S x = + d • IsDiscreteValuationRing.addVal + S x := by rw [nsmul_eq_mul] + _ = IsDiscreteValuationRing.addVal S + (x ^ d) := by + symm + exact IsDiscreteValuationRing.addVal_pow x d + _ = IsDiscreteValuationRing.addVal S + (-(P.eval₂ j x)) := by rw [hpowEq] + _ = IsDiscreteValuationRing.addVal S + (P.eval₂ j x) := + (IsDiscreteValuationRing.addVal S).map_neg _ + _ = (e : ℕ∞) := hRval + exact hmul + +private theorem + padicCompletedPrimitiveRootInteger_addVal_and_ramificationIndex + (p : ℕ) [Fact p.Prime] (n : ℕ) : + IsDiscreteValuationRing.addVal + (padicCompletedLevelCompleteDVF p n).valuationSubring + (padicCompletedPrimitiveRootInteger p n) = 1 ∧ + ramificationIndex + (padicCompletedUnramifiedCompleteDVF p).toDVF + (padicCompletedLevelCompleteDVF p n).toDVF = + degree + (padicCompletedUnramifiedCompleteDVF p).toDVF + (padicCompletedLevelCompleteDVF p n).toDVF := by + let A := padicCompletedUnramifiedField p + let E := padicCompletedLevelField p n + let base := padicCompletedUnramifiedCompleteDVF p + let target := padicCompletedLevelCompleteDVF p n + let Q := padicCompletedPrimitivePolynomialInteger p n + let d := (p - 1) * p ^ n + let e := ramificationIndex base.toDVF target.toDVF + let f := residueDegree base.toDVF target.toDVF + let 𝔭 := base.maximalIdeal + let 𝔓 := target.maximalIdeal + let j := integerMap base.toDVF target.toDVF + let root := padicCompletedPrimitiveRootInteger p n + let R := Q - Polynomial.X ^ d + let π : (padicLocalField p).valuationSubring := + padicIntEquivValuationSubring p (p : ℤ_[p]) + let πA : base.valuationSubring := + padicCompletedUnramifiedIntegerMap p π + let : IsScalarTower base.valuationSubring + target.valuationSubring E := + IsScalarTower.of_algebraMap_eq' rfl + have hdpos : 0 < d := by + dsimp [d] + exact Nat.mul_pos + (Nat.sub_pos_of_lt (Fact.out : p.Prime).one_lt) + (Nat.pow_pos (Fact.out : p.Prime).pos) + have hdne : d ≠ 0 := Nat.ne_of_gt hdpos + have hQnatDegree : Q.natDegree = d := by + simpa only [Q, d] using + padicCompletedPrimitivePolynomialInteger_natDegree p n + have hQmonic : Q.Monic := by + simpa only [Q] using + padicCompletedPrimitivePolynomialInteger_monic p n + have hQeisenstein : Q.IsEisensteinAt 𝔭 := by + simpa only [Q, 𝔭, base] using + padicCompletedPrimitivePolynomialInteger_isEisensteinAt p n + have hdegree : degree base.toDVF target.toDVF = d := by + change Module.finrank A E = d + calc + Module.finrank A E = + (padicCompletedPrimitivePowerBasis p n).dim := + PowerBasis.finrank (padicCompletedPrimitivePowerBasis p n) + _ = + (minpoly A + (padicCompletedPrimitivePowerBasis p n).gen).natDegree := + (padicCompletedPrimitivePowerBasis p n).natDegree_minpoly.symm + _ = + (padicCompletedPrimitivePolynomial p n).natDegree := by + rw [padicCompletedPrimitivePowerBasis_gen, + padicCompletedPrimitiveRoot_minpoly] + _ = d := by + simpa only [d] using + padicCompletedPrimitivePolynomial_natDegree p n + have hfund : d = e * f := by + calc + d = degree base.toDVF target.toDVF := hdegree.symm + _ = e * f := by + simpa only [e, f] using + degree_eq_ramificationIndex_mul_residueDegree_of_finite_separable + base target + have he_ne : e ≠ 0 := by + intro he + apply hdne + rw [hfund, he, zero_mul] + have hf_ne : f ≠ 0 := by + intro hf + apply hdne + rw [hfund, hf, mul_zero] + have hele : e ≤ d := by + rw [hfund] + exact Nat.le_mul_of_pos_right e (Nat.pos_of_ne_zero hf_ne) + have hRcoeff (i : ℕ) : R.coeff i ∈ 𝔭 := + eisenstein_sub_X_pow_coeff_mem 𝔭 Q d hQnatDegree hQmonic hQeisenstein i + have hR_eval_mem_map : + R.eval₂ j root ∈ Ideal.map j 𝔭 := + completedPolynomial_eval₂_mem_ideal_of_coeff_mem + j (Ideal.map j 𝔭) R root + (fun i => Ideal.mem_map_of_mem j (hRcoeff i)) + have hmap : + Ideal.map j 𝔭 = 𝔓 ^ e := by + simpa only [j, 𝔭, 𝔓, e] using + maximalIdeal_map_eq_target_maximalIdeal_pow_ramificationIndex + base target + have hR_eval_mem_pow : R.eval₂ j root ∈ 𝔓 ^ e := by + rw [← hmap] + exact hR_eval_mem_map + have hroot : Q.eval₂ j root = 0 := by + simpa only [Polynomial.aeval_def, Q, j, root, base, target, + integerMap] using + padicCompletedPrimitiveRootInteger_aeval p n + have hQdecomp : Q = Polynomial.X ^ d + R := by + calc + Q = (Q - Polynomial.X ^ d) + Polynomial.X ^ d := + (sub_add_cancel Q (Polynomial.X ^ d)).symm + _ = Polynomial.X ^ d + R := by rw [add_comm] + have hrootDecomp : root ^ d + R.eval₂ j root = 0 := by + rw [hQdecomp, Polynomial.eval₂_add, Polynomial.eval₂_pow, + Polynomial.eval₂_X] at hroot + exact hroot + have hrootMem : root ∈ 𝔓 := by + simpa only [root, 𝔓, target] using + padicCompletedPrimitiveRootInteger_mem_maximalIdeal p n + have hdivCoeff (i : ℕ) : R.divX.coeff i ∈ 𝔭 := by + rw [Polynomial.coeff_divX] + exact hRcoeff (i + 1) + let tail := R.divX.eval₂ j root + have htail_mem_map : tail ∈ Ideal.map j 𝔭 := + completedPolynomial_eval₂_mem_ideal_of_coeff_mem + j (Ideal.map j 𝔭) R.divX root + (fun i => Ideal.mem_map_of_mem j (hdivCoeff i)) + have htail_mem_pow : tail ∈ 𝔓 ^ e := by + rw [← hmap] + exact htail_mem_map + have hrootTailMem : root * tail ∈ 𝔓 ^ (e + 1) := by + rw [pow_succ] + have hmul : tail * root ∈ 𝔓 ^ e * 𝔓 := + Ideal.mul_mem_mul htail_mem_pow hrootMem + rwa [mul_comm tail root] at hmul + have hRcoeffZero : R.coeff 0 = πA := by + change + (padicCompletedPrimitivePolynomialInteger p n - + Polynomial.X ^ d).coeff 0 = πA + rw [Polynomial.coeff_sub, Polynomial.coeff_X_pow, + ite_eq_right hdne.symm, sub_zero, + padicCompletedPrimitivePolynomialInteger, Polynomial.coeff_map] + exact congrArg (padicCompletedUnramifiedIntegerMap p) + (standardLubinTatePrimitivePolynomial_coeff_zero (padicLocalField p) π n) + have hπA : + base.valuation.IsUniformizer + (πA : padicCompletedUnramifiedField p) := by + simpa only [base, π, πA] using + padicCompletedUnramifiedIntegerMap_isUniformizer p + have hπAIrreducible : Irreducible πA := by + exact + (IsDiscreteValuationRing.irreducible_iff_uniformizer πA).2 + (base.maximalIdeal_eq_span_uniformizer hπA) + have hconst : + IsDiscreteValuationRing.addVal target.valuationSubring + (j (R.coeff 0)) = (e : ℕ∞) := by + rw [hRcoeffZero, + addVal_integerMap_eq_ramificationIndex_nsmul base target πA, + IsDiscreteValuationRing.addVal_uniformizer hπAIrreducible] + simp only [e, nsmul_eq_mul, mul_one] + have hmul := addVal_mul_degree_of_polynomial_tail j R root e d + hconst hrootTailMem hrootDecomp + have honele : + 1 ≤ IsDiscreteValuationRing.addVal + target.valuationSubring root := by + simpa using + (IsDiscreteValuationRing.mem_maximalIdeal_pow_iff_addVal_ge + root 1).1 + (by simpa only [pow_one] using hrootMem) + have hdcoe : (d : ℕ∞) ≠ 0 := by + exact_mod_cast hdne + have hmul_le : + (d : ℕ∞) * + IsDiscreteValuationRing.addVal target.valuationSubring root ≤ + (d : ℕ∞) * 1 := by + rw [hmul] + have hcast : (e : ℕ∞) ≤ (d : ℕ∞) := by + exact_mod_cast hele + simpa using hcast + have hvle : + IsDiscreteValuationRing.addVal target.valuationSubring root ≤ 1 := + (ENat.mul_le_mul_left_iff hdcoe (ENat.natCast_ne_top d)).1 hmul_le + have hrootVal : + IsDiscreteValuationRing.addVal target.valuationSubring root = 1 := + le_antisymm hvle honele + have hed : e = d := by + rw [hrootVal, mul_one] at hmul + exact_mod_cast hmul.symm + have heramDegree : + ramificationIndex + (padicCompletedUnramifiedCompleteDVF p).toDVF + (padicCompletedLevelCompleteDVF p n).toDVF = + degree + (padicCompletedUnramifiedCompleteDVF p).toDVF + (padicCompletedLevelCompleteDVF p n).toDVF := by + simpa only [base, target, e] using hed.trans hdegree.symm + exact ⟨hrootVal, heramDegree⟩ + +/-- The chosen completed primitive point has normalized additive valuation +one in the completed-level valuation ring. -/ +theorem padicCompletedPrimitiveRootInteger_addVal + (p : ℕ) [Fact p.Prime] (n : ℕ) : + IsDiscreteValuationRing.addVal + (padicCompletedLevelCompleteDVF p n).valuationSubring + (padicCompletedPrimitiveRootInteger p n) = 1 := + (padicCompletedPrimitiveRootInteger_addVal_and_ramificationIndex + p n).1 + +/-- The completed multiplicative Lubin--Tate level is totally ramified over +the completed-unramified coefficient field. -/ +theorem padicCompletedLevel_ramificationIndex_eq_degree + (p : ℕ) [Fact p.Prime] (n : ℕ) : + ramificationIndex + (padicCompletedUnramifiedCompleteDVF p).toDVF + (padicCompletedLevelCompleteDVF p n).toDVF = + degree + (padicCompletedUnramifiedCompleteDVF p).toDVF + (padicCompletedLevelCompleteDVF p n).toDVF := + (padicCompletedPrimitiveRootInteger_addVal_and_ramificationIndex + p n).2 + +/-- The completed primitive point is irreducible in the completed-level +valuation ring. -/ + theorem padicCompletedPrimitiveRootInteger_irreducible + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Irreducible (padicCompletedPrimitiveRootInteger p n) := by + let target := padicCompletedLevelCompleteDVF p n + let root := padicCompletedPrimitiveRootInteger p n + obtain ⟨ϖ, hϖ⟩ := + IsDiscreteValuationRing.exists_irreducible target.valuationSubring + have hval : + IsDiscreteValuationRing.addVal target.valuationSubring root = + IsDiscreteValuationRing.addVal target.valuationSubring ϖ := by + rw [padicCompletedPrimitiveRootInteger_addVal, + IsDiscreteValuationRing.addVal_uniformizer hϖ] + exact + ((IsDiscreteValuationRing.addVal_eq_iff_associated root ϖ).1 + hval).symm.irreducible hϖ + +/-- The chosen completed primitive point is a genuine uniformizer of the +completed level. -/ +theorem padicCompletedPrimitiveRoot_isUniformizer + (p : ℕ) [Fact p.Prime] (n : ℕ) : + (padicCompletedLevelCompleteDVF p n).valuation.IsUniformizer + (padicCompletedPrimitiveRootInteger p n : + padicCompletedLevelField p n) := by + exact Valuation.isUniformizer_of_maximalIdeal_eq_span + (v := (padicCompletedLevelCompleteDVF p n).valuation) + (padicCompletedPrimitiveRootInteger_irreducible p n).maximalIdeal_eq + +private theorem + padicChangedUniformizerThetaValue_addVal_and_ramificationIndex + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + IsDiscreteValuationRing.addVal + (padicCompletedLevelCompleteDVF p n).valuationSubring + (padicChangedUniformizerThetaValue p u n) = 1 ∧ + ramificationIndex + (padicCompletedUnramifiedCompleteDVF p).toDVF + (padicCompletedLevelCompleteDVF p n).toDVF = + (p - 1) * p ^ n := by + let base := padicCompletedUnramifiedCompleteDVF p + let target := padicCompletedLevelCompleteDVF p n + let Q := padicChangedCompletedPrimitivePolynomialInteger p u n + let d := (p - 1) * p ^ n + let e := ramificationIndex base.toDVF target.toDVF + let 𝔭 := base.maximalIdeal + let 𝔓 := target.maximalIdeal + let j := integerMap base.toDVF target.toDVF + let θ := padicChangedUniformizerThetaValue p u n + let R := Q - Polynomial.X ^ d + let π := padicIntEquivValuationSubring p (p : ℤ_[p]) + let πu := + standardLubinTateChangedUniformizer + (padicLocalField p) π u + let πuA : base.valuationSubring := + padicCompletedUnramifiedIntegerMap p πu + let : IsScalarTower base.valuationSubring + target.valuationSubring (padicCompletedLevelField p n) := + IsScalarTower.of_algebraMap_eq' rfl + have hdpos : 0 < d := by + dsimp [d] + exact Nat.mul_pos + (Nat.sub_pos_of_lt (Fact.out : p.Prime).one_lt) + (Nat.pow_pos (Fact.out : p.Prime).pos) + have hdne : d ≠ 0 := Nat.ne_of_gt hdpos + have hQnatDegree : Q.natDegree = d := by + simpa only [Q, d] using + padicChangedCompletedPrimitivePolynomialInteger_natDegree p u n + have hQmonic : Q.Monic := by + simpa only [Q] using + padicChangedCompletedPrimitivePolynomialInteger_monic p u n + have hQeisenstein : Q.IsEisensteinAt 𝔭 := by + simpa only [Q, 𝔭, base] using + padicChangedCompletedPrimitivePolynomialInteger_isEisensteinAt + p u n + have hdegree : + degree base.toDVF target.toDVF = d := by + let pb := padicCompletedPrimitivePowerBasis p n + change Module.finrank + (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) = d + calc + Module.finrank + (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) = + pb.dim := + PowerBasis.finrank pb + _ = + (minpoly (padicCompletedUnramifiedField p) pb.gen).natDegree := + pb.natDegree_minpoly.symm + _ = + (padicCompletedPrimitivePolynomial p n).natDegree := by + rw [padicCompletedPrimitivePowerBasis_gen, + padicCompletedPrimitiveRoot_minpoly] + _ = d := by + simpa only [d] using + padicCompletedPrimitivePolynomial_natDegree p n + have hed : e = d := by + calc + e = + degree + (padicCompletedUnramifiedCompleteDVF p).toDVF + (padicCompletedLevelCompleteDVF p n).toDVF := by + simpa only [e, base, target] using + padicCompletedLevel_ramificationIndex_eq_degree p n + _ = d := by simpa only [base, target] using hdegree + have hRcoeff (i : ℕ) : R.coeff i ∈ 𝔭 := + eisenstein_sub_X_pow_coeff_mem 𝔭 Q d hQnatDegree hQmonic hQeisenstein i + have hmap : + Ideal.map j 𝔭 = 𝔓 ^ e := by + simpa only [j, 𝔭, 𝔓, e] using + maximalIdeal_map_eq_target_maximalIdeal_pow_ramificationIndex + base target + have hθmem : θ ∈ 𝔓 := by + have hadic : IsAdic 𝔓 := rfl + have h𝔓nhds : + ((𝔓 : Ideal target.valuationSubring) : + Set target.valuationSubring) ∈ + 𝓝 (0 : target.valuationSubring) := by + simpa only [pow_one] using + (hadic.hasBasis_nhds_zero.mem_of_mem (i := 1) trivial) + have hThetaEval := + padicChangedUniformizerThetaValue_hasEval p u n + obtain ⟨m, hm⟩ := + hThetaEval.exists_pow_mem_of_mem_nhds h𝔓nhds + exact + (IsLocalRing.maximalIdeal.isMaximal + target.valuationSubring).isPrime.mem_of_pow_mem m hm + have hcomp : + j.comp (padicCompletedUnramifiedIntegerMap p) = + padicCompletedLevelPadicIntegerCoefficientHom p n := by + ext z + rw [RingHom.comp_apply, integerMap_apply, + padicCompletedUnramifiedIntegerMap_coe, + padicCompletedLevelPadicIntegerCoefficientHom_coe] + rfl + have hroot : Q.eval₂ j θ = 0 := by + have h := + padicChangedUniformizerThetaValue_isRoot p u n + rw [Polynomial.IsRoot, Polynomial.eval_map] at h + change + Polynomial.eval₂ j θ + ((standardLubinTatePrimitivePolynomial + (padicLocalField p) πu n).map + (padicCompletedUnramifiedIntegerMap p)) = + 0 + rw [Polynomial.eval₂_map, hcomp] + simpa only [πu] using h + have hQdecomp : Q = Polynomial.X ^ d + R := by + calc + Q = (Q - Polynomial.X ^ d) + Polynomial.X ^ d := + (sub_add_cancel Q (Polynomial.X ^ d)).symm + _ = Polynomial.X ^ d + R := by rw [add_comm] + have hrootDecomp : θ ^ d + R.eval₂ j θ = 0 := by + rw [hQdecomp, Polynomial.eval₂_add, Polynomial.eval₂_pow, + Polynomial.eval₂_X] at hroot + exact hroot + have hdivCoeff (i : ℕ) : R.divX.coeff i ∈ 𝔭 := by + rw [Polynomial.coeff_divX] + exact hRcoeff (i + 1) + let tail := R.divX.eval₂ j θ + have htail_mem_map : tail ∈ Ideal.map j 𝔭 := + completedPolynomial_eval₂_mem_ideal_of_coeff_mem + j (Ideal.map j 𝔭) R.divX θ + (fun i => Ideal.mem_map_of_mem j (hdivCoeff i)) + have htail_mem_pow : tail ∈ 𝔓 ^ e := by + rw [← hmap] + exact htail_mem_map + have hθtail_mem : θ * tail ∈ 𝔓 ^ (e + 1) := by + rw [pow_succ] + have hmul : tail * θ ∈ 𝔓 ^ e * 𝔓 := + Ideal.mul_mem_mul htail_mem_pow hθmem + rwa [mul_comm tail θ] at hmul + have hRcoeffZero : R.coeff 0 = πuA := by + change + (padicChangedCompletedPrimitivePolynomialInteger p u n - + Polynomial.X ^ d).coeff 0 = πuA + rw [Polynomial.coeff_sub, Polynomial.coeff_X_pow, + ite_eq_right hdne.symm, sub_zero, + padicChangedCompletedPrimitivePolynomialInteger, Polynomial.coeff_map] + exact congrArg (padicCompletedUnramifiedIntegerMap p) + (standardLubinTatePrimitivePolynomial_coeff_zero + (padicLocalField p) πu n) + have hπuA : + base.valuation.IsUniformizer + (πuA : padicCompletedUnramifiedField p) := by + simpa only [base, π, πu, πuA] using + padicChangedCompletedUniformizer_isUniformizer p u + have hπuAIrreducible : Irreducible πuA := by + exact + (IsDiscreteValuationRing.irreducible_iff_uniformizer πuA).2 + (base.maximalIdeal_eq_span_uniformizer hπuA) + have hconst : + IsDiscreteValuationRing.addVal target.valuationSubring + (j (R.coeff 0)) = (e : ℕ∞) := by + rw [hRcoeffZero, + addVal_integerMap_eq_ramificationIndex_nsmul base target πuA, + IsDiscreteValuationRing.addVal_uniformizer hπuAIrreducible] + simp only [e, nsmul_eq_mul, mul_one] + have hmul := addVal_mul_degree_of_polynomial_tail j R θ e d + hconst hθtail_mem hrootDecomp + have honele : + 1 ≤ IsDiscreteValuationRing.addVal + target.valuationSubring θ := by + simpa using + (IsDiscreteValuationRing.mem_maximalIdeal_pow_iff_addVal_ge + θ 1).1 + (by simpa only [pow_one] using hθmem) + have hdcoe : (d : ℕ∞) ≠ 0 := by + exact_mod_cast hdne + have hmul_le : + (d : ℕ∞) * + IsDiscreteValuationRing.addVal target.valuationSubring θ ≤ + (d : ℕ∞) * 1 := by + rw [hmul, hed, mul_one] + have hvle : + IsDiscreteValuationRing.addVal target.valuationSubring θ ≤ 1 := + (ENat.mul_le_mul_left_iff hdcoe (ENat.natCast_ne_top d)).1 hmul_le + have hθval : + IsDiscreteValuationRing.addVal target.valuationSubring θ = 1 := + le_antisymm hvle honele + exact ⟨hθval, hed⟩ + +/-- The genuine changed-uniformizer theta point has normalized additive +valuation one in the completed standard level. -/ +theorem padicChangedUniformizerThetaValue_addVal + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + IsDiscreteValuationRing.addVal + (padicCompletedLevelCompleteDVF p n).valuationSubring + (padicChangedUniformizerThetaValue p u n) = 1 := + (padicChangedUniformizerThetaValue_addVal_and_ramificationIndex + p u n).1 + +/-- The genuine changed-uniformizer theta point is a uniformizer of the +completed standard level. -/ +theorem padicChangedUniformizerThetaValue_isUniformizer + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + (padicCompletedLevelCompleteDVF p n).valuation.IsUniformizer + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) := by + let target := padicCompletedLevelCompleteDVF p n + let θ := padicChangedUniformizerThetaValue p u n + obtain ⟨ϖ, hϖ⟩ := + IsDiscreteValuationRing.exists_irreducible target.valuationSubring + have hval : + IsDiscreteValuationRing.addVal target.valuationSubring θ = + IsDiscreteValuationRing.addVal target.valuationSubring ϖ := by + rw [padicChangedUniformizerThetaValue_addVal, + IsDiscreteValuationRing.addVal_uniformizer hϖ] + have hθirreducible : Irreducible θ := + ((IsDiscreteValuationRing.addVal_eq_iff_associated θ ϖ).1 + hval).symm.irreducible hϖ + exact Valuation.isUniformizer_of_maximalIdeal_eq_span + (v := target.valuation) hθirreducible.maximalIdeal_eq + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedResidueFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedResidueFrobenius.lean new file mode 100644 index 0000000000..a4f58329d5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedResidueFrobenius.lean @@ -0,0 +1,221 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveUniformizer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusEvaluation +/-! +# Residue Frobenius on completed p-adic Lubin--Tate levels + +The completed multiplicative Lubin--Tate level is totally ramified over its +completed-unramified coefficient field. Hence the canonical residue map is +an isomorphism. Under this identification, every unit-indexed completed +Frobenius lift induces the arithmetic Frobenius `x ↦ x ^ p` on the residue +field. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.ValuedExtension +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ResidueField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +/-- The completed multiplicative level has residue degree one over the +completed-unramified coefficient field. -/ +theorem padicCompletedLevel_residueDegree_eq_one + (p : ℕ) [Fact p.Prime] (n : ℕ) : + residueDegree + (padicCompletedUnramifiedCompleteDVF p).toDVF + (padicCompletedLevelCompleteDVF p n).toDVF = 1 := by + let base := padicCompletedUnramifiedCompleteDVF p + let target := padicCompletedLevelCompleteDVF p n + let E := padicCompletedLevelField p n + let : IsScalarTower base.valuationSubring + target.valuationSubring E := + IsScalarTower.of_algebraMap_eq' rfl + exact + (residueDegree_eq_one_iff_ramificationIndex_eq_degree_of_finite_separable + base target).2 + (by + simpa only [base, target] using + padicCompletedLevel_ramificationIndex_eq_degree p n) + +/-- The target residue field has linear rank one over the +completed-unramified residue field. -/ +theorem padicCompletedLevel_residueField_finrank_eq_one + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Module.finrank + (padicCompletedUnramifiedCompleteDVF p).residueField + (padicCompletedLevelCompleteDVF p n).residueField = 1 := by + let base := padicCompletedUnramifiedCompleteDVF p + let target := padicCompletedLevelCompleteDVF p n + let E := padicCompletedLevelField p n + let : IsScalarTower base.valuationSubring + target.valuationSubring E := + IsScalarTower.of_algebraMap_eq' rfl + let : target.maximalIdeal.LiesOver base.maximalIdeal := + maximalIdeal_liesOver base target + have hfinrank : + residueDegree base.toDVF target.toDVF = + Module.finrank base.residueField target.residueField := by + rw [residueDegree_eq_finrank_quotient base target] + rfl + change Module.finrank base.residueField target.residueField = 1 + calc + Module.finrank base.residueField target.residueField = + residueDegree base.toDVF target.toDVF := + hfinrank.symm + _ = 1 := by + simpa only [base, target] using + padicCompletedLevel_residueDegree_eq_one p n + +/-- The canonical residue map from the completed-unramified coefficient +field onto the completed level is surjective. -/ +theorem padicCompletedLevel_residueMap_surjective + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Function.Surjective + (residueMap + (padicCompletedUnramifiedCompleteDVF p).toDVF + (padicCompletedLevelCompleteDVF p n).toDVF) := by + let base := padicCompletedUnramifiedCompleteDVF p + let target := padicCompletedLevelCompleteDVF p n + have hbijective : + Function.Bijective + (algebraMap base.residueField target.residueField) := + (Algebra.finrank_eq_one_iff_bijective_algebraMap).1 + (by + simpa only [base, target] using + padicCompletedLevel_residueField_finrank_eq_one p n) + exact hbijective.2 + +/-- The canonical residue-field equivalence from the completed-unramified +coefficient field to a completed multiplicative level. -/ +noncomputable def padicCompletedLevelResidueFieldEquiv + (p : ℕ) [Fact p.Prime] (n : ℕ) : + (padicCompletedUnramifiedCompleteDVF p).residueField ≃+* + (padicCompletedLevelCompleteDVF p n).residueField := + residueFieldEquivOfSurjective + (padicCompletedUnramifiedCompleteDVF p).toDVF + (padicCompletedLevelCompleteDVF p n).toDVF + (padicCompletedLevel_residueMap_surjective p n) + +/-- The completed-level residue equivalence evaluates by the canonical +residue map. -/ +@[simp] +theorem padicCompletedLevelResidueFieldEquiv_apply + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : (padicCompletedUnramifiedCompleteDVF p).residueField) : + padicCompletedLevelResidueFieldEquiv p n x = + residueMap + (padicCompletedUnramifiedCompleteDVF p).toDVF + (padicCompletedLevelCompleteDVF p n).toDVF x := + rfl + +/-- On integral representatives, the completed-level residue equivalence is +the residue of the canonical valuation-ring inclusion. -/ +theorem padicCompletedLevelResidueFieldEquiv_apply_residue + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : (padicCompletedUnramifiedCompleteDVF p).valuationSubring) : + padicCompletedLevelResidueFieldEquiv p n + ((padicCompletedUnramifiedCompleteDVF p).residueMap a) = + (padicCompletedLevelCompleteDVF p n).residueMap + (integerMap + (padicCompletedUnramifiedCompleteDVF p).toDVF + (padicCompletedLevelCompleteDVF p n).toDVF a) := by + exact + residueFieldEquivOfSurjective_apply_residue + (padicCompletedUnramifiedCompleteDVF p).toDVF + (padicCompletedLevelCompleteDVF p n).toDVF + (padicCompletedLevel_residueMap_surjective p n) a + +private theorem + padicCompletedUnramifiedWitt_residue_frobenius_eq_pow + (p : ℕ) [Fact p.Prime] + (a : padicCompletedUnramifiedWittRing p) : + IsLocalRing.residue (padicCompletedUnramifiedWittRing p) + (WittVector.frobenius a) = + IsLocalRing.residue (padicCompletedUnramifiedWittRing p) a ^ p := by + calc + IsLocalRing.residue (padicCompletedUnramifiedWittRing p) + (WittVector.frobenius a) = + IsLocalRing.residue (padicCompletedUnramifiedWittRing p) + (a ^ p) := by + rw [residue_eq_residue_iff_sub_mem_maximalIdeal, + padicCompletedUnramifiedWittRing_maximalIdeal, + ← WittVector.ker_constantCoeff] + change + WittVector.constantCoeff + (WittVector.frobenius a - a ^ p) = 0 + rw [map_sub, map_pow, WittVector.constantCoeff_apply, + WittVector.coeff_frobenius_charP] + exact sub_self _ + _ = + IsLocalRing.residue (padicCompletedUnramifiedWittRing p) a ^ p := by + rw [map_pow] + +/-- The actual residue action induced by every unit-indexed completed +Frobenius lift is the arithmetic Frobenius `x ↦ x ^ p`. -/ +theorem + padicCompletedUnitFrobeniusIntegerEquiv_residue_apply_eq_pow + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicLocalField + p).valuationSubringˣ) + (x : (padicCompletedLevelCompleteDVF p n).residueField) : + IsLocalRing.ResidueField.mapEquiv + (padicCompletedUnitFrobeniusIntegerEquiv p n u) x = + x ^ p := by + let W := padicCompletedUnramifiedWittRing p + let base := padicCompletedUnramifiedCompleteDVF p + let target := padicCompletedLevelCompleteDVF p n + let wittIntegerEquiv : W ≃+* base.valuationSubring := + padicCompletedUnramifiedWittRingEquivValuationSubring p + let coefficientResidueEquiv : + IsLocalRing.ResidueField W ≃+* target.residueField := + (IsLocalRing.ResidueField.mapEquiv wittIntegerEquiv).trans + (padicCompletedLevelResidueFieldEquiv p n) + have hcoefficient (a : W) : + coefficientResidueEquiv (IsLocalRing.residue W a) = + target.residueMap + (padicCompletedLevelWittCoefficientHom p n a) := by + simp only [coefficientResidueEquiv, RingEquiv.trans_apply, + IsLocalRing.ResidueField.mapEquiv_apply] + rfl + obtain ⟨z, rfl⟩ := coefficientResidueEquiv.surjective x + obtain ⟨a, rfl⟩ := IsLocalRing.residue_surjective z + calc + IsLocalRing.ResidueField.mapEquiv + (padicCompletedUnitFrobeniusIntegerEquiv p n u) + (coefficientResidueEquiv (IsLocalRing.residue W a)) = + target.residueMap + (padicCompletedUnitFrobeniusIntegerEquiv p n u + (padicCompletedLevelWittCoefficientHom p n a)) := by + rw [hcoefficient] + rfl + _ = + target.residueMap + (padicCompletedLevelWittCoefficientHom p n + (WittVector.frobenius a)) := by + rw [padicCompletedUnitFrobeniusIntegerEquiv_wittCoefficientHom] + _ = + coefficientResidueEquiv + (IsLocalRing.residue W (WittVector.frobenius a)) := + (hcoefficient (WittVector.frobenius a)).symm + _ = + coefficientResidueEquiv + (IsLocalRing.residue W a ^ p) := by + rw [padicCompletedUnramifiedWitt_residue_frobenius_eq_pow] + _ = coefficientResidueEquiv (IsLocalRing.residue W a) ^ p := by + rw [map_pow] + +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedStandardLevelTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedStandardLevelTransport.lean new file mode 100644 index 0000000000..e278b2a438 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedStandardLevelTransport.lean @@ -0,0 +1,609 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusLift +public import Mathlib.Topology.Algebra.Nonarchimedean.AdicTopology +/-! +# Transporting a finite p-adic Lubin--Tate level to the completed level + +The ordinary standard Lubin--Tate level embeds in the completed level by +sending its primitive generator to the chosen completed primitive point. +This file proves that the embedding also preserves the integral analytic +action. In particular, the direct completed action of a p-adic unit is +the image of the finite action with the *same* unit-parameter class. + +This fixes the parameter orientation before the completed Frobenius is +used in the changed-uniformizer norm argument. +-/ + +@[expose] public section + +noncomputable +section + +open scoped PowerSeries + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open ValuationTheory.DiscreteValuationField +open SameUniformizer + +/-- The discrete uniform structure on the coefficient valuation ring used for evaluation. -/ +noncomputable local instance + padicStandardLevelTransportCoefficientUniformSpace + (p : ℕ) [Fact p.Prime] : + UniformSpace (padicLocalField p).valuationSubring := + ⊥ + +/-- The discrete topology on the coefficient valuation ring used for evaluation. -/ +noncomputable local instance + padicStandardLevelTransportCoefficientTopologicalSpace + (p : ℕ) [Fact p.Prime] : + TopologicalSpace (padicLocalField p).valuationSubring := + ⊥ + +private noncomputable local instance (priority := 50) + padicStandardLevelTransportWittUniformSpace + (p : ℕ) [Fact p.Prime] : + UniformSpace (padicCompletedUnramifiedWittRing p) := + ⊥ + +/-- The maximal ideal defining the adic topology on the standard level valuation ring. -/ +noncomputable local instance + padicStandardLevelTransportSourceWithIdeal + (p : ℕ) [Fact p.Prime] (n : ℕ) : + WithIdeal + (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring where + i := + (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + ).maximalIdeal + +/-- The maximal ideal defining the adic topology on the completed level valuation ring. -/ +noncomputable local instance + padicStandardLevelTransportTargetWithIdeal + (p : ℕ) [Fact p.Prime] (n : ℕ) : + WithIdeal + (padicCompletedLevelCompleteDVF p n).valuationSubring where + i := (padicCompletedLevelCompleteDVF p n).maximalIdeal + +private noncomputable local instance + padicStandardLevelTransportSourceCompleteSpace + (p : ℕ) [Fact p.Prime] (n : ℕ) : + CompleteSpace + (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring := by + let source := + standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + have hadic : IsAdic source.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp source.isAdicComplete).1 + +private noncomputable local instance + padicStandardLevelTransportSourceT2Space + (p : ℕ) [Fact p.Prime] (n : ℕ) : + T2Space + (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring := by + let source := + standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + have hadic : IsAdic source.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp source.isAdicComplete).2 + +private noncomputable local instance + padicStandardLevelTransportTargetCompleteSpace + (p : ℕ) [Fact p.Prime] (n : ℕ) : + CompleteSpace + (padicCompletedLevelCompleteDVF p n).valuationSubring := by + let target := padicCompletedLevelCompleteDVF p n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).1 + +private noncomputable local instance + padicStandardLevelTransportTargetT2Space + (p : ℕ) [Fact p.Prime] (n : ℕ) : + T2Space + (padicCompletedLevelCompleteDVF p n).valuationSubring := by + let target := padicCompletedLevelCompleteDVF p n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).2 + +/-- The standard finite-level embedding restricted to the actual valuation +rings. -/ +noncomputable def padicStandardLevelIntegerEmbedding + (p : ℕ) [Fact p.Prime] (n : ℕ) : + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring →+* + (padicCompletedLevelCompleteDVF p n).valuationSubring := by + let F := padicLocalField p + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + let source := standardLubinTateLevelCompleteDVF hπ n + let A := padicCompletedUnramifiedCompleteDVF p + let E := padicCompletedLevelField p n + let target := padicCompletedLevelCompleteDVF p n + let ι : L →ₐ[ℚ_[p]] E := padicStandardLevelEmbedding p n + letI : F.valuation.HasExtension source.valuation := + standardLubinTateLevelCompleteDVF_hasExtension + (F := padicLocalField p) + (π := padicIntEquivValuationSubring p (p : ℤ_[p])) hπ n + letI : Algebra F.valuationSubring source.valuationSubring := + Valuation.HasExtension.instAlgebra_valuationSubring + (padicLocalField p).valuation + (standardLubinTateLevelCompleteDVF + (F := padicLocalField p) + (π := padicIntEquivValuationSubring p (p : ℤ_[p])) hπ n).valuation + letI : IsScalarTower F.valuationSubring source.valuationSubring L := + IsScalarTower.of_algebraMap_eq' rfl + letI : IsIntegralClosure + source.valuationSubring F.valuationSubring L := + standardLubinTateLevelCompleteDVF_isIntegralClosure hπ n + letI : IsScalarTower A.valuationSubring target.valuationSubring E := + IsScalarTower.of_algebraMap_eq' rfl + letI : IsIntegralClosure + target.valuationSubring A.valuationSubring E := + padicCompletedLevelCompleteDVF_isIntegralClosure p n + let f : source.valuationSubring →+* E := + ι.toRingHom.comp source.valuation.valuationSubring.subtype + apply RingHom.codRestrict f target.valuation.valuationSubring + intro x + have hxIntegral : + IsIntegral F.valuationSubring (x : L) := + (IsIntegralClosure.isIntegral_iff + (A := source.valuationSubring) + (R := F.valuationSubring) + (B := L)).2 ⟨x, rfl⟩ + have hcomp : + (algebraMap A.valuationSubring E).comp + (padicCompletedUnramifiedIntegerMap p) = + ι.toRingHom.comp (algebraMap F.valuationSubring L) := by + ext a + simp only [RingHom.comp_apply] + change + algebraMap (padicCompletedUnramifiedField p) E + ((padicCompletedUnramifiedIntegerMap p a : + A.valuationSubring) : + padicCompletedUnramifiedField p) = + ι (algebraMap ℚ_[p] L (a : ℚ_[p])) + rw [padicCompletedUnramifiedIntegerMap_coe] + calc + algebraMap (padicCompletedUnramifiedField p) E + (algebraMap ℚ_[p] + (padicCompletedUnramifiedField p) (a : ℚ_[p])) = + algebraMap ℚ_[p] E (a : ℚ_[p]) := + (IsScalarTower.algebraMap_apply ℚ_[p] + (padicCompletedUnramifiedField p) E (a : ℚ_[p])).symm + _ = ι (algebraMap ℚ_[p] L (a : ℚ_[p])) := + (ι.commutes (a : ℚ_[p])).symm + have hxMappedIntegral : + IsIntegral A.valuationSubring (ι (x : L)) := + IsIntegral.map_of_comp_eq + (padicCompletedUnramifiedIntegerMap p) + ι.toRingHom hcomp hxIntegral + rcases + (IsIntegralClosure.isIntegral_iff + (A := target.valuationSubring) + (R := A.valuationSubring) + (B := E)).1 hxMappedIntegral with + ⟨z, hz⟩ + exact hz ▸ z.property + +/-- Coercing the integral standard-level embedding to the completed field +recovers the field embedding. -/ +@[simp] +theorem padicStandardLevelIntegerEmbedding_coe + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : + (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring) : + ((padicStandardLevelIntegerEmbedding p n x : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) = + padicStandardLevelEmbedding p n + (x : + standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) n) := by + rfl + +/-- The integral embedding sends the finite primitive point to the chosen +completed primitive point. -/ +@[simp] +theorem padicStandardLevelIntegerEmbedding_apply_primitivePoint + (p : ℕ) [Fact p.Prime] (n : ℕ) : + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + padicStandardLevelIntegerEmbedding p n + (standardLubinTatePrimitivePointInteger hπ n) = + padicCompletedPrimitiveRootInteger p n := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + apply Subtype.ext + rw [padicStandardLevelIntegerEmbedding_coe, + padicCompletedPrimitiveRootInteger_coe] + have hpoint := congrArg (padicStandardLevelEmbedding p n) + (standardLubinTatePrimitivePointInteger_coe + (F := padicLocalField p) hπ n) + exact hpoint.trans (padicStandardLevelEmbedding_apply_gen p n) + +/-- The integral standard-level embedding is continuous for the two +maximal-ideal adic topologies. -/ +theorem padicStandardLevelIntegerEmbedding_continuous + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Continuous (padicStandardLevelIntegerEmbedding p n) := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let source := standardLubinTateLevelCompleteDVF hπ n + let target := padicCompletedLevelCompleteDVF p n + let f : source.valuationSubring →+* target.valuationSubring := + padicStandardLevelIntegerEmbedding p n + have hmap : + Ideal.map f source.maximalIdeal ≤ target.maximalIdeal := by + rw [source.maximalIdeal_eq_span_uniformizer + (standardLubinTatePrimitivePoint_isUniformizer hπ n), + Ideal.map_span, Set.image_singleton, Ideal.span_le] + intro y hy + rw [Set.mem_singleton_iff] at hy + subst y + change + padicStandardLevelIntegerEmbedding p n + (standardLubinTatePrimitivePointInteger hπ n) ∈ + target.maximalIdeal + rw [padicStandardLevelIntegerEmbedding_apply_primitivePoint] + exact padicCompletedPrimitiveRootInteger_mem_maximalIdeal p n + exact + (WithIdeal.uniformContinuous_of_map_le (f := f) hmap).continuous + +/-- The integral embedding commutes with the canonical maps of p-adic +integer coefficients. -/ +theorem padicStandardLevelIntegerEmbedding_comp_coefficientHom + (p : ℕ) [Fact p.Prime] (n : ℕ) : + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + (padicStandardLevelIntegerEmbedding p n).comp + (standardLubinTateLevelCoefficientHom hπ n) = + padicCompletedLevelPadicIntegerCoefficientHom p n := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + let E := padicCompletedLevelField p n + ext a + simp only [RingHom.comp_apply, + padicStandardLevelIntegerEmbedding_coe, + padicCompletedLevelPadicIntegerCoefficientHom_coe] + change + padicStandardLevelEmbedding p n + (algebraMap ℚ_[p] L (a : ℚ_[p])) = + algebraMap (padicCompletedUnramifiedField p) E + (algebraMap ℚ_[p] + (padicCompletedUnramifiedField p) (a : ℚ_[p])) + rw [(padicStandardLevelEmbedding p n).commutes, + ← IsScalarTower.algebraMap_apply ℚ_[p] + (padicCompletedUnramifiedField p) E] + +/-- Evaluation after extending p-adic coefficients to the completed Witt +ring is evaluation through the direct p-adic coefficient map. -/ +theorem padicCompletedLevelPowerSeriesEval_map_padicCoefficients + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) + (f : PowerSeries (padicLocalField p).valuationSubring) : + padicCompletedLevelPowerSeriesEval p n x hx + (PowerSeries.map + (padicValuationSubringToCompletedUnramifiedWittRing p) f) = + PowerSeries.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) x f := by + have hpadic : + Continuous (padicCompletedLevelPadicIntegerCoefficientHom p n) := + continuous_of_discreteTopology + rw [padicCompletedLevelPowerSeriesEval, + PowerSeries.coe_eval₂Hom, + PowerSeries.eval₂_eq_tsum + (padicCompletedLevelWittCoefficientHom_continuous p n) hx, + PowerSeries.eval₂_eq_tsum hpadic hx] + apply tsum_congr + intro d + rw [PowerSeries.coeff_map] + rfl + +/-- Analytic evaluation in the finite standard level commutes with its +integral embedding into the completed level. -/ +theorem padicStandardLevelIntegerEmbedding_powerSeriesEval + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : + (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring) + (hx : PowerSeries.HasEval x) + (f : PowerSeries (padicLocalField p).valuationSubring) : + padicStandardLevelIntegerEmbedding p n + (standardLubinTateLevelPowerSeriesEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) + n x hx f) = + padicCompletedLevelPowerSeriesEval p n + (padicStandardLevelIntegerEmbedding p n x) + (hx.map (padicStandardLevelIntegerEmbedding_continuous p n)) + (PowerSeries.map + (padicValuationSubringToCompletedUnramifiedWittRing p) f) := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let j := padicStandardLevelIntegerEmbedding p n + have hraw := + congrFun + (PowerSeries.comp_eval₂ + (φ := standardLubinTateLevelCoefficientHom hπ n) + continuous_of_discreteTopology hx + (padicStandardLevelIntegerEmbedding_continuous p n)) f + have htransport : + j + (PowerSeries.eval₂ + (standardLubinTateLevelCoefficientHom hπ n) x f) = + PowerSeries.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) + (j x) f := by + rw [← padicStandardLevelIntegerEmbedding_comp_coefficientHom p n] + simpa only [Function.comp_apply] using hraw + calc + j + (standardLubinTateLevelPowerSeriesEval hπ n x hx f) = + PowerSeries.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) + (j x) f := by + simpa only [standardLubinTateLevelPowerSeriesEval, + PowerSeries.coe_eval₂Hom] using htransport + _ = + padicCompletedLevelPowerSeriesEval p n (j x) + (hx.map (padicStandardLevelIntegerEmbedding_continuous p n)) + (PowerSeries.map + (padicValuationSubringToCompletedUnramifiedWittRing p) f) := + (padicCompletedLevelPowerSeriesEval_map_padicCoefficients + p n (j x) + (hx.map (padicStandardLevelIntegerEmbedding_continuous p n)) + f).symm + +/-- The integral embedding carries the finite analytic unit action to the +direct completed analytic unit action with the same unit. -/ +@[simp] +theorem + padicStandardLevelIntegerEmbedding_apply_primitivePointUnitAction + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + padicStandardLevelIntegerEmbedding p n + (standardLubinTatePrimitivePointIntegerAction hπ n u) = + padicCompletedStandardPrimitivePointUnitAction p n u := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + have h := + padicStandardLevelIntegerEmbedding_powerSeriesEval p n + (standardLubinTatePrimitivePointInteger hπ n) + (standardLubinTatePrimitivePointInteger_hasEval hπ n) + (standardLubinTateEndomorphism hπ + (u : (padicLocalField p).valuationSubring)) + simpa only [ + standardLubinTatePrimitivePointIntegerAction, + standardLubinTateEndomorphismValue, + standardLubinTateEndomorphismEvalAt, + padicCompletedStandardPrimitivePointUnitAction, + padicCompletedStandardScalarEndomorphismValue, + padicCompletedStandardScalarEndomorphism, + padicStandardLevelIntegerEmbedding_apply_primitivePoint] using h + +/-- At the finite p-adic level, the parameter class of a unit realizes +exactly its direct analytic action. -/ +theorem padicStandardUnitParameterLevelRoot_class + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + let F := padicLocalField p + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + standardLubinTateUnitParameterLevelRoot F hπ n + (standardLubinTateUnitParameterClass F n u) = + standardLubinTatePrimitiveLevelAction hπ n u := by + let F := padicLocalField p + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + apply Subtype.ext + exact (standardLubinTateUnitParameterLevelRoot_coe F hπ n + (standardLubinTateUnitParameterClass F n u)).trans + ((standardLubinTateUnitParameterRoot_class F hπ n u).trans + (standardLubinTatePrimitiveLevelAction_coe + (F := F) hπ n u).symm) + +/-- The direct completed unit action is the completed realization of the +same finite unit-parameter class. -/ +@[simp] +theorem + padicCompletedStandardPrimitivePointUnitAction_eq_unitParameterRoot + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + ((padicCompletedStandardPrimitivePointUnitAction p n u : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) = + padicCompletedUnitParameterRoot p n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u) := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let source := standardLubinTateLevelCompleteDVF hπ n + calc + ((padicCompletedStandardPrimitivePointUnitAction p n u : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) = + ((padicStandardLevelIntegerEmbedding p n + (standardLubinTatePrimitivePointIntegerAction hπ n u) : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) := by + rw [ + padicStandardLevelIntegerEmbedding_apply_primitivePointUnitAction] + _ = + padicStandardLevelEmbedding p n + ((standardLubinTatePrimitivePointIntegerAction hπ n u : + source.valuationSubring) : + standardLubinTateLevelField hπ n) := by + rw [padicStandardLevelIntegerEmbedding_coe] + _ = + padicStandardLevelEmbedding p n + (standardLubinTateUnitParameterLevelRoot + (padicLocalField p) hπ n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u)) := by + congr 1 + change + standardLubinTatePrimitiveLevelAction hπ n u = + standardLubinTateUnitParameterLevelRoot + (padicLocalField p) hπ n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u) + exact (padicStandardUnitParameterLevelRoot_class p n u).symm + _ = + padicCompletedUnitParameterRoot p n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u) := + rfl + +/-- The completed unit-indexed Frobenius lift restricts to the finite +standard-level automorphism with the same unit-parameter class. -/ +theorem padicCompletedUnitFrobeniusLiftEquiv_standardLevelEmbedding + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) + (x : + standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) n) : + padicCompletedUnitFrobeniusLiftEquiv p n u + (padicStandardLevelEmbedding p n x) = + padicStandardLevelEmbedding p n + (standardLubinTateUnitParameterAlgEquiv + (padicLocalField p) + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u) x) := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let L := standardLubinTateLevelField hπ n + let E := padicCompletedLevelField p n + let ι : L →ₐ[ℚ_[p]] E := padicStandardLevelEmbedding p n + let δ : E →ₐ[ℚ_[p]] E := + { toRingHom := + (padicCompletedUnitFrobeniusLiftEquiv p n u).toRingHom + commutes' := by + intro b + change + padicCompletedUnitFrobeniusLiftEquiv p n u + (algebraMap (padicCompletedUnramifiedField p) E + (algebraMap ℚ_[p] + (padicCompletedUnramifiedField p) b)) = + algebraMap (padicCompletedUnramifiedField p) E + (algebraMap ℚ_[p] + (padicCompletedUnramifiedField p) b) + rw [padicCompletedUnitFrobeniusLiftEquiv_algebraMap, + (padicCompletedUnramifiedFrobenius p).commutes] } + let σ : L ≃ₐ[ℚ_[p]] L := + standardLubinTateUnitParameterAlgEquiv + (padicLocalField p) hπ n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u) + have hintertwine : δ.comp ι = ι.comp σ.toAlgHom := by + apply (standardLubinTateLevelPowerBasis hπ n).algHom_ext + change + padicCompletedUnitFrobeniusLiftEquiv p n u + (padicStandardLevelEmbedding p n + (standardLubinTateLevelPowerBasis hπ n).gen) = + padicStandardLevelEmbedding p n + (standardLubinTateUnitParameterAlgEquiv + (padicLocalField p) hπ n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u) + (standardLubinTateLevelPowerBasis hπ n).gen) + rw [padicStandardLevelEmbedding_apply_gen, + padicCompletedUnitFrobeniusLiftEquiv_primitiveRoot] + have hgen := congrArg (padicStandardLevelEmbedding p n) + (standardLubinTateUnitParameterAlgEquiv_apply_gen + (padicLocalField p) hπ n + (standardLubinTateUnitParameterClass (padicLocalField p) n u)) + exact (padicCompletedStandardPrimitivePointUnitAction_eq_unitParameterRoot + p n u).trans hgen.symm + exact DFunLike.congr_fun hintertwine x + +/-- The inverse completed unit-indexed Frobenius lift restricts to the +inverse finite unit-parameter automorphism. -/ +theorem padicCompletedUnitFrobeniusLiftEquiv_symm_standardLevelEmbedding + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) + (x : + standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) n) : + (padicCompletedUnitFrobeniusLiftEquiv p n u).symm + (padicStandardLevelEmbedding p n x) = + padicStandardLevelEmbedding p n + ((standardLubinTateUnitParameterAlgEquiv + (padicLocalField p) + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u)).symm x) := by + apply (padicCompletedUnitFrobeniusLiftEquiv p n u).injective + rw [ + (padicCompletedUnitFrobeniusLiftEquiv p n u).apply_symm_apply, + padicCompletedUnitFrobeniusLiftEquiv_standardLevelEmbedding, + (standardLubinTateUnitParameterAlgEquiv + (padicLocalField p) + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u)).apply_symm_apply] + +/-- With the inverse unit as Frobenius-lift parameter, the inverse completed +lift acts on the standard finite level by the direct unit parameter. This is +the orientation used by the actual local Artin map after changed-uniformizer +descent. -/ +theorem + padicCompletedInverseUnitFrobeniusLiftEquiv_standardLevelEmbedding + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) + (x : + standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) n) : + (padicCompletedUnitFrobeniusLiftEquiv p n u⁻¹).symm + (padicStandardLevelEmbedding p n x) = + padicStandardLevelEmbedding p n + (standardLubinTateUnitParameterAlgEquiv + (padicLocalField p) + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u) x) := by + rw [ + padicCompletedUnitFrobeniusLiftEquiv_symm_standardLevelEmbedding] + have hclass : + standardLubinTateUnitParameterClass + (padicLocalField p) n u⁻¹ = + (standardLubinTateUnitParameterClass + (padicLocalField p) n u)⁻¹ := + (standardLubinTateUnitParameterClass + (padicLocalField p) n).map_inv u + have hparameter : + standardLubinTateUnitParameterAlgEquiv + (padicLocalField p) + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u⁻¹) = + (standardLubinTateUnitParameterAlgEquiv + (padicLocalField p) + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u))⁻¹ := by + change + standardLubinTateUnitParameterEquivGal + (padicLocalField p) + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u⁻¹) = + (standardLubinTateUnitParameterEquivGal + (padicLocalField p) + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u))⁻¹ + rw [hclass, + (standardLubinTateUnitParameterEquivGal + (padicLocalField p) + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).map_inv] + rw [hparameter] + rfl + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean new file mode 100644 index 0000000000..ca3491abf2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean @@ -0,0 +1,546 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerCoefficient +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv +/-! +# The p-adic completed-unramified coefficient field + +The coefficient ring used by the mixed-characteristic changed-uniformizer +construction is + +`W(AlgebraicClosure (ZMod p))`. + +Its fraction field is the completed maximal-unramified coefficient field. +This file equips that existing mathlib fraction field with its canonical +`ℚ_[p]`-algebra structure. Mathlib's fraction-field Frobenius then becomes +an actual `ℚ_[p]`-algebra automorphism. No second Witt ring, p-adic field, +or Frobenius is introduced. +-/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + valuation_hasExtension_of_local_valuationSubring_map → + valuation_hasExtension_of_local_valuationSubring_map + + +noncomputable +section + +namespace LubinTate + +open Filter +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open ValuationTheory.DiscreteValuationField +open scoped Topology Valued WithZero + +/-- The fraction field of the completed-unramified Witt integer ring. -/ +abbrev padicCompletedUnramifiedField (p : ℕ) [Fact p.Prime] := + FractionRing (padicCompletedUnramifiedWittRing p) + +/-- The maximal ideal of the completed-unramified Witt integer ring is +generated by the canonical prime `p`. -/ +theorem padicCompletedUnramifiedWittRing_maximalIdeal + (p : ℕ) [Fact p.Prime] : + IsLocalRing.maximalIdeal (padicCompletedUnramifiedWittRing p) = + Ideal.span + ({(p : padicCompletedUnramifiedWittRing p)} : Set + (padicCompletedUnramifiedWittRing p)) := by + rw [← WittVector.ker_constantCoeff] + exact + (IsLocalRing.ker_eq_maximalIdeal + (WittVector.constantCoeff : + padicCompletedUnramifiedWittRing p →+* + AlgebraicClosure (ZMod p)) + (WittVector.constantCoeff_surjective p)).symm + +/-- The canonical DVR valuation on the fraction field of the +completed-unramified Witt integer ring. -/ +abbrev padicCompletedUnramifiedValuation + (p : ℕ) [Fact p.Prime] : + Valuation (padicCompletedUnramifiedField p) ℤᵐ⁰ := + (IsDiscreteValuationRing.maximalIdeal + (padicCompletedUnramifiedWittRing p)).valuation + (padicCompletedUnramifiedField p) + +/-- The valued-field structure induced by the canonical Witt DVR +valuation. -/ +noncomputable instance padicCompletedUnramifiedFieldValued + (p : ℕ) [Fact p.Prime] : + Valued (padicCompletedUnramifiedField p) ℤᵐ⁰ := + Valued.mk' (padicCompletedUnramifiedValuation p) + +/-- The original Witt integer ring is the valuation ring of its fraction +field with the canonical DVR valuation. -/ +noncomputable def + padicCompletedUnramifiedWittRingEquivValuationSubring + (p : ℕ) [Fact p.Prime] : + padicCompletedUnramifiedWittRing p ≃+* + (padicCompletedUnramifiedValuation p).valuationSubring := + IsDiscreteValuationRing.equivValuationSubring + (A := padicCompletedUnramifiedWittRing p) + (K := padicCompletedUnramifiedField p) + +/-- The valuation ring of the completed-unramified coefficient field is +complete for its maximal-ideal adic topology. This transports mathlib's +`p`-adic completeness of Witt vectors across the canonical valuation-ring +equivalence. -/ +theorem padicCompletedUnramifiedValuation_isAdicComplete + (p : ℕ) [Fact p.Prime] : + IsAdicComplete + (IsLocalRing.maximalIdeal + (padicCompletedUnramifiedValuation p).valuationSubring) + (padicCompletedUnramifiedValuation p).valuationSubring := by + let W := padicCompletedUnramifiedWittRing p + let v := padicCompletedUnramifiedValuation p + let e : W ≃+* v.valuationSubring := + padicCompletedUnramifiedWittRingEquivValuationSubring p + let : Algebra W v.valuationSubring := e.toRingHom.toAlgebra + let eLin : W ≃ₗ[W] v.valuationSubring := + { toFun := e + invFun := e.symm + left_inv := e.left_inv + right_inv := e.right_inv + map_add' := e.map_add + map_smul' := by + intro r x + change e (r * x) = + (algebraMap W v.valuationSubring r) * e x + simp [RingHom.algebraMap_toAlgebra] } + have hcompleteW : + IsAdicComplete (IsLocalRing.maximalIdeal W) W := by + rw [show IsLocalRing.maximalIdeal W = + Ideal.span ({(p : W)} : Set W) by + simpa only [W] using + padicCompletedUnramifiedWittRing_maximalIdeal p] + infer_instance + let : IsAdicComplete (IsLocalRing.maximalIdeal W) W := + hcompleteW + have hcompleteAsW : + IsAdicComplete (IsLocalRing.maximalIdeal W) + v.valuationSubring := + isAdicComplete_of_linearEquiv + (M := W) (N := v.valuationSubring) + (IsLocalRing.maximalIdeal W) eLin + have hcompleteMap : + IsAdicComplete + ((IsLocalRing.maximalIdeal W).map + (algebraMap W v.valuationSubring)) + v.valuationSubring := + (isAdicComplete_map_algebraMap_iff + (I := IsLocalRing.maximalIdeal W) + (S := v.valuationSubring)).2 hcompleteAsW + rw [RingHom.algebraMap_toAlgebra, + ValuationTheory.ringEquiv_map_maximalIdeal e] at hcompleteMap + simpa only [v] using hcompleteMap + +/-- The completed-unramified Witt fraction field, packaged with its actual +complete rank-one discrete valuation. -/ +noncomputable def padicCompletedUnramifiedCompleteDVF + (p : ℕ) [Fact p.Prime] : + CompleteDVF (padicCompletedUnramifiedField p) where + ValueGroup := ℤᵐ⁰ + valuation := padicCompletedUnramifiedValuation p + instCompleteDiscrete := + { isRankOneDiscrete := inferInstance + isAdicComplete := + padicCompletedUnramifiedValuation_isAdicComplete p } + +private theorem + padicCompletedUnramifiedWittRing_intValuation_frobenius + (p : ℕ) [Fact p.Prime] + (x : padicCompletedUnramifiedWittRing p) : + (IsDiscreteValuationRing.maximalIdeal + (padicCompletedUnramifiedWittRing p)).intValuation + (WittVector.frobenius x) = + (IsDiscreteValuationRing.maximalIdeal + (padicCompletedUnramifiedWittRing p)).intValuation x := by + let W := padicCompletedUnramifiedWittRing p + let v := IsDiscreteValuationRing.maximalIdeal W + by_cases hx : x = 0 + · subst x + simp + obtain ⟨m, u, hxu⟩ := + WittVector.exists_eq_pow_p_mul' x hx + have hu : v.intValuation (u : W) = 1 := by + apply + IsDedekindDomain.HeightOneSpectrum.intValuation_eq_one_iff.mpr + change (u : W) ∉ IsLocalRing.maximalIdeal W + intro hmem + rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] at hmem + exact hmem u.isUnit + have hfuUnit : + IsUnit (WittVector.frobenius (u : W)) := + u.isUnit.map WittVector.frobenius + have hfu : + v.intValuation (WittVector.frobenius (u : W)) = 1 := by + apply + IsDedekindDomain.HeightOneSpectrum.intValuation_eq_one_iff.mpr + change + WittVector.frobenius (u : W) ∉ + IsLocalRing.maximalIdeal W + intro hmem + rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] at hmem + exact hmem hfuUnit + rw [hxu] + calc + v.intValuation + (WittVector.frobenius + ((p : W) ^ m * (u : W))) = + v.intValuation + ((p : W) ^ m * WittVector.frobenius (u : W)) := by + rw [map_mul, map_pow, map_natCast] + _ = + v.intValuation (p : W) ^ m * + v.intValuation (WittVector.frobenius (u : W)) := by + rw [map_mul, map_pow] + _ = v.intValuation (p : W) ^ m := by + rw [hfu, mul_one] + _ = + v.intValuation (p : W) ^ m * + v.intValuation (u : W) := by + rw [hu, mul_one] + _ = v.intValuation ((p : W) ^ m * (u : W)) := by + rw [map_mul, map_pow] + +private theorem padicIntToCompletedUnramifiedWittRing_injective + (p : ℕ) [Fact p.Prime] : + Function.Injective (padicIntToCompletedUnramifiedWittRing p) := by + exact + (WittVector.map_injective + (algebraMap (ZMod p) (AlgebraicClosure (ZMod p))) + (algebraMap (ZMod p) (AlgebraicClosure (ZMod p))).injective).comp + (WittVector.equiv p).symm.injective + +/-- The canonical `ℚ_[p]`-algebra structure obtained by extending +`ℤ_[p] → W(AlgebraicClosure (ZMod p))` to fraction fields. -/ +noncomputable instance padicCompletedUnramifiedFieldAlgebra + (p : ℕ) [Fact p.Prime] : + Algebra ℚ_[p] (padicCompletedUnramifiedField p) := by + let g : ℤ_[p] →+* padicCompletedUnramifiedField p := + (algebraMap (padicCompletedUnramifiedWittRing p) + (padicCompletedUnramifiedField p)).comp + (padicIntToCompletedUnramifiedWittRing p) + exact (IsFractionRing.lift (g := g) (by + exact (IsFractionRing.injective + (padicCompletedUnramifiedWittRing p) + (padicCompletedUnramifiedField p)).comp + (padicIntToCompletedUnramifiedWittRing_injective p))).toAlgebra + +/-- The canonical field embedding agrees with the original Witt-ring map +on p-adic integers. -/ +theorem padicCompletedUnramifiedField_algebraMap_padicInt + (p : ℕ) [Fact p.Prime] (z : ℤ_[p]) : + algebraMap ℚ_[p] (padicCompletedUnramifiedField p) + (algebraMap ℤ_[p] ℚ_[p] z) = + algebraMap (padicCompletedUnramifiedWittRing p) + (padicCompletedUnramifiedField p) + (padicIntToCompletedUnramifiedWittRing p z) := by + change IsFractionRing.lift _ (algebraMap ℤ_[p] ℚ_[p] z) = _ + exact IsFractionRing.lift_algebraMap _ z + +/-- The canonical map from the valuation ring of `ℚ_[p]` into the valuation +ring of the completed-unramified field. -/ +noncomputable def padicCompletedUnramifiedIntegerMap + (p : ℕ) [Fact p.Prime] : + (padicLocalField p).valuationSubring →+* + (padicCompletedUnramifiedCompleteDVF p).valuationSubring := + (padicCompletedUnramifiedWittRingEquivValuationSubring p).toRingHom.comp + (padicValuationSubringToCompletedUnramifiedWittRing p) + +/-- After coercion to fraction fields, the completed-unramified integer map +is the canonical `ℚ_[p]`-algebra map. -/ +@[simp] +theorem padicCompletedUnramifiedIntegerMap_coe + (p : ℕ) [Fact p.Prime] + (z : (padicLocalField p).valuationSubring) : + ((padicCompletedUnramifiedIntegerMap p z : + (padicCompletedUnramifiedCompleteDVF p).valuationSubring) : + padicCompletedUnramifiedField p) = + algebraMap ℚ_[p] (padicCompletedUnramifiedField p) (z : ℚ_[p]) := by + let a : ℤ_[p] := (padicIntEquivValuationSubring p).symm z + have hz : padicIntEquivValuationSubring p a = z := + (padicIntEquivValuationSubring p).apply_symm_apply z + rw [← hz] + change + (((padicCompletedUnramifiedWittRingEquivValuationSubring p) + (padicValuationSubringToCompletedUnramifiedWittRing p + (padicIntEquivValuationSubring p a)) : + (padicCompletedUnramifiedCompleteDVF p).valuationSubring) : + padicCompletedUnramifiedField p) = + algebraMap ℚ_[p] (padicCompletedUnramifiedField p) + (algebraMap ℤ_[p] ℚ_[p] a) + have hsource : + padicValuationSubringToCompletedUnramifiedWittRing p + (padicIntEquivValuationSubring p a) = + padicIntToCompletedUnramifiedWittRing p a := by + change + padicIntToCompletedUnramifiedWittRing p + ((padicIntEquivValuationSubring p).symm + (padicIntEquivValuationSubring p a)) = + padicIntToCompletedUnramifiedWittRing p a + rw [RingEquiv.symm_apply_apply] + rw [hsource] + change + algebraMap (padicCompletedUnramifiedWittRing p) + (padicCompletedUnramifiedField p) + (padicIntToCompletedUnramifiedWittRing p a) = + algebraMap ℚ_[p] (padicCompletedUnramifiedField p) + (algebraMap ℤ_[p] ℚ_[p] a) + exact (padicCompletedUnramifiedField_algebraMap_padicInt p a).symm + +/-- The canonical integer map identifies the maximal ideal of `ℚ_[p]` with +the maximal ideal of the completed-unramified valuation ring. -/ +theorem padicCompletedUnramifiedIntegerMap_map_maximalIdeal + (p : ℕ) [Fact p.Prime] : + Ideal.map (padicCompletedUnramifiedIntegerMap p) + (padicLocalField p).maximalIdeal = + (padicCompletedUnramifiedCompleteDVF p).maximalIdeal := by + let W := padicCompletedUnramifiedWittRing p + let e : W ≃+* + (padicCompletedUnramifiedCompleteDVF p).valuationSubring := + padicCompletedUnramifiedWittRingEquivValuationSubring p + have hπ : + (padicLocalField p).toCompleteDVF.valuation.IsUniformizer + ((padicIntEquivValuationSubring p (p : ℤ_[p]) : + (padicLocalField p).valuationSubring) : ℚ_[p]) := by + change (padicDVRValuation p).IsUniformizer + ((padicIntEquivValuationSubring p (p : ℤ_[p]) : + (padicDVRValuation p).valuationSubring) : ℚ_[p]) + simpa using padicDVRValuation_isUniformizer_p p + have hW : + Ideal.map + (padicValuationSubringToCompletedUnramifiedWittRing p) + (padicLocalField p).maximalIdeal = + IsLocalRing.maximalIdeal W := by + change + Ideal.map + (padicValuationSubringToCompletedUnramifiedWittRing p) + (padicLocalField p).toCompleteDVF.maximalIdeal = + IsLocalRing.maximalIdeal W + rw [(padicLocalField p).toCompleteDVF.maximalIdeal_eq_span_uniformizer hπ, + padicCompletedUnramifiedWittRing_maximalIdeal, + Ideal.map_span] + exact congrArg (Ideal.span : Set W → Ideal W) + ((Set.image_singleton + (f := padicValuationSubringToCompletedUnramifiedWittRing p) + (a := show (padicLocalField p).valuationSubring from + padicIntEquivValuationSubring p (p : ℤ_[p]))).trans + (congrArg (fun x : W => ({x} : Set W)) + (padicValuationSubringToCompletedUnramifiedWittRing_uniformizer p))) + change + Ideal.map + (e.toRingHom.comp + (padicValuationSubringToCompletedUnramifiedWittRing p)) + (padicLocalField p).maximalIdeal = + IsLocalRing.maximalIdeal + (padicCompletedUnramifiedCompleteDVF p).valuationSubring + calc + Ideal.map + (e.toRingHom.comp + (padicValuationSubringToCompletedUnramifiedWittRing p)) + (padicLocalField p).maximalIdeal = + Ideal.map e.toRingHom + (Ideal.map + (padicValuationSubringToCompletedUnramifiedWittRing p) + (padicLocalField p).maximalIdeal) := + (Ideal.map_map + (padicValuationSubringToCompletedUnramifiedWittRing p) + e.toRingHom).symm + _ = Ideal.map e.toRingHom (IsLocalRing.maximalIdeal W) := by + rw [hW] + _ = + IsLocalRing.maximalIdeal + (padicCompletedUnramifiedCompleteDVF p).valuationSubring := + ValuationTheory.ringEquiv_map_maximalIdeal e + +/-- The canonical valuation on the completed-unramified coefficient field +extends the p-adic valuation. This is obtained from the actual local map of +valuation rings, rather than postulated as part of the completed field +structure. -/ +theorem padicCompletedUnramifiedValuation_hasExtension + (p : ℕ) [Fact p.Prime] : + (padicLocalField p).toCompleteDVF.valuation.HasExtension + (padicCompletedUnramifiedCompleteDVF p).valuation := by + let f := padicCompletedUnramifiedIntegerMap p + let : IsLocalHom f := by + apply ((IsLocalRing.local_hom_TFAE f).out 3 1).mp + rw [padicCompletedUnramifiedIntegerMap_map_maximalIdeal] + exact + valuation_hasExtension_of_local_valuationSubring_map + (padicLocalField p).toCompleteDVF + (padicCompletedUnramifiedCompleteDVF p) + f + (padicCompletedUnramifiedIntegerMap_coe p) + +/-- Typeclass form of +`padicCompletedUnramifiedValuation_hasExtension`. -/ +noncomputable instance + padicCompletedUnramifiedValuation_hasExtensionInstance + (p : ℕ) [Fact p.Prime] : + (padicLocalField p).toCompleteDVF.valuation.HasExtension + (padicCompletedUnramifiedCompleteDVF p).valuation := + padicCompletedUnramifiedValuation_hasExtension p + +/-- Mathlib's Witt-vector fraction-field Frobenius, regarded over the +canonical p-adic base field. -/ +noncomputable def padicCompletedUnramifiedFrobenius + (p : ℕ) [Fact p.Prime] : + padicCompletedUnramifiedField p ≃ₐ[ℚ_[p]] + padicCompletedUnramifiedField p := by + let k := AlgebraicClosure (ZMod p) + let W := padicCompletedUnramifiedWittRing p + let E := padicCompletedUnramifiedField p + let φ : E ≃+* E := + IsFractionRing.ringEquivOfRingEquiv + (WittVector.frobeniusEquiv p k) + refine + { __ := φ + commutes' := ?_ } + intro x + have h : + φ.toRingHom.comp (algebraMap ℚ_[p] E) = + algebraMap ℚ_[p] E := by + apply IsFractionRing.ringHom_ext (A := ℤ_[p]) + intro z + rw [RingHom.comp_apply, + padicCompletedUnramifiedField_algebraMap_padicInt] + dsimp only [φ] + change + IsFractionRing.ringEquivOfRingEquiv + (WittVector.frobeniusEquiv p k) + (algebraMap W E + (padicIntToCompletedUnramifiedWittRing p z)) = + algebraMap W E + (padicIntToCompletedUnramifiedWittRing p z) + rw [IsFractionRing.ringEquivOfRingEquiv_algebraMap] + change + algebraMap W E + (WittVector.frobenius + (padicIntToCompletedUnramifiedWittRing p z)) = + algebraMap W E + (padicIntToCompletedUnramifiedWittRing p z) + rw [padicIntToCompletedUnramifiedWittRing_frobenius] + exact RingHom.congr_fun h x + +/-- On the Witt integer ring, the field Frobenius is exactly mathlib's +Witt-vector Frobenius. -/ +@[simp] +theorem padicCompletedUnramifiedFrobenius_algebraMap_witt + (p : ℕ) [Fact p.Prime] + (x : padicCompletedUnramifiedWittRing p) : + padicCompletedUnramifiedFrobenius p + (algebraMap (padicCompletedUnramifiedWittRing p) + (padicCompletedUnramifiedField p) x) = + algebraMap (padicCompletedUnramifiedWittRing p) + (padicCompletedUnramifiedField p) + (WittVector.frobenius x) := by + unfold padicCompletedUnramifiedFrobenius + change + IsFractionRing.ringEquivOfRingEquiv + (WittVector.frobeniusEquiv p + (AlgebraicClosure (ZMod p))) + (algebraMap (padicCompletedUnramifiedWittRing p) + (padicCompletedUnramifiedField p) x) = + algebraMap (padicCompletedUnramifiedWittRing p) + (padicCompletedUnramifiedField p) + (WittVector.frobenius x) + rw [IsFractionRing.ringEquivOfRingEquiv_algebraMap] + rfl + +/-- Witt Frobenius preserves the canonical discrete valuation on the +completed-unramified coefficient field. -/ +@[simp] +theorem padicCompletedUnramifiedFrobenius_valuation + (p : ℕ) [Fact p.Prime] + (x : padicCompletedUnramifiedField p) : + padicCompletedUnramifiedValuation p + (padicCompletedUnramifiedFrobenius p x) = + padicCompletedUnramifiedValuation p x := by + let W := padicCompletedUnramifiedWittRing p + let E := padicCompletedUnramifiedField p + let v := IsDiscreteValuationRing.maximalIdeal W + rcases IsFractionRing.div_surjective (A := W) x with + ⟨a, b, _hb, rfl⟩ + change + v.valuation E + (padicCompletedUnramifiedFrobenius p + (algebraMap W E a / algebraMap W E b)) = + v.valuation E + (algebraMap W E a / algebraMap W E b) + rw [map_div₀ (padicCompletedUnramifiedFrobenius p), + padicCompletedUnramifiedFrobenius_algebraMap_witt, + padicCompletedUnramifiedFrobenius_algebraMap_witt] + change + v.valuation E + (algebraMap W E (WittVector.frobenius a) / + algebraMap W E (WittVector.frobenius b)) = + v.valuation E (algebraMap W E a / algebraMap W E b) + calc + v.valuation E + (algebraMap W E (WittVector.frobenius a) / + algebraMap W E (WittVector.frobenius b)) = + v.intValuation (WittVector.frobenius a) / + v.intValuation (WittVector.frobenius b) := by + rw [(v.valuation E).map_div, + v.valuation_of_algebraMap (K := E), + v.valuation_of_algebraMap (K := E)] + _ = v.intValuation a / v.intValuation b := by + rw [padicCompletedUnramifiedWittRing_intValuation_frobenius, + padicCompletedUnramifiedWittRing_intValuation_frobenius] + _ = v.valuation E + (algebraMap W E a / algebraMap W E b) := by + rw [(v.valuation E).map_div, + v.valuation_of_algebraMap (K := E), + v.valuation_of_algebraMap (K := E)] + +/-- Witt Frobenius is continuous for the canonical valuation topology on +the completed-unramified coefficient field. -/ +theorem padicCompletedUnramifiedFrobenius_continuous + (p : ℕ) [Fact p.Prime] : + Continuous (padicCompletedUnramifiedFrobenius p) := by + apply continuous_of_continuousAt_zero + (padicCompletedUnramifiedFrobenius p).toAddMonoidHom + simp_rw [ContinuousAt, map_zero, + (Valued.hasBasis_nhds_zero + (padicCompletedUnramifiedField p) ℤᵐ⁰).tendsto_iff + (Valued.hasBasis_nhds_zero + (padicCompletedUnramifiedField p) ℤᵐ⁰), + true_and, forall_const] + intro γ + refine ⟨γ, fun x hx ↦ ?_⟩ + change + (Valued.v : + Valuation (padicCompletedUnramifiedField p) ℤᵐ⁰).restrict + (padicCompletedUnramifiedFrobenius p x) < γ.1 + change + (Valued.v : + Valuation (padicCompletedUnramifiedField p) ℤᵐ⁰).restrict + x < γ.1 at hx + rw [Valuation.restrict_lt_iff_lt_embedding] at hx ⊢ + change + padicCompletedUnramifiedValuation p + (padicCompletedUnramifiedFrobenius p x) < + MonoidWithZeroHom.ValueGroup₀.embedding + (f := (.ofClass + (padicCompletedUnramifiedValuation p))) γ.1 + change + padicCompletedUnramifiedValuation p x < + MonoidWithZeroHom.ValueGroup₀.embedding + (f := (.ofClass + (padicCompletedUnramifiedValuation p))) γ.1 at hx + rw [padicCompletedUnramifiedFrobenius_valuation] + exact hx + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedFrobeniusFixed.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedFrobeniusFixed.lean new file mode 100644 index 0000000000..bf382e200e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedFrobeniusFixed.lean @@ -0,0 +1,217 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Finite.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedField +/-! +# Fixed points of p-adic completed-unramified Frobenius + +Witt Frobenius on `W(AlgebraicClosure (ZMod p))` has exactly the canonical +copy of `ℤ_[p]` as its fixed ring. Passing to fraction fields shows that +the arithmetic Frobenius on the completed maximal-unramified coefficient +field has exactly the canonical copy of `ℚ_[p]` as its fixed field. + +The fraction-field argument is integral: after writing a denominator as a +power of `p` times a unit, multiplication by that power of `p` puts a fixed +fraction back in the Witt ring. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp + +/-- The fixed ring of Witt Frobenius on the completed-unramified Witt +ring is the canonical image of the p-adic integers. -/ +theorem padicCompletedUnramifiedWittRing_frobenius_fixed_iff + (p : ℕ) [Fact p.Prime] + (x : padicCompletedUnramifiedWittRing p) : + WittVector.frobenius x = x ↔ + ∃ z : ℤ_[p], + padicIntToCompletedUnramifiedWittRing p z = x := by + constructor + · intro hx + have hcoeffPow (n : ℕ) : + (x.coeff n) ^ p = x.coeff n := by + rw [← WittVector.coeff_frobenius_charP] + exact congrArg (fun y : padicCompletedUnramifiedWittRing p ↦ y.coeff n) hx + have hcoeffInt (n : ℕ) : + ∃ a : ℤ, (a : AlgebraicClosure (ZMod p)) = x.coeff n := by + apply + (mem_bot_iff_intCast p (AlgebraicClosure (ZMod p))).1 + exact + (Subfield.mem_bot_iff_pow_eq_self + (AlgebraicClosure (ZMod p)) p).2 + (hcoeffPow n) + let c : ℕ → ℤ := fun n ↦ Classical.choose (hcoeffInt n) + let y : WittVector p (ZMod p) := + WittVector.mk p (fun n ↦ (c n : ZMod p)) + refine ⟨WittVector.equiv p y, ?_⟩ + apply WittVector.ext + intro n + change + (WittVector.map + (algebraMap (ZMod p) (AlgebraicClosure (ZMod p))) + ((WittVector.equiv p).symm (WittVector.equiv p y))).coeff n = + x.coeff n + rw [WittVector.map_coeff, RingEquiv.symm_apply_apply] + change + algebraMap (ZMod p) (AlgebraicClosure (ZMod p)) + (c n : ZMod p) = x.coeff n + calc + _ = (c n : AlgebraicClosure (ZMod p)) := by + simp only [map_intCast] + _ = x.coeff n := by + simpa only [c] using + (Classical.choose_spec (hcoeffInt n)) + · rintro ⟨z, rfl⟩ + exact padicIntToCompletedUnramifiedWittRing_frobenius p z + +/-- The fixed field of completed-unramified arithmetic Frobenius is the +canonical image of `ℚ_[p]`. -/ +theorem padicCompletedUnramifiedFrobenius_fixed_iff + (p : ℕ) [Fact p.Prime] + (x : padicCompletedUnramifiedField p) : + padicCompletedUnramifiedFrobenius p x = x ↔ + ∃ q : ℚ_[p], + algebraMap ℚ_[p] (padicCompletedUnramifiedField p) q = x := by + let W := padicCompletedUnramifiedWittRing p + let E := padicCompletedUnramifiedField p + let φ := padicCompletedUnramifiedFrobenius p + constructor + · intro hx + obtain ⟨a, b, hb, hab⟩ := + IsFractionRing.div_surjective (A := W) x + have hb0 : b ≠ 0 := nonZeroDivisors.ne_zero hb + obtain ⟨m, u, hbu⟩ := + WittVector.exists_eq_pow_p_mul' b hb0 + let c : W := a * (u⁻¹ : Wˣ) + have hpW : (p : W) ≠ 0 := by + exact + WittVector.p_nonzero p + (AlgebraicClosure (ZMod p)) + have hpE : + algebraMap W E ((p : W) ^ m) ≠ 0 := by + simpa only [map_zero] using + (IsFractionRing.injective W E).ne + (pow_ne_zero m hpW) + have huE : + algebraMap W E (u : W) ≠ 0 := by + simpa only [map_zero] using + (IsFractionRing.injective W E).ne u.ne_zero + have hbE : + algebraMap W E b ≠ 0 := by + simpa only [map_zero] using + (IsFractionRing.injective W E).ne hb0 + have hclear : + algebraMap W E c = + algebraMap W E ((p : W) ^ m) * x := by + rw [show + algebraMap W E c = + algebraMap W E a * + (algebraMap W E (u : W))⁻¹ by + simp only [c, map_mul, map_units_inv]] + rw [← div_eq_mul_inv] + apply (div_eq_iff huE).2 + have habMul : + algebraMap W E a = + x * algebraMap W E b := + (div_eq_iff hbE).1 hab + rw [hbu, map_mul] at habMul + calc + algebraMap W E a = + x * + (algebraMap W E ((p : W) ^ m) * + algebraMap W E (u : W)) := + habMul + _ = + (algebraMap W E ((p : W) ^ m) * x) * + algebraMap W E (u : W) := by + ac_rfl + have hpBase : + algebraMap W E (p : W) = + algebraMap ℚ_[p] E (p : ℚ_[p]) := by + calc + algebraMap W E (p : W) = + algebraMap W E + (padicIntToCompletedUnramifiedWittRing p + (p : ℤ_[p])) := by + exact congrArg (algebraMap W E) + (map_natCast + (padicIntToCompletedUnramifiedWittRing p) p).symm + _ = + algebraMap ℚ_[p] E + (algebraMap ℤ_[p] ℚ_[p] (p : ℤ_[p])) := + (padicCompletedUnramifiedField_algebraMap_padicInt + p (p : ℤ_[p])).symm + _ = algebraMap ℚ_[p] E (p : ℚ_[p]) := by + exact congrArg (algebraMap ℚ_[p] E) + (map_natCast (algebraMap ℤ_[p] ℚ_[p]) p) + have hpowBridge : + algebraMap W E ((p : W) ^ m) = + (p : E) ^ m := by + calc + algebraMap W E ((p : W) ^ m) = + (algebraMap W E (p : W)) ^ m := + map_pow (algebraMap W E) (p : W) m + _ = (algebraMap ℚ_[p] E (p : ℚ_[p])) ^ m := by + rw [hpBase] + _ = (p : E) ^ m := by + rw [map_natCast] + have hpowFixed : + φ (algebraMap W E ((p : W) ^ m)) = + algebraMap W E ((p : W) ^ m) := by + have hbase : + algebraMap W E ((p : W) ^ m) = + algebraMap ℚ_[p] E ((p : ℚ_[p]) ^ m) := by + calc + algebraMap W E ((p : W) ^ m) = + (p : E) ^ m := + hpowBridge + _ = + algebraMap ℚ_[p] E ((p : ℚ_[p]) ^ m) := by + rw [map_pow, map_natCast] + rw [hbase] + exact φ.commutes ((p : ℚ_[p]) ^ m) + have hcFieldFixed : + φ (algebraMap W E c) = algebraMap W E c := by + rw [hclear, map_mul, hpowFixed, hx] + have hcFixed : WittVector.frobenius c = c := by + apply IsFractionRing.injective W E + rw [← padicCompletedUnramifiedFrobenius_algebraMap_witt] + exact hcFieldFixed + obtain ⟨z, hz⟩ := + (padicCompletedUnramifiedWittRing_frobenius_fixed_iff + p c).1 hcFixed + refine + ⟨algebraMap ℤ_[p] ℚ_[p] z / (p : ℚ_[p]) ^ m, ?_⟩ + rw [map_div₀ (algebraMap ℚ_[p] E), + padicCompletedUnramifiedField_algebraMap_padicInt] + simp only [map_pow, map_natCast] + have hpE' : (p : E) ^ m ≠ 0 := by + rw [← hpowBridge] + exact hpE + have hclear' : + algebraMap W E c = + (p : E) ^ m * x := by + rw [← hpowBridge] + exact hclear + rw [hz] + exact (div_eq_iff hpE').2 (by + simpa only [mul_comm] using hclear') + · rintro ⟨q, rfl⟩ + exact (padicCompletedUnramifiedFrobenius p).commutes q + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation.lean new file mode 100644 index 0000000000..e2721823cb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedCoefficientEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedPrimitivePoint +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedScalarEndomorphism +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelPrimitiveRoot + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/All.lean new file mode 100644 index 0000000000..8e30b447df --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/All.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedCoefficientEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedPrimitivePoint +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedScalarEndomorphism +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelPrimitiveRoot + +/-! # All -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedCoefficientEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedCoefficientEvaluation.lean new file mode 100644 index 0000000000..ac6f2ed63b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedCoefficientEvaluation.lean @@ -0,0 +1,414 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedLevel +public import Mathlib.RingTheory.AdicCompletion.Topology +/-! +# Coefficient maps and analytic evaluation on completed p-adic levels + +This module equips completed Lubin--Tate levels with the direct p-adic +coefficient maps used by polynomial and power-series evaluation. It also +establishes the exact completed primitive-point torsion relations and the +general injectivity criterion for evaluation with unit linear coefficient. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open ValuationTheory.DiscreteValuationField +open SameUniformizer + +/-- The discrete Witt-vector coefficient uniformity used for completed evaluation. -/ +noncomputable local instance (priority := 50) + padicCompletedMultiplicativeWittUniformSpace + (p : ℕ) [Fact p.Prime] : + UniformSpace (padicCompletedUnramifiedWittRing p) := + ⊥ + +/-- The maximal-ideal adic structure on a completed Lubin--Tate level. -/ +noncomputable local instance + padicCompletedMultiplicativeTargetWithIdeal + (p : ℕ) [Fact p.Prime] (n : ℕ) : + WithIdeal + (padicCompletedLevelCompleteDVF p n).valuationSubring where + i := (padicCompletedLevelCompleteDVF p n).maximalIdeal + +/-- Completeness of the completed-level valuation ring for its adic topology. -/ +noncomputable local instance + padicCompletedMultiplicativeTargetCompleteSpace + (p : ℕ) [Fact p.Prime] (n : ℕ) : + CompleteSpace + (padicCompletedLevelCompleteDVF p n).valuationSubring := by + let target := padicCompletedLevelCompleteDVF p n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).1 + +/-- Separatedness of the completed-level valuation ring for its adic topology. -/ +noncomputable local instance + padicCompletedMultiplicativeTargetT2Space + (p : ℕ) [Fact p.Prime] (n : ℕ) : + T2Space + (padicCompletedLevelCompleteDVF p n).valuationSubring := by + let target := padicCompletedLevelCompleteDVF p n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).2 + +/-- The completed Lubin--Tate level as an algebra over the original p-adic +base field, through the completed unramified coefficient field. -/ +noncomputable instance padicCompletedLevelFieldPadicAlgebra + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Algebra ℚ_[p] (padicCompletedLevelField p n) := + ((algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n)).comp + (algebraMap ℚ_[p] (padicCompletedUnramifiedField p))).toAlgebra + +instance padicCompletedLevelField_padicScalarTower + (p : ℕ) [Fact p.Prime] (n : ℕ) : + IsScalarTower ℚ_[p] (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) := + IsScalarTower.of_algebraMap_eq' rfl + +/-- The canonical coefficient map from the p-adic valuation ring directly +into the field underlying a completed Lubin--Tate level. -/ +noncomputable def padicCompletedLevelPadicFieldCoefficientHom + (p : ℕ) [Fact p.Prime] (n : ℕ) : + (padicLocalField p).valuationSubring →+* + padicCompletedLevelField p n := + ((algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n)).comp + (algebraMap ℚ_[p] (padicCompletedUnramifiedField p))).comp + (algebraMap (padicLocalField p).valuationSubring ℚ_[p]) + +/-- The same p-adic coefficient map with codomain restricted to the +valuation ring of the completed level. -/ +noncomputable def padicCompletedLevelPadicIntegerCoefficientHom + (p : ℕ) [Fact p.Prime] (n : ℕ) : + (padicLocalField p).valuationSubring →+* + (padicCompletedLevelCompleteDVF p n).valuationSubring := + (padicCompletedLevelWittCoefficientHom p n).comp + (padicValuationSubringToCompletedUnramifiedWittRing p) + +/-- Coercing the integral p-adic coefficient map to the completed-level +field gives the canonical field-valued coefficient map. -/ +@[simp] +theorem padicCompletedLevelPadicIntegerCoefficientHom_coe + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : (padicLocalField p).valuationSubring) : + ((padicCompletedLevelPadicIntegerCoefficientHom p n a : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) = + padicCompletedLevelPadicFieldCoefficientHom p n a := by + rw [padicCompletedLevelPadicIntegerCoefficientHom, + RingHom.comp_apply, + padicCompletedLevelWittCoefficientHom_apply] + change + algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + (algebraMap (padicCompletedUnramifiedWittRing p) + (padicCompletedUnramifiedField p) + (padicValuationSubringToCompletedUnramifiedWittRing p a)) = + padicCompletedLevelPadicFieldCoefficientHom p n a + let z : ℤ_[p] := (padicIntEquivValuationSubring p).symm a + have ha : padicIntEquivValuationSubring p z = a := + (padicIntEquivValuationSubring p).apply_symm_apply a + rw [← ha] + rw [show + padicValuationSubringToCompletedUnramifiedWittRing p + (padicIntEquivValuationSubring p z) = + padicIntToCompletedUnramifiedWittRing p z by + change + padicIntToCompletedUnramifiedWittRing p + ((padicIntEquivValuationSubring p).symm + (padicIntEquivValuationSubring p z)) = + padicIntToCompletedUnramifiedWittRing p z + rw [RingEquiv.symm_apply_apply]] + change + algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + (algebraMap (padicCompletedUnramifiedWittRing p) + (padicCompletedUnramifiedField p) + (padicIntToCompletedUnramifiedWittRing p z)) = + algebraMap (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) + (algebraMap ℚ_[p] (padicCompletedUnramifiedField p) + (algebraMap ℤ_[p] ℚ_[p] z)) + rw [padicCompletedUnramifiedField_algebraMap_padicInt] + +/-- Polynomial evaluation through the integral coefficient map agrees, +after coercion, with evaluation through the field coefficient map. -/ +theorem padicCompletedLevelPadicIntegerPolynomialEval_coe + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (P : Polynomial (padicLocalField p).valuationSubring) : + ((Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) x P : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) = + Polynomial.eval₂ + (padicCompletedLevelPadicFieldCoefficientHom p n) + (x : padicCompletedLevelField p n) P := by + let target := padicCompletedLevelCompleteDVF p n + let i : target.valuationSubring →+* + padicCompletedLevelField p n := + target.valuation.valuationSubring.subtype + have hcomp : + i.comp (padicCompletedLevelPadicIntegerCoefficientHom p n) = + padicCompletedLevelPadicFieldCoefficientHom p n := by + ext a + exact padicCompletedLevelPadicIntegerCoefficientHom_coe p n a + change + i (Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) x P) = + Polynomial.eval₂ + (padicCompletedLevelPadicFieldCoefficientHom p n) (i x) P + rw [Polynomial.hom_eval₂, hcomp] + +private theorem padicCompletedPrimitiveRoot_standardPrimitivePolynomial + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Polynomial.eval₂ + (padicCompletedLevelPadicFieldCoefficientHom p n) + (padicCompletedPrimitiveRoot p n) + (standardLubinTatePrimitivePolynomial + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) n) = + 0 := by + have hroot := padicCompletedPrimitiveRoot_isRoot p n + simpa [Polynomial.IsRoot, padicCompletedPrimitivePolynomial, + standardLubinTatePrimitivePolynomialOverField, + padicCompletedLevelPadicFieldCoefficientHom, + Polynomial.eval_map, Polynomial.eval₂_map] using hroot + +/-- The chosen primitive point in the completed level is killed by the +`n + 1`-fold standard p-adic Lubin--Tate iterate. -/ +theorem padicCompletedPrimitiveRoot_iterate_succ_eq_zero + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Polynomial.eval₂ + (padicCompletedLevelPadicFieldCoefficientHom p n) + (padicCompletedPrimitiveRoot p n) + (standardLubinTatePolynomialIterate + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) (n + 1)) = + 0 := by + let F := padicLocalField p + let π : (padicLocalField p).valuationSubring := + padicIntEquivValuationSubring p (p : ℤ_[p]) + let φ := padicCompletedLevelPadicFieldCoefficientHom p n + let x := padicCompletedPrimitiveRoot p n + have hfactor := + congrArg (Polynomial.eval₂ φ x) + (standardLubinTatePolynomialIterate_succ_factor F π n) + rw [Polynomial.eval₂_mul, + padicCompletedPrimitiveRoot_standardPrimitivePolynomial p n, + mul_zero] at hfactor + simpa only [F, π, φ, x] using hfactor + +/-- The chosen completed primitive point is not killed one level early. -/ +theorem padicCompletedPrimitiveRoot_iterate_ne_zero + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Polynomial.eval₂ + (padicCompletedLevelPadicFieldCoefficientHom p n) + (padicCompletedPrimitiveRoot p n) + (standardLubinTatePolynomialIterate + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) n) ≠ + 0 := by + let F := padicLocalField p + let π : (padicLocalField p).valuationSubring := + padicIntEquivValuationSubring p (p : ℤ_[p]) + let E := padicCompletedUnramifiedField p + let L := padicCompletedLevelField p n + let φK : ℚ_[p] →+* L := + (algebraMap E L).comp (algebraMap ℚ_[p] E) + let φO : F.valuationSubring →+* L := + φK.comp (algebraMap F.valuationSubring ℚ_[p]) + let x := padicCompletedPrimitiveRoot p n + intro hzero + have hroot := padicCompletedPrimitiveRoot_isRoot p n + have hrootField : + Polynomial.eval₂ φK x + (standardLubinTatePrimitivePolynomialOverField F π n) = + 0 := by + simpa [Polynomial.IsRoot, padicCompletedPrimitivePolynomial, + Polynomial.eval_map, Polynomial.eval₂_map, F, π, E, L, φK, x] using + hroot + have hequation : + Polynomial.eval₂ φO x + (standardLubinTatePolynomialIterate F π n) ^ + (Nat.card F.residueField - 1) + + φK (π : ℚ_[p]) = + 0 := by + calc + _ = + Polynomial.eval₂ φK x + (standardLubinTatePrimitivePolynomialOverField F π n) := by + symm + exact + standardLubinTatePrimitivePolynomialOverField_eval₂ + F π φK n x + _ = 0 := hrootField + have hzero' : + Polynomial.eval₂ φO x + (standardLubinTatePolynomialIterate F π n) = + 0 := by + simpa only [φO, φK, F, π, E, L, x, + padicCompletedLevelPadicFieldCoefficientHom] using hzero + rw [hzero', zero_pow, zero_add] at hequation + · apply (padicMultiplicativeLubinTateSeries_isUniformizer p).ne_zero + apply φK.injective + simpa only [F, π, map_zero] using hequation + · exact Nat.sub_ne_zero_of_lt + (Finite.one_lt_card : 1 < Nat.card F.residueField) + +/-- Integral form of the exact completed primitive-point torsion +relation at level `n + 1`. -/ +theorem padicCompletedPrimitiveRootInteger_iterate_succ_eq_zero + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) + (padicCompletedPrimitiveRootInteger p n) + (standardLubinTatePolynomialIterate + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) (n + 1)) = + 0 := by + apply Subtype.ext + change + ((Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) + (padicCompletedPrimitiveRootInteger p n) + (standardLubinTatePolynomialIterate + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) (n + 1)) : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) = + 0 + rw [padicCompletedLevelPadicIntegerPolynomialEval_coe] + exact padicCompletedPrimitiveRoot_iterate_succ_eq_zero p n + +/-- The integral completed primitive point is not killed by the +level-`n` standard iterate. -/ +theorem padicCompletedPrimitiveRootInteger_iterate_ne_zero + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) + (padicCompletedPrimitiveRootInteger p n) + (standardLubinTatePolynomialIterate + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) n) ≠ + 0 := by + intro hzero + apply padicCompletedPrimitiveRoot_iterate_ne_zero p n + have hcoe := congrArg + (fun z : (padicCompletedLevelCompleteDVF p n).valuationSubring => + (z : padicCompletedLevelField p n)) hzero + simpa [map_zero, + padicCompletedLevelPadicIntegerPolynomialEval_coe, + padicCompletedPrimitiveRootInteger_coe] using hcoe + +/-- Completed-level power-series evaluation is independent of the proof +that its evaluation point is topologically nilpotent. -/ +theorem padicCompletedLevelPowerSeriesEval_congr_point + (p : ℕ) [Fact p.Prime] (n : ℕ) + {x y : (padicCompletedLevelCompleteDVF p n).valuationSubring} + (hx : PowerSeries.HasEval x) (hy : PowerSeries.HasEval y) + (hxy : x = y) + (f : PowerSeries (padicCompletedUnramifiedWittRing p)) : + padicCompletedLevelPowerSeriesEval p n x hx f = + padicCompletedLevelPowerSeriesEval p n y hy f := by + subst y + rfl + +/-- A completed-level power-series evaluation with zero constant +coefficient and a unit linear coefficient is injective on convergent points. -/ +theorem + padicCompletedLevelPowerSeriesEval_injective_of_unitLinearCoefficient + (p : ℕ) [Fact p.Prime] (n : ℕ) + (f : PowerSeries (padicCompletedUnramifiedWittRing p)) + (hconstant : PowerSeries.constantCoeff f = 0) + (hlinear : IsUnit (PowerSeries.coeff 1 f)) + {x y : (padicCompletedLevelCompleteDVF p n).valuationSubring} + (hx : PowerSeries.HasEval x) (hy : PowerSeries.HasEval y) + (hxy : + padicCompletedLevelPowerSeriesEval p n x hx f = + padicCompletedLevelPowerSeriesEval p n y hy f) : + x = y := by + let g := f.substInvOfIsUnit hlinear + have hf : PowerSeries.HasSubst f := + PowerSeries.HasSubst.of_constantCoeff_zero' hconstant + have hg : PowerSeries.HasSubst g := by + simpa only [g] using + (PowerSeries.HasSubst.substInvOfIsUnit f hlinear) + let xf := padicCompletedLevelPowerSeriesEval p n x hx f + let yf := padicCompletedLevelPowerSeriesEval p n y hy f + let hxf : PowerSeries.HasEval xf := + padicCompletedLevelPowerSeriesEval_hasEval p n x hx f hf + let hyf : PowerSeries.HasEval yf := + padicCompletedLevelPowerSeriesEval_hasEval p n y hy f hf + let evalInverse : + {z : (padicCompletedLevelCompleteDVF p n).valuationSubring // + PowerSeries.HasEval z} → + (padicCompletedLevelCompleteDVF p n).valuationSubring := + fun z => + padicCompletedLevelPowerSeriesEval p n z.1 z.2 g + let packedX : + {z : (padicCompletedLevelCompleteDVF p n).valuationSubring // + PowerSeries.HasEval z} := + ⟨xf, hxf⟩ + let packedY : + {z : (padicCompletedLevelCompleteDVF p n).valuationSubring // + PowerSeries.HasEval z} := + ⟨yf, hyf⟩ + have hpacked : packedX = packedY := by + apply Subtype.ext + exact hxy + have hxback : evalInverse packedX = x := by + calc + evalInverse packedX = + padicCompletedLevelPowerSeriesEval p n x hx + (PowerSeries.subst f g) := by + exact + (padicCompletedLevelPowerSeriesEval_subst p n x hx + f g hf hxf).symm + _ = + padicCompletedLevelPowerSeriesEval p n x hx + PowerSeries.X := by + rw [show PowerSeries.subst f g = PowerSeries.X by + simpa only [g] using + (PowerSeries.subst_substInvOfIsUnit_left + f hconstant hlinear)] + _ = x := + padicCompletedLevelPowerSeriesEval_X p n x hx + have hyback : evalInverse packedY = y := by + calc + evalInverse packedY = + padicCompletedLevelPowerSeriesEval p n y hy + (PowerSeries.subst f g) := by + exact + (padicCompletedLevelPowerSeriesEval_subst p n y hy + f g hf hyf).symm + _ = + padicCompletedLevelPowerSeriesEval p n y hy + PowerSeries.X := by + rw [show PowerSeries.subst f g = PowerSeries.X by + simpa only [g] using + (PowerSeries.subst_substInvOfIsUnit_left + f hconstant hlinear)] + _ = y := + padicCompletedLevelPowerSeriesEval_X p n y hy + exact hxback.symm.trans + ((congrArg evalInverse hpacked).trans hyback) + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedPrimitivePoint.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedPrimitivePoint.lean new file mode 100644 index 0000000000..3bed3a7b4a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedPrimitivePoint.lean @@ -0,0 +1,370 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedScalarEndomorphism +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer +/-! +# The completed multiplicative primitive point + +This module evaluates the completed multiplicative comparison at the chosen +completed standard primitive point. It proves the exact standard and +changed-uniformizer torsion bounds and constructs the actual unit action on +that point. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open ValuationTheory.DiscreteValuationField +open SameUniformizer + +attribute [local instance 50] + padicCompletedMultiplicativeWittUniformSpace + +attribute [local instance] + padicCompletedMultiplicativeTargetWithIdeal + padicCompletedMultiplicativeTargetCompleteSpace + padicCompletedMultiplicativeTargetT2Space + +/-- The completed multiplicative division point obtained by evaluating the +coefficient-extended comparison at the chosen completed standard primitive +point. -/ +noncomputable def padicCompletedMultiplicativePrimitivePoint + (p : ℕ) [Fact p.Prime] (n : ℕ) : + (padicCompletedLevelCompleteDVF p n).valuationSubring := + padicCompletedLevelPowerSeriesEval p n + (padicCompletedPrimitiveRootInteger p n) + (padicCompletedPrimitiveRootInteger_hasEval p n) + (padicCompletedStandardToMultiplicativeIntertwiner p) + +/-- The completed multiplicative primitive point is topologically +nilpotent, so it is itself a valid power-series evaluation point. -/ +theorem padicCompletedMultiplicativePrimitivePoint_hasEval + (p : ℕ) [Fact p.Prime] (n : ℕ) : + PowerSeries.HasEval + (padicCompletedMultiplicativePrimitivePoint p n) := by + exact + padicCompletedLevelPowerSeriesEval_hasEval p n + (padicCompletedPrimitiveRootInteger p n) + (padicCompletedPrimitiveRootInteger_hasEval p n) + (padicCompletedStandardToMultiplicativeIntertwiner p) + (padicCompletedStandardToMultiplicativeIntertwiner_hasSubst p) + +/-- The actual completed multiplicative primitive point is killed by the +scalar endomorphism for `π ^ (n + 1)`. -/ +theorem + padicCompletedMultiplicativePrimitivePoint_uniformizer_pow_succ_eq_zero + (p : ℕ) [Fact p.Prime] (n : ℕ) : + padicCompletedMultiplicativeScalarEndomorphismValue p n + (padicCompletedMultiplicativePrimitivePoint p n) + (padicCompletedMultiplicativePrimitivePoint_hasEval p n) + ((padicIntEquivValuationSubring p (p : ℤ_[p])) ^ (n + 1)) = + 0 := by + let π : (padicLocalField p).valuationSubring := + padicIntEquivValuationSubring p (p : ℤ_[p]) + change + padicCompletedMultiplicativeScalarEndomorphismValue p n + (padicCompletedMultiplicativePrimitivePoint p n) + (padicCompletedMultiplicativePrimitivePoint_hasEval p n) + (π ^ (n + 1)) = + 0 + have hbridge := + padicCompletedStandardToMultiplicativeIntertwiner_eval_endomorphism + p n + (padicCompletedPrimitiveRootInteger p n) + (padicCompletedPrimitiveRootInteger_hasEval p n) + (π ^ (n + 1)) + have hstandardPoint : + padicCompletedStandardScalarEndomorphismValue p n + (padicCompletedPrimitiveRootInteger p n) + (padicCompletedPrimitiveRootInteger_hasEval p n) + (π ^ (n + 1)) = + 0 := by + have hUniformizer := + padicCompletedStandardScalarEndomorphismValue_uniformizer_pow + p n + (padicCompletedPrimitiveRootInteger p n) + (padicCompletedPrimitiveRootInteger_hasEval p n) + (n + 1) + change + padicCompletedStandardScalarEndomorphismValue p n + (padicCompletedPrimitiveRootInteger p n) + (padicCompletedPrimitiveRootInteger_hasEval p n) + (π ^ (n + 1)) = + Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) + (padicCompletedPrimitiveRootInteger p n) + (standardLubinTatePolynomialIterate + (padicLocalField p) π (n + 1)) at hUniformizer + rw [hUniformizer] + exact padicCompletedPrimitiveRootInteger_iterate_succ_eq_zero p n + have hleftZero : + padicCompletedLevelPowerSeriesEval p n + (padicCompletedStandardScalarEndomorphismValue p n + (padicCompletedPrimitiveRootInteger p n) + (padicCompletedPrimitiveRootInteger_hasEval p n) + (π ^ (n + 1))) + (padicCompletedStandardScalarEndomorphismValue_hasEval p n + (padicCompletedPrimitiveRootInteger p n) + (padicCompletedPrimitiveRootInteger_hasEval p n) + (π ^ (n + 1))) + (padicCompletedStandardToMultiplicativeIntertwiner p) = + 0 := by + calc + _ = + padicCompletedLevelPowerSeriesEval p n + 0 PowerSeries.HasEval.zero + (padicCompletedStandardToMultiplicativeIntertwiner p) := + padicCompletedLevelPowerSeriesEval_congr_point p n + (padicCompletedStandardScalarEndomorphismValue_hasEval p n + (padicCompletedPrimitiveRootInteger p n) + (padicCompletedPrimitiveRootInteger_hasEval p n) + (π ^ (n + 1))) + PowerSeries.HasEval.zero hstandardPoint + (padicCompletedStandardToMultiplicativeIntertwiner p) + _ = 0 := + padicCompletedStandardToMultiplicativeIntertwiner_eval_zero p n + exact hbridge.symm.trans hleftZero + +/-- The actual completed multiplicative primitive point is not killed by +the scalar endomorphism for `π ^ n`. -/ +theorem + padicCompletedMultiplicativePrimitivePoint_uniformizer_pow_ne_zero + (p : ℕ) [Fact p.Prime] (n : ℕ) : + padicCompletedMultiplicativeScalarEndomorphismValue p n + (padicCompletedMultiplicativePrimitivePoint p n) + (padicCompletedMultiplicativePrimitivePoint_hasEval p n) + ((padicIntEquivValuationSubring p (p : ℤ_[p])) ^ n) ≠ + 0 := by + let π : (padicLocalField p).valuationSubring := + padicIntEquivValuationSubring p (p : ℤ_[p]) + change + padicCompletedMultiplicativeScalarEndomorphismValue p n + (padicCompletedMultiplicativePrimitivePoint p n) + (padicCompletedMultiplicativePrimitivePoint_hasEval p n) + (π ^ n) ≠ + 0 + intro hzero + let lambda := padicCompletedPrimitiveRootInteger p n + let hlambda := padicCompletedPrimitiveRootInteger_hasEval p n + let lambdaN := + padicCompletedStandardScalarEndomorphismValue + p n lambda hlambda (π ^ n) + let hlambdaN : PowerSeries.HasEval lambdaN := + padicCompletedStandardScalarEndomorphismValue_hasEval + p n lambda hlambda (π ^ n) + have hbridge := + padicCompletedStandardToMultiplicativeIntertwiner_eval_endomorphism + p n lambda hlambda (π ^ n) + have hleftZero : + padicCompletedLevelPowerSeriesEval p n lambdaN hlambdaN + (padicCompletedStandardToMultiplicativeIntertwiner p) = + 0 := by + exact hbridge.trans hzero + have hlambdaNZero : lambdaN = 0 := by + apply + padicCompletedStandardToMultiplicativeIntertwiner_eval_injective + p n hlambdaN PowerSeries.HasEval.zero + exact hleftZero.trans + (padicCompletedStandardToMultiplicativeIntertwiner_eval_zero + p n).symm + apply padicCompletedPrimitiveRootInteger_iterate_ne_zero p n + rw [← + padicCompletedStandardScalarEndomorphismValue_uniformizer_pow + p n lambda hlambda n] + exact hlambdaNZero + +/-- The completed multiplicative primitive point is killed by the +`n + 1`-st power of the scalar `u p` defining the changed uniformizer. -/ +theorem + padicCompletedMultiplicativePrimitivePoint_changedUniformizer_pow_succ_eq_zero + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + padicCompletedMultiplicativeScalarEndomorphismValue p n + (padicCompletedMultiplicativePrimitivePoint p n) + (padicCompletedMultiplicativePrimitivePoint_hasEval p n) + ((standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u) ^ (n + 1)) = + 0 := by + let π : (padicLocalField p).valuationSubring := + padicIntEquivValuationSubring p (p : ℤ_[p]) + let x := padicCompletedMultiplicativePrimitivePoint p n + let hx := padicCompletedMultiplicativePrimitivePoint_hasEval p n + let xπ := + padicCompletedMultiplicativeScalarEndomorphismValue + p n x hx (π ^ (n + 1)) + let hxπ : PowerSeries.HasEval xπ := + padicCompletedMultiplicativeScalarEndomorphismValue_hasEval + p n x hx (π ^ (n + 1)) + have hxπZero : xπ = 0 := by + change + padicCompletedMultiplicativeScalarEndomorphismValue p n + (padicCompletedMultiplicativePrimitivePoint p n) + (padicCompletedMultiplicativePrimitivePoint_hasEval p n) + ((padicIntEquivValuationSubring p (p : ℤ_[p])) ^ + (n + 1)) = + 0 + exact + padicCompletedMultiplicativePrimitivePoint_uniformizer_pow_succ_eq_zero + p n + change + padicCompletedMultiplicativeScalarEndomorphismValue p n + x hx + ((standardLubinTateChangedUniformizer + (padicLocalField p) π u) ^ (n + 1)) = + 0 + calc + _ = + padicCompletedMultiplicativeScalarEndomorphismValue p n + xπ hxπ + ((u : (padicLocalField p).valuationSubring) ^ (n + 1)) := by + rw [standardLubinTateChangedUniformizer_eq_unit_mul, mul_pow] + simpa only [xπ, hxπ] using + (padicCompletedMultiplicativeScalarEndomorphismValue_mul + p n x hx + ((u : (padicLocalField p).valuationSubring) ^ (n + 1)) + (π ^ (n + 1))) + _ = + padicCompletedMultiplicativeScalarEndomorphismValue p n + 0 PowerSeries.HasEval.zero + ((u : (padicLocalField p).valuationSubring) ^ (n + 1)) := by + exact + padicCompletedLevelPowerSeriesEval_congr_point p n + hxπ PowerSeries.HasEval.zero hxπZero + (padicCompletedMultiplicativeScalarEndomorphism p + ((u : (padicLocalField p).valuationSubring) ^ (n + 1))) + _ = 0 := + padicCompletedMultiplicativeScalarEndomorphismValue_zero p n _ + +/-- The completed multiplicative primitive point is not killed one level +early by the scalar `u p`. -/ +theorem + padicCompletedMultiplicativePrimitivePoint_changedUniformizer_pow_ne_zero + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + padicCompletedMultiplicativeScalarEndomorphismValue p n + (padicCompletedMultiplicativePrimitivePoint p n) + (padicCompletedMultiplicativePrimitivePoint_hasEval p n) + ((standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u) ^ n) ≠ + 0 := by + let π : (padicLocalField p).valuationSubring := + padicIntEquivValuationSubring p (p : ℤ_[p]) + intro hzero + let x := padicCompletedMultiplicativePrimitivePoint p n + let hx := padicCompletedMultiplicativePrimitivePoint_hasEval p n + let xπ := + padicCompletedMultiplicativeScalarEndomorphismValue + p n x hx (π ^ n) + let hxπ : PowerSeries.HasEval xπ := + padicCompletedMultiplicativeScalarEndomorphismValue_hasEval + p n x hx (π ^ n) + change + padicCompletedMultiplicativeScalarEndomorphismValue p n x hx + ((standardLubinTateChangedUniformizer + (padicLocalField p) π u) ^ n) = + 0 at hzero + have hdecomp : + padicCompletedMultiplicativeScalarEndomorphismValue p n + x hx + ((standardLubinTateChangedUniformizer + (padicLocalField p) π u) ^ n) = + padicCompletedMultiplicativeScalarEndomorphismValue p n + xπ hxπ + ((u : (padicLocalField p).valuationSubring) ^ n) := by + rw [standardLubinTateChangedUniformizer_eq_unit_mul, mul_pow] + simpa only [xπ, hxπ] using + (padicCompletedMultiplicativeScalarEndomorphismValue_mul + p n x hx + ((u : (padicLocalField p).valuationSubring) ^ n) + (π ^ n)) + have hunitZero : + padicCompletedMultiplicativeScalarEndomorphismValue p n + xπ hxπ + ((u : (padicLocalField p).valuationSubring) ^ n) = + 0 := + hdecomp.symm.trans hzero + have hunitZero' : + padicCompletedMultiplicativeScalarEndomorphismValue p n + xπ hxπ + (((u ^ n : (padicLocalField p).valuationSubringˣ) : + (padicLocalField p).valuationSubring)) = + 0 := by + simpa only [Units.val_pow_eq_pow_val] using hunitZero + have hxπZero : xπ = 0 := by + apply + padicCompletedMultiplicativeScalarEndomorphismValue_unit_injective + p n (u ^ n) hxπ PowerSeries.HasEval.zero + exact hunitZero'.trans + (padicCompletedMultiplicativeScalarEndomorphismValue_zero p n + ((u ^ n : (padicLocalField p).valuationSubringˣ) : + (padicLocalField p).valuationSubring)).symm + apply + padicCompletedMultiplicativePrimitivePoint_uniformizer_pow_ne_zero + p n + change xπ = 0 + exact hxπZero + +/-- The multiplicative scalar endomorphism attached to a `p`-adic unit, +with coefficients extended to the completed unramified Witt ring. -/ +noncomputable def padicCompletedMultiplicativeUnitEndomorphism + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + PowerSeries (padicCompletedUnramifiedWittRing p) := + padicCompletedMultiplicativeScalarEndomorphism p + (u : (padicLocalField p).valuationSubring) + +/-- The completed multiplicative unit endomorphism admits formal +substitution. -/ +theorem padicCompletedMultiplicativeUnitEndomorphism_hasSubst + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) : + PowerSeries.HasSubst + (padicCompletedMultiplicativeUnitEndomorphism p u) := + by + simpa only [padicCompletedMultiplicativeUnitEndomorphism] using + padicCompletedMultiplicativeScalarEndomorphism_hasSubst p + (u : (padicLocalField p).valuationSubring) + +/-- The action of a completed multiplicative unit endomorphism on the +completed multiplicative primitive point. -/ +noncomputable def padicCompletedMultiplicativePrimitivePointUnitAction + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + (padicCompletedLevelCompleteDVF p n).valuationSubring := + padicCompletedLevelPowerSeriesEval p n + (padicCompletedMultiplicativePrimitivePoint p n) + (padicCompletedMultiplicativePrimitivePoint_hasEval p n) + (padicCompletedMultiplicativeUnitEndomorphism p u) + +/-- The unit translate of the completed multiplicative primitive point is +again a convergent evaluation point. -/ +theorem padicCompletedMultiplicativePrimitivePointUnitAction_hasEval + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + PowerSeries.HasEval + (padicCompletedMultiplicativePrimitivePointUnitAction p u n) := by + exact + padicCompletedLevelPowerSeriesEval_hasEval p n + (padicCompletedMultiplicativePrimitivePoint p n) + (padicCompletedMultiplicativePrimitivePoint_hasEval p n) + (padicCompletedMultiplicativeUnitEndomorphism p u) + (padicCompletedMultiplicativeUnitEndomorphism_hasSubst p u) + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedScalarEndomorphism.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedScalarEndomorphism.lean new file mode 100644 index 0000000000..46064c1091 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedScalarEndomorphism.lean @@ -0,0 +1,696 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedCoefficientEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.CompletedSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.DefectCorrection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.IntertwinerConstruction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarEndomorphisms +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeIntertwiner +/-! +# Completed standard and multiplicative scalar endomorphisms + +This module extends the standard-to-multiplicative comparison and scalar +endomorphisms to the completed unramified Witt ring. It proves the genuine +composition, torsion, and injectivity identities for their analytic actions. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open ValuationTheory.DiscreteValuationField +open SameUniformizer + +attribute [local instance 50] + padicCompletedMultiplicativeWittUniformSpace + +attribute [local instance] + padicCompletedMultiplicativeTargetWithIdeal + padicCompletedMultiplicativeTargetCompleteSpace + padicCompletedMultiplicativeTargetT2Space + +/-- The standard-to-multiplicative intertwiner after extending its +`ℚ_p`-integral coefficients to the completed unramified Witt ring. -/ +noncomputable def padicCompletedStandardToMultiplicativeIntertwiner + (p : ℕ) [Fact p.Prime] : + PowerSeries (padicCompletedUnramifiedWittRing p) := + PowerSeries.map + (padicValuationSubringToCompletedUnramifiedWittRing p) + (padicStandardToMultiplicativeIntertwiner p) + +/-- Witt Frobenius fixes the completed standard-to-multiplicative +intertwiner because all of its coefficients descend from the p-adic +valuation ring. -/ +theorem padicCompletedStandardToMultiplicativeIntertwiner_frobenius + (p : ℕ) [Fact p.Prime] : + PowerSeries.map WittVector.frobenius + (padicCompletedStandardToMultiplicativeIntertwiner p) = + padicCompletedStandardToMultiplicativeIntertwiner p := by + apply PowerSeries.ext + intro m + simp [padicCompletedStandardToMultiplicativeIntertwiner, + PowerSeries.coeff_map, + padicValuationSubringToCompletedUnramifiedWittRing_frobenius] + +/-- The completed standard-to-multiplicative intertwiner has zero constant +coefficient. -/ +theorem padicCompletedStandardToMultiplicativeIntertwiner_constantCoeff + (p : ℕ) [Fact p.Prime] : + PowerSeries.constantCoeff + (padicCompletedStandardToMultiplicativeIntertwiner p) = 0 := by + have hconstant := + (padicStandardToMultiplicativeIntertwiner_hasLinearTerm p).constantCoeff_eq_zero + change + padicValuationSubringToCompletedUnramifiedWittRing p + (PowerSeries.constantCoeff + (padicStandardToMultiplicativeIntertwiner p)) = 0 + rw [PowerSeries.constantCoeff_eq, hconstant, map_zero] + +/-- The completed standard-to-multiplicative intertwiner admits formal +substitution and convergent evaluation at topologically nilpotent points. -/ +theorem padicCompletedStandardToMultiplicativeIntertwiner_hasSubst + (p : ℕ) [Fact p.Prime] : + PowerSeries.HasSubst + (padicCompletedStandardToMultiplicativeIntertwiner p) := + PowerSeries.HasSubst.of_constantCoeff_zero' + (padicCompletedStandardToMultiplicativeIntertwiner_constantCoeff p) + +/-- Evaluation of the completed standard-to-multiplicative comparison is +injective on topologically nilpotent completed-level integers. -/ +theorem padicCompletedStandardToMultiplicativeIntertwiner_eval_injective + (p : ℕ) [Fact p.Prime] (n : ℕ) + {x y : (padicCompletedLevelCompleteDVF p n).valuationSubring} + (hx : PowerSeries.HasEval x) (hy : PowerSeries.HasEval y) + (hxy : + padicCompletedLevelPowerSeriesEval p n x hx + (padicCompletedStandardToMultiplicativeIntertwiner p) = + padicCompletedLevelPowerSeriesEval p n y hy + (padicCompletedStandardToMultiplicativeIntertwiner p)) : + x = y := by + apply + padicCompletedLevelPowerSeriesEval_injective_of_unitLinearCoefficient + p n (padicCompletedStandardToMultiplicativeIntertwiner p) + (padicCompletedStandardToMultiplicativeIntertwiner_constantCoeff p) + ?_ hx hy hxy + rw [padicCompletedStandardToMultiplicativeIntertwiner, + PowerSeries.coeff_map, + padicStandardToMultiplicativeIntertwiner_coeff_one, + map_one] + exact isUnit_one + +/-- A standard p-adic Lubin--Tate scalar endomorphism after extending its +coefficients to the completed unramified Witt ring. -/ +noncomputable def padicCompletedStandardScalarEndomorphism + (p : ℕ) [Fact p.Prime] + (a : (padicLocalField p).valuationSubring) : + PowerSeries (padicCompletedUnramifiedWittRing p) := + PowerSeries.map + (padicValuationSubringToCompletedUnramifiedWittRing p) + (standardLubinTateEndomorphism + (padicMultiplicativeLubinTateSeries_isUniformizer p) a) + +/-- Completed standard scalar endomorphisms have zero constant +coefficient. -/ +theorem padicCompletedStandardScalarEndomorphism_constantCoeff + (p : ℕ) [Fact p.Prime] + (a : (padicLocalField p).valuationSubring) : + PowerSeries.constantCoeff + (padicCompletedStandardScalarEndomorphism p a) = + 0 := by + have hconstant := + (standardLubinTateEndomorphism_hasLinearTerm + (padicMultiplicativeLubinTateSeries_isUniformizer p) a + ).constantCoeff_eq_zero + change + padicValuationSubringToCompletedUnramifiedWittRing p + (PowerSeries.constantCoeff + (standardLubinTateEndomorphism + (padicMultiplicativeLubinTateSeries_isUniformizer p) a)) = + 0 + rw [PowerSeries.constantCoeff_eq, hconstant, map_zero] + +/-- Completed standard scalar endomorphisms support formal substitution. -/ +theorem padicCompletedStandardScalarEndomorphism_hasSubst + (p : ℕ) [Fact p.Prime] + (a : (padicLocalField p).valuationSubring) : + PowerSeries.HasSubst + (padicCompletedStandardScalarEndomorphism p a) := + PowerSeries.HasSubst.of_constantCoeff_zero' + (padicCompletedStandardScalarEndomorphism_constantCoeff p a) + +/-- Multiplication of standard p-adic scalars is composition after +completed coefficient extension. -/ +theorem padicCompletedStandardScalarEndomorphism_mul + (p : ℕ) [Fact p.Prime] + (a b : (padicLocalField p).valuationSubring) : + padicCompletedStandardScalarEndomorphism p (a * b) = + PowerSeries.subst + (padicCompletedStandardScalarEndomorphism p b) + (padicCompletedStandardScalarEndomorphism p a) := by + let f := + padicValuationSubringToCompletedUnramifiedWittRing p + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let A := standardLubinTateEndomorphism hπ a + let B := standardLubinTateEndomorphism hπ b + calc + padicCompletedStandardScalarEndomorphism p (a * b) = + PowerSeries.map f (PowerSeries.subst B A) := by + exact congrArg (PowerSeries.map f) + (standardLubinTateEndomorphism_mul hπ a b) + _ = + PowerSeries.subst (PowerSeries.map f B) + (PowerSeries.map f A) := by + change + MvPowerSeries.map f (PowerSeries.subst B A) = + PowerSeries.subst (PowerSeries.map f B) + (PowerSeries.map f A) + exact + PowerSeries.map_subst + (standardLubinTateEndomorphism_hasLinearTerm hπ b + ).hasSubst A + _ = + PowerSeries.subst + (padicCompletedStandardScalarEndomorphism p b) + (padicCompletedStandardScalarEndomorphism p a) := by + rfl + +/-- The completed standard-to-multiplicative comparison intertwines the +actual completed scalar endomorphisms. -/ +theorem + padicCompletedStandardToMultiplicativeIntertwiner_endomorphism + (p : ℕ) [Fact p.Prime] + (a : (padicLocalField p).valuationSubring) : + PowerSeries.subst + (padicCompletedStandardScalarEndomorphism p a) + (padicCompletedStandardToMultiplicativeIntertwiner p) = + PowerSeries.subst + (padicCompletedStandardToMultiplicativeIntertwiner p) + (padicCompletedMultiplicativeScalarEndomorphism p a) := by + let f := + padicValuationSubringToCompletedUnramifiedWittRing p + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let S := standardLubinTateEndomorphism hπ a + let H := padicStandardToMultiplicativeIntertwiner p + let M := + recursiveIntertwiner hπ + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => a) + calc + PowerSeries.subst + (padicCompletedStandardScalarEndomorphism p a) + (padicCompletedStandardToMultiplicativeIntertwiner p) = + PowerSeries.map f (PowerSeries.subst S H) := by + change + PowerSeries.subst (PowerSeries.map f S) + (PowerSeries.map f H) = + PowerSeries.map f (PowerSeries.subst S H) + symm + change + MvPowerSeries.map f (PowerSeries.subst S H) = + PowerSeries.subst (PowerSeries.map f S) + (PowerSeries.map f H) + exact + PowerSeries.map_subst + (standardLubinTateEndomorphism_hasLinearTerm hπ a + ).hasSubst H + _ = PowerSeries.map f (PowerSeries.subst H M) := by + rw [padicStandardToMultiplicativeIntertwiner_endomorphism] + _ = + PowerSeries.subst + (padicCompletedStandardToMultiplicativeIntertwiner p) + (padicCompletedMultiplicativeScalarEndomorphism p a) := by + change + MvPowerSeries.map f (PowerSeries.subst H M) = + PowerSeries.subst (PowerSeries.map f H) + (PowerSeries.map f M) + exact + PowerSeries.map_subst + (padicStandardToMultiplicativeIntertwiner_hasSubst p) M + +/-- Analytic action of a completed standard scalar endomorphism on a +topologically nilpotent point. -/ +noncomputable def padicCompletedStandardScalarEndomorphismValue + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) + (a : (padicLocalField p).valuationSubring) : + (padicCompletedLevelCompleteDVF p n).valuationSubring := + padicCompletedLevelPowerSeriesEval p n x hx + (padicCompletedStandardScalarEndomorphism p a) + +/-- A completed standard scalar value remains a convergent evaluation +point. -/ +theorem padicCompletedStandardScalarEndomorphismValue_hasEval + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) + (a : (padicLocalField p).valuationSubring) : + PowerSeries.HasEval + (padicCompletedStandardScalarEndomorphismValue p n x hx a) := + padicCompletedLevelPowerSeriesEval_hasEval p n x hx + (padicCompletedStandardScalarEndomorphism p a) + (padicCompletedStandardScalarEndomorphism_hasSubst p a) + +/-- Multiplication of standard scalars is composition of their completed +analytic actions. -/ +theorem padicCompletedStandardScalarEndomorphismValue_mul + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) + (a b : (padicLocalField p).valuationSubring) : + padicCompletedStandardScalarEndomorphismValue p n x hx (a * b) = + padicCompletedStandardScalarEndomorphismValue p n + (padicCompletedStandardScalarEndomorphismValue p n x hx b) + (padicCompletedStandardScalarEndomorphismValue_hasEval + p n x hx b) a := by + rw [padicCompletedStandardScalarEndomorphismValue, + padicCompletedStandardScalarEndomorphism_mul] + exact + padicCompletedLevelPowerSeriesEval_subst p n x hx + (padicCompletedStandardScalarEndomorphism p b) + (padicCompletedStandardScalarEndomorphism p a) + (padicCompletedStandardScalarEndomorphism_hasSubst p b) + (padicCompletedStandardScalarEndomorphismValue_hasEval + p n x hx b) + +/-- The scalar `1` acts by the identity series after completed coefficient +extension. -/ +@[simp] +theorem padicCompletedStandardScalarEndomorphism_one + (p : ℕ) [Fact p.Prime] : + padicCompletedStandardScalarEndomorphism p 1 = + PowerSeries.X := by + exact (congrArg + (PowerSeries.map (padicValuationSubringToCompletedUnramifiedWittRing p)) + (standardLubinTateEndomorphism_one + (padicMultiplicativeLubinTateSeries_isUniformizer p))).trans + (PowerSeries.map_X _) + +/-- The standard uniformizer acts by the defining standard Lubin--Tate +series after completed coefficient extension. -/ +theorem padicCompletedStandardScalarEndomorphism_uniformizer + (p : ℕ) [Fact p.Prime] : + padicCompletedStandardScalarEndomorphism p + (padicIntEquivValuationSubring p (p : ℤ_[p])) = + PowerSeries.map + (padicValuationSubringToCompletedUnramifiedWittRing p) + (standardLubinTateSeries + (padicMultiplicativeLubinTateSeries_isUniformizer p) + ).toPowerSeries := by + exact congrArg + (PowerSeries.map (padicValuationSubringToCompletedUnramifiedWittRing p)) + (SameUniformizer.standardLubinTateEndomorphism_uniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p)) + +/-- The completed analytic action of scalar `1` fixes its input. -/ +@[simp] +theorem padicCompletedStandardScalarEndomorphismValue_one + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) : + padicCompletedStandardScalarEndomorphismValue p n x hx 1 = + x := by + rw [padicCompletedStandardScalarEndomorphismValue, + padicCompletedStandardScalarEndomorphism_one, + padicCompletedLevelPowerSeriesEval_X] + +/-- Every completed standard scalar endomorphism fixes the zero point. -/ +theorem padicCompletedStandardScalarEndomorphismValue_zero + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : (padicLocalField p).valuationSubring) : + padicCompletedStandardScalarEndomorphismValue p n + 0 PowerSeries.HasEval.zero a = + 0 := by + obtain ⟨B, hB⟩ : + (PowerSeries.X : + PowerSeries (padicCompletedUnramifiedWittRing p)) ∣ + padicCompletedStandardScalarEndomorphism p a := by + rw [PowerSeries.X_dvd_iff] + exact padicCompletedStandardScalarEndomorphism_constantCoeff p a + rw [padicCompletedStandardScalarEndomorphismValue, + hB, map_mul, padicCompletedLevelPowerSeriesEval_X, zero_mul] + +/-- Evaluating a coefficient-extended polynomial as a completed power +series agrees with integral polynomial evaluation. -/ +theorem padicCompletedLevelPowerSeriesEval_map_polynomial + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) + (P : Polynomial (padicLocalField p).valuationSubring) : + padicCompletedLevelPowerSeriesEval p n x hx + (PowerSeries.map + (padicValuationSubringToCompletedUnramifiedWittRing p) + (P : PowerSeries (padicLocalField p).valuationSubring)) = + Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) x P := by + rw [← Polynomial.polynomial_map_coe, + padicCompletedLevelPowerSeriesEval_coe, + Polynomial.eval₂_map] + rfl + +/-- Evaluating the scalar `π ^ r` on any completed-level nilpotent point +is evaluation of the `r`-fold standard division-polynomial iterate. -/ +theorem padicCompletedStandardScalarEndomorphismValue_uniformizer_pow + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) (r : ℕ) : + padicCompletedStandardScalarEndomorphismValue p n x hx + ((padicIntEquivValuationSubring p (p : ℤ_[p])) ^ r) = + Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) x + (standardLubinTatePolynomialIterate + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) r) := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let π : (padicLocalField p).valuationSubring := + padicIntEquivValuationSubring p (p : ℤ_[p]) + change + padicCompletedStandardScalarEndomorphismValue p n x hx (π ^ r) = + Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) x + (standardLubinTatePolynomialIterate + (padicLocalField p) π r) + induction r with + | zero => + rw [pow_zero, + padicCompletedStandardScalarEndomorphismValue_one, + standardLubinTatePolynomialIterate_zero, + Polynomial.eval₂_X] + | succ r ih => + rw [pow_succ', + padicCompletedStandardScalarEndomorphismValue_mul] + rw [padicCompletedStandardScalarEndomorphismValue, + padicCompletedStandardScalarEndomorphism_uniformizer, + ← standardLubinTatePolynomial_toPowerSeries_eq_series hπ, + padicCompletedLevelPowerSeriesEval_map_polynomial, + ih, + standardLubinTatePolynomialIterate_succ, + Polynomial.eval₂_comp] + +/-- Analytic action of a completed multiplicative scalar endomorphism. -/ +noncomputable def padicCompletedMultiplicativeScalarEndomorphismValue + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) + (a : (padicLocalField p).valuationSubring) : + (padicCompletedLevelCompleteDVF p n).valuationSubring := + padicCompletedLevelPowerSeriesEval p n x hx + (padicCompletedMultiplicativeScalarEndomorphism p a) + +/-- A completed multiplicative scalar value remains a convergent +evaluation point. -/ +theorem padicCompletedMultiplicativeScalarEndomorphismValue_hasEval + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) + (a : (padicLocalField p).valuationSubring) : + PowerSeries.HasEval + (padicCompletedMultiplicativeScalarEndomorphismValue + p n x hx a) := + padicCompletedLevelPowerSeriesEval_hasEval p n x hx + (padicCompletedMultiplicativeScalarEndomorphism p a) + (padicCompletedMultiplicativeScalarEndomorphism_hasSubst p a) + +/-- Multiplication of multiplicative scalars is composition of their +completed analytic actions. -/ +theorem padicCompletedMultiplicativeScalarEndomorphismValue_mul + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) + (a b : (padicLocalField p).valuationSubring) : + padicCompletedMultiplicativeScalarEndomorphismValue + p n x hx (a * b) = + padicCompletedMultiplicativeScalarEndomorphismValue p n + (padicCompletedMultiplicativeScalarEndomorphismValue + p n x hx b) + (padicCompletedMultiplicativeScalarEndomorphismValue_hasEval + p n x hx b) a := by + rw [padicCompletedMultiplicativeScalarEndomorphismValue, + padicCompletedMultiplicativeScalarEndomorphism_mul] + exact + padicCompletedLevelPowerSeriesEval_subst p n x hx + (padicCompletedMultiplicativeScalarEndomorphism p b) + (padicCompletedMultiplicativeScalarEndomorphism p a) + (padicCompletedMultiplicativeScalarEndomorphism_hasSubst p b) + (padicCompletedMultiplicativeScalarEndomorphismValue_hasEval + p n x hx b) + +/-- Every completed multiplicative scalar endomorphism fixes the zero +point. -/ +theorem padicCompletedMultiplicativeScalarEndomorphismValue_zero + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : (padicLocalField p).valuationSubring) : + padicCompletedMultiplicativeScalarEndomorphismValue p n + 0 PowerSeries.HasEval.zero a = + 0 := by + obtain ⟨B, hB⟩ : + (PowerSeries.X : + PowerSeries (padicCompletedUnramifiedWittRing p)) ∣ + padicCompletedMultiplicativeScalarEndomorphism p a := by + rw [PowerSeries.X_dvd_iff] + exact + padicCompletedMultiplicativeScalarEndomorphism_constantCoeff p a + rw [padicCompletedMultiplicativeScalarEndomorphismValue, + hB, map_mul, padicCompletedLevelPowerSeriesEval_X, zero_mul] + +/-- A p-adic unit scalar acts injectively on all topologically nilpotent +completed-level integers. -/ +theorem + padicCompletedMultiplicativeScalarEndomorphismValue_unit_injective + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) + {x y : (padicCompletedLevelCompleteDVF p n).valuationSubring} + (hx : PowerSeries.HasEval x) (hy : PowerSeries.HasEval y) + (hxy : + padicCompletedMultiplicativeScalarEndomorphismValue p n x hx + (u : (padicLocalField p).valuationSubring) = + padicCompletedMultiplicativeScalarEndomorphismValue p n y hy + (u : (padicLocalField p).valuationSubring)) : + x = y := by + apply + padicCompletedLevelPowerSeriesEval_injective_of_unitLinearCoefficient + p n + (padicCompletedMultiplicativeScalarEndomorphism p + (u : (padicLocalField p).valuationSubring)) + (padicCompletedMultiplicativeScalarEndomorphism_constantCoeff p + (u : (padicLocalField p).valuationSubring)) + ?_ hx hy hxy + rw [padicCompletedMultiplicativeScalarEndomorphism_coeff_one] + change IsUnit + (((padicValuationUnitToCompletedUnramifiedWittUnit p u : + (padicCompletedUnramifiedWittRing p)ˣ) : + padicCompletedUnramifiedWittRing p)) + exact (padicValuationUnitToCompletedUnramifiedWittUnit p u).isUnit + +/-- The scalar-one completed multiplicative endomorphism fixes every +topologically nilpotent completed-level integer. -/ +@[simp] +theorem padicCompletedMultiplicativeScalarEndomorphismValue_one + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) : + padicCompletedMultiplicativeScalarEndomorphismValue p n x hx 1 = + x := by + apply + padicCompletedMultiplicativeScalarEndomorphismValue_unit_injective + p n (1 : (padicLocalField p).valuationSubringˣ) + (padicCompletedMultiplicativeScalarEndomorphismValue_hasEval + p n x hx 1) hx + simpa only [Units.val_one, one_mul] using + (padicCompletedMultiplicativeScalarEndomorphismValue_mul + p n x hx + (1 : (padicLocalField p).valuationSubring) + (1 : (padicLocalField p).valuationSubring)).symm + +/-- Acting first by the inverse of a p-adic unit and then by the unit +itself recovers every topologically nilpotent completed-level integer. -/ +theorem + padicCompletedMultiplicativeScalarEndomorphismValue_unit_after_inverse + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) + (u : (padicLocalField p).valuationSubringˣ) : + padicCompletedMultiplicativeScalarEndomorphismValue p n + (padicCompletedMultiplicativeScalarEndomorphismValue p n x hx + ((u⁻¹ : (padicLocalField p).valuationSubringˣ) : + (padicLocalField p).valuationSubring)) + (padicCompletedMultiplicativeScalarEndomorphismValue_hasEval + p n x hx + ((u⁻¹ : (padicLocalField p).valuationSubringˣ) : + (padicLocalField p).valuationSubring)) + (u : (padicLocalField p).valuationSubring) = + x := by + calc + _ = + padicCompletedMultiplicativeScalarEndomorphismValue p n x hx + ((u : (padicLocalField p).valuationSubring) * + ((u⁻¹ : (padicLocalField p).valuationSubringˣ) : + (padicLocalField p).valuationSubring)) := + (padicCompletedMultiplicativeScalarEndomorphismValue_mul + p n x hx + (u : (padicLocalField p).valuationSubring) + ((u⁻¹ : (padicLocalField p).valuationSubringˣ) : + (padicLocalField p).valuationSubring)).symm + _ = x := by + rw [show + (u : (padicLocalField p).valuationSubring) * + ((u⁻¹ : (padicLocalField p).valuationSubringˣ) : + (padicLocalField p).valuationSubring) = 1 by + simp, + padicCompletedMultiplicativeScalarEndomorphismValue_one] + +/-- Completed analytic evaluation of the standard-to-multiplicative +comparison carries every standard scalar action to the actual +multiplicative scalar action. -/ +theorem + padicCompletedStandardToMultiplicativeIntertwiner_eval_endomorphism + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) + (a : (padicLocalField p).valuationSubring) : + padicCompletedLevelPowerSeriesEval p n + (padicCompletedStandardScalarEndomorphismValue p n x hx a) + (padicCompletedStandardScalarEndomorphismValue_hasEval + p n x hx a) + (padicCompletedStandardToMultiplicativeIntertwiner p) = + padicCompletedMultiplicativeScalarEndomorphismValue p n + (padicCompletedLevelPowerSeriesEval p n x hx + (padicCompletedStandardToMultiplicativeIntertwiner p)) + (padicCompletedLevelPowerSeriesEval_hasEval p n x hx + (padicCompletedStandardToMultiplicativeIntertwiner p) + (padicCompletedStandardToMultiplicativeIntertwiner_hasSubst p)) + a := by + let S := padicCompletedStandardScalarEndomorphism p a + let H := padicCompletedStandardToMultiplicativeIntertwiner p + let M := padicCompletedMultiplicativeScalarEndomorphism p a + let xS := padicCompletedStandardScalarEndomorphismValue p n x hx a + let xH := padicCompletedLevelPowerSeriesEval p n x hx H + let hxS : PowerSeries.HasEval xS := + padicCompletedStandardScalarEndomorphismValue_hasEval p n x hx a + let hxH : PowerSeries.HasEval xH := + padicCompletedLevelPowerSeriesEval_hasEval p n x hx H + (padicCompletedStandardToMultiplicativeIntertwiner_hasSubst p) + calc + padicCompletedLevelPowerSeriesEval p n xS hxS H = + padicCompletedLevelPowerSeriesEval p n x hx + (PowerSeries.subst S H) := by + exact + (padicCompletedLevelPowerSeriesEval_subst p n x hx + S H (padicCompletedStandardScalarEndomorphism_hasSubst p a) + hxS).symm + _ = + padicCompletedLevelPowerSeriesEval p n x hx + (PowerSeries.subst H M) := by + rw [ + padicCompletedStandardToMultiplicativeIntertwiner_endomorphism] + _ = + padicCompletedLevelPowerSeriesEval p n xH hxH M := by + exact + padicCompletedLevelPowerSeriesEval_subst p n x hx + H M + (padicCompletedStandardToMultiplicativeIntertwiner_hasSubst p) + hxH + +/-- A p-adic unit scalar acts injectively through the completed standard +Lubin--Tate endomorphism on all topologically nilpotent completed-level +integers. -/ +theorem + padicCompletedStandardScalarEndomorphismValue_unit_injective + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) + {x y : (padicCompletedLevelCompleteDVF p n).valuationSubring} + (hx : PowerSeries.HasEval x) (hy : PowerSeries.HasEval y) + (hxy : + padicCompletedStandardScalarEndomorphismValue p n x hx + (u : (padicLocalField p).valuationSubring) = + padicCompletedStandardScalarEndomorphismValue p n y hy + (u : (padicLocalField p).valuationSubring)) : + x = y := by + let H := padicCompletedStandardToMultiplicativeIntertwiner p + let xH := padicCompletedLevelPowerSeriesEval p n x hx H + let yH := padicCompletedLevelPowerSeriesEval p n y hy H + let hxH : PowerSeries.HasEval xH := + padicCompletedLevelPowerSeriesEval_hasEval p n x hx H + (padicCompletedStandardToMultiplicativeIntertwiner_hasSubst p) + let hyH : PowerSeries.HasEval yH := + padicCompletedLevelPowerSeriesEval_hasEval p n y hy H + (padicCompletedStandardToMultiplicativeIntertwiner_hasSubst p) + have hmult : + padicCompletedMultiplicativeScalarEndomorphismValue p n xH hxH + (u : (padicLocalField p).valuationSubring) = + padicCompletedMultiplicativeScalarEndomorphismValue p n yH hyH + (u : (padicLocalField p).valuationSubring) := by + calc + _ = + padicCompletedLevelPowerSeriesEval p n + (padicCompletedStandardScalarEndomorphismValue + p n x hx (u : (padicLocalField p).valuationSubring)) + (padicCompletedStandardScalarEndomorphismValue_hasEval + p n x hx (u : (padicLocalField p).valuationSubring)) + H := by + symm + exact + padicCompletedStandardToMultiplicativeIntertwiner_eval_endomorphism + p n x hx (u : (padicLocalField p).valuationSubring) + _ = + padicCompletedLevelPowerSeriesEval p n + (padicCompletedStandardScalarEndomorphismValue + p n y hy (u : (padicLocalField p).valuationSubring)) + (padicCompletedStandardScalarEndomorphismValue_hasEval + p n y hy (u : (padicLocalField p).valuationSubring)) + H := by + exact + padicCompletedLevelPowerSeriesEval_congr_point p n + (padicCompletedStandardScalarEndomorphismValue_hasEval + p n x hx (u : (padicLocalField p).valuationSubring)) + (padicCompletedStandardScalarEndomorphismValue_hasEval + p n y hy (u : (padicLocalField p).valuationSubring)) + hxy H + _ = + padicCompletedMultiplicativeScalarEndomorphismValue p n yH hyH + (u : (padicLocalField p).valuationSubring) := + padicCompletedStandardToMultiplicativeIntertwiner_eval_endomorphism + p n y hy (u : (padicLocalField p).valuationSubring) + have hH : xH = yH := by + exact + padicCompletedMultiplicativeScalarEndomorphismValue_unit_injective + p n u hxH hyH hmult + exact + padicCompletedStandardToMultiplicativeIntertwiner_eval_injective + p n hx hy hH + +/-- The completed standard-to-multiplicative comparison evaluates to zero +at the zero point. -/ +theorem padicCompletedStandardToMultiplicativeIntertwiner_eval_zero + (p : ℕ) [Fact p.Prime] (n : ℕ) : + padicCompletedLevelPowerSeriesEval p n + 0 PowerSeries.HasEval.zero + (padicCompletedStandardToMultiplicativeIntertwiner p) = + 0 := by + obtain ⟨B, hB⟩ : + (PowerSeries.X : + PowerSeries (padicCompletedUnramifiedWittRing p)) ∣ + padicCompletedStandardToMultiplicativeIntertwiner p := by + rw [PowerSeries.X_dvd_iff] + exact + padicCompletedStandardToMultiplicativeIntertwiner_constantCoeff p + rw [hB, map_mul, + padicCompletedLevelPowerSeriesEval_X, zero_mul] + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/Core.lean new file mode 100644 index 0000000000..a5e7e0fc83 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/Core.lean @@ -0,0 +1,710 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedCoefficientEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedPrimitivePoint +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedScalarEndomorphism +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelPrimitiveRoot +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.CompletedSeries +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.DefectCorrection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.IntertwinerConstruction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarEndomorphisms +/-! +# Changed-uniformizer evaluation on completed p-adic levels + +This endpoint evaluates the genuine changed-uniformizer intertwiner at the +completed multiplicative primitive point. It proves the exact scalar, +Frobenius, root, and level-embedding identities used by the completed +Lubin--Tate tower. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open ValuationTheory.DiscreteValuationField +open SameUniformizer + +attribute [local instance 50] + padicCompletedMultiplicativeWittUniformSpace + +attribute [local instance] + padicCompletedMultiplicativeTargetWithIdeal + padicCompletedMultiplicativeTargetCompleteSpace + padicCompletedMultiplicativeTargetT2Space + +/-- The changed-uniformizer theta value at the genuine completed +multiplicative primitive point. -/ +noncomputable def padicChangedUniformizerThetaValue + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + (padicCompletedLevelCompleteDVF p n).valuationSubring := + padicCompletedLevelPowerSeriesEval p n + (padicCompletedMultiplicativePrimitivePoint p n) + (padicCompletedMultiplicativePrimitivePoint_hasEval p n) + (padicChangedUniformizerIntertwiner p u) + +/-- The changed-uniformizer theta value is topologically nilpotent. -/ +theorem padicChangedUniformizerThetaValue_hasEval + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + PowerSeries.HasEval (padicChangedUniformizerThetaValue p u n) := by + exact + padicCompletedLevelPowerSeriesEval_hasEval p n + (padicCompletedMultiplicativePrimitivePoint p n) + (padicCompletedMultiplicativePrimitivePoint_hasEval p n) + (padicChangedUniformizerIntertwiner p u) + (padicChangedUniformizerIntertwiner_hasSubst p u) + +/-- Analytic action of a completed changed-standard scalar endomorphism. -/ +noncomputable def padicCompletedChangedStandardScalarEndomorphismValue + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) + (a : (padicLocalField p).valuationSubring) : + (padicCompletedLevelCompleteDVF p n).valuationSubring := + padicCompletedLevelPowerSeriesEval p n x hx + (padicCompletedChangedStandardScalarEndomorphism p u a) + +/-- A completed changed-standard scalar value remains a convergent +evaluation point. -/ +theorem padicCompletedChangedStandardScalarEndomorphismValue_hasEval + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) + (a : (padicLocalField p).valuationSubring) : + PowerSeries.HasEval + (padicCompletedChangedStandardScalarEndomorphismValue + p u n x hx a) := + padicCompletedLevelPowerSeriesEval_hasEval p n x hx + (padicCompletedChangedStandardScalarEndomorphism p u a) + (padicCompletedChangedStandardScalarEndomorphism_hasSubst p u a) + +/-- Multiplication of changed-standard scalars is composition of their +completed analytic actions. -/ +theorem padicCompletedChangedStandardScalarEndomorphismValue_mul + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) + (a b : (padicLocalField p).valuationSubring) : + padicCompletedChangedStandardScalarEndomorphismValue + p u n x hx (a * b) = + padicCompletedChangedStandardScalarEndomorphismValue p u n + (padicCompletedChangedStandardScalarEndomorphismValue + p u n x hx b) + (padicCompletedChangedStandardScalarEndomorphismValue_hasEval + p u n x hx b) a := by + rw [padicCompletedChangedStandardScalarEndomorphismValue, + padicCompletedChangedStandardScalarEndomorphism_mul] + exact + padicCompletedLevelPowerSeriesEval_subst p n x hx + (padicCompletedChangedStandardScalarEndomorphism p u b) + (padicCompletedChangedStandardScalarEndomorphism p u a) + (padicCompletedChangedStandardScalarEndomorphism_hasSubst p u b) + (padicCompletedChangedStandardScalarEndomorphismValue_hasEval + p u n x hx b) + +/-- The scalar `1` fixes every completed changed-standard evaluation +point. -/ +@[simp] +theorem padicCompletedChangedStandardScalarEndomorphismValue_one + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) : + padicCompletedChangedStandardScalarEndomorphismValue + p u n x hx 1 = + x := by + rw [padicCompletedChangedStandardScalarEndomorphismValue, + padicCompletedChangedStandardScalarEndomorphism_one, + padicCompletedLevelPowerSeriesEval_X] + +/-- Evaluating a power of the changed uniformizer is evaluation of the +corresponding changed standard division-polynomial iterate. -/ +theorem + padicCompletedChangedStandardScalarEndomorphismValue_uniformizer_pow + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) (r : ℕ) : + padicCompletedChangedStandardScalarEndomorphismValue p u n x hx + ((standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u) ^ r) = + Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) x + (standardLubinTatePolynomialIterate + (padicLocalField p) + (standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u) r) := by + let hπ := + standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u + let πu : (padicLocalField p).valuationSubring := + standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u + change + padicCompletedChangedStandardScalarEndomorphismValue + p u n x hx (πu ^ r) = + Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) x + (standardLubinTatePolynomialIterate + (padicLocalField p) πu r) + induction r with + | zero => + rw [pow_zero, + padicCompletedChangedStandardScalarEndomorphismValue_one, + standardLubinTatePolynomialIterate_zero, + Polynomial.eval₂_X] + | succ r ih => + rw [pow_succ', + padicCompletedChangedStandardScalarEndomorphismValue_mul] + rw [padicCompletedChangedStandardScalarEndomorphismValue, + padicCompletedChangedStandardScalarEndomorphism_uniformizer, + padicCompletedChangedStandardSeries, + ← standardLubinTatePolynomial_toPowerSeries_eq_series hπ, + padicCompletedLevelPowerSeriesEval_map_polynomial, + ih, + standardLubinTatePolynomialIterate_succ, + Polynomial.eval₂_comp] + +/-- Genuine completed-level evaluation of the changed-uniformizer scalar +intertwining identity. -/ +theorem padicChangedUniformizerIntertwiner_endomorphism_evaluation + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) + (a : (padicLocalField p).valuationSubring) (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) : + padicCompletedLevelPowerSeriesEval p n + (padicCompletedMultiplicativeScalarEndomorphismValue + p n x hx a) + (padicCompletedMultiplicativeScalarEndomorphismValue_hasEval + p n x hx a) + (padicChangedUniformizerIntertwiner p u) = + padicCompletedChangedStandardScalarEndomorphismValue p u n + (padicCompletedLevelPowerSeriesEval p n x hx + (padicChangedUniformizerIntertwiner p u)) + (padicCompletedLevelPowerSeriesEval_hasEval p n x hx + (padicChangedUniformizerIntertwiner p u) + (padicChangedUniformizerIntertwiner_hasSubst p u)) + a := by + let M := padicCompletedMultiplicativeScalarEndomorphism p a + let H := padicChangedUniformizerIntertwiner p u + let S := padicCompletedChangedStandardScalarEndomorphism p u a + let xM := + padicCompletedMultiplicativeScalarEndomorphismValue p n x hx a + let xH := padicCompletedLevelPowerSeriesEval p n x hx H + let hxM : PowerSeries.HasEval xM := + padicCompletedMultiplicativeScalarEndomorphismValue_hasEval + p n x hx a + let hxH : PowerSeries.HasEval xH := + padicCompletedLevelPowerSeriesEval_hasEval p n x hx H + (padicChangedUniformizerIntertwiner_hasSubst p u) + calc + padicCompletedLevelPowerSeriesEval p n xM hxM H = + padicCompletedLevelPowerSeriesEval p n x hx + (PowerSeries.subst M H) := by + exact + (padicCompletedLevelPowerSeriesEval_subst p n x hx + M H + (padicCompletedMultiplicativeScalarEndomorphism_hasSubst p a) + hxM).symm + _ = + padicCompletedLevelPowerSeriesEval p n x hx + (PowerSeries.subst H S) := by + rw [padicChangedUniformizerIntertwiner_endomorphism] + _ = + padicCompletedLevelPowerSeriesEval p n xH hxH S := by + exact + padicCompletedLevelPowerSeriesEval_subst p n x hx + H S (padicChangedUniformizerIntertwiner_hasSubst p u) hxH + +/-- The changed-uniformizer intertwiner carries the actual multiplicative +action of `u p` to the defining changed standard Lubin--Tate series. -/ +theorem padicChangedUniformizerIntertwiner_changedSeries_evaluation + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) : + padicCompletedLevelPowerSeriesEval p n + (padicCompletedMultiplicativeScalarEndomorphismValue p n x hx + (standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u)) + (padicCompletedMultiplicativeScalarEndomorphismValue_hasEval + p n x hx + (standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u)) + (padicChangedUniformizerIntertwiner p u) = + padicCompletedLevelPowerSeriesEval p n + (padicCompletedLevelPowerSeriesEval p n x hx + (padicChangedUniformizerIntertwiner p u)) + (padicCompletedLevelPowerSeriesEval_hasEval p n x hx + (padicChangedUniformizerIntertwiner p u) + (padicChangedUniformizerIntertwiner_hasSubst p u)) + (padicCompletedChangedStandardSeries p u) := by + simpa only [ + padicCompletedChangedStandardScalarEndomorphismValue, + padicCompletedChangedStandardScalarEndomorphism_uniformizer] using + padicChangedUniformizerIntertwiner_endomorphism_evaluation + p u + (standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u) + n x hx + +/-- Evaluation of the changed-uniformizer intertwiner is injective on +topologically nilpotent completed-level integers. Its inverse is the +formal substitution inverse determined by the genuine Witt-unit linear +coefficient. -/ +theorem padicChangedUniformizerIntertwiner_eval_injective + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) + {x y : (padicCompletedLevelCompleteDVF p n).valuationSubring} + (hx : PowerSeries.HasEval x) (hy : PowerSeries.HasEval y) + (hxy : + padicCompletedLevelPowerSeriesEval p n x hx + (padicChangedUniformizerIntertwiner p u) = + padicCompletedLevelPowerSeriesEval p n y hy + (padicChangedUniformizerIntertwiner p u)) : + x = y := by + apply + padicCompletedLevelPowerSeriesEval_injective_of_unitLinearCoefficient + p n (padicChangedUniformizerIntertwiner p u) + (padicChangedUniformizerIntertwiner_constantCoeff p u) + ?_ hx hy hxy + rw [padicChangedUniformizerIntertwiner_coeff_one] + exact (padicChangedUniformizerLinearCoefficient p u).isUnit + +/-- The changed-uniformizer intertwiner evaluates to zero at the zero +point. -/ +theorem padicChangedUniformizerIntertwiner_eval_zero + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + padicCompletedLevelPowerSeriesEval p n + 0 PowerSeries.HasEval.zero + (padicChangedUniformizerIntertwiner p u) = + 0 := by + obtain ⟨B, hB⟩ : + (PowerSeries.X : + PowerSeries (padicCompletedUnramifiedWittRing p)) ∣ + padicChangedUniformizerIntertwiner p u := by + rw [PowerSeries.X_dvd_iff] + exact padicChangedUniformizerIntertwiner_constantCoeff p u + rw [hB, map_mul, + padicCompletedLevelPowerSeriesEval_X, zero_mul] + +/-- The changed-uniformizer theta value is killed by the `n + 1`-fold +changed standard division-polynomial iterate. -/ +theorem padicChangedUniformizerThetaValue_iterate_succ_eq_zero + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) + (padicChangedUniformizerThetaValue p u n) + (standardLubinTatePolynomialIterate + (padicLocalField p) + (standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u) + (n + 1)) = + 0 := by + let π : (padicLocalField p).valuationSubring := + padicIntEquivValuationSubring p (p : ℤ_[p]) + let πu : (padicLocalField p).valuationSubring := + standardLubinTateChangedUniformizer + (padicLocalField p) π u + change + Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) + (padicChangedUniformizerThetaValue p u n) + (standardLubinTatePolynomialIterate + (padicLocalField p) πu (n + 1)) = + 0 + let x := padicCompletedMultiplicativePrimitivePoint p n + let hx := padicCompletedMultiplicativePrimitivePoint_hasEval p n + let xChanged := + padicCompletedMultiplicativeScalarEndomorphismValue + p n x hx (πu ^ (n + 1)) + let hxChanged : PowerSeries.HasEval xChanged := + padicCompletedMultiplicativeScalarEndomorphismValue_hasEval + p n x hx (πu ^ (n + 1)) + have hbridge := + padicChangedUniformizerIntertwiner_endomorphism_evaluation + p u (πu ^ (n + 1)) n x hx + have hxChangedZero : xChanged = 0 := by + change + padicCompletedMultiplicativeScalarEndomorphismValue p n + (padicCompletedMultiplicativePrimitivePoint p n) + (padicCompletedMultiplicativePrimitivePoint_hasEval p n) + ((standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u) ^ + (n + 1)) = + 0 + exact + padicCompletedMultiplicativePrimitivePoint_changedUniformizer_pow_succ_eq_zero + p u n + have hleftZero : + padicCompletedLevelPowerSeriesEval p n xChanged hxChanged + (padicChangedUniformizerIntertwiner p u) = + 0 := by + calc + _ = + padicCompletedLevelPowerSeriesEval p n + 0 PowerSeries.HasEval.zero + (padicChangedUniformizerIntertwiner p u) := + padicCompletedLevelPowerSeriesEval_congr_point p n + hxChanged PowerSeries.HasEval.zero hxChangedZero + (padicChangedUniformizerIntertwiner p u) + _ = 0 := + padicChangedUniformizerIntertwiner_eval_zero p u n + have hrightZero : + padicCompletedChangedStandardScalarEndomorphismValue p u n + (padicChangedUniformizerThetaValue p u n) + (padicChangedUniformizerThetaValue_hasEval p u n) + (πu ^ (n + 1)) = + 0 := + hbridge.symm.trans hleftZero + have hpow : + padicCompletedChangedStandardScalarEndomorphismValue p u n + (padicChangedUniformizerThetaValue p u n) + (padicChangedUniformizerThetaValue_hasEval p u n) + (πu ^ (n + 1)) = + Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) + (padicChangedUniformizerThetaValue p u n) + (standardLubinTatePolynomialIterate + (padicLocalField p) πu (n + 1)) := by + simpa only [π, πu] using + (padicCompletedChangedStandardScalarEndomorphismValue_uniformizer_pow + p u n + (padicChangedUniformizerThetaValue p u n) + (padicChangedUniformizerThetaValue_hasEval p u n) + (n + 1)) + exact hpow.symm.trans hrightZero + +/-- The changed-uniformizer theta value is not killed one level early. -/ +theorem padicChangedUniformizerThetaValue_iterate_ne_zero + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) + (padicChangedUniformizerThetaValue p u n) + (standardLubinTatePolynomialIterate + (padicLocalField p) + (standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u) n) ≠ + 0 := by + let π : (padicLocalField p).valuationSubring := + padicIntEquivValuationSubring p (p : ℤ_[p]) + let πu : (padicLocalField p).valuationSubring := + standardLubinTateChangedUniformizer + (padicLocalField p) π u + change + Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) + (padicChangedUniformizerThetaValue p u n) + (standardLubinTatePolynomialIterate + (padicLocalField p) πu n) ≠ + 0 + intro hzero + let x := padicCompletedMultiplicativePrimitivePoint p n + let hx := padicCompletedMultiplicativePrimitivePoint_hasEval p n + let xChanged := + padicCompletedMultiplicativeScalarEndomorphismValue + p n x hx (πu ^ n) + let hxChanged : PowerSeries.HasEval xChanged := + padicCompletedMultiplicativeScalarEndomorphismValue_hasEval + p n x hx (πu ^ n) + have hbridge := + padicChangedUniformizerIntertwiner_endomorphism_evaluation + p u (πu ^ n) n x hx + have hpow : + padicCompletedChangedStandardScalarEndomorphismValue p u n + (padicChangedUniformizerThetaValue p u n) + (padicChangedUniformizerThetaValue_hasEval p u n) + (πu ^ n) = + Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) + (padicChangedUniformizerThetaValue p u n) + (standardLubinTatePolynomialIterate + (padicLocalField p) πu n) := by + simpa only [π, πu] using + (padicCompletedChangedStandardScalarEndomorphismValue_uniformizer_pow + p u n + (padicChangedUniformizerThetaValue p u n) + (padicChangedUniformizerThetaValue_hasEval p u n) n) + have hrightZero : + padicCompletedChangedStandardScalarEndomorphismValue p u n + (padicChangedUniformizerThetaValue p u n) + (padicChangedUniformizerThetaValue_hasEval p u n) + (πu ^ n) = + 0 := + hpow.trans hzero + have hleftZero : + padicCompletedLevelPowerSeriesEval p n xChanged hxChanged + (padicChangedUniformizerIntertwiner p u) = + 0 := by + exact hbridge.trans hrightZero + have hxChangedZero : xChanged = 0 := by + apply padicChangedUniformizerIntertwiner_eval_injective + p u n hxChanged PowerSeries.HasEval.zero + exact hleftZero.trans + (padicChangedUniformizerIntertwiner_eval_zero p u n).symm + apply + padicCompletedMultiplicativePrimitivePoint_changedUniformizer_pow_ne_zero + p u n + change xChanged = 0 + exact hxChangedZero + +/-- The changed-uniformizer theta value is an actual root of the genuine +changed primitive Lubin--Tate polynomial in the completed level. -/ +theorem padicChangedUniformizerThetaValue_isRoot + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + ((standardLubinTatePrimitivePolynomial + (padicLocalField p) + (standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u) n).map + (padicCompletedLevelPadicIntegerCoefficientHom p n)).IsRoot + (padicChangedUniformizerThetaValue p u n) := by + let F := padicLocalField p + let πu : (padicLocalField p).valuationSubring := + standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u + let φ := padicCompletedLevelPadicIntegerCoefficientHom p n + let theta := padicChangedUniformizerThetaValue p u n + have hfactor := + congrArg (Polynomial.eval₂ φ theta) + (standardLubinTatePolynomialIterate_succ_factor F πu n) + rw [Polynomial.eval₂_mul, + padicChangedUniformizerThetaValue_iterate_succ_eq_zero p u n] + at hfactor + have hprimitive : + Polynomial.eval₂ φ theta + (standardLubinTatePrimitivePolynomial F πu n) = + 0 := + (mul_eq_zero.mp hfactor.symm).resolve_left + (padicChangedUniformizerThetaValue_iterate_ne_zero p u n) + rw [Polynomial.IsRoot, Polynomial.eval_map] + exact hprimitive + +/-- Field-valued form of the changed primitive-root equation. -/ +theorem padicChangedUniformizerThetaValue_field_isRoot + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + ((standardLubinTatePrimitivePolynomialOverField + (padicLocalField p) + (standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u) n).map + (algebraMap ℚ_[p] (padicCompletedLevelField p n))).IsRoot + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) := by + let F := padicLocalField p + let πu : (padicLocalField p).valuationSubring := + standardLubinTateChangedUniformizer + (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) u + let Q := standardLubinTatePrimitivePolynomial F πu n + let theta := padicChangedUniformizerThetaValue p u n + have hroot := padicChangedUniformizerThetaValue_isRoot p u n + have hinteger : + Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) + theta Q = + 0 := by + simpa only [Polynomial.IsRoot, Polynomial.eval_map, F, πu, Q, theta] + using hroot + have hcoe := congrArg + (fun z : (padicCompletedLevelCompleteDVF p n).valuationSubring => + (z : padicCompletedLevelField p n)) hinteger + have hfield : + Polynomial.eval₂ + (padicCompletedLevelPadicFieldCoefficientHom p n) + (theta : padicCompletedLevelField p n) Q = + 0 := by + change + ((Polynomial.eval₂ + (padicCompletedLevelPadicIntegerCoefficientHom p n) + theta Q : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) = + 0 at hcoe + rw [padicCompletedLevelPadicIntegerPolynomialEval_coe] at hcoe + exact hcoe + rw [standardLubinTatePrimitivePolynomialOverField, + Polynomial.IsRoot, Polynomial.eval_map, Polynomial.eval₂_map] + change + Polynomial.eval₂ + (padicCompletedLevelPadicFieldCoefficientHom p n) + (theta : padicCompletedLevelField p n) Q = + 0 + exact hfield + +/-- The theta value annihilates the minimal polynomial of the canonical +generator of the changed finite Lubin--Tate level. -/ +theorem padicChangedUniformizerThetaValue_aeval_levelMinpoly + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + let hπ := + standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u + Polynomial.aeval + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) + (minpoly ℚ_[p] (standardLubinTateLevelPowerBasis hπ n).gen) = + 0 := by + let hπ := + standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u + change + Polynomial.aeval + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) + (minpoly ℚ_[p] (standardLubinTateLevelPowerBasis hπ n).gen) = + 0 + rw [standardLubinTateLevelPowerBasis_minpoly hπ n, + Polynomial.aeval_def] + simpa only [Polynomial.IsRoot, Polynomial.eval_map] using + padicChangedUniformizerThetaValue_field_isRoot p u n + +/-- The genuine embedding of the changed finite Lubin--Tate level into +the completed standard level, sending its canonical generator to theta. -/ +noncomputable def padicChangedUniformizerLevelEmbedding + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + let hπ := + standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u + standardLubinTateLevelField hπ n →ₐ[ℚ_[p]] + padicCompletedLevelField p n := by + let hπ := + standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u + let theta : padicCompletedLevelField p n := + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) + change + standardLubinTateLevelField hπ n →ₐ[ℚ_[p]] + padicCompletedLevelField p n + exact + (standardLubinTateLevelPowerBasis hπ n).lift theta + (by + simpa only [theta] using + padicChangedUniformizerThetaValue_aeval_levelMinpoly p u n) + +/-- The changed-level embedding sends the canonical power-basis generator +to the actual theta value. -/ +@[simp] +theorem padicChangedUniformizerLevelEmbedding_apply_gen + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + let hπ := + standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u + padicChangedUniformizerLevelEmbedding p u n + (standardLubinTateLevelPowerBasis hπ n).gen = + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) := by + let hπ := + standardLubinTateChangedUniformizer_isUniformizer + (padicMultiplicativeLubinTateSeries_isUniformizer p) u + let theta : padicCompletedLevelField p n := + ((padicChangedUniformizerThetaValue p u n : + (padicCompletedLevelCompleteDVF p n).valuationSubring) : + padicCompletedLevelField p n) + change + (standardLubinTateLevelPowerBasis hπ n).lift + theta + (padicChangedUniformizerThetaValue_aeval_levelMinpoly p u n) + (standardLubinTateLevelPowerBasis hπ n).gen = + theta + exact + (standardLubinTateLevelPowerBasis hπ n).lift_gen _ _ + +/-- Evaluating Frobenius on the coefficients of the changed-uniformizer +intertwiner is the same as first applying the multiplicative unit +endomorphism to the evaluation point and then evaluating the original +intertwiner. -/ +theorem padicChangedUniformizerIntertwiner_frobenius_evaluation + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) + (x : (padicCompletedLevelCompleteDVF p n).valuationSubring) + (hx : PowerSeries.HasEval x) : + padicCompletedLevelPowerSeriesEval p n x hx + (PowerSeries.map WittVector.frobenius + (padicChangedUniformizerIntertwiner p u)) = + padicCompletedLevelPowerSeriesEval p n + (padicCompletedLevelPowerSeriesEval p n x hx + (padicCompletedMultiplicativeUnitEndomorphism p u)) + (padicCompletedLevelPowerSeriesEval_hasEval p n x hx + (padicCompletedMultiplicativeUnitEndomorphism p u) + (padicCompletedMultiplicativeUnitEndomorphism_hasSubst p u)) + (padicChangedUniformizerIntertwiner p u) := by + let U := padicCompletedMultiplicativeUnitEndomorphism p u + let Θ := padicChangedUniformizerIntertwiner p u + have hseries : + PowerSeries.map WittVector.frobenius Θ = + PowerSeries.subst U Θ := by + simpa only [U, Θ, padicCompletedMultiplicativeUnitEndomorphism] using + (padicChangedUniformizerIntertwiner_frobenius p u) + rw [hseries] + exact + padicCompletedLevelPowerSeriesEval_subst p n x hx U Θ + (padicCompletedMultiplicativeUnitEndomorphism_hasSubst p u) + (padicCompletedLevelPowerSeriesEval_hasEval p n x hx U + (padicCompletedMultiplicativeUnitEndomorphism_hasSubst p u)) + +/-- At the completed multiplicative primitive point, coefficient Frobenius +on theta is evaluation of theta at the corresponding unit translate. -/ +theorem + padicChangedUniformizerThetaValue_frobeniusCoefficients + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : + padicCompletedLevelPowerSeriesEval p n + (padicCompletedMultiplicativePrimitivePoint p n) + (padicCompletedMultiplicativePrimitivePoint_hasEval p n) + (PowerSeries.map WittVector.frobenius + (padicChangedUniformizerIntertwiner p u)) = + padicCompletedLevelPowerSeriesEval p n + (padicCompletedMultiplicativePrimitivePointUnitAction p u n) + (padicCompletedMultiplicativePrimitivePointUnitAction_hasEval p u n) + (padicChangedUniformizerIntertwiner p u) := by + simpa only [padicCompletedMultiplicativePrimitivePointUnitAction] using + padicChangedUniformizerIntertwiner_frobenius_evaluation p u n + (padicCompletedMultiplicativePrimitivePoint p n) + (padicCompletedMultiplicativePrimitivePoint_hasEval p n) + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelEvaluation.lean new file mode 100644 index 0000000000..021127b1b6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelEvaluation.lean @@ -0,0 +1,414 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveDisplacement +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeIntertwiner +public import Mathlib.RingTheory.AdicCompletion.Topology +/-! +# Finite-level evaluation of the p-adic multiplicative comparison + +This module evaluates the standard-to-multiplicative Lubin--Tate comparison +on topologically nilpotent integers in a standard finite level. It proves +the functional equation, compatibility with scalar endomorphisms, the inverse +comparison identity, and injectivity of the evaluated comparison. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open ValuationTheory.DiscreteValuationField +open SameUniformizer + +variable {K : Type u} [Field K] + +/-- The discrete coefficient uniformity used for finite-level analytic evaluation. -/ +noncomputable local instance + padicMultiplicativeLevelCoefficientUniformSpace + (F : LocalField.{u, v} K) : + UniformSpace F.valuationSubring := + ⊥ + +/-- The maximal-ideal adic structure on a standard finite Lubin--Tate level. -/ +noncomputable local instance + padicMultiplicativeLevelTargetWithIdeal + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + WithIdeal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring where + i := (standardLubinTateLevelCompleteDVF hπ n).maximalIdeal + +/-- Completeness of the standard finite-level valuation ring for its adic topology. -/ +noncomputable local instance + padicMultiplicativeLevelTargetCompleteSpace + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + CompleteSpace + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := by + let target := standardLubinTateLevelCompleteDVF hπ n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).1 + +/-- Separatedness of the standard finite-level valuation ring for its adic topology. -/ +noncomputable local instance + padicMultiplicativeLevelTargetT2Space + {F : LocalField.{u, v} K} {π : F.valuationSubring} + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + T2Space + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := by + let target := standardLubinTateLevelCompleteDVF hπ n + have hadic : IsAdic target.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).2 + +section PadicLevelTopology + +/-- The specialized level uses the same maximal-ideal adic topology as the generic evaluator. -/ +noncomputable local instance + padicMultiplicativeLevelTargetTopologicalSpace + (p : ℕ) [Fact p.Prime] (n : ℕ) : + TopologicalSpace + (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring := + @WithIdeal.instTopologicalSpace _ _ + (padicMultiplicativeLevelTargetWithIdeal + (F := padicLocalField p) + (π := show (padicLocalField p).valuationSubring from + padicIntEquivValuationSubring p (p : ℤ_[p])) + (padicMultiplicativeLubinTateSeries_isUniformizer p) n) + +/-- Evaluation of the standard-to-multiplicative comparison at the chosen +standard primitive point of level `n + 1`. -/ +noncomputable def padicMultiplicativePrimitivePoint + (p : ℕ) [Fact p.Prime] (n : ℕ) : + (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring := + standardLubinTatePrimitivePointEvaluation + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (padicStandardToMultiplicativeIntertwiner p) + +/-- The evaluated multiplicative point is topologically nilpotent. -/ +theorem padicMultiplicativePrimitivePoint_hasEval + (p : ℕ) [Fact p.Prime] (n : ℕ) : + PowerSeries.HasEval (padicMultiplicativePrimitivePoint p n) := by + exact + standardLubinTateLevelPowerSeriesEval_hasEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (standardLubinTatePrimitivePointInteger + (padicMultiplicativeLubinTateSeries_isUniformizer p) n) + (standardLubinTatePrimitivePointInteger_hasEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n) + (padicStandardToMultiplicativeIntertwiner p) + (padicStandardToMultiplicativeIntertwiner_hasSubst p) + +/-- At every standard level, analytic evaluation of the multiplicative +Lubin--Tate series is the literal polynomial `(1 + x)^p - 1`. -/ +theorem padicMultiplicativeLubinTateSeries_eval + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : + (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring) + (hx : PowerSeries.HasEval x) : + standardLubinTateLevelPowerSeriesEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n x hx + (padicMultiplicativeLubinTateSeries p).toPowerSeries = + (1 + x) ^ p - 1 := by + rw [ + LubinTateSeries.padicMultiplicativeLubinTateSeries_toPowerSeries, + PowerSeries.binomialSeries_nat (R := ℤ)] + simp only [map_sub, map_pow, map_add, map_one] + exact congrArg + (fun z : (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring => + (1 + z) ^ p - 1) + (standardLubinTateLevelPowerSeriesEval_X + (padicMultiplicativeLubinTateSeries_isUniformizer p) n x hx) + +/-- Analytic evaluation preserves the standard-to-multiplicative +intertwining equation at every topologically nilpotent level integer. -/ +theorem padicStandardToMultiplicativeIntertwiner_eval_functionalEquation + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : + (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring) + (hx : PowerSeries.HasEval x) : + standardLubinTateLevelPowerSeriesEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (standardLubinTateLevelPowerSeriesEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n x hx + (padicStandardToMultiplicativeIntertwiner p)) + (standardLubinTateLevelPowerSeriesEval_hasEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n x hx + (padicStandardToMultiplicativeIntertwiner p) + (padicStandardToMultiplicativeIntertwiner_hasSubst p)) + (padicMultiplicativeLubinTateSeries p).toPowerSeries = + standardLubinTateLevelPowerSeriesEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (standardLubinTateLevelPowerSeriesEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n x hx + (standardLubinTateSeries + (padicMultiplicativeLubinTateSeries_isUniformizer p)).toPowerSeries) + (standardLubinTateLevelPowerSeriesEval_hasEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n x hx + (standardLubinTateSeries + (padicMultiplicativeLubinTateSeries_isUniformizer p)).toPowerSeries + (PowerSeries.HasSubst.of_constantCoeff_zero + (LubinTateSeries.constantCoeff_eq_zero + (standardLubinTateSeries + (padicMultiplicativeLubinTateSeries_isUniformizer p))))) + (padicStandardToMultiplicativeIntertwiner p) := by + let hπ := + padicMultiplicativeLubinTateSeries_isUniformizer p + let H := padicStandardToMultiplicativeIntertwiner p + let E := padicMultiplicativeLubinTateSeries p + let Ebar := standardLubinTateSeries hπ + let hH : PowerSeries.HasSubst H := + padicStandardToMultiplicativeIntertwiner_hasSubst p + let hEbar : PowerSeries.HasSubst Ebar.toPowerSeries := + PowerSeries.HasSubst.of_constantCoeff_zero + Ebar.constantCoeff_eq_zero + let hHEval : + PowerSeries.HasEval + (standardLubinTateLevelPowerSeriesEval hπ n x hx H) := + standardLubinTateLevelPowerSeriesEval_hasEval + hπ n x hx H hH + let hEbarEval : + PowerSeries.HasEval + (standardLubinTateLevelPowerSeriesEval + hπ n x hx Ebar.toPowerSeries) := + standardLubinTateLevelPowerSeriesEval_hasEval + hπ n x hx Ebar.toPowerSeries hEbar + calc + standardLubinTateLevelPowerSeriesEval hπ n + (standardLubinTateLevelPowerSeriesEval hπ n x hx H) + hHEval E.toPowerSeries = + standardLubinTateLevelPowerSeriesEval hπ n x hx + (PowerSeries.subst H E.toPowerSeries) := + (standardLubinTateLevelPowerSeriesEval_subst + hπ n x hx H E.toPowerSeries hH hHEval).symm + _ = + standardLubinTateLevelPowerSeriesEval hπ n x hx + (PowerSeries.subst Ebar.toPowerSeries H) := by + rw [padicStandardToMultiplicativeIntertwiner_functionalEquation] + _ = + standardLubinTateLevelPowerSeriesEval hπ n + (standardLubinTateLevelPowerSeriesEval + hπ n x hx Ebar.toPowerSeries) + hEbarEval H := + standardLubinTateLevelPowerSeriesEval_subst + hπ n x hx Ebar.toPowerSeries H hEbar hEbarEval + +/-- Finite-level evaluation of the comparison carries the standard scalar +action with coefficient `a` to the unique multiplicative-series scalar +action with the same coefficient. -/ +theorem padicStandardToMultiplicativeIntertwiner_eval_endomorphism + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : + (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring) + (hx : PowerSeries.HasEval x) + (a : (padicLocalField p).valuationSubring) : + standardLubinTateLevelPowerSeriesEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (standardLubinTateEndomorphismEvalAt + (padicMultiplicativeLubinTateSeries_isUniformizer p) n x hx a) + (standardLubinTateEndomorphismEvalAt_hasEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n x hx a) + (padicStandardToMultiplicativeIntertwiner p) = + standardLubinTateLevelPowerSeriesEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (standardLubinTateLevelPowerSeriesEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n x hx + (padicStandardToMultiplicativeIntertwiner p)) + (standardLubinTateLevelPowerSeriesEval_hasEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n x hx + (padicStandardToMultiplicativeIntertwiner p) + (padicStandardToMultiplicativeIntertwiner_hasSubst p)) + (recursiveIntertwiner + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => a)) := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let H := padicStandardToMultiplicativeIntertwiner p + let S := standardLubinTateEndomorphism hπ a + let M := + recursiveIntertwiner hπ + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => a) + let xS := standardLubinTateEndomorphismEvalAt hπ n x hx a + let xH := standardLubinTateLevelPowerSeriesEval hπ n x hx H + let hSSubst : PowerSeries.HasSubst S := + (standardLubinTateEndomorphism_hasLinearTerm hπ a).hasSubst + let hHSubst : PowerSeries.HasSubst H := + padicStandardToMultiplicativeIntertwiner_hasSubst p + let hxS : PowerSeries.HasEval xS := + standardLubinTateEndomorphismEvalAt_hasEval hπ n x hx a + let hxH : PowerSeries.HasEval xH := + standardLubinTateLevelPowerSeriesEval_hasEval + hπ n x hx H hHSubst + calc + standardLubinTateLevelPowerSeriesEval hπ n xS hxS H = + standardLubinTateLevelPowerSeriesEval hπ n x hx + (PowerSeries.subst S H) := + (standardLubinTateLevelPowerSeriesEval_subst + hπ n x hx S H hSSubst hxS).symm + _ = + standardLubinTateLevelPowerSeriesEval hπ n x hx + (PowerSeries.subst H M) := by + rw [padicStandardToMultiplicativeIntertwiner_endomorphism] + _ = + standardLubinTateLevelPowerSeriesEval hπ n xH hxH M := + standardLubinTateLevelPowerSeriesEval_subst + hπ n x hx H M hHSubst hxH + +/-- Evaluating the reverse comparison after the forward comparison recovers +every topologically nilpotent standard-level point. -/ +theorem padicMultiplicativeToStandardIntertwiner_eval_comp + (p : ℕ) [Fact p.Prime] (n : ℕ) + (x : + (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring) + (hx : PowerSeries.HasEval x) : + standardLubinTateLevelPowerSeriesEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (standardLubinTateLevelPowerSeriesEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n x hx + (padicStandardToMultiplicativeIntertwiner p)) + (standardLubinTateLevelPowerSeriesEval_hasEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n x hx + (padicStandardToMultiplicativeIntertwiner p) + (padicStandardToMultiplicativeIntertwiner_hasSubst p)) + (padicMultiplicativeToStandardIntertwiner p) = + x := by + let hπ := + padicMultiplicativeLubinTateSeries_isUniformizer p + let H := padicStandardToMultiplicativeIntertwiner p + let G := padicMultiplicativeToStandardIntertwiner p + let hH : PowerSeries.HasSubst H := + padicStandardToMultiplicativeIntertwiner_hasSubst p + let hHEval : + PowerSeries.HasEval + (standardLubinTateLevelPowerSeriesEval hπ n x hx H) := + standardLubinTateLevelPowerSeriesEval_hasEval + hπ n x hx H hH + calc + standardLubinTateLevelPowerSeriesEval hπ n + (standardLubinTateLevelPowerSeriesEval hπ n x hx H) + hHEval G = + standardLubinTateLevelPowerSeriesEval hπ n x hx + (PowerSeries.subst H G) := + (standardLubinTateLevelPowerSeriesEval_subst + hπ n x hx H G hH hHEval).symm + _ = + standardLubinTateLevelPowerSeriesEval hπ n x hx + PowerSeries.X := by + rw [padicMultiplicativeToStandardIntertwiner_subst_reverse] + _ = x := + standardLubinTateLevelPowerSeriesEval_X + hπ n x hx + +/-- The forward comparison evaluates to zero at the zero point. -/ +theorem padicStandardToMultiplicativeIntertwiner_eval_zero + (p : ℕ) [Fact p.Prime] (n : ℕ) : + standardLubinTateLevelPowerSeriesEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + 0 PowerSeries.HasEval.zero + (padicStandardToMultiplicativeIntertwiner p) = + 0 := by + obtain ⟨B, hB⟩ : + (PowerSeries.X : + PowerSeries (padicLocalField p).valuationSubring) ∣ + padicStandardToMultiplicativeIntertwiner p := by + rw [PowerSeries.X_dvd_iff] + exact + (padicStandardToMultiplicativeIntertwiner_hasLinearTerm p + ).constantCoeff_eq_zero + rw [hB, map_mul] + exact + (congrArg + (fun z : (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring => + z * standardLubinTateLevelPowerSeriesEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + 0 PowerSeries.HasEval.zero B) + (standardLubinTateLevelPowerSeriesEval_X + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + 0 PowerSeries.HasEval.zero)).trans (zero_mul _) + +/-- Evaluation of the forward comparison is injective on topologically +nilpotent points of every standard level. -/ +theorem padicStandardToMultiplicativeIntertwiner_eval_injective + (p : ℕ) [Fact p.Prime] (n : ℕ) + {x y : + (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring} + (hx : PowerSeries.HasEval x) (hy : PowerSeries.HasEval y) + (hxy : + standardLubinTateLevelPowerSeriesEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n x hx + (padicStandardToMultiplicativeIntertwiner p) = + standardLubinTateLevelPowerSeriesEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n y hy + (padicStandardToMultiplicativeIntertwiner p)) : + x = y := by + let hπ := + padicMultiplicativeLubinTateSeries_isUniformizer p + let H := padicStandardToMultiplicativeIntertwiner p + let G := padicMultiplicativeToStandardIntertwiner p + let hxH := + standardLubinTateLevelPowerSeriesEval_hasEval + hπ n x hx H + (padicStandardToMultiplicativeIntertwiner_hasSubst p) + let hyH := + standardLubinTateLevelPowerSeriesEval_hasEval + hπ n y hy H + (padicStandardToMultiplicativeIntertwiner_hasSubst p) + let evalReverse : + {z : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring // + PowerSeries.HasEval z} → + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := + fun z => + standardLubinTateLevelPowerSeriesEval hπ n z.1 z.2 G + let forwardX := + standardLubinTateLevelPowerSeriesEval hπ n x hx H + let forwardY := + standardLubinTateLevelPowerSeriesEval hπ n y hy H + let packedX : + {z : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring // + PowerSeries.HasEval z} := + ⟨forwardX, hxH⟩ + let packedY : + {z : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring // + PowerSeries.HasEval z} := + ⟨forwardY, hyH⟩ + have hpacked : packedX = packedY := by + apply Subtype.ext + exact hxy + have hxback : evalReverse packedX = x := + padicMultiplicativeToStandardIntertwiner_eval_comp p n x hx + have hyback : evalReverse packedY = y := + padicMultiplicativeToStandardIntertwiner_eval_comp p n y hy + exact hxback.symm.trans ((congrArg evalReverse hpacked).trans hyback) + +end PadicLevelTopology + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelPrimitiveRoot.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelPrimitiveRoot.lean new file mode 100644 index 0000000000..cf534c3881 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelPrimitiveRoot.lean @@ -0,0 +1,1052 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelEvaluation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv +public import Mathlib.RingTheory.RootsOfUnity.PrimitiveRoots +/-! +# Primitive roots from finite p-adic Lubin--Tate levels + +The evaluated multiplicative point yields an actual primitive +`p ^ (n + 1)`-st root of unity. This module proves its exact order and +identifies the genuine finite-level Galois action with the cyclotomic power +action. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open ValuationTheory.DiscreteValuationField +open SameUniformizer + +variable {K : Type u} [Field K] + +attribute [local instance] + padicMultiplicativeLevelCoefficientUniformSpace + padicMultiplicativeLevelTargetWithIdeal + padicMultiplicativeLevelTargetTopologicalSpace + padicMultiplicativeLevelTargetCompleteSpace + padicMultiplicativeLevelTargetT2Space + +private theorem padicMultiplicativeScalarEndomorphism_nat + (p : ℕ) [Fact p.Prime] (m : ℕ) : + recursiveIntertwiner + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => + (m : (padicLocalField p).valuationSubring)) = + (1 + PowerSeries.X) ^ m - 1 := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let A : + PowerSeries (padicLocalField p).valuationSubring := + (1 + PowerSeries.X) ^ m - 1 + let Eps : + PowerSeries (padicLocalField p).valuationSubring := + (padicMultiplicativeLubinTateSeries p).toPowerSeries + have hEps : + Eps = + PowerSeries.binomialSeries + (padicLocalField p).valuationSubring (p : ℤ) - + 1 := + rfl + have hAconstant : PowerSeries.constantCoeff A = 0 := by + simp [A] + have hAcoeffOne : + PowerSeries.coeff 1 A = + (m : (padicLocalField p).valuationSubring) := by + dsimp only [A] + simp only [map_sub, PowerSeries.coeff_one] + rw [PowerSeries.coeff_one_pow] + simp + have hAlinear : + HasLinearTerm A + (fun _ : Unit => + (m : (padicLocalField p).valuationSubring)) := by + rw [HasLinearTerm] + apply MvPowerSeries.nat_le_order + intro d hd + have hdNat : d.degree < 2 := by + exact_mod_cast hd + have hdegree : d.degree = d () := by + simp [Finsupp.degree_eq_sum] + have hd' : d () < 2 := by omega + by_cases hd0 : d () = 0 + · have hdeq : d = 0 := by + apply Finsupp.ext + intro i + cases i + simp [hd0] + subst d + change + PowerSeries.constantCoeff A - + MvPowerSeries.constantCoeff + (linearForm + (fun _ : Unit => + (m : (padicLocalField p).valuationSubring))) = + 0 + rw [hAconstant, constantCoeff_linearForm, sub_self] + · have hd1 : d () = 1 := by omega + have hdeq : d = Finsupp.single () 1 := by + apply Finsupp.ext + intro i + cases i + simp [hd1] + subst d + have hlinearForm : + linearForm + (fun _ : Unit => + (m : (padicLocalField p).valuationSubring)) = + MvPowerSeries.C + (m : (padicLocalField p).valuationSubring) * + MvPowerSeries.X () := by + simp [linearForm] + change + PowerSeries.coeff 1 A - + MvPowerSeries.coeff (Finsupp.single () 1) + (linearForm + (fun _ : Unit => + (m : (padicLocalField p).valuationSubring))) = + 0 + classical + rw [hAcoeffOne, hlinearForm, MvPowerSeries.coeff_C_mul, + MvPowerSeries.coeff_index_single_self_X, mul_one, sub_self] + have hAsubst : PowerSeries.HasSubst A := + hAlinear.hasSubst + have hEsubst : + PowerSeries.HasSubst Eps := by + apply PowerSeries.HasSubst.of_constantCoeff_zero + exact (padicMultiplicativeLubinTateSeries p).constantCoeff_eq_zero + have hAsubstOne : + PowerSeries.subst A + (1 : PowerSeries (padicLocalField p).valuationSubring) = + 1 := by + change + PowerSeries.subst A + (PowerSeries.C + (1 : (padicLocalField p).valuationSubring)) = + 1 + rw [PowerSeries.subst_C] + rfl + have hEsubstOne : + PowerSeries.subst Eps + (1 : PowerSeries (padicLocalField p).valuationSubring) = + 1 := by + change + PowerSeries.subst Eps + (PowerSeries.C + (1 : (padicLocalField p).valuationSubring)) = + 1 + rw [PowerSeries.subst_C] + rfl + have hAone : + 1 + A = (1 + PowerSeries.X) ^ m := by + dsimp only [A] + ring + have hEone : + 1 + Eps = + (1 + PowerSeries.X) ^ p := by + rw [hEps, PowerSeries.binomialSeries_nat (R := ℤ)] + ring + have hcommutes : + PowerSeries.subst A Eps = + PowerSeries.subst Eps A := by + calc + PowerSeries.subst A Eps = + (1 + A) ^ p - 1 := by + rw [hEps, PowerSeries.binomialSeries_nat (R := ℤ), + PowerSeries.subst_sub hAsubst, + PowerSeries.subst_pow hAsubst, + PowerSeries.subst_add hAsubst, + PowerSeries.subst_X hAsubst, hAsubstOne] + _ = ((1 + PowerSeries.X) ^ m) ^ p - 1 := by + rw [hAone] + _ = (1 + PowerSeries.X) ^ (m * p) - 1 := by + rw [← pow_mul] + _ = (1 + PowerSeries.X) ^ (p * m) - 1 := by + rw [mul_comm m p] + _ = ((1 + PowerSeries.X) ^ p) ^ m - 1 := by + rw [pow_mul] + _ = + (1 + Eps) ^ m - 1 := by + rw [hEone] + _ = + PowerSeries.subst Eps + ((1 + + (PowerSeries.X : + PowerSeries (padicLocalField p).valuationSubring)) ^ m - + 1) := by + symm + rw [PowerSeries.subst_sub hEsubst, + PowerSeries.subst_pow hEsubst, + PowerSeries.subst_add hEsubst, + PowerSeries.subst_X hEsubst, hEsubstOne] + _ = + PowerSeries.subst Eps A := + rfl + have hAintertwines : + Intertwines + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) A := by + change + PowerSeries.subst A Eps = + MvPowerSeries.subst + (fun i : Unit => + inVariable (padicMultiplicativeLubinTateSeries p) i) A + calc + PowerSeries.subst A Eps = + PowerSeries.subst Eps A := + hcommutes + _ = + MvPowerSeries.subst + (fun i : Unit => + inVariable (padicMultiplicativeLubinTateSeries p) i) A := by + symm + rw [PowerSeries.subst_def] + congr 1 + funext i + cases i + change + PowerSeries.subst PowerSeries.X Eps = Eps + exact PowerSeries.X_subst Eps + exact + eq_of_hasLinearTerm_of_intertwines hπ + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => + (m : (padicLocalField p).valuationSubring)) + (recursiveIntertwiner_hasLinearTerm hπ + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => + (m : (padicLocalField p).valuationSubring))) + (recursiveIntertwiner_intertwines hπ + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => + (m : (padicLocalField p).valuationSubring))) + hAlinear hAintertwines + +private theorem + padicValuationSubring_sub_toZModPow_val_mem_maximalIdeal_pow + (p : ℕ) [Fact p.Prime] (n : ℕ) + (a : (padicLocalField p).valuationSubring) : + let z := + (padicIntEquivValuationSubring p).symm + a + let m := (PadicInt.toZModPow (p := p) (n + 1) z).val + a - (m : (padicLocalField p).valuationSubring) ∈ + (padicLocalField p).toCompleteDVF.maximalIdeal ^ (n + 1) := by + change (padicDVRValuation p).valuationSubring at a + let e := padicIntEquivValuationSubring p + let z : ℤ_[p] := + e.symm a + let m := (PadicInt.toZModPow (p := p) (n + 1) z).val + have hz : + z - (m : ℤ_[p]) ∈ + Ideal.span ({(p : ℤ_[p]) ^ (n + 1)} : Set ℤ_[p]) := by + rw [← PadicInt.ker_toZModPow, RingHom.mem_ker] + rw [map_sub, map_natCast] + dsimp only [m] + rw [ZMod.natCast_zmod_val, sub_self] + have hzmax : + z - (m : ℤ_[p]) ∈ + IsLocalRing.maximalIdeal ℤ_[p] ^ (n + 1) := by + rw [PadicInt.maximalIdeal_eq_span_p, Ideal.span_singleton_pow] + exact hz + have hmapped : + e (z - (m : ℤ_[p])) ∈ + IsLocalRing.maximalIdeal + (padicDVRValuation p).valuationSubring ^ (n + 1) := + (ValuationTheory.ringEquiv_mem_maximalIdeal_pow_iff + e (n + 1) (z - (m : ℤ_[p]))).2 hzmax + change + a - (m : (padicDVRValuation p).valuationSubring) ∈ + IsLocalRing.maximalIdeal + (padicDVRValuation p).valuationSubring ^ (n + 1) + simpa only [map_sub, map_natCast, e, z, m, + RingEquiv.apply_symm_apply] using hmapped + +private theorem + padicStandardPrimitivePointIntegerAction_eq_toZModPow_val + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + let m := + (PadicInt.toZModPow (p := p) (n + 1) + ((padicIntEquivValuationSubring p).symm + (u : (padicLocalField p).valuationSubring))).val + standardLubinTatePrimitivePointIntegerAction + (padicMultiplicativeLubinTateSeries_isUniformizer p) n u = + standardLubinTateEndomorphismValue + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (m : (padicLocalField p).valuationSubring) := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let m := + (PadicInt.toZModPow (p := p) (n + 1) + ((padicIntEquivValuationSubring p).symm + (u : (padicLocalField p).valuationSubring))).val + let d : (padicLocalField p).valuationSubring := + (u : (padicLocalField p).valuationSubring) - m + have hd : + d ∈ (padicLocalField p).toCompleteDVF.maximalIdeal ^ (n + 1) := by + simpa only [d, m] using + padicValuationSubring_sub_toZModPow_val_mem_maximalIdeal_pow p n + (u : (padicLocalField p).valuationSubring) + have hdzero : + standardLubinTateEndomorphismValue hπ n d = 0 := + (standardLubinTateEndomorphismValue_eq_zero_iff_mem_maximalIdeal_pow + hπ n d).2 hd + change + standardLubinTateEndomorphismValue hπ n + (u : (padicLocalField p).valuationSubring) = + standardLubinTateEndomorphismValue hπ n + (m : (padicLocalField p).valuationSubring) + calc + standardLubinTateEndomorphismValue hπ n + (u : (padicLocalField p).valuationSubring) = + standardLubinTateEndomorphismValue hπ n + ((m : (padicLocalField p).valuationSubring) + d) := by + congr 1 + dsimp only [d] + ring + _ = + standardLubinTateFormalAdd hπ n + (standardLubinTateEndomorphismValue hπ n + (m : (padicLocalField p).valuationSubring)) + (standardLubinTateEndomorphismValue hπ n d) := + standardLubinTateEndomorphismValue_add hπ n m d + _ = + standardLubinTateFormalAdd hπ n + (standardLubinTateEndomorphismValue hπ n + (m : (padicLocalField p).valuationSubring)) + (standardLubinTateEndomorphismValue hπ n 0) := by + exact congrArg + (standardLubinTateFormalAdd hπ n + (standardLubinTateEndomorphismValue hπ n + (m : (padicLocalField p).valuationSubring))) + (hdzero.trans (standardLubinTateEndomorphismValue_zero hπ n).symm) + _ = + standardLubinTateEndomorphismValue hπ n + ((m : (padicLocalField p).valuationSubring) + 0) := + (standardLubinTateEndomorphismValue_add hπ n m 0).symm + _ = + standardLubinTateEndomorphismValue hπ n + (m : (padicLocalField p).valuationSubring) := by + rw [add_zero] + +private theorem padicStandardLubinTateSeries_eval_iterate + (p : ℕ) [Fact p.Prime] (n i : ℕ) : + standardLubinTateLevelPowerSeriesEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (standardLubinTatePrimitivePointIterateInteger + (padicMultiplicativeLubinTateSeries_isUniformizer p) n i) + (standardLubinTatePrimitivePointIterateInteger_hasEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n i) + (standardLubinTateSeries + (padicMultiplicativeLubinTateSeries_isUniformizer p)).toPowerSeries = + standardLubinTatePrimitivePointIterateInteger + (padicMultiplicativeLubinTateSeries_isUniformizer p) n (i + 1) := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let π : (padicLocalField p).valuationSubring := + padicIntEquivValuationSubring p (p : ℤ_[p]) + let x := standardLubinTatePrimitivePointIterateInteger hπ n i + have hpoly : + Polynomial.eval₂ (standardLubinTateLevelCoefficientHom hπ n) x + (standardLubinTatePolynomial (padicLocalField p) π) = + x ^ Nat.card (padicLocalField p).residueField + + standardLubinTateLevelCoefficientHom hπ n π * x := by + simp only [standardLubinTatePolynomial, Polynomial.eval₂_add, + Polynomial.eval₂_pow, Polynomial.eval₂_X, Polynomial.eval₂_mul, + Polynomial.eval₂_C] + rw [← standardLubinTatePolynomial_toPowerSeries_eq_series hπ] + exact (standardLubinTateLevelPowerSeriesEval_coe hπ n x + (standardLubinTatePrimitivePointIterateInteger_hasEval hπ n i) + (standardLubinTatePolynomial (padicLocalField p) π)).trans + (hpoly.trans (standardLubinTatePrimitivePointIterateInteger_succ hπ n i).symm) + +private theorem + padicStandardLubinTatePrimitivePointIterateInteger_ne_zero + (p : ℕ) [Fact p.Prime] (n : ℕ) : + standardLubinTatePrimitivePointIterateInteger + (padicMultiplicativeLubinTateSeries_isUniformizer p) n n ≠ + 0 := by + intro hzero + have hval := + standardLubinTatePrimitivePointIterateInteger_addVal + (padicMultiplicativeLubinTateSeries_isUniformizer p) n n le_rfl + rw [hzero, IsDiscreteValuationRing.addVal_zero] at hval + exact ENat.top_ne_natCast _ hval + +private theorem padicMultiplicativePrimitivePoint_pow_primePower + (p : ℕ) [Fact p.Prime] (n i : ℕ) : + (1 + padicMultiplicativePrimitivePoint p n) ^ (p ^ i) = + 1 + + standardLubinTateLevelPowerSeriesEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (standardLubinTatePrimitivePointIterateInteger + (padicMultiplicativeLubinTateSeries_isUniformizer p) n i) + (standardLubinTatePrimitivePointIterateInteger_hasEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n i) + (padicStandardToMultiplicativeIntertwiner p) := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let H := padicStandardToMultiplicativeIntertwiner p + let points : + ℕ → + {z : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring // + PowerSeries.HasEval z} := + fun j => + ⟨standardLubinTatePrimitivePointIterateInteger hπ n j, + standardLubinTatePrimitivePointIterateInteger_hasEval hπ n j⟩ + let evalH : + {z : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring // + PowerSeries.HasEval z} → + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := + fun z => + standardLubinTateLevelPowerSeriesEval hπ n z.1 z.2 H + change + (1 + padicMultiplicativePrimitivePoint p n) ^ (p ^ i) = + 1 + evalH (points i) + induction i with + | zero => + have hpacked : points 0 = + ⟨standardLubinTatePrimitivePointInteger hπ n, + standardLubinTatePrimitivePointInteger_hasEval hπ n⟩ := + Subtype.ext (standardLubinTatePrimitivePointIterateInteger_zero hπ n) + have heval : evalH (points 0) = + evalH ⟨standardLubinTatePrimitivePointInteger hπ n, + standardLubinTatePrimitivePointInteger_hasEval hπ n⟩ := + congrArg evalH hpacked + have hbase : + evalH ⟨standardLubinTatePrimitivePointInteger hπ n, + standardLubinTatePrimitivePointInteger_hasEval hπ n⟩ = + padicMultiplicativePrimitivePoint p n := by + simp only [evalH, H, padicMultiplicativePrimitivePoint, + standardLubinTatePrimitivePointEvaluation] + simpa only [pow_zero, pow_one] using + congrArg (fun z : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring => + 1 + z) (heval.trans hbase).symm + | succ i ih => + let Ebar := (standardLubinTateSeries hπ).toPowerSeries + let mappedPoint : + {z : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring // + PowerSeries.HasEval z} := + ⟨standardLubinTateLevelPowerSeriesEval hπ n + (points i).1 (points i).2 Ebar, + standardLubinTateLevelPowerSeriesEval_hasEval hπ n + (points i).1 (points i).2 Ebar + (PowerSeries.HasSubst.of_constantCoeff_zero + (LubinTateSeries.constantCoeff_eq_zero + (standardLubinTateSeries hπ)))⟩ + have hfunctional := + padicStandardToMultiplicativeIntertwiner_eval_functionalEquation + p n (points i).1 (points i).2 + rw [padicMultiplicativeLubinTateSeries_eval] at hfunctional + change + (1 + evalH (points i)) ^ p - 1 = + evalH mappedPoint at hfunctional + have hiterate : mappedPoint.1 = (points (i + 1)).1 := + padicStandardLubinTateSeries_eval_iterate p n i + have hpacked : mappedPoint = points (i + 1) := + Subtype.ext hiterate + have hfunctionalClean : + (1 + evalH (points i)) ^ p - 1 = + evalH (points (i + 1)) := + hfunctional.trans (congrArg evalH hpacked) + have hstep : + (1 + evalH (points i)) ^ p = + 1 + evalH (points (i + 1)) := by + calc + _ = evalH (points (i + 1)) + 1 := + sub_eq_iff_eq_add.mp hfunctionalClean + _ = _ := add_comm _ _ + calc + (1 + padicMultiplicativePrimitivePoint p n) ^ (p ^ (i + 1)) = + ((1 + padicMultiplicativePrimitivePoint p n) ^ (p ^ i)) ^ p := by + rw [pow_succ, pow_mul] + _ = (1 + evalH (points i)) ^ p := by rw [ih] + _ = 1 + evalH (points (i + 1)) := hstep + +/-- The root of unity obtained from the standard primitive Lubin--Tate +point through the multiplicative comparison. Level `n` corresponds to +exact order `p ^ (n + 1)`. -/ +noncomputable def padicMultiplicativePrimitiveRoot + (p : ℕ) [Fact p.Prime] (n : ℕ) : + standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) n := + 1 + (padicMultiplicativePrimitivePoint p n : + standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) n) + +/-- The finite Lubin--Tate unit action becomes the usual power action on +the actual primitive `p ^ (n + 1)`-st root. The exponent is the canonical +mathlib reduction of the corresponding `p`-adic integer modulo +`p ^ (n + 1)`. This is the finite-level cyclotomic action formula. -/ +private theorem padicMultiplicativePrimitiveRoot_unitAction + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + 1 + + (standardLubinTateLevelPowerSeriesEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (standardLubinTatePrimitivePointIntegerAction + (padicMultiplicativeLubinTateSeries_isUniformizer p) n u) + (standardLubinTatePrimitivePointIntegerAction_hasEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n u) + (padicStandardToMultiplicativeIntertwiner p) : + standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) n) = + padicMultiplicativePrimitiveRoot p n ^ + (PadicInt.toZModPow (p := p) (n + 1) + ((padicIntEquivValuationSubring p).symm + (u : (padicLocalField p).valuationSubring))).val := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let H := padicStandardToMultiplicativeIntertwiner p + let m := + (PadicInt.toZModPow (p := p) (n + 1) + ((padicIntEquivValuationSubring p).symm + (u : (padicLocalField p).valuationSubring))).val + let lambda := + standardLubinTatePrimitivePointInteger hπ n + let hlambda := + standardLubinTatePrimitivePointInteger_hasEval hπ n + let lambdaU := + standardLubinTatePrimitivePointIntegerAction hπ n u + let hlambdaU := + standardLubinTatePrimitivePointIntegerAction_hasEval hπ n u + let zetaMinusOne := padicMultiplicativePrimitivePoint p n + let hzetaMinusOne := + padicMultiplicativePrimitivePoint_hasEval p n + have hlambdaUeq : + lambdaU = + standardLubinTateEndomorphismValue hπ n + (m : (padicLocalField p).valuationSubring) := by + simpa only [lambdaU, hπ, m] using + padicStandardPrimitivePointIntegerAction_eq_toZModPow_val p n u + have hscalar : + standardLubinTateLevelPowerSeriesEval hπ n + (standardLubinTateEndomorphismValue hπ n + (m : (padicLocalField p).valuationSubring)) + (standardLubinTateEndomorphismValue_hasEval hπ n + (m : (padicLocalField p).valuationSubring)) + H = + standardLubinTateLevelPowerSeriesEval hπ n + zetaMinusOne hzetaMinusOne + (recursiveIntertwiner hπ + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => + (m : (padicLocalField p).valuationSubring))) := by + simpa [standardLubinTateEndomorphismValue, + padicMultiplicativePrimitivePoint, + standardLubinTatePrimitivePointEvaluation, + hπ, H, lambda, hlambda, zetaMinusOne, hzetaMinusOne] using + padicStandardToMultiplicativeIntertwiner_eval_endomorphism + p n lambda hlambda + (m : (padicLocalField p).valuationSubring) + have heval : + standardLubinTateLevelPowerSeriesEval hπ n + lambdaU hlambdaU H = + (1 + zetaMinusOne) ^ m - 1 := by + have eval_eq_of_point_eq + {x y : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring} + (hx : PowerSeries.HasEval x) (hy : PowerSeries.HasEval y) + (hxy : x = y) : + standardLubinTateLevelPowerSeriesEval hπ n x hx H = + standardLubinTateLevelPowerSeriesEval hπ n y hy H := by + subst y + rfl + calc + standardLubinTateLevelPowerSeriesEval hπ n + lambdaU hlambdaU H = + standardLubinTateLevelPowerSeriesEval hπ n + (standardLubinTateEndomorphismValue hπ n + (m : (padicLocalField p).valuationSubring)) + (standardLubinTateEndomorphismValue_hasEval hπ n + (m : (padicLocalField p).valuationSubring)) + H := by + exact eval_eq_of_point_eq hlambdaU _ hlambdaUeq + _ = + standardLubinTateLevelPowerSeriesEval hπ n + zetaMinusOne hzetaMinusOne + (recursiveIntertwiner hπ + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => + (m : (padicLocalField p).valuationSubring))) := + hscalar + _ = + standardLubinTateLevelPowerSeriesEval hπ n + zetaMinusOne hzetaMinusOne + ((1 + PowerSeries.X) ^ m - 1) := by + rw [padicMultiplicativeScalarEndomorphism_nat] + _ = (1 + zetaMinusOne) ^ m - 1 := by + simp only [map_sub, map_pow, map_add, map_one] + exact congrArg + (fun z : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring => + (1 + z) ^ m - 1) + (standardLubinTateLevelPowerSeriesEval_X + hπ n zetaMinusOne hzetaMinusOne) + have hrootInteger : + 1 + + standardLubinTateLevelPowerSeriesEval hπ n + lambdaU hlambdaU H = + (1 + zetaMinusOne) ^ m := by + rw [heval] + ring + have hrootField := + congrArg + (fun x : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring => + (x : standardLubinTateLevelField hπ n)) + hrootInteger + simpa [padicMultiplicativePrimitiveRoot, hπ, H, m, + lambdaU, hlambdaU, zetaMinusOne] using hrootField + +private theorem padicMultiplicativeLevelAlgEquiv_mem_valuationSubring_iff + (p : ℕ) [Fact p.Prime] (n : ℕ) + (σ : Gal((standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) n)/ℚ_[p])) + (x : standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) n) : + x ∈ (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuation.valuationSubring ↔ + σ x ∈ (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuation.valuationSubring := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let target := standardLubinTateLevelCompleteDVF hπ n + let L := standardLubinTateLevelField hπ n + let : Algebra (padicLocalField p).valuationSubring target.valuationSubring := + (standardLubinTateLevelCoefficientHom hπ n).toAlgebra + let : WithIdeal target.valuationSubring := + padicMultiplicativeLevelTargetWithIdeal + (F := padicLocalField p) + (π := show (padicLocalField p).valuationSubring from + padicIntEquivValuationSubring p (p : ℤ_[p])) hπ n + let : IsScalarTower + (padicLocalField p).valuationSubring target.valuationSubring L := + IsScalarTower.of_algebraMap_eq' rfl + let : IsIntegralClosure + target.valuationSubring + (padicLocalField p).valuationSubring L := + standardLubinTateLevelCompleteDVF_isIntegralClosure hπ n + have hforward + (τ : Gal(L/ℚ_[p])) {y : L} + (hy : y ∈ target.valuation.valuationSubring) : + τ y ∈ target.valuation.valuationSubring := by + have hyIntegral : + IsIntegral (padicLocalField p).valuationSubring y := + (IsIntegralClosure.isIntegral_iff + (A := target.valuationSubring) + (R := (padicLocalField p).valuationSubring) + (B := L)).2 + ⟨⟨y, hy⟩, rfl⟩ + have hτIntegral : + IsIntegral (padicLocalField p).valuationSubring (τ y) := + IsIntegral.map τ.toAlgHom hyIntegral + rcases + (IsIntegralClosure.isIntegral_iff + (A := target.valuationSubring) + (R := (padicLocalField p).valuationSubring) + (B := L)).1 hτIntegral + with ⟨z, hz⟩ + exact hz ▸ z.property + constructor + · exact hforward σ + · intro hσx + have hback := hforward σ.symm hσx + simpa using hback + +private noncomputable def + padicMultiplicativeLevelAutomorphismIntegerRingEquiv + (p : ℕ) [Fact p.Prime] (n : ℕ) + (σ : Gal((standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) n)/ℚ_[p])) : + (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring ≃+* + (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring := + higherPrincipalUnitGroup.valuationSubringRingEquivOfPreserves + (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n) + σ.toRingEquiv + (padicMultiplicativeLevelAlgEquiv_mem_valuationSubring_iff p n σ) + +@[simp] +private theorem + padicMultiplicativeLevelAutomorphismIntegerRingEquiv_apply + (p : ℕ) [Fact p.Prime] (n : ℕ) + (σ : Gal((standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) n)/ℚ_[p])) + (x : (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring) : + ((padicMultiplicativeLevelAutomorphismIntegerRingEquiv p n σ x : + (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring) : + standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) n) = + σ (x : standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) n) := + rfl + +private theorem + padicMultiplicativeLevelAutomorphismIntegerRingEquiv_continuous + (p : ℕ) [Fact p.Prime] (n : ℕ) + (σ : Gal((standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) n)/ℚ_[p])) : + Continuous (padicMultiplicativeLevelAutomorphismIntegerRingEquiv p n σ) := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let target := standardLubinTateLevelCompleteDVF hπ n + let : WithIdeal target.valuationSubring := + padicMultiplicativeLevelTargetWithIdeal + (F := padicLocalField p) + (π := show (padicLocalField p).valuationSubring from + padicIntEquivValuationSubring p (p : ℤ_[p])) hπ n + let r := padicMultiplicativeLevelAutomorphismIntegerRingEquiv p n σ + apply continuous_of_continuousAt_zero r + rw [ContinuousAt, map_zero] + have hadic : IsAdic target.maximalIdeal := rfl + apply (hadic.hasBasis_nhds_zero.tendsto_right_iff).2 + intro m _ + apply (hadic.hasBasis_nhds_zero.mem_iff).2 + refine ⟨m, trivial, ?_⟩ + intro x hx + exact + (higherPrincipalUnitGroup.valuationSubringRingEquivOfPreserves_mem_maximalIdeal_pow_iff + target σ.toRingEquiv + (padicMultiplicativeLevelAlgEquiv_mem_valuationSubring_iff p n σ) + m x).2 hx + +private theorem + padicMultiplicativeLevelAutomorphismIntegerRingEquiv_comp_coefficientHom + (p : ℕ) [Fact p.Prime] (n : ℕ) + (σ : Gal((standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p) n)/ℚ_[p])) : + (padicMultiplicativeLevelAutomorphismIntegerRingEquiv p n σ : + (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring →+* + (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring).comp + (standardLubinTateLevelCoefficientHom + (padicMultiplicativeLubinTateSeries_isUniformizer p) n) = + standardLubinTateLevelCoefficientHom + (padicMultiplicativeLubinTateSeries_isUniformizer p) n := by + ext a : 1 + apply Subtype.ext + simp only [RingHom.comp_apply] + exact σ.commutes (a : ℚ_[p]) + +private theorem + padicMultiplicativeLevelAutomorphismIntegerRingEquiv_primitivePointEvaluation + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + padicMultiplicativeLevelAutomorphismIntegerRingEquiv p n + ((standardLubinTateUnitParameterEquivGal + (padicLocalField p) + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u))⁻¹) + (padicMultiplicativePrimitivePoint p n) = + standardLubinTateLevelPowerSeriesEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (standardLubinTatePrimitivePointIntegerAction + (padicMultiplicativeLubinTateSeries_isUniformizer p) n u⁻¹) + (standardLubinTatePrimitivePointIntegerAction_hasEval + (padicMultiplicativeLubinTateSeries_isUniformizer p) n u⁻¹) + (padicStandardToMultiplicativeIntertwiner p) := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let target := standardLubinTateLevelCompleteDVF hπ n + let L := standardLubinTateLevelField hπ n + let σ : Gal(L/ℚ_[p]) := + (standardLubinTateUnitParameterEquivGal + (padicLocalField p) hπ n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u))⁻¹ + let r := padicMultiplicativeLevelAutomorphismIntegerRingEquiv p n σ + let H := padicStandardToMultiplicativeIntertwiner p + let lambda := standardLubinTatePrimitivePointInteger hπ n + let lambdaInv := standardLubinTatePrimitivePointIntegerAction hπ n u⁻¹ + let hlambdaInv := + standardLubinTatePrimitivePointIntegerAction_hasEval hπ n u⁻¹ + let zetaMinusOne := padicMultiplicativePrimitivePoint p n + let : WithIdeal target.valuationSubring := + padicMultiplicativeLevelTargetWithIdeal + (F := padicLocalField p) + (π := show (padicLocalField p).valuationSubring from + padicIntEquivValuationSubring p (p : ℤ_[p])) hπ n + have hrLambda : r lambda = lambdaInv := by + apply Subtype.ext + rw [padicMultiplicativeLevelAutomorphismIntegerRingEquiv_apply] + change + σ (standardLubinTateLevelGenerator hπ n) = + standardLubinTatePrimitiveLevelAction hπ n u⁻¹ + simpa only [σ, standardLubinTateLevelGenerator] using + standardLubinTateUnitParameterEquivGal_inv_class_apply_gen + (padicLocalField p) hπ n u + have hcoeffContinuous : + @Continuous + (padicLocalField p).valuationSubring + target.valuationSubring + (padicMultiplicativeLevelCoefficientUniformSpace + (padicLocalField p)).toTopologicalSpace + (inferInstance : UniformSpace target.valuationSubring).toTopologicalSpace + (standardLubinTateLevelCoefficientHom hπ n) := by + change @Continuous + (padicLocalField p).valuationSubring target.valuationSubring ⊥ _ _ + exact + @continuous_of_discreteTopology + (padicLocalField p).valuationSubring + ⊥ + (discreteTopology_bot (padicLocalField p).valuationSubring) + target.valuationSubring + _ + (standardLubinTateLevelCoefficientHom hπ n) + let : T2Space target.valuationSubring := + padicMultiplicativeLevelTargetT2Space + (F := padicLocalField p) + (π := show (padicLocalField p).valuationSubring from + padicIntEquivValuationSubring p (p : ℤ_[p])) hπ n + let : CompleteSpace target.valuationSubring := + padicMultiplicativeLevelTargetCompleteSpace + (F := padicLocalField p) + (π := show (padicLocalField p).valuationSubring from + padicIntEquivValuationSubring p (p : ℤ_[p])) hπ n + have hcomp := + PowerSeries.comp_eval₂ + (R := (padicLocalField p).valuationSubring) + (S := target.valuationSubring) + (φ := standardLubinTateLevelCoefficientHom hπ n) + (a := lambda) + hcoeffContinuous + (standardLubinTatePrimitivePointInteger_hasEval hπ n) + (ε := (r : target.valuationSubring →+* target.valuationSubring)) + (padicMultiplicativeLevelAutomorphismIntegerRingEquiv_continuous p n σ) + have happ := congrArg (fun f => f H) hcomp + rw [padicMultiplicativeLevelAutomorphismIntegerRingEquiv_comp_coefficientHom + p n σ] at happ + have hrLambdaRing : + (r : target.valuationSubring →+* target.valuationSubring) lambda = + lambdaInv := + hrLambda + rw [hrLambdaRing] at happ + change + r zetaMinusOne = + standardLubinTateLevelPowerSeriesEval hπ n lambdaInv hlambdaInv H + simpa [zetaMinusOne, padicMultiplicativePrimitivePoint, + standardLubinTatePrimitivePointEvaluation, + standardLubinTateLevelPowerSeriesEval, + PowerSeries.coe_eval₂Hom, Function.comp_apply, + target, lambda, H] using happ + +/-- For the finite Galois element supplied by the Lubin--Tate unit +parameter, the inverse automorphism acts on the actual primitive +`p ^ (n + 1)`-st root by the inverse unit exponent modulo `p ^ (n + 1)`. +This is the explicit cyclotomic norm-residue formula. -/ +theorem padicMultiplicativePrimitiveRoot_galoisAction + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + (standardLubinTateUnitParameterEquivGal + (padicLocalField p) + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u))⁻¹ + (padicMultiplicativePrimitiveRoot p n) = + padicMultiplicativePrimitiveRoot p n ^ + (PadicInt.toZModPow (p := p) (n + 1) + ((padicIntEquivValuationSubring p).symm + ((u⁻¹ : (padicLocalField p).valuationSubringˣ) : + (padicLocalField p).valuationSubring))).val := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let target := standardLubinTateLevelCompleteDVF hπ n + let L := standardLubinTateLevelField hπ n + let σ : Gal(L/ℚ_[p]) := + (standardLubinTateUnitParameterEquivGal + (padicLocalField p) hπ n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u))⁻¹ + let r := padicMultiplicativeLevelAutomorphismIntegerRingEquiv p n σ + let H := padicStandardToMultiplicativeIntertwiner p + let lambdaInv := + standardLubinTatePrimitivePointIntegerAction hπ n u⁻¹ + let hlambdaInv := + standardLubinTatePrimitivePointIntegerAction_hasEval hπ n u⁻¹ + let zetaMinusOne := padicMultiplicativePrimitivePoint p n + have hσOneAdd (x : L) : σ (1 + x) = 1 + σ x := by + calc + σ (1 + x) = σ 1 + σ x := σ.map_add 1 x + _ = 1 + σ x := congrArg (fun y : L => y + σ x) σ.map_one + have hrApply (x : target.valuationSubring) : + ((r x : target.valuationSubring) : L) = + σ (x : L) := + padicMultiplicativeLevelAutomorphismIntegerRingEquiv_apply p n σ x + have hrEval : + r zetaMinusOne = + standardLubinTateLevelPowerSeriesEval hπ n + lambdaInv hlambdaInv H := by + exact + padicMultiplicativeLevelAutomorphismIntegerRingEquiv_primitivePointEvaluation + p n u + change + σ (padicMultiplicativePrimitiveRoot p n) = + padicMultiplicativePrimitiveRoot p n ^ + (PadicInt.toZModPow (p := p) (n + 1) + ((padicIntEquivValuationSubring p).symm + ((u⁻¹ : (padicLocalField p).valuationSubringˣ) : + (padicLocalField p).valuationSubring))).val + calc + σ (padicMultiplicativePrimitiveRoot p n) = + σ (1 + (zetaMinusOne : L)) := by + rfl + _ = 1 + σ (zetaMinusOne : L) := + hσOneAdd (zetaMinusOne : L) + _ = 1 + (r zetaMinusOne : L) := by + rw [hrApply] + _ = + 1 + + (standardLubinTateLevelPowerSeriesEval hπ n + lambdaInv hlambdaInv H : L) := by + rw [hrEval] + _ = + padicMultiplicativePrimitiveRoot p n ^ + (PadicInt.toZModPow (p := p) (n + 1) + ((padicIntEquivValuationSubring p).symm + ((u⁻¹ : (padicLocalField p).valuationSubringˣ) : + (padicLocalField p).valuationSubring))).val := by + simpa only [hπ, H, lambdaInv, hlambdaInv] using + padicMultiplicativePrimitiveRoot_unitAction p n u⁻¹ + +/-- The finite Lubin--Tate parameter automorphism itself acts on the +genuine primitive `p ^ (n + 1)`-st root by the direct unit exponent. + +This is the direct-orientation companion to +`padicMultiplicativePrimitiveRoot_galoisAction`: applying that theorem +to the inverse unit cancels both inversions. -/ +theorem padicMultiplicativePrimitiveRoot_unitParameterGaloisAction + (p : ℕ) [Fact p.Prime] (n : ℕ) + (u : (padicLocalField p).valuationSubringˣ) : + standardLubinTateUnitParameterEquivGal + (padicLocalField p) + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + (standardLubinTateUnitParameterClass + (padicLocalField p) n u) + (padicMultiplicativePrimitiveRoot p n) = + padicMultiplicativePrimitiveRoot p n ^ + (PadicInt.toZModPow (p := p) (n + 1) + ((padicIntEquivValuationSubring p).symm + ((u : (padicLocalField p).valuationSubringˣ) : + (padicLocalField p).valuationSubring))).val := by + simpa only [map_inv, inv_inv] using + padicMultiplicativePrimitiveRoot_galoisAction p n u⁻¹ + +/-- The multiplicative comparison identifies the standard level-`n` +Lubin--Tate generator with a primitive `p ^ (n + 1)`-st root of unity. -/ +theorem padicMultiplicativePrimitiveRoot_isPrimitiveRoot + (p : ℕ) [Fact p.Prime] (n : ℕ) : + IsPrimitiveRoot (padicMultiplicativePrimitiveRoot p n) (p ^ (n + 1)) := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let H := padicStandardToMultiplicativeIntertwiner p + let iteratePoint := + standardLubinTatePrimitivePointIterateInteger hπ n + have hfinalInteger : + (1 + padicMultiplicativePrimitivePoint p n) ^ (p ^ (n + 1)) = 1 := by + have hpow := + padicMultiplicativePrimitivePoint_pow_primePower p n (n + 1) + have hevalZero : + standardLubinTateLevelPowerSeriesEval hπ n + (iteratePoint (n + 1)) + (standardLubinTatePrimitivePointIterateInteger_hasEval + hπ n (n + 1)) H = + 0 := by + have hpoint : + iteratePoint (n + 1) = 0 := by + simpa only [iteratePoint, + standardLubinTatePrimitivePointIterateInteger, + standardLubinTateLevelCoefficientHom] using + standardLubinTatePrimitivePointInteger_iterate_succ_eq_zero hπ n + let evalForward : + {z : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring // + PowerSeries.HasEval z} → + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := + fun z => + standardLubinTateLevelPowerSeriesEval hπ n z.1 z.2 H + have hpacked : + (⟨iteratePoint (n + 1), + standardLubinTatePrimitivePointIterateInteger_hasEval + hπ n (n + 1)⟩ : + {z : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring // + PowerSeries.HasEval z}) = + ⟨0, PowerSeries.HasEval.zero⟩ := + Subtype.ext hpoint + exact + (congrArg evalForward hpacked).trans + (padicStandardToMultiplicativeIntertwiner_eval_zero p n) + calc + _ = 1 + + standardLubinTateLevelPowerSeriesEval hπ n + (iteratePoint (n + 1)) + (standardLubinTatePrimitivePointIterateInteger_hasEval + hπ n (n + 1)) H := hpow + _ = 1 := by rw [hevalZero, add_zero] + have hfinal : + padicMultiplicativePrimitiveRoot p n ^ (p ^ (n + 1)) = 1 := by + simpa [padicMultiplicativePrimitiveRoot] using + congrArg + (fun z : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring => + (z : standardLubinTateLevelField hπ n)) + hfinalInteger + have hprevious : + ¬padicMultiplicativePrimitiveRoot p n ^ (p ^ n) = 1 := by + intro hpower + have hpowerInteger : + (1 + padicMultiplicativePrimitivePoint p n) ^ (p ^ n) = 1 := by + apply Subtype.ext + simpa [padicMultiplicativePrimitiveRoot] using hpower + have hiterateEvaluation : + standardLubinTateLevelPowerSeriesEval hπ n (iteratePoint n) + (standardLubinTatePrimitivePointIterateInteger_hasEval hπ n n) H = + 0 := by + have hpow := + padicMultiplicativePrimitivePoint_pow_primePower p n n + rw [hpowerInteger] at hpow + have hsub := congrArg + (fun z : + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring => + z - 1) + hpow + simpa using hsub.symm + have hiterateZero : iteratePoint n = 0 := by + apply padicStandardToMultiplicativeIntertwiner_eval_injective + p n + (standardLubinTatePrimitivePointIterateInteger_hasEval hπ n n) + PowerSeries.HasEval.zero + simpa [H, padicStandardToMultiplicativeIntertwiner_eval_zero] using + hiterateEvaluation + exact + padicStandardLubinTatePrimitivePointIterateInteger_ne_zero p n + hiterateZero + rw [IsPrimitiveRoot.iff_orderOf] + exact orderOf_eq_prime_pow hprevious hfinal + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeIntertwiner.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeIntertwiner.lean new file mode 100644 index 0000000000..fd07b7c0bd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeIntertwiner.lean @@ -0,0 +1,390 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeSeries +/-! +# Comparing the standard and multiplicative Lubin--Tate series over `ℚ_p` + +The characteristic-independent same-uniformizer recursion supplies the +canonical series with linear coefficient `1` satisfying + +`[(1 + X)^p - 1](H(X)) = H([pX + X^p](X))`. + +Consequently, evaluation of `H` carries standard Lubin--Tate division points +to multiplicative division points. This file constructs that series directly; +it does not identify the two actions from equality of their kernels. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open SameUniformizer + +/-- The canonical linear-term-one intertwiner carrying standard Lubin--Tate +division points over `ℚ_p` to multiplicative division points. -/ +noncomputable def padicStandardToMultiplicativeIntertwiner + (p : ℕ) [Fact p.Prime] : + PowerSeries (padicLocalField p).valuationSubring := + recursiveIntertwiner + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (padicMultiplicativeLubinTateSeries p) + (standardLubinTateSeries + (padicMultiplicativeLubinTateSeries_isUniformizer p)) + (fun _ : Unit => 1) + +/-- The standard-to-multiplicative intertwiner has linear coefficient `1` +and no constant term. -/ +theorem padicStandardToMultiplicativeIntertwiner_hasLinearTerm + (p : ℕ) [Fact p.Prime] : + HasLinearTerm (padicStandardToMultiplicativeIntertwiner p) + (fun _ : Unit => + (1 : (padicLocalField p).valuationSubring)) := + recursiveIntertwiner_hasLinearTerm + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (padicMultiplicativeLubinTateSeries p) + (standardLubinTateSeries + (padicMultiplicativeLubinTateSeries_isUniformizer p)) + (fun _ : Unit => 1) + +/-- The canonical series satisfies the literal same-uniformizer equation +from the multiplicative series to the standard series. -/ +theorem padicStandardToMultiplicativeIntertwiner_intertwines + (p : ℕ) [Fact p.Prime] : + Intertwines + (padicMultiplicativeLubinTateSeries p) + (standardLubinTateSeries + (padicMultiplicativeLubinTateSeries_isUniformizer p)) + (padicStandardToMultiplicativeIntertwiner p) := + recursiveIntertwiner_intertwines + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (padicMultiplicativeLubinTateSeries p) + (standardLubinTateSeries + (padicMultiplicativeLubinTateSeries_isUniformizer p)) + (fun _ : Unit => 1) + +/-- One-variable form of the intertwining equation: +the multiplicative series after `H` equals `H` after the standard series. -/ +theorem padicStandardToMultiplicativeIntertwiner_functionalEquation + (p : ℕ) [Fact p.Prime] : + PowerSeries.subst + (padicStandardToMultiplicativeIntertwiner p) + (padicMultiplicativeLubinTateSeries p).toPowerSeries = + PowerSeries.subst + (standardLubinTateSeries + (padicMultiplicativeLubinTateSeries_isUniformizer p)).toPowerSeries + (padicStandardToMultiplicativeIntertwiner p) := by + have h := + padicStandardToMultiplicativeIntertwiner_intertwines p + calc + PowerSeries.subst + (padicStandardToMultiplicativeIntertwiner p) + (padicMultiplicativeLubinTateSeries p).toPowerSeries = + MvPowerSeries.subst + (fun i : Unit => + inVariable + (standardLubinTateSeries + (padicMultiplicativeLubinTateSeries_isUniformizer p)) i) + (padicStandardToMultiplicativeIntertwiner p) := + h + _ = + PowerSeries.subst + (standardLubinTateSeries + (padicMultiplicativeLubinTateSeries_isUniformizer p)).toPowerSeries + (padicStandardToMultiplicativeIntertwiner p) := by + rw [PowerSeries.subst_def] + congr 1 + funext i + cases i + exact + PowerSeries.X_subst + (standardLubinTateSeries + (padicMultiplicativeLubinTateSeries_isUniformizer p)).toPowerSeries + +/-- The intertwiner has zero constant coefficient, hence admits formal +substitution. -/ +theorem padicStandardToMultiplicativeIntertwiner_hasSubst + (p : ℕ) [Fact p.Prime] : + PowerSeries.HasSubst + (padicStandardToMultiplicativeIntertwiner p) := + (padicStandardToMultiplicativeIntertwiner_hasLinearTerm p).hasSubst + +/-- The coefficient of `X` in the canonical intertwiner is `1`. -/ +@[simp] +theorem padicStandardToMultiplicativeIntertwiner_coeff_one + (p : ℕ) [Fact p.Prime] : + PowerSeries.coeff 1 + (padicStandardToMultiplicativeIntertwiner p) = + 1 := + (padicStandardToMultiplicativeIntertwiner_hasLinearTerm p).coeff_single () + +/-- Conjugating a standard scalar endomorphism through the canonical +comparison gives the unique multiplicative-series endomorphism with the +same scalar linear coefficient. -/ +theorem padicStandardToMultiplicativeIntertwiner_endomorphism + (p : ℕ) [Fact p.Prime] + (a : (padicLocalField p).valuationSubring) : + PowerSeries.subst + (standardLubinTateEndomorphism + (padicMultiplicativeLubinTateSeries_isUniformizer p) a) + (padicStandardToMultiplicativeIntertwiner p) = + PowerSeries.subst + (padicStandardToMultiplicativeIntertwiner p) + (recursiveIntertwiner + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => a)) := by + let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p + let E := padicMultiplicativeLubinTateSeries p + let Ebar := standardLubinTateSeries hπ + let H := padicStandardToMultiplicativeIntertwiner p + let S := standardLubinTateEndomorphism hπ a + let M := + recursiveIntertwiner hπ E E (fun _ : Unit => a) + have hH : + HasLinearTerm H + (fun _ : Unit => + (1 : (padicLocalField p).valuationSubring)) := + padicStandardToMultiplicativeIntertwiner_hasLinearTerm p + have hS : + HasLinearTerm S (fun _ : Unit => a) := + standardLubinTateEndomorphism_hasLinearTerm hπ a + have hM : + HasLinearTerm M (fun _ : Unit => a) := + recursiveIntertwiner_hasLinearTerm hπ E E (fun _ : Unit => a) + have hleftLinearRaw := + hH.subst + (G := fun _ : Unit => S) + (M := fun _ : Unit => fun _ : Unit => a) + (fun _ => hS) + have hleftLinear : + HasLinearTerm (PowerSeries.subst S H) + (fun _ : Unit => a) := by + simpa [PowerSeries.subst_def] using hleftLinearRaw + have hrightLinearRaw := + hM.subst + (G := fun _ : Unit => H) + (M := fun _ : Unit => fun _ : Unit => + (1 : (padicLocalField p).valuationSubring)) + (fun _ => hH) + have hrightLinear : + HasLinearTerm (PowerSeries.subst H M) + (fun _ : Unit => a) := by + simpa [PowerSeries.subst_def] using hrightLinearRaw + have hHIntertwines : + Intertwines E Ebar H := + padicStandardToMultiplicativeIntertwiner_intertwines p + have hSIntertwines : + Intertwines Ebar Ebar S := + standardLubinTateEndomorphism_intertwines hπ a + have hMIntertwines : + Intertwines E E M := + recursiveIntertwiner_intertwines hπ E E (fun _ : Unit => a) + have hleftIntertwines : + Intertwines E Ebar (PowerSeries.subst S H) := + hHIntertwines.powerSeries_subst hH.hasSubst + hSIntertwines hS.hasSubst + have hrightIntertwines : + Intertwines E Ebar (PowerSeries.subst H M) := + hMIntertwines.powerSeries_subst hM.hasSubst + hHIntertwines hH.hasSubst + exact + eq_of_hasLinearTerm_of_intertwines hπ E Ebar + (fun _ : Unit => a) + hleftLinear hleftIntertwines + hrightLinear hrightIntertwines + +/-- The canonical inverse-direction intertwiner carrying multiplicative +division points to standard Lubin--Tate division points. -/ +noncomputable def padicMultiplicativeToStandardIntertwiner + (p : ℕ) [Fact p.Prime] : + PowerSeries (padicLocalField p).valuationSubring := + recursiveIntertwiner + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (standardLubinTateSeries + (padicMultiplicativeLubinTateSeries_isUniformizer p)) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => 1) + +/-- The multiplicative-to-standard intertwiner also has linear coefficient +`1` and no constant term. -/ +theorem padicMultiplicativeToStandardIntertwiner_hasLinearTerm + (p : ℕ) [Fact p.Prime] : + HasLinearTerm (padicMultiplicativeToStandardIntertwiner p) + (fun _ : Unit => + (1 : (padicLocalField p).valuationSubring)) := + recursiveIntertwiner_hasLinearTerm + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (standardLubinTateSeries + (padicMultiplicativeLubinTateSeries_isUniformizer p)) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => 1) + +/-- The inverse-direction canonical series satisfies its literal +same-uniformizer equation. -/ +theorem padicMultiplicativeToStandardIntertwiner_intertwines + (p : ℕ) [Fact p.Prime] : + Intertwines + (standardLubinTateSeries + (padicMultiplicativeLubinTateSeries_isUniformizer p)) + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeToStandardIntertwiner p) := + recursiveIntertwiner_intertwines + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (standardLubinTateSeries + (padicMultiplicativeLubinTateSeries_isUniformizer p)) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => 1) + +/-- One-variable form of the inverse-direction intertwining equation. -/ +theorem padicMultiplicativeToStandardIntertwiner_functionalEquation + (p : ℕ) [Fact p.Prime] : + PowerSeries.subst + (padicMultiplicativeToStandardIntertwiner p) + (standardLubinTateSeries + (padicMultiplicativeLubinTateSeries_isUniformizer p)).toPowerSeries = + PowerSeries.subst + (padicMultiplicativeLubinTateSeries p).toPowerSeries + (padicMultiplicativeToStandardIntertwiner p) := by + have h := + padicMultiplicativeToStandardIntertwiner_intertwines p + calc + PowerSeries.subst + (padicMultiplicativeToStandardIntertwiner p) + (standardLubinTateSeries + (padicMultiplicativeLubinTateSeries_isUniformizer p)).toPowerSeries = + MvPowerSeries.subst + (fun i : Unit => + inVariable (padicMultiplicativeLubinTateSeries p) i) + (padicMultiplicativeToStandardIntertwiner p) := + h + _ = + PowerSeries.subst + (padicMultiplicativeLubinTateSeries p).toPowerSeries + (padicMultiplicativeToStandardIntertwiner p) := by + rw [PowerSeries.subst_def] + congr 1 + funext i + cases i + exact + PowerSeries.X_subst + (padicMultiplicativeLubinTateSeries p).toPowerSeries + +/-- The inverse-direction intertwiner admits formal substitution. -/ +theorem padicMultiplicativeToStandardIntertwiner_hasSubst + (p : ℕ) [Fact p.Prime] : + PowerSeries.HasSubst + (padicMultiplicativeToStandardIntertwiner p) := + (padicMultiplicativeToStandardIntertwiner_hasLinearTerm p).hasSubst + +/-- Composing the standard-to-multiplicative comparison after its reverse +is the identity on the multiplicative coordinate. -/ +theorem padicStandardToMultiplicativeIntertwiner_subst_reverse + (p : ℕ) [Fact p.Prime] : + PowerSeries.subst + (padicMultiplicativeToStandardIntertwiner p) + (padicStandardToMultiplicativeIntertwiner p) = + PowerSeries.X := by + have hcomp := + (padicStandardToMultiplicativeIntertwiner_hasLinearTerm p).subst + (G := fun _ : Unit => + padicMultiplicativeToStandardIntertwiner p) + (M := fun _ : Unit => fun _ : Unit => + (1 : (padicLocalField p).valuationSubring)) + (fun _ => + padicMultiplicativeToStandardIntertwiner_hasLinearTerm p) + have hcomp' : + HasLinearTerm + (PowerSeries.subst + (padicMultiplicativeToStandardIntertwiner p) + (padicStandardToMultiplicativeIntertwiner p)) + (fun _ : Unit => + (1 : (padicLocalField p).valuationSubring)) := by + simpa [PowerSeries.subst_def] using hcomp + have hIcomp := + (padicStandardToMultiplicativeIntertwiner_intertwines p).powerSeries_subst + (padicStandardToMultiplicativeIntertwiner_hasSubst p) + (padicMultiplicativeToStandardIntertwiner_intertwines p) + (padicMultiplicativeToStandardIntertwiner_hasSubst p) + have hX : + HasLinearTerm + (PowerSeries.X : + PowerSeries (padicLocalField p).valuationSubring) + (fun _ : Unit => 1) := by + simpa [PowerSeries.X] using + (hasLinearTerm_X + (R := (padicLocalField p).valuationSubring) ()) + exact + eq_of_hasLinearTerm_of_intertwines + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (padicMultiplicativeLubinTateSeries p) + (padicMultiplicativeLubinTateSeries p) + (fun _ : Unit => 1) + hcomp' hIcomp hX + (intertwines_X (padicMultiplicativeLubinTateSeries p) ()) + +/-- Composing the reverse comparison after the standard-to-multiplicative +series is the identity on the standard coordinate. -/ +theorem padicMultiplicativeToStandardIntertwiner_subst_reverse + (p : ℕ) [Fact p.Prime] : + PowerSeries.subst + (padicStandardToMultiplicativeIntertwiner p) + (padicMultiplicativeToStandardIntertwiner p) = + PowerSeries.X := by + have hcomp := + (padicMultiplicativeToStandardIntertwiner_hasLinearTerm p).subst + (G := fun _ : Unit => + padicStandardToMultiplicativeIntertwiner p) + (M := fun _ : Unit => fun _ : Unit => + (1 : (padicLocalField p).valuationSubring)) + (fun _ => + padicStandardToMultiplicativeIntertwiner_hasLinearTerm p) + have hcomp' : + HasLinearTerm + (PowerSeries.subst + (padicStandardToMultiplicativeIntertwiner p) + (padicMultiplicativeToStandardIntertwiner p)) + (fun _ : Unit => + (1 : (padicLocalField p).valuationSubring)) := by + simpa [PowerSeries.subst_def] using hcomp + have hIcomp := + (padicMultiplicativeToStandardIntertwiner_intertwines p).powerSeries_subst + (padicMultiplicativeToStandardIntertwiner_hasSubst p) + (padicStandardToMultiplicativeIntertwiner_intertwines p) + (padicStandardToMultiplicativeIntertwiner_hasSubst p) + have hX : + HasLinearTerm + (PowerSeries.X : + PowerSeries (padicLocalField p).valuationSubring) + (fun _ : Unit => 1) := by + simpa [PowerSeries.X] using + (hasLinearTerm_X + (R := (padicLocalField p).valuationSubring) ()) + exact + eq_of_hasLinearTerm_of_intertwines + (padicMultiplicativeLubinTateSeries_isUniformizer p) + (standardLubinTateSeries + (padicMultiplicativeLubinTateSeries_isUniformizer p)) + (standardLubinTateSeries + (padicMultiplicativeLubinTateSeries_isUniformizer p)) + (fun _ : Unit => 1) + hcomp' hIcomp hX + (intertwines_X + (standardLubinTateSeries + (padicMultiplicativeLubinTateSeries_isUniformizer p)) ()) + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeSeries.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeSeries.lean new file mode 100644 index 0000000000..0f0a885a59 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeSeries.lean @@ -0,0 +1,114 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Series +public import Mathlib.RingTheory.PowerSeries.Binomial +/-! +# The multiplicative Lubin--Tate series over `ℚ_p` + +Mathlib's binomial series at the natural exponent `p` is + +`(1 + X) ^ p`. + +After subtracting `1`, this has zero constant coefficient, linear +coefficient `p`, and reduction `X ^ p`. Thus it is the Lubin--Tate series +attached to the multiplicative formal group and the canonical prime +uniformizer of `ℚ_p`. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp + +/-- The multiplicative Lubin--Tate series `(1 + X) ^ p - 1` over `ℚ_p`, +represented by mathlib's binomial series. -/ +noncomputable def padicMultiplicativeLubinTateSeries + (p : ℕ) [Fact p.Prime] : + LubinTateSeries (padicLocalField p) + (padicIntEquivValuationSubring p (p : ℤ_[p])) where + toPowerSeries := + PowerSeries.binomialSeries + (padicLocalField p).valuationSubring (p : ℤ) - + 1 + constantCoeff_eq_zero := by + simp + coeff_one_eq_uniformizer := by + have hcoeff : PowerSeries.coeff 1 + (PowerSeries.binomialSeries + (padicLocalField p).valuationSubring (p : ℤ) - 1) = + (p : (padicLocalField p).valuationSubring) := by + simp only [PowerSeries.binomialSeries_nat, map_sub, + PowerSeries.coeff_one] + rw [PowerSeries.coeff_one_pow] + simp + exact hcoeff.trans (map_natCast (padicIntEquivValuationSubring p) p).symm + map_residue_eq_frobenius := by + let eO : ℤ_[p] ≃+* + (padicDVRValuation p).valuationSubring := + padicIntEquivValuationSubring p + let eRes : + (padicLocalField p).residueField ≃+* ZMod p := by + change + IsLocalRing.ResidueField + (padicDVRValuation p).valuationSubring ≃+* + ZMod p + exact + (IsLocalRing.ResidueField.mapEquiv eO).symm.trans + (padicIntResidueFieldEquivZMod p) + let : CharP (padicLocalField p).residueField p := + charP_of_injective_ringHom + (f := eRes.symm.toRingHom) eRes.symm.injective p + let : CharP (PowerSeries (padicLocalField p).residueField) p := + CharP.of_ringHom_of_ne_zero + PowerSeries.C p ((Fact.out : p.Prime).ne_zero) + have hcard : + Nat.card (padicLocalField p).residueField = p := by + simpa [padicLocalField] using + padicCompleteDVF_residueField_card p + rw [hcard, PowerSeries.binomialSeries_nat (R := ℤ)] + simp only [map_sub, map_pow, map_add, map_one, PowerSeries.map_X] + rw [add_pow_char] + simp + +namespace LubinTateSeries + +/-- The underlying series is literally mathlib's binomial series minus one. -/ +@[simp] +theorem padicMultiplicativeLubinTateSeries_toPowerSeries + (p : ℕ) [Fact p.Prime] : + (padicMultiplicativeLubinTateSeries p).toPowerSeries = + PowerSeries.binomialSeries + (padicLocalField p).valuationSubring (p : ℤ) - + 1 := + rfl + +end LubinTateSeries + +/-- The prime occurring as the linear coefficient of the multiplicative +Lubin--Tate series is a uniformizer for the chosen valuation on `ℚ_p`. -/ +theorem padicMultiplicativeLubinTateSeries_isUniformizer + (p : ℕ) [Fact p.Prime] : + (padicLocalField p).toCompleteDVF.valuation.IsUniformizer + ((padicIntEquivValuationSubring p (p : ℤ_[p]) : + (padicLocalField p).valuationSubring) : ℚ_[p]) := by + change + (padicDVRValuation p).IsUniformizer + ((padicIntEquivValuationSubring p (p : ℤ_[p]) : + (padicDVRValuation p).valuationSubring) : ℚ_[p]) + simpa using padicDVRValuation_isUniformizer_p p + +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory.lean new file mode 100644 index 0000000000..5b930a74de --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.RamificationIndexComparison + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/All.lean new file mode 100644 index 0000000000..f9fb22c915 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/All.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.RamificationIndexComparison +/-! +# Ramification theory + +Public root for reusable finite and profinite ramification infrastructure. It is downstream of +`ValuationTheory` and `LocalFieldTheory` and upstream of local class field theory. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification.lean new file mode 100644 index 0000000000..81451bd063 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicInertiaBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicRamificationIndexBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicLocalizationCanonicalValuation + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/All.lean new file mode 100644 index 0000000000..4a3a45e83b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/All.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicInertiaBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicRamificationIndexBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicLocalizationCanonicalValuation +/-! +# Ramification groups of valuation subrings + +Focused aggregate for valuation-subring actions and their ramification groups. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind.lean new file mode 100644 index 0000000000..3526ab81ac --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.ChosenInertiaCoverage +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.InertiaGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.PadicValuationInertia + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/All.lean new file mode 100644 index 0000000000..75d945ca65 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/All.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.ChosenInertiaCoverage +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.InertiaGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.PadicValuationInertia +/-! +# Dedekind-domain decomposition and inertia + +Decomposition groups, inertia groups, fixed fields, and tower formulas for +primes in finite Galois extensions of Dedekind domains. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/ChosenInertiaCoverage.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/ChosenInertiaCoverage.lean new file mode 100644 index 0000000000..d6c50d66d9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/ChosenInertiaCoverage.lean @@ -0,0 +1,118 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.Padics.HeightOneSpectrum +public import Mathlib.NumberTheory.NumberField.Ideal.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.RationalPrime +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Conjugation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.NumberFieldPrimes +/-! +# Global cyclotomic inertia argument: coverage by finitely many chosen inertia groups + +For an abelian Galois extension of `ℚ`, all primes above one rational prime +have the same inertia group: primes above the same rational prime are conjugate, and conjugation is +trivial in an abelian group. Consequently, if the extension is unramified +outside a finite set `S`, one chosen prime above each member of `S` supplies +all nontrivial inertia groups. +-/ + +@[expose] public section + +noncomputable +section + +namespace HilbertRamification.Dedekind + +open NumberField +open scoped NumberField +open AlgebraicNumberTheory.Ramification + +attribute [local instance] Ideal.Quotient.field + +/-- In an abelian Galois extension, primes above the same base prime have +equal inertia groups. -/ +theorem inertiaGroup_eq_of_liesOver_of_commGroup + {A B G : Type*} [CommRing A] [CommRing B] [Algebra A B] + [CommGroup G] [Finite G] [MulSemiringAction G B] + [IsGaloisGroup G A B] + (p : Ideal A) (P Q : Ideal B) + [P.IsPrime] [P.LiesOver p] [Q.IsPrime] [Q.LiesOver p] : + inertiaGroup P G = inertiaGroup Q G := by + obtain ⟨σ, rfl⟩ := + exists_smul_eq_of_isGaloisGroup (A := A) (B := B) p P Q G + ext τ + rw [mem_inertiaGroup_smul_iff] + simp [mul_comm] + +variable {G M : Type*} +variable [CommGroup G] +variable [Field M] [NumberField M] +variable [MulSemiringAction G M] +variable [IsGaloisGroup G ℚ M] + +/-- The global cyclotomic inertia argument, chosen-prime inertia coverage. + +Let `S` be a finite set of rational primes and choose one prime of `M` above +each rational prime. If every finite prime whose contraction is outside `S` +is unramified over `ℤ`, then every finite-prime inertia group is contained in +the supremum of the inertia groups at the chosen primes in `S`. + +The choice is represented by an element of `Ideal.primesOver`, so its +primality and lies-over property are concrete data rather than assumptions. -/ +theorem inertiaGroup_le_finsetSup_chosen_of_unramified_outside + (S : Finset Nat.Primes) + (chosen : ∀ p : Nat.Primes, + Ideal.primesOver (rationalPrimeIdeal p) (𝓞 M)) + (hunramifiedOutside : + ∀ (Q : Ideal (𝓞 M)) [Q.IsPrime] [Q.IsMaximal], + (¬ ∃ p ∈ S, rationalPrimeIdeal p = Q.under ℤ) → + Algebra.IsUnramifiedAt ℤ Q) : + ∀ (Q : Ideal (𝓞 M)) [Q.IsPrime] [Q.IsMaximal], + inertiaGroup Q G ≤ + S.sup (fun p => inertiaGroup (chosen p).1 G) := by + let : Finite G := IsGaloisGroup.finite G ℚ M + intro Q _ _ + let q : Ideal ℤ := Q.under ℤ + let : Q.LiesOver q := ⟨rfl⟩ + by_cases hqS : ∃ p ∈ S, rationalPrimeIdeal p = q + · obtain ⟨p, hpS, hpq⟩ := hqS + let P : Ideal (𝓞 M) := (chosen p).1 + let : P.IsPrime := (chosen p).2.1 + let : P.LiesOver (rationalPrimeIdeal p) := (chosen p).2.2 + let : Q.LiesOver (rationalPrimeIdeal p) := ⟨hpq⟩ + have hIQ : inertiaGroup Q G = inertiaGroup P G := + (inertiaGroup_eq_of_liesOver_of_commGroup + (rationalPrimeIdeal p) P Q).symm + rw [hIQ] + exact Finset.le_sup + (f := fun r => inertiaGroup (chosen r).1 G) hpS + · have hunramified : Algebra.IsUnramifiedAt ℤ Q := + hunramifiedOutside Q hqS + let : Algebra.IsUnramifiedAt ℤ Q := hunramified + have hunramified_ringOfIntegers : + Algebra.IsUnramifiedAt (𝓞 ℚ) Q := + Algebra.IsUnramifiedAt.of_restrictScalars ℤ Q + let : Finite + ((𝓞 ℚ) ⧸ basePrime (K := ℚ) Q) := + inferInstance + let : PerfectField + ((𝓞 ℚ) ⧸ basePrime (K := ℚ) Q) := + PerfectField.ofFinite + let : Algebra.IsSeparable + ((𝓞 ℚ) ⧸ basePrime (K := ℚ) Q) ((𝓞 M) ⧸ Q) := + Algebra.IsAlgebraic.isSeparable_of_perfectField + have hbot : inertiaGroup Q G = ⊥ := + (inertiaGroup_eq_bot_iff_isUnramifiedAt + (K := ℚ) (L := M) (G := G) (P := Q)).2 + hunramified_ringOfIntegers + rw [hbot] + exact bot_le + +end HilbertRamification.Dedekind + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/InertiaGeneration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/InertiaGeneration.lean new file mode 100644 index 0000000000..bf51bd2cfc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/InertiaGeneration.lean @@ -0,0 +1,69 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.UnramifiedRationals +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFieldUnramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFields +/-! +# Global cyclotomic inertia argument: completion of the inertia-generation step + +The preceding fixed-field lemma shows that a subgroup containing all inertia +groups has an everywhere-unramified fixed field. Minkowski's discriminant +bound makes that fixed field equal to `ℚ`, and Galois correspondence then +makes the subgroup equal to the full Galois group. +-/ + +@[expose] public section + +noncomputable +section + +namespace HilbertRamification.Dedekind + +open NumberField +open scoped NumberField +open AlgebraicNumberTheory.Ramification + +variable {G M : Type*} +variable [Group G] +variable [Field M] [NumberField M] +variable [MulSemiringAction G M] +variable [IsGaloisGroup G ℚ M] + +/-- The global cyclotomic inertia argument, completed global inertia-generation step. + +Every subgroup of `Gal(M / ℚ)` which contains the inertia group at every +finite prime of `M` is the whole Galois group. -/ +theorem subgroup_eq_top_of_forall_inertiaGroup_le + (H : Subgroup G) + (hI : ∀ (Q : Ideal (𝓞 M)) [Q.IsPrime] [Q.IsMaximal], + inertiaGroup Q G ≤ H) : + H = ⊤ := by + let : Finite G := IsGaloisGroup.finite G ℚ M + have hunramified : + ∀ (P : Ideal + (𝓞 (fixedFieldOfSubgroup (K := ℚ) (L := M) G H))) + [P.IsPrime], + Algebra.IsUnramifiedAt ℤ P := + fixedFieldOfSubgroup_forall_isUnramifiedAt_of_inertiaGroup_le H hI + have hdegree : + Module.finrank ℚ + (fixedFieldOfSubgroup (K := ℚ) (L := M) G H) = 1 := + numberField_finrank_eq_one_of_forall_isUnramifiedAt + (fixedFieldOfSubgroup (K := ℚ) (L := M) G H) + hunramified + have hfixed : + fixedFieldOfSubgroup (K := ℚ) (L := M) G H = ⊥ := + IntermediateField.finrank_eq_one_iff.mp hdegree + exact + (fixedFieldOfSubgroup_eq_bot_iff_subgroup_eq_top + (K := ℚ) (L := M) (G := G) (H := H)).mp hfixed + +end HilbertRamification.Dedekind + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean new file mode 100644 index 0000000000..ea2df17fec --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean @@ -0,0 +1,635 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.Padics.HeightOneSpectrum +public import Mathlib.RingTheory.DedekindDomain.Dvr +public import Mathlib.RingTheory.Localization.AsSubring +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.RationalPrime +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationRamificationGroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.PadicLocalization +/-! +# The global valuation/prime-ideal bridge in the global cyclotomic inertia argument + +An extension `w` of the rational `p`-adic absolute value determines a +valuation subring of a number field `M`. This file synchronizes that +valuation subring with a concrete prime ideal of `𝓞 M`, proves that the +prime lies over `(p)`, and identifies the valuation subring with the +localization of `𝓞 M` at that prime. + +The final comparison sends ideal-theoretic inertia injectively to the +valuation-subring inertia group. Thus the local cardinality bound furnished +by + the localization and decomposition comparison applies to the chosen global prime without an + extra compatibility +hypothesis. +-/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + valuationSubring_eq_of_le_of_mem_maximalIdeal_iff → + valuationSubring_eq_of_le_of_mem_maximalIdeal_iff + + +noncomputable +section + +namespace HilbertRamification.Dedekind + +open NumberField +open AlgebraicNumberTheory.Valuations +open AlgebraicNumberTheory.Ramification +open scoped NumberField + +variable (p : ℕ) [Fact p.Prime] +variable (M : Type) [Field M] [NumberField M] [IsAbelianGalois ℚ M] + +/-- The localization of a Dedekind domain at a nonzero prime, realized +inside its fraction field as a valuation subring. This construction belongs +to the ideal/localization bridge; it is kept private here until that bridge +is factored into prime-decomposition theory. -/ +def dedekindAtPrimeValuationSubring + (B : Type*) [CommRing B] [IsDedekindDomain B] + {L : Type*} [Field L] [Algebra B L] [IsFractionRing B L] + (P : Ideal B) [P.IsPrime] (hP : P ≠ ⊥) : + _root_.ValuationSubring L := by + let S := Localization.subalgebra L P.primeCompl + P.primeCompl_le_nonZeroDivisors + letI : IsLocalization P.primeCompl S := by + dsimp [S] + infer_instance + letI : IsDiscreteValuationRing S := + IsLocalization.AtPrime.isDiscreteValuationRing_of_dedekind_domain + B hP S + refine _root_.ValuationSubring.ofSubring S.toSubring ?_ + intro x + obtain ⟨a, ha | ha⟩ := + (ValuationRing.isFractionRing_iff.mp + (inferInstance : IsFractionRing S L)).1 x + · left + rw [ha] + exact a.property + · right + rw [ha] + exact a.property + +/-- The valuation-subring realization of a Dedekind localization carries its +canonical algebra structure over the original domain. -/ +noncomputable instance dedekindAtPrimeValuationSubringAlgebra + (B : Type*) [CommRing B] [IsDedekindDomain B] + {L : Type*} [Field L] [Algebra B L] [IsFractionRing B L] + (P : Ideal B) [P.IsPrime] (hP : P ≠ ⊥) : + Algebra B (dedekindAtPrimeValuationSubring B (L := L) P hP) := by + change Algebra B + (Localization.subalgebra L P.primeCompl + P.primeCompl_le_nonZeroDivisors) + infer_instance + +/-- The valuation-subring realization is the localization away from the +chosen prime. -/ +instance dedekindAtPrimeValuationSubringIsLocalization + (B : Type*) [CommRing B] [IsDedekindDomain B] + {L : Type*} [Field L] [Algebra B L] [IsFractionRing B L] + (P : Ideal B) [P.IsPrime] (hP : P ≠ ⊥) : + IsLocalization P.primeCompl + (dedekindAtPrimeValuationSubring B (L := L) P hP) := by + change IsLocalization P.primeCompl + (Localization.subalgebra L P.primeCompl + P.primeCompl_le_nonZeroDivisors) + infer_instance + +/-- A Dedekind localization realized as a valuation subring is again a +Dedekind domain. -/ +instance dedekindAtPrimeValuationSubringIsDedekindDomain + (B : Type*) [CommRing B] [IsDedekindDomain B] + {L : Type*} [Field L] [Algebra B L] [IsFractionRing B L] + (P : Ideal B) [P.IsPrime] (hP : P ≠ ⊥) : + IsDedekindDomain + (dedekindAtPrimeValuationSubring B (L := L) P hP) := + IsLocalization.AtPrime.isDedekindDomain B P + (dedekindAtPrimeValuationSubring B (L := L) P hP) + +/-- The valuation-subring realization of a nonzero Dedekind localization has +Krull dimension at most one. -/ +instance dedekindAtPrimeValuationSubringKrullDimLE + (B : Type*) [CommRing B] [IsDedekindDomain B] + {L : Type*} [Field L] [Algebra B L] [IsFractionRing B L] + (P : Ideal B) [P.IsPrime] (hP : P ≠ ⊥) : + Ring.KrullDimLE 1 + (dedekindAtPrimeValuationSubring B (L := L) P hP) := + Ring.KrullDimLE.mk₁' (fun _ a _ => IsPrime.to_maximal_ideal a) + +/-- The nonarchimedean extension valuation ring attached to a global +extension of the rational `p`-adic absolute value. -/ +abbrev globalPadicExtensionValuationSubring + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) : + _root_.ValuationSubring M := + HilbertRamification.absoluteValueExtensionValuationSubring + (Rat.AbsoluteValue.padic p) w + (HilbertRamification.absoluteValueExtension_nonarchimedean_of_base + (Rat.AbsoluteValue.padic p) w + (rationalPadicAbsoluteValue_nonarchimedean p)) + +omit [IsAbelianGalois ℚ M] in +/-- Every algebraic integer belongs to the valuation ring defined by `w`. +This is the integrally-closed valuation-ring argument, rather than an +additional boundedness assumption on algebraic integers. -/ +theorem ringOfIntegers_mem_globalPadicExtensionValuationSubring + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) + (x : 𝓞 M) : + (x : M) ∈ globalPadicExtensionValuationSubring p M w := by + let A := globalPadicExtensionValuationSubring p M w + change (x : M) ∈ A + rw [← A.valuationSubring_valuation] + exact Valuation.Integers.mem_of_integral + (Valuation.valuationSubring.integers (v := A.valuation)) + (IsIntegral.tower_top + (A := A.valuation.valuationSubring) x.property) + +/-- The canonical inclusion `𝓞 M → A_w`. -/ +def globalPadicRingOfIntegersToExtensionValuationSubring + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) : + 𝓞 M →+* globalPadicExtensionValuationSubring p M w := + RingHom.codRestrict (algebraMap (𝓞 M) M) + (globalPadicExtensionValuationSubring p M w).toSubring + (ringOfIntegers_mem_globalPadicExtensionValuationSubring p M w) + +omit [IsAbelianGalois ℚ M] in +/-- The canonical map from `𝓞 M` to the extension valuation ring agrees with +the usual inclusion into `M`. -/ +@[simp] theorem globalPadicRingOfIntegersToExtensionValuationSubring_coe + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) + (x : 𝓞 M) : + ((globalPadicRingOfIntegersToExtensionValuationSubring p M w x : + globalPadicExtensionValuationSubring p M w) : M) = (x : M) := + rfl + +/-- The prime ideal of `𝓞 M` which is the center of `w`. -/ +def globalPadicPrimeIdeal + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) : + Ideal (𝓞 M) := + (IsLocalRing.maximalIdeal + (globalPadicExtensionValuationSubring p M w)).comap + (globalPadicRingOfIntegersToExtensionValuationSubring p M w) + +omit [IsAbelianGalois ℚ M] in +/-- Membership in the synchronized prime is the strict `w`-adic +inequality. -/ +theorem mem_globalPadicPrimeIdeal_iff + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) + (x : 𝓞 M) : + x ∈ globalPadicPrimeIdeal p M w ↔ w.1 (x : M) < 1 := by + let A := globalPadicExtensionValuationSubring p M w + let f := globalPadicRingOfIntegersToExtensionValuationSubring p M w + change f x ∈ IsLocalRing.maximalIdeal A ↔ w.1 (x : M) < 1 + simpa [A, f] using + (absoluteValueValuationSubring_mem_maximalIdeal_iff_abs_lt_one + w.1 + (HilbertRamification.absoluteValueExtension_nonarchimedean_of_base + (Rat.AbsoluteValue.padic p) w + (rationalPadicAbsoluteValue_nonarchimedean p)) + (f x)) + +omit [IsAbelianGalois ℚ M] in +/-- The center of a valuation ring is prime. -/ +theorem globalPadicPrimeIdeal_isPrime + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) : + (globalPadicPrimeIdeal p M w).IsPrime := by + unfold globalPadicPrimeIdeal + exact Ideal.comap_isPrime _ _ + +omit [IsAbelianGalois ℚ M] in +/-- On rational integers, membership in the center is divisibility by `p`. -/ +theorem int_mem_globalPadicPrimeIdeal_under_iff + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) + (z : ℤ) : + algebraMap ℤ (𝓞 M) z ∈ globalPadicPrimeIdeal p M w ↔ + (p : ℤ) ∣ z := by + rw [mem_globalPadicPrimeIdeal_iff] + have hz : + ((algebraMap ℤ (𝓞 M) z : 𝓞 M) : M) = + algebraMap ℚ M (z : ℚ) := by + simp + rw [hz, w.2] + change (((padicNorm p (z : ℚ) : ℚ) : ℝ) < 1) ↔ (p : ℤ) ∣ z + exact_mod_cast padicNorm.int_lt_one_iff (p := p) z + +omit [IsAbelianGalois ℚ M] in +/-- The contraction of the synchronized prime to `ℤ` is the usual +principal ideal `(p)`. -/ +theorem globalPadicPrimeIdeal_under_eq_span + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) : + (globalPadicPrimeIdeal p M w).under ℤ = + Ideal.span ({(p : ℤ)} : Set ℤ) := by + ext z + change algebraMap ℤ (𝓞 M) z ∈ globalPadicPrimeIdeal p M w ↔ _ + rw [int_mem_globalPadicPrimeIdeal_under_iff, Ideal.mem_span_singleton] + +omit [IsAbelianGalois ℚ M] in +/-- The synchronized prime lies over the rational height-one prime `p`. -/ +theorem globalPadicPrimeIdeal_liesOver + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) : + (globalPadicPrimeIdeal p M w).LiesOver + (rationalPrimeIdeal (⟨p, Fact.out⟩ : Nat.Primes)) := by + constructor + exact + (rationalPrimeIdeal_eq_span (⟨p, Fact.out⟩ : Nat.Primes)).trans + (globalPadicPrimeIdeal_under_eq_span p M w).symm + +omit [IsAbelianGalois ℚ M] in +/-- The synchronized prime is nonzero. -/ +theorem globalPadicPrimeIdeal_ne_bot + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) : + globalPadicPrimeIdeal p M w ≠ ⊥ := by + let : (globalPadicPrimeIdeal p M w).LiesOver + (rationalPrimeIdeal (⟨p, Fact.out⟩ : Nat.Primes)) := + globalPadicPrimeIdeal_liesOver p M w + apply Ideal.ne_bot_of_liesOver_of_ne_bot + (p := rationalPrimeIdeal (⟨p, Fact.out⟩ : Nat.Primes)) + exact (Rat.HeightOneSpectrum.primesEquiv.symm + (⟨p, Fact.out⟩ : Nat.Primes)).ne_bot + +omit [IsAbelianGalois ℚ M] in +/-- In the Dedekind ring `𝓞 M`, the synchronized nonzero prime is maximal. -/ +theorem globalPadicPrimeIdeal_isMaximal + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) : + (globalPadicPrimeIdeal p M w).IsMaximal := + (globalPadicPrimeIdeal_isPrime p M w).isMaximal + (globalPadicPrimeIdeal_ne_bot p M w) + +/-- The center of a global `p`-adic place is a prime ideal. -/ +instance instIsPrimeGlobalPadicPrimeIdeal + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) : + (globalPadicPrimeIdeal p M w).IsPrime := + globalPadicPrimeIdeal_isPrime p M w + +/-- The center of a global `p`-adic place is a maximal ideal. -/ +instance instIsMaximalGlobalPadicPrimeIdeal + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) : + (globalPadicPrimeIdeal p M w).IsMaximal := + globalPadicPrimeIdeal_isMaximal p M w + +/-- The center of a global `p`-adic place lies over the rational prime +ideal generated by `p`. -/ +instance instLiesOverGlobalPadicPrimeIdeal + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) : + (globalPadicPrimeIdeal p M w).LiesOver + (rationalPrimeIdeal ⟨p, Fact.out⟩) := + globalPadicPrimeIdeal_liesOver p M w + +/-- The height-one prime of `𝓞 M` centered at `w`. -/ +def globalPadicPrimeHeightOneSpectrum + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) : + IsDedekindDomain.HeightOneSpectrum (𝓞 M) := + ⟨globalPadicPrimeIdeal p M w, + globalPadicPrimeIdeal_isPrime p M w, + globalPadicPrimeIdeal_ne_bot p M w⟩ + +/-- The ordinary localization of `𝓞 M` at the prime centered at `w`, viewed +as a valuation subring of `M`. -/ +abbrev globalPadicPrimeLocalizationValuationSubring + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) : + _root_.ValuationSubring M := + dedekindAtPrimeValuationSubring (𝓞 M) (L := M) + (globalPadicPrimeIdeal p M w) + (globalPadicPrimeIdeal_ne_bot p M w) + +omit [IsAbelianGalois ℚ M] in +/-- The valuation ring defined by the absolute value `w` is exactly the +ordinary localization of `𝓞 M` at its center. -/ +theorem globalPadicPrime_localizationValuationSubring_eq + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) : + globalPadicPrimeLocalizationValuationSubring p M w = + globalPadicExtensionValuationSubring p M w := by + let P := globalPadicPrimeIdeal p M w + let V := dedekindAtPrimeValuationSubring (𝓞 M) (L := M) P + (globalPadicPrimeIdeal_ne_bot p M w) + let A := globalPadicExtensionValuationSubring p M w + change V = A + have hVA : V ≤ A := by + rintro x ⟨a, s, hs, rfl⟩ + have hs0 : s ≠ 0 := by + intro hsZero + apply hs + simp [hsZero] + have hsM0 : (s : M) ≠ 0 := by + simpa only [map_zero] using + (IsFractionRing.injective (𝓞 M) M).ne hs0 + have hmk : + IsLocalization.mk' M a + ⟨s, P.primeCompl_le_nonZeroDivisors hs⟩ = + (a : M) / (s : M) := by + apply (mul_right_cancel₀ hsM0) + rw [IsLocalization.mk'_spec] + exact (div_mul_cancel₀ _ hsM0).symm + have haA : (a : M) ∈ A := + ringOfIntegers_mem_globalPadicExtensionValuationSubring p M w a + have hsA : (s : M) ∈ A := + ringOfIntegers_mem_globalPadicExtensionValuationSubring p M w s + have haLe : w.1 (a : M) ≤ 1 := + (mem_absoluteValueValuationSubring_iff + w.1 + (HilbertRamification.absoluteValueExtension_nonarchimedean_of_base + (Rat.AbsoluteValue.padic p) w + (rationalPadicAbsoluteValue_nonarchimedean p)) + (a : M)).mp haA + have hsLe : w.1 (s : M) ≤ 1 := + (mem_absoluteValueValuationSubring_iff + w.1 + (HilbertRamification.absoluteValueExtension_nonarchimedean_of_base + (Rat.AbsoluteValue.padic p) w + (rationalPadicAbsoluteValue_nonarchimedean p)) + (s : M)).mp hsA + have hsNotLt : ¬w.1 (s : M) < 1 := by + intro hlt + apply hs + exact (mem_globalPadicPrimeIdeal_iff p M w s).mpr hlt + have hsEq : w.1 (s : M) = 1 := + le_antisymm hsLe (not_lt.mp hsNotLt) + rw [mem_absoluteValueValuationSubring_iff] + rw [hmk, map_div₀, hsEq, div_one] + exact haLe + apply + (valuationSubring_eq_of_le_of_mem_maximalIdeal_iff + V A hVA ?_).symm + intro x + rcases x.property with ⟨a, s, hs, hx⟩ + have hs0 : s ≠ 0 := by + intro hsZero + apply hs + simp [hsZero] + have hsM0 : (s : M) ≠ 0 := by + simpa only [map_zero] using + (IsFractionRing.injective (𝓞 M) M).ne hs0 + have hmk : + IsLocalization.mk' M a + ⟨s, P.primeCompl_le_nonZeroDivisors hs⟩ = + (a : M) / (s : M) := by + apply (mul_right_cancel₀ hsM0) + rw [IsLocalization.mk'_spec] + exact (div_mul_cancel₀ _ hsM0).symm + have hsA : (s : M) ∈ A := + ringOfIntegers_mem_globalPadicExtensionValuationSubring p M w s + have hsLe : w.1 (s : M) ≤ 1 := + (mem_absoluteValueValuationSubring_iff + w.1 + (HilbertRamification.absoluteValueExtension_nonarchimedean_of_base + (Rat.AbsoluteValue.padic p) w + (rationalPadicAbsoluteValue_nonarchimedean p)) + (s : M)).mp hsA + have hsNotLt : ¬w.1 (s : M) < 1 := by + intro hlt + apply hs + exact (mem_globalPadicPrimeIdeal_iff p M w s).mpr hlt + have hsEq : w.1 (s : M) = 1 := + le_antisymm hsLe (not_lt.mp hsNotLt) + have hxmk : x = IsLocalization.mk' V a ⟨s, hs⟩ := by + rw [IsLocalization.eq_mk'_iff_mul_eq] + apply V.subtype_injective + change (x : M) * (s : M) = (a : M) + rw [hx] + simp [hsM0] + have hright : + x ∈ IsLocalRing.maximalIdeal V ↔ a ∈ P := by + rw [hxmk] + exact IsLocalization.AtPrime.mk'_mem_maximal_iff V P a ⟨s, hs⟩ + rw [hright] + have hleft : + V.inclusion A hVA x ∈ IsLocalRing.maximalIdeal A ↔ + w.1 (x : M) < 1 := by + have hcoe : + ((V.inclusion A hVA x : A) : M) = (x : M) := rfl + simpa [A, hcoe] using + (absoluteValueValuationSubring_mem_maximalIdeal_iff_abs_lt_one + w.1 + (HilbertRamification.absoluteValueExtension_nonarchimedean_of_base + (Rat.AbsoluteValue.padic p) w + (rationalPadicAbsoluteValue_nonarchimedean p)) + (V.inclusion A hVA x)) + rw [hleft, hx, hmk, map_div₀, hsEq, div_one] + exact (mem_globalPadicPrimeIdeal_iff p M w a).symm + +/-! ## Comparison of ideal inertia with valuation inertia -/ + +omit [IsAbelianGalois ℚ M] in +private theorem globalPadicPrimeCompl_smul_of_mem_inertia + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) + (sigma : HilbertRamification.Dedekind.inertiaGroup + (globalPadicPrimeIdeal p M w) (M ≃ₐ[ℚ] M)) + {s : 𝓞 M} + (hs : s ∈ (globalPadicPrimeIdeal p M w).primeCompl) : + (sigma : M ≃ₐ[ℚ] M) • s ∈ + (globalPadicPrimeIdeal p M w).primeCompl := by + intro hsigma + apply hs + have hdiff : + (sigma : M ≃ₐ[ℚ] M) • s - s ∈ + globalPadicPrimeIdeal p M w := sigma.property s + have hmem := + (globalPadicPrimeIdeal p M w).sub_mem hsigma hdiff + simpa using hmem + +omit [IsAbelianGalois ℚ M] in +/-- An ideal-inertia automorphism preserves the localization of `𝓞 M` at +the synchronized prime. -/ +private theorem globalPadicIdealInertia_maps_localization + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) + (sigma : HilbertRamification.Dedekind.inertiaGroup + (globalPadicPrimeIdeal p M w) (M ≃ₐ[ℚ] M)) + {x : M} + (hx : x ∈ + globalPadicPrimeLocalizationValuationSubring p M w) : + (sigma : M ≃ₐ[ℚ] M) x ∈ + globalPadicPrimeLocalizationValuationSubring p M w := by + rcases hx with ⟨a, s, hs, rfl⟩ + have hs0 : s ≠ 0 := by + intro hsZero + apply hs + simp [hsZero] + have hsM0 : (s : M) ≠ 0 := by + simpa only [map_zero] using + (IsFractionRing.injective (𝓞 M) M).ne hs0 + have hsigmaM0 : + (sigma : M ≃ₐ[ℚ] M) (s : M) ≠ 0 := by + simpa only [map_zero] using + (sigma : M ≃ₐ[ℚ] M).injective.ne hsM0 + refine ⟨(sigma : M ≃ₐ[ℚ] M) • a, + (sigma : M ≃ₐ[ℚ] M) • s, + globalPadicPrimeCompl_smul_of_mem_inertia p M w sigma hs, ?_⟩ + rw [IsLocalization.eq_mk'_iff_mul_eq] + rw [IsFractionRing.mk'_eq_div, map_div₀] + exact div_mul_cancel₀ _ hsigmaM0 + +omit [IsAbelianGalois ℚ M] in +/-- Ideal inertia at the synchronized prime maps to the decomposition group +of its localization. -/ +def globalPadicIdealInertiaToLocalizationDecomposition + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) : + HilbertRamification.Dedekind.inertiaGroup + (globalPadicPrimeIdeal p M w) (M ≃ₐ[ℚ] M) → + RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup ℚ + (globalPadicPrimeLocalizationValuationSubring p M w) := by + intro sigma + let V := globalPadicPrimeLocalizationValuationSubring p M w + exact ⟨(sigma : M ≃ₐ[ℚ] M), by + ext x + rw [_root_.ValuationSubring.mem_pointwise_smul_iff_inv_smul_mem] + constructor + · intro hx + have h := globalPadicIdealInertia_maps_localization p M w sigma hx + simpa [AlgEquiv.smul_def] using h + · intro hx + simpa [AlgEquiv.smul_def] using + (globalPadicIdealInertia_maps_localization p M w sigma⁻¹ hx)⟩ + +omit [IsAbelianGalois ℚ M] in +private theorem + globalPadicIdealInertiaToLocalizationDecomposition_mem_maximalIdealInertia + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) + (sigma : HilbertRamification.Dedekind.inertiaGroup + (globalPadicPrimeIdeal p M w) (M ≃ₐ[ℚ] M)) : + globalPadicIdealInertiaToLocalizationDecomposition p M w sigma ∈ + (IsLocalRing.maximalIdeal + (globalPadicPrimeLocalizationValuationSubring p M w)).toAddSubgroup.inertia + (RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup ℚ + (globalPadicPrimeLocalizationValuationSubring p M w)) := by + let P := globalPadicPrimeIdeal p M w + let V := globalPadicPrimeLocalizationValuationSubring p M w + let delta : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup ℚ V := + globalPadicIdealInertiaToLocalizationDecomposition p M w sigma + intro x + rcases x.property with ⟨a, s, hs, hx⟩ + have hs0 : s ≠ 0 := by + intro hsZero + apply hs + simp [hsZero] + have hdeltaA : (sigma : M ≃ₐ[ℚ] M) • a - a ∈ P := + sigma.property a + have hdeltaS : (sigma : M ≃ₐ[ℚ] M) • s - s ∈ P := + sigma.property s + have hsigma : (sigma : M ≃ₐ[ℚ] M) • s ∈ P.primeCompl := + globalPadicPrimeCompl_smul_of_mem_inertia p M w sigma hs + have hsM0 : (s : M) ≠ 0 := by + simpa only [map_zero] using (IsFractionRing.injective (𝓞 M) M).ne hs0 + have hsigmaM0 : + (sigma : M ≃ₐ[ℚ] M) (s : M) ≠ 0 := by + simpa only [map_zero] using + (sigma : M ≃ₐ[ℚ] M).injective.ne hsM0 + have hxmk : x = IsLocalization.mk' V a ⟨s, hs⟩ := by + rw [IsLocalization.eq_mk'_iff_mul_eq] + apply V.subtype_injective + change (x : M) * (s : M) = (a : M) + rw [hx] + simp [hsM0] + have hdeltaxmk : delta • x = + IsLocalization.mk' V ((sigma : M ≃ₐ[ℚ] M) • a) + ⟨(sigma : M ≃ₐ[ℚ] M) • s, hsigma⟩ := by + rw [IsLocalization.eq_mk'_iff_mul_eq] + apply V.subtype_injective + change + (sigma : M ≃ₐ[ℚ] M) (x : M) * + (((sigma : M ≃ₐ[ℚ] M) • s : 𝓞 M) : M) = + (((sigma : M ≃ₐ[ℚ] M) • a : 𝓞 M) : M) + rw [hx, IsFractionRing.mk'_eq_div, map_div₀] + exact div_mul_cancel₀ _ hsigmaM0 + have hnum : + (sigma : M ≃ₐ[ℚ] M) • a * s - + a * ((sigma : M ≃ₐ[ℚ] M) • s) ∈ P := by + have h := P.sub_mem + (P.mul_mem_right s hdeltaA) + (P.mul_mem_left a hdeltaS) + convert h using 1; ring + let den : P.primeCompl := + ⟨((sigma : M ≃ₐ[ℚ] M) • s) * s, + P.primeCompl.mul_mem hsigma hs⟩ + have hfrac : IsLocalization.mk' V + ((sigma : M ≃ₐ[ℚ] M) • a * s - + a * ((sigma : M ≃ₐ[ℚ] M) • s)) den ∈ + IsLocalRing.maximalIdeal V := + (IsLocalization.AtPrime.mk'_mem_maximal_iff V P _ den).mpr hnum + rw [hdeltaxmk, hxmk, ← IsLocalization.mk'_sub] + exact hfrac + +omit [IsAbelianGalois ℚ M] in +private theorem + globalPadicIdealInertiaToLocalizationDecomposition_mem_inertia + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) + (sigma : HilbertRamification.Dedekind.inertiaGroup + (globalPadicPrimeIdeal p M w) (M ≃ₐ[ℚ] M)) : + globalPadicIdealInertiaToLocalizationDecomposition p M w sigma ∈ + RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup ℚ + (globalPadicPrimeLocalizationValuationSubring p M w) := by + let V := globalPadicPrimeLocalizationValuationSubring p M w + let delta : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup ℚ V := + globalPadicIdealInertiaToLocalizationDecomposition p M w sigma + rw [HilbertRamification.ValuationSubring.mem_inertiaGroup_iff_sub_mem_nonunits] + intro x + change (((delta • x - x : V) : M) ∈ V.nonunits) + exact V.coe_mem_nonunits_iff.mpr + (globalPadicIdealInertiaToLocalizationDecomposition_mem_maximalIdealInertia + p M w sigma x) + +omit [IsAbelianGalois ℚ M] in +/-- The canonical localization map from global ideal inertia to valuation +inertia. -/ +def globalPadicIdealInertiaToLocalizationInertia + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) : + HilbertRamification.Dedekind.inertiaGroup + (globalPadicPrimeIdeal p M w) (M ≃ₐ[ℚ] M) →* + RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup ℚ + (globalPadicPrimeLocalizationValuationSubring p M w) where + toFun sigma := + ⟨globalPadicIdealInertiaToLocalizationDecomposition p M w sigma, + by exact globalPadicIdealInertiaToLocalizationDecomposition_mem_inertia p M w sigma⟩ + map_one' := by + apply Subtype.ext + apply Subtype.ext + rfl + map_mul' _ _ := by + apply Subtype.ext + apply Subtype.ext + rfl + +omit [IsAbelianGalois ℚ M] in +/-- The localization map is injective because it does not change the +underlying `ℚ`-automorphism of `M`. -/ +theorem globalPadicIdealInertiaToLocalizationInertia_injective + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) : + Function.Injective + (globalPadicIdealInertiaToLocalizationInertia p M w) := by + intro sigma tau h + have h1 := congrArg Subtype.val h + have h2 := congrArg Subtype.val h1 + apply Subtype.ext + exact h2 + +omit [IsAbelianGalois ℚ M] in +/-- The exact cardinal comparison needed in the global cyclotomic inertia argument: the ideal +inertia group +at the synchronized prime is no larger than the localization and decomposition comparison + valuation inertia +group attached to `w`. -/ +theorem globalPadicPrimeIdeal_inertia_natCard_le_valuationInertia + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) M) : + Nat.card + (HilbertRamification.Dedekind.inertiaGroup + (globalPadicPrimeIdeal p M w) (M ≃ₐ[ℚ] M)) ≤ + Nat.card + (RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup ℚ + (globalPadicExtensionValuationSubring p M w)) := by + have h := Nat.card_le_card_of_injective + (globalPadicIdealInertiaToLocalizationInertia p M w) + (globalPadicIdealInertiaToLocalizationInertia_injective p M w) + rw [globalPadicPrime_localizationValuationSubring_eq p M w] at h + exact h + +end HilbertRamification.Dedekind + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicInertiaBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicInertiaBound.lean new file mode 100644 index 0000000000..62702fba4b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicInertiaBound.lean @@ -0,0 +1,193 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRamificationCard +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicRamificationIndexBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.RamificationIndexComparison +/-! +# Canonical p-adic inertia bounds + +This file identifies the inertia cardinality of the canonical valuation on a +finite Galois extension of `ℚ_p` with the intrinsic value-group ramification +index, then applies the prime-power cyclotomic ramification bound. +-/ + +@[expose] public section + +open _root_.RamificationTheory.HilbertRamification.CompleteDVF renaming + natCard_decompositionInertiaSubgroup_eq_ramificationIndex → + natCard_decompositionInertiaSubgroup_eq_ramificationIndex + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + exists_integralClosure_standard_fundamental_identity → + exists_integralClosure_standard_fundamental_identity + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + moduleFinite_target_valuationSubring_of_finite_separable → + moduleFinite_target_valuationSubring_of_finite_separable + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + residueField_finiteDimensional_of_moduleFinite → + residueField_finiteDimensional_of_moduleFinite + + +noncomputable +section + +namespace HilbertRamification + +open AlgebraicNumberTheory.Valuations + +attribute [local instance] Ideal.Quotient.field + +/-- For a finite Galois extension of `ℚ_p`, the inertia group of the +canonical norm-formula valuation has cardinality equal to the intrinsic ramification index. -/ +theorem natCard_padicCanonicalInertia_eq_exponentialRamificationIndex + (p : ℕ) [Fact p.Prime] + (E : Type) [Field E] [Algebra ℚ_[p] E] + [FiniteDimensional ℚ_[p] E] [IsGalois ℚ_[p] E] : + Nat.card + (RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup ℚ_[p] + (absoluteValueValuationSubring + (padicFiniteExtensionAbsoluteValue p E) + (padicFiniteExtensionAbsoluteValue_nonarchimedean p E))) = + exponentialRamificationIndex + (padicFieldExponentialValuation p) + (padicFiniteExtensionExponentialValuation p E) := by + let base := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p + obtain ⟨target, hExt, hTarget, _hFundamental⟩ := + exists_integralClosure_standard_fundamental_identity + (K := ℚ_[p]) (L := E) base + let : base.valuation.HasExtension target.valuation := hExt + let : IsIntegralClosure target.valuationSubring base.valuationSubring E := hTarget + let : IsScalarTower base.valuationSubring target.valuationSubring E := by + apply IsScalarTower.of_algebraMap_eq + intro x + rfl + let : Module.Finite base.valuationSubring target.valuationSubring := + moduleFinite_target_valuationSubring_of_finite_separable + base target + let : FiniteDimensional + (base.valuationSubring ⧸ base.maximalIdeal) + (target.valuationSubring ⧸ target.maximalIdeal) := + residueField_finiteDimensional_of_moduleFinite + base target + let : Algebra.IsAlgebraic + (base.valuationSubring ⧸ base.maximalIdeal) + (target.valuationSubring ⧸ target.maximalIdeal) := + Algebra.IsAlgebraic.of_finite + (base.valuationSubring ⧸ base.maximalIdeal) + (target.valuationSubring ⧸ target.maximalIdeal) + let : Finite (base.valuationSubring ⧸ base.maximalIdeal) := by + change Finite base.residueField + simpa only [base] using + LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF_residueField_finite p + let : PerfectField (base.valuationSubring ⧸ base.maximalIdeal) := + PerfectField.ofFinite + let : Algebra.IsSeparable + (base.valuationSubring ⧸ base.maximalIdeal) + (target.valuationSubring ⧸ target.maximalIdeal) := by + exact Algebra.IsAlgebraic.isSeparable_of_perfectField + have hCard := + natCard_decompositionInertiaSubgroup_eq_ramificationIndex + (K := ℚ_[p]) (L := E) base target + have hAssociated : + LubinTate.Valuations.exponentialValuationSubringAsValuationSubring + (padicFiniteExtensionExponentialValuation p E) = + absoluteValueValuationSubring + (padicFiniteExtensionAbsoluteValue p E) + (padicFiniteExtensionAbsoluteValue_nonarchimedean p E) := + associatedAbsoluteValue_valuationSubring_eq + (padicFiniteExtensionExponentialValuation p E) + (Real.exp 1) + (padicFiniteExtensionAbsoluteValue p E) + (padicFiniteExtensionAbsoluteValue_nonarchimedean p E) + (absoluteValueExponentialValuation_associated + (padicFiniteExtensionAbsoluteValue p E) + (padicFiniteExtensionAbsoluteValue_nonarchimedean p E)) + have hCanonical := + padicFiniteExtensionExponentialValuationSubring_eq_completeDVF + p E target + have hInertiaCardinality := + RamificationTheory.exponentialRamificationIndex_eq_ramificationIndex_of_valuationSubrings_eq + (base := base) (target := target) + (padicFieldExponentialValuation p) + (padicFiniteExtensionExponentialValuation p E) + (padicFiniteExtensionExponentialValuation_extends p E) + (padicFieldExponentialValuationSubring_eq_completeDVF p) + hCanonical + have hAbsolute : + absoluteValueValuationSubring + (padicFiniteExtensionAbsoluteValue p E) + (padicFiniteExtensionAbsoluteValue_nonarchimedean p E) = + target.valuation.valuationSubring := + hAssociated.symm.trans hCanonical + calc + Nat.card + (RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup ℚ_[p] + (absoluteValueValuationSubring + (padicFiniteExtensionAbsoluteValue p E) + (padicFiniteExtensionAbsoluteValue_nonarchimedean p E))) = + Nat.card (target.valuation.valuationSubring.inertiaSubgroup ℚ_[p]) := by + rw [hAbsolute] + _ = ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF := hCard + _ = exponentialRamificationIndex + (padicFieldExponentialValuation p) + (padicFiniteExtensionExponentialValuation p E) := hInertiaCardinality.symm + +/-- A cyclotomic embedding into order `r * p ^ n`, with `r` prime to `p`, +bounds the canonical inertia cardinality by `φ(p ^ n)`. -/ +theorem natCard_padicCanonicalInertia_le_totient_primePow_of_coprimeEmbedding + (p r n : ℕ) [Fact p.Prime] (hpr : p.Coprime r) + (E : Type) [Field E] [Algebra ℚ_[p] E] + [FiniteDimensional ℚ_[p] E] [IsGalois ℚ_[p] E] + (i : E →ₐ[ℚ_[p]] CyclotomicField (r * p ^ n) ℚ_[p]) : + Nat.card + (RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup ℚ_[p] + (absoluteValueValuationSubring + (padicFiniteExtensionAbsoluteValue p E) + (padicFiniteExtensionAbsoluteValue_nonarchimedean p E))) ≤ + Nat.totient (p ^ n) := by + have hr : 0 < r := by + exact Nat.pos_of_ne_zero (fun hr0 => + (Fact.out : Nat.Prime p).ne_one + ((Nat.coprime_zero_right p).mp (hr0 ▸ hpr))) + have hpPow : 0 < p ^ n := pow_pos (Fact.out : Nat.Prime p).pos n + let : NeZero (r * p ^ n) := ⟨(mul_pos hr hpPow).ne'⟩ + let hDcyclo : IsCyclotomicExtension {r * p ^ n} ℚ_[p] + (CyclotomicField (r * p ^ n) ℚ_[p]) := + CyclotomicField.isCyclotomicExtension (r * p ^ n) ℚ_[p] + let : FiniteDimensional ℚ_[p] + (CyclotomicField (r * p ^ n) ℚ_[p]) := + IsCyclotomicExtension.finiteDimensional {r * p ^ n} ℚ_[p] + (CyclotomicField (r * p ^ n) ℚ_[p]) + calc + Nat.card + (RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup ℚ_[p] + (absoluteValueValuationSubring + (padicFiniteExtensionAbsoluteValue p E) + (padicFiniteExtensionAbsoluteValue_nonarchimedean p E))) = + exponentialRamificationIndex + (padicFieldExponentialValuation p) + (padicFiniteExtensionExponentialValuation p E) := + natCard_padicCanonicalInertia_eq_exponentialRamificationIndex p E + _ ≤ exponentialRamificationIndex + (padicFieldExponentialValuation p) + (padicFiniteExtensionExponentialValuation p + (CyclotomicField (r * p ^ n) ℚ_[p])) := + padicFiniteExtension_exponentialRamificationIndex_le_of_algHom p i + _ ≤ Nat.totient (p ^ n) := by + simpa using + coprimeLocalCyclotomic_exponentialRamificationIndex_le_totient_primePow + p r n hpr + +end HilbertRamification + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicRamificationIndexBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicRamificationIndexBound.lean new file mode 100644 index 0000000000..07f90b31f2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicRamificationIndexBound.lean @@ -0,0 +1,180 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Compositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CyclotomicDegreeBound +/-! +# A p-primary ramification bound for p-adic cyclotomic fields + +A cyclotomic field of order `r * p ^ n`, with `r` prime to `p`, splits into +an unramified prime-to-`p` branch and a `p`-power branch. This file records +that only the latter contributes to the local ramification index. +-/ + +@[expose] public section + +noncomputable +section + +namespace HilbertRamification + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open Polynomial + +/-- If `r` is prime to `p`, the local ramification index of the cyclotomic +field of order `r * p ^ n` is controlled only by its `p`-power factor. -/ +theorem coprimeLocalCyclotomic_exponentialRamificationIndex_le_totient_primePow + (p r n : ℕ) [Fact p.Prime] (hpr : p.Coprime r) : + let a := r + let b := p ^ n + let m := a * b + letI : NeZero m := ⟨(mul_pos + (Nat.pos_of_ne_zero (fun hr => + (Fact.out : Nat.Prime p).ne_one + ((Nat.coprime_zero_right p).mp (hr ▸ hpr)))) + (pow_pos (Fact.out : Nat.Prime p).pos n)).ne'⟩ + let D := CyclotomicField m ℚ_[p] + letI : IsCyclotomicExtension {m} ℚ_[p] D := + CyclotomicField.isCyclotomicExtension m ℚ_[p] + letI : FiniteDimensional ℚ_[p] D := + IsCyclotomicExtension.finiteDimensional {m} ℚ_[p] D + exponentialRamificationIndex + (padicFieldExponentialValuation p) + (padicFiniteExtensionExponentialValuation p D) ≤ + Nat.totient (p ^ n) := by + dsimp only + let a := r + let b := p ^ n + let m := a * b + have ha : 0 < a := by + exact Nat.pos_of_ne_zero (fun hr => + (Fact.out : Nat.Prime p).ne_one + ((Nat.coprime_zero_right p).mp (hr ▸ hpr))) + have hb : 0 < b := by + exact pow_pos (Fact.out : Nat.Prime p).pos n + have hm : 0 < m := mul_pos ha hb + have hab : a.Coprime b := by + dsimp [a, b] + exact (hpr.pow_left n).symm + let : NeZero a := ⟨ha.ne'⟩ + let : NeZero b := ⟨hb.ne'⟩ + let : NeZero m := ⟨hm.ne'⟩ + let D := CyclotomicField m ℚ_[p] + let hDcyclo : IsCyclotomicExtension {m} ℚ_[p] D := + CyclotomicField.isCyclotomicExtension m ℚ_[p] + let : FiniteDimensional ℚ_[p] D := + IsCyclotomicExtension.finiteDimensional {m} ℚ_[p] D + obtain ⟨ζ, hζ⟩ := hDcyclo.exists_isPrimitiveRoot (Set.mem_singleton m) hm.ne' + have hζa : IsPrimitiveRoot (ζ ^ b) a := + hζ.pow (NeZero.pos _) (a := b) (b := a) (by simp [m, mul_comm]) + have hζb : IsPrimitiveRoot (ζ ^ a) b := + hζ.pow (NeZero.pos _) (a := a) (b := b) (by simp [m]) + let U : IntermediateField ℚ_[p] D := + IntermediateField.adjoin ℚ_[p] {ζ ^ b} + let C : IntermediateField ℚ_[p] D := + IntermediateField.adjoin ℚ_[p] {ζ ^ a} + let hUcyclo : IsCyclotomicExtension {a} ℚ_[p] U := by + simpa [U] using hζa.intermediateField_adjoin_isCyclotomicExtension ℚ_[p] + let hCcyclo : IsCyclotomicExtension {b} ℚ_[p] C := by + simpa [C] using hζb.intermediateField_adjoin_isCyclotomicExtension ℚ_[p] + let : FiniteDimensional ℚ_[p] U := + IsCyclotomicExtension.finiteDimensional {a} ℚ_[p] U + let : FiniteDimensional ℚ_[p] C := + IsCyclotomicExtension.finiteDimensional {b} ℚ_[p] C + let algUD : Algebra U D := U.val.toRingHom.toAlgebra + let : Algebra U D := algUD + let : SMul U D := algUD.toSMul + let : Module U D := algUD.toModule + let : IsScalarTower ℚ_[p] U D := IsScalarTower.of_algebraMap_eq' rfl + let : FiniteDimensional U D := FiniteDimensional.right ℚ_[p] U D + let hTopCyclo : IsCyclotomicExtension {m} ℚ_[p] + (⊤ : IntermediateField ℚ_[p] D) := + IsCyclotomicExtension.equiv {m} ℚ_[p] D IntermediateField.topEquiv.symm + let hSupCyclo : IsCyclotomicExtension {m} ℚ_[p] + (U ⊔ C : IntermediateField ℚ_[p] D) := by + have h := IntermediateField.isCyclotomicExtension_lcm_sup + ℚ_[p] D a b U C + simpa [m, hab.lcm_eq_mul] using h + have hTop : U ⊔ C = (⊤ : IntermediateField ℚ_[p] D) := + IntermediateField.isCyclotomicExtension_eq {m} ℚ_[p] D _ _ + let algUSup : Algebra U (U ⊔ C : IntermediateField ℚ_[p] D) := + (IntermediateField.inclusion (show U ≤ U ⊔ C from le_sup_left)).toRingHom.toAlgebra + let : Algebra U (U ⊔ C : IntermediateField ℚ_[p] D) := algUSup + let : SMul U (U ⊔ C : IntermediateField ℚ_[p] D) := algUSup.toSMul + let : Module U (U ⊔ C : IntermediateField ℚ_[p] D) := algUSup.toModule + let : IsScalarTower ℚ_[p] U + (U ⊔ C : IntermediateField ℚ_[p] D) := + IsScalarTower.of_algebraMap_eq' rfl + let : FiniteDimensional ℚ_[p] + (U ⊔ C : IntermediateField ℚ_[p] D) := + IntermediateField.finiteDimensional_sup U C + let : FiniteDimensional U + (U ⊔ C : IntermediateField ℚ_[p] D) := + FiniteDimensional.right ℚ_[p] U (U ⊔ C : IntermediateField ℚ_[p] D) + have hDegreeUD : Module.finrank U D ≤ Module.finrank ℚ_[p] C := by + let eTop : (U ⊔ C : IntermediateField ℚ_[p] D) ≃+* D := + ((IntermediateField.equivOfEq hTop).trans + IntermediateField.topEquiv).toRingEquiv + have htransport : + Module.finrank U (U ⊔ C : IntermediateField ℚ_[p] D) = + Module.finrank U D := by + apply Algebra.finrank_eq_of_equiv_equiv (RingEquiv.refl U) eTop + ext x + rfl + calc + Module.finrank U D = + Module.finrank U (U ⊔ C : IntermediateField ℚ_[p] D) := + htransport.symm + _ ≤ Module.finrank ℚ_[p] C := + DiscreteValuationField.FieldCompositum.sup_finrank_over_left_le_right U C + let eC : C ≃ₐ[ℚ_[p]] CyclotomicField b ℚ_[p] := + IsCyclotomicExtension.algEquiv {b} ℚ_[p] C (CyclotomicField b ℚ_[p]) + have hDegreeC : Module.finrank ℚ_[p] C ≤ Nat.totient b := by + calc + Module.finrank ℚ_[p] C = + Module.finrank ℚ_[p] (CyclotomicField b ℚ_[p]) := + eC.toLinearEquiv.finrank_eq + _ ≤ Nat.totient b := cyclotomicField_finrank_le_totient ℚ_[p] b hb + let v := padicFieldExponentialValuation p + let u := padicFiniteExtensionExponentialValuation p U + let w := padicFiniteExtensionExponentialValuation p D + have hQU : ∀ x : ℚ_[p], u (algebraMap ℚ_[p] U x) = v x := + padicFiniteExtensionExponentialValuation_extends p U + have hUD : ∀ x : U, w (algebraMap U D x) = u x := by + intro x + exact padicFiniteExtensionExponentialValuation_algHom p U.val x + let ζU : U := + ⟨ζ ^ b, IntermediateField.subset_adjoin + (F := ℚ_[p]) (S := {ζ ^ b}) (Set.mem_singleton (ζ ^ b))⟩ + have hζU : IsPrimitiveRoot ζU a := + IsPrimitiveRoot.coe_submonoidClass_iff.mp hζa + have hUgen : Algebra.adjoin ℚ_[p] ({ζU} : Set U) = ⊤ := + IsCyclotomicExtension.adjoin_primitive_root_eq_top hζU + have hUunramified : FiniteUnramifiedExtension v u hQU := by + exact padicCyclotomic_finiteUnramified_of_coprime + p r hpr hζU hUgen + have hUram : exponentialRamificationIndex v u = 1 := + exponentialRamificationIndex_eq_one_of_finiteUnramifiedExtension + v u hQU hUunramified + have hTower := exponentialRamificationIndex_mul_in_tower v u w hQU hUD + have hRamEq : exponentialRamificationIndex v w = exponentialRamificationIndex u w := by + calc + exponentialRamificationIndex v w = + exponentialRamificationIndex v u * exponentialRamificationIndex u w := hTower.symm + _ = exponentialRamificationIndex u w := by rw [hUram, one_mul] + have hRamDegree : exponentialRamificationIndex v w ≤ Module.finrank U D := by + rw [hRamEq] + exact exponentialRamificationIndex_le_finrank u w hUD + simpa [a, b, m, D, v, w] using + hRamDegree.trans (hDegreeUD.trans hDegreeC) + +end HilbertRamification + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicLocalizationCanonicalValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicLocalizationCanonicalValuation.lean new file mode 100644 index 0000000000..e4b45c8a8e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicLocalizationCanonicalValuation.lean @@ -0,0 +1,249 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationRamificationGroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.PadicLocalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring +/-! +# The valuation on the p-adic localization in the global cyclotomic inertia argument + +The localization constructed in is transported from the absolute +value completion of `ℚ` to the concrete field `ℚ_p`. Uniqueness of the +absolute-value extension identifies its valuation ring with the canonical +norm-formula valuation ring used in the unramified cyclotomic extension theorem. +-/ + +@[expose] public section + +noncomputable +section + +namespace HilbertRamification + +open AlgebraicNumberTheory.Valuations + +variable (p : ℕ) [Fact p.Prime] +variable (L : Type) [Field L] [Algebra ℚ L] + [FiniteDimensional ℚ L] [IsAbelianGalois ℚ L] + +/-- The absolute-value comparison statement for the raw algebraic localization, +with the transported `ℚ_p` structure kept internal. -/ +noncomputable def globalPadicLocalizationCanonicalAbsoluteValueProperty + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) L) : Prop := by + let vK := Rat.AbsoluteValue.padic p + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := ℚ) w.1 + letI : SMul ℚ w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + letI hE : Field E := inferInstance + letI hBaseE : Algebra vK.Completion E := inferInstance + let e := padicAbsoluteValueCompletionRingEquiv p + letI : Algebra ℚ_[p] E := + @transportedAlgebraAlongRingEquiv vK.Completion ℚ_[p] E _ _ + (@CommRing.toCommSemiring E hE.toCommRing) hBaseE e + letI : Module.Finite vK.Completion E := + globalPadicLocalizationModuleFinite p L w + letI : Algebra ℚ_[p] vK.Completion := e.symm.toRingHom.toAlgebra + letI : IsScalarTower ℚ_[p] vK.Completion E := + IsScalarTower.of_algebraMap_eq' (by ext x; rfl) + letI : Module.Finite ℚ_[p] vK.Completion := + FiniteDimensional.of_surjective + (Algebra.linearMap ℚ_[p] vK.Completion) e.symm.surjective + letI : Module.Finite ℚ_[p] E := Module.Finite.trans vK.Completion E + exact AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 = + padicFiniteExtensionAbsoluteValue p E + +/-- The algebraic-localization absolute value is exactly the canonical +norm-formula absolute value on its transported finite `ℚ_p`-extension. -/ +theorem globalPadicLocalizationAbsoluteValue_eq_canonical + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) L) : + globalPadicLocalizationCanonicalAbsoluteValueProperty p L w := by + let vK := Rat.AbsoluteValue.padic p + let hK := AbsoluteValue.extensionCompletionAlgebra (K := ℚ) w.1 + let : SMul ℚ w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + let hE : Field E := inferInstance + let hBaseE : Algebra vK.Completion E := inferInstance + let e := padicAbsoluteValueCompletionRingEquiv p + let hQpE : Algebra ℚ_[p] E := + @transportedAlgebraAlongRingEquiv vK.Completion ℚ_[p] E _ _ + (@CommRing.toCommSemiring E hE.toCommRing) hBaseE e + let : Module.Finite vK.Completion E := + globalPadicLocalizationModuleFinite p L w + let : Algebra ℚ_[p] vK.Completion := e.symm.toRingHom.toAlgebra + let : IsScalarTower ℚ_[p] vK.Completion E := + IsScalarTower.of_algebraMap_eq' (by ext x; rfl) + let : Module.Finite ℚ_[p] vK.Completion := + FiniteDimensional.of_surjective + (Algebra.linearMap ℚ_[p] vK.Completion) e.symm.surjective + let : Module.Finite ℚ_[p] E := Module.Finite.trans vK.Completion E + change AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 = + padicFiniteExtensionAbsoluteValue p E + let aE := AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 + have hQpExt : ∀ x : ℚ_[p], + aE (algebraMap ℚ_[p] E x) = + NormedField.toAbsoluteValue ℚ_[p] x := by + intro x + change aE (algebraMap vK.Completion E (e.symm x)) = ‖x‖ + rw [AbsoluteValue.algebraicLocalizationAbsoluteValue_extends] + change ‖e.symm x‖ = ‖x‖ + have hnorm := + (padicAbsoluteValueCompletionRingHom_isometry p).norm_map_of_map_zero + (map_zero (padicAbsoluteValueCompletionRingHom p)) (e.symm x) + calc + ‖e.symm x‖ = + ‖padicAbsoluteValueCompletionRingHom p (e.symm x)‖ := hnorm.symm + _ = ‖e (e.symm x)‖ := rfl + _ = ‖x‖ := by rw [e.apply_symm_apply] + have hLocalUnique := + AbsoluteValue.eq_spectralExtension_of_extends + (NormedField.toAbsoluteValue ℚ_[p]) + (completeSpace_withAbs_of_isCompleteForAbsoluteValue _ + (padicFieldAbsoluteValue_complete p)) + ((LubinTate.Valuations.strong_triangle_iff_isNonarchimedean _).1 + (LubinTate.Valuations.strong_triangle_of_nonarchimedean _ + (padicFieldAbsoluteValue_nonarchimedean p))) + (padicFieldAbsoluteValue_isNontrivial p) + aE hQpExt + have hCanonicalUnique := + AbsoluteValue.eq_spectralExtension_of_extends + (NormedField.toAbsoluteValue ℚ_[p]) + (completeSpace_withAbs_of_isCompleteForAbsoluteValue _ + (padicFieldAbsoluteValue_complete p)) + ((LubinTate.Valuations.strong_triangle_iff_isNonarchimedean _).1 + (LubinTate.Valuations.strong_triangle_of_nonarchimedean _ + (padicFieldAbsoluteValue_nonarchimedean p))) + (padicFieldAbsoluteValue_isNontrivial p) + (padicFiniteExtensionAbsoluteValue p E) + (padicFiniteExtensionAbsoluteValue_extends p E) + exact hLocalUnique.trans hCanonicalUnique.symm + +/-- The valuation-ring comparison statement for the raw algebraic localization, +with all transported local instances kept internal. -/ +noncomputable def globalPadicLocalizationCanonicalValuationProperty + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) L) : Prop := by + let vK := Rat.AbsoluteValue.padic p + let hv := rationalPadicAbsoluteValue_nonarchimedean p + let hw := HilbertRamification.absoluteValueExtension_nonarchimedean_of_base vK w hv + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := ℚ) w.1 + letI : SMul ℚ w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + letI hE : Field E := inferInstance + letI hBaseE : Algebra vK.Completion E := inferInstance + let e := padicAbsoluteValueCompletionRingEquiv p + letI hQpE : Algebra ℚ_[p] E := + @transportedAlgebraAlongRingEquiv vK.Completion ℚ_[p] E _ _ + (@CommRing.toCommSemiring E hE.toCommRing) hBaseE e + letI : Module.Finite vK.Completion E := + globalPadicLocalizationModuleFinite p L w + letI : Algebra ℚ_[p] vK.Completion := e.symm.toRingHom.toAlgebra + letI : IsScalarTower ℚ_[p] vK.Completion E := + IsScalarTower.of_algebraMap_eq' (by ext x; rfl) + letI : Module.Finite ℚ_[p] vK.Completion := + FiniteDimensional.of_surjective + (Algebra.linearMap ℚ_[p] vK.Completion) e.symm.surjective + letI : Module.Finite ℚ_[p] E := Module.Finite.trans vK.Completion E + exact + HilbertRamification.algebraicLocalizationValuationSubring vK w hw = + absoluteValueValuationSubring + (padicFiniteExtensionAbsoluteValue p E) + (padicFiniteExtensionAbsoluteValue_nonarchimedean p E) + +/-- The algebraic-localization valuation ring is the canonical valuation +ring on the transported finite extension of `ℚ_p`. -/ +theorem globalPadicLocalizationValuationSubring_eq_canonical + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) L) : + globalPadicLocalizationCanonicalValuationProperty p L w := by + let vK := Rat.AbsoluteValue.padic p + let hv := rationalPadicAbsoluteValue_nonarchimedean p + let hw := HilbertRamification.absoluteValueExtension_nonarchimedean_of_base vK w hv + let hK := AbsoluteValue.extensionCompletionAlgebra (K := ℚ) w.1 + let : SMul ℚ w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + let hE : Field E := inferInstance + let hBaseE : Algebra vK.Completion E := inferInstance + let e := padicAbsoluteValueCompletionRingEquiv p + let hQpE : Algebra ℚ_[p] E := + @transportedAlgebraAlongRingEquiv vK.Completion ℚ_[p] E _ _ + (@CommRing.toCommSemiring E hE.toCommRing) hBaseE e + let : Module.Finite vK.Completion E := + globalPadicLocalizationModuleFinite p L w + let : Algebra ℚ_[p] vK.Completion := e.symm.toRingHom.toAlgebra + let : IsScalarTower ℚ_[p] vK.Completion E := + IsScalarTower.of_algebraMap_eq' (by ext x; rfl) + let : Module.Finite ℚ_[p] vK.Completion := + FiniteDimensional.of_surjective + (Algebra.linearMap ℚ_[p] vK.Completion) e.symm.surjective + let : Module.Finite ℚ_[p] E := Module.Finite.trans vK.Completion E + change + HilbertRamification.algebraicLocalizationValuationSubring vK w hw = + absoluteValueValuationSubring + (padicFiniteExtensionAbsoluteValue p E) + (padicFiniteExtensionAbsoluteValue_nonarchimedean p E) + let aE := AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 + have hQpExt : ∀ x : ℚ_[p], + aE (algebraMap ℚ_[p] E x) = + NormedField.toAbsoluteValue ℚ_[p] x := by + intro x + change aE (algebraMap vK.Completion E (e.symm x)) = ‖x‖ + rw [AbsoluteValue.algebraicLocalizationAbsoluteValue_extends] + change ‖e.symm x‖ = ‖x‖ + have hnorm := + (padicAbsoluteValueCompletionRingHom_isometry p).norm_map_of_map_zero + (map_zero (padicAbsoluteValueCompletionRingHom p)) (e.symm x) + calc + ‖e.symm x‖ = + ‖padicAbsoluteValueCompletionRingHom p (e.symm x)‖ := hnorm.symm + _ = ‖e (e.symm x)‖ := rfl + _ = ‖x‖ := by rw [e.apply_symm_apply] + have hLocalUnique := + AbsoluteValue.eq_spectralExtension_of_extends + (NormedField.toAbsoluteValue ℚ_[p]) + (completeSpace_withAbs_of_isCompleteForAbsoluteValue _ + (padicFieldAbsoluteValue_complete p)) + ((LubinTate.Valuations.strong_triangle_iff_isNonarchimedean _).1 + (LubinTate.Valuations.strong_triangle_of_nonarchimedean _ + (padicFieldAbsoluteValue_nonarchimedean p))) + (padicFieldAbsoluteValue_isNontrivial p) + aE hQpExt + have hCanonicalUnique := + AbsoluteValue.eq_spectralExtension_of_extends + (NormedField.toAbsoluteValue ℚ_[p]) + (completeSpace_withAbs_of_isCompleteForAbsoluteValue _ + (padicFieldAbsoluteValue_complete p)) + ((LubinTate.Valuations.strong_triangle_iff_isNonarchimedean _).1 + (LubinTate.Valuations.strong_triangle_of_nonarchimedean _ + (padicFieldAbsoluteValue_nonarchimedean p))) + (padicFieldAbsoluteValue_isNontrivial p) + (padicFiniteExtensionAbsoluteValue p E) + (padicFiniteExtensionAbsoluteValue_extends p E) + have hAbsolute : + aE = padicFiniteExtensionAbsoluteValue p E := + hLocalUnique.trans hCanonicalUnique.symm + change absoluteValueValuationSubring aE _ = _ + ext x + simp only [mem_absoluteValueValuationSubring_iff, + hAbsolute] + +end HilbertRamification + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/RamificationIndexComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/RamificationIndexComparison.lean new file mode 100644 index 0000000000..0cc86013c6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/RamificationIndexComparison.lean @@ -0,0 +1,155 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +/-! +# Comparing exponential and canonical ramification indices + +This module compares the exponential-valuation presentation of ramification +with the canonical complete-DVF presentation. The comparison is independent +of any cyclotomic or Kronecker--Weber hypotheses. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w x + +namespace RamificationTheory + +open ValuationTheory.DiscreteValuationField +open AlgebraicNumberTheory.Valuations + +private theorem map_maximalIdeal_ringEquiv + {R S : Type*} [CommRing R] [CommRing S] + [IsLocalRing R] [IsLocalRing S] (e : R ≃+* S) : + Ideal.map e (IsLocalRing.maximalIdeal R) = + IsLocalRing.maximalIdeal S := by + ext y + rw [Ideal.mem_map_of_equiv e y] + constructor + · rintro ⟨x, hx, rfl⟩ + rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] at hx ⊢ + intro hy + apply hx + rw [← e.symm_apply_apply x] + exact hy.map (e.symm : S →+* R) + · intro hy + refine ⟨e.symm y, ?_, e.apply_symm_apply y⟩ + rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] at hy ⊢ + intro hx + apply hy + rw [← e.apply_symm_apply y] + exact hx.map (e : R →+* S) + +private theorem ramificationIdx_eq_of_map_eq + {R R' S : Type*} [CommRing R] [CommRing R'] [CommRing S] + [Algebra R S] [Algebra R' S] + (p : Ideal R) (q : Ideal R') (P : Ideal S) + (h : Ideal.map (algebraMap R S) p = + Ideal.map (algebraMap R' S) q) : + Ideal.ramificationIdx' p P = Ideal.ramificationIdx' q P := by + unfold Ideal.ramificationIdx' + rw [h] + +/-- +The ramification index computed from exponential value groups agrees with the +canonical ramification index of a finite complete-DVF extension when the two +presentations use the same valuation subrings. + +This comparison only needs the valued-extension data and the equality of the +underlying valuation rings; it is independent of tameness, Henselianity, and +residue-field separability. +-/ +theorem exponentialRamificationIndex_eq_ramificationIndex_of_valuationSubrings_eq + {K : Type u} {L : Type w} [Field K] [Field L] + [Algebra K L] + {base : CompleteDVF.{u, v} K} {target : CompleteDVF.{w, x} L} + [base.valuation.HasExtension target.valuation] + (vK : LubinTate.Valuations.ExponentialValuation K) + (vL : LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, vL (algebraMap K L a) = vK a) + (hV : LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK = + base.valuation.valuationSubring) + (hW : LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vL = + target.valuation.valuationSubring) : + exponentialRamificationIndex vK vL = + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF := by + have hVSub : LubinTate.Valuations.exponentialValuationSubring vK = + base.valuation.valuationSubring.toSubring := + congrArg ValuationSubring.toSubring hV + have hWSub : LubinTate.Valuations.exponentialValuationSubring vL = + target.valuation.valuationSubring.toSubring := + congrArg ValuationSubring.toSubring hW + let : IsDiscreteValuationRing (LubinTate.Valuations.exponentialValuationSubring vK) := by + rw [hVSub] + exact base.valuationSubring_isDiscreteValuationRing + let : IsDiscreteValuationRing (LubinTate.Valuations.exponentialValuationSubring vL) := by + rw [hWSub] + exact target.valuationSubring_isDiscreteValuationRing + have hvdisc : LubinTate.Valuations.DiscreteExponentialValuation vK := + discreteExponentialValuation_of_isDiscreteValuationRing vK + rw [exponentialRamificationIndex_eq_ideal_ramificationIdx vK vL hExt hvdisc] + let V := LubinTate.Valuations.exponentialValuationSubring vK + let W := LubinTate.Valuations.exponentialValuationSubring vL + let B := base.valuationSubring + let T := target.valuationSubring + let iValuationExtension := exponentialValuationRingMap vK vL hExt + let iCan : B →+* T := algebraMap B T + let eV : V ≃+* B := RingEquiv.subringCongr hVSub + let eW : W ≃+* T := RingEquiv.subringCongr hWSub + let g : V →+* T := iCan.comp eV.toRingHom + let : Algebra V W := iValuationExtension.toAlgebra + let : Algebra V T := g.toAlgebra + let eWAlg : W ≃ₐ[V] T := + AlgEquiv.ofRingEquiv (f := eW) (by + intro a + apply Subtype.ext + rfl) + have htransport := + Ideal.ramificationIdx'_map_eq + (IsLocalRing.maximalIdeal V) (IsLocalRing.maximalIdeal W) eWAlg + change Ideal.ramificationIdx' (IsLocalRing.maximalIdeal V) + (Ideal.map eW (IsLocalRing.maximalIdeal W)) = + Ideal.ramificationIdx' (IsLocalRing.maximalIdeal V) + (IsLocalRing.maximalIdeal W) at htransport + have hMaxW : Ideal.map eW (IsLocalRing.maximalIdeal W) = + target.maximalIdeal := + map_maximalIdeal_ringEquiv eW + rw [hMaxW] at htransport + have hMaxV : Ideal.map eV (IsLocalRing.maximalIdeal V) = + base.maximalIdeal := + map_maximalIdeal_ringEquiv eV + have hMap : Ideal.map g (IsLocalRing.maximalIdeal V) = + Ideal.map iCan base.maximalIdeal := by + calc + Ideal.map g (IsLocalRing.maximalIdeal V) = + Ideal.map (iCan.comp eV.toRingHom) + (IsLocalRing.maximalIdeal V) := rfl + _ = Ideal.map iCan + (Ideal.map eV (IsLocalRing.maximalIdeal V)) := by + exact (Ideal.map_map eV.toRingHom iCan).symm + _ = Ideal.map iCan base.maximalIdeal := by rw [hMaxV] + calc + Ideal.ramificationIdx' (IsLocalRing.maximalIdeal V) + (IsLocalRing.maximalIdeal W) = + Ideal.ramificationIdx' (IsLocalRing.maximalIdeal V) + target.maximalIdeal := htransport.symm + _ = Ideal.ramificationIdx' base.maximalIdeal target.maximalIdeal := + ramificationIdx_eq_of_map_eq + (IsLocalRing.maximalIdeal V) base.maximalIdeal target.maximalIdeal hMap + _ = ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF := rfl + +end RamificationTheory + +end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems.lean new file mode 100644 index 0000000000..6082173e4e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems.lean @@ -0,0 +1,20 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.KroneckerWeber +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/All.lean new file mode 100644 index 0000000000..6f588f8c3f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/All.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.KroneckerWeber +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.All +/-! Stable reader-facing statements of the main class field theory results. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields.lean new file mode 100644 index 0000000000..b78c6e1d31 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields.lean @@ -0,0 +1,59 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteExponentIsLeast +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteNormCriterion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorRayClassFieldLe +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorRealRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorTameCriterion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInEveryRayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInRayClassFieldIffConductorLe +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsRayArtinModulusProjection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsUniqueAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.FractionalIdealNormPrimeExponent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsAbelianConductorUnique +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsRayCongruentOfLe +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.NarrowRayClassGroupEquivNarrowClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.OrdinaryNarrowModuliEqOfNoReal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.OrdinaryRayClassGroupEquivClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayArtinModulusProjection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldModulusMonotone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldPrimeSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupFinite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupHomExtFinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealArtinKerEqNormRangeSupPrincipal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionPrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionSurjective +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageEqArtinKer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageLeArtinKer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupExistence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupFieldAntitone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupPrimeInertiaDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupPrimeSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquivMk +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupRealizationEq +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupRealizationEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitAntitone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitMembership +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitOneAdd +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitOpen +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitZero +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealMembership +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealPrimeTo + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteExponentIsLeast.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteExponentIsLeast.lean new file mode 100644 index 0000000000..9184ef1951 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteExponentIsLeast.lean @@ -0,0 +1,52 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteNormCriterion +public import Mathlib.RingTheory.Norm.Basic +public import Mathlib.RingTheory.TensorProduct.Basic +/-! +# The finite conductor exponent is a genuine local minimum + +The local norm condition is satisfied at the conductor exponent and at +every larger exponent, and at no smaller exponent. The norm is taken from +the whole completion tensor algebra, with no arbitrary place above `v`. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +/-- The conductor exponent is the least index whose higher-unit group lies +in the finite-place tensor norm image. In particular this set is nonempty. -/ +theorem IsAbelianConductor.finiteExponent_isLeast_tensorNorm + {K : Type} [Field K] [NumberField K] + {L : Type} [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + {c : RayClassModulus K} + (hc : IsAbelianConductor K L c) + (v : HeightOneSpectrum (𝓞 K)) : + IsLeast (α := ℕ) (fun n => + rayLocalHigherUnitGroup v n ≤ + (Units.map (Algebra.norm (v.adicCompletion K)) : + (v.adicCompletion K ⊗[K] L)ˣ →* + (v.adicCompletion K)ˣ).range) (c.finitePart v) := by + constructor + · exact (hc.finiteExponent_le_iff_higherUnit_le_tensorNorm v + (c.finitePart v)).mp le_rfl + · intro n hn + exact (hc.finiteExponent_le_iff_higherUnit_le_tensorNorm v n).mpr hn + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteNormCriterion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteNormCriterion.lean new file mode 100644 index 0000000000..2b1d072cc7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteNormCriterion.lean @@ -0,0 +1,102 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PublicHigherUnitComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +public import Mathlib.RingTheory.Norm.Basic +public import Mathlib.RingTheory.TensorProduct.Basic +/-! +# Finite conductor exponents and local norms + +The finite exponent of the conductor is characterized by the determinant +norm from `K_v ⊗[K] L`. This formulation does not choose a place of `L` +above `v`; the implementation proves that the tensor norm image agrees +with the norm group of a chosen local field extension. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +open GlobalClassFieldTheory.GlobalClassFields renaming + ideleClassNormLocalHigherUnitExponent_eq_localConductorExponent → + ideleClassNormLocalHigherUnitExponent_eq_localConductorExponent in +/-- The conductor exponent at `v` is at most `n` exactly when the `n`-th +higher-unit group lies in the finite-place tensor norm image. -/ +theorem IsAbelianConductor.finiteExponent_le_iff_higherUnit_le_tensorNorm + {K : Type} [Field K] [NumberField K] + {L : Type} [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + {c : RayClassModulus K} + (hc : IsAbelianConductor K L c) + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ) : + c.finitePart v ≤ n ↔ + rayLocalHigherUnitGroup v n ≤ + (Units.map (Algebra.norm (v.adicCompletion K)) : + (v.adicCompletion K ⊗[K] L)ˣ →* + (v.adicCompletion K)ˣ).range := by + let H := + GlobalClassFieldTheory.GlobalClassFields.ideleClassNormConductorialSubgroup + (K := K) (L := L) + let d : RayClassModulus K := + { finitePart := H.fullConductor.finitePart + infinitePart := H.fullConductor.infinitePart } + have hd : IsAbelianConductor K L d := + normFullConductor_isAbelianConductor K L + have hcd : c = d := by + apply le_antisymm + · exact (hc d).mp ((hd d).mpr le_rfl) + · exact (hd c).mp ((hc c).mpr le_rfl) + have hsource : + H.fullConductor.finitePart v = + GlobalClassFieldTheory.GlobalClassFields.ideleClassNormLocalHigherUnitExponent + (K := K) (L := L) v := by + rw [abelianFullConductor_finiteExponent_eq_localConductorExponent + (K := K) (L := L) v] + exact + (ideleClassNormLocalHigherUnitExponent_eq_localConductorExponent + (K := K) (L := L) v).symm + have hcoeff : + c.finitePart v = + GlobalClassFieldTheory.GlobalClassFields.ideleClassNormLocalHigherUnitExponent + (K := K) (L := L) v := by + rw [hcd] + simpa only [d] using hsource + have hnorm : + (Units.map (Algebra.norm (v.adicCompletion K)) : + (v.adicCompletion K ⊗[K] L)ˣ →* + (v.adicCompletion K)ˣ).range = + _root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := by + simpa only [_root_.localTensorNorm] using + (finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup + (K := K) (L := L) v) + rw [hcoeff, hnorm] + rw [rayLocalHigherUnitGroup_eq_rayClass v n] + constructor + · intro hn + exact + (RayClass.localHigherUnitGroup_antitone v hn).trans + (GlobalClassFieldTheory.GlobalClassFields.ideleClassNormLocalHigherUnitExponent_spec + (K := K) (L := L) v) + · intro hn + exact + GlobalClassFieldTheory.GlobalClassFields.ideleClassNormLocalHigherUnitExponent_min + (K := K) (L := L) v hn + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteSupport.lean new file mode 100644 index 0000000000..1c39e64ea4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteSupport.lean @@ -0,0 +1,58 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteUnramified +/-! +# Finite support of the conductor + +The finite support is exactly the set of base primes ramified somewhere +upstairs. This does not identify an arbitrary defining ray modulus with the +minimal conductor. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +/-- A finite prime occurs in the conductor precisely when some prime above +it is ramified. -/ +theorem IsAbelianConductor.mem_finiteSupport_iff_exists_ramified + {K : Type} [Field K] [NumberField K] + {L : Type} [Field L] [NumberField L] + [Algebra K L] [IsAbelianGalois K L] + {c : RayClassModulus K} + (hc : IsAbelianConductor K L c) + (v : HeightOneSpectrum (𝓞 K)) : + v ∈ c.finitePart.support ↔ + ∃ W : HeightOneSpectrum (𝓞 L), + W.asIdeal.LiesOver v.asIdeal ∧ + ¬ Algebra.IsUnramifiedAt (𝓞 K) W.asIdeal := by + constructor + · intro hv + by_contra hnone + have hall : ∀ W : HeightOneSpectrum (𝓞 L), + W.asIdeal.LiesOver v.asIdeal → + Algebra.IsUnramifiedAt (𝓞 K) W.asIdeal := by + intro W hW + by_contra hn + exact hnone ⟨W, hW, hn⟩ + exact (Finsupp.mem_support_iff.mp hv) + ((hc.finiteExponent_eq_zero_iff_unramified v).mpr hall) + · rintro ⟨W, hW, hn⟩ + apply Finsupp.mem_support_iff.mpr + intro hz + exact hn ((hc.finiteExponent_eq_zero_iff_unramified v).mp hz W hW) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteUnramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteUnramified.lean new file mode 100644 index 0000000000..b97a8dd5b2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteUnramified.lean @@ -0,0 +1,74 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInRayClassFieldIffConductorLe +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsAbelianConductorUnique +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness +/-! +# Zero finite exponent and unramifiedness +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +open GlobalClassFieldTheory.GlobalClassFields renaming + ideleClassNorm_narrowFiniteConductor_support_eq_ramifiedBaseFinitePlaces → + ideleClassNorm_conductor_support_eq_ramifiedPlaces in +/-- A finite place has exponent zero in the public conductor exactly when +every place above it is unramified. -/ +theorem IsAbelianConductor.finiteExponent_eq_zero_iff_unramified + {K : Type} [Field K] [NumberField K] + {L : Type} [Field L] [NumberField L] + [Algebra K L] [IsAbelianGalois K L] + {c : RayClassModulus K} + (hc : IsAbelianConductor K L c) + (v : HeightOneSpectrum (𝓞 K)) : + c.finitePart v = 0 ↔ + ∀ W : HeightOneSpectrum (𝓞 L), + W.asIdeal.LiesOver v.asIdeal → + Algebra.IsUnramifiedAt (𝓞 K) W.asIdeal := by + let H := GlobalClassFieldTheory.GlobalClassFields.ideleClassNormConductorialSubgroup + (K := K) (L := L) + have heq : c = + ({ finitePart := H.fullConductor.finitePart + infinitePart := H.fullConductor.infinitePart } : RayClassModulus K) := + hc.unique (normFullConductor_isAbelianConductor K L) + have hsupport : c.finitePart.support = + _root_.ramifiedBaseFinitePlaces (K := K) (L := L) := by + rw [heq] + change H.narrowFiniteConductor.support = _ + exact + ideleClassNorm_conductor_support_eq_ramifiedPlaces + (K := K) (L := L) + calc + c.finitePart v = 0 ↔ v ∉ c.finitePart.support := + (Finsupp.notMem_support_iff).symm + _ ↔ v ∉ _root_.ramifiedBaseFinitePlaces (K := K) (L := L) := by + rw [hsupport] + _ ↔ + ∀ W : HeightOneSpectrum (𝓞 L), + W.asIdeal.LiesOver v.asIdeal → + Algebra.IsUnramifiedAt (𝓞 K) W.asIdeal := by + rw [_root_.mem_ramifiedBaseFinitePlaces_iff] + constructor + · intro h W hW + by_contra hram + exact h ⟨W, hW, hram⟩ + · intro h hram + obtain ⟨W, hW, hnot⟩ := hram + exact hnot (h W hW) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRayClassFieldLe.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRayClassFieldLe.lean new file mode 100644 index 0000000000..45742c847d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRayClassFieldLe.lean @@ -0,0 +1,34 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +/-! +# The conductor of a ray class field + +The conductor of the ray class field for a modulus `m` is bounded above by +`m`. Equality need not hold: a modulus may contain redundant conditions. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- A ray class field's conductor is at most its defining modulus. -/ +theorem IsAbelianConductor.le_rayClassFieldModulus + {K : Type u} [Field K] [NumberField K] + {m c : RayClassModulus K} + (R : RayClassFieldRealization K m) + (hc : IsAbelianConductor K R.extension c) : + c ≤ m := by + apply (hc m).mp + exact ⟨R, ⟨AlgHom.id K R.extension⟩⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRealRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRealRamification.lean new file mode 100644 index 0000000000..ad40cfdea2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRealRamification.lean @@ -0,0 +1,50 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInRayClassFieldIffConductorLe +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsAbelianConductorUnique +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness +/-! +# Real places in the public abelian conductor +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +open GlobalClassFieldTheory.GlobalClassFields renaming + ideleClassNormFullConductor_infinitePart_eq_realRamificationLocus → + ideleClassNormFullConductor_infinitePart_eq_realRamificationLocus in +/-- A real place belongs to the public conductor precisely when it ramifies +(complexifies) in the extension. -/ +theorem IsAbelianConductor.mem_infinitePart_iff_realRamified + {K : Type} [Field K] [NumberField K] + {L : Type} [Field L] [NumberField L] + [Algebra K L] [IsAbelianGalois K L] + {c : RayClassModulus K} + (hc : IsAbelianConductor K L c) + (v : RayClassRealPlace K) : + v ∈ c.infinitePart ↔ ¬ v.1.IsUnramifiedIn L := by + let H := GlobalClassFieldTheory.GlobalClassFields.ideleClassNormConductorialSubgroup + (K := K) (L := L) + have heq : c = + ({ finitePart := H.fullConductor.finitePart + infinitePart := H.fullConductor.infinitePart } : RayClassModulus K) := + hc.unique (normFullConductor_isAbelianConductor K L) + rw [heq] + change v ∈ H.fullConductor.infinitePart ↔ _ + rw [ideleClassNormFullConductor_infinitePart_eq_realRamificationLocus] + simp only [Finset.mem_filter, Finset.mem_univ, true_and] + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorTameCriterion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorTameCriterion.lean new file mode 100644 index 0000000000..f6823af424 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorTameCriterion.lean @@ -0,0 +1,147 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.IntegerRingComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.RamificationIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.FiniteAbelian +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +public import Mathlib.NumberTheory.RamificationInertia.Galois +public import Mathlib.RingTheory.Ideal.Quotient.HasFiniteQuotients.Basic +/-! +# Tame finite conductor exponents + +For a finite abelian number-field extension, the conductor exponent at a +finite place is at most one exactly when the residue characteristic does not +divide the ideal-theoretic ramification index at any place above it. +-/ + +@[expose] public section + +open scoped NumberField ValuativeRel +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +open GlobalClassFieldTheory.GlobalClassFields renaming + ideleClassNormChosenFinitePlaceLocalConductorExponent → + ideleClassNormChosenFinitePlaceLocalConductorExponent in +/-- At any prime above `v`, the finite conductor exponent is at most one +exactly when the residue characteristic is prime to the ramification index. +The criterion is independent of the chosen prime above `v`. -/ +theorem IsAbelianConductor.finiteExponent_le_one_iff_residueChar_not_dvd_ramificationIdx + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + {c : RayClassModulus K} + (hc : IsAbelianConductor K L c) + (v : HeightOneSpectrum (𝓞 K)) + (W : HeightOneSpectrum (𝓞 L)) + (hW : W.asIdeal.LiesOver v.asIdeal) : + c.finitePart v ≤ 1 ↔ + ¬ ringChar (𝓞 K ⧸ v.asIdeal) ∣ + W.asIdeal.ramificationIdx (𝓞 K) := by + let p : ℕ := ringChar (𝓞 K ⧸ v.asIdeal) + let : Finite (𝓞 K ⧸ v.asIdeal) := + Ring.HasFiniteQuotients.finiteQuotient v.ne_bot + let : Fact p.Prime := + ⟨CharP.prime_ringChar (𝓞 K ⧸ v.asIdeal)⟩ + let : CharP (𝓞 K ⧸ v.asIdeal) p := + ringChar.charP (R := 𝓞 K ⧸ v.asIdeal) + let C := _root_.ChosenFinitePlaceBaseCompletion (K := K) v + let E := _root_.ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) v + let : FiniteDimensional C E := + _root_.chosenFinitePlaceLocalizedFiniteDimensional + (K := K) (L := L) v + let : Algebra.IsSeparable C E := + (_root_.chosenFinitePlaceLocalizedIsGalois + (K := K) (L := L) v).to_isSeparable + let vK := HeightOneSpectrum.adicAbv K v + let w := _root_.chosenFinitePlaceExtension (L := L) v + let : IsAbelianGalois C E := + LocalClassFieldTheory.localizedCompletion_isAbelianGalois + vK (RayClass.adicAbv_isNontrivial v) w + let base := (LocalFieldTheory.localCompleteDVF C).toDVF + let target := + (LocalFieldTheory.chosenLocalExtensionCompleteDVF C E).toDVF + have hp_ne : p ≠ 0 := + (Fact.out : p.Prime).ne_zero + let eBase := _root_.finitePlaceIdealResidueEquivCompletion v + let : CharP base.residueField p := by + change CharP (IsLocalRing.ResidueField 𝒪[C]) p + exact CharP.of_ringHom_of_ne_zero eBase.toRingHom p hp_ne + let : CharP target.residueField p := + CharP.of_ringHom_of_ne_zero + (ValuationTheory.DiscreteValuationField.ValuedExtension.residueMap + base target) p hp_ne + have hLocal : + LocalClassFieldTheory.localConductorExponent C E ≤ 1 ↔ + ¬ p ∣ + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base target := by + exact + LocalClassFieldTheory.localConductorExponent_le_one_iff_residueChar_not_dvd_ramificationIndex + C E p + let H := + GlobalClassFieldTheory.GlobalClassFields.ideleClassNormConductorialSubgroup + (K := K) (L := L) + let d : RayClassModulus K := + { finitePart := H.fullConductor.finitePart + infinitePart := H.fullConductor.infinitePart } + have hd : IsAbelianConductor K L d := + normFullConductor_isAbelianConductor K L + have hcd : c = d := by + apply le_antisymm + · exact (hc d).mp ((hd d).mpr le_rfl) + · exact (hd c).mp ((hc c).mpr le_rfl) + have hCoeff : + c.finitePart v = + ideleClassNormChosenFinitePlaceLocalConductorExponent + (K := K) (L := L) v := by + rw [hcd] + simpa only [d] using + (abelianFullConductor_finiteExponent_eq_localConductorExponent + (K := K) (L := L) v) + have hChosen : + ideleClassNormChosenFinitePlaceLocalConductorExponent + (K := K) (L := L) v = + LocalClassFieldTheory.localConductorExponent C E := by + rfl + let P := v.asIdeal + let Q := W.asIdeal + let Qc := + (_root_.finitePlaceExtensionCentre + (K := K) (L := L) v w).asIdeal + let : Q.LiesOver P := hW + let : Qc.LiesOver P := + _root_.finitePlaceExtensionCentre_liesOver + (K := K) (L := L) v w + let G := L ≃ₐ[K] L + let : Finite G := IsGaloisGroup.finite G K L + let : IsGaloisGroup G (𝓞 K) (𝓞 L) := + IsGaloisGroup.of_isFractionRing G (𝓞 K) (𝓞 L) K L + have hIdxLocal : + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base target = P.ramificationIdx' Qc := by + exact _root_.chosenFinitePlace_chosenLocal_ramificationIndex_eq_centre + (K := K) (L := L) v + have hIdxOldNew : P.ramificationIdx' Qc = + Qc.ramificationIdx (𝓞 K) := + Ideal.ramificationIdx'_eq_ramificationIdx P Qc v.ne_bot + have hIdxConjugate : Qc.ramificationIdx (𝓞 K) = + Q.ramificationIdx (𝓞 K) := + Ideal.ramificationIdx_eq_of_isGaloisGroup P Qc Q G + rw [hCoeff, hChosen, hLocal, hIdxLocal, hIdxOldNew, + hIdxConjugate] + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/All.lean new file mode 100644 index 0000000000..3cefec13c5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/All.lean @@ -0,0 +1,64 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInRayClassFieldIffConductorLe +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInEveryRayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteUnramified +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteNormCriterion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorTameCriterion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteExponentIsLeast +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorRayClassFieldLe +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorRealRamification +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsAbelianConductorUnique +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsRayCongruentOfLe +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.NarrowRayClassGroupEquivNarrowClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.OrdinaryNarrowModuliEqOfNoReal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.OrdinaryRayClassGroupEquivClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsUniqueAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.FractionalIdealNormPrimeExponent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupFinite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageLeArtinKer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageEqArtinKer +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealArtinKerEqNormRangeSupPrincipal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupHomExtFinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldPrimeSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayArtinModulusProjection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsRayArtinModulusProjection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldModulusMonotone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionPrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionSurjective +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitAntitone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitMembership +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitOpen +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitOneAdd +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitZero +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupPrimeInertiaDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupExistence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupFieldAntitone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupRealizationEq +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupRealizationEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupPrimeSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquivMk +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealMembership +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealPrimeTo +/-! +# Conductors and ray class fields + +This `All` module collects the implementation-independent finite class-field +correspondence for ray-class subgroups, full ray class fields, their degree +and prime-splitting formulas, and conductor minimality. Each theorem has its +own leaf module. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInEveryRayClassFieldRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInEveryRayClassFieldRealization.lean new file mode 100644 index 0000000000..eddc88a6ad --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInEveryRayClassFieldRealization.lean @@ -0,0 +1,50 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.EmbedsInRayClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldModulusMonotone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldReciprocity +/-! +# Independence of the ray class field realization + +The existential definition of `EmbedsInRayClassField` is independent of +which Frobenius-normalized realization is chosen. It does not assert +uniqueness of the embedding itself. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +/-- Embedding in some ray class field realization is equivalent to +embedding in every realization for the same modulus. -/ +theorem embedsInRayClassField_iff_every_realization + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + (m : RayClassModulus K) : + EmbedsInRayClassField K L m ↔ + ∀ R : RayClassFieldRealization K m, + Nonempty (L →ₐ[K] R.extension) := by + constructor + · rintro ⟨R₀, ⟨f⟩⟩ R + have hEq : R₀.extension.1 = R.extension.1 := + le_antisymm + (rayClassFieldRealization_mono_modulus le_rfl R₀ R) + (rayClassFieldRealization_mono_modulus le_rfl R R₀) + exact ⟨(IntermediateField.equivOfEq hEq).toAlgHom.comp f⟩ + · intro h + obtain ⟨R⟩ := rayClassField_reciprocity K m + exact ⟨R, h R⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInRayClassFieldIffConductorLe.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInRayClassFieldIffConductorLe.lean new file mode 100644 index 0000000000..a3d8f323b7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInRayClassFieldIffConductorLe.lean @@ -0,0 +1,44 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +/-! +# The full conductor as a minimal modulus + +Let `L/K` be finite abelian. Its conductor is the least modulus whose ray +class field contains `L`. Since the public interface makes no global choice +of ray class fields, the theorem asserts existence of this least modulus. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +open scoped Classical in +/-- A finite abelian extension has a conductor characterized by containment +in ray class fields. -/ +theorem embedsInRayClassField_iff_conductor_le + (K : Type) [Field K] [NumberField K] + (L : Type) [Field L] [NumberField L] + [Algebra K L] [IsAbelianGalois K L] : + ∃ c : RayClassModulus K, IsAbelianConductor K L c := by + let H := GlobalClassFieldTheory.GlobalClassFields.ideleClassNormConductorialSubgroup + (K := K) (L := L) + let c : RayClassModulus K := + { finitePart := H.fullConductor.finitePart + infinitePart := H.fullConductor.infinitePart } + exact ⟨c, normFullConductor_isAbelianConductor K L⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsAbelianConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsAbelianConductor.lean new file mode 100644 index 0000000000..6b137b3a43 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsAbelianConductor.lean @@ -0,0 +1,32 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInRayClassFieldIffConductorLe +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +/-! +# Existence of the abelian conductor + +The conductor of a finite abelian extension is the least modulus whose ray +class field contains that extension. The older theorem name +`embedsInRayClassField_iff_conductor_le` remains available for compatibility; +its conclusion is an existence statement, so this name reflects its type. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +/-- A finite abelian extension of number fields has a conductor. -/ +theorem exists_abelianConductor + (K : Type) [Field K] [NumberField K] + (L : Type) [Field L] [NumberField L] + [Algebra K L] [IsAbelianGalois K L] : + ∃ c : RayClassModulus K, IsAbelianConductor K L c := + embedsInRayClassField_iff_conductor_le K L + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsRayArtinModulusProjection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsRayArtinModulusProjection.lean new file mode 100644 index 0000000000..b24e5150ea --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsRayArtinModulusProjection.lean @@ -0,0 +1,113 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayArtinModulusProjection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealModulusProjection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment +/-! +# Existence of a modulus-compatible ray class field embedding + +Reducing the modulus yields an embedding of ray class field realizations +that intertwines their Artin maps. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +open scoped Classical in +private theorem rayArtin_prime_eq_arithmeticPrimeArtin + {K : Type} [Field K] [NumberField K] + {m : RayClassModulus K} (R : RayClassFieldRealization K m) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : + R.rayArtin (rayClassOfFinitePrime m v hv) = + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := R.extension) v := by + let w₀ := _root_.chosenFinitePlaceExtension (L := R.extension) v + let w := _root_.finitePlaceExtensionCentre (K := K) (L := R.extension) v w₀ + have hw : w.asIdeal.LiesOver v.asIdeal := + _root_.finitePlaceExtensionCentre_liesOver + (K := K) (L := R.extension) v w₀ + have hunram : Algebra.IsUnramifiedAt (𝓞 K) w.asIdeal := + (R.unramifiedOutsideModulus.1 v hv) w.asIdeal inferInstance hw + calc + R.rayArtin (rayClassOfFinitePrime m v hv) = + arithmeticFrobeniusAt (K := K) w := R.artin_frobenius v hv w hw + _ = GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := R.extension) v := + (GlobalClassFieldComparison.arithmeticPrimeArtin_eq_arithmeticFrobeniusAt + (K := K) (L := R.extension) v w hw hunram).symm + +open scoped Classical in +private theorem rayClassFieldRealization_norm_range + {K : Type} [Field K] [NumberField K] + {m : RayClassModulus K} (R : RayClassFieldRealization K m) : + (_root_.ideleClassNorm K R.extension).range = + (GlobalClassFieldComparison.rayClassModulusToOriginal K m).congruenceSubgroup := by + let m' := GlobalClassFieldComparison.rayClassModulusToOriginal K m + let e : RayClass.RayClassGroup m' ≃* + (R.extension ≃ₐ[K] R.extension) := + (GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m).symm.trans + R.artinEquiv + apply + GlobalClassFieldTheory.GlobalClassFields.rayModulus_normSubgroup_eq_of_arithmeticPrimeArtinEquiv + m' e + intro v hv + have hvm : v ∉ m.finitePart.support := hv + calc + e (QuotientGroup.mk' m'.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v))) = + R.rayArtin (rayClassOfFinitePrime m v hvm) := by + change R.artinEquiv + ((GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m).symm + (QuotientGroup.mk' m'.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v)))) = _ + rw [← GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele_prime K m v hvm] + exact congrArg R.artinEquiv + ((GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m).symm_apply_apply _) + _ = GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := R.extension) v := + rayArtin_prime_eq_arithmeticPrimeArtin R v hvm + +open scoped Classical in +/-- A reduction of the modulus yields an embedding of any two ray-class-field +realizations, and this embedding intertwines their Artin maps. -/ +theorem exists_rayArtin_modulusProjection + {K : Type} [Field K] [NumberField K] + {m n : RayClassModulus K} (hmn : m ≤ n) + (Rm : RayClassFieldRealization K m) + (Rn : RayClassFieldRealization K n) : + ∃ f : Rm.extension →ₐ[K] Rn.extension, + ∀ (x : RayClassGroup n) (y : Rm.extension), + Rn.rayArtin x (f y) = + f (Rm.rayArtin (rayClassIdealModulusProjection K hmn x) y) := by + have hnorm : (_root_.ideleClassNorm K Rn.extension).range ≤ + (_root_.ideleClassNorm K Rm.extension).range := by + rw [rayClassFieldRealization_norm_range Rn, + rayClassFieldRealization_norm_range Rm] + exact RayClass.Modulus.congruenceSubgroup_antitone hmn + obtain ⟨f⟩ := + GlobalClassFieldTheory.GlobalClassFields.finiteAbelianExtension_nonempty_algHom_of_normRange_le + (K := K) Rm.extension Rn.extension hnorm + exact ⟨f, rayArtin_modulusProjection hmn Rm Rn f⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsUniqueAbelianConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsUniqueAbelianConductor.lean new file mode 100644 index 0000000000..b5208dc9e3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsUniqueAbelianConductor.lean @@ -0,0 +1,33 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsAbelianConductorUnique +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +/-! +# Unique existence of the abelian conductor + +Existence of a least ray-class-field modulus and uniqueness of any modulus +with the same universal property combine into a unique-existence statement. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +/-- The conductor of a finite abelian extension of number fields exists +uniquely. -/ +theorem existsUnique_abelianConductor + (K : Type) [Field K] [NumberField K] + (L : Type) [Field L] [NumberField L] + [Algebra K L] [IsAbelianGalois K L] : + ∃! c : RayClassModulus K, IsAbelianConductor K L c := by + obtain ⟨c, hc⟩ := exists_abelianConductor K L + exact ⟨c, hc, fun d hd => hd.unique hc⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/FractionalIdealNormPrimeExponent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/FractionalIdealNormPrimeExponent.lean new file mode 100644 index 0000000000..c37cad3120 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/FractionalIdealNormPrimeExponent.lean @@ -0,0 +1,49 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm +/-! +# Prime exponents of a fractional-ideal norm + +At a finite prime of the base, the exponent of the norm is the sum of the +upstairs exponents, each weighted by its inertia degree. This is the +calculation needed when passing from ideals to norm-defined ray subgroups. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +open scoped Classical in +/-- The exponent at `v` of an ideal norm is the inertia-degree-weighted sum +of the exponents at the primes lying above `v`. -/ +theorem fractionalIdealNorm_primeExponent + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] + (I : NumberFieldFractionalIdealGroup L) + (v : HeightOneSpectrum (𝓞 K)) : + FractionalIdeal.count K v + ((fractionalIdealNorm K L I : NumberFieldFractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = + (NumberFieldFractionalIdealGroup.countVector I).sum fun W n => + if fractionalIdealNormPrimeBelow K L W = v then + (W.asIdeal.inertiaDeg (𝓞 K) : ℤ) * n + else 0 := by + exact fractionalIdealNorm_count K L I v + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/IsAbelianConductorUnique.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/IsAbelianConductorUnique.lean new file mode 100644 index 0000000000..fce1c1a06e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/IsAbelianConductorUnique.lean @@ -0,0 +1,34 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +/-! +# Uniqueness of the conductor + +A finite abelian extension has at most one modulus that characterizes exactly +the ray class fields containing it. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u v + +/-- The least modulus characterized by ray-class-field containment is unique. -/ +theorem IsAbelianConductor.unique + {K : Type u} [Field K] [NumberField K] + {L : Type v} [Field L] [NumberField L] [Algebra K L] + {c d : RayClassModulus K} + (hc : IsAbelianConductor K L c) + (hd : IsAbelianConductor K L d) : c = d := by + apply le_antisymm + · exact (hc d).mp ((hd d).mpr le_rfl) + · exact (hd c).mp ((hc c).mpr le_rfl) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/IsRayCongruentOfLe.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/IsRayCongruentOfLe.lean new file mode 100644 index 0000000000..f153434091 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/IsRayCongruentOfLe.lean @@ -0,0 +1,49 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitAntitone +/-! +# Ray congruence under enlargement of the modulus + +A larger modulus has at least as strong a congruence condition at each +finite prime and at least as many real positivity conditions. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory.IsRayCongruent + +universe u + +open NumberField IsDedekindDomain + +/-- An element ray-congruent for a larger modulus is ray-congruent for a +smaller modulus. -/ +theorem of_le + {K : Type u} [Field K] [NumberField K] + {m n : RayClassModulus K} (hmn : m ≤ n) + {x : Kˣ} (hx : IsRayCongruent n x) : + IsRayCongruent m x := by + constructor + · intro v hv + have hvn : v ∈ n.finitePart.support := by + apply Finsupp.mem_support_iff.mpr + have hpos : 0 < m.finitePart v := + Nat.pos_of_ne_zero (Finsupp.mem_support_iff.mp hv) + exact Nat.ne_of_gt (lt_of_lt_of_le hpos (hmn.1 v)) + exact rayLocalHigherUnitGroup_antitone v (hmn.1 v) (hx.1 v hvn) + · intro v hv + exact hx.2 v (hmn.2 hv) + +end ClassFieldTheory.IsRayCongruent diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/NarrowRayClassGroupEquivNarrowClassGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/NarrowRayClassGroupEquivNarrowClassGroup.lean new file mode 100644 index 0000000000..1e3fa2ce66 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/NarrowRayClassGroupEquivNarrowClassGroup.lean @@ -0,0 +1,142 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal +/-! +# The narrow ray class group and the narrow ideal class group + +At the modulus with no finite part and every real place selected, the +ideal-theoretic ray class group is the narrow class group. The comparison +preserves the class of each finite prime. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +variable {K : Type u} [Field K] [NumberField K] + +private theorem narrow_rayClassPrimeToIdeals_eq_top : + rayClassPrimeToIdeals (narrowRayClassModulus K) = ⊤ := by + ext I + simp [rayClassPrimeToIdeals, narrowRayClassModulus] + +private theorem narrow_rayPrincipalIdealSubgroup_eq_positive : + rayPrincipalIdealSubgroup (narrowRayClassModulus K) = + narrowPrincipalIdealSubgroup K := by + classical + have hSet : + {I : NumberFieldFractionalIdealGroup K | + ∃ x : Kˣ, + IsRayCongruent (narrowRayClassModulus K) x ∧ + toPrincipalIdeal (𝓞 K) K x = I} = + (narrowPrincipalIdealSubgroup K : Set _) := by + ext I + constructor + · rintro ⟨x, hx, rfl⟩ + change toPrincipalIdeal (𝓞 K) K x ∈ + (totallyPositiveFieldUnits K).map (toPrincipalIdeal (𝓞 K) K) + refine ⟨x, ?_, rfl⟩ + intro v + exact hx.2 v (Finset.mem_univ v) + · intro hI + change I ∈ + (totallyPositiveFieldUnits K).map (toPrincipalIdeal (𝓞 K) K) at hI + obtain ⟨x, hx, rfl⟩ := hI + refine ⟨x, ?_, rfl⟩ + constructor + · intro v hv + simp [narrowRayClassModulus] at hv + · intro v _ + exact hx v + calc + rayPrincipalIdealSubgroup (narrowRayClassModulus K) = + Subgroup.closure (narrowPrincipalIdealSubgroup K : Set _) := by + rw [rayPrincipalIdealSubgroup, hSet] + _ = _ := Subgroup.closure_eq _ + +private noncomputable def narrowRayIdealsEquiv : + rayClassPrimeToIdeals (narrowRayClassModulus K) ≃* + NumberFieldFractionalIdealGroup K := + (MulEquiv.subgroupCongr narrow_rayClassPrimeToIdeals_eq_top).trans + Subgroup.topEquiv + +private theorem narrowRayIdealsEquiv_apply + (I : rayClassPrimeToIdeals (narrowRayClassModulus K)) : + narrowRayIdealsEquiv I = I.1 := rfl + +private theorem narrow_rayPrincipalIdealSubgroup_map : + (rayPrincipalIdealSubgroupInPrimeTo + (narrowRayClassModulus K)).map + (narrowRayIdealsEquiv (K := K) : _ →* _) = + narrowPrincipalIdealSubgroup K := by + ext I + constructor + · rintro ⟨J, hJ, rfl⟩ + change J.1 ∈ rayPrincipalIdealSubgroup (narrowRayClassModulus K) at hJ + rw [narrow_rayPrincipalIdealSubgroup_eq_positive (K := K)] at hJ + change narrowRayIdealsEquiv J ∈ narrowPrincipalIdealSubgroup K + rw [narrowRayIdealsEquiv_apply] + exact hJ + · intro hI + let J : rayClassPrimeToIdeals (narrowRayClassModulus K) := + ⟨I, by rw [narrow_rayClassPrimeToIdeals_eq_top]; trivial⟩ + refine ⟨J, ?_, ?_⟩ + · change I ∈ rayPrincipalIdealSubgroup (narrowRayClassModulus K) + rw [narrow_rayPrincipalIdealSubgroup_eq_positive (K := K)] + exact hI + · exact narrowRayIdealsEquiv_apply J + +/-- The narrow ray class group is canonically isomorphic to the independent +ideal-theoretic narrow class group. -/ +private noncomputable def narrowRayClassGroupEquivNarrowClassGroup : + RayClassGroup (narrowRayClassModulus K) ≃* NarrowClassGroup K := + QuotientGroup.congr + (rayPrincipalIdealSubgroupInPrimeTo (narrowRayClassModulus K)) + (narrowPrincipalIdealSubgroup K) + narrowRayIdealsEquiv + narrow_rayPrincipalIdealSubgroup_map + +/-- The comparison sends a finite-prime ray class to its narrow ideal class. -/ +private theorem narrowRayClassGroupEquivNarrowClassGroup_prime + (v : HeightOneSpectrum (𝓞 K)) : + narrowRayClassGroupEquivNarrowClassGroup + (narrowRayClassOfFinitePrime v) = + QuotientGroup.mk' (narrowPrincipalIdealSubgroup K) + (finitePrimeFractionalIdeal v) := by + simp only [narrowRayClassGroupEquivNarrowClassGroup, + narrowRayClassOfFinitePrime, rayClassOfFinitePrime] + rw [QuotientGroup.congr_mk'] + simp only [narrowRayIdealsEquiv_apply] + +/-- The public narrow class-group comparison, including its action on every +finite-prime class. -/ +theorem exists_narrowRayClassGroupEquivNarrowClassGroup + (K : Type u) [Field K] [NumberField K] : + ∃ e : RayClassGroup (narrowRayClassModulus K) ≃* NarrowClassGroup K, + ∀ v : HeightOneSpectrum (𝓞 K), + e (narrowRayClassOfFinitePrime v) = + QuotientGroup.mk' (narrowPrincipalIdealSubgroup K) + (finitePrimeFractionalIdeal v) := by + refine ⟨narrowRayClassGroupEquivNarrowClassGroup (K := K), ?_⟩ + intro v + exact narrowRayClassGroupEquivNarrowClassGroup_prime (K := K) v + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/OrdinaryNarrowModuliEqOfNoReal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/OrdinaryNarrowModuliEqOfNoReal.lean new file mode 100644 index 0000000000..f236922449 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/OrdinaryNarrowModuliEqOfNoReal.lean @@ -0,0 +1,34 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +/-! +# Ordinary and narrow moduli without real places +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- If the base number field has no real places, the ordinary and narrow +class-group moduli coincide. -/ +theorem ordinaryRayClassModulus_eq_narrow_of_noReal + (K : Type u) [Field K] [NumberField K] + [IsEmpty (RayClassRealPlace K)] : + ordinaryRayClassModulus K = narrowRayClassModulus K := by + classical + have h : (Finset.univ : Finset (RayClassRealPlace K)) = ∅ := by + ext v + exact isEmptyElim v + unfold ordinaryRayClassModulus narrowRayClassModulus + rw [h] + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/OrdinaryRayClassGroupEquivClassGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/OrdinaryRayClassGroupEquivClassGroup.lean new file mode 100644 index 0000000000..fe338dbd20 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/OrdinaryRayClassGroupEquivClassGroup.lean @@ -0,0 +1,45 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.OrdinaryClassGroupComparison +public import Mathlib.RingTheory.ClassGroup.Basic +/-! +# The ordinary ray class group is the ideal class group + +At the modulus with no finite or real conditions, the ideal-theoretic ray +class group agrees with Mathlib's ideal class group. The comparison also +preserves the class of each finite prime, fixing its arithmetic meaning. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +/-- The ordinary ray class group is isomorphic to the ideal class group, +and the isomorphism sends each finite-prime ray class to its ideal class. -/ +theorem exists_ordinaryRayClassGroupEquivClassGroup + (K : Type) [Field K] [NumberField K] : + ∃ e : RayClassGroup (ordinaryRayClassModulus K) ≃* ClassGroup (𝓞 K), + ∀ v : HeightOneSpectrum (𝓞 K), + e (ordinaryRayClassOfFinitePrime v) = + ClassGroup.mk K (finitePrimeFractionalIdeal v) := by + refine ⟨ordinaryRayClassGroupEquivClassGroup (K := K), ?_⟩ + intro v + exact ordinaryRayClassGroupEquivClassGroup_prime (K := K) v + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayArtinModulusProjection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayArtinModulusProjection.lean new file mode 100644 index 0000000000..a7d344a719 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayArtinModulusProjection.lean @@ -0,0 +1,190 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealModulusProjection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionPrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +/-! +# Naturality of ray Artin maps under reduction of the modulus + +An embedding between two realizations of ray class fields intertwines the +Artin action with the canonical projection of ray class groups. The +statement uses only Mathlib and public Definitions vocabulary; the idelic +implementation appears only in the proof. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +open scoped Classical in +private local instance rayClassGroupCommGroup + {K : Type} [Field K] [NumberField K] + (m : RayClassModulus K) : CommGroup (RayClassGroup m) := + { (inferInstance : Group (RayClassGroup m)) with mul_comm := mul_comm' } + +attribute [local instance] rayClassGroupCommGroup + +open scoped Classical in +private theorem rayArtin_prime_eq_arithmeticPrimeArtin + {K : Type} [Field K] [NumberField K] + {m : RayClassModulus K} (R : RayClassFieldRealization K m) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : + R.rayArtin (rayClassOfFinitePrime m v hv) = + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := R.extension) v := by + let w₀ := _root_.chosenFinitePlaceExtension (L := R.extension) v + let w := _root_.finitePlaceExtensionCentre (K := K) (L := R.extension) v w₀ + have hw : w.asIdeal.LiesOver v.asIdeal := + _root_.finitePlaceExtensionCentre_liesOver + (K := K) (L := R.extension) v w₀ + have hunram : Algebra.IsUnramifiedAt (𝓞 K) w.asIdeal := + (R.unramifiedOutsideModulus.1 v hv) w.asIdeal inferInstance hw + calc + R.rayArtin (rayClassOfFinitePrime m v hv) = + arithmeticFrobeniusAt (K := K) w := R.artin_frobenius v hv w hw + _ = GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := R.extension) v := + (GlobalClassFieldComparison.arithmeticPrimeArtin_eq_arithmeticFrobeniusAt + (K := K) (L := R.extension) v w hw hunram).symm + +open scoped Classical in +private theorem arithmeticPrimeArtin_restrict_tower + {K E L : Type} + [Field K] [NumberField K] + [Field E] [NumberField E] + [Field L] [NumberField L] + [Algebra K E] [Algebra E L] [Algebra K L] [IsScalarTower K E L] + [IsAbelianGalois K E] [IsAbelianGalois K L] + (v : HeightOneSpectrum (𝓞 K)) : + AlgEquiv.restrictNormalHom E + (GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v) = + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := E) v := by + open GlobalClassFieldTheory.GlobalClassFields in + rw [arithmeticFinitePlacePrimeArtin_eq_inv (K := K) (L := L) v, + arithmeticFinitePlacePrimeArtin_eq_inv (K := K) (L := E) v, map_inv] + simpa only [GlobalClassFieldTheory.GlobalClassFields.finitePlacePrimeArtin, + MonoidHom.comp_apply] using + congrArg Inv.inv + (DFunLike.congr_fun + (GlobalClassFieldTheory.Reciprocity.globalArtinMonoidHom_restrict_tower + (K := K) (L := L) (E := E)) + (IdeleGroup.finitePrimeIdele v)) + +open scoped Classical in +private theorem rayClassGroup_hom_ext_of_prime + {K : Type} [Field K] [NumberField K] + {G : Type} [CommGroup G] + (n : RayClassModulus K) + (f g : RayClassGroup n →* G) + (hprime : ∀ (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ n.finitePart.support), + f (rayClassOfFinitePrime n v hv) = + g (rayClassOfFinitePrime n v hv)) : + f = g := by + let n' := GlobalClassFieldComparison.rayClassModulusToOriginal K n + let e := GlobalClassFieldComparison.rayClassGroupEquivOriginal K n + let ι : RayClass.primeToModulusIdeals n' →* RayClassGroup n := + e.symm.toMonoidHom.comp + (QuotientGroup.mk' (RayClass.principalRayIdealSubgroup n')) + have hιprime (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ n.finitePart.support) : + ι (RayClass.primeToModulusIdeal n' v hv) = + rayClassOfFinitePrime n v hv := by + apply e.injective + calc + e (ι (RayClass.primeToModulusIdeal n' v hv)) = + QuotientGroup.mk' (RayClass.principalRayIdealSubgroup n') + (RayClass.primeToModulusIdeal n' v hv) := by + change e (e.symm + (QuotientGroup.mk' (RayClass.principalRayIdealSubgroup n') + (RayClass.primeToModulusIdeal n' v hv))) = _ + exact e.apply_symm_apply _ + _ = e (rayClassOfFinitePrime n v hv) := + (GlobalClassFieldComparison.rayClassGroupEquivOriginal_prime + K n v hv).symm + have hι : Function.Surjective ι := by + intro q + obtain ⟨I, hI⟩ := + QuotientGroup.mk'_surjective + (RayClass.principalRayIdealSubgroup n') (e q) + refine ⟨I, ?_⟩ + apply e.injective + change e (e.symm + (QuotientGroup.mk' (RayClass.principalRayIdealSubgroup n') I)) = e q + rw [e.apply_symm_apply] + exact hI + have hcomp : f.comp ι = g.comp ι := by + refine RayClass.primeToModulusIdeals_hom_ext + (G := G) n' (f.comp ι) (g.comp ι) ?_ + intro v hv + change f (ι (RayClass.primeToModulusIdeal n' v hv)) = + g (ι (RayClass.primeToModulusIdeal n' v hv)) + rw [hιprime v hv] + exact hprime v hv + apply MonoidHom.ext + intro q + obtain ⟨I, rfl⟩ := hι q + exact congrArg + (fun h : RayClass.primeToModulusIdeals n' →* G => h I) hcomp + +open scoped Classical in +/-- Artin reciprocity commutes with reduction of the modulus along any +embedding of the corresponding ray class field realizations. -/ +theorem rayArtin_modulusProjection + {K : Type} [Field K] [NumberField K] + {m n : RayClassModulus K} (hmn : m ≤ n) + (Rm : RayClassFieldRealization K m) + (Rn : RayClassFieldRealization K n) + (f : Rm.extension →ₐ[K] Rn.extension) + (x : RayClassGroup n) (y : Rm.extension) : + Rn.rayArtin x (f y) = + f (Rm.rayArtin (rayClassIdealModulusProjection K hmn x) y) := by + let : Algebra Rm.extension Rn.extension := f.toRingHom.toAlgebra + let : IsScalarTower K Rm.extension Rn.extension := + IsScalarTower.of_algebraMap_eq fun z => (f.commutes z).symm + let : CommGroup (Rm.extension ≃ₐ[K] Rm.extension) := + { (inferInstance : Group (Rm.extension ≃ₐ[K] Rm.extension)) with + mul_comm := mul_comm' } + have hnat : + (AlgEquiv.restrictNormalHom Rm.extension).comp Rn.rayArtin = + Rm.rayArtin.comp (rayClassIdealModulusProjection K hmn) := by + apply rayClassGroup_hom_ext_of_prime n + intro v hvn + have hvm : v ∉ m.finitePart.support := by + intro hv + exact hvn (Finsupp.support_mono hmn.1 hv) + change AlgEquiv.restrictNormalHom Rm.extension + (Rn.rayArtin (rayClassOfFinitePrime n v hvn)) = + Rm.rayArtin + (rayClassIdealModulusProjection K hmn + (rayClassOfFinitePrime n v hvn)) + rw [rayClassIdealModulusProjection_prime K hmn v hvn, + rayArtin_prime_eq_arithmeticPrimeArtin Rn v hvn, + rayArtin_prime_eq_arithmeticPrimeArtin Rm v hvm] + exact arithmeticPrimeArtin_restrict_tower v + have hx := DFunLike.congr_fun hnat x + change AlgEquiv.restrictNormalHom Rm.extension (Rn.rayArtin x) = + Rm.rayArtin (rayClassIdealModulusProjection K hmn x) at hx + have hy := congrArg (fun σ : Rm.extension ≃ₐ[K] Rm.extension => f (σ y)) hx + exact (AlgEquiv.restrictNormal_commutes (Rn.rayArtin x) Rm.extension y).symm.trans hy + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldDegree.lean new file mode 100644 index 0000000000..aa0d1cb5ff --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldDegree.lean @@ -0,0 +1,44 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +/-! +# Degree of a ray class field + +For any ray class field realization of `m`, its degree is the cardinality of +the ideal-theoretic ray class group. The realization is explicit, so this +module does not depend on an implementation-level choice of field. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +open scoped Classical in +/-- The ray class field has degree equal to the ray class number. -/ +theorem rayClassField_degree + (K : Type u) [Field K] [NumberField K] + (m : RayClassModulus K) + (R : RayClassFieldRealization K m) : + Module.finrank K R.extension = Nat.card (RayClassGroup m) := by + calc + Module.finrank K R.extension = + Nat.card (R.extension ≃ₐ[K] R.extension) := + (IsGalois.card_aut_eq_finrank K R.extension).symm + _ = Nat.card (RayClassGroup m) := + Nat.card_congr R.artinEquiv.symm.toEquiv + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldModulusMonotone.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldModulusMonotone.lean new file mode 100644 index 0000000000..461ae4efa4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldModulusMonotone.lean @@ -0,0 +1,46 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsRayArtinModulusProjection +/-! +# Ray class fields increase with the modulus + +The modulus projection produces an embedding of realizations. Normality +upgrades that embedding to literal inclusion in the fixed separable closure. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +/-- For `m ≤ n`, every realization of the ray class field of `m` is a +subfield of every realization of the ray class field of `n` in the fixed +separable closure. -/ +theorem rayClassFieldRealization_mono_modulus + {K : Type} [Field K] [NumberField K] + {m n : RayClassModulus K} (hmn : m ≤ n) + (Rm : RayClassFieldRealization K m) + (Rn : RayClassFieldRealization K n) : + Rm.extension.1 ≤ Rn.extension.1 := by + obtain ⟨f, _⟩ := exists_rayArtin_modulusProjection hmn Rm Rn + let σ : Rm.extension →ₐ[K] SeparableClosure K := + (IntermediateField.val Rn.extension.1).comp f + have hσ : σ.fieldRange = Rm.extension.1 := + AlgHom.fieldRange_of_normal σ + rw [← hσ] + intro x hx + obtain ⟨y, rfl⟩ := AlgHom.mem_fieldRange.mp hx + exact (f y).property + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldPrimeSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldPrimeSplitting.lean new file mode 100644 index 0000000000..95cbefcfb7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldPrimeSplitting.lean @@ -0,0 +1,68 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusEqOneIffSplitsCompletely +/-! +# Prime splitting in a ray class field + +For a prime away from the modulus, the Frobenius-normalized Artin +isomorphism identifies complete splitting with triviality of the +corresponding ray class. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +open NumberField IsDedekindDomain + +universe u + +open scoped Classical in +/-- A prime away from the modulus splits completely in its ray class field +exactly when its ray class is trivial. -/ +theorem finitePrime_splitsCompletelyInRayClassField_iff + (K : Type u) [Field K] [NumberField K] + (m : RayClassModulus K) + (R : RayClassFieldRealization K m) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : + FinitePrimeSplitsCompletely K R.extension v ↔ + rayClassOfFinitePrime m v hv = 1 := by + have hunram : Algebra.IsUnramifiedIn (𝓞 R.extension) v.asIdeal := + R.unramifiedOutsideModulus.1 v hv + obtain ⟨Q, hQmax, hQover⟩ := + Ideal.exists_maximal_ideal_liesOver_of_isIntegral + (S := 𝓞 R.extension) v.asIdeal + let : Q.LiesOver v.asIdeal := hQover + let w : HeightOneSpectrum (𝓞 R.extension) := + ⟨Q, hQmax.isPrime, + Ideal.ne_bot_of_liesOver_of_ne_bot v.ne_bot Q⟩ + have hw : w.asIdeal.LiesOver v.asIdeal := hQover + constructor + · intro hsplit + have hfrob : arithmeticFrobeniusAt (K := K) w = 1 := + (arithmeticFrobeniusAt_eq_one_iff_splitsCompletely + v w hw hunram).2 hsplit + apply R.artinEquiv.injective + rw [map_one, R.artin_frobenius v hv w hw] + exact hfrob + · intro hclass + apply (arithmeticFrobeniusAt_eq_one_iff_splitsCompletely + v w hw hunram).1 + rw [← R.artin_frobenius v hv w hw, hclass, map_one] + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldReciprocity.lean new file mode 100644 index 0000000000..618da2a48d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldReciprocity.lean @@ -0,0 +1,47 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupExistence +/-! +# Ray class reciprocity + +For a modulus `m`, there exists a finite abelian extension whose Galois group +is the ideal-theoretic ray class group modulo `m`, compatibly with finite +global reciprocity. No global choice of ray class field is exposed. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +open scoped Classical in +/-- A ray class field realization exists for every modulus. -/ +theorem rayClassField_reciprocity + (K : Type) [Field K] [NumberField K] + (m : RayClassModulus K) : + Nonempty (RayClassFieldRealization K m) := by + obtain ⟨R⟩ := rayClassSubgroup_existence K m ⊥ + have hinj : Function.Injective R.artin := + (MonoidHom.ker_eq_bot_iff R.artin).mp R.artin_ker + let e : RayClassGroup m ≃* (R.extension ≃ₐ[K] R.extension) := + MulEquiv.ofBijective R.artin ⟨hinj, R.artin_surjective⟩ + refine ⟨{ + extension := R.extension + unramifiedOutsideModulus := R.unramifiedOutsideModulus + artinEquiv := e + artin_frobenius := ?_ }⟩ + intro v hv w hlie + exact R.artin_frobenius v hv w hlie + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassGroupFinite.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassGroupFinite.lean new file mode 100644 index 0000000000..a1748ca6ad --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassGroupFinite.lean @@ -0,0 +1,36 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +/-! +# Finiteness of the ideal-theoretic ray class group + +The comparison with the idèlic ray class group identifies this group with a +quotient by a finite-index congruence subgroup, so it is finite for every +modulus. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- Every ray class group of a number field is finite. -/ +theorem rayClassGroup_finite + (K : Type u) [Field K] [NumberField K] + (m : RayClassModulus K) : + Finite (RayClassGroup m) := by + let m' := GlobalClassFieldComparison.rayClassModulusToOriginal K m + let : Finite (RayClass.RayClassGroup m') := inferInstance + exact Finite.of_equiv (RayClass.RayClassGroup m') + (GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m).symm.toEquiv + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassGroupHomExtFinitePrime.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassGroupHomExtFinitePrime.lean new file mode 100644 index 0000000000..787c5108af --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassGroupHomExtFinitePrime.lean @@ -0,0 +1,64 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayPrimeGeneration +/-! +# Prime classes determine maps out of a ray class group + +Finite primes away from the modulus generate enough of the ideal-theoretic +ray class group to determine any homomorphism into a commutative group. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- Two homomorphisms from a ray class group agree if they have the same +value on every prime class away from the modulus. -/ +theorem rayClassGroup_hom_ext_finitePrime + (K : Type u) [Field K] [NumberField K] + (m : RayClassModulus K) + {G : Type v} [CommGroup G] + (f g : RayClassGroup m →* G) + (hprime : ∀ (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support), + f (rayClassOfFinitePrime m v hv) = + g (rayClassOfFinitePrime m v hv)) : + f = g := by + let m' := GlobalClassFieldComparison.rayClassModulusToOriginal K m + let e := GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m + have hcomp : f.comp e.symm.toMonoidHom = g.comp e.symm.toMonoidHom := by + apply GlobalClassFieldTheory.GlobalClassFields.rayClassGroup_hom_ext_finitePrime m' + intro v hv + have hv' : v ∉ m.finitePart.support := hv + change f (e.symm (QuotientGroup.mk' m'.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v)))) = + g (e.symm (QuotientGroup.mk' m'.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v)))) + rw [← GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele_prime + K m v hv'] + simpa only [e, MulEquiv.symm_apply_apply] using hprime v hv' + apply MonoidHom.ext + intro x + have hx := DFunLike.congr_fun hcomp (e x) + change f (e.symm (e x)) = g (e.symm (e x)) at hx + simpa only [MulEquiv.symm_apply_apply] using hx + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealArtinKerEqNormRangeSupPrincipal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealArtinKerEqNormRangeSupPrincipal.lean new file mode 100644 index 0000000000..98a1d7458a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealArtinKerEqNormRangeSupPrincipal.lean @@ -0,0 +1,58 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageEqArtinKer +/-! +# Ideal Artin kernel before passage to ray classes + +The kernel in prime-to-modulus ideals is the product of the genuine ideal +norm image and the principal ray-ideal subgroup. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +open scoped Classical in +/-- Before passing to ray classes, the Artin kernel is the product of the +genuine ideal-norm subgroup and the principal ray-ideal subgroup. -/ +theorem rayClassIdealArtinKer_eq_normRange_sup_principal + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + (D : FiniteAbelianReciprocityData K L) : + (D.artin.comp + (QuotientGroup.mk' (rayPrincipalIdealSubgroupInPrimeTo D.modulus))).ker = + (rayClassPrimeToIdealNorm K L D.modulus).range ⊔ + rayPrincipalIdealSubgroupInPrimeTo D.modulus := by + let q : rayClassPrimeToIdeals D.modulus →* RayClassGroup D.modulus := + QuotientGroup.mk' (rayPrincipalIdealSubgroupInPrimeTo D.modulus) + let N := (rayClassPrimeToIdealNorm K L D.modulus).range + change (D.artin.comp q).ker = N ⊔ + rayPrincipalIdealSubgroupInPrimeTo D.modulus + calc + (D.artin.comp q).ker = D.artin.ker.comap q := by + exact (MonoidHom.comap_ker D.artin q).symm + _ = (rayClassIdealNormImage K L D.modulus).comap q := by + rw [rayClassIdealNormImage_eq_artinKer K L D] + _ = (N.map q).comap q := by + rw [← MonoidHom.range_comp] + rfl + _ = N ⊔ rayPrincipalIdealSubgroupInPrimeTo D.modulus := by + rw [Subgroup.comap_map_eq, QuotientGroup.ker_mk'] + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionPrime.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionPrime.lean new file mode 100644 index 0000000000..5a9c397644 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionPrime.lean @@ -0,0 +1,46 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealModulusProjection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +public import Mathlib.Data.Finsupp.Order +/-! +# Prime classes and reduction of a ray modulus + +An ideal prime to the larger modulus represents the same prime ideal after +projection to the ray class group of the smaller modulus. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- Modulus reduction preserves the class of every prime outside the larger +modulus. -/ +theorem rayClassIdealModulusProjection_prime + (K : Type u) [Field K] [NumberField K] + {m n : RayClassModulus K} (hmn : m ≤ n) + (v : HeightOneSpectrum (𝓞 K)) + (hvn : v ∉ n.finitePart.support) : + rayClassIdealModulusProjection K hmn + (rayClassOfFinitePrime n v hvn) = + rayClassOfFinitePrime m v + (by + intro hvm + exact hvn (Finsupp.support_mono hmn.1 hvm)) := by + rfl + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionSurjective.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionSurjective.lean new file mode 100644 index 0000000000..b5b31c556f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionSurjective.lean @@ -0,0 +1,154 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealModulusProjection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionPrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +/-! +# Surjectivity of the ideal-theoretic modulus projection + +The direct ideal-quotient projection agrees with the natural idelic quotient +projection because both preserve every prime class outside the larger modulus. +The latter projection is directly surjective since both ray class groups are +quotients of the same idèle class group. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +open scoped Classical in +private local instance rayClassGroupCommGroup + (K : Type u) [Field K] [NumberField K] + (m : RayClassModulus K) : CommGroup (RayClassGroup m) := + { (inferInstance : Group (RayClassGroup m)) with mul_comm := mul_comm' } + +attribute [local instance] rayClassGroupCommGroup + +open scoped Classical in +private theorem rayClassGroup_hom_ext_of_prime + (K : Type u) [Field K] [NumberField K] + (n m : RayClassModulus K) + (f g : RayClassGroup n →* RayClassGroup m) + (hprime : ∀ (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ n.finitePart.support), + f (rayClassOfFinitePrime n v hv) = + g (rayClassOfFinitePrime n v hv)) : + f = g := by + let n' := GlobalClassFieldComparison.rayClassModulusToOriginal K n + let e := GlobalClassFieldComparison.rayClassGroupEquivOriginal K n + let ι : RayClass.primeToModulusIdeals n' →* RayClassGroup n := + e.symm.toMonoidHom.comp + (QuotientGroup.mk' (RayClass.principalRayIdealSubgroup n')) + have hιprime (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ n.finitePart.support) : + ι (RayClass.primeToModulusIdeal n' v hv) = + rayClassOfFinitePrime n v hv := by + apply e.injective + calc + e (ι (RayClass.primeToModulusIdeal n' v hv)) = + QuotientGroup.mk' (RayClass.principalRayIdealSubgroup n') + (RayClass.primeToModulusIdeal n' v hv) := by + change e (e.symm + (QuotientGroup.mk' (RayClass.principalRayIdealSubgroup n') + (RayClass.primeToModulusIdeal n' v hv))) = _ + exact e.apply_symm_apply _ + _ = e (rayClassOfFinitePrime n v hv) := + (GlobalClassFieldComparison.rayClassGroupEquivOriginal_prime + K n v hv).symm + have hι : Function.Surjective ι := by + intro q + obtain ⟨I, hI⟩ := + QuotientGroup.mk'_surjective + (RayClass.principalRayIdealSubgroup n') (e q) + refine ⟨I, ?_⟩ + apply e.injective + change e (e.symm + (QuotientGroup.mk' (RayClass.principalRayIdealSubgroup n') I)) = e q + rw [e.apply_symm_apply] + exact hI + have hcomp : f.comp ι = g.comp ι := by + refine RayClass.primeToModulusIdeals_hom_ext + (G := RayClassGroup m) n' (f.comp ι) (g.comp ι) ?_ + intro v hv + change f (ι (RayClass.primeToModulusIdeal n' v hv)) = + g (ι (RayClass.primeToModulusIdeal n' v hv)) + rw [hιprime v hv] + exact hprime v hv + apply MonoidHom.ext + intro q + obtain ⟨I, rfl⟩ := hι q + exact congrArg + (fun h : RayClass.primeToModulusIdeals n' →* RayClassGroup m => h I) hcomp + +open scoped Classical in +/-- Reducing a ray modulus gives a surjection of ideal-theoretic ray class +groups. -/ +theorem rayClassIdealModulusProjection_surjective + (K : Type u) [Field K] [NumberField K] + {m n : RayClassModulus K} (hmn : m ≤ n) : + Function.Surjective (rayClassIdealModulusProjection K hmn) := by + let m' := GlobalClassFieldComparison.rayClassModulusToOriginal K m + let n' := GlobalClassFieldComparison.rayClassModulusToOriginal K n + have hmn' : m' ≤ n' := hmn + let : IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + let : (RayClass.Modulus.congruenceSubgroup m').Normal := + Subgroup.normal_of_isMulCommutative _ + let : (RayClass.Modulus.congruenceSubgroup n').Normal := + Subgroup.normal_of_isMulCommutative _ + let projection : RayClass.RayClassGroup n' →* RayClass.RayClassGroup m' := + QuotientGroup.map + (RayClass.Modulus.congruenceSubgroup n') + (RayClass.Modulus.congruenceSubgroup m') + (MonoidHom.id (IdeleClassGroup K)) + (RayClass.Modulus.congruenceSubgroup_antitone hmn') + have hprojection : Function.Surjective projection := by + intro q + obtain ⟨c, rfl⟩ := + QuotientGroup.mk'_surjective + (RayClass.Modulus.congruenceSubgroup m') q + exact + ⟨QuotientGroup.mk' (RayClass.Modulus.congruenceSubgroup n') c, rfl⟩ + let eM := GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m + let eN := GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K n + let transported : RayClassGroup n →* RayClassGroup m := + eM.symm.toMonoidHom.comp (projection.comp eN.toMonoidHom) + have htransported : Function.Surjective transported := by + intro y + obtain ⟨z, hz⟩ := eM.symm.surjective y + obtain ⟨w, hw⟩ := hprojection z + obtain ⟨x, hx⟩ := eN.surjective w + refine ⟨x, ?_⟩ + change eM.symm (projection (eN x)) = y + rw [hx, hw, hz] + have hmap : rayClassIdealModulusProjection K hmn = transported := by + apply rayClassGroup_hom_ext_of_prime K n m + intro v hvn + rw [rayClassIdealModulusProjection_prime K hmn v hvn] + apply eM.injective + change + eM (rayClassOfFinitePrime m v _) = + eM (eM.symm (projection (eN (rayClassOfFinitePrime n v hvn)))) + rw [eM.apply_symm_apply, + GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele_prime K m v, + GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele_prime K n v hvn] + rfl + rw [hmap] + exact htransported + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageEqArtinKer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageEqArtinKer.lean new file mode 100644 index 0000000000..ff36df5eae --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageEqArtinKer.lean @@ -0,0 +1,65 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealArtinKernelComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormQuotientComparison +/-! +# The ideal norm subgroup is the Artin kernel + +This is the ideal-theoretic norm-kernel form of finite abelian reciprocity. +The ideal norms are norms of fractional ideals prime to the modulus; the +principal ray ideals are absorbed by the ray quotient. +-/ + +@[expose] public section + +open scoped NumberField IsMulCommutative +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +open scoped Classical in +open GlobalClassFieldTheory.IdealClassFieldTheory renaming + idealArtinKernel_eq_idealNormSubgroup_of_finiteExtension → + idealArtinKernel_eq_idealNormSubgroup_of_finiteExtension in +/-- For finite abelian reciprocity data, the image of genuine ideal norms +in the ideal ray class group equals the normalized Artin kernel. -/ +theorem rayClassIdealNormImage_eq_artinKer + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + (D : FiniteAbelianReciprocityData K L) : + rayClassIdealNormImage K L D.modulus = D.artin.ker := by + let m := GlobalClassFieldComparison.rayClassModulusToOriginal K D.modulus + have hsource := + idealArtinKernel_eq_idealNormSubgroup_of_finiteExtension + (K := K) (L := L) m + (GlobalClassFieldComparison.finiteAbelianReciprocity_modulus_isDefining K L D) + have hquot := + GlobalClassFieldComparison.publicIdealNormImage_comap_rayQuotient + K L D.modulus + apply Subgroup.ext + intro x + obtain ⟨I, rfl⟩ := QuotientGroup.mk'_surjective + (rayPrincipalIdealSubgroupInPrimeTo D.modulus) x + have hnorm : + (QuotientGroup.mk' (rayPrincipalIdealSubgroupInPrimeTo D.modulus) I) ∈ + rayClassIdealNormImage K L D.modulus ↔ + I ∈ RayClass.idealNormSubgroup (K := K) (L := L) m := by + exact Subgroup.ext_iff.mp hquot I + rw [hnorm, ← hsource] + exact (GlobalClassFieldComparison.publicArtinKer_iff_idealArtinKernel + K L D I).symm + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageLeArtinKer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageLeArtinKer.lean new file mode 100644 index 0000000000..4f1b636dfa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageLeArtinKer.lean @@ -0,0 +1,40 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormArtinKernel +/-! +# Ideal norms are killed by the ray-class Artin map + +This is the forward direction of the ideal-theoretic norm-kernel formula. +The subgroup is formed from actual fractional-ideal norms, not from idèle +norms. Equality requires the separate reverse approximation theorem. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +/-- For finite abelian reciprocity data, the image of genuine ideal norms +in the ray class group lies in the normalized Artin kernel. -/ +theorem rayClassIdealNormImage_le_artinKer + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + (D : FiniteAbelianReciprocityData K L) : + rayClassIdealNormImage K L D.modulus ≤ D.artin.ker := + GlobalClassFieldComparison.idealNormImage_le_finiteAbelianReciprocityArtinKer K L D + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupDegree.lean new file mode 100644 index 0000000000..d0bca444fd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupDegree.lean @@ -0,0 +1,42 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquiv +/-! +# Degree of the class field of a ray-class subgroup + +The degree of a finite abelian class field is the index of its defining +subgroup in the ray class group. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- A ray-class subgroup realization has degree equal to the subgroup index. -/ +theorem rayClassSubgroup_degree + (K : Type u) [Field K] [NumberField K] + (m : RayClassModulus K) (H : Subgroup (RayClassGroup m)) + (R : RayClassSubgroupRealization K m H) : + Module.finrank K R.extension = H.index := by + calc + Module.finrank K R.extension = + Nat.card (R.extension ≃ₐ[K] R.extension) := + (IsGalois.card_aut_eq_finrank K R.extension).symm + _ = Nat.card (RayClassGroup m ⧸ H) := + Nat.card_congr (rayClassSubgroupQuotientEquiv K m H R).symm.toEquiv + _ = H.index := H.index_eq_card.symm + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupEmbedding.lean new file mode 100644 index 0000000000..8afac398b5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupEmbedding.lean @@ -0,0 +1,167 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupHomExtFinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin +/-! +# Antitone class fields of ray-class subgroups + +For a fixed modulus, inclusion of ray-class subgroups reverses inclusion of +their finite abelian class fields. The embedding between arbitrary +Frobenius-normalized realizations intertwines both Artin actions. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +open scoped Classical in +private theorem subgroupArtin_prime_eq_arithmeticPrimeArtin + {K : Type} [Field K] [NumberField K] + {m : RayClassModulus K} {H : Subgroup (RayClassGroup m)} + (R : RayClassSubgroupRealization K m H) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : + R.artin (rayClassOfFinitePrime m v hv) = + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := R.extension) v := by + let w₀ := _root_.chosenFinitePlaceExtension (L := R.extension) v + let w := _root_.finitePlaceExtensionCentre (K := K) (L := R.extension) v w₀ + have hw : w.asIdeal.LiesOver v.asIdeal := + _root_.finitePlaceExtensionCentre_liesOver + (K := K) (L := R.extension) v w₀ + have hunram : Algebra.IsUnramifiedAt (𝓞 K) w.asIdeal := + (R.unramifiedOutsideModulus.1 v hv) w.asIdeal inferInstance hw + calc + R.artin (rayClassOfFinitePrime m v hv) = + arithmeticFrobeniusAt (K := K) w := R.artin_frobenius v hv w hw + _ = GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := R.extension) v := + (GlobalClassFieldComparison.arithmeticPrimeArtin_eq_arithmeticFrobeniusAt + (K := K) (L := R.extension) v w hw hunram).symm + +open scoped Classical in +private theorem subgroupRealization_mem_norm_range_iff + {K : Type} [Field K] [NumberField K] + {m : RayClassModulus K} {H : Subgroup (RayClassGroup m)} + (R : RayClassSubgroupRealization K m H) + (x : IdeleClassGroup K) : + x ∈ (_root_.ideleClassNorm K R.extension).range ↔ + (GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m).symm + (QuotientGroup.mk' + (GlobalClassFieldComparison.rayClassModulusToOriginal K m).congruenceSubgroup + x) ∈ H := by + let m' := GlobalClassFieldComparison.rayClassModulusToOriginal K m + let e := GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m + let a : RayClass.RayClassGroup m' →* (R.extension ≃ₐ[K] R.extension) := + R.artin.comp e.symm.toMonoidHom + have hprime : ∀ (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m'.finitePart.support), + a (QuotientGroup.mk' m'.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v))) = + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := R.extension) v := by + intro v hv + have hvm : v ∉ m.finitePart.support := hv + change R.artin (e.symm (QuotientGroup.mk' m'.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele v)))) = _ + rw [← GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele_prime + K m v hvm] + simpa only [e, MulEquiv.symm_apply_apply] using + subgroupArtin_prime_eq_arithmeticPrimeArtin R v hvm + have hnorm := + GlobalClassFieldTheory.GlobalClassFields.rayModulus_normSubgroup_eq_artinKer_preimage + m' a hprime + rw [hnorm] + change a (QuotientGroup.mk' m'.congruenceSubgroup x) = 1 ↔ _ + change R.artin (e.symm (QuotientGroup.mk' m'.congruenceSubgroup x)) = 1 ↔ _ + rw [← MonoidHom.mem_ker, R.artin_ker] + +open scoped Classical in +private theorem arithmeticPrimeArtin_restrict_tower + {K E L : Type} + [Field K] [NumberField K] + [Field E] [NumberField E] + [Field L] [NumberField L] + [Algebra K E] [Algebra E L] [Algebra K L] [IsScalarTower K E L] + [IsAbelianGalois K E] [IsAbelianGalois K L] + (v : HeightOneSpectrum (𝓞 K)) : + AlgEquiv.restrictNormalHom E + (GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v) = + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := E) v := by + open GlobalClassFieldTheory.GlobalClassFields in + rw [arithmeticFinitePlacePrimeArtin_eq_inv (K := K) (L := L) v, + arithmeticFinitePlacePrimeArtin_eq_inv (K := K) (L := E) v, map_inv] + simpa only [GlobalClassFieldTheory.GlobalClassFields.finitePlacePrimeArtin, + MonoidHom.comp_apply] using + congrArg Inv.inv + (DFunLike.congr_fun + (GlobalClassFieldTheory.Reciprocity.globalArtinMonoidHom_restrict_tower + (K := K) (L := L) (E := E)) + (IdeleGroup.finitePrimeIdele v)) + +open scoped Classical in +/-- If `H ≤ J`, every Frobenius-normalized realization of the class field +of `J` embeds into every such realization for `H`; the embedding commutes +with their Artin actions. -/ +theorem exists_rayClassSubgroupEmbedding_artinNaturality + (K : Type) [Field K] [NumberField K] + (m : RayClassModulus K) + {H J : Subgroup (RayClassGroup m)} (hHJ : H ≤ J) + (RH : RayClassSubgroupRealization K m H) + (RJ : RayClassSubgroupRealization K m J) : + ∃ f : RJ.extension →ₐ[K] RH.extension, + ∀ (x : RayClassGroup m) (y : RJ.extension), + RH.artin x (f y) = f (RJ.artin x y) := by + have hnorm : (_root_.ideleClassNorm K RH.extension).range ≤ + (_root_.ideleClassNorm K RJ.extension).range := by + intro c hc + apply (subgroupRealization_mem_norm_range_iff RJ c).2 + exact hHJ ((subgroupRealization_mem_norm_range_iff RH c).1 hc) + obtain ⟨f⟩ := + GlobalClassFieldTheory.GlobalClassFields.finiteAbelianExtension_nonempty_algHom_of_normRange_le + (K := K) RJ.extension RH.extension hnorm + let : Algebra RJ.extension RH.extension := f.toRingHom.toAlgebra + let : IsScalarTower K RJ.extension RH.extension := + IsScalarTower.of_algebraMap_eq fun z => (f.commutes z).symm + let : CommGroup (RJ.extension ≃ₐ[K] RJ.extension) := + { (inferInstance : Group (RJ.extension ≃ₐ[K] RJ.extension)) with + mul_comm := mul_comm' } + have hnat : + (AlgEquiv.restrictNormalHom RJ.extension).comp RH.artin = RJ.artin := by + apply rayClassGroup_hom_ext_finitePrime K m + intro v hv + change AlgEquiv.restrictNormalHom RJ.extension + (RH.artin (rayClassOfFinitePrime m v hv)) = + RJ.artin (rayClassOfFinitePrime m v hv) + rw [subgroupArtin_prime_eq_arithmeticPrimeArtin RH v hv, + subgroupArtin_prime_eq_arithmeticPrimeArtin RJ v hv] + exact arithmeticPrimeArtin_restrict_tower v + refine ⟨f, ?_⟩ + intro x y + have hx := DFunLike.congr_fun hnat x + change AlgEquiv.restrictNormalHom RJ.extension (RH.artin x) = RJ.artin x at hx + have hy := congrArg (fun σ : RJ.extension ≃ₐ[K] RJ.extension => f (σ y)) hx + exact (AlgEquiv.restrictNormal_commutes (RH.artin x) RJ.extension y).symm.trans hy + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupExistence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupExistence.lean new file mode 100644 index 0000000000..a93b1d4e01 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupExistence.lean @@ -0,0 +1,38 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +/-! +# Existence of the class field of a ray-class subgroup + +Every subgroup of an ideal-theoretic ray class group is the kernel of the +Frobenius-normalized Artin map of a finite abelian extension. The statement +uses ideal classes; the proof transports the existing idelic reciprocity +construction to that interface. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +open scoped Classical in +/-- Every ray-class subgroup has a finite abelian class-field realization. -/ +theorem rayClassSubgroup_existence + (K : Type) [Field K] [NumberField K] + (m : RayClassModulus K) (H : Subgroup (RayClassGroup m)) : + Nonempty (RayClassSubgroupRealization K m H) := by + exact GlobalClassFieldComparison.rayClassSubgroup_existence K m H + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupFieldAntitone.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupFieldAntitone.lean new file mode 100644 index 0000000000..064923fdc3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupFieldAntitone.lean @@ -0,0 +1,48 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupEmbedding +/-! +# Inclusion of ray-class subgroup class fields + +The fields are intermediate fields of one fixed separable closure, so the +conclusion is literal inclusion rather than merely an abstract embedding. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +/-- For one modulus, a larger ray-class subgroup gives a smaller class +field inside the fixed separable closure. This holds for any choices of +Frobenius-normalized realizations. -/ +theorem rayClassSubgroupField_antitone + (K : Type) [Field K] [NumberField K] + (m : RayClassModulus K) + {H J : Subgroup (RayClassGroup m)} (hHJ : H ≤ J) + (RH : RayClassSubgroupRealization K m H) + (RJ : RayClassSubgroupRealization K m J) : + RJ.extension.1 ≤ RH.extension.1 := by + obtain ⟨f, _⟩ := + exists_rayClassSubgroupEmbedding_artinNaturality K m hHJ RH RJ + let σ : RJ.extension →ₐ[K] SeparableClosure K := + (IntermediateField.val RH.extension.1).comp f + have hσ : σ.fieldRange = RJ.extension.1 := + AlgHom.fieldRange_of_normal σ + rw [← hσ] + intro x hx + obtain ⟨y, rfl⟩ := AlgHom.mem_fieldRange.mp hx + exact (f y).property + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeInertiaDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeInertiaDegree.lean new file mode 100644 index 0000000000..c4adb5307f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeInertiaDegree.lean @@ -0,0 +1,60 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquivMk +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusOrder +/-! +# Residue degrees in a ray-class subgroup class field + +Away from the modulus, the residue degree is the order of the prime ray +class modulo the subgroup defining the extension. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +open NumberField IsDedekindDomain + +universe u + +/-- The residue degree above a prime away from the modulus is the order of +its ray class in the quotient by the defining subgroup. -/ +theorem finitePrime_inertiaDegreeInRayClassSubgroupField_eq_orderOf + (K : Type u) [Field K] [NumberField K] + (m : RayClassModulus K) (H : Subgroup (RayClassGroup m)) + (R : RayClassSubgroupRealization K m H) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) + (w : HeightOneSpectrum (𝓞 R.extension)) + (hw : w.asIdeal.LiesOver v.asIdeal) : + w.asIdeal.inertiaDeg (𝓞 K) = + orderOf (QuotientGroup.mk' H (rayClassOfFinitePrime m v hv)) := by + have hunram : Algebra.IsUnramifiedAt (𝓞 K) w.asIdeal := + (R.unramifiedOutsideModulus.1 v hv) w.asIdeal inferInstance hw + have horder := + orderOf_arithmeticFrobeniusAt_eq_inertiaDegree v w hw hunram + calc + w.asIdeal.inertiaDeg (𝓞 K) = + orderOf (arithmeticFrobeniusAt (K := K) w) := horder.symm + _ = orderOf (R.artin (rayClassOfFinitePrime m v hv)) := by + rw [R.artin_frobenius v hv w hw] + _ = orderOf + (rayClassSubgroupQuotientEquiv K m H R + (QuotientGroup.mk' H (rayClassOfFinitePrime m v hv))) := by + rw [rayClassSubgroupQuotientEquiv_mk] + _ = orderOf (QuotientGroup.mk' H (rayClassOfFinitePrime m v hv)) := + (rayClassSubgroupQuotientEquiv K m H R).orderOf_eq _ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeSplitting.lean new file mode 100644 index 0000000000..253c1de520 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeSplitting.lean @@ -0,0 +1,62 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusEqOneIffSplitsCompletely +/-! +# Prime splitting in a ray-class subgroup class field + +At a prime away from the modulus, complete splitting is equivalent to +membership of the prime's ray class in the defining subgroup. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +open NumberField IsDedekindDomain + +universe u + +open scoped Classical in +/-- A prime away from the modulus splits completely in the class field of +`H` exactly when its ray class belongs to `H`. -/ +theorem finitePrime_splitsCompletelyInRayClassSubgroupField_iff + (K : Type u) [Field K] [NumberField K] + (m : RayClassModulus K) (H : Subgroup (RayClassGroup m)) + (R : RayClassSubgroupRealization K m H) + (v : HeightOneSpectrum (𝓞 K)) + (hv : v ∉ m.finitePart.support) : + FinitePrimeSplitsCompletely K R.extension v ↔ + rayClassOfFinitePrime m v hv ∈ H := by + have hunram : Algebra.IsUnramifiedIn (𝓞 R.extension) v.asIdeal := + R.unramifiedOutsideModulus.1 v hv + obtain ⟨Q, hQmax, hQover⟩ := + Ideal.exists_maximal_ideal_liesOver_of_isIntegral + (S := 𝓞 R.extension) v.asIdeal + let : Q.LiesOver v.asIdeal := hQover + let w : HeightOneSpectrum (𝓞 R.extension) := + ⟨Q, hQmax.isPrime, + Ideal.ne_bot_of_liesOver_of_ne_bot v.ne_bot Q⟩ + have hw : w.asIdeal.LiesOver v.asIdeal := hQover + have hmem : rayClassOfFinitePrime m v hv ∈ H ↔ + R.artin (rayClassOfFinitePrime m v hv) = 1 := by + simpa only [R.artin_ker] using + (MonoidHom.mem_ker : rayClassOfFinitePrime m v hv ∈ R.artin.ker ↔ + R.artin (rayClassOfFinitePrime m v hv) = 1) + rw [hmem, R.artin_frobenius v hv w hw] + exact (arithmeticFrobeniusAt_eq_one_iff_splitsCompletely + v w hw hunram).symm + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotient.lean new file mode 100644 index 0000000000..d8dbe287a2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotient.lean @@ -0,0 +1,37 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquiv +/-! +# Quotient form of ray-class subgroup reciprocity + +The quotient of a ray class group by the subgroup defining a class field is +the Galois group of that field. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- A ray-class realization identifies its prescribed quotient with its +finite abelian Galois group. -/ +theorem rayClassSubgroup_quotientEquiv + (K : Type u) [Field K] [NumberField K] + (m : RayClassModulus K) (H : Subgroup (RayClassGroup m)) + (R : RayClassSubgroupRealization K m H) : + Nonempty ((RayClassGroup m ⧸ H) ≃* (R.extension ≃ₐ[K] R.extension)) := by + exact ⟨rayClassSubgroupQuotientEquiv K m H R⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquivMk.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquivMk.lean new file mode 100644 index 0000000000..6129d84aee --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquivMk.lean @@ -0,0 +1,37 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquiv +/-! +# Evaluation of a ray-class subgroup quotient isomorphism + +The quotient isomorphism retains the prescribed Artin normalization. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- A ray class maps to its original Artin value under the induced quotient isomorphism. -/ +theorem rayClassSubgroupQuotientEquiv_mk + (K : Type u) [Field K] [NumberField K] + (m : RayClassModulus K) (H : Subgroup (RayClassGroup m)) + (R : RayClassSubgroupRealization K m H) + (x : RayClassGroup m) : + rayClassSubgroupQuotientEquiv K m H R + (QuotientGroup.mk' H x) = R.artin x := by + rfl + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupRealizationEq.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupRealizationEq.lean new file mode 100644 index 0000000000..6e8d65d691 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupRealizationEq.lean @@ -0,0 +1,34 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupFieldAntitone +/-! +# Uniqueness of a ray-class subgroup field inside the fixed closure + +The class field is independent of the Frobenius-normalized realization as an +actual intermediate field, not just up to abstract isomorphism. This does +not assert uniqueness of the embedding or of the Artin map. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +/-- Two realizations for the same modulus and subgroup have the same +intermediate field in the chosen separable closure. -/ +theorem rayClassSubgroupRealizations_eq + (K : Type) [Field K] [NumberField K] + (m : RayClassModulus K) (H : Subgroup (RayClassGroup m)) + (R₁ R₂ : RayClassSubgroupRealization K m H) : + R₁.extension.1 = R₂.extension.1 := by + apply le_antisymm + · exact rayClassSubgroupField_antitone K m (le_refl H) R₂ R₁ + · exact rayClassSubgroupField_antitone K m (le_refl H) R₁ R₂ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupRealizationEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupRealizationEquiv.lean new file mode 100644 index 0000000000..8b70bb7fbe --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupRealizationEquiv.lean @@ -0,0 +1,53 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment +/-! +# Independence of the realization of a ray-class subgroup + +The field attached to a fixed modulus and subgroup is well-defined up to +`K`-algebra equivalence. The equivalence is not claimed to be unique. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +/-- Two Frobenius-normalized class-field realizations for the same modulus +and ray-class subgroup are isomorphic over the base number field. -/ +theorem rayClassSubgroupRealizations_equiv + (K : Type) [Field K] [NumberField K] + (m : RayClassModulus K) (H : Subgroup (RayClassGroup m)) + (R₁ R₂ : RayClassSubgroupRealization K m H) : + Nonempty (R₁.extension ≃ₐ[K] R₂.extension) := by + obtain ⟨f, _⟩ := + exists_rayClassSubgroupEmbedding_artinNaturality K m + (le_refl H) R₂ R₁ + obtain ⟨g, _⟩ := + exists_rayClassSubgroupEmbedding_artinNaturality K m + (le_refl H) R₁ R₂ + have h₁₂ : (_root_.ideleClassNorm K R₁.extension).range ≤ + (_root_.ideleClassNorm K R₂.extension).range := + GlobalClassFieldTheory.GlobalClassFields.ideleClassNorm_range_le_of_algHom + (K := K) R₂.extension R₁.extension g + have h₂₁ : (_root_.ideleClassNorm K R₂.extension).range ≤ + (_root_.ideleClassNorm K R₁.extension).range := + GlobalClassFieldTheory.GlobalClassFields.ideleClassNorm_range_le_of_algHom + (K := K) R₁.extension R₂.extension f + exact + (GlobalClassFieldTheory.GlobalClassFields.nonempty_algEquiv_iff_ideleClassNorm_range_eq + (K := K) R₁.extension R₂.extension).2 (le_antisymm h₁₂ h₂₁) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitAntitone.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitAntitone.lean new file mode 100644 index 0000000000..3f2f739fa8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitAntitone.lean @@ -0,0 +1,38 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +/-! +# Monotonicity of local higher-unit groups +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +open NumberField IsDedekindDomain + +/-- Deeper local congruence conditions give smaller higher-unit groups. -/ +theorem rayLocalHigherUnitGroup_antitone + {K : Type u} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) + {m n : ℕ} (hmn : m ≤ n) : + rayLocalHigherUnitGroup v n ≤ rayLocalHigherUnitGroup v m := by + change RayClass.localHigherUnitGroup v n ≤ + RayClass.localHigherUnitGroup v m + exact RayClass.localHigherUnitGroup_antitone v hmn + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitMembership.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitMembership.lean new file mode 100644 index 0000000000..61c30499ce --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitMembership.lean @@ -0,0 +1,80 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Basic +public import Mathlib.RingTheory.Ideal.Quotient.Defs +/-! +# Congruence description of local higher units + +An element of the `n`-th higher-unit group is an integral unit congruent to +`1` modulo the `n`-th power of the maximal ideal. This also applies at `n = 0`, +where the condition reduces to being an integral unit. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +open NumberField IsDedekindDomain + +/-- Membership in the `n`-th local higher-unit group is precisely the +congruence `y ≡ 1 (mod 𝔪_v^n)` for an integral-unit representative. -/ +theorem mem_rayLocalHigherUnitGroup_iff + {K : Type u} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ) + (x : (v.adicCompletion K)ˣ) : + x ∈ rayLocalHigherUnitGroup v n ↔ + ∃ y : (v.adicCompletionIntegers K)ˣ, + ((v.adicCompletionIntegers K).toSubmonoid.unitsEquivUnitsType.symm y : + (v.adicCompletion K)ˣ) = x ∧ + (y : v.adicCompletionIntegers K) - 1 ∈ + (IsLocalRing.maximalIdeal (v.adicCompletionIntegers K)) ^ n := by + change x ∈ RayClass.localHigherUnitGroup v n ↔ _ + rw [RayClass.mem_localHigherUnitGroup_iff] + constructor + · rintro ⟨y, hxy, hmap⟩ + let z : (v.adicCompletionIntegers K)ˣ := + (v.adicCompletionIntegers K).toSubmonoid.unitsEquivUnitsType y + refine ⟨z, ?_, ?_⟩ + · have hback : + (v.adicCompletionIntegers K).toSubmonoid.unitsEquivUnitsType.symm z = y := by + exact Equiv.symm_apply_apply _ _ + rw [hback] + exact hxy + · have hq : Ideal.Quotient.mk + ((IsLocalRing.maximalIdeal (v.adicCompletionIntegers K)) ^ n) + (z : v.adicCompletionIntegers K) = 1 := by + have hv := congrArg Units.val hmap + change Ideal.Quotient.mk + ((IsLocalRing.maximalIdeal (v.adicCompletionIntegers K)) ^ n) + (z : v.adicCompletionIntegers K) = 1 at hv + exact hv + exact (Ideal.Quotient.mk_eq_one_iff_sub_mem + (I := (IsLocalRing.maximalIdeal (v.adicCompletionIntegers K)) ^ n) + (z : v.adicCompletionIntegers K)).mp hq + · rintro ⟨z, hz, hcong⟩ + let y : (v.adicCompletionIntegers K).units := + (v.adicCompletionIntegers K).toSubmonoid.unitsEquivUnitsType.symm z + refine ⟨y, hz, ?_⟩ + apply Units.ext + change Ideal.Quotient.mk + ((IsLocalRing.maximalIdeal (v.adicCompletionIntegers K)) ^ n) + (z : v.adicCompletionIntegers K) = 1 + exact (Ideal.Quotient.mk_eq_one_iff_sub_mem + (I := (IsLocalRing.maximalIdeal (v.adicCompletionIntegers K)) ^ n) + (z : v.adicCompletionIntegers K)).mpr hcong + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOneAdd.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOneAdd.lean new file mode 100644 index 0000000000..3f883c5044 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOneAdd.lean @@ -0,0 +1,90 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitMembership +public import Mathlib.RingTheory.Ideal.Operations +public import Mathlib.RingTheory.LocalRing.Basic +public import Mathlib.RingTheory.LocalRing.MaximalIdeal.Basic +public import Mathlib.Tactic.Ring +/-! +# Positive-depth higher units as `1 + 𝔪ᵛⁿ` + +At positive depth, every element of `1 + 𝔪ᵛⁿ` is automatically a unit in +the local integer ring. Consequently no integral-unit witness is needed in +the membership criterion below. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- For `n ≥ 1`, a local field unit belongs to the `n`-th higher-unit +group exactly when its value is `1 + t` for some `t` in the `n`-th power of +the maximal ideal of the local integer ring. -/ +theorem mem_rayLocalHigherUnitGroup_iff_exists_one_add + {K : Type u} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ) (hn : 1 ≤ n) + (x : (v.adicCompletion K)ˣ) : + x ∈ rayLocalHigherUnitGroup v n ↔ + ∃ t : v.adicCompletionIntegers K, + t ∈ (IsLocalRing.maximalIdeal (v.adicCompletionIntegers K)) ^ n ∧ + (x : v.adicCompletion K) = + ((1 + t : v.adicCompletionIntegers K) : v.adicCompletion K) := by + constructor + · intro hx + obtain ⟨y, hxy, hcong⟩ := + (mem_rayLocalHigherUnitGroup_iff v n x).mp hx + refine ⟨(y : v.adicCompletionIntegers K) - 1, hcong, ?_⟩ + have hval := congrArg Units.val hxy + change ((y : v.adicCompletionIntegers K) : v.adicCompletion K) = + (x : v.adicCompletion K) at hval + calc + (x : v.adicCompletion K) = + ((y : v.adicCompletionIntegers K) : v.adicCompletion K) := hval.symm + _ = ((1 + ((y : v.adicCompletionIntegers K) - 1) : + v.adicCompletionIntegers K) : v.adicCompletion K) := by + congr 1 + ring + · rintro ⟨t, ht, hx⟩ + have htmax : t ∈ IsLocalRing.maximalIdeal (v.adicCompletionIntegers K) := + (Ideal.pow_le_self (Nat.ne_of_gt hn)) ht + have hnon : -t ∈ nonunits (v.adicCompletionIntegers K) := + (IsLocalRing.mem_maximalIdeal (-t)).mp + ((IsLocalRing.maximalIdeal (v.adicCompletionIntegers K)).neg_mem htmax) + have hunit : IsUnit (1 + t : v.adicCompletionIntegers K) := by + simpa only [sub_neg_eq_add] using + (IsLocalRing.isUnit_one_sub_self_of_mem_nonunits (-t) hnon) + obtain ⟨y, hy⟩ := hunit + apply (mem_rayLocalHigherUnitGroup_iff v n x).mpr + refine ⟨y, ?_, ?_⟩ + · apply Units.ext + change ((y : v.adicCompletionIntegers K) : v.adicCompletion K) = + (x : v.adicCompletion K) + calc + ((y : v.adicCompletionIntegers K) : v.adicCompletion K) = + ((1 + t : v.adicCompletionIntegers K) : v.adicCompletion K) := + congrArg + (fun z : v.adicCompletionIntegers K => + (z : v.adicCompletion K)) hy + _ = (x : v.adicCompletion K) := hx.symm + · have hsub : (y : v.adicCompletionIntegers K) - 1 = t := by + rw [hy] + ring + rw [hsub] + exact ht + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOpen.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOpen.lean new file mode 100644 index 0000000000..8415e1b37a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOpen.lean @@ -0,0 +1,41 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +/-! +# Openness of local higher-unit groups + +For every depth, including zero, the higher-unit subgroup is open in the +multiplicative group of the finite completion. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +open NumberField IsDedekindDomain + +/-- Every local higher-unit group is open in the local multiplicative group. -/ +theorem isOpen_rayLocalHigherUnitGroup + {K : Type u} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) (n : ℕ) : + IsOpen ((rayLocalHigherUnitGroup v n : + Subgroup (v.adicCompletion K)ˣ) : Set (v.adicCompletion K)ˣ) := by + change IsOpen ((RayClass.localHigherUnitGroup v n : + Subgroup (v.adicCompletion K)ˣ) : Set (v.adicCompletion K)ˣ) + exact RayClass.isOpen_localHigherUnitGroup v n + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitZero.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitZero.lean new file mode 100644 index 0000000000..52d64a866e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitZero.lean @@ -0,0 +1,39 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Basic +/-! +# The zeroth local higher-unit group +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +open NumberField IsDedekindDomain + +/-- At depth zero the local higher-unit group is the full group of +integral units, not the full multiplicative group of the local field. -/ +theorem rayLocalHigherUnitGroup_zero + {K : Type u} [Field K] [NumberField K] + (v : HeightOneSpectrum (𝓞 K)) : + rayLocalHigherUnitGroup v 0 = + (v.adicCompletionIntegers K).units := by + change RayClass.localHigherUnitGroup v 0 = + (v.adicCompletionIntegers K).units + exact RayClass.localHigherUnitGroup_zero v + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealMembership.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealMembership.lean new file mode 100644 index 0000000000..45ca3e0029 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealMembership.lean @@ -0,0 +1,59 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup +public import Mathlib.Algebra.Group.Subgroup.Lattice +/-! +# Membership in the ray-principal ideal subgroup + +The ray-congruent generators already form a subgroup under the principal +ideal map, so taking their subgroup closure adds no new ideals. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- A fractional ideal is ray-principal exactly when it has one +ray-congruent nonzero generator. -/ +theorem mem_rayPrincipalIdealSubgroup_iff + {K : Type u} [Field K] [NumberField K] + (m : RayClassModulus K) + (I : NumberFieldFractionalIdealGroup K) : + I ∈ rayPrincipalIdealSubgroup m ↔ + ∃ x : Kˣ, IsRayCongruent m x ∧ + toPrincipalIdeal (𝓞 K) K x = I := by + let P : Subgroup (NumberFieldFractionalIdealGroup K) := { + carrier := {J | ∃ x : Kˣ, + IsRayCongruent m x ∧ toPrincipalIdeal (𝓞 K) K x = J} + one_mem' := by + refine ⟨1, IsRayCongruent.one m, ?_⟩ + simp only [map_one] + mul_mem' := by + rintro J J' ⟨x, hx, hxJ⟩ ⟨y, hy, hyJ⟩ + refine ⟨x * y, IsRayCongruent.mul hx hy, ?_⟩ + rw [map_mul, hxJ, hyJ] + inv_mem' := by + rintro J ⟨x, hx, hxJ⟩ + refine ⟨x⁻¹, IsRayCongruent.inv hx, ?_⟩ + rw [map_inv, hxJ] } + have hP : rayPrincipalIdealSubgroup m = P := by + change Subgroup.closure (P : Set (NumberFieldFractionalIdealGroup K)) = P + exact Subgroup.closure_eq P + rw [hP] + rfl + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealPrimeTo.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealPrimeTo.lean new file mode 100644 index 0000000000..1140a04fc1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealPrimeTo.lean @@ -0,0 +1,55 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealMembership +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal +/-! +# Ray-principal ideals are prime to the modulus + +The local congruence condition makes the corresponding principal idèle +integral-unit-valued at every finite prime in the modulus support. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +open NumberField IsDedekindDomain + +universe u + +open scoped Classical in +/-- A ray-principal fractional ideal has zero exponent at every finite +prime in the modulus support. -/ +theorem rayPrincipalIdealSubgroup_le_primeToIdeals + (K : Type u) [Field K] [NumberField K] + (m : RayClassModulus K) : + rayPrincipalIdealSubgroup m ≤ rayClassPrimeToIdeals m := by + intro I hI + obtain ⟨x, hx, hIx⟩ := (mem_rayPrincipalIdealSubgroup_iff m I).1 hI + intro v hv + rw [← hIx, ← IdeleGroup.fractionalIdeal_principalIdele] + change FractionalIdeal.count K v + (((FractionalIdealGroup.factorization (K := K)) + (FiniteIdeleGroup.valuationVector + (IdeleGroup.principalIdele K x).2) : FractionalIdealGroup K) : + FractionalIdeal (nonZeroDivisors (𝓞 K)) K) = 0 + rw [FractionalIdealGroup.count_factorization, + FiniteIdeleGroup.valuationVector_apply] + apply (FiniteIdeleGroup.localOrder_eq_zero_iff v + ((IdeleGroup.principalIdele K x).2 v)).2 + apply RayClass.localHigherUnitGroup_le_integralUnits v (m.finitePart v) + exact hx.1 v hv + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields.lean new file mode 100644 index 0000000000..3fc4289a02 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields.lean @@ -0,0 +1,38 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAlgEquivTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusEqOneIffSplitsCompletely +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIndependentOfPrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIsArithmetic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusOrder +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusRestrictTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldArtinEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldExists +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldNarrowRayRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplittingPositivePrincipal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldUnique +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.NarrowRayRealizationIsBigHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.OrdinaryRayRealizationIsSmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallBigHilbertClassFieldIffOfNoReal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldArtinEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldEmbedsInBig +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldExists +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldLeBig +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldOrdinaryRayRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldPrimeSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldPrincipalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldUnique +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldUniqueUpToEquiv + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/All.lean new file mode 100644 index 0000000000..23f5b51706 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/All.lean @@ -0,0 +1,42 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusEqOneIffSplitsCompletely +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAlgEquivTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIndependentOfPrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIsArithmetic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusOrder +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusRestrictTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldExists +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldArtinEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldNarrowRayRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplittingPositivePrincipal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldUnique +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.NarrowRayRealizationIsBigHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldEmbedsInBig +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldLeBig +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallBigHilbertClassFieldIffOfNoReal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldExists +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldArtinEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldOrdinaryRayRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.OrdinaryRayRealizationIsSmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldPrimeSplitting +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldPrincipalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldUniqueUpToEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldUnique +/-! +# Frobenius and Hilbert class fields + +This `All` module collects the Mathlib-native arithmetic Frobenius statements +and the intrinsic existence, Artin isomorphism, degree, splitting, and +principalization results for small and big Hilbert class fields. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAlgEquivTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAlgEquivTransport.lean new file mode 100644 index 0000000000..aae345ac9b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAlgEquivTransport.lean @@ -0,0 +1,72 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIndependentOfPrime +public import Mathlib.NumberTheory.NumberField.Basic +public import Mathlib.NumberTheory.RamificationInertia.Unramified +public import Mathlib.RingTheory.DedekindDomain.Ideal.Lemmas +/-! +# Arithmetic Frobenius under transport of a prime + +An automorphism of an abelian extension may move a prime above a fixed base +prime. At an unramified prime, the arithmetic Frobenius element is unchanged. +The prime transport is Mathlib's equivalence of height-one spectra induced by +the automorphism of the ring of integers. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- In an abelian extension, transporting an unramified prime by a +`K`-automorphism does not change its arithmetic Frobenius element. -/ +theorem arithmeticFrobeniusAt_mapAlgEquiv + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + (v : HeightOneSpectrum (𝓞 K)) + (w : HeightOneSpectrum (𝓞 L)) + (hw : w.asIdeal.LiesOver v.asIdeal) + (σ : L ≃ₐ[K] L) + (hunram : Algebra.IsUnramifiedAt (𝓞 K) w.asIdeal) : + arithmeticFrobeniusAt (K := K) + ((HeightOneSpectrum.equivOfRingEquiv + (RingOfIntegers.mapAlgEquiv σ).toRingEquiv) w) = + arithmeticFrobeniusAt (K := K) w := by + let e : (𝓞 L) ≃ₐ[𝓞 K] (𝓞 L) := RingOfIntegers.mapAlgEquiv σ + have hwσ : + ((HeightOneSpectrum.equivOfRingEquiv e.toRingEquiv) w).asIdeal.LiesOver + v.asIdeal := by + change (w.asIdeal.comap e.symm.toRingHom).LiesOver v.asIdeal + refine ⟨?_⟩ + change v.asIdeal = + (w.asIdeal.comap e.symm.toRingHom).comap + (algebraMap (𝓞 K) (𝓞 L)) + rw [Ideal.comap_comap] + have he : e.symm.toRingHom.comp (algebraMap (𝓞 K) (𝓞 L)) = + algebraMap (𝓞 K) (𝓞 L) := by + apply RingHom.ext + intro x + exact e.symm.commutes x + rw [he] + exact hw.over + exact (arithmeticFrobeniusAt_eq_of_primesAbove v w + ((HeightOneSpectrum.equivOfRingEquiv e.toRingEquiv) w) + hw hwσ hunram).symm + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusEqOneIffSplitsCompletely.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusEqOneIffSplitsCompletely.lean new file mode 100644 index 0000000000..5bce797b3c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusEqOneIffSplitsCompletely.lean @@ -0,0 +1,65 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusOrder +/-! +# Trivial arithmetic Frobenius and complete splitting + +In a finite abelian extension, the Frobenius at an unramified prime is the +identity exactly when the base prime splits completely. Complete splitting +is expressed only with Mathlib's ramification indices and residue degrees. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +open NumberField IsDedekindDomain + +universe u v + +/-- An unramified finite prime splits completely exactly when its arithmetic +Frobenius is trivial. -/ +theorem arithmeticFrobeniusAt_eq_one_iff_splitsCompletely + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + (v : HeightOneSpectrum (𝓞 K)) + (w : HeightOneSpectrum (𝓞 L)) + (hw : w.asIdeal.LiesOver v.asIdeal) + (hunram : Algebra.IsUnramifiedIn (𝓞 L) v.asIdeal) : + arithmeticFrobeniusAt (K := K) w = 1 ↔ + FinitePrimeSplitsCompletely K L v := by + have hunramw : Algebra.IsUnramifiedAt (𝓞 K) w.asIdeal := + hunram w.asIdeal inferInstance hw + have horder := + orderOf_arithmeticFrobeniusAt_eq_inertiaDegree v w hw hunramw + constructor + · intro h + have hdeg : w.asIdeal.inertiaDeg (𝓞 K) = 1 := + horder.symm.trans (orderOf_eq_one_iff.mpr h) + intro w' hw' + let : w.asIdeal.LiesOver v.asIdeal := hw + let : w'.asIdeal.LiesOver v.asIdeal := hw' + have hsame : w'.asIdeal.inertiaDeg (𝓞 K) = + w.asIdeal.inertiaDeg (𝓞 K) := + Ideal.inertiaDeg_eq_of_isGaloisGroup + v.asIdeal w'.asIdeal w.asIdeal (L ≃ₐ[K] L) + exact ⟨hunram.ramificationIdx_eq_one hw', hsame.trans hdeg⟩ + · intro h + exact orderOf_eq_one_iff.mp (horder.trans (h w hw).2) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIndependentOfPrime.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIndependentOfPrime.lean new file mode 100644 index 0000000000..89f64421ad --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIndependentOfPrime.lean @@ -0,0 +1,59 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +public import Mathlib.NumberTheory.RamificationInertia.Unramified +public import Mathlib.RingTheory.DedekindDomain.Factorization +public import Mathlib.RingTheory.Frobenius +/-! +# Independence of arithmetic Frobenius from the prime above + +At an unramified prime of an abelian extension, all primes above the same +finite base prime give the same canonical arithmetic Frobenius element. +This is the equality, rather than merely conjugacy, needed to avoid choosing +an upstairs prime. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- At an unramified finite prime of an abelian extension, arithmetic +Frobenius is independent of the chosen prime above the base prime. -/ +theorem arithmeticFrobeniusAt_eq_of_primesAbove + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + (v : HeightOneSpectrum (𝓞 K)) + (w w' : HeightOneSpectrum (𝓞 L)) + (hw : w.asIdeal.LiesOver v.asIdeal) + (hw' : w'.asIdeal.LiesOver v.asIdeal) + (_hunram : Algebra.IsUnramifiedAt (𝓞 K) w.asIdeal) : + arithmeticFrobeniusAt (K := K) w = + arithmeticFrobeniusAt (K := K) w' := by + obtain ⟨τ, hτ⟩ := isConj_iff.mp + (isConj_arithFrobAt (𝓞 K) (L ≃ₐ[K] L) + w.asIdeal w'.asIdeal (hw.over.symm.trans hw'.over)) + calc + arithmeticFrobeniusAt (K := K) w = + τ * arithmeticFrobeniusAt (K := K) w * τ⁻¹ := by + rw [IsMulCommutative.is_comm.comm τ + (arithmeticFrobeniusAt (K := K) w), mul_assoc, + mul_inv_cancel, mul_one] + _ = arithmeticFrobeniusAt (K := K) w' := hτ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIsArithmetic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIsArithmetic.lean new file mode 100644 index 0000000000..9cdfce3844 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIsArithmetic.lean @@ -0,0 +1,43 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +/-! +# Arithmetic Frobenius satisfies the residue-field congruence + +This statement exposes Mathlib's intrinsic arithmetic Frobenius, rather than +an element named through a particular implementation of the global Artin +map. It is therefore the precise bridge to `IsArithFrobAt` that downstream +ramification arguments can use. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +open NumberField IsDedekindDomain + +/-- The chosen arithmetic Frobenius at `w` satisfies Mathlib's defining +residue-field Frobenius congruence. -/ +theorem arithmeticFrobeniusAt_isArithFrobAt + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + (w : HeightOneSpectrum (𝓞 L)) : + IsArithFrobAt (𝓞 K) (arithmeticFrobeniusAt (K := K) w) w.asIdeal := by + exact IsArithFrobAt.arithFrobAt (𝓞 K) (L ≃ₐ[K] L) w.asIdeal + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusOrder.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusOrder.lean new file mode 100644 index 0000000000..e6c0b48f1f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusOrder.lean @@ -0,0 +1,100 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +public import Mathlib.FieldTheory.Finite.Basic +public import Mathlib.NumberTheory.RamificationInertia.Unramified +public import Mathlib.RingTheory.Frobenius +/-! +# Order of arithmetic Frobenius at an unramified prime + +For a prime `w` of `L` above `v` of `K`, unramifiedness kills the inertia +subgroup. The arithmetic Frobenius therefore has order equal to the residue +degree at `w`. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +open NumberField IsDedekindDomain +open scoped Pointwise + +universe u v + +/-- At an unramified prime, the order of arithmetic Frobenius is the inertia +(residue) degree. -/ +theorem orderOf_arithmeticFrobeniusAt_eq_inertiaDegree + {K : Type u} {L : Type v} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + (v : HeightOneSpectrum (𝓞 K)) + (w : HeightOneSpectrum (𝓞 L)) + (hw : w.asIdeal.LiesOver v.asIdeal) + (hunram : Algebra.IsUnramifiedAt (𝓞 K) w.asIdeal) : + orderOf (arithmeticFrobeniusAt (K := K) w) = + w.asIdeal.inertiaDeg (𝓞 K) := by + classical + let P : Ideal (𝓞 K) := v.asIdeal + let Q : Ideal (𝓞 L) := w.asIdeal + let G := L ≃ₐ[K] L + let g : G := arithmeticFrobeniusAt (K := K) w + let : Q.LiesOver P := hw + let : Algebra.IsUnramifiedAt (𝓞 K) Q := hunram + let : Field ((𝓞 K) ⧸ P) := Ideal.Quotient.field P + let : Field ((𝓞 L) ⧸ Q) := Ideal.Quotient.field Q + let : Finite ((𝓞 K) ⧸ P) := + Ring.HasFiniteQuotients.finiteQuotient v.ne_bot + let : Finite ((𝓞 L) ⧸ Q) := + Ring.HasFiniteQuotients.finiteQuotient w.ne_bot + let : Fintype ((𝓞 K) ⧸ P) := Fintype.ofFinite _ + have hF : IsArithFrobAt (𝓞 K) g Q := by + change IsArithFrobAt (𝓞 K) (arithFrobAt (𝓞 K) G Q) Q + exact IsArithFrobAt.arithFrobAt (𝓞 K) G Q + let gs : MulAction.stabilizer G Q := ⟨g, hF.mem_stabilizer⟩ + have hImage : + Ideal.Quotient.stabilizerHom Q P G gs = + FiniteField.frobeniusAlgEquivOfAlgebraic + ((𝓞 K) ⧸ P) ((𝓞 L) ⧸ Q) := by + apply AlgEquiv.ext + intro x + obtain ⟨y, rfl⟩ := Ideal.Quotient.mk_surjective x + rw [Ideal.Quotient.stabilizerHom_apply] + simp only [FiniteField.coe_frobeniusAlgEquivOfAlgebraic] + have h := hF.mk_apply y + have hQP : Q.under (𝓞 K) = P := hw.over.symm + rw [hQP, Nat.card_eq_fintype_card] at h + exact h + have hImageOrder : + orderOf (Ideal.Quotient.stabilizerHom Q P G gs) = + Q.inertiaDeg (𝓞 K) := by + rw [hImage, FiniteField.orderOf_frobeniusAlgEquivOfAlgebraic] + exact (Ideal.inertiaDeg_eq_of_isMaximal P Q).symm + have hCard : Nat.card (MulAction.stabilizer G Q) = + Q.inertiaDeg (𝓞 K) := by + rw [Ideal.card_stabilizer_eq (G := G) P Q, + Ideal.ramificationIdxIn_eq_ramificationIdx P Q G, + Ideal.inertiaDegIn_eq_inertiaDeg P Q G, + Ideal.ramificationIdx_eq_one Q (𝓞 K), one_mul] + have hUpper : orderOf gs ∣ Q.inertiaDeg (𝓞 K) := by + rw [← hCard] + exact orderOf_dvd_natCard gs + have hLower : Q.inertiaDeg (𝓞 K) ∣ orderOf gs := by + rw [← hImageOrder] + exact orderOf_map_dvd (Ideal.Quotient.stabilizerHom Q P G) gs + change orderOf g = Q.inertiaDeg (𝓞 K) + exact (Subgroup.orderOf_coe gs).trans + (Nat.dvd_antisymm hUpper hLower) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusRestrictTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusRestrictTower.lean new file mode 100644 index 0000000000..b95a363d6a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusRestrictTower.lean @@ -0,0 +1,84 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin +/-! +# Arithmetic Frobenius in a finite abelian tower + +At a prime unramified in the top field, restriction of arithmetic Frobenius +to an intermediate field is arithmetic Frobenius at the prime below it. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +open NumberField IsDedekindDomain IdeleGroup +open GlobalClassFieldTheory.GlobalClassFields + +private theorem arithmeticFinitePlacePrimeArtin_restrict_tower_of_globalArtin + (K E L : Type) [Field K] [Field E] [Field L] + [NumberField K] [NumberField E] [NumberField L] + [Algebra K E] [Algebra E L] [Algebra K L] [IsScalarTower K E L] + [IsAbelianGalois K E] [IsAbelianGalois K L] + (v : HeightOneSpectrum (𝓞 K)) : + AlgEquiv.restrictNormalHom E + (arithmeticFinitePlacePrimeArtin (K := K) (L := L) v) = + arithmeticFinitePlacePrimeArtin (K := K) (L := E) v := by + rw [arithmeticFinitePlacePrimeArtin_eq_inv (K := K) (L := L) v, + arithmeticFinitePlacePrimeArtin_eq_inv (K := K) (L := E) v, map_inv] + simpa only [finitePlacePrimeArtin, MonoidHom.comp_apply] using + congrArg Inv.inv + (DFunLike.congr_fun + (GlobalClassFieldTheory.Reciprocity.globalArtinMonoidHom_restrict_tower + (K := K) (L := L) (E := E)) + (IdeleGroup.finitePrimeIdele v)) + +/-- In a finite abelian tower `K ⊆ E ⊆ L`, arithmetic Frobenius at an +unramified prime of `L` restricts to arithmetic Frobenius at the specified +prime of `E` below it. -/ +theorem arithmeticFrobeniusAt_restrict_tower + {K E L : Type} + [Field K] [NumberField K] + [Field E] [NumberField E] + [Field L] [NumberField L] + [Algebra K E] [Algebra E L] [Algebra K L] [IsScalarTower K E L] + [IsAbelianGalois K E] [IsAbelianGalois K L] + (v : HeightOneSpectrum (𝓞 K)) + (wE : HeightOneSpectrum (𝓞 E)) + (wL : HeightOneSpectrum (𝓞 L)) + (hwE : wE.asIdeal.LiesOver v.asIdeal) + (hwL : wL.asIdeal.LiesOver wE.asIdeal) + (hunram : Algebra.IsUnramifiedAt (𝓞 K) wL.asIdeal) : + AlgEquiv.restrictNormalHom E (arithmeticFrobeniusAt (K := K) wL) = + arithmeticFrobeniusAt (K := K) wE := by + have : wL.asIdeal.LiesOver wE.asIdeal := hwL + have hwLv : wL.asIdeal.LiesOver v.asIdeal := + Ideal.LiesOver.trans wL.asIdeal wE.asIdeal v.asIdeal + have hunramE : Algebra.IsUnramifiedAt (𝓞 K) wE.asIdeal := + Algebra.IsUnramifiedAt.of_liesOver (𝓞 K) wE.asIdeal wL.asIdeal + calc + AlgEquiv.restrictNormalHom E (arithmeticFrobeniusAt (K := K) wL) = + AlgEquiv.restrictNormalHom E + (arithmeticFinitePlacePrimeArtin (K := K) (L := L) v) := by + rw [GlobalClassFieldComparison.arithmeticPrimeArtin_eq_arithmeticFrobeniusAt + v wL hwLv hunram] + _ = arithmeticFinitePlacePrimeArtin (K := K) (L := E) v := + arithmeticFinitePlacePrimeArtin_restrict_tower_of_globalArtin K E L v + _ = arithmeticFrobeniusAt (K := K) wE := + GlobalClassFieldComparison.arithmeticPrimeArtin_eq_arithmeticFrobeniusAt + v wE hwE hunramE + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldArtinEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldArtinEquiv.lean new file mode 100644 index 0000000000..f5cb450de3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldArtinEquiv.lean @@ -0,0 +1,72 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldMathlibArtin +/-! +# Artin isomorphism for the big Hilbert class field + +The narrow ideal class group is isomorphic to the Galois group of the big +Hilbert class field. The displayed compatibility with arithmetic Frobenius +fixes the Artin normalization of the isomorphism. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +open NumberField IsDedekindDomain + +/-- The narrow class group acts through the Frobenius-normalized Artin +isomorphism on a big Hilbert class field. -/ +theorem bigHilbertClassField_artinEquiv + (K : Type) [Field K] [NumberField K] + (E : FiniteAbelianExtension K) (hE : IsBigHilbertClassField E) : + ∃ artin : RayClassGroup (narrowRayClassModulus K) ≃* + (E ≃ₐ[K] E), + ∀ (v : HeightOneSpectrum (𝓞 K)) + (w : HeightOneSpectrum (𝓞 E)), + w.asIdeal.LiesOver v.asIdeal → + artin (narrowRayClassOfFinitePrime v) = + arithmeticFrobeniusAt (K := K) w := by + let g := + GlobalClassFieldComparison.arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroupOfIsBig E hE + let artin : RayClassGroup (narrowRayClassModulus K) ≃* (E ≃ₐ[K] E) := + (GlobalClassFieldComparison.narrowRayClassGroupEquivNarrowClassGroup K).trans g.symm + refine ⟨artin, ?_⟩ + intro v w hw + have hunram : Algebra.IsUnramifiedAt (𝓞 K) w.asIdeal := + hE.1 v w.asIdeal inferInstance hw + apply g.injective + calc + g (artin (narrowRayClassOfFinitePrime v)) = + QuotientGroup.mk' (RayClass.narrowDenominator (K := K)) + (IdeleGroup.finitePrimeIdele v) := by + rw [show g (artin (narrowRayClassOfFinitePrime v)) = + GlobalClassFieldComparison.narrowRayClassGroupEquivNarrowClassGroup K + (narrowRayClassOfFinitePrime v) from by + simp only [artin, MulEquiv.trans_apply, g.apply_symm_apply]] + exact GlobalClassFieldComparison.narrowRayClassGroupEquivNarrowClassGroup_prime v + _ = g (arithmeticFrobeniusAt (K := K) w) := by + rw [← GlobalClassFieldComparison.arithmeticPrimeArtin_eq_arithmeticFrobeniusAt + (K := K) (L := E) v w hw hunram] + exact + (GlobalClassFieldComparison.arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroup_prime + E hE v).symm + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldDegree.lean new file mode 100644 index 0000000000..34c117941a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldDegree.lean @@ -0,0 +1,46 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison +/-! +# Degree of the big Hilbert class field + +The degree of any extension satisfying the intrinsic big-Hilbert-class-field +property is the order of the narrow ray class group. The latter is the ray +class group for the modulus containing every real place and no finite prime. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +/-- The big Hilbert class field has degree equal to the narrow class number. -/ +theorem bigHilbertClassField_degree_eq_narrowClassGroup_card + (K : Type) [Field K] [NumberField K] + (E : FiniteAbelianExtension K) (hE : IsBigHilbertClassField E) : + Module.finrank K E = + Nat.card (RayClassGroup (narrowRayClassModulus K)) := by + calc + Module.finrank K E = Nat.card (RayClass.NarrowClassGroup K) := + GlobalClassFieldComparison.bigHilbertClassField_degree_eq_narrowClassGroup_card_of_isBig K + E hE + _ = Nat.card (RayClassGroup (narrowRayClassModulus K)) := + (Nat.card_congr + (GlobalClassFieldComparison.narrowRayClassGroupEquivNarrowClassGroup K).toEquiv).symm + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldExists.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldExists.lean new file mode 100644 index 0000000000..a3f85dfc48 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldExists.lean @@ -0,0 +1,33 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison +/-! +# Existence of the big Hilbert class field + +The big Hilbert class field is characterized intrinsically as a finite +abelian extension unramified at every finite prime and containing every +other finite abelian extension with that property. No particular field +chosen by the implementation appears in the statement. +-/ + +@[expose] public section + +open scoped NumberField + +namespace ClassFieldTheory + +/-- A maximal finite-prime-unramified finite abelian extension exists. -/ +theorem exists_bigHilbertClassField + (K : Type) [Field K] [NumberField K] : + ∃ E : FiniteAbelianExtension K, IsBigHilbertClassField E := + GlobalClassFieldComparison.exists_bigHilbertClassField K + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldNarrowRayRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldNarrowRayRealization.lean new file mode 100644 index 0000000000..d6ba99b06b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldNarrowRayRealization.lean @@ -0,0 +1,59 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldArtinEquiv +/-! +# The big Hilbert class field as a narrow ray class field + +Its narrow-class Artin isomorphism and unramifiedness at finite primes give +a ray-class-field realization whose extension is the original field. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +open NumberField IsDedekindDomain + +/-- A big Hilbert class field realizes the narrow ray class group, with +the same extension and arithmetic Frobenius normalization. -/ +theorem bigHilbertClassField_hasNarrowRayRealization + (K : Type) [Field K] [NumberField K] + (E : FiniteAbelianExtension K) (hE : IsBigHilbertClassField E) : + ∃ R : RayClassFieldRealization K (narrowRayClassModulus K), + R.extension = E := by + classical + obtain ⟨artin, hartin⟩ := bigHilbertClassField_artinEquiv K E hE + let R : RayClassFieldRealization K (narrowRayClassModulus K) := { + extension := E + unramifiedOutsideModulus := by + constructor + · intro v _ + exact hE.1 v + · intro v hv hnot + have hmem : (⟨v, hv⟩ : RayClassRealPlace K) ∈ + (narrowRayClassModulus K).infinitePart := + Finset.mem_univ _ + exact (hnot hmem).elim + artinEquiv := artin + artin_frobenius := by + intro v _ w hw + change artin (narrowRayClassOfFinitePrime v) = + arithmeticFrobeniusAt (K := K) w + exact hartin v w hw } + exact ⟨R, rfl⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplitting.lean new file mode 100644 index 0000000000..bbcf6db13d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplitting.lean @@ -0,0 +1,62 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusEqOneIffSplitsCompletely +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldArtinEquiv +/-! +# Prime splitting in the big Hilbert class field + +A finite prime splits completely in the big Hilbert class field precisely +when its narrow ideal class is trivial. Real-place ramification does not +affect this finite-prime criterion. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +open scoped Classical in +/-- A finite prime splits completely in the big Hilbert class field exactly +when its narrow ray class is trivial. -/ +theorem finitePrime_splitsCompletelyInBigHilbertClassField_iff + (K : Type) [Field K] [NumberField K] + (E : FiniteAbelianExtension K) (hE : IsBigHilbertClassField E) + (v : HeightOneSpectrum (𝓞 K)) : + FinitePrimeSplitsCompletely K E v ↔ + narrowRayClassOfFinitePrime v = 1 := by + obtain ⟨artin, hartin⟩ := bigHilbertClassField_artinEquiv K E hE + have hunram : Algebra.IsUnramifiedIn (𝓞 E) v.asIdeal := hE.1 v + obtain ⟨Q, hQmax, hQover⟩ := + Ideal.exists_maximal_ideal_liesOver_of_isIntegral + (S := 𝓞 E) v.asIdeal + let : Q.LiesOver v.asIdeal := hQover + let w : HeightOneSpectrum (𝓞 E) := + ⟨Q, hQmax.isPrime, + Ideal.ne_bot_of_liesOver_of_ne_bot v.ne_bot Q⟩ + have hw : w.asIdeal.LiesOver v.asIdeal := hQover + constructor + · intro hsplit + apply artin.injective + rw [map_one, hartin v w hw] + exact (arithmeticFrobeniusAt_eq_one_iff_splitsCompletely + v w hw hunram).2 hsplit + · intro hclass + apply (arithmeticFrobeniusAt_eq_one_iff_splitsCompletely + v w hw hunram).1 + rw [← hartin v w hw, hclass, map_one] + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplittingPositivePrincipal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplittingPositivePrincipal.lean new file mode 100644 index 0000000000..5be7e52d9a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplittingPositivePrincipal.lean @@ -0,0 +1,53 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealMembership +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplitting +/-! +# Totally positive principal primes and splitting + +A finite prime splits completely in the big Hilbert class field exactly +when its fractional ideal has a totally positive generator. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +open scoped Classical in +/-- Equivalently, a prime splits completely in the big Hilbert class field +exactly when it has a totally positive generator. -/ +theorem finitePrime_splitsCompletelyInBigHilbertClassField_iff_positivePrincipal + (K : Type) [Field K] [NumberField K] + (E : FiniteAbelianExtension K) (hE : IsBigHilbertClassField E) + (v : HeightOneSpectrum (𝓞 K)) : + FinitePrimeSplitsCompletely K E v ↔ + ∃ x : Kˣ, + (∀ w : RayClassRealPlace K, + 0 < w.1.embedding_of_isReal w.2 (x : K)) ∧ + toPrincipalIdeal (𝓞 K) K x = finitePrimeFractionalIdeal v := by + rw [finitePrime_splitsCompletelyInBigHilbertClassField_iff K E hE v] + change ((⟨finitePrimeFractionalIdeal v, _⟩ : + rayClassPrimeToIdeals (narrowRayClassModulus K)) : + RayClassGroup (narrowRayClassModulus K)) = 1 ↔ _ + rw [QuotientGroup.eq_one_iff] + change finitePrimeFractionalIdeal v ∈ + rayPrincipalIdealSubgroup (narrowRayClassModulus K) ↔ _ + rw [mem_rayPrincipalIdealSubgroup_iff] + simp [IsRayCongruent, narrowRayClassModulus] + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldUnique.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldUnique.lean new file mode 100644 index 0000000000..4367c7922b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldUnique.lean @@ -0,0 +1,52 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +/-! +# Uniqueness of the big Hilbert class field inside a separable closure + +Maximality among finite-prime-unramified abelian extensions determines one +intermediate field of the fixed separable closure. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- Two big Hilbert class fields inside the same separable closure are +equal as intermediate fields. -/ +theorem bigHilbertClassFields_eq + (K : Type u) [Field K] [NumberField K] + (E F : FiniteAbelianExtension K) + (hE : IsBigHilbertClassField E) + (hF : IsBigHilbertClassField F) : + E.1 = F.1 := by + have hEF : E.1 ≤ F.1 := by + obtain ⟨f⟩ := hF.2 E hE.1 + let σ : E →ₐ[K] SeparableClosure K := F.1.val.comp f + have hσ : σ.fieldRange = E.1 := AlgHom.fieldRange_of_normal σ + rw [← hσ] + intro x hx + obtain ⟨y, rfl⟩ := AlgHom.mem_fieldRange.mp hx + exact (f y).property + have hFE : F.1 ≤ E.1 := by + obtain ⟨f⟩ := hE.2 F hF.1 + let σ : F →ₐ[K] SeparableClosure K := E.1.val.comp f + have hσ : σ.fieldRange = F.1 := AlgHom.fieldRange_of_normal σ + rw [← hσ] + intro x hx + obtain ⟨y, rfl⟩ := AlgHom.mem_fieldRange.mp hx + exact (f y).property + exact le_antisymm hEF hFE + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/NarrowRayRealizationIsBigHilbertClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/NarrowRayRealizationIsBigHilbertClassField.lean new file mode 100644 index 0000000000..2c154b4934 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/NarrowRayRealizationIsBigHilbertClassField.lean @@ -0,0 +1,52 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsRayArtinModulusProjection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldExists +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldNarrowRayRealization +/-! +# A narrow ray realization is a big Hilbert class field + +The Frobenius-normalized realization of the narrow ray class group is +maximal among finite abelian extensions unramified at finite places. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +open NumberField IsDedekindDomain + +/-- Every realization of the narrow ray class group is a big Hilbert class +field, including its maximality property. -/ +theorem narrowRayRealization_isBigHilbertClassField + (K : Type) [Field K] [NumberField K] + (R : RayClassFieldRealization K (narrowRayClassModulus K)) : + IsBigHilbertClassField R.extension := by + obtain ⟨E, hE⟩ := exists_bigHilbertClassField K + obtain ⟨S, hS⟩ := bigHilbertClassField_hasNarrowRayRealization K E hE + subst E + obtain ⟨f, _⟩ := + exists_rayArtin_modulusProjection + (le_refl (narrowRayClassModulus K)) S R + constructor + · intro v + exact R.unramifiedOutsideModulus.1 v (by simp [narrowRayClassModulus]) + · intro F hF + obtain ⟨g⟩ := hE.2 F hF + exact ⟨f.comp g⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/OrdinaryRayRealizationIsSmallHilbertClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/OrdinaryRayRealizationIsSmallHilbertClassField.lean new file mode 100644 index 0000000000..ea33257a7d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/OrdinaryRayRealizationIsSmallHilbertClassField.lean @@ -0,0 +1,61 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsRayArtinModulusProjection +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldExists +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldOrdinaryRayRealization +/-! +# An ordinary ray realization is a small Hilbert class field + +The Frobenius-normalized realization of the ordinary ray class group is +maximal among finite abelian extensions unramified at all places. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +open NumberField IsDedekindDomain + +/-- Every realization of the ordinary ray class group is a small Hilbert +class field, including its maximality property. -/ +theorem ordinaryRayRealization_isSmallHilbertClassField + (K : Type) [Field K] [NumberField K] + (R : RayClassFieldRealization K (ordinaryRayClassModulus K)) : + IsSmallHilbertClassField R.extension := by + obtain ⟨E, hE⟩ := exists_smallHilbertClassField K + obtain ⟨S, hS⟩ := smallHilbertClassField_hasOrdinaryRayRealization K E hE + subst E + obtain ⟨f, _⟩ := + exists_rayArtin_modulusProjection + (le_refl (ordinaryRayClassModulus K)) S R + constructor + · constructor + · intro v + exact R.unramifiedOutsideModulus.1 v (by simp [ordinaryRayClassModulus]) + · refine ⟨fun w => ?_⟩ + by_contra hw + have hvreal : (w.comap (algebraMap K R.extension)).IsReal := + (InfinitePlace.not_isUnramified_iff.mp hw).2 + have hbase := R.unramifiedOutsideModulus.2 + (w.comap (algebraMap K R.extension)) hvreal + (by simp [ordinaryRayClassModulus]) + exact hw (hbase w rfl) + · intro F hF + obtain ⟨g⟩ := hE.2 F hF + exact ⟨f.comp g⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallBigHilbertClassFieldIffOfNoReal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallBigHilbertClassFieldIffOfNoReal.lean new file mode 100644 index 0000000000..be91e872dd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallBigHilbertClassFieldIffOfNoReal.lean @@ -0,0 +1,60 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +public import Mathlib.NumberTheory.NumberField.InfinitePlace.Ramification +/-! +# Hilbert class fields without real places + +When the base has no real places, no extension can ramify at an infinite +place. Thus the small and big Hilbert class field conditions agree. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- Over a number field without real places, the small and big Hilbert +class field predicates on a fixed finite abelian extension coincide. -/ +theorem isSmallHilbertClassField_iff_isBig_of_noReal + (K : Type u) [Field K] [NumberField K] + [IsEmpty (RayClassRealPlace K)] + (E : FiniteAbelianExtension K) : + IsSmallHilbertClassField E ↔ IsBigHilbertClassField E := by + classical + have hInf (L : FiniteAbelianExtension K) : + IsUnramifiedAtInfinitePlaces K L := by + refine ⟨?_⟩ + intro w + by_contra hram + have hreal : (w.comap (algebraMap K L)).IsReal := + (NumberField.InfinitePlace.not_isUnramified_iff.mp hram).2 + exact isEmptyElim + (⟨w.comap (algebraMap K L), hreal⟩ : RayClassRealPlace K) + have hFinite (L : FiniteAbelianExtension K) : + IsUnramifiedAtFinitePlaces K L ↔ IsEverywhereUnramified K L := by + constructor + · intro h + exact ⟨h, hInf L⟩ + · intro h + exact h.1 + constructor + · intro hSmall + refine ⟨hSmall.1.1, ?_⟩ + intro F hF + exact hSmall.2 F ((hFinite F).mp hF) + · intro hBig + refine ⟨(hFinite E).mp hBig.1, ?_⟩ + intro F hF + exact hBig.2 F ((hFinite F).mpr hF) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldArtinEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldArtinEquiv.lean new file mode 100644 index 0000000000..ee3e4e5e63 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldArtinEquiv.lean @@ -0,0 +1,77 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMathlibArtin +/-! +# Artin isomorphism for the small Hilbert class field + +The ordinary ideal class group is isomorphic to the Galois group of the +small Hilbert class field. The displayed compatibility with arithmetic +Frobenius fixes the Artin normalization of the isomorphism. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +open NumberField IsDedekindDomain + +open SmallHilbertClassFieldComparison renaming + arithmeticSmallHilbertClassFieldGaloisEquivClassGroupOfIsSmall → + smallHilbertGaloisEquivClassGroupOfIsSmall in +open SmallHilbertClassFieldComparison renaming + arithmeticSmallHilbertClassFieldGaloisEquivClassGroup_prime → + arithmeticSmallHilbertClassFieldGaloisEquivClassGroup_prime in +/-- The ordinary class group acts through the Frobenius-normalized Artin +isomorphism on a small Hilbert class field. -/ +theorem smallHilbertClassField_artinEquiv + (K : Type) [Field K] [NumberField K] + (E : FiniteAbelianExtension K) (hE : IsSmallHilbertClassField E) : + ∃ artin : RayClassGroup (ordinaryRayClassModulus K) ≃* + (E ≃ₐ[K] E), + ∀ (v : HeightOneSpectrum (𝓞 K)) + (w : HeightOneSpectrum (𝓞 E)), + w.asIdeal.LiesOver v.asIdeal → + artin (ordinaryRayClassOfFinitePrime v) = + arithmeticFrobeniusAt (K := K) w := by + let g := + smallHilbertGaloisEquivClassGroupOfIsSmall E hE + let artin : RayClassGroup (ordinaryRayClassModulus K) ≃* (E ≃ₐ[K] E) := + (ordinaryRayClassGroupEquivClassGroup (K := K)).trans g.symm + refine ⟨artin, ?_⟩ + intro v w hw + have hunram : Algebra.IsUnramifiedAt (𝓞 K) w.asIdeal := + hE.1.1 v w.asIdeal inferInstance hw + apply g.injective + calc + g (artin (ordinaryRayClassOfFinitePrime v)) = + ClassGroup.mk K (finitePrimeFractionalIdeal v) := by + rw [show g (artin (ordinaryRayClassOfFinitePrime v)) = + ordinaryRayClassGroupEquivClassGroup + (ordinaryRayClassOfFinitePrime v) from by + simp only [artin, MulEquiv.trans_apply, g.apply_symm_apply]] + exact ordinaryRayClassGroupEquivClassGroup_prime v + _ = g (arithmeticFrobeniusAt (K := K) w) := by + rw [← GlobalClassFieldComparison.arithmeticPrimeArtin_eq_arithmeticFrobeniusAt + (K := K) (L := E) v w hw hunram] + exact + (arithmeticSmallHilbertClassFieldGaloisEquivClassGroup_prime + E hE v).symm + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldDegree.lean new file mode 100644 index 0000000000..e1a6252bbc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldDegree.lean @@ -0,0 +1,36 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +public import Mathlib.NumberTheory.NumberField.ClassNumber +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison +/-! +# Degree of the small Hilbert class field + +Any extension satisfying the intrinsic small-Hilbert-class-field property +has degree equal to the ordinary class number of the base field. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +/-- The small Hilbert class field has degree equal to the class number. -/ +theorem smallHilbertClassField_degree_eq_classNumber + (K : Type) [Field K] [NumberField K] + (E : FiniteAbelianExtension K) (hE : IsSmallHilbertClassField E) : + Module.finrank K E = NumberField.classNumber K := + GlobalClassFieldComparison.smallHilbertClassField_degree_eq_classNumber_of_isSmall K E hE + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldEmbedsInBig.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldEmbedsInBig.lean new file mode 100644 index 0000000000..c1aa8238c1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldEmbedsInBig.lean @@ -0,0 +1,33 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +/-! +# Inclusion of the small Hilbert class field in the big one + +Everywhere-unramified extensions are unramified at finite places, so the +maximality property of a big Hilbert class field supplies the embedding. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- Every small Hilbert class field embeds over the base into every big +Hilbert class field. -/ +theorem smallHilbertClassField_embedsInBig + (K : Type u) [Field K] [NumberField K] + (E : FiniteAbelianExtension K) (hE : IsSmallHilbertClassField E) + (F : FiniteAbelianExtension K) (hF : IsBigHilbertClassField F) : + Nonempty (E →ₐ[K] F) := + hF.2 E hE.1.1 + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldExists.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldExists.lean new file mode 100644 index 0000000000..a6f70be245 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldExists.lean @@ -0,0 +1,32 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison +/-! +# Existence of the small Hilbert class field + +The small Hilbert class field is characterized as an everywhere-unramified +finite abelian extension containing every other such extension. In +particular, real places are required to remain unramified. +-/ + +@[expose] public section + +open scoped NumberField + +namespace ClassFieldTheory + +/-- A maximal everywhere-unramified finite abelian extension exists. -/ +theorem exists_smallHilbertClassField + (K : Type) [Field K] [NumberField K] : + ∃ E : FiniteAbelianExtension K, IsSmallHilbertClassField E := + GlobalClassFieldComparison.exists_smallHilbertClassField K + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldLeBig.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldLeBig.lean new file mode 100644 index 0000000000..d0accc1cfa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldLeBig.lean @@ -0,0 +1,43 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +/-! +# The small Hilbert class field is a subfield of the big one + +The extensions are intermediate fields of one separable closure, so the +result is literal containment, not only an abstract embedding. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- Every small Hilbert class field is contained in every big Hilbert class +field inside the fixed separable closure. -/ +theorem smallHilbertClassField_le_big + (K : Type u) [Field K] [NumberField K] + (E F : FiniteAbelianExtension K) + (hE : IsSmallHilbertClassField E) + (hF : IsBigHilbertClassField F) : + E.1 ≤ F.1 := by + obtain ⟨f⟩ := hF.2 E hE.1.1 + let σ : E →ₐ[K] SeparableClosure K := F.1.val.comp f + have hσ : σ.fieldRange = E.1 := AlgHom.fieldRange_of_normal σ + rw [← hσ] + intro x hx + obtain ⟨y, rfl⟩ := AlgHom.mem_fieldRange.mp hx + exact (f y).property + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldOrdinaryRayRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldOrdinaryRayRealization.lean new file mode 100644 index 0000000000..df61d24eb1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldOrdinaryRayRealization.lean @@ -0,0 +1,55 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldArtinEquiv +/-! +# The small Hilbert class field as an ordinary ray class field + +Its ordinary-class Artin isomorphism and everywhere-unramifiedness give a +ray-class-field realization whose extension is the original field. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +open NumberField IsDedekindDomain + +/-- A small Hilbert class field realizes the ordinary ray class group, with +the same extension and arithmetic Frobenius normalization. -/ +theorem smallHilbertClassField_hasOrdinaryRayRealization + (K : Type) [Field K] [NumberField K] + (E : FiniteAbelianExtension K) (hE : IsSmallHilbertClassField E) : + ∃ R : RayClassFieldRealization K (ordinaryRayClassModulus K), + R.extension = E := by + obtain ⟨artin, hartin⟩ := smallHilbertClassField_artinEquiv K E hE + let R : RayClassFieldRealization K (ordinaryRayClassModulus K) := { + extension := E + unramifiedOutsideModulus := by + constructor + · intro v _ + exact hE.1.1 v + · intro _ _ _ w _ + exact hE.1.2.isUnramified w + artinEquiv := artin + artin_frobenius := by + intro v _ w hw + change artin (ordinaryRayClassOfFinitePrime v) = + arithmeticFrobeniusAt (K := K) w + exact hartin v w hw } + exact ⟨R, rfl⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrimeSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrimeSplitting.lean new file mode 100644 index 0000000000..f54eb82b99 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrimeSplitting.lean @@ -0,0 +1,49 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison +/-! +# Prime splitting in the small Hilbert class field + +A finite prime splits completely in the Hilbert class field precisely when +its fractional ideal class is trivial. Both sides use Mathlib's native +ideal-theoretic objects. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +open NumberField IsDedekindDomain + +open GlobalClassFieldComparison renaming + finitePrime_splitsCompletelyInSmallHilbertClassField_iff_principal_of_isSmall → + finitePrime_splitsCompletely_iff_principal_of_isSmall in +/-- A finite prime splits completely in a small Hilbert class field exactly +when its fractional ideal is principal. -/ +theorem finitePrime_splitsCompletelyInSmallHilbertClassField_iff_principal + (K : Type) [Field K] [NumberField K] + (E : FiniteAbelianExtension K) (hE : IsSmallHilbertClassField E) + (v : HeightOneSpectrum (𝓞 K)) : + FinitePrimeSplitsCompletely K E v ↔ + finitePrimeFractionalIdeal v ∈ + (toPrincipalIdeal (𝓞 K) K).range := by + exact + finitePrime_splitsCompletely_iff_principal_of_isSmall + K E hE v + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrincipalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrincipalization.lean new file mode 100644 index 0000000000..22cde57a79 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrincipalization.lean @@ -0,0 +1,36 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison +/-! +# Principalization in the small Hilbert class field + +The principal ideal theorem says that extension to the Hilbert class field +makes every integral ideal of the base number field principal. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +/-- Every integral ideal becomes principal in a small Hilbert class field. -/ +theorem ideals_becomePrincipalInSmallHilbertClassField + (K : Type) [Field K] [NumberField K] + (E : FiniteAbelianExtension K) (hE : IsSmallHilbertClassField E) : + ∀ I : Ideal (𝓞 K), + (I.map (algebraMap (𝓞 K) (𝓞 E))).IsPrincipal := by + exact GlobalClassFieldComparison.ideals_becomePrincipalInSmallHilbertClassField_of_isSmall K E hE + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUnique.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUnique.lean new file mode 100644 index 0000000000..7c5ac4939c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUnique.lean @@ -0,0 +1,52 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +/-! +# Uniqueness of the small Hilbert class field inside a separable closure + +The maximality condition determines an actual intermediate field, not merely +an isomorphism class. It does not distinguish a unique field automorphism. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- Two small Hilbert class fields inside the same separable closure are +equal as intermediate fields. -/ +theorem smallHilbertClassFields_eq + (K : Type u) [Field K] [NumberField K] + (E F : FiniteAbelianExtension K) + (hE : IsSmallHilbertClassField E) + (hF : IsSmallHilbertClassField F) : + E.1 = F.1 := by + have hEF : E.1 ≤ F.1 := by + obtain ⟨f⟩ := hF.2 E hE.1 + let σ : E →ₐ[K] SeparableClosure K := F.1.val.comp f + have hσ : σ.fieldRange = E.1 := AlgHom.fieldRange_of_normal σ + rw [← hσ] + intro x hx + obtain ⟨y, rfl⟩ := AlgHom.mem_fieldRange.mp hx + exact (f y).property + have hFE : F.1 ≤ E.1 := by + obtain ⟨f⟩ := hE.2 F hF.1 + let σ : F →ₐ[K] SeparableClosure K := E.1.val.comp f + have hσ : σ.fieldRange = F.1 := AlgHom.fieldRange_of_normal σ + rw [← hσ] + intro x hx + obtain ⟨y, rfl⟩ := AlgHom.mem_fieldRange.mp hx + exact (f y).property + exact le_antisymm hEF hFE + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUniqueUpToEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUniqueUpToEquiv.lean new file mode 100644 index 0000000000..b0d81224d6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUniqueUpToEquiv.lean @@ -0,0 +1,43 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldUnique +/-! +# Small Hilbert class fields are isomorphic + +The intrinsic maximality condition determines a small Hilbert class field up to +an isomorphism over the base. This asserts existence of an isomorphism, not a +distinguished or unique choice of one. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- Any two small Hilbert class fields are isomorphic over the base field. +The isomorphism itself need not be unique. -/ +theorem smallHilbertClassFields_equiv + (K : Type u) [Field K] [NumberField K] + (E F : FiniteAbelianExtension K) + (hE : IsSmallHilbertClassField E) + (hF : IsSmallHilbertClassField F) : + Nonempty (E ≃ₐ[K] F) := by + have hEF : E = F := + Subtype.ext (smallHilbertClassFields_eq K E F hE hF) + cases hEF + exact ⟨AlgEquiv.refl⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory.lean new file mode 100644 index 0000000000..3b41de8dbd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory.lean @@ -0,0 +1,22 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianGlobalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianGlobalReciprocityQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquivMk +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceCompletionLocalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceLocalGlobalNormKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinLocalValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinNormKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.MaximalAbelianGlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.TopologicalGlobalReciprocity + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/All.lean new file mode 100644 index 0000000000..a1fe648f81 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/All.lean @@ -0,0 +1,26 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianGlobalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianGlobalReciprocityQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquivMk +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceLocalGlobalNormKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinNormKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceCompletionLocalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinLocalValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.TopologicalGlobalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.MaximalAbelianGlobalArtin +/-! +# Global class field theory + +This module collects finite ideal-theoretic reciprocity and the topological +maximal-abelian statements. The latter are proved via topological comparison +with the existing restricted-product implementation. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocity.lean new file mode 100644 index 0000000000..a19d86b3e4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocity.lean @@ -0,0 +1,61 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibGlobalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison +/-! +# Finite abelian global reciprocity + +For a finite abelian extension `L/K`, global reciprocity supplies a modulus +and a surjective Artin map from its ray class group to `Gal(L/K)`. The +extension is unramified away from that modulus, and prime classes are sent to +Mathlib's arithmetic Frobenius elements. + +The statement is ideal-theoretic; its proof transports the existing idelic +reciprocity construction through the ray class comparison. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +/-- A finite abelian extension admits a Frobenius-normalized finite Artin map +through a ray class group. -/ +theorem finiteAbelianGlobalReciprocity + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] : + Nonempty (FiniteAbelianReciprocityData K L) := by + let m := GlobalClassFieldComparison.normConductorRayClassModulus K L + let hram : IsUnramifiedOutsideModulus K L m := + GlobalClassFieldComparison.normConductorRayClassModulus_unramifiedOutside K L + refine ⟨{ + modulus := m + unramifiedOutsideModulus := hram + artin := GlobalClassFieldComparison.normConductorArtin K L + artin_surjective := GlobalClassFieldComparison.normConductorArtin_surjective K L + artin_frobenius := ?_ + }⟩ + intro v hv w hw + calc + GlobalClassFieldComparison.normConductorArtin K L (rayClassOfFinitePrime m v hv) = + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) v := + GlobalClassFieldComparison.normConductorArtin_prime K L v hv + _ = arithmeticFrobeniusAt (K := K) w := + GlobalClassFieldComparison.arithmeticPrimeArtin_eq_arithmeticFrobeniusAt + (K := K) (L := L) v w hw (hram.1 v hv w.asIdeal inferInstance hw) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocityQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocityQuotient.lean new file mode 100644 index 0000000000..9e6d51e830 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocityQuotient.lean @@ -0,0 +1,42 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquiv +/-! +# Quotient form of finite abelian global reciprocity + +The kernel of a finite ray-class Artin map is exactly the relation that must +be divided out to obtain the Galois group. The modulus and Frobenius +normalization are carried by `FiniteAbelianReciprocityData`. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- A finite Artin map induces an isomorphism from its ray-class quotient to +the finite abelian Galois group. -/ +theorem finiteAbelianGlobalReciprocity_quotient + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + (D : FiniteAbelianReciprocityData K L) : + Nonempty + ((RayClassGroup D.modulus ⧸ D.artin.ker) ≃* (L ≃ₐ[K] L)) := by + exact ⟨finiteAbelianReciprocityQuotientEquiv K L D⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquivMk.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquivMk.lean new file mode 100644 index 0000000000..3688f95b13 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquivMk.lean @@ -0,0 +1,39 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquiv +/-! +# Evaluation of the finite Artin quotient isomorphism + +The induced isomorphism maps the class of a ray class to its Artin value. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- The quotient isomorphism evaluates to the original Artin map. -/ +theorem finiteAbelianReciprocityQuotientEquiv_mk + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [IsAbelianGalois K L] + (D : FiniteAbelianReciprocityData K L) + (x : RayClassGroup D.modulus) : + finiteAbelianReciprocityQuotientEquiv K L D + (QuotientGroup.mk' D.artin.ker x) = D.artin x := by + rfl + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceCompletionLocalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceCompletionLocalArtin.lean new file mode 100644 index 0000000000..99ee7f1ee7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceCompletionLocalArtin.lean @@ -0,0 +1,171 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization +public import Mathlib.Algebra.Algebra.Equiv +public import Mathlib.FieldTheory.KrullTopology +public import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +/-! +# A local Artin map on the actual extension completion + +The finite-place local Artin construction is made on an algebraic +localization inside a completion. In finite degree that localization is the +whole completion. This theorem transports the independent local Artin map +to the actual completion and records its image and kernel in public types. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +open GlobalClassFieldTheory.Reciprocity renaming + chosenFinitePlaceArtinMonoidHom_eq_one_iff_chosenLocalNorm → + chosenFinitePlaceArtinMonoidHom_eq_one_iff_chosenLocalNorm in +/-- At a finite place of an abelian number-field extension, one can choose +an extension absolute value and a surjective local Artin map on its actual +completion. Its kernel is precisely the determinant-norm image of the local +tensor algebra. This map is constructed from local reciprocity, independently +of any ray-class Artin map. -/ +theorem exists_finitePlaceCompletionLocalArtin + (K L : Type) + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + (v : HeightOneSpectrum (𝓞 K)) : + let vK := NumberField.HeightOneSpectrum.adicAbv K v + ∃ (w : ExtendingAbsoluteValue vK L) + (halg : Algebra vK.Completion w.1.Completion), + letI := halg + ∃ localArtin : (v.adicCompletion K)ˣ →* + (w.1.Completion ≃ₐ[vK.Completion] w.1.Completion), + Continuous localArtin ∧ Function.Surjective localArtin ∧ + localArtin.ker = finitePlaceTensorNormSubgroup K L v := by + classical + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := RayClass.adicAbv_isNontrivial v + let w : ExtendingAbsoluteValue vK L := + _root_.chosenFinitePlaceExtension (L := L) v + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let halg : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let : Algebra vK.Completion w.1.Completion := halg + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let : Algebra vK.Completion E := + GlobalClassFieldTheory.Reciprocity.finitePlaceLocalArtinLocalizedAlgebra v w + let eC : E ≃ₐ[vK.Completion] w.1.Completion := + AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion vK hvK w + let eAut : (E ≃ₐ[vK.Completion] E) ≃* + (w.1.Completion ≃ₐ[vK.Completion] w.1.Completion) := + AlgEquiv.autCongr eC + let localE : (v.adicCompletion K)ˣ →* (E ≃ₐ[vK.Completion] E) := + GlobalClassFieldTheory.Reciprocity.finitePlaceLocalArtinMonoidHom v w + let localArtin : (v.adicCompletion K)ˣ →* + (w.1.Completion ≃ₐ[vK.Completion] w.1.Completion) := + eAut.toMonoidHom.comp localE + let eD : HilbertRamification.absoluteValueDecompositionGroup K w.1 ≃* + (E ≃ₐ[vK.Completion] E) := + HilbertRamification.decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w + have hfactor (x : (v.adicCompletion K)ˣ) : + GlobalClassFieldTheory.Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x = + (HilbertRamification.absoluteValueDecompositionGroup K w.1).subtype + (eD.symm (localE x)) := by + change GlobalClassFieldTheory.Reciprocity.finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v w x = _ + rw [GlobalClassFieldTheory.Reciprocity.finitePlaceArtinMonoidHomOfExtension_factor, + MonoidHom.comp_apply] + rfl + have hLocalESurj : Function.Surjective localE := by + intro τ + let δ := eD.symm τ + have hδ : (δ : L ≃ₐ[K] L) ∈ + (GlobalClassFieldTheory.Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).range := by + rw [GlobalClassFieldTheory.Reciprocity.chosenFinitePlaceArtinMonoidHom_range] + exact δ.property + obtain ⟨x, hx⟩ := hδ + refine ⟨x, ?_⟩ + have hxD : eD.symm (localE x) = δ := by + apply Subtype.coe_injective + calc + ((eD.symm (localE x) : + HilbertRamification.absoluteValueDecompositionGroup K w.1) : + L ≃ₐ[K] L) = + GlobalClassFieldTheory.Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x := (hfactor x).symm + _ = (δ : L ≃ₐ[K] L) := hx + change eD.symm (localE x) = eD.symm τ at hxD + exact eD.symm.injective hxD + have hLocalKer : localArtin.ker = finitePlaceTensorNormSubgroup K L v := by + apply SetLike.ext + intro x + change localArtin x = 1 ↔ x ∈ finitePlaceTensorNormSubgroup K L v + have hTransport : localArtin x = 1 ↔ localE x = 1 := by + constructor + · intro hx + apply eAut.injective + change eAut (localE x) = 1 at hx + simpa only [map_one] using hx + · intro hx + change eAut (localE x) = 1 + rw [hx, map_one] + have hGlobal : localE x = 1 ↔ + GlobalClassFieldTheory.Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x = 1 := by + constructor + · intro hx + rw [hfactor x, hx, map_one, map_one] + · intro hx + rw [hfactor x] at hx + have hxD : eD.symm (localE x) = 1 := by + apply Subtype.coe_injective + exact hx + apply eD.symm.injective + simpa only [map_one] using hxD + calc + localArtin x = 1 ↔ localE x = 1 := hTransport + _ ↔ GlobalClassFieldTheory.Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x = 1 := hGlobal + _ ↔ x ∈ _root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v := + chosenFinitePlaceArtinMonoidHom_eq_one_iff_chosenLocalNorm + v x + _ ↔ x ∈ finitePlaceTensorNormSubgroup K L v := by + rw [← finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup + (K := K) (L := L) v] + rfl + have hLocalKerOpen : IsOpen (localArtin.ker : Set (v.adicCompletion K)ˣ) := by + rw [hLocalKer] + change IsOpen ((_root_.localTensorNorm (K := K) (L := L) v).range : + Set (v.adicCompletion K)ˣ) + rw [finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup + (K := K) (L := L) v] + exact _root_.chosenFinitePlaceLocalNormSubgroup_isOpen + (K := K) (L := L) v + have hLocalContinuous : Continuous localArtin := by + apply continuous_of_continuousAt_one localArtin + apply tendsto_nhds_of_eventually_eq + filter_upwards [hLocalKerOpen.mem_nhds (by simp)] with x hx + change localArtin x = 1 at hx + simpa only [map_one] using hx + exact ⟨w, halg, localArtin, hLocalContinuous, + eAut.surjective.comp hLocalESurj, hLocalKer⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceLocalGlobalNormKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceLocalGlobalNormKernel.lean new file mode 100644 index 0000000000..8dc38bc899 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceLocalGlobalNormKernel.lean @@ -0,0 +1,92 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.NumberTheory.NumberField.AdeleRing +public import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +public import Mathlib.RingTheory.Norm.Basic +public import Mathlib.RingTheory.TensorProduct.Basic +/-! +# Finite-place norm kernels of a global Artin map + +This is a Mathlib-typed local--global compatibility statement. Restricting +one global Artin map along Mathlib's one-place idèle-class homomorphism has +the local tensor-norm group as its kernel. It specifies the kernel at each +finite place, not yet the value normalization against a separately chosen +local Artin map or the real-place comparison. + +The proof transports the established restricted-product reciprocity map +through the algebraic comparison with Mathlib's idèle class group. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +open GlobalClassFieldTheory.Reciprocity renaming + chosenFinitePlaceArtinMonoidHom_eq_one_iff_chosenLocalNorm → + chosenFinitePlaceArtinMonoidHom_eq_one_iff_chosenLocalNorm in +/-- A finite abelian extension has one global Artin homomorphism whose +restriction to each finite completion has precisely the tensor-norm kernel. -/ +theorem exists_finiteAbelianGlobalArtin_finitePlaceNormKernel + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] : + ∃ artin : NumberField.IdeleClassGroup (𝓞 K) K →* + (L ≃ₐ[K] L), + Function.Surjective artin ∧ + ∀ (v : HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ), + artin (NumberField.IdeleClassGroup.ofAdicCompletion (𝓞 K) K v x) = 1 ↔ + x ∈ finitePlaceTensorNormSubgroup K L v := by + let e := IdeleGroup.ideleClassGroupEquivMathlib K + let artin : NumberField.IdeleClassGroup (𝓞 K) K →* (L ≃ₐ[K] L) := + (GlobalClassFieldTheory.Reciprocity.globalNormResidueMonoidHom K L).comp + e.symm.toMonoidHom + refine ⟨artin, ?_, ?_⟩ + · exact (GlobalClassFieldTheory.Reciprocity.globalNormResidueMonoidHom_surjective + K L).comp e.symm.surjective + · intro v x + have hclass : + e.symm (NumberField.IdeleClassGroup.ofAdicCompletion (𝓞 K) K v x) = + IdeleGroup.finitePlaceIdeleClass v x := by + apply e.injective + rw [e.apply_symm_apply] + exact (IdeleGroup.ideleClassGroupEquivMathlib_finitePlaceIdeleClass + K v x).symm + change GlobalClassFieldTheory.Reciprocity.globalNormResidueMonoidHom K L + (e.symm (NumberField.IdeleClassGroup.ofAdicCompletion (𝓞 K) K v x)) = + 1 ↔ _ + rw [hclass] + have hcompat : + GlobalClassFieldTheory.Reciprocity.globalNormResidueMonoidHom K L + (IdeleGroup.finitePlaceIdeleClass v x) = + GlobalClassFieldTheory.Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x := by + simpa only [MonoidHom.comp_apply] using DFunLike.congr_fun + (GlobalClassFieldTheory.Reciprocity.globalNormResidueMonoidHom_comp_finitePlaceIdeleClass + (K := K) (L := L) v) x + rw [hcompat] + rw [chosenFinitePlaceArtinMonoidHom_eq_one_iff_chosenLocalNorm, + ← finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup (K := K) (L := L) v] + change x ∈ (localTensorNorm (K := K) (L := L) v).range ↔ + x ∈ finitePlaceTensorNormSubgroup K L v + rfl + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinDecomposition.lean new file mode 100644 index 0000000000..06cf184507 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinDecomposition.lean @@ -0,0 +1,152 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction +public import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +/-! +# Ray Artin values at a finite place + +The canonical one-place map into an ideal-theoretic ray class group has the +actual local norm subgroup as its Artin kernel. Its Artin values preserve +the absolute-value class of one extension of that place to the top field, +including when the place divides the ray modulus. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +open GlobalClassFieldTheory.GlobalClassFields renaming + rayArtin_comp_ideleClass_eq_arithmeticGlobalNormResidue → + rayArtin_comp_ideleClass_eq_arithmeticGlobalNormResidue in +open GlobalClassFieldTheory.Reciprocity renaming + arithmeticGlobalNormResidueMonoidHom_comp_finitePlaceIdeleClass → + arithmeticGlobalNormResidueMonoidHom_comp_finitePlaceIdeleClass in +/-- A Frobenius-normalized ray Artin map restricts at every finite place to +the local norm quotient and lands in a decomposition group. The extension +absolute value and the local-to-ray map are chosen independently of `D`'s +Artin values. -/ +theorem exists_finitePlaceRayArtin_decomposition + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + (D : FiniteAbelianReciprocityData K L) + (v : HeightOneSpectrum (𝓞 K)) : + ∃ (w : ExtendingAbsoluteValue + (NumberField.HeightOneSpectrum.adicAbv K v) L) + (ι : (v.adicCompletion K)ˣ →* RayClassGroup D.modulus), + (D.artin.comp ι).ker = finitePlaceTensorNormSubgroup K L v ∧ + ∀ (x : (v.adicCompletion K)ˣ) (y : L), + w.1 ((D.artin (ι x)) y) < 1 ↔ w.1 y < 1 := by + classical + let m := GlobalClassFieldComparison.rayClassModulusToOriginal K D.modulus + let e := GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K D.modulus + let a : RayClass.RayClassGroup m →* (L ≃ₐ[K] L) := + D.artin.comp e.symm.toMonoidHom + have hprime : + ∀ (p : HeightOneSpectrum (𝓞 K)) + (_hp : p ∉ m.finitePart.support), + a (QuotientGroup.mk' m.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele p))) = + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) p := by + intro p hp + have hpD : p ∉ D.modulus.finitePart.support := hp + change D.artin (e.symm (QuotientGroup.mk' m.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele p)))) = _ + rw [← GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele_prime + K D.modulus p hpD] + have hFrob : + D.artin (rayClassOfFinitePrime D.modulus p hpD) = + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) p := by + let w₀ := _root_.chosenFinitePlaceExtension (L := L) p + let w := _root_.finitePlaceExtensionCentre (K := K) (L := L) p w₀ + have hw : w.asIdeal.LiesOver p.asIdeal := + _root_.finitePlaceExtensionCentre_liesOver + (K := K) (L := L) p w₀ + have hunram : Algebra.IsUnramifiedAt (𝓞 K) w.asIdeal := + (D.unramifiedOutsideModulus.1 p hpD) w.asIdeal inferInstance hw + calc + D.artin (rayClassOfFinitePrime D.modulus p hpD) = + arithmeticFrobeniusAt (K := K) w := + D.artin_frobenius p hpD w hw + _ = GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) p := + (GlobalClassFieldComparison.arithmeticPrimeArtin_eq_arithmeticFrobeniusAt + (K := K) (L := L) p w hw hunram).symm + simpa only [e, MulEquiv.symm_apply_apply] using hFrob + let w : ExtendingAbsoluteValue + (NumberField.HeightOneSpectrum.adicAbv K v) L := + _root_.chosenFinitePlaceExtension (L := L) v + let ι : (v.adicCompletion K)ˣ →* RayClassGroup D.modulus := + e.symm.toMonoidHom.comp + ((QuotientGroup.mk' m.congruenceSubgroup).comp + (IdeleGroup.finitePlaceIdeleClass v)) + have hvalue (x : (v.adicCompletion K)ˣ) : + D.artin (ι x) = + GlobalClassFieldTheory.Reciprocity.arithmeticChosenFinitePlaceArtinMonoidHom + K L v x := by + calc + D.artin (ι x) = + GlobalClassFieldTheory.Reciprocity.arithmeticGlobalNormResidueMonoidHom + K L (IdeleGroup.finitePlaceIdeleClass v x) := + rayArtin_comp_ideleClass_eq_arithmeticGlobalNormResidue + m a hprime (IdeleGroup.finitePlaceIdeleClass v x) + _ = GlobalClassFieldTheory.Reciprocity.arithmeticChosenFinitePlaceArtinMonoidHom + K L v x := by + exact DFunLike.congr_fun + (arithmeticGlobalNormResidueMonoidHom_comp_finitePlaceIdeleClass + (K := K) (L := L) v) x + refine ⟨w, ι, ?_, ?_⟩ + · ext x + change D.artin (ι x) = 1 ↔ + x ∈ finitePlaceTensorNormSubgroup K L v + rw [hvalue x, + GlobalClassFieldTheory.Reciprocity.arithmeticChosenFinitePlaceArtinMonoidHom_apply, + inv_eq_one, + GlobalClassFieldTheory.Reciprocity.chosenFinitePlaceArtinMonoidHom_eq_one_iff_chosenLocalNorm, + ← finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup + (K := K) (L := L) v] + rfl + · intro x y + rw [hvalue x, + GlobalClassFieldTheory.Reciprocity.arithmeticChosenFinitePlaceArtinMonoidHom_apply] + have hgeo : + GlobalClassFieldTheory.Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x ∈ + HilbertRamification.absoluteValueDecompositionGroup K w.1 := by + change GlobalClassFieldTheory.Reciprocity.finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v w x ∈ _ + rw [GlobalClassFieldTheory.Reciprocity.finitePlaceArtinMonoidHomOfExtension_factor, + MonoidHom.comp_apply] + change ((HilbertRamification.absoluteValueDecompositionGroup K w.1).subtype + _) ∈ _ + exact Subtype.property _ + have hinv := + (HilbertRamification.absoluteValueDecompositionGroup K w.1).inv_mem hgeo + exact hinv y + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinLocalValue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinLocalValue.lean new file mode 100644 index 0000000000..4b2da78442 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinLocalValue.lean @@ -0,0 +1,307 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization +public import Mathlib.Algebra.Algebra.Equiv +public import Mathlib.FieldTheory.KrullTopology +public import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +/-! +# The finite-place ray Artin value diagram + +The ray map comes from the one-place idèle class, while the local Artin map +comes from local reciprocity on the completed extension. The transport from +local automorphisms to the global Galois group is characterized on the dense +copy of `L`. Arithmetic ray values are inverse to the geometric local Artin +values under this transport. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +private theorem finiteAbelianReciprocityData_prime_formula + (K L : Type) [Field K] [NumberField K] [Field L] [NumberField L] + [Algebra K L] [FiniteDimensional K L] [IsAbelianGalois K L] + (D : FiniteAbelianReciprocityData K L) : + let m := GlobalClassFieldComparison.rayClassModulusToOriginal K D.modulus + let e := GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K D.modulus + let a : RayClass.RayClassGroup m →* (L ≃ₐ[K] L) := + D.artin.comp e.symm.toMonoidHom + ∀ (p : HeightOneSpectrum (𝓞 K)) + (_hp : p ∉ m.finitePart.support), + a (QuotientGroup.mk' m.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele p))) = + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) p := by + classical + let m := GlobalClassFieldComparison.rayClassModulusToOriginal K D.modulus + let e := GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K D.modulus + let a : RayClass.RayClassGroup m →* (L ≃ₐ[K] L) := + D.artin.comp e.symm.toMonoidHom + dsimp only + intro p hp + have hpD : p ∉ D.modulus.finitePart.support := hp + change D.artin (e.symm (QuotientGroup.mk' m.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele p)))) = _ + rw [← GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele_prime + K D.modulus p hpD] + have hFrob : + D.artin (rayClassOfFinitePrime D.modulus p hpD) = + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) p := by + let w₀ := _root_.chosenFinitePlaceExtension (L := L) p + let w' := _root_.finitePlaceExtensionCentre (K := K) (L := L) p w₀ + have hw : w'.asIdeal.LiesOver p.asIdeal := + _root_.finitePlaceExtensionCentre_liesOver + (K := K) (L := L) p w₀ + have hunram : Algebra.IsUnramifiedAt (𝓞 K) w'.asIdeal := + (D.unramifiedOutsideModulus.1 p hpD) w'.asIdeal inferInstance hw + calc + D.artin (rayClassOfFinitePrime D.modulus p hpD) = + arithmeticFrobeniusAt (K := K) w' := + D.artin_frobenius p hpD w' hw + _ = GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) p := + (GlobalClassFieldComparison.arithmeticPrimeArtin_eq_arithmeticFrobeniusAt + (K := K) (L := L) p w' hw hunram).symm + simpa only [e, MulEquiv.symm_apply_apply] using hFrob + +open GlobalClassFieldTheory.GlobalClassFields renaming + rayArtin_comp_ideleClass_eq_arithmeticGlobalNormResidue → + rayArtin_comp_ideleClass_eq_arithmeticGlobalNormResidue in +open GlobalClassFieldTheory.Reciprocity renaming + arithmeticGlobalNormResidueMonoidHom_comp_finitePlaceIdeleClass → + arithmeticGlobalNormResidueMonoidHom_comp_finitePlaceIdeleClass in +/-- At every finite place, including those in the modulus, the +Frobenius-normalized ray Artin value equals the transported inverse of the +independently constructed local Artin value. The transport is injective and +has its standard action on the canonical copy of `L`; the local and ray +kernels are the actual local tensor-norm subgroup. -/ +theorem exists_finitePlaceRayArtin_localValueDiagram + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + (D : FiniteAbelianReciprocityData K L) + (v : HeightOneSpectrum (𝓞 K)) : + let vK := NumberField.HeightOneSpectrum.adicAbv K v + ∃ (w : ExtendingAbsoluteValue vK L) + (halg : Algebra vK.Completion w.1.Completion), + letI := halg + ∃ (ι : (v.adicCompletion K)ˣ →* RayClassGroup D.modulus) + (localArtin : (v.adicCompletion K)ˣ →* + (w.1.Completion ≃ₐ[vK.Completion] w.1.Completion)) + (transport : (w.1.Completion ≃ₐ[vK.Completion] w.1.Completion) →* + (L ≃ₐ[K] L)), + Continuous localArtin ∧ + Function.Surjective localArtin ∧ + Function.Injective transport ∧ + (∀ γ : L ≃ₐ[K] L, + (∃ σ, transport σ = γ) ↔ + ∀ y : L, w.1 (γ y) < 1 ↔ w.1 y < 1) ∧ + localArtin.ker = finitePlaceTensorNormSubgroup K L v ∧ + (D.artin.comp ι).ker = finitePlaceTensorNormSubgroup K L v ∧ + (∀ (σ : w.1.Completion ≃ₐ[vK.Completion] w.1.Completion) (y : L), + algebraMap L w.1.Completion ((transport σ) y) = + σ (algebraMap L w.1.Completion y)) ∧ + ∀ x : (v.adicCompletion K)ˣ, + D.artin (ι x) = (transport (localArtin x))⁻¹ := by + classical + let vK := NumberField.HeightOneSpectrum.adicAbv K v + let hvK : vK.IsNontrivial := RayClass.adicAbv_isNontrivial v + let w : ExtendingAbsoluteValue vK L := _root_.chosenFinitePlaceExtension (L := L) v + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let halg : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let : Algebra vK.Completion w.1.Completion := halg + let E := AlgebraicNumberTheory.Valuations.LocalizedCompletion vK w + let : Algebra vK.Completion E := + GlobalClassFieldTheory.Reciprocity.finitePlaceLocalArtinLocalizedAlgebra v w + let eC : E ≃ₐ[vK.Completion] w.1.Completion := + AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion vK hvK w + let eAut : (E ≃ₐ[vK.Completion] E) ≃* + (w.1.Completion ≃ₐ[vK.Completion] w.1.Completion) := + AlgEquiv.autCongr eC + let localE : (v.adicCompletion K)ˣ →* (E ≃ₐ[vK.Completion] E) := + GlobalClassFieldTheory.Reciprocity.finitePlaceLocalArtinMonoidHom v w + let localArtin : (v.adicCompletion K)ˣ →* + (w.1.Completion ≃ₐ[vK.Completion] w.1.Completion) := + eAut.toMonoidHom.comp localE + let S := HilbertRamification.absoluteValueDecompositionGroup K w.1 + let eD : S ≃* (E ≃ₐ[vK.Completion] E) := + HilbertRamification.decompositionGroupEquivAlgebraicLocalizationAut + vK hvK w + let transport : (w.1.Completion ≃ₐ[vK.Completion] w.1.Completion) →* + (L ≃ₐ[K] L) := + S.subtype.comp (eD.symm.toMonoidHom.comp eAut.symm.toMonoidHom) + let m := GlobalClassFieldComparison.rayClassModulusToOriginal K D.modulus + let e := GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K D.modulus + let a : RayClass.RayClassGroup m →* (L ≃ₐ[K] L) := + D.artin.comp e.symm.toMonoidHom + have hprime := finiteAbelianReciprocityData_prime_formula K L D + let ι : (v.adicCompletion K)ˣ →* RayClassGroup D.modulus := + e.symm.toMonoidHom.comp + ((QuotientGroup.mk' m.congruenceSubgroup).comp + (IdeleGroup.finitePlaceIdeleClass v)) + have hvalue (x : (v.adicCompletion K)ˣ) : + D.artin (ι x) = + GlobalClassFieldTheory.Reciprocity.arithmeticChosenFinitePlaceArtinMonoidHom + K L v x := by + calc + D.artin (ι x) = + GlobalClassFieldTheory.Reciprocity.arithmeticGlobalNormResidueMonoidHom + K L (IdeleGroup.finitePlaceIdeleClass v x) := + rayArtin_comp_ideleClass_eq_arithmeticGlobalNormResidue + m a hprime (IdeleGroup.finitePlaceIdeleClass v x) + _ = GlobalClassFieldTheory.Reciprocity.arithmeticChosenFinitePlaceArtinMonoidHom + K L v x := by + exact DFunLike.congr_fun + (arithmeticGlobalNormResidueMonoidHom_comp_finitePlaceIdeleClass + (K := K) (L := L) v) x + have hfactor (x : (v.adicCompletion K)ˣ) : + GlobalClassFieldTheory.Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x = S.subtype (eD.symm (localE x)) := by + change GlobalClassFieldTheory.Reciprocity.finitePlaceArtinMonoidHomOfExtension + (K := K) (L := L) v w x = _ + rw [GlobalClassFieldTheory.Reciprocity.finitePlaceArtinMonoidHomOfExtension_factor, + MonoidHom.comp_apply] + rfl + have hLocalESurj : Function.Surjective localE := by + intro τ + let δ := eD.symm τ + have hδ : (δ : L ≃ₐ[K] L) ∈ + (GlobalClassFieldTheory.Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v).range := by + rw [GlobalClassFieldTheory.Reciprocity.chosenFinitePlaceArtinMonoidHom_range] + exact δ.property + obtain ⟨x, hx⟩ := hδ + refine ⟨x, ?_⟩ + have hxD : eD.symm (localE x) = δ := by + apply Subtype.coe_injective + calc + ((eD.symm (localE x) : S) : L ≃ₐ[K] L) = + GlobalClassFieldTheory.Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x := (hfactor x).symm + _ = (δ : L ≃ₐ[K] L) := hx + change eD.symm (localE x) = eD.symm τ at hxD + exact eD.symm.injective hxD + have hTransportInj : Function.Injective transport := + Subtype.val_injective.comp (eD.symm.injective.comp eAut.symm.injective) + have hTransportRange (γ : L ≃ₐ[K] L) : + (∃ σ, transport σ = γ) ↔ + ∀ y : L, w.1 (γ y) < 1 ↔ w.1 y < 1 := by + constructor + · rintro ⟨σ, rfl⟩ + exact (eD.symm (eAut.symm σ)).property + · intro hγ + let δ : S := ⟨γ, hγ⟩ + refine ⟨eAut (eD δ), ?_⟩ + change S.subtype (eD.symm (eAut.symm (eAut (eD δ)))) = γ + rw [eAut.symm_apply_apply, eD.symm_apply_apply] + change (δ : L ≃ₐ[K] L) = γ + rfl + let j : L →+* E := AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + have hemb (y : L) : eC (j y) = algebraMap L w.1.Completion y := by + calc + eC (j y) = ((j y : E) : w.1.Completion) := + AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion_coe + vK hvK w (j y) + _ = AbsoluteValue.toCompletion w.1 y := + AbsoluteValue.toAlgebraicLocalization_apply vK w.1 w.2 y + _ = algebraMap L w.1.Completion y := + AbsoluteValue.toCompletion_eq_algebraMap w.1 y + have hTransportEval + (σ : w.1.Completion ≃ₐ[vK.Completion] w.1.Completion) (y : L) : + algebraMap L w.1.Completion ((transport σ) y) = + σ (algebraMap L w.1.Completion y) := by + let δ : S := eD.symm (eAut.symm σ) + have hloc : eD δ (j y) = j ((δ : L ≃ₐ[K] L) y) := + HilbertRamification.localizationRamificationGroups_decompositionGroupEquiv_toLocalization + vK hvK w δ y + calc + algebraMap L w.1.Completion ((transport σ) y) = + eC (j ((δ : L ≃ₐ[K] L) y)) := by + change algebraMap L w.1.Completion ((δ : L ≃ₐ[K] L) y) = _ + exact (hemb _).symm + _ = eC (eD δ (j y)) := congrArg eC hloc.symm + _ = σ (eC (j y)) := by + have hδ : eD δ = eAut.symm σ := eD.apply_symm_apply _ + rw [hδ] + change eC (eC.symm (σ (eC (j y)))) = _ + exact eC.apply_symm_apply _ + _ = σ (algebraMap L w.1.Completion y) := congrArg σ (hemb y) + have hDiagram (x : (v.adicCompletion K)ˣ) : + D.artin (ι x) = (transport (localArtin x))⁻¹ := by + calc + D.artin (ι x) = + GlobalClassFieldTheory.Reciprocity.arithmeticChosenFinitePlaceArtinMonoidHom + K L v x := hvalue x + _ = (GlobalClassFieldTheory.Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x)⁻¹ := + GlobalClassFieldTheory.Reciprocity.arithmeticChosenFinitePlaceArtinMonoidHom_apply + K L v x + _ = (transport (localArtin x))⁻¹ := by + congr 1 + have hRayKer : (D.artin.comp ι).ker = finitePlaceTensorNormSubgroup K L v := by + ext x + change D.artin (ι x) = 1 ↔ x ∈ finitePlaceTensorNormSubgroup K L v + rw [hvalue x, + GlobalClassFieldTheory.Reciprocity.arithmeticChosenFinitePlaceArtinMonoidHom_apply, + inv_eq_one, + GlobalClassFieldTheory.Reciprocity.chosenFinitePlaceArtinMonoidHom_eq_one_iff_chosenLocalNorm, + ← finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup + (K := K) (L := L) v] + rfl + have hLocalKer : localArtin.ker = finitePlaceTensorNormSubgroup K L v := by + ext x + change localArtin x = 1 ↔ x ∈ finitePlaceTensorNormSubgroup K L v + calc + localArtin x = 1 ↔ transport (localArtin x) = 1 := + (hTransportInj.eq_iff' (map_one transport)).symm + _ ↔ D.artin (ι x) = 1 := by + rw [hDiagram x, inv_eq_one] + _ ↔ x ∈ finitePlaceTensorNormSubgroup K L v := by + change x ∈ (D.artin.comp ι).ker ↔ + x ∈ finitePlaceTensorNormSubgroup K L v + rw [hRayKer] + have hLocalKerOpen : IsOpen (localArtin.ker : Set (v.adicCompletion K)ˣ) := by + rw [hLocalKer] + change IsOpen ((_root_.localTensorNorm (K := K) (L := L) v).range : + Set (v.adicCompletion K)ˣ) + rw [finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup + (K := K) (L := L) v] + exact _root_.chosenFinitePlaceLocalNormSubgroup_isOpen + (K := K) (L := L) v + have hLocalContinuous : Continuous localArtin := by + apply continuous_of_continuousAt_one localArtin + apply tendsto_nhds_of_eventually_eq + filter_upwards [hLocalKerOpen.mem_nhds (by simp)] with x hx + change localArtin x = 1 at hx + simpa only [map_one] using hx + exact ⟨w, halg, ι, localArtin, transport, + hLocalContinuous, eAut.surjective.comp hLocalESurj, hTransportInj, + hTransportRange, hLocalKer, hRayKer, hTransportEval, hDiagram⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinNormKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinNormKernel.lean new file mode 100644 index 0000000000..8160457df8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinNormKernel.lean @@ -0,0 +1,133 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization +/-! +# The local kernel of a ray-class Artin map + +The local-to-ray map is constructed from a one-place idèle class. This +statement compares the kernel of the resulting ray-class Artin map with the +determinant norm of the entire local tensor algebra, at every finite place, +including places in the modulus. It is a kernel comparison; the stronger +equality of the Artin values is a separate normalization question. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +open GlobalClassFieldTheory.Reciprocity renaming + chosenFinitePlaceArtinMonoidHom_eq_one_iff_chosenLocalNorm → + chosenFinitePlaceArtinMonoidHom_eq_one_iff_chosenLocalNorm in +/-- At every finite place, including a ramified place, the ray-class Artin +map has the local tensor-norm subgroup as its kernel after the canonical +one-place map into the ray class group. -/ +theorem exists_finitePlaceRayArtin_normKernel + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + (D : FiniteAbelianReciprocityData K L) + (v : HeightOneSpectrum (𝓞 K)) : + ∃ ι : (v.adicCompletion K)ˣ →* RayClassGroup D.modulus, + (D.artin.comp ι).ker = finitePlaceTensorNormSubgroup K L v := by + let m := GlobalClassFieldComparison.rayClassModulusToOriginal K D.modulus + let e := GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K D.modulus + let a : RayClass.RayClassGroup m →* (L ≃ₐ[K] L) := + D.artin.comp e.symm.toMonoidHom + have hprime : + ∀ (p : HeightOneSpectrum (𝓞 K)) + (_hp : p ∉ m.finitePart.support), + a (QuotientGroup.mk' m.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele p))) = + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) p := by + intro p hp + have hpD : p ∉ D.modulus.finitePart.support := hp + change D.artin (e.symm (QuotientGroup.mk' m.congruenceSubgroup + (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) + (IdeleGroup.finitePrimeIdele p)))) = _ + rw [← GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele_prime + K D.modulus p hpD] + have hFrob : + D.artin (rayClassOfFinitePrime D.modulus p hpD) = + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) p := by + let w₀ := _root_.chosenFinitePlaceExtension (L := L) p + let w := _root_.finitePlaceExtensionCentre (K := K) (L := L) p w₀ + have hw : w.asIdeal.LiesOver p.asIdeal := + _root_.finitePlaceExtensionCentre_liesOver + (K := K) (L := L) p w₀ + have hunram : Algebra.IsUnramifiedAt (𝓞 K) w.asIdeal := + (D.unramifiedOutsideModulus.1 p hpD) w.asIdeal inferInstance hw + calc + D.artin (rayClassOfFinitePrime D.modulus p hpD) = + arithmeticFrobeniusAt (K := K) w := + D.artin_frobenius p hpD w hw + _ = GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin + (K := K) (L := L) p := + (GlobalClassFieldComparison.arithmeticPrimeArtin_eq_arithmeticFrobeniusAt + (K := K) (L := L) p w hw hunram).symm + simpa only [e, MulEquiv.symm_apply_apply] using hFrob + have hNorm := + GlobalClassFieldTheory.GlobalClassFields.rayModulus_normSubgroup_eq_artinKer_preimage + m a hprime + let ι : (v.adicCompletion K)ˣ →* RayClassGroup D.modulus := + e.symm.toMonoidHom.comp + ((QuotientGroup.mk' m.congruenceSubgroup).comp + (IdeleGroup.finitePlaceIdeleClass v)) + refine ⟨ι, ?_⟩ + ext x + change D.artin + (e.symm (QuotientGroup.mk' m.congruenceSubgroup + (IdeleGroup.finitePlaceIdeleClass v x))) = 1 ↔ + x ∈ finitePlaceTensorNormSubgroup K L v + have hRay : + D.artin + (e.symm (QuotientGroup.mk' m.congruenceSubgroup + (IdeleGroup.finitePlaceIdeleClass v x))) = 1 ↔ + IdeleGroup.finitePlaceIdeleClass v x ∈ + (_root_.ideleClassNorm K L).range := by + rw [hNorm] + change a (QuotientGroup.mk' m.congruenceSubgroup + (IdeleGroup.finitePlaceIdeleClass v x)) = 1 ↔ _ + rfl + have hLocal : + IdeleGroup.finitePlaceIdeleClass v x ∈ + (_root_.ideleClassNorm K L).range ↔ + x ∈ finitePlaceTensorNormSubgroup K L v := by + rw [← GlobalClassFieldTheory.Reciprocity.globalNormResidueMonoidHom_ker] + change GlobalClassFieldTheory.Reciprocity.globalNormResidueMonoidHom K L + (IdeleGroup.finitePlaceIdeleClass v x) = 1 ↔ _ + have hcompat := DFunLike.congr_fun + (GlobalClassFieldTheory.Reciprocity.globalNormResidueMonoidHom_comp_finitePlaceIdeleClass + (K := K) (L := L) v) x + rw [show GlobalClassFieldTheory.Reciprocity.globalNormResidueMonoidHom K L + (IdeleGroup.finitePlaceIdeleClass v x) = + GlobalClassFieldTheory.Reciprocity.chosenFinitePlaceArtinMonoidHom + (K := K) (L := L) v x from hcompat] + rw [chosenFinitePlaceArtinMonoidHom_eq_one_iff_chosenLocalNorm, + ← finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup + (K := K) (L := L) v] + change x ∈ (localTensorNorm (K := K) (L := L) v).range ↔ + x ∈ finitePlaceTensorNormSubgroup K L v + rfl + exact hRay.trans hLocal + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/MaximalAbelianGlobalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/MaximalAbelianGlobalArtin.lean new file mode 100644 index 0000000000..d8dd7c1653 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/MaximalAbelianGlobalArtin.lean @@ -0,0 +1,59 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IsMaximalAbelianGlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.TopologicalGlobalReciprocity +/-! +# The maximal abelian global Artin map + +This map from Mathlib's idèle class group to Mathlib's abelianized absolute +Galois group is continuous, surjective, and has the identity component as +its kernel. It is induced by a topological reciprocity isomorphism. The +statement does not yet fix Frobenius normalization at finite levels, so it +does not assert uniqueness of the map. +-/ + +@[expose] public section + +open scoped NumberField + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- A continuous surjective global Artin map with the expected kernel exists. -/ +theorem maximalAbelianGlobalArtin + (K : Type u) [Field K] [NumberField K] : + ∃ artin : NumberField.IdeleClassGroup (𝓞 K) K →ₜ* + Field.absoluteGaloisGroupAbelianization K, + IsMaximalAbelianGlobalArtin K artin := by + obtain ⟨e⟩ := topologicalGlobalReciprocity K + let H : Subgroup (NumberField.IdeleClassGroup (𝓞 K) K) := + Subgroup.connectedComponentOfOne _ + let q : NumberField.IdeleClassGroup (𝓞 K) K →ₜ* + IdeleClassConnectedQuotient K := + { toMonoidHom := QuotientGroup.mk' H + continuous_toFun := QuotientGroup.continuous_mk } + let artin : NumberField.IdeleClassGroup (𝓞 K) K →ₜ* + Field.absoluteGaloisGroupAbelianization K := + (ContinuousMonoidHom.toContinuousMonoidHom e).comp q + refine ⟨artin, ?_, ?_⟩ + · intro g + obtain ⟨y, rfl⟩ := e.surjective g + obtain ⟨x, rfl⟩ := QuotientGroup.mk'_surjective H y + exact ⟨x, rfl⟩ + · change artin.toMonoidHom.ker = H + change (e.toMonoidHom.comp (QuotientGroup.mk' H)).ker = H + rw [MonoidHom.ker_comp_of_injective (QuotientGroup.mk' H) e.toMonoidHom + e.injective] + exact QuotientGroup.ker_mk' H + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/TopologicalGlobalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/TopologicalGlobalReciprocity.lean new file mode 100644 index 0000000000..b5f6de1198 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/TopologicalGlobalReciprocity.lean @@ -0,0 +1,64 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IdeleClassConnectedQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteGaloisBaseEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivIdeleClassTopology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.ConnectedComponentQuotientCongr +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibTopologyComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SmallModel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibTopologicalGlobalReciprocity +public import Mathlib.FieldTheory.AbsoluteGaloisGroup + +/-! # Topological Global Reciprocity -/ + +@[expose] public section +open scoped NumberField + +/-! +# Topological global reciprocity + +For a number field `K`, the idèle class group modulo its identity component +is topologically isomorphic to the maximal abelian quotient of the absolute +Galois group. The statement uses Mathlib's groups on both sides. +-/ + +namespace ClassFieldTheory + +universe u + +/-- The topological form of global class field theory. -/ +theorem topologicalGlobalReciprocity + (K : Type u) [Field K] [NumberField K] : + Nonempty (IdeleClassConnectedQuotient K ≃ₜ* + Field.absoluteGaloisGroupAbelianization K) := by + let : Small.{0} K := numberField_small K + let S := Shrink.{0} K + let : NumberField S := numberField_shrink K + let e : S ≃ₐ[ℚ] K := (Shrink.ringEquiv K).toRatAlgEquiv + let cS : IdeleClassGroup S ≃ₜ* + NumberField.IdeleClassGroup (𝓞 S) S := + IdeleGroup.ideleClassGroupContinuousMulEquivMathlib S + let cK : IdeleClassGroup K ≃ₜ* + NumberField.IdeleClassGroup (𝓞 K) K := + IdeleGroup.ideleClassGroupContinuousMulEquivMathlib K + let c : NumberField.IdeleClassGroup (𝓞 S) S ≃ₜ* + NumberField.IdeleClassGroup (𝓞 K) K := + cS.symm.trans ((ideleClassCongrContinuousMulEquiv e).trans cK) + let q : IdeleClassConnectedQuotient S ≃ₜ* + IdeleClassConnectedQuotient K := + connectedComponentQuotientCongr c + let g : Field.absoluteGaloisGroupAbelianization S ≃ₜ* + Field.absoluteGaloisGroupAbelianization K := + absoluteGaloisGroupAbelianizationEquivOfRingEquiv e.toRingEquiv + let r : IdeleClassConnectedQuotient S ≃ₜ* + Field.absoluteGaloisGroupAbelianization S := + GlobalClassFieldTheory.Reciprocity.mathlibIdeleClassConnectedQuotientEquivAbelianization S + exact ⟨q.symm.trans (r.trans g)⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf.lean new file mode 100644 index 0000000000..3f47f22149 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf.lean @@ -0,0 +1,33 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HasseArf +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexDifference +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexNatOfJump +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexStrictMono +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionInverseHerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionNat +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.InverseHerbrandFunctionHerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.IsUpperRamificationJumpInt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupAntitone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupEventuallyBot +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupNormal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupZeroEqInertia +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealAndUpperRamificationGroupNormal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNat +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNormal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAfter +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAntitone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupEventuallyBot + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/All.lean new file mode 100644 index 0000000000..b0fa1f66f6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/All.lean @@ -0,0 +1,31 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HasseArf +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexStrictMono +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexDifference +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexNatOfJump +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionInverseHerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionNat +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.InverseHerbrandFunctionHerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.IsUpperRamificationJumpInt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupAntitone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupEventuallyBot +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupNormal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupZeroEqInertia +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNat +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNormal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealAndUpperRamificationGroupNormal +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAntitone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAfter +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupEventuallyBot +/-! Public Hasse--Arf theorem and basic lower-filtration identities. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HasseArf.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HasseArf.lean new file mode 100644 index 0000000000..f6767a59c0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HasseArf.lean @@ -0,0 +1,114 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsLowerRamificationJump +public import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.NumberTheory.LocalField.Basic +public import Mathlib.RingTheory.Valuation.Extension +/-! +# Hasse--Arf theorem + +Let `L/K` be a finite abelian extension of nonarchimedean local fields, with +the valuation of `L` extending that of `K`. If `n` is a jump in the lower +ramification filtration, the corresponding upper index is the Herbrand +value `φ(n)`. Hasse--Arf says that this upper index is an integer. + +This is the standard equivalent integral-lower-jump formulation of the +theorem. It avoids postulating an opaque predicate for upper jumps: the +lower groups and the Herbrand value are defined explicitly in +`ClassFieldTheory.Definitions.HasseArf` modules from Mathlib's valuation-subring +data. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +/-- **Hasse--Arf.** For a finite abelian extension of nonarchimedean local +fields, the Herbrand image of every lower ramification jump is integral. + +Here the lower filtration is attached to the canonical valuation subring of +`L`. The `Valuation.HasExtension` assumption records compatibility of the +canonical valuations on `K` and `L`; it is data about the extension, not a +ramification or integrality conclusion. -/ +theorem hasseArf + (K L : Type*) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + {n : ℕ} + (hn : IsLowerRamificationJump K + (ValuativeRel.valuation L).valuationSubring n) : + ∃ z : ℤ, + herbrandFunctionAtLowerIndex K + (ValuativeRel.valuation L).valuationSubring n = (z : ℚ) := + letI : Small.{0} K := LocalFieldTheory.nonarchimedeanLocalField_small K + letI : Small.{0} L := LocalFieldTheory.nonarchimedeanLocalField_small L + letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := HasseArf.shrinkAlgebra K L + letI : FiniteDimensional (Shrink.{0} K) (Shrink.{0} L) := + HasseArf.shrink_finiteDimensional K L + letI : IsAbelianGalois (Shrink.{0} K) (Shrink.{0} L) := + HasseArf.shrink_isAbelianGalois K L + letI : ValuativeRel (Shrink.{0} K) := LocalFieldTheory.shrinkLocalFieldValuativeRel K + letI : ValuativeRel (Shrink.{0} L) := LocalFieldTheory.shrinkLocalFieldValuativeRel L + letI : IsNonarchimedeanLocalField (Shrink.{0} K) := + LocalFieldTheory.shrinkLocalField_isNonarchimedeanLocalField K + letI : IsNonarchimedeanLocalField (Shrink.{0} L) := + LocalFieldTheory.shrinkLocalField_isNonarchimedeanLocalField L + letI : Valuation.HasExtension + (LocalFieldTheory.shrinkLocalFieldValuation K) + (LocalFieldTheory.shrinkLocalFieldValuation L) := by + have hcomm (a : Shrink.{0} K) : + Shrink.ringEquiv L (algebraMap (Shrink.{0} K) (Shrink.{0} L) a) = + algebraMap K L (Shrink.ringEquiv K a) := by + have h := congrArg + (fun F : K →+* Shrink.{0} L => F (Shrink.ringEquiv K a)) + (HasseArf.shrinkAlgebra_commutes K L) + simpa using congrArg (Shrink.ringEquiv L) h + exact LocalFieldTheory.hasExtension_comap_ringEquivs + (Shrink.ringEquiv K) (Shrink.ringEquiv L) hcomm + (ValuativeRel.valuation K) (ValuativeRel.valuation L) + letI : Valuation.HasExtension + (ValuativeRel.valuation (Shrink.{0} K)) + (ValuativeRel.valuation (Shrink.{0} L)) := by + have hK : + (LocalFieldTheory.shrinkLocalFieldValuation K).IsEquiv + (ValuativeRel.valuation (Shrink.{0} K)) := + letI : (LocalFieldTheory.shrinkLocalFieldValuation K).Compatible := + Valuation.Compatible.ofValuation _ + ValuativeRel.isEquiv _ _ + have hL : + (LocalFieldTheory.shrinkLocalFieldValuation L).IsEquiv + (ValuativeRel.valuation (Shrink.{0} L)) := + letI : (LocalFieldTheory.shrinkLocalFieldValuation L).Compatible := + Valuation.Compatible.ofValuation _ + ValuativeRel.isEquiv _ _ + exact LocalFieldTheory.hasExtension_of_isEquiv + (LocalFieldTheory.shrinkLocalFieldValuation K) + (ValuativeRel.valuation (Shrink.{0} K)) + (LocalFieldTheory.shrinkLocalFieldValuation L) + (ValuativeRel.valuation (Shrink.{0} L)) hK hL + by + have hn' : IsLowerRamificationJump (Shrink.{0} K) + (ValuativeRel.valuation (Shrink.{0} L)).valuationSubring n := + (HasseArf.shrink_isLowerRamificationJump_iff K L n).mpr hn + obtain ⟨z, hz⟩ := HasseArf.hasseArf_canonical + (Shrink.{0} K) (Shrink.{0} L) hn' + refine ⟨z, ?_⟩ + rw [← HasseArf.shrink_herbrandFunctionAtLowerIndex_eq K L n] + exact hz + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexDifference.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexDifference.lean new file mode 100644 index 0000000000..3177af113a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexDifference.lean @@ -0,0 +1,36 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf +/-! +# Herbrand-function increment at integral lower indices + +The sum starts at index one: the increment from `n` to `n + 1` is the +cardinality of the next lower group divided by that of the zeroth group. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u v + +/-- The difference of successive rational Herbrand values is the +normalized size of the next lower ramification group. -/ +theorem herbrandFunctionAtLowerIndex_difference + (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + (A : ValuationSubring L) (n : ℕ) : + herbrandFunctionAtLowerIndex K A (n + 1) - + herbrandFunctionAtLowerIndex K A n = + (Nat.card (lowerRamificationGroup K A (n + 1)) : ℚ) / + Nat.card (lowerRamificationGroup K A 0) := by + rw [herbrandFunctionAtLowerIndex_succ] + ring + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexNatOfJump.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexNatOfJump.lean new file mode 100644 index 0000000000..9817359bed --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexNatOfJump.lean @@ -0,0 +1,68 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsLowerRamificationJump +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HasseArf +public import Mathlib.NumberTheory.LocalField.Basic +/-! +# Natural Herbrand values at lower ramification jumps + +The finite-sum Herbrand value is nonnegative at every integral lower index. +For a finite Abelian extension of nonarchimedean local fields, Hasse--Arf +therefore makes the value at each lower jump a natural number. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u v + +/-- The rational Herbrand value at any integral lower index is nonnegative. -/ +private theorem herbrandFunctionAtLowerIndex_nonneg + (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + (A : ValuationSubring L) (n : ℕ) : + 0 ≤ herbrandFunctionAtLowerIndex K A n := by + unfold herbrandFunctionAtLowerIndex + apply div_nonneg + · apply Finset.sum_nonneg + intro i hi + exact Nat.cast_nonneg _ + · exact Nat.cast_nonneg _ + +/-- At an integral lower ramification jump of a finite Abelian local +extension, the rational Herbrand value is a natural number. -/ +theorem herbrandFunctionAtLowerIndex_eq_nat_of_isLowerRamificationJump + (K : Type u) (L : Type v) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + {n : ℕ} + (hn : IsLowerRamificationJump K + (ValuativeRel.valuation L).valuationSubring n) : + ∃ m : ℕ, + herbrandFunctionAtLowerIndex K + (ValuativeRel.valuation L).valuationSubring n = (m : ℚ) := by + obtain ⟨z, hz⟩ := ClassFieldTheory.hasseArf K L hn + have hznonneg : 0 ≤ z := by + have hnonneg := herbrandFunctionAtLowerIndex_nonneg K + (ValuativeRel.valuation L).valuationSubring n + rw [hz] at hnonneg + exact_mod_cast hnonneg + refine ⟨z.toNat, ?_⟩ + calc + herbrandFunctionAtLowerIndex K + (ValuativeRel.valuation L).valuationSubring n = (z : ℚ) := hz + _ = ((z.toNat : ℕ) : ℚ) := by + exact_mod_cast (Int.natCast_toNat_eq_self.mpr hznonneg).symm + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexStrictMono.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexStrictMono.lean new file mode 100644 index 0000000000..3320b97e00 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexStrictMono.lean @@ -0,0 +1,42 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf +public import Mathlib.Order.Monotone.Basic +public import Mathlib.SetTheory.Cardinal.Finite +/-! +# Strict growth of the integral-index Herbrand function + +For a finite extension, each lower ramification group is finite and +nonempty. Thus every increment of the rational Herbrand function is +strictly positive. This does not assert integrality of its values. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u v + +/-- The rational Herbrand function at nonnegative integral lower indices is +strictly increasing for a finite field extension. -/ +theorem herbrandFunctionAtLowerIndex_strictMono + (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] (A : ValuationSubring L) : + StrictMono (herbrandFunctionAtLowerIndex K A) := by + apply strictMono_nat_of_lt_succ + intro n + rw [herbrandFunctionAtLowerIndex_succ] + have hnum : 0 < (Nat.card (lowerRamificationGroup K A (n + 1)) : ℚ) := by + exact_mod_cast Nat.card_pos (α := lowerRamificationGroup K A (n + 1)) + have hden : 0 < (Nat.card (lowerRamificationGroup K A 0) : ℚ) := by + exact_mod_cast Nat.card_pos (α := lowerRamificationGroup K A 0) + exact lt_add_of_pos_right _ (div_pos hnum hden) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionCanonical.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionCanonical.lean new file mode 100644 index 0000000000..52ca38c0cb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionCanonical.lean @@ -0,0 +1,55 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf +public import Mathlib.NumberTheory.LocalField.Basic +/-! +# Strict growth of the public Herbrand function + +The piecewise function defined from the public integral lower groups agrees +with the existing Herbrand function of the local lower filtration. Its strict +growth is consequently available without exposing that filtration in the +public theorem statement. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +open LocalFieldTheory +open RamificationTheory.LocalField +open RamificationTheory.HilbertRamification.Higher + +/-- For a finite Abelian extension of nonarchimedean local fields, the +Herbrand function built from the canonical lower groups is strictly +increasing on the real line. -/ +theorem herbrandFunction_canonical_strictMono + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + StrictMono (ClassFieldTheory.herbrandFunction K + (ValuativeRel.valuation L).valuationSubring) := by + intro s t hst + rw [← HasseArf.chosenLocalExtension_valuationSubring_eq_canonical K L] + rw [HasseArf.chosenHerbrandFunction_eq_localHerbrandFunction K L s, + HasseArf.chosenHerbrandFunction_eq_localHerbrandFunction K L t] + exact + (herbrandFunctionOfUniqueExtension_strictMono + (base := (localCompleteDVF K).toDVF) + (target := (chosenLocalExtensionCompleteDVF K L).toDVF) + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension.{0} K L)) hst + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionInverseHerbrandFunction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionInverseHerbrandFunction.lean new file mode 100644 index 0000000000..7bb2ed528d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionInverseHerbrandFunction.lean @@ -0,0 +1,64 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf +public import Mathlib.NumberTheory.LocalField.Basic +/-! # The Herbrand function is a right inverse -/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +open LocalFieldTheory +open RamificationTheory.LocalField +open RamificationTheory.HilbertRamification.Higher + +/-- The public Herbrand function takes its inverse value back to the given +upper index. -/ +theorem herbrandFunction_inverseHerbrandFunction + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (t : ℝ) : + ClassFieldTheory.herbrandFunction K + (ValuativeRel.valuation L).valuationSubring + (inverseHerbrandFunction K L t) = t := by + have hfun : + ClassFieldTheory.herbrandFunction K + (ValuativeRel.valuation L).valuationSubring = + herbrandFunctionOfUniqueExtension + (base := (localCompleteDVF K).toDVF) + (target := (chosenLocalExtensionCompleteDVF K L).toDVF) + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension.{0} K L) := by + funext s + exact HasseArf.canonicalHerbrandFunction_eq_localHerbrandFunction K L s + unfold inverseHerbrandFunction + rw [hfun] + change herbrandFunctionOfUniqueExtension + (base := (localCompleteDVF K).toDVF) + (target := (chosenLocalExtensionCompleteDVF K L).toDVF) + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension.{0} K L) + (inverseHerbrandFunctionOfUniqueExtension + (base := (localCompleteDVF K).toDVF) + (target := (chosenLocalExtensionCompleteDVF K L).toDVF) + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension.{0} K L) t) = t + exact herbrandFunctionOfUniqueExtension_psi + (base := (localCompleteDVF K).toDVF) + (target := (chosenLocalExtensionCompleteDVF K L).toDVF) + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension.{0} K L) t + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionNat.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionNat.lean new file mode 100644 index 0000000000..82dcb47b45 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionNat.lean @@ -0,0 +1,33 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction +/-! # Herbrand values at natural lower indices -/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- At a natural lower index, the real piecewise Herbrand function equals +the rational finite-sum value after casting to reals. -/ +theorem herbrandFunction_nat + (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + (A : ValuationSubring L) (n : ℕ) : + ClassFieldTheory.herbrandFunction K A (n : ℝ) = + (herbrandFunctionAtLowerIndex K A n : ℝ) := by + unfold ClassFieldTheory.herbrandFunction + rw [ite_eq_left (Nat.cast_nonneg n)] + dsimp only + rw [Nat.floor_natCast, sub_self, zero_mul, add_zero] + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/InverseHerbrandFunctionHerbrandFunction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/InverseHerbrandFunctionHerbrandFunction.lean new file mode 100644 index 0000000000..2e4bcac999 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/InverseHerbrandFunctionHerbrandFunction.lean @@ -0,0 +1,63 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf +public import Mathlib.NumberTheory.LocalField.Basic +/-! # The inverse Herbrand function is a left inverse -/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +open LocalFieldTheory +open RamificationTheory.LocalField +open RamificationTheory.HilbertRamification.Higher + +/-- The inverse public Herbrand function recovers every real lower index. -/ +theorem inverseHerbrandFunction_herbrandFunction + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (s : ℝ) : + inverseHerbrandFunction K L + (ClassFieldTheory.herbrandFunction K + (ValuativeRel.valuation L).valuationSubring s) = s := by + have hfun : + ClassFieldTheory.herbrandFunction K + (ValuativeRel.valuation L).valuationSubring = + herbrandFunctionOfUniqueExtension + (base := (localCompleteDVF K).toDVF) + (target := (chosenLocalExtensionCompleteDVF K L).toDVF) + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension.{0} K L) := by + funext t + exact HasseArf.canonicalHerbrandFunction_eq_localHerbrandFunction K L t + unfold inverseHerbrandFunction + rw [hfun] + change inverseHerbrandFunctionOfUniqueExtension + (base := (localCompleteDVF K).toDVF) + (target := (chosenLocalExtensionCompleteDVF K L).toDVF) + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension.{0} K L) + (herbrandFunctionOfUniqueExtension + (base := (localCompleteDVF K).toDVF) + (target := (chosenLocalExtensionCompleteDVF K L).toDVF) + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension.{0} K L) s) = s + exact inverseHerbrandFunctionOfUniqueExtension_eta + (base := (localCompleteDVF K).toDVF) + (target := (chosenLocalExtensionCompleteDVF K L).toDVF) + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension.{0} K L) s + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/IsUpperRamificationJumpInt.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/IsUpperRamificationJumpInt.lean new file mode 100644 index 0000000000..3049a5fbb3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/IsUpperRamificationJumpInt.lean @@ -0,0 +1,54 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsUpperRamificationJump +public import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf +public import Mathlib.Algebra.Group.Subgroup.Ker +public import Mathlib.NumberTheory.LocalField.Basic +/-! +# Integrality of upper ramification jumps + +The public upper filtration is transported to the existing local upper +filtration in the implementation layer, including its right limit. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +/-- Every actual upper ramification jump of a finite Abelian local extension +is an integer, including the possible endpoint `-1`. -/ +theorem isUpperRamificationJump_int + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + {t : ℝ} (ht : IsUpperRamificationJump K L t) : + ∃ z : ℤ, t = (z : ℝ) := by + have hsource : RamificationTheory.LocalField.IsLocalUpperRamificationJump K L t := by + intro heq + apply ht + apply (Subgroup.map_injective + (((ValuativeRel.valuation L).valuationSubring).decompositionSubgroup K).subtype_injective) + calc + (upperRamificationGroup K L t).map + (((ValuativeRel.valuation L).valuationSubring).decompositionSubgroup K).subtype = + RamificationTheory.LocalField.localUpperRamificationGroup K L t := + HasseArf.upperRamificationGroup_map_subtype_eq_localUpperRamificationGroup + K L t + _ = RamificationTheory.LocalField.localUpperRamificationGroupAfter K L t := heq + _ = (upperRamificationGroupAfter K L t).map + (((ValuativeRel.valuation L).valuationSubring).decompositionSubgroup K).subtype := + (HasseArf.upperRamificationGroupAfter_map_subtype_eq_localUpperRamificationGroupAfter + K L t).symm + exact HasseArf.isLocalUpperRamificationJump_int K L hsource + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupAntitone.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupAntitone.lean new file mode 100644 index 0000000000..3471fbcc1b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupAntitone.lean @@ -0,0 +1,32 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup +/-! +# The lower ramification filtration decreases + +The definition uses powers of the maximal ideal of a valuation subring. +The inclusion below holds without local-field or finiteness hypotheses. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u v + +/-- A larger lower index gives a smaller ramification subgroup. -/ +theorem lowerRamificationGroup_antitone + (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + (A : ValuationSubring L) : + Antitone (lowerRamificationGroup K A) := by + intro m n hmn σ hσ x + exact (Ideal.pow_le_pow_right (I := IsLocalRing.maximalIdeal A) + (Nat.add_le_add_right hmn 1)) (hσ x) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupEventuallyBot.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupEventuallyBot.lean new file mode 100644 index 0000000000..0227951f64 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupEventuallyBot.lean @@ -0,0 +1,92 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupAntitone +public import Mathlib.FieldTheory.Fixed +public import Mathlib.RingTheory.Filtration +public import Mathlib.RingTheory.Localization.FractionRing +/-! +# Eventual triviality of lower ramification groups + +For a finite field extension and a Noetherian valuation subring, each +nonidentity automorphism moves an element of the valuation ring by a nonzero +amount. Krull's intersection theorem then excludes that automorphism from +some lower group. Finiteness gives a common bound for all automorphisms. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- All sufficiently high lower ramification groups are trivial. -/ +theorem lowerRamificationGroup_eventually_bot + (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (A : ValuationSubring L) [IsNoetherianRing A] : + ∃ N : ℕ, ∀ n : ℕ, N ≤ n → lowerRamificationGroup K A n = ⊥ := by + classical + let G := A.decompositionSubgroup K + let m : Ideal A := IsLocalRing.maximalIdeal A + have hm : m ≠ ⊤ := Ideal.IsPrime.ne_top' + have hseparated (σ : G) + (hall : ∀ n : ℕ, σ ∈ lowerRamificationGroup K A n) : σ = 1 := by + have hfix (x : A) : σ • x = x := by + have hmem : σ • x - x ∈ ⨅ n : ℕ, m ^ n := by + rw [Ideal.mem_iInf] + intro n + cases n with + | zero => + simp only [pow_zero, Ideal.one_eq_top, Submodule.mem_top] + | succ n => + simpa only [Nat.succ_eq_add_one] using hall n x + rw [Ideal.iInf_pow_eq_bot_of_isLocalRing m hm] at hmem + exact sub_eq_zero.mp ((Submodule.mem_bot A).mp hmem) + have hring : + (σ.1 : L ≃ₐ[K] L).toRingHom = + (1 : L ≃ₐ[K] L).toRingHom := by + apply IsFractionRing.ringHom_ext (A := A) + intro x + have hx := congrArg (fun y : A => (y : L)) (hfix x) + change (σ.1 : L ≃ₐ[K] L) (x : L) = (x : L) at hx + exact hx + apply Subtype.ext + apply AlgEquiv.ext + intro x + exact RingHom.congr_fun hring x + have hcutoff (σ : G) (hσ : σ ≠ 1) : + ∃ n : ℕ, σ ∉ lowerRamificationGroup K A n := by + by_contra hnone + apply hσ + apply hseparated σ + intro n + by_contra hn + exact hnone ⟨n, hn⟩ + let cutoff (σ : G) : ℕ := + if hσ : σ = 1 then 0 else (hcutoff σ hσ).choose + let N : ℕ := Finset.univ.sup cutoff + have hbot : lowerRamificationGroup K A N = ⊥ := by + apply le_antisymm _ bot_le + intro σ hσ + have hσone : σ = 1 := by + by_contra hne + have hcut : σ ∉ lowerRamificationGroup K A (cutoff σ) := by + simpa only [cutoff, dite_eq_right hne] using (hcutoff σ hne).choose_spec + have hle : cutoff σ ≤ N := Finset.le_sup (Finset.mem_univ σ) + exact hcut (lowerRamificationGroup_antitone K A hle hσ) + exact Subgroup.mem_bot.mpr hσone + refine ⟨N, fun n hn => ?_⟩ + apply le_antisymm _ bot_le + exact (lowerRamificationGroup_antitone K A hn).trans (le_of_eq hbot) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupNormal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupNormal.lean new file mode 100644 index 0000000000..38dbe622d0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupNormal.lean @@ -0,0 +1,48 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup +/-! +# Normality of lower ramification groups + +Every level of the lower ramification filtration is normal in the +decomposition group: conjugation preserves the maximal-ideal powers that +define the filtration. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u v + +/-- Each lower ramification group is normal in the decomposition group. -/ +theorem lowerRamificationGroup_normal + (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + (A : ValuationSubring L) (n : ℕ) : + (lowerRamificationGroup K A n).Normal where + conj_mem := by + intro σ hσ γ + change ∀ x : A, + (γ * σ * γ⁻¹) • x - x ∈ (IsLocalRing.maximalIdeal A) ^ (n + 1) + intro x + let e : A ≃+* A := + MulSemiringAction.toRingAut (A.decompositionSubgroup K) A γ + have hmap : + e (σ • (γ⁻¹ • x) - (γ⁻¹ • x)) ∈ + ((IsLocalRing.maximalIdeal A) ^ (n + 1)).map e := + Ideal.mem_map_of_mem e (hσ (γ⁻¹ • x)) + have hstable : + γ • (σ • (γ⁻¹ • x) - (γ⁻¹ • x)) ∈ + (IsLocalRing.maximalIdeal A) ^ (n + 1) := by + change γ • (σ • (γ⁻¹ • x) - (γ⁻¹ • x)) ∈ + ((IsLocalRing.maximalIdeal A) ^ (n + 1)).map e at hmap + rwa [Ideal.map_pow, IsLocalRing.map_ringEquiv_maximalIdeal] at hmap + simpa only [smul_sub, mul_smul, smul_inv_smul] using hstable + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupZeroEqInertia.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupZeroEqInertia.lean new file mode 100644 index 0000000000..5017c6082c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupZeroEqInertia.lean @@ -0,0 +1,58 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup +/-! +# The zeroth lower group is the inertia group + +Mathlib defines inertia through the action on the residue field. The +valuation-subring definition of `G₀` uses the equivalent condition that +every difference `σ • x - x` belongs to the maximal ideal. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u v + +/-- The zeroth lower ramification group agrees with Mathlib's inertia +subgroup of the decomposition group. -/ +theorem lowerRamificationGroup_zero_eq_inertiaSubgroup + (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + (A : ValuationSubring L) : + lowerRamificationGroup K A 0 = A.inertiaSubgroup K := by + ext σ + constructor + · intro hσ + change (MulSemiringAction.toRingAut + (A.decompositionSubgroup K) (IsLocalRing.ResidueField A) σ) = 1 + apply RingEquiv.ext + intro y + obtain ⟨x, rfl⟩ := IsLocalRing.residue_surjective y + change σ • IsLocalRing.residue A x = IsLocalRing.residue A x + have hx : σ • x - x ∈ IsLocalRing.maximalIdeal A := by + simpa only [zero_add, pow_one] using hσ x + have hz : IsLocalRing.residue A (σ • x - x) = 0 := + (IsLocalRing.residue_eq_zero_iff _).2 hx + have heq : IsLocalRing.residue A (σ • x) = IsLocalRing.residue A x := + sub_eq_zero.mp (by simpa only [map_sub] using hz) + simpa only [IsLocalRing.ResidueField.residue_smul] using heq + · intro hσ x + change (MulSemiringAction.toRingAut + (A.decompositionSubgroup K) (IsLocalRing.ResidueField A) σ) = 1 at hσ + have hfix : σ • IsLocalRing.residue A x = IsLocalRing.residue A x := by + have h := congrArg + (fun e : RingAut (IsLocalRing.ResidueField A) => + e (IsLocalRing.residue A x)) hσ + simpa using h + have hz : IsLocalRing.residue A (σ • x - x) = 0 := by + rw [map_sub, IsLocalRing.ResidueField.residue_smul, hfix, sub_self] + simpa only [zero_add, pow_one] using (IsLocalRing.residue_eq_zero_iff _).1 hz + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealAndUpperRamificationGroupNormal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealAndUpperRamificationGroupNormal.lean new file mode 100644 index 0000000000..a20fe23d8a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealAndUpperRamificationGroupNormal.lean @@ -0,0 +1,40 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNormal +/-! +# Normality of real lower and upper ramification groups + +Upper groups are real lower groups evaluated at inverse Herbrand indices, +so their normality follows from normality of the real lower groups. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u v + +/-- Each canonical real upper ramification group is normal in its +decomposition group. -/ +theorem upperRamificationGroup_normal + (K : Type u) (L : Type v) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (t : ℝ) : + (upperRamificationGroup K L t).Normal := + realLowerRamificationGroup_normal K + (ValuativeRel.valuation L).valuationSubring + (inverseHerbrandFunction K L t) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean new file mode 100644 index 0000000000..82aa8816cb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean @@ -0,0 +1,45 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.NumberTheory.LocalField.Basic +public import Mathlib.RingTheory.Valuation.Extension +public import Mathlib.RingTheory.Valuation.ValuativeRel.Basic +/-! +# Canonical real lower ramification groups + +The real-index filtration is decreasing directly from the antitonicity of +powers of the maximal ideal. No choice of a local extension is needed. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- The public real lower groups of a finite Abelian local extension form a +decreasing filtration of its canonical decomposition group. -/ +theorem realLowerRamificationGroup_canonical_antitone + (K : Type u) (L : Type v) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] + [ValuativeRel L] [TopologicalSpace L] : + Antitone (ClassFieldTheory.realLowerRamificationGroup K + (ValuativeRel.valuation L).valuationSubring) := by + intro s t hst σ hσ x + have hexp : (Int.ceil (s + 1)).toNat ≤ (Int.ceil (t + 1)).toNat := + Int.toNat_le_toNat (Int.ceil_le_ceil (add_le_add_left hst 1)) + exact (Ideal.pow_le_pow_right + (I := IsLocalRing.maximalIdeal (ValuativeRel.valuation L).valuationSubring) + hexp) (hσ x) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupNat.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupNat.lean new file mode 100644 index 0000000000..45a5917b1d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupNat.lean @@ -0,0 +1,33 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups +/-! # Real lower groups at natural indices -/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u v + +/-- The real lower group at a natural index is the original lower group. -/ +theorem realLowerRamificationGroup_nat + (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + (A : ValuationSubring L) (n : ℕ) : + realLowerRamificationGroup K A (n : ℝ) = lowerRamificationGroup K A n := by + have hpow : (Int.ceil ((n : ℝ) + 1)).toNat = n + 1 := + RamificationTheory.HilbertRamification.Higher.realRamificationExponent_nat n + apply Subgroup.ext + intro σ + change (∀ x : A, + σ • x - x ∈ (IsLocalRing.maximalIdeal A) ^ (Int.ceil ((n : ℝ) + 1)).toNat) ↔ + (∀ x : A, σ • x - x ∈ (IsLocalRing.maximalIdeal A) ^ (n + 1)) + rw [hpow] + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupNormal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupNormal.lean new file mode 100644 index 0000000000..68a3057d3a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupNormal.lean @@ -0,0 +1,48 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup +/-! +# Normality of real lower ramification groups + +Conjugation preserves powers of the maximal ideal, so the real lower groups +are normal in the decomposition group. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u v + +/-- Each real lower ramification group is normal in its decomposition group. -/ +theorem realLowerRamificationGroup_normal + (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + (A : ValuationSubring L) (s : ℝ) : + (realLowerRamificationGroup K A s).Normal where + conj_mem := by + intro σ hσ γ + change ∀ x : A, + (γ * σ * γ⁻¹) • x - x ∈ + (IsLocalRing.maximalIdeal A) ^ (Int.ceil (s + 1)).toNat + intro x + let e : A ≃+* A := + MulSemiringAction.toRingAut (A.decompositionSubgroup K) A γ + have hmap : + e (σ • (γ⁻¹ • x) - (γ⁻¹ • x)) ∈ + ((IsLocalRing.maximalIdeal A) ^ (Int.ceil (s + 1)).toNat).map e := + Ideal.mem_map_of_mem e (hσ (γ⁻¹ • x)) + have hstable : + γ • (σ • (γ⁻¹ • x) - (γ⁻¹ • x)) ∈ + (IsLocalRing.maximalIdeal A) ^ (Int.ceil (s + 1)).toNat := by + change γ • (σ • (γ⁻¹ • x) - (γ⁻¹ • x)) ∈ + ((IsLocalRing.maximalIdeal A) ^ (Int.ceil (s + 1)).toNat).map e at hmap + rwa [Ideal.map_pow, IsLocalRing.map_ringEquiv_maximalIdeal] at hmap + simpa only [smul_sub, mul_smul, smul_inv_smul] using hstable + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupAfter.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupAfter.lean new file mode 100644 index 0000000000..aa8d43e061 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupAfter.lean @@ -0,0 +1,34 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsUpperRamificationJump +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAntitone +/-! +# The right-limit upper ramification group +-/ + +@[expose] public section + +namespace ClassFieldTheory + +/-- The right-limit upper group lies in the group at the limiting index. -/ +theorem upperRamificationGroupAfter_le + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (t : ℝ) : + upperRamificationGroupAfter K L t ≤ upperRamificationGroup K L t := by + apply iSup_le + intro s + exact upperRamificationGroup_antitone K L (le_of_lt s.property) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupAntitone.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupAntitone.lean new file mode 100644 index 0000000000..c2bd7ec9a1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupAntitone.lean @@ -0,0 +1,38 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionInverseHerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupCanonical +/-! # Antitonicity of the canonical upper filtration -/ + +@[expose] public section + +namespace ClassFieldTheory + +/-- The public canonical upper ramification filtration decreases with its +real upper index. -/ +theorem upperRamificationGroup_antitone + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + Antitone (upperRamificationGroup K L) := by + intro s t hst + have hpsi : inverseHerbrandFunction K L s ≤ inverseHerbrandFunction K L t := by + apply (herbrandFunction_canonical_strictMono K L).le_iff_le.mp + rw [herbrandFunction_inverseHerbrandFunction K L s, + herbrandFunction_inverseHerbrandFunction K L t] + exact hst + exact (realLowerRamificationGroup_canonical_antitone K L) hpsi + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupCanonical.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupCanonical.lean new file mode 100644 index 0000000000..0e2da9b1cd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupCanonical.lean @@ -0,0 +1,40 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.InverseHerbrandFunctionHerbrandFunction +/-! +# Upper groups at Herbrand indices + +The public inverse Herbrand identity identifies the upper group at `φ(s)` +with the public real lower group at `s`. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +/-- The upper group at the Herbrand image of a real lower index is exactly +the corresponding real lower group of the canonical valuation ring. -/ +theorem upperRamificationGroup_herbrandFunction + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (s : ℝ) : + upperRamificationGroup K L + (herbrandFunction K (ValuativeRel.valuation L).valuationSubring s) = + realLowerRamificationGroup K + (ValuativeRel.valuation L).valuationSubring s := by + unfold upperRamificationGroup + rw [inverseHerbrandFunction_herbrandFunction K L s] + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupEventuallyBot.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupEventuallyBot.lean new file mode 100644 index 0000000000..fb6de3dd41 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupEventuallyBot.lean @@ -0,0 +1,58 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupEventuallyBot +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNat +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAntitone +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf +/-! +# Eventual triviality of upper ramification groups + +The public real lower group agrees with the original natural-index lower +group at each integer. Eventual triviality then passes to upper numbering +through the Herbrand-index identity and antitonicity. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +/-- The canonical upper ramification groups of a finite Abelian local +extension are trivial above some real upper index. -/ +theorem upperRamificationGroup_eventually_bot + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + ∃ T : ℝ, ∀ t : ℝ, T ≤ t → upperRamificationGroup K L t = ⊥ := by + let A := (ValuativeRel.valuation L).valuationSubring + let : IsNoetherianRing A := by + change IsNoetherianRing ((ValuativeRel.valuation L).valuationSubring) + rw [← HasseArf.chosenLocalExtension_valuationSubring_eq_canonical K L] + exact ((LocalFieldTheory.chosenLocalExtensionCompleteDVF K + L).toDVF).valuationSubring_isNoetherianRing + obtain ⟨N, hN⟩ := lowerRamificationGroup_eventually_bot K A + refine ⟨herbrandFunction K A (N : ℝ), ?_⟩ + intro t ht + have hAt : + upperRamificationGroup K L (herbrandFunction K A (N : ℝ)) = ⊥ := by + rw [upperRamificationGroup_herbrandFunction K L (N : ℝ), + realLowerRamificationGroup_nat K A N] + exact hN N le_rfl + apply le_antisymm _ bot_le + exact (upperRamificationGroup_antitone K L ht).trans (le_of_eq hAt) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols.lean new file mode 100644 index 0000000000..1e863ccedd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols.lean @@ -0,0 +1,44 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.FinitePlaceHilbertBadSetFinite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.GlobalHilbertPairingFiniteSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.GlobalHilbertPairingSupportBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingPerfect +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingSymbolMul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingSymbolMulRight +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertProductFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraCopiesOfSimpleFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteEtale +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteFree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFinrank +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormIffSimpleRadicalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraOneNormSurjective +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraProductDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFactorDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFieldFactors +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerRadicalDegreeEqPowerClassOrder +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingArtinNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExists +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExponentCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingInverse +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingNormCriterion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingPerfectExists +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassEqIff +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassEqOneIff +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassGroupFinite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassInv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassMul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassPow +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.RootQuotientChoiceIndependence + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/All.lean new file mode 100644 index 0000000000..f7712723c6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/All.lean @@ -0,0 +1,48 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassEqOneIff +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassMul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassInv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassPow +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassEqIff +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingSymbolMul +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingSymbolMulRight +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingPerfect +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExists +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingArtinNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExponentCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.RootQuotientChoiceIndependence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingInverse +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingNormCriterion +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingPerfectExists +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertProductFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.GlobalHilbertPairingFiniteSupport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.FinitePlaceHilbertBadSetFinite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.GlobalHilbertPairingSupportBound +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteFree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteEtale +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraProductDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFieldFactors +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFactorDegree +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraCopiesOfSimpleFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormProduct +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFinrank +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormIffSimpleRadicalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerRadicalDegreeEqPowerClassOrder +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraOneNormSurjective +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassGroupFinite +/-! +# Hilbert symbols + +This `All` module collects the power-class quotient theorem, existence and +the norm-residue criterion for local Hilbert pairings, and existence of a +coherent family satisfying the global product formula. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/FinitePlaceHilbertBadSetFinite.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/FinitePlaceHilbertBadSetFinite.lean new file mode 100644 index 0000000000..0b704df5b9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/FinitePlaceHilbertBadSetFinite.lean @@ -0,0 +1,82 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.FinitePlaceHilbertBadSet +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FiniteRadicalSupport +/-! +# Finiteness of the possible bad finite places + +The set is defined by three explicit valuation conditions, independently of +any choice of local Hilbert symbols or of a larger auxiliary support. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- Only finitely many places fail to make `a`, `b`, and `n` all units. -/ +theorem finitePlaceHilbertBadSet_finite + (F : Type u) [Field F] [NumberField F] + (n : ℕ+) (a b : Fˣ) : + (finitePlaceHilbertBadSet F n a b).Finite := by + classical + let hnF : ((n : ℕ) : F) ≠ 0 := by + exact_mod_cast n.ne_zero + let nUnit : Fˣ := Units.mk0 ((n : ℕ) : F) hnF + let T : Finset (HeightOneSpectrum (𝓞 F)) := + (KummerTheory.chosenUnitFiniteSupport (K := F) a ∪ + KummerTheory.chosenUnitFiniteSupport (K := F) b) ∪ + KummerTheory.chosenUnitFiniteSupport (K := F) nUnit + apply T.finite_toSet.subset + intro v hv + by_contra hvT + have hvaSupport : v ∉ KummerTheory.chosenUnitFiniteSupport (K := F) a := by + intro h + exact hvT (Finset.mem_union_left _ (Finset.mem_union_left _ h)) + have hvbSupport : v ∉ KummerTheory.chosenUnitFiniteSupport (K := F) b := by + intro h + exact hvT (Finset.mem_union_left _ (Finset.mem_union_right _ h)) + have hvnSupport : + v ∉ KummerTheory.chosenUnitFiniteSupport (K := F) nUnit := by + intro h + exact hvT (Finset.mem_union_right _ h) + have hva : v.valuation F (a : F) = 1 := + (mem_SUnitGroup_iff (K := F) + (KummerTheory.chosenUnitFiniteSupport (K := F) a) a).mp + (KummerTheory.mem_sUnitGroup_chosenUnitFiniteSupport (K := F) a) + v hvaSupport + have hvb : v.valuation F (b : F) = 1 := + (mem_SUnitGroup_iff (K := F) + (KummerTheory.chosenUnitFiniteSupport (K := F) b) b).mp + (KummerTheory.mem_sUnitGroup_chosenUnitFiniteSupport (K := F) b) + v hvbSupport + have hvn : v.valuation F ((n : ℕ) : F) = 1 := by + have hnUnitVal : v.valuation F (nUnit : F) = 1 := + (mem_SUnitGroup_iff (K := F) + (KummerTheory.chosenUnitFiniteSupport (K := F) nUnit) nUnit).mp + (KummerTheory.mem_sUnitGroup_chosenUnitFiniteSupport (K := F) nUnit) + v hvnSupport + change v.valuation F ((n : ℕ) : F) = 1 at hnUnitVal + exact hnUnitVal + change v.valuation F (a : F) ≠ 1 ∨ + v.valuation F (b : F) ≠ 1 ∨ + v.valuation F ((n : ℕ) : F) ≠ 1 at hv + rcases hv with ha | hb | hn + · exact ha hva + · exact hb hvb + · exact hn hvn + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingFiniteSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingFiniteSupport.lean new file mode 100644 index 0000000000..f3ee7ea5df --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingFiniteSupport.lean @@ -0,0 +1,59 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertProductFormula +/-! +# Finite support of every local Hilbert-pairing family + +The norm-residue criterion determines exactly where a local symbol equals +one, even though it does not determine the symbol's other values. Hence the +finite support of one constructed family transfers to every family satisfying +the local Hilbert-pairing laws. No product-formula assumption is made about +the family being studied. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- The local norm-residue law alone forces finite support of the finite-place +values on any fixed pair of nonzero global elements. -/ +theorem globalHilbertPairing_hasFiniteSupport_of_isLocallyHilbert + (F : Type u) [Field F] [NumberField F] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) F).Nonempty) + (B : GlobalHilbertPairingFamily F n) + (hB : GlobalHilbertPairingFamily.IsLocallyHilbert F B) : + GlobalHilbertPairingFamily.HasFiniteSupport F B hmu := by + obtain ⟨C, hC, hCfinite, _⟩ := + exists_globalHilbertPairingFamily_productFormula F n hmu + intro a b + apply (hCfinite a b).of_eq_one_iff + intro v + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + let e : rootsOfUnity (n : ℕ) F ≃* rootsOfUnity (n : ℕ) (v.adicCompletion F) := + rootsOfUnityEquivOfPrimitiveRoots + (algebraMap F (v.adicCompletion F)).injective hmu + let av : (v.adicCompletion F)ˣ := + Units.map (algebraMap F (v.adicCompletion F)).toMonoidHom a + let bv : (v.adicCompletion F)ˣ := + Units.map (algebraMap F (v.adicCompletion F)).toMonoidHom b + change e.symm ((C v).symbol av bv) = 1 ↔ + e.symm ((B v).symbol av bv) = 1 + simp only [MulEquiv.map_eq_one_iff] + exact ((hC v).2.2.2 av bv).trans ((hB v).2.2.2 av bv).symm + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingSupportBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingSupportBound.lean new file mode 100644 index 0000000000..abbddc17b3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingSupportBound.lean @@ -0,0 +1,90 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.FinitePlaceHilbertBadSet +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.PowerResidueReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertComparison +/-! +# An explicit support bound for every local Hilbert-pairing family + +The norm-residue criterion determines the zero set of every such family, +even though it does not determine all of its nontrivial values. +-/ + +@[expose] public section + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable +section + +namespace ClassFieldTheory + +/-- The finite-place factors of a locally Hilbert family are trivial +where the exponent and both arguments are valuation-ring units. -/ +theorem globalHilbertPairing_mulSupport_subset_finitePlaceHilbertBadSet + (F : Type) [Field F] [NumberField F] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) F).Nonempty) + (B : GlobalHilbertPairingFamily F n) + (hB : GlobalHilbertPairingFamily.IsLocallyHilbert F B) + (a b : Fˣ) : + Function.mulSupport + (fun v : HeightOneSpectrum (𝓞 F) => + GlobalHilbertPairingFamily.finiteFactor F B hmu v a b) ⊆ + finitePlaceHilbertBadSet F n a b := by + intro v hv + by_contra hvBad + change ¬ (v.valuation F (a : F) ≠ 1 ∨ + v.valuation F (b : F) ≠ 1 ∨ + v.valuation F ((n : ℕ) : F) ≠ 1) at hvBad + have hva : v.valuation F (a : F) = 1 := by + by_contra h + exact hvBad (Or.inl h) + have hvb : v.valuation F (b : F) = 1 := by + by_contra h + exact hvBad (Or.inr (Or.inl h)) + have hvn : v.valuation F ((n : ℕ) : F) = 1 := by + by_contra h + exact hvBad (Or.inr (Or.inr h)) + let C := finitePlaceAdicHilbertPairingFamily F n hmu + have hC : GlobalHilbertPairingFamily.IsLocallyHilbert F C := + finitePlaceAdicHilbertPairingFamily_isLocallyHilbert F n hmu + have hnF : ((n : ℕ) : F) ≠ 0 := Nat.cast_ne_zero.mpr n.ne_zero + have hsource : + GlobalClassFieldTheory.Reciprocity.finitePlaceHilbertSymbol + F n hnF hmu v a b = 1 := + GlobalClassFieldTheory.Reciprocity.finitePlaceHilbertSymbol_eq_one_of_valuation_eq_one + F n hnF hmu a b v hva hvb hvn + have hCfactor : + GlobalHilbertPairingFamily.finiteFactor F C hmu v a b = 1 := by + rw [finitePlaceAdicHilbertPairingFamily_finiteFactor F n hnF hmu v a b] + change KummerTheory.nthRootsSubgroupEquivRootsOfUnity F (n : ℕ) + (GlobalClassFieldTheory.Reciprocity.finitePlaceHilbertSymbol + F n hnF hmu v a b) = 1 + rw [hsource, map_one] + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + let e : rootsOfUnity (n : ℕ) F ≃* + rootsOfUnity (n : ℕ) (v.adicCompletion F) := + rootsOfUnityEquivOfPrimitiveRoots + (algebraMap F (v.adicCompletion F)).injective hmu + let av : (v.adicCompletion F)ˣ := + Units.map (algebraMap F (v.adicCompletion F)).toMonoidHom a + let bv : (v.adicCompletion F)ˣ := + Units.map (algebraMap F (v.adicCompletion F)).toMonoidHom b + have hzero : + GlobalHilbertPairingFamily.finiteFactor F C hmu v a b = 1 ↔ + GlobalHilbertPairingFamily.finiteFactor F B hmu v a b = 1 := by + change e.symm ((C v).symbol av bv) = 1 ↔ + e.symm ((B v).symbol av bv) = 1 + simp only [MulEquiv.map_eq_one_iff] + exact ((hC v).2.2.2 av bv).trans ((hB v).2.2.2 av bv).symm + exact hv (hzero.mp hCfactor) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingPerfect.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingPerfect.lean new file mode 100644 index 0000000000..d41fef4be0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingPerfect.lean @@ -0,0 +1,98 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +public import Mathlib.GroupTheory.FiniteAbelian.Duality +public import Mathlib.RingTheory.RootsOfUnity.EnoughRootsOfUnity +public import Mathlib.SetTheory.Cardinal.Finite +/-! +# Perfectness of a finite nondegenerate Hilbert pairing + +When the power-class group is finite and the field contains a primitive +`n`-th root of unity, its full group of `μₙ`-valued characters has the same +order. Hence a nondegenerate pairing gives an equivalence with that dual. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory.HilbertPairing + +universe u + +private theorem powerClass_pow_order + (K : Type u) [Field K] (n : ℕ+) + (a : PowerClassGroup K n) : a ^ (n : ℕ) = 1 := by + obtain ⟨x, rfl⟩ := QuotientGroup.mk_surjective a + change (QuotientGroup.mk' (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range x) ^ + (n : ℕ) = 1 + rw [← map_pow] + exact (QuotientGroup.eq_one_iff _).2 ⟨x, rfl⟩ + +private def characterUnitsEquiv + (K : Type u) [Field K] (n : ℕ+) : + (PowerClassGroup K n →* rootsOfUnity (n : ℕ) K) ≃ + (PowerClassGroup K n →* Kˣ) where + toFun f := (rootsOfUnity (n : ℕ) K).subtype.comp f + invFun f := f.codRestrict (rootsOfUnity (n : ℕ) K) (by + intro a + change (f a) ^ (n : ℕ) = 1 + rw [← map_pow, powerClass_pow_order K n a, map_one]) + left_inv f := by + ext a + rfl + right_inv f := by + ext a + rfl + +/-- A finite nondegenerate pairing on power classes is perfect: its adjoint +map onto the full group of `μₙ`-valued characters is bijective. -/ +theorem IsNondegenerate.bijective + {K : Type u} [Field K] {n : ℕ+} + [Finite (PowerClassGroup K n)] + {B : HilbertPairing K n} + (hB : B.IsNondegenerate) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + Function.Bijective B := by + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + let : HasEnoughRootsOfUnity K (n : ℕ) := + { prim := by + obtain ⟨ζ, hζ⟩ := hmu + exact ⟨ζ, (mem_primitiveRoots n.pos).1 hζ⟩ + cyc := inferInstance } + have hExp : Monoid.exponent (PowerClassGroup K n) ∣ (n : ℕ) := + Monoid.exponent_dvd_of_forall_pow_eq_one + (powerClass_pow_order K n) + let : HasEnoughRootsOfUnity K + (Monoid.exponent (PowerClassGroup K n)) := + HasEnoughRootsOfUnity.of_dvd K hExp + have hCard : Nat.card (PowerClassGroup K n) = + Nat.card (PowerClassGroup K n →* rootsOfUnity (n : ℕ) K) := by + calc + Nat.card (PowerClassGroup K n) = + Nat.card (PowerClassGroup K n →* Kˣ) := + (CommGroup.card_monoidHom_of_hasEnoughRootsOfUnity + (PowerClassGroup K n) K).symm + _ = Nat.card (PowerClassGroup K n →* rootsOfUnity (n : ℕ) K) := + (Nat.card_congr (characterUnitsEquiv K n)).symm + have : Finite + (PowerClassGroup K n →* rootsOfUnity (n : ℕ) K) := + Nat.finite_of_card_ne_zero (by + rw [← hCard] + exact (Nat.card_pos (α := PowerClassGroup K n)).ne') + have hinj : Function.Injective B := by + intro a b hab + have hOne : B (a * b⁻¹) = 1 := by + rw [map_mul, map_inv, hab, mul_inv_cancel] + have hEq : a * b⁻¹ = 1 := hB.1 _ (fun c => DFunLike.congr_fun hOne c) + exact (mul_inv_eq_one).mp hEq + exact (Nat.bijective_iff_injective_and_card B).2 ⟨hinj, hCard⟩ + +end ClassFieldTheory.HilbertPairing diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingSymbolMul.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingSymbolMul.lean new file mode 100644 index 0000000000..67d2aea3d9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingSymbolMul.lean @@ -0,0 +1,31 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol +/-! +# Multiplicativity of Hilbert-pairing symbols + +A Hilbert pairing is a homomorphism in each power-class argument. These +formulas expose that structure directly on representatives in `Kˣ`. +-/ + +@[expose] public section + +namespace ClassFieldTheory.HilbertPairing + +universe u + +/-- The symbol is multiplicative in its first representative. -/ +@[simp] +theorem symbol_mul_left + {K : Type u} [Field K] {n : ℕ+} + (B : HilbertPairing K n) (a b c : Kˣ) : + B.symbol (a * b) c = B.symbol a c * B.symbol b c := by + simp only [symbol, map_mul, MonoidHom.mul_apply] + +end ClassFieldTheory.HilbertPairing diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingSymbolMulRight.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingSymbolMulRight.lean new file mode 100644 index 0000000000..a78a202042 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingSymbolMulRight.lean @@ -0,0 +1,30 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol +/-! +# Hilbert-pairing symbol multiplication in the second argument + +The symbol is multiplicative in its second representative. +-/ + +@[expose] public section + +namespace ClassFieldTheory.HilbertPairing + +universe u + +/-- The symbol is multiplicative in its second representative. -/ +@[simp] +theorem symbol_mul_right + {K : Type u} [Field K] {n : ℕ+} + (B : HilbertPairing K n) (a b c : Kˣ) : + B.symbol a (b * c) = B.symbol a b * B.symbol a c := by + simp only [symbol, map_mul] + +end ClassFieldTheory.HilbertPairing diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertProductFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertProductFormula.lean new file mode 100644 index 0000000000..286d3e8e49 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertProductFormula.lean @@ -0,0 +1,80 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFamily +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalInfinitePlaceHilbertSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SmallModel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertProductFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormulaAlgEquiv +public import Mathlib.Algebra.BigOperators.Finprod +/-! +# Existence of a coherent global Hilbert-pairing family + +For a number field containing the `n`-th roots of unity, local class field +theory supplies a Hilbert pairing on every finite completion. These +pairings can be chosen coherently: their values on two nonzero elements of +the number field have finite multiplicative support, and together with the +explicit infinite-place factors they satisfy the Hilbert product formula. + +The statement is existential on purpose. Mathlib provides the completions, +power-class groups, and roots of unity, but it does not choose a local Artin +map or a Hilbert symbol. Consequently this theorem asserts the existence of +one family satisfying all the stated local pairing laws, including the +Kummer norm-residue criterion, and the global formula. It does not disguise +the remaining choice of a value normalization as a definition. +-/ + +@[expose] public section + +open scoped BigOperators NumberField +open NumberField IsDedekindDomain + +namespace ClassFieldTheory + +universe u + +/-- **Hilbert product formula.** There is a family of local Hilbert +pairings on the finite completions whose global evaluations have finite +support and whose product, including the canonical infinite-place factors, +is one. -/ +theorem exists_globalHilbertPairingFamily_productFormula + (F : Type u) [Field F] [NumberField F] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) F).Nonempty) : + ∃ B : GlobalHilbertPairingFamily F n, + GlobalHilbertPairingFamily.IsLocallyHilbert F B ∧ + GlobalHilbertPairingFamily.HasFiniteSupport F B hmu ∧ + ∀ a b : Fˣ, + (∏ v : InfinitePlace F, + globalInfinitePlaceHilbertSymbol F n v a b) * + ∏ᶠ v : HeightOneSpectrum (𝓞 F), + GlobalHilbertPairingFamily.finiteFactor F B hmu v a b = 1 := by + let : Small.{0} F := numberField_small F + let S := Shrink.{0} F + let : NumberField S := numberField_shrink F + let e : S ≃ₐ[ℚ] F := (Shrink.ringEquiv F).toRatAlgEquiv + have hmuS : (primitiveRoots (n : ℕ) S).Nonempty := by + obtain ⟨ζ, hζ⟩ := hmu + exact ⟨e.symm ζ, + (mem_primitiveRoots n.pos).2 + (((mem_primitiveRoots n.pos).1 hζ).map_of_injective + e.symm.injective)⟩ + let BS := finitePlaceAdicHilbertPairingFamily S n hmuS + let B := globalHilbertPairingFamilyCongr e n hmuS BS + obtain ⟨hLocal, hSupport, hFormula⟩ := + finitePlaceAdicHilbertPairingFamily_productFormula S n hmuS + refine ⟨B, ?_, ?_, ?_⟩ + · exact globalHilbertPairingFamilyCongr_isLocallyHilbert + e n hmuS BS hLocal + · exact globalHilbertPairingFamilyCongr_hasFiniteSupport + e n hmuS hmu BS hSupport + · exact globalHilbertPairingFamilyCongr_productFormula + e n hmuS hmu BS hFormula + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraCopiesOfSimpleFactor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraCopiesOfSimpleFactor.lean new file mode 100644 index 0000000000..2dbbb9544f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraCopiesOfSimpleFactor.lean @@ -0,0 +1,86 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFactorDegree +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteProductNormTrace +public import Mathlib.Algebra.Algebra.Pi +public import Mathlib.Data.Fintype.EquivFin +/-! +# Exact number of copies of one Kummer field factor + +When the `n`-th roots of unity lie in the base field, the finite field +factors of the Kummer algebra are all isomorphic. We choose one factor and +reindex the product by `Fin (n / d)`, where `d` is that factor's degree. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- A Kummer algebra of exponent `n` is a product of exactly `n / d` copies +of one finite separable field factor of degree `d`. The norm is the product +of the coordinate field norms under this algebra equivalence. -/ +theorem kummerAlgebra_exists_pi_copies_simpleFactor + (K : Type u) [Field K] (n : ℕ+) (a : Kˣ) + (hn : IsUnit ((n : ℕ) : K)) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + ∃ (F : Type u) (_ : Field F) (_ : Algebra K F) + (_ : Module.Finite K F) (_ : Algebra.IsSeparable K F) (d : ℕ), + 0 < d ∧ Module.finrank K F = d ∧ + ((n : ℕ) / d) * d = (n : ℕ) ∧ + ∃ e : KummerAlgebra K n a ≃ₐ[K] (Fin ((n : ℕ) / d) → F), + ∀ z : KummerAlgebra K n a, + Algebra.norm K z = ∏ j : Fin ((n : ℕ) / d), Algebra.norm K (e z j) := by + classical + obtain ⟨I, hI, E, hField, hAlgebra, e, d, hDPos, hFactors, hIso, + hMul, hCard⟩ := + kummerAlgebra_exists_uniformFactorDegree K n a hn hmu + let : Finite I := hI + let : Fintype I := Fintype.ofFinite I + let (i : I) : Field (E i) := hField i + let (i : I) : Algebra K (E i) := hAlgebra i + have hCardNe : Nat.card I ≠ 0 := by + intro hz + rw [hz, zero_mul] at hMul + exact n.pos.ne' hMul.symm + have hFCardPos : 0 < Fintype.card I := by + simpa only [Nat.card_eq_fintype_card, Nat.cast_id] using + (Nat.pos_of_ne_zero hCardNe) + let i₀ : I := Classical.choice (Fintype.card_pos_iff.mp hFCardPos) + let F := E i₀ + let : Module.Finite K F := (hFactors i₀).1 + have hFCard : Fintype.card I = (n : ℕ) / d := by + simpa only [Nat.card_eq_fintype_card, Nat.cast_id] using hCard + let σ : I ≃ Fin ((n : ℕ) / d) := Fintype.equivFinOfCardEq hFCard + let f (i : I) : E i ≃ₐ[K] F := Classical.choice (hIso i i₀) + let eFactors : (∀ i : I, E i) ≃ₐ[K] (I → F) := + AlgEquiv.piCongrRight f + let eIndex : (I → F) ≃ₐ[K] (Fin ((n : ℕ) / d) → F) := + AlgEquiv.piCongrLeft' K (fun _ : I => F) σ + let eTotal : KummerAlgebra K n a ≃ₐ[K] (Fin ((n : ℕ) / d) → F) := + (e.trans eFactors).trans eIndex + have hCount : ((n : ℕ) / d) * d = (n : ℕ) := by + rw [← hCard] + exact hMul + refine ⟨F, hField i₀, hAlgebra i₀, (hFactors i₀).1, + (hFactors i₀).2.1, d, hDPos, (hFactors i₀).2.2, hCount, eTotal, ?_⟩ + intro z + calc + Algebra.norm K z = Algebra.norm K (eTotal z) := + (Algebra.norm_eq_of_algEquiv eTotal z).symm + _ = ∏ j : Fin ((n : ℕ) / d), Algebra.norm K (eTotal z j) := + ValuationTheory.Completion.algebra_norm_pi_apply + (fun _ : Fin ((n : ℕ) / d) => F) (eTotal z) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFiniteEtale.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFiniteEtale.lean new file mode 100644 index 0000000000..d0e7d20bda --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFiniteEtale.lean @@ -0,0 +1,91 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteFree +public import Mathlib.RingTheory.Etale.StandardEtale +public import Mathlib.RingTheory.Localization.Away.Basic +/-! +# Finite étaleness of a Kummer algebra + +The quotient by `X ^ n - a` is finite étale when the exponent is invertible in +the base field. This includes reducible polynomials: the algebra need not be +a field. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +open Polynomial + +universe u + +/-- The canonical Kummer algebra is finite étale when its exponent is a unit +in the base field. -/ +theorem kummerAlgebra_finiteEtale + (K : Type u) [Field K] (n : ℕ+) (a : Kˣ) + (hn : IsUnit ((n : ℕ) : K)) : + Module.Finite K (KummerAlgebra K n a) ∧ + Algebra.Etale K (KummerAlgebra K n a) := by + have hFinite : Module.Finite K (KummerAlgebra K n a) := + (kummerAlgebra_finiteFree K n a).1 + have hFormal : Algebra.FormallyEtale K (KummerAlgebra K n a) := by + let f : K[X] := X ^ (n : ℕ) - C (a : K) + change Algebra.FormallyEtale K (AdjoinRoot f) + have hf : f.Monic := + Polynomial.monic_X_pow_sub_C (a : K) (Nat.ne_of_gt n.pos) + have hrootPow : (AdjoinRoot.root f) ^ (n : ℕ) = + AdjoinRoot.of f (a : K) := by + change (AdjoinRoot.root (X ^ (n : ℕ) - C (a : K))) ^ (n : ℕ) = + AdjoinRoot.of (X ^ (n : ℕ) - C (a : K)) (a : K) + rw [← sub_eq_zero, ← AdjoinRoot.eval₂_root, eval₂_sub, + eval₂_C, eval₂_pow, eval₂_X] + have hrootUnit : IsUnit (AdjoinRoot.root f) := by + refine (isUnit_pow_iff n.ne_zero).mp ?_ + rw [hrootPow] + exact a.isUnit.map (AdjoinRoot.of f) + have hDerivativeFormula : + aeval (AdjoinRoot.root f) f.derivative = + algebraMap K (AdjoinRoot f) (n : K) * + AdjoinRoot.root f ^ ((n : ℕ) - 1) := by + dsimp [f] + simp [Polynomial.derivative_X_pow] + have hDerivative : IsUnit (aeval (AdjoinRoot.root f) f.derivative) := by + rw [hDerivativeFormula] + exact (hn.map (algebraMap K (AdjoinRoot f))).mul + (hrootUnit.pow ((n : ℕ) - 1)) + have hmk : IsUnit (AdjoinRoot.mk f f.derivative) := by + simpa only [AdjoinRoot.aeval_eq] using hDerivative + let P : StandardEtalePair K := + { f := f + monic_f := hf + g := f.derivative + cond := ⟨1, 0, 1, by + simp only [mul_one, mul_zero, add_zero, pow_one]⟩ } + have hP : IsUnit (AdjoinRoot.mk P.f P.g) := by + change IsUnit (AdjoinRoot.mk f f.derivative) + exact hmk + let eUnit : + AdjoinRoot P.f ≃ₐ[AdjoinRoot P.f] + Localization.Away (AdjoinRoot.mk P.f P.g) := + IsLocalization.atUnit + (AdjoinRoot P.f) + (Localization.Away (AdjoinRoot.mk P.f P.g)) + (AdjoinRoot.mk P.f P.g) hP + let e : P.Ring ≃ₐ[K] AdjoinRoot P.f := + P.equivAwayAdjoinRoot.trans (eUnit.symm.restrictScalars K) + change Algebra.FormallyEtale K (AdjoinRoot P.f) + exact Algebra.FormallyEtale.of_equiv e + have hPresentation : Algebra.FinitePresentation K (KummerAlgebra K n a) := by + change Algebra.FinitePresentation K + (AdjoinRoot (Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K))) + infer_instance + exact ⟨hFinite, ⟨hFormal, hPresentation⟩⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFiniteFree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFiniteFree.lean new file mode 100644 index 0000000000..20bc3ffa8e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFiniteFree.lean @@ -0,0 +1,38 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +public import Mathlib.RingTheory.AdjoinRoot +/-! +# Finite freeness of a Kummer algebra + +The polynomial `X ^ n - a` is monic for positive `n`. Its quotient algebra is +finite free even when that polynomial is reducible, so no field assumption is +placed on the Kummer algebra. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- A Kummer algebra is finite free over its base field, including reducible +and degree-one cases. -/ +theorem kummerAlgebra_finiteFree + (K : Type u) [Field K] (n : ℕ+) (a : Kˣ) : + Module.Finite K (KummerAlgebra K n a) ∧ + Module.Free K (KummerAlgebra K n a) := by + let p : Polynomial K := + Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K) + have hp : p.Monic := + Polynomial.monic_X_pow_sub_C (a : K) (Nat.ne_of_gt n.pos) + change Module.Finite K (AdjoinRoot p) ∧ Module.Free K (AdjoinRoot p) + exact ⟨hp.finite_adjoinRoot, hp.free_adjoinRoot⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFinrank.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFinrank.lean new file mode 100644 index 0000000000..298f77df67 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFinrank.lean @@ -0,0 +1,34 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +public import Mathlib.RingTheory.AdjoinRoot +/-! +# Rank of a Kummer algebra + +The rank of `K[X] / (X ^ n - a)` is `n` regardless of whether the polynomial +is irreducible. This is distinct from the index of its norm subgroup. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- The Kummer algebra has the polynomial's degree as its dimension. -/ +theorem kummerAlgebra_finrank + (K : Type u) [Field K] (n : ℕ+) (a : Kˣ) : + Module.finrank K (KummerAlgebra K n a) = (n : ℕ) := by + let p : Polynomial K := + Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K) + change Module.finrank K (Polynomial K ⧸ Ideal.span {p}) = (n : ℕ) + rw [finrank_quotient_span_eq_natDegree] + exact Polynomial.natDegree_X_pow_sub_C + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormIffSimpleRadicalNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormIffSimpleRadicalNorm.lean new file mode 100644 index 0000000000..5339c906ee --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormIffSimpleRadicalNorm.lean @@ -0,0 +1,43 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.CanonicalKummerNorm +/-! +# Norms from a Kummer algebra and a simple radical field + +The canonical algebra `K[X] / (X^n - a)` need not be a field. When `K` +contains the `n`-th roots of unity and `n` is nonzero in `K`, its norm image +on units nevertheless agrees with the norm image of a field generated by an +`n`-th root of `a`. One root works simultaneously for every target value. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +/-- There is an `n`-th root of `a` whose simple radical extension has exactly +the same norm values on units as the possibly reducible Kummer algebra. -/ +theorem kummerAlgebra_norm_iff_simpleRadicalNorm + (K : Type) [Field K] (n : ℕ+) + (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a : Kˣ) : + ∃ β : SeparableClosure K, + β ^ (n : ℕ) = algebraMap K (SeparableClosure K) (a : K) ∧ + ∀ b : Kˣ, + (∃ y : (KummerAlgebra K n a)ˣ, + Algebra.norm K (y : KummerAlgebra K n a) = (b : K)) ↔ + ∃ z : (IntermediateField.adjoin K {β})ˣ, + Algebra.norm K (z : IntermediateField.adjoin K {β}) = (b : K) := by + refine ⟨KummerTheory.chosenSimpleKummerRoot K n hnK a, + KummerTheory.chosenSimpleKummerRoot_pow K n hnK a, ?_⟩ + intro b + exact LocalClassFieldTheory.Kummer.adjoinRoot_norm_iff_chosenSimpleKummerNorm + K n hnK hmu a b + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormIndex.lean new file mode 100644 index 0000000000..54dbf20313 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormIndex.lean @@ -0,0 +1,44 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebraNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerNormPowerClassDegree +public import Mathlib.NumberTheory.LocalField.Basic +/-! +# Norm index of a Kummer algebra + +The degree of `K[X] / (X^n - a)` is always `n`, but its norm image can +have smaller index. Over a nonarchimedean local field containing the +`n`-th roots of unity, the index is instead the degree of the simple +field generated by an `n`-th root of `a`. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +/-- The unit-norm image of a possibly reducible Kummer algebra has index +equal to the degree of a simple radical field, not necessarily `n`. -/ +theorem kummerAlgebraNormSubgroup_index_eq_radicalDegree + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a : Kˣ) : + ∃ β : SeparableClosure K, + β ^ (n : ℕ) = algebraMap K (SeparableClosure K) (a : K) ∧ + (kummerAlgebraNormSubgroup K n a).index = + Module.finrank K (IntermediateField.adjoin K {β}) := by + exact ⟨KummerTheory.chosenSimpleKummerRoot K n hnK a, + KummerTheory.chosenSimpleKummerRoot_pow K n hnK a, + LocalClassFieldTheory.Kummer.kummerAlgebraNormSubgroup_index_eq_chosenRadicalDegree + K n hnK hmu a⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormProduct.lean new file mode 100644 index 0000000000..a63ed08f40 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormProduct.lean @@ -0,0 +1,59 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraProductDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteProductNormTrace +/-! +# Norm across the finite product of Kummer field factors + +The algebra norm of a possibly reducible Kummer algebra is the product of +the norms of its finite separable field factors. The factors may have +different degrees; no factorwise norm-image assertion is made. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- For an invertible exponent, the canonical Kummer algebra has a finite +separable field-product decomposition whose algebra norm is the product of +the norms of its coordinates. -/ +theorem kummerAlgebra_exists_normProductDecomposition + (K : Type u) [Field K] (n : ℕ+) (a : Kˣ) + (hn : IsUnit ((n : ℕ) : K)) : + ∃ (I : Type u) (_ : Fintype I) (E : I → Type u) + (_ : ∀ i, Field (E i)) (_ : ∀ i, Algebra K (E i)) + (e : KummerAlgebra K n a ≃ₐ[K] ∀ i, E i), + (∀ i, Module.Finite K (E i) ∧ Algebra.IsSeparable K (E i)) ∧ + ∀ z : KummerAlgebra K n a, + Algebra.norm K z = ∏ i, Algebra.norm K (e z i) := by + classical + obtain ⟨I, hI, E, hField, hAlgebra, e, hFactors⟩ := + kummerAlgebra_exists_algEquiv_pi_simpleFields K n a hn + let : Finite I := hI + let : Fintype I := Fintype.ofFinite I + let (i : I) : Field (E i) := hField i + let (i : I) : Algebra K (E i) := hAlgebra i + let (i : I) : Module.Finite K (E i) := (hFactors i).1 + refine ⟨I, Fintype.ofFinite I, E, hField, hAlgebra, e, ?_, ?_⟩ + · intro i + exact ⟨(hFactors i).1, (hFactors i).2.1⟩ + · intro z + calc + Algebra.norm K z = Algebra.norm K (e z) := + (Algebra.norm_eq_of_algEquiv e z).symm + _ = ∏ i, Algebra.norm K (e z i) := + ValuationTheory.Completion.algebra_norm_pi_apply E (e z) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraOneNormSurjective.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraOneNormSurjective.lean new file mode 100644 index 0000000000..b0771300cd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraOneNormSurjective.lean @@ -0,0 +1,66 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebraNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport +public import Mathlib.NumberTheory.LocalField.Basic +/-! +# The reducible Kummer algebra at one + +Even when its rank is `n`, the algebra `K[X]/(Xⁿ-1)` has surjective norm +under the local Kummer hypotheses. This is the simplest instance showing +that norm index and algebra rank are different invariants. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- The Kummer algebra defined by `Xⁿ-1` has full unit norm image. -/ +theorem kummerAlgebraNormSubgroup_one_eq_top + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + kummerAlgebraNormSubgroup K n 1 = ⊤ := by + let : Small.{0} K := LocalFieldTheory.nonarchimedeanLocalField_small K + let S := Shrink.{0} K + let : ValuativeRel S := LocalFieldTheory.shrinkLocalFieldValuativeRel K + let : IsNonarchimedeanLocalField S := + LocalFieldTheory.shrinkLocalField_isNonarchimedeanLocalField K + let e : S ≃+* K := Shrink.ringEquiv K + have hnS : ((n : ℕ) : S) ≠ 0 := by + intro hz + apply hnK + have hzK := congrArg e hz + simpa [e] using hzK + have hmuS : (primitiveRoots (n : ℕ) S).Nonempty := by + obtain ⟨ζ, hζ⟩ := hmu + refine ⟨e.symm ζ, ?_⟩ + exact (mem_primitiveRoots n.pos).2 + (((mem_primitiveRoots n.pos).1 hζ).map_of_injective e.symm.injective) + let B₀ : HilbertPairing S n := localHilbertPairing S n hnS hmuS + let B : HilbertPairing K n := hilbertPairingOfRingEquiv e n hmuS B₀ + have hB : HilbertPairing.IsLocalHilbertPairing B := + hilbertPairingOfRingEquiv_isLocalHilbertPairing e n hmuS B₀ + (localHilbertPairing_isLocalHilbertPairing S n hnS hmuS) + apply top_unique + intro b _ + have hbNorm : IsKummerNorm K n 1 b := + (hB.2.2.2 1 b).1 (by simp [HilbertPairing.symbol]) + obtain ⟨y, hy⟩ := hbNorm + refine ⟨y, ?_⟩ + apply Units.ext + exact hy + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraProductDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraProductDecomposition.lean new file mode 100644 index 0000000000..5ead45334b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraProductDecomposition.lean @@ -0,0 +1,86 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteEtale +public import Mathlib.FieldTheory.IntermediateField.Adjoin.Algebra +public import Mathlib.RingTheory.AdjoinRoot +public import Mathlib.RingTheory.Etale.Field +/-! +# Product decomposition of a Kummer algebra + +When the exponent is invertible, the possibly reducible algebra +`K[X] / (X ^ n - a)` is a finite product of finite separable simple field +extensions. This applies in particular when `a = 1`. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- A Kummer algebra with invertible exponent is a finite product of simple +finite separable field extensions. In each factor, the image of the canonical +root generates the field and has `n`-th power `a`. -/ +theorem kummerAlgebra_exists_algEquiv_pi_simpleFields + (K : Type u) [Field K] (n : ℕ+) (a : Kˣ) + (hn : IsUnit ((n : ℕ) : K)) : + ∃ (I : Type u) (_ : Finite I) (E : I → Type u) + (_ : ∀ i, Field (E i)) (_ : ∀ i, Algebra K (E i)) + (e : KummerAlgebra K n a ≃ₐ[K] ∀ i, E i), + ∀ i, Module.Finite K (E i) ∧ Algebra.IsSeparable K (E i) ∧ + ∃ β : E i, + β = (e (AdjoinRoot.root + (Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K)))) i ∧ + β ^ (n : ℕ) = algebraMap K (E i) (a : K) ∧ + IntermediateField.adjoin K {β} = ⊤ := by + let : Algebra.Etale K (KummerAlgebra K n a) := + (kummerAlgebra_finiteEtale K n a hn).2 + obtain ⟨I, hI, E, hField, hAlgebra, e, hFactors⟩ := + (Algebra.Etale.iff_exists_algEquiv_prod K (KummerAlgebra K n a)).mp inferInstance + let : Finite I := hI + let (i : I) : Field (E i) := hField i + let (i : I) : Algebra K (E i) := hAlgebra i + refine ⟨I, hI, E, hField, hAlgebra, e, ?_⟩ + intro i + have hFinite : Module.Finite K (E i) := (hFactors i).1 + have hSeparable : Algebra.IsSeparable K (E i) := (hFactors i).2 + let p : Polynomial K := Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K) + let A := KummerAlgebra K n a + let φ : A →ₐ[K] E i := (Pi.evalAlgHom K E i).comp e.toAlgHom + have hSurj : Function.Surjective φ := + (Function.surjective_eval i).comp e.surjective + let β : E i := φ (AdjoinRoot.root p) + have hPow : (AdjoinRoot.root p) ^ (n : ℕ) = + algebraMap K A (a : K) := by + change (AdjoinRoot.root + (Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K))) ^ (n : ℕ) = + AdjoinRoot.of (Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K)) (a : K) + rw [← sub_eq_zero, ← AdjoinRoot.eval₂_root, Polynomial.eval₂_sub, + Polynomial.eval₂_C, Polynomial.eval₂_pow, Polynomial.eval₂_X] + have hβPow : β ^ (n : ℕ) = algebraMap K (E i) (a : K) := by + calc + β ^ (n : ℕ) = φ ((AdjoinRoot.root p) ^ (n : ℕ)) := by + rw [map_pow] + _ = φ (algebraMap K A (a : K)) := by rw [hPow] + _ = algebraMap K (E i) (a : K) := φ.commutes (a : K) + have hAlgGen : Algebra.adjoin K ({β} : Set (E i)) = ⊤ := by + change Algebra.adjoin K ({φ (AdjoinRoot.root p)} : Set (E i)) = ⊤ + calc + Algebra.adjoin K ({φ (AdjoinRoot.root p)} : Set (E i)) = + (Algebra.adjoin K ({AdjoinRoot.root p} : Set A)).map φ := + (φ.map_adjoin_singleton (AdjoinRoot.root p)).symm + _ = (⊤ : Subalgebra K A).map φ := by + rw [AdjoinRoot.adjoinRoot_eq_top] + _ = φ.range := Algebra.map_top φ + _ = ⊤ := (AlgHom.range_eq_top φ).mpr hSurj + exact ⟨hFinite, hSeparable, β, rfl, hβPow, + IntermediateField.adjoin_eq_top_of_algebra K {β} hAlgGen⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFactorDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFactorDegree.lean new file mode 100644 index 0000000000..a0fb18ca96 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFactorDegree.lean @@ -0,0 +1,89 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFieldFactors +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFinrank +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteEtale +public import Mathlib.LinearAlgebra.Dimension.Constructions +/-! +# Degree and number of uniform Kummer factors + +When the `n`-th roots of unity lie in the base field, every field factor of +the Kummer algebra has the same positive degree `d`. The total rank `n` is +the number of factors times `d`. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- The uniform finite separable factors have common positive degree `d`, +and their number is `n / d`. This includes degree-one and reducible cases. -/ +theorem kummerAlgebra_exists_uniformFactorDegree + (K : Type u) [Field K] (n : ℕ+) (a : Kˣ) + (hn : IsUnit ((n : ℕ) : K)) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + ∃ (I : Type u) (_ : Finite I) (E : I → Type u) + (_ : ∀ i, Field (E i)) (_ : ∀ i, Algebra K (E i)) + (_ : KummerAlgebra K n a ≃ₐ[K] ∀ i, E i) (d : ℕ), + 0 < d ∧ + (∀ i, Module.Finite K (E i) ∧ Algebra.IsSeparable K (E i) ∧ + Module.finrank K (E i) = d) ∧ + (∀ i j, Nonempty (E i ≃ₐ[K] E j)) ∧ + Nat.card I * d = (n : ℕ) ∧ Nat.card I = (n : ℕ) / d := by + classical + obtain ⟨I, hI, E, hField, hAlgebra, e, hFactors, hIso⟩ := + kummerAlgebra_exists_algEquiv_pi_isomorphicFields K n a hn hmu + let : Finite I := hI + let : Fintype I := Fintype.ofFinite I + let (i : I) : Field (E i) := hField i + let (i : I) : Algebra K (E i) := hAlgebra i + let (i : I) : Module.Finite K (E i) := (hFactors i).1 + let : Module.Finite K (KummerAlgebra K n a) := + (kummerAlgebra_finiteEtale K n a hn).1 + have hSum : (∑ i : I, Module.finrank K (E i)) = (n : ℕ) := by + calc + _ = Module.finrank K (∀ i, E i) := (Module.finrank_pi_fintype K).symm + _ = Module.finrank K (KummerAlgebra K n a) := + e.toLinearEquiv.finrank_eq.symm + _ = (n : ℕ) := kummerAlgebra_finrank K n a + have hSumNe : (∑ i : I, Module.finrank K (E i)) ≠ 0 := by + rw [hSum] + exact n.pos.ne' + obtain ⟨i₀, _, _⟩ := Finset.exists_ne_zero_of_sum_ne_zero hSumNe + let d : ℕ := Module.finrank K (E i₀) + have hDPos : 0 < d := Module.finrank_pos (R := K) (M := E i₀) + have hCommon (i : I) : Module.finrank K (E i) = d := by + obtain ⟨f⟩ := hIso i i₀ + exact f.toLinearEquiv.finrank_eq + have hMul : Nat.card I * d = (n : ℕ) := by + calc + Nat.card I * d = ∑ _i : I, d := by + simp only [Nat.card_eq_fintype_card, Finset.sum_const, + Finset.card_univ, nsmul_eq_mul, Nat.cast_id] + _ = ∑ i : I, Module.finrank K (E i) := by + apply Finset.sum_congr rfl + intro i _ + exact (hCommon i).symm + _ = (n : ℕ) := hSum + have hCard : Nat.card I = (n : ℕ) / d := by + calc + Nat.card I = (d * Nat.card I) / d := + (Nat.mul_div_cancel_left (Nat.card I) hDPos).symm + _ = (n : ℕ) / d := by rw [mul_comm d (Nat.card I), hMul] + refine ⟨I, hI, E, hField, hAlgebra, e, d, hDPos, ?_, hIso, hMul, hCard⟩ + intro i + exact ⟨(hFactors i).1, (hFactors i).2.1, hCommon i⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFieldFactors.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFieldFactors.lean new file mode 100644 index 0000000000..bdad3cd48b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFieldFactors.lean @@ -0,0 +1,99 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraProductDecomposition +public import Mathlib.FieldTheory.KummerExtension +public import Mathlib.FieldTheory.SplittingField.Construction +/-! +# Uniform field factors of a Kummer algebra + +If the base field contains the `n`-th roots of unity, every field factor of +`K[X] / (X ^ n - a)` is a splitting field of the same polynomial. Thus all +factors in the finite product decomposition are isomorphic over the base. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +open Polynomial + +universe u + +private theorem isSplittingField_of_root_generated + (K L : Type u) [Field K] [Field L] [Algebra K L] + (n : ℕ+) (a : Kˣ) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (β : L) + (hpow : β ^ (n : ℕ) = algebraMap K L (a : K)) + (hgen : IntermediateField.adjoin K {β} = ⊤) : + Polynomial.IsSplittingField K L + (Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K)) := by + apply isSplittingField_iff_intermediateField.mpr + constructor + · obtain ⟨ζ, hζ⟩ := hmu + have hprimitive : IsPrimitiveRoot ζ (n : ℕ) := + (mem_primitiveRoots n.pos).mp hζ + rw [Polynomial.map_sub, Polynomial.map_pow, + Polynomial.map_C, Polynomial.map_X] + exact X_pow_sub_C_splits_of_isPrimitiveRoot + (hprimitive.map_of_injective (algebraMap K L).injective) hpow + · have hroot : β ∈ + (Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K)).rootSet L := by + rw [mem_rootSet_of_ne (X_pow_sub_C_ne_zero n.pos (a : K)), + aeval_def, eval₂_sub, eval₂_X_pow, eval₂_C, hpow, sub_self] + apply top_unique + rw [← hgen] + apply IntermediateField.adjoin_le_iff.mpr + intro x hx + rw [Set.mem_singleton_iff.mp hx] + exact IntermediateField.subset_adjoin K _ hroot + +/-- When `K` contains the `n`-th roots of unity, the root-generated field +factors of its Kummer algebra are pairwise isomorphic over `K`. -/ +theorem kummerAlgebra_exists_algEquiv_pi_isomorphicFields + (K : Type u) [Field K] (n : ℕ+) (a : Kˣ) + (hn : IsUnit ((n : ℕ) : K)) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + ∃ (I : Type u) (_ : Finite I) (E : I → Type u) + (_ : ∀ i, Field (E i)) (_ : ∀ i, Algebra K (E i)) + (e : KummerAlgebra K n a ≃ₐ[K] ∀ i, E i), + (∀ i, Module.Finite K (E i) ∧ Algebra.IsSeparable K (E i) ∧ + ∃ β : E i, + β = (e (AdjoinRoot.root + (Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K)))) i ∧ + β ^ (n : ℕ) = algebraMap K (E i) (a : K) ∧ + IntermediateField.adjoin K {β} = ⊤) ∧ + ∀ i j, Nonempty (E i ≃ₐ[K] E j) := by + obtain ⟨I, hI, E, hField, hAlgebra, e, hFactors⟩ := + kummerAlgebra_exists_algEquiv_pi_simpleFields K n a hn + let : Finite I := hI + let (i : I) : Field (E i) := hField i + let (i : I) : Algebra K (E i) := hAlgebra i + refine ⟨I, hI, E, hField, hAlgebra, e, hFactors, ?_⟩ + intro i j + obtain ⟨_, _, βi, _, hPowi, hGeni⟩ := hFactors i + obtain ⟨_, _, βj, _, hPowj, hGenj⟩ := hFactors j + let p : Polynomial K := Polynomial.X ^ (n : ℕ) - Polynomial.C (a : K) + have hSplitsi : Polynomial.IsSplittingField K (E i) p := + isSplittingField_of_root_generated K (E i) n a hmu βi hPowi hGeni + have hSplitsj : Polynomial.IsSplittingField K (E j) p := + isSplittingField_of_root_generated K (E j) n a hmu βj hPowj hGenj + let ei : E i ≃ₐ[K] p.SplittingField := by + letI := hSplitsi + exact Polynomial.IsSplittingField.algEquiv (E i) p + let ej : E j ≃ₐ[K] p.SplittingField := by + letI := hSplitsj + exact Polynomial.IsSplittingField.algEquiv (E j) p + exact ⟨ei.trans ej.symm⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerRadicalDegreeEqPowerClassOrder.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerRadicalDegreeEqPowerClassOrder.lean new file mode 100644 index 0000000000..48abc2cf98 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerRadicalDegreeEqPowerClassOrder.lean @@ -0,0 +1,121 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebraNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingPerfect +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassGroupFinite +public import Mathlib.GroupTheory.SpecificGroups.Cyclic.Basic +public import Mathlib.NumberTheory.LocalField.Basic +/-! +# Degree of a Kummer radical and order of its power class + +The order of the class of `a` is the degree of the field generated by an +`n`-th root of `a`. The associated Kummer algebra need not be a field: in +particular, the class of `a = 1` has order one even when the algebra has +rank `n`. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- Over a nonarchimedean local field containing `μₙ`, the norm index of +`K[X]/(Xⁿ-a)` is the order of the class of `a` modulo `n`-th powers. -/ +theorem kummerAlgebraNormSubgroup_index_eq_powerClassOrder + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a : Kˣ) : + (kummerAlgebraNormSubgroup K n a).index = + orderOf (powerClass K n a) := by + let : Small.{0} K := LocalFieldTheory.nonarchimedeanLocalField_small K + let S := Shrink.{0} K + let : ValuativeRel S := LocalFieldTheory.shrinkLocalFieldValuativeRel K + let : IsNonarchimedeanLocalField S := + LocalFieldTheory.shrinkLocalField_isNonarchimedeanLocalField K + let e : S ≃+* K := Shrink.ringEquiv K + have hnS : ((n : ℕ) : S) ≠ 0 := by + intro hz + apply hnK + have hzK := congrArg e hz + simpa [e] using hzK + have hmuS : (primitiveRoots (n : ℕ) S).Nonempty := by + obtain ⟨ζ, hζ⟩ := hmu + refine ⟨e.symm ζ, ?_⟩ + exact (mem_primitiveRoots n.pos).2 + (((mem_primitiveRoots n.pos).1 hζ).map_of_injective e.symm.injective) + let B₀ : HilbertPairing S n := localHilbertPairing S n hnS hmuS + let B : HilbertPairing K n := hilbertPairingOfRingEquiv e n hmuS B₀ + have hB : HilbertPairing.IsLocalHilbertPairing B := + hilbertPairingOfRingEquiv_isLocalHilbertPairing e n hmuS B₀ + (localHilbertPairing_isLocalHilbertPairing S n hnS hmuS) + let : Finite (PowerClassGroup K n) := powerClassGroup_finite K n hnK + have hBbij : Function.Bijective B := hB.2.2.1.bijective hmu + let x : PowerClassGroup K n := powerClass K n a + let ψ : PowerClassGroup K n →* rootsOfUnity (n : ℕ) K := B x + have hnorm : + kummerAlgebraNormSubgroup K n a = + ψ.ker.comap (powerClass K n) := by + ext b + change + (∃ y : (KummerAlgebra K n a)ˣ, + Units.map (Algebra.norm K) y = b) ↔ B.symbol a b = 1 + constructor + · rintro ⟨y, hy⟩ + apply (hB.2.2.2 a b).2 + exact ⟨y, congrArg Units.val hy⟩ + · intro hb + obtain ⟨y, hy⟩ := (hB.2.2.2 a b).1 hb + refine ⟨y, ?_⟩ + apply Units.ext + exact hy + have hpowerClass : Function.Surjective (powerClass K n) := by + change Function.Surjective + (QuotientGroup.mk' + (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range) + exact QuotientGroup.mk'_surjective _ + have hψOrder : orderOf ψ = orderOf x := by + simpa [ψ] using orderOf_injective B hBbij.1 x + have hcardRange : Nat.card ψ.range = orderOf ψ := by + apply Nat.dvd_antisymm + · obtain ⟨g, hg⟩ := IsCyclic.exists_generator (α := ψ.range) + rw [← orderOf_eq_card_of_forall_mem_zpowers hg] + obtain ⟨y, hy⟩ := g.property + calc + orderOf g = orderOf (g : rootsOfUnity (n : ℕ) K) := + (Subgroup.orderOf_coe g).symm + _ = orderOf (ψ y) := by rw [hy] + _ ∣ orderOf ψ := by + apply orderOf_dvd_of_pow_eq_one + have hp := congrArg + (fun f : PowerClassGroup K n →* rootsOfUnity (n : ℕ) K => f y) + (pow_orderOf_eq_one ψ) + simpa only [MonoidHom.pow_apply, MonoidHom.one_apply] using hp + · apply orderOf_dvd_of_pow_eq_one + apply MonoidHom.ext + intro y + change ψ y ^ Nat.card ψ.range = 1 + let z : ψ.range := ⟨ψ y, ⟨y, rfl⟩⟩ + have hz : z ^ Nat.card ψ.range = 1 := pow_card_eq_one' + simpa [z] using congrArg Subtype.val hz + calc + (kummerAlgebraNormSubgroup K n a).index = + (ψ.ker.comap (powerClass K n)).index := + congrArg (fun H : Subgroup Kˣ ↦ H.index) hnorm + _ = ψ.ker.index := ψ.ker.index_comap_of_surjective hpowerClass + _ = Nat.card ψ.range := Subgroup.index_ker ψ + _ = orderOf ψ := hcardRange + _ = orderOf (powerClass K n a) := by simpa [x] using hψOrder + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingArtinNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingArtinNormalization.lean new file mode 100644 index 0000000000..e14908b564 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingArtinNormalization.lean @@ -0,0 +1,109 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MathlibHilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue +public import Mathlib.FieldTheory.Galois.Basic +public import Mathlib.Topology.Algebra.ContinuousMonoidHom +/-! +# A local Hilbert pairing compatible with arithmetic Artin reciprocity + +The pairing and the Artin maps in this theorem are chosen together. The +algebraic pairing laws alone do not determine the values in `μₙ(K)`. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +/-- One local Hilbert pairing is compatible, at the level of values, with +continuous local Artin maps on its simple Kummer extensions. The first +pairing argument in the displayed action is the Artin input; the second +determines the radical. Thus the symbol with the radical first is the +inverse of the displayed Artin action ratio, by skew-symmetry. This is the +geometric local convention used in the local--global comparison. -/ +theorem exists_localHilbertPairing_artinNormalization + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + ∃ B : HilbertPairing K n, + HilbertPairing.IsLocalHilbertPairing B ∧ + ∀ a : Kˣ, ∃ β : SeparableClosure K, + β ^ (n : ℕ) = algebraMap K (SeparableClosure K) (a : K) ∧ + let E := IntermediateField.adjoin K {β} + ∃ artin : Kˣ →ₜ* (E ≃ₐ[K] E), + Function.Surjective artin ∧ + ∀ b : Kˣ, + artin b + (⟨β, IntermediateField.subset_adjoin K {β} + (Set.mem_singleton β)⟩ : E) = + algebraMap K E + ((B (powerClass K n b) (powerClass K n a)).1 : K) * + (⟨β, IntermediateField.subset_adjoin K {β} + (Set.mem_singleton β)⟩ : E) := by + let B : HilbertPairing K n := localHilbertPairing K n hnK hmu + refine ⟨B, localHilbertPairing_isLocalHilbertPairing K n hnK hmu, ?_⟩ + intro a + let β : SeparableClosure K := KummerTheory.chosenSimpleKummerRoot K n hnK a + have hβ : β ^ (n : ℕ) = algebraMap K (SeparableClosure K) (a : K) := + KummerTheory.chosenSimpleKummerRoot_pow K n hnK a + refine ⟨β, hβ, ?_⟩ + let E := KummerTheory.chosenSimpleKummerExtension K n hnK a + let : FiniteDimensional K E := + KummerTheory.chosenSimpleKummerExtension_finiteDimensional K n hnK a + let : IsAbelianGalois K E := + KummerTheory.chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu a + let artin : Kˣ →ₜ* (E ≃ₐ[K] E) := + LocalClassFieldTheory.abelianLocalArtinMap K E + refine ⟨artin, + LocalClassFieldTheory.abelianLocalArtinMap_surjective K E, ?_⟩ + intro b + let βu : Eˣ := KummerTheory.chosenSimpleKummerRootUnit K n hnK a + let σ : E ≃ₐ[K] E := + LocalClassFieldTheory.Kummer.chosenSimpleKummerNormResidueAutomorphism + K n hnK hmu a b + have hσ : σ = artin b := by + change LocalClassFieldTheory.abelianLocalArtinMonoidHom K E b = artin b + exact (DFunLike.congr_fun + (LocalClassFieldTheory.abelianLocalArtinMap_toMonoidHom K E) b).symm + have hroot : + Units.map (algebraMap K E).toMonoidHom + (B (powerClass K n b) (powerClass K n a)).1 = + KummerTheory.rootQuotient (K := K) (L := E) βu σ := by + simpa only [B, E, βu, σ] using + (localHilbertPairing_artin_rootQuotient K n hnK hmu a b) + have hact : Units.map σ.toMonoidHom βu = + Units.map (algebraMap K E).toMonoidHom + (B (powerClass K n b) (powerClass K n a)).1 * βu := by + calc + Units.map σ.toMonoidHom βu = + KummerTheory.rootQuotient (K := K) (L := E) βu σ * βu := by + simp only [KummerTheory.rootQuotient] + rw [div_mul_cancel] + simp only [AlgEquiv.smul_units_def] + apply Units.ext + rfl + _ = _ := by rw [hroot] + have hfield := congrArg Units.val hact + change σ + (⟨β, IntermediateField.subset_adjoin K {β} + (Set.mem_singleton β)⟩ : E) = + algebraMap K E + ((B (powerClass K n b) (powerClass K n a)).1 : K) * + (⟨β, IntermediateField.subset_adjoin K {β} + (Set.mem_singleton β)⟩ : E) at hfield + rw [hσ] at hfield + exact hfield + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingExists.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingExists.lean new file mode 100644 index 0000000000..98aa4dd691 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingExists.lean @@ -0,0 +1,68 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport +public import Mathlib.NumberTheory.LocalField.Basic +/-! +# Existence of the local Hilbert pairing + +Let `K` be a nonarchimedean local field containing the `n`-th roots of +unity, with `n` nonzero in `K`. The local Hilbert symbol descends to a +bimultiplicative pairing + +`Kˣ / (Kˣ)^n × Kˣ / (Kˣ)^n → μₙ(K)`. + +The theorem below records the pairing laws without naming a particular +implementation of local reciprocity in its statement. Its proof imports the +implementation layer. The witness satisfies the +Steinberg relation, skew-symmetry, nondegeneracy in both variables, and the +Kummer norm-residue vanishing criterion. Multiplicativity is already part +of the type `HilbertPairing K n`. These properties still leave the harmless +choice of a normalization of the values in `μₙ` explicit. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- A nonarchimedean local field containing the `n`-th roots of unity admits +a nondegenerate, skew-symmetric Hilbert pairing satisfying the Steinberg and +Kummer norm-residue laws. -/ +theorem exists_localHilbertPairing + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + ∃ B : HilbertPairing K n, + HilbertPairing.IsLocalHilbertPairing B := by + let : Small.{0} K := LocalFieldTheory.nonarchimedeanLocalField_small K + let S := Shrink.{0} K + let : ValuativeRel S := LocalFieldTheory.shrinkLocalFieldValuativeRel K + let : IsNonarchimedeanLocalField S := + LocalFieldTheory.shrinkLocalField_isNonarchimedeanLocalField K + let e : S ≃+* K := Shrink.ringEquiv K + have hnS : ((n : ℕ) : S) ≠ 0 := by + intro hz + apply hnK + have hzK := congrArg e hz + simpa [e] using hzK + have hmuS : (primitiveRoots (n : ℕ) S).Nonempty := by + obtain ⟨ζ, hζ⟩ := hmu + refine ⟨e.symm ζ, ?_⟩ + exact (mem_primitiveRoots n.pos).2 + (((mem_primitiveRoots n.pos).1 hζ).map_of_injective e.symm.injective) + let B : HilbertPairing S n := localHilbertPairing S n hnS hmuS + exact ⟨hilbertPairingOfRingEquiv e n hmuS B, + hilbertPairingOfRingEquiv_isLocalHilbertPairing e n hmuS B + (localHilbertPairing_isLocalHilbertPairing S n hnS hmuS)⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingExponentCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingExponentCompatibility.lean new file mode 100644 index 0000000000..ee3d0bd179 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingExponentCompatibility.lean @@ -0,0 +1,132 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertExponentCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport +public import Mathlib.NumberTheory.LocalField.Basic +public import Mathlib.RingTheory.RootsOfUnity.PrimitiveRoots +/-! +# Compatibility of Hilbert pairings at divisible exponents + +Pairings constructed from the same arithmetic local Artin maps can be chosen +compatibly when `m ∣ n`. Their values are compared in `Kˣ`, since they belong +to different roots-of-unity subgroups. The public norm criterion places the +radical in the first argument. With that convention, the root-quotient +formula for arithmetic Artin has an inverse; the inverse occurs on both +sides of the exponent comparison and does not change the formula below. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- For `m ∣ n`, there are local Hilbert pairings at exponents `m` and `n` +whose values satisfy `(a,b)ₘ = (a,b)ₙ ^ (n/m)` in the base-field unit group. +Neither pairing is asserted to be determined by the algebraic laws alone. -/ +theorem exists_compatibleLocalHilbertPairings_of_dvd + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (m n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmuN : (primitiveRoots (n : ℕ) K).Nonempty) + (hmn : (m : ℕ) ∣ (n : ℕ)) : + ∃ Bm : HilbertPairing K m, + HilbertPairing.IsLocalHilbertPairing Bm ∧ + ∃ Bn : HilbertPairing K n, + HilbertPairing.IsLocalHilbertPairing Bn ∧ + ∀ a b : Kˣ, + (Bm (powerClass K m a) (powerClass K m b)).1 = + (Bn (powerClass K n a) (powerClass K n b)).1 ^ + ((n : ℕ) / (m : ℕ)) := by + obtain ⟨q, hq⟩ := hmn + let : Small.{0} K := LocalFieldTheory.nonarchimedeanLocalField_small K + let S := Shrink.{0} K + let : ValuativeRel S := LocalFieldTheory.shrinkLocalFieldValuativeRel K + let : IsNonarchimedeanLocalField S := + LocalFieldTheory.shrinkLocalField_isNonarchimedeanLocalField K + let e : S ≃+* K := Shrink.ringEquiv K + have hnS : ((n : ℕ) : S) ≠ 0 := by + intro hz + apply hnK + have hzK := congrArg e hz + simpa [e] using hzK + have hmS : ((m : ℕ) : S) ≠ 0 := by + intro hz + apply hnS + rw [hq, Nat.cast_mul, hz, zero_mul] + have hmuNS : (primitiveRoots (n : ℕ) S).Nonempty := by + obtain ⟨ζ, hζ⟩ := hmuN + refine ⟨e.symm ζ, ?_⟩ + exact (mem_primitiveRoots n.pos).2 + (((mem_primitiveRoots n.pos).1 hζ).map_of_injective e.symm.injective) + have hmuMS : (primitiveRoots (m : ℕ) S).Nonempty := by + obtain ⟨ζ, hζ⟩ := hmuNS + refine ⟨ζ ^ q, (mem_primitiveRoots m.pos).2 ?_⟩ + exact IsPrimitiveRoot.pow n.pos ((mem_primitiveRoots n.pos).1 hζ) + (by rw [mul_comm]; exact hq) + let Bm₀ : HilbertPairing S m := localHilbertPairing S m hmS hmuMS + let Bn₀ : HilbertPairing S n := localHilbertPairing S n hnS hmuNS + let Bm : HilbertPairing K m := hilbertPairingOfRingEquiv e m hmuMS Bm₀ + let Bn : HilbertPairing K n := hilbertPairingOfRingEquiv e n hmuNS Bn₀ + refine ⟨Bm, + hilbertPairingOfRingEquiv_isLocalHilbertPairing e m hmuMS Bm₀ + (localHilbertPairing_isLocalHilbertPairing S m hmS hmuMS), + Bn, + hilbertPairingOfRingEquiv_isLocalHilbertPairing e n hmuNS Bn₀ + (localHilbertPairing_isLocalHilbertPairing S n hnS hmuNS), ?_⟩ + intro a b + let eu : Sˣ ≃* Kˣ := Units.mapEquiv e.toMulEquiv + let a₀ : Sˣ := eu.symm a + let b₀ : Sˣ := eu.symm b + have hsource : + (Bm₀ (powerClass S m a₀) (powerClass S m b₀)).1 = + (Bn₀ (powerClass S n a₀) (powerClass S n b₀)).1 ^ + ((n : ℕ) / (m : ℕ)) := by + change (localHilbertPairing S m hmS hmuMS + (powerClass S m a₀) (powerClass S m b₀)).1 = + (localHilbertPairing S n hnS hmuNS + (powerClass S n a₀) (powerClass S n b₀)).1 ^ + ((n : ℕ) / (m : ℕ)) + rw [localHilbertPairing_powerClass, localHilbertPairing_powerClass] + change + (LocalClassFieldTheory.Kummer.localHilbertSymbol + S m hmS hmuMS a₀ b₀).1 = + (LocalClassFieldTheory.Kummer.localHilbertSymbol + S n hnS hmuNS a₀ b₀).1 ^ ((n : ℕ) / (m : ℕ)) + exact LocalClassFieldTheory.Kummer.localHilbertSymbol_exponentCompatibility + S m n hmS hnS hmuMS hmuNS ⟨q, hq⟩ a₀ b₀ + have htransport + (r : ℕ+) (hmuR : (primitiveRoots (r : ℕ) S).Nonempty) + (x : rootsOfUnity (r : ℕ) S) : + (rootsOfUnityEquivOfRingEquiv e r hmuR x).1 = eu x.1 := by + let : NeZero (r : ℕ) := ⟨r.pos.ne'⟩ + apply Units.ext + exact (val_rootsOfUnityEquivOfPrimitiveRoots_apply_coe + e.injective hmuR x).symm + change + (hilbertPairingOfRingEquiv e m hmuMS Bm₀ + (powerClass K m a) (powerClass K m b)).1 = + (hilbertPairingOfRingEquiv e n hmuNS Bn₀ + (powerClass K n a) (powerClass K n b)).1 ^ + ((n : ℕ) / (m : ℕ)) + rw [hilbertPairingOfRingEquiv_apply, + powerClassGroupEquivOfRingEquiv_symm_powerClass, + powerClassGroupEquivOfRingEquiv_symm_powerClass, + hilbertPairingOfRingEquiv_apply, + powerClassGroupEquivOfRingEquiv_symm_powerClass, + powerClassGroupEquivOfRingEquiv_symm_powerClass, + htransport m hmuMS, htransport n hmuNS] + simpa only [eu, a₀, b₀, map_pow] using congrArg eu hsource + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingInverse.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingInverse.lean new file mode 100644 index 0000000000..a895615552 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingInverse.lean @@ -0,0 +1,51 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +public import Mathlib.Algebra.Group.Hom.Basic +/-! +# Inverting the values of a local Hilbert pairing + +The algebraic laws and norm-vanishing criterion are invariant under inversion +of every value. Thus these conditions alone do not distinguish the value +convention used by a normalized local Artin map. This theorem does not assert +that a pairing and its inverse are distinct. +-/ + +@[expose] public section + +namespace ClassFieldTheory.HilbertPairing + +universe u + +/-- Inverting every value preserves the local Hilbert-pairing axioms. -/ +theorem IsLocalHilbertPairing.inv + {K : Type u} [Field K] {n : ℕ+} + {B : HilbertPairing K n} + (hB : B.IsLocalHilbertPairing) : + (B⁻¹).IsLocalHilbertPairing := by + rcases hB with ⟨hsteinberg, hskew, hnondegenerate, hnorm⟩ + refine ⟨?_, ?_, ?_, ?_⟩ + · intro a ha + simpa only [symbol, MonoidHom.inv_apply, inv_eq_one] using hsteinberg a ha + · intro a b + simpa only [MonoidHom.inv_apply] using + congrArg (fun z : rootsOfUnity (n : ℕ) K => z⁻¹) (hskew a b) + · constructor + · intro a ha + apply hnondegenerate.1 a + intro b + simpa only [MonoidHom.inv_apply, inv_eq_one] using ha b + · intro b hb + apply hnondegenerate.2 b + intro a + simpa only [MonoidHom.inv_apply, inv_eq_one] using hb a + · intro a b + simpa only [symbol, MonoidHom.inv_apply, inv_eq_one] using hnorm a b + +end ClassFieldTheory.HilbertPairing diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingNormCriterion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingNormCriterion.lean new file mode 100644 index 0000000000..e7e4d4939b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingNormCriterion.lean @@ -0,0 +1,37 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsKummerNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +/-! +# Norm-residue criterion for a local Hilbert pairing + +The vanishing of a local Hilbert symbol is equivalent to a concrete Kummer +norm condition. The Kummer algebra is the canonical Mathlib quotient +`K[X] / (X^n - a)`, so the statement does not choose a root in an algebraic +closure. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- A local Hilbert pairing evaluates to one exactly on Kummer norms. -/ +theorem localHilbertPairing_eq_one_iff_isKummerNorm + (K : Type u) [Field K] (n : ℕ+) + (B : HilbertPairing K n) + (hB : HilbertPairing.IsLocalHilbertPairing B) + (a b : Kˣ) : + B.symbol a b = 1 ↔ IsKummerNorm K n a b := by + exact hB.2.2.2 a b + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingPerfectExists.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingPerfectExists.lean new file mode 100644 index 0000000000..bc2ae4d08c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingPerfectExists.lean @@ -0,0 +1,43 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingPerfect +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExists +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassGroupFinite +public import Mathlib.NumberTheory.LocalField.Basic +/-! +# A perfect local Hilbert pairing + +For a nonarchimedean local field in which `n` is nonzero and the `n`-th +roots of unity are present, the Hilbert pairing identifies power classes +with all `μₙ`-valued characters of the power-class group. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- There is a local Hilbert pairing whose adjoint map to the full +`μₙ`-valued character group is bijective. -/ +theorem exists_perfectLocalHilbertPairing + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + ∃ B : HilbertPairing K n, + B.IsLocalHilbertPairing ∧ Function.Bijective B := by + let : Finite (PowerClassGroup K n) := + powerClassGroup_finite K n hnK + obtain ⟨B, hB⟩ := exists_localHilbertPairing K n hnK hmu + refine ⟨B, hB, ?_⟩ + exact hB.2.2.1.bijective hmu + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassEqIff.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassEqIff.lean new file mode 100644 index 0000000000..d325f19824 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassEqIff.lean @@ -0,0 +1,31 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +/-! +# Equality of power classes + +Two representatives have the same power class precisely when their ratio +is an `n`-th power. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- Two elements represent the same power class exactly when their ratio is +an `n`-th power. -/ +theorem powerClass_eq_iff + (K : Type u) [Field K] (n : ℕ+) (a b : Kˣ) : + powerClass K n a = powerClass K n b ↔ + a / b ∈ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range := by + exact QuotientGroup.eq_iff_div_mem + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassEqOneIff.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassEqOneIff.lean new file mode 100644 index 0000000000..83a7a3dcb6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassEqOneIff.lean @@ -0,0 +1,33 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +/-! +# Power-class laws and representatives + +For a field `K` and a positive integer `n`, `PowerClassGroup K n` is the +quotient of `Kˣ` by the subgroup of `n`-th powers. A class is the identity +exactly when its representative belongs to the power subgroup. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- A power class is trivial exactly when its representative is an `n`-th +power. -/ +@[simp] +theorem powerClass_eq_one_iff + (K : Type u) [Field K] (n : ℕ+) (a : Kˣ) : + powerClass K n a = 1 ↔ + a ∈ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range := by + exact QuotientGroup.eq_one_iff a + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassGroupFinite.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassGroupFinite.lean new file mode 100644 index 0000000000..9bd7962d49 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassGroupFinite.lean @@ -0,0 +1,52 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PowerClassFiniteness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ShrinkTransport +/-! +# Finiteness of local power classes + +The nonzero residue of the exponent in a nonarchimedean local field makes its +multiplicative `n`-th-power quotient finite. This is the finiteness input for +turning a nondegenerate Hilbert pairing into a perfect pairing. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- The power-class group of a nonarchimedean local field is finite when +the exponent is nonzero in the field. -/ +theorem powerClassGroup_finite + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) : + Finite (PowerClassGroup K n) := by + let : Small.{0} K := LocalFieldTheory.nonarchimedeanLocalField_small K + let S := Shrink.{0} K + let : ValuativeRel S := LocalFieldTheory.shrinkLocalFieldValuativeRel K + let : IsNonarchimedeanLocalField S := + LocalFieldTheory.shrinkLocalField_isNonarchimedeanLocalField K + let e : S ≃+* K := Shrink.ringEquiv K + have hnS : ((n : ℕ) : S) ≠ 0 := by + intro hz + apply hnK + have hzK := congrArg e hz + simpa [e] using hzK + let : Finite (PowerClassGroup S n) := by + change Finite (Sˣ ⧸ (powMonoidHom (n : ℕ) : Sˣ →* Sˣ).range) + exact LocalFieldTheory.finite_nthPowerQuotient_of_natCast_ne_zero + S (n : ℕ) hnS + exact Finite.of_equiv (PowerClassGroup S n) + (powerClassGroupEquivOfRingEquiv e n).toEquiv + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassInv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassInv.lean new file mode 100644 index 0000000000..84c3042e2b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassInv.lean @@ -0,0 +1,29 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +/-! +# Inversion of power classes + +The quotient map to power classes preserves inverses. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- The class of an inverse is the inverse class. -/ +@[simp] +theorem powerClass_inv + (K : Type u) [Field K] (n : ℕ+) (a : Kˣ) : + powerClass K n a⁻¹ = (powerClass K n a)⁻¹ := + map_inv (powerClass K n) a + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassMul.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassMul.lean new file mode 100644 index 0000000000..261dc16c6f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassMul.lean @@ -0,0 +1,29 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +/-! +# Multiplication of power classes + +The quotient map to power classes preserves multiplication. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- The class of a product is the product of the classes. -/ +@[simp] +theorem powerClass_mul + (K : Type u) [Field K] (n : ℕ+) (a b : Kˣ) : + powerClass K n (a * b) = powerClass K n a * powerClass K n b := + map_mul (powerClass K n) a b + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassPow.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassPow.lean new file mode 100644 index 0000000000..b443c5dd5b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassPow.lean @@ -0,0 +1,29 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +/-! +# Powers of power classes + +The quotient map to power classes preserves powers. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- The class of a power is the corresponding power of the class. -/ +@[simp] +theorem powerClass_pow + (K : Type u) [Field K] (n : ℕ+) (a : Kˣ) (m : ℕ) : + powerClass K n (a ^ m) = (powerClass K n a) ^ m := + map_pow (powerClass K n) a m + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/RootQuotientChoiceIndependence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/RootQuotientChoiceIndependence.lean new file mode 100644 index 0000000000..dc5cc989b5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/RootQuotientChoiceIndependence.lean @@ -0,0 +1,68 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import Mathlib.RingTheory.RootsOfUnity.PrimitiveRoots +/-! +# Independence of the chosen Kummer root + +When the base field contains the `n`-th roots of unity, the quotient +`σ(u) / u` depends only on `u ^ n`. In particular, the Artin root quotient +used to normalize a local Hilbert symbol does not depend on the root chosen. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +/-- Two roots with the same `n`-th power have the same Galois root quotient +when the base field contains a primitive `n`-th root of unity. This also +applies when `σ` is a local Artin automorphism. -/ +theorem rootQuotient_eq_of_pow_eq_pow + {K L : Type*} [Field K] [Field L] [Algebra K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (u v : Lˣ) (huv : u ^ (n : ℕ) = v ^ (n : ℕ)) + (σ : L ≃ₐ[K] L) : + σ • u / u = σ • v / v := by + have hpow : (u / v) ^ (n : ℕ) = 1 := by + rw [div_pow, huv] + exact div_self' (v ^ (n : ℕ)) + obtain ⟨ζ, hζ⟩ : ∃ ζ : Kˣ, + u / v = Units.map (algebraMap K L).toMonoidHom ζ := by + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + let η : rootsOfUnity (n : ℕ) L := ⟨u / v, hpow⟩ + let e : rootsOfUnity (n : ℕ) K ≃* rootsOfUnity (n : ℕ) L := + rootsOfUnityEquivOfPrimitiveRoots (algebraMap K L).injective hmu + refine ⟨(e.symm η : rootsOfUnity (n : ℕ) K).1, ?_⟩ + apply Units.ext + exact (rootsOfUnityEquivOfPrimitiveRoots_symm_apply + (algebraMap K L).injective hmu η).symm + have hfixed : σ • (u / v) = u / v := by + rw [hζ] + apply Units.ext + change σ (algebraMap K L (ζ : K)) = algebraMap K L (ζ : K) + exact σ.commutes (ζ : K) + have hquot : (σ • u / u) / (σ • v / v) = 1 := by + have hchange : (σ • u / u) / (σ • v / v) = + (σ • (u / v)) / (u / v) := by + rw [smul_div' σ u v] + simp only [div_eq_mul_inv, mul_inv_rev, inv_inv] + calc + (σ • u) * u⁻¹ * (v * (σ • v)⁻¹) = + (σ • u) * v * (u⁻¹ * (σ • v)⁻¹) := + mul_mul_mul_comm _ _ _ _ + _ = (σ • u) * v * ((σ • v)⁻¹ * u⁻¹) := + congrArg (fun t : Lˣ => (σ • u) * v * t) + (mul_comm u⁻¹ (σ • v)⁻¹) + _ = (σ • u) * (σ • v)⁻¹ * (v * u⁻¹) := + mul_mul_mul_comm _ _ _ _ + rw [hchange, hfixed] + exact div_self' (u / v) + exact div_eq_one.mp hquot + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/KroneckerWeber.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/KroneckerWeber.lean new file mode 100644 index 0000000000..87fad532f5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/KroneckerWeber.lean @@ -0,0 +1,49 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.Cyclotomic.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.AbelianGaloisEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SmallModel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Core +/-! +# Kronecker--Weber theorem + +Let `L` be a number field that is finite abelian over `ℚ`. Kronecker--Weber +asserts that `L` is contained in a cyclotomic extension: there is a positive +integer `n` and a `ℚ`-algebra embedding of `L` into `ℚ(ζₙ)`. The positivity +condition excludes the degenerate order-zero cyclotomic construction. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +universe u + +/-- **Kronecker--Weber.** Every finite abelian extension of `ℚ` embeds in a +cyclotomic field of positive order. -/ +theorem kroneckerWeber + (L : Type u) [Field L] [NumberField L] [IsAbelianGalois ℚ L] : + ∃ n : ℕ, 0 < n ∧ + Nonempty (L →ₐ[ℚ] CyclotomicField n ℚ) := by + let : Small.{0} L := numberField_small L + let S := Shrink.{0} L + let : NumberField S := numberField_shrink L + let e : S ≃ₐ[ℚ] L := (Shrink.ringEquiv L).toRatAlgEquiv + let : IsAbelianGalois ℚ S := by + apply isAbelianGalois_of_equiv_equiv + (f := RingEquiv.refl ℚ) (g := e.symm.toRingEquiv) + apply RingHom.ext + intro x + change algebraMap ℚ S x = e.symm (algebraMap ℚ L x) + exact (e.symm.commutes x).symm + obtain ⟨n, hn, ⟨i⟩⟩ := + KroneckerWeber.exists_cyclotomicEmbedding S + exact ⟨n, hn, ⟨i.comp e.symm.toAlgHom⟩⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory.lean new file mode 100644 index 0000000000..97948c5a7c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory.lean @@ -0,0 +1,32 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupFiniteIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupIsOpen +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupRingEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistenceOrderIso +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamily +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyExt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivMk +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivOfArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedFamilyExt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedHomExt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.MemFieldNormSubgroupIff + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/All.lean new file mode 100644 index 0000000000..8f968db6f1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/All.lean @@ -0,0 +1,36 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistence +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistenceOrderIso +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamily +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyExt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedHomExt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedFamilyExt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivMk +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivOfArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupFiniteIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupIsOpen +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupRingEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupTower +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.MemFieldNormSubgroupIff +/-! +# Finite abelian local class field theory + +This module gathers the public local reciprocity, local existence, and +norm-subgroup statements. The theorem statements use Mathlib and the public +definitions layer; their proofs may import implementation modules. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupFiniteIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupFiniteIndex.lean new file mode 100644 index 0000000000..1377f483d8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupFiniteIndex.lean @@ -0,0 +1,34 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.NumberTheory.LocalField.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface +/-! +# Finite index of the local norm subgroup + +Finite local reciprocity implies that the subgroup of nonzero field norms +has finite index in the multiplicative group of the base field. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +/-- The norm subgroup of a finite abelian local extension has finite index. -/ +theorem fieldNormSubgroup_finiteIndex + (K L : Type) + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + (fieldNormSubgroup K L).FiniteIndex := by + exact LocalCFT.fieldNormSubgroup_finiteIndex K L + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupIsOpen.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupIsOpen.lean new file mode 100644 index 0000000000..9a18c474a8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupIsOpen.lean @@ -0,0 +1,34 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.NumberTheory.LocalField.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface +/-! +# Openness of the local norm subgroup + +For a finite abelian extension of a nonarchimedean local field, the subgroup +of nonzero field norms is open in the multiplicative group of the base. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +/-- The norm subgroup of a finite abelian local extension is open. -/ +theorem isOpen_fieldNormSubgroup + (K L : Type) + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + IsOpen (fieldNormSubgroup K L : Set Kˣ) := by + exact LocalCFT.isOpen_fieldNormSubgroup K L + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupRingEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupRingEquiv.lean new file mode 100644 index 0000000000..0a1b0773a1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupRingEquiv.lean @@ -0,0 +1,44 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupRingEquiv +public import Mathlib.Algebra.Group.Subgroup.Map +/-! +# Norm membership under compatible field equivalences + +Transporting both fields of a finite extension through compatible ring +equivalences preserves the actual field norms, not merely their index. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u v w x + +/-- An element is a field norm exactly when its image under a compatible +base-field equivalence is a field norm in the transported extension. -/ +theorem mem_fieldNormSubgroup_iff_ringEquiv + {F : Type u} {M : Type v} {F' : Type w} {M' : Type x} + [Field F] [Field M] [Field F'] [Field M'] + [Algebra F M] [Algebra F' M'] + [FiniteDimensional F M] [FiniteDimensional F' M'] + (eF : F ≃+* F') (eM : M ≃+* M') + (he : (algebraMap F' M').comp eF.toRingHom = + eM.toRingHom.comp (algebraMap F M)) + (a : Fˣ) : + a ∈ fieldNormSubgroup F M ↔ + (Units.mapEquiv eF.toMulEquiv) a ∈ fieldNormSubgroup F' M' := by + rw [← fieldNormSubgroup_map_ringEquiv eF eM he] + simp only [Subgroup.mem_map_equiv, MulEquiv.symm_apply_apply] + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupTower.lean new file mode 100644 index 0000000000..99b963699d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupTower.lean @@ -0,0 +1,42 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +public import Mathlib.RingTheory.Norm.Transitivity +/-! +# Norm subgroups in a tower + +The norm from a larger field factors through the norm from every intermediate +field. Thus enlarging a finite extension can only shrink its subgroup of +norms in the base field. No local-field or Galois assumption is needed. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u v w + +/-- In a finite tower `K ⊆ M ⊆ L`, every norm from `L` to `K` is a norm +from `M` to `K`. -/ +theorem fieldNormSubgroup_le_of_tower + (K : Type u) (M : Type v) (L : Type w) + [Field K] [Field M] [Field L] + [Algebra K M] [Algebra M L] [Algebra K L] + [IsScalarTower K M L] + [FiniteDimensional K M] [FiniteDimensional M L] [FiniteDimensional K L] : + fieldNormSubgroup K L ≤ fieldNormSubgroup K M := by + rintro x ⟨y, rfl⟩ + refine ⟨fieldNormHom M L y, ?_⟩ + apply Units.ext + exact Algebra.norm_norm + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistence.lean new file mode 100644 index 0000000000..69e3542b7f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistence.lean @@ -0,0 +1,46 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.OpenFiniteIndexSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistenceOrderIso +/-! +# Finite abelian local existence + +This module states the existence half of finite abelian local class field +theory. Both sides of the correspondence are expressed directly with +Mathlib objects: intermediate fields of `SeparableClosure K` and subgroups +of `Kˣ`. No implementation-specific class-formation object appears in the +statement. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- Every open finite-index subgroup of `Kˣ` is the norm subgroup of a +finite abelian subextension. -/ +theorem finiteAbelianLocalExistence + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + ∀ H : OpenFiniteIndexSubgroup K, + ∃ E : FiniteAbelianLocalExtension K, + E.normSubgroup = H.1 := by + obtain ⟨e, he⟩ := finiteAbelianLocalExistence_orderIso K + intro H + refine ⟨e.symm (OrderDual.toDual H), ?_⟩ + have h := he (e.symm (OrderDual.toDual H)) + rw [e.apply_symm_apply] at h + exact h.symm + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistenceOrderIso.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistenceOrderIso.lean new file mode 100644 index 0000000000..9bb8a0f54c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistenceOrderIso.lean @@ -0,0 +1,47 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.OpenFiniteIndexSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkLocalClassification +public import Mathlib.NumberTheory.LocalField.Basic +public import Mathlib.Order.Hom.Basic +/-! +# Order classification in finite abelian local existence + +This module states the classification form of local existence for a +nonarchimedean local field `K`. Finite abelian intermediate fields of +`SeparableClosure K` are ordered by field inclusion, whereas open +finite-index subgroups of `Kˣ` are ordered contravariantly. The statement +also records that the order isomorphism sends each extension to its actual +field-norm subgroup. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u + +/-- Finite abelian local extensions correspond contravariantly to open +finite-index norm subgroups. -/ +theorem finiteAbelianLocalExistence_orderIso + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + ∃ e : FiniteAbelianLocalExtension K ≃o + (OpenFiniteIndexSubgroup K)ᵒᵈ, + ∀ E : FiniteAbelianLocalExtension K, + (OrderDual.ofDual (e E)).1 = E.normSubgroup := by + exact ⟨LocalFieldTheory.shrinkFiniteAbelianFieldNormSubgroupOrderIso K, + LocalFieldTheory.shrinkFiniteAbelianFieldNormSubgroupOrderIso_apply K⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocity.lean new file mode 100644 index 0000000000..9dc8c0680f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocity.lean @@ -0,0 +1,48 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.NumberTheory.LocalField.Basic +public import Mathlib.Topology.Algebra.ContinuousMonoidHom +/-! +# Finite abelian local reciprocity + +This module states local reciprocity for a finite abelian extension `L / K` +of a nonarchimedean local field. The assumptions provide the finite +abelian-Galois extension together with the valuative topology on `K`. The +conclusion supplies a surjective continuous homomorphism from `Kˣ` to the +Galois group whose kernel consists exactly of nonzero field norms from `L`. + +This finite quotient statement deliberately leaves the usual uniformizer +normalization and tower functoriality to separate compatibility theorems; it +does not claim that the displayed witness is uniquely determined. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +/-- A finite abelian local extension has a surjective continuous Artin map +whose kernel is its field-norm subgroup. -/ +theorem finiteAbelianLocalReciprocity + (K L : Type) + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + ∃ artin : Kˣ →ₜ* (L ≃ₐ[K] L), + Function.Surjective artin ∧ + ∀ x : Kˣ, artin x = 1 ↔ IsFieldNorm K L x := by + exact LocalCFT.finiteAbelianLocalReciprocity K L + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamily.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamily.lean new file mode 100644 index 0000000000..6da4f6bbb8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamily.lean @@ -0,0 +1,76 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +/-! +# A coherent family of finite local Artin maps + +The finite-level Artin maps can be chosen simultaneously for all finite +abelian subextensions of a fixed separable closure. Their norm kernels and +restriction compatibility refer to the same family, not to independently +chosen maps for each tower. The arithmetic-Frobenius normalization is a +separate property of this family. This theorem currently uses the source +construction at `Type 0`; arbitrary-universe transport remains separate. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +/-- One family of continuous local Artin maps has the expected norm kernels +and commutes with inclusion of finite abelian subextensions. -/ +theorem finiteAbelianLocalReciprocity_family + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + ∃ artin : (E : FiniteAbelianLocalExtension K) → + Kˣ →ₜ* (E.1 ≃ₐ[K] E.1), + (∀ E : FiniteAbelianLocalExtension K, + Function.Surjective (artin E) ∧ + (artin E).toMonoidHom.ker = E.normSubgroup) ∧ + ∀ (E F : FiniteAbelianLocalExtension K) + (hEF : E.1 ≤ F.1) (x : Kˣ) (y : E.1), + IntermediateField.inclusion hEF ((artin E x) y) = + (artin F x) (IntermediateField.inclusion hEF y) := by + refine ⟨fun E => LocalClassFieldTheory.abelianLocalArtinMap K E.1, ?_, ?_⟩ + · intro E + constructor + · exact LocalClassFieldTheory.abelianLocalArtinMap_surjective K E.1 + · change + (LocalClassFieldTheory.abelianLocalArtinMap K E.1).toMonoidHom.ker = + LocalFieldTheory.localNormSubgroup K E.1 + exact LocalClassFieldTheory.abelianLocalArtinMap_ker K E.1 + · intro E F hEF x y + have hrestrict := DFunLike.congr_fun + (LocalClassFieldTheory.abelianLocalArtinMap_restrict K E.1 F.1 hEF) x + change + RamificationTheory.intermediateFieldRestrictNormalHom E.1 F.1 hEF + (LocalClassFieldTheory.abelianLocalArtinMap K F.1 x) = + LocalClassFieldTheory.abelianLocalArtinMap K E.1 x at hrestrict + apply Subtype.ext + change + E.1.val ((LocalClassFieldTheory.abelianLocalArtinMap K E.1 x) y) = + F.1.val ((LocalClassFieldTheory.abelianLocalArtinMap K F.1 x) + (IntermediateField.inclusion hEF y)) + calc + E.1.val ((LocalClassFieldTheory.abelianLocalArtinMap K E.1 x) y) = + E.1.val + ((RamificationTheory.intermediateFieldRestrictNormalHom + E.1 F.1 hEF + (LocalClassFieldTheory.abelianLocalArtinMap K F.1 x)) y) := by + rw [hrestrict] + _ = F.1.val ((LocalClassFieldTheory.abelianLocalArtinMap K F.1 x) + (IntermediateField.inclusion hEF y)) := + RamificationTheory.intermediateFieldRestrictNormalHom_apply_val + E.1 F.1 hEF + (LocalClassFieldTheory.abelianLocalArtinMap K F.1 x) y + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius.lean new file mode 100644 index 0000000000..ab5f069dc3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius.lean @@ -0,0 +1,104 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedResidueUniqueness +public import Mathlib.NumberTheory.LocalField.Basic +public import Mathlib.RingTheory.DedekindDomain.Factorization +public import Mathlib.RingTheory.Valuation.Discrete.Basic +public import Mathlib.RingTheory.Valuation.Extension +/-! +# Arithmetic Frobenius in the coherent local reciprocity family + +For an unramified member of one coherent finite local Artin family, the +inverse of every uniformizer maps to the unique Galois automorphism whose +reduction is the arithmetic `q`-power Frobenius. The uniqueness clause is +essential: residue-field behavior is a normalization of the same family, +not a separate independently chosen reciprocity map. +-/ + +@[expose] public section + +open scoped ValuativeRel + +noncomputable +section + +namespace ClassFieldTheory + +/-- A coherent finite local reciprocity family whose inverse-uniformizer +value is characterized uniquely by arithmetic Frobenius on residues. -/ +theorem finiteAbelianLocalReciprocity_family_arithmeticFrobenius + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + ∃ artin : (E : FiniteAbelianLocalExtension K) → + Kˣ →ₜ* (E.1 ≃ₐ[K] E.1), + (∀ E : FiniteAbelianLocalExtension K, + Function.Surjective (artin E) ∧ + (artin E).toMonoidHom.ker = E.normSubgroup) ∧ + (∀ (E F : FiniteAbelianLocalExtension K) + (hEF : E.1 ≤ F.1) (x : Kˣ) (y : E.1), + IntermediateField.inclusion hEF ((artin E x) y) = + (artin F x) (IntermediateField.inclusion hEF y)) ∧ + ∀ (E : FiniteAbelianLocalExtension K) + [ValuativeRel E.1] [UniformSpace E.1] [IsUniformAddGroup E.1] + [IsNonarchimedeanLocalField E.1] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation E.1)], + (𝓂[E.1] : Ideal 𝒪[E.1]).ramificationIdx 𝒪[K] = 1 → + ∀ (π : 𝒪[K]) + (hπ : (ValuativeRel.valuation K).IsUniformizer (π : K)) + (σ : E.1 ≃ₐ[K] E.1), + (∀ x : 𝒪[E.1], + ∃ z : 𝒪[E.1], + (z : E.1) = σ (x : E.1) ∧ + IsLocalRing.residue 𝒪[E.1] z = + (IsLocalRing.residue 𝒪[E.1] x) ^ Nat.card 𝓀[K]) ↔ + σ = artin E ((Units.mk0 (π : K) hπ.ne_zero)⁻¹) := by + refine ⟨fun E => LocalClassFieldTheory.abelianLocalArtinMap K E.1, + ?_, ?_, ?_⟩ + · intro E + constructor + · exact LocalClassFieldTheory.abelianLocalArtinMap_surjective K E.1 + · change + (LocalClassFieldTheory.abelianLocalArtinMap K E.1).toMonoidHom.ker = + LocalFieldTheory.localNormSubgroup K E.1 + exact LocalClassFieldTheory.abelianLocalArtinMap_ker K E.1 + · intro E F hEF x y + have hrestrict := DFunLike.congr_fun + (LocalClassFieldTheory.abelianLocalArtinMap_restrict K E.1 F.1 hEF) x + change + RamificationTheory.intermediateFieldRestrictNormalHom E.1 F.1 hEF + (LocalClassFieldTheory.abelianLocalArtinMap K F.1 x) = + LocalClassFieldTheory.abelianLocalArtinMap K E.1 x at hrestrict + apply Subtype.ext + change + E.1.val ((LocalClassFieldTheory.abelianLocalArtinMap K E.1 x) y) = + F.1.val ((LocalClassFieldTheory.abelianLocalArtinMap K F.1 x) + (IntermediateField.inclusion hEF y)) + calc + E.1.val ((LocalClassFieldTheory.abelianLocalArtinMap K E.1 x) y) = + E.1.val + ((RamificationTheory.intermediateFieldRestrictNormalHom + E.1 F.1 hEF + (LocalClassFieldTheory.abelianLocalArtinMap K F.1 x)) y) := by + rw [hrestrict] + _ = F.1.val ((LocalClassFieldTheory.abelianLocalArtinMap K F.1 x) + (IntermediateField.inclusion hEF y)) := + RamificationTheory.intermediateFieldRestrictNormalHom_apply_val + E.1 F.1 hEF + (LocalClassFieldTheory.abelianLocalArtinMap K F.1 x) y + · intro E _ _ _ _ _ hUnram π hπ σ + exact + letI : LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + K E.1 := ⟨hUnram⟩ + finiteAbelianLocalArtinMap_inverseUniformizer_residue_pow_iff + K E.1 π hπ σ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyExt.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyExt.lean new file mode 100644 index 0000000000..ad5821fb21 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyExt.lean @@ -0,0 +1,211 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.FiniteUnramifiedField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyRigidity +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilySubgroupKernel +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyUnramifiedCompositum +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedResidueUniqueness +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedFamilyExt +public import Mathlib.NumberTheory.LocalField.Basic +public import Mathlib.RingTheory.DedekindDomain.Factorization +public import Mathlib.RingTheory.Valuation.Extension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +/-! +# Uniqueness of the normalized coherent local Artin family + +Norm kernels and tower compatibility alone leave an orientation ambiguity at +finite levels. Arithmetic Frobenius on unramified extensions removes it for +the entire coherent family, including ramified extensions. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension renaming + maximalIdeal_ramificationIdx_eq_one → + maximalIdeal_ramificationIdx_eq_one + + +open scoped ValuativeRel + +noncomputable +section + +namespace ClassFieldTheory + +/-- A coherent family of finite local Artin maps is uniquely determined by +its norm kernels and its arithmetic-Frobenius normalization. The chosen +uniformizer is only used to express that normalization; the conclusion does +not depend on it. -/ +theorem finiteAbelianLocalReciprocity_family_ext + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (f g : (E : FiniteAbelianLocalExtension K) → + Kˣ →ₜ* (E.1 ≃ₐ[K] E.1)) + (hfker : ∀ E : FiniteAbelianLocalExtension K, + (f E).toMonoidHom.ker = E.normSubgroup) + (hgker : ∀ E : FiniteAbelianLocalExtension K, + (g E).toMonoidHom.ker = E.normSubgroup) + (hfcoh : ∀ (E F : FiniteAbelianLocalExtension K) + (hEF : E.1 ≤ F.1) (x : Kˣ) (y : E.1), + IntermediateField.inclusion hEF ((f E x) y) = + (f F x) (IntermediateField.inclusion hEF y)) + (hgcoh : ∀ (E F : FiniteAbelianLocalExtension K) + (hEF : E.1 ≤ F.1) (x : Kˣ) (y : E.1), + IntermediateField.inclusion hEF ((g E x) y) = + (g F x) (IntermediateField.inclusion hEF y)) + (hfrob : ∀ (E : FiniteAbelianLocalExtension K) + [ValuativeRel E.1] [UniformSpace E.1] [IsUniformAddGroup E.1] + [IsNonarchimedeanLocalField E.1] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation E.1)], + (𝓂[E.1] : Ideal 𝒪[E.1]).ramificationIdx 𝒪[K] = 1 → + ∀ (π : 𝒪[K]) + (hπ : (ValuativeRel.valuation K).IsUniformizer (π : K)) + (x : 𝒪[E.1]), + ∃ z : 𝒪[E.1], + (z : E.1) = + (f E ((Units.mk0 (π : K) hπ.ne_zero)⁻¹)) (x : E.1) ∧ + IsLocalRing.residue 𝒪[E.1] z = + (IsLocalRing.residue 𝒪[E.1] x) ^ Nat.card 𝓀[K]) + (hgrob : ∀ (E : FiniteAbelianLocalExtension K) + [ValuativeRel E.1] [UniformSpace E.1] [IsUniformAddGroup E.1] + [IsNonarchimedeanLocalField E.1] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation E.1)], + (𝓂[E.1] : Ideal 𝒪[E.1]).ramificationIdx 𝒪[K] = 1 → + ∀ (π : 𝒪[K]) + (hπ : (ValuativeRel.valuation K).IsUniformizer (π : K)) + (x : 𝒪[E.1]), + ∃ z : 𝒪[E.1], + (z : E.1) = + (g E ((Units.mk0 (π : K) hπ.ne_zero)⁻¹)) (x : E.1) ∧ + IsLocalRing.residue 𝒪[E.1] z = + (IsLocalRing.residue 𝒪[E.1] x) ^ Nat.card 𝓀[K]) + : f = g := by + obtain ⟨π, hπ⟩ := (LocalFieldTheory.localCompleteDVF K).exists_uniformizer + have hrestrict + (a : (E : FiniteAbelianLocalExtension K) → + Kˣ →ₜ* (E.1 ≃ₐ[K] E.1)) + (hcoh : ∀ (E F : FiniteAbelianLocalExtension K) + (hEF : E.1 ≤ F.1) (x : Kˣ) (y : E.1), + IntermediateField.inclusion hEF ((a E x) y) = + (a F x) (IntermediateField.inclusion hEF y)) + (E F : FiniteAbelianLocalExtension K) + (hEF : E.1 ≤ F.1) (x : Kˣ) : + RamificationTheory.intermediateFieldRestrictNormalHom E.1 F.1 hEF + (a F x) = a E x := by + apply AlgEquiv.ext + intro y + apply Subtype.ext + change + E.1.val ((RamificationTheory.intermediateFieldRestrictNormalHom + E.1 F.1 hEF (a F x)) y) = E.1.val ((a E x) y) + calc + E.1.val ((RamificationTheory.intermediateFieldRestrictNormalHom + E.1 F.1 hEF (a F x)) y) = + F.1.val ((a F x) (IntermediateField.inclusion hEF y)) := + RamificationTheory.intermediateFieldRestrictNormalHom_apply_val + E.1 F.1 hEF (a F x) y + _ = F.1.val (IntermediateField.inclusion hEF ((a E x) y)) := by + rw [hcoh E F hEF x y] + _ = E.1.val ((a E x) y) := rfl + funext E + let d : ℕ := Nat.card (E.1 ≃ₐ[K] E.1) + have hd : 0 < d := Nat.card_pos + let U := LocalClassFieldTheory.localFiniteUnramifiedField K d hd + let Upack : FiniteAbelianLocalExtension K := + ⟨U, inferInstance, inferInstance⟩ + let Ffield := E.1 ⊔ U + let Fpack : FiniteAbelianLocalExtension K := + ⟨Ffield, inferInstance, inferInstance⟩ + let rU := RamificationTheory.intermediateFieldRestrictNormalHom + U Ffield le_sup_right + let rE := RamificationTheory.intermediateFieldRestrictNormalHom + E.1 Ffield le_sup_left + let u : Kˣ := (Units.mk0 (π : K) hπ.ne_zero)⁻¹ + have huval : LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul u) = 1 := by + have hπval := + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_uniformizerFieldUnit + K π hπ + change LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (-(Additive.ofMul (Units.mk0 (π : K) hπ.ne_zero))) = 1 + rw [LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_neg] + change -(LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul (LocalFieldTheory.IsNonarchimedeanLocalField.uniformizerFieldUnit + K π hπ))) = 1 + rw [hπval] + norm_num + have hUnram : + (𝓂[U] : Ideal 𝒪[U]).ramificationIdx 𝒪[K] = 1 := + maximalIdeal_ramificationIdx_eq_one + have hUeq : f Upack = g Upack := + finiteAbelianLocalReciprocity_unramified_family_ext K f g + hfker hgker hfrob hgrob Upack hUnram π hπ + have hfUcanonical : f Upack u = + LocalClassFieldTheory.abelianLocalArtinMap K U u := + (finiteAbelianLocalArtinMap_inverseUniformizer_residue_pow_iff + K U π hπ _).mp (hfrob Upack hUnram π hπ) + have hcanon := + LocalClassFieldTheory.finiteAbelianArtin_unramifiedRestriction_zpowers_eq_top + K d hd Ffield le_sup_right u huval + have hfc : rU (f Fpack u) = + rU (LocalClassFieldTheory.abelianLocalArtinMap K Ffield u) := by + calc + rU (f Fpack u) = f Upack u := + hrestrict f hfcoh Upack Fpack le_sup_right u + _ = LocalClassFieldTheory.abelianLocalArtinMap K U u := hfUcanonical + _ = rU (LocalClassFieldTheory.abelianLocalArtinMap K Ffield u) := by + symm + exact DFunLike.congr_fun + (LocalClassFieldTheory.abelianLocalArtinMap_restrict + K U Ffield le_sup_right) u + have hgen : Subgroup.zpowers (rU (f Fpack u)) = ⊤ := by + rw [hfc] + exact hcanon + have hUcard : Nat.card (U ≃ₐ[K] U) = d := by + rw [IsGalois.card_aut_eq_finrank] + exact LocalClassFieldTheory.localFiniteUnramifiedField_finrank K d hd + have horder : orderOf (rU (f Fpack u)) = d := + (orderOf_eq_card_of_zpowers_eq_top hgen).trans hUcard + have hFmon : (f Fpack).toMonoidHom = (g Fpack).toMonoidHom := by + apply LocalClassFieldTheory.monoidHom_ext_of_cyclic_quotient_and_subgroups + (f Fpack).toMonoidHom (g Fpack).toMonoidHom rU u + · exact hgen + · intro σ + change σ ^ orderOf (rU (f Fpack u)) = 1 + rw [horder] + exact LocalClassFieldTheory.finiteAbelianUnramifiedCompositum_pow_eq_one + K E.1 d hd (dvd_refl d) σ + · intro S x hx + exact LocalClassFieldTheory.finiteAbelianArtinFamilies_subgroup_preimage_le + K f g hfker hgker hfcoh hgcoh Fpack S x hx + · intro x + calc + rU (g Fpack x) = g Upack x := + hrestrict g hgcoh Upack Fpack le_sup_right x + _ = f Upack x := DFunLike.congr_fun hUeq.symm x + _ = rU (f Fpack x) := + (hrestrict f hfcoh Upack Fpack le_sup_right x).symm + have hF : f Fpack = g Fpack := by + apply ContinuousMonoidHom.ext + intro x + exact DFunLike.congr_fun hFmon x + apply ContinuousMonoidHom.ext + intro x + calc + f E x = rE (f Fpack x) := + (hrestrict f hfcoh E Fpack le_sup_left x).symm + _ = rE (g Fpack x) := congrArg rE (DFunLike.congr_fun hF x) + _ = g E x := hrestrict g hgcoh E Fpack le_sup_left x + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization.lean new file mode 100644 index 0000000000..2793f9acfa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization.lean @@ -0,0 +1,123 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +public import Mathlib.NumberTheory.LocalField.Basic +public import Mathlib.RingTheory.DedekindDomain.Factorization +public import Mathlib.RingTheory.Valuation.Discrete.Basic +public import Mathlib.RingTheory.Valuation.Extension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +/-! +# Frobenius normalization of one coherent finite local reciprocity family + +The same family has norm kernels and restriction compatibility, and at each +unramified valued realization sends an inverse uniformizer to arithmetic +Frobenius on the residue field. The local-field structures on an intermediate +field are explicit because the chosen separable closure does not currently +carry a canonical valued-field structure in the public definitions. +-/ + +@[expose] public section + +open scoped ValuativeRel + +noncomputable +section + +namespace ClassFieldTheory + +/-- One coherent family of finite local Artin maps is normalized by arithmetic +Frobenius at every unramified valued realization of a member. The valuation +of the member must extend the valuation of `K`. -/ +theorem finiteAbelianLocalReciprocity_family_unramifiedNormalization + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + ∃ artin : (E : FiniteAbelianLocalExtension K) → + Kˣ →ₜ* (E.1 ≃ₐ[K] E.1), + (∀ E : FiniteAbelianLocalExtension K, + Function.Surjective (artin E) ∧ + (artin E).toMonoidHom.ker = E.normSubgroup) ∧ + (∀ (E F : FiniteAbelianLocalExtension K) + (hEF : E.1 ≤ F.1) (x : Kˣ) (y : E.1), + IntermediateField.inclusion hEF ((artin E x) y) = + (artin F x) (IntermediateField.inclusion hEF y)) ∧ + ∀ (E : FiniteAbelianLocalExtension K) + [ValuativeRel E.1] [UniformSpace E.1] [IsUniformAddGroup E.1] + [IsNonarchimedeanLocalField E.1] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation E.1)], + (𝓂[E.1] : Ideal 𝒪[E.1]).ramificationIdx 𝒪[K] = 1 → + ∀ (π : 𝒪[K]) + (hπ : (ValuativeRel.valuation K).IsUniformizer (π : K)) + (x : 𝒪[E.1]), + ∃ z : 𝒪[E.1], + (z : E.1) = + (artin E ((Units.mk0 (π : K) hπ.ne_zero)⁻¹)) (x : E.1) ∧ + IsLocalRing.residue 𝒪[E.1] z = + (IsLocalRing.residue 𝒪[E.1] x) ^ Nat.card 𝓀[K] := by + refine ⟨fun E => LocalClassFieldTheory.abelianLocalArtinMap K E.1, ?_, ?_, ?_⟩ + · intro E + constructor + · exact LocalClassFieldTheory.abelianLocalArtinMap_surjective K E.1 + · change + (LocalClassFieldTheory.abelianLocalArtinMap K E.1).toMonoidHom.ker = + LocalFieldTheory.localNormSubgroup K E.1 + exact LocalClassFieldTheory.abelianLocalArtinMap_ker K E.1 + · intro E F hEF x y + have hrestrict := DFunLike.congr_fun + (LocalClassFieldTheory.abelianLocalArtinMap_restrict K E.1 F.1 hEF) x + change + RamificationTheory.intermediateFieldRestrictNormalHom E.1 F.1 hEF + (LocalClassFieldTheory.abelianLocalArtinMap K F.1 x) = + LocalClassFieldTheory.abelianLocalArtinMap K E.1 x at hrestrict + apply Subtype.ext + change + E.1.val ((LocalClassFieldTheory.abelianLocalArtinMap K E.1 x) y) = + F.1.val ((LocalClassFieldTheory.abelianLocalArtinMap K F.1 x) + (IntermediateField.inclusion hEF y)) + calc + E.1.val ((LocalClassFieldTheory.abelianLocalArtinMap K E.1 x) y) = + E.1.val + ((RamificationTheory.intermediateFieldRestrictNormalHom + E.1 F.1 hEF + (LocalClassFieldTheory.abelianLocalArtinMap K F.1 x)) y) := by + rw [hrestrict] + _ = F.1.val ((LocalClassFieldTheory.abelianLocalArtinMap K F.1 x) + (IntermediateField.inclusion hEF y)) := + RamificationTheory.intermediateFieldRestrictNormalHom_apply_val + E.1 F.1 hEF + (LocalClassFieldTheory.abelianLocalArtinMap K F.1 x) y + · intro E _ _ _ _ _ hUnram π hπ x + have : LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + K E.1 := ⟨hUnram⟩ + let u : Kˣ := Units.mk0 (π : K) hπ.ne_zero + have hvalUnit : + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul u) = -1 := + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_uniformizerFieldUnit + K π hπ + have hval : + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul (u⁻¹)) = 1 := by + calc + _ = -LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul u) := by + change + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (-(Additive.ofMul u)) = _ + exact + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_neg + K (Additive.ofMul u) + _ = 1 := by rw [hvalUnit]; norm_num + simpa only [u] using + (finiteAbelianLocalArtinMap_inverseUniformizer_residue_pow + K E.1 (u⁻¹) hval x) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityIndex.lean new file mode 100644 index 0000000000..e1474d3b2e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityIndex.lean @@ -0,0 +1,34 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.NumberTheory.LocalField.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface +/-! +# Index formula in finite abelian local reciprocity + +The index of the norm subgroup equals the degree of the finite abelian local +extension. This is the numerical form of the reciprocity isomorphism. +-/ + +@[expose] public section + +namespace ClassFieldTheory + +/-- The norm-subgroup index is the degree of the extension. -/ +theorem fieldNormSubgroup_index_eq_finrank + (K L : Type) + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + (fieldNormSubgroup K L).index = Module.finrank K L := by + exact LocalCFT.fieldNormSubgroup_index_eq_finrank K L + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotient.lean new file mode 100644 index 0000000000..e6488304ff --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotient.lean @@ -0,0 +1,44 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.NumberTheory.LocalField.Basic +public import Mathlib.Topology.Algebra.ContinuousMonoidHom +public import Mathlib.Topology.Algebra.Group.Quotient +/-! +# Quotient form of finite abelian local reciprocity + +This module states the quotient formulation of local reciprocity for a +finite abelian extension `L / K` of a nonarchimedean local field. Under the +finite-dimensional, abelian-Galois, valuative, and topological assumptions, +the conclusion identifies `Kˣ / N_{L/K}(Lˣ)` with the ordinary Galois group +by a continuous multiplicative equivalence. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +/-- The field-norm quotient is continuously multiplicatively equivalent to +the finite abelian Galois group. -/ +theorem finiteAbelianLocalReciprocity_quotient + (K L : Type) + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + Nonempty + (FieldNormQuotient K L ≃ₜ* (L ≃ₐ[K] L)) := by + exact LocalCFT.finiteAbelianLocalReciprocity_quotient K L + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivMk.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivMk.lean new file mode 100644 index 0000000000..48ab73c571 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivMk.lean @@ -0,0 +1,54 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivOfArtin +public import Mathlib.FieldTheory.KrullTopology +public import Mathlib.Topology.Algebra.Constructions +public import Mathlib.Topology.Algebra.Group.Quotient +/-! +# The local norm quotient is induced by the Artin map + +The existence statements for the finite Artin map and the norm-quotient +isomorphism alone do not say that their witnesses agree. Here a single +canonical Artin map is chosen, and its quotient isomorphism is characterized +uniquely by its values on classes of nonzero field elements. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +/-- The continuous norm-quotient equivalence is uniquely determined by the +canonical finite local Artin map, with the expected value on every class. -/ +theorem finiteAbelianLocalReciprocity_quotientEquiv_mk + (K L : Type) + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + ∃ artin : Kˣ →ₜ* (L ≃ₐ[K] L), + Function.Surjective artin ∧ + artin.ker = fieldNormSubgroup K L ∧ + ∃! e : FieldNormQuotient K L ≃ₜ* (L ≃ₐ[K] L), + ∀ x : Kˣ, e (QuotientGroup.mk' (fieldNormSubgroup K L) x) = artin x := by + let artin := LocalClassFieldTheory.abelianLocalArtinMap K L + have hker : artin.ker = fieldNormSubgroup K L := by + change (LocalClassFieldTheory.abelianLocalArtinMap K L).toMonoidHom.ker = + LocalFieldTheory.localNormSubgroup K L + exact LocalClassFieldTheory.abelianLocalArtinMap_ker K L + exact ⟨artin, LocalClassFieldTheory.abelianLocalArtinMap_surjective K L, + hker, + finiteAbelianLocalReciprocity_quotientEquiv_of_artin K L artin + (LocalClassFieldTheory.abelianLocalArtinMap_surjective K L) hker⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivOfArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivOfArtin.lean new file mode 100644 index 0000000000..bbe25112d7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivOfArtin.lean @@ -0,0 +1,79 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormQuotient +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.FieldTheory.KrullTopology +public import Mathlib.NumberTheory.LocalField.Basic +public import Mathlib.RingTheory.Valuation.ValuativeRel.Basic +public import Mathlib.Topology.Algebra.Constructions +public import Mathlib.Topology.Algebra.Group.Quotient +/-! +# The norm quotient induced by a specified finite local Artin map + +The first isomorphism theorem determines the quotient equivalence from any +specified continuous surjective homomorphism with the field-norm kernel. +This is distinct from uniqueness of the Artin map itself. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- Any specified continuous surjective homomorphism with the field-norm +kernel induces one and only one continuous equivalence of the norm quotient. +The equivalence evaluates to the specified map on every quotient class. -/ +theorem finiteAbelianLocalReciprocity_quotientEquiv_of_artin + (K : Type u) (L : Type v) + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (artin : Kˣ →ₜ* (L ≃ₐ[K] L)) + (hsurj : Function.Surjective artin) + (hker : artin.ker = fieldNormSubgroup K L) : + ∃! e : FieldNormQuotient K L ≃ₜ* (L ≃ₐ[K] L), + ∀ x : Kˣ, e (QuotientGroup.mk' (fieldNormSubgroup K L) x) = artin x := by + have hOpen : IsOpen (fieldNormSubgroup K L : Set Kˣ) := by + have hOpenKer : IsOpen (artin.ker : Set Kˣ) := by + change IsOpen (artin ⁻¹' {1}) + exact (isOpen_discrete {1}).preimage artin.continuous + rwa [← hker] + have hDiscrete : DiscreteTopology (FieldNormQuotient K L) := + QuotientGroup.discreteTopology hOpen + let e₀ : FieldNormQuotient K L ≃* (L ≃ₐ[K] L) := + (QuotientGroup.quotientMulEquivOfEq hker.symm).trans + (QuotientGroup.quotientKerEquivOfSurjective artin.toMonoidHom hsurj) + let e : FieldNormQuotient K L ≃ₜ* (L ≃ₐ[K] L) := + { e₀ with + continuous_toFun := @continuous_of_discreteTopology + (FieldNormQuotient K L) _ hDiscrete (L ≃ₐ[K] L) _ e₀ + continuous_invFun := continuous_of_discreteTopology } + have he (x : Kˣ) : + e (QuotientGroup.mk' (fieldNormSubgroup K L) x) = artin x := by + change e₀ (QuotientGroup.mk' (fieldNormSubgroup K L) x) = artin x + change (QuotientGroup.quotientKerEquivOfSurjective + artin.toMonoidHom hsurj) + ((QuotientGroup.quotientMulEquivOfEq hker.symm) + (QuotientGroup.mk x)) = artin x + rw [QuotientGroup.quotientMulEquivOfEq_mk] + rfl + refine ⟨e, he, ?_⟩ + intro e' he' + apply ContinuousMulEquiv.ext + intro y + obtain ⟨x, rfl⟩ := + QuotientGroup.mk'_surjective (fieldNormSubgroup K L) y + exact (he' x).trans (he x).symm + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityTower.lean new file mode 100644 index 0000000000..2f7f6c953b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityTower.lean @@ -0,0 +1,62 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality +/-! +# Tower compatibility of finite local reciprocity + +The canonical finite local Artin maps are compatible with restriction in a +tower of finite abelian extensions. This is stronger than separately choosing +the maps supplied by the finite-level existence theorem; the proof uses the +single compatible construction in the implementation layer. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +/-- In a finite abelian tower `K ⊆ E ⊆ L`, one can choose the two continuous +Artin maps so that restriction of the upper map equals the lower map. Both +maps retain the expected norm kernels. -/ +theorem finiteAbelianLocalReciprocity_tower + (K E L : Type) + [Field K] [Field E] [Field L] + [Algebra K E] [Algebra E L] [Algebra K L] + [IsScalarTower K E L] + [FiniteDimensional K E] [FiniteDimensional K L] + [IsAbelianGalois K E] [IsAbelianGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + ∃ artinL : Kˣ →ₜ* (L ≃ₐ[K] L), + ∃ artinE : Kˣ →ₜ* (E ≃ₐ[K] E), + Function.Surjective artinL ∧ + Function.Surjective artinE ∧ + artinL.ker = fieldNormSubgroup K L ∧ + artinE.ker = fieldNormSubgroup K E ∧ + (AlgEquiv.restrictNormalHom E).comp artinL.toMonoidHom = + artinE.toMonoidHom := by + refine ⟨LocalClassFieldTheory.abelianLocalArtinMap K L, + LocalClassFieldTheory.abelianLocalArtinMap K E, + LocalClassFieldTheory.abelianLocalArtinMap_surjective K L, + LocalClassFieldTheory.abelianLocalArtinMap_surjective K E, + ?_, ?_, ?_⟩ + · change (LocalClassFieldTheory.abelianLocalArtinMap K L).toMonoidHom.ker = + LocalFieldTheory.localNormSubgroup K L + exact LocalClassFieldTheory.abelianLocalArtinMap_ker K L + · change (LocalClassFieldTheory.abelianLocalArtinMap K E).toMonoidHom.ker = + LocalFieldTheory.localNormSubgroup K E + exact LocalClassFieldTheory.abelianLocalArtinMap_ker K E + · rw [LocalClassFieldTheory.abelianLocalArtinMap_toMonoidHom K L, + LocalClassFieldTheory.abelianLocalArtinMap_toMonoidHom K E] + exact LocalClassFieldTheory.abelianLocalArtinMonoidHom_restrict_tower K E L + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedFamilyExt.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedFamilyExt.lean new file mode 100644 index 0000000000..186aeac3c3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedFamilyExt.lean @@ -0,0 +1,101 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedHomExt +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedResidueUniqueness +public import Mathlib.NumberTheory.LocalField.Basic +public import Mathlib.RingTheory.DedekindDomain.Factorization +public import Mathlib.RingTheory.Valuation.Extension +/-! +# Uniqueness of normalized families on unramified members + +Two finite local reciprocity families with the norm kernels and arithmetic +Frobenius residue normalization agree on every unramified valued member. This +does not assert uniqueness on ramified members of the families. +-/ + +@[expose] public section + +open scoped ValuativeRel + +noncomputable +section + +namespace ClassFieldTheory + +/-- The norm-kernel and arithmetic Frobenius conditions determine the value of +two local reciprocity families at an unramified member. -/ +theorem finiteAbelianLocalReciprocity_unramified_family_ext + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (f g : (E : FiniteAbelianLocalExtension K) → + Kˣ →ₜ* (E.1 ≃ₐ[K] E.1)) + (hfker : ∀ E : FiniteAbelianLocalExtension K, + (f E).toMonoidHom.ker = E.normSubgroup) + (hgker : ∀ E : FiniteAbelianLocalExtension K, + (g E).toMonoidHom.ker = E.normSubgroup) + (hfrob : ∀ (E : FiniteAbelianLocalExtension K) + [ValuativeRel E.1] [UniformSpace E.1] [IsUniformAddGroup E.1] + [IsNonarchimedeanLocalField E.1] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation E.1)], + (𝓂[E.1] : Ideal 𝒪[E.1]).ramificationIdx 𝒪[K] = 1 → + ∀ (π : 𝒪[K]) + (hπ : (ValuativeRel.valuation K).IsUniformizer (π : K)) + (x : 𝒪[E.1]), + ∃ z : 𝒪[E.1], + (z : E.1) = + (f E ((Units.mk0 (π : K) hπ.ne_zero)⁻¹)) (x : E.1) ∧ + IsLocalRing.residue 𝒪[E.1] z = + (IsLocalRing.residue 𝒪[E.1] x) ^ Nat.card 𝓀[K]) + (hgrob : ∀ (E : FiniteAbelianLocalExtension K) + [ValuativeRel E.1] [UniformSpace E.1] [IsUniformAddGroup E.1] + [IsNonarchimedeanLocalField E.1] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation E.1)], + (𝓂[E.1] : Ideal 𝒪[E.1]).ramificationIdx 𝒪[K] = 1 → + ∀ (π : 𝒪[K]) + (hπ : (ValuativeRel.valuation K).IsUniformizer (π : K)) + (x : 𝒪[E.1]), + ∃ z : 𝒪[E.1], + (z : E.1) = + (g E ((Units.mk0 (π : K) hπ.ne_zero)⁻¹)) (x : E.1) ∧ + IsLocalRing.residue 𝒪[E.1] z = + (IsLocalRing.residue 𝒪[E.1] x) ^ Nat.card 𝓀[K]) + (E : FiniteAbelianLocalExtension K) + [ValuativeRel E.1] [UniformSpace E.1] [IsUniformAddGroup E.1] + [IsNonarchimedeanLocalField E.1] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation E.1)] + (hUnram : (𝓂[E.1] : Ideal 𝒪[E.1]).ramificationIdx 𝒪[K] = 1) + (π : 𝒪[K]) + (hπ : (ValuativeRel.valuation K).IsUniformizer (π : K)) : + f E = g E := by + let : LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + K E.1 := ⟨hUnram⟩ + have hfϖ : + f E ((Units.mk0 (π : K) hπ.ne_zero)⁻¹) = + LocalClassFieldTheory.abelianLocalArtinMap K E.1 + ((Units.mk0 (π : K) hπ.ne_zero)⁻¹) := + (finiteAbelianLocalArtinMap_inverseUniformizer_residue_pow_iff + K E.1 π hπ _).mp (hfrob E hUnram π hπ) + have hgϖ : + g E ((Units.mk0 (π : K) hπ.ne_zero)⁻¹) = + LocalClassFieldTheory.abelianLocalArtinMap K E.1 + ((Units.mk0 (π : K) hπ.ne_zero)⁻¹) := + (finiteAbelianLocalArtinMap_inverseUniformizer_residue_pow_iff + K E.1 π hπ _).mp (hgrob E hUnram π hπ) + have hfker' := hfker E + have hgker' := hgker E + change (f E).toMonoidHom.ker = fieldNormSubgroup K E.1 at hfker' + change (g E).toMonoidHom.ker = fieldNormSubgroup K E.1 at hgker' + exact finiteAbelianLocalReciprocity_unramified_hom_ext + K E.1 hUnram π hπ (f E) (g E) hfker' hgker' (hfϖ.trans hgϖ.symm) + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedHomExt.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedHomExt.lean new file mode 100644 index 0000000000..dfbabd746c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedHomExt.lean @@ -0,0 +1,117 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.NumberTheory.LocalField.Basic +public import Mathlib.RingTheory.DedekindDomain.Factorization +public import Mathlib.Topology.Algebra.ContinuousMonoidHom +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +/-! +# Uniqueness from an unramified norm kernel and a uniformizer value + +For a fixed finite unramified abelian extension, the norm subgroup contains +every integer unit. The decomposition of a field unit into an integer unit +and a power of an inverse uniformizer therefore determines a homomorphism +with this kernel from its value on that inverse uniformizer. + +This is the unramified generator step, not uniqueness of finite local Artin +maps for ramified extensions. +-/ + +@[expose] public section + +open scoped ValuativeRel +open LocalFieldTheory.IsNonarchimedeanLocalField + +noncomputable +section + +namespace ClassFieldTheory + +/-- For an unramified extension, two norm-kernel homomorphisms that agree on +one inverse uniformizer agree on all field units. -/ +theorem finiteAbelianLocalReciprocity_unramified_hom_ext + (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsAbelianGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + (hUnram : (𝓂[L] : Ideal 𝒪[L]).ramificationIdx 𝒪[K] = 1) + (π : 𝒪[K]) + (hπ : (ValuativeRel.valuation K).IsUniformizer (π : K)) + (f g : Kˣ →ₜ* (L ≃ₐ[K] L)) + (hfker : f.toMonoidHom.ker = fieldNormSubgroup K L) + (hgker : g.toMonoidHom.ker = fieldNormSubgroup K L) + (hϖ : f ((Units.mk0 (π : K) hπ.ne_zero)⁻¹) = + g ((Units.mk0 (π : K) hπ.ne_zero)⁻¹)) : + f = g := by + let : IsIntegralClosure 𝒪[L] 𝒪[K] L := + LocalFieldTheory.localCompleteDVF_integerRing_isIntegralClosure K L + let : Module.Finite 𝒪[K] 𝒪[L] := + LocalFieldTheory.localCompleteDVF_integerRing_moduleFinite K L + let : LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + K L := ⟨hUnram⟩ + let ϖ : Kˣ := (Units.mk0 (π : K) hπ.ne_zero)⁻¹ + have hϖval : valuationMap K (Additive.ofMul ϖ) = 1 := by + have hπval := valuationMap_uniformizerFieldUnit K π hπ + calc + valuationMap K (Additive.ofMul ϖ) = + -valuationMap K + (Additive.ofMul (Units.mk0 (π : K) hπ.ne_zero)) := by + change valuationMap K + (-(Additive.ofMul (Units.mk0 (π : K) hπ.ne_zero))) = _ + exact valuationMap_neg K _ + _ = 1 := by + change -(valuationMap K + (Additive.ofMul (uniformizerFieldUnit K π hπ))) = 1 + rw [hπval] + norm_num + have hNorm (u : 𝒪[K]ˣ) : + integerUnitsToFieldUnits K u ∈ fieldNormSubgroup K L := by + change integerUnitsToFieldUnits K u ∈ + LocalFieldTheory.localNormSubgroup K L + rw [LocalClassFieldTheory.normSubgroup_eq_unramifiedNormSubgroup_of_isIntegralClosure + K L] + apply (LocalClassFieldTheory.mem_unramifiedNormSubgroup_iff K + (Module.finrank K L) (integerUnitsToFieldUnits K u)).2 + rw [valuationMap_apply, v_integerUnitsToFieldUnits] + exact dvd_zero _ + apply ContinuousMonoidHom.ext + intro x + obtain ⟨u, hu⟩ := exists_integerUnit_mul_uniformizer_zpow K ϖ hϖval x + have hfu : f (integerUnitsToFieldUnits K u) = 1 := by + have hmem : integerUnitsToFieldUnits K u ∈ f.toMonoidHom.ker := by + rw [hfker] + exact hNorm u + exact hmem + have hgu : g (integerUnitsToFieldUnits K u) = 1 := by + have hmem : integerUnitsToFieldUnits K u ∈ g.toMonoidHom.ker := by + rw [hgker] + exact hNorm u + exact hmem + calc + f x = f (integerUnitsToFieldUnits K u * + ϖ ^ valuationMap K (Additive.ofMul x)) := congrArg f hu.symm + _ = f (integerUnitsToFieldUnits K u) * + (f ϖ) ^ valuationMap K (Additive.ofMul x) := by + rw [map_mul, map_zpow] + _ = g (integerUnitsToFieldUnits K u) * + (g ϖ) ^ valuationMap K (Additive.ofMul x) := by + rw [hfu, hgu, hϖ] + _ = g (integerUnitsToFieldUnits K u * + ϖ ^ valuationMap K (Additive.ofMul x)) := by + rw [map_mul, map_zpow] + _ = g x := congrArg g hu + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedNormalization.lean new file mode 100644 index 0000000000..9d674819bc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedNormalization.lean @@ -0,0 +1,90 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.NumberTheory.LocalField.Basic +public import Mathlib.RingTheory.DedekindDomain.Factorization +public import Mathlib.Topology.Algebra.ContinuousMonoidHom +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +/-! +# Arithmetic normalization of finite local reciprocity + +For an unramified finite abelian extension, one and the same Artin map is +surjective, has the field-norm kernel, and sends every inverse uniformizer +to the arithmetic Frobenius on residues. The statement uses only Mathlib +and public Definitions vocabulary; the implementation is used in the proof. +-/ + +@[expose] public section + +open scoped ValuativeRel + +noncomputable +section + +namespace ClassFieldTheory + +/-- An unramified finite abelian extension admits a norm-kernel Artin map +whose value on the inverse of each uniformizer acts by the arithmetic +`q`-power Frobenius on the residue field. -/ +theorem finiteAbelianLocalReciprocity_unramifiedNormalization + (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [UniformSpace L] [IsUniformAddGroup L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsAbelianGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + (hUnram : (𝓂[L] : Ideal 𝒪[L]).ramificationIdx 𝒪[K] = 1) : + ∃ artin : Kˣ →ₜ* (L ≃ₐ[K] L), + Function.Surjective artin ∧ + artin.toMonoidHom.ker = fieldNormSubgroup K L ∧ + ∀ (π : 𝒪[K]) + (hπ : (ValuativeRel.valuation K).IsUniformizer (π : K)) + (x : 𝒪[L]), + ∃ z : 𝒪[L], + (z : L) = + (artin ((Units.mk0 (π : K) hπ.ne_zero)⁻¹)) (x : L) ∧ + IsLocalRing.residue 𝒪[L] z = + (IsLocalRing.residue 𝒪[L] x) ^ Nat.card 𝓀[K] := by + have : LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension + K L := ⟨hUnram⟩ + refine ⟨LocalClassFieldTheory.abelianLocalArtinMap K L, ?_, ?_, ?_⟩ + · exact LocalClassFieldTheory.abelianLocalArtinMap_surjective K L + · change + (LocalClassFieldTheory.abelianLocalArtinMap K L).toMonoidHom.ker = + LocalFieldTheory.localNormSubgroup K L + exact LocalClassFieldTheory.abelianLocalArtinMap_ker K L + · intro π hπ x + let u : Kˣ := Units.mk0 (π : K) hπ.ne_zero + have hvalUnit : + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul u) = -1 := by + exact + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_uniformizerFieldUnit + K π hπ + have hval : + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul (u⁻¹)) = 1 := by + calc + _ = -LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul u) := by + change + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (-(Additive.ofMul u)) = _ + exact + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_neg + K (Additive.ofMul u) + _ = 1 := by rw [hvalUnit]; norm_num + exact finiteAbelianLocalArtinMap_inverseUniformizer_residue_pow + K L (u⁻¹) hval x + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/MemFieldNormSubgroupIff.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/MemFieldNormSubgroupIff.lean new file mode 100644 index 0000000000..5dd0ea8701 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/MemFieldNormSubgroupIff.lean @@ -0,0 +1,45 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm +/-! +# Membership in the field-norm subgroup + +This module gives the concrete meaning of the public predicate +`IsFieldNorm`. For a finite-dimensional extension of fields `L / K` and a +unit `x` of `K`, it states that `x` belongs to the range of the unit-valued +field norm exactly when some unit of `L` has algebra norm equal to `x`. +No Galois, local-field, or topological assumption is required. +-/ + +@[expose] public section + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- Membership in the norm subgroup is equivalent to being the algebra norm +of a unit of the extension field. -/ +theorem mem_fieldNormSubgroup_iff + (K : Type u) (L : Type v) + [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] + (x : Kˣ) : + IsFieldNorm K L x ↔ + ∃ y : Lˣ, Algebra.norm K (y : L) = (x : K) := by + change (∃ y : Lˣ, fieldNormHom K L y = x) ↔ + ∃ y : Lˣ, Algebra.norm K (y : L) = (x : K) + constructor + · rintro ⟨y, hy⟩ + exact ⟨y, congrArg (fun z : Kˣ => (z : K)) hy⟩ + · rintro ⟨y, hy⟩ + exact ⟨y, Units.ext hy⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems.lean new file mode 100644 index 0000000000..204336d674 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CompletionTensorNormDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CompletionTensorNormDecompositionCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.ComplexInfinitePlaceAllNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CyclicHasseNormTheorem +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.GlobalNormIsEverywhereLocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.InfiniteNormIffPositive +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.NegativeOneNotInfiniteNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.TensorNormBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.UnramifiedInfinitePlaceAllNorm + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/All.lean new file mode 100644 index 0000000000..b0b06bc836 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/All.lean @@ -0,0 +1,23 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CyclicHasseNormTheorem +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CompletionTensorNormDecomposition +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CompletionTensorNormDecompositionCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.GlobalNormIsEverywhereLocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.ComplexInfinitePlaceAllNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.InfiniteNormIffPositive +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.NegativeOneNotInfiniteNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.UnramifiedInfinitePlaceAllNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.TensorNormBaseChange +/-! +# Local-to-global norm theorems + +This module gathers the public local-global principles for field norms. +-/ + diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecomposition.lean new file mode 100644 index 0000000000..e6c79fb2b2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecomposition.lean @@ -0,0 +1,66 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalNorm +public import Mathlib.RingTheory.Norm.Basic +public import Mathlib.RingTheory.TensorProduct.Basic +/-! +# Local norm as a product over completions + +The tensor algebra `K_v ⊗[K] L` is a product of the completions of `L` at +the absolute values above `v`. Its determinant norm is the product of the +norms of those components. The theorem exposes the decomposition and norm +formula using only Mathlib objects and the public extension index type. +-/ + +@[expose] public section + +open scoped BigOperators TensorProduct + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- A separable finite extension decomposes after completion, and its +determinant norm is the product of the norms of all completion components. -/ +theorem completionTensorNormDecomposition + {K : Type u} {L : Type v} + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) : + ∃ hfin : Fintype (ExtendingAbsoluteValue vK L), + letI := hfin + ∃ halg : ∀ w : ExtendingAbsoluteValue vK L, + Algebra vK.Completion w.1.Completion, + letI := halg + ∃ hmodule : ∀ w : ExtendingAbsoluteValue vK L, + Module.Finite vK.Completion w.1.Completion, + letI := hmodule + ∃ e : vK.Completion ⊗[K] L ≃ₐ[vK.Completion] + ∀ w : ExtendingAbsoluteValue vK L, w.1.Completion, + ∀ z : vK.Completion ⊗[K] L, + Algebra.norm vK.Completion z = + ∏ w : ExtendingAbsoluteValue vK L, + Algebra.norm vK.Completion (e z w) := by + classical + refine ⟨ + AlgebraicNumberTheory.Valuations.completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK, + (fun w => AbsoluteValue.completionAlgebra vK w.1 w.2), + (fun w => AlgebraicNumberTheory.Valuations.completionModuleFinite vK hvK w), + AlgebraicNumberTheory.Valuations.completionTensorDecompositionLeft + (K := K) (L := L) vK hvK, + ?_⟩ + intro z + exact RelativeIdeleGroup.localNorm_eq_prod vK hvK z + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecompositionCanonical.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecompositionCanonical.lean new file mode 100644 index 0000000000..d659c3f8bb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecompositionCanonical.lean @@ -0,0 +1,89 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalNorm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductDecomposition +public import Mathlib.RingTheory.Norm.Basic +public import Mathlib.RingTheory.TensorProduct.Basic +/-! +# Canonical evaluation in the completion tensor decomposition + +The finite product decomposition sends a pure tensor to the product of its +two canonical images in each completion. This specifies the same algebra +equivalence that appears in the determinant-norm product formula. +-/ + +@[expose] public section + +open scoped BigOperators TensorProduct + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- The completion tensor algebra decomposes canonically into the completions +above `vK`: on pure tensors each coordinate is standard multiplication, and +the determinant norm is the product of the coordinate norms. -/ +theorem completionTensorNormDecomposition_canonical + {K : Type u} {L : Type v} + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) : + ∃ hfin : Fintype (ExtendingAbsoluteValue vK L), + letI := hfin + ∃ halg : ∀ w : ExtendingAbsoluteValue vK L, + Algebra vK.Completion w.1.Completion, + letI := halg + ∃ hmodule : ∀ w : ExtendingAbsoluteValue vK L, + Module.Finite vK.Completion w.1.Completion, + letI := hmodule + ∃ e : vK.Completion ⊗[K] L ≃ₐ[vK.Completion] + ∀ w : ExtendingAbsoluteValue vK L, w.1.Completion, + (∀ (b : vK.Completion) (a : L) + (w : ExtendingAbsoluteValue vK L), + e (b ⊗ₜ[K] a) w = + algebraMap vK.Completion w.1.Completion b * + algebraMap L w.1.Completion a) ∧ + ∀ z : vK.Completion ⊗[K] L, + Algebra.norm vK.Completion z = + ∏ w : ExtendingAbsoluteValue vK L, + Algebra.norm vK.Completion (e z w) := by + classical + refine ⟨ + AlgebraicNumberTheory.Valuations.completionTensorDecompositionExtensionFintype + (K := K) (L := L) vK hvK, + (fun w => AbsoluteValue.completionAlgebra vK w.1 w.2), + (fun w => AlgebraicNumberTheory.Valuations.completionModuleFinite vK hvK w), + AlgebraicNumberTheory.Valuations.completionTensorDecompositionLeft + (K := K) (L := L) vK hvK, + ?_, ?_⟩ + · intro b a w + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + calc + _ = algebraMap vK.Completion w.1.Completion b * + AbsoluteValue.toCompletionAlgHom (K := K) w.1 a := + AlgebraicNumberTheory.Valuations.completionTensorDecomposition_left_tmul_apply + vK hvK b a w + _ = algebraMap vK.Completion w.1.Completion b * + algebraMap L w.1.Completion a := by + have hcomp : AbsoluteValue.toCompletionAlgHom (K := K) w.1 a = + algebraMap L w.1.Completion a := by + change AbsoluteValue.toCompletion w.1 a = + algebraMap L w.1.Completion a + exact AbsoluteValue.toCompletion_eq_algebraMap w.1 a + exact congrArg (fun y : w.1.Completion => + algebraMap vK.Completion w.1.Completion b * y) hcomp + · intro z + exact RelativeIdeleGroup.localNorm_eq_prod vK hvK z + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/ComplexInfinitePlaceAllNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/ComplexInfinitePlaceAllNorm.lean new file mode 100644 index 0000000000..b74ed019c5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/ComplexInfinitePlaceAllNorm.lean @@ -0,0 +1,50 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces +/-! +# Norms at a complex infinite place + +The positivity condition is vacuous at a complex place. Consequently every +nonzero base-field element is a determinant norm from the whole archimedean +tensor algebra. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField + +noncomputable +section + +namespace ClassFieldTheory + +universe u v + +/-- The determinant norm from `K_v ⊗_K L` is surjective on the image of +`Kˣ` when `v` is complex. -/ +theorem isNormAtInfinitePlace_of_complex + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : InfinitePlace K) (hv : v.IsComplex) (x : Kˣ) : + IsNormAtInfinitePlace K L v x := by + let xv : v.Completionˣ := Units.map (algebraMap K v.Completion) x + have hpos : xv ∈ RayClass.infinitePositiveSubgroup v := by + intro hr + exact ((InfinitePlace.not_isReal_iff_isComplex).2 hv hr).elim + have hnorm : xv ∈ infiniteTensorNormSubgroup (K := K) (L := L) v := + infinitePositiveSubgroup_le_infiniteTensorNormSubgroup + (K := K) (L := L) v hpos + obtain ⟨y, hy⟩ := hnorm + exact ⟨y, congrArg Units.val hy⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CyclicHasseNormTheorem.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CyclicHasseNormTheorem.lean new file mode 100644 index 0000000000..dd04e007b4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CyclicHasseNormTheorem.lean @@ -0,0 +1,42 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsEverywhereLocalNorm +public import Mathlib.Algebra.Group.DivInvMonoid +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.MathlibNormInterface +/-! +# The cyclic Hasse norm theorem + +This module states the local-to-global norm principle for a finite cyclic +Galois extension `L / K` of number fields. For a unit `x` of `K`, the +conclusion identifies membership in the global field-norm subgroup with the +condition of being a norm after base change to every finite and infinite +completion of `K`. +-/ + +@[expose] public section + +open scoped NumberField + +namespace ClassFieldTheory + +/-- For a finite cyclic number-field extension, a unit is a global norm if +and only if it is a norm at every completion. -/ +theorem cyclicHasseNormTheorem + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [IsCyclic (L ≃ₐ[K] L)] + (x : Kˣ) : + IsFieldNorm K L x ↔ IsEverywhereLocalNorm K L x := by + exact GlobalClassFieldTheory.ClassFieldAxiom.cyclicHasseNormTheorem K L x + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/GlobalNormIsEverywhereLocalNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/GlobalNormIsEverywhereLocalNorm.lean new file mode 100644 index 0000000000..81e9752d8a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/GlobalNormIsEverywhereLocalNorm.lean @@ -0,0 +1,59 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsEverywhereLocalNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.TensorNormBaseChange +/-! +# Global norms are local norms everywhere + +This module states the elementary local consequence of being a global field +norm. The assumptions give a finite extension `L / K` of number fields and +a unit `x` of `K`. The conclusion says that if `x` lies in the +global norm subgroup, then after scalar extension it is a determinant norm +at every finite and every infinite completion of `K`. +-/ + +@[expose] public section + +open scoped NumberField + +namespace ClassFieldTheory + +universe u v + +/-- Every global field norm is a norm over every completion. -/ +theorem globalNorm_isEverywhereLocalNorm + (K : Type u) (L : Type v) + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] + (x : Kˣ) : + IsFieldNorm K L x → IsEverywhereLocalNorm K L x := by + rintro ⟨y, rfl⟩ + constructor + · intro w + refine ⟨Units.map + (Algebra.TensorProduct.includeRight + (R := K) (A := w.adicCompletion K) (B := L)).toRingHom y, ?_⟩ + change Algebra.norm (w.adicCompletion K) + (Algebra.TensorProduct.includeRight + (R := K) (A := w.adicCompletion K) (B := L) (y : L)) = + algebraMap K (w.adicCompletion K) (Algebra.norm K (y : L)) + exact tensorNorm_includeRight K L (w.adicCompletion K) y + · intro w + refine ⟨Units.map + (Algebra.TensorProduct.includeRight + (R := K) (A := w.Completion) (B := L)).toRingHom y, ?_⟩ + change Algebra.norm w.Completion + (Algebra.TensorProduct.includeRight + (R := K) (A := w.Completion) (B := L) (y : L)) = + algebraMap K w.Completion (Algebra.norm K (y : L)) + exact tensorNorm_includeRight K L w.Completion y + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/InfiniteNormIffPositive.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/InfiniteNormIffPositive.lean new file mode 100644 index 0000000000..87946ee3cc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/InfiniteNormIffPositive.lean @@ -0,0 +1,77 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.InfinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfinitePlaceArtin +/-! +# The norm criterion at a real place that becomes complex + +At such a place the determinant norms from the full archimedean tensor +algebra are exactly the positive real elements. In particular this does +not incorrectly replace the tensor norm by a separate condition at every +factor of the tensor product. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField + +noncomputable +section + +namespace ClassFieldTheory + +/-- At a real place that becomes complex in a finite Galois extension, +being a norm from the archimedean tensor algebra is equivalent to positivity. -/ +theorem isNormAtInfinitePlace_iff_positive_of_real_complex + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (v : InfinitePlace K) (w : InfinitePlace L) + (hw : w.comap (algebraMap K L) = v) + (hv : v.IsReal) (hc : w.IsComplex) + (x : Kˣ) : + IsNormAtInfinitePlace K L v x ↔ + 0 < InfinitePlace.Completion.extensionEmbeddingOfIsReal hv + (algebraMap K v.Completion (x : K)) := by + let xv : v.Completionˣ := Units.map (algebraMap K v.Completion) x + let : w.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) hw⟩ + constructor + · rintro ⟨y, hy⟩ + have hnorm : xv ∈ infiniteTensorNormSubgroup (K := K) (L := L) v := by + refine ⟨y, ?_⟩ + apply Units.ext + exact hy + rw [infiniteTensorNormSubgroup_eq_localNormSubgroup + (K := K) (L := L) v w hw] at hnorm + obtain ⟨z, hz⟩ := hnorm + have hpos := + GlobalClassFieldTheory.Reciprocity.infinitePlace_normUnits_real_complex_pos + (K := K) (K' := L) v w hw hv hc z + rw [hz, InfinitePlace.Completion.ringEquivRealOfIsReal_apply] at hpos + exact hpos + · intro hpos + have hxpos : xv ∈ RayClass.infinitePositiveSubgroup v := by + intro hv' + have heq : hv' = hv := Subsingleton.elim _ _ + subst hv' + change 0 < InfinitePlace.Completion.extensionEmbeddingOfIsReal hv + (algebraMap K v.Completion (x : K)) + exact hpos + have hnorm : xv ∈ infiniteTensorNormSubgroup (K := K) (L := L) v := + infinitePositiveSubgroup_le_infiniteTensorNormSubgroup + (K := K) (L := L) v hxpos + obtain ⟨y, hy⟩ := hnorm + refine ⟨y, ?_⟩ + exact congrArg Units.val hy + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/NegativeOneNotInfiniteNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/NegativeOneNotInfiniteNorm.lean new file mode 100644 index 0000000000..fb9528b5bc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/NegativeOneNotInfiniteNorm.lean @@ -0,0 +1,63 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.InfinitePlaceTensorNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfinitePlaceArtin +/-! +# The real-to-complex norm obstruction + +At a real place which becomes complex, the determinant norm from the whole +archimedean tensor algebra cannot be negative. The tensor algebra, rather +than a single chosen completion, is the object in the public statement. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField + +noncomputable +section + +namespace ClassFieldTheory + +/-- Negative one is not a norm from the complete archimedean tensor algebra +if a real place becomes complex in a finite Galois extension. -/ +theorem not_isNormAtInfinitePlace_neg_one_of_real_complex + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (v : InfinitePlace K) (w : InfinitePlace L) + (hw : w.comap (algebraMap K L) = v) + (hv : v.IsReal) (hc : w.IsComplex) : + ¬ IsNormAtInfinitePlace K L v (-1 : Kˣ) := by + intro h + have hnorm : (-1 : v.Completionˣ) ∈ + infiniteTensorNormSubgroup (K := K) (L := L) v := by + obtain ⟨y, hy⟩ := h + refine ⟨y, ?_⟩ + apply Units.ext + change Algebra.norm v.Completion (y : v.Completion ⊗[K] L) = + (-1 : v.Completion) + simpa only [Units.coe_neg_one, map_neg, map_one] using hy + let : w.1.LiesOver v.1 := + ⟨congrArg (fun q : InfinitePlace K => q.1) hw⟩ + rw [infiniteTensorNormSubgroup_eq_localNormSubgroup + (K := K) (L := L) v w hw] at hnorm + obtain ⟨z, hz⟩ := hnorm + have hpos := GlobalClassFieldTheory.Reciprocity.infinitePlace_normUnits_real_complex_pos + (K := K) (K' := L) v w hw hv hc z + have hneg : (0 : ℝ) < -1 := by + rw [hz] at hpos + simpa only [InfinitePlace.Completion.ringEquivRealOfIsReal_apply, + Units.coe_neg_one, map_neg, map_one] using hpos + norm_num at hneg + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/TensorNormBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/TensorNormBaseChange.lean new file mode 100644 index 0000000000..2ade1435da --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/TensorNormBaseChange.lean @@ -0,0 +1,50 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RingTheory.Norm.Basic +public import Mathlib.RingTheory.TensorProduct.Basic +/-! +# Determinant norm and scalar extension + +For a finite field extension `L / K`, the norm of `y : L` is unchanged by +base change, in the sense that the determinant norm of `1 ⊗ y` over a +commutative `K`-algebra `A` is the image of its field norm over `K`. +This applies to the whole tensor algebra, whether or not it is a field. +-/ + +@[expose] public section + +open scoped TensorProduct + +namespace ClassFieldTheory + +universe u v w + +/-- The determinant norm on `A ⊗[K] L` of a globally defined element is the +base change of its field norm. In particular, no Galois assumption or choice +of a factor of the tensor algebra is required. -/ +theorem tensorNorm_includeRight + (K : Type u) (L : Type v) (A : Type w) + [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] + [CommRing A] [Algebra K A] + (y : L) : + Algebra.norm A + (Algebra.TensorProduct.includeRight (R := K) (A := A) (B := L) y) = + algebraMap K A (Algebra.norm K y) := by + classical + let b := Module.Free.chooseBasis K L + let bA := b.baseChange A + rw [Algebra.norm_eq_matrix_det bA, + Algebra.norm_eq_matrix_det b, (algebraMap K A).map_det] + congr 1 + ext i j + simp [bA, b, Algebra.TensorProduct.includeRight, + Algebra.smul_def, Algebra.leftMulMatrix_eq_repr_mul, + Algebra.TensorProduct.tmul_mul_tmul] + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/UnramifiedInfinitePlaceAllNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/UnramifiedInfinitePlaceAllNorm.lean new file mode 100644 index 0000000000..5f2ae24c39 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/UnramifiedInfinitePlaceAllNorm.lean @@ -0,0 +1,48 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness +/-! +# Norms at an unramified infinite place + +For a finite abelian extension, the determinant norm from the whole +archimedean tensor algebra is surjective when the base place is +unramified in the extension. +-/ + +@[expose] public section + +open scoped NumberField TensorProduct +open NumberField + +noncomputable +section + +namespace ClassFieldTheory + +/-- Every nonzero base-field element is an archimedean tensor norm at an +unramified infinite place of a finite abelian extension. -/ +theorem isNormAtInfinitePlace_of_unramified + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsAbelianGalois K L] + (v : InfinitePlace K) (hv : v.IsUnramifiedIn L) (x : Kˣ) : + IsNormAtInfinitePlace K L v x := by + have htop : infiniteTensorNormSubgroup (K := K) (L := L) v = ⊤ := + (GlobalClassFieldTheory.GlobalClassFields.infiniteTensorNormSubgroup_eq_top_iff_isUnramifiedIn + (K := K) (L := L) v).2 hv + let xv : v.Completionˣ := Units.map (algebraMap K v.Completion) x + have hnorm : xv ∈ infiniteTensorNormSubgroup (K := K) (L := L) v := by + rw [htop] + trivial + obtain ⟨y, hy⟩ := hnorm + exact ⟨y, congrArg Units.val hy⟩ + +end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology.lean b/LeanPool/ClassFieldTheory/GaloisCohomology.lean new file mode 100644 index 0000000000..fa28034db9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers +public import LeanPool.ClassFieldTheory.GaloisCohomology.Topology + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic.lean new file mode 100644 index 0000000000..bd0bbf00a8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.GaloisCohomology +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0 + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean new file mode 100644 index 0000000000..2d0ede71f9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean @@ -0,0 +1,89 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RepresentationTheory.Homological.GroupCohomology.FiniteCyclic +public import Mathlib.RepresentationTheory.Homological.GroupCohomology.Hilbert90 +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison + +/-! # Galois Cohomology -/ + +@[expose] public section +namespace CyclicCohomology + +/-! +# Cyclic Tate low-degree boundary + +For a finite cyclic group generated by `g`, mathlib computes odd group +cohomology using `Rep.FiniteCyclicGroup.subCompNormHom A g`. The canonical +boundary comparison identifies that short-complex homology with +`tateCohomology A (-1)`. + +This file applies that comparison to unit representations. The resulting +objects are mathlib's Tate cohomology objects directly; no parallel +low-degree model is introduced. +-/ + +noncomputable +section + +open CategoryTheory + +private theorem zpowers_eq_top_of_forall_mem_zpowers {G : Type} [Group G] (g : G) + (hg : ∀ x : G, x ∈ Subgroup.zpowers g) : + Subgroup.zpowers g = ⊤ := by + ext x + constructor + · intro _ + exact Subgroup.mem_top x + · intro _ + exact hg x + +private theorem isCyclic_of_forall_mem_zpowers {G : Type} [Group G] (g : G) + (hg : ∀ x : G, x ∈ Subgroup.zpowers g) : + IsCyclic G := by + rw [isCyclic_iff_exists_zpowers_eq_top] + exact ⟨g, zpowers_eq_top_of_forall_mem_zpowers g hg⟩ + +/-- Low-degree Tate periodicity in degree one: +for a finite cyclic group, `H¹(G,A)` is canonically isomorphic to mathlib's +degree-minus-one Tate cohomology. -/ +noncomputable def cyclicH1IsoHminusOne {k G : Type} [CommRing k] [Group G] + [Fintype G] (A : Rep k G) (g : G) + (hg : ∀ x : G, x ∈ Subgroup.zpowers g) : + groupCohomology A 1 ≅ tateCohomology A (-1) := by + letI : IsCyclic G := by exact isCyclic_of_forall_mem_zpowers g hg + letI : CommGroup G := IsCyclic.commGroup (α := G) + exact Rep.FiniteCyclicGroup.groupCohomologyIsoOdd A g hg 1 (by decide) ≪≫ + (TateCohomology.isoFiniteCyclicNegOne A g hg).symm + +/-- The cyclic low-degree comparison for the unit representation. -/ +noncomputable def unitsH1IsoTateHminusOne (K L : Type) [Field K] [Field L] + [Algebra K L] [FiniteDimensional K L] (g : Gal(L/K)) + (hg : ∀ x : Gal(L/K), x ∈ Subgroup.zpowers g) : + groupCohomology.H1 (Rep.ofAlgebraAutOnUnits K L) ≅ + tateCohomology (Rep.ofAlgebraAutOnUnits K L) (-1) := + cyclicH1IsoHminusOne (Rep.ofAlgebraAutOnUnits K L) g hg + +/-- Hilbert 90 transported through the cyclic `H¹ ≅ H^{-1}` comparison. +This is low-degree cyclic Tate cohomology for the coefficient group `Lˣ`: the vanishing of +`H¹(G,Lˣ)` gives the vanishing of `H^{-1}(G,Lˣ)`. -/ +theorem hilbert90_unitsTateHminusOne_isZero (K L : Type) [Field K] + [Field L] [Algebra K L] [FiniteDimensional K L] (g : Gal(L/K)) + (hg : ∀ x : Gal(L/K), x ∈ Subgroup.zpowers g) : + CategoryTheory.Limits.IsZero + (tateCohomology (Rep.ofAlgebraAutOnUnits K L) (-1)) := by + have hzero : + CategoryTheory.Limits.IsZero + (groupCohomology.H1 (Rep.ofAlgebraAutOnUnits K L)) := by + let _ := groupCohomology.H1ofAutOnUnitsUnique K L + exact ModuleCat.isZero_of_subsingleton _ + exact hzero.of_iso + (unitsH1IsoTateHminusOne K L g hg).symm + +end +end CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand.lean new file mode 100644 index 0000000000..576a2ffdaf --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Induced +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLattice +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Product + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandFiniteness.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandFiniteness.lean new file mode 100644 index 0000000000..d96e1d0873 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandFiniteness.lean @@ -0,0 +1,462 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Core +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.TateComparison +public import Mathlib.RepresentationTheory.Homological.GroupCohomology.FiniteCyclic +public import Mathlib.RepresentationTheory.Homological.GroupHomology.FiniteCyclic + +/-! # Herbrand Finiteness -/ + +@[expose] public section +namespace CyclicCohomology + +/-! +# Finiteness in the Herbrand exact hexagon + +This file supplies the finiteness clause in Herbrand-quotient multiplicativity: +for a short exact sequence of modules over a finite cyclic group, if the Herbrand +quotients of any two terms are defined, then the quotient of the third term is +defined as well. +-/ + +noncomputable +section + +namespace ProfiniteCohomology +namespace Herbrand + +open CategoryTheory + +universe uG uA + +variable {G A B C : Type} +variable [Group G] [Fintype G] [CommGroup A] [CommGroup B] [CommGroup C] +variable [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] + +/-- The condition that the Herbrand quotient of `A` is defined. -/ +def HerbrandQuotientDefined (G : Type uG) (A : Type uA) + [Group G] [Fintype G] [CommGroup A] [MulDistribMulAction G A] + (σ : G) : Prop := + Finite (HerbrandH0 G A) ∧ Finite (HerbrandHMinusOne G A σ) + +/-- In an exact pair `X → Y → Z`, finiteness of `X` and `Z` forces +finiteness of `Y`. -/ +private theorem finite_middle_of_exact + {X Y Z : Type} + [Group X] [Group Y] [Group Z] + (f : X →* Y) (g : Y →* Z) (hexact : MonoidHom.range f = MonoidHom.ker g) + [Finite X] [Finite Z] : + Finite Y := by + apply g.finite_iff_finite_ker_range.mpr + constructor + · let : Finite (MonoidHom.range f) := + Finite.of_surjective f.rangeRestrict f.rangeRestrict_surjective + rw [← hexact] + infer_instance + · infer_instance + +private theorem finite_middle_of_moduleCat_exact + {X Y Z : ModuleCat.{0} ℤ} (f : X ⟶ Y) (g : Y ⟶ Z) + (hexact : Function.Exact f g) + [Finite X] [Finite Z] : + Finite Y := by + let fm : Multiplicative X →* Multiplicative Y := + f.hom.toAddMonoidHom.toMultiplicative + let gm : Multiplicative Y →* Multiplicative Z := + g.hom.toAddMonoidHom.toMultiplicative + exact finite_middle_of_exact + (X := Multiplicative X) (Y := Multiplicative Y) + (Z := Multiplicative Z) fm gm + (mulExact_of_moduleCat_exact f g hexact).monoidHom_ker_eq.symm + +private noncomputable def tateHOneIsoHerbrandHMinusOne + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) : + tateCohomology (Rep.ofMulDistribMulAction G A) 1 ≅ + ModuleCat.of ℤ (Additive (HerbrandHMinusOne G A σ)) := by + letI : IsCyclic G := ⟨⟨σ, hgen⟩⟩ + letI : CommGroup G := IsCyclic.commGroup + let M := Rep.ofMulDistribMulAction G A + exact + (TateCohomology.isoGroupCohomology 1).app M ≪≫ + Rep.FiniteCyclicGroup.groupCohomologyIsoOdd + M σ hgen 1 (by simp) ≪≫ + (TateCohomology.isoFiniteCyclicNegOne M σ hgen).symm ≪≫ + tateHMinusOneIsoHerbrandHMinusOne σ hgen + +private noncomputable def tateHMinusTwoIsoHerbrandH0 + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) : + tateCohomology (Rep.ofMulDistribMulAction G A) (-2) ≅ + ModuleCat.of ℤ (Additive (HerbrandH0 G A)) := by + classical + letI : IsCyclic G := ⟨⟨σ, hgen⟩⟩ + letI : CommGroup G := IsCyclic.commGroup + let M := Rep.ofMulDistribMulAction G A + exact + (TateCohomology.isoGroupHomology (-2) 1 (by norm_num)).app M ≪≫ + Rep.FiniteCyclicGroup.groupHomologyIsoOdd + M σ hgen 1 (by simp) ≪≫ + (TateCohomology.isoFiniteCyclicZero M σ hgen).symm ≪≫ + tateH0IsoHerbrandH0 + +/-- Herbrand-quotient multiplicativity, finiteness transfer from the first and third terms to +the middle term. -/ +theorem herbrandQuotientDefined_middle_of_left_right + (i : A →* B) (j : B →* C) + (hi : ∀ (g : G) (a : A), i (g • a) = g • i a) + (hj : ∀ (g : G) (b : B), j (g • b) = g • j b) + (hker : ∀ b : B, j b = 1 ↔ ∃ a : A, i a = b) + (hinj : Function.Injective i) + (hsurj : ∀ c : C, ∃ b : B, j b = c) + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) + (hA : HerbrandQuotientDefined G A σ) + (hC : HerbrandQuotientDefined G C σ) : + HerbrandQuotientDefined G B σ := by + let : Finite (HerbrandH0 G A) := hA.1 + let : Finite (HerbrandHMinusOne G A σ) := hA.2 + let : Finite (HerbrandH0 G C) := hC.1 + let : Finite (HerbrandHMinusOne G C σ) := hC.2 + let S := equivariantShortComplex i j hi hj hker + have hS : S.ShortExact := + equivariantShortComplex_shortExact + i j hi hj hker hinj hsurj + let : Finite (tateCohomology S.X₁ (-1)) := + finite_source_of_moduleIso + (tateHMinusOneIsoHerbrandHMinusOne + (G := G) (A := A) σ hgen) + let : Finite (tateCohomology S.X₃ (-1)) := + finite_source_of_moduleIso + (tateHMinusOneIsoHerbrandHMinusOne + (G := G) (A := C) σ hgen) + have hminusTate : Finite (tateCohomology S.X₂ (-1)) := + finite_middle_of_moduleCat_exact + ((tateCohomologyFunctor (-1)).map S.f) + ((tateCohomologyFunctor (-1)).map S.g) + ((ShortComplex.ShortExact.moduleCat_exact_iff_function_exact _).1 + ((TateCohomology.map_tateComplexFunctor_shortExact hS) + |>.homology_exact₂ (-1))) + have hminus : Finite (HerbrandHMinusOne G B σ) := by + let : + Finite + (tateCohomology + (Rep.ofMulDistribMulAction G B) (-1)) := by + change Finite (tateCohomology S.X₂ (-1)) + exact hminusTate + exact finite_target_of_moduleIso + (tateHMinusOneIsoHerbrandHMinusOne + (G := G) (A := B) σ hgen) + let : Finite (tateCohomology S.X₁ 0) := + finite_source_of_moduleIso + (tateH0IsoHerbrandH0 (G := G) (A := A)) + let : Finite (tateCohomology S.X₃ 0) := + finite_source_of_moduleIso + (tateH0IsoHerbrandH0 (G := G) (A := C)) + have hzeroTate : Finite (tateCohomology S.X₂ 0) := + finite_middle_of_moduleCat_exact + ((tateCohomologyFunctor 0).map S.f) + ((tateCohomologyFunctor 0).map S.g) + ((ShortComplex.ShortExact.moduleCat_exact_iff_function_exact _).1 + ((TateCohomology.map_tateComplexFunctor_shortExact hS) + |>.homology_exact₂ 0)) + have hzero : Finite (HerbrandH0 G B) := by + let : + Finite + (tateCohomology + (Rep.ofMulDistribMulAction G B) 0) := by + change Finite (tateCohomology S.X₂ 0) + exact hzeroTate + exact finite_target_of_moduleIso + (tateH0IsoHerbrandH0 (G := G) (A := B)) + exact ⟨hzero, hminus⟩ + +/-- Herbrand-quotient multiplicativity, finiteness transfer from the first and middle terms to +the third term. -/ +theorem herbrandQuotientDefined_right_of_left_middle + (i : A →* B) (j : B →* C) + (hi : ∀ (g : G) (a : A), i (g • a) = g • i a) + (hj : ∀ (g : G) (b : B), j (g • b) = g • j b) + (hker : ∀ b : B, j b = 1 ↔ ∃ a : A, i a = b) + (hinj : Function.Injective i) + (hsurj : ∀ c : C, ∃ b : B, j b = c) + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) + (hA : HerbrandQuotientDefined G A σ) + (hB : HerbrandQuotientDefined G B σ) : + HerbrandQuotientDefined G C σ := by + let : Finite (HerbrandH0 G A) := hA.1 + let : Finite (HerbrandHMinusOne G A σ) := hA.2 + let : Finite (HerbrandH0 G B) := hB.1 + let : Finite (HerbrandHMinusOne G B σ) := hB.2 + let S := equivariantShortComplex i j hi hj hker + have hS : S.ShortExact := + equivariantShortComplex_shortExact + i j hi hj hker hinj hsurj + let : Finite (tateCohomology S.X₂ (-1)) := + finite_source_of_moduleIso + (tateHMinusOneIsoHerbrandHMinusOne + (G := G) (A := B) σ hgen) + have hA0 : Finite (tateCohomology S.X₁ 0) := + finite_source_of_moduleIso + (tateH0IsoHerbrandH0 (G := G) (A := A)) + let : Finite (tateCohomology S.X₁ ((-1) + 1)) := by + norm_num + exact hA0 + have hminusTate : Finite (tateCohomology S.X₃ (-1)) := + finite_middle_of_moduleCat_exact + ((tateCohomologyFunctor (-1)).map S.g) + (TateCohomology.δ hS (-1)) + ((ShortComplex.ShortExact.moduleCat_exact_iff_function_exact _).1 + (TateCohomology.exact₃ hS (-1))) + have hminus : Finite (HerbrandHMinusOne G C σ) := by + let : + Finite + (tateCohomology + (Rep.ofMulDistribMulAction G C) (-1)) := by + change Finite (tateCohomology S.X₃ (-1)) + exact hminusTate + exact finite_target_of_moduleIso + (tateHMinusOneIsoHerbrandHMinusOne + (G := G) (A := C) σ hgen) + let : Finite (tateCohomology S.X₂ 0) := + finite_source_of_moduleIso + (tateH0IsoHerbrandH0 (G := G) (A := B)) + have hA1 : Finite (tateCohomology S.X₁ 1) := + finite_source_of_moduleIso + (tateHOneIsoHerbrandHMinusOne + (G := G) (A := A) σ hgen) + let : Finite (tateCohomology S.X₁ (0 + 1)) := by + norm_num + exact hA1 + have hzeroTate : Finite (tateCohomology S.X₃ 0) := + finite_middle_of_moduleCat_exact + ((tateCohomologyFunctor 0).map S.g) + (TateCohomology.δ hS 0) + ((ShortComplex.ShortExact.moduleCat_exact_iff_function_exact _).1 + (TateCohomology.exact₃ hS 0)) + have hzero : Finite (HerbrandH0 G C) := by + let : + Finite + (tateCohomology + (Rep.ofMulDistribMulAction G C) 0) := by + change Finite (tateCohomology S.X₃ 0) + exact hzeroTate + exact finite_target_of_moduleIso + (tateH0IsoHerbrandH0 (G := G) (A := C)) + exact ⟨hzero, hminus⟩ + +/-- Herbrand-quotient multiplicativity, finiteness transfer from the middle and third terms to +the first term. -/ +theorem herbrandQuotientDefined_left_of_middle_right + (i : A →* B) (j : B →* C) + (hi : ∀ (g : G) (a : A), i (g • a) = g • i a) + (hj : ∀ (g : G) (b : B), j (g • b) = g • j b) + (hker : ∀ b : B, j b = 1 ↔ ∃ a : A, i a = b) + (hinj : Function.Injective i) + (hsurj : ∀ c : C, ∃ b : B, j b = c) + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) + (hB : HerbrandQuotientDefined G B σ) + (hC : HerbrandQuotientDefined G C σ) : + HerbrandQuotientDefined G A σ := by + let : Finite (HerbrandH0 G B) := hB.1 + let : Finite (HerbrandHMinusOne G B σ) := hB.2 + let : Finite (HerbrandH0 G C) := hC.1 + let : Finite (HerbrandHMinusOne G C σ) := hC.2 + let S := equivariantShortComplex i j hi hj hker + have hS : S.ShortExact := + equivariantShortComplex_shortExact + i j hi hj hker hinj hsurj + let : Finite (tateCohomology S.X₃ (-2)) := + finite_source_of_moduleIso + (tateHMinusTwoIsoHerbrandH0 + (G := G) (A := C) σ hgen) + have hBminus : Finite (tateCohomology S.X₂ (-1)) := + finite_source_of_moduleIso + (tateHMinusOneIsoHerbrandHMinusOne + (G := G) (A := B) σ hgen) + let : Finite ((tateCohomologyFunctor ((-2) + 1)).obj S.X₂) := by + norm_num + exact hBminus + have hminusTate : + Finite (tateCohomology S.X₁ ((-2) + 1)) := + finite_middle_of_moduleCat_exact + (TateCohomology.δ hS (-2)) + ((tateCohomologyFunctor ((-2) + 1)).map S.f) + ((ShortComplex.ShortExact.moduleCat_exact_iff_function_exact _).1 + (TateCohomology.exact₁ hS (-2))) + have hminus : Finite (HerbrandHMinusOne G A σ) := by + let : + Finite + (tateCohomology + (Rep.ofMulDistribMulAction G A) (-1)) := by + norm_num at hminusTate ⊢ + exact hminusTate + exact finite_target_of_moduleIso + (tateHMinusOneIsoHerbrandHMinusOne + (G := G) (A := A) σ hgen) + let : Finite (tateCohomology S.X₃ (-1)) := + finite_source_of_moduleIso + (tateHMinusOneIsoHerbrandHMinusOne + (G := G) (A := C) σ hgen) + let : Finite (tateCohomology S.X₂ 0) := + finite_source_of_moduleIso + (tateH0IsoHerbrandH0 (G := G) (A := B)) + have hzeroTate : Finite (tateCohomology S.X₁ 0) := + finite_middle_of_moduleCat_exact + (TateCohomology.δ hS (-1)) + ((tateCohomologyFunctor 0).map S.f) + ((ShortComplex.ShortExact.moduleCat_exact_iff_function_exact _).1 + (TateCohomology.exact₁ hS (-1))) + have hzero : Finite (HerbrandH0 G A) := by + let : + Finite + (tateCohomology + (Rep.ofMulDistribMulAction G A) 0) := by + change Finite (tateCohomology S.X₁ 0) + exact hzeroTate + exact finite_target_of_moduleIso + (tateH0IsoHerbrandH0 (G := G) (A := A)) + exact ⟨hzero, hminus⟩ + +/-- Herbrand-quotient multiplicativity, the complete "any two imply the third" finiteness +statement for a short exact sequence. -/ +theorem herbrandQuotientDefined_anyTwo + (i : A →* B) (j : B →* C) + (hi : ∀ (g : G) (a : A), i (g • a) = g • i a) + (hj : ∀ (g : G) (b : B), j (g • b) = g • j b) + (hker : ∀ b : B, j b = 1 ↔ ∃ a : A, i a = b) + (hinj : Function.Injective i) + (hsurj : ∀ c : C, ∃ b : B, j b = c) + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) : + (HerbrandQuotientDefined G A σ ∧ HerbrandQuotientDefined G B σ → + HerbrandQuotientDefined G C σ) ∧ + (HerbrandQuotientDefined G A σ ∧ HerbrandQuotientDefined G C σ → + HerbrandQuotientDefined G B σ) ∧ + (HerbrandQuotientDefined G B σ ∧ HerbrandQuotientDefined G C σ → + HerbrandQuotientDefined G A σ) := by + refine ⟨?_, ?_, ?_⟩ + · rintro ⟨hA, hB⟩ + exact herbrandQuotientDefined_right_of_left_middle + i j hi hj hker hinj hsurj σ hgen hA hB + · rintro ⟨hA, hC⟩ + exact herbrandQuotientDefined_middle_of_left_right + i j hi hj hker hinj hsurj σ hgen hA hC + · rintro ⟨hB, hC⟩ + exact herbrandQuotientDefined_left_of_middle_right + i j hi hj hker hinj hsurj σ hgen hB hC + +/-- Herbrand-quotient multiplicativity, Herbrand-quotient multiplicativity once the three +quotients are defined. -/ +theorem herbrandQuotient_multiplicative_of_shortExact + (i : A →* B) (j : B →* C) + (hi : ∀ (g : G) (a : A), i (g • a) = g • i a) + (hj : ∀ (g : G) (b : B), j (g • b) = g • j b) + (hker : ∀ b : B, j b = 1 ↔ ∃ a : A, i a = b) + (hinj : Function.Injective i) + (hsurj : ∀ c : C, ∃ b : B, j b = c) + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) + [Finite (HerbrandH0 G A)] [Finite (HerbrandHMinusOne G A σ)] + [Finite (HerbrandH0 G B)] [Finite (HerbrandHMinusOne G B σ)] + [Finite (HerbrandH0 G C)] [Finite (HerbrandHMinusOne G C σ)] : + herbrandQuotient (G := G) (A := B) σ = + herbrandQuotient (G := G) (A := A) σ * + herbrandQuotient (G := G) (A := C) σ := + herbrandQuotient_exact_multiplicative + i j hi hj hker hinj hsurj σ hgen + +/-- Herbrand-quotient multiplicativity in its first two-defined form: if the quotients of `A` +and `C` are defined, the quotient of `B` is defined and multiplicativity +holds for that induced finiteness witness. -/ +theorem herbrandQuotient_multiplicative_of_left_right_defined + (i : A →* B) (j : B →* C) + (hi : ∀ (g : G) (a : A), i (g • a) = g • i a) + (hj : ∀ (g : G) (b : B), j (g • b) = g • j b) + (hker : ∀ b : B, j b = 1 ↔ ∃ a : A, i a = b) + (hinj : Function.Injective i) + (hsurj : ∀ c : C, ∃ b : B, j b = c) + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) + [Finite (HerbrandH0 G A)] [Finite (HerbrandHMinusOne G A σ)] + [Finite (HerbrandH0 G C)] [Finite (HerbrandHMinusOne G C σ)] : + ∃ _ : HerbrandQuotientDefined G B σ, + herbrandQuotient (G := G) (A := B) σ = + herbrandQuotient (G := G) (A := A) σ * + herbrandQuotient (G := G) (A := C) σ := by + let hA : HerbrandQuotientDefined G A σ := ⟨inferInstance, inferInstance⟩ + let hC : HerbrandQuotientDefined G C σ := ⟨inferInstance, inferInstance⟩ + let hB := herbrandQuotientDefined_middle_of_left_right + i j hi hj hker hinj hsurj σ hgen hA hC + refine ⟨hB, ?_⟩ + let : Finite (HerbrandH0 G B) := hB.1 + let : Finite (HerbrandHMinusOne G B σ) := hB.2 + exact herbrandQuotient_multiplicative_of_shortExact + i j hi hj hker hinj hsurj σ hgen + +/-- Herbrand-quotient multiplicativity in its second two-defined form: if the quotients of `A` +and `B` are defined, the quotient of `C` is defined and multiplicativity +holds for that induced finiteness witness. -/ +theorem herbrandQuotient_multiplicative_of_left_middle_defined + (i : A →* B) (j : B →* C) + (hi : ∀ (g : G) (a : A), i (g • a) = g • i a) + (hj : ∀ (g : G) (b : B), j (g • b) = g • j b) + (hker : ∀ b : B, j b = 1 ↔ ∃ a : A, i a = b) + (hinj : Function.Injective i) + (hsurj : ∀ c : C, ∃ b : B, j b = c) + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) + [Finite (HerbrandH0 G A)] [Finite (HerbrandHMinusOne G A σ)] + [Finite (HerbrandH0 G B)] [Finite (HerbrandHMinusOne G B σ)] : + ∃ _ : HerbrandQuotientDefined G C σ, + herbrandQuotient (G := G) (A := B) σ = + herbrandQuotient (G := G) (A := A) σ * + herbrandQuotient (G := G) (A := C) σ := by + let hA : HerbrandQuotientDefined G A σ := ⟨inferInstance, inferInstance⟩ + let hB : HerbrandQuotientDefined G B σ := ⟨inferInstance, inferInstance⟩ + let hC := herbrandQuotientDefined_right_of_left_middle + i j hi hj hker hinj hsurj σ hgen hA hB + refine ⟨hC, ?_⟩ + let : Finite (HerbrandH0 G C) := hC.1 + let : Finite (HerbrandHMinusOne G C σ) := hC.2 + exact herbrandQuotient_multiplicative_of_shortExact + i j hi hj hker hinj hsurj σ hgen + +/-- Herbrand-quotient multiplicativity in its third two-defined form: if the quotients of `B` +and `C` are defined, the quotient of `A` is defined and multiplicativity +holds for that induced finiteness witness. -/ +theorem herbrandQuotient_multiplicative_of_middle_right_defined + (i : A →* B) (j : B →* C) + (hi : ∀ (g : G) (a : A), i (g • a) = g • i a) + (hj : ∀ (g : G) (b : B), j (g • b) = g • j b) + (hker : ∀ b : B, j b = 1 ↔ ∃ a : A, i a = b) + (hinj : Function.Injective i) + (hsurj : ∀ c : C, ∃ b : B, j b = c) + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) + [Finite (HerbrandH0 G B)] [Finite (HerbrandHMinusOne G B σ)] + [Finite (HerbrandH0 G C)] [Finite (HerbrandHMinusOne G C σ)] : + ∃ _ : HerbrandQuotientDefined G A σ, + herbrandQuotient (G := G) (A := B) σ = + herbrandQuotient (G := G) (A := A) σ * + herbrandQuotient (G := G) (A := C) σ := by + let hB : HerbrandQuotientDefined G B σ := ⟨inferInstance, inferInstance⟩ + let hC : HerbrandQuotientDefined G C σ := ⟨inferInstance, inferInstance⟩ + let hA := herbrandQuotientDefined_left_of_middle_right + i j hi hj hker hinj hsurj σ hgen hB hC + refine ⟨hA, ?_⟩ + let : Finite (HerbrandH0 G A) := hA.1 + let : Finite (HerbrandHMinusOne G A σ) := hA.2 + exact herbrandQuotient_multiplicative_of_shortExact + i j hi hj hker hinj hsurj σ hgen + +/-- Herbrand-quotient multiplicativity, the finite-module case. -/ +theorem herbrandQuotient_eq_one_of_finite_module + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) [Finite A] : + herbrandQuotient (G := G) (A := A) σ = 1 := + herbrandQuotient_finite_module_eq_one σ hgen + +end Herbrand +end ProfiniteCohomology + +end +end CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree.lean new file mode 100644 index 0000000000..2843f62506 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree.lean @@ -0,0 +1,19 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.BinaryProduct +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Cardinality +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Core +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.EquivariantEquiv +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Index +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Product +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.TateComparison + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Basic.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Basic.lean new file mode 100644 index 0000000000..463ce2bdd4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Basic.lean @@ -0,0 +1,1724 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import Mathlib.Algebra.BigOperators.Group.Finset.Basic +public import Mathlib.Data.Set.Finite.Range +public import Mathlib.GroupTheory.Coset.Card +public import Mathlib.GroupTheory.GroupAction.Basic +public import Mathlib.GroupTheory.Index +public import Mathlib.GroupTheory.OrderOfElement +public import Mathlib.GroupTheory.QuotientGroup.Basic +public import Mathlib.GroupTheory.SpecificGroups.Cyclic + +/-! # Basic -/ + +@[expose] public section +namespace CyclicCohomology + +/-! +# Low-degree Herbrand quotients + +This reusable implementation supplies the low-degree cyclic cohomology used +by the class-formation and local class field theory layers. +-/ + +noncomputable +section + +open scoped BigOperators + +namespace ProfiniteCohomology +namespace Herbrand + +universe uG uA uB uC + +/-- Herbrand-quotient theory: the finite-group norm `N_G a = ∏ g, g • a` +for a multiplicative `G`-module. -/ +def tateNorm (G : Type uG) (A : Type uA) [Group G] [Fintype G] [CommGroup A] + [MulDistribMulAction G A] (a : A) : A := + ∏ g : G, g • a + +/-- Herbrand-quotient theory: the multiplicative coboundary `a^(σ-1)`. -/ +def sigmaMinusOne (G : Type uG) (A : Type uA) [Group G] [CommGroup A] + [MulDistribMulAction G A] (σ : G) (a : A) : A := + σ • a * a⁻¹ + +/-- Herbrand-quotient theory: the fixed subgroup `A^G`. -/ +def fixedSubgroup (G : Type uG) (A : Type uA) [Group G] [CommGroup A] + [MulDistribMulAction G A] : Subgroup A where + carrier := {a | ∀ g : G, g • a = a} + one_mem' := by + intro g + exact MulDistribMulAction.smul_one g + mul_mem' := by + intro a b ha hb g + rw [MulDistribMulAction.smul_mul, ha g, hb g] + inv_mem' := by + intro a ha g + calc + g • a⁻¹ = (g • a)⁻¹ := smul_inv' g a + _ = a⁻¹ := by rw [ha g] + +variable {G : Type uG} {A : Type uA} {B : Type uB} {C : Type uC} +variable [Group G] [Fintype G] [CommGroup A] [CommGroup B] [CommGroup C] +variable [MulDistribMulAction G A] [MulDistribMulAction G B] [MulDistribMulAction G C] + +omit [Fintype G] [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- A `σ`-coboundary equal to `1` makes every element of the cyclic subgroup +generated by `σ` fix the point. -/ +theorem smul_eq_of_mem_zpowers_of_sigmaMinusOne_eq_one + {σ g : G} {a : A} (hg : g ∈ Subgroup.zpowers σ) + (hσ : sigmaMinusOne G A σ a = 1) : + g • a = a := by + have hσa : σ • a = a := by + exact mul_inv_eq_one.mp (by simpa [sigmaMinusOne] using hσ) + exact smul_eq_self_of_mem_zpowers hg hσa + +omit [Fintype G] [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- If `σ` generates `G`, then a trivial `σ`-coboundary is genuinely fixed by +all of `G`. -/ +theorem fixed_of_forall_mem_zpowers_of_sigmaMinusOne_eq_one + {σ : G} {a : A} (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) + (hσ : sigmaMinusOne G A σ a = 1) : + ∀ g : G, g • a = a := by + intro g + exact smul_eq_of_mem_zpowers_of_sigmaMinusOne_eq_one + (G := G) (A := A) (g := g) (hg := hgen g) hσ + +omit [Group G] [Fintype G] [CommGroup A] [CommGroup B] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- First-isomorphism cardinality source for finite exactness calculations: +the cardinality of the source of a group homomorphism is the product of the +cardinalities of its kernel and range. -/ +theorem monoidHom_card_eq_card_ker_mul_card_range + {X : Type uA} {Y : Type uB} [Group X] [Group Y] (f : X →* Y) : + Nat.card X = Nat.card (MonoidHom.ker f) * Nat.card (MonoidHom.range f) := by + rw [← (MonoidHom.ker f).card_mul_index, + Subgroup.index_ker] + +omit [Group G] [Fintype G] [CommGroup A] [CommGroup B] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- Cardinality source for one exact spot of a group-hom sequence. If +`range f = ker g`, then the middle group has cardinality +`#range(f) * #range(g)`. -/ +theorem monoidHom_card_eq_card_range_mul_card_range_of_exact + {X : Type uA} {Y : Type uB} {Z : Type uC} [Group X] [Group Y] [Group Z] + [Finite Y] + (f : X →* Y) (g : Y →* Z) + (hexact : MonoidHom.range f = MonoidHom.ker g) : + Nat.card Y = Nat.card (MonoidHom.range f) * Nat.card (MonoidHom.range g) := by + rw [monoidHom_card_eq_card_ker_mul_card_range g, ← hexact] + +omit [Group G] [Fintype G] [CommGroup A] [CommGroup B] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- If `H ≤ K`, viewing `H` as a subgroup of `K` does not change its +cardinality. -/ +theorem card_subgroupOf_eq_card + {X : Type uA} [Group X] {H K : Subgroup X} (hHK : H ≤ K) : + Nat.card (H.subgroupOf K) = Nat.card H := + Nat.card_congr (Subgroup.subgroupOfEquivOfLe hHK).toEquiv + +omit [Fintype G] [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- The multiplicative induced module from the trivial subgroup, represented +as functions on `G` with the right-regular action. This is the concrete model +used in the low-degree Herbrand comparison. -/ +@[reducible] def rightRegularFunctionMulDistribMulAction : + MulDistribMulAction G (G → B) where + smul g f := fun x => f (x * g) + one_smul := by + intro f + change (fun x => f (x * 1)) = f + funext x + rw [mul_one] + mul_smul := by + intro g h f + change (fun x => f (x * (g * h))) = fun x => f ((x * g) * h) + funext x + rw [mul_assoc] + smul_mul := by + intro g f h + funext x + rfl + smul_one := by + intro g + funext x + rfl + +/-- An equivariant homomorphism commutes with the Tate norm. -/ +theorem map_tateNorm (f : A →* B) + (hf : ∀ (g : G) (a : A), f (g • a) = g • f a) (a : A) : + f (tateNorm G A a) = tateNorm G B (f a) := by + simp only [tateNorm, map_prod] + exact Finset.prod_congr rfl (fun g _hg => hf g a) + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- The finite-group norm is multiplicative. -/ +theorem tateNorm_mul (a b : A) : + tateNorm G A (a * b) = tateNorm G A a * tateNorm G A b := by + calc + tateNorm G A (a * b) = ∏ g : G, (g • a) * (g • b) := by + unfold tateNorm + apply Finset.prod_congr rfl + intro g _hg + exact MulDistribMulAction.smul_mul g a b + _ = tateNorm G A a * tateNorm G A b := by + simp only [tateNorm, Finset.prod_mul_distrib] + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- The Tate norm of the identity is the identity. -/ +@[simp] +theorem tateNorm_one : tateNorm G A 1 = 1 := by + unfold tateNorm + exact Finset.prod_eq_one (fun g _hg => MulDistribMulAction.smul_one g) + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- The finite-group norm as a multiplicative homomorphism. -/ +def tateNormHom : A →* A where + toFun := tateNorm G A + map_one' := tateNorm_one (G := G) (A := A) + map_mul' := tateNorm_mul (G := G) (A := A) + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- The Tate norm homomorphism evaluates to the Tate norm. -/ +@[simp] +theorem tateNormHom_apply (a : A) : + tateNormHom (G := G) (A := A) a = tateNorm G A a := + rfl + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- The Tate norm of an inverse is the inverse Tate norm. -/ +theorem tateNorm_inv (a : A) : tateNorm G A a⁻¹ = (tateNorm G A a)⁻¹ := + map_inv (tateNormHom (G := G) (A := A)) a + +omit [Fintype G] [CommGroup C] [MulDistribMulAction G C] in +/-- An equivariant homomorphism commutes with the sigma-minus-one operator. -/ +theorem map_sigmaMinusOne (f : A →* B) + (hf : ∀ (g : G) (a : A), f (g • a) = g • f a) (σ : G) (a : A) : + f (sigmaMinusOne G A σ a) = sigmaMinusOne G B σ (f a) := by + simp [sigmaMinusOne, hf σ a] + +omit [Fintype G] [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- The multiplicative coboundary `a ↦ a^(σ-1)` is multiplicative. -/ +theorem sigmaMinusOne_mul (σ : G) (a b : A) : + sigmaMinusOne G A σ (a * b) = sigmaMinusOne G A σ a * sigmaMinusOne G A σ b := by + simp [sigmaMinusOne, mul_comm, mul_left_comm, mul_assoc] + +omit [Fintype G] [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- The multiplicative coboundary `a ↦ a^(σ-1)` as a homomorphism. -/ +def sigmaMinusOneHom (σ : G) : A →* A where + toFun := sigmaMinusOne G A σ + map_one' := by simp [sigmaMinusOne, MulDistribMulAction.smul_one] + map_mul' := sigmaMinusOne_mul (G := G) (A := A) σ + +omit [Fintype G] [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- The sigma-minus-one homomorphism evaluates to the sigma-minus-one operator. -/ +@[simp] +theorem sigmaMinusOneHom_apply (σ : G) (a : A) : + sigmaMinusOneHom (G := G) (A := A) σ a = sigmaMinusOne G A σ a := + rfl + +omit [Fintype G] [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Rewriting used in the cyclic-cohomology exact sequence: changing a lift +by `a' * a⁻¹` changes `a^(σ-1)` by an element of `I_G A`. -/ +theorem sigmaMinusOne_mul_inv_mul (σ : G) (a a' : A) : + sigmaMinusOne G A σ a' = + sigmaMinusOne G A σ (a' * a⁻¹) * sigmaMinusOne G A σ a := by + simp only [sigmaMinusOne, MulDistribMulAction.smul_mul, smul_inv', mul_inv_rev] + simp only [inv_inv] + symm + calc + σ • a' * (σ • a)⁻¹ * (a * a'⁻¹) * (σ • a * a⁻¹) + = σ • a' * (((σ • a)⁻¹ * σ • a) * ((a * a⁻¹) * a'⁻¹)) := by + ac_rfl + _ = σ • a' * a'⁻¹ := by simp + +/-- Herbrand-quotient theory: the norm image `N_G A`. -/ +def tateNormSubgroup (G : Type uG) (A : Type uA) [Group G] [Fintype G] [CommGroup A] + [MulDistribMulAction G A] : Subgroup A := + MonoidHom.range (tateNormHom (G := G) (A := A)) + +/-- Herbrand-quotient theory: the norm kernel `{a | N_G a = 1}`. -/ +def normKernelSubgroup (G : Type uG) (A : Type uA) [Group G] [Fintype G] [CommGroup A] + [MulDistribMulAction G A] : Subgroup A := + MonoidHom.ker (tateNormHom (G := G) (A := A)) + +/-- Herbrand-quotient theory: the augmentation image `I_G A` for a chosen `σ`. -/ +def augmentationSubgroup (G : Type uG) (A : Type uA) [Group G] [CommGroup A] + [MulDistribMulAction G A] (σ : G) : Subgroup A := + MonoidHom.range (sigmaMinusOneHom (G := G) (A := A) σ) + +omit [Fintype G] [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- If `σ` generates `G`, the kernel of `a ↦ a^(σ-1)` is the fixed subgroup. -/ +theorem sigmaMinusOneHom_ker_eq_fixedSubgroup + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) : + MonoidHom.ker (sigmaMinusOneHom (G := G) (A := A) σ) = fixedSubgroup G A := by + ext a + constructor + · intro ha + exact fixed_of_forall_mem_zpowers_of_sigmaMinusOne_eq_one + (G := G) (A := A) (σ := σ) hgen (by simpa using ha) + · intro ha + change sigmaMinusOne G A σ a = 1 + simp [sigmaMinusOne, ha σ] + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Finite-module source: the norm homomorphism factors the cardinality of +`A` into norm-kernel and norm-image cardinalities. -/ +theorem card_eq_card_normKernelSubgroup_mul_card_tateNormSubgroup [Finite A] : + Nat.card A = Nat.card (normKernelSubgroup G A) * Nat.card (tateNormSubgroup G A) := by + simpa [normKernelSubgroup, tateNormSubgroup] using + monoidHom_card_eq_card_ker_mul_card_range (tateNormHom (G := G) (A := A)) + +omit [Fintype G] [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Finite-module source: for a cyclic generator `σ`, the coboundary +homomorphism factors the cardinality of `A` into fixed and augmentation +cardinalities. -/ +theorem card_eq_card_fixedSubgroup_mul_card_augmentationSubgroup + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) [Finite A] : + Nat.card A = Nat.card (fixedSubgroup G A) * Nat.card (augmentationSubgroup G A σ) := by + simpa [sigmaMinusOneHom_ker_eq_fixedSubgroup (G := G) (A := A) σ hgen, + augmentationSubgroup] using + monoidHom_card_eq_card_ker_mul_card_range + (sigmaMinusOneHom (G := G) (A := A) σ) + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Finite-module cardinality balance behind `h(G,A)=1`: for a finite cyclic +group action, the product `#A^G · #I_G A` equals `#ker N_G · #N_G A`. -/ +theorem herbrand_finite_module_cardinality_balance + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) [Finite A] : + Nat.card (fixedSubgroup G A) * Nat.card (augmentationSubgroup G A σ) = + Nat.card (normKernelSubgroup G A) * Nat.card (tateNormSubgroup G A) := by + rw [← card_eq_card_fixedSubgroup_mul_card_augmentationSubgroup + (G := G) (A := A) σ hgen, + ← card_eq_card_normKernelSubgroup_mul_card_tateNormSubgroup (G := G) (A := A)] + +/-- Herbrand-quotient theory: multiplicative model of `H⁰(G,A)=A^G/N_G A`. -/ +def HerbrandH0 (G : Type uG) (A : Type uA) [Group G] [Fintype G] [CommGroup A] + [MulDistribMulAction G A] : Type uA := + fixedSubgroup G A ⧸ (tateNormSubgroup G A).subgroupOf (fixedSubgroup G A) + +/-- Herbrand-quotient theory: multiplicative model of +`H^{-1}(G,A) = ker(N_G)/I_G A` for a chosen generator `σ`. -/ +def HerbrandHMinusOne (G : Type uG) (A : Type uA) [Group G] [Fintype G] [CommGroup A] + [MulDistribMulAction G A] (σ : G) : Type uA := + normKernelSubgroup G A ⧸ (augmentationSubgroup G A σ).subgroupOf (normKernelSubgroup G A) + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Degree-zero Herbrand cohomology is a commutative group. -/ +instance herbrandH0CommGroup : CommGroup (HerbrandH0 G A) := by + unfold HerbrandH0 + infer_instance + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Degree-minus-one Herbrand cohomology is a commutative group. -/ +instance herbrandHMinusOneCommGroup (σ : G) : + CommGroup (HerbrandHMinusOne G A σ) := by + unfold HerbrandHMinusOne + infer_instance + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- The sole public equivalence to the concrete quotient implementing +`H⁰(G,A)`. -/ +def HerbrandH0.equiv : + HerbrandH0 G A ≃* + fixedSubgroup G A ⧸ + (tateNormSubgroup G A).subgroupOf (fixedSubgroup G A) := by + change + (fixedSubgroup G A ⧸ + (tateNormSubgroup G A).subgroupOf (fixedSubgroup G A)) ≃* + fixedSubgroup G A ⧸ + (tateNormSubgroup G A).subgroupOf (fixedSubgroup G A) + exact MulEquiv.refl _ + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- The sole public equivalence to the concrete quotient implementing +`H⁻¹(G,A)`. -/ +def HerbrandHMinusOne.equiv (σ : G) : + HerbrandHMinusOne G A σ ≃* + normKernelSubgroup G A ⧸ + (augmentationSubgroup G A σ).subgroupOf (normKernelSubgroup G A) := by + change + (normKernelSubgroup G A ⧸ + (augmentationSubgroup G A σ).subgroupOf (normKernelSubgroup G A)) ≃* + normKernelSubgroup G A ⧸ + (augmentationSubgroup G A σ).subgroupOf (normKernelSubgroup G A) + exact MulEquiv.refl _ + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Canonical projection from fixed points to `H⁰(G,A)`. -/ +def HerbrandH0.mk : fixedSubgroup G A →* HerbrandH0 G A := by + unfold HerbrandH0 + exact QuotientGroup.mk' + ((tateNormSubgroup G A).subgroupOf (fixedSubgroup G A)) + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Canonical projection from the norm kernel to `H⁻¹(G,A)`. -/ +def HerbrandHMinusOne.mk (σ : G) : + normKernelSubgroup G A →* HerbrandHMinusOne G A σ := by + unfold HerbrandHMinusOne + exact QuotientGroup.mk' + ((augmentationSubgroup G A σ).subgroupOf (normKernelSubgroup G A)) + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- The degree-zero quotient equivalence sends the canonical class to the raw quotient class. -/ +@[simp] +theorem HerbrandH0.equiv_mk (a : fixedSubgroup G A) : + HerbrandH0.equiv (G := G) (A := A) (HerbrandH0.mk a) = + QuotientGroup.mk a := by + rfl + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- The degree-minus-one quotient equivalence sends the canonical class to the +raw quotient class. -/ +@[simp] +theorem HerbrandHMinusOne.equiv_mk (σ : G) (a : normKernelSubgroup G A) : + HerbrandHMinusOne.equiv (G := G) (A := A) σ + (HerbrandHMinusOne.mk σ a) = + QuotientGroup.mk a := by + rfl + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Every degree-zero Herbrand class has a fixed-point representative. -/ +theorem HerbrandH0.mk_surjective : + Function.Surjective (HerbrandH0.mk (G := G) (A := A)) := by + intro q + obtain ⟨a, ha⟩ := QuotientGroup.mk'_surjective + ((tateNormSubgroup G A).subgroupOf (fixedSubgroup G A)) + (HerbrandH0.equiv (G := G) (A := A) q) + refine ⟨a, (HerbrandH0.equiv (G := G) (A := A)).injective ?_⟩ + rw [HerbrandH0.equiv_mk] + exact ha + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Every degree-minus-one Herbrand class has a norm-kernel representative. -/ +theorem HerbrandHMinusOne.mk_surjective (σ : G) : + Function.Surjective (HerbrandHMinusOne.mk (G := G) (A := A) σ) := by + intro q + obtain ⟨a, ha⟩ := QuotientGroup.mk'_surjective + ((augmentationSubgroup G A σ).subgroupOf (normKernelSubgroup G A)) + (HerbrandHMinusOne.equiv (G := G) (A := A) σ q) + refine ⟨a, (HerbrandHMinusOne.equiv (G := G) (A := A) σ).injective ?_⟩ + rw [HerbrandHMinusOne.equiv_mk] + exact ha + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- A fixed-point representative gives the trivial degree-zero class exactly +when it is a Tate norm. -/ +@[simp] +theorem HerbrandH0.mk_eq_one_iff (a : fixedSubgroup G A) : + HerbrandH0.mk a = 1 ↔ (a : A) ∈ tateNormSubgroup G A := by + constructor + · intro h + have hraw : + (QuotientGroup.mk a : + fixedSubgroup G A ⧸ + (tateNormSubgroup G A).subgroupOf (fixedSubgroup G A)) = 1 := by + simpa only [HerbrandH0.equiv_mk, map_one] using + congrArg (HerbrandH0.equiv (G := G) (A := A)) h + simpa only [Subgroup.mem_subgroupOf] using + (QuotientGroup.eq_one_iff a).1 hraw + · intro h + apply (HerbrandH0.equiv (G := G) (A := A)).injective + rw [HerbrandH0.equiv_mk, map_one] + apply (QuotientGroup.eq_one_iff a).2 + simpa only [Subgroup.mem_subgroupOf] using h + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- A norm-kernel representative gives the trivial degree-minus-one class +exactly when it is an augmentation. -/ +@[simp] +theorem HerbrandHMinusOne.mk_eq_one_iff (σ : G) + (a : normKernelSubgroup G A) : + HerbrandHMinusOne.mk σ a = 1 ↔ + (a : A) ∈ augmentationSubgroup G A σ := by + constructor + · intro h + have hraw : + (QuotientGroup.mk a : + normKernelSubgroup G A ⧸ + (augmentationSubgroup G A σ).subgroupOf (normKernelSubgroup G A)) = 1 := by + simpa only [HerbrandHMinusOne.equiv_mk, map_one] using + congrArg (HerbrandHMinusOne.equiv (G := G) (A := A) σ) h + simpa only [Subgroup.mem_subgroupOf] using + (QuotientGroup.eq_one_iff a).1 hraw + · intro h + apply (HerbrandHMinusOne.equiv (G := G) (A := A) σ).injective + rw [HerbrandHMinusOne.equiv_mk, map_one] + apply (QuotientGroup.eq_one_iff a).2 + simpa only [Subgroup.mem_subgroupOf] using h + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Two degree-zero representatives agree exactly when their quotient is a Tate norm. -/ +theorem HerbrandH0.mk_eq_mk_iff_div_mem (a b : fixedSubgroup G A) : + HerbrandH0.mk a = HerbrandH0.mk b ↔ + (a : A) / b ∈ tateNormSubgroup G A := by + constructor + · intro h + have hraw : + (QuotientGroup.mk a : + fixedSubgroup G A ⧸ + (tateNormSubgroup G A).subgroupOf (fixedSubgroup G A)) = + QuotientGroup.mk b := by + simpa only [HerbrandH0.equiv_mk] using + congrArg (HerbrandH0.equiv (G := G) (A := A)) h + simpa only [Subgroup.mem_subgroupOf, Subgroup.coe_div] using + (QuotientGroup.eq_iff_div_mem).1 hraw + · intro h + apply (HerbrandH0.equiv (G := G) (A := A)).injective + rw [HerbrandH0.equiv_mk, HerbrandH0.equiv_mk] + apply (QuotientGroup.eq_iff_div_mem).2 + simpa only [Subgroup.mem_subgroupOf, Subgroup.coe_div] using h + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Two degree-minus-one representatives agree exactly when their quotient is an augmentation. -/ +theorem HerbrandHMinusOne.mk_eq_mk_iff_div_mem (σ : G) + (a b : normKernelSubgroup G A) : + HerbrandHMinusOne.mk σ a = HerbrandHMinusOne.mk σ b ↔ + (a : A) / b ∈ augmentationSubgroup G A σ := by + constructor + · intro h + have hraw : + (QuotientGroup.mk a : + normKernelSubgroup G A ⧸ + (augmentationSubgroup G A σ).subgroupOf (normKernelSubgroup G A)) = + QuotientGroup.mk b := by + simpa only [HerbrandHMinusOne.equiv_mk] using + congrArg (HerbrandHMinusOne.equiv (G := G) (A := A) σ) h + simpa only [Subgroup.mem_subgroupOf, Subgroup.coe_div] using + (QuotientGroup.eq_iff_div_mem).1 hraw + · intro h + apply (HerbrandHMinusOne.equiv (G := G) (A := A) σ).injective + rw [HerbrandHMinusOne.equiv_mk, HerbrandHMinusOne.equiv_mk] + apply (QuotientGroup.eq_iff_div_mem).2 + simpa only [Subgroup.mem_subgroupOf, Subgroup.coe_div] using h + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Two degree-zero representatives agree exactly when the inverse-times-second +ratio is a Tate norm. -/ +theorem HerbrandH0.mk_eq_mk_iff_inv_mul_mem (a b : fixedSubgroup G A) : + HerbrandH0.mk a = HerbrandH0.mk b ↔ + (a : A)⁻¹ * b ∈ tateNormSubgroup G A := by + rw [HerbrandH0.mk_eq_mk_iff_div_mem] + constructor + · intro h + have hinv := (tateNormSubgroup G A).inv_mem h + simpa [div_eq_mul_inv, mul_comm] using hinv + · intro h + have hinv := (tateNormSubgroup G A).inv_mem h + simpa [div_eq_mul_inv, mul_comm] using hinv + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Two degree-minus-one representatives agree exactly when the +inverse-times-second ratio is an augmentation. -/ +theorem HerbrandHMinusOne.mk_eq_mk_iff_inv_mul_mem (σ : G) + (a b : normKernelSubgroup G A) : + HerbrandHMinusOne.mk σ a = HerbrandHMinusOne.mk σ b ↔ + (a : A)⁻¹ * b ∈ augmentationSubgroup G A σ := by + rw [HerbrandHMinusOne.mk_eq_mk_iff_div_mem] + constructor + · intro h + have hinv := (augmentationSubgroup G A σ).inv_mem h + simpa [div_eq_mul_inv, mul_comm] using hinv + · intro h + have hinv := (augmentationSubgroup G A σ).inv_mem h + simpa [div_eq_mul_inv, mul_comm] using hinv + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Eliminate a degree-zero Herbrand class through an arbitrary fixed-point +representative and the canonical class map. -/ +protected theorem HerbrandH0.inductionOn + {motive : HerbrandH0 G A → Prop} (q : HerbrandH0 G A) + (h : ∀ a : fixedSubgroup G A, motive (HerbrandH0.mk a)) : motive q := by + obtain ⟨a, rfl⟩ := HerbrandH0.mk_surjective (G := G) (A := A) q + exact h a + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Eliminate a degree-minus-one Herbrand class through an arbitrary +norm-kernel representative and the canonical class map. -/ +protected theorem HerbrandHMinusOne.inductionOn (σ : G) + {motive : HerbrandHMinusOne G A σ → Prop} + (q : HerbrandHMinusOne G A σ) + (h : ∀ a : normKernelSubgroup G A, + motive (HerbrandHMinusOne.mk σ a)) : motive q := by + obtain ⟨a, rfl⟩ := + HerbrandHMinusOne.mk_surjective (G := G) (A := A) σ q + exact h a + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Evaluate a function on `H⁰(G,A)` from a representative-level function +which is invariant under equality of canonical quotient classes. This is the +non-homomorphic elimination API; clients never need the underlying quotient +relation. -/ +noncomputable def HerbrandH0.liftOn {M : Sort*} + (q : HerbrandH0 G A) (f : fixedSubgroup G A → M) + (_h : ∀ a b, HerbrandH0.mk a = HerbrandH0.mk b → f a = f b) : M := + f (Classical.choose (HerbrandH0.mk_surjective (G := G) (A := A) q)) + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Eliminating a canonical degree-zero class evaluates the representative-level function. -/ +@[simp] +theorem HerbrandH0.liftOn_mk {M : Sort*} + (f : fixedSubgroup G A → M) + (h : ∀ a b, HerbrandH0.mk a = HerbrandH0.mk b → f a = f b) + (a : fixedSubgroup G A) : + HerbrandH0.liftOn (HerbrandH0.mk a) f h = f a := by + unfold HerbrandH0.liftOn + apply h + exact Classical.choose_spec + (HerbrandH0.mk_surjective (G := G) (A := A) (HerbrandH0.mk a)) + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Evaluate a function on `H⁻¹(G,A)` from a representative-level +function which is invariant under equality of canonical quotient classes. -/ +noncomputable def HerbrandHMinusOne.liftOn {M : Sort*} (σ : G) + (q : HerbrandHMinusOne G A σ) (f : normKernelSubgroup G A → M) + (_h : ∀ a b, + HerbrandHMinusOne.mk σ a = HerbrandHMinusOne.mk σ b → f a = f b) : M := + f (Classical.choose + (HerbrandHMinusOne.mk_surjective (G := G) (A := A) σ q)) + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Eliminating a canonical degree-minus-one class evaluates the representative-level function. -/ +@[simp] +theorem HerbrandHMinusOne.liftOn_mk {M : Sort*} (σ : G) + (f : normKernelSubgroup G A → M) + (h : ∀ a b, + HerbrandHMinusOne.mk σ a = HerbrandHMinusOne.mk σ b → f a = f b) + (a : normKernelSubgroup G A) : + HerbrandHMinusOne.liftOn σ (HerbrandHMinusOne.mk σ a) f h = f a := by + unfold HerbrandHMinusOne.liftOn + apply h + exact Classical.choose_spec + (HerbrandHMinusOne.mk_surjective (G := G) (A := A) σ + (HerbrandHMinusOne.mk σ a)) + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Descend a homomorphism on fixed points through `H⁰(G,A)`. -/ +def HerbrandH0.lift {M : Type*} [Group M] + (f : fixedSubgroup G A →* M) + (h : (tateNormSubgroup G A).subgroupOf (fixedSubgroup G A) ≤ f.ker) : + HerbrandH0 G A →* M := by + unfold HerbrandH0 + exact QuotientGroup.lift + ((tateNormSubgroup G A).subgroupOf (fixedSubgroup G A)) f h + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Descend a homomorphism on the norm kernel through `H⁻¹(G,A)`. -/ +def HerbrandHMinusOne.lift {M : Type*} [Group M] (σ : G) + (f : normKernelSubgroup G A →* M) + (h : (augmentationSubgroup G A σ).subgroupOf (normKernelSubgroup G A) ≤ + f.ker) : HerbrandHMinusOne G A σ →* M := by + unfold HerbrandHMinusOne + exact QuotientGroup.lift + ((augmentationSubgroup G A σ).subgroupOf (normKernelSubgroup G A)) f h + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- A homomorphism descended through degree-zero Herbrand cohomology agrees on representatives. -/ +@[simp] +theorem HerbrandH0.lift_mk {M : Type*} [Group M] + (f : fixedSubgroup G A →* M) + (h : (tateNormSubgroup G A).subgroupOf (fixedSubgroup G A) ≤ f.ker) + (a : fixedSubgroup G A) : HerbrandH0.lift f h (HerbrandH0.mk a) = f a := by + rfl + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- A homomorphism descended through degree-minus-one Herbrand cohomology agrees +on representatives. -/ +@[simp] +theorem HerbrandHMinusOne.lift_mk {M : Type*} [Group M] (σ : G) + (f : normKernelSubgroup G A →* M) + (h : (augmentationSubgroup G A σ).subgroupOf (normKernelSubgroup G A) ≤ + f.ker) (a : normKernelSubgroup G A) : + HerbrandHMinusOne.lift σ f h (HerbrandHMinusOne.mk σ a) = f a := by + rfl + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Degree-zero Herbrand cohomology is finite when the coefficient group is finite. -/ +noncomputable instance herbrandH0FiniteOfFinite [Finite A] : + Finite (HerbrandH0 G A) := by + exact Finite.of_equiv + (fixedSubgroup G A ⧸ + (tateNormSubgroup G A).subgroupOf (fixedSubgroup G A)) + (HerbrandH0.equiv (G := G) (A := A)).symm.toEquiv + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Degree-minus-one Herbrand cohomology is finite when the coefficient group is finite. -/ +noncomputable instance herbrandHMinusOneFiniteOfFinite (σ : G) [Finite A] : + Finite (HerbrandHMinusOne G A σ) := by + exact Finite.of_equiv + (normKernelSubgroup G A ⧸ + (augmentationSubgroup G A σ).subgroupOf (normKernelSubgroup G A)) + (HerbrandHMinusOne.equiv (G := G) (A := A) σ).symm.toEquiv + +omit [Fintype G] [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- Fixed subgroup of the right-regular multiplicative induced module. -/ +abbrev rightRegularFunctionFixedSubgroup : Subgroup (G → B) := by + letI := rightRegularFunctionMulDistribMulAction (G := G) (B := B) + exact fixedSubgroup G (G → B) + +omit [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- Norm image subgroup of the right-regular multiplicative induced module. -/ +abbrev rightRegularFunctionTateNormSubgroup : Subgroup (G → B) := by + letI := rightRegularFunctionMulDistribMulAction (G := G) (B := B) + exact tateNormSubgroup G (G → B) + +omit [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- `H⁰` of the right-regular multiplicative induced module. -/ +def rightRegularFunctionHerbrandH0 : Type (max uG uB) := by + letI := rightRegularFunctionMulDistribMulAction (G := G) (B := B) + exact HerbrandH0 G (G → B) + +omit [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- Degree-zero Herbrand cohomology of right-regular functions is a commutative group. -/ +noncomputable instance rightRegularFunctionHerbrandH0CommGroup : + CommGroup (rightRegularFunctionHerbrandH0 (G := G) (B := B)) := by + letI := rightRegularFunctionMulDistribMulAction (G := G) (B := B) + change CommGroup (HerbrandH0 G (G → B)) + infer_instance + +omit [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- Norm-kernel subgroup of the right-regular multiplicative induced module. -/ +abbrev rightRegularFunctionNormKernelSubgroup : Subgroup (G → B) := by + letI := rightRegularFunctionMulDistribMulAction (G := G) (B := B) + exact normKernelSubgroup G (G → B) + +omit [Fintype G] [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- Augmentation subgroup of the right-regular multiplicative induced module. -/ +abbrev rightRegularFunctionAugmentationSubgroup (σ : G) : Subgroup (G → B) := by + letI := rightRegularFunctionMulDistribMulAction (G := G) (B := B) + exact augmentationSubgroup G (G → B) σ + +omit [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- `H^{-1}` of the right-regular multiplicative induced module. -/ +def rightRegularFunctionHerbrandHMinusOne (σ : G) : Type (max uG uB) := by + letI := rightRegularFunctionMulDistribMulAction (G := G) (B := B) + exact HerbrandHMinusOne G (G → B) σ + +omit [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- Degree-minus-one Herbrand cohomology of right-regular functions is a commutative group. -/ +noncomputable instance rightRegularFunctionHerbrandHMinusOneCommGroup (σ : G) : + CommGroup + (rightRegularFunctionHerbrandHMinusOne (G := G) (B := B) σ) := by + letI := rightRegularFunctionMulDistribMulAction (G := G) (B := B) + change CommGroup (HerbrandHMinusOne G (G → B) σ) + infer_instance + +/-- The norm of a multiplicative coboundary is trivial. This is the calculation +`N_G(b^(σ-1)) = 1` used in the low-degree cyclic-cohomology exact sequence. -/ +theorem tateNorm_sigmaMinusOne_eq_one (σ : G) (a : A) : + tateNorm G A (sigmaMinusOne G A σ a) = 1 := by + have hshift : (∏ g : G, (g * σ) • a) = ∏ g : G, g • a := by + exact Fintype.prod_equiv (Equiv.mulRight σ) + (fun g : G => (g * σ) • a) (fun g : G => g • a) (by intro g; rfl) + calc + tateNorm G A (sigmaMinusOne G A σ a) = ∏ g : G, ((g * σ) • a) * (g • a)⁻¹ := by + unfold tateNorm sigmaMinusOne + apply Finset.prod_congr rfl + intro g _hg + calc + g • (σ • a * a⁻¹) = g • (σ • a) * g • a⁻¹ := + MulDistribMulAction.smul_mul g (σ • a) a⁻¹ + _ = (g * σ) • a * (g • a)⁻¹ := by + rw [← SemigroupAction.mul_smul, smul_inv'] + _ = (∏ g : G, (g * σ) • a) * ∏ g : G, (g • a)⁻¹ := by + exact Finset.prod_mul_distrib + _ = 1 := by + rw [hshift, Finset.prod_inv_distrib, mul_inv_cancel] + +/-- The augmentation image lies in the norm kernel. -/ +theorem augmentationSubgroup_le_normKernelSubgroup (σ : G) : + augmentationSubgroup G A σ ≤ normKernelSubgroup G A := by + intro a ha + rcases ha with ⟨b, rfl⟩ + exact tateNorm_sigmaMinusOne_eq_one (G := G) (A := A) σ b + +/-- The norm is fixed by every group element, placing `N_G b` in `A^G` in the +low-degree cyclic-cohomology exact sequence. -/ +theorem smul_tateNorm_eq (h : G) (a : A) : + h • tateNorm G A a = tateNorm G A a := by + have hmap : h • (∏ g : G, g • a) = ∏ g : G, h • (g • a) := by + exact map_prod (MulDistribMulAction.toMonoidHom A h) (fun g : G => g • a) Finset.univ + have hshift : (∏ g : G, (h * g) • a) = ∏ g : G, g • a := by + exact Fintype.prod_equiv (Equiv.mulLeft h) + (fun g : G => (h * g) • a) (fun g : G => g • a) (by intro g; rfl) + calc + h • tateNorm G A a = ∏ g : G, h • (g • a) := by + simpa [tateNorm] using hmap + _ = ∏ g : G, (h * g) • a := by + apply Finset.prod_congr rfl + intro g _hg + exact (SemigroupAction.mul_smul h g a).symm + _ = tateNorm G A a := by + simpa [tateNorm] using hshift + +/-- The norm image lies in the fixed subgroup, as in Herbrand-quotient theory. -/ +theorem tateNormSubgroup_le_fixedSubgroup : + tateNormSubgroup G A ≤ fixedSubgroup G A := by + intro a ha g + rcases ha with ⟨b, rfl⟩ + exact smul_tateNorm_eq (G := G) (A := A) g b + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- A quotient-level criterion for vanishing of `H⁰`: if every fixed point is +a norm, then the low-degree Herbrand `H⁰` quotient is a subsingleton. -/ +theorem herbrandH0_subsingleton_of_fixed_le_tateNormSubgroup + (h : fixedSubgroup G A ≤ tateNormSubgroup G A) : + Subsingleton (HerbrandH0 G A) := by + refine ⟨fun q r => ?_⟩ + have hq : q = 1 := by + refine HerbrandH0.inductionOn (motive := fun z => z = 1) q ?_ + intro a + apply (HerbrandH0.mk_eq_one_iff (G := G) (A := A) a).2 + exact h a.2 + have hr : r = 1 := by + refine HerbrandH0.inductionOn (motive := fun z => z = 1) r ?_ + intro a + apply (HerbrandH0.mk_eq_one_iff (G := G) (A := A) a).2 + exact h a.2 + rw [hq, hr] + +/-- Degree-zero Herbrand cohomology is trivial exactly when every fixed +element is a Tate norm. -/ +theorem herbrandH0_subsingleton_iff_fixed_le_tateNormSubgroup : + Subsingleton (HerbrandH0 G A) ↔ + fixedSubgroup G A ≤ tateNormSubgroup G A := by + constructor + · intro h a ha + apply (HerbrandH0.mk_eq_one_iff (G := G) (A := A) ⟨a, ha⟩).1 + exact h.elim _ _ + · exact herbrandH0_subsingleton_of_fixed_le_tateNormSubgroup + (G := G) (A := A) + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- A quotient-level criterion for vanishing of `H^{-1}`: if every norm-kernel +element is an augmentation element, then the low-degree Herbrand `H^{-1}` +quotient is a subsingleton. -/ +theorem herbrandHMinusOne_subsingleton_of_normKernel_le_augmentationSubgroup + (σ : G) (h : normKernelSubgroup G A ≤ augmentationSubgroup G A σ) : + Subsingleton (HerbrandHMinusOne G A σ) := by + refine ⟨fun q r => ?_⟩ + have hq : q = 1 := by + refine HerbrandHMinusOne.inductionOn σ + (motive := fun z => z = 1) q ?_ + intro a + apply (HerbrandHMinusOne.mk_eq_one_iff (G := G) (A := A) σ a).2 + exact h a.2 + have hr : r = 1 := by + refine HerbrandHMinusOne.inductionOn σ + (motive := fun z => z = 1) r ?_ + intro a + apply (HerbrandHMinusOne.mk_eq_one_iff (G := G) (A := A) σ a).2 + exact h a.2 + rw [hq, hr] + +/-- Degree-minus-one Herbrand cohomology is trivial exactly when every +norm-kernel element is an augmentation element. -/ +theorem herbrandHMinusOne_subsingleton_iff_normKernel_le_augmentationSubgroup + (σ : G) : + Subsingleton (HerbrandHMinusOne G A σ) ↔ + normKernelSubgroup G A ≤ augmentationSubgroup G A σ := by + constructor + · intro h a ha + apply (HerbrandHMinusOne.mk_eq_one_iff (G := G) (A := A) σ ⟨a, ha⟩).1 + exact h.elim _ _ + · exact herbrandHMinusOne_subsingleton_of_normKernel_le_augmentationSubgroup + (G := G) (A := A) σ + +omit [Fintype G] [CommGroup C] [MulDistribMulAction G C] in +/-- The inverse of an equivariant multiplicative equivalence is equivariant. -/ +theorem mulEquiv_symm_commutes_smul + (e : A ≃* B) + (he : ∀ (g : G) (a : A), e (g • a) = g • e a) : + ∀ (g : G) (b : B), e.symm (g • b) = g • e.symm b := by + intro g b + apply e.injective + calc + e (e.symm (g • b)) = g • b := e.apply_symm_apply (g • b) + _ = g • e (e.symm b) := by rw [e.apply_symm_apply] + _ = e (g • e.symm b) := (he g (e.symm b)).symm + +omit [CommGroup C] [MulDistribMulAction G C] in +/-- Transport the `H⁰` vanishing source `A^G ≤ N_G A` across an equivariant +multiplicative equivalence. -/ +theorem fixed_le_tateNormSubgroup_of_mulEquiv + (e : A ≃* B) + (he : ∀ (g : G) (a : A), e (g • a) = g • e a) + (hB : fixedSubgroup G B ≤ tateNormSubgroup G B) : + fixedSubgroup G A ≤ tateNormSubgroup G A := by + intro a ha + have hea : e a ∈ fixedSubgroup G B := by + intro g + rw [← he g a, ha g] + rcases hB hea with ⟨b, hb⟩ + refine ⟨e.symm b, ?_⟩ + apply e.injective + calc + e (tateNorm G A (e.symm b)) = + tateNorm G B (e (e.symm b)) := + map_tateNorm (G := G) (A := A) (B := B) e.toMonoidHom + (fun g a => by simpa using he g a) (e.symm b) + _ = tateNorm G B b := by rw [e.apply_symm_apply] + _ = e a := hb + +omit [CommGroup C] [MulDistribMulAction G C] in +/-- Transport the `H^{-1}` vanishing source `ker N_G ≤ I_G A` across an +equivariant multiplicative equivalence. -/ +theorem normKernel_le_augmentationSubgroup_of_mulEquiv + (e : A ≃* B) + (he : ∀ (g : G) (a : A), e (g • a) = g • e a) + (σ : G) (hB : normKernelSubgroup G B ≤ augmentationSubgroup G B σ) : + normKernelSubgroup G A ≤ augmentationSubgroup G A σ := by + intro a ha + have haNorm : tateNorm G A a = 1 := by + simpa [normKernelSubgroup] using ha + have hea : e a ∈ normKernelSubgroup G B := by + change tateNorm G B (e a) = 1 + calc + tateNorm G B (e a) = e (tateNorm G A a) := + (map_tateNorm (G := G) (A := A) (B := B) e.toMonoidHom + (fun g a => by simpa using he g a) a).symm + _ = e 1 := by rw [haNorm] + _ = 1 := by simp + rcases hB hea with ⟨b, hb⟩ + refine ⟨e.symm b, ?_⟩ + apply e.injective + calc + e (sigmaMinusOne G A σ (e.symm b)) = + sigmaMinusOne G B σ (e (e.symm b)) := + map_sigmaMinusOne (G := G) (A := A) (B := B) e.toMonoidHom + (fun g a => by simpa using he g a) σ (e.symm b) + _ = sigmaMinusOne G B σ b := by rw [e.apply_symm_apply] + _ = e a := hb + +omit [CommGroup C] [MulDistribMulAction G C] in +/-- Transport low-degree `H⁰` triviality across an equivariant multiplicative +equivalence. -/ +theorem herbrandH0_subsingleton_of_mulEquiv + (e : A ≃* B) + (he : ∀ (g : G) (a : A), e (g • a) = g • e a) + (hB : fixedSubgroup G B ≤ tateNormSubgroup G B) : + Subsingleton (HerbrandH0 G A) := + herbrandH0_subsingleton_of_fixed_le_tateNormSubgroup + (G := G) (A := A) + (fixed_le_tateNormSubgroup_of_mulEquiv (G := G) (A := A) (B := B) e he hB) + +omit [CommGroup C] [MulDistribMulAction G C] in +/-- Transport low-degree `H^{-1}` triviality across an equivariant +multiplicative equivalence. -/ +theorem herbrandHMinusOne_subsingleton_of_mulEquiv + (e : A ≃* B) + (he : ∀ (g : G) (a : A), e (g • a) = g • e a) + (σ : G) (hB : normKernelSubgroup G B ≤ augmentationSubgroup G B σ) : + Subsingleton (HerbrandHMinusOne G A σ) := + herbrandHMinusOne_subsingleton_of_normKernel_le_augmentationSubgroup + (G := G) (A := A) σ + (normKernel_le_augmentationSubgroup_of_mulEquiv + (G := G) (A := A) (B := B) e he σ hB) + +omit [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- Membership in the right-regular norm kernel is the single product +condition `∏ g, f g = 1`. -/ +theorem rightRegularFunction_mem_normKernelSubgroup_iff (f : G → B) : + f ∈ rightRegularFunctionNormKernelSubgroup (G := G) (B := B) ↔ + (∏ g : G, f g) = 1 := by + let := rightRegularFunctionMulDistribMulAction (G := G) (B := B) + have hnorm (x : G) : tateNorm G (G → B) f x = ∏ g : G, f g := by + calc + tateNorm G (G → B) f x = ∏ g : G, f (x * g) := by + unfold tateNorm + let ev : (G → B) →* B := { + toFun q := q x + map_one' := rfl + map_mul' := by + intro q r + rfl + } + calc + ((∏ c : G, c • f) : G → B) x = ev (∏ c : G, c • f) := rfl + _ = ∏ c : G, ev (c • f) := by rw [map_prod] + _ = ∏ c : G, f (x * c) := by + refine Finset.prod_congr rfl ?_ + intro c _hc + change (c • f) x = f (x * c) + rfl + _ = ∏ g : G, f g := by + exact Fintype.prod_equiv (Equiv.mulLeft x) + (fun g : G => f (x * g)) (fun g : G => f g) (by intro g; rfl) + constructor + · intro hf + change tateNorm G (G → B) f = 1 at hf + have hx := congrArg (fun q : G → B => q 1) hf + calc + (∏ g : G, f g) = tateNorm G (G → B) f 1 := (hnorm 1).symm + _ = 1 := by simpa using hx + · intro hf + change tateNorm G (G → B) f = 1 + funext x + calc + tateNorm G (G → B) f x = ∏ g : G, f g := hnorm x + _ = 1 := hf + +omit [Fintype G] [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- The partial primitive along the cyclic powers of `σ`. This is the +candidate used to solve `b (x * σ) * (b x)⁻¹ = f x` on the right-regular +induced module. -/ +def rightRegularCyclicPartialProduct (σ : G) (f : G → B) (i : ℕ) : B := + (Finset.range i).prod (fun k => f (σ ^ k)) + +omit [Fintype G] [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- The partial primitive starts at `1`. -/ +theorem rightRegularCyclicPartialProduct_zero (σ : G) (f : G → B) : + rightRegularCyclicPartialProduct (G := G) (B := B) σ f 0 = 1 := by + simp [rightRegularCyclicPartialProduct] + +omit [Fintype G] [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- Successor step for the cyclic partial primitive. -/ +theorem rightRegularCyclicPartialProduct_succ (σ : G) (f : G → B) (i : ℕ) : + rightRegularCyclicPartialProduct (G := G) (B := B) σ f (i + 1) = + rightRegularCyclicPartialProduct (G := G) (B := B) σ f i * f (σ ^ i) := by + simp [rightRegularCyclicPartialProduct, Finset.prod_range_succ] + +omit [Fintype G] [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- The successor step is the desired coboundary equation away from the +wrap-around point. -/ +theorem rightRegularCyclicPartialProduct_succ_mul_inv + (σ : G) (f : G → B) (i : ℕ) : + rightRegularCyclicPartialProduct (G := G) (B := B) σ f (i + 1) * + (rightRegularCyclicPartialProduct (G := G) (B := B) σ f i)⁻¹ = + f (σ ^ i) := by + rw [rightRegularCyclicPartialProduct_succ] + simp [mul_comm, mul_assoc] + +omit [Fintype G] [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- The product-one condition gives the wrap-around coboundary equation for +the cyclic partial primitive. -/ +theorem rightRegularCyclicPartialProduct_wrap_mul_inv_of_eq_one + (σ : G) (f : G → B) {n : ℕ} (hn : 0 < n) + (hprod : rightRegularCyclicPartialProduct (G := G) (B := B) σ f n = 1) : + rightRegularCyclicPartialProduct (G := G) (B := B) σ f 0 * + (rightRegularCyclicPartialProduct (G := G) (B := B) σ f (n - 1))⁻¹ = + f (σ ^ (n - 1)) := by + cases n with + | zero => cases hn + | succ n => + have hlast : + rightRegularCyclicPartialProduct (G := G) (B := B) σ f n * f (σ ^ n) = 1 := by + simpa [rightRegularCyclicPartialProduct_succ] using hprod + have hinv : + (rightRegularCyclicPartialProduct (G := G) (B := B) σ f n)⁻¹ = f (σ ^ n) := + (mul_eq_one_iff_inv_eq).1 hlast + simpa [rightRegularCyclicPartialProduct, hinv] + +omit [CommGroup A] [CommGroup B] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- The canonical `ZMod |G|` index of a group element with respect to a chosen +cyclic generator. -/ +noncomputable def rightRegularCyclicIndex + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) (x : G) : + ZMod (Fintype.card G) := + Classical.choose (IsCyclic.unique_zpow_zmod (a := σ) hgen x) + +omit [CommGroup A] [CommGroup B] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- The cyclic index represents the original group element. -/ +theorem rightRegularCyclicIndex_spec + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) (x : G) : + x = σ ^ (rightRegularCyclicIndex (G := G) σ hgen x).val := by + simpa [rightRegularCyclicIndex] using + (Classical.choose_spec (IsCyclic.unique_zpow_zmod (a := σ) hgen x)).1 + +omit [CommGroup A] [CommGroup B] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- If a concrete `ZMod |G|` representative is known, the cyclic index chooser +returns it. -/ +theorem rightRegularCyclicIndex_eq_of_repr + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) + {x : G} {m : ZMod (Fintype.card G)} (hm : x = σ ^ m.val) : + rightRegularCyclicIndex (G := G) σ hgen x = m := by + exact ((Classical.choose_spec (IsCyclic.unique_zpow_zmod (a := σ) hgen x)).2 m hm).symm + +omit [CommGroup A] [CommGroup B] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- On natural powers in the standard range, the cyclic index has the expected +value. -/ +theorem rightRegularCyclicIndex_val_pow_of_lt + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) + {i : ℕ} (hi : i < Fintype.card G) : + (rightRegularCyclicIndex (G := G) σ hgen (σ ^ i)).val = i := by + have hidx : + rightRegularCyclicIndex (G := G) σ hgen (σ ^ i) = + (i : ZMod (Fintype.card G)) := by + apply rightRegularCyclicIndex_eq_of_repr (G := G) σ hgen + simp [ZMod.val_natCast_of_lt hi] + rw [hidx, ZMod.val_natCast_of_lt hi] + +omit [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- The group-element-indexed primitive candidate obtained from the cyclic +partial products. -/ +noncomputable def rightRegularCyclicPrimitive + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) (f : G → B) : G → B := + fun x => + rightRegularCyclicPartialProduct (G := G) (B := B) σ f + (rightRegularCyclicIndex (G := G) σ hgen x).val + +omit [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- Away from the wrap-around index, the cyclic primitive solves the +right-regular coboundary equation. -/ +theorem rightRegularCyclicPrimitive_mul_sigma_mul_inv_of_index_succ_lt + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) (f : G → B) (x : G) + (hix : (rightRegularCyclicIndex (G := G) σ hgen x).val + 1 < Fintype.card G) : + rightRegularCyclicPrimitive (G := G) (B := B) σ hgen f (x * σ) * + (rightRegularCyclicPrimitive (G := G) (B := B) σ hgen f x)⁻¹ = + f x := by + let i := (rightRegularCyclicIndex (G := G) σ hgen x).val + have hi : i + 1 < Fintype.card G := by + simpa [i] using hix + have hx : x = σ ^ i := by + simpa [i] using rightRegularCyclicIndex_spec (G := G) σ hgen x + have hxσ : x * σ = σ ^ (i + 1) := by + calc + x * σ = σ ^ i * σ := by rw [hx] + _ = σ ^ (i + 1) := (pow_succ σ i).symm + have hidx_xσ : + (rightRegularCyclicIndex (G := G) σ hgen (x * σ)).val = i + 1 := by + rw [hxσ] + exact rightRegularCyclicIndex_val_pow_of_lt (G := G) σ hgen hi + change rightRegularCyclicPartialProduct (G := G) (B := B) σ f + (rightRegularCyclicIndex (G := G) σ hgen (x * σ)).val * + (rightRegularCyclicPartialProduct (G := G) (B := B) σ f + (rightRegularCyclicIndex (G := G) σ hgen x).val)⁻¹ = f x + rw [hidx_xσ, show (rightRegularCyclicIndex (G := G) σ hgen x).val = i by rfl, hx] + exact rightRegularCyclicPartialProduct_succ_mul_inv (G := G) (B := B) σ f i + +omit [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- At the wrap-around index, the product-one condition makes the cyclic +primitive solve the right-regular coboundary equation. -/ +theorem rightRegularCyclicPrimitive_mul_sigma_mul_inv_of_index_eq_card_sub_one + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) (f : G → B) (x : G) + (hix : (rightRegularCyclicIndex (G := G) σ hgen x).val = Fintype.card G - 1) + (hprod : + rightRegularCyclicPartialProduct (G := G) (B := B) σ f (Fintype.card G) = 1) : + rightRegularCyclicPrimitive (G := G) (B := B) σ hgen f (x * σ) * + (rightRegularCyclicPrimitive (G := G) (B := B) σ hgen f x)⁻¹ = + f x := by + have hcard_pos : 0 < Fintype.card G := Fintype.card_pos + let i := (rightRegularCyclicIndex (G := G) σ hgen x).val + have hi : i = Fintype.card G - 1 := by + simpa [i] using hix + have hx : x = σ ^ i := by + simpa [i] using rightRegularCyclicIndex_spec (G := G) σ hgen x + have horder : orderOf σ = Fintype.card G := by + simpa [Nat.card_eq_fintype_card] using + orderOf_eq_card_of_forall_mem_zpowers (g := σ) hgen + have hpow_card : σ ^ Fintype.card G = 1 := by + rw [← horder] + exact pow_orderOf_eq_one σ + have hxσ : x * σ = 1 := by + calc + x * σ = σ ^ i * σ := by rw [hx] + _ = σ ^ (i + 1) := (pow_succ σ i).symm + _ = σ ^ Fintype.card G := by + rw [hi, Nat.sub_add_cancel (Nat.succ_le_of_lt hcard_pos)] + _ = 1 := hpow_card + have hidx_xσ : + (rightRegularCyclicIndex (G := G) σ hgen (x * σ)).val = 0 := by + have hidx : + rightRegularCyclicIndex (G := G) σ hgen (x * σ) = + (0 : ZMod (Fintype.card G)) := by + apply rightRegularCyclicIndex_eq_of_repr (G := G) σ hgen + simp [hxσ] + rw [hidx] + simp + have hwrap : + rightRegularCyclicPartialProduct (G := G) (B := B) σ f 0 * + (rightRegularCyclicPartialProduct (G := G) (B := B) σ f + (Fintype.card G - 1))⁻¹ = + f (σ ^ (Fintype.card G - 1)) := + rightRegularCyclicPartialProduct_wrap_mul_inv_of_eq_one + (G := G) (B := B) σ f hcard_pos hprod + change rightRegularCyclicPartialProduct (G := G) (B := B) σ f + (rightRegularCyclicIndex (G := G) σ hgen (x * σ)).val * + (rightRegularCyclicPartialProduct (G := G) (B := B) σ f + (rightRegularCyclicIndex (G := G) σ hgen x).val)⁻¹ = f x + rw [hidx_xσ, hix, hx, hi] + exact hwrap + +omit [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- If the cyclic partial product over a full period is `1`, the group-indexed +cyclic primitive solves the right-regular coboundary equation at every point. -/ +theorem rightRegularCyclicPrimitive_mul_sigma_mul_inv_of_partialProduct_eq_one + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) (f : G → B) + (hprod : + rightRegularCyclicPartialProduct (G := G) (B := B) σ f (Fintype.card G) = 1) + (x : G) : + rightRegularCyclicPrimitive (G := G) (B := B) σ hgen f (x * σ) * + (rightRegularCyclicPrimitive (G := G) (B := B) σ hgen f x)⁻¹ = + f x := by + have hcard_pos : 0 < Fintype.card G := Fintype.card_pos + have : NeZero (Fintype.card G) := ⟨hcard_pos.ne'⟩ + let i := (rightRegularCyclicIndex (G := G) σ hgen x).val + have hi_lt : i < Fintype.card G := by + simpa [i] using ZMod.val_lt (rightRegularCyclicIndex (G := G) σ hgen x) + by_cases hsucc : i + 1 < Fintype.card G + · exact rightRegularCyclicPrimitive_mul_sigma_mul_inv_of_index_succ_lt + (G := G) (B := B) σ hgen f x (by simpa [i] using hsucc) + · have hsucc_le : i + 1 ≤ Fintype.card G := Nat.succ_le_of_lt hi_lt + have hcard_le : Fintype.card G ≤ i + 1 := le_of_not_gt hsucc + have hsucc_eq : i + 1 = Fintype.card G := le_antisymm hsucc_le hcard_le + have hlast : i = Fintype.card G - 1 := by + rw [← hsucc_eq] + simp + exact rightRegularCyclicPrimitive_mul_sigma_mul_inv_of_index_eq_card_sub_one + (G := G) (B := B) σ hgen f x (by simpa [i] using hlast) hprod + +omit [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- A right-regular norm-kernel element has product `1` along one full cyclic +enumeration by a generator. -/ +theorem rightRegularFunction_prod_powers_eq_one_of_mem_normKernel + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) + {f : G → B} + (hf : f ∈ rightRegularFunctionNormKernelSubgroup (G := G) (B := B)) : + (Finset.range (Nat.card G)).prod (fun i => f (σ ^ i)) = 1 := by + classical + have hprod : (∏ g : G, f g) = 1 := + (rightRegularFunction_mem_normKernelSubgroup_iff (G := G) (B := B) f).1 hf + have hcard : orderOf σ = Nat.card G := + orderOf_eq_card_of_forall_mem_zpowers (g := σ) hgen + have hinj : Set.InjOn (fun i : ℕ => σ ^ i) (Finset.range (Nat.card G) : Set ℕ) := by + intro i hi j hj hij + have hmod : i ≡ j [MOD orderOf σ] := (pow_eq_pow_iff_modEq (x := σ)).1 hij + rw [hcard] at hmod + exact Nat.ModEq.eq_of_lt_of_lt hmod (by simpa using hi) (by simpa using hj) + have himage : + Finset.image (fun i : ℕ => σ ^ i) (Finset.range (Nat.card G)) = Finset.univ := + IsCyclic.image_range_card (a := σ) hgen + calc + (Finset.range (Nat.card G)).prod (fun i => f (σ ^ i)) = + (Finset.image (fun i : ℕ => σ ^ i) (Finset.range (Nat.card G))).prod + (fun x => f x) := by + exact (Finset.prod_image (s := Finset.range (Nat.card G)) + (g := fun i : ℕ => σ ^ i) (f := f) hinj).symm + _ = ∏ x : G, f x := by + rw [himage] + _ = 1 := hprod + +omit [Fintype G] [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- Membership in the right-regular augmentation subgroup is the pointwise +difference equation `b (x * σ) * (b x)⁻¹ = f x`. -/ +theorem rightRegularFunction_mem_augmentationSubgroup_iff + (σ : G) (f : G → B) : + f ∈ rightRegularFunctionAugmentationSubgroup (G := G) (B := B) σ ↔ + ∃ b : G → B, ∀ x : G, b (x * σ) * (b x)⁻¹ = f x := by + let := rightRegularFunctionMulDistribMulAction (G := G) (B := B) + constructor + · intro hf + change f ∈ augmentationSubgroup G (G → B) σ at hf + rcases hf with ⟨b, hb⟩ + refine ⟨b, ?_⟩ + intro x + have hx := congrArg (fun q : G → B => q x) hb + change b (x * σ) * (b x)⁻¹ = f x at hx + exact hx + · rintro ⟨b, hb⟩ + change f ∈ augmentationSubgroup G (G → B) σ + refine ⟨b, ?_⟩ + funext x + change b (x * σ) * (b x)⁻¹ = f x + exact hb x + +omit [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- Concrete `H^{-1}` source for the right-regular multiplicative induced +module: every norm-kernel element is an augmentation element. -/ +theorem rightRegularFunction_normKernel_le_augmentationSubgroup + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) : + rightRegularFunctionNormKernelSubgroup (G := G) (B := B) ≤ + rightRegularFunctionAugmentationSubgroup (G := G) (B := B) σ := by + intro f hf + have hprod_nat : + (Finset.range (Nat.card G)).prod (fun i => f (σ ^ i)) = 1 := + rightRegularFunction_prod_powers_eq_one_of_mem_normKernel + (G := G) (B := B) σ hgen hf + have hprod : + rightRegularCyclicPartialProduct (G := G) (B := B) σ f (Fintype.card G) = 1 := by + simpa [rightRegularCyclicPartialProduct, Nat.card_eq_fintype_card] using hprod_nat + rw [rightRegularFunction_mem_augmentationSubgroup_iff (G := G) (B := B) σ f] + refine ⟨rightRegularCyclicPrimitive (G := G) (B := B) σ hgen f, ?_⟩ + intro x + exact rightRegularCyclicPrimitive_mul_sigma_mul_inv_of_partialProduct_eq_one + (G := G) (B := B) σ hgen f hprod x + +omit [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- The `H^{-1}` quotient of the right-regular multiplicative induced module +is trivial for a cyclic group generated by `σ`. -/ +theorem rightRegularFunction_herbrandHMinusOne_subsingleton + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) : + Subsingleton (rightRegularFunctionHerbrandHMinusOne (G := G) (B := B) σ) := by + let := rightRegularFunctionMulDistribMulAction (G := G) (B := B) + exact herbrandHMinusOne_subsingleton_of_normKernel_le_augmentationSubgroup + (G := G) (A := G → B) σ + (rightRegularFunction_normKernel_le_augmentationSubgroup + (G := G) (B := B) σ hgen) + +omit [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- Concrete `H⁰` source for induced modules: for the right-regular +multiplicative induced module `G → B`, every fixed point is a norm. -/ +theorem rightRegularFunction_fixed_le_tateNormSubgroup : + rightRegularFunctionFixedSubgroup (G := G) (B := B) ≤ + rightRegularFunctionTateNormSubgroup (G := G) (B := B) := by + classical + let := rightRegularFunctionMulDistribMulAction (G := G) (B := B) + intro f hf + change f ∈ fixedSubgroup G (G → B) at hf + change f ∈ tateNormSubgroup G (G → B) + let d : G → B := fun y => if y = 1 then f 1 else 1 + refine ⟨d, ?_⟩ + funext x + have hfixed_x : f x = f 1 := by + have hx := congrArg (fun q : G → B => q 1) (hf x) + change f (1 * x) = f 1 at hx + simpa using hx + calc + tateNorm G (G → B) d x = ∏ g : G, d (x * g) := by + unfold tateNorm + let ev : (G → B) →* B := { + toFun q := q x + map_one' := rfl + map_mul' := by + intro q r + rfl + } + calc + ((∏ c : G, c • d) : G → B) x = ev (∏ c : G, c • d) := rfl + _ = ∏ c : G, ev (c • d) := by rw [map_prod] + _ = ∏ c : G, d (x * c) := by + refine Finset.prod_congr rfl ?_ + intro c _hc + change (c • d) x = d (x * c) + rfl + _ = f 1 := by + calc + (∏ g : G, d (x * g)) = d (x * x⁻¹) := by + refine Finset.prod_eq_single (s := Finset.univ) x⁻¹ ?_ ?_ + · intro g _hg hg + have hxg : x * g ≠ 1 := by + intro hxg_one + apply hg + calc + g = 1 * g := by simp + _ = (x⁻¹ * x) * g := by simp + _ = x⁻¹ * (x * g) := by rw [mul_assoc] + _ = x⁻¹ * 1 := by rw [hxg_one] + _ = x⁻¹ := by simp + simp [d, hxg] + · intro hxinv + simp at hxinv + _ = f 1 := by simp [d] + _ = f x := hfixed_x.symm + +omit [CommGroup A] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- The `H⁰` quotient of the right-regular multiplicative induced module is +trivial. This is the degree-zero half of the low-degree Herbrand comparison. -/ +theorem rightRegularFunction_herbrandH0_subsingleton : + Subsingleton (rightRegularFunctionHerbrandH0 (G := G) (B := B)) := by + let := rightRegularFunctionMulDistribMulAction (G := G) (B := B) + exact herbrandH0_subsingleton_of_fixed_le_tateNormSubgroup + (G := G) (A := G → B) (rightRegularFunction_fixed_le_tateNormSubgroup + (G := G) (B := B)) + +omit [CommGroup C] [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Transport `H⁰` vanishing from the right-regular trivial-subgroup model +along an explicit multiplicative equivalence. -/ +theorem herbrandH0_subsingleton_of_equiv_rightRegularFunction + (e : A ≃* (G → B)) + (he : ∀ (g : G) (a : A) (x : G), e (g • a) x = e a (x * g)) : + Subsingleton (HerbrandH0 G A) := by + let := rightRegularFunctionMulDistribMulAction (G := G) (B := B) + exact herbrandH0_subsingleton_of_mulEquiv + (G := G) (A := A) (B := G → B) e + (by + intro g a + funext x + change e (g • a) x = e a (x * g) + exact he g a x) + (rightRegularFunction_fixed_le_tateNormSubgroup (G := G) (B := B)) + +omit [CommGroup C] [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Transport `H^{-1}` vanishing from the right-regular trivial-subgroup model +along an explicit multiplicative equivalence. -/ +theorem herbrandHMinusOne_subsingleton_of_equiv_rightRegularFunction + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) + (e : A ≃* (G → B)) + (he : ∀ (g : G) (a : A) (x : G), e (g • a) x = e a (x * g)) : + Subsingleton (HerbrandHMinusOne G A σ) := by + let := rightRegularFunctionMulDistribMulAction (G := G) (B := B) + exact herbrandHMinusOne_subsingleton_of_mulEquiv + (G := G) (A := A) (B := G → B) e + (by + intro g a + funext x + change e (g • a) x = e a (x * g) + exact he g a x) + σ + (rightRegularFunction_normKernel_le_augmentationSubgroup + (G := G) (B := B) σ hgen) + +omit [CommGroup A] [CommGroup B] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- A distributive action on an additive group induces a multiplicative action +on its `Multiplicative` wrapper. -/ +@[reducible] def multiplicativeMulDistribMulActionOfDistribMulAction + (G : Type uG) (M : Type uA) [Group G] [AddCommGroup M] + [DistribMulAction G M] : + MulDistribMulAction G (Multiplicative M) where + smul g m := Multiplicative.ofAdd (g • Multiplicative.toAdd m) + one_smul := by + intro m + change Multiplicative.ofAdd (1 • Multiplicative.toAdd m) = + Multiplicative.ofAdd (Multiplicative.toAdd m) + rw [one_smul] + mul_smul := by + intro g h m + change Multiplicative.ofAdd ((g * h) • Multiplicative.toAdd m) = + Multiplicative.ofAdd (g • h • Multiplicative.toAdd m) + rw [mul_smul] + smul_mul := by + intro g m n + change Multiplicative.ofAdd (g • Multiplicative.toAdd (m * n)) = + Multiplicative.ofAdd + (g • Multiplicative.toAdd m + g • Multiplicative.toAdd n) + rw [show Multiplicative.toAdd (m * n) = + Multiplicative.toAdd m + Multiplicative.toAdd n from rfl] + rw [smul_add] + smul_one := by + intro g + change Multiplicative.ofAdd (g • (0 : M)) = Multiplicative.ofAdd (0 : M) + rw [smul_zero] + +omit [Group G] [Fintype G] [CommGroup A] [CommGroup B] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- Pointwise conversion between a multiplicative wrapper on additive +functions and functions into the multiplicative wrapper. -/ +def multiplicativeFunctionMulEquiv + (G : Type uG) (D : Type uB) [AddCommGroup D] : + Multiplicative (G → D) ≃* (G → Multiplicative D) where + toFun f := fun x => Multiplicative.ofAdd (Multiplicative.toAdd f x) + invFun f := Multiplicative.ofAdd (fun x => Multiplicative.toAdd (f x)) + left_inv := by + intro f + rfl + right_inv := by + intro f + funext x + rfl + map_mul' := by + intro f h + funext x + rfl + +omit [Group G] [Fintype G] [CommGroup A] [CommGroup B] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- Convert an additive equivalence with a function space into the +multiplicative right-regular function model used by the Herbrand quotient API. -/ +def mulEquivRightRegularFunctionOfAddEquiv + (G : Type uG) {M : Type uA} {D : Type uB} + [AddCommGroup M] [AddCommGroup D] (e : M ≃+ (G → D)) : + Multiplicative M ≃* (G → Multiplicative D) where + toFun m := fun x => Multiplicative.ofAdd (e (Multiplicative.toAdd m) x) + invFun f := Multiplicative.ofAdd (e.symm (fun x => Multiplicative.toAdd (f x))) + left_inv := by + intro m + change Multiplicative.ofAdd + (e.symm (e (Multiplicative.toAdd m))) = + Multiplicative.ofAdd (Multiplicative.toAdd m) + exact congrArg Multiplicative.ofAdd (e.left_inv (Multiplicative.toAdd m)) + right_inv := by + intro f + funext x + change Multiplicative.ofAdd + (e (e.symm (fun y : G => Multiplicative.toAdd (f y))) x) = + Multiplicative.ofAdd (Multiplicative.toAdd (f x)) + exact congrArg Multiplicative.ofAdd + (congrArg (fun q : G → D => q x) + (e.right_inv (fun y : G => Multiplicative.toAdd (f y)))) + map_mul' := by + intro m n + funext x + change Multiplicative.ofAdd (e (Multiplicative.toAdd (m * n)) x) = + Multiplicative.ofAdd + (e (Multiplicative.toAdd m) x + e (Multiplicative.toAdd n) x) + rw [show Multiplicative.toAdd (m * n) = + Multiplicative.toAdd m + Multiplicative.toAdd n from rfl] + exact congrArg Multiplicative.ofAdd + (congrArg (fun q : G → D => q x) + (e.map_add (Multiplicative.toAdd m) (Multiplicative.toAdd n))) + +omit [Fintype G] [CommGroup A] [CommGroup B] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- Equivariance of `mulEquivRightRegularFunctionOfAddEquiv`, assuming the +input additive equivalence is right-regular equivariant pointwise. -/ +theorem mulEquivRightRegularFunctionOfAddEquiv_commutes + {M : Type uA} {D : Type uB} + [AddCommGroup M] [DistribMulAction G M] [AddCommGroup D] + (e : M ≃+ (G → D)) + (he : ∀ (g : G) (m : M) (x : G), e (g • m) x = e m (x * g)) + (g : G) (m : Multiplicative M) (x : G) : + letI := multiplicativeMulDistribMulActionOfDistribMulAction G M + mulEquivRightRegularFunctionOfAddEquiv G e (g • m) x = + mulEquivRightRegularFunctionOfAddEquiv G e m (x * g) := by + change Multiplicative.ofAdd (e (g • Multiplicative.toAdd m) x) = + Multiplicative.ofAdd (e (Multiplicative.toAdd m) (x * g)) + exact congrArg Multiplicative.ofAdd (he g (Multiplicative.toAdd m) x) + +omit [CommGroup A] [CommGroup B] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- `H⁰` vanishing for a multiplicative wrapper transported from an additive +right-regular equivalence. -/ +theorem herbrandH0_subsingleton_of_addEquiv_rightRegularFunction + {M : Type uA} {D : Type uB} + [AddCommGroup M] [DistribMulAction G M] [AddCommGroup D] + (e : M ≃+ (G → D)) + (he : ∀ (g : G) (m : M) (x : G), e (g • m) x = e m (x * g)) : + letI := multiplicativeMulDistribMulActionOfDistribMulAction G M + Subsingleton (HerbrandH0 G (Multiplicative M)) := by + let := multiplicativeMulDistribMulActionOfDistribMulAction G M + let : MulDistribMulAction G (Multiplicative D) := { + smul _ d := d + one_smul := by + intro d + rfl + mul_smul := by + intro _ _ d + rfl + smul_mul := by + intro _ d e + rfl + smul_one := by + intro _ + rfl + } + exact herbrandH0_subsingleton_of_equiv_rightRegularFunction + (G := G) (A := Multiplicative M) (B := Multiplicative D) + (mulEquivRightRegularFunctionOfAddEquiv G e) + (by + intro g m x + exact mulEquivRightRegularFunctionOfAddEquiv_commutes + (G := G) e he g m x) + +omit [CommGroup A] [CommGroup B] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] in +/-- `H^{-1}` vanishing for a multiplicative wrapper transported from an +additive right-regular equivalence. -/ +theorem herbrandHMinusOne_subsingleton_of_addEquiv_rightRegularFunction + {M : Type uA} {D : Type uB} + [AddCommGroup M] [DistribMulAction G M] [AddCommGroup D] + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) + (e : M ≃+ (G → D)) + (he : ∀ (g : G) (m : M) (x : G), e (g • m) x = e m (x * g)) : + letI := multiplicativeMulDistribMulActionOfDistribMulAction G M + Subsingleton (HerbrandHMinusOne G (Multiplicative M) σ) := by + let := multiplicativeMulDistribMulActionOfDistribMulAction G M + let : MulDistribMulAction G (Multiplicative D) := { + smul _ d := d + one_smul := by + intro d + rfl + mul_smul := by + intro _ _ d + rfl + smul_mul := by + intro _ d e + rfl + smul_one := by + intro _ + rfl + } + exact herbrandHMinusOne_subsingleton_of_equiv_rightRegularFunction + (G := G) (A := Multiplicative M) (B := Multiplicative D) + σ hgen (mulEquivRightRegularFunctionOfAddEquiv G e) + (by + intro g m x + exact mulEquivRightRegularFunctionOfAddEquiv_commutes + (G := G) e he g m x) + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Quotient-cardinality source for `H⁰(G,A)=A^G/N_G A`. -/ +theorem card_fixedSubgroup_eq_card_herbrandH0_mul_card_tateNormSubgroup [Finite A] : + Nat.card (fixedSubgroup G A) = + Nat.card (HerbrandH0 G A) * Nat.card (tateNormSubgroup G A) := by + simpa [HerbrandH0, + card_subgroupOf_eq_card (tateNormSubgroup_le_fixedSubgroup (G := G) (A := A))] using + (Subgroup.card_eq_card_quotient_mul_card_subgroup + ((tateNormSubgroup G A).subgroupOf (fixedSubgroup G A))) + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- Quotient-cardinality source for +`H^{-1}(G,A)=ker(N_G)/I_G A`. -/ +theorem card_normKernelSubgroup_eq_card_herbrandHMinusOne_mul_card_augmentationSubgroup + (σ : G) [Finite A] : + Nat.card (normKernelSubgroup G A) = + Nat.card (HerbrandHMinusOne G A σ) * + Nat.card (augmentationSubgroup G A σ) := by + simpa [HerbrandHMinusOne, + card_subgroupOf_eq_card (augmentationSubgroup_le_normKernelSubgroup (G := G) (A := A) σ)] using + (Subgroup.card_eq_card_quotient_mul_card_subgroup + ((augmentationSubgroup G A σ).subgroupOf (normKernelSubgroup G A))) + +omit [CommGroup B] [CommGroup C] + [MulDistribMulAction G B] [MulDistribMulAction G C] in +/-- The two low-degree Herbrand quotients of a finite cyclic module have equal +cardinality, the finite-module source for Herbrand-quotient multiplicativity. -/ +theorem herbrand_finite_module_card_eq + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) [Finite A] : + Nat.card (HerbrandH0 G A) = Nat.card (HerbrandHMinusOne G A σ) := by + have h0 := card_fixedSubgroup_eq_card_herbrandH0_mul_card_tateNormSubgroup + (G := G) (A := A) + have hm := card_normKernelSubgroup_eq_card_herbrandHMinusOne_mul_card_augmentationSubgroup + (G := G) (A := A) σ + have hbal := herbrand_finite_module_cardinality_balance + (G := G) (A := A) σ hgen + rw [h0, hm] at hbal + have hfactor : + Nat.card (HerbrandH0 G A) * + (Nat.card (tateNormSubgroup G A) * Nat.card (augmentationSubgroup G A σ)) = + Nat.card (HerbrandHMinusOne G A σ) * + (Nat.card (tateNormSubgroup G A) * Nat.card (augmentationSubgroup G A σ)) := by + calc + Nat.card (HerbrandH0 G A) * + (Nat.card (tateNormSubgroup G A) * Nat.card (augmentationSubgroup G A σ)) + = + (Nat.card (HerbrandH0 G A) * Nat.card (tateNormSubgroup G A)) * + Nat.card (augmentationSubgroup G A σ) := by + ac_rfl + _ = (Nat.card (HerbrandHMinusOne G A σ) * + Nat.card (augmentationSubgroup G A σ)) * + Nat.card (tateNormSubgroup G A) := hbal + _ = Nat.card (HerbrandHMinusOne G A σ) * + (Nat.card (tateNormSubgroup G A) * Nat.card (augmentationSubgroup G A σ)) := by + ac_rfl + have hNpos : 0 < Nat.card (tateNormSubgroup G A) := + Finite.card_pos (α := tateNormSubgroup G A) + have hIpos : 0 < Nat.card (augmentationSubgroup G A σ) := + Finite.card_pos (α := augmentationSubgroup G A σ) + exact Nat.mul_right_cancel (Nat.mul_pos hNpos hIpos) hfactor + +end Herbrand +end ProfiniteCohomology + +end +end CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean new file mode 100644 index 0000000000..746e2719de --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean @@ -0,0 +1,232 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Product +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.EquivariantEquiv +public import Mathlib.Algebra.GroupWithZero.Action.Prod +/-! +# Low-degree Tate cohomology of binary products + +This specializes the dependent-product calculation to two possibly +different coefficient groups. It is used to join the unrestricted and +integral parts of a supported idele group. +-/ + +@[expose] public section + +noncomputable +section + +namespace CyclicCohomology + +open CyclicCohomology.ProfiniteCohomology.Herbrand + +universe uG uA + +variable {G : Type uG} [Group G] [Fintype G] +variable (A B : Type uA) +variable [CommGroup A] [CommGroup B] +variable [MulDistribMulAction G A] [MulDistribMulAction G B] + +/-- The two-element dependent family associated with `A × B`. -/ +abbrev BinaryCoefficientFamily : Bool → Type uA + | false => A + | true => B + +/-- Each member of the binary coefficient family inherits its commutative group structure. -/ +instance binaryCoefficientFamilyCommGroup : + ∀ i, CommGroup (BinaryCoefficientFamily A B i) + | false => inferInstance + | true => inferInstance + +/-- The componentwise `G`-action on the binary coefficient family. -/ +@[reducible] +noncomputable def binaryCoefficientFamilyAction : + ∀ i, MulDistribMulAction G + (BinaryCoefficientFamily A B i) + | false => inferInstance + | true => inferInstance + +/-- The binary coefficient family carries the given action on each component. -/ +noncomputable instance binaryCoefficientFamilyMulDistribMulAction + (i : Bool) : + MulDistribMulAction G + (BinaryCoefficientFamily A B i) := + binaryCoefficientFamilyAction A B i + +/-- Reindex a binary product as a dependent family over `Bool`. -/ +noncomputable def prodEquivBinaryCoefficientFamily : + A × B ≃* ∀ i, BinaryCoefficientFamily A B i where + toFun x + | false => x.1 + | true => x.2 + invFun x := ⟨x false, x true⟩ + left_inv _ := rfl + right_inv x := by + funext i + cases i <;> rfl + map_mul' _ _ := by + funext i + cases i <;> rfl + +omit [Fintype G] in +/-- The binary reindexing is equivariant for the componentwise +actions. -/ +theorem prodEquivBinaryCoefficientFamily_smul + (g : G) (x : A × B) : + letI : ∀ i, MulDistribMulAction G + (BinaryCoefficientFamily A B i) := + binaryCoefficientFamilyAction A B + letI : MulDistribMulAction G + (∀ i, BinaryCoefficientFamily A B i) := + piMulDistribMulAction G + (BinaryCoefficientFamily A B) + prodEquivBinaryCoefficientFamily A B (g • x) = + g • prodEquivBinaryCoefficientFamily A B x := by + funext i + cases i <;> rfl + +/-- Identify the degree-zero cohomology family over `Bool` with its two factors. -/ +noncomputable def piHerbrandH0EquivProd : + (∀ i, HerbrandH0 G + (BinaryCoefficientFamily A B i)) ≃* + HerbrandH0 G A × HerbrandH0 G B where + toFun x := ⟨x false, x true⟩ + invFun x + | false => x.1 + | true => x.2 + left_inv x := by + funext i + cases i <;> rfl + right_inv _ := rfl + map_mul' _ _ := rfl + +/-- Identify the degree-minus-one cohomology family over `Bool` with its two factors. -/ +noncomputable def piHerbrandHMinusOneEquivProd + (σ : G) : + (∀ i, HerbrandHMinusOne G + (BinaryCoefficientFamily A B i) σ) ≃* + HerbrandHMinusOne G A σ × + HerbrandHMinusOne G B σ where + toFun x := ⟨x false, x true⟩ + invFun x + | false => x.1 + | true => x.2 + left_inv x := by + funext i + cases i <;> rfl + right_inv _ := rfl + map_mul' _ _ := rfl + +/-- Degree-zero Tate cohomology commutes with a binary product. -/ +noncomputable def herbrandH0ProdEquiv : + HerbrandH0 G (A × B) ≃* + HerbrandH0 G A × HerbrandH0 G B := by + letI familyAction : ∀ i, MulDistribMulAction G + (BinaryCoefficientFamily A B i) := + binaryCoefficientFamilyAction A B + letI piAction : MulDistribMulAction G + (∀ i, BinaryCoefficientFamily A B i) := + piMulDistribMulAction G + (BinaryCoefficientFamily A B) + exact + (herbrandH0EquivariantMulEquiv + (prodEquivBinaryCoefficientFamily A B) + (prodEquivBinaryCoefficientFamily_smul A B)).trans + ((herbrandH0PiEquiv + (G := G) (BinaryCoefficientFamily A B)).trans + (piHerbrandH0EquivProd A B)) + +/-- Degree-minus-one Tate cohomology commutes with a binary product. -/ +noncomputable def herbrandHMinusOneProdEquiv + (σ : G) : + HerbrandHMinusOne G (A × B) σ ≃* + HerbrandHMinusOne G A σ × + HerbrandHMinusOne G B σ := by + letI familyAction : ∀ i, MulDistribMulAction G + (BinaryCoefficientFamily A B i) := + binaryCoefficientFamilyAction A B + letI piAction : MulDistribMulAction G + (∀ i, BinaryCoefficientFamily A B i) := + piMulDistribMulAction G + (BinaryCoefficientFamily A B) + exact + (herbrandHMinusOneEquivariantMulEquiv + (prodEquivBinaryCoefficientFamily A B) + (prodEquivBinaryCoefficientFamily_smul A B) σ).trans + ((herbrandHMinusOnePiEquiv + (G := G) (BinaryCoefficientFamily A B) σ).trans + (piHerbrandHMinusOneEquivProd A B σ)) + +/-- Finiteness of degree zero is preserved by a binary product. -/ +theorem herbrandH0ProdFinite + [Finite (HerbrandH0 G A)] + [Finite (HerbrandH0 G B)] : + Finite (HerbrandH0 G (A × B)) := + Finite.of_equiv + (HerbrandH0 G A × HerbrandH0 G B) + (herbrandH0ProdEquiv A B).symm.toEquiv + +/-- Finiteness of degree minus one is preserved by a binary product. -/ +theorem herbrandHMinusOneProdFinite + (σ : G) + [Finite (HerbrandHMinusOne G A σ)] + [Finite (HerbrandHMinusOne G B σ)] : + Finite (HerbrandHMinusOne G (A × B) σ) := + Finite.of_equiv + (HerbrandHMinusOne G A σ × + HerbrandHMinusOne G B σ) + (herbrandHMinusOneProdEquiv A B σ).symm.toEquiv + +/-- Cardinality of degree-zero Tate cohomology for a binary product. -/ +theorem herbrandH0Prod_card : + Nat.card (HerbrandH0 G (A × B)) = + Nat.card (HerbrandH0 G A) * + Nat.card (HerbrandH0 G B) := by + rw [Nat.card_congr (herbrandH0ProdEquiv A B).toEquiv, + Nat.card_prod] + +/-- Cardinality of degree-minus-one Tate cohomology for a binary +product. -/ +theorem herbrandHMinusOneProd_card + (σ : G) : + Nat.card (HerbrandHMinusOne G (A × B) σ) = + Nat.card (HerbrandHMinusOne G A σ) * + Nat.card (HerbrandHMinusOne G B σ) := by + rw [Nat.card_congr + (herbrandHMinusOneProdEquiv A B σ).toEquiv, + Nat.card_prod] + +/-- The Herbrand quotient of a binary product is the product of the +two Herbrand quotients. -/ +theorem herbrandQuotient_prod + (σ : G) + [Finite (HerbrandH0 G A)] + [Finite (HerbrandHMinusOne G A σ)] + [Finite (HerbrandH0 G B)] + [Finite (HerbrandHMinusOne G B σ)] : + letI : Finite (HerbrandH0 G (A × B)) := + herbrandH0ProdFinite A B + letI : Finite (HerbrandHMinusOne G (A × B) σ) := + herbrandHMinusOneProdFinite A B σ + herbrandQuotient (G := G) (A := A × B) σ = + herbrandQuotient (G := G) (A := A) σ * + herbrandQuotient (G := G) (A := B) σ := by + let : Finite (HerbrandH0 G (A × B)) := + herbrandH0ProdFinite A B + let : Finite (HerbrandHMinusOne G (A × B) σ) := + herbrandHMinusOneProdFinite A B σ + rw [herbrandQuotient_eq_card_ratio, + herbrandQuotient_eq_card_ratio, + herbrandQuotient_eq_card_ratio, + herbrandH0Prod_card A B, + herbrandHMinusOneProd_card A B σ] + simp only [Nat.cast_mul] + exact (div_mul_div_comm _ _ _ _).symm + +end CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Cardinality.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Cardinality.lean new file mode 100644 index 0000000000..60d3df2b3a --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Cardinality.lean @@ -0,0 +1,540 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.TateComparison +public import Mathlib.RepresentationTheory.Homological.GroupCohomology.FiniteCyclic + +/-! # Cardinality -/ + +@[expose] public section +namespace CyclicCohomology + +/-! +# Cardinality identity from the standard Tate exact sequence + +For a short exact sequence of finite cyclic modules, this module applies +mathlib's homology long exact sequence to the standard two-periodic cyclic +complex. The resulting cardinality identity is transported to the +arithmetic `H⁰` and `H⁻¹` presentations. +-/ + +noncomputable +section + +namespace ProfiniteCohomology +namespace Herbrand + +open CategoryTheory + +variable {G A B C : Type} + +section + +variable [CommGroup G] [Fintype G] +variable [CommGroup A] [CommGroup B] [CommGroup C] +variable [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] + +private noncomputable def subCompNormMap + (σ : G) (f : A →* B) + (hf : ∀ (g : G) (a : A), f (g • a) = g • f a) : + Rep.FiniteCyclicGroup.subCompNormHom + (Rep.ofMulDistribMulAction G A) σ ⟶ + Rep.FiniteCyclicGroup.subCompNormHom + (Rep.ofMulDistribMulAction G B) σ where + τ₁ := (equivariantRepHom f hf).toModuleCatHom + τ₂ := (equivariantRepHom f hf).toModuleCatHom + τ₃ := (equivariantRepHom f hf).toModuleCatHom + comm₁₂ := by + ext a + change Additive A at a + change + Additive.ofMul ((σ • f a.toMul) / f a.toMul) = + Additive.ofMul (f ((σ • a.toMul) / a.toMul)) + exact congrArg Additive.ofMul (by rw [map_div, hf]) + comm₂₃ := by + ext a + apply Additive.ofMul.injective + simp [Rep.FiniteCyclicGroup.subCompNormHom, Rep.norm, + Representation.norm, Rep.hom_comm_apply] + +private noncomputable def periodicChainMap + (σ : G) (f : A →* B) + (hf : ∀ (g : G) (a : A), f (g • a) = g • f a) : + Rep.FiniteCyclicGroup.moduleCatChainComplex + (Rep.ofMulDistribMulAction G A) σ ⟶ + Rep.FiniteCyclicGroup.moduleCatChainComplex + (Rep.ofMulDistribMulAction G B) σ where + f _ := (equivariantRepHom f hf).toModuleCatHom + comm' := by + rintro i j ⟨rfl⟩ + by_cases hj : Even (j + 1) + · simp only [Rep.FiniteCyclicGroup.moduleCatChainComplex, + HomologicalComplex.alternatingConst, ComplexShape.down_Rel, dite_eq_ite, ↓reduceIte, hj] + exact (subCompNormMap σ f hf).comm₂₃ + · simp only [Rep.FiniteCyclicGroup.moduleCatChainComplex, + HomologicalComplex.alternatingConst, ComplexShape.down_Rel, dite_eq_ite, ↓reduceIte, hj] + exact (subCompNormMap σ f hf).comm₁₂ + +private noncomputable def periodicShortComplex + (σ : G) + (i : A →* B) (j : B →* C) + (hi : ∀ (g : G) (a : A), i (g • a) = g • i a) + (hj : ∀ (g : G) (b : B), j (g • b) = g • j b) + (hker : ∀ b : B, j b = 1 ↔ ∃ a : A, i a = b) : + ShortComplex (ChainComplex (ModuleCat ℤ) ℕ) := + ShortComplex.mk (periodicChainMap σ i hi) (periodicChainMap σ j hj) <| by + apply HomologicalComplex.hom_ext + intro n + ext a + change Additive.ofMul (j (i a.toMul)) = 0 + apply Additive.ofMul.injective + exact (hker (i a.toMul)).2 ⟨a.toMul, rfl⟩ + +private theorem periodicShortComplex_shortExact + (σ : G) + (i : A →* B) (j : B →* C) + (hi : ∀ (g : G) (a : A), i (g • a) = g • i a) + (hj : ∀ (g : G) (b : B), j (g • b) = g • j b) + (hker : ∀ b : B, j b = 1 ↔ ∃ a : A, i a = b) + (hinj : Function.Injective i) (hsurj : Function.Surjective j) : + (periodicShortComplex σ i j hi hj hker).ShortExact := by + rw [HomologicalComplex.shortExact_iff_degreewise_shortExact] + intro n + refine + { exact := ?_ + mono_f := (ModuleCat.mono_iff_injective _).2 ?_ + epi_g := (ModuleCat.epi_iff_surjective _).2 ?_ } + · apply (ShortComplex.moduleCat_exact_iff _).2 + intro b hb + change Additive.ofMul (j b.toMul) = 0 at hb + have hb' : j b.toMul = 1 := Additive.ofMul.injective hb + rcases (hker b.toMul).1 hb' with ⟨a, ha⟩ + refine ⟨Additive.ofMul a, ?_⟩ + apply Additive.toMul.injective + exact ha + · intro a a' ha + apply Additive.toMul.injective + apply hinj + exact Additive.ofMul.injective ha + · intro c + rcases hsurj c.toMul with ⟨b, hb⟩ + refine ⟨Additive.ofMul b, ?_⟩ + apply Additive.toMul.injective + exact hb + +private noncomputable def periodicScIsoEven + {R H : Type} [CommRing R] [CommGroup H] [Fintype H] + (M : Rep R H) (τ : H) + {n : ℕ} [h₀ : NeZero n] (hn : Even n) : + (Rep.FiniteCyclicGroup.moduleCatChainComplex M τ).sc n ≅ + Rep.FiniteCyclicGroup.subCompNormHom M τ := + HomologicalComplex.alternatingConstScIsoEven + (ModuleCat.of R M.V) + (by ext; simp [Rep.sub_hom, Rep.applyAsHom, Rep.norm]) + (by ext; simp [Rep.sub_hom, Rep.applyAsHom, Rep.norm]) + (fun _ _ => ComplexShape.down_nat_odd_add) + (by simp) + (by + induction n generalizing h₀ with + | zero => exact (NeZero.ne 0 rfl).elim + | succ n _ => simp) + hn + +private noncomputable def periodicScIsoOdd + {R H : Type} [CommRing R] [CommGroup H] [Fintype H] + (M : Rep R H) (τ : H) {n : ℕ} (hn : Odd n) : + (Rep.FiniteCyclicGroup.moduleCatChainComplex M τ).sc n ≅ + Rep.FiniteCyclicGroup.normHomCompSub M τ := + HomologicalComplex.alternatingConstScIsoOdd + (ModuleCat.of R M.V) + (by ext; simp [Rep.sub_hom, Rep.applyAsHom, Rep.norm]) + (by ext; simp [Rep.sub_hom, Rep.applyAsHom, Rep.norm]) + (fun _ _ => ComplexShape.down_nat_odd_add) + (by simp) + (by rcases hn with ⟨m, rfl⟩; simp) + hn + +private noncomputable def periodicHomologyIsoEven + {R H : Type} [CommRing R] [CommGroup H] [Fintype H] + (M : Rep R H) (τ : H) + {n : ℕ} [NeZero n] (hn : Even n) : + (Rep.FiniteCyclicGroup.moduleCatChainComplex M τ).homology n ≅ + (Rep.FiniteCyclicGroup.subCompNormHom M τ).homology := + ShortComplex.homologyMapIso (periodicScIsoEven M τ hn) + +private noncomputable def periodicHomologyIsoOdd + {R H : Type} [CommRing R] [CommGroup H] [Fintype H] + (M : Rep R H) (τ : H) {n : ℕ} (hn : Odd n) : + (Rep.FiniteCyclicGroup.moduleCatChainComplex M τ).homology n ≅ + (Rep.FiniteCyclicGroup.normHomCompSub M τ).homology := + ShortComplex.homologyMapIso (periodicScIsoOdd M τ hn) + +private noncomputable def periodicEvenHerbrandHMinusOneIso + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) + {n : ℕ} [NeZero n] (hn : Even n) : + (Rep.FiniteCyclicGroup.moduleCatChainComplex + (Rep.ofMulDistribMulAction G A) σ).homology n ≅ + ModuleCat.of ℤ (Additive (HerbrandHMinusOne G A σ)) := + periodicHomologyIsoEven (Rep.ofMulDistribMulAction G A) σ hn ≪≫ + (TateCohomology.isoFiniteCyclicNegOne + (Rep.ofMulDistribMulAction G A) σ hgen).symm ≪≫ + tateHMinusOneIsoHerbrandHMinusOne σ hgen + +private noncomputable def periodicOddHerbrandHZeroIso + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) + {n : ℕ} (hn : Odd n) : + (Rep.FiniteCyclicGroup.moduleCatChainComplex + (Rep.ofMulDistribMulAction G A) σ).homology n ≅ + ModuleCat.of ℤ (Additive (HerbrandH0 G A)) := + periodicHomologyIsoOdd (Rep.ofMulDistribMulAction G A) σ hn ≪≫ + (TateCohomology.isoFiniteCyclicZero + (Rep.ofMulDistribMulAction G A) σ hgen).symm ≪≫ + tateH0IsoHerbrandH0 + +private theorem periodicScIsoEven_naturality + (σ : G) {n : ℕ} [NeZero n] (hn : Even n) + (f : A →* B) + (hf : ∀ (g : G) (a : A), f (g • a) = g • f a) : + ShortComplex.homologyMap + (periodicScIsoEven + (Rep.ofMulDistribMulAction G A) σ hn).inv ≫ + ShortComplex.homologyMap + ((HomologicalComplex.shortComplexFunctor + (ModuleCat ℤ) (ComplexShape.down ℕ) n).map + (periodicChainMap σ f hf)) ≫ + ShortComplex.homologyMap + (periodicScIsoEven + (Rep.ofMulDistribMulAction G B) σ hn).hom = + ShortComplex.homologyMap (subCompNormMap σ f hf) := by + rw [← ShortComplex.homologyMap_comp, ← ShortComplex.homologyMap_comp] + congr 1 + +private theorem periodicHomologyIsoEven_naturality + (σ : G) {n : ℕ} [NeZero n] (hn : Even n) + (f : A →* B) + (hf : ∀ (g : G) (a : A), f (g • a) = g • f a) : + (periodicHomologyIsoEven + (Rep.ofMulDistribMulAction G A) σ hn).inv ≫ + HomologicalComplex.homologyMap (periodicChainMap σ f hf) n ≫ + (periodicHomologyIsoEven + (Rep.ofMulDistribMulAction G B) σ hn).hom = + ShortComplex.homologyMap (subCompNormMap σ f hf) := + periodicScIsoEven_naturality σ hn f hf + +/-- Conjugating a `ModuleCat ℤ` morphism by isomorphisms identifies the +ranges of the associated multiplicatively tagged homomorphisms. -/ +noncomputable def moduleCatRangeEquivOfConjugate + {X Y X' Y' : ModuleCat.{0} ℤ} + (f : X ⟶ Y) (g : X' ⟶ Y') + (eX : X ≅ X') (eY : Y ≅ Y') + (h : eX.inv ≫ f ≫ eY.hom = g) : + MonoidHom.range f.hom.toAddMonoidHom.toMultiplicative ≃ + MonoidHom.range g.hom.toAddMonoidHom.toMultiplicative := by + have hnat : f ≫ eY.hom = eX.hom ≫ g := by + rw [← cancel_epi eX.inv] + simpa only [Category.assoc, eX.inv_hom_id_assoc] using h + have hinv : eX.inv ≫ f = g ≫ eY.inv := by + rw [← cancel_mono eY.hom] + simpa only [Category.assoc, eY.inv_hom_id, Category.comp_id] using h + refine + { toFun := fun y => ⟨Multiplicative.ofAdd (eY.hom y.1.toAdd), ?_⟩ + invFun := fun y => ⟨Multiplicative.ofAdd (eY.inv y.1.toAdd), ?_⟩ + left_inv := ?_ + right_inv := ?_ } + · rcases y.2 with ⟨x, hx⟩ + refine ⟨Multiplicative.ofAdd (eX.hom x.toAdd), ?_⟩ + apply Multiplicative.toAdd.injective + change g (eX.hom x.toAdd) = eY.hom y.1.toAdd + have hx' : f x.toAdd = y.1.toAdd := + congrArg Multiplicative.toAdd hx + rw [← hx'] + exact (congrArg (fun k : X ⟶ Y' => k x.toAdd) hnat).symm + · rcases y.2 with ⟨x, hx⟩ + refine ⟨Multiplicative.ofAdd (eX.inv x.toAdd), ?_⟩ + apply Multiplicative.toAdd.injective + change f (eX.inv x.toAdd) = eY.inv y.1.toAdd + have hx' : g x.toAdd = y.1.toAdd := + congrArg Multiplicative.toAdd hx + rw [← hx'] + exact congrArg (fun k : X' ⟶ Y => k x.toAdd) hinv + · intro y + apply Subtype.ext + apply Multiplicative.toAdd.injective + exact eY.hom_inv_id_apply y.1.toAdd + · intro y + apply Subtype.ext + apply Multiplicative.toAdd.injective + exact eY.inv_hom_id_apply y.1.toAdd + +/-- Conjugate `ModuleCat ℤ` morphisms have ranges of the same cardinality +after multiplicatively tagging their underlying additive groups. -/ +theorem moduleCatRangeCard_eq_of_conjugate + {X Y X' Y' : ModuleCat.{0} ℤ} + (f : X ⟶ Y) (g : X' ⟶ Y') + (eX : X ≅ X') (eY : Y ≅ Y') + (h : eX.inv ≫ f ≫ eY.hom = g) : + Nat.card (MonoidHom.range + f.hom.toAddMonoidHom.toMultiplicative) = + Nat.card (MonoidHom.range + g.hom.toAddMonoidHom.toMultiplicative) := + Nat.card_congr (moduleCatRangeEquivOfConjugate f g eX eY h) + +/-- Function exactness of morphisms in `ModuleCat ℤ` gives multiplicative +exactness after tagging the underlying additive groups as multiplicative. -/ +theorem mulExact_of_moduleCat_exact + {X Y Z : ModuleCat.{0} ℤ} (f : X ⟶ Y) (g : Y ⟶ Z) + (hexact : Function.Exact f g) : + Function.MulExact + f.hom.toAddMonoidHom.toMultiplicative + g.hom.toAddMonoidHom.toMultiplicative := by + intro y + constructor + · intro hy + change g y.toAdd = 0 at hy + rcases (hexact y.toAdd).1 hy with ⟨x, hx⟩ + refine ⟨Multiplicative.ofAdd x, ?_⟩ + apply Multiplicative.toAdd.injective + exact hx + · rintro ⟨x, rfl⟩ + change g (f x.toAdd) = 0 + exact (hexact (f x.toAdd)).2 ⟨x.toAdd, rfl⟩ + +/-- Exactness of a short complex in `ModuleCat ℤ` gives multiplicative +exactness of its two underlying homomorphisms. -/ +theorem mulExact_of_moduleCat_shortComplex_exact + {X Y Z : ModuleCat.{0} ℤ} (f : X ⟶ Y) (g : Y ⟶ Z) + (hzero : f ≫ g = 0) + (hexact : (ShortComplex.mk f g hzero).Exact) : + Function.MulExact + f.hom.toAddMonoidHom.toMultiplicative + g.hom.toAddMonoidHom.toMultiplicative := + mulExact_of_moduleCat_exact f g + ((ShortComplex.ShortExact.moduleCat_exact_iff_function_exact _).1 hexact) + +/-- For an exact pair of `ModuleCat ℤ` morphisms with finite middle term, +the cardinality of the middle term is the product of the two range +cardinalities. -/ +theorem moduleCat_card_eq_card_range_mul_card_range_of_exact + {X Y Z : ModuleCat.{0} ℤ} (f : X ⟶ Y) (g : Y ⟶ Z) + (hexact : Function.Exact f g) [Finite Y] : + Nat.card Y = + Nat.card (MonoidHom.range + f.hom.toAddMonoidHom.toMultiplicative) * + Nat.card (MonoidHom.range + g.hom.toAddMonoidHom.toMultiplicative) := by + exact + monoidHom_card_eq_card_range_mul_card_range_of_exact + f.hom.toAddMonoidHom.toMultiplicative + g.hom.toAddMonoidHom.toMultiplicative + (mulExact_of_moduleCat_exact f g hexact).monoidHom_ker_eq.symm + +/-- Finiteness transports from the target to the source of a +`ModuleCat ℤ` isomorphism. -/ +theorem finite_source_of_moduleIso + {X Y : ModuleCat.{0} ℤ} (e : X ≅ Y) [Finite Y] : + Finite X := by + let e' : X ≃ Y := ((forget (ModuleCat ℤ)).mapIso e).toEquiv + exact Finite.of_injective e' e'.injective + +/-- Finiteness transports from the source to the target of a +`ModuleCat ℤ` isomorphism. -/ +theorem finite_target_of_moduleIso + {X Y : ModuleCat.{0} ℤ} (e : X ≅ Y) [Finite X] : + Finite Y := by + let e' : Y ≃ X := ((forget (ModuleCat ℤ)).mapIso e.symm).toEquiv + exact Finite.of_injective e' e'.injective + +/-- A `ModuleCat ℤ` isomorphism with the additive form of a commutative +group identifies their cardinalities. -/ +theorem moduleCat_card_eq_of_iso + {X : ModuleCat.{0} ℤ} {T : Type} [CommGroup T] + (e : X ≅ ModuleCat.of ℤ (Additive T)) : + Nat.card X = Nat.card T := + Nat.card_congr ((forget (ModuleCat ℤ)).mapIso e).toEquiv + +end + +/-- The finite-cardinality identity supplied directly by mathlib's standard +two-periodic Tate exact sequence for a finite cyclic group. -/ +theorem herbrand_exact_cardinality_identity + [Group G] [Fintype G] + [CommGroup A] [CommGroup B] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] + (i : A →* B) (j : B →* C) + (hi : ∀ (g : G) (a : A), i (g • a) = g • i a) + (hj : ∀ (g : G) (b : B), j (g • b) = g • j b) + (hker : ∀ b : B, j b = 1 ↔ ∃ a : A, i a = b) + (hinj : Function.Injective i) + (hsurj : ∀ c : C, ∃ b : B, j b = c) + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) + [Finite (HerbrandH0 G A)] [Finite (HerbrandHMinusOne G A σ)] + [Finite (HerbrandH0 G B)] [Finite (HerbrandHMinusOne G B σ)] + [Finite (HerbrandH0 G C)] [Finite (HerbrandHMinusOne G C σ)] : + Nat.card (HerbrandH0 G B) * + Nat.card (HerbrandHMinusOne G A σ) * + Nat.card (HerbrandHMinusOne G C σ) = + Nat.card (HerbrandH0 G A) * + Nat.card (HerbrandH0 G C) * + Nat.card (HerbrandHMinusOne G B σ) := by + let : IsCyclic G := ⟨⟨σ, hgen⟩⟩ + let : CommGroup G := IsCyclic.commGroup + let S := periodicShortComplex σ i j hi hj hker + have hS : S.ShortExact := + periodicShortComplex_shortExact σ i j hi hj hker hinj hsurj + let eA4 : S.X₁.homology 4 ≅ + ModuleCat.of ℤ (Additive (HerbrandHMinusOne G A σ)) := by + exact periodicEvenHerbrandHMinusOneIso + (G := G) (A := A) (n := 4) σ hgen (⟨2, rfl⟩ : Even 4) + let eB4 : S.X₂.homology 4 ≅ + ModuleCat.of ℤ (Additive (HerbrandHMinusOne G B σ)) := by + exact periodicEvenHerbrandHMinusOneIso + (G := G) (A := B) (n := 4) σ hgen (⟨2, rfl⟩ : Even 4) + let eC4 : S.X₃.homology 4 ≅ + ModuleCat.of ℤ (Additive (HerbrandHMinusOne G C σ)) := by + exact periodicEvenHerbrandHMinusOneIso + (G := G) (A := C) (n := 4) σ hgen (⟨2, rfl⟩ : Even 4) + let eA3 : S.X₁.homology 3 ≅ + ModuleCat.of ℤ (Additive (HerbrandH0 G A)) := by + exact periodicOddHerbrandHZeroIso + (G := G) (A := A) (n := 3) σ hgen (⟨1, rfl⟩ : Odd 3) + let eB3 : S.X₂.homology 3 ≅ + ModuleCat.of ℤ (Additive (HerbrandH0 G B)) := by + exact periodicOddHerbrandHZeroIso + (G := G) (A := B) (n := 3) σ hgen (⟨1, rfl⟩ : Odd 3) + let eC3 : S.X₃.homology 3 ≅ + ModuleCat.of ℤ (Additive (HerbrandH0 G C)) := by + exact periodicOddHerbrandHZeroIso + (G := G) (A := C) (n := 3) σ hgen (⟨1, rfl⟩ : Odd 3) + let eA2 : S.X₁.homology 2 ≅ + ModuleCat.of ℤ (Additive (HerbrandHMinusOne G A σ)) := by + exact periodicEvenHerbrandHMinusOneIso + (G := G) (A := A) (n := 2) σ hgen (by simp : Even 2) + let eB2 : S.X₂.homology 2 ≅ + ModuleCat.of ℤ (Additive (HerbrandHMinusOne G B σ)) := by + exact periodicEvenHerbrandHMinusOneIso + (G := G) (A := B) (n := 2) σ hgen (by simp : Even 2) + let pA4 : S.X₁.homology 4 ≅ + (Rep.FiniteCyclicGroup.subCompNormHom + (Rep.ofMulDistribMulAction G A) σ).homology := by + exact periodicHomologyIsoEven + (Rep.ofMulDistribMulAction G A) σ (⟨2, rfl⟩ : Even 4) + let pB4 : S.X₂.homology 4 ≅ + (Rep.FiniteCyclicGroup.subCompNormHom + (Rep.ofMulDistribMulAction G B) σ).homology := by + exact periodicHomologyIsoEven + (Rep.ofMulDistribMulAction G B) σ (⟨2, rfl⟩ : Even 4) + let pA2 : S.X₁.homology 2 ≅ + (Rep.FiniteCyclicGroup.subCompNormHom + (Rep.ofMulDistribMulAction G A) σ).homology := by + exact periodicHomologyIsoEven + (Rep.ofMulDistribMulAction G A) σ (by simp : Even 2) + let pB2 : S.X₂.homology 2 ≅ + (Rep.FiniteCyclicGroup.subCompNormHom + (Rep.ofMulDistribMulAction G B) σ).homology := by + exact periodicHomologyIsoEven + (Rep.ofMulDistribMulAction G B) σ (by simp : Even 2) + let : Finite (S.X₁.homology 4) := finite_source_of_moduleIso eA4 + let : Finite (S.X₂.homology 4) := finite_source_of_moduleIso eB4 + let : Finite (S.X₃.homology 4) := finite_source_of_moduleIso eC4 + let : Finite (S.X₁.homology 3) := finite_source_of_moduleIso eA3 + let : Finite (S.X₂.homology 3) := finite_source_of_moduleIso eB3 + let : Finite (S.X₃.homology 3) := finite_source_of_moduleIso eC3 + let : Finite (S.X₁.homology 2) := finite_source_of_moduleIso eA2 + let f4 := HomologicalComplex.homologyMap S.f 4 + let g4 := HomologicalComplex.homologyMap S.g 4 + let δ43 := hS.δ 4 3 (by simp) + let f3 := HomologicalComplex.homologyMap S.f 3 + let g3 := HomologicalComplex.homologyMap S.g 3 + let δ32 := hS.δ 3 2 (by simp) + let f2 := HomologicalComplex.homologyMap S.f 2 + have hexactB4 : Function.Exact f4 g4 := + (ShortComplex.ShortExact.moduleCat_exact_iff_function_exact _).1 + (hS.homology_exact₂ 4) + have hexactC4 : Function.Exact g4 δ43 := + (ShortComplex.ShortExact.moduleCat_exact_iff_function_exact _).1 + (hS.homology_exact₃ 4 3 (by simp)) + have hexactA3 : Function.Exact δ43 f3 := + (ShortComplex.ShortExact.moduleCat_exact_iff_function_exact _).1 + (hS.homology_exact₁ 4 3 (by simp)) + have hexactB3 : Function.Exact f3 g3 := + (ShortComplex.ShortExact.moduleCat_exact_iff_function_exact _).1 + (hS.homology_exact₂ 3) + have hexactC3 : Function.Exact g3 δ32 := + (ShortComplex.ShortExact.moduleCat_exact_iff_function_exact _).1 + (hS.homology_exact₃ 3 2 (by simp)) + have hexactA2 : Function.Exact δ32 f2 := + (ShortComplex.ShortExact.moduleCat_exact_iff_function_exact _).1 + (hS.homology_exact₁ 3 2 (by simp)) + have hB4 := + moduleCat_card_eq_card_range_mul_card_range_of_exact f4 g4 hexactB4 + have hC4 := + moduleCat_card_eq_card_range_mul_card_range_of_exact g4 δ43 hexactC4 + have hA3 := + moduleCat_card_eq_card_range_mul_card_range_of_exact δ43 f3 hexactA3 + have hB3 := + moduleCat_card_eq_card_range_mul_card_range_of_exact f3 g3 hexactB3 + have hC3 := + moduleCat_card_eq_card_range_mul_card_range_of_exact g3 δ32 hexactC3 + have hA2 := + moduleCat_card_eq_card_range_mul_card_range_of_exact δ32 f2 hexactA2 + let q := ShortComplex.homologyMap (subCompNormMap σ i hi) + have hf4q : + Nat.card (MonoidHom.range + f4.hom.toAddMonoidHom.toMultiplicative) = + Nat.card (MonoidHom.range + q.hom.toAddMonoidHom.toMultiplicative) := by + apply moduleCatRangeCard_eq_of_conjugate f4 q pA4 pB4 + exact periodicHomologyIsoEven_naturality + σ (⟨2, rfl⟩ : Even 4) i hi + have hf2q : + Nat.card (MonoidHom.range + f2.hom.toAddMonoidHom.toMultiplicative) = + Nat.card (MonoidHom.range + q.hom.toAddMonoidHom.toMultiplicative) := by + apply moduleCatRangeCard_eq_of_conjugate f2 q pA2 pB2 + exact periodicHomologyIsoEven_naturality σ (by simp : Even 2) i hi + have hrange : + Nat.card (MonoidHom.range + f4.hom.toAddMonoidHom.toMultiplicative) = + Nat.card (MonoidHom.range + f2.hom.toAddMonoidHom.toMultiplicative) := + hf4q.trans hf2q.symm + have hperiodic : + Nat.card (S.X₂.homology 3) * + Nat.card (S.X₁.homology 2) * + Nat.card (S.X₃.homology 4) = + Nat.card (S.X₁.homology 3) * + Nat.card (S.X₃.homology 3) * + Nat.card (S.X₂.homology 4) := by + rw [hB3, hA2, hC4, hA3, hC3, hB4, ← hrange] + ac_rfl + have hcB4 := moduleCat_card_eq_of_iso eB4 + have hcC4 := moduleCat_card_eq_of_iso eC4 + have hcA3 := moduleCat_card_eq_of_iso eA3 + have hcB3 := moduleCat_card_eq_of_iso eB3 + have hcC3 := moduleCat_card_eq_of_iso eC3 + have hcA2 := moduleCat_card_eq_of_iso eA2 + calc + _ = Nat.card (S.X₂.homology 3) * + Nat.card (S.X₁.homology 2) * + Nat.card (S.X₃.homology 4) := by + rw [hcB3, hcA2, hcC4] + _ = Nat.card (S.X₁.homology 3) * + Nat.card (S.X₃.homology 3) * + Nat.card (S.X₂.homology 4) := + hperiodic + _ = _ := by + rw [hcA3, hcC3, hcB4] + +end Herbrand +end ProfiniteCohomology + +end +end CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Core.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Core.lean new file mode 100644 index 0000000000..1dd148c503 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Core.lean @@ -0,0 +1,130 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Cardinality + +/-! # Core -/ + +@[expose] public section +namespace CyclicCohomology + +/-! +# Low-degree Herbrand quotients + +The foundational constructions and their comparison with mathlib Tate +cohomology are split into focused modules. This public module retains the +Herbrand quotient and its multiplicativity result. +-/ + +noncomputable +section + +open scoped BigOperators + +namespace ProfiniteCohomology +namespace Herbrand + +universe uG uA uB uC + +variable {G : Type uG} {A : Type uA} {B : Type uB} {C : Type uC} +variable [Group G] [Fintype G] [CommGroup A] [CommGroup B] [CommGroup C] +variable [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] + +/-- The ratio of the cardinalities of the low-degree multiplicative Tate quotients. +`Nat.card` is zero on infinite types; the finite-cohomology theorems below state +explicit hypotheses ensuring that this ratio is the classical Herbrand quotient. -/ +noncomputable def herbrandQuotient (σ : G) + : ℚ := + (Nat.card (HerbrandH0 G A) : ℚ) / (Nat.card (HerbrandHMinusOne G A σ) : ℚ) + +/-- The Herbrand quotient is definitionally the ratio `#H⁰ / #H^{-1}`. -/ +theorem herbrandQuotient_eq_card_ratio (σ : G) + [Finite (HerbrandH0 G A)] [Finite (HerbrandHMinusOne G A σ)] : + herbrandQuotient (G := G) (A := A) σ = + (Nat.card (HerbrandH0 G A) : ℚ) / + (Nat.card (HerbrandHMinusOne G A σ) : ℚ) := + rfl + +/-- If the actual low-degree quotients have the same finite cardinality, then +the Herbrand quotient is `1`. -/ +theorem herbrandQuotient_eq_one_of_card_eq (σ : G) + [Finite (HerbrandH0 G A)] [Finite (HerbrandHMinusOne G A σ)] + (hcard : Nat.card (HerbrandH0 G A) = Nat.card (HerbrandHMinusOne G A σ)) : + herbrandQuotient (G := G) (A := A) σ = 1 := by + have hden : ((Nat.card (HerbrandHMinusOne G A σ) : ℚ) ≠ 0) := + Nat.cast_ne_zero.mpr (Finite.card_pos (α := HerbrandHMinusOne G A σ)).ne' + unfold herbrandQuotient + rw [hcard] + exact div_self hden + +/-- Herbrand-quotient theory Herbrand-quotient multiplicativity: the Herbrand quotient of a finite +cyclic module is `1`. -/ +theorem herbrandQuotient_finite_module_eq_one + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) [Finite A] : + herbrandQuotient (G := G) (A := A) σ = 1 := by + exact herbrandQuotient_eq_one_of_card_eq (G := G) (A := A) σ + (herbrand_finite_module_card_eq (G := G) (A := A) σ hgen) + +/-- Herbrand-quotient theory Herbrand-quotient multiplicativity: Herbrand quotient multiplicativity +for a short exact sequence of multiplicative `G`-modules, proved from the +standard two-periodic Tate complex and mathlib's homology long exact +sequence. -/ +theorem herbrandQuotient_exact_multiplicative + {G A B C : Type} + [Group G] [Fintype G] + [CommGroup A] [CommGroup B] [CommGroup C] + [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] + (i : A →* B) (j : B →* C) + (hi : ∀ (g : G) (a : A), i (g • a) = g • i a) + (hj : ∀ (g : G) (b : B), j (g • b) = g • j b) + (hker : ∀ b : B, j b = 1 ↔ ∃ a : A, i a = b) + (hinj : Function.Injective i) + (hsurj : ∀ c : C, ∃ b : B, j b = c) (σ : G) + (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) + [Finite (HerbrandH0 G A)] [Finite (HerbrandHMinusOne G A σ)] + [Finite (HerbrandH0 G B)] [Finite (HerbrandHMinusOne G B σ)] + [Finite (HerbrandH0 G C)] [Finite (HerbrandHMinusOne G C σ)] : + herbrandQuotient (G := G) (A := B) σ = + herbrandQuotient (G := G) (A := A) σ * + herbrandQuotient (G := G) (A := C) σ := by + have hcard := + herbrand_exact_cardinality_identity + (G := G) (A := A) (B := B) (C := C) + i j hi hj hker hinj hsurj σ hgen + have hA : + ((Nat.card (HerbrandHMinusOne G A σ) : ℚ) ≠ 0) := + Nat.cast_ne_zero.mpr + (Finite.card_pos (α := HerbrandHMinusOne G A σ)).ne' + have hB : + ((Nat.card (HerbrandHMinusOne G B σ) : ℚ) ≠ 0) := + Nat.cast_ne_zero.mpr + (Finite.card_pos (α := HerbrandHMinusOne G B σ)).ne' + have hC : + ((Nat.card (HerbrandHMinusOne G C σ) : ℚ) ≠ 0) := + Nat.cast_ne_zero.mpr + (Finite.card_pos (α := HerbrandHMinusOne G C σ)).ne' + unfold herbrandQuotient + field_simp [hA, hB, hC] + have hcardQ : + (Nat.card (HerbrandH0 G B) : ℚ) * + Nat.card (HerbrandHMinusOne G A σ) * + Nat.card (HerbrandHMinusOne G C σ) = + Nat.card (HerbrandH0 G A) * + Nat.card (HerbrandH0 G C) * + Nat.card (HerbrandHMinusOne G B σ) := by + exact_mod_cast hcard + simpa [mul_assoc, mul_left_comm, mul_comm] using hcardQ + +end Herbrand +end ProfiniteCohomology + +end +end CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/EquivariantEquiv.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/EquivariantEquiv.lean new file mode 100644 index 0000000000..0c1a7c8a77 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/EquivariantEquiv.lean @@ -0,0 +1,320 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Induced +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness +public import Mathlib.SetTheory.Cardinal.Finite +/-! +# Low-degree Tate cohomology under equivariant equivalences + +An equivariant multiplicative equivalence identifies fixed elements, norm +kernels, norm images, and augmentation images. Consequently it induces +equivalences on the concrete low-degree Tate cohomology groups and preserves +the Herbrand quotient. + +These transport results let calculations made on field units or local +coordinates be applied to their actual images inside idele groups without +introducing comparison assumptions. +-/ + +@[expose] public section + +noncomputable +section + +namespace CyclicCohomology + +open CyclicCohomology.ProfiniteCohomology.Herbrand + +universe uG uA uB + +variable {G : Type uG} {A : Type uA} {B : Type uB} + [Group G] [Fintype G] + [CommGroup A] [CommGroup B] + [MulDistribMulAction G A] + [MulDistribMulAction G B] + +/-- An equivariant multiplicative equivalence commutes with the finite +group norm. -/ +theorem equivariantMulEquiv_map_tateNorm + (e : A ≃* B) + (he : ∀ (g : G) (a : A), + e (g • a) = g • e a) + (a : A) : + e (tateNorm G A a) = + tateNorm G B (e a) := by + simpa using + map_tateNorm + (G := G) (A := A) (B := B) + e.toMonoidHom + (fun g x ↦ by simpa using he g x) a + +omit [Fintype G] in +/-- An equivariant multiplicative equivalence commutes with the +augmentation operator. -/ +theorem equivariantMulEquiv_map_sigmaMinusOne + (e : A ≃* B) + (he : ∀ (g : G) (a : A), + e (g • a) = g • e a) + (σ : G) (a : A) : + e (sigmaMinusOne G A σ a) = + sigmaMinusOne G B σ (e a) := by + simpa using + map_sigmaMinusOne + (G := G) (A := A) (B := B) + e.toMonoidHom + (fun g x ↦ by simpa using he g x) σ a + +/-- An equivariant multiplicative equivalence restricted to fixed +subgroups. -/ +noncomputable def fixedSubgroupEquivariantMulEquiv + (e : A ≃* B) + (he : ∀ (g : G) (a : A), + e (g • a) = g • e a) : + fixedSubgroup G A ≃* fixedSubgroup G B where + toFun a := + ⟨e a.1, fun g ↦ by + rw [← he g a.1, a.2 g]⟩ + invFun b := + ⟨e.symm b.1, fun g ↦ by + rw [← mulEquiv_symm_commutes_smul e he, b.2 g]⟩ + left_inv a := by + apply Subtype.ext + exact e.symm_apply_apply a.1 + right_inv b := by + apply Subtype.ext + exact e.apply_symm_apply b.1 + map_mul' _ _ := by + apply Subtype.ext + exact e.map_mul _ _ + +/-- An equivariant multiplicative equivalence restricted to norm +kernels. -/ +noncomputable def normKernelEquivariantMulEquiv + (e : A ≃* B) + (he : ∀ (g : G) (a : A), + e (g • a) = g • e a) : + normKernelSubgroup G A ≃* + normKernelSubgroup G B where + toFun a := + ⟨e a.1, by + change tateNorm G B (e a.1) = 1 + calc + tateNorm G B (e a.1) = + e (tateNorm G A a.1) := + (equivariantMulEquiv_map_tateNorm + e he a.1).symm + _ = e 1 := congrArg e a.2 + _ = 1 := e.map_one⟩ + invFun b := + ⟨e.symm b.1, by + change tateNorm G A (e.symm b.1) = 1 + apply e.injective + calc + e (tateNorm G A (e.symm b.1)) = + tateNorm G B (e (e.symm b.1)) := + equivariantMulEquiv_map_tateNorm + e he (e.symm b.1) + _ = tateNorm G B b.1 := by + rw [e.apply_symm_apply] + _ = 1 := b.2 + _ = e 1 := e.map_one.symm⟩ + left_inv a := by + apply Subtype.ext + exact e.symm_apply_apply a.1 + right_inv b := by + apply Subtype.ext + exact e.apply_symm_apply b.1 + map_mul' _ _ := by + apply Subtype.ext + exact e.map_mul _ _ + +/-- An equivariant multiplicative equivalence induces an equivalence on +degree-zero Tate cohomology. -/ +noncomputable def herbrandH0EquivariantMulEquiv + (e : A ≃* B) + (he : ∀ (g : G) (a : A), + e (g • a) = g • e a) : + HerbrandH0 G A ≃* HerbrandH0 G B := by + let f := fixedSubgroupEquivariantMulEquiv e he + let N := + (tateNormSubgroup G A).subgroupOf + (fixedSubgroup G A) + let M := + (tateNormSubgroup G B).subgroupOf + (fixedSubgroup G B) + exact quotientMulEquivOfSplit N M + f.toMonoidHom f.symm.toMonoidHom + (fun y ↦ f.apply_symm_apply y) + (fun x hx ↦ by + rw [Subgroup.mem_subgroupOf] at hx ⊢ + rcases hx with ⟨a, ha⟩ + refine ⟨e a, ?_⟩ + change tateNorm G B (e a) = e x.1 + calc + tateNorm G B (e a) = + e (tateNorm G A a) := + (equivariantMulEquiv_map_tateNorm + e he a).symm + _ = e x.1 := congrArg e ha) + (fun y hy ↦ by + rw [Subgroup.mem_subgroupOf] at hy ⊢ + rcases hy with ⟨b, hb⟩ + refine ⟨e.symm b, ?_⟩ + apply e.injective + change + e (tateNorm G A (e.symm b)) = + e (e.symm y.1) + calc + e (tateNorm G A (e.symm b)) = + tateNorm G B (e (e.symm b)) := + equivariantMulEquiv_map_tateNorm + e he (e.symm b) + _ = tateNorm G B b := by + rw [e.apply_symm_apply] + _ = y.1 := hb + _ = e (e.symm y.1) := + (e.apply_symm_apply y.1).symm) + (fun x hx ↦ by + have hx1 : x = 1 := by + apply f.injective + simpa [f] using hx + rw [hx1] + exact N.one_mem) + +@[simp] +theorem herbrandH0EquivariantMulEquiv_mk + (e : A ≃* B) + (he : ∀ (g : G) (a : A), + e (g • a) = g • e a) + (a : fixedSubgroup G A) : + herbrandH0EquivariantMulEquiv e he (HerbrandH0.mk a) = + HerbrandH0.mk (fixedSubgroupEquivariantMulEquiv e he a) := by + rfl + +/-- An equivariant multiplicative equivalence induces an equivalence on +degree-minus-one Tate cohomology. -/ +noncomputable def herbrandHMinusOneEquivariantMulEquiv + (e : A ≃* B) + (he : ∀ (g : G) (a : A), + e (g • a) = g • e a) + (σ : G) : + HerbrandHMinusOne G A σ ≃* + HerbrandHMinusOne G B σ := by + let f := normKernelEquivariantMulEquiv e he + let N := + (augmentationSubgroup G A σ).subgroupOf + (normKernelSubgroup G A) + let M := + (augmentationSubgroup G B σ).subgroupOf + (normKernelSubgroup G B) + exact quotientMulEquivOfSplit N M + f.toMonoidHom f.symm.toMonoidHom + (fun y ↦ f.apply_symm_apply y) + (fun x hx ↦ by + rw [Subgroup.mem_subgroupOf] at hx ⊢ + rcases hx with ⟨a, ha⟩ + refine ⟨e a, ?_⟩ + change sigmaMinusOne G B σ (e a) = e x.1 + calc + sigmaMinusOne G B σ (e a) = + e (sigmaMinusOne G A σ a) := + (equivariantMulEquiv_map_sigmaMinusOne + e he σ a).symm + _ = e x.1 := congrArg e ha) + (fun y hy ↦ by + rw [Subgroup.mem_subgroupOf] at hy ⊢ + rcases hy with ⟨b, hb⟩ + refine ⟨e.symm b, ?_⟩ + apply e.injective + change + e (sigmaMinusOne G A σ (e.symm b)) = + e (e.symm y.1) + calc + e (sigmaMinusOne G A σ (e.symm b)) = + sigmaMinusOne G B σ (e (e.symm b)) := + equivariantMulEquiv_map_sigmaMinusOne + e he σ (e.symm b) + _ = sigmaMinusOne G B σ b := by + rw [e.apply_symm_apply] + _ = y.1 := hb + _ = e (e.symm y.1) := + (e.apply_symm_apply y.1).symm) + (fun x hx ↦ by + have hx1 : x = 1 := by + apply f.injective + simpa [f] using hx + rw [hx1] + exact N.one_mem) + +/-- Finiteness of `H⁰` transports through an equivariant +multiplicative equivalence. -/ +theorem herbrandH0Finite_of_equivariantMulEquiv + (e : A ≃* B) + (he : ∀ (g : G) (a : A), + e (g • a) = g • e a) + [Finite (HerbrandH0 G A)] : + Finite (HerbrandH0 G B) := + Finite.of_equiv + (HerbrandH0 G A) + (herbrandH0EquivariantMulEquiv e he).toEquiv + +/-- Finiteness of `H⁻¹` transports through an equivariant +multiplicative equivalence. -/ +theorem herbrandHMinusOneFinite_of_equivariantMulEquiv + (e : A ≃* B) + (he : ∀ (g : G) (a : A), + e (g • a) = g • e a) + (σ : G) + [Finite (HerbrandHMinusOne G A σ)] : + Finite (HerbrandHMinusOne G B σ) := + Finite.of_equiv + (HerbrandHMinusOne G A σ) + (herbrandHMinusOneEquivariantMulEquiv + e he σ).toEquiv + +/-- Herbrand quotients are invariant under equivariant multiplicative +equivalence. -/ +theorem herbrandQuotient_eq_of_equivariantMulEquiv + (e : A ≃* B) + (he : ∀ (g : G) (a : A), + e (g • a) = g • e a) + (σ : G) + [Finite (HerbrandH0 G A)] + [Finite (HerbrandHMinusOne G A σ)] : + letI _h0B : Finite (HerbrandH0 G B) := + herbrandH0Finite_of_equivariantMulEquiv e he + letI _hMinusOneB : + Finite (HerbrandHMinusOne G B σ) := + herbrandHMinusOneFinite_of_equivariantMulEquiv + e he σ + herbrandQuotient (G := G) (A := A) σ = + herbrandQuotient (G := G) (A := B) σ := by + let h0B : Finite (HerbrandH0 G B) := + herbrandH0Finite_of_equivariantMulEquiv e he + let hMinusOneB : + Finite (HerbrandHMinusOne G B σ) := + herbrandHMinusOneFinite_of_equivariantMulEquiv + e he σ + have h0Card : + Nat.card (HerbrandH0 G A) = + Nat.card (HerbrandH0 G B) := by + exact Nat.card_congr + (herbrandH0EquivariantMulEquiv e he).toEquiv + have hMinusOneCard : + Nat.card (HerbrandHMinusOne G A σ) = + Nat.card + (HerbrandHMinusOne G B σ) := by + exact Nat.card_congr + (herbrandHMinusOneEquivariantMulEquiv + e he σ).toEquiv + rw [herbrandQuotient_eq_card_ratio, + herbrandQuotient_eq_card_ratio, + h0Card, hMinusOneCard] + +end CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Index.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Index.lean new file mode 100644 index 0000000000..68ddf2d1c5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Index.lean @@ -0,0 +1,127 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness +/-! +# Cardinal consequences of a Herbrand quotient + +This file isolates the elementary cardinal arithmetic at the end of the +low-degree Herbrand quotient calculation. If a finite low-degree Tate quotient has Herbrand +quotient equal to a natural number `n`, then its degree-zero cardinality is +`n` times its negative-first cardinality. In particular the degree-zero +cardinality is at least `n`. +-/ + +@[expose] public section + +noncomputable +section + +namespace CyclicCohomology + +open CyclicCohomology.ProfiniteCohomology.Herbrand + +universe uG uA + +variable {G : Type uG} {A : Type uA} + [Group G] [Fintype G] + [CommGroup A] [MulDistribMulAction G A] + +/-- Clearing the nonzero denominator in a Herbrand quotient whose value is +a natural number. -/ +theorem herbrandH0_card_eq_mul_herbrandHMinusOne_card + (σ : G) (n : ℕ) + [Finite (HerbrandH0 G A)] + [Finite (HerbrandHMinusOne G A σ)] + (hquotient : + herbrandQuotient (G := G) (A := A) σ = n) : + Nat.card (HerbrandH0 G A) = + n * Nat.card + (HerbrandHMinusOne G A σ) := by + rw [herbrandQuotient_eq_card_ratio] at hquotient + have hden : + ((Nat.card + (HerbrandHMinusOne G A σ) : ℚ) ≠ 0) := + Nat.cast_ne_zero.mpr + (Finite.card_pos + (α := HerbrandHMinusOne G A σ)).ne' + have hrat : + (Nat.card (HerbrandH0 G A) : ℚ) = + (n : ℚ) * + Nat.card + (HerbrandHMinusOne G A σ) := + (div_eq_iff hden).mp hquotient + exact_mod_cast hrat + +/-- Cardinal-arithmetic step for low-degree Herbrand cohomology: a natural-valued Herbrand quotient +is a lower bound for the degree-zero Tate quotient. -/ +theorem le_herbrandH0_card_of_herbrandQuotient_eq_nat + (σ : G) (n : ℕ) + [Finite (HerbrandH0 G A)] + [Finite (HerbrandHMinusOne G A σ)] + (hquotient : + herbrandQuotient (G := G) (A := A) σ = n) : + n ≤ Nat.card (HerbrandH0 G A) := by + rw [herbrandH0_card_eq_mul_herbrandHMinusOne_card + σ n hquotient] + calc + n = n * 1 := by simp + _ ≤ n * + Nat.card + (HerbrandHMinusOne G A σ) := + Nat.mul_le_mul_left n + (Finite.card_pos + (α := HerbrandHMinusOne G A σ)) + +/-- If the degree-zero cardinality is also bounded above by the natural +value of the Herbrand quotient, both low-degree cardinalities are forced: +`#H⁰ = n` and `#H⁻¹ = 1`. -/ +theorem lowDegree_card_eq_of_herbrandQuotient_eq_nat_of_le + (σ : G) (n : ℕ) (hn : 0 < n) + [Finite (HerbrandH0 G A)] + [Finite (HerbrandHMinusOne G A σ)] + (hquotient : + herbrandQuotient (G := G) (A := A) σ = n) + (hle : Nat.card (HerbrandH0 G A) ≤ n) : + Nat.card (HerbrandH0 G A) = n ∧ + Nat.card (HerbrandHMinusOne G A σ) = 1 := by + let a := Nat.card (HerbrandH0 G A) + let b := Nat.card (HerbrandHMinusOne G A σ) + have hmul : a = n * b := + herbrandH0_card_eq_mul_herbrandHMinusOne_card + σ n hquotient + have hb : 1 ≤ b := + Finite.card_pos + (α := HerbrandHMinusOne G A σ) + have hnle : n ≤ a := by + rw [hmul] + simpa using Nat.mul_le_mul_left n hb + have ha : a = n := + Nat.le_antisymm hle hnle + refine ⟨ha, ?_⟩ + have hcancel : n * b = n * 1 := by + rw [← hmul, ha, mul_one] + exact Nat.eq_of_mul_eq_mul_left hn hcancel + +/-- Subsingleton form of the negative-first conclusion. -/ +theorem herbrandHMinusOne_subsingleton_of_herbrandQuotient_eq_nat_of_le + (σ : G) (n : ℕ) (hn : 0 < n) + [Finite (HerbrandH0 G A)] + [Finite (HerbrandHMinusOne G A σ)] + (hquotient : + herbrandQuotient (G := G) (A := A) σ = n) + (hle : Nat.card (HerbrandH0 G A) ≤ n) : + Subsingleton (HerbrandHMinusOne G A σ) := by + have hcard : + Nat.card (HerbrandHMinusOne G A σ) = 1 := by + exact + (lowDegree_card_eq_of_herbrandQuotient_eq_nat_of_le + σ n hn hquotient hle).2 + exact (Nat.card_eq_one_iff_unique.mp hcard).1 + +end CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Product.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Product.lean new file mode 100644 index 0000000000..cf970f72c0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Product.lean @@ -0,0 +1,339 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Induced +/-! +# Low-degree Tate cohomology of products + +This file proves that multiplicative Tate `H⁰` and `H⁻¹` commute with +dependent products, giving the product step for low-degree Herbrand quotients. +-/ + +@[expose] public section + +noncomputable +section + +namespace CyclicCohomology + +open CyclicCohomology.ProfiniteCohomology.Herbrand + +universe uG uι uA + +/-- The componentwise multiplicative action on a dependent product. -/ +@[reducible] +def piMulDistribMulAction + (G : Type uG) [Group G] + {ι : Type uι} (A : ι → Type uA) + [∀ i, CommGroup (A i)] + [∀ i, MulDistribMulAction G (A i)] : + MulDistribMulAction G (∀ i, A i) where + smul g x i := g • x i + one_smul x := by + funext i + exact one_smul G (x i) + mul_smul g h x := by + funext i + exact mul_smul g h (x i) + smul_one g := by + funext i + exact MulDistribMulAction.smul_one g + smul_mul g x y := by + funext i + exact MulDistribMulAction.smul_mul g (x i) (y i) + +/-- The pointwise product of a family of subgroups. -/ +def piSubgroup (ι : Type uι) (A : ι → Type uA) + [∀ i, CommGroup (A i)] + (N : ∀ i, Subgroup (A i)) : + Subgroup (∀ i, A i) where + carrier := {x | ∀ i, x i ∈ N i} + one_mem' i := (N i).one_mem + mul_mem' hx hy i := (N i).mul_mem (hx i) (hy i) + inv_mem' hx i := (N i).inv_mem (hx i) + +@[simp] +theorem mem_piSubgroup_iff + (ι : Type uι) (A : ι → Type uA) + [∀ i, CommGroup (A i)] + (N : ∀ i, Subgroup (A i)) + (x : ∀ i, A i) : + x ∈ piSubgroup ι A N ↔ + ∀ i, x i ∈ N i := + Iff.rfl + +/-- The componentwise quotient map. -/ +noncomputable def piQuotientMap + (ι : Type uι) (A : ι → Type uA) + [∀ i, CommGroup (A i)] + (N : ∀ i, Subgroup (A i)) : + (∀ i, A i) →* ∀ i, A i ⧸ N i where + toFun x i := QuotientGroup.mk' (N i) (x i) + map_one' := by + ext i + exact (QuotientGroup.mk' (N i)).map_one + map_mul' x y := by + ext i + exact (QuotientGroup.mk' (N i)).map_mul + (x i) (y i) + +@[simp] +theorem piQuotientMap_apply + (ι : Type uι) (A : ι → Type uA) + [∀ i, CommGroup (A i)] + (N : ∀ i, Subgroup (A i)) + (x : ∀ i, A i) (i : ι) : + piQuotientMap ι A N x i = + QuotientGroup.mk' (N i) (x i) := + rfl + +theorem ker_piQuotientMap + (ι : Type uι) (A : ι → Type uA) + [∀ i, CommGroup (A i)] + (N : ∀ i, Subgroup (A i)) : + (piQuotientMap ι A N).ker = + piSubgroup ι A N := by + ext x + constructor + · intro hx i + have hmap : + piQuotientMap ι A N x = 1 := + MonoidHom.mem_ker.mp hx + have hi : QuotientGroup.mk' (N i) (x i) = 1 := + (piQuotientMap_apply ι A N x i).symm.trans (congrFun hmap i) + exact + (QuotientGroup.eq_one_iff + (N := N i) (x := x i)).mp hi + · intro hx + exact MonoidHom.mem_ker.mpr <| by + ext i + exact + (QuotientGroup.eq_one_iff + (N := N i) (x := x i)).mpr (hx i) + +theorem piQuotientMap_surjective + (ι : Type uι) (A : ι → Type uA) + [∀ i, CommGroup (A i)] + (N : ∀ i, Subgroup (A i)) : + Function.Surjective (piQuotientMap ι A N) := by + intro y + choose x hx using fun i => + QuotientGroup.mk'_surjective (N i) (y i) + refine ⟨x, ?_⟩ + ext i + exact hx i + +/-- The quotient of a dependent product by the pointwise subgroup is the +dependent product of the quotients. -/ +noncomputable def piQuotientEquiv + (ι : Type uι) (A : ι → Type uA) + [∀ i, CommGroup (A i)] + (N : ∀ i, Subgroup (A i)) : + (∀ i, A i) ⧸ piSubgroup ι A N ≃* + ∀ i, A i ⧸ N i := + (QuotientGroup.quotientMulEquivOfEq + (ker_piQuotientMap ι A N).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (piQuotientMap ι A N) + (piQuotientMap_surjective ι A N)) + +section TateProducts + +variable {G : Type uG} [Group G] [Fintype G] +variable {ι : Type uι} (A : ι → Type uA) +variable [∀ i, CommGroup (A i)] +variable [∀ i, MulDistribMulAction G (A i)] + +/-- The componentwise multiplicative action on a dependent product distributes over +multiplication. -/ +local instance fixedPiMulDistribMulAction : + MulDistribMulAction G (∀ i, A i) := + piMulDistribMulAction G A + +/-- Fixed points of a product are products of fixed points. -/ +def fixedPiEquiv : + fixedSubgroup G (∀ i, A i) ≃* + ∀ i, fixedSubgroup G (A i) where + toFun x i := ⟨x.1 i, fun g ↦ congrFun (x.2 g) i⟩ + invFun x := ⟨fun i ↦ (x i).1, fun g ↦ by + funext i + exact (x i).2 g⟩ + left_inv _ := rfl + right_inv _ := rfl + map_mul' _ _ := rfl + +omit [Fintype G] in +@[simp] +theorem fixedPiEquiv_apply_coe + (x : fixedSubgroup G (∀ i, A i)) + (i : ι) : + ((fixedPiEquiv (G := G) A x i : A i)) = + x.1 i := + rfl + +/-- Norm kernels of a product are products of norm kernels. -/ +def normKernelPiEquiv : + normKernelSubgroup G (∀ i, A i) ≃* + ∀ i, normKernelSubgroup G (A i) where + toFun x i := ⟨x.1 i, by + change tateNorm G (A i) (x.1 i) = 1 + have hi := congrFun x.2 i + simpa only [tateNormHom_apply, tateNorm, Finset.prod_apply, + Pi.smul_apply, Pi.one_apply] using hi⟩ + invFun x := ⟨fun i ↦ (x i).1, by + funext i + change + (tateNorm G (∀ i, A i) + (fun i ↦ (x i).1)) i = 1 + have hi := (x i).2 + change tateNormHom (G := G) (A := A i) (x i).1 = 1 at hi + rw [tateNormHom_apply] at hi + simpa only [tateNorm, Finset.prod_apply, + Pi.smul_apply] using hi⟩ + left_inv _ := rfl + right_inv _ := rfl + map_mul' _ _ := rfl + +@[simp] +theorem normKernelPiEquiv_apply_coe + (x : normKernelSubgroup G (∀ i, A i)) + (i : ι) : + ((normKernelPiEquiv (G := G) A x i : A i)) = + x.1 i := + rfl + +/-- Tate `H⁰` commutes with dependent products. -/ +noncomputable def herbrandH0PiEquiv : + HerbrandH0 G (∀ i, A i) ≃* + ∀ i, HerbrandH0 G (A i) := by + let e : + fixedSubgroup G (∀ i, A i) ≃* + ∀ i, fixedSubgroup G (A i) := + fixedPiEquiv (G := G) A + let N := + (tateNormSubgroup G (∀ i, A i)).subgroupOf + (fixedSubgroup G (∀ i, A i)) + let M := + piSubgroup ι + (fun i ↦ fixedSubgroup G (A i)) + (fun i ↦ + (tateNormSubgroup G (A i)).subgroupOf + (fixedSubgroup G (A i))) + let q : + fixedSubgroup G (∀ i, A i) ⧸ N ≃* + (∀ i, fixedSubgroup G (A i)) ⧸ M := + quotientMulEquivOfSplit + N M e.toMonoidHom e.symm.toMonoidHom + (fun y ↦ e.apply_symm_apply y) + (fun x hx ↦ by + rw [Subgroup.mem_subgroupOf] at hx + change ∀ i, _ at ⊢ + rcases hx with ⟨a, ha⟩ + intro i + rw [Subgroup.mem_subgroupOf] + refine ⟨a i, ?_⟩ + have hi := congrFun ha i + simpa [tateNormHom_apply, tateNorm, e, fixedPiEquiv] using hi) + (fun y hy ↦ by + change ∀ i, _ at hy + have hy' : + ∀ i, ∃ a : A i, + tateNorm G (A i) a = (y i).1 := by + intro i + have hyi : + (y i : A i) ∈ tateNormSubgroup G (A i) := by + simpa only [Subgroup.mem_subgroupOf] using hy i + rcases hyi with ⟨a, ha⟩ + exact ⟨a, by simpa only [tateNormHom_apply] using ha⟩ + choose a ha using hy' + rw [Subgroup.mem_subgroupOf] + refine ⟨fun i ↦ a i, ?_⟩ + funext i + have hi := ha i + simpa [tateNormHom_apply, e, fixedPiEquiv, tateNorm] using hi) + (fun x hx ↦ by + have hx1 : x = 1 := by + apply e.injective + simpa [e] using hx + rw [hx1] + exact N.one_mem) + exact q.trans + (piQuotientEquiv ι + (fun i ↦ fixedSubgroup G (A i)) + (fun i ↦ + (tateNormSubgroup G (A i)).subgroupOf + (fixedSubgroup G (A i)))) + +/-- Tate `H⁻¹` commutes with dependent products. -/ +noncomputable def herbrandHMinusOnePiEquiv (σ : G) : + HerbrandHMinusOne G (∀ i, A i) σ ≃* + ∀ i, HerbrandHMinusOne G (A i) σ := by + let e : + normKernelSubgroup G (∀ i, A i) ≃* + ∀ i, normKernelSubgroup G (A i) := + normKernelPiEquiv (G := G) A + let N := + (augmentationSubgroup G (∀ i, A i) σ).subgroupOf + (normKernelSubgroup G (∀ i, A i)) + let M := + piSubgroup ι + (fun i ↦ normKernelSubgroup G (A i)) + (fun i ↦ + (augmentationSubgroup G (A i) σ).subgroupOf + (normKernelSubgroup G (A i))) + let q : + normKernelSubgroup G (∀ i, A i) ⧸ N ≃* + (∀ i, normKernelSubgroup G (A i)) ⧸ M := + quotientMulEquivOfSplit + N M e.toMonoidHom e.symm.toMonoidHom + (fun y ↦ e.apply_symm_apply y) + (fun x hx ↦ by + rw [Subgroup.mem_subgroupOf] at hx + change ∀ i, _ at ⊢ + rcases hx with ⟨a, ha⟩ + intro i + rw [Subgroup.mem_subgroupOf] + refine ⟨a i, ?_⟩ + have hi := congrFun ha i + simpa [sigmaMinusOneHom_apply, sigmaMinusOne, e, + normKernelPiEquiv] using hi) + (fun y hy ↦ by + change ∀ i, _ at hy + have hy' : + ∀ i, ∃ a : A i, + sigmaMinusOne G (A i) σ a = + (y i).1 := by + intro i + have hyi : + (y i : A i) ∈ augmentationSubgroup G (A i) σ := by + simpa only [Subgroup.mem_subgroupOf] using hy i + rcases hyi with ⟨a, ha⟩ + exact ⟨a, by simpa only [sigmaMinusOneHom_apply] using ha⟩ + choose a ha using hy' + rw [Subgroup.mem_subgroupOf] + refine ⟨fun i ↦ a i, ?_⟩ + funext i + have hi := ha i + simpa [sigmaMinusOneHom_apply, e, normKernelPiEquiv, + sigmaMinusOne] using hi) + (fun x hx ↦ by + have hx1 : x = 1 := by + apply e.injective + simpa [e] using hx + rw [hx1] + exact N.one_mem) + exact q.trans + (piQuotientEquiv ι + (fun i ↦ normKernelSubgroup G (A i)) + (fun i ↦ + (augmentationSubgroup G (A i) σ).subgroupOf + (normKernelSubgroup G (A i)))) + +end TateProducts + +end CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/TateComparison.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/TateComparison.lean new file mode 100644 index 0000000000..85b61a4bad --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/TateComparison.lean @@ -0,0 +1,379 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison +/-! Comparisons between arithmetic Herbrand quotient presentations and mathlib Tate cohomology. -/ + +@[expose] public section + +open CategoryTheory + +namespace CyclicCohomology.ProfiniteCohomology.Herbrand + +noncomputable +section + +universe u w + +private theorem repExact_of_hom_exact {k G : Type u} [CommRing k] [Group G] + (S : ShortComplex (Rep.{w} k G)) + (h : ∀ b : S.X₂, S.g.hom b = 0 → ∃ a : S.X₁, S.f.hom a = b) : + S.Exact := + (forget₂ (Rep.{w} k G) (ModuleCat.{w} k)).reflects_exact_of_faithful _ <| + (ShortComplex.moduleCat_exact_iff _).2 h + +variable {G A B C : Type} +variable [Group G] [Fintype G] [CommGroup A] [CommGroup B] [CommGroup C] +variable [MulDistribMulAction G A] [MulDistribMulAction G B] + [MulDistribMulAction G C] + +/-- An equivariant homomorphism of multiplicative `G`-modules, regarded as +the corresponding morphism between mathlib's additive `ℤ`-representations. -/ +def equivariantRepHom (f : A →* B) + (hf : ∀ (g : G) (a : A), f (g • a) = g • f a) : + Rep.ofMulDistribMulAction G A ⟶ Rep.ofMulDistribMulAction G B := + Rep.ofHom <| + (MonoidHom.toAdditive f).toIntLinearMap.intertwiningMap_of_isIntertwiningMap + (Rep.ofMulDistribMulAction G A).ρ + (Rep.ofMulDistribMulAction G B).ρ <| by + intro g a + apply Additive.ofMul.injective + exact hf g a.toMul + +omit [Fintype G] in +@[simp] +theorem equivariantRepHom_apply (f : A →* B) + (hf : ∀ (g : G) (a : A), f (g • a) = g • f a) (a : Additive A) : + equivariantRepHom f hf a = Additive.ofMul (f a.toMul) := + rfl + +/-- The short complex of mathlib representations associated to two +equivariant multiplicative homomorphisms whose composite is trivial. -/ +def equivariantShortComplex + (i : A →* B) (j : B →* C) + (hi : ∀ (g : G) (a : A), i (g • a) = g • i a) + (hj : ∀ (g : G) (b : B), j (g • b) = g • j b) + (hker : ∀ b : B, j b = 1 ↔ ∃ a : A, i a = b) : + ShortComplex (Rep ℤ G) := + ShortComplex.mk (equivariantRepHom i hi) (equivariantRepHom j hj) <| by + apply Rep.hom_ext + ext a + change Additive.ofMul (j (i a.toMul)) = 0 + apply Additive.ofMul.injective + exact (hker (i a.toMul)).2 ⟨a.toMul, rfl⟩ + +omit [Fintype G] in +theorem equivariantShortComplex_shortExact + (i : A →* B) (j : B →* C) + (hi : ∀ (g : G) (a : A), i (g • a) = g • i a) + (hj : ∀ (g : G) (b : B), j (g • b) = g • j b) + (hker : ∀ b : B, j b = 1 ↔ ∃ a : A, i a = b) + (hinj : Function.Injective i) (hsurj : Function.Surjective j) : + (equivariantShortComplex i j hi hj hker).ShortExact := by + refine + { exact := repExact_of_hom_exact _ ?_ + mono_f := (Rep.mono_iff_injective _).2 ?_ + epi_g := (Rep.epi_iff_surjective _).2 ?_ } + · intro b hb + change Additive.ofMul (j b.toMul) = 0 at hb + have hb' : j b.toMul = 1 := Additive.ofMul.injective hb + rcases (hker b.toMul).1 hb' with ⟨a, ha⟩ + refine ⟨Additive.ofMul a, ?_⟩ + change Additive.ofMul (i a) = b + apply Additive.toMul.injective + exact ha + · intro a a' h + change Additive.ofMul (i a.toMul) = Additive.ofMul (i a'.toMul) at h + apply Additive.toMul.injective + apply hinj + exact Additive.ofMul.injective h + · intro c + rcases hsurj c.toMul with ⟨b, hb⟩ + refine ⟨Additive.ofMul b, ?_⟩ + change Additive.ofMul (j b) = c + apply Additive.toMul.injective + exact hb + +private theorem repNorm_toMul (a : Additive A) : + Additive.toMul + ((Rep.ofMulDistribMulAction G A).ρ.norm a) = + tateNorm G A a.toMul := by + unfold Rep.ofMulDistribMulAction + change Additive.toMul + ((Representation.ofMulDistribMulAction G A).norm a) = + ∏ g : G, g • a.toMul + exact Representation.norm_ofMulDistribMulAction_eq a + +private theorem repSigmaMinusOne_toMul + {G A : Type} [CommGroup G] [CommGroup A] + [MulDistribMulAction G A] (σ : G) (a : Additive A) : + Additive.toMul + ((Rep.toAdditive (M := G) (G := A)) + (((Rep.ofMulDistribMulAction G A).applyAsHom σ - + 𝟙 (Rep.ofMulDistribMulAction G A)).hom a)) = + sigmaMinusOne G A σ a.toMul := by + unfold Rep.toAdditive + unfold Rep.ofMulDistribMulAction + rw [Rep.sub_hom] + rw [show + (Rep.Hom.hom + ((Rep.of (Representation.ofMulDistribMulAction G A)).applyAsHom σ) - + Rep.Hom.hom + (𝟙 (Rep.of (Representation.ofMulDistribMulAction G A)))) a = + Rep.Hom.hom + ((Rep.of (Representation.ofMulDistribMulAction G A)).applyAsHom σ) a - + Rep.Hom.hom + (𝟙 (Rep.of (Representation.ofMulDistribMulAction G A))) a by + rfl] + rw [Rep.applyAsHom_apply] + rw [show + Rep.Hom.hom + (𝟙 (Rep.of (Representation.ofMulDistribMulAction G A))) a = a by + rfl] + unfold sigmaMinusOne + rw [show + ((Rep.of (Representation.ofMulDistribMulAction G A)).ρ σ) a = + Additive.ofMul (σ • a.toMul) by + rfl] + change Additive.toMul + (Additive.ofMul (σ • a.toMul) - a) = + σ • a.toMul * (a.toMul)⁻¹ + rw [toMul_sub] + exact div_eq_mul_inv _ _ + +/-- Identify degree-zero cohomological cycles with the additive form of the fixed subgroup. -/ +def fixedCyclesAddEquiv : + LinearMap.ker + (groupCohomology.d₀₁ (Rep.ofMulDistribMulAction G A)).hom ≃+ + Additive (fixedSubgroup G A) where + toFun x := + Additive.ofMul + ⟨x.1.toMul, by + have hx : x.1 ∈ (Rep.ofMulDistribMulAction G A).ρ.invariants := by + rw [← groupCohomology.d₀₁_ker_eq_invariants] + exact x.2 + intro g + apply Additive.ofMul.injective + exact hx g⟩ + invFun x := + ⟨Additive.ofMul x.toMul.1, by + rw [groupCohomology.d₀₁_ker_eq_invariants] + intro g + apply Additive.ofMul.injective + exact x.toMul.2 g⟩ + left_inv x := by + apply Subtype.ext + rfl + right_inv x := by + apply Additive.ofMul.injective + apply Subtype.ext + rfl + map_add' x y := by + apply Additive.ofMul.injective + apply Subtype.ext + rfl + +omit [Fintype G] in +private theorem fixedCyclesAddEquiv_coe + (x : LinearMap.ker (groupCohomology.d₀₁ (Rep.ofMulDistribMulAction G A)).hom) : + (fixedCyclesAddEquiv (G := G) (A := A) x).toMul.val = x.val.toMul := rfl + +/-- Mathlib's degree-zero Tate cohomology is the arithmetic fixed-point +quotient by the norm image used by `HerbrandH0`. -/ +noncomputable def tateH0IsoHerbrandH0 : + tateCohomology (Rep.ofMulDistribMulAction G A) 0 ≅ + ModuleCat.of ℤ (Additive (HerbrandH0 G A)) := by + let M := Rep.ofMulDistribMulAction G A + let S : ShortComplex (ModuleCat ℤ) := + ShortComplex.mk M.norm.toModuleCatHom (groupCohomology.d₀₁ M) + (Rep.norm_comp_d_eq_zero M) + let eKOwner : + S.moduleCatLeftHomologyData.K ≅ + ModuleCat.of ℤ + (LinearMap.ker + (groupCohomology.d₀₁ (Rep.ofMulDistribMulAction G A)).hom) := + eqToIso (by rfl) + let eK := + (eKOwner ≪≫ + ((fixedCyclesAddEquiv (G := G) (A := A)).toIntLinearEquiv + (modM := inferInstance) (modM₂ := inferInstance)).toModuleIso).toLinearEquiv + let q : Additive (fixedSubgroup G A) →+ Additive (HerbrandH0 G A) := + MonoidHom.toAdditive (HerbrandH0.mk (G := G) (A := A)) + have hboundary : + (LinearMap.range S.moduleCatToCycles).map eK.toLinearMap = + q.ker.toIntSubmodule := by + ext x + constructor + · rintro ⟨y, ⟨a, ha⟩, rfl⟩ + subst y + change Additive A at a + change q (eK (S.moduleCatToCycles a)) = 0 + apply Additive.ofMul.injective + change HerbrandH0.mk _ = 1 + apply (HerbrandH0.mk_eq_one_iff _).2 + refine ⟨a.toMul, ?_⟩ + dsimp [eK, fixedCyclesAddEquiv, S, M] + exact (by exact (repNorm_toMul (G := G) (A := A) a).symm) + · intro hx + change q x = 0 at hx + have hx' : HerbrandH0.mk x.toMul = 1 := by + apply Additive.ofMul.injective + exact hx + rcases (HerbrandH0.mk_eq_one_iff x.toMul).1 hx' with ⟨a, ha⟩ + refine ⟨eK.symm x, ?_, eK.apply_symm_apply x⟩ + refine ⟨Additive.ofMul a, ?_⟩ + apply eK.injective + rw [eK.apply_symm_apply] + apply Additive.toMul.injective + apply Subtype.ext + have hnorm : + Additive.toMul + ((Representation.ofMulDistribMulAction G A).norm + (Additive.ofMul a)) = + x.toMul.1 := + (Representation.norm_ofMulDistribMulAction_eq + (G := G) (M := A) (Additive.ofMul a)).trans <| by + rw [show Additive.toMul (Additive.ofMul a) = a by rfl] + simpa only [tateNormHom_apply, tateNorm] using ha + dsimp [eK, fixedCyclesAddEquiv, S, M] + unfold Rep.ofMulDistribMulAction + exact hnorm + let eQ := + (Submodule.Quotient.equiv (LinearMap.range S.moduleCatToCycles) + q.ker.toIntSubmodule eK hboundary).trans + ((QuotientAddGroup.quotientKerEquivOfSurjective q + (HerbrandH0.mk_surjective (G := G) (A := A))).toIntLinearEquiv + (modM₂ := inferInstance)) + exact TateCohomology.isoZeroBoundary M ≪≫ + S.moduleCatHomologyIso ≪≫ eQ.toModuleIso + +/-- Identify norm-kernel cycles with the additive form of the multiplicative norm kernel. -/ +def normKernelCyclesAddEquiv : + LinearMap.ker + (Rep.ofMulDistribMulAction G A).norm.toModuleCatHom.hom ≃+ + Additive (normKernelSubgroup G A) where + toFun x := + let a : Additive A := x.1 + Additive.ofMul + ⟨a.toMul, by + change tateNorm G A a.toMul = 1 + have hx := x.2 + change (Rep.ofMulDistribMulAction G A).ρ.norm a = 0 at hx + exact (by + exact (repNorm_toMul (G := G) (A := A) a).symm.trans <| by + rw [hx] + rfl)⟩ + invFun x := + let a : Additive A := Additive.ofMul x.toMul.1 + ⟨a, by + have hx0 := x.toMul.2 + change tateNorm G A x.toMul.1 = 1 at hx0 + have hx : tateNorm G A a.toMul = 1 := hx0 + change (Rep.ofMulDistribMulAction G A).ρ.norm a = 0 + unfold Rep.ofMulDistribMulAction + apply Additive.toMul.injective + change Additive.toMul + ((Representation.ofMulDistribMulAction G A).norm a) = (1 : A) + exact + (Representation.norm_ofMulDistribMulAction_eq + (G := G) (M := A) a).trans <| by + simpa [tateNorm] using hx⟩ + left_inv x := by + apply Subtype.ext + rfl + right_inv x := by + apply Additive.ofMul.injective + apply Subtype.ext + rfl + map_add' x y := by + apply Additive.ofMul.injective + apply Subtype.ext + rfl + +private theorem normKernelCyclesAddEquiv_coe + (x : LinearMap.ker (Rep.ofMulDistribMulAction G A).norm.toModuleCatHom.hom) : + (normKernelCyclesAddEquiv (G := G) (A := A) x).toMul.val = x.val.toMul := rfl + +/-- Identify degree-minus-one Tate cohomology with the Herbrand quotient +for a commutative cyclic group. -/ +noncomputable def tateHMinusOneIsoHerbrandHMinusOneOfCommGroup + {G A : Type} [CommGroup G] [Fintype G] [CommGroup A] + [MulDistribMulAction G A] + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) : + tateCohomology (Rep.ofMulDistribMulAction G A) (-1) ≅ + ModuleCat.of ℤ (Additive (HerbrandHMinusOne G A σ)) := by + let M := Rep.ofMulDistribMulAction G A + let S := Rep.FiniteCyclicGroup.subCompNormHom M σ + let eKOwner : + S.moduleCatLeftHomologyData.K ≅ + ModuleCat.of ℤ + (LinearMap.ker + (Rep.ofMulDistribMulAction G A).norm.toModuleCatHom.hom) := + eqToIso (by rfl) + let eK := + (eKOwner ≪≫ + ((normKernelCyclesAddEquiv (G := G) (A := A)).toIntLinearEquiv + (modM := inferInstance) (modM₂ := inferInstance)).toModuleIso).toLinearEquiv + let q : Additive (normKernelSubgroup G A) →+ + Additive (HerbrandHMinusOne G A σ) := + MonoidHom.toAdditive (HerbrandHMinusOne.mk (G := G) (A := A) σ) + have hboundary : + (LinearMap.range S.moduleCatToCycles).map eK.toLinearMap = + q.ker.toIntSubmodule := by + ext x + constructor + · rintro ⟨y, ⟨a, ha⟩, rfl⟩ + subst y + change Additive A at a + change q (eK (S.moduleCatToCycles a)) = 0 + apply Additive.ofMul.injective + change HerbrandHMinusOne.mk σ _ = 1 + apply (HerbrandHMinusOne.mk_eq_one_iff σ _).2 + refine ⟨a.toMul, ?_⟩ + dsimp [eK, normKernelCyclesAddEquiv, S, M] + exact (by exact (repSigmaMinusOne_toMul (G := G) (A := A) σ a).symm) + · intro hx + change q x = 0 at hx + have hx' : HerbrandHMinusOne.mk σ x.toMul = 1 := by + apply Additive.ofMul.injective + exact hx + rcases (HerbrandHMinusOne.mk_eq_one_iff σ x.toMul).1 hx' with ⟨a, ha⟩ + refine ⟨eK.symm x, ?_, eK.apply_symm_apply x⟩ + refine ⟨Additive.ofMul a, ?_⟩ + apply eK.injective + rw [eK.apply_symm_apply] + apply Additive.toMul.injective + apply Subtype.ext + dsimp [eK, normKernelCyclesAddEquiv, S, M] + exact (by + have hσ := repSigmaMinusOne_toMul (G := G) (A := A) σ (Additive.ofMul a) + rw [show Additive.toMul (Additive.ofMul a) = a by rfl] at hσ + exact hσ.trans ha) + let eQ := + (Submodule.Quotient.equiv (LinearMap.range S.moduleCatToCycles) + q.ker.toIntSubmodule eK hboundary).trans + ((QuotientAddGroup.quotientKerEquivOfSurjective q + (HerbrandHMinusOne.mk_surjective (G := G) (A := A) σ)).toIntLinearEquiv + (modM₂ := inferInstance)) + exact TateCohomology.isoFiniteCyclicNegOne M σ hgen ≪≫ + S.moduleCatHomologyIso ≪≫ eQ.toModuleIso + +/-- For a chosen generator `σ`, mathlib's degree-minus-one Tate cohomology is +the arithmetic quotient `ker N / im (σ - 1)` used by `HerbrandHMinusOne`. -/ +noncomputable def tateHMinusOneIsoHerbrandHMinusOne + (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) : + tateCohomology (Rep.ofMulDistribMulAction G A) (-1) ≅ + ModuleCat.of ℤ (Additive (HerbrandHMinusOne G A σ)) := by + letI : IsCyclic G := ⟨⟨σ, hgen⟩⟩ + letI : CommGroup G := IsCyclic.commGroup + exact tateHMinusOneIsoHerbrandHMinusOneOfCommGroup σ hgen + +end + +end CyclicCohomology.ProfiniteCohomology.Herbrand diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Induced.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Induced.lean new file mode 100644 index 0000000000..2e9ea8407b --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Induced.lean @@ -0,0 +1,1205 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Core +public import LeanPool.ClassFieldTheory.ProCGroups.InducedFunctions +public import Mathlib.Logic.Equiv.Fin.Rotate +/-! +# Multiplicative induced modules + +This file supplies the multiplicative induced-module model used in the +Herbrand quotient calculation. If `H ≤ G` acts on a commutative group `B`, then +`Ind_H^G B` is represented by the equivariant functions + +`f : G → B`, `f (h * x) = h • f x`. + +The ambient group acts by right translation. This convention is the one +used for the products of the local multiplicative groups above a place. +The basic equivariant-function model is supplied by `ProCGroups.InducedFunctions`; +this module adds the cyclic-coordinate and Herbrand calculations. +-/ + +@[expose] public section + +noncomputable +section + +namespace CyclicCohomology + +open CyclicCohomology.ProfiniteCohomology.Herbrand + +universe uG uB + +variable {G : Type uG} {B : Type uB} + +/-- A one-step cyclic rotation whose wrap-around coordinate is acted on by +`τ`. -/ +def twistedFinRotate {K C : Type*} [Group K] [CommGroup C] + [MulDistribMulAction K C] {n : ℕ} [NeZero n] + (τ : K) (v : Fin n → C) (i : Fin n) : C := + if finRotate n i = 0 then τ • v 0 + else v (finRotate n i) + +/-- Cancellation of all non-wrap-around factors in a twisted rotation. -/ +theorem prod_twistedFinRotate_div + {K C : Type*} [Group K] [CommGroup C] + [MulDistribMulAction K C] {n : ℕ} [NeZero n] + (τ : K) (v : Fin n → C) : + (∏ i : Fin n, twistedFinRotate τ v i) * + (∏ i : Fin n, v i)⁻¹ = + τ • v 0 * (v 0)⁻¹ := by + classical + let u : Fin n → C := + fun j ↦ if j = 0 then τ • v 0 else v j + have hrotate : + (∏ i : Fin n, twistedFinRotate τ v i) = + ∏ j : Fin n, u j := by + exact Fintype.prod_equiv + (finRotate n) (twistedFinRotate τ v) u + (fun i ↦ rfl) + let R : C := + ∏ j ∈ (Finset.univ.erase (0 : Fin n)), v j + have hu : + (∏ j : Fin n, u j) = (τ • v 0) * R := by + rw [← Finset.mul_prod_erase Finset.univ u + (Finset.mem_univ (0 : Fin n))] + simp only [u, ite_eq_left, R] + congr 1 + apply Finset.prod_congr rfl + intro j hj + have hj0 : j ≠ 0 := + Finset.ne_of_mem_erase hj + simp [hj0] + have hv : + (∏ j : Fin n, v j) = v 0 * R := by + rw [← Finset.mul_prod_erase Finset.univ v + (Finset.mem_univ (0 : Fin n))] + rw [hrotate, hu, hv] + simp only [mul_inv_rev] + calc + (τ • v 0) * R * (R⁻¹ * (v 0)⁻¹) = + (τ • v 0) * (v 0)⁻¹ * + (R * R⁻¹) := by ac_rfl + _ = τ • v 0 * (v 0)⁻¹ := by simp + +/-- Multiplication by the cyclic generator advances `finRotate`, with the +last coordinate wrapping to the full-period power. -/ +theorem pow_mul_eq_pow_finRotate + {X : Type*} [Monoid X] {n : ℕ} [NeZero n] + (a : X) (i : Fin n) : + a ^ i.1 * a = + if finRotate n i = 0 then a ^ n + else a ^ (finRotate n i).1 := by + cases n with + | zero => exact Fin.elim0 i + | succ n => + by_cases hi : i = Fin.last n + · subst i + simp [pow_succ] + · have hil : i.1 < n := + Fin.val_lt_last hi + rw [finRotate_of_lt hil] + simp [pow_succ] + +/-- Partial product of a finite vector. -/ +def finPartialProduct {C : Type*} [CommMonoid C] + {n : ℕ} (v : Fin n → C) (k : ℕ) : C := + (Finset.range k).prod fun i ↦ + if hi : i < n then v ⟨i, hi⟩ else 1 + +@[simp] +theorem finPartialProduct_zero + {C : Type*} [CommMonoid C] {n : ℕ} + (v : Fin n → C) : + finPartialProduct v 0 = 1 := by + simp [finPartialProduct] + +theorem finPartialProduct_succ + {C : Type*} [CommMonoid C] {n : ℕ} + (v : Fin n → C) (i : Fin n) : + finPartialProduct v (i.1 + 1) = + finPartialProduct v i.1 * v i := by + simp [finPartialProduct, + Finset.prod_range_succ, i.2] + +theorem finPartialProduct_full + {C : Type*} [CommMonoid C] {n : ℕ} + (v : Fin n → C) : + finPartialProduct v n = ∏ i : Fin n, v i := by + simpa [finPartialProduct] using + (Finset.prod_fin_eq_prod_range v).symm + +/-- A split homomorphism induces an equivalence of quotients when it +identifies the selected subgroups and its remaining kernel lies in the +source subgroup. -/ +noncomputable def quotientMulEquivOfSplit + {X Y : Type*} [CommGroup X] [CommGroup Y] + (N : Subgroup X) (M : Subgroup Y) + (f : X →* Y) (s : Y →* X) + (hfs : ∀ y : Y, f (s y) = y) + (hfN : ∀ x : X, x ∈ N → f x ∈ M) + (hsM : ∀ y : Y, y ∈ M → s y ∈ N) + (hker : ∀ x : X, f x = 1 → x ∈ N) : + X ⧸ N ≃* Y ⧸ M := by + let qf : (X ⧸ N) →* (Y ⧸ M) := + QuotientGroup.map N M f (fun x hx ↦ hfN x hx) + let qs : (Y ⧸ M) →* (X ⧸ N) := + QuotientGroup.map M N s (fun y hy ↦ hsM y hy) + refine MonoidHom.toMulEquiv qf qs ?_ ?_ + · apply QuotientGroup.monoidHom_ext + ext x + apply QuotientGroup.eq_iff_div_mem.mpr + apply hker + simp [hfs] + · apply QuotientGroup.monoidHom_ext + ext y + apply QuotientGroup.eq_iff_div_mem.mpr + simp [hfs] + +export ProCGroups.InducedFunctions + (inducedSubgroup InducedModule inducedEvaluation inducedEvaluation_apply) + +/-- Compatibility name for the canonical action supplied by the common core. +This alias is not registered as an additional instance. -/ +abbrev inducedMulDistribMulAction [Group G] (H : Subgroup G) [CommGroup B] + [MulDistribMulAction H B] : + MulDistribMulAction G (InducedModule (B := B) H) := + ProCGroups.InducedFunctions.inducedMulDistribMulAction H + +/-- Evaluation at the identity identifies the fixed points of an induced +module with the fixed points for the inducing subgroup. -/ +noncomputable def inducedFixedEquiv [Group G] (H : Subgroup G) + [CommGroup B] [MulDistribMulAction H B] : + fixedSubgroup G (InducedModule (B := B) H) ≃* + fixedSubgroup H B where + toFun f := ⟨f.1.1 1, by + intro h + have hcov := f.1.2 h 1 + have hfix := congrArg + (fun q : InducedModule (B := B) H ↦ q.1 1) (f.2 h.1) + change f.1.1 (h.1 * 1) = h • f.1.1 1 at hcov + change f.1.1 (1 * h.1) = f.1.1 1 at hfix + have hcov' : h • f.1.1 1 = f.1.1 h.1 := by + simpa using hcov.symm + have hfix' : f.1.1 h.1 = f.1.1 1 := by + simpa using hfix + exact hcov'.trans hfix'⟩ + invFun b := ⟨⟨fun _ ↦ b.1, by + intro h x + exact (b.2 h).symm⟩, + by + intro g + apply Subtype.ext + funext x + rfl⟩ + left_inv f := by + apply Subtype.ext + apply Subtype.ext + funext x + have hx := congrArg + (fun q : InducedModule (B := B) H ↦ q.1 1) (f.2 x) + change f.1.1 (1 * x) = f.1.1 1 at hx + simpa using hx.symm + right_inv b := by + apply Subtype.ext + rfl + map_mul' _ _ := rfl + +@[simp] +theorem inducedFixedEquiv_apply_coe [Group G] (H : Subgroup G) + [CommGroup B] [MulDistribMulAction H B] + (f : fixedSubgroup G (InducedModule (B := B) H)) : + (inducedFixedEquiv H f : B) = f.1.1 1 := + rfl + +section CyclicCoordinates + +variable [CommGroup G] [Fintype G] + +omit [Fintype G] in +/-- A chosen generator of a finite cyclic group also generates its quotient +by any subgroup. -/ +theorem quotientGenerator_generates (H : Subgroup G) (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) : + ∀ q : G ⧸ H, q ∈ + Subgroup.zpowers (QuotientGroup.mk' H σ) := by + intro q + obtain ⟨x, rfl⟩ := QuotientGroup.mk'_surjective H q + obtain ⟨k, hk⟩ := Subgroup.mem_zpowers_iff.mp (hgen x) + refine Subgroup.mem_zpowers_iff.mpr ⟨k, ?_⟩ + rw [← map_zpow] + exact congrArg (QuotientGroup.mk' H) hk + +omit [Fintype G] in +/-- The image of a cyclic generator in `G/H` has order `[G:H]`. -/ +theorem quotientGenerator_order (H : Subgroup G) (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) : + orderOf (QuotientGroup.mk' H σ) = H.index := by + rw [H.index_eq_card] + exact orderOf_eq_card_of_forall_mem_zpowers + (quotientGenerator_generates H σ hgen) + +/-- The powers `1, σ, ..., σ^([G:H]-1)` form the canonical transversal +used in the cyclic induced-module calculation. -/ +noncomputable def cyclicCosetEquiv (H : Subgroup G) (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) : + H × Fin H.index ≃ G := by + classical + letI : Fintype (G ⧸ H) := Fintype.ofFinite (G ⧸ H) + refine Equiv.ofBijective + (fun p : H × Fin H.index ↦ p.1.1 * σ ^ p.2.1) ⟨?_, ?_⟩ + · intro p q hpq + have hquot : + (QuotientGroup.mk' H σ) ^ p.2.1 = + (QuotientGroup.mk' H σ) ^ q.2.1 := by + have hpone : QuotientGroup.mk' H p.1.1 = 1 := + (QuotientGroup.eq_one_iff p.1.1).mpr p.1.2 + have hqone : QuotientGroup.mk' H q.1.1 = 1 := + (QuotientGroup.eq_one_iff q.1.1).mpr q.1.2 + calc + (QuotientGroup.mk' H σ) ^ p.2.1 = + QuotientGroup.mk' H (p.1.1 * σ ^ p.2.1) := by + rw [map_mul, map_pow, hpone, one_mul] + _ = QuotientGroup.mk' H (q.1.1 * σ ^ q.2.1) := + congrArg (QuotientGroup.mk' H) hpq + _ = (QuotientGroup.mk' H σ) ^ q.2.1 := by + rw [map_mul, map_pow, hqone, one_mul] + have hmod : p.2.1 ≡ q.2.1 [MOD H.index] := by + have hm := (pow_eq_pow_iff_modEq + (x := QuotientGroup.mk' H σ)).mp hquot + rw [quotientGenerator_order H σ hgen] at hm + exact hm + have hij : p.2.1 = q.2.1 := + Nat.ModEq.eq_of_lt_of_lt hmod p.2.2 q.2.2 + have hfin : p.2 = q.2 := Fin.ext hij + cases p with + | mk ph pi => + cases q with + | mk qh qi => + dsimp at hfin hpq ⊢ + subst qi + apply congrArg (fun h : H ↦ (h, pi)) + apply Subtype.ext + exact mul_right_cancel hpq + · intro x + have hcover := IsCyclic.image_range_card + (a := QuotientGroup.mk' H σ) + (quotientGenerator_generates H σ hgen) + rw [← H.index_eq_card] at hcover + have hxmem : QuotientGroup.mk' H x ∈ + Finset.image (fun i : ℕ ↦ + (QuotientGroup.mk' H σ) ^ i) + (Finset.range H.index) := by + rw [hcover] + simp + obtain ⟨i, hi, hqi⟩ := Finset.mem_image.mp hxmem + have hdiv : x / σ ^ i ∈ H := by + apply QuotientGroup.eq_iff_div_mem.mp + simpa using hqi.symm + refine + ⟨(⟨x / σ ^ i, hdiv⟩, + ⟨i, Finset.mem_range.mp hi⟩), ?_⟩ + exact div_mul_cancel x (σ ^ i) + +@[simp] +theorem cyclicCosetEquiv_apply (H : Subgroup G) (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) + (h : H) (i : Fin H.index) : + cyclicCosetEquiv H σ hgen (h, i) = + h.1 * σ ^ i.1 := by + exact congrFun + (Equiv.coe_ofBijective + (fun p : H × Fin H.index => p.1.1 * σ ^ p.2.1) + (cyclicCosetEquiv H σ hgen).bijective) (h, i) + +omit [Fintype G] in +/-- The power `σ^[G:H]` belongs to `H`. -/ +theorem cyclic_pow_index_mem (H : Subgroup G) (σ : G) : + σ ^ H.index ∈ H := + H.pow_index_mem σ + +omit [Fintype G] in +/-- In a cyclic group, `σ^[G:H]` generates `H`. -/ +theorem zpowers_pow_index_eq [Finite G] (H : Subgroup G) (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) : + Subgroup.zpowers (σ ^ H.index) = H := by + classical + let := Fintype.ofFinite G + have hn0 : H.index ≠ 0 := by + rw [H.index_eq_card] + exact Nat.card_pos.ne' + have horder : orderOf σ = Nat.card G := + orderOf_eq_card_of_forall_mem_zpowers hgen + have hindex_dvd_order : H.index ∣ orderOf σ := by + rw [horder] + exact H.index_dvd_card + have hpowOrder : + orderOf (σ ^ H.index) = Nat.card H := by + calc + orderOf (σ ^ H.index) = + orderOf σ / H.index := + orderOf_pow_of_dvd hn0 hindex_dvd_order + _ = Nat.card G / H.index := by rw [horder] + _ = Nat.card H := by + rw [← H.index_mul_card] + exact Nat.mul_div_cancel_left + (Nat.card H) (Nat.pos_of_ne_zero hn0) + apply Subgroup.eq_of_le_of_card_ge + · exact Subgroup.zpowers_le.mpr + (cyclic_pow_index_mem H σ) + · rw [Nat.card_zpowers, hpowOrder] + +/-- The canonical generator of `H` attached to `σ`. -/ +def subgroupGenerator (H : Subgroup G) (σ : G) : H := + ⟨σ ^ H.index, cyclic_pow_index_mem H σ⟩ + +omit [Fintype G] in +@[simp] +theorem subgroupGenerator_coe (H : Subgroup G) (σ : G) : + (subgroupGenerator H σ : G) = σ ^ H.index := + rfl + +omit [Fintype G] in +/-- The canonical element `σ^[G:H]` generates `H`. -/ +theorem subgroupGenerator_generates [Finite G] (H : Subgroup G) (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) : + ∀ h : H, h ∈ Subgroup.zpowers (subgroupGenerator H σ) := by + classical + let := Fintype.ofFinite G + intro h + have hh : h.1 ∈ + Subgroup.zpowers (σ ^ H.index) := by + rw [zpowers_pow_index_eq H σ hgen] + exact h.2 + obtain ⟨k, hk⟩ := + Subgroup.mem_zpowers_iff.mp hh + refine Subgroup.mem_zpowers_iff.mpr ⟨k, ?_⟩ + apply Subtype.ext + exact hk + +end CyclicCoordinates + +section InducedCoordinates + +variable [CommGroup G] [Fintype G] [CommGroup B] +variable (H : Subgroup G) [MulDistribMulAction H B] + +/-- Restriction to the canonical cyclic transversal identifies an induced +module with a finite product of copies of the inducing group. -/ +noncomputable def inducedCoordinates (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) : + InducedModule (B := B) H ≃* + (Fin H.index → B) where + toFun f i := f.1 (σ ^ i.1) + invFun v := ⟨fun x ↦ + let p := (cyclicCosetEquiv H σ hgen).symm x + p.1 • v p.2, + by + intro h x + let e := cyclicCosetEquiv H σ hgen + let p := e.symm x + have hp : p.1.1 * σ ^ p.2.1 = x := by + have hx := e.apply_symm_apply x + change p.1.1 * σ ^ p.2.1 = x at hx + exact hx + have hsymm : + e.symm (h.1 * x) = (h * p.1, p.2) := by + apply e.injective + rw [e.apply_symm_apply] + change h.1 * x = + (h * p.1).1 * σ ^ p.2.1 + rw [← hp] + simp only [Subgroup.coe_mul] + exact (mul_assoc h.1 p.1.1 + (σ ^ p.2.1)).symm + change + (e.symm (h.1 * x)).1 • + v (e.symm (h.1 * x)).2 = + h • p.1 • v p.2 + rw [hsymm] + exact mul_smul h p.1 (v p.2)⟩ + left_inv f := by + apply Subtype.ext + funext x + let e := cyclicCosetEquiv H σ hgen + let p := e.symm x + have hp : p.1.1 * σ ^ p.2.1 = x := by + have hx := e.apply_symm_apply x + change p.1.1 * σ ^ p.2.1 = x at hx + exact hx + change p.1 • f.1 (σ ^ p.2.1) = f.1 x + rw [← hp] + exact (f.2 p.1 (σ ^ p.2.1)).symm + right_inv v := by + funext i + let e := cyclicCosetEquiv H σ hgen + have hsymm : e.symm (σ ^ i.1) = (1, i) := by + apply e.injective + simp [e] + change + (e.symm (σ ^ i.1)).1 • + v (e.symm (σ ^ i.1)).2 = v i + rw [hsymm] + exact one_smul H (v i) + map_mul' f k := by + funext i + rfl + +@[simp] +theorem inducedCoordinates_apply (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) + (f : InducedModule (B := B) H) + (i : Fin H.index) : + inducedCoordinates H σ hgen f i = + f.1 (σ ^ i.1) := + rfl + +/-- The multiplicative section supported on the first transversal +coordinate. -/ +def inducedFirstCoordinateHom : + B →* (Fin H.index → B) where + toFun b i := if i.1 = 0 then b else 1 + map_one' := by + funext i + split <;> rfl + map_mul' b c := by + funext i + by_cases hi : i.1 = 0 <;> simp [hi] + +/-- The canonical multiplicative section from the inducing group. -/ +noncomputable def inducedSection (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) : + B →* InducedModule (B := B) H := + (inducedCoordinates H σ hgen).symm.toMonoidHom.comp + (inducedFirstCoordinateHom H) + +@[simp] +theorem inducedSection_apply_one (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) (b : B) : + (inducedSection H σ hgen b).1 1 = b := by + have hn : 0 < H.index := by + rw [H.index_eq_card] + exact Nat.card_pos + let i0 : Fin H.index := ⟨0, hn⟩ + have h := + (inducedCoordinates_apply H σ hgen + ((inducedCoordinates H σ hgen).symm + (inducedFirstCoordinateHom H b)) i0).symm.trans + (congrFun + ((inducedCoordinates H σ hgen).apply_symm_apply + (inducedFirstCoordinateHom H b)) i0) + change (inducedSection H σ hgen b).1 (σ ^ (0 : ℕ)) = b at h + simpa only [pow_zero] using h + +/-- Product over the canonical transversal. -/ +noncomputable def inducedCoordinateProduct (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) : + InducedModule (B := B) H →* B where + toFun f := + ∏ i : Fin H.index, + inducedCoordinates H σ hgen f i + map_one' := by simp + map_mul' f k := by + simp only [map_mul, Pi.mul_apply, + Finset.prod_mul_distrib] + +@[simp] +theorem inducedCoordinateProduct_apply (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) + (f : InducedModule (B := B) H) : + inducedCoordinateProduct H σ hgen f = + ∏ i : Fin H.index, f.1 (σ ^ i.1) := + rfl + +/-- The first-coordinate section is a right inverse to the transversal +product. -/ +theorem inducedCoordinateProduct_section (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) (b : B) : + inducedCoordinateProduct H σ hgen + (inducedSection H σ hgen b) = b := by + classical + have hn : 0 < H.index := by + rw [H.index_eq_card] + exact Nat.card_pos + let i0 : Fin H.index := ⟨0, hn⟩ + change (∏ i : Fin H.index, + inducedCoordinates H σ hgen + ((inducedCoordinates H σ hgen).symm + (inducedFirstCoordinateHom H b)) i) = b + rw [(inducedCoordinates H σ hgen).apply_symm_apply + (inducedFirstCoordinateHom H b)] + refine Finset.prod_eq_single i0 ?_ ?_ + · intro i _hi hne + have hi0 : i.1 ≠ 0 := by + intro hi + apply hne + exact Fin.ext hi + simp [inducedFirstCoordinateHom, hi0] + · intro hnot + exact (hnot (Finset.mem_univ i0)).elim + +end InducedCoordinates + +section InducedHerbrandH0 + +variable [CommGroup G] [Fintype G] [CommGroup B] +variable (H : Subgroup G) [MulDistribMulAction H B] + +/-- A subgroup of a finite group is equipped with its finite enumeration. -/ +local instance inducedEvaluationSubgroupFintype : Fintype H := Fintype.ofFinite H + +/-- Norm compatibility under evaluation: +`ev₁(N_G f) = N_H(∏_{G/H} f)`. -/ +theorem inducedEvaluation_tateNorm (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) + (f : InducedModule (B := B) H) : + inducedEvaluation H + (tateNorm G (InducedModule (B := B) H) f) = + tateNorm H B + (inducedCoordinateProduct H σ hgen f) := by + classical + let e := cyclicCosetEquiv H σ hgen + let ev : InducedModule (B := B) H →* B := + inducedEvaluation H + calc + inducedEvaluation H + (tateNorm G (InducedModule (B := B) H) f) = + ∏ g : G, f.1 g := by + calc + inducedEvaluation H + (tateNorm G + (InducedModule (B := B) H) f) = + ∏ g : G, ev (g • f) := by + simp only [tateNorm, ev, map_prod] + _ = ∏ g : G, f.1 g := by + apply Finset.prod_congr rfl + intro g _hg + change f.1 (1 * g) = f.1 g + rw [one_mul] + _ = ∏ p : H × Fin H.index, f.1 (e p) := by + exact Fintype.prod_equiv e.symm + (fun g : G ↦ f.1 g) + (fun p : H × Fin H.index ↦ f.1 (e p)) + (fun g ↦ by + rw [e.apply_symm_apply]) + _ = ∏ h : H, ∏ i : Fin H.index, + h • f.1 (σ ^ i.1) := by + rw [Fintype.prod_prod_type] + apply Finset.prod_congr rfl + intro h _hh + apply Finset.prod_congr rfl + intro i _hi + change + f.1 (h.1 * σ ^ i.1) = + h • f.1 (σ ^ i.1) + exact f.2 h (σ ^ i.1) + _ = ∏ h : H, + h • (∏ i : Fin H.index, + f.1 (σ ^ i.1)) := by + apply Finset.prod_congr rfl + intro h _hh + exact + (map_prod + (MulDistribMulAction.toMonoidHom B h) + (fun i : Fin H.index ↦ f.1 (σ ^ i.1)) + Finset.univ).symm + _ = tateNorm H B + (inducedCoordinateProduct H σ hgen f) := by + simp only [tateNorm, + inducedCoordinateProduct_apply] + +/-- Under evaluation of fixed points, global and subgroup norm images +correspond. -/ +theorem inducedFixedEquiv_mem_tateNormSubgroup_iff + (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) + (x : fixedSubgroup G + (InducedModule (B := B) H)) : + x.1 ∈ tateNormSubgroup G + (InducedModule (B := B) H) ↔ + (inducedFixedEquiv H x).1 ∈ + tateNormSubgroup H B := by + constructor + · rintro ⟨f, hf⟩ + refine + ⟨inducedCoordinateProduct H σ hgen f, ?_⟩ + calc + tateNorm H B + (inducedCoordinateProduct H σ hgen f) = + inducedEvaluation H + (tateNorm G + (InducedModule (B := B) H) f) := + (inducedEvaluation_tateNorm + H σ hgen f).symm + _ = inducedEvaluation H x.1 := + congrArg (inducedEvaluation H) hf + _ = (inducedFixedEquiv H x).1 := rfl + · rintro ⟨b, hb⟩ + refine ⟨inducedSection H σ hgen b, ?_⟩ + let y : fixedSubgroup G + (InducedModule (B := B) H) := + ⟨tateNorm G (InducedModule (B := B) H) + (inducedSection H σ hgen b), + fun g ↦ smul_tateNorm_eq + (G := G) + (A := InducedModule (B := B) H) g _⟩ + have hy : + inducedFixedEquiv H y = + inducedFixedEquiv H x := by + apply Subtype.ext + change + inducedEvaluation H y.1 = + (inducedFixedEquiv H x).1 + calc + inducedEvaluation H y.1 = + tateNorm H B + (inducedCoordinateProduct H σ hgen + (inducedSection H σ hgen b)) := + inducedEvaluation_tateNorm H σ hgen + (inducedSection H σ hgen b) + _ = tateNorm H B b := by + rw [inducedCoordinateProduct_section + H σ hgen b] + _ = (inducedFixedEquiv H x).1 := hb + exact congrArg Subtype.val + ((inducedFixedEquiv H).injective hy) + +/-- Multiplicative Shapiro lemma in Tate degree zero. -/ +noncomputable def inducedHerbrandH0Equiv (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) : + HerbrandH0 G (InducedModule (B := B) H) ≃* + HerbrandH0 H B := by + let e : + fixedSubgroup G (InducedModule (B := B) H) ≃* + fixedSubgroup H B := + inducedFixedEquiv H + let NG := + (tateNormSubgroup G + (InducedModule (B := B) H)).subgroupOf + (fixedSubgroup G + (InducedModule (B := B) H)) + let NH := + (tateNormSubgroup H B).subgroupOf + (fixedSubgroup H B) + exact quotientMulEquivOfSplit + NG NH e.toMonoidHom e.symm.toMonoidHom + (fun y ↦ e.apply_symm_apply y) + (fun x hx ↦ by + rw [Subgroup.mem_subgroupOf] at hx ⊢ + exact + (inducedFixedEquiv_mem_tateNormSubgroup_iff + H σ hgen x).mp hx) + (fun y hy ↦ by + rw [Subgroup.mem_subgroupOf] at hy ⊢ + have h := + (inducedFixedEquiv_mem_tateNormSubgroup_iff + H σ hgen (e.symm y)).mpr + (by simpa [e] using hy) + simpa [e] using h) + (fun x hx ↦ by + have hx1 : x = 1 := by + apply e.injective + simpa [e] using hx + rw [hx1] + exact NG.one_mem) + +end InducedHerbrandH0 + +section InducedHerbrandHMinusOne + +variable [CommGroup G] [Fintype G] [CommGroup B] +variable (H : Subgroup G) [MulDistribMulAction H B] + +/-- A subgroup of a finite group is equipped with its finite enumeration. -/ +local instance inducedCoordinatesSubgroupFintype : Fintype H := Fintype.ofFinite H + +omit [Fintype G] in +local instance [Finite G] : NeZero H.index := ⟨by + rw [H.index_eq_card] + exact Nat.card_pos.ne'⟩ + +/-- In canonical coordinates, right translation by `σ` is the cyclic shift +whose wrap-around is acted on by `σ^[G:H]`. -/ +theorem inducedCoordinates_smul_generator (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) + (f : InducedModule (B := B) H) + (i : Fin H.index) : + inducedCoordinates H σ hgen (σ • f) i = + twistedFinRotate (subgroupGenerator H σ) + (inducedCoordinates H σ hgen f) i := by + unfold twistedFinRotate + change + f.1 (σ ^ i.1 * σ) = + if finRotate H.index i = 0 then + subgroupGenerator H σ • + f.1 (σ ^ (0 : Fin H.index).1) + else + f.1 (σ ^ (finRotate H.index i).1) + rw [pow_mul_eq_pow_finRotate] + split_ifs with hi + · have hcov := + f.2 (subgroupGenerator H σ) 1 + change + f.1 (σ ^ H.index * 1) = + subgroupGenerator H σ • f.1 1 at hcov + simpa using hcov + · rfl + +/-- The transversal product sends a `σ`-coboundary to the corresponding +`σ^[G:H]`-coboundary. -/ +theorem inducedCoordinateProduct_sigmaMinusOne + (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) + (f : InducedModule (B := B) H) : + inducedCoordinateProduct H σ hgen + (sigmaMinusOne G + (InducedModule (B := B) H) σ f) = + sigmaMinusOne H B + (subgroupGenerator H σ) (f.1 1) := by + let v : Fin H.index → B := + inducedCoordinates H σ hgen f + rw [show + sigmaMinusOne G + (InducedModule (B := B) H) σ f = + σ • f * f⁻¹ by rfl, + map_mul, map_inv] + change + (∏ i : Fin H.index, + inducedCoordinates H σ hgen (σ • f) i) * + (∏ i : Fin H.index, v i)⁻¹ = + sigmaMinusOne H B + (subgroupGenerator H σ) (f.1 1) + calc + (∏ i : Fin H.index, + inducedCoordinates H σ hgen (σ • f) i) * + (∏ i : Fin H.index, v i)⁻¹ = + (∏ i : Fin H.index, + twistedFinRotate + (subgroupGenerator H σ) v i) * + (∏ i : Fin H.index, v i)⁻¹ := by + congr 2 + funext i + exact inducedCoordinates_smul_generator + H σ hgen f i + _ = subgroupGenerator H σ • v 0 * + (v 0)⁻¹ := + prod_twistedFinRotate_div + (subgroupGenerator H σ) v + _ = sigmaMinusOne H B + (subgroupGenerator H σ) (f.1 1) := by + have hv0 : v 0 = f.1 1 := by + simpa only [Fin.val_zero, pow_zero] using + (inducedCoordinates_apply H σ hgen f (0 : Fin H.index)) + simpa only [sigmaMinusOne] using + congrArg (fun b : B => subgroupGenerator H σ • b * b⁻¹) hv0 + +/-- If the product of the canonical coordinates is one, successive partial +products construct a `σ`-primitive. -/ +theorem inducedCoordinateProduct_eq_one_mem_augmentation + (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) + (f : InducedModule (B := B) H) + (hf : + inducedCoordinateProduct H σ hgen f = 1) : + f ∈ augmentationSubgroup G + (InducedModule (B := B) H) σ := by + let e : InducedModule (B := B) H ≃* + (Fin H.index → B) := + inducedCoordinates H σ hgen + let v : Fin H.index → B := e f + let p : Fin H.index → B := + fun i ↦ finPartialProduct v i.1 + let c : InducedModule (B := B) H := + e.symm p + have hc : e c = p := e.apply_symm_apply p + have hprod : + (∏ i : Fin H.index, v i) = 1 := by + change + inducedCoordinateProduct H σ hgen f = 1 at hf + exact hf + have hfull : + finPartialProduct v H.index = 1 := by + rw [finPartialProduct_full] + exact hprod + refine ⟨c, ?_⟩ + apply e.injective + funext i + change + c.1 (σ ^ i.1 * σ) * + (c.1 (σ ^ i.1))⁻¹ = v i + have hci : + c.1 (σ ^ i.1) = p i := + congrFun hc i + by_cases hi : i.1 + 1 < H.index + · let j : Fin H.index := ⟨i.1 + 1, hi⟩ + have hcj : + c.1 (σ ^ j.1) = p j := + congrFun hc j + have hpow : + σ ^ i.1 * σ = σ ^ j.1 := + (pow_succ σ i.1).symm + rw [hpow, hcj, hci] + change + finPartialProduct v (i.1 + 1) * + (finPartialProduct v i.1)⁻¹ = v i + rw [finPartialProduct_succ v i] + simp [mul_assoc] + · have hle : i.1 + 1 ≤ H.index := + Nat.succ_le_iff.mpr i.2 + have heq : i.1 + 1 = H.index := + le_antisymm hle (Nat.le_of_not_gt hi) + have hc0 : c.1 1 = 1 := by + have h := congrFun hc (0 : Fin H.index) + change + c.1 (σ ^ (0 : Fin H.index).1) = + p 0 at h + simpa [p] using h + have hcwrap : + c.1 (σ ^ i.1 * σ) = 1 := by + calc + c.1 (σ ^ i.1 * σ) = + c.1 (σ ^ (i.1 + 1)) := by + rw [pow_succ] + _ = c.1 (σ ^ H.index) := by + rw [heq] + _ = subgroupGenerator H σ • c.1 1 := by + simpa only [subgroupGenerator_coe, mul_one] using + c.2 (subgroupGenerator H σ) 1 + _ = 1 := by + rw [hc0, MulDistribMulAction.smul_one] + have hsucc := + finPartialProduct_succ v i + rw [heq] at hsucc + have hmul : + finPartialProduct v i.1 * v i = 1 := + hsucc.symm.trans hfull + rw [hcwrap, hci, one_mul] + change + (finPartialProduct v i.1)⁻¹ = v i + exact (mul_eq_one_iff_inv_eq).mp hmul + +/-- The transversal product carries the ambient norm kernel into the +subgroup norm kernel. -/ +theorem inducedCoordinateProduct_mem_normKernel + (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) + {f : InducedModule (B := B) H} + (hf : f ∈ normKernelSubgroup G + (InducedModule (B := B) H)) : + inducedCoordinateProduct H σ hgen f ∈ + normKernelSubgroup H B := by + change + tateNorm G (InducedModule (B := B) H) f = 1 at hf + change + tateNorm H B + (inducedCoordinateProduct H σ hgen f) = 1 + calc + tateNorm H B + (inducedCoordinateProduct H σ hgen f) = + inducedEvaluation H + (tateNorm G + (InducedModule (B := B) H) f) := + (inducedEvaluation_tateNorm + H σ hgen f).symm + _ = inducedEvaluation H 1 := + congrArg (inducedEvaluation H) hf + _ = 1 := rfl + +/-- The canonical section carries the subgroup norm kernel into the ambient +norm kernel. -/ +theorem inducedSection_mem_normKernel (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) + {b : B} (hb : b ∈ normKernelSubgroup H B) : + inducedSection H σ hgen b ∈ + normKernelSubgroup G + (InducedModule (B := B) H) := by + change tateNorm H B b = 1 at hb + let y : fixedSubgroup G + (InducedModule (B := B) H) := + ⟨tateNorm G (InducedModule (B := B) H) + (inducedSection H σ hgen b), + fun g ↦ smul_tateNorm_eq + (G := G) + (A := InducedModule (B := B) H) g _⟩ + have hey : inducedFixedEquiv H y = 1 := by + apply Subtype.ext + change inducedEvaluation H y.1 = 1 + calc + inducedEvaluation H y.1 = + tateNorm H B + (inducedCoordinateProduct H σ hgen + (inducedSection H σ hgen b)) := + inducedEvaluation_tateNorm H σ hgen + (inducedSection H σ hgen b) + _ = tateNorm H B b := by + rw [inducedCoordinateProduct_section + H σ hgen b] + _ = 1 := hb + have hy : y = 1 := + (inducedFixedEquiv H).injective hey + exact congrArg Subtype.val hy + +/-- The transversal product maps augmentation subgroups compatibly. -/ +theorem inducedCoordinateProduct_mem_augmentation + (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) + {f : InducedModule (B := B) H} + (hf : f ∈ augmentationSubgroup G + (InducedModule (B := B) H) σ) : + inducedCoordinateProduct H σ hgen f ∈ + augmentationSubgroup H B + (subgroupGenerator H σ) := by + obtain ⟨c, rfl⟩ := hf + refine ⟨c.1 1, ?_⟩ + exact + (inducedCoordinateProduct_sigmaMinusOne + H σ hgen c).symm + +/-- The canonical section maps subgroup coboundaries to ambient +coboundaries. -/ +theorem inducedSection_mem_augmentation (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) + {b : B} + (hb : b ∈ augmentationSubgroup H B + (subgroupGenerator H σ)) : + inducedSection H σ hgen b ∈ + augmentationSubgroup G + (InducedModule (B := B) H) σ := by + obtain ⟨c, rfl⟩ := hb + let a₁ : InducedModule (B := B) H := + inducedSection H σ hgen + (sigmaMinusOne H B + (subgroupGenerator H σ) c) + let a₂ : InducedModule (B := B) H := + sigmaMinusOne G + (InducedModule (B := B) H) σ + (inducedSection H σ hgen c) + have hnu₁ : + inducedCoordinateProduct H σ hgen a₁ = + sigmaMinusOne H B + (subgroupGenerator H σ) c := + inducedCoordinateProduct_section H σ hgen _ + have hnu₂ : + inducedCoordinateProduct H σ hgen a₂ = + sigmaMinusOne H B + (subgroupGenerator H σ) c := by + calc + inducedCoordinateProduct H σ hgen a₂ = + sigmaMinusOne H B + (subgroupGenerator H σ) + ((inducedSection H σ hgen c).1 1) := + inducedCoordinateProduct_sigmaMinusOne + H σ hgen + (inducedSection H σ hgen c) + _ = sigmaMinusOne H B + (subgroupGenerator H σ) c := by + rw [inducedSection_apply_one + H σ hgen c] + let d : InducedModule (B := B) H := + a₁ * a₂⁻¹ + have hnud : + inducedCoordinateProduct H σ hgen d = 1 := by + calc + inducedCoordinateProduct H σ hgen d = + inducedCoordinateProduct H σ hgen a₁ * + (inducedCoordinateProduct + H σ hgen a₂)⁻¹ := by + simp only [d, map_mul, map_inv] + _ = 1 := by + rw [hnu₁, hnu₂, mul_inv_cancel] + have hd : + d ∈ augmentationSubgroup G + (InducedModule (B := B) H) σ := + inducedCoordinateProduct_eq_one_mem_augmentation + H σ hgen d hnud + have ha₂ : + a₂ ∈ augmentationSubgroup G + (InducedModule (B := B) H) σ := + ⟨inducedSection H σ hgen c, rfl⟩ + have hmul := + (augmentationSubgroup G + (InducedModule (B := B) H) σ).mul_mem + hd ha₂ + have heq : d * a₂ = a₁ := by simp [d] + rw [heq] at hmul + exact hmul + +/-- Restriction of the transversal product to norm kernels. -/ +noncomputable def inducedNormKernelProductHom (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) : + normKernelSubgroup G + (InducedModule (B := B) H) →* + normKernelSubgroup H B where + toFun f := + ⟨inducedCoordinateProduct H σ hgen f.1, + inducedCoordinateProduct_mem_normKernel + H σ hgen f.2⟩ + map_one' := by + apply Subtype.ext + exact map_one + (inducedCoordinateProduct H σ hgen) + map_mul' x y := by + apply Subtype.ext + exact map_mul + (inducedCoordinateProduct H σ hgen) + x.1 y.1 + +/-- Restriction of the canonical section to norm kernels. -/ +noncomputable def inducedNormKernelSectionHom (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) : + normKernelSubgroup H B →* + normKernelSubgroup G + (InducedModule (B := B) H) where + toFun b := + ⟨inducedSection H σ hgen b.1, + inducedSection_mem_normKernel + H σ hgen b.2⟩ + map_one' := by + apply Subtype.ext + exact map_one (inducedSection H σ hgen) + map_mul' x y := by + apply Subtype.ext + exact map_mul (inducedSection H σ hgen) + x.1 y.1 + +/-- Multiplicative Shapiro lemma in Tate degree minus one. -/ +noncomputable def inducedHerbrandHMinusOneEquiv + (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) : + HerbrandHMinusOne G + (InducedModule (B := B) H) σ ≃* + HerbrandHMinusOne H B + (subgroupGenerator H σ) := by + let f : + normKernelSubgroup G + (InducedModule (B := B) H) →* + normKernelSubgroup H B := + inducedNormKernelProductHom H σ hgen + let s : + normKernelSubgroup H B →* + normKernelSubgroup G + (InducedModule (B := B) H) := + inducedNormKernelSectionHom H σ hgen + let IG := + (augmentationSubgroup G + (InducedModule (B := B) H) σ).subgroupOf + (normKernelSubgroup G + (InducedModule (B := B) H)) + let IH := + (augmentationSubgroup H B + (subgroupGenerator H σ)).subgroupOf + (normKernelSubgroup H B) + exact quotientMulEquivOfSplit + IG IH f s + (fun y ↦ by + apply Subtype.ext + exact inducedCoordinateProduct_section + H σ hgen y.1) + (fun x hx ↦ by + rw [Subgroup.mem_subgroupOf] at hx ⊢ + exact inducedCoordinateProduct_mem_augmentation + H σ hgen hx) + (fun y hy ↦ by + rw [Subgroup.mem_subgroupOf] at hy ⊢ + exact inducedSection_mem_augmentation + H σ hgen hy) + (fun x hx ↦ by + rw [Subgroup.mem_subgroupOf] + apply + inducedCoordinateProduct_eq_one_mem_augmentation + H σ hgen x.1 + exact congrArg Subtype.val hx) + +end InducedHerbrandHMinusOne + +section FiniteCyclicGroup + +variable [Group G] [Fintype G] [CommGroup B] +variable (H : Subgroup G) [MulDistribMulAction H B] + +/-- The canonical generator of a subgroup, exposed without requiring a +global `CommGroup G` instance. Commutativity is derived from the supplied +cyclic generator. -/ +noncomputable def subgroupGeneratorOfGenerator (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) : H := by + letI : IsCyclic G := ⟨⟨σ, hgen⟩⟩ + letI : CommGroup G := IsCyclic.commGroup + exact subgroupGenerator H σ + +omit [Fintype G] in +@[simp] +theorem subgroupGeneratorOfGenerator_coe (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) : + (subgroupGeneratorOfGenerator H σ hgen : G) = + σ ^ H.index := + rfl + +omit [Fintype G] in +/-- The derived element `σ^[G:H]` generates `H`. -/ +theorem subgroupGeneratorOfGenerator_generates [Finite G] (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) : + ∀ h : H, + h ∈ Subgroup.zpowers + (subgroupGeneratorOfGenerator H σ hgen) := by + classical + let := Fintype.ofFinite G + let : IsCyclic G := ⟨⟨σ, hgen⟩⟩ + let : CommGroup G := IsCyclic.commGroup + have hτ : + subgroupGeneratorOfGenerator H σ hgen = + subgroupGenerator H σ := + Subtype.ext (by rfl) + rw [hτ] + exact subgroupGenerator_generates H σ hgen + +/-- Cyclic-transversal coordinates for an ordinary finite cyclic group. -/ +noncomputable def inducedCoordinatesOfFiniteCyclic + (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) : + InducedModule (B := B) H ≃* + (Fin H.index → B) := by + letI : IsCyclic G := ⟨⟨σ, hgen⟩⟩ + letI : CommGroup G := IsCyclic.commGroup + exact inducedCoordinates H σ hgen + +/-- Tate-degree-zero Shapiro equivalence for an ordinary finite cyclic +group. -/ +noncomputable def inducedHerbrandH0EquivOfFiniteCyclic + (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) : + letI : Fintype H := Fintype.ofFinite H + HerbrandH0 G (InducedModule (B := B) H) ≃* + HerbrandH0 H B := by + letI : Fintype H := Fintype.ofFinite H + letI : IsCyclic G := ⟨⟨σ, hgen⟩⟩ + letI : CommGroup G := IsCyclic.commGroup + exact inducedHerbrandH0Equiv H σ hgen + +/-- Tate-degree-minus-one Shapiro equivalence for an ordinary finite cyclic +group. -/ +noncomputable def inducedHerbrandHMinusOneEquivOfFiniteCyclic + (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) : + letI : Fintype H := Fintype.ofFinite H + HerbrandHMinusOne G + (InducedModule (B := B) H) σ ≃* + HerbrandHMinusOne H B + (subgroupGeneratorOfGenerator H σ hgen) := by + letI : Fintype H := Fintype.ofFinite H + letI : IsCyclic G := ⟨⟨σ, hgen⟩⟩ + letI : CommGroup G := IsCyclic.commGroup + have hτ : + subgroupGeneratorOfGenerator H σ hgen = + subgroupGenerator H σ := + Subtype.ext (by rfl) + rw [hτ] + exact inducedHerbrandHMinusOneEquiv H σ hgen + +end FiniteCyclicGroup + +end CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean new file mode 100644 index 0000000000..8a7665d981 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean @@ -0,0 +1,2294 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.NormalBasis +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueExtension +/-! Provides the public normal-basis lattice declarations used in Herbrand computations. -/ + +@[expose] public section + +namespace CyclicCohomology + +open LocalFieldTheory + +noncomputable +section + +universe u + +open scoped ValuativeRel +open Filter + +variable (K L : Type u) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- The `Gal(L / K)` orbit of Mathlib's normal-basis generator spans `L` over `K`. -/ +theorem normalBasisConjugates_span_eq_top : + Submodule.span K + (Set.range (fun σ : Gal(L/K) => + σ (IsGalois.normalBasis K L (1 : Gal(L/K))))) = ⊤ := by + have hset : + Set.range (fun σ : Gal(L/K) => + σ (IsGalois.normalBasis K L (1 : Gal(L/K)))) = + Set.range (IsGalois.normalBasis K L) := by + ext x + constructor + · rintro ⟨σ, rfl⟩ + exact ⟨σ, IsGalois.normalBasis_apply (K := K) (L := L) σ⟩ + · rintro ⟨σ, rfl⟩ + exact ⟨σ, (IsGalois.normalBasis_apply (K := K) (L := L) σ).symm⟩ + rw [hset] + exact (IsGalois.normalBasis K L).span_eq + +variable [ValuativeRel K] + +/-- The classical normal-basis lattice candidate `M`: the `𝒪_K`-span of the +normal-basis orbit. Bounds comparing this lattice with `𝒪_L` are deliberately +made explicit in the lattice-comparison theorems below. -/ +def chosenNormalBasisIntegerLattice : Submodule 𝒪[K] L := + Submodule.span 𝒪[K] + (Set.range (fun σ : Gal(L/K) => + σ (IsGalois.normalBasis K L (1 : Gal(L/K))))) + +/-- Public characterization of the chosen normal-basis lattice as the span of +the chosen generator's Galois orbit. -/ +theorem chosenNormalBasisIntegerLattice_eq_span : + chosenNormalBasisIntegerLattice K L = + Submodule.span 𝒪[K] + (Set.range (fun σ : Gal(L/K) => + σ (IsGalois.normalBasis K L (1 : Gal(L/K))))) := + rfl + +/-- Every normal-basis vector lies in the `𝒪_K`-span lattice `M`. -/ +theorem normalBasis_mem_integerLattice (σ : Gal(L/K)) : + IsGalois.normalBasis K L σ ∈ chosenNormalBasisIntegerLattice K L := by + rw [IsGalois.normalBasis_apply] + exact Submodule.subset_span (Set.mem_range_self σ) + +/-- Mathlib's normal-basis generator lies in the `𝒪_K`-span lattice `M`. -/ +theorem normalBasis_one_mem_integerLattice : + IsGalois.normalBasis K L (1 : Gal(L/K)) ∈ + chosenNormalBasisIntegerLattice K L := + normalBasis_mem_integerLattice (K := K) (L := L) (1 : Gal(L/K)) + +/-- After extending scalars back to `K`, the normal-basis lattice spans all of +`L`. -/ +theorem chosenNormalBasisIntegerLattice_field_span_eq_top : + Submodule.span K ((chosenNormalBasisIntegerLattice K L : Submodule 𝒪[K] L) : Set L) = + ⊤ := by + refine le_antisymm le_top ?_ + rw [← normalBasisConjugates_span_eq_top (K := K) (L := L)] + refine Submodule.span_mono ?_ + intro x hx + exact Submodule.subset_span hx + +/-- The normal-basis lattice `M` is stable under the actual `Gal(L / K)` +action. -/ +theorem galoisGroup_apply_mem_chosenNormalBasisIntegerLattice + (τ : Gal(L/K)) {x : L} + (hx : x ∈ chosenNormalBasisIntegerLattice K L) : + τ x ∈ chosenNormalBasisIntegerLattice K L := by + refine Submodule.span_induction + (p := fun x _ => τ x ∈ chosenNormalBasisIntegerLattice K L) + ?hgen ?hzero ?hadd ?hsmul hx + · intro x hx + rcases hx with ⟨σ, rfl⟩ + have hτ : + τ (σ (IsGalois.normalBasis K L (1 : Gal(L/K)))) = + IsGalois.normalBasis K L (τ * σ) := by + rw [IsGalois.normalBasis_apply (K := K) (L := L) (τ * σ)] + rfl + rw [hτ] + exact normalBasis_mem_integerLattice (K := K) (L := L) (τ * σ) + · simp + · intro x y _ _ hx hy + simpa using + (chosenNormalBasisIntegerLattice K L).add_mem hx hy + · intro a x _ hx + have ha : τ (algebraMap 𝒪[K] L a) = algebraMap 𝒪[K] L a := by + change τ (algebraMap K L (a : K)) = algebraMap K L (a : K) + exact τ.commutes (a : K) + simpa [Algebra.smul_def, ha, map_mul] using + (chosenNormalBasisIntegerLattice K L).smul_mem a hx + +/-- The normal-basis lattice `M` is finitely generated over `𝒪_K`. -/ +theorem chosenNormalBasisIntegerLattice_fg : + (chosenNormalBasisIntegerLattice K L).FG := by + dsimp [chosenNormalBasisIntegerLattice] + exact Submodule.fg_span (Set.finite_range _) + +/-- Multiplication by a base integer-ring element, as an `𝒪_K`-linear endomorphism +of the extension field. -/ +def baseIntegerScalarMulLinearMap (a : 𝒪[K]) : L →ₗ[𝒪[K]] L where + toFun x := algebraMap 𝒪[K] L a * x + map_add' := by + intro x y + rw [mul_add] + map_smul' := by + intro r x + simp [Algebra.smul_def, mul_comm, mul_left_comm] + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Evaluates the linear map given by scalar multiplication from the base integer ring. -/ +@[simp] +theorem baseIntegerScalarMulLinearMap_apply (a : 𝒪[K]) (x : L) : + baseIntegerScalarMulLinearMap K L a x = algebraMap 𝒪[K] L a * x := + rfl + +/-- The image of an `𝒪_K`-submodule under multiplication by a base +integer-ring element. -/ +def baseIntegerScalarMulSubmodule (a : 𝒪[K]) (N : Submodule 𝒪[K] L) : + Submodule 𝒪[K] L := + N.map (baseIntegerScalarMulLinearMap K L a) + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Characterizes membership in the submodule generated by base-integer scalar multiples. -/ +theorem mem_baseIntegerScalarMulSubmodule_iff + (a : 𝒪[K]) (N : Submodule 𝒪[K] L) (x : L) : + x ∈ baseIntegerScalarMulSubmodule K L a N ↔ + ∃ y : L, y ∈ N ∧ algebraMap 𝒪[K] L a * y = x := + Iff.rfl + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Scalar multiplication by base integers preserves finite generation of submodules. -/ +theorem baseIntegerScalarMulSubmodule_fg_of_fg + (a : 𝒪[K]) {N : Submodule 𝒪[K] L} (hN : N.FG) : + (baseIntegerScalarMulSubmodule K L a N).FG := + hN.map (baseIntegerScalarMulLinearMap K L a) + +variable [TopologicalSpace K] [IsNonarchimedeanLocalField K] + +/-- Multiplication of an `𝒪_K`-submodule by a power of the chosen base +uniformizer. The name deliberately records the construction's dependence on +`chosenIntegerRingUniformizer K`; no uniformizer-independence result is part of +this API. This is the concrete shape of the `π_K^n` lattices used in the local +class-field-axiom calculation. -/ +def chosenBaseUniformizerPowSubmodule (n : Nat) (N : Submodule 𝒪[K] L) : + Submodule 𝒪[K] L := + baseIntegerScalarMulSubmodule K L (chosenIntegerRingUniformizer K ^ n) N + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Characterizes membership in a chosen uniformizer-power submodule. -/ +@[simp] +theorem mem_chosenBaseUniformizerPowSubmodule_iff + (n : Nat) (N : Submodule 𝒪[K] L) (x : L) : + x ∈ chosenBaseUniformizerPowSubmodule K L n N ↔ + ∃ y : L, y ∈ N ∧ + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * y = x := + Iff.rfl + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Multiplication by a chosen uniformizer power preserves finite generation. -/ +theorem chosenBaseUniformizerPowSubmodule_fg_of_fg + (n : Nat) {N : Submodule 𝒪[K] L} (hN : N.FG) : + (chosenBaseUniformizerPowSubmodule K L n N).FG := + baseIntegerScalarMulSubmodule_fg_of_fg (K := K) (L := L) + (chosenIntegerRingUniformizer K ^ n) hN + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Increasing the base-uniformizer exponent preserves membership after +denominator clearing. -/ +theorem chosenBaseUniformizerPow_mul_mem_mono + {M : Submodule 𝒪[K] L} {m n : Nat} {x : L} (hmn : m ≤ n) + (hx : algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ m) * x ∈ M) : + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * x ∈ M := by + rcases Nat.exists_eq_add_of_le hmn with ⟨d, hd⟩ + rw [hd] + have hscaled : + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ d) * + (algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ m) * x) ∈ M := by + simpa [Algebra.smul_def, mul_assoc] using + M.smul_mem (chosenIntegerRingUniformizer K ^ d) hx + simpa [pow_add, map_mul, mul_assoc, mul_comm, mul_left_comm] using hscaled + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- The lattices `π_K^n N` form a descending filtration. -/ +theorem chosenBaseUniformizerPowSubmodule_antitone + (N : Submodule 𝒪[K] L) {m n : Nat} (hmn : m ≤ n) : + chosenBaseUniformizerPowSubmodule K L n N ≤ + chosenBaseUniformizerPowSubmodule K L m N := by + intro x hx + rcases (mem_chosenBaseUniformizerPowSubmodule_iff (K := K) (L := L) n N x).1 hx with + ⟨y, hyN, rfl⟩ + rcases Nat.exists_eq_add_of_le hmn with ⟨d, hd⟩ + refine (mem_chosenBaseUniformizerPowSubmodule_iff (K := K) (L := L) m N _).2 ?_ + refine ⟨algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ d) * y, ?_, ?_⟩ + · simpa [Algebra.smul_def, mul_assoc] using + N.smul_mem (chosenIntegerRingUniformizer K ^ d) hyN + · simp [hd, pow_add, map_mul, mul_comm, mul_left_comm] + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Successive chosen uniformizer-power submodules form a descending chain. -/ +theorem chosenBaseUniformizerPowSubmodule_succ_le + (n : Nat) (N : Submodule 𝒪[K] L) : + chosenBaseUniformizerPowSubmodule K L (n + 1) N ≤ + chosenBaseUniformizerPowSubmodule K L n N := + chosenBaseUniformizerPowSubmodule_antitone (K := K) (L := L) N (Nat.le_succ n) + +/-- Every chosen uniformizer-power normal-basis lattice is finitely generated. -/ +theorem chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_fg (n : Nat) : + (chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)).FG := + chosenBaseUniformizerPowSubmodule_fg_of_fg (K := K) (L := L) n + (chosenNormalBasisIntegerLattice_fg (K := K) (L := L)) + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- If an `𝒪_K`-submodule spans `L` after extending scalars to `K`, then every +element of `L` enters that submodule after multiplying by a high enough power +of the base prime element. The scalar-denominator step is exactly the local +DVR denominator clearing in `IdealQuotients`. -/ +theorem exists_chosenBaseUniformizerPow_mul_mem_of_field_span_eq_top + {M : Submodule 𝒪[K] L} + (hMspan : Submodule.span K ((M : Set L)) = ⊤) (x : L) : + ∃ n : Nat, algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * x ∈ M := by + have hx : x ∈ Submodule.span K ((M : Set L)) := by + rw [hMspan] + exact Submodule.mem_top + refine Submodule.span_induction + (p := fun y _ => + ∃ n : Nat, algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * y ∈ M) + ?hgen ?hzero ?hadd ?hsmul hx + · intro y hyM + refine ⟨0, ?_⟩ + simpa using hyM + · refine ⟨0, ?_⟩ + simp + · intro y z _ _ hy hz + rcases hy with ⟨m, hm⟩ + rcases hz with ⟨n, hn⟩ + refine ⟨max m n, ?_⟩ + have hy' := chosenBaseUniformizerPow_mul_mem_mono + (K := K) (L := L) (M := M) (Nat.le_max_left m n) hm + have hz' := chosenBaseUniformizerPow_mul_mem_mono + (K := K) (L := L) (M := M) (Nat.le_max_right m n) hn + simpa [mul_add] using M.add_mem hy' hz' + · intro c y _ hy + rcases hy with ⟨m, hm⟩ + obtain ⟨d, hd⟩ := exists_chosenIntegerRingUniformizer_pow_mul_mem_integerRing K c + let cInt : 𝒪[K] := + ⟨(((chosenIntegerRingUniformizer K : 𝒪[K]) : K) ^ d) * c, hd⟩ + refine ⟨d + m, ?_⟩ + have hscaled : + algebraMap 𝒪[K] L cInt * + (algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ m) * y) ∈ M := by + simpa [Algebra.smul_def, mul_assoc] using M.smul_mem cInt hm + have hcInt : + algebraMap 𝒪[K] L cInt = + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ d) * + algebraMap K L c := by + change algebraMap K L + ((((chosenIntegerRingUniformizer K : 𝒪[K]) : K) ^ d) * c) = _ + simp only [map_mul, map_pow] + rfl + rw [hcInt] at hscaled + convert hscaled using 1 + rw [Algebra.smul_def, pow_add, map_mul] + ring + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Finite-generation version of +`exists_chosenBaseUniformizerPow_mul_mem_of_field_span_eq_top`: one exponent works +for all elements of a finitely generated `𝒪_K`-submodule. -/ +theorem exists_chosenBaseUniformizerPowSubmodule_le_of_fg_of_field_span_eq_top + {M N : Submodule 𝒪[K] L} (hN : N.FG) + (hMspan : Submodule.span K ((M : Set L)) = ⊤) : + ∃ n : Nat, chosenBaseUniformizerPowSubmodule K L n N ≤ M := by + rcases Submodule.fg_def.mp hN with ⟨S, hSfinite, hSspan⟩ + let t : Finset L := hSfinite.toFinset + let nOf : L → Nat := fun y => + Classical.choose + (exists_chosenBaseUniformizerPow_mul_mem_of_field_span_eq_top + (K := K) (L := L) hMspan y) + let n : Nat := t.sup nOf + have hnOf_spec (y : L) : + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ nOf y) * y ∈ M := + Classical.choose_spec + (exists_chosenBaseUniformizerPow_mul_mem_of_field_span_eq_top + (K := K) (L := L) hMspan y) + have hpow_mono {m : Nat} {y : L} (hmn : m ≤ n) + (hy : algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ m) * y ∈ M) : + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * y ∈ M := by + rcases Nat.exists_eq_add_of_le hmn with ⟨d, hd⟩ + rw [hd] + have hscaled : + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ d) * + (algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ m) * y) ∈ M := by + simpa [Algebra.smul_def, mul_assoc] using + M.smul_mem (chosenIntegerRingUniformizer K ^ d) hy + simpa [pow_add, map_mul, mul_assoc, mul_comm, mul_left_comm] using hscaled + have hN_mem (y : L) (hyN : y ∈ N) : + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * y ∈ M := by + rw [← hSspan] at hyN + refine Submodule.span_induction + (p := fun y _ => + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * y ∈ M) + ?hgen ?hzero ?hadd ?hsmul hyN + · intro y hyS + have hyt : y ∈ t := by + exact (Set.Finite.mem_toFinset hSfinite).2 hyS + exact hpow_mono (Finset.le_sup hyt) (hnOf_spec y) + · simp + · intro y z _ _ hy hz + simpa [mul_add] using M.add_mem hy hz + · intro a y _ hy + have hscaled : + algebraMap 𝒪[K] L a * + (algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * y) ∈ M := by + simpa [Algebra.smul_def, mul_assoc] using M.smul_mem a hy + simpa [Algebra.smul_def, mul_assoc, mul_comm, mul_left_comm] using hscaled + refine ⟨n, ?_⟩ + intro z hz + rcases (mem_chosenBaseUniformizerPowSubmodule_iff (K := K) (L := L) n N z).1 hz with + ⟨y, hyN, rfl⟩ + exact hN_mem y hyN + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Product-denominator bound for multiplicative lattice control. If `N` and `P` are finitely +generated +`𝒪_K`-submodules and `M` spans `L` after inverting `𝒪_K`, then one power of the +base prime element sends every product `xy`, `x ∈ N`, `y ∈ P`, back into `M`. + +This is the multiplicative source needed before proving that `1 + π_K^n M` is +closed under multiplication for large `n`. -/ +theorem exists_chosenBaseUniformizerPow_mul_mul_mem_of_fg_of_field_span_eq_top + {M N P : Submodule 𝒪[K] L} (hN : N.FG) (hP : P.FG) + (hMspan : Submodule.span K ((M : Set L)) = ⊤) : + ∃ n : Nat, ∀ x : L, x ∈ N → ∀ y : L, y ∈ P → + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * (x * y) ∈ M := by + rcases Submodule.fg_def.mp hN with ⟨S, hSfinite, hSspan⟩ + rcases Submodule.fg_def.mp hP with ⟨T, hTfinite, hTspan⟩ + let s : Finset L := hSfinite.toFinset + let t : Finset L := hTfinite.toFinset + let pairExp : L × L → Nat := fun p => + Classical.choose + (exists_chosenBaseUniformizerPow_mul_mem_of_field_span_eq_top + (K := K) (L := L) hMspan (p.1 * p.2)) + let n : Nat := (s.product t).sup pairExp + have hpair_spec (x y : L) : + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ (pairExp (x, y))) * (x * y) ∈ M := + Classical.choose_spec + (exists_chosenBaseUniformizerPow_mul_mem_of_field_span_eq_top + (K := K) (L := L) hMspan (x * y)) + have hpow_mono {m : Nat} {z : L} (hmn : m ≤ n) + (hz : algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ m) * z ∈ M) : + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * z ∈ M := by + rcases Nat.exists_eq_add_of_le hmn with ⟨d, hd⟩ + rw [hd] + have hscaled : + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ d) * + (algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ m) * z) ∈ M := by + simpa [Algebra.smul_def, mul_assoc] using + M.smul_mem (chosenIntegerRingUniformizer K ^ d) hz + simpa [pow_add, map_mul, mul_assoc, mul_comm, mul_left_comm] using hscaled + have hgen (x y : L) (hxS : x ∈ S) (hyT : y ∈ T) : + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * (x * y) ∈ M := by + have hxs : x ∈ s := (Set.Finite.mem_toFinset hSfinite).2 hxS + have hyt : y ∈ t := (Set.Finite.mem_toFinset hTfinite).2 hyT + exact hpow_mono (Finset.le_sup (Finset.mem_product.2 ⟨hxs, hyt⟩)) + (hpair_spec x y) + have hleft (x : L) (hxS : x ∈ S) : + ∀ y : L, y ∈ P → + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * (x * y) ∈ M := by + intro y hyP + rw [← hTspan] at hyP + refine Submodule.span_induction + (p := fun y _ => + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * (x * y) ∈ M) + ?hgen ?hzero ?hadd ?hsmul hyP + · intro y hyT + exact hgen x y hxS hyT + · simp + · intro y z _ _ hy hz + simpa [mul_add] using M.add_mem hy hz + · intro a y _ hy + have hscaled : + algebraMap 𝒪[K] L a * + (algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * (x * y)) ∈ M := by + simpa [Algebra.smul_def, mul_assoc] using M.smul_mem a hy + simpa [Algebra.smul_def, mul_assoc, mul_comm, mul_left_comm] using hscaled + refine ⟨n, ?_⟩ + intro x hxN y hyP + rw [← hSspan] at hxN + refine Submodule.span_induction + (p := fun x _ => + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * (x * y) ∈ M) + ?gen ?zero ?add ?smul hxN + · intro x hxS + exact hleft x hxS y hyP + · simp + · intro x z _ _ hx hz + convert M.add_mem hx hz using 1; ring + · intro a x _ hx + have hscaled : + algebraMap 𝒪[K] L a * + (algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * (x * y)) ∈ M := by + simpa [Algebra.smul_def, mul_assoc] using M.smul_mem a hx + simpa [Algebra.smul_def, mul_assoc, mul_comm, mul_left_comm] using hscaled + +/-- A sufficiently deep uniformizer-power normal-basis lattice absorbs the indicated products. -/ +theorem exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_mul_mul_mem : + ∃ n : Nat, ∀ x : L, x ∈ chosenNormalBasisIntegerLattice K L → + ∀ y : L, y ∈ chosenNormalBasisIntegerLattice K L → + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * (x * y) ∈ + chosenNormalBasisIntegerLattice K L := + exists_chosenBaseUniformizerPow_mul_mul_mem_of_fg_of_field_span_eq_top + (K := K) (L := L) + (M := chosenNormalBasisIntegerLattice K L) + (N := chosenNormalBasisIntegerLattice K L) + (P := chosenNormalBasisIntegerLattice K L) + (chosenNormalBasisIntegerLattice_fg (K := K) (L := L)) + (chosenNormalBasisIntegerLattice_fg (K := K) (L := L)) + (chosenNormalBasisIntegerLattice_field_span_eq_top (K := K) (L := L)) + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- For sufficiently large `n`, the lattice `π_K^n M` is closed under +multiplication. It supplies the multiplicative +closure of `1 + π_K^n M` in the principal-unit lattice. -/ +theorem exists_chosenBaseUniformizerPowSubmodule_mul_mul_mem_self_of_fg_of_field_span_eq_top + {M : Submodule 𝒪[K] L} (hMfg : M.FG) + (hMspan : Submodule.span K ((M : Set L)) = ⊤) : + ∃ c : Nat, ∀ n : Nat, c ≤ n → ∀ x : L, + x ∈ chosenBaseUniformizerPowSubmodule K L n M → + ∀ y : L, y ∈ chosenBaseUniformizerPowSubmodule K L n M → + x * y ∈ chosenBaseUniformizerPowSubmodule K L n M := by + rcases exists_chosenBaseUniformizerPow_mul_mul_mem_of_fg_of_field_span_eq_top + (K := K) (L := L) (M := M) (N := M) (P := M) hMfg hMfg hMspan with + ⟨c, hc⟩ + refine ⟨c, ?_⟩ + intro n hcn x hx y hy + rcases (mem_chosenBaseUniformizerPowSubmodule_iff (K := K) (L := L) n M x).1 hx with + ⟨x0, hx0M, rfl⟩ + rcases (mem_chosenBaseUniformizerPowSubmodule_iff (K := K) (L := L) n M y).1 hy with + ⟨y0, hy0M, rfl⟩ + have hprod : + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * (x0 * y0) ∈ M := + chosenBaseUniformizerPow_mul_mem_mono (K := K) (L := L) hcn + (hc x0 hx0M y0 hy0M) + refine (mem_chosenBaseUniformizerPowSubmodule_iff (K := K) (L := L) n M _).2 ?_ + refine ⟨algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * (x0 * y0), + hprod, ?_⟩ + simp [mul_assoc, mul_comm, mul_left_comm] + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- For sufficiently large `n`, products of two elements of `π_K^n M` land in +the next lattice step `π_K^(n+1) M`. + +This is the product-depth estimate needed before the map +`V^n/V^(n+1) -> π_K^nM/π_K^(n+1)M` can be made well-defined. -/ +theorem exists_chosenBaseUniformizerPowSubmodule_mul_mul_mem_succ_of_fg_of_field_span_eq_top + {M : Submodule 𝒪[K] L} (hMfg : M.FG) + (hMspan : Submodule.span K ((M : Set L)) = ⊤) : + ∃ c : Nat, ∀ n : Nat, c ≤ n → ∀ x : L, + x ∈ chosenBaseUniformizerPowSubmodule K L n M → + ∀ y : L, y ∈ chosenBaseUniformizerPowSubmodule K L n M → + x * y ∈ chosenBaseUniformizerPowSubmodule K L (n + 1) M := by + rcases exists_chosenBaseUniformizerPow_mul_mul_mem_of_fg_of_field_span_eq_top + (K := K) (L := L) (M := M) (N := M) (P := M) hMfg hMfg hMspan with + ⟨c, hc⟩ + refine ⟨c + 1, ?_⟩ + intro n hcn x hx y hy + rcases Nat.exists_eq_add_of_le hcn with ⟨d, hd⟩ + rcases (mem_chosenBaseUniformizerPowSubmodule_iff (K := K) (L := L) n M x).1 hx with + ⟨x0, hx0M, rfl⟩ + rcases (mem_chosenBaseUniformizerPowSubmodule_iff (K := K) (L := L) n M y).1 hy with + ⟨y0, hy0M, rfl⟩ + have hprod : + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ (c + d)) * (x0 * y0) ∈ M := + chosenBaseUniformizerPow_mul_mem_mono (K := K) (L := L) + (Nat.le_add_right c d) (hc x0 hx0M y0 hy0M) + refine (mem_chosenBaseUniformizerPowSubmodule_iff (K := K) (L := L) (n + 1) M _).2 ?_ + refine ⟨algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ (c + d)) * (x0 * y0), + hprod, ?_⟩ + rw [hd] + simp only [map_mul, pow_add, pow_one] + ring + +/-- A sufficiently deep uniformizer-power normal-basis lattice is closed under +the indicated self-products. -/ +theorem exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_mul_mul_mem_self : + ∃ c : Nat, ∀ n : Nat, c ≤ n → ∀ x : L, + x ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) → + ∀ y : L, + y ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) → + x * y ∈ + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) := + exists_chosenBaseUniformizerPowSubmodule_mul_mul_mem_self_of_fg_of_field_span_eq_top + (K := K) (L := L) + (M := chosenNormalBasisIntegerLattice K L) + (chosenNormalBasisIntegerLattice_fg (K := K) (L := L)) + (chosenNormalBasisIntegerLattice_field_span_eq_top (K := K) (L := L)) + +/-- A sufficiently deep lattice sends the indicated products into the next uniformizer level. -/ +theorem exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_mul_mul_mem_succ : + ∃ c : Nat, ∀ n : Nat, c ≤ n → ∀ x : L, + x ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) → + ∀ y : L, + y ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) → + x * y ∈ + chosenBaseUniformizerPowSubmodule K L (n + 1) (chosenNormalBasisIntegerLattice K L) := + exists_chosenBaseUniformizerPowSubmodule_mul_mul_mem_succ_of_fg_of_field_span_eq_top + (K := K) (L := L) + (M := chosenNormalBasisIntegerLattice K L) + (chosenNormalBasisIntegerLattice_fg (K := K) (L := L)) + (chosenNormalBasisIntegerLattice_field_span_eq_top (K := K) (L := L)) + +omit [FiniteDimensional K L] [IsGalois K L] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +/-- Powers of an element stay in a multiplicatively closed additive lattice. + +This is the finite algebraic input to the geometric-series inverse argument; completeness + supplies the limit of these finite approximations. -/ +theorem submodule_pow_succ_mem_of_mul_closed + {E : Submodule 𝒪[K] L} + (hmul : ∀ x : L, x ∈ E → ∀ y : L, y ∈ E → x * y ∈ E) + {x : L} (hx : x ∈ E) : + ∀ m : Nat, x ^ (m + 1) ∈ E := by + intro m + induction m with + | zero => + simpa using hx + | succ m ih => + have hmul_mem : x ^ (m + 1) * x ∈ E := hmul (x ^ (m + 1)) ih x hx + simpa [pow_add, mul_assoc, mul_comm, mul_left_comm] using hmul_mem + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- The finite inverse-correction sum +`(-x) + (-x)^2 + ... + (-x)^d`. + +When `x` is topologically nilpotent and the lattice is complete, these are the +finite approximations to `(1+x)⁻¹ - 1`. -/ +def inverseCorrectionPartialSum (x : L) (d : Nat) : L := + (Finset.range d).sum fun i => (-x) ^ (i + 1) + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- The zeroth inverse-correction partial sum is its initial term. -/ +@[simp] +theorem inverseCorrectionPartialSum_zero (x : L) : + inverseCorrectionPartialSum (L := L) x 0 = 0 := by + simp [inverseCorrectionPartialSum] + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Expands the inverse-correction partial sum at a successor index. -/ +theorem inverseCorrectionPartialSum_succ (x : L) (d : Nat) : + inverseCorrectionPartialSum (L := L) x (d + 1) = + inverseCorrectionPartialSum (L := L) x d + (-x) ^ (d + 1) := by + simp [inverseCorrectionPartialSum, Finset.sum_range_succ] + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Adding `1` turns the inverse-correction sum into the usual finite +geometric sum with ratio `-x`. -/ +theorem one_add_inverseCorrectionPartialSum_eq_geom_sum (x : L) (d : Nat) : + 1 + inverseCorrectionPartialSum (L := L) x d = + (Finset.range (d + 1)).sum fun i => (-x) ^ i := by + induction d with + | zero => + simp [inverseCorrectionPartialSum] + | succ d ih => + rw [inverseCorrectionPartialSum_succ, Finset.sum_range_succ, ← ih] + simp [add_assoc] + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Finite geometric inverse identity for the approximants to `(1+x)⁻¹`. -/ +theorem one_add_mul_one_add_inverseCorrectionPartialSum (x : L) (d : Nat) : + (1 + x) * (1 + inverseCorrectionPartialSum (L := L) x d) = + 1 - (-x) ^ (d + 1) := by + rw [one_add_inverseCorrectionPartialSum_eq_geom_sum] + simpa [sub_neg_eq_add] using + (mul_neg_geom_sum (x := (-x : L)) (n := d + 1)) + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- The residual error after applying a finite inverse correction. -/ +theorem one_add_mul_one_add_inverseCorrectionPartialSum_sub_one + (x : L) (d : Nat) : + (1 + x) * (1 + inverseCorrectionPartialSum (L := L) x d) - 1 = + -((-x) ^ (d + 1)) := by + rw [one_add_mul_one_add_inverseCorrectionPartialSum] + simp [sub_eq_add_neg, add_assoc] + +omit [FiniteDimensional K L] [IsGalois K L] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +/-- Inverse-correction partial sums remain in any additive set closed under multiplication. -/ +theorem inverseCorrectionPartialSum_mem_of_mul_closed + {E : Submodule 𝒪[K] L} + (hmul : ∀ x : L, x ∈ E → ∀ y : L, y ∈ E → x * y ∈ E) + {x : L} (hx : x ∈ E) (d : Nat) : + inverseCorrectionPartialSum (L := L) x d ∈ E := by + unfold inverseCorrectionPartialSum + refine Submodule.sum_mem E ?_ + intro i _ + exact submodule_pow_succ_mem_of_mul_closed (K := K) (L := L) + hmul (E.neg_mem hx) i + +omit [FiniteDimensional K L] [IsGalois K L] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +/-- A finite inverse correction kills `1+x` modulo the same multiplicatively +closed additive lattice. -/ +theorem inverseCorrectionPartialProductError_mem_of_mul_closed + {E : Submodule 𝒪[K] L} + (hmul : ∀ x : L, x ∈ E → ∀ y : L, y ∈ E → x * y ∈ E) + {x : L} (hx : x ∈ E) (d : Nat) : + (1 + x) * (1 + inverseCorrectionPartialSum (L := L) x d) - 1 ∈ E := by + rw [one_add_mul_one_add_inverseCorrectionPartialSum_sub_one] + exact E.neg_mem + (submodule_pow_succ_mem_of_mul_closed (K := K) (L := L) + hmul (E.neg_mem hx) d) + +omit [FiniteDimensional K L] [IsGalois K L] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +/-- An additive `𝒪_K`-submodule containing a neighborhood of `0` is open. -/ +theorem submodule_isOpen_of_mem_nhds_zero + [TopologicalSpace L] [IsTopologicalAddGroup L] + {E : Submodule 𝒪[K] L} (hE : (E : Set L) ∈ nhds (0 : L)) : + IsOpen (E : Set L) := by + simpa using AddSubgroup.isOpen_of_mem_nhds E.toAddSubgroup hE + +omit [FiniteDimensional K L] [IsGalois K L] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +/-- An open additive `𝒪_K`-submodule is closed. -/ +theorem submodule_isClosed_of_isOpen + [TopologicalSpace L] [IsTopologicalAddGroup L] + {E : Submodule 𝒪[K] L} (hE : IsOpen (E : Set L)) : + IsClosed (E : Set L) := by + simpa using AddSubgroup.isClosed_of_isOpen E.toAddSubgroup hE + +omit [FiniteDimensional K L] [IsGalois K L] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +/-- A neighborhood submodule is closed in a topological additive group. -/ +theorem submodule_isClosed_of_mem_nhds_zero + [TopologicalSpace L] [IsTopologicalAddGroup L] + {E : Submodule 𝒪[K] L} (hE : (E : Set L) ∈ nhds (0 : L)) : + IsClosed (E : Set L) := + submodule_isClosed_of_isOpen (K := K) (L := L) + (submodule_isOpen_of_mem_nhds_zero (K := K) (L := L) hE) + +omit [FiniteDimensional K L] [IsGalois K L] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] in +/-- If every term of a convergent sequence lies in a closed submodule, then the +limit lies in that submodule. -/ +theorem submodule_mem_of_tendsto_of_forall_mem_of_closed + [TopologicalSpace L] {E : Submodule 𝒪[K] L} {f : Nat → L} {x : L} + (hclosed : IsClosed (E : Set L)) (hf : Tendsto f atTop (nhds x)) + (hmem : ∀ d : Nat, f d ∈ E) : + x ∈ E := by + exact hclosed.mem_of_tendsto hf (Eventually.of_forall hmem) + +variable [ValuativeRel L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Under a valuation extension, the chosen base prime element maps into the +maximal ideal of the extension valuation ring. -/ +theorem integerRingMap_uniformizer_mem_maximalIdeal_of_valuationExtension : + integerRingMapOfValuationExtension K L (chosenIntegerRingUniformizer K) ∈ + (𝓂[L] : Ideal 𝒪[L]) := by + have hπK : + chosenIntegerRingUniformizer K ∈ (𝓂[K] : Ideal 𝒪[K]) := by + rw [chosenIntegerRingUniformizer_maximalIdeal_eq K] + exact Ideal.subset_span (Set.mem_singleton (chosenIntegerRingUniformizer K)) + exact (Valuation.HasExtension.algebraMap_mem_maximalIdeal_iff + (ValuativeRel.valuation K) (ValuativeRel.valuation L)).2 hπK + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Extension-field denominator clearing by powers of the base prime element. + +For any `x : L`, a sufficiently high power of the chosen prime element of +`𝒪[K]`, mapped to `L`, sends `x` into `𝒪[L]`. This is the denominator-clearing input used + before comparing the normal-basis lattice with `𝒪_L`: it uses only the +DVR structure of `𝒪_L` and the fact that the image of the base prime lies in +`𝓂_L`. -/ +theorem exists_chosenBaseUniformizerPow_mul_mem_integerRing_of_valuationExtension + [TopologicalSpace L] [IsNonarchimedeanLocalField L] (x : L) : + ∃ n : Nat, + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * x ∈ 𝒪[L] := by + obtain ⟨a, b, hb, hfrac⟩ := IsFractionRing.div_surjective (A := 𝒪[L]) x + have hb_ne : b ≠ 0 := nonZeroDivisors.ne_zero hb + obtain ⟨m, ub, hb_factor⟩ := + IsDiscreteValuationRing.eq_unit_mul_pow_irreducible hb_ne + (chosenIntegerRingUniformizer_irreducible L) + refine ⟨m, ?_⟩ + let πK_L : 𝒪[L] := + integerRingMapOfValuationExtension K L (chosenIntegerRingUniformizer K) + have hπK_L_mem : πK_L ∈ (𝓂[L] : Ideal 𝒪[L]) := by + dsimp [πK_L] + exact integerRingMap_uniformizer_mem_maximalIdeal_of_valuationExtension + (K := K) (L := L) + have hπK_L_pow_mem : πK_L ^ m ∈ (𝓂[L] ^ m : Ideal 𝒪[L]) := + Ideal.pow_mem_pow hπK_L_mem m + have hπK_L_span : + πK_L ^ m ∈ + Ideal.span ({chosenIntegerRingUniformizer L ^ m} : Set 𝒪[L]) := by + simpa [maximalIdeal_pow_eq_span_uniformizer_pow L m] using hπK_L_pow_mem + rcases Ideal.mem_span_singleton'.mp hπK_L_span with ⟨c, hc⟩ + rw [← hfrac, hb_factor] + have hϖL_ne : (((chosenIntegerRingUniformizer L : 𝒪[L]) : L)) ≠ 0 := by + intro h + exact (chosenIntegerRingUniformizer_irreducible L).ne_zero + ((IsFractionRing.injective 𝒪[L] L) h) + have hϖL_pow_ne : + (((chosenIntegerRingUniformizer L : 𝒪[L]) : L) ^ m) ≠ 0 := + pow_ne_zero m hϖL_ne + have hub_ne : (((ub : 𝒪[L]) : L)) ≠ 0 := by + intro h + exact ub.ne_zero ((IsFractionRing.injective 𝒪[L] L) h) + have hub_inv : + (((↑ub⁻¹ : 𝒪[L]) : L)) = (((ub : 𝒪[L]) : L))⁻¹ := by + exact map_units_inv (algebraMap 𝒪[L] L) ub + have hbase : + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ m) = + ((πK_L ^ m : 𝒪[L]) : L) := by + dsimp [πK_L, integerRingMapOfValuationExtension] + simp only [map_pow] + change (algebraMap K L ((chosenIntegerRingUniformizer K : 𝒪[K]) : K)) ^ m = + (algebraMap K L ((chosenIntegerRingUniformizer K : 𝒪[K]) : K)) ^ m + rfl + change algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ m) * + ((a : L) / + (((ub : 𝒪[L]) * chosenIntegerRingUniformizer L ^ m : 𝒪[L]) : L)) ∈ 𝒪[L] + rw [hbase] + have hclear : + ((πK_L ^ m : 𝒪[L]) : L) * + ((a : L) / + (((ub : 𝒪[L]) * chosenIntegerRingUniformizer L ^ m : 𝒪[L]) : L)) = + ((c * ↑ub⁻¹ * a : 𝒪[L]) : L) := by + calc + ((πK_L ^ m : 𝒪[L]) : L) * + ((a : L) / + (((ub : 𝒪[L]) * chosenIntegerRingUniformizer L ^ m : 𝒪[L]) : L)) + = + ((c * chosenIntegerRingUniformizer L ^ m : 𝒪[L]) : L) * + ((a : L) / + (((ub : 𝒪[L]) * chosenIntegerRingUniformizer L ^ m : 𝒪[L]) : L)) := by + rw [← hc] + _ = ((c : L) * (((ub : 𝒪[L]) : L))⁻¹ * (a : L)) := by + change + ((c : L) * (((chosenIntegerRingUniformizer L : 𝒪[L]) : L) ^ m)) * + ((a : L) / + (((ub : 𝒪[L]) : L) * + (((chosenIntegerRingUniformizer L : 𝒪[L]) : L) ^ m))) = + (c : L) * (((ub : 𝒪[L]) : L))⁻¹ * (a : L) + field_simp [hub_ne, hϖL_pow_ne] + _ = ((c * ↑ub⁻¹ * a : 𝒪[L]) : L) := by + rw [← hub_inv] + simp [mul_assoc] + rw [hclear] + exact (c * ↑ub⁻¹ * a : 𝒪[L]).2 + +/-- The inclusion `𝒪_L -> L` as an `𝒪_K`-linear map, using the valuation-extension +map `𝒪_K -> 𝒪_L` for the scalar action. -/ +def integerRingToFieldLinearMap : 𝒪[L] →ₗ[𝒪[K]] L where + toFun x := (x : L) + map_add' := by + intro x y + rfl + map_smul' := by + intro a x + rfl + +/-- The valuation integer ring of `L`, viewed as an `𝒪_K`-submodule of `L`. +This is the `𝒪_L` lattice compared with the normal-basis lattice. -/ +def integerRingFieldSubmodule : Submodule 𝒪[K] L where + carrier := {x | x ∈ 𝒪[L]} + zero_mem' := by + change (0 : L) ∈ 𝒪[L] + exact zero_mem _ + add_mem' := by + intro x y hx hy + change x + y ∈ 𝒪[L] + exact add_mem hx hy + smul_mem' := by + intro a x hx + change a • x ∈ 𝒪[L] + rw [Algebra.smul_def] + have ha : algebraMap 𝒪[K] L a ∈ 𝒪[L] := by + change algebraMap K L (a : K) ∈ 𝒪[L] + exact (integerRingMapOfValuationExtension K L a).2 + exact mul_mem ha hx + +omit [FiniteDimensional K L] [IsGalois K L] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] in +/-- Characterizes the field elements lying in the embedded integer-ring submodule. -/ +@[simp] +theorem mem_integerRingFieldSubmodule_iff (x : L) : + x ∈ integerRingFieldSubmodule K L ↔ x ∈ 𝒪[L] := + Iff.rfl + +omit [FiniteDimensional K L] [IsGalois K L] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] in +/-- Every integer-ring element lies in the corresponding field submodule. -/ +theorem integerRing_mem_integerRingFieldSubmodule (x : 𝒪[L]) : + (x : L) ∈ integerRingFieldSubmodule K L := + x.2 + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- A base-uniformizer multiple of `𝒪_L` is a zero-neighborhood in `L`. -/ +theorem chosenBaseUniformizerPow_integerRingFieldSubmodule_mem_nhds_zero + [TopologicalSpace L] [IsNonarchimedeanLocalField L] (m : Nat) : + ((chosenBaseUniformizerPowSubmodule K L m + (integerRingFieldSubmodule K L) : Set L)) ∈ nhds (0 : L) := by + let a : L := algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ m) + have hπ_ne : (chosenIntegerRingUniformizer K ^ m : 𝒪[K]) ≠ 0 := + pow_ne_zero m (chosenIntegerRingUniformizer_irreducible K).ne_zero + have ha_ne : a ≠ 0 := by + dsimp [a] + change algebraMap K L ((chosenIntegerRingUniformizer K ^ m : 𝒪[K]) : K) ≠ 0 + apply (map_ne_zero (algebraMap K L)).2 + intro h + exact hπ_ne ((IsFractionRing.injective 𝒪[K] K) h) + have ha_val_pos : 0 < ValuativeRel.valuation L a := by + exact (ValuativeRel.valuation L).pos_iff.2 ha_ne + let γ : (ValuativeRel.ValueGroupWithZero L)ˣ := + Units.mk0 (ValuativeRel.valuation L a) (ne_of_gt ha_val_pos) + refine Filter.mem_of_superset + ((IsValuativeTopology.hasBasis_nhds_zero L).mem_of_mem (i := γ) trivial) ?_ + intro x hx + refine (mem_chosenBaseUniformizerPowSubmodule_iff + (K := K) (L := L) m (integerRingFieldSubmodule K L) x).2 ?_ + refine ⟨a⁻¹ * x, ?_, ?_⟩ + · rw [mem_integerRingFieldSubmodule_iff] + rw [Valuation.mem_integer_iff] + have hxle : ValuativeRel.valuation L x ≤ ValuativeRel.valuation L a := le_of_lt hx + have hval : + ValuativeRel.valuation L (a⁻¹ * x) = + (ValuativeRel.valuation L a)⁻¹ * ValuativeRel.valuation L x := by + simp [map_mul] + rw [hval] + exact (inv_mul_le_one₀ ha_val_pos).2 hxle + · change a * (a⁻¹ * x) = x + rw [← mul_assoc, mul_inv_cancel₀ ha_ne, one_mul] + +omit [FiniteDimensional K L] [IsGalois K L] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] in +/-- The maximal ideal `𝓂_L`, viewed inside `L` as an `𝒪_K`-submodule. -/ +def maximalIdealFieldSubmodule : Submodule 𝒪[K] L where + carrier := {x | ∃ a : 𝒪[L], a ∈ (𝓂[L] : Ideal 𝒪[L]) ∧ (a : L) = x} + zero_mem' := by + refine ⟨0, by simp, by simp⟩ + add_mem' := by + intro x y hx hy + rcases hx with ⟨a, ha, rfl⟩ + rcases hy with ⟨b, hb, rfl⟩ + refine ⟨a + b, (𝓂[L] : Ideal 𝒪[L]).add_mem ha hb, by simp⟩ + smul_mem' := by + intro c x hx + rcases hx with ⟨a, ha, rfl⟩ + refine ⟨integerRingMapOfValuationExtension K L c * a, ?_, ?_⟩ + · exact Ideal.mul_mem_left _ (integerRingMapOfValuationExtension K L c) ha + · change ((integerRingMapOfValuationExtension K L c : 𝒪[L]) : L) * (a : L) = + c • (a : L) + rw [Algebra.smul_def] + congr 1 + +omit [FiniteDimensional K L] [IsGalois K L] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] in +/-- Characterizes membership in the field submodule induced by the maximal ideal. -/ +@[simp] +theorem mem_maximalIdealFieldSubmodule_iff (x : L) : + x ∈ maximalIdealFieldSubmodule K L ↔ + ∃ a : 𝒪[L], a ∈ (𝓂[L] : Ideal 𝒪[L]) ∧ (a : L) = x := + Iff.rfl + +omit [FiniteDimensional K L] [IsGalois K L] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] in +/-- The maximal-ideal field submodule is contained in the integer-ring field submodule. -/ +theorem maximalIdealFieldSubmodule_le_integerRingFieldSubmodule : + maximalIdealFieldSubmodule K L ≤ integerRingFieldSubmodule K L := by + intro x hx + rcases (mem_maximalIdealFieldSubmodule_iff (K := K) (L := L) x).1 hx with + ⟨a, _, rfl⟩ + exact integerRing_mem_integerRingFieldSubmodule (K := K) (L := L) a + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- A finitely generated `𝒪_K`-submodule of `L` is sent into `𝒪_L` after +multiplication by a single sufficiently high power of the base prime element. + +This proves the `π_K^b N ≤ 𝒪_L` first direction of the lattice-bound statement for +any finitely generated `N`; applying it to the normal-basis lattice gives the +needed denominator bound for `M`. -/ +theorem exists_chosenBaseUniformizerPowSubmodule_le_integerRingFieldSubmodule_of_fg + [TopologicalSpace L] [IsNonarchimedeanLocalField L] + {N : Submodule 𝒪[K] L} (hN : N.FG) : + ∃ n : Nat, + chosenBaseUniformizerPowSubmodule K L n N ≤ integerRingFieldSubmodule K L := by + rcases Submodule.fg_def.mp hN with ⟨S, hSfinite, hSspan⟩ + let t : Finset L := hSfinite.toFinset + let nOf : L → Nat := fun y => + Classical.choose + (exists_chosenBaseUniformizerPow_mul_mem_integerRing_of_valuationExtension + (K := K) (L := L) y) + let n : Nat := t.sup nOf + have hnOf_spec (y : L) : + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ nOf y) * y ∈ 𝒪[L] := + Classical.choose_spec + (exists_chosenBaseUniformizerPow_mul_mem_integerRing_of_valuationExtension + (K := K) (L := L) y) + have hpow_mono {m : Nat} {y : L} (hmn : m ≤ n) + (hy : algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ m) * y ∈ 𝒪[L]) : + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * y ∈ 𝒪[L] := by + rcases Nat.exists_eq_add_of_le hmn with ⟨d, hd⟩ + have hd_mem : + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ d) ∈ 𝒪[L] := by + change algebraMap K L ((chosenIntegerRingUniformizer K ^ d : 𝒪[K]) : K) ∈ 𝒪[L] + exact (integerRingMapOfValuationExtension K L + (chosenIntegerRingUniformizer K ^ d)).2 + rw [hd] + rw [pow_add, map_mul] + simpa [mul_assoc, mul_comm, mul_left_comm] using mul_mem hd_mem hy + have hN_mem (y : L) (hyN : y ∈ N) : + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * y ∈ 𝒪[L] := by + rw [← hSspan] at hyN + refine Submodule.span_induction + (p := fun y _ => + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ n) * y ∈ 𝒪[L]) + ?hgen ?hzero ?hadd ?hsmul hyN + · intro y hyS + have hyt : y ∈ t := by + exact (Set.Finite.mem_toFinset hSfinite).2 hyS + exact hpow_mono (Finset.le_sup hyt) (hnOf_spec y) + · simp + · intro y z _ _ hy hz + simpa [mul_add] using add_mem hy hz + · intro a y _ hy + have ha_mem : algebraMap 𝒪[K] L a ∈ 𝒪[L] := by + change algebraMap K L (a : K) ∈ 𝒪[L] + exact (integerRingMapOfValuationExtension K L a).2 + simpa [Algebra.smul_def, mul_assoc, mul_comm, mul_left_comm] using + mul_mem ha_mem hy + refine ⟨n, ?_⟩ + intro z hz + rcases (mem_chosenBaseUniformizerPowSubmodule_iff (K := K) (L := L) n N z).1 hz with + ⟨y, hyN, rfl⟩ + exact hN_mem y hyN + +/-- Some uniformizer-power normal-basis lattice lies inside the integer-ring field submodule. -/ +theorem exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_integerRingFieldSubmodule + [TopologicalSpace L] [IsNonarchimedeanLocalField L] : + ∃ n : Nat, + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) ≤ + integerRingFieldSubmodule K L := + exists_chosenBaseUniformizerPowSubmodule_le_integerRingFieldSubmodule_of_fg + (K := K) (L := L) (chosenNormalBasisIntegerLattice_fg (K := K) (L := L)) + +omit [FiniteDimensional K L] [IsGalois K L] [ValuativeRel L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- Multiplying an existing containment by a further base-uniformizer power. -/ +theorem chosenBaseUniformizerPowSubmodule_add_le_chosenBaseUniformizerPowSubmodule_of_le + {N M : Submodule 𝒪[K] L} {a n : Nat} + (h : chosenBaseUniformizerPowSubmodule K L a N ≤ M) : + chosenBaseUniformizerPowSubmodule K L (a + n) N ≤ + chosenBaseUniformizerPowSubmodule K L n M := by + intro x hx + rcases (mem_chosenBaseUniformizerPowSubmodule_iff (K := K) (L := L) (a + n) N x).1 hx with + ⟨y, hyN, rfl⟩ + refine (mem_chosenBaseUniformizerPowSubmodule_iff (K := K) (L := L) n M _).2 ?_ + refine ⟨algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ a) * y, ?_, ?_⟩ + · exact h ((mem_chosenBaseUniformizerPowSubmodule_iff (K := K) (L := L) a N _).2 + ⟨y, hyN, rfl⟩) + · simp [pow_add, map_mul, mul_assoc, mul_comm] + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- If `π_K^b N` is integral, then `π_K^(b+1) N` lands in the maximal ideal of +`𝒪_L`. -/ +theorem + chosenBaseUniformizerPow_succ_le_maximalIdeal_of_le_integerRing + {N : Submodule 𝒪[K] L} {b : Nat} + (hb : chosenBaseUniformizerPowSubmodule K L b N ≤ integerRingFieldSubmodule K L) : + chosenBaseUniformizerPowSubmodule K L (b + 1) N ≤ + maximalIdealFieldSubmodule K L := by + intro x hx + rcases (mem_chosenBaseUniformizerPowSubmodule_iff (K := K) (L := L) (b + 1) N x).1 hx with + ⟨y, hyN, rfl⟩ + have hby : + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ b) * y ∈ + integerRingFieldSubmodule K L := by + exact hb ((mem_chosenBaseUniformizerPowSubmodule_iff (K := K) (L := L) b N _).2 + ⟨y, hyN, rfl⟩) + have hby_int : + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ b) * y ∈ 𝒪[L] := + (mem_integerRingFieldSubmodule_iff (K := K) (L := L) + (algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ b) * y)).1 hby + let z : 𝒪[L] := + ⟨algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ b) * y, hby_int⟩ + let πL : 𝒪[L] := + integerRingMapOfValuationExtension K L (chosenIntegerRingUniformizer K) + have hπL : πL ∈ (𝓂[L] : Ideal 𝒪[L]) := by + dsimp [πL] + exact integerRingMap_uniformizer_mem_maximalIdeal_of_valuationExtension + (K := K) (L := L) + refine (mem_maximalIdealFieldSubmodule_iff (K := K) (L := L) _).2 ?_ + refine ⟨πL * z, Ideal.mul_mem_right z _ hπL, ?_⟩ + dsimp [πL, z] + change algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K) * + (algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ b) * y) = + algebraMap 𝒪[K] L (chosenIntegerRingUniformizer K ^ (b + 1)) * y + simp [pow_add, map_mul, mul_comm, mul_left_comm] + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- A finitely generated submodule has a sufficiently deep uniformizer multiple +inside the maximal ideal. -/ +theorem exists_chosenBaseUniformizerPowSubmodule_le_maximalIdealFieldSubmodule_of_fg + [TopologicalSpace L] [IsNonarchimedeanLocalField L] + {N : Submodule 𝒪[K] L} (hN : N.FG) : + ∃ n : Nat, + chosenBaseUniformizerPowSubmodule K L n N ≤ maximalIdealFieldSubmodule K L := by + rcases exists_chosenBaseUniformizerPowSubmodule_le_integerRingFieldSubmodule_of_fg + (K := K) (L := L) hN with + ⟨b, hb⟩ + exact ⟨b + 1, + chosenBaseUniformizerPow_succ_le_maximalIdeal_of_le_integerRing + (K := K) (L := L) hb⟩ + +/-- Some uniformizer-power normal-basis lattice lies inside the maximal-ideal field submodule. -/ +theorem + exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_maximalIdealFieldSubmodule + [TopologicalSpace L] [IsNonarchimedeanLocalField L] : + ∃ n : Nat, + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) ≤ + maximalIdealFieldSubmodule K L := + exists_chosenBaseUniformizerPowSubmodule_le_maximalIdealFieldSubmodule_of_fg + (K := K) (L := L) (chosenNormalBasisIntegerLattice_fg (K := K) (L := L)) + +/-- A sufficiently deep normal-basis lattice lies in the maximal ideal and is +multiplicatively closed. -/ +theorem + exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_maximalIdeal_and_mul_closed + [TopologicalSpace L] [IsNonarchimedeanLocalField L] : + ∃ c : Nat, ∀ n : Nat, c ≤ n → + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) ≤ + maximalIdealFieldSubmodule K L ∧ + ∀ x : L, + x ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) → + ∀ y : L, + y ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) → + x * y ∈ + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) := by + rcases + exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_maximalIdealFieldSubmodule + (K := K) (L := L) with + ⟨d, hd⟩ + rcases exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_mul_mul_mem_self + (K := K) (L := L) with + ⟨c, hc⟩ + refine ⟨max c d, ?_⟩ + intro n hmaxn + have hcn : c ≤ n := le_trans (le_max_left c d) hmaxn + have hdn : d ≤ n := le_trans (le_max_right c d) hmaxn + constructor + · exact (chosenBaseUniformizerPowSubmodule_antitone + (K := K) (L := L) (chosenNormalBasisIntegerLattice K L) hdn).trans hd + · exact hc n hcn + +/-- The actual carrier of the classical auxiliary principal-unit lattice +`V^n = 1 + π_K^n M`, viewed as a set of units of `𝒪_L`. + +This set becomes a subgroup once inverse closure is supplied by the complete +geometric-series argument. -/ +def chosenNormalBasisPrincipalUnitSet (n : Nat) : Set 𝒪[L]ˣ := + {u | ((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) ∈ + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)} + +omit [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- Characterizes membership in the principal-unit set arising from a normal-basis lattice. -/ +@[simp] +theorem mem_chosenNormalBasisPrincipalUnitSet_iff (n : Nat) (u : 𝒪[L]ˣ) : + u ∈ chosenNormalBasisPrincipalUnitSet K L n ↔ + ((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) ∈ + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) := + Iff.rfl + +omit [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- The identity belongs to the chosen normal-basis principal-unit set. -/ +theorem chosenNormalBasisPrincipalUnitSet_one_mem (n : Nat) : + (1 : 𝒪[L]ˣ) ∈ chosenNormalBasisPrincipalUnitSet K L n := by + rw [mem_chosenNormalBasisPrincipalUnitSet_iff] + simp + +omit [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- The chosen normal-basis principal-unit set is closed under multiplication. -/ +theorem chosenNormalBasisPrincipalUnitSet_mul_mem {n : Nat} + (hmul : ∀ x : L, + x ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) → + ∀ y : L, + y ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) → + x * y ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)) + {u v : 𝒪[L]ˣ} + (hu : u ∈ chosenNormalBasisPrincipalUnitSet K L n) + (hv : v ∈ chosenNormalBasisPrincipalUnitSet K L n) : + u * v ∈ chosenNormalBasisPrincipalUnitSet K L n := by + let E : Submodule 𝒪[K] L := + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) + let x : L := ((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) + let y : L := ((((v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) + have hx : x ∈ E := hu + have hy : y ∈ E := hv + have hxy : x * y ∈ E := hmul x hx y hy + have hsum : x * y + x + y ∈ E := by + exact E.add_mem (E.add_mem hxy hx) hy + have hunit : + ((((u * v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) = x * y + x + y := by + have h := + congrArg (fun z : 𝒪[L] => (z : L)) (unit_mul_sub_one_eq L u v) + simpa [x, y, map_add, map_mul, mul_assoc, mul_comm, mul_left_comm, + add_assoc, add_comm, add_left_comm] using h + rw [mem_chosenNormalBasisPrincipalUnitSet_iff] + rw [hunit] + exact hsum + +/-- Every chosen normal-basis principal unit belongs to the first principal-unit group. -/ +theorem chosenNormalBasisPrincipalUnitSet_mem_principalUnits_one {n : Nat} + (hle : chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) ≤ + maximalIdealFieldSubmodule K L) + {u : 𝒪[L]ˣ} (hu : u ∈ chosenNormalBasisPrincipalUnitSet K L n) : + u ∈ principalUnits L 1 := by + rw [mem_principalUnits_iff] + have hmax : + ((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) ∈ + maximalIdealFieldSubmodule K L := + hle hu + rcases (mem_maximalIdealFieldSubmodule_iff (K := K) (L := L) + ((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L)).1 hmax with + ⟨a, ha, haeq⟩ + have ha_eq : a = ((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 := + Subtype.ext haeq + simpa [ha_eq] using ha + +/-- There is a multiplicatively closed normal-basis principal-unit set inside +the first principal-unit group. -/ +theorem exists_chosenNormalBasisPrincipalUnitSet_mul_closed_le_principalUnits_one + [TopologicalSpace L] [IsNonarchimedeanLocalField L] : + ∃ c : Nat, ∀ n : Nat, c ≤ n → + (∀ u : 𝒪[L]ˣ, u ∈ chosenNormalBasisPrincipalUnitSet K L n → + ∀ v : 𝒪[L]ˣ, v ∈ chosenNormalBasisPrincipalUnitSet K L n → + u * v ∈ chosenNormalBasisPrincipalUnitSet K L n) ∧ + ∀ u : 𝒪[L]ˣ, u ∈ chosenNormalBasisPrincipalUnitSet K L n → + u ∈ principalUnits L 1 := by + rcases + exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_maximalIdeal_and_mul_closed + (K := K) (L := L) with + ⟨c, hc⟩ + refine ⟨c, ?_⟩ + intro n hcn + rcases hc n hcn with ⟨hle, hmul⟩ + constructor + · intro u hu v hv + exact chosenNormalBasisPrincipalUnitSet_mul_mem (K := K) (L := L) hmul hu hv + · intro u hu + exact chosenNormalBasisPrincipalUnitSet_mem_principalUnits_one + (K := K) (L := L) hle hu + +omit [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- The inverse-correction partial sums remain in the lattice underlying the principal-unit set. -/ +theorem chosenNormalBasisPrincipalUnitSet_inverseCorrectionPartialSum_mem {n : Nat} + (hmul : ∀ x : L, + x ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) → + ∀ y : L, + y ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) → + x * y ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)) + {u : 𝒪[L]ˣ} (hu : u ∈ chosenNormalBasisPrincipalUnitSet K L n) (d : Nat) : + inverseCorrectionPartialSum (L := L) + ((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) d ∈ + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) := + inverseCorrectionPartialSum_mem_of_mul_closed (K := K) (L := L) hmul hu d + +omit [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- A suitable normal-basis principal-unit set contains every inverse-correction partial sum. -/ +theorem exists_chosenNormalBasisPrincipalUnitSet_inverseCorrectionPartialSum_mem : + ∃ c : Nat, ∀ n : Nat, c ≤ n → + ∀ u : 𝒪[L]ˣ, u ∈ chosenNormalBasisPrincipalUnitSet K L n → ∀ d : Nat, + inverseCorrectionPartialSum (L := L) + ((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) d ∈ + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) := by + rcases exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_mul_mul_mem_self + (K := K) (L := L) with + ⟨c, hc⟩ + refine ⟨c, ?_⟩ + intro n hcn u hu d + exact chosenNormalBasisPrincipalUnitSet_inverseCorrectionPartialSum_mem + (K := K) (L := L) (hc n hcn) hu d + +omit [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- The inverse-correction product error remains in the chosen lattice. -/ +theorem chosenNormalBasisPrincipalUnitSet_inverseCorrectionPartialProductError_mem {n : Nat} + (hmul : ∀ x : L, + x ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) → + ∀ y : L, + y ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) → + x * y ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)) + {u : 𝒪[L]ˣ} (hu : u ∈ chosenNormalBasisPrincipalUnitSet K L n) (d : Nat) : + (((u : 𝒪[L]ˣ) : 𝒪[L]) : L) * + (1 + inverseCorrectionPartialSum (L := L) + ((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) d) - 1 ∈ + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) := by + let E : Submodule 𝒪[K] L := + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) + let x : L := ((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) + have hx : x ∈ E := hu + have herror : + (1 + x) * (1 + inverseCorrectionPartialSum (L := L) x d) - 1 ∈ E := + inverseCorrectionPartialProductError_mem_of_mul_closed + (K := K) (L := L) hmul hx d + have hu_eq : 1 + x = (((u : 𝒪[L]ˣ) : 𝒪[L]) : L) := by + simp [x] + simpa [E, x, hu_eq] using herror + +omit [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- A suitable normal-basis principal-unit set contains every inverse-correction product error. -/ +theorem exists_chosenNormalBasisPrincipalUnitSet_inverseCorrectionPartialProductError_mem : + ∃ c : Nat, ∀ n : Nat, c ≤ n → + ∀ u : 𝒪[L]ˣ, u ∈ chosenNormalBasisPrincipalUnitSet K L n → ∀ d : Nat, + (((u : 𝒪[L]ˣ) : 𝒪[L]) : L) * + (1 + inverseCorrectionPartialSum (L := L) + ((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) d) - 1 ∈ + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) := by + rcases exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_mul_mul_mem_self + (K := K) (L := L) with + ⟨c, hc⟩ + refine ⟨c, ?_⟩ + intro n hcn u hu d + exact chosenNormalBasisPrincipalUnitSet_inverseCorrectionPartialProductError_mem + (K := K) (L := L) (hc n hcn) hu d + +/-- Successive powers of the negative deviation from one converge to zero. -/ +theorem chosenNormalBasisPrincipalUnitSet_neg_sub_one_pow_succ_tendsto_zero + [TopologicalSpace L] [IsNonarchimedeanLocalField L] {n : Nat} + (hle : chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) ≤ + maximalIdealFieldSubmodule K L) + {u : 𝒪[L]ˣ} (hu : u ∈ chosenNormalBasisPrincipalUnitSet K L n) : + Tendsto + (fun d : Nat => (-(((u : 𝒪[L]ˣ) : 𝒪[L]) - 1)) ^ (d + 1)) + atTop (nhds (0 : 𝒪[L])) := by + have hu_one : u ∈ principalUnits L 1 := + chosenNormalBasisPrincipalUnitSet_mem_principalUnits_one + (K := K) (L := L) hle hu + have hpow : + (((u : 𝒪[L]ˣ) : 𝒪[L]) - 1) ∈ (𝓂[L] ^ 1 : Ideal 𝒪[L]) := + (mem_principalUnits_iff L u 1).1 hu_one + have hmax : + (((u : 𝒪[L]ˣ) : 𝒪[L]) - 1) ∈ (𝓂[L] : Ideal 𝒪[L]) := by + simpa [pow_one] using hpow + exact tendsto_neg_pow_succ_of_mem_maximalIdeal L hmax + +/-- A suitable normal-basis principal-unit set has powers of the negative +deviation converging to zero. -/ +theorem exists_chosenNormalBasisPrincipalUnitSet_neg_sub_one_pow_succ_tendsto_zero + [TopologicalSpace L] [IsNonarchimedeanLocalField L] : + ∃ c : Nat, ∀ n : Nat, c ≤ n → + ∀ u : 𝒪[L]ˣ, u ∈ chosenNormalBasisPrincipalUnitSet K L n → + Tendsto + (fun d : Nat => (-(((u : 𝒪[L]ˣ) : 𝒪[L]) - 1)) ^ (d + 1)) + atTop (nhds (0 : 𝒪[L])) := by + rcases + exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_maximalIdealFieldSubmodule + (K := K) (L := L) with + ⟨c, hc⟩ + refine ⟨c, ?_⟩ + intro n hcn u hu + have hle : + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) ≤ + maximalIdealFieldSubmodule K L := + (chosenBaseUniformizerPowSubmodule_antitone + (K := K) (L := L) (m := c) (n := n) + (chosenNormalBasisIntegerLattice K L) hcn).trans hc + exact chosenNormalBasisPrincipalUnitSet_neg_sub_one_pow_succ_tendsto_zero + (K := K) (L := L) hle hu + +/-- The inverse-correction partial products converge to one. -/ +theorem chosenNormalBasisPrincipalUnitSet_inverseCorrectionProduct_tendsto_one + [TopologicalSpace L] [IsNonarchimedeanLocalField L] {n : Nat} + (hle : chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) ≤ + maximalIdealFieldSubmodule K L) + {u : 𝒪[L]ˣ} (hu : u ∈ chosenNormalBasisPrincipalUnitSet K L n) : + Tendsto + (fun d : Nat => + (((u : 𝒪[L]ˣ) : 𝒪[L]) : L) * + (1 + inverseCorrectionPartialSum (L := L) + ((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) d)) + atTop (nhds (1 : L)) := by + let x𝒪 : 𝒪[L] := ((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 + let x : L := (x𝒪 : L) + have hres𝒪 : + Tendsto (fun d : Nat => (-x𝒪) ^ (d + 1)) atTop (nhds (0 : 𝒪[L])) := by + simpa [x𝒪] using + chosenNormalBasisPrincipalUnitSet_neg_sub_one_pow_succ_tendsto_zero + (K := K) (L := L) hle hu + have hresL : + Tendsto (fun d : Nat => ((((-x𝒪) ^ (d + 1) : 𝒪[L]) : L))) + atTop (nhds (0 : L)) := + (continuous_subtype_val.tendsto (0 : 𝒪[L])).comp hres𝒪 + have htarget : + Tendsto (fun d : Nat => (1 : L) - ((((-x𝒪) ^ (d + 1) : 𝒪[L]) : L))) + atTop (nhds (1 : L)) := by + simpa using (tendsto_const_nhds (x := (1 : L))).sub hresL + refine htarget.congr' (Eventually.of_forall ?_) + intro d + have hgeom : + (1 + x) * (1 + inverseCorrectionPartialSum (L := L) x d) = + 1 - (-x) ^ (d + 1) := + one_add_mul_one_add_inverseCorrectionPartialSum (L := L) x d + have hu_eq : 1 + x = (((u : 𝒪[L]ˣ) : 𝒪[L]) : L) := by + simp [x, x𝒪] + simpa [x, x𝒪, hu_eq] using hgeom.symm + +/-- One plus the inverse correction converges to the multiplicative inverse. -/ +theorem chosenNormalBasisPrincipalUnitSet_one_add_inverseCorrection_tendsto_inv + [TopologicalSpace L] [IsNonarchimedeanLocalField L] {n : Nat} + (hle : chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) ≤ + maximalIdealFieldSubmodule K L) + {u : 𝒪[L]ˣ} (hu : u ∈ chosenNormalBasisPrincipalUnitSet K L n) : + Tendsto + (fun d : Nat => + 1 + inverseCorrectionPartialSum (L := L) + ((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) d) + atTop (nhds ((((u⁻¹ : 𝒪[L]ˣ) : 𝒪[L]) : L))) := by + have hprod := + chosenNormalBasisPrincipalUnitSet_inverseCorrectionProduct_tendsto_one + (K := K) (L := L) hle hu + have hmul : + Tendsto + (fun d : Nat => + (((u⁻¹ : 𝒪[L]ˣ) : 𝒪[L]) : L) * + ((((u : 𝒪[L]ˣ) : 𝒪[L]) : L) * + (1 + inverseCorrectionPartialSum (L := L) + ((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) d))) + atTop (nhds ((((u⁻¹ : 𝒪[L]ˣ) : 𝒪[L]) : L))) := by + simpa using + (tendsto_const_nhds (x := (((u⁻¹ : 𝒪[L]ˣ) : 𝒪[L]) : L))).mul hprod + refine hmul.congr' (Eventually.of_forall ?_) + intro d + have huinv : + ((((u⁻¹ : 𝒪[L]ˣ) : 𝒪[L]) : L)) * + ((((u : 𝒪[L]ˣ) : 𝒪[L]) : L)) = 1 := by + have huinvₒ : + (((u⁻¹ : 𝒪[L]ˣ) : 𝒪[L]) * ((u : 𝒪[L]ˣ) : 𝒪[L])) = 1 := + Units.inv_mul u + exact congrArg (algebraMap 𝒪[L] L) huinvₒ + rw [← mul_assoc, huinv, one_mul] + +/-- The inverse correction converges to the inverse minus one. -/ +theorem chosenNormalBasisPrincipalUnitSet_inverseCorrection_tendsto_inv_sub_one + [TopologicalSpace L] [IsNonarchimedeanLocalField L] {n : Nat} + (hle : chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) ≤ + maximalIdealFieldSubmodule K L) + {u : 𝒪[L]ˣ} (hu : u ∈ chosenNormalBasisPrincipalUnitSet K L n) : + Tendsto + (fun d : Nat => + inverseCorrectionPartialSum (L := L) + ((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) d) + atTop (nhds (((((u⁻¹ : 𝒪[L]ˣ) : 𝒪[L]) : L) - 1))) := by + have h := + chosenNormalBasisPrincipalUnitSet_one_add_inverseCorrection_tendsto_inv + (K := K) (L := L) hle hu + simpa [sub_eq_add_neg, add_assoc, add_comm, add_left_comm] using + h.sub (tendsto_const_nhds (x := (1 : L))) + +/-- A suitable normal-basis principal-unit set admits inverse corrections +converging to the inverse minus one. -/ +theorem exists_chosenNormalBasisPrincipalUnitSet_inverseCorrection_tendsto_inv_sub_one + [TopologicalSpace L] [IsNonarchimedeanLocalField L] : + ∃ c : Nat, ∀ n : Nat, c ≤ n → + ∀ u : 𝒪[L]ˣ, u ∈ chosenNormalBasisPrincipalUnitSet K L n → + Tendsto + (fun d : Nat => + inverseCorrectionPartialSum (L := L) + ((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) d) + atTop (nhds (((((u⁻¹ : 𝒪[L]ˣ) : 𝒪[L]) : L) - 1))) := by + rcases + exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_maximalIdealFieldSubmodule + (K := K) (L := L) with + ⟨c, hc⟩ + refine ⟨c, ?_⟩ + intro n hcn u hu + have hle : + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) ≤ + maximalIdealFieldSubmodule K L := + (chosenBaseUniformizerPowSubmodule_antitone + (K := K) (L := L) (m := c) (n := n) + (chosenNormalBasisIntegerLattice K L) hcn).trans hc + exact chosenNormalBasisPrincipalUnitSet_inverseCorrection_tendsto_inv_sub_one + (K := K) (L := L) hle hu + +/-- Closedness of the lattice puts the inverse minus one back in the lattice. -/ +theorem chosenNormalBasisPrincipalUnitSet_inverse_sub_one_mem_of_closed + [TopologicalSpace L] [IsNonarchimedeanLocalField L] {n : Nat} + (hclosed : IsClosed + ((chosenBaseUniformizerPowSubmodule K L n + (chosenNormalBasisIntegerLattice K L) : Set L))) + (hle : chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) ≤ + maximalIdealFieldSubmodule K L) + (hmul : ∀ x : L, + x ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) → + ∀ y : L, + y ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) → + x * y ∈ chosenBaseUniformizerPowSubmodule K L n + (chosenNormalBasisIntegerLattice K L)) + {u : 𝒪[L]ˣ} (hu : u ∈ chosenNormalBasisPrincipalUnitSet K L n) : + ((((u⁻¹ : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) ∈ + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) := by + let E : Submodule 𝒪[K] L := + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) + have hlim : + (((((u⁻¹ : 𝒪[L]ˣ) : 𝒪[L]) : L) - 1)) ∈ E := by + exact submodule_mem_of_tendsto_of_forall_mem_of_closed + (K := K) (L := L) (E := E) hclosed + (chosenNormalBasisPrincipalUnitSet_inverseCorrection_tendsto_inv_sub_one + (K := K) (L := L) hle hu) + (fun d => chosenNormalBasisPrincipalUnitSet_inverseCorrectionPartialSum_mem + (K := K) (L := L) hmul hu d) + simpa [E] using hlim + +/-- A closed normal-basis principal-unit set is closed under inversion. -/ +theorem chosenNormalBasisPrincipalUnitSet_inv_mem_of_closed + [TopologicalSpace L] [IsNonarchimedeanLocalField L] {n : Nat} + (hclosed : IsClosed + ((chosenBaseUniformizerPowSubmodule K L n + (chosenNormalBasisIntegerLattice K L) : Set L))) + (hle : chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) ≤ + maximalIdealFieldSubmodule K L) + (hmul : ∀ x : L, + x ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) → + ∀ y : L, + y ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) → + x * y ∈ chosenBaseUniformizerPowSubmodule K L n + (chosenNormalBasisIntegerLattice K L)) + {u : 𝒪[L]ˣ} (hu : u ∈ chosenNormalBasisPrincipalUnitSet K L n) : + u⁻¹ ∈ chosenNormalBasisPrincipalUnitSet K L n := by + rw [mem_chosenNormalBasisPrincipalUnitSet_iff] + exact chosenNormalBasisPrincipalUnitSet_inverse_sub_one_mem_of_closed + (K := K) (L := L) hclosed hle hmul hu + +/-- There is a closed normal-basis principal-unit set stable under inversion. -/ +theorem exists_chosenNormalBasisPrincipalUnitSet_inv_mem_of_closed + [TopologicalSpace L] [IsNonarchimedeanLocalField L] : + ∃ c : Nat, ∀ n : Nat, c ≤ n → + IsClosed + ((chosenBaseUniformizerPowSubmodule K L n + (chosenNormalBasisIntegerLattice K L) : Set L)) → + ∀ u : 𝒪[L]ˣ, u ∈ chosenNormalBasisPrincipalUnitSet K L n → + u⁻¹ ∈ chosenNormalBasisPrincipalUnitSet K L n := by + rcases + exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_maximalIdeal_and_mul_closed + (K := K) (L := L) with + ⟨c, hc⟩ + refine ⟨c, ?_⟩ + intro n hcn hclosed u hu + rcases hc n hcn with ⟨hle, hmul⟩ + exact chosenNormalBasisPrincipalUnitSet_inv_mem_of_closed + (K := K) (L := L) hclosed hle hmul hu + +omit [FiniteDimensional K L] [IsGalois K L] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] in +/-- The range of the integer-ring inclusion is the integer-ring field submodule. -/ +theorem integerRingToFieldLinearMap_range_eq : + LinearMap.range (integerRingToFieldLinearMap K L) = + integerRingFieldSubmodule K L := by + ext x + constructor + · rintro ⟨y, rfl⟩ + exact y.2 + · intro hx + exact ⟨⟨x, hx⟩, rfl⟩ + +omit [FiniteDimensional K L] [IsGalois K L] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] in +/-- If the extension valuation ring is finite over the base valuation ring, then +`𝒪_L`, viewed inside `L`, is a finitely generated `𝒪_K`-submodule. -/ +theorem integerRingFieldSubmodule_fg_of_moduleFinite + [Module.Finite 𝒪[K] 𝒪[L]] : + (integerRingFieldSubmodule K L).FG := by + have hfg : + Submodule.FG + ((⊤ : Submodule 𝒪[K] 𝒪[L]).map (integerRingToFieldLinearMap K L)) := + (Module.Finite.fg_top (R := 𝒪[K]) (M := 𝒪[L])).map + (integerRingToFieldLinearMap K L) + have hmap : + (⊤ : Submodule 𝒪[K] 𝒪[L]).map (integerRingToFieldLinearMap K L) = + integerRingFieldSubmodule K L := by + rw [Submodule.map_top] + exact integerRingToFieldLinearMap_range_eq (K := K) (L := L) + simpa [hmap] using hfg + +/-- The reverse lattice bound: if `𝒪_L` is finite over `𝒪_K`, then a +single high enough base-uniformizer power sends `𝒪_L` into the normal-basis +lattice `M`. -/ +theorem exists_chosenBaseUniformizerPow_integerRingFieldSubmodule_le_chosenNormalBasisIntegerLattice + [Module.Finite 𝒪[K] 𝒪[L]] : + ∃ n : Nat, + chosenBaseUniformizerPowSubmodule K L n (integerRingFieldSubmodule K L) ≤ + chosenNormalBasisIntegerLattice K L := + exists_chosenBaseUniformizerPowSubmodule_le_of_fg_of_field_span_eq_top + (K := K) (L := L) + (M := chosenNormalBasisIntegerLattice K L) + (N := integerRingFieldSubmodule K L) + (integerRingFieldSubmodule_fg_of_moduleFinite (K := K) (L := L)) + (chosenNormalBasisIntegerLattice_field_span_eq_top (K := K) (L := L)) + +/-- Some uniformizer-power normal-basis lattice is a neighborhood of zero. -/ +theorem exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_mem_nhds_zero + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Module.Finite 𝒪[K] 𝒪[L]] : + ∃ c : Nat, ∀ n : Nat, c ≤ n → + ((chosenBaseUniformizerPowSubmodule K L n + (chosenNormalBasisIntegerLattice K L) : Set L)) ∈ nhds (0 : L) := by + rcases + exists_chosenBaseUniformizerPow_integerRingFieldSubmodule_le_chosenNormalBasisIntegerLattice + (K := K) (L := L) with + ⟨a, ha⟩ + refine ⟨a, ?_⟩ + intro n han + rcases Nat.exists_eq_add_of_le han with ⟨d, rfl⟩ + exact Filter.mem_of_superset + (chosenBaseUniformizerPow_integerRingFieldSubmodule_mem_nhds_zero + (K := K) (L := L) (a + (a + d))) + (chosenBaseUniformizerPowSubmodule_add_le_chosenBaseUniformizerPowSubmodule_of_le + (K := K) (L := L) (N := integerRingFieldSubmodule K L) + (M := chosenNormalBasisIntegerLattice K L) (a := a) (n := a + d) ha) + +/-- Some uniformizer-power normal-basis lattice is closed. -/ +theorem exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_isClosed + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Module.Finite 𝒪[K] 𝒪[L]] : + ∃ c : Nat, ∀ n : Nat, c ≤ n → + IsClosed + ((chosenBaseUniformizerPowSubmodule K L n + (chosenNormalBasisIntegerLattice K L) : Set L)) := by + rcases exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_mem_nhds_zero + (K := K) (L := L) with + ⟨c, hc⟩ + refine ⟨c, ?_⟩ + intro n hcn + exact submodule_isClosed_of_mem_nhds_zero + (K := K) (L := L) (E := chosenBaseUniformizerPowSubmodule K L n + (chosenNormalBasisIntegerLattice K L)) (hc n hcn) + +/-- There is a chosen normal-basis principal-unit set stable under inversion. -/ +theorem exists_chosenNormalBasisPrincipalUnitSet_inv_mem + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Module.Finite 𝒪[K] 𝒪[L]] : + ∃ c : Nat, ∀ n : Nat, c ≤ n → + ∀ u : 𝒪[L]ˣ, u ∈ chosenNormalBasisPrincipalUnitSet K L n → + u⁻¹ ∈ chosenNormalBasisPrincipalUnitSet K L n := by + rcases exists_chosenNormalBasisPrincipalUnitSet_inv_mem_of_closed + (K := K) (L := L) with + ⟨c₁, hc₁⟩ + rcases exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_isClosed + (K := K) (L := L) with + ⟨c₂, hc₂⟩ + refine ⟨max c₁ c₂, ?_⟩ + intro n hmaxn u hu + have hc₁n : c₁ ≤ n := le_trans (le_max_left c₁ c₂) hmaxn + have hc₂n : c₂ ≤ n := le_trans (le_max_right c₁ c₂) hmaxn + exact hc₁ n hc₁n (hc₂ n hc₂n) u hu + +/-- There exists a principal-unit subgroup arising from a chosen normal-basis lattice. -/ +theorem exists_chosenNormalBasisPrincipalUnitSubgroup + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Module.Finite 𝒪[K] 𝒪[L]] : + ∃ c : Nat, ∀ n : Nat, c ≤ n → + ∃ V : Subgroup 𝒪[L]ˣ, + (V : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n ∧ + V ≤ principalUnits L 1 := by + rcases exists_chosenNormalBasisPrincipalUnitSet_mul_closed_le_principalUnits_one + (K := K) (L := L) with + ⟨c₁, hc₁⟩ + rcases exists_chosenNormalBasisPrincipalUnitSet_inv_mem + (K := K) (L := L) with + ⟨c₂, hc₂⟩ + refine ⟨max c₁ c₂, ?_⟩ + intro n hmaxn + have hc₁n : c₁ ≤ n := le_trans (le_max_left c₁ c₂) hmaxn + have hc₂n : c₂ ≤ n := le_trans (le_max_right c₁ c₂) hmaxn + rcases hc₁ n hc₁n with ⟨hmul, hle_one⟩ + let V : Subgroup 𝒪[L]ˣ := { + carrier := chosenNormalBasisPrincipalUnitSet K L n + one_mem' := chosenNormalBasisPrincipalUnitSet_one_mem (K := K) (L := L) n + mul_mem' := by + intro u v hu hv + exact hmul u hu v hv + inv_mem' := by + intro u hu + exact hc₂ n hc₂n u hu } + refine ⟨V, rfl, ?_⟩ + intro u hu + exact hle_one u hu + +end +end CyclicCohomology + +universe u + +namespace CyclicCohomology + +open LocalFieldTheory + +noncomputable +section + +open scoped ValuativeRel +open Filter + +variable (K L : Type u) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] [ValuativeRel L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + +/-! ### Additive quotient boundary -/ + +omit [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- The principal-unit lattice carriers form a descending filtration. -/ +theorem chosenNormalBasisPrincipalUnitSet_succ_subset (n : Nat) : + chosenNormalBasisPrincipalUnitSet K L (n + 1) ⊆ + chosenNormalBasisPrincipalUnitSet K L n := by + intro u hu + rw [mem_chosenNormalBasisPrincipalUnitSet_iff] at hu ⊢ + exact chosenBaseUniformizerPowSubmodule_succ_le + (K := K) (L := L) n (chosenNormalBasisIntegerLattice K L) hu + +/-- The denominator submodule `π_K^(n+1)M`, viewed inside `π_K^nM`. -/ +def chosenNormalBasisLatticeSuccSubmodule (n : Nat) : + Submodule 𝒪[K] + (chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)) := + (chosenBaseUniformizerPowSubmodule K L (n + 1) + (chosenNormalBasisIntegerLattice K L)).submoduleOf + (chosenBaseUniformizerPowSubmodule K L n + (chosenNormalBasisIntegerLattice K L)) + +/-- The additive quotient `π_K^nM / π_K^(n+1)M` used in the local class-field calculation. -/ +def chosenNormalBasisLatticeSuccQuot (n : Nat) : Type u := + (chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)) ⧸ + chosenNormalBasisLatticeSuccSubmodule K L n + +/-- A successive quotient of normal-basis lattices is an additive commutative group. -/ +instance chosenNormalBasisLatticeSuccQuotAddCommGroup (n : Nat) : + AddCommGroup (chosenNormalBasisLatticeSuccQuot K L n) := by + change AddCommGroup + ((chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)) ⧸ + chosenNormalBasisLatticeSuccSubmodule K L n) + infer_instance + +/-- A successive normal-basis lattice quotient carries the natural residue-field +module structure. -/ +instance chosenNormalBasisLatticeSuccQuotModule (n : Nat) : + Module 𝒪[K] (chosenNormalBasisLatticeSuccQuot K L n) := by + change Module 𝒪[K] + ((chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)) ⧸ + chosenNormalBasisLatticeSuccSubmodule K L n) + infer_instance + +/-- Explicit access to the concrete submodule quotient implementing the +chosen normal-basis lattice graded piece. -/ +def chosenNormalBasisLatticeSuccQuotConcreteLinearEquiv (n : Nat) : + chosenNormalBasisLatticeSuccQuot K L n ≃ₗ[𝒪[K]] + ((chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)) ⧸ + chosenNormalBasisLatticeSuccSubmodule K L n) := by + change + ((chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)) ⧸ + chosenNormalBasisLatticeSuccSubmodule K L n) ≃ₗ[𝒪[K]] + ((chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)) ⧸ + chosenNormalBasisLatticeSuccSubmodule K L n) + exact LinearEquiv.refl 𝒪[K] _ + +omit [ValuativeRel L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- Characterizes membership in the next normal-basis lattice submodule. -/ +@[simp] +theorem mem_chosenNormalBasisLatticeSuccSubmodule_iff (n : Nat) + (x : chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)) : + x ∈ chosenNormalBasisLatticeSuccSubmodule K L n ↔ + (x : L) ∈ chosenBaseUniformizerPowSubmodule K L (n + 1) + (chosenNormalBasisIntegerLattice K L) := + Iff.rfl + +/-- The quotient map `π_K^nM -> π_K^nM / π_K^(n+1)M`. -/ +def chosenNormalBasisLatticeSuccQuotMk (n : Nat) : + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) →ₗ[𝒪[K]] + chosenNormalBasisLatticeSuccQuot K L n := by + change + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) →ₗ[𝒪[K]] + ((chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)) ⧸ + chosenNormalBasisLatticeSuccSubmodule K L n) + exact (chosenNormalBasisLatticeSuccSubmodule K L n).mkQ + +omit [ValuativeRel L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- The concrete linear equivalence sends a lattice element to its canonical quotient class. -/ +@[simp] +theorem chosenNormalBasisLatticeSuccQuotConcreteLinearEquiv_mk (n : Nat) + (x : chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)) : + chosenNormalBasisLatticeSuccQuotConcreteLinearEquiv K L n + (chosenNormalBasisLatticeSuccQuotMk K L n x) = + Submodule.Quotient.mk x := + rfl + +omit [ValuativeRel L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- Every successive lattice-quotient class has a representative. -/ +theorem chosenNormalBasisLatticeSuccQuotMk_surjective (n : Nat) : + Function.Surjective (chosenNormalBasisLatticeSuccQuotMk K L n) := + Submodule.mkQ_surjective (chosenNormalBasisLatticeSuccSubmodule K L n) + +omit [ValuativeRel L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- Eliminate a chosen normal-basis lattice quotient through arbitrary +representatives and its canonical class map. -/ +protected theorem chosenNormalBasisLatticeSuccQuot.inductionOn + (n : Nat) + {motive : chosenNormalBasisLatticeSuccQuot K L n → Prop} + (q : chosenNormalBasisLatticeSuccQuot K L n) + (h : ∀ x : + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L), + motive (chosenNormalBasisLatticeSuccQuotMk K L n x)) : + motive q := by + change motive + (show + (chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)) ⧸ + chosenNormalBasisLatticeSuccSubmodule K L n from q) + exact + Submodule.Quotient.induction_on + (chosenNormalBasisLatticeSuccSubmodule K L n) q h + +/-- Descend a representative-level function constant modulo the next chosen +normal-basis lattice. -/ +def chosenNormalBasisLatticeSuccQuotLift + {P : Sort*} (n : Nat) + (f : + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) → P) + (h : ∀ x y, x - y ∈ chosenNormalBasisLatticeSuccSubmodule K L n → + f x = f y) : + chosenNormalBasisLatticeSuccQuot K L n → P := by + change + ((chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) ⧸ + chosenNormalBasisLatticeSuccSubmodule K L n) → P) + refine Quotient.lift f ?_ + intro x y hxy + have hq : + (Submodule.Quotient.mk x : + (chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) ⧸ + chosenNormalBasisLatticeSuccSubmodule K L n)) = + Submodule.Quotient.mk y := + Quotient.sound hxy + exact h x y + ((Submodule.Quotient.eq + (chosenNormalBasisLatticeSuccSubmodule K L n)).1 hq) + +omit [ValuativeRel L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- The lifted map on a successive lattice quotient evaluates to the original +map on representatives. -/ +@[simp] theorem chosenNormalBasisLatticeSuccQuotLift_mk + {P : Sort*} (n : Nat) + (f : + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) → P) + (h : ∀ x y, x - y ∈ chosenNormalBasisLatticeSuccSubmodule K L n → + f x = f y) + (x : chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)) : + chosenNormalBasisLatticeSuccQuotLift K L n f h + (chosenNormalBasisLatticeSuccQuotMk K L n x) = f x := + rfl + +/-- Descend a linear map vanishing on the next chosen normal-basis lattice. -/ +def chosenNormalBasisLatticeSuccQuotLinearLift + {M : Type*} [AddCommGroup M] [Module 𝒪[K] M] (n : Nat) + (f : + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) + →ₗ[𝒪[K]] M) + (h : chosenNormalBasisLatticeSuccSubmodule K L n ≤ f.ker) : + chosenNormalBasisLatticeSuccQuot K L n →ₗ[𝒪[K]] M := by + change + (chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) ⧸ + chosenNormalBasisLatticeSuccSubmodule K L n) →ₗ[𝒪[K]] M + exact (chosenNormalBasisLatticeSuccSubmodule K L n).liftQ f h + +omit [ValuativeRel L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- The lifted linear map agrees with the original linear map on quotient representatives. -/ +@[simp] theorem chosenNormalBasisLatticeSuccQuotLinearLift_mk + {M : Type*} [AddCommGroup M] [Module 𝒪[K] M] (n : Nat) + (f : + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) + →ₗ[𝒪[K]] M) + (h : chosenNormalBasisLatticeSuccSubmodule K L n ≤ f.ker) + (x : chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)) : + chosenNormalBasisLatticeSuccQuotLinearLift K L n f h + (chosenNormalBasisLatticeSuccQuotMk K L n x) = f x := + rfl + +omit [ValuativeRel L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- A lattice representative gives zero in the successive quotient exactly +when it lies at the next level. -/ +theorem chosenNormalBasisLatticeSuccQuotMk_eq_zero_iff (n : Nat) + (x : chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)) : + chosenNormalBasisLatticeSuccQuotMk K L n x = 0 ↔ + (x : L) ∈ chosenBaseUniformizerPowSubmodule K L (n + 1) + (chosenNormalBasisIntegerLattice K L) := by + change + (Submodule.Quotient.mk x : + (chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)) ⧸ + chosenNormalBasisLatticeSuccSubmodule K L n) = 0 ↔ _ + rw [Submodule.Quotient.mk_eq_zero] + rfl + +omit [ValuativeRel L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- Two lattice representatives agree in the successive quotient exactly when +their difference lies at the next level. -/ +@[simp] +theorem chosenNormalBasisLatticeSuccQuotMk_eq_iff (n : Nat) + (x y : + chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)) : + chosenNormalBasisLatticeSuccQuotMk K L n x = + chosenNormalBasisLatticeSuccQuotMk K L n y ↔ + x - y ∈ chosenNormalBasisLatticeSuccSubmodule K L n := by + change + (Submodule.Quotient.mk x : + (chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)) ⧸ + chosenNormalBasisLatticeSuccSubmodule K L n) = + Submodule.Quotient.mk y ↔ _ + exact Submodule.Quotient.eq (chosenNormalBasisLatticeSuccSubmodule K L n) + +/-- The additive quotient class of `u - 1` for `u ∈ V^n`. -/ +def chosenNormalBasisPrincipalUnitLatticeClass (n : Nat) + (u : 𝒪[L]ˣ) (hu : u ∈ chosenNormalBasisPrincipalUnitSet K L n) : + chosenNormalBasisLatticeSuccQuot K L n := + chosenNormalBasisLatticeSuccQuotMk K L n + ⟨((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L), hu⟩ + +omit [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- A principal unit has zero lattice class exactly when its deviation from one +lies at the next level. -/ +theorem chosenNormalBasisPrincipalUnitLatticeClass_eq_zero_iff {n : Nat} + (u : 𝒪[L]ˣ) (hu : u ∈ chosenNormalBasisPrincipalUnitSet K L n) : + chosenNormalBasisPrincipalUnitLatticeClass K L n u hu = 0 ↔ + u ∈ chosenNormalBasisPrincipalUnitSet K L (n + 1) := by + rw [chosenNormalBasisPrincipalUnitLatticeClass, + chosenNormalBasisLatticeSuccQuotMk_eq_zero_iff] + rfl + +omit [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- The multiplicative error term for units in `V^n` is one lattice step deeper +whenever products of elements of `π_K^nM` land in `π_K^(n+1)M`. -/ +theorem chosenNormalBasisPrincipalUnitSet_mul_error_mem_succ {n : Nat} + (hmul_succ : ∀ x : L, + x ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) → + ∀ y : L, + y ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) → + x * y ∈ + chosenBaseUniformizerPowSubmodule K L (n + 1) (chosenNormalBasisIntegerLattice K L)) + {u v : 𝒪[L]ˣ} + (hu : u ∈ chosenNormalBasisPrincipalUnitSet K L n) + (hv : v ∈ chosenNormalBasisPrincipalUnitSet K L n) : + (((((u * v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) - + (((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) + + ((((v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L))) ∈ + chosenBaseUniformizerPowSubmodule K L (n + 1) + (chosenNormalBasisIntegerLattice K L) := by + let x : L := ((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) + let y : L := ((((v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) + have hx : x ∈ chosenBaseUniformizerPowSubmodule K L n + (chosenNormalBasisIntegerLattice K L) := hu + have hy : y ∈ chosenBaseUniformizerPowSubmodule K L n + (chosenNormalBasisIntegerLattice K L) := hv + have hxy : x * y ∈ chosenBaseUniformizerPowSubmodule K L (n + 1) + (chosenNormalBasisIntegerLattice K L) := + hmul_succ x hx y hy + have hunit : + ((((u * v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) = x * y + x + y := by + have h := + congrArg (fun z : 𝒪[L] => (z : L)) (unit_mul_sub_one_eq L u v) + simpa [x, y, map_add, map_mul, mul_assoc, mul_comm, mul_left_comm, + add_assoc, add_comm, add_left_comm] using h + change + ((((u * v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) - (x + y) ∈ + chosenBaseUniformizerPowSubmodule K L (n + 1) + (chosenNormalBasisIntegerLattice K L) + rw [hunit] + convert hxy using 1; ring + +omit [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- A suitable normal-basis principal-unit set has multiplication error in the +next lattice level. -/ +theorem exists_chosenNormalBasisPrincipalUnitSet_mul_error_mem_succ : + ∃ c : Nat, ∀ n : Nat, c ≤ n → + ∀ u : 𝒪[L]ˣ, u ∈ chosenNormalBasisPrincipalUnitSet K L n → + ∀ v : 𝒪[L]ˣ, v ∈ chosenNormalBasisPrincipalUnitSet K L n → + (((((u * v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) - + (((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) + + ((((v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L))) ∈ + chosenBaseUniformizerPowSubmodule K L (n + 1) + (chosenNormalBasisIntegerLattice K L) := by + rcases exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_mul_mul_mem_succ + (K := K) (L := L) with + ⟨c, hc⟩ + refine ⟨c, ?_⟩ + intro n hcn u hu v hv + exact chosenNormalBasisPrincipalUnitSet_mul_error_mem_succ + (K := K) (L := L) (hc n hcn) hu hv + +omit [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- The lattice class of a product of principal units is the sum of their lattice classes. -/ +theorem chosenNormalBasisPrincipalUnitLatticeClass_mul_eq_add {n : Nat} + (hmul_error : ∀ u : 𝒪[L]ˣ, u ∈ chosenNormalBasisPrincipalUnitSet K L n → + ∀ v : 𝒪[L]ˣ, v ∈ chosenNormalBasisPrincipalUnitSet K L n → + (((((u * v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) - + (((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) + + ((((v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L))) ∈ + chosenBaseUniformizerPowSubmodule K L (n + 1) + (chosenNormalBasisIntegerLattice K L)) + (u v : 𝒪[L]ˣ) + (hu : u ∈ chosenNormalBasisPrincipalUnitSet K L n) + (hv : v ∈ chosenNormalBasisPrincipalUnitSet K L n) + (huv : u * v ∈ chosenNormalBasisPrincipalUnitSet K L n) : + chosenNormalBasisPrincipalUnitLatticeClass K L n (u * v) huv = + chosenNormalBasisPrincipalUnitLatticeClass K L n u hu + + chosenNormalBasisPrincipalUnitLatticeClass K L n v hv := by + rw [chosenNormalBasisPrincipalUnitLatticeClass, chosenNormalBasisPrincipalUnitLatticeClass, + chosenNormalBasisPrincipalUnitLatticeClass] + rw [← map_add, chosenNormalBasisLatticeSuccQuotMk_eq_iff, + mem_chosenNormalBasisLatticeSuccSubmodule_iff] + change + (((((u * v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) - + (((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) + + ((((v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L))) ∈ + chosenBaseUniformizerPowSubmodule K L (n + 1) + (chosenNormalBasisIntegerLattice K L) + exact hmul_error u hu v hv + +/-- There exists a nested pair of normal-basis principal-unit subgroups at successive levels. -/ +theorem exists_chosenNormalBasisPrincipalUnitSubgroupSuccPair + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Module.Finite 𝒪[K] 𝒪[L]] : + ∃ c : Nat, ∀ n : Nat, c ≤ n → + ∃ Vn Vsucc : Subgroup 𝒪[L]ˣ, + (Vn : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n ∧ + (Vsucc : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L (n + 1) ∧ + Vsucc ≤ Vn ∧ + Vn ≤ principalUnits L 1 := by + rcases exists_chosenNormalBasisPrincipalUnitSubgroup (K := K) (L := L) with + ⟨c, hc⟩ + refine ⟨c, ?_⟩ + intro n hcn + rcases hc n hcn with ⟨Vn, hVn, hVnle⟩ + have hcsucc : c ≤ n + 1 := le_trans hcn (Nat.le_succ n) + rcases hc (n + 1) hcsucc with ⟨Vsucc, hVsucc, _hVsuccle⟩ + refine ⟨Vn, Vsucc, hVn, hVsucc, ?_, hVnle⟩ + intro u hu + have hu_succ : u ∈ chosenNormalBasisPrincipalUnitSet K L (n + 1) := by + exact hVsucc ▸ hu + have hu_n : u ∈ chosenNormalBasisPrincipalUnitSet K L n := + chosenNormalBasisPrincipalUnitSet_succ_subset (K := K) (L := L) n hu_succ + change u ∈ (Vn : Set 𝒪[L]ˣ) + exact hVn.symm ▸ hu_n + +/-- The subgroup of `Vn` obtained from an included next-step subgroup +`Vsucc ≤ Vn`. This is the denominator used for the multiplicative quotient +`V^n / V^(n+1)`. -/ +def chosenNormalBasisPrincipalUnitSuccSubgroup {Vn Vsucc : Subgroup 𝒪[L]ˣ} + (_hV : Vsucc ≤ Vn) : Subgroup Vn := + Vsucc.subgroupOf Vn + +/-- Characterizes membership in the next normal-basis principal-unit subgroup. -/ +theorem mem_chosenNormalBasisPrincipalUnitSuccSubgroup_iff + {Vn Vsucc : Subgroup 𝒪[L]ˣ} (hV : Vsucc ≤ Vn) (u : Vn) : + u ∈ chosenNormalBasisPrincipalUnitSuccSubgroup (L := L) hV ↔ + (u : 𝒪[L]ˣ) ∈ Vsucc := by + rw [chosenNormalBasisPrincipalUnitSuccSubgroup] + exact Subgroup.mem_subgroupOf + +/-- The multiplicative successive quotient `Vn / Vsucc`, for an actual inclusion +`Vsucc ≤ Vn`. -/ +def chosenNormalBasisPrincipalUnitSuccQuot + {Vn Vsucc : Subgroup 𝒪[L]ˣ} (hV : Vsucc ≤ Vn) : Type u := + Vn ⧸ chosenNormalBasisPrincipalUnitSuccSubgroup (L := L) hV + +/-- The quotient by the next normal-basis principal-unit subgroup is a commutative group. -/ +instance chosenNormalBasisPrincipalUnitSuccQuotCommGroup + {Vn Vsucc : Subgroup 𝒪[L]ˣ} (hV : Vsucc ≤ Vn) : + CommGroup (chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV) := by + change CommGroup + (Vn ⧸ chosenNormalBasisPrincipalUnitSuccSubgroup (L := L) hV) + infer_instance + +/-- Explicit access to the concrete group quotient implementing the chosen +normal-basis principal-unit graded piece. -/ +def chosenNormalBasisPrincipalUnitSuccQuotConcreteEquiv + {Vn Vsucc : Subgroup 𝒪[L]ˣ} (hV : Vsucc ≤ Vn) : + chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV ≃* + (Vn ⧸ chosenNormalBasisPrincipalUnitSuccSubgroup (L := L) hV) := by + change + (Vn ⧸ chosenNormalBasisPrincipalUnitSuccSubgroup (L := L) hV) ≃* + (Vn ⧸ chosenNormalBasisPrincipalUnitSuccSubgroup (L := L) hV) + exact MulEquiv.refl _ + +/-- The quotient map `Vn -> Vn / Vsucc`. -/ +def chosenNormalBasisPrincipalUnitSuccQuotMk + {Vn Vsucc : Subgroup 𝒪[L]ˣ} (hV : Vsucc ≤ Vn) : + Vn →* chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV := by + change Vn →* + (Vn ⧸ chosenNormalBasisPrincipalUnitSuccSubgroup (L := L) hV) + exact QuotientGroup.mk' + (chosenNormalBasisPrincipalUnitSuccSubgroup (L := L) hV) + +/-- The concrete principal-unit quotient equivalence sends an element to its canonical class. -/ +@[simp] theorem chosenNormalBasisPrincipalUnitSuccQuotConcreteEquiv_mk + {Vn Vsucc : Subgroup 𝒪[L]ˣ} (hV : Vsucc ≤ Vn) (u : Vn) : + chosenNormalBasisPrincipalUnitSuccQuotConcreteEquiv (L := L) hV + (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV u) = + QuotientGroup.mk u := + rfl + +/-- Every successive principal-unit quotient class has a representative. -/ +theorem chosenNormalBasisPrincipalUnitSuccQuotMk_surjective + {Vn Vsucc : Subgroup 𝒪[L]ˣ} (hV : Vsucc ≤ Vn) : + Function.Surjective + (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV) := + QuotientGroup.mk'_surjective + (chosenNormalBasisPrincipalUnitSuccSubgroup (L := L) hV) + +/-- Eliminate a chosen normal-basis principal-unit quotient through arbitrary +representatives and its canonical class map. -/ +protected theorem chosenNormalBasisPrincipalUnitSuccQuot.inductionOn + {Vn Vsucc : Subgroup 𝒪[L]ˣ} (hV : Vsucc ≤ Vn) + {motive : chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV → Prop} + (q : chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV) + (h : ∀ u : Vn, + motive (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV u)) : + motive q := by + change motive + (show Vn ⧸ chosenNormalBasisPrincipalUnitSuccSubgroup (L := L) hV from q) + refine QuotientGroup.induction_on q ?_ + intro u + exact h u + +/-- Descend a homomorphism that kills the included next-step subgroup. -/ +def chosenNormalBasisPrincipalUnitSuccQuotLift + {Vn Vsucc : Subgroup 𝒪[L]ˣ} {H : Type*} [Group H] + (hV : Vsucc ≤ Vn) (f : Vn →* H) + (h : chosenNormalBasisPrincipalUnitSuccSubgroup (L := L) hV ≤ f.ker) : + chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV →* H := by + change + (Vn ⧸ chosenNormalBasisPrincipalUnitSuccSubgroup (L := L) hV) →* H + exact QuotientGroup.lift + (chosenNormalBasisPrincipalUnitSuccSubgroup (L := L) hV) f h + +/-- A map lifted from the successive principal-unit quotient agrees on representatives. -/ +@[simp] theorem chosenNormalBasisPrincipalUnitSuccQuotLift_mk + {Vn Vsucc : Subgroup 𝒪[L]ˣ} {H : Type*} [Group H] + (hV : Vsucc ≤ Vn) (f : Vn →* H) + (h : chosenNormalBasisPrincipalUnitSuccSubgroup (L := L) hV ≤ f.ker) + (u : Vn) : + chosenNormalBasisPrincipalUnitSuccQuotLift (L := L) hV f h + (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV u) = f u := + rfl + +/-- A principal unit represents the identity exactly when it lies in the next subgroup. -/ +theorem chosenNormalBasisPrincipalUnitSuccQuotMk_eq_one_iff + {Vn Vsucc : Subgroup 𝒪[L]ˣ} (hV : Vsucc ≤ Vn) (u : Vn) : + chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV u = 1 ↔ + (u : 𝒪[L]ˣ) ∈ Vsucc := by + change + (QuotientGroup.mk u : + Vn ⧸ chosenNormalBasisPrincipalUnitSuccSubgroup (L := L) hV) = 1 ↔ _ + rw [QuotientGroup.eq_one_iff] + exact mem_chosenNormalBasisPrincipalUnitSuccSubgroup_iff (L := L) hV u + +/-- Two principal units represent the same class exactly when their quotient +lies in the next subgroup. -/ +@[simp] theorem chosenNormalBasisPrincipalUnitSuccQuotMk_eq_iff_div_mem + {Vn Vsucc : Subgroup 𝒪[L]ˣ} (hV : Vsucc ≤ Vn) (u v : Vn) : + chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV u = + chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV v ↔ + u / v ∈ chosenNormalBasisPrincipalUnitSuccSubgroup (L := L) hV := by + change + (QuotientGroup.mk u : + Vn ⧸ chosenNormalBasisPrincipalUnitSuccSubgroup (L := L) hV) = + QuotientGroup.mk v ↔ _ + exact QuotientGroup.eq_iff_div_mem + (N := chosenNormalBasisPrincipalUnitSuccSubgroup (L := L) hV) + +/-- The map `u ↦ u - 1` from a subgroup `Vn = V^n` to the additive +successive quotient, viewed multiplicatively on the target. -/ +def chosenNormalBasisPrincipalUnitToLatticeSuccQuotHom (n : Nat) + {Vn : Subgroup 𝒪[L]ˣ} + (hVn : (Vn : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) + (hmul_error : ∀ u : 𝒪[L]ˣ, u ∈ chosenNormalBasisPrincipalUnitSet K L n → + ∀ v : 𝒪[L]ˣ, v ∈ chosenNormalBasisPrincipalUnitSet K L n → + (((((u * v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) - + (((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) + + ((((v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L))) ∈ + chosenBaseUniformizerPowSubmodule K L (n + 1) + (chosenNormalBasisIntegerLattice K L)) : + Vn →* Multiplicative (chosenNormalBasisLatticeSuccQuot K L n) where + toFun u := + Multiplicative.ofAdd + (chosenNormalBasisPrincipalUnitLatticeClass K L n (u : 𝒪[L]ˣ) + (by + exact hVn ▸ u.2)) + map_one' := by + change chosenNormalBasisPrincipalUnitLatticeClass K L n + (1 : 𝒪[L]ˣ) (by exact hVn ▸ (1 : Vn).2) = 0 + rw [chosenNormalBasisPrincipalUnitLatticeClass, + chosenNormalBasisLatticeSuccQuotMk_eq_zero_iff] + simp + map_mul' := by + intro u v + have hu : (u : 𝒪[L]ˣ) ∈ chosenNormalBasisPrincipalUnitSet K L n := by + exact hVn ▸ u.2 + have hv : (v : 𝒪[L]ˣ) ∈ chosenNormalBasisPrincipalUnitSet K L n := by + exact hVn ▸ v.2 + have huv : ((u * v : Vn) : 𝒪[L]ˣ) ∈ chosenNormalBasisPrincipalUnitSet K L n := by + exact hVn ▸ (u * v).2 + have hclass := + chosenNormalBasisPrincipalUnitLatticeClass_mul_eq_add + (K := K) (L := L) hmul_error (u : 𝒪[L]ˣ) (v : 𝒪[L]ˣ) hu hv huv + simpa using congrArg Multiplicative.ofAdd hclass + +omit [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- Principal units from the next level lie in the kernel of the lattice-class homomorphism. -/ +theorem chosenNormalBasisPrincipalUnitToLatticeSuccQuotHom_mem_ker_of_mem_succ + {n : Nat} {Vn Vsucc : Subgroup 𝒪[L]ˣ} + (hVn : (Vn : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) + (hVsucc : (Vsucc : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L (n + 1)) + (hmul_error : ∀ u : 𝒪[L]ˣ, u ∈ chosenNormalBasisPrincipalUnitSet K L n → + ∀ v : 𝒪[L]ˣ, v ∈ chosenNormalBasisPrincipalUnitSet K L n → + (((((u * v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) - + (((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) + + ((((v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L))) ∈ + chosenBaseUniformizerPowSubmodule K L (n + 1) + (chosenNormalBasisIntegerLattice K L)) + (u : Vn) (hu : (u : 𝒪[L]ˣ) ∈ Vsucc) : + u ∈ (chosenNormalBasisPrincipalUnitToLatticeSuccQuotHom + K L n hVn hmul_error).ker := by + rw [MonoidHom.mem_ker] + have hu_n : (u : 𝒪[L]ˣ) ∈ chosenNormalBasisPrincipalUnitSet K L n := by + exact hVn ▸ u.2 + have hu_succ : (u : 𝒪[L]ˣ) ∈ chosenNormalBasisPrincipalUnitSet K L (n + 1) := by + exact hVsucc ▸ hu + have hzero : + chosenNormalBasisPrincipalUnitLatticeClass K L n (u : 𝒪[L]ˣ) hu_n = 0 := + (chosenNormalBasisPrincipalUnitLatticeClass_eq_zero_iff + (K := K) (L := L) (u : 𝒪[L]ˣ) hu_n).2 hu_succ + change Multiplicative.ofAdd + (chosenNormalBasisPrincipalUnitLatticeClass K L n (u : 𝒪[L]ˣ) hu_n) = 1 + simpa using congrArg Multiplicative.ofAdd hzero + +/-- The induced map +`Vn/Vsucc -> π_K^nM/π_K^(n+1)M`, with the additive quotient target viewed as a +multiplicative group. -/ +def chosenNormalBasisPrincipalUnitSuccQuotToLatticeSuccQuotHom (n : Nat) + {Vn Vsucc : Subgroup 𝒪[L]ˣ} + (hVn : (Vn : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) + (hVsucc : (Vsucc : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L (n + 1)) + (hV : Vsucc ≤ Vn) + (hmul_error : ∀ u : 𝒪[L]ˣ, u ∈ chosenNormalBasisPrincipalUnitSet K L n → + ∀ v : 𝒪[L]ˣ, v ∈ chosenNormalBasisPrincipalUnitSet K L n → + (((((u * v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) - + (((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) + + ((((v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L))) ∈ + chosenBaseUniformizerPowSubmodule K L (n + 1) + (chosenNormalBasisIntegerLattice K L)) : + chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV →* + Multiplicative (chosenNormalBasisLatticeSuccQuot K L n) := + chosenNormalBasisPrincipalUnitSuccQuotLift (L := L) hV + (chosenNormalBasisPrincipalUnitToLatticeSuccQuotHom K L n hVn hmul_error) + (by + intro u hu + have hu_succ : (u : 𝒪[L]ˣ) ∈ Vsucc := + (mem_chosenNormalBasisPrincipalUnitSuccSubgroup_iff (L := L) hV u).1 hu + exact chosenNormalBasisPrincipalUnitToLatticeSuccQuotHom_mem_ker_of_mem_succ + (K := K) (L := L) hVn hVsucc hmul_error u hu_succ) + +omit [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in +/-- The induced quotient homomorphism sends a principal-unit class to its lattice class. -/ +theorem chosenNormalBasisPrincipalUnitSuccQuotToLatticeSuccQuotHom_mk + {n : Nat} {Vn Vsucc : Subgroup 𝒪[L]ˣ} + (hVn : (Vn : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) + (hVsucc : (Vsucc : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L (n + 1)) + (hV : Vsucc ≤ Vn) + (hmul_error : ∀ u : 𝒪[L]ˣ, u ∈ chosenNormalBasisPrincipalUnitSet K L n → + ∀ v : 𝒪[L]ˣ, v ∈ chosenNormalBasisPrincipalUnitSet K L n → + (((((u * v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) - + (((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) + + ((((v : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L))) ∈ + chosenBaseUniformizerPowSubmodule K L (n + 1) + (chosenNormalBasisIntegerLattice K L)) + (u : Vn) : + chosenNormalBasisPrincipalUnitSuccQuotToLatticeSuccQuotHom + K L n hVn hVsucc hV hmul_error + (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV u) = + chosenNormalBasisPrincipalUnitToLatticeSuccQuotHom K L n hVn hmul_error u := + rfl + +/-- There exists a boundary map for the successive normal-basis principal-unit quotient. -/ +theorem exists_chosenNormalBasisPrincipalUnitSuccQuotBoundary + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Module.Finite 𝒪[K] 𝒪[L]] : + ∃ c : Nat, ∀ n : Nat, c ≤ n → + ∃ Vn Vsucc : Subgroup 𝒪[L]ˣ, + ∃ hV : Vsucc ≤ Vn, + (Vn : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n ∧ + (Vsucc : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L (n + 1) ∧ + Vn ≤ principalUnits L 1 ∧ + ∀ u : Vn, + chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV u = 1 ↔ + (u : 𝒪[L]ˣ) ∈ Vsucc := by + rcases exists_chosenNormalBasisPrincipalUnitSubgroupSuccPair (K := K) (L := L) with + ⟨c, hc⟩ + refine ⟨c, ?_⟩ + intro n hcn + rcases hc n hcn with ⟨Vn, Vsucc, hVn, hVsucc, hV, hVnle⟩ + refine ⟨Vn, Vsucc, hV, hVn, hVsucc, hVnle, ?_⟩ + intro u + exact chosenNormalBasisPrincipalUnitSuccQuotMk_eq_one_iff (L := L) hV u + +/-- There exists a homomorphism from the successive principal-unit quotient to +the lattice quotient. -/ +theorem exists_chosenNormalBasisPrincipalUnitSuccQuotToLatticeSuccQuotHom + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Module.Finite 𝒪[K] 𝒪[L]] : + ∃ c : Nat, ∀ n : Nat, c ≤ n → + ∃ Vn Vsucc : Subgroup 𝒪[L]ˣ, + ∃ hV : Vsucc ≤ Vn, + ∃ hVn : (Vn : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n, + ∃ _hVsucc : + (Vsucc : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L (n + 1), + ∃ Φ : chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV →* + Multiplicative (chosenNormalBasisLatticeSuccQuot K L n), + ∀ u : Vn, + Φ (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV u) = + Multiplicative.ofAdd + (chosenNormalBasisPrincipalUnitLatticeClass K L n + (u : 𝒪[L]ˣ) (by + exact hVn ▸ u.2)) := by + rcases exists_chosenNormalBasisPrincipalUnitSubgroupSuccPair (K := K) (L := L) with + ⟨c₁, hc₁⟩ + rcases exists_chosenNormalBasisPrincipalUnitSet_mul_error_mem_succ (K := K) (L := L) with + ⟨c₂, hc₂⟩ + refine ⟨max c₁ c₂, ?_⟩ + intro n hmaxn + have hc₁n : c₁ ≤ n := le_trans (le_max_left c₁ c₂) hmaxn + have hc₂n : c₂ ≤ n := le_trans (le_max_right c₁ c₂) hmaxn + rcases hc₁ n hc₁n with ⟨Vn, Vsucc, hVn, hVsucc, hV, _hVnle⟩ + let hmul_error := hc₂ n hc₂n + let Φ : chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV →* + Multiplicative (chosenNormalBasisLatticeSuccQuot K L n) := + chosenNormalBasisPrincipalUnitSuccQuotToLatticeSuccQuotHom + K L n hVn hVsucc hV hmul_error + refine ⟨Vn, Vsucc, hV, hVn, hVsucc, Φ, ?_⟩ + intro u + dsimp [Φ] + rw [chosenNormalBasisPrincipalUnitSuccQuotToLatticeSuccQuotHom_mk] + rfl + +end +end CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation.lean new file mode 100644 index 0000000000..12d979157e --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.Lattice +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.LatticeHerbrand +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.Module + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Lattice.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Lattice.lean new file mode 100644 index 0000000000..bdc20142bc --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Lattice.lean @@ -0,0 +1,909 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Module.ZLattice.Basic +public import Mathlib.LinearAlgebra.FreeModule.Finite.Quotient +public import Mathlib.LinearAlgebra.Matrix.Gershgorin +/-! +# Permutation-stable sublattices + +This file proves the permutation-stable sublattice lemma. The proof +also handles a +permutation basis with more than one orbit: approximate every large coordinate +vector by a lattice point and average all these approximations equivariantly +over the finite group. +-/ + +@[expose] public section + +noncomputable +section + +namespace CyclicCohomology + +open Module Submodule +open scoped BigOperators + +universe uG uι + +variable {G : Type uG} {ι : Type uι} + +/-- The linear coordinate permutation attached to a permutation of the +indexing type. -/ +def coordinatePermutation (σ : Equiv.Perm ι) : + (ι → ℝ) ≃ₗ[ℝ] (ι → ℝ) where + toFun x i := x (σ.symm i) + invFun x i := x (σ i) + left_inv x := by + funext i + simp + right_inv x := by + funext i + simp + map_add' _ _ := rfl + map_smul' _ _ := rfl + +@[simp] +theorem coordinatePermutation_apply + (σ : Equiv.Perm ι) (x : ι → ℝ) (i : ι) : + coordinatePermutation σ x i = x (σ.symm i) := + rfl + +@[simp] +theorem coordinatePermutation_refl : + coordinatePermutation (Equiv.refl ι) = + LinearEquiv.refl ℝ (ι → ℝ) := by + ext x i + rfl + +theorem coordinatePermutation_mul + (σ τ : Equiv.Perm ι) : + coordinatePermutation (σ * τ) = + (coordinatePermutation τ).trans + (coordinatePermutation σ) := by + ext x i + rfl + +@[simp] +theorem coordinatePermutation_inv + (σ : Equiv.Perm ι) : + coordinatePermutation σ⁻¹ = + (coordinatePermutation σ).symm := by + rw [show σ⁻¹ = σ.symm from rfl] + ext x i + rfl + +@[simp] +theorem coordinatePermutation_single + [DecidableEq ι] (σ : Equiv.Perm ι) (i : ι) : + coordinatePermutation σ (Pi.single i (1 : ℝ)) = + Pi.single (σ i) 1 := by + ext j + by_cases h : j = σ i + · subst j + simp + · have h' : σ.symm j ≠ i := by + intro hij + apply h + simpa using congrArg σ hij + simp [coordinatePermutation_apply, h, h'] + +section Approximation + +variable [Fintype ι] + +/-- A canonical lattice point whose difference from `x` lies in the +fundamental parallelepiped of a chosen lattice basis. -/ +def latticeApproximation + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] (x : ι → ℝ) : L := by + let b : Basis ι ℤ L := IsZLattice.basis L + let bℝ : Basis ι ℝ (ι → ℝ) := b.ofZLatticeBasis ℝ L + refine ⟨ZSpan.floor bℝ x, ?_⟩ + let z : ι → ℝ := (ZSpan.floor bℝ x).1 + change z ∈ L + rw [← b.ofZLatticeBasis_span ℝ] + exact (ZSpan.floor bℝ x).property + +/-- A uniform approximation radius for the canonical lattice +approximation. -/ +def latticeApproximationRadius + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] : ℝ := + let b : Basis ι ℤ L := IsZLattice.basis L + let bℝ : Basis ι ℝ (ι → ℝ) := b.ofZLatticeBasis ℝ L + ∑ i, ‖bℝ i‖ + +theorem latticeApproximationRadius_nonneg + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] : + 0 ≤ latticeApproximationRadius L := by + unfold latticeApproximationRadius + exact Finset.sum_nonneg fun _ _ ↦ norm_nonneg _ + +theorem norm_sub_latticeApproximation_le + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] (x : ι → ℝ) : + ‖x - (latticeApproximation L x : ι → ℝ)‖ ≤ + latticeApproximationRadius L := by + let b : Basis ι ℤ L := IsZLattice.basis L + let bℝ : Basis ι ℝ (ι → ℝ) := b.ofZLatticeBasis ℝ L + simpa only [latticeApproximation, latticeApproximationRadius, + ZSpan.fract] using ZSpan.norm_fract_le bℝ x + +theorem abs_latticeApproximation_sub_apply_le + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] (x : ι → ℝ) (i : ι) : + |(latticeApproximation L x : ι → ℝ) i - x i| ≤ + latticeApproximationRadius L := by + have hcoord : + ‖(x - (latticeApproximation L x : ι → ℝ)) i‖ ≤ + ‖x - (latticeApproximation L x : ι → ℝ)‖ := + norm_le_pi_norm (x - (latticeApproximation L x : ι → ℝ)) i + rw [Pi.sub_apply, Real.norm_eq_abs, abs_sub_comm] at hcoord + exact hcoord.trans (norm_sub_latticeApproximation_le L x) + +end Approximation + +section Averaging + +variable [Fintype G] [Group G] [Fintype ι] [DecidableEq ι] + +/-- The action of `g` on the coordinate space for a permutation +representation `ρ`. -/ +def permutationRepresentation + (ρ : G →* Equiv.Perm ι) (g : G) : + (ι → ℝ) ≃ₗ[ℝ] (ι → ℝ) := + coordinatePermutation (ρ g) + +omit [Fintype G] [Fintype ι] [DecidableEq ι] in +@[simp] +theorem permutationRepresentation_one + (ρ : G →* Equiv.Perm ι) : + permutationRepresentation ρ 1 = + LinearEquiv.refl ℝ (ι → ℝ) := by + change coordinatePermutation (ρ 1) = + LinearEquiv.refl ℝ (ι → ℝ) + rw [map_one] + exact coordinatePermutation_refl + +omit [Fintype G] [Fintype ι] [DecidableEq ι] in +theorem permutationRepresentation_mul + (ρ : G →* Equiv.Perm ι) (g h : G) : + permutationRepresentation ρ (g * h) = + (permutationRepresentation ρ h).trans + (permutationRepresentation ρ g) := by + simp only [permutationRepresentation, map_mul] + exact coordinatePermutation_mul _ _ + +/-- Restrict a permutation representation to an invariant lattice. -/ +def permutationLatticeEquiv + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) + (g : G) : L ≃ₗ[ℤ] L where + toFun x := + ⟨permutationRepresentation ρ g x.1, hL g x.1 x.2⟩ + invFun x := + ⟨permutationRepresentation ρ g⁻¹ x.1, + hL g⁻¹ x.1 x.2⟩ + left_inv x := by + apply Subtype.ext + change coordinatePermutation (ρ g⁻¹) + (coordinatePermutation (ρ g) x.1) = x.1 + rw [map_inv, + coordinatePermutation_inv] + exact (coordinatePermutation (ρ g)).symm_apply_apply x.1 + right_inv x := by + apply Subtype.ext + change coordinatePermutation (ρ g) + (coordinatePermutation (ρ g⁻¹) x.1) = x.1 + rw [map_inv, + coordinatePermutation_inv] + exact (coordinatePermutation (ρ g)).apply_symm_apply x.1 + map_add' x y := by + apply Subtype.ext + exact map_add _ _ _ + map_smul' n x := by + apply Subtype.ext + exact map_zsmul _ _ _ + +omit [Fintype G] [Fintype ι] [DecidableEq ι] in +@[simp] +theorem coe_permutationLatticeEquiv + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) + (g : G) (x : L) : + ((permutationLatticeEquiv ρ L hL g x : L) : ι → ℝ) = + permutationRepresentation ρ g x := + rfl + +/-- The equivariant average of lattice approximations to the large +coordinate vectors. -/ +def averagedLatticeVector + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) + (t : ℝ) (i : ι) : L := + ∑ g : G, + permutationLatticeEquiv ρ L hL g + (latticeApproximation L + (t • Pi.single ((ρ g).symm i) (1 : ℝ))) + +/-- A scale large enough to make the averaged lattice vectors strictly +column diagonally dominant. -/ +def permutationLatticeScale + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] : ℝ := + ((Fintype.card ι : ℝ) + 1) * + latticeApproximationRadius L + 1 + +omit [DecidableEq ι] in +theorem permutationLatticeScale_pos + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] : + 0 < permutationLatticeScale L := by + have hB := latticeApproximationRadius_nonneg L + have hs : 0 ≤ (Fintype.card ι : ℝ) := by positivity + unfold permutationLatticeScale + nlinarith + +@[simp] +theorem averagedLatticeVector_apply + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) + (t : ℝ) (i j : ι) : + (averagedLatticeVector ρ L hL t i : ι → ℝ) j = + ∑ g : G, + (latticeApproximation L + (t • Pi.single ((ρ g).symm i) (1 : ℝ)) : + ι → ℝ) ((ρ g).symm j) := by + simp [averagedLatticeVector, permutationRepresentation] + +omit [Fintype G] in +theorem averagingSummand_diagonal_bound + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] (t : ℝ) (g : G) (i : ι) : + |(latticeApproximation L + (t • Pi.single ((ρ g).symm i) (1 : ℝ)) : + ι → ℝ) ((ρ g).symm i) - t| ≤ + latticeApproximationRadius L := by + have h := + abs_latticeApproximation_sub_apply_le L + (t • Pi.single ((ρ g).symm i) (1 : ℝ)) + ((ρ g).symm i) + simpa using h + +omit [Fintype G] in +theorem averagingSummand_offDiagonal_bound + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] (t : ℝ) (g : G) {i j : ι} + (hji : j ≠ i) : + |(latticeApproximation L + (t • Pi.single ((ρ g).symm i) (1 : ℝ)) : + ι → ℝ) ((ρ g).symm j)| ≤ + latticeApproximationRadius L := by + have h := + abs_latticeApproximation_sub_apply_le L + (t • Pi.single ((ρ g).symm i) (1 : ℝ)) + ((ρ g).symm j) + have hne : (ρ g).symm j ≠ (ρ g).symm i := + (ρ g).symm.injective.ne hji + simpa [hne] using h + +theorem averagedLatticeVector_diagonal_bound + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) + (t : ℝ) (i : ι) : + |(averagedLatticeVector ρ L hL t i : ι → ℝ) i - + (Fintype.card G : ℝ) * t| ≤ + (Fintype.card G : ℝ) * + latticeApproximationRadius L := by + rw [averagedLatticeVector_apply] + let a : G → ℝ := fun g ↦ + (latticeApproximation L + (t • Pi.single ((ρ g).symm i) (1 : ℝ)) : + ι → ℝ) ((ρ g).symm i) + change |(∑ g : G, a g) - + (Fintype.card G : ℝ) * t| ≤ + (Fintype.card G : ℝ) * + latticeApproximationRadius L + have ha (g : G) : + |a g - t| ≤ latticeApproximationRadius L := by + simpa only [a] using + averagingSummand_diagonal_bound ρ L t g i + have heq : + (∑ g : G, a g) - + (Fintype.card G : ℝ) * t = + ∑ g : G, (a g - t) := by + rw [Finset.sum_sub_distrib] + simp + rw [heq] + calc + |∑ g : G, (a g - t)| ≤ + ∑ g : G, |a g - t| := + Finset.abs_sum_le_sum_abs _ _ + _ ≤ ∑ _g : G, latticeApproximationRadius L := + Finset.sum_le_sum fun g _ ↦ ha g + _ = (Fintype.card G : ℝ) * + latticeApproximationRadius L := by simp + +theorem averagedLatticeVector_offDiagonal_bound + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) + (t : ℝ) {i j : ι} (hji : j ≠ i) : + |(averagedLatticeVector ρ L hL t i : ι → ℝ) j| ≤ + (Fintype.card G : ℝ) * + latticeApproximationRadius L := by + rw [averagedLatticeVector_apply] + let a : G → ℝ := fun g ↦ + (latticeApproximation L + (t • Pi.single ((ρ g).symm i) (1 : ℝ)) : + ι → ℝ) ((ρ g).symm j) + change |∑ g : G, a g| ≤ + (Fintype.card G : ℝ) * + latticeApproximationRadius L + have ha (g : G) : + |a g| ≤ latticeApproximationRadius L := by + simpa only [a] using + averagingSummand_offDiagonal_bound + ρ L t g hji + calc + |∑ g : G, a g| ≤ ∑ g : G, |a g| := + Finset.abs_sum_le_sum_abs _ _ + _ ≤ ∑ _g : G, latticeApproximationRadius L := + Finset.sum_le_sum fun g _ ↦ ha g + _ = (Fintype.card G : ℝ) * + latticeApproximationRadius L := by simp + +/-- The coordinate matrix whose columns are the averaged lattice +vectors. -/ +def averagedLatticeMatrix + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) + (t : ℝ) : Matrix ι ι ℝ := + fun row column ↦ + (averagedLatticeVector ρ L hL t column : + ι → ℝ) row + +theorem averagedLatticeMatrix_sum_col_lt_diag + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) : + ∀ k : ι, + ∑ j ∈ Finset.univ.erase k, + ‖averagedLatticeMatrix ρ L hL + (permutationLatticeScale L) j k‖ < + ‖averagedLatticeMatrix ρ L hL + (permutationLatticeScale L) k k‖ := by + intro k + let B : ℝ := latticeApproximationRadius L + let n : ℝ := Fintype.card G + let s : ℝ := Fintype.card ι + let t : ℝ := permutationLatticeScale L + let E : ℝ := n * B + have hB : 0 ≤ B := + latticeApproximationRadius_nonneg L + have hn : 0 < n := by + dsimp only [n] + exact_mod_cast (Fintype.card_pos : 0 < Fintype.card G) + have hs : 0 ≤ s := by positivity + have hE : 0 ≤ E := mul_nonneg hn.le hB + have hoff (j : ι) (hjk : j ≠ k) : + ‖averagedLatticeMatrix ρ L hL t j k‖ ≤ E := by + change + |(averagedLatticeVector ρ L hL t k : + ι → ℝ) j| ≤ E + exact averagedLatticeVector_offDiagonal_bound + ρ L hL t hjk + have hsum : + ∑ j ∈ Finset.univ.erase k, + ‖averagedLatticeMatrix ρ L hL t j k‖ ≤ + s * E := by + calc + ∑ j ∈ Finset.univ.erase k, + ‖averagedLatticeMatrix ρ L hL t j k‖ ≤ + ∑ _j ∈ Finset.univ.erase k, E := + Finset.sum_le_sum fun j hj ↦ + hoff j (Finset.ne_of_mem_erase hj) + _ ≤ ∑ _j : ι, E := + Finset.sum_le_sum_of_subset_of_nonneg + (Finset.erase_subset k Finset.univ) + (fun _ _ _ ↦ hE) + _ = s * E := by simp [s] + have hdiag : + |(averagedLatticeMatrix ρ L hL t k k) - + n * t| ≤ E := by + exact averagedLatticeVector_diagonal_bound + ρ L hL t k + have hdiagLower : + n * t - E ≤ + |averagedLatticeMatrix ρ L hL t k k| := by + have hleft := (abs_le.mp hdiag).1 + have hself : + averagedLatticeMatrix ρ L hL t k k ≤ + |averagedLatticeMatrix ρ L hL t k k| := + le_abs_self _ + nlinarith + have hnumeric : s * E < n * t - E := by + dsimp only [E, n, s, t, B] + unfold permutationLatticeScale + nlinarith + calc + ∑ j ∈ Finset.univ.erase k, + ‖averagedLatticeMatrix ρ L hL + (permutationLatticeScale L) j k‖ = + ∑ j ∈ Finset.univ.erase k, + ‖averagedLatticeMatrix ρ L hL t j k‖ := by rfl + _ ≤ s * E := hsum + _ < n * t - E := hnumeric + _ ≤ |averagedLatticeMatrix ρ L hL t k k| := + hdiagLower + _ = ‖averagedLatticeMatrix ρ L hL + (permutationLatticeScale L) k k‖ := by + rfl + +theorem averagedLatticeMatrix_det_ne_zero + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) : + (averagedLatticeMatrix ρ L hL + (permutationLatticeScale L)).det ≠ 0 := + det_ne_zero_of_sum_col_lt_diag + (averagedLatticeMatrix_sum_col_lt_diag ρ L hL) + +theorem averagedLatticeVector_linearIndependent + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) : + LinearIndependent ℝ + (fun i ↦ + (averagedLatticeVector ρ L hL + (permutationLatticeScale L) i : + ι → ℝ)) := by + have hcols := + Matrix.linearIndependent_cols_of_det_ne_zero + (averagedLatticeMatrix_det_ne_zero ρ L hL) + change LinearIndependent ℝ + (fun i j ↦ + averagedLatticeMatrix ρ L hL + (permutationLatticeScale L) j i) at hcols + simpa only [averagedLatticeMatrix] using hcols + +theorem averagedLatticeVector_equivariant + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) + (t : ℝ) (g : G) (i : ι) : + permutationLatticeEquiv ρ L hL g + (averagedLatticeVector ρ L hL t i) = + averagedLatticeVector ρ L hL t (ρ g i) := by + classical + apply Subtype.ext + ext j + simp only [coe_permutationLatticeEquiv, + permutationRepresentation, coordinatePermutation_apply, + averagedLatticeVector_apply] + let F : G → ℝ := fun h ↦ + (latticeApproximation L + (t • Pi.single ((ρ h).symm i) (1 : ℝ)) : + ι → ℝ) ((ρ h).symm ((ρ g).symm j)) + let H : G → ℝ := fun k ↦ + (latticeApproximation L + (t • Pi.single ((ρ k).symm (ρ g i)) (1 : ℝ)) : + ι → ℝ) ((ρ k).symm j) + have hterm (h : G) : F h = H (g * h) := by + dsimp only [F, H] + have hindex : + (ρ (g * h)).symm (ρ g i) = (ρ h).symm i := by + rw [Equiv.symm_apply_eq] + simp [map_mul] + have hcoordinate : + (ρ (g * h)).symm j = + (ρ h).symm ((ρ g).symm j) := by + rw [Equiv.symm_apply_eq] + simp [map_mul] + rw [hindex, hcoordinate] + calc + ∑ h : G, F h = ∑ h : G, H (g * h) := by + exact Finset.sum_congr rfl fun h _ ↦ hterm h + _ = ∑ k : G, H k := by + exact Fintype.sum_bijective (g * ·) + (Group.mulLeft_bijective g) (fun h ↦ H (g * h)) H + fun _ ↦ rfl + +/-- The complete sublattice generated by the equivariantly averaged +vectors. -/ +def permutationSublattice + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) : + Submodule ℤ (ι → ℝ) := + Submodule.span ℤ + (Set.range fun i ↦ + (averagedLatticeVector ρ L hL + (permutationLatticeScale L) i : ι → ℝ)) + +theorem permutationSublattice_le + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) : + permutationSublattice ρ L hL ≤ L := by + apply Submodule.span_le.mpr + rintro _ ⟨i, rfl⟩ + exact (averagedLatticeVector ρ L hL + (permutationLatticeScale L) i).property + +instance permutationSublattice_discreteTopology + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) : + DiscreteTopology (permutationSublattice ρ L hL) := by + let f : permutationSublattice ρ L hL → L := + fun x ↦ ⟨x.1, permutationSublattice_le ρ L hL x.2⟩ + refine DiscreteTopology.of_continuous_injective + (f := f) ?_ ?_ + · exact Continuous.subtype_mk continuous_subtype_val _ + · intro x y hxy + apply Subtype.ext + exact congrArg (fun z : L ↦ (z : ι → ℝ)) hxy + +theorem permutationSublattice_span_eq_top + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) : + Submodule.span ℝ + (permutationSublattice ρ L hL : + Set (ι → ℝ)) = ⊤ := by + let w : ι → (ι → ℝ) := fun i ↦ + (averagedLatticeVector ρ L hL + (permutationLatticeScale L) i : ι → ℝ) + have hw : + LinearIndependent ℝ w := + averagedLatticeVector_linearIndependent ρ L hL + have hwspan : + Submodule.span ℝ (Set.range w) = ⊤ := + hw.span_eq_top_of_card_eq_finrank' + (Module.finrank_fintype_fun_eq_card ℝ).symm + rw [eq_top_iff, ← hwspan] + apply Submodule.span_mono (R := ℝ) + rintro _ ⟨i, rfl⟩ + exact Submodule.subset_span ⟨i, rfl⟩ + +instance permutationSublattice_isZLattice + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) : + IsZLattice ℝ (permutationSublattice ρ L hL) where + span_top := permutationSublattice_span_eq_top ρ L hL + +/-- The distinguished basis of the permutation-stable sublattice. -/ +def permutationSublatticeBasis + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) : + Basis ι ℤ (permutationSublattice ρ L hL) := + Basis.span + ((averagedLatticeVector_linearIndependent ρ L hL).restrict_scalars' ℤ) + +@[simp] +theorem permutationSublatticeBasis_apply_coe + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) + (i : ι) : + ((permutationSublatticeBasis ρ L hL i : + permutationSublattice ρ L hL) : ι → ℝ) = + averagedLatticeVector ρ L hL + (permutationLatticeScale L) i := by + let hli := + (averagedLatticeVector_linearIndependent + ρ L hL).restrict_scalars' ℤ + change + ((Basis.span hli i : + permutationSublattice ρ L hL) : ι → ℝ) = + (averagedLatticeVector ρ L hL + (permutationLatticeScale L) i : ι → ℝ) + exact Basis.coe_span_apply hli i + +theorem permutationSublatticeBasis_permuted + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) + (g : G) (i : ι) : + permutationRepresentation ρ g + (permutationSublatticeBasis ρ L hL i : + ι → ℝ) = + (permutationSublatticeBasis ρ L hL (ρ g i) : + ι → ℝ) := by + have h := + congrArg (fun x : L ↦ (x : ι → ℝ)) + (averagedLatticeVector_equivariant + ρ L hL (permutationLatticeScale L) g i) + simpa only [coe_permutationLatticeEquiv, + permutationSublatticeBasis_apply_coe] using h + +omit [DecidableEq ι] [Fintype G] in +/-- An invariant complete lattice in a real +permutation representation contains a complete sublattice with a basis +permuted in exactly the prescribed way. -/ +theorem exists_complete_permutationSublattice [Finite G] + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) : + ∃ L' : Submodule ℤ (ι → ℝ), + L' ≤ L ∧ + DiscreteTopology L' ∧ + Submodule.span ℝ (L' : Set (ι → ℝ)) = ⊤ ∧ + ∃ b : Basis ι ℤ L', + ∀ (g : G) (i : ι), + permutationRepresentation ρ g + (b i : ι → ℝ) = + (b (ρ g i) : ι → ℝ) := by + classical + let : DecidableEq ι := Classical.decEq ι + let := Fintype.ofFinite G + refine ⟨permutationSublattice ρ L hL, + permutationSublattice_le ρ L hL, + inferInstance, + permutationSublattice_span_eq_top ρ L hL, + permutationSublatticeBasis ρ L hL, ?_⟩ + exact permutationSublatticeBasis_permuted ρ L hL + +end Averaging + +section GeneralPermutationBasis + +variable [Fintype G] [Group G] [Fintype ι] [DecidableEq ι] +variable {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + +omit [Fintype G] in +omit [DecidableEq ι] [Fintype ι] in +theorem basisEquivFunL_symm_coordinatePermutation [Finite ι] + (b : Basis ι ℝ E) + (ρ : G →* Equiv.Perm ι) + (α : G →* (E ≃ₗ[ℝ] E)) + (hb : ∀ (g : G) (i : ι), + α g (b i) = b (ρ g i)) + (g : G) (x : ι → ℝ) : + b.equivFunL.symm + (coordinatePermutation (ρ g) x) = + α g (b.equivFunL.symm x) := by + classical + let : DecidableEq ι := Classical.decEq ι + let := Fintype.ofFinite ι + have hmaps : + b.equivFunL.symm.toLinearMap.comp + (coordinatePermutation (ρ g)).toLinearMap = + (α g).toLinearMap.comp + b.equivFunL.symm.toLinearMap := by + apply (Pi.basisFun ℝ ι).ext + intro i + simp only [LinearMap.comp_apply, Pi.basisFun_apply] + have hsingle (j : ι) : + b.equivFunL.symm (Pi.single j 1) = b j := by + exact _root_.Basis.equivFun_symm_single b j + calc + b.equivFunL.symm + (coordinatePermutation (ρ g) + (Pi.single i 1)) = + b.equivFunL.symm + (Pi.single (ρ g i) 1) := + congrArg b.equivFunL.symm + (coordinatePermutation_single (ρ g) i) + _ = b (ρ g i) := hsingle (ρ g i) + _ = α g (b i) := (hb g i).symm + _ = α g + (b.equivFunL.symm (Pi.single i 1)) := by + rw [hsingle i] + exact LinearMap.congr_fun hmaps x + +omit [DecidableEq ι] [Fintype G] [Fintype ι] in +/-- Invariant formulation: if a finite group acts on a +finite-dimensional real vector space by permuting a specified basis, every +invariant complete lattice contains a complete sublattice with a basis +permuted in the same way. -/ +theorem exists_complete_permutationSublattice_of_basis [Finite G] [Finite ι] + (b : Basis ι ℝ E) + (ρ : G →* Equiv.Perm ι) + (α : G →* (E ≃ₗ[ℝ] E)) + (hb : ∀ (g : G) (i : ι), + α g (b i) = b (ρ g i)) + (L : Submodule ℤ E) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : E), x ∈ L → + α g x ∈ L) : + ∃ L' : Submodule ℤ E, + L' ≤ L ∧ + DiscreteTopology L' ∧ + Submodule.span ℝ (L' : Set E) = ⊤ ∧ + ∃ b' : Basis ι ℤ L', + ∀ (g : G) (i : ι), + α g (b' i : E) = + (b' (ρ g i) : E) := by + classical + let : DecidableEq ι := Classical.decEq ι + let := Fintype.ofFinite G + let := Fintype.ofFinite ι + let e : E ≃L[ℝ] (ι → ℝ) := b.equivFunL + let Lc : Submodule ℤ (ι → ℝ) := + ZLattice.comap ℝ L e.symm.toLinearMap + let : DiscreteTopology Lc := by + dsimp only [Lc] + infer_instance + let : IsZLattice ℝ Lc := by + dsimp only [Lc] + infer_instance + have hLc : + ∀ (g : G) (x : ι → ℝ), x ∈ Lc → + permutationRepresentation ρ g x ∈ Lc := by + intro g x hx + change b.equivFunL.symm + (coordinatePermutation (ρ g) x) ∈ L + rw [basisEquivFunL_symm_coordinatePermutation + b ρ α hb] + apply hL g + exact hx + let Lc' : Submodule ℤ (ι → ℝ) := + permutationSublattice ρ Lc hLc + let : DiscreteTopology Lc' := by + dsimp only [Lc'] + infer_instance + let : IsZLattice ℝ Lc' := by + dsimp only [Lc'] + infer_instance + let L' : Submodule ℤ E := + ZLattice.comap ℝ Lc' e.toLinearMap + let : DiscreteTopology L' := by + dsimp only [L'] + infer_instance + let : IsZLattice ℝ L' := by + dsimp only [L'] + infer_instance + let bc : Basis ι ℤ Lc' := + permutationSublatticeBasis ρ Lc hLc + let b' : Basis ι ℤ L' := + bc.ofZLatticeComap ℝ Lc' e.toLinearEquiv + have hle : L' ≤ L := by + intro x hx + have hxc' : e x ∈ Lc' := hx + have hxc : e x ∈ Lc := + permutationSublattice_le ρ Lc hLc hxc' + change e.symm (e x) ∈ L at hxc + simpa using hxc + refine ⟨L', hle, inferInstance, + IsZLattice.span_top, b', ?_⟩ + intro g i + have hcoord := + permutationSublatticeBasis_permuted + ρ Lc hLc g i + have hintertwine := + basisEquivFunL_symm_coordinatePermutation + b ρ α hb g (bc i : ι → ℝ) + have hcoord' : + coordinatePermutation (ρ g) (bc i : ι → ℝ) = + (bc (ρ g i) : ι → ℝ) := by + simpa only [permutationRepresentation, bc] using hcoord + change + α g (e.symm (bc i : ι → ℝ)) = + e.symm (bc (ρ g i) : ι → ℝ) + calc + α g (e.symm (bc i : ι → ℝ)) = + b.equivFunL.symm + (coordinatePermutation (ρ g) + (bc i : ι → ℝ)) := hintertwine.symm + _ = b.equivFunL.symm + (bc (ρ g i) : ι → ℝ) := + congrArg b.equivFunL.symm hcoord' + _ = e.symm (bc (ρ g i) : ι → ℝ) := rfl + +end GeneralPermutationBasis + +section FiniteIndex + +variable {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + [FiniteDimensional ℝ E] + +/-- Two complete integral lattices in the same real vector space are +commensurable: if one is contained in the other, its quotient in the +larger lattice is finite. -/ +theorem finite_quotient_of_complete_sublattice + (L L' : Submodule ℤ E) + [DiscreteTopology L] [IsZLattice ℝ L] + [DiscreteTopology L'] [IsZLattice ℝ L'] + (hL' : L' ≤ L) : + Finite (L ⧸ L'.comap L.subtype) := by + let N : Submodule ℤ L := L'.comap L.subtype + let e : N ≃ₗ[ℤ] L' := + Submodule.comapSubtypeEquivOfLe hL' + let : Module.Finite ℤ L := + ZLattice.module_finite ℝ L + have hrank : Module.finrank ℤ N = + Module.finrank ℤ L := by + calc + Module.finrank ℤ N = + Module.finrank ℤ L' := + LinearEquiv.finrank_eq e + _ = Module.finrank ℝ E := + ZLattice.rank ℝ L' + _ = Module.finrank ℤ L := + (ZLattice.rank ℝ L).symm + exact + Submodule.finiteQuotientOfFreeOfRankEq + (L'.comap L.subtype) hrank + +end FiniteIndex + +section PermutationFiniteIndex + +variable [Fintype G] [Group G] [Fintype ι] [DecidableEq ι] + +/-- The canonical permutation sublattice has +finite index in the original complete invariant lattice. -/ +theorem permutationSublattice_finite_quotient + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) : + Finite + (L ⧸ + (permutationSublattice ρ L hL).comap + L.subtype) := + finite_quotient_of_complete_sublattice + L (permutationSublattice ρ L hL) + (permutationSublattice_le ρ L hL) + +end PermutationFiniteIndex + +end CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean new file mode 100644 index 0000000000..8a121712fd --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean @@ -0,0 +1,1013 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.Lattice +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.Module +/-! +# Herbrand quotients of complete permutation sublattices + +This file connects the complete permutation sublattice with its +orbit-stabilizer Herbrand quotient calculation. +-/ + +@[expose] public section + +open scoped BigOperators + +noncomputable +section + +namespace CyclicCohomology + +open Module Submodule +open CyclicCohomology.ProfiniteCohomology.Herbrand + +universe uG uι + +variable {G : Type uG} {ι : Type uι} + +/-- The action on an indexing type specified by a permutation +representation. -/ +@[reducible] +def permutationMulAction + [Group G] (ρ : G →* Equiv.Perm ι) : + MulAction G ι where + smul g i := ρ g i + one_smul i := by + change ρ 1 i = i + rw [map_one] + rfl + mul_smul g h i := by + change ρ (g * h) i = ρ g (ρ h i) + rw [map_mul] + rfl + +/-- Coordinate permutation over the integers. -/ +def intCoordinatePermutation (σ : Equiv.Perm ι) : + (ι → ℤ) ≃ₗ[ℤ] (ι → ℤ) where + toFun x i := x (σ.symm i) + invFun x i := x (σ i) + left_inv x := by + funext i + simp + right_inv x := by + funext i + simp + map_add' _ _ := rfl + map_smul' _ _ := rfl + +section IntegralPermutationBasis + +variable [Fintype G] [Group G] [Fintype ι] [DecidableEq ι] +variable {M : Type*} [AddCommGroup M] [Module ℤ M] + +omit [Fintype G] in +omit [DecidableEq ι] [Fintype ι] in +/-- Coordinates in a basis permuted by `G` transform by the +contragredient coordinate permutation. -/ +theorem basisEquivFun_symm_intCoordinatePermutation [Finite ι] + (b : Basis ι ℤ M) + (ρ : G →* Equiv.Perm ι) + (α : G →* (M ≃ₗ[ℤ] M)) + (hb : ∀ (g : G) (i : ι), + α g (b i) = b (ρ g i)) + (g : G) (x : ι → ℤ) : + b.equivFun.symm + (intCoordinatePermutation (ρ g) x) = + α g (b.equivFun.symm x) := by + classical + let : DecidableEq ι := Classical.decEq ι + let := Fintype.ofFinite ι + have hmaps : + b.equivFun.symm.toLinearMap.comp + (intCoordinatePermutation (ρ g)).toLinearMap = + (α g).toLinearMap.comp + b.equivFun.symm.toLinearMap := by + apply (Pi.basisFun ℤ ι).ext + intro i + simp only [LinearMap.comp_apply, Pi.basisFun_apply] + have hsingle (j : ι) : + b.equivFun.symm (Pi.single j 1) = b j := by + exact _root_.Basis.equivFun_symm_single b j + calc + b.equivFun.symm + (intCoordinatePermutation (ρ g) + (Pi.single i 1)) = + b.equivFun.symm + (Pi.single (ρ g i) 1) := by + congr 1 + ext j + by_cases h : j = ρ g i + · subst j + simp [intCoordinatePermutation] + · have h' : (ρ g).symm j ≠ i := by + intro hij + apply h + simpa using congrArg (ρ g) hij + simp [intCoordinatePermutation, h, h'] + _ = b (ρ g i) := hsingle (ρ g i) + _ = α g (b i) := (hb g i).symm + _ = α g + (b.equivFun.symm (Pi.single i 1)) := by + rw [hsingle i] + exact LinearMap.congr_fun hmaps x + +end IntegralPermutationBasis + +section StableSublattice + +variable [Fintype G] [Group G] [Fintype ι] [DecidableEq ι] + +/-- The canonical permutation sublattice is stable under the +permutation representation. -/ +theorem permutationSublattice_stable + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) : + ∀ (g : G) (x : ι → ℝ), + x ∈ permutationSublattice ρ L hL → + permutationRepresentation ρ g x ∈ + permutationSublattice ρ L hL := by + intro g x hx + rw [permutationSublattice] at hx ⊢ + refine Submodule.span_induction ?_ ?_ ?_ ?_ hx + · rintro y ⟨i, rfl⟩ + have heq : + permutationRepresentation ρ g + (averagedLatticeVector ρ L hL + (permutationLatticeScale L) i : ι → ℝ) = + (averagedLatticeVector ρ L hL + (permutationLatticeScale L) (ρ g i) : + ι → ℝ) := by + have h := + congrArg (fun q : L => (q : ι → ℝ)) + (averagedLatticeVector_equivariant + ρ L hL (permutationLatticeScale L) g i) + simpa only [coe_permutationLatticeEquiv] using h + rw [heq] + exact Submodule.subset_span ⟨ρ g i, rfl⟩ + · rw [map_zero] + exact Submodule.zero_mem _ + · intro y z _ _ hy hz + rw [map_add] + exact Submodule.add_mem _ hy hz + · intro n y _ hy + rw [map_zsmul] + exact Submodule.smul_mem _ n hy + +/-- The additive action on the canonical permutation sublattice. -/ +@[reducible] +def permutationSublatticeDistribMulAction + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) : + DistribMulAction G (permutationSublattice ρ L hL) where + smul g x := + ⟨permutationRepresentation ρ g x.1, + permutationSublattice_stable ρ L hL g x.1 x.2⟩ + one_smul x := by + apply Subtype.ext + change permutationRepresentation ρ 1 x.1 = x.1 + rw [permutationRepresentation_one] + rfl + mul_smul g h x := by + apply Subtype.ext + change + permutationRepresentation ρ (g * h) x.1 = + permutationRepresentation ρ g + (permutationRepresentation ρ h x.1) + rw [permutationRepresentation_mul] + rfl + smul_zero g := by + apply Subtype.ext + exact map_zero (permutationRepresentation ρ g) + smul_add g x y := by + apply Subtype.ext + exact map_add (permutationRepresentation ρ g) x.1 y.1 + +/-- An additive action, written multiplicatively. -/ +@[reducible] +def multiplicativeDistribMulAction + {A : Type*} [AddCommGroup A] + [DistribMulAction G A] : + MulDistribMulAction G (Multiplicative A) where + smul g x := Multiplicative.ofAdd (g • Multiplicative.toAdd x) + one_smul x := congrArg Multiplicative.ofAdd + (one_smul G (Multiplicative.toAdd x)) + mul_smul g h x := congrArg Multiplicative.ofAdd + (mul_smul g h (Multiplicative.toAdd x)) + smul_one g := congrArg Multiplicative.ofAdd + (DistribMulAction.smul_zero g) + smul_mul g x y := congrArg Multiplicative.ofAdd + (DistribMulAction.smul_add g + (Multiplicative.toAdd x) (Multiplicative.toAdd y)) + +/-- A submodule, written as a subgroup of the multiplicative copy of +its ambient additive group. -/ +@[reducible] +def multiplicativeSubmoduleSubgroup + {M : Type*} [AddCommGroup M] [Module ℤ M] + (N : Submodule ℤ M) : + Subgroup (Multiplicative M) := + N.toAddSubgroup.toSubgroup + +/-- The multiplicative copy of a submodule is canonically equivalent +to the corresponding subgroup of the multiplicative ambient group. -/ +def multiplicativeSubmoduleMulEquiv + {M : Type*} [AddCommGroup M] [Module ℤ M] + (N : Submodule ℤ M) : + Multiplicative N ≃* + multiplicativeSubmoduleSubgroup N where + toFun x := + ⟨Multiplicative.ofAdd + ((Multiplicative.toAdd x : N) : M), + (Multiplicative.toAdd x : N).property⟩ + invFun x := + Multiplicative.ofAdd + ⟨Multiplicative.toAdd x.1, x.2⟩ + left_inv _ := rfl + right_inv _ := rfl + map_mul' _ _ := rfl + +/-- Finiteness of an additive submodule quotient is unchanged after +passing to multiplicative notation. -/ +theorem multiplicativeSubmoduleQuotientFinite + {M : Type*} [AddCommGroup M] [Module ℤ M] + (N : Submodule ℤ M) + [Finite (M ⧸ N)] : + Finite + (Multiplicative M ⧸ + multiplicativeSubmoduleSubgroup N) := by + let f : + Multiplicative M →* + Multiplicative (M ⧸ N) := + (QuotientAddGroup.mk' + N.toAddSubgroup).toMultiplicative + have hf : Function.Surjective f := by + intro y + obtain ⟨x, hx⟩ := + QuotientAddGroup.mk'_surjective + N.toAddSubgroup + (Multiplicative.toAdd y) + exact + ⟨Multiplicative.ofAdd x, + congrArg Multiplicative.ofAdd hx⟩ + have hker : + f.ker = + multiplicativeSubmoduleSubgroup N := by + change + (QuotientAddGroup.mk' + N.toAddSubgroup).ker.toSubgroup = + N.toAddSubgroup.toSubgroup + rw [QuotientAddGroup.ker_mk'] + let e : + Multiplicative M ⧸ + multiplicativeSubmoduleSubgroup N ≃* + Multiplicative (M ⧸ N) := + (QuotientGroup.quotientMulEquivOfEq hker).symm.trans + (QuotientGroup.quotientKerEquivOfSurjective f hf) + exact + Finite.of_equiv + (Multiplicative (M ⧸ N)) e.symm.toEquiv + +/-- The action on any complete stable lattice induced by its +permutation representation. -/ +@[reducible] +def completePermutationLatticeDistribMulAction + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) : + DistribMulAction G L where + smul g x := + ⟨permutationRepresentation ρ g x.1, + hL g x.1 x.2⟩ + one_smul x := by + apply Subtype.ext + change permutationRepresentation ρ 1 x.1 = x.1 + rw [permutationRepresentation_one] + rfl + mul_smul g h x := by + apply Subtype.ext + change + permutationRepresentation ρ (g * h) x.1 = + permutationRepresentation ρ g + (permutationRepresentation ρ h x.1) + rw [permutationRepresentation_mul] + rfl + smul_zero g := by + apply Subtype.ext + exact map_zero (permutationRepresentation ρ g) + smul_add g x y := by + apply Subtype.ext + exact map_add (permutationRepresentation ρ g) x.1 y.1 + +/-- The canonical complete permutation sublattice, viewed as a +subgroup of the multiplicative copy of the ambient lattice. -/ +noncomputable def permutationSublatticeMultiplicativeSubgroup + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) : + Subgroup (Multiplicative L) := + multiplicativeSubmoduleSubgroup + ((permutationSublattice ρ L hL).comap L.subtype) + +/-- The permutation-sublattice subgroup is stable under the ambient +lattice action. -/ +theorem + permutationSublatticeMultiplicativeSubgroup_stable + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) : + letI _ambientAction : + DistribMulAction G L := + completePermutationLatticeDistribMulAction + ρ L hL + letI _multiplicativeAction : + MulDistribMulAction G + (Multiplicative L) := + multiplicativeDistribMulAction + ∀ (g : G) (x : Multiplicative L), + x ∈ + permutationSublatticeMultiplicativeSubgroup + ρ L hL → + g • x ∈ + permutationSublatticeMultiplicativeSubgroup + ρ L hL := by + let ambientAction : + DistribMulAction G L := + completePermutationLatticeDistribMulAction + ρ L hL + let multiplicativeAction : + MulDistribMulAction G + (Multiplicative L) := + multiplicativeDistribMulAction + intro g x hx + change + permutationRepresentation ρ g + ((Multiplicative.toAdd x : L) : ι → ℝ) ∈ + permutationSublattice ρ L hL + change + ((Multiplicative.toAdd x : L) : ι → ℝ) ∈ + permutationSublattice ρ L hL at hx + exact + permutationSublattice_stable + ρ L hL g _ hx + +/-- The canonical permutation-sublattice subgroup has finite quotient +in the multiplicative ambient lattice. -/ +theorem + permutationSublatticeMultiplicativeSubgroup_finite_quotient + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) : + Finite + (Multiplicative L ⧸ + permutationSublatticeMultiplicativeSubgroup + ρ L hL) := by + let N : + Submodule ℤ L := + (permutationSublattice ρ L hL).comap + L.subtype + let quotientFinite : Finite (L ⧸ N) := + permutationSublattice_finite_quotient + ρ L hL + exact + multiplicativeSubmoduleQuotientFinite N + +/-- The subgroup cut out by the canonical permutation sublattice is +canonically the multiplicative copy of that sublattice. -/ +noncomputable def + permutationSublatticeSubgroupMulEquiv + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) : + permutationSublatticeMultiplicativeSubgroup + ρ L hL ≃* + Multiplicative + (permutationSublattice ρ L hL) := + (multiplicativeSubmoduleMulEquiv + ((permutationSublattice ρ L hL).comap + L.subtype)).symm.trans + (Submodule.comapSubtypeEquivOfLe + (permutationSublattice_le ρ L hL)).toAddEquiv.toMultiplicative + +/-- The canonical identification of the finite-index subgroup with +the permutation sublattice is equivariant. -/ +theorem + permutationSublatticeSubgroupMulEquiv_equivariant + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) : + letI _ambientAction : + DistribMulAction G L := + completePermutationLatticeDistribMulAction + ρ L hL + letI _ambientMultiplicativeAction : + MulDistribMulAction G + (Multiplicative L) := + multiplicativeDistribMulAction + letI _subgroupAction : + MulDistribMulAction G + (permutationSublatticeMultiplicativeSubgroup + ρ L hL) := + stableSubgroupMulDistribMulAction + (permutationSublatticeMultiplicativeSubgroup + ρ L hL) + (permutationSublatticeMultiplicativeSubgroup_stable + ρ L hL) + letI _sublatticeAction : + DistribMulAction G + (permutationSublattice ρ L hL) := + permutationSublatticeDistribMulAction ρ L hL + letI _sublatticeMultiplicativeAction : + MulDistribMulAction G + (Multiplicative + (permutationSublattice ρ L hL)) := + multiplicativeDistribMulAction + ∀ (g : G) + (x : + permutationSublatticeMultiplicativeSubgroup + ρ L hL), + permutationSublatticeSubgroupMulEquiv + ρ L hL (g • x) = + g • + permutationSublatticeSubgroupMulEquiv + ρ L hL x := by + let ambientAction : + DistribMulAction G L := + completePermutationLatticeDistribMulAction + ρ L hL + let ambientMultiplicativeAction : + MulDistribMulAction G + (Multiplicative L) := + multiplicativeDistribMulAction + let subgroupAction : + MulDistribMulAction G + (permutationSublatticeMultiplicativeSubgroup + ρ L hL) := + stableSubgroupMulDistribMulAction + (permutationSublatticeMultiplicativeSubgroup + ρ L hL) + (permutationSublatticeMultiplicativeSubgroup_stable + ρ L hL) + let sublatticeAction : + DistribMulAction G + (permutationSublattice ρ L hL) := + permutationSublatticeDistribMulAction ρ L hL + let sublatticeMultiplicativeAction : + MulDistribMulAction G + (Multiplicative + (permutationSublattice ρ L hL)) := + multiplicativeDistribMulAction + intro g x + rfl + +/-- The integral-linear automorphisms underlying the action on the +canonical permutation sublattice. -/ +noncomputable def permutationSublatticeModuleAut + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) : + G →* (permutationSublattice ρ L hL ≃ₗ[ℤ] + permutationSublattice ρ L hL) := by + letI := + permutationSublatticeDistribMulAction ρ L hL + exact DistribMulAction.toModuleAut ℤ + (permutationSublattice ρ L hL) + +/-- Multiplicative coordinates in the distinguished integral basis of +the canonical permutation sublattice. -/ +noncomputable def permutationSublatticeBasisMulEquivFunctions + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) : + Multiplicative (permutationSublattice ρ L hL) ≃* + (ι → Multiplicative ℤ) := + (AddEquiv.toMultiplicative + (permutationSublatticeBasis ρ L hL).equivFun.toAddEquiv).trans + (MulEquiv.funMultiplicative ι ℤ) + +@[simp] +theorem permutationSublatticeModuleAut_basis + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) + (g : G) (i : ι) : + permutationSublatticeModuleAut ρ L hL g + (permutationSublatticeBasis ρ L hL i) = + permutationSublatticeBasis ρ L hL (ρ g i) := by + apply Subtype.ext + exact permutationSublatticeBasis_permuted + ρ L hL g i + +/-- The distinguished basis coordinates identify the canonical +permutation sublattice equivariantly with integer-valued functions. -/ +theorem permutationSublatticeBasisMulEquivFunctions_equivariant + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) : + letI _indexAction : MulAction G ι := + permutationMulAction ρ + letI _sublatticeAction : + DistribMulAction G + (permutationSublattice ρ L hL) := + permutationSublatticeDistribMulAction ρ L hL + letI _multiplicativeAction : + MulDistribMulAction G + (Multiplicative + (permutationSublattice ρ L hL)) := + multiplicativeDistribMulAction + letI _functionAction : + MulDistribMulAction G + (ι → Multiplicative ℤ) := + permutationFunctionMulDistribMulAction + ∀ (g : G) + (x : Multiplicative + (permutationSublattice ρ L hL)), + permutationSublatticeBasisMulEquivFunctions + ρ L hL (g • x) = + g • permutationSublatticeBasisMulEquivFunctions + ρ L hL x := by + let indexAction : MulAction G ι := + permutationMulAction ρ + let sublatticeAction : + DistribMulAction G + (permutationSublattice ρ L hL) := + permutationSublatticeDistribMulAction ρ L hL + let multiplicativeAction : + MulDistribMulAction G + (Multiplicative + (permutationSublattice ρ L hL)) := + multiplicativeDistribMulAction + let functionAction : + MulDistribMulAction G + (ι → Multiplicative ℤ) := + permutationFunctionMulDistribMulAction + intro g x + let b := + permutationSublatticeBasis ρ L hL + ext i + change + b.equivFun (g • Multiplicative.toAdd x) i = + b.equivFun (Multiplicative.toAdd x) (ρ g⁻¹ i) + let α := + permutationSublatticeModuleAut ρ L hL + have hinter := + basisEquivFun_symm_intCoordinatePermutation + b ρ α + (permutationSublatticeModuleAut_basis ρ L hL) + g (b.equivFun (Multiplicative.toAdd x)) + have hcoord := + congrArg (fun y => b.equivFun y i) hinter + have hα + (y : permutationSublattice ρ L hL) : + α g y = g • y := + rfl + have hinv : + ((ρ g)⁻¹ : Equiv.Perm ι) = (ρ g).symm := + rfl + rw [map_inv, hinv] + have hcoord' : + (intCoordinatePermutation (ρ g) + (b.equivFun (Multiplicative.toAdd x))) i = + b.equivFun (g • Multiplicative.toAdd x) i := by + simpa only [LinearEquiv.apply_symm_apply, + LinearEquiv.symm_apply_apply, hα] using hcoord + change + b.equivFun (Multiplicative.toAdd x) ((ρ g).symm i) = + b.equivFun (g • Multiplicative.toAdd x) i at hcoord' + exact hcoord'.symm + +/-- Degree-zero Tate cohomology of the canonical complete permutation +sublattice is finite. -/ +theorem permutationSublatticeHerbrandH0Finite + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) + (σ : G) + (hgen : ∀ g : G, + g ∈ Subgroup.zpowers σ) : + letI _indexAction : MulAction G ι := + permutationMulAction ρ + letI _sublatticeAction : + DistribMulAction G + (permutationSublattice ρ L hL) := + permutationSublatticeDistribMulAction ρ L hL + letI _multiplicativeAction : + MulDistribMulAction G + (Multiplicative + (permutationSublattice ρ L hL)) := + multiplicativeDistribMulAction + Finite + (HerbrandH0 G + (Multiplicative + (permutationSublattice ρ L hL))) := by + let indexAction : MulAction G ι := + permutationMulAction ρ + let sublatticeAction : + DistribMulAction G + (permutationSublattice ρ L hL) := + permutationSublatticeDistribMulAction ρ L hL + let multiplicativeAction : + MulDistribMulAction G + (Multiplicative + (permutationSublattice ρ L hL)) := + multiplicativeDistribMulAction + let functionAction : + MulDistribMulAction G + (ι → Multiplicative ℤ) := + permutationFunctionMulDistribMulAction + let functionH0Finite : + Finite + (HerbrandH0 G + (ι → Multiplicative ℤ)) := + permutationFunctionHerbrandH0Finite σ hgen + let e := + permutationSublatticeBasisMulEquivFunctions + ρ L hL + let he := + permutationSublatticeBasisMulEquivFunctions_equivariant + ρ L hL + exact + herbrandH0Finite_of_equivariantMulEquiv + e.symm (mulEquiv_symm_commutes_smul e he) + +/-- Degree-minus-one Tate cohomology of the canonical complete +permutation sublattice is finite. -/ +theorem permutationSublatticeHerbrandHMinusOneFinite + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) + (σ : G) + (hgen : ∀ g : G, + g ∈ Subgroup.zpowers σ) : + letI _indexAction : MulAction G ι := + permutationMulAction ρ + letI _sublatticeAction : + DistribMulAction G + (permutationSublattice ρ L hL) := + permutationSublatticeDistribMulAction ρ L hL + letI _multiplicativeAction : + MulDistribMulAction G + (Multiplicative + (permutationSublattice ρ L hL)) := + multiplicativeDistribMulAction + Finite + (HerbrandHMinusOne G + (Multiplicative + (permutationSublattice ρ L hL)) σ) := by + let indexAction : MulAction G ι := + permutationMulAction ρ + let sublatticeAction : + DistribMulAction G + (permutationSublattice ρ L hL) := + permutationSublatticeDistribMulAction ρ L hL + let multiplicativeAction : + MulDistribMulAction G + (Multiplicative + (permutationSublattice ρ L hL)) := + multiplicativeDistribMulAction + let functionAction : + MulDistribMulAction G + (ι → Multiplicative ℤ) := + permutationFunctionMulDistribMulAction + let functionHMinusOneFinite : + Finite + (HerbrandHMinusOne G + (ι → Multiplicative ℤ) σ) := + permutationFunctionHerbrandHMinusOneFinite σ hgen + let e := + permutationSublatticeBasisMulEquivFunctions + ρ L hL + let he := + permutationSublatticeBasisMulEquivFunctions_equivariant + ρ L hL + exact + herbrandHMinusOneFinite_of_equivariantMulEquiv + e.symm (mulEquiv_symm_commutes_smul e he) σ + +/-- For the canonical complete permutation sublattice, its Herbrand quotient +is the product of the orders of the +stabilizers of the index orbits. -/ +theorem + permutationSublattice_herbrandQuotient_eq_stabilizerProduct + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) + (σ : G) + (hgen : ∀ g : G, + g ∈ Subgroup.zpowers σ) : + letI _indexAction : MulAction G ι := + permutationMulAction ρ + letI _sublatticeAction : + DistribMulAction G + (permutationSublattice ρ L hL) := + permutationSublatticeDistribMulAction ρ L hL + letI _multiplicativeAction : + MulDistribMulAction G + (Multiplicative + (permutationSublattice ρ L hL)) := + multiplicativeDistribMulAction + letI _orbitFintype : + Fintype (MulAction.orbitRel.Quotient G ι) := + Fintype.ofFinite _ + letI _stabilizerFintype : + ∀ ω : MulAction.orbitRel.Quotient G ι, + Fintype (permutationOrbitStabilizer ω) := + fun _ => Fintype.ofFinite _ + letI _sublatticeH0Finite : + Finite + (HerbrandH0 G + (Multiplicative + (permutationSublattice ρ L hL))) := + permutationSublatticeHerbrandH0Finite + ρ L hL σ hgen + letI _sublatticeHMinusOneFinite : + Finite + (HerbrandHMinusOne G + (Multiplicative + (permutationSublattice ρ L hL)) σ) := + permutationSublatticeHerbrandHMinusOneFinite + ρ L hL σ hgen + herbrandQuotient + (G := G) + (A := Multiplicative + (permutationSublattice ρ L hL)) σ = + ∏ ω : MulAction.orbitRel.Quotient G ι, + (Fintype.card + (permutationOrbitStabilizer ω) : ℚ) := by + let indexAction : MulAction G ι := + permutationMulAction ρ + let sublatticeAction : + DistribMulAction G + (permutationSublattice ρ L hL) := + permutationSublatticeDistribMulAction ρ L hL + let multiplicativeAction : + MulDistribMulAction G + (Multiplicative + (permutationSublattice ρ L hL)) := + multiplicativeDistribMulAction + let functionAction : + MulDistribMulAction G + (ι → Multiplicative ℤ) := + permutationFunctionMulDistribMulAction + let orbitFintype : + Fintype (MulAction.orbitRel.Quotient G ι) := + Fintype.ofFinite _ + let stabilizerFintype : + ∀ ω : MulAction.orbitRel.Quotient G ι, + Fintype (permutationOrbitStabilizer ω) := + fun _ => Fintype.ofFinite _ + let sublatticeH0Finite : + Finite + (HerbrandH0 G + (Multiplicative + (permutationSublattice ρ L hL))) := + permutationSublatticeHerbrandH0Finite + ρ L hL σ hgen + let sublatticeHMinusOneFinite : + Finite + (HerbrandHMinusOne G + (Multiplicative + (permutationSublattice ρ L hL)) σ) := + permutationSublatticeHerbrandHMinusOneFinite + ρ L hL σ hgen + let functionH0Finite : + Finite + (HerbrandH0 G + (ι → Multiplicative ℤ)) := + permutationFunctionHerbrandH0Finite σ hgen + let functionHMinusOneFinite : + Finite + (HerbrandHMinusOne G + (ι → Multiplicative ℤ) σ) := + permutationFunctionHerbrandHMinusOneFinite σ hgen + let e := + permutationSublatticeBasisMulEquivFunctions + ρ L hL + let he := + permutationSublatticeBasisMulEquivFunctions_equivariant + ρ L hL + calc + herbrandQuotient + (G := G) + (A := Multiplicative + (permutationSublattice ρ L hL)) σ = + herbrandQuotient + (G := G) (A := ι → Multiplicative ℤ) σ := by + simpa only [e, he] using + (herbrandQuotient_eq_of_equivariantMulEquiv + e he σ) + _ = ∏ ω : MulAction.orbitRel.Quotient G ι, + (Fintype.card + (permutationOrbitStabilizer ω) : ℚ) := + permutationFunction_herbrandQuotient_eq_stabilizerProduct + σ hgen + +/-- For an arbitrary complete stable lattice, passing to the canonical +finite-index permutation sublattice computes +the ambient Herbrand quotient as the product of orbit-stabilizer +orders. -/ +theorem + completePermutationLattice_herbrandQuotient_eq_stabilizerProduct + {G ι : Type} + [Fintype G] [Group G] [Fintype ι] + (ρ : G →* Equiv.Perm ι) + (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] + [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → + permutationRepresentation ρ g x ∈ L) + (σ : G) + (hgen : ∀ g : G, + g ∈ Subgroup.zpowers σ) : + letI _indexAction : MulAction G ι := + permutationMulAction ρ + letI _ambientAction : + DistribMulAction G L := + completePermutationLatticeDistribMulAction + ρ L hL + letI _ambientMultiplicativeAction : + MulDistribMulAction G + (Multiplicative L) := + multiplicativeDistribMulAction + letI _orbitFintype : + Fintype (MulAction.orbitRel.Quotient G ι) := + Fintype.ofFinite _ + letI _stabilizerFintype : + ∀ ω : MulAction.orbitRel.Quotient G ι, + Fintype (permutationOrbitStabilizer ω) := + fun _ => Fintype.ofFinite _ + ∃ _ : + HerbrandQuotientDefined + G (Multiplicative L) σ, + @herbrandQuotient + G (Multiplicative L) _ _ _ _ + σ = + ∏ ω : MulAction.orbitRel.Quotient G ι, + (Fintype.card + (permutationOrbitStabilizer ω) : ℚ) := by + classical + let indexAction : MulAction G ι := + permutationMulAction ρ + let ambientAction : + DistribMulAction G L := + completePermutationLatticeDistribMulAction + ρ L hL + let ambientMultiplicativeAction : + MulDistribMulAction G + (Multiplicative L) := + multiplicativeDistribMulAction + let orbitFintype : + Fintype (MulAction.orbitRel.Quotient G ι) := + Fintype.ofFinite _ + let stabilizerFintype : + ∀ ω : MulAction.orbitRel.Quotient G ι, + Fintype (permutationOrbitStabilizer ω) := + fun _ => Fintype.ofFinite _ + let B := + permutationSublatticeMultiplicativeSubgroup + ρ L hL + have hstable : + ∀ (g : G) (x : Multiplicative L), + x ∈ B → g • x ∈ B := by + simpa only [B] using + (permutationSublatticeMultiplicativeSubgroup_stable + ρ L hL) + let subgroupAction : + MulDistribMulAction G B := + stableSubgroupMulDistribMulAction + B hstable + let quotientAction : + MulDistribMulAction G + (Multiplicative L ⧸ B) := + stableQuotientMulDistribMulAction + B hstable + let quotientFinite : + Finite (Multiplicative L ⧸ B) := by + simpa only [B] using + (permutationSublatticeMultiplicativeSubgroup_finite_quotient + ρ L hL) + let sublatticeAction : + DistribMulAction G + (permutationSublattice ρ L hL) := + permutationSublatticeDistribMulAction ρ L hL + let sublatticeMultiplicativeAction : + MulDistribMulAction G + (Multiplicative + (permutationSublattice ρ L hL)) := + multiplicativeDistribMulAction + let sublatticeH0Finite : + Finite + (HerbrandH0 G + (Multiplicative + (permutationSublattice ρ L hL))) := + permutationSublatticeHerbrandH0Finite + ρ L hL σ hgen + let sublatticeHMinusOneFinite : + Finite + (HerbrandHMinusOne G + (Multiplicative + (permutationSublattice ρ L hL)) σ) := + permutationSublatticeHerbrandHMinusOneFinite + ρ L hL σ hgen + let e := + permutationSublatticeSubgroupMulEquiv + ρ L hL + have he : + ∀ (g : G) (x : B), + e (g • x) = g • e x := by + intro g x + exact + permutationSublatticeSubgroupMulEquiv_equivariant + ρ L hL g x + let subgroupH0Finite : + Finite (HerbrandH0 G B) := + herbrandH0Finite_of_equivariantMulEquiv + e.symm + (mulEquiv_symm_commutes_smul e he) + let subgroupHMinusOneFinite : + Finite (HerbrandHMinusOne G B σ) := + herbrandHMinusOneFinite_of_equivariantMulEquiv + e.symm + (mulEquiv_symm_commutes_smul e he) σ + let hB : + HerbrandQuotientDefined G B σ := + ⟨subgroupH0Finite, + subgroupHMinusOneFinite⟩ + let hA : + HerbrandQuotientDefined + G (Multiplicative L) σ := + finiteIndexStableSubgroup_ambientHerbrandQuotientDefined + B hstable σ hgen hB + refine ⟨hA, ?_⟩ + let ambientH0Finite : + Finite + (HerbrandH0 G + (Multiplicative L)) := + hA.1 + let ambientHMinusOneFinite : + Finite + (HerbrandHMinusOne G + (Multiplicative L) σ) := + hA.2 + calc + @herbrandQuotient + G (Multiplicative L) _ _ _ _ + σ = + @herbrandQuotient + G B _ _ _ _ + σ := by + simpa only [hA] using + (herbrandQuotient_eq_of_finiteIndex_stableSubgroup + B hstable σ hgen hB) + _ = + herbrandQuotient + (G := G) + (A := Multiplicative + (permutationSublattice ρ L hL)) σ := by + simpa only [e, he] using + (herbrandQuotient_eq_of_equivariantMulEquiv + e he σ) + _ = ∏ ω : MulAction.orbitRel.Quotient G ι, + (Fintype.card + (permutationOrbitStabilizer ω) : ℚ) := + permutationSublattice_herbrandQuotient_eq_stabilizerProduct + ρ L hL σ hgen + +end StableSublattice + +end CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean new file mode 100644 index 0000000000..6117d6eda7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean @@ -0,0 +1,1474 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Product +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.EquivariantEquiv +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness +public import Mathlib.Data.ZMod.QuotientGroup +public import Mathlib.GroupTheory.GroupAction.Quotient +public import Mathlib.SetTheory.Cardinal.Finite +/-! +# Herbrand quotients of permutation lattices + +This file supplies the abstract cohomology calculation for permutation +lattices. It proves the value of the Herbrand quotient on the trivial +integer lattice, transports that calculation through Shapiro's lemma to +transitive permutation lattices, and multiplies over a finite family of +orbits. It also records invariance under passage to a finite-index stable +subgroup. +-/ + +@[expose] public section + +open scoped BigOperators + +noncomputable +section + +namespace CyclicCohomology + +open CyclicCohomology.ProfiniteCohomology.Herbrand + +universe uG uA uι + +/-- The trivial multiplicative action on the additive group of integers, +written multiplicatively. -/ +@[reducible] +def trivialIntMulDistribMulAction + (G : Type uG) [Group G] : + MulDistribMulAction G (Multiplicative ℤ) where + smul _ a := a + one_smul _ := rfl + mul_smul _ _ _ := rfl + smul_one _ := rfl + smul_mul _ _ _ := rfl + +section TrivialInteger + +variable {G : Type uG} [Group G] [Fintype G] + +/-- For the trivial integer module, the norm is multiplication by the +order of the group. -/ +theorem trivialInt_tateNorm_toAdd + (a : Multiplicative ℤ) : + letI := trivialIntMulDistribMulAction G + Multiplicative.toAdd + (tateNorm G (Multiplicative ℤ) a) = + (Fintype.card G : ℤ) * Multiplicative.toAdd a := by + let := trivialIntMulDistribMulAction G + have hsmul (g : G) : g • a = a := rfl + simp [tateNorm, hsmul] + +/-- Reduction modulo `|G|` on the fixed subgroup of the trivial integer +module. -/ +def trivialIntFixedToZModHom : + letI := trivialIntMulDistribMulAction G + fixedSubgroup G (Multiplicative ℤ) →* + Multiplicative (ZMod (Fintype.card G)) := by + letI := trivialIntMulDistribMulAction G + exact + { toFun := fun x ↦ Multiplicative.ofAdd + ((Multiplicative.toAdd + (x : Multiplicative ℤ) : ℤ) : + ZMod (Fintype.card G)) + map_one' := by simp + map_mul' := by + intro x y + simp } + +theorem trivialIntFixedToZModHom_surjective : + letI := trivialIntMulDistribMulAction G + Function.Surjective + (trivialIntFixedToZModHom (G := G)) := by + let := trivialIntMulDistribMulAction G + intro y + rcases ZMod.intCast_surjective + (Multiplicative.toAdd y) with ⟨z, hz⟩ + let x : fixedSubgroup G (Multiplicative ℤ) := + ⟨Multiplicative.ofAdd z, by intro g; rfl⟩ + refine ⟨x, ?_⟩ + rw [show trivialIntFixedToZModHom + (G := G) x = + Multiplicative.ofAdd + ((z : ℤ) : ZMod (Fintype.card G)) by rfl] + exact congrArg Multiplicative.ofAdd hz + +/-- The kernel of reduction modulo `|G|` is the norm subgroup. -/ +theorem trivialIntFixedToZModHom_ker : + letI := trivialIntMulDistribMulAction G + MonoidHom.ker + (trivialIntFixedToZModHom (G := G)) = + (tateNormSubgroup G + (Multiplicative ℤ)).subgroupOf + (fixedSubgroup G (Multiplicative ℤ)) := by + let := trivialIntMulDistribMulAction G + ext x + rw [MonoidHom.mem_ker] + constructor + · intro hx + have hx0 : + ((Multiplicative.toAdd + (x : Multiplicative ℤ) : ℤ) : + ZMod (Fintype.card G)) = 0 := by + exact congrArg Multiplicative.toAdd hx + rcases + (ZMod.intCast_zmod_eq_zero_iff_dvd _ _).1 hx0 + with ⟨z, hz⟩ + change (x : Multiplicative ℤ) ∈ + tateNormSubgroup G (Multiplicative ℤ) + refine ⟨Multiplicative.ofAdd z, ?_⟩ + have htoAdd : + Multiplicative.toAdd + (tateNorm G (Multiplicative ℤ) + (Multiplicative.ofAdd z)) = + Multiplicative.toAdd + (x : Multiplicative ℤ) := by + rw [trivialInt_tateNorm_toAdd] + exact hz.symm + exact congrArg Multiplicative.ofAdd htoAdd + · intro hx + change (x : Multiplicative ℤ) ∈ + tateNormSubgroup G (Multiplicative ℤ) at hx + rcases hx with ⟨z, hz⟩ + exact congrArg Multiplicative.ofAdd (by + change + ((Multiplicative.toAdd + (x : Multiplicative ℤ) : ℤ) : + ZMod (Fintype.card G)) = 0 + rw [← hz, tateNormHom_apply, trivialInt_tateNorm_toAdd] + apply (ZMod.intCast_zmod_eq_zero_iff_dvd _ _).2 + exact ⟨Multiplicative.toAdd z, rfl⟩) + +/-- The degree-zero Herbrand group of the trivial integer module is +`ℤ / |G|ℤ`. -/ +noncomputable def trivialIntHerbrandH0EquivZMod : + letI := trivialIntMulDistribMulAction G + HerbrandH0 G (Multiplicative ℤ) ≃* + Multiplicative (ZMod (Fintype.card G)) := by + letI := trivialIntMulDistribMulAction G + exact + (HerbrandH0.equiv + (G := G) (A := Multiplicative ℤ)).trans + ((QuotientGroup.quotientMulEquivOfEq + (trivialIntFixedToZModHom_ker + (G := G)).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (trivialIntFixedToZModHom (G := G)) + (trivialIntFixedToZModHom_surjective + (G := G)))) + +theorem trivialIntHerbrandH0Finite : + letI := trivialIntMulDistribMulAction G + Finite (HerbrandH0 G (Multiplicative ℤ)) := by + let := trivialIntMulDistribMulAction G + exact Finite.of_equiv + (Multiplicative (ZMod (Fintype.card G))) + (trivialIntHerbrandH0EquivZMod + (G := G)).symm.toEquiv + +theorem trivialInt_herbrandH0_card : + letI := trivialIntMulDistribMulAction G + letI := trivialIntHerbrandH0Finite (G := G) + Nat.card + (HerbrandH0 G (Multiplicative ℤ)) = + Fintype.card G := by + let := trivialIntMulDistribMulAction G + let := trivialIntHerbrandH0Finite (G := G) + rw [Nat.card_congr + (trivialIntHerbrandH0EquivZMod + (G := G)).toEquiv] + simp + +/-- The norm kernel of the trivial torsion-free integer module is +trivial. -/ +theorem trivialInt_normKernelSubgroup_eq_bot : + letI := trivialIntMulDistribMulAction G + normKernelSubgroup G (Multiplicative ℤ) = ⊥ := by + let := trivialIntMulDistribMulAction G + apply le_antisymm + · intro x hx + rw [Subgroup.mem_bot] + exact congrArg Multiplicative.ofAdd (by + change + Multiplicative.toAdd + (x : Multiplicative ℤ) = 0 + have hnorm : + (Fintype.card G : ℤ) * + Multiplicative.toAdd + (x : Multiplicative ℤ) = 0 := by + rw [← trivialInt_tateNorm_toAdd] + exact congrArg Multiplicative.toAdd hx + exact (mul_eq_zero.mp hnorm).resolve_left (by + exact_mod_cast Fintype.card_ne_zero)) + · exact bot_le + +theorem trivialIntHerbrandHMinusOneFinite + (σ : G) : + letI := trivialIntMulDistribMulAction G + Finite + (HerbrandHMinusOne G + (Multiplicative ℤ) σ) := by + let := trivialIntMulDistribMulAction G + have : Subsingleton + (normKernelSubgroup G + (Multiplicative ℤ)) := by + rw [trivialInt_normKernelSubgroup_eq_bot + (G := G)] + infer_instance + let : Subsingleton + (HerbrandHMinusOne G + (Multiplicative ℤ) σ) := + ⟨fun q ↦ + HerbrandHMinusOne.inductionOn σ + (motive := fun q ↦ ∀ r, q = r) q fun x r ↦ + HerbrandHMinusOne.inductionOn σ + (motive := fun r ↦ + HerbrandHMinusOne.mk σ x = r) + r fun y ↦ + congrArg + (fun z ↦ HerbrandHMinusOne.mk σ z) + (Subsingleton.elim x y)⟩ + exact Finite.of_injective + (fun _ : HerbrandHMinusOne G + (Multiplicative ℤ) σ ↦ false) + (fun x y _ ↦ Subsingleton.elim x y) + +theorem trivialInt_herbrandHMinusOne_card_eq_one + (σ : G) : + letI := trivialIntMulDistribMulAction G + letI := + trivialIntHerbrandHMinusOneFinite + (G := G) σ + Nat.card + (HerbrandHMinusOne G + (Multiplicative ℤ) σ) = 1 := by + let := trivialIntMulDistribMulAction G + let := + trivialIntHerbrandHMinusOneFinite + (G := G) σ + have : Subsingleton + (normKernelSubgroup G + (Multiplicative ℤ)) := by + rw [trivialInt_normKernelSubgroup_eq_bot + (G := G)] + infer_instance + let : Subsingleton + (HerbrandHMinusOne G + (Multiplicative ℤ) σ) := + ⟨fun q ↦ + HerbrandHMinusOne.inductionOn σ + (motive := fun q ↦ ∀ r, q = r) q fun x r ↦ + HerbrandHMinusOne.inductionOn σ + (motive := fun r ↦ + HerbrandHMinusOne.mk σ x = r) + r fun y ↦ + congrArg + (fun z ↦ HerbrandHMinusOne.mk σ z) + (Subsingleton.elim x y)⟩ + rw [Nat.card_eq_one_iff_unique] + exact ⟨inferInstance, inferInstance⟩ + +/-- For the one-point orbit, the Herbrand quotient of the trivial +integer lattice is the order of the acting group. -/ +theorem trivialInt_herbrandQuotient_eq_card + (σ : G) : + letI := trivialIntMulDistribMulAction G + letI := trivialIntHerbrandH0Finite (G := G) + letI := + trivialIntHerbrandHMinusOneFinite + (G := G) σ + herbrandQuotient + (G := G) (A := Multiplicative ℤ) σ = + (Fintype.card G : ℚ) := by + let := trivialIntMulDistribMulAction G + let := trivialIntHerbrandH0Finite (G := G) + let := + trivialIntHerbrandHMinusOneFinite + (G := G) σ + rw [herbrandQuotient_eq_card_ratio, + trivialInt_herbrandH0_card (G := G), + trivialInt_herbrandHMinusOne_card_eq_one + (G := G) σ] + simp + +end TrivialInteger + +section TransitivePermutationLattice + +variable {G : Type uG} [Group G] [Fintype G] + +/-- A transitive permutation lattice in orbit coordinates: the stabilizer +`H` acts trivially on `ℤ`, and induction gives the integer-valued +functions on the corresponding orbit. -/ +abbrev TransitivePermutationLattice + (H : Subgroup G) + [MulDistribMulAction H (Multiplicative ℤ)] := + InducedModule (G := G) + (B := Multiplicative ℤ) H + +theorem transitivePermutationLatticeHerbrandH0Finite + (H : Subgroup G) + (σ : G) + (hgen : ∀ g : G, + g ∈ Subgroup.zpowers σ) : + letI _stabilizerAction : + MulDistribMulAction H (Multiplicative ℤ) := + trivialIntMulDistribMulAction H + letI _stabilizerFintype : Fintype H := + Fintype.ofFinite H + Finite + (HerbrandH0 G + (TransitivePermutationLattice H)) := by + let stabilizerAction : + MulDistribMulAction H (Multiplicative ℤ) := + trivialIntMulDistribMulAction H + let stabilizerFintype : Fintype H := + Fintype.ofFinite H + let : Finite + (HerbrandH0 H (Multiplicative ℤ)) := + trivialIntHerbrandH0Finite (G := H) + exact Finite.of_equiv + (HerbrandH0 H (Multiplicative ℤ)) + (inducedHerbrandH0EquivOfFiniteCyclic + H σ hgen).symm.toEquiv + +theorem transitivePermutationLatticeHerbrandHMinusOneFinite + (H : Subgroup G) + (σ : G) + (hgen : ∀ g : G, + g ∈ Subgroup.zpowers σ) : + letI _stabilizerAction : + MulDistribMulAction H (Multiplicative ℤ) := + trivialIntMulDistribMulAction H + letI _stabilizerFintype : Fintype H := + Fintype.ofFinite H + Finite + (HerbrandHMinusOne G + (TransitivePermutationLattice H) σ) := by + let stabilizerAction : + MulDistribMulAction H (Multiplicative ℤ) := + trivialIntMulDistribMulAction H + let stabilizerFintype : Fintype H := + Fintype.ofFinite H + let δ := + subgroupGeneratorOfGenerator H σ hgen + let : Finite + (HerbrandHMinusOne H + (Multiplicative ℤ) δ) := + trivialIntHerbrandHMinusOneFinite + (G := H) δ + exact Finite.of_equiv + (HerbrandHMinusOne H + (Multiplicative ℤ) δ) + (inducedHerbrandHMinusOneEquivOfFiniteCyclic + H σ hgen).symm.toEquiv + +/-- The Herbrand quotient of the permutation lattice on one orbit is the +order of the stabilizer. -/ +theorem transitivePermutationLattice_herbrandQuotient_eq_stabilizerCard + (H : Subgroup G) + (σ : G) + (hgen : ∀ g : G, + g ∈ Subgroup.zpowers σ) : + letI _stabilizerAction : + MulDistribMulAction H (Multiplicative ℤ) := + trivialIntMulDistribMulAction H + letI _stabilizerFintype : Fintype H := + Fintype.ofFinite H + letI _h0Finite : + Finite + (HerbrandH0 G + (TransitivePermutationLattice H)) := + transitivePermutationLatticeHerbrandH0Finite + H σ hgen + letI _hMinusOneFinite : + Finite + (HerbrandHMinusOne G + (TransitivePermutationLattice H) σ) := + transitivePermutationLatticeHerbrandHMinusOneFinite + H σ hgen + herbrandQuotient + (G := G) + (A := TransitivePermutationLattice H) σ = + (Fintype.card H : ℚ) := by + let stabilizerAction : + MulDistribMulAction H (Multiplicative ℤ) := + trivialIntMulDistribMulAction H + let stabilizerFintype : Fintype H := + Fintype.ofFinite H + let δ := + subgroupGeneratorOfGenerator H σ hgen + let stabilizerH0Finite : + Finite + (HerbrandH0 H (Multiplicative ℤ)) := + trivialIntHerbrandH0Finite (G := H) + let stabilizerHMinusOneFinite : + Finite + (HerbrandHMinusOne H + (Multiplicative ℤ) δ) := + trivialIntHerbrandHMinusOneFinite + (G := H) δ + let h0Finite : + Finite + (HerbrandH0 G + (TransitivePermutationLattice H)) := + transitivePermutationLatticeHerbrandH0Finite + H σ hgen + let hMinusOneFinite : + Finite + (HerbrandHMinusOne G + (TransitivePermutationLattice H) σ) := + transitivePermutationLatticeHerbrandHMinusOneFinite + H σ hgen + have h0Card : + Nat.card + (HerbrandH0 G + (TransitivePermutationLattice H)) = + Fintype.card H := by + calc + Nat.card + (HerbrandH0 G + (TransitivePermutationLattice H)) = + Nat.card + (HerbrandH0 H + (Multiplicative ℤ)) := + Nat.card_congr + (inducedHerbrandH0EquivOfFiniteCyclic + H σ hgen).toEquiv + _ = Fintype.card H := + trivialInt_herbrandH0_card (G := H) + have hMinusOneCard : + Nat.card + (HerbrandHMinusOne G + (TransitivePermutationLattice H) σ) = + 1 := by + calc + Nat.card + (HerbrandHMinusOne G + (TransitivePermutationLattice H) σ) = + Nat.card + (HerbrandHMinusOne H + (Multiplicative ℤ) δ) := + Nat.card_congr + (inducedHerbrandHMinusOneEquivOfFiniteCyclic + H σ hgen).toEquiv + _ = 1 := + trivialInt_herbrandHMinusOne_card_eq_one + (G := H) δ + rw [herbrandQuotient_eq_card_ratio, + h0Card, hMinusOneCard] + simp + +end TransitivePermutationLattice + +section PermutationLatticeOrbits + +variable {G : Type uG} [Group G] [Fintype G] +variable {ι : Type uι} [Fintype ι] + +/-- A finite permutation lattice presented by chosen orbit representatives: +`H i` is the stabilizer of the representative of orbit `i`. -/ +abbrev PermutationLatticeOrbitFamily + (H : ι → Subgroup G) + [∀ i, + MulDistribMulAction (H i) + (Multiplicative ℤ)] := + ∀ i, TransitivePermutationLattice (H i) + +/-- The Herbrand quotient of a finite permutation lattice is +the product of the orders of the stabilizers of chosen orbit +representatives. -/ +theorem permutationLattice_herbrandQuotient_eq_stabilizerProduct + (H : ι → Subgroup G) + (σ : G) + (hgen : ∀ g : G, + g ∈ Subgroup.zpowers σ) : + letI _stabilizerAction : ∀ i, + MulDistribMulAction (H i) + (Multiplicative ℤ) := + fun i ↦ trivialIntMulDistribMulAction (H i) + letI _stabilizerFintype : ∀ i, + Fintype (H i) := + fun _ ↦ Fintype.ofFinite _ + letI _orbitAction : ∀ i, + MulDistribMulAction G + (TransitivePermutationLattice (H i)) := + fun i ↦ inducedMulDistribMulAction (H i) + letI _familyAction : + MulDistribMulAction G + (PermutationLatticeOrbitFamily H) := + piMulDistribMulAction G + (fun i ↦ + TransitivePermutationLattice (H i)) + letI _orbitH0Finite : ∀ i, + Finite + (HerbrandH0 G + (TransitivePermutationLattice (H i))) := + fun i ↦ + transitivePermutationLatticeHerbrandH0Finite + (H i) σ hgen + letI _orbitHMinusOneFinite : ∀ i, + Finite + (HerbrandHMinusOne G + (TransitivePermutationLattice (H i)) σ) := + fun i ↦ + transitivePermutationLatticeHerbrandHMinusOneFinite + (H i) σ hgen + letI _familyH0Finite : + Finite + (HerbrandH0 G + (PermutationLatticeOrbitFamily H)) := + Finite.of_equiv + (∀ i, + HerbrandH0 G + (TransitivePermutationLattice (H i))) + (herbrandH0PiEquiv + (G := G) + (fun i ↦ + TransitivePermutationLattice + (H i))).symm.toEquiv + letI _familyHMinusOneFinite : + Finite + (HerbrandHMinusOne G + (PermutationLatticeOrbitFamily H) σ) := + Finite.of_equiv + (∀ i, + HerbrandHMinusOne G + (TransitivePermutationLattice (H i)) σ) + (herbrandHMinusOnePiEquiv + (G := G) + (fun i ↦ + TransitivePermutationLattice + (H i)) σ).symm.toEquiv + herbrandQuotient + (G := G) + (A := PermutationLatticeOrbitFamily H) σ = + ∏ i, (Fintype.card (H i) : ℚ) := by + let stabilizerAction : ∀ i, + MulDistribMulAction (H i) + (Multiplicative ℤ) := + fun i ↦ trivialIntMulDistribMulAction (H i) + let stabilizerFintype : ∀ i, + Fintype (H i) := + fun _ ↦ Fintype.ofFinite _ + let orbitAction : ∀ i, + MulDistribMulAction G + (TransitivePermutationLattice (H i)) := + fun i ↦ inducedMulDistribMulAction (H i) + let familyAction : + MulDistribMulAction G + (PermutationLatticeOrbitFamily H) := + piMulDistribMulAction G + (fun i ↦ + TransitivePermutationLattice (H i)) + let orbitH0Finite : ∀ i, + Finite + (HerbrandH0 G + (TransitivePermutationLattice (H i))) := + fun i ↦ + transitivePermutationLatticeHerbrandH0Finite + (H i) σ hgen + let orbitHMinusOneFinite : ∀ i, + Finite + (HerbrandHMinusOne G + (TransitivePermutationLattice (H i)) σ) := + fun i ↦ + transitivePermutationLatticeHerbrandHMinusOneFinite + (H i) σ hgen + let familyH0Finite : + Finite + (HerbrandH0 G + (PermutationLatticeOrbitFamily H)) := + Finite.of_equiv + (∀ i, + HerbrandH0 G + (TransitivePermutationLattice (H i))) + (herbrandH0PiEquiv + (G := G) + (fun i ↦ + TransitivePermutationLattice + (H i))).symm.toEquiv + let familyHMinusOneFinite : + Finite + (HerbrandHMinusOne G + (PermutationLatticeOrbitFamily H) σ) := + Finite.of_equiv + (∀ i, + HerbrandHMinusOne G + (TransitivePermutationLattice (H i)) σ) + (herbrandHMinusOnePiEquiv + (G := G) + (fun i ↦ + TransitivePermutationLattice + (H i)) σ).symm.toEquiv + calc + herbrandQuotient + (G := G) + (A := PermutationLatticeOrbitFamily H) σ = + ∏ i, herbrandQuotient + (G := G) + (A := TransitivePermutationLattice + (H i)) σ := + herbrandQuotient_pi + (fun i ↦ + TransitivePermutationLattice + (H i)) σ + _ = ∏ i, (Fintype.card (H i) : ℚ) := by + apply Finset.prod_congr rfl + intro i _ + exact + transitivePermutationLattice_herbrandQuotient_eq_stabilizerCard + (H i) σ hgen + +end PermutationLatticeOrbits + +section CanonicalPermutationFunctions + +variable {G : Type uG} [Group G] [Fintype G] +variable {ι : Type uι} [Fintype ι] [MulAction G ι] + +/-- The contragredient action on integer-valued functions on a finite +`G`-set. -/ +@[reducible] +def permutationFunctionMulDistribMulAction : + MulDistribMulAction G (ι → Multiplicative ℤ) where + smul g f i := f (g⁻¹ • i) + one_smul f := by + funext i + change f ((1 : G)⁻¹ • i) = f i + rw [inv_one, one_smul] + mul_smul g h f := by + funext i + change f ((g * h)⁻¹ • i) = + f (h⁻¹ • (g⁻¹ • i)) + rw [mul_inv_rev, mul_smul] + smul_one _ := rfl + smul_mul _ _ _ := rfl + +/-- A chosen representative of the orbit containing `i`. -/ +noncomputable def chosenPermutationOrbitRepresentative + (i : ι) : ι := + Quotient.out + (Quotient.mk'' i : + MulAction.orbitRel.Quotient G ι) + +omit [Fintype G] [Fintype ι] in +theorem chosenPermutationOrbitRepresentative_sameOrbit + (i : ι) : + i ∈ MulAction.orbit G + (chosenPermutationOrbitRepresentative (G := G) i) := by + rw [← MulAction.orbitRel_apply, ← Quotient.eq''] + exact + (Quotient.out_eq' + (Quotient.mk'' i : + MulAction.orbitRel.Quotient G ι)).symm + +/-- A chosen group element carrying the chosen representative of +the orbit of `i` to `i`. -/ +noncomputable def chosenPermutationOrbitTransport + (i : ι) : G := + Classical.choose + (chosenPermutationOrbitRepresentative_sameOrbit + (G := G) i) + +omit [Fintype G] [Fintype ι] in +theorem chosenPermutationOrbitTransport_smul + (i : ι) : + chosenPermutationOrbitTransport (G := G) i • + chosenPermutationOrbitRepresentative (G := G) i = i := + Classical.choose_spec + (chosenPermutationOrbitRepresentative_sameOrbit + (G := G) i) + +/-- The stabilizer of the chosen representative of an orbit. -/ +abbrev permutationOrbitStabilizer + (ω : MulAction.orbitRel.Quotient G ι) : + Subgroup G := + MulAction.stabilizer G ω.out + +/-- Integer-valued functions on a finite `G`-set, decomposed into the +induced modules belonging to its orbits. -/ +noncomputable def permutationFunctionOrbitEquiv : + letI _stabilizerAction : + ∀ ω : MulAction.orbitRel.Quotient G ι, + MulDistribMulAction + (permutationOrbitStabilizer ω) + (Multiplicative ℤ) := + fun ω => + trivialIntMulDistribMulAction + (permutationOrbitStabilizer ω) + (ι → Multiplicative ℤ) ≃* + PermutationLatticeOrbitFamily + (fun ω : MulAction.orbitRel.Quotient G ι => + permutationOrbitStabilizer ω) := by + letI stabilizerAction : + ∀ ω : MulAction.orbitRel.Quotient G ι, + MulDistribMulAction + (permutationOrbitStabilizer ω) + (Multiplicative ℤ) := + fun ω => + trivialIntMulDistribMulAction + (permutationOrbitStabilizer ω) + refine + { toFun := fun f ω => + ⟨fun x => f (x⁻¹ • ω.out), ?_⟩ + invFun := fun F i => + (F (Quotient.mk'' i)).1 + ((chosenPermutationOrbitTransport + (G := G) i)⁻¹) + left_inv := ?_ + right_inv := ?_ + map_mul' := ?_ } + · intro h x + change + f ((h.1 * x)⁻¹ • ω.out) = + f (x⁻¹ • ω.out) + have hhInv : + h.1⁻¹ • ω.out = ω.out := by + calc + h.1⁻¹ • ω.out = + h.1⁻¹ • (h.1 • ω.out) := + congrArg (fun y => h.1⁻¹ • y) h.2.symm + _ = ω.out := inv_smul_smul h.1 ω.out + rw [mul_inv_rev, mul_smul, hhInv] + · intro f + funext i + change + f (((chosenPermutationOrbitTransport + (G := G) i)⁻¹)⁻¹ • + chosenPermutationOrbitRepresentative + (G := G) i) = f i + rw [inv_inv, chosenPermutationOrbitTransport_smul] + · intro F + funext ω + apply Subtype.ext + funext x + have hω : + (Quotient.mk'' (x⁻¹ • ω.out) : + MulAction.orbitRel.Quotient G ι) = ω := by + calc + (Quotient.mk'' (x⁻¹ • ω.out) : + MulAction.orbitRel.Quotient G ι) = + Quotient.mk'' ω.out := by + exact Quotient.sound + (MulAction.orbitRel_apply.mpr + ⟨x⁻¹, rfl⟩) + _ = ω := Quotient.out_eq' ω + let t : G := + chosenPermutationOrbitTransport + (G := G) (x⁻¹ • ω.out) + have ht : + t • ω.out = x⁻¹ • ω.out := by + have ht' := + chosenPermutationOrbitTransport_smul + (G := G) (x⁻¹ • ω.out) + simpa only [t, chosenPermutationOrbitRepresentative, + hω] using ht' + let h : permutationOrbitStabilizer ω := + ⟨t⁻¹ * x⁻¹, by + change (t⁻¹ * x⁻¹) • ω.out = ω.out + rw [mul_smul, ← ht, inv_smul_smul]⟩ + change + (F (Quotient.mk'' (x⁻¹ • ω.out))).1 + ((chosenPermutationOrbitTransport + (G := G) (x⁻¹ • ω.out))⁻¹) = + (F ω).1 x + rw [hω] + change (F ω).1 t⁻¹ = (F ω).1 x + have hcov := (F ω).2 h x + change (F ω).1 (h.1 * x) = (F ω).1 x at hcov + simpa [h, mul_assoc] using hcov + · intro f k + funext ω + apply Subtype.ext + funext x + rfl + +omit [Fintype G] [Fintype ι] in +/-- The orbit decomposition of integer-valued functions is +`G`-equivariant. -/ +theorem permutationFunctionOrbitEquiv_equivariant : + letI _functionAction : + MulDistribMulAction G (ι → Multiplicative ℤ) := + permutationFunctionMulDistribMulAction + letI _stabilizerAction : + ∀ ω : MulAction.orbitRel.Quotient G ι, + MulDistribMulAction + (permutationOrbitStabilizer ω) + (Multiplicative ℤ) := + fun ω => + trivialIntMulDistribMulAction + (permutationOrbitStabilizer ω) + letI _orbitAction : + ∀ ω : MulAction.orbitRel.Quotient G ι, + MulDistribMulAction G + (TransitivePermutationLattice + (permutationOrbitStabilizer ω)) := + fun ω => + inducedMulDistribMulAction + (permutationOrbitStabilizer ω) + letI _familyAction : + MulDistribMulAction G + (PermutationLatticeOrbitFamily + (fun ω : MulAction.orbitRel.Quotient G ι => + permutationOrbitStabilizer ω)) := + piMulDistribMulAction G + (fun ω : MulAction.orbitRel.Quotient G ι => + TransitivePermutationLattice + (permutationOrbitStabilizer ω)) + ∀ (g : G) (f : ι → Multiplicative ℤ), + permutationFunctionOrbitEquiv (G := G) (ι := ι) + (g • f) = + g • permutationFunctionOrbitEquiv + (G := G) (ι := ι) f := by + let functionAction : + MulDistribMulAction G (ι → Multiplicative ℤ) := + permutationFunctionMulDistribMulAction + let stabilizerAction : + ∀ ω : MulAction.orbitRel.Quotient G ι, + MulDistribMulAction + (permutationOrbitStabilizer ω) + (Multiplicative ℤ) := + fun ω => + trivialIntMulDistribMulAction + (permutationOrbitStabilizer ω) + let orbitAction : + ∀ ω : MulAction.orbitRel.Quotient G ι, + MulDistribMulAction G + (TransitivePermutationLattice + (permutationOrbitStabilizer ω)) := + fun ω => + inducedMulDistribMulAction + (permutationOrbitStabilizer ω) + let familyAction : + MulDistribMulAction G + (PermutationLatticeOrbitFamily + (fun ω : MulAction.orbitRel.Quotient G ι => + permutationOrbitStabilizer ω)) := + piMulDistribMulAction G + (fun ω : MulAction.orbitRel.Quotient G ι => + TransitivePermutationLattice + (permutationOrbitStabilizer ω)) + intro g f + funext ω + apply Subtype.ext + funext x + change + f (g⁻¹ • (x⁻¹ • ω.out)) = + f ((x * g)⁻¹ • ω.out) + rw [mul_inv_rev, mul_smul] + +omit [Fintype ι] in +/-- Degree-zero Tate cohomology of a finite integral permutation module +is finite for a cyclic generator. -/ +theorem permutationFunctionHerbrandH0Finite [Finite ι] + (σ : G) + (hgen : ∀ g : G, + g ∈ Subgroup.zpowers σ) : + letI _functionAction : + MulDistribMulAction G (ι → Multiplicative ℤ) := + permutationFunctionMulDistribMulAction + Finite + (HerbrandH0 G (ι → Multiplicative ℤ)) := by + classical + let := Fintype.ofFinite ι + let functionAction : + MulDistribMulAction G (ι → Multiplicative ℤ) := + permutationFunctionMulDistribMulAction + let stabilizerAction : + ∀ ω : MulAction.orbitRel.Quotient G ι, + MulDistribMulAction + (permutationOrbitStabilizer ω) + (Multiplicative ℤ) := + fun ω => + trivialIntMulDistribMulAction + (permutationOrbitStabilizer ω) + let stabilizerFintype : + ∀ ω : MulAction.orbitRel.Quotient G ι, + Fintype (permutationOrbitStabilizer ω) := + fun _ => Fintype.ofFinite _ + let orbitAction : + ∀ ω : MulAction.orbitRel.Quotient G ι, + MulDistribMulAction G + (TransitivePermutationLattice + (permutationOrbitStabilizer ω)) := + fun ω => + inducedMulDistribMulAction + (permutationOrbitStabilizer ω) + let familyAction : + MulDistribMulAction G + (PermutationLatticeOrbitFamily + (fun ω : MulAction.orbitRel.Quotient G ι => + permutationOrbitStabilizer ω)) := + piMulDistribMulAction G + (fun ω : MulAction.orbitRel.Quotient G ι => + TransitivePermutationLattice + (permutationOrbitStabilizer ω)) + let orbitH0Finite : + ∀ ω : MulAction.orbitRel.Quotient G ι, + Finite + (HerbrandH0 G + (TransitivePermutationLattice + (permutationOrbitStabilizer ω))) := + fun ω => + transitivePermutationLatticeHerbrandH0Finite + (permutationOrbitStabilizer ω) σ hgen + let familyH0Finite : + Finite + (HerbrandH0 G + (PermutationLatticeOrbitFamily + (fun ω : MulAction.orbitRel.Quotient G ι => + permutationOrbitStabilizer ω))) := + Finite.of_equiv + (∀ ω : MulAction.orbitRel.Quotient G ι, + HerbrandH0 G + (TransitivePermutationLattice + (permutationOrbitStabilizer ω))) + (herbrandH0PiEquiv + (G := G) + (fun ω : MulAction.orbitRel.Quotient G ι => + TransitivePermutationLattice + (permutationOrbitStabilizer ω))).symm.toEquiv + let e := + permutationFunctionOrbitEquiv + (G := G) (ι := ι) + let he := + permutationFunctionOrbitEquiv_equivariant + (G := G) (ι := ι) + exact + herbrandH0Finite_of_equivariantMulEquiv + e.symm (mulEquiv_symm_commutes_smul e he) + +omit [Fintype ι] in +/-- Degree-minus-one Tate cohomology of a finite integral permutation +module is finite for a cyclic generator. -/ +theorem permutationFunctionHerbrandHMinusOneFinite [Finite ι] + (σ : G) + (hgen : ∀ g : G, + g ∈ Subgroup.zpowers σ) : + letI _functionAction : + MulDistribMulAction G (ι → Multiplicative ℤ) := + permutationFunctionMulDistribMulAction + Finite + (HerbrandHMinusOne G + (ι → Multiplicative ℤ) σ) := by + classical + let := Fintype.ofFinite ι + let functionAction : + MulDistribMulAction G (ι → Multiplicative ℤ) := + permutationFunctionMulDistribMulAction + let stabilizerAction : + ∀ ω : MulAction.orbitRel.Quotient G ι, + MulDistribMulAction + (permutationOrbitStabilizer ω) + (Multiplicative ℤ) := + fun ω => + trivialIntMulDistribMulAction + (permutationOrbitStabilizer ω) + let stabilizerFintype : + ∀ ω : MulAction.orbitRel.Quotient G ι, + Fintype (permutationOrbitStabilizer ω) := + fun _ => Fintype.ofFinite _ + let orbitAction : + ∀ ω : MulAction.orbitRel.Quotient G ι, + MulDistribMulAction G + (TransitivePermutationLattice + (permutationOrbitStabilizer ω)) := + fun ω => + inducedMulDistribMulAction + (permutationOrbitStabilizer ω) + let familyAction : + MulDistribMulAction G + (PermutationLatticeOrbitFamily + (fun ω : MulAction.orbitRel.Quotient G ι => + permutationOrbitStabilizer ω)) := + piMulDistribMulAction G + (fun ω : MulAction.orbitRel.Quotient G ι => + TransitivePermutationLattice + (permutationOrbitStabilizer ω)) + let orbitHMinusOneFinite : + ∀ ω : MulAction.orbitRel.Quotient G ι, + Finite + (HerbrandHMinusOne G + (TransitivePermutationLattice + (permutationOrbitStabilizer ω)) σ) := + fun ω => + transitivePermutationLatticeHerbrandHMinusOneFinite + (permutationOrbitStabilizer ω) σ hgen + let familyHMinusOneFinite : + Finite + (HerbrandHMinusOne G + (PermutationLatticeOrbitFamily + (fun ω : MulAction.orbitRel.Quotient G ι => + permutationOrbitStabilizer ω)) σ) := + Finite.of_equiv + (∀ ω : MulAction.orbitRel.Quotient G ι, + HerbrandHMinusOne G + (TransitivePermutationLattice + (permutationOrbitStabilizer ω)) σ) + (herbrandHMinusOnePiEquiv + (G := G) + (fun ω : MulAction.orbitRel.Quotient G ι => + TransitivePermutationLattice + (permutationOrbitStabilizer ω)) σ).symm.toEquiv + let e := + permutationFunctionOrbitEquiv + (G := G) (ι := ι) + let he := + permutationFunctionOrbitEquiv_equivariant + (G := G) (ι := ι) + exact + herbrandHMinusOneFinite_of_equivariantMulEquiv + e.symm (mulEquiv_symm_commutes_smul e he) σ + +omit [Fintype ι] in +/-- Canonical orbit form of the permutation-lattice Herbrand quotient formula: the Herbrand +quotient of the +integer-valued functions on a finite `G`-set is the product of the +orders of the stabilizers of its orbits. -/ +theorem permutationFunction_herbrandQuotient_eq_stabilizerProduct [Finite ι] + (σ : G) + (hgen : ∀ g : G, + g ∈ Subgroup.zpowers σ) : + letI _functionAction : + MulDistribMulAction G (ι → Multiplicative ℤ) := + permutationFunctionMulDistribMulAction + letI _orbitFintype : + Fintype (MulAction.orbitRel.Quotient G ι) := + Fintype.ofFinite _ + letI _stabilizerFintype : + ∀ ω : MulAction.orbitRel.Quotient G ι, + Fintype (permutationOrbitStabilizer ω) := + fun _ => Fintype.ofFinite _ + letI _functionH0Finite : + Finite + (HerbrandH0 G + (ι → Multiplicative ℤ)) := + permutationFunctionHerbrandH0Finite σ hgen + letI _functionHMinusOneFinite : + Finite + (HerbrandHMinusOne G + (ι → Multiplicative ℤ) σ) := + permutationFunctionHerbrandHMinusOneFinite σ hgen + herbrandQuotient + (G := G) (A := ι → Multiplicative ℤ) σ = + ∏ ω : MulAction.orbitRel.Quotient G ι, + (Fintype.card + (permutationOrbitStabilizer ω) : ℚ) := by + classical + let := Fintype.ofFinite ι + let functionAction : + MulDistribMulAction G (ι → Multiplicative ℤ) := + permutationFunctionMulDistribMulAction + let orbitFintype : + Fintype (MulAction.orbitRel.Quotient G ι) := + Fintype.ofFinite _ + let stabilizerAction : + ∀ ω : MulAction.orbitRel.Quotient G ι, + MulDistribMulAction + (permutationOrbitStabilizer ω) + (Multiplicative ℤ) := + fun ω => + trivialIntMulDistribMulAction + (permutationOrbitStabilizer ω) + let stabilizerFintype : + ∀ ω : MulAction.orbitRel.Quotient G ι, + Fintype (permutationOrbitStabilizer ω) := + fun _ => Fintype.ofFinite _ + let orbitAction : + ∀ ω : MulAction.orbitRel.Quotient G ι, + MulDistribMulAction G + (TransitivePermutationLattice + (permutationOrbitStabilizer ω)) := + fun ω => + inducedMulDistribMulAction + (permutationOrbitStabilizer ω) + let familyAction : + MulDistribMulAction G + (PermutationLatticeOrbitFamily + (fun ω : MulAction.orbitRel.Quotient G ι => + permutationOrbitStabilizer ω)) := + piMulDistribMulAction G + (fun ω : MulAction.orbitRel.Quotient G ι => + TransitivePermutationLattice + (permutationOrbitStabilizer ω)) + let orbitH0Finite : + ∀ ω : MulAction.orbitRel.Quotient G ι, + Finite + (HerbrandH0 G + (TransitivePermutationLattice + (permutationOrbitStabilizer ω))) := + fun ω => + transitivePermutationLatticeHerbrandH0Finite + (permutationOrbitStabilizer ω) σ hgen + let orbitHMinusOneFinite : + ∀ ω : MulAction.orbitRel.Quotient G ι, + Finite + (HerbrandHMinusOne G + (TransitivePermutationLattice + (permutationOrbitStabilizer ω)) σ) := + fun ω => + transitivePermutationLatticeHerbrandHMinusOneFinite + (permutationOrbitStabilizer ω) σ hgen + let familyH0Finite : + Finite + (HerbrandH0 G + (PermutationLatticeOrbitFamily + (fun ω : MulAction.orbitRel.Quotient G ι => + permutationOrbitStabilizer ω))) := + Finite.of_equiv + (∀ ω : MulAction.orbitRel.Quotient G ι, + HerbrandH0 G + (TransitivePermutationLattice + (permutationOrbitStabilizer ω))) + (herbrandH0PiEquiv + (G := G) + (fun ω : MulAction.orbitRel.Quotient G ι => + TransitivePermutationLattice + (permutationOrbitStabilizer ω))).symm.toEquiv + let familyHMinusOneFinite : + Finite + (HerbrandHMinusOne G + (PermutationLatticeOrbitFamily + (fun ω : MulAction.orbitRel.Quotient G ι => + permutationOrbitStabilizer ω)) σ) := + Finite.of_equiv + (∀ ω : MulAction.orbitRel.Quotient G ι, + HerbrandHMinusOne G + (TransitivePermutationLattice + (permutationOrbitStabilizer ω)) σ) + (herbrandHMinusOnePiEquiv + (G := G) + (fun ω : MulAction.orbitRel.Quotient G ι => + TransitivePermutationLattice + (permutationOrbitStabilizer ω)) σ).symm.toEquiv + let functionH0Finite : + Finite + (HerbrandH0 G + (ι → Multiplicative ℤ)) := + permutationFunctionHerbrandH0Finite σ hgen + let functionHMinusOneFinite : + Finite + (HerbrandHMinusOne G + (ι → Multiplicative ℤ) σ) := + permutationFunctionHerbrandHMinusOneFinite σ hgen + let e := + permutationFunctionOrbitEquiv + (G := G) (ι := ι) + let he := + permutationFunctionOrbitEquiv_equivariant + (G := G) (ι := ι) + calc + herbrandQuotient + (G := G) (A := ι → Multiplicative ℤ) σ = + herbrandQuotient + (G := G) + (A := PermutationLatticeOrbitFamily + (fun ω : MulAction.orbitRel.Quotient G ι => + permutationOrbitStabilizer ω)) σ := by + simpa only [e, he] using + (herbrandQuotient_eq_of_equivariantMulEquiv + e he σ) + _ = ∏ ω : MulAction.orbitRel.Quotient G ι, + (Fintype.card + (permutationOrbitStabilizer ω) : ℚ) := + permutationLattice_herbrandQuotient_eq_stabilizerProduct + (fun ω : MulAction.orbitRel.Quotient G ι => + permutationOrbitStabilizer ω) σ hgen + +end CanonicalPermutationFunctions + +section FiniteIndexStableSubgroup + +variable {G : Type uG} {A : Type uA} + [Group G] [CommGroup A] + [MulDistribMulAction G A] + +/-- Restriction of an action to a stable subgroup. -/ +@[reducible] +def stableSubgroupMulDistribMulAction + (B : Subgroup A) + (hstable : ∀ (g : G) (x : A), + x ∈ B → g • x ∈ B) : + MulDistribMulAction G B where + smul g x := ⟨g • x.1, hstable g x.1 x.2⟩ + one_smul x := by + apply Subtype.ext + exact one_smul G x.1 + mul_smul g h x := by + apply Subtype.ext + exact mul_smul g h x.1 + smul_one g := by + apply Subtype.ext + exact MulDistribMulAction.smul_one g + smul_mul g x y := by + apply Subtype.ext + exact MulDistribMulAction.smul_mul + g x.1 y.1 + +@[simp] +theorem stableSubgroup_smul_coe + (B : Subgroup A) + (hstable : ∀ (g : G) (x : A), + x ∈ B → g • x ∈ B) + (g : G) (x : B) : + letI := + stableSubgroupMulDistribMulAction + B hstable + ((g • x : B) : A) = g • (x : A) := + rfl + +/-- The action induced on the quotient by a stable subgroup. -/ +@[reducible] +def stableQuotientMulDistribMulAction + (B : Subgroup A) + (hstable : ∀ (g : G) (x : A), + x ∈ B → g • x ∈ B) : + MulDistribMulAction G (A ⧸ B) where + smul g q := + QuotientGroup.map B B + (MulDistribMulAction.toMonoidHom A g) + (fun _ hx ↦ hstable g _ hx) q + one_smul q := by + refine QuotientGroup.induction_on q ?_ + intro x + change + QuotientGroup.mk' B ((1 : G) • x) = + QuotientGroup.mk' B x + rw [one_smul] + mul_smul g h q := by + refine QuotientGroup.induction_on q ?_ + intro x + change + QuotientGroup.mk' B ((g * h) • x) = + QuotientGroup.mk' B (g • h • x) + rw [mul_smul] + smul_one g := + map_one + (QuotientGroup.map B B + (MulDistribMulAction.toMonoidHom A g) + (fun _ hx ↦ hstable g _ hx)) + smul_mul g q r := + map_mul + (QuotientGroup.map B B + (MulDistribMulAction.toMonoidHom A g) + (fun _ hx ↦ hstable g _ hx)) + q r + +theorem stableQuotient_smul_mk + (B : Subgroup A) + (hstable : ∀ (g : G) (x : A), + x ∈ B → g • x ∈ B) + (g : G) (x : A) : + letI := + stableQuotientMulDistribMulAction + B hstable + g • QuotientGroup.mk' B x = + QuotientGroup.mk' B (g • x) := + rfl + +/-- The inclusion of a stable subgroup is equivariant. -/ +theorem stableSubgroup_subtype_equivariant + (B : Subgroup A) + (hstable : ∀ (g : G) (x : A), + x ∈ B → g • x ∈ B) : + letI := + stableSubgroupMulDistribMulAction + B hstable + ∀ (g : G) (x : B), + B.subtype (g • x) = g • B.subtype x := by + let := + stableSubgroupMulDistribMulAction + B hstable + intro g x + rfl + +/-- The quotient map by a stable subgroup is equivariant. -/ +theorem stableSubgroup_quotientMap_equivariant + (B : Subgroup A) + (hstable : ∀ (g : G) (x : A), + x ∈ B → g • x ∈ B) : + letI := + stableQuotientMulDistribMulAction + B hstable + ∀ (g : G) (x : A), + QuotientGroup.mk' B (g • x) = + g • QuotientGroup.mk' B x := by + let := + stableQuotientMulDistribMulAction + B hstable + intro g x + rfl + +/-- Exactness of the inclusion followed by the quotient map. -/ +theorem stableSubgroup_quotientMap_exact + (B : Subgroup A) : + ∀ x : A, + QuotientGroup.mk' B x = 1 ↔ + ∃ b : B, B.subtype b = x := by + intro x + constructor + · intro hx + have hxB : + x ∈ B := + (QuotientGroup.eq_one_iff x).mp hx + exact ⟨⟨x, hxB⟩, rfl⟩ + · rintro ⟨b, rfl⟩ + exact + (QuotientGroup.eq_one_iff b.1).mpr + b.2 + +end FiniteIndexStableSubgroup + +section FiniteIndexStableSubgroupFiniteness + +variable {G A : Type} + [Group G] [CommGroup A] + [MulDistribMulAction G A] + +variable [Fintype G] + +/-- If the Herbrand quotient is defined on a stable finite-index +subgroup, then it is defined on the ambient module. Finiteness of the +quotient supplies the third term of the exact-sequence argument. -/ +theorem finiteIndexStableSubgroup_ambientHerbrandQuotientDefined + (B : Subgroup A) + (hstable : ∀ (g : G) (x : A), + x ∈ B → g • x ∈ B) + (σ : G) + (hgen : ∀ g : G, + g ∈ Subgroup.zpowers σ) + (hB : + letI := + stableSubgroupMulDistribMulAction + B hstable + HerbrandQuotientDefined G B σ) + [Finite (A ⧸ B)] : + letI _subgroupAction := + stableSubgroupMulDistribMulAction + B hstable + letI _quotientAction := + stableQuotientMulDistribMulAction + B hstable + HerbrandQuotientDefined G A σ := by + let subgroupAction := + stableSubgroupMulDistribMulAction + B hstable + let quotientAction := + stableQuotientMulDistribMulAction + B hstable + let hQ : + HerbrandQuotientDefined + G (A ⧸ B) σ := + ⟨inferInstance, inferInstance⟩ + exact + herbrandQuotientDefined_middle_of_left_right + B.subtype (QuotientGroup.mk' B) + (stableSubgroup_subtype_equivariant + B hstable) + (stableSubgroup_quotientMap_equivariant + B hstable) + (stableSubgroup_quotientMap_exact B) + B.subtype_injective + (QuotientGroup.mk'_surjective B) + σ hgen hB hQ + +/-- Finite-index invariance for permutation lattices: passing from a cyclic +`G`-module to a stable subgroup with finite quotient does not change the +Herbrand quotient. -/ +theorem herbrandQuotient_eq_of_finiteIndex_stableSubgroup + (B : Subgroup A) + (hstable : ∀ (g : G) (x : A), + x ∈ B → g • x ∈ B) + (σ : G) + (hgen : ∀ g : G, + g ∈ Subgroup.zpowers σ) + (hB : + letI := + stableSubgroupMulDistribMulAction + B hstable + HerbrandQuotientDefined G B σ) + [Finite (A ⧸ B)] : + letI _subgroupAction := + stableSubgroupMulDistribMulAction + B hstable + letI _quotientAction := + stableQuotientMulDistribMulAction + B hstable + @herbrandQuotient G A _ _ _ _ + σ = + @herbrandQuotient G B _ _ _ _ + σ := by + let subgroupAction := + stableSubgroupMulDistribMulAction + B hstable + let quotientAction := + stableQuotientMulDistribMulAction + B hstable + let hQ : + HerbrandQuotientDefined + G (A ⧸ B) σ := + ⟨inferInstance, inferInstance⟩ + let hA := + finiteIndexStableSubgroup_ambientHerbrandQuotientDefined + B hstable σ hgen hB + let : Finite + (HerbrandH0 G B) := hB.1 + let : Finite + (HerbrandHMinusOne G B σ) := hB.2 + let : Finite + (HerbrandH0 G A) := hA.1 + let : Finite + (HerbrandHMinusOne G A σ) := hA.2 + let : Finite + (HerbrandH0 G (A ⧸ B)) := hQ.1 + let : Finite + (HerbrandHMinusOne G (A ⧸ B) σ) := + hQ.2 + have hmult : + herbrandQuotient + (G := G) (A := A) σ = + herbrandQuotient + (G := G) (A := B) σ * + herbrandQuotient + (G := G) (A := A ⧸ B) σ := + herbrandQuotient_multiplicative_of_shortExact + B.subtype (QuotientGroup.mk' B) + (stableSubgroup_subtype_equivariant + B hstable) + (stableSubgroup_quotientMap_equivariant + B hstable) + (stableSubgroup_quotientMap_exact B) + B.subtype_injective + (QuotientGroup.mk'_surjective B) + σ hgen + have hquotient : + herbrandQuotient + (G := G) (A := A ⧸ B) σ = 1 := + herbrandQuotient_eq_one_of_finite_module + (G := G) (A := A ⧸ B) σ hgen + change + @herbrandQuotient G A _ _ _ _ + σ = + @herbrandQuotient G B _ _ _ _ + σ + calc + @herbrandQuotient G A _ _ _ _ + σ = + @herbrandQuotient G B _ _ _ _ + σ * + @herbrandQuotient G (A ⧸ B) + _ _ _ _ σ := + hmult + _ = @herbrandQuotient G B _ _ _ _ + σ := by + rw [hquotient, mul_one] + +end FiniteIndexStableSubgroupFiniteness + +end CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits.lean new file mode 100644 index 0000000000..f8839c660a --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientReps +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientTower + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientReps.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientReps.lean new file mode 100644 index 0000000000..19498bdd4d --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientReps.lean @@ -0,0 +1,126 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients +/-! Provides the public declarations in the + `CyclicCohomology.Herbrand.PrincipalUnits.QuotientReps` Lean module. -/ + +@[expose] public section + +namespace CyclicCohomology + +open LocalFieldTheory + +noncomputable +section + +universe u + +open scoped ValuativeRel + +/-- Integer units modulo the `n`-th principal-unit subgroup. + +This named type is the representation boundary: downstream code uses its +quotient interface rather than unfolding the concrete quotient. -/ +def IntegerUnitsModPrincipalUnitsAtLevel + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : Type u := + 𝒪[K]ˣ ⧸ principalUnits K n + +/-- Integer units modulo level principal units form a commutative group. -/ +instance integerUnitsModPrincipalUnitsAtLevelCommGroup + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + CommGroup (IntegerUnitsModPrincipalUnitsAtLevel K n) := by + change CommGroup (𝒪[K]ˣ ⧸ principalUnits K n) + infer_instance + +/-- Explicit comparison with the concrete quotient implementation. -/ +def integerUnitsModPrincipalUnitsAtLevelConcreteEquiv + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + IntegerUnitsModPrincipalUnitsAtLevel K n ≃* + (𝒪[K]ˣ ⧸ principalUnits K n) := by + change (𝒪[K]ˣ ⧸ principalUnits K n) ≃* + (𝒪[K]ˣ ⧸ principalUnits K n) + exact MulEquiv.refl _ + +/-- The canonical class of an integer unit modulo `U_K^n`. -/ +def integerUnitsModPrincipalUnitsAtLevelMk + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + 𝒪[K]ˣ →* IntegerUnitsModPrincipalUnitsAtLevel K n := by + change 𝒪[K]ˣ →* (𝒪[K]ˣ ⧸ principalUnits K n) + exact QuotientGroup.mk' (principalUnits K n) + +/-- The concrete quotient equivalence sends a unit to its canonical class. -/ +@[simp] +theorem integerUnitsModPrincipalUnitsAtLevelConcreteEquiv_mk + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (x : 𝒪[K]ˣ) : + integerUnitsModPrincipalUnitsAtLevelConcreteEquiv K n + (integerUnitsModPrincipalUnitsAtLevelMk K n x) = + QuotientGroup.mk x := + rfl + +/-- Every integer-unit quotient class has a representative. -/ +theorem integerUnitsModPrincipalUnitsAtLevelMk_surjective + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + Function.Surjective (integerUnitsModPrincipalUnitsAtLevelMk K n) := by + change Function.Surjective (QuotientGroup.mk' (principalUnits K n)) + exact QuotientGroup.mk'_surjective (principalUnits K n) + +/-- Eliminate a level quotient through its canonical representatives. -/ +protected theorem IntegerUnitsModPrincipalUnitsAtLevel.inductionOn + {K : Type u} [Field K] [ValuativeRel K] (n : Nat) + {motive : IntegerUnitsModPrincipalUnitsAtLevel K n → Prop} + (q : IntegerUnitsModPrincipalUnitsAtLevel K n) + (h : ∀ x : 𝒪[K]ˣ, + motive (integerUnitsModPrincipalUnitsAtLevelMk K n x)) : + motive q := by + change motive (show 𝒪[K]ˣ ⧸ principalUnits K n from q) + refine QuotientGroup.induction_on q ?_ + intro x + exact h x + +/-- Descend a homomorphism that kills `U_K^n`. -/ +def integerUnitsModPrincipalUnitsAtLevelLift + {K : Type u} {M : Type*} [Field K] [ValuativeRel K] [Group M] + (n : Nat) (f : 𝒪[K]ˣ →* M) (h : principalUnits K n ≤ f.ker) : + IntegerUnitsModPrincipalUnitsAtLevel K n →* M := by + change (𝒪[K]ˣ ⧸ principalUnits K n) →* M + exact QuotientGroup.lift (principalUnits K n) f h + +/-- A map lifted from the integer-unit quotient agrees on representatives. -/ +@[simp] +theorem integerUnitsModPrincipalUnitsAtLevelLift_mk + {K : Type u} {M : Type*} [Field K] [ValuativeRel K] [Group M] + (n : Nat) (f : 𝒪[K]ˣ →* M) (h : principalUnits K n ≤ f.ker) + (x : 𝒪[K]ˣ) : + integerUnitsModPrincipalUnitsAtLevelLift n f h + (integerUnitsModPrincipalUnitsAtLevelMk K n x) = f x := + rfl + +/-- A unit represents the identity exactly when it lies in the level principal-unit subgroup. -/ +theorem integerUnitsModPrincipalUnitsAtLevelMk_eq_one_iff + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (x : 𝒪[K]ˣ) : + integerUnitsModPrincipalUnitsAtLevelMk K n x = 1 ↔ + x ∈ principalUnits K n := by + change (QuotientGroup.mk x : 𝒪[K]ˣ ⧸ principalUnits K n) = 1 ↔ _ + exact QuotientGroup.eq_one_iff x + +/-- Two units represent the same class exactly when their quotient is a level principal unit. -/ +@[simp] +theorem integerUnitsModPrincipalUnitsAtLevelMk_eq_iff_div_mem + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (x y : 𝒪[K]ˣ) : + integerUnitsModPrincipalUnitsAtLevelMk K n x = + integerUnitsModPrincipalUnitsAtLevelMk K n y ↔ + x / y ∈ principalUnits K n := by + change + (QuotientGroup.mk x : 𝒪[K]ˣ ⧸ principalUnits K n) = + QuotientGroup.mk y ↔ _ + exact QuotientGroup.eq_iff_div_mem + +end + +end CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean new file mode 100644 index 0000000000..2bc5e66ce6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean @@ -0,0 +1,751 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Core +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientReps +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +/-! Provides the public declarations in the + `CyclicCohomology.Herbrand.PrincipalUnits.QuotientTower` Lean module. -/ + +@[expose] public section + +namespace CyclicCohomology + +open LocalFieldTheory + +noncomputable +section + +universe u + +open scoped ValuativeRel + +/-- The natural projection `𝒪_Kˣ/U_K^m → 𝒪_Kˣ/U_K^n` for `n ≤ m`. -/ +def integerUnitsModPrincipalUnitsMapOfLe + (K : Type u) [Field K] [ValuativeRel K] {n m : Nat} (hnm : n ≤ m) : + IntegerUnitsModPrincipalUnitsAtLevel K m →* + IntegerUnitsModPrincipalUnitsAtLevel K n := + integerUnitsModPrincipalUnitsAtLevelLift m + (integerUnitsModPrincipalUnitsAtLevelMk K n) + (by + intro x hx + rw [MonoidHom.mem_ker, + integerUnitsModPrincipalUnitsAtLevelMk_eq_one_iff] + exact principalUnits_antitone K hnm hx) + +/-- The level-change map sends a unit class to the class of the same unit. -/ +@[simp] +theorem integerUnitsModPrincipalUnitsMapOfLe_mk + (K : Type u) [Field K] [ValuativeRel K] {n m : Nat} (hnm : n ≤ m) + (x : 𝒪[K]ˣ) : + integerUnitsModPrincipalUnitsMapOfLe K hnm + (integerUnitsModPrincipalUnitsAtLevelMk K m x) = + integerUnitsModPrincipalUnitsAtLevelMk K n x := + integerUnitsModPrincipalUnitsAtLevelLift_mk m + (integerUnitsModPrincipalUnitsAtLevelMk K n) _ x + +/-- The successive projection `𝒪_Kˣ/U_K^(n+1) → 𝒪_Kˣ/U_K^n`. -/ +def integerUnitsModPrincipalUnitsSuccMap + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + IntegerUnitsModPrincipalUnitsAtLevel K (n + 1) →* + IntegerUnitsModPrincipalUnitsAtLevel K n := + integerUnitsModPrincipalUnitsMapOfLe K (Nat.le_succ n) + +/-- The successor-level map sends a unit representative to its successor quotient class. -/ +@[simp] +theorem integerUnitsModPrincipalUnitsSuccMap_mk + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) + (x : 𝒪[K]ˣ) : + integerUnitsModPrincipalUnitsSuccMap K n + (integerUnitsModPrincipalUnitsAtLevelMk K (n + 1) x) = + integerUnitsModPrincipalUnitsAtLevelMk K n x := + integerUnitsModPrincipalUnitsMapOfLe_mk K (Nat.le_succ n) x + +/-- The map to the successor principal-unit quotient is surjective. -/ +theorem integerUnitsModPrincipalUnitsSuccMap_surjective + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + Function.Surjective (integerUnitsModPrincipalUnitsSuccMap K n) := by + intro q + refine IntegerUnitsModPrincipalUnitsAtLevel.inductionOn n + (motive := fun q => ∃ a, integerUnitsModPrincipalUnitsSuccMap K n a = q) + q ?_ + intro x + exact ⟨integerUnitsModPrincipalUnitsAtLevelMk K (n + 1) x, by simp⟩ + +/-- The induced homomorphism on the finite quotient `𝒪_Kˣ/U_K^n`. -/ +def integerUnitsModPrincipalUnitsMapOfIntegerRingEquiv + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (e : 𝒪[K] ≃+* 𝒪[K]) : + IntegerUnitsModPrincipalUnitsAtLevel K n →* + IntegerUnitsModPrincipalUnitsAtLevel K n := + integerUnitsModPrincipalUnitsAtLevelLift n + ((integerUnitsModPrincipalUnitsAtLevelMk K n).comp + (Units.mapEquiv e.toMulEquiv).toMonoidHom) + (by + intro u hu + rw [MonoidHom.mem_ker, MonoidHom.comp_apply, + integerUnitsModPrincipalUnitsAtLevelMk_eq_one_iff] + exact principalUnits_integerRingEquiv_mem_self K n e u hu) + +/-- An integer-ring equivalence maps a unit quotient class via its representative. -/ +@[simp] +theorem integerUnitsModPrincipalUnitsMapOfIntegerRingEquiv_mk + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (e : 𝒪[K] ≃+* 𝒪[K]) (u : 𝒪[K]ˣ) : + integerUnitsModPrincipalUnitsMapOfIntegerRingEquiv K n e + (integerUnitsModPrincipalUnitsAtLevelMk K n u) = + integerUnitsModPrincipalUnitsAtLevelMk K n + (Units.mapEquiv e.toMulEquiv u) := + integerUnitsModPrincipalUnitsAtLevelLift_mk n + ((integerUnitsModPrincipalUnitsAtLevelMk K n).comp + (Units.mapEquiv e.toMulEquiv).toMonoidHom) _ u + +/-- A valuation-integer-ring equivalence descends to the finite quotient +`𝒪_Kˣ/U_K^n`. -/ +def integerUnitsModPrincipalUnitsMapEquivOfIntegerRingEquiv + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (e : 𝒪[K] ≃+* 𝒪[K]) : + IntegerUnitsModPrincipalUnitsAtLevel K n ≃* + IntegerUnitsModPrincipalUnitsAtLevel K n where + toFun := integerUnitsModPrincipalUnitsMapOfIntegerRingEquiv K n e + invFun := integerUnitsModPrincipalUnitsMapOfIntegerRingEquiv K n e.symm + left_inv := by + intro x + refine IntegerUnitsModPrincipalUnitsAtLevel.inductionOn n + (motive := fun x => + integerUnitsModPrincipalUnitsMapOfIntegerRingEquiv K n e.symm + (integerUnitsModPrincipalUnitsMapOfIntegerRingEquiv K n e x) = x) + x ?_ + intro u + rw [integerUnitsModPrincipalUnitsMapOfIntegerRingEquiv_mk, + integerUnitsModPrincipalUnitsMapOfIntegerRingEquiv_mk] + have h : + Units.mapEquiv e.symm.toMulEquiv (Units.mapEquiv e.toMulEquiv u) = u := by + ext + simp + exact congrArg + (integerUnitsModPrincipalUnitsAtLevelMk K n) h + right_inv := by + intro x + refine IntegerUnitsModPrincipalUnitsAtLevel.inductionOn n + (motive := fun x => + integerUnitsModPrincipalUnitsMapOfIntegerRingEquiv K n e + (integerUnitsModPrincipalUnitsMapOfIntegerRingEquiv K n e.symm x) = x) + x ?_ + intro u + rw [integerUnitsModPrincipalUnitsMapOfIntegerRingEquiv_mk, + integerUnitsModPrincipalUnitsMapOfIntegerRingEquiv_mk] + have h : + Units.mapEquiv e.toMulEquiv (Units.mapEquiv e.symm.toMulEquiv u) = u := by + ext + simp + exact congrArg + (integerUnitsModPrincipalUnitsAtLevelMk K n) h + map_mul' := by + intro x y + exact map_mul (integerUnitsModPrincipalUnitsMapOfIntegerRingEquiv K n e) x y + +/-- The induced quotient equivalence acts on a class through its unit representative. -/ +@[simp] +theorem integerUnitsModPrincipalUnitsMapEquivOfIntegerRingEquiv_mk + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (e : 𝒪[K] ≃+* 𝒪[K]) (u : 𝒪[K]ˣ) : + integerUnitsModPrincipalUnitsMapEquivOfIntegerRingEquiv K n e + (integerUnitsModPrincipalUnitsAtLevelMk K n u) = + integerUnitsModPrincipalUnitsAtLevelMk K n + (Units.mapEquiv e.toMulEquiv u) := + integerUnitsModPrincipalUnitsMapOfIntegerRingEquiv_mk K n e u + +/-- The graded quotient `U_K^n/U_K^(n+1)` as the kernel source inside +`𝒪_Kˣ/U_K^(n+1)`. -/ +def principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + PrincipalUnitsSuccQuot K n →* + IntegerUnitsModPrincipalUnitsAtLevel K (n + 1) := + principalUnitsSuccQuotLift n + ((integerUnitsModPrincipalUnitsAtLevelMk K (n + 1)).comp + (principalUnits K n).subtype) + (by + intro u hu + rw [MonoidHom.mem_ker, MonoidHom.comp_apply, + integerUnitsModPrincipalUnitsAtLevelMk_eq_one_iff] + exact hu) + +/-- The principal-unit quotient map sends a representative to its integer-unit class. -/ +@[simp] +theorem principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc_mk + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) + (u : principalUnits K n) : + principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc K n + (principalUnitsSuccQuotMk K n u) = + integerUnitsModPrincipalUnitsAtLevelMk K (n + 1) (u : 𝒪[K]ˣ) := + principalUnitsSuccQuotLift_mk n + ((integerUnitsModPrincipalUnitsAtLevelMk K (n + 1)).comp + (principalUnits K n).subtype) _ u + +/-- The principal-unit inclusion followed by the successor map is the canonical quotient map. -/ +theorem integerUnitsSuccMap_comp_principalUnitsSuccQuot + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + (integerUnitsModPrincipalUnitsSuccMap K n).comp + (principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc K n) = 1 := by + ext q + refine PrincipalUnitsSuccQuot.inductionOn n + (motive := fun q => + ((integerUnitsModPrincipalUnitsSuccMap K n).comp + (principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc K n)) q = + (1 : PrincipalUnitsSuccQuot K n →* + IntegerUnitsModPrincipalUnitsAtLevel K n) q) + q ?_ + intro u + rw [MonoidHom.comp_apply, + principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc_mk, + integerUnitsModPrincipalUnitsSuccMap_mk] + change integerUnitsModPrincipalUnitsAtLevelMk K n (u : 𝒪[K]ˣ) = 1 + rw [integerUnitsModPrincipalUnitsAtLevelMk_eq_one_iff] + exact u.2 + +/-- Exactness of `U_K^n/U_K^(n+1) → 𝒪_Kˣ/U_K^(n+1) → 𝒪_Kˣ/U_K^n` +at the middle finite-filtration quotient. -/ +theorem principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc_range_eq_ker + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + MonoidHom.range (principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc K n) = + MonoidHom.ker (integerUnitsModPrincipalUnitsSuccMap K n) := by + ext q + constructor + · rintro ⟨x, rfl⟩ + change (integerUnitsModPrincipalUnitsSuccMap K n).comp + (principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc K n) x = 1 + rw [integerUnitsSuccMap_comp_principalUnitsSuccQuot] + rfl + · intro hq + revert hq + refine IntegerUnitsModPrincipalUnitsAtLevel.inductionOn (n + 1) + (motive := fun q => + q ∈ MonoidHom.ker (integerUnitsModPrincipalUnitsSuccMap K n) → + q ∈ MonoidHom.range + (principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc K n)) + q ?_ + intro x hq + have hx : x ∈ principalUnits K n := by + exact (integerUnitsModPrincipalUnitsAtLevelMk_eq_one_iff K n x).1 + (by simpa using hq) + let u : principalUnits K n := ⟨x, hx⟩ + exact ⟨principalUnitsSuccQuotMk K n u, by + rw [principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc_mk]⟩ + +/-- The induced map from the successive principal-unit quotient is injective. -/ +theorem principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc_injective + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + Function.Injective (principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc K n) := by + intro x y hxy + obtain ⟨u, rfl⟩ := principalUnitsSuccQuotMk_surjective K n x + obtain ⟨v, rfl⟩ := principalUnitsSuccQuotMk_surjective K n y + apply (principalUnitsSuccQuotMk_eq_iff_div_mem K n u v).2 + have hq : + integerUnitsModPrincipalUnitsAtLevelMk K (n + 1) (u : 𝒪[K]ˣ) = + integerUnitsModPrincipalUnitsAtLevelMk K (n + 1) (v : 𝒪[K]ˣ) := by + simpa only [principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc_mk] using hxy + have hmem : + ((u : 𝒪[K]ˣ) / (v : 𝒪[K]ˣ)) ∈ principalUnits K (n + 1) := + (integerUnitsModPrincipalUnitsAtLevelMk_eq_iff_div_mem K (n + 1) + (u : 𝒪[K]ˣ) (v : 𝒪[K]ˣ)).1 hq + change ((u / v : principalUnits K n) : 𝒪[K]ˣ) ∈ principalUnits K (n + 1) + simpa using hmem + +/-- A unit maps to the identity at the successor level exactly when it has a principal-unit lift. -/ +theorem integerUnitsModPrincipalUnitsSuccMap_eq_one_iff_exists + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) + (x : IntegerUnitsModPrincipalUnitsAtLevel K (n + 1)) : + integerUnitsModPrincipalUnitsSuccMap K n x = 1 ↔ + ∃ y : PrincipalUnitsSuccQuot K n, + principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc K n y = x := by + change x ∈ MonoidHom.ker (integerUnitsModPrincipalUnitsSuccMap K n) ↔ + x ∈ MonoidHom.range (principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc K n) + rw [← principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc_range_eq_ker K n] + +/-- Integral-closure Galois action on the finite quotient +`𝒪_Lˣ/U_L^n`. -/ +def galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) (σ : Gal(L/K)) : + IntegerUnitsModPrincipalUnitsAtLevel L n ≃* + IntegerUnitsModPrincipalUnitsAtLevel L n := + integerUnitsModPrincipalUnitsMapEquivOfIntegerRingEquiv L n + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) + +/-- The Galois-induced quotient equivalence acts on a class through its representative. -/ +@[simp] +theorem galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure_mk + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) (σ : Gal(L/K)) (u : 𝒪[L]ˣ) : + galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure K L n σ + (integerUnitsModPrincipalUnitsAtLevelMk L n u) = + integerUnitsModPrincipalUnitsAtLevelMk L n + (Units.mapEquiv + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ).toMulEquiv u) := + integerUnitsModPrincipalUnitsMapEquivOfIntegerRingEquiv_mk L n + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) u + +/-- Integral-closure Galois action on finite principal-unit +quotients as a group homomorphism. -/ +def galoisGroupIntegerUnitsModPrincipalUnitsMapEquivHomOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) : + Gal(L/K) →* + (IntegerUnitsModPrincipalUnitsAtLevel L n ≃* + IntegerUnitsModPrincipalUnitsAtLevel L n) where + toFun := galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure K L n + map_one' := by + ext x + refine IntegerUnitsModPrincipalUnitsAtLevel.inductionOn n + (motive := fun x => + galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure + K L n 1 x = x) + x ?_ + intro u + rw [galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure_mk] + congr 1 + map_mul' := by + intro σ τ + ext x + refine IntegerUnitsModPrincipalUnitsAtLevel.inductionOn n + (motive := fun x => + galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure + K L n (σ * τ) x = + (galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure + K L n σ * + galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure + K L n τ) x) + x ?_ + intro u + rw [galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure_mk] + change + integerUnitsModPrincipalUnitsAtLevelMk L n + (Units.mapEquiv + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L (σ * τ)).toMulEquiv u) = + galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure K L n σ + (galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure K L n τ + (integerUnitsModPrincipalUnitsAtLevelMk L n u)) + rw [ + galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure_mk, + galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure_mk] + congr 1 + +/-- Integral-closure Galois action on finite principal-unit +quotients, packaged for low-degree Herbrand quotients. -/ +@[implicit_reducible] +def galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) : + MulDistribMulAction (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n) where + smul σ x := galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure K L n σ x + one_smul := by + intro x + change galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure K L n 1 x = x + have h := congrArg (fun e : IntegerUnitsModPrincipalUnitsAtLevel L n ≃* + IntegerUnitsModPrincipalUnitsAtLevel L n => e x) + (map_one (galoisGroupIntegerUnitsModPrincipalUnitsMapEquivHomOfIsIntegralClosure K L n)) + exact h + mul_smul := by + intro σ τ x + change galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure K L n + (σ * τ) x = + galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure K L n σ + (galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure K L n τ x) + have h := congrArg (fun e : IntegerUnitsModPrincipalUnitsAtLevel L n ≃* + IntegerUnitsModPrincipalUnitsAtLevel L n => e x) + (map_mul (galoisGroupIntegerUnitsModPrincipalUnitsMapEquivHomOfIsIntegralClosure K L n) + σ τ) + exact h + smul_mul := by + intro σ x y + exact map_mul (galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure + K L n σ) x y + smul_one := by + intro σ + exact map_one (galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure K L n σ) + +/-- The Galois action on integer units modulo principal units is induced on representatives. -/ +theorem galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure_smul + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) (σ : Gal(L/K)) (x : IntegerUnitsModPrincipalUnitsAtLevel L n) : + letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure + K L n + σ • x = galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure K L n σ x := + rfl + +/-- The successive finite-principal-unit quotient map is equivariant for the +integral-closure Galois actions. -/ +theorem integerUnitsModPrincipalUnitsSuccMap_galoisGroup_of_isIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) (σ : Gal(L/K)) + (x : IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) : + letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure + K L (n + 1) + letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure + K L n + integerUnitsModPrincipalUnitsSuccMap L n (σ • x) = + σ • integerUnitsModPrincipalUnitsSuccMap L n x := by + let := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure + K L (n + 1) + let := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n + refine IntegerUnitsModPrincipalUnitsAtLevel.inductionOn (n + 1) + (motive := fun x => + integerUnitsModPrincipalUnitsSuccMap L n (σ • x) = + σ • integerUnitsModPrincipalUnitsSuccMap L n x) + x ?_ + intro u + rw [galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure_smul, + galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure_mk, + integerUnitsModPrincipalUnitsSuccMap_mk, + integerUnitsModPrincipalUnitsSuccMap_mk, + galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure_smul, + galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure_mk] + +/-- The kernel-source map `U_L^n/U_L^(n+1) → 𝒪_Lˣ/U_L^(n+1)` is equivariant +for the integral-closure Galois actions. -/ +theorem principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc_galoisGroup_of_isIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) (σ : Gal(L/K)) (x : PrincipalUnitsSuccQuot L n) : + letI := galoisGroupPrincipalUnitsSuccQuotMulDistribMulActionOfIsIntegralClosure K L n + letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure + K L (n + 1) + principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc L n (σ • x) = + σ • principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc L n x := by + let := galoisGroupPrincipalUnitsSuccQuotMulDistribMulActionOfIsIntegralClosure K L n + let := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure + K L (n + 1) + refine PrincipalUnitsSuccQuot.inductionOn n + (motive := fun x => + principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc L n (σ • x) = + σ • principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc L n x) + x ?_ + intro u + rw [galoisGroupPrincipalUnitsSuccQuotMulDistribMulActionOfIsIntegralClosure_smul, + galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure, + principalUnitsSuccQuotMapEquivOfIntegerRingEquiv_apply, + principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc_mk, + principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc_mk, + galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure_smul, + galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure_mk] + rfl + +/-- The quotient `𝒪_Kˣ/U_K^0` is finite because `U_K^0 = 𝒪_Kˣ`. -/ +theorem integerUnitsModPrincipalUnitsAtLevel_finite_zero + (K : Type u) [Field K] [ValuativeRel K] : + Finite (IntegerUnitsModPrincipalUnitsAtLevel K 0) := by + let : Finite (𝒪[K]ˣ ⧸ principalUnits K 0) := by + rw [principalUnits_zero] + infer_instance + exact Finite.of_equiv (𝒪[K]ˣ ⧸ principalUnits K 0) + (integerUnitsModPrincipalUnitsAtLevelConcreteEquiv K 0).symm.toEquiv + +/-- The initial nontrivial quotient `𝒪_Kˣ/U_K^1` is finite via +`𝒪_Kˣ/U_K^1 ≃ 𝓀_Kˣ`. -/ +theorem integerUnitsModPrincipalUnitsAtLevel_finite_one_of_isNonarchimedeanLocalField + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + Finite (IntegerUnitsModPrincipalUnitsAtLevel K 1) := by + let e : IntegerUnitsModPrincipalUnitsAtLevel K 1 ≃* ResidueUnits K := + (integerUnitsModPrincipalUnitsAtLevelConcreteEquiv K 1).trans + ((integerUnitsModPrincipalUnitsConcreteEquiv K).symm.trans + (integerUnitsModPrincipalUnitsEquivResidueUnits K)) + exact Finite.of_equiv (ResidueUnits K) e.symm.toEquiv + +/-- If the previous finite quotient and the graded quotient are finite, then +the next finite quotient is finite. -/ +theorem integerUnitsModPrincipalUnitsAtLevel_finite_succ_of_finite + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) + [Finite (PrincipalUnitsSuccQuot K n)] + [Finite (IntegerUnitsModPrincipalUnitsAtLevel K n)] : + Finite (IntegerUnitsModPrincipalUnitsAtLevel K (n + 1)) := by + let i := principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc K n + have : Finite i.range := + Finite.of_surjective + (fun a : PrincipalUnitsSuccQuot K n => (⟨i a, ⟨a, rfl⟩⟩ : i.range)) + (by + intro x + rcases x with ⟨b, ⟨a, ha⟩⟩ + exact ⟨a, Subtype.ext ha⟩) + let f := integerUnitsModPrincipalUnitsSuccMap K n + exact (f.finite_iff_finite_ker_range).2 (by + constructor + · rw [← principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc_range_eq_ker K n] + infer_instance + · infer_instance) + +/-- Every finite principal-unit quotient `𝒪_Kˣ/U_K^n` is finite over a +nonarchimedean local field. -/ +theorem integerUnitsModPrincipalUnitsAtLevel_finite_of_isNonarchimedeanLocalField + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (n : Nat) : + Finite (IntegerUnitsModPrincipalUnitsAtLevel K n) := by + induction n with + | zero => + exact integerUnitsModPrincipalUnitsAtLevel_finite_zero K + | succ n ih => + cases n with + | zero => + exact integerUnitsModPrincipalUnitsAtLevel_finite_one_of_isNonarchimedeanLocalField K + | succ k => + have : Finite (PrincipalUnitsSuccQuot K (k + 1)) := + finite_principalUnitsSuccQuot K (k + 1) (Nat.succ_le_succ (Nat.zero_le k)) + exact integerUnitsModPrincipalUnitsAtLevel_finite_succ_of_finite K (k + 1) + +/-- Actual `H⁰` finiteness for the finite quotient `𝒪_Lˣ/U_L^n`. -/ +theorem integerUnitsModPrincipalUnitsAtLevel_herbrandH0_finite_of_isNonarchimedeanLocalField + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Fintype (Gal(L/K))] (n : Nat) : + letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n + Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n)) := by + let := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n + let : Finite (IntegerUnitsModPrincipalUnitsAtLevel L n) := + integerUnitsModPrincipalUnitsAtLevel_finite_of_isNonarchimedeanLocalField L n + infer_instance + +/-- Actual `H^{-1}` finiteness for the finite quotient `𝒪_Lˣ/U_L^n`. -/ +theorem integerUnitsModPrincipalUnitsAtLevel_herbrandHMinusOne_finite_of_isNonarchimedeanLocalField + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Fintype (Gal(L/K))] (n : Nat) (σ : Gal(L/K)) : + letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n + Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n) σ) := by + let := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n + let : Finite (IntegerUnitsModPrincipalUnitsAtLevel L n) := + integerUnitsModPrincipalUnitsAtLevel_finite_of_isNonarchimedeanLocalField L n + infer_instance + +/-- Actual finite-cyclic-module endpoint for the finite quotient +`𝒪_Lˣ/U_L^n`. -/ +theorem integerUnitsModPrincipalUnitsAtLevel_herbrandQuotient_eq_one_of_isNonarchimedeanLocalField + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Fintype (Gal(L/K))] (n : Nat) (σ : Gal(L/K)) + (hgen : ∀ g : Gal(L/K), g ∈ Subgroup.zpowers σ) : + letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n + letI : Finite (IntegerUnitsModPrincipalUnitsAtLevel L n) := + integerUnitsModPrincipalUnitsAtLevel_finite_of_isNonarchimedeanLocalField L n + CyclicCohomology.ProfiniteCohomology.Herbrand.herbrandQuotient + (G := Gal(L/K)) (A := IntegerUnitsModPrincipalUnitsAtLevel L n) σ = 1 := by + let := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n + let : Finite (IntegerUnitsModPrincipalUnitsAtLevel L n) := + integerUnitsModPrincipalUnitsAtLevel_finite_of_isNonarchimedeanLocalField L n + exact CyclicCohomology.ProfiniteCohomology.Herbrand.herbrandQuotient_finite_module_eq_one + (G := Gal(L/K)) (A := IntegerUnitsModPrincipalUnitsAtLevel L n) σ hgen + +/-- GC Herbrand multiplicativity specialized to the actual finite principal-unit +quotient tower +`U_L^n/U_L^(n+1) → 𝒪_Lˣ/U_L^(n+1) → 𝒪_Lˣ/U_L^n`. -/ +theorem integerUnitsModPrincipalUnitsSucc_herbrandQuotient_exact_multiplicative_of_isIntegralClosure + (K L : Type) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Fintype (Gal(L/K))] (n : Nat) (σ : Gal(L/K)) + (hgen : ∀ g : Gal(L/K), g ∈ Subgroup.zpowers σ) + (hA0 : + letI := galoisGroupPrincipalUnitsSuccQuotMulDistribMulActionOfIsIntegralClosure K L n + Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 + (Gal(L/K)) (PrincipalUnitsSuccQuot L n))) + (hAm : + letI := galoisGroupPrincipalUnitsSuccQuotMulDistribMulActionOfIsIntegralClosure K L n + Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne + (Gal(L/K)) (PrincipalUnitsSuccQuot L n) σ)) + (hB0 : + letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure + K L (n + 1) + Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)))) + (hBm : + letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure + K L (n + 1) + Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) σ)) + (hC0 : + letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure + K L n + Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n))) + (hCm : + letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure + K L n + Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n) σ)) : + letI := galoisGroupPrincipalUnitsSuccQuotMulDistribMulActionOfIsIntegralClosure K L n + letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure + K L (n + 1) + letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n + letI : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 + (Gal(L/K)) (PrincipalUnitsSuccQuot L n)) := hA0 + letI : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne + (Gal(L/K)) (PrincipalUnitsSuccQuot L n) σ) := hAm + letI : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1))) := hB0 + letI : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) σ) := hBm + letI : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n)) := hC0 + letI : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n) σ) := hCm + CyclicCohomology.ProfiniteCohomology.Herbrand.herbrandQuotient + (G := Gal(L/K)) (A := IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) σ = + CyclicCohomology.ProfiniteCohomology.Herbrand.herbrandQuotient + (G := Gal(L/K)) (A := PrincipalUnitsSuccQuot L n) σ * + CyclicCohomology.ProfiniteCohomology.Herbrand.herbrandQuotient + (G := Gal(L/K)) (A := IntegerUnitsModPrincipalUnitsAtLevel L n) σ := by + let := galoisGroupPrincipalUnitsSuccQuotMulDistribMulActionOfIsIntegralClosure K L n + let := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure + K L (n + 1) + let := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n + let : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 + (Gal(L/K)) (PrincipalUnitsSuccQuot L n)) := hA0 + let : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne + (Gal(L/K)) (PrincipalUnitsSuccQuot L n) σ) := hAm + let : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1))) := hB0 + let : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) σ) := hBm + let : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n)) := hC0 + let : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n) σ) := hCm + exact CyclicCohomology.ProfiniteCohomology.Herbrand.herbrandQuotient_exact_multiplicative + (G := Gal(L/K)) + (A := PrincipalUnitsSuccQuot L n) + (B := IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) + (C := IntegerUnitsModPrincipalUnitsAtLevel L n) + (principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc L n) + (integerUnitsModPrincipalUnitsSuccMap L n) + (by + intro g x + exact + principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc_galoisGroup_of_isIntegralClosure + K L n g x) + (by + intro g x + exact integerUnitsModPrincipalUnitsSuccMap_galoisGroup_of_isIntegralClosure K L n g x) + (integerUnitsModPrincipalUnitsSuccMap_eq_one_iff_exists L n) + (principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc_injective L n) + (by + intro x + exact integerUnitsModPrincipalUnitsSuccMap_surjective L n x) + σ hgen + +/-- If the graded quotient and the previous finite quotient both have Herbrand +quotient `1`, the next finite quotient has Herbrand quotient `1`. -/ +theorem integerUnitsModPrincipalUnitsSucc_herbrandQuotient_eq_one_of_isIntegralClosure + (K L : Type) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Fintype (Gal(L/K))] (n : Nat) (σ : Gal(L/K)) + (hgen : ∀ g : Gal(L/K), g ∈ Subgroup.zpowers σ) + (hA0 : + letI := galoisGroupPrincipalUnitsSuccQuotMulDistribMulActionOfIsIntegralClosure K L n + Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 + (Gal(L/K)) (PrincipalUnitsSuccQuot L n))) + (hAm : + letI := galoisGroupPrincipalUnitsSuccQuotMulDistribMulActionOfIsIntegralClosure K L n + Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne + (Gal(L/K)) (PrincipalUnitsSuccQuot L n) σ)) + (hB0 : + letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure + K L (n + 1) + Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)))) + (hBm : + letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure + K L (n + 1) + Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) σ)) + (hC0 : + letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure + K L n + Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n))) + (hCm : + letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure + K L n + Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n) σ)) + (hA : + letI := galoisGroupPrincipalUnitsSuccQuotMulDistribMulActionOfIsIntegralClosure K L n + letI : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 + (Gal(L/K)) (PrincipalUnitsSuccQuot L n)) := hA0 + letI : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne + (Gal(L/K)) (PrincipalUnitsSuccQuot L n) σ) := hAm + CyclicCohomology.ProfiniteCohomology.Herbrand.herbrandQuotient + (G := Gal(L/K)) (A := PrincipalUnitsSuccQuot L n) σ = 1) + (hC : + letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n + letI : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n)) := hC0 + letI : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n) σ) := hCm + CyclicCohomology.ProfiniteCohomology.Herbrand.herbrandQuotient + (G := Gal(L/K)) (A := IntegerUnitsModPrincipalUnitsAtLevel L n) σ = 1) : + letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure + K L (n + 1) + letI : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1))) := hB0 + letI : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) σ) := hBm + CyclicCohomology.ProfiniteCohomology.Herbrand.herbrandQuotient + (G := Gal(L/K)) (A := IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) σ = 1 := by + let := galoisGroupPrincipalUnitsSuccQuotMulDistribMulActionOfIsIntegralClosure K L n + let := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure + K L (n + 1) + let := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n + let : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 + (Gal(L/K)) (PrincipalUnitsSuccQuot L n)) := hA0 + let : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne + (Gal(L/K)) (PrincipalUnitsSuccQuot L n) σ) := hAm + let : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1))) := hB0 + let : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) σ) := hBm + let : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n)) := hC0 + let : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n) σ) := hCm + rw [integerUnitsModPrincipalUnitsSucc_herbrandQuotient_exact_multiplicative_of_isIntegralClosure + K L n σ hgen hA0 hAm hB0 hBm hC0 hCm, hA, hC, one_mul] + +end +end CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Product.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Product.lean new file mode 100644 index 0000000000..7a35c555af --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Product.lean @@ -0,0 +1,87 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Product +/-! +# Herbrand quotients of finite products + +This file extracts the cardinality consequence of the product +decompositions of low-degree Tate cohomology, giving the corresponding +product formula for Herbrand quotients. +-/ + +@[expose] public section + +open scoped BigOperators + +noncomputable +section + +namespace CyclicCohomology + +open CyclicCohomology.ProfiniteCohomology.Herbrand + +universe uG uι uA + +variable {G : Type uG} [Group G] [Fintype G] +variable {ι : Type uι} [Fintype ι] +variable (A : ι → Type uA) +variable [∀ i, CommGroup (A i)] +variable [∀ i, MulDistribMulAction G (A i)] + +/-- The componentwise multiplicative action on a dependent product distributes over +multiplication. -/ +local instance herbrandPiMulDistribMulAction : + MulDistribMulAction G (∀ i, A i) := + piMulDistribMulAction G A + +/-- The Herbrand quotient of a finite dependent product is the product of +the component Herbrand quotients. -/ +theorem herbrandQuotient_pi + (σ : G) + [∀ i, Finite (HerbrandH0 G (A i))] + [∀ i, Finite (HerbrandHMinusOne G (A i) σ)] : + letI : Finite (HerbrandH0 G (∀ i, A i)) := + Finite.of_equiv + (∀ i, HerbrandH0 G (A i)) + (herbrandH0PiEquiv (G := G) A).symm.toEquiv + letI : Finite (HerbrandHMinusOne G (∀ i, A i) σ) := + Finite.of_equiv + (∀ i, HerbrandHMinusOne G (A i) σ) + (herbrandHMinusOnePiEquiv + (G := G) A σ).symm.toEquiv + herbrandQuotient (G := G) (A := ∀ i, A i) σ = + ∏ i, herbrandQuotient (G := G) (A := A i) σ := by + let : Finite (HerbrandH0 G (∀ i, A i)) := + Finite.of_equiv + (∀ i, HerbrandH0 G (A i)) + (herbrandH0PiEquiv (G := G) A).symm.toEquiv + let : Finite (HerbrandHMinusOne G (∀ i, A i) σ) := + Finite.of_equiv + (∀ i, HerbrandHMinusOne G (A i) σ) + (herbrandHMinusOnePiEquiv + (G := G) A σ).symm.toEquiv + unfold herbrandQuotient + rw [Nat.card_congr + (herbrandH0PiEquiv (G := G) A).toEquiv, + Nat.card_congr + (herbrandHMinusOnePiEquiv + (G := G) A σ).toEquiv, + Nat.card_pi, Nat.card_pi] + simp only [Nat.cast_prod] + simpa only [Finset.mem_univ, Finset.prod_const_one, + Finset.prod_filter, true_and] using + (Finset.prod_div_distrib + (s := Finset.univ) + (fun i : ι ↦ + (Nat.card (HerbrandH0 G (A i)) : ℚ)) + (fun i : ι ↦ + (Nat.card + (HerbrandHMinusOne G (A i) σ) : ℚ))).symm + +end CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/IntegralRepUniverse.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/IntegralRepUniverse.lean new file mode 100644 index 0000000000..aafc44414b --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/IntegralRepUniverse.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +/-! +# Universe boundary for integral representations + +Mathlib's `Rep ℤ G` currently requires the coefficient ring and acting group +to inhabit the same universe. Since `ℤ : Type 0`, every representation-bearing +part of local class field theory uses this single named boundary. Keeping the +restriction here makes a future universe-polymorphic migration searchable and +prevents individual subtrees from inventing private aliases. +-/ + +@[expose] public section +/-- The universe-zero group boundary imposed by integral representations. -/ +abbrev IntegralRepGroupType := Type 0 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/NormKernelVanishing.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/NormKernelVanishing.lean new file mode 100644 index 0000000000..a1508a0fcc --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/NormKernelVanishing.lean @@ -0,0 +1,155 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RepresentationTheory.Homological.GroupCohomology.FiniteCyclic +public import Mathlib.RepresentationTheory.Invariants +public import Mathlib.Topology.Algebra.Group.ClosedSubgroup +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison + +/-! # Norm Kernel Vanishing -/ + +@[expose] public section +namespace CyclicCohomology + +/-! +# The cyclic-cohomology vanishing condition + +This file formalizes the cyclic norm-kernel vanishing condition as a property, not as a new Lean + axiom, and +the finite-cyclic cohomology calculation using the actual finite-cyclic group-cohomology + computation. + +The construction writes multiplicative modules with a right action. Here an abelian +group is represented additively as a `ℤ`-linear left representation; passing +between the two conventions replaces a generator by its inverse and does not +change either quotient below. +-/ + +noncomputable +section + +open CategoryTheory + +universe u + +/-- A specified generator supplies the `IsCyclic` instance used throughout +the cyclic cohomology constructions. -/ +theorem isCyclic_of_generator {G : Type} [Group G] (g : G) + (hg : ∀ x : G, x ∈ Subgroup.zpowers g) : IsCyclic G := by + rw [isCyclic_iff_exists_zpowers_eq_top] + refine ⟨g, ?_⟩ + ext x + constructor + · intro _ + exact Subgroup.mem_top x + · intro _ + exact hg x + +/-- If the abstract field `L` extends `K`, this is exactly `G_L` regarded as +a subgroup of `G_K`. The standard `Subgroup.subgroupOf` construction is the +canonical representation; the containment proof only changes the subtype +membership proof and therefore cannot create a second subgroup representation. -/ +abbrev extensionSubgroup {G : Type u} [Group G] [TopologicalSpace G] + (K L : ClosedSubgroup G) (_hLK : L.toSubgroup ≤ K.toSubgroup) : + Subgroup K.toSubgroup := + L.toSubgroup.subgroupOf K.toSubgroup + +/-- The actual coefficient module `A_L` for an abstract Galois extension +`L | K`: restrict the global representation to `G_K`, take `G_L`-fixed +vectors, and descend the action to `G_K / G_L`. + +The subgroup occurring in the quotient is `G_L` viewed inside `G_K`. -/ +noncomputable def extensionFixedRepresentation {G : Type} [Group G] + [TopologicalSpace G] (A : Rep.{0} ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) : + Rep ℤ (K.toSubgroup ⧸ extensionSubgroup K L hLK) := by + exact Rep.quotientToInvariants + (Rep.res K.toSubgroup.subtype A) + (extensionSubgroup K L hLK) + +/-- Continuity of the action on the coefficient module when its carrier has +the discrete topology, exactly as in this construction's definition of a continuous +`G`-module. -/ +def IsContinuousDiscreteRepresentation {G : Type} [Group G] [TopologicalSpace G] + (A : Rep.{0} ℤ G) : Prop := + -- Mathlib orders topologies by reverse inclusion, so `⊥` is discrete. + letI : TopologicalSpace A.V := ⊥ + Continuous fun p : G × A.V => A.ρ p.1 p.2 + +/-- **the cyclic norm-kernel vanishing condition.** The condition on a continuous `G`-module +used by the +construction: `H⁻¹(G(L | K), A_L)` is trivial for every finite cyclic abstract +extension `L | K`. + +Profinite-ness of `G` and continuity of `A` are ambient hypotheses in the +construction, not parts of the cyclic norm-kernel vanishing condition itself. This predicate + therefore records only +the numbered vanishing condition. `hLK` expresses `G_L ≤ G_K`, `hnormal` +that the extension is Galois, `hfinite` that it is finite, and `g, hg` that +its Galois group is cyclic. -/ +def SatisfiesCyclicNormKernelVanishing {G : Type} [Group G] [TopologicalSpace G] + (A : Rep.{0} ℤ G) : Prop := + ∀ (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + (hnormal : (extensionSubgroup K L hLK).Normal) + (hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)) + (g : K.toSubgroup ⧸ extensionSubgroup K L hLK) + (_hg : ∀ x, x ∈ Subgroup.zpowers g), + letI := hnormal + letI := hfinite + letI := Fintype.ofFinite + (K.toSubgroup ⧸ extensionSubgroup K L hLK) + Limits.IsZero + (tateCohomology (extensionFixedRepresentation A K L hLK hnormal) (-1)) + +/-- **the finite-cyclic cohomology calculation.** If `G` is finite cyclic, then +`H¹(G,A) ≅ H⁻¹(G,A)`. + +The right-hand side is the actual homology object +`ker(N_G) / im(ρ(g) - 1)`, not a compatibility placeholder. -/ +noncomputable def finiteCyclicH1IsoTateHMinusOne {G : Type} [Group G] [Fintype G] + (A : Rep.{0} ℤ G) (g : G) (hg : ∀ x, x ∈ Subgroup.zpowers g) : + groupCohomology.H1 A ≅ tateCohomology A (-1) := by + letI : IsCyclic G := isCyclic_of_generator g hg + letI : CommGroup G := IsCyclic.commGroup (α := G) + let e : + groupCohomology.H1 A ≅ + (Rep.FiniteCyclicGroup.subCompNormHom A g).homology := by + simpa using + (Rep.FiniteCyclicGroup.groupCohomologyIsoOdd A g hg 1 (by simp)) + exact e ≪≫ (TateCohomology.isoFiniteCyclicNegOne A g hg).symm + +/-- Elementwise content of the vanishing condition in the cyclic norm-kernel vanishing +condition: every +norm-zero element is in the image of `ρ(g) - 1`. This is the source used in +the cyclic step of abstract Kummer theory; the conclusion is extracted from +the actual homology object rather than assumed separately. -/ +theorem normKernel_le_sigmaMinusOneRange_of_tateHMinusOne_isZero + {G : Type} [Group G] [Fintype G] + (A : Rep.{0} ℤ G) (g : G) (hg : ∀ x, x ∈ Subgroup.zpowers g) + (hzero : Limits.IsZero (tateCohomology A (-1))) : + ∀ x : A.V, A.norm.hom x = 0 → + ∃ y : A.V, A.ρ g y - y = x := by + let : IsCyclic G := isCyclic_of_generator g hg + let : CommGroup G := IsCyclic.commGroup (α := G) + have hH1 : Limits.IsZero (groupCohomology.H1 A) := + Limits.IsZero.of_iso hzero (finiteCyclicH1IsoTateHMinusOne A g hg) + let : Subsingleton (groupCohomology.H1 A) := + ModuleCat.subsingleton_of_isZero hH1 + intro x hx + let : Module ℤ A.V := A.hV2 + let x' : LinearMap.ker A.norm.hom.toLinearMap := ⟨x, hx⟩ + have hclass : + Rep.FiniteCyclicGroup.groupCohomologyπOdd A g hg 1 (by simp) x' = 0 := + Subsingleton.elim _ _ + rcases (Rep.FiniteCyclicGroup.groupCohomologyπOdd_eq_zero_iff + A g hg 1 (by simp) x').1 hclass with ⟨y, hy⟩ + exact ⟨y, by simpa [Rep.sub_hom] using hy⟩ + +end +end CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateComparison.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateComparison.lean new file mode 100644 index 0000000000..7c3897439f --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateComparison.lean @@ -0,0 +1,140 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RepresentationTheory.Homological.FiniteCyclic +public import Mathlib.RepresentationTheory.Homological.TateCohomology.Basic +/-! +# Boundary-degree Tate cohomology for finite cyclic groups + +This file identifies mathlib's Tate cohomology in degrees `0` and `-1` with the +standard finite-cyclic short complexes. It adds no alternative cohomology +model: both targets are the homology objects already defined by mathlib. +-/ + +@[expose] public section + +noncomputable +section + +open CategoryTheory + +namespace TateCohomology + +universe u + +/-- Degree-zero Tate cohomology is the homology of the standard boundary +short complex `A --N--> A --d₀₁--> C¹(G, A)` for every finite group. -/ +def isoZeroBoundary {R G : Type u} [CommRing R] [Group G] [Fintype G] + (A : Rep R G) : + tateCohomology A 0 ≅ + (ShortComplex.mk A.norm.toModuleCatHom (groupCohomology.d₀₁ A) + (Rep.norm_comp_d_eq_zero A)).homology := by + let S : ShortComplex (ModuleCat R) := + .mk A.norm.toModuleCatHom (groupCohomology.d₀₁ A) + (Rep.norm_comp_d_eq_zero A) + let eS : (tateComplex A).sc 0 ≅ S := + (tateComplex A).isoSc' (-1) 0 1 (by simp) (by simp) ≪≫ + ShortComplex.isoMk + (by exact groupHomology.chainsIso₀ A) + (groupCohomology.cochainsIso₀ A) + (groupCohomology.cochainsIso₁ A) + (by + change + (groupHomology.chainsIso₀ A).hom ≫ A.norm.toModuleCatHom = + A.tateNorm ≫ (groupCohomology.cochainsIso₀ A).hom + rw [Rep.tateNorm] + simp) + (groupCohomology.comp_d₀₁_eq A) + exact ShortComplex.homologyMapIso eS + +/-- For a finite cyclic group generated by `g`, degree-zero Tate cohomology is +the homology of `A --N--> A --(ρ(g) - 1)--> A`. -/ +def isoFiniteCyclicZero {R G : Type u} [CommRing R] [CommGroup G] [Fintype G] + (A : Rep R G) (g : G) (hg : ∀ x, x ∈ Subgroup.zpowers g) : + tateCohomology A 0 ≅ + (Rep.FiniteCyclicGroup.normHomCompSub A g).homology := by + let S : ShortComplex (ModuleCat R) := + .mk A.norm.toModuleCatHom (groupCohomology.d₀₁ A) + (Rep.norm_comp_d_eq_zero A) + let T := Rep.FiniteCyclicGroup.normHomCompSub A g + have hker : LinearMap.ker S.g.hom = LinearMap.ker T.g.hom := by + dsimp [S, T] + rw [groupCohomology.d₀₁_ker_eq_invariants] + ext x + simpa [Rep.sub_hom, sub_eq_zero] using + Representation.mem_invariants_iff_of_forall_mem_zpowers A.ρ g hg x + let eK : LinearMap.ker S.g.hom ≃ₗ[R] LinearMap.ker T.g.hom := + LinearEquiv.ofEq _ _ hker + have hboundary : + (LinearMap.range S.moduleCatToCycles).map eK.toLinearMap = + LinearMap.range T.moduleCatToCycles := by + ext x + constructor + · rintro ⟨y, ⟨z, rfl⟩, rfl⟩ + refine ⟨z, ?_⟩ + apply Subtype.ext + rfl + · rintro ⟨z, rfl⟩ + refine ⟨S.moduleCatToCycles z, ⟨z, rfl⟩, ?_⟩ + apply Subtype.ext + rfl + let eQ : S.moduleCatLeftHomologyData.H ≅ T.moduleCatLeftHomologyData.H := + (Submodule.Quotient.equiv _ _ eK hboundary).toModuleIso + exact isoZeroBoundary A ≪≫ + S.moduleCatHomologyIso ≪≫ eQ ≪≫ T.moduleCatHomologyIso.symm + +/-- For a finite cyclic group generated by `g`, degree-minus-one Tate +cohomology is the homology of `A --(ρ(g) - 1)--> A --N--> A`. -/ +def isoFiniteCyclicNegOne {R G : Type u} [CommRing R] [CommGroup G] [Fintype G] + (A : Rep R G) (g : G) (hg : ∀ x, x ∈ Subgroup.zpowers g) : + tateCohomology A (-1) ≅ + (Rep.FiniteCyclicGroup.subCompNormHom A g).homology := by + let S : ShortComplex (ModuleCat R) := + .mk (groupHomology.d₁₀ A) A.norm.toModuleCatHom (Rep.comp_eq_zero A) + let eS : (tateComplex A).sc (-1) ≅ S := + (tateComplex A).isoSc' (-2) (-1) 0 (by simp) (by simp) ≪≫ + ShortComplex.isoMk + (groupHomology.chainsIso₁ A) + (groupHomology.chainsIso₀ A) + (groupCohomology.cochainsIso₀ A) + (groupHomology.comp_d₁₀_eq A) + (by simp [S, tateComplex, Rep.tateNorm]; rfl) + let T := Rep.FiniteCyclicGroup.subCompNormHom A g + have hRange : LinearMap.range S.f.hom = LinearMap.range T.f.hom := by + dsimp [S, T] + rw [groupHomology.range_d₁₀_eq_coinvariantsKer] + exact Representation.FiniteCyclicGroup.coinvariantsKer_eq_range A.ρ g hg + let eK : LinearMap.ker S.g.hom ≃ₗ[R] LinearMap.ker T.g.hom := + LinearEquiv.ofEq _ _ rfl + have hboundary : + (LinearMap.range S.moduleCatToCycles).map eK.toLinearMap = + LinearMap.range T.moduleCatToCycles := by + ext x + constructor + · rintro ⟨y, ⟨z, rfl⟩, rfl⟩ + have hz : S.f z ∈ LinearMap.range T.f.hom := by + rw [← hRange] + exact ⟨z, rfl⟩ + rcases hz with ⟨w, hw⟩ + refine ⟨w, ?_⟩ + apply Subtype.ext + exact hw + · rintro ⟨w, rfl⟩ + have hw : T.f w ∈ LinearMap.range S.f.hom := by + rw [hRange] + exact ⟨w, rfl⟩ + rcases hw with ⟨z, hz⟩ + refine ⟨S.moduleCatToCycles z, ⟨z, rfl⟩, ?_⟩ + apply Subtype.ext + exact hz + let eQ : S.moduleCatLeftHomologyData.H ≅ T.moduleCatLeftHomologyData.H := + (Submodule.Quotient.equiv _ _ eK hboundary).toModuleIso + exact ShortComplex.homologyMapIso eS ≪≫ + S.moduleCatHomologyIso ≪≫ eQ ≪≫ T.moduleCatHomologyIso.symm + +end TateCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0.lean new file mode 100644 index 0000000000..3d6018bd30 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Invariants +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Main +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.NormImage + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Invariants.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Invariants.lean new file mode 100644 index 0000000000..7fb8b5c571 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Invariants.lean @@ -0,0 +1,156 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RepresentationTheory.Invariants +public import Mathlib.FieldTheory.Galois.Basic +/-! +# Invariant units + +The actual invariant submodule of the unit representation, together with its +arithmetic identification with the units of the base field. +-/ + +@[expose] public section + +namespace CyclicCohomology + +noncomputable +section + +/-- The actual invariant submodule of the unit representation `Lˣ` under `Gal(L/K)`. -/ +def unitsInvariantSubmodule (K L : Type) [Field K] [Field L] [Algebra K L] : + Submodule ℤ (Additive Lˣ) := + (Rep.ofAlgebraAutOnUnits K L).ρ.invariants + +/-- Descend a Galois-invariant extension-field unit to the base field. -/ +noncomputable def invariantUnitToBaseUnit (K L : Type) + [Field K] [Field L] [Algebra K L] [IsGalois K L] [FiniteDimensional K L] + (x : unitsInvariantSubmodule K L) : Kˣ := by + classical + let y : Lˣ := Additive.toMul (x : Additive Lˣ) + have hfixed : ∀ σ : Gal(L/K), σ (y : L) = (y : L) := by + intro σ + have h := + congrArg (fun z : Additive Lˣ => ((Additive.toMul z : Lˣ) : L)) (x.property σ) + have hρ : + (Rep.ofAlgebraAutOnUnits K L).ρ σ (x : Additive Lˣ) = + Additive.ofMul + (Units.mapEquiv σ.toMulEquiv (Additive.toMul (x : Additive Lˣ))) := + rfl + rw [hρ] at h + simpa [y] using h + have hmem : (y : L) ∈ Set.range (algebraMap K L) := + (IsGalois.mem_range_algebraMap_iff_fixed (F := K) (E := L) (y : L)).2 hfixed + let a : K := Classical.choose hmem + have ha : algebraMap K L a = (y : L) := Classical.choose_spec hmem + have ha0 : a ≠ 0 := by + intro hzero + exact y.ne_zero (by rw [← ha, hzero, map_zero]) + exact ⟨a, a⁻¹, by simp [ha0], by simp [ha0]⟩ + +private lemma invariantUnitToBaseUnit_spec (K L : Type) + [Field K] [Field L] [Algebra K L] [IsGalois K L] [FiniteDimensional K L] + (x : unitsInvariantSubmodule K L) : + algebraMap K L (invariantUnitToBaseUnit K L x : K) = + ((Additive.toMul (x : Additive Lˣ) : Lˣ) : L) := by + classical + let y : Lˣ := Additive.toMul (x : Additive Lˣ) + have hfixed : ∀ σ : Gal(L/K), σ (y : L) = (y : L) := by + intro σ + have h := + congrArg (fun z : Additive Lˣ => ((Additive.toMul z : Lˣ) : L)) (x.property σ) + have hρ : + (Rep.ofAlgebraAutOnUnits K L).ρ σ (x : Additive Lˣ) = + Additive.ofMul + (Units.mapEquiv σ.toMulEquiv (Additive.toMul (x : Additive Lˣ))) := + rfl + rw [hρ] at h + simpa [y] using h + have hmem : (y : L) ∈ Set.range (algebraMap K L) := + (IsGalois.mem_range_algebraMap_iff_fixed (F := K) (E := L) (y : L)).2 hfixed + change algebraMap K L (Classical.choose hmem) = (y : L) + exact Classical.choose_spec hmem + +/-- Embed a base-field unit as a Galois-invariant extension-field unit. -/ +noncomputable def baseUnitToInvariantUnit (K L : Type) + [Field K] [Field L] [Algebra K L] (x : Kˣ) : unitsInvariantSubmodule K L where + val := Additive.ofMul (Units.map (algebraMap K L).toMonoidHom x) + property := by + intro σ + change + Additive.ofMul + (Units.mapEquiv σ.toMulEquiv (Units.map (algebraMap K L).toMonoidHom x)) = + Additive.ofMul (Units.map (algebraMap K L).toMonoidHom x) + apply Additive.ofMul.injective + ext + simp + +private lemma invariantUnitToBaseUnit_baseUnitToInvariantUnit (K L : Type) + [Field K] [Field L] [Algebra K L] [IsGalois K L] [FiniteDimensional K L] + (x : Kˣ) : + invariantUnitToBaseUnit K L (baseUnitToInvariantUnit K L x) = x := by + ext + apply FaithfulSMul.algebraMap_injective K L + rw [invariantUnitToBaseUnit_spec] + rfl + +private lemma baseUnitToInvariantUnit_invariantUnitToBaseUnit (K L : Type) + [Field K] [Field L] [Algebra K L] [IsGalois K L] [FiniteDimensional K L] + (x : unitsInvariantSubmodule K L) : + baseUnitToInvariantUnit K L (invariantUnitToBaseUnit K L x) = x := by + apply Subtype.ext + apply Additive.ofMul.injective + ext + exact invariantUnitToBaseUnit_spec K L x + +/-- The canonical additive equivalence `(Lˣ)^Gal(L/K) ≃ Kˣ` for finite Galois extensions. -/ +noncomputable def invariantsUnitsAddEquivBaseUnits (K L : Type) + [Field K] [Field L] [Algebra K L] [IsGalois K L] [FiniteDimensional K L] : + unitsInvariantSubmodule K L ≃+ Additive Kˣ where + toFun := fun x => Additive.ofMul (invariantUnitToBaseUnit K L x) + invFun := fun x => baseUnitToInvariantUnit K L (Additive.toMul x) + left_inv := by exact baseUnitToInvariantUnit_invariantUnitToBaseUnit K L + right_inv := by + intro x + apply Additive.ofMul.injective + exact invariantUnitToBaseUnit_baseUnitToInvariantUnit K L (Additive.toMul x) + map_add' := by + intro x y + apply Additive.ofMul.injective + change + invariantUnitToBaseUnit K L (x + y) = + invariantUnitToBaseUnit K L x * invariantUnitToBaseUnit K L y + ext + apply FaithfulSMul.algebraMap_injective K L + change + algebraMap K L (invariantUnitToBaseUnit K L (x + y) : K) = + algebraMap K L + ((invariantUnitToBaseUnit K L x : K) * + (invariantUnitToBaseUnit K L y : K)) + rw [map_mul, invariantUnitToBaseUnit_spec, + invariantUnitToBaseUnit_spec, invariantUnitToBaseUnit_spec] + rfl + +/-- The canonical linear equivalence `(Lˣ)^Gal(L/K) ≃ Kˣ` for finite Galois extensions. -/ +noncomputable def invariantsUnitsEquivBaseUnits (K L : Type) + [Field K] [Field L] [Algebra K L] [IsGalois K L] [FiniteDimensional K L] : + unitsInvariantSubmodule K L ≃ₗ[ℤ] Additive Kˣ := + (invariantsUnitsAddEquivBaseUnits K L).toIntLinearEquiv + +/-- Restricting an invariant unit and re-embedding its value recovers the +underlying extension-field unit. -/ +lemma invariantsUnitsAddEquivBaseUnits_spec (K L : Type) + [Field K] [Field L] [Algebra K L] [IsGalois K L] [FiniteDimensional K L] + (x : unitsInvariantSubmodule K L) : + algebraMap K L + ((Additive.toMul (invariantsUnitsAddEquivBaseUnits K L x) : Kˣ) : K) = + ((Additive.toMul (x : Additive Lˣ) : Lˣ) : L) := by + exact invariantUnitToBaseUnit_spec K L x + +end +end CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Main.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Main.lean new file mode 100644 index 0000000000..062e630b6c --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Main.lean @@ -0,0 +1,56 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.NormImage +/-! +# Degree-zero Tate cohomology and the norm quotient + +This module identifies degree-zero Tate cohomology of the multiplicative group +of a finite Galois extension with the corresponding field norm quotient. +-/ + +@[expose] public section + +namespace CyclicCohomology + +open LocalFieldTheory + +noncomputable +section + +/-- The canonical comparison between mathlib's degree-zero Tate cohomology of +`Lˣ` and the field norm quotient `Kˣ / N_{L/K}(Lˣ)` for a finite Galois +extension. -/ +def H0TateUnitsIsoNormQuotient (K L : Type) + [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] [IsGalois K L] : + CategoryTheory.Iso (tateCohomology (Rep.ofAlgebraAutOnUnits K L) 0) + (ModuleCat.of Int (Additive (NormQuotient K L))) := by + letI := AlgEquiv.fintype K L + let eInv : + (unitsInvariantSubmodule K L ⧸ unitsTateH0NormSubmodule K L) ≃ₗ[Int] + (Additive Kˣ ⧸ (additiveNormSubgroup K L).toIntSubmodule) := + Submodule.Quotient.equiv + (unitsTateH0NormSubmodule K L) + ((additiveNormSubgroup K L).toIntSubmodule) + (invariantsUnitsEquivBaseUnits K L) + (invariantsUnitsEquivBaseUnits_map_tateNormSubmodule K L) + let eNorm : + (Additive Kˣ ⧸ (additiveNormSubgroup K L).toIntSubmodule) ≃+ + Additive (NormQuotient K L) := + (QuotientAddGroup.quotientAddEquivOfEq + (additiveNormSubgroup_eq_ker_quotient_map K L)).trans + (QuotientAddGroup.quotientKerEquivOfSurjective + (MonoidHom.toAdditive (normClass K L)) (by + change Function.Surjective + (QuotientGroup.mk' (localNormSubgroup K L)) + exact QuotientGroup.mk'_surjective _)) + exact tateUnitsH0IsoInvariantsQuotient K L ≪≫ + eInv.toModuleIso ≪≫ eNorm.toIntLinearEquiv.toModuleIso + +end +end CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/NormImage.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/NormImage.lean new file mode 100644 index 0000000000..9e378215e1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/NormImage.lean @@ -0,0 +1,202 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient +public import Mathlib.FieldTheory.Galois.Basic +public import Mathlib.RepresentationTheory.Homological.GroupCohomology.Hilbert90 +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Invariants +/-! Provides the public declarations in the `CyclicCohomology.TateH0.NormImage` Lean module. -/ + +@[expose] public section + +namespace CyclicCohomology + +open LocalFieldTheory +open CategoryTheory + +noncomputable +section + +universe u + +/-- The group-cohomological norm endomorphism on the actual unit representation. -/ +def unitsNormLinearMap (K L : Type) [Field K] [Field L] [Algebra K L] + [Fintype Gal(L/K)] : Additive Lˣ →ₗ[ℤ] Additive Lˣ := + (Rep.ofAlgebraAutOnUnits K L).norm.hom.toLinearMap + +/-- The additive unit norm is fixed by the Galois action. -/ +lemma unitsNorm_mem_invariants (K L : Type) [Field K] [Field L] [Algebra K L] + [Fintype Gal(L/K)] (x : Additive Lˣ) : + unitsNormLinearMap K L x ∈ unitsInvariantSubmodule K L := by + intro σ + exact Representation.self_norm_apply (Rep.ofAlgebraAutOnUnits K L).ρ σ x + +/-- The norm map, codomain-restricted to invariant units. -/ +def unitsNormToInvariantsLinearMap (K L : Type) [Field K] [Field L] [Algebra K L] + [Fintype Gal(L/K)] : Additive Lˣ →ₗ[ℤ] unitsInvariantSubmodule K L := + (unitsNormLinearMap K L).codRestrict (unitsInvariantSubmodule K L) + (unitsNorm_mem_invariants K L) + +/-- Norm image inside invariant units. -/ +def unitsTateH0NormSubmodule (K L : Type) [Field K] [Field L] [Algebra K L] + [Fintype Gal(L/K)] : Submodule ℤ (unitsInvariantSubmodule K L) := + LinearMap.range (unitsNormToInvariantsLinearMap K L) + +/-- The standard degree-zero Tate object, expressed as the arithmetic quotient +of invariant units by the representation norm image. -/ +def tateUnitsH0IsoInvariantsQuotient (K L : Type) + [Field K] [Field L] [Algebra K L] [Fintype Gal(L/K)] : + tateCohomology (Rep.ofAlgebraAutOnUnits K L) 0 ≅ + ModuleCat.of ℤ + (unitsInvariantSubmodule K L ⧸ unitsTateH0NormSubmodule K L) := by + let A := Rep.ofAlgebraAutOnUnits K L + let S : ShortComplex (ModuleCat ℤ) := + .mk A.norm.toModuleCatHom (groupCohomology.d₀₁ A) + (Rep.norm_comp_d_eq_zero A) + have hker : + LinearMap.ker S.g.hom = unitsInvariantSubmodule K L := by + exact groupCohomology.d₀₁_ker_eq_invariants A + let eK : LinearMap.ker S.g.hom ≃ₗ[ℤ] unitsInvariantSubmodule K L := + LinearEquiv.ofEq _ _ hker + have hboundary : + (LinearMap.range S.moduleCatToCycles).map eK.toLinearMap = + unitsTateH0NormSubmodule K L := by + ext x + constructor + · rintro ⟨y, ⟨z, rfl⟩, rfl⟩ + refine ⟨z, ?_⟩ + apply Subtype.ext + rfl + · rintro ⟨z, rfl⟩ + refine ⟨S.moduleCatToCycles z, ⟨z, rfl⟩, ?_⟩ + apply Subtype.ext + rfl + let eQ : + S.moduleCatLeftHomologyData.H ≅ + ModuleCat.of ℤ + (unitsInvariantSubmodule K L ⧸ unitsTateH0NormSubmodule K L) := + (Submodule.Quotient.equiv _ _ eK hboundary).toModuleIso + exact TateCohomology.isoZeroBoundary A ≪≫ + S.moduleCatHomologyIso ≪≫ eQ + +/-- The value of the additive unit norm map is the field norm of the underlying unit. -/ +theorem unitsNormLinearMap_apply_val (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] (x : Lˣ) : + (letI := AlgEquiv.fintype K L + (Additive.toMul (unitsNormLinearMap K L (Additive.ofMul x)) : Lˣ).1) = + algebraMap K L (Algebra.norm K (x : L)) := by + let := AlgEquiv.fintype K L + dsimp only [unitsNormLinearMap] + change ((Additive.toMul + ((Rep.ofAlgebraAutOnUnits K L).norm.hom (Additive.ofMul x)) : Lˣ).1) = + algebraMap K L (Algebra.norm K (x : L)) + rw [← groupCohomology.norm_ofAlgebraAutOnUnits_eq (K := K) (L := L) x] + rfl + +/-- A finite sum of additive units corresponds to the product of their underlying units. -/ +@[simp] +lemma additive_toMul_finset_sum_units {ι : Type*} (L : Type*) [Field L] + (s : Finset ι) (f : ι → Additive Lˣ) : + Additive.toMul (Finset.sum s f) = + Finset.prod s (fun i => Additive.toMul (f i)) := by + classical + refine Finset.induction_on s ?h0 ?hstep + · simp + · intro a s ha hs + simp [Finset.sum_insert, Finset.prod_insert, ha, hs] + +/-- The additive subgroup of `Additive Kˣ` attached to the multiplicative norm subgroup. -/ +def additiveNormSubgroup (K L : Type u) [Field K] [Field L] [Algebra K L] : + AddSubgroup (Additive Kˣ) := + (localNormSubgroup K L).toAddSubgroup + +/-- The additive norm subgroup is the kernel of the norm-quotient map. -/ +lemma additiveNormSubgroup_eq_ker_quotient_map (K L : Type u) + [Field K] [Field L] [Algebra K L] : + additiveNormSubgroup K L = + (MonoidHom.toAdditive (normClass K L)).ker := by + ext x + change Additive.toMul x ∈ localNormSubgroup K L ↔ + Additive.ofMul (normClass K L (Additive.toMul x)) = 0 + constructor + · intro hx + exact congrArg Additive.ofMul + ((normClass_eq_one_iff K L (Additive.toMul x)).mpr + (MonoidHom.mem_range.mp hx)) + · intro hx + exact MonoidHom.mem_range.mpr + ((normClass_eq_one_iff K L (Additive.toMul x)).mp + (Additive.ofMul.injective hx)) + +/-- The invariant-unit equivalence sends the additive unit norm to the field norm. -/ +lemma invariantsUnitsAddEquivBaseUnits_unitsNorm_apply (K L : Type) + [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + (x : Lˣ) : + (letI := AlgEquiv.fintype K L + invariantsUnitsAddEquivBaseUnits K L + (unitsNormToInvariantsLinearMap K L (Additive.ofMul x))) = + Additive.ofMul (normUnits K L x) := by + let := AlgEquiv.fintype K L + apply Additive.toMul.injective + ext + apply FaithfulSMul.algebraMap_injective K L + rw [invariantsUnitsAddEquivBaseUnits_spec] + exact (unitsNormLinearMap_apply_val K L x).trans (by rfl) + +/-- The invariant-unit equivalence maps the Tate norm submodule onto the additive norm subgroup. -/ +lemma invariantsUnitsAddEquivBaseUnits_map_tateNormSubgroup (K L : Type) + [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] [IsGalois K L] : + (letI := AlgEquiv.fintype K L + (unitsTateH0NormSubmodule K L).toAddSubgroup.map + (invariantsUnitsAddEquivBaseUnits K L).toAddMonoidHom) = + additiveNormSubgroup K L := by + let := AlgEquiv.fintype K L + ext y + constructor + · rintro ⟨x, hx, rfl⟩ + rcases hx with ⟨z, rfl⟩ + change Additive.toMul + (invariantsUnitsAddEquivBaseUnits K L + (unitsNormToInvariantsLinearMap K L z)) ∈ localNormSubgroup K L + let a : Lˣ := Additive.toMul z + rw [show z = Additive.ofMul a by cases z; rfl] + have hmap := + congrArg Additive.toMul + (invariantsUnitsAddEquivBaseUnits_unitsNorm_apply K L a) + rw [hmap] + exact ⟨a, rfl⟩ + · intro hy + change Additive.toMul y ∈ localNormSubgroup K L at hy + rcases hy with ⟨x, hx⟩ + refine ⟨unitsNormToInvariantsLinearMap K L (Additive.ofMul x), ⟨Additive.ofMul x, rfl⟩, ?_⟩ + change + invariantsUnitsAddEquivBaseUnits K L + (unitsNormToInvariantsLinearMap K L (Additive.ofMul x)) = y + calc + invariantsUnitsAddEquivBaseUnits K L + (unitsNormToInvariantsLinearMap K L (Additive.ofMul x)) + = Additive.ofMul (normUnits K L x) := + invariantsUnitsAddEquivBaseUnits_unitsNorm_apply K L x + _ = Additive.ofMul (Additive.toMul y) := congrArg Additive.ofMul hx + _ = y := by cases y; rfl + +/-- The multiplicative invariant-unit equivalence maps Tate norms onto field norms. -/ +lemma invariantsUnitsEquivBaseUnits_map_tateNormSubmodule (K L : Type) + [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] [IsGalois K L] : + (letI := AlgEquiv.fintype K L + (unitsTateH0NormSubmodule K L).map + (invariantsUnitsEquivBaseUnits K L : unitsInvariantSubmodule K L →ₗ[ℤ] Additive Kˣ)) = + (additiveNormSubgroup K L).toIntSubmodule := by + let := AlgEquiv.fintype K L + apply Submodule.toAddSubgroup_injective + rw [Submodule.map_toAddSubgroup] + exact invariantsUnitsAddEquivBaseUnits_map_tateNormSubgroup K L + +end +end CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory.lean new file mode 100644 index 0000000000..7f2c932be6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Augmentation +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Finite +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Quotient +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.QuotientTower +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.RestrictionKernel +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Augmentation.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Augmentation.lean new file mode 100644 index 0000000000..146e7cf757 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Augmentation.lean @@ -0,0 +1,494 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.MonoidAlgebra.Lift +public import Mathlib.Algebra.Module.BigOperators +public import Mathlib.GroupTheory.Abelianization.Defs +public import Mathlib.RingTheory.TwoSidedIdeal.Kernel +public import Mathlib.RingTheory.TwoSidedIdeal.Operations +public import Mathlib.Tactic.NoncommRing +/-! +# Integral group-ring augmentation + +This file develops the actual augmentation quotient `I_G / I_G²` used in +the transfer/augmentation comparison. It is kept separate from the transfer calculation so +that the group-ring identities can be reused in the proof of Witt's +transfer theorem. +-/ + +@[expose] public section + +open scoped Pointwise + +noncomputable +section + +namespace GroupTheory +namespace Augmentation + +variable (G : Type*) [Group G] + +/-- The integral group ring `ℤ[G]`. -/ +abbrev IntegralGroupRing := MonoidAlgebra ℤ G + +/-- The augmentation homomorphism `ℤ[G] → ℤ`. -/ +def augmentation : IntegralGroupRing G →+* ℤ := + MonoidAlgebra.liftNCRingHom + (RingHom.id ℤ) (1 : G →* ℤ) + (fun _ _ => mul_comm _ _) + +@[simp] +theorem augmentation_single (g : G) (n : ℤ) : + augmentation G (MonoidAlgebra.single g n) = n := by + change MonoidAlgebra.liftNC (RingHom.id ℤ : ℤ →+ ℤ) + (1 : G → ℤ) (MonoidAlgebra.single g n) = n + rw [MonoidAlgebra.liftNC_single] + simp only [Pi.one_apply, mul_one] + rfl + +/-- The augmentation is the sum of the coefficients. -/ +theorem augmentation_apply (x : IntegralGroupRing G) : + augmentation G x = x.coeff.sum (fun _ n => n) := by + classical + conv_lhs => rw [← MonoidAlgebra.sum_coeff_single x] + rw [map_finsuppSum] + simp + +/-- The augmentation ideal `I_G`. -/ +def ideal : TwoSidedIdeal (IntegralGroupRing G) := + TwoSidedIdeal.ker (augmentation G) + +theorem mem_ideal_iff (x : IntegralGroupRing G) : + x ∈ ideal G ↔ augmentation G x = 0 := by + rfl + +/-- The underlying additive subgroup of a two-sided ideal. -/ +def underlyingAddSubgroup + {R : Type*} [NonUnitalNonAssocRing R] + (I : TwoSidedIdeal R) : AddSubgroup R where + carrier := I + zero_mem' := I.zero_mem + add_mem' := I.add_mem + neg_mem' := I.neg_mem + +/-- The product ideal `I_G²`, generated by products of two augmentation +elements. -/ +def square : TwoSidedIdeal (IntegralGroupRing G) := + TwoSidedIdeal.span + {z | ∃ x ∈ ideal G, ∃ y ∈ ideal G, z = x * y} + +theorem square_le_ideal : + square G ≤ ideal G := by + rw [square, TwoSidedIdeal.span_le] + rintro z ⟨x, hx, y, hy, rfl⟩ + exact (ideal G).mul_mem_right x y hx + +/-- `I_G²` as an additive subgroup of `I_G`. -/ +def squareInIdeal : AddSubgroup (ideal G) where + carrier := {x | (x : IntegralGroupRing G) ∈ square G} + zero_mem' := (square G).zero_mem + add_mem' := (square G).add_mem + neg_mem' := (square G).neg_mem + +/-- Membership in `I_G²`, expressed after forgetting the ambient +augmentation-ideal subtype. -/ +@[simp] +theorem mem_squareInIdeal_iff (x : ideal G) : + x ∈ squareInIdeal G ↔ + (x : IntegralGroupRing G) ∈ square G := + Iff.rfl + +/-- The augmentation quotient `I_G / I_G²`. -/ +abbrev Quotient := + (ideal G) ⧸ squareInIdeal G + +/-- The element `g - 1` of the augmentation ideal. -/ +def deltaElement (g : G) : ideal G := + ⟨MonoidAlgebra.single g 1 - + MonoidAlgebra.single (1 : G) 1, by + rw [mem_ideal_iff, map_sub] + simp⟩ + +@[simp] +theorem deltaElement_val (g : G) : + (deltaElement G g : IntegralGroupRing G) = + MonoidAlgebra.single g 1 - + MonoidAlgebra.single (1 : G) 1 := + rfl + +/-- The canonical expression of an augmentation-zero group-ring element +as a finite integral linear combination of the differences `g - 1`. -/ +def deltaCombination (x : IntegralGroupRing G) : + IntegralGroupRing G := + ∑ g ∈ x.coeff.support, + x.coeff g • + (MonoidAlgebra.single g 1 - + MonoidAlgebra.single (1 : G) 1) + +theorem deltaCombination_eq_of_mem_ideal + (x : IntegralGroupRing G) (hx : x ∈ ideal G) : + deltaCombination G x = x := by + classical + have hsum : x.coeff.sum (fun _ n => n) = 0 := by + rw [← augmentation_apply] + exact hx + have hcoeff : + ∑ g ∈ x.coeff.support, x.coeff g = 0 := by + simpa [Finsupp.sum] using hsum + have hfirst : + ∑ g ∈ x.coeff.support, + x.coeff g • MonoidAlgebra.single g (1 : ℤ) = + x := by + calc + ∑ g ∈ x.coeff.support, + x.coeff g • MonoidAlgebra.single g (1 : ℤ) = + x.coeff.sum MonoidAlgebra.single := by + rw [Finsupp.sum] + apply Finset.sum_congr rfl + intro g _ + simp [MonoidAlgebra.smul_single] + _ = x := MonoidAlgebra.sum_coeff_single x + unfold deltaCombination + simp_rw [smul_sub] + rw [Finset.sum_sub_distrib, hfirst] + calc + x - + ∑ g ∈ x.coeff.support, + x.coeff g • + MonoidAlgebra.single (1 : G) (1 : ℤ) = + x - + (∑ g ∈ x.coeff.support, x.coeff g) • + MonoidAlgebra.single (1 : G) (1 : ℤ) := by + rw [Finset.sum_smul] + _ = x := by rw [hcoeff, zero_smul, sub_zero] + +/-- The same finite combination, now intrinsically valued in `I_G`. -/ +def deltaCombinationElement (x : IntegralGroupRing G) : + ideal G := + ∑ g ∈ x.coeff.support, x.coeff g • deltaElement G g + +@[simp] +theorem deltaCombinationElement_val + (x : IntegralGroupRing G) : + (deltaCombinationElement G x : IntegralGroupRing G) = + deltaCombination G x := + by + simp [deltaCombinationElement, deltaCombination] + +theorem deltaCombinationElement_eq_of_mem_ideal + (x : IntegralGroupRing G) (hx : x ∈ ideal G) : + deltaCombinationElement G x = ⟨x, hx⟩ := by + apply Subtype.ext + rw [deltaCombinationElement_val] + exact deltaCombination_eq_of_mem_ideal G x hx + +/-- The class of `g - 1` in `I_G / I_G²`. -/ +def deltaClass (g : G) : Quotient G := + QuotientAddGroup.mk' (squareInIdeal G) (deltaElement G g) + +@[simp] +theorem deltaClass_one : + deltaClass G 1 = 0 := by + apply (QuotientAddGroup.eq_zero_iff _).2 + rw [mem_squareInIdeal_iff] + simpa only [deltaElement_val, sub_self] using (square G).zero_mem + +/-- Modulo `I_G²`, the identity `δ(gh)=δg+δh` makes the augmentation +class a homomorphism from `G` to the additive quotient. -/ +theorem deltaClass_mul (g h : G) : + deltaClass G (g * h) = + deltaClass G g + deltaClass G h := by + apply (QuotientAddGroup.eq_iff_sub_mem).2 + rw [mem_squareInIdeal_iff] + have hg : (deltaElement G g : IntegralGroupRing G) ∈ ideal G := + (deltaElement G g).property + have hh : (deltaElement G h : IntegralGroupRing G) ∈ ideal G := + (deltaElement G h).property + have hprod : + (deltaElement G g : IntegralGroupRing G) * + (deltaElement G h : IntegralGroupRing G) ∈ + square G := + TwoSidedIdeal.subset_span ⟨_, hg, _, hh, rfl⟩ + convert hprod using 1 + change + (deltaElement G (g * h) : IntegralGroupRing G) - + ((deltaElement G g : IntegralGroupRing G) + + (deltaElement G h : IntegralGroupRing G)) = + (deltaElement G g : IntegralGroupRing G) * + (deltaElement G h : IntegralGroupRing G) + simp only [deltaElement_val] + have hsingle : + MonoidAlgebra.single (g * h) (1 : ℤ) = + MonoidAlgebra.single g 1 * + MonoidAlgebra.single h 1 := by + simp + rw [hsingle] + rw [← MonoidAlgebra.one_def] + noncomm_ring + +/-- Multiplicative spelling of `g ↦ δg`, convenient for passage through +the abelianization. -/ +def deltaMonoidHom : + G →* Multiplicative (Quotient G) where + toFun g := Multiplicative.ofAdd (deltaClass G g) + map_one' := by + apply Multiplicative.toAdd.injective + exact deltaClass_one G + map_mul' g h := by + apply Multiplicative.toAdd.injective + exact deltaClass_mul G g h + +/-- The augmentation class factors canonically through `Gᵃᵇ`. -/ +def deltaAbelianization : + Abelianization G →* Multiplicative (Quotient G) := + Abelianization.lift (deltaMonoidHom G) + +@[simp] +theorem deltaAbelianization_of (g : G) : + deltaAbelianization G (Abelianization.of g) = + Multiplicative.ofAdd (deltaClass G g) := + rfl + +/-- A finite preimage in `Gᵃᵇ` for the coefficient combination attached +to a group-ring element. -/ +def deltaPreimage (x : IntegralGroupRing G) : + Abelianization G := + ∏ g ∈ x.coeff.support, + Abelianization.of g ^ x.coeff g + +theorem deltaAbelianization_deltaPreimage + (x : IntegralGroupRing G) (hx : x ∈ ideal G) : + deltaAbelianization G (deltaPreimage G x) = + Multiplicative.ofAdd + (QuotientAddGroup.mk' (squareInIdeal G) ⟨x, hx⟩) := by + apply Multiplicative.toAdd.injective + change + Multiplicative.toAdd + (deltaAbelianization G (deltaPreimage G x)) = + QuotientAddGroup.mk' (squareInIdeal G) ⟨x, hx⟩ + rw [deltaPreimage, map_prod] + simp_rw [map_zpow, deltaAbelianization_of] + change + ∑ g ∈ x.coeff.support, + x.coeff g • deltaClass G g = + QuotientAddGroup.mk' (squareInIdeal G) ⟨x, hx⟩ + change + ∑ g ∈ x.coeff.support, + x.coeff g • + QuotientAddGroup.mk' (squareInIdeal G) + (deltaElement G g) = + QuotientAddGroup.mk' (squareInIdeal G) ⟨x, hx⟩ + simp_rw [← map_zsmul] + rw [← map_sum] + change + QuotientAddGroup.mk' (squareInIdeal G) + (deltaCombinationElement G x) = + QuotientAddGroup.mk' (squareInIdeal G) ⟨x, hx⟩ + rw [deltaCombinationElement_eq_of_mem_ideal G x hx] + +/-- The augmentation map `Gᵃᵇ → I_G/I_G²` is surjective. -/ +theorem deltaAbelianization_surjective : + Function.Surjective (deltaAbelianization G) := by + intro q + change + ∃ a : Abelianization G, + deltaAbelianization G a = + Multiplicative.ofAdd (Multiplicative.toAdd q) + refine + QuotientAddGroup.induction_on + (Multiplicative.toAdd q) ?_ + intro x + exact + ⟨deltaPreimage G x.1, + deltaAbelianization_deltaPreimage + G x.1 x.2⟩ + +/-- A coefficient at `g` contributes that many copies of the class of +`g` in the abelianization. -/ +def coefficientToAbelianization (g : G) : + ℤ →+ Additive (Abelianization G) where + toFun n := n • Additive.ofMul (Abelianization.of g) + map_zero' := zero_zsmul _ + map_add' m n := add_zsmul _ m n + +/-- Linearization of the integral group ring in the abelianization. -/ +def linearization : + IntegralGroupRing G →+ Additive (Abelianization G) := + ((Finsupp.liftAddHom + (α := G) (M := ℤ) + (N := Additive (Abelianization G))) + (coefficientToAbelianization G)).comp + MonoidAlgebra.coeffAddEquiv.toAddMonoidHom + +@[simp] +theorem linearization_single (g : G) (n : ℤ) : + linearization G (MonoidAlgebra.single g n) = + n • Additive.ofMul (Abelianization.of g) := by + simp [linearization, coefficientToAbelianization] + +theorem linearization_deltaElement (g : G) : + linearization G (deltaElement G g) = + Additive.ofMul (Abelianization.of g) := by + simp [deltaElement, linearization_single] + +/-- Products of two basic augmentation differences vanish after +linearization. -/ +theorem linearization_deltaElement_mul_deltaElement + (g h : G) : + linearization G + ((deltaElement G g : IntegralGroupRing G) * + (deltaElement G h : IntegralGroupRing G)) = + 0 := by + simp [deltaElement, map_sub, + MonoidAlgebra.single_mul_single, mul_sub, sub_mul] + +/-- Linearization kills a product of two augmentation-zero elements. -/ +theorem linearization_mul_eq_zero_of_mem_ideal + (x y : IntegralGroupRing G) + (hx : x ∈ ideal G) (hy : y ∈ ideal G) : + linearization G (x * y) = 0 := by + rw [← deltaCombination_eq_of_mem_ideal G x hx, + ← deltaCombination_eq_of_mem_ideal G y hy] + simp only [deltaCombination] + rw [Finset.sum_mul] + simp_rw [Finset.mul_sum] + rw [map_sum] + apply Finset.sum_eq_zero + intro g hg + rw [map_sum] + apply Finset.sum_eq_zero + intro h hh + rw [smul_mul_smul_comm, map_zsmul, + ← deltaElement_val, ← deltaElement_val, + linearization_deltaElement_mul_deltaElement, smul_zero] + +/-- Linearization vanishes on the square of the augmentation ideal. -/ +theorem linearization_eq_zero_of_mem_square + (z : IntegralGroupRing G) (hz : z ∈ square G) : + linearization G z = 0 := by + have hstrong : + ∀ z : IntegralGroupRing G, + z ∈ square G → + ∀ a b : IntegralGroupRing G, + linearization G (a * z * b) = 0 := by + intro z hz + rw [square] at hz + refine TwoSidedIdeal.span_induction + (s := + {z | ∃ x ∈ ideal G, ∃ y ∈ ideal G, z = x * y}) + (p := fun z _ => + ∀ a b : IntegralGroupRing G, + linearization G (a * z * b) = 0) + ?_ ?_ ?_ ?_ ?_ ?_ hz + · rintro z ⟨x, hx, y, hy, rfl⟩ a b + simpa only [mul_assoc] using + linearization_mul_eq_zero_of_mem_ideal G + (a * x) (y * b) + ((ideal G).mul_mem_left a x hx) + ((ideal G).mul_mem_right y b hy) + · intro a b + simp + · intro x y hx hy hlinx hliny a b + simp [mul_add, add_mul, hlinx a b, hliny a b] + · intro x hx hlin a b + simp [hlin a b] + · intro c x hx hlin a b + simpa only [mul_assoc] using hlin (a * c) b + · intro c x hx hlin a b + simpa only [mul_assoc] using hlin a (c * b) + simpa using hstrong z hz 1 1 + +/-- Linearization restricted to the augmentation ideal. -/ +def linearizationOnIdeal : + ideal G →+ Additive (Abelianization G) where + toFun x := linearization G (x : IntegralGroupRing G) + map_zero' := (linearization G).map_zero + map_add' x y := (linearization G).map_add x y + +/-- The inverse linearization map on `I_G/I_G²`. -/ +def quotientLinearization : + Quotient G →+ Additive (Abelianization G) := + QuotientAddGroup.lift + (squareInIdeal G) (linearizationOnIdeal G) (by + intro x hx + apply AddMonoidHom.mem_ker.2 + exact linearization_eq_zero_of_mem_square G x hx) + +@[simp] +theorem quotientLinearization_deltaClass (g : G) : + quotientLinearization G (deltaClass G g) = + Additive.ofMul (Abelianization.of g) := by + exact linearization_deltaElement G g + +/-- Multiplicative spelling of inverse linearization. -/ +def quotientLinearizationMonoidHom : + Multiplicative (Quotient G) →* Abelianization G := + (quotientLinearization G).toMultiplicativeLeft + +@[simp] +theorem quotientLinearizationMonoidHom_deltaClass (g : G) : + quotientLinearizationMonoidHom G + (Multiplicative.ofAdd (deltaClass G g)) = + Abelianization.of g := by + exact congrArg Additive.toMul + (quotientLinearization_deltaClass G g) + +/-- Inverse linearization is a left inverse to the augmentation-class +map. -/ +theorem quotientLinearizationMonoidHom_deltaAbelianization + (a : Abelianization G) : + quotientLinearizationMonoidHom G + (deltaAbelianization G a) = + a := by + refine QuotientGroup.induction_on a ?_ + intro g + exact quotientLinearizationMonoidHom_deltaClass G g + +/-- The canonical augmentation-class map is injective. -/ +theorem deltaAbelianization_injective : + Function.Injective (deltaAbelianization G) := by + intro a b hab + have h := congrArg (quotientLinearizationMonoidHom G) hab + rw [quotientLinearizationMonoidHom_deltaAbelianization G a, + quotientLinearizationMonoidHom_deltaAbelianization G b] at h + exact h + +/-- The classical canonical isomorphism +`Gᵃᵇ ≃ I_G/I_G²`, in multiplicative notation on the target. -/ +noncomputable def deltaAbelianizationEquiv : + Abelianization G ≃* Multiplicative (Quotient G) := + MulEquiv.ofBijective (deltaAbelianization G) + ⟨deltaAbelianization_injective G, + deltaAbelianization_surjective G⟩ + +@[simp] +theorem deltaAbelianizationEquiv_apply (a : Abelianization G) : + deltaAbelianizationEquiv G a = + deltaAbelianization G a := + rfl + +@[simp] +theorem deltaAbelianizationEquiv_of (g : G) : + deltaAbelianizationEquiv G (Abelianization.of g) = + Multiplicative.ofAdd (deltaClass G g) := + rfl + +/-- Every commutator has zero augmentation class modulo `I_G²`. -/ +theorem deltaClass_eq_zero_of_mem_commutator + {g : G} (hg : g ∈ commutator G) : + deltaClass G g = 0 := by + have hker : + g ∈ (deltaMonoidHom G).ker := + Abelianization.commutator_subset_ker + (deltaMonoidHom G) hg + have hone : deltaMonoidHom G g = 1 := + MonoidHom.mem_ker.mp hker + exact congrArg Multiplicative.toAdd hone + +end Augmentation +end GroupTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Finite.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Finite.lean new file mode 100644 index 0000000000..b0d6c51e0e --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Finite.lean @@ -0,0 +1,336 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.GroupTheory.DoubleCoset +public import Mathlib.GroupTheory.Sylow +/-! +# Finite group theory for the splitting corollaries + +This file isolates the finite-group inputs for prime-power and normal-closure +splitting arguments. + +For the prime-power subgroup reduction, a proper subgroup of a finite group of order `p ^ v` is +contained in a subgroup of index `p`. The proof below gives the +slightly stronger statement for arbitrary finite `p`-groups. In the +cyclic case the resulting subgroup is normal, hence produces the +degree-`p` quotient used to choose the intermediate field. + +For the normal-closure splitting argument, the normal closure is encoded by a core-free subgroup +`H`. The canonical map from left cosets to double cosets is +surjective. If it does not decrease cardinality, its right subgroup +is contained in the normal core of `H`; therefore it is trivial when +`H` is core-free. +-/ + +@[expose] public section + +noncomputable +section + +universe uG + +section PrimePower + +variable {G : Type uG} [Group G] [Finite G] + +/-- A proper subgroup of a finite group of prime-power order is +contained in a subgroup of index `p`. + +This is the group-theoretic step in the prime-power subgroup reduction. Mathlib's Sylow +extension theorem proves the stronger result without a cyclicity +assumption. -/ +theorem exists_index_prime_supergroup_of_card_prime_power + {p v : ℕ} + (hp : p.Prime) + (hv : 0 < v) + (hGcard : Nat.card G = p ^ v) + (D : Subgroup G) + (hD : D ≠ ⊤) : + ∃ P : Subgroup G, D ≤ P ∧ P.index = p := by + let : Fact p.Prime := ⟨hp⟩ + have hGp : IsPGroup p G := + IsPGroup.of_card hGcard + have hDp : IsPGroup p D := + hGp.to_subgroup D + obtain ⟨m, hDcard⟩ := + IsPGroup.exists_card_eq hDp + have hmv : m < v := by + have hmle : m ≤ v := by + apply + (Nat.pow_le_pow_iff_right hp.one_lt).mp + rw [← hDcard, ← hGcard] + exact D.card_le_card_group + have hmne : m ≠ v := by + intro hmv + apply hD + apply + (Subgroup.card_eq_iff_eq_top D).mp + rw [hDcard, hmv, hGcard] + exact lt_of_le_of_ne hmle hmne + have hmPred : m ≤ v - 1 := + Nat.le_sub_one_of_lt hmv + have hpowDvd : + p ^ (v - 1) ∣ Nat.card G := by + rw [hGcard] + exact + pow_dvd_pow p (Nat.sub_le v 1) + obtain ⟨P, hPcard, hDP⟩ := + Sylow.exists_subgroup_card_pow_prime_le + p hpowDvd D hDcard hmPred + refine ⟨P, hDP, ?_⟩ + have hmul : + p ^ (v - 1) * P.index = p ^ v := by + simpa [hPcard, hGcard] using + P.card_mul_index + have hvPred : v - 1 + 1 = v := + Nat.sub_add_cancel hv + rw [← hvPred, pow_succ] at hmul + exact + Nat.mul_left_cancel (pow_pos hp.pos _) hmul + +/-- In a cyclic finite group of prime-power order, the index-`p` +supergroup is normal and its quotient has order `p`. -/ +theorem cyclic_exists_normal_index_prime_supergroup + [IsCyclic G] + {p v : ℕ} + (hp : p.Prime) + (hv : 0 < v) + (hGcard : Nat.card G = p ^ v) + (D : Subgroup G) + (hD : D ≠ ⊤) : + ∃ P : Subgroup G, + D ≤ P ∧ + P.index = p ∧ + P.Normal ∧ + Nat.card (G ⧸ P) = p := by + obtain ⟨P, hDP, hPindex⟩ := + exists_index_prime_supergroup_of_card_prime_power + hp hv hGcard D hD + have hPnormal : P.Normal := + inferInstance + refine + ⟨P, hDP, hPindex, hPnormal, ?_⟩ + rw [← P.index_eq_card] + exact hPindex + +omit [Finite G] in +/-- In a cyclic group of finite prime-power cardinality, every proper +subgroup is contained in every subgroup of index `p`. -/ +theorem subgroup_le_index_prime_subgroup_of_ne_top_cyclic_prime_power + [IsCyclic G] + {p exponent : ℕ} + (hp : p.Prime) + (hcard : Nat.card G = p ^ exponent) + (P D : Subgroup G) + (hPindex : P.index = p) + (hD : D ≠ ⊤) : + D ≤ P := by + obtain ⟨g, hg⟩ := IsCyclic.exists_generator (α := G) + have hgtop : Subgroup.zpowers g = ⊤ := + (Subgroup.eq_top_iff' (Subgroup.zpowers g)).2 hg + obtain ⟨n, hn⟩ := + (Subgroup.le_zpowers_iff g D).1 (by + rw [hgtop] + exact le_top) + have hgorder : orderOf g = p ^ exponent := + (orderOf_eq_card_of_forall_mem_zpowers hg).trans hcard + have hngcd : n.gcd (orderOf g) ≠ 1 := by + intro hngcd + apply hD + rw [hn] + apply top_unique + rw [← hgtop, Subgroup.zpowers_le] + exact mem_zpowers_pow_iff.mpr hngcd + have hpdiv : p ∣ n := by + by_contra hpnot + apply hngcd + rw [hgorder] + exact + (((hp.coprime_iff_not_dvd).2 hpnot).symm.pow_right + exponent).gcd_eq_one + obtain ⟨k, rfl⟩ := hpdiv + rw [hn] + apply (Subgroup.zpowers_le).2 + have hpow := P.pow_index_mem (g ^ k) + rw [hPindex] at hpow + have heq : (g ^ k) ^ p = g ^ (p * k) := by + simp only [← pow_mul, Nat.mul_comm] + rw [← heq] + exact hpow + +end PrimePower + +section PrimeOrder + +variable (G : Type uG) [Group G] [Finite G] [Nontrivial G] + +/-- Every nontrivial finite group contains an element of prime order. +This supplies the cyclic prime-degree subgroup used after passing to a +normal closure. -/ +theorem exists_element_of_prime_order : + ∃ (p : ℕ) (g : G), + p.Prime ∧ orderOf g = p := by + obtain ⟨p, hp, hpDvd⟩ := + Nat.exists_prime_and_dvd + (ne_of_gt (Finite.one_lt_card : + 1 < Nat.card G)) + let : Fact p.Prime := ⟨hp⟩ + obtain ⟨g, hg⟩ := + exists_prime_orderOf_dvd_card' + (G := G) p hpDvd + exact ⟨p, g, hp, hg⟩ + +/-- Every nontrivial finite group contains an actual cyclic subgroup +of prime cardinality. -/ +theorem exists_cyclic_subgroup_of_prime_card : + ∃ (p : ℕ) (P : Subgroup G), + p.Prime ∧ Nat.card P = p ∧ IsCyclic P := by + obtain ⟨p, g, hp, hg⟩ := + exists_element_of_prime_order G + refine + ⟨p, Subgroup.zpowers g, hp, ?_, inferInstance⟩ + rw [Nat.card_zpowers, hg] + +end PrimeOrder + +section DoubleCosets + +variable {G : Type uG} [Group G] + +/-- The canonical projection +`H \ G = H \ G / 1 → H \ G / D`. -/ +def doubleCosetRightProjection + (H D : Subgroup G) : + DoubleCoset.Quotient + (H : Set G) (⊥ : Subgroup G) → + DoubleCoset.Quotient (H : Set G) D := + Quotient.map' id fun a b hab ↦ by + rw [DoubleCoset.rel_iff] at hab ⊢ + obtain ⟨h, hh, k, hk, hab⟩ := hab + have hkOne : k = 1 := + Subgroup.mem_bot.mp hk + subst k + exact + ⟨h, hh, 1, D.one_mem, by simpa using hab⟩ + +@[simp] +theorem doubleCosetRightProjection_mk + (H D : Subgroup G) + (g : G) : + doubleCosetRightProjection H D + (DoubleCoset.mk H (⊥ : Subgroup G) g) = + DoubleCoset.mk H D g := + Quotient.map'_mk'' _ _ _ + +/-- The projection from left cosets to double cosets is onto. -/ +theorem doubleCosetRightProjection_surjective + (H D : Subgroup G) : + Function.Surjective + (doubleCosetRightProjection H D) := by + intro q + refine + ⟨DoubleCoset.mk H (⊥ : Subgroup G) q.out, ?_⟩ + rw [doubleCosetRightProjection_mk] + exact DoubleCoset.out_eq' q + +/-- If the left-coset to double-coset projection is injective, then +the right subgroup lies in the normal core of the left subgroup. -/ +theorem rightSubgroup_le_normalCore_of_doubleCoset_projection_injective + (H D : Subgroup G) + (hinj : Function.Injective + (doubleCosetRightProjection H D)) : + D ≤ H.normalCore := by + intro d hd g + have hdouble : + DoubleCoset.mk H D g = + DoubleCoset.mk H D (g * d) := by + rw [DoubleCoset.eq] + exact + ⟨1, H.one_mem, d, hd, by simp⟩ + have hleft : + DoubleCoset.mk H (⊥ : Subgroup G) g = + DoubleCoset.mk H (⊥ : Subgroup G) + (g * d) := by + apply hinj + simpa only + [doubleCosetRightProjection_mk] + using hdouble + rw [DoubleCoset.eq] at hleft + obtain ⟨h, hh, k, hk, heq⟩ := hleft + have hkOne : k = 1 := + Subgroup.mem_bot.mp hk + subst k + simp only [mul_one] at heq + have hconj : g * d * g⁻¹ = h := by + calc + g * d * g⁻¹ = + (g * d) * g⁻¹ := rfl + _ = (h * g) * g⁻¹ := by + rw [heq] + _ = h := by simp + rw [hconj] + exact hh + +/-- Equality between the number of left cosets and the number of +double cosets forces the right subgroup into the normal core. -/ +theorem rightSubgroup_le_normalCore_of_doubleCoset_card_eq + [Finite G] + (H D : Subgroup G) + (hcard : + Nat.card + (DoubleCoset.Quotient (H : Set G) D) = + Nat.card + (DoubleCoset.Quotient (H : Set G) + (⊥ : Subgroup G))) : + D ≤ H.normalCore := by + let : + Finite + (DoubleCoset.Quotient (H : Set G) + (⊥ : Subgroup G)) := + Finite.of_surjective + (DoubleCoset.mk H (⊥ : Subgroup G)) + (by + intro q + exact + ⟨q.out, + DoubleCoset.out_eq' q⟩) + have hbij : + Function.Bijective + (doubleCosetRightProjection H D) := + Function.Surjective.bijective_of_nat_card_le + (doubleCosetRightProjection_surjective H D) + hcard.symm.le + exact + rightSubgroup_le_normalCore_of_doubleCoset_projection_injective + H D hbij.injective + +/-- For a core-free subgroup `H`, the double-coset count equals the +left-coset count exactly when the right subgroup is trivial. + +This is the finite-group content of the normal-closure reduction. -/ +theorem doubleCoset_card_eq_leftCoset_iff_of_normalCore_eq_bot + [Finite G] + (H D : Subgroup G) + (hcore : H.normalCore = ⊥) : + Nat.card + (DoubleCoset.Quotient (H : Set G) D) = + Nat.card + (DoubleCoset.Quotient (H : Set G) + (⊥ : Subgroup G)) ↔ + D = ⊥ := by + constructor + · intro hcard + apply le_bot_iff.mp + rw [← hcore] + exact + rightSubgroup_le_normalCore_of_doubleCoset_card_eq + H D hcard + · rintro rfl + rfl + +end DoubleCosets diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Quotient.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Quotient.lean new file mode 100644 index 0000000000..84e377bbae --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Quotient.lean @@ -0,0 +1,126 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.GroupTheory.Abelianization.Defs +public import Mathlib.GroupTheory.QuotientGroup.Basic +/-! +# Quotients represented by a supporting subgroup + +If two subgroups generate a commutative group, every class modulo the +second subgroup has a representative in the first. This is the precise +group-theoretic comparison used when a sufficiently large group of +supported ideles represents the full idele class group. +-/ + +@[expose] public section + +noncomputable +section + +variable {G : Type*} [CommGroup G] + +/-- If `S` and `P` generate `G`, inclusion of `S` identifies +`S / (S ∩ P)` with `G / P`. -/ +noncomputable def subgroupQuotientEquivQuotientOfSupEqTop + (S P : Subgroup G) + (hSP : S ⊔ P = ⊤) : + S ⧸ P.subgroupOf S ≃* G ⧸ P := by + let eSup : (S ⊔ P : Subgroup G) ≃* G := + MulEquiv.ofBijective (S ⊔ P).subtype + ⟨Subtype.val_injective, fun x => + ⟨⟨x, by rw [hSP]; exact Subgroup.mem_top x⟩, rfl⟩⟩ + exact + (QuotientGroup.quotientInfEquivProdNormalQuotient S P).trans <| + QuotientGroup.congr + (P.subgroupOf (S ⊔ P)) P eSup (by + ext x + constructor + · rintro ⟨a, ha, rfl⟩ + exact ha + · intro hx + refine ⟨⟨x, ?_⟩, hx, rfl⟩ + rw [hSP] + exact Subgroup.mem_top x) + +theorem subgroupQuotientEquivQuotientOfSupEqTop_mk + (S P : Subgroup G) + (hSP : S ⊔ P = ⊤) + (s : S) : + subgroupQuotientEquivQuotientOfSupEqTop S P hSP + (QuotientGroup.mk' (P.subgroupOf S) s) = + QuotientGroup.mk' P (s : G) := by + simp only [subgroupQuotientEquivQuotientOfSupEqTop, + QuotientGroup.quotientInfEquivProdNormalQuotient, + QuotientGroup.quotientInfEquivProdNormalizerQuotient, + QuotientGroup.quotientKerEquivOfSurjective, QuotientGroup.quotientKerEquivOfRightInverse, + MonoidHom.coe_comp, QuotientGroup.coe_mk', QuotientGroup.mk'_apply, MulEquiv.trans_apply, + QuotientGroup.quotientMulEquivOfEq_mk, MulEquiv.coe_mk, Equiv.coe_fn_mk, + QuotientGroup.kerLift_mk, Function.comp_apply, QuotientGroup.congr_mk] + have ofBijective_apply' + (f : (S ⊔ P : Subgroup G) →* G) + (hf : Function.Injective f ∧ Function.Surjective f) + (x : (S ⊔ P : Subgroup G)) : + (MulEquiv.ofBijective f hf) x = f x := + MulEquiv.ofBijective_apply f hf x + rw [ofBijective_apply'] + rfl + +namespace Subgroup + +universe u + +variable {Gamma : Type u} [Group Gamma] + +/-- The inverse image of the image of a subgroup in the abelianization is +the subgroup generated by it and the commutator subgroup. -/ +theorem comap_map_abelianization_eq_sup_commutator (H : Subgroup Gamma) : + (H.map (Abelianization.of : Gamma →* Abelianization Gamma)).comap + (Abelianization.of : Gamma →* Abelianization Gamma) = + H ⊔ _root_.commutator Gamma := by + rw [Subgroup.comap_map_eq, Abelianization.ker_of] + +/-- Adjoining the commutator subgroup to any subgroup produces a normal +subgroup. -/ +instance normal_sup_commutator (H : Subgroup Gamma) : + (H ⊔ _root_.commutator Gamma).Normal := by + rw [← H.comap_map_abelianization_eq_sup_commutator] + infer_instance + +/-- Quotienting a group by a subgroup together with the commutator subgroup +agrees with quotienting its abelianization by the image of that subgroup. -/ +noncomputable def quotientSupCommutatorEquivMapAbelianization + (H : Subgroup Gamma) : + Gamma ⧸ (H ⊔ _root_.commutator Gamma) ≃* + Abelianization Gamma ⧸ + H.map (Abelianization.of : Gamma →* Abelianization Gamma) := by + let phi : Gamma →* + Abelianization Gamma ⧸ + H.map (Abelianization.of : Gamma →* Abelianization Gamma) := + (QuotientGroup.mk' + (H.map (Abelianization.of : Gamma →* Abelianization Gamma))).comp + Abelianization.of + have hphiKer : phi.ker = H ⊔ _root_.commutator Gamma := by + simpa only [phi, ← MonoidHom.comap_ker, QuotientGroup.ker_mk'] using + H.comap_map_abelianization_eq_sup_commutator + have hphiSurjective : Function.Surjective phi := by + exact (QuotientGroup.mk'_surjective _).comp + (QuotientGroup.mk'_surjective (_root_.commutator Gamma)) + exact + (QuotientGroup.quotientMulEquivOfEq hphiKer.symm).trans + (QuotientGroup.quotientKerEquivOfSurjective phi hphiSurjective) + +theorem quotientSupCommutatorEquivMapAbelianization_mk + (H : Subgroup Gamma) (g : Gamma) : + H.quotientSupCommutatorEquivMapAbelianization + (QuotientGroup.mk' (H ⊔ _root_.commutator Gamma) g) = + QuotientGroup.mk' + (H.map (Abelianization.of : Gamma →* Abelianization Gamma)) + (Abelianization.of g) := by + rfl + +end Subgroup diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/QuotientTower.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/QuotientTower.lean new file mode 100644 index 0000000000..bf6d0d4092 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/QuotientTower.lean @@ -0,0 +1,64 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.GroupTheory.Index +/-! +# Quotients in subgroup towers + +This file supplies the type-level equivalences between the quotient of a +subgroup and the corresponding quotient after viewing that subgroup inside a +larger group. They complement Mathlib's natural-number relative-index laws +when cardinal-valued indices must also cover infinite towers. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace Subgroup + +variable {G : Type u} [Group G] + +/-- Viewing `H` inside `K` does not change the quotient of `H` by the +subgroup induced by `M`. -/ +def quotientSubgroupOfEquiv {H K M : Subgroup G} (hHK : H ≤ K) : + (↑(H.subgroupOf K) ⧸ (M.subgroupOf K).subgroupOf (H.subgroupOf K)) ≃ + (↑H ⧸ M.subgroupOf H) where + toFun := Quotient.map' (subgroupOfEquivOfLe hHK) (by + intro x y hxy + rw [QuotientGroup.leftRel_apply] at hxy ⊢ + exact hxy) + invFun := Quotient.map' (subgroupOfEquivOfLe hHK).symm (by + intro x y hxy + rw [QuotientGroup.leftRel_apply] at hxy ⊢ + exact hxy) + left_inv q := by + refine Quotient.inductionOn' q ?_ + intro x + change Quotient.map' _ _ (Quotient.map' _ _ (Quotient.mk'' x)) = Quotient.mk'' x + simpa only [Quotient.map'_mk''] using + congrArg Quotient.mk'' ((subgroupOfEquivOfLe hHK).symm_apply_apply x) + right_inv q := by + refine Quotient.inductionOn' q ?_ + intro x + change Quotient.map' _ _ (Quotient.map' _ _ (Quotient.mk'' x)) = Quotient.mk'' x + simpa only [Quotient.map'_mk''] using + congrArg Quotient.mk'' ((subgroupOfEquivOfLe hHK).apply_symm_apply x) + +/-- A quotient by the bottom of a subgroup tower is equivalent to the product +of the two successive quotient types. -/ +def quotientTowerEquiv {M L K : Subgroup G} (hML : M ≤ L) (hLK : L ≤ K) : + (K ⧸ M.subgroupOf K) ≃ + (K ⧸ L.subgroupOf K) × (L ⧸ M.subgroupOf L) := + (quotientEquivProdOfLE (subgroupOf_mono K hML)).trans + (Equiv.prodCongr (Equiv.refl _) (quotientSubgroupOfEquiv hLK)) + +end Subgroup diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/RestrictionKernel.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/RestrictionKernel.lean new file mode 100644 index 0000000000..225e57e6dd --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/RestrictionKernel.lean @@ -0,0 +1,42 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Group.Subgroup.Ker +/-! +# Images of subgroups in restriction kernels + +This file isolates a group-theoretic criterion for identifying the image of +a subgroup with the kernel of a homomorphism after a surjective quotient. +-/ + +@[expose] public section + +namespace Subgroup + +/-- Suppose `φ` is surjective, the kernel of `ψ.comp φ` is `Z ⊔ U`, and `Z` +is already killed by `φ`. Then the image of `U` is exactly the kernel of `ψ`. +-/ +theorem map_eq_ker_of_comp_ker_eq_sup_of_left_le_ker + {A G H : Type*} [Group A] [Group G] [Group H] + (φ : A →* G) (ψ : G →* H) (Z U : Subgroup A) + (hφ : Function.Surjective φ) + (hker : (ψ.comp φ).ker = Z ⊔ U) + (hZ : Z ≤ φ.ker) : + U.map φ = ψ.ker := by + have hmapKer : (ψ.comp φ).ker.map φ = ψ.ker := by + rw [← MonoidHom.comap_ker] + exact Subgroup.map_comap_eq_self_of_surjective hφ ψ.ker + calc + U.map φ = ⊥ ⊔ U.map φ := by simp + _ = Z.map φ ⊔ U.map φ := by + rw [(Subgroup.map_eq_bot_iff Z).2 hZ] + _ = (Z ⊔ U).map φ := (Subgroup.map_sup Z U φ).symm + _ = (ψ.comp φ).ker.map φ := by rw [hker] + _ = ψ.ker := hmapKer + +end Subgroup diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer.lean new file mode 100644 index 0000000000..cd411093a1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer.RelativeAugmentation +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer.Witt + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/RelativeAugmentation.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/RelativeAugmentation.lean new file mode 100644 index 0000000000..91b188c973 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/RelativeAugmentation.lean @@ -0,0 +1,1029 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Augmentation +public import Mathlib.Algebra.MonoidAlgebra.MapDomain +public import Mathlib.GroupTheory.Transfer +/-! +# Transfer and relative augmentation quotients + +This file constructs the transfer on abelianizations and the concrete +relative augmentation quotient + +`(I_H + I_G I_H) / I_G I_H`. + +The two vertical augmentation maps in the transfer square are developed +from the integral group rings themselves. +-/ + +@[expose] public section + +open scoped Pointwise + +noncomputable +section + +namespace GroupTheory +namespace Transfer +namespace RelativeAugmentation + +open GroupTheory.Augmentation +open Subgroup + +variable {G : Type*} [Group G] + +/-- Transfer from `G` to the abelianization of a finite-index subgroup. -/ +noncomputable def transferToAbelianization + (H : Subgroup G) [H.FiniteIndex] : + G →* Abelianization H := + MonoidHom.transfer (Abelianization.of : H →* Abelianization H) + +/-- The transfer factors through the abelianization of `G`. -/ +noncomputable def abelianizedTransfer + (H : Subgroup G) [H.FiniteIndex] : + Abelianization G →* Abelianization H := + Abelianization.lift (transferToAbelianization H) + +@[simp] +theorem abelianizedTransfer_of + (H : Subgroup G) [H.FiniteIndex] (g : G) : + abelianizedTransfer H (Abelianization.of g) = + transferToAbelianization H g := + rfl + +/-- The explicit transversal formula for the top horizontal map in +the relative augmentation construction. -/ +theorem abelianizedTransfer_of_eq_diff + (H : Subgroup G) [H.FiniteIndex] + (T : H.LeftTransversal) (g : G) : + abelianizedTransfer H (Abelianization.of g) = + Subgroup.leftTransversals.diff + (Abelianization.of : H →* Abelianization H) + T (g • T) := by + exact MonoidHom.transfer_def + (Abelianization.of : H →* Abelianization H) T g + +/-- The inclusion of the subgroup ring `ℤ[H]` into `ℤ[G]`. -/ +def subgroupRingMap (H : Subgroup G) : + IntegralGroupRing H →+* IntegralGroupRing G := + MonoidAlgebra.mapDomainRingHom ℤ H.subtype + +@[simp] +theorem subgroupRingMap_single + (H : Subgroup G) (h : H) (n : ℤ) : + subgroupRingMap H (MonoidAlgebra.single h n) = + MonoidAlgebra.single (h : G) n := by + simp [subgroupRingMap] + +theorem subgroupRingMap_injective + (H : Subgroup G) : + Function.Injective (subgroupRingMap H) := + MonoidAlgebra.mapDomain_injective H.subtype_injective + +/-- The additive embedding `I_H → ℤ[G]`. -/ +def subgroupIdealEmbedding (H : Subgroup G) : + ideal H →+ IntegralGroupRing G where + toFun x := subgroupRingMap H (x : IntegralGroupRing H) + map_zero' := (subgroupRingMap H).map_zero + map_add' x y := (subgroupRingMap H).map_add x y + +theorem subgroupIdealEmbedding_injective + (H : Subgroup G) : + Function.Injective (subgroupIdealEmbedding H) := by + intro x y hxy + apply Subtype.ext + exact subgroupRingMap_injective H hxy + +/-- Evaluation of the subgroup-ideal embedding in the ambient group ring. -/ +@[simp] +theorem subgroupIdealEmbedding_apply + (H : Subgroup G) (x : ideal H) : + subgroupIdealEmbedding H x = + subgroupRingMap H (x : IntegralGroupRing H) := + rfl + +/-- The embedded copy of `I_H` in `ℤ[G]`. -/ +def embeddedSubgroupIdeal (H : Subgroup G) : + AddSubgroup (IntegralGroupRing G) := + (subgroupIdealEmbedding H).range + +/-- The additive product `I_G I_H` occurring in the relative augmentation construction. -/ +def mixedAugmentationProduct (H : Subgroup G) : + AddSubgroup (IntegralGroupRing G) := + AddSubgroup.closure + {z | ∃ x ∈ ideal G, ∃ y ∈ embeddedSubgroupIdeal H, + z = x * y} + +/-- The numerator `I_H + I_G I_H`. -/ +def relativeAugmentationNumerator (H : Subgroup G) : + AddSubgroup (IntegralGroupRing G) := + embeddedSubgroupIdeal H ⊔ mixedAugmentationProduct H + +/-- The denominator, viewed inside the numerator. -/ +def mixedProductInNumerator (H : Subgroup G) : + AddSubgroup (relativeAugmentationNumerator H) where + carrier := + {x | (x : IntegralGroupRing G) ∈ mixedAugmentationProduct H} + zero_mem' := (mixedAugmentationProduct H).zero_mem + add_mem' := (mixedAugmentationProduct H).add_mem + neg_mem' := (mixedAugmentationProduct H).neg_mem + +/-- Membership in the mixed product after forgetting the relative-numerator +subtype. -/ +@[simp] +theorem mem_mixedProductInNumerator_iff + (H : Subgroup G) (x : relativeAugmentationNumerator H) : + x ∈ mixedProductInNumerator H ↔ + (x : IntegralGroupRing G) ∈ mixedAugmentationProduct H := + Iff.rfl + +/-- The lower-right group in the diagram of the relative augmentation construction. -/ +abbrev RelativeAugmentationQuotient (H : Subgroup G) := + relativeAugmentationNumerator H ⧸ mixedProductInNumerator H + +/-- The element `h - 1`, embedded from `ℤ[H]` into `ℤ[G]`. -/ +def embeddedDelta (H : Subgroup G) (h : H) : + IntegralGroupRing G := + subgroupRingMap H (deltaElement H h : IntegralGroupRing H) + +@[simp] +theorem embeddedDelta_eq (H : Subgroup G) (h : H) : + embeddedDelta H h = + (deltaElement G (h : G) : IntegralGroupRing G) := by + simp [embeddedDelta, deltaElement] + +theorem embeddedDelta_mem_ideal + (H : Subgroup G) (h : H) : + embeddedDelta H h ∈ ideal G := by + rw [embeddedDelta_eq] + exact (deltaElement G (h : G)).property + +theorem embeddedDelta_mem_embeddedSubgroupIdeal + (H : Subgroup G) (h : H) : + embeddedDelta H h ∈ embeddedSubgroupIdeal H := + ⟨deltaElement H h, rfl⟩ + +/-- The relative augmentation element in the numerator. -/ +def relativeDeltaElement (H : Subgroup G) (h : H) : + relativeAugmentationNumerator H := + ⟨embeddedDelta H h, + AddSubgroup.mem_sup_left + (embeddedDelta_mem_embeddedSubgroupIdeal H h)⟩ + +/-- The class of `h - 1` in +`(I_H + I_G I_H) / I_G I_H`. -/ +def relativeDeltaClass (H : Subgroup G) (h : H) : + RelativeAugmentationQuotient H := + QuotientAddGroup.mk' (mixedProductInNumerator H) + (relativeDeltaElement H h) + +@[simp] +theorem relativeDeltaClass_one (H : Subgroup G) : + relativeDeltaClass H 1 = 0 := by + apply (QuotientAddGroup.eq_zero_iff _).2 + rw [mem_mixedProductInNumerator_iff] + change embeddedDelta H 1 ∈ mixedAugmentationProduct H + rw [embeddedDelta_eq] + simp + +/-- The relative identity `δ(hk)=δh+δk` modulo `I_G I_H`. -/ +theorem relativeDeltaClass_mul + (H : Subgroup G) (h k : H) : + relativeDeltaClass H (h * k) = + relativeDeltaClass H h + relativeDeltaClass H k := by + apply (QuotientAddGroup.eq_iff_sub_mem).2 + rw [mem_mixedProductInNumerator_iff] + change + embeddedDelta H (h * k) - + (embeddedDelta H h + embeddedDelta H k) ∈ + mixedAugmentationProduct H + have hprod : + embeddedDelta H h * embeddedDelta H k ∈ + mixedAugmentationProduct H := + AddSubgroup.subset_closure + ⟨embeddedDelta H h, + embeddedDelta_mem_ideal H h, + embeddedDelta H k, + embeddedDelta_mem_embeddedSubgroupIdeal H k, + rfl⟩ + convert hprod using 1 + simp only [embeddedDelta_eq, deltaElement_val] + have hsingle : + MonoidAlgebra.single ((h * k : H) : G) (1 : ℤ) = + MonoidAlgebra.single (h : G) 1 * + MonoidAlgebra.single (k : G) 1 := by + simp + rw [hsingle, ← MonoidAlgebra.one_def] + noncomm_ring + +/-- Multiplicative form of the relative augmentation map. -/ +def relativeDeltaMonoidHom (H : Subgroup G) : + H →* Multiplicative (RelativeAugmentationQuotient H) where + toFun h := Multiplicative.ofAdd (relativeDeltaClass H h) + map_one' := by + apply Multiplicative.toAdd.injective + exact relativeDeltaClass_one H + map_mul' h k := by + apply Multiplicative.toAdd.injective + exact relativeDeltaClass_mul H h k + +/-- The right vertical augmentation map in the relative augmentation construction. -/ +def relativeDeltaAbelianization (H : Subgroup G) : + Abelianization H →* + Multiplicative (RelativeAugmentationQuotient H) := + Abelianization.lift (relativeDeltaMonoidHom H) + +@[simp] +theorem relativeDeltaAbelianization_of + (H : Subgroup G) (h : H) : + relativeDeltaAbelianization H (Abelianization.of h) = + Multiplicative.ofAdd (relativeDeltaClass H h) := + rfl + +/-- The `H`-component of `g` with respect to a left transversal. -/ +def transversalComponent + (H : Subgroup G) (T : H.LeftTransversal) (g : G) : H := + ⟨((T.2.toLeftFun g : G)⁻¹ * g), + T.2.inv_toLeftFun_mul_mem g⟩ + +theorem transversalComponent_mul_right + (H : Subgroup G) (T : H.LeftTransversal) + (g : G) (h : H) : + transversalComponent H T (g * (h : G)) = + transversalComponent H T g * h := by + have hcoset : + (QuotientGroup.mk (g * (h : G)) : G ⧸ H) = + QuotientGroup.mk g := by + apply Quotient.sound' + rw [QuotientGroup.leftRel_apply] + simp [mul_assoc, H.inv_mem h.property] + have hrep : + T.2.toLeftFun (g * (h : G)) = + T.2.toLeftFun g := by + exact congrArg T.2.leftQuotientEquiv hcoset + apply Subtype.ext + change + (T.2.toLeftFun (g * (h : G)) : G)⁻¹ * + (g * (h : G)) = + ((T.2.toLeftFun g : G)⁻¹ * g) * (h : G) + rw [hrep] + exact + (mul_assoc ((T.2.toLeftFun g : G)⁻¹) g (h : G)).symm + +/-- A coefficient at `g` records its transversal `H`-component in +`Hᵃᵇ`. -/ +def transversalCoefficientToAbelianization + (H : Subgroup G) (T : H.LeftTransversal) (g : G) : + ℤ →+ Additive (Abelianization H) where + toFun n := + n • Additive.ofMul + (Abelianization.of (transversalComponent H T g)) + map_zero' := zero_zsmul _ + map_add' _ _ := add_zsmul _ _ _ + +/-- Transversal linearization of `ℤ[G]` in `Hᵃᵇ`. -/ +def transversalLinearization + (H : Subgroup G) (T : H.LeftTransversal) : + IntegralGroupRing G →+ Additive (Abelianization H) := + ((Finsupp.liftAddHom + (α := G) (M := ℤ) + (N := Additive (Abelianization H))) + (transversalCoefficientToAbelianization H T)).comp + MonoidAlgebra.coeffAddEquiv.toAddMonoidHom + +@[simp] +theorem transversalLinearization_single + (H : Subgroup G) (T : H.LeftTransversal) + (g : G) (n : ℤ) : + transversalLinearization H T + (MonoidAlgebra.single g n) = + n • Additive.ofMul + (Abelianization.of (transversalComponent H T g)) := by + simp [transversalLinearization, + transversalCoefficientToAbelianization] + +/-- On the embedded subgroup ideal, transversal linearization is the +ordinary abelianization linearization. -/ +theorem transversalLinearization_embeddedDelta + (H : Subgroup G) (T : H.LeftTransversal) (h : H) : + transversalLinearization H T (embeddedDelta H h) = + Additive.ofMul (Abelianization.of h) := by + have hc := + transversalComponent_mul_right H T (1 : G) h + rw [embeddedDelta_eq] + simp only [deltaElement_val, map_sub, + transversalLinearization_single, one_zsmul] + rw [show transversalComponent H T (h : G) = + transversalComponent H T 1 * h by simpa using hc] + simp + +/-- A basic generator of `I_G I_H` is killed by transversal +linearization. -/ +theorem transversalLinearization_delta_mul_embeddedDelta + (H : Subgroup G) (T : H.LeftTransversal) + (g : G) (h : H) : + transversalLinearization H T + ((deltaElement G g : IntegralGroupRing G) * + embeddedDelta H h) = + 0 := by + have hcg := + transversalComponent_mul_right H T g h + have hc1 := + transversalComponent_mul_right H T (1 : G) h + rw [embeddedDelta_eq] + simp only [deltaElement_val, mul_sub, sub_mul, map_sub, + MonoidAlgebra.single_mul_single, + transversalLinearization_single, one_mul, one_zsmul] + rw [show transversalComponent H T (g * (h : G)) = + transversalComponent H T g * h by + simpa using hcg] + rw [show transversalComponent H T (h : G) = + transversalComponent H T 1 * h by + simpa using hc1] + simp + +/-- Transversal linearization kills a product of an augmentation-zero +element of `ℤ[G]` with an embedded augmentation-zero element of +`ℤ[H]`. -/ +theorem transversalLinearization_mul_eq_zero + (H : Subgroup G) (T : H.LeftTransversal) + (x : IntegralGroupRing G) (hx : x ∈ ideal G) + (y : IntegralGroupRing G) (hy : y ∈ embeddedSubgroupIdeal H) : + transversalLinearization H T (x * y) = 0 := by + rcases hy with ⟨yH, rfl⟩ + rw [← deltaCombination_eq_of_mem_ideal G x hx] + have hycomb := + deltaCombination_eq_of_mem_ideal H + (yH : IntegralGroupRing H) yH.property + rw [subgroupIdealEmbedding_apply, ← hycomb] + simp only [deltaCombination, map_sum, map_zsmul] + rw [Finset.sum_mul] + simp_rw [Finset.mul_sum] + rw [map_sum] + apply Finset.sum_eq_zero + intro g hg + rw [map_sum] + apply Finset.sum_eq_zero + intro h hh + change + transversalLinearization H T + ((x.coeff g • + (deltaElement G g : IntegralGroupRing G)) * + (yH.1.coeff h • embeddedDelta H h)) = + 0 + rw [smul_mul_smul_comm, map_zsmul, + transversalLinearization_delta_mul_embeddedDelta, smul_zero] + +/-- Transversal linearization vanishes on `I_G I_H`. -/ +theorem transversalLinearization_eq_zero_of_mem_mixed + (H : Subgroup G) (T : H.LeftTransversal) + (z : IntegralGroupRing G) + (hz : z ∈ mixedAugmentationProduct H) : + transversalLinearization H T z = 0 := by + rw [mixedAugmentationProduct] at hz + refine AddSubgroup.closure_induction + (p := fun z _ => transversalLinearization H T z = 0) + ?_ ?_ ?_ ?_ hz + · rintro z ⟨x, hx, y, hy, rfl⟩ + exact transversalLinearization_mul_eq_zero + H T x hx y hy + · exact map_zero (transversalLinearization H T) + · intro x y hx hy hlinx hliny + rw [map_add, hlinx, hliny, add_zero] + · intro x hx hlin + rw [map_neg, hlin, neg_zero] + +/-- Transversal linearization restricted to +`I_H + I_G I_H`. -/ +def relativeLinearizationOnNumerator + (H : Subgroup G) (T : H.LeftTransversal) : + relativeAugmentationNumerator H →+ + Additive (Abelianization H) where + toFun x := + transversalLinearization H T + (x : IntegralGroupRing G) + map_zero' := (transversalLinearization H T).map_zero + map_add' x y := (transversalLinearization H T).map_add x y + +/-- The inverse linearization on the relative augmentation quotient. -/ +def relativeQuotientLinearization + (H : Subgroup G) (T : H.LeftTransversal) : + RelativeAugmentationQuotient H →+ + Additive (Abelianization H) := + QuotientAddGroup.lift + (mixedProductInNumerator H) + (relativeLinearizationOnNumerator H T) (by + intro x hx + apply AddMonoidHom.mem_ker.2 + exact transversalLinearization_eq_zero_of_mem_mixed + H T x hx) + +@[simp] +theorem relativeQuotientLinearization_deltaClass + (H : Subgroup G) (T : H.LeftTransversal) (h : H) : + relativeQuotientLinearization H T + (relativeDeltaClass H h) = + Additive.ofMul (Abelianization.of h) := by + exact transversalLinearization_embeddedDelta H T h + +/-- Multiplicative form of inverse relative linearization. -/ +def relativeQuotientLinearizationMonoidHom + (H : Subgroup G) (T : H.LeftTransversal) : + Multiplicative (RelativeAugmentationQuotient H) →* + Abelianization H := + (relativeQuotientLinearization H T).toMultiplicativeLeft + +@[simp] +theorem relativeQuotientLinearizationMonoidHom_deltaClass + (H : Subgroup G) (T : H.LeftTransversal) (h : H) : + relativeQuotientLinearizationMonoidHom H T + (Multiplicative.ofAdd (relativeDeltaClass H h)) = + Abelianization.of h := by + exact congrArg Additive.toMul + (relativeQuotientLinearization_deltaClass H T h) + +theorem relativeQuotientLinearizationMonoidHom_deltaAbelianization + (H : Subgroup G) (T : H.LeftTransversal) + (a : Abelianization H) : + relativeQuotientLinearizationMonoidHom H T + (relativeDeltaAbelianization H a) = + a := by + refine QuotientGroup.induction_on a ?_ + intro h + exact + relativeQuotientLinearizationMonoidHom_deltaClass + H T h + +/-- The right vertical augmentation map is injective. -/ +theorem relativeDeltaAbelianization_injective + (H : Subgroup G) : + Function.Injective (relativeDeltaAbelianization H) := by + let T : H.LeftTransversal := default + intro a b hab + have h := + congrArg + (relativeQuotientLinearizationMonoidHom H T) hab + rw [ + relativeQuotientLinearizationMonoidHom_deltaAbelianization + H T a, + relativeQuotientLinearizationMonoidHom_deltaAbelianization + H T b] at h + exact h + +/-- An embedded augmentation-ideal element, intrinsically valued in the +relative numerator. -/ +def embeddedIdealElement + (H : Subgroup G) (x : IntegralGroupRing H) + (hx : x ∈ ideal H) : + relativeAugmentationNumerator H := + ⟨subgroupRingMap H x, + AddSubgroup.mem_sup_left + (show subgroupRingMap H x ∈ embeddedSubgroupIdeal H from + ⟨⟨x, hx⟩, rfl⟩)⟩ + +/-- The coefficient expression supplies a preimage for every embedded +augmentation-ideal element. -/ +theorem relativeDeltaAbelianization_deltaPreimage + (H : Subgroup G) (x : IntegralGroupRing H) + (hx : x ∈ ideal H) : + relativeDeltaAbelianization H (deltaPreimage H x) = + Multiplicative.ofAdd + (QuotientAddGroup.mk' (mixedProductInNumerator H) + (embeddedIdealElement H x hx)) := by + apply Multiplicative.toAdd.injective + change + Multiplicative.toAdd + (relativeDeltaAbelianization H (deltaPreimage H x)) = + QuotientAddGroup.mk' (mixedProductInNumerator H) + (embeddedIdealElement H x hx) + rw [deltaPreimage, map_prod] + simp_rw [map_zpow, relativeDeltaAbelianization_of] + change + ∑ h ∈ x.coeff.support, + x.coeff h • relativeDeltaClass H h = + QuotientAddGroup.mk' (mixedProductInNumerator H) + (embeddedIdealElement H x hx) + change + ∑ h ∈ x.coeff.support, + x.coeff h • + QuotientAddGroup.mk' (mixedProductInNumerator H) + (relativeDeltaElement H h) = + QuotientAddGroup.mk' (mixedProductInNumerator H) + (embeddedIdealElement H x hx) + simp_rw [← map_zsmul] + rw [← map_sum] + apply congrArg + (QuotientAddGroup.mk' (mixedProductInNumerator H)) + apply Subtype.ext + calc + (↑(∑ h ∈ x.coeff.support, + x.coeff h • relativeDeltaElement H h) : + IntegralGroupRing G) = + ∑ h ∈ x.coeff.support, + x.coeff h • embeddedDelta H h := by + simp [relativeDeltaElement] + _ = subgroupRingMap H (deltaCombination H x) := by + simp [deltaCombination, embeddedDelta] + _ = subgroupRingMap H x := by + rw [deltaCombination_eq_of_mem_ideal H x hx] + _ = (embeddedIdealElement H x hx : + IntegralGroupRing G) := + rfl + +/-- The right vertical augmentation map is surjective. -/ +theorem relativeDeltaAbelianization_surjective + (H : Subgroup G) : + Function.Surjective (relativeDeltaAbelianization H) := by + intro q + change + ∃ a : Abelianization H, + relativeDeltaAbelianization H a = + Multiplicative.ofAdd (Multiplicative.toAdd q) + refine + QuotientAddGroup.induction_on + (Multiplicative.toAdd q) ?_ + intro z + rcases (AddSubgroup.mem_sup.mp z.property) with + ⟨e, he, m, hm, hem⟩ + rcases he with ⟨yH, rfl⟩ + refine + ⟨deltaPreimage H (yH : IntegralGroupRing H), ?_⟩ + rw [relativeDeltaAbelianization_deltaPreimage + H (yH : IntegralGroupRing H) yH.property] + apply Multiplicative.toAdd.injective + apply (QuotientAddGroup.eq_iff_sub_mem).2 + rw [mem_mixedProductInNumerator_iff] + change + subgroupRingMap H (yH : IntegralGroupRing H) - + (z : IntegralGroupRing G) ∈ + mixedAugmentationProduct H + have hem' : + subgroupRingMap H (yH : IntegralGroupRing H) + m = + (z : IntegralGroupRing G) := by + exact hem + rw [← hem'] + simpa using (mixedAugmentationProduct H).neg_mem hm + +/-- The right vertical isomorphism in the diagram of the relative augmentation construction. -/ +noncomputable def relativeDeltaAbelianizationEquiv + (H : Subgroup G) : + Abelianization H ≃* + Multiplicative (RelativeAugmentationQuotient H) := + MulEquiv.ofBijective (relativeDeltaAbelianization H) + ⟨relativeDeltaAbelianization_injective H, + relativeDeltaAbelianization_surjective H⟩ + +@[simp] +theorem relativeDeltaAbelianizationEquiv_apply + (H : Subgroup G) (a : Abelianization H) : + relativeDeltaAbelianizationEquiv H a = + relativeDeltaAbelianization H a := + rfl + +@[simp] +theorem relativeDeltaAbelianizationEquiv_of + (H : Subgroup G) (h : H) : + relativeDeltaAbelianizationEquiv H + (Abelianization.of h) = + Multiplicative.ofAdd (relativeDeltaClass H h) := + rfl + +/-- The lower horizontal map in the relative augmentation construction, obtained from transfer +through +the two canonical augmentation isomorphisms. -/ +noncomputable def augmentationTransfer + (H : Subgroup G) [H.FiniteIndex] : + Multiplicative (Quotient G) →* + Multiplicative (RelativeAugmentationQuotient H) := + (relativeDeltaAbelianization H).comp + ((abelianizedTransfer H).comp + (deltaAbelianizationEquiv G).symm.toMonoidHom) + +/-- Evaluation of the lower transfer map before using the augmentation +isomorphism. -/ +@[simp] +theorem augmentationTransfer_apply + (H : Subgroup G) [H.FiniteIndex] + (q : Multiplicative (Quotient G)) : + augmentationTransfer H q = + relativeDeltaAbelianization H + (abelianizedTransfer H + ((deltaAbelianizationEquiv G).symm q)) := + rfl + +/-- Commutativity of the transfer/augmentation square. -/ +theorem augmentationTransfer_deltaAbelianization + (H : Subgroup G) [H.FiniteIndex] + (a : Abelianization G) : + augmentationTransfer H (deltaAbelianization G a) = + relativeDeltaAbelianization H + (abelianizedTransfer H a) := by + rw [augmentationTransfer_apply, + ← deltaAbelianizationEquiv_apply G a, + MulEquiv.symm_apply_apply] + +theorem augmentationTransfer_deltaClass + (H : Subgroup G) [H.FiniteIndex] (g : G) : + augmentationTransfer H + (Multiplicative.ofAdd (deltaClass G g)) = + relativeDeltaAbelianization H + (transferToAbelianization H g) := by + rw [← deltaAbelianization_of] + exact augmentationTransfer_deltaAbelianization H + (Abelianization.of g) + +/-- The representative of a left coset selected by `T`. -/ +def leftRepresentative + (H : Subgroup G) (T : H.LeftTransversal) + (q : G ⧸ H) : G := + T.2.leftQuotientEquiv q + +/-- The `H`-factor comparing `T` with its translate by `g`. -/ +def transferComponent + (H : Subgroup G) (T : H.LeftTransversal) + (g : G) (q : G ⧸ H) : H := + ⟨(leftRepresentative H T q)⁻¹ * + leftRepresentative H (g • T) q, + QuotientGroup.leftRel_apply.mp <| + Quotient.exact' <| + (T.2.leftQuotientEquiv.symm_apply_apply q).trans + ((g • T).2.leftQuotientEquiv.symm_apply_apply q).symm⟩ + +theorem leftRepresentative_mul_transferComponent + (H : Subgroup G) (T : H.LeftTransversal) + (g : G) (q : G ⧸ H) : + leftRepresentative H T q * + (transferComponent H T g q : G) = + leftRepresentative H (g • T) q := by + simp [transferComponent, leftRepresentative] + +/-- The transfer is the product of the transversal components. -/ +theorem abelianizedTransfer_of_eq_prod_transferComponent + (H : Subgroup G) [H.FiniteIndex] + (T : H.LeftTransversal) (g : G) : + abelianizedTransfer H (Abelianization.of g) = + letI := H.fintypeQuotientOfFiniteIndex + ∏ q : G ⧸ H, + Abelianization.of (transferComponent H T g q) := by + let := H.fintypeQuotientOfFiniteIndex + rw [abelianizedTransfer_of_eq_diff H T g] + rfl + +/-- The group-ring norm element attached to a left transversal. -/ +def transversalNormElement + (H : Subgroup G) [H.FiniteIndex] + (T : H.LeftTransversal) : + IntegralGroupRing G := + letI := H.fintypeQuotientOfFiniteIndex + ∑ q : G ⧸ H, + MonoidAlgebra.single (leftRepresentative H T q) 1 + +/-- Translating a transversal translates its group-ring sum. -/ +theorem sum_shifted_leftRepresentatives + (H : Subgroup G) [H.FiniteIndex] + (T : H.LeftTransversal) (g : G) : + letI := H.fintypeQuotientOfFiniteIndex + ∑ q : G ⧸ H, + MonoidAlgebra.single + (leftRepresentative H (g • T) q) (1 : ℤ) = + MonoidAlgebra.single g 1 * + transversalNormElement H T := by + let := H.fintypeQuotientOfFiniteIndex + calc + ∑ q : G ⧸ H, + MonoidAlgebra.single + (leftRepresentative H (g • T) q) (1 : ℤ) = + ∑ q : G ⧸ H, + MonoidAlgebra.single + (leftRepresentative H (g • T) (g • q)) 1 := by + exact + (Equiv.sum_comp (MulAction.toPerm g) + (fun q : G ⧸ H => + MonoidAlgebra.single + (leftRepresentative H (g • T) q) + (1 : ℤ))).symm + _ = ∑ q : G ⧸ H, + MonoidAlgebra.single + (g * leftRepresentative H T q) 1 := by + apply Finset.sum_congr rfl + intro q _ + congr 2 + exact + (Subgroup.smul_leftQuotientEquiv + g T q).symm + _ = MonoidAlgebra.single g 1 * + transversalNormElement H T := by + simp [transversalNormElement, + Finset.mul_sum] + +/-- Multiplying an embedded augmentation difference by a transversal +representative stays in `I_H + I_G I_H`. -/ +theorem single_mul_embeddedDelta_mem_numerator + (H : Subgroup G) (r : G) (h : H) : + MonoidAlgebra.single r 1 * embeddedDelta H h ∈ + relativeAugmentationNumerator H := by + have hmixed : + (deltaElement G r : IntegralGroupRing G) * + embeddedDelta H h ∈ + mixedAugmentationProduct H := + AddSubgroup.subset_closure + ⟨(deltaElement G r : IntegralGroupRing G), + (deltaElement G r).property, + embeddedDelta H h, + embeddedDelta_mem_embeddedSubgroupIdeal H h, + rfl⟩ + have hsum : + embeddedDelta H h + + (deltaElement G r : IntegralGroupRing G) * + embeddedDelta H h ∈ + relativeAugmentationNumerator H := + (relativeAugmentationNumerator H).add_mem + (AddSubgroup.mem_sup_left + (embeddedDelta_mem_embeddedSubgroupIdeal H h)) + (AddSubgroup.mem_sup_right hmixed) + convert hsum using 1 + simp only [deltaElement_val] + rw [← MonoidAlgebra.one_def] + noncomm_ring + +/-- The group-ring element `δg · ∑ρ` belongs to the relative +augmentation numerator. -/ +theorem delta_mul_transversalNormElement_mem_numerator + (H : Subgroup G) [H.FiniteIndex] + (T : H.LeftTransversal) (g : G) : + (deltaElement G g : IntegralGroupRing G) * + transversalNormElement H T ∈ + relativeAugmentationNumerator H := by + let := H.fintypeQuotientOfFiniteIndex + have hsum : + ∑ q : G ⧸ H, + MonoidAlgebra.single + (leftRepresentative H T q) 1 * + embeddedDelta H (transferComponent H T g q) ∈ + relativeAugmentationNumerator H := by + apply AddSubgroup.sum_mem + intro q _ + exact single_mul_embeddedDelta_mem_numerator H + (leftRepresentative H T q) + (transferComponent H T g q) + convert hsum using 1 + simp only [embeddedDelta_eq, deltaElement_val] + simp_rw [mul_sub] + rw [Finset.sum_sub_distrib] + simp_rw [MonoidAlgebra.single_mul_single] + simp only [mul_one] + simp_rw [leftRepresentative_mul_transferComponent H T g] + rw [sum_shifted_leftRepresentatives H T g] + simp [transversalNormElement, sub_mul, Finset.mul_sum] + +/-- The group-ring identity underlying the norm-element formula. -/ +theorem delta_mul_transversalNormElement_eq_sum + (H : Subgroup G) [H.FiniteIndex] + (T : H.LeftTransversal) (g : G) : + letI := H.fintypeQuotientOfFiniteIndex + (deltaElement G g : IntegralGroupRing G) * + transversalNormElement H T = + ∑ q : G ⧸ H, + MonoidAlgebra.single + (leftRepresentative H T q) 1 * + embeddedDelta H (transferComponent H T g q) := by + let := H.fintypeQuotientOfFiniteIndex + simp only [embeddedDelta_eq, deltaElement_val] + simp_rw [mul_sub] + rw [Finset.sum_sub_distrib] + simp_rw [MonoidAlgebra.single_mul_single] + simp only [mul_one] + simp_rw [leftRepresentative_mul_transferComponent H T g] + rw [sum_shifted_leftRepresentatives H T g] + simp [transversalNormElement, sub_mul, Finset.mul_sum] + +/-- A single summand in the norm formula, intrinsically valued in the +relative numerator. -/ +def singleMulEmbeddedDeltaElement + (H : Subgroup G) (r : G) (h : H) : + relativeAugmentationNumerator H := + ⟨MonoidAlgebra.single r 1 * embeddedDelta H h, + single_mul_embeddedDelta_mem_numerator H r h⟩ + +/-- Multiplying by a representative does not change an embedded +augmentation class modulo `I_G I_H`. -/ +theorem mk_singleMulEmbeddedDeltaElement_eq_relativeDeltaClass + (H : Subgroup G) (r : G) (h : H) : + QuotientAddGroup.mk' (mixedProductInNumerator H) + (singleMulEmbeddedDeltaElement H r h) = + relativeDeltaClass H h := by + apply (QuotientAddGroup.eq_iff_sub_mem).2 + rw [mem_mixedProductInNumerator_iff] + change + MonoidAlgebra.single r 1 * embeddedDelta H h - + embeddedDelta H h ∈ + mixedAugmentationProduct H + have hmixed : + (deltaElement G r : IntegralGroupRing G) * + embeddedDelta H h ∈ + mixedAugmentationProduct H := + AddSubgroup.subset_closure + ⟨(deltaElement G r : IntegralGroupRing G), + (deltaElement G r).property, + embeddedDelta H h, + embeddedDelta_mem_embeddedSubgroupIdeal H h, + rfl⟩ + convert hmixed using 1 + simp only [deltaElement_val] + rw [← MonoidAlgebra.one_def] + noncomm_ring + +/-- The element `δg · ∑ρ`, intrinsically in the relative numerator. -/ +def deltaNormElement + (H : Subgroup G) [H.FiniteIndex] + (T : H.LeftTransversal) (g : G) : + relativeAugmentationNumerator H := + ⟨(deltaElement G g : IntegralGroupRing G) * + transversalNormElement H T, + delta_mul_transversalNormElement_mem_numerator H T g⟩ + +/-- Its class in the lower-right quotient. -/ +def deltaNormClass + (H : Subgroup G) [H.FiniteIndex] + (T : H.LeftTransversal) (g : G) : + RelativeAugmentationQuotient H := + QuotientAddGroup.mk' (mixedProductInNumerator H) + (deltaNormElement H T g) + +/-- Evaluation of vanishing for the norm class in the concrete mixed +augmentation product. -/ +theorem deltaNormClass_eq_zero_iff + (H : Subgroup G) [H.FiniteIndex] + (T : H.LeftTransversal) (g : G) : + deltaNormClass H T g = 0 ↔ + (deltaElement G g : IntegralGroupRing G) * + transversalNormElement H T ∈ + mixedAugmentationProduct H := + QuotientAddGroup.eq_zero_iff _ + +/-- The sum of transfer-component augmentation classes is the class of +`δg · ∑ρ`. -/ +theorem sum_relativeDeltaClass_transferComponent_eq_deltaNormClass + (H : Subgroup G) [H.FiniteIndex] + (T : H.LeftTransversal) (g : G) : + letI := H.fintypeQuotientOfFiniteIndex + ∑ q : G ⧸ H, + relativeDeltaClass H (transferComponent H T g q) = + deltaNormClass H T g := by + let := H.fintypeQuotientOfFiniteIndex + calc + ∑ q : G ⧸ H, + relativeDeltaClass H (transferComponent H T g q) = + ∑ q : G ⧸ H, + QuotientAddGroup.mk' (mixedProductInNumerator H) + (singleMulEmbeddedDeltaElement H + (leftRepresentative H T q) + (transferComponent H T g q)) := by + apply Finset.sum_congr rfl + intro q _ + exact + (mk_singleMulEmbeddedDeltaElement_eq_relativeDeltaClass + H (leftRepresentative H T q) + (transferComponent H T g q)).symm + _ = QuotientAddGroup.mk' (mixedProductInNumerator H) + (∑ q : G ⧸ H, + singleMulEmbeddedDeltaElement H + (leftRepresentative H T q) + (transferComponent H T g q)) := by + rw [map_sum] + _ = deltaNormClass H T g := by + apply congrArg + (QuotientAddGroup.mk' (mixedProductInNumerator H)) + apply Subtype.ext + simpa [singleMulEmbeddedDeltaElement, + deltaNormElement] using + (delta_mul_transversalNormElement_eq_sum + H T g).symm + +/-- **The norm-element formula.** +On the class of `g-1`, the lower horizontal map is multiplication by +the sum of a left transversal. -/ +theorem augmentationTransfer_deltaClass_eq_deltaNorm + (H : Subgroup G) [H.FiniteIndex] + (T : H.LeftTransversal) (g : G) : + augmentationTransfer H + (Multiplicative.ofAdd (deltaClass G g)) = + Multiplicative.ofAdd (deltaNormClass H T g) := by + rw [augmentationTransfer_deltaClass] + rw [← abelianizedTransfer_of H g, + abelianizedTransfer_of_eq_prod_transferComponent H T g, + map_prod] + let := H.fintypeQuotientOfFiniteIndex + exact congrArg Multiplicative.ofAdd + (sum_relativeDeltaClass_transferComponent_eq_deltaNormClass H T g) + +/-- Multiplication of an arbitrary augmentation-zero group-ring element +by the transversal norm stays in the relative numerator. -/ +theorem ideal_mul_transversalNormElement_mem_numerator + (H : Subgroup G) [H.FiniteIndex] + (T : H.LeftTransversal) + (x : IntegralGroupRing G) (hx : x ∈ ideal G) : + x * transversalNormElement H T ∈ + relativeAugmentationNumerator H := by + rw [← deltaCombination_eq_of_mem_ideal G x hx] + unfold deltaCombination + rw [Finset.sum_mul] + apply AddSubgroup.sum_mem + intro g hg + rw [smul_mul_assoc] + exact + (relativeAugmentationNumerator H).zsmul_mem + (delta_mul_transversalNormElement_mem_numerator + H T g) (x.coeff g) + +/-- The group-ring norm multiple of `x`, intrinsically in the relative +numerator. -/ +def idealNormElement + (H : Subgroup G) [H.FiniteIndex] + (T : H.LeftTransversal) + (x : IntegralGroupRing G) (hx : x ∈ ideal G) : + relativeAugmentationNumerator H := + ⟨x * transversalNormElement H T, + ideal_mul_transversalNormElement_mem_numerator + H T x hx⟩ + +/-- The class of `x · ∑ρ` in the relative augmentation quotient. -/ +def idealNormClass + (H : Subgroup G) [H.FiniteIndex] + (T : H.LeftTransversal) + (x : IntegralGroupRing G) (hx : x ∈ ideal G) : + RelativeAugmentationQuotient H := + QuotientAddGroup.mk' (mixedProductInNumerator H) + (idealNormElement H T x hx) + +/-- The coefficient decomposition of the general norm-element class. -/ +theorem sum_deltaNormClass_eq_idealNormClass + (H : Subgroup G) [H.FiniteIndex] + (T : H.LeftTransversal) + (x : IntegralGroupRing G) (hx : x ∈ ideal G) : + ∑ g ∈ x.coeff.support, + x.coeff g • deltaNormClass H T g = + idealNormClass H T x hx := by + calc + ∑ g ∈ x.coeff.support, + x.coeff g • deltaNormClass H T g = + QuotientAddGroup.mk' (mixedProductInNumerator H) + (∑ g ∈ x.coeff.support, + x.coeff g • deltaNormElement H T g) := by + simp_rw [deltaNormClass, ← map_zsmul] + rw [← map_sum] + _ = idealNormClass H T x hx := by + apply congrArg + (QuotientAddGroup.mk' (mixedProductInNumerator H)) + apply Subtype.ext + calc + (↑(∑ g ∈ x.coeff.support, + x.coeff g • deltaNormElement H T g) : + IntegralGroupRing G) = + ∑ g ∈ x.coeff.support, + x.coeff g • + ((deltaElement G g : IntegralGroupRing G) * + transversalNormElement H T) := by + simp [deltaNormElement] + _ = deltaCombination G x * + transversalNormElement H T := by + simp_rw [← smul_mul_assoc] + rw [← Finset.sum_mul] + rfl + _ = x * transversalNormElement H T := by + rw [deltaCombination_eq_of_mem_ideal G x hx] + _ = (idealNormElement H T x hx : + IntegralGroupRing G) := + rfl + +/-- **The full transfer/augmentation formula.** +For every `x ∈ I_G`, + +`S(x mod I_G²) = x · (∑ρ) mod I_G I_H`. +-/ +theorem augmentationTransfer_apply_quotientMk + (H : Subgroup G) [H.FiniteIndex] + (T : H.LeftTransversal) + (x : IntegralGroupRing G) (hx : x ∈ ideal G) : + augmentationTransfer H + (Multiplicative.ofAdd + (QuotientAddGroup.mk' (squareInIdeal G) ⟨x, hx⟩)) = + Multiplicative.ofAdd (idealNormClass H T x hx) := by + rw [← deltaAbelianization_deltaPreimage G x hx] + unfold deltaPreimage + rw [map_prod, map_prod] + simp_rw [map_zpow, deltaAbelianization_of] + simp_rw [ + augmentationTransfer_deltaClass_eq_deltaNorm H T] + apply Multiplicative.toAdd.injective + exact sum_deltaNormClass_eq_idealNormClass + H T x hx + +end RelativeAugmentation +end Transfer +end GroupTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean new file mode 100644 index 0000000000..0d5a69058f --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean @@ -0,0 +1,1322 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Augmentation +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer.RelativeAugmentation +public import Mathlib.GroupTheory.Finiteness +public import Mathlib.GroupTheory.Transfer +public import Mathlib.GroupTheory.Torsion +public import Mathlib.GroupTheory.FreeGroup.GeneratorEquiv +public import Mathlib.LinearAlgebra.Dimension.Localization +public import Mathlib.LinearAlgebra.Dimension.Torsion.Finite +public import Mathlib.LinearAlgebra.FreeModule.Finite.CardQuotient +public import Mathlib.LinearAlgebra.FreeModule.PID +public import Mathlib.LinearAlgebra.Matrix.Adjugate +/-! +# Witt's transfer theorem + +For a finitely generated group `G` with finite abelianization, the transfer +from `G / G'` to `G' / G''` is trivial. + +The proof follows Witt's group-ring argument. This file first +constructs the required right Fox coefficients directly from free words; no +presentation relations are assumed as extra input. +-/ + +@[expose] public section + +open scoped BigOperators Pointwise + +noncomputable +section + +namespace GroupTheory +namespace Transfer +namespace Witt + +open GroupTheory.Augmentation +open Subgroup +open GroupTheory.Transfer.RelativeAugmentation + +variable {G : Type*} [Group G] + +/-- Finite index of the commutator gives finiteness of the +abelianization. -/ +noncomputable instance finiteAbelianizationOfFiniteIndex + [FiniteIndex (commutator G)] : + Finite (Abelianization G) := by + let : Fintype (Abelianization G) := + (commutator G).fintypeQuotientOfFiniteIndex + exact Finite.of_fintype _ + +/-- The transfer between the successive commutator abelianizations +`G / G'` and `G' / G''`. -/ +noncomputable def commutatorTransfer + [FiniteIndex (commutator G)] : + Abelianization G →* Abelianization (commutator G) := + Abelianization.lift + (MonoidHom.transfer + (Abelianization.of : + commutator G →* Abelianization (commutator G))) + +@[simp] +theorem commutatorTransfer_of + [FiniteIndex (commutator G)] (g : G) : + commutatorTransfer (G := G) (Abelianization.of g) = + MonoidHom.transfer + (Abelianization.of : + commutator G →* Abelianization (commutator G)) g := + rfl + +/-- The integral group-ring element `[g] - 1`. -/ +def groupRingDelta (g : G) : IntegralGroupRing G := + MonoidAlgebra.single g 1 - + MonoidAlgebra.single (1 : G) 1 + +@[simp] +theorem groupRingDelta_one : + groupRingDelta (1 : G) = 0 := by + simp [groupRingDelta] + +theorem groupRingDelta_mul (g h : G) : + groupRingDelta (g * h) = + groupRingDelta g * MonoidAlgebra.single h 1 + + groupRingDelta h := by + have hs : + MonoidAlgebra.single (g * h) (1 : ℤ) = + MonoidAlgebra.single g 1 * + MonoidAlgebra.single h 1 := by + simp + rw [groupRingDelta, groupRingDelta, groupRingDelta, hs, + ← MonoidAlgebra.one_def] + noncomm_ring + +theorem groupRingDelta_mul_left (g h : G) : + groupRingDelta (g * h) = + MonoidAlgebra.single g 1 * groupRingDelta h + + groupRingDelta g := by + have hs : + MonoidAlgebra.single (g * h) (1 : ℤ) = + MonoidAlgebra.single g 1 * + MonoidAlgebra.single h 1 := by + simp + rw [groupRingDelta, groupRingDelta, groupRingDelta, hs, + ← MonoidAlgebra.one_def] + noncomm_ring + +theorem groupRingDelta_inv (g : G) : + groupRingDelta g⁻¹ = + groupRingDelta g * + (-MonoidAlgebra.single g⁻¹ 1) := by + let x : IntegralGroupRing G := + MonoidAlgebra.single g 1 + let y : IntegralGroupRing G := + MonoidAlgebra.single g⁻¹ 1 + have hs : + x * y = + (1 : IntegralGroupRing G) := by + simp [x, y, ← MonoidAlgebra.one_def] + calc + groupRingDelta g⁻¹ = y - 1 := rfl + _ = y - x * y := by rw [hs] + _ = (x - 1) * (-y) := by noncomm_ring + _ = groupRingDelta g * + (-MonoidAlgebra.single g⁻¹ 1) := rfl + +theorem groupRingDelta_inv_left (g : G) : + groupRingDelta g⁻¹ = + (-MonoidAlgebra.single g⁻¹ 1) * + groupRingDelta g := by + let x : IntegralGroupRing G := + MonoidAlgebra.single g 1 + let y : IntegralGroupRing G := + MonoidAlgebra.single g⁻¹ 1 + have hyx : y * x = (1 : IntegralGroupRing G) := by + simp [x, y, ← MonoidAlgebra.one_def] + calc + groupRingDelta g⁻¹ = y - 1 := rfl + _ = y - y * x := by rw [hyx] + _ = (-y) * (x - 1) := by noncomm_ring + _ = (-MonoidAlgebra.single g⁻¹ 1) * + groupRingDelta g := rfl + +@[simp] +theorem augmentation_groupRingDelta (g : G) : + augmentation G (groupRingDelta g) = 0 := by + simp [groupRingDelta] + +/-- The exponent-sum vector of a free word. -/ +def wordExponent {X : Type*} (w : FreeGroup X) : X →₀ ℤ := + FreeAbelianGroup.toFinsupp + (Additive.ofMul (Abelianization.of w)) + +@[simp] +theorem wordExponent_one {X : Type*} : + wordExponent (1 : FreeGroup X) = 0 := by + exact map_zero FreeAbelianGroup.toFinsupp + +@[simp] +theorem wordExponent_of {X : Type*} (x : X) : + wordExponent (FreeGroup.of x) = + Finsupp.single x 1 := by + exact FreeAbelianGroup.toFinsupp_of x + +@[simp] +theorem wordExponent_inv {X : Type*} (w : FreeGroup X) : + wordExponent w⁻¹ = -wordExponent w := by + change + FreeAbelianGroup.toFinsupp + (-Additive.ofMul (Abelianization.of w)) = + -FreeAbelianGroup.toFinsupp + (Additive.ofMul (Abelianization.of w)) + exact map_neg FreeAbelianGroup.toFinsupp _ + +@[simp] +theorem wordExponent_mul {X : Type*} (u v : FreeGroup X) : + wordExponent (u * v) = + wordExponent u + wordExponent v := by + change + FreeAbelianGroup.toFinsupp + (Additive.ofMul (Abelianization.of u) + + Additive.ofMul (Abelianization.of v)) = + FreeAbelianGroup.toFinsupp + (Additive.ofMul (Abelianization.of u)) + + FreeAbelianGroup.toFinsupp + (Additive.ofMul (Abelianization.of v)) + exact map_add FreeAbelianGroup.toFinsupp _ _ + +/-- A right Fox expansion of a free word, together with the fact that the +augmentation of each coefficient is the corresponding exponent sum. + +This is the source-producing form needed for Witt's relation matrix. -/ +theorem exists_rightFoxExpansion + {X : Type*} [Fintype X] + (φ : FreeGroup X →* G) (w : FreeGroup X) : + ∃ μ : X → IntegralGroupRing G, + groupRingDelta (φ w) = + ∑ i : X, + groupRingDelta (φ (FreeGroup.of i)) * μ i ∧ + ∀ i : X, + augmentation G (μ i) = + wordExponent w i := by + classical + let : DecidableEq X := Classical.decEq X + induction w using FreeGroup.induction_on with + | one => + refine ⟨0, ?_, ?_⟩ + · simp + · intro i + rw [wordExponent_one] + rfl + | of x => + refine + ⟨Pi.single x 1, ?_, ?_⟩ + · rw [Finset.sum_eq_single x] + · simp + · intro y _ hy + simp [Pi.single_eq_of_ne hy] + · simp + · intro i + by_cases hxi : x = i + · subst i + simp + · rw [Pi.single_eq_of_ne (Ne.symm hxi), map_zero, + wordExponent_of, + Finsupp.single_eq_of_ne (Ne.symm hxi)] + | inv_of x hx => + refine + ⟨Pi.single x + (-MonoidAlgebra.single + (φ (FreeGroup.of x))⁻¹ 1), + ?_, ?_⟩ + · rw [Finset.sum_eq_single x] + · simpa using + groupRingDelta_inv + (φ (FreeGroup.of x)) + · intro y _ hy + simp [Pi.single_eq_of_ne hy] + · simp + · intro i + by_cases hxi : x = i + · subst i + simp + · rw [Pi.single_eq_of_ne (Ne.symm hxi), map_zero, + wordExponent_inv] + change 0 = -(wordExponent (FreeGroup.of x) i) + rw [wordExponent_of, + Finsupp.single_eq_of_ne (Ne.symm hxi), neg_zero] + | mul u v hu hv => + obtain ⟨μ, hμ, haugμ⟩ := hu + obtain ⟨ν, hν, haugν⟩ := hv + refine + ⟨fun i => + μ i * MonoidAlgebra.single (φ v) 1 + ν i, + ?_, ?_⟩ + · rw [map_mul, groupRingDelta_mul, hμ, hν, + Finset.sum_mul, ← Finset.sum_add_distrib] + apply Finset.sum_congr rfl + intro i _ + rw [mul_add, mul_assoc] + · intro i + rw [map_add, map_mul, haugμ, haugν] + simp only [augmentation_single, mul_one] + rw [wordExponent_mul] + rfl + +/-- The map on free abelianizations induced by a free presentation. -/ +def presentationMap + {X : Type*} (φ : FreeGroup X →* G) : + FreeAbelianGroup X →+ + Additive (Abelianization G) := + (Abelianization.map φ).toAdditive + +@[simp] +theorem presentationMap_of + {X : Type*} (φ : FreeGroup X →* G) (x : X) : + presentationMap φ (FreeAbelianGroup.of x) = + Additive.ofMul + (Abelianization.of (φ (FreeGroup.of x))) := + rfl + +theorem presentationMap_surjective + {X : Type*} (φ : FreeGroup X →* G) + (hφ : Function.Surjective φ) : + Function.Surjective (presentationMap φ) := by + change + ∀ a : Abelianization G, + ∃ b : FreeAbelianGroup X, + presentationMap φ b = Additive.ofMul a + intro a + refine QuotientGroup.induction_on a ?_ + intro g + obtain ⟨w, rfl⟩ := hφ g + exact + ⟨Additive.ofMul (Abelianization.of w), rfl⟩ + +/-- The same presentation map, regarded as a `ℤ`-linear map. -/ +def presentationLinearMap + {X : Type*} (φ : FreeGroup X →* G) : + FreeAbelianGroup X →ₗ[ℤ] + Additive (Abelianization G) := + (presentationMap φ).toIntLinearMap + +@[simp] +theorem presentationLinearMap_apply + {X : Type*} (φ : FreeGroup X →* G) + (a : FreeAbelianGroup X) : + presentationLinearMap φ a = + presentationMap φ a := + rfl + +/-- Finite abelianization makes the relation lattice of a finite free +presentation have full rank. -/ +theorem presentationKernel_finrank_eq + {X : Type*} [Finite X] + (φ : FreeGroup X →* G) + [FiniteIndex (commutator G)] : + Module.finrank ℤ (presentationLinearMap φ).ker = + Module.finrank ℤ (FreeAbelianGroup X) := by + classical + let := Fintype.ofFinite X + let : Fintype (Abelianization G) := + (commutator G).fintypeQuotientOfFiniteIndex + let f := presentationLinearMap φ + let e := f.quotKerEquivRange + let : Finite f.range := + Finite.of_injective + ((↑) : f.range → + Additive (Abelianization G)) + Subtype.coe_injective + have ht : + Module.IsTorsion ℤ f.range := + isAddTorsion_iff_isTorsion_int.mp + isAddTorsion_of_finite + have hrange : + Module.finrank ℤ f.range = 0 := + Module.finrank_eq_zero_iff_isTorsion.mpr ht + have hzero : + Module.finrank ℤ + ((FreeAbelianGroup X) ⧸ f.ker) = 0 := + e.finrank_eq.trans hrange + change + Module.finrank ℤ f.ker = + Module.finrank ℤ (FreeAbelianGroup X) + have hrank := f.ker.finrank_quotient_add_finrank + calc + Module.finrank ℤ f.ker = + 0 + Module.finrank ℤ f.ker := by + rw [zero_add] + _ = Module.finrank ℤ + ((FreeAbelianGroup X) ⧸ f.ker) + + Module.finrank ℤ f.ker := by + rw [hzero] + _ = Module.finrank ℤ (FreeAbelianGroup X) := + hrank + +/-- A basis of the relation lattice, indexed by the generators. -/ +noncomputable def relationBasis + {X : Type*} [Fintype X] + (φ : FreeGroup X →* G) + [FiniteIndex (commutator G)] : + Module.Basis X ℤ (presentationLinearMap φ).ker := + Submodule.smithNormalFormBotBasis + (FreeAbelianGroup.basis X) + (presentationKernel_finrank_eq φ) + +/-- Every vector in the relation lattice is represented by an actual +relation word. The correction from a lift to a relation is made inside +the commutator subgroup of the free group, so it does not change the +free abelianization. -/ +theorem exists_relationWord + {X : Type*} + (φ : FreeGroup X →* G) + (hφ : Function.Surjective φ) + (m : (presentationLinearMap φ).ker) : + ∃ r : FreeGroup X, + φ r = 1 ∧ + Additive.ofMul (Abelianization.of r) = + (m : FreeAbelianGroup X) := by + obtain ⟨w, hw⟩ := + QuotientGroup.mk'_surjective + (commutator (FreeGroup X)) + (Additive.toMul (m : FreeAbelianGroup X)) + have hw' : + Additive.ofMul (Abelianization.of w) = + (m : FreeAbelianGroup X) := + congrArg Additive.ofMul hw + have habAdd : + Additive.ofMul + (Abelianization.of (φ w)) = 0 := by + calc + Additive.ofMul + (Abelianization.of (φ w)) = + presentationLinearMap φ + (Additive.ofMul + (Abelianization.of w)) := rfl + _ = presentationLinearMap φ + (m : FreeAbelianGroup X) := by + rw [hw'] + _ = 0 := m.property + have hab : + Abelianization.of (φ w) = 1 := by + exact congrArg Additive.toMul habAdd + have hφw : + φ w ∈ commutator G := + (QuotientGroup.eq_one_iff (φ w)).mp hab + have hmap : + (commutator (FreeGroup X)).map φ = + commutator G := by + rw [map_commutator_eq, + MonoidHom.range_eq_top.mpr hφ] + rfl + have hinv : + (φ w)⁻¹ ∈ + (commutator (FreeGroup X)).map φ := by + rw [hmap] + exact (commutator G).inv_mem hφw + obtain ⟨c, hc, hcφ⟩ := hinv + have hcAb : + Abelianization.of c = 1 := + (QuotientGroup.eq_one_iff c).mpr hc + refine ⟨w * c, ?_, ?_⟩ + · rw [map_mul, hcφ] + exact mul_inv_cancel _ + · rw [map_mul, ofMul_mul, hw', hcAb, ofMul_one] + exact add_zero _ + +/-- The group-ring map induced by abelianization. -/ +def abelianizationRingMap : + IntegralGroupRing G →+* + IntegralGroupRing (Abelianization G) := + MonoidAlgebra.mapDomainRingHom ℤ Abelianization.of + +@[simp] +theorem abelianizationRingMap_single + (g : G) (n : ℤ) : + abelianizationRingMap + (MonoidAlgebra.single g n) = + MonoidAlgebra.single (Abelianization.of g) n := by + simp [abelianizationRingMap] + +@[simp] +theorem abelianizationRingMap_groupRingDelta + (g : G) : + abelianizationRingMap (groupRingDelta g) = + groupRingDelta (Abelianization.of g) := by + simp [groupRingDelta] + +@[simp] +theorem augmentation_abelianizationRingMap + (x : IntegralGroupRing G) : + augmentation (Abelianization G) + (abelianizationRingMap x) = + augmentation G x := by + induction x using MonoidAlgebra.induction_on with + | of g => + simp [MonoidAlgebra.of] + | add x y hx hy => + simp [hx, hy] + | smul n x hx => + simp [hx] + +/-- An additive section of the group-ring abelianization map, obtained +by choosing the quotient representative of every abelianization class. -/ +def abelianizationRingSection : + IntegralGroupRing (Abelianization G) →+ + IntegralGroupRing G where + toFun := + MonoidAlgebra.mapDomain + (fun a : Abelianization G => a.out) + map_zero' := MonoidAlgebra.mapDomain_zero _ + map_add' := MonoidAlgebra.mapDomain_add _ + +@[simp] +theorem abelianizationRingSection_single + (a : Abelianization G) (n : ℤ) : + abelianizationRingSection + (MonoidAlgebra.single a n) = + MonoidAlgebra.single a.out n := by + simp [abelianizationRingSection] + +@[simp] +theorem abelianizationRingMap_section + (z : IntegralGroupRing (Abelianization G)) : + abelianizationRingMap + (abelianizationRingSection z) = z := by + induction z using MonoidAlgebra.induction_on with + | of a => + simp only [MonoidAlgebra.of_apply, + abelianizationRingSection_single, + abelianizationRingMap_single] + congr 1 + exact Quotient.out_eq a + | add x y hx hy => + simp [hx, hy] + | smul n x hx => + simp only [map_zsmul, hx] + +/-- Multiplying an element of `I_G` by an element killed by +`ℤ[G] → ℤ[Gᵃᵇ]` lands in `I_G I_{G'}`. -/ +theorem ideal_mul_mem_mixed_of_abelianizationRingMap_eq_zero + (x y : IntegralGroupRing G) + (hx : x ∈ ideal G) + (hy : abelianizationRingMap y = 0) : + x * y ∈ + mixedAugmentationProduct + (commutator G) := by + have hgeneral : + ∀ z : IntegralGroupRing G, + x * (z - + abelianizationRingSection + (abelianizationRingMap z)) ∈ + mixedAugmentationProduct + (commutator G) := by + intro z + induction z using MonoidAlgebra.induction_on with + | of g => + let q : Abelianization G := + Abelianization.of g + let r : G := q.out + have hrq : Abelianization.of r = q := by + exact Quotient.out_eq q + have hh : + r⁻¹ * g ∈ commutator G := by + apply + (QuotientGroup.eq_one_iff + (r⁻¹ * g)).mp + change Abelianization.of (r⁻¹ * g) = 1 + rw [map_mul, map_inv, hrq] + simp [q] + let h : commutator G := ⟨r⁻¹ * g, hh⟩ + have hfactor : + (MonoidAlgebra.of ℤ G g - + abelianizationRingSection + (abelianizationRingMap + (MonoidAlgebra.of ℤ G g))) = + MonoidAlgebra.single r 1 * + embeddedDelta + (commutator G) h := by + simp only [MonoidAlgebra.of_apply, + abelianizationRingMap_single, + abelianizationRingSection_single] + rw [embeddedDelta_eq] + simp only [deltaElement_val] + change + MonoidAlgebra.single g 1 - + MonoidAlgebra.single r 1 = + MonoidAlgebra.single r 1 * + (MonoidAlgebra.single (r⁻¹ * g) 1 - + MonoidAlgebra.single 1 1) + simp [mul_sub] + rw [hfactor, ← mul_assoc] + apply AddSubgroup.subset_closure + refine + ⟨x * MonoidAlgebra.single r 1, ?_, + embeddedDelta + (commutator G) h, + embeddedDelta_mem_embeddedSubgroupIdeal + (commutator G) h, rfl⟩ + rw [mem_ideal_iff, map_mul] + simp [(mem_ideal_iff G x).mp hx] + | add a b ha hb => + convert + (mixedAugmentationProduct + (commutator G)).add_mem ha hb using 1 + simp only [map_add] + noncomm_ring + | smul n a ha => + convert + (mixedAugmentationProduct + (commutator G)).zsmul_mem ha n using 1 + simp only [map_zsmul] + rw [← smul_sub, Algebra.mul_smul_comm] + have h := hgeneral y + simpa [hy] using h + +/-- The mixed product is stable under left multiplication by arbitrary +group-ring elements. -/ +theorem mul_mem_mixed + (H : Subgroup G) + (z m : IntegralGroupRing G) + (hm : m ∈ mixedAugmentationProduct H) : + z * m ∈ mixedAugmentationProduct H := by + rw [mixedAugmentationProduct] at hm + refine AddSubgroup.closure_induction + (p := fun m _ => + z * m ∈ mixedAugmentationProduct H) + ?_ ?_ ?_ ?_ hm + · rintro m ⟨x, hx, y, hy, rfl⟩ + apply AddSubgroup.subset_closure + exact + ⟨z * x, (ideal G).mul_mem_left z x hx, + y, hy, (mul_assoc z x y).symm⟩ + · simp + · intro a b _ _ ha hb + rw [mul_add] + exact (mixedAugmentationProduct H).add_mem ha hb + · intro a _ ha + rw [mul_neg] + exact (mixedAugmentationProduct H).neg_mem ha + +/-- A row vector annihilating a square matrix is annihilated by its +determinant. -/ +theorem mul_det_eq_zero_of_vecMul_eq_zero + {R : Type*} [CommRing R] + {ι : Type*} [Fintype ι] [DecidableEq ι] + (A : Matrix ι ι R) (v : ι → R) + (h : Matrix.vecMul v A = 0) (i : ι) : + v i * A.det = 0 := by + have h' : + Matrix.vecMul (Matrix.vecMul v A) + A.adjugate = 0 := by + rw [h] + simp + rw [Matrix.vecMul_vecMul, Matrix.mul_adjugate] at h' + have hi := congrFun h' i + simpa [Matrix.vecMul, dotProduct, + Matrix.one_apply] using hi + +section Presentation + +variable {X : Type*} [Fintype X] [DecidableEq X] +variable (φ : FreeGroup X →* G) +variable (hφ : Function.Surjective φ) +variable [FiniteIndex (commutator G)] + +/-- The chosen relation word representing the corresponding relation +basis vector. -/ +noncomputable def relationWord (j : X) : + FreeGroup X := + (exists_relationWord φ hφ (relationBasis φ j)).choose + +omit [DecidableEq X] in +@[simp] +theorem relationWord_map (j : X) : + φ (relationWord φ hφ j) = 1 := + (exists_relationWord φ hφ + (relationBasis φ j)).choose_spec.1 + +omit [DecidableEq X] in +theorem relationWord_abelianization (j : X) : + Additive.ofMul + (Abelianization.of (relationWord φ hφ j)) = + ((relationBasis φ j : + (presentationLinearMap φ).ker) : + FreeAbelianGroup X) := + (exists_relationWord φ hφ + (relationBasis φ j)).choose_spec.2 + +/-- The chosen right Fox coefficient of the `j`-th relation at the +`i`-th generator. -/ +noncomputable def foxCoefficient (i j : X) : + IntegralGroupRing G := + ((exists_rightFoxExpansion φ + (relationWord φ hφ j)).choose i) + +omit [DecidableEq X] in +theorem foxExpansion_relation (j : X) : + ∑ i : X, + groupRingDelta (φ (FreeGroup.of i)) * + foxCoefficient φ hφ i j = + 0 := by + have h : + groupRingDelta (φ (relationWord φ hφ j)) = + ∑ i : X, + groupRingDelta (φ (FreeGroup.of i)) * + foxCoefficient φ hφ i j := + (exists_rightFoxExpansion φ + (relationWord φ hφ j)).choose_spec.1 + exact h.symm.trans (by + rw [relationWord_map, groupRingDelta_one]) + +omit [DecidableEq X] in +theorem augmentation_foxCoefficient (i j : X) : + augmentation G (foxCoefficient φ hφ i j) = + wordExponent (relationWord φ hφ j) i := + (exists_rightFoxExpansion φ + (relationWord φ hφ j)).choose_spec.2 i + +omit [DecidableEq X] in +theorem augmentation_foxCoefficient_eq_repr + (i j : X) : + augmentation G (foxCoefficient φ hφ i j) = + (FreeAbelianGroup.basis X).repr + (((relationBasis φ j : + (presentationLinearMap φ).ker) : + FreeAbelianGroup X)) i := by + rw [augmentation_foxCoefficient] + unfold wordExponent + rw [relationWord_abelianization] + rfl + +/-- Witt's relation matrix, with entries reduced to the group ring of +the finite abelianization. -/ +noncomputable def foxMatrix : + Matrix X X + (IntegralGroupRing (Abelianization G)) := + fun i j => + abelianizationRingMap + (foxCoefficient φ hφ i j) + +/-- A chosen lift of an adjugate-matrix entry back to `ℤ[G]`. -/ +noncomputable def adjugateCoefficientLift (j k : X) : + IntegralGroupRing G := + abelianizationRingSection + ((foxMatrix φ hφ).adjugate j k) + +@[simp] +theorem abelianizationRingMap_adjugateCoefficientLift + (j k : X) : + abelianizationRingMap + (adjugateCoefficientLift φ hφ j k) = + (foxMatrix φ hφ).adjugate j k := + abelianizationRingMap_section _ + +/-- A chosen lift of the determinant. -/ +noncomputable def foxDeterminantLift : + IntegralGroupRing G := + abelianizationRingSection (foxMatrix φ hφ).det + +@[simp] +theorem abelianizationRingMap_foxDeterminantLift : + abelianizationRingMap + (foxDeterminantLift φ hφ) = + (foxMatrix φ hφ).det := + abelianizationRingMap_section _ + +/-- The coefficients obtained by multiplying the Fox matrix by a lift +of its adjugate. -/ +noncomputable def foxAdjugateCoefficient (i k : X) : + IntegralGroupRing G := + ∑ j : X, + foxCoefficient φ hφ i j * + adjugateCoefficientLift φ hφ j k + +theorem abelianizationRingMap_foxAdjugateCoefficient + (i k : X) : + abelianizationRingMap + (foxAdjugateCoefficient φ hφ i k) = + if i = k then (foxMatrix φ hφ).det else 0 := by + calc + abelianizationRingMap + (foxAdjugateCoefficient φ hφ i k) = + ∑ j : X, + foxMatrix φ hφ i j * + (foxMatrix φ hφ).adjugate j k := by + simp [foxAdjugateCoefficient, foxMatrix] + _ = ((foxMatrix φ hφ) * + (foxMatrix φ hφ).adjugate) i k := by + rw [Matrix.mul_apply] + _ = if i = k then + (foxMatrix φ hφ).det else 0 := by + rw [Matrix.mul_adjugate] + simp [Matrix.one_apply] + +theorem foxAdjugate_relation (k : X) : + ∑ i : X, + groupRingDelta (φ (FreeGroup.of i)) * + foxAdjugateCoefficient φ hφ i k = + 0 := by + simp only [foxAdjugateCoefficient, + Finset.mul_sum] + rw [Finset.sum_comm] + simp_rw [← mul_assoc, ← Finset.sum_mul] + simp [foxExpansion_relation] + +theorem generator_mul_foxDeterminantLift_mem_mixed + (k : X) : + groupRingDelta (φ (FreeGroup.of k)) * + foxDeterminantLift φ hφ ∈ + mixedAugmentationProduct (commutator G) := by + let error : X → IntegralGroupRing G := + fun i => + foxAdjugateCoefficient φ hφ i k - + if i = k then + foxDeterminantLift φ hφ else 0 + have herrMap (i : X) : + abelianizationRingMap (error i) = 0 := by + dsimp [error] + by_cases hik : i = k + · subst i + rw [ite_eq_left rfl] + rw [map_sub, + abelianizationRingMap_foxAdjugateCoefficient, + ite_eq_left rfl, + abelianizationRingMap_foxDeterminantLift, + sub_self] + · rw [ite_eq_right hik] + rw [map_sub, + abelianizationRingMap_foxAdjugateCoefficient, + ite_eq_right hik, map_zero, sub_zero] + have hdelta (i : X) : + groupRingDelta (φ (FreeGroup.of i)) ∈ + ideal G := by + rw [mem_ideal_iff] + exact augmentation_groupRingDelta _ + have herr (i : X) : + groupRingDelta (φ (FreeGroup.of i)) * + error i ∈ + mixedAugmentationProduct (commutator G) := + ideal_mul_mem_mixed_of_abelianizationRingMap_eq_zero + _ _ (hdelta i) (herrMap i) + have hsum : + ∑ i : X, + groupRingDelta (φ (FreeGroup.of i)) * + error i ∈ + mixedAugmentationProduct (commutator G) := + AddSubgroup.sum_mem _ (fun i _ => herr i) + have hdiag : + ∑ i : X, + groupRingDelta (φ (FreeGroup.of i)) * + (if i = k then + foxDeterminantLift φ hφ else 0) = + groupRingDelta (φ (FreeGroup.of k)) * + foxDeterminantLift φ hφ := by + rw [Finset.sum_eq_single k] + · simp + · intro i _ hik + simp [hik] + · simp + have heq : + ∑ i : X, + groupRingDelta (φ (FreeGroup.of i)) * + error i = + -(groupRingDelta (φ (FreeGroup.of k)) * + foxDeterminantLift φ hφ) := by + simp only [error, mul_sub, + Finset.sum_sub_distrib] + rw [foxAdjugate_relation, hdiag] + exact zero_sub _ + have hneg : + -(groupRingDelta (φ (FreeGroup.of k)) * + foxDeterminantLift φ hφ) ∈ + mixedAugmentationProduct (commutator G) := by + rw [← heq] + exact hsum + have := + (mixedAugmentationProduct + (commutator G)).neg_mem hneg + simpa using this + +omit [DecidableEq X] in +theorem delta_vecMul_foxMatrix : + Matrix.vecMul + (fun i : X => + groupRingDelta + (Abelianization.of + (φ (FreeGroup.of i)))) + (foxMatrix φ hφ) = + 0 := by + funext j + have h := + congrArg abelianizationRingMap + (foxExpansion_relation φ hφ j) + simpa [Matrix.vecMul, dotProduct, foxMatrix, + map_sum] using h + +theorem delta_generator_mul_foxMatrix_det (i : X) : + groupRingDelta + (Abelianization.of + (φ (FreeGroup.of i))) * + (foxMatrix φ hφ).det = + 0 := + mul_det_eq_zero_of_vecMul_eq_zero + (foxMatrix φ hφ) + (fun k : X => + groupRingDelta + (Abelianization.of + (φ (FreeGroup.of k)))) + (delta_vecMul_foxMatrix φ hφ) i + +theorem delta_word_mul_foxMatrix_det + (w : FreeGroup X) : + groupRingDelta + (Abelianization.of (φ w)) * + (foxMatrix φ hφ).det = + 0 := by + induction w using FreeGroup.induction_on with + | one => + simp + | of i => + exact delta_generator_mul_foxMatrix_det φ hφ i + | inv_of i hi => + rw [map_inv, map_inv, groupRingDelta_inv] + calc + groupRingDelta + (Abelianization.of + (φ (FreeGroup.of i))) * + (-MonoidAlgebra.single + (Abelianization.of + (φ (FreeGroup.of i)))⁻¹ 1) * + (foxMatrix φ hφ).det = + (groupRingDelta + (Abelianization.of + (φ (FreeGroup.of i))) * + (foxMatrix φ hφ).det) * + (-MonoidAlgebra.single + (Abelianization.of + (φ (FreeGroup.of i)))⁻¹ 1) := by + ac_rfl + _ = 0 := by rw [hi, zero_mul] + | mul u v hu hv => + rw [map_mul, map_mul, groupRingDelta_mul, + add_mul] + calc + (groupRingDelta + (Abelianization.of (φ u)) * + MonoidAlgebra.single + (Abelianization.of (φ v)) 1) * + (foxMatrix φ hφ).det + + groupRingDelta + (Abelianization.of (φ v)) * + (foxMatrix φ hφ).det = + (groupRingDelta + (Abelianization.of (φ u)) * + (foxMatrix φ hφ).det) * + MonoidAlgebra.single + (Abelianization.of (φ v)) 1 + + groupRingDelta + (Abelianization.of (φ v)) * + (foxMatrix φ hφ).det := by + congr 1 + ac_rfl + _ = 0 := by rw [hu, hv, zero_mul, zero_add] + +theorem delta_mul_foxMatrix_det + (a : Abelianization G) : + groupRingDelta a * (foxMatrix φ hφ).det = + 0 := by + refine QuotientGroup.induction_on a ?_ + intro g + obtain ⟨w, rfl⟩ := hφ g + exact delta_word_mul_foxMatrix_det φ hφ w + +theorem single_mul_foxMatrix_det + (a : Abelianization G) : + MonoidAlgebra.single a 1 * + (foxMatrix φ hφ).det = + (foxMatrix φ hφ).det := by + have h := delta_mul_foxMatrix_det φ hφ a + rw [groupRingDelta, sub_mul, + ← MonoidAlgebra.one_def, one_mul] at h + exact sub_eq_zero.mp h + +theorem augmentation_foxMatrix_det : + augmentation (Abelianization G) + (foxMatrix φ hφ).det = + (FreeAbelianGroup.basis X).det + (fun j : X => + (((relationBasis φ j : + (presentationLinearMap φ).ker) : + FreeAbelianGroup X))) := by + calc + augmentation (Abelianization G) + (foxMatrix φ hφ).det = + (RingHom.mapMatrix + (augmentation (Abelianization G)) + (foxMatrix φ hφ)).det := + RingHom.map_det + (augmentation (Abelianization G)) + (foxMatrix φ hφ) + _ = (FreeAbelianGroup.basis X).det + (fun j : X => + (((relationBasis φ j : + (presentationLinearMap φ).ker) : + FreeAbelianGroup X))) := by + rw [Module.Basis.det_apply] + congr 1 + ext i j + simp [foxMatrix, Module.Basis.toMatrix_apply, + augmentation_foxCoefficient_eq_repr] + +theorem natAbs_augmentation_foxMatrix_det : + Int.natAbs + (augmentation (Abelianization G) + (foxMatrix φ hφ).det) = + Nat.card (Abelianization G) := by + rw [augmentation_foxMatrix_det] + calc + Int.natAbs + ((FreeAbelianGroup.basis X).det + (fun j : X => + (((relationBasis φ j : + (presentationLinearMap φ).ker) : + FreeAbelianGroup X)))) = + Nat.card + ((FreeAbelianGroup X) ⧸ + (presentationLinearMap φ).ker) := + Submodule.natAbs_det_basis_change + (FreeAbelianGroup.basis X) + (presentationLinearMap φ).ker + (relationBasis φ) + _ = Nat.card + (Additive (Abelianization G)) := by + exact Nat.card_congr + ((presentationLinearMap φ).quotKerEquivOfSurjective + (presentationMap_surjective φ hφ)).toEquiv + _ = Nat.card (Abelianization G) := rfl + +end Presentation + +/-- The norm element of a finite group. -/ +def groupNormElement + (Q : Type*) [Finite Q] : + IntegralGroupRing Q := + letI := Fintype.ofFinite Q + ∑ q : Q, MonoidAlgebra.single q 1 + +@[simp] +theorem augmentation_groupNormElement + (Q : Type*) [Group Q] [Finite Q] : + augmentation Q (groupNormElement Q) = + Nat.card Q := by + let := Fintype.ofFinite Q + simp [groupNormElement, Nat.card_eq_fintype_card] + +/-- The image in the abelianized group ring of the sum of any left +transversal is the norm element of the abelianization. -/ +theorem abelianizationRingMap_transversalNormElement + [FiniteIndex (commutator G)] + (T : (commutator G).LeftTransversal) : + abelianizationRingMap + (transversalNormElement (commutator G) T) = + groupNormElement (Abelianization G) := by + let := (commutator G).fintypeQuotientOfFiniteIndex + unfold transversalNormElement groupNormElement + rw [map_sum] + apply Finset.sum_congr rfl + intro q _ + rw [abelianizationRingMap_single] + congr 2 + exact T.2.leftQuotientEquiv.symm_apply_apply q + +/-- A left-translation invariant element of a finite group ring is a +scalar multiple of the norm element. -/ +theorem eq_coeff_one_smul_groupNormElement + {Q : Type*} [Group Q] [Finite Q] + (z : IntegralGroupRing Q) + (hz : ∀ q : Q, + MonoidAlgebra.single q 1 * z = z) : + z = z.coeff 1 • groupNormElement Q := by + classical + let := Fintype.ofFinite Q + classical + ext q + have hq := + congrArg (fun x : IntegralGroupRing Q => + x.coeff q) (hz q) + have hcoeff : z.coeff q = z.coeff 1 := by + simpa using hq.symm + change + z.coeff q = + z.coeff 1 * (groupNormElement Q).coeff q + rw [hcoeff] + simp [groupNormElement] + +section PresentationNorm + +variable {X : Type*} [Fintype X] [DecidableEq X] +variable (φ : FreeGroup X →* G) +variable (hφ : Function.Surjective φ) +variable [FiniteIndex (commutator G)] + +/-- Witt's determinant is a unit multiple of the norm element of the +finite abelianization. -/ +theorem exists_unit_foxMatrix_det_eq_smul_norm : + ∃ u : ℤˣ, + (foxMatrix φ hφ).det = + (u : ℤ) • + groupNormElement (Abelianization G) := by + let : Fintype (Abelianization G) := + (commutator G).fintypeQuotientOfFiniteIndex + let d := (foxMatrix φ hφ).det + let c := d.coeff 1 + have hd : + d = c • groupNormElement (Abelianization G) := + eq_coeff_one_smul_groupNormElement d + (single_mul_foxMatrix_det φ hφ) + have haug : + augmentation (Abelianization G) d = + c * (Fintype.card + (Abelianization G) : ℤ) := by + have h := congrArg + (augmentation (Abelianization G)) hd + simpa [c] using h + have hnat : + Int.natAbs + (augmentation (Abelianization G) d) = + Fintype.card (Abelianization G) := by + simpa [d, Nat.card_eq_fintype_card] using + natAbs_augmentation_foxMatrix_det φ hφ + have hcprod : + Int.natAbs c * + Fintype.card (Abelianization G) = + Fintype.card (Abelianization G) := by + calc + Int.natAbs c * + Fintype.card (Abelianization G) = + Int.natAbs + (c * (Fintype.card + (Abelianization G) : ℤ)) := by + simpa only [Int.natAbs_natCast] using + (Int.natAbs_mul c + (Fintype.card + (Abelianization G) : ℤ)).symm + _ = Int.natAbs + (augmentation (Abelianization G) d) := by + rw [haug] + _ = Fintype.card (Abelianization G) := + hnat + have hcard : + 0 < Fintype.card (Abelianization G) := + Fintype.card_pos + have hcabs : Int.natAbs c = 1 := by + apply Nat.eq_of_mul_eq_mul_right hcard + simpa using hcprod + obtain ⟨u, hu⟩ := + (Int.isUnit_iff_natAbs_eq.mpr hcabs) + refine ⟨u, ?_⟩ + simpa only [d, hu] using hd + +theorem exists_unit_foxDeterminantLift_eq_smul_section_norm : + ∃ u : ℤˣ, + foxDeterminantLift φ hφ = + (u : ℤ) • + abelianizationRingSection + (groupNormElement (Abelianization G)) := by + obtain ⟨u, hu⟩ := + exists_unit_foxMatrix_det_eq_smul_norm φ hφ + refine ⟨u, ?_⟩ + unfold foxDeterminantLift + rw [hu, map_zsmul] + +include hφ in +omit [DecidableEq X] [Fintype X] in +theorem generator_mul_section_norm_mem_mixed [Finite X] + (k : X) : + groupRingDelta (φ (FreeGroup.of k)) * + abelianizationRingSection + (groupNormElement (Abelianization G)) ∈ + mixedAugmentationProduct (commutator G) := by + classical + let : DecidableEq X := Classical.decEq X + let := Fintype.ofFinite X + obtain ⟨u, hu⟩ := + exists_unit_foxDeterminantLift_eq_smul_section_norm + φ hφ + let S : IntegralGroupRing G := + abelianizationRingSection + (groupNormElement (Abelianization G)) + change + groupRingDelta (φ (FreeGroup.of k)) * S ∈ + mixedAugmentationProduct (commutator G) + have hm := + generator_mul_foxDeterminantLift_mem_mixed + φ hφ k + have hrepl : + groupRingDelta (φ (FreeGroup.of k)) * + foxDeterminantLift φ hφ = + (u : ℤ) • + (groupRingDelta (φ (FreeGroup.of k)) * S) := by + rw [hu] + exact Algebra.mul_smul_comm + (u : ℤ) + (groupRingDelta (φ (FreeGroup.of k))) S + have hmScalar : + (u : ℤ) • + (groupRingDelta (φ (FreeGroup.of k)) * + S) ∈ + mixedAugmentationProduct (commutator G) := by + rw [← hrepl] + exact hm + have hmTwice := + (mixedAugmentationProduct + (commutator G)).zsmul_mem hmScalar (u : ℤ) + have huu : (u : ℤ) * (u : ℤ) = 1 := by + rw [← pow_two] + exact Int.isUnit_sq u.isUnit + have htwice : + (u : ℤ) • + ((u : ℤ) • + (groupRingDelta (φ (FreeGroup.of k)) * S)) = + groupRingDelta (φ (FreeGroup.of k)) * S := by + rw [smul_smul, huu, one_smul] + rw [← htwice] + exact hmTwice + +include hφ in +omit [DecidableEq X] [Fintype X] in +theorem word_mul_section_norm_mem_mixed [Finite X] + (w : FreeGroup X) : + groupRingDelta (φ w) * + abelianizationRingSection + (groupNormElement (Abelianization G)) ∈ + mixedAugmentationProduct (commutator G) := by + classical + let : DecidableEq X := Classical.decEq X + let := Fintype.ofFinite X + let S : IntegralGroupRing G := + abelianizationRingSection + (groupNormElement (Abelianization G)) + change + groupRingDelta (φ w) * S ∈ + mixedAugmentationProduct (commutator G) + induction w using FreeGroup.induction_on with + | one => + simp + | of k => + exact generator_mul_section_norm_mem_mixed + φ hφ k + | inv_of k hk => + rw [map_inv, groupRingDelta_inv_left, + mul_assoc] + exact mul_mem_mixed (commutator G) + (-MonoidAlgebra.single + (φ (FreeGroup.of k))⁻¹ 1) + (groupRingDelta (φ (FreeGroup.of k)) * S) hk + | mul u v hu hv => + rw [map_mul, groupRingDelta_mul_left, + add_mul, mul_assoc] + exact + (mixedAugmentationProduct + (commutator G)).add_mem + (mul_mem_mixed (commutator G) + (MonoidAlgebra.single (φ u) 1) + (groupRingDelta (φ v) * S) hv) + hu + +include hφ in +omit [DecidableEq X] [Fintype X] in +theorem delta_mul_section_norm_mem_mixed [Finite X] + (g : G) : + groupRingDelta g * + abelianizationRingSection + (groupNormElement (Abelianization G)) ∈ + mixedAugmentationProduct (commutator G) := by + classical + let : DecidableEq X := Classical.decEq X + let := Fintype.ofFinite X + obtain ⟨w, rfl⟩ := hφ g + exact word_mul_section_norm_mem_mixed φ hφ w + +include hφ in +omit [DecidableEq X] [Fintype X] in +theorem delta_mul_transversalNormElement_mem_mixed [Finite X] + (T : (commutator G).LeftTransversal) (g : G) : + groupRingDelta g * + transversalNormElement (commutator G) T ∈ + mixedAugmentationProduct (commutator G) := by + classical + let : DecidableEq X := Classical.decEq X + let := Fintype.ofFinite X + let S : IntegralGroupRing G := + abelianizationRingSection + (groupNormElement (Abelianization G)) + let N : IntegralGroupRing G := + transversalNormElement (commutator G) T + have hδ : groupRingDelta g ∈ ideal G := by + rw [mem_ideal_iff] + exact augmentation_groupRingDelta g + have hker : + abelianizationRingMap (N - S) = 0 := by + simp only [map_sub, N, S, + abelianizationRingMap_transversalNormElement, + abelianizationRingMap_section, sub_self] + have hdiff : + groupRingDelta g * (N - S) ∈ + mixedAugmentationProduct (commutator G) := + ideal_mul_mem_mixed_of_abelianizationRingMap_eq_zero + (groupRingDelta g) (N - S) hδ hker + have hsection : + groupRingDelta g * S ∈ + mixedAugmentationProduct (commutator G) := + delta_mul_section_norm_mem_mixed φ hφ g + convert + (mixedAugmentationProduct (commutator G)).add_mem + hdiff hsection using 1 + noncomm_ring + +end PresentationNorm + +/-- If `G` is finitely generated and its abelianization is finite, then +the commutator transfer `G / G' → G' / G''` is trivial. -/ +theorem commutatorTransfer_eq_one_of_finite_abelianization + [Group.FG G] [FiniteIndex (commutator G)] : + commutatorTransfer (G := G) = 1 := by + classical + obtain ⟨X, hX, φ, hφ⟩ := + Group.fg_iff_exists_freeGroup_hom_surjective_finite.mp + (inferInstance : Group.FG G) + let : Finite X := hX + let : Fintype X := Fintype.ofFinite X + let : DecidableEq X := Classical.decEq X + let T : (commutator G).LeftTransversal := default + have hnormClass (g : G) : + deltaNormClass (commutator G) T g = 0 := by + apply (deltaNormClass_eq_zero_iff (commutator G) T g).2 + exact + delta_mul_transversalNormElement_mem_mixed + φ hφ T g + apply MonoidHom.ext + intro a + refine QuotientGroup.induction_on a ?_ + intro g + change + commutatorTransfer (G := G) (Abelianization.of g) = 1 + rw [commutatorTransfer_of] + apply relativeDeltaAbelianization_injective + (commutator G) + have hformula := + augmentationTransfer_deltaClass_eq_deltaNorm + (commutator G) T g + rw [augmentationTransfer_deltaClass, hnormClass] at hformula + simpa [transferToAbelianization] using hformula + +end Witt +end Transfer +end GroupTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer.lean new file mode 100644 index 0000000000..fcc55f3530 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract.lean new file mode 100644 index 0000000000..7a882f62e9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerAbelianAssembly +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerAbelianCyclicFactors +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerCyclicOperator +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerDelta +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerFixedField +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerGlobalOperator + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianAssembly.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianAssembly.lean new file mode 100644 index 0000000000..ad85daf9d5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianAssembly.lean @@ -0,0 +1,256 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerAbelianCyclicFactors +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerFixedField + +/-! # Kummer Abelian Assembly -/ + +@[expose] public section +namespace KummerTheory + +open CyclicCohomology + +/-! +# finite abelian Kummer theory, the finite abelian Kummer decomposition: assembling cyclic radicals + +This file connects elements produced in the invariant subtype `A_M` to the +ambient representation `A`. A cyclic radical with trivial stabilizer in +`G_K / G_M` is fixed in the ambient module by exactly `G_M`. Consequently, +a family of such radicals whose subgroups intersect in `G_L` generates the +abstract field `L` over `K`. +-/ + +noncomputable +section + +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +/-- Membership in `G_L`, regarded as a subgroup of `G_K`, is the same as +ambient membership in the closed subgroup `G_L`. -/ +@[simp] +theorem mem_extensionSubgroup_iff + {G : Type*} [Group G] [TopologicalSpace G] + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + (k : K.toSubgroup) : + k ∈ extensionSubgroup (G := G) K L hLK ↔ (k : G) ∈ L := + Iff.rfl + +/-- The quotient action on an invariant subtype is the original ambient +action after choosing a representative in `G_K`. -/ +theorem extensionFixedRepresentation_quotient_mk_apply_val + (A : Rep ℤ G) (K M : ClosedSubgroup G) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup (G := G) K M hMK).Normal] + (a : (extensionFixedRepresentation A K M hMK hnormal).V) + (k : K.toSubgroup) : + ((extensionFixedRepresentation A K M hMK hnormal).ρ + ((QuotientGroup.mk' (extensionSubgroup (G := G) K M hMK)) k) a).1 = + A.ρ k.1 a.1 := rfl + +/-- If an element of `A_M` has trivial stabilizer under `G_K/G_M`, its +ambient value is fixed by `k : G_K` exactly when `k` belongs to `G_M`. -/ +theorem extensionFixedRepresentation_val_fixed_iff_mem + (A : Rep ℤ G) (K M : ClosedSubgroup G) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup (G := G) K M hMK).Normal] + (a : (extensionFixedRepresentation A K M hMK hnormal).V) + (hstabilizer : + representationStabilizer (extensionFixedRepresentation A K M hMK hnormal) a = ⊥) + (k : K.toSubgroup) : + A.ρ k.1 a.1 = a.1 ↔ + k ∈ extensionSubgroup (G := G) K M hMK := by + constructor + · intro hk + have hq : + (QuotientGroup.mk' (extensionSubgroup (G := G) K M hMK)) k ∈ + representationStabilizer + (extensionFixedRepresentation A K M hMK hnormal) a := by + change + (extensionFixedRepresentation A K M hMK hnormal).ρ + ((QuotientGroup.mk' (extensionSubgroup (G := G) K M hMK)) k) a = a + apply Subtype.ext + exact hk + have hq_one : + (QuotientGroup.mk' (extensionSubgroup (G := G) K M hMK)) k = 1 := by + rw [← Subgroup.mem_bot] + rwa [← hstabilizer] + exact (QuotientGroup.eq_one_iff k).1 hq_one + · intro hk + exact a.2 ⟨k, hk⟩ + +/-- Quotient-fixedness of the descended global operator says precisely that +the ambient value `wp(a)` is fixed by `G_K`. -/ +theorem extensionFixedEndomorphism_fixed_val + (A : Rep ℤ G) (K M : ClosedSubgroup G) + (hMK : M.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup (G := G) K M hMK).Normal] + (wp : A ⟶ A) + (a : (extensionFixedRepresentation A K M hMK hnormal).V) + (hfixed : ∀ q : K.toSubgroup ⧸ extensionSubgroup (G := G) K M hMK, + (extensionFixedRepresentation A K M hMK hnormal).ρ q + ((extensionFixedEndomorphism A K M hMK wp).hom a) = + (extensionFixedEndomorphism A K M hMK wp).hom a) + (k : K.toSubgroup) : + A.ρ k.1 (wp.hom a.1) = wp.hom a.1 := by + have h := hfixed + ((QuotientGroup.mk' (extensionSubgroup (G := G) K M hMK)) k) + have hval := congrArg (fun x => x.1) h + exact hval + +/-- A family of faithful cyclic radicals generates `L` once the associated +subgroups intersect in `G_L`. The generation conclusion is derived from +the radicals' stabilizers; it is not an input. -/ +theorem closedSetFixingSubgroup_range_extensionFixed_eq + (A : Rep ℤ G) (hcontinuous : IsContinuousDiscreteRepresentation A) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + {iota : Type*} + (M : iota → ClosedSubgroup G) + (hMK : ∀ i, (M i).toSubgroup ≤ K.toSubgroup) + (hnormalM : ∀ i, (extensionSubgroup (G := G) K (M i) (hMK i)).Normal) + (a : ∀ i, + (extensionFixedRepresentation A K (M i) (hMK i) (hnormalM i)).V) + (hstabilizer : ∀ i, + representationStabilizer + (extensionFixedRepresentation A K (M i) (hMK i) (hnormalM i)) (a i) = ⊥) + (hintersect : + (⨅ i, extensionSubgroup (G := G) K (M i) (hMK i)) = + extensionSubgroup (G := G) K L hLK) : + closedSetFixingSubgroup A hcontinuous K (Set.range fun i => (a i).1) = L := by + ext sigma + change sigma ∈ + closedSetFixingSubgroup A hcontinuous K (Set.range fun i => (a i).1) ↔ + sigma ∈ L + rw [mem_closedSetFixingSubgroup_iff] + constructor + · rintro ⟨hsigmaK, hfix⟩ + let k : K.toSubgroup := ⟨sigma, hsigmaK⟩ + have hk_all : k ∈ ⨅ i, extensionSubgroup (G := G) K (M i) (hMK i) := by + rw [Subgroup.mem_iInf] + intro i + apply (extensionFixedRepresentation_val_fixed_iff_mem + A K (M i) (hMK i) (a i) (hstabilizer i) k).1 + exact hfix (a i).1 ⟨i, rfl⟩ + have hkL : k ∈ extensionSubgroup (G := G) K L hLK := by + rw [← hintersect] + exact hk_all + exact (mem_extensionSubgroup_iff K L hLK k).1 hkL + · intro hsigmaL + have hsigmaK : sigma ∈ K := hLK hsigmaL + refine ⟨hsigmaK, ?_⟩ + rintro _ ⟨i, rfl⟩ + let k : K.toSubgroup := ⟨sigma, hsigmaK⟩ + apply (extensionFixedRepresentation_val_fixed_iff_mem + A K (M i) (hMK i) (a i) (hstabilizer i) k).2 + have hkL : k ∈ extensionSubgroup (G := G) K L hLK := + (mem_extensionSubgroup_iff K L hLK k).2 hsigmaL + have hk_all : k ∈ ⨅ j, extensionSubgroup (G := G) K (M j) (hMK j) := by + rw [hintersect] + exact hkL + exact (Subgroup.mem_iInf.mp hk_all) i + +/-- Finite abelian endpoint of the forward direction of the finite abelian Kummer decomposition. + +The finite abelian quotient is decomposed into cyclic coordinates. The +global cyclic-operator theorem produces one radical for each coordinate; +their ambient values form a finite set `S`. The conclusions say that +`wp(S)` is fixed by `G_K` (the abstract `Delta` inclusion) and that the +pointwise fixing subgroup of `S` is exactly `G_L` (the generation +`L = K(S)`). -/ +theorem finiteAbelian_globalOperator_generators + [IsTopologicalGroup G] + (A : Rep ℤ G) (hAxiom : SatisfiesCyclicNormKernelVanishing A) + (hcontinuous : IsContinuousDiscreteRepresentation A) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup (G := G) K L hLK).Normal] + [hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK)] + [IsMulCommutative + (K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK)] + (wp : A ⟶ A) (n : ℕ+) (xi : A.V) + (hxi_order : addOrderOf xi = (n : ℕ)) + (hxi_kernel : wp.hom xi = 0) + (hxi_fixed : ∀ k : K.toSubgroup, A.ρ k.1 xi = xi) + (hexponent : + ∀ q : K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK, + q ^ (n : ℕ) = 1) : + ∃ S : Set A.V, + S.Finite ∧ + (∀ a, a ∈ S → ∀ k : K.toSubgroup, + A.ρ k.1 (wp.hom a) = wp.hom a) ∧ + closedSetFixingSubgroup A hcontinuous K S = L := by + obtain ⟨iota, hiota, m, _hm, f, hf, hfaithful⟩ := + open scoped IsMulCommutative in + finiteCommGroup_exists_jointlyFaithful_cyclic_factors + (K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK) + let : Fintype iota := hiota + let M : iota → ClosedSubgroup G := fun i => + closedCyclicFactorSubgroup K L hLK (f i) + have hMK (i : iota) : (M i).toSubgroup ≤ K.toSubgroup := by + exact closedCyclicFactorSubgroup_le_base K L hLK (f i) + have hnormalM (i : iota) : + (extensionSubgroup (G := G) K (M i) (hMK i)).Normal := by + dsimp only [M] + infer_instance + have hfiniteM (i : iota) : + Finite (K.toSubgroup ⧸ extensionSubgroup (G := G) K (M i) (hMK i)) := by + let : NeZero (m i) := ⟨(Nat.zero_lt_one.trans (_hm i)).ne'⟩ + exact finite_extensionSubgroup_closedCyclicFactorSubgroup_quotient + K L hLK (f i) (hf i) + have hcyclicM (i : iota) : + IsCyclic + (K.toSubgroup ⧸ extensionSubgroup (G := G) K (M i) (hMK i)) := by + exact cyclic_extensionSubgroup_closedCyclicFactorSubgroup_quotient + K L hLK (f i) (hf i) + have hexponentM (i : iota) : + ∀ q : K.toSubgroup ⧸ extensionSubgroup (G := G) K (M i) (hMK i), + q ^ (n : ℕ) = 1 := by + exact extensionSubgroup_closedCyclicFactorSubgroup_quotient_pow_eq_one + K L hLK (f i) hexponent + have hexists (i : iota) : + ∃ a : (extensionFixedRepresentation A K (M i) (hMK i) (hnormalM i)).V, + (∀ q : K.toSubgroup ⧸ extensionSubgroup (G := G) K (M i) (hMK i), + (extensionFixedRepresentation A K (M i) (hMK i) (hnormalM i)).ρ q + ((extensionFixedEndomorphism A K (M i) (hMK i) wp).hom a) = + (extensionFixedEndomorphism A K (M i) (hMK i) wp).hom a) ∧ + representationStabilizer + (extensionFixedRepresentation A K (M i) (hMK i) (hnormalM i)) a = ⊥ := by + let : (extensionSubgroup (G := G) K (M i) (hMK i)).Normal := hnormalM i + let : Finite + (K.toSubgroup ⧸ extensionSubgroup (G := G) K (M i) (hMK i)) := + hfiniteM i + let : IsCyclic + (K.toSubgroup ⧸ extensionSubgroup (G := G) K (M i) (hMK i)) := + hcyclicM i + obtain ⟨g, hg⟩ := IsCyclic.exists_generator (α := + K.toSubgroup ⧸ extensionSubgroup (G := G) K (M i) (hMK i)) + exact cyclicGlobalOperator_singleRadical + A hAxiom K (M i) (hMK i) g hg wp n xi hxi_order hxi_kernel hxi_fixed + (hexponentM i) + choose a hwp_fixed hstabilizer using hexists + let S : Set A.V := Set.range fun i => (a i).1 + have hintersect : + (⨅ i, extensionSubgroup (G := G) K (M i) (hMK i)) = + extensionSubgroup (G := G) K L hLK := by + change + (⨅ i, extensionSubgroup (G := G) K + (closedCyclicFactorSubgroup K L hLK (f i)) + (closedCyclicFactorSubgroup_le_base K L hLK (f i))) = + extensionSubgroup (G := G) K L hLK + simp_rw [extensionSubgroup_closedCyclicFactorSubgroup_eq K L hLK] + exact iInf_cyclicFactorSubgroup_eq + (extensionSubgroup (G := G) K L hLK) f hfaithful + refine ⟨S, Set.finite_range _, ?_, ?_⟩ + · intro b hb k + obtain ⟨i, rfl⟩ := hb + exact extensionFixedEndomorphism_fixed_val + A K (M i) (hMK i) wp (a i) (hwp_fixed i) k + · exact closedSetFixingSubgroup_range_extensionFixed_eq + A hcontinuous K L hLK M hMK hnormalM a hstabilizer hintersect + +end +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean new file mode 100644 index 0000000000..6382080bad --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean @@ -0,0 +1,320 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.GroupTheory.FiniteAbelian.Basic +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerGlobalOperator + +/-! # Kummer Abelian Cyclic Factors -/ + +@[expose] public section +namespace KummerTheory + +open CyclicCohomology + +/-! +# finite abelian Kummer theory, the finite abelian Kummer decomposition: cyclic factors of a + finite abelian extension + +The proof of the finite abelian Kummer decomposition reduces a finite abelian extension to cyclic +subextensions. This file supplies the group-theoretic source for that step. +A finite commutative group is written as a finite product of cyclic `ZMod` +groups. The kernels of its coordinate maps have trivial intersection. +Pulling those kernels back along a quotient map produces intermediate +subgroups whose quotients are finite cyclic and whose intersection is the +original normal subgroup. + +No radical generators or field-lattice endpoint are asserted here. +-/ + +noncomputable +section + +section FiniteAbelianCyclicFactors + +/-- Coordinate characters obtained from the structure theorem separate the +elements of a finite commutative group. -/ +theorem finiteCommGroup_exists_jointlyFaithful_cyclic_factors + (Q : Type*) [CommGroup Q] [Finite Q] : + ∃ (ι : Type 0) (_ : Fintype ι) (m : ι → ℕ), + (∀ i, 1 < m i) ∧ + ∃ f : ∀ i, Q →* Multiplicative (ZMod (m i)), + (∀ i, Function.Surjective (f i)) ∧ + (⨅ i, MonoidHom.ker (f i)) = ⊥ := by + obtain ⟨ι, hι, m, hm, ⟨e⟩⟩ := + CommGroup.equiv_prod_multiplicative_zmod_of_finite Q + let f : ∀ i, Q →* Multiplicative (ZMod (m i)) := fun i => + (Pi.evalMonoidHom (fun j => Multiplicative (ZMod (m j))) i).comp e + refine ⟨ι, hι, m, hm, f, ?_, ?_⟩ + · intro i + exact (Function.surjective_eval i).comp e.surjective + · apply le_antisymm + · intro x hx + rw [Subgroup.mem_bot] + apply e.injective + ext i + have hxi : x ∈ MonoidHom.ker (f i) := + (Subgroup.mem_iInf.mp hx) i + simpa [f] using MonoidHom.mem_ker.mp hxi + · exact bot_le + +section Pullback + +variable {P C : Type*} [Group P] [Group C] + (H : Subgroup P) [H.Normal] + +/-- Pull a quotient-factor kernel back to the original group. -/ +def cyclicFactorSubgroup (f : (P ⧸ H) →* C) : Subgroup P := + MonoidHom.ker (f.comp (QuotientGroup.mk' H)) + +/-- The kernel subgroup attached to a cyclic quotient factor is normal. -/ +instance cyclicFactorSubgroup_normal (f : (P ⧸ H) →* C) : + (cyclicFactorSubgroup H f).Normal := + MonoidHom.normal_ker _ + +/-- The original normal subgroup lies in every pulled-back factor kernel. -/ +theorem le_cyclicFactorSubgroup (f : (P ⧸ H) →* C) : + H ≤ cyclicFactorSubgroup H f := by + intro x hx + rw [cyclicFactorSubgroup, MonoidHom.mem_ker, MonoidHom.comp_apply] + have hmk : (x : P ⧸ H) = 1 := + (QuotientGroup.eq_one_iff (N := H) x).2 hx + exact (congrArg f hmk).trans (map_one f) + +/-- A surjective cyclic factor gives a cyclic quotient of the original +group by its pulled-back kernel. -/ +theorem cyclic_cyclicFactorSubgroup_quotient + [IsCyclic C] (f : (P ⧸ H) →* C) (hf : Function.Surjective f) : + IsCyclic (P ⧸ cyclicFactorSubgroup H f) := by + let F : P →* C := f.comp (QuotientGroup.mk' H) + have hF : Function.Surjective F := + hf.comp (QuotientGroup.mk'_surjective H) + let e : (P ⧸ MonoidHom.ker F) ≃* C := + QuotientGroup.quotientKerEquivOfSurjective F hF + change IsCyclic (P ⧸ MonoidHom.ker F) + exact (e.isCyclic).2 inferInstance + +/-- If the cyclic factor is finite, so is the corresponding quotient. -/ +theorem finite_cyclicFactorSubgroup_quotient + [Finite C] (f : (P ⧸ H) →* C) (hf : Function.Surjective f) : + Finite (P ⧸ cyclicFactorSubgroup H f) := by + let F : P →* C := f.comp (QuotientGroup.mk' H) + have hF : Function.Surjective F := + hf.comp (QuotientGroup.mk'_surjective H) + let e : (P ⧸ MonoidHom.ker F) ≃* C := + QuotientGroup.quotientKerEquivOfSurjective F hF + change Finite (P ⧸ MonoidHom.ker F) + exact Finite.of_equiv C e.symm.toEquiv + +variable {ι : Type*} {Cι : ι → Type*} [∀ i, Group (Cι i)] + +/-- Jointly faithful quotient factors pull back to subgroups whose +intersection is exactly the original normal subgroup. -/ +theorem iInf_cyclicFactorSubgroup_eq + (f : ∀ i, (P ⧸ H) →* Cι i) + (hfaithful : (⨅ i, MonoidHom.ker (f i)) = ⊥) : + (⨅ i, cyclicFactorSubgroup H (f i)) = H := by + apply le_antisymm + · intro x hx + have hq : (x : P ⧸ H) ∈ ⨅ i, MonoidHom.ker (f i) := by + rw [Subgroup.mem_iInf] + intro i + exact (Subgroup.mem_iInf.mp hx) i + rw [hfaithful, Subgroup.mem_bot] at hq + exact (QuotientGroup.eq_one_iff x).1 hq + · exact le_iInf fun i => le_cyclicFactorSubgroup H (f i) + +end Pullback + +end FiniteAbelianCyclicFactors + +section ClosedCyclicSubextensions + +variable {G : Type*} [Group G] [TopologicalSpace G] + +/-- A closed abstract field subgroup `G_L` remains closed when regarded as +a subgroup of the larger abstract field subgroup `G_K`. -/ +theorem extensionSubgroup_isClosed + {G : Type*} [Group G] [TopologicalSpace G] + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) : + IsClosed (extensionSubgroup (G := G) K L hLK : Set K.toSubgroup) := by + change IsClosed ((fun x : K.toSubgroup => (x : G)) ⁻¹' (L : Set G)) + exact L.isClosed'.preimage continuous_subtype_val + +variable [IsTopologicalGroup G] + +/-- A pulled-back cyclic factor kernel is closed inside `G_K`: the finite +quotient by `G_L` is discrete, and the factor kernel is pulled back along the +continuous quotient map. -/ +theorem cyclicFactorSubgroup_isClosed + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup (G := G) K L hLK).Normal] + [hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK)] + {C : Type*} [Group C] + (f : (K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK) →* C) : + IsClosed + (cyclicFactorSubgroup (extensionSubgroup (G := G) K L hLK) f : + Set K.toSubgroup) := by + let H := extensionSubgroup (G := G) K L hLK + let : IsClosed (H : Set K.toSubgroup) := extensionSubgroup_isClosed K L hLK + change IsClosed + ((QuotientGroup.mk' H) ⁻¹' (MonoidHom.ker f : Set (K.toSubgroup ⧸ H))) + exact (isClosed_discrete _).preimage QuotientGroup.continuous_mk + +/-- The closed abstract intermediate field attached to one cyclic coordinate +factor of `G_K/G_L`. -/ +def closedCyclicFactorSubgroup + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup (G := G) K L hLK).Normal] + [hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK)] + {C : Type*} [Group C] + (f : (K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK) →* C) : + ClosedSubgroup G where + toSubgroup := + (cyclicFactorSubgroup (extensionSubgroup (G := G) K L hLK) f).map + K.toSubgroup.subtype + isClosed' := by + change IsClosed + ((fun x : K.toSubgroup => (x : G)) '' + (cyclicFactorSubgroup (extensionSubgroup (G := G) K L hLK) f : + Set K.toSubgroup)) + exact K.isClosed'.isClosedMap_subtype_val _ + (cyclicFactorSubgroup_isClosed K L hLK f) + +/-- The cyclic-factor intermediate subgroup lies below the base subgroup +`G_K`. -/ +theorem closedCyclicFactorSubgroup_le_base + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup (G := G) K L hLK).Normal] + [hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK)] + {C : Type*} [Group C] + (f : (K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK) →* C) : + (closedCyclicFactorSubgroup K L hLK f).toSubgroup ≤ K.toSubgroup := by + rintro x ⟨y, hy, rfl⟩ + exact y.property + +/-- The original subgroup `G_L` lies below every cyclic-factor intermediate +subgroup. Finiteness is needed by the closed intermediate object itself: +it makes the quotient discrete, hence its pulled-back kernel closed. -/ +theorem le_closedCyclicFactorSubgroup + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup (G := G) K L hLK).Normal] + [hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK)] + {C : Type*} [Group C] + (f : (K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK) →* C) : + L.toSubgroup ≤ + (closedCyclicFactorSubgroup (hfinite := hfinite) K L hLK f).toSubgroup := by + intro x hx + let y : K.toSubgroup := ⟨x, hLK hx⟩ + have hyH : y ∈ extensionSubgroup (G := G) K L hLK := by + exact hx + have hyS : y ∈ cyclicFactorSubgroup (extensionSubgroup (G := G) K L hLK) f := + le_cyclicFactorSubgroup (extensionSubgroup (G := G) K L hLK) f hyH + exact ⟨y, hyS, rfl⟩ + +/-- Viewed inside `G_K`, the closed cyclic-factor subgroup has exactly the +pulled-back coordinate kernel as its extension subgroup. -/ +theorem extensionSubgroup_closedCyclicFactorSubgroup_eq + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup (G := G) K L hLK).Normal] + [hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK)] + {C : Type*} [Group C] + (f : (K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK) →* C) : + extensionSubgroup (G := G) K (closedCyclicFactorSubgroup K L hLK f) + (closedCyclicFactorSubgroup_le_base K L hLK f) = + cyclicFactorSubgroup (extensionSubgroup (G := G) K L hLK) f := by + ext x + simp only [extensionSubgroup, closedCyclicFactorSubgroup] + rw [Subgroup.mem_subgroupOf] + constructor + · rintro ⟨y, hy, hxy⟩ + have hyx : y = x := Subtype.ext hxy + simpa [hyx] using hy + · intro hx + exact ⟨x, hx, rfl⟩ + +/-- The extension subgroup of a closed cyclic factor is normal in `G_K`. -/ +instance extensionSubgroup_closedCyclicFactorSubgroup_normal + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup (G := G) K L hLK).Normal] + [hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK)] + {C : Type*} [Group C] + (f : (K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK) →* C) : + (extensionSubgroup (G := G) K (closedCyclicFactorSubgroup K L hLK f) + (closedCyclicFactorSubgroup_le_base K L hLK f)).Normal := by + rw [extensionSubgroup_closedCyclicFactorSubgroup_eq K L hLK f] + infer_instance + +/-- The quotient attached to a surjective finite cyclic coordinate is +finite. -/ +theorem finite_extensionSubgroup_closedCyclicFactorSubgroup_quotient + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup (G := G) K L hLK).Normal] + [hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK)] + {C : Type*} [Group C] [Finite C] + (f : (K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK) →* C) + (hf : Function.Surjective f) : + Finite + (K.toSubgroup ⧸ + extensionSubgroup (G := G) K (closedCyclicFactorSubgroup K L hLK f) + (closedCyclicFactorSubgroup_le_base K L hLK f)) := by + rw [extensionSubgroup_closedCyclicFactorSubgroup_eq K L hLK f] + exact finite_cyclicFactorSubgroup_quotient + (extensionSubgroup (G := G) K L hLK) f hf + +/-- The quotient attached to a surjective cyclic coordinate is cyclic. -/ +theorem cyclic_extensionSubgroup_closedCyclicFactorSubgroup_quotient + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup (G := G) K L hLK).Normal] + [hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK)] + {C : Type*} [Group C] [IsCyclic C] + (f : (K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK) →* C) + (hf : Function.Surjective f) : + IsCyclic + (K.toSubgroup ⧸ + extensionSubgroup (G := G) K (closedCyclicFactorSubgroup K L hLK f) + (closedCyclicFactorSubgroup_le_base K L hLK f)) := by + let e := QuotientGroup.quotientMulEquivOfEq + (extensionSubgroup_closedCyclicFactorSubgroup_eq K L hLK f) + exact e.isCyclic.2 + (cyclic_cyclicFactorSubgroup_quotient + (extensionSubgroup (G := G) K L hLK) f hf) + +/-- An exponent bound on `G_K/G_L` descends to the quotient attached to a +closed cyclic coordinate. -/ +theorem extensionSubgroup_closedCyclicFactorSubgroup_quotient_pow_eq_one + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup (G := G) K L hLK).Normal] + [hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK)] + {C : Type*} [Group C] + (f : (K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK) →* C) + {n : ℕ} + (hexponent : ∀ q : K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK, + q ^ n = 1) : + ∀ q : K.toSubgroup ⧸ + extensionSubgroup (G := G) K (closedCyclicFactorSubgroup K L hLK f) + (closedCyclicFactorSubgroup_le_base K L hLK f), + q ^ n = 1 := by + intro q + refine QuotientGroup.induction_on q ?_ + intro x + change (QuotientGroup.mk' + (extensionSubgroup (G := G) K (closedCyclicFactorSubgroup K L hLK f) + (closedCyclicFactorSubgroup_le_base K L hLK f))) x ^ n = 1 + rw [← map_pow] + apply (QuotientGroup.eq_one_iff (N := + extensionSubgroup (G := G) K (closedCyclicFactorSubgroup K L hLK f) + (closedCyclicFactorSubgroup_le_base K L hLK f)) (x ^ n)).2 + rw [extensionSubgroup_closedCyclicFactorSubgroup_eq K L hLK f] + change f ((QuotientGroup.mk' + (extensionSubgroup (G := G) K L hLK)) (x ^ n)) = 1 + rw [map_pow, hexponent, map_one] + +end ClosedCyclicSubextensions + +end +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerCyclicOperator.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerCyclicOperator.lean new file mode 100644 index 0000000000..b9bc0dd388 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerCyclicOperator.lean @@ -0,0 +1,197 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing + +/-! # Kummer Cyclic Operator -/ + +@[expose] public section +namespace KummerTheory + +open CyclicCohomology + +/-! +# finite abelian Kummer theory, the finite abelian Kummer decomposition: the cyclic + abstract-operator step + +This file isolates the finite cyclic step in the proof of the finite abelian Kummer decomposition. +It does not claim the full Kummer correspondence. In additive notation, we +use a fixed kernel element `xi` of an equivariant operator `wp`, of order +`n`. If the cyclic Galois group is killed by `n`, the vanishing of `H⁻¹` +produces one element `a` such that `wp a` is fixed and `a` has trivial +stabilizer. This is the abstract analogue of the construction +`a^σ⁻¹ = ζ` and hence the single-radical generation step. +-/ + +noncomputable +section + +open CategoryTheory + +/-- Stabilizer for the action carried by a representation. We keep it +explicit because a `Representation` does not install its action as a global +`MulAction` instance on the underlying module. -/ +def representationStabilizer {Q : IntegralRepGroupType} [Group Q] + (B : Rep ℤ Q) (a : B.V) : Subgroup Q := by + letI : Module ℤ B.V := B.hV2 + exact + { carrier := {q | B.ρ q a = a} + one_mem' := by + change B.ρ (1 : Q) a = a + exact congrArg (fun f : Module.End ℤ B.V => f a) (map_one B.ρ) + mul_mem' := by + intro q r hq hr + change B.ρ (q * r) a = a + rw [map_mul] + change B.ρ q (B.ρ r a) = a + rw [hr, hq] + inv_mem' := by + intro q hq + change B.ρ q⁻¹ a = a + calc + B.ρ q⁻¹ a = B.ρ q⁻¹ (B.ρ q a) := congrArg (B.ρ q⁻¹) hq.symm + _ = a := Representation.inv_self_apply B.ρ q a } + +/-- The cohomological core of the finite cyclic case of the finite abelian Kummer decomposition. + +The two conclusions say that `wp a` belongs to the base fixed module and +that the orbit of `a` has the full size of `Q`. No radical element or +generation assertion is assumed. -/ +theorem cyclic_single_radical_of_tateHMinusOne_isZero + {Q : IntegralRepGroupType} [Group Q] [Fintype Q] + (B : Rep ℤ Q) (g : Q) (hg : ∀ q, q ∈ Subgroup.zpowers g) + (hzero : Limits.IsZero (tateCohomology B (-1))) + (wp : B ⟶ B) (n : ℕ+) (xi : B.V) + (hxi_order : addOrderOf xi = (n : ℕ)) + (hxi_kernel : wp.hom xi = 0) + (hxi_fixed : ∀ q : Q, B.ρ q xi = xi) + (hexponent : ∀ q : Q, q ^ (n : ℕ) = 1) : + ∃ a : B.V, + (∀ q : Q, B.ρ q (wp.hom a) = wp.hom a) ∧ + representationStabilizer B a = ⊥ := by + let d := Fintype.card Q + let eta : B.V := ((n : ℕ) / d) • xi + have hd_pos : 0 < d := Fintype.card_pos + have hn_pos : 0 < (n : ℕ) := n.pos + have hg_order : orderOf g = d := + by simpa [d] using orderOf_eq_card_of_forall_mem_zpowers hg + have hdegree : d ∣ (n : ℕ) := by + rw [← hg_order] + exact orderOf_dvd_of_pow_eq_one (hexponent g) + have hquot_pos : 0 < (n : ℕ) / d := + Nat.div_pos (Nat.le_of_dvd hn_pos hdegree) hd_pos + have hquot_dvd : (n : ℕ) / d ∣ addOrderOf xi := by + rw [hxi_order] + exact Nat.div_dvd_of_dvd hdegree + have heta_order : addOrderOf eta = d := by + calc + addOrderOf eta = addOrderOf xi / ((n : ℕ) / d) := + addOrderOf_nsmul_of_dvd hquot_pos.ne' hquot_dvd + _ = (n : ℕ) / ((n : ℕ) / d) := by rw [hxi_order] + _ = d := Nat.div_div_self hdegree hn_pos.ne' + have heta_fixed (q : Q) : B.ρ q eta = eta := by + simp only [eta, map_nsmul, hxi_fixed] + have heta_kernel : wp.hom eta = 0 := by + simp only [eta, map_nsmul, hxi_kernel, smul_zero] + have heta_norm : B.norm.hom eta = 0 := by + have hnorm : B.norm.hom eta = d • eta := by + simp [Rep.norm, Representation.norm, d, heta_fixed] + rw [hnorm, ← heta_order] + exact addOrderOf_nsmul_eq_zero eta + obtain ⟨a, ha⟩ := + normKernel_le_sigmaMinusOneRange_of_tateHMinusOne_isZero + B g hg hzero eta heta_norm + have ha' : B.ρ g a = eta + a := by + exact eq_add_of_sub_eq ha + have hwp_g_fixed : B.ρ g (wp.hom a) = wp.hom a := by + apply sub_eq_zero.mp + calc + B.ρ g (wp.hom a) - wp.hom a = + wp.hom (B.ρ g a) - wp.hom a := by rw [Rep.hom_comm_apply] + _ = wp.hom (B.ρ g a - a) := by rw [map_sub] + _ = wp.hom eta := by rw [ha] + _ = 0 := heta_kernel + have hwp_fixed (q : Q) : B.ρ q (wp.hom a) = wp.hom a := by + let H := representationStabilizer B (wp.hom a) + have hg_mem : g ∈ H := hwp_g_fixed + exact (Subgroup.zpowers_le.mpr hg_mem) (hg q) + have horbit (i : ℕ) : B.ρ (g ^ i) a = i • eta + a := by + induction i with + | zero => simp + | succ i hi => + rw [pow_succ', map_mul] + change B.ρ g (B.ρ (g ^ i) a) = _ + rw [hi, map_add, map_nsmul, heta_fixed, ha'] + simp only [succ_nsmul] + abel + refine ⟨a, hwp_fixed, ?_⟩ + ext q + constructor + · intro hq + have hq_fixed : B.ρ q a = a := hq + obtain ⟨i, hi, _⟩ := IsCyclic.unique_zpow_zmod hg q + have hi_smul : i.val • eta = 0 := by + have := horbit i.val + rw [← hi, hq_fixed] at this + have hsub := congrArg (fun x : B.V => x - a) this + simpa using hsub.symm + have hd_dvd : d ∣ i.val := by + rw [← heta_order] + exact addOrderOf_dvd_iff_nsmul_eq_zero.mpr hi_smul + have hi_lt : i.val < d := i.val_lt + have hi_zero : i.val = 0 := + Nat.eq_zero_of_dvd_of_lt hd_dvd hi_lt + rw [hi, hi_zero, pow_zero] + exact Subgroup.mem_bot.mpr rfl + · intro hq + rw [Subgroup.mem_bot] at hq + subst q + exact Subgroup.one_mem _ + +/-- Finite-cyclic, single-radical frontier of finite abelian Kummer theory, the finite abelian +Kummer decomposition, +now obtained from `SatisfiesCyclicNormKernelVanishing` itself. + +Here `B` is the actual coefficient representation `A_L` attached to the +abstract cyclic extension. The operator is stated on `B`; constructing it +functorially from a global operator on `A`, and assembling cyclic +subextensions into the full abelian Kummer extension, are deliberately not +claimed in this theorem. -/ +theorem cyclicOperator_singleRadical_of_normKernelVanishing + {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + (A : Rep ℤ G) (hAxiom : SatisfiesCyclicNormKernelVanishing A) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup K L hLK).Normal] + [hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (g : K.toSubgroup ⧸ extensionSubgroup K L hLK) + (hg : ∀ q, q ∈ Subgroup.zpowers g) + (wp : extensionFixedRepresentation A K L hLK hnormal ⟶ + extensionFixedRepresentation A K L hLK hnormal) + (n : ℕ+) (xi : (extensionFixedRepresentation A K L hLK hnormal).V) + (hxi_order : addOrderOf xi = (n : ℕ)) + (hxi_kernel : wp.hom xi = 0) + (hxi_fixed : ∀ q : K.toSubgroup ⧸ extensionSubgroup K L hLK, + (extensionFixedRepresentation A K L hLK hnormal).ρ q xi = xi) + (hexponent : ∀ q : K.toSubgroup ⧸ extensionSubgroup K L hLK, + q ^ (n : ℕ) = 1) : + ∃ a : (extensionFixedRepresentation A K L hLK hnormal).V, + (∀ q : K.toSubgroup ⧸ extensionSubgroup K L hLK, + (extensionFixedRepresentation A K L hLK hnormal).ρ q (wp.hom a) = wp.hom a) ∧ + representationStabilizer (extensionFixedRepresentation A K L hLK hnormal) a = ⊥ := by + let : Fintype (K.toSubgroup ⧸ extensionSubgroup K L hLK) := + Fintype.ofFinite (K.toSubgroup ⧸ extensionSubgroup K L hLK) + have hzero : Limits.IsZero + (tateCohomology (extensionFixedRepresentation A K L hLK hnormal) (-1)) := + hAxiom K L hLK hnormal hfinite g hg + apply cyclic_single_radical_of_tateHMinusOne_isZero + (extensionFixedRepresentation A K L hLK hnormal) g hg hzero + wp n xi hxi_order hxi_kernel hxi_fixed hexponent + +end +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerDelta.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerDelta.lean new file mode 100644 index 0000000000..4899fe2de1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerDelta.lean @@ -0,0 +1,182 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerAbelianAssembly +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing + +/-! # Kummer Delta -/ + +@[expose] public section +namespace KummerTheory + +open CyclicCohomology + +/-! +# finite abelian Kummer theory, the finite abelian Kummer decomposition: the exact Delta + +For an equivariant additive operator `wp`, the construction defines +`Delta = wp(A_L) ∩ A_K`. Here fixed modules are represented as ambient +additive subgroups. The finite abelian assembly supplies finitely many +elements in `wp⁻¹(Delta)` generating `L`; the reverse fixing inclusion uses +the construction datum that the kernel of `wp` is generated by its distinguished +element `xi`. +-/ + +noncomputable +section + +variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + +/-- Ambient coefficient elements fixed pointwise by a closed abstract field +subgroup. -/ +def ambientFixedAddSubgroup (A : Rep ℤ G) (H : ClosedSubgroup G) : + AddSubgroup A.V := by + exact + { carrier := {a | ∀ h : H.toSubgroup, A.ρ h.1 a = a} + zero_mem' := by simp + add_mem' := by + intro a b ha hb h + rw [map_add, ha h, hb h] + neg_mem' := by + intro a ha h + rw [map_neg, ha h] } + +/-- Membership in the ambient fixed subgroup is equivalent to invariance under every +subgroup element. -/ +@[simp] +theorem mem_ambientFixedAddSubgroup_iff + (A : Rep ℤ G) (H : ClosedSubgroup G) (a : A.V) : + a ∈ ambientFixedAddSubgroup A H ↔ + ∀ h : H.toSubgroup, A.ρ h.1 a = a := + Iff.rfl + +/-- The `Delta = wp(A_L) ∩ A_K`, as an additive subgroup of the +ambient coefficient module. -/ +def kummerDeltaAddSubgroup + (A : Rep ℤ G) (wp : A ⟶ A) (K L : ClosedSubgroup G) : + AddSubgroup A.V := + (ambientFixedAddSubgroup A L).map + (AddMonoidHomClass.toAddMonoidHom wp.hom) ⊓ + ambientFixedAddSubgroup A K + +/-- The radical set `wp⁻¹(Delta)` in the additive abstract model. -/ +def kummerRadicalAddSubgroup + (A : Rep ℤ G) (wp : A ⟶ A) (K L : ClosedSubgroup G) : + AddSubgroup A.V := + (kummerDeltaAddSubgroup A wp K L).comap + (AddMonoidHomClass.toAddMonoidHom wp.hom) + +/-- The Kummer radical consists of fixed elements annihilated by the Kummer exponent. -/ +@[simp] +theorem mem_kummerRadicalAddSubgroup_iff + (A : Rep ℤ G) (wp : A ⟶ A) (K L : ClosedSubgroup G) (a : A.V) : + a ∈ kummerRadicalAddSubgroup A wp K L ↔ + wp.hom a ∈ kummerDeltaAddSubgroup A wp K L := + Iff.rfl + +/-- If `ker(wp)` is generated by the `G_K`-fixed element `xi`, every member +of `wp⁻¹(wp(A_L) ∩ A_K)` is fixed by `G_L`. Only the inclusion +`ker(wp) ≤ ℤ xi` is needed for this direction. -/ +theorem kummerRadical_fixed_of_ker_le_zmultiples + (A : Rep ℤ G) (wp : A ⟶ A) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + (xi : A.V) + (hxi_fixed : ∀ k : K.toSubgroup, A.ρ k.1 xi = xi) + (hker : AddMonoidHom.ker (AddMonoidHomClass.toAddMonoidHom wp.hom) ≤ + AddSubgroup.zmultiples xi) + {a : A.V} (ha : a ∈ kummerRadicalAddSubgroup A wp K L) + (l : L.toSubgroup) : + A.ρ l.1 a = a := by + have haDelta : wp.hom a ∈ kummerDeltaAddSubgroup A wp K L := ha + have haImage : wp.hom a ∈ + (ambientFixedAddSubgroup A L).map + (AddMonoidHomClass.toAddMonoidHom wp.hom) := + haDelta.1 + obtain ⟨b, hb_fixed, hba⟩ := haImage + have hba' : wp.hom b = wp.hom a := hba + have hd_ker : a - b ∈ + AddMonoidHom.ker (AddMonoidHomClass.toAddMonoidHom wp.hom) := by + rw [AddMonoidHom.mem_ker] + change wp.hom (a - b) = 0 + rw [map_sub, ← hba', sub_self] + obtain ⟨z, hz⟩ := AddSubgroup.mem_zmultiples_iff.mp (hker hd_ker) + have hd_fixed : A.ρ l.1 (a - b) = a - b := by + rw [← hz, map_zsmul, hxi_fixed ⟨l, hLK l.property⟩] + have hb : A.ρ l.1 b = b := + (mem_ambientFixedAddSubgroup_iff A L b).1 hb_fixed l + calc + A.ρ l.1 a = A.ρ l.1 ((a - b) + b) := by rw [sub_add_cancel] + _ = A.ρ l.1 (a - b) + A.ρ l.1 b := by rw [map_add] + _ = (a - b) + b := by rw [hd_fixed, hb] + _ = a := sub_add_cancel a b + +/-- Exact finite-abelian Delta endpoint of the finite abelian Kummer decomposition: +`L = K(wp⁻¹(wp(A_L) ∩ A_K))`. + +The cyclic factors, their radical generators, and the inclusion of those +generators in `wp⁻¹(Delta)` are constructed in the proof. The only +additional operator datum beyond the finite assembly is the kernel +generation condition. -/ +theorem finiteAbelian_kummerRadical_fixingSubgroup_eq + [IsTopologicalGroup G] + (A : Rep ℤ G) (hAxiom : SatisfiesCyclicNormKernelVanishing A) + (hcontinuous : IsContinuousDiscreteRepresentation A) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup (G := G) K L hLK).Normal] + [hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK)] + [IsMulCommutative + (K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK)] + (wp : A ⟶ A) (n : ℕ+) (xi : A.V) + (hxi_order : addOrderOf xi = (n : ℕ)) + (hxi_kernel : wp.hom xi = 0) + (hxi_fixed : ∀ k : K.toSubgroup, A.ρ k.1 xi = xi) + (hker : AddMonoidHom.ker (AddMonoidHomClass.toAddMonoidHom wp.hom) ≤ + AddSubgroup.zmultiples xi) + (hexponent : + ∀ q : K.toSubgroup ⧸ extensionSubgroup (G := G) K L hLK, + q ^ (n : ℕ) = 1) : + closedSetFixingSubgroup A hcontinuous K + (kummerRadicalAddSubgroup A wp K L : Set A.V) = L := by + obtain ⟨S, _hSfinite, hwp_fixed, hgenerate⟩ := + finiteAbelian_globalOperator_generators + A hAxiom hcontinuous K L hLK wp n xi hxi_order hxi_kernel hxi_fixed + hexponent + have hSpreimage : S ⊆ (kummerRadicalAddSubgroup A wp K L : Set A.V) := by + intro a ha + change a ∈ kummerRadicalAddSubgroup A wp K L + apply (mem_kummerRadicalAddSubgroup_iff A wp K L a).2 + constructor + · refine ⟨a, ?_, rfl⟩ + rw [← hgenerate] + intro l + exact (mem_closedSetFixingSubgroup_iff A hcontinuous K S l.1).1 + l.property |>.2 a ha + · exact hwp_fixed a ha + ext sigma + change sigma ∈ closedSetFixingSubgroup A hcontinuous K + (kummerRadicalAddSubgroup A wp K L : Set A.V) ↔ sigma ∈ L + constructor + · intro hsigma + have hdata := + (mem_closedSetFixingSubgroup_iff A hcontinuous K + (kummerRadicalAddSubgroup A wp K L : Set A.V) sigma).1 hsigma + have hsigmaS : sigma ∈ closedSetFixingSubgroup A hcontinuous K S := + (mem_closedSetFixingSubgroup_iff A hcontinuous K S sigma).2 + ⟨hdata.1, fun a ha => hdata.2 a (hSpreimage ha)⟩ + rwa [hgenerate] at hsigmaS + · intro hsigmaL + apply (mem_closedSetFixingSubgroup_iff A hcontinuous K + (kummerRadicalAddSubgroup A wp K L : Set A.V) sigma).2 + refine ⟨hLK hsigmaL, ?_⟩ + intro a ha + exact kummerRadical_fixed_of_ker_le_zmultiples + A wp K L hLK xi hxi_fixed hker ha ⟨sigma, hsigmaL⟩ + +end +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerFixedField.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerFixedField.lean new file mode 100644 index 0000000000..0b9210b769 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerFixedField.lean @@ -0,0 +1,111 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing + +/-! # Kummer Fixed Field -/ + +@[expose] public section +namespace KummerTheory + +open CyclicCohomology + +/-! +# finite abelian Kummer theory: the abstract field `K(S)` + +in this construction, for a subset `S` of the coefficient module, `K(S)` is the +abstract field whose subgroup consists of the elements of `G_K` fixing every +member of `S`. This file constructs that subgroup and proves that it is +closed. Closedness follows directly from continuity of each orbit map and +the discrete topology on the coefficient module. +-/ + +noncomputable +section + +/-- The subgroup of `G_K` fixing every element of `S`, viewed as a subgroup +of the ambient abstract Galois group `G`. -/ +def setFixingSubgroup + {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + (A : Rep ℤ G) (K : ClosedSubgroup G) (S : Set A.V) : Subgroup G := by + letI : Module ℤ A.V := A.hV2 + exact + { carrier := {σ | σ ∈ K ∧ ∀ a, a ∈ S → A.ρ σ a = a} + one_mem' := by + refine ⟨K.one_mem, ?_⟩ + intro a _ha + exact congrArg (fun f : Module.End ℤ A.V => f a) (map_one A.ρ) + mul_mem' := by + intro σ τ hσ hτ + refine ⟨K.mul_mem hσ.1 hτ.1, ?_⟩ + intro a ha + rw [map_mul] + change A.ρ σ (A.ρ τ a) = a + rw [hτ.2 a ha, hσ.2 a ha] + inv_mem' := by + intro σ hσ + refine ⟨K.inv_mem hσ.1, ?_⟩ + intro a ha + calc + A.ρ σ⁻¹ a = A.ρ σ⁻¹ (A.ρ σ a) := + congrArg (A.ρ σ⁻¹) (hσ.2 a ha).symm + _ = a := Representation.inv_self_apply A.ρ σ a } + +/-- For a continuous discrete representation, the stabilizer of one +coefficient element is closed. -/ +theorem isClosed_setOf_representation_fixed + {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + (A : Rep ℤ G) (hcontinuous : IsContinuousDiscreteRepresentation A) + (a : A.V) : IsClosed {σ : G | A.ρ σ a = a} := by + let : TopologicalSpace A.V := ⊥ + let : DiscreteTopology A.V := discreteTopology_bot A.V + have horbit : Continuous (fun σ : G => A.ρ σ a) := + hcontinuous.comp (continuous_id.prodMk continuous_const) + have hsingleton : IsClosed ({a} : Set A.V) := isClosed_discrete {a} + change IsClosed ((fun σ : G => A.ρ σ a) ⁻¹' ({a} : Set A.V)) + exact hsingleton.preimage horbit + +/-- The subgroup defining `K(S)` is closed. -/ +theorem setFixingSubgroup_isClosed + {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + (A : Rep ℤ G) (hcontinuous : IsContinuousDiscreteRepresentation A) + (K : ClosedSubgroup G) (S : Set A.V) : + IsClosed (setFixingSubgroup A K S : Set G) := by + change IsClosed ((K : Set G) ∩ {σ : G | ∀ a, a ∈ S → A.ρ σ a = a}) + apply K.isClosed'.inter + have hset : {σ : G | ∀ a, a ∈ S → A.ρ σ a = a} = + ⋂ a : S, {σ : G | A.ρ σ a.1 = a.1} := by + ext σ + simp only [Set.mem_ofPred_eq, Set.mem_iInter, Subtype.forall] + rw [hset] + exact isClosed_iInter fun a => + isClosed_setOf_representation_fixed A hcontinuous a.1 + +/-- The closed subgroup representing the abstract field `K(S)`. +Its underlying subgroup is exactly the elements of `G_K` which fix `S` +pointwise. -/ +def closedSetFixingSubgroup + {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + (A : Rep ℤ G) (hcontinuous : IsContinuousDiscreteRepresentation A) + (K : ClosedSubgroup G) (S : Set A.V) : ClosedSubgroup G := + ⟨setFixingSubgroup A K S, setFixingSubgroup_isClosed A hcontinuous K S⟩ + +/-- An automorphism lies in the fixing subgroup exactly when it fixes every element +of the closed set. -/ +@[simp] +theorem mem_closedSetFixingSubgroup_iff + {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + (A : Rep ℤ G) (hcontinuous : IsContinuousDiscreteRepresentation A) + (K : ClosedSubgroup G) (S : Set A.V) (σ : G) : + σ ∈ closedSetFixingSubgroup A hcontinuous K S ↔ + σ ∈ K ∧ ∀ a, a ∈ S → A.ρ σ a = a := + Iff.rfl + +end +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerGlobalOperator.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerGlobalOperator.lean new file mode 100644 index 0000000000..cfd48a8ac4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerGlobalOperator.lean @@ -0,0 +1,169 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerCyclicOperator + +/-! # Kummer Global Operator -/ + +@[expose] public section +namespace KummerTheory + +open CyclicCohomology + +/-! +# finite abelian Kummer theory, the finite abelian Kummer decomposition: descending the global + operator + +This file constructs, rather than assumes, the endomorphism of `A_L` induced +by a global equivariant endomorphism `wp : A ⟶ A`. It also embeds a +`G_K`-fixed global kernel element into the invariant subtype defining `A_L` +and supplies these constructions to the finite cyclic single-radical theorem. + +The result remains only the finite cyclic step of the finite abelian Kummer decomposition, not the +full abelian Kummer correspondence. +-/ + +noncomputable +section + +open CategoryTheory + +/-- The endomorphism of `A_L` induced functorially by a global equivariant +endomorphism `wp : A ⟶ A`: first restrict to `G_K`, then pass to the +`G_L`-invariants and the quotient action. -/ +noncomputable def extensionFixedEndomorphism + {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup K L hLK).Normal] + (wp : A ⟶ A) : + extensionFixedRepresentation A K L hLK hnormal ⟶ + extensionFixedRepresentation A K L hLK hnormal := + (Rep.quotientToInvariantsFunctor (k := ℤ) (extensionSubgroup K L hLK)).map + ((Rep.resFunctor K.toSubgroup.subtype).map wp) + +/-- A global element fixed by `G_K`, viewed in the invariant subtype which +is the carrier of `A_L`. -/ +noncomputable def extensionFixedKernelElement + {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup K L hLK).Normal] + (xi : A.V) (hxi_fixed : ∀ k : K.toSubgroup, A.ρ k.1 xi = xi) : + (extensionFixedRepresentation A K L hLK hnormal).V := + ⟨xi, by + intro s + change A.ρ s.1.1 xi = xi + exact hxi_fixed s.1⟩ + +/-- The underlying value of the fixed kernel element is the selected global kernel element. -/ +@[simp] +theorem extensionFixedKernelElement_val + {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup K L hLK).Normal] + (xi : A.V) (hxi_fixed : ∀ k : K.toSubgroup, A.ρ k.1 xi = xi) : + (extensionFixedKernelElement A K L hLK xi hxi_fixed).1 = xi := rfl + +/-- The extension-fixed endomorphism acts on underlying values by the global operator. -/ +@[simp] +theorem extensionFixedEndomorphism_apply_val + {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup K L hLK).Normal] + (wp : A ⟶ A) (x : (extensionFixedRepresentation A K L hLK hnormal).V) : + ((extensionFixedEndomorphism A K L hLK wp).hom x).1 = wp.hom x.1 := by + rfl + +/-- The additive order of the fixed kernel element is inherited from its ambient value. -/ +theorem extensionFixedKernelElement_addOrderOf + {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup K L hLK).Normal] + (xi : A.V) (hxi_fixed : ∀ k : K.toSubgroup, A.ρ k.1 xi = xi) : + addOrderOf (extensionFixedKernelElement A K L hLK xi hxi_fixed) = addOrderOf xi := by + let incl : (extensionFixedRepresentation A K L hLK hnormal).V →+ A.V := + { toFun := fun x => x.1 + map_zero' := rfl + map_add' := fun _ _ => rfl } + calc + addOrderOf (extensionFixedKernelElement A K L hLK xi hxi_fixed) = + addOrderOf (incl (extensionFixedKernelElement A K L hLK xi hxi_fixed)) := + (addOrderOf_injective incl (fun _ _ h => Subtype.ext h) + (extensionFixedKernelElement A K L hLK xi hxi_fixed)).symm + _ = addOrderOf xi := by rfl + +/-- The selected fixed element lies in the kernel of the extension-fixed endomorphism. -/ +theorem extensionFixedKernelElement_in_kernel + {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup K L hLK).Normal] + (wp : A ⟶ A) (xi : A.V) + (hxi_fixed : ∀ k : K.toSubgroup, A.ρ k.1 xi = xi) + (hxi_kernel : wp.hom xi = 0) : + (extensionFixedEndomorphism A K L hLK wp).hom + (extensionFixedKernelElement A K L hLK xi hxi_fixed) = 0 := by + apply Subtype.ext + change wp.hom xi = 0 + exact hxi_kernel + +/-- Every element of the extension subgroup fixes the selected kernel element. -/ +theorem extensionFixedKernelElement_fixed + {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + (A : Rep ℤ G) (K L : ClosedSubgroup G) + (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup K L hLK).Normal] + (xi : A.V) (hxi_fixed : ∀ k : K.toSubgroup, A.ρ k.1 xi = xi) + (q : K.toSubgroup ⧸ extensionSubgroup K L hLK) : + (extensionFixedRepresentation A K L hLK hnormal).ρ q + (extensionFixedKernelElement A K L hLK xi hxi_fixed) = + extensionFixedKernelElement A K L hLK xi hxi_fixed := by + refine QuotientGroup.induction_on q ?_ + intro k + apply Subtype.ext + exact hxi_fixed k + +/-- The finite cyclic single-radical step with a genuinely global operator. +The endomorphism on `A_L` and its distinguished kernel element are both +constructed in the proof, not supplied as hypotheses. -/ +theorem cyclicGlobalOperator_singleRadical + {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] + (A : Rep ℤ G) (hAxiom : SatisfiesCyclicNormKernelVanishing A) + (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) + [hnormal : (extensionSubgroup K L hLK).Normal] + [hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] + (g : K.toSubgroup ⧸ extensionSubgroup K L hLK) + (hg : ∀ q, q ∈ Subgroup.zpowers g) + (wp : A ⟶ A) (n : ℕ+) (xi : A.V) + (hxi_order : addOrderOf xi = (n : ℕ)) + (hxi_kernel : wp.hom xi = 0) + (hxi_fixed : ∀ k : K.toSubgroup, A.ρ k.1 xi = xi) + (hexponent : ∀ q : K.toSubgroup ⧸ extensionSubgroup K L hLK, + q ^ (n : ℕ) = 1) : + ∃ a : (extensionFixedRepresentation A K L hLK hnormal).V, + (∀ q : K.toSubgroup ⧸ extensionSubgroup K L hLK, + (extensionFixedRepresentation A K L hLK hnormal).ρ q + ((extensionFixedEndomorphism A K L hLK wp).hom a) = + (extensionFixedEndomorphism A K L hLK wp).hom a) ∧ + representationStabilizer (extensionFixedRepresentation A K L hLK hnormal) a = ⊥ := by + let xiL := extensionFixedKernelElement A K L hLK xi hxi_fixed + apply cyclicOperator_singleRadical_of_normKernelVanishing + A hAxiom K L hLK g hg (extensionFixedEndomorphism A K L hLK wp) + n xiL + · simpa [xiL, extensionFixedKernelElement_addOrderOf] using hxi_order + · exact extensionFixedKernelElement_in_kernel + A K L hLK wp xi hxi_fixed hxi_kernel + · exact extensionFixedKernelElement_fixed A K L hLK xi hxi_fixed + · exact hexponent + +end +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete.lean new file mode 100644 index 0000000000..a277f63f96 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete.lean @@ -0,0 +1,33 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.CyclotomicField +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.ExtensionRoundTrip +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteCharacterEquiv +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteDualSeparation +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteSupport +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.GaloisCohomology +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteContinuity +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteGeneration +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteInverse +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.KummerCorrespondenceFormula +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalMaximalKummerExtension +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalUnitKummerUnramified +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.MaximalKummerSubgroup +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalExtension +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalQuotient +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RestrictedFinite +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RootCharacters +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SUnitPreparation +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtensionNorm + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic.lean new file mode 100644 index 0000000000..5cc5925c3f --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacter +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacterEquiv +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicField +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicTorsionField + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition.lean new file mode 100644 index 0000000000..0db15d0f5a --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition.lean @@ -0,0 +1,23 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Basic +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.CyclotomicQuotient +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Decomposition +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.DenseTorsion +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteFree +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteOrder +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FreeCoordinate +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Gather +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Local +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Swap +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientEquiv +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientMk + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Basic.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Basic.lean new file mode 100644 index 0000000000..fe559bbb2e --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Basic.lean @@ -0,0 +1,98 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.CyclotomicTorsionQuotient +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.UnitDecomposition +public import Mathlib.GroupTheory.Torsion +/-! +# Basic topological product equivalences for profinite units + +This module contains the reusable, inexpensive product equivalences used by +the compiled stages of the profinite-unit decomposition. +-/ + +@[expose] public section + +open scoped Topology + +noncomputable +section + +namespace KummerTheory + +open ClassFormation +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.Padic + +namespace ProfiniteUnitDecomposition.Internal + +/-- The prime certificate shared by every compiled stage of the profinite +unit decomposition. -/ +instance primeFact (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +end ProfiniteUnitDecomposition.Internal + +/-- Coordinatewise product of topological multiplicative equivalences. -/ +noncomputable def continuousMulEquivPiCongr + {ι : Type*} {A B : ι → Type*} + [(i : ι) → TopologicalSpace (A i)] + [(i : ι) → TopologicalSpace (B i)] + [(i : ι) → Mul (A i)] [(i : ι) → Mul (B i)] + (e : (i : ι) → A i ≃ₜ* B i) : + ((i : ι) → A i) ≃ₜ* ((i : ι) → B i) := + { MulEquiv.piCongrRight fun i => (e i).toMulEquiv with + continuous_toFun := + continuous_pi fun i => + (e i).continuous_toFun.comp (continuous_apply i) + continuous_invFun := + continuous_pi fun i => + (e i).continuous_invFun.comp (continuous_apply i) } + +/-- A product of pairs is topologically equivalent to the pair of products. -/ +noncomputable def continuousMulEquivPiProd + {ι : Type*} (A B : ι → Type*) + [(i : ι) → TopologicalSpace (A i)] + [(i : ι) → TopologicalSpace (B i)] + [(i : ι) → Mul (A i)] [(i : ι) → Mul (B i)] : + ((i : ι) → A i × B i) ≃ₜ* + ((i : ι) → A i) × ((i : ι) → B i) where + toFun x := (fun i => (x i).1, fun i => (x i).2) + invFun x i := (x.1 i, x.2 i) + left_inv _ := rfl + right_inv _ := rfl + map_mul' _ _ := rfl + continuous_toFun := + (continuous_pi fun i => + continuous_fst.comp (continuous_apply i)).prodMk + (continuous_pi fun i => + continuous_snd.comp (continuous_apply i)) + continuous_invFun := + continuous_pi fun i => + ((continuous_apply i).comp continuous_fst).prodMk + ((continuous_apply i).comp continuous_snd) + +/-- Multiplicative tagging commutes with topological products. -/ +noncomputable def continuousPiMultiplicative + {ι : Type*} (A : ι → Type*) + [(i : ι) → TopologicalSpace (A i)] + [(i : ι) → Add (A i)] : + Multiplicative ((i : ι) → A i) ≃ₜ* + ((i : ι) → Multiplicative (A i)) := + { MulEquiv.piMultiplicative A with + continuous_toFun := + continuous_pi fun i => continuous_apply i + continuous_invFun := + continuous_pi fun i => continuous_apply i } + +/-- The product of all finite factors in the local unit decompositions. -/ +noncomputable abbrev CyclotomicFinitePart := + (p : Nat.Primes) → padicUnitFiniteFactor p.1 + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/CyclotomicQuotient.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/CyclotomicQuotient.lean new file mode 100644 index 0000000000..652eb5dd62 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/CyclotomicQuotient.lean @@ -0,0 +1,35 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientMk +/-! +# The cyclotomic profinite-unit torsion quotient +-/ + +@[expose] public section + +open scoped Topology + +noncomputable +section + +namespace KummerTheory + +open ClassFormation + +/-- Cyclotomic-character form of the torsion decomposition: quotienting `ℤ̂ˣ` by +the closure of its torsion subgroup leaves one copy of `ℤ̂`. -/ +noncomputable def zHatUnitsTorsionQuotientEquiv : + ZHatˣ ⧸ (CommGroup.torsion ZHatˣ).topologicalClosure ≃ₜ* + Multiplicative ZHat := + torsionQuotientEquivOfZHatMulDecomposition + ZHatˣ CyclotomicFinitePart + zHatUnitsDecomposition + dense_torsion_cyclotomicFinitePart + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Decomposition.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Decomposition.lean new file mode 100644 index 0000000000..ea4553a92f --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Decomposition.lean @@ -0,0 +1,38 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Gather +/-! +# The profinite-unit product decomposition +-/ + +@[expose] public section + +open scoped Topology + +noncomputable +section + +namespace KummerTheory + +open ClassFormation +open LocalFieldTheory.Padic + +/-- Topological decomposition +`ℤ̂ˣ ≃ Multiplicative ℤ̂ × finite-product` used in the rational cyclotomic +calculation. -/ +noncomputable def zHatUnitsDecomposition : + ZHatˣ ≃ₜ* Multiplicative ZHat × CyclotomicFinitePart := + zHatUnitsContinuousMulEquivPrimeProduct.trans <| + ProfiniteUnitDecomposition.Internal.localDecomposition.symm.trans <| + ProfiniteUnitDecomposition.Internal.finiteFreeSplit.trans <| + continuousMulEquivProdCongr + ProfiniteUnitDecomposition.Internal.gatherFree + (ContinuousMulEquiv.refl CyclotomicFinitePart) + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/DenseTorsion.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/DenseTorsion.lean new file mode 100644 index 0000000000..b9d911f4b8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/DenseTorsion.lean @@ -0,0 +1,73 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Decomposition +/-! +# Density of torsion in the finite profinite-unit factor +-/ + +@[expose] public section + +open scoped Topology + +noncomputable +section + +namespace KummerTheory + +open LocalFieldTheory.Padic + +/-- The torsion elements are dense in an arbitrary product of finite +commutative groups. -/ +theorem dense_torsion_pi_of_finite + {ι : Type*} (G : ι → Type*) + [(i : ι) → CommGroup (G i)] + [(i : ι) → TopologicalSpace (G i)] + [(i : ι) → Finite (G i)] : + Dense + (CommGroup.torsion ((i : ι) → G i) : + Set ((i : ι) → G i)) := by + classical + apply dense_iff_inter_open.mpr + rintro U hU ⟨x, hx⟩ + obtain ⟨S, u, hu, hSu⟩ := + isOpen_pi_iff.mp hU x hx + let y : (i : ι) → G i := + fun i => if hi : i ∈ S then x i else 1 + refine ⟨y, hSu ?_, ?_⟩ + · intro i hi + have hiS : i ∈ S := hi + change (if _ : i ∈ S then x i else 1) ∈ u i + simp only [hiS, ↓reduceDIte] + exact (hu i hi).2 + · change IsOfFinOrder y + let N := ∏ i ∈ S, orderOf (x i) + have hN : 0 < N := by + dsimp only [N] + exact Finset.prod_pos fun i _ => orderOf_pos (x i) + apply isOfFinOrder_iff_pow_eq_one.mpr + refine ⟨N, hN, ?_⟩ + funext i + by_cases hi : i ∈ S + · rw [Pi.pow_apply] + dsimp only [y] + rw [dite_eq_left hi] + exact orderOf_dvd_iff_pow_eq_one.mp + (Finset.dvd_prod_of_mem + (fun j => orderOf (x j)) hi) + · simp [y, hi] + +/-- The torsion subgroup of the finite cyclotomic factor is dense. -/ +theorem dense_torsion_cyclotomicFinitePart : + Dense + (CommGroup.torsion CyclotomicFinitePart : + Set CyclotomicFinitePart) := + dense_torsion_pi_of_finite + (fun p : Nat.Primes => padicUnitFiniteFactor p.1) + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteFree.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteFree.lean new file mode 100644 index 0000000000..7a669d594e --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteFree.lean @@ -0,0 +1,46 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Local +/-! +# Compiled finite/free collection stage of the profinite-unit decomposition +-/ + +@[expose] public section + +open scoped Topology + +noncomputable +section + +namespace KummerTheory.ProfiniteUnitDecomposition.Internal + +open LocalFieldTheory.Padic + +/-- Collect the finite and torsion-free coordinates of the local product. -/ +noncomputable def finiteFreeSplit : + ((p : Nat.Primes) → + padicUnitFiniteFactor p.1 × Multiplicative ℤ_[p.1]) ≃ₜ* + ((p : Nat.Primes) → Multiplicative ℤ_[p.1]) × + CyclotomicFinitePart where + toFun x := (fun p => (x p).2, fun p => (x p).1) + invFun x p := (x.2 p, x.1 p) + left_inv _ := rfl + right_inv _ := rfl + map_mul' _ _ := rfl + continuous_toFun := + (continuous_pi fun p => + continuous_snd.comp (continuous_apply p)).prodMk + (continuous_pi fun p => + continuous_fst.comp (continuous_apply p)) + continuous_invFun := + continuous_pi fun p => + ((continuous_apply p).comp continuous_snd).prodMk + ((continuous_apply p).comp continuous_fst) + +end KummerTheory.ProfiniteUnitDecomposition.Internal diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteOrder.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteOrder.lean new file mode 100644 index 0000000000..a6c568658b --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteOrder.lean @@ -0,0 +1,71 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FreeCoordinate +/-! +# Finite-order local coordinates of profinite units +-/ + +@[expose] public section + +open scoped Topology + +noncomputable +section + +namespace KummerTheory + +open ClassFormation +open LocalFieldTheory.Padic + +/-- If the free `p`-adic coordinate of a profinite unit vanishes, its +actual `p`-adic unit coordinate has finite order. -/ +theorem zHatUnit_padicCoordinate_isOfFinOrder_of_freeCoordinate_eq_zero + (u : ZHatˣ) (p : Nat.Primes) + (hfree : + zHatToPadicInt p + (Multiplicative.toAdd + (zHatUnitsDecomposition u).1) = 0) : + IsOfFinOrder + (zHatUnitsContinuousMulEquivPrimeProduct u p) := by + let a := + ((padicUnitDecomposition p.1).symm + (zHatUnitsContinuousMulEquivPrimeProduct u p)).1 + have hsecond : + ((padicUnitDecomposition p.1).symm + (zHatUnitsContinuousMulEquivPrimeProduct u p)).2 = 1 := by + apply Multiplicative.ext + simpa using + (zHatUnitsDecomposition_freeCoordinate u p).symm.trans hfree + have hpair : + IsOfFinOrder + (a, (1 : Multiplicative ℤ_[p.1])) := by + apply isOfFinOrder_iff_pow_eq_one.mpr + refine ⟨orderOf a, orderOf_pos a, ?_⟩ + ext + · exact pow_orderOf_eq_one a + · simp + have hsource : + (a, (1 : Multiplicative ℤ_[p.1])) = + (padicUnitDecomposition p.1).symm + (zHatUnitsContinuousMulEquivPrimeProduct u p) := by + apply Prod.ext + · rfl + · exact hsecond.symm + have himage : + IsOfFinOrder + (padicUnitDecomposition p.1 + (a, (1 : Multiplicative ℤ_[p.1]))) := + (Function.Injective.isOfFinOrder_iff + (f := (padicUnitDecomposition p.1).toMonoidHom) + (padicUnitDecomposition p.1).injective).2 hpair + rw [hsource, + (padicUnitDecomposition p.1).apply_symm_apply] at himage + exact himage + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FreeCoordinate.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FreeCoordinate.lean new file mode 100644 index 0000000000..964440d0e4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FreeCoordinate.lean @@ -0,0 +1,51 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.CyclotomicQuotient +/-! +# Local coordinates of the profinite-unit decomposition +-/ + +@[expose] public section + +open scoped Topology + +noncomputable +section + +namespace KummerTheory + +open ClassFormation +open LocalFieldTheory.Padic + +/-- The `p`-adic coordinate of the global free factor in +`zHatUnitsDecomposition` is exactly the free factor in the genuine +local decomposition of the `p`-adic unit coordinate. -/ +@[simp] +theorem zHatUnitsDecomposition_freeCoordinate + (u : ZHatˣ) (p : Nat.Primes) : + zHatToPadicInt p + (Multiplicative.toAdd + (zHatUnitsDecomposition u).1) = + Multiplicative.toAdd + (((padicUnitDecomposition p.1).symm + (zHatUnitsContinuousMulEquivPrimeProduct u p)).2) := by + let y : ProfiniteIntegerPrimeProduct := + fun q => + Multiplicative.toAdd + (((padicUnitDecomposition q.1).symm + (zHatUnitsContinuousMulEquivPrimeProduct u q)).2) + change + zHatToPadicInt p + (zHatContinuousAddEquivPrimeProduct.symm y) = + y p + exact + congrFun + (zHatContinuousAddEquivPrimeProduct.apply_symm_apply y) p + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Gather.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Gather.lean new file mode 100644 index 0000000000..faf9f4f4d6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Gather.lean @@ -0,0 +1,35 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteFree +/-! +# Compiled free-coordinate gathering stage of the profinite-unit decomposition +-/ + +@[expose] public section + +open scoped Topology + +noncomputable +section + +namespace KummerTheory.ProfiniteUnitDecomposition.Internal + +open ClassFormation +open LocalFieldTheory.Padic + +/-- Reassemble the family of local additive coordinates into `ℤ̂`. -/ +noncomputable def gatherFree : + ((p : Nat.Primes) → Multiplicative ℤ_[p.1]) ≃ₜ* + Multiplicative ZHat := + (continuousPiMultiplicative + (fun p : Nat.Primes => ℤ_[p.1])).symm.trans + (continuousMultiplicativeEquivOfAddEquiv + zHatContinuousAddEquivPrimeProduct).symm + +end KummerTheory.ProfiniteUnitDecomposition.Internal diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Local.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Local.lean new file mode 100644 index 0000000000..6af81025b5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Local.lean @@ -0,0 +1,34 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Basic +/-! +# Compiled local stage of the profinite-unit decomposition +-/ + +@[expose] public section + +open scoped Topology + +noncomputable +section + +namespace KummerTheory.ProfiniteUnitDecomposition.Internal + +open LocalFieldTheory.Padic + +/-- The product of the local finite/free decompositions, compiled separately +from the global coordinate-reassembly stages. -/ +noncomputable def localDecomposition : + ((p : Nat.Primes) → + padicUnitFiniteFactor p.1 × Multiplicative ℤ_[p.1]) ≃ₜ* + ((p : Nat.Primes) → ℤ_[p.1]ˣ) := + continuousMulEquivPiCongr fun p => + padicUnitDecomposition p.1 + +end KummerTheory.ProfiniteUnitDecomposition.Internal diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Swap.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Swap.lean new file mode 100644 index 0000000000..5b6b3b7caa --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Swap.lean @@ -0,0 +1,37 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Gather +/-! +# Compiled final swap stage of the profinite-unit decomposition +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + continuousMulEquivProdComm → + continuousMulEquivProdComm + + +open scoped Topology + +noncomputable +section + +namespace KummerTheory.ProfiniteUnitDecomposition.Internal + +open ClassFormation + +/-- Swap the collected free and finite coordinates. -/ +noncomputable def freeFiniteSwap : + CyclotomicFinitePart × Multiplicative ZHat ≃ₜ* + Multiplicative ZHat × CyclotomicFinitePart := + continuousMulEquivProdComm + CyclotomicFinitePart (Multiplicative ZHat) + +end KummerTheory.ProfiniteUnitDecomposition.Internal diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientEquiv.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientEquiv.lean new file mode 100644 index 0000000000..7e63294e1a --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientEquiv.lean @@ -0,0 +1,117 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.DenseTorsion +/-! +# Torsion quotients of a profinite-integer product decomposition +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + continuousMulEquivOfCompactToT2 → + continuousMulEquivOfCompactToT2 + + +open scoped Topology + +noncomputable +section + +namespace KummerTheory + +open ClassFormation + +/-- A topological decomposition `G ≃ ℤ̂ × T` with dense torsion in `T` +identifies the quotient of `G` by the closure of its torsion with `ℤ̂`. -/ +noncomputable def torsionQuotientEquivOfZHatMulDecomposition + (G T : Type*) [CommGroup G] [CommGroup T] + [TopologicalSpace G] [TopologicalSpace T] + [IsTopologicalGroup G] [IsTopologicalGroup T] + [CompactSpace G] + (E : G ≃ₜ* Multiplicative ZHat × T) + (hT : Dense (CommGroup.torsion T : Set T)) : + G ⧸ (CommGroup.torsion G).topologicalClosure ≃ₜ* + Multiplicative ZHat := by + let fstHom : + Multiplicative ZHat × T →* + Multiplicative ZHat := + MonoidHom.fst _ _ + let freePart : G →* Multiplicative ZHat := + fstHom.comp E.toMonoidHom + have hpreTorsion : + E ⁻¹' + (CommGroup.torsion + (Multiplicative ZHat × T) : + Set (Multiplicative ZHat × T)) = + (CommGroup.torsion G : Set G) := by + ext x + change IsOfFinOrder (E x) ↔ IsOfFinOrder x + exact Function.Injective.isOfFinOrder_iff + (f := E.toMonoidHom) E.injective + have hpreClosure : + E ⁻¹' + closure + (CommGroup.torsion + (Multiplicative ZHat × T) : + Set (Multiplicative ZHat × T)) = + closure (CommGroup.torsion G : Set G) := by + calc + E ⁻¹' + closure + (CommGroup.torsion + (Multiplicative ZHat × T) : + Set (Multiplicative ZHat × T)) = + closure + (E ⁻¹' + (CommGroup.torsion + (Multiplicative ZHat × T) : + Set (Multiplicative ZHat × T))) := + E.toHomeomorph.preimage_closure _ + _ = closure (CommGroup.torsion G : Set G) := by + rw [hpreTorsion] + have hkerFst : + fstHom.ker = + (CommGroup.torsion + (Multiplicative ZHat × T)).topologicalClosure := by + rw [ClassFormation.topologicalClosure_torsion_zHatMul_prod T hT] + ext x + rcases x with ⟨x, y⟩ + change x = 1 ↔ + x ∈ (⊥ : Subgroup (Multiplicative ZHat)) ∧ + y ∈ (⊤ : Subgroup T) + simp + have hker : + freePart.ker = + (CommGroup.torsion G).topologicalClosure := by + ext x + change fstHom (E x) = 1 ↔ + x ∈ closure (CommGroup.torsion G : Set G) + rw [← MonoidHom.mem_ker, hkerFst] + exact Set.ext_iff.mp hpreClosure x + have hsurj : Function.Surjective freePart := by + intro z + refine ⟨E.symm (z, 1), ?_⟩ + change fstHom (E (E.symm (z, 1))) = z + rw [E.apply_symm_apply] + rfl + let e : + G ⧸ (CommGroup.torsion G).topologicalClosure ≃* + Multiplicative ZHat := + (QuotientGroup.quotientMulEquivOfEq hker.symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + freePart hsurj) + exact + continuousMulEquivOfCompactToT2 + e + (by + rw [← + QuotientGroup.isOpenQuotientMap_mk.continuous_comp_iff] + exact continuous_fst.comp E.continuous_toFun) + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientMk.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientMk.lean new file mode 100644 index 0000000000..5cf023644f --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientMk.lean @@ -0,0 +1,44 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientEquiv +/-! +# Evaluation of the torsion-quotient equivalence +-/ + +@[expose] public section + +open scoped Topology + +noncomputable +section + +namespace KummerTheory + +open ClassFormation + +/-- The torsion-quotient equivalence evaluates a quotient class by +taking the genuine torsion-free coordinate of the chosen product +decomposition. This is the commuting square needed to pass between an +actual cyclotomic character and the `ZHat`-coordinate of its torsion +fixed field. -/ +@[simp] +theorem torsionQuotientEquivOfZHatMulDecomposition_mk + (G T : Type*) [CommGroup G] [CommGroup T] + [TopologicalSpace G] [TopologicalSpace T] + [IsTopologicalGroup G] [IsTopologicalGroup T] + [CompactSpace G] + (E : G ≃ₜ* Multiplicative ZHat × T) + (hT : Dense (CommGroup.torsion T : Set T)) + (g : G) : + torsionQuotientEquivOfZHatMulDecomposition + G T E hT (QuotientGroup.mk g) = + (E g).1 := by + rfl + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacter.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacter.lean new file mode 100644 index 0000000000..7e54e93d1b --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacter.lean @@ -0,0 +1,175 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicField +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerUnits +public import Mathlib.NumberTheory.Cyclotomic.CyclotomicCharacter +public import Mathlib.NumberTheory.NumberField.Cyclotomic.Galois +/-! +# The cyclotomic character of the rational cyclotomic field + +This file assembles mathlib's `p`-adic cyclotomic characters of the +actual extension `rationalCyclotomicField / ℚ`. Their product takes +values in the canonical product of the local unit groups, and the +topological Chinese-remainder equivalence identifies that product with +`ZHatˣ`. + +No abstract copy of either the Galois group or its expected target is +introduced here. +-/ + +@[expose] public section + +noncomputable +section + +namespace KummerTheory + +open ClassFormation + +/-- The actual rational cyclotomic field contains primitive roots of +unity of every nonzero order. -/ +noncomputable instance rationalCyclotomicField_hasEnoughRootsOfUnity + (n : ℕ) [NeZero n] : + HasEnoughRootsOfUnity rationalCyclotomicField n where + prim := + IsCyclotomicExtension.exists_isPrimitiveRoot + (S := (Set.univ : Set ℕ)) + ℚ rationalCyclotomicField (Set.mem_univ n) (NeZero.ne n) + cyc := rootsOfUnity.isCyclic rationalCyclotomicField n + +local instance (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +/-- The product, over all rational primes, of mathlib's `p`-adic +cyclotomic characters of `Gal(rationalCyclotomicField / ℚ)`. -/ +noncomputable def rationalCyclotomicCharacterPrimeProduct : + (rationalCyclotomicField ≃ₐ[ℚ] rationalCyclotomicField) →ₜ* + ((p : Nat.Primes) → ℤ_[p.1]ˣ) where + toMonoidHom := + MonoidHom.pi fun p => + (cyclotomicCharacter rationalCyclotomicField p.1).comp + (MulSemiringAction.toRingAut + (rationalCyclotomicField ≃ₐ[ℚ] rationalCyclotomicField) + rationalCyclotomicField) + continuous_toFun := + continuous_pi fun p => + cyclotomicCharacter.continuous + p.1 ℚ rationalCyclotomicField + +/-- Evaluation at a prime is the corresponding mathlib cyclotomic +character. -/ +@[simp] +theorem rationalCyclotomicCharacterPrimeProduct_apply + (σ : rationalCyclotomicField ≃ₐ[ℚ] rationalCyclotomicField) + (p : Nat.Primes) : + rationalCyclotomicCharacterPrimeProduct σ p = + cyclotomicCharacter rationalCyclotomicField p.1 + (MulSemiringAction.toRingAut + (rationalCyclotomicField ≃ₐ[ℚ] rationalCyclotomicField) + rationalCyclotomicField σ) := + rfl + +section PrimePowerCharacter + +-- Expose the exact prime-power index to instance synthesis. Both +-- proposition-valued instances are supplied by the existing canonical factories. +local instance primePowerLevelNumberField (p : Nat.Primes) (k : ℕ) : + NumberField (rationalCyclotomicLevel ⟨p.1 ^ k, pow_pos p.2.pos k⟩) := + rationalCyclotomicLevel_numberField ⟨p.1 ^ k, pow_pos p.2.pos k⟩ + +local instance primePowerLevelIsGalois (p : Nat.Primes) (k : ℕ) : + IsGalois ℚ (rationalCyclotomicLevel ⟨p.1 ^ k, pow_pos p.2.pos k⟩) := + rationalCyclotomicLevel_isGalois ⟨p.1 ^ k, pow_pos p.2.pos k⟩ + +/-- Reduction of the `p`-coordinate modulo `p ^ k` is the standard +mathlib character of the finite internal cyclotomic level. -/ +theorem rationalCyclotomicCharacterPrimeProduct_toZModPow + (σ : rationalCyclotomicField ≃ₐ[ℚ] rationalCyclotomicField) + (p : Nat.Primes) (k : ℕ) : + Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalCyclotomicCharacterPrimeProduct σ p) = + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) + (rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (hK := + rationalCyclotomicLevel_isCyclotomicExtension + ⟨p.1 ^ k, pow_pos p.2.pos k⟩) + (σ.restrictNormal + (rationalCyclotomicLevel + ⟨p.1 ^ k, pow_pos p.2.pos k⟩)) := by + let n : ℕ+ := ⟨p.1 ^ k, pow_pos p.2.pos k⟩ + let F := rationalCyclotomicLevel n + let : IsCyclotomicExtension {p.1 ^ k} ℚ F := by + change IsCyclotomicExtension {(n : ℕ)} ℚ (rationalCyclotomicLevel n) + exact rationalCyclotomicLevel_isCyclotomicExtension n + let ζ : F := + IsCyclotomicExtension.zeta (p.1 ^ k) ℚ F + have hζ : IsPrimitiveRoot ζ (p.1 ^ k) := + IsCyclotomicExtension.zeta_spec (p.1 ^ k) ℚ F + let t : rationalCyclotomicField := + algebraMap F rationalCyclotomicField ζ + have ht : t ^ (p.1 ^ k) = 1 := by + dsimp only [t] + rw [← map_pow, hζ.pow_eq_one, map_one] + let g : rationalCyclotomicField ≃+* rationalCyclotomicField := + MulSemiringAction.toRingAut + (rationalCyclotomicField ≃ₐ[ℚ] rationalCyclotomicField) + rationalCyclotomicField σ + have hinfinite : + g t = + t ^ ((cyclotomicCharacter + rationalCyclotomicField p.1 g).val.toZModPow k).val := + cyclotomicCharacter.spec p.1 g t ht + have hfinite : + (σ.restrictNormal F) ζ = + ζ ^ (IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) F (σ.restrictNormal F)).val.val := + IsCyclotomicExtension.Rat.galEquivZMod_apply_of_pow_eq + (p.1 ^ k) F (σ.restrictNormal F) hζ.pow_eq_one + have hζmap : IsPrimitiveRoot t (p.1 ^ k) := by + exact hζ.map_of_injective + (algebraMap F rationalCyclotomicField).injective + change + Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalCyclotomicCharacterPrimeProduct σ p) = + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) F (σ.restrictNormal F) + apply Units.ext + apply ZMod.val_injective + apply hζmap.pow_inj (ZMod.val_lt _) (ZMod.val_lt _) + calc + t ^ ((PadicInt.toZModPow k) + (rationalCyclotomicCharacterPrimeProduct σ p).val).val = + g t := by + rw [rationalCyclotomicCharacterPrimeProduct_apply] + exact hinfinite.symm + _ = σ t := rfl + _ = algebraMap F rationalCyclotomicField + ((σ.restrictNormal F) ζ) := + (AlgEquiv.restrictNormal_commutes σ F ζ).symm + _ = algebraMap F rationalCyclotomicField + (ζ ^ (IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) F (σ.restrictNormal F)).val.val) := by + rw [hfinite] + _ = t ^ (IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) F (σ.restrictNormal F)).val.val := by + rw [map_pow] + +end PrimePowerCharacter + +/-- The rational cyclotomic character with its canonical profinite +integer-unit target. -/ +noncomputable def rationalCyclotomicCharacter : + (rationalCyclotomicField ≃ₐ[ℚ] rationalCyclotomicField) →ₜ* ZHatˣ := + (ContinuousMonoidHom.toContinuousMonoidHom + zHatUnitsContinuousMulEquivPrimeProduct.symm).comp + rationalCyclotomicCharacterPrimeProduct + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacterEquiv.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacterEquiv.lean new file mode 100644 index 0000000000..89a184af06 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacterEquiv.lean @@ -0,0 +1,438 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacter +public import Mathlib.FieldTheory.Galois.Profinite +/-! +# The rational cyclotomic character equivalence + +Finite cyclotomic levels are detected by their prime-power reductions, +using mathlib's Chinese-remainder equivalence for `ZMod`. Surjectivity +is obtained from the finite-intersection property for the closed fibers +of the restriction maps to those levels. +-/ + +@[expose] public section + +noncomputable +section + +namespace KummerTheory + +open ClassFormation + +local instance (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +/-- The `p ^ k` reduction of the cyclotomic character can be read from +any finite cyclotomic level whose order is divisible by `p ^ k`. -/ +theorem rationalCyclotomicCharacterPrimeProduct_toZModPow_of_dvd + (σ : rationalCyclotomicField ≃ₐ[ℚ] rationalCyclotomicField) + (p : Nat.Primes) (k : ℕ) (n : ℕ+) + (h : p.1 ^ k ∣ (n : ℕ)) : + Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalCyclotomicCharacterPrimeProduct σ p) = + ZMod.unitsMap h + (IsCyclotomicExtension.Rat.galEquivZMod + (n : ℕ) (rationalCyclotomicLevel n) + (σ.restrictNormal (rationalCyclotomicLevel n))) := by + let m : ℕ+ := ⟨p.1 ^ k, pow_pos p.2.pos k⟩ + let F := rationalCyclotomicLevel m + let K := rationalCyclotomicLevel n + let : IsCyclotomicExtension {p.1 ^ k} ℚ F := by + change IsCyclotomicExtension {(m : ℕ)} ℚ + (rationalCyclotomicLevel m) + exact rationalCyclotomicLevel_isCyclotomicExtension m + have hFK : F ≤ K := + rationalCyclotomicLevel_mono h + let ζ : F := + IsCyclotomicExtension.zeta (p.1 ^ k) ℚ F + have hζ : IsPrimitiveRoot ζ (p.1 ^ k) := + IsCyclotomicExtension.zeta_spec (p.1 ^ k) ℚ F + let x : rationalCyclotomicField := + algebraMap F rationalCyclotomicField ζ + have hζx : IsPrimitiveRoot x (p.1 ^ k) := + hζ.map_of_injective + (algebraMap F rationalCyclotomicField).injective + let y : K := + IntermediateField.inclusion hFK ζ + have hy : y ^ (n : ℕ) = 1 := by + apply Subtype.ext + change x ^ (n : ℕ) = 1 + exact (hζx.pow_eq_one_iff_dvd _).2 h + let a := + IsCyclotomicExtension.Rat.galEquivZMod + (p.1 ^ k) F (σ.restrictNormal F) + let b := + IsCyclotomicExtension.Rat.galEquivZMod + (n : ℕ) K (σ.restrictNormal K) + have ha : + (σ.restrictNormal F) ζ = + ζ ^ a.val.val := by + exact + IsCyclotomicExtension.Rat.galEquivZMod_apply_of_pow_eq + (p.1 ^ k) F (σ.restrictNormal F) hζ.pow_eq_one + have hb : + (σ.restrictNormal K) y = + y ^ b.val.val := by + exact + IsCyclotomicExtension.Rat.galEquivZMod_apply_of_pow_eq + (n : ℕ) K (σ.restrictNormal K) hy + change + Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalCyclotomicCharacterPrimeProduct σ p) = + ZMod.unitsMap h b + calc + Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalCyclotomicCharacterPrimeProduct σ p) = + a := by + simpa only [a, F, m] using + rationalCyclotomicCharacterPrimeProduct_toZModPow σ p k + _ = ZMod.unitsMap h b := by + suffices x ^ a.val.val = x ^ b.val.val by + rw [(hζx.isOfFinOrder (NeZero.ne _)).pow_inj_mod, + ← hζx.eq_orderOf, + ← ZMod.natCast_eq_natCast_iff', + ZMod.natCast_val, ZMod.natCast_val, + ZMod.cast_id] at this + rwa [Units.ext_iff] + calc + x ^ a.val.val = + algebraMap F rationalCyclotomicField + (ζ ^ a.val.val) := by + rw [map_pow] + _ = algebraMap F rationalCyclotomicField + ((σ.restrictNormal F) ζ) := by + rw [ha] + _ = σ x := + AlgEquiv.restrictNormal_commutes σ F ζ + _ = algebraMap K rationalCyclotomicField + ((σ.restrictNormal K) y) := + (AlgEquiv.restrictNormal_commutes σ K y).symm + _ = algebraMap K rationalCyclotomicField + (y ^ b.val.val) := by + rw [hb] + _ = x ^ b.val.val := by + rw [map_pow] + congr 1 + +/-- The product of the `p`-adic cyclotomic characters separates +automorphisms of the actual rational cyclotomic field. -/ +theorem rationalCyclotomicCharacterPrimeProduct_injective : + Function.Injective rationalCyclotomicCharacterPrimeProduct := by + intro σ τ hστ + have hrestrict (n : ℕ+) : + σ.restrictNormal (rationalCyclotomicLevel n) = + τ.restrictNormal (rationalCyclotomicLevel n) := by + let K := rationalCyclotomicLevel n + apply + (IsCyclotomicExtension.Rat.galEquivZMod + (n : ℕ) K).injective + apply Units.ext + let e := + ZMod.equivPi (n := (n : ℕ)) n.2.ne' + apply e.injective + funext q + have hqPrime : q.1.Prime := + Nat.prime_of_mem_primeFactors q.2 + let p : Nat.Primes := ⟨q.1, hqPrime⟩ + let k := (n : ℕ).factorization q.1 + have hpow : + p.1 ^ k ∣ (n : ℕ) := + (hqPrime.pow_dvd_iff_le_factorization n.2.ne').2 le_rfl + have hpCoordinate := + congrArg (fun z => z p) hστ + have hpReduction := + congrArg (Units.map (PadicInt.toZModPow k).toMonoidHom) + hpCoordinate + rw [ + rationalCyclotomicCharacterPrimeProduct_toZModPow_of_dvd + σ p k n hpow, + rationalCyclotomicCharacterPrimeProduct_toZModPow_of_dvd + τ p k n hpow] at hpReduction + have heval (z : ZMod (n : ℕ)) : + e z q = + ZMod.castHom hpow (ZMod (p.1 ^ k)) z := by + change + ((Pi.evalRingHom + (fun r : (n : ℕ).primeFactors => + ZMod (r.1 ^ (n : ℕ).factorization r.1)) q).comp + e.toRingHom) z = + ZMod.castHom hpow (ZMod (p.1 ^ k)) z + exact RingHom.congr_fun (Subsingleton.elim _ _) z + rw [heval, heval] + simpa only [p, k, ZMod.unitsMap_val, + ZMod.castHom_apply] using + congrArg + (fun u : (ZMod (p.1 ^ k))ˣ => + (u : ZMod (p.1 ^ k))) + hpReduction + let E : IntermediateField ℚ rationalCyclotomicField := + { AlgHom.equalizer σ.toAlgHom τ.toAlgHom with + inv_mem' := by + intro x hx + change σ x = τ x at hx + change σ x⁻¹ = τ x⁻¹ + simpa only [map_inv₀] using congrArg Inv.inv hx } + have hlevel (n : ℕ+) : + rationalCyclotomicLevel n ≤ E := by + intro x hx + change σ x = τ x + let y : rationalCyclotomicLevel n := ⟨x, hx⟩ + calc + σ x = + algebraMap (rationalCyclotomicLevel n) + rationalCyclotomicField + ((σ.restrictNormal + (rationalCyclotomicLevel n)) y) := + (AlgEquiv.restrictNormal_commutes σ + (rationalCyclotomicLevel n) y).symm + _ = algebraMap (rationalCyclotomicLevel n) + rationalCyclotomicField + ((τ.restrictNormal + (rationalCyclotomicLevel n)) y) := by + rw [hrestrict n] + _ = τ x := + AlgEquiv.restrictNormal_commutes τ + (rationalCyclotomicLevel n) y + have hE : E = ⊤ := by + apply top_unique + rw [← iSup_rationalCyclotomicLevel] + exact iSup_le hlevel + apply AlgEquiv.ext + intro x + have hx : x ∈ E := by + rw [hE] + trivial + change x ∈ AlgHom.equalizer σ.toAlgHom τ.toAlgHom at hx + exact (AlgHom.mem_equalizer σ.toAlgHom τ.toAlgHom x).mp hx + +/-- The canonical rational cyclotomic character is injective. -/ +theorem rationalCyclotomicCharacter_injective : + Function.Injective rationalCyclotomicCharacter := by + intro σ τ hστ + apply rationalCyclotomicCharacterPrimeProduct_injective + have h := + congrArg + (fun u : ZHatˣ => + zHatUnitsContinuousMulEquivPrimeProduct u) + hστ + simpa [rationalCyclotomicCharacter] using h + +/-- The canonical rational cyclotomic character is surjective. -/ +theorem rationalCyclotomicCharacter_surjective : + Function.Surjective rationalCyclotomicCharacter := by + intro u + let τ (n : ℕ+) : + rationalCyclotomicLevel n ≃ₐ[ℚ] + rationalCyclotomicLevel n := + (IsCyclotomicExtension.Rat.galEquivZMod + (n : ℕ) (rationalCyclotomicLevel n)).symm + (Units.map + (zHatReductionRingHom (n : ℕ) n.2) u) + let C (n : ℕ+) : + Set + (rationalCyclotomicField ≃ₐ[ℚ] + rationalCyclotomicField) := + {σ | + σ.restrictNormal (rationalCyclotomicLevel n) = τ n} + have hclosed (n : ℕ+) : IsClosed (C n) := by + let : FiniteDimensional ℚ (rationalCyclotomicLevel n) := + IsCyclotomicExtension.finiteDimensional + {(n : ℕ)} ℚ (rationalCyclotomicLevel n) + change IsClosed + {σ : + rationalCyclotomicField ≃ₐ[ℚ] + rationalCyclotomicField | + σ.restrictNormal (rationalCyclotomicLevel n) = τ n} + refine @isClosed_eq + (rationalCyclotomicLevel n ≃ₐ[ℚ] + rationalCyclotomicLevel n) + (rationalCyclotomicField ≃ₐ[ℚ] + rationalCyclotomicField) + inferInstance inferInstance krullTopology_t2 + _ _ ?_ ?_ + · exact + InfiniteGalois.restrictNormalHom_continuous + (k := ℚ) (K := rationalCyclotomicField) + (rationalCyclotomicLevel n) + · exact continuous_const + have hfip (s : Finset ℕ+) : + (⋂ n ∈ s, C n).Nonempty := by + let N : ℕ+ := + ⟨∏ n ∈ s, (n : ℕ), + Finset.prod_pos fun n _ => n.2⟩ + obtain ⟨σ, hσN⟩ := + (AlgEquiv.restrictNormalHom_surjective + (F := ℚ) + (K₁ := rationalCyclotomicLevel N) + (E := rationalCyclotomicField)) (τ N) + refine ⟨σ, ?_⟩ + rw [Set.mem_iInter₂] + intro n hn + have hnN : (n : ℕ) ∣ (N : ℕ) := by + change + (n : ℕ) ∣ + ∏ m ∈ s, (m : ℕ) + exact + Finset.dvd_prod_of_mem + (fun m : ℕ+ => (m : ℕ)) hn + let F := rationalCyclotomicLevel n + let K := rationalCyclotomicLevel N + have hFK : F ≤ K := + rationalCyclotomicLevel_mono hnN + let algFK : Algebra F K := + RingHom.toAlgebra + (IntermediateField.inclusion hFK).toRingHom + let : SMul F K := + @Algebra.toSMul F K _ _ algFK + let : Algebra F K := algFK + let : IsScalarTower ℚ F K := + IsScalarTower.of_algebraMap_eq' rfl + let : IsScalarTower ℚ F rationalCyclotomicField := + IsScalarTower.of_algebraMap_eq' rfl + let : IsScalarTower ℚ K rationalCyclotomicField := + IsScalarTower.of_algebraMap_eq' rfl + let : IsScalarTower F K rationalCyclotomicField := + IsScalarTower.of_algebraMap_eq' rfl + have hτ : + (AlgEquiv.restrictNormalHom F) (τ N) = τ n := by + apply + (IsCyclotomicExtension.Rat.galEquivZMod + (n : ℕ) F).injective + change + IsCyclotomicExtension.Rat.galEquivZMod + (n : ℕ) F ((τ N).restrictNormal F) = + IsCyclotomicExtension.Rat.galEquivZMod + (n : ℕ) F (τ n) + rw [ + IsCyclotomicExtension.Rat.galEquivZMod_restrictNormal_apply + (N : ℕ) K F hnN (τ N)] + simp only [K, F, τ, MulEquiv.apply_symm_apply] + apply Units.ext + change + ZMod.castHom hnN (ZMod (n : ℕ)) + (zHatReduction (N : ℕ) N.2 (u : ZHat)) = + zHatReduction (n : ℕ) n.2 (u : ZHat) + exact + zHatReduction_transition + n.2 N.2 hnN (u : ZHat) + change σ.restrictNormal F = τ n + calc + σ.restrictNormal F = + (AlgEquiv.restrictNormalHom F) + ((AlgEquiv.restrictNormalHom K) σ) := + IsScalarTower.AlgEquiv.restrictNormalHom_comp_apply F K σ + _ = (AlgEquiv.restrictNormalHom F) (τ N) := by + have hσN' : + (AlgEquiv.restrictNormalHom K) σ = τ N := by + simpa only [K] using hσN + exact congrArg + (AlgEquiv.restrictNormalHom F) + hσN' + _ = τ n := hτ + obtain ⟨σ, hσ⟩ := + CompactSpace.iInter_nonempty hclosed hfip + refine ⟨σ, ?_⟩ + apply zHatUnitsContinuousMulEquivPrimeProduct.injective + change + zHatUnitsContinuousMulEquivPrimeProduct + (zHatUnitsContinuousMulEquivPrimeProduct.symm + (rationalCyclotomicCharacterPrimeProduct σ)) = + zHatUnitsContinuousMulEquivPrimeProduct u + rw [ + zHatUnitsContinuousMulEquivPrimeProduct.apply_symm_apply] + funext p + apply Units.ext + apply PadicInt.ext_of_toZModPow.mp + intro k + let n : ℕ+ := + ⟨p.1 ^ k, pow_pos p.2.pos k⟩ + have hσn : σ ∈ C n := + Set.mem_iInter.mp hσ n + change + σ.restrictNormal (rationalCyclotomicLevel n) = + τ n at hσn + have hleft := + rationalCyclotomicCharacterPrimeProduct_toZModPow + σ p k + rw [hσn] at hleft + change + Units.map (PadicInt.toZModPow k).toMonoidHom + (rationalCyclotomicCharacterPrimeProduct σ p) = + (IsCyclotomicExtension.Rat.galEquivZMod + (n : ℕ) (rationalCyclotomicLevel n)) + ((IsCyclotomicExtension.Rat.galEquivZMod + (n : ℕ) (rationalCyclotomicLevel n)).symm + (Units.map + (zHatReductionRingHom (n : ℕ) n.2).toMonoidHom u)) + at hleft + rw [MulEquiv.apply_symm_apply] at hleft + have hright : + Units.map (PadicInt.toZModPow k).toMonoidHom + (zHatUnitsContinuousMulEquivPrimeProduct u p) = + Units.map + (zHatReductionRingHom + (p.1 ^ k) (pow_pos p.2.pos k)) u := by + apply Units.ext + change + PadicInt.toZModPow k + (zHatUnitsContinuousMulEquivPrimeProduct u p : + ℤ_[p.1]) = + zHatReduction (p.1 ^ k) + (pow_pos p.2.pos k) (u : ZHat) + rw [ + zHatUnitsContinuousMulEquivPrimeProduct_coe_apply] + simpa only [RingHom.comp_apply, zHatPadicReduction, + zHatReductionRingHom_apply] using + RingHom.congr_fun + (toZModPow_zHatToPadicInt p k) (u : ZHat) + exact + congrArg + (fun z : (ZMod (p.1 ^ k))ˣ => + (z : ZMod (p.1 ^ k))) + (hleft.trans hright.symm) + +/-- The canonical topological equivalence +`Gal(ℚ(μ∞)/ℚ) ≃ ℤ̂ˣ`. -/ +noncomputable def rationalCyclotomicCharacterContinuousMulEquiv : + (rationalCyclotomicField ≃ₐ[ℚ] + rationalCyclotomicField) ≃ₜ* ZHatˣ := + let e := + MulEquiv.ofBijective + rationalCyclotomicCharacter.toMonoidHom + ⟨rationalCyclotomicCharacter_injective, + rationalCyclotomicCharacter_surjective⟩ + ContinuousMulEquiv.mk' + (rationalCyclotomicCharacter.continuous_toFun.homeoOfEquivCompactToT2 + (f := e.toEquiv)) + e.map_mul + +/-- Evaluating the actual profinite-unit cyclotomic character at a +prime recovers the corresponding genuine `p`-adic cyclotomic +character. -/ +@[simp] +theorem + zHatUnitsContinuousMulEquivPrimeProduct_rationalCyclotomicCharacter + (σ : + rationalCyclotomicField ≃ₐ[ℚ] + rationalCyclotomicField) + (p : Nat.Primes) : + zHatUnitsContinuousMulEquivPrimeProduct + (rationalCyclotomicCharacterContinuousMulEquiv σ) p = + rationalCyclotomicCharacterPrimeProduct σ p := by + change + zHatUnitsContinuousMulEquivPrimeProduct + (rationalCyclotomicCharacter σ) p = + rationalCyclotomicCharacterPrimeProduct σ p + have h := + zHatUnitsContinuousMulEquivPrimeProduct.apply_symm_apply + (rationalCyclotomicCharacterPrimeProduct σ) + exact congrFun h p + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicField.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicField.lean new file mode 100644 index 0000000000..b200039247 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicField.lean @@ -0,0 +1,142 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.Cyclotomic.Basic +/-! +# The rational cyclotomic closure + +This file constructs the actual field `ℚ(μ∞)` inside `SeparableClosure ℚ`. +It uses mathlib's general `IsCyclotomicExtension` API, so the infinite +field and its finite cyclotomic levels are not replaced by abstract copies +of their expected Galois groups. + +The finite levels form the divisibility-directed system whose supremum is +the whole cyclotomic field. This supplies the field-theoretic source for +the rational cyclotomic calculation. +-/ + +@[expose] public section + +noncomputable +section + +namespace KummerTheory + +/-- The actual field `ℚ(μ∞)` in a fixed separable closure of `ℚ`. -/ +def rationalCyclotomicField : + IntermediateField ℚ (SeparableClosure ℚ) := + IntermediateField.adjoin ℚ + {ζ : SeparableClosure ℚ | + ∃ n ∈ (Set.univ : Set ℕ), n ≠ 0 ∧ ζ ^ n = 1} + +/-- The field `ℚ(μ∞)` is the cyclotomic extension generated by roots of +unity of all positive orders. -/ +noncomputable instance rationalCyclotomicField_isCyclotomicExtension : + IsCyclotomicExtension (Set.univ : Set ℕ) ℚ + rationalCyclotomicField := by + exact + IntermediateField.isCyclotomicExtension_adjoin_of_exists_isPrimitiveRoot + (Set.univ : Set ℕ) ℚ (SeparableClosure ℚ) + (fun n _hn hn0 => + IsCyclotomicExtension.exists_isPrimitiveRoot + (S := (Set.univ : Set ℕ)) + (SeparableClosure ℚ) (SeparableClosure ℚ) + (Set.mem_univ n) hn0) + +/-- The actual infinite rational cyclotomic extension is abelian Galois. -/ +noncomputable instance rationalCyclotomicField_isAbelianGalois : + IsAbelianGalois ℚ rationalCyclotomicField := + IsCyclotomicExtension.isAbelianGalois + (Set.univ : Set ℕ) ℚ rationalCyclotomicField + +/-- The `n`-th finite cyclotomic level inside `ℚ(μ∞)`. Positive naturals +are used so that the zero-order degeneracy cannot enter the directed +system. -/ +def rationalCyclotomicLevel (n : ℕ+) : + IntermediateField ℚ rationalCyclotomicField := + IntermediateField.adjoin ℚ + {ζ : rationalCyclotomicField | + ∃ m ∈ ({(n : ℕ)} : Set ℕ), + m ≠ 0 ∧ ζ ^ m = 1} + +/-- Each internal finite level is the standard singleton cyclotomic +extension. -/ +noncomputable instance rationalCyclotomicLevel_isCyclotomicExtension + (n : ℕ+) : + IsCyclotomicExtension {(n : ℕ)} ℚ + (rationalCyclotomicLevel n) := by + exact + IntermediateField.isCyclotomicExtension_adjoin_of_exists_isPrimitiveRoot + {(n : ℕ)} ℚ rationalCyclotomicField + (fun m _hm _hm0 => + IsCyclotomicExtension.exists_isPrimitiveRoot + (S := (Set.univ : Set ℕ)) + ℚ rationalCyclotomicField + (Set.mem_univ m) _hm0) + +/-- Every finite internal cyclotomic level is Galois over `ℚ`. -/ +noncomputable instance rationalCyclotomicLevel_isGalois + (n : ℕ+) : + IsGalois ℚ (rationalCyclotomicLevel n) := + IsCyclotomicExtension.isGalois + {(n : ℕ)} ℚ (rationalCyclotomicLevel n) + +/-- A finite level of `ℚ(μ∞)` carries mathlib's standard number-field +structure coming from its singleton cyclotomic presentation. -/ +noncomputable instance rationalCyclotomicLevel_numberField + (n : ℕ+) : + NumberField (rationalCyclotomicLevel n) := + IsCyclotomicExtension.numberField + {(n : ℕ)} ℚ (rationalCyclotomicLevel n) + +/-- Divisibility of orders gives the canonical inclusion between internal +cyclotomic levels. -/ +theorem rationalCyclotomicLevel_mono + {m n : ℕ+} + (h : (m : ℕ) ∣ (n : ℕ)) : + rationalCyclotomicLevel m ≤ + rationalCyclotomicLevel n := + IntermediateField.isCyclotomicExtension_le_of_dvd + ℚ rationalCyclotomicField (m : ℕ) (n : ℕ) + (rationalCyclotomicLevel m) + (rationalCyclotomicLevel n) + (h₁ := rationalCyclotomicLevel_isCyclotomicExtension m) + (h₂ := rationalCyclotomicLevel_isCyclotomicExtension n) + h + +/-- The internal finite cyclotomic levels exhaust `ℚ(μ∞)`. -/ +theorem iSup_rationalCyclotomicLevel : + (⨆ n : ℕ+, rationalCyclotomicLevel n) = ⊤ := by + have htop : + IntermediateField.adjoin ℚ + {ζ : rationalCyclotomicField | + ∃ n : ℕ, n ∈ (Set.univ : Set ℕ) ∧ + n ≠ 0 ∧ ζ ^ n = 1} = + ⊤ := + IntermediateField.adjoin_eq_top_of_algebra ℚ _ + ((IsCyclotomicExtension.iff_adjoin_eq_top + (Set.univ : Set ℕ) ℚ rationalCyclotomicField).1 + inferInstance).2 + apply le_antisymm le_top + rw [← htop, IntermediateField.adjoin_le_iff] + rintro ζ ⟨n, _hn, hn0, hpow⟩ + let npos : ℕ+ := ⟨n, Nat.pos_of_ne_zero hn0⟩ + exact + (le_iSup + (fun m : ℕ+ => rationalCyclotomicLevel m) npos) + (IntermediateField.subset_adjoin ℚ + {x : rationalCyclotomicField | + ∃ m ∈ ({(npos : ℕ)} : Set ℕ), + m ≠ 0 ∧ x ^ m = 1} + (by + refine + ⟨(npos : ℕ), by simp, npos.ne_zero, ?_⟩ + change ζ ^ n = 1 + exact hpow)) + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicTorsionField.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicTorsionField.lean new file mode 100644 index 0000000000..d19becb994 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicTorsionField.lean @@ -0,0 +1,92 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicField +public import Mathlib.FieldTheory.Galois.Profinite +public import Mathlib.GroupTheory.Torsion +/-! +# The torsion fixed field in the rational cyclotomic extension + +The rational cyclotomic construction takes the fixed field of the closure +of the torsion subgroup in `Gal(ℚ(μ∞)/ℚ)`. This file defines that actual closed subgroup +and fixed field. No copy of the Galois group is replaced definitionally by +`ℤ̂ˣ`; the comparison with profinite units is a later theorem. +-/ + +@[expose] public section + +noncomputable +section + +namespace KummerTheory + +open scoped IsMulCommutative + +/-- The closure of the torsion subgroup in the actual Krull-topological +Galois group of `ℚ(μ∞)/ℚ`. -/ +def rationalCyclotomicTorsionClosure : + ClosedSubgroup + (rationalCyclotomicField ≃ₐ[ℚ] + rationalCyclotomicField) where + toSubgroup := + (CommGroup.torsion + (rationalCyclotomicField ≃ₐ[ℚ] + rationalCyclotomicField)).topologicalClosure + isClosed' := + Subgroup.isClosed_topologicalClosure _ + +/-- The actual subfield of `ℚ(μ∞)` fixed by the closure of all +finite-order cyclotomic automorphisms. -/ +def rationalCyclotomicTorsionFixedField : + IntermediateField ℚ rationalCyclotomicField := + IntermediateField.fixedField + rationalCyclotomicTorsionClosure.toSubgroup + +/-- The torsion fixed field is integral over `ℚ`, since it is an +intermediate field of the rational cyclotomic extension. -/ +noncomputable instance + rationalCyclotomicTorsionFixedField_isIntegral : + Algebra.IsIntegral ℚ rationalCyclotomicTorsionFixedField := by + rw [Algebra.isIntegral_def] + intro x + exact IntermediateField.isIntegral_iff.mpr + (Algebra.IsIntegral.isIntegral + (x : rationalCyclotomicField)) + +/-- The torsion fixed field is normal over `ℚ`: its defining closed subgroup +is normal in the abelian cyclotomic Galois group. -/ +noncomputable instance + rationalCyclotomicTorsionFixedField_normal : + Normal ℚ rationalCyclotomicTorsionFixedField := by + let : Subgroup.Normal rationalCyclotomicTorsionClosure.toSubgroup := + inferInstance + apply IntermediateField.normal_iff_forall_map_le'.mpr + rintro σ x ⟨a, ha, rfl⟩ τ + exact + (AlgEquiv.symm_apply_eq σ).mp + (ha + ⟨σ⁻¹ * τ * σ, + Subgroup.Normal.conj_mem' + (H := rationalCyclotomicTorsionClosure.toSubgroup) + inferInstance τ.1 τ.2 σ⟩) + +/-- The torsion-fixed cyclotomic field is Galois over `ℚ`. -/ +noncomputable instance + rationalCyclotomicTorsionFixedField_isGalois : + IsGalois ℚ rationalCyclotomicTorsionFixedField := + isGalois_iff.mpr ⟨inferInstance, inferInstance⟩ + +/-- The torsion-fixed subextension of the abelian rational cyclotomic +extension is itself abelian Galois. -/ +noncomputable instance + rationalCyclotomicTorsionFixedField_isAbelianGalois : + IsAbelianGalois ℚ rationalCyclotomicTorsionFixedField := + IsAbelianGalois.tower_bot ℚ rationalCyclotomicTorsionFixedField + rationalCyclotomicField + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/CyclotomicField.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/CyclotomicField.lean new file mode 100644 index 0000000000..51727c97ce --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/CyclotomicField.lean @@ -0,0 +1,79 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.NumberTheory.Cyclotomic.Basic +/-! +# Concrete cyclotomic fields + +This file records two structural facts about the concrete cyclotomic-field +model: it admits a primitive generator of the defining order, and divisibility +of orders induces an algebra homomorphism between the corresponding fields. +-/ + +@[expose] public section + +noncomputable +section + +namespace KummerTheory + +/-- A concrete cyclotomic field has a primitive generator of its defining +order. -/ +theorem exists_primitiveRoot_adjoin_eq_top_cyclotomicField + (K : Type) [Field K] [CharZero K] (m : ℕ) (hm : 0 < m) : + ∃ ζ : CyclotomicField m K, + IsPrimitiveRoot ζ m ∧ Algebra.adjoin K ({ζ} : Set _) = ⊤ := by + let : NeZero m := ⟨hm.ne'⟩ + obtain ⟨ζ, hζ⟩ := + (CyclotomicField.isCyclotomicExtension m K).exists_isPrimitiveRoot + (Set.mem_singleton m) hm.ne' + exact ⟨ζ, hζ, + IsCyclotomicExtension.adjoin_primitive_root_eq_top hζ⟩ + +/-- If `a` divides `b`, the concrete cyclotomic field of order `a` embeds in +the concrete cyclotomic field of order `b`. -/ +theorem nonempty_algHom_cyclotomicField_of_dvd + (K : Type) [Field K] [CharZero K] + (a b : ℕ) (ha : 0 < a) (hb : 0 < b) (hab : a ∣ b) : + Nonempty (CyclotomicField a K →ₐ[K] CyclotomicField b K) := by + let : NeZero a := ⟨ha.ne'⟩ + let : NeZero b := ⟨hb.ne'⟩ + let A := CyclotomicField a K + let B := CyclotomicField b K + let : IsCyclotomicExtension {a} K A := + CyclotomicField.isCyclotomicExtension a K + let : IsCyclotomicExtension {b} K B := + CyclotomicField.isCyclotomicExtension b K + let : FiniteDimensional K B := + IsCyclotomicExtension.finiteDimensional {b} K B + obtain ⟨ζ, hζ⟩ := + (CyclotomicField.isCyclotomicExtension b K).exists_isPrimitiveRoot + (Set.mem_singleton b) hb.ne' + obtain ⟨c, hbc⟩ := hab + have hc : c ≠ 0 := by + intro hc0 + subst c + simp at hbc + omega + have hζa : IsPrimitiveRoot (ζ ^ c) a := by + have hpow := hζ.pow_of_dvd hc (by + rw [hbc] + exact dvd_mul_left c a) + have hdiv : b / c = a := by + rw [hbc, Nat.mul_div_left a (Nat.pos_of_ne_zero hc)] + simpa only [hdiv] using hpow + let E : IntermediateField K B := IntermediateField.adjoin K {ζ ^ c} + let : IsCyclotomicExtension {a} K E := + hζa.intermediateField_adjoin_isCyclotomicExtension K + let e : A ≃ₐ[K] E := IsCyclotomicExtension.algEquiv {a} K A E + exact ⟨E.val.comp e.toAlgHom⟩ + +end KummerTheory + +end diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/ExtensionRoundTrip.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/ExtensionRoundTrip.lean new file mode 100644 index 0000000000..a28547a917 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/ExtensionRoundTrip.lean @@ -0,0 +1,133 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteGeneration +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalExtension +/-! +# extension-side round trip + +For an abelian Galois intermediate extension `E/K` of exponent dividing +`n`, adjoining in the ambient algebraic closure all `n`-th roots belonging +to the actual radical subgroup of `E` recovers `E` itself. +-/ + +@[expose] public section + +noncomputable +section + +namespace KummerTheory + +variable {K Omega : Type*} [Field K] [Field Omega] [Algebra K Omega] + +/-- Every ambient root belonging to the actual radical subgroup of `E` +already lies in `E`. Its ratio with a root chosen in `E` is an `n`-th root +of unity, hence belongs to `K`. -/ +theorem kummerRootSet_finiteKummerRadicalSubgroup_le + (E : IntermediateField K Omega) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + kummerRootSet (K := K) (Omega := Omega) n + (finiteKummerRadicalSubgroup (K := K) (L := E) n) ⊆ E := by + intro beta hbeta + have hbeta_ne : beta ≠ 0 := + kummerRootSet_ne_zero n + (finiteKummerRadicalSubgroup (K := K) (L := E) n) hbeta + obtain ⟨a, hbeta_pow⟩ := hbeta + obtain ⟨gamma, hgamma_pow⟩ := a.property + let gammaOmega : Omegaˣ := Units.map E.val.toMonoidHom gamma + let betaUnit : Omegaˣ := Units.mk0 beta hbeta_ne + have hbetaUnit_pow : betaUnit ^ (n : ℕ) = + Units.map (algebraMap K Omega).toMonoidHom a.1 := by + apply Units.ext + exact hbeta_pow + have hgammaOmega_pow : gammaOmega ^ (n : ℕ) = + Units.map (algebraMap K Omega).toMonoidHom a.1 := by + apply Units.ext + exact congrArg E.val (congrArg Units.val hgamma_pow) + have hratio_pow : (betaUnit / gammaOmega) ^ (n : ℕ) = 1 := by + rw [div_pow, hbetaUnit_pow, hgammaOmega_pow] + exact div_self' _ + let hbase : NthRootsOfUnityInBase (K := K) (L := Omega) n := + nthRootsOfUnityInBase_of_primitiveRoots + (K := K) (L := Omega) n hmu + obtain ⟨zeta, hzeta⟩ := hbase (betaUnit / gammaOmega) hratio_pow + have hbeta_eq : betaUnit = + Units.map (algebraMap K Omega).toMonoidHom zeta * gammaOmega := by + rw [hzeta] + exact (div_mul_cancel betaUnit gammaOmega).symm + have hbeta_val := congrArg Units.val hbeta_eq + change (betaUnit : Omega) ∈ E + rw [hbeta_val] + exact E.mul_mem (E.algebraMap_mem (zeta : K)) gamma.1.property + +/-- The radical extension constructed from the actual radical subgroup of +`E` is contained in `E`. -/ +theorem kummerRadicalExtension_finiteKummerRadicalSubgroup_le + (E : IntermediateField K Omega) (n : ℕ+) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + kummerRadicalExtension (K := K) (Omega := Omega) n + (finiteKummerRadicalSubgroup (K := K) (L := E) n) ≤ E := by + exact IntermediateField.adjoin_le_iff.mpr + (kummerRootSet_finiteKummerRadicalSubgroup_le E n hmu) + +/-- The internal generation theorem for `E/K`, transported through +`E.val`, gives the reverse inclusion into the ambient radical extension. -/ +theorem le_kummerRadicalExtension_finiteKummerRadicalSubgroup + (E : IntermediateField K Omega) + [IsGalois K E] [IsMulCommutative Gal(E/K)] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ sigma : Gal(E/K), sigma ^ (n : ℕ) = 1) : + E ≤ kummerRadicalExtension (K := K) (Omega := Omega) n + (finiteKummerRadicalSubgroup (K := K) (L := E) n) := by + let R : IntermediateField K Omega := + kummerRadicalExtension (K := K) (Omega := Omega) n + (finiteKummerRadicalSubgroup (K := K) (L := E) n) + have hgeneration : + IntermediateField.adjoin K + (finiteKummerRootSet (K := K) (L := E) n) = ⊤ := + kummerRootSet_adjoin_eq_top + (K := K) (Ω := E) n hmu hexponent + have hroot_subset : + finiteKummerRootSet (K := K) (L := E) n ⊆ R.comap E.val := by + intro beta hbeta + change (beta : Omega) ∈ R + apply IntermediateField.subset_adjoin K + (kummerRootSet (K := K) (Omega := Omega) n + (finiteKummerRadicalSubgroup (K := K) (L := E) n)) + obtain ⟨hbeta_ne, a, hbeta_pow⟩ := hbeta + let betaUnit : Eˣ := Units.mk0 beta hbeta_ne + have ha : a ∈ finiteKummerRadicalSubgroup (K := K) (L := E) n := by + refine ⟨betaUnit, ?_⟩ + apply Units.ext + exact hbeta_pow + refine ⟨⟨a, ha⟩, ?_⟩ + exact congrArg E.val hbeta_pow + have htop_le : (⊤ : IntermediateField K E) ≤ R.comap E.val := by + rw [← hgeneration] + exact IntermediateField.adjoin_le_iff.mpr hroot_subset + intro x hx + let xE : E := ⟨x, hx⟩ + exact htop_le (Set.mem_univ xE) + +/-- **the Kummer correspondence, extension-side round trip.** For an abelian Galois +intermediate extension of exponent dividing `n`, taking its actual radical +subgroup and adjoining all corresponding roots in the ambient closure +recovers the original intermediate field. -/ +theorem kummerRadicalExtension_finiteKummerRadicalSubgroup_eq + (E : IntermediateField K Omega) + [IsGalois K E] [IsMulCommutative Gal(E/K)] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ sigma : Gal(E/K), sigma ^ (n : ℕ) = 1) : + kummerRadicalExtension (K := K) (Omega := Omega) n + (finiteKummerRadicalSubgroup (K := K) (L := E) n) = E := by + apply le_antisymm + · exact kummerRadicalExtension_finiteKummerRadicalSubgroup_le E n hmu + · exact le_kummerRadicalExtension_finiteKummerRadicalSubgroup + E n hmu hexponent + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteCharacterEquiv.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteCharacterEquiv.lean new file mode 100644 index 0000000000..917c0937f5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteCharacterEquiv.lean @@ -0,0 +1,166 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalQuotient +/-! +# finite Kummer character isomorphism + +For an actual finite Galois extension `L/K`, this file constructs + +`Delta = {a : Kˣ | there is beta : Lˣ with beta ^ n = a}` + +as a subgroup, chooses one root for each element only after the subgroup has +been constructed, and proves the character isomorphism + +`Delta / (Delta intersect Kˣ^n) ~= Hom(Gal(L/K), mu_n)`. + +There is no multiplicative choice of roots. Surjectivity is produced by +Noether's Hilbert theorem 90. This is the finite actual-field character- +isomorphism half of The finite Kummer character equivalence; it does not assert the full +lattice correspondence between radical subgroups and abelian extensions. +-/ + +@[expose] public section + +noncomputable +section + +namespace KummerTheory + +section FiniteKummerCharacterIso + +variable {K L : Type*} [Field K] [Field L] [Algebra K L] + +/-- The radical subgroup `A_L^n intersect Kˣ` for the actual extension +`L/K`: its elements are precisely the base-field units admitting an `n`-th +root in `Lˣ`. -/ +def finiteKummerRadicalSubgroup (n : ℕ+) : Subgroup Kˣ where + carrier := {a | ∃ β : Lˣ, + β ^ (n : ℕ) = Units.map (algebraMap K L).toMonoidHom a} + one_mem' := ⟨1, by simp⟩ + mul_mem' := by + rintro a b ⟨α, hα⟩ ⟨β, hβ⟩ + refine ⟨α * β, ?_⟩ + rw [mul_pow, hα, hβ, map_mul] + inv_mem' := by + rintro a ⟨α, hα⟩ + refine ⟨α⁻¹, ?_⟩ + rw [inv_pow, hα, map_inv] + +/-- The finite Kummer radical consists exactly of classes annihilated by every +defining character. -/ +@[simp] theorem mem_finiteKummerRadicalSubgroup_iff + (n : ℕ+) {a : Kˣ} : + a ∈ finiteKummerRadicalSubgroup (K := K) (L := L) n ↔ + ∃ β : Lˣ, β ^ (n : ℕ) = Units.map (algebraMap K L).toMonoidHom a := + Iff.rfl + +/-- An arbitrary root choice on the already constructed radical subgroup. +No compatibility between the choices is imposed. -/ +def chosenFiniteKummerRadicalDatum (n : ℕ+) : RadicalDatum (K := K) (L := L) n where + carrier := finiteKummerRadicalSubgroup (K := K) (L := L) n + root a := Classical.choose a.property + root_pow_eq a := Classical.choose_spec a.property + +/-- The field-level form of the roots-of-unity hypothesis `mu_n subset K`, restricted +to the roots of unity occurring in `L`: every `n`-th root of unity in `Lˣ` +comes from a unit of `K`. -/ +def NthRootsOfUnityInBase (n : ℕ+) : Prop := + ∀ u : Lˣ, u ^ (n : ℕ) = 1 → + ∃ zeta : Kˣ, Units.map (algebraMap K L).toMonoidHom zeta = u + +/-- Under `mu_n subset K`, every Galois automorphism fixes `mu_n(L)`. -/ +theorem nthRootsOfUnity_fixed + (n : ℕ+) (hmu : NthRootsOfUnityInBase (K := K) (L := L) n) + (sigma : Gal(L/K)) (u : Lˣ) (hu : u ^ (n : ℕ) = 1) : + sigma • u = u := by + obtain ⟨zeta, rfl⟩ := hmu u hu + exact RadicalDatum.smul_algebraMap_unit (K := K) (L := L) sigma zeta + +/-- The root-choice-free Kummer character on the ambient-power quotient is +surjective. The preimage of a character is produced by Noether Hilbert 90, +not supplied as a hypothesis. -/ +theorem finiteKummerQuotientCharacter_surjective + [FiniteDimensional K L] [IsGalois K L] + (n : ℕ+) (hmu : NthRootsOfUnityInBase (K := K) (L := L) n) : + Function.Surjective + ((chosenFiniteKummerRadicalDatum (K := K) (L := L) n).quotientKummerCharacterWithoutSection + (nthRootsOfUnity_fixed (K := K) (L := L) n hmu)) := by + let D := chosenFiniteKummerRadicalDatum (K := K) (L := L) n + let hfixed : ∀ sigma : Gal(L/K), ∀ u : Lˣ, + u ^ (n : ℕ) = 1 → sigma • u = u := + nthRootsOfUnity_fixed (K := K) (L := L) n hmu + intro chi + let f : Gal(L/K) → Lˣ := fun sigma => (chi sigma).1 + have hf : groupCohomology.IsMulCocycle₁ f := by + intro sigma tau + change (chi (sigma * tau)).1 = sigma • (chi tau).1 * (chi sigma).1 + rw [map_mul, hfixed sigma (chi tau).1 (chi tau).2, mul_comm] + rfl + obtain ⟨beta, hbeta_div⟩ := + groupCohomology.isMulCoboundary₁_of_isMulCocycle₁_of_aut_to_units f hf + have hbeta : ∀ sigma : Gal(L/K), sigma • beta = f sigma * beta := by + intro sigma + rw [← hbeta_div sigma] + exact (div_mul_cancel (sigma • beta) beta).symm + have hbeta_pow_fixed : ∀ sigma : Gal(L/K), + sigma • (beta ^ (n : ℕ)) = beta ^ (n : ℕ) := by + intro sigma + calc + sigma • (beta ^ (n : ℕ)) = (sigma • beta) ^ (n : ℕ) := by + exact map_pow (MulDistribMulAction.toMonoidHom Lˣ sigma) beta (n : ℕ) + _ = (f sigma * beta) ^ (n : ℕ) := by rw [hbeta sigma] + _ = (f sigma) ^ (n : ℕ) * beta ^ (n : ℕ) := mul_pow _ _ _ + _ = beta ^ (n : ℕ) := by + rw [show (f sigma) ^ (n : ℕ) = 1 from (chi sigma).2, one_mul] + have hbeta_pow_range : ((beta ^ (n : ℕ) : Lˣ) : L) ∈ + Set.range (algebraMap K L) := by + apply (IsGalois.mem_range_algebraMap_iff_fixed + (((beta ^ (n : ℕ) : Lˣ) : L))).2 + intro sigma + exact congrArg Units.val (hbeta_pow_fixed sigma) + obtain ⟨a, ha⟩ := hbeta_pow_range + have ha_ne : a ≠ 0 := by + intro ha_zero + have : (((beta ^ (n : ℕ) : Lˣ) : L)) = 0 := by + simpa [ha_zero] using ha.symm + exact (beta ^ (n : ℕ)).ne_zero this + let aunit : Kˣ := Units.mk0 a ha_ne + have hbeta_pow : beta ^ (n : ℕ) = + Units.map (algebraMap K L).toMonoidHom aunit := by + apply Units.ext + exact ha.symm + let delta : D.carrier := ⟨aunit, beta, hbeta_pow⟩ + refine ⟨D.radicalQuotientMk delta, ?_⟩ + rw [D.quotientKummerCharacterWithoutSection_mk] + apply MonoidHom.ext + intro sigma + apply Subtype.ext + change D.rootCharacter delta hfixed sigma = (chi sigma).1 + rw [← D.rootCharacter_eq_of_same_pow hfixed delta hbeta_pow sigma] + simp [rootQuotient, hbeta sigma, f] + +/-- The finite actual-field Kummer character isomorphism on +`Delta / (Delta intersect Kˣ^n)`. This is the character-isomorphism half of +the finite Kummer character equivalence, not the full subgroup/extension correspondence. -/ +def finiteKummerCharacterEquiv + [FiniteDimensional K L] [IsGalois K L] + (n : ℕ+) (hmu : NthRootsOfUnityInBase (K := K) (L := L) n) : + (chosenFiniteKummerRadicalDatum (K := K) (L := L) n).RadicalQuotient ≃* + (Gal(L/K) →* nthRootsSubgroup L (n : ℕ)) := + MulEquiv.ofBijective + ((chosenFiniteKummerRadicalDatum (K := K) (L := L) n).quotientKummerCharacterWithoutSection + (nthRootsOfUnity_fixed (K := K) (L := L) n hmu)) + ⟨(chosenFiniteKummerRadicalDatum (K := K) (L := L) + n).quotientKummerCharacterWithoutSection_injective + (nthRootsOfUnity_fixed (K := K) (L := L) n hmu), + finiteKummerQuotientCharacter_surjective (K := K) (L := L) n hmu⟩ + +end FiniteKummerCharacterIso + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteDualSeparation.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteDualSeparation.lean new file mode 100644 index 0000000000..0bb4216733 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteDualSeparation.lean @@ -0,0 +1,321 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration +/-! +# finite Kummer dual separation + +This file supplies the first missing finite-duality source for the full +subgroup/extension correspondence in the Kummer correspondence. Characters of a finite +abelian group killed by `n` can be chosen with values in `μₙ`, and these +characters separate points. Consequently, the transpose of a character +equivalence `R ≃ Hom(G, μₙ)` is injective. + +No lattice correspondence or infinite Kummer endpoint is asserted here. +-/ + +@[expose] public section + +noncomputable +section + +namespace KummerTheory + +/-- Restrict a unit-valued character to `μₙ` when its source is killed by +`n`. -/ +def characterToNthRoots + {G K : Type*} [Group G] [Field K] + (n : ℕ+) (hexponent : ∀ g : G, g ^ (n : ℕ) = 1) + (φ : G →* Kˣ) : G →* nthRootsSubgroup K (n : ℕ) where + toFun g := + ⟨φ g, by + calc + φ g ^ (n : ℕ) = φ (g ^ (n : ℕ)) := (map_pow φ g (n : ℕ)).symm + _ = 1 := by rw [hexponent g, map_one]⟩ + map_one' := by + apply Subtype.ext + exact map_one φ + map_mul' := by + intro g h + apply Subtype.ext + exact map_mul φ g h + +/-- A finite character evaluates in the subgroup of `n`th roots of unity. -/ +@[simp] theorem characterToNthRoots_apply + {G K : Type*} [Group G] [Field K] + (n : ℕ+) (hexponent : ∀ g : G, g ^ (n : ℕ) = 1) + (φ : G →* Kˣ) (g : G) : + (characterToNthRoots n hexponent φ g : Kˣ) = φ g := + rfl + +/-- Characters with values in the actual `n`-th roots of unity of `K` +separate points of a finite abelian group killed by `n`. -/ +theorem exists_nthRoots_character_apply_ne_one + {G K : Type*} [CommGroup G] [Finite G] [Field K] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ g : G, g ^ (n : ℕ) = 1) + {g : G} (hg : g ≠ 1) : + ∃ χ : G →* nthRootsSubgroup K (n : ℕ), χ g ≠ 1 := by + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + obtain ⟨zeta, hzeta⟩ := hmu + have hzeta_primitive : IsPrimitiveRoot zeta (n : ℕ) := + (mem_primitiveRoots n.pos).1 hzeta + let : HasEnoughRootsOfUnity K (n : ℕ) := + { prim := ⟨zeta, hzeta_primitive⟩ + cyc := rootsOfUnity.isCyclic K (n : ℕ) } + have hexponent_dvd : Monoid.exponent G ∣ (n : ℕ) := + Monoid.exponent_dvd_of_forall_pow_eq_one (fun q => by + simpa only using hexponent q) + let : HasEnoughRootsOfUnity K (Monoid.exponent G) := + HasEnoughRootsOfUnity.of_dvd K hexponent_dvd + obtain ⟨φ, hφ⟩ := + CommGroup.exists_apply_ne_one_of_hasEnoughRootsOfUnity G K hg + refine ⟨characterToNthRoots n hexponent φ, ?_⟩ + intro h + apply hφ + exact congrArg Subtype.val h + +/-- Algebraic extension maps carry `μₙ(K)` injectively into `μₙ(L)`. -/ +def nthRootsSubgroupMap + (K L : Type*) [Field K] [Field L] [Algebra K L] (n : ℕ) : + nthRootsSubgroup K n →* nthRootsSubgroup L n where + toFun z := + ⟨Units.map (algebraMap K L).toMonoidHom z.1, by + calc + Units.map (algebraMap K L).toMonoidHom z.1 ^ n = + Units.map (algebraMap K L).toMonoidHom (z.1 ^ n) := + (map_pow (Units.map (algebraMap K L).toMonoidHom) z.1 n).symm + _ = 1 := by rw [z.2, map_one]⟩ + map_one' := by + apply Subtype.ext + exact map_one (Units.map (algebraMap K L).toMonoidHom) + map_mul' := by + intro z w + apply Subtype.ext + exact map_mul (Units.map (algebraMap K L).toMonoidHom) z.1 w.1 + +/-- The canonical map from roots of unity into the `n`th-roots subgroup is injective. -/ +theorem nthRootsSubgroupMap_injective + (K L : Type*) [Field K] [Field L] [Algebra K L] (n : ℕ) : + Function.Injective (nthRootsSubgroupMap K L n) := by + intro z w h + apply Subtype.ext + apply (Units.map_injective (f := (algebraMap K L).toMonoidHom) + (algebraMap K L).injective) + exact congrArg Subtype.val h + +/-- The locally defined `nthRootsSubgroup` is canonically the same group as +mathlib's `rootsOfUnity`. -/ +def nthRootsSubgroupEquivRootsOfUnity + (K : Type*) [Field K] (n : ℕ) : + nthRootsSubgroup K n ≃* rootsOfUnity n K where + toFun z := ⟨z.1, z.2⟩ + invFun z := ⟨z.1, z.2⟩ + left_inv _ := rfl + right_inv _ := rfl + map_mul' _ _ := rfl + +/-- The subgroup of `n`th roots of unity has a canonical finite type structure. -/ +noncomputable instance nthRootsSubgroupFintype + (K : Type*) [Field K] (n : ℕ) [NeZero n] : Fintype (nthRootsSubgroup K n) := + letI : Fintype (rootsOfUnity n K) := Fintype.ofFinite _ + Fintype.ofEquiv (rootsOfUnity n K) + (nthRootsSubgroupEquivRootsOfUnity K n).symm.toEquiv + +/-- If `K` contains a primitive `n`-th root, extension of scalars identifies +the `n`-th roots of unity in `K` and in every extension field `L`. -/ +def nthRootsSubgroupEquivOfPrimitiveRoots + (K L : Type*) [Field K] [Field L] [Algebra K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + nthRootsSubgroup K (n : ℕ) ≃* nthRootsSubgroup L (n : ℕ) := + MulEquiv.ofBijective (nthRootsSubgroupMap K L (n : ℕ)) + ⟨nthRootsSubgroupMap_injective K L (n : ℕ), by + intro u + obtain ⟨zeta, hzeta⟩ := + nthRootsOfUnityInBase_of_primitiveRoots + (K := K) (L := L) n hmu u.1 u.2 + have hzeta_pow : zeta ^ (n : ℕ) = 1 := by + apply (Units.map_injective (f := (algebraMap K L).toMonoidHom) + (algebraMap K L).injective) + calc + Units.map (algebraMap K L).toMonoidHom (zeta ^ (n : ℕ)) = + (Units.map (algebraMap K L).toMonoidHom zeta) ^ (n : ℕ) := + map_pow (Units.map (algebraMap K L).toMonoidHom) zeta (n : ℕ) + _ = u.1 ^ (n : ℕ) := by rw [hzeta] + _ = 1 := u.2 + _ = Units.map (algebraMap K L).toMonoidHom 1 := + (map_one (Units.map (algebraMap K L).toMonoidHom)).symm + exact ⟨⟨zeta, hzeta_pow⟩, Subtype.ext hzeta⟩⟩ + +/-- For a group killed by `n`, restricting a `Kˣ`-valued character to +`μₙ(K)` loses no information. -/ +def unitCharactersEquivNthRoots + {G K : Type*} [CommGroup G] [Field K] + (n : ℕ+) (hexponent : ∀ g : G, g ^ (n : ℕ) = 1) : + (G →* Kˣ) ≃* (G →* nthRootsSubgroup K (n : ℕ)) where + toFun := characterToNthRoots n hexponent + invFun χ := (nthRootsSubgroup K (n : ℕ)).subtype.comp χ + left_inv φ := by + apply MonoidHom.ext + intro g + rfl + right_inv χ := by + apply MonoidHom.ext + intro g + apply Subtype.ext + rfl + map_mul' φ ψ := by + apply MonoidHom.ext + intro g + apply Subtype.ext + rfl + +/-- Finite abelian duality with the character codomain restricted to the +actual `n`-th roots of unity in an extension field. -/ +theorem finiteNthRootsCharacterDuality + {G K L : Type*} [CommGroup G] [Finite G] + [Field K] [Field L] [Algebra K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ g : G, g ^ (n : ℕ) = 1) : + Nonempty ((G →* nthRootsSubgroup L (n : ℕ)) ≃* G) := by + let rootsEquiv := nthRootsSubgroupEquivOfPrimitiveRoots K L n hmu + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + obtain ⟨zeta, hzeta⟩ := hmu + have hzeta_primitive : IsPrimitiveRoot zeta (n : ℕ) := + (mem_primitiveRoots n.pos).1 hzeta + let : HasEnoughRootsOfUnity K (n : ℕ) := + { prim := ⟨zeta, hzeta_primitive⟩ + cyc := rootsOfUnity.isCyclic K (n : ℕ) } + have hexponent_dvd : Monoid.exponent G ∣ (n : ℕ) := + Monoid.exponent_dvd_of_forall_pow_eq_one (fun g => by + simpa only using hexponent g) + let : HasEnoughRootsOfUnity K (Monoid.exponent G) := + HasEnoughRootsOfUnity.of_dvd K hexponent_dvd + obtain ⟨dual⟩ := CommGroup.monoidHom_mulEquiv_of_hasEnoughRootsOfUnity G K + exact ⟨(rootsEquiv.monoidHomCongrRight (M := G)).symm |>.trans + (unitCharactersEquivNthRoots n hexponent).symm |>.trans dual⟩ + +/-- The same separation result with values in the roots of unity of an +extension field `L`. -/ +theorem exists_nthRoots_character_apply_ne_one_in_extension + {G K L : Type*} [CommGroup G] [Finite G] + [Field K] [Field L] [Algebra K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ g : G, g ^ (n : ℕ) = 1) + {g : G} (hg : g ≠ 1) : + ∃ χ : G →* nthRootsSubgroup L (n : ℕ), χ g ≠ 1 := by + obtain ⟨χ, hχ⟩ := + exists_nthRoots_character_apply_ne_one n hmu hexponent hg + refine ⟨(nthRootsSubgroupMap K L (n : ℕ)).comp χ, ?_⟩ + intro h + apply hχ + apply nthRootsSubgroupMap_injective K L (n : ℕ) + simpa using h + +/-- Transpose a character equivalence by evaluation. -/ +def transposeCharacterEquiv + {G R M : Type*} [CommGroup G] [CommGroup R] [CommGroup M] + (e : R ≃* (G →* M)) : G →* (R →* M) where + toFun g := + { toFun := fun r => e r g + map_one' := by simp + map_mul' := by + intro r s + exact congrArg (fun χ : G →* M => χ g) (map_mul e r s) } + map_one' := by + apply MonoidHom.ext + intro r + exact map_one (e r) + map_mul' := by + intro g h + apply MonoidHom.ext + intro r + exact map_mul (e r) g h + +/-- The transposed character equivalence evaluates by pairing with the original character. -/ +@[simp] theorem transposeCharacterEquiv_apply + {G R M : Type*} [CommGroup G] [CommGroup R] [CommGroup M] + (e : R ≃* (G →* M)) (g : G) (r : R) : + transposeCharacterEquiv e g r = e r g := + rfl + +/-- Nondegeneracy on the Galois side of the finite Kummer pairing. This is +the injectivity source needed before the cardinality step can upgrade the +transpose to the canonical isomorphism in the Kummer correspondence. -/ +theorem transposeCharacterEquiv_injective + {G R K L : Type*} [CommGroup G] [Finite G] [CommGroup R] + [Field K] [Field L] [Algebra K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ g : G, g ^ (n : ℕ) = 1) + (e : R ≃* (G →* nthRootsSubgroup L (n : ℕ))) : + Function.Injective (transposeCharacterEquiv e) := by + intro g h hgh + apply div_eq_one.mp + by_contra hdiv + obtain ⟨χ, hχ⟩ := + exists_nthRoots_character_apply_ne_one_in_extension + (G := G) (K := K) (L := L) n hmu hexponent hdiv + obtain ⟨r, hr⟩ := e.surjective χ + have hquotient : transposeCharacterEquiv e (g / h) = 1 := by + rw [map_div, hgh] + exact div_self' (transposeCharacterEquiv e h) + have hvalue := congrArg + (fun ψ : R →* nthRootsSubgroup L (n : ℕ) => ψ r) hquotient + change e r (g / h) = 1 at hvalue + apply hχ + simpa only [hr] using hvalue + +/-- The finite cardinality step upgrades nondegeneracy of the transposed +Kummer pairing to surjectivity. The needed equality of cardinalities is +produced by finite abelian duality; it is not assumed. -/ +theorem transposeCharacterEquiv_surjective + {G R K L : Type*} [CommGroup G] [Finite G] [CommGroup R] + [Field K] [Field L] [Algebra K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ g : G, g ^ (n : ℕ) = 1) + (e : R ≃* (G →* nthRootsSubgroup L (n : ℕ))) : + Function.Surjective (transposeCharacterEquiv e) := by + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + let : Finite (G →* nthRootsSubgroup L (n : ℕ)) := + Finite.of_injective + (fun χ : G →* nthRootsSubgroup L (n : ℕ) => + (χ : G → nthRootsSubgroup L (n : ℕ))) DFunLike.coe_injective + let : Finite R := Finite.of_equiv + (G →* nthRootsSubgroup L (n : ℕ)) e.symm.toEquiv + have hRexponent : ∀ r : R, r ^ (n : ℕ) = 1 := by + intro r + apply e.injective + rw [map_pow, map_one] + apply MonoidHom.ext + intro g + apply Subtype.ext + exact (e r g).2 + obtain ⟨dualR⟩ := finiteNthRootsCharacterDuality + (G := R) (K := K) (L := L) n hmu hRexponent + obtain ⟨dualG⟩ := finiteNthRootsCharacterDuality + (G := G) (K := K) (L := L) n hmu hexponent + let targetEquivG : (R →* nthRootsSubgroup L (n : ℕ)) ≃ G := + dualR.toEquiv.trans (e.toEquiv.trans dualG.toEquiv) + exact (transposeCharacterEquiv_injective n hmu hexponent e).surjective_of_finite + targetEquivG.symm + +/-- The canonical finite Kummer transpose equivalence. This is the finite +perfect-pairing equivalence underlying the Galois-group isomorphism; it +does not yet assert the subgroup/extension lattice endpoint. -/ +def transposeCharacterMulEquiv + {G R K L : Type*} [CommGroup G] [Finite G] [CommGroup R] + [Field K] [Field L] [Algebra K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ g : G, g ^ (n : ℕ) = 1) + (e : R ≃* (G →* nthRootsSubgroup L (n : ℕ))) : + G ≃* (R →* nthRootsSubgroup L (n : ℕ)) := + MulEquiv.ofBijective (transposeCharacterEquiv e) + ⟨transposeCharacterEquiv_injective n hmu hexponent e, + transposeCharacterEquiv_surjective n hmu hexponent e⟩ + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteGeneration.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteGeneration.lean new file mode 100644 index 0000000000..db2b3d3ca4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteGeneration.lean @@ -0,0 +1,153 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.GroupTheory.FiniteAbelian.Duality +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteCharacterEquiv +/-! +# finite actual-field form + +Let `L/K` be a finite abelian Galois extension whose Galois group is killed by +`n`, and suppose that `K` contains a primitive `n`-th root of unity. This file +proves that `L` is generated over `K` by all nonzero `beta : L` such that +`beta ^ n` belongs to `K`. + +The proof uses finite-abelian character separation and the finite Kummer +character isomorphism. It is the finite `n`-th-power, actual-field form of +the Kummer generation theorem; it is not the general abstract-module or infinite statement. +-/ + +@[expose] public section + +noncomputable +section + +namespace KummerTheory + +open scoped IsMulCommutative + +section FiniteKummerGeneration + +variable {K L : Type*} [Field K] [Field L] [Algebra K L] + +/-- All nonzero elements of `L` whose `n`-th power comes from `K`. -/ +def finiteKummerRootSet (n : ℕ+) : Set L := + {beta | beta ≠ 0 ∧ + ∃ a : Kˣ, beta ^ (n : ℕ) = algebraMap K L (a : K)} + +/-- A primitive `n`-th root in `K` implies the field-level hypothesis that +all `n`-th roots of unity occurring in `L` come from `K`. -/ +theorem nthRootsOfUnityInBase_of_primitiveRoots + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + NthRootsOfUnityInBase (K := K) (L := L) n := by + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + intro u hu + let eta : rootsOfUnity (n : ℕ) L := ⟨u, hu⟩ + let e : rootsOfUnity (n : ℕ) K ≃* rootsOfUnity (n : ℕ) L := + rootsOfUnityEquivOfPrimitiveRoots (algebraMap K L).injective hmu + refine ⟨(e.symm eta : rootsOfUnity (n : ℕ) K).1, ?_⟩ + apply Units.ext + exact rootsOfUnityEquivOfPrimitiveRoots_symm_apply + (algebraMap K L).injective hmu eta + +/-- Finite actual-field version of The Kummer generation theorem. + +An abelian Galois extension of exponent dividing `n`, over a field containing +the `n`-th roots of unity, is generated by the elements whose `n`-th powers +belong to the base field. -/ +theorem finiteKummerRootSet_adjoin_eq_top + [FiniteDimensional K L] [IsGalois K L] [IsMulCommutative Gal(L/K)] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ sigma : Gal(L/K), sigma ^ (n : ℕ) = 1) : + IntermediateField.adjoin K (finiteKummerRootSet (K := K) (L := L) n) = ⊤ := by + let D := chosenFiniteKummerRadicalDatum (K := K) (L := L) n + let hbase : NthRootsOfUnityInBase (K := K) (L := L) n := + nthRootsOfUnityInBase_of_primitiveRoots (K := K) (L := L) n hmu + let hfixed : ∀ sigma : Gal(L/K), ∀ u : Lˣ, + u ^ (n : ℕ) = 1 → sigma • u = u := + nthRootsOfUnity_fixed (K := K) (L := L) n hbase + let E : IntermediateField K L := + IntermediateField.adjoin K (finiteKummerRootSet (K := K) (L := L) n) + apply IsGalois.intermediateFieldEquivSubgroup.injective + rw [map_top, eq_top_iff] + intro sigma hsigma + have hsigma_eq_one : sigma = 1 := by + by_contra hsigma_ne + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + obtain ⟨zeta, hzeta⟩ := hmu + have hzeta_primitive : IsPrimitiveRoot zeta (n : ℕ) := + (mem_primitiveRoots n.pos).1 hzeta + let : HasEnoughRootsOfUnity K (n : ℕ) := + { prim := ⟨zeta, hzeta_primitive⟩ + cyc := rootsOfUnity.isCyclic K (n : ℕ) } + have hexponent_dvd : Monoid.exponent Gal(L/K) ∣ (n : ℕ) := + Monoid.exponent_dvd_of_forall_pow_eq_one (fun tau => by + simpa only using hexponent tau) + let : HasEnoughRootsOfUnity K (Monoid.exponent Gal(L/K)) := + HasEnoughRootsOfUnity.of_dvd K hexponent_dvd + obtain ⟨phi, hphi⟩ := + CommGroup.exists_apply_ne_one_of_hasEnoughRootsOfUnity Gal(L/K) K hsigma_ne + let chi : Gal(L/K) →* nthRootsSubgroup L (n : ℕ) := + { toFun := fun tau => + ⟨Units.map (algebraMap K L).toMonoidHom (phi tau), by + calc + (Units.map (algebraMap K L).toMonoidHom (phi tau)) ^ (n : ℕ) = + Units.map (algebraMap K L).toMonoidHom ((phi tau) ^ (n : ℕ)) := + (map_pow (Units.map (algebraMap K L).toMonoidHom) + (phi tau) (n : ℕ)).symm + _ = Units.map (algebraMap K L).toMonoidHom (phi (tau ^ (n : ℕ))) := by + exact congrArg (Units.map (algebraMap K L).toMonoidHom) + (map_pow phi tau (n : ℕ)).symm + _ = 1 := by rw [hexponent tau, map_one, map_one]⟩ + map_one' := by + apply Subtype.ext + simp + map_mul' := by + intro sigma tau + apply Subtype.ext + simp } + have hchi_sigma : chi sigma ≠ 1 := by + intro hchi + have hmap : Units.map (algebraMap K L).toMonoidHom (phi sigma) = 1 := by + simpa [chi] using congrArg Subtype.val hchi + apply hphi + apply (Units.map_injective (f := (algebraMap K L).toMonoidHom) + (algebraMap K L).injective) + simpa using hmap + obtain ⟨q, hq⟩ := + finiteKummerQuotientCharacter_surjective (K := K) (L := L) n hbase chi + obtain ⟨delta, rfl⟩ := D.radicalQuotientMk_surjective q + have hroot_mem : (D.root delta : L) ∈ + finiteKummerRootSet (K := K) (L := L) n := by + refine ⟨(D.root delta).ne_zero, delta.1, ?_⟩ + exact congrArg Units.val (D.root_pow_eq_map delta) + have hroot_fixed_val : sigma (D.root delta : L) = D.root delta := + hsigma ⟨D.root delta, + IntermediateField.subset_adjoin K + (finiteKummerRootSet (K := K) (L := L) n) hroot_mem⟩ + have hroot_fixed : sigma • D.root delta = D.root delta := by + apply Units.ext + exact hroot_fixed_val + have hkummer_sigma : D.kummerCharacterWithoutSection hfixed delta sigma = 1 := by + apply Subtype.ext + change D.rootCharacter delta hfixed sigma = 1 + rw [D.rootCharacter_apply] + change rootQuotient (K := K) (L := L) (D.root delta) sigma = 1 + exact (rootQuotient_eq_one_iff (K := K) (L := L) (D.root delta) sigma).2 + hroot_fixed + have hchi_eq : D.kummerCharacterWithoutSection hfixed delta = chi := by + rw [← D.quotientKummerCharacterWithoutSection_mk delta hfixed] + exact hq + apply hchi_sigma + rw [← hchi_eq] + exact hkummer_sigma + rw [hsigma_eq_one] + exact one_mem _ + +end FiniteKummerGeneration + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteSupport.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteSupport.lean new file mode 100644 index 0000000000..cd27bcc260 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteSupport.lean @@ -0,0 +1,470 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.GroupTheory.FiniteAbelian.Basic +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalExtension +/-! +# finite radical support + +Membership in `K(√[n]{Δ})` uses only finitely many of the adjoined roots. +For such a finite root set this file chooses the corresponding coefficients +in `Δ`, records them in a finite subset of `Kˣ`, and forms the subgroup they +generate. The resulting subgroup lies in `Δ`, and every selected root has +its `n`-th power in that finitely generated subgroup. + +These are the concrete finite-support data needed for the later reduction to +finite Kummer theory; no finite Kummer endpoint is assumed here. +-/ + +@[expose] public section + +noncomputable +section + +namespace KummerTheory + +variable {K Omega : Type*} [Field K] [Field Omega] [Algebra K Omega] + +/-- An element of a radical extension belongs to the field generated by a +finite subset of the full Kummer root set. -/ +theorem exists_finset_kummerRootSet_of_mem_kummerRadicalExtension + (n : ℕ+) (Delta : Subgroup Kˣ) {beta : Omega} + (hbeta : beta ∈ kummerRadicalExtension (K := K) (Omega := Omega) n Delta) : + ∃ T : Finset Omega, + (T : Set Omega) ⊆ kummerRootSet (K := K) (Omega := Omega) n Delta ∧ + beta ∈ IntermediateField.adjoin K (T : Set Omega) := by + exact IntermediateField.exists_finset_of_mem_adjoin hbeta + +/-- For each member of a finite Kummer root set, choose its coefficient in +`Delta`. This choice is made only after the finite root set is known. -/ +def chosenFiniteSupportCoefficient + (n : ℕ+) (Delta : Subgroup Kˣ) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ kummerRootSet (K := K) (Omega := Omega) n Delta) + (beta : T) : Delta := + Classical.choose (hT beta.property) + +/-- The chosen coefficient really is the `n`-th power of its root. -/ +theorem chosenFiniteSupportCoefficient_pow + (n : ℕ+) (Delta : Subgroup Kˣ) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ kummerRootSet (K := K) (Omega := Omega) n Delta) + (beta : T) : + (beta.1 : Omega) ^ (n : ℕ) = + algebraMap K Omega ((chosenFiniteSupportCoefficient n Delta T hT beta).1 : K) := + Classical.choose_spec (hT beta.property) + +/-- The finite set of base-field coefficients used by the selected roots. -/ +def chosenFiniteSupportCoefficientSet + (n : ℕ+) (Delta : Subgroup Kˣ) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ kummerRootSet (K := K) (Omega := Omega) n Delta) : + Finset Kˣ := by + classical + exact Finset.univ.image fun beta : T => (chosenFiniteSupportCoefficient n Delta T hT beta).1 + +/-- The subgroup `Delta₀` generated by the finitely many selected +coefficients. -/ +def chosenFiniteSupportCoefficientSubgroup + (n : ℕ+) (Delta : Subgroup Kˣ) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ kummerRootSet (K := K) (Omega := Omega) n Delta) : + Subgroup Kˣ := + Subgroup.closure + (chosenFiniteSupportCoefficientSet (K := K) (Omega := Omega) n Delta T hT : Set Kˣ) + +/-- The selected nonzero coefficient belongs to the finite support set. -/ +theorem chosenFiniteSupportCoefficient_mem_set + (n : ℕ+) (Delta : Subgroup Kˣ) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ kummerRootSet (K := K) (Omega := Omega) n Delta) + (beta : T) : + (chosenFiniteSupportCoefficient n Delta T hT beta).1 ∈ + chosenFiniteSupportCoefficientSet (K := K) (Omega := Omega) n Delta T hT := by + classical + rw [chosenFiniteSupportCoefficientSet] + apply Finset.mem_image.2 + exact ⟨beta, Finset.mem_univ beta, rfl⟩ + +/-- The finitely generated coefficient subgroup is a subgroup of the +original radical subgroup `Delta`. -/ +theorem chosenFiniteSupportCoefficientSubgroup_le + (n : ℕ+) (Delta : Subgroup Kˣ) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ kummerRootSet (K := K) (Omega := Omega) n Delta) : + chosenFiniteSupportCoefficientSubgroup (K := K) (Omega := Omega) n Delta T hT ≤ Delta := by + classical + rw [chosenFiniteSupportCoefficientSubgroup, Subgroup.closure_le] + intro a ha + change a ∈ chosenFiniteSupportCoefficientSet (K := K) (Omega := Omega) n Delta T hT at ha + rw [chosenFiniteSupportCoefficientSet] at ha + obtain ⟨beta, _, rfl⟩ := Finset.mem_image.1 ha + exact (chosenFiniteSupportCoefficient n Delta T hT beta).property + +/-- Each chosen coefficient belongs to the generated subgroup `Delta₀`. -/ +theorem chosenFiniteSupportCoefficient_mem_subgroup + (n : ℕ+) (Delta : Subgroup Kˣ) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ kummerRootSet (K := K) (Omega := Omega) n Delta) + (beta : T) : + (chosenFiniteSupportCoefficient n Delta T hT beta).1 ∈ + chosenFiniteSupportCoefficientSubgroup (K := K) (Omega := Omega) n Delta T hT := by + apply Subgroup.subset_closure + exact chosenFiniteSupportCoefficient_mem_set n Delta T hT beta + +/-- Every selected root is an `n`-th root of an actual element of the +finite-support subgroup `Delta₀`. -/ +theorem finiteSupportRoot_pow_from_coefficientSubgroup + (n : ℕ+) (Delta : Subgroup Kˣ) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ kummerRootSet (K := K) (Omega := Omega) n Delta) + (beta : T) : + ∃ a : chosenFiniteSupportCoefficientSubgroup (K := K) (Omega := Omega) n Delta T hT, + (beta.1 : Omega) ^ (n : ℕ) = algebraMap K Omega (a.1 : K) := by + let a : chosenFiniteSupportCoefficientSubgroup (K := K) (Omega := Omega) n Delta T hT := + ⟨(chosenFiniteSupportCoefficient n Delta T hT beta).1, + chosenFiniteSupportCoefficient_mem_subgroup n Delta T hT beta⟩ + refine ⟨a, ?_⟩ + exact chosenFiniteSupportCoefficient_pow n Delta T hT beta + +/-- Complete finite-support data extracted from one element of +`K(√[n]{Delta})`: finite roots generating the element, a concrete finite +coefficient set, its generated subgroup `Delta₀ ≤ Delta`, and an +`n`-th-power equation over `Delta₀` for every selected root. -/ +theorem exists_finiteKummerSupport + (n : ℕ+) (Delta : Subgroup Kˣ) {beta : Omega} + (hbeta : beta ∈ kummerRadicalExtension (K := K) (Omega := Omega) n Delta) : + ∃ (T : Finset Omega) + (hT : (T : Set Omega) ⊆ kummerRootSet (K := K) (Omega := Omega) n Delta), + beta ∈ IntermediateField.adjoin K (T : Set Omega) ∧ + chosenFiniteSupportCoefficientSubgroup (K := K) (Omega := Omega) n Delta T hT ≤ Delta ∧ + ∀ root : T, + ∃ a : chosenFiniteSupportCoefficientSubgroup + (K := K) (Omega := Omega) n Delta T hT, + (root.1 : Omega) ^ (n : ℕ) = algebraMap K Omega (a.1 : K) := by + obtain ⟨T, hT, hbetaT⟩ := + exists_finset_kummerRootSet_of_mem_kummerRadicalExtension n Delta hbeta + refine ⟨T, hT, hbetaT, chosenFiniteSupportCoefficientSubgroup_le n Delta T hT, ?_⟩ + exact finiteSupportRoot_pow_from_coefficientSubgroup n Delta T hT + + +/-- Add all ambient `n`-th powers to the finite coefficient subgroup. The +result is an admissible subgroup-side object for the Kummer correspondence. -/ +def admissibleFiniteSupportSubgroup + (n : ℕ+) (Delta : KummerSubgroup K n) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ + kummerRootSet (K := K) (Omega := Omega) n Delta.1) : + KummerSubgroup K n := + ⟨unitNthPowersSubgroup K n ⊔ + chosenFiniteSupportCoefficientSubgroup (K := K) (Omega := Omega) n Delta.1 T hT, + le_sup_left⟩ + +/-- The admissible finite-support subgroup still lies in the original +admissible subgroup `Delta`. -/ +theorem admissibleFiniteSupportSubgroup_le + (n : ℕ+) (Delta : KummerSubgroup K n) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ + kummerRootSet (K := K) (Omega := Omega) n Delta.1) : + (admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT).1 ≤ Delta.1 := by + apply sup_le Delta.2 + exact chosenFiniteSupportCoefficientSubgroup_le n Delta.1 T hT + +/-- The copy of `Kˣⁿ` inside the admissible finite-support subgroup. -/ +def finiteSupportNthPowersSubgroup + (n : ℕ+) (Delta : KummerSubgroup K n) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ + kummerRootSet (K := K) (Omega := Omega) n Delta.1) : + Subgroup (admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT).1 := + (unitNthPowersSubgroup K n).comap + (admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT).1.subtype + +/-- The finite-support quotient `Delta₀ / Kˣⁿ`. -/ +def FiniteSupportKummerQuotient + (n : ℕ+) (Delta : KummerSubgroup K n) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ + kummerRootSet (K := K) (Omega := Omega) n Delta.1) := + (admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT).1 ⧸ + finiteSupportNthPowersSubgroup + (K := K) (Omega := Omega) n Delta T hT + +/-- The commutative group structure on the named finite-support Kummer +quotient. -/ +instance finiteSupportKummerQuotientCommGroupInstance + (n : ℕ+) (Delta : KummerSubgroup K n) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ + kummerRootSet (K := K) (Omega := Omega) n Delta.1) : + CommGroup (FiniteSupportKummerQuotient + (K := K) (Omega := Omega) n Delta T hT) := by + change CommGroup + ((admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT).1 ⧸ + finiteSupportNthPowersSubgroup + (K := K) (Omega := Omega) n Delta T hT) + infer_instance + +/-- Comparison with the group-library presentation of the finite-support +Kummer quotient. -/ +def finiteSupportKummerQuotientMulEquiv + (n : ℕ+) (Delta : KummerSubgroup K n) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ + kummerRootSet (K := K) (Omega := Omega) n Delta.1) : + FiniteSupportKummerQuotient (K := K) (Omega := Omega) n Delta T hT ≃* + ((admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT).1 ⧸ + finiteSupportNthPowersSubgroup + (K := K) (Omega := Omega) n Delta T hT) := + MulEquiv.refl _ + +/-- The canonical projection to the named finite-support Kummer quotient. -/ +def finiteSupportKummerQuotientMk + (n : ℕ+) (Delta : KummerSubgroup K n) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ + kummerRootSet (K := K) (Omega := Omega) n Delta.1) : + (admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT).1 →* + FiniteSupportKummerQuotient + (K := K) (Omega := Omega) n Delta T hT := + QuotientGroup.mk' + (finiteSupportNthPowersSubgroup + (K := K) (Omega := Omega) n Delta T hT) + +/-- A finite-support Kummer class is trivial exactly when its representative lies +in the defining subgroup. -/ +@[simp] +theorem finiteSupportKummerQuotientMk_eq_one_iff + (n : ℕ+) (Delta : KummerSubgroup K n) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ + kummerRootSet (K := K) (Omega := Omega) n Delta.1) + (a : (admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT).1) : + finiteSupportKummerQuotientMk + (K := K) (Omega := Omega) n Delta T hT a = 1 ↔ + a ∈ finiteSupportNthPowersSubgroup + (K := K) (Omega := Omega) n Delta T hT := by + change + (QuotientGroup.mk' + (finiteSupportNthPowersSubgroup + (K := K) (Omega := Omega) n Delta T hT)) a = 1 ↔ _ + exact QuotientGroup.eq_one_iff a + +/-- Equality of finite-support Kummer classes is characterized by their quotient +lying in the defining subgroup. -/ +@[simp] +theorem finiteSupportKummerQuotientMk_eq_iff + (n : ℕ+) (Delta : KummerSubgroup K n) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ + kummerRootSet (K := K) (Omega := Omega) n Delta.1) + (a b : (admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT).1) : + finiteSupportKummerQuotientMk + (K := K) (Omega := Omega) n Delta T hT a = + finiteSupportKummerQuotientMk + (K := K) (Omega := Omega) n Delta T hT b ↔ + a / b ∈ finiteSupportNthPowersSubgroup + (K := K) (Omega := Omega) n Delta T hT := by + change + (QuotientGroup.mk' + (finiteSupportNthPowersSubgroup + (K := K) (Omega := Omega) n Delta T hT)) a = + (QuotientGroup.mk' + (finiteSupportNthPowersSubgroup + (K := K) (Omega := Omega) n Delta T hT)) b ↔ _ + exact QuotientGroup.eq_iff_div_mem + +/-- Every finite-support Kummer class has a representative. -/ +theorem finiteSupportKummerQuotientMk_surjective + (n : ℕ+) (Delta : KummerSubgroup K n) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ + kummerRootSet (K := K) (Omega := Omega) n Delta.1) : + Function.Surjective + (finiteSupportKummerQuotientMk + (K := K) (Omega := Omega) n Delta T hT) := by + change Function.Surjective + (QuotientGroup.mk' + (finiteSupportNthPowersSubgroup + (K := K) (Omega := Omega) n Delta T hT)) + exact QuotientGroup.mk'_surjective _ + +/-- Eliminate a finite-support Kummer quotient through canonical +representatives. -/ +theorem finiteSupportKummerQuotient_inductionOn + (n : ℕ+) (Delta : KummerSubgroup K n) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ + kummerRootSet (K := K) (Omega := Omega) n Delta.1) + {motive : FiniteSupportKummerQuotient + (K := K) (Omega := Omega) n Delta T hT → Prop} + (q : FiniteSupportKummerQuotient + (K := K) (Omega := Omega) n Delta T hT) + (mk : ∀ a, motive (finiteSupportKummerQuotientMk + (K := K) (Omega := Omega) n Delta T hT a)) : + motive q := by + exact QuotientGroup.induction_on' q mk + +/-- Descend a homomorphism through the named finite-support quotient. -/ +def finiteSupportKummerQuotientLift {M : Type*} [Group M] + (n : ℕ+) (Delta : KummerSubgroup K n) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ + kummerRootSet (K := K) (Omega := Omega) n Delta.1) + (f : (admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT).1 →* M) + (hf : finiteSupportNthPowersSubgroup + (K := K) (Omega := Omega) n Delta T hT ≤ MonoidHom.ker f) : + FiniteSupportKummerQuotient + (K := K) (Omega := Omega) n Delta T hT →* M := + (QuotientGroup.lift + (finiteSupportNthPowersSubgroup + (K := K) (Omega := Omega) n Delta T hT) f hf).comp + (finiteSupportKummerQuotientMulEquiv + (K := K) (Omega := Omega) n Delta T hT).toMonoidHom + +/-- The finite-support quotient lift evaluates on a representative by the chosen lift. -/ +@[simp] +theorem finiteSupportKummerQuotientLift_mk {M : Type*} [Group M] + (n : ℕ+) (Delta : KummerSubgroup K n) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ + kummerRootSet (K := K) (Omega := Omega) n Delta.1) + (f : (admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT).1 →* M) + (hf : finiteSupportNthPowersSubgroup + (K := K) (Omega := Omega) n Delta T hT ≤ MonoidHom.ker f) + (a : (admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT).1) : + finiteSupportKummerQuotientLift + (K := K) (Omega := Omega) n Delta T hT f hf + (finiteSupportKummerQuotientMk + (K := K) (Omega := Omega) n Delta T hT a) = f a := + rfl + +/-- A selected root still has its `n`-th power in the enlarged admissible +subgroup `Delta₀`. -/ +theorem finiteSupportRoot_pow_from_admissibleSubgroup + (n : ℕ+) (Delta : KummerSubgroup K n) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ + kummerRootSet (K := K) (Omega := Omega) n Delta.1) + (root : T) : + ∃ a : (admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT).1, + (root.1 : Omega) ^ (n : ℕ) = algebraMap K Omega (a.1 : K) := by + let coefficient := chosenFiniteSupportCoefficient n Delta.1 T hT root + let a : (admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT).1 := + ⟨coefficient.1, Subgroup.mem_sup_right + (chosenFiniteSupportCoefficient_mem_subgroup n Delta.1 T hT root)⟩ + exact ⟨a, chosenFiniteSupportCoefficient_pow n Delta.1 T hT root⟩ + +/-- The quotient map restricted to the finitely generated coefficient +subgroup. -/ +def chosenFiniteSupportCoefficientToQuotient + (n : ℕ+) (Delta : KummerSubgroup K n) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ + kummerRootSet (K := K) (Omega := Omega) n Delta.1) : + chosenFiniteSupportCoefficientSubgroup (K := K) (Omega := Omega) n Delta.1 T hT →* + FiniteSupportKummerQuotient (K := K) (Omega := Omega) n Delta T hT := + (finiteSupportKummerQuotientMk + (K := K) (Omega := Omega) n Delta T hT).comp + (Subgroup.inclusion le_sup_right) + +/-- The finite coefficient subgroup generates `Delta₀ / Kˣⁿ`. -/ +theorem chosenFiniteSupportCoefficientToQuotient_surjective + (n : ℕ+) (Delta : KummerSubgroup K n) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ + kummerRootSet (K := K) (Omega := Omega) n Delta.1) : + Function.Surjective + (chosenFiniteSupportCoefficientToQuotient + (K := K) (Omega := Omega) n Delta T hT) := by + intro q + obtain ⟨x, rfl⟩ := finiteSupportKummerQuotientMk_surjective + (K := K) (Omega := Omega) n Delta T hT q + obtain ⟨y, hy, z, hz, hyz⟩ := Subgroup.mem_sup.1 x.property + let zH : chosenFiniteSupportCoefficientSubgroup + (K := K) (Omega := Omega) n Delta.1 T hT := ⟨z, hz⟩ + refine ⟨zH, ?_⟩ + change finiteSupportKummerQuotientMk + (K := K) (Omega := Omega) n Delta T hT + ⟨z, Subgroup.mem_sup_right hz⟩ = + finiteSupportKummerQuotientMk + (K := K) (Omega := Omega) n Delta T hT x + symm + apply (finiteSupportKummerQuotientMk_eq_iff + (K := K) (Omega := Omega) n Delta T hT _ _).2 + change (x.1 / z) ∈ unitNthPowersSubgroup K n + rw [← hyz] + simpa using hy + +/-- Every element of `Delta₀ / Kˣⁿ` is killed by `n`. -/ +theorem finiteSupportKummerQuotient_pow_eq_one + (n : ℕ+) (Delta : KummerSubgroup K n) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ + kummerRootSet (K := K) (Omega := Omega) n Delta.1) + (q : FiniteSupportKummerQuotient + (K := K) (Omega := Omega) n Delta T hT) : + q ^ (n : ℕ) = 1 := by + refine finiteSupportKummerQuotient_inductionOn + (K := K) (Omega := Omega) + (motive := fun q => q ^ (n : ℕ) = 1) + n Delta T hT q ?_ + intro x + rw [← map_pow] + apply (finiteSupportKummerQuotientMk_eq_one_iff + (K := K) (Omega := Omega) n Delta T hT (x ^ (n : ℕ))).2 + change (x.1 ^ (n : ℕ)) ∈ unitNthPowersSubgroup K n + exact ⟨x.1, rfl⟩ + +/-- The restricted radical quotient `Delta₀ / Kˣⁿ` is finite: it is a +finitely generated commutative group, generated by the selected +coefficients, and every element is killed by `n`. -/ +theorem finiteSupportKummerQuotient_finite + (n : ℕ+) (Delta : KummerSubgroup K n) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ + kummerRootSet (K := K) (Omega := Omega) n Delta.1) : + Finite (FiniteSupportKummerQuotient + (K := K) (Omega := Omega) n Delta T hT) := by + let H := chosenFiniteSupportCoefficientSubgroup + (K := K) (Omega := Omega) n Delta.1 T hT + let Q := FiniteSupportKummerQuotient + (K := K) (Omega := Omega) n Delta T hT + let : Group.FG H := by + dsimp only [H, chosenFiniteSupportCoefficientSubgroup] + exact Group.closure_finset_fg + (chosenFiniteSupportCoefficientSet + (K := K) (Omega := Omega) n Delta.1 T hT) + let : Group.FG Q := + Group.fg_of_surjective + (chosenFiniteSupportCoefficientToQuotient_surjective + (K := K) (Omega := Omega) n Delta T hT) + apply CommGroup.finite_of_fg_isMulTorsion + intro q + apply isOfFinOrder_iff_pow_eq_one.2 + exact ⟨(n : ℕ), n.pos, + finiteSupportKummerQuotient_pow_eq_one n Delta T hT q⟩ + +/-- Full admissible finite-support package extracted from one element of +`K(√[n]{Delta})`. In addition to the finite root support, it produces the +admissible subgroup `Delta₀ ≤ Delta`, power equations over `Delta₀`, and the +finiteness of `Delta₀ / Kˣⁿ`. -/ +theorem exists_admissibleFiniteKummerSupport + (n : ℕ+) (Delta : KummerSubgroup K n) {beta : Omega} + (hbeta : beta ∈ + kummerRadicalExtension (K := K) (Omega := Omega) n Delta.1) : + ∃ (T : Finset Omega) + (hT : (T : Set Omega) ⊆ + kummerRootSet (K := K) (Omega := Omega) n Delta.1), + beta ∈ IntermediateField.adjoin K (T : Set Omega) ∧ + (admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT).1 ≤ Delta.1 ∧ + (∀ root : T, + ∃ a : (admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT).1, + (root.1 : Omega) ^ (n : ℕ) = algebraMap K Omega (a.1 : K)) ∧ + Finite (FiniteSupportKummerQuotient + (K := K) (Omega := Omega) n Delta T hT) := by + obtain ⟨T, hT, hbetaT⟩ := + exists_finset_kummerRootSet_of_mem_kummerRadicalExtension n Delta.1 hbeta + refine ⟨T, hT, hbetaT, + admissibleFiniteSupportSubgroup_le n Delta T hT, ?_, + finiteSupportKummerQuotient_finite n Delta T hT⟩ + exact finiteSupportRoot_pow_from_admissibleSubgroup n Delta T hT + + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/GaloisCohomology.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/GaloisCohomology.lean new file mode 100644 index 0000000000..6f4412e277 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/GaloisCohomology.lean @@ -0,0 +1,151 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RepresentationTheory.Homological.GroupCohomology.Hilbert90 +/-! +# Galois cohomology for Kummer theory + +Hilbert 90 and multiplicative cocycle statements used by the concrete Kummer correspondence. +-/ + +@[expose] public section + +namespace KummerTheory + +open groupCohomology + +section NoetherHilbert90 + +variable {K L : Type} [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] +variable {f : Gal(L/K) → Lˣ} + +/-- Rearranged unit-valued form of Noether's Hilbert theorem 90. -/ +theorem noetherHilbert90_exists_mul (hf : IsMulCocycle₁ f) : + ∃ β : Lˣ, ∀ σ : Gal(L/K), σ • β = f σ * β := by + rcases + groupCohomology.isMulCoboundary₁_of_isMulCocycle₁_of_aut_to_units f hf with + ⟨β, hβ⟩ + refine ⟨β, ?_⟩ + intro σ + rw [← hβ σ] + exact (div_mul_cancel (σ • β) β).symm + +/-- Field-valued version of Noether's Hilbert theorem 90. -/ +theorem noetherHilbert90_exists_nonzero_div (hf : IsMulCocycle₁ f) : + ∃ β : L, β ≠ 0 ∧ ∀ σ : Gal(L/K), σ β / β = f σ := by + rcases + groupCohomology.isMulCoboundary₁_of_isMulCocycle₁_of_aut_to_units f hf with + ⟨β, hβ⟩ + refine ⟨β, Units.ne_zero β, ?_⟩ + intro σ + simpa using congrArg Units.val (hβ σ) + +/-- Rearranged field-valued form of Noether's Hilbert theorem 90. -/ +theorem noetherHilbert90_exists_nonzero_mul (hf : IsMulCocycle₁ f) : + ∃ β : L, β ≠ 0 ∧ ∀ σ : Gal(L/K), σ β = f σ * β := by + rcases noetherHilbert90_exists_nonzero_div (K := K) (L := L) hf with ⟨β, hβ0, hβ⟩ + refine ⟨β, hβ0, ?_⟩ + intro σ + have h := hβ σ + rw [div_eq_iff hβ0] at h + exact h + +end NoetherHilbert90 + +section CyclicHilbert90 + +variable {K L : Type} [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] +variable [IsGalois K L] + +/-- Cyclic Hilbert theorem 90: a norm-one element in a cyclic extension is `y / σ(y)`. -/ +theorem cyclicHilbert90_exists_div_of_norm_eq_one + {g : Gal(L/K)} (hg : ∀ σ : Gal(L/K), σ ∈ Subgroup.zpowers g) {x : L} + (hx : Algebra.norm K x = 1) : + ∃ y : Lˣ, ↑y / g ↑y = x := by + let : IsCyclic (Gal(L/K)) := + isCyclic_iff_exists_zpowers_eq_top.mpr + ⟨g, (Subgroup.eq_top_iff' (Subgroup.zpowers g)).mpr hg⟩ + exact groupCohomology.exists_div_of_norm_eq_one hg hx + +/-- Field-valued version of Cyclic Hilbert theorem 90. -/ +theorem cyclicHilbert90_exists_nonzero_div_of_norm_eq_one + {g : Gal(L/K)} (hg : ∀ σ : Gal(L/K), σ ∈ Subgroup.zpowers g) {x : L} + (hx : Algebra.norm K x = 1) : + ∃ y : L, y ≠ 0 ∧ y / g y = x := by + let : IsCyclic (Gal(L/K)) := + isCyclic_iff_exists_zpowers_eq_top.mpr + ⟨g, (Subgroup.eq_top_iff' (Subgroup.zpowers g)).mpr hg⟩ + rcases groupCohomology.exists_div_of_norm_eq_one (K := K) (L := L) hg hx with ⟨y, hy⟩ + exact ⟨y, Units.ne_zero y, hy⟩ + +/-- The `β^{σ-1}` orientation of Hilbert 90. Mathlib's +standard endpoint uses `β / σ(β)`; applying it to the inverse generator +gives the ambient-power quotient `σ(β) / β` for the specified generator. -/ +theorem cyclicHilbert90_exists_gal_div_of_norm_eq_one + {g : Gal(L/K)} (hg : ∀ σ : Gal(L/K), σ ∈ Subgroup.zpowers g) {x : L} + (hx : Algebra.norm K x = 1) : + ∃ y : Lˣ, g (y : L) / y = x := by + let : IsCyclic (Gal(L/K)) := + isCyclic_iff_exists_zpowers_eq_top.mpr + ⟨g, (Subgroup.eq_top_iff' (Subgroup.zpowers g)).mpr hg⟩ + have hg_inv : ∀ σ : Gal(L/K), σ ∈ Subgroup.zpowers g⁻¹ := by + intro σ + rw [Subgroup.zpowers_inv] + exact hg σ + rcases groupCohomology.exists_div_of_norm_eq_one + (K := K) (L := L) (g := g⁻¹) hg_inv hx with ⟨z, hz⟩ + refine ⟨g⁻¹ • z, ?_⟩ + simpa using hz + +/-- Unit-valued version of Cyclic Hilbert theorem 90. -/ +theorem cyclicHilbert90_exists_unit_div_of_norm_eq_one + {g : Gal(L/K)} (hg : ∀ σ : Gal(L/K), σ ∈ Subgroup.zpowers g) {x : Lˣ} + (hx : Algebra.norm K (x : L) = 1) : + ∃ y : Lˣ, x = y / (g • y) := by + let : IsCyclic (Gal(L/K)) := + isCyclic_iff_exists_zpowers_eq_top.mpr + ⟨g, (Subgroup.eq_top_iff' (Subgroup.zpowers g)).mpr hg⟩ + rcases groupCohomology.exists_div_of_norm_eq_one (K := K) (L := L) hg hx with ⟨y, hy⟩ + refine ⟨y, ?_⟩ + ext + simpa using hy.symm + +/-- Rearranged unit-valued version of Cyclic Hilbert theorem 90. -/ +theorem cyclicHilbert90_exists_unit_mul_gal_of_norm_eq_one + {g : Gal(L/K)} (hg : ∀ σ : Gal(L/K), σ ∈ Subgroup.zpowers g) {x : Lˣ} + (hx : Algebra.norm K (x : L) = 1) : + ∃ y : Lˣ, x * (g • y) = y := by + rcases cyclicHilbert90_exists_unit_div_of_norm_eq_one (K := K) (L := L) hg hx with ⟨y, hy⟩ + refine ⟨y, ?_⟩ + rw [hy] + exact div_mul_cancel y (g • y) + +end CyclicHilbert90 + +section IntegralHilbert90 + +variable {K L : Type} [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] +variable [IsGalois K L] +variable {A B : Type*} [CommRing A] [CommRing B] +variable [Algebra A B] [Algebra A L] [Algebra A K] [Algebra B L] +variable [IsScalarTower A B L] [IsScalarTower A K L] [IsFractionRing A K] +variable [IsDomain A] [IsIntegralClosure B A L] + +/-- Integral Hilbert 90 for a cyclic Galois extension. -/ +theorem cyclicHilbert90_exists_mul_galRestrict_of_norm_eq_one + {g : Gal(L/K)} (hg : ∀ σ : Gal(L/K), σ ∈ Subgroup.zpowers g) {η : B} + (hη : Algebra.norm K ((algebraMap B L) η) = 1) : + ∃ ε : B, ε ≠ 0 ∧ η * ((galRestrict A K L B) g) ε = ε := by + let : IsCyclic (Gal(L/K)) := + isCyclic_iff_exists_zpowers_eq_top.mpr + ⟨g, (Subgroup.eq_top_iff' (Subgroup.zpowers g)).mpr hg⟩ + exact groupCohomology.exists_mul_galRestrict_of_norm_eq_one hg hη + +end IntegralHilbert90 + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteContinuity.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteContinuity.lean new file mode 100644 index 0000000000..53d1e5441b --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteContinuity.lean @@ -0,0 +1,218 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Topology.Algebra.ContinuousMonoidHom +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteCharacterEquiv +/-! +# continuity of Kummer characters for infinite extensions + +For an infinite Galois extension `Ω/K`, a Kummer character attached to a +chosen root `β` is already determined on the finite Galois normal closure of +`K(β)`. Equivalently, its kernel contains the fixing subgroup of that finite +Galois intermediate field. This makes the kernel open in the Krull topology +and proves continuity into the discrete group of `n`-th roots of unity. + +The final construction descends these continuous characters through the +ambient-power quotient `Δ / (Δ ∩ Kˣⁿ)`. No surjectivity or lattice correspondence is +asserted here. +-/ + +@[expose] public section + +noncomputable +section + +namespace KummerTheory + +open scoped Topology +open Filter + +/-- The group `μₙ(L)` equipped explicitly with the discrete topology used for +continuous characters in the infinite form of the finite Kummer character equivalence. -/ +def DiscreteNthRootsSubgroup (L : Type*) [Field L] (n : ℕ) := + nthRootsSubgroup L n + +namespace DiscreteNthRootsSubgroup + +variable (L : Type*) [Field L] (n : ℕ) + +/-- The discrete copy of the roots-of-unity subgroup retains its commutative group structure. -/ +instance : CommGroup (DiscreteNthRootsSubgroup L n) := + inferInstanceAs (CommGroup (nthRootsSubgroup L n)) + +/-- The discrete roots-of-unity copy is equipped with the bottom topology. -/ +instance : TopologicalSpace (DiscreteNthRootsSubgroup L n) := ⊥ + +/-- The bottom topology makes the roots-of-unity copy discrete. -/ +instance : DiscreteTopology (DiscreteNthRootsSubgroup L n) := + discreteTopology_bot _ + +end DiscreteNthRootsSubgroup + +section InfiniteKummerContinuity + +variable {K Ω : Type*} [Field K] [Field Ω] [Algebra K Ω] + +/-- The Kummer root character with codomain given its intended discrete +topology. -/ +def infiniteKummerRootCharacter + (n : ℕ+) (hmu : NthRootsOfUnityInBase (K := K) (L := Ω) n) + (a : (chosenFiniteKummerRadicalDatum (K := K) (L := Ω) n).carrier) : + Gal(Ω/K) →* DiscreteNthRootsSubgroup Ω (n : ℕ) := + (chosenFiniteKummerRadicalDatum (K := K) (L := Ω) n).rootCharacterToMuWithoutSection + a (nthRootsOfUnity_fixed (K := K) (L := Ω) n hmu) + +/-- The infinite Kummer root character evaluates by the usual Galois ratio. -/ +@[simp] theorem infiniteKummerRootCharacter_apply + (n : ℕ+) (hmu : NthRootsOfUnityInBase (K := K) (L := Ω) n) + (a : (chosenFiniteKummerRadicalDatum (K := K) (L := Ω) n).carrier) + (σ : Gal(Ω/K)) : + infiniteKummerRootCharacter n hmu a σ = + (chosenFiniteKummerRadicalDatum (K := K) (L := Ω) n).rootCharacterToMuWithoutSection + a (nthRootsOfUnity_fixed (K := K) (L := Ω) n hmu) σ := + rfl + +variable [IsGalois K Ω] + +/-- The fixing subgroup of the finite Galois normal closure of the chosen +root lies in the kernel of its Kummer character. -/ +theorem fixingSubgroup_adjoin_root_le_infiniteKummerRootCharacter_ker + (n : ℕ+) (hmu : NthRootsOfUnityInBase (K := K) (L := Ω) n) + (a : (chosenFiniteKummerRadicalDatum (K := K) (L := Ω) n).carrier) : + (FiniteGaloisIntermediateField.adjoin K + {((chosenFiniteKummerRadicalDatum (K := K) (L := Ω) n).root a : Ω)}).fixingSubgroup ≤ + MonoidHom.ker (infiniteKummerRootCharacter n hmu a) := by + let D := chosenFiniteKummerRadicalDatum (K := K) (L := Ω) n + let E := FiniteGaloisIntermediateField.adjoin K {(D.root a : Ω)} + intro σ hσ + rw [MonoidHom.mem_ker] + apply Subtype.ext + change D.rootCharacter a + (nthRootsOfUnity_fixed (K := K) (L := Ω) n hmu) σ = 1 + rw [D.rootCharacter_apply] + apply (rootQuotient_eq_one_iff (K := K) (L := Ω) (D.root a) σ).2 + apply Units.ext + exact ((IntermediateField.mem_fixingSubgroup_iff E.toIntermediateField σ).mp hσ) + (D.root a : Ω) + (FiniteGaloisIntermediateField.subset_adjoin K {(D.root a : Ω)} + (Set.mem_singleton (D.root a : Ω))) + +/-- The kernel of an infinite Kummer root character is open in the Krull +topology. -/ +theorem infiniteKummerRootCharacter_isOpen_ker + (n : ℕ+) (hmu : NthRootsOfUnityInBase (K := K) (L := Ω) n) + (a : (chosenFiniteKummerRadicalDatum (K := K) (L := Ω) n).carrier) : + IsOpen (MonoidHom.ker (infiniteKummerRootCharacter n hmu a) : + Set Gal(Ω/K)) := by + exact Subgroup.isOpen_mono + (fixingSubgroup_adjoin_root_le_infiniteKummerRootCharacter_ker n hmu a) + (IntermediateField.fixingSubgroup_isOpen + (FiniteGaloisIntermediateField.adjoin K + {((chosenFiniteKummerRadicalDatum (K := K) (L := Ω) n).root a : Ω)}).toIntermediateField) + +/-- Every Kummer root character for an infinite actual-field Galois extension +is continuous into the discrete group `μₙ(Ω)`. -/ +theorem infiniteKummerRootCharacter_continuous + (n : ℕ+) (hmu : NthRootsOfUnityInBase (K := K) (L := Ω) n) + (a : (chosenFiniteKummerRadicalDatum (K := K) (L := Ω) n).carrier) : + Continuous (infiniteKummerRootCharacter n hmu a) := by + apply continuous_of_continuousAt_one (infiniteKummerRootCharacter n hmu a) + rw [ContinuousAt, map_one] + rw [show (𝓝 : DiscreteNthRootsSubgroup Ω (n : ℕ) → + Filter (DiscreteNthRootsSubgroup Ω (n : ℕ))) = pure from nhds_discrete _, + tendsto_pure] + exact (infiniteKummerRootCharacter_isOpen_ker n hmu a).mem_nhds (by simp) + +/-- The continuous Kummer character attached to one radical element. -/ +def infiniteKummerContinuousRootCharacter + (n : ℕ+) (hmu : NthRootsOfUnityInBase (K := K) (L := Ω) n) + (a : (chosenFiniteKummerRadicalDatum (K := K) (L := Ω) n).carrier) : + Gal(Ω/K) →ₜ* DiscreteNthRootsSubgroup Ω (n : ℕ) := + ⟨infiniteKummerRootCharacter n hmu a, + infiniteKummerRootCharacter_continuous n hmu a⟩ + +/-- Radical elements map multiplicatively to continuous Kummer characters. -/ +def infiniteKummerContinuousCharacter + (n : ℕ+) (hmu : NthRootsOfUnityInBase (K := K) (L := Ω) n) : + (chosenFiniteKummerRadicalDatum (K := K) (L := Ω) n).carrier →* + (Gal(Ω/K) →ₜ* DiscreteNthRootsSubgroup Ω (n : ℕ)) where + toFun := infiniteKummerContinuousRootCharacter n hmu + map_one' := by + apply ContinuousMonoidHom.ext + intro σ + exact congrArg + (fun χ : Gal(Ω/K) →* nthRootsSubgroup Ω (n : ℕ) => χ σ) + (map_one + ((chosenFiniteKummerRadicalDatum (K := K) (L := Ω) n).kummerCharacterWithoutSection + (nthRootsOfUnity_fixed (K := K) (L := Ω) n hmu))) + map_mul' := by + intro a b + apply ContinuousMonoidHom.ext + intro σ + exact congrArg + (fun χ : Gal(Ω/K) →* nthRootsSubgroup Ω (n : ℕ) => χ σ) + (map_mul + ((chosenFiniteKummerRadicalDatum (K := K) (L := Ω) n).kummerCharacterWithoutSection + (nthRootsOfUnity_fixed (K := K) (L := Ω) n hmu)) a b) + +/-- The infinite continuous Kummer character map on the ambient-power quotient +`Δ / (Δ ∩ Kˣⁿ)`. This is the canonical map; surjectivity is not asserted, +and injectivity is proved below from the existing algebraic kernel result. -/ +def infiniteKummerContinuousQuotientCharacter + (n : ℕ+) (hmu : NthRootsOfUnityInBase (K := K) (L := Ω) n) : + (chosenFiniteKummerRadicalDatum (K := K) (L := Ω) n).RadicalQuotient →* + (Gal(Ω/K) →ₜ* DiscreteNthRootsSubgroup Ω (n : ℕ)) := + (chosenFiniteKummerRadicalDatum (K := K) (L := Ω) n).radicalQuotientLift + (infiniteKummerContinuousCharacter n hmu) + (by + let D := chosenFiniteKummerRadicalDatum (K := K) (L := Ω) n + let hfixed := nthRootsOfUnity_fixed (K := K) (L := Ω) n hmu + intro a ha + change infiniteKummerContinuousRootCharacter n hmu a = 1 + apply ContinuousMonoidHom.ext + intro σ + have hker : D.kummerCharacterWithoutSection hfixed a = 1 := + D.ambientNthPowersSubgroup_le_ker hfixed ha + exact congrArg + (fun χ : Gal(Ω/K) →* nthRootsSubgroup Ω (n : ℕ) => χ σ) hker) + +/-- Forgetting continuity recovers the previously constructed algebraic +Kummer character on the same ambient-power quotient. -/ +theorem infiniteKummerContinuousQuotientCharacter_toMonoidHom + (n : ℕ+) (hmu : NthRootsOfUnityInBase (K := K) (L := Ω) n) + (q : (chosenFiniteKummerRadicalDatum (K := K) (L := Ω) n).RadicalQuotient) : + (infiniteKummerContinuousQuotientCharacter n hmu q).toMonoidHom = + (chosenFiniteKummerRadicalDatum (K := K) (L := Ω) n).quotientKummerCharacterWithoutSection + (nthRootsOfUnity_fixed (K := K) (L := Ω) n hmu) q := by + let D := chosenFiniteKummerRadicalDatum (K := K) (L := Ω) n + obtain ⟨a, rfl⟩ := D.radicalQuotientMk_surjective q + apply MonoidHom.ext + intro σ + rfl + +/-- The continuous character map on the ambient-power quotient is injective. This is +the existing algebraic kernel computation with the continuity structure +forgotten; it does not use or assert surjectivity. -/ +theorem infiniteKummerContinuousQuotientCharacter_injective + (n : ℕ+) (hmu : NthRootsOfUnityInBase (K := K) (L := Ω) n) : + Function.Injective (infiniteKummerContinuousQuotientCharacter n hmu) := by + let D := chosenFiniteKummerRadicalDatum (K := K) (L := Ω) n + let hfixed := nthRootsOfUnity_fixed (K := K) (L := Ω) n hmu + intro q r hqr + apply D.quotientKummerCharacterWithoutSection_injective hfixed + have hforget := congrArg + (fun χ : Gal(Ω/K) →ₜ* DiscreteNthRootsSubgroup Ω (n : ℕ) => χ.toMonoidHom) hqr + change (infiniteKummerContinuousQuotientCharacter n hmu q).toMonoidHom = + (infiniteKummerContinuousQuotientCharacter n hmu r).toMonoidHom at hforget + rw [infiniteKummerContinuousQuotientCharacter_toMonoidHom n hmu q, + infiniteKummerContinuousQuotientCharacter_toMonoidHom n hmu r] at hforget + exact hforget + +end InfiniteKummerContinuity + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteGeneration.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteGeneration.lean new file mode 100644 index 0000000000..b892c3e086 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteGeneration.lean @@ -0,0 +1,84 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration +/-! +# infinite actual-field form + +For an arbitrary Galois extension `Ω/K`, each element of `Ω` lies in a +finite Galois intermediate field. If the full Galois group is abelian and +killed by `n`, restriction gives the same two properties at that finite +stage. The finite actual-field case of the Kummer generation theorem then shows that the +element belongs to the field generated by the global `n`-th radicals. + +This is the actual-field `n`-th-power case. It does not claim the general +abstract-operator statement of the Kummer generation theorem. +-/ + +@[expose] public section + +noncomputable +section + +namespace KummerTheory + +open scoped IsMulCommutative + +variable {K Ω : Type*} [Field K] [Field Ω] [Algebra K Ω] + +/-- The Kummer generation theorem for a possibly infinite actual-field +Galois extension and the `n`-th-power operator. + +The finite-stage abelian and exponent hypotheses are derived through the +surjective restriction map; they are not supplied as extra assumptions. -/ +theorem kummerRootSet_adjoin_eq_top + [IsGalois K Ω] [IsMulCommutative Gal(Ω/K)] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hexponent : ∀ σ : Gal(Ω/K), σ ^ (n : ℕ) = 1) : + IntermediateField.adjoin K (finiteKummerRootSet (K := K) (L := Ω) n) = ⊤ := by + let U : IntermediateField K Ω := + IntermediateField.adjoin K (finiteKummerRootSet (K := K) (L := Ω) n) + apply top_unique + intro x _ + let E : FiniteGaloisIntermediateField K Ω := + FiniteGaloisIntermediateField.adjoin K {x} + let res : Gal(Ω/K) →* Gal(E/K) := AlgEquiv.restrictNormalHom E + have hres_surjective : Function.Surjective res := + AlgEquiv.restrictNormalHom_surjective Ω + let : IsMulCommutative Gal(E/K) := + { is_comm := ⟨fun σ τ => by + obtain ⟨σ', rfl⟩ := hres_surjective σ + obtain ⟨τ', rfl⟩ := hres_surjective τ + rw [← map_mul, mul_comm σ' τ', map_mul]⟩ } + have hE_exponent : ∀ σ : Gal(E/K), σ ^ (n : ℕ) = 1 := by + intro σ + obtain ⟨σ', rfl⟩ := hres_surjective σ + rw [← map_pow, hexponent σ', map_one] + have hE_generation : + IntermediateField.adjoin K (finiteKummerRootSet (K := K) (L := E) n) = ⊤ := + finiteKummerRootSet_adjoin_eq_top + (K := K) (L := E) n hmu hE_exponent + have hroot_subset : finiteKummerRootSet (K := K) (L := E) n ⊆ U.comap E.val := by + intro β hβ + change (β : Ω) ∈ U + apply IntermediateField.subset_adjoin K + (finiteKummerRootSet (K := K) (L := Ω) n) + refine ⟨?_, ?_⟩ + · exact (map_ne_zero E.val).2 hβ.1 + · obtain ⟨a, ha⟩ := hβ.2 + refine ⟨a, ?_⟩ + simpa using congrArg E.val ha + have htop_le : (⊤ : IntermediateField K E) ≤ U.comap E.val := by + rw [← hE_generation] + exact IntermediateField.adjoin_le_iff.mpr hroot_subset + let xE : E := + ⟨x, FiniteGaloisIntermediateField.subset_adjoin K {x} (Set.mem_singleton x)⟩ + have hxE : xE ∈ U.comap E.val := htop_le (Set.mem_univ xE) + exact hxE + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteInverse.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteInverse.lean new file mode 100644 index 0000000000..f5ccbb37f5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteInverse.lean @@ -0,0 +1,270 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteSupport +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RestrictedFinite +/-! +# infinite inverse inclusion + +Any radical appearing in `K(√[n]{Δ})` uses only finitely many of the +adjoined roots. The corresponding admissible finite-support subgroup +`Δ₀ ≤ Δ` gives a finite Galois Kummer stage. Applying the finite inverse +theorem at that stage shows that the original radical already belongs to +`Δ₀`, hence to `Δ`. +-/ + +@[expose] public section + +noncomputable +section + +namespace KummerTheory + +variable {K Omega : Type*} [Field K] [Field Omega] [Algebra K Omega] + +section FiniteSupportField + +variable (n : ℕ+) (Delta : KummerSubgroup K n) (T : Finset Omega) + (hT : (T : Set Omega) ⊆ + kummerRootSet (K := K) (Omega := Omega) n Delta.1) + +/-- The finite field generated by the selected radical roots. -/ +def finiteSupportField : IntermediateField K Omega := + IntermediateField.adjoin K (T : Set Omega) + +/-- The admissible finite-support subgroup has all of its prescribed roots +in the field generated by `T`. -/ +theorem admissibleFiniteSupportSubgroup_le_finiteKummerRadicalSubgroup : + (admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT).1 ≤ + finiteKummerRadicalSubgroup + (K := K) (L := finiteSupportField (K := K) T) n := by + apply sup_le + · intro a ha + obtain ⟨b, hb⟩ := (mem_unitNthPowersSubgroup_iff n).1 ha + refine ⟨Units.map + (algebraMap K (finiteSupportField (K := K) T)).toMonoidHom b, ?_⟩ + rw [← map_pow, hb] + · rw [chosenFiniteSupportCoefficientSubgroup, Subgroup.closure_le] + intro a ha + change a ∈ chosenFiniteSupportCoefficientSet + (K := K) (Omega := Omega) n Delta.1 T hT at ha + classical + rw [chosenFiniteSupportCoefficientSet] at ha + obtain ⟨root, _, rfl⟩ := Finset.mem_image.1 ha + let rootL : finiteSupportField (K := K) T := + ⟨root.1, IntermediateField.subset_adjoin K (T : Set Omega) root.property⟩ + have hroot_ne : rootL ≠ 0 := by + intro hzero + apply kummerRootSet_ne_zero n Delta.1 (hT root.property) + exact congrArg Subtype.val hzero + refine ⟨Units.mk0 rootL hroot_ne, ?_⟩ + apply Units.ext + apply Subtype.ext + exact chosenFiniteSupportCoefficient_pow n Delta.1 T hT root + +/-- A finite set of integral radical roots generates a finite-dimensional +extension. -/ +theorem finiteSupportField_finiteDimensional : + ((T : Set Omega) ⊆ + kummerRootSet (K := K) (Omega := Omega) n Delta.1) → + FiniteDimensional K (finiteSupportField (K := K) T) := by + intro hT' + apply IntermediateField.finiteDimensional_adjoin + intro root hroot + apply IsIntegral.of_pow n.pos + obtain ⟨a, ha⟩ := hT' hroot + rw [ha] + exact isIntegral_algebraMap + +/-- Every global root belonging to the finite-support subgroup already lies +in the field generated by `T`. The ratio with a root in that field is an +`n`-th root of unity and hence lies in `K`. -/ +theorem kummerRootSet_admissibleFiniteSupport_subset + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + kummerRootSet (K := K) (Omega := Omega) n + (admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT).1 ≤ + finiteSupportField (K := K) T := by + intro beta hbeta + let Delta0 := admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT + let L0 := finiteSupportField (K := K) T + have hbeta_ne : beta ≠ 0 := + kummerRootSet_ne_zero n Delta0.1 hbeta + obtain ⟨a, hbeta_pow⟩ := hbeta + have ha_radical : a.1 ∈ finiteKummerRadicalSubgroup (K := K) (L := L0) n := + admissibleFiniteSupportSubgroup_le_finiteKummerRadicalSubgroup n Delta T hT a.property + obtain ⟨gamma, hgamma_pow⟩ := ha_radical + let gammaOmega : Omegaˣ := Units.map L0.val.toMonoidHom gamma + let betaUnit : Omegaˣ := Units.mk0 beta hbeta_ne + have hbetaUnit_pow : betaUnit ^ (n : ℕ) = + Units.map (algebraMap K Omega).toMonoidHom a.1 := by + apply Units.ext + exact hbeta_pow + have hgammaOmega_pow : gammaOmega ^ (n : ℕ) = + Units.map (algebraMap K Omega).toMonoidHom a.1 := by + apply Units.ext + exact congrArg L0.val (congrArg Units.val hgamma_pow) + have hratio_pow : (betaUnit / gammaOmega) ^ (n : ℕ) = 1 := by + rw [div_pow, hbetaUnit_pow, hgammaOmega_pow] + exact div_self' _ + let hbase : NthRootsOfUnityInBase (K := K) (L := Omega) n := + nthRootsOfUnityInBase_of_primitiveRoots + (K := K) (L := Omega) n hmu + obtain ⟨zeta, hzeta⟩ := hbase (betaUnit / gammaOmega) hratio_pow + have hbeta_eq : betaUnit = + Units.map (algebraMap K Omega).toMonoidHom zeta * gammaOmega := by + rw [hzeta] + exact (div_mul_cancel betaUnit gammaOmega).symm + have hbeta_val := congrArg Units.val hbeta_eq + change (betaUnit : Omega) ∈ L0 + rw [hbeta_val] + exact L0.mul_mem (L0.algebraMap_mem (zeta : K)) gamma.1.property + +/-- The full radical extension attached to the finite-support subgroup is +exactly the field generated by the selected roots. -/ +theorem kummerRadicalExtension_admissibleFiniteSupport_eq + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + kummerRadicalExtension (K := K) (Omega := Omega) n + (admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT).1 = + finiteSupportField (K := K) T := by + apply le_antisymm + · exact IntermediateField.adjoin_le_iff.mpr + (kummerRootSet_admissibleFiniteSupport_subset n Delta T hT hmu) + · apply IntermediateField.adjoin_le_iff.mpr + intro root hroot + apply IntermediateField.subset_adjoin K + exact finiteSupportRoot_pow_from_admissibleSubgroup n Delta T hT ⟨root, hroot⟩ + +/-- Over a separable closure, the finite-support field is Galois. -/ +theorem finiteSupportField_isGalois + [IsSepClosure K Omega] + (hT' : (T : Set Omega) ⊆ + kummerRootSet (K := K) (Omega := Omega) n Delta.1) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + IsGalois K (finiteSupportField (K := K) T) := by + rw [← kummerRadicalExtension_admissibleFiniteSupport_eq n Delta T hT' hmu] + exact kummerRadicalExtension_isGalois n + (admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT').1 + +/-- The internal Kummer root set of the finite-support subgroup generates +the finite-support field. -/ +theorem finiteSupportField_internalRoots_adjoin_eq_top : + IntermediateField.adjoin K + (kummerRootSet + (K := K) (Omega := finiteSupportField (K := K) T) n + (admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT).1) = ⊤ := by + let L0 := finiteSupportField (K := K) T + let R : IntermediateField K L0 := IntermediateField.adjoin K + (kummerRootSet (K := K) (Omega := L0) n + (admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT).1) + apply top_unique + intro x _ + have hall : ∀ y : Omega, ∀ hy : y ∈ L0, (⟨y, hy⟩ : L0) ∈ R := by + intro y hy + change y ∈ IntermediateField.adjoin K (T : Set Omega) at hy + induction hy using IntermediateField.adjoin_induction with + | mem root hroot => + apply IntermediateField.subset_adjoin K + obtain ⟨a, ha⟩ := + finiteSupportRoot_pow_from_admissibleSubgroup n Delta T hT ⟨root, hroot⟩ + refine ⟨a, ?_⟩ + apply Subtype.ext + exact ha + | algebraMap a => exact R.algebraMap_mem a + | add x y hx hy ihx ihy => exact R.add_mem ihx ihy + | inv x hx ihx => exact R.inv_mem ihx + | mul x y hx hy ihx ihy => exact R.mul_mem ihx ihy + exact hall x.1 x.property + +end FiniteSupportField + +section InfiniteInverse + +variable [IsSepClosure K Omega] + +/-- **the Kummer correspondence, inverse inclusion for an arbitrary admissible +subgroup.** Any base-field radical in `K(√[n]{Delta})` is already in +`Delta`. The root is first descended to a finite-support Kummer stage, +where the finite inverse theorem applies. -/ +theorem finiteKummerRadicalSubgroup_kummerRadicalExtension_le + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) : + finiteKummerRadicalSubgroup + (K := K) + (L := kummerRadicalExtension + (K := K) (Omega := Omega) n Delta.1) n ≤ + Delta.1 := by + intro a ha + let E := kummerRadicalExtension + (K := K) (Omega := Omega) n Delta.1 + obtain ⟨betaE, hbetaE_pow⟩ := ha + let beta : Omega := (betaE.1 : Omega) + have hbeta_mem : beta ∈ E := betaE.1.property + obtain ⟨T, hT, hbetaT, hDelta0, _, _⟩ := + exists_admissibleFiniteKummerSupport n Delta hbeta_mem + let L0 := finiteSupportField (K := K) T + let Delta0 := admissibleFiniteSupportSubgroup + (K := K) (Omega := Omega) n Delta T hT + let betaL0 : L0 := ⟨beta, hbetaT⟩ + have hbeta_ne : beta ≠ 0 := by + intro hzero + apply betaE.ne_zero + apply Subtype.ext + exact hzero + have hbetaL0_ne : betaL0 ≠ 0 := by + intro hzero + apply hbeta_ne + exact congrArg Subtype.val hzero + have haL0 : a ∈ finiteKummerRadicalSubgroup (K := K) (L := L0) n := by + refine ⟨Units.mk0 betaL0 hbetaL0_ne, ?_⟩ + apply Units.ext + apply Subtype.ext + have hpowOmega := congrArg E.val (congrArg Units.val hbetaE_pow) + change beta ^ (n : ℕ) = algebraMap K Omega (a : K) + simpa [beta, E] using hpowOmega + let : FiniteDimensional K L0 := + finiteSupportField_finiteDimensional n Delta T hT + let : IsGalois K L0 := + finiteSupportField_isGalois n Delta T hT hmu + have hradical : + finiteKummerRadicalSubgroup (K := K) (L := L0) n = Delta0.1 := + finiteKummerRadicalSubgroup_eq_of_adjoin + (K := K) (L := L0) n hmu Delta0 + (admissibleFiniteSupportSubgroup_le_finiteKummerRadicalSubgroup n Delta T hT) + (finiteSupportField_internalRoots_adjoin_eq_top n Delta T hT) + apply hDelta0 + rw [← hradical] + exact haL0 + +/-- **the Kummer correspondence, subgroup round trip.** Under the standard +characteristic and roots-of-unity hypotheses, adjoining all prescribed +radicals and then taking the actual radical subgroup recovers `Delta`. -/ +theorem finiteKummerRadicalSubgroup_kummerRadicalExtension_eq + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) : + finiteKummerRadicalSubgroup + (K := K) + (L := kummerRadicalExtension + (K := K) (Omega := Omega) n Delta.1) n = + Delta.1 := by + apply le_antisymm + · exact finiteKummerRadicalSubgroup_kummerRadicalExtension_le + n hmu Delta + · exact le_finiteKummerRadicalSubgroup_kummerRadicalExtension + n hn Delta.1 + +end InfiniteInverse + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/KummerCorrespondenceFormula.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/KummerCorrespondenceFormula.lean new file mode 100644 index 0000000000..12484c2bd4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/KummerCorrespondenceFormula.lean @@ -0,0 +1,513 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Profinite +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.ExtensionRoundTrip +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteInverse +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteContinuity +/-! +# the Kummer pairing formula + +For `E = K(√[n]{Delta})`, this file packages the canonical transposed +Kummer pairing + +`Gal(E/K) → Hom(Delta / Kˣⁿ, mu_n(E))`. + +Its Galois-side injectivity is obtained from the fact that the internal +Kummer roots generate `E`; this generation statement is proved below from +the definition of `kummerRadicalExtension` rather than assumed. + +For surjectivity, finitely many character coordinates are factored through +the quotient by their common open kernel. Finite roots-of-unity duality +solves that finite problem, and compactness of the profinite Galois group +then supplies one automorphism solving all coordinates simultaneously. +-/ + +@[expose] public section + +noncomputable +section + +namespace KummerTheory + +open scoped IsMulCommutative + +variable {K Omega : Type*} [Field K] [Field Omega] [Algebra K Omega] + +/-- The roots belonging to `Delta`, regarded inside their radical +extension, generate that extension. -/ +theorem kummerRadicalExtension_internalRoots_adjoin_eq_top + (n : ℕ+) (Delta : KummerSubgroup K n) : + IntermediateField.adjoin K + (kummerRootSet + (K := K) + (Omega := kummerRadicalExtension + (K := K) (Omega := Omega) n Delta.1) + n Delta.1) = ⊤ := by + let E := kummerRadicalExtension + (K := K) (Omega := Omega) n Delta.1 + let R : IntermediateField K E := IntermediateField.adjoin K + (kummerRootSet (K := K) (Omega := E) n Delta.1) + apply top_unique + intro x _ + have hall : ∀ y : Omega, ∀ hy : y ∈ E, (⟨y, hy⟩ : E) ∈ R := by + intro y hy + change y ∈ IntermediateField.adjoin K + (kummerRootSet (K := K) (Omega := Omega) n Delta.1) at hy + induction hy using IntermediateField.adjoin_induction with + | mem beta hbeta => + apply IntermediateField.subset_adjoin K + obtain ⟨a, ha⟩ := hbeta + refine ⟨a, ?_⟩ + apply Subtype.ext + exact ha + | algebraMap a => exact R.algebraMap_mem a + | add x y hx hy ihx ihy => exact R.add_mem ihx ihy + | inv x hx ihx => exact R.inv_mem ihx + | mul x y hx hy ihx ihy => exact R.mul_mem ihx ihy + exact hall x.1 x.property + +/-- The finite restricted pairing is perfect also in the transposed +direction. Both exponent and commutativity of the finite Galois group are +derived from injectivity of the canonical transpose; neither is an extra +hypothesis. -/ +def restrictedKummerTransposeMulEquivOfAdjoin + {L : Type*} [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) + (hDelta : Delta.1 ≤ + finiteKummerRadicalSubgroup (K := K) (L := L) n) + (hgenerate : IntermediateField.adjoin K + (kummerRootSet (K := K) (Omega := L) n Delta.1) = ⊤) : + Gal(L/K) ≃* + (RestrictedRadicalQuotient n Delta →* + nthRootsSubgroup L (n : ℕ)) := by + let t₀ := restrictedKummerTranspose n hmu Delta hDelta + have ht₀ : Function.Injective t₀ := + restrictedKummerTranspose_injective_of_adjoin + n hmu Delta hDelta hgenerate + have hcomm : ∀ sigma tau : Gal(L/K), sigma * tau = tau * sigma := by + intro sigma tau + apply ht₀ + rw [map_mul, map_mul, mul_comm] + letI : IsMulCommutative Gal(L/K) := + { is_comm := ⟨hcomm⟩ } + letI : CommGroup Gal(L/K) := by infer_instance + let t := restrictedKummerTranspose n hmu Delta hDelta + have ht : Function.Injective t := + restrictedKummerTranspose_injective_of_adjoin + n hmu Delta hDelta hgenerate + have hexponent : ∀ sigma : Gal(L/K), sigma ^ (n : ℕ) = 1 := by + intro sigma + apply ht + rw [map_pow, map_one] + apply MonoidHom.ext + intro q + apply Subtype.ext + exact (t sigma q).2 + let e := restrictedKummerCharacterMulEquivOfAdjoin + n hmu Delta hDelta hgenerate + exact transposeCharacterMulEquiv + (K := K) (L := L) (G := Gal(L/K)) + (R := RestrictedRadicalQuotient n Delta) + n hmu hexponent e + +/-- A finite set of coordinates of a nondegenerate continuous pairing is +simultaneously realizable. The proof forms the finite quotient of the +compact source by the common open kernel and applies finite roots-of-unity +duality to that quotient and to the subgroup generated by the coordinates. +-/ +theorem exists_pairing_element_matching_finset + {G R L : Type*} [Field L] [Algebra K L] + [CommGroup G] [TopologicalSpace G] [IsTopologicalGroup G] + [CompactSpace G] [CommGroup R] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (hRexponent : ∀ r : R, r ^ (n : ℕ) = 1) + (f : R →* (G →* DiscreteNthRootsSubgroup L (n : ℕ))) + (t : G →* (R →* DiscreteNthRootsSubgroup L (n : ℕ))) + (hpair : ∀ g r, t g r = f r g) + (hf : Function.Injective f) + (hcontinuous : ∀ r, + Continuous (fun g : G => f r g)) + (S : Finset R) + (chi : R →* DiscreteNthRootsSubgroup L (n : ℕ)) : + ∃ g : G, ∀ r ∈ S, t g r = chi r := by + let H : Subgroup G := ⨅ r : S, MonoidHom.ker (f r.1) + have hHopen : IsOpen (H : Set G) := by + dsimp only [H] + rw [Subgroup.coe_iInf] + change IsOpen (⋂ r : S, (MonoidHom.ker (f r.1) : Set G)) + apply isOpen_iInter_of_finite + intro r + rw [MonoidHom.coe_ker] + exact (isOpen_discrete ({1} : + Set (DiscreteNthRootsSubgroup L (n : ℕ)))).preimage + (hcontinuous r.1) + let : H.Normal := H.normal_of_isMulCommutative + let Q := G ⧸ H + let : Finite Q := H.quotient_finite_of_isOpen hHopen + let R0 := Subgroup.closure (S : Set R) + have hR0exponent : ∀ r : R0, r ^ (n : ℕ) = 1 := by + intro r + apply Subtype.ext + exact hRexponent r.1 + let : Finite R0 := CommGroup.finite_of_fg_isMulTorsion (G := R0) (fun r => + isOfFinOrder_iff_pow_eq_one.mpr ⟨(n : ℕ), n.pos, hR0exponent r⟩) + have hHker (r : R0) : H ≤ MonoidHom.ker (f r.1) := by + intro g hg + have hclosure : R0 ≤ MonoidHom.ker (t g) := by + rw [Subgroup.closure_le] + intro x hx + change t g x = 1 + rw [hpair] + exact (show g ∈ MonoidHom.ker (f x) from + (iInf_le (fun r : S => MonoidHom.ker (f r.1)) ⟨x, hx⟩) hg) + rw [MonoidHom.mem_ker, ← hpair] + exact hclosure r.property + let f0 : R0 →* (Q →* DiscreteNthRootsSubgroup L (n : ℕ)) := + { toFun := fun r => QuotientGroup.lift H (f r.1) (hHker r) + map_one' := by + apply MonoidHom.ext + intro q + obtain ⟨g, rfl⟩ := QuotientGroup.mk'_surjective H q + simp + map_mul' := by + intro r s + apply MonoidHom.ext + intro q + obtain ⟨g, rfl⟩ := QuotientGroup.mk'_surjective H q + simp } + have hf0 : Function.Injective f0 := by + intro r s hrs + apply Subtype.ext + apply hf + apply MonoidHom.ext + intro g + have hvalue := DFunLike.congr_fun hrs (QuotientGroup.mk' H g) + exact hvalue + let t0 : Q →* (R0 →* DiscreteNthRootsSubgroup L (n : ℕ)) := + { toFun := fun q => + { toFun := fun r => f0 r q + map_one' := by simp + map_mul' := by intro r s; exact DFunLike.congr_fun (map_mul f0 r s) q } + map_one' := by + apply MonoidHom.ext + intro r + exact map_one (f0 r) + map_mul' := by + intro q p + apply MonoidHom.ext + intro r + exact map_mul (f0 r) q p } + have ht0 : Function.Injective t0 := by + intro q p hqp + obtain ⟨g, rfl⟩ := QuotientGroup.mk'_surjective H q + obtain ⟨h, rfl⟩ := QuotientGroup.mk'_surjective H p + apply (QuotientGroup.eq_iff_div_mem).2 + dsimp only [H] + rw [Subgroup.mem_iInf] + intro r + rw [MonoidHom.mem_ker, map_div] + have hvalue := DFunLike.congr_fun hqp + (⟨r.1, Subgroup.subset_closure r.2⟩ : R0) + change f r.1 g = f r.1 h at hvalue + rw [hvalue] + exact div_self' _ + have hQexponent : ∀ q : Q, q ^ (n : ℕ) = 1 := by + intro q + apply ht0 + rw [map_pow, map_one] + apply MonoidHom.ext + intro r + apply Subtype.ext + exact (t0 q r).2 + obtain ⟨dualQ⟩ := finiteNthRootsCharacterDuality + (G := Q) (K := K) (L := L) n hmu hQexponent + obtain ⟨dualR0⟩ := finiteNthRootsCharacterDuality + (G := R0) (K := K) (L := L) n hmu hR0exponent + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + let : Finite (DiscreteNthRootsSubgroup L (n : ℕ)) := + inferInstanceAs (Finite (nthRootsSubgroup L (n : ℕ))) + let : Fintype Q := Fintype.ofFinite Q + let : Fintype R0 := Fintype.ofFinite R0 + let : Finite (R0 →* DiscreteNthRootsSubgroup L (n : ℕ)) := + Finite.of_injective + (fun psi : R0 →* DiscreteNthRootsSubgroup L (n : ℕ) => + (psi : R0 → DiscreteNthRootsSubgroup L (n : ℕ))) + DFunLike.coe_injective + let : Fintype (R0 →* DiscreteNthRootsSubgroup L (n : ℕ)) := + Fintype.ofFinite _ + have hcardR0Q : Fintype.card R0 ≤ Fintype.card Q := + Fintype.card_le_of_injective + (fun r : R0 => dualQ (f0 r)) (dualQ.injective.comp hf0) + have hcardQR0 : Fintype.card Q ≤ Fintype.card R0 := + Fintype.card_le_of_injective + (fun q : Q => dualR0 (t0 q)) (dualR0.injective.comp ht0) + have hcardQTarget : + Fintype.card Q = + Fintype.card (R0 →* DiscreteNthRootsSubgroup L (n : ℕ)) := by + calc + Fintype.card Q = Fintype.card R0 := Nat.le_antisymm hcardQR0 hcardR0Q + _ = Fintype.card (R0 →* DiscreteNthRootsSubgroup L (n : ℕ)) := + Fintype.card_congr dualR0.symm.toEquiv + have ht0surjective : Function.Surjective t0 := + ht0.surjective_of_finite (Fintype.equivOfCardEq hcardQTarget) + obtain ⟨q, hq⟩ := ht0surjective (chi.comp R0.subtype) + obtain ⟨g, rfl⟩ := QuotientGroup.mk'_surjective H q + refine ⟨g, ?_⟩ + intro r hr + have hvalue := DFunLike.congr_fun hq + (⟨r, Subgroup.subset_closure hr⟩ : R0) + change f r g = chi r at hvalue + rw [hpair] + exact hvalue + +section RadicalExtensionPairing + +variable [IsSepClosure K Omega] + +/-- The canonical map in the displayed formula of the Kummer correspondence, +constructed by transposing the restricted Kummer character pairing. -/ +def kummerRadicalExtensionRestrictedTranspose + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) : + Gal(kummerRadicalExtension + (K := K) (Omega := Omega) n Delta.1/K) →* + (RestrictedRadicalQuotient n Delta →* + nthRootsSubgroup + (kummerRadicalExtension + (K := K) (Omega := Omega) n Delta.1) (n : ℕ)) := by + let E := kummerRadicalExtension + (K := K) (Omega := Omega) n Delta.1 + letI : IsGalois K E := kummerRadicalExtension_isGalois n Delta.1 + exact restrictedKummerTranspose n hmu Delta + (le_finiteKummerRadicalSubgroup_kummerRadicalExtension n hn Delta.1) + +/-- The canonical map is injective. The source is the internal-root +generation theorem above, so no generation hypothesis is exposed in this +statement. -/ +theorem kummerRadicalExtensionRestrictedTranspose_injective + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) : + Function.Injective + (kummerRadicalExtensionRestrictedTranspose + (K := K) (Omega := Omega) n hn hmu Delta) := by + let E := kummerRadicalExtension + (K := K) (Omega := Omega) n Delta.1 + let : IsGalois K E := kummerRadicalExtension_isGalois n Delta.1 + exact restrictedKummerTranspose_injective_of_adjoin n hmu Delta + (le_finiteKummerRadicalSubgroup_kummerRadicalExtension n hn Delta.1) + (kummerRadicalExtension_internalRoots_adjoin_eq_top n Delta) + +/-- Each evaluation coordinate of the restricted transpose is continuous +for the Krull topology on the Galois group and the discrete topology on +`mu_n(E)`. This is the closed-locus source for the compactness/FIP proof of +surjectivity. -/ +theorem restrictedKummerTranspose_evaluation_continuous + {L : Type*} [Field L] [Algebra K L] [IsGalois K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) + (hDelta : Delta.1 ≤ + finiteKummerRadicalSubgroup (K := K) (L := L) n) + (q : RestrictedRadicalQuotient n Delta) : + @Continuous (Gal(L/K)) (DiscreteNthRootsSubgroup L (n : ℕ)) + inferInstance + (DiscreteNthRootsSubgroup.instTopologicalSpaceSubtypeUnitsMemSubgroup + L (n : ℕ)) + (fun sigma => restrictedKummerTranspose n hmu Delta hDelta sigma q) := by + let D := chosenFiniteKummerRadicalDatum (K := K) (L := L) n + let hbase : NthRootsOfUnityInBase (K := K) (L := L) n := + nthRootsOfUnityInBase_of_primitiveRoots (K := K) (L := L) n hmu + obtain ⟨a, rfl⟩ := + restrictedRadicalQuotientMk_surjective n Delta q + let aD : D.carrier := restrictedRadicalInclusion n Delta hDelta a + have hcontinuous := infiniteKummerRootCharacter_continuous n hbase aD + exact hcontinuous.congr (fun _ => rfl) + +/-- The locus on which one evaluation coordinate takes a prescribed value. +These are the closed sets whose finite-intersection property yields the +surjectivity half of the displayed Kummer formula. -/ +def restrictedKummerEvaluationLocus + {L : Type*} [Field L] [Algebra K L] [IsGalois K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) + (hDelta : Delta.1 ≤ + finiteKummerRadicalSubgroup (K := K) (L := L) n) + (chi : RestrictedRadicalQuotient n Delta →* + nthRootsSubgroup L (n : ℕ)) + (q : RestrictedRadicalQuotient n Delta) : Set Gal(L/K) := + {sigma | restrictedKummerTranspose n hmu Delta hDelta sigma q = chi q} + +/-- Every evaluation locus is closed. -/ +theorem restrictedKummerEvaluationLocus_isClosed + {L : Type*} [Field L] [Algebra K L] [IsGalois K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) + (hDelta : Delta.1 ≤ + finiteKummerRadicalSubgroup (K := K) (L := L) n) + (chi : RestrictedRadicalQuotient n Delta →* + nthRootsSubgroup L (n : ℕ)) + (q : RestrictedRadicalQuotient n Delta) : + IsClosed (restrictedKummerEvaluationLocus n hmu Delta hDelta chi q) := by + let : TopologicalSpace (nthRootsSubgroup L (n : ℕ)) := + DiscreteNthRootsSubgroup.instTopologicalSpaceSubtypeUnitsMemSubgroup + L (n : ℕ) + let : DiscreteTopology (nthRootsSubgroup L (n : ℕ)) := + DiscreteNthRootsSubgroup.instDiscreteTopologySubtypeUnitsMemSubgroup + L (n : ℕ) + let : T2Space (nthRootsSubgroup L (n : ℕ)) := + @DiscreteTopology.toT2Space (nthRootsSubgroup L (n : ℕ)) + (DiscreteNthRootsSubgroup.instTopologicalSpaceSubtypeUnitsMemSubgroup L (n : ℕ)) + (DiscreteNthRootsSubgroup.instDiscreteTopologySubtypeUnitsMemSubgroup L (n : ℕ)) + exact isClosed_eq + (restrictedKummerTranspose_evaluation_continuous n hmu Delta hDelta q) + continuous_const + +/-- Evaluation loci are compact as closed subsets of the profinite Galois +group. -/ +theorem restrictedKummerEvaluationLocus_isCompact + {L : Type*} [Field L] [Algebra K L] [IsGalois K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) + (hDelta : Delta.1 ≤ + finiteKummerRadicalSubgroup (K := K) (L := L) n) + (chi : RestrictedRadicalQuotient n Delta →* + nthRootsSubgroup L (n : ℕ)) + (q : RestrictedRadicalQuotient n Delta) : + IsCompact (restrictedKummerEvaluationLocus n hmu Delta hDelta chi q) := + (restrictedKummerEvaluationLocus_isClosed + n hmu Delta hDelta chi q).isCompact + +/-- Membership in all evaluation loci is exactly equality with the target +character. Together with compactness of `Gal(L/K)`, this identifies the +precise finite-intersection problem remaining in the surjectivity proof. -/ +theorem mem_iInter_restrictedKummerEvaluationLocus_iff + {L : Type*} [Field L] [Algebra K L] [IsGalois K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) + (hDelta : Delta.1 ≤ + finiteKummerRadicalSubgroup (K := K) (L := L) n) + (chi : RestrictedRadicalQuotient n Delta →* + nthRootsSubgroup L (n : ℕ)) + (sigma : Gal(L/K)) : + sigma ∈ ⋂ q, restrictedKummerEvaluationLocus + n hmu Delta hDelta chi q ↔ + restrictedKummerTranspose n hmu Delta hDelta sigma = chi := by + rw [Set.mem_iInter] + constructor + · intro h + apply MonoidHom.ext + exact h + · intro h q + exact DFunLike.congr_fun h q + +/-- Every finite set of coordinates of a target character is realized by +one Galois automorphism of the radical extension. -/ +theorem exists_kummerRadicalExtensionRestrictedTranspose_match_finset + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) + (S : Finset (RestrictedRadicalQuotient n Delta)) + (chi : RestrictedRadicalQuotient n Delta →* + nthRootsSubgroup + (kummerRadicalExtension + (K := K) (Omega := Omega) n Delta.1) (n : ℕ)) : + ∃ sigma : Gal(kummerRadicalExtension + (K := K) (Omega := Omega) n Delta.1/K), + ∀ q ∈ S, + kummerRadicalExtensionRestrictedTranspose + n hn hmu Delta sigma q = chi q := by + let E := kummerRadicalExtension + (K := K) (Omega := Omega) n Delta.1 + let : IsGalois K E := kummerRadicalExtension_isGalois n Delta.1 + let : IsMulCommutative Gal(E/K) := + kummerRadicalExtension_isMulCommutative n hmu Delta.1 + let : CommGroup Gal(E/K) := by infer_instance + let hDelta : Delta.1 ≤ + finiteKummerRadicalSubgroup (K := K) (L := E) n := + le_finiteKummerRadicalSubgroup_kummerRadicalExtension n hn Delta.1 + let f : RestrictedRadicalQuotient n Delta →* + (Gal(E/K) →* DiscreteNthRootsSubgroup E (n : ℕ)) := + restrictedQuotientKummerCharacter n hmu Delta hDelta + let t : Gal(E/K) →* + (RestrictedRadicalQuotient n Delta →* + DiscreteNthRootsSubgroup E (n : ℕ)) := + restrictedKummerTranspose n hmu Delta hDelta + apply exists_pairing_element_matching_finset + (K := K) n hmu + (restrictedRadicalQuotient_pow_eq_one n Delta) + f t (fun _ _ => rfl) + (restrictedQuotientKummerCharacter_injective n hmu Delta hDelta) + _ S chi + intro q + exact restrictedKummerTranspose_evaluation_continuous + n hmu Delta hDelta q + +/-- **the Kummer correspondence, displayed Kummer formula: surjectivity.** + +Compactness of the profinite Galois group upgrades the finite-coordinate +realization theorem to a single automorphism realizing every coordinate. +-/ +theorem kummerRadicalExtensionRestrictedTranspose_surjective + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) : + Function.Surjective + (kummerRadicalExtensionRestrictedTranspose + (K := K) (Omega := Omega) n hn hmu Delta) := by + let E := kummerRadicalExtension + (K := K) (Omega := Omega) n Delta.1 + let : IsGalois K E := kummerRadicalExtension_isGalois n Delta.1 + let hDelta : Delta.1 ≤ + finiteKummerRadicalSubgroup (K := K) (L := E) n := + le_finiteKummerRadicalSubgroup_kummerRadicalExtension n hn Delta.1 + intro chi + have hintersection : + (⋂ q, restrictedKummerEvaluationLocus + n hmu Delta hDelta chi q).Nonempty := by + apply CompactSpace.iInter_nonempty + · intro q + exact restrictedKummerEvaluationLocus_isClosed + n hmu Delta hDelta chi q + · intro S + obtain ⟨sigma, hsigma⟩ := + exists_kummerRadicalExtensionRestrictedTranspose_match_finset + (K := K) (Omega := Omega) n hn hmu Delta S chi + refine ⟨sigma, ?_⟩ + rw [Set.mem_iInter₂] + intro q hq + exact hsigma q hq + obtain ⟨sigma, hsigma⟩ := hintersection + refine ⟨sigma, ?_⟩ + exact (mem_iInter_restrictedKummerEvaluationLocus_iff + n hmu Delta hDelta chi sigma).1 hsigma + +/-- **the Kummer correspondence, displayed Kummer formula.** The canonical Kummer +pairing identifies the Galois group of `K(√[n]{Delta})` with the full +character group of `Delta / Kˣⁿ`. -/ +def kummerRadicalExtensionRestrictedTransposeMulEquiv + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) : + Gal(kummerRadicalExtension + (K := K) (Omega := Omega) n Delta.1/K) ≃* + (RestrictedRadicalQuotient n Delta →* + nthRootsSubgroup + (kummerRadicalExtension + (K := K) (Omega := Omega) n Delta.1) (n : ℕ)) := + MulEquiv.ofBijective + (kummerRadicalExtensionRestrictedTranspose n hn hmu Delta) + ⟨kummerRadicalExtensionRestrictedTranspose_injective n hn hmu Delta, + kummerRadicalExtensionRestrictedTranspose_surjective n hn hmu Delta⟩ + +end RadicalExtensionPairing + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalMaximalKummerExtension.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalMaximalKummerExtension.lean new file mode 100644 index 0000000000..678f771693 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalMaximalKummerExtension.lean @@ -0,0 +1,71 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PowerClassFiniteness +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.MaximalKummerSubgroup +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.KummerCorrespondenceFormula +/-! +# Maximal finite Kummer extensions of local fields + +For a positive integer `n` that is nonzero in a nonarchimedean local field, +the Kummer extension obtained by adjoining all `n`-th roots is finite. +-/ + +@[expose] public section + +noncomputable +section + +universe v + +namespace KummerTheory + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The maximal restricted radical quotient is finite when the exponent is +nonzero in the local field. -/ +theorem finite_maximalRestrictedRadicalQuotient + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) : + Finite (RestrictedRadicalQuotient n (maximalKummerSubgroup K n)) := by + let _ : Finite (Kˣ ⧸ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range) := + LocalFieldTheory.finite_nthPowerQuotient_of_natCast_ne_zero + K (n : ℕ) hnK + exact Finite.of_equiv + (Kˣ ⧸ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range) + (maximalRestrictedRadicalQuotientEquiv K n).toEquiv + +variable {Omega : Type v} [Field Omega] [Algebra K Omega] [IsSepClosure K Omega] + +/-- The maximal exponent-`n` Kummer extension is finite-dimensional. -/ +theorem maximalKummerRadicalExtension_finiteDimensional + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + FiniteDimensional K + (kummerRadicalExtension (K := K) (Omega := Omega) n + (maximalKummerSubgroup K n).1) := by + let Delta := maximalKummerSubgroup K n + let E := kummerRadicalExtension (K := K) (Omega := Omega) n Delta.1 + let R := RestrictedRadicalQuotient n Delta + let M := nthRootsSubgroup E (n : ℕ) + let _ : IsGalois K E := + kummerRadicalExtension_isGalois (K := K) (Omega := Omega) n Delta.1 + let _ : Finite R := finite_maximalRestrictedRadicalQuotient K n hnK + let _ : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + let _ : Fintype M := nthRootsSubgroupFintype E (n : ℕ) + let _ : Finite (R →* M) := + Finite.of_injective (fun chi : R →* M => (chi : R → M)) + DFunLike.coe_injective + let e := kummerRadicalExtensionRestrictedTransposeMulEquiv + (K := K) (Omega := Omega) n hnK hmu Delta + let _ : Finite Gal(E/K) := Finite.of_equiv (R →* M) e.symm.toEquiv + exact IsGalois.finiteDimensional_of_finite K E + +end KummerTheory + +end diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalUnitKummerUnramified.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalUnitKummerUnramified.lean new file mode 100644 index 0000000000..339623b8e0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalUnitKummerUnramified.lean @@ -0,0 +1,147 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Different +/-! +# Unramified local unit Kummer generators + +This file packages the complete-DVF derivative criterion for a field extension +generated by an `n`-th root of a unit, with `n` itself a unit in the base field. +The statement is independent of the global Kummer construction so it can be +reused by local reciprocity arguments. +-/ + +@[expose] public section + +open _root_.RamificationTheory.DiscreteValuationField.ValuedExtension renaming + isUnramifiedAt_of_aeval_derivative_isUnit → + isUnramifiedAt_of_aeval_derivative_isUnit + + +open scoped ValuativeRel +open LocalFieldTheory + +noncomputable +section + +namespace KummerTheory + +/-- A finite separable extension generated by an `n`-th root of a unit is +unramified when `n` is a unit in the base field. -/ +theorem isUnramifiedValuedExtension_of_unit_kummer_generator + {C F : Type} + [Field C] [Field F] [Algebra C F] + [FiniteDimensional C F] + [Algebra.IsSeparable C F] + [ValuativeRel C] [ValuativeRel F] + [TopologicalSpace C] [TopologicalSpace F] + [IsNonarchimedeanLocalField C] + [IsNonarchimedeanLocalField F] + [Valuation.HasExtension + (ValuativeRel.valuation C) (ValuativeRel.valuation F)] + [Algebra 𝒪[C] F] + [Module.Finite 𝒪[C] 𝒪[F]] + (n : ℕ+) + (b : C) + (beta : F) + (hb : ValuativeRel.valuation C b = 1) + (hn : ValuativeRel.valuation C ((n : ℕ) : C) = 1) + (hbeta : ValuativeRel.valuation F beta = 1) + (hpow : beta ^ (n : ℕ) = algebraMap C F b) + (hgen : Algebra.adjoin C {beta} = ⊤) : + LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension C F := by + let vC := ValuativeRel.valuation C + let vF := ValuativeRel.valuation F + let base := LocalFieldTheory.localCompleteDVF C + let target := LocalFieldTheory.localCompleteDVF F + let : base.valuation.HasExtension target.valuation := by + apply Valuation.HasExtension.ofComapInteger + ext x + change vF (algebraMap C F x) ≤ 1 ↔ vC x ≤ 1 + exact Valuation.HasExtension.val_map_le_one_iff vC vF x + let : IsScalarTower base.valuationSubring + target.valuationSubring F := + ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_isScalarTower_of_hasExtension + base.valuation target.valuation + let bBase : base.valuationSubring := by + refine ⟨b, ?_⟩ + change base.valuation b ≤ 1 + rw [LocalFieldTheory.localCompleteDVF_valuation_eq] + exact hb.le + let z : target.valuationSubring := by + refine ⟨beta, ?_⟩ + change target.valuation beta ≤ 1 + rw [LocalFieldTheory.localCompleteDVF_valuation_eq] + exact hbeta.le + have hnBaseUnit : + IsUnit ((n : ℕ) : base.valuationSubring) := by + apply + (Valuation.integer.integers base.valuation).isUnit_iff_valuation_eq_one.mpr + change base.valuation ((n : ℕ) : C) = 1 + rw [LocalFieldTheory.localCompleteDVF_valuation_eq] + exact hn + have hzpow : + z ^ (n : ℕ) = + algebraMap base.valuationSubring target.valuationSubring bBase := by + apply Subtype.ext + change beta ^ (n : ℕ) = algebraMap C F b + exact hpow + have hzUnit : IsUnit z := by + apply + (Valuation.integer.integers target.valuation).isUnit_iff_valuation_eq_one.mpr + change target.valuation beta = 1 + rw [LocalFieldTheory.localCompleteDVF_valuation_eq] + exact hbeta + let P : Polynomial base.valuationSubring := + Polynomial.X ^ (n : ℕ) - Polynomial.C bBase + have hP : Polynomial.aeval z P = 0 := by + simp [P, hzpow] + have hPderiv : + IsUnit (Polynomial.aeval z (Polynomial.derivative P)) := by + have hderivative : + Polynomial.derivative P = + Polynomial.C ((n : ℕ) : base.valuationSubring) * + Polynomial.X ^ ((n : ℕ) - 1) := by + simp [P, Polynomial.derivative_X_pow] + have hCUnit : + IsUnit + (Polynomial.aeval z + (Polynomial.C ((n : ℕ) : base.valuationSubring))) := + hnBaseUnit.map + ((Polynomial.aeval z).toRingHom.comp Polynomial.C) + have hXUnit : + IsUnit + (Polynomial.aeval z + ((Polynomial.X : Polynomial base.valuationSubring) ^ + ((n : ℕ) - 1))) := by + simpa only [map_pow, Polynomial.aeval_X] using + hzUnit.pow ((n : ℕ) - 1) + rw [hderivative, map_mul] + exact hCUnit.mul hXUnit + have hzgen : + Algebra.adjoin C {(algebraMap target.valuationSubring F) z} = ⊤ := by + change Algebra.adjoin C {beta} = ⊤ + exact hgen + have hunramifiedAt : + Algebra.IsUnramifiedAt + base.valuationSubring target.maximalIdeal := + isUnramifiedAt_of_aeval_derivative_isUnit + base target z hzgen P hP hPderiv + refine ⟨?_⟩ + change target.maximalIdeal.ramificationIdx base.valuationSubring = 1 + let : Module.Finite + base.valuationSubring target.valuationSubring := by + change Module.Finite 𝒪[C] 𝒪[F] + infer_instance + let : Algebra.IsUnramifiedAt + base.valuationSubring target.maximalIdeal := hunramifiedAt + exact Ideal.ramificationIdx_eq_one_of_isUnramifiedAt + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/MaximalKummerSubgroup.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/MaximalKummerSubgroup.lean new file mode 100644 index 0000000000..43e6e7b358 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/MaximalKummerSubgroup.lean @@ -0,0 +1,71 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RestrictedFinite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.PowerIndex +/-! +# The maximal Kummer subgroup + +The largest admissible Kummer subgroup is the full unit group. Its +restricted radical quotient is canonically the ordinary power-class group. +-/ + +@[expose] public section + +noncomputable +section + +namespace KummerTheory + +variable (K : Type) [Field K] + +/-- The largest admissible Kummer subgroup, corresponding to adjoining all +`n`-th roots of elements of `Kˣ`. -/ +def maximalKummerSubgroup (n : ℕ+) : KummerSubgroup K n := + ⟨⊤, le_top⟩ + +/-- In the maximal Kummer subgroup, restricted ambient powers are the +ordinary `n`-th-power subgroup of the top subgroup. -/ +theorem restrictedNthPowersSubgroup_maximal_eq (n : ℕ+) : + restrictedNthPowersSubgroup n (maximalKummerSubgroup K n) = + (powMonoidHom (n : ℕ) : (⊤ : Subgroup Kˣ) →* (⊤ : Subgroup Kˣ)).range := by + ext a + constructor + · intro ha + obtain ⟨b, hb⟩ := + (mem_restrictedNthPowersSubgroup_iff n + (maximalKummerSubgroup K n)).1 ha + exact (MonoidHom.mem_range (G := (⊤ : Subgroup Kˣ))).2 + ⟨⟨b, Subgroup.mem_top b⟩, Subtype.ext hb⟩ + · intro ha + obtain ⟨b, hb⟩ := + (MonoidHom.mem_range (G := (⊤ : Subgroup Kˣ))).1 ha + exact + (mem_restrictedNthPowersSubgroup_iff n + (maximalKummerSubgroup K n)).2 + ⟨b.1, congrArg Subtype.val hb⟩ + +/-- The radical quotient for the maximal Kummer subgroup is canonically the +power-class group `Kˣ / Kˣⁿ`. -/ +noncomputable def maximalRestrictedRadicalQuotientEquiv (n : ℕ+) : + Kˣ ⧸ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range ≃* + RestrictedRadicalQuotient n (maximalKummerSubgroup K n) := + ((LocalFieldTheory.nthPowerQuotientEquivOfMulEquiv + Kˣ (⊤ : Subgroup Kˣ) (n : ℕ) Subgroup.topEquiv.symm).trans + (QuotientGroup.congr + ((powMonoidHom (n : ℕ) : (⊤ : Subgroup Kˣ) →* (⊤ : Subgroup Kˣ)).range) + (restrictedNthPowersSubgroup n (maximalKummerSubgroup K n)) + (MulEquiv.refl (⊤ : Subgroup Kˣ)) + ((Subgroup.map_id _).trans + (restrictedNthPowersSubgroup_maximal_eq K n).symm))).trans + (restrictedRadicalQuotientMulEquiv + n (maximalKummerSubgroup K n)).symm + +end KummerTheory + +end diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalExtension.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalExtension.lean new file mode 100644 index 0000000000..e27f08cca4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalExtension.lean @@ -0,0 +1,340 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.IsSepClosed +public import Mathlib.FieldTheory.Galois.Abelian +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration +/-! +# the radical-extension construction + +Let `Delta` be a subgroup of `Kˣ`. Inside a fixed separable closure `Omega/K`, +we adjoin *all* roots `beta` of the equations `beta ^ n = a`, for `a ∈ Delta`. +Using all roots makes the construction independent of choices and visibly +stable under `Gal(Omega/K)`. + +The hypothesis `(n : K) ≠ 0` is the usual assumption that `n` is prime to +the characteristic. It is used exactly to make `X ^ n - a` separable. The +primitive-root hypothesis is used later to make the resulting Galois group +abelian of exponent dividing `n`. +-/ + +@[expose] public section + +noncomputable +section + +namespace KummerTheory + +section RadicalExtension + +open Polynomial + +variable {K Omega : Type*} [Field K] [Field Omega] [Algebra K Omega] + +/-- The subgroup `Kˣ^n` of `n`-th powers in the unit group. -/ +def unitNthPowersSubgroup (K : Type*) [Field K] (n : ℕ+) : Subgroup Kˣ := + (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range + +/-- A unit lies in the unit power subgroup exactly when it is an `n`th power of a unit. -/ +@[simp] theorem mem_unitNthPowersSubgroup_iff + (n : ℕ+) {a : Kˣ} : + a ∈ unitNthPowersSubgroup K n ↔ ∃ b : Kˣ, b ^ (n : ℕ) = a := + Iff.rfl + +/-- The subgroup-side objects in the Kummer correspondence: subgroups `Delta ≤ Kˣ` +containing `Kˣ^n`. -/ +def KummerSubgroup (K : Type*) [Field K] (n : ℕ+) := + {Delta : Subgroup Kˣ // unitNthPowersSubgroup K n ≤ Delta} + +/-- All roots in `Omega` of the Kummer equations belonging to `Delta`. -/ +def kummerRootSet (n : ℕ+) (Delta : Subgroup Kˣ) : Set Omega := + {beta | ∃ a : Delta, + beta ^ (n : ℕ) = algebraMap K Omega (a.1 : K)} + +/-- The field `K(√[n]{Delta})` inside the chosen separable closure. -/ +def kummerRadicalExtension (n : ℕ+) (Delta : Subgroup Kˣ) : + IntermediateField K Omega := + IntermediateField.adjoin K (kummerRootSet (K := K) (Omega := Omega) n Delta) + +/-- Every prescribed Kummer equation has a root in the separable closure. +This is the only point where the characteristic hypothesis is needed. -/ +theorem exists_kummerRootSet + [IsSepClosure K Omega] + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) (Delta : Subgroup Kˣ) (a : Delta) : + ∃ beta : Omega, + beta ∈ kummerRootSet (K := K) (Omega := Omega) n Delta ∧ + beta ^ (n : ℕ) = algebraMap K Omega (a.1 : K) := by + let aOmega : Omega := algebraMap K Omega (a.1 : K) + have haOmega : aOmega ≠ 0 := + (_root_.map_ne_zero (algebraMap K Omega)).2 a.1.ne_zero + have hnOmega : ((n : ℕ) : Omega) ≠ 0 := by + rw [← map_natCast (algebraMap K Omega)] + exact (_root_.map_ne_zero (algebraMap K Omega)).2 hn + let : IsSepClosed Omega := IsSepClosure.sep_closed K + obtain ⟨beta, hbeta⟩ := IsSepClosed.exists_root + (X ^ (n : ℕ) - C aOmega) + (by rw [degree_X_pow_sub_C n.pos]; exact_mod_cast n.ne_zero) + (separable_X_pow_sub_C aOmega hnOmega haOmega) + have hpow : beta ^ (n : ℕ) = aOmega := by + apply sub_eq_zero.mp + simpa [IsRoot.def, aOmega] using hbeta + exact ⟨beta, ⟨a, hpow⟩, hpow⟩ + +/-- Every element of `Delta` acquires an `n`-th root in the constructed +field. This is the elementary inclusion `Delta ≤ Delta_{K(√[n]{Delta})}` +in the Kummer correspondence. -/ +theorem le_finiteKummerRadicalSubgroup_kummerRadicalExtension + [IsSepClosure K Omega] + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) (Delta : Subgroup Kˣ) : + Delta ≤ finiteKummerRadicalSubgroup + (K := K) (L := kummerRadicalExtension (K := K) (Omega := Omega) n Delta) n := by + intro a ha + let aDelta : Delta := ⟨a, ha⟩ + obtain ⟨beta, hbeta, hpow⟩ := + exists_kummerRootSet (K := K) (Omega := Omega) n hn Delta aDelta + let E := kummerRadicalExtension (K := K) (Omega := Omega) n Delta + let betaE : E := + ⟨beta, IntermediateField.subset_adjoin K + (kummerRootSet (K := K) (Omega := Omega) n Delta) hbeta⟩ + have hbetaE : betaE ≠ 0 := by + intro hzero + have hbeta_zero : beta = 0 := congrArg Subtype.val hzero + have hmap_zero : algebraMap K Omega (a : K) = 0 := by + rw [← hpow, hbeta_zero, zero_pow n.ne_zero] + exact ((_root_.map_ne_zero (algebraMap K Omega)).2 a.ne_zero) hmap_zero + refine ⟨Units.mk0 betaE hbetaE, ?_⟩ + apply Units.ext + apply Subtype.ext + exact hpow + +/-- In particular, for an admissible subgroup-side object, the radical +subgroup recovered from its field still contains `Kˣ^n`. -/ +theorem unitNthPowersSubgroup_le_constructedRadical + [IsSepClosure K Omega] + (n : ℕ+) (hn : ((n : ℕ) : K) ≠ 0) (Delta : KummerSubgroup K n) : + unitNthPowersSubgroup K n ≤ finiteKummerRadicalSubgroup + (K := K) + (L := kummerRadicalExtension (K := K) (Omega := Omega) n Delta.1) n := + Delta.2.trans + (le_finiteKummerRadicalSubgroup_kummerRadicalExtension n hn Delta.1) + +/-- A Kummer root is nonzero because its prescribed power is a unit. -/ +theorem kummerRootSet_ne_zero + (n : ℕ+) (Delta : Subgroup Kˣ) {beta : Omega} + (hbeta : beta ∈ kummerRootSet (K := K) (Omega := Omega) n Delta) : + beta ≠ 0 := by + obtain ⟨a, ha⟩ := hbeta + intro hzero + have : algebraMap K Omega (a.1 : K) = 0 := by + rw [← ha, hzero, zero_pow n.ne_zero] + exact ((_root_.map_ne_zero (algebraMap K Omega)).2 a.1.ne_zero) this + +/-- Every `K`-automorphism of the separable closure preserves the full root +set. -/ +theorem kummerRootSet_mapsTo + (n : ℕ+) (Delta : Subgroup Kˣ) (sigma : Gal(Omega/K)) : + Set.MapsTo sigma + (kummerRootSet (K := K) (Omega := Omega) n Delta) + (kummerRootSet (K := K) (Omega := Omega) n Delta) := by + rintro beta ⟨a, hbeta⟩ + refine ⟨a, ?_⟩ + calc + sigma beta ^ (n : ℕ) = sigma (beta ^ (n : ℕ)) := + (map_pow sigma beta (n : ℕ)).symm + _ = sigma (algebraMap K Omega (a.1 : K)) := congrArg sigma hbeta + _ = algebraMap K Omega (a.1 : K) := sigma.commutes (a.1 : K) + +/-- Because inverse automorphisms preserve the same equations, the root set +is carried onto itself, not merely into itself. -/ +theorem kummerRootSet_image + (n : ℕ+) (Delta : Subgroup Kˣ) (sigma : Gal(Omega/K)) : + sigma '' kummerRootSet (K := K) (Omega := Omega) n Delta = + kummerRootSet (K := K) (Omega := Omega) n Delta := by + apply Set.Subset.antisymm + · rintro _ ⟨beta, hbeta, rfl⟩ + exact kummerRootSet_mapsTo n Delta sigma hbeta + · intro beta hbeta + refine ⟨sigma.symm beta, kummerRootSet_mapsTo n Delta sigma.symm hbeta, ?_⟩ + exact sigma.apply_symm_apply beta + +/-- The actual radical field is stable under every automorphism of the +separable closure. -/ +theorem kummerRadicalExtension_map + (n : ℕ+) (Delta : Subgroup Kˣ) (sigma : Gal(Omega/K)) : + (kummerRadicalExtension (K := K) (Omega := Omega) n Delta).map sigma = + kummerRadicalExtension (K := K) (Omega := Omega) n Delta := by + rw [kummerRadicalExtension, IntermediateField.adjoin_map] + congr 1 + exact kummerRootSet_image n Delta sigma + +/-- The stability just proved is precisely normality over `K`. -/ +theorem kummerRadicalExtension_normal + [IsSepClosure K Omega] + (n : ℕ+) (Delta : Subgroup Kˣ) : + Normal K (kummerRadicalExtension (K := K) (Omega := Omega) n Delta) := by + rw [IntermediateField.normal_iff_forall_map_eq'] + exact kummerRadicalExtension_map n Delta + +/-- The extension `K(√[n]{Delta})/K` is Galois. Separability comes from the +ambient separable closure and normality from invariance of the full root +set. -/ +theorem kummerRadicalExtension_isGalois + [IsSepClosure K Omega] + (n : ℕ+) (Delta : Subgroup Kˣ) : + IsGalois K (kummerRadicalExtension (K := K) (Omega := Omega) n Delta) := by + rw [isGalois_iff] + exact ⟨inferInstance, kummerRadicalExtension_normal n Delta⟩ + +/-- On every radical generator, two automorphisms commute. The quotient +`sigma(beta) / beta` is an `n`-th root of unity, hence lies in and is fixed +by the base field under the primitive-root hypothesis. -/ +theorem kummerRadicalExtension_generator_commute + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : Subgroup Kˣ) + (sigma tau : Gal(kummerRadicalExtension (K := K) (Omega := Omega) n Delta/K)) + {beta : Omega} + (hbeta : beta ∈ kummerRootSet (K := K) (Omega := Omega) n Delta) : + (sigma * tau) + ⟨beta, IntermediateField.subset_adjoin K + (kummerRootSet (K := K) (Omega := Omega) n Delta) hbeta⟩ = + (tau * sigma) + ⟨beta, IntermediateField.subset_adjoin K + (kummerRootSet (K := K) (Omega := Omega) n Delta) hbeta⟩ := by + let E := kummerRadicalExtension (K := K) (Omega := Omega) n Delta + let betaE : E := + ⟨beta, IntermediateField.subset_adjoin K + (kummerRootSet (K := K) (Omega := Omega) n Delta) hbeta⟩ + let betaUnit : Eˣ := Units.mk0 betaE (by + intro hzero + apply kummerRootSet_ne_zero n Delta hbeta + exact congrArg Subtype.val hzero) + obtain ⟨a, ha⟩ := hbeta + have hpow : betaUnit ^ (n : ℕ) = + Units.map (algebraMap K E).toMonoidHom a.1 := by + apply Units.ext + apply Subtype.ext + exact ha + have hpow_fixed : ∀ rho : Gal(E/K), + rho • (betaUnit ^ (n : ℕ)) = betaUnit ^ (n : ℕ) := by + intro rho + rw [hpow] + exact RadicalDatum.smul_algebraMap_unit (K := K) (L := E) rho a.1 + let hbase : NthRootsOfUnityInBase (K := K) (L := E) n := + nthRootsOfUnityInBase_of_primitiveRoots (K := K) (L := E) n hmu + have hquot_pow (rho : Gal(E/K)) : + rootQuotient (K := K) (L := E) betaUnit rho ^ (n : ℕ) = 1 := + rootQuotient_pow_eq_one_of_pow_fixed (K := K) (L := E) hpow_fixed rho + have hquot_fixed (rho eta : Gal(E/K)) : + eta • rootQuotient (K := K) (L := E) betaUnit rho = + rootQuotient (K := K) (L := E) betaUnit rho := + nthRootsOfUnity_fixed (K := K) (L := E) n hbase eta _ (hquot_pow rho) + have hquot_commute : + rootQuotient (K := K) (L := E) betaUnit (sigma * tau) = + rootQuotient (K := K) (L := E) betaUnit (tau * sigma) := by + rw [rootQuotient_mul, rootQuotient_mul, + hquot_fixed tau sigma, hquot_fixed sigma tau, mul_comm] + have hunit_commute : (sigma * tau) • betaUnit = (tau * sigma) • betaUnit := by + rw [← rootQuotient_mul_right (K := K) (L := E) betaUnit (sigma * tau), + ← rootQuotient_mul_right (K := K) (L := E) betaUnit (tau * sigma), + hquot_commute] + exact congrArg Units.val hunit_commute + +/-- Hence `Gal(K(√[n]{Delta})/K)` is commutative. Equality is checked on +the radical generators of the adjoin. -/ +theorem kummerRadicalExtension_isMulCommutative + [IsSepClosure K Omega] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : Subgroup Kˣ) : + IsMulCommutative Gal(kummerRadicalExtension (K := K) (Omega := Omega) n Delta/K) := by + refine ⟨⟨fun sigma tau => ?_⟩⟩ + apply AlgEquiv.coe_toAlgHom_injective + apply IntermediateField.adjoin_algHom_ext K + intro beta hbeta + exact kummerRadicalExtension_generator_commute n hmu Delta sigma tau hbeta + +/-- On every radical generator, the `n`-th power of an automorphism is the +identity. -/ +theorem kummerRadicalExtension_generator_pow_eq_one + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : Subgroup Kˣ) + (sigma : Gal(kummerRadicalExtension (K := K) (Omega := Omega) n Delta/K)) + {beta : Omega} + (hbeta : beta ∈ kummerRootSet (K := K) (Omega := Omega) n Delta) : + (sigma ^ (n : ℕ)) + ⟨beta, IntermediateField.subset_adjoin K + (kummerRootSet (K := K) (Omega := Omega) n Delta) hbeta⟩ = + ⟨beta, IntermediateField.subset_adjoin K + (kummerRootSet (K := K) (Omega := Omega) n Delta) hbeta⟩ := by + let E := kummerRadicalExtension (K := K) (Omega := Omega) n Delta + let betaE : E := + ⟨beta, IntermediateField.subset_adjoin K + (kummerRootSet (K := K) (Omega := Omega) n Delta) hbeta⟩ + let betaUnit : Eˣ := Units.mk0 betaE (by + intro hzero + apply kummerRootSet_ne_zero n Delta hbeta + exact congrArg Subtype.val hzero) + obtain ⟨a, ha⟩ := hbeta + have hpow : betaUnit ^ (n : ℕ) = + Units.map (algebraMap K E).toMonoidHom a.1 := by + apply Units.ext + apply Subtype.ext + exact ha + have hpow_fixed : ∀ rho : Gal(E/K), + rho • (betaUnit ^ (n : ℕ)) = betaUnit ^ (n : ℕ) := by + intro rho + rw [hpow] + exact RadicalDatum.smul_algebraMap_unit (K := K) (L := E) rho a.1 + let hbase : NthRootsOfUnityInBase (K := K) (L := E) n := + nthRootsOfUnityInBase_of_primitiveRoots (K := K) (L := E) n hmu + let q : Eˣ := rootQuotient (K := K) (L := E) betaUnit sigma + have hq_pow : q ^ (n : ℕ) = 1 := + rootQuotient_pow_eq_one_of_pow_fixed (K := K) (L := E) hpow_fixed sigma + have hq_fixed (rho : Gal(E/K)) : rho • q = q := + nthRootsOfUnity_fixed (K := K) (L := E) n hbase rho q hq_pow + have hquot_pow : ∀ m : ℕ, + rootQuotient (K := K) (L := E) betaUnit (sigma ^ m) = q ^ m := by + intro m + induction m with + | zero => simp [q] + | succ m ih => + rw [pow_succ, rootQuotient_mul, hq_fixed, ih] + exact (pow_succ' q m).symm + have hquot_one : + rootQuotient (K := K) (L := E) betaUnit (sigma ^ (n : ℕ)) = 1 := by + rw [hquot_pow, hq_pow] + have hunit_fixed : (sigma ^ (n : ℕ)) • betaUnit = betaUnit := + (rootQuotient_eq_one_iff (K := K) (L := E) betaUnit + (sigma ^ (n : ℕ))).1 hquot_one + exact congrArg Units.val hunit_fixed + +/-- Every element of the Galois group has `n`-th power one. -/ +theorem kummerRadicalExtension_galois_pow_eq_one + [IsSepClosure K Omega] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : Subgroup Kˣ) + (sigma : Gal(kummerRadicalExtension (K := K) (Omega := Omega) n Delta/K)) : + sigma ^ (n : ℕ) = 1 := by + apply AlgEquiv.coe_toAlgHom_injective + apply IntermediateField.adjoin_algHom_ext K + intro beta hbeta + exact kummerRadicalExtension_generator_pow_eq_one n hmu Delta sigma hbeta + +/-- the Kummer correspondence, forward construction: adjoining the radicals attached to +`Delta` produces an abelian Galois extension. -/ +theorem kummerRadicalExtension_isAbelianGalois + [IsSepClosure K Omega] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : Subgroup Kˣ) : + IsAbelianGalois K + (kummerRadicalExtension (K := K) (Omega := Omega) n Delta) where + toIsGalois := kummerRadicalExtension_isGalois n Delta + toIsMulCommutative := kummerRadicalExtension_isMulCommutative n hmu Delta + +end RadicalExtension + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalQuotient.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalQuotient.lean new file mode 100644 index 0000000000..f1a036fda3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalQuotient.lean @@ -0,0 +1,309 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Infinite +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RootCharacters +/-! +# Ambient radical quotients + +Source lemmas for the quotient on the radical side of the Kummer pairing in +Concrete Kummer radical quotients. Unlike `MultiplicativeRadicalDatum`, this construction starts +with an arbitrary choice of roots. The hypothesis that `μₙ(L)` is fixed by +Galois makes the resulting root characters independent of that choice. + +The denominator is the subgroup of elements of `D.carrier` which are `n`-th +powers in the ambient group `Kˣ`, in the ambient group, rather than the generally +smaller subgroup of `n`-th powers of elements of `D.carrier`. +-/ + +@[expose] public section + +namespace KummerTheory + +section RadicalQuotient + +variable {K L : Type*} [Field K] [Field L] [Algebra K L] + +namespace RadicalDatum + +variable {n : ℕ+} (D : RadicalDatum (K := K) (L := L) n) + +/-- Multiplicativity of root characters does not require a multiplicative choice of roots. -/ +theorem rootCharacter_mul_withoutSection + (hfixed : ∀ σ : Gal(L/K), ∀ u : Lˣ, u ^ (n : ℕ) = 1 → σ • u = u) + (a b : D.carrier) : + D.rootCharacter (a * b) hfixed = + D.rootCharacter a hfixed * D.rootCharacter b hfixed := by + apply MonoidHom.ext + intro σ + change D.rootCocycle (a * b) σ = D.rootCocycle a σ * D.rootCocycle b σ + rw [← D.rootQuotient_eq_rootCocycle_of_same_pow hfixed (a * b) (u := D.root a * D.root b)] + · exact rootQuotient_mul_root (K := K) (L := L) (D.root a) (D.root b) σ + · rw [mul_pow, D.root_pow_eq_map, D.root_pow_eq_map] + exact (map_mul (Units.map (algebraMap K L).toMonoidHom) a.1 b.1).symm + +/-- The root character of `1` is trivial, without choosing roots multiplicatively. -/ +theorem rootCharacter_one_withoutSection + (hfixed : ∀ σ : Gal(L/K), ∀ u : Lˣ, u ^ (n : ℕ) = 1 → σ • u = u) : + D.rootCharacter 1 hfixed = 1 := by + apply MonoidHom.ext + intro σ + rw [D.rootCharacter_apply] + rw [← D.rootQuotient_eq_rootCocycle_of_same_pow hfixed (1 : D.carrier) + (u := Units.map (algebraMap K L).toMonoidHom (1 : Kˣ))] + · exact rootQuotient_algebraMap_unit (K := K) (L := L) 1 σ + · simp + +/-- The root character, bundled with its codomain restricted to `μₙ(L)`. -/ +def rootCharacterToMuWithoutSection (a : D.carrier) + (hfixed : ∀ σ : Gal(L/K), ∀ u : Lˣ, u ^ (n : ℕ) = 1 → σ • u = u) : + Gal(L/K) →* nthRootsSubgroup L (n : ℕ) where + toFun := fun σ => + ⟨D.rootCharacter a hfixed σ, D.rootCharacter_mem_nthRootsSubgroup a hfixed σ⟩ + map_one' := by + apply Subtype.ext + exact map_one (D.rootCharacter a hfixed) + map_mul' := by + intro σ τ + apply Subtype.ext + exact map_mul (D.rootCharacter a hfixed) σ τ + +/-- The section-free root character evaluates as the quotient of the transported +root by the root itself. -/ +@[simp] theorem rootCharacterToMuWithoutSection_apply (a : D.carrier) + (hfixed : ∀ σ : Gal(L/K), ∀ u : Lˣ, u ^ (n : ℕ) = 1 → σ • u = u) + (σ : Gal(L/K)) : + D.rootCharacterToMuWithoutSection a hfixed σ = + ⟨D.rootCharacter a hfixed σ, D.rootCharacter_mem_nthRootsSubgroup a hfixed σ⟩ := + rfl + +/-- The root-character construction is a homomorphism on the radical subgroup. -/ +def kummerCharacterWithoutSection + (hfixed : ∀ σ : Gal(L/K), ∀ u : Lˣ, u ^ (n : ℕ) = 1 → σ • u = u) : + D.carrier →* (Gal(L/K) →* nthRootsSubgroup L (n : ℕ)) where + toFun := fun a => D.rootCharacterToMuWithoutSection a hfixed + map_one' := by + apply MonoidHom.ext + intro σ + apply Subtype.ext + exact congrArg (fun χ : Gal(L/K) →* Lˣ => χ σ) + (D.rootCharacter_one_withoutSection hfixed) + map_mul' := by + intro a b + apply MonoidHom.ext + intro σ + apply Subtype.ext + exact congrArg (fun χ : Gal(L/K) →* Lˣ => χ σ) + (D.rootCharacter_mul_withoutSection hfixed a b) + +/-- Elements of the radical subgroup which are `n`-th powers in the ambient `Kˣ`. -/ +def ambientNthPowersSubgroup : Subgroup D.carrier := + (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range.comap D.carrier.subtype + +/-- An element belongs to the ambient power subgroup exactly when it is an `n`th power. -/ +theorem mem_ambientNthPowersSubgroup_iff {a : D.carrier} : + a ∈ D.ambientNthPowersSubgroup ↔ ∃ b : Kˣ, b ^ (n : ℕ) = a.1 := + Iff.rfl + +/-- A root character is trivial on an ambient `n`-th power. -/ +theorem rootCharacter_eq_one_of_mem_ambientNthPowers + (hfixed : ∀ σ : Gal(L/K), ∀ u : Lˣ, u ^ (n : ℕ) = 1 → σ • u = u) + {a : D.carrier} (ha : a ∈ D.ambientNthPowersSubgroup) : + D.rootCharacter a hfixed = 1 := by + obtain ⟨b, hb⟩ := (D.mem_ambientNthPowersSubgroup_iff).1 ha + apply MonoidHom.ext + intro σ + rw [D.rootCharacter_apply] + rw [← D.rootQuotient_eq_rootCocycle_of_same_pow hfixed a + (u := Units.map (algebraMap K L).toMonoidHom b)] + · exact rootQuotient_algebraMap_unit (K := K) (L := L) b σ + · rw [← map_pow, hb] + +/-- The ambient `n`-th-power subgroup lies in the kernel of the Kummer character. -/ +theorem ambientNthPowersSubgroup_le_ker + (hfixed : ∀ σ : Gal(L/K), ∀ u : Lˣ, u ^ (n : ℕ) = 1 → σ • u = u) : + D.ambientNthPowersSubgroup ≤ MonoidHom.ker (D.kummerCharacterWithoutSection hfixed) := by + intro a ha + change D.kummerCharacterWithoutSection hfixed a = 1 + apply MonoidHom.ext + intro σ + apply Subtype.ext + exact congrArg (fun χ : Gal(L/K) →* Lˣ => χ σ) + (D.rootCharacter_eq_one_of_mem_ambientNthPowers hfixed ha) + +/-- For a Galois extension, triviality of the Kummer character forces the +chosen root to come from the base field. Consequently the kernel is exactly +the subgroup of ambient `n`-th powers, not merely a subgroup containing it. -/ +theorem ker_kummerCharacterWithoutSection_eq_ambientNthPowers + [IsGalois K L] + (hfixed : ∀ σ : Gal(L/K), ∀ u : Lˣ, u ^ (n : ℕ) = 1 → σ • u = u) : + MonoidHom.ker (D.kummerCharacterWithoutSection hfixed) = + D.ambientNthPowersSubgroup := by + apply le_antisymm + · intro a ha + have hroot : ∀ σ : Gal(L/K), σ • D.root a = D.root a := by + intro σ + have hvalue : D.rootCharacterToMuWithoutSection a hfixed σ = 1 := by + have happ := congrArg + (fun χ : Gal(L/K) →* nthRootsSubgroup L (n : ℕ) ↦ χ σ) ha + simpa [kummerCharacterWithoutSection] using happ + have hquot : rootQuotient (K := K) (L := L) (D.root a) σ = 1 := by + exact congrArg Subtype.val hvalue + exact (rootQuotient_eq_one_iff (K := K) (L := L) (D.root a) σ).1 hquot + have hfixedVal : ∀ σ : Gal(L/K), σ (D.root a : L) = D.root a := by + intro σ + exact congrArg Units.val (hroot σ) + obtain ⟨b, hb⟩ := + (InfiniteGalois.mem_range_algebraMap_iff_fixed (k := K) (K := L) (D.root a : L)).2 + hfixedVal + have hb0 : b ≠ 0 := by + intro hbzero + have : (D.root a : L) = 0 := by simpa [hbzero] using hb.symm + exact Units.ne_zero (D.root a) this + refine (D.mem_ambientNthPowersSubgroup_iff).2 ⟨Units.mk0 b hb0, ?_⟩ + apply Units.ext + calc + ((Units.mk0 b hb0 : Kˣ) ^ (n : ℕ) : K) = b ^ (n : ℕ) := rfl + _ = a.1 := by + apply (algebraMap K L).injective + calc + algebraMap K L (b ^ (n : ℕ)) = (D.root a : L) ^ (n : ℕ) := by + rw [map_pow, hb] + _ = algebraMap K L (a.1 : K) := congrArg Units.val (D.root_pow_eq_map a) + · exact D.ambientNthPowersSubgroup_le_ker hfixed + +/-- The ambient radical quotient `Δ / (Δ ∩ Kˣⁿ)`. -/ +def RadicalQuotient : Type _ := + D.carrier ⧸ D.ambientNthPowersSubgroup + +/-- The commutative group structure transported to the named ambient +radical quotient. -/ +instance radicalQuotientCommGroupInstance : CommGroup D.RadicalQuotient := by + change CommGroup (D.carrier ⧸ D.ambientNthPowersSubgroup) + infer_instance + +/-- Comparison with the group-library presentation of the ambient radical +quotient. -/ +def radicalQuotientMulEquiv : + D.RadicalQuotient ≃* (D.carrier ⧸ D.ambientNthPowersSubgroup) := + MulEquiv.refl _ + +/-- The canonical projection to the named ambient radical quotient. -/ +def radicalQuotientMk : D.carrier →* D.RadicalQuotient := + QuotientGroup.mk' D.ambientNthPowersSubgroup + +/-- The named radical quotient projection agrees with the underlying quotient map. -/ +@[simp] +theorem radicalQuotientMk_apply (a : D.carrier) : + D.radicalQuotientMulEquiv (D.radicalQuotientMk a) = + (QuotientGroup.mk a : D.carrier ⧸ D.ambientNthPowersSubgroup) := + rfl + +/-- A radical quotient class is trivial exactly when its representative is an +ambient `n`th power. -/ +@[simp] +theorem radicalQuotientMk_eq_one_iff (a : D.carrier) : + D.radicalQuotientMk a = 1 ↔ a ∈ D.ambientNthPowersSubgroup := by + change + (QuotientGroup.mk' D.ambientNthPowersSubgroup) a = 1 ↔ + a ∈ D.ambientNthPowersSubgroup + exact QuotientGroup.eq_one_iff a + +/-- Two radical quotient representatives agree exactly when their ratio is an +ambient `n`th power. -/ +@[simp] +theorem radicalQuotientMk_eq_iff (a b : D.carrier) : + D.radicalQuotientMk a = D.radicalQuotientMk b ↔ + a / b ∈ D.ambientNthPowersSubgroup := by + change + (QuotientGroup.mk' D.ambientNthPowersSubgroup) a = + (QuotientGroup.mk' D.ambientNthPowersSubgroup) b ↔ + a / b ∈ D.ambientNthPowersSubgroup + exact QuotientGroup.eq_iff_div_mem + +/-- Every ambient radical class has a representative in `D.carrier`. -/ +theorem radicalQuotientMk_surjective : + Function.Surjective D.radicalQuotientMk := by + change Function.Surjective + (QuotientGroup.mk' D.ambientNthPowersSubgroup) + exact QuotientGroup.mk'_surjective D.ambientNthPowersSubgroup + +/-- Eliminate a named ambient radical quotient through its canonical +representatives. -/ +protected theorem radicalQuotient_inductionOn + {motive : D.RadicalQuotient → Prop} (q : D.RadicalQuotient) + (mk : ∀ a : D.carrier, motive (D.radicalQuotientMk a)) : + motive q := by + exact QuotientGroup.induction_on' q mk + +/-- Descend a homomorphism through the named ambient radical quotient. -/ +def radicalQuotientLift {M : Type*} [Group M] + (f : D.carrier →* M) + (hf : D.ambientNthPowersSubgroup ≤ MonoidHom.ker f) : + D.RadicalQuotient →* M := + (QuotientGroup.lift D.ambientNthPowersSubgroup f hf).comp + D.radicalQuotientMulEquiv.toMonoidHom + +/-- The radical quotient lift evaluates on a representative by the prescribed lift. -/ +@[simp] +theorem radicalQuotientLift_mk {M : Type*} [Group M] + (f : D.carrier →* M) + (hf : D.ambientNthPowersSubgroup ≤ MonoidHom.ker f) + (a : D.carrier) : + D.radicalQuotientLift f hf (D.radicalQuotientMk a) = f a := + rfl + +/-- The Kummer character descended to the correct ambient-power quotient. -/ +def quotientKummerCharacterWithoutSection + (hfixed : ∀ σ : Gal(L/K), ∀ u : Lˣ, u ^ (n : ℕ) = 1 → σ • u = u) : + D.RadicalQuotient →* (Gal(L/K) →* nthRootsSubgroup L (n : ℕ)) := + D.radicalQuotientLift (D.kummerCharacterWithoutSection hfixed) + (D.ambientNthPowersSubgroup_le_ker hfixed) + +/-- The section-free Kummer character on a quotient class is computed from any representative. -/ +@[simp] theorem quotientKummerCharacterWithoutSection_mk (a : D.carrier) + (hfixed : ∀ σ : Gal(L/K), ∀ u : Lˣ, u ^ (n : ℕ) = 1 → σ • u = u) : + D.quotientKummerCharacterWithoutSection hfixed + (D.radicalQuotientMk a) = + D.kummerCharacterWithoutSection hfixed a := + D.radicalQuotientLift_mk _ _ a + +/-- The character map on the ambient radical quotient is injective. This is +the kernel half of the canonical isomorphism in the finite Kummer character equivalence. -/ +theorem quotientKummerCharacterWithoutSection_injective + [IsGalois K L] + (hfixed : ∀ σ : Gal(L/K), ∀ u : Lˣ, u ^ (n : ℕ) = 1 → σ • u = u) : + Function.Injective (D.quotientKummerCharacterWithoutSection hfixed) := by + intro q + refine D.radicalQuotient_inductionOn + (motive := fun q => ∀ r, + D.quotientKummerCharacterWithoutSection hfixed q = + D.quotientKummerCharacterWithoutSection hfixed r → + q = r) + q ?_ + intro a r + refine D.radicalQuotient_inductionOn + (motive := fun r => + D.quotientKummerCharacterWithoutSection hfixed + (D.radicalQuotientMk a) = + D.quotientKummerCharacterWithoutSection hfixed r → + D.radicalQuotientMk a = r) + r ?_ + intro b hab + apply (D.radicalQuotientMk_eq_iff a b).2 + rw [← D.ker_kummerCharacterWithoutSection_eq_ambientNthPowers hfixed] + have hab' : D.kummerCharacterWithoutSection hfixed a = + D.kummerCharacterWithoutSection hfixed b := by + simpa using hab + rw [MonoidHom.mem_ker, map_div, hab'] + exact div_self' (D.kummerCharacterWithoutSection hfixed b) + +end RadicalDatum +end RadicalQuotient + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RestrictedFinite.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RestrictedFinite.lean new file mode 100644 index 0000000000..53845bb8d7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RestrictedFinite.lean @@ -0,0 +1,537 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteDualSeparation +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalExtension +/-! +# finite restricted Kummer pairing + +Let `Delta ≤ Kˣ` contain `Kˣ^n`, and suppose every element of `Delta` has +an `n`-th root in a finite Galois extension `L/K`. This file restricts the +actual finite Kummer character to + +`Delta / Kˣ^n → Hom(Gal(L/K), μₙ(L))`. + +The exact kernel theorem for the actual radical subgroup proves this +restricted map injective. We then transpose the pairing. If `L` is +generated by the roots belonging to `Delta`, the transpose is injective +because an automorphism in its kernel fixes every generator. + +No character-surjectivity or lattice-correspondence conclusion is assumed. +-/ + +@[expose] public section + +noncomputable +section + +namespace KummerTheory + +section RestrictedFiniteKummer + +variable {K L : Type*} [Field K] [Field L] [Algebra K L] + +/-- The copy of `Kˣ^n` inside an admissible subgroup `Delta`. -/ +def restrictedNthPowersSubgroup + (n : ℕ+) (Delta : KummerSubgroup K n) : Subgroup Delta.1 := + (unitNthPowersSubgroup K n).comap Delta.1.subtype + +/-- Restricted power-subgroup membership is characterized by an `n`th-power +witness in the restricted group. -/ +@[simp] theorem mem_restrictedNthPowersSubgroup_iff + (n : ℕ+) (Delta : KummerSubgroup K n) {a : Delta.1} : + a ∈ restrictedNthPowersSubgroup n Delta ↔ + ∃ b : Kˣ, b ^ (n : ℕ) = a.1 := + Iff.rfl + +/-- The subgroup-side quotient `Delta / Kˣ^n` from the Kummer correspondence. -/ +def RestrictedRadicalQuotient + (n : ℕ+) (Delta : KummerSubgroup K n) := + Delta.1 ⧸ restrictedNthPowersSubgroup n Delta + +/-- The commutative group structure on the named restricted radical +quotient. -/ +instance restrictedRadicalQuotientCommGroupInstance + (n : ℕ+) (Delta : KummerSubgroup K n) : + CommGroup (RestrictedRadicalQuotient n Delta) := by + change CommGroup (Delta.1 ⧸ restrictedNthPowersSubgroup n Delta) + infer_instance + +/-- Comparison with the group-library presentation of the restricted +radical quotient. -/ +def restrictedRadicalQuotientMulEquiv + (n : ℕ+) (Delta : KummerSubgroup K n) : + RestrictedRadicalQuotient n Delta ≃* + (Delta.1 ⧸ restrictedNthPowersSubgroup n Delta) := + MulEquiv.refl _ + +/-- The canonical projection to the named restricted radical quotient. -/ +def restrictedRadicalQuotientMk + (n : ℕ+) (Delta : KummerSubgroup K n) : + Delta.1 →* RestrictedRadicalQuotient n Delta := + QuotientGroup.mk' (restrictedNthPowersSubgroup n Delta) + +/-- A restricted radical class is trivial exactly when its representative is a +restricted `n`th power. -/ +@[simp] +theorem restrictedRadicalQuotientMk_eq_one_iff + (n : ℕ+) (Delta : KummerSubgroup K n) (a : Delta.1) : + restrictedRadicalQuotientMk n Delta a = 1 ↔ + a ∈ restrictedNthPowersSubgroup n Delta := by + change + (QuotientGroup.mk' (restrictedNthPowersSubgroup n Delta)) a = 1 ↔ _ + exact QuotientGroup.eq_one_iff a + +/-- Equality in the restricted radical quotient is characterized by a restricted power ratio. -/ +@[simp] +theorem restrictedRadicalQuotientMk_eq_iff + (n : ℕ+) (Delta : KummerSubgroup K n) (a b : Delta.1) : + restrictedRadicalQuotientMk n Delta a = + restrictedRadicalQuotientMk n Delta b ↔ + a / b ∈ restrictedNthPowersSubgroup n Delta := by + change + (QuotientGroup.mk' (restrictedNthPowersSubgroup n Delta)) a = + (QuotientGroup.mk' (restrictedNthPowersSubgroup n Delta)) b ↔ _ + exact QuotientGroup.eq_iff_div_mem + +/-- Every restricted radical class has a representative in `Delta`. -/ +theorem restrictedRadicalQuotientMk_surjective + (n : ℕ+) (Delta : KummerSubgroup K n) : + Function.Surjective (restrictedRadicalQuotientMk n Delta) := by + change Function.Surjective + (QuotientGroup.mk' (restrictedNthPowersSubgroup n Delta)) + exact QuotientGroup.mk'_surjective _ + +/-- Eliminate a restricted radical quotient through canonical +representatives. -/ +theorem restrictedRadicalQuotient_inductionOn + (n : ℕ+) (Delta : KummerSubgroup K n) + {motive : RestrictedRadicalQuotient n Delta → Prop} + (q : RestrictedRadicalQuotient n Delta) + (mk : ∀ a : Delta.1, + motive (restrictedRadicalQuotientMk n Delta a)) : + motive q := by + exact QuotientGroup.induction_on' q mk + +/-- Descend a homomorphism through the named restricted radical quotient. -/ +def restrictedRadicalQuotientLift {M : Type*} [Group M] + (n : ℕ+) (Delta : KummerSubgroup K n) (f : Delta.1 →* M) + (hf : restrictedNthPowersSubgroup n Delta ≤ MonoidHom.ker f) : + RestrictedRadicalQuotient n Delta →* M := + (QuotientGroup.lift (restrictedNthPowersSubgroup n Delta) f hf).comp + (restrictedRadicalQuotientMulEquiv n Delta).toMonoidHom + +/-- The restricted radical lift evaluates on quotient representatives by the chosen lift. -/ +@[simp] +theorem restrictedRadicalQuotientLift_mk {M : Type*} [Group M] + (n : ℕ+) (Delta : KummerSubgroup K n) (f : Delta.1 →* M) + (hf : restrictedNthPowersSubgroup n Delta ≤ MonoidHom.ker f) + (a : Delta.1) : + restrictedRadicalQuotientLift n Delta f hf + (restrictedRadicalQuotientMk n Delta a) = f a := + rfl + +/-- The field-level fixed-roots hypothesis supplied by a primitive root in +the base field. -/ +theorem restrictedKummerFixed + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) : + ∀ sigma : Gal(L/K), ∀ u : Lˣ, + u ^ (n : ℕ) = 1 → sigma • u = u := + nthRootsOfUnity_fixed (K := K) (L := L) n + (nthRootsOfUnityInBase_of_primitiveRoots (K := K) (L := L) n hmu) + +/-- Include the specified subgroup into the actual radical subgroup of +`L/K`. -/ +def restrictedRadicalInclusion + (n : ℕ+) (Delta : KummerSubgroup K n) + (hDelta : Delta.1 ≤ finiteKummerRadicalSubgroup (K := K) (L := L) n) : + Delta.1 →* (chosenFiniteKummerRadicalDatum (K := K) (L := L) n).carrier := + Subgroup.inclusion hDelta + +/-- The Kummer character restricted from the actual radical subgroup to +the prescribed subgroup `Delta`. -/ +def restrictedSubgroupKummerCharacter + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) + (hDelta : Delta.1 ≤ finiteKummerRadicalSubgroup (K := K) (L := L) n) : + Delta.1 →* (Gal(L/K) →* nthRootsSubgroup L (n : ℕ)) := + ((chosenFiniteKummerRadicalDatum (K := K) (L := L) n).kummerCharacterWithoutSection + (restrictedKummerFixed n hmu)).comp + (restrictedRadicalInclusion n Delta hDelta) + +/-- The restricted subgroup character has exactly the expected kernel `Kˣ^n`. +This is inherited from the exact kernel theorem on the actual radical +subgroup; it is not an additional hypothesis. -/ +theorem ker_restrictedSubgroupKummerCharacter + [IsGalois K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) + (hDelta : Delta.1 ≤ finiteKummerRadicalSubgroup (K := K) (L := L) n) : + MonoidHom.ker (restrictedSubgroupKummerCharacter n hmu Delta hDelta) = + restrictedNthPowersSubgroup n Delta := by + let D := chosenFiniteKummerRadicalDatum (K := K) (L := L) n + let hfixed := restrictedKummerFixed (K := K) (L := L) n hmu + apply le_antisymm + · intro a ha + have hinc : restrictedRadicalInclusion n Delta hDelta a ∈ + MonoidHom.ker (D.kummerCharacterWithoutSection hfixed) := by + simpa [restrictedSubgroupKummerCharacter, D, hfixed] using ha + have hpowers : restrictedRadicalInclusion n Delta hDelta a ∈ + D.ambientNthPowersSubgroup := by + rw [← D.ker_kummerCharacterWithoutSection_eq_ambientNthPowers hfixed] + exact hinc + exact (mem_restrictedNthPowersSubgroup_iff n Delta).2 + ((D.mem_ambientNthPowersSubgroup_iff).1 hpowers) + · intro a ha + have hpowers : restrictedRadicalInclusion n Delta hDelta a ∈ + D.ambientNthPowersSubgroup := + (D.mem_ambientNthPowersSubgroup_iff).2 + ((mem_restrictedNthPowersSubgroup_iff n Delta).1 ha) + have hker : restrictedRadicalInclusion n Delta hDelta a ∈ + MonoidHom.ker (D.kummerCharacterWithoutSection hfixed) := by + rw [D.ker_kummerCharacterWithoutSection_eq_ambientNthPowers hfixed] + exact hpowers + simpa [restrictedSubgroupKummerCharacter, D, hfixed] using hker + +/-- The restricted character descended to `Delta / Kˣ^n`. -/ +def restrictedQuotientKummerCharacter + [IsGalois K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) + (hDelta : Delta.1 ≤ finiteKummerRadicalSubgroup (K := K) (L := L) n) : + RestrictedRadicalQuotient n Delta →* + (Gal(L/K) →* nthRootsSubgroup L (n : ℕ)) := + restrictedRadicalQuotientLift n Delta + (restrictedSubgroupKummerCharacter n hmu Delta hDelta) + (by rw [ker_restrictedSubgroupKummerCharacter n hmu Delta hDelta]) + +/-- The restricted Kummer character is computed on a quotient representative by +its root character. -/ +@[simp] theorem restrictedQuotientKummerCharacter_mk + [IsGalois K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) + (hDelta : Delta.1 ≤ finiteKummerRadicalSubgroup (K := K) (L := L) n) + (a : Delta.1) : + restrictedQuotientKummerCharacter n hmu Delta hDelta + (restrictedRadicalQuotientMk n Delta a) = + restrictedSubgroupKummerCharacter n hmu Delta hDelta a := + rfl + +/-- Exactness of the subgroup-level kernel makes the restricted quotient character +injective. -/ +theorem restrictedQuotientKummerCharacter_injective + [IsGalois K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) + (hDelta : Delta.1 ≤ finiteKummerRadicalSubgroup (K := K) (L := L) n) : + Function.Injective (restrictedQuotientKummerCharacter n hmu Delta hDelta) := by + intro q r hqr + revert hqr + refine restrictedRadicalQuotient_inductionOn + (motive := fun q => + restrictedQuotientKummerCharacter n hmu Delta hDelta q = + restrictedQuotientKummerCharacter n hmu Delta hDelta r → + q = r) + n Delta q ?_ + intro a + refine restrictedRadicalQuotient_inductionOn + (motive := fun r => + restrictedQuotientKummerCharacter n hmu Delta hDelta + (restrictedRadicalQuotientMk n Delta a) = + restrictedQuotientKummerCharacter n hmu Delta hDelta r → + restrictedRadicalQuotientMk n Delta a = r) + n Delta r ?_ + intro b hab + apply (restrictedRadicalQuotientMk_eq_iff n Delta a b).2 + rw [← ker_restrictedSubgroupKummerCharacter n hmu Delta hDelta] + have hab' : + restrictedSubgroupKummerCharacter n hmu Delta hDelta a = + restrictedSubgroupKummerCharacter n hmu Delta hDelta b := by + exact hab + rw [MonoidHom.mem_ker, map_div, hab'] + exact div_self' (restrictedSubgroupKummerCharacter n hmu Delta hDelta b) + +/-- Transpose the restricted Kummer pairing by evaluation. -/ +def restrictedKummerTranspose + [IsGalois K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) + (hDelta : Delta.1 ≤ finiteKummerRadicalSubgroup (K := K) (L := L) n) : + Gal(L/K) →* + (RestrictedRadicalQuotient n Delta →* nthRootsSubgroup L (n : ℕ)) where + toFun sigma := + { toFun := fun q => restrictedQuotientKummerCharacter n hmu Delta hDelta q sigma + map_one' := by simp + map_mul' := by + intro q r + exact congrArg (fun chi : Gal(L/K) →* nthRootsSubgroup L (n : ℕ) => chi sigma) + (map_mul (restrictedQuotientKummerCharacter n hmu Delta hDelta) q r) } + map_one' := by + apply MonoidHom.ext + intro q + exact map_one (restrictedQuotientKummerCharacter n hmu Delta hDelta q) + map_mul' := by + intro sigma tau + apply MonoidHom.ext + intro q + exact map_mul (restrictedQuotientKummerCharacter n hmu Delta hDelta q) sigma tau + +/-- The restricted Kummer transpose evaluates a radical class against the +corresponding character. -/ +@[simp] theorem restrictedKummerTranspose_apply + [IsGalois K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) + (hDelta : Delta.1 ≤ finiteKummerRadicalSubgroup (K := K) (L := L) n) + (sigma : Gal(L/K)) (q : RestrictedRadicalQuotient n Delta) : + restrictedKummerTranspose n hmu Delta hDelta sigma q = + restrictedQuotientKummerCharacter n hmu Delta hDelta q sigma := + rfl + +/-- If the transposed character of `sigma` is trivial, then `sigma` fixes +every actual `n`-th root belonging to `Delta`. Independence of the root +choice follows from the fact that all `n`-th roots of unity lie in `K`. -/ +theorem restrictedKummerTranspose_fixes_root + [IsGalois K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) + (hDelta : Delta.1 ≤ finiteKummerRadicalSubgroup (K := K) (L := L) n) + (sigma : Gal(L/K)) + (hsigma : restrictedKummerTranspose n hmu Delta hDelta sigma = 1) + {beta : L} + (hbeta : beta ∈ kummerRootSet (K := K) (Omega := L) n Delta.1) : + sigma beta = beta := by + let D := chosenFiniteKummerRadicalDatum (K := K) (L := L) n + let hfixed := restrictedKummerFixed (K := K) (L := L) n hmu + have hbetaNe : beta ≠ 0 := kummerRootSet_ne_zero n Delta.1 hbeta + obtain ⟨a, ha⟩ := hbeta + let aD : D.carrier := restrictedRadicalInclusion n Delta hDelta a + let betaUnit : Lˣ := Units.mk0 beta hbetaNe + have hbetaPow : betaUnit ^ (n : ℕ) = + Units.map (algebraMap K L).toMonoidHom aD.1 := by + apply Units.ext + exact ha + let q : RestrictedRadicalQuotient n Delta := + restrictedRadicalQuotientMk n Delta a + have hvalue : restrictedQuotientKummerCharacter n hmu Delta hDelta q sigma = 1 := by + have happ := congrArg + (fun chi : RestrictedRadicalQuotient n Delta →* nthRootsSubgroup L (n : ℕ) => + chi q) hsigma + exact happ + have hraw : restrictedSubgroupKummerCharacter n hmu Delta hDelta a sigma = 1 := by + exact hvalue + have hchosen : D.rootCharacterToMuWithoutSection aD hfixed sigma = 1 := by + change D.rootCharacterToMuWithoutSection aD hfixed sigma = 1 at hraw + exact hraw + have hchosenVal : D.rootCocycle aD sigma = 1 := by + have hval := congrArg Subtype.val hchosen + simpa [RadicalDatum.rootCharacterToMuWithoutSection_apply, + RadicalDatum.rootCharacter_apply] using hval + have hquotient : rootQuotient (K := K) (L := L) betaUnit sigma = 1 := by + rw [D.rootQuotient_eq_rootCocycle_of_same_pow hfixed aD hbetaPow sigma] + exact hchosenVal + have hunit : sigma • betaUnit = betaUnit := + (rootQuotient_eq_one_iff (K := K) (L := L) betaUnit sigma).1 hquotient + exact congrArg Units.val hunit + +/-- If the roots attached to `Delta` generate `L`, the transposed restricted +Kummer pairing is nondegenerate on the Galois side. -/ +theorem restrictedKummerTranspose_injective_of_adjoin + [IsGalois K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) + (hDelta : Delta.1 ≤ finiteKummerRadicalSubgroup (K := K) (L := L) n) + (hgenerate : IntermediateField.adjoin K + (kummerRootSet (K := K) (Omega := L) n Delta.1) = ⊤) : + Function.Injective (restrictedKummerTranspose n hmu Delta hDelta) := by + intro sigma tau hsigmaTau + apply div_eq_one.mp + let rho : Gal(L/K) := sigma / tau + have hrhoTranspose : restrictedKummerTranspose n hmu Delta hDelta rho = 1 := by + rw [show rho = sigma / tau from rfl, map_div, hsigmaTau] + exact div_self' (restrictedKummerTranspose n hmu Delta hDelta tau) + have hrho : rho = 1 := by + apply AlgEquiv.ext + intro x + change rho x = x + have hx : x ∈ IntermediateField.adjoin K + (kummerRootSet (K := K) (Omega := L) n Delta.1) := by + rw [hgenerate] + exact IntermediateField.mem_top + induction hx using IntermediateField.adjoin_induction with + | mem x hx => + exact restrictedKummerTranspose_fixes_root n hmu Delta hDelta rho + hrhoTranspose hx + | algebraMap x => + exact rho.commutes x + | add x y hx hy ihx ihy => + rw [map_add, ihx, ihy] + | inv x hx ihx => + rw [map_inv₀, ihx] + | mul x y hx hy ihx ihy => + rw [map_mul, ihx, ihy] + exact hrho + +/-- The subgroup quotient `Delta / Kˣ^n` is killed by `n`. -/ +theorem restrictedRadicalQuotient_pow_eq_one + (n : ℕ+) (Delta : KummerSubgroup K n) + (q : RestrictedRadicalQuotient n Delta) : + q ^ (n : ℕ) = 1 := by + refine restrictedRadicalQuotient_inductionOn + (motive := fun q => q ^ (n : ℕ) = 1) n Delta q ?_ + intro a + rw [← map_pow] + exact (restrictedRadicalQuotientMk_eq_one_iff + n Delta (a ^ (n : ℕ))).2 + ((mem_restrictedNthPowersSubgroup_iff n Delta).2 ⟨a.1, rfl⟩) + +/-- At a finite stage, injectivity of the restricted character and of its +transpose force equality of the two finite cardinalities. Finite abelian +duality then upgrades the restricted character to a surjection. -/ +theorem restrictedQuotientKummerCharacter_surjective_of_adjoin + [FiniteDimensional K L] [IsGalois K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) + (hDelta : Delta.1 ≤ finiteKummerRadicalSubgroup (K := K) (L := L) n) + (hgenerate : IntermediateField.adjoin K + (kummerRootSet (K := K) (Omega := L) n Delta.1) = ⊤) : + Function.Surjective (restrictedQuotientKummerCharacter n hmu Delta hDelta) := by + let G := Gal(L/K) + let R := RestrictedRadicalQuotient n Delta + let M := nthRootsSubgroup L (n : ℕ) + let f : R →* (G →* M) := restrictedQuotientKummerCharacter n hmu Delta hDelta + let t : G →* (R →* M) := restrictedKummerTranspose n hmu Delta hDelta + have hf : Function.Injective f := + restrictedQuotientKummerCharacter_injective n hmu Delta hDelta + have ht : Function.Injective t := + restrictedKummerTranspose_injective_of_adjoin n hmu Delta hDelta hgenerate + let : IsMulCommutative G := + { is_comm := ⟨fun sigma tau => by + apply ht + rw [map_mul, map_mul] + exact mul_comm (t sigma) (t tau)⟩ } + let _ : CommGroup G := + CommGroup.mk (fun a b => IsMulCommutative.is_comm.comm a b) + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + let : Finite (G →* M) := + Finite.of_injective + (fun chi : G →* M => (chi : G → M)) DFunLike.coe_injective + let : Finite R := Finite.of_injective f hf + let : Finite (R →* M) := + Finite.of_injective + (fun chi : R →* M => (chi : R → M)) DFunLike.coe_injective + have hRExponent : ∀ r : R, r ^ (n : ℕ) = 1 := + restrictedRadicalQuotient_pow_eq_one n Delta + have hGExponent : ∀ sigma : G, sigma ^ (n : ℕ) = 1 := by + intro sigma + apply ht + rw [map_pow, map_one] + apply MonoidHom.ext + intro r + apply Subtype.ext + exact (t sigma r).2 + obtain ⟨dualG⟩ := finiteNthRootsCharacterDuality + (G := G) (K := K) (L := L) n hmu hGExponent + obtain ⟨dualR⟩ := finiteNthRootsCharacterDuality + (G := R) (K := K) (L := L) n hmu hRExponent + let : Fintype G := Fintype.ofFinite G + let : Fintype R := Fintype.ofFinite R + let : Fintype (G →* M) := Fintype.ofFinite (G →* M) + have hcardRG : Fintype.card R ≤ Fintype.card G := + Fintype.card_le_of_injective + (fun r : R => dualG (f r)) (dualG.injective.comp hf) + have hcardGR : Fintype.card G ≤ Fintype.card R := + Fintype.card_le_of_injective + (fun sigma : G => dualR (t sigma)) (dualR.injective.comp ht) + have hcardRHomG : Fintype.card R = Fintype.card (G →* M) := by + calc + Fintype.card R = Fintype.card G := Nat.le_antisymm hcardRG hcardGR + _ = Fintype.card (G →* M) := (Fintype.card_congr dualG.toEquiv).symm + exact hf.surjective_of_finite (Fintype.equivOfCardEq hcardRHomG) + +/-- The finite restricted Kummer character equivalence obtained from the +two nondegeneracy statements and finite duality. -/ +def restrictedKummerCharacterMulEquivOfAdjoin + [FiniteDimensional K L] [IsGalois K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) + (hDelta : Delta.1 ≤ finiteKummerRadicalSubgroup (K := K) (L := L) n) + (hgenerate : IntermediateField.adjoin K + (kummerRootSet (K := K) (Omega := L) n Delta.1) = ⊤) : + RestrictedRadicalQuotient n Delta ≃* + (Gal(L/K) →* nthRootsSubgroup L (n : ℕ)) := + MulEquiv.ofBijective (restrictedQuotientKummerCharacter n hmu Delta hDelta) + ⟨restrictedQuotientKummerCharacter_injective n hmu Delta hDelta, + restrictedQuotientKummerCharacter_surjective_of_adjoin + n hmu Delta hDelta hgenerate⟩ + +/-- Finite inverse endpoint of the Kummer correspondence. + +If `L` is generated by the roots attached to `Delta`, then no additional +base-field radical appears in `L`: the actual radical subgroup of `L/K` is +exactly `Delta`. Surjectivity of the restricted pairing supplies a +`Delta`-class with the same character as an arbitrary actual radical; +the exact kernel theorem says that the two representatives differ by an +ambient `n`-th power, which already belongs to `Delta`. -/ +theorem finiteKummerRadicalSubgroup_eq_of_adjoin + [FiniteDimensional K L] [IsGalois K L] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (Delta : KummerSubgroup K n) + (hDelta : Delta.1 ≤ finiteKummerRadicalSubgroup (K := K) (L := L) n) + (hgenerate : IntermediateField.adjoin K + (kummerRootSet (K := K) (Omega := L) n Delta.1) = ⊤) : + finiteKummerRadicalSubgroup (K := K) (L := L) n = Delta.1 := by + apply le_antisymm + · intro a ha + let D := chosenFiniteKummerRadicalDatum (K := K) (L := L) n + let hfixed := restrictedKummerFixed (K := K) (L := L) n hmu + let aD : D.carrier := ⟨a, ha⟩ + let qa : D.RadicalQuotient := + D.radicalQuotientMk aD + obtain ⟨q, hq⟩ := + restrictedQuotientKummerCharacter_surjective_of_adjoin + n hmu Delta hDelta hgenerate + (D.quotientKummerCharacterWithoutSection hfixed qa) + obtain ⟨delta, rfl⟩ := + restrictedRadicalQuotientMk_surjective n Delta q + let deltaD : D.carrier := restrictedRadicalInclusion n Delta hDelta delta + have hcharacters : D.kummerCharacterWithoutSection hfixed deltaD = + D.kummerCharacterWithoutSection hfixed aD := by + change D.kummerCharacterWithoutSection hfixed deltaD = + D.kummerCharacterWithoutSection hfixed aD at hq + exact hq + have hclasses : + D.radicalQuotientMk deltaD = D.radicalQuotientMk aD := by + apply D.quotientKummerCharacterWithoutSection_injective hfixed + simpa using hcharacters + have hdiv : deltaD / aD ∈ D.ambientNthPowersSubgroup := + (D.radicalQuotientMk_eq_iff deltaD aD).1 hclasses + obtain ⟨b, hb⟩ := (D.mem_ambientNthPowersSubgroup_iff).1 hdiv + have hbDelta : b ^ (n : ℕ) ∈ Delta.1 := + Delta.2 ((mem_unitNthPowersSubgroup_iff n).2 ⟨b, rfl⟩) + have hdeltaDiv : delta.1 / b ^ (n : ℕ) ∈ Delta.1 := + div_mem delta.2 hbDelta + have hdeltaD_coe : (deltaD : Kˣ) = delta.1 := by + exact Subgroup.coe_inclusion hDelta delta + have haD_coe : (aD : Kˣ) = a := rfl + have hb' : b ^ (n : ℕ) = delta.1 / a := by + calc + b ^ (n : ℕ) = (deltaD / aD : D.carrier) := hb + _ = (deltaD : Kˣ) / (aD : Kˣ) := rfl + _ = delta.1 / a := by rw [hdeltaD_coe, haD_coe] + have haeq : a = delta.1 / b ^ (n : ℕ) := by + rw [hb'] + exact (div_div_self' delta.1 a).symm + rw [haeq] + exact hdeltaDiv + · exact hDelta + +end RestrictedFiniteKummer + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RootCharacters.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RootCharacters.lean new file mode 100644 index 0000000000..12c4d4c8aa --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RootCharacters.lean @@ -0,0 +1,343 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.GaloisCohomology +/-! +# Root characters for Kummer theory + +Support API for root-quotient constructions in concrete Kummer extensions. +-/ + +@[expose] public section + +namespace KummerTheory + +open groupCohomology + +section RootQuotientPrelim + +variable {L : Type*} [Field L] + +/-- Two unit roots with the same `n`-th power differ by an `n`-th root of unity. -/ +theorem div_pow_eq_one_of_pow_eq_pow + {n : ℕ} {u v : Lˣ} (h : u ^ n = v ^ n) : + (u / v) ^ n = 1 := by + rw [div_pow, h] + exact div_self' (v ^ n) + +end RootQuotientPrelim + +section TorsionSubgroups + +variable (L : Type*) [Field L] + +/-- The subgroup of units whose `n`-th power is `1`. -/ +def nthRootsSubgroup (n : ℕ) : Subgroup Lˣ where + carrier := {u | u ^ n = 1} + one_mem' := by + simp + mul_mem' := by + intro u v hu hv + change (u * v) ^ n = 1 + rw [mul_pow, hu, hv, one_mul] + inv_mem' := by + intro u hu + change u⁻¹ ^ n = 1 + rw [inv_pow, hu, inv_one] + +/-- Membership in the roots subgroup is equivalent to satisfying the `n`th-root equation. -/ +@[simp] theorem mem_nthRootsSubgroup_iff {n : ℕ} {u : Lˣ} : + u ∈ nthRootsSubgroup L n ↔ u ^ n = 1 := + Iff.rfl + +/-- If two units have the same `n`-th power, then their quotient lies in `μₙ(L)`. -/ +theorem div_mem_nthRootsSubgroup_of_pow_eq_pow + {n : ℕ} {u v : Lˣ} (h : u ^ n = v ^ n) : + u / v ∈ nthRootsSubgroup L n := by + rw [mem_nthRootsSubgroup_iff] + exact div_pow_eq_one_of_pow_eq_pow (n := n) h + +/-- Galois automorphisms preserve the subgroup of `n`-torsion units. -/ +theorem smul_mem_nthRootsSubgroup + {K : Type*} [Field K] [Algebra K L] + (n : ℕ) (σ : Gal(L/K)) {u : Lˣ} + (hu : u ∈ nthRootsSubgroup L n) : + σ • u ∈ nthRootsSubgroup L n := by + rw [mem_nthRootsSubgroup_iff] at hu ⊢ + calc + (σ • u) ^ n = σ • (u ^ n) := by + exact (map_pow (MulDistribMulAction.toMonoidHom Lˣ σ) u n).symm + _ = 1 := by simp [hu] + +end TorsionSubgroups + +section RootQuotients + +variable {K L : Type*} [Field K] [Field L] [Algebra K L] + +/-- The basic root-quotient attached to a unit `β` and a Galois automorphism `σ`. -/ +def rootQuotient (β : Lˣ) (σ : Gal(L/K)) : Lˣ := + σ • β / β + +/-- The root-quotient attached to the identity automorphism is trivial. -/ +@[simp] theorem rootQuotient_one (β : Lˣ) : + rootQuotient (K := K) (L := L) β 1 = 1 := by + simp [rootQuotient] + +/-- Multiplying the root-quotient by the chosen root recovers its Galois transform. -/ +@[simp] theorem rootQuotient_mul_right (β : Lˣ) (σ : Gal(L/K)) : + rootQuotient (K := K) (L := L) β σ * β = σ • β := by + simp [rootQuotient] + +/-- Base-field units have trivial root-quotient. -/ +theorem rootQuotient_algebraMap_unit (u : Kˣ) (σ : Gal(L/K)) : + rootQuotient (K := K) (L := L) (Units.map (algebraMap K L).toMonoidHom u) σ = 1 := by + unfold rootQuotient + ext + simp + +/-- The root-quotient attached to a product is the product of the root-quotients. -/ +theorem rootQuotient_mul_root (u v : Lˣ) (σ : Gal(L/K)) : + rootQuotient (K := K) (L := L) (u * v) σ = + rootQuotient (K := K) (L := L) u σ * + rootQuotient (K := K) (L := L) v σ := by + simp [rootQuotient, div_eq_mul_inv, mul_assoc, mul_left_comm, mul_comm] + +/-- The root-quotient is trivial exactly when the chosen root is fixed by `σ`. -/ +theorem rootQuotient_eq_one_iff (β : Lˣ) (σ : Gal(L/K)) : + rootQuotient (K := K) (L := L) β σ = 1 ↔ σ • β = β := by + unfold rootQuotient + exact div_eq_one + +/-- The root-quotient construction satisfies the multiplicative cocycle identity. -/ +theorem rootQuotient_mul (β : Lˣ) (σ τ : Gal(L/K)) : + rootQuotient (K := K) (L := L) β (σ * τ) = + σ • rootQuotient (K := K) (L := L) β τ * + rootQuotient (K := K) (L := L) β σ := by + rw [rootQuotient] + rw [mul_smul] + simp [rootQuotient, div_eq_mul_inv, mul_assoc, mul_left_comm, mul_comm] + +/-- Reformulation: `σ ↦ σ(β) / β` is a multiplicative `1`-cocycle. -/ +theorem isMulCocycle₁_rootQuotient (β : Lˣ) : + IsMulCocycle₁ (rootQuotient (K := K) (L := L) β) := by + intro σ τ + exact rootQuotient_mul (K := K) (L := L) β σ τ + +/-- The root-quotient at `σ⁻¹` is determined by the value at `σ`. -/ +theorem rootQuotient_inv (β : Lˣ) (σ : Gal(L/K)) : + σ • rootQuotient (K := K) (L := L) β σ⁻¹ = + (rootQuotient (K := K) (L := L) β σ)⁻¹ := by + exact groupCohomology.map_inv_of_isMulCocycle₁ + (isMulCocycle₁_rootQuotient (K := K) (L := L) β) σ + +/-- The root-quotient of a quotient is the quotient of the root-quotients. -/ +theorem rootQuotient_div (u v : Lˣ) (σ : Gal(L/K)) : + rootQuotient (K := K) (L := L) (u / v) σ = + rootQuotient (K := K) (L := L) u σ / + rootQuotient (K := K) (L := L) v σ := by + simp [rootQuotient, div_eq_mul_inv, mul_assoc, mul_left_comm, mul_comm] + +/-- Changing the chosen root changes the corresponding quotient cocycle by a coboundary. -/ +theorem rootQuotient_changeRoot (u v : Lˣ) (σ : Gal(L/K)) : + rootQuotient (K := K) (L := L) u σ / + rootQuotient (K := K) (L := L) v σ = + rootQuotient (K := K) (L := L) (u / v) σ := by + exact (rootQuotient_div (K := K) (L := L) u v σ).symm + +/-- If `β ^ n` is fixed by Galois, then `σ(β) / β` is `n`-torsion. -/ +theorem rootQuotient_pow_eq_one_of_pow_fixed + {n : ℕ} {β : Lˣ} (hβ : ∀ σ : Gal(L/K), σ • (β ^ n) = β ^ n) + (σ : Gal(L/K)) : + rootQuotient (K := K) (L := L) β σ ^ n = 1 := by + unfold rootQuotient + apply div_pow_eq_one_of_pow_eq_pow + exact (map_pow (MulDistribMulAction.toMonoidHom Lˣ σ) β n).symm.trans (hβ σ) + +/-- If `β ^ n` is fixed by Galois, then the root-quotient lands in `μₙ(L)`. -/ +theorem rootQuotient_mem_nthRootsSubgroup_of_pow_fixed + {n : ℕ} {β : Lˣ} (hβ : ∀ σ : Gal(L/K), σ • (β ^ n) = β ^ n) + (σ : Gal(L/K)) : + rootQuotient (K := K) (L := L) β σ ∈ nthRootsSubgroup L n := by + rw [mem_nthRootsSubgroup_iff] + exact rootQuotient_pow_eq_one_of_pow_fixed (K := K) (L := L) hβ σ + +end RootQuotients + +section RadicalData + +variable {K L : Type*} [Field K] [Field L] [Algebra K L] + +/-- +A radical datum of exponent `n` consists of a subgroup of `Kˣ` together with a chosen +`n`-th root in `Lˣ` for each of its elements. +-/ +structure RadicalDatum (n : ℕ+) where + /-- The subgroup of base-field units for which roots are chosen. -/ + carrier : Subgroup Kˣ + /-- A chosen `n`-th root in `Lˣ` for each unit in `carrier`. -/ + root : carrier → Lˣ + /-- Each chosen root has `n`-th power equal to the image of its base-field unit in `Lˣ`. -/ + root_pow_eq : ∀ a : carrier, + root a ^ (n : ℕ) = Units.map (algebraMap K L).toMonoidHom a.1 + +namespace RadicalDatum + +variable {n : ℕ+} (D : RadicalDatum (K := K) (L := L) n) + +/-- The chosen root witness has the prescribed `n`-th power. -/ +@[simp] theorem root_pow_eq_map (a : D.carrier) : + D.root a ^ (n : ℕ) = Units.map (algebraMap K L).toMonoidHom a.1 := + D.root_pow_eq a + +/-- Two `n`-th roots of the same radical element differ by an `n`-th root of unity. -/ +theorem div_pow_eq_one_of_same_image + {u v : Lˣ} (a : D.carrier) + (hu : u ^ (n : ℕ) = Units.map (algebraMap K L).toMonoidHom a.1) + (hv : v ^ (n : ℕ) = Units.map (algebraMap K L).toMonoidHom a.1) : + (u / v) ^ (n : ℕ) = 1 := by + exact div_pow_eq_one_of_pow_eq_pow (n := (n : ℕ)) (hu.trans hv.symm) + +/-- The root-quotient map `σ ↦ σ(β) / β` attached to the chosen root witness of `a`. -/ +def rootCocycle (a : D.carrier) (σ : Gal(L/K)) : Lˣ := + rootQuotient (K := K) (L := L) (D.root a) σ + +/-- The chosen root-quotient is trivial at the identity automorphism. -/ +@[simp] theorem rootCocycle_one (a : D.carrier) : + D.rootCocycle a 1 = 1 := by + simp [rootCocycle] + +/-- The chosen root-quotient satisfies the multiplicative cocycle identity. -/ +theorem rootCocycle_mul (a : D.carrier) (σ τ : Gal(L/K)) : + D.rootCocycle a (σ * τ) = + σ • D.rootCocycle a τ * D.rootCocycle a σ := by + exact rootQuotient_mul (K := K) (L := L) (D.root a) σ τ + +/-- Reformulation: the chosen root-quotient is a multiplicative `1`-cocycle. -/ +theorem isMulCocycle₁_rootCocycle (a : D.carrier) : + IsMulCocycle₁ (D.rootCocycle a) := by + exact isMulCocycle₁_rootQuotient (K := K) (L := L) (D.root a) + +/-- Galois automorphisms fix units coming from the base field. -/ +theorem smul_algebraMap_unit (σ : Gal(L/K)) (u : Kˣ) : + σ • Units.map (algebraMap K L).toMonoidHom u = + Units.map (algebraMap K L).toMonoidHom u := by + ext + simp + +/-- The chosen root-quotient of `a` lands in the `n`-torsion subgroup of `Lˣ`. -/ +theorem rootCocycle_pow_eq_one (a : D.carrier) (σ : Gal(L/K)) : + D.rootCocycle a σ ^ (n : ℕ) = 1 := by + refine rootQuotient_pow_eq_one_of_pow_fixed (K := K) (L := L) + (β := D.root a) ?_ σ + intro τ + rw [D.root_pow_eq_map] + exact smul_algebraMap_unit (K := K) (L := L) τ a.1 + +/-- The chosen root-quotient of `a` belongs to `μₙ(L)`. -/ +theorem rootCocycle_mem_nthRootsSubgroup (a : D.carrier) (σ : Gal(L/K)) : + D.rootCocycle a σ ∈ nthRootsSubgroup L (n : ℕ) := by + rw [mem_nthRootsSubgroup_iff] + exact D.rootCocycle_pow_eq_one a σ + +/-- If two root choices are used for the same radical element, their quotient is `n`-torsion. -/ +theorem changeRoot_rootQuotient_pow_eq_one + {u v : Lˣ} (a : D.carrier) + (hu : u ^ (n : ℕ) = Units.map (algebraMap K L).toMonoidHom a.1) + (hv : v ^ (n : ℕ) = Units.map (algebraMap K L).toMonoidHom a.1) + (σ : Gal(L/K)) : + (rootQuotient (K := K) (L := L) u σ / + rootQuotient (K := K) (L := L) v σ) ^ (n : ℕ) = 1 := by + rw [rootQuotient_changeRoot] + refine rootQuotient_pow_eq_one_of_pow_fixed (K := K) (L := L) + (β := u / v) ?_ σ + intro τ + have hpow : (u / v) ^ (n : ℕ) = 1 := + D.div_pow_eq_one_of_same_image a hu hv + rw [hpow] + simp + +/-- Change-of-root quotient cocycles land in `μₙ(L)`. -/ +theorem changeRoot_rootQuotient_mem_nthRootsSubgroup + {u v : Lˣ} (a : D.carrier) + (hu : u ^ (n : ℕ) = Units.map (algebraMap K L).toMonoidHom a.1) + (hv : v ^ (n : ℕ) = Units.map (algebraMap K L).toMonoidHom a.1) + (σ : Gal(L/K)) : + rootQuotient (K := K) (L := L) u σ / + rootQuotient (K := K) (L := L) v σ ∈ nthRootsSubgroup L (n : ℕ) := by + rw [mem_nthRootsSubgroup_iff] + exact D.changeRoot_rootQuotient_pow_eq_one a hu hv σ + +/-- If `μₙ(L)` is fixed by Galois, root-quotients for the same radical element agree. -/ +theorem rootQuotient_eq_rootCocycle_of_same_pow + (hfixed : ∀ σ : Gal(L/K), ∀ u : Lˣ, u ^ (n : ℕ) = 1 → σ • u = u) + {u : Lˣ} (a : D.carrier) + (hu : u ^ (n : ℕ) = Units.map (algebraMap K L).toMonoidHom a.1) + (σ : Gal(L/K)) : + rootQuotient (K := K) (L := L) u σ = D.rootCocycle a σ := by + have hpow : (u / D.root a) ^ (n : ℕ) = 1 := by + exact D.div_pow_eq_one_of_same_image a hu (D.root_pow_eq_map a) + have hfixed_delta : σ • (u / D.root a) = u / D.root a := + hfixed σ (u / D.root a) hpow + have hquot_one : rootQuotient (K := K) (L := L) (u / D.root a) σ = 1 := + (rootQuotient_eq_one_iff (K := K) (L := L) (u / D.root a) σ).2 hfixed_delta + have hdiv_one : rootQuotient (K := K) (L := L) u σ / D.rootCocycle a σ = 1 := by + rw [rootCocycle, rootQuotient_changeRoot] + exact hquot_one + exact div_eq_one.mp hdiv_one + +/-- If `μₙ(L)` is fixed by Galois, the chosen root-quotient is a character. -/ +def rootCharacter (a : D.carrier) + (hfixed : ∀ σ : Gal(L/K), ∀ u : Lˣ, u ^ (n : ℕ) = 1 → σ • u = u) : + Gal(L/K) →* Lˣ where + toFun := D.rootCocycle a + map_one' := by + exact D.rootCocycle_one a + map_mul' := by + intro σ τ + rw [D.rootCocycle_mul] + rw [hfixed σ (D.rootCocycle a τ) (D.rootCocycle_pow_eq_one a τ)] + exact mul_comm _ _ + +/-- The Kummer root character evaluates as the Galois translate divided by the chosen root. -/ +@[simp] theorem rootCharacter_apply (a : D.carrier) + (hfixed : ∀ σ : Gal(L/K), ∀ u : Lˣ, u ^ (n : ℕ) = 1 → σ • u = u) + (σ : Gal(L/K)) : + D.rootCharacter a hfixed σ = D.rootCocycle a σ := + rfl + +/-- The canonical character agrees with any root quotient having the same `n`-th power. -/ +theorem rootCharacter_eq_of_same_pow + (hfixed : ∀ σ : Gal(L/K), ∀ u : Lˣ, u ^ (n : ℕ) = 1 → σ • u = u) + {u : Lˣ} (a : D.carrier) + (hu : u ^ (n : ℕ) = Units.map (algebraMap K L).toMonoidHom a.1) + (σ : Gal(L/K)) : + rootQuotient (K := K) (L := L) u σ = D.rootCharacter a hfixed σ := by + rw [D.rootCharacter_apply] + exact D.rootQuotient_eq_rootCocycle_of_same_pow hfixed a hu σ + +/-- The character obtained from a chosen root still takes values in `μₙ(L)`. -/ +theorem rootCharacter_pow_eq_one (a : D.carrier) + (hfixed : ∀ σ : Gal(L/K), ∀ u : Lˣ, u ^ (n : ℕ) = 1 → σ • u = u) + (σ : Gal(L/K)) : + D.rootCharacter a hfixed σ ^ (n : ℕ) = 1 := by + rw [D.rootCharacter_apply] + exact D.rootCocycle_pow_eq_one a σ + +/-- The character obtained from a chosen root lands in `μₙ(L)`. -/ +theorem rootCharacter_mem_nthRootsSubgroup (a : D.carrier) + (hfixed : ∀ σ : Gal(L/K), ∀ u : Lˣ, u ^ (n : ℕ) = 1 → σ • u = u) + (σ : Gal(L/K)) : + D.rootCharacter a hfixed σ ∈ nthRootsSubgroup L (n : ℕ) := by + rw [mem_nthRootsSubgroup_iff] + exact D.rootCharacter_pow_eq_one a hfixed σ + +end RadicalDatum +end RadicalData + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation.lean new file mode 100644 index 0000000000..02d75e062e --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation.lean @@ -0,0 +1,12 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SUnitPreparation.PrimePowerKernelCoordinates + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation/PrimePowerKernelCoordinates.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation/PrimePowerKernelCoordinates.lean new file mode 100644 index 0000000000..b5769e1afa --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation/PrimePowerKernelCoordinates.lean @@ -0,0 +1,338 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Group.Equiv.TypeTags +public import Mathlib.Algebra.Module.ZMod +public import Mathlib.Data.Finsupp.Fintype +public import Mathlib.Data.ZMod.Basic +public import Mathlib.FieldTheory.IntermediateField.Basic +public import Mathlib.RingTheory.LocalRing.Module +/-! +# Prime-power kernel coordinates + +Linear-algebraic coordinates for kernels of surjections between finite free modules over `ZMod + (p ^ v)`. +-/ + +@[expose] public section + +open scoped IsMulCommutative + +noncomputable +section + +namespace KummerTheory + +open scoped Classical in +/-- A prime-power residue ring is local. This instance is the algebraic +input needed to turn the projective kernel in the finite S-unit preparation argument into a free +`ZMod (p ^ v)`-module. -/ +theorem zmodPrimePower_isLocalRing + (p v : ℕ) (hp : p.Prime) (hv : 0 < v) : + IsLocalRing (ZMod (p ^ v)) := by + let : Fact (1 < p ^ v) := ⟨by + calc + 1 < p := hp.one_lt + _ = p ^ 1 := (pow_one p).symm + _ ≤ p ^ v := + Nat.pow_le_pow_right hp.pos + (Nat.succ_le_iff.mpr hv)⟩ + have hmodulus : p ∣ p ^ v := by + exact dvd_pow_self p hv.ne' + apply IsLocalRing.of_nonunits_add + intro a b ha hb + have hunit (x : ZMod (p ^ v)) : + IsUnit x ↔ ¬ p ∣ x.val := by + constructor + · intro hx + apply (ZMod.isUnit_natCast_iff_not_dvd_pow hp hv).1 + simpa only [ZMod.natCast_zmod_val] using hx + · intro hx + have hcast := + (ZMod.isUnit_natCast_iff_not_dvd_pow hp hv).2 hx + simpa only [ZMod.natCast_zmod_val] using hcast + have ha' : p ∣ a.val := by + change ¬ IsUnit a at ha + exact Classical.not_not.mp + (mt (hunit a).2 ha) + have hb' : p ∣ b.val := by + change ¬ IsUnit b at hb + exact Classical.not_not.mp + (mt (hunit b).2 hb) + have hsum : p ∣ a.val + b.val := + dvd_add ha' hb' + have hmultiple : + p ∣ p ^ v * ((a.val + b.val) / p ^ v) := + dvd_mul_of_dvd_left hmodulus _ + have hrem : + p ∣ (a.val + b.val) % p ^ v := by + apply (Nat.dvd_add_iff_left hmultiple).mpr + simpa only [Nat.mod_add_div] using hsum + change ¬ IsUnit (a + b) + intro hab + apply (hunit (a + b)).1 hab + rw [ZMod.val_add] + exact hrem + +open scoped Classical in +/-- Over a local ring, the kernel of a surjection between finite free +modules is free. The proof constructs the splitting explicitly and then +uses finite projective modules over local rings. -/ +theorem free_ker_of_surjective_linearMap_of_isLocalRing + {R M N : Type*} [CommRing R] [IsLocalRing R] + [AddCommGroup M] [AddCommGroup N] + [Module R M] [Module R N] + [Module.Free R M] [Module.Free R N] + [Finite M] + (f : M →ₗ[R] N) (hf : Function.Surjective f) : + Module.Free R (LinearMap.ker f) := by + obtain ⟨sec, hsec⟩ := + Module.projective_lifting_property + f LinearMap.id hf + let q : M →ₗ[R] M := + LinearMap.id - sec.comp f + have hq (x : M) : q x ∈ LinearMap.ker f := by + rw [LinearMap.mem_ker] + change f (x - sec (f x)) = 0 + rw [map_sub] + have hsec_apply : + f (sec (f x)) = f x := by + have := + DFunLike.congr_fun hsec (f x) + simpa using this + rw [hsec_apply, sub_self] + let projection : M →ₗ[R] LinearMap.ker f := + LinearMap.codRestrict (LinearMap.ker f) q hq + have hprojection : + projection.comp (LinearMap.ker f).subtype = + LinearMap.id := by + ext x + change x.1 - sec (f x.1) = x.1 + rw [show f x.1 = 0 from x.2] + simp + let : Module.Projective R (LinearMap.ker f) := + Module.Projective.of_split + (LinearMap.ker f).subtype projection hprojection + let : Module.Finite R (LinearMap.ker f) := + Module.Finite.of_finite + exact Module.free_of_flat_of_isLocalRing + +open scoped Classical in +/-- The cardinality of a finite free module is the cardinality of the +coefficient ring raised to the size of a chosen basis. -/ +theorem card_eq_card_pow_card_chooseBasisIndex + {R M : Type*} [Semiring R] + [AddCommMonoid M] [Module R M] + [Module.Free R M] [Finite R] [Finite M] : + Nat.card M = + Nat.card R ^ + Fintype.card (Module.Free.ChooseBasisIndex R M) := by + let : Fintype R := + Fintype.ofFinite R + let : Fintype M := + Fintype.ofFinite M + let : Module.Finite R M := + Module.Finite.of_finite + rw [Nat.card_congr + (Module.Free.chooseBasis R M).repr.toEquiv] + simp only [Nat.card_eq_fintype_card, + Fintype.card_finsupp] + +open scoped Classical in +/-- Multiplicative product coordinates, interpreted as a `ZMod n`-linear +equivalence on the additive presentations. -/ +noncomputable def additiveCoordinatesLinearEquiv + {G A B : Type*} [CommGroup G] [AddCommGroup A] + [AddCommGroup B] (n : ℕ) + [Module (ZMod n) (Additive G)] + [Module (ZMod n) A] [Module (ZMod n) B] + (e : G ≃* Multiplicative A × Multiplicative B) : + Additive G ≃ₗ[ZMod n] A × B := by + let eAdd : Additive G ≃+ A × B := + MulEquiv.toAdditiveLeft e + exact + { eAdd with + map_smul' := by + simpa using ZMod.map_smul eAdd } + +open scoped Classical in +/-- The canonical `ZMod n`-module on the additive presentation of a +commutative group of exponent dividing `n`. -/ +@[reducible] +noncomputable def additiveZModModuleOfPowEqOne + {G : Type*} [CommGroup G] (n : ℕ) + (h : ∀ g : G, g ^ n = 1) : + Module (ZMod n) (Additive G) := + AddCommGroup.zmodModule <| by + intro x + apply Additive.toMul.injective + simpa using h (Additive.toMul x) + +open scoped Classical in +/-- Multiplicative function coordinates, interpreted as a `ZMod n`-linear +equivalence on the additive presentations. -/ +noncomputable def additivePiLinearEquiv + {G A : Type*} [CommGroup G] [AddCommGroup A] + {ι : Type*} (n : ℕ) + [Module (ZMod n) (Additive G)] + [Module (ZMod n) A] + (e : G ≃* (ι → Multiplicative A)) : + Additive G ≃ₗ[ZMod n] (ι → A) := by + let eAdd : Additive G ≃+ (ι → A) := + MulEquiv.toAdditiveLeft e + exact + { eAdd with + map_smul' := by + simpa using ZMod.map_smul eAdd } + +open scoped Classical in +/-- The multiplicative kernel of a homomorphism is the multiplicative +presentation of the kernel of its induced `ZMod n`-linear map. -/ +noncomputable def monoidKerEquivMultiplicativeLinearKer + {G H : Type*} [CommGroup G] [CommGroup H] + (n : ℕ) + [Module (ZMod n) (Additive G)] + [Module (ZMod n) (Additive H)] + (f : G →* H) : + f.ker ≃* + Multiplicative + (LinearMap.ker + (f.toAdditive.toZModLinearMap n)) where + toFun x := + Multiplicative.ofAdd + ⟨Additive.ofMul x.1, by + rw [LinearMap.mem_ker] + apply Additive.toMul.injective + exact x.2⟩ + invFun x := + ⟨Additive.toMul (Multiplicative.toAdd x).1, by + change f (Additive.toMul (Multiplicative.toAdd x).1) = 1 + have hx := (Multiplicative.toAdd x).2 + rw [LinearMap.mem_ker] at hx + exact congrArg Additive.toMul hx⟩ + left_inv x := by + apply Subtype.ext + rfl + right_inv x := by + apply Multiplicative.toAdd.injective + apply Subtype.ext + rfl + map_mul' x y := by + apply Multiplicative.toAdd.injective + apply Subtype.ext + rfl + +open scoped Classical in +/-- A surjection between finite free `ZMod (p ^ v)`-modules has a +kernel with genuine coordinates. Its number of coordinates is read off +from the cardinality of the kernel. -/ +theorem exists_kernelMulEquiv_pi_zmod_of_primePower + {G H : Type*} [CommGroup G] [CommGroup H] + (n p v q : ℕ) + (hp : p.Prime) (hv : 0 < v) + (hn : n = p ^ v) + [Module (ZMod n) (Additive G)] + [Module (ZMod n) (Additive H)] + (freeG : Module.Free (ZMod n) (Additive G)) + (freeH : Module.Free (ZMod n) (Additive H)) + [Finite G] + (f : G →* H) (hf : Function.Surjective f) + (hcard : Nat.card f.ker = n ^ q) : + Nonempty + (f.ker ≃* + (Fin q → Multiplicative (ZMod n))) := by + have hn_one : 1 < n := by + rw [hn] + calc + 1 < p := hp.one_lt + _ = p ^ 1 := (pow_one p).symm + _ ≤ p ^ v := + Nat.pow_le_pow_right hp.pos + (Nat.succ_le_iff.mpr hv) + let : Module.Free (ZMod n) (Additive G) := + freeG + let : Module.Free (ZMod n) (Additive H) := + freeH + let : NeZero n := ⟨by omega⟩ + let : IsLocalRing (ZMod n) := by + rw [hn] + exact zmodPrimePower_isLocalRing p v hp hv + let fLinear : + Additive G →ₗ[ZMod n] Additive H := + f.toAdditive.toZModLinearMap n + have hfLinear : + Function.Surjective fLinear := by + intro y + obtain ⟨x, hx⟩ := hf (Additive.toMul y) + refine ⟨Additive.ofMul x, ?_⟩ + apply Additive.toMul.injective + exact hx + let : Module.Free (ZMod n) + (LinearMap.ker fLinear) := + free_ker_of_surjective_linearMap_of_isLocalRing + fLinear hfLinear + let : Module.Finite (ZMod n) + (LinearMap.ker fLinear) := + Module.Finite.of_finite + let I := + Module.Free.ChooseBasisIndex + (ZMod n) (LinearMap.ker fLinear) + let b₀ := + Module.Free.chooseBasis + (ZMod n) (LinearMap.ker fLinear) + have hlinearCard : + Nat.card (LinearMap.ker fLinear) = n ^ q := by + calc + Nat.card (LinearMap.ker fLinear) = + Nat.card (Multiplicative + (LinearMap.ker fLinear)) := rfl + _ = Nat.card f.ker := + Nat.card_congr + (monoidKerEquivMultiplicativeLinearKer + n f).symm.toEquiv + _ = n ^ q := hcard + have hbasisCard : + Nat.card (LinearMap.ker fLinear) = + n ^ Fintype.card I := by + simpa only [Nat.card_zmod] using + (card_eq_card_pow_card_chooseBasisIndex + (R := ZMod n) + (M := LinearMap.ker fLinear)) + have hI : Fintype.card I = q := by + apply Nat.pow_right_injective hn_one + exact hbasisCard.symm.trans hlinearCard + let eI : I ≃ Fin q := + (Fintype.equivFin I).trans (finCongr hI) + let b := b₀.reindex eI + exact ⟨ + (monoidKerEquivMultiplicativeLinearKer n f).trans <| + b.repr.toAddEquiv.toMultiplicative |>.trans <| + (Finsupp.addEquivFunOnFinite).toMultiplicative |>.trans + (MulEquiv.refl _)⟩ + +open scoped Classical in +/-- The exponent-`n` statement read directly from coordinates +`Gal(E/K) ≃ (Z/nZ)^r`. -/ +theorem galois_pow_eq_one_of_equiv_pi_zmod + {K Omega : Type*} [Field K] [Field Omega] [Algebra K Omega] + (E : IntermediateField K Omega) + (n : ℕ+) (r : ℕ) + (eG : + (E ≃ₐ[K] E) ≃* + (Fin r → Multiplicative (ZMod (n : ℕ)))) + (sigma : E ≃ₐ[K] E) : + sigma ^ (n : ℕ) = 1 := by + apply eG.injective + rw [map_pow, map_one] + ext i + apply Multiplicative.toAdd.injective + change + (n : ℕ) • Multiplicative.toAdd (eG sigma i) = 0 + simp + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtension.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtension.lean new file mode 100644 index 0000000000..d321d370bd --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtension.lean @@ -0,0 +1,348 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalMaximalKummerExtension +/-! +# Simple Kummer extensions + +This file exposes the chosen singleton-radical construction used in +Kummer theory. For `b : Kˣ`, it chooses an embedded field +`K(ⁿ√b)` inside the separable closure and proves that, when `K` contains +the `n`-th roots of unity, this is a finite cyclic Galois extension. +-/ + +@[expose] public section + +noncomputable +section + +namespace KummerTheory + +variable (K : Type) [Field K] + +/-- A chosen `n`-th root of `b` in the separable closure. -/ +noncomputable def chosenSimpleKummerRoot + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) (b : Kˣ) : + SeparableClosure K := + Classical.choose + (exists_kummerRootSet + (K := K) (Omega := SeparableClosure K) n hnK + (maximalKummerSubgroup K n).1 + (⟨b, by simp [maximalKummerSubgroup]⟩ : + (maximalKummerSubgroup K n).1)) + +/-- The chosen root belongs to the maximal Kummer root set. -/ +theorem chosenSimpleKummerRoot_mem + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) (b : Kˣ) : + chosenSimpleKummerRoot K n hnK b ∈ + kummerRootSet (K := K) (Omega := SeparableClosure K) n + (maximalKummerSubgroup K n).1 := + (Classical.choose_spec + (exists_kummerRootSet + (K := K) (Omega := SeparableClosure K) n hnK + (maximalKummerSubgroup K n).1 + (⟨b, by simp [maximalKummerSubgroup]⟩ : + (maximalKummerSubgroup K n).1))).1 + +/-- The chosen element is an actual `n`-th root of `b`. -/ +theorem chosenSimpleKummerRoot_pow + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) (b : Kˣ) : + chosenSimpleKummerRoot K n hnK b ^ (n : ℕ) = + algebraMap K (SeparableClosure K) (b : K) := + (Classical.choose_spec + (exists_kummerRootSet + (K := K) (Omega := SeparableClosure K) n hnK + (maximalKummerSubgroup K n).1 + (⟨b, by simp [maximalKummerSubgroup]⟩ : + (maximalKummerSubgroup K n).1))).2 + +/-- The simple Kummer extension generated by the chosen root of `b`. -/ +def chosenSimpleKummerExtension + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) (b : Kˣ) : + IntermediateField K (SeparableClosure K) := + IntermediateField.adjoin K {chosenSimpleKummerRoot K n hnK b} + +/-- The simple extension generated by one chosen radical is contained in the +extension generated by all radicals of the maximal Kummer subgroup. -/ +theorem chosenSimpleKummerExtension_le_maximalKummerExtension + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) (b : Kˣ) : + chosenSimpleKummerExtension K n hnK b ≤ + kummerRadicalExtension + (K := K) (Omega := SeparableClosure K) n + (maximalKummerSubgroup K n).1 := by + rw [chosenSimpleKummerExtension] + apply IntermediateField.adjoin_le_iff.mpr + intro beta hbeta + have hbeta' : beta = chosenSimpleKummerRoot K n hnK b := + Set.mem_singleton_iff.mp hbeta + subst beta + rw [kummerRadicalExtension] + exact IntermediateField.subset_adjoin K _ + (chosenSimpleKummerRoot_mem K n hnK b) + +/-- The chosen radical as a unit of `K(ⁿ√b)`. -/ +noncomputable def chosenSimpleKummerRootUnit + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) (b : Kˣ) : + (chosenSimpleKummerExtension K n hnK b)ˣ := + Units.mk0 + ⟨chosenSimpleKummerRoot K n hnK b, + IntermediateField.subset_adjoin K + {chosenSimpleKummerRoot K n hnK b} + (Set.mem_singleton (chosenSimpleKummerRoot K n hnK b))⟩ + (by + intro hzero + apply kummerRootSet_ne_zero + (K := K) (Omega := SeparableClosure K) n + (maximalKummerSubgroup K n).1 + (chosenSimpleKummerRoot_mem K n hnK b) + exact congrArg Subtype.val hzero) + +/-- The radical still has `n`-th power `b` in the simple extension. -/ +@[simp] +theorem chosenSimpleKummerRootUnit_pow + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) (b : Kˣ) : + chosenSimpleKummerRootUnit K n hnK b ^ (n : ℕ) = + Units.map + (algebraMap K (chosenSimpleKummerExtension K n hnK b)).toMonoidHom b := by + apply Units.ext + apply Subtype.ext + exact chosenSimpleKummerRoot_pow K n hnK b + +/-- The chosen radical generates the whole simple extension. -/ +theorem chosenSimpleKummerExtension_adjoin_root_eq_top + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) (b : Kˣ) : + let E := chosenSimpleKummerExtension K n hnK b + IntermediateField.adjoin K + {((chosenSimpleKummerRootUnit K n hnK b : Eˣ) : E)} = ⊤ := by + let E := chosenSimpleKummerExtension K n hnK b + let beta : E := (chosenSimpleKummerRootUnit K n hnK b : Eˣ) + let R : IntermediateField K E := + IntermediateField.adjoin K {beta} + change R = ⊤ + apply top_unique + intro x _ + have hall : ∀ y : SeparableClosure K, ∀ hy : y ∈ E, + (⟨y, hy⟩ : E) ∈ R := by + intro y hy + change y ∈ IntermediateField.adjoin K + {chosenSimpleKummerRoot K n hnK b} at hy + induction hy using IntermediateField.adjoin_induction with + | mem y hy => + have hy' : y = chosenSimpleKummerRoot K n hnK b := + Set.mem_singleton_iff.mp hy + subst y + apply IntermediateField.subset_adjoin K + rw [Set.mem_singleton_iff] + apply Subtype.ext + rfl + | algebraMap a => exact R.algebraMap_mem a + | add x y hx hy ihx ihy => exact R.add_mem ihx ihy + | inv x hx ihx => exact R.inv_mem ihx + | mul x y hx hy ihx ihy => exact R.mul_mem ihx ihy + exact hall x.1 x.property + +/-- The extension generated by the chosen simple Kummer root is finite-dimensional. -/ +theorem chosenSimpleKummerExtension_finiteDimensional + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) (b : Kˣ) : + FiniteDimensional K (chosenSimpleKummerExtension K n hnK b) := by + apply IntermediateField.finiteDimensional_adjoin + intro x hx + have hx' : x = chosenSimpleKummerRoot K n hnK b := + Set.mem_singleton_iff.mp hx + subst x + apply IsIntegral.of_pow n.pos + rw [chosenSimpleKummerRoot_pow K n hnK b] + exact isIntegral_algebraMap + +/-- If `K` contains `μₙ`, then `K(ⁿ√b) / K` is abelian Galois. -/ +theorem chosenSimpleKummerExtension_isAbelianGalois + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (b : Kˣ) : + IsAbelianGalois K (chosenSimpleKummerExtension K n hnK b) := by + classical + let Delta := maximalKummerSubgroup K n + let beta := chosenSimpleKummerRoot K n hnK b + let T : Finset (SeparableClosure K) := {beta} + have hT : (T : Set (SeparableClosure K)) ⊆ + kummerRootSet (K := K) (Omega := SeparableClosure K) n Delta.1 := by + intro x hx + have hx' : x = beta := by simpa [T] using hx + subst x + simpa [Delta, beta] using chosenSimpleKummerRoot_mem K n hnK b + let Delta0 := admissibleFiniteSupportSubgroup + (K := K) (Omega := SeparableClosure K) n Delta T hT + have hAbelian : IsAbelianGalois K + (kummerRadicalExtension + (K := K) (Omega := SeparableClosure K) n Delta0.1) := + kummerRadicalExtension_isAbelianGalois + (K := K) (Omega := SeparableClosure K) n hmu Delta0.1 + have hfield := kummerRadicalExtension_admissibleFiniteSupport_eq + (K := K) (Omega := SeparableClosure K) n Delta T hT hmu + rw [hfield] at hAbelian + change IsAbelianGalois K + (IntermediateField.adjoin K (T : Set (SeparableClosure K))) at hAbelian + have hTset : (T : Set (SeparableClosure K)) = + {chosenSimpleKummerRoot K n hnK b} := by + ext x + simp [T, beta] + rw [hTset] at hAbelian + exact hAbelian + +/-- Every Galois root quotient of the chosen radical is an `n`-th root +of unity. -/ +theorem chosenSimpleKummer_rootQuotient_mem + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) (b : Kˣ) + (sigma : Gal((chosenSimpleKummerExtension K n hnK b)/K)) : + rootQuotient + (K := K) (L := chosenSimpleKummerExtension K n hnK b) + (chosenSimpleKummerRootUnit K n hnK b) sigma ∈ + nthRootsSubgroup (chosenSimpleKummerExtension K n hnK b) (n : ℕ) := by + apply rootQuotient_mem_nthRootsSubgroup_of_pow_fixed + intro tau + rw [chosenSimpleKummerRootUnit_pow K n hnK b] + exact RadicalDatum.smul_algebraMap_unit + (K := K) (L := chosenSimpleKummerExtension K n hnK b) tau b + +/-- The root quotient of the chosen radical is a character of the +Galois group. -/ +noncomputable def chosenSimpleKummerRootCharacter + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (b : Kˣ) : + Gal((chosenSimpleKummerExtension K n hnK b)/K) →* + nthRootsSubgroup (chosenSimpleKummerExtension K n hnK b) (n : ℕ) := + let E := chosenSimpleKummerExtension K n hnK b + let : MulDistribMulAction Gal(E/K) Eˣ := + AlgEquiv.instMulDistribMulActionUnits + let D := + chosenFiniteKummerRadicalDatum (K := K) (L := E) n + let delta : D.carrier := + ⟨b, chosenSimpleKummerRootUnit K n hnK b, + chosenSimpleKummerRootUnit_pow K n hnK b⟩ + let hfixed : + ∀ sigma : Gal(E/K), ∀ u : Eˣ, + u ^ (n : ℕ) = 1 → + Units.map sigma.toMonoidHom u = u := + nthRootsOfUnity_fixed (K := K) (L := E) n + (nthRootsOfUnityInBase_of_primitiveRoots + (K := K) (L := E) n hmu) + D.rootCharacterToMuWithoutSection delta hfixed + +/-- The character attached to the chosen Kummer root agrees with the root +quotient of the chosen generator. -/ +@[simp] +theorem chosenSimpleKummerRootCharacter_apply + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (b : Kˣ) + (sigma : Gal((chosenSimpleKummerExtension K n hnK b)/K)) : + chosenSimpleKummerRootCharacter K n hnK hmu b sigma = + ⟨rootQuotient + (K := K) (L := chosenSimpleKummerExtension K n hnK b) + (chosenSimpleKummerRootUnit K n hnK b) sigma, + chosenSimpleKummer_rootQuotient_mem K n hnK b sigma⟩ := by + let E := chosenSimpleKummerExtension K n hnK b + let _ : MulDistribMulAction Gal(E/K) Eˣ := + AlgEquiv.instMulDistribMulActionUnits + let D := + chosenFiniteKummerRadicalDatum (K := K) (L := E) n + let delta : D.carrier := + ⟨b, chosenSimpleKummerRootUnit K n hnK b, + chosenSimpleKummerRootUnit_pow K n hnK b⟩ + let hfixed : + ∀ tau : Gal(E/K), ∀ u : Eˣ, + u ^ (n : ℕ) = 1 → + Units.map tau.toMonoidHom u = u := + nthRootsOfUnity_fixed (K := K) (L := E) n + (nthRootsOfUnityInBase_of_primitiveRoots + (K := K) (L := E) n hmu) + apply Subtype.ext + change + D.rootCharacter delta hfixed sigma = + rootQuotient + (K := K) (L := E) + (chosenSimpleKummerRootUnit K n hnK b) sigma + exact + (D.rootCharacter_eq_of_same_pow hfixed delta + (chosenSimpleKummerRootUnit_pow K n hnK b) sigma).symm + +/-- A Galois automorphism fixes the chosen radical exactly when it is the +identity. -/ +theorem chosenSimpleKummerRootQuotient_eq_one_iff + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) (b : Kˣ) + (sigma : Gal((chosenSimpleKummerExtension K n hnK b)/K)) : + rootQuotient + (K := K) (L := chosenSimpleKummerExtension K n hnK b) + (chosenSimpleKummerRootUnit K n hnK b) sigma = 1 ↔ + sigma = 1 := by + constructor + · intro hquot + have hfix := (rootQuotient_eq_one_iff + (K := K) (L := chosenSimpleKummerExtension K n hnK b) + (chosenSimpleKummerRootUnit K n hnK b) sigma).1 hquot + apply AlgEquiv.coe_toAlgHom_injective + apply IntermediateField.adjoin_algHom_ext K + intro beta hbeta + have hbeta' : beta = chosenSimpleKummerRoot K n hnK b := + Set.mem_singleton_iff.mp hbeta + subst beta + have hval := congrArg Units.val hfix + change + sigma + (chosenSimpleKummerRootUnit K n hnK b : + chosenSimpleKummerExtension K n hnK b) = + (1 : Gal((chosenSimpleKummerExtension K n hnK b)/K)) + (chosenSimpleKummerRootUnit K n hnK b : + chosenSimpleKummerExtension K n hnK b) + exact hval + · rintro rfl + exact rootQuotient_one + (K := K) (L := chosenSimpleKummerExtension K n hnK b) + (chosenSimpleKummerRootUnit K n hnK b) + +/-- Evaluation on the generating radical separates all automorphisms. -/ +theorem chosenSimpleKummerRootCharacter_injective + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (b : Kˣ) : + Function.Injective + (chosenSimpleKummerRootCharacter K n hnK hmu b) := by + intro sigma tau hst + apply div_eq_one.mp + apply + (chosenSimpleKummerRootQuotient_eq_one_iff + K n hnK b (sigma / tau)).1 + have hchar : + chosenSimpleKummerRootCharacter K n hnK hmu b (sigma / tau) = 1 := by + rw [map_div, hst] + exact div_self' _ + rw [chosenSimpleKummerRootCharacter_apply K n hnK hmu b] at hchar + exact congrArg Subtype.val hchar + +/-- The Galois group of a simple Kummer extension is cyclic. -/ +theorem chosenSimpleKummerExtension_isCyclic + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (b : Kˣ) : + IsCyclic Gal((chosenSimpleKummerExtension K n hnK b)/K) := by + let : IsAbelianGalois K (chosenSimpleKummerExtension K n hnK b) := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + exact + isCyclic_of_injective + (chosenSimpleKummerRootCharacter K n hnK hmu b) + (chosenSimpleKummerRootCharacter_injective K n hnK hmu b) + +/-- Every automorphism of a simple Kummer extension has exponent +dividing `n`. -/ +theorem chosenSimpleKummerExtension_galois_pow_eq_one + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (b : Kˣ) + (sigma : Gal((chosenSimpleKummerExtension K n hnK b)/K)) : + sigma ^ (n : ℕ) = 1 := by + apply chosenSimpleKummerRootCharacter_injective K n hnK hmu b + rw [map_pow, map_one] + apply Subtype.ext + exact (chosenSimpleKummerRootCharacter K n hnK hmu b sigma).property + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtensionNorm.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtensionNorm.lean new file mode 100644 index 0000000000..b56c4e6a43 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtensionNorm.lean @@ -0,0 +1,261 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient +public import Mathlib.GroupTheory.Coset.Card +public import Mathlib.RingTheory.Polynomial.Cyclotomic.Basic +/-! +# Norm witnesses in simple Kummer extensions + +This file constructs a field-generic norm witness for the pair formed by a +unit and its nonzero complement. The construction uses the finite quotient +of the roots of unity by the image of the simple Kummer character, so it does +not require the defining power polynomial to be irreducible. +-/ + +@[expose] public section + +noncomputable +section + +namespace KummerTheory + +open scoped BigOperators + +/-- A group character's image and its quotient give coordinates on the target group. -/ +private noncomputable def quotientCharacterProductEquiv + {G M : Type*} [Group G] [CommGroup M] + (chi : G →* M) (hchi : Function.Injective chi) : (M ⧸ chi.range) × G ≃ M := by + classical + let indexMap : (M ⧸ chi.range) × G → M := fun p => Quotient.out p.1 * chi p.2 + apply Equiv.ofBijective indexMap + constructor + · rintro ⟨q, sigma⟩ ⟨r, tau⟩ h + have hq : q = r := by + have hm := congrArg (fun z : M => (QuotientGroup.mk z : M ⧸ chi.range)) h + rw [QuotientGroup.mk_mul_of_mem _ (show chi sigma ∈ chi.range from ⟨sigma, rfl⟩), + QuotientGroup.mk_mul_of_mem _ (show chi tau ∈ chi.range from ⟨tau, rfl⟩)] at hm + simpa only [Quotient.out_eq'] using hm + subst r + have hsigma : sigma = tau := hchi (mul_left_cancel h) + subst tau + rfl + · intro z + let q : M ⧸ chi.range := QuotientGroup.mk z + have hrel : (Quotient.out q)⁻¹ * z ∈ chi.range := by + apply QuotientGroup.leftRel_apply.mp + exact @Quotient.exact' M (QuotientGroup.leftRel chi.range) _ _ + (by simpa only [q] using Quotient.out_eq' q) + obtain ⟨sigma, hsigma⟩ := hrel + refine ⟨(q, sigma), ?_⟩ + change Quotient.out q * chi sigma = z + rw [hsigma] + simp + +variable (K : Type) [Field K] + +/-- If both `a` and `1 - a` are nonzero, then `a` is a norm from the simple +Kummer extension obtained by adjoining an `n`-th root of `1 - a`. -/ +theorem unit_mem_localNormSubgroup_chosenSimpleKummerExtension_one_sub + (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) + (hmu : (primitiveRoots (n : ℕ) K).Nonempty) + (a : Kˣ) (h_one_sub : 1 - (a : K) ≠ 0) : + a ∈ LocalFieldTheory.localNormSubgroup K + (chosenSimpleKummerExtension K n hnK + (Units.mk0 (1 - (a : K)) h_one_sub)) := by + classical + let b : Kˣ := Units.mk0 (1 - (a : K)) h_one_sub + let E := chosenSimpleKummerExtension K n hnK b + let beta : Eˣ := chosenSimpleKummerRootUnit K n hnK b + let _ : FiniteDimensional K E := + chosenSimpleKummerExtension_finiteDimensional K n hnK b + let _ : IsAbelianGalois K E := + chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b + let _ : MulDistribMulAction Gal(E/K) Eˣ := + AlgEquiv.instMulDistribMulActionUnits + let _ : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + let mu := nthRootsSubgroup E (n : ℕ) + let chi : Gal(E/K) →* mu := + chosenSimpleKummerRootCharacter K n hnK hmu b + let H : Subgroup mu := chi.range + let Q := mu ⧸ H + let _ : Fintype mu := nthRootsSubgroupFintype E (n : ℕ) + let _ : Fintype Q := Fintype.ofFinite _ + have hchi : Function.Injective chi := by + simpa only [chi, E] using + chosenSimpleKummerRootCharacter_injective K n hnK hmu b + let indexEquiv : Q × Gal(E/K) ≃ mu := + quotientCharacterProductEquiv chi hchi + have indexEquiv_apply (q : Q) (sigma : Gal(E/K)) : + indexEquiv (q, sigma) = Quotient.out q * chi sigma := by + rfl + have factor_ne (q : Q) : + 1 - ((((Quotient.out q : mu).1 : Eˣ) : E) * (beta : E)) ≠ 0 := by + intro hzero + have hmul : (Quotient.out q : mu).1 * beta = 1 := by + apply Units.ext + exact (sub_eq_zero.mp hzero).symm + have hb_map : Units.map (algebraMap K E).toMonoidHom b = 1 := by + calc + Units.map (algebraMap K E).toMonoidHom b = beta ^ (n : ℕ) := + (chosenSimpleKummerRootUnit_pow K n hnK b).symm + _ = ((Quotient.out q : mu).1 * beta) ^ (n : ℕ) := by + rw [mul_pow, (Quotient.out q : mu).2, one_mul] + _ = 1 := by rw [hmul, one_pow] + have hb : b = 1 := + (Units.map_injective (f := (algebraMap K E).toMonoidHom) + (algebraMap K E).injective) hb_map + have hb_val := congrArg Units.val hb + change 1 - (a : K) = 1 at hb_val + exact a.ne_zero (sub_eq_self.mp hb_val) + let factor (q : Q) : Eˣ := + Units.mk0 + (1 - ((((Quotient.out q : mu).1 : Eˣ) : E) * (beta : E))) + (factor_ne q) + let witness : Eˣ := ∏ q : Q, factor q + let hbase : NthRootsOfUnityInBase (K := K) (L := E) n := + nthRootsOfUnityInBase_of_primitiveRoots + (K := K) (L := E) n hmu + have chi_mul_beta (sigma : Gal(E/K)) : + (chi sigma).1 * beta = Units.map sigma.toMonoidHom beta := by + change + (chosenSimpleKummerRootCharacter K n hnK hmu b sigma).1 * beta = + Units.map sigma.toMonoidHom beta + rw [chosenSimpleKummerRootCharacter_apply] + change + rootQuotient (K := K) (L := E) beta sigma * beta = + Units.map sigma.toMonoidHom beta + simp only [rootQuotient] + rw [div_mul_cancel] + simp only [AlgEquiv.smul_units_def] + apply Units.ext + rfl + have map_factor (sigma : Gal(E/K)) (q : Q) : + sigma (factor q : E) = + 1 - (((((Quotient.out q : mu) * chi sigma).1 : Eˣ) : E) * + (beta : E)) := by + have hroot_fixed := nthRootsOfUnity_fixed n hbase sigma + (Quotient.out q : mu).1 (Quotient.out q : mu).2 + change + Units.map sigma.toMonoidHom (Quotient.out q : mu).1 = + (Quotient.out q : mu).1 at hroot_fixed + have hroot_fixed_val := congrArg Units.val hroot_fixed + have hbeta_val := congrArg Units.val (chi_mul_beta sigma) + change + sigma + (1 - (((Quotient.out q : mu).1 : Eˣ) : E) * (beta : E)) = + 1 - (((((Quotient.out q : mu) * chi sigma).1 : Eˣ) : E) * + (beta : E)) + rw [map_sub, map_one, map_mul] + change + sigma ((((Quotient.out q : mu).1 : Eˣ) : E)) = + (((Quotient.out q : mu).1 : Eˣ) : E) at hroot_fixed_val + change + ((((chi sigma).1 * beta : Eˣ) : E)) = sigma (beta : E) at hbeta_val + rw [hroot_fixed_val, ← hbeta_val] + change + 1 - ((((Quotient.out q : mu).1 : Eˣ) : E) * + ((((chi sigma).1 : Eˣ) : E) * (beta : E))) = + 1 - (((((Quotient.out q : mu).1 : Eˣ) : E) * + (((chi sigma).1 : Eˣ) : E)) * (beta : E)) + rw [mul_assoc] + let rootsEquiv : + mu ≃ {z : E // z ∈ Polynomial.nthRootsFinset (n : ℕ) (1 : E)} := + { toFun := fun z => + ⟨((z.1 : Eˣ) : E), by + rw [Polynomial.mem_nthRootsFinset n.pos] + exact congrArg Units.val z.2⟩ + invFun := fun z => + ⟨Units.mk0 z.1 + (Polynomial.ne_zero_of_mem_nthRootsFinset one_ne_zero z.2), + by + apply Units.ext + exact (Polynomial.mem_nthRootsFinset n.pos (1 : E)).1 z.2⟩ + left_inv := by + intro z + apply Subtype.ext + apply Units.ext + rfl + right_inv := by + intro z + apply Subtype.ext + rfl } + have roots_product : + Finset.univ.prod + (fun z : mu => 1 - (((z.1 : Eˣ) : E) * (beta : E))) = + 1 - (beta : E) ^ (n : ℕ) := by + obtain ⟨zeta, hzeta_mem⟩ := hmu + have hzeta : IsPrimitiveRoot zeta (n : ℕ) := + (mem_primitiveRoots n.pos).1 hzeta_mem + have hzeta_E : IsPrimitiveRoot (algebraMap K E zeta) (n : ℕ) := + hzeta.map_of_injective (algebraMap K E).injective + calc + Finset.univ.prod + (fun z : mu => 1 - (((z.1 : Eˣ) : E) * (beta : E))) = + Finset.univ.prod + (fun z : {z : E // + z ∈ Polynomial.nthRootsFinset (n : ℕ) (1 : E)} => + 1 - ((z : E) * (beta : E))) := by + exact Fintype.prod_equiv rootsEquiv _ _ (fun _ => rfl) + _ = (Polynomial.nthRootsFinset (n : ℕ) (1 : E)).prod + (fun z => 1 - z * (beta : E)) := by + simpa only using + (Finset.prod_coe_sort + (s := Polynomial.nthRootsFinset (n : ℕ) (1 : E)) + (f := fun z => 1 - z * (beta : E))) + _ = 1 - (beta : E) ^ (n : ℕ) := by + simpa only [one_pow] using + (hzeta_E.pow_sub_pow_eq_prod_sub_mul + (1 : E) (beta : E) n.pos).symm + change a ∈ (LocalFieldTheory.normUnits K E).range + refine ⟨witness, ?_⟩ + apply Units.ext + apply (algebraMap K E).injective + change + algebraMap K E (Algebra.norm K (witness : E)) = + algebraMap K E (a : K) + calc + algebraMap K E (Algebra.norm K (witness : E)) = + Finset.univ.prod + (fun sigma : Gal(E/K) => sigma (witness : E)) := + Algebra.norm_eq_prod_automorphisms K (witness : E) + _ = Finset.univ.prod (fun sigma : Gal(E/K) => + Finset.univ.prod (fun q : Q => sigma (factor q : E))) := by + apply Finset.prod_congr rfl + intro sigma _ + simp only [witness, Units.coe_prod, map_prod] + _ = Finset.univ.prod (fun sigma : Gal(E/K) => + Finset.univ.prod (fun q : Q => + 1 - (((((Quotient.out q : mu) * chi sigma).1 : Eˣ) : E) * + (beta : E)))) := by + apply Finset.prod_congr rfl + intro sigma _ + apply Finset.prod_congr rfl + intro q _ + exact map_factor sigma q + _ = Finset.univ.prod (fun p : Q × Gal(E/K) => + 1 - (((((Quotient.out p.1 : mu) * chi p.2).1 : Eˣ) : E) * + (beta : E))) := by + exact (Fintype.prod_prod_type_right' _).symm + _ = Finset.univ.prod + (fun z : mu => 1 - (((z.1 : Eˣ) : E) * (beta : E))) := by + exact Fintype.prod_equiv indexEquiv _ _ (by + intro p + rw [indexEquiv_apply p.1 p.2]) + _ = 1 - (beta : E) ^ (n : ℕ) := roots_product + _ = algebraMap K E (a : K) := by + have hbeta_pow := congrArg Units.val + (chosenSimpleKummerRootUnit_pow K n hnK b) + change + (beta : E) ^ (n : ℕ) = + algebraMap K E (1 - (a : K)) at hbeta_pow + rw [hbeta_pow, map_sub, map_one] + ring + +end KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers.lean new file mode 100644 index 0000000000..f363b817ba --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.CyclotomicTorsionQuotient +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteInteger +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerCore +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerPrimeProduct +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerUnits +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.TopologicalGeneration + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/CyclotomicTorsionQuotient.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/CyclotomicTorsionQuotient.lean new file mode 100644 index 0000000000..249088e2e5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/CyclotomicTorsionQuotient.lean @@ -0,0 +1,76 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteInteger +public import Mathlib.GroupTheory.Torsion +/-! +# The torsion quotient in the cyclotomic decomposition + +The cyclotomic torsion calculation uses the decomposition +`Gal(ℚ_cyc/ℚ) ≃ ℤ̂ × f`, where the torsion subgroup is dense in the +second factor. This file proves the topological-group calculation which +turns that decomposition into a `ℤ̂`-extension. +-/ + +@[expose] public section + +open scoped Topology + +noncomputable +section + +namespace ClassFormation + +/-- The additive group of `ℤ̂` is torsion-free. -/ +instance : IsAddTorsionFree ZHat := + ⟨fun {_} hn => zHatMulNat_injective (Nat.pos_of_ne_zero hn)⟩ + +/-- The multiplicative presentation of additive `ℤ̂` is torsion-free. -/ +instance : IsMulTorsionFree (Multiplicative ZHat) := + inferInstance + +/-- In a product `ℤ̂ × T` whose torsion is dense in `T`, the closure of +the torsion subgroup is precisely the second factor. -/ +theorem topologicalClosure_torsion_zHatMul_prod + (T : Type*) [CommGroup T] [TopologicalSpace T] [IsTopologicalGroup T] + (hT : Dense (CommGroup.torsion T : Set T)) : + (CommGroup.torsion (Multiplicative ZHat × T)).topologicalClosure = + (⊥ : Subgroup (Multiplicative ZHat)).prod (⊤ : Subgroup T) := by + rw [CommGroup.torsion_prod, + (CommGroup.isMulTorsionFree_iff_torsion_eq_bot.mp inferInstance)] + apply SetLike.ext' + rw [Subgroup.topologicalClosure_coe, Subgroup.coe_prod, + closure_prod_eq] + simp only [Subgroup.coe_bot, hT.closure_eq] + rw [closure_singleton] + ext x + simp [Subgroup.mem_prod] + +/-- Algebraic quotient form of the cyclotomic torsion decomposition: after a cyclotomic +decomposition +with dense torsion factor, quotienting by the closure of torsion leaves +the `ℤ̂` factor. -/ +noncomputable def torsionQuotientZHatMulProdEquiv + (T : Type*) [CommGroup T] [TopologicalSpace T] [IsTopologicalGroup T] + (hT : Dense (CommGroup.torsion T : Set T)) : + (Multiplicative ZHat × T) ⧸ + (CommGroup.torsion (Multiplicative ZHat × T)).topologicalClosure ≃* + Multiplicative ZHat := by + rw [topologicalClosure_torsion_zHatMul_prod T hT] + let fstHom : Multiplicative ZHat × T →* Multiplicative ZHat := + MonoidHom.fst _ _ + have hker : + fstHom.ker = + (⊥ : Subgroup (Multiplicative ZHat)).prod (⊤ : Subgroup T) := by + ext x + simp [fstHom, Subgroup.mem_prod] + rw [← hker] + exact QuotientGroup.quotientKerEquivOfSurjective + fstHom Prod.fst_surjective + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteInteger.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteInteger.lean new file mode 100644 index 0000000000..994fa7fe13 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteInteger.lean @@ -0,0 +1,272 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import Mathlib.Topology.Neighborhoods +public import Mathlib.Algebra.Group.Subgroup.Ker +public import Mathlib.GroupTheory.Index +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerCore + +/-! # Profinite Integer -/ + +@[expose] public section +namespace ClassFormation + +/-! +# normalized degree and Frobenius theory: the profinite integers + +This file supplies the source-producing facts about `ℤ̂` used to normalize the +surjection in the opening datum of abstract valuation theory. In particular, +multiplication by a positive integer identifies `ℤ̂` with the closed subgroup +`n ℤ̂`, which is the kernel of reduction modulo `n`. +-/ + +noncomputable +section + +/-- Distinct natural powers of the canonical positive generator of `ℤ̂` are +distinct. This common exponent-uniqueness fact is independent of the later +reciprocity constructions that use it. -/ +theorem proCIntegerOne_pow_nat_injective : + Function.Injective (fun n : ℕ => + (Multiplicative.ofAdd (1 : ZHat)) ^ n) := by + intro a b hab + let m := a + b + 1 + have hm : 0 < m := by simp [m] + have ha : a < m := by omega + have hb : b < m := by omega + have habAdd := congrArg Multiplicative.toAdd hab + have habAdd' : a • (1 : ZHat) = b • (1 : ZHat) := by + simpa using habAdd + have habRed := congrArg (fun z : ZHat => zHatReduction m hm z) habAdd' + have hredOne : zHatReduction m hm (1 : ZHat) = 1 := + rfl + change zHatReduction m hm (a • (1 : ZHat)) = + zHatReduction m hm (b • (1 : ZHat)) at habRed + rw [map_nsmul, map_nsmul, hredOne] at habRed + have hval := congrArg ZMod.val habRed + simpa [ZMod.val_natCast_of_lt ha, ZMod.val_natCast_of_lt hb] using hval + +/-- Multiplication by `n` on the additive group of the profinite integers. -/ +def zHatMulNat (n : ℕ) : ContinuousAddMonoidHom ZHat ZHat where + toFun := fun x => n • x + map_zero' := nsmul_zero n + map_add' := fun x y => nsmul_add x y n + continuous_toFun := continuous_nsmul n + +/-- The defining evaluation formula for `zHatMulNat` is `zHatMulNat n x = n • x`. -/ +@[simp] +theorem zHatMulNat_apply (n : ℕ) (x : ZHat) : + zHatMulNat n x = n • x := + rfl + +private theorem zmod_cast_eq_of_nsmul_eq + {n m : ℕ} (hn : 0 < n) {a b : ZMod (n * m)} + (h : n • a = n • b) : + ZMod.castHom (show m ∣ n * m from ⟨n, by simp [Nat.mul_comm]⟩) (ZMod m) a = + ZMod.castHom (show m ∣ n * m from ⟨n, by simp [Nat.mul_comm]⟩) (ZMod m) b := by + rcases ZMod.intCast_surjective a with ⟨a, rfl⟩ + rcases ZMod.intCast_surjective b with ⟨b, rfl⟩ + rw [ZMod.castHom_apply, ZMod.castHom_apply] + rw [ZMod.cast_intCast + (R := ZMod m) (n := n * m) (m := m) + (show m ∣ n * m from ⟨n, by simp [Nat.mul_comm]⟩) a, + ZMod.cast_intCast + (R := ZMod m) (n := n * m) (m := m) + (show m ∣ n * m from ⟨n, by simp [Nat.mul_comm]⟩) b] + rw [← sub_eq_zero, ← Int.cast_sub, ZMod.intCast_zmod_eq_zero_iff_dvd] + have hzero : (n • ((a - b : ℤ) : ZMod (n * m))) = 0 := by + rw [Int.cast_sub, nsmul_sub, h, sub_self] + have hdiv : ((n * m : ℕ) : ℤ) ∣ (n : ℤ) * (a - b) := by + rw [← ZMod.intCast_zmod_eq_zero_iff_dvd] + simpa [nsmul_eq_mul, Int.cast_natCast, Int.cast_mul] using hzero + have hn0 : (n : ℤ) ≠ 0 := by exact_mod_cast Nat.ne_of_gt hn + apply (mul_dvd_mul_iff_left hn0).mp + simpa [Nat.cast_mul] using hdiv + +/-- Multiplication by a positive integer is injective on `ℤ̂`. -/ +theorem zHatMulNat_injective {n : ℕ} (hn : 0 < n) : + Function.Injective (zHatMulNat n) := by + intro x y hxy + apply ZHat.ext + intro m hm + have hnm : 0 < n * m := Nat.mul_pos hn hm + have hdiv : m ∣ n * m := ⟨n, by simp [Nat.mul_comm]⟩ + have hj : n • zHatReduction (n * m) hnm x = + n • zHatReduction (n * m) hnm y := by + simpa only [zHatMulNat_apply, map_nsmul] using + congrArg (fun z : ZHat => zHatReduction (n * m) hnm z) hxy + rw [← zHatReduction_transition hm hnm hdiv x, + ← zHatReduction_transition hm hnm hdiv y] + exact zmod_cast_eq_of_nsmul_eq hn hj + +/-- The image `n ℤ̂` is closed. -/ +theorem isClosed_zHatMulNat_range (n : ℕ) : + IsClosed ((zHatMulNat n).toAddMonoidHom.range : Set ZHat) := by + rw [AddMonoidHom.coe_range] + exact (isCompact_range (map_continuous (zHatMulNat n))).isClosed + +/-- Establishes the identity `zHatReduction n hn ((Int.castRingHom ZHat) a) = (a : ZMod n)`. -/ +@[simp] +theorem zHatReduction_int (n : ℕ) (hn : 0 < n) (a : ℤ) : + zHatReduction n hn + ((Int.castRingHom ZHat) a) = + (a : ZMod n) := + rfl + +/-- Reduction modulo a positive integer is onto. -/ +theorem zHatReduction_surjective (n : ℕ) (hn : 0 < n) : + Function.Surjective (zHatReduction n hn) := by + intro a + rcases ZMod.intCast_surjective a with ⟨a, rfl⟩ + exact ⟨(Int.castRingHom ZHat) a, rfl⟩ + +/-- +Establishes the identity `zHatMulNat n ((Int.castRingHom ZHat) a) = (Int.castRingHom ZHat) ((n : +ℤ) * a)`. +-/ +theorem zHatMulNat_int (n : ℕ) (a : ℤ) : + zHatMulNat n ((Int.castRingHom ZHat) a) = + (Int.castRingHom ZHat) ((n : ℤ) * a) := by + apply ZHat.ext + intro m hm + change n • (a : ZMod m) = (((n : ℤ) * a : ℤ) : ZMod m) + simp [nsmul_eq_mul] + +/-- The subgroup `n ℤ̂` is exactly the kernel of reduction modulo `n`. -/ +theorem zHatMulNat_range_eq_ker_reduction (n : ℕ) (hn : 0 < n) : + (zHatMulNat n).toAddMonoidHom.range = + (zHatReduction n hn).toAddMonoidHom.ker := by + apply AddSubgroup.ext + intro y + constructor + · rintro ⟨x, rfl⟩ + change zHatReduction n hn (zHatMulNat n x) = 0 + change n • zHatReduction n hn x = 0 + simp [nsmul_eq_mul] + · intro hy + let K : Set ZHat := + ((zHatReduction n hn).toAddMonoidHom.ker : Set ZHat) + let D : Set ZHat := + Set.range (Int.castRingHom ZHat) + have hKopen : IsOpen K := by + change IsOpen ((zHatReduction n hn) ⁻¹' ({0} : Set (ZMod n))) + have hzeroOpen : IsOpen ({0} : Set (ZMod n)) := isOpen_discrete _ + exact hzeroOpen.preimage (map_continuous (zHatReduction n hn)) + have hDdense : Dense D := by + exact denseRange_intCast_zHat + have hKD : K ∩ D ⊆ + ((zHatMulNat n).toAddMonoidHom.range : Set ZHat) := by + rintro _ ⟨hzK, a, rfl⟩ + have ha0 : (a : ZMod n) = 0 := by + simpa [K] using hzK + have hna : (n : ℤ) ∣ a := + (ZMod.intCast_zmod_eq_zero_iff_dvd a n).mp ha0 + rcases hna with ⟨b, rfl⟩ + refine ⟨(Int.castRingHom ZHat) b, ?_⟩ + exact zHatMulNat_int n b + have hyClosure : y ∈ closure (K ∩ D) := + (hDdense.open_subset_closure_inter hKopen) hy + exact (closure_minimal hKD (isClosed_zHatMulNat_range n)) hyClosure + +/-- The additive index of `n ℤ̂` in `ℤ̂` is `n`. -/ +theorem zHatMulNat_range_index (n : ℕ) (hn : 0 < n) : + (zHatMulNat n).toAddMonoidHom.range.index = n := by + let : NeZero n := ⟨hn.ne'⟩ + rw [zHatMulNat_range_eq_ker_reduction n hn, + AddSubgroup.index_ker] + rw [AddMonoidHom.range_eq_top_of_surjective + (zHatReduction n hn).toAddMonoidHom (zHatReduction_surjective n hn)] + calc + Nat.card (↑(⊤ : AddSubgroup (ZMod n))) = Nat.card (ZMod n) := + Nat.card_congr + { toFun := fun x => x.1 + invFun := fun x => ⟨x, AddSubgroup.mem_top x⟩ + left_inv := fun x => Subtype.ext rfl + right_inv := fun _ => rfl } + _ = n := Nat.card_zmod n + +/-- Every additive subgroup of finite nonzero index in `ℤ̂` is the expected +principal subgroup. Closedness is not needed: the quotient is abelian, so its +cardinality annihilates every quotient class, and comparison of indices forces +equality. -/ +theorem zHatAddSubgroup_eq_mulNat_range_of_index_ne_zero + (H : AddSubgroup ZHat) (hH : H.index ≠ 0) : + H = (zHatMulNat H.index).toAddMonoidHom.range := by + have hle : (zHatMulNat H.index).toAddMonoidHom.range ≤ H := by + rintro y ⟨x, rfl⟩ + exact H.nsmul_index_mem x + have hrangeIndex : + (zHatMulNat H.index).toAddMonoidHom.range.index = H.index := + zHatMulNat_range_index H.index (Nat.pos_of_ne_zero hH) + have hrel : + (zHatMulNat H.index).toAddMonoidHom.range.relIndex H = 1 := by + have heq : + (zHatMulNat H.index).toAddMonoidHom.range.relIndex H * H.index = + H.index := + (AddSubgroup.relIndex_mul_index hle).trans hrangeIndex + apply Nat.eq_of_mul_eq_mul_right (Nat.pos_of_ne_zero hH) + simpa only [one_mul] using heq + exact le_antisymm (AddSubgroup.relIndex_eq_one.mp hrel) hle + +/-- Index-explicit form of the classification of finite-index additive +subgroups of `ℤ̂`. -/ +theorem zHatAddSubgroup_eq_mulNat_range_of_index_eq + (H : AddSubgroup ZHat) {n : ℕ} (hn : 0 < n) (hindex : H.index = n) : + H = (zHatMulNat n).toAddMonoidHom.range := by + subst n + exact zHatAddSubgroup_eq_mulNat_range_of_index_ne_zero H + (Nat.ne_of_gt hn) + +/-- A subgroup with finite quotient is the subgroup obtained by multiplying by +its index. -/ +theorem zHatAddSubgroup_eq_mulNat_range_of_finite_quotient + (H : AddSubgroup ZHat) [Finite (ZHat ⧸ H)] : + H = (zHatMulNat H.index).toAddMonoidHom.range := + zHatAddSubgroup_eq_mulNat_range_of_index_ne_zero H + H.index_ne_zero_of_finite + +/-- Multiplication by `n > 0` identifies `ℤ̂` continuously with its image. -/ +noncomputable def zHatMulNatRangeEquiv (n : ℕ) (hn : 0 < n) : + ZHat ≃ₜ+ (zHatMulNat n).toAddMonoidHom.range := by + let e : ZHat ≃+ (zHatMulNat n).toAddMonoidHom.range := + AddMonoidHom.ofInjective (zHatMulNat_injective hn) + have he : Continuous e := by + change Continuous fun x : ZHat => + (⟨zHatMulNat n x, ⟨x, rfl⟩⟩ : (zHatMulNat n).toAddMonoidHom.range) + exact Continuous.subtype_mk (map_continuous (zHatMulNat n)) fun x => ⟨x, rfl⟩ + let h : ZHat ≃ₜ (zHatMulNat n).toAddMonoidHom.range := + he.homeoOfEquivCompactToT2 + exact + { e with + continuous_toFun := h.continuous + continuous_invFun := h.symm.continuous } + +/-- Division by `n` on the subgroup `n ℤ̂`. -/ +noncomputable def zHatDivide (n : ℕ) (hn : 0 < n) : + ContinuousAddMonoidHom ((zHatMulNat n).toAddMonoidHom.range) ZHat := + (zHatMulNatRangeEquiv n hn).symm + +/-- Establishes the identity `zHatMulNat n (zHatDivide n hn y) = y.1`. -/ +theorem zHatMulNat_zHatDivide (n : ℕ) (hn : 0 < n) + (y : (zHatMulNat n).toAddMonoidHom.range) : + zHatMulNat n (zHatDivide n hn y) = y.1 := by + change ((zHatMulNatRangeEquiv n hn) + ((zHatMulNatRangeEquiv n hn).symm y)).1 = y.1 + exact congrArg Subtype.val ((zHatMulNatRangeEquiv n hn).apply_symm_apply y) + +/-- Establishes the identity `zHatDivide n hn ⟨zHatMulNat n x, ⟨x, rfl⟩⟩ = x`. -/ +theorem zHatDivide_zHatMulNat (n : ℕ) (hn : 0 < n) (x : ZHat) : + zHatDivide n hn + ⟨zHatMulNat n x, ⟨x, rfl⟩⟩ = x := by + change (zHatMulNatRangeEquiv n hn).symm + ((zHatMulNatRangeEquiv n hn) x) = x + exact (zHatMulNatRangeEquiv n hn).symm_apply_apply x + +end +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerCore.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerCore.lean new file mode 100644 index 0000000000..7c6361aabf --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerCore.lean @@ -0,0 +1,238 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Data.ZMod.Basic +public import Mathlib.Topology.Instances.ZMod +public import Mathlib.Topology.Algebra.Ring.Basic +public import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Basic +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.TopologicalGeneration + +/-! # Profinite Integer Core -/ + +@[expose] public section +namespace ClassFormation + +/-! +# Profinite completion of the integers + +We construct `ℤ̂` as the topological closure of the diagonal image of `ℤ` +inside the product of all positive cyclic quotients `ZMod n`. This realizes +the canonical reduction maps and the dense integer embedding directly in +Mathlib. +-/ + +open scoped Topology + +/-- A positive modulus indexing the finite quotients of the profinite integers. -/ +structure ZHatIndex where + /-- The natural-number modulus. -/ + modulus : ℕ + /-- Every index has a positive modulus. -/ + positive : 0 < modulus + +/-- The modulus of a profinite-integer index is nonzero. -/ +instance (i : ZHatIndex) : NeZero i.modulus := + ⟨Nat.ne_of_gt i.positive⟩ + +/-- Package a positive natural number as a profinite-integer modulus. -/ +def zHatIndex (n : ℕ) (hn : 0 < n) : ZHatIndex := + ⟨n, hn⟩ + +/-- The product of the finite cyclic rings over all positive moduli. -/ +abbrev ZHatAmbient : Type 0 := + ∀ i : ZHatIndex, ZMod i.modulus + +/-- The diagonal ring homomorphism from the integers into all finite cyclic quotients. -/ +def zHatDiagonal : ℤ →+* ZHatAmbient where + toFun a i := (a : ZMod i.modulus) + map_zero' := by + funext i + exact Int.cast_zero + map_one' := by + funext i + exact Int.cast_one + map_add' a b := by + funext i + exact Int.cast_add a b + map_mul' a b := by + funext i + exact Int.cast_mul a b + +/-- The diagonal image of the integers in the product of finite cyclic rings. -/ +def zHatIntegerSubring : Subring ZHatAmbient := + zHatDiagonal.range + +/-- The closure of the integer diagonal in the product of finite cyclic rings. -/ +abbrev ZHatClosureModel : Type 0 := + zHatIntegerSubring.topologicalClosure + +/-- The profinite completion `ℤ̂ = lim ℤ/nℤ` over all positive moduli. + +This is deliberately a `def`, rather than an `abbrev`: clients use the +reduction maps and the representation equivalence below instead of depending +on the closure subtype. -/ +def ZHat : Type 0 := + ZHatClosureModel + +/-- The closure model equips `ZHat` with its canonical commutative ring structure. -/ +instance : CommRing ZHat := by + change CommRing ZHatClosureModel + infer_instance + +/-- The closure model equips `ZHat` with its subspace topology. -/ +instance : TopologicalSpace ZHat := by + change TopologicalSpace ZHatClosureModel + infer_instance + +/-- Ring operations on `ZHat` are continuous for the closure-model topology. -/ +instance : IsTopologicalRing ZHat := by + change IsTopologicalRing ZHatClosureModel + infer_instance + +/-- The closure-model topology on `ZHat` is Hausdorff. -/ +instance : T2Space ZHat := by + change T2Space ZHatClosureModel + infer_instance + +/-- The profinite integer model is totally disconnected. -/ +instance : TotallyDisconnectedSpace ZHat := by + change TotallyDisconnectedSpace ZHatClosureModel + infer_instance + +/-- The profinite integer closure model is compact. -/ +instance : CompactSpace ZHat := + Topology.IsClosedEmbedding.compactSpace + (Subring.isClosed_topologicalClosure zHatIntegerSubring).isClosedEmbedding_subtypeVal + +/-- `ZHat` as Mathlib's bundled profinite additive group. -/ +def zHatProfiniteAddGrp : ProfiniteAddGrp := + ProfiniteAddGrp.of ZHat + +/-- The multiplicative presentation of `ZHat` remains totally disconnected. -/ +instance : TotallyDisconnectedSpace (Multiplicative ZHat) := by + change TotallyDisconnectedSpace ZHat + infer_instance + +/-- The multiplicative presentation of `ZHat` as Mathlib's bundled profinite +group. Its multiplication is addition in `ZHat`. -/ +def zHatMulProfiniteGrp : ProfiniteGrp := + ProfiniteGrp.of (Multiplicative ZHat) + +/-- The canonical continuous reduction `ℤ̂ → ℤ/nℤ`. -/ +def zHatReduction (n : ℕ) (hn : 0 < n) : + ContinuousAddMonoidHom ZHat (ZMod n) where + toFun x := (show ZHatClosureModel from x).1 (zHatIndex n hn) + map_zero' := rfl + map_add' _ _ := rfl + continuous_toFun := by + change Continuous + (fun x : ZHatClosureModel => x.1 (zHatIndex n hn)) + exact (continuous_apply (zHatIndex n hn)).comp continuous_subtype_val + +/-- Reduction agrees with the ordinary integer cast. This is the public +computation rule; it does not expose the closure model used to construct +`ZHat`. -/ +@[simp] theorem zHatReduction_intCast (n : ℕ) (hn : 0 < n) (a : ℤ) : + zHatReduction n hn (a : ZHat) = (a : ZMod n) := + rfl + +/-- Reduction modulo one sends every profinite integer to the unique residue class. -/ +@[simp] theorem zHatReduction_one (n : ℕ) (hn : 0 < n) : + zHatReduction n hn (1 : ZHat) = 1 := by + simpa only [Int.cast_one] using zHatReduction_intCast n hn 1 + +namespace ZHat + +/-- Profinite integers are determined by all positive-modulus reductions. -/ +@[ext] +theorem ext {x y : ZHat} + (h : ∀ n (hn : 0 < n), zHatReduction n hn x = zHatReduction n hn y) : + x = y := by + apply Subtype.ext + funext i + rcases i with ⟨n, hn⟩ + exact h n hn + +end ZHat + +/-- Reduction maps commute with reduction along a divisibility relation. -/ +theorem zHatReduction_transition {m n : ℕ} + (hm : 0 < m) (hn : 0 < n) (hmn : m ∣ n) (x : ZHat) : + ZMod.castHom hmn (ZMod m) (zHatReduction n hn x) = + zHatReduction m hm x := by + let f : ZHatAmbient → ZMod m := + fun z => ZMod.castHom hmn (ZMod m) (z (zHatIndex n hn)) + let g : ZHatAmbient → ZMod m := + fun z => z (zHatIndex m hm) + have hfg : Set.EqOn f g (zHatIntegerSubring : Set ZHatAmbient) := by + rintro _ ⟨a, rfl⟩ + exact map_intCast (ZMod.castHom hmn (ZMod m)) a + have hf : Continuous f := + continuous_of_discreteTopology.comp (continuous_apply (zHatIndex n hn)) + have hg : Continuous g := + continuous_apply (zHatIndex m hm) + exact hfg.closure hf hg x.property + +/-- The ordinary integers have dense image in their profinite completion. -/ +theorem denseRange_intCast_zHat : + DenseRange (Int.castRingHom ZHat) := by + have hinclusion : DenseRange + (Set.inclusion (Subring.le_topologicalClosure zHatIntegerSubring)) := by + apply (denseRange_inclusion_iff + (Subring.le_topologicalClosure zHatIntegerSubring)).2 + change closure (zHatIntegerSubring : Set ZHatAmbient) ⊆ + closure (zHatIntegerSubring : Set ZHatAmbient) + exact Set.Subset.rfl + have hdiagonal : DenseRange zHatDiagonal.rangeRestrict := + zHatDiagonal.rangeRestrict_surjective.denseRange + have hcomp : DenseRange + (Set.inclusion (Subring.le_topologicalClosure zHatIntegerSubring) ∘ + zHatDiagonal.rangeRestrict) := + hinclusion.comp hdiagonal + (continuous_inclusion + (Subring.le_topologicalClosure zHatIntegerSubring)) + have heq : + Set.inclusion (Subring.le_topologicalClosure zHatIntegerSubring) ∘ + zHatDiagonal.rangeRestrict = + (fun a : ℤ => Int.castRingHom ZHat a) := by + funext a + apply Subtype.ext + funext i + rfl + rw [heq] at hcomp + exact hcomp + +/-- The element `1` topologically generates the additive profinite integers, +written multiplicatively. -/ +theorem zHatOne_topologicallyGenerates : + TopologicallyGenerates + (G := Multiplicative ZHat) + ({Multiplicative.ofAdd (1 : ZHat)} : Set (Multiplicative ZHat)) := by + let f : Multiplicative ℤ →* Multiplicative ZHat := + AddMonoidHom.toMultiplicative (Int.castRingHom ZHat).toAddMonoidHom + have hf : DenseRange f := by + have hOfAdd : + DenseRange (Multiplicative.ofAdd : ZHat → Multiplicative ZHat) := + (show Function.Surjective + (Multiplicative.ofAdd : ZHat → Multiplicative ZHat) from + fun x => ⟨Multiplicative.toAdd x, rfl⟩).denseRange + have hCast : + DenseRange + (Multiplicative.ofAdd ∘ fun a : ℤ => (a : ZHat)) := + hOfAdd.comp denseRange_intCast_zHat continuous_id + have hToAdd : + DenseRange (Multiplicative.toAdd : Multiplicative ℤ → ℤ) := + (show Function.Surjective + (Multiplicative.toAdd : Multiplicative ℤ → ℤ) from + fun a => ⟨Multiplicative.ofAdd a, rfl⟩).denseRange + simpa [f, Function.comp_def] using + hCast.comp hToAdd continuous_of_discreteTopology + simpa [f] using + (topologicallyGenerates_singleton_of_denseRange_mint f hf) + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerPrimeProduct.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerPrimeProduct.lean new file mode 100644 index 0000000000..f3247dbd8e --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerPrimeProduct.lean @@ -0,0 +1,349 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteInteger +public import Mathlib.Data.ZMod.QuotientRing +public import Mathlib.NumberTheory.Padics.RingHoms +/-! +# Prime decomposition of the profinite integers + +This file constructs the canonical map +`ℤ̂ → ∏ p : Nat.Primes, ℤ_p` from the compatible finite reductions. +-/ + +@[expose] public section + +open scoped Topology + +noncomputable +section + +namespace ClassFormation + +local instance (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +/-- The product of the additive rings of `p`-adic integers over all +rational primes. -/ +abbrev ProfiniteIntegerPrimeProduct := + ∀ p : Nat.Primes, ℤ_[p.1] + +/-- The ring form of the canonical reduction `ℤ̂ → ℤ/nℤ`. -/ +def zHatReductionRingHom (n : ℕ) (hn : 0 < n) : + ZHat →+* ZMod n where + toFun := zHatReduction n hn + map_zero' := rfl + map_one' := rfl + map_add' _ _ := rfl + map_mul' _ _ := rfl + +@[simp] +theorem zHatReductionRingHom_apply + (n : ℕ) (hn : 0 < n) (z : ZHat) : + zHatReductionRingHom n hn z = zHatReduction n hn z := + rfl + +/-- The compatible `p`-power reductions of a profinite integer. -/ +def zHatPadicReduction (p : Nat.Primes) (n : ℕ) : + ZHat →+* ZMod (p.1 ^ n) := + zHatReductionRingHom (p.1 ^ n) (pow_pos p.2.pos n) + +theorem zHatPadicReduction_compatible + (p : Nat.Primes) (m n : ℕ) (hmn : m ≤ n) : + (ZMod.castHom (pow_dvd_pow p.1 hmn) (ZMod (p.1 ^ m))).comp + (zHatPadicReduction p n) = + zHatPadicReduction p m := by + ext z + exact zHatReduction_transition + (pow_pos p.2.pos m) (pow_pos p.2.pos n) + (pow_dvd_pow p.1 hmn) z + +/-- The `p`-adic coordinate of a profinite integer. -/ +def zHatToPadicInt (p : Nat.Primes) : + ZHat →+* ℤ_[p.1] := + PadicInt.lift (zHatPadicReduction_compatible p) + +@[simp] +theorem toZModPow_zHatToPadicInt + (p : Nat.Primes) (n : ℕ) : + (PadicInt.toZModPow n).comp (zHatToPadicInt p) = + zHatPadicReduction p n := + PadicInt.lift_spec (zHatPadicReduction_compatible p) n + +/-- The canonical ring homomorphism `ℤ̂ → ∏ₚ ℤ_p`. -/ +def zHatToProfiniteIntegerPrimeProduct : + ZHat →+* ProfiniteIntegerPrimeProduct := + RingHom.pi zHatToPadicInt + +@[simp] +theorem zHatToProfiniteIntegerPrimeProduct_apply + (z : ZHat) (p : Nat.Primes) : + zHatToProfiniteIntegerPrimeProduct z p = + zHatToPadicInt p z := + rfl + +/-- The prime-coordinate map separates profinite integers. -/ +theorem zHatToProfiniteIntegerPrimeProduct_injective : + Function.Injective zHatToProfiniteIntegerPrimeProduct := by + intro x y hxy + apply ZHat.ext + intro n hn + let e := ZMod.equivPi (n := n) hn.ne' + apply e.injective + funext p + have hpPrime : p.1.Prime := + Nat.prime_of_mem_primeFactors p.2 + let p' : Nat.Primes := ⟨p.1, hpPrime⟩ + have hpCoord := + congrArg (fun z : ProfiniteIntegerPrimeProduct => z p') hxy + have hpReduction := + congrArg (PadicInt.toZModPow (n.factorization p.1)) hpCoord + change + ((PadicInt.toZModPow (n.factorization p.1)).comp + (zHatToPadicInt p')) x = + ((PadicInt.toZModPow (n.factorization p.1)).comp + (zHatToPadicInt p')) y at hpReduction + rw [toZModPow_zHatToPadicInt] at hpReduction + have hpReduction' : + zHatReduction (p.1 ^ n.factorization p.1) + (pow_pos hpPrime.pos _) x = + zHatReduction (p.1 ^ n.factorization p.1) + (pow_pos hpPrime.pos _) y := by + exact hpReduction + have hpowDvd : + p.1 ^ n.factorization p.1 ∣ n := + (hpPrime.pow_dvd_iff_le_factorization hn.ne').2 le_rfl + have hcast : + ZMod.castHom hpowDvd + (ZMod (p.1 ^ n.factorization p.1)) + (zHatReduction n hn x) = + ZMod.castHom hpowDvd + (ZMod (p.1 ^ n.factorization p.1)) + (zHatReduction n hn y) := by + rw [zHatReduction_transition + (pow_pos hpPrime.pos _) hn hpowDvd x, + zHatReduction_transition + (pow_pos hpPrime.pos _) hn hpowDvd y] + exact hpReduction' + have heval (z : ZMod n) : + e z p = + ZMod.castHom hpowDvd + (ZMod (p.1 ^ n.factorization p.1)) z := by + change + ((Pi.evalRingHom + (fun q : n.primeFactors => + ZMod (q.1 ^ n.factorization q.1)) p).comp + e.toRingHom) z = + ZMod.castHom hpowDvd + (ZMod (p.1 ^ n.factorization p.1)) z + exact RingHom.congr_fun (Subsingleton.elim _ _) z + rw [heval, heval] + exact hcast + +/-- Each `p`-adic coordinate map is continuous. -/ +theorem continuous_zHatToPadicInt (p : Nat.Primes) : + Continuous (zHatToPadicInt p) := by + apply continuous_of_continuousAt_zero + (zHatToPadicInt p).toAddMonoidHom + rw [ContinuousAt, Metric.nhds_basis_closedBall.tendsto_right_iff] + intro ε hε + obtain ⟨n, hn⟩ := PadicInt.exists_pow_neg_lt p.1 hε + let K : Set ZHat := + (zHatPadicReduction p n).toAddMonoidHom.ker + have hKopen : IsOpen K := by + change IsOpen + ((zHatReduction (p.1 ^ n) (pow_pos p.2.pos n)) ⁻¹' + ({0} : Set (ZMod (p.1 ^ n)))) + exact (isOpen_discrete ({0} : Set (ZMod (p.1 ^ n)))).preimage + (zHatReduction (p.1 ^ n) (pow_pos p.2.pos n)).continuous + have hKzero : (0 : ZHat) ∈ K := by + change zHatPadicReduction p n 0 = 0 + exact map_zero _ + apply Filter.mem_of_superset (hKopen.mem_nhds hKzero) + intro z hz + change zHatPadicReduction p n z = 0 at hz + have hmod : + PadicInt.toZModPow n (zHatToPadicInt p z) = 0 := by + have hspec := + RingHom.congr_fun (toZModPow_zHatToPadicInt p n) z + rw [RingHom.comp_apply] at hspec + rw [hspec] + exact hz + have hmem : + zHatToPadicInt p z ∈ + Ideal.span ({(p.1 : ℤ_[p.1]) ^ n} : Set ℤ_[p.1]) := by + rw [← PadicInt.ker_toZModPow n, RingHom.mem_ker] + exact hmod + simp only [Set.mem_ofPred_eq, map_zero] + change zHatToPadicInt p z ∈ + Metric.closedBall (0 : ℤ_[p.1]) ε + rw [Metric.mem_closedBall, dist_zero_right] + exact (PadicInt.norm_le_pow_iff_mem_span_pow + (zHatToPadicInt p z) n).2 hmem |>.trans hn.le + +/-- The canonical map to the full prime product is continuous. -/ +theorem continuous_zHatToProfiniteIntegerPrimeProduct : + Continuous zHatToProfiniteIntegerPrimeProduct := + continuous_pi continuous_zHatToPadicInt + +/-- The diagonal copy of `ℤ` is dense in the product of all `ℤ_p`. +This is the topological form of the finite Chinese remainder theorem. -/ +theorem denseRange_intCast_profiniteIntegerPrimeProduct : + DenseRange + (Int.castRingHom ProfiniteIntegerPrimeProduct) := by + apply dense_iff_inter_open.mpr + rintro U hU ⟨x, hx⟩ + obtain ⟨S, u, hu, hSu⟩ := + isOpen_pi_iff.mp hU x hx + have hNhd (p : ↥S) : + u p.1 ∈ 𝓝 (x p.1) := + (hu p.1 p.2).1.mem_nhds (hu p.1 p.2).2 + choose ε hε hεsub using fun p : ↥S => + Metric.nhds_basis_closedBall.mem_iff.mp (hNhd p) + choose k hk using fun p : ↥S => + PadicInt.exists_pow_neg_lt p.1.1 (hε p) + let modulus : ↥S → ℕ := + fun p => p.1.1 ^ k p + have hcoprime : + Pairwise (fun p q : ↥S => + Nat.Coprime (modulus p) (modulus q)) := by + intro p q hpq + apply Nat.coprime_pow_primes + (k p) (k q) p.1.2 q.1.2 + intro hpval + apply hpq + apply Subtype.ext + apply Nat.Primes.coe_nat_injective + exact hpval + let target : ∀ p : ↥S, ZMod (modulus p) := + fun p => PadicInt.toZModPow (k p) (x p.1) + let crt := + ZMod.prodEquivPi modulus hcoprime + obtain ⟨a, ha⟩ := + ZMod.intCast_surjective (crt.symm target) + use Int.castRingHom ProfiniteIntegerPrimeProduct a + refine ⟨hSu ?_, a, rfl⟩ + intro p hp + let pS : ↥S := ⟨p, hp⟩ + apply hεsub pS + rw [Metric.mem_closedBall, dist_eq_norm] + have hres : + PadicInt.toZModPow (k pS) + ((a : ℤ_[p.1])) = + PadicInt.toZModPow (k pS) (x p) := by + have heval (z : ZMod (∏ q : ↥S, modulus q)) : + crt z pS = + ZMod.castHom + (Finset.dvd_prod_of_mem modulus (Finset.mem_univ pS)) + (ZMod (modulus pS)) z := by + change + ((Pi.evalRingHom + (fun q : ↥S => ZMod (modulus q)) pS).comp + crt.toRingHom) z = + ZMod.castHom + (Finset.dvd_prod_of_mem modulus (Finset.mem_univ pS)) + (ZMod (modulus pS)) z + exact RingHom.congr_fun (Subsingleton.elim _ _) z + calc + PadicInt.toZModPow (k pS) ((a : ℤ_[p.1])) = + (a : ZMod (modulus pS)) := by + simp [modulus, pS] + _ = + ZMod.castHom + (Finset.dvd_prod_of_mem modulus (Finset.mem_univ pS)) + (ZMod (modulus pS)) + (a : ZMod (∏ q : ↥S, modulus q)) := by + exact + (map_intCast + (ZMod.castHom + (Finset.dvd_prod_of_mem modulus + (Finset.mem_univ pS)) + (ZMod (modulus pS))) a).symm + _ = crt (a : ZMod (∏ q : ↥S, modulus q)) pS := + (heval (a : ZMod (∏ q : ↥S, modulus q))).symm + _ = crt (crt.symm target) pS := by rw [ha] + _ = target pS := congrFun (crt.apply_symm_apply target) pS + _ = PadicInt.toZModPow (k pS) (x p) := by + rfl + have hmem : + (a : ℤ_[p.1]) - x p ∈ + Ideal.span + ({(p.1 : ℤ_[p.1]) ^ k pS} : Set ℤ_[p.1]) := by + rw [← PadicInt.ker_toZModPow (k pS), RingHom.mem_ker, + map_sub, hres, sub_self] + exact + (PadicInt.norm_le_pow_iff_mem_span_pow + ((a : ℤ_[p.1]) - x p) (k pS)).2 hmem |>.trans + (hk pS).le + +@[simp] +theorem zHatToPadicInt_intCast + (p : Nat.Primes) (a : ℤ) : + zHatToPadicInt p (a : ZHat) = (a : ℤ_[p.1]) := + map_intCast (zHatToPadicInt p) a + +@[simp] +theorem zHatToProfiniteIntegerPrimeProduct_intCast + (a : ℤ) : + zHatToProfiniteIntegerPrimeProduct (a : ZHat) = + Int.castRingHom ProfiniteIntegerPrimeProduct a := by + funext p + exact zHatToPadicInt_intCast p a + +/-- The canonical map from the profinite integers to the product of all +`p`-adic integers is onto. Compactness closes its range, while the finite +Chinese remainder theorem makes that range dense. -/ +theorem zHatToProfiniteIntegerPrimeProduct_surjective : + Function.Surjective zHatToProfiniteIntegerPrimeProduct := by + have hsubset : + Set.range (Int.castRingHom ProfiniteIntegerPrimeProduct) ⊆ + Set.range zHatToProfiniteIntegerPrimeProduct := by + rintro y ⟨a, rfl⟩ + exact + ⟨(a : ZHat), + zHatToProfiniteIntegerPrimeProduct_intCast a⟩ + have hdense : + Dense (Set.range zHatToProfiniteIntegerPrimeProduct) := + denseRange_intCast_profiniteIntegerPrimeProduct.mono hsubset + have hclosed : + IsClosed (Set.range zHatToProfiniteIntegerPrimeProduct) := + (isCompact_range + continuous_zHatToProfiniteIntegerPrimeProduct).isClosed + intro y + have hy : + y ∈ closure + (Set.range zHatToProfiniteIntegerPrimeProduct) := by + rw [hdense.closure_eq] + trivial + rwa [hclosed.closure_eq] at hy + +/-- The Chinese-remainder ring equivalence +`ℤ̂ ≃ ∏ p : Nat.Primes, ℤ_p`. -/ +noncomputable def zHatRingEquivProfiniteIntegerPrimeProduct : + ZHat ≃+* ProfiniteIntegerPrimeProduct := + RingEquiv.ofBijective zHatToProfiniteIntegerPrimeProduct + ⟨zHatToProfiniteIntegerPrimeProduct_injective, + zHatToProfiniteIntegerPrimeProduct_surjective⟩ + +@[simp] +theorem zHatRingEquivProfiniteIntegerPrimeProduct_apply + (z : ZHat) : + zHatRingEquivProfiniteIntegerPrimeProduct z = + zHatToProfiniteIntegerPrimeProduct z := + rfl + +/-- The Chinese-remainder ring equivalence is a homeomorphism. -/ +theorem isHomeomorph_zHatRingEquivProfiniteIntegerPrimeProduct : + IsHomeomorph zHatRingEquivProfiniteIntegerPrimeProduct := by + rw [isHomeomorph_iff_continuous_bijective] + exact + ⟨continuous_zHatToProfiniteIntegerPrimeProduct, + (zHatRingEquivProfiniteIntegerPrimeProduct : + ZHat ≃ ProfiniteIntegerPrimeProduct).bijective⟩ + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerUnits.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerUnits.lean new file mode 100644 index 0000000000..f5eb314b63 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerUnits.lean @@ -0,0 +1,64 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerPrimeProduct +public import Mathlib.Topology.Algebra.Group.Units +/-! +# Units of the profinite integers + +This file upgrades the prime-product Chinese-remainder equivalence for +`ℤ̂` to topological additive, multiplicative, and unit-group equivalences. +-/ + +@[expose] public section + +open scoped Topology + +noncomputable +section + +namespace ClassFormation + +/-- The Chinese-remainder isomorphism as a topological monoid equivalence. -/ +noncomputable def zHatContinuousMulEquivPrimeProduct : + ZHat ≃ₜ* ProfiniteIntegerPrimeProduct := + ContinuousMulEquiv.mk' + (continuous_zHatToProfiniteIntegerPrimeProduct.homeoOfEquivCompactToT2 + (f := zHatRingEquivProfiniteIntegerPrimeProduct.toEquiv)) + zHatRingEquivProfiniteIntegerPrimeProduct.map_mul + +/-- The additive form of the topological Chinese-remainder isomorphism. -/ +noncomputable def zHatContinuousAddEquivPrimeProduct : + ZHat ≃ₜ+ ProfiniteIntegerPrimeProduct := + { zHatRingEquivProfiniteIntegerPrimeProduct.toAddEquiv with + continuous_toFun := + zHatContinuousMulEquivPrimeProduct.continuous_toFun + continuous_invFun := + zHatContinuousMulEquivPrimeProduct.continuous_invFun } + +local instance (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +/-- The canonical topological Chinese-remainder equivalence on unit +groups. -/ +noncomputable def zHatUnitsContinuousMulEquivPrimeProduct : + ZHatˣ ≃ₜ* ((p : Nat.Primes) → ℤ_[p.1]ˣ) := + (Units.mapContinuousMulEquiv + zHatContinuousMulEquivPrimeProduct).trans + ContinuousMulEquiv.piUnits + +/-- On underlying ring elements, the unit-group Chinese-remainder +equivalence is the canonical `p`-adic coordinate map. -/ +@[simp] +theorem zHatUnitsContinuousMulEquivPrimeProduct_coe_apply + (u : ZHatˣ) (p : Nat.Primes) : + (zHatUnitsContinuousMulEquivPrimeProduct u p : ℤ_[p.1]) = + zHatToPadicInt p (u : ZHat) := + rfl + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/TopologicalGeneration.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/TopologicalGeneration.lean new file mode 100644 index 0000000000..5ece261be2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/TopologicalGeneration.lean @@ -0,0 +1,205 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Topology.Algebra.ClopenNhdofOne +public import Mathlib.Topology.Algebra.ContinuousMonoidHom + +/-! # Topological Generation -/ + +@[expose] public section +namespace ClassFormation + +/-! +# normalized degree and Frobenius theory: topological generation + +This file contains the small amount of topological-generation theory used in +the construction of Frobenius fixed fields, next to its sole application. +-/ + +open Set +open scoped Topology Pointwise + +universe u v + +section + +variable {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G] + +/-- A set topologically generates a group when the closure of the abstract +subgroup it generates is the whole group. -/ +def TopologicallyGenerates (X : Set G) : Prop := + (Subgroup.closure X).topologicalClosure = ⊤ + +/-- Topological generation is equivalently density of the generated abstract +subgroup. -/ +theorem topologicallyGenerates_iff_dense {X : Set G} : + TopologicallyGenerates (G := G) X ↔ + Dense ((Subgroup.closure X : Subgroup G) : Set G) := by + rw [TopologicallyGenerates, SetLike.ext'_iff, Subgroup.topologicalClosure_coe, + Subgroup.coe_top, dense_iff_closure_eq] + +/-- The closed subgroup topologically generated by a set. -/ +def closedSubgroupGenerated (X : Set G) : ClosedSubgroup G where + toSubgroup := (Subgroup.closure X).topologicalClosure + isClosed' := Subgroup.isClosed_topologicalClosure _ + +/-- The canonical family in the closed subgroup that it generates. -/ +def closedSubgroupGeneratedMap {A : Type v} (φ : A → G) : + A → (closedSubgroupGenerated (G := G) (Set.range φ) : Subgroup G) := + fun a => + ⟨φ a, Subgroup.le_topologicalClosure _ + (Subgroup.subset_closure ⟨a, rfl⟩)⟩ + +/-- The canonical family topologically generates its closed generated +subgroup. -/ +theorem closedSubgroupGeneratedMap_topologicallyGenerates {A : Type v} + (φ : A → G) : + TopologicallyGenerates + (G := (closedSubgroupGenerated (G := G) (Set.range φ) : Subgroup G)) + (Set.range (closedSubgroupGeneratedMap (G := G) φ)) := by + let K : ClosedSubgroup G := closedSubgroupGenerated (G := G) (Set.range φ) + let φK : A → (K : Subgroup G) := closedSubgroupGeneratedMap (G := G) φ + let L : Subgroup (K : Subgroup G) := Subgroup.closure (Set.range φK) + have hmap : + Subgroup.map (K : Subgroup G).subtype L = + Subgroup.closure (Set.range φ) := by + refine le_antisymm ?_ ?_ + · rw [Subgroup.map_le_iff_le_comap, Subgroup.closure_le] + rintro y ⟨a, rfl⟩ + exact Subgroup.subset_closure ⟨a, rfl⟩ + · rw [Subgroup.closure_le] + rintro y ⟨a, rfl⟩ + change φ a ∈ Subgroup.map (K : Subgroup G).subtype L + exact ⟨φK a, Subgroup.subset_closure ⟨a, rfl⟩, rfl⟩ + have himage : + ((Subtype.val : ↥(K : Subgroup G) → G) '' + ((L : Subgroup ↥(K : Subgroup G)) : Set ↥(K : Subgroup G))) = + ((Subgroup.map (K : Subgroup G).subtype L : Subgroup G) : Set G) := by + ext y + constructor + · rintro ⟨z, hz, rfl⟩ + exact ⟨z, hz, rfl⟩ + · rintro ⟨z, hz, hzy⟩ + exact ⟨z, hz, hzy⟩ + rw [topologicallyGenerates_iff_dense, dense_iff_closure_eq] + ext y + constructor + · intro _ + simp only [mem_univ] + · intro _ + change y ∈ closure ((L : Subgroup K) : Set K) + rw [closure_subtype] + change (y : G) ∈ + closure + (((Subtype.val : ↥(K : Subgroup G) → G) '' + ((L : Subgroup ↥(K : Subgroup G)) : Set ↥(K : Subgroup G)))) + rw [himage, hmap] + change (y : G) ∈ + ((Subgroup.closure (Set.range φ)).topologicalClosure : Set G) + exact y.2 + +/-- Membership in a closed generated subgroup is preserved by a continuous +homomorphism after mapping the generating set. -/ +theorem map_mem_closedSubgroupGenerated_image + {H : Type v} [Group H] [TopologicalSpace H] [IsTopologicalGroup H] + (φ : G →ₜ* H) {X : Set G} {y : G} + (hy : y ∈ (closedSubgroupGenerated (G := G) X : Subgroup G)) : + φ y ∈ (closedSubgroupGenerated (G := H) (φ '' X) : Subgroup H) := by + let K : Subgroup G := + (closedSubgroupGenerated (G := H) (φ '' X) : Subgroup H).comap + (φ : G →* H) + have hX : X ⊆ K := by + intro x hx + exact Subgroup.le_topologicalClosure _ + (Subgroup.subset_closure ⟨x, hx, rfl⟩) + have hKclosed : IsClosed (K : Set G) := by + change IsClosed {x : G | φ x ∈ + (closedSubgroupGenerated (G := H) (φ '' X) : Subgroup H)} + exact (closedSubgroupGenerated (G := H) (φ '' X)).isClosed'.preimage + φ.continuous + exact + (Subgroup.topologicalClosure_minimal _ + ((Subgroup.closure_le (K := K)).2 hX) hKclosed) hy + +/-- The singleton form of functoriality of closed topological generation. -/ +theorem map_mem_closedSubgroupGenerated_singleton + {H : Type v} [Group H] [TopologicalSpace H] [IsTopologicalGroup H] + (φ : G →ₜ* H) (x : G) {y : G} + (hy : y ∈ + (closedSubgroupGenerated (G := G) ({x} : Set G) : Subgroup G)) : + φ y ∈ + (closedSubgroupGenerated (G := H) ({φ x} : Set H) : Subgroup H) := by + simpa using + (map_mem_closedSubgroupGenerated_image (G := G) (H := H) φ + (X := ({x} : Set G)) hy) + +/-- A dense image of the infinite cyclic group is topologically generated by +the image of `1`. -/ +theorem topologicallyGenerates_singleton_of_denseRange_mint + {H : Type v} [Group H] [TopologicalSpace H] [IsTopologicalGroup H] + (f : Multiplicative ℤ →* H) (hf : DenseRange f) : + TopologicallyGenerates + (G := H) ({f (Multiplicative.ofAdd 1)} : Set H) := by + let g : H := f (Multiplicative.ofAdd 1) + have hsubset : + Set.range f ⊆ + (((Subgroup.closure ({g} : Set H)).topologicalClosure : Subgroup H) : + Set H) := by + intro y hy + rcases hy with ⟨n, rfl⟩ + have hz : f n ∈ Subgroup.zpowers g := by + have hEq : f n = g ^ n.toAdd := by + simpa [g] using (MonoidHom.apply_mint (f := f) (n := n)) + rw [hEq] + exact (Subgroup.zpowers g).zpow_mem (Subgroup.mem_zpowers g) n.toAdd + exact Subgroup.le_topologicalClosure _ + (by simpa [g, Subgroup.zpowers_eq_closure] using hz) + have hclosure : + closure (Set.range f) ⊆ + (((Subgroup.closure ({g} : Set H)).topologicalClosure : Subgroup H) : + Set H) := + closure_minimal hsubset (Subgroup.isClosed_topologicalClosure _) + rw [TopologicallyGenerates] + apply top_unique + intro x _hx + have hx' : x ∈ closure (Set.range f) := by + rw [hf.closure_range] + simp only [mem_univ] + exact hclosure hx' + +/-- Topological generation pushes forward along a continuous surjective +homomorphism. -/ +theorem topologicallyGenerates_image_of_continuousSurjective + {H : Type v} [Group H] [TopologicalSpace H] [IsTopologicalGroup H] + (f : G →* H) (hf : Continuous f) (hfsurj : Function.Surjective f) + {X : Set G} (hX : TopologicallyGenerates (G := G) X) : + TopologicallyGenerates (G := H) (f '' X) := by + have hmap : + (Subgroup.closure X).map f = Subgroup.closure (f '' X) := by + simpa using MonoidHom.map_closure f X + have htop : + ((Subgroup.closure X).map f).topologicalClosure = ⊤ := by + exact DenseRange.topologicalClosure_map_subgroup + (f := f) (hf := hf) (hf' := hfsurj.denseRange) + (by simpa [TopologicallyGenerates] using hX) + rw [TopologicallyGenerates, ← hmap] + exact htop + +/-- Topological generation descends to a quotient by a normal subgroup. -/ +theorem topologicallyGenerates_quotient_image + (N : Subgroup G) [N.Normal] + {X : Set G} (hX : TopologicallyGenerates (G := G) X) : + TopologicallyGenerates + (G := G ⧸ N) ((QuotientGroup.mk' N) '' X) := + topologicallyGenerates_image_of_continuousSurjective + (G := G) (H := G ⧸ N) (QuotientGroup.mk' N) + continuous_quotient_mk' (QuotientGroup.mk'_surjective N) hX + +end + +end ClassFormation diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Topology.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Topology.lean new file mode 100644 index 0000000000..9b82ac64c6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Topology.lean @@ -0,0 +1,12 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Topology.TotallyDisconnectedQuotients + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Topology/TotallyDisconnectedQuotients.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Topology/TotallyDisconnectedQuotients.lean new file mode 100644 index 0000000000..bd1a5c6cda --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Topology/TotallyDisconnectedQuotients.lean @@ -0,0 +1,188 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Topology.Algebra.ClopenNhdofOne +public import Mathlib.Topology.Algebra.Group.Quotient +/-! +# Totally disconnected quotient groups + +This file proves that a closed normal quotient of a compact Hausdorff totally +disconnected topological group is totally disconnected. +-/ + +@[expose] public section + +namespace QuotientGroup + +/-- A closed normal quotient of a compact Hausdorff totally disconnected +topological group is totally disconnected. -/ +theorem totallyDisconnectedSpace_of_isClosed + {G : Type*} [Group G] [TopologicalSpace G] [IsTopologicalGroup G] + [CompactSpace G] [TotallyDisconnectedSpace G] + (N : Subgroup G) [N.Normal] (hN : IsClosed (N : Set G)) : + TotallyDisconnectedSpace (G ⧸ N) := by + let q : G →* G ⧸ N := QuotientGroup.mk' N + have hsep : Pairwise (fun a b : G ⧸ N => + ∃ U : Set (G ⧸ N), IsClopen U ∧ a ∈ U ∧ b ∈ Uᶜ) := by + intro a b hab + obtain ⟨x, rfl⟩ := QuotientGroup.mk'_surjective N a + obtain ⟨y, rfl⟩ := QuotientGroup.mk'_surjective N b + let g : G := x⁻¹ * y + have hgN : g ∉ N := by + intro hgN + apply hab + apply inv_mul_eq_one.mp + change q g = 1 + exact (QuotientGroup.eq_one_iff g).2 hgN + let W : Set G := {u | g * u⁻¹ ∉ N} + have hWopen : IsOpen W := by + change IsOpen ((fun u : G => g * u⁻¹) ⁻¹' ((N : Set G)ᶜ)) + exact hN.isOpen_compl.preimage (continuous_const.mul continuous_inv) + have hWone : (1 : G) ∈ W := by + simpa only [W, Set.mem_ofPred_eq, inv_one, mul_one] using hgN + obtain ⟨V, hVW⟩ := + ProfiniteGrp.exist_openNormalSubgroup_sub_open_nhds_of_one + (G := G) hWopen hWone + let K : Subgroup G := N ⊔ (V : Subgroup G) + have hKopen : IsOpen (K : Set G) := + Subgroup.isOpen_of_openSubgroup K + (show (V : Subgroup G) ≤ K from le_sup_right) + have hNK : N ≤ K := le_sup_left + have hgK : g ∉ K := by + intro hgK + rcases (Subgroup.mem_sup_of_normal_right + (s := N) (t := (V : Subgroup G))).1 hgK with + ⟨n, hnN, v, hvV, hnv⟩ + have hvW : v ∈ W := hVW hvV + have hgn : g * v⁻¹ = n := by + calc + g * v⁻¹ = (n * v) * v⁻¹ := by rw [hnv] + _ = n := by simp only [mul_assoc, mul_inv_cancel, mul_one] + apply hvW + simpa only [hgn] using hnN + let Kbar : Subgroup (G ⧸ N) := K.map q + have hKbarOpen : IsOpen (Kbar : Set (G ⧸ N)) := by + change IsOpen (((↑) : G → G ⧸ N) '' (K : Set G)) + exact QuotientGroup.isOpenMap_coe (K : Set G) hKopen + have hqgKbar : q g ∉ Kbar := by + intro hqgKbar + have hgComap : g ∈ Kbar.comap q := hqgKbar + have hker : q.ker ≤ K := by + simpa only [q, QuotientGroup.ker_mk'] using hNK + have hcomap : Kbar.comap q = K := by + simpa only [Kbar] using Subgroup.comap_map_eq_self hker + rw [hcomap] at hgComap + exact hgK hgComap + let U : Set (G ⧸ N) := {z | (q x)⁻¹ * z ∈ Kbar} + have hUclopen : IsClopen U := by + have hcont : Continuous (fun z : G ⧸ N => (q x)⁻¹ * z) := + (continuous_const : + Continuous (fun _ : G ⧸ N => (q x)⁻¹)).mul continuous_id + exact + ⟨(Subgroup.isClosed_of_isOpen Kbar hKbarOpen).preimage hcont, + hKbarOpen.preimage hcont⟩ + refine ⟨U, hUclopen, ?_, ?_⟩ + · change (q x)⁻¹ * q x ∈ Kbar + rw [inv_mul_cancel] + exact Kbar.one_mem + · change (q x)⁻¹ * q y ∉ Kbar + change q (x⁻¹ * y) ∉ Kbar at hqgKbar + simpa only [map_mul, map_inv] using hqgKbar + let : TotallySeparatedSpace (G ⧸ N) := + totallySeparatedSpace_iff_exists_isClopen.2 hsep + infer_instance + +end QuotientGroup + +namespace QuotientGroup + +/-- The identity component of a topological group is a normal subgroup. -/ +instance Subgroup.Normal.connectedComponentOfOne + (G : Type*) [Group G] [TopologicalSpace G] [IsTopologicalGroup G] : + (Subgroup.connectedComponentOfOne G).Normal where + conj_mem x hx g := by + change g * x * g⁻¹ ∈ connectedComponent (1 : G) + simpa only [mul_one, mul_inv_cancel] using + (IsTopologicalGroup.continuous_conj g).mapsTo_connectedComponent + (1 : G) hx + +/-- Quotienting a topological group by its identity component produces a +totally disconnected topological group. -/ +theorem totallyDisconnectedSpace_quotient_connectedComponentOfOne + {G : Type*} [Group G] [TopologicalSpace G] [IsTopologicalGroup G] : + TotallyDisconnectedSpace + (G ⧸ Subgroup.connectedComponentOfOne G) := by + let N : Subgroup G := Subgroup.connectedComponentOfOne G + let q : G →* G ⧸ N := QuotientGroup.mk' N + have hfibers : ∀ y : G ⧸ N, IsConnected (q ⁻¹' {y}) := by + intro y + obtain ⟨g, rfl⟩ := QuotientGroup.mk'_surjective N y + have hfiber : + q ⁻¹' {q g} = + (fun x : G ↦ x * g) '' connectedComponent (1 : G) := by + ext x + constructor + · intro hx + change q x = q g at hx + have hxN : x / g ∈ N := QuotientGroup.eq_iff_div_mem.mp hx + exact ⟨x / g, hxN, div_mul_cancel x g⟩ + · rintro ⟨n, hn, rfl⟩ + change q (n * g) = q g + rw [map_mul] + have hnN : n ∈ N := hn + have hqn : q n = 1 := by + change (n : G ⧸ N) = 1 + exact (QuotientGroup.eq_one_iff n).2 hnN + rw [hqn, one_mul] + rw [hfiber] + exact + isConnected_connectedComponent.image _ + (continuous_id.mul continuous_const).continuousOn + apply totallyDisconnectedSpace_iff_connectedComponent_one.mpr + apply (QuotientGroup.mk'_surjective N).preimage_injective + change + (QuotientGroup.mk ⁻¹' + connectedComponent (1 : G ⧸ N)) = + QuotientGroup.mk ⁻¹' {1} + calc + QuotientGroup.mk ⁻¹' + connectedComponent (1 : G ⧸ N) = + connectedComponent (1 : G) := by + simpa only [QuotientGroup.mk_one] using + (QuotientGroup.isQuotientMap_mk N).isCoinducing.preimage_connectedComponent + hfibers (1 : G) + _ = (N : Set G) := rfl + _ = QuotientGroup.mk ⁻¹' {1} := by + ext x + change x ∈ N ↔ (QuotientGroup.mk x : G ⧸ N) = 1 + exact (QuotientGroup.eq_one_iff x).symm + +end QuotientGroup + +namespace ContinuousMonoidHom + +/-- A continuous homomorphism from a topological group to a totally disconnected +topological group vanishes on the identity component. -/ +theorem connectedComponentOfOne_le_ker + {G H : Type*} + [Group G] [TopologicalSpace G] [IsTopologicalGroup G] + [Group H] [TopologicalSpace H] + [TotallyDisconnectedSpace H] + (f : G →ₜ* H) : + Subgroup.connectedComponentOfOne G ≤ f.ker := by + intro g hg + have hfg : f g ∈ connectedComponent (1 : H) := by + have hmap : f g ∈ connectedComponent (f (1 : G)) := + f.continuous_toFun.mapsTo_connectedComponent (1 : G) hg + simpa only [map_one] using hmap + have hcomponent : connectedComponent (1 : H) = {1} := + totallyDisconnectedSpace_iff_connectedComponent_singleton.mp inferInstance 1 + change f g = 1 + simpa only [hcomponent, Set.mem_singleton_iff] using hfg + +end ContinuousMonoidHom diff --git a/LeanPool/ClassFieldTheory/ProCGroups.lean b/LeanPool/ClassFieldTheory/ProCGroups.lean new file mode 100644 index 0000000000..9cbe3583df --- /dev/null +++ b/LeanPool/ClassFieldTheory/ProCGroups.lean @@ -0,0 +1,12 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ProCGroups.InducedFunctions + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ProCGroups/InducedFunctions.lean b/LeanPool/ClassFieldTheory/ProCGroups/InducedFunctions.lean new file mode 100644 index 0000000000..5eabf8c7cb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ProCGroups/InducedFunctions.lean @@ -0,0 +1,120 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Group.Action.Basic +public import Mathlib.Algebra.Group.Pi.Basic +public import Mathlib.Algebra.Group.Subgroup.Basic +/-! +# Induced groups of equivariant functions + +For a subgroup `H` of `G` acting on a commutative group `B`, the induced +group consists of functions satisfying `f (h * x) = h • f x`. Right +translation gives its `G`-action. Evaluation at the identity is an +`H`-equivariant epimorphism, without any finite-index assumption. +-/ + +@[expose] public section + +namespace ProCGroups.InducedFunctions + +universe uG uB + +variable {G : Type uG} {B : Type uB} + +/-- The subgroup of equivariant functions defining the induced group. -/ +def inducedSubgroup [Group G] (H : Subgroup G) [CommGroup B] + [MulDistribMulAction H B] : Subgroup (G → B) where + carrier := {f | ∀ (h : H) (x : G), f (h.1 * x) = h • f x} + one_mem' := by + intro h x + exact (smul_one h).symm + mul_mem' := by + intro f k hf hk h x + simp only [Pi.mul_apply, hf h x, hk h x] + exact (MulDistribMulAction.smul_mul h (f x) (k x)).symm + inv_mem' := by + intro f hf h x + simp only [Pi.inv_apply, hf h x] + exact (map_inv (MulDistribMulAction.toMonoidHom B h) (f x)).symm + +/-- The commutative group of equivariant functions. -/ +abbrev InducedModule [Group G] (H : Subgroup G) [CommGroup B] + [MulDistribMulAction H B] := + inducedSubgroup (G := G) (B := B) H + +/-- The canonical right-translation action on equivariant functions. -/ +instance inducedMulDistribMulAction [Group G] (H : Subgroup G) [CommGroup B] + [MulDistribMulAction H B] : + MulDistribMulAction G (InducedModule (B := B) H) where + smul g f := ⟨fun x ↦ f.1 (x * g), by + intro h x + simpa only [mul_assoc] using f.2 h (x * g)⟩ + one_smul := by + intro f + apply Subtype.ext + funext x + change f.1 (x * 1) = f.1 x + rw [mul_one] + mul_smul := by + intro g k f + apply Subtype.ext + funext x + change f.1 (x * (g * k)) = f.1 ((x * g) * k) + rw [mul_assoc] + smul_mul := by + intro g f k + ext x + rfl + smul_one := by + intro g + ext x + rfl + +/-- Evaluation at the identity element of the ambient group. -/ +def inducedEvaluation [Group G] (H : Subgroup G) [CommGroup B] + [MulDistribMulAction H B] : + InducedModule (B := B) H →* B where + toFun f := f.1 1 + map_one' := rfl + map_mul' _ _ := rfl + +@[simp] theorem inducedEvaluation_apply [Group G] (H : Subgroup G) [CommGroup B] + [MulDistribMulAction H B] (f : InducedModule (B := B) H) : + inducedEvaluation H f = f.1 1 := + rfl + +/-- Evaluation intertwines the restricted translation action and the +original subgroup action. -/ +theorem inducedEvaluation_smul [Group G] (H : Subgroup G) [CommGroup B] + [MulDistribMulAction H B] (h : H) (f : InducedModule (B := B) H) : + inducedEvaluation H ((h : G) • f) = h • inducedEvaluation H f := by + change f.1 (1 * (h : G)) = h • f.1 1 + simpa only [one_mul, mul_one] using f.2 h 1 + +/-- An arbitrary value at the identity extends to an equivariant function: +use the original action on `H` and the identity value outside `H`. -/ +theorem inducedEvaluation_surjective [Group G] (H : Subgroup G) [CommGroup B] + [MulDistribMulAction H B] : Function.Surjective (inducedEvaluation (B := B) H) := by + classical + intro b + let f : G → B := fun x => if hx : x ∈ H then (⟨x, hx⟩ : H) • b else 1 + have hf : f ∈ inducedSubgroup (B := B) H := by + intro h x + by_cases hx : x ∈ H + · have hhx : (h : G) * x ∈ H := H.mul_mem h.property hx + simp only [f, dite_eq_left hhx, dite_eq_left hx] + change (h * (⟨x, hx⟩ : H)) • b = h • ((⟨x, hx⟩ : H) • b) + exact mul_smul h (⟨x, hx⟩ : H) b + · have hhx : (h : G) * x ∉ H := fun hmem => hx ((H.mul_mem_cancel_left h.property).mp hmem) + simp only [f, dite_eq_right hhx, dite_eq_right hx, smul_one] + refine ⟨⟨f, hf⟩, ?_⟩ + change f 1 = b + simp only [f, dite_eq_left H.one_mem] + exact one_smul H b + +end ProCGroups.InducedFunctions diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory.lean new file mode 100644 index 0000000000..ec3742eaa8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField.lean new file mode 100644 index 0000000000..c66fe556af --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NormUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic.lean new file mode 100644 index 0000000000..011b1307ee --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.Arithmetic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.ContinuousFieldUnitLog +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.DenominatorValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogUniqueness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpAdditivity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpComposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpContinuity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.PrincipalUnitExpLogEquiv + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/Arithmetic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/Arithmetic.lean new file mode 100644 index 0000000000..08c683499e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/Arithmetic.lean @@ -0,0 +1,748 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Data.Nat.Factorization.Basic +public import Mathlib.Data.Nat.Prime.Basic +public import Mathlib.Algebra.EuclideanDomain.Basic +public import Mathlib.Algebra.Order.Field.Power +public import Mathlib.Analysis.SpecialFunctions.Log.Base +public import Mathlib.NumberTheory.Padics.PadicVal.Basic +public import Mathlib.Topology.Algebra.Order.Field +public import Mathlib.Tactic +/-! +# Arithmetic lemmas for local-field index calculations + +This file contains the pure natural-number cancellation steps used after local-field +norm and value-group arguments have produced an lcm divisibility. + +It also contains the elementary `p`-adic valuation estimates used in the local-field structure + development, +the logarithm and exponential estimates for the convergence and valuation behavior of the +logarithm and exponential series. +-/ + +@[expose] public section + +namespace LocalFieldTheory.DiscreteValuationField + +open Filter + +section PadicLogArithmetic + +variable {p n : ℕ} + +/-- Arithmetic estimate for the field-unit logarithm: +`p^(v_p n) <= n` for nonzero `n`. + +This is the arithmetic input for the logarithm-series convergence estimate +`v_p(n) <= log_p n`. -/ +theorem pow_padicValNat_le_self + (hn : n ≠ 0) : + p ^ padicValNat p n ≤ n := + Nat.le_of_dvd (Nat.pos_iff_ne_zero.mpr hn) pow_padicValNat_dvd + +/-- Arithmetic estimate for the field-unit logarithm in real logarithmic +form: `v_p(n) <= log_p(n)`. -/ +theorem padicValNat_le_real_logb + (n : ℕ) : + (padicValNat p n : ℝ) ≤ Real.logb p n := by + exact + (Nat.cast_le.mpr (padicValNat_le_nat_log (p := p) n)).trans + (Real.natLog_le_logb n p) + +/-- Asymptotic estimate for the field-unit logarithm: +for every positive slope `c`, the linear term `n * c` eventually dominates +the logarithmic denominator contribution `log_p(n)`. -/ +theorem tendsto_nat_mul_const_sub_logb_atTop + {c : ℝ} (hc : 0 < c) : + Tendsto (fun n : ℕ => (n : ℝ) * c - Real.logb p n) atTop atTop := by + have hhalf : 0 < c / 2 := by positivity + have hsmall : + (fun n : ℕ => Real.logb (p : ℝ) (n : ℝ)) =o[atTop] + (fun n : ℕ => (n : ℝ)) := by + simpa [Function.comp_def] using + (Real.isLittleO_logb_id_atTop (b := (p : ℝ))).comp_tendsto + tendsto_natCast_atTop_atTop + have hbound : + ∀ᶠ n : ℕ in atTop, + ‖Real.logb (p : ℝ) (n : ℝ)‖ ≤ + (c / 2) * ‖(n : ℝ)‖ := + hsmall.def hhalf + have hle : + (fun n : ℕ => (c / 2) * (n : ℝ)) ≤ᶠ[atTop] + (fun n : ℕ => (n : ℝ) * c - Real.logb (p : ℝ) (n : ℝ)) := by + filter_upwards [hbound] with n hn + have hnnonneg : 0 ≤ (n : ℝ) := Nat.cast_nonneg n + have hlog_le : + Real.logb (p : ℝ) (n : ℝ) ≤ (c / 2) * (n : ℝ) := by + calc + Real.logb (p : ℝ) (n : ℝ) ≤ + ‖Real.logb (p : ℝ) (n : ℝ)‖ := + le_abs_self _ + _ ≤ (c / 2) * ‖(n : ℝ)‖ := hn + _ = (c / 2) * (n : ℝ) := by + rw [Real.norm_eq_abs, abs_of_nonneg hnnonneg] + calc + (c / 2) * (n : ℝ) = + (n : ℝ) * c - (c / 2) * (n : ℝ) := by + ring + _ ≤ (n : ℝ) * c - Real.logb (p : ℝ) (n : ℝ) := + sub_le_sub_left hlog_le ((n : ℝ) * c) + have hlin : + Tendsto (fun n : ℕ => (c / 2) * (n : ℝ)) atTop atTop := + Tendsto.const_mul_atTop hhalf tendsto_natCast_atTop_atTop + exact tendsto_atTop_mono' atTop hle hlin + +/-- The same logarithmic domination estimate with the natural series indexing +`n + 1`, avoiding the zero denominator in the logarithm series. -/ +theorem tendsto_nat_succ_mul_const_sub_logb_atTop + {c : ℝ} (hc : 0 < c) : + Tendsto + (fun n : ℕ => ((n + 1 : ℕ) : ℝ) * c - Real.logb p (n + 1)) + atTop atTop := by + simpa [Function.comp_def] using + (tendsto_nat_mul_const_sub_logb_atTop (p := p) hc).comp + (tendsto_add_atTop_nat 1) + +/-- Variant of the logarithmic domination estimate with a fixed real multiple +of the logarithmic term. This is the form needed after inserting the +ramification index into the valuation of integer denominators. -/ +theorem tendsto_nat_succ_mul_const_sub_const_mul_logb_atTop + {c C : ℝ} (hc : 0 < c) : + Tendsto + (fun n : ℕ => + ((n + 1 : ℕ) : ℝ) * c - + C * Real.logb (p : ℝ) ((n + 1 : ℕ) : ℝ)) + atTop atTop := by + have hhalf : 0 < c / 2 := by positivity + have htend : + Tendsto (fun n : ℕ => ((n + 1 : ℕ) : ℝ)) atTop atTop := + tendsto_natCast_atTop_atTop.comp (tendsto_add_atTop_nat 1) + have hsmall : + (fun n : ℕ => C * Real.logb (p : ℝ) ((n + 1 : ℕ) : ℝ)) =o[atTop] + (fun n : ℕ => ((n + 1 : ℕ) : ℝ)) := by + have hlog : + (fun n : ℕ => Real.logb (p : ℝ) ((n + 1 : ℕ) : ℝ)) =o[atTop] + (fun n : ℕ => ((n + 1 : ℕ) : ℝ)) := by + simpa [Function.comp_def] using + (Real.isLittleO_logb_id_atTop (b := (p : ℝ))).comp_tendsto + htend + simpa using hlog.const_mul_left C + have hbound : + ∀ᶠ n : ℕ in atTop, + ‖C * Real.logb (p : ℝ) ((n + 1 : ℕ) : ℝ)‖ ≤ + (c / 2) * ‖((n + 1 : ℕ) : ℝ)‖ := + hsmall.def hhalf + have hle : + (fun n : ℕ => (c / 2) * ((n + 1 : ℕ) : ℝ)) ≤ᶠ[atTop] + (fun n : ℕ => + ((n + 1 : ℕ) : ℝ) * c - + C * Real.logb (p : ℝ) ((n + 1 : ℕ) : ℝ)) := by + filter_upwards [hbound] with n hn + have hnnonneg : 0 ≤ ((n + 1 : ℕ) : ℝ) := Nat.cast_nonneg _ + have hlog_le : + C * Real.logb (p : ℝ) ((n + 1 : ℕ) : ℝ) ≤ + (c / 2) * ((n + 1 : ℕ) : ℝ) := by + calc + C * Real.logb (p : ℝ) ((n + 1 : ℕ) : ℝ) ≤ + ‖C * Real.logb (p : ℝ) ((n + 1 : ℕ) : ℝ)‖ := + le_abs_self _ + _ ≤ (c / 2) * ‖((n + 1 : ℕ) : ℝ)‖ := hn + _ = (c / 2) * ((n + 1 : ℕ) : ℝ) := by + rw [Real.norm_eq_abs, abs_of_nonneg hnnonneg] + calc + (c / 2) * ((n + 1 : ℕ) : ℝ) = + ((n + 1 : ℕ) : ℝ) * c - + (c / 2) * ((n + 1 : ℕ) : ℝ) := by + ring + _ ≤ ((n + 1 : ℕ) : ℝ) * c - + C * Real.logb (p : ℝ) ((n + 1 : ℕ) : ℝ) := + sub_le_sub_left hlog_le (((n + 1 : ℕ) : ℝ) * c) + have hlin : + Tendsto (fun n : ℕ => (c / 2) * ((n + 1 : ℕ) : ℝ)) atTop atTop := + Tendsto.const_mul_atTop hhalf htend + exact tendsto_atTop_mono' atTop hle hlin + +/-- Exponential-series estimate for the field-unit logarithm: +for every slope `c > 1`, the linear term `n * c` dominates the factorial +denominator contribution `v_p(n!)`. The proof uses mathlib's Legendre-bound +`padicValNat_factorial_le`; no factorial valuation formula is reproved here. -/ +theorem tendsto_nat_mul_const_sub_padicValNat_factorial_atTop + [Fact p.Prime] {c : ℝ} (hc : 1 < c) : + Tendsto + (fun n : ℕ => (n : ℝ) * c - (padicValNat p n.factorial : ℝ)) + atTop atTop := by + have hpos : 0 < c - 1 := sub_pos.mpr hc + have hsource : + Tendsto (fun n : ℕ => (n : ℝ) * (c - 1)) atTop atTop := by + simpa [mul_comm] using + Tendsto.const_mul_atTop hpos tendsto_natCast_atTop_atTop + have hle : + (fun n : ℕ => (n : ℝ) * (c - 1)) ≤ᶠ[atTop] + (fun n : ℕ => + (n : ℝ) * c - (padicValNat p n.factorial : ℝ)) := by + exact Eventually.of_forall fun n => by + have hdenNat : padicValNat p n.factorial ≤ n := + padicValNat_factorial_le (p := p) n + have hden : (padicValNat p n.factorial : ℝ) ≤ (n : ℝ) := + Nat.cast_le.mpr hdenNat + nlinarith + exact tendsto_atTop_mono' atTop hle hsource + +/-- Legendre's factorial-valuation formula, Legendre's formula in digit form: +if `n = a_0 + a_1 p + ... + a_r p^r`, then multiplying the displayed digit formula by `p - 1` gives +`(p - 1) v_p(n!) = (a_0 p^0 + ... + a_r p^r) - (a_0 + ... + a_r)`. -/ +theorem padicValNat_factorial_digits + [Fact p.Prime] (n : ℕ) : + (p - 1) * padicValNat p n.factorial = + Nat.ofDigits p (p.digits n) - (p.digits n).sum := by + simpa [Nat.ofDigits_digits] using + (sub_one_mul_padicValNat_factorial (p := p) n) + +/-- Legendre's factorial-valuation formula with the digit expansion written out as an +indexed sum. -/ +theorem padicValNat_factorial_digits_sum + [Fact p.Prime] (n : ℕ) : + (p - 1) * padicValNat p n.factorial = + ((p.digits n).mapIdx fun i a => a * p ^ i).sum - + (p.digits n).sum := by + simpa [Nat.ofDigits_eq_sum_mapIdx] using + padicValNat_factorial_digits (p := p) n + +/-- A nonzero natural number has positive sum of base-`p` digits. -/ +theorem digits_sum_pos_of_ne_zero (hn : n ≠ 0) : + 0 < (p.digits n).sum := by + by_contra hnot + have hsum0 : (p.digits n).sum = 0 := + Nat.eq_zero_of_le_zero (Nat.le_of_not_gt hnot) + have hall : ∀ a ∈ p.digits n, a = 0 := + List.sum_eq_zero_iff.mp hsum0 + have hmapZero : + (List.mapIdx (fun i a => a * p ^ i) (p.digits n)).sum = 0 := by + apply List.sum_eq_zero + intro b hb + rw [List.mem_mapIdx] at hb + rcases hb with ⟨i, hi, rfl⟩ + have hdigit : (p.digits n)[i] = 0 := + hall _ (List.getElem_mem hi) + simp [hdigit] + have hof : Nat.ofDigits p (p.digits n) = 0 := by + simpa [Nat.ofDigits_eq_sum_mapIdx] using hmapZero + have hn0 : n = 0 := by + simpa [Nat.ofDigits_digits] using hof + exact hn hn0 + +/-- Legendre's formula gives the sharp bound +`(p - 1) * v_p(n!) <= n - 1` for nonzero `n`. -/ +theorem sub_one_mul_padicValNat_factorial_le_sub_one + [Fact p.Prime] (hn : n ≠ 0) : + (p - 1) * padicValNat p n.factorial ≤ n - 1 := by + rw [padicValNat_factorial_digits, Nat.ofDigits_digits] + have hsumpos : 1 ≤ (p.digits n).sum := + Nat.succ_le_of_lt (digits_sum_pos_of_ne_zero (p := p) hn) + omega + +/-- Factorial-denominator analogue of the factorial quotient estimate: +`v_p(n!) / (n-1) <= 1/(p-1)`. -/ +theorem padicValNat_factorial_div_sub_one_le_inv_sub_one + [Fact p.Prime] (hn : 1 < n) : + (padicValNat p n.factorial : ℚ) / ((n : ℚ) - 1) ≤ + 1 / ((p : ℚ) - 1) := by + have hpNat : Nat.Prime p := Fact.out + have hp : (1 : ℚ) < p := by + exact_mod_cast hpNat.one_lt + have hpden : 0 < (p : ℚ) - 1 := by + linarith + have hnden : 0 < (n : ℚ) - 1 := by + have hnq : (1 : ℚ) < n := by + exact_mod_cast hn + linarith + have hNat : + (p - 1) * padicValNat p n.factorial ≤ n - 1 := + sub_one_mul_padicValNat_factorial_le_sub_one + (p := p) (n := n) (by omega) + have hmul : + ((p : ℚ) - 1) * (padicValNat p n.factorial : ℚ) ≤ + (n : ℚ) - 1 := by + have hcast : + (((p - 1) * padicValNat p n.factorial : ℕ) : ℚ) ≤ + ((n - 1 : ℕ) : ℚ) := by + exact_mod_cast hNat + have hpone : 1 ≤ p := hpNat.one_lt.le + have hnone : 1 ≤ n := by omega + simpa [Nat.cast_mul, Nat.cast_sub hpone, Nat.cast_sub hnone] using hcast + field_simp [hnden.ne', hpden.ne'] + nlinarith + +/-- Real factorial-denominator bound used for the sharp convergence radius of +the exponential series. -/ +theorem padicValNat_factorial_le_sub_one_div_sub_one_real + [Fact p.Prime] (hn : n ≠ 0) : + (padicValNat p n.factorial : ℝ) ≤ + ((n : ℝ) - 1) / ((p : ℝ) - 1) := by + have hpNat : Nat.Prime p := Fact.out + have hp : (1 : ℝ) < p := by + exact_mod_cast hpNat.one_lt + have hpden : 0 < (p : ℝ) - 1 := by + linarith + have hNat : + (p - 1) * padicValNat p n.factorial ≤ n - 1 := + sub_one_mul_padicValNat_factorial_le_sub_one + (p := p) (n := n) hn + have hmul : + ((p : ℝ) - 1) * (padicValNat p n.factorial : ℝ) ≤ + (n : ℝ) - 1 := by + have hcast : + (((p - 1) * padicValNat p n.factorial : ℕ) : ℝ) ≤ + ((n - 1 : ℕ) : ℝ) := by + exact_mod_cast hNat + have hpone : 1 ≤ p := hpNat.one_lt.le + have hnone : 1 ≤ n := Nat.succ_le_of_lt (Nat.pos_of_ne_zero hn) + simpa [Nat.cast_mul, Nat.cast_sub hpone, Nat.cast_sub hnone] using hcast + exact (le_div_iff₀ hpden).2 (by simpa [mul_comm] using hmul) + +/-- Sharp asymptotic estimate for the exponential series denominator: +any real slope strictly above `C/(p-1)` dominates +`C * v_p(n!)`. -/ +theorem tendsto_nat_mul_const_sub_const_mul_padicValNat_factorial_atTop + [Fact p.Prime] {c C : ℝ} (hC : 0 ≤ C) + (hc : C / ((p : ℝ) - 1) < c) : + Tendsto + (fun n : ℕ => + (n : ℝ) * c - C * (padicValNat p n.factorial : ℝ)) + atTop atTop := by + have hpNat : Nat.Prime p := Fact.out + have hp : (1 : ℝ) < p := by + exact_mod_cast hpNat.one_lt + have hpden : 0 < (p : ℝ) - 1 := by + linarith + have hdelta : 0 < c - C / ((p : ℝ) - 1) := sub_pos.mpr hc + have hsource : + Tendsto + (fun n : ℕ => (n : ℝ) * (c - C / ((p : ℝ) - 1))) + atTop atTop := by + simpa [mul_comm] using + Tendsto.const_mul_atTop hdelta tendsto_natCast_atTop_atTop + have hle : + (fun n : ℕ => (n : ℝ) * (c - C / ((p : ℝ) - 1))) ≤ᶠ[atTop] + (fun n : ℕ => + (n : ℝ) * c - C * (padicValNat p n.factorial : ℝ)) := by + filter_upwards [eventually_ge_atTop 1] with n hn + have hn0 : n ≠ 0 := by omega + have hfac := + padicValNat_factorial_le_sub_one_div_sub_one_real + (p := p) (n := n) hn0 + have hCfac : + C * (padicValNat p n.factorial : ℝ) ≤ + C * (((n : ℝ) - 1) / ((p : ℝ) - 1)) := + mul_le_mul_of_nonneg_left hfac hC + have hCp_nonneg : 0 ≤ C / ((p : ℝ) - 1) := + div_nonneg hC hpden.le + have hden_bound : + C * (((n : ℝ) - 1) / ((p : ℝ) - 1)) ≤ + (n : ℝ) * (C / ((p : ℝ) - 1)) := by + calc + C * (((n : ℝ) - 1) / ((p : ℝ) - 1)) = + ((n : ℝ) - 1) * (C / ((p : ℝ) - 1)) := by + ring + _ ≤ (n : ℝ) * (C / ((p : ℝ) - 1)) := + mul_le_mul_of_nonneg_right (by linarith) hCp_nonneg + calc + (n : ℝ) * (c - C / ((p : ℝ) - 1)) = + (n : ℝ) * c - (n : ℝ) * (C / ((p : ℝ) - 1)) := by + ring + _ ≤ (n : ℝ) * c - C * (padicValNat p n.factorial : ℝ) := by + linarith [hCfac.trans hden_bound] + exact tendsto_atTop_mono' atTop hle hsource + +/-- Higher exponential terms have strictly larger integer valuation than the +linear term when the input has integer valuation at least two. This is the +termwise arithmetic input for `exp(x) - 1` having the same valuation as `x` +on the normalized convergence ball. -/ +theorem exp_higher_term_integer_valuation_gt + [Fact p.Prime] {n : ℕ} (hn : 2 ≤ n) {m : ℤ} (hm : 2 ≤ m) : + m < (n : ℤ) * m - (padicValNat p n.factorial : ℤ) := by + have hn0 : n ≠ 0 := by omega + have hdenNat : + padicValNat p n.factorial + 1 ≤ n := + Nat.succ_le_of_lt + (padicValNat_factorial_lt_of_ne_zero (p := p) hn0) + have hden : (padicValNat p n.factorial : ℤ) ≤ (n : ℤ) - 1 := by + omega + have hnsub : (1 : ℤ) ≤ (n : ℤ) - 1 := by + omega + have hmsub : (1 : ℤ) ≤ m - 1 := by + omega + have hpos : (0 : ℤ) < ((n : ℤ) - 1) * (m - 1) := by + nlinarith + nlinarith + +/-- Ramified sharp-threshold version of +`exp_higher_term_integer_valuation_gt`: if the factorial denominator +contributes `e * v_p(n!)`, then every higher exponential term has larger +integer valuation than the linear term above `e/(p-1)`. -/ +theorem exp_higher_term_integer_valuation_gt_scaled + [Fact p.Prime] {n e : ℕ} (hn : 2 ≤ n) {m : ℤ} + (hm : (e : ℚ) / ((p : ℚ) - 1) < (m : ℚ)) : + m < (n : ℤ) * m - (e : ℤ) * (padicValNat p n.factorial : ℤ) := by + have hquot := + padicValNat_factorial_div_sub_one_le_inv_sub_one + (p := p) (n := n) (by omega) + have hnden : 0 < (n : ℚ) - 1 := by + have hnq : (1 : ℚ) < n := by + exact_mod_cast (by omega : 1 < n) + linarith + have he_nonneg : 0 ≤ (e : ℚ) := by + positivity + have hscaled_div : + ((e : ℚ) * (padicValNat p n.factorial : ℚ)) / + ((n : ℚ) - 1) ≤ + (e : ℚ) / ((p : ℚ) - 1) := by + calc + ((e : ℚ) * (padicValNat p n.factorial : ℚ)) / + ((n : ℚ) - 1) = + (e : ℚ) * + ((padicValNat p n.factorial : ℚ) / ((n : ℚ) - 1)) := by + ring + _ ≤ (e : ℚ) * (1 / ((p : ℚ) - 1)) := + mul_le_mul_of_nonneg_left hquot he_nonneg + _ = (e : ℚ) / ((p : ℚ) - 1) := by + ring + have hstrict : + ((e : ℚ) * (padicValNat p n.factorial : ℚ)) / + ((n : ℚ) - 1) < (m : ℚ) := + lt_of_le_of_lt hscaled_div hm + have hdenlt : + (e : ℚ) * (padicValNat p n.factorial : ℚ) < + ((n : ℚ) - 1) * (m : ℚ) := by + calc + (e : ℚ) * (padicValNat p n.factorial : ℚ) = + (((e : ℚ) * (padicValNat p n.factorial : ℚ)) / + ((n : ℚ) - 1)) * + ((n : ℚ) - 1) := by + field_simp [hnden.ne'] + _ < (m : ℚ) * ((n : ℚ) - 1) := + mul_lt_mul_of_pos_right hstrict hnden + _ = ((n : ℚ) - 1) * (m : ℚ) := by + ring + have hgoal : + (m : ℚ) < + (n : ℚ) * (m : ℚ) - + (e : ℚ) * (padicValNat p n.factorial : ℚ) := by + nlinarith + have hgoal' : + (m : ℚ) < + (((n : ℤ) * m - + (e : ℤ) * (padicValNat p n.factorial : ℤ) : ℤ) : ℚ) := by + simpa [Int.cast_mul, Int.cast_sub, Int.cast_natCast] using hgoal + exact_mod_cast hgoal' + +/-- Arithmetic estimate at the deep exponential–logarithm threshold: +for `n > 1`, the quotient `v_p(n)/(n-1)` is at most `1/(p-1)`. + +This is the exact numerical inequality used later to show that, above the +threshold `1/(p-1)`, the linear term of the logarithm or exponential series +has strictly smaller valuation than every higher term. -/ +theorem padicValNat_div_sub_one_le_inv_sub_one + [Fact p.Prime] (hn : 1 < n) : + (padicValNat p n : ℚ) / ((n : ℚ) - 1) ≤ + 1 / ((p : ℚ) - 1) := by + let a := padicValNat p n + have hpNat : Nat.Prime p := Fact.out + have hp : (1 : ℚ) < p := by + exact_mod_cast hpNat.one_lt + have hpden : 0 < (p : ℚ) - 1 := by + linarith + have hnden : 0 < (n : ℚ) - 1 := by + have hnq : (1 : ℚ) < n := by + exact_mod_cast hn + linarith + have hpowNat : p ^ a ≤ n := + Nat.le_of_dvd (lt_trans Nat.zero_lt_one hn) pow_padicValNat_dvd + have hpow : (p : ℚ) ^ a ≤ (n : ℚ) := by + exact_mod_cast hpowNat + have hbern : + (a : ℚ) ≤ (((p : ℚ) ^ a - 1) / ((p : ℚ) - 1)) := + Nat.cast_le_pow_sub_div_sub (α := ℚ) (a := (p : ℚ)) hp a + have hsub : + ((p : ℚ) ^ a - 1) / ((p : ℚ) - 1) ≤ + ((n : ℚ) - 1) / ((p : ℚ) - 1) := + div_le_div_of_nonneg_right (sub_le_sub_right hpow 1) hpden.le + have hbound : + (a : ℚ) ≤ ((n : ℚ) - 1) / ((p : ℚ) - 1) := + hbern.trans hsub + calc + (padicValNat p n : ℚ) / ((n : ℚ) - 1) = + (a : ℚ) / ((n : ℚ) - 1) := rfl + _ ≤ (((n : ℚ) - 1) / ((p : ℚ) - 1)) / + ((n : ℚ) - 1) := + div_le_div_of_nonneg_right hbound hnden.le + _ = 1 / ((p : ℚ) - 1) := by + field_simp [hnden.ne', hpden.ne'] + +/-- Strict form of the preceding estimate: any slope strictly bigger than +`1/(p-1)` eventually dominates `v_p(n)` already termwise for every `n > 1`. -/ +theorem padicValNat_lt_sub_one_mul_of_inv_sub_one_lt + [Fact p.Prime] (hn : 1 < n) {c : ℚ} + (hc : 1 / ((p : ℚ) - 1) < c) : + (padicValNat p n : ℚ) < ((n : ℚ) - 1) * c := by + have hnden : 0 < (n : ℚ) - 1 := by + have hnq : (1 : ℚ) < n := by + exact_mod_cast hn + linarith + have hquot := + padicValNat_div_sub_one_le_inv_sub_one (p := p) (n := n) hn + have hstrict : + (padicValNat p n : ℚ) / ((n : ℚ) - 1) < c := + lt_of_le_of_lt hquot hc + calc + (padicValNat p n : ℚ) = + ((padicValNat p n : ℚ) / ((n : ℚ) - 1)) * + ((n : ℚ) - 1) := by + field_simp [hnden.ne'] + _ < c * ((n : ℚ) - 1) := + mul_lt_mul_of_pos_right hstrict hnden + _ = ((n : ℚ) - 1) * c := by + ring + +/-- Positivity form used in the valuation computation +`v_p(x^n / n) = n v_p(x) - v_p(n)`. -/ +theorem sub_padicValNat_pos_of_inv_sub_one_lt + [Fact p.Prime] (hn : 1 < n) {c : ℚ} + (hc : 1 / ((p : ℚ) - 1) < c) : + 0 < (n : ℚ) * c - (padicValNat p n : ℚ) := by + have hpNat : Nat.Prime p := Fact.out + have hpden : 0 < (p : ℚ) - 1 := by + have hp : (1 : ℚ) < p := by + exact_mod_cast hpNat.one_lt + linarith + have hcpos : 0 < c := + (one_div_pos.mpr hpden).trans hc + have hlt := + padicValNat_lt_sub_one_mul_of_inv_sub_one_lt + (p := p) (n := n) hn hc + have hstep : ((n : ℚ) - 1) * c < (n : ℚ) * c := by + nlinarith + exact sub_pos.mpr (hlt.trans hstep) + +/-- Higher logarithm terms have strictly larger integer valuation than the +linear term above the usual `1/(p-1)` threshold. -/ +theorem log_higher_term_integer_valuation_gt + [Fact p.Prime] {n : ℕ} (hn : 2 ≤ n) {m : ℤ} + (hm : 1 / ((p : ℚ) - 1) < (m : ℚ)) : + m < (n : ℤ) * m - (padicValNat p n : ℤ) := by + have hlt := + padicValNat_lt_sub_one_mul_of_inv_sub_one_lt + (p := p) (n := n) (by omega) (c := (m : ℚ)) hm + have hgoal : + (m : ℚ) < (n : ℚ) * (m : ℚ) - (padicValNat p n : ℚ) := by + nlinarith + have hgoal' : + (m : ℚ) < + (((n : ℤ) * m - (padicValNat p n : ℤ) : ℤ) : ℚ) := by + simpa [Int.cast_mul, Int.cast_sub, Int.cast_natCast] using hgoal + exact_mod_cast hgoal' + +/-- Ramified-denominator version of +`log_higher_term_integer_valuation_gt`: if the denominator contributes +`e * v_p(n)`, then the sharp comparison threshold is `e/(p-1)`. -/ +theorem log_higher_term_integer_valuation_gt_scaled + [Fact p.Prime] {n e : ℕ} (hn : 2 ≤ n) {m : ℤ} + (hm : (e : ℚ) / ((p : ℚ) - 1) < (m : ℚ)) : + m < (n : ℤ) * m - (e : ℤ) * (padicValNat p n : ℤ) := by + have hquot := + padicValNat_div_sub_one_le_inv_sub_one + (p := p) (n := n) (by omega) + have hnden : 0 < (n : ℚ) - 1 := by + have hnq : (1 : ℚ) < n := by + exact_mod_cast (by omega : 1 < n) + linarith + have he_nonneg : 0 ≤ (e : ℚ) := by + positivity + have hscaled_div : + ((e : ℚ) * (padicValNat p n : ℚ)) / ((n : ℚ) - 1) ≤ + (e : ℚ) / ((p : ℚ) - 1) := by + calc + ((e : ℚ) * (padicValNat p n : ℚ)) / ((n : ℚ) - 1) = + (e : ℚ) * ((padicValNat p n : ℚ) / ((n : ℚ) - 1)) := by + ring + _ ≤ (e : ℚ) * (1 / ((p : ℚ) - 1)) := + mul_le_mul_of_nonneg_left hquot he_nonneg + _ = (e : ℚ) / ((p : ℚ) - 1) := by + ring + have hstrict : + ((e : ℚ) * (padicValNat p n : ℚ)) / ((n : ℚ) - 1) < (m : ℚ) := + lt_of_le_of_lt hscaled_div hm + have hdenlt : + (e : ℚ) * (padicValNat p n : ℚ) < + ((n : ℚ) - 1) * (m : ℚ) := by + calc + (e : ℚ) * (padicValNat p n : ℚ) = + (((e : ℚ) * (padicValNat p n : ℚ)) / ((n : ℚ) - 1)) * + ((n : ℚ) - 1) := by + field_simp [hnden.ne'] + _ < (m : ℚ) * ((n : ℚ) - 1) := + mul_lt_mul_of_pos_right hstrict hnden + _ = ((n : ℚ) - 1) * (m : ℚ) := by + ring + have hgoal : + (m : ℚ) < + (n : ℚ) * (m : ℚ) - + (e : ℚ) * (padicValNat p n : ℚ) := by + nlinarith + have hgoal' : + (m : ℚ) < + (((n : ℤ) * m - + (e : ℤ) * (padicValNat p n : ℤ) : ℤ) : ℚ) := by + simpa [Int.cast_mul, Int.cast_sub, Int.cast_natCast] using hgoal + exact_mod_cast hgoal' + +end PadicLogArithmetic + +/-- If `e` divides the base-change index, the primitive quotient +`e / gcd e e'` is one. -/ +theorem nat_div_gcd_eq_one_of_dvd {e e' : ℕ} + (he : 0 < e) (hdiv : e ∣ e') : + e / Nat.gcd e e' = 1 := by + rw [Nat.gcd_eq_left hdiv, Nat.div_self he] + +/-- Dividing the lcm by the right input removes exactly the common gcd from +the left input. -/ +theorem nat_lcm_div_right_eq_div_gcd {a b : ℕ} (hb : 0 < b) : + Nat.lcm a b / b = a / Nat.gcd a b := by + calc + Nat.lcm a b / b = (a * b / Nat.gcd a b) / b := by + rfl + _ = (a * (b / Nat.gcd a b)) / b := by + rw [Nat.mul_div_assoc a (Nat.gcd_dvd_right a b)] + _ = ((b / Nat.gcd a b) * a) / + ((b / Nat.gcd a b) * Nat.gcd a b) := by + rw [Nat.mul_comm a (b / Nat.gcd a b), + Nat.div_mul_cancel (Nat.gcd_dvd_right a b)] + _ = a / Nat.gcd a b := by + rw [Nat.mul_div_mul_left] + exact Nat.div_pos + (Nat.le_of_dvd hb (Nat.gcd_dvd_right a b)) + (Nat.gcd_pos_of_pos_right a hb) + +/-- Dividing the lcm by the left input removes exactly the common gcd from +the right input. -/ +theorem nat_lcm_div_left_eq_div_gcd {a b : ℕ} (ha : 0 < a) : + Nat.lcm a b / a = b / Nat.gcd a b := by + simpa [Nat.lcm_comm, Nat.gcd_comm] using + (nat_lcm_div_right_eq_div_gcd (a := b) (b := a) ha) + +/-- If the lcm of two value steps divides `a * c`, the primitive part of +the second step after removing the common gcd with `a` divides `c`. -/ +theorem nat_div_gcd_dvd_of_lcm_dvd_mul_left {a b c : ℕ} + (ha : 0 < a) (hdiv : Nat.lcm a b ∣ a * c) : + b / Nat.gcd a b ∣ c := by + have hquot : Nat.lcm a b / a ∣ c := by + rcases hdiv with ⟨q, hq⟩ + refine ⟨q, ?_⟩ + apply Nat.eq_of_mul_eq_mul_left ha + have hlcm : a * (Nat.lcm a b / a) = Nat.lcm a b := by + rw [Nat.mul_comm, Nat.div_mul_cancel (Nat.dvd_lcm_left a b)] + calc + a * c = Nat.lcm a b * q := hq + _ = (a * (Nat.lcm a b / a)) * q := by + rw [hlcm] + _ = a * ((Nat.lcm a b / a) * q) := by + rw [mul_assoc] + simpa [nat_lcm_div_left_eq_div_gcd (a := a) (b := b) ha] using hquot + +/-- Symmetric cancellation form: if the lcm divides `c * b`, then the +primitive part of `a` after removing the common gcd with `b` divides `c`. -/ +theorem nat_div_gcd_dvd_of_lcm_dvd_mul_right {a b c : ℕ} + (hb : 0 < b) (hdiv : Nat.lcm a b ∣ c * b) : + a / Nat.gcd b a ∣ c := by + have hdiv' : Nat.lcm b a ∣ b * c := by + simpa [Nat.lcm_comm, mul_comm] using hdiv + exact nat_div_gcd_dvd_of_lcm_dvd_mul_left + (a := b) (b := a) (c := c) hb hdiv' + +/-- If multiplying by the right branch gives the lcm exactly, the remaining +factor is the primitive left branch after removing the common gcd. -/ +theorem nat_eq_div_gcd_of_right_mul_eq_lcm {a b c : ℕ} + (hb : 0 < b) (h : b * c = Nat.lcm a b) : + c = a / Nat.gcd a b := by + calc + c = Nat.lcm a b / b := by + exact Nat.eq_div_of_mul_eq_right (ne_of_gt hb) h + _ = a / Nat.gcd a b := + nat_lcm_div_right_eq_div_gcd (a := a) (b := b) hb + +/-- Left-handed exact lcm cancellation. -/ +theorem nat_eq_div_gcd_of_left_mul_eq_lcm {a b c : ℕ} + (ha : 0 < a) (h : a * c = Nat.lcm a b) : + c = b / Nat.gcd a b := by + calc + c = Nat.lcm a b / a := by + exact Nat.eq_div_of_mul_eq_right (ne_of_gt ha) h + _ = b / Nat.gcd a b := + nat_lcm_div_left_eq_div_gcd (a := a) (b := b) ha + +/-- If a right-branch multiple divides the lcm, the remaining factor divides +the primitive left branch after removing the common gcd. -/ +theorem nat_dvd_div_gcd_of_right_mul_dvd_lcm {a b c : ℕ} + (hb : 0 < b) (h : b * c ∣ Nat.lcm a b) : + c ∣ a / Nat.gcd a b := by + rcases h with ⟨q, hq⟩ + have hmul : b * (c * q) = Nat.lcm a b := by + simpa [mul_assoc] using hq.symm + have hquot : c * q = Nat.lcm a b / b := + Nat.eq_div_of_mul_eq_right (ne_of_gt hb) hmul + exact ⟨q, by + rw [← nat_lcm_div_right_eq_div_gcd (a := a) (b := b) hb] + exact hquot.symm⟩ + +/-- Left-handed divisibility form of lcm cancellation. -/ +theorem nat_dvd_div_gcd_of_left_mul_dvd_lcm {a b c : ℕ} + (ha : 0 < a) (h : a * c ∣ Nat.lcm a b) : + c ∣ b / Nat.gcd a b := by + rcases h with ⟨q, hq⟩ + have hmul : a * (c * q) = Nat.lcm a b := by + simpa [mul_assoc] using hq.symm + have hquot : c * q = Nat.lcm a b / a := + Nat.eq_div_of_mul_eq_right (ne_of_gt ha) hmul + exact ⟨q, by + rw [← nat_lcm_div_left_eq_div_gcd (a := a) (b := b) ha] + exact hquot.symm⟩ + +/-- Arithmetic endpoint for the tame Abhyankar formula: once the actual +common-top calculation supplies `e' * e_top = lcm e e'`, the top ramification +index is the primitive quotient of `e`. -/ +theorem nat_abhyankar_quotient_eq_of_right_mul_eq_lcm {e e' eTop : ℕ} + (he' : 0 < e') (h : e' * eTop = Nat.lcm e e') : + eTop = e / Nat.gcd e e' := + nat_eq_div_gcd_of_right_mul_eq_lcm (a := e) (b := e') (c := eTop) he' h + +/-- Divisibility form used before the actual common-top equality is sharpened +to an equality. -/ +theorem nat_abhyankar_quotient_dvd_of_right_mul_dvd_lcm {e e' eTop : ℕ} + (he' : 0 < e') (h : e' * eTop ∣ Nat.lcm e e') : + eTop ∣ e / Nat.gcd e e' := + nat_dvd_div_gcd_of_right_mul_dvd_lcm + (a := e) (b := e') (c := eTop) he' h + +/-- If the lower ramification index already divides the base-change index, +the tame Abhyankar quotient is one. -/ +theorem nat_abhyankar_quotient_eq_one_of_dvd {e e' : ℕ} + (he : 0 < e) (hdiv : e ∣ e') : + e / Nat.gcd e e' = 1 := + nat_div_gcd_eq_one_of_dvd he hdiv + +/-- Exact index-one corollary from the common-top lcm equality. -/ +theorem nat_abhyankar_index_eq_one_of_right_mul_eq_lcm_of_dvd + {e e' eTop : ℕ} (he : 0 < e) (he' : 0 < e') + (hdiv : e ∣ e') (h : e' * eTop = Nat.lcm e e') : + eTop = 1 := by + rw [nat_abhyankar_quotient_eq_of_right_mul_eq_lcm he' h, + nat_abhyankar_quotient_eq_one_of_dvd he hdiv] + +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean new file mode 100644 index 0000000000..c247060a86 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean @@ -0,0 +1,589 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.DenominatorValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogUniqueness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpAdditivity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.WithZeroValuationTopology +/-! +# The local-field logarithm + +This file packages the ramification-scaled principal-unit logarithm as a +continuous homomorphism and extends it to field units with the unique +uniformizer value forced by `log p = 0`. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + mem_zeroSubgroup_iff_exists_valuationSubringUnitFieldUnitHom_eq → + mem_zeroSubgroup_iff_exists_valuationSubringUnitFieldUnitHom_eq + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + valuationSubringUnitFieldUnitHom → + valuationSubringUnitFieldUnitHom + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming + multiplicativeIntegerValuationOfUniformizer → + multiplicativeIntegerValuationOfUniformizer + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming + multiplicativeIntegerValuationOfUniformizer_isUniformizer → + multiplicativeIntegerValuationOfUniformizer_isUniformizer + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming + multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup → + multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming + uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit → + uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit + + +noncomputable +section + +universe u + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +open Filter +open scoped Topology + +variable {K : Type u} [Field K] + +/-- The ramification-scaled logarithm homomorphism on first principal units is +continuous. Near the identity its valuation agrees with that of `u - 1`, +because one may restrict to an arbitrarily deep ball above `e/(p-1)`. -/ +theorem continuous_principalUnitLogSeriesHomOfWithZeroValuationScaled + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e : ℕ) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Continuous + (principalUnitLogSeriesHomOfWithZeroValuationScaled + (v := v) (p := p) e hnK hnval hcomplete) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := + completeDVFOfWithZeroValuation v + have hMulSubring : + Continuous (fun z : F.valuationSubring × F.valuationSubring => + z.1 * z.2) := by + apply Continuous.subtype_mk + exact + (continuous_subtype_val.comp continuous_fst).mul + (continuous_subtype_val.comp continuous_snd) + let : ContinuousMul F.valuationSubring := ⟨hMulSubring⟩ + have hInv : + Continuous (fun u : F.valuationSubringˣ => u⁻¹) := by + rw [Units.continuous_iff] + constructor + · change Continuous (fun u : F.valuationSubringˣ => + ((u⁻¹ : F.valuationSubringˣ) : F.valuationSubring)) + exact Units.continuous_coe_inv + · simpa using (Units.continuous_val : + Continuous (fun u : F.valuationSubringˣ => + (u : F.valuationSubring))) + have hMul : + Continuous (fun z : F.valuationSubringˣ × F.valuationSubringˣ => + z.1 * z.2) := by + rw [Units.continuous_iff] + constructor + · exact + (Units.continuous_val.comp continuous_fst).mul + (Units.continuous_val.comp continuous_snd) + · change Continuous (fun z : F.valuationSubringˣ × F.valuationSubringˣ => + (((z.1 * z.2)⁻¹ : F.valuationSubringˣ) : F.valuationSubring)) + have hc : Continuous + (fun z : F.valuationSubringˣ × F.valuationSubringˣ => + ((z.1⁻¹ : F.valuationSubringˣ) : F.valuationSubring) * + ((z.2⁻¹ : F.valuationSubringˣ) : F.valuationSubring)) := + (Units.continuous_coe_inv.comp continuous_fst).mul + (Units.continuous_coe_inv.comp continuous_snd) + simpa [Units.val_inv_eq_inv_val, mul_comm] using hc + let : ContinuousMul F.valuationSubringˣ := ⟨hMul⟩ + let : ContinuousInv F.valuationSubringˣ := ⟨hInv⟩ + have : IsTopologicalGroup F.valuationSubringˣ := by infer_instance + have : IsTopologicalGroup + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) := by + infer_instance + let φ := + principalUnitLogSeriesHomOfWithZeroValuationScaled + (v := v) (p := p) e hnK hnval hcomplete + apply continuous_of_continuousAt_one φ + dsimp [φ, principalUnitLogSeriesHomOfWithZeroValuationScaled] + rw [ContinuousAt] + suffices hlog : + Tendsto + (fun u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1 => + principalUnitLogSeriesOfWithZeroValuation v u hnK) + (𝓝 1) (𝓝 0) by + rw [principalUnitLogSeries_one_ofWithZeroValuation v hnK] + change Tendsto + (fun u => Multiplicative.ofAdd + (principalUnitLogSeriesOfWithZeroValuation v u hnK)) + (𝓝 1) (𝓝 (Multiplicative.ofAdd (0 : K))) + exact (continuous_ofAdd.tendsto (0 : K)).comp hlog + rw [(Valued.hasBasis_nhds_zero K + (WithZero (Multiplicative ℤ))).tendsto_right_iff] + intro γ _ + let γ' : (WithZero (Multiplicative ℤ))ˣ := + Units.map (MonoidWithZeroHom.ValueGroup₀.embedding + (f := (.ofClass v))) γ + obtain ⟨N₀, hN₀γ⟩ := + WithZero.exists_exp_neg_natCast_lt γ'.ne_zero + obtain ⟨N₁, hN₁⟩ : ∃ N₁ : ℕ, + (e : ℚ) / ((p : ℚ) - 1) < (N₁ : ℚ) := + exists_nat_gt ((e : ℚ) / ((p : ℚ) - 1)) + let N := max N₀ N₁ + have hNγ : WithZero.exp (-(N : ℤ)) < + (γ' : WithZero (Multiplicative ℤ)) := by + exact lt_of_le_of_lt + (by + apply WithZero.exp_le_exp.mpr + simp only [neg_le_neg_iff] + exact_mod_cast Nat.le_max_left N₀ N₁) + hN₀γ + have hNth : + (e : ℚ) / ((p : ℚ) - 1) < (N : ℚ) := + lt_of_lt_of_le hN₁ (by exact_mod_cast Nat.le_max_right N₀ N₁) + have hsubContinuous : + Continuous + (fun u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1 => + principalUnitSubOneOfWithZeroValuation v u) := by + unfold principalUnitSubOneOfWithZeroValuation + fun_prop + have hball : + {x : K | v x < WithZero.exp (-(N : ℤ))} ∈ 𝓝 (0 : K) := by + let g : (WithZero (Multiplicative ℤ))ˣ := + Valuation.IsRankOneDiscrete.generator v + have hg : (g : WithZero (Multiplicative ℤ)) < 1 := by + exact Valuation.IsRankOneDiscrete.generator_lt_one v + let a : ℤ := WithZero.log (g : WithZero (Multiplicative ℤ)) + have ha : a ≤ -1 := by + have ha0 : a < 0 := by + have hlog := (WithZero.log_lt_log (Units.ne_zero g) + (one_ne_zero : (1 : WithZero (Multiplicative ℤ)) ≠ 0)).2 hg + simpa [a] using hlog + omega + let m := N + 1 + have hm : + (g : WithZero (Multiplicative ℤ)) ^ m < + WithZero.exp (-(N : ℤ)) := by + rw [show m = N + 1 by rfl, ← WithZero.exp_log (Units.ne_zero g), + ← WithZero.exp_nsmul, WithZero.exp_lt_exp] + change ((N + 1 : ℕ) : ℤ) * a < -(N : ℤ) + calc + ((N + 1 : ℕ) : ℤ) * a ≤ ((N + 1 : ℕ) : ℤ) * (-1) := + mul_le_mul_of_nonneg_left ha (by omega) + _ < -(N : ℤ) := by omega + rcases Valuation.IsRankOneDiscrete.generator_mem_range K v with ⟨z, hz⟩ + have hz0 : z ≠ 0 := (Valuation.ne_zero_iff v).mp (by + rw [hz] + exact Units.ne_zero g) + have hzm0 : z ^ m ≠ 0 := pow_ne_zero m hz0 + rw [Valued.mem_nhds_zero] + refine ⟨Units.mk0 (v.restrict (z ^ m)) + ((Valuation.ne_zero_iff v.restrict).2 hzm0), ?_⟩ + intro x hx + change v.restrict x < v.restrict (z ^ m) at hx + have hx' : v x < v (z ^ m) := v.restrict_lt_iff.mp hx + exact hx'.trans (by simpa [v.map_pow, hz] using hm) + have hpre : + {u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1 | + v (principalUnitSubOneOfWithZeroValuation v u) < + WithZero.exp (-(N : ℤ))} ∈ 𝓝 1 := by + have hballOne : + {x : K | v x < WithZero.exp (-(N : ℤ))} ∈ + 𝓝 (principalUnitSubOneOfWithZeroValuation v + (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1)) := by + simpa using hball + have ht := (hsubContinuous.tendsto + (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1)) hballOne + exact ht + refine Filter.mem_of_superset hpre ?_ + intro u hu + change + v.restrict (principalUnitLogSeriesOfWithZeroValuation v u hnK) < γ.1 + rw [Valuation.restrict_lt_iff_lt_embedding] + let x := principalUnitSubOneOfWithZeroValuation v u + by_cases hx : x = 0 + · have hlog : principalUnitLogSeriesOfWithZeroValuation v u hnK = 0 := by + simp [principalUnitLogSeriesOfWithZeroValuation, x, hx] + rw [hlog, v.map_zero] + exact zero_lt_iff.mpr + (MonoidWithZeroHom.ValueGroup₀.embedding_unit_ne_zero γ) + · have hxv_ne : v x ≠ 0 := (_root_.Valuation.ne_zero_iff v).2 hx + have hloglt : WithZero.log (v x) < -(N : ℤ) := by + exact + (WithZero.log_lt_log hxv_ne + (WithZero.exp_ne_zero (a := -(N : ℤ)))).2 (by simpa [x] using hu) + have hvalN : + (N : ℤ) < (ofWithZeroValuation v).val (Units.mk0 x hx) := by + change (N : ℤ) < -WithZero.log (v x) + linarith + have hthreshold : + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ) := + lt_of_lt_of_le hNth (by exact_mod_cast hvalN.le) + have hvx : v x < (1 : WithZero (Multiplicative ℤ)) := + principalUnitSubOne_val_lt_one_ofWithZeroValuation v u + have hval := + valuation_logOnePlusSeriesField_eq_self_of_scaled_inv_sub_one_lt + (v := v) (p := p) e (x := x) hx hnK hnval hvx hthreshold hcomplete + rw [principalUnitLogSeriesOfWithZeroValuation, hval] + exact lt_trans (by simpa [x] using hu) (by simpa [γ'] using hNγ) + +/-- The residue characteristic has a nonzero uniformizer exponent. This is +the algebraic point that makes the normalization `log p = 0` determine the +uniformizer value in the field-unit logarithm theorem. -/ +theorem uniformizerValueExponent_residueCharacteristic_ne_zero + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + {π : (LocalField.ofWithZeroValuation v).valuationSubring} + (hπ : (LocalField.ofWithZeroValuation v).toCompleteDVF.valuation.IsUniformizer + (π : K)) : + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent + (LocalField.ofWithZeroValuation v).toCompleteDVF) hπ + (Units.mk0 + ((LocalField.ofWithZeroValuation v).residueCharacteristic : K) + (LocalField.ofWithZeroValuation v).natCast_residueCharacteristic_ne_zero_of_charZero) + ≠ 0 := by + let F : LocalField.{u, 0} K := LocalField.ofWithZeroValuation v + let pUnit : Kˣ := + Units.mk0 (F.residueCharacteristic : K) + F.natCast_residueCharacteristic_ne_zero_of_charZero + intro hm + have hvalue := + (uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F.toCompleteDVF) + hπ pUnit + rw [hm, zpow_zero] at hvalue + have hvalue' := + congrArg (fun γ : F.toCompleteDVF.ValueGroupˣ => + (γ : F.toCompleteDVF.ValueGroup)) hvalue + have hpone : F.toCompleteDVF.valuation (F.residueCharacteristic : K) = 1 := by + simpa [CompleteDVF.fieldUnitValueUnit, pUnit] using hvalue'.symm + exact (ne_of_lt F.valuation_natCast_residueCharacteristic_lt_one) hpone + +open CompleteDVF.higherPrincipalUnitGroup renaming + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF → + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF in +open CompleteDVF.higherPrincipalUnitGroup renaming + fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply → + fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply in +/-- Uniqueness of the corrected extension: agreement on first principal +units together with vanishing on one field unit of nonzero uniformizer +exponent determines the logarithm on all field units. -/ +theorem fieldUnitLogHomWithUniformizerValue_unique_of_killing + (F : ValuationTheory.DiscreteValuationField.CompleteDVF K) [Finite F.residueField] [CharZero K] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative K) (a : Kˣ) + (ha : (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent + F) hπ a ≠ 0) + (ψ : Kˣ →* Multiplicative K) + (hψprincipal : ∀ u : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1, + ψ (valuationSubringUnitFieldUnitHom F + (u : F.valuationSubringˣ)) = φ u) + (hψa : ψ a = 1) : + ψ = fieldUnitLogHomWithUniformizerValue F + (fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ) φ + (uniformizerLogValueKilling F + (fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ) φ a) := by + let d := + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ + let L := fieldUnitLogHomWithUniformizerValue F d φ + (uniformizerLogValueKilling F d φ a) + let ϖ : Kˣ := Units.mk0 (π : K) hπ.ne_zero + let z := d.symm a + let m : ℤ := Multiplicative.toAdd z.2 + have hm : m ≠ 0 := by + simpa [m, z, d] using ha + have hLa : L a = 1 := by + exact fieldUnitLogHomWithUniformizerValue_uniformizerLogValueKilling + F d φ a hm + have hψformula : + Multiplicative.toAdd (ψ a) = + Multiplicative.toAdd (φ z.1.2) + + m • Multiplicative.toAdd (ψ ϖ) := by + have hdecomp : d z = a := d.apply_symm_apply a + rw [← hdecomp] + rw [fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply] + rw [ψ.map_mul, ψ.map_mul, ψ.map_zpow] + rw [toAdd_mul, toAdd_mul, toAdd_zpow] + rw [monoidHom_toMultiplicative_residueRoot_eq_one (K := K) F ψ z.1.1] + rw [hψprincipal z.1.2] + simp [ϖ, m] + have hLformula : + Multiplicative.toAdd (L a) = + Multiplicative.toAdd (φ z.1.2) + + m • Multiplicative.toAdd (L ϖ) := by + have hdecomp : d z = a := d.apply_symm_apply a + rw [← hdecomp] + rw [fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply] + rw [L.map_mul, L.map_mul, L.map_zpow] + rw [toAdd_mul, toAdd_mul, toAdd_zpow] + have hLprincipal : + L (valuationSubringUnitFieldUnitHom F + (z.1.2 : F.valuationSubringˣ)) = φ z.1.2 := by + simpa [L, d] using + fieldUnitLogHomWithUniformizerValue_eq_of_completeDVF_principal + F hπ φ (uniformizerLogValueKilling F d φ a) z.1.2 + rw [monoidHom_toMultiplicative_residueRoot_eq_one (K := K) F L z.1.1] + rw [hLprincipal] + simp [ϖ, m] + have hpow : + m • Multiplicative.toAdd (ψ ϖ) = + m • Multiplicative.toAdd (L ϖ) := by + rw [hψa] at hψformula + rw [hLa] at hLformula + simpa only [toAdd_one] using + add_left_cancel (hψformula.symm.trans hLformula) + have hϖ : ψ ϖ = L ϖ := by + apply Multiplicative.toAdd.injective + exact zsmul_right_injective hm hpow + apply monoidHom_toMultiplicative_ext_of_agree_principalUnits_and_uniformizer + F ((multiplicativeIntegerValuationOfUniformizer F) hπ) + · intro y + exact + mem_zeroSubgroup_iff_exists_valuationSubringUnitFieldUnitHom_eq + (F := F) + ((multiplicativeIntegerValuationOfUniformizer F) hπ) + ((multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) hπ) + y + · exact + (multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ + · intro u + rw [hψprincipal u] + simpa [L, d] using + (fieldUnitLogHomWithUniformizerValue_eq_of_completeDVF_principal + F hπ φ (uniformizerLogValueKilling F d φ a) u).symm + · exact hϖ + +open CompleteDVF.higherPrincipalUnitGroup renaming + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF → + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF in +open CompleteDVF.higherPrincipalUnitGroup renaming + continuous_fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_mrangeRestrict → + continuous_rootsPrincipalUnitsUniformizer_symm in +/-- The inverse of the uniformizer–residue–principal-unit decomposition field-unit decomposition +is continuous +also for the topology defined directly by a standard `ℤᵐ⁰`-valued valuation. +The proof transports the already established range-restricted result across +the equality of uniform structures. -/ +theorem continuous_fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) : + let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := + completeDVFOfWithZeroValuation v + letI : Finite F.residueField := by + change Finite (IsLocalRing.ResidueField v.valuationSubring) + infer_instance + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Continuous + (fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ).symm := by + let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := + completeDVFOfWithZeroValuation v + let direct : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let restricted : Valued K + (MonoidHom.mrange v.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + have huniform : + (Valued.mk' v).toUniformSpace = + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F).toUniformSpace := by + change (Valued.mk' v).toUniformSpace = + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + (WithZeroValuationTopology.completeDVF v)).toUniformSpace + exact WithZeroValuationTopology.valuedMk_uniformSpace_eq_mrangeRestrict v + have : Finite F.residueField := by + change Finite (IsLocalRing.ResidueField v.valuationSubring) + infer_instance + let hcontinuousRestricted := + letI : Valued K + (MonoidHom.mrange v.toMonoidWithZeroHom) := restricted + continuous_rootsPrincipalUnitsUniformizer_symm + F hπ + have htop : direct.toTopologicalSpace = restricted.toTopologicalSpace := by + exact congrArg (fun U : UniformSpace K => U.toTopologicalSpace) huniform + let unitsTopology (t : TopologicalSpace K) : TopologicalSpace Kˣ := + letI : TopologicalSpace K := t + inferInstance + let factorsTopology (t : TopologicalSpace K) : + TopologicalSpace + (CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F) := + letI : TopologicalSpace K := t + inferInstance + have hdom : + unitsTopology direct.toTopologicalSpace = + unitsTopology restricted.toTopologicalSpace := + congrArg unitsTopology htop + have hcod : + factorsTopology direct.toTopologicalSpace = + factorsTopology restricted.toTopologicalSpace := + congrArg factorsTopology htop + let : Valued K (WithZero (Multiplicative ℤ)) := direct + change @Continuous Kˣ + (CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F) + (unitsTopology direct.toTopologicalSpace) + (factorsTopology direct.toTopologicalSpace) + (fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ).symm + rw [hdom, hcod] + exact hcontinuousRestricted + +open CompleteDVF.higherPrincipalUnitGroup renaming + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF → + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF in +/-- The local-field structure theory, the field-unit logarithm theorem. For a +mixed-characteristic local +field presented by a complete discrete `ℤᵐ⁰`-valued valuation, there is a +unique continuous additive logarithm on `Kˣ` which kills the residue +characteristic and restricts on `U¹` to the convergent logarithm series. -/ +theorem existsUnique_continuous_log + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] : + let F : LocalField.{u, 0} K := LocalField.ofWithZeroValuation v + let pUnit : Kˣ := + Units.mk0 (F.residueCharacteristic : K) + F.natCast_residueCharacteristic_ne_zero_of_charZero + let hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0) := + fun n => Nat.cast_ne_zero.mpr (Nat.succ_ne_zero n) + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + ∃! L : Kˣ →* Multiplicative K, + Continuous L ∧ + L pUnit = 1 ∧ + ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1, + Multiplicative.toAdd + (L (valuationSubringUnitFieldUnitHom + F.toCompleteDVF (u : F.toCompleteDVF.valuationSubringˣ))) = + principalUnitLogSeriesOfWithZeroValuation v u hnK := by + let F : LocalField.{u, 0} K := LocalField.ofWithZeroValuation v + let p : ℕ := F.residueCharacteristic + let e : ℕ := LocalField.ramificationIndexOfWithZeroValuation v + let pUnit : Kˣ := + Units.mk0 (F.residueCharacteristic : K) + F.natCast_residueCharacteristic_ne_zero_of_charZero + let hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0) := + fun n => Nat.cast_ne_zero.mpr (Nat.succ_ne_zero n) + let hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ))) := by + intro n + simpa [F, p, e] using + LocalField.valuation_natCast_succ_eq_exp_neg_ramificationIndex_mul_padicValNat + v n + have hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K := + WithZeroValuationTopology.completeSpace_ofWithZeroValuation v + let : Fact p.Prime := by + dsimp [p, F] + infer_instance + let φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1 →* Multiplicative K := + principalUnitLogSeriesHomOfWithZeroValuationScaled + (v := v) (p := p) e hnK hnval hcomplete + have hφ : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Continuous φ := by + convert + continuous_principalUnitLogSeriesHomOfWithZeroValuationScaled + (v := v) (p := p) e hnK hnval hcomplete using 1 + all_goals rfl + rcases F.exists_uniformizer with ⟨π, hπ⟩ + let d := + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F.toCompleteDVF hπ + let c : K := uniformizerLogValueKilling F.toCompleteDVF d φ pUnit + let L : Kˣ →* Multiplicative K := + fieldUnitLogHomWithUniformizerValue F.toCompleteDVF d φ c + have hpExponent : + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent + F.toCompleteDVF) hπ pUnit ≠ 0 := by + simpa [F, pUnit] using + uniformizerValueExponent_residueCharacteristic_ne_zero v hπ + have hLp : L pUnit = 1 := by + simpa [L, c] using + fieldUnitLogHomWithUniformizerValue_uniformizerLogValueKilling + F.toCompleteDVF d φ pUnit (by simpa [d] using hpExponent) + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hd : Continuous d.symm := by + convert + continuous_fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_ofWithZeroValuation + v hπ using 1 + all_goals rfl + have hL : Continuous L := by + exact + (continuous_fieldUnitDecompositionLogHomWithUniformizerValue + F.toCompleteDVF φ c hφ).comp hd + have hLprincipal : ∀ u : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1, + Multiplicative.toAdd + (L (valuationSubringUnitFieldUnitHom + F.toCompleteDVF (u : F.toCompleteDVF.valuationSubringˣ))) = + principalUnitLogSeriesOfWithZeroValuation v u hnK := by + intro u + have hu := + fieldUnitLogHomWithUniformizerValue_eq_of_completeDVF_principal + F.toCompleteDVF hπ φ c u + rw [show L = fieldUnitLogHomWithUniformizerValue F.toCompleteDVF d φ c from rfl] + rw [show d = + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F.toCompleteDVF hπ from rfl] + rw [hu] + exact + principalUnitLogSeriesHomOfWithZeroValuationScaled_apply_toAdd + (v := v) (p := p) e hnK hnval hcomplete u + refine ⟨L, ⟨hL, hLp, hLprincipal⟩, ?_⟩ + intro ψ hψ + apply fieldUnitLogHomWithUniformizerValue_unique_of_killing + F.toCompleteDVF hπ φ pUnit hpExponent ψ + · intro u + apply Multiplicative.toAdd.injective + calc + Multiplicative.toAdd + (ψ (valuationSubringUnitFieldUnitHom + F.toCompleteDVF (u : F.toCompleteDVF.valuationSubringˣ))) = + principalUnitLogSeriesOfWithZeroValuation v u hnK := hψ.2.2 u + _ = Multiplicative.toAdd (φ u) := by + symm + exact + principalUnitLogSeriesHomOfWithZeroValuationScaled_apply_toAdd + (v := v) (p := p) e hnK hnval hcomplete u + · exact hψ.2.1 + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/DenominatorValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/DenominatorValuation.lean new file mode 100644 index 0000000000..2392a45af3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/DenominatorValuation.lean @@ -0,0 +1,250 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic +public import Mathlib.NumberTheory.Padics.PadicVal.Basic +/-! +# Valuations of natural-number denominators + +For a complete discrete valuation with value group `WithZero (Multiplicative ℤ)` +and finite residue field, this file constructs the ramification index +`e = v_K(p)` from the valuation itself. In mixed characteristic it then proves +the natural-number valuation formula used in the logarithm and exponential theorems. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace LocalFieldTheory.DiscreteValuationField +namespace LocalField + +variable {K : Type u} [Field K] + +/-- The full ordered group structure whose ordered-monoid parent is the +canonical one used by `Valuation` on `ℤᵐ⁰`. -/ +@[reducible] def coherentWithZeroMultiplicativeIntGroup : + LinearOrderedCommGroupWithZero + (WithZero (Multiplicative ℤ)) where + __ := + (inferInstance : + LinearOrderedCommMonoidWithZero + (WithZero (Multiplicative ℤ))) + __ := + (inferInstance : + CommGroupWithZero + (WithZero (Multiplicative ℤ))) + +/-- Package a standard `ℤᵐ⁰`-valued complete discrete valuation with finite +residue field as a local field. -/ +def ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] : + LocalField.{u, 0} K where + toCompleteDVF := + { ValueGroup := WithZero (Multiplicative ℤ) + instValueGroup := coherentWithZeroMultiplicativeIntGroup + valuation := v + instCompleteDiscrete := inferInstance } + residueFinite := by + change Finite (IsLocalRing.ResidueField v.valuationSubring) + infer_instance + +/-- The ramification index `e = v_K(p)` of a standard mixed-characteristic +local field, obtained from the exponent of the value of its residue +characteristic `p`. -/ +def ramificationIndexOfWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] : ℕ := + Int.toNat + (-WithZero.log + (v ((ofWithZeroValuation v).residueCharacteristic : K))) + +/-- The natural ramification index recovers the normalized integer valuation +of the residue characteristic. -/ +theorem ramificationIndexOfWithZeroValuation_intCast + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] : + (ramificationIndexOfWithZeroValuation v : ℤ) = + -WithZero.log + (v ((ofWithZeroValuation v).residueCharacteristic : K)) := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + have hpK : (F.residueCharacteristic : K) ≠ 0 := + F.natCast_residueCharacteristic_ne_zero_of_charZero + have hpv_ne : v (F.residueCharacteristic : K) ≠ 0 := + (_root_.Valuation.ne_zero_iff v).2 hpK + have hpv_lt : + v (F.residueCharacteristic : K) < + (1 : WithZero (Multiplicative ℤ)) := by + exact F.valuation_natCast_residueCharacteristic_lt_one + have hlogneg : + WithZero.log (v (F.residueCharacteristic : K)) < (0 : ℤ) := by + have hloglt : + WithZero.log (v (F.residueCharacteristic : K)) < + WithZero.log (1 : WithZero (Multiplicative ℤ)) := by + rw [WithZero.log_lt_log hpv_ne one_ne_zero] + exact hpv_lt + simpa using hloglt + have hnonneg : + 0 ≤ -WithZero.log (v (F.residueCharacteristic : K)) := + (neg_pos.mpr hlogneg).le + simpa [ramificationIndexOfWithZeroValuation, F] using + Int.toNat_of_nonneg hnonneg + +/-- The ramification index of a mixed-characteristic local field is positive. -/ +theorem ramificationIndexOfWithZeroValuation_pos + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] : + 0 < ramificationIndexOfWithZeroValuation v := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + have hpK : (F.residueCharacteristic : K) ≠ 0 := + F.natCast_residueCharacteristic_ne_zero_of_charZero + have hpv_ne : v (F.residueCharacteristic : K) ≠ 0 := + (_root_.Valuation.ne_zero_iff v).2 hpK + have hpv_lt : + v (F.residueCharacteristic : K) < + (1 : WithZero (Multiplicative ℤ)) := by + exact F.valuation_natCast_residueCharacteristic_lt_one + have hlogneg : + WithZero.log (v (F.residueCharacteristic : K)) < (0 : ℤ) := by + have hloglt : + WithZero.log (v (F.residueCharacteristic : K)) < + WithZero.log (1 : WithZero (Multiplicative ℤ)) := by + rw [WithZero.log_lt_log hpv_ne one_ne_zero] + exact hpv_lt + simpa using hloglt + have heInt : + (0 : ℤ) < (ramificationIndexOfWithZeroValuation v : ℤ) := by + rw [ramificationIndexOfWithZeroValuation_intCast v] + exact neg_pos.mpr hlogneg + exact_mod_cast heInt + +/-- The value of the residue characteristic is `exp (-e)`, where `e` is the +ramification index constructed from the valuation. -/ +theorem valuation_residueCharacteristic_eq_exp_neg_ramificationIndex + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] : + v ((ofWithZeroValuation v).residueCharacteristic : K) = + WithZero.exp (-(ramificationIndexOfWithZeroValuation v : ℤ)) := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + have hpK : (F.residueCharacteristic : K) ≠ 0 := + F.natCast_residueCharacteristic_ne_zero_of_charZero + have hpv_ne : v (F.residueCharacteristic : K) ≠ 0 := + (_root_.Valuation.ne_zero_iff v).2 hpK + have hpv_ne' : + v ((ofWithZeroValuation v).residueCharacteristic : K) ≠ 0 := by + simpa [F] using hpv_ne + calc + v ((ofWithZeroValuation v).residueCharacteristic : K) = + WithZero.exp + (WithZero.log + (v ((ofWithZeroValuation v).residueCharacteristic : K))) := + (WithZero.exp_log hpv_ne').symm + _ = WithZero.exp (-(ramificationIndexOfWithZeroValuation v : ℤ)) := by + rw [ramificationIndexOfWithZeroValuation_intCast v] + simp + +/-- A nonzero natural number has valuation equal to the value of its +residue-characteristic power. This is the denominator formula needed for the +logarithm and exponential estimates in the logarithm and exponential estimates. -/ +theorem valuation_natCast_eq_exp_neg_ramificationIndex_mul_padicValNat + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (m : ℕ) (hm : m ≠ 0) : + v (m : K) = + WithZero.exp + (-((ramificationIndexOfWithZeroValuation v : ℤ) * + (padicValNat (ofWithZeroValuation v).residueCharacteristic m : ℤ))) := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let p : ℕ := F.residueCharacteristic + let e : ℕ := ramificationIndexOfWithZeroValuation v + let k : ℕ := padicValNat p m + let a : ℕ := m / p ^ k + let : Fact p.Prime := by + dsimp [p] + infer_instance + have hpow : p ^ k ∣ m := by + exact pow_padicValNat_dvd + have hmfac : p ^ k * a = m := by + exact Nat.mul_div_cancel' hpow + have ha : ¬ p ∣ a := by + intro hpa + have hnot : ¬ p ^ (k + 1) ∣ m := by + simpa [k] using + (pow_succ_padicValNat_not_dvd (p := p) hm) + apply hnot + rcases hpa with ⟨b, hb⟩ + refine ⟨b, ?_⟩ + calc + m = p ^ k * a := hmfac.symm + _ = p ^ k * (p * b) := by rw [hb] + _ = p ^ (k + 1) * b := by rw [pow_succ]; ac_rfl + have hpVal : + v (p : K) = WithZero.exp (-(e : ℤ)) := by + simpa [F, p, e] using + valuation_residueCharacteristic_eq_exp_neg_ramificationIndex v + have haVal : v (a : K) = 1 := by + change F.toCompleteDVF.valuation (a : K) = 1 + exact F.valuation_natCast_eq_one_of_not_residueCharacteristic_dvd ha + have hmK : (m : K) = (p : K) ^ k * (a : K) := by + exact_mod_cast hmfac.symm + calc + v (m : K) = v ((p : K) ^ k * (a : K)) := by rw [hmK] + _ = v (p : K) ^ k * v (a : K) := by rw [v.map_mul, v.map_pow] + _ = WithZero.exp (-(e : ℤ)) ^ k := by rw [hpVal, haVal, mul_one] + _ = WithZero.exp (k • (-(e : ℤ))) := by + rw [WithZero.exp_nsmul] + _ = WithZero.exp (-((e : ℤ) * (k : ℤ))) := by + congr 1 + simp [mul_comm] + _ = WithZero.exp + (-((ramificationIndexOfWithZeroValuation v : ℤ) * + (padicValNat (ofWithZeroValuation v).residueCharacteristic m : ℤ))) := by + rfl + +/-- Successor form of the natural-number valuation formula. Unlike the main +formula, this needs no explicit nonzero hypothesis. -/ +theorem valuation_natCast_succ_eq_exp_neg_ramificationIndex_mul_padicValNat + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (m : ℕ) : + v ((m + 1 : ℕ) : K) = + WithZero.exp + (-((ramificationIndexOfWithZeroValuation v : ℤ) * + (padicValNat + (ofWithZeroValuation v).residueCharacteristic (m + 1) : ℤ))) := + valuation_natCast_eq_exp_neg_ramificationIndex_mul_padicValNat + v (m + 1) (Nat.succ_ne_zero m) + +/-- Factorial form of the natural-number valuation formula, used by the +exponential series in the deep exponential–logarithm equivalence. -/ +theorem valuation_natCast_factorial_eq_exp_neg_ramificationIndex_mul_padicValNat + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (m : ℕ) : + v ((m.factorial : ℕ) : K) = + WithZero.exp + (-((ramificationIndexOfWithZeroValuation v : ℤ) * + (padicValNat + (ofWithZeroValuation v).residueCharacteristic m.factorial : ℤ))) := + valuation_natCast_eq_exp_neg_ramificationIndex_mul_padicValNat + v m.factorial (Nat.factorial_ne_zero m) + +end LocalField +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogExtension.lean new file mode 100644 index 0000000000..3627089fc9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogExtension.lean @@ -0,0 +1,293 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.Homomorphisms +/-! +# Extending the logarithm to the field-unit group + +The logarithm on first principal units does not extend by killing a chosen +uniformizer. Its uniformizer value must instead be chosen so that the +distinguished rational prime has logarithm zero. This file isolates that +algebraic construction. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +open ValuationTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +variable {K : Type u} [Field K] + +/-- Extend a homomorphism on first principal units to the three factors in +the uniformizer–residue–principal-unit decomposition, killing the residue-root factor and + assigning the additive +value `c` to one power of the chosen uniformizer. -/ +noncomputable def fieldUnitDecompositionLogHomWithUniformizerValue + (F : CompleteDVF K) [Finite F.residueField] + {A : Type*} [AddCommGroup A] + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (c : A) : + CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F →* + Multiplicative A where + toFun z := + φ z.1.2 * Multiplicative.ofAdd (Multiplicative.toAdd z.2 • c) + map_one' := by simp + map_mul' z w := by + apply Multiplicative.toAdd.injective + change + Multiplicative.toAdd (φ (z.1.2 * w.1.2)) + + (Multiplicative.toAdd z.2 + Multiplicative.toAdd w.2) • c = + (Multiplicative.toAdd (φ z.1.2) + Multiplicative.toAdd z.2 • c) + + (Multiplicative.toAdd (φ w.1.2) + Multiplicative.toAdd w.2 • c) + rw [φ.map_mul] + simp only [toAdd_mul, add_zsmul] + abel + +/-- +The defining evaluation formula for `fieldUnitDecompositionLogHomWithUniformizerValue` is +`fieldUnitDecompositionLogHomWithUniformizerValue F φ c z = φ z.1.2 * Multiplicative.ofAdd +(Multiplicative.toAdd z.2 • c)`. +-/ +@[simp] theorem fieldUnitDecompositionLogHomWithUniformizerValue_apply + (F : CompleteDVF K) [Finite F.residueField] + {A : Type*} [AddCommGroup A] + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (c : A) + (z : CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F) : + fieldUnitDecompositionLogHomWithUniformizerValue F φ c z = + φ z.1.2 * Multiplicative.ofAdd (Multiplicative.toAdd z.2 • c) := + rfl + +/-- +Establishes the identity `fieldUnitDecompositionLogHomWithUniformizerValue F φ c ((ζ, 1), (1 : +Multiplicative ℤ)) = 1`. +-/ +theorem fieldUnitDecompositionLogHomWithUniformizerValue_root + (F : CompleteDVF K) [Finite F.residueField] + {A : Type*} [AddCommGroup A] + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (c : A) + (ζ : CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) : + fieldUnitDecompositionLogHomWithUniformizerValue F φ c + ((ζ, 1), (1 : Multiplicative ℤ)) = 1 := by + simp + +/-- +Establishes the identity `fieldUnitDecompositionLogHomWithUniformizerValue F φ c (((1 : +CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), u), (1 : Multiplicative ℤ)) = φ +u`. +-/ +theorem fieldUnitDecompositionLogHomWithUniformizerValue_principal + (F : CompleteDVF K) [Finite F.residueField] + {A : Type*} [AddCommGroup A] + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (c : A) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) : + fieldUnitDecompositionLogHomWithUniformizerValue F φ c + (((1 : CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), u), + (1 : Multiplicative ℤ)) = φ u := by + simp + +/-- +Establishes the identity `fieldUnitDecompositionLogHomWithUniformizerValue F φ c (((1 : +CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), (1 : +(CompleteDVF.higherPrincipalUnitGroup F) 1)), Multiplicative.ofAdd m) = Multiplicative.ofAdd (m • +c)`. +-/ +theorem fieldUnitDecompositionLogHomWithUniformizerValue_uniformizer + (F : CompleteDVF K) [Finite F.residueField] + {A : Type*} [AddCommGroup A] + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (c : A) + (m : ℤ) : + fieldUnitDecompositionLogHomWithUniformizerValue F φ c + (((1 : CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), + (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F) 1)), + Multiplicative.ofAdd m) = Multiplicative.ofAdd (m • c) := by + simp + +/-- Transport the corrected factor logarithm across a chosen the +uniformizer–residue–principal-unit decomposition +decomposition of the field-unit group. -/ +noncomputable def fieldUnitLogHomWithUniformizerValue + (F : CompleteDVF K) [Finite F.residueField] + {A : Type*} [AddCommGroup A] + (d : CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (c : A) : + Kˣ →* Multiplicative A := + (fieldUnitDecompositionLogHomWithUniformizerValue F φ c).comp + d.symm.toMonoidHom + +/-- +The defining evaluation formula for `fieldUnitLogHomWithUniformizerValue` is +`fieldUnitLogHomWithUniformizerValue F d φ c x = φ (d.symm x).1.2 * Multiplicative.ofAdd +(Multiplicative.toAdd (d.symm x).2 • c)`. +-/ +@[simp] theorem fieldUnitLogHomWithUniformizerValue_apply + (F : CompleteDVF K) [Finite F.residueField] + {A : Type*} [AddCommGroup A] + (d : CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (c : A) (x : Kˣ) : + fieldUnitLogHomWithUniformizerValue F d φ c x = + φ (d.symm x).1.2 * + Multiplicative.ofAdd (Multiplicative.toAdd (d.symm x).2 • c) := + rfl + +/-- +Establishes the identity `fieldUnitLogHomWithUniformizerValue F d φ c x = φ z.1.2 * +Multiplicative.ofAdd (Multiplicative.toAdd z.2 • c)`. +-/ +theorem fieldUnitLogHomWithUniformizerValue_apply_of_decomposition_eq + (F : CompleteDVF K) [Finite F.residueField] + {A : Type*} [AddCommGroup A] + (d : CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (c : A) + (z : CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F) + {x : Kˣ} (hx : d z = x) : + fieldUnitLogHomWithUniformizerValue F d φ c x = + φ z.1.2 * Multiplicative.ofAdd (Multiplicative.toAdd z.2 • c) := by + subst x + simp + +/-- Establishes the identity `fieldUnitLogHomWithUniformizerValue F d φ c x = φ u`. -/ +theorem fieldUnitLogHomWithUniformizerValue_eq_of_principal_decomposition + (F : CompleteDVF K) [Finite F.residueField] + {A : Type*} [AddCommGroup A] + (d : CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (c : A) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) {x + : Kˣ} + (hx : + d (((1 : CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), u), + (1 : Multiplicative ℤ)) = x) : + fieldUnitLogHomWithUniformizerValue F d φ c x = φ u := by + simpa using + fieldUnitLogHomWithUniformizerValue_apply_of_decomposition_eq + F d φ c + (((1 : CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), u), + (1 : Multiplicative ℤ)) hx + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF → + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF in +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply → + fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply in +/-- On first principal units, the corrected field logarithm agrees with the +given principal-unit logarithm, for the decomposition supplied by a chosen +uniformizer. -/ +theorem fieldUnitLogHomWithUniformizerValue_eq_of_completeDVF_principal + (F : CompleteDVF K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + {A : Type*} [AddCommGroup A] + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (c : A) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) : + fieldUnitLogHomWithUniformizerValue F + (fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ) φ c + (CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (u : F.valuationSubringˣ)) = φ u := by + apply fieldUnitLogHomWithUniformizerValue_eq_of_principal_decomposition + (F := F) + (d := + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ) + (φ := φ) (c := c) (u := u) + simp [fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply] + +/-- Continuity of the corrected logarithm on the three decomposition factors. +The uniformizer coordinate is discrete, while continuity on the principal-unit +coordinate is exactly the supplied continuity of `φ`. -/ +theorem continuous_fieldUnitDecompositionLogHomWithUniformizerValue + [TopologicalSpace K] (F : CompleteDVF K) [Finite F.residueField] + {A : Type*} [AddCommGroup A] [TopologicalSpace A] + [IsTopologicalAddGroup A] + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (c : A) + (hφ : Continuous φ) : + Continuous (fieldUnitDecompositionLogHomWithUniformizerValue F φ c) := by + have hprincipal : + Continuous + (fun z : + CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F => + φ z.1.2) := + hφ.comp (continuous_snd.comp continuous_fst) + have huniformizer : + Continuous + (fun z : + CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F => + Multiplicative.ofAdd (Multiplicative.toAdd z.2 • c)) := by + have hdisc : + Continuous + (fun m : Multiplicative ℤ => + Multiplicative.ofAdd (Multiplicative.toAdd m • c)) := + continuous_of_discreteTopology + exact hdisc.comp continuous_snd + exact hprincipal.mul huniformizer + +/-- Continuity after transporting the corrected factor logarithm across the +topological decomposition from the uniformizer–residue–principal-unit decomposition. -/ +theorem continuous_fieldUnitLogHomWithUniformizerValue + [TopologicalSpace K] (F : CompleteDVF K) [Finite F.residueField] + {A : Type*} [AddCommGroup A] [TopologicalSpace A] + [IsTopologicalAddGroup A] + (d : CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃ₜ* Kˣ) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (c : A) + (hφ : Continuous φ) : + Continuous (fieldUnitLogHomWithUniformizerValue F d.toMulEquiv φ c) := by + exact + (continuous_fieldUnitDecompositionLogHomWithUniformizerValue F φ c hφ).comp + d.symm.continuous + +/-- The uniformizer value forced by the requirement that a distinguished +field unit `a` have logarithm zero. The nonzero-exponent condition needed for +that conclusion is stated separately. -/ +noncomputable def uniformizerLogValueKilling + (F : CompleteDVF K) [Finite F.residueField] + (d : CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative K) (a : Kˣ) : K := + -(((Multiplicative.toAdd (d.symm a).2 : ℤ) : K)⁻¹ * + Multiplicative.toAdd (φ (d.symm a).1.2)) + +/-- With the forced uniformizer value, the distinguished field unit is sent +to zero (written as `1` in `Multiplicative K`) whenever its uniformizer +exponent is nonzero. -/ +theorem fieldUnitLogHomWithUniformizerValue_uniformizerLogValueKilling + (F : CompleteDVF K) [Finite F.residueField] [CharZero K] + (d : CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative K) (a : Kˣ) + (ha : Multiplicative.toAdd (d.symm a).2 ≠ 0) : + fieldUnitLogHomWithUniformizerValue F d φ + (uniformizerLogValueKilling F d φ a) a = 1 := by + apply Multiplicative.toAdd.injective + change + Multiplicative.toAdd (φ (d.symm a).1.2) + + Multiplicative.toAdd (d.symm a).2 • + uniformizerLogValueKilling F d φ a = 0 + rw [uniformizerLogValueKilling] + simp [zsmul_eq_mul, ha] + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogUniqueness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogUniqueness.lean new file mode 100644 index 0000000000..a902c7e59f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogUniqueness.lean @@ -0,0 +1,132 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition +/-! +# Uniqueness of logarithms on local-field units + +This module isolates the torsion and unit-decomposition argument used to prove +that an extension of the principal-unit logarithm is determined by its value +on a uniformizer. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +open ValuationTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +variable {K : Type u} [Field K] + +/-- In a complete discretely valued field with finite residue field, `q - 1` +is nonzero. -/ +theorem residueField_card_sub_one_ne_zero + (F : CompleteDVF K) [Finite F.residueField] : + Nat.card F.residueField - 1 ≠ 0 := by + classical + let := Fintype.ofFinite F.residueField + have hunitpos : 0 < Fintype.card F.residueFieldˣ := + Fintype.card_pos_iff.mpr ⟨1⟩ + have hpos : 0 < Nat.card F.residueField - 1 := by + simpa [Nat.card_eq_fintype_card, Fintype.card_units] using hunitpos + exact ne_of_gt hpos + +/-- A Teichmüller factor in the field-unit decomposition has order dividing +the residue-field cardinality minus one. -/ +theorem residueRootsOfUnity_fieldUnitHom_pow_card_sub_one_eq_one + (F : CompleteDVF K) [Finite F.residueField] + (ζ : CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) : + (CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (ζ : F.valuationSubringˣ)) ^ (Nat.card F.residueField - 1) = 1 := by + have hζ : + (ζ : F.valuationSubringˣ) ^ (Nat.card F.residueField - 1) = 1 := + ζ.property + let ι := + CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + calc + ι (ζ : F.valuationSubringˣ) ^ (Nat.card F.residueField - 1) = + ι ((ζ : F.valuationSubringˣ) ^ (Nat.card F.residueField - 1)) := + (ι.map_pow (ζ : F.valuationSubringˣ) + (Nat.card F.residueField - 1)).symm + _ = ι 1 := by rw [hζ] + _ = 1 := ι.map_one + +/-- Every homomorphism from field units to a torsion-free additive group kills +the Teichmüller factor in the field-unit decomposition. -/ +theorem monoidHom_toMultiplicative_residueRoot_eq_one + {A : Type*} [AddCommGroup A] [IsAddTorsionFree A] + (F : CompleteDVF K) [Finite F.residueField] + (φ : Kˣ →* Multiplicative A) + (ζ : CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) : + φ (CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (ζ : F.valuationSubringˣ)) = 1 := by + apply (pow_eq_one_iff_left + (M := Multiplicative A) + (a := φ + (CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (ζ : F.valuationSubringˣ))) + (residueField_card_sub_one_ne_zero (K := K) F)).1 + calc + φ (CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (ζ : F.valuationSubringˣ)) ^ (Nat.card F.residueField - 1) = + φ ((CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (ζ : F.valuationSubringˣ)) ^ (Nat.card F.residueField - 1)) := + (φ.map_pow _ _).symm + _ = φ 1 := by + rw [residueRootsOfUnity_fieldUnitHom_pow_card_sub_one_eq_one (K := K) F ζ] + _ = 1 := φ.map_one + +/-- A homomorphism on field units with torsion-free additive target is +determined by its values on principal units and on a chosen uniformizer. -/ +theorem monoidHom_toMultiplicative_ext_of_agree_principalUnits_and_uniformizer + {A : Type*} [AddCommGroup A] [IsAddTorsionFree A] + (F : CompleteDVF K) [Finite F.residueField] + (V : MultiplicativeIntegerValuation Kˣ) + (hzero : + ∀ y : Kˣ, y ∈ V.zeroSubgroup ↔ + ∃ u : F.valuationSubringˣ, + CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F u = y) + {ϖ : Kˣ} (hϖ : V.IsUniformizer ϖ) + (φ ψ : Kˣ →* Multiplicative A) + (hprincipal : + ∀ u : (CompleteDVF.higherPrincipalUnitGroup F) 1, + φ (CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (u : F.valuationSubringˣ)) = + ψ (CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (u : F.valuationSubringˣ))) + (huniformizer : φ ϖ = ψ ϖ) : + φ = ψ := by + ext x + rcases + CompleteDVF.higherPrincipalUnitGroup.exists_roots_principalUnit_uniformizer_zpow + (F := F) V hzero hϖ x with + ⟨ζ, p, m, hx⟩ + rw [hx] + have hζφ : + φ (CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (ζ : F.valuationSubringˣ)) = 1 := + monoidHom_toMultiplicative_residueRoot_eq_one (K := K) F φ ζ + have hζψ : + ψ (CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (ζ : F.valuationSubringˣ)) = 1 := + monoidHom_toMultiplicative_residueRoot_eq_one (K := K) F ψ ζ + have hϖm : φ (ϖ ^ m) = ψ (ϖ ^ m) := by + rw [map_zpow, map_zpow, huniformizer] + simp [hζφ, hζψ, hprincipal p, hϖm] + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpAdditivity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpAdditivity.lean new file mode 100644 index 0000000000..7dbe4b9885 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpAdditivity.lean @@ -0,0 +1,758 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Topology.Algebra.InfiniteSum.Nonarchimedean +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.Homomorphisms + +/-! # Log Exp Additivity -/ + +@[expose] public section +open Filter +open Polynomial +open scoped Topology +open scoped PowerSeries.WithPiTopology + +/-! +# Scaled logarithm additivity for local fields + +This file supplies the unconditional summability and regrouping step needed to +evaluate the formal identity +`log ((1 + X) * (1 + Y)) = log (1 + X) + log (1 + Y)` in a complete discretely +valued field whose normalized valuation restricts to `e * v_p` on the natural +numbers. +-/ + +noncomputable +section + +attribute [local instance] Classical.propDecidable + +universe u + +open ValuationTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +variable {K : Type u} [Field K] + +/-- The scaled field logarithm series, written as evaluation of the positive +coefficients of the formal series `log (1 + X)`. -/ +theorem hasSum_powerSeries_log_eval_logOnePlusSeriesField_ofWithZeroValuation_scaled + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum + (fun n : ℕ => + PowerSeries.coeff (n + 1) (PowerSeries.log K) * + x ^ (n + 1)) + (logOnePlusSeriesFieldOfWithZeroValuation v x hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hsum := + hasSum_signedLogSeriesTermField_logOnePlusSeriesField_ofWithZeroValuation_scaled_of_lt_one + (v := v) (p := p) e x hnK hnval hvx hcomplete + exact hsum.congr_fun fun n => + powerSeries_log_coeff_mul_pow_eq_signedLogSeriesTermField + (K := K) x hnK n + +/-- The scaled one-variable formal logarithm evaluation, including its zero +constant coefficient. -/ +theorem hasSum_powerSeries_log_eval_nat_logOnePlusSeriesField_ofWithZeroValuation_scaled + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum + (fun n : ℕ => + PowerSeries.coeff n (PowerSeries.log K) * x ^ n) + (logOnePlusSeriesFieldOfWithZeroValuation v x hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let f : ℕ → K := fun n => + PowerSeries.coeff n (PowerSeries.log K) * x ^ n + have htail : + HasSum (fun n : ℕ => f (n + 1)) + (logOnePlusSeriesFieldOfWithZeroValuation v x hnK) := by + simpa only [f] using + hasSum_powerSeries_log_eval_logOnePlusSeriesField_ofWithZeroValuation_scaled + (v := v) (p := p) e x hnK hnval hvx hcomplete + have hfull := + (hasSum_nat_add_iff + (f := f) + (g := logOnePlusSeriesFieldOfWithZeroValuation v x hnK) 1).1 htail + simpa [f, PowerSeries.coeff_log] using hfull + +/-- Scaled evaluation of the left-axis series in the two-variable formal +product formula. -/ +theorem hasSum_formalLogOnePlusLeftVariableLogSubst_monomialValue_pair_ofWithZeroValuation_scaled + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x y : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum + (fun d : Fin 2 →₀ ℕ => + MvPowerSeries.coeff d (formalLogOnePlusLeftVariableLogSubst K) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d) + (logOnePlusSeriesFieldOfWithZeroValuation v x hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let term : (Fin 2 →₀ ℕ) → K := fun d => + MvPowerSeries.coeff d (formalLogOnePlusLeftVariableLogSubst K) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d + let axis : ℕ → (Fin 2 →₀ ℕ) := fun n => Finsupp.single (0 : Fin 2) n + have haxis_inj : Function.Injective axis := by + intro m n h + have hcoord := congrArg (fun d : Fin 2 →₀ ℕ => d (0 : Fin 2)) h + simpa [axis] using hcoord + have haxis : + HasSum (term ∘ axis) + (logOnePlusSeriesFieldOfWithZeroValuation v x hnK) := by + refine + (hasSum_powerSeries_log_eval_nat_logOnePlusSeriesField_ofWithZeroValuation_scaled + (v := v) (p := p) e x hnK hnval hvx hcomplete).congr_fun ?_ + intro n + simp [term, axis, formalLogOnePlusLeftVariableLogSubst_coeff_single, + mvPowerSeriesMonomialValue] + have hout : ∀ d, d ∉ Set.range axis → term d = 0 := by + intro d hd + have hne : ∀ n : ℕ, d ≠ Finsupp.single (0 : Fin 2) n := by + intro n h + exact hd ⟨n, by simpa [axis] using h.symm⟩ + simp [term, formalLogOnePlusLeftVariableLogSubst_coeff_of_ne_axis K d hne] + exact (haxis_inj.hasSum_iff (f := term) hout).1 haxis + +/-- Scaled evaluation of the right-axis series in the two-variable formal +product formula. -/ +theorem hasSum_formalLogOnePlusRightVariableLogSubst_monomialValue_pair_ofWithZeroValuation_scaled + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x y : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hvy : v y < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum + (fun d : Fin 2 →₀ ℕ => + MvPowerSeries.coeff d (formalLogOnePlusRightVariableLogSubst K) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d) + (logOnePlusSeriesFieldOfWithZeroValuation v y hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let term : (Fin 2 →₀ ℕ) → K := fun d => + MvPowerSeries.coeff d (formalLogOnePlusRightVariableLogSubst K) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d + let axis : ℕ → (Fin 2 →₀ ℕ) := fun n => Finsupp.single (1 : Fin 2) n + have haxis_inj : Function.Injective axis := by + intro m n h + have hcoord := congrArg (fun d : Fin 2 →₀ ℕ => d (1 : Fin 2)) h + simpa [axis] using hcoord + have haxis : + HasSum (term ∘ axis) + (logOnePlusSeriesFieldOfWithZeroValuation v y hnK) := by + refine + (hasSum_powerSeries_log_eval_nat_logOnePlusSeriesField_ofWithZeroValuation_scaled + (v := v) (p := p) e y hnK hnval hvy hcomplete).congr_fun ?_ + intro n + simp [term, axis, formalLogOnePlusRightVariableLogSubst_coeff_single, + mvPowerSeriesMonomialValue] + have hout : ∀ d, d ∉ Set.range axis → term d = 0 := by + intro d hd + have hne : ∀ n : ℕ, d ≠ Finsupp.single (1 : Fin 2) n := by + intro n h + exact hd ⟨n, by simpa [axis] using h.symm⟩ + simp [term, formalLogOnePlusRightVariableLogSubst_coeff_of_ne_axis K d hne] + exact (haxis_inj.hasSum_iff (f := term) hout).1 haxis + +/-- Scaled evaluation of the formal product formula's right-hand side. -/ +theorem hasSum_formalLogOnePlusProductRightSide_monomialValue_pair_ofWithZeroValuation_scaled + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x y : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hvy : v y < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum + (fun d : Fin 2 →₀ ℕ => + MvPowerSeries.coeff d (formalLogOnePlusProductRightSide K) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d) + (logOnePlusSeriesFieldOfWithZeroValuation v x hnK + + logOnePlusSeriesFieldOfWithZeroValuation v y hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hleft := + hasSum_formalLogOnePlusLeftVariableLogSubst_monomialValue_pair_ofWithZeroValuation_scaled + (v := v) (p := p) e x y hnK hnval hvx hcomplete + have hright := + hasSum_formalLogOnePlusRightVariableLogSubst_monomialValue_pair_ofWithZeroValuation_scaled + (v := v) (p := p) e x y hnK hnval hvy hcomplete + refine (hleft.add hright).congr_fun ?_ + intro d + rw [formalLogOnePlusProductRightSide_coeff] + ring + +/-- Natural-number coefficients have valuation at most one under a scaled +`p`-adic denominator formula. -/ +theorem valuation_natCast_le_one_ofWithZeroValuation_scaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} (e : ℕ) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (m : ℕ) : + v (m : K) ≤ 1 := by + cases m with + | zero => simp + | succ n => + rw [hnval n] + calc + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ))) ≤ + WithZero.exp (0 : ℤ) := + WithZero.exp_le_exp.mpr (by + apply neg_nonpos.mpr + exact mul_nonneg (Int.natCast_nonneg e) + (Int.natCast_nonneg (padicValNat p (n + 1)))) + _ = 1 := WithZero.exp_zero + +/-- Evaluation of a two-variable monomial at `(x,y)`. -/ +theorem mvPowerSeriesMonomialValue_pair + (x y : K) (d : Fin 2 →₀ ℕ) : + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d = + x ^ d 0 * y ^ d 1 := by + rw [mvPowerSeriesMonomialValue, Finsupp.prod_fintype] + · rw [Fin.prod_univ_two] + simp + · intro i + simp + +/-- If the `d`-coefficient of `(X + Y + XY)^q` is nonzero, then its total +degree is at least `q`. -/ +theorem formalLogOnePlusProductArgument_pow_coeff_ne_zero_q_le_coord_sum + (q : ℕ) (d : Fin 2 →₀ ℕ) + (hcoeff : + MvPowerSeries.coeff d + ((formalLogOnePlusProductArgument K) ^ q) ≠ 0) : + q ≤ d 0 + d 1 := by + rw [formalLogOnePlusProductArgument_pow_coeff_eq_card_choices] at hcoeff + have hcard : + (formalLogOnePlusProductArgumentBasicFactorChoices q d).card ≠ 0 := by + intro hzero + apply hcoeff + simp [hzero] + exact + (formalLogOnePlusProductArgumentBasicFactorChoices_nonempty_q_range + (Finset.card_ne_zero.mp hcard)).2.2 + +/-- A monomial occurring in `(X + Y + XY)^q`, evaluated in the open unit ball, +is no larger than the larger of the two pure degree-`q` monomials. -/ +theorem valuation_mvPowerSeriesMonomialValue_pair_le_max_pow + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {x y : K} + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hvy : v y < (1 : WithZero (Multiplicative ℤ))) + (q : ℕ) (d : Fin 2 →₀ ℕ) (hq : q ≤ d 0 + d 1) : + v (mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d) ≤ + max (v x ^ q) (v y ^ q) := by + rw [mvPowerSeriesMonomialValue_pair, v.map_mul, v.map_pow, v.map_pow] + let r := max (v x) (v y) + have hxr : v x ≤ r := le_max_left _ _ + have hyr : v y ≤ r := le_max_right _ _ + have hr : r ≤ 1 := max_le (le_of_lt hvx) (le_of_lt hvy) + have hprod : v x ^ d 0 * v y ^ d 1 ≤ r ^ (d 0 + d 1) := by + calc + v x ^ d 0 * v y ^ d 1 ≤ r ^ d 0 * r ^ d 1 := + mul_le_mul (pow_le_pow_left' hxr _) (pow_le_pow_left' hyr _) + (by simp) (by simp) + _ = r ^ (d 0 + d 1) := by rw [pow_add] + have hpow : r ^ (d 0 + d 1) ≤ r ^ q := + pow_le_pow_of_le_one (by exact bot_le) hr hq + calc + v x ^ d 0 * v y ^ d 1 ≤ r ^ (d 0 + d 1) := hprod + _ ≤ r ^ q := hpow + _ = max (v x ^ q) (v y ^ q) := by + by_cases hxy : v x ≤ v y + · simp [r, max_eq_right hxy, pow_le_pow_left' hxy] + · have hyx : v y ≤ v x := le_of_not_ge hxy + simp [r, max_eq_left hyx, pow_le_pow_left' hyx] + +/-- Each nonzero term in the substituted logarithm Sigma-family is bounded by +the larger of the corresponding one-variable logarithm terms. -/ +theorem valuation_formalLogOnePlusProductArgument_sigmaTerm_le_max + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} (e : ℕ) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + {x y : K} + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hvy : v y < (1 : WithZero (Multiplicative ℤ))) + (q : ℕ) (d : Fin 2 →₀ ℕ) : + v (PowerSeries.coeff q (PowerSeries.log K) * + MvPowerSeries.coeff d + ((formalLogOnePlusProductArgument K) ^ q) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d) ≤ + max + (v (PowerSeries.coeff q (PowerSeries.log K) * x ^ q)) + (v (PowerSeries.coeff q (PowerSeries.log K) * y ^ q)) := by + by_cases hc : + MvPowerSeries.coeff d + ((formalLogOnePlusProductArgument K) ^ q) = 0 + · simp [hc] + · have hq : q ≤ d 0 + d 1 := + formalLogOnePlusProductArgument_pow_coeff_ne_zero_q_le_coord_sum q d hc + have hcoeff : + v (MvPowerSeries.coeff d + ((formalLogOnePlusProductArgument K) ^ q)) ≤ 1 := by + rw [formalLogOnePlusProductArgument_pow_coeff_eq_card_choices] + exact valuation_natCast_le_one_ofWithZeroValuation_scaled v e hnval _ + have hmono := + valuation_mvPowerSeriesMonomialValue_pair_le_max_pow + v hvx hvy q d hq + rw [v.map_mul, v.map_mul, v.map_mul, v.map_mul, v.map_pow, v.map_pow] + calc + v (PowerSeries.coeff q (PowerSeries.log K)) * + v (MvPowerSeries.coeff d + ((formalLogOnePlusProductArgument K) ^ q)) * + v (mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d) ≤ + v (PowerSeries.coeff q (PowerSeries.log K)) * 1 * + max (v x ^ q) (v y ^ q) := by gcongr + _ = max + (v (PowerSeries.coeff q (PowerSeries.log K)) * v x ^ q) + (v (PowerSeries.coeff q (PowerSeries.log K)) * v y ^ q) := by + simp [mul_max] + +/-- The full Sigma-family obtained by expanding every power of +`X + Y + XY` in the scaled logarithm substitution is unconditionally +summable. No rearrangement hypothesis is exposed: nonzero terms in each +fixed outer degree have finite polynomial support, while their values are +bounded by the convergent one-variable logarithm terms. -/ +theorem + summable_formalLogOnePlusProductArgument_logDegree_monomialValue_pair_ofWithZeroValuation_scaled + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x y : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hvy : v y < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Summable + (fun qd : Sigma fun _ : ℕ => Fin 2 →₀ ℕ => + PowerSeries.coeff qd.1 (PowerSeries.log K) * + MvPowerSeries.coeff qd.2 + ((formalLogOnePlusProductArgument K) ^ qd.1) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) qd.2) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let : CompleteSpace K := hcomplete + have : NonarchimedeanRing K := nonarchimedeanRing_ofWithZeroValuation v + let term : (Sigma fun _ : ℕ => Fin 2 →₀ ℕ) → K := fun qd => + PowerSeries.coeff qd.1 (PowerSeries.log K) * + MvPowerSeries.coeff qd.2 + ((formalLogOnePlusProductArgument K) ^ qd.1) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) qd.2 + change Summable term + rw [NonarchimedeanAddGroup.summable_iff_tendsto_cofinite_zero] + rw [tendsto_def] + intro s hs + have hrepr := Valued.mem_nhds_zero.mp hs + let γ := Classical.choose hrepr + have hγ := Classical.choose_spec hrepr + have hball : + {z : K | + v z < MonoidWithZeroHom.ValueGroup₀.embedding γ.1} ∈ nhds (0 : K) := by + apply Valued.mem_nhds_zero.mpr + exact ⟨γ, by + intro z hz + change Valued.v.restrict z < γ.1 at hz + rw [Valuation.restrict_lt_iff_lt_embedding] at hz + exact hz⟩ + have hxsum := + hasSum_powerSeries_log_eval_nat_logOnePlusSeriesField_ofWithZeroValuation_scaled + (v := v) (p := p) e x hnK hnval hvx hcomplete + have hysum := + hasSum_powerSeries_log_eval_nat_logOnePlusSeriesField_ofWithZeroValuation_scaled + (v := v) (p := p) e y hnK hnval hvy hcomplete + have hxzero : + Tendsto + (fun q : ℕ => + PowerSeries.coeff q (PowerSeries.log K) * x ^ q) + atTop (nhds (0 : K)) := by + have h := hxsum.summable.tendsto_cofinite_zero + simpa [Nat.cofinite_eq_atTop] using h + have hyzero : + Tendsto + (fun q : ℕ => + PowerSeries.coeff q (PowerSeries.log K) * y ^ q) + atTop (nhds (0 : K)) := by + have h := hysum.summable.tendsto_cofinite_zero + simpa [Nat.cofinite_eq_atTop] using h + have hevent : ∀ᶠ q : ℕ in atTop, + v (PowerSeries.coeff q (PowerSeries.log K) * x ^ q) < + MonoidWithZeroHom.ValueGroup₀.embedding γ.1 ∧ + v (PowerSeries.coeff q (PowerSeries.log K) * y ^ q) < + MonoidWithZeroHom.ValueGroup₀.embedding γ.1 := + (hxzero.eventually hball).and (hyzero.eventually hball) + have hexN := Filter.eventually_atTop.mp hevent + let N := Classical.choose hexN + have hN := Classical.choose_spec hexN + let P : MvPolynomial (Fin 2) K := + formalLogOnePlusProductArgumentPolynomial K + let E : Finset (Sigma fun _ : ℕ => Fin 2 →₀ ℕ) := + (Finset.range N).sigma fun q => (P ^ q).support + apply Filter.mem_cofinite.mpr + apply E.finite_toSet.subset + intro qd hbad + by_contra hnotE + have hgood : term qd ∈ s := by + by_cases hqsmall : qd.1 < N + · have hdnot : qd.2 ∉ (P ^ qd.1).support := by + intro hd + apply hnotE + exact Finset.mem_sigma.mpr ⟨Finset.mem_range.mpr hqsmall, hd⟩ + have hpoly : (P ^ qd.1).coeff qd.2 = 0 := by + by_contra hp + exact hdnot (MvPolynomial.mem_support_iff.mpr hp) + have hcoeff : + MvPowerSeries.coeff qd.2 + ((formalLogOnePlusProductArgument K) ^ qd.1) = 0 := by + rw [formalLogOnePlusProductArgument_eq_coe_polynomial, + ← MvPolynomial.coe_pow, MvPolynomial.coeff_coe] + exact hpoly + have htermzero : term qd = 0 := by simp [term, hcoeff] + rw [htermzero] + exact mem_of_mem_nhds hs + · have hqN : N ≤ qd.1 := Nat.le_of_not_gt hqsmall + have hcomp := hN qd.1 hqN + apply hγ + change Valued.v.restrict (term qd) < γ.1 + rw [Valuation.restrict_lt_iff_lt_embedding] + have hbound := + valuation_formalLogOnePlusProductArgument_sigmaTerm_le_max + (v := v) (p := p) e hnval hvx hvy qd.1 qd.2 + exact lt_of_le_of_lt hbound (max_lt hcomp.1 hcomp.2) + exact hbad hgood + +/-- The expanded product-argument Sigma-family has sum equal to the scaled +logarithm of `x + y + xy`. -/ +theorem + hasSum_logProduct_logDegree_monomialValue_pair_sigma_scaled + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x y : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hvy : v y < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum + (fun qd : Sigma fun _ : ℕ => Fin 2 →₀ ℕ => + PowerSeries.coeff qd.1 (PowerSeries.log K) * + MvPowerSeries.coeff qd.2 + ((formalLogOnePlusProductArgument K) ^ qd.1) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) qd.2) + (logOnePlusSeriesFieldOfWithZeroValuation v (x + y + x * y) hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have harg : + v (x + y + x * y) < (1 : WithZero (Multiplicative ℤ)) := + valuation_log_mul_argument_lt_one_of_lt_one v hvx hvy + have houter : + HasSum + (fun q : ℕ => + PowerSeries.coeff q (PowerSeries.log K) * + (x + y + x * y) ^ q) + (logOnePlusSeriesFieldOfWithZeroValuation v + (x + y + x * y) hnK) := + hasSum_powerSeries_log_eval_nat_logOnePlusSeriesField_ofWithZeroValuation_scaled + (v := v) (p := p) e (x + y + x * y) hnK hnval harg hcomplete + have hinner : + ∀ q : ℕ, + HasSum + (fun d : Fin 2 →₀ ℕ => + PowerSeries.coeff q (PowerSeries.log K) * + MvPowerSeries.coeff d + ((formalLogOnePlusProductArgument K) ^ q) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d) + (PowerSeries.coeff q (PowerSeries.log K) * + (x + y + x * y) ^ q) := by + intro q + exact + hasSum_formalLogOnePlusProductArgument_pow_monomialValue_pair_mul_left + K (PowerSeries.coeff q (PowerSeries.log K)) x y q + have hsigma := + summable_formalLogOnePlusProductArgument_logDegree_monomialValue_pair_ofWithZeroValuation_scaled + (v := v) (p := p) e x y hnK hnval hvx hvy hcomplete + exact HasSum.sigma_of_hasSum houter hinner hsigma + +/-- Regrouping the scaled Sigma-family by monomial exponent evaluates the +substituted formal logarithm itself. The inner sum is finite for every fixed +monomial, by the degree bound in power-series substitution. -/ +theorem + hasSum_formalLogOnePlusProductArgument_logSubst_monomialValue_pair_ofWithZeroValuation_scaled + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x y : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hvy : v y < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum + (fun d : Fin 2 →₀ ℕ => + MvPowerSeries.coeff d + (PowerSeries.subst (formalLogOnePlusProductArgument K) (PowerSeries.log K)) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d) + (logOnePlusSeriesFieldOfWithZeroValuation v (x + y + x * y) hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let sigmaTerm : (Sigma fun _ : ℕ => Fin 2 →₀ ℕ) → K := fun qd => + PowerSeries.coeff qd.1 (PowerSeries.log K) * + MvPowerSeries.coeff qd.2 + ((formalLogOnePlusProductArgument K) ^ qd.1) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) qd.2 + have hsigma : + HasSum sigmaTerm + (logOnePlusSeriesFieldOfWithZeroValuation v + (x + y + x * y) hnK) := by + simpa [sigmaTerm] using + hasSum_logProduct_logDegree_monomialValue_pair_sigma_scaled + (v := v) (p := p) e x y hnK hnval hvx hvy hcomplete + let swap : + (Sigma fun _ : (Fin 2 →₀ ℕ) => ℕ) ≃ + (Sigma fun _ : ℕ => Fin 2 →₀ ℕ) := + { toFun := fun dq => ⟨dq.2, dq.1⟩ + invFun := fun qd => ⟨qd.2, qd.1⟩ + left_inv := by intro dq; cases dq; rfl + right_inv := by intro qd; cases qd; rfl } + have hswapped : + HasSum (sigmaTerm ∘ swap) + (logOnePlusSeriesFieldOfWithZeroValuation v + (x + y + x * y) hnK) := + (swap.hasSum_iff).2 hsigma + have hfiber : + ∀ d : Fin 2 →₀ ℕ, + HasSum + (fun q : ℕ => (sigmaTerm ∘ swap) ⟨d, q⟩) + (MvPowerSeries.coeff d + (PowerSeries.subst (formalLogOnePlusProductArgument K) (PowerSeries.log K)) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d) := by + intro d + let monomial := + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d + let fiberTerm : ℕ → K := fun q => + PowerSeries.coeff q (PowerSeries.log K) * + MvPowerSeries.coeff d + ((formalLogOnePlusProductArgument K) ^ q) * monomial + have hfinite : + HasSum fiberTerm + (∑ q ∈ Finset.range (Finsupp.degree d + 1), fiberTerm q) := by + apply hasSum_sum_of_ne_finset_zero + intro q hq + have hqge : Finsupp.degree d + 1 ≤ q := by + simpa only [Finset.mem_range, not_lt] using hq + have hdegree : Finsupp.degree d < q := Nat.lt_of_succ_le hqge + have hzero := + formalLogOnePlusProductArgument_pow_coeff_eq_zero_of_degree_lt + K q d hdegree + simp [fiberTerm, hzero] + have hsum : + (∑ q ∈ Finset.range (Finsupp.degree d + 1), fiberTerm q) = + MvPowerSeries.coeff d + (PowerSeries.subst (formalLogOnePlusProductArgument K) + (PowerSeries.log K)) * + monomial := by + rw [formalLogOnePlusProductArgument_logSubst_coeff_eq_sum_range_degree_succ] + simp only [smul_eq_mul, fiberTerm] + rw [Finset.sum_mul] + rw [hsum] at hfinite + simpa [fiberTerm, monomial, sigmaTerm, swap, Function.comp_def] using hfinite + exact hswapped.sigma hfiber + +/-- Scaled field-level logarithm additivity on the open unit ball, obtained by +evaluating the formal product identity after the unconditional regrouping +above. -/ +theorem logOnePlusSeriesField_mul_argument_eq_add_ofWithZeroValuation_scaled + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x y : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hvy : v y < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + logOnePlusSeriesFieldOfWithZeroValuation v (x + y + x * y) hnK = + logOnePlusSeriesFieldOfWithZeroValuation v x hnK + + logOnePlusSeriesFieldOfWithZeroValuation v y hnK := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hleft := + hasSum_formalLogOnePlusProductArgument_logSubst_monomialValue_pair_ofWithZeroValuation_scaled + (v := v) (p := p) e x y hnK hnval hvx hvy hcomplete + have hright := + hasSum_formalLogOnePlusProductRightSide_monomialValue_pair_ofWithZeroValuation_scaled + (v := v) (p := p) e x y hnK hnval hvx hvy hcomplete + exact formalLogOnePlusProductFormula_hasSum_monomialValue_eq + (A := K) hleft hright + +/-- Scaled logarithm-series additivity on first principal units. Unlike the +earlier endpoint reduction, this theorem has no defect-convergence hypothesis. -/ +theorem principalUnitLogSeries_mul_eq_add_ofWithZeroValuation_scaled + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e : ℕ) + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + principalUnitLogSeriesOfWithZeroValuation v (u * w) hnK = + principalUnitLogSeriesOfWithZeroValuation v u hnK + + principalUnitLogSeriesOfWithZeroValuation v w hnK := by + let x := principalUnitSubOneOfWithZeroValuation v u + let y := principalUnitSubOneOfWithZeroValuation v w + have hvx : v x < (1 : WithZero (Multiplicative ℤ)) := by + simpa [x] using principalUnitSubOne_val_lt_one_ofWithZeroValuation v u + have hvy : v y < (1 : WithZero (Multiplicative ℤ)) := by + simpa [y] using principalUnitSubOne_val_lt_one_ofWithZeroValuation v w + have hadd := + logOnePlusSeriesField_mul_argument_eq_add_ofWithZeroValuation_scaled + (v := v) (p := p) e x y hnK hnval hvx hvy hcomplete + rw [principalUnitLogSeries_mul_argument_ofWithZeroValuation] + simpa [principalUnitLogSeriesOfWithZeroValuation, x, y] using hadd + +/-- The scaled logarithm series as a genuine homomorphism on first principal +units, with no supplied additivity or defect theorem. -/ +noncomputable def principalUnitLogSeriesHomOfWithZeroValuationScaled + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e : ℕ) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1 →* + Multiplicative K where + toFun u := Multiplicative.ofAdd + (principalUnitLogSeriesOfWithZeroValuation v u hnK) + map_one' := by simp + map_mul' u w := by + change + Multiplicative.ofAdd + (principalUnitLogSeriesOfWithZeroValuation v (u * w) hnK) = + Multiplicative.ofAdd + (principalUnitLogSeriesOfWithZeroValuation v u hnK + + principalUnitLogSeriesOfWithZeroValuation v w hnK) + rw [principalUnitLogSeries_mul_eq_add_ofWithZeroValuation_scaled + (v := v) (p := p) e u w hnK hnval hcomplete] + +/-- +Establishes the identity `Multiplicative.toAdd (principalUnitLogSeriesHomOfWithZeroValuationScaled +(v := v) (p := p) e hnK hnval hcomplete u) = principalUnitLogSeriesOfWithZeroValuation v u hnK`. +-/ +@[simp] theorem principalUnitLogSeriesHomOfWithZeroValuationScaled_apply_toAdd + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e : ℕ) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) : + Multiplicative.toAdd + (principalUnitLogSeriesHomOfWithZeroValuationScaled + (v := v) (p := p) e hnK hnval hcomplete u) = + principalUnitLogSeriesOfWithZeroValuation v u hnK := by + rfl + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpComposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpComposition.lean new file mode 100644 index 0000000000..4512696a17 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpComposition.lean @@ -0,0 +1,790 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Topology.Algebra.InfiniteSum.Nonarchimedean +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpAdditivity + +/-! # Log Exp Composition -/ + +@[expose] public section +open Filter +open Polynomial +open scoped Topology +open scoped PowerSeries.WithPiTopology + +/-! +# Exact logarithm--exponential compositions + +This file evaluates the two formal composition identities used in +the deep exponential–logarithm equivalence, on the sharp ramified +convergence ball. The source lemmas below justify the Cauchy products and +the unconditional regrouping involved in power-series substitution. +-/ + +noncomputable +section + +attribute [local instance] Classical.propDecidable + +universe u + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +variable {K : Type u} [Field K] + +/-- A convergent one-variable power series may be raised to a natural power +by taking its nonarchimedean Cauchy product. -/ +theorem hasSum_powerSeries_pow_coeff_mul_pow + [UniformSpace K] [IsUniformAddGroup K] [T3Space K] + [NonarchimedeanRing K] + (g : PowerSeries K) (x y : K) + (hgy : HasSum (fun d : ℕ => PowerSeries.coeff d g * x ^ d) y) + (q : ℕ) : + HasSum (fun d : ℕ => PowerSeries.coeff d (g ^ q) * x ^ d) (y ^ q) := by + induction q with + | zero => + have hsingle : + HasSum (fun d : ℕ => if d = 0 then (1 : K) else 0) 1 := by + apply hasSum_single 0 + intro d hd + simp [hd] + have hsingle' : + HasSum (fun d : ℕ => PowerSeries.coeff d (1 : PowerSeries K) * x ^ d) 1 := + hsingle.congr_fun fun d => by + by_cases hd : d = 0 + · subst d + simp + · simp [PowerSeries.coeff_one, hd] + simpa only [pow_zero] using hsingle' + | succ q ih => + have hprod := ih.mul_of_nonarchimedean hgy + have hsigma : + HasSum + (fun nd : Sigma fun d : ℕ => ↑(Finset.antidiagonal d) => + (PowerSeries.coeff nd.2.1.1 (g ^ q) * x ^ nd.2.1.1) * + (PowerSeries.coeff nd.2.1.2 g * x ^ nd.2.1.2)) + (y ^ q * y) := by + simpa [Function.comp_def] using + (Finset.HasAntidiagonal.sigmaAntidiagonalEquivProd.hasSum_iff).2 hprod + have hsumCauchy : + HasSum + (fun d : ℕ => + ∑ ij : ↑(Finset.antidiagonal d), + (PowerSeries.coeff ij.1.1 (g ^ q) * x ^ ij.1.1) * + (PowerSeries.coeff ij.1.2 g * x ^ ij.1.2)) + (y ^ q * y) := + hsigma.sigma fun d => hasSum_fintype _ + rw [show g ^ (q + 1) = g ^ q * g by rw [pow_succ], + show y ^ (q + 1) = y ^ q * y by rw [pow_succ]] + refine hsumCauchy.congr_fun ?_ + intro d + rw [PowerSeries.coeff_mul, Finset.sum_mul] + rw [← Finset.sum_attach, Finset.attach_eq_univ] + apply Finset.sum_congr rfl + intro ij _ + have hijsum : ij.1.1 + ij.1.2 = d := + Finset.mem_antidiagonal.mp ij.2 + have hpow : x ^ d = x ^ ij.1.1 * x ^ ij.1.2 := by + calc + x ^ d = x ^ (ij.1.1 + ij.1.2) := + congrArg (fun n : ℕ => x ^ n) hijsum.symm + _ = x ^ ij.1.1 * x ^ ij.1.2 := pow_add _ _ _ + rw [hpow] + ring + +/-- If every evaluated coefficient of a series is at most `r`, then every +evaluated coefficient of its `q`-th power is at most `r^q`. -/ +theorem valuation_powerSeries_pow_coeff_mul_pow_le + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + (g : PowerSeries K) (x : K) (r : WithZero (Multiplicative ℤ)) + (hcoeff : ∀ d : ℕ, v (PowerSeries.coeff d g * x ^ d) ≤ r) + (q d : ℕ) : + v (PowerSeries.coeff d (g ^ q) * x ^ d) ≤ r ^ q := by + induction q generalizing d with + | zero => + by_cases hd : d = 0 + · subst d + simp + · simp [PowerSeries.coeff_one, hd] + | succ q ih => + rw [pow_succ, PowerSeries.coeff_mul, Finset.sum_mul] + apply v.map_sum_le + intro ij hij + have hijsum : ij.1 + ij.2 = d := Finset.mem_antidiagonal.mp hij + have heq : + (PowerSeries.coeff ij.1 (g ^ q) * PowerSeries.coeff ij.2 g) * x ^ d = + (PowerSeries.coeff ij.1 (g ^ q) * x ^ ij.1) * + (PowerSeries.coeff ij.2 g * x ^ ij.2) := by + rw [← hijsum, pow_add] + ring + rw [heq, v.map_mul, pow_succ] + exact mul_le_mul (ih ij.1) (hcoeff ij.2) (by simp) (by simp) + +/-- The valuation of a term in the expanded substitution is bounded by the +corresponding outer-series term. -/ +theorem valuation_powerSeries_subst_sigmaTerm_le_outerTerm + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + (f g : PowerSeries K) (x : K) + (hcoeff : ∀ d : ℕ, + v (PowerSeries.coeff d g * x ^ d) ≤ v x) + (q d : ℕ) : + v (PowerSeries.coeff q f * PowerSeries.coeff d (g ^ q) * x ^ d) ≤ + v (PowerSeries.coeff q f * x ^ q) := by + have hpow := + valuation_powerSeries_pow_coeff_mul_pow_le + v g x (v x) hcoeff q d + calc + v (PowerSeries.coeff q f * PowerSeries.coeff d (g ^ q) * x ^ d) = + v (PowerSeries.coeff q f) * + v (PowerSeries.coeff d (g ^ q) * x ^ d) := by + rw [mul_assoc, v.map_mul] + _ ≤ v (PowerSeries.coeff q f) * (v x) ^ q := + by gcongr + _ = v (PowerSeries.coeff q f * x ^ q) := by + rw [v.map_mul, v.map_pow] + +/-- The doubly indexed family expanding `f(g(X))` is unconditionally +summable. Large outer degrees are controlled uniformly by the convergent +evaluation of `f` at `x`; the finitely many remaining outer degrees are +controlled by the convergent Cauchy powers of `g`. -/ +theorem summable_powerSeries_subst_sigma_of_outer_summable + [Valued K (WithZero (Multiplicative ℤ))] [CompleteSpace K] + [NonarchimedeanRing K] + (f g : PowerSeries K) (x y : K) + (hgy : HasSum (fun d : ℕ => PowerSeries.coeff d g * x ^ d) y) + (houter : Summable (fun q : ℕ => PowerSeries.coeff q f * x ^ q)) + (hcoeff : ∀ d : ℕ, + Valued.v (PowerSeries.coeff d g * x ^ d) ≤ Valued.v x) : + Summable + (fun qd : Sigma fun _ : ℕ => ℕ => + PowerSeries.coeff qd.1 f * + PowerSeries.coeff qd.2 (g ^ qd.1) * x ^ qd.2) := by + let term : (Sigma fun _ : ℕ => ℕ) → K := fun qd => + PowerSeries.coeff qd.1 f * + PowerSeries.coeff qd.2 (g ^ qd.1) * x ^ qd.2 + let outerTerm : ℕ → K := fun q => PowerSeries.coeff q f * x ^ q + change Summable term + rw [NonarchimedeanAddGroup.summable_iff_tendsto_cofinite_zero] + rw [tendsto_def] + intro s hs + have hrepr := Valued.mem_nhds_zero.mp hs + let γ := Classical.choose hrepr + have hγ := Classical.choose_spec hrepr + have hball : + {z : K | + Valued.v z < MonoidWithZeroHom.ValueGroup₀.embedding γ.1} ∈ nhds (0 : K) := by + apply Valued.mem_nhds_zero.mpr + exact ⟨γ, by + intro z hz + change Valued.v.restrict z < γ.1 at hz + rw [Valuation.restrict_lt_iff_lt_embedding] at hz + exact hz⟩ + have houterZero : Tendsto outerTerm cofinite (nhds (0 : K)) := by + simpa [outerTerm] using houter.tendsto_cofinite_zero + have houterEventually : + ∀ᶠ q : ℕ in cofinite, + Valued.v (outerTerm q) < + MonoidWithZeroHom.ValueGroup₀.embedding γ.1 := + houterZero.eventually hball + let goodOuter : Set ℕ := + {q | Valued.v (outerTerm q) < + MonoidWithZeroHom.ValueGroup₀.embedding γ.1} + have hgoodOuter : goodOuter ∈ cofinite := by + change {q : ℕ | + Valued.v (outerTerm q) < + MonoidWithZeroHom.ValueGroup₀.embedding γ.1} ∈ cofinite + exact houterEventually + have hbadOuterFinite : goodOuterᶜ.Finite := + Filter.mem_cofinite.mp hgoodOuter + let Q : Finset ℕ := hbadOuterFinite.toFinset + have hpower : ∀ q : ℕ, + HasSum + (fun d : ℕ => PowerSeries.coeff d (g ^ q) * x ^ d) + (y ^ q) := + fun q => hasSum_powerSeries_pow_coeff_mul_pow g x y hgy q + have hfiber : ∀ q : ℕ, + HasSum (fun d : ℕ => term ⟨q, d⟩) + (PowerSeries.coeff q f * y ^ q) := by + intro q + simpa [term, mul_assoc] using + (hpower q).mul_left (PowerSeries.coeff q f) + let badFiber : ℕ → Set ℕ := fun q => {d | term ⟨q, d⟩ ∉ s} + have hbadFiberFinite : ∀ q : ℕ, (badFiber q).Finite := by + intro q + have hevent := (hfiber q).summable.tendsto_cofinite_zero.eventually hs + apply (Filter.mem_cofinite.mp hevent).subset + intro d hd + exact hd + let D : ℕ → Finset ℕ := fun q => (hbadFiberFinite q).toFinset + let E : Finset (Sigma fun _ : ℕ => ℕ) := Q.sigma D + apply Filter.mem_cofinite.mpr + apply E.finite_toSet.subset + intro qd hbad + by_contra hnotE + have hgood : term qd ∈ s := by + by_cases hq : qd.1 ∈ Q + · have hdnot : qd.2 ∉ D qd.1 := by + intro hd + apply hnotE + exact Finset.mem_sigma.mpr ⟨hq, hd⟩ + by_contra hterm + apply hdnot + simp [D, badFiber, hterm] + · have houterGood : + Valued.v (outerTerm qd.1) < + MonoidWithZeroHom.ValueGroup₀.embedding γ.1 := by + have hgoodMem : qd.1 ∈ goodOuter := by + by_contra hnotGood + apply hq + simpa [Q] using hnotGood + exact hgoodMem + apply hγ + change Valued.v.restrict (term qd) < γ.1 + rw [Valuation.restrict_lt_iff_lt_embedding] + have hbound := + valuation_powerSeries_subst_sigmaTerm_le_outerTerm + Valued.v f g x hcoeff qd.1 qd.2 + exact lt_of_le_of_lt (by simpa [term, outerTerm] using hbound) houterGood + exact hbad hgood + +/-- Expanded substitution has the value obtained by first evaluating the +inner series and then the outer series. -/ +theorem hasSum_powerSeries_subst_sigma + [Valued K (WithZero (Multiplicative ℤ))] [CompleteSpace K] + [NonarchimedeanRing K] + (f g : PowerSeries K) (x y z : K) + (hgy : HasSum (fun d : ℕ => PowerSeries.coeff d g * x ^ d) y) + (houterX : Summable + (fun q : ℕ => PowerSeries.coeff q f * x ^ q)) + (houterY : HasSum + (fun q : ℕ => PowerSeries.coeff q f * y ^ q) z) + (hcoeff : ∀ d : ℕ, + Valued.v (PowerSeries.coeff d g * x ^ d) ≤ Valued.v x) : + HasSum + (fun qd : Sigma fun _ : ℕ => ℕ => + PowerSeries.coeff qd.1 f * + PowerSeries.coeff qd.2 (g ^ qd.1) * x ^ qd.2) + z := by + have hsigma := + summable_powerSeries_subst_sigma_of_outer_summable + f g x y hgy houterX hcoeff + have hinner : ∀ q : ℕ, + HasSum + (fun d : ℕ => + PowerSeries.coeff q f * PowerSeries.coeff d (g ^ q) * x ^ d) + (PowerSeries.coeff q f * y ^ q) := by + intro q + simpa [mul_assoc] using + (hasSum_powerSeries_pow_coeff_mul_pow g x y hgy q).mul_left + (PowerSeries.coeff q f) + exact HasSum.sigma_of_hasSum houterY hinner hsigma + +/-- Regrouping the expanded substitution by the final monomial degree gives +the coefficient evaluation of the formal substitution itself. Finiteness +of every regrouped fiber is supplied by `PowerSeries.coeff_subst_finite'`. -/ +theorem hasSum_powerSeries_subst_coeff_mul_pow_of_sigma + [Valued K (WithZero (Multiplicative ℤ))] + (f g : PowerSeries K) (x z : K) + (hg0 : PowerSeries.constantCoeff g = 0) + (hsigma : + HasSum + (fun qd : Sigma fun _ : ℕ => ℕ => + PowerSeries.coeff qd.1 f * + PowerSeries.coeff qd.2 (g ^ qd.1) * x ^ qd.2) + z) : + HasSum + (fun d : ℕ => + PowerSeries.coeff d (PowerSeries.subst g f) * x ^ d) + z := by + have hg : PowerSeries.HasSubst g := + PowerSeries.HasSubst.of_constantCoeff_zero' hg0 + let sigmaTerm : (Sigma fun _ : ℕ => ℕ) → K := fun qd => + PowerSeries.coeff qd.1 f * + PowerSeries.coeff qd.2 (g ^ qd.1) * x ^ qd.2 + have hsigma' : HasSum sigmaTerm z := by + simpa [sigmaTerm] using hsigma + let swap : + (Sigma fun _ : ℕ => ℕ) ≃ (Sigma fun _ : ℕ => ℕ) := + { toFun := fun dq => ⟨dq.2, dq.1⟩ + invFun := fun qd => ⟨qd.2, qd.1⟩ + left_inv := by intro dq; cases dq; rfl + right_inv := by intro qd; cases qd; rfl } + have hswapped : HasSum (sigmaTerm ∘ swap) z := + (swap.hasSum_iff).2 hsigma' + have hfiber : ∀ d : ℕ, + HasSum + (fun q : ℕ => (sigmaTerm ∘ swap) ⟨d, q⟩) + (PowerSeries.coeff d (PowerSeries.subst g f) * x ^ d) := by + intro d + let base : ℕ → K := fun q => + PowerSeries.coeff q f • PowerSeries.coeff d (g ^ q) + let fiberTerm : ℕ → K := fun q => base q * x ^ d + have hsupport : base.support.Finite := by + rw [← Function.HasFiniteSupport] + simpa only [base] using PowerSeries.coeff_subst_finite' hg f d + let S : Finset ℕ := hsupport.toFinset + have hfinite : + HasSum fiberTerm (∑ q ∈ S, fiberTerm q) := by + apply hasSum_sum_of_ne_finset_zero + intro q hq + have hbase : base q = 0 := by + by_contra hne + apply hq + simp [S, hne] + simp [fiberTerm, hbase] + have hsum : + (∑ q ∈ S, fiberTerm q) = + PowerSeries.coeff d (PowerSeries.subst g f) * x ^ d := by + rw [PowerSeries.coeff_subst' hg f d] + rw [finsum_eq_sum _ hsupport] + rw [Finset.sum_mul] + rw [hsum] at hfinite + simpa [fiberTerm, base, sigmaTerm, swap, Function.comp_def, + smul_eq_mul, mul_assoc] using hfinite + exact hswapped.sigma hfiber + +/-- A source-level evaluation theorem for convergent formal substitution. -/ +theorem hasSum_powerSeries_subst_coeff_mul_pow + [Valued K (WithZero (Multiplicative ℤ))] [CompleteSpace K] + [NonarchimedeanRing K] + (f g : PowerSeries K) (x y z : K) + (hg0 : PowerSeries.constantCoeff g = 0) + (hgy : HasSum (fun d : ℕ => PowerSeries.coeff d g * x ^ d) y) + (houterX : Summable + (fun q : ℕ => PowerSeries.coeff q f * x ^ q)) + (houterY : HasSum + (fun q : ℕ => PowerSeries.coeff q f * y ^ q) z) + (hcoeff : ∀ d : ℕ, + Valued.v (PowerSeries.coeff d g * x ^ d) ≤ Valued.v x) : + HasSum + (fun d : ℕ => + PowerSeries.coeff d (PowerSeries.subst g f) * x ^ d) + z := by + apply hasSum_powerSeries_subst_coeff_mul_pow_of_sigma f g x z hg0 + exact hasSum_powerSeries_subst_sigma + f g x y z hgy houterX houterY hcoeff + +/-! ## Scaled logarithm and exponential input estimates -/ + +/-- Scaled evaluation of the formal exponential series. -/ +theorem hasSum_formalExpPowerSeries_eval_expSeriesField_ofWithZeroValuation_scaled + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hthreshold : ∀ hx : x ≠ 0, + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℝ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum + (fun n : ℕ => + PowerSeries.coeff n (PowerSeries.exp K) * x ^ n) + (expSeriesFieldOfWithZeroValuation v x hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hsum := + hasSum_expSeriesTermField_expSeriesField_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e x hnK hnval hthreshold hcomplete + exact hsum.congr_fun fun n => + formalExpPowerSeries_coeff_mul_pow_eq_expSeriesTermField + (K := K) x hnK n + +/-- Evaluation commutes with subtracting the constant power series `1`. -/ +theorem hasSum_powerSeries_sub_one_coeff_mul_pow + [Valued K (WithZero (Multiplicative ℤ))] + (f : PowerSeries K) (x z : K) + (hf : HasSum (fun d : ℕ => PowerSeries.coeff d f * x ^ d) z) : + HasSum + (fun d : ℕ => PowerSeries.coeff d (f - 1) * x ^ d) + (z - 1) := by + have hsingle : + HasSum (fun d : ℕ => if d = 0 then (1 : K) else 0) 1 := by + apply hasSum_single 0 + intro d hd + simp [hd] + have hone : + HasSum + (fun d : ℕ => PowerSeries.coeff d (1 : PowerSeries K) * x ^ d) + 1 := + hsingle.congr_fun fun d => by + by_cases hd : d = 0 + · subst d + simp + · simp [PowerSeries.coeff_one, hd] + refine (hf.sub hone).congr_fun ?_ + intro d + rw [map_sub] + ring + +/-- The scaled threshold implies that the argument lies in the open unit +ball, including the zero argument. -/ +theorem valuation_lt_one_ofWithZeroValuation_scaled_threshold_real + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) {x : K} + (hthreshold : ∀ hx : x ≠ 0, + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℝ)) : + v x < (1 : WithZero (Multiplicative ℤ)) := by + by_cases hx : x = 0 + · simp [hx] + · have hp_two : (2 : ℕ) ≤ p := (Fact.out : Nat.Prime p).two_le + have hp_two_real : (2 : ℝ) ≤ (p : ℝ) := by exact_mod_cast hp_two + have hp_sub_pos : 0 < ((p : ℝ) - 1) := by linarith + have hnonneg : 0 ≤ (e : ℝ) / ((p : ℝ) - 1) := + div_nonneg (Nat.cast_nonneg e) hp_sub_pos.le + have hxval_pos_real : + (0 : ℝ) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℝ) := + lt_of_le_of_lt hnonneg (hthreshold hx) + have hxval_pos : + 0 < (ofWithZeroValuation v).val (Units.mk0 x hx) := by + exact_mod_cast hxval_pos_real + exact valuation_lt_one_of_ofWithZeroValuation_val_pos + v (Units.mk0 x hx) hxval_pos + +/-- On the sharp scaled threshold, every evaluated coefficient of the formal +logarithm is bounded by the linear term. -/ +theorem valuation_powerSeries_log_coeff_mul_pow_le_self_scaled + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) {x : K} + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hthreshold : ∀ hx : x ≠ 0, + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℝ)) + (d : ℕ) : + v (PowerSeries.coeff d (PowerSeries.log K) * x ^ d) ≤ + v x := by + by_cases hx : x = 0 + · subst x + by_cases hd : d = 0 + · subst d + simp [PowerSeries.coeff_log] + · simp [hd] + · have hthresholdRat : + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ) := by + exact_mod_cast hthreshold hx + cases d with + | zero => simp [PowerSeries.coeff_log] + | succ n => + cases n with + | zero => + rw [powerSeries_log_coeff_mul_pow_eq_signedLogSeriesTermField + (K := K) x hnK 0] + simp + | succ n => + rw [powerSeries_log_coeff_mul_pow_eq_signedLogSeriesTermField + (K := K) x hnK (n + 1)] + exact le_of_lt + (valuation_signedLogSeriesTermField_lt_self_of_scaled_inv_sub_one_lt + (v := v) (p := p) e (x := x) hx hnK hnval hthresholdRat + (by omega : n + 1 ≠ 0)) + +/-- On the sharp scaled threshold, every evaluated coefficient of +`exp(X)-1` is bounded by its linear term. -/ +theorem valuation_formalExp_sub_one_coeff_mul_pow_le_self_scaled + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) {x : K} + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hthreshold : ∀ hx : x ≠ 0, + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℝ)) + (d : ℕ) : + v (PowerSeries.coeff d ((PowerSeries.exp K) - 1) * x ^ d) ≤ v x := by + by_cases hx : x = 0 + · subst x + by_cases hd : d = 0 + · subst d + simp + · simp [hd] + · have hthresholdRat : + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ) := by + exact_mod_cast hthreshold hx + cases d with + | zero => simp + | succ n => + cases n with + | zero => simp [PowerSeries.coeff_exp] + | succ n => + have hcoeff : + PowerSeries.coeff (n + 2) ((PowerSeries.exp K) - 1) * x ^ (n + 2) = + expSeriesTermField x hnK (n + 2) := by + rw [map_sub] + have hone : + PowerSeries.coeff (n + 2) (1 : PowerSeries K) = 0 := by + simp [PowerSeries.coeff_one] + rw [hone, sub_zero] + exact + formalExpPowerSeries_coeff_mul_pow_eq_expSeriesTermField + (K := K) x hnK (n + 2) + rw [hcoeff] + exact le_of_lt + (valuation_expSeriesTermField_lt_self_of_scaled_inv_sub_one_lt + (v := v) (p := p) e (x := x) hx hnK hnval hthresholdRat + (by omega : 2 ≤ n + 2)) + +/-! ## Evaluation of the two formal identities -/ + +/-- Evaluation of the formal series `X`. -/ +theorem hasSum_powerSeries_X_coeff_mul_pow + [Valued K (WithZero (Multiplicative ℤ))] (x : K) : + HasSum + (fun d : ℕ => PowerSeries.coeff d (PowerSeries.X : PowerSeries K) * x ^ d) + x := by + have hsingle : + HasSum (fun d : ℕ => if d = 1 then x else 0) x := by + apply hasSum_single 1 + intro d hd + simp [hd] + exact hsingle.congr_fun fun d => by + by_cases hd : d = 1 + · subst d + simp [PowerSeries.coeff_X] + · simp [PowerSeries.coeff_X, hd] + +/-- Evaluation of the formal series `1 + X`. -/ +theorem hasSum_powerSeries_one_add_X_coeff_mul_pow + [Valued K (WithZero (Multiplicative ℤ))] (x : K) : + HasSum + (fun d : ℕ => + PowerSeries.coeff d (1 + PowerSeries.X : PowerSeries K) * x ^ d) + (1 + x) := by + have hsingle : + HasSum (fun d : ℕ => if d = 0 then (1 : K) else 0) 1 := by + apply hasSum_single 0 + intro d hd + simp [hd] + have hone : + HasSum + (fun d : ℕ => PowerSeries.coeff d (1 : PowerSeries K) * x ^ d) + 1 := + hsingle.congr_fun fun d => by + by_cases hd : d = 0 + · subst d + simp + · simp [PowerSeries.coeff_one, hd] + have hx := hasSum_powerSeries_X_coeff_mul_pow (K := K) x + refine (hone.add hx).congr_fun ?_ + intro d + rw [map_add] + ring + +/-- The deep exponential–logarithm equivalence, exact principal-unit composite: +on the sharp scaled threshold, evaluating the formal identity +`exp(log(1+X)) = 1+X` gives `exp(log(1+x)) = 1+x`. -/ +theorem expSeries_logOnePlusSeries_eq_one_add_ofWithZeroValuation_scaled_of_threshold + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : K) + (hnKlog : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hnKexp : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hthreshold : ∀ hx : x ≠ 0, + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℝ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + expSeriesFieldOfWithZeroValuation v + (logOnePlusSeriesFieldOfWithZeroValuation v x hnKlog) hnKexp = + 1 + x := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let : CompleteSpace K := hcomplete + have : NonarchimedeanRing K := nonarchimedeanRing_ofWithZeroValuation v + let : IsAddTorsionFree K := IsAddTorsionFree.of_module_rat K + by_cases hx : x = 0 + · subst x + simp + · let y : K := logOnePlusSeriesFieldOfWithZeroValuation v x hnKlog + have hvx_lt_one : v x < (1 : WithZero (Multiplicative ℤ)) := + valuation_lt_one_ofWithZeroValuation_scaled_threshold_real + (v := v) (p := p) e hthreshold + have hthresholdRat : + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ) := by + exact_mod_cast hthreshold hx + have hvy_eq : v y = v x := by + simpa [y] using + valuation_logOnePlusSeriesField_eq_self_of_scaled_inv_sub_one_lt + (v := v) (p := p) e (x := x) hx hnKlog hnvalLog hvx_lt_one + hthresholdRat hcomplete + have hy : y ≠ 0 := by + intro hy0 + have hzero : v y = 0 := by simp [hy0] + have hxzero : v x = 0 := by simpa [hvy_eq] using hzero + exact ((_root_.Valuation.ne_zero_iff v).2 hx) hxzero + have hyval_eq : + (ofWithZeroValuation v).val (Units.mk0 y hy) = + (ofWithZeroValuation v).val (Units.mk0 x hx) := + ofWithZeroValuation_val_eq_of_valuation_eq v hvy_eq + have hythreshold : ∀ hy' : y ≠ 0, + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 y hy') : ℝ) := by + intro hy' + have hyproof : Units.mk0 y hy' = Units.mk0 y hy := by + ext + rfl + rw [hyproof, hyval_eq] + exact hthreshold hx + have hinner : + HasSum + (fun d : ℕ => + PowerSeries.coeff d (PowerSeries.log K) * x ^ d) + y := by + simpa [y] using + hasSum_powerSeries_log_eval_nat_logOnePlusSeriesField_ofWithZeroValuation_scaled + (v := v) (p := p) e x hnKlog hnvalLog hvx_lt_one hcomplete + have houterX : + HasSum + (fun q : ℕ => PowerSeries.coeff q (PowerSeries.exp K) * x ^ q) + (expSeriesFieldOfWithZeroValuation v x hnKexp) := + hasSum_formalExpPowerSeries_eval_expSeriesField_ofWithZeroValuation_scaled + (v := v) (p := p) e x hnKexp hnvalExp hthreshold hcomplete + have houterY : + HasSum + (fun q : ℕ => PowerSeries.coeff q (PowerSeries.exp K) * y ^ q) + (expSeriesFieldOfWithZeroValuation v y hnKexp) := + hasSum_formalExpPowerSeries_eval_expSeriesField_ofWithZeroValuation_scaled + (v := v) (p := p) e y hnKexp hnvalExp hythreshold hcomplete + have hcoeff : ∀ d : ℕ, + v (PowerSeries.coeff d (PowerSeries.log K) * x ^ d) ≤ v x := + valuation_powerSeries_log_coeff_mul_pow_le_self_scaled + (v := v) (p := p) e hnKlog hnvalLog hthreshold + have hcomp : + HasSum + (fun d : ℕ => + PowerSeries.coeff d + (PowerSeries.subst (PowerSeries.log K) + (PowerSeries.exp K)) * x ^ d) + (expSeriesFieldOfWithZeroValuation v y hnKexp) := + hasSum_powerSeries_subst_coeff_mul_pow + (PowerSeries.exp K) (PowerSeries.log K) x y + (expSeriesFieldOfWithZeroValuation v y hnKexp) + PowerSeries.constantCoeff_log hinner + houterX.summable houterY hcoeff + rw [PowerSeries.exp_subst_log_eq_one_add_X K] at hcomp + exact hcomp.unique (hasSum_powerSeries_one_add_X_coeff_mul_pow (K := K) x) + +/-- The deep exponential–logarithm equivalence, exact maximal-ideal composite: +on the sharp scaled threshold, evaluating the formal identity +`log(exp(X)) = X` gives `log(exp(x)) = x`. -/ +theorem logOnePlusSeries_expSeries_sub_one_eq_self_ofWithZeroValuation_scaled_of_threshold + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : K) + (hnKexp : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hnKlog : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hthreshold : ∀ hx : x ≠ 0, + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℝ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + logOnePlusSeriesFieldOfWithZeroValuation v + (expSeriesFieldOfWithZeroValuation v x hnKexp - 1) hnKlog = + x := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let : CompleteSpace K := hcomplete + have : NonarchimedeanRing K := nonarchimedeanRing_ofWithZeroValuation v + let : IsAddTorsionFree K := IsAddTorsionFree.of_module_rat K + by_cases hx : x = 0 + · subst x + simp + · let y : K := expSeriesFieldOfWithZeroValuation v x hnKexp - 1 + have hvx_lt_one : v x < (1 : WithZero (Multiplicative ℤ)) := + valuation_lt_one_ofWithZeroValuation_scaled_threshold_real + (v := v) (p := p) e hthreshold + have hthresholdRat : + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ) := by + exact_mod_cast hthreshold hx + have hvy_eq : v y = v x := by + simpa [y] using + valuation_expSeriesField_sub_one_eq_self_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e (x := x) hx hnKexp hnvalExp + hthresholdRat hcomplete + have hvy_lt_one : v y < (1 : WithZero (Multiplicative ℤ)) := by + simpa [hvy_eq] using hvx_lt_one + have hexp : + HasSum + (fun d : ℕ => PowerSeries.coeff d (PowerSeries.exp K) * x ^ d) + (expSeriesFieldOfWithZeroValuation v x hnKexp) := + hasSum_formalExpPowerSeries_eval_expSeriesField_ofWithZeroValuation_scaled + (v := v) (p := p) e x hnKexp hnvalExp hthreshold hcomplete + have hinner : + HasSum + (fun d : ℕ => + PowerSeries.coeff d ((PowerSeries.exp K) - 1) * x ^ d) + y := by + simpa [y] using + hasSum_powerSeries_sub_one_coeff_mul_pow + (PowerSeries.exp K) x + (expSeriesFieldOfWithZeroValuation v x hnKexp) hexp + have houterX : + HasSum + (fun q : ℕ => + PowerSeries.coeff q (PowerSeries.log K) * x ^ q) + (logOnePlusSeriesFieldOfWithZeroValuation v x hnKlog) := + hasSum_powerSeries_log_eval_nat_logOnePlusSeriesField_ofWithZeroValuation_scaled + (v := v) (p := p) e x hnKlog hnvalLog hvx_lt_one hcomplete + have houterY : + HasSum + (fun q : ℕ => + PowerSeries.coeff q (PowerSeries.log K) * y ^ q) + (logOnePlusSeriesFieldOfWithZeroValuation v y hnKlog) := + hasSum_powerSeries_log_eval_nat_logOnePlusSeriesField_ofWithZeroValuation_scaled + (v := v) (p := p) e y hnKlog hnvalLog hvy_lt_one hcomplete + have hcoeff : ∀ d : ℕ, + v (PowerSeries.coeff d ((PowerSeries.exp K) - 1) * x ^ d) ≤ v x := + valuation_formalExp_sub_one_coeff_mul_pow_le_self_scaled + (v := v) (p := p) e hnKexp hnvalExp hthreshold + have hg0 : + PowerSeries.constantCoeff ((PowerSeries.exp K) - 1) = 0 := by + simp + have hcomp : + HasSum + (fun d : ℕ => + PowerSeries.coeff d + (PowerSeries.subst ((PowerSeries.exp K) - 1) + (PowerSeries.log K)) * x ^ d) + (logOnePlusSeriesFieldOfWithZeroValuation v y hnKlog) := + hasSum_powerSeries_subst_coeff_mul_pow + (PowerSeries.log K) ((PowerSeries.exp K) - 1) x y + (logOnePlusSeriesFieldOfWithZeroValuation v y hnKlog) + hg0 hinner houterX.summable houterY hcoeff + rw [PowerSeries.log_subst_exp_sub_one_eq_X K] at hcomp + exact hcomp.unique (hasSum_powerSeries_X_coeff_mul_pow (K := K) x) + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpContinuity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpContinuity.lean new file mode 100644 index 0000000000..a9861c0b2b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpContinuity.lean @@ -0,0 +1,532 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.ContinuousFieldUnitLog +/-! +# Topology of exponential and logarithm + +This file supplies the topological part of the deep exponential–logarithm equivalence at the sharp +ramified endpoint `n > e / (p - 1)`. The algebraic construction of the maps is supplied by + the preceding modules; +here we prove that the endpoint +exponential and logarithm maps are continuous for the valuation topology. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +open Filter +open WithZeroValuation +open scoped Topology + +variable {K : Type u} [Field K] + +/-- The endpoint exponential of the deep exponential–logarithm equivalence, as a homomorphism +from the +additive ideal (written multiplicatively) to the higher principal units. -/ +noncomputable def principalUnitExpSeriesHomOfMaximalIdealPowOfWithZeroValuationScaled + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnK : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + Multiplicative + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring) →* + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v) n := by + let hπ : v.IsUniformizer (π : K) := + isUniformizer_of_valuation_eq_exp_neg_one v (π : K) hπval + exact + { toFun := fun a => + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnK hnval hcomplete a.toAdd + map_one' := by + apply Subtype.ext + apply Units.ext + apply Subtype.ext + simp [principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled] + map_mul' := by + intro a b + simpa using + principalUnitExpSeries_maximalIdealPow_add_eq_mul_ofWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnK hnval hcomplete a.toAdd b.toAdd } + +/-- +The defining evaluation formula for `principalUnitExpSeriesHomOfMaximalIdealPow` is +`principalUnitExpSeriesHomOfMaximalIdealPowOfWithZeroValuationScaled (v := v) (p := p) e n (π := +π) hπval hn hlevel hnK hnval hcomplete a = +principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled (v := v) (p := p) e n (π := π) +(isUniformizer_of_valuation_eq_exp_neg_one v (π : K) hπval) hπval hn hlevel hnK hnval hcomplete +a.toAdd`. +-/ +@[simp] theorem principalUnitExpSeriesHomOfMaximalIdealPow_apply + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnK : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (a : Multiplicative + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring)) : + principalUnitExpSeriesHomOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπval hn hlevel + hnK hnval hcomplete a = + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) + (isUniformizer_of_valuation_eq_exp_neg_one v (π : K) hπval) + hπval hn hlevel + hnK hnval hcomplete a.toAdd := + rfl + +/-- The field value of the endpoint exponential is continuous at the origin. +The proof is the valuation estimate `v(Exp(a) - 1) = v(a)`: membership in `m^n` +puts every nonzero `a` above the ramified convergence threshold. -/ +theorem continuousAt_zero_principalUnitExpSeries_maximalIdealPow_fieldVal_ofWithZeroValuationScaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnK : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + ContinuousAt + (fun a : + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring) => + ((((principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) + (isUniformizer_of_valuation_eq_exp_neg_one v (π : K) hπval) + hπval hn hlevel + hnK hnval hcomplete a : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v) n) : + (completeDVFOfWithZeroValuation v).valuationSubringˣ) : + (completeDVFOfWithZeroValuation v).valuationSubring) : K)) + 0 := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let hπ : v.IsUniformizer (π : K) := + isUniformizer_of_valuation_eq_exp_neg_one v (π : K) hπval + let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := + completeDVFOfWithZeroValuation v + let E := + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnK hnval hcomplete + have hcoe : Continuous + (fun a : (F.maximalIdeal ^ n : Ideal F.valuationSubring) => + ((a : F.valuationSubring) : K)) := + continuous_subtype_val.comp continuous_subtype_val + have hEzero : ((((E 0 : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F n) : + F.valuationSubringˣ) : F.valuationSubring) : K) = 1 := by + simp [E, principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled] + rw [ContinuousAt, Filter.tendsto_def] + intro s hs + rw [hEzero, Valued.mem_nhds] at hs + obtain ⟨γ, hγ⟩ := hs + have hball : {x : K | + v x < MonoidWithZeroHom.ValueGroup₀.embedding γ.1} ∈ + 𝓝 (0 : K) := by + apply Valued.mem_nhds_zero.mpr + exact ⟨γ, by + intro x hx + change v.restrict x < γ.1 at hx + rw [Valuation.restrict_lt_iff_lt_embedding] at hx + exact hx⟩ + have hpre : + {a : (F.maximalIdeal ^ n : Ideal F.valuationSubring) | + v (((a : F.valuationSubring) : K)) < + MonoidWithZeroHom.ValueGroup₀.embedding γ.1} ∈ 𝓝 0 := by + have ht := (hcoe.tendsto + (0 : (F.maximalIdeal ^ n : Ideal F.valuationSubring))) hball + simpa using ht + refine Filter.mem_of_superset hpre ?_ + intro a ha + change v (((a : F.valuationSubring) : K)) < + MonoidWithZeroHom.ValueGroup₀.embedding γ.1 at ha + apply hγ + change v.restrict + (((((E a : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F n) : + F.valuationSubringˣ) : F.valuationSubring) : K) - 1) < γ.1 + rw [Valuation.restrict_lt_iff_lt_embedding] + let x : K := ((a : F.valuationSubring) : K) + by_cases hx : x = 0 + · simpa [E, principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled, + x, hx] using + (MonoidWithZeroHom.ValueGroup₀.embedding_unit_pos γ) + · have hge : + (n : ℤ) ≤ (ofWithZeroValuation v).val (Units.mk0 x hx) := by + simpa [F, x] using + ofWithZeroValuation_val_ge_of_mem_maximalIdeal_pow + (v := v) (π := π) hπ hπval n + (a := (a : F.valuationSubring)) a.property hx + have hthreshold : + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ) := + lt_of_lt_of_le hlevel (by exact_mod_cast hge) + have hv := + valuation_expSeriesField_sub_one_eq_self_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e (x := x) hx hnK hnval hthreshold hcomplete + rw [principalUnitExpSeries_maximalIdealPow_val_ofWithZeroValuationScaled, + hv] + simpa [x] using ha + +/-- The field value of the endpoint exponential is continuous everywhere. +Translation in `m^n`, exponential additivity, and continuity of multiplication +reduce this to the preceding continuity statement at zero. -/ +theorem continuous_principalUnitExpSeries_maximalIdealPow_fieldVal_ofWithZeroValuationScaled + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnK : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Continuous + (fun a : + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring) => + ((((principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) + (isUniformizer_of_valuation_eq_exp_neg_one v (π : K) hπval) + hπval hn hlevel + hnK hnval hcomplete a : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v) n) : + (completeDVFOfWithZeroValuation v).valuationSubringˣ) : + (completeDVFOfWithZeroValuation v).valuationSubring) : K)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let hπ : v.IsUniformizer (π : K) := + isUniformizer_of_valuation_eq_exp_neg_one v (π : K) hπval + let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := + completeDVFOfWithZeroValuation v + let E := + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnK hnval hcomplete + let f : (F.maximalIdeal ^ n : Ideal F.valuationSubring) → K := + fun a => ((((E a : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F n) : + F.valuationSubringˣ) : F.valuationSubring) : K) + have hzero : ContinuousAt f 0 := by + simpa [F, E, f] using + continuousAt_zero_principalUnitExpSeries_maximalIdealPow_fieldVal_ofWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπval hn hlevel + hnK hnval hcomplete + rw [continuous_iff_continuousAt] + intro a + have hshiftContinuous : Continuous + (fun b : (F.maximalIdeal ^ n : Ideal F.valuationSubring) => b - a) := by + apply Continuous.subtype_mk + apply Continuous.subtype_mk + exact + (continuous_subtype_val.comp continuous_subtype_val).sub + continuous_const + have hshift : ContinuousAt + (fun b : (F.maximalIdeal ^ n : Ideal F.valuationSubring) => b - a) a := + hshiftContinuous.continuousAt + have hshiftExp : ContinuousAt (fun b => f (b - a)) a := + hzero.comp_of_eq hshift (sub_self a) + have htranslated : ContinuousAt (fun b => f a * f (b - a)) a := + continuousAt_const.mul hshiftExp + convert htranslated using 1 + funext b + have hadd := + principalUnitExpSeries_maximalIdealPow_add_eq_mul_ofWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnK hnval hcomplete a (b - a) + have hfield := congrArg + (fun u : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F n => + ((((u : F.valuationSubringˣ) : F.valuationSubring) : K))) hadd + simpa [f, E, add_sub_cancel_right] using hfield + +/-- The exponential endpoint `m^n → U^n` of the deep exponential–logarithm equivalence is +continuous. +The unit topology records both a unit and its inverse; the inverse component is +the same continuous exponential evaluated at `-a`. -/ +theorem continuous_principalUnitExpSeriesHomOfMaximalIdealPowOfWithZeroValuationScaled + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnK : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Continuous + (principalUnitExpSeriesHomOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπval hn hlevel + hnK hnval hcomplete) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := + completeDVFOfWithZeroValuation v + let I : Type u := (F.maximalIdeal ^ n : Ideal F.valuationSubring) + let H : Multiplicative I →* + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F n := + principalUnitExpSeriesHomOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπval hn hlevel + hnK hnval hcomplete + have hFieldAdd : Continuous + (fun a : I => ((((H (Multiplicative.ofAdd a) : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F n) : + F.valuationSubringˣ) : + F.valuationSubring) : K)) := by + simpa [F, I, H] using + continuous_principalUnitExpSeries_maximalIdealPow_fieldVal_ofWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπval hn hlevel + hnK hnval hcomplete + have hField : Continuous + (fun a : Multiplicative I => ((((H a : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F n) : + F.valuationSubringˣ) : F.valuationSubring) : K)) := by + convert hFieldAdd.comp continuous_toAdd using 1 + rfl + have hVal : Continuous + (fun a : Multiplicative I => + (((H a : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F + n) : F.valuationSubringˣ) : + F.valuationSubring)) := by + apply Continuous.subtype_mk + exact hField + have hNegI : Continuous (fun a : I => -a) := by + apply Continuous.subtype_mk + apply Continuous.subtype_mk + exact (continuous_subtype_val.comp continuous_subtype_val).neg + have hNeg : Continuous (fun a : Multiplicative I => -(a.toAdd)) := + hNegI.comp continuous_toAdd + let Hinv : Multiplicative I → F.valuationSubringˣ := + fun a => ((H a : F.valuationSubringˣ)⁻¹) + have hFieldInv : Continuous + (fun a : Multiplicative I => ((Hinv a : F.valuationSubring) : K)) := by + have hnegexp := hFieldAdd.comp hNeg + convert hnegexp using 1 + funext a + simp [Hinv] + have hInvVal : Continuous + (fun a : Multiplicative I => (Hinv a : F.valuationSubring)) := by + apply Continuous.subtype_mk + exact hFieldInv + have hUnits : Continuous + (fun a : Multiplicative I => + ((H a : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F + n) : F.valuationSubringˣ)) := by + rw [Units.continuous_iff] + exact ⟨hVal, by simpa [Hinv] using hInvVal⟩ + change Continuous H + apply Continuous.subtype_mk + exact hUnits + +/-- The logarithm endpoint `U^n → m^n` of the deep exponential–logarithm equivalence is continuous. +It is the restriction of the continuous logarithm on `U^1`; the two subtype +lifts merely record the already-proved fact that its value lies in `m^n`. -/ +theorem continuous_principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnK : ∀ m : ℕ, (((m + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ m : ℕ, + v (((m + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (m + 1) : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Continuous + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) + (isUniformizer_of_valuation_eq_exp_neg_one v (π : K) hπval) + hπval hn hlevel + hnK hnval hcomplete) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let hπ : v.IsUniformizer (π : K) := + isUniformizer_of_valuation_eq_exp_neg_one v (π : K) hπval + let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := + completeDVFOfWithZeroValuation v + let ι : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F n → + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 1 := + fun u => ⟨(u : F.valuationSubringˣ), + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.antitone F hn + u.property⟩ + have hι : Continuous ι := by + apply Continuous.subtype_mk + exact continuous_subtype_val + let L : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 1 →* + Multiplicative K := + principalUnitLogSeriesHomOfWithZeroValuationScaled + (v := v) (p := p) e hnK hnval hcomplete + have hL : Continuous L := by + simpa [F, L] using + continuous_principalUnitLogSeriesHomOfWithZeroValuationScaled + (v := v) (p := p) e hnK hnval hcomplete + have hfield : Continuous + (fun u : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F n + => (L (ι u)).toAdd) := + continuous_toAdd.comp (hL.comp hι) + have hfieldEndpoint : Continuous + (fun u : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F n => + (((principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnK hnval hcomplete u : + (F.maximalIdeal ^ n : Ideal F.valuationSubring)) : + F.valuationSubring) : K)) := by + convert hfield using 1 + funext u + change principalUnitLogSeriesOfWithZeroValuation v (ι u) hnK = + Multiplicative.toAdd (L (ι u)) + exact + (principalUnitLogSeriesHomOfWithZeroValuationScaled_apply_toAdd + (v := v) (p := p) e hnK hnval hcomplete (ι u)).symm + have hValEndpoint : Continuous + (fun u : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F n => + ((principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnK hnval hcomplete u : + (F.maximalIdeal ^ n : Ideal F.valuationSubring)) : + F.valuationSubring)) := by + apply Continuous.subtype_mk + exact hfieldEndpoint + apply Continuous.subtype_mk + exact hValEndpoint + +/-- The deep exponential–logarithm equivalence as a topological group isomorphism, once the two +exact +series-composition identities have been supplied. Continuity of both maps is +not an assumption: it is furnished by the endpoint theorems above. -/ +noncomputable def principalUnitExpLogContinuousMulEquivOfExactOfWithZeroValuationScaled + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnKexp : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hnKlog : ∀ m : ℕ, (((m + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ m : ℕ, + v (((m + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (m + 1) : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (hlog_exp : + ∀ a : + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring), + principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) + (isUniformizer_of_valuation_eq_exp_neg_one v (π : K) hπval) + hπval hn hlevel + hnKlog hnvalLog hcomplete + (principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) + (isUniformizer_of_valuation_eq_exp_neg_one v (π : K) hπval) + hπval hn hlevel + hnKexp hnvalExp hcomplete a) = a) + (hexp_log : + ∀ u : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v) n, + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) + (isUniformizer_of_valuation_eq_exp_neg_one v (π : K) hπval) + hπval hn hlevel + hnKexp hnvalExp hcomplete + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) + (isUniformizer_of_valuation_eq_exp_neg_one v (π : K) hπval) + hπval hn hlevel + hnKlog hnvalLog hcomplete u) = u) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Multiplicative + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring) ≃ₜ* + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v) n := by + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let hπ : v.IsUniformizer (π : K) := + isUniformizer_of_valuation_eq_exp_neg_one v (π : K) hπval + exact + { __ := + principalUnitExpLogMulEquivOfExactOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hnKlog hnvalLog hcomplete hlog_exp hexp_log + continuous_toFun := + continuous_principalUnitExpSeriesHomOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπval hn hlevel + hnKexp hnvalExp hcomplete + continuous_invFun := + continuous_ofAdd.comp + (continuous_principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπval hn hlevel + hnKlog hnvalLog hcomplete) } + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries.lean new file mode 100644 index 0000000000..1348bcf397 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.ExpConvergence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCore +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalProduct +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.Homomorphisms +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.InverseEstimates +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.LogConvergence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitExp +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.SeriesTerms + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/ExpConvergence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/ExpConvergence.lean new file mode 100644 index 0000000000..7c02a88d97 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/ExpConvergence.lean @@ -0,0 +1,1191 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Topology.Algebra.InfiniteSum.Nonarchimedean +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.SeriesTerms +/-! +Establishes convergence and summability of the exponential series on sufficiently deep +nonarchimedean ideals. +-/ + +@[expose] public section + +open Filter +open Polynomial +open scoped Topology +open scoped PowerSeries.WithPiTopology +noncomputable +section + +attribute [local instance] Classical.propDecidable + +universe u + +open ValuationTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +variable {K : Type u} [Field K] + +/-- The field-unit logarithm theorem, exponential-series valuation estimate: +if `x` has integer valuation strictly bigger than one, then the valuations of +`x^n / n!` tend to `+∞`. -/ +theorem ofWithZeroValuation_val_exp_term_tendsto_atTop_of_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : Kˣ) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hxone : 1 < ((ofWithZeroValuation v).val x : ℝ)) : + Tendsto + (fun n : ℕ => + ((ofWithZeroValuation v).val + (x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n)) : ℝ)) + atTop atTop := + ofWithZeroValuation_val_pow_div_natCast_factorial_tendsto_atTop + (v := v) (p := p) x hnK hnval + (c := ((ofWithZeroValuation v).val x : ℝ)) hxone le_rfl + +/-- Eventually the exponential-series terms have valuation at least any +prescribed integer bound. -/ +theorem eventually_le_ofWithZeroValuation_val_exp_term_of_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : Kˣ) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hxone : 1 < ((ofWithZeroValuation v).val x : ℝ)) + (N : ℤ) : + ∀ᶠ n : ℕ in atTop, + N ≤ + (ofWithZeroValuation v).val + (x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n)) := by + have htendsto := + ofWithZeroValuation_val_exp_term_tendsto_atTop_of_one_lt + (v := v) (p := p) x hnK hnval hxone + have hreal : + ∀ᶠ n : ℕ in atTop, + (N : ℝ) ≤ + ((ofWithZeroValuation v).val + (x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n)) : ℝ) := + tendsto_atTop.1 htendsto (N : ℝ) + filter_upwards [hreal] with n hn + exact_mod_cast hn + +/-- The exponential-series terms tend to zero in the topology defined by the +given `ℤᵐ⁰`-valued valuation. -/ +theorem tendsto_zero_exp_term_ofWithZeroValuation_of_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : Kˣ) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hxone : 1 < ((ofWithZeroValuation v).val x : ℝ)) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun n : ℕ => + ((x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n) : Kˣ) : K)) + atTop (𝓝 (0 : K)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + rw [tendsto_iff_forall_eventually_mem] + intro s hs + rw [Valued.mem_nhds_zero] at hs + rcases hs with ⟨γ, hγs⟩ + let γ' : (WithZero (Multiplicative ℤ))ˣ := + Units.map (MonoidWithZeroHom.ValueGroup₀.embedding + (f := (.ofClass v))) γ + rcases WithZero.exists_exp_neg_natCast_lt γ'.ne_zero with ⟨N, hNγ⟩ + have hterm := + eventually_le_ofWithZeroValuation_val_exp_term_of_one_lt + (v := v) (p := p) x hnK hnval hxone (N : ℤ) + filter_upwards [hterm] with n hn + apply hγs + let y : Kˣ := + x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n) + have hlog : + WithZero.log (v (y : K)) ≤ -(N : ℤ) := by + have hNlog : (N : ℤ) ≤ -WithZero.log (v (y : K)) := by + simpa [y, ofWithZeroValuation_val] using hn + linarith + have hvle : v (y : K) ≤ WithZero.exp (-(N : ℤ)) := + WithZero.le_exp_of_log_le hlog + change v.restrict (y : K) < γ.1 + rw [Valuation.restrict_lt_iff_lt_embedding] + exact lt_of_le_of_lt hvle (by simpa [γ'] using hNγ) + +/-- In a complete nonarchimedean valuation topology, the exponential-series +terms are summable on the radius supplied by the preceding valuation estimate. -/ +theorem summable_exp_term_ofWithZeroValuation_of_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : Kˣ) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hxone : 1 < ((ofWithZeroValuation v).val x : ℝ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Summable + (fun n : ℕ => + ((x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n) : Kˣ) : K)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let : CompleteSpace K := hcomplete + have : NonarchimedeanRing K := nonarchimedeanRing_ofWithZeroValuation v + have hzero : + Tendsto + (fun n : ℕ => + ((x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n) : Kˣ) : K)) + atTop (𝓝 (0 : K)) := + tendsto_zero_exp_term_ofWithZeroValuation_of_one_lt + (v := v) (p := p) x hnK hnval hxone + have hcofinite : + Tendsto + (fun n : ℕ => + ((x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n) : Kˣ) : K)) + cofinite (𝓝 (0 : K)) := by + simpa [Nat.cofinite_eq_atTop] using hzero + rw [NonarchimedeanAddGroup.summable_iff_tendsto_cofinite_zero] + exact hcofinite + +/-- The field-unit logarithm theorem, exponential series: the series +`∑ x^n/n!` has the value supplied by `expSeriesOfWithZeroValuation`. -/ +theorem hasSum_expSeriesTerm_expSeries_ofWithZeroValuation_of_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : Kˣ) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hxone : 1 < ((ofWithZeroValuation v).val x : ℝ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum (fun n : ℕ => expSeriesTerm x hnK n) + (expSeriesOfWithZeroValuation v x hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hs : + Summable + (fun n : ℕ => + ((x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n) : Kˣ) : K)) := + summable_exp_term_ofWithZeroValuation_of_one_lt + (v := v) (p := p) x hnK hnval hxone hcomplete + simpa [expSeriesOfWithZeroValuation, expSeriesTerm] using hs.hasSum + +/-- The finite exponential polynomials converge to the exponential-series +value on the same radius. -/ +theorem tendsto_expSeriesPartialSum_ofWithZeroValuation_of_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : Kˣ) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hxone : 1 < ((ofWithZeroValuation v).val x : ℝ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto (fun N : ℕ => expSeriesPartialSum x hnK N) atTop + (𝓝 (expSeriesOfWithZeroValuation v x hnK)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hsum := + hasSum_expSeriesTerm_expSeries_ofWithZeroValuation_of_one_lt + (v := v) (p := p) x hnK hnval hxone hcomplete + simpa [expSeriesPartialSum] using hsum.tendsto_sum_nat + +/-- Sharp ramified version of the exponential-series valuation estimate: +if `x` has integer valuation strictly bigger than `e/(p-1)`, then the +valuations of `x^n / n!` tend to `+∞`. -/ +theorem ofWithZeroValuation_val_exp_term_scaled_tendsto_atTop_of_threshold + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : Kˣ) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hxthreshold : + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val x : ℝ)) : + Tendsto + (fun n : ℕ => + ((ofWithZeroValuation v).val + (x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n)) : ℝ)) + atTop atTop := + ofWithZeroValuation_val_pow_div_natCast_factorial_scaled_tendsto_atTop + (v := v) (p := p) e x hnK hnval + (c := ((ofWithZeroValuation v).val x : ℝ)) hxthreshold le_rfl + +/-- Eventually the ramified exponential-series terms have valuation at least +any prescribed integer bound. -/ +theorem eventually_le_ofWithZeroValuation_val_exp_term_scaled_of_threshold + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : Kˣ) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hxthreshold : + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val x : ℝ)) + (N : ℤ) : + ∀ᶠ n : ℕ in atTop, + N ≤ + (ofWithZeroValuation v).val + (x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n)) := by + have htendsto := + ofWithZeroValuation_val_exp_term_scaled_tendsto_atTop_of_threshold + (v := v) (p := p) e x hnK hnval hxthreshold + have hreal : + ∀ᶠ n : ℕ in atTop, + (N : ℝ) ≤ + ((ofWithZeroValuation v).val + (x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n)) : ℝ) := + tendsto_atTop.1 htendsto (N : ℝ) + filter_upwards [hreal] with n hn + exact_mod_cast hn + +/-- The exponential-series terms tend to zero under the sharp ramified +threshold. -/ +theorem tendsto_zero_exp_term_ofWithZeroValuation_scaled_of_threshold + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : Kˣ) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hxthreshold : + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val x : ℝ)) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun n : ℕ => + ((x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n) : Kˣ) : K)) + atTop (𝓝 (0 : K)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + rw [tendsto_iff_forall_eventually_mem] + intro s hs + rw [Valued.mem_nhds_zero] at hs + rcases hs with ⟨γ, hγs⟩ + let γ' : (WithZero (Multiplicative ℤ))ˣ := + Units.map (MonoidWithZeroHom.ValueGroup₀.embedding + (f := (.ofClass v))) γ + rcases WithZero.exists_exp_neg_natCast_lt γ'.ne_zero with ⟨N, hNγ⟩ + have hterm := + eventually_le_ofWithZeroValuation_val_exp_term_scaled_of_threshold + (v := v) (p := p) e x hnK hnval hxthreshold (N : ℤ) + filter_upwards [hterm] with n hn + apply hγs + let y : Kˣ := + x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n) + have hlog : + WithZero.log (v (y : K)) ≤ -(N : ℤ) := by + have hNlog : (N : ℤ) ≤ -WithZero.log (v (y : K)) := by + simpa [y, ofWithZeroValuation_val] using hn + linarith + have hvle : v (y : K) ≤ WithZero.exp (-(N : ℤ)) := + WithZero.le_exp_of_log_le hlog + change v.restrict (y : K) < γ.1 + rw [Valuation.restrict_lt_iff_lt_embedding] + exact lt_of_le_of_lt hvle (by simpa [γ'] using hNγ) + +/-- Summability of the exponential series under the sharp ramified threshold. -/ +theorem summable_exp_term_ofWithZeroValuation_scaled_of_threshold + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : Kˣ) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hxthreshold : + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val x : ℝ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Summable + (fun n : ℕ => + ((x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n) : Kˣ) : K)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let : CompleteSpace K := hcomplete + have : NonarchimedeanRing K := nonarchimedeanRing_ofWithZeroValuation v + have hzero : + Tendsto + (fun n : ℕ => + ((x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n) : Kˣ) : K)) + atTop (𝓝 (0 : K)) := + tendsto_zero_exp_term_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e x hnK hnval hxthreshold + have hcofinite : + Tendsto + (fun n : ℕ => + ((x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n) : Kˣ) : K)) + cofinite (𝓝 (0 : K)) := by + simpa [Nat.cofinite_eq_atTop] using hzero + rw [NonarchimedeanAddGroup.summable_iff_tendsto_cofinite_zero] + exact hcofinite + +/-- The exponential series has the same `tsum` value under a sharp ramified +denominator valuation hypothesis. -/ +theorem hasSum_expSeriesTerm_expSeries_ofWithZeroValuation_scaled_of_threshold + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : Kˣ) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hxthreshold : + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val x : ℝ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum (fun n : ℕ => expSeriesTerm x hnK n) + (expSeriesOfWithZeroValuation v x hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hs : + Summable + (fun n : ℕ => + ((x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n) : Kˣ) : K)) := + summable_exp_term_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e x hnK hnval hxthreshold hcomplete + simpa [expSeriesOfWithZeroValuation, expSeriesTerm] using hs.hasSum + +/-- Finite exponential polynomials converge under the sharp ramified +threshold. -/ +theorem tendsto_expSeriesPartialSum_ofWithZeroValuation_scaled_of_threshold + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : Kˣ) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hxthreshold : + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val x : ℝ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto (fun N : ℕ => expSeriesPartialSum x hnK N) atTop + (𝓝 (expSeriesOfWithZeroValuation v x hnK)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hsum := + hasSum_expSeriesTerm_expSeries_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e x hnK hnval hxthreshold hcomplete + simpa [expSeriesPartialSum] using hsum.tendsto_sum_nat + +/-- Establishes the identity `expSeriesTermField x hnK n = 0`. -/ +theorem expSeriesTermField_eq_zero_of_eq_zero_of_ne_zero + {x : K} (hx : x = 0) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + {n : ℕ} (hn : n ≠ 0) : + expSeriesTermField x hnK n = 0 := by + cases n with + | zero => exact False.elim (hn rfl) + | succ n => simp [expSeriesTermField, hx] + +/-- The field-element exponential series at zero has value one. -/ +@[simp] theorem expSeriesField_zero_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) : + expSeriesFieldOfWithZeroValuation v 0 hnK = 1 := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + calc + expSeriesFieldOfWithZeroValuation v 0 hnK = + ∑' n : ℕ, expSeriesTermField (0 : K) hnK n := by + rfl + _ = expSeriesTermField (0 : K) hnK 0 := by + exact tsum_eq_single 0 fun n hn => + expSeriesTermField_eq_zero_of_eq_zero_of_ne_zero rfl hnK hn + _ = 1 := by + simp + +/-- Field-element exponential-series terms tend to zero under the normalized +radius condition `v x < exp (-1)`. This version also covers `x = 0`. -/ +theorem tendsto_zero_expSeriesTermField_ofWithZeroValuation_of_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto (fun n : ℕ => expSeriesTermField x hnK n) atTop + (𝓝 (0 : K)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + by_cases hx : x = 0 + · have hconst : + (fun n : ℕ => expSeriesTermField x hnK n) =ᶠ[atTop] + fun _ : ℕ => (0 : K) := by + filter_upwards [eventually_ge_atTop 1] with n hn + have hnzero : n ≠ 0 := by omega + exact expSeriesTermField_eq_zero_of_eq_zero_of_ne_zero hx hnK hnzero + exact hconst.tendsto + · have hxone : + 1 < ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℝ) := + ofWithZeroValuation_val_mk0_one_lt_of_lt_exp_neg_one + (v := v) hx hvx + have hunit := + tendsto_zero_exp_term_ofWithZeroValuation_of_one_lt + (v := v) (p := p) (Units.mk0 x hx) hnK hnval hxone + simpa [expSeriesTermField, expSeriesTerm] using hunit + +/-- In a complete nonarchimedean valuation topology, the field-element +exponential-series terms are summable under `v x < exp (-1)`. -/ +theorem summable_expSeriesTermField_ofWithZeroValuation_of_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Summable (fun n : ℕ => expSeriesTermField x hnK n) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let : CompleteSpace K := hcomplete + have : NonarchimedeanRing K := nonarchimedeanRing_ofWithZeroValuation v + have hzero : + Tendsto (fun n : ℕ => expSeriesTermField x hnK n) atTop + (𝓝 (0 : K)) := + tendsto_zero_expSeriesTermField_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) x hnK hnval hvx + have hcofinite : + Tendsto (fun n : ℕ => expSeriesTermField x hnK n) cofinite + (𝓝 (0 : K)) := by + simpa [Nat.cofinite_eq_atTop] using hzero + rw [NonarchimedeanAddGroup.summable_iff_tendsto_cofinite_zero] + exact hcofinite + +/-- Field-element exponential series with value supplied by +`expSeriesFieldOfWithZeroValuation`. -/ +theorem hasSum_expSeriesTermField_expSeriesField_ofWithZeroValuation_of_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum (fun n : ℕ => expSeriesTermField x hnK n) + (expSeriesFieldOfWithZeroValuation v x hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hs : + Summable (fun n : ℕ => expSeriesTermField x hnK n) := + summable_expSeriesTermField_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) x hnK hnval hvx hcomplete + simpa [expSeriesFieldOfWithZeroValuation] using hs.hasSum + +/-- Field-element exponential-series terms tend to zero under the sharp +ramified threshold. This version also covers `x = 0`. -/ +theorem tendsto_zero_expSeriesTermField_ofWithZeroValuation_scaled_of_threshold + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hxthreshold : ∀ hx : x ≠ 0, + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℝ)) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto (fun n : ℕ => expSeriesTermField x hnK n) atTop + (𝓝 (0 : K)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + by_cases hx : x = 0 + · have hconst : + (fun n : ℕ => expSeriesTermField x hnK n) =ᶠ[atTop] + fun _ : ℕ => (0 : K) := by + filter_upwards [eventually_ge_atTop 1] with n hn + have hnzero : n ≠ 0 := by omega + exact expSeriesTermField_eq_zero_of_eq_zero_of_ne_zero hx hnK hnzero + exact hconst.tendsto + · have hunit := + tendsto_zero_exp_term_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e (Units.mk0 x hx) hnK hnval (hxthreshold hx) + simpa [expSeriesTermField, expSeriesTerm] using hunit + +/-- Summability of the field-element exponential series under the sharp +ramified threshold. -/ +theorem summable_expSeriesTermField_ofWithZeroValuation_scaled_of_threshold + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hxthreshold : ∀ hx : x ≠ 0, + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℝ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Summable (fun n : ℕ => expSeriesTermField x hnK n) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let : CompleteSpace K := hcomplete + have : NonarchimedeanRing K := nonarchimedeanRing_ofWithZeroValuation v + have hzero : + Tendsto (fun n : ℕ => expSeriesTermField x hnK n) atTop + (𝓝 (0 : K)) := + tendsto_zero_expSeriesTermField_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e x hnK hnval hxthreshold + have hcofinite : + Tendsto (fun n : ℕ => expSeriesTermField x hnK n) cofinite + (𝓝 (0 : K)) := by + simpa [Nat.cofinite_eq_atTop] using hzero + rw [NonarchimedeanAddGroup.summable_iff_tendsto_cofinite_zero] + exact hcofinite + +/-- Field-element exponential series with value supplied by +`expSeriesFieldOfWithZeroValuation`, under the sharp ramified threshold. -/ +theorem hasSum_expSeriesTermField_expSeriesField_ofWithZeroValuation_scaled_of_threshold + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hxthreshold : ∀ hx : x ≠ 0, + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℝ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum (fun n : ℕ => expSeriesTermField x hnK n) + (expSeriesFieldOfWithZeroValuation v x hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hs : + Summable (fun n : ℕ => expSeriesTermField x hnK n) := + summable_expSeriesTermField_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e x hnK hnval hxthreshold hcomplete + simpa [expSeriesFieldOfWithZeroValuation] using hs.hasSum + +/-- Field-element exponential partial sums converge under the sharp ramified +threshold. -/ +theorem tendsto_expSeriesPartialSumField_ofWithZeroValuation_scaled_of_threshold + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hxthreshold : ∀ hx : x ≠ 0, + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℝ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto (fun N : ℕ => expSeriesPartialSumField x hnK N) atTop + (𝓝 (expSeriesFieldOfWithZeroValuation v x hnK)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hsum := + hasSum_expSeriesTermField_expSeriesField_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e x hnK hnval hxthreshold hcomplete + simpa [expSeriesPartialSumField] using hsum.tendsto_sum_nat + +/-- The local-field exponential series is the convergent evaluation of +mathlib's formal exponential power series on its normalized radius. -/ +theorem hasSum_formalExpPowerSeries_eval_expSeriesField + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum + (fun n : ℕ => + PowerSeries.coeff n (PowerSeries.exp K) * x ^ n) + (expSeriesFieldOfWithZeroValuation v x hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hsum := + hasSum_expSeriesTermField_expSeriesField_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) x hnK hnval hvx hcomplete + exact hsum.congr_fun fun n => + formalExpPowerSeries_coeff_mul_pow_eq_expSeriesTermField + (K := K) x hnK n + +/-- The product family of two local exponential series is summable on the +normalized exponential convergence ball. This uses mathlib's +nonarchimedean Cauchy-product theorem rather than an absolute-convergence +argument. -/ +theorem summable_expSeriesTermField_mul_prod_ofWithZeroValuation_of_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x y : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hvy : v y < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Summable + (fun ij : ℕ × ℕ => + expSeriesTermField x hnK ij.1 * + expSeriesTermField y hnK ij.2) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have : NonarchimedeanRing K := nonarchimedeanRing_ofWithZeroValuation v + have hxsum : + Summable (fun n : ℕ => expSeriesTermField x hnK n) := + summable_expSeriesTermField_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) x hnK hnval hvx hcomplete + have hysum : + Summable (fun n : ℕ => expSeriesTermField y hnK n) := + summable_expSeriesTermField_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) y hnK hnval hvy hcomplete + exact hxsum.mul_of_nonarchimedean hysum + +/-- The antidiagonal Cauchy product of two local exponential series sums to +the product of their values. -/ +theorem + hasSum_expSeriesTermField_cauchyProduct_expSeriesField_mul_ofWithZeroValuation_of_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x y : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hvy : v y < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum + (fun n : ℕ => + ∑ ij ∈ Finset.antidiagonal n, + expSeriesTermField x hnK ij.1 * + expSeriesTermField y hnK ij.2) + (expSeriesFieldOfWithZeroValuation v x hnK * + expSeriesFieldOfWithZeroValuation v y hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have : NonarchimedeanRing K := nonarchimedeanRing_ofWithZeroValuation v + have hxsum : + Summable (fun n : ℕ => expSeriesTermField x hnK n) := + summable_expSeriesTermField_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) x hnK hnval hvx hcomplete + have hysum : + Summable (fun n : ℕ => expSeriesTermField y hnK n) := + summable_expSeriesTermField_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) y hnK hnval hvy hcomplete + have hprod : + Summable + (fun ij : ℕ × ℕ => + expSeriesTermField x hnK ij.1 * + expSeriesTermField y hnK ij.2) := + hxsum.mul_of_nonarchimedean hysum + have hcauchy : + Summable + (fun n : ℕ => + ∑ ij ∈ Finset.antidiagonal n, + expSeriesTermField x hnK ij.1 * + expSeriesTermField y hnK ij.2) := + summable_sum_mul_antidiagonal_of_summable_mul hprod + have htsum : + expSeriesFieldOfWithZeroValuation v x hnK * + expSeriesFieldOfWithZeroValuation v y hnK = + ∑' n : ℕ, + ∑ ij ∈ Finset.antidiagonal n, + expSeriesTermField x hnK ij.1 * + expSeriesTermField y hnK ij.2 := by + simpa [expSeriesFieldOfWithZeroValuation] using + hxsum.tsum_mul_tsum_eq_tsum_sum_antidiagonal hysum hprod + exact htsum.symm ▸ hcauchy.hasSum + +/-- Local exponential multiplicativity on the normalized convergence ball. -/ +theorem expSeriesField_add_eq_mul_ofWithZeroValuation_of_lt_exp_neg_one + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x y : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hvy : v y < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + expSeriesFieldOfWithZeroValuation v (x + y) hnK = + expSeriesFieldOfWithZeroValuation v x hnK * + expSeriesFieldOfWithZeroValuation v y hnK := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hxy : + v (x + y) < WithZero.exp (-1 : ℤ) := + valuation_add_lt_exp_neg_one_of_lt_exp_neg_one v hvx hvy + have hsumAdd := + hasSum_expSeriesTermField_expSeriesField_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) (x + y) hnK hnval hxy hcomplete + have hsumCauchyAdd : + HasSum + (fun n : ℕ => + ∑ ij ∈ Finset.antidiagonal n, + expSeriesTermField x hnK ij.1 * + expSeriesTermField y hnK ij.2) + (expSeriesFieldOfWithZeroValuation v (x + y) hnK) := + hsumAdd.congr_fun fun n => + (expSeriesTermField_add_eq_sum_antidiagonal + (K := K) x y hnK n).symm + have hsumProduct := + hasSum_expSeriesTermField_cauchyProduct_expSeriesField_mul_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) x y hnK hnval hvx hvy hcomplete + exact hsumCauchyAdd.unique hsumProduct + +/-- The product family of two local exponential series is summable under the +sharp ramified threshold. -/ +theorem summable_expSeriesTermField_mul_prod_ofWithZeroValuation_scaled_of_threshold + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x y : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hxthreshold : ∀ hx : x ≠ 0, + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℝ)) + (hythreshold : ∀ hy : y ≠ 0, + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 y hy) : ℝ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Summable + (fun ij : ℕ × ℕ => + expSeriesTermField x hnK ij.1 * + expSeriesTermField y hnK ij.2) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have : NonarchimedeanRing K := nonarchimedeanRing_ofWithZeroValuation v + have hxsum : + Summable (fun n : ℕ => expSeriesTermField x hnK n) := + summable_expSeriesTermField_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e x hnK hnval hxthreshold hcomplete + have hysum : + Summable (fun n : ℕ => expSeriesTermField y hnK n) := + summable_expSeriesTermField_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e y hnK hnval hythreshold hcomplete + exact hxsum.mul_of_nonarchimedean hysum + +/-- The antidiagonal Cauchy product of two local exponential series sums to +the product of their values under the sharp ramified threshold. -/ +theorem + hasSum_expSeriesTerm_cauchyProduct_expSeries_mul_scaled_of_threshold + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x y : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hxthreshold : ∀ hx : x ≠ 0, + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℝ)) + (hythreshold : ∀ hy : y ≠ 0, + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 y hy) : ℝ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum + (fun n : ℕ => + ∑ ij ∈ Finset.antidiagonal n, + expSeriesTermField x hnK ij.1 * + expSeriesTermField y hnK ij.2) + (expSeriesFieldOfWithZeroValuation v x hnK * + expSeriesFieldOfWithZeroValuation v y hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have : NonarchimedeanRing K := nonarchimedeanRing_ofWithZeroValuation v + have hxsum : + Summable (fun n : ℕ => expSeriesTermField x hnK n) := + summable_expSeriesTermField_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e x hnK hnval hxthreshold hcomplete + have hysum : + Summable (fun n : ℕ => expSeriesTermField y hnK n) := + summable_expSeriesTermField_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e y hnK hnval hythreshold hcomplete + have hprod : + Summable + (fun ij : ℕ × ℕ => + expSeriesTermField x hnK ij.1 * + expSeriesTermField y hnK ij.2) := + hxsum.mul_of_nonarchimedean hysum + have hcauchy : + Summable + (fun n : ℕ => + ∑ ij ∈ Finset.antidiagonal n, + expSeriesTermField x hnK ij.1 * + expSeriesTermField y hnK ij.2) := + summable_sum_mul_antidiagonal_of_summable_mul hprod + have htsum : + expSeriesFieldOfWithZeroValuation v x hnK * + expSeriesFieldOfWithZeroValuation v y hnK = + ∑' n : ℕ, + ∑ ij ∈ Finset.antidiagonal n, + expSeriesTermField x hnK ij.1 * + expSeriesTermField y hnK ij.2 := by + simpa [expSeriesFieldOfWithZeroValuation] using + hxsum.tsum_mul_tsum_eq_tsum_sum_antidiagonal hysum hprod + exact htsum.symm ▸ hcauchy.hasSum + +/-- Local exponential multiplicativity under the sharp ramified threshold. -/ +theorem expSeriesField_add_eq_mul_ofWithZeroValuation_scaled_of_threshold + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x y : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hxthreshold : ∀ hx : x ≠ 0, + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℝ)) + (hythreshold : ∀ hy : y ≠ 0, + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 y hy) : ℝ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + expSeriesFieldOfWithZeroValuation v (x + y) hnK = + expSeriesFieldOfWithZeroValuation v x hnK * + expSeriesFieldOfWithZeroValuation v y hnK := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hxythreshold : ∀ hxy : x + y ≠ 0, + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 (x + y) hxy) : ℝ) := by + intro hxy + by_cases hx : x = 0 + · have hy : y ≠ 0 := by + intro hy + exact hxy (by simp [hx, hy]) + simpa [hx] using hythreshold hy + · by_cases hy : y = 0 + · simpa [hy] using hxthreshold hx + · have hmin : + min ((ofWithZeroValuation v).val (Units.mk0 x hx)) + ((ofWithZeroValuation v).val (Units.mk0 y hy)) ≤ + (ofWithZeroValuation v).val (Units.mk0 (x + y) hxy) := + ofWithZeroValuation_val_add_ge_min v hx hy hxy + have hminR : + ((min ((ofWithZeroValuation v).val (Units.mk0 x hx)) + ((ofWithZeroValuation v).val (Units.mk0 y hy)) : ℤ) : ℝ) ≤ + ((ofWithZeroValuation v).val (Units.mk0 (x + y) hxy) : ℝ) := by + exact_mod_cast hmin + have hthresholdMin : + (e : ℝ) / ((p : ℝ) - 1) < + ((min ((ofWithZeroValuation v).val (Units.mk0 x hx)) + ((ofWithZeroValuation v).val (Units.mk0 y hy)) : ℤ) : ℝ) := by + rw [Int.cast_min] + exact lt_min (hxthreshold hx) (hythreshold hy) + exact lt_of_lt_of_le hthresholdMin hminR + have hsumAdd := + hasSum_expSeriesTermField_expSeriesField_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e (x + y) hnK hnval hxythreshold hcomplete + have hsumCauchyAdd : + HasSum + (fun n : ℕ => + ∑ ij ∈ Finset.antidiagonal n, + expSeriesTermField x hnK ij.1 * + expSeriesTermField y hnK ij.2) + (expSeriesFieldOfWithZeroValuation v (x + y) hnK) := + hsumAdd.congr_fun fun n => + (expSeriesTermField_add_eq_sum_antidiagonal + (K := K) x y hnK n).symm + have hsumProduct := + hasSum_expSeriesTerm_cauchyProduct_expSeries_mul_scaled_of_threshold + (v := v) (p := p) e x y hnK hnval hxthreshold hythreshold + hcomplete + exact hsumCauchyAdd.unique hsumProduct + +/-- The negative additive parameter gives a left inverse for the local +exponential series. -/ +theorem expSeriesField_neg_mul_self_eq_one_ofWithZeroValuation_of_lt_exp_neg_one + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + expSeriesFieldOfWithZeroValuation v (-x) hnK * + expSeriesFieldOfWithZeroValuation v x hnK = 1 := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hneg : + v (-x) < WithZero.exp (-1 : ℤ) := by + simpa using hvx + have hmul := + expSeriesField_add_eq_mul_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) (-x) x hnK hnval hneg hvx hcomplete + simpa [neg_add_cancel] using hmul.symm + +/-- The negative additive parameter gives a right inverse for the local +exponential series. -/ +theorem expSeriesField_mul_neg_self_eq_one_ofWithZeroValuation_of_lt_exp_neg_one + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + expSeriesFieldOfWithZeroValuation v x hnK * + expSeriesFieldOfWithZeroValuation v (-x) hnK = 1 := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hneg : + v (-x) < WithZero.exp (-1 : ℤ) := by + simpa using hvx + have hmul := + expSeriesField_add_eq_mul_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) x (-x) hnK hnval hvx hneg hcomplete + simpa [add_neg_cancel] using hmul.symm + +/-- Field-side inverse form of the local exponential identity: +`exp(-x) = exp(x)⁻¹`. -/ +theorem expSeriesField_neg_eq_inv_self_ofWithZeroValuation_of_lt_exp_neg_one + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + expSeriesFieldOfWithZeroValuation v (-x) hnK = + (expSeriesFieldOfWithZeroValuation v x hnK)⁻¹ := by + exact + eq_inv_of_mul_eq_one_left + (expSeriesField_neg_mul_self_eq_one_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) x hnK hnval hvx hcomplete) + +/-- Field-side inverse form of the local exponential identity: +`exp(x)⁻¹ = exp(-x)`. -/ +theorem expSeriesField_inv_eq_neg_self_ofWithZeroValuation_of_lt_exp_neg_one + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + (expSeriesFieldOfWithZeroValuation v x hnK)⁻¹ = + expSeriesFieldOfWithZeroValuation v (-x) hnK := by + exact + inv_eq_of_mul_eq_one_right + (expSeriesField_mul_neg_self_eq_one_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) x hnK hnval hvx hcomplete) + +/-- Field-element exponential partial sums converge to the exponential-series +value under `v x < exp (-1)`. -/ +theorem tendsto_expSeriesPartialSumField_ofWithZeroValuation_of_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto (fun N : ℕ => expSeriesPartialSumField x hnK N) atTop + (𝓝 (expSeriesFieldOfWithZeroValuation v x hnK)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hsum := + hasSum_expSeriesTermField_expSeriesField_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) x hnK hnval hvx hcomplete + simpa [expSeriesPartialSumField] using hsum.tendsto_sum_nat + +/-- Zero lies in the normalized exponential convergence ball. -/ +theorem valuation_zero_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) : + v (0 : K) < WithZero.exp (-1 : ℤ) := by + simp + +/-- The additive ball on which the local exponential series converges. -/ +def expConvergenceAddSubgroupOfWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) : + AddSubgroup K where + carrier := {x : K | v x < WithZero.exp (-1 : ℤ)} + zero_mem' := valuation_zero_lt_exp_neg_one (K := K) v + add_mem' := by + intro x y hx hy + exact valuation_add_lt_exp_neg_one_of_lt_exp_neg_one v hx hy + neg_mem' := by + intro x hx + simpa using hx + +/-- +Characterizes `x ∈ expConvergenceAddSubgroupOfWithZeroValuation v` by the equivalent condition `v +x < WithZero.exp (-1 : ℤ)`. +-/ +@[simp] theorem mem_expConvergenceAddSubgroupOfWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) {x : K} : + x ∈ expConvergenceAddSubgroupOfWithZeroValuation v ↔ + v x < WithZero.exp (-1 : ℤ) := + Iff.rfl + +/-- Every positive-degree exponential-series term lies in the open unit ball +on the normalized exponential convergence radius. -/ +theorem valuation_expSeriesTermField_lt_one_of_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + {n : ℕ} (hn : n ≠ 0) : + v (expSeriesTermField x hnK n) < + (1 : WithZero (Multiplicative ℤ)) := by + by_cases hx : x = 0 + · have hterm : + expSeriesTermField x hnK n = 0 := + expSeriesTermField_eq_zero_of_eq_zero_of_ne_zero hx hnK hn + simp [hterm] + · let y : Kˣ := + (Units.mk0 x hx) ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n) + have hxoneReal : + 1 < ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℝ) := + ofWithZeroValuation_val_mk0_one_lt_of_lt_exp_neg_one + (v := v) hx hvx + have hxone : 1 < (ofWithZeroValuation v).val (Units.mk0 x hx) := by + exact_mod_cast hxoneReal + have hpos : + 0 < (ofWithZeroValuation v).val y := + ofWithZeroValuation_val_pow_div_natCast_factorial_pos_of_one_lt + (v := v) (p := p) (n := n) (Units.mk0 x hx) + (hnK n) (hnval n) hxone hn + have hlt : + v (y : K) < (1 : WithZero (Multiplicative ℤ)) := + valuation_lt_one_of_ofWithZeroValuation_val_pos v y hpos + simpa [y, expSeriesTermField, expSeriesTerm] using hlt + +/-- Exponential partial sums split into the constant term and the positive +degree tail. -/ +theorem expSeriesPartialSumField_succ_eq_one_add_tail + (x : K) (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (N : ℕ) : + expSeriesPartialSumField x hnK (N + 1) = + 1 + ∑ n ∈ Finset.range N, expSeriesTermField x hnK (n + 1) := by + calc + expSeriesPartialSumField x hnK (N + 1) = + (∑ n ∈ Finset.range N, expSeriesTermField x hnK (n + 1)) + + expSeriesTermField x hnK 0 := by + rw [expSeriesPartialSumField, Finset.sum_range_succ'] + _ = 1 + ∑ n ∈ Finset.range N, expSeriesTermField x hnK (n + 1) := by + simp [add_comm] + +/-- Every finite positive-degree tail of the exponential series lies in the +open unit ball on the normalized exponential convergence radius. -/ +theorem valuation_expSeriesTailPartialSumField_lt_one_of_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) (N : ℕ) : + v (∑ n ∈ Finset.range N, expSeriesTermField x hnK (n + 1)) < + (1 : WithZero (Multiplicative ℤ)) := by + exact + v.map_sum_lt' (show (0 : WithZero (Multiplicative ℤ)) < 1 from zero_lt_one) + (fun n _hn => + valuation_expSeriesTermField_lt_one_of_lt_exp_neg_one + (v := v) (p := p) x hnK hnval hvx (Nat.succ_ne_zero n)) + +/-- The finite exponential partial sums are principal units after subtracting +the constant term. -/ +theorem valuation_expSeriesPartialSumField_sub_one_lt_one_of_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) (N : ℕ) : + v (expSeriesPartialSumField x hnK (N + 1) - 1) < + (1 : WithZero (Multiplicative ℤ)) := by + have hsplit := + expSeriesPartialSumField_succ_eq_one_add_tail x hnK N + have htail : + expSeriesPartialSumField x hnK (N + 1) - 1 = + ∑ n ∈ Finset.range N, expSeriesTermField x hnK (n + 1) := by + rw [hsplit] + abel + rw [htail] + exact + valuation_expSeriesTailPartialSumField_lt_one_of_lt_exp_neg_one + (v := v) (p := p) x hnK hnval hvx N + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCore.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCore.lean new file mode 100644 index 0000000000..87edc975de --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCore.lean @@ -0,0 +1,436 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoicePositions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.PowerSeriesComposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ProductArgument +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.BasicFactors +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoiceCountSystem +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ExplicitChoiceCounts + +/-! # Formal Core -/ + +@[expose] public section +open Filter +open Polynomial +open scoped Topology +open scoped PowerSeries.WithPiTopology + +/-! +# Choice-count combinatorics for the formal logarithm product + +This module completes the formal logarithm core by identifying the basic-factor +choices with pairs of finite position sets and evaluating their cardinality. +The formal-series identities and the underlying position calculus live in +`FormalCoreBase`. +-/ + +noncomputable +section + +attribute [local instance] Classical.propDecidable + +universe u + +open LocalFieldTheory.DiscreteValuationField + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +/-- Defines `formalLogOnePlusProductArgumentMixedLeftChoices`. -/ +noncomputable def formalLogOnePlusProductArgumentMixedLeftChoices + (q a b : ℕ) : Finset (Σ _ : Finset ℕ, Finset ℕ) := + ((Finset.range q).powersetCard (a + b - q)).sigma fun M => + ((Finset.range q \ M).powersetCard (q - b)) + +/-- +Establishes the identity `(formalLogOnePlusProductArgumentMixedLeftChoices q a b).card = +Nat.choose q (a + b - q) * Nat.choose (q - (a + b - q)) (q - b)`. +-/ +theorem formalLogOnePlusProductArgumentMixedLeftChoices_card + (q a b : ℕ) : + (formalLogOnePlusProductArgumentMixedLeftChoices q a b).card = + Nat.choose q (a + b - q) * + Nat.choose (q - (a + b - q)) (q - b) := by + classical + rw [formalLogOnePlusProductArgumentMixedLeftChoices, Finset.card_sigma] + calc + (∑ M ∈ (Finset.range q).powersetCard (a + b - q), + ((Finset.range q \ M).powersetCard (q - b)).card) + = ∑ M ∈ (Finset.range q).powersetCard (a + b - q), + Nat.choose (q - (a + b - q)) (q - b) := by + apply Finset.sum_congr rfl + intro M hM + rw [Finset.card_powersetCard] + have hsub : M ⊆ Finset.range q := + (Finset.mem_powersetCard.mp hM).1 + have hcard : M.card = a + b - q := + (Finset.mem_powersetCard.mp hM).2 + rw [Finset.card_sdiff_of_subset hsub, Finset.card_range, hcard] + _ = Nat.choose q (a + b - q) * + Nat.choose (q - (a + b - q)) (q - b) := by + rw [Finset.sum_const] + simp [Finset.card_powersetCard] + +/-- +Establishes the membership statement `(⟨formalLogOnePlusProductArgumentMixedPositions q l, +formalLogOnePlusProductArgumentLeftPositions q l⟩ : Σ _ : Finset ℕ, Finset ℕ) ∈ +formalLogOnePlusProductArgumentMixedLeftChoices q (e (0 : Fin 2)) (e (1 : Fin 2))`. +-/ +theorem formalLogOnePlusProductArgument_toMixedLeft_mem + {q : ℕ} {e : Fin 2 →₀ ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hl : + l ∈ formalLogOnePlusProductArgumentBasicFactorLabelCountChoices q e) : + (⟨formalLogOnePlusProductArgumentMixedPositions q l, + formalLogOnePlusProductArgumentLeftPositions q l⟩ : + Σ _ : Finset ℕ, Finset ℕ) ∈ + formalLogOnePlusProductArgumentMixedLeftChoices q + (e (0 : Fin 2)) (e (1 : Fin 2)) := by + rw [mem_formalLogOnePlusProductArgumentBasicFactorLabelCountChoices] at hl + rcases hl with ⟨_hprod, hlabel0, _hlabel1, hlabel2⟩ + rw [formalLogOnePlusProductArgumentMixedLeftChoices, Finset.mem_sigma] + constructor + · rw [Finset.mem_powersetCard] + exact + ⟨fun i hi => (Finset.mem_filter.mp hi).1, + by + rw [formalLogOnePlusProductArgumentMixedPositions_card, hlabel2]⟩ + · rw [Finset.mem_powersetCard] + constructor + · intro i hi + rw [Finset.mem_sdiff] + constructor + · exact (Finset.mem_filter.mp hi).1 + · intro hmix + have h0 : + formalLogOnePlusProductArgumentBasicFactorLabel (l i) = + (0 : Fin 3) := + (Finset.mem_filter.mp hi).2 + have h2 : + formalLogOnePlusProductArgumentBasicFactorLabel (l i) = + (2 : Fin 3) := + (Finset.mem_filter.mp hmix).2 + omega + · rw [formalLogOnePlusProductArgumentLeftPositions_card, hlabel0] + +/-- +Establishes the membership statement `formalLogOnePlusProductArgumentChoiceFromMixedLeft q P.1 P.2 +∈ formalLogOnePlusProductArgumentBasicFactorLabelCountChoices q e`. +-/ +theorem formalLogOnePlusProductArgument_fromMixedLeft_mem + {q : ℕ} {e : Fin 2 →₀ ℕ} + {P : Σ _ : Finset ℕ, Finset ℕ} + (hleft : e (0 : Fin 2) ≤ q) (hright : e (1 : Fin 2) ≤ q) + (hsum : q ≤ e (0 : Fin 2) + e (1 : Fin 2)) + (hP : + P ∈ formalLogOnePlusProductArgumentMixedLeftChoices q + (e (0 : Fin 2)) (e (1 : Fin 2))) : + formalLogOnePlusProductArgumentChoiceFromMixedLeft q P.1 P.2 ∈ + formalLogOnePlusProductArgumentBasicFactorLabelCountChoices q e := by + rw [formalLogOnePlusProductArgumentMixedLeftChoices, Finset.mem_sigma] at hP + rcases hP with ⟨hMmem, hLmem⟩ + rw [Finset.mem_powersetCard] at hMmem hLmem + rcases hMmem with ⟨hMsub, hMcard⟩ + rcases hLmem with ⟨hLsub, hLcard⟩ + rw [mem_formalLogOnePlusProductArgumentBasicFactorLabelCountChoices] + refine ⟨?_, ?_, ?_, ?_⟩ + · rw [mem_formalLogOnePlusProductArgumentBasicFactorProductChoices] + refine ⟨?_, ?_⟩ + · exact Finsupp.support_onFinset_subset + · intro i hi + by_cases hMi : i ∈ P.1 + · simp [formalLogOnePlusProductArgumentChoiceFromMixedLeft_apply_of_mem hi, + hMi, formalLogOnePlusProductArgumentBasicFactorMixed, + formalLogOnePlusProductArgumentBasicFactor] + · by_cases hLi : i ∈ P.2 + · simp [formalLogOnePlusProductArgumentChoiceFromMixedLeft_apply_of_mem hi, + hMi, hLi, formalLogOnePlusProductArgumentBasicFactorLeft, + formalLogOnePlusProductArgumentBasicFactor] + · simp [formalLogOnePlusProductArgumentChoiceFromMixedLeft_apply_of_mem hi, + hMi, hLi, formalLogOnePlusProductArgumentBasicFactorRight, + formalLogOnePlusProductArgumentBasicFactor] + · rw [← formalLogOnePlusProductArgumentLeftPositions_card, + formalLogOnePlusProductArgumentLeftPositions_choiceFromMixedLeft hLsub, + hLcard] + · rw [← formalLogOnePlusProductArgumentRightPositions_card] + exact + formalLogOnePlusProductArgumentRightPositions_choiceFromMixedLeft_card + hMsub hMcard hLsub hLcard hleft hright hsum + · rw [← formalLogOnePlusProductArgumentMixedPositions_card, + formalLogOnePlusProductArgumentMixedPositions_choiceFromMixedLeft hMsub, + hMcard] + +/-- +Establishes the identity `formalLogOnePlusProductArgumentChoiceFromMixedLeft q +(formalLogOnePlusProductArgumentMixedPositions q l) (formalLogOnePlusProductArgumentLeftPositions +q l) = l`. +-/ +theorem formalLogOnePlusProductArgument_from_to_choice + {q : ℕ} {e : Fin 2 →₀ ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hl : + l ∈ formalLogOnePlusProductArgumentBasicFactorLabelCountChoices q e) : + formalLogOnePlusProductArgumentChoiceFromMixedLeft q + (formalLogOnePlusProductArgumentMixedPositions q l) + (formalLogOnePlusProductArgumentLeftPositions q l) = l := by + rw [mem_formalLogOnePlusProductArgumentBasicFactorLabelCountChoices] at hl + rcases hl with ⟨hprod, _h0, _h1, _h2⟩ + rw [mem_formalLogOnePlusProductArgumentBasicFactorProductChoices] at hprod + rcases hprod with ⟨hsupp, hbasic⟩ + ext i a + by_cases hi : i ∈ Finset.range q + · have hb := hbasic i hi + by_cases h2 : + formalLogOnePlusProductArgumentBasicFactorLabel (l i) = + (2 : Fin 3) + · have hmixed : + l i = formalLogOnePlusProductArgumentBasicFactorMixed := + (formalLogOnePlusProductArgumentBasicFactorLabel_eq_two_iff_of_basic + hb).1 h2 + simp [formalLogOnePlusProductArgumentChoiceFromMixedLeft_apply_of_mem hi, + formalLogOnePlusProductArgumentMixedPositions, + formalLogOnePlusProductArgumentLeftPositions, hi, hmixed, + formalLogOnePlusProductArgumentBasicFactorMixed] + · by_cases h0 : + formalLogOnePlusProductArgumentBasicFactorLabel (l i) = + (0 : Fin 3) + · have hleft : + l i = formalLogOnePlusProductArgumentBasicFactorLeft := by + simpa [formalLogOnePlusProductArgumentBasicFactorLeft] using + (formalLogOnePlusProductArgumentBasicFactorLabel_eq_zero.1 h0) + simp [formalLogOnePlusProductArgumentChoiceFromMixedLeft_apply_of_mem hi, + formalLogOnePlusProductArgumentMixedPositions, + formalLogOnePlusProductArgumentLeftPositions, hi, hleft, + formalLogOnePlusProductArgumentBasicFactorLeft] + · have h1 : + formalLogOnePlusProductArgumentBasicFactorLabel (l i) = + (1 : Fin 3) := by + generalize hlabel : + formalLogOnePlusProductArgumentBasicFactorLabel (l i) = j + fin_cases j + · exact False.elim (h0 hlabel) + · rfl + · exact False.elim (h2 hlabel) + have hright : + l i = formalLogOnePlusProductArgumentBasicFactorRight := by + simpa [formalLogOnePlusProductArgumentBasicFactorRight] using + (formalLogOnePlusProductArgumentBasicFactorLabel_eq_one.1 h1) + simp [formalLogOnePlusProductArgumentChoiceFromMixedLeft_apply_of_mem hi, + formalLogOnePlusProductArgumentMixedPositions, + formalLogOnePlusProductArgumentLeftPositions, hi, hright, + formalLogOnePlusProductArgumentBasicFactorRight] + · have hli : l i = 0 := by + exact Finsupp.notMem_support_iff.mp (fun hsup => hi (hsupp hsup)) + simp [formalLogOnePlusProductArgumentChoiceFromMixedLeft_apply_of_not_mem hi, + hli] + +/-- +Establishes the identity `(⟨formalLogOnePlusProductArgumentMixedPositions q +(formalLogOnePlusProductArgumentChoiceFromMixedLeft q P.1 P.2), +formalLogOnePlusProductArgumentLeftPositions q (formalLogOnePlusProductArgumentChoiceFromMixedLeft +q P.1 P.2)⟩ : Σ _ : Finset ℕ, Finset ℕ) = P`. +-/ +theorem formalLogOnePlusProductArgument_to_from_pair + {q : ℕ} {e : Fin 2 →₀ ℕ} + {P : Σ _ : Finset ℕ, Finset ℕ} + (hP : + P ∈ formalLogOnePlusProductArgumentMixedLeftChoices q + (e (0 : Fin 2)) (e (1 : Fin 2))) : + (⟨formalLogOnePlusProductArgumentMixedPositions q + (formalLogOnePlusProductArgumentChoiceFromMixedLeft q P.1 P.2), + formalLogOnePlusProductArgumentLeftPositions q + (formalLogOnePlusProductArgumentChoiceFromMixedLeft q P.1 P.2)⟩ : + Σ _ : Finset ℕ, Finset ℕ) = P := by + rw [formalLogOnePlusProductArgumentMixedLeftChoices, Finset.mem_sigma] at hP + rcases P with ⟨M, L⟩ + rcases hP with ⟨hMmem, hLmem⟩ + rw [Finset.mem_powersetCard] at hMmem hLmem + rcases hMmem with ⟨hMsub, _hMcard⟩ + rcases hLmem with ⟨hLsub, _hLcard⟩ + simp [formalLogOnePlusProductArgumentMixedPositions_choiceFromMixedLeft hMsub, + formalLogOnePlusProductArgumentLeftPositions_choiceFromMixedLeft hLsub] + +/-- +Establishes the identity `(formalLogOnePlusProductArgumentBasicFactorLabelCountChoices q e).card = +(formalLogOnePlusProductArgumentMixedLeftChoices q (e (0 : Fin 2)) (e (1 : Fin 2))).card`. +-/ +theorem formalLogOnePlusProductArgumentBasicFactorLabelCountChoices_card_eq_mixedLeftChoices_card + {q : ℕ} {e : Fin 2 →₀ ℕ} + (hleft : e (0 : Fin 2) ≤ q) (hright : e (1 : Fin 2) ≤ q) + (hsum : q ≤ e (0 : Fin 2) + e (1 : Fin 2)) : + (formalLogOnePlusProductArgumentBasicFactorLabelCountChoices q e).card = + (formalLogOnePlusProductArgumentMixedLeftChoices q + (e (0 : Fin 2)) (e (1 : Fin 2))).card := by + refine Finset.card_bij' + (fun l _ => + (⟨formalLogOnePlusProductArgumentMixedPositions q l, + formalLogOnePlusProductArgumentLeftPositions q l⟩ : + Σ _ : Finset ℕ, Finset ℕ)) + (fun P _ => formalLogOnePlusProductArgumentChoiceFromMixedLeft q P.1 P.2) + ?_ ?_ ?_ ?_ + · intro l hl + exact formalLogOnePlusProductArgument_toMixedLeft_mem hl + · intro P hP + exact formalLogOnePlusProductArgument_fromMixedLeft_mem + hleft hright hsum hP + · intro l hl + exact formalLogOnePlusProductArgument_from_to_choice hl + · intro P hP + exact formalLogOnePlusProductArgument_to_from_pair hP + +/-- Under the coordinate bounds, every label-count choice is a valid basic-factor choice. -/ +theorem formalLogOnePlusProductArgumentBasicFactorLabelCountChoices_subset_choices + {q : ℕ} {e : Fin 2 →₀ ℕ} + (hleft : e (0 : Fin 2) ≤ q) (hright : e (1 : Fin 2) ≤ q) + (hsum : q ≤ e (0 : Fin 2) + e (1 : Fin 2)) : + formalLogOnePlusProductArgumentBasicFactorLabelCountChoices q e ⊆ + formalLogOnePlusProductArgumentBasicFactorChoices q e := by + intro l hl + rw [mem_formalLogOnePlusProductArgumentBasicFactorLabelCountChoices] at hl + rw [mem_formalLogOnePlusProductArgumentBasicFactorChoices] + rcases hl with ⟨hprod, hlabel0, hlabel1, hlabel2⟩ + rw [mem_formalLogOnePlusProductArgumentBasicFactorProductChoices] at hprod + rcases hprod with ⟨hsupp, hbasic⟩ + refine ⟨?_, hbasic⟩ + rw [Finset.mem_finsuppAntidiag] + refine ⟨?_, hsupp⟩ + ext j + fin_cases j + · rw [Finsupp.finsetSum_apply] + have hcoord := + formalLogOnePlusProductArgument_leftCoord_sum_eq_choiceCounts + (q := q) (l := l) hbasic + have hleftCount : + formalLogOnePlusProductArgumentLeftChoiceCount q l = + q - e (1 : Fin 2) := by + rw [formalLogOnePlusProductArgument_leftChoiceCount_eq_labelCount_zero] + exact hlabel0 + have hmixedCount : + formalLogOnePlusProductArgumentMixedChoiceCount q l = + e (0 : Fin 2) + e (1 : Fin 2) - q := by + rw [formalLogOnePlusProductArgument_mixedChoiceCount_eq_labelCount_two + hbasic] + exact hlabel2 + have htarget : + (∑ i ∈ Finset.range q, (l i) (0 : Fin 2)) = + e (0 : Fin 2) := by + rw [hcoord, hleftCount, hmixedCount] + omega + simpa using htarget + · rw [Finsupp.finsetSum_apply] + have hcoord := + formalLogOnePlusProductArgument_rightCoord_sum_eq_choiceCounts + (q := q) (l := l) hbasic + have hrightCount : + formalLogOnePlusProductArgumentRightChoiceCount q l = + q - e (0 : Fin 2) := by + rw [formalLogOnePlusProductArgument_rightChoiceCount_eq_labelCount_one] + exact hlabel1 + have hmixedCount : + formalLogOnePlusProductArgumentMixedChoiceCount q l = + e (0 : Fin 2) + e (1 : Fin 2) - q := by + rw [formalLogOnePlusProductArgument_mixedChoiceCount_eq_labelCount_two + hbasic] + exact hlabel2 + have htarget : + (∑ i ∈ Finset.range q, (l i) (1 : Fin 2)) = + e (1 : Fin 2) := by + rw [hcoord, hrightCount, hmixedCount] + omega + simpa using htarget + +/-- +Establishes the identity `(formalLogOnePlusProductArgumentBasicFactorChoices q e).card = +Nat.choose q (e (0 : Fin 2) + e (1 : Fin 2) - q) * Nat.choose (q - (e (0 : Fin 2) + e (1 : Fin 2) +- q)) (q - e (1 : Fin 2))`. +-/ +theorem formalLogOnePlusProductArgumentBasicFactorChoices_card_eq_choose_mul_choose + {q : ℕ} {e : Fin 2 →₀ ℕ} + (hleft : e (0 : Fin 2) ≤ q) (hright : e (1 : Fin 2) ≤ q) + (hsum : q ≤ e (0 : Fin 2) + e (1 : Fin 2)) : + (formalLogOnePlusProductArgumentBasicFactorChoices q e).card = + Nat.choose q (e (0 : Fin 2) + e (1 : Fin 2) - q) * + Nat.choose + (q - (e (0 : Fin 2) + e (1 : Fin 2) - q)) + (q - e (1 : Fin 2)) := by + have hEq : + formalLogOnePlusProductArgumentBasicFactorChoices q e = + formalLogOnePlusProductArgumentBasicFactorLabelCountChoices q e := by + apply Finset.Subset.antisymm + · exact + formalLogOnePlusProductArgumentBasicFactorChoices_subset_labelCountChoices + q e + · exact + formalLogOnePlusProductArgumentBasicFactorLabelCountChoices_subset_choices + hleft hright hsum + rw [hEq] + rw [formalLogOnePlusProductArgumentBasicFactorLabelCountChoices_card_eq_mixedLeftChoices_card + hleft hright hsum] + rw [formalLogOnePlusProductArgumentMixedLeftChoices_card] + +/-- Proves the bound `e (0 : Fin 2) ≤ q`. -/ +theorem formalLogOnePlusProductArgument_choiceCounts_left_coord_le_q + {q : ℕ} {e : Fin 2 →₀ ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hl : l ∈ Finset.finsuppAntidiag (Finset.range q) e) + (hbasic : ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i)) : + e (0 : Fin 2) ≤ q := by + rcases formalLogOnePlusProductArgument_choiceCounts_system + hl hbasic with ⟨hleft, _hright, htotal⟩ + have hq : + q = + e (0 : Fin 2) + + formalLogOnePlusProductArgumentRightChoiceCount q l := by + calc + q = + formalLogOnePlusProductArgumentLeftChoiceCount q l + + formalLogOnePlusProductArgumentRightChoiceCount q l + + formalLogOnePlusProductArgumentMixedChoiceCount q l := htotal.symm + _ = + (formalLogOnePlusProductArgumentLeftChoiceCount q l + + formalLogOnePlusProductArgumentMixedChoiceCount q l) + + formalLogOnePlusProductArgumentRightChoiceCount q l := by + simp only [Nat.add_assoc, Nat.add_left_comm, Nat.add_comm] + _ = + e (0 : Fin 2) + + formalLogOnePlusProductArgumentRightChoiceCount q l := by + rw [hleft] + exact Nat.le.intro hq.symm + +/-- Proves the bound `e (1 : Fin 2) ≤ q`. -/ +theorem formalLogOnePlusProductArgument_choiceCounts_right_coord_le_q + {q : ℕ} {e : Fin 2 →₀ ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hl : l ∈ Finset.finsuppAntidiag (Finset.range q) e) + (hbasic : ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i)) : + e (1 : Fin 2) ≤ q := by + rcases formalLogOnePlusProductArgument_choiceCounts_system + hl hbasic with ⟨_hleft, hright, htotal⟩ + have hq : + q = + e (1 : Fin 2) + + formalLogOnePlusProductArgumentLeftChoiceCount q l := by + calc + q = + formalLogOnePlusProductArgumentLeftChoiceCount q l + + formalLogOnePlusProductArgumentRightChoiceCount q l + + formalLogOnePlusProductArgumentMixedChoiceCount q l := htotal.symm + _ = + (formalLogOnePlusProductArgumentRightChoiceCount q l + + formalLogOnePlusProductArgumentMixedChoiceCount q l) + + formalLogOnePlusProductArgumentLeftChoiceCount q l := by + simp only [Nat.add_left_comm, Nat.add_comm] + _ = + e (1 : Fin 2) + + formalLogOnePlusProductArgumentLeftChoiceCount q l := by + rw [hright] + exact Nat.le.intro hq.symm + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase.lean new file mode 100644 index 0000000000..874e833942 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.BasicFactors +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoiceCountSystem +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoicePositions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ExplicitChoiceCounts +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.PowerSeriesComposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ProductArgument + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/BasicFactors.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/BasicFactors.lean new file mode 100644 index 0000000000..f06e409000 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/BasicFactors.lean @@ -0,0 +1,337 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ProductArgument +/-! +# Basic factors in the formal logarithm product argument + +This module packages the three possible nonzero monomial factors and their +finite choice spaces. +-/ + +@[expose] public section + +noncomputable +section + +attribute [local instance] Classical.propDecidable + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +/-- The three exponent vectors with nonzero coefficient in `X + Y + XY`. -/ +def formalLogOnePlusProductArgumentBasicFactor + (m : Fin 2 →₀ ℕ) : Prop := + m = Finsupp.single (0 : Fin 2) 1 ∨ + m = Finsupp.single (1 : Fin 2) 1 ∨ + m = + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1 + +/-- The finite set of the left, right, and mixed basic exponent vectors. -/ +noncomputable def formalLogOnePlusProductArgumentBasicFactorFinset : + Finset (Fin 2 →₀ ℕ) := by + classical + exact + {Finsupp.single (0 : Fin 2) 1, + Finsupp.single (1 : Fin 2) 1, + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1} + +/-- +Characterizes `m ∈ formalLogOnePlusProductArgumentBasicFactorFinset` by the equivalent condition +`formalLogOnePlusProductArgumentBasicFactor m`. +-/ +theorem mem_formalLogOnePlusProductArgumentBasicFactorFinset + {m : Fin 2 →₀ ℕ} : + m ∈ formalLogOnePlusProductArgumentBasicFactorFinset ↔ + formalLogOnePlusProductArgumentBasicFactor m := by + classical + simp [formalLogOnePlusProductArgumentBasicFactorFinset, + formalLogOnePlusProductArgumentBasicFactor] + +/-- Establishes the identity `formalLogOnePlusProductArgumentBasicFactorFinset.card = 3`. -/ +@[simp] theorem formalLogOnePlusProductArgumentBasicFactorFinset_card : + formalLogOnePlusProductArgumentBasicFactorFinset.card = 3 := by + classical + simp [formalLogOnePlusProductArgumentBasicFactorFinset, + finsupp_fin_two_single_left_ne_single_right] + +/-- Labels the left, right, and mixed basic factors by `0`, `1`, and `2`. +Non-basic inputs receive the mixed label; all uses that recover a factor from +its label therefore carry a basic-factor hypothesis. -/ +def formalLogOnePlusProductArgumentBasicFactorLabel + (m : Fin 2 →₀ ℕ) : Fin 3 := + if m = Finsupp.single (0 : Fin 2) 1 then 0 + else if m = Finsupp.single (1 : Fin 2) 1 then 1 + else 2 + +/-- +Establishes the identity `formalLogOnePlusProductArgumentBasicFactorLabel (Finsupp.single (0 : Fin +2) 1) = 0`. +-/ +@[simp] theorem formalLogOnePlusProductArgumentBasicFactorLabel_left : + formalLogOnePlusProductArgumentBasicFactorLabel + (Finsupp.single (0 : Fin 2) 1) = 0 := by + simp [formalLogOnePlusProductArgumentBasicFactorLabel] + +/-- +Establishes the identity `formalLogOnePlusProductArgumentBasicFactorLabel (Finsupp.single (1 : Fin +2) 1) = 1`. +-/ +@[simp] theorem formalLogOnePlusProductArgumentBasicFactorLabel_right : + formalLogOnePlusProductArgumentBasicFactorLabel + (Finsupp.single (1 : Fin 2) 1) = 1 := by + simp [formalLogOnePlusProductArgumentBasicFactorLabel, + finsupp_fin_two_single_left_ne_single_right.symm] + +/-- +Establishes the identity `formalLogOnePlusProductArgumentBasicFactorLabel (Finsupp.single (0 : Fin +2) 1 + Finsupp.single (1 : Fin 2) 1) = 2`. +-/ +@[simp] theorem formalLogOnePlusProductArgumentBasicFactorLabel_mixed : + formalLogOnePlusProductArgumentBasicFactorLabel + (Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1) = 2 := by + simp [formalLogOnePlusProductArgumentBasicFactorLabel, + finsupp_fin_two_single_left_ne_mixed.symm, + finsupp_fin_two_single_right_ne_mixed.symm] + +/-- +Characterizes `formalLogOnePlusProductArgumentBasicFactorLabel m = (0 : Fin 3)` by the equivalent +condition `m = Finsupp.single (0 : Fin 2) 1`. +-/ +theorem formalLogOnePlusProductArgumentBasicFactorLabel_eq_zero + {m : Fin 2 →₀ ℕ} : + formalLogOnePlusProductArgumentBasicFactorLabel m = (0 : Fin 3) ↔ + m = Finsupp.single (0 : Fin 2) 1 := by + unfold formalLogOnePlusProductArgumentBasicFactorLabel + by_cases hleft : m = Finsupp.single (0 : Fin 2) 1 + · simp [hleft] + · by_cases hright : m = Finsupp.single (1 : Fin 2) 1 + · simp [hright] + · simp [hleft, hright] + +/-- +Characterizes `formalLogOnePlusProductArgumentBasicFactorLabel m = (1 : Fin 3)` by the equivalent +condition `m = Finsupp.single (1 : Fin 2) 1`. +-/ +theorem formalLogOnePlusProductArgumentBasicFactorLabel_eq_one + {m : Fin 2 →₀ ℕ} : + formalLogOnePlusProductArgumentBasicFactorLabel m = (1 : Fin 3) ↔ + m = Finsupp.single (1 : Fin 2) 1 := by + unfold formalLogOnePlusProductArgumentBasicFactorLabel + by_cases hleft : m = Finsupp.single (0 : Fin 2) 1 + · simp [hleft, finsupp_fin_two_single_left_ne_single_right] + · by_cases hright : m = Finsupp.single (1 : Fin 2) 1 + · have hrightLeft : + Finsupp.single (1 : Fin 2) 1 ≠ + Finsupp.single (0 : Fin 2) 1 := + finsupp_fin_two_single_left_ne_single_right.symm + simp [hright, hrightLeft] + · simp [hleft, hright] + +/-- Finitely supported sequences of `q` basic factors. -/ +noncomputable def formalLogOnePlusProductArgumentBasicFactorProductChoices + (q : ℕ) : Finset (ℕ →₀ (Fin 2 →₀ ℕ)) := by + classical + exact + (Finset.range q).finsupp + (fun _ => formalLogOnePlusProductArgumentBasicFactorFinset) + +/-- +Characterizes `l ∈ formalLogOnePlusProductArgumentBasicFactorProductChoices q` by the equivalent +condition `l.support ⊆ Finset.range q ∧ ∀ i ∈ Finset.range q, +formalLogOnePlusProductArgumentBasicFactor (l i)`. +-/ +theorem mem_formalLogOnePlusProductArgumentBasicFactorProductChoices + {q : ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} : + l ∈ formalLogOnePlusProductArgumentBasicFactorProductChoices q ↔ + l.support ⊆ Finset.range q ∧ + ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i) := by + classical + rw [formalLogOnePlusProductArgumentBasicFactorProductChoices, + Finset.mem_finsupp_iff] + constructor + · intro h + exact + ⟨h.1, fun i hi => + mem_formalLogOnePlusProductArgumentBasicFactorFinset.1 + (h.2 i hi)⟩ + · intro h + exact + ⟨h.1, fun i hi => + mem_formalLogOnePlusProductArgumentBasicFactorFinset.2 + (h.2 i hi)⟩ + +/-- +Establishes the identity `(formalLogOnePlusProductArgumentBasicFactorProductChoices q).card = 3 ^ +q`. +-/ +theorem formalLogOnePlusProductArgumentBasicFactorProductChoices_card + (q : ℕ) : + (formalLogOnePlusProductArgumentBasicFactorProductChoices q).card = + 3 ^ q := by + classical + rw [formalLogOnePlusProductArgumentBasicFactorProductChoices, + Finset.card_finsupp] + simp + +/-- Sequences of `q` basic factors whose exponent-vector sum is `e`. -/ +noncomputable def formalLogOnePlusProductArgumentBasicFactorChoices + (q : ℕ) (e : Fin 2 →₀ ℕ) : + Finset (ℕ →₀ (Fin 2 →₀ ℕ)) := by + classical + exact + (Finset.finsuppAntidiag (Finset.range q) e).filter + (fun l : ℕ →₀ (Fin 2 →₀ ℕ) => + ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i)) + +/-- +Characterizes `l ∈ formalLogOnePlusProductArgumentBasicFactorChoices q e` by the equivalent +condition `l ∈ Finset.finsuppAntidiag (Finset.range q) e ∧ ∀ i ∈ Finset.range q, +formalLogOnePlusProductArgumentBasicFactor (l i)`. +-/ +theorem mem_formalLogOnePlusProductArgumentBasicFactorChoices + {q : ℕ} {e : Fin 2 →₀ ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} : + l ∈ formalLogOnePlusProductArgumentBasicFactorChoices q e ↔ + l ∈ Finset.finsuppAntidiag (Finset.range q) e ∧ + ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i) := by + classical + simp [formalLogOnePlusProductArgumentBasicFactorChoices] + +/-- Proves the bound `(formalLogOnePlusProductArgumentBasicFactorChoices q e).card ≤ 3 ^ q`. -/ +theorem formalLogOnePlusProductArgumentBasicFactorChoices_card_le_three_pow + (q : ℕ) (e : Fin 2 →₀ ℕ) : + (formalLogOnePlusProductArgumentBasicFactorChoices q e).card ≤ 3 ^ q := by + classical + calc + (formalLogOnePlusProductArgumentBasicFactorChoices q e).card ≤ + (formalLogOnePlusProductArgumentBasicFactorProductChoices q).card := by + apply Finset.card_le_card + intro l hl + rw [mem_formalLogOnePlusProductArgumentBasicFactorProductChoices] + rw [mem_formalLogOnePlusProductArgumentBasicFactorChoices] at hl + exact ⟨(Finset.mem_finsuppAntidiag.mp hl.1).2, hl.2⟩ + _ = 3 ^ q := + formalLogOnePlusProductArgumentBasicFactorProductChoices_card q + +/-- The number of left factors among the first `q` entries of `l`. -/ +def formalLogOnePlusProductArgumentLeftChoiceCount + (q : ℕ) (l : ℕ →₀ (Fin 2 →₀ ℕ)) : ℕ := + ∑ i ∈ Finset.range q, + if l i = Finsupp.single (0 : Fin 2) 1 then 1 else 0 + +/-- The number of right factors among the first `q` entries of `l`. -/ +def formalLogOnePlusProductArgumentRightChoiceCount + (q : ℕ) (l : ℕ →₀ (Fin 2 →₀ ℕ)) : ℕ := + ∑ i ∈ Finset.range q, + if l i = Finsupp.single (1 : Fin 2) 1 then 1 else 0 + +/-- The number of mixed factors among the first `q` entries of `l`. -/ +def formalLogOnePlusProductArgumentMixedChoiceCount + (q : ℕ) (l : ℕ →₀ (Fin 2 →₀ ℕ)) : ℕ := + ∑ i ∈ Finset.range q, + if l i = + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1 + then 1 else 0 + +/-- The number of entries among the first `q` positions with label `j`. -/ +def formalLogOnePlusProductArgumentBasicFactorLabelCount + (q : ℕ) (l : ℕ →₀ (Fin 2 →₀ ℕ)) (j : Fin 3) : ℕ := + ∑ i ∈ Finset.range q, + if formalLogOnePlusProductArgumentBasicFactorLabel (l i) = j + then 1 else 0 + +/-- +Establishes the identity `formalLogOnePlusProductArgumentLeftChoiceCount q l = +formalLogOnePlusProductArgumentBasicFactorLabelCount q l 0`. +-/ +theorem formalLogOnePlusProductArgument_leftChoiceCount_eq_labelCount_zero + (q : ℕ) (l : ℕ →₀ (Fin 2 →₀ ℕ)) : + formalLogOnePlusProductArgumentLeftChoiceCount q l = + formalLogOnePlusProductArgumentBasicFactorLabelCount q l 0 := by + classical + rw [formalLogOnePlusProductArgumentLeftChoiceCount, + formalLogOnePlusProductArgumentBasicFactorLabelCount] + apply Finset.sum_congr rfl + intro i _hi + by_cases hleft : l i = Finsupp.single (0 : Fin 2) 1 + · simp [hleft] + · have hlabel : + formalLogOnePlusProductArgumentBasicFactorLabel (l i) ≠ + (0 : Fin 3) := by + intro hzero + exact hleft + (formalLogOnePlusProductArgumentBasicFactorLabel_eq_zero.1 hzero) + simp [hleft, hlabel] + +/-- +Establishes the identity `formalLogOnePlusProductArgumentRightChoiceCount q l = +formalLogOnePlusProductArgumentBasicFactorLabelCount q l 1`. +-/ +theorem formalLogOnePlusProductArgument_rightChoiceCount_eq_labelCount_one + (q : ℕ) (l : ℕ →₀ (Fin 2 →₀ ℕ)) : + formalLogOnePlusProductArgumentRightChoiceCount q l = + formalLogOnePlusProductArgumentBasicFactorLabelCount q l 1 := by + classical + rw [formalLogOnePlusProductArgumentRightChoiceCount, + formalLogOnePlusProductArgumentBasicFactorLabelCount] + apply Finset.sum_congr rfl + intro i _hi + by_cases hright : l i = Finsupp.single (1 : Fin 2) 1 + · simp [hright] + · have hlabel : + formalLogOnePlusProductArgumentBasicFactorLabel (l i) ≠ + (1 : Fin 3) := by + intro hone + exact hright + (formalLogOnePlusProductArgumentBasicFactorLabel_eq_one.1 hone) + simp [hright, hlabel] + +/-- +Establishes the identity `formalLogOnePlusProductArgumentMixedChoiceCount q l = +formalLogOnePlusProductArgumentBasicFactorLabelCount q l 2`. +-/ +theorem formalLogOnePlusProductArgument_mixedChoiceCount_eq_labelCount_two + {q : ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hbasic : ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i)) : + formalLogOnePlusProductArgumentMixedChoiceCount q l = + formalLogOnePlusProductArgumentBasicFactorLabelCount q l 2 := by + classical + rw [formalLogOnePlusProductArgumentMixedChoiceCount, + formalLogOnePlusProductArgumentBasicFactorLabelCount] + apply Finset.sum_congr rfl + intro i hi + by_cases hmixed : + l i = + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1 + · simp [hmixed] + · have hlabel : + formalLogOnePlusProductArgumentBasicFactorLabel (l i) ≠ + (2 : Fin 3) := by + intro htwo + rcases hbasic i hi with hleft | hright | hmixed' + · rw [hleft] at htwo + simp at htwo + · rw [hright] at htwo + simp at htwo + · exact hmixed hmixed' + simp [hmixed, hlabel] + + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoiceCountSystem.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoiceCountSystem.lean new file mode 100644 index 0000000000..96aef87496 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoiceCountSystem.lean @@ -0,0 +1,282 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.BasicFactors +/-! +# Coordinate equations for basic-factor choices + +This module derives the three coordinate and total-count equations satisfied by +a choice of the basic factors in `X + Y + XY`. +-/ + +@[expose] public section + +noncomputable +section + +attribute [local instance] Classical.propDecidable + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +/-- Basic-factor sequences with the three label counts forced by `q` and the +target exponent vector `e`. -/ +noncomputable def formalLogOnePlusProductArgumentBasicFactorLabelCountChoices + (q : ℕ) (e : Fin 2 →₀ ℕ) : + Finset (ℕ →₀ (Fin 2 →₀ ℕ)) := + (formalLogOnePlusProductArgumentBasicFactorProductChoices q).filter + (fun l => + formalLogOnePlusProductArgumentBasicFactorLabelCount q l 0 = + q - e (1 : Fin 2) ∧ + formalLogOnePlusProductArgumentBasicFactorLabelCount q l 1 = + q - e (0 : Fin 2) ∧ + formalLogOnePlusProductArgumentBasicFactorLabelCount q l 2 = + e (0 : Fin 2) + e (1 : Fin 2) - q) + +/-- +Characterizes `l ∈ formalLogOnePlusProductArgumentBasicFactorLabelCountChoices q e` by the +equivalent condition `l ∈ formalLogOnePlusProductArgumentBasicFactorProductChoices q ∧ +formalLogOnePlusProductArgumentBasicFactorLabelCount q l 0 = q - e (1 : Fin 2) ∧ +formalLogOnePlusProductArgumentBasicFactorLabelCount q l 1 = q - e (0 : Fin 2) ∧ +formalLogOnePlusProductArgumentBasicFactorLabelCount q l 2 = e (0 : Fin 2) + e (1 : Fin 2) - q`. +-/ +theorem mem_formalLogOnePlusProductArgumentBasicFactorLabelCountChoices + {q : ℕ} {e : Fin 2 →₀ ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} : + l ∈ formalLogOnePlusProductArgumentBasicFactorLabelCountChoices q e ↔ + l ∈ formalLogOnePlusProductArgumentBasicFactorProductChoices q ∧ + formalLogOnePlusProductArgumentBasicFactorLabelCount q l 0 = + q - e (1 : Fin 2) ∧ + formalLogOnePlusProductArgumentBasicFactorLabelCount q l 1 = + q - e (0 : Fin 2) ∧ + formalLogOnePlusProductArgumentBasicFactorLabelCount q l 2 = + e (0 : Fin 2) + e (1 : Fin 2) - q := by + classical + simp [formalLogOnePlusProductArgumentBasicFactorLabelCountChoices] + +/-- +Establishes the identity `m (0 : Fin 2) = (if m = Finsupp.single (0 : Fin 2) 1 then 1 else 0) + +(if m = Finsupp.single (0 : Fin 2) 1 + Finsupp.single (1 : Fin 2) 1 then 1 else 0)`. +-/ +theorem formalLogOnePlusProductArgumentBasicFactor_left_coord + {m : Fin 2 →₀ ℕ} + (hm : formalLogOnePlusProductArgumentBasicFactor m) : + m (0 : Fin 2) = + (if m = Finsupp.single (0 : Fin 2) 1 then 1 else 0) + + (if m = + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1 + then 1 else 0) := by + rcases hm with hleft | hright | hmixed + · simp [hleft] + · have hrightLeft : + Finsupp.single (1 : Fin 2) 1 ≠ + Finsupp.single (0 : Fin 2) 1 := + finsupp_fin_two_single_left_ne_single_right.symm + simp [hright, hrightLeft] + · have hmixedLeft : + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1 ≠ + Finsupp.single (0 : Fin 2) 1 := + finsupp_fin_two_single_left_ne_mixed.symm + simp [hmixed, hmixedLeft] + +/-- +Establishes the identity `m (1 : Fin 2) = (if m = Finsupp.single (1 : Fin 2) 1 then 1 else 0) + +(if m = Finsupp.single (0 : Fin 2) 1 + Finsupp.single (1 : Fin 2) 1 then 1 else 0)`. +-/ +theorem formalLogOnePlusProductArgumentBasicFactor_right_coord + {m : Fin 2 →₀ ℕ} + (hm : formalLogOnePlusProductArgumentBasicFactor m) : + m (1 : Fin 2) = + (if m = Finsupp.single (1 : Fin 2) 1 then 1 else 0) + + (if m = + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1 + then 1 else 0) := by + rcases hm with hleft | hright | hmixed + · simp [hleft, finsupp_fin_two_single_left_ne_single_right] + · simp [hright] + · have hmixedRight : + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1 ≠ + Finsupp.single (1 : Fin 2) 1 := + finsupp_fin_two_single_right_ne_mixed.symm + simp [hmixed, hmixedRight] + +/-- +Establishes the identity `(if m = Finsupp.single (0 : Fin 2) 1 then 1 else 0) + (if m = +Finsupp.single (1 : Fin 2) 1 then 1 else 0) + (if m = Finsupp.single (0 : Fin 2) 1 + +Finsupp.single (1 : Fin 2) 1 then 1 else 0) = 1`. +-/ +theorem formalLogOnePlusProductArgumentBasicFactor_total_indicator + {m : Fin 2 →₀ ℕ} + (hm : formalLogOnePlusProductArgumentBasicFactor m) : + (if m = Finsupp.single (0 : Fin 2) 1 then 1 else 0) + + (if m = Finsupp.single (1 : Fin 2) 1 then 1 else 0) + + (if m = + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1 + then 1 else 0) = + 1 := by + rcases hm with hleft | hright | hmixed + · simp [hleft, finsupp_fin_two_single_left_ne_single_right] + · have hrightLeft : + Finsupp.single (1 : Fin 2) 1 ≠ + Finsupp.single (0 : Fin 2) 1 := + finsupp_fin_two_single_left_ne_single_right.symm + simp [hright, hrightLeft] + · have hmixedLeft : + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1 ≠ + Finsupp.single (0 : Fin 2) 1 := + finsupp_fin_two_single_left_ne_mixed.symm + have hmixedRight : + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1 ≠ + Finsupp.single (1 : Fin 2) 1 := + finsupp_fin_two_single_right_ne_mixed.symm + simp [hmixed, hmixedLeft, hmixedRight] + +/-- +Establishes the identity `(∑ i ∈ Finset.range q, l i (0 : Fin 2)) = +formalLogOnePlusProductArgumentLeftChoiceCount q l + +formalLogOnePlusProductArgumentMixedChoiceCount q l`. +-/ +theorem formalLogOnePlusProductArgument_leftCoord_sum_eq_choiceCounts + {q : ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hbasic : ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i)) : + (∑ i ∈ Finset.range q, l i (0 : Fin 2)) = + formalLogOnePlusProductArgumentLeftChoiceCount q l + + formalLogOnePlusProductArgumentMixedChoiceCount q l := by + rw [formalLogOnePlusProductArgumentLeftChoiceCount, + formalLogOnePlusProductArgumentMixedChoiceCount, ← Finset.sum_add_distrib] + apply Finset.sum_congr rfl + intro i hi + exact formalLogOnePlusProductArgumentBasicFactor_left_coord (hbasic i hi) + +/-- +Establishes the identity `(∑ i ∈ Finset.range q, l i (1 : Fin 2)) = +formalLogOnePlusProductArgumentRightChoiceCount q l + +formalLogOnePlusProductArgumentMixedChoiceCount q l`. +-/ +theorem formalLogOnePlusProductArgument_rightCoord_sum_eq_choiceCounts + {q : ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hbasic : ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i)) : + (∑ i ∈ Finset.range q, l i (1 : Fin 2)) = + formalLogOnePlusProductArgumentRightChoiceCount q l + + formalLogOnePlusProductArgumentMixedChoiceCount q l := by + rw [formalLogOnePlusProductArgumentRightChoiceCount, + formalLogOnePlusProductArgumentMixedChoiceCount, ← Finset.sum_add_distrib] + apply Finset.sum_congr rfl + intro i hi + exact formalLogOnePlusProductArgumentBasicFactor_right_coord (hbasic i hi) + +/-- +Establishes the identity `formalLogOnePlusProductArgumentLeftChoiceCount q l + +formalLogOnePlusProductArgumentRightChoiceCount q l + +formalLogOnePlusProductArgumentMixedChoiceCount q l = q`. +-/ +theorem formalLogOnePlusProductArgument_totalChoiceCount_eq + {q : ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hbasic : ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i)) : + formalLogOnePlusProductArgumentLeftChoiceCount q l + + formalLogOnePlusProductArgumentRightChoiceCount q l + + formalLogOnePlusProductArgumentMixedChoiceCount q l = + q := by + rw [formalLogOnePlusProductArgumentLeftChoiceCount, + formalLogOnePlusProductArgumentRightChoiceCount, + formalLogOnePlusProductArgumentMixedChoiceCount, + ← Finset.sum_add_distrib, ← Finset.sum_add_distrib] + calc + (∑ i ∈ Finset.range q, + (((if l i = Finsupp.single (0 : Fin 2) 1 then 1 else 0) + + (if l i = Finsupp.single (1 : Fin 2) 1 then 1 else 0)) + + (if l i = + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1 + then 1 else 0))) = + (∑ i ∈ Finset.range q, (1 : ℕ)) := by + apply Finset.sum_congr rfl + intro i hi + exact formalLogOnePlusProductArgumentBasicFactor_total_indicator + (hbasic i hi) + _ = q := by simp + +/-- +Establishes the identity `formalLogOnePlusProductArgumentLeftChoiceCount q l + +formalLogOnePlusProductArgumentMixedChoiceCount q l = e (0 : Fin 2)`. +-/ +theorem formalLogOnePlusProductArgument_choiceCounts_left_add_mixed_eq + {q : ℕ} {e : Fin 2 →₀ ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hl : l ∈ Finset.finsuppAntidiag (Finset.range q) e) + (hbasic : ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i)) : + formalLogOnePlusProductArgumentLeftChoiceCount q l + + formalLogOnePlusProductArgumentMixedChoiceCount q l = + e (0 : Fin 2) := by + rw [← formalLogOnePlusProductArgument_leftCoord_sum_eq_choiceCounts hbasic] + have hsum := (Finset.mem_finsuppAntidiag.mp hl).1 + simpa [Finsupp.finsetSum_apply] using + congrArg (fun m : Fin 2 →₀ ℕ => m (0 : Fin 2)) hsum + +/-- +Establishes the identity `formalLogOnePlusProductArgumentRightChoiceCount q l + +formalLogOnePlusProductArgumentMixedChoiceCount q l = e (1 : Fin 2)`. +-/ +theorem formalLogOnePlusProductArgument_choiceCounts_right_add_mixed_eq + {q : ℕ} {e : Fin 2 →₀ ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hl : l ∈ Finset.finsuppAntidiag (Finset.range q) e) + (hbasic : ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i)) : + formalLogOnePlusProductArgumentRightChoiceCount q l + + formalLogOnePlusProductArgumentMixedChoiceCount q l = + e (1 : Fin 2) := by + rw [← formalLogOnePlusProductArgument_rightCoord_sum_eq_choiceCounts hbasic] + have hsum := (Finset.mem_finsuppAntidiag.mp hl).1 + simpa [Finsupp.finsetSum_apply] using + congrArg (fun m : Fin 2 →₀ ℕ => m (1 : Fin 2)) hsum + +/-- +Establishes the identity `formalLogOnePlusProductArgumentLeftChoiceCount q l + +formalLogOnePlusProductArgumentMixedChoiceCount q l = e (0 : Fin 2) ∧ +formalLogOnePlusProductArgumentRightChoiceCount q l + +formalLogOnePlusProductArgumentMixedChoiceCount q l = e (1 : Fin 2) ∧ +formalLogOnePlusProductArgumentLeftChoiceCount q l + +formalLogOnePlusProductArgumentRightChoiceCount q l + +formalLogOnePlusProductArgumentMixedChoiceCount q l = q`. +-/ +theorem formalLogOnePlusProductArgument_choiceCounts_system + {q : ℕ} {e : Fin 2 →₀ ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hl : l ∈ Finset.finsuppAntidiag (Finset.range q) e) + (hbasic : ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i)) : + formalLogOnePlusProductArgumentLeftChoiceCount q l + + formalLogOnePlusProductArgumentMixedChoiceCount q l = + e (0 : Fin 2) ∧ + formalLogOnePlusProductArgumentRightChoiceCount q l + + formalLogOnePlusProductArgumentMixedChoiceCount q l = + e (1 : Fin 2) ∧ + formalLogOnePlusProductArgumentLeftChoiceCount q l + + formalLogOnePlusProductArgumentRightChoiceCount q l + + formalLogOnePlusProductArgumentMixedChoiceCount q l = + q := by + exact + ⟨formalLogOnePlusProductArgument_choiceCounts_left_add_mixed_eq + hl hbasic, + formalLogOnePlusProductArgument_choiceCounts_right_add_mixed_eq + hl hbasic, + formalLogOnePlusProductArgument_totalChoiceCount_eq hbasic⟩ + + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoicePositions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoicePositions.lean new file mode 100644 index 0000000000..fc09b9a6e8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoicePositions.lean @@ -0,0 +1,281 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ExplicitChoiceCounts +/-! +# Realizing formal-product choices by position sets + +This module constructs a basic-factor choice from its mixed and left position +sets and proves the resulting position-count formulas. +-/ + +@[expose] public section + +noncomputable +section + +attribute [local instance] Classical.propDecidable + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +/-- The left basic exponent vector. -/ +noncomputable def formalLogOnePlusProductArgumentBasicFactorLeft : + Fin 2 →₀ ℕ := + Finsupp.single (0 : Fin 2) 1 + +/-- The right basic exponent vector. -/ +noncomputable def formalLogOnePlusProductArgumentBasicFactorRight : + Fin 2 →₀ ℕ := + Finsupp.single (1 : Fin 2) 1 + +/-- The mixed basic exponent vector. -/ +noncomputable def formalLogOnePlusProductArgumentBasicFactorMixed : + Fin 2 →₀ ℕ := + Finsupp.single (0 : Fin 2) 1 + Finsupp.single (1 : Fin 2) 1 + +/-- +Characterizes `formalLogOnePlusProductArgumentBasicFactorLabel m = (2 : Fin 3)` by the equivalent +condition `m = formalLogOnePlusProductArgumentBasicFactorMixed`. +-/ +theorem formalLogOnePlusProductArgumentBasicFactorLabel_eq_two_iff_of_basic + {m : Fin 2 →₀ ℕ} + (hm : formalLogOnePlusProductArgumentBasicFactor m) : + formalLogOnePlusProductArgumentBasicFactorLabel m = (2 : Fin 3) ↔ + m = formalLogOnePlusProductArgumentBasicFactorMixed := by + constructor + · intro h + rcases hm with hleft | hright | hmixed + · simp [hleft] at h + · simp [hright] at h + · simpa [formalLogOnePlusProductArgumentBasicFactorMixed] using hmixed + · intro h + simp [h, formalLogOnePlusProductArgumentBasicFactorMixed] + +/-- The basic-factor sequence with mixed positions `M`, left positions `L`, +and right factors in every remaining position below `q`. -/ +noncomputable def formalLogOnePlusProductArgumentChoiceFromMixedLeft + (q : ℕ) (M L : Finset ℕ) : ℕ →₀ (Fin 2 →₀ ℕ) := + Finsupp.onFinset (Finset.range q) + (fun i => + if i ∈ Finset.range q then + if i ∈ M then formalLogOnePlusProductArgumentBasicFactorMixed + else if i ∈ L then formalLogOnePlusProductArgumentBasicFactorLeft + else formalLogOnePlusProductArgumentBasicFactorRight + else 0) + (by + intro i hi + by_cases hq : i ∈ Finset.range q + · exact hq + · simp [hq] at hi) + +/-- +Establishes the identity `formalLogOnePlusProductArgumentChoiceFromMixedLeft q M L i = if i ∈ M +then formalLogOnePlusProductArgumentBasicFactorMixed else if i ∈ L then +formalLogOnePlusProductArgumentBasicFactorLeft else +formalLogOnePlusProductArgumentBasicFactorRight`. +-/ +@[simp] theorem formalLogOnePlusProductArgumentChoiceFromMixedLeft_apply_of_mem + {q : ℕ} {M L : Finset ℕ} {i : ℕ} (hi : i ∈ Finset.range q) : + formalLogOnePlusProductArgumentChoiceFromMixedLeft q M L i = + if i ∈ M then formalLogOnePlusProductArgumentBasicFactorMixed + else if i ∈ L then formalLogOnePlusProductArgumentBasicFactorLeft + else formalLogOnePlusProductArgumentBasicFactorRight := by + have hlt : i < q := Finset.mem_range.mp hi + simp [formalLogOnePlusProductArgumentChoiceFromMixedLeft, hlt] + +/-- Establishes the identity `formalLogOnePlusProductArgumentChoiceFromMixedLeft q M L i = 0`. -/ +@[simp] theorem formalLogOnePlusProductArgumentChoiceFromMixedLeft_apply_of_not_mem + {q : ℕ} {M L : Finset ℕ} {i : ℕ} (hi : i ∉ Finset.range q) : + formalLogOnePlusProductArgumentChoiceFromMixedLeft q M L i = 0 := by + have hle : q ≤ i := by simpa [Finset.mem_range] using hi + simp [formalLogOnePlusProductArgumentChoiceFromMixedLeft, hle] + +/-- Positions below `q` at which `l` has the mixed-factor label. -/ +noncomputable def formalLogOnePlusProductArgumentMixedPositions + (q : ℕ) (l : ℕ →₀ (Fin 2 →₀ ℕ)) : Finset ℕ := + (Finset.range q).filter fun i => + formalLogOnePlusProductArgumentBasicFactorLabel (l i) = (2 : Fin 3) + +/-- Positions below `q` at which `l` has the left-factor label. -/ +noncomputable def formalLogOnePlusProductArgumentLeftPositions + (q : ℕ) (l : ℕ →₀ (Fin 2 →₀ ℕ)) : Finset ℕ := + (Finset.range q).filter fun i => + formalLogOnePlusProductArgumentBasicFactorLabel (l i) = (0 : Fin 3) + +/-- Positions below `q` at which `l` has the right-factor label. -/ +noncomputable def formalLogOnePlusProductArgumentRightPositions + (q : ℕ) (l : ℕ →₀ (Fin 2 →₀ ℕ)) : Finset ℕ := + (Finset.range q).filter fun i => + formalLogOnePlusProductArgumentBasicFactorLabel (l i) = (1 : Fin 3) + +/-- +Establishes the identity `(formalLogOnePlusProductArgumentMixedPositions q l).card = +formalLogOnePlusProductArgumentBasicFactorLabelCount q l 2`. +-/ +theorem formalLogOnePlusProductArgumentMixedPositions_card + (q : ℕ) (l : ℕ →₀ (Fin 2 →₀ ℕ)) : + (formalLogOnePlusProductArgumentMixedPositions q l).card = + formalLogOnePlusProductArgumentBasicFactorLabelCount q l 2 := by + simp [formalLogOnePlusProductArgumentMixedPositions, + formalLogOnePlusProductArgumentBasicFactorLabelCount, Finset.sum_boole] + +/-- +Establishes the identity `(formalLogOnePlusProductArgumentLeftPositions q l).card = +formalLogOnePlusProductArgumentBasicFactorLabelCount q l 0`. +-/ +theorem formalLogOnePlusProductArgumentLeftPositions_card + (q : ℕ) (l : ℕ →₀ (Fin 2 →₀ ℕ)) : + (formalLogOnePlusProductArgumentLeftPositions q l).card = + formalLogOnePlusProductArgumentBasicFactorLabelCount q l 0 := by + simp [formalLogOnePlusProductArgumentLeftPositions, + formalLogOnePlusProductArgumentBasicFactorLabelCount, Finset.sum_boole] + +/-- +Establishes the identity `(formalLogOnePlusProductArgumentRightPositions q l).card = +formalLogOnePlusProductArgumentBasicFactorLabelCount q l 1`. +-/ +theorem formalLogOnePlusProductArgumentRightPositions_card + (q : ℕ) (l : ℕ →₀ (Fin 2 →₀ ℕ)) : + (formalLogOnePlusProductArgumentRightPositions q l).card = + formalLogOnePlusProductArgumentBasicFactorLabelCount q l 1 := by + simp [formalLogOnePlusProductArgumentRightPositions, + formalLogOnePlusProductArgumentBasicFactorLabelCount, Finset.sum_boole] + +/-- +Establishes the identity `formalLogOnePlusProductArgumentMixedPositions q +(formalLogOnePlusProductArgumentChoiceFromMixedLeft q M L) = M`. +-/ +theorem formalLogOnePlusProductArgumentMixedPositions_choiceFromMixedLeft + {q : ℕ} {M L : Finset ℕ} (hM : M ⊆ Finset.range q) : + formalLogOnePlusProductArgumentMixedPositions q + (formalLogOnePlusProductArgumentChoiceFromMixedLeft q M L) = M := by + ext i + constructor + · intro hi + have hq : i ∈ Finset.range q := (Finset.mem_filter.mp hi).1 + have hlabel : + formalLogOnePlusProductArgumentBasicFactorLabel + (formalLogOnePlusProductArgumentChoiceFromMixedLeft q M L i) = + (2 : Fin 3) := + (Finset.mem_filter.mp hi).2 + by_cases hMi : i ∈ M + · exact hMi + · by_cases hLi : i ∈ L + · simp [formalLogOnePlusProductArgumentChoiceFromMixedLeft_apply_of_mem hq, + hMi, hLi, formalLogOnePlusProductArgumentBasicFactorLeft] at hlabel + · simp [formalLogOnePlusProductArgumentChoiceFromMixedLeft_apply_of_mem hq, + hMi, hLi, formalLogOnePlusProductArgumentBasicFactorRight] at hlabel + · intro hMi + have hq : i ∈ Finset.range q := hM hMi + simp [formalLogOnePlusProductArgumentMixedPositions, hq, hMi, + formalLogOnePlusProductArgumentBasicFactorMixed] + +/-- +Establishes the identity `formalLogOnePlusProductArgumentLeftPositions q +(formalLogOnePlusProductArgumentChoiceFromMixedLeft q M L) = L`. +-/ +theorem formalLogOnePlusProductArgumentLeftPositions_choiceFromMixedLeft + {q : ℕ} {M L : Finset ℕ} (hL : L ⊆ Finset.range q \ M) : + formalLogOnePlusProductArgumentLeftPositions q + (formalLogOnePlusProductArgumentChoiceFromMixedLeft q M L) = L := by + ext i + constructor + · intro hi + have hq : i ∈ Finset.range q := (Finset.mem_filter.mp hi).1 + have hlabel : + formalLogOnePlusProductArgumentBasicFactorLabel + (formalLogOnePlusProductArgumentChoiceFromMixedLeft q M L i) = + (0 : Fin 3) := + (Finset.mem_filter.mp hi).2 + by_cases hMi : i ∈ M + · simp [formalLogOnePlusProductArgumentChoiceFromMixedLeft_apply_of_mem hq, + hMi, formalLogOnePlusProductArgumentBasicFactorMixed] at hlabel + · by_cases hLi : i ∈ L + · exact hLi + · simp [formalLogOnePlusProductArgumentChoiceFromMixedLeft_apply_of_mem hq, + hMi, hLi, formalLogOnePlusProductArgumentBasicFactorRight] at hlabel + · intro hLi + have hq : i ∈ Finset.range q := (Finset.mem_sdiff.mp (hL hLi)).1 + have hMi : i ∉ M := (Finset.mem_sdiff.mp (hL hLi)).2 + simp [formalLogOnePlusProductArgumentLeftPositions, hq, hMi, hLi, + formalLogOnePlusProductArgumentBasicFactorLeft] + +/-- +Establishes the identity `formalLogOnePlusProductArgumentRightPositions q +(formalLogOnePlusProductArgumentChoiceFromMixedLeft q M L) = Finset.range q \ (M ∪ L)`. +-/ +theorem formalLogOnePlusProductArgumentRightPositions_choiceFromMixedLeft + {q : ℕ} {M L : Finset ℕ} (hL : L ⊆ Finset.range q \ M) : + formalLogOnePlusProductArgumentRightPositions q + (formalLogOnePlusProductArgumentChoiceFromMixedLeft q M L) = + Finset.range q \ (M ∪ L) := by + ext i + constructor + · intro hi + rw [Finset.mem_sdiff] + have hq : i ∈ Finset.range q := (Finset.mem_filter.mp hi).1 + have hlabel : + formalLogOnePlusProductArgumentBasicFactorLabel + (formalLogOnePlusProductArgumentChoiceFromMixedLeft q M L i) = + (1 : Fin 3) := + (Finset.mem_filter.mp hi).2 + refine ⟨hq, ?_⟩ + rw [Finset.mem_union] + intro hML + rcases hML with hMi | hLi + · simp [formalLogOnePlusProductArgumentChoiceFromMixedLeft_apply_of_mem hq, + hMi, formalLogOnePlusProductArgumentBasicFactorMixed] at hlabel + · have hMi : i ∉ M := (Finset.mem_sdiff.mp (hL hLi)).2 + simp [formalLogOnePlusProductArgumentChoiceFromMixedLeft_apply_of_mem hq, + hMi, hLi, formalLogOnePlusProductArgumentBasicFactorLeft] at hlabel + · intro hi + rw [Finset.mem_sdiff] at hi + rcases hi with ⟨hq, hnot⟩ + have hMi : i ∉ M := by + intro h + exact hnot (Finset.mem_union_left L h) + have hLi : i ∉ L := by + intro h + exact hnot (Finset.mem_union_right M h) + simp [formalLogOnePlusProductArgumentRightPositions, hq, hMi, hLi, + formalLogOnePlusProductArgumentBasicFactorRight] + +/-- +Establishes the identity `(formalLogOnePlusProductArgumentRightPositions q +(formalLogOnePlusProductArgumentChoiceFromMixedLeft q M L)).card = q - a`. +-/ +theorem formalLogOnePlusProductArgumentRightPositions_choiceFromMixedLeft_card + {q a b : ℕ} {M L : Finset ℕ} + (hMsub : M ⊆ Finset.range q) (hMcard : M.card = a + b - q) + (hLsub : L ⊆ Finset.range q \ M) (hLcard : L.card = q - b) + (hleft : a ≤ q) (hright : b ≤ q) (hsum : q ≤ a + b) : + (formalLogOnePlusProductArgumentRightPositions q + (formalLogOnePlusProductArgumentChoiceFromMixedLeft q M L)).card = + q - a := by + rw [formalLogOnePlusProductArgumentRightPositions_choiceFromMixedLeft hLsub] + have hLrange : L ⊆ Finset.range q := fun i hi => + (Finset.mem_sdiff.mp (hLsub hi)).1 + have hdisj : Disjoint M L := by + rw [Finset.disjoint_left] + intro i hMi hLi + exact (Finset.mem_sdiff.mp (hLsub hLi)).2 hMi + have hunionSub : M ∪ L ⊆ Finset.range q := by + intro i hi + rcases Finset.mem_union.mp hi with hMi | hLi + · exact hMsub hMi + · exact hLrange hLi + rw [Finset.card_sdiff_of_subset hunionSub, Finset.card_range] + rw [Finset.card_union_of_disjoint hdisj, hMcard, hLcard] + omega + + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ExplicitChoiceCounts.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ExplicitChoiceCounts.lean new file mode 100644 index 0000000000..832f187447 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ExplicitChoiceCounts.lean @@ -0,0 +1,272 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoiceCountSystem +/-! +# Explicit counts for basic-factor choices + +This module solves the coordinate-count system and relates its solution to the +label-count and multinomial choice spaces. +-/ + +@[expose] public section + +noncomputable +section + +attribute [local instance] Classical.propDecidable + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +/-- +Establishes the identity `q + formalLogOnePlusProductArgumentMixedChoiceCount q l = e (0 : Fin 2) ++ e (1 : Fin 2)`. +-/ +theorem formalLogOnePlusProductArgument_choiceCounts_total_add_mixed_eq_coord_sum + {q : ℕ} {e : Fin 2 →₀ ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hl : l ∈ Finset.finsuppAntidiag (Finset.range q) e) + (hbasic : ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i)) : + q + formalLogOnePlusProductArgumentMixedChoiceCount q l = + e (0 : Fin 2) + e (1 : Fin 2) := by + rcases formalLogOnePlusProductArgument_choiceCounts_system + hl hbasic with ⟨hleft, hright, htotal⟩ + calc + q + formalLogOnePlusProductArgumentMixedChoiceCount q l = + (formalLogOnePlusProductArgumentLeftChoiceCount q l + + formalLogOnePlusProductArgumentRightChoiceCount q l + + formalLogOnePlusProductArgumentMixedChoiceCount q l) + + formalLogOnePlusProductArgumentMixedChoiceCount q l := by + exact (congrArg + (fun t : ℕ => t + formalLogOnePlusProductArgumentMixedChoiceCount q l) + htotal).symm + _ = + (formalLogOnePlusProductArgumentLeftChoiceCount q l + + formalLogOnePlusProductArgumentMixedChoiceCount q l) + + (formalLogOnePlusProductArgumentRightChoiceCount q l + + formalLogOnePlusProductArgumentMixedChoiceCount q l) := by + simp only [Nat.add_assoc, Nat.add_left_comm, Nat.add_comm] + _ = e (0 : Fin 2) + e (1 : Fin 2) := by + rw [hleft, hright] + +/-- Proves the bound `q ≤ e (0 : Fin 2) + e (1 : Fin 2)`. -/ +theorem formalLogOnePlusProductArgument_choiceCounts_q_le_coord_sum + {q : ℕ} {e : Fin 2 →₀ ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hl : l ∈ Finset.finsuppAntidiag (Finset.range q) e) + (hbasic : ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i)) : + q ≤ e (0 : Fin 2) + e (1 : Fin 2) := by + have hsum := + formalLogOnePlusProductArgument_choiceCounts_total_add_mixed_eq_coord_sum + hl hbasic + exact Nat.le.intro hsum + +/-- +Establishes the identity `formalLogOnePlusProductArgumentMixedChoiceCount q l = e (0 : Fin 2) + e +(1 : Fin 2) - q`. +-/ +theorem formalLogOnePlusProductArgument_mixedChoiceCount_eq_coord_sum_sub_q + {q : ℕ} {e : Fin 2 →₀ ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hl : l ∈ Finset.finsuppAntidiag (Finset.range q) e) + (hbasic : ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i)) : + formalLogOnePlusProductArgumentMixedChoiceCount q l = + e (0 : Fin 2) + e (1 : Fin 2) - q := by + have hsum := + formalLogOnePlusProductArgument_choiceCounts_total_add_mixed_eq_coord_sum + hl hbasic + calc + formalLogOnePlusProductArgumentMixedChoiceCount q l = + q + formalLogOnePlusProductArgumentMixedChoiceCount q l - q := by + rw [Nat.add_sub_cancel_left] + _ = e (0 : Fin 2) + e (1 : Fin 2) - q := by + rw [hsum] + +/-- +Establishes the identity `formalLogOnePlusProductArgumentLeftChoiceCount q l = q - e (1 : Fin 2)`. +-/ +theorem formalLogOnePlusProductArgument_leftChoiceCount_eq_q_sub_right_coord + {q : ℕ} {e : Fin 2 →₀ ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hl : l ∈ Finset.finsuppAntidiag (Finset.range q) e) + (hbasic : ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i)) : + formalLogOnePlusProductArgumentLeftChoiceCount q l = + q - e (1 : Fin 2) := by + rcases formalLogOnePlusProductArgument_choiceCounts_system + hl hbasic with ⟨_hleft, hright, htotal⟩ + have hq : + e (1 : Fin 2) + + formalLogOnePlusProductArgumentLeftChoiceCount q l = + q := by + calc + e (1 : Fin 2) + + formalLogOnePlusProductArgumentLeftChoiceCount q l = + (formalLogOnePlusProductArgumentRightChoiceCount q l + + formalLogOnePlusProductArgumentMixedChoiceCount q l) + + formalLogOnePlusProductArgumentLeftChoiceCount q l := by + rw [hright] + _ = + formalLogOnePlusProductArgumentLeftChoiceCount q l + + formalLogOnePlusProductArgumentRightChoiceCount q l + + formalLogOnePlusProductArgumentMixedChoiceCount q l := by + simp only [Nat.add_left_comm, Nat.add_comm] + _ = q := htotal + calc + formalLogOnePlusProductArgumentLeftChoiceCount q l = + e (1 : Fin 2) + + formalLogOnePlusProductArgumentLeftChoiceCount q l - + e (1 : Fin 2) := by + rw [Nat.add_sub_cancel_left] + _ = q - e (1 : Fin 2) := by + rw [hq] + +/-- +Establishes the identity `formalLogOnePlusProductArgumentRightChoiceCount q l = q - e (0 : Fin +2)`. +-/ +theorem formalLogOnePlusProductArgument_rightChoiceCount_eq_q_sub_left_coord + {q : ℕ} {e : Fin 2 →₀ ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hl : l ∈ Finset.finsuppAntidiag (Finset.range q) e) + (hbasic : ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i)) : + formalLogOnePlusProductArgumentRightChoiceCount q l = + q - e (0 : Fin 2) := by + rcases formalLogOnePlusProductArgument_choiceCounts_system + hl hbasic with ⟨hleft, _hright, htotal⟩ + have hq : + e (0 : Fin 2) + + formalLogOnePlusProductArgumentRightChoiceCount q l = + q := by + calc + e (0 : Fin 2) + + formalLogOnePlusProductArgumentRightChoiceCount q l = + (formalLogOnePlusProductArgumentLeftChoiceCount q l + + formalLogOnePlusProductArgumentMixedChoiceCount q l) + + formalLogOnePlusProductArgumentRightChoiceCount q l := by + rw [hleft] + _ = + formalLogOnePlusProductArgumentLeftChoiceCount q l + + formalLogOnePlusProductArgumentRightChoiceCount q l + + formalLogOnePlusProductArgumentMixedChoiceCount q l := by + simp only [Nat.add_assoc, Nat.add_left_comm, Nat.add_comm] + _ = q := htotal + calc + formalLogOnePlusProductArgumentRightChoiceCount q l = + e (0 : Fin 2) + + formalLogOnePlusProductArgumentRightChoiceCount q l - + e (0 : Fin 2) := by + rw [Nat.add_sub_cancel_left] + _ = q - e (0 : Fin 2) := by + rw [hq] + +/-- +Establishes the identity `formalLogOnePlusProductArgumentLeftChoiceCount q l = q - e (1 : Fin 2) ∧ +formalLogOnePlusProductArgumentRightChoiceCount q l = q - e (0 : Fin 2) ∧ +formalLogOnePlusProductArgumentMixedChoiceCount q l = e (0 : Fin 2) + e (1 : Fin 2) - q`. +-/ +theorem formalLogOnePlusProductArgument_choiceCounts_explicit + {q : ℕ} {e : Fin 2 →₀ ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hl : l ∈ Finset.finsuppAntidiag (Finset.range q) e) + (hbasic : ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i)) : + formalLogOnePlusProductArgumentLeftChoiceCount q l = + q - e (1 : Fin 2) ∧ + formalLogOnePlusProductArgumentRightChoiceCount q l = + q - e (0 : Fin 2) ∧ + formalLogOnePlusProductArgumentMixedChoiceCount q l = + e (0 : Fin 2) + e (1 : Fin 2) - q := by + exact + ⟨formalLogOnePlusProductArgument_leftChoiceCount_eq_q_sub_right_coord + hl hbasic, + formalLogOnePlusProductArgument_rightChoiceCount_eq_q_sub_left_coord + hl hbasic, + formalLogOnePlusProductArgument_mixedChoiceCount_eq_coord_sum_sub_q + hl hbasic⟩ + +/-- +Establishes the identity `formalLogOnePlusProductArgumentBasicFactorLabelCount q l 0 = q - e (1 : +Fin 2) ∧ formalLogOnePlusProductArgumentBasicFactorLabelCount q l 1 = q - e (0 : Fin 2) ∧ +formalLogOnePlusProductArgumentBasicFactorLabelCount q l 2 = e (0 : Fin 2) + e (1 : Fin 2) - q`. +-/ +theorem formalLogOnePlusProductArgument_labelCounts_explicit + {q : ℕ} {e : Fin 2 →₀ ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hl : l ∈ Finset.finsuppAntidiag (Finset.range q) e) + (hbasic : ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i)) : + formalLogOnePlusProductArgumentBasicFactorLabelCount q l 0 = + q - e (1 : Fin 2) ∧ + formalLogOnePlusProductArgumentBasicFactorLabelCount q l 1 = + q - e (0 : Fin 2) ∧ + formalLogOnePlusProductArgumentBasicFactorLabelCount q l 2 = + e (0 : Fin 2) + e (1 : Fin 2) - q := by + rcases formalLogOnePlusProductArgument_choiceCounts_explicit + hl hbasic with ⟨hleft, hright, hmixed⟩ + exact + ⟨by + rw [← formalLogOnePlusProductArgument_leftChoiceCount_eq_labelCount_zero] + exact hleft, + by + rw [← formalLogOnePlusProductArgument_rightChoiceCount_eq_labelCount_one] + exact hright, + by + rw [← + formalLogOnePlusProductArgument_mixedChoiceCount_eq_labelCount_two + hbasic] + exact hmixed⟩ + +/-- +Establishes the identity `formalLogOnePlusProductArgumentBasicFactorLabelCount q l 0 = q - e (1 : +Fin 2) ∧ formalLogOnePlusProductArgumentBasicFactorLabelCount q l 1 = q - e (0 : Fin 2) ∧ +formalLogOnePlusProductArgumentBasicFactorLabelCount q l 2 = e (0 : Fin 2) + e (1 : Fin 2) - q`. +-/ +theorem formalLogOnePlusProductArgumentBasicFactorChoices_labelCounts_explicit + {q : ℕ} {e : Fin 2 →₀ ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hl : l ∈ formalLogOnePlusProductArgumentBasicFactorChoices q e) : + formalLogOnePlusProductArgumentBasicFactorLabelCount q l 0 = + q - e (1 : Fin 2) ∧ + formalLogOnePlusProductArgumentBasicFactorLabelCount q l 1 = + q - e (0 : Fin 2) ∧ + formalLogOnePlusProductArgumentBasicFactorLabelCount q l 2 = + e (0 : Fin 2) + e (1 : Fin 2) - q := by + rw [mem_formalLogOnePlusProductArgumentBasicFactorChoices] at hl + exact formalLogOnePlusProductArgument_labelCounts_explicit hl.1 hl.2 + +/-- Every basic-factor choice satisfies the corresponding three label-count constraints. -/ +theorem formalLogOnePlusProductArgumentBasicFactorChoices_subset_labelCountChoices + (q : ℕ) (e : Fin 2 →₀ ℕ) : + formalLogOnePlusProductArgumentBasicFactorChoices q e ⊆ + formalLogOnePlusProductArgumentBasicFactorLabelCountChoices q e := by + intro l hl + rw [mem_formalLogOnePlusProductArgumentBasicFactorLabelCountChoices] + rw [mem_formalLogOnePlusProductArgumentBasicFactorChoices] at hl + have hprod : + l ∈ formalLogOnePlusProductArgumentBasicFactorProductChoices q := by + rw [mem_formalLogOnePlusProductArgumentBasicFactorProductChoices] + exact ⟨(Finset.mem_finsuppAntidiag.mp hl.1).2, hl.2⟩ + exact + ⟨hprod, + formalLogOnePlusProductArgument_labelCounts_explicit hl.1 hl.2⟩ + +/-- +Proves the bound `(formalLogOnePlusProductArgumentBasicFactorChoices q e).card ≤ +(formalLogOnePlusProductArgumentBasicFactorLabelCountChoices q e).card`. +-/ +theorem formalLogOnePlusProductArgumentBasicFactorChoices_card_le_labelCountChoices + (q : ℕ) (e : Fin 2 →₀ ℕ) : + (formalLogOnePlusProductArgumentBasicFactorChoices q e).card ≤ + (formalLogOnePlusProductArgumentBasicFactorLabelCountChoices q e).card := + Finset.card_le_card + (formalLogOnePlusProductArgumentBasicFactorChoices_subset_labelCountChoices + q e) + + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/PowerSeriesComposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/PowerSeriesComposition.lean new file mode 100644 index 0000000000..4964722970 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/PowerSeriesComposition.lean @@ -0,0 +1,227 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RingTheory.PowerSeries.Log +public import Mathlib.RingTheory.PowerSeries.WellKnown +/-! +# Formal logarithm and exponential composition + +This module develops the formal composition identities between Mathlib's +`PowerSeries.log` and `PowerSeries.exp` that are used by the local-field +logarithm and exponential. +-/ + +@[expose] public section + +noncomputable +section + +attribute [local instance] Classical.propDecidable + +namespace PowerSeries + +/-- The alternating geometric series is the formal inverse of `1 + X`. -/ +theorem alternating_mul_one_add_X + (A : Type*) [CommRing A] : + (PowerSeries.mk fun n : ℕ => (-1 : A) ^ n) * + (1 + PowerSeries.X : PowerSeries A) = 1 := by + have h := + congrArg (PowerSeries.evalNegHom (A := A)) + (PowerSeries.mk_one_mul_one_sub_eq_one A) + have hmk' : + PowerSeries.evalNegHom (PowerSeries.mk (1 : ℕ → A)) = + PowerSeries.mk fun n : ℕ => (-1 : A) ^ n := by + ext n + simp [PowerSeries.evalNegHom, PowerSeries.rescale_mk] + simpa [hmk', sub_eq_add_neg] using h + +/-- A torsion-free power series with zero constant coefficient satisfying +`f' * (1 + X) = f` is zero. -/ +theorem eq_zero_of_derivative_mul_one_add_X_eq_self + (A : Type*) [CommRing A] [IsAddTorsionFree A] {f : PowerSeries A} + (hD : + PowerSeries.derivative f * (1 + PowerSeries.X : PowerSeries A) = f) + (hc : PowerSeries.constantCoeff f = 0) : + f = 0 := by + ext n + induction n with + | zero => + rw [PowerSeries.coeff_zero_eq_constantCoeff, hc] + simp + | succ n ih => + cases n with + | zero => + have hcoeff := congrArg (PowerSeries.coeff 0) hD + have hmul : + PowerSeries.derivative f * + (1 + PowerSeries.X : PowerSeries A) = + PowerSeries.derivative f + + PowerSeries.derivative f * PowerSeries.X := by + ring + rw [hmul, map_add, PowerSeries.coeff_zero_mul_X, + add_zero, PowerSeries.coeff_zero_eq_constantCoeff, hc] at hcoeff + rw [← PowerSeries.coeff_zero_eq_constantCoeff_apply, + PowerSeries.coeff_derivative] at hcoeff + simpa using hcoeff + | succ n => + have hcoeff := congrArg (PowerSeries.coeff (n + 1)) hD + have hmul : + PowerSeries.derivative f * + (1 + PowerSeries.X : PowerSeries A) = + PowerSeries.derivative f + + PowerSeries.derivative f * PowerSeries.X := by + ring + rw [hmul, map_add, PowerSeries.coeff_succ_mul_X, + PowerSeries.coeff_derivative, PowerSeries.coeff_derivative] at hcoeff + simp only [Nat.cast_add, Nat.cast_one, ih, map_zero, zero_mul, add_zero] at hcoeff + have hzero : + PowerSeries.coeff (n + 2) f * + ((Nat.succ (n + 1) : ℕ) : A) = 0 := by + simpa using hcoeff + rw [mul_comm, ← nsmul_eq_mul] at hzero + simpa using + (smul_right_inj (Nat.succ_ne_zero (n + 1))).mp + (by simpa using hzero) + +/-- A torsion-free power series with constant coefficient one satisfying +`f' * (1 + X) = f` is `1 + X`. -/ +theorem eq_one_add_X_of_derivative_mul_one_add_X_eq_self + (A : Type*) [CommRing A] [IsAddTorsionFree A] {f : PowerSeries A} + (hD : + PowerSeries.derivative f * (1 + PowerSeries.X : PowerSeries A) = f) + (hc : PowerSeries.constantCoeff f = 1) : + f = 1 + PowerSeries.X := by + have hbase : + PowerSeries.derivative (1 + PowerSeries.X : PowerSeries A) * + (1 + PowerSeries.X : PowerSeries A) = + (1 + PowerSeries.X : PowerSeries A) := by + simp + have hzero : + PowerSeries.derivative (f - (1 + PowerSeries.X : PowerSeries A)) * + (1 + PowerSeries.X : PowerSeries A) = + f - (1 + PowerSeries.X : PowerSeries A) := by + rw [map_sub, sub_mul, hD, hbase] + have hczero : + PowerSeries.constantCoeff + (f - (1 + PowerSeries.X : PowerSeries A)) = 0 := by + simp [hc] + have h := eq_zero_of_derivative_mul_one_add_X_eq_self + A hzero hczero + exact sub_eq_zero.mp h + +/-- A power series with derivative one and constant coefficient zero is `X`. -/ +theorem eq_X_of_derivative_eq_one + (A : Type*) [CommRing A] [IsAddTorsionFree A] {f : PowerSeries A} + (hD : PowerSeries.derivative f = 1) + (hc : PowerSeries.constantCoeff f = 0) : + f = PowerSeries.X := by + apply PowerSeries.derivative.ext + · rw [hD, PowerSeries.derivative_X] + · simp [hc] + +/-- Substituting Mathlib's formal logarithm into its exponential yields +`1 + X`. -/ +theorem exp_subst_log_eq_one_add_X + (A : Type*) [CommRing A] [Algebra ℚ A] [IsAddTorsionFree A] : + PowerSeries.subst (PowerSeries.log A) (PowerSeries.exp A) = + (1 + PowerSeries.X : PowerSeries A) := by + let l : PowerSeries A := PowerSeries.log A + have hl0 : PowerSeries.constantCoeff l = 0 := + PowerSeries.constantCoeff_log + have hl : PowerSeries.HasSubst l := by + simpa [l] using PowerSeries.HasSubst.log (A := A) + let f : PowerSeries A := PowerSeries.subst l (PowerSeries.exp A) + have hD : + PowerSeries.derivative f * (1 + PowerSeries.X : PowerSeries A) = f := by + dsimp [f] + rw [PowerSeries.derivative_subst hl] + rw [PowerSeries.derivative_exp] + calc + (PowerSeries.subst l (PowerSeries.exp A) * + PowerSeries.derivative l) * + (1 + PowerSeries.X : PowerSeries A) = + PowerSeries.subst l (PowerSeries.exp A) * + (PowerSeries.derivative l * + (1 + PowerSeries.X : PowerSeries A)) := by + ring + _ = PowerSeries.subst l (PowerSeries.exp A) * 1 := by + rw [show + PowerSeries.derivative l * + (1 + PowerSeries.X : PowerSeries A) = 1 by + simpa [l] using + PowerSeries.derivative_log_mul_one_add_X (A := A)] + _ = PowerSeries.subst l (PowerSeries.exp A) := by + rw [mul_one] + have hc : PowerSeries.constantCoeff f = 1 := by + dsimp [f] + change MvPowerSeries.constantCoeff + (PowerSeries.subst l (PowerSeries.exp A)) = 1 + rw [PowerSeries.constantCoeff_subst_of_constantCoeff_zero hl0] + exact PowerSeries.constantCoeff_exp + exact + eq_one_add_X_of_derivative_mul_one_add_X_eq_self + A hD hc + +/-- Substituting `exp - 1` into Mathlib's formal logarithm yields `X`. -/ +theorem log_subst_exp_sub_one_eq_X + (A : Type*) [CommRing A] [Algebra ℚ A] [IsAddTorsionFree A] : + PowerSeries.subst ((PowerSeries.exp A) - 1) (PowerSeries.log A) = + (PowerSeries.X : PowerSeries A) := by + let e : PowerSeries A := PowerSeries.exp A - 1 + have he0 : PowerSeries.constantCoeff e = 0 := by + simp [e] + have he : PowerSeries.HasSubst e := + PowerSeries.HasSubst.of_constantCoeff_zero' he0 + let l : PowerSeries A := PowerSeries.log A + let f : PowerSeries A := PowerSeries.subst e l + have hde : PowerSeries.derivative e = PowerSeries.exp A := by + simp [e, PowerSeries.derivative_exp] + have hsubst_deriv_mul_exp : + PowerSeries.subst e (PowerSeries.derivative l) * + PowerSeries.exp A = 1 := by + have hlog : + PowerSeries.derivative l * + (1 + PowerSeries.X : PowerSeries A) = 1 := by + simpa [l] using + PowerSeries.derivative_log_mul_one_add_X (A := A) + have hsubst := + congrArg (fun q : PowerSeries A => PowerSeries.subst e q) hlog + have hone : PowerSeries.subst e (1 : PowerSeries A) = 1 := by + rw [← PowerSeries.coe_substAlgHom he] + simp + change PowerSeries.subst e + (PowerSeries.derivative l * (1 + PowerSeries.X : PowerSeries A)) = + PowerSeries.subst e (1 : PowerSeries A) at hsubst + rw [PowerSeries.subst_mul he, PowerSeries.subst_add he, + PowerSeries.subst_X he, hone] at hsubst + have hone_add_e : (1 : PowerSeries A) + e = PowerSeries.exp A := by + dsimp [e] + ring + simpa [hone_add_e] using hsubst + have hD : PowerSeries.derivative f = 1 := by + dsimp [f] + calc + PowerSeries.derivative (PowerSeries.subst e l) = + PowerSeries.subst e (PowerSeries.derivative l) * + PowerSeries.derivative e := by + rw [PowerSeries.derivative_subst he] + _ = PowerSeries.subst e (PowerSeries.derivative l) * + PowerSeries.exp A := by + rw [hde] + _ = 1 := hsubst_deriv_mul_exp + have hc : PowerSeries.constantCoeff f = 0 := by + dsimp [f] + change MvPowerSeries.constantCoeff (PowerSeries.subst e l) = 0 + rw [PowerSeries.constantCoeff_subst_of_constantCoeff_zero he0] + exact PowerSeries.constantCoeff_log + exact eq_X_of_derivative_eq_one A hD hc + + +end PowerSeries + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ProductArgument.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ProductArgument.lean new file mode 100644 index 0000000000..111a6ddad0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ProductArgument.lean @@ -0,0 +1,391 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.PowerSeriesComposition +public import Mathlib.Algebra.BigOperators.Ring.Finset +public import Mathlib.Data.Finset.Finsupp +/-! +# The two-variable formal logarithm product argument + +This module defines `X + Y + XY`, its logarithmic substitution, and the +support description needed for the formal product formula. +-/ + +@[expose] public section + +noncomputable +section + +attribute [local instance] Classical.propDecidable + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +/-- The two-variable argument of the product formula: +`(1 + X) * (1 + Y) - 1 = X + Y + X*Y`. -/ +def formalLogOnePlusProductArgument + (A : Type*) [CommRing A] : MvPowerSeries (Fin 2) A := + MvPowerSeries.X (0 : Fin 2) + MvPowerSeries.X (1 : Fin 2) + + MvPowerSeries.X (0 : Fin 2) * MvPowerSeries.X (1 : Fin 2) + +/-- The polynomial incarnation of the two-variable product argument +`(1 + X) * (1 + Y) - 1 = X + Y + XY`. -/ +def formalLogOnePlusProductArgumentPolynomial + (A : Type*) [CommSemiring A] : MvPolynomial (Fin 2) A := + MvPolynomial.X (0 : Fin 2) + MvPolynomial.X (1 : Fin 2) + + MvPolynomial.X (0 : Fin 2) * MvPolynomial.X (1 : Fin 2) + +/-- The formal product argument is the power-series image of the corresponding +finite polynomial. -/ +theorem formalLogOnePlusProductArgument_eq_coe_polynomial + (A : Type*) [CommRing A] : + formalLogOnePlusProductArgument A = + (formalLogOnePlusProductArgumentPolynomial A : + MvPowerSeries (Fin 2) A) := by + simp [formalLogOnePlusProductArgument, + formalLogOnePlusProductArgumentPolynomial] + +/-- Evaluating the polynomial product argument at `(x,y)` gives +`x + y + xy`. -/ +@[simp] theorem formalLogOnePlusProductArgumentPolynomial_eval_pair + (A : Type*) [CommSemiring A] (x y : A) : + MvPolynomial.eval (fun i : Fin 2 => if i = 0 then x else y) + (formalLogOnePlusProductArgumentPolynomial A) = + x + y + x * y := by + simp [formalLogOnePlusProductArgumentPolynomial] + +/-- +Establishes the identity `formalLogOnePlusProductArgument A = (1 + MvPowerSeries.X (0 : Fin 2)) * +(1 + MvPowerSeries.X (1 : Fin 2)) - 1`. +-/ +theorem formalLogOnePlusProductArgument_eq_mul_sub_one + (A : Type*) [CommRing A] : + formalLogOnePlusProductArgument A = + (1 + MvPowerSeries.X (0 : Fin 2)) * + (1 + MvPowerSeries.X (1 : Fin 2)) - 1 := by + let X0 : MvPowerSeries (Fin 2) A := MvPowerSeries.X (0 : Fin 2) + let X1 : MvPowerSeries (Fin 2) A := MvPowerSeries.X (1 : Fin 2) + change X0 + X1 + X0 * X1 = (1 + X0) * (1 + X1) - 1 + ring + +/-- Adding one to the product argument recovers +`(1 + X) * (1 + Y)`. -/ +theorem formalLogOnePlusProductArgument_one_add + (A : Type*) [CommRing A] : + 1 + formalLogOnePlusProductArgument A = + (1 + MvPowerSeries.X (0 : Fin 2)) * + (1 + MvPowerSeries.X (1 : Fin 2)) := by + rw [formalLogOnePlusProductArgument_eq_mul_sub_one] + ring + +/-- +Establishes the identity `MvPowerSeries.constantCoeff (formalLogOnePlusProductArgument A) = 0`. +-/ +theorem formalLogOnePlusProductArgument_constantCoeff + (A : Type*) [CommRing A] : + MvPowerSeries.constantCoeff (formalLogOnePlusProductArgument A) = 0 := by + rw [formalLogOnePlusProductArgument_eq_mul_sub_one] + simp [MvPowerSeries.constantCoeff_X] + +/-- +The formal product argument has zero constant coefficient, so it admits substitution into the +logarithm power series. +-/ +theorem formalLogOnePlusProductArgument_hasSubst + (A : Type*) [CommRing A] : + PowerSeries.HasSubst (formalLogOnePlusProductArgument A) := + PowerSeries.HasSubst.of_constantCoeff_zero + (formalLogOnePlusProductArgument_constantCoeff A) + +/-- +Establishes the identity `MvPowerSeries.coeff e (MvPowerSeries.X (0 : Fin 2) * MvPowerSeries.X (1 +: Fin 2) : MvPowerSeries (Fin 2) A) = if e = Finsupp.single (0 : Fin 2) 1 + Finsupp.single (1 : +Fin 2) 1 then 1 else 0`. +-/ +theorem formalLogOnePlusProductArgument_mulVariables_coeff + (A : Type*) [CommRing A] (e : Fin 2 →₀ ℕ) : + MvPowerSeries.coeff e + (MvPowerSeries.X (0 : Fin 2) * + MvPowerSeries.X (1 : Fin 2) : MvPowerSeries (Fin 2) A) = + if e = + Finsupp.single (0 : Fin 2) 1 + Finsupp.single (1 : Fin 2) 1 + then 1 else 0 := by + change MvPowerSeries.coeff e + (MvPowerSeries.monomial (Finsupp.single (0 : Fin 2) 1) (1 : A) * + MvPowerSeries.monomial (Finsupp.single (1 : Fin 2) 1) (1 : A)) = + if e = + Finsupp.single (0 : Fin 2) 1 + Finsupp.single (1 : Fin 2) 1 + then 1 else 0 + rw [MvPowerSeries.monomial_mul_monomial] + simp [MvPowerSeries.coeff_monomial] + +/-- +Establishes the identity `MvPowerSeries.coeff e (formalLogOnePlusProductArgument A) = (if e = +Finsupp.single (0 : Fin 2) 1 then 1 else 0) + (if e = Finsupp.single (1 : Fin 2) 1 then 1 else 0) ++ (if e = Finsupp.single (0 : Fin 2) 1 + Finsupp.single (1 : Fin 2) 1 then 1 else 0)`. +-/ +theorem formalLogOnePlusProductArgument_coeff + (A : Type*) [CommRing A] (e : Fin 2 →₀ ℕ) : + MvPowerSeries.coeff e (formalLogOnePlusProductArgument A) = + (if e = Finsupp.single (0 : Fin 2) 1 then 1 else 0) + + (if e = Finsupp.single (1 : Fin 2) 1 then 1 else 0) + + (if e = + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1 + then 1 else 0) := by + simp [formalLogOnePlusProductArgument, MvPowerSeries.coeff_X, + formalLogOnePlusProductArgument_mulVariables_coeff] + +/-- Establishes the identity `MvPowerSeries.coeff e (formalLogOnePlusProductArgument A) = 0`. -/ +theorem formalLogOnePlusProductArgument_coeff_eq_zero_of_not_basic + (A : Type*) [CommRing A] (e : Fin 2 →₀ ℕ) + (hleft : e ≠ Finsupp.single (0 : Fin 2) 1) + (hright : e ≠ Finsupp.single (1 : Fin 2) 1) + (hmixed : + e ≠ + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1) : + MvPowerSeries.coeff e (formalLogOnePlusProductArgument A) = 0 := by + rw [formalLogOnePlusProductArgument_coeff] + simp [hleft, hright, hmixed] + +/-- Establishes the inequality `Finsupp.single (0 : Fin 2) 1 ≠ Finsupp.single (1 : Fin 2) 1`. -/ +theorem finsupp_fin_two_single_left_ne_single_right : + Finsupp.single (0 : Fin 2) 1 ≠ Finsupp.single (1 : Fin 2) 1 := by + intro h + have hcoord := congrArg (fun e : Fin 2 →₀ ℕ => e (0 : Fin 2)) h + simp at hcoord + +/-- +Establishes the inequality `Finsupp.single (0 : Fin 2) 1 ≠ Finsupp.single (0 : Fin 2) 1 + +Finsupp.single (1 : Fin 2) 1`. +-/ +theorem finsupp_fin_two_single_left_ne_mixed : + Finsupp.single (0 : Fin 2) 1 ≠ + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1 := by + intro h + have hcoord := congrArg (fun e : Fin 2 →₀ ℕ => e (1 : Fin 2)) h + simp at hcoord + +/-- +Establishes the inequality `Finsupp.single (1 : Fin 2) 1 ≠ Finsupp.single (0 : Fin 2) 1 + +Finsupp.single (1 : Fin 2) 1`. +-/ +theorem finsupp_fin_two_single_right_ne_mixed : + Finsupp.single (1 : Fin 2) 1 ≠ + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1 := by + intro h + have hcoord := congrArg (fun e : Fin 2 →₀ ℕ => e (0 : Fin 2)) h + simp at hcoord + +/-- +Establishes the identity `MvPowerSeries.coeff (Finsupp.single (0 : Fin 2) 1) +(formalLogOnePlusProductArgument A) = 1`. +-/ +@[simp] theorem formalLogOnePlusProductArgument_coeff_single_left + (A : Type*) [CommRing A] : + MvPowerSeries.coeff (Finsupp.single (0 : Fin 2) 1) + (formalLogOnePlusProductArgument A) = 1 := by + rw [formalLogOnePlusProductArgument_coeff] + simp [finsupp_fin_two_single_left_ne_single_right] + +/-- +Establishes the identity `MvPowerSeries.coeff (Finsupp.single (1 : Fin 2) 1) +(formalLogOnePlusProductArgument A) = 1`. +-/ +@[simp] theorem formalLogOnePlusProductArgument_coeff_single_right + (A : Type*) [CommRing A] : + MvPowerSeries.coeff (Finsupp.single (1 : Fin 2) 1) + (formalLogOnePlusProductArgument A) = 1 := by + rw [formalLogOnePlusProductArgument_coeff] + have hrightLeft : + Finsupp.single (1 : Fin 2) 1 ≠ + Finsupp.single (0 : Fin 2) 1 := + finsupp_fin_two_single_left_ne_single_right.symm + simp [hrightLeft] + +/-- +Establishes the identity `MvPowerSeries.coeff (Finsupp.single (0 : Fin 2) 1 + Finsupp.single (1 : +Fin 2) 1) (formalLogOnePlusProductArgument A) = 1`. +-/ +@[simp] theorem formalLogOnePlusProductArgument_coeff_mixed + (A : Type*) [CommRing A] : + MvPowerSeries.coeff + (Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1) + (formalLogOnePlusProductArgument A) = 1 := by + rw [formalLogOnePlusProductArgument_coeff] + have hmixedLeft : + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1 ≠ + Finsupp.single (0 : Fin 2) 1 := + finsupp_fin_two_single_left_ne_mixed.symm + have hmixedRight : + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1 ≠ + Finsupp.single (1 : Fin 2) 1 := + finsupp_fin_two_single_right_ne_mixed.symm + simp [hmixedLeft, hmixedRight] + +/-- Proves the bound `e (0 : Fin 2) ≤ 1`. -/ +theorem formalLogOnePlusProductArgument_coeff_ne_zero_left_coord_le_one + (A : Type*) [CommRing A] (e : Fin 2 →₀ ℕ) + (hcoeff : MvPowerSeries.coeff e + (formalLogOnePlusProductArgument A) ≠ 0) : + e (0 : Fin 2) ≤ 1 := by + by_contra hle + have hgt : 1 < e (0 : Fin 2) := Nat.lt_of_not_ge hle + have hleft : e ≠ Finsupp.single (0 : Fin 2) 1 := by + intro he + have hcoord : e (0 : Fin 2) ≤ 1 := by simp [he] + exact (not_le_of_gt hgt) hcoord + have hright : e ≠ Finsupp.single (1 : Fin 2) 1 := by + intro he + have hcoord : e (0 : Fin 2) ≤ 1 := by simp [he] + exact (not_le_of_gt hgt) hcoord + have hmixed : + e ≠ + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1 := by + intro he + have hcoord : e (0 : Fin 2) ≤ 1 := by simp [he] + exact (not_le_of_gt hgt) hcoord + exact hcoeff + (formalLogOnePlusProductArgument_coeff_eq_zero_of_not_basic + A e hleft hright hmixed) + +/-- Proves the bound `e (1 : Fin 2) ≤ 1`. -/ +theorem formalLogOnePlusProductArgument_coeff_ne_zero_right_coord_le_one + (A : Type*) [CommRing A] (e : Fin 2 →₀ ℕ) + (hcoeff : MvPowerSeries.coeff e + (formalLogOnePlusProductArgument A) ≠ 0) : + e (1 : Fin 2) ≤ 1 := by + by_contra hle + have hgt : 1 < e (1 : Fin 2) := Nat.lt_of_not_ge hle + have hleft : e ≠ Finsupp.single (0 : Fin 2) 1 := by + intro he + have hcoord : e (1 : Fin 2) ≤ 1 := by simp [he] + exact (not_le_of_gt hgt) hcoord + have hright : e ≠ Finsupp.single (1 : Fin 2) 1 := by + intro he + have hcoord : e (1 : Fin 2) ≤ 1 := by simp [he] + exact (not_le_of_gt hgt) hcoord + have hmixed : + e ≠ + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1 := by + intro he + have hcoord : e (1 : Fin 2) ≤ 1 := by simp [he] + exact (not_le_of_gt hgt) hcoord + exact hcoeff + (formalLogOnePlusProductArgument_coeff_eq_zero_of_not_basic + A e hleft hright hmixed) + +/-- Establishes the identity `e = 0`. -/ +theorem finsupp_fin_two_eq_zero_of_coords_eq_zero + (e : Fin 2 →₀ ℕ) + (hleft : e (0 : Fin 2) = 0) (hright : e (1 : Fin 2) = 0) : + e = 0 := by + ext i + fin_cases i <;> simp [hleft, hright] + +/-- Establishes the identity `e = Finsupp.single (0 : Fin 2) 1`. -/ +theorem finsupp_fin_two_eq_single_left_of_coords_eq + (e : Fin 2 →₀ ℕ) + (hleft : e (0 : Fin 2) = 1) (hright : e (1 : Fin 2) = 0) : + e = Finsupp.single (0 : Fin 2) 1 := by + ext i + fin_cases i <;> simp [hleft, hright] + +/-- Establishes the identity `e = Finsupp.single (1 : Fin 2) 1`. -/ +theorem finsupp_fin_two_eq_single_right_of_coords_eq + (e : Fin 2 →₀ ℕ) + (hleft : e (0 : Fin 2) = 0) (hright : e (1 : Fin 2) = 1) : + e = Finsupp.single (1 : Fin 2) 1 := by + ext i + fin_cases i <;> simp [hleft, hright] + +/-- Establishes the identity `e = Finsupp.single (0 : Fin 2) 1 + Finsupp.single (1 : Fin 2) 1`. -/ +theorem finsupp_fin_two_eq_mixed_of_coords_eq_one + (e : Fin 2 →₀ ℕ) + (hleft : e (0 : Fin 2) = 1) (hright : e (1 : Fin 2) = 1) : + e = + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1 := by + ext i + fin_cases i <;> simp [hleft, hright] + +/-- +Establishes the identity `e = Finsupp.single (0 : Fin 2) 1 ∨ e = Finsupp.single (1 : Fin 2) 1 ∨ e += Finsupp.single (0 : Fin 2) 1 + Finsupp.single (1 : Fin 2) 1`. +-/ +theorem formalLogOnePlusProductArgument_coeff_ne_zero_eq_basic + (A : Type*) [CommRing A] (e : Fin 2 →₀ ℕ) + (hcoeff : MvPowerSeries.coeff e + (formalLogOnePlusProductArgument A) ≠ 0) : + e = Finsupp.single (0 : Fin 2) 1 ∨ + e = Finsupp.single (1 : Fin 2) 1 ∨ + e = + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1 := by + have hleftle : + e (0 : Fin 2) ≤ 1 := + formalLogOnePlusProductArgument_coeff_ne_zero_left_coord_le_one A e hcoeff + have hrightle : + e (1 : Fin 2) ≤ 1 := + formalLogOnePlusProductArgument_coeff_ne_zero_right_coord_le_one A e hcoeff + have hzeroCoeff : + MvPowerSeries.coeff (0 : Fin 2 →₀ ℕ) + (formalLogOnePlusProductArgument A) = 0 := by + simpa [MvPowerSeries.coeff_zero_eq_constantCoeff_apply] using + formalLogOnePlusProductArgument_constantCoeff A + have hnotzero : e ≠ 0 := by + intro he + exact hcoeff (by simpa [he] using hzeroCoeff) + rcases (Nat.le_one_iff_eq_zero_or_eq_one).1 hleftle with hleft0 | hleft1 + · rcases (Nat.le_one_iff_eq_zero_or_eq_one).1 hrightle with hright0 | hright1 + · exfalso + exact hnotzero + (finsupp_fin_two_eq_zero_of_coords_eq_zero e hleft0 hright0) + · exact Or.inr <| Or.inl <| + finsupp_fin_two_eq_single_right_of_coords_eq e hleft0 hright1 + · rcases (Nat.le_one_iff_eq_zero_or_eq_one).1 hrightle with hright0 | hright1 + · exact Or.inl <| + finsupp_fin_two_eq_single_left_of_coords_eq e hleft1 hright0 + · exact Or.inr <| Or.inr <| + finsupp_fin_two_eq_mixed_of_coords_eq_one e hleft1 hright1 + +/-- +Establishes the identity `l i = Finsupp.single (0 : Fin 2) 1 ∨ l i = Finsupp.single (1 : Fin 2) 1 +∨ l i = Finsupp.single (0 : Fin 2) 1 + Finsupp.single (1 : Fin 2) 1`. +-/ +theorem formalLogOnePlusProductArgument_pow_term_factor_eq_basic_of_prod_ne_zero + (A : Type*) [CommRing A] {q : ℕ} + {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hprod : + (∏ i ∈ Finset.range q, + MvPowerSeries.coeff (l i) (formalLogOnePlusProductArgument A)) ≠ 0) + {i : ℕ} (hi : i ∈ Finset.range q) : + l i = Finsupp.single (0 : Fin 2) 1 ∨ + l i = Finsupp.single (1 : Fin 2) 1 ∨ + l i = + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1 := by + have hfactor : + MvPowerSeries.coeff (l i) (formalLogOnePlusProductArgument A) ≠ 0 := by + intro hzero + exact hprod (Finset.prod_eq_zero hi hzero) + exact formalLogOnePlusProductArgument_coeff_ne_zero_eq_basic A (l i) hfactor + + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalProduct.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalProduct.lean new file mode 100644 index 0000000000..f0cc351dcd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalProduct.lean @@ -0,0 +1,1593 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCore +/-! +Proves the formal combinatorial identities behind additivity of the logarithm on products of +principal units. +-/ + +@[expose] public section + +open Filter +open Polynomial +open scoped Topology +open scoped PowerSeries.WithPiTopology +noncomputable +section + +attribute [local instance] Classical.propDecidable + +universe u + +open LocalFieldTheory.DiscreteValuationField + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +variable {K : Type u} [Field K] + +/-- Proves the bound `e (0 : Fin 2) ≤ q ∧ e (1 : Fin 2) ≤ q ∧ q ≤ e (0 : Fin 2) + e (1 : Fin 2)`. -/ +theorem formalLogOnePlusProductArgument_choiceCounts_q_range + {q : ℕ} {e : Fin 2 →₀ ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hl : l ∈ Finset.finsuppAntidiag (Finset.range q) e) + (hbasic : ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i)) : + e (0 : Fin 2) ≤ q ∧ e (1 : Fin 2) ≤ q ∧ + q ≤ e (0 : Fin 2) + e (1 : Fin 2) := by + exact + ⟨formalLogOnePlusProductArgument_choiceCounts_left_coord_le_q + hl hbasic, + formalLogOnePlusProductArgument_choiceCounts_right_coord_le_q + hl hbasic, + formalLogOnePlusProductArgument_choiceCounts_q_le_coord_sum + hl hbasic⟩ + +/-- Proves the bound `e (0 : Fin 2) ≤ q ∧ e (1 : Fin 2) ≤ q ∧ q ≤ e (0 : Fin 2) + e (1 : Fin 2)`. -/ +theorem formalLogOnePlusProductArgumentBasicFactorChoices_nonempty_q_range + {q : ℕ} {e : Fin 2 →₀ ℕ} + (h : + (formalLogOnePlusProductArgumentBasicFactorChoices q e).Nonempty) : + e (0 : Fin 2) ≤ q ∧ e (1 : Fin 2) ≤ q ∧ + q ≤ e (0 : Fin 2) + e (1 : Fin 2) := by + rcases h with ⟨l, hl⟩ + rw [mem_formalLogOnePlusProductArgumentBasicFactorChoices] at hl + exact formalLogOnePlusProductArgument_choiceCounts_q_range hl.1 hl.2 + +/-- Establishes the identity `formalLogOnePlusProductArgumentBasicFactorChoices q e = ∅`. -/ +theorem formalLogOnePlusProductArgumentBasicFactorChoices_eq_empty_of_q_lt_left_coord + {q : ℕ} {e : Fin 2 →₀ ℕ} + (hleft : q < e (0 : Fin 2)) : + formalLogOnePlusProductArgumentBasicFactorChoices q e = ∅ := by + classical + apply Finset.eq_empty_iff_forall_notMem.2 + intro l hl + rw [mem_formalLogOnePlusProductArgumentBasicFactorChoices] at hl + exact + (not_le_of_gt hleft) + (formalLogOnePlusProductArgument_choiceCounts_q_range hl.1 hl.2).1 + +/-- Establishes the identity `formalLogOnePlusProductArgumentBasicFactorChoices q e = ∅`. -/ +theorem formalLogOnePlusProductArgumentBasicFactorChoices_eq_empty_of_q_lt_right_coord + {q : ℕ} {e : Fin 2 →₀ ℕ} + (hright : q < e (1 : Fin 2)) : + formalLogOnePlusProductArgumentBasicFactorChoices q e = ∅ := by + classical + apply Finset.eq_empty_iff_forall_notMem.2 + intro l hl + rw [mem_formalLogOnePlusProductArgumentBasicFactorChoices] at hl + exact + (not_le_of_gt hright) + (formalLogOnePlusProductArgument_choiceCounts_q_range hl.1 hl.2).2.1 + +/-- Establishes the identity `formalLogOnePlusProductArgumentBasicFactorChoices q e = ∅`. -/ +theorem formalLogOnePlusProductArgumentBasicFactorChoices_eq_empty_of_coord_sum_lt_q + {q : ℕ} {e : Fin 2 →₀ ℕ} + (hsum : e (0 : Fin 2) + e (1 : Fin 2) < q) : + formalLogOnePlusProductArgumentBasicFactorChoices q e = ∅ := by + classical + apply Finset.eq_empty_iff_forall_notMem.2 + intro l hl + rw [mem_formalLogOnePlusProductArgumentBasicFactorChoices] at hl + exact + (not_le_of_gt hsum) + (formalLogOnePlusProductArgument_choiceCounts_q_range hl.1 hl.2).2.2 + +/-- +Establishes the identity `(∏ i ∈ Finset.range q, MvPowerSeries.coeff (l i) +(formalLogOnePlusProductArgument A)) = 1`. +-/ +theorem formalLogOnePlusProductArgument_pow_term_prod_eq_one_of_factors_basic + (A : Type*) [CommRing A] {q : ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hbasic : ∀ i ∈ Finset.range q, + l i = Finsupp.single (0 : Fin 2) 1 ∨ + l i = Finsupp.single (1 : Fin 2) 1 ∨ + l i = + Finsupp.single (0 : Fin 2) 1 + + Finsupp.single (1 : Fin 2) 1) : + (∏ i ∈ Finset.range q, + MvPowerSeries.coeff (l i) (formalLogOnePlusProductArgument A)) = 1 := by + apply Finset.prod_eq_one + intro i hi + rcases hbasic i hi with hleft | hrightOrMixed + · simp [hleft] + · rcases hrightOrMixed with hright | hmixed + · simp [hright] + · simp [hmixed] + +/-- +Establishes the identity `(∏ i ∈ Finset.range q, MvPowerSeries.coeff (l i) +(formalLogOnePlusProductArgument A)) = 1`. +-/ +theorem formalLogOnePlusProductArgument_pow_term_prod_eq_one_of_basicFactor + (A : Type*) [CommRing A] {q : ℕ} {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hbasic : ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i)) : + (∏ i ∈ Finset.range q, + MvPowerSeries.coeff (l i) (formalLogOnePlusProductArgument A)) = 1 := + formalLogOnePlusProductArgument_pow_term_prod_eq_one_of_factors_basic + A (fun i hi => by + simpa [formalLogOnePlusProductArgumentBasicFactor] using hbasic i hi) + +/-- +Establishes the identity `(∏ i ∈ Finset.range q, MvPowerSeries.coeff (l i) +(formalLogOnePlusProductArgument A)) = 1`. +-/ +theorem formalLogOnePlusProductArgument_pow_term_prod_eq_one_of_ne_zero + (A : Type*) [CommRing A] {q : ℕ} + {l : ℕ →₀ (Fin 2 →₀ ℕ)} + (hprod : + (∏ i ∈ Finset.range q, + MvPowerSeries.coeff (l i) (formalLogOnePlusProductArgument A)) ≠ 0) : + (∏ i ∈ Finset.range q, + MvPowerSeries.coeff (l i) (formalLogOnePlusProductArgument A)) = 1 := by + exact + formalLogOnePlusProductArgument_pow_term_prod_eq_one_of_factors_basic + A (fun i hi => + formalLogOnePlusProductArgument_pow_term_factor_eq_basic_of_prod_ne_zero + A hprod hi) + +/-- +Establishes the identity `MvPowerSeries.coeff e ((formalLogOnePlusProductArgument A) ^ q) = ∑ l ∈ +Finset.finsuppAntidiag (Finset.range q) e, if ∀ i ∈ Finset.range q, +formalLogOnePlusProductArgumentBasicFactor (l i) then (1 : A) else 0`. +-/ +theorem formalLogOnePlusProductArgument_pow_coeff_eq_sum_basicFactor + (A : Type*) [CommRing A] (q : ℕ) (e : Fin 2 →₀ ℕ) : + MvPowerSeries.coeff e ((formalLogOnePlusProductArgument A) ^ q) = + ∑ l ∈ Finset.finsuppAntidiag (Finset.range q) e, + if ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i) + then (1 : A) else 0 := by + classical + rw [MvPowerSeries.coeff_pow] + apply Finset.sum_congr rfl + intro l hl + by_cases hbasic : + ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i) + · rw [formalLogOnePlusProductArgument_pow_term_prod_eq_one_of_basicFactor + A hbasic] + rw [ite_eq_left hbasic] + · have hprodZero : + (∏ i ∈ Finset.range q, + MvPowerSeries.coeff (l i) (formalLogOnePlusProductArgument A)) = 0 := by + by_contra hprodNe + apply hbasic + intro i hi + exact + formalLogOnePlusProductArgument_coeff_ne_zero_eq_basic A (l i) (by + intro hzero + exact hprodNe (Finset.prod_eq_zero hi hzero)) + rw [hprodZero] + rw [ite_eq_right hbasic] + +/-- +Establishes the identity `(∑ l ∈ Finset.finsuppAntidiag (Finset.range q) e, if ∀ i ∈ Finset.range +q, formalLogOnePlusProductArgumentBasicFactor (l i) then (1 : A) else 0) = +((formalLogOnePlusProductArgumentBasicFactorChoices q e).card : A)`. +-/ +theorem formalLogOnePlusProductArgument_basicFactor_sum_eq_card_choices + (A : Type*) [CommRing A] (q : ℕ) (e : Fin 2 →₀ ℕ) : + (∑ l ∈ Finset.finsuppAntidiag (Finset.range q) e, + if ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i) + then (1 : A) else 0) = + ((formalLogOnePlusProductArgumentBasicFactorChoices q e).card : A) := by + classical + simp [formalLogOnePlusProductArgumentBasicFactorChoices] + +/-- +Establishes the identity `MvPowerSeries.coeff e ((formalLogOnePlusProductArgument A) ^ q) = +((formalLogOnePlusProductArgumentBasicFactorChoices q e).card : A)`. +-/ +theorem formalLogOnePlusProductArgument_pow_coeff_eq_card_choices + (A : Type*) [CommRing A] (q : ℕ) (e : Fin 2 →₀ ℕ) : + MvPowerSeries.coeff e ((formalLogOnePlusProductArgument A) ^ q) = + ((formalLogOnePlusProductArgumentBasicFactorChoices q e).card : A) := by + rw [formalLogOnePlusProductArgument_pow_coeff_eq_sum_basicFactor, + formalLogOnePlusProductArgument_basicFactor_sum_eq_card_choices] + +/-- +Establishes the identity `MvPowerSeries.coeff e ((formalLogOnePlusProductArgument A) ^ q) = 0`. +-/ +theorem formalLogOnePlusProductArgument_pow_coeff_eq_zero_of_coord_sum_lt + (A : Type*) [CommRing A] (q : ℕ) (e : Fin 2 →₀ ℕ) + (hsum : e (0 : Fin 2) + e (1 : Fin 2) < q) : + MvPowerSeries.coeff e ((formalLogOnePlusProductArgument A) ^ q) = 0 := by + rw [formalLogOnePlusProductArgument_pow_coeff_eq_card_choices, + formalLogOnePlusProductArgumentBasicFactorChoices_eq_empty_of_coord_sum_lt_q + hsum] + simp + +/-- +Establishes the identity `MvPowerSeries.coeff e ((formalLogOnePlusProductArgument A) ^ q) = 0`. +-/ +theorem formalLogOnePlusProductArgument_pow_coeff_eq_zero_of_left_coord_lt + (A : Type*) [CommRing A] (q : ℕ) (e : Fin 2 →₀ ℕ) + (hleft : q < e (0 : Fin 2)) : + MvPowerSeries.coeff e ((formalLogOnePlusProductArgument A) ^ q) = 0 := by + classical + rw [MvPowerSeries.coeff_pow] + apply Finset.sum_eq_zero + intro l hl + rw [Finset.mem_finsuppAntidiag] at hl + by_cases hprod : + ∏ i ∈ Finset.range q, + MvPowerSeries.coeff (l i) (formalLogOnePlusProductArgument A) = 0 + · exact hprod + · exfalso + have hfactor : + ∀ i ∈ Finset.range q, + MvPowerSeries.coeff (l i) + (formalLogOnePlusProductArgument A) ≠ 0 := by + intro i hi hzero + exact hprod (Finset.prod_eq_zero hi hzero) + have hcoord : + (∑ i ∈ Finset.range q, l i (0 : Fin 2)) = e (0 : Fin 2) := by + simpa [Finsupp.finsetSum_apply] using + congrArg (fun m : Fin 2 →₀ ℕ => m (0 : Fin 2)) hl.1 + have hsum_le : + (∑ i ∈ Finset.range q, l i (0 : Fin 2)) ≤ + ∑ _i ∈ Finset.range q, 1 := by + exact Finset.sum_le_sum fun i hi => + formalLogOnePlusProductArgument_coeff_ne_zero_left_coord_le_one + A (l i) (hfactor i hi) + have hcoord_le : e (0 : Fin 2) ≤ q := by + simpa [hcoord] using hsum_le + exact (not_lt_of_ge hcoord_le) hleft + +/-- +Establishes the identity `MvPowerSeries.coeff e ((formalLogOnePlusProductArgument A) ^ q) = 0`. +-/ +theorem formalLogOnePlusProductArgument_pow_coeff_eq_zero_of_right_coord_lt + (A : Type*) [CommRing A] (q : ℕ) (e : Fin 2 →₀ ℕ) + (hright : q < e (1 : Fin 2)) : + MvPowerSeries.coeff e ((formalLogOnePlusProductArgument A) ^ q) = 0 := by + classical + rw [MvPowerSeries.coeff_pow] + apply Finset.sum_eq_zero + intro l hl + rw [Finset.mem_finsuppAntidiag] at hl + by_cases hprod : + ∏ i ∈ Finset.range q, + MvPowerSeries.coeff (l i) (formalLogOnePlusProductArgument A) = 0 + · exact hprod + · exfalso + have hfactor : + ∀ i ∈ Finset.range q, + MvPowerSeries.coeff (l i) + (formalLogOnePlusProductArgument A) ≠ 0 := by + intro i hi hzero + exact hprod (Finset.prod_eq_zero hi hzero) + have hcoord : + (∑ i ∈ Finset.range q, l i (1 : Fin 2)) = e (1 : Fin 2) := by + simpa [Finsupp.finsetSum_apply] using + congrArg (fun m : Fin 2 →₀ ℕ => m (1 : Fin 2)) hl.1 + have hsum_le : + (∑ i ∈ Finset.range q, l i (1 : Fin 2)) ≤ + ∑ _i ∈ Finset.range q, 1 := by + exact Finset.sum_le_sum fun i hi => + formalLogOnePlusProductArgument_coeff_ne_zero_right_coord_le_one + A (l i) (hfactor i hi) + have hcoord_le : e (1 : Fin 2) ≤ q := by + simpa [hcoord] using hsum_le + exact (not_lt_of_ge hcoord_le) hright + +/-- +Establishes the identity `MvPowerSeries.coeff e ((formalLogOnePlusProductArgument A) ^ q) = 0`. +-/ +theorem formalLogOnePlusProductArgument_pow_coeff_eq_zero_of_degree_lt + (A : Type*) [CommRing A] (q : ℕ) (e : Fin 2 →₀ ℕ) + (hdegree : Finsupp.degree e < q) : + MvPowerSeries.coeff e ((formalLogOnePlusProductArgument A) ^ q) = 0 := by + have hnil : + MvPowerSeries.constantCoeff (formalLogOnePlusProductArgument A) ^ 1 = + 0 := by + simp [formalLogOnePlusProductArgument_constantCoeff A] + exact + MvPowerSeries.coeff_eq_zero_of_constantCoeff_nilpotent + (f := formalLogOnePlusProductArgument A) (m := 1) hnil + (d := e) (n := q) (by + have hs : Finsupp.degree e + 1 ≤ q := + Nat.succ_le_of_lt hdegree + simpa [Nat.add_comm] using hs) + +/-- +Establishes the identity `PowerSeries.coeff q (PowerSeries.log A) • +MvPowerSeries.coeff e ((formalLogOnePlusProductArgument A) ^ q) = 0`. +-/ +theorem formalLogOnePlusProductArgument_logSubst_coeff_term_eq_zero_of_degree_lt + (A : Type*) [CommRing A] [Algebra ℚ A] (q : ℕ) (e : Fin 2 →₀ ℕ) + (hdegree : Finsupp.degree e < q) : + PowerSeries.coeff q (PowerSeries.log A) • + MvPowerSeries.coeff e ((formalLogOnePlusProductArgument A) ^ q) = + 0 := by + rw [formalLogOnePlusProductArgument_pow_coeff_eq_zero_of_degree_lt + A q e hdegree] + simp + +/-- +Establishes the identity `PowerSeries.coeff q (PowerSeries.log A) • +MvPowerSeries.coeff e ((formalLogOnePlusProductArgument A) ^ q) = 0`. +-/ +theorem formalLogOnePlusProductArgument_logSubst_coeff_term_eq_zero_of_left_coord_lt + (A : Type*) [CommRing A] [Algebra ℚ A] (q : ℕ) (e : Fin 2 →₀ ℕ) + (hleft : q < e (0 : Fin 2)) : + PowerSeries.coeff q (PowerSeries.log A) • + MvPowerSeries.coeff e ((formalLogOnePlusProductArgument A) ^ q) = + 0 := by + rw [formalLogOnePlusProductArgument_pow_coeff_eq_zero_of_left_coord_lt + A q e hleft] + simp + +/-- +Establishes the identity `PowerSeries.coeff q (PowerSeries.log A) • +MvPowerSeries.coeff e ((formalLogOnePlusProductArgument A) ^ q) = 0`. +-/ +theorem formalLogOnePlusProductArgument_logSubst_coeff_term_eq_zero_of_right_coord_lt + (A : Type*) [CommRing A] [Algebra ℚ A] (q : ℕ) (e : Fin 2 →₀ ℕ) + (hright : q < e (1 : Fin 2)) : + PowerSeries.coeff q (PowerSeries.log A) • + MvPowerSeries.coeff e ((formalLogOnePlusProductArgument A) ^ q) = + 0 := by + rw [formalLogOnePlusProductArgument_pow_coeff_eq_zero_of_right_coord_lt + A q e hright] + simp + +/-- Expands a coefficient of the logarithm substituted at the product +argument as a finite sum bounded by the total degree of the exponent. -/ +theorem formalLogOnePlusProductArgument_logSubst_coeff_eq_sum_range_degree_succ + (A : Type*) [CommRing A] [Algebra ℚ A] (e : Fin 2 →₀ ℕ) : + MvPowerSeries.coeff e + (PowerSeries.subst (formalLogOnePlusProductArgument A) (PowerSeries.log A)) = + ∑ q ∈ Finset.range (Finsupp.degree e + 1), + PowerSeries.coeff q (PowerSeries.log A) • + MvPowerSeries.coeff e + ((formalLogOnePlusProductArgument A) ^ q) := by + rw [PowerSeries.coeff_subst + (formalLogOnePlusProductArgument_hasSubst A) (PowerSeries.log A) e] + apply finsum_eq_sum_of_support_subset + intro q hq + by_contra hmem + rw [Finset.mem_coe, Finset.mem_range] at hmem + have hdegree : Finsupp.degree e < q := Nat.lt_of_succ_le + (Nat.le_of_not_gt hmem) + exact hq + (formalLogOnePlusProductArgument_logSubst_coeff_term_eq_zero_of_degree_lt + A q e hdegree) + +/-- Refines the coefficient expansion to powers at least as large as both +coordinates of the exponent. -/ +theorem formalLogOnePlusProductArgument_logSubst_coeff_eq_sum_range_degree_succ_filter_coord_le + (A : Type*) [CommRing A] [Algebra ℚ A] (e : Fin 2 →₀ ℕ) : + MvPowerSeries.coeff e + (PowerSeries.subst (formalLogOnePlusProductArgument A) (PowerSeries.log A)) = + ∑ q ∈ + (Finset.range (Finsupp.degree e + 1)).filter + (fun q : ℕ => e (0 : Fin 2) ≤ q ∧ e (1 : Fin 2) ≤ q), + PowerSeries.coeff q (PowerSeries.log A) • + MvPowerSeries.coeff e + ((formalLogOnePlusProductArgument A) ^ q) := by + rw [formalLogOnePlusProductArgument_logSubst_coeff_eq_sum_range_degree_succ] + exact + (Finset.sum_subset (Finset.filter_subset _ _) (fun q hq hnot => by + by_cases hleft : e (0 : Fin 2) ≤ q + · by_cases hright : e (1 : Fin 2) ≤ q + · exfalso + exact hnot (by simpa [hleft, hright] using hq) + · exact + formalLogOnePlusProductArgument_logSubst_coeff_term_eq_zero_of_right_coord_lt + A q e (Nat.lt_of_not_ge hright) + · exact + formalLogOnePlusProductArgument_logSubst_coeff_term_eq_zero_of_left_coord_lt + A q e (Nat.lt_of_not_ge hleft))).symm + +/-- +Establishes the divisibility statement `(MvPowerSeries.X (1 : Fin 2) : MvPowerSeries (Fin 2) A) ∣ +formalLogOnePlusProductArgument A - MvPowerSeries.X (0 : Fin 2)`. +-/ +theorem formalLogOnePlusProductArgument_sub_leftVariable_dvd_rightVariable + (A : Type*) [CommRing A] : + (MvPowerSeries.X (1 : Fin 2) : MvPowerSeries (Fin 2) A) ∣ + formalLogOnePlusProductArgument A - + MvPowerSeries.X (0 : Fin 2) := by + let X0 : MvPowerSeries (Fin 2) A := MvPowerSeries.X (0 : Fin 2) + let X1 : MvPowerSeries (Fin 2) A := MvPowerSeries.X (1 : Fin 2) + refine ⟨1 + X0, ?_⟩ + change formalLogOnePlusProductArgument A - X0 = X1 * (1 + X0) + simp [formalLogOnePlusProductArgument] + ring + +/-- +Establishes the divisibility statement `(MvPowerSeries.X (0 : Fin 2) : MvPowerSeries (Fin 2) A) ∣ +formalLogOnePlusProductArgument A - MvPowerSeries.X (1 : Fin 2)`. +-/ +theorem formalLogOnePlusProductArgument_sub_rightVariable_dvd_leftVariable + (A : Type*) [CommRing A] : + (MvPowerSeries.X (0 : Fin 2) : MvPowerSeries (Fin 2) A) ∣ + formalLogOnePlusProductArgument A - + MvPowerSeries.X (1 : Fin 2) := by + let X0 : MvPowerSeries (Fin 2) A := MvPowerSeries.X (0 : Fin 2) + let X1 : MvPowerSeries (Fin 2) A := MvPowerSeries.X (1 : Fin 2) + refine ⟨1 + X1, ?_⟩ + change formalLogOnePlusProductArgument A - X1 = X0 * (1 + X1) + simp [formalLogOnePlusProductArgument] + ring + +/-- +Establishes the divisibility statement `(MvPowerSeries.X (1 : Fin 2) : MvPowerSeries (Fin 2) A) ∣ +(formalLogOnePlusProductArgument A) ^ d - (MvPowerSeries.X (0 : Fin 2) : MvPowerSeries (Fin 2) A) +^ d`. +-/ +theorem formalLogOnePlusProductArgument_pow_sub_leftVariable_pow_dvd_rightVariable + (A : Type*) [CommRing A] (d : ℕ) : + (MvPowerSeries.X (1 : Fin 2) : MvPowerSeries (Fin 2) A) ∣ + (formalLogOnePlusProductArgument A) ^ d - + (MvPowerSeries.X (0 : Fin 2) : MvPowerSeries (Fin 2) A) ^ d := by + exact + (formalLogOnePlusProductArgument_sub_leftVariable_dvd_rightVariable A).trans + (sub_dvd_pow_sub_pow + (formalLogOnePlusProductArgument A) + (MvPowerSeries.X (0 : Fin 2) : MvPowerSeries (Fin 2) A) d) + +/-- +Establishes the divisibility statement `(MvPowerSeries.X (0 : Fin 2) : MvPowerSeries (Fin 2) A) ∣ +(formalLogOnePlusProductArgument A) ^ d - (MvPowerSeries.X (1 : Fin 2) : MvPowerSeries (Fin 2) A) +^ d`. +-/ +theorem formalLogOnePlusProductArgument_pow_sub_rightVariable_pow_dvd_leftVariable + (A : Type*) [CommRing A] (d : ℕ) : + (MvPowerSeries.X (0 : Fin 2) : MvPowerSeries (Fin 2) A) ∣ + (formalLogOnePlusProductArgument A) ^ d - + (MvPowerSeries.X (1 : Fin 2) : MvPowerSeries (Fin 2) A) ^ d := by + exact + (formalLogOnePlusProductArgument_sub_rightVariable_dvd_leftVariable A).trans + (sub_dvd_pow_sub_pow + (formalLogOnePlusProductArgument A) + (MvPowerSeries.X (1 : Fin 2) : MvPowerSeries (Fin 2) A) d) + +/-- +Establishes the identity `MvPowerSeries.coeff (Finsupp.single (0 : Fin 2) n) +((formalLogOnePlusProductArgument A) ^ d) = MvPowerSeries.coeff (Finsupp.single (0 : Fin 2) n) +((MvPowerSeries.X (0 : Fin 2) : MvPowerSeries (Fin 2) A) ^ d)`. +-/ +theorem formalLogOnePlusProductArgument_pow_coeff_single_left + (A : Type*) [CommRing A] (d n : ℕ) : + MvPowerSeries.coeff (Finsupp.single (0 : Fin 2) n) + ((formalLogOnePlusProductArgument A) ^ d) = + MvPowerSeries.coeff (Finsupp.single (0 : Fin 2) n) + ((MvPowerSeries.X (0 : Fin 2) : MvPowerSeries (Fin 2) A) ^ d) := by + have hdiv := + formalLogOnePlusProductArgument_pow_sub_leftVariable_pow_dvd_rightVariable + A d + have hcoeffSub : + MvPowerSeries.coeff (Finsupp.single (0 : Fin 2) n) + ((formalLogOnePlusProductArgument A) ^ d - + (MvPowerSeries.X (0 : Fin 2) : + MvPowerSeries (Fin 2) A) ^ d) = 0 := by + have hvanish := + (MvPowerSeries.X_pow_dvd_iff + (s := (1 : Fin 2)) (n := 1) + (φ := (formalLogOnePlusProductArgument A) ^ d - + (MvPowerSeries.X (0 : Fin 2) : + MvPowerSeries (Fin 2) A) ^ d)).1 + (by simpa using hdiv) + exact hvanish (Finsupp.single (0 : Fin 2) n) (by + have h10 : (1 : Fin 2) ≠ (0 : Fin 2) := by decide + simp [Finsupp.single_eq_of_ne h10]) + rw [map_sub] at hcoeffSub + exact sub_eq_zero.mp hcoeffSub + +/-- +Establishes the identity `MvPowerSeries.coeff (Finsupp.single (1 : Fin 2) n) +((formalLogOnePlusProductArgument A) ^ d) = MvPowerSeries.coeff (Finsupp.single (1 : Fin 2) n) +((MvPowerSeries.X (1 : Fin 2) : MvPowerSeries (Fin 2) A) ^ d)`. +-/ +theorem formalLogOnePlusProductArgument_pow_coeff_single_right + (A : Type*) [CommRing A] (d n : ℕ) : + MvPowerSeries.coeff (Finsupp.single (1 : Fin 2) n) + ((formalLogOnePlusProductArgument A) ^ d) = + MvPowerSeries.coeff (Finsupp.single (1 : Fin 2) n) + ((MvPowerSeries.X (1 : Fin 2) : MvPowerSeries (Fin 2) A) ^ d) := by + have hdiv := + formalLogOnePlusProductArgument_pow_sub_rightVariable_pow_dvd_leftVariable + A d + have hcoeffSub : + MvPowerSeries.coeff (Finsupp.single (1 : Fin 2) n) + ((formalLogOnePlusProductArgument A) ^ d - + (MvPowerSeries.X (1 : Fin 2) : + MvPowerSeries (Fin 2) A) ^ d) = 0 := by + have hvanish := + (MvPowerSeries.X_pow_dvd_iff + (s := (0 : Fin 2)) (n := 1) + (φ := (formalLogOnePlusProductArgument A) ^ d - + (MvPowerSeries.X (1 : Fin 2) : + MvPowerSeries (Fin 2) A) ^ d)).1 + (by simpa using hdiv) + exact hvanish (Finsupp.single (1 : Fin 2) n) (by + have h01 : (0 : Fin 2) ≠ (1 : Fin 2) := by decide + simp [Finsupp.single_eq_of_ne h01]) + rw [map_sub] at hcoeffSub + exact sub_eq_zero.mp hcoeffSub + +/-- +Establishes the identity `MvPowerSeries.coeff e ((MvPowerSeries.X (0 : Fin 2) : MvPowerSeries (Fin +2) A) ^ d) = if e = Finsupp.single (0 : Fin 2) d then 1 else 0`. +-/ +theorem formalLogOnePlusLeftVariable_pow_coeff + (A : Type*) [CommRing A] (e : Fin 2 →₀ ℕ) (d : ℕ) : + MvPowerSeries.coeff e + ((MvPowerSeries.X (0 : Fin 2) : MvPowerSeries (Fin 2) A) ^ d) = + if e = Finsupp.single (0 : Fin 2) d then 1 else 0 := by + simpa using + MvPowerSeries.coeff_X_pow (R := A) e (0 : Fin 2) d + +/-- +Establishes the identity `MvPowerSeries.coeff e ((MvPowerSeries.X (1 : Fin 2) : MvPowerSeries (Fin +2) A) ^ d) = if e = Finsupp.single (1 : Fin 2) d then 1 else 0`. +-/ +theorem formalLogOnePlusRightVariable_pow_coeff + (A : Type*) [CommRing A] (e : Fin 2 →₀ ℕ) (d : ℕ) : + MvPowerSeries.coeff e + ((MvPowerSeries.X (1 : Fin 2) : MvPowerSeries (Fin 2) A) ^ d) = + if e = Finsupp.single (1 : Fin 2) d then 1 else 0 := by + simpa using + MvPowerSeries.coeff_X_pow (R := A) e (1 : Fin 2) d + +/-- +Establishes the identity `MvPowerSeries.coeff (Finsupp.single (0 : Fin 2) n) +(PowerSeries.subst (formalLogOnePlusProductArgument A) (PowerSeries.log A)) = PowerSeries.coeff n +(PowerSeries.log A)`. +-/ +theorem formalLogOnePlusProductArgument_logSubst_coeff_single_left + (A : Type*) [CommRing A] [Algebra ℚ A] (n : ℕ) : + MvPowerSeries.coeff (Finsupp.single (0 : Fin 2) n) + (PowerSeries.subst (formalLogOnePlusProductArgument A) (PowerSeries.log A)) = + PowerSeries.coeff n (PowerSeries.log A) := by + rw [PowerSeries.coeff_subst + (formalLogOnePlusProductArgument_hasSubst A) (PowerSeries.log A) + (Finsupp.single (0 : Fin 2) n)] + rw [finsum_eq_single _ n] + · rw [formalLogOnePlusProductArgument_pow_coeff_single_left] + simp [formalLogOnePlusLeftVariable_pow_coeff] + · intro d hd + rw [formalLogOnePlusProductArgument_pow_coeff_single_left] + rw [formalLogOnePlusLeftVariable_pow_coeff] + have hsingle : + Finsupp.single (0 : Fin 2) n ≠ Finsupp.single (0 : Fin 2) d := by + intro h + apply hd + have hcoord := congrArg (fun e : Fin 2 →₀ ℕ => e (0 : Fin 2)) h + simpa using hcoord.symm + simp [hsingle] + +/-- +Establishes the identity `MvPowerSeries.coeff (Finsupp.single (1 : Fin 2) n) +(PowerSeries.subst (formalLogOnePlusProductArgument A) (PowerSeries.log A)) = PowerSeries.coeff n +(PowerSeries.log A)`. +-/ +theorem formalLogOnePlusProductArgument_logSubst_coeff_single_right + (A : Type*) [CommRing A] [Algebra ℚ A] (n : ℕ) : + MvPowerSeries.coeff (Finsupp.single (1 : Fin 2) n) + (PowerSeries.subst (formalLogOnePlusProductArgument A) (PowerSeries.log A)) = + PowerSeries.coeff n (PowerSeries.log A) := by + rw [PowerSeries.coeff_subst + (formalLogOnePlusProductArgument_hasSubst A) (PowerSeries.log A) + (Finsupp.single (1 : Fin 2) n)] + rw [finsum_eq_single _ n] + · rw [formalLogOnePlusProductArgument_pow_coeff_single_right] + simp [formalLogOnePlusRightVariable_pow_coeff] + · intro d hd + rw [formalLogOnePlusProductArgument_pow_coeff_single_right] + rw [formalLogOnePlusRightVariable_pow_coeff] + have hsingle : + Finsupp.single (1 : Fin 2) n ≠ Finsupp.single (1 : Fin 2) d := by + intro h + apply hd + have hcoord := congrArg (fun e : Fin 2 →₀ ℕ => e (1 : Fin 2)) h + simpa using hcoord.symm + simp [hsingle] + +/-- The formal logarithm `log(1 + X)`, viewed as a two-variable series in the +left variable. -/ +noncomputable def formalLogOnePlusLeftVariableLogSubst + (A : Type*) [CommRing A] [Algebra ℚ A] : MvPowerSeries (Fin 2) A := + PowerSeries.subst + (MvPowerSeries.X (0 : Fin 2) : MvPowerSeries (Fin 2) A) + (PowerSeries.log A) + +/-- The formal logarithm `log(1 + Y)`, viewed as a two-variable series in the +right variable. -/ +noncomputable def formalLogOnePlusRightVariableLogSubst + (A : Type*) [CommRing A] [Algebra ℚ A] : MvPowerSeries (Fin 2) A := + PowerSeries.subst + (MvPowerSeries.X (1 : Fin 2) : MvPowerSeries (Fin 2) A) + (PowerSeries.log A) + +/-- The formal right-hand side `log(1 + X) + log(1 + Y)` of the logarithm +product formula. -/ +noncomputable def formalLogOnePlusProductRightSide + (A : Type*) [CommRing A] [Algebra ℚ A] : MvPowerSeries (Fin 2) A := + formalLogOnePlusLeftVariableLogSubst A + + formalLogOnePlusRightVariableLogSubst A + +/-- +Establishes the identity `MvPowerSeries.coeff (Finsupp.single (0 : Fin 2) n) +(formalLogOnePlusLeftVariableLogSubst A) = PowerSeries.coeff n (PowerSeries.log A)`. +-/ +theorem formalLogOnePlusLeftVariableLogSubst_coeff_single + (A : Type*) [CommRing A] [Algebra ℚ A] (n : ℕ) : + MvPowerSeries.coeff (Finsupp.single (0 : Fin 2) n) + (formalLogOnePlusLeftVariableLogSubst A) = + PowerSeries.coeff n (PowerSeries.log A) := by + simp [formalLogOnePlusLeftVariableLogSubst, PowerSeries.coeff_subst_single] + +/-- +Establishes the identity `MvPowerSeries.coeff (Finsupp.single (1 : Fin 2) n) +(formalLogOnePlusRightVariableLogSubst A) = PowerSeries.coeff n (PowerSeries.log A)`. +-/ +theorem formalLogOnePlusRightVariableLogSubst_coeff_single + (A : Type*) [CommRing A] [Algebra ℚ A] (n : ℕ) : + MvPowerSeries.coeff (Finsupp.single (1 : Fin 2) n) + (formalLogOnePlusRightVariableLogSubst A) = + PowerSeries.coeff n (PowerSeries.log A) := by + simp [formalLogOnePlusRightVariableLogSubst, PowerSeries.coeff_subst_single] + +/-- +Establishes the identity `MvPowerSeries.coeff e (formalLogOnePlusLeftVariableLogSubst A) = 0`. +-/ +theorem formalLogOnePlusLeftVariableLogSubst_coeff_of_ne_axis + (A : Type*) [CommRing A] [Algebra ℚ A] (e : Fin 2 →₀ ℕ) + (he : ∀ d : ℕ, e ≠ Finsupp.single (0 : Fin 2) d) : + MvPowerSeries.coeff e (formalLogOnePlusLeftVariableLogSubst A) = 0 := by + simp [formalLogOnePlusLeftVariableLogSubst, PowerSeries.coeff_subst_single, he] + +/-- +Establishes the identity `MvPowerSeries.coeff e (formalLogOnePlusRightVariableLogSubst A) = 0`. +-/ +theorem formalLogOnePlusRightVariableLogSubst_coeff_of_ne_axis + (A : Type*) [CommRing A] [Algebra ℚ A] (e : Fin 2 →₀ ℕ) + (he : ∀ d : ℕ, e ≠ Finsupp.single (1 : Fin 2) d) : + MvPowerSeries.coeff e (formalLogOnePlusRightVariableLogSubst A) = 0 := by + simp [formalLogOnePlusRightVariableLogSubst, PowerSeries.coeff_subst_single, he] + +/-- +Establishes the identity `MvPowerSeries.coeff e (formalLogOnePlusProductRightSide A) = +MvPowerSeries.coeff e (formalLogOnePlusLeftVariableLogSubst A) + MvPowerSeries.coeff e +(formalLogOnePlusRightVariableLogSubst A)`. +-/ +theorem formalLogOnePlusProductRightSide_coeff + (A : Type*) [CommRing A] [Algebra ℚ A] (e : Fin 2 →₀ ℕ) : + MvPowerSeries.coeff e (formalLogOnePlusProductRightSide A) = + MvPowerSeries.coeff e (formalLogOnePlusLeftVariableLogSubst A) + + MvPowerSeries.coeff e (formalLogOnePlusRightVariableLogSubst A) := by + simp [formalLogOnePlusProductRightSide] + +/-- The logarithm substituted at the product argument has zero constant +coefficient. -/ +theorem formalLogOnePlusProductArgument_logSubst_constantCoeff + (A : Type*) [CommRing A] [Algebra ℚ A] : + MvPowerSeries.constantCoeff + (PowerSeries.subst (formalLogOnePlusProductArgument A) (PowerSeries.log A)) = 0 := + PowerSeries.constantCoeff_subst_eq_zero + (formalLogOnePlusProductArgument_constantCoeff A) + (PowerSeries.log A) PowerSeries.constantCoeff_log + +/-- +Establishes the identity `MvPowerSeries.coeff (Finsupp.single (0 : Fin 2) n) +(formalLogOnePlusProductRightSide A) = PowerSeries.coeff n (PowerSeries.log A)`. +-/ +theorem formalLogOnePlusProductRightSide_coeff_single_left + (A : Type*) [CommRing A] [Algebra ℚ A] (n : ℕ) : + MvPowerSeries.coeff (Finsupp.single (0 : Fin 2) n) + (formalLogOnePlusProductRightSide A) = + PowerSeries.coeff n (PowerSeries.log A) := by + rw [formalLogOnePlusProductRightSide_coeff, + formalLogOnePlusLeftVariableLogSubst_coeff_single] + have hright : + MvPowerSeries.coeff (Finsupp.single (0 : Fin 2) n) + (formalLogOnePlusRightVariableLogSubst A) = 0 := by + by_cases hn : n = 0 + · subst n + simpa [Finsupp.single_zero] using + formalLogOnePlusRightVariableLogSubst_coeff_single A 0 + · exact + formalLogOnePlusRightVariableLogSubst_coeff_of_ne_axis A + (Finsupp.single (0 : Fin 2) n) + (fun d h => by + apply hn + have hcoord := + congrArg (fun e : Fin 2 →₀ ℕ => e (0 : Fin 2)) h + simpa using hcoord) + simp [hright] + +/-- +Establishes the identity `MvPowerSeries.coeff (Finsupp.single (1 : Fin 2) n) +(formalLogOnePlusProductRightSide A) = PowerSeries.coeff n (PowerSeries.log A)`. +-/ +theorem formalLogOnePlusProductRightSide_coeff_single_right + (A : Type*) [CommRing A] [Algebra ℚ A] (n : ℕ) : + MvPowerSeries.coeff (Finsupp.single (1 : Fin 2) n) + (formalLogOnePlusProductRightSide A) = + PowerSeries.coeff n (PowerSeries.log A) := by + rw [formalLogOnePlusProductRightSide_coeff, + formalLogOnePlusRightVariableLogSubst_coeff_single] + have hleft : + MvPowerSeries.coeff (Finsupp.single (1 : Fin 2) n) + (formalLogOnePlusLeftVariableLogSubst A) = 0 := by + by_cases hn : n = 0 + · subst n + simpa [Finsupp.single_zero] using + formalLogOnePlusLeftVariableLogSubst_coeff_single A 0 + · exact + formalLogOnePlusLeftVariableLogSubst_coeff_of_ne_axis A + (Finsupp.single (1 : Fin 2) n) + (fun d h => by + apply hn + have hcoord := + congrArg (fun e : Fin 2 →₀ ℕ => e (1 : Fin 2)) h + simpa using hcoord) + abel_nf + simp [hleft] + +/-- Establishes the identity `MvPowerSeries.coeff e (formalLogOnePlusProductRightSide A) = 0`. -/ +theorem formalLogOnePlusProductRightSide_coeff_of_ne_axes + (A : Type*) [CommRing A] [Algebra ℚ A] (e : Fin 2 →₀ ℕ) + (heLeft : ∀ d : ℕ, e ≠ Finsupp.single (0 : Fin 2) d) + (heRight : ∀ d : ℕ, e ≠ Finsupp.single (1 : Fin 2) d) : + MvPowerSeries.coeff e (formalLogOnePlusProductRightSide A) = 0 := by + rw [formalLogOnePlusProductRightSide_coeff] + simp [formalLogOnePlusLeftVariableLogSubst_coeff_of_ne_axis A e heLeft, + formalLogOnePlusRightVariableLogSubst_coeff_of_ne_axis A e heRight] + +/-- +Establishes the identity `MvPowerSeries.coeff (Finsupp.single (0 : Fin 2) n) +(PowerSeries.subst (formalLogOnePlusProductArgument A) (PowerSeries.log A)) = MvPowerSeries.coeff +(Finsupp.single (0 : Fin 2) n) (formalLogOnePlusProductRightSide A)`. +-/ +theorem formalLogOnePlusProductFormula_coeff_single_left + (A : Type*) [CommRing A] [Algebra ℚ A] (n : ℕ) : + MvPowerSeries.coeff (Finsupp.single (0 : Fin 2) n) + (PowerSeries.subst (formalLogOnePlusProductArgument A) (PowerSeries.log A)) = + MvPowerSeries.coeff (Finsupp.single (0 : Fin 2) n) + (formalLogOnePlusProductRightSide A) := by + rw [formalLogOnePlusProductArgument_logSubst_coeff_single_left, + formalLogOnePlusProductRightSide_coeff_single_left] + +/-- +Establishes the identity `MvPowerSeries.coeff (Finsupp.single (1 : Fin 2) n) +(PowerSeries.subst (formalLogOnePlusProductArgument A) (PowerSeries.log A)) = MvPowerSeries.coeff +(Finsupp.single (1 : Fin 2) n) (formalLogOnePlusProductRightSide A)`. +-/ +theorem formalLogOnePlusProductFormula_coeff_single_right + (A : Type*) [CommRing A] [Algebra ℚ A] (n : ℕ) : + MvPowerSeries.coeff (Finsupp.single (1 : Fin 2) n) + (PowerSeries.subst (formalLogOnePlusProductArgument A) (PowerSeries.log A)) = + MvPowerSeries.coeff (Finsupp.single (1 : Fin 2) n) + (formalLogOnePlusProductRightSide A) := by + rw [formalLogOnePlusProductArgument_logSubst_coeff_single_right, + formalLogOnePlusProductRightSide_coeff_single_right] + +/-- Establishes the identity `e = Finsupp.single (0 : Fin 2) (e (0 : Fin 2))`. -/ +theorem finsupp_fin_two_eq_single_left_of_right_eq_zero + (e : Fin 2 →₀ ℕ) (he : e (1 : Fin 2) = 0) : + e = Finsupp.single (0 : Fin 2) (e (0 : Fin 2)) := by + ext i + fin_cases i <;> simp [he] + +/-- Establishes the identity `e = Finsupp.single (1 : Fin 2) (e (1 : Fin 2))`. -/ +theorem finsupp_fin_two_eq_single_right_of_left_eq_zero + (e : Fin 2 →₀ ℕ) (he : e (0 : Fin 2) = 0) : + e = Finsupp.single (1 : Fin 2) (e (1 : Fin 2)) := by + ext i + fin_cases i <;> simp [he] + +/-- Establishes the strict bound `0 < e (0 : Fin 2)`. -/ +theorem finsupp_fin_two_left_pos_of_not_right_axis + (e : Fin 2 →₀ ℕ) + (he : ∀ d : ℕ, e ≠ Finsupp.single (1 : Fin 2) d) : + 0 < e (0 : Fin 2) := by + apply Nat.pos_of_ne_zero + intro hzero + exact he (e (1 : Fin 2)) + (finsupp_fin_two_eq_single_right_of_left_eq_zero e hzero) + +/-- Establishes the strict bound `0 < e (1 : Fin 2)`. -/ +theorem finsupp_fin_two_right_pos_of_not_left_axis + (e : Fin 2 →₀ ℕ) + (he : ∀ d : ℕ, e ≠ Finsupp.single (0 : Fin 2) d) : + 0 < e (1 : Fin 2) := by + apply Nat.pos_of_ne_zero + intro hzero + exact he (e (0 : Fin 2)) + (finsupp_fin_two_eq_single_left_of_right_eq_zero e hzero) + +/-- Establishes the identity `Finsupp.degree e = e (0 : Fin 2) + e (1 : Fin 2)`. -/ +theorem finsupp_fin_two_degree_eq (e : Fin 2 →₀ ℕ) : + Finsupp.degree e = e (0 : Fin 2) + e (1 : Fin 2) := by + classical + have huniv : + (Finset.univ : Finset (Fin 2)) = + {0, 1} := by + ext i + fin_cases i <;> simp + rw [Finsupp.degree_eq_sum, huniv] + simp + +/-- Establishes the inequality `e ≠ Finsupp.single (0 : Fin 2) d`. -/ +theorem finsupp_fin_two_ne_single_left_of_right_pos + (e : Fin 2 →₀ ℕ) (hpos : 0 < e (1 : Fin 2)) (d : ℕ) : + e ≠ Finsupp.single (0 : Fin 2) d := by + intro h + have hcoord : e (1 : Fin 2) = 0 := by + simp [h] + exact (Nat.ne_of_gt hpos) hcoord + +/-- Establishes the inequality `e ≠ Finsupp.single (1 : Fin 2) d`. -/ +theorem finsupp_fin_two_ne_single_right_of_left_pos + (e : Fin 2 →₀ ℕ) (hpos : 0 < e (0 : Fin 2)) (d : ℕ) : + e ≠ Finsupp.single (1 : Fin 2) d := by + intro h + have hcoord : e (0 : Fin 2) = 0 := by + simp [h] + exact (Nat.ne_of_gt hpos) hcoord + +/-- Establishes the identity `MvPowerSeries.coeff e (formalLogOnePlusProductRightSide A) = 0`. -/ +theorem formalLogOnePlusProductRightSide_coeff_of_pos_coords + (A : Type*) [CommRing A] [Algebra ℚ A] (e : Fin 2 →₀ ℕ) + (hleft : 0 < e (0 : Fin 2)) (hright : 0 < e (1 : Fin 2)) : + MvPowerSeries.coeff e (formalLogOnePlusProductRightSide A) = 0 := + formalLogOnePlusProductRightSide_coeff_of_ne_axes A e + (finsupp_fin_two_ne_single_left_of_right_pos e hright) + (finsupp_fin_two_ne_single_right_of_left_pos e hleft) + +/-- On the left coordinate axis, the substituted logarithm and the proposed +right-hand side have the same coefficient. -/ +theorem formalLogOnePlusProductFormula_coeff_of_right_coord_zero + (A : Type*) [CommRing A] [Algebra ℚ A] (e : Fin 2 →₀ ℕ) + (he : e (1 : Fin 2) = 0) : + MvPowerSeries.coeff e + (PowerSeries.subst (formalLogOnePlusProductArgument A) (PowerSeries.log A)) = + MvPowerSeries.coeff e (formalLogOnePlusProductRightSide A) := by + rw [finsupp_fin_two_eq_single_left_of_right_eq_zero e he] + exact formalLogOnePlusProductFormula_coeff_single_left A (e (0 : Fin 2)) + +/-- On the right coordinate axis, the substituted logarithm and the proposed +right-hand side have the same coefficient. -/ +theorem formalLogOnePlusProductFormula_coeff_of_left_coord_zero + (A : Type*) [CommRing A] [Algebra ℚ A] (e : Fin 2 →₀ ℕ) + (he : e (0 : Fin 2) = 0) : + MvPowerSeries.coeff e + (PowerSeries.subst (formalLogOnePlusProductArgument A) (PowerSeries.log A)) = + MvPowerSeries.coeff e (formalLogOnePlusProductRightSide A) := by + rw [finsupp_fin_two_eq_single_right_of_left_eq_zero e he] + exact formalLogOnePlusProductFormula_coeff_single_right A (e (1 : Fin 2)) + +/-- Difference between the two formal sides of the logarithm product formula. +The remaining proof of the formal identity is exactly the vanishing of this +series on mixed monomials. -/ +noncomputable def formalLogOnePlusProductFormulaDefect + (A : Type*) [CommRing A] [Algebra ℚ A] : MvPowerSeries (Fin 2) A := + PowerSeries.subst (formalLogOnePlusProductArgument A) (PowerSeries.log A) - + formalLogOnePlusProductRightSide A + +/-- +Establishes the identity `MvPowerSeries.coeff e (formalLogOnePlusProductFormulaDefect A) = 0`. +-/ +theorem formalLogOnePlusProductFormulaDefect_coeff_of_right_coord_zero + (A : Type*) [CommRing A] [Algebra ℚ A] (e : Fin 2 →₀ ℕ) + (he : e (1 : Fin 2) = 0) : + MvPowerSeries.coeff e + (formalLogOnePlusProductFormulaDefect A) = 0 := by + simp [formalLogOnePlusProductFormulaDefect, + formalLogOnePlusProductFormula_coeff_of_right_coord_zero A e he] + +/-- +Establishes the identity `MvPowerSeries.coeff e (formalLogOnePlusProductFormulaDefect A) = 0`. +-/ +theorem formalLogOnePlusProductFormulaDefect_coeff_of_left_coord_zero + (A : Type*) [CommRing A] [Algebra ℚ A] (e : Fin 2 →₀ ℕ) + (he : e (0 : Fin 2) = 0) : + MvPowerSeries.coeff e + (formalLogOnePlusProductFormulaDefect A) = 0 := by + simp [formalLogOnePlusProductFormulaDefect, + formalLogOnePlusProductFormula_coeff_of_left_coord_zero A e he] + +/-- +Establishes the identity `MvPowerSeries.coeff e (formalLogOnePlusProductFormulaDefect A) = ∑ q ∈ +(Finset.range (Finsupp.degree e + 1)).filter (fun q : ℕ => e (0 : Fin 2) ≤ q ∧ e (1 : Fin 2) ≤ q), +PowerSeries.coeff q (PowerSeries.log A) • MvPowerSeries.coeff e +((formalLogOnePlusProductArgument A) ^ q)`. +-/ +theorem + formalLogProductDefect_coeff_of_pos_eq_sum_range_filter_coord_le + (A : Type*) [CommRing A] [Algebra ℚ A] (e : Fin 2 →₀ ℕ) + (hleft : 0 < e (0 : Fin 2)) (hright : 0 < e (1 : Fin 2)) : + MvPowerSeries.coeff e + (formalLogOnePlusProductFormulaDefect A) = + ∑ q ∈ + (Finset.range (Finsupp.degree e + 1)).filter + (fun q : ℕ => e (0 : Fin 2) ≤ q ∧ e (1 : Fin 2) ≤ q), + PowerSeries.coeff q (PowerSeries.log A) • + MvPowerSeries.coeff e + ((formalLogOnePlusProductArgument A) ^ q) := by + simp [formalLogOnePlusProductFormulaDefect, + formalLogOnePlusProductRightSide_coeff_of_pos_coords A e hleft hright, + formalLogOnePlusProductArgument_logSubst_coeff_eq_sum_range_degree_succ_filter_coord_le] + +/-- +Establishes the identity `MvPowerSeries.coeff e (formalLogOnePlusProductFormulaDefect A) = ∑ q ∈ +(Finset.range (e (0 : Fin 2) + e (1 : Fin 2) + 1)).filter (fun q : ℕ => e (0 : Fin 2) ≤ q ∧ e (1 : +Fin 2) ≤ q), PowerSeries.coeff q (PowerSeries.log A) • MvPowerSeries.coeff e +((formalLogOnePlusProductArgument A) ^ q)`. +-/ +theorem formalProductDefect_coeff_pos_eq_filtered_sum + (A : Type*) [CommRing A] [Algebra ℚ A] (e : Fin 2 →₀ ℕ) + (hleft : 0 < e (0 : Fin 2)) (hright : 0 < e (1 : Fin 2)) : + MvPowerSeries.coeff e + (formalLogOnePlusProductFormulaDefect A) = + ∑ q ∈ + (Finset.range (e (0 : Fin 2) + e (1 : Fin 2) + 1)).filter + (fun q : ℕ => e (0 : Fin 2) ≤ q ∧ e (1 : Fin 2) ≤ q), + PowerSeries.coeff q (PowerSeries.log A) • + MvPowerSeries.coeff e + ((formalLogOnePlusProductArgument A) ^ q) := by + rw [formalLogProductDefect_coeff_of_pos_eq_sum_range_filter_coord_le + A e hleft hright] + rw [finsupp_fin_two_degree_eq] + +/-- +Establishes the identity `MvPowerSeries.coeff e (formalLogOnePlusProductFormulaDefect A) = ∑ q ∈ +(Finset.range (e (0 : Fin 2) + e (1 : Fin 2) + 1)).filter (fun q : ℕ => e (0 : Fin 2) ≤ q ∧ e (1 : +Fin 2) ≤ q), PowerSeries.coeff q (PowerSeries.log A) • (∑ l ∈ Finset.finsuppAntidiag +(Finset.range q) e, if ∀ i ∈ Finset.range q, formalLogOnePlusProductArgumentBasicFactor (l i) then +(1 : A) else 0)`. +-/ +theorem formalLogOnePlusProductFormulaDefect_coeff_of_pos_coords_eq_sum_basicFactor + (A : Type*) [CommRing A] [Algebra ℚ A] (e : Fin 2 →₀ ℕ) + (hleft : 0 < e (0 : Fin 2)) (hright : 0 < e (1 : Fin 2)) : + MvPowerSeries.coeff e + (formalLogOnePlusProductFormulaDefect A) = + ∑ q ∈ + (Finset.range (e (0 : Fin 2) + e (1 : Fin 2) + 1)).filter + (fun q : ℕ => e (0 : Fin 2) ≤ q ∧ e (1 : Fin 2) ≤ q), + PowerSeries.coeff q (PowerSeries.log A) • + (∑ l ∈ Finset.finsuppAntidiag (Finset.range q) e, + if ∀ i ∈ Finset.range q, + formalLogOnePlusProductArgumentBasicFactor (l i) + then (1 : A) else 0) := by + rw [formalProductDefect_coeff_pos_eq_filtered_sum + A e hleft hright] + apply Finset.sum_congr rfl + intro q _hq + rw [formalLogOnePlusProductArgument_pow_coeff_eq_sum_basicFactor] + +/-- +Establishes the identity `MvPowerSeries.coeff e (formalLogOnePlusProductFormulaDefect A) = ∑ q ∈ +(Finset.range (e (0 : Fin 2) + e (1 : Fin 2) + 1)).filter (fun q : ℕ => e (0 : Fin 2) ≤ q ∧ e (1 : +Fin 2) ≤ q), PowerSeries.coeff q (PowerSeries.log A) • +((formalLogOnePlusProductArgumentBasicFactorChoices q e).card : A)`. +-/ +theorem formalLogOnePlusProductFormulaDefect_coeff_of_pos_coords_eq_sum_card_choices + (A : Type*) [CommRing A] [Algebra ℚ A] (e : Fin 2 →₀ ℕ) + (hleft : 0 < e (0 : Fin 2)) (hright : 0 < e (1 : Fin 2)) : + MvPowerSeries.coeff e + (formalLogOnePlusProductFormulaDefect A) = + ∑ q ∈ + (Finset.range (e (0 : Fin 2) + e (1 : Fin 2) + 1)).filter + (fun q : ℕ => e (0 : Fin 2) ≤ q ∧ e (1 : Fin 2) ≤ q), + PowerSeries.coeff q (PowerSeries.log A) • + ((formalLogOnePlusProductArgumentBasicFactorChoices q e).card : A) := by + rw [formalLogOnePlusProductFormulaDefect_coeff_of_pos_coords_eq_sum_basicFactor + A e hleft hright] + apply Finset.sum_congr rfl + intro q _hq + rw [formalLogOnePlusProductArgument_basicFactor_sum_eq_card_choices] + +/-- +Establishes the identity `(∑ q ∈ (Finset.range (a + b + 1)).filter (fun q => a ≤ q ∧ b ≤ q), F q) += ∑ m ∈ (Finset.range (a + 1)).filter (fun m => m ≤ b), F (a + b - m)`. +-/ +theorem sum_range_add_filter_coord_le_reindex + {R : Type*} [AddCommMonoid R] (a b : ℕ) (F : ℕ → R) : + (∑ q ∈ (Finset.range (a + b + 1)).filter (fun q => a ≤ q ∧ b ≤ q), + F q) = + ∑ m ∈ (Finset.range (a + 1)).filter (fun m => m ≤ b), + F (a + b - m) := by + refine Finset.sum_bij' + (fun q _ => a + b - q) + (fun m _ => a + b - m) + ?_ ?_ ?_ ?_ ?_ + · intro q hq + rw [Finset.mem_filter] at hq ⊢ + constructor + · rw [Finset.mem_range] + omega + · omega + · intro m hm + rw [Finset.mem_filter] at hm ⊢ + have hmle_a : m ≤ a := Nat.lt_succ_iff.mp (Finset.mem_range.mp hm.1) + have hmle_b : m ≤ b := hm.2 + have hleftRewrite : a + b - m = a + (b - m) := by + exact Nat.add_sub_assoc hmle_b a + have hrightRewrite : a + b - m = b + (a - m) := by + rw [Nat.add_comm a b] + exact Nat.add_sub_assoc hmle_a b + constructor + · rw [Finset.mem_range] + omega + · constructor + · rw [hleftRewrite] + omega + · rw [hrightRewrite] + omega + · intro q hq + rw [Finset.mem_filter] at hq + have hqle : q ≤ a + b := Nat.lt_succ_iff.mp (Finset.mem_range.mp hq.1) + exact Nat.sub_sub_self hqle + · intro m hm + rw [Finset.mem_filter] at hm + have hmle_a : m ≤ a := Nat.lt_succ_iff.mp (Finset.mem_range.mp hm.1) + have hmle : m ≤ a + b := by omega + exact Nat.sub_sub_self hmle + · intro q hq + rw [Finset.mem_filter] at hq + have hqle : q ≤ a + b := Nat.lt_succ_iff.mp (Finset.mem_range.mp hq.1) + simp [Nat.sub_sub_self hqle] + +/-- +Establishes the identity `(∑ m ∈ Finset.range (a + 1), ((-1 : ℚ) ^ m) * (Nat.choose a m : ℚ) * +(Nat.choose (a + b - 1 - m) (a - 1) : ℚ)) = 0`. +-/ +theorem formalLogOnePlusProduct_alternating_sum_choose_eq_zero + (a b : ℕ) (ha : 0 < a) (hb : 0 < b) : + (∑ m ∈ Finset.range (a + 1), + ((-1 : ℚ) ^ m) * (Nat.choose a m : ℚ) * + (Nat.choose (a + b - 1 - m) (a - 1) : ℚ)) = 0 := by + let P : ℚ[X] := X + 1 + have hcoeff : + (∑ m ∈ Finset.range (a + 1), + ((-1 : ℚ) ^ m) * (Nat.choose a m : ℚ) * + (Nat.choose (a + b - 1 - m) (a - 1) : ℚ)) = + Polynomial.coeff + (∑ m ∈ Finset.range (a + 1), + C (((-1 : ℚ) ^ m) * (Nat.choose a m : ℚ)) * + P ^ (a + b - 1 - m)) (a - 1) := by + have hsumcoeff : + Polynomial.coeff + (∑ m ∈ Finset.range (a + 1), + C (((-1 : ℚ) ^ m) * (Nat.choose a m : ℚ)) * + P ^ (a + b - 1 - m)) (a - 1) = + ∑ m ∈ Finset.range (a + 1), + Polynomial.coeff + (C (((-1 : ℚ) ^ m) * (Nat.choose a m : ℚ)) * + P ^ (a + b - 1 - m)) (a - 1) := by + simp + rw [hsumcoeff] + apply Finset.sum_congr rfl + intro m hm + rw [Polynomial.coeff_C_mul] + have hpowcoeff : + Polynomial.coeff (P ^ (a + b - 1 - m)) (a - 1) = + (Nat.choose (a + b - 1 - m) (a - 1) : ℚ) := by + dsimp [P] + rw [Polynomial.coeff_X_add_one_pow] + rw [hpowcoeff] + rw [hcoeff] + have hpoly : + (∑ m ∈ Finset.range (a + 1), + C (((-1 : ℚ) ^ m) * (Nat.choose a m : ℚ)) * + P ^ (a + b - 1 - m)) = + X ^ a * P ^ (b - 1) := by + calc + (∑ m ∈ Finset.range (a + 1), + C (((-1 : ℚ) ^ m) * (Nat.choose a m : ℚ)) * + P ^ (a + b - 1 - m)) + = + ∑ k ∈ Finset.range (a + 1), + C (((-1 : ℚ) ^ (a - k)) * (Nat.choose a (a - k) : ℚ)) * + P ^ (a + b - 1 - (a - k)) := by + simpa using + (Finset.sum_range_reflect + (fun m => + C (((-1 : ℚ) ^ m) * (Nat.choose a m : ℚ)) * + P ^ (a + b - 1 - m)) (a + 1)).symm + _ = + ∑ k ∈ Finset.range (a + 1), + C (((-1 : ℚ) ^ (k + a)) * (Nat.choose a k : ℚ)) * + P ^ (k + (b - 1)) := by + apply Finset.sum_congr rfl + intro k hk + have hk_le : k ≤ a := Nat.lt_succ_iff.mp (Finset.mem_range.mp hk) + have hchoose : Nat.choose a (a - k) = Nat.choose a k := + Nat.choose_symm hk_le + have hpow : ((-1 : ℚ) ^ (a - k)) = (-1 : ℚ) ^ (k + a) := by + have hadd : k + a = a - k + 2 * k := by omega + rw [hadd, pow_add, pow_mul] + simp [pow_two] + have hexp : a + b - 1 - (a - k) = k + (b - 1) := by omega + rw [hchoose, hpow, hexp] + _ = + (∑ k ∈ Finset.range (a + 1), + C (((-1 : ℚ) ^ (k + a)) * (Nat.choose a k : ℚ)) * + P ^ k) * P ^ (b - 1) := by + rw [Finset.sum_mul] + apply Finset.sum_congr rfl + intro k hk + rw [pow_add] + ring + _ = (P - 1) ^ a * P ^ (b - 1) := by + rw [sub_pow] + simp [P, mul_assoc, mul_comm] + _ = X ^ a * P ^ (b - 1) := by + simp [P] + rw [hpoly] + have hdiv : X ^ a ∣ (X ^ a * P ^ (b - 1) : ℚ[X]) := ⟨P ^ (b - 1), rfl⟩ + exact + (Polynomial.X_pow_dvd_iff.mp hdiv (a - 1) + (Nat.sub_lt ha Nat.one_pos)) + +/-- +Establishes the identity `(∑ m ∈ (Finset.range (a + 1)).filter (fun m => m ≤ b), ((-1 : ℚ) ^ m) * +(Nat.choose a m : ℚ) * (Nat.choose (a + b - 1 - m) (a - 1) : ℚ)) = 0`. +-/ +theorem formalLogOnePlusProduct_alternating_sum_choose_filter_eq_zero + (a b : ℕ) (ha : 0 < a) (hb : 0 < b) : + (∑ m ∈ (Finset.range (a + 1)).filter (fun m => m ≤ b), + ((-1 : ℚ) ^ m) * (Nat.choose a m : ℚ) * + (Nat.choose (a + b - 1 - m) (a - 1) : ℚ)) = 0 := by + rw [← formalLogOnePlusProduct_alternating_sum_choose_eq_zero a b ha hb] + exact + (Finset.sum_subset (Finset.filter_subset _ _) (fun m hm hnot => by + have hle_a : m ≤ a := Nat.lt_succ_iff.mp (Finset.mem_range.mp hm) + have hlt_b : b < m := Nat.lt_of_not_ge (by + intro hmb + exact hnot (Finset.mem_filter.mpr ⟨hm, hmb⟩)) + have hchooseZero : + Nat.choose (a + b - 1 - m) (a - 1) = 0 := by + apply Nat.choose_eq_zero_of_lt + omega + change + ((-1 : ℚ) ^ m) * (Nat.choose a m : ℚ) * + (Nat.choose (a + b - 1 - m) (a - 1) : ℚ) = 0 + rw [hchooseZero] + simp)) + +/-- +After the substitution `q = a + b - m`, the mixed logarithmic coefficient rewrites as the +corresponding alternating binomial term. +-/ +theorem formalLogOnePlusProduct_rational_mixed_reindexed_term + (a b m : ℕ) (ha : 0 < a) (hmle_a : m ≤ a) (hmle_b : m ≤ b) : + let q := a + b - m + (a : ℚ) * + (((-1 : ℚ) ^ (q - 1) / (q : ℚ)) * + ((Nat.choose q m * Nat.choose (q - m) (q - b) : ℕ) : ℚ)) = + ((-1 : ℚ) ^ (a + b - 1)) * + (((-1 : ℚ) ^ m) * (Nat.choose a m : ℚ) * + (Nat.choose (a + b - 1 - m) (a - 1) : ℚ)) := by + intro q + subst q + have hqpos : 0 < a + b - m := by omega + have hq_ne : ((a + b - m : ℕ) : ℚ) ≠ 0 := by + exact_mod_cast (Nat.ne_of_gt hqpos) + have hq_sub_b : a + b - m - b = a - m := by omega + have hq_pred : a + b - m - 1 = a + b - 1 - m := by omega + have hprodNat : + Nat.choose (a + b - m) m * + Nat.choose (a + b - m - m) (a + b - m - b) = + Nat.choose (a + b - m) a * Nat.choose a m := by + rw [hq_sub_b] + exact + (Nat.choose_mul (n := a + b - m) (k := a) (s := m) hmle_a).symm + have hsuccNat : + (a + b - m) * Nat.choose (a + b - m - 1) (a - 1) = + Nat.choose (a + b - m) a * a := by + calc + (a + b - m) * Nat.choose (a + b - m - 1) (a - 1) + = + ((a + b - m - 1) + 1) * + Nat.choose (a + b - m - 1) (a - 1) := by + rw [Nat.sub_add_cancel (Nat.succ_le_of_lt hqpos)] + _ = + Nat.choose ((a + b - m - 1) + 1) ((a - 1) + 1) * + ((a - 1) + 1) := by + exact Nat.add_one_mul_choose_eq (a + b - m - 1) (a - 1) + _ = Nat.choose (a + b - m) a * a := by + rw [Nat.sub_add_cancel (Nat.succ_le_of_lt hqpos), + Nat.sub_add_cancel (Nat.succ_le_of_lt ha)] + have hsuccQ : + ((a + b - m : ℕ) : ℚ) * + (Nat.choose (a + b - m - 1) (a - 1) : ℚ) = + (Nat.choose (a + b - m) a : ℚ) * (a : ℚ) := by + exact_mod_cast hsuccNat + have hsuccQ' : + ((a + b - m : ℕ) : ℚ) * + (Nat.choose (a + b - 1 - m) (a - 1) : ℚ) = + (Nat.choose (a + b - m) a : ℚ) * (a : ℚ) := by + simpa [hq_pred] using hsuccQ + have hsign : + (-1 : ℚ) ^ (a + b - m - 1) = + (-1 : ℚ) ^ (a + b - 1) * (-1 : ℚ) ^ m := by + calc + (-1 : ℚ) ^ (a + b - m - 1) + = (-1 : ℚ) ^ ((a + b - 1) + m) := by + have hadd : (a + b - 1) + m = a + b - m - 1 + 2 * m := by + omega + rw [hadd, pow_add, pow_mul] + simp [pow_two] + _ = (-1 : ℚ) ^ (a + b - 1) * (-1 : ℚ) ^ m := by + rw [pow_add] + rw [hprodNat, hsign] + field_simp [hq_ne] + rw [Nat.cast_mul] + calc + (a : ℚ) * + ((Nat.choose (a + b - m) a : ℚ) * (Nat.choose a m : ℚ)) + = + ((Nat.choose (a + b - m) a : ℚ) * (a : ℚ)) * + (Nat.choose a m : ℚ) := by + ring + _ = + (((a + b - m : ℕ) : ℚ) * + (Nat.choose (a + b - 1 - m) (a - 1) : ℚ)) * + (Nat.choose a m : ℚ) := by + rw [← hsuccQ'] + _ = + ((a + b - m : ℕ) : ℚ) * (Nat.choose a m : ℚ) * + (Nat.choose (a + b - 1 - m) (a - 1) : ℚ) := by + ring + +/-- +Establishes the identity `(∑ q ∈ (Finset.range (a + b + 1)).filter (fun q : ℕ => a ≤ q ∧ b ≤ q), +(((-1 : ℚ) ^ (q - 1) / (q : ℚ)) * ((Nat.choose q (a + b - q) * Nat.choose (q - (a + b - q)) (q - +b) : ℕ) : ℚ))) = 0`. +-/ +theorem formalLogOnePlusProduct_rational_mixed_sum_eq_zero + (a b : ℕ) (ha : 0 < a) (hb : 0 < b) : + (∑ q ∈ + (Finset.range (a + b + 1)).filter (fun q : ℕ => a ≤ q ∧ b ≤ q), + (((-1 : ℚ) ^ (q - 1) / (q : ℚ)) * + ((Nat.choose q (a + b - q) * + Nat.choose (q - (a + b - q)) (q - b) : ℕ) : ℚ))) = 0 := by + let F : ℕ → ℚ := fun q => + (((-1 : ℚ) ^ (q - 1) / (q : ℚ)) * + ((Nat.choose q (a + b - q) * + Nat.choose (q - (a + b - q)) (q - b) : ℕ) : ℚ)) + change + (∑ q ∈ + (Finset.range (a + b + 1)).filter (fun q : ℕ => a ≤ q ∧ b ≤ q), + F q) = 0 + rw [sum_range_add_filter_coord_le_reindex a b F] + have haQ : (a : ℚ) ≠ 0 := by + exact_mod_cast (Nat.ne_of_gt ha) + apply (mul_eq_zero.mp ?_).resolve_left haQ + calc + (a : ℚ) * + (∑ m ∈ (Finset.range (a + 1)).filter (fun m => m ≤ b), + F (a + b - m)) + = + ∑ m ∈ (Finset.range (a + 1)).filter (fun m => m ≤ b), + (a : ℚ) * F (a + b - m) := by + rw [Finset.mul_sum] + _ = + ∑ m ∈ (Finset.range (a + 1)).filter (fun m => m ≤ b), + ((-1 : ℚ) ^ (a + b - 1)) * + (((-1 : ℚ) ^ m) * (Nat.choose a m : ℚ) * + (Nat.choose (a + b - 1 - m) (a - 1) : ℚ)) := by + apply Finset.sum_congr rfl + intro m hm + rw [Finset.mem_filter] at hm + have hmle_a : m ≤ a := Nat.lt_succ_iff.mp (Finset.mem_range.mp hm.1) + have hmle_b : m ≤ b := hm.2 + have hmle_sum : m ≤ a + b := by omega + have hsub : a + b - (a + b - m) = m := Nat.sub_sub_self hmle_sum + change + (a : ℚ) * + (((-1 : ℚ) ^ (a + b - m - 1) / + ((a + b - m : ℕ) : ℚ)) * + ((Nat.choose (a + b - m) (a + b - (a + b - m)) * + Nat.choose + (a + b - m - (a + b - (a + b - m))) + (a + b - m - b) : ℕ) : ℚ)) = + ((-1 : ℚ) ^ (a + b - 1)) * + (((-1 : ℚ) ^ m) * (Nat.choose a m : ℚ) * + (Nat.choose (a + b - 1 - m) (a - 1) : ℚ)) + rw [hsub] + exact formalLogOnePlusProduct_rational_mixed_reindexed_term + a b m ha hmle_a hmle_b + _ = + ((-1 : ℚ) ^ (a + b - 1)) * + (∑ m ∈ (Finset.range (a + 1)).filter (fun m => m ≤ b), + ((-1 : ℚ) ^ m) * (Nat.choose a m : ℚ) * + (Nat.choose (a + b - 1 - m) (a - 1) : ℚ)) := by + rw [Finset.mul_sum] + _ = 0 := by + rw [formalLogOnePlusProduct_alternating_sum_choose_filter_eq_zero + a b ha hb] + simp + +/-- +Establishes the identity `MvPowerSeries.coeff e (formalLogOnePlusProductFormulaDefect A) = 0`. +-/ +theorem formalLogOnePlusProductFormulaDefect_coeff_of_pos_coords_eq_zero + (A : Type*) [CommRing A] [Algebra ℚ A] (e : Fin 2 →₀ ℕ) + (hleft : 0 < e (0 : Fin 2)) (hright : 0 < e (1 : Fin 2)) : + MvPowerSeries.coeff e + (formalLogOnePlusProductFormulaDefect A) = 0 := by + rw [formalLogOnePlusProductFormulaDefect_coeff_of_pos_coords_eq_sum_card_choices + A e hleft hright] + let S := + (Finset.range (e (0 : Fin 2) + e (1 : Fin 2) + 1)).filter + (fun q : ℕ => e (0 : Fin 2) ≤ q ∧ e (1 : Fin 2) ≤ q) + let T : ℕ → ℚ := fun q => + (((-1 : ℚ) ^ (q - 1) / (q : ℚ)) * + ((Nat.choose q (e (0 : Fin 2) + e (1 : Fin 2) - q) * + Nat.choose + (q - (e (0 : Fin 2) + e (1 : Fin 2) - q)) + (q - e (1 : Fin 2)) : ℕ) : ℚ)) + change + (∑ q ∈ S, + PowerSeries.coeff q (PowerSeries.log A) • + ((formalLogOnePlusProductArgumentBasicFactorChoices q e).card : A)) = 0 + calc + (∑ q ∈ S, + PowerSeries.coeff q (PowerSeries.log A) • + ((formalLogOnePlusProductArgumentBasicFactorChoices q e).card : A)) + = ∑ q ∈ S, algebraMap ℚ A (T q) := by + apply Finset.sum_congr rfl + intro q hq + have hqmem := (Finset.mem_filter.mp hq) + have hqleft : e (0 : Fin 2) ≤ q := hqmem.2.1 + have hqright : e (1 : Fin 2) ≤ q := hqmem.2.2 + have hqsum : q ≤ e (0 : Fin 2) + e (1 : Fin 2) := + Nat.lt_succ_iff.mp (Finset.mem_range.mp hqmem.1) + rw [formalLogOnePlusProductArgumentBasicFactorChoices_card_eq_choose_mul_choose + hqleft hqright hqsum] + have hqpos : 0 < q := lt_of_lt_of_le hleft hqleft + obtain ⟨n, rfl⟩ := Nat.exists_eq_add_one_of_ne_zero + (Nat.ne_of_gt hqpos) + simp [T, smul_eq_mul, pow_succ] + _ = algebraMap ℚ A (∑ q ∈ S, T q) := by + rw [map_sum] + _ = 0 := by + rw [formalLogOnePlusProduct_rational_mixed_sum_eq_zero + (e (0 : Fin 2)) (e (1 : Fin 2)) hleft hright] + simp + +/-- +Establishes the identity `MvPowerSeries.coeff e (formalLogOnePlusProductFormulaDefect A) = 0`. +-/ +theorem formalLogOnePlusProductFormulaDefect_coeff_eq_zero + (A : Type*) [CommRing A] [Algebra ℚ A] (e : Fin 2 →₀ ℕ) : + MvPowerSeries.coeff e + (formalLogOnePlusProductFormulaDefect A) = 0 := by + by_cases h0 : e (0 : Fin 2) = 0 + · exact formalLogOnePlusProductFormulaDefect_coeff_of_left_coord_zero + A e h0 + · by_cases h1 : e (1 : Fin 2) = 0 + · exact formalLogOnePlusProductFormulaDefect_coeff_of_right_coord_zero + A e h1 + · exact formalLogOnePlusProductFormulaDefect_coeff_of_pos_coords_eq_zero + A e (Nat.pos_of_ne_zero h0) (Nat.pos_of_ne_zero h1) + +/-- The formal logarithm product formula +`log ((1 + X) * (1 + Y)) = log (1 + X) + log (1 + Y)`. -/ +theorem formalLogOnePlusProductFormula + (A : Type*) [CommRing A] [Algebra ℚ A] : + PowerSeries.subst (formalLogOnePlusProductArgument A) (PowerSeries.log A) = + formalLogOnePlusProductRightSide A := by + ext e + have h := formalLogOnePlusProductFormulaDefect_coeff_eq_zero A e + have hsub : + MvPowerSeries.coeff e + (PowerSeries.subst (formalLogOnePlusProductArgument A) (PowerSeries.log A)) - + MvPowerSeries.coeff e (formalLogOnePlusProductRightSide A) = 0 := by + simpa [formalLogOnePlusProductFormulaDefect] using h + exact sub_eq_zero.mp hsub + +/-- For finitely many variables, a family is a valid `MvPowerSeries` +evaluation point as soon as every coordinate is topologically nilpotent. -/ +theorem mvPowerSeries_hasEval_of_finite_topologicallyNilpotent + {σ : Type*} {S : Type*} [CommRing S] [TopologicalSpace S] [Finite σ] + {a : σ → S} (hpow : ∀ s, IsTopologicallyNilpotent (a s)) : + MvPowerSeries.HasEval a := by + refine ⟨hpow, ?_⟩ + rw [Filter.cofinite_eq_bot] + exact Filter.tendsto_bot + +/-- Two topologically nilpotent elements give a valid evaluation point for +the two-variable product formula. -/ +theorem mvPowerSeries_hasEval_fin_two + {S : Type*} [CommRing S] [TopologicalSpace S] {x y : S} + (hx : IsTopologicallyNilpotent x) (hy : IsTopologicallyNilpotent y) : + MvPowerSeries.HasEval (fun i : Fin 2 => if i = 0 then x else y) := by + apply mvPowerSeries_hasEval_of_finite_topologicallyNilpotent + intro i + fin_cases i <;> simp [hx, hy] + +/-- Evaluating the formal logarithm product identity at any convergent +two-variable point preserves the identity. This is the formal-to-analytic +entry point for the field-unit logarithm theorem. -/ +theorem formalLogOnePlusProductFormula_aeval + (A : Type*) [CommRing A] [Algebra ℚ A] + [UniformSpace A] [IsUniformAddGroup A] + [CompleteSpace A] [T2Space A] [IsTopologicalRing A] + [IsLinearTopology A A] + {a : Fin 2 → A} (ha : MvPowerSeries.HasEval a) : + MvPowerSeries.aeval ha + (PowerSeries.subst (formalLogOnePlusProductArgument A) (PowerSeries.log A)) = + MvPowerSeries.aeval ha (formalLogOnePlusProductRightSide A) := by + exact congrArg (fun f => MvPowerSeries.aeval ha f) + (formalLogOnePlusProductFormula A) + +/-- The value of the monomial indexed by a finitely supported exponent at a +chosen evaluation point. -/ +noncomputable def mvPowerSeriesMonomialValue + {σ : Type*} {A : Type*} [CommMonoid A] + (a : σ → A) (d : σ →₀ ℕ) : A := + d.prod fun s e => a s ^ e + +/-- For each fixed degree `q`, the polynomial product argument has the expected +finite monomial evaluation at `(x,y)`. This is the finite-stage bridge used +before turning the substituted formal logarithm into the field-valued product +logarithm. -/ +theorem formalLogOnePlusProductArgument_pow_monomialValue_sum_eq + (A : Type*) [CommRing A] (x y : A) (q : ℕ) : + (∑ d ∈ (formalLogOnePlusProductArgumentPolynomial A ^ q).support, + MvPowerSeries.coeff d ((formalLogOnePlusProductArgument A) ^ q) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d) = + (x + y + x * y) ^ q := by + classical + let P : MvPolynomial (Fin 2) A := + formalLogOnePlusProductArgumentPolynomial A + let a : Fin 2 → A := fun i => if i = 0 then x else y + have hpow : + ((P ^ q : MvPolynomial (Fin 2) A) : MvPowerSeries (Fin 2) A) = + (formalLogOnePlusProductArgument A) ^ q := by + simp [P, formalLogOnePlusProductArgument_eq_coe_polynomial] + calc + (∑ d ∈ (formalLogOnePlusProductArgumentPolynomial A ^ q).support, + MvPowerSeries.coeff d ((formalLogOnePlusProductArgument A) ^ q) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d) + = + ∑ d ∈ (P ^ q).support, + (P ^ q).coeff d * d.prod (fun i e => a i ^ e) := by + subst P + subst a + apply Finset.sum_congr rfl + intro d hd + rw [← hpow, MvPolynomial.coeff_coe] + simp [mvPowerSeriesMonomialValue] + _ = MvPolynomial.eval a (P ^ q) := by + rw [MvPolynomial.eval_eq] + simp [Finsupp.prod] + _ = (MvPolynomial.eval a P) ^ q := by + simp + _ = (x + y + x * y) ^ q := by + simp [P, a] + +/-- For each fixed degree `q`, the monomial family coming from the `q`-th +power of the product argument is finitely supported and sums to +`(x + y + xy)^q`. -/ +theorem hasSum_formalLogOnePlusProductArgument_pow_monomialValue_pair + (A : Type*) [CommRing A] [TopologicalSpace A] (x y : A) (q : ℕ) : + HasSum + (fun d : Fin 2 →₀ ℕ => + MvPowerSeries.coeff d ((formalLogOnePlusProductArgument A) ^ q) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d) + ((x + y + x * y) ^ q) := by + classical + let P : MvPolynomial (Fin 2) A := + formalLogOnePlusProductArgumentPolynomial A + let term : (Fin 2 →₀ ℕ) → A := fun d => + MvPowerSeries.coeff d ((formalLogOnePlusProductArgument A) ^ q) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d + have hpow : + ((P ^ q : MvPolynomial (Fin 2) A) : MvPowerSeries (Fin 2) A) = + (formalLogOnePlusProductArgument A) ^ q := by + simp [P, formalLogOnePlusProductArgument_eq_coe_polynomial] + have hzero : + ∀ d ∉ (formalLogOnePlusProductArgumentPolynomial A ^ q).support, + term d = 0 := by + intro d hd + have hcoeff_poly : + (formalLogOnePlusProductArgumentPolynomial A ^ q).coeff d = 0 := + by + by_contra hne + exact hd (MvPolynomial.mem_support_iff.mpr hne) + have hcoeff_poly_P : (P ^ q).coeff d = 0 := by + simpa [P] using hcoeff_poly + have hcoeff : + MvPowerSeries.coeff d + ((formalLogOnePlusProductArgument A) ^ q) = 0 := by + rw [← hpow] + rw [MvPolynomial.coeff_coe] + exact hcoeff_poly_P + simp [term, hcoeff] + have hfinite : HasSum term + (∑ d ∈ (formalLogOnePlusProductArgumentPolynomial A ^ q).support, + term d) := + hasSum_sum_of_ne_finset_zero hzero + have hsum : + (∑ d ∈ (formalLogOnePlusProductArgumentPolynomial A ^ q).support, + term d) = + (x + y + x * y) ^ q := by + simpa [term] using + formalLogOnePlusProductArgument_pow_monomialValue_sum_eq A x y q + simpa [hsum, term] using hfinite + +/-- Fixed-degree product-argument monomial evaluation after multiplying by an +outer logarithm coefficient. -/ +theorem hasSum_formalLogOnePlusProductArgument_pow_monomialValue_pair_mul_left + (A : Type*) [CommRing A] [TopologicalSpace A] [IsTopologicalSemiring A] + (c x y : A) (q : ℕ) : + HasSum + (fun d : Fin 2 →₀ ℕ => + c * MvPowerSeries.coeff d ((formalLogOnePlusProductArgument A) ^ q) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d) + (c * (x + y + x * y) ^ q) := by + refine + ((hasSum_formalLogOnePlusProductArgument_pow_monomialValue_pair + A x y q).mul_left c).congr_fun ?_ + intro d + ring + +/-- Field- or ring-valued monomial-sum form of the formal logarithm product +identity. Unlike `formalLogOnePlusProductFormula_aeval`, this statement only +uses equality of the coefficient functions and `HasSum` uniqueness, so it does +not require the target ring to carry a linear topology. -/ +theorem formalLogOnePlusProductFormula_hasSum_monomialValue_eq + (A : Type*) [CommRing A] [Algebra ℚ A] [TopologicalSpace A] [T2Space A] + {a : Fin 2 → A} {L R : A} + (hleft : + HasSum + (fun d : Fin 2 →₀ ℕ => + MvPowerSeries.coeff d + (PowerSeries.subst (formalLogOnePlusProductArgument A) (PowerSeries.log A)) * + mvPowerSeriesMonomialValue a d) L) + (hright : + HasSum + (fun d : Fin 2 →₀ ℕ => + MvPowerSeries.coeff d (formalLogOnePlusProductRightSide A) * + mvPowerSeriesMonomialValue a d) R) : + L = R := by + rw [formalLogOnePlusProductFormula A] at hleft + exact hleft.unique hright + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/Homomorphisms.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/Homomorphisms.lean new file mode 100644 index 0000000000..e4fa8b9d2c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/Homomorphisms.lean @@ -0,0 +1,1495 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog +/-! +Packages the convergent logarithm and exponential series as additive and multiplicative +homomorphisms on their natural nonarchimedean domains. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + fieldUnitDecompositionFactors → + fieldUnitDecompositionFactors + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + residueRootsOfUnityGroup → + residueRootsOfUnityGroup + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + valuationSubringUnitFieldUnitHom → + valuationSubringUnitFieldUnitHom + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF → + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply → + fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply + + +open Filter +open Polynomial +open scoped Topology +open scoped PowerSeries.WithPiTopology +noncomputable +section + +attribute [local instance] Classical.propDecidable + +universe u + +open ValuationTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +variable {K : Type u} [Field K] + +/-- Finite logarithm polynomials of a first principal unit. -/ +noncomputable def principalUnitLogPartialSumOfWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (N : ℕ) : K := + logOnePlusPartialSumField (principalUnitSubOneOfWithZeroValuation v u) hnK N + +/-- Establishes the identity `principalUnitLogPartialSumOfWithZeroValuation v u hnK 0 = 0`. -/ +@[simp] theorem principalUnitLogPartialSum_zero_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) : + principalUnitLogPartialSumOfWithZeroValuation v u hnK 0 = 0 := by + simp [principalUnitLogPartialSumOfWithZeroValuation] + +/-- +Establishes the identity `principalUnitLogPartialSumOfWithZeroValuation v u hnK 1 = +principalUnitSubOneOfWithZeroValuation v u`. +-/ +@[simp] theorem principalUnitLogPartialSum_one_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) : + principalUnitLogPartialSumOfWithZeroValuation v u hnK 1 = + principalUnitSubOneOfWithZeroValuation v u := by + simp [principalUnitLogPartialSumOfWithZeroValuation] + +/-- +Establishes the identity `principalUnitLogSeriesOfWithZeroValuation v (1 : +(CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1) hnK = 0`. +-/ +@[simp] theorem principalUnitLogSeries_one_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) : + principalUnitLogSeriesOfWithZeroValuation v + (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + hnK = 0 := by + simp [principalUnitLogSeriesOfWithZeroValuation] + +/-- Above the usual `1/(p-1)` threshold, the principal-unit logarithm has the +same valuation as the additive parameter `u - 1`. -/ +theorem principalUnitLogSeries_valuation_eq_subOne_of_inv_sub_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hne : principalUnitSubOneOfWithZeroValuation v u ≠ 0) + (hthreshold : + 1 / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val + (Units.mk0 (principalUnitSubOneOfWithZeroValuation v u) hne) : + ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + v (principalUnitLogSeriesOfWithZeroValuation v u hnK) = + v (principalUnitSubOneOfWithZeroValuation v u) := by + have hvx : + v (principalUnitSubOneOfWithZeroValuation v u) < + (1 : WithZero (Multiplicative ℤ)) := + principalUnitSubOne_val_lt_one_ofWithZeroValuation v u + simpa [principalUnitLogSeriesOfWithZeroValuation] using + valuation_logOnePlusSeriesField_eq_self_of_inv_sub_one_lt + (v := v) (p := p) + (x := principalUnitSubOneOfWithZeroValuation v u) hne + hnK hnval hvx hthreshold hcomplete + +/-- Above the usual `1/(p-1)` threshold, the principal-unit logarithm is +nonzero away from the identity. -/ +theorem principalUnitLogSeries_ne_zero_of_inv_sub_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hne : principalUnitSubOneOfWithZeroValuation v u ≠ 0) + (hthreshold : + 1 / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val + (Units.mk0 (principalUnitSubOneOfWithZeroValuation v u) hne) : + ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + principalUnitLogSeriesOfWithZeroValuation v u hnK ≠ 0 := by + intro hzero + have hv : + v (principalUnitLogSeriesOfWithZeroValuation v u hnK) = + v (principalUnitSubOneOfWithZeroValuation v u) := + principalUnitLogSeries_valuation_eq_subOne_of_inv_sub_one_lt + (v := v) (p := p) u hnK hnval hne hthreshold hcomplete + rw [hzero, map_zero] at hv + exact ((_root_.Valuation.ne_zero_iff v).2 hne) hv.symm + +/-- On a threshold-controlled principal-unit domain, the logarithm has kernel +exactly the identity element. -/ +theorem principalUnitLogSeries_eq_zero_iff_subOne_eq_zero_of_inv_sub_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hthreshold : ∀ hne : principalUnitSubOneOfWithZeroValuation v u ≠ 0, + 1 / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val + (Units.mk0 (principalUnitSubOneOfWithZeroValuation v u) hne) : + ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + principalUnitLogSeriesOfWithZeroValuation v u hnK = 0 ↔ + principalUnitSubOneOfWithZeroValuation v u = 0 := by + constructor + · intro hlog + by_contra hne + exact + (principalUnitLogSeries_ne_zero_of_inv_sub_one_lt + (v := v) (p := p) u hnK hnval hne (hthreshold hne) hcomplete) + hlog + · intro hsub + simp [principalUnitLogSeriesOfWithZeroValuation, hsub] + +/-- On a threshold-controlled principal-unit domain, the logarithm has kernel +exactly the identity. -/ +theorem principalUnitLogSeries_eq_zero_iff_eq_one_of_inv_sub_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hthreshold : ∀ hne : principalUnitSubOneOfWithZeroValuation v u ≠ 0, + 1 / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val + (Units.mk0 (principalUnitSubOneOfWithZeroValuation v u) hne) : + ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + principalUnitLogSeriesOfWithZeroValuation v u hnK = 0 ↔ + u = (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) := by + rw [principalUnitLogSeries_eq_zero_iff_subOne_eq_zero_of_inv_sub_one_lt + (v := v) (p := p) u hnK hnval hthreshold hcomplete] + exact principalUnitSubOne_eq_zero_iff_ofWithZeroValuation v u + +/-- If `u - 1` lies in the normalized exponential convergence ball and the +logarithm threshold holds, then `Log(u)` also lies in the exponential +convergence ball. -/ +theorem principalUnitLogSeries_val_lt_exp_neg_one_of_subOne_val_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hne : principalUnitSubOneOfWithZeroValuation v u ≠ 0) + (hthreshold : + 1 / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val + (Units.mk0 (principalUnitSubOneOfWithZeroValuation v u) hne) : + ℚ)) + (hsubExp : + v (principalUnitSubOneOfWithZeroValuation v u) < + WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + v (principalUnitLogSeriesOfWithZeroValuation v u hnK) < + WithZero.exp (-1 : ℤ) := by + have hv : + v (principalUnitLogSeriesOfWithZeroValuation v u hnK) = + v (principalUnitSubOneOfWithZeroValuation v u) := + principalUnitLogSeries_valuation_eq_subOne_of_inv_sub_one_lt + (v := v) (p := p) u hnK hnval hne hthreshold hcomplete + rw [hv] + exact hsubExp + +/-- On a threshold-controlled domain where `Log(u)` lies in the exponential +convergence ball, the composite `Exp(Log(u))` has kernel exactly the identity. -/ +theorem principalUnitExpSeries_logSeries_eq_one_iff_eq_one_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + (hnKexp : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hnKlog : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvlogExp : + v (principalUnitLogSeriesOfWithZeroValuation v u hnKlog) < + WithZero.exp (-1 : ℤ)) + (hthreshold : ∀ hne : principalUnitSubOneOfWithZeroValuation v u ≠ 0, + 1 / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val + (Units.mk0 (principalUnitSubOneOfWithZeroValuation v u) hne) : + ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) + (principalUnitLogSeriesOfWithZeroValuation v u hnKlog) + hnKexp hnvalExp hvlogExp hcomplete = + (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) ↔ + u = (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) := by + rw [principalUnitExpSeries_eq_one_iff_ofWithZeroValuation + (v := v) (p := p) + (x := principalUnitLogSeriesOfWithZeroValuation v u hnKlog) + hnKexp hnvalExp hvlogExp hcomplete] + exact + principalUnitLogSeries_eq_zero_iff_eq_one_of_inv_sub_one_lt + (v := v) (p := p) u hnKlog hnvalLog hthreshold hcomplete + +/-- On the common convergence and threshold domain, the composite +`Log(Exp(x))` has the same valuation as `x`. -/ +theorem principalUnitLogSeries_expSeries_valuation_eq_self_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] {x : K} (hx : x ≠ 0) + (hnKexp : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hnKlog : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hthreshold : + 1 / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + v (principalUnitLogSeriesOfWithZeroValuation v + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnKexp hnvalExp hvx hcomplete) hnKlog) = + v x := by + let u := + principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnKexp hnvalExp hvx hcomplete + have hne : principalUnitSubOneOfWithZeroValuation v u ≠ 0 := by + dsimp [u] + exact + principalUnitSubOne_expSeries_ne_zero_ofWithZeroValuation + (v := v) (p := p) (x := x) hx hnKexp hnvalExp hvx hcomplete + have hthresholdSub : + 1 / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val + (Units.mk0 (principalUnitSubOneOfWithZeroValuation v u) hne) : + ℚ) := by + dsimp [u] + exact + principalUnitSubOne_expSeries_threshold_ofWithZeroValuation + (v := v) (p := p) (x := x) hx hnKexp hnvalExp hvx hthreshold + hcomplete hne + have hvlog : + v (principalUnitLogSeriesOfWithZeroValuation v u hnKlog) = + v (principalUnitSubOneOfWithZeroValuation v u) := + principalUnitLogSeries_valuation_eq_subOne_of_inv_sub_one_lt + (v := v) (p := p) u hnKlog hnvalLog hne hthresholdSub hcomplete + have hvsub : + v (principalUnitSubOneOfWithZeroValuation v u) = v x := by + dsimp [u] + exact + principalUnitSubOne_expSeries_valuation_eq_self_ofWithZeroValuation + (v := v) (p := p) (x := x) hx hnKexp hnvalExp hvx hcomplete + exact hvlog.trans hvsub + +/-- On the common convergence and threshold domain, `Log(Exp(x))` is nonzero +for nonzero `x`. -/ +theorem principalUnitLogSeries_expSeries_ne_zero_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] {x : K} (hx : x ≠ 0) + (hnKexp : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hnKlog : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hthreshold : + 1 / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + principalUnitLogSeriesOfWithZeroValuation v + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnKexp hnvalExp hvx hcomplete) hnKlog ≠ 0 := by + intro hzero + have hv : + v (principalUnitLogSeriesOfWithZeroValuation v + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnKexp hnvalExp hvx hcomplete) hnKlog) = + v x := + principalUnitLogSeries_expSeries_valuation_eq_self_ofWithZeroValuation + (v := v) (p := p) (x := x) hx hnKexp hnvalExp hnKlog hnvalLog + hvx hthreshold hcomplete + rw [hzero, map_zero] at hv + exact ((_root_.Valuation.ne_zero_iff v).2 hx) hv.symm + +/-- On the common convergence and threshold domain, the composite +`Log ∘ Exp` has trivial kernel. -/ +theorem principalUnitLogSeries_expSeries_eq_zero_iff_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] {x : K} + (hnKexp : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hnKlog : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hthreshold : ∀ hx : x ≠ 0, + 1 / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + principalUnitLogSeriesOfWithZeroValuation v + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnKexp hnvalExp hvx hcomplete) hnKlog = 0 ↔ + x = 0 := by + constructor + · intro hlog + by_contra hx + exact + (principalUnitLogSeries_expSeries_ne_zero_ofWithZeroValuation + (v := v) (p := p) (x := x) hx hnKexp hnvalExp hnKlog hnvalLog + hvx (hthreshold hx) hcomplete) hlog + · intro hx + subst x + have hExp : + principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) (0 : K) hnKexp hnvalExp hvx hcomplete = + (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) := + (principalUnitExpSeries_eq_one_iff_ofWithZeroValuation + (v := v) (p := p) (x := (0 : K)) hnKexp hnvalExp hvx hcomplete).2 rfl + simp [hExp] + +/-- Product of principal units, rewritten as the `log(1 + z)` argument for +`z = (u - 1) + (w - 1) + (u - 1)(w - 1)`. -/ +theorem principalUnitLogSeries_mul_argument_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) : + principalUnitLogSeriesOfWithZeroValuation v (u * w) hnK = + logOnePlusSeriesFieldOfWithZeroValuation v + (principalUnitSubOneOfWithZeroValuation v u + + principalUnitSubOneOfWithZeroValuation v w + + principalUnitSubOneOfWithZeroValuation v u * + principalUnitSubOneOfWithZeroValuation v w) hnK := by + simp [principalUnitLogSeriesOfWithZeroValuation, + principalUnitSubOne_mul_ofWithZeroValuation] + +/-- Finite-logarithm-polynomial version of +`principalUnitLogSeries_mul_argument_ofWithZeroValuation`. -/ +theorem principalUnitLogPartialSum_mul_argument_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (N : ℕ) : + principalUnitLogPartialSumOfWithZeroValuation v (u * w) hnK N = + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u + + principalUnitSubOneOfWithZeroValuation v w + + principalUnitSubOneOfWithZeroValuation v u * + principalUnitSubOneOfWithZeroValuation v w) hnK N := by + simp [principalUnitLogPartialSumOfWithZeroValuation, + principalUnitSubOne_mul_ofWithZeroValuation] + +/-- The logarithm series for a product of first principal units, written with +the explicit product argument `(u - 1) + (w - 1) + (u - 1)(w - 1)`. -/ +theorem hasSum_principalUnitLogSeries_mul_argument_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum + (fun n : ℕ => + signedLogSeriesTermField + (principalUnitSubOneOfWithZeroValuation v u + + principalUnitSubOneOfWithZeroValuation v w + + principalUnitSubOneOfWithZeroValuation v u * + principalUnitSubOneOfWithZeroValuation v w) hnK n) + (principalUnitLogSeriesOfWithZeroValuation v (u * w) hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hvu : + v (principalUnitSubOneOfWithZeroValuation v u) < + (1 : WithZero (Multiplicative ℤ)) := + principalUnitSubOne_val_lt_one_ofWithZeroValuation v u + have hvw : + v (principalUnitSubOneOfWithZeroValuation v w) < + (1 : WithZero (Multiplicative ℤ)) := + principalUnitSubOne_val_lt_one_ofWithZeroValuation v w + have hsum := + hasSum_signedLogSeriesTermField_logOnePlusSeriesField_mul_argument + (v := v) (p := p) + (principalUnitSubOneOfWithZeroValuation v u) + (principalUnitSubOneOfWithZeroValuation v w) + hnK hnval hvu hvw hcomplete + simpa [principalUnitLogSeries_mul_argument_ofWithZeroValuation] using hsum + +/-- Finite logarithm polynomials for a product of first principal units +converge to the product logarithm-series value, in the explicit +`(u - 1) + (w - 1) + (u - 1)(w - 1)` argument form. -/ +theorem tendsto_principalUnitLogPartialSum_mul_argument_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun N : ℕ => + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u + + principalUnitSubOneOfWithZeroValuation v w + + principalUnitSubOneOfWithZeroValuation v u * + principalUnitSubOneOfWithZeroValuation v w) hnK N) + atTop (𝓝 (principalUnitLogSeriesOfWithZeroValuation v (u * w) hnK)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hsum := + hasSum_principalUnitLogSeries_mul_argument_ofWithZeroValuation + (v := v) (p := p) u w hnK hnval hcomplete + simpa [logOnePlusPartialSumField] using hsum.tendsto_sum_nat + +/-- The principal-unit logarithm series has the value +`principalUnitLogSeriesOfWithZeroValuation`. -/ +theorem hasSum_principalUnitLogSeries_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum + (fun n : ℕ => + signedLogSeriesTermField + (principalUnitSubOneOfWithZeroValuation v u) hnK n) + (principalUnitLogSeriesOfWithZeroValuation v u hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hvx : + v (principalUnitSubOneOfWithZeroValuation v u) < + (1 : WithZero (Multiplicative ℤ)) := + principalUnitSubOne_val_lt_one_ofWithZeroValuation v u + simpa [principalUnitLogSeriesOfWithZeroValuation] using + hasSum_signedLogSeriesTermField_logOnePlusSeriesField_ofWithZeroValuation_of_lt_one + (v := v) (p := p) + (principalUnitSubOneOfWithZeroValuation v u) hnK hnval hvx hcomplete + +/-- The finite logarithm polynomials of a first principal unit converge to the +principal-unit logarithm-series value. -/ +theorem tendsto_principalUnitLogPartialSum_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun N : ℕ => + principalUnitLogPartialSumOfWithZeroValuation v u hnK N) + atTop (𝓝 (principalUnitLogSeriesOfWithZeroValuation v u hnK)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hvx : + v (principalUnitSubOneOfWithZeroValuation v u) < + (1 : WithZero (Multiplicative ℤ)) := + principalUnitSubOne_val_lt_one_ofWithZeroValuation v u + simpa [principalUnitLogPartialSumOfWithZeroValuation, + principalUnitLogSeriesOfWithZeroValuation] using + tendsto_logOnePlusPartialSumField_ofWithZeroValuation_of_lt_one + (v := v) (p := p) + (principalUnitSubOneOfWithZeroValuation v u) hnK hnval hvx hcomplete + +/-- The termwise sum of the two principal-unit logarithm series has value +`Log(u) + Log(w)`. -/ +theorem hasSum_principalUnitLogSeries_add_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum + (fun n : ℕ => + signedLogSeriesTermField + (principalUnitSubOneOfWithZeroValuation v u) hnK n + + signedLogSeriesTermField + (principalUnitSubOneOfWithZeroValuation v w) hnK n) + (principalUnitLogSeriesOfWithZeroValuation v u hnK + + principalUnitLogSeriesOfWithZeroValuation v w hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + exact + (hasSum_principalUnitLogSeries_ofWithZeroValuation + (v := v) (p := p) u hnK hnval hcomplete).add + (hasSum_principalUnitLogSeries_ofWithZeroValuation + (v := v) (p := p) w hnK hnval hcomplete) + +/-- Finite logarithm polynomials for two principal units add term by term. -/ +theorem principalUnitLogPartialSum_add_eq_sum_add_terms_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (N : ℕ) : + principalUnitLogPartialSumOfWithZeroValuation v u hnK N + + principalUnitLogPartialSumOfWithZeroValuation v w hnK N = + ∑ n ∈ Finset.range N, + (signedLogSeriesTermField + (principalUnitSubOneOfWithZeroValuation v u) hnK n + + signedLogSeriesTermField + (principalUnitSubOneOfWithZeroValuation v w) hnK n) := by + simpa [principalUnitLogPartialSumOfWithZeroValuation] using + logOnePlusPartialSumField_add_eq_sum_add_terms + (principalUnitSubOneOfWithZeroValuation v u) + (principalUnitSubOneOfWithZeroValuation v w) hnK N + +/-- The sum of two finite principal-unit logarithm polynomials converges to +`Log(u) + Log(w)`. -/ +theorem tendsto_principalUnitLogPartialSum_add_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun N : ℕ => + principalUnitLogPartialSumOfWithZeroValuation v u hnK N + + principalUnitLogPartialSumOfWithZeroValuation v w hnK N) + atTop + (𝓝 (principalUnitLogSeriesOfWithZeroValuation v u hnK + + principalUnitLogSeriesOfWithZeroValuation v w hnK)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hu := + tendsto_principalUnitLogPartialSum_ofWithZeroValuation + (v := v) (p := p) u hnK hnval hcomplete + have hw := + tendsto_principalUnitLogPartialSum_ofWithZeroValuation + (v := v) (p := p) w hnK hnval hcomplete + exact hu.add hw + +/-- If two convergent field-valued sequences differ by a sequence converging +to zero, then their limits agree. This is the topological endpoint used to +turn the formal logarithm product defect into actual additivity of the local +logarithm. -/ +theorem eq_of_tendsto_sub_zero + [TopologicalSpace K] [T2Space K] [ContinuousAdd K] + {f g : ℕ → K} {a b : K} + (hf : Tendsto f atTop (𝓝 a)) + (hg : Tendsto g atTop (𝓝 b)) + (hsub : Tendsto (fun n => f n - g n) atTop (𝓝 0)) : + a = b := by + have hfg : + Tendsto (fun n => (f n - g n) + g n) atTop (𝓝 (0 + b)) := + hsub.add hg + have hf' : Tendsto f atTop (𝓝 b) := by + simpa [sub_eq_add_neg, add_assoc] using hfg + exact tendsto_nhds_unique hf hf' + +/-- The principal-unit logarithm product defect is the same as the field-level +defect for the two additive parameters `u - 1` and `w - 1`. -/ +theorem principalUnitLogPartialSum_product_defect_eq_field_defect_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (N : ℕ) : + principalUnitLogPartialSumOfWithZeroValuation v (u * w) hnK N - + (principalUnitLogPartialSumOfWithZeroValuation v u hnK N + + principalUnitLogPartialSumOfWithZeroValuation v w hnK N) = + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u + + principalUnitSubOneOfWithZeroValuation v w + + principalUnitSubOneOfWithZeroValuation v u * + principalUnitSubOneOfWithZeroValuation v w) hnK N - + (logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u) hnK N + + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v w) hnK N) := by + rw [principalUnitLogPartialSum_mul_argument_ofWithZeroValuation] + simp [principalUnitLogPartialSumOfWithZeroValuation] + +/-- Principal-unit logarithm additivity reduced to the one remaining analytic +bridge: the difference between the product logarithm partial sums and the +sum of the two logarithm partial sums tends to zero. The formal identity +proved above supplies the coefficient cancellation for this defect; this +lemma records the exact topological endpoint needed by the field-unit logarithm theorem. -/ +theorem principalUnitLogSeries_mul_eq_add_of_tendsto_defect_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (hdefect : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun N : ℕ => + principalUnitLogPartialSumOfWithZeroValuation v (u * w) hnK N - + (principalUnitLogPartialSumOfWithZeroValuation v u hnK N + + principalUnitLogPartialSumOfWithZeroValuation v w hnK N)) + atTop (𝓝 (0 : K))) : + principalUnitLogSeriesOfWithZeroValuation v (u * w) hnK = + principalUnitLogSeriesOfWithZeroValuation v u hnK + + principalUnitLogSeriesOfWithZeroValuation v w hnK := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hprod := + tendsto_principalUnitLogPartialSum_ofWithZeroValuation + (v := v) (p := p) (u * w) hnK hnval hcomplete + have hadd := + tendsto_principalUnitLogPartialSum_add_ofWithZeroValuation + (v := v) (p := p) u w hnK hnval hcomplete + exact + eq_of_tendsto_sub_zero + (K := K) hprod hadd hdefect + +/-- Field-level version of +`principalUnitLogSeries_mul_eq_add_of_tendsto_defect_ofWithZeroValuation`. +After this reduction, the remaining analytic work for the field-unit logarithm theorem is to +prove that the displayed field-level defect tends to zero from the formal +coefficient identity. -/ +theorem principalUnitLogSeries_mul_eq_add_of_tendsto_field_defect_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (hdefect : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun N : ℕ => + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u + + principalUnitSubOneOfWithZeroValuation v w + + principalUnitSubOneOfWithZeroValuation v u * + principalUnitSubOneOfWithZeroValuation v w) hnK N - + (logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u) hnK N + + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v w) hnK N)) + atTop (𝓝 (0 : K))) : + principalUnitLogSeriesOfWithZeroValuation v (u * w) hnK = + principalUnitLogSeriesOfWithZeroValuation v u hnK + + principalUnitLogSeriesOfWithZeroValuation v w hnK := by + apply principalUnitLogSeries_mul_eq_add_of_tendsto_defect_ofWithZeroValuation + (v := v) (p := p) u w hnK hnval hcomplete + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + simpa [principalUnitLogPartialSum_product_defect_eq_field_defect_ofWithZeroValuation + (v := v) u w hnK] using hdefect + +/-- Principal-unit logarithm as a multiplicative homomorphism, conditional only +on the remaining field-level defect convergence. The codomain is written as +`Multiplicative K`, so multiplication there is addition in the local field. -/ +noncomputable def principalUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (hdefect : + ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1, + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun N : ℕ => + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u + + principalUnitSubOneOfWithZeroValuation v w + + principalUnitSubOneOfWithZeroValuation v u * + principalUnitSubOneOfWithZeroValuation v w) hnK N - + (logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u) hnK N + + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v w) hnK N)) + atTop (𝓝 (0 : K))) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1 →* + Multiplicative K where + toFun u := Multiplicative.ofAdd + (principalUnitLogSeriesOfWithZeroValuation v u hnK) + map_one' := by + simp + map_mul' u w := by + change + Multiplicative.ofAdd + (principalUnitLogSeriesOfWithZeroValuation v (u * w) hnK) = + Multiplicative.ofAdd + (principalUnitLogSeriesOfWithZeroValuation v u hnK + + principalUnitLogSeriesOfWithZeroValuation v w hnK) + rw [principalUnitLogSeries_mul_eq_add_of_tendsto_field_defect_ofWithZeroValuation + (v := v) (p := p) u w hnK hnval hcomplete (hdefect u w)] + +/-- +Establishes the identity `Multiplicative.toAdd +(principalUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation (v := v) (p := p) hnK hnval +hcomplete hdefect u) = principalUnitLogSeriesOfWithZeroValuation v u hnK`. +-/ +@[simp] theorem principalUnitLogSeriesHom_apply_toAdd_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (hdefect : + ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1, + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun N : ℕ => + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u + + principalUnitSubOneOfWithZeroValuation v w + + principalUnitSubOneOfWithZeroValuation v u * + principalUnitSubOneOfWithZeroValuation v w) hnK N - + (logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u) hnK N + + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v w) hnK N)) + atTop (𝓝 (0 : K))) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) : + Multiplicative.toAdd + (principalUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete hdefect u) = + principalUnitLogSeriesOfWithZeroValuation v u hnK := by + rfl + +/-- A homomorphism on first principal units extends to the three-factor +decomposition of `Kˣ` by killing the Teichmuller root factor and the +uniformizer factor. This is the algebraic extension shape used in the field-unit logarithm + theorem after the principal-unit logarithm has been proved additive. -/ +noncomputable def fieldUnitDecompositionLogHomOfPrincipalUnitHom + (F : CompleteDVF K) [Finite F.residueField] + {A : Type*} [AddCommGroup A] + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) : + fieldUnitDecompositionFactors F →* + Multiplicative A where + toFun z := φ z.1.2 + map_one' := by + simp + map_mul' z w := by + simp + +/-- +The defining evaluation formula for `fieldUnitDecompositionLogHomOfPrincipalUnitHom` is +`fieldUnitDecompositionLogHomOfPrincipalUnitHom (F := F) φ z = φ z.1.2`. +-/ +@[simp] theorem fieldUnitDecompositionLogHomOfPrincipalUnitHom_apply + (F : CompleteDVF K) [Finite F.residueField] + {A : Type*} [AddCommGroup A] + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) + (z : fieldUnitDecompositionFactors F) : + fieldUnitDecompositionLogHomOfPrincipalUnitHom (F := F) φ z = φ z.1.2 := + rfl + +/-- +Establishes the identity `fieldUnitDecompositionLogHomOfPrincipalUnitHom (F := F) φ ((ζ, 1), (1 : +Multiplicative ℤ)) = 1`. +-/ +theorem fieldUnitDecompositionLogHomOfPrincipalUnitHom_root + (F : CompleteDVF K) [Finite F.residueField] + {A : Type*} [AddCommGroup A] + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) + (ζ : residueRootsOfUnityGroup F) : + fieldUnitDecompositionLogHomOfPrincipalUnitHom (F := F) φ + ((ζ, 1), (1 : Multiplicative ℤ)) = 1 := by + simp + +/-- +Establishes the identity `fieldUnitDecompositionLogHomOfPrincipalUnitHom (F := F) φ (((1 : +CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), u), (1 : Multiplicative ℤ)) = φ +u`. +-/ +@[simp] theorem fieldUnitDecompositionLogHomOfPrincipalUnitHom_principal + (F : CompleteDVF K) [Finite F.residueField] + {A : Type*} [AddCommGroup A] + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) : + fieldUnitDecompositionLogHomOfPrincipalUnitHom (F := F) φ + (((1 : + residueRootsOfUnityGroup F), u), + (1 : Multiplicative ℤ)) = φ u := by + simp + +/-- +Establishes the identity `fieldUnitDecompositionLogHomOfPrincipalUnitHom (F := F) φ (((1 : +CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), (1 : +(CompleteDVF.higherPrincipalUnitGroup F) 1)), Multiplicative.ofAdd m) = 1`. +-/ +theorem fieldUnitDecompositionLogHomOfPrincipalUnitHom_uniformizer + (F : CompleteDVF K) [Finite F.residueField] + {A : Type*} [AddCommGroup A] + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) + (m : ℤ) : + fieldUnitDecompositionLogHomOfPrincipalUnitHom (F := F) φ + (((1 : + residueRootsOfUnityGroup F), + (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F) 1)), + Multiplicative.ofAdd m) = 1 := by + simp + +/-- A field-unit logarithm homomorphism obtained from a chosen the +uniformizer–residue–principal-unit decomposition +three-factor decomposition and a principal-unit logarithm homomorphism. -/ +noncomputable def fieldUnitLogHomOfPrincipalUnitHom + (F : CompleteDVF K) [Finite F.residueField] + {A : Type*} [AddCommGroup A] + (e : fieldUnitDecompositionFactors F ≃* Kˣ) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) : + Kˣ →* Multiplicative A := + (fieldUnitDecompositionLogHomOfPrincipalUnitHom (F := F) φ).comp + e.symm.toMonoidHom + +/-- +The defining evaluation formula for `fieldUnitLogHomOfPrincipalUnitHom` is +`fieldUnitLogHomOfPrincipalUnitHom (F := F) e φ x = φ ((e.symm x).1.2)`. +-/ +@[simp] theorem fieldUnitLogHomOfPrincipalUnitHom_apply + (F : CompleteDVF K) [Finite F.residueField] + {A : Type*} [AddCommGroup A] + (e : fieldUnitDecompositionFactors F ≃* Kˣ) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (x : Kˣ) : + fieldUnitLogHomOfPrincipalUnitHom (F := F) e φ x = + φ ((e.symm x).1.2) := + rfl + +/-- Establishes the identity `fieldUnitLogHomOfPrincipalUnitHom (F := F) e φ x = φ z.1.2`. -/ +theorem fieldUnitLogHomOfPrincipalUnitHom_apply_of_decomposition_eq + (F : CompleteDVF K) [Finite F.residueField] + {A : Type*} [AddCommGroup A] + (e : fieldUnitDecompositionFactors F ≃* Kˣ) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) + (z : fieldUnitDecompositionFactors F) + {x : Kˣ} (hx : e z = x) : + fieldUnitLogHomOfPrincipalUnitHom (F := F) e φ x = φ z.1.2 := by + subst x + simp + +/-- Establishes the identity `fieldUnitLogHomOfPrincipalUnitHom (F := F) e φ x = 1`. -/ +theorem fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_root_decomposition + (F : CompleteDVF K) [Finite F.residueField] + {A : Type*} [AddCommGroup A] + (e : fieldUnitDecompositionFactors F ≃* Kˣ) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) + (ζ : residueRootsOfUnityGroup F) + {x : Kˣ} + (hx : e ((ζ, 1), (1 : Multiplicative ℤ)) = x) : + fieldUnitLogHomOfPrincipalUnitHom (F := F) e φ x = 1 := by + simpa using + fieldUnitLogHomOfPrincipalUnitHom_apply_of_decomposition_eq + (F := F) e φ ((ζ, 1), (1 : Multiplicative ℤ)) hx + +/-- Establishes the identity `fieldUnitLogHomOfPrincipalUnitHom (F := F) e φ x = φ u`. -/ +theorem fieldUnitLogHomOfPrincipalUnitHom_eq_of_principal_decomposition + (F : CompleteDVF K) [Finite F.residueField] + {A : Type*} [AddCommGroup A] + (e : fieldUnitDecompositionFactors F ≃* Kˣ) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) {x + : Kˣ} + (hx : + e (((1 : + residueRootsOfUnityGroup F), + u), (1 : Multiplicative ℤ)) = x) : + fieldUnitLogHomOfPrincipalUnitHom (F := F) e φ x = φ u := by + simpa using + fieldUnitLogHomOfPrincipalUnitHom_apply_of_decomposition_eq + (F := F) e φ + (((1 : + residueRootsOfUnityGroup F), u), + (1 : Multiplicative ℤ)) hx + +/-- Establishes the identity `fieldUnitLogHomOfPrincipalUnitHom (F := F) e φ x = 1`. -/ +theorem fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_uniformizer_decomposition + (F : CompleteDVF K) [Finite F.residueField] + {A : Type*} [AddCommGroup A] + (e : fieldUnitDecompositionFactors F ≃* Kˣ) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) + (m : ℤ) {x : Kˣ} + (hx : + e (((1 : + residueRootsOfUnityGroup F), + (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)), + Multiplicative.ofAdd m) = x) : + fieldUnitLogHomOfPrincipalUnitHom (F := F) e φ x = 1 := by + simpa using + fieldUnitLogHomOfPrincipalUnitHom_apply_of_decomposition_eq + (F := F) e φ + (((1 : + residueRootsOfUnityGroup F), + (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)), + Multiplicative.ofAdd m) hx + +/-- public root-factor value of the field-unit logarithm constructed from +the complete-DVF uniformizer decomposition. -/ +theorem fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_completeDVF_root + (F : CompleteDVF K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + {A : Type*} [AddCommGroup A] + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) + (ζ : residueRootsOfUnityGroup F) : + fieldUnitLogHomOfPrincipalUnitHom + (F := F) + (fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ) φ + (valuationSubringUnitFieldUnitHom F + (ζ : F.valuationSubringˣ)) = 1 := by + apply fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_root_decomposition + (F := F) + (e := + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ) + (φ := φ) (ζ := ζ) + simp [fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply] + +/-- public principal-unit value of the field-unit logarithm constructed +from the complete-DVF uniformizer decomposition. -/ +theorem fieldUnitLogHomOfPrincipalUnitHom_eq_of_completeDVF_principal + (F : CompleteDVF K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + {A : Type*} [AddCommGroup A] + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) : + fieldUnitLogHomOfPrincipalUnitHom + (F := F) + (fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ) φ + (valuationSubringUnitFieldUnitHom F + (u : F.valuationSubringˣ)) = φ u := by + apply fieldUnitLogHomOfPrincipalUnitHom_eq_of_principal_decomposition + (F := F) + (e := + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ) + (φ := φ) (u := u) + simp [fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply] + +/-- public uniformizer value of the field-unit logarithm constructed from +the complete-DVF uniformizer decomposition: the selected uniformizer is sent to +zero, written as `1` in `Multiplicative A`. -/ +theorem fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_completeDVF_uniformizer + (F : CompleteDVF K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + {A : Type*} [AddCommGroup A] + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) : + fieldUnitLogHomOfPrincipalUnitHom + (F := F) + (fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ) φ + (Units.mk0 (π : K) hπ.ne_zero) = 1 := by + apply fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_uniformizer_decomposition + (F := F) + (e := + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ) + (φ := φ) (m := 1) + simp [fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply] + +/-- Conditional field-unit logarithm for the field-unit logarithm theorem: once the remaining +field-level defect convergence proves additivity on `U¹`, the resulting +principal-unit logarithm extends over a chosen field-unit decomposition by +sending the root and uniformizer factors to zero. -/ +noncomputable def fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + [Finite (completeDVFOfWithZeroValuation v).residueField] + (e : + fieldUnitDecompositionFactors + (completeDVFOfWithZeroValuation v) ≃* Kˣ) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (hdefect : + ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1, + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun N : ℕ => + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u + + principalUnitSubOneOfWithZeroValuation v w + + principalUnitSubOneOfWithZeroValuation v u * + principalUnitSubOneOfWithZeroValuation v w) hnK N - + (logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u) hnK N + + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v w) hnK N)) + atTop (𝓝 (0 : K))) : + Kˣ →* Multiplicative K := + fieldUnitLogHomOfPrincipalUnitHom + (F := completeDVFOfWithZeroValuation v) e + (principalUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete hdefect) + +/-- public conditional logarithm on `Kˣ`, using the complete-DVF +uniformizer decomposition supplied by + the uniformizer–residue–principal-unit decomposition. This is the same +construction as `fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation`, +with the decomposition chosen canonically from a uniformizer. -/ +noncomputable def fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + [Finite (completeDVFOfWithZeroValuation v).residueField] + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (hdefect : + ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1, + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun N : ℕ => + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u + + principalUnitSubOneOfWithZeroValuation v w + + principalUnitSubOneOfWithZeroValuation v u * + principalUnitSubOneOfWithZeroValuation v w) hnK N - + (logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u) hnK N + + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v w) hnK N)) + atTop (𝓝 (0 : K))) : + Kˣ →* Multiplicative K := + fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation + (v := v) (p := p) + (e := + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + (completeDVFOfWithZeroValuation v) hπ) + hnK hnval hcomplete hdefect + +/-- On first principal units, the public conditional field-unit logarithm +agrees with the principal-unit logarithm. -/ +theorem fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer_principal + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + [Finite (completeDVFOfWithZeroValuation v).residueField] + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (hdefect : + ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1, + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun N : ℕ => + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u + + principalUnitSubOneOfWithZeroValuation v w + + principalUnitSubOneOfWithZeroValuation v u * + principalUnitSubOneOfWithZeroValuation v w) hnK N - + (logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u) hnK N + + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v w) hnK N)) + atTop (𝓝 (0 : K))) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) : + fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer + (v := v) (p := p) hπ hnK hnval hcomplete hdefect + (valuationSubringUnitFieldUnitHom + (completeDVFOfWithZeroValuation v) (u : _)) = + principalUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete hdefect u := by + simpa [fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer, + fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation] using + fieldUnitLogHomOfPrincipalUnitHom_eq_of_completeDVF_principal + (F := completeDVFOfWithZeroValuation v) hπ + (principalUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete hdefect) u + +/-- Additive-value form of the preceding principal-unit evaluation: on `U¹`, +the public field-unit logarithm is the principal-unit logarithm series. -/ +theorem fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer_principal_toAdd + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + [Finite (completeDVFOfWithZeroValuation v).residueField] + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (hdefect : + ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1, + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun N : ℕ => + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u + + principalUnitSubOneOfWithZeroValuation v w + + principalUnitSubOneOfWithZeroValuation v u * + principalUnitSubOneOfWithZeroValuation v w) hnK N - + (logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u) hnK N + + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v w) hnK N)) + atTop (𝓝 (0 : K))) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) : + Multiplicative.toAdd + (fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer + (v := v) (p := p) hπ hnK hnval hcomplete hdefect + (valuationSubringUnitFieldUnitHom + (completeDVFOfWithZeroValuation v) (u : _))) = + principalUnitLogSeriesOfWithZeroValuation v u hnK := by + rw [fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer_principal + (v := v) (p := p) hπ hnK hnval hcomplete hdefect u] + rfl + +/-- Teichmuller root factors have logarithm zero for the public +conditional field-unit logarithm. -/ +theorem fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer_root + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + [Finite (completeDVFOfWithZeroValuation v).residueField] + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (hdefect : + ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1, + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun N : ℕ => + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u + + principalUnitSubOneOfWithZeroValuation v w + + principalUnitSubOneOfWithZeroValuation v u * + principalUnitSubOneOfWithZeroValuation v w) hnK N - + (logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u) hnK N + + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v w) hnK N)) + atTop (𝓝 (0 : K))) + (ζ : + residueRootsOfUnityGroup + (completeDVFOfWithZeroValuation v)) : + fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer + (v := v) (p := p) hπ hnK hnval hcomplete hdefect + (valuationSubringUnitFieldUnitHom + (completeDVFOfWithZeroValuation v) (ζ : _)) = 1 := by + simpa [fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer, + fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation] using + fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_completeDVF_root + (F := completeDVFOfWithZeroValuation v) hπ + (principalUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete hdefect) ζ + +/-- Additive-value form of the Teichmuller-root evaluation: root factors have +field-unit logarithm `0`. -/ +theorem fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer_root_toAdd + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + [Finite (completeDVFOfWithZeroValuation v).residueField] + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (hdefect : + ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1, + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun N : ℕ => + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u + + principalUnitSubOneOfWithZeroValuation v w + + principalUnitSubOneOfWithZeroValuation v u * + principalUnitSubOneOfWithZeroValuation v w) hnK N - + (logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u) hnK N + + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v w) hnK N)) + atTop (𝓝 (0 : K))) + (ζ : + residueRootsOfUnityGroup + (completeDVFOfWithZeroValuation v)) : + Multiplicative.toAdd + (fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer + (v := v) (p := p) hπ hnK hnval hcomplete hdefect + (valuationSubringUnitFieldUnitHom + (completeDVFOfWithZeroValuation v) (ζ : _))) = 0 := by + rw [fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer_root + (v := v) (p := p) hπ hnK hnval hcomplete hdefect ζ] + rfl + +/-- The selected uniformizer has logarithm zero for the public conditional +field-unit logarithm. -/ +theorem fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer_uniformizer + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + [Finite (completeDVFOfWithZeroValuation v).residueField] + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (hdefect : + ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1, + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun N : ℕ => + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u + + principalUnitSubOneOfWithZeroValuation v w + + principalUnitSubOneOfWithZeroValuation v u * + principalUnitSubOneOfWithZeroValuation v w) hnK N - + (logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u) hnK N + + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v w) hnK N)) + atTop (𝓝 (0 : K))) : + fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer + (v := v) (p := p) hπ hnK hnval hcomplete hdefect + (Units.mk0 (π : K) hπ.ne_zero) = 1 := by + simpa [fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer, + fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation] using + fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_completeDVF_uniformizer + (F := completeDVFOfWithZeroValuation v) hπ + (principalUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete hdefect) + +/-- Additive-value form of the uniformizer evaluation: the selected +uniformizer has field-unit logarithm `0`. -/ +theorem fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer_uniformizer_toAdd + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + [Finite (completeDVFOfWithZeroValuation v).residueField] + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (hdefect : + ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1, + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun N : ℕ => + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u + + principalUnitSubOneOfWithZeroValuation v w + + principalUnitSubOneOfWithZeroValuation v u * + principalUnitSubOneOfWithZeroValuation v w) hnK N - + (logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v u) hnK N + + logOnePlusPartialSumField + (principalUnitSubOneOfWithZeroValuation v w) hnK N)) + atTop (𝓝 (0 : K))) : + Multiplicative.toAdd + (fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer + (v := v) (p := p) hπ hnK hnval hcomplete hdefect + (Units.mk0 (π : K) hπ.ne_zero)) = 0 := by + rw [fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer_uniformizer + (v := v) (p := p) hπ hnK hnval hcomplete hdefect] + rfl + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/InverseEstimates.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/InverseEstimates.lean new file mode 100644 index 0000000000..95bbc3e4b1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/InverseEstimates.lean @@ -0,0 +1,1210 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.LogConvergence +/-! +Develops the valuation estimates showing that logarithm and exponential series are inverse on +their common principal-unit domain. +-/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + mem_maximalIdeal_pow_iff_valuation_le_uniformizer_pow → + mem_maximalIdeal_pow_iff_valuation_le_uniformizer_pow + + +open Filter +open Polynomial +open scoped Topology +open scoped PowerSeries.WithPiTopology +noncomputable +section + +attribute [local instance] Classical.propDecidable + +universe u + +open ValuationTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +variable {K : Type u} [Field K] + +/-- First-term extraction for the exponential series on the normalized +exponential convergence radius. -/ +theorem expSeriesField_eq_one_add_tsum_succ_ofWithZeroValuation_of_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + expSeriesFieldOfWithZeroValuation v x hnK = + 1 + ∑' n : ℕ, expSeriesTermField x hnK (n + 1) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + exact + expSeriesField_eq_one_add_tsum_succ_of_summable v x hnK + (summable_expSeriesTermField_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) x hnK hnval hvx hcomplete) + +/-- Tail form of the exponential series on the normalized convergence radius: +subtracting the constant term leaves exactly the positive-degree tail. -/ +theorem expSeriesField_sub_one_eq_tsum_succ_ofWithZeroValuation_of_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + expSeriesFieldOfWithZeroValuation v x hnK - 1 = + ∑' n : ℕ, expSeriesTermField x hnK (n + 1) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + rw [ + expSeriesField_eq_one_add_tsum_succ_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) x hnK hnval hvx hcomplete] + abel + +/-- The positive-degree exponential tail partial sums converge to +`expSeries - 1`. -/ +theorem tendsto_expSeriesTailPartialSumField_ofWithZeroValuation_of_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun N : ℕ => + ∑ n ∈ Finset.range N, expSeriesTermField x hnK (n + 1)) + atTop + (𝓝 (expSeriesFieldOfWithZeroValuation v x hnK - 1)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hfull : + Tendsto + (fun N : ℕ => expSeriesPartialSumField x hnK (N + 1)) + atTop (𝓝 (expSeriesFieldOfWithZeroValuation v x hnK)) := by + exact + (tendsto_expSeriesPartialSumField_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) x hnK hnval hvx hcomplete).comp + (tendsto_add_atTop_nat 1) + have hsub : + Tendsto + (fun N : ℕ => expSeriesPartialSumField x hnK (N + 1) - 1) + atTop (𝓝 (expSeriesFieldOfWithZeroValuation v x hnK - 1)) := + hfull.sub tendsto_const_nhds + have htail : + (fun N : ℕ => expSeriesPartialSumField x hnK (N + 1) - 1) = + fun N : ℕ => + ∑ n ∈ Finset.range N, expSeriesTermField x hnK (n + 1) := by + funext N + rw [expSeriesPartialSumField_succ_eq_one_add_tail] + abel + simpa [htail] using hsub + +/-- First-term extraction for the exponential series under the sharp ramified +threshold. -/ +theorem expSeriesField_eq_one_add_tsum_succ_ofWithZeroValuation_scaled_of_threshold + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hxthreshold : ∀ hx : x ≠ 0, + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + expSeriesFieldOfWithZeroValuation v x hnK = + 1 + ∑' n : ℕ, expSeriesTermField x hnK (n + 1) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + exact + expSeriesField_eq_one_add_tsum_succ_of_summable v x hnK + (summable_expSeriesTermField_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e x hnK hnval + (fun hx => by exact_mod_cast hxthreshold hx) hcomplete) + +/-- Tail form of the exponential series under the sharp ramified threshold. -/ +theorem expSeriesField_sub_one_eq_tsum_succ_ofWithZeroValuation_scaled_of_threshold + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hxthreshold : ∀ hx : x ≠ 0, + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + expSeriesFieldOfWithZeroValuation v x hnK - 1 = + ∑' n : ℕ, expSeriesTermField x hnK (n + 1) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + rw [ + expSeriesField_eq_one_add_tsum_succ_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e x hnK hnval hxthreshold hcomplete] + abel + +/-- The positive-degree exponential tail partial sums converge to +`expSeries - 1` under the sharp ramified threshold. -/ +theorem tendsto_expSeriesTailPartialSumField_ofWithZeroValuation_scaled_of_threshold + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hxthreshold : ∀ hx : x ≠ 0, + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun N : ℕ => + ∑ n ∈ Finset.range N, expSeriesTermField x hnK (n + 1)) + atTop + (𝓝 (expSeriesFieldOfWithZeroValuation v x hnK - 1)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hfull : + Tendsto + (fun N : ℕ => expSeriesPartialSumField x hnK (N + 1)) + atTop (𝓝 (expSeriesFieldOfWithZeroValuation v x hnK)) := by + exact + (tendsto_expSeriesPartialSumField_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e x hnK hnval + (fun hx => by exact_mod_cast hxthreshold hx) hcomplete).comp + (tendsto_add_atTop_nat 1) + have hsub : + Tendsto + (fun N : ℕ => expSeriesPartialSumField x hnK (N + 1) - 1) + atTop (𝓝 (expSeriesFieldOfWithZeroValuation v x hnK - 1)) := + hfull.sub tendsto_const_nhds + have htail : + (fun N : ℕ => expSeriesPartialSumField x hnK (N + 1) - 1) = + fun N : ℕ => + ∑ n ∈ Finset.range N, expSeriesTermField x hnK (n + 1) := by + funext N + rw [expSeriesPartialSumField_succ_eq_one_add_tail] + abel + simpa [htail] using hsub + +/-- A field-element exponential-series term is nonzero when the input is +nonzero. -/ +theorem expSeriesTermField_ne_zero_of_ne_zero + {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) (n : ℕ) : + expSeriesTermField x hnK n ≠ 0 := by + have hpow : x ^ n ≠ 0 := pow_ne_zero n hx + have hden : + (((Units.mk0 (((n.factorial : ℕ) : K)) (hnK n) : Kˣ) : K) ≠ 0) := + (Units.mk0 (((n.factorial : ℕ) : K)) (hnK n)).ne_zero + simpa [expSeriesTermField] using div_ne_zero hpow hden + +/-- On the normalized exponential convergence ball, every exponential term of +degree at least two has strictly smaller `ℤᵐ⁰`-value than the linear term. -/ +theorem valuation_expSeriesTermField_lt_self_of_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + {n : ℕ} (hn : 2 ≤ n) : + v (expSeriesTermField x hnK n) < v x := by + let xu : Kˣ := Units.mk0 x hx + let denom : Kˣ := + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n) + have hxoneReal : + 1 < ((ofWithZeroValuation v).val xu : ℝ) := + ofWithZeroValuation_val_mk0_one_lt_of_lt_exp_neg_one + (v := v) (x := x) hx hvx + have hxone : 1 < (ofWithZeroValuation v).val xu := by + exact_mod_cast hxoneReal + have hxmin : (2 : ℤ) ≤ (ofWithZeroValuation v).val xu := by + omega + have hval : + (ofWithZeroValuation v).val xu < + (ofWithZeroValuation v).val (xu ^ n / denom) := by + change + (ofWithZeroValuation v).val xu < + (ofWithZeroValuation v).val + (xu ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n)) + rw [ofWithZeroValuation_val_pow_div_natCast_factorial + (v := v) (p := p) (n := n) xu (hnK n) (hnval n)] + exact + exp_higher_term_integer_valuation_gt + (p := p) hn hxmin + have hlt := + valuation_lt_of_ofWithZeroValuation_val_lt + (v := v) (x := xu) (y := xu ^ n / denom) hval + simpa [xu, denom, expSeriesTermField] using hlt + +/-- Above the sharp ramified `e/(p-1)` threshold, every exponential term of +degree at least two has strictly smaller `ℤᵐ⁰`-value than the linear term. -/ +theorem valuation_expSeriesTermField_lt_self_of_scaled_inv_sub_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hthreshold : + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + {n : ℕ} (hn : 2 ≤ n) : + v (expSeriesTermField x hnK n) < v x := by + let xu : Kˣ := Units.mk0 x hx + let denom : Kˣ := + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n) + have hval : + (ofWithZeroValuation v).val xu < + (ofWithZeroValuation v).val (xu ^ n / denom) := by + change + (ofWithZeroValuation v).val xu < + (ofWithZeroValuation v).val + (xu ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n)) + rw [ofWithZeroValuation_val_pow_div_natCast_factorial_scaled + (v := v) (p := p) (e := e) (n := n) xu (hnK n) (hnval n)] + exact + exp_higher_term_integer_valuation_gt_scaled + (p := p) (e := e) (n := n) hn hthreshold + have hlt := + valuation_lt_of_ofWithZeroValuation_val_lt + (v := v) (x := xu) (y := xu ^ n / denom) hval + simpa [xu, denom, expSeriesTermField] using hlt + +/-- Every finite higher-degree exponential tail has valuation strictly smaller +than the linear term on the normalized convergence ball. -/ +theorem valuation_expSeriesHigherTailPartialSumField_lt_self_of_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) (N : ℕ) : + v (∑ n ∈ Finset.range N, expSeriesTermField x hnK (n + 2)) < + v x := by + exact + v.map_sum_lt ((_root_.Valuation.ne_zero_iff v).2 hx) + (fun n _hn => + valuation_expSeriesTermField_lt_self_of_lt_exp_neg_one + (v := v) (p := p) (x := x) hx hnK hnval hvx + (by omega)) + +/-- Every finite higher-degree exponential tail has valuation strictly smaller +than the linear term above the sharp ramified `e/(p-1)` threshold. -/ +theorem valuation_expSeriesHigherTailPartialSumField_lt_self_of_scaled_inv_sub_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hthreshold : + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + (N : ℕ) : + v (∑ n ∈ Finset.range N, expSeriesTermField x hnK (n + 2)) < + v x := by + exact + v.map_sum_lt ((_root_.Valuation.ne_zero_iff v).2 hx) + (fun n _hn => + valuation_expSeriesTermField_lt_self_of_scaled_inv_sub_one_lt + (v := v) (p := p) e (x := x) hx hnK hnval hthreshold + (by omega)) + +/-- The higher-degree exponential tail partial sums converge to +`expSeries - 1 - x`. -/ +theorem tendsto_expSeriesHigherTailPartialSumField_ofWithZeroValuation_of_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun N : ℕ => + ∑ n ∈ Finset.range N, expSeriesTermField x hnK (n + 2)) + atTop + (𝓝 (expSeriesFieldOfWithZeroValuation v x hnK - 1 - x)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hfull : + Tendsto + (fun N : ℕ => + ∑ n ∈ Finset.range (N + 1), + expSeriesTermField x hnK (n + 1)) + atTop + (𝓝 (expSeriesFieldOfWithZeroValuation v x hnK - 1)) := by + exact + (tendsto_expSeriesTailPartialSumField_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) x hnK hnval hvx hcomplete).comp + (tendsto_add_atTop_nat 1) + have hsub : + Tendsto + (fun N : ℕ => + (∑ n ∈ Finset.range (N + 1), + expSeriesTermField x hnK (n + 1)) - x) + atTop + (𝓝 (expSeriesFieldOfWithZeroValuation v x hnK - 1 - x)) := + hfull.sub tendsto_const_nhds + have htail : + (fun N : ℕ => + (∑ n ∈ Finset.range (N + 1), + expSeriesTermField x hnK (n + 1)) - x) = + fun N : ℕ => + ∑ n ∈ Finset.range N, expSeriesTermField x hnK (n + 2) := by + funext N + rw [Finset.sum_range_succ'] + simp [expSeriesTermField] + simpa [htail] using hsub + +/-- The higher-degree exponential tail partial sums converge to +`expSeries - 1 - x` under the sharp ramified threshold. -/ +theorem tendsto_expSeriesHigherTailPartialSumField_ofWithZeroValuation_scaled_of_threshold + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hxthreshold : ∀ hx : x ≠ 0, + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun N : ℕ => + ∑ n ∈ Finset.range N, expSeriesTermField x hnK (n + 2)) + atTop + (𝓝 (expSeriesFieldOfWithZeroValuation v x hnK - 1 - x)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hfull : + Tendsto + (fun N : ℕ => + ∑ n ∈ Finset.range (N + 1), + expSeriesTermField x hnK (n + 1)) + atTop + (𝓝 (expSeriesFieldOfWithZeroValuation v x hnK - 1)) := by + exact + (tendsto_expSeriesTailPartialSumField_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e x hnK hnval hxthreshold hcomplete).comp + (tendsto_add_atTop_nat 1) + have hsub : + Tendsto + (fun N : ℕ => + (∑ n ∈ Finset.range (N + 1), + expSeriesTermField x hnK (n + 1)) - x) + atTop + (𝓝 (expSeriesFieldOfWithZeroValuation v x hnK - 1 - x)) := + hfull.sub tendsto_const_nhds + have htail : + (fun N : ℕ => + (∑ n ∈ Finset.range (N + 1), + expSeriesTermField x hnK (n + 1)) - x) = + fun N : ℕ => + ∑ n ∈ Finset.range N, expSeriesTermField x hnK (n + 2) := by + funext N + rw [Finset.sum_range_succ'] + simp [expSeriesTermField] + simpa [htail] using hsub + +/-- The full higher-degree exponential tail has valuation strictly smaller +than the linear term. -/ +theorem valuation_expSeriesHigherTailField_lt_self_of_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + v (expSeriesFieldOfWithZeroValuation v x hnK - 1 - x) < + v x := by + exact + valuation_limit_lt_of_tendsto_of_eventually_lt + (v := v) (γ := v x) ((_root_.Valuation.ne_zero_iff v).2 hx) + (tendsto_expSeriesHigherTailPartialSumField_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) x hnK hnval hvx hcomplete) + (Eventually.of_forall fun N => + valuation_expSeriesHigherTailPartialSumField_lt_self_of_lt_exp_neg_one + (v := v) (p := p) (x := x) hx hnK hnval hvx N) + +/-- The full higher-degree exponential tail has valuation strictly smaller +than the linear term above the sharp ramified `e/(p-1)` threshold. -/ +theorem valuation_expSeriesHigherTailField_lt_self_of_scaled_inv_sub_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hthreshold : + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + v (expSeriesFieldOfWithZeroValuation v x hnK - 1 - x) < + v x := by + exact + valuation_limit_lt_of_tendsto_of_eventually_lt + (v := v) (γ := v x) ((_root_.Valuation.ne_zero_iff v).2 hx) + (tendsto_expSeriesHigherTailPartialSumField_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e x hnK hnval + (fun hx' => by + have hval_eq : + (ofWithZeroValuation v).val (Units.mk0 x hx') = + (ofWithZeroValuation v).val (Units.mk0 x hx) := by + congr + rw [hval_eq] + exact hthreshold) + hcomplete) + (Eventually.of_forall fun N => + valuation_expSeriesHigherTailPartialSumField_lt_self_of_scaled_inv_sub_one_lt + (v := v) (p := p) e (x := x) hx hnK hnval hthreshold N) + +/-- The exponential-series value is a first principal unit on the normalized +convergence radius: after subtracting the constant term, it lies in the open +unit ball. -/ +theorem valuation_expSeriesField_sub_one_lt_one_ofWithZeroValuation_of_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + v (expSeriesFieldOfWithZeroValuation v x hnK - 1) < + (1 : WithZero (Multiplicative ℤ)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + exact + valuation_limit_lt_one_of_tendsto_of_eventually_lt_one + (v := v) + (u := fun N : ℕ => + ∑ n ∈ Finset.range N, expSeriesTermField x hnK (n + 1)) + (z := expSeriesFieldOfWithZeroValuation v x hnK - 1) + (tendsto_expSeriesTailPartialSumField_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) x hnK hnval hvx hcomplete) + (Eventually.of_forall fun N => + valuation_expSeriesTailPartialSumField_lt_one_of_lt_exp_neg_one + (v := v) (p := p) x hnK hnval hvx N) + +/-- On the normalized convergence ball, `exp(x) - 1` has the same valuation +as the linear term `x`. -/ +theorem valuation_expSeriesField_sub_one_eq_self_ofWithZeroValuation_of_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + v (expSeriesFieldOfWithZeroValuation v x hnK - 1) = v x := by + have htail : + v (expSeriesFieldOfWithZeroValuation v x hnK - 1 - x) < + v x := + valuation_expSeriesHigherTailField_lt_self_of_lt_exp_neg_one + (v := v) (p := p) (x := x) hx hnK hnval hvx hcomplete + have hsplit : + expSeriesFieldOfWithZeroValuation v x hnK - 1 = + x + (expSeriesFieldOfWithZeroValuation v x hnK - 1 - x) := by + abel + rw [hsplit] + exact v.map_add_eq_of_lt_left htail + +/-- On the sharp ramified exponential convergence ball, +`exp(x) - 1` has the same valuation as the linear term `x`. -/ +theorem valuation_expSeriesField_sub_one_eq_self_ofWithZeroValuation_scaled_of_threshold + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hthreshold : + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + v (expSeriesFieldOfWithZeroValuation v x hnK - 1) = v x := by + have htail : + v (expSeriesFieldOfWithZeroValuation v x hnK - 1 - x) < + v x := + valuation_expSeriesHigherTailField_lt_self_of_scaled_inv_sub_one_lt + (v := v) (p := p) e (x := x) hx hnK hnval hthreshold hcomplete + have hsplit : + expSeriesFieldOfWithZeroValuation v x hnK - 1 = + x + (expSeriesFieldOfWithZeroValuation v x hnK - 1 - x) := by + abel + rw [hsplit] + exact v.map_add_eq_of_lt_left htail + +/-- Above the ramified threshold, the composite `log(exp(x))` is congruent to +`x` to strictly higher valuation. This is the field-level first-order +inverse estimate; the exact evaluated inverse still requires the full +composition argument. -/ +theorem valuation_log_exp_sub_self_lt_of_scaled_threshold + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) {x : K} (hx : x ≠ 0) + (hnKexp : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hnKlog : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hthreshold : + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + v (logOnePlusSeriesFieldOfWithZeroValuation v + (expSeriesFieldOfWithZeroValuation v x hnKexp - 1) hnKlog - x) < + v x := by + let z : K := expSeriesFieldOfWithZeroValuation v x hnKexp - 1 + have hp_sub_pos : 0 < ((p : ℚ) - 1) := by + have hp_two : (2 : ℕ) ≤ p := (Fact.out : Nat.Prime p).two_le + have hp_two_rat : (2 : ℚ) ≤ (p : ℚ) := by exact_mod_cast hp_two + linarith + have hthreshold_nonneg : + 0 ≤ (e : ℚ) / ((p : ℚ) - 1) := + div_nonneg (Nat.cast_nonneg e) hp_sub_pos.le + have hxval_pos_rat : + (0 : ℚ) < ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ) := + lt_of_le_of_lt hthreshold_nonneg hthreshold + have hxval_pos : + 0 < (ofWithZeroValuation v).val (Units.mk0 x hx) := by + exact_mod_cast hxval_pos_rat + have hvx_lt_one : + v x < (1 : WithZero (Multiplicative ℤ)) := + valuation_lt_one_of_ofWithZeroValuation_val_pos v (Units.mk0 x hx) + hxval_pos + have hvz_eq : + v z = v x := by + simpa [z] using + valuation_expSeriesField_sub_one_eq_self_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e (x := x) hx hnKexp hnvalExp hthreshold + hcomplete + have hz : z ≠ 0 := by + intro hz0 + have hzero : v z = 0 := by simp [hz0] + have hxzero : v x = 0 := by simpa [hvz_eq] using hzero + exact ((_root_.Valuation.ne_zero_iff v).2 hx) hxzero + have hvz_lt_one : v z < (1 : WithZero (Multiplicative ℤ)) := by + simpa [hvz_eq] using hvx_lt_one + have hzval_eq : + (ofWithZeroValuation v).val (Units.mk0 z hz) = + (ofWithZeroValuation v).val (Units.mk0 x hx) := + ofWithZeroValuation_val_eq_of_valuation_eq v hvz_eq + have hthreshold_z : + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 z hz) : ℚ) := by + rw [hzval_eq] + exact hthreshold + have hlog_tail : + v (logOnePlusSeriesFieldOfWithZeroValuation v z hnKlog - z) < + v x := by + have htail : + v (logOnePlusSeriesFieldOfWithZeroValuation v z hnKlog - z) < + v z := + valuation_logHigherTailField_lt_self_of_scaled_inv_sub_one_lt + (v := v) (p := p) e (x := z) hz hnKlog hnvalLog hvz_lt_one + hthreshold_z hcomplete + simpa [hvz_eq] using htail + have hexp_tail : + v (z - x) < v x := by + simpa [z] using + valuation_expSeriesHigherTailField_lt_self_of_scaled_inv_sub_one_lt + (v := v) (p := p) e (x := x) hx hnKexp hnvalExp hthreshold + hcomplete + have hsplit : + logOnePlusSeriesFieldOfWithZeroValuation v z hnKlog - x = + (logOnePlusSeriesFieldOfWithZeroValuation v z hnKlog - z) + + (z - x) := by + abel + rw [show + logOnePlusSeriesFieldOfWithZeroValuation v + (expSeriesFieldOfWithZeroValuation v x hnKexp - 1) hnKlog - x = + logOnePlusSeriesFieldOfWithZeroValuation v z hnKlog - x by + simp [z]] + rw [hsplit] + exact v.map_add_lt hlog_tail hexp_tail + +/-- Above the ramified threshold, the composite `exp(log(1+x)) - 1` is +congruent to `x` to strictly higher valuation. This is the principal-unit +side first-order inverse estimate. -/ +theorem valuation_exp_log_sub_self_lt_of_scaled_threshold + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) {x : K} (hx : x ≠ 0) + (hnKlog : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hnKexp : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + (hthreshold : + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + v (expSeriesFieldOfWithZeroValuation v + (logOnePlusSeriesFieldOfWithZeroValuation v x hnKlog) hnKexp - + 1 - x) < + v x := by + let y : K := logOnePlusSeriesFieldOfWithZeroValuation v x hnKlog + have hp_sub_pos : 0 < ((p : ℚ) - 1) := by + have hp_two : (2 : ℕ) ≤ p := (Fact.out : Nat.Prime p).two_le + have hp_two_rat : (2 : ℚ) ≤ (p : ℚ) := by exact_mod_cast hp_two + linarith + have hthreshold_nonneg : + 0 ≤ (e : ℚ) / ((p : ℚ) - 1) := + div_nonneg (Nat.cast_nonneg e) hp_sub_pos.le + have hxval_pos_rat : + (0 : ℚ) < ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ) := + lt_of_le_of_lt hthreshold_nonneg hthreshold + have hxval_pos : + 0 < (ofWithZeroValuation v).val (Units.mk0 x hx) := by + exact_mod_cast hxval_pos_rat + have hvx_lt_one : + v x < (1 : WithZero (Multiplicative ℤ)) := + valuation_lt_one_of_ofWithZeroValuation_val_pos v (Units.mk0 x hx) + hxval_pos + have hvy_eq : + v y = v x := by + simpa [y] using + valuation_logOnePlusSeriesField_eq_self_of_scaled_inv_sub_one_lt + (v := v) (p := p) e (x := x) hx hnKlog hnvalLog hvx_lt_one + hthreshold hcomplete + have hy : y ≠ 0 := by + intro hy0 + have hzero : v y = 0 := by simp [hy0] + have hxzero : v x = 0 := by simpa [hvy_eq] using hzero + exact ((_root_.Valuation.ne_zero_iff v).2 hx) hxzero + have hyval_eq : + (ofWithZeroValuation v).val (Units.mk0 y hy) = + (ofWithZeroValuation v).val (Units.mk0 x hx) := + ofWithZeroValuation_val_eq_of_valuation_eq v hvy_eq + have hthreshold_y : + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 y hy) : ℚ) := by + rw [hyval_eq] + exact hthreshold + have hexp_tail : + v (expSeriesFieldOfWithZeroValuation v y hnKexp - 1 - y) < + v x := by + have htail : + v (expSeriesFieldOfWithZeroValuation v y hnKexp - 1 - y) < + v y := + valuation_expSeriesHigherTailField_lt_self_of_scaled_inv_sub_one_lt + (v := v) (p := p) e (x := y) hy hnKexp hnvalExp hthreshold_y + hcomplete + simpa [hvy_eq] using htail + have hlog_tail : + v (y - x) < v x := by + simpa [y] using + valuation_logHigherTailField_lt_self_of_scaled_inv_sub_one_lt + (v := v) (p := p) e (x := x) hx hnKlog hnvalLog hvx_lt_one + hthreshold hcomplete + have hsplit : + expSeriesFieldOfWithZeroValuation v y hnKexp - 1 - x = + (expSeriesFieldOfWithZeroValuation v y hnKexp - 1 - y) + + (y - x) := by + abel + rw [show + expSeriesFieldOfWithZeroValuation v + (logOnePlusSeriesFieldOfWithZeroValuation v x hnKlog) hnKexp - + 1 - x = + expSeriesFieldOfWithZeroValuation v y hnKexp - 1 - x by + simp [y]] + rw [hsplit] + exact v.map_add_lt hexp_tail hlog_tail + +/-- On the normalized convergence ball, `exp(x) - 1` is nonzero whenever the +input is nonzero. This is the kernel-preparation form of the first-term +dominance estimate. -/ +theorem expSeriesField_sub_one_ne_zero_ofWithZeroValuation_of_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + expSeriesFieldOfWithZeroValuation v x hnK - 1 ≠ 0 := by + intro hzero + have hv : + v (expSeriesFieldOfWithZeroValuation v x hnK - 1) = v x := + valuation_expSeriesField_sub_one_eq_self_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) (x := x) hx hnK hnval hvx hcomplete + rw [hzero, map_zero] at hv + exact ((_root_.Valuation.ne_zero_iff v).2 hx) hv.symm + +/-- On the normalized convergence ball, the field exponential has trivial +kernel at the identity. -/ +theorem expSeriesField_eq_one_iff_ofWithZeroValuation_of_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] {x : K} + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + expSeriesFieldOfWithZeroValuation v x hnK = 1 ↔ x = 0 := by + constructor + · intro h + by_contra hx + exact + (expSeriesField_sub_one_ne_zero_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) (x := x) hx hnK hnval hvx hcomplete) + (sub_eq_zero.mpr h) + · intro hx + subst x + simp + +/-- The exponential-series value itself has valuation one on the normalized +convergence radius. This is the field-side unit statement used by the +principal-unit exponential. -/ +theorem valuation_expSeriesField_eq_one_ofWithZeroValuation_of_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + v (expSeriesFieldOfWithZeroValuation v x hnK) = + (1 : WithZero (Multiplicative ℤ)) := by + have htail : + v (expSeriesFieldOfWithZeroValuation v x hnK - 1) < + (1 : WithZero (Multiplicative ℤ)) := + valuation_expSeriesField_sub_one_lt_one_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) x hnK hnval hvx hcomplete + have hrewrite : + expSeriesFieldOfWithZeroValuation v x hnK = + 1 + (expSeriesFieldOfWithZeroValuation v x hnK - 1) := by + abel + rw [hrewrite] + exact v.map_one_add_of_lt htail + +/-- The logarithm-series for the product argument +`(1 + x) * (1 + y) - 1 = x + y + x*y` has the expected topological sum. -/ +theorem hasSum_signedLogSeriesTermField_logOnePlusSeriesField_mul_argument + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x y : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hvy : v y < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum (fun n : ℕ => signedLogSeriesTermField (x + y + x * y) hnK n) + (logOnePlusSeriesFieldOfWithZeroValuation v (x + y + x * y) hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have harg : + v (x + y + x * y) < (1 : WithZero (Multiplicative ℤ)) := + valuation_log_mul_argument_lt_one_of_lt_one v hvx hvy + exact + hasSum_signedLogSeriesTermField_logOnePlusSeriesField_ofWithZeroValuation_of_lt_one + (v := v) (p := p) (x + y + x * y) hnK hnval harg hcomplete + +/-- Finite logarithm polynomials for the product argument converge to the +corresponding logarithm-series value. -/ +theorem tendsto_logOnePlusPartialSumField_mul_argument + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x y : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hvy : v y < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun N : ℕ => logOnePlusPartialSumField (x + y + x * y) hnK N) + atTop + (𝓝 (logOnePlusSeriesFieldOfWithZeroValuation v + (x + y + x * y) hnK)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hsum := + hasSum_signedLogSeriesTermField_logOnePlusSeriesField_mul_argument + (v := v) (p := p) x y hnK hnval hvx hvy hcomplete + simpa [logOnePlusPartialSumField] using hsum.tendsto_sum_nat + +/-- Product-argument side of the two-variable logarithm formula, arranged as +an outer sum over logarithm degrees and a finite inner monomial sum for each +degree. The remaining summability hypothesis is exactly the Tonelli/Fubini +input needed before identifying this sigma-indexed family with the substituted +two-variable power-series coefficients. -/ +theorem hasSum_formalLogOnePlusProductArgument_logDegree_monomialValue_pair_sigma_of_summable + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x y : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hvy : v y < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (hsigma : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Summable + (fun qd : Sigma fun _ : ℕ => Fin 2 →₀ ℕ => + PowerSeries.coeff qd.1 (PowerSeries.log K) * + MvPowerSeries.coeff qd.2 + ((formalLogOnePlusProductArgument K) ^ qd.1) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) qd.2)) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum + (fun qd : Sigma fun _ : ℕ => Fin 2 →₀ ℕ => + PowerSeries.coeff qd.1 (PowerSeries.log K) * + MvPowerSeries.coeff qd.2 + ((formalLogOnePlusProductArgument K) ^ qd.1) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) qd.2) + (logOnePlusSeriesFieldOfWithZeroValuation v (x + y + x * y) hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have harg : + v (x + y + x * y) < (1 : WithZero (Multiplicative ℤ)) := + valuation_log_mul_argument_lt_one_of_lt_one v hvx hvy + have houter : + HasSum + (fun q : ℕ => + PowerSeries.coeff q (PowerSeries.log K) * + (x + y + x * y) ^ q) + (logOnePlusSeriesFieldOfWithZeroValuation v + (x + y + x * y) hnK) := + hasSum_powerSeries_log_eval_nat_logOnePlusSeriesField + (v := v) (p := p) (x + y + x * y) hnK hnval harg hcomplete + have hinner : + ∀ q : ℕ, + HasSum + (fun d : Fin 2 →₀ ℕ => + PowerSeries.coeff q (PowerSeries.log K) * + MvPowerSeries.coeff d + ((formalLogOnePlusProductArgument K) ^ q) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d) + (PowerSeries.coeff q (PowerSeries.log K) * + (x + y + x * y) ^ q) := by + intro q + exact + hasSum_formalLogOnePlusProductArgument_pow_monomialValue_pair_mul_left + K (PowerSeries.coeff q (PowerSeries.log K)) x y q + exact HasSum.sigma_of_hasSum houter hinner hsigma + +/-- The complete-DVF package attached to a standard `ℤᵐ⁰`-valued complete +discrete valuation. -/ +def completeDVFOfWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] : + CompleteDVF.{u, 0} K where + ValueGroup := WithZero (Multiplicative ℤ) + valuation := v + instCompleteDiscrete := inferInstance + +/-- For a normalized `ℤᵐ⁰`-valued complete DVF, an integer-valuation lower +bound gives membership in the corresponding maximal-ideal power. -/ +theorem mem_maximalIdeal_pow_ofWithZeroValuation_val_ge + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (n : ℕ) (a : (completeDVFOfWithZeroValuation v).valuationSubring) + (hval : ∀ ha : (a : K) ≠ 0, + (n : ℤ) ≤ + (ofWithZeroValuation v).val (Units.mk0 (a : K) ha)) : + a ∈ (completeDVFOfWithZeroValuation v).maximalIdeal ^ n := by + by_cases ha0 : (a : K) = 0 + · have ha_zero : a = 0 := Subtype.ext ha0 + simp [ha_zero] + · have hπpow : + v (π : K) ^ n = + WithZero.exp (-(n : ℤ)) := by + rw [hπval, ← WithZero.exp_nsmul] + simp + have hlog : + WithZero.log (v (a : K)) ≤ -(n : ℤ) := by + have hNlog : + (n : ℤ) ≤ -WithZero.log (v (a : K)) := by + simpa [ofWithZeroValuation_val] using hval ha0 + linarith + have hva : + v (a : K) ≤ WithZero.exp (-(n : ℤ)) := + WithZero.le_exp_of_log_le hlog + exact + (mem_maximalIdeal_pow_iff_valuation_le_uniformizer_pow + (val := v) hπ n (x := a)).2 (by + change v (a : K) ≤ v ((π : K) ^ n) + rw [map_pow, hπpow] + exact hva) + +/-- A strict integer-valuation lower bound by `n` gives membership in the +next maximal-ideal power. -/ +theorem mem_maximalIdeal_pow_succ_ofWithZeroValuation_val_gt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (n : ℕ) (a : (completeDVFOfWithZeroValuation v).valuationSubring) + (hval : ∀ ha : (a : K) ≠ 0, + (n : ℤ) < + (ofWithZeroValuation v).val (Units.mk0 (a : K) ha)) : + a ∈ (completeDVFOfWithZeroValuation v).maximalIdeal ^ (n + 1) := by + apply + mem_maximalIdeal_pow_ofWithZeroValuation_val_ge + (v := v) (π := π) hπ hπval (n + 1) a + intro ha + have hgt := hval ha + omega + +/-- Conversely, membership in `m^n` gives the expected lower bound for the +attached integer valuation. -/ +theorem ofWithZeroValuation_val_ge_of_mem_maximalIdeal_pow + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (n : ℕ) (a : (completeDVFOfWithZeroValuation v).valuationSubring) + (ha : a ∈ (completeDVFOfWithZeroValuation v).maximalIdeal ^ n) + (ha_ne : (a : K) ≠ 0) : + (n : ℤ) ≤ + (ofWithZeroValuation v).val (Units.mk0 (a : K) ha_ne) := by + have hπpow : + v (π : K) ^ n = + WithZero.exp (-(n : ℤ)) := by + rw [hπval, ← WithZero.exp_nsmul] + simp + have hva : + v (a : K) ≤ WithZero.exp (-(n : ℤ)) := by + have h := + (mem_maximalIdeal_pow_iff_valuation_le_uniformizer_pow + (val := v) hπ n (x := a)).1 ha + change v (a : K) ≤ v ((π : K) ^ n) at h + rw [map_pow, hπpow] at h + exact h + have hv_ne : v (a : K) ≠ 0 := + (_root_.Valuation.ne_zero_iff v).2 ha_ne + have hlog : + WithZero.log (v (a : K)) ≤ -(n : ℤ) := + (WithZero.log_le_iff_le_exp hv_ne).2 hva + have hneg : + (n : ℤ) ≤ -WithZero.log (v (a : K)) := by + simpa using (neg_le_neg hlog) + simpa [ofWithZeroValuation_val] using hneg + +/-- If `a ∈ m^n` lies above the ramified threshold, then the first composite +`log(exp(a))` is congruent to `a` modulo `m^(n+1)`. -/ +theorem logOnePlusSeries_expSeries_sub_self_mem_maximalIdeal_pow_succ_of_mem_maximalIdeal_pow + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnKexp : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hnKlog : ∀ m : ℕ, (((m + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ m : ℕ, + v (((m + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (m + 1) : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (a b : (completeDVFOfWithZeroValuation v).valuationSubring) + (ha : a ∈ (completeDVFOfWithZeroValuation v).maximalIdeal ^ n) + (hb : (b : K) = + logOnePlusSeriesFieldOfWithZeroValuation v + (expSeriesFieldOfWithZeroValuation v (a : K) hnKexp - 1) hnKlog - + (a : K)) : + b ∈ (completeDVFOfWithZeroValuation v).maximalIdeal ^ (n + 1) := by + let F : CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v + let x : K := (a : K) + apply + mem_maximalIdeal_pow_succ_ofWithZeroValuation_val_gt + (v := v) (π := π) hπ hπval n b + intro hbne + by_cases hx : x = 0 + · have hbzero : (b : K) = 0 := by + rw [hb] + simp [x, hx] + exact False.elim (hbne hbzero) + · have hge : + (n : ℤ) ≤ + (ofWithZeroValuation v).val (Units.mk0 x hx) := by + simpa [F, x] using + ofWithZeroValuation_val_ge_of_mem_maximalIdeal_pow + (v := v) (π := π) hπ hπval n (a := a) ha hx + have hthreshold : + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ) := by + exact lt_of_lt_of_le hlevel (by exact_mod_cast hge) + have hlt : + v (logOnePlusSeriesFieldOfWithZeroValuation v + (expSeriesFieldOfWithZeroValuation v x hnKexp - 1) hnKlog - x) < + v x := + valuation_log_exp_sub_self_lt_of_scaled_threshold + (v := v) (p := p) e (x := x) hx hnKexp hnvalExp hnKlog + hnvalLog hthreshold hcomplete + have hb_lt : v (b : K) < v x := by + simpa [x, hb] using hlt + have hval_lt : + (ofWithZeroValuation v).val (Units.mk0 x hx) < + (ofWithZeroValuation v).val (Units.mk0 (b : K) hbne) := + ofWithZeroValuation_val_lt_of_valuation_lt + (v := v) (x := Units.mk0 x hx) (y := Units.mk0 (b : K) hbne) + hb_lt + exact lt_of_le_of_lt hge hval_lt + +/-- If `a ∈ m^n` lies above the ramified threshold, then the second composite +`exp(log(1+a)) - 1` is congruent to `a` modulo `m^(n+1)`. -/ +theorem + expSeries_logOnePlusSeries_sub_one_sub_self_mem_maximalIdeal_pow_succ_of_mem_maximalIdeal_pow + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnKlog : ∀ m : ℕ, (((m + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ m : ℕ, + v (((m + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (m + 1) : ℤ)))) + (hnKexp : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (a b : (completeDVFOfWithZeroValuation v).valuationSubring) + (ha : a ∈ (completeDVFOfWithZeroValuation v).maximalIdeal ^ n) + (hb : (b : K) = + expSeriesFieldOfWithZeroValuation v + (logOnePlusSeriesFieldOfWithZeroValuation v (a : K) hnKlog) hnKexp - + 1 - (a : K)) : + b ∈ (completeDVFOfWithZeroValuation v).maximalIdeal ^ (n + 1) := by + let F : CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v + let x : K := (a : K) + apply + mem_maximalIdeal_pow_succ_ofWithZeroValuation_val_gt + (v := v) (π := π) hπ hπval n b + intro hbne + by_cases hx : x = 0 + · have hbzero : (b : K) = 0 := by + rw [hb] + simp [x, hx] + exact False.elim (hbne hbzero) + · have hge : + (n : ℤ) ≤ + (ofWithZeroValuation v).val (Units.mk0 x hx) := by + simpa [F, x] using + ofWithZeroValuation_val_ge_of_mem_maximalIdeal_pow + (v := v) (π := π) hπ hπval n (a := a) ha hx + have hthreshold : + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ) := by + exact lt_of_lt_of_le hlevel (by exact_mod_cast hge) + have hlt : + v (expSeriesFieldOfWithZeroValuation v + (logOnePlusSeriesFieldOfWithZeroValuation v x hnKlog) hnKexp - + 1 - x) < + v x := + valuation_exp_log_sub_self_lt_of_scaled_threshold + (v := v) (p := p) e (x := x) hx hnKlog hnvalLog hnKexp + hnvalExp hthreshold hcomplete + have hb_lt : v (b : K) < v x := by + simpa [x, hb] using hlt + have hval_lt : + (ofWithZeroValuation v).val (Units.mk0 x hx) < + (ofWithZeroValuation v).val (Units.mk0 (b : K) hbne) := + ofWithZeroValuation_val_lt_of_valuation_lt + (v := v) (x := Units.mk0 x hx) (y := Units.mk0 (b : K) hbne) + hb_lt + exact lt_of_le_of_lt hge hval_lt + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/LogConvergence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/LogConvergence.lean new file mode 100644 index 0000000000..550c1da1c2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/LogConvergence.lean @@ -0,0 +1,1156 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Topology.Algebra.InfiniteSum.Nonarchimedean +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.ExpConvergence +/-! +Establishes convergence and summability of the logarithm series on the nonarchimedean open unit +ball. +-/ + +@[expose] public section + +open Filter +open Polynomial +open scoped Topology +open scoped PowerSeries.WithPiTopology +noncomputable +section + +attribute [local instance] Classical.propDecidable + +universe u + +open ValuationTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +variable {K : Type u} [Field K] + +/-- A summable logarithm series splits into its first term and the remaining +tail. This is the algebraic first-term extraction used before proving the +logarithm identities. -/ +theorem logOnePlusSeriesField_eq_self_add_tsum_succ_of_summable + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) (x : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hs : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Summable (fun n : ℕ => signedLogSeriesTermField x hnK n)) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + logOnePlusSeriesFieldOfWithZeroValuation v x hnK = + x + ∑' n : ℕ, signedLogSeriesTermField x hnK (n + 1) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hs' : Summable (fun n : ℕ => signedLogSeriesTermField x hnK n) := hs + calc + logOnePlusSeriesFieldOfWithZeroValuation v x hnK = + ∑' n : ℕ, signedLogSeriesTermField x hnK n := by + rfl + _ = signedLogSeriesTermField x hnK 0 + + ∑' n : ℕ, signedLogSeriesTermField x hnK (n + 1) := + hs'.tsum_eq_zero_add + _ = x + ∑' n : ℕ, signedLogSeriesTermField x hnK (n + 1) := by + simp + +/-- A summable exponential series splits into the constant term `1` and the +positive-degree tail. -/ +theorem expSeriesField_eq_one_add_tsum_succ_of_summable + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hs : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Summable (fun n : ℕ => expSeriesTermField x hnK n)) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + expSeriesFieldOfWithZeroValuation v x hnK = + 1 + ∑' n : ℕ, expSeriesTermField x hnK (n + 1) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hs' : Summable (fun n : ℕ => expSeriesTermField x hnK n) := hs + calc + expSeriesFieldOfWithZeroValuation v x hnK = + ∑' n : ℕ, expSeriesTermField x hnK n := by + rfl + _ = expSeriesTermField x hnK 0 + + ∑' n : ℕ, expSeriesTermField x hnK (n + 1) := + hs'.tsum_eq_zero_add + _ = 1 + ∑' n : ℕ, expSeriesTermField x hnK (n + 1) := by + simp + +/-- Establishes the identity `logSeriesTermField x hnK n = 0`. -/ +theorem logSeriesTermField_eq_zero_of_eq_zero + {x : K} (hx : x = 0) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (n : ℕ) : + logSeriesTermField x hnK n = 0 := by + have hpow : (0 : K) ^ (n + 1) = 0 := by + cases n with + | zero => simp + | succ n => simp + simp [logSeriesTermField, hx, hpow] + +/-- Establishes the identity `signedLogSeriesTermField x hnK n = 0`. -/ +theorem signedLogSeriesTermField_eq_zero_of_eq_zero + {x : K} (hx : x = 0) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (n : ℕ) : + signedLogSeriesTermField x hnK n = 0 := by + simp [signedLogSeriesTermField, + logSeriesTermField_eq_zero_of_eq_zero hx hnK n] + +/-- Establishes the identity `logOnePlusSeriesFieldOfWithZeroValuation v 0 hnK = 0`. -/ +@[simp] theorem logOnePlusSeriesField_zero_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) : + logOnePlusSeriesFieldOfWithZeroValuation v 0 hnK = 0 := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hzero : + (fun n : ℕ => signedLogSeriesTermField (0 : K) hnK n) = + fun _ : ℕ => (0 : K) := by + funext n + exact signedLogSeriesTermField_eq_zero_of_eq_zero rfl hnK n + simp [logOnePlusSeriesFieldOfWithZeroValuation, hzero] + +/-- Field-element logarithm-series terms tend to zero when `v x < 1`. This is +the principal-unit form of the convergence estimate: unlike the unit-valued +version, it also covers `x = 0`. -/ +theorem tendsto_zero_logSeriesTermField_ofWithZeroValuation_of_lt_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto (fun n : ℕ => logSeriesTermField x hnK n) atTop + (𝓝 (0 : K)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + by_cases hx : x = 0 + · have hconst : + (fun n : ℕ => logSeriesTermField x hnK n) = + fun _ : ℕ => (0 : K) := by + funext n + exact logSeriesTermField_eq_zero_of_eq_zero hx hnK n + simp [hconst] + · have hxpos : + 0 < (ofWithZeroValuation v).val (Units.mk0 x hx) := + ofWithZeroValuation_val_mk0_pos_of_lt_one (v := v) hx hvx + have hunit := + tendsto_zero_log_term_ofWithZeroValuation_of_pos + (v := v) (p := p) (Units.mk0 x hx) hnK hnval hxpos + simpa [logSeriesTermField, logSeriesTerm] using hunit + +/-- Signed field-element logarithm-series terms tend to zero when `v x < 1`. -/ +theorem tendsto_zero_signedLogSeriesTermField_ofWithZeroValuation_of_lt_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto (fun n : ℕ => signedLogSeriesTermField x hnK n) atTop + (𝓝 (0 : K)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + by_cases hx : x = 0 + · have hconst : + (fun n : ℕ => signedLogSeriesTermField x hnK n) = + fun _ : ℕ => (0 : K) := by + funext n + exact signedLogSeriesTermField_eq_zero_of_eq_zero hx hnK n + simp [hconst] + · have hxpos : + 0 < (ofWithZeroValuation v).val (Units.mk0 x hx) := + ofWithZeroValuation_val_mk0_pos_of_lt_one (v := v) hx hvx + have hunit := + tendsto_zero_signed_log_term_ofWithZeroValuation_of_pos + (v := v) (p := p) (Units.mk0 x hx) hnK hnval hxpos + simpa [signedLogSeriesTermField, logSeriesTermField] using hunit + +/-- In a complete nonarchimedean valuation topology, the field-element +logarithm-series terms are summable under the principal-unit condition +`v x < 1`. -/ +theorem summable_logSeriesTermField_ofWithZeroValuation_of_lt_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Summable (fun n : ℕ => logSeriesTermField x hnK n) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let : CompleteSpace K := hcomplete + have : NonarchimedeanRing K := nonarchimedeanRing_ofWithZeroValuation v + have hzero : + Tendsto (fun n : ℕ => logSeriesTermField x hnK n) atTop + (𝓝 (0 : K)) := + tendsto_zero_logSeriesTermField_ofWithZeroValuation_of_lt_one + (v := v) (p := p) x hnK hnval hvx + have hcofinite : + Tendsto (fun n : ℕ => logSeriesTermField x hnK n) cofinite + (𝓝 (0 : K)) := by + simpa [Nat.cofinite_eq_atTop] using hzero + rw [NonarchimedeanAddGroup.summable_iff_tendsto_cofinite_zero] + exact hcofinite + +/-- Summability of the signed field-element logarithm series under the +principal-unit condition `v x < 1`. -/ +theorem summable_signedLogSeriesTermField_ofWithZeroValuation_of_lt_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Summable (fun n : ℕ => signedLogSeriesTermField x hnK n) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let : CompleteSpace K := hcomplete + have : NonarchimedeanRing K := nonarchimedeanRing_ofWithZeroValuation v + have hzero : + Tendsto (fun n : ℕ => signedLogSeriesTermField x hnK n) atTop + (𝓝 (0 : K)) := + tendsto_zero_signedLogSeriesTermField_ofWithZeroValuation_of_lt_one + (v := v) (p := p) x hnK hnval hvx + have hcofinite : + Tendsto (fun n : ℕ => signedLogSeriesTermField x hnK n) cofinite + (𝓝 (0 : K)) := by + simpa [Nat.cofinite_eq_atTop] using hzero + rw [NonarchimedeanAddGroup.summable_iff_tendsto_cofinite_zero] + exact hcofinite + +/-- Field-element principal-unit logarithm series: the signed series has the +value supplied by `logOnePlusSeriesFieldOfWithZeroValuation`. -/ +theorem hasSum_signedLogSeriesTermField_logOnePlusSeriesField_ofWithZeroValuation_of_lt_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum (fun n : ℕ => signedLogSeriesTermField x hnK n) + (logOnePlusSeriesFieldOfWithZeroValuation v x hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hs : + Summable (fun n : ℕ => signedLogSeriesTermField x hnK n) := + summable_signedLogSeriesTermField_ofWithZeroValuation_of_lt_one + (v := v) (p := p) x hnK hnval hvx hcomplete + simpa [logOnePlusSeriesFieldOfWithZeroValuation] using hs.hasSum + +/-- The formal power series `log(1+X)`, evaluated term by term at a +principal-unit parameter `x`, has sum equal to the local logarithm series. -/ +theorem hasSum_powerSeries_log_eval_logOnePlusSeriesField + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum + (fun n : ℕ => + PowerSeries.coeff (n + 1) (PowerSeries.log K) * + x ^ (n + 1)) + (logOnePlusSeriesFieldOfWithZeroValuation v x hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hsum := + hasSum_signedLogSeriesTermField_logOnePlusSeriesField_ofWithZeroValuation_of_lt_one + (v := v) (p := p) x hnK hnval hvx hcomplete + exact hsum.congr_fun fun n => + powerSeries_log_coeff_mul_pow_eq_signedLogSeriesTermField + (K := K) x hnK n + +/-- The one-variable formal logarithm, including the zero coefficient, has +the same field-valued sum as the local logarithm series. -/ +theorem hasSum_powerSeries_log_eval_nat_logOnePlusSeriesField + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum + (fun n : ℕ => + PowerSeries.coeff n (PowerSeries.log K) * x ^ n) + (logOnePlusSeriesFieldOfWithZeroValuation v x hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let f : ℕ → K := fun n => + PowerSeries.coeff n (PowerSeries.log K) * x ^ n + have htail : + HasSum (fun n : ℕ => f (n + 1)) + (logOnePlusSeriesFieldOfWithZeroValuation v x hnK) := by + simpa only [f] using + hasSum_powerSeries_log_eval_logOnePlusSeriesField + (v := v) (p := p) x hnK hnval hvx hcomplete + have hfull := + (hasSum_nat_add_iff + (f := f) + (g := logOnePlusSeriesFieldOfWithZeroValuation v x hnK) 1).1 htail + simpa [f, PowerSeries.coeff_log] using hfull + +/-- The left-axis part of the two-variable product-formula right side sums +to the field logarithm of the left input. -/ +theorem hasSum_formalLogOnePlusLeftVariableLogSubst_monomialValue_pair + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x y : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum + (fun d : Fin 2 →₀ ℕ => + MvPowerSeries.coeff d (formalLogOnePlusLeftVariableLogSubst K) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d) + (logOnePlusSeriesFieldOfWithZeroValuation v x hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let term : (Fin 2 →₀ ℕ) → K := fun d => + MvPowerSeries.coeff d (formalLogOnePlusLeftVariableLogSubst K) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d + let axis : ℕ → (Fin 2 →₀ ℕ) := fun n => Finsupp.single (0 : Fin 2) n + have haxis_inj : Function.Injective axis := by + intro m n h + have hcoord := congrArg (fun d : Fin 2 →₀ ℕ => d (0 : Fin 2)) h + simpa [axis] using hcoord + have haxis : + HasSum (term ∘ axis) + (logOnePlusSeriesFieldOfWithZeroValuation v x hnK) := by + refine + (hasSum_powerSeries_log_eval_nat_logOnePlusSeriesField + (v := v) (p := p) x hnK hnval hvx hcomplete).congr_fun ?_ + intro n + simp [term, axis, formalLogOnePlusLeftVariableLogSubst_coeff_single, + mvPowerSeriesMonomialValue] + have hout : ∀ d, d ∉ Set.range axis → term d = 0 := by + intro d hd + have hne : ∀ n : ℕ, d ≠ Finsupp.single (0 : Fin 2) n := by + intro n h + exact hd ⟨n, by simpa [axis] using h.symm⟩ + simp [term, formalLogOnePlusLeftVariableLogSubst_coeff_of_ne_axis K d hne] + exact (haxis_inj.hasSum_iff (f := term) hout).1 haxis + +/-- The right-axis part of the two-variable product-formula right side sums +to the field logarithm of the right input. -/ +theorem hasSum_formalLogOnePlusRightVariableLogSubst_monomialValue_pair + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x y : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvy : v y < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum + (fun d : Fin 2 →₀ ℕ => + MvPowerSeries.coeff d (formalLogOnePlusRightVariableLogSubst K) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d) + (logOnePlusSeriesFieldOfWithZeroValuation v y hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let term : (Fin 2 →₀ ℕ) → K := fun d => + MvPowerSeries.coeff d (formalLogOnePlusRightVariableLogSubst K) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d + let axis : ℕ → (Fin 2 →₀ ℕ) := fun n => Finsupp.single (1 : Fin 2) n + have haxis_inj : Function.Injective axis := by + intro m n h + have hcoord := congrArg (fun d : Fin 2 →₀ ℕ => d (1 : Fin 2)) h + simpa [axis] using hcoord + have haxis : + HasSum (term ∘ axis) + (logOnePlusSeriesFieldOfWithZeroValuation v y hnK) := by + refine + (hasSum_powerSeries_log_eval_nat_logOnePlusSeriesField + (v := v) (p := p) y hnK hnval hvy hcomplete).congr_fun ?_ + intro n + simp [term, axis, formalLogOnePlusRightVariableLogSubst_coeff_single, + mvPowerSeriesMonomialValue] + have hout : ∀ d, d ∉ Set.range axis → term d = 0 := by + intro d hd + have hne : ∀ n : ℕ, d ≠ Finsupp.single (1 : Fin 2) n := by + intro n h + exact hd ⟨n, by simpa [axis] using h.symm⟩ + simp [term, formalLogOnePlusRightVariableLogSubst_coeff_of_ne_axis K d hne] + exact (haxis_inj.hasSum_iff (f := term) hout).1 haxis + +/-- The right-hand side `log(1+X)+log(1+Y)` of the formal product formula, +read as a field-valued monomial sum at `(x,y)`, sums to +`log(1+x)+log(1+y)`. -/ +theorem hasSum_formalLogOnePlusProductRightSide_monomialValue_pair + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x y : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hvy : v y < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum + (fun d : Fin 2 →₀ ℕ => + MvPowerSeries.coeff d (formalLogOnePlusProductRightSide K) * + mvPowerSeriesMonomialValue + (fun i : Fin 2 => if i = 0 then x else y) d) + (logOnePlusSeriesFieldOfWithZeroValuation v x hnK + + logOnePlusSeriesFieldOfWithZeroValuation v y hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hleft := + hasSum_formalLogOnePlusLeftVariableLogSubst_monomialValue_pair + (v := v) (p := p) x y hnK hnval hvx hcomplete + have hright := + hasSum_formalLogOnePlusRightVariableLogSubst_monomialValue_pair + (v := v) (p := p) x y hnK hnval hvy hcomplete + refine (hleft.add hright).congr_fun ?_ + intro d + rw [formalLogOnePlusProductRightSide_coeff] + ring + +/-- The field-element finite logarithm polynomials converge to the +principal-unit logarithm-series value. -/ +theorem tendsto_logOnePlusPartialSumField_ofWithZeroValuation_of_lt_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto (fun N : ℕ => logOnePlusPartialSumField x hnK N) atTop + (𝓝 (logOnePlusSeriesFieldOfWithZeroValuation v x hnK)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hsum := + hasSum_signedLogSeriesTermField_logOnePlusSeriesField_ofWithZeroValuation_of_lt_one + (v := v) (p := p) x hnK hnval hvx hcomplete + simpa [logOnePlusPartialSumField] using hsum.tendsto_sum_nat + +/-- Signed field-element logarithm-series terms tend to zero under a +ramified denominator valuation hypothesis. -/ +theorem tendsto_zero_signedLogSeriesTermField_ofWithZeroValuation_scaled_of_lt_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto (fun n : ℕ => signedLogSeriesTermField x hnK n) atTop + (𝓝 (0 : K)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + by_cases hx : x = 0 + · have hconst : + (fun n : ℕ => signedLogSeriesTermField x hnK n) = + fun _ : ℕ => (0 : K) := by + funext n + exact signedLogSeriesTermField_eq_zero_of_eq_zero hx hnK n + simp [hconst] + · have hxpos : + 0 < (ofWithZeroValuation v).val (Units.mk0 x hx) := + ofWithZeroValuation_val_mk0_pos_of_lt_one (v := v) hx hvx + have hunit := + tendsto_zero_signed_log_term_ofWithZeroValuation_scaled_of_pos + (v := v) (p := p) e (Units.mk0 x hx) hnK hnval hxpos + simpa [signedLogSeriesTermField, logSeriesTermField] using hunit + +/-- Summability of the signed field-element logarithm series under a +ramified denominator valuation hypothesis. -/ +theorem summable_signedLogSeriesTermField_ofWithZeroValuation_scaled_of_lt_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Summable (fun n : ℕ => signedLogSeriesTermField x hnK n) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let : CompleteSpace K := hcomplete + have : NonarchimedeanRing K := nonarchimedeanRing_ofWithZeroValuation v + have hzero : + Tendsto (fun n : ℕ => signedLogSeriesTermField x hnK n) atTop + (𝓝 (0 : K)) := + tendsto_zero_signedLogSeriesTermField_ofWithZeroValuation_scaled_of_lt_one + (v := v) (p := p) e x hnK hnval hvx + have hcofinite : + Tendsto (fun n : ℕ => signedLogSeriesTermField x hnK n) cofinite + (𝓝 (0 : K)) := by + simpa [Nat.cofinite_eq_atTop] using hzero + rw [NonarchimedeanAddGroup.summable_iff_tendsto_cofinite_zero] + exact hcofinite + +/-- Field-element logarithm series has the same `tsum` value under a +ramified denominator valuation hypothesis. -/ +theorem hasSum_signedLogSeriesTermField_logOnePlusSeriesField_ofWithZeroValuation_scaled_of_lt_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum (fun n : ℕ => signedLogSeriesTermField x hnK n) + (logOnePlusSeriesFieldOfWithZeroValuation v x hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hs : + Summable (fun n : ℕ => signedLogSeriesTermField x hnK n) := + summable_signedLogSeriesTermField_ofWithZeroValuation_scaled_of_lt_one + (v := v) (p := p) e x hnK hnval hvx hcomplete + simpa [logOnePlusSeriesFieldOfWithZeroValuation] using hs.hasSum + +/-- Field-element finite logarithm polynomials converge to the logarithm +series under a ramified denominator valuation hypothesis. -/ +theorem tendsto_logOnePlusPartialSumField_ofWithZeroValuation_scaled_of_lt_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto (fun N : ℕ => logOnePlusPartialSumField x hnK N) atTop + (𝓝 (logOnePlusSeriesFieldOfWithZeroValuation v x hnK)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hsum := + hasSum_signedLogSeriesTermField_logOnePlusSeriesField_ofWithZeroValuation_scaled_of_lt_one + (v := v) (p := p) e x hnK hnval hvx hcomplete + simpa [logOnePlusPartialSumField] using hsum.tendsto_sum_nat + +/-- Termwise addition of two convergent field-element logarithm series. This +is the right-hand analytic side of the product formula +`log((1 + x) * (1 + y)) = log(1 + x) + log(1 + y)`. -/ +theorem hasSum_signedLogSeriesTermField_add_logOnePlusSeriesField + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x y : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hvy : v y < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum + (fun n : ℕ => + signedLogSeriesTermField x hnK n + + signedLogSeriesTermField y hnK n) + (logOnePlusSeriesFieldOfWithZeroValuation v x hnK + + logOnePlusSeriesFieldOfWithZeroValuation v y hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + exact + (hasSum_signedLogSeriesTermField_logOnePlusSeriesField_ofWithZeroValuation_of_lt_one + (v := v) (p := p) x hnK hnval hvx hcomplete).add + (hasSum_signedLogSeriesTermField_logOnePlusSeriesField_ofWithZeroValuation_of_lt_one + (v := v) (p := p) y hnK hnval hvy hcomplete) + +/-- Finite logarithm polynomials for two inputs add term by term. -/ +theorem logOnePlusPartialSumField_add_eq_sum_add_terms + (x y : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (N : ℕ) : + logOnePlusPartialSumField x hnK N + + logOnePlusPartialSumField y hnK N = + ∑ n ∈ Finset.range N, + (signedLogSeriesTermField x hnK n + + signedLogSeriesTermField y hnK n) := by + simp [logOnePlusPartialSumField, Finset.sum_add_distrib] + +/-- The sum of two finite field logarithm polynomials converges to the sum of +their logarithm-series values. -/ +theorem tendsto_logOnePlusPartialSumField_add + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x y : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hvy : v y < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun N : ℕ => + logOnePlusPartialSumField x hnK N + + logOnePlusPartialSumField y hnK N) + atTop + (𝓝 (logOnePlusSeriesFieldOfWithZeroValuation v x hnK + + logOnePlusSeriesFieldOfWithZeroValuation v y hnK)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hx := + tendsto_logOnePlusPartialSumField_ofWithZeroValuation_of_lt_one + (v := v) (p := p) x hnK hnval hvx hcomplete + have hy := + tendsto_logOnePlusPartialSumField_ofWithZeroValuation_of_lt_one + (v := v) (p := p) y hnK hnval hvy hcomplete + exact hx.add hy + +/-- First-term extraction for the logarithm series on the principal-unit +convergence radius. -/ +theorem logOnePlusSeriesField_eq_self_add_tsum_succ_ofWithZeroValuation_of_lt_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + logOnePlusSeriesFieldOfWithZeroValuation v x hnK = + x + ∑' n : ℕ, signedLogSeriesTermField x hnK (n + 1) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + exact + logOnePlusSeriesField_eq_self_add_tsum_succ_of_summable v x hnK + (summable_signedLogSeriesTermField_ofWithZeroValuation_of_lt_one + (v := v) (p := p) x hnK hnval hvx hcomplete) + +/-- A field-element logarithm-series term is nonzero when the input is +nonzero. -/ +theorem logSeriesTermField_ne_zero_of_ne_zero + {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (n : ℕ) : + logSeriesTermField x hnK n ≠ 0 := by + have hpow : x ^ (n + 1) ≠ 0 := pow_ne_zero (n + 1) hx + have hden : + (((Units.mk0 (((n + 1 : ℕ) : K)) (hnK n) : Kˣ) : K) ≠ 0) := + (Units.mk0 (((n + 1 : ℕ) : K)) (hnK n)).ne_zero + simpa [logSeriesTermField] using div_ne_zero hpow hden + +/-- Above the usual `1/(p-1)` threshold, each higher logarithm term has +strictly smaller `ℤᵐ⁰`-value than the linear term. -/ +theorem valuation_logSeriesTermField_lt_self_of_inv_sub_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hthreshold : + 1 / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + {n : ℕ} (hn : n ≠ 0) : + v (logSeriesTermField x hnK n) < v x := by + let xu : Kˣ := Units.mk0 x hx + let denom : Kˣ := + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n) + have hval : + (ofWithZeroValuation v).val xu < + (ofWithZeroValuation v).val (xu ^ (n + 1) / denom) := by + change + (ofWithZeroValuation v).val xu < + (ofWithZeroValuation v).val + (xu ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n)) + rw [ofWithZeroValuation_val_pow_div_natCast + (v := v) (p := p) (n := n + 1) xu (hnK n) (hnval n)] + exact + log_higher_term_integer_valuation_gt + (p := p) (n := n + 1) (by omega) hthreshold + have hlt := + valuation_lt_of_ofWithZeroValuation_val_lt + (v := v) (x := xu) (y := xu ^ (n + 1) / denom) hval + simpa [xu, denom, logSeriesTermField] using hlt + +/-- The signed higher logarithm terms have the same valuation estimate as the +unsigned terms. -/ +theorem valuation_signedLogSeriesTermField_lt_self_of_inv_sub_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hthreshold : + 1 / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + {n : ℕ} (hn : n ≠ 0) : + v (signedLogSeriesTermField x hnK n) < v x := by + have hlog : + v (logSeriesTermField x hnK n) < v x := + valuation_logSeriesTermField_lt_self_of_inv_sub_one_lt + (v := v) (p := p) (x := x) hx hnK hnval hthreshold hn + have hval : + v (signedLogSeriesTermField x hnK n) = + v (logSeriesTermField x hnK n) := by + rw [signedLogSeriesTermField, v.map_mul] + simp + rw [hval] + exact hlog + +/-- Every finite higher-degree logarithm tail has valuation strictly smaller +than the linear term above the `1/(p-1)` threshold. -/ +theorem valuation_logHigherTailPartialSumField_lt_self_of_inv_sub_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hthreshold : + 1 / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + (N : ℕ) : + v (∑ n ∈ Finset.range N, signedLogSeriesTermField x hnK (n + 1)) < + v x := by + exact + v.map_sum_lt ((_root_.Valuation.ne_zero_iff v).2 hx) + (fun n _hn => + valuation_signedLogSeriesTermField_lt_self_of_inv_sub_one_lt + (v := v) (p := p) (x := x) hx hnK hnval hthreshold + (Nat.succ_ne_zero n)) + +/-- The higher-degree logarithm tail partial sums converge to +`log(1+x) - x`. -/ +theorem tendsto_logHigherTailPartialSumField_ofWithZeroValuation_of_lt_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun N : ℕ => + ∑ n ∈ Finset.range N, signedLogSeriesTermField x hnK (n + 1)) + atTop + (𝓝 (logOnePlusSeriesFieldOfWithZeroValuation v x hnK - x)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hfull : + Tendsto + (fun N : ℕ => logOnePlusPartialSumField x hnK (N + 1)) + atTop (𝓝 (logOnePlusSeriesFieldOfWithZeroValuation v x hnK)) := by + exact + (tendsto_logOnePlusPartialSumField_ofWithZeroValuation_of_lt_one + (v := v) (p := p) x hnK hnval hvx hcomplete).comp + (tendsto_add_atTop_nat 1) + have hsub : + Tendsto + (fun N : ℕ => logOnePlusPartialSumField x hnK (N + 1) - x) + atTop + (𝓝 (logOnePlusSeriesFieldOfWithZeroValuation v x hnK - x)) := + hfull.sub tendsto_const_nhds + have htail : + (fun N : ℕ => logOnePlusPartialSumField x hnK (N + 1) - x) = + fun N : ℕ => + ∑ n ∈ Finset.range N, signedLogSeriesTermField x hnK (n + 1) := by + funext N + rw [logOnePlusPartialSumField, Finset.sum_range_succ'] + simp + simpa [htail] using hsub + +/-- The full higher-degree logarithm tail has valuation strictly smaller than +the linear term above the `1/(p-1)` threshold. -/ +theorem valuation_logHigherTailField_lt_self_of_inv_sub_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hthreshold : + 1 / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + v (logOnePlusSeriesFieldOfWithZeroValuation v x hnK - x) < + v x := by + exact + valuation_limit_lt_of_tendsto_of_eventually_lt + (v := v) (γ := v x) ((_root_.Valuation.ne_zero_iff v).2 hx) + (tendsto_logHigherTailPartialSumField_ofWithZeroValuation_of_lt_one + (v := v) (p := p) x hnK hnval hvx hcomplete) + (Eventually.of_forall fun N => + valuation_logHigherTailPartialSumField_lt_self_of_inv_sub_one_lt + (v := v) (p := p) (x := x) hx hnK hnval hthreshold N) + +/-- Above the usual `1/(p-1)` threshold, `log(1+x)` has the same valuation as +the linear term `x`. -/ +theorem valuation_logOnePlusSeriesField_eq_self_of_inv_sub_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hthreshold : + 1 / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + v (logOnePlusSeriesFieldOfWithZeroValuation v x hnK) = v x := by + have htail : + v (logOnePlusSeriesFieldOfWithZeroValuation v x hnK - x) < + v x := + valuation_logHigherTailField_lt_self_of_inv_sub_one_lt + (v := v) (p := p) (x := x) hx hnK hnval hvx hthreshold hcomplete + have hsplit : + logOnePlusSeriesFieldOfWithZeroValuation v x hnK = + x + (logOnePlusSeriesFieldOfWithZeroValuation v x hnK - x) := by + abel + rw [hsplit] + exact v.map_add_eq_of_lt_left htail + +/-- Above the usual `1/(p-1)` threshold, `log(1 + x)` is nonzero for +nonzero `x`. -/ +theorem logOnePlusSeriesField_ne_zero_of_inv_sub_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hthreshold : + 1 / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + logOnePlusSeriesFieldOfWithZeroValuation v x hnK ≠ 0 := by + intro hzero + have hv : + v (logOnePlusSeriesFieldOfWithZeroValuation v x hnK) = v x := + valuation_logOnePlusSeriesField_eq_self_of_inv_sub_one_lt + (v := v) (p := p) (x := x) hx hnK hnval hvx hthreshold hcomplete + rw [hzero, map_zero] at hv + exact ((_root_.Valuation.ne_zero_iff v).2 hx) hv.symm + +/-- On any part of the open unit ball satisfying the `1/(p-1)` threshold away +from zero, the field logarithm has trivial kernel. -/ +theorem logOnePlusSeriesField_eq_zero_iff_of_inv_sub_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] {x : K} + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hthreshold : ∀ hx : x ≠ 0, + 1 / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + logOnePlusSeriesFieldOfWithZeroValuation v x hnK = 0 ↔ x = 0 := by + constructor + · intro hlog + by_contra hx + exact + (logOnePlusSeriesField_ne_zero_of_inv_sub_one_lt + (v := v) (p := p) (x := x) hx hnK hnval hvx (hthreshold hx) + hcomplete) hlog + · intro hx + subst x + simp + +/-- Above the ramified threshold `e/(p-1)`, each higher logarithm term has +strictly smaller `ℤᵐ⁰`-value than the linear term. -/ +theorem valuation_logSeriesTermField_lt_self_of_scaled_inv_sub_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hthreshold : + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + {n : ℕ} (hn : n ≠ 0) : + v (logSeriesTermField x hnK n) < v x := by + let xu : Kˣ := Units.mk0 x hx + let denom : Kˣ := + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n) + have hval : + (ofWithZeroValuation v).val xu < + (ofWithZeroValuation v).val (xu ^ (n + 1) / denom) := by + change + (ofWithZeroValuation v).val xu < + (ofWithZeroValuation v).val + (xu ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n)) + rw [ofWithZeroValuation_val_pow_div_natCast_scaled + (v := v) (p := p) (e := e) (n := n + 1) xu (hnK n) (hnval n)] + exact + log_higher_term_integer_valuation_gt_scaled + (p := p) (e := e) (n := n + 1) (by omega) hthreshold + have hlt := + valuation_lt_of_ofWithZeroValuation_val_lt + (v := v) (x := xu) (y := xu ^ (n + 1) / denom) hval + simpa [xu, denom, logSeriesTermField] using hlt + +/-- The signed higher logarithm terms have the same ramified valuation +estimate as the unsigned terms. -/ +theorem valuation_signedLogSeriesTermField_lt_self_of_scaled_inv_sub_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hthreshold : + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + {n : ℕ} (hn : n ≠ 0) : + v (signedLogSeriesTermField x hnK n) < v x := by + have hlog : + v (logSeriesTermField x hnK n) < v x := + valuation_logSeriesTermField_lt_self_of_scaled_inv_sub_one_lt + (v := v) (p := p) e (x := x) hx hnK hnval hthreshold hn + have hval : + v (signedLogSeriesTermField x hnK n) = + v (logSeriesTermField x hnK n) := by + rw [signedLogSeriesTermField, v.map_mul] + simp + rw [hval] + exact hlog + +/-- Every finite higher-degree logarithm tail has valuation strictly smaller +than the linear term above the ramified `e/(p-1)` threshold. -/ +theorem valuation_logHigherTailPartialSumField_lt_self_of_scaled_inv_sub_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hthreshold : + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + (N : ℕ) : + v (∑ n ∈ Finset.range N, signedLogSeriesTermField x hnK (n + 1)) < + v x := by + exact + v.map_sum_lt ((_root_.Valuation.ne_zero_iff v).2 hx) + (fun n _hn => + valuation_signedLogSeriesTermField_lt_self_of_scaled_inv_sub_one_lt + (v := v) (p := p) e (x := x) hx hnK hnval hthreshold + (Nat.succ_ne_zero n)) + +/-- The higher-degree logarithm tail partial sums converge to +`log(1+x) - x` under a ramified denominator valuation hypothesis. -/ +theorem tendsto_logHigherTailPartialSumField_ofWithZeroValuation_scaled_of_lt_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun N : ℕ => + ∑ n ∈ Finset.range N, signedLogSeriesTermField x hnK (n + 1)) + atTop + (𝓝 (logOnePlusSeriesFieldOfWithZeroValuation v x hnK - x)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hfull : + Tendsto + (fun N : ℕ => logOnePlusPartialSumField x hnK (N + 1)) + atTop (𝓝 (logOnePlusSeriesFieldOfWithZeroValuation v x hnK)) := by + exact + (tendsto_logOnePlusPartialSumField_ofWithZeroValuation_scaled_of_lt_one + (v := v) (p := p) e x hnK hnval hvx hcomplete).comp + (tendsto_add_atTop_nat 1) + have hsub : + Tendsto + (fun N : ℕ => logOnePlusPartialSumField x hnK (N + 1) - x) + atTop + (𝓝 (logOnePlusSeriesFieldOfWithZeroValuation v x hnK - x)) := + hfull.sub tendsto_const_nhds + have htail : + (fun N : ℕ => logOnePlusPartialSumField x hnK (N + 1) - x) = + fun N : ℕ => + ∑ n ∈ Finset.range N, signedLogSeriesTermField x hnK (n + 1) := by + funext N + rw [logOnePlusPartialSumField, Finset.sum_range_succ'] + simp + simpa [htail] using hsub + +/-- The full higher-degree logarithm tail has valuation strictly smaller than +the linear term above the ramified `e/(p-1)` threshold. -/ +theorem valuation_logHigherTailField_lt_self_of_scaled_inv_sub_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hthreshold : + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + v (logOnePlusSeriesFieldOfWithZeroValuation v x hnK - x) < + v x := by + exact + valuation_limit_lt_of_tendsto_of_eventually_lt + (v := v) (γ := v x) ((_root_.Valuation.ne_zero_iff v).2 hx) + (tendsto_logHigherTailPartialSumField_ofWithZeroValuation_scaled_of_lt_one + (v := v) (p := p) e x hnK hnval hvx hcomplete) + (Eventually.of_forall fun N => + valuation_logHigherTailPartialSumField_lt_self_of_scaled_inv_sub_one_lt + (v := v) (p := p) e (x := x) hx hnK hnval hthreshold N) + +/-- Above the ramified `e/(p-1)` threshold, `log(1+x)` has the same valuation +as the linear term `x`. -/ +theorem valuation_logOnePlusSeriesField_eq_self_of_scaled_inv_sub_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hthreshold : + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + v (logOnePlusSeriesFieldOfWithZeroValuation v x hnK) = v x := by + have htail : + v (logOnePlusSeriesFieldOfWithZeroValuation v x hnK - x) < + v x := + valuation_logHigherTailField_lt_self_of_scaled_inv_sub_one_lt + (v := v) (p := p) e (x := x) hx hnK hnval hvx hthreshold hcomplete + have hsplit : + logOnePlusSeriesFieldOfWithZeroValuation v x hnK = + x + (logOnePlusSeriesFieldOfWithZeroValuation v x hnK - x) := by + abel + rw [hsplit] + exact v.map_add_eq_of_lt_left htail + +/-- Above the ramified `e/(p-1)` threshold, `log(1 + x)` is nonzero for +nonzero `x`. -/ +theorem logOnePlusSeriesField_ne_zero_of_scaled_inv_sub_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hthreshold : + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + logOnePlusSeriesFieldOfWithZeroValuation v x hnK ≠ 0 := by + intro hzero + have hv : + v (logOnePlusSeriesFieldOfWithZeroValuation v x hnK) = v x := + valuation_logOnePlusSeriesField_eq_self_of_scaled_inv_sub_one_lt + (v := v) (p := p) e (x := x) hx hnK hnval hvx hthreshold hcomplete + rw [hzero, map_zero] at hv + exact ((_root_.Valuation.ne_zero_iff v).2 hx) hv.symm + +/-- On any part of the open unit ball satisfying the ramified `e/(p-1)` +threshold away from zero, the field logarithm has trivial kernel. -/ +theorem logOnePlusSeriesField_eq_zero_iff_of_scaled_inv_sub_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) {x : K} + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) + (hthreshold : ∀ hx : x ≠ 0, + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + logOnePlusSeriesFieldOfWithZeroValuation v x hnK = 0 ↔ x = 0 := by + constructor + · intro hlog + by_contra hx + exact + (logOnePlusSeriesField_ne_zero_of_scaled_inv_sub_one_lt + (v := v) (p := p) e (x := x) hx hnK hnval hvx (hthreshold hx) + hcomplete) hlog + · intro hx + subst x + simp + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitExp.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitExp.lean new file mode 100644 index 0000000000..472cece94f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitExp.lean @@ -0,0 +1,1097 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.InverseEstimates +/-! +Restricts the exponential series to deep additive ideals and shows that its values lie in the +corresponding principal-unit subgroups. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + principalUnitOneAddOfMemPowSubgroup → + principalUnitOneAddOfMemPowSubgroup + + +open Filter +open Polynomial +open scoped Topology +open scoped PowerSeries.WithPiTopology +noncomputable +section + +attribute [local instance] Classical.propDecidable + +universe u + +open ValuationTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +variable {K : Type u} [Field K] + +/-- The exponential-series value, viewed as a first principal unit. -/ +noncomputable def principalUnitExpSeriesOfWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1 := by + let F : CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v + have hlt : + v (expSeriesFieldOfWithZeroValuation v x hnK - 1) < + (1 : WithZero (Multiplicative ℤ)) := + valuation_expSeriesField_sub_one_lt_one_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) x hnK hnval hvx hcomplete + let a : F.valuationSubring := + ⟨expSeriesFieldOfWithZeroValuation v x hnK - 1, + (CompleteDVF.mem_valuationSubring_iff F + (expSeriesFieldOfWithZeroValuation v x hnK - 1)).2 + (by + change v (expSeriesFieldOfWithZeroValuation v x hnK - 1) ≤ 1 + exact le_of_lt hlt)⟩ + have ha : a ∈ F.maximalIdeal ^ 1 := by + have ha0 : a ∈ F.maximalIdeal := by + rw [CompleteDVF.mem_maximalIdeal_iff] + change v (expSeriesFieldOfWithZeroValuation v x hnK - 1) < 1 + exact hlt + simpa [pow_one] using ha0 + exact + principalUnitOneAddOfMemPowSubgroup + F (n := 1) le_rfl a ha + +/-- Sharp ramified endpoint form of the exponential: if `a ∈ m^n` and +`n > e/(p-1)`, then `Exp(a)` is a principal unit in `U^n`. -/ +noncomputable def principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnK : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (a : + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring)) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n := by + let F : CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v + let x : K := ((a : F.valuationSubring) : K) + have hxthreshold : + ∀ hx : x ≠ 0, + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ) := by + intro hx + have hge : + (n : ℤ) ≤ + (ofWithZeroValuation v).val (Units.mk0 x hx) := by + simpa [F, x] using + ofWithZeroValuation_val_ge_of_mem_maximalIdeal_pow + (v := v) (π := π) hπ hπval n + (a := (a : F.valuationSubring)) a.property hx + exact lt_of_lt_of_le hlevel (by exact_mod_cast hge) + have hbLe : + v (expSeriesFieldOfWithZeroValuation v x hnK - 1) ≤ + (1 : WithZero (Multiplicative ℤ)) := by + by_cases hx : x = 0 + · simp [x, hx] + · have hv : + v (expSeriesFieldOfWithZeroValuation v x hnK - 1) = v x := + valuation_expSeriesField_sub_one_eq_self_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e (x := x) hx hnK hnval + (hxthreshold hx) hcomplete + have hxInt : v x ≤ (1 : WithZero (Multiplicative ℤ)) := by + have hxMem : x ∈ F.valuation.valuationSubring := by + change ((a : F.valuationSubring) : K) ∈ F.valuation.valuationSubring + exact (a : F.valuationSubring).property + have hxBound := (CompleteDVF.mem_valuationSubring_iff F x).1 hxMem + change v x ≤ 1 at hxBound + exact hxBound + simpa [hv] using hxInt + let b : F.valuationSubring := + ⟨expSeriesFieldOfWithZeroValuation v x hnK - 1, + (CompleteDVF.mem_valuationSubring_iff F + (expSeriesFieldOfWithZeroValuation v x hnK - 1)).2 + (by + change v (expSeriesFieldOfWithZeroValuation v x hnK - 1) ≤ 1 + exact hbLe)⟩ + have hbmem : b ∈ F.maximalIdeal ^ n := by + apply + mem_maximalIdeal_pow_ofWithZeroValuation_val_ge + (v := v) (π := π) hπ hπval n b + intro hbne + by_cases hx : x = 0 + · have hbzero : (b : K) = 0 := by + simp [b, x, hx] + exact False.elim (hbne hbzero) + · have hv : + v (b : K) = v x := by + simpa [b] using + valuation_expSeriesField_sub_one_eq_self_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e (x := x) hx hnK hnval + (hxthreshold hx) hcomplete + have hge : + (n : ℤ) ≤ + (ofWithZeroValuation v).val (Units.mk0 x hx) := by + simpa [F, x] using + ofWithZeroValuation_val_ge_of_mem_maximalIdeal_pow + (v := v) (π := π) hπ hπval n + (a := (a : F.valuationSubring)) a.property hx + have hvaleq : + (ofWithZeroValuation v).val (Units.mk0 (b : K) hbne) = + (ofWithZeroValuation v).val (Units.mk0 x hx) := by + simp [ofWithZeroValuation_val, hv] + rw [hvaleq] + exact hge + exact + principalUnitOneAddOfMemPowSubgroup + F hn b hbmem + +/-- +The underlying field value of the scaled exponential-series principal unit is the corresponding +field exponential series. +-/ +@[simp] theorem principalUnitExpSeries_maximalIdealPow_val_ofWithZeroValuationScaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnK : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (a : + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring)) : + let F : CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v + ((((principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnK hnval hcomplete a : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) n) : + F.valuationSubringˣ) : F.valuationSubring) : K) = + expSeriesFieldOfWithZeroValuation v + (((a : F.valuationSubring) : K)) hnK := by + simp [principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled] + +/-- Scaled principal-unit exponential additivity on the sharp convergence threshold: +`Exp(a+b)=Exp(a)Exp(b)` for `a,b ∈ m^n`. -/ +theorem principalUnitExpSeries_maximalIdealPow_add_eq_mul_ofWithZeroValuationScaled + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnK : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (a b : + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring)) : + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnK hnval hcomplete (a + b) = + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnK hnval hcomplete a * + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnK hnval hcomplete b := by + let F : CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v + let x : K := ((a : F.valuationSubring) : K) + let y : K := ((b : F.valuationSubring) : K) + have hlevelR : (e : ℝ) / ((p : ℝ) - 1) < (n : ℝ) := by + exact_mod_cast hlevel + have hxthreshold : ∀ hx : x ≠ 0, + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℝ) := by + intro hx + have hge : + (n : ℤ) ≤ + (ofWithZeroValuation v).val (Units.mk0 x hx) := by + simpa [F, x] using + ofWithZeroValuation_val_ge_of_mem_maximalIdeal_pow + (v := v) (π := π) hπ hπval n + (a := (a : F.valuationSubring)) a.property hx + exact lt_of_lt_of_le hlevelR (by exact_mod_cast hge) + have hythreshold : ∀ hy : y ≠ 0, + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 y hy) : ℝ) := by + intro hy + have hge : + (n : ℤ) ≤ + (ofWithZeroValuation v).val (Units.mk0 y hy) := by + simpa [F, y] using + ofWithZeroValuation_val_ge_of_mem_maximalIdeal_pow + (v := v) (π := π) hπ hπval n + (a := (b : F.valuationSubring)) b.property hy + exact lt_of_lt_of_le hlevelR (by exact_mod_cast hge) + have hfield : + expSeriesFieldOfWithZeroValuation v (x + y) hnK = + expSeriesFieldOfWithZeroValuation v x hnK * + expSeriesFieldOfWithZeroValuation v y hnK := + expSeriesField_add_eq_mul_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e x y hnK hnval hxthreshold hythreshold + hcomplete + apply Subtype.ext + apply Units.ext + apply Subtype.ext + simpa [F, x, y] using hfield + +/-- The additive parameter `x = u - 1` attached to a first principal unit. -/ +noncomputable def principalUnitSubOneOfWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) : K := + (((u : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : + (completeDVFOfWithZeroValuation v).valuationSubring) : K) - 1 + +/-- +Establishes the identity `principalUnitSubOneOfWithZeroValuation v +(principalUnitExpSeriesOfWithZeroValuation (v := v) (p := p) x hnK hnval hvx hcomplete) = +expSeriesFieldOfWithZeroValuation v x hnK - 1`. +-/ +@[simp] theorem principalUnitSubOne_expSeries_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + principalUnitSubOneOfWithZeroValuation v + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnK hnval hvx hcomplete) = + expSeriesFieldOfWithZeroValuation v x hnK - 1 := by + simp [principalUnitSubOneOfWithZeroValuation, + principalUnitExpSeriesOfWithZeroValuation] + +/-- The additive parameter of the principal-unit exponential has the same +valuation as its input. -/ +theorem principalUnitSubOne_expSeries_valuation_eq_self_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + v (principalUnitSubOneOfWithZeroValuation v + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnK hnval hvx hcomplete)) = + v x := by + rw [principalUnitSubOne_expSeries_ofWithZeroValuation] + exact + valuation_expSeriesField_sub_one_eq_self_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) (x := x) hx hnK hnval hvx hcomplete + +/-- The principal-unit exponential has nonzero additive parameter for nonzero +input. -/ +theorem principalUnitSubOne_expSeries_ne_zero_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + principalUnitSubOneOfWithZeroValuation v + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnK hnval hvx hcomplete) ≠ 0 := by + rw [principalUnitSubOne_expSeries_ofWithZeroValuation] + exact + expSeriesField_sub_one_ne_zero_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) (x := x) hx hnK hnval hvx hcomplete + +/-- The additive parameter of the principal-unit exponential has the same +integer valuation as its input. -/ +theorem principalUnitSubOne_expSeries_ofWithZeroValuation_val_eq_self + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (hne : principalUnitSubOneOfWithZeroValuation v + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnK hnval hvx hcomplete) ≠ 0) : + (ofWithZeroValuation v).val + (Units.mk0 + (principalUnitSubOneOfWithZeroValuation v + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnK hnval hvx hcomplete)) hne) = + (ofWithZeroValuation v).val (Units.mk0 x hx) := by + exact + ofWithZeroValuation_val_eq_of_valuation_eq v + (principalUnitSubOne_expSeries_valuation_eq_self_ofWithZeroValuation + (v := v) (p := p) (x := x) hx hnK hnval hvx hcomplete) + +/-- The usual logarithm threshold is preserved by the additive parameter of +the principal-unit exponential. -/ +theorem principalUnitSubOne_expSeries_threshold_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hthreshold : + 1 / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (hne : principalUnitSubOneOfWithZeroValuation v + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnK hnval hvx hcomplete) ≠ 0) : + 1 / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val + (Units.mk0 + (principalUnitSubOneOfWithZeroValuation v + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnK hnval hvx hcomplete)) hne) : ℚ) := by + have hval : + (ofWithZeroValuation v).val + (Units.mk0 + (principalUnitSubOneOfWithZeroValuation v + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnK hnval hvx hcomplete)) hne) = + (ofWithZeroValuation v).val (Units.mk0 x hx) := + principalUnitSubOne_expSeries_ofWithZeroValuation_val_eq_self + (v := v) (p := p) (x := x) hx hnK hnval hvx hcomplete hne + rw [hval] + exact hthreshold + +/-- +The underlying field value of the exponential-series principal unit is the field exponential +series. +-/ +@[simp] theorem principalUnitExpSeries_val_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + let F : CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v + ((((principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnK hnval hvx hcomplete : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) : + F.valuationSubringˣ) : + F.valuationSubring) : K) = + expSeriesFieldOfWithZeroValuation v x hnK := by + simp [principalUnitExpSeriesOfWithZeroValuation] + +/-- The principal-unit exponential has valuation one after forgetting back to +the field. -/ +theorem principalUnitExpSeries_val_valuation_eq_one_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + let F : CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v + v ((((principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnK hnval hvx hcomplete : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) : + F.valuationSubringˣ) : + F.valuationSubring) : K) = + (1 : WithZero (Multiplicative ℤ)) := by + have hval := + principalUnitExpSeries_val_ofWithZeroValuation + (v := v) (p := p) x hnK hnval hvx hcomplete + dsimp at hval ⊢ + rw [hval] + exact + valuation_expSeriesField_eq_one_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) x hnK hnval hvx hcomplete + +/-- The principal-unit exponential sends zero to the identity. -/ +@[simp] theorem principalUnitExpSeries_zero_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) (0 : K) hnK hnval + (valuation_zero_lt_exp_neg_one (K := K) v) hcomplete = + (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) := by + apply Subtype.ext + apply Units.ext + apply Subtype.ext + simp + +/-- The principal-unit exponential has trivial kernel at the identity on the +normalized convergence ball. -/ +theorem principalUnitExpSeries_eq_one_iff_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] {x : K} + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnK hnval hvx hcomplete = + (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) ↔ + x = 0 := by + constructor + · intro h + by_contra hx + have hne : + principalUnitSubOneOfWithZeroValuation v + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnK hnval hvx hcomplete) ≠ 0 := + principalUnitSubOne_expSeries_ne_zero_ofWithZeroValuation + (v := v) (p := p) (x := x) hx hnK hnval hvx hcomplete + have hzero : + principalUnitSubOneOfWithZeroValuation v + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnK hnval hvx hcomplete) = 0 := by + simp [h, principalUnitSubOneOfWithZeroValuation] + exact hne hzero + · intro hx + subst x + simp + +/-- +The underlying field value of the product of two exponential-series principal units is the product +of their field exponential series. +-/ +theorem principalUnitExpSeries_mul_val_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (x y : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hvy : v y < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + let F : CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v + (((((principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnK hnval hvx hcomplete) * + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) y hnK hnval hvy hcomplete) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) : + F.valuationSubringˣ) : + F.valuationSubring) : K) = + expSeriesFieldOfWithZeroValuation v x hnK * + expSeriesFieldOfWithZeroValuation v y hnK := by + simp + +/-- Principal-unit exponential multiplicativity on the normalized convergence +ball. This is the principal-unit form of the field-side identity +`exp(x+y)=exp(x)exp(y)`. -/ +theorem principalUnitExpSeries_add_eq_mul_ofWithZeroValuation + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (x y : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hvy : v y < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) (x + y) hnK hnval + (valuation_add_lt_exp_neg_one_of_lt_exp_neg_one v hvx hvy) + hcomplete = + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnK hnval hvx hcomplete) * + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) y hnK hnval hvy hcomplete) := by + apply Subtype.ext + apply Units.ext + apply Subtype.ext + simpa [principalUnitExpSeriesOfWithZeroValuation] using + expSeriesField_add_eq_mul_ofWithZeroValuation_of_lt_exp_neg_one + (v := v) (p := p) x y hnK hnval hvx hvy hcomplete + +/-- The principal-unit exponential of `-x` is a left inverse to the +principal-unit exponential of `x`. -/ +theorem principalUnitExpSeries_neg_mul_self_eq_one_ofWithZeroValuation + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) (-x) hnK hnval + (by simpa using hvx) hcomplete) * + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnK hnval hvx hcomplete) = + (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) := by + have hmul := + principalUnitExpSeries_add_eq_mul_ofWithZeroValuation + (v := v) (p := p) (-x) x hnK hnval (by simpa using hvx) hvx + hcomplete + simpa [neg_add_cancel] using hmul.symm + +/-- The principal-unit exponential of `-x` is a right inverse to the +principal-unit exponential of `x`. -/ +theorem principalUnitExpSeries_mul_neg_self_eq_one_ofWithZeroValuation + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnK hnval hvx hcomplete) * + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) (-x) hnK hnval + (by simpa using hvx) hcomplete) = + (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) := by + have hmul := + principalUnitExpSeries_add_eq_mul_ofWithZeroValuation + (v := v) (p := p) x (-x) hnK hnval hvx (by simpa using hvx) + hcomplete + simpa [add_neg_cancel] using hmul.symm + +/-- Principal-unit inverse form of the exponential identity: +`Exp(-x) = Exp(x)⁻¹`. -/ +theorem principalUnitExpSeries_neg_eq_inv_self_ofWithZeroValuation + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) (-x) hnK hnval + (by simpa using hvx) hcomplete = + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnK hnval hvx hcomplete)⁻¹ := by + exact + eq_inv_of_mul_eq_one_left + (principalUnitExpSeries_neg_mul_self_eq_one_ofWithZeroValuation + (v := v) (p := p) x hnK hnval hvx hcomplete) + +/-- Principal-unit inverse form of the exponential identity: +`Exp(x)⁻¹ = Exp(-x)`. -/ +theorem principalUnitExpSeries_inv_eq_neg_self_ofWithZeroValuation + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnK hnval hvx hcomplete)⁻¹ = + principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) (-x) hnK hnval + (by simpa using hvx) hcomplete := by + exact + inv_eq_of_mul_eq_one_right + (principalUnitExpSeries_mul_neg_self_eq_one_ofWithZeroValuation + (v := v) (p := p) x hnK hnval hvx hcomplete) + +/-- The principal-unit exponential as a homomorphism from the additive +convergence ball, written multiplicatively via `Multiplicative`. -/ +noncomputable def principalUnitExpSeriesHomOfWithZeroValuation + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + Multiplicative (expConvergenceAddSubgroupOfWithZeroValuation v) →* + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1 where + toFun x := + principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) (x.toAdd : K) hnK hnval x.toAdd.property + hcomplete + map_one' := by + simp + map_mul' := by + intro x y + simpa using + principalUnitExpSeries_add_eq_mul_ofWithZeroValuation + (v := v) (p := p) (x.toAdd : K) (y.toAdd : K) + hnK hnval x.toAdd.property y.toAdd.property hcomplete + +/-- +Establishes the identity `principalUnitExpSeriesHomOfWithZeroValuation (v := v) (p := p) hnK hnval +hcomplete (Multiplicative.ofAdd x) = principalUnitExpSeriesOfWithZeroValuation (v := v) (p := p) +(x : K) hnK hnval x.property hcomplete`. +-/ +@[simp] theorem principalUnitExpSeriesHom_apply_ofAdd + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (x : expConvergenceAddSubgroupOfWithZeroValuation v) : + principalUnitExpSeriesHomOfWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete + (Multiplicative.ofAdd x) = + principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) (x : K) hnK hnval x.property hcomplete := + rfl + +/-- The kernel condition for the principal-unit exponential homomorphism. -/ +theorem principalUnitExpSeriesHom_eq_one_iff_ofWithZeroValuation + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (x : Multiplicative (expConvergenceAddSubgroupOfWithZeroValuation v)) : + principalUnitExpSeriesHomOfWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete x = 1 ↔ + x = 1 := by + constructor + · intro hx + have hx0 : + ((x.toAdd : expConvergenceAddSubgroupOfWithZeroValuation v) : K) = + 0 := by + exact + (principalUnitExpSeries_eq_one_iff_ofWithZeroValuation + (v := v) (p := p) + (x := ((x.toAdd : expConvergenceAddSubgroupOfWithZeroValuation v) : K)) + hnK hnval x.toAdd.property hcomplete).1 + (by + simpa [principalUnitExpSeriesHomOfWithZeroValuation] using hx) + have hxSub : + x.toAdd = + (0 : expConvergenceAddSubgroupOfWithZeroValuation v) := + Subtype.ext hx0 + apply Multiplicative.ext + simpa using hxSub + · intro hx + simp [hx] + +/-- The principal-unit exponential homomorphism has trivial kernel on the +normalized convergence ball. -/ +theorem principalUnitExpSeriesHom_injective_ofWithZeroValuation + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + Function.Injective + (principalUnitExpSeriesHomOfWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete) := by + rw [injective_iff_map_eq_one'] + intro x + exact + principalUnitExpSeriesHom_eq_one_iff_ofWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete x + +/-- Kernel-trivial form of injectivity for the principal-unit exponential +homomorphism. -/ +theorem principalUnitExpSeriesHom_ker_eq_bot_ofWithZeroValuation + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + (principalUnitExpSeriesHomOfWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete).ker = ⊥ := by + exact + (MonoidHom.ker_eq_bot_iff _).2 + (principalUnitExpSeriesHom_injective_ofWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete) + +/-- The principal-unit exponential identifies the additive convergence ball +with its image in the first principal-unit group. -/ +noncomputable def principalUnitExpSeriesMulEquivRangeOfWithZeroValuation + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + Multiplicative (expConvergenceAddSubgroupOfWithZeroValuation v) ≃* + (principalUnitExpSeriesHomOfWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete).range := + MonoidHom.ofInjective + (principalUnitExpSeriesHom_injective_ofWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete) + +/-- +Establishes the identity `((principalUnitExpSeriesMulEquivRangeOfWithZeroValuation (v := v) (p := +p) hnK hnval hcomplete x : (principalUnitExpSeriesHomOfWithZeroValuation (v := v) (p := p) hnK +hnval hcomplete).range) : (CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation +v)) 1) = principalUnitExpSeriesHomOfWithZeroValuation (v := v) (p := p) hnK hnval hcomplete x`. +-/ +@[simp] theorem principalUnitExpSeriesMulEquivRange_apply_coe + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (x : Multiplicative (expConvergenceAddSubgroupOfWithZeroValuation v)) : + ((principalUnitExpSeriesMulEquivRangeOfWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete x : + (principalUnitExpSeriesHomOfWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete).range) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) = + principalUnitExpSeriesHomOfWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete x := + MonoidHom.ofInjective_apply + (principalUnitExpSeriesHom_injective_ofWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete) + +/-- +Establishes the identity `((principalUnitExpSeriesMulEquivRangeOfWithZeroValuation (v := v) (p := +p) hnK hnval hcomplete (Multiplicative.ofAdd x) : (principalUnitExpSeriesHomOfWithZeroValuation (v +:= v) (p := p) hnK hnval hcomplete).range) : (CompleteDVF.higherPrincipalUnitGroup +(completeDVFOfWithZeroValuation v)) 1) = principalUnitExpSeriesOfWithZeroValuation (v := v) (p := +p) (x : K) hnK hnval x.property hcomplete`. +-/ +theorem principalUnitExpSeriesMulEquivRange_apply_ofAdd_coe + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (x : expConvergenceAddSubgroupOfWithZeroValuation v) : + ((principalUnitExpSeriesMulEquivRangeOfWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete + (Multiplicative.ofAdd x) : + (principalUnitExpSeriesHomOfWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete).range) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) = + principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) (x : K) hnK hnval x.property hcomplete := by + simp + +/-- +Establishes the identity `principalUnitExpSeriesHomOfWithZeroValuation (v := v) (p := p) hnK hnval +hcomplete ((principalUnitExpSeriesMulEquivRangeOfWithZeroValuation (v := v) (p := p) hnK hnval +hcomplete).symm u) = u`. +-/ +@[simp] theorem principalUnitExpSeriesHom_apply_mulEquivRange_symm + [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (u : + (principalUnitExpSeriesHomOfWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete).range) : + principalUnitExpSeriesHomOfWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete + ((principalUnitExpSeriesMulEquivRangeOfWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete).symm u) = + u := by + exact + MonoidHom.apply_ofInjective_symm + (principalUnitExpSeriesHom_injective_ofWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete) u + +/-- A first principal unit has additive parameter of valuation strictly below +one, which is the convergence hypothesis for the logarithm series. -/ +theorem principalUnitSubOne_val_lt_one_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) : + v (principalUnitSubOneOfWithZeroValuation v u) < + (1 : WithZero (Multiplicative ℤ)) := by + let F : CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v + have hu : + ((u : F.valuationSubringˣ) : F.valuationSubring) - 1 ∈ + F.maximalIdeal := by + have hmemPow : + ((u : F.valuationSubringˣ) : F.valuationSubring) - 1 ∈ + F.maximalIdeal ^ 1 := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.mem_iff + (F := F) 1 (u : F.valuationSubringˣ)).1 u.property + have hpow : F.maximalIdeal ^ 1 = F.maximalIdeal := by + change F.maximalIdeal ^ (Nat.succ 0) = F.maximalIdeal + rw [pow_succ, pow_zero, one_mul] + rwa [hpow] at hmemPow + have hlt := (CompleteDVF.mem_maximalIdeal_iff F + (((u : F.valuationSubringˣ) : F.valuationSubring) - 1)).1 hu + change v ((((u : F.valuationSubringˣ) : F.valuationSubring) - 1 : + F.valuationSubring) : K) < (1 : WithZero (Multiplicative ℤ)) at hlt + simpa [principalUnitSubOneOfWithZeroValuation, F] using hlt + +/-- The additive parameter `u - 1` of a first principal unit is +topologically nilpotent in the valued-field topology. -/ +theorem principalUnitSubOne_isTopologicallyNilpotent_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + IsTopologicallyNilpotent + (principalUnitSubOneOfWithZeroValuation v u) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + exact + isTopologicallyNilpotent_ofWithZeroValuation_lt_one + (v := v) (principalUnitSubOne_val_lt_one_ofWithZeroValuation v u) + +/-- The pair of additive parameters attached to two first principal units is +a valid two-variable power-series evaluation point. -/ +theorem principalUnitSubOne_pair_hasEval_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + MvPowerSeries.HasEval + (fun i : Fin 2 => + if i = 0 then principalUnitSubOneOfWithZeroValuation v u + else principalUnitSubOneOfWithZeroValuation v w) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + exact + mvPowerSeries_hasEval_fin_two + (principalUnitSubOne_isTopologicallyNilpotent_ofWithZeroValuation v u) + (principalUnitSubOne_isTopologicallyNilpotent_ofWithZeroValuation v w) + +/-- +Establishes the identity `principalUnitSubOneOfWithZeroValuation v (1 : +(CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1) = 0`. +-/ +@[simp] theorem principalUnitSubOne_one_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] : + principalUnitSubOneOfWithZeroValuation v + (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) = + 0 := by + simp [principalUnitSubOneOfWithZeroValuation] + +/-- For a first principal unit, the additive parameter `u - 1` vanishes +exactly at the identity. -/ +theorem principalUnitSubOne_eq_zero_iff_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) : + principalUnitSubOneOfWithZeroValuation v u = 0 ↔ + u = (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) := by + let F : CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v + constructor + · intro h + apply Subtype.ext + apply Units.ext + apply Subtype.ext + simpa [principalUnitSubOneOfWithZeroValuation, F] using + (sub_eq_zero.mp h) + · intro h + subst u + simp [principalUnitSubOneOfWithZeroValuation] + +/-- The additive parameter of a product of first principal units is +`(u - 1) + (w - 1) + (u - 1)(w - 1)`. This is the algebraic input for the +formal identity `log((1 + x)(1 + y)) = log(1 + x) + log(1 + y)`. -/ +theorem principalUnitSubOne_mul_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) : + principalUnitSubOneOfWithZeroValuation v (u * w) = + principalUnitSubOneOfWithZeroValuation v u + + principalUnitSubOneOfWithZeroValuation v w + + principalUnitSubOneOfWithZeroValuation v u * + principalUnitSubOneOfWithZeroValuation v w := by + simp [principalUnitSubOneOfWithZeroValuation] + ring + +/-- Additive parameter of the product of two exponential-series principal +units, expressed on the field side. -/ +theorem principalUnitSubOne_expSeries_mul_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (x y : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hvx : v x < WithZero.exp (-1 : ℤ)) + (hvy : v y < WithZero.exp (-1 : ℤ)) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + principalUnitSubOneOfWithZeroValuation v + ((principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) x hnK hnval hvx hcomplete) * + (principalUnitExpSeriesOfWithZeroValuation + (v := v) (p := p) y hnK hnval hvy hcomplete)) = + (expSeriesFieldOfWithZeroValuation v x hnK - 1) + + (expSeriesFieldOfWithZeroValuation v y hnK - 1) + + (expSeriesFieldOfWithZeroValuation v x hnK - 1) * + (expSeriesFieldOfWithZeroValuation v y hnK - 1) := by + rw [principalUnitSubOne_mul_ofWithZeroValuation] + simp + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog.lean new file mode 100644 index 0000000000..1fe7dbb0f0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog.Equivalences + +/-! +# Principal-unit logarithms and exponential–logarithm equivalences + +The logarithm maps deep principal units to maximal-ideal powers. Its inverse +identities assemble into the underlying and multiplicative equivalences. +-/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Core.lean new file mode 100644 index 0000000000..f503f60d16 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Core.lean @@ -0,0 +1,922 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitExp +/-! +Restricts the logarithm series to principal units and places its values in the corresponding +additive ideal. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + principalUnitOneAddOfMemPowSubgroup_val → + principalUnitOneAddOfMemPowSubgroup_val + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + principalUnitOneAddOfMemPow_val → + principalUnitOneAddOfMemPow_val + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + principalUnitSuccQuotMk → + principalUnitSuccQuotMk + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + principalUnitSuccQuotOfIdealPow → + principalUnitSuccQuotOfIdealPow + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + principalUnitSuccQuotOfIdealPow_apply → + principalUnitSuccQuotOfIdealPow_apply + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + principalUnitSuccQuotOfIdealPow_eq_of_sub_mem_succ → + principalUnitSuccQuotOfIdealPow_eq_of_sub_mem_succ + + +open Filter +open Polynomial +open scoped Topology +open scoped PowerSeries.WithPiTopology +noncomputable +section + +attribute [local instance] Classical.propDecidable + +universe u + +open ValuationTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +variable {K : Type u} [Field K] + +/-- The logarithm-series value of a first principal unit `u`, defined as the +series for `log(1 + (u - 1))`. -/ +noncomputable def principalUnitLogSeriesOfWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) : K := + logOnePlusSeriesFieldOfWithZeroValuation v + (principalUnitSubOneOfWithZeroValuation v u) hnK + +/-- Sharp ramified endpoint form of the logarithm: if `u ∈ U^n` and +`n > e/(p-1)`, then `Log(u)` lies in `m^n`. -/ +noncomputable def principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnK : ∀ m : ℕ, (((m + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ m : ℕ, + v (((m + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (m + 1) : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) : + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring) := by + let F : CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v + let aSub : F.valuationSubring := + ((u : F.valuationSubringˣ) : F.valuationSubring) - 1 + let x : K := (aSub : K) + have haMem : aSub ∈ F.maximalIdeal ^ n := by + simpa [aSub] using + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.mem_iff + (F := F) n (u : F.valuationSubringˣ)).1 u.property + have hxthreshold : + ∀ hx : x ≠ 0, + (e : ℚ) / ((p : ℚ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℚ) := by + intro hx + have hge : + (n : ℤ) ≤ + (ofWithZeroValuation v).val (Units.mk0 x hx) := by + simpa [F, x] using + ofWithZeroValuation_val_ge_of_mem_maximalIdeal_pow + (v := v) (π := π) hπ hπval n aSub haMem hx + exact lt_of_lt_of_le hlevel (by exact_mod_cast hge) + have haMemOne : aSub ∈ F.maximalIdeal := by + have hle : F.maximalIdeal ^ n ≤ F.maximalIdeal ^ 1 := + Ideal.pow_le_pow_right hn + simpa [pow_one] using hle haMem + have hxlt : v x < (1 : WithZero (Multiplicative ℤ)) := by + have hbound := (CompleteDVF.mem_maximalIdeal_iff F aSub).1 haMemOne + change v (aSub : K) < 1 at hbound + exact hbound + have hbLe : + v (logOnePlusSeriesFieldOfWithZeroValuation v x hnK) ≤ + (1 : WithZero (Multiplicative ℤ)) := by + by_cases hx : x = 0 + · simp [x, hx] + · have hv : + v (logOnePlusSeriesFieldOfWithZeroValuation v x hnK) = v x := + valuation_logOnePlusSeriesField_eq_self_of_scaled_inv_sub_one_lt + (v := v) (p := p) e (x := x) hx hnK hnval + hxlt (hxthreshold hx) hcomplete + have hxInt : v x ≤ (1 : WithZero (Multiplicative ℤ)) := + le_of_lt hxlt + simpa [hv] using hxInt + let b : F.valuationSubring := + ⟨logOnePlusSeriesFieldOfWithZeroValuation v x hnK, + (CompleteDVF.mem_valuationSubring_iff F + (logOnePlusSeriesFieldOfWithZeroValuation v x hnK)).2 + (by + change v (logOnePlusSeriesFieldOfWithZeroValuation v x hnK) ≤ 1 + exact hbLe)⟩ + have hbmem : b ∈ F.maximalIdeal ^ n := by + apply + mem_maximalIdeal_pow_ofWithZeroValuation_val_ge + (v := v) (π := π) hπ hπval n b + intro hbne + by_cases hx : x = 0 + · have hbzero : (b : K) = 0 := by + simp [b, x, hx] + exact False.elim (hbne hbzero) + · have hv : + v (b : K) = v x := by + simpa [b] using + valuation_logOnePlusSeriesField_eq_self_of_scaled_inv_sub_one_lt + (v := v) (p := p) e (x := x) hx hnK hnval + hxlt (hxthreshold hx) hcomplete + have hge : + (n : ℤ) ≤ + (ofWithZeroValuation v).val (Units.mk0 x hx) := by + simpa [F, x] using + ofWithZeroValuation_val_ge_of_mem_maximalIdeal_pow + (v := v) (π := π) hπ hπval n aSub haMem hx + have hvaleq : + (ofWithZeroValuation v).val (Units.mk0 (b : K) hbne) = + (ofWithZeroValuation v).val (Units.mk0 x hx) := by + simp [ofWithZeroValuation_val, hv] + rw [hvaleq] + exact hge + exact ⟨b, hbmem⟩ + +/-- On the successive additive quotient `m^n/m^(n+1)`, the composite +`Log ∘ Exp` induced by the ramified endpoint maps is the identity. -/ +theorem principalUnitLogSeries_expSeries_maximalIdealPowSuccQuot_eq_self_ofWithZeroValuationScaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnKexp : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hnKlog : ∀ m : ℕ, (((m + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ m : ℕ, + v (((m + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (m + 1) : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (a : + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring)) : + (completeDVFOfWithZeroValuation v).toDVF.maximalIdealPowSuccQuotMk n + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete + (principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete a)) = + (completeDVFOfWithZeroValuation v).toDVF.maximalIdealPowSuccQuotMk n a := by + let F : CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v + let expu : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) n := + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete a + let l : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) := + principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete expu + rw [DVF.maximalIdealPowSuccQuotMk_eq_iff] + change ((l : F.valuationSubring) - (a : F.valuationSubring)) ∈ + F.maximalIdeal ^ (n + 1) + refine + logOnePlusSeries_expSeries_sub_self_mem_maximalIdeal_pow_succ_of_mem_maximalIdeal_pow + (v := v) (p := p) e n (π := π) hπ hπval hlevel + hnKexp hnvalExp hnKlog hnvalLog hcomplete + (a := (a : F.valuationSubring)) + (b := (l : F.valuationSubring) - (a : F.valuationSubring)) + a.property ?_ + simp [l, expu, principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled, + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled, F] + +/-- On the successive principal-unit quotient `U^n/U^(n+1)`, the composite +`Exp ∘ Log` induced by the ramified endpoint maps is the identity. -/ +theorem principalUnitExpSeries_logSeries_principalUnitSuccQuot_eq_self_ofWithZeroValuationScaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnKlog : ∀ m : ℕ, (((m + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ m : ℕ, + v (((m + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (m + 1) : ℤ)))) + (hnKexp : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) : + principalUnitSuccQuotMk + (completeDVFOfWithZeroValuation v) n + (principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete u)) = + principalUnitSuccQuotMk + (completeDVFOfWithZeroValuation v) n u := by + let F : CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v + let loga : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) := + principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete u + let expLogu : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + n := + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete loga + have class_eq_subOne : + ∀ (w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) n) + (w0 : F.valuationSubring), + w0 = ((w : F.valuationSubringˣ) : F.valuationSubring) - 1 → + ∀ hw0 : w0 ∈ F.maximalIdeal ^ n, + principalUnitSuccQuotMk F n w = + principalUnitSuccQuotOfIdealPow + F n hn ⟨w0, hw0⟩ := by + intro w w0 hw0eq hw0 + subst w0 + rw [principalUnitSuccQuotOfIdealPow_apply] + congr 1 + dsimp + apply Subtype.ext + rw [principalUnitOneAddOfMemPowSubgroup_val] + apply Units.ext + rw [principalUnitOneAddOfMemPow_val] + ring + let a0 : F.valuationSubring := + ((u : F.valuationSubringˣ) : F.valuationSubring) - 1 + have ha0 : a0 ∈ F.maximalIdeal ^ n := by + dsimp [a0] + exact (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.mem_iff + (F := F) n (u : F.valuationSubringˣ)).1 u.property + let a : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) := + ⟨a0, ha0⟩ + let b0 : F.valuationSubring := + ((expLogu : F.valuationSubringˣ) : F.valuationSubring) - 1 + have hb0 : b0 ∈ F.maximalIdeal ^ n := by + dsimp [b0] + exact (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.mem_iff + (F := F) n (expLogu : F.valuationSubringˣ)).1 expLogu.property + let b : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) := + ⟨b0, hb0⟩ + have hdiff : (b : F.valuationSubring) - (a : F.valuationSubring) ∈ + F.maximalIdeal ^ (n + 1) := by + change b0 - a0 ∈ F.maximalIdeal ^ (n + 1) + refine + expSeries_logOnePlusSeries_sub_one_sub_self_mem_maximalIdeal_pow_succ_of_mem_maximalIdeal_pow + (v := v) (p := p) e n (π := π) hπ hπval hlevel + hnKlog hnvalLog hnKexp hnvalExp hcomplete + (a := a0) (b := b0 - a0) ha0 ?_ + simp [a0, b0, expLogu, loga, + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled, + principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled, F] + rw [class_eq_subOne expLogu b0 rfl hb0, class_eq_subOne u a0 rfl ha0] + exact + principalUnitSuccQuotOfIdealPow_eq_of_sub_mem_succ + F n hn b a hdiff + +/-- The deep exponential–logarithm equivalence, additive finite-level defect: the evaluated +composite +`Log ∘ Exp` differs from the identity by an element of `m^(n+1)`. This is the +first nontrivial finite quotient identity behind the separatedness endpoint. -/ +theorem + principalUnitLogSeries_expSeries_sub_self_mem_maximalIdeal_pow_succ_ofWithZeroValuationScaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnKexp : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hnKlog : ∀ m : ℕ, (((m + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ m : ℕ, + v (((m + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (m + 1) : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (a : + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring)) : + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete + (principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete a) : + (completeDVFOfWithZeroValuation v).valuationSubring) - + (a : (completeDVFOfWithZeroValuation v).valuationSubring) ∈ + (completeDVFOfWithZeroValuation v).maximalIdeal ^ (n + 1) := by + let F : CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v + let expu : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) n := + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete a + let l : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) := + principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete expu + change ((l : F.valuationSubring) - (a : F.valuationSubring)) ∈ + F.maximalIdeal ^ (n + 1) + refine + logOnePlusSeries_expSeries_sub_self_mem_maximalIdeal_pow_succ_of_mem_maximalIdeal_pow + (v := v) (p := p) e n (π := π) hπ hπval hlevel + hnKexp hnvalExp hnKlog hnvalLog hcomplete + (a := (a : F.valuationSubring)) + (b := (l : F.valuationSubring) - (a : F.valuationSubring)) + a.property ?_ + simp [l, expu, principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled, + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled, F] + +/-- The deep exponential–logarithm equivalence, additive finite quotient identity at level `n+1`: +`Log ∘ Exp` is the identity in `O / m^(n+1)`. -/ +theorem principalUnitLogSeries_expSeries_idealQuotient_succ_eq_self_ofWithZeroValuationScaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnKexp : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hnKlog : ∀ m : ℕ, (((m + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ m : ℕ, + v (((m + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (m + 1) : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (a : + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring)) : + Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ (n + 1)) + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete + (principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete a) : + (completeDVFOfWithZeroValuation v).valuationSubring) = + Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ (n + 1)) + (a : (completeDVFOfWithZeroValuation v).valuationSubring) := by + exact + (Ideal.Quotient.mk_eq_mk_iff_sub_mem + (I := (completeDVFOfWithZeroValuation v).maximalIdeal ^ (n + 1)) + (x := + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete + (principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete a) : + (completeDVFOfWithZeroValuation v).valuationSubring)) + (y := (a : (completeDVFOfWithZeroValuation v).valuationSubring))).2 + (principalUnitLogSeries_expSeries_sub_self_mem_maximalIdeal_pow_succ_ofWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hnKlog hnvalLog hcomplete a) + +/-- The deep exponential–logarithm equivalence, multiplicative finite-level defect: the evaluated +composite `Exp ∘ Log` differs from the identity by an element of `m^(n+1)` on +underlying valuation-ring units. -/ +theorem + principalUnitExpSeries_logSeries_sub_self_mem_maximalIdeal_pow_succ_scaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnKlog : ∀ m : ℕ, (((m + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ m : ℕ, + v (((m + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (m + 1) : ℤ)))) + (hnKexp : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) : + (((principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete u) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) : + (completeDVFOfWithZeroValuation v).valuationSubringˣ) : + (completeDVFOfWithZeroValuation v).valuationSubring) - + (((u : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : + (completeDVFOfWithZeroValuation v).valuationSubring)) ∈ + (completeDVFOfWithZeroValuation v).maximalIdeal ^ (n + 1) := by + let F : CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v + let loga : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) := + principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete u + let expLogu : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + n := + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete loga + let a0 : F.valuationSubring := + ((u : F.valuationSubringˣ) : F.valuationSubring) - 1 + have ha0 : a0 ∈ F.maximalIdeal ^ n := by + dsimp [a0] + exact (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.mem_iff + (F := F) n (u : F.valuationSubringˣ)).1 u.property + let b0 : F.valuationSubring := + ((expLogu : F.valuationSubringˣ) : F.valuationSubring) - 1 + have hdiff : b0 - a0 ∈ F.maximalIdeal ^ (n + 1) := by + refine + expSeries_logOnePlusSeries_sub_one_sub_self_mem_maximalIdeal_pow_succ_of_mem_maximalIdeal_pow + (v := v) (p := p) e n (π := π) hπ hπval hlevel + hnKlog hnvalLog hnKexp hnvalExp hcomplete + (a := a0) (b := b0 - a0) ha0 ?_ + simp [a0, b0, expLogu, loga, + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled, + principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled, F] + have hsub : + ((expLogu : F.valuationSubringˣ) : F.valuationSubring) - + ((u : F.valuationSubringˣ) : F.valuationSubring) = + b0 - a0 := by + simp [a0, b0] + simpa [F, expLogu] using hsub ▸ hdiff + +/-- The deep exponential–logarithm equivalence, multiplicative finite quotient identity at level +`n+1`: +`Exp ∘ Log` is the identity in `O / m^(n+1)` after forgetting to +valuation-ring units. -/ +theorem principalUnitExpSeries_logSeries_idealQuotient_succ_eq_self_ofWithZeroValuationScaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnKlog : ∀ m : ℕ, (((m + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ m : ℕ, + v (((m + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (m + 1) : ℤ)))) + (hnKexp : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) : + Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ (n + 1)) + ((((principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete u) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) : + (completeDVFOfWithZeroValuation v).valuationSubringˣ) : + (completeDVFOfWithZeroValuation v).valuationSubring)) = + Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ (n + 1)) + (((u : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : + (completeDVFOfWithZeroValuation v).valuationSubring)) := by + let F : CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v + let lhs : F.valuationSubring := + (((principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete u) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) n) : + F.valuationSubringˣ) : F.valuationSubring) + let rhs : F.valuationSubring := + ((u : F.valuationSubringˣ) : F.valuationSubring) + change Ideal.Quotient.mk (F.maximalIdeal ^ (n + 1)) lhs = + Ideal.Quotient.mk (F.maximalIdeal ^ (n + 1)) rhs + exact + (Ideal.Quotient.mk_eq_mk_iff_sub_mem + (I := F.maximalIdeal ^ (n + 1)) lhs rhs).2 + (by + simpa [F, lhs, rhs] using + principalUnitExpSeries_logSeries_sub_self_mem_maximalIdeal_pow_succ_scaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hnKexp hnvalExp hcomplete u) + +/-- Separatedness endpoint for the additive side of the deep exponential–logarithm equivalence: two +elements of a fixed maximal-ideal power are equal if all finite +maximal-ideal quotient coordinates agree. -/ +theorem maximalIdealPowSubtype_eq_of_idealQuotient_eq_all + (F : CompleteDVF.{u, 0} K) {n : ℕ} + {a b : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u)} + (h : + ∀ r : ℕ, + Ideal.Quotient.mk (F.maximalIdeal ^ r) (a : F.valuationSubring) = + Ideal.Quotient.mk (F.maximalIdeal ^ r) (b : F.valuationSubring)) : + a = b := by + apply Subtype.ext + have hsub : + ∀ r : ℕ, + (a : F.valuationSubring) - (b : F.valuationSubring) ∈ + F.maximalIdeal ^ r := by + intro r + exact + (Ideal.Quotient.mk_eq_mk_iff_sub_mem + (I := F.maximalIdeal ^ r) + (x := (a : F.valuationSubring)) + (y := (b : F.valuationSubring))).1 (h r) + exact sub_eq_zero.mp (F.eq_zero_of_mem_maximalIdeal_pow_all hsub) + +/-- Variant of `maximalIdealPowSubtype_eq_of_idealQuotient_eq_all` tailored +to elements already known to lie in `m^n`: quotient equality only has to be +checked at levels `r ≥ n`; the lower levels are automatic. -/ +theorem maximalIdealPowSubtype_eq_of_idealQuotient_eq_ge + (F : CompleteDVF.{u, 0} K) {n : ℕ} + {a b : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u)} + (h : + ∀ r : ℕ, n ≤ r → + Ideal.Quotient.mk (F.maximalIdeal ^ r) (a : F.valuationSubring) = + Ideal.Quotient.mk (F.maximalIdeal ^ r) (b : F.valuationSubring)) : + a = b := by + apply maximalIdealPowSubtype_eq_of_idealQuotient_eq_all F + intro r + by_cases hr : n ≤ r + · exact h r hr + · have hrle : r ≤ n := Nat.le_of_not_ge hr + apply + (Ideal.Quotient.mk_eq_mk_iff_sub_mem + (I := F.maximalIdeal ^ r) + (x := (a : F.valuationSubring)) + (y := (b : F.valuationSubring))).2 + have ha : (a : F.valuationSubring) ∈ F.maximalIdeal ^ r := + Ideal.pow_le_pow_right hrle a.property + have hb : (b : F.valuationSubring) ∈ F.maximalIdeal ^ r := + Ideal.pow_le_pow_right hrle b.property + exact (F.maximalIdeal ^ r).sub_mem ha hb + +/-- Separatedness endpoint for the multiplicative principal-unit side of +the deep exponential–logarithm equivalence: higher principal units are equal if their underlying + units +have the same image in every finite maximal-ideal quotient. -/ +theorem higherPrincipalUnitGroup_eq_of_idealQuotient_eq_all + (F : CompleteDVF.{u, 0} K) {n : ℕ} + {u₁ u₂ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) n} + (h : + ∀ r : ℕ, + Ideal.Quotient.mk (F.maximalIdeal ^ r) + ((u₁ : F.valuationSubringˣ) : F.valuationSubring) = + Ideal.Quotient.mk (F.maximalIdeal ^ r) + ((u₂ : F.valuationSubringˣ) : F.valuationSubring)) : + u₁ = u₂ := by + apply Subtype.ext + exact F.unit_eq_of_idealQuotient_eq_all h + +/-- Variant of `higherPrincipalUnitGroup_eq_of_idealQuotient_eq_all` for two +elements of the same `U^n`: it is enough to compare finite quotient +coordinates at levels `r ≥ n`. -/ +theorem higherPrincipalUnitGroup_eq_of_idealQuotient_eq_ge + (F : CompleteDVF.{u, 0} K) {n : ℕ} + {u₁ u₂ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) n} + (h : + ∀ r : ℕ, n ≤ r → + Ideal.Quotient.mk (F.maximalIdeal ^ r) + ((u₁ : F.valuationSubringˣ) : F.valuationSubring) = + Ideal.Quotient.mk (F.maximalIdeal ^ r) + ((u₂ : F.valuationSubringˣ) : F.valuationSubring)) : + u₁ = u₂ := by + apply higherPrincipalUnitGroup_eq_of_idealQuotient_eq_all F + intro r + by_cases hr : n ≤ r + · exact h r hr + · have hrle : r ≤ n := Nat.le_of_not_ge hr + apply + (Ideal.Quotient.mk_eq_mk_iff_sub_mem + (I := F.maximalIdeal ^ r) + (x := ((u₁ : F.valuationSubringˣ) : F.valuationSubring)) + (y := ((u₂ : F.valuationSubringˣ) : F.valuationSubring))).2 + have hu₁n : + ((u₁ : F.valuationSubringˣ) : F.valuationSubring) - 1 ∈ + F.maximalIdeal ^ n := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.mem_iff + (F := F) n (u₁ : F.valuationSubringˣ)).1 u₁.property + have hu₂n : + ((u₂ : F.valuationSubringˣ) : F.valuationSubring) - 1 ∈ + F.maximalIdeal ^ n := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.mem_iff + (F := F) n (u₂ : F.valuationSubringˣ)).1 u₂.property + have hu₁r : + ((u₁ : F.valuationSubringˣ) : F.valuationSubring) - 1 ∈ + F.maximalIdeal ^ r := + Ideal.pow_le_pow_right hrle hu₁n + have hu₂r : + ((u₂ : F.valuationSubringˣ) : F.valuationSubring) - 1 ∈ + F.maximalIdeal ^ r := + Ideal.pow_le_pow_right hrle hu₂n + have hsub : + ((u₁ : F.valuationSubringˣ) : F.valuationSubring) - + ((u₂ : F.valuationSubringˣ) : F.valuationSubring) = + (((u₁ : F.valuationSubringˣ) : F.valuationSubring) - 1) - + (((u₂ : F.valuationSubringˣ) : F.valuationSubring) - 1) := by + ring + rw [hsub] + exact (F.maximalIdeal ^ r).sub_mem hu₁r hu₂r + +/-- Exact `Log ∘ Exp` endpoint reduced to finite quotient coordinates. This +is the separatedness step for the additive side of the deep exponential–logarithm equivalence + after the +analytic/formal proof supplies equality in every quotient `O/m^r` for +`r ≥ n`. -/ +theorem principalUnitLogSeries_expSeries_eq_self_of_idealQuotient_eq_ge_ofWithZeroValuationScaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnKexp : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hnKlog : ∀ m : ℕ, (((m + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ m : ℕ, + v (((m + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (m + 1) : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (a : + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring)) + (hquot : + ∀ r : ℕ, n ≤ r → + Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ r) + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete + (principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete a) : + (completeDVFOfWithZeroValuation v).valuationSubring) = + Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ r) + (a : (completeDVFOfWithZeroValuation v).valuationSubring)) : + principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete + (principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete a) = + a := by + exact + maximalIdealPowSubtype_eq_of_idealQuotient_eq_ge + (completeDVFOfWithZeroValuation v) hquot + +/-- Exact `Exp ∘ Log` endpoint reduced to finite quotient coordinates. This +is the separatedness step for the multiplicative side of the deep exponential–logarithm equivalence +after the analytic/formal proof supplies equality in every quotient `O/m^r` +for `r ≥ n`. -/ +theorem principalUnitExpSeries_logSeries_eq_self_of_idealQuotient_eq_ge_ofWithZeroValuationScaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnKlog : ∀ m : ℕ, (((m + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ m : ℕ, + v (((m + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (m + 1) : ℤ)))) + (hnKexp : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) + (hquot : + ∀ r : ℕ, n ≤ r → + Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ r) + (((principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete u) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) : + (completeDVFOfWithZeroValuation v).valuationSubringˣ) : + (completeDVFOfWithZeroValuation v).valuationSubring) = + Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ r) + (((u : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : + (completeDVFOfWithZeroValuation v).valuationSubring))) : + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete u) = + u := by + exact + higherPrincipalUnitGroup_eq_of_idealQuotient_eq_ge + (completeDVFOfWithZeroValuation v) hquot + +/-- Exact `Log ∘ Exp` endpoint from direct membership of the defect in every +finite maximal-ideal power at levels `r ≥ n`. -/ +theorem principalUnitLogSeries_expSeries_eq_self_of_sub_mem_ge_ofWithZeroValuationScaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnKexp : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hnKlog : ∀ m : ℕ, (((m + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ m : ℕ, + v (((m + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (m + 1) : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (a : + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring)) + (hmem : + ∀ r : ℕ, n ≤ r → + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete + (principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete a) : + (completeDVFOfWithZeroValuation v).valuationSubring) - + (a : (completeDVFOfWithZeroValuation v).valuationSubring) ∈ + (completeDVFOfWithZeroValuation v).maximalIdeal ^ r) : + principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete + (principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete a) = + a := by + apply + principalUnitLogSeries_expSeries_eq_self_of_idealQuotient_eq_ge_ofWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hnKlog hnvalLog hcomplete a + intro r hr + exact + (Ideal.Quotient.mk_eq_mk_iff_sub_mem + (I := (completeDVFOfWithZeroValuation v).maximalIdeal ^ r) + (x := + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete + (principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete a) : + (completeDVFOfWithZeroValuation v).valuationSubring)) + (y := (a : (completeDVFOfWithZeroValuation v).valuationSubring))).2 + (hmem r hr) + +/-- Exact `Exp ∘ Log` endpoint from direct membership of the multiplicative +defect in every finite maximal-ideal power at levels `r ≥ n`. -/ +theorem principalUnitExpSeries_logSeries_eq_self_of_sub_mem_ge_ofWithZeroValuationScaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnKlog : ∀ m : ℕ, (((m + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ m : ℕ, + v (((m + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (m + 1) : ℤ)))) + (hnKexp : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) + (hmem : + ∀ r : ℕ, n ≤ r → + (((principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete u) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) : + (completeDVFOfWithZeroValuation v).valuationSubringˣ) : + (completeDVFOfWithZeroValuation v).valuationSubring) - + (((u : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : + (completeDVFOfWithZeroValuation v).valuationSubring)) ∈ + (completeDVFOfWithZeroValuation v).maximalIdeal ^ r) : + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete u) = + u := by + apply + principalUnitExpSeries_logSeries_eq_self_of_idealQuotient_eq_ge_ofWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hnKexp hnvalExp hcomplete u + intro r hr + exact + (Ideal.Quotient.mk_eq_mk_iff_sub_mem + (I := (completeDVFOfWithZeroValuation v).maximalIdeal ^ r) + (x := + (((principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete u) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) : + (completeDVFOfWithZeroValuation v).valuationSubringˣ) : + (completeDVFOfWithZeroValuation v).valuationSubring)) + (y := + (((u : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : + (completeDVFOfWithZeroValuation v).valuationSubring)))).2 + (hmem r hr) + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Equivalences.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Equivalences.lean new file mode 100644 index 0000000000..041f892689 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Equivalences.lean @@ -0,0 +1,466 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog.Core +/-! +Packages inverse exponential and logarithm series as equivalences of deep principal units. +-/ + +@[expose] public section + +open Filter +open Polynomial +open scoped Topology +open scoped PowerSeries.WithPiTopology +noncomputable +section + +attribute [local instance] Classical.propDecidable + +universe u + +open ValuationTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +variable {K : Type u} [Field K] + +/-- Endpoint package for the deep exponential–logarithm equivalence from the exact inverse +equalities: +once the two evaluated composites are proved to be identities on `m^n` and +`U^n`, the exponential and logarithm maps give the underlying equivalence +between the two source and target groups. The group-homomorphism structure is supplied +separately by the logarithm additivity and exponential additivity results. -/ +noncomputable def principalUnitExpLogEquivOfExactOfWithZeroValuationScaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnKexp : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hnKlog : ∀ m : ℕ, (((m + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ m : ℕ, + v (((m + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (m + 1) : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (hlog_exp : + ∀ a : + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring), + principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete + (principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete a) = + a) + (hexp_log : + ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n, + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete u) = + u) : + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring) ≃ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n where + toFun a := + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete a + invFun u := + principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete u + left_inv a := hlog_exp a + right_inv u := hexp_log u + +/-- Endpoint package for the deep exponential–logarithm equivalence as the actual group isomorphism: +if the evaluated composites are identities, then the source and target groups are +multiplicatively isomorphic after wrapping the additive ideal by +`Multiplicative`. The multiplicativity of the forward map is supplied by the +scaled exponential additivity proved above. -/ +noncomputable def principalUnitExpLogMulEquivOfExactOfWithZeroValuationScaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Algebra ℚ K] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnKexp : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hnKlog : ∀ m : ℕ, (((m + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ m : ℕ, + v (((m + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (m + 1) : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (hlog_exp : + ∀ a : + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring), + principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete + (principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete a) = + a) + (hexp_log : + ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n, + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete u) = + u) : + Multiplicative + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring) ≃* + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n where + toFun a := + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete a.toAdd + invFun u := + Multiplicative.ofAdd + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete u) + left_inv a := by + apply Multiplicative.ext + simpa using hlog_exp a.toAdd + right_inv u := by + simpa using hexp_log u + map_mul' a b := by + simpa using + principalUnitExpSeries_maximalIdealPow_add_eq_mul_ofWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete a.toAdd b.toAdd + +/-- Endpoint package for the deep exponential–logarithm equivalence from finite quotient +identities: if the +two evaluated composites agree with the identity in every quotient +`O / m^r` for `r ≥ n`, then the underlying source and target groups `m^n` and `U^n` are +equivalent. -/ +noncomputable def principalUnitExpLogEquivOfIdealQuotientGeOfWithZeroValuationScaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnKexp : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hnKlog : ∀ m : ℕ, (((m + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ m : ℕ, + v (((m + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (m + 1) : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (hlog_exp_quot : + ∀ a : + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring), + ∀ r : ℕ, n ≤ r → + Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ r) + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete + (principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete a) : + (completeDVFOfWithZeroValuation v).valuationSubring) = + Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ r) + (a : (completeDVFOfWithZeroValuation v).valuationSubring)) + (hexp_log_quot : + ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n, + ∀ r : ℕ, n ≤ r → + Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ r) + (((principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete u) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) : + (completeDVFOfWithZeroValuation v).valuationSubringˣ) : + (completeDVFOfWithZeroValuation v).valuationSubring) = + Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ r) + (((u : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : + (completeDVFOfWithZeroValuation v).valuationSubring))) : + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring) ≃ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n := + principalUnitExpLogEquivOfExactOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hnKlog hnvalLog hcomplete + (fun a => + principalUnitLogSeries_expSeries_eq_self_of_idealQuotient_eq_ge_ofWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hnKlog hnvalLog hcomplete a (hlog_exp_quot a)) + (fun u => + principalUnitExpSeries_logSeries_eq_self_of_idealQuotient_eq_ge_ofWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hnKexp hnvalExp hcomplete u (hexp_log_quot u)) + +/-- Endpoint package for the deep exponential–logarithm equivalence as a multiplicative +equivalence, from +finite quotient identities for both evaluated composites. -/ +noncomputable def principalUnitExpLogMulEquivOfIdealQuotientGeOfWithZeroValuationScaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Algebra ℚ K] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnKexp : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hnKlog : ∀ m : ℕ, (((m + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ m : ℕ, + v (((m + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (m + 1) : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (hlog_exp_quot : + ∀ a : + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring), + ∀ r : ℕ, n ≤ r → + Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ r) + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete + (principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete a) : + (completeDVFOfWithZeroValuation v).valuationSubring) = + Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ r) + (a : (completeDVFOfWithZeroValuation v).valuationSubring)) + (hexp_log_quot : + ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n, + ∀ r : ℕ, n ≤ r → + Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ r) + (((principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete u) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) : + (completeDVFOfWithZeroValuation v).valuationSubringˣ) : + (completeDVFOfWithZeroValuation v).valuationSubring) = + Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ r) + (((u : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : + (completeDVFOfWithZeroValuation v).valuationSubring))) : + Multiplicative + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring) ≃* + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n := + principalUnitExpLogMulEquivOfExactOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hnKlog hnvalLog hcomplete + (fun a => + principalUnitLogSeries_expSeries_eq_self_of_idealQuotient_eq_ge_ofWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hnKlog hnvalLog hcomplete a (hlog_exp_quot a)) + (fun u => + principalUnitExpSeries_logSeries_eq_self_of_idealQuotient_eq_ge_ofWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hnKexp hnvalExp hcomplete u (hexp_log_quot u)) + +/-- Endpoint package for the deep exponential–logarithm equivalence from direct all-level defect +membership: +if the two evaluated formal composites differ from the identity by elements of +every finite maximal-ideal power `m^r` for `r ≥ n`, then the underlying source and target groups + `m^n` and `U^n` are equivalent. -/ +noncomputable def principalUnitExpLogEquivOfSubMemGeOfWithZeroValuationScaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnKexp : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hnKlog : ∀ m : ℕ, (((m + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ m : ℕ, + v (((m + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (m + 1) : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (hlog_exp_mem : + ∀ a : + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring), + ∀ r : ℕ, n ≤ r → + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete + (principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete a) : + (completeDVFOfWithZeroValuation v).valuationSubring) - + (a : (completeDVFOfWithZeroValuation v).valuationSubring) ∈ + (completeDVFOfWithZeroValuation v).maximalIdeal ^ r) + (hexp_log_mem : + ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n, + ∀ r : ℕ, n ≤ r → + (((principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete u) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) : + (completeDVFOfWithZeroValuation v).valuationSubringˣ) : + (completeDVFOfWithZeroValuation v).valuationSubring) - + (((u : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : + (completeDVFOfWithZeroValuation v).valuationSubring)) ∈ + (completeDVFOfWithZeroValuation v).maximalIdeal ^ r) : + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring) ≃ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n := + principalUnitExpLogEquivOfExactOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hnKlog hnvalLog hcomplete + (fun a => + principalUnitLogSeries_expSeries_eq_self_of_sub_mem_ge_ofWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hnKlog hnvalLog hcomplete a (hlog_exp_mem a)) + (fun u => + principalUnitExpSeries_logSeries_eq_self_of_sub_mem_ge_ofWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hnKexp hnvalExp hcomplete u (hexp_log_mem u)) + +/-- Endpoint package for the deep exponential–logarithm equivalence as a multiplicative +equivalence, from the +same all-level defect-membership hypotheses. This is the final reusable shape +for the principal-unit exponential/logarithm isomorphism once the remaining analytic +defect estimates are available. -/ +noncomputable def principalUnitExpLogMulEquivOfSubMemGeOfWithZeroValuationScaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Algebra ℚ K] + {p : ℕ} [Fact p.Prime] (e n : ℕ) + {π : (completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (hπval : v (π : K) = WithZero.exp (-1 : ℤ)) + (hn : 1 ≤ n) + (hlevel : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ)) + (hnKexp : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0)) + (hnvalExp : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ)))) + (hnKlog : ∀ m : ℕ, (((m + 1 : ℕ) : K) ≠ 0)) + (hnvalLog : ∀ m : ℕ, + v (((m + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (m + 1) : ℤ)))) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) + (hlog_exp_mem : + ∀ a : + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring), + ∀ r : ℕ, n ≤ r → + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete + (principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete a) : + (completeDVFOfWithZeroValuation v).valuationSubring) - + (a : (completeDVFOfWithZeroValuation v).valuationSubring) ∈ + (completeDVFOfWithZeroValuation v).maximalIdeal ^ r) + (hexp_log_mem : + ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n, + ∀ r : ℕ, n ≤ r → + (((principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hcomplete + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hcomplete u) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) : + (completeDVFOfWithZeroValuation v).valuationSubringˣ) : + (completeDVFOfWithZeroValuation v).valuationSubring) - + (((u : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : + (completeDVFOfWithZeroValuation v).valuationSubring)) ∈ + (completeDVFOfWithZeroValuation v).maximalIdeal ^ r) : + Multiplicative + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring) ≃* + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n := + principalUnitExpLogMulEquivOfExactOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hnKlog hnvalLog hcomplete + (fun a => + principalUnitLogSeries_expSeries_eq_self_of_sub_mem_ge_ofWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKexp hnvalExp hnKlog hnvalLog hcomplete a (hlog_exp_mem a)) + (fun u => + principalUnitExpSeries_logSeries_eq_self_of_sub_mem_ge_ofWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel + hnKlog hnvalLog hnKexp hnvalExp hcomplete u (hexp_log_mem u)) + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean new file mode 100644 index 0000000000..f0dc610190 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean @@ -0,0 +1,1180 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Topology.Algebra.InfiniteSum.Nonarchimedean +public import Mathlib.Topology.Algebra.Valued.WithZeroMulInt +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalProduct +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition +/-! +Defines the logarithm and exponential series terms and proves the valuation estimates used in +their convergence arguments. +-/ + +@[expose] public section + +open Filter +open Polynomial +open scoped Topology +open scoped PowerSeries.WithPiTopology +noncomputable +section + +attribute [local instance] Classical.propDecidable + +universe u + +open ValuationTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +variable {K : Type u} [Field K] + +/-- The unsigned `n`-th term `x^(n+1)/(n+1)` in the logarithm series. -/ +noncomputable def logSeriesTerm + (x : Kˣ) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (n : ℕ) : K := + ((x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n) : Kˣ) : K) + +/-- Establishes the identity `logSeriesTerm x hnK 0 = (x : K)`. -/ +@[simp] theorem logSeriesTerm_zero + (x : Kˣ) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) : + logSeriesTerm x hnK 0 = (x : K) := by + simp [logSeriesTerm] + +/-- The signed `n`-th term `(-1)^n x^(n+1)/(n+1)` in the series for +`log (1 + x)`. -/ +noncomputable def signedLogSeriesTerm + (x : Kˣ) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (n : ℕ) : K := + (-1 : K) ^ n * logSeriesTerm x hnK n + +/-- Establishes the identity `signedLogSeriesTerm x hnK 0 = (x : K)`. -/ +@[simp] theorem signedLogSeriesTerm_zero + (x : Kˣ) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) : + signedLogSeriesTerm x hnK 0 = (x : K) := by + simp [signedLogSeriesTerm] + +/-- The finite partial sum of the principal-unit logarithm series. -/ +noncomputable def logOnePlusPartialSum + (x : Kˣ) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (N : ℕ) : K := + ∑ n ∈ Finset.range N, signedLogSeriesTerm x hnK n + +/-- Establishes the identity `logOnePlusPartialSum x hnK 0 = 0`. -/ +@[simp] theorem logOnePlusPartialSum_zero + (x : Kˣ) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) : + logOnePlusPartialSum x hnK 0 = 0 := by + simp [logOnePlusPartialSum] + +/-- Establishes the identity `logOnePlusPartialSum x hnK 1 = (x : K)`. -/ +@[simp] theorem logOnePlusPartialSum_one + (x : Kˣ) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) : + logOnePlusPartialSum x hnK 1 = (x : K) := by + simp [logOnePlusPartialSum] + +/-- The value of the principal-unit logarithm series, formed as a topological +sum in the topology attached to `v`. -/ +noncomputable def logOnePlusSeriesOfWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + (x : Kˣ) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) : K := by + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + exact ∑' n : ℕ, signedLogSeriesTerm x hnK n + +/-- The unsigned logarithm-series term for a field element. This is the form +needed for principal units `1 + x`, where `x` may be zero. -/ +noncomputable def logSeriesTermField + (x : K) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (n : ℕ) : K := + x ^ (n + 1) / + ((Units.mk0 (((n + 1 : ℕ) : K)) (hnK n) : Kˣ) : K) + +/-- Establishes the identity `logSeriesTermField x hnK 0 = x`. -/ +@[simp] theorem logSeriesTermField_zero + (x : K) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) : + logSeriesTermField x hnK 0 = x := by + simp [logSeriesTermField] + +/-- The signed logarithm-series term for a field element. -/ +noncomputable def signedLogSeriesTermField + (x : K) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (n : ℕ) : K := + (-1 : K) ^ n * logSeriesTermField x hnK n + +/-- Establishes the identity `signedLogSeriesTermField x hnK 0 = x`. -/ +@[simp] theorem signedLogSeriesTermField_zero + (x : K) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) : + signedLogSeriesTermField x hnK 0 = x := by + simp [signedLogSeriesTermField] + +/-- The `n`-th field logarithm-series term is the evaluation of the +`(n+1)`-st coefficient of the formal series `log(1+X)` at `x`. -/ +theorem powerSeries_log_coeff_mul_pow_eq_signedLogSeriesTermField + [Algebra ℚ K] (x : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (n : ℕ) : + PowerSeries.coeff (n + 1) (PowerSeries.log K) * + x ^ (n + 1) = + signedLogSeriesTermField x hnK n := by + have hcoeff : + algebraMap ℚ K (((-1 : ℚ) ^ n) / (((n + 1 : ℕ) : ℚ))) = + (-1 : K) ^ n / (((n + 1 : ℕ) : K)) := by + rw [map_div₀, map_pow, map_neg] + rw [(algebraMap ℚ K).map_one] + congr 1 + exact map_natCast (algebraMap ℚ K) (n + 1) + have hsign : (-1 : ℚ) ^ (n + 1 + 1) = (-1 : ℚ) ^ n := by + rw [show n + 1 + 1 = n + 2 by omega, pow_add] + norm_num + rw [PowerSeries.coeff_log, ite_eq_right (Nat.succ_ne_zero n), hsign, hcoeff] + simp [signedLogSeriesTermField, logSeriesTermField, div_eq_mul_inv, + mul_assoc, mul_left_comm, mul_comm] + +/-- Field-element finite partial sums of the principal-unit logarithm series. -/ +noncomputable def logOnePlusPartialSumField + (x : K) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (N : ℕ) : K := + ∑ n ∈ Finset.range N, signedLogSeriesTermField x hnK n + +/-- Establishes the identity `logOnePlusPartialSumField x hnK 0 = 0`. -/ +@[simp] theorem logOnePlusPartialSumField_zero + (x : K) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) : + logOnePlusPartialSumField x hnK 0 = 0 := by + simp [logOnePlusPartialSumField] + +/-- Establishes the identity `logOnePlusPartialSumField x hnK 1 = x`. -/ +@[simp] theorem logOnePlusPartialSumField_one + (x : K) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) : + logOnePlusPartialSumField x hnK 1 = x := by + simp [logOnePlusPartialSumField] + +/-- Finite logarithm polynomials are exactly the finite evaluations of the +formal power series `log(1+X)` with the constant term omitted. -/ +theorem powerSeries_log_partial_eval_eq_logOnePlusPartialSumField + [Algebra ℚ K] (x : K) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (N : ℕ) : + (∑ n ∈ Finset.range N, + PowerSeries.coeff (n + 1) (PowerSeries.log K) * + x ^ (n + 1)) = + logOnePlusPartialSumField x hnK N := by + rw [logOnePlusPartialSumField] + exact Finset.sum_congr rfl fun n _ => + powerSeries_log_coeff_mul_pow_eq_signedLogSeriesTermField + (K := K) x hnK n + +/-- Field-element value of the principal-unit logarithm series. -/ +noncomputable def logOnePlusSeriesFieldOfWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + (x : K) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) : K := by + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + exact ∑' n : ℕ, signedLogSeriesTermField x hnK n + +/-! ### Exponential-series terms -/ + +/-- The `n`-th term `x^n / n!` in the exponential series, for nonzero `x`. -/ +noncomputable def expSeriesTerm + (x : Kˣ) (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (n : ℕ) : K := + ((x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n) : Kˣ) : K) + +/-- Establishes the identity `expSeriesTerm x hnK 0 = 1`. -/ +@[simp] theorem expSeriesTerm_zero + (x : Kˣ) (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) : + expSeriesTerm x hnK 0 = 1 := by + simp [expSeriesTerm] + +/-- The finite partial sum of the exponential series. -/ +noncomputable def expSeriesPartialSum + (x : Kˣ) (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (N : ℕ) : K := + ∑ n ∈ Finset.range N, expSeriesTerm x hnK n + +/-- Establishes the identity `expSeriesPartialSum x hnK 0 = 0`. -/ +@[simp] theorem expSeriesPartialSum_zero + (x : Kˣ) (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) : + expSeriesPartialSum x hnK 0 = 0 := by + simp [expSeriesPartialSum] + +/-- Establishes the identity `expSeriesPartialSum x hnK 1 = 1`. -/ +@[simp] theorem expSeriesPartialSum_one + (x : Kˣ) (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) : + expSeriesPartialSum x hnK 1 = 1 := by + simp [expSeriesPartialSum] + +/-- The value of the exponential series in the topology attached to `v`. -/ +noncomputable def expSeriesOfWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + (x : Kˣ) (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) : K := by + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + exact ∑' n : ℕ, expSeriesTerm x hnK n + +/-- The `n`-th exponential-series term for a field element. This covers +`x = 0`, which is needed for the eventual principal-ideal domain of the +exponential map. -/ +noncomputable def expSeriesTermField + (x : K) (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (n : ℕ) : K := + x ^ n / ((Units.mk0 (((n.factorial : ℕ) : K)) (hnK n) : Kˣ) : K) + +/-- Establishes the identity `expSeriesTermField x hnK 0 = 1`. -/ +@[simp] theorem expSeriesTermField_zero + (x : K) (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) : + expSeriesTermField x hnK 0 = 1 := by + simp [expSeriesTermField] + +/-- The `n`-th field exponential-series term is the evaluation of the +`n`-th coefficient of mathlib's formal exponential series at `x`. -/ +theorem formalExpPowerSeries_coeff_mul_pow_eq_expSeriesTermField + [Algebra ℚ K] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) (n : ℕ) : + PowerSeries.coeff n (PowerSeries.exp K) * x ^ n = + expSeriesTermField x hnK n := by + rw [PowerSeries.coeff_exp] + simp [expSeriesTermField, div_eq_mul_inv, mul_comm] + +/-- Field-element finite partial sums of the exponential series. -/ +noncomputable def expSeriesPartialSumField + (x : K) (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (N : ℕ) : K := + ∑ n ∈ Finset.range N, expSeriesTermField x hnK n + +/-- Establishes the identity `expSeriesPartialSumField x hnK 0 = 0`. -/ +@[simp] theorem expSeriesPartialSumField_zero + (x : K) (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) : + expSeriesPartialSumField x hnK 0 = 0 := by + simp [expSeriesPartialSumField] + +/-- Establishes the identity `expSeriesPartialSumField x hnK 1 = 1`. -/ +@[simp] theorem expSeriesPartialSumField_one + (x : K) (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) : + expSeriesPartialSumField x hnK 1 = 1 := by + simp [expSeriesPartialSumField] + +/-- Finite exponential polynomials are exactly the finite evaluations of +mathlib's formal exponential series. -/ +theorem formalExpPowerSeries_partial_eval_eq_expSeriesPartialSumField + [Algebra ℚ K] (x : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) (N : ℕ) : + (∑ n ∈ Finset.range N, + PowerSeries.coeff n (PowerSeries.exp K) * x ^ n) = + expSeriesPartialSumField x hnK N := by + rw [expSeriesPartialSumField] + exact Finset.sum_congr rfl fun n _ => + formalExpPowerSeries_coeff_mul_pow_eq_expSeriesTermField + (K := K) x hnK n + +/-- Coefficientwise Cauchy product for the local exponential terms, inherited +from mathlib's formal identity `exp(xX) * exp(yX) = exp((x+y)X)`. -/ +theorem expSeriesTermField_add_eq_sum_antidiagonal + [Algebra ℚ K] (x y : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) (n : ℕ) : + expSeriesTermField (x + y) hnK n = + ∑ ij ∈ Finset.antidiagonal n, + expSeriesTermField x hnK ij.1 * + expSeriesTermField y hnK ij.2 := by + symm + calc + (∑ ij ∈ Finset.antidiagonal n, + expSeriesTermField x hnK ij.1 * + expSeriesTermField y hnK ij.2) = + ∑ ij ∈ Finset.antidiagonal n, + (PowerSeries.coeff ij.1 (PowerSeries.exp K) * x ^ ij.1) * + (PowerSeries.coeff ij.2 (PowerSeries.exp K) * y ^ ij.2) := by + exact Finset.sum_congr rfl fun ij _ => by + rw [formalExpPowerSeries_coeff_mul_pow_eq_expSeriesTermField + (K := K) x hnK ij.1, + formalExpPowerSeries_coeff_mul_pow_eq_expSeriesTermField + (K := K) y hnK ij.2] + _ = ∑ ij ∈ Finset.antidiagonal n, + PowerSeries.coeff ij.1 + (PowerSeries.rescale x (PowerSeries.exp K)) * + PowerSeries.coeff ij.2 + (PowerSeries.rescale y (PowerSeries.exp K)) := by + exact Finset.sum_congr rfl fun ij _ => by + simp [mul_assoc, mul_left_comm, mul_comm] + _ = PowerSeries.coeff n + (PowerSeries.rescale x (PowerSeries.exp K) * + PowerSeries.rescale y (PowerSeries.exp K)) := by + rw [PowerSeries.coeff_mul] + _ = PowerSeries.coeff n + (PowerSeries.rescale (x + y) (PowerSeries.exp K)) := by + rw [PowerSeries.exp_mul_exp_eq_exp_add] + _ = PowerSeries.coeff n (PowerSeries.exp K) * (x + y) ^ n := by + simp [mul_comm] + _ = expSeriesTermField (x + y) hnK n := + formalExpPowerSeries_coeff_mul_pow_eq_expSeriesTermField + (K := K) (x + y) hnK n + +/-- Range-indexed form of the finite Cauchy-product formula for each +coefficient of the local exponential series. -/ +theorem expSeriesTermField_add_eq_sum_range_succ + [Algebra ℚ K] (x y : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) (n : ℕ) : + expSeriesTermField (x + y) hnK n = + ∑ i ∈ Finset.range n.succ, + expSeriesTermField x hnK i * + expSeriesTermField y hnK (n - i) := by + rw [expSeriesTermField_add_eq_sum_antidiagonal] + exact Finset.Nat.sum_antidiagonal_eq_sum_range_succ + (fun i j => expSeriesTermField x hnK i * expSeriesTermField y hnK j) n + +/-- Finite partial sums of `exp(x+y)` expanded by the Cauchy-product +coefficients coming from the formal exponential identity. -/ +theorem expSeriesPartialSumField_add_eq_sum_range_antidiagonal + [Algebra ℚ K] (x y : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) (N : ℕ) : + expSeriesPartialSumField (x + y) hnK N = + ∑ n ∈ Finset.range N, + ∑ ij ∈ Finset.antidiagonal n, + expSeriesTermField x hnK ij.1 * + expSeriesTermField y hnK ij.2 := by + rw [expSeriesPartialSumField] + exact Finset.sum_congr rfl fun n _ => + expSeriesTermField_add_eq_sum_antidiagonal + (K := K) x y hnK n + +/-- Range-indexed form of finite partial sums of `exp(x+y)`, obtained by +opening each Cauchy-product antidiagonal. -/ +theorem expSeriesPartialSumField_add_eq_sum_range_range_succ + [Algebra ℚ K] (x y : K) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) (N : ℕ) : + expSeriesPartialSumField (x + y) hnK N = + ∑ n ∈ Finset.range N, + ∑ i ∈ Finset.range n.succ, + expSeriesTermField x hnK i * + expSeriesTermField y hnK (n - i) := by + rw [expSeriesPartialSumField] + exact Finset.sum_congr rfl fun n _ => + expSeriesTermField_add_eq_sum_range_succ + (K := K) x y hnK n + +/-- Product of finite exponential partial sums, written as a rectangular +double sum. This is the finite algebraic side of the Cauchy-product +argument for `Exp(x+y) = Exp(x) * Exp(y)`. -/ +theorem expSeriesPartialSumField_mul_eq_sum_range_range + (x y : K) (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (M N : ℕ) : + expSeriesPartialSumField x hnK M * + expSeriesPartialSumField y hnK N = + ∑ i ∈ Finset.range M, + ∑ j ∈ Finset.range N, + expSeriesTermField x hnK i * expSeriesTermField y hnK j := by + rw [expSeriesPartialSumField, expSeriesPartialSumField] + exact Finset.sum_mul_sum _ _ _ _ + +/-- Field-element value of the exponential series. -/ +noncomputable def expSeriesFieldOfWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + (x : K) (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) : K := by + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + exact ∑' n : ℕ, expSeriesTermField x hnK n + +/-- Establishes the identity `logSeriesTermField x hnK n = logSeriesTerm (Units.mk0 x hx) hnK n`. -/ +theorem logSeriesTermField_eq_logSeriesTerm_mk0 + {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (n : ℕ) : + logSeriesTermField x hnK n = + logSeriesTerm (Units.mk0 x hx) hnK n := by + simp [logSeriesTermField, logSeriesTerm] + +/-- +Establishes the identity `signedLogSeriesTermField x hnK n = signedLogSeriesTerm (Units.mk0 x hx) +hnK n`. +-/ +theorem signedLogSeriesTermField_eq_signedLogSeriesTerm_mk0 + {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (n : ℕ) : + signedLogSeriesTermField x hnK n = + signedLogSeriesTerm (Units.mk0 x hx) hnK n := by + simp [signedLogSeriesTermField, signedLogSeriesTerm, + logSeriesTermField_eq_logSeriesTerm_mk0 hx hnK n] + +/-- +Establishes the identity `logOnePlusSeriesFieldOfWithZeroValuation v x hnK = +logOnePlusSeriesOfWithZeroValuation v (Units.mk0 x hx) hnK`. +-/ +theorem logOnePlusSeriesField_eq_logOnePlusSeries_mk0 + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) : + logOnePlusSeriesFieldOfWithZeroValuation v x hnK = + logOnePlusSeriesOfWithZeroValuation v (Units.mk0 x hx) hnK := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + simp only [logOnePlusSeriesFieldOfWithZeroValuation, logOnePlusSeriesOfWithZeroValuation] + apply tsum_congr + intro n + exact signedLogSeriesTermField_eq_signedLogSeriesTerm_mk0 hx hnK n + +/-- Establishes the identity `expSeriesTermField x hnK n = expSeriesTerm (Units.mk0 x hx) hnK n`. -/ +theorem expSeriesTermField_eq_expSeriesTerm_mk0 + {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) (n : ℕ) : + expSeriesTermField x hnK n = + expSeriesTerm (Units.mk0 x hx) hnK n := by + simp [expSeriesTermField, expSeriesTerm] + +/-- +Establishes the identity `expSeriesFieldOfWithZeroValuation v x hnK = expSeriesOfWithZeroValuation +v (Units.mk0 x hx) hnK`. +-/ +theorem expSeriesField_eq_expSeries_mk0 + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {x : K} (hx : x ≠ 0) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) : + expSeriesFieldOfWithZeroValuation v x hnK = + expSeriesOfWithZeroValuation v (Units.mk0 x hx) hnK := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + simp only [expSeriesFieldOfWithZeroValuation, expSeriesOfWithZeroValuation] + apply tsum_congr + intro n + exact expSeriesTermField_eq_expSeriesTerm_mk0 hx hnK n + +/-- The topology attached to a valued field is nonarchimedean. This is the +topological input needed before applying mathlib's nonarchimedean infinite-sum +criterion. -/ +theorem nonarchimedeanRing_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + NonarchimedeanRing K := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + simpa [Valued.mk'] using v.subgroups_basis.nonarchimedean + +/-- In the topology attached to a `ℤᵐ⁰`-valued valuation, every element of +valuation strictly below one is topologically nilpotent. -/ +theorem isTopologicallyNilpotent_ofWithZeroValuation_lt_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {x : K} (hx : v x < (1 : WithZero (Multiplicative ℤ))) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + IsTopologicallyNilpotent x := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + exact Valued.tendsto_zero_pow_of_v_lt_one hx + +/-- If a nonzero field element has valuation strictly below one, then its +attached integer valuation as a field unit is positive. -/ +theorem ofWithZeroValuation_val_mk0_pos_of_lt_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {x : K} (hx : x ≠ 0) + (hvx : v x < (1 : WithZero (Multiplicative ℤ))) : + 0 < (ofWithZeroValuation v).val (Units.mk0 x hx) := by + have hxv_ne : v x ≠ 0 := (_root_.Valuation.ne_zero_iff v).2 hx + have hlogneg : WithZero.log (v x) < (0 : ℤ) := by + have hloglt : + WithZero.log (v x) < + WithZero.log (1 : WithZero (Multiplicative ℤ)) := by + rw [WithZero.log_lt_log hxv_ne one_ne_zero] + exact hvx + simpa using hloglt + rw [ofWithZeroValuation_val] + simpa using (neg_pos.mpr hlogneg) + +/-- If a nonzero element lies below `exp (-1)` in the normalized +`ℤᵐ⁰`-valuation, then its attached integer valuation is strictly bigger than +one. This is the field-element radius used for the exponential series. -/ +theorem ofWithZeroValuation_val_mk0_one_lt_of_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {x : K} (hx : x ≠ 0) + (hvx : v x < WithZero.exp (-1 : ℤ)) : + 1 < ((ofWithZeroValuation v).val (Units.mk0 x hx) : ℝ) := by + have hxv_ne : v x ≠ 0 := (_root_.Valuation.ne_zero_iff v).2 hx + have hloglt : WithZero.log (v x) < (-1 : ℤ) := by + simpa using + ((WithZero.log_lt_log hxv_ne + (WithZero.exp_ne_zero (a := (-1 : ℤ)))).2 hvx) + have hint : (1 : ℤ) < -WithZero.log (v x) := by + linarith + have hreal : (1 : ℝ) < ((-WithZero.log (v x) : ℤ) : ℝ) := by + exact_mod_cast hint + simpa [ofWithZeroValuation_val] using hreal + +/-- Positive attached integer valuation is the same direction as lying in the +open unit ball for the original `ℤᵐ⁰`-valued valuation. -/ +theorem valuation_lt_one_of_ofWithZeroValuation_val_pos + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) (x : Kˣ) + (hpos : 0 < (ofWithZeroValuation v).val x) : + v (x : K) < (1 : WithZero (Multiplicative ℤ)) := by + have hxv_ne : v (x : K) ≠ 0 := + (_root_.Valuation.ne_zero_iff v).2 x.ne_zero + have hlogneg : WithZero.log (v (x : K)) < (0 : ℤ) := by + rw [ofWithZeroValuation_val] at hpos + linarith + rw [← WithZero.log_lt_log hxv_ne one_ne_zero] + simpa using hlogneg + +/-- Integer-valued valuation comparison, translated back to the original +`ℤᵐ⁰`-valued valuation. Larger integer value means smaller `WithZero` value. -/ +theorem valuation_lt_of_ofWithZeroValuation_val_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) {x y : Kˣ} + (hxy : (ofWithZeroValuation v).val x < + (ofWithZeroValuation v).val y) : + v (y : K) < v (x : K) := by + have hxv_ne : v (x : K) ≠ 0 := + (_root_.Valuation.ne_zero_iff v).2 x.ne_zero + have hyv_ne : v (y : K) ≠ 0 := + (_root_.Valuation.ne_zero_iff v).2 y.ne_zero + have hlog : WithZero.log (v (y : K)) < WithZero.log (v (x : K)) := by + rw [ofWithZeroValuation_val, ofWithZeroValuation_val] at hxy + linarith + rw [← WithZero.log_lt_log hyv_ne hxv_ne] + exact hlog + +/-- Original valuation comparison, translated to the attached integer-valued +valuation. This is the converse direction of +`valuation_lt_of_ofWithZeroValuation_val_lt`. -/ +theorem ofWithZeroValuation_val_lt_of_valuation_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) {x y : Kˣ} + (hyx : v (y : K) < v (x : K)) : + (ofWithZeroValuation v).val x < + (ofWithZeroValuation v).val y := by + have hxv_ne : v (x : K) ≠ 0 := + (_root_.Valuation.ne_zero_iff v).2 x.ne_zero + have hyv_ne : v (y : K) ≠ 0 := + (_root_.Valuation.ne_zero_iff v).2 y.ne_zero + have hlog : WithZero.log (v (y : K)) < WithZero.log (v (x : K)) := + (WithZero.log_lt_log hyv_ne hxv_ne).2 hyx + rw [ofWithZeroValuation_val, ofWithZeroValuation_val] + linarith + +/-- Equal `ℤᵐ⁰`-valued valuations give equal integer valuations after passing +to `ofWithZeroValuation`. -/ +theorem ofWithZeroValuation_val_eq_of_valuation_eq + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) {x y : Kˣ} + (hxy : v (x : K) = v (y : K)) : + (ofWithZeroValuation v).val x = (ofWithZeroValuation v).val y := by + simp [ofWithZeroValuation_val, hxy] + +/-- The integer valuation attached to a nonarchimedean `ℤᵐ⁰`-valuation is +bounded below by the minimum under addition. -/ +theorem ofWithZeroValuation_val_add_ge_min + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {x y : K} (hx : x ≠ 0) (hy : y ≠ 0) (hxy : x + y ≠ 0) : + min ((ofWithZeroValuation v).val (Units.mk0 x hx)) + ((ofWithZeroValuation v).val (Units.mk0 y hy)) ≤ + (ofWithZeroValuation v).val (Units.mk0 (x + y) hxy) := by + have hsum : v (x + y) ≤ max (v x) (v y) := + map_add_le_max v x y + by_cases hxyv : v x ≤ v y + · have hsum_y : v (x + y) ≤ v y := by + simpa [max_eq_right hxyv] using hsum + have hsum_ne : v (x + y) ≠ 0 := + (_root_.Valuation.ne_zero_iff v).2 hxy + have hy_ne : v y ≠ 0 := + (_root_.Valuation.ne_zero_iff v).2 hy + have hlog : + WithZero.log (v (x + y)) ≤ WithZero.log (v y) := + (WithZero.log_le_log hsum_ne hy_ne).2 hsum_y + have hy_le_sum : + (ofWithZeroValuation v).val (Units.mk0 y hy) ≤ + (ofWithZeroValuation v).val (Units.mk0 (x + y) hxy) := by + simp [ofWithZeroValuation_val] + linarith + exact le_trans (min_le_right _ _) hy_le_sum + · have hyxv : v y ≤ v x := le_of_not_ge hxyv + have hsum_x : v (x + y) ≤ v x := by + simpa [max_eq_left hyxv] using hsum + have hsum_ne : v (x + y) ≠ 0 := + (_root_.Valuation.ne_zero_iff v).2 hxy + have hx_ne : v x ≠ 0 := + (_root_.Valuation.ne_zero_iff v).2 hx + have hlog : + WithZero.log (v (x + y)) ≤ WithZero.log (v x) := + (WithZero.log_le_log hsum_ne hx_ne).2 hsum_x + have hx_le_sum : + (ofWithZeroValuation v).val (Units.mk0 x hx) ≤ + (ofWithZeroValuation v).val (Units.mk0 (x + y) hxy) := by + simp [ofWithZeroValuation_val] + linarith + exact le_trans (min_le_left _ _) hx_le_sum + +/-- In the topology attached to a discrete `ℤᵐ⁰`-valued valuation, every open +valuation ball of nonzero radius is sequentially closed for convergent +sequences. -/ +theorem valuation_limit_lt_of_tendsto_of_eventually_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {γ : WithZero (Multiplicative ℤ)} (hγ : γ ≠ 0) + {u : ℕ → K} {z : K} + (hu : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto u atTop (𝓝 z)) + (hsmall : ∀ᶠ n : ℕ in atTop, v (u n) < γ) : + v z < γ := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + by_contra hznot + have hzle : γ ≤ v z := le_of_not_gt hznot + have hvz0 : v z ≠ 0 := by + intro hvz + apply hγ + apply le_antisymm + · simpa [hvz] using hzle + · exact zero_le + have hdiff : + Tendsto (fun n : ℕ => z - u n) atTop (𝓝 (0 : K)) := by + have hz : Tendsto (fun _ : ℕ => z) atTop (𝓝 z) := tendsto_const_nhds + simpa using hz.sub hu + have hball : {w : K | v w < v z} ∈ 𝓝 (0 : K) := by + rw [Valued.mem_nhds_zero] + refine ⟨Units.mk0 (v.restrict z) (by simpa using hvz0), ?_⟩ + intro w hw + change v.restrict w < v.restrict z at hw + exact v.restrict_lt_iff.mp hw + have hdiff_small : ∀ᶠ n : ℕ in atTop, v (z - u n) < v z := + hdiff.eventually hball + have hcontra : ∀ᶠ n : ℕ in atTop, False := by + filter_upwards [hsmall, hdiff_small] with n hun hdiffn + have hun_lt_z : v (u n) < v z := lt_of_lt_of_le hun hzle + have hsub : v (z - u n) = v z := + v.map_sub_eq_of_lt_left hun_lt_z + rw [hsub] at hdiffn + exact (lt_irrefl _ hdiffn) + rcases hcontra.exists with ⟨_, hfalse⟩ + exact hfalse + +/-- In the topology attached to a discrete `ℤᵐ⁰`-valued valuation, the open +unit ball is sequentially closed for convergent sequences. -/ +theorem valuation_limit_lt_one_of_tendsto_of_eventually_lt_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {u : ℕ → K} {z : K} + (hu : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto u atTop (𝓝 z)) + (hsmall : + ∀ᶠ n : ℕ in atTop, + v (u n) < (1 : WithZero (Multiplicative ℤ))) : + v z < (1 : WithZero (Multiplicative ℤ)) := by + exact + valuation_limit_lt_of_tendsto_of_eventually_lt + (v := v) (γ := (1 : WithZero (Multiplicative ℤ))) one_ne_zero + hu hsmall + +/-- The product of two elements of valuation strictly below one again has +valuation strictly below one. -/ +theorem valuation_mul_lt_one_of_lt_one + {Γ₀ : Type*} [LinearOrderedCommGroupWithZero Γ₀] + (v : _root_.Valuation K Γ₀) {x y : K} + (hx : v x < 1) (hy : v y < 1) : + v (x * y) < 1 := by + rw [v.map_mul] + exact _root_.Left.mul_lt_one' hx hy + +/-- The open valuation ball of any radius is closed under addition. -/ +theorem valuation_add_lt_of_lt + {Γ₀ : Type*} [LinearOrderedCommGroupWithZero Γ₀] + (v : _root_.Valuation K Γ₀) {γ : Γ₀} {x y : K} + (hx : v x < γ) (hy : v y < γ) : + v (x + y) < γ := by + exact lt_of_le_of_lt (map_add_le_max v x y) (max_lt hx hy) + +/-- The normalized exponential convergence radius is stable under addition. -/ +theorem valuation_add_lt_exp_neg_one_of_lt_exp_neg_one + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) {x y : K} + (hx : v x < WithZero.exp (-1 : ℤ)) + (hy : v y < WithZero.exp (-1 : ℤ)) : + v (x + y) < WithZero.exp (-1 : ℤ) := + valuation_add_lt_of_lt v hx hy + +/-- The logarithm product argument `(1+x)(1+y)-1 = x+y+xy` stays in the +open unit ball of a valuation. -/ +theorem valuation_log_mul_argument_lt_one_of_lt_one + {Γ₀ : Type*} [LinearOrderedCommGroupWithZero Γ₀] + (v : _root_.Valuation K Γ₀) {x y : K} + (hx : v x < 1) (hy : v y < 1) : + v (x + y + x * y) < 1 := by + have hxy : v (x * y) < 1 := + valuation_mul_lt_one_of_lt_one v hx hy + have hsum_le : v (x + y) ≤ max (v x) (v y) := + map_add_le_max v x y + have hsum_lt : v (x + y) < 1 := + lt_of_le_of_lt hsum_le (max_lt hx hy) + have htotal_le : v ((x + y) + x * y) ≤ max (v (x + y)) (v (x * y)) := + map_add_le_max v (x + y) (x * y) + exact lt_of_le_of_lt htotal_le (max_lt hsum_lt hxy) + +/-- The field-unit logarithm theorem, logarithm-series valuation estimate: +if `x` has positive integer valuation, then the valuations of +`x^(n+1)/(n+1)` tend to `+∞`. -/ +theorem ofWithZeroValuation_val_log_term_tendsto_atTop_of_pos + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : Kˣ) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hxpos : 0 < (ofWithZeroValuation v).val x) : + Tendsto + (fun n : ℕ => + ((ofWithZeroValuation v).val + (x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n)) : ℝ)) + atTop atTop := by + have hxone : (1 : ℤ) ≤ (ofWithZeroValuation v).val x := by + omega + have hxoneReal : (1 : ℝ) ≤ ((ofWithZeroValuation v).val x : ℝ) := by + exact_mod_cast hxone + exact + ofWithZeroValuation_val_pow_succ_div_natCast_tendsto_atTop + (v := v) (p := p) x hnK hnval + (hcpos := by norm_num) + (hc := hxoneReal) + +/-- Eventually the logarithm-series terms have valuation at least any prescribed +integer bound. -/ +theorem eventually_le_ofWithZeroValuation_val_log_term_of_pos + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : Kˣ) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hxpos : 0 < (ofWithZeroValuation v).val x) + (N : ℤ) : + ∀ᶠ n : ℕ in atTop, + N ≤ + (ofWithZeroValuation v).val + (x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n)) := by + have htendsto := + ofWithZeroValuation_val_log_term_tendsto_atTop_of_pos + (v := v) (p := p) x hnK hnval hxpos + have hreal : + ∀ᶠ n : ℕ in atTop, + (N : ℝ) ≤ + ((ofWithZeroValuation v).val + (x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n)) : ℝ) := + tendsto_atTop.1 htendsto (N : ℝ) + filter_upwards [hreal] with n hn + exact_mod_cast hn + +/-- The logarithm-series terms themselves tend to zero for the topology +defined by the given `ℤᵐ⁰`-valued valuation. -/ +theorem tendsto_zero_log_term_ofWithZeroValuation_of_pos + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : Kˣ) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hxpos : 0 < (ofWithZeroValuation v).val x) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun n : ℕ => + ((x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n) : Kˣ) : K)) + atTop (𝓝 (0 : K)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + rw [tendsto_iff_forall_eventually_mem] + intro s hs + rw [Valued.mem_nhds_zero] at hs + rcases hs with ⟨γ, hγs⟩ + let γ' : (WithZero (Multiplicative ℤ))ˣ := + Units.map (MonoidWithZeroHom.ValueGroup₀.embedding + (f := (.ofClass v))) γ + rcases WithZero.exists_exp_neg_natCast_lt γ'.ne_zero with ⟨N, hNγ⟩ + have hterm := + eventually_le_ofWithZeroValuation_val_log_term_of_pos + (v := v) (p := p) x hnK hnval hxpos (N : ℤ) + filter_upwards [hterm] with n hn + apply hγs + let y : Kˣ := + x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n) + have hlog : + WithZero.log (v (y : K)) ≤ -(N : ℤ) := by + have hNlog : (N : ℤ) ≤ -WithZero.log (v (y : K)) := by + simpa [y, ofWithZeroValuation_val] using hn + linarith + have hvle : v (y : K) ≤ WithZero.exp (-(N : ℤ)) := + WithZero.le_exp_of_log_le hlog + change v.restrict (y : K) < γ.1 + rw [Valuation.restrict_lt_iff_lt_embedding] + exact lt_of_le_of_lt hvle (by simpa [γ'] using hNγ) + +/-- The signed logarithm-series terms also tend to zero. This is the form +matching the usual series for `log (1 + x)`. -/ +theorem tendsto_zero_signed_log_term_ofWithZeroValuation_of_pos + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : Kˣ) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hxpos : 0 < (ofWithZeroValuation v).val x) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun n : ℕ => + (-1 : K) ^ n * + ((x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n) : Kˣ) : K)) + atTop (𝓝 (0 : K)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + rw [tendsto_iff_forall_eventually_mem] + intro s hs + rw [Valued.mem_nhds_zero] at hs + rcases hs with ⟨γ, hγs⟩ + let γ' : (WithZero (Multiplicative ℤ))ˣ := + Units.map (MonoidWithZeroHom.ValueGroup₀.embedding + (f := (.ofClass v))) γ + rcases WithZero.exists_exp_neg_natCast_lt γ'.ne_zero with ⟨N, hNγ⟩ + have hterm := + eventually_le_ofWithZeroValuation_val_log_term_of_pos + (v := v) (p := p) x hnK hnval hxpos (N : ℤ) + filter_upwards [hterm] with n hn + apply hγs + let y : Kˣ := + x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n) + have hlog : + WithZero.log (v (y : K)) ≤ -(N : ℤ) := by + have hNlog : (N : ℤ) ≤ -WithZero.log (v (y : K)) := by + simpa [y, ofWithZeroValuation_val] using hn + linarith + have hvle : v (y : K) ≤ WithZero.exp (-(N : ℤ)) := + WithZero.le_exp_of_log_le hlog + have hsign : v ((-1 : K) ^ n) = 1 := by + rw [v.map_pow] + simp + have hvsigned : + v ((-1 : K) ^ n * (y : K)) ≤ WithZero.exp (-(N : ℤ)) := by + rw [v.map_mul, hsign, one_mul] + exact hvle + change v.restrict ((-1 : K) ^ n * (y : K)) < γ.1 + rw [Valuation.restrict_lt_iff_lt_embedding] + exact lt_of_le_of_lt hvsigned (by simpa [γ'] using hNγ) + +/-- In a complete nonarchimedean valuation topology, the logarithm-series terms +are summable. This is the convergence step of the field-unit logarithm theorem after the + valuation estimate has been proved. -/ +theorem summable_log_term_ofWithZeroValuation_of_pos + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : Kˣ) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hxpos : 0 < (ofWithZeroValuation v).val x) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Summable + (fun n : ℕ => + ((x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n) : Kˣ) : K)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let : CompleteSpace K := hcomplete + have : NonarchimedeanRing K := nonarchimedeanRing_ofWithZeroValuation v + have hzero : + Tendsto + (fun n : ℕ => + ((x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n) : Kˣ) : K)) + atTop (𝓝 (0 : K)) := + tendsto_zero_log_term_ofWithZeroValuation_of_pos + (v := v) (p := p) x hnK hnval hxpos + have hcofinite : + Tendsto + (fun n : ℕ => + ((x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n) : Kˣ) : K)) + cofinite (𝓝 (0 : K)) := by + simpa [Nat.cofinite_eq_atTop] using hzero + rw [NonarchimedeanAddGroup.summable_iff_tendsto_cofinite_zero] + exact hcofinite + +/-- Summability of the signed logarithm series in the valuation topology. -/ +theorem summable_signed_log_term_ofWithZeroValuation_of_pos + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : Kˣ) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hxpos : 0 < (ofWithZeroValuation v).val x) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Summable + (fun n : ℕ => + (-1 : K) ^ n * + ((x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n) : Kˣ) : K)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let : CompleteSpace K := hcomplete + have : NonarchimedeanRing K := nonarchimedeanRing_ofWithZeroValuation v + have hzero : + Tendsto + (fun n : ℕ => + (-1 : K) ^ n * + ((x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n) : Kˣ) : K)) + atTop (𝓝 (0 : K)) := + tendsto_zero_signed_log_term_ofWithZeroValuation_of_pos + (v := v) (p := p) x hnK hnval hxpos + have hcofinite : + Tendsto + (fun n : ℕ => + (-1 : K) ^ n * + ((x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n) : Kˣ) : K)) + cofinite (𝓝 (0 : K)) := by + simpa [Nat.cofinite_eq_atTop] using hzero + rw [NonarchimedeanAddGroup.summable_iff_tendsto_cofinite_zero] + exact hcofinite + +/-- The field-unit logarithm theorem, principal-unit logarithm series: +the signed series for `log (1 + x)` has the value supplied by +`logOnePlusSeriesOfWithZeroValuation`. -/ +theorem hasSum_signedLogSeriesTerm_logOnePlusSeries_ofWithZeroValuation_of_pos + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : Kˣ) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hxpos : 0 < (ofWithZeroValuation v).val x) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum (fun n : ℕ => signedLogSeriesTerm x hnK n) + (logOnePlusSeriesOfWithZeroValuation v x hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hs : + Summable + (fun n : ℕ => + (-1 : K) ^ n * + ((x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n) : Kˣ) : K)) := + summable_signed_log_term_ofWithZeroValuation_of_pos + (v := v) (p := p) x hnK hnval hxpos hcomplete + simpa [logOnePlusSeriesOfWithZeroValuation, signedLogSeriesTerm, + logSeriesTerm] using hs.hasSum + +/-- The finite principal-unit logarithm polynomials converge to the logarithm +series value. This is the convergence form used before proving additivity of +the logarithm on `U^(1)`. -/ +theorem tendsto_logOnePlusPartialSum_ofWithZeroValuation_of_pos + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : Kˣ) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + (hxpos : 0 < (ofWithZeroValuation v).val x) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto (fun N : ℕ => logOnePlusPartialSum x hnK N) atTop + (𝓝 (logOnePlusSeriesOfWithZeroValuation v x hnK)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hsum := + hasSum_signedLogSeriesTerm_logOnePlusSeries_ofWithZeroValuation_of_pos + (v := v) (p := p) x hnK hnval hxpos hcomplete + simpa [logOnePlusPartialSum] using hsum.tendsto_sum_nat + +/-- Ramified-denominator version of the logarithm-series valuation estimate: +if integer denominators have value `e * v_p(n)`, positive valuation of `x` +still forces `x^(n+1)/(n+1)` to tend to zero. -/ +theorem ofWithZeroValuation_val_log_term_scaled_tendsto_atTop_of_pos + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : Kˣ) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hxpos : 0 < (ofWithZeroValuation v).val x) : + Tendsto + (fun n : ℕ => + ((ofWithZeroValuation v).val + (x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n)) : ℝ)) + atTop atTop := by + have hxone : (1 : ℤ) ≤ (ofWithZeroValuation v).val x := by + omega + have hxoneReal : (1 : ℝ) ≤ ((ofWithZeroValuation v).val x : ℝ) := by + exact_mod_cast hxone + exact + ofWithZeroValuation_val_pow_succ_div_natCast_scaled_tendsto_atTop + (v := v) (p := p) e x hnK hnval + (hcpos := by norm_num) + (hc := hxoneReal) + +/-- Eventually the ramified-denominator logarithm-series terms have valuation +at least any prescribed integer bound. -/ +theorem eventually_le_ofWithZeroValuation_val_log_term_scaled_of_pos + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : Kˣ) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hxpos : 0 < (ofWithZeroValuation v).val x) + (N : ℤ) : + ∀ᶠ n : ℕ in atTop, + N ≤ + (ofWithZeroValuation v).val + (x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n)) := by + have htendsto := + ofWithZeroValuation_val_log_term_scaled_tendsto_atTop_of_pos + (v := v) (p := p) e x hnK hnval hxpos + have hreal : + ∀ᶠ n : ℕ in atTop, + (N : ℝ) ≤ + ((ofWithZeroValuation v).val + (x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n)) : ℝ) := + tendsto_atTop.1 htendsto (N : ℝ) + filter_upwards [hreal] with n hn + exact_mod_cast hn + +/-- The signed logarithm-series terms tend to zero under the ramified +denominator valuation hypothesis. -/ +theorem tendsto_zero_signed_log_term_ofWithZeroValuation_scaled_of_pos + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : Kˣ) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hxpos : 0 < (ofWithZeroValuation v).val x) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto + (fun n : ℕ => + (-1 : K) ^ n * + ((x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n) : Kˣ) : K)) + atTop (𝓝 (0 : K)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + rw [tendsto_iff_forall_eventually_mem] + intro s hs + rw [Valued.mem_nhds_zero] at hs + rcases hs with ⟨γ, hγs⟩ + let γ' : (WithZero (Multiplicative ℤ))ˣ := + Units.map (MonoidWithZeroHom.ValueGroup₀.embedding + (f := (.ofClass v))) γ + rcases WithZero.exists_exp_neg_natCast_lt γ'.ne_zero with ⟨N, hNγ⟩ + have hterm := + eventually_le_ofWithZeroValuation_val_log_term_scaled_of_pos + (v := v) (p := p) e x hnK hnval hxpos (N : ℤ) + filter_upwards [hterm] with n hn + apply hγs + let y : Kˣ := + x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n) + have hlog : + WithZero.log (v (y : K)) ≤ -(N : ℤ) := by + have hNlog : (N : ℤ) ≤ -WithZero.log (v (y : K)) := by + simpa [y, ofWithZeroValuation_val] using hn + linarith + have hvle : v (y : K) ≤ WithZero.exp (-(N : ℤ)) := + WithZero.le_exp_of_log_le hlog + have hsign : v ((-1 : K) ^ n) = 1 := by + rw [v.map_pow] + simp + have hvsigned : + v ((-1 : K) ^ n * (y : K)) ≤ WithZero.exp (-(N : ℤ)) := by + rw [v.map_mul, hsign, one_mul] + exact hvle + change v.restrict ((-1 : K) ^ n * (y : K)) < γ.1 + rw [Valuation.restrict_lt_iff_lt_embedding] + exact lt_of_le_of_lt hvsigned (by simpa [γ'] using hNγ) + +/-- Summability of the signed logarithm series under a ramified denominator +valuation hypothesis. -/ +theorem summable_signed_log_term_ofWithZeroValuation_scaled_of_pos + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : Kˣ) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hxpos : 0 < (ofWithZeroValuation v).val x) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Summable + (fun n : ℕ => + (-1 : K) ^ n * + ((x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n) : Kˣ) : K)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let : CompleteSpace K := hcomplete + have : NonarchimedeanRing K := nonarchimedeanRing_ofWithZeroValuation v + have hzero : + Tendsto + (fun n : ℕ => + (-1 : K) ^ n * + ((x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n) : Kˣ) : K)) + atTop (𝓝 (0 : K)) := + tendsto_zero_signed_log_term_ofWithZeroValuation_scaled_of_pos + (v := v) (p := p) e x hnK hnval hxpos + have hcofinite : + Tendsto + (fun n : ℕ => + (-1 : K) ^ n * + ((x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n) : Kˣ) : K)) + cofinite (𝓝 (0 : K)) := by + simpa [Nat.cofinite_eq_atTop] using hzero + rw [NonarchimedeanAddGroup.summable_iff_tendsto_cofinite_zero] + exact hcofinite + +/-- The logarithm series has the same `tsum` value under a ramified +denominator valuation hypothesis. -/ +theorem hasSum_signedLogSeriesTerm_logOnePlusSeries_ofWithZeroValuation_scaled_of_pos + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : Kˣ) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hxpos : 0 < (ofWithZeroValuation v).val x) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + HasSum (fun n : ℕ => signedLogSeriesTerm x hnK n) + (logOnePlusSeriesOfWithZeroValuation v x hnK) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hs : + Summable + (fun n : ℕ => + (-1 : K) ^ n * + ((x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n) : Kˣ) : K)) := + summable_signed_log_term_ofWithZeroValuation_scaled_of_pos + (v := v) (p := p) e x hnK hnval hxpos hcomplete + simpa [logOnePlusSeriesOfWithZeroValuation, signedLogSeriesTerm, + logSeriesTerm] using hs.hasSum + +/-- Finite logarithm polynomials converge to the logarithm-series value under +the ramified denominator valuation hypothesis. -/ +theorem tendsto_logOnePlusPartialSum_ofWithZeroValuation_scaled_of_pos + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : Kˣ) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + (hxpos : 0 < (ofWithZeroValuation v).val x) + (hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Tendsto (fun N : ℕ => logOnePlusPartialSum x hnK N) atTop + (𝓝 (logOnePlusSeriesOfWithZeroValuation v x hnK)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + have hsum := + hasSum_signedLogSeriesTerm_logOnePlusSeries_ofWithZeroValuation_scaled_of_pos + (v := v) (p := p) e x hnK hnval hxpos hcomplete + simpa [logOnePlusPartialSum] using hsum.tendsto_sum_nat + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/PrincipalUnitExpLogEquiv.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/PrincipalUnitExpLogEquiv.lean new file mode 100644 index 0000000000..05ed4f4f46 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/PrincipalUnitExpLogEquiv.lean @@ -0,0 +1,172 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpComposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpContinuity +/-! +# Exponential and logarithm on deep principal units + +This file combines the two evaluated formal composition identities with the +valuation-theoretic endpoint maps and their continuity. No finite-quotient +or defect-membership hypothesis remains in the public result. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +variable {K : Type u} [Field K] + +/-- The local-field structure theory, the deep exponential–logarithm equivalence. If the +normalized valuation has +ramification index `e`, then for every `n > e/(p-1)` the exponential and +logarithm series give mutually inverse topological group isomorphisms +`m^n ≃ U^n` (with the additive source written multiplicatively). +Surjectivity onto the standard value group `ℤᵐ⁰` is the formal normalization +condition; a normalized uniformizer is chosen internally. -/ +noncomputable def chosenExpLogContinuousMulEquiv + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (hv : Function.Surjective v) + (n : ℕ) + (hlevel : + (LocalField.ramificationIndexOfWithZeroValuation v : ℚ) / + (((LocalField.ofWithZeroValuation v).residueCharacteristic : ℚ) - 1) < + (n : ℚ)) : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Multiplicative + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (completeDVFOfWithZeroValuation v).valuationSubring) ≃ₜ* + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v) n := by + let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := + completeDVFOfWithZeroValuation v + let LF : LocalField.{u, 0} K := LocalField.ofWithZeroValuation v + let hnormalized := + WithZeroValuation.exists_valuationSubring_valuation_eq_exp_neg_one_of_surjective + v hv + let π : (completeDVFOfWithZeroValuation v).valuationSubring := + Classical.choose hnormalized + have hπval : v (π : K) = WithZero.exp (-1 : ℤ) := + Classical.choose_spec hnormalized + let hπ : v.IsUniformizer (π : K) := + WithZeroValuation.isUniformizer_of_valuation_eq_exp_neg_one + v (π : K) hπval + let p : ℕ := LF.residueCharacteristic + let e : ℕ := LocalField.ramificationIndexOfWithZeroValuation v + haveI : Finite F.residueField := by + change Finite (IsLocalRing.ResidueField v.valuationSubring) + infer_instance + letI : Fact p.Prime := by + dsimp [p, LF] + infer_instance + have hlevel' : (e : ℚ) / ((p : ℚ) - 1) < (n : ℚ) := by + simpa [e, p, LF] using hlevel + have hpden : (0 : ℚ) < (p : ℚ) - 1 := by + have hp : 1 < p := (Fact.out : Nat.Prime p).one_lt + exact sub_pos.mpr (by exact_mod_cast hp) + have hepos : (0 : ℚ) < (e : ℚ) := by + exact_mod_cast LocalField.ramificationIndexOfWithZeroValuation_pos v + have hnpos : 0 < n := by + have hnq : (0 : ℚ) < (n : ℚ) := + lt_trans (div_pos hepos hpden) hlevel' + exact_mod_cast hnq + have hn : 1 ≤ n := hnpos + let hnKexp : ∀ m : ℕ, (((m.factorial : ℕ) : K) ≠ 0) := + fun m => Nat.cast_ne_zero.mpr (Nat.factorial_ne_zero m) + let hnKlog : ∀ m : ℕ, (((m + 1 : ℕ) : K) ≠ 0) := + fun m => Nat.cast_ne_zero.mpr (Nat.succ_ne_zero m) + let hnvalExp : ∀ m : ℕ, + v (((m.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p m.factorial : ℤ))) := by + intro m + simpa [e, p, LF] using + LocalField.valuation_natCast_factorial_eq_exp_neg_ramificationIndex_mul_padicValNat + v m + let hnvalLog : ∀ m : ℕ, + v (((m + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (m + 1) : ℤ))) := by + intro m + simpa [e, p, LF] using + LocalField.valuation_natCast_succ_eq_exp_neg_ramificationIndex_mul_padicValNat + v m + have hcomplete : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K := + WithZeroValuationTopology.completeSpace_ofWithZeroValuation v + have hlevelR : (e : ℝ) / ((p : ℝ) - 1) < (n : ℝ) := by + exact_mod_cast hlevel' + have hthreshold_of_mem : + ∀ (a : F.valuationSubring), a ∈ F.maximalIdeal ^ n → + ∀ hx : (a : K) ≠ 0, + (e : ℝ) / ((p : ℝ) - 1) < + ((ofWithZeroValuation v).val (Units.mk0 (a : K) hx) : ℝ) := by + intro a ha hx + have hge : + (n : ℤ) ≤ + (ofWithZeroValuation v).val (Units.mk0 (a : K) hx) := by + simpa [F] using + ofWithZeroValuation_val_ge_of_mem_maximalIdeal_pow + (v := v) (π := π) hπ hπval n a ha hx + exact lt_of_lt_of_le hlevelR (by exact_mod_cast hge) + have hlog_exp : + ∀ a : (F.maximalIdeal ^ n : Ideal F.valuationSubring), + principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel' + hnKlog hnvalLog hcomplete + (principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel' + hnKexp hnvalExp hcomplete a) = a := by + intro a + apply Subtype.ext + apply Subtype.ext + simpa [principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled, + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled, F] using + logOnePlusSeries_expSeries_sub_one_eq_self_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e (((a : F.valuationSubring) : K)) + hnKexp hnvalExp hnKlog hnvalLog + (hthreshold_of_mem (a : F.valuationSubring) a.property) hcomplete + have hexp_log : + ∀ u : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F n, + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel' + hnKexp hnvalExp hcomplete + (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπ hπval hn hlevel' + hnKlog hnvalLog hcomplete u) = u := by + intro u + let a : F.valuationSubring := + ((u : F.valuationSubringˣ) : F.valuationSubring) - 1 + have ha : a ∈ F.maximalIdeal ^ n := by + simpa [a] using + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.mem_iff + (F := F) n (u : F.valuationSubringˣ)).1 u.property + have hexact := + expSeries_logOnePlusSeries_eq_one_add_ofWithZeroValuation_scaled_of_threshold + (v := v) (p := p) e (a : K) hnKlog hnvalLog hnKexp hnvalExp + (hthreshold_of_mem a ha) hcomplete + apply Subtype.ext + apply Units.ext + apply Subtype.ext + simpa [a, + principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled, + principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled, F] using hexact + exact + principalUnitExpLogContinuousMulEquivOfExactOfWithZeroValuationScaled + (v := v) (p := p) e n (π := π) hπval hn hlevel' + hnKexp hnvalExp hnKlog hnvalLog hcomplete hlog_exp hexp_log + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField.lean new file mode 100644 index 0000000000..e6bc0f2707 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField.lean @@ -0,0 +1,44 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.EqualCharacteristicLaurent +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNorm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormBase +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitFactors +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitPowerIndexFormulas +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitStructure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FiniteCoefficientLaurent +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaIndexing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaPrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicQp +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.NormFiltration +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicLinearOfContinuous +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicModuleStructure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicPowerIndex +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicValuationComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PolynomialRootProximity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PowerIndex +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitInverseLimitSurjectivity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Units +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValueGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.WithZeroValuationTopology + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Basic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Basic.lean new file mode 100644 index 0000000000..367064ae8c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Basic.lean @@ -0,0 +1,510 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete +public import Mathlib.Algebra.CharP.Algebra +public import Mathlib.Algebra.CharP.Lemmas +public import Mathlib.Data.Rat.Cast.CharZero +public import Mathlib.Data.Rat.Lemmas +public import Mathlib.FieldTheory.Perfect +public import Mathlib.NumberTheory.LocalField.Basic +public import Mathlib.NumberTheory.Padics.PadicNumbers +public import Mathlib.RingTheory.Algebraic.Integral +/-! +# Local fields + +A local-field package here is a chosen complete discretely valued field with +finite residue field. The topology-first mathlib class remains available +through imports; this file only adds the chosen-valuation API needed downstream. +-/ + +@[expose] public section + +universe u v w x + +namespace LocalFieldTheory.DiscreteValuationField + +open ValuationTheory.DiscreteValuationField + +/-- A local field with a chosen complete discrete valuation and finite residue field. -/ +structure LocalField (K : Type u) [Field K] extends CompleteDVF.{u, v} K where + /-- The residue field of the chosen complete discrete valuation is finite. -/ + [residueFinite : Finite toCompleteDVF.residueField] + +attribute [instance] LocalField.residueFinite + +namespace LocalField + +variable {K : Type u} [Field K] + +/-- The residue field of a local field package. -/ +abbrev residueField (F : LocalField.{u, v} K) : Type u := + F.toCompleteDVF.residueField + +/-- The valuation subring of a local field package. -/ +abbrev valuationSubring (F : LocalField.{u, v} K) : Type u := + F.toCompleteDVF.valuationSubring + +/-- The maximal ideal of the valuation subring. -/ +abbrev maximalIdeal (F : LocalField.{u, v} K) : Ideal F.valuationSubring := + F.toCompleteDVF.maximalIdeal + +/-- The residue map of a local field package. -/ +abbrev residueMap (F : LocalField.{u, v} K) : + RingHom F.valuationSubring F.residueField := + F.toCompleteDVF.residueMap + +/-- The valuation subring of a local field package is a DVR. -/ +theorem valuationSubring_isDiscreteValuationRing + (F : LocalField.{u, v} K) : + IsDiscreteValuationRing F.valuationSubring := by + change IsDiscreteValuationRing F.toCompleteDVF.valuationSubring + exact F.toCompleteDVF.valuationSubring_isDiscreteValuationRing + +/-- The valuation subring of a local field package is Henselian. -/ +theorem henselianRing (F : LocalField.{u, v} K) : + HenselianRing F.valuationSubring F.maximalIdeal := + F.toCompleteDVF.henselianRing + +/-- A local field package has a uniformizer. -/ +theorem exists_uniformizer (F : LocalField.{u, v} K) : + ∃ pi : F.valuationSubring, F.toCompleteDVF.valuation.IsUniformizer (pi : K) := + F.toCompleteDVF.exists_uniformizer + +/-- The residue characteristic of a local field. -/ +noncomputable abbrev residueCharacteristic (F : LocalField.{u, v} K) : ℕ := + ringChar F.residueField + +/-- Establishes the inequality `F.residueCharacteristic ≠ 0`. -/ +theorem residueCharacteristic_ne_zero (F : LocalField.{u, v} K) : + F.residueCharacteristic ≠ 0 := + CharP.ringChar_ne_zero_of_finite F.residueField + +/-- Proves the primality statement `Nat.Prime F.residueCharacteristic`. -/ +theorem residueCharacteristic_prime (F : LocalField.{u, v} K) : + Nat.Prime F.residueCharacteristic := by + change Nat.Prime (ringChar F.toCompleteDVF.residueField) + let : NoZeroDivisors F.toCompleteDVF.residueField := + GroupWithZero.noZeroDivisors + exact CharP.prime_ringChar F.toCompleteDVF.residueField + +/-- The target has the stated characteristic: `CharP F.residueField F.residueCharacteristic`. -/ +instance residueField_charP_residueCharacteristic (F : LocalField.{u, v} K) : + CharP F.residueField F.residueCharacteristic := + ringChar.charP (R := F.residueField) + +/-- Registers the mathematical fact `Fact F.residueCharacteristic.Prime` for typeclass inference. -/ +instance residueCharacteristic.fact_prime (F : LocalField.{u, v} K) : + Fact F.residueCharacteristic.Prime := + ⟨F.residueCharacteristic_prime⟩ + +/-- The residue characteristic vanishes after reduction modulo the maximal +ideal. This is the first characteristic input in the converse direction of +the local-field structure theory, the local-field structure classification. -/ +theorem residueCharacteristic_natCast_residue_eq_zero + (F : LocalField.{u, v} K) : + F.residueMap (F.residueCharacteristic : F.valuationSubring) = 0 := by + calc + F.residueMap (F.residueCharacteristic : F.valuationSubring) + = (F.residueCharacteristic : F.residueField) := by + exact map_natCast F.residueMap F.residueCharacteristic + _ = 0 := by + exact ringChar.Nat.cast_ringChar (R := F.residueField) + +/-- The residue characteristic belongs to the maximal ideal of the valuation +ring. -/ +theorem residueCharacteristic_natCast_mem_maximalIdeal + (F : LocalField.{u, v} K) : + (F.residueCharacteristic : F.valuationSubring) ∈ F.maximalIdeal := + (F.toCompleteDVF.residue_eq_zero_iff + (F.residueCharacteristic : F.valuationSubring)).1 + F.residueCharacteristic_natCast_residue_eq_zero + +/-- Valuatively, the residue characteristic lies in the open unit ball. -/ +theorem valuation_residueCharacteristic_natCast_lt_one + (F : LocalField.{u, v} K) : + F.toCompleteDVF.valuation + ((F.residueCharacteristic : F.valuationSubring) : K) < 1 := + (F.toCompleteDVF.mem_maximalIdeal_iff + (F.residueCharacteristic : F.valuationSubring)).1 + F.residueCharacteristic_natCast_mem_maximalIdeal + +/-- Field-level form of the previous valuation estimate. -/ +theorem valuation_natCast_residueCharacteristic_lt_one + (F : LocalField.{u, v} K) : + F.toCompleteDVF.valuation (F.residueCharacteristic : K) < 1 := by + have hcast : + ((F.residueCharacteristic : F.valuationSubring) : K) = + (F.residueCharacteristic : K) := by + exact map_natCast F.toCompleteDVF.valuation.valuationSubring.subtype + F.residueCharacteristic + rw [← hcast] + exact F.valuation_residueCharacteristic_natCast_lt_one + +/-- In mixed characteristic, the residue characteristic is a nonzero element of +the field even though it reduces to zero. -/ +theorem natCast_residueCharacteristic_ne_zero_of_charZero + (F : LocalField.{u, v} K) [CharZero K] : + (F.residueCharacteristic : K) ≠ 0 := + Nat.cast_ne_zero.mpr F.residueCharacteristic_ne_zero + +/-- For an arbitrary integer, membership in the maximal ideal is exactly +divisibility by the residue characteristic. -/ +theorem intCast_mem_maximalIdeal_iff_residueCharacteristic_dvd + (F : LocalField.{u, v} K) (z : ℤ) : + (z : F.valuationSubring) ∈ F.maximalIdeal ↔ + (F.residueCharacteristic : ℤ) ∣ z := by + rw [← F.toCompleteDVF.residue_eq_zero_iff (z : F.valuationSubring)] + rw [map_intCast] + exact + CharP.intCast_eq_zero_iff + (R := F.residueField) F.residueCharacteristic z + +/-- Natural-number version of +`intCast_mem_maximalIdeal_iff_residueCharacteristic_dvd`. -/ +theorem natCast_mem_maximalIdeal_iff_residueCharacteristic_dvd + (F : LocalField.{u, v} K) (n : ℕ) : + (n : F.valuationSubring) ∈ F.maximalIdeal ↔ + F.residueCharacteristic ∣ n := by + rw [← F.toCompleteDVF.residue_eq_zero_iff (n : F.valuationSubring)] + rw [map_natCast] + exact ringChar.spec (R := F.residueField) n + +/-- Integer-valued maximal-ideal membership as a valuation inequality. -/ +theorem valuationSubring_intCast_lt_one_iff_residueCharacteristic_dvd + (F : LocalField.{u, v} K) (z : ℤ) : + F.toCompleteDVF.valuation ((z : F.valuationSubring) : K) < 1 ↔ + (F.residueCharacteristic : ℤ) ∣ z := + (F.toCompleteDVF.mem_maximalIdeal_iff + (z : F.valuationSubring)).symm.trans + (F.intCast_mem_maximalIdeal_iff_residueCharacteristic_dvd z) + +/-- Natural-number-valued maximal-ideal membership as a valuation inequality. -/ +theorem valuationSubring_natCast_lt_one_iff_residueCharacteristic_dvd + (F : LocalField.{u, v} K) (n : ℕ) : + F.toCompleteDVF.valuation ((n : F.valuationSubring) : K) < 1 ↔ + F.residueCharacteristic ∣ n := + (F.toCompleteDVF.mem_maximalIdeal_iff + (n : F.valuationSubring)).symm.trans + (F.natCast_mem_maximalIdeal_iff_residueCharacteristic_dvd n) + +/-- An integer prime to the residue characteristic is a unit in the valuation +ring. -/ +theorem isUnit_intCast_iff_not_residueCharacteristic_dvd + (F : LocalField.{u, v} K) (z : ℤ) : + IsUnit (z : F.valuationSubring) ↔ + ¬ (F.residueCharacteristic : ℤ) ∣ z := by + rw [← F.toCompleteDVF.residue_ne_zero_iff_isUnit (z : F.valuationSubring)] + rw [map_intCast] + exact + not_congr + (CharP.intCast_eq_zero_iff + (R := F.residueField) F.residueCharacteristic z) + +/-- A natural number prime to the residue characteristic is a unit in the +valuation ring. -/ +theorem isUnit_natCast_iff_not_residueCharacteristic_dvd + (F : LocalField.{u, v} K) (n : ℕ) : + IsUnit (n : F.valuationSubring) ↔ + ¬ F.residueCharacteristic ∣ n := by + rw [← F.toCompleteDVF.residue_ne_zero_iff_isUnit (n : F.valuationSubring)] + rw [map_natCast] + exact not_congr (ringChar.spec (R := F.residueField) n) + +/-- An integer prime to the residue characteristic has valuation one. -/ +theorem valuationSubring_intCast_eq_one_of_not_residueCharacteristic_dvd + (F : LocalField.{u, v} K) {z : ℤ} + (hz : ¬ (F.residueCharacteristic : ℤ) ∣ z) : + F.toCompleteDVF.valuation ((z : F.valuationSubring) : K) = 1 := by + have hle : + F.toCompleteDVF.valuation ((z : F.valuationSubring) : K) ≤ 1 := + (F.toCompleteDVF.mem_valuationSubring_iff + ((z : F.valuationSubring) : K)).1 + (z : F.valuationSubring).property + have hnlt : + ¬ F.toCompleteDVF.valuation ((z : F.valuationSubring) : K) < 1 := by + intro hlt + exact hz + ((F.valuationSubring_intCast_lt_one_iff_residueCharacteristic_dvd z).1 hlt) + exact le_antisymm hle (le_of_not_gt hnlt) + +/-- A natural number prime to the residue characteristic has valuation one. -/ +theorem valuationSubring_natCast_eq_one_of_not_residueCharacteristic_dvd + (F : LocalField.{u, v} K) {n : ℕ} + (hn : ¬ F.residueCharacteristic ∣ n) : + F.toCompleteDVF.valuation ((n : F.valuationSubring) : K) = 1 := by + have hle : + F.toCompleteDVF.valuation ((n : F.valuationSubring) : K) ≤ 1 := + (F.toCompleteDVF.mem_valuationSubring_iff + ((n : F.valuationSubring) : K)).1 + (n : F.valuationSubring).property + have hnlt : + ¬ F.toCompleteDVF.valuation ((n : F.valuationSubring) : K) < 1 := by + intro hlt + exact hn + ((F.valuationSubring_natCast_lt_one_iff_residueCharacteristic_dvd n).1 hlt) + exact le_antisymm hle (le_of_not_gt hnlt) + +/-- Field-level integer valuation criterion for the residue characteristic. -/ +theorem valuation_intCast_lt_one_iff_residueCharacteristic_dvd + (F : LocalField.{u, v} K) (z : ℤ) : + F.toCompleteDVF.valuation (z : K) < 1 ↔ + (F.residueCharacteristic : ℤ) ∣ z := by + have hcast : + ((z : F.valuationSubring) : K) = (z : K) := by + exact map_intCast F.toCompleteDVF.valuation.valuationSubring.subtype z + rw [← hcast] + exact F.valuationSubring_intCast_lt_one_iff_residueCharacteristic_dvd z + +/-- Field-level natural-number valuation criterion for the residue +characteristic. -/ +theorem valuation_natCast_lt_one_iff_residueCharacteristic_dvd + (F : LocalField.{u, v} K) (n : ℕ) : + F.toCompleteDVF.valuation (n : K) < 1 ↔ + F.residueCharacteristic ∣ n := by + have hcast : + ((n : F.valuationSubring) : K) = (n : K) := by + exact map_natCast F.toCompleteDVF.valuation.valuationSubring.subtype n + rw [← hcast] + exact F.valuationSubring_natCast_lt_one_iff_residueCharacteristic_dvd n + +/-- Field-level integer valuation-one criterion away from the residue +characteristic. -/ +theorem valuation_intCast_eq_one_of_not_residueCharacteristic_dvd + (F : LocalField.{u, v} K) {z : ℤ} + (hz : ¬ (F.residueCharacteristic : ℤ) ∣ z) : + F.toCompleteDVF.valuation (z : K) = 1 := by + have hcast : + ((z : F.valuationSubring) : K) = (z : K) := by + exact map_intCast F.toCompleteDVF.valuation.valuationSubring.subtype z + rw [← hcast] + exact F.valuationSubring_intCast_eq_one_of_not_residueCharacteristic_dvd hz + +/-- Field-level natural-number valuation-one criterion away from the residue +characteristic. -/ +theorem valuation_natCast_eq_one_of_not_residueCharacteristic_dvd + (F : LocalField.{u, v} K) {n : ℕ} + (hn : ¬ F.residueCharacteristic ∣ n) : + F.toCompleteDVF.valuation (n : K) = 1 := by + have hcast : + ((n : F.valuationSubring) : K) = (n : K) := by + exact map_natCast F.toCompleteDVF.valuation.valuationSubring.subtype n + rw [← hcast] + exact F.valuationSubring_natCast_eq_one_of_not_residueCharacteristic_dvd hn + +/-- Every integer lies in the valuation subring. This is the denominator +control input for the mixed-characteristic branch of the local-field structure classification. -/ +theorem valuation_intCast_le_one (F : LocalField.{u, v} K) (z : ℤ) : + F.toCompleteDVF.valuation (z : K) ≤ 1 := by + have hmem : + ((z : F.valuationSubring) : K) ∈ + F.toCompleteDVF.valuation.valuationSubring := + (z : F.valuationSubring).property + have hcast : + ((z : F.valuationSubring) : K) = (z : K) := by + exact map_intCast F.toCompleteDVF.valuation.valuationSubring.subtype z + rw [← hcast] + exact + (F.toCompleteDVF.mem_valuationSubring_iff + ((z : F.valuationSubring) : K)).1 hmem + +/-- Every natural number lies in the valuation subring. -/ +theorem valuation_natCast_le_one (F : LocalField.{u, v} K) (n : ℕ) : + F.toCompleteDVF.valuation (n : K) ≤ 1 := by + simpa using F.valuation_intCast_le_one (n : ℤ) + +/-- If the denominator of a rational number is prime to the residue +characteristic, then its valuation is the valuation of its numerator. -/ +theorem valuation_ratCast_eq_intCast_of_not_residueCharacteristic_dvd_den + (F : LocalField.{u, v} K) (q : ℚ) + (hden : ¬ F.residueCharacteristic ∣ q.den) : + F.toCompleteDVF.valuation (q : K) = + F.toCompleteDVF.valuation (q.num : K) := by + calc + F.toCompleteDVF.valuation (q : K) + = F.toCompleteDVF.valuation ((q.num : K) / (q.den : K)) := by + rw [Rat.cast_def] + _ = F.toCompleteDVF.valuation (q.num : K) / + F.toCompleteDVF.valuation (q.den : K) := by + exact F.toCompleteDVF.valuation.map_div (q.num : K) (q.den : K) + _ = F.toCompleteDVF.valuation (q.num : K) / 1 := by + rw [F.valuation_natCast_eq_one_of_not_residueCharacteristic_dvd hden] + _ = F.toCompleteDVF.valuation (q.num : K) := by + simp + +/-- A rational number with denominator prime to the residue characteristic lies +in the valuation subring. This is the local `ℤ_(p)` input for the converse +classification in the local-field structure theory, the local-field structure classification. -/ +theorem valuation_ratCast_le_one_of_not_residueCharacteristic_dvd_den + (F : LocalField.{u, v} K) (q : ℚ) + (hden : ¬ F.residueCharacteristic ∣ q.den) : + F.toCompleteDVF.valuation (q : K) ≤ 1 := by + rw [F.valuation_ratCast_eq_intCast_of_not_residueCharacteristic_dvd_den q hden] + exact F.valuation_intCast_le_one q.num + +/-- Valuation-subring membership form of +`valuation_ratCast_le_one_of_not_residueCharacteristic_dvd_den`. -/ +theorem ratCast_mem_valuationSubring_of_not_residueCharacteristic_dvd_den + (F : LocalField.{u, v} K) (q : ℚ) + (hden : ¬ F.residueCharacteristic ∣ q.den) : + (q : K) ∈ F.toCompleteDVF.valuation.valuationSubring := + (F.toCompleteDVF.mem_valuationSubring_iff (q : K)).2 + (F.valuation_ratCast_le_one_of_not_residueCharacteristic_dvd_den q hden) + +/-- In a reduced rational number, if the denominator is divisible by the +residue characteristic then the numerator is not. -/ +theorem not_residueCharacteristic_dvd_rat_num_of_dvd_den + (F : LocalField.{u, v} K) (q : ℚ) + (hden : F.residueCharacteristic ∣ q.den) : + ¬ (F.residueCharacteristic : ℤ) ∣ q.num := by + intro hnum + have hnumNat : F.residueCharacteristic ∣ q.num.natAbs := + (Int.natCast_dvd.mp hnum) + have hp_one : F.residueCharacteristic = 1 := + Nat.eq_one_of_dvd_coprimes q.reduced hnumNat hden + exact F.residueCharacteristic_prime.ne_one hp_one + +/-- For mixed-characteristic local fields, the rational numbers lying in the +valuation subring are exactly those whose denominator is prime to the residue +characteristic. -/ +theorem valuation_ratCast_le_one_iff_not_residueCharacteristic_dvd_den + (F : LocalField.{u, v} K) [CharZero K] (q : ℚ) : + F.toCompleteDVF.valuation (q : K) ≤ 1 ↔ + ¬ F.residueCharacteristic ∣ q.den := by + constructor + · intro hle hden + have hnumNot : + ¬ (F.residueCharacteristic : ℤ) ∣ q.num := + F.not_residueCharacteristic_dvd_rat_num_of_dvd_den q hden + have hnumVal : + F.toCompleteDVF.valuation (q.num : K) = 1 := + F.valuation_intCast_eq_one_of_not_residueCharacteristic_dvd hnumNot + have hdenValLt : + F.toCompleteDVF.valuation (q.den : K) < 1 := + (F.valuation_natCast_lt_one_iff_residueCharacteristic_dvd q.den).2 hden + have hdenNe : (q.den : K) ≠ 0 := + Nat.cast_ne_zero.mpr q.den_ne_zero + have hdenValPos : + 0 < F.toCompleteDVF.valuation (q.den : K) := + F.toCompleteDVF.valuation.pos_iff.2 hdenNe + have hqVal : + F.toCompleteDVF.valuation (q : K) = + F.toCompleteDVF.valuation (q.num : K) / + F.toCompleteDVF.valuation (q.den : K) := by + calc + F.toCompleteDVF.valuation (q : K) + = F.toCompleteDVF.valuation ((q.num : K) / (q.den : K)) := by + rw [Rat.cast_def] + _ = F.toCompleteDVF.valuation (q.num : K) / + F.toCompleteDVF.valuation (q.den : K) := by + exact F.toCompleteDVF.valuation.map_div (q.num : K) (q.den : K) + have hgt : 1 < F.toCompleteDVF.valuation (q : K) := by + rw [hqVal, hnumVal] + simpa [one_div] using (one_lt_inv₀ hdenValPos).2 hdenValLt + exact (not_lt_of_ge hle) hgt + · exact F.valuation_ratCast_le_one_of_not_residueCharacteristic_dvd_den q + +/-- Valuation-subring membership version of +`valuation_ratCast_le_one_iff_not_residueCharacteristic_dvd_den`. -/ +theorem ratCast_mem_valuationSubring_iff_not_residueCharacteristic_dvd_den + (F : LocalField.{u, v} K) [CharZero K] (q : ℚ) : + (q : K) ∈ F.toCompleteDVF.valuation.valuationSubring ↔ + ¬ F.residueCharacteristic ∣ q.den := + (F.toCompleteDVF.mem_valuationSubring_iff (q : K)).trans + (F.valuation_ratCast_le_one_iff_not_residueCharacteristic_dvd_den q) + +/-- The restriction of the local-field valuation to `ℚ` has the same valuation +subring as the `p`-adic valuation, where `p` is the residue characteristic. -/ +theorem valuation_ratCast_le_one_iff_padicValuation_le_one + (F : LocalField.{u, v} K) [CharZero K] (q : ℚ) : + F.toCompleteDVF.valuation (q : K) ≤ 1 ↔ + Rat.padicValuation F.residueCharacteristic q ≤ 1 := + (F.valuation_ratCast_le_one_iff_not_residueCharacteristic_dvd_den q).trans + (Rat.padicValuation_le_one_iff + (p := F.residueCharacteristic) (x := q)).symm + +/-- Valuation-subring membership version of +`valuation_ratCast_le_one_iff_padicValuation_le_one`. -/ +theorem ratCast_mem_valuationSubring_iff_padicValuation_le_one + (F : LocalField.{u, v} K) [CharZero K] (q : ℚ) : + (q : K) ∈ F.toCompleteDVF.valuation.valuationSubring ↔ + Rat.padicValuation F.residueCharacteristic q ≤ 1 := + (F.toCompleteDVF.mem_valuationSubring_iff (q : K)).trans + (F.valuation_ratCast_le_one_iff_padicValuation_le_one q) + +/-- The valuation subring pulled back from `K` along the rational embedding is +the usual `p`-adic valuation subring of `ℚ`. -/ +theorem ratCast_preimage_valuationSubring_eq_padicValuationSubring + (F : LocalField.{u, v} K) [CharZero K] : + F.toCompleteDVF.valuation.valuationSubring.comap (Rat.castHom K) = + (Rat.padicValuation F.residueCharacteristic).valuationSubring := by + ext q + rw [ValuationSubring.mem_comap] + simpa using F.ratCast_mem_valuationSubring_iff_padicValuation_le_one q + +/-- The valuation on `K`, restricted along `ℚ → K`, is equivalent to the +`p`-adic valuation on `ℚ`. -/ +theorem ratCast_valuation_isEquiv_padicValuation + (F : LocalField.{u, v} K) [CharZero K] : + (F.toCompleteDVF.valuation.comap (Rat.castHom K)).IsEquiv + (Rat.padicValuation F.residueCharacteristic) := by + refine (Valuation.isEquiv_iff_valuationSubring + (v₁ := F.toCompleteDVF.valuation.comap (Rat.castHom K)) + (v₂ := Rat.padicValuation F.residueCharacteristic)).2 ?_ + ext q + change F.toCompleteDVF.valuation ((Rat.castHom K) q) ≤ 1 ↔ + Rat.padicValuation F.residueCharacteristic q ≤ 1 + simpa using F.valuation_ratCast_le_one_iff_padicValuation_le_one q + +/-- In positive equal characteristic, the residue field has the same +characteristic as the local field. -/ +theorem residueField_charP_of_charP + (F : LocalField.{u, v} K) (p : ℕ) [CharP K p] (hp : p ≠ 0) : + CharP F.residueField p := by + exact CharP.of_ringHom_of_ne_zero F.residueMap p hp + +/-- In positive equal characteristic, the residue characteristic is the +characteristic of the local field. -/ +theorem residueCharacteristic_eq_of_charP + (F : LocalField.{u, v} K) (p : ℕ) [CharP K p] (hp : p ≠ 0) : + F.residueCharacteristic = p := by + have : CharP F.residueField p := + F.residueField_charP_of_charP p hp + exact ringChar.eq F.residueField p + +/-- Any finite residue-field algebra over a local field residue field is +algebraic. -/ +theorem residueExtension_isAlgebraic_of_finite + (F : LocalField.{u, v} K) {k : Type w} [Field k] + [Algebra F.residueField k] [Finite k] : + Algebra.IsAlgebraic F.residueField k := by + let : Module.Finite F.residueField k := + Module.Finite.of_finite + exact Algebra.IsAlgebraic.of_finite F.residueField k + +/-- Any finite residue-field algebra over a local field residue field is +separable. -/ +theorem residueExtension_isSeparable_of_finite + (F : LocalField.{u, v} K) {k : Type w} [Field k] + [Algebra F.residueField k] [Finite k] : + Algebra.IsSeparable F.residueField k := by + let : Module.Finite F.residueField k := + Module.Finite.of_finite + let : Algebra.IsAlgebraic F.residueField k := + Algebra.IsAlgebraic.of_finite F.residueField k + infer_instance + +/-- The residue-field algebra between two local-field packages is separable. -/ +theorem residueExtension_isSeparable + (F : LocalField.{u, v} K) {L : Type w} [Field L] + (E : LocalField.{w, x} L) [Algebra F.residueField E.residueField] : + Algebra.IsSeparable F.residueField E.residueField := + F.residueExtension_isSeparable_of_finite (k := E.residueField) + +end LocalField +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean new file mode 100644 index 0000000000..29835a48fc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean @@ -0,0 +1,1208 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuedExtensionUnitMap +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.CompleteDVRExpansion +public import Mathlib.Analysis.Normed.Module.FiniteDimension +public import Mathlib.RingTheory.LaurentSeries +public import Mathlib.RingTheory.Localization.Away.Basic +public import Mathlib.RingTheory.PowerSeries.Evaluation +public import Mathlib.Topology.Algebra.LinearTopology +public import Mathlib.Topology.Algebra.Valued.WithZeroMulInt +public import Mathlib.LinearAlgebra.Dimension.Basic +/-! +# Equal-characteristic Laurent-series input for the local-field structure classification + +This file starts the equal-characteristic branch of the local-field structure classification, + the local-field structure classification. Given the Teichmuller coefficient-field section +`κ -> O_K -> K` and a uniformizer `π`, it constructs the induced evaluation +map `κ((X)) -> K` by first evaluating `κ⟦X⟧` at `X = π`, then using the +localization description `κ((X)) = κ⟦X⟧[X⁻¹]`. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + residueMap_comp_residueTeichmullerRingHomOfCharP → + residueMap_comp_residueTeichmullerRingHomOfCharP + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + residueTeichmullerFieldHomOfCharP → + residueTeichmullerFieldHomOfCharP + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + residueTeichmullerRingHomOfCharP → + residueTeichmullerRingHomOfCharP + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming + mrangeRestrictNontriviallyNormedField → + mrangeRestrictNontriviallyNormedField + + +noncomputable +section + +universe u v + +open LocalFieldTheory.DiscreteValuationField + +namespace LocalFieldTheory.DiscreteValuationField +namespace CompleteDVF + +open scoped PowerSeries LaurentSeries Filter Topology BigOperators +open Filter + +variable {K : Type u} [Field K] +variable (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + +namespace EqualCharacteristicLaurent + +/-- The Teichmuller coefficient-field section `κ -> O_K` used before passing +to the fraction field. -/ +abbrev coeffSubringHom [Finite F.residueField] (p : ℕ) [Fact p.Prime] + [CharP F.valuationSubring p] {n : ℕ+} + (hcard : Nat.card F.residueField = p ^ (n : ℕ)) : + F.residueField →+* F.valuationSubring := + residueTeichmullerRingHomOfCharP + (F := F) p hcard + +/-- The Teichmuller coefficient-field embedding `κ -> K` used in the +equal-characteristic Laurent-series branch. -/ +abbrev coeffHom [Finite F.residueField] (p : ℕ) [Fact p.Prime] + [CharP F.valuationSubring p] {n : ℕ+} + (hcard : Nat.card F.residueField = p ^ (n : ℕ)) : + F.residueField →+* K := + residueTeichmullerFieldHomOfCharP + (F := F) p hcard + +/-- The Teichmuller section is a representative system for the residue field. -/ +noncomputable def teichmullerRepresentativeSystem [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) : + LubinTate.Valuations.residueRepresentativeSystem F where + repr := coeffSubringHom (F := F) p hcard + residue_repr := by + intro a + have hcomp := + residueMap_comp_residueTeichmullerRingHomOfCharP + (F := F) p hcard + simpa [coeffSubringHom, RingHom.comp_apply] using + congrFun (congrArg DFunLike.coe hcomp) a + repr_zero := by + simp [coeffSubringHom] + +/-- The field-valued coefficient embedding is the valuation-ring coefficient +section followed by the valuation-subring inclusion. -/ +@[simp] theorem coeffHom_apply [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (a : F.residueField) : + coeffHom (F := F) p hcard a = + (coeffSubringHom (F := F) p hcard a : K) := by + rfl + +/-- The Teichmuller coefficient-field embedding is continuous when the finite +residue field is given the discrete uniformity. -/ +theorem continuous_coeffHom_of_discrete [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + [UniformSpace F.residueField] [DiscreteUniformity F.residueField] + [TopologicalSpace K] : + Continuous (coeffHom (F := F) p hcard) := + continuous_of_discreteTopology + +/-- The valuation-ring Teichmuller coefficient section is continuous from the +discrete residue-field topology to any topology on the valuation ring. -/ +theorem continuous_coeffSubringHom_of_discrete [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + [UniformSpace F.residueField] [DiscreteUniformity F.residueField] + [TopologicalSpace F.valuationSubring] : + Continuous (coeffSubringHom (F := F) p hcard) := + continuous_of_discreteTopology + +/-- A complete-DVF uniformizer is topologically nilpotent for the +range-restricted valued topology. -/ +theorem uniformizer_hasEval_mrangeRestrict + {π : F.valuationSubring} + (hπ : F.valuation.IsUniformizer (π : K)) : + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + PowerSeries.HasEval (π : K) := by + let Γ : Type v := + MonoidHom.mrange F.valuation.toMonoidWithZeroHom + let : Valued K Γ := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + have : IsCyclic Γˣ := by + simpa [Γ] using + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_units_isCyclic F + have : MulArchimedean Γ := + _root_.LocalFieldTheory.DiscreteValuationField.WithZeroValuation.units_isCyclic_mulArchimedean Γ + have hπ_lt : + (Valued.v : _root_.Valuation K Γ) (π : K) < 1 := by + change _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F (π : K) < + (1 : Γ) + rw [← Subtype.coe_lt_coe] + simpa [Γ, _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict] using + hπ.val_lt_one + exact Valued.tendsto_zero_pow_of_v_lt_one hπ_lt + +/-- The maximal-ideal adic topology on the valuation ring is linear. -/ +private theorem valuationSubring_isLinearTopology_adic : + letI : TopologicalSpace F.valuationSubring := F.maximalIdeal.adicTopology + IsLinearTopology F.valuationSubring F.valuationSubring := by + let : TopologicalSpace F.valuationSubring := F.maximalIdeal.adicTopology + exact + IsLinearTopology.mk_of_hasBasis F.valuationSubring + (Ideal.hasBasis_nhds_zero_adic F.maximalIdeal) + +/-- The `WithIdeal` adic topology on the valuation ring is linear. -/ +private theorem valuationSubring_isLinearTopology_withIdeal : + letI : WithIdeal F.valuationSubring := { i := F.maximalIdeal } + IsLinearTopology F.valuationSubring F.valuationSubring := by + let : WithIdeal F.valuationSubring := { i := F.maximalIdeal } + exact valuationSubring_isLinearTopology_adic (F := F) + +/-- The valuation ring is complete for its maximal-ideal adic topology. -/ +private theorem valuationSubring_completeSpace_withIdeal : + letI : WithIdeal F.valuationSubring := { i := F.maximalIdeal } + CompleteSpace F.valuationSubring := by + let : WithIdeal F.valuationSubring := { i := F.maximalIdeal } + have hadic : IsAdic F.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp F.isAdicComplete).1 + +/-- The valuation ring is Hausdorff for its maximal-ideal adic topology. -/ +private theorem valuationSubring_t2Space_withIdeal : + letI : WithIdeal F.valuationSubring := { i := F.maximalIdeal } + T2Space F.valuationSubring := by + let : WithIdeal F.valuationSubring := { i := F.maximalIdeal } + have hadic : IsAdic F.maximalIdeal := rfl + exact (hadic.isAdicComplete_iff.mp F.isAdicComplete).2 + +/-- A complete-DVF uniformizer is topologically nilpotent in the valuation +ring for the maximal-ideal adic topology. -/ +theorem uniformizer_hasEval_valuationSubring_withIdeal + {π : F.valuationSubring} + (hπ : F.valuation.IsUniformizer (π : K)) : + letI : WithIdeal F.valuationSubring := { i := F.maximalIdeal } + PowerSeries.HasEval π := by + let : WithIdeal F.valuationSubring := { i := F.maximalIdeal } + change Filter.Tendsto (fun m : ℕ => π ^ m) Filter.atTop + (nhds (0 : F.valuationSubring)) + refine (F.maximalIdeal.hasBasis_nhds_zero_adic).tendsto_right_iff.2 ?_ + intro n _ + refine Filter.eventually_atTop.2 ⟨n, fun m hm => ?_⟩ + have hπmem : π ∈ F.maximalIdeal := + F.uniformizer_mem_maximalIdeal hπ + have hpow : π ^ m ∈ F.maximalIdeal ^ m := + Ideal.pow_mem_pow hπmem m + exact Ideal.pow_le_pow_right hm hpow + +/-- Evaluation of power series into the valuation ring through the +Teichmuller coefficient section, sending `X` to a chosen uniformizer. -/ +noncomputable def powerSeriesEvalSubringHom [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + [UniformSpace F.residueField] [IsUniformAddGroup F.residueField] + [IsTopologicalSemiring F.residueField] + [UniformSpace F.valuationSubring] [IsUniformAddGroup F.valuationSubring] + [T2Space F.valuationSubring] [CompleteSpace F.valuationSubring] + [IsTopologicalRing F.valuationSubring] + [IsLinearTopology F.valuationSubring F.valuationSubring] + (hcoeff : Continuous (coeffSubringHom (F := F) p hcard)) + (hπeval : PowerSeries.HasEval π) : + F.residueField⟦X⟧ →+* F.valuationSubring := + PowerSeries.eval₂Hom hcoeff hπeval + +/-- +Establishes the identity `powerSeriesEvalSubringHom (F := F) p hcard π hcoeff hπeval +(PowerSeries.C a) = coeffSubringHom (F := F) p hcard a`. +-/ +@[simp] theorem powerSeriesEvalSubringHom_C [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + [UniformSpace F.residueField] [IsUniformAddGroup F.residueField] + [IsTopologicalSemiring F.residueField] + [UniformSpace F.valuationSubring] [IsUniformAddGroup F.valuationSubring] + [T2Space F.valuationSubring] [CompleteSpace F.valuationSubring] + [IsTopologicalRing F.valuationSubring] + [IsLinearTopology F.valuationSubring F.valuationSubring] + (hcoeff : Continuous (coeffSubringHom (F := F) p hcard)) + (hπeval : PowerSeries.HasEval π) (a : F.residueField) : + powerSeriesEvalSubringHom (F := F) p hcard π hcoeff hπeval + (PowerSeries.C a) = + coeffSubringHom (F := F) p hcard a := by + have hfun : + ⇑(PowerSeries.eval₂Hom hcoeff hπeval) = + PowerSeries.eval₂ (coeffSubringHom (F := F) p hcard) π := + PowerSeries.coe_eval₂Hom hcoeff hπeval + have happ := congrFun hfun (PowerSeries.C a) + simpa [powerSeriesEvalSubringHom, PowerSeries.eval₂_C] using happ + +/-- +Establishes the identity `powerSeriesEvalSubringHom (F := F) p hcard π hcoeff hπeval PowerSeries.X += π`. +-/ +@[simp] theorem powerSeriesEvalSubringHom_X [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + [UniformSpace F.residueField] [IsUniformAddGroup F.residueField] + [IsTopologicalSemiring F.residueField] + [UniformSpace F.valuationSubring] [IsUniformAddGroup F.valuationSubring] + [T2Space F.valuationSubring] [CompleteSpace F.valuationSubring] + [IsTopologicalRing F.valuationSubring] + [IsLinearTopology F.valuationSubring F.valuationSubring] + (hcoeff : Continuous (coeffSubringHom (F := F) p hcard)) + (hπeval : PowerSeries.HasEval π) : + powerSeriesEvalSubringHom (F := F) p hcard π hcoeff hπeval + PowerSeries.X = + π := by + have hfun : + ⇑(PowerSeries.eval₂Hom hcoeff hπeval) = + PowerSeries.eval₂ (coeffSubringHom (F := F) p hcard) π := + PowerSeries.coe_eval₂Hom hcoeff hπeval + have happ := congrFun hfun PowerSeries.X + simpa [powerSeriesEvalSubringHom, PowerSeries.eval₂_X] using happ + +/-- The valuation-ring evaluation composed with the inclusion `O_K -> K`. -/ +noncomputable def powerSeriesEvalHom [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + [UniformSpace F.residueField] [IsUniformAddGroup F.residueField] + [IsTopologicalSemiring F.residueField] + [UniformSpace F.valuationSubring] [IsUniformAddGroup F.valuationSubring] + [T2Space F.valuationSubring] [CompleteSpace F.valuationSubring] + [IsTopologicalRing F.valuationSubring] + [IsLinearTopology F.valuationSubring F.valuationSubring] + (hcoeff : Continuous (coeffSubringHom (F := F) p hcard)) + (hπeval : PowerSeries.HasEval π) : + F.residueField⟦X⟧ →+* K := + F.valuation.valuationSubring.subtype.comp + (powerSeriesEvalSubringHom (F := F) p hcard π hcoeff hπeval) + +/-- +Establishes the identity `powerSeriesEvalHom (F := F) p hcard π hcoeff hπeval (PowerSeries.C a) = +coeffHom (F := F) p hcard a`. +-/ +@[simp] theorem powerSeriesEvalHom_C [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + [UniformSpace F.residueField] [IsUniformAddGroup F.residueField] + [IsTopologicalSemiring F.residueField] + [UniformSpace F.valuationSubring] [IsUniformAddGroup F.valuationSubring] + [T2Space F.valuationSubring] [CompleteSpace F.valuationSubring] + [IsTopologicalRing F.valuationSubring] + [IsLinearTopology F.valuationSubring F.valuationSubring] + (hcoeff : Continuous (coeffSubringHom (F := F) p hcard)) + (hπeval : PowerSeries.HasEval π) (a : F.residueField) : + powerSeriesEvalHom (F := F) p hcard π hcoeff hπeval + (PowerSeries.C a) = + coeffHom (F := F) p hcard a := by + have hsub := + powerSeriesEvalSubringHom_C + (F := F) p hcard π hcoeff hπeval a + exact congrArg F.valuation.valuationSubring.subtype hsub + +/-- +Establishes the identity `powerSeriesEvalHom (F := F) p hcard π hcoeff hπeval PowerSeries.X = (π : +K)`. +-/ +@[simp] theorem powerSeriesEvalHom_X [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + [UniformSpace F.residueField] [IsUniformAddGroup F.residueField] + [IsTopologicalSemiring F.residueField] + [UniformSpace F.valuationSubring] [IsUniformAddGroup F.valuationSubring] + [T2Space F.valuationSubring] [CompleteSpace F.valuationSubring] + [IsTopologicalRing F.valuationSubring] + [IsLinearTopology F.valuationSubring F.valuationSubring] + (hcoeff : Continuous (coeffSubringHom (F := F) p hcard)) + (hπeval : PowerSeries.HasEval π) : + powerSeriesEvalHom (F := F) p hcard π hcoeff hπeval + PowerSeries.X = + (π : K) := by + have hsub := + powerSeriesEvalSubringHom_X + (F := F) p hcard π hcoeff hπeval + exact congrArg F.valuation.valuationSubring.subtype hsub + +/-- +Proves that the specified element is a unit: `IsUnit (powerSeriesEvalHom (F := F) p hcard π hcoeff +hπeval PowerSeries.X)`. +-/ +theorem powerSeriesEvalHom_X_isUnit [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.valuation.IsUniformizer (π : K)) + [UniformSpace F.residueField] [IsUniformAddGroup F.residueField] + [IsTopologicalSemiring F.residueField] + [UniformSpace F.valuationSubring] [IsUniformAddGroup F.valuationSubring] + [T2Space F.valuationSubring] [CompleteSpace F.valuationSubring] + [IsTopologicalRing F.valuationSubring] + [IsLinearTopology F.valuationSubring F.valuationSubring] + (hcoeff : Continuous (coeffSubringHom (F := F) p hcard)) + (hπeval : PowerSeries.HasEval π) : + IsUnit + (powerSeriesEvalHom (F := F) p hcard π hcoeff hπeval + PowerSeries.X) := by + simpa using + (isUnit_iff_ne_zero.mpr hπ.ne_zero : IsUnit (π : K)) + +/-- The Laurent-series evaluation map `κ((X)) -> K` attached to the +Teichmuller coefficient field and the chosen uniformizer. -/ +noncomputable def laurentSeriesEvalHom [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.valuation.IsUniformizer (π : K)) + [UniformSpace F.residueField] [IsUniformAddGroup F.residueField] + [IsTopologicalSemiring F.residueField] + [UniformSpace F.valuationSubring] [IsUniformAddGroup F.valuationSubring] + [T2Space F.valuationSubring] [CompleteSpace F.valuationSubring] + [IsTopologicalRing F.valuationSubring] + [IsLinearTopology F.valuationSubring F.valuationSubring] + (hcoeff : Continuous (coeffSubringHom (F := F) p hcard)) + (hπeval : PowerSeries.HasEval π) : + F.residueField⸨X⸩ →+* K := + IsLocalization.Away.lift + (S := F.residueField⸨X⸩) + (P := K) + (x := (PowerSeries.X : F.residueField⟦X⟧)) + (g := powerSeriesEvalHom (F := F) p hcard π hcoeff hπeval) + (powerSeriesEvalHom_X_isUnit + (F := F) p hcard π hπ hcoeff hπeval) + +/-- +Establishes the identity `(laurentSeriesEvalHom (F := F) p hcard π hπ hcoeff hπeval).comp +(algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩) = powerSeriesEvalHom (F := F) p hcard π hcoeff +hπeval`. +-/ +theorem laurentSeriesEvalHom_comp_powerSeries [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.valuation.IsUniformizer (π : K)) + [UniformSpace F.residueField] [IsUniformAddGroup F.residueField] + [IsTopologicalSemiring F.residueField] + [UniformSpace F.valuationSubring] [IsUniformAddGroup F.valuationSubring] + [T2Space F.valuationSubring] [CompleteSpace F.valuationSubring] + [IsTopologicalRing F.valuationSubring] + [IsLinearTopology F.valuationSubring F.valuationSubring] + (hcoeff : Continuous (coeffSubringHom (F := F) p hcard)) + (hπeval : PowerSeries.HasEval π) : + (laurentSeriesEvalHom (F := F) p hcard π hπ hcoeff hπeval).comp + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩) = + powerSeriesEvalHom (F := F) p hcard π hcoeff hπeval := by + exact + IsLocalization.Away.lift_comp + (S := F.residueField⸨X⸩) + (P := K) + (x := (PowerSeries.X : F.residueField⟦X⟧)) + (g := powerSeriesEvalHom (F := F) p hcard π hcoeff hπeval) + (powerSeriesEvalHom_X_isUnit + (F := F) p hcard π hπ hcoeff hπeval) + +/-- +Establishes the identity `laurentSeriesEvalHom (F := F) p hcard π hπ hcoeff hπeval (algebraMap +F.residueField⟦X⟧ F.residueField⸨X⸩ (PowerSeries.C a)) = coeffHom (F := F) p hcard a`. +-/ +theorem laurentSeriesEvalHom_algebraMap_C + [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.valuation.IsUniformizer (π : K)) + [UniformSpace F.residueField] [IsUniformAddGroup F.residueField] + [IsTopologicalSemiring F.residueField] + [UniformSpace F.valuationSubring] [IsUniformAddGroup F.valuationSubring] + [T2Space F.valuationSubring] [CompleteSpace F.valuationSubring] + [IsTopologicalRing F.valuationSubring] + [IsLinearTopology F.valuationSubring F.valuationSubring] + (hcoeff : Continuous (coeffSubringHom (F := F) p hcard)) + (hπeval : PowerSeries.HasEval π) (a : F.residueField) : + laurentSeriesEvalHom (F := F) p hcard π hπ hcoeff hπeval + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩ + (PowerSeries.C a)) = + coeffHom (F := F) p hcard a := by + change + ((laurentSeriesEvalHom (F := F) p hcard π hπ hcoeff hπeval).comp + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩)) + (PowerSeries.C a) = + coeffHom (F := F) p hcard a + rw [laurentSeriesEvalHom_comp_powerSeries, powerSeriesEvalHom_C] + +/-- +Establishes the identity `laurentSeriesEvalHom (F := F) p hcard π hπ hcoeff hπeval (algebraMap +F.residueField⟦X⟧ F.residueField⸨X⸩ (PowerSeries.X : F.residueField⟦X⟧)) = (π : K)`. +-/ +theorem laurentSeriesEvalHom_algebraMap_X + [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.valuation.IsUniformizer (π : K)) + [UniformSpace F.residueField] [IsUniformAddGroup F.residueField] + [IsTopologicalSemiring F.residueField] + [UniformSpace F.valuationSubring] [IsUniformAddGroup F.valuationSubring] + [T2Space F.valuationSubring] [CompleteSpace F.valuationSubring] + [IsTopologicalRing F.valuationSubring] + [IsLinearTopology F.valuationSubring F.valuationSubring] + (hcoeff : Continuous (coeffSubringHom (F := F) p hcard)) + (hπeval : PowerSeries.HasEval π) : + laurentSeriesEvalHom (F := F) p hcard π hπ hcoeff hπeval + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩ + (PowerSeries.X : F.residueField⟦X⟧)) = + (π : K) := by + change + ((laurentSeriesEvalHom (F := F) p hcard π hπ hcoeff hπeval).comp + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩)) + (PowerSeries.X : F.residueField⟦X⟧) = + (π : K) + rw [laurentSeriesEvalHom_comp_powerSeries, powerSeriesEvalHom_X] + +/-- The algebra structure on `K` induced by the Laurent-series evaluation map. +This is the base algebra for the remaining finite-dimensionality step. -/ +@[reducible] noncomputable def laurentSeriesAlgebra [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.valuation.IsUniformizer (π : K)) + [UniformSpace F.residueField] [IsUniformAddGroup F.residueField] + [IsTopologicalSemiring F.residueField] + [UniformSpace F.valuationSubring] [IsUniformAddGroup F.valuationSubring] + [T2Space F.valuationSubring] [CompleteSpace F.valuationSubring] + [IsTopologicalRing F.valuationSubring] + [IsLinearTopology F.valuationSubring F.valuationSubring] + (hcoeff : Continuous (coeffSubringHom (F := F) p hcard)) + (hπeval : PowerSeries.HasEval π) : + Algebra F.residueField⸨X⸩ K := + RingHom.toAlgebra + (laurentSeriesEvalHom (F := F) p hcard π hπ hcoeff hπeval) + +/-- +Under the Laurent-series algebra structure, the algebra map evaluates a series through +`laurentSeriesEvalHom`. +-/ +theorem algebraMap_laurentSeriesAlgebra_apply + [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.valuation.IsUniformizer (π : K)) + [UniformSpace F.residueField] [IsUniformAddGroup F.residueField] + [IsTopologicalSemiring F.residueField] + [UniformSpace F.valuationSubring] [IsUniformAddGroup F.valuationSubring] + [T2Space F.valuationSubring] [CompleteSpace F.valuationSubring] + [IsTopologicalRing F.valuationSubring] + [IsLinearTopology F.valuationSubring F.valuationSubring] + (hcoeff : Continuous (coeffSubringHom (F := F) p hcard)) + (hπeval : PowerSeries.HasEval π) (x : F.residueField⸨X⸩) : + letI : Algebra F.residueField⸨X⸩ K := + laurentSeriesAlgebra + (F := F) p hcard π hπ hcoeff hπeval + algebraMap F.residueField⸨X⸩ K x = + laurentSeriesEvalHom (F := F) p hcard π hπ hcoeff hπeval x := by + rfl + +/-- The adic valuation-ring power-series evaluation with all topology +instances supplied from the complete-DVF structure. -/ +noncomputable def adicPowerSeriesEvalSubringHom + [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.valuation.IsUniformizer (π : K)) : + F.residueField⟦X⟧ →+* F.valuationSubring := by + letI : UniformSpace F.residueField := ⊥ + haveI : DiscreteUniformity F.residueField := inferInstance + haveI : IsUniformAddGroup F.residueField := + inferInstance + letI : WithIdeal F.valuationSubring := { i := F.maximalIdeal } + haveI : IsLinearTopology F.valuationSubring F.valuationSubring := by + exact valuationSubring_isLinearTopology_withIdeal (F := F) + haveI : CompleteSpace F.valuationSubring := by + exact valuationSubring_completeSpace_withIdeal (F := F) + haveI : T2Space F.valuationSubring := by + exact valuationSubring_t2Space_withIdeal (F := F) + exact + powerSeriesEvalSubringHom (F := F) p hcard π + (continuous_coeffSubringHom_of_discrete (F := F) p hcard) + (uniformizer_hasEval_valuationSubring_withIdeal (F := F) hπ) + +/-- The `π`-adic power-series evaluation onto the valuation ring is +surjective. This is the complete-DVR coefficient expansion, using the +Teichmuller representatives as digits. -/ +theorem adicPowerSeriesEvalSubringHom_surjective + [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.valuation.IsUniformizer (π : K)) : + Function.Surjective + (adicPowerSeriesEvalSubringHom (F := F) p hcard π hπ) := by + let : UniformSpace F.residueField := ⊥ + have : DiscreteUniformity F.residueField := inferInstance + have : IsUniformAddGroup F.residueField := inferInstance + let : WithIdeal F.valuationSubring := { i := F.maximalIdeal } + have : IsLinearTopology F.valuationSubring F.valuationSubring := by + exact valuationSubring_isLinearTopology_withIdeal (F := F) + have : CompleteSpace F.valuationSubring := by + exact valuationSubring_completeSpace_withIdeal (F := F) + have : T2Space F.valuationSubring := by + exact valuationSubring_t2Space_withIdeal (F := F) + intro u + let R := teichmullerRepresentativeSystem (F := F) p hcard + let f : F.residueField⟦X⟧ := + PowerSeries.mk fun d => + F.residueMap + (LubinTate.Valuations.remainder F R π hπ u d) + let term : ℕ → F.valuationSubring := fun d => + coeffSubringHom (F := F) p hcard (PowerSeries.coeff d f) * π ^ d + have hterm : ∀ d : ℕ, + term d = + LubinTate.Valuations.coeff F R π hπ u d * π ^ d := by + intro d + simp [term, f, R, teichmullerRepresentativeSystem, + LubinTate.Valuations.coeff] + have hpartial : ∀ N : ℕ, + (∑ d ∈ Finset.range N, term d) = + LubinTate.Valuations.partialSum F R π hπ u N := by + intro N + induction N with + | zero => + simp [term, LubinTate.Valuations.partialSum] + | succ N ih => + rw [Finset.sum_range_succ, ih, hterm N] + simp [LubinTate.Valuations.partialSum] + have hhas : + HasSum term + (PowerSeries.eval₂ (coeffSubringHom (F := F) p hcard) π f) := by + simpa [term] using + PowerSeries.hasSum_eval₂ + (continuous_coeffSubringHom_of_discrete (F := F) p hcard) + (uniformizer_hasEval_valuationSubring_withIdeal (F := F) hπ) f + have htend_eval : + Filter.Tendsto + (fun N => LubinTate.Valuations.partialSum F R π hπ u N) + Filter.atTop + (nhds (PowerSeries.eval₂ (coeffSubringHom (F := F) p hcard) π f)) := by + exact hhas.tendsto_sum_nat.congr' + (Filter.Eventually.of_forall fun N => hpartial N) + have htend_u : + Filter.Tendsto + (fun N => LubinTate.Valuations.partialSum F R π hπ u N) + Filter.atTop (nhds u) := by + have hwrapped := + LubinTate.Valuations.partialSum_tendsto_adic F R π hπ u + have hunderlying := + WithTopology.tendsto_nhds_iff.mp hwrapped + simpa [R] using hunderlying + have heval_eq_u : + PowerSeries.eval₂ (coeffSubringHom (F := F) p hcard) π f = u := + tendsto_nhds_unique htend_eval htend_u + have hevalHom_eq_u : + (PowerSeries.eval₂Hom + (continuous_coeffSubringHom_of_discrete (F := F) p hcard) + (uniformizer_hasEval_valuationSubring_withIdeal (F := F) hπ)) f = u := by + have hfun := + PowerSeries.coe_eval₂Hom + (continuous_coeffSubringHom_of_discrete (F := F) p hcard) + (uniformizer_hasEval_valuationSubring_withIdeal (F := F) hπ) + rw [congrFun hfun f] + exact heval_eq_u + refine ⟨f, ?_⟩ + simpa [adicPowerSeriesEvalSubringHom, powerSeriesEvalSubringHom] using + hevalHom_eq_u + +/-- The adic Laurent-series evaluation with all topology instances supplied +from the complete-DVF structure. -/ +noncomputable def adicLaurentSeriesEvalHom + [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.valuation.IsUniformizer (π : K)) : + F.residueField⸨X⸩ →+* K := by + letI : UniformSpace F.residueField := ⊥ + haveI : DiscreteUniformity F.residueField := inferInstance + haveI : IsUniformAddGroup F.residueField := + inferInstance + letI : WithIdeal F.valuationSubring := { i := F.maximalIdeal } + haveI : IsLinearTopology F.valuationSubring F.valuationSubring := by + exact valuationSubring_isLinearTopology_withIdeal (F := F) + haveI : CompleteSpace F.valuationSubring := by + exact valuationSubring_completeSpace_withIdeal (F := F) + haveI : T2Space F.valuationSubring := by + exact valuationSubring_t2Space_withIdeal (F := F) + exact + laurentSeriesEvalHom (F := F) p hcard π hπ + (continuous_coeffSubringHom_of_discrete (F := F) p hcard) + (uniformizer_hasEval_valuationSubring_withIdeal (F := F) hπ) + +/-- +Establishes the identity `adicLaurentSeriesEvalHom (F := F) p hcard π hπ (algebraMap +F.residueField⟦X⟧ F.residueField⸨X⸩ (PowerSeries.C a)) = coeffHom (F := F) p hcard a`. +-/ +theorem adicLaurentSeriesEvalHom_algebraMap_C + [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.valuation.IsUniformizer (π : K)) (a : F.residueField) : + adicLaurentSeriesEvalHom (F := F) p hcard π hπ + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩ + (PowerSeries.C a)) = + coeffHom (F := F) p hcard a := by + let : UniformSpace F.residueField := ⊥ + have : DiscreteUniformity F.residueField := inferInstance + have : IsUniformAddGroup F.residueField := + inferInstance + let : WithIdeal F.valuationSubring := { i := F.maximalIdeal } + have : IsLinearTopology F.valuationSubring F.valuationSubring := by + exact valuationSubring_isLinearTopology_withIdeal (F := F) + have : CompleteSpace F.valuationSubring := by + exact valuationSubring_completeSpace_withIdeal (F := F) + have : T2Space F.valuationSubring := by + exact valuationSubring_t2Space_withIdeal (F := F) + simpa [adicLaurentSeriesEvalHom] using + laurentSeriesEvalHom_algebraMap_C + (F := F) p hcard π hπ + (continuous_coeffSubringHom_of_discrete (F := F) p hcard) + (uniformizer_hasEval_valuationSubring_withIdeal (F := F) hπ) a + +/-- +Establishes the identity `adicLaurentSeriesEvalHom (F := F) p hcard π hπ (algebraMap +F.residueField⟦X⟧ F.residueField⸨X⸩ (PowerSeries.X : F.residueField⟦X⟧)) = (π : K)`. +-/ +theorem adicLaurentSeriesEvalHom_algebraMap_X + [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.valuation.IsUniformizer (π : K)) : + adicLaurentSeriesEvalHom (F := F) p hcard π hπ + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩ + (PowerSeries.X : F.residueField⟦X⟧)) = + (π : K) := by + let : UniformSpace F.residueField := ⊥ + have : DiscreteUniformity F.residueField := inferInstance + have : IsUniformAddGroup F.residueField := + inferInstance + let : WithIdeal F.valuationSubring := { i := F.maximalIdeal } + have : IsLinearTopology F.valuationSubring F.valuationSubring := by + exact valuationSubring_isLinearTopology_withIdeal (F := F) + have : CompleteSpace F.valuationSubring := by + exact valuationSubring_completeSpace_withIdeal (F := F) + have : T2Space F.valuationSubring := by + exact valuationSubring_t2Space_withIdeal (F := F) + simpa [adicLaurentSeriesEvalHom] using + laurentSeriesEvalHom_algebraMap_X + (F := F) p hcard π hπ + (continuous_coeffSubringHom_of_discrete (F := F) p hcard) + (uniformizer_hasEval_valuationSubring_withIdeal (F := F) hπ) + +/-- +Establishes the identity `(adicLaurentSeriesEvalHom (F := F) p hcard π hπ).comp (algebraMap +F.residueField⟦X⟧ F.residueField⸨X⸩) = F.valuation.valuationSubring.subtype.comp +(adicPowerSeriesEvalSubringHom (F := F) p hcard π hπ)`. +-/ +theorem adicLaurentSeriesEvalHom_comp_powerSeries + [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.valuation.IsUniformizer (π : K)) : + (adicLaurentSeriesEvalHom (F := F) p hcard π hπ).comp + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩) = + F.valuation.valuationSubring.subtype.comp + (adicPowerSeriesEvalSubringHom (F := F) p hcard π hπ) := by + let : UniformSpace F.residueField := ⊥ + have : DiscreteUniformity F.residueField := inferInstance + have : IsUniformAddGroup F.residueField := inferInstance + let : WithIdeal F.valuationSubring := { i := F.maximalIdeal } + have : IsLinearTopology F.valuationSubring F.valuationSubring := by + exact valuationSubring_isLinearTopology_withIdeal (F := F) + have : CompleteSpace F.valuationSubring := by + exact valuationSubring_completeSpace_withIdeal (F := F) + have : T2Space F.valuationSubring := by + exact valuationSubring_t2Space_withIdeal (F := F) + simpa [adicLaurentSeriesEvalHom, adicPowerSeriesEvalSubringHom, + powerSeriesEvalHom] using + laurentSeriesEvalHom_comp_powerSeries + (F := F) p hcard π hπ + (continuous_coeffSubringHom_of_discrete (F := F) p hcard) + (uniformizer_hasEval_valuationSubring_withIdeal (F := F) hπ) + +/-- The equal-characteristic Laurent-series evaluation is onto the field. -/ +theorem adicLaurentSeriesEvalHom_surjective + [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.valuation.IsUniformizer (π : K)) : + Function.Surjective + (adicLaurentSeriesEvalHom (F := F) p hcard π hπ) := by + intro x + by_cases hx : x = 0 + · refine ⟨0, ?_⟩ + simp [hx] + rcases LubinTate.Valuations.exists_laurent_unit F π hπ hx with + ⟨m, u, _hu, hx_eq⟩ + rcases adicPowerSeriesEvalSubringHom_surjective + (F := F) p hcard π hπ u with + ⟨f, hf⟩ + let Xls : F.residueField⸨X⸩ := + algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩ + (PowerSeries.X : F.residueField⟦X⟧) + let y : F.residueField⸨X⸩ := + Xls ^ m * + algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩ f + refine ⟨y, ?_⟩ + have hcomp := + congrFun + (congrArg DFunLike.coe + (adicLaurentSeriesEvalHom_comp_powerSeries + (F := F) p hcard π hπ)) f + have hX : + adicLaurentSeriesEvalHom (F := F) p hcard π hπ Xls = (π : K) := by + simpa [Xls] using + adicLaurentSeriesEvalHom_algebraMap_X + (F := F) p hcard π hπ + have hpow : + adicLaurentSeriesEvalHom (F := F) p hcard π hπ (Xls ^ m) = + (π : K) ^ m := by + rw [map_zpow₀, hX] + have halg : + adicLaurentSeriesEvalHom (F := F) p hcard π hπ + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩ f) = + (u : K) := by + exact hcomp.trans (congrArg F.valuation.valuationSubring.subtype hf) + calc + adicLaurentSeriesEvalHom (F := F) p hcard π hπ y + = + (π : K) ^ m * (u : K) := by + change + adicLaurentSeriesEvalHom (F := F) p hcard π hπ + (Xls ^ m * + algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩ f) = + (π : K) ^ m * (u : K) + rw [map_mul, hpow, halg] + _ = x := hx_eq.symm + +end EqualCharacteristicLaurent +end CompleteDVF + +/-- If the structure map of an algebra over a field is onto, the algebra is +one-dimensional as a vector space over the base. -/ +theorem finiteDimensional_of_surjective_algebraMap + (E L : Type u) [Field E] [Field L] [Algebra E L] + (hsurj : Function.Surjective (algebraMap E L)) : + FiniteDimensional E L := by + exact + FiniteDimensional.of_surjective (Algebra.linearMap E L) <| by + simpa [Algebra.coe_linearMap] using hsurj + +namespace LocalField + +open scoped PowerSeries LaurentSeries Filter Topology BigOperators + +variable {K : Type u} [Field K] +variable (F : LocalField.{u, v} K) + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent + (adicLaurentSeriesEvalHom) in +/-- The image in `K` of the equal-characteristic Laurent-series evaluation. +This is the candidate base field for the converse direction of the local-field structure + classification. -/ +noncomputable def laurentImageSubfield + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + Subfield K := + (adicLaurentSeriesEvalHom + (F := F.toCompleteDVF) p hcard π hπ).fieldRange + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent + (adicLaurentSeriesEvalHom) in +/-- +Establishes the membership statement +`CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom (F := F.toCompleteDVF) p hcard π +hπ x ∈ F.laurentImageSubfield p hcard π hπ`. +-/ +theorem adicLaurentSeriesEval_mem_laurentImageSubfield + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (x : F.residueField⸨X⸩) : + adicLaurentSeriesEvalHom + (F := F.toCompleteDVF) p hcard π hπ x ∈ + F.laurentImageSubfield p hcard π hπ := + RingHom.mem_fieldRange_self + (adicLaurentSeriesEvalHom + (F := F.toCompleteDVF) p hcard π hπ) x + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent + (adicLaurentSeriesEvalHom_surjective) in +/-- Establishes the identity `F.laurentImageSubfield p hcard π hπ = ⊤`. -/ +theorem laurentImageSubfield_eq_top + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + F.laurentImageSubfield p hcard π hπ = ⊤ := by + ext x + constructor + · intro _hx + trivial + · intro _hx + rcases + adicLaurentSeriesEvalHom_surjective + (F := F.toCompleteDVF) p hcard π hπ x with + ⟨y, hy⟩ + exact (RingHom.mem_fieldRange).2 ⟨y, hy⟩ + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent + (adicLaurentSeriesEvalHom) in +/-- The Laurent-series field is identified with its image in `K`. -/ +noncomputable def laurentSeriesEquivLaurentImageSubfield + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + F.residueField⸨X⸩ ≃+* + F.laurentImageSubfield p hcard π hπ := + RingHom.rangeRestrictFieldEquiv + (adicLaurentSeriesEvalHom + (F := F.toCompleteDVF) p hcard π hπ) + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent + (adicLaurentSeriesEvalHom) in +/-- +Establishes the identity `((F.laurentSeriesEquivLaurentImageSubfield p hcard π hπ x : +F.laurentImageSubfield p hcard π hπ) : K) = +CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom (F := F.toCompleteDVF) p hcard π +hπ x`. +-/ +@[simp] theorem laurentSeriesEquivLaurentImageSubfield_apply_coe + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (x : F.residueField⸨X⸩) : + ((F.laurentSeriesEquivLaurentImageSubfield p hcard π hπ x : + F.laurentImageSubfield p hcard π hπ) : K) = + adicLaurentSeriesEvalHom + (F := F.toCompleteDVF) p hcard π hπ x := by + rfl + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent + (adicLaurentSeriesEvalHom_algebraMap_C) in +/-- +Establishes the identity `((F.laurentSeriesEquivLaurentImageSubfield p hcard π hπ (algebraMap +F.residueField⟦X⟧ F.residueField⸨X⸩ (PowerSeries.C a)) : F.laurentImageSubfield p hcard π hπ) : K) += CompleteDVF.EqualCharacteristicLaurent.coeffHom (F := F.toCompleteDVF) p hcard a`. +-/ +theorem laurentSeriesEquivLaurentImageSubfield_algebraMap_C + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) + (a : F.residueField) : + ((F.laurentSeriesEquivLaurentImageSubfield p hcard π hπ + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩ + (PowerSeries.C a)) : + F.laurentImageSubfield p hcard π hπ) : K) = + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent.coeffHom + (F := F.toCompleteDVF) p hcard a := by + simpa using + adicLaurentSeriesEvalHom_algebraMap_C + (F := F.toCompleteDVF) p hcard π hπ a + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent + (adicLaurentSeriesEvalHom_algebraMap_X) in +/-- +Establishes the identity `((F.laurentSeriesEquivLaurentImageSubfield p hcard π hπ (algebraMap +F.residueField⟦X⟧ F.residueField⸨X⸩ (PowerSeries.X : F.residueField⟦X⟧)) : F.laurentImageSubfield +p hcard π hπ) : K) = (π : K)`. +-/ +theorem laurentSeriesEquivLaurentImageSubfield_algebraMap_X + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + ((F.laurentSeriesEquivLaurentImageSubfield p hcard π hπ + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩ + (PowerSeries.X : F.residueField⟦X⟧)) : + F.laurentImageSubfield p hcard π hπ) : K) = + (π : K) := by + simpa using + adicLaurentSeriesEvalHom_algebraMap_X + (F := F.toCompleteDVF) p hcard π hπ + +/-- The image base field is nontrivially normed by the norm induced from the +range-restricted valuation topology on `K`. -/ +@[implicit_reducible] +noncomputable def laurentImageSubfieldNontriviallyNormedField + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + letI : Valued K + (MonoidHom.mrange F.toCompleteDVF.valuation.toMonoidWithZeroHom) := + ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF)) + letI : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + NontriviallyNormedField + (F.laurentImageSubfield p hcard π hπ) := by + let Γ : Type v := + MonoidHom.mrange F.toCompleteDVF.valuation.toMonoidWithZeroHom + letI : Valued K Γ := + ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF)) + haveI : (Valued.v : _root_.Valuation K Γ).RankOne := by + change + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F.toCompleteDVF).RankOne + exact + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictRankOne + F.toCompleteDVF + letI : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + let piSub : F.laurentImageSubfield p hcard π hπ := + F.laurentSeriesEquivLaurentImageSubfield p hcard π hπ + (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩ + (PowerSeries.X : F.residueField⟦X⟧)) + have hpiSub_coe : (piSub : K) = (π : K) := by + simpa [piSub] using + F.laurentSeriesEquivLaurentImageSubfield_algebraMap_X + p hcard π hπ + refine NontriviallyNormedField.ofNormNeOne ?_ + refine ⟨piSub, ?_, ?_⟩ + · intro hzero + have hzeroK : (piSub : K) = 0 := by + simpa using congrArg Subtype.val hzero + rw [hpiSub_coe] at hzeroK + exact hπ.ne_zero hzeroK + · have hπ_lt_one : + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F.toCompleteDVF (π : K) < 1 := by + rw [← Subtype.coe_lt_coe] + simpa [Γ, _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_apply] + using hπ.val_lt_one + have hπ_norm_lt_one_K : ‖(π : K)‖ < 1 := by + simpa [_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued] using + (Valued.toNormedField.norm_lt_one_iff + (x := (π : K))).2 hπ_lt_one + have hπ_norm_lt_one : ‖piSub‖ < 1 := by + change ‖(piSub : K)‖ < 1 + simpa [hpiSub_coe] using hπ_norm_lt_one_K + exact ne_of_lt hπ_norm_lt_one + +/-- The ambient local field is a normed algebra over the Laurent image base. -/ +@[implicit_reducible] +noncomputable def laurentImageSubfieldNormedAlgebra + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + letI : Valued K + (MonoidHom.mrange F.toCompleteDVF.valuation.toMonoidWithZeroHom) := + ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF)) + letI : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + letI : NontriviallyNormedField + (F.laurentImageSubfield p hcard π hπ) := + F.laurentImageSubfieldNontriviallyNormedField p hcard π hπ + NormedAlgebra (F.laurentImageSubfield p hcard π hπ) K := by + let Γ : Type v := + MonoidHom.mrange F.toCompleteDVF.valuation.toMonoidWithZeroHom + letI : Valued K Γ := + ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF)) + letI : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + letI : NontriviallyNormedField + (F.laurentImageSubfield p hcard π hπ) := + F.laurentImageSubfieldNontriviallyNormedField p hcard π hπ + exact + { (inferInstance : + Algebra (F.laurentImageSubfield p hcard π hπ) K) with + norm_smul_le := fun a x => by + change ‖(a : K) * x‖ ≤ ‖(a : K)‖ * ‖x‖ + exact norm_mul_le (a : K) x } + +/-- The local field is finite-dimensional over the image of the Laurent-series +base field. -/ +theorem finiteDimensional_over_laurentImageSubfield + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + letI : Valued K + (MonoidHom.mrange F.toCompleteDVF.valuation.toMonoidWithZeroHom) := + ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF)) + letI : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + letI : NontriviallyNormedField + (F.laurentImageSubfield p hcard π hπ) := + F.laurentImageSubfieldNontriviallyNormedField p hcard π hπ + letI : NormedAlgebra + (F.laurentImageSubfield p hcard π hπ) K := + F.laurentImageSubfieldNormedAlgebra p hcard π hπ + FiniteDimensional (F.laurentImageSubfield p hcard π hπ) K := by + let Γ : Type v := + MonoidHom.mrange F.toCompleteDVF.valuation.toMonoidWithZeroHom + let : Valued K Γ := + ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF)) + let : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + let : NontriviallyNormedField + (F.laurentImageSubfield p hcard π hπ) := + F.laurentImageSubfieldNontriviallyNormedField p hcard π hπ + let : NormedAlgebra + (F.laurentImageSubfield p hcard π hπ) K := + F.laurentImageSubfieldNormedAlgebra p hcard π hπ + have htop : F.laurentImageSubfield p hcard π hπ = ⊤ := + F.laurentImageSubfield_eq_top p hcard π hπ + have hsurj : + Function.Surjective + (algebraMap (F.laurentImageSubfield p hcard π hπ) K) := by + intro x + have hxmem : x ∈ F.laurentImageSubfield p hcard π hπ := by + rw [htop] + trivial + exact ⟨⟨x, hxmem⟩, rfl⟩ + exact + finiteDimensional_of_surjective_algebraMap + (F.laurentImageSubfield p hcard π hπ) K hsurj + +/-- The actual Laurent-series base acts on `K` through the image subfield. -/ +@[reducible] noncomputable def laurentSeriesAlgebra + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + Algebra F.residueField⸨X⸩ K := + RingHom.toAlgebra + ((F.laurentImageSubfield p hcard π hπ).subtype.comp + (F.laurentSeriesEquivLaurentImageSubfield p hcard π hπ : + F.residueField⸨X⸩ →+* + F.laurentImageSubfield p hcard π hπ)) + +/-- +The Laurent-series algebra map is the series equivalence followed by inclusion of the Laurent +image subfield. +-/ +theorem laurentSeriesAlgebra_algebraMap + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + letI : Algebra F.residueField⸨X⸩ K := + F.laurentSeriesAlgebra p hcard π hπ + algebraMap F.residueField⸨X⸩ K = + (F.laurentImageSubfield p hcard π hπ).subtype.comp + (F.laurentSeriesEquivLaurentImageSubfield p hcard π hπ : + F.residueField⸨X⸩ →+* + F.laurentImageSubfield p hcard π hπ) := by + rfl + +/-- The local field is finite-dimensional over the actual Laurent-series +base field. -/ +theorem finiteDimensional_over_laurentSeries + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (π : F.valuationSubring) + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : + letI : Algebra F.residueField⸨X⸩ K := + F.laurentSeriesAlgebra p hcard π hπ + FiniteDimensional F.residueField⸨X⸩ K := by + let : Algebra F.residueField⸨X⸩ K := + F.laurentSeriesAlgebra p hcard π hπ + let Γ : Type v := + MonoidHom.mrange F.toCompleteDVF.valuation.toMonoidWithZeroHom + let : Valued K Γ := + ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF)) + let : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + let : NontriviallyNormedField + (F.laurentImageSubfield p hcard π hπ) := + F.laurentImageSubfieldNontriviallyNormedField p hcard π hπ + let : NormedAlgebra + (F.laurentImageSubfield p hcard π hπ) K := + F.laurentImageSubfieldNormedAlgebra p hcard π hπ + have : FiniteDimensional + (F.laurentImageSubfield p hcard π hπ) K := + F.finiteDimensional_over_laurentImageSubfield p hcard π hπ + have hcompat : + (algebraMap (F.laurentImageSubfield p hcard π hπ) K).comp + (F.laurentSeriesEquivLaurentImageSubfield p hcard π hπ : + F.residueField⸨X⸩ →+* + F.laurentImageSubfield p hcard π hπ) = + (RingEquiv.refl K).toRingHom.comp + (algebraMap F.residueField⸨X⸩ K) := by + ext x + rfl + have hrank : + Module.rank F.residueField⸨X⸩ K = + Module.rank (F.laurentImageSubfield p hcard π hπ) K := by + simpa using + (Algebra.rank_eq_of_equiv_equiv + (F.laurentSeriesEquivLaurentImageSubfield p hcard π hπ) + (RingEquiv.refl K) hcompat) + exact + FiniteDimensional.of_rank_eq_nat + (n := Module.finrank + (F.laurentImageSubfield p hcard π hπ) K) <| by + simpa [Module.finrank_eq_rank'] using hrank + +/-- The local-field structure classification, equal-characteristic converse branch: after choosing a +uniformizer and the finite residue field as coefficient field, `K` is +finite-dimensional over `κ((X))`. -/ +theorem equalCharacteristic_exists_laurent_finiteExtension + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] + {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) : + ∃ π : F.valuationSubring, + ∃ _hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K), + ∃ hAlg : Algebra F.residueField⸨X⸩ K, + letI : Algebra F.residueField⸨X⸩ K := hAlg + FiniteDimensional F.residueField⸨X⸩ K := by + rcases F.exists_uniformizer with ⟨π, hπ⟩ + exact + ⟨π, hπ, F.laurentSeriesAlgebra p hcard π hπ, + F.finiteDimensional_over_laurentSeries p hcard π hπ⟩ + +end LocalField +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNorm.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNorm.lean new file mode 100644 index 0000000000..5b35059d18 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNorm.lean @@ -0,0 +1,1938 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NormUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.NormFiltration +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValueGroup + +/-! # Field Norm -/ + +@[expose] public section +namespace LocalFieldTheory + +/-! +# Field norm on unit groups + +This file connects mathlib's `Algebra.norm` with the unit-group and valued-norm +APIs used by local CFT. +-/ + +noncomputable +section + +universe u v w + +namespace DiscreteValuationField + +variable (K : Type u) (L : Type v) +variable [Field K] [Field L] [Algebra K L] + +/-- The norm subgroup of `Kˣ` attached to `L/K`. -/ +noncomputable def fieldNormSubgroup : Subgroup Kˣ := + (normUnits K L).range + +/-- The norm subgroup from the top field of a tower lies in the norm subgroup from the +intermediate field. -/ +theorem fieldNormSubgroup_le_of_tower + (E : Type w) [Field E] [Algebra K E] [Algebra E L] [IsScalarTower K E L] + [Module.Free E L] : + fieldNormSubgroup K L ≤ fieldNormSubgroup K E := by + intro x hx + rcases hx with ⟨z, hz⟩ + exact ⟨normUnits E L z, by + rw [normUnits_tower K E L z, hz]⟩ + +/-- +Characterizes `fieldNormSubgroup K L = ⊤` by the equivalent condition `Function.Surjective +(normUnits K L)`. +-/ +theorem fieldNormSubgroup_eq_top_iff : + fieldNormSubgroup K L = ⊤ ↔ Function.Surjective (normUnits K L) := by + rw [fieldNormSubgroup, MonoidHom.range_eq_top] + +/-- +Characterizes `z ∈ MonoidHom.ker (normUnits K L)` by the equivalent condition `Algebra.norm K +(z : L) = 1`. +-/ +theorem mem_fieldNormUnits_ker_iff_norm_eq_one (z : Lˣ) : + z ∈ MonoidHom.ker (normUnits K L) ↔ + Algebra.norm K (z : L) = 1 := by + rw [MonoidHom.mem_ker] + constructor + · intro hz + exact congrArg (fun u : Kˣ => (u : K)) hz + · intro hz + ext + simpa using hz + +/-- First-isomorphism-theorem form for the field norm on unit groups: +`Lˣ / ker(N)` is the norm subgroup of `Kˣ`. -/ +noncomputable def fieldNormUnitsQuotientKerEquivFieldNormSubgroup : + Lˣ ⧸ MonoidHom.ker (normUnits K L) ≃* + fieldNormSubgroup K L := + QuotientGroup.quotientKerEquivRange (normUnits K L) + +/-- +Establishes the identity `fieldNormUnitsQuotientKerEquivFieldNormSubgroup K L (QuotientGroup.mk' +(MonoidHom.ker (normUnits K L)) z) = (normUnits K L).rangeRestrict z`. +-/ +theorem fieldNormUnitsQuotientKerEquivFieldNormSubgroup_mk + (z : Lˣ) : + fieldNormUnitsQuotientKerEquivFieldNormSubgroup K L + (QuotientGroup.mk' + (MonoidHom.ker (normUnits K L)) z) = + (normUnits K L).rangeRestrict z := + rfl + +/-- +Establishes the identity `((fieldNormUnitsQuotientKerEquivFieldNormSubgroup K L (QuotientGroup.mk' +(MonoidHom.ker (normUnits K L)) z) : fieldNormSubgroup K L) : Kˣ) = normUnits K L z`. +-/ +theorem coe_fieldNormUnitsQuotientKerEquivFieldNormSubgroup_mk + (z : Lˣ) : + ((fieldNormUnitsQuotientKerEquivFieldNormSubgroup K L + (QuotientGroup.mk' + (MonoidHom.ker (normUnits K L)) z) : + fieldNormSubgroup K L) : Kˣ) = + normUnits K L z := + rfl + +/-- The quotient map `Kˣ → Kˣ / N_{L/K}(Lˣ)` attached to the field norm. -/ +noncomputable def fieldNormQuotientMap : + Kˣ →* Kˣ ⧸ fieldNormSubgroup K L := + QuotientGroup.mk' (fieldNormSubgroup K L) + +/-- +The defining evaluation formula for `fieldNormQuotientMap` is `fieldNormQuotientMap K L x = +QuotientGroup.mk' (fieldNormSubgroup K L) x`. +-/ +@[simp] theorem fieldNormQuotientMap_apply (x : Kˣ) : + fieldNormQuotientMap K L x = + QuotientGroup.mk' (fieldNormSubgroup K L) x := + rfl + +/-- The kernel of the norm quotient map is exactly the field-norm subgroup. -/ +theorem fieldNormQuotientMap_ker : + MonoidHom.ker (fieldNormQuotientMap K L) = fieldNormSubgroup K L := + by + rw [fieldNormQuotientMap] + exact QuotientGroup.ker_mk' (fieldNormSubgroup K L) + +/-- +Characterizes `fieldNormQuotientMap K L x = 1` by the equivalent condition `x ∈ fieldNormSubgroup +K L`. +-/ +theorem fieldNormQuotientMap_eq_one_iff (x : Kˣ) : + fieldNormQuotientMap K L x = 1 ↔ + x ∈ fieldNormSubgroup K L := by + rw [← MonoidHom.mem_ker, fieldNormQuotientMap_ker] + +/-- +Characterizes `fieldNormQuotientMap K L x = 1` by the equivalent condition `∃ z : Lˣ, +normUnits K L z = x`. +-/ +theorem fieldNormQuotientMap_eq_one_iff_exists_norm_eq (x : Kˣ) : + fieldNormQuotientMap K L x = 1 ↔ + ∃ z : Lˣ, normUnits K L z = x := by + rw [fieldNormQuotientMap_eq_one_iff K L x] + exact MonoidHom.mem_range + +/-- +Characterizes `fieldNormQuotientMap K L x = fieldNormQuotientMap K L y` by the equivalent +condition `x / y ∈ fieldNormSubgroup K L`. +-/ +theorem fieldNormQuotientMap_eq_iff_div_mem (x y : Kˣ) : + fieldNormQuotientMap K L x = fieldNormQuotientMap K L y ↔ + x / y ∈ fieldNormSubgroup K L := by + simpa [fieldNormQuotientMap] using + (QuotientGroup.eq_iff_div_mem + (N := fieldNormSubgroup K L) (x := x) (y := y)) + +/-- +Characterizes `x / y ∈ fieldNormSubgroup K L` by the equivalent condition `y⁻¹ * x ∈ +fieldNormSubgroup K L`. +-/ +theorem fieldNormSubgroup_div_mem_iff_inv_mul_mem (x y : Kˣ) : + x / y ∈ fieldNormSubgroup K L ↔ + y⁻¹ * x ∈ fieldNormSubgroup K L := by + simp [div_eq_mul_inv, mul_comm] + +/-- +Characterizes `y⁻¹ * x ∈ fieldNormSubgroup K L` by the equivalent condition `x / y ∈ +fieldNormSubgroup K L`. +-/ +theorem fieldNormSubgroup_inv_mul_mem_iff_div_mem (x y : Kˣ) : + y⁻¹ * x ∈ fieldNormSubgroup K L ↔ + x / y ∈ fieldNormSubgroup K L := + (fieldNormSubgroup_div_mem_iff_inv_mul_mem K L x y).symm + +/-- +Characterizes `x / y ∈ fieldNormSubgroup K L` by the equivalent condition `∃ z : Lˣ, +normUnits K L z * y = x`. +-/ +theorem fieldNormSubgroup_div_mem_iff_exists_norm_mul_eq + (x y : Kˣ) : + x / y ∈ fieldNormSubgroup K L ↔ + ∃ z : Lˣ, normUnits K L z * y = x := by + constructor + · rintro ⟨z, hz⟩ + exact ⟨z, by rw [hz]; simp [div_eq_mul_inv, mul_assoc]⟩ + · rintro ⟨z, hz⟩ + refine ⟨z, ?_⟩ + have h := congrArg (fun t : Kˣ => t * y⁻¹) hz + simpa [div_eq_mul_inv, mul_assoc] using h + +/-- +Characterizes `y⁻¹ * x ∈ fieldNormSubgroup K L` by the equivalent condition `∃ z : Lˣ, y * +normUnits K L z = x`. +-/ +theorem fieldNormSubgroup_inv_mul_mem_iff_exists_mul_norm_eq + (x y : Kˣ) : + y⁻¹ * x ∈ fieldNormSubgroup K L ↔ + ∃ z : Lˣ, y * normUnits K L z = x := by + rw [fieldNormSubgroup_inv_mul_mem_iff_div_mem K L x y, + fieldNormSubgroup_div_mem_iff_exists_norm_mul_eq K L x y] + constructor + · rintro ⟨z, hz⟩ + exact ⟨z, by simpa [mul_comm, mul_left_comm, mul_assoc] using hz⟩ + · rintro ⟨z, hz⟩ + exact ⟨z, by simpa [mul_comm, mul_left_comm, mul_assoc] using hz⟩ + +/-- +Characterizes `QuotientGroup.mk' (fieldNormSubgroup K L) x = 1` by the equivalent condition `x ∈ +fieldNormSubgroup K L`. +-/ +theorem fieldNormQuotient_mk_eq_one_iff (x : Kˣ) : + QuotientGroup.mk' (fieldNormSubgroup K L) x = 1 ↔ + x ∈ fieldNormSubgroup K L := by + rw [QuotientGroup.mk'_apply] + exact QuotientGroup.eq_one_iff (N := fieldNormSubgroup K L) x + +/-- +Characterizes `QuotientGroup.mk' (fieldNormSubgroup K L) x = 1` by the equivalent condition `∃ z : +Lˣ, normUnits K L z = x`. +-/ +theorem fieldNormQuotient_mk_eq_one_iff_exists_norm_eq (x : Kˣ) : + QuotientGroup.mk' (fieldNormSubgroup K L) x = 1 ↔ + ∃ z : Lˣ, normUnits K L z = x := by + rw [fieldNormQuotient_mk_eq_one_iff K L x] + exact MonoidHom.mem_range + +/-- +Establishes the identity `QuotientGroup.mk' (fieldNormSubgroup K L) (normUnits K L z) = 1`. +-/ +theorem fieldNormQuotient_norm_mk_eq_one (z : Lˣ) : + QuotientGroup.mk' (fieldNormSubgroup K L) + (normUnits K L z) = 1 := + (fieldNormQuotient_mk_eq_one_iff K L + (normUnits K L z)).2 + ((MonoidHom.mem_range (f := normUnits K L)).2 ⟨z, rfl⟩) + +/-- +Characterizes `(QuotientGroup.mk' (fieldNormSubgroup K L) x) ^ n = 1` by the equivalent condition +`x ^ n ∈ fieldNormSubgroup K L`. +-/ +theorem fieldNormQuotient_mk_pow_eq_one_iff_pow_mem + (x : Kˣ) (n : ℕ) : + (QuotientGroup.mk' (fieldNormSubgroup K L) x) ^ n = 1 ↔ + x ^ n ∈ fieldNormSubgroup K L := by + rw [← (QuotientGroup.mk' (fieldNormSubgroup K L)).map_pow, + fieldNormQuotient_mk_eq_one_iff K L (x ^ n)] + +/-- +Characterizes `(QuotientGroup.mk' (fieldNormSubgroup K L) x) ^ n = 1` by the equivalent condition +`∃ z : Lˣ, normUnits K L z = x ^ n`. +-/ +theorem fieldNormQuotient_mk_pow_eq_one_iff_exists_norm_eq_pow + (x : Kˣ) (n : ℕ) : + (QuotientGroup.mk' (fieldNormSubgroup K L) x) ^ n = 1 ↔ + ∃ z : Lˣ, normUnits K L z = x ^ n := by + rw [fieldNormQuotient_mk_pow_eq_one_iff_pow_mem K L x n] + exact MonoidHom.mem_range + +/-- +Characterizes `q ^ n = 1` by the equivalent condition `∃ x : Kˣ, QuotientGroup.mk' +(fieldNormSubgroup K L) x = q ∧ x ^ n ∈ fieldNormSubgroup K L`. +-/ +theorem fieldNormQuotient_pow_eq_one_iff_exists_pow_mem + (q : Kˣ ⧸ fieldNormSubgroup K L) (n : ℕ) : + q ^ n = 1 ↔ + ∃ x : Kˣ, QuotientGroup.mk' (fieldNormSubgroup K L) x = q ∧ + x ^ n ∈ fieldNormSubgroup K L := by + constructor + · intro hq + rcases QuotientGroup.mk'_surjective (fieldNormSubgroup K L) q with + ⟨x, rfl⟩ + exact ⟨x, rfl, + (fieldNormQuotient_mk_pow_eq_one_iff_pow_mem K L x n).1 hq⟩ + · rintro ⟨x, hxq, hx⟩ + rw [← hxq] + exact (fieldNormQuotient_mk_pow_eq_one_iff_pow_mem K L x n).2 hx + +/-- +Characterizes `q ^ n = 1` by the equivalent condition `∃ x : Kˣ, QuotientGroup.mk' +(fieldNormSubgroup K L) x = q ∧ ∃ z : Lˣ, normUnits K L z = x ^ n`. +-/ +theorem fieldNormQuotient_pow_eq_one_iff_exists_norm_eq_pow + (q : Kˣ ⧸ fieldNormSubgroup K L) (n : ℕ) : + q ^ n = 1 ↔ + ∃ x : Kˣ, QuotientGroup.mk' (fieldNormSubgroup K L) x = q ∧ + ∃ z : Lˣ, normUnits K L z = x ^ n := by + rw [fieldNormQuotient_pow_eq_one_iff_exists_pow_mem K L q n] + constructor + · rintro ⟨x, hxq, hx⟩ + exact ⟨x, hxq, + (MonoidHom.mem_range (f := normUnits K L)).1 hx⟩ + · rintro ⟨x, hxq, hz⟩ + exact ⟨x, hxq, + (MonoidHom.mem_range (f := normUnits K L)).2 hz⟩ + +/-- +Characterizes `(QuotientGroup.mk' (fieldNormSubgroup K L) x) ^ n = 1` by the equivalent condition +`x ^ n ∈ fieldNormSubgroup K L`. +-/ +theorem fieldNormQuotient_mk_zpow_eq_one_iff_zpow_mem + (x : Kˣ) (n : ℤ) : + (QuotientGroup.mk' (fieldNormSubgroup K L) x) ^ n = 1 ↔ + x ^ n ∈ fieldNormSubgroup K L := by + have hpow : QuotientGroup.mk' (fieldNormSubgroup K L) (x ^ n) = + (QuotientGroup.mk' (fieldNormSubgroup K L) x) ^ n := + map_zpow (QuotientGroup.mk' (fieldNormSubgroup K L)) x n + rw [← hpow, + fieldNormQuotient_mk_eq_one_iff K L (x ^ n)] + +/-- +Characterizes `(QuotientGroup.mk' (fieldNormSubgroup K L) x) ^ n = 1` by the equivalent condition +`∃ z : Lˣ, normUnits K L z = x ^ n`. +-/ +theorem fieldNormQuotient_mk_zpow_eq_one_iff_exists_norm_eq_zpow + (x : Kˣ) (n : ℤ) : + (QuotientGroup.mk' (fieldNormSubgroup K L) x) ^ n = 1 ↔ + ∃ z : Lˣ, normUnits K L z = x ^ n := by + rw [fieldNormQuotient_mk_zpow_eq_one_iff_zpow_mem K L x n] + exact MonoidHom.mem_range + +/-- +Characterizes `q ^ n = 1` by the equivalent condition `∃ x : Kˣ, QuotientGroup.mk' +(fieldNormSubgroup K L) x = q ∧ x ^ n ∈ fieldNormSubgroup K L`. +-/ +theorem fieldNormQuotient_zpow_eq_one_iff_exists_zpow_mem + (q : Kˣ ⧸ fieldNormSubgroup K L) (n : ℤ) : + q ^ n = 1 ↔ + ∃ x : Kˣ, QuotientGroup.mk' (fieldNormSubgroup K L) x = q ∧ + x ^ n ∈ fieldNormSubgroup K L := by + constructor + · intro hq + rcases QuotientGroup.mk'_surjective (fieldNormSubgroup K L) q with + ⟨x, rfl⟩ + exact ⟨x, rfl, + (fieldNormQuotient_mk_zpow_eq_one_iff_zpow_mem K L x n).1 hq⟩ + · rintro ⟨x, hxq, hx⟩ + rw [← hxq] + exact (fieldNormQuotient_mk_zpow_eq_one_iff_zpow_mem K L x n).2 hx + +/-- +Characterizes `q ^ n = 1` by the equivalent condition `∃ x : Kˣ, QuotientGroup.mk' +(fieldNormSubgroup K L) x = q ∧ ∃ z : Lˣ, normUnits K L z = x ^ n`. +-/ +theorem fieldNormQuotient_zpow_eq_one_iff_exists_norm_eq_zpow + (q : Kˣ ⧸ fieldNormSubgroup K L) (n : ℤ) : + q ^ n = 1 ↔ + ∃ x : Kˣ, QuotientGroup.mk' (fieldNormSubgroup K L) x = q ∧ + ∃ z : Lˣ, normUnits K L z = x ^ n := by + rw [fieldNormQuotient_zpow_eq_one_iff_exists_zpow_mem K L q n] + constructor + · rintro ⟨x, hxq, hx⟩ + exact ⟨x, hxq, + (MonoidHom.mem_range (f := normUnits K L)).1 hx⟩ + · rintro ⟨x, hxq, hz⟩ + exact ⟨x, hxq, + (MonoidHom.mem_range (f := normUnits K L)).2 hz⟩ + +/-- +Characterizes `QuotientGroup.mk' (fieldNormSubgroup K L) x = QuotientGroup.mk' (fieldNormSubgroup +K L) y` by the equivalent condition `x / y ∈ fieldNormSubgroup K L`. +-/ +theorem fieldNormQuotient_mk_eq_iff_div_mem (x y : Kˣ) : + QuotientGroup.mk' (fieldNormSubgroup K L) x = + QuotientGroup.mk' (fieldNormSubgroup K L) y ↔ + x / y ∈ fieldNormSubgroup K L := by + simpa [QuotientGroup.mk'_apply] using + (QuotientGroup.eq_iff_div_mem + (N := fieldNormSubgroup K L) (x := x) (y := y)) + +/-- +Characterizes `QuotientGroup.mk' (fieldNormSubgroup K L) x = QuotientGroup.mk' (fieldNormSubgroup +K L) y` by the equivalent condition `y⁻¹ * x ∈ fieldNormSubgroup K L`. +-/ +theorem fieldNormQuotient_mk_eq_iff_inv_mul_mem (x y : Kˣ) : + QuotientGroup.mk' (fieldNormSubgroup K L) x = + QuotientGroup.mk' (fieldNormSubgroup K L) y ↔ + y⁻¹ * x ∈ fieldNormSubgroup K L := by + rw [fieldNormQuotient_mk_eq_iff_div_mem K L x y, + fieldNormSubgroup_div_mem_iff_inv_mul_mem K L x y] + +/-- +Characterizes `QuotientGroup.mk' (fieldNormSubgroup K L) x = QuotientGroup.mk' (fieldNormSubgroup +K L) y` by the equivalent condition `∃ z : Lˣ, normUnits K L z = x / y`. +-/ +theorem fieldNormQuotient_mk_eq_iff_exists_norm_eq_div + (x y : Kˣ) : + QuotientGroup.mk' (fieldNormSubgroup K L) x = + QuotientGroup.mk' (fieldNormSubgroup K L) y ↔ + ∃ z : Lˣ, normUnits K L z = x / y := by + rw [fieldNormQuotient_mk_eq_iff_div_mem K L x y] + exact MonoidHom.mem_range + +/-- +Characterizes `QuotientGroup.mk' (fieldNormSubgroup K L) x = QuotientGroup.mk' (fieldNormSubgroup +K L) y` by the equivalent condition `∃ z : Lˣ, normUnits K L z = y⁻¹ * x`. +-/ +theorem fieldNormQuotient_mk_eq_iff_exists_norm_eq_inv_mul + (x y : Kˣ) : + QuotientGroup.mk' (fieldNormSubgroup K L) x = + QuotientGroup.mk' (fieldNormSubgroup K L) y ↔ + ∃ z : Lˣ, normUnits K L z = y⁻¹ * x := by + rw [fieldNormQuotient_mk_eq_iff_inv_mul_mem K L x y] + exact MonoidHom.mem_range + +/-- +Characterizes `QuotientGroup.mk' (fieldNormSubgroup K L) x = QuotientGroup.mk' (fieldNormSubgroup +K L) y` by the equivalent condition `∃ z : Lˣ, normUnits K L z * y = x`. +-/ +theorem fieldNormQuotient_mk_eq_iff_exists_norm_mul_eq (x y : Kˣ) : + QuotientGroup.mk' (fieldNormSubgroup K L) x = + QuotientGroup.mk' (fieldNormSubgroup K L) y ↔ + ∃ z : Lˣ, normUnits K L z * y = x := by + rw [fieldNormQuotient_mk_eq_iff_div_mem K L x y, + fieldNormSubgroup_div_mem_iff_exists_norm_mul_eq K L x y] + +/-- +Characterizes `QuotientGroup.mk' (fieldNormSubgroup K L) x = QuotientGroup.mk' (fieldNormSubgroup +K L) y` by the equivalent condition `∃ z : Lˣ, y * normUnits K L z = x`. +-/ +theorem fieldNormQuotient_mk_eq_iff_exists_mul_norm_eq (x y : Kˣ) : + QuotientGroup.mk' (fieldNormSubgroup K L) x = + QuotientGroup.mk' (fieldNormSubgroup K L) y ↔ + ∃ z : Lˣ, y * normUnits K L z = x := by + rw [fieldNormQuotient_mk_eq_iff_inv_mul_mem K L x y, + fieldNormSubgroup_inv_mul_mem_iff_exists_mul_norm_eq K L x y] + +/-- +Establishes the identity `QuotientGroup.mk' (fieldNormSubgroup K L) (normUnits K L z * x) = +QuotientGroup.mk' (fieldNormSubgroup K L) x`. +-/ +theorem fieldNormQuotient_norm_mul_mk_eq (z : Lˣ) (x : Kˣ) : + QuotientGroup.mk' (fieldNormSubgroup K L) + (normUnits K L z * x) = + QuotientGroup.mk' (fieldNormSubgroup K L) x := by + rw [fieldNormQuotient_mk_eq_iff_exists_norm_mul_eq K L + (normUnits K L z * x) x] + exact ⟨z, rfl⟩ + +/-- +Establishes the identity `QuotientGroup.mk' (fieldNormSubgroup K L) (x * normUnits K L z) = +QuotientGroup.mk' (fieldNormSubgroup K L) x`. +-/ +theorem fieldNormQuotient_mul_norm_mk_eq (x : Kˣ) (z : Lˣ) : + QuotientGroup.mk' (fieldNormSubgroup K L) + (x * normUnits K L z) = + QuotientGroup.mk' (fieldNormSubgroup K L) x := by + rw [mul_comm] + exact fieldNormQuotient_norm_mul_mk_eq K L z x + +/-- +Establishes the identity `QuotientGroup.mk' (fieldNormSubgroup K L) x * QuotientGroup.mk' +(fieldNormSubgroup K L) (normUnits K L z) = QuotientGroup.mk' (fieldNormSubgroup K L) x`. +-/ +theorem fieldNormQuotient_mk_mul_norm_eq (x : Kˣ) (z : Lˣ) : + QuotientGroup.mk' (fieldNormSubgroup K L) x * + QuotientGroup.mk' (fieldNormSubgroup K L) (normUnits K L z) = + QuotientGroup.mk' (fieldNormSubgroup K L) x := by + rw [← (QuotientGroup.mk' (fieldNormSubgroup K L)).map_mul, + fieldNormQuotient_mul_norm_mk_eq K L x z] + +/-- +Establishes the identity `QuotientGroup.mk' (fieldNormSubgroup K L) (normUnits K L z) * +QuotientGroup.mk' (fieldNormSubgroup K L) x = QuotientGroup.mk' (fieldNormSubgroup K L) x`. +-/ +theorem fieldNormQuotient_norm_mul_mk_eq_mk (z : Lˣ) (x : Kˣ) : + QuotientGroup.mk' (fieldNormSubgroup K L) (normUnits K L z) * + QuotientGroup.mk' (fieldNormSubgroup K L) x = + QuotientGroup.mk' (fieldNormSubgroup K L) x := by + rw [← (QuotientGroup.mk' (fieldNormSubgroup K L)).map_mul, + fieldNormQuotient_norm_mul_mk_eq K L z x] + +/-- Norm of an element coming from the base field. -/ +theorem fieldNormUnits_algebraMap (u : Kˣ) : + normUnits K L (Units.map (algebraMap K L).toMonoidHom u) = + u ^ Module.finrank K L := by + ext + simp [normUnits, Algebra.norm_algebraMap] + +/-- Establishes the identity `normUnits K L (Units.map (algebraMap K L).toMonoidHom u) = u`. -/ +theorem fieldNormUnits_algebraMap_of_finrank_eq_one + (hfin : Module.finrank K L = 1) (u : Kˣ) : + normUnits K L (Units.map (algebraMap K L).toMonoidHom u) = u := by + simpa [hfin] using fieldNormUnits_algebraMap K L u + +/-- Establishes the membership statement `u ^ Module.finrank K L ∈ fieldNormSubgroup K L`. -/ +theorem fieldNormSubgroup_pow_finrank_mem (u : Kˣ) : + u ^ Module.finrank K L ∈ fieldNormSubgroup K L := + ⟨Units.map (algebraMap K L).toMonoidHom u, + by rw [fieldNormUnits_algebraMap K L u]⟩ + +/-- Establishes the identity `fieldNormSubgroup K L = ⊤`. -/ +theorem fieldNormSubgroup_eq_top_of_finrank_eq_one + (hfin : Module.finrank K L = 1) : + fieldNormSubgroup K L = ⊤ := by + ext u + constructor + · intro _ + simp + · intro _ + simpa [hfin] using fieldNormSubgroup_pow_finrank_mem K L u + +/-- +Establishes the identity `(QuotientGroup.mk' (fieldNormSubgroup K L) u) ^ Module.finrank K L = 1`. +-/ +theorem fieldNormQuotient_mk_pow_finrank_eq_one (u : Kˣ) : + (QuotientGroup.mk' (fieldNormSubgroup K L) u) ^ + Module.finrank K L = 1 := by + rw [← (QuotientGroup.mk' (fieldNormSubgroup K L)).map_pow] + exact (fieldNormQuotient_mk_eq_one_iff K L + (u ^ Module.finrank K L)).2 + (fieldNormSubgroup_pow_finrank_mem K L u) + +/-- Establishes the identity `q ^ Module.finrank K L = 1`. -/ +theorem fieldNormQuotient_pow_finrank_eq_one + (q : Kˣ ⧸ fieldNormSubgroup K L) : + q ^ Module.finrank K L = 1 := by + rcases QuotientGroup.mk'_surjective (fieldNormSubgroup K L) q with + ⟨u, rfl⟩ + exact fieldNormQuotient_mk_pow_finrank_eq_one K L u + +/-- Establishes the identity `(QuotientGroup.mk' (fieldNormSubgroup K L) u) ^ n = 1`. -/ +theorem fieldNormQuotient_mk_pow_eq_one_of_finrank_dvd + {n : ℕ} (hn : Module.finrank K L ∣ n) (u : Kˣ) : + (QuotientGroup.mk' (fieldNormSubgroup K L) u) ^ n = 1 := by + rcases hn with ⟨m, rfl⟩ + rw [pow_mul, fieldNormQuotient_mk_pow_finrank_eq_one K L u, one_pow] + +/-- Establishes the identity `q ^ n = 1`. -/ +theorem fieldNormQuotient_pow_eq_one_of_finrank_dvd + {n : ℕ} (hn : Module.finrank K L ∣ n) + (q : Kˣ ⧸ fieldNormSubgroup K L) : + q ^ n = 1 := by + rcases QuotientGroup.mk'_surjective (fieldNormSubgroup K L) q with + ⟨u, rfl⟩ + exact fieldNormQuotient_mk_pow_eq_one_of_finrank_dvd K L hn u + +/-- Establishes the identity `q = 1`. -/ +theorem fieldNormQuotient_eq_one_of_finrank_eq_one + (hfin : Module.finrank K L = 1) + (q : Kˣ ⧸ fieldNormSubgroup K L) : + q = 1 := by + rcases QuotientGroup.mk'_surjective (fieldNormSubgroup K L) q with + ⟨u, rfl⟩ + exact (fieldNormQuotient_mk_eq_one_iff K L u).2 + (by simpa [hfin] using fieldNormSubgroup_pow_finrank_mem K L u) + +/-- Establishes the identity `q = r`. -/ +theorem fieldNormQuotient_eq_of_finrank_eq_one + (hfin : Module.finrank K L = 1) + (q r : Kˣ ⧸ fieldNormSubgroup K L) : + q = r := by + rw [fieldNormQuotient_eq_one_of_finrank_eq_one K L hfin q, + fieldNormQuotient_eq_one_of_finrank_eq_one K L hfin r] + +/-- Package a field norm as a `ValuedNorm` once the valuation formula has been +proved for the concrete extension. The natural-number argument is not a +second source of extension-invariant data: `hformula` certifies it as the +valuation multiplier (and a source uniformizer makes that multiplier unique). -/ +@[reducible] noncomputable def valuedFieldNorm + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) : + ValuedNorm vK vL where + toHom := normUnits K L + residueDegree := residueDegree + valuation_formula := hformula + +/-- +Establishes the identity `(valuedFieldNorm K L vK vL residueDegree hformula).toHom = +normUnits K L`. +-/ +@[simp] theorem valuedFieldNorm_toHom + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) : + (valuedFieldNorm K L vK vL residueDegree hformula).toHom = + normUnits K L := + rfl + +/-- +Establishes the identity `(valuedFieldNorm K L vK vL residueDegree hformula).normSubgroup = +fieldNormSubgroup K L`. +-/ +theorem valuedFieldNorm_normSubgroup_eq_fieldNormSubgroup + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) : + (valuedFieldNorm K L vK vL residueDegree hformula).normSubgroup = + fieldNormSubgroup K L := by + ext x + rfl + +/-- Concrete cyclic description of the field-norm quotient. The assumptions +are the valuation formula for the field norm and the assertion that every +target valuation-zero element is already a field norm. -/ +noncomputable def fieldNormQuotientEquivZMod + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖK : Kˣ} (hϖK : vK.IsUniformizer ϖK) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) : + Kˣ ⧸ fieldNormSubgroup K L ≃* Multiplicative (ZMod residueDegree) := + let N := valuedFieldNorm K L vK vL residueDegree hformula + have hnorm : N.normSubgroup = fieldNormSubgroup K L := by + simpa [N] using + valuedFieldNorm_normSubgroup_eq_fieldNormSubgroup + K L vK vL residueDegree hformula + have hzero' : vK.zeroSubgroup ≤ N.normSubgroup := by + rw [hnorm] + exact hzero + (QuotientGroup.quotientMulEquivOfEq hnorm.symm).trans + (N.normQuotientEquivZMod hϖK hϖL hzero') + +/-- +Establishes the identity `fieldNormQuotientEquivZMod K L vK vL residueDegree hformula hϖK hϖL +hzero (QuotientGroup.mk' (fieldNormSubgroup K L) x) = Multiplicative.ofAdd ((vK.val x : ℤ) : ZMod +residueDegree)`. +-/ +theorem fieldNormQuotientEquivZMod_mk + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖK : Kˣ} (hϖK : vK.IsUniformizer ϖK) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + (x : Kˣ) : + fieldNormQuotientEquivZMod K L vK vL residueDegree + hformula hϖK hϖL hzero + (QuotientGroup.mk' (fieldNormSubgroup K L) x) = + Multiplicative.ofAdd ((vK.val x : ℤ) : ZMod residueDegree) := by + let N := valuedFieldNorm K L vK vL residueDegree hformula + have hnorm : N.normSubgroup = fieldNormSubgroup K L := by + simpa [N] using + valuedFieldNorm_normSubgroup_eq_fieldNormSubgroup + K L vK vL residueDegree hformula + have hzero' : vK.zeroSubgroup ≤ N.normSubgroup := by + rw [hnorm] + exact hzero + unfold fieldNormQuotientEquivZMod + rw [MulEquiv.trans_apply, QuotientGroup.mk'_apply, + QuotientGroup.quotientMulEquivOfEq_mk] + simpa [N, valuedFieldNorm] using + N.normQuotientEquivZMod_mk hϖK hϖL hzero' x + +/-- +`fieldNormQuotientEquivZMod_uniformizer` satisfies the integer-power formula +`fieldNormQuotientEquivZMod K L vK vL residueDegree hformula hϖK hϖL hzero (QuotientGroup.mk' +(fieldNormSubgroup K L) (ϖK ^ n)) = Multiplicative.ofAdd ((n : ℤ) : ZMod residueDegree)`. +-/ +theorem fieldNormQuotientEquivZMod_uniformizer_zpow + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖK : Kˣ} (hϖK : vK.IsUniformizer ϖK) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + (n : ℤ) : + fieldNormQuotientEquivZMod K L vK vL residueDegree + hformula hϖK hϖL hzero + (QuotientGroup.mk' (fieldNormSubgroup K L) (ϖK ^ n)) = + Multiplicative.ofAdd ((n : ℤ) : ZMod residueDegree) := by + rw [fieldNormQuotientEquivZMod_mk K L vK vL residueDegree + hformula hϖK hϖL hzero (ϖK ^ n), + vK.val_uniformizer_zpow hϖK n] + +/-- +`fieldNormQuotientEquivZMod_uniformizerClass` satisfies the integer-power formula +`fieldNormQuotientEquivZMod K L vK vL residueDegree hformula hϖK hϖL hzero ((QuotientGroup.mk' +(fieldNormSubgroup K L) ϖK) ^ n) = Multiplicative.ofAdd ((n : ℤ) : ZMod residueDegree)`. +-/ +theorem fieldNormQuotientEquivZMod_uniformizerClass_zpow + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖK : Kˣ} (hϖK : vK.IsUniformizer ϖK) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + (n : ℤ) : + fieldNormQuotientEquivZMod K L vK vL residueDegree + hformula hϖK hϖL hzero + ((QuotientGroup.mk' (fieldNormSubgroup K L) ϖK) ^ n) = + Multiplicative.ofAdd ((n : ℤ) : ZMod residueDegree) := by + have hpow : QuotientGroup.mk' (fieldNormSubgroup K L) (ϖK ^ n) = + (QuotientGroup.mk' (fieldNormSubgroup K L) ϖK) ^ n := + map_zpow (QuotientGroup.mk' (fieldNormSubgroup K L)) ϖK n + rw [← hpow, + fieldNormQuotientEquivZMod_uniformizer_zpow K L vK vL + residueDegree hformula hϖK hϖL hzero n] + +/-- +Establishes the identity `(fieldNormQuotientEquivZMod K L vK vL residueDegree hformula hϖK hϖL +hzero).symm (Multiplicative.ofAdd ((n : ℤ) : ZMod residueDegree)) = QuotientGroup.mk' +(fieldNormSubgroup K L) (ϖK ^ n)`. +-/ +@[simp] theorem fieldNormQuotientEquivZMod_symm_mk_ofAdd + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖK : Kˣ} (hϖK : vK.IsUniformizer ϖK) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + (n : ℤ) : + (fieldNormQuotientEquivZMod K L vK vL residueDegree + hformula hϖK hϖL hzero).symm + (Multiplicative.ofAdd ((n : ℤ) : ZMod residueDegree)) = + QuotientGroup.mk' (fieldNormSubgroup K L) (ϖK ^ n) := by + apply (fieldNormQuotientEquivZMod K L vK vL residueDegree + hformula hϖK hϖL hzero).injective + rw [MulEquiv.apply_symm_apply, + fieldNormQuotientEquivZMod_uniformizer_zpow K L vK vL + residueDegree hformula hϖK hϖL hzero n] + +/-- Cardinality form of the concrete field-norm quotient computation. -/ +theorem cardinalMk_fieldNormQuotient_eq_residueDegree + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖK : Kˣ} (hϖK : vK.IsUniformizer ϖK) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + [NeZero residueDegree] : + Cardinal.mk (Kˣ ⧸ fieldNormSubgroup K L) = residueDegree := by + let e := fieldNormQuotientEquivZMod K L vK vL residueDegree + hformula hϖK hϖL hzero + calc + Cardinal.mk (Kˣ ⧸ fieldNormSubgroup K L) = + Cardinal.lift (Cardinal.mk (Multiplicative (ZMod residueDegree))) := + by simpa only [Cardinal.lift_id'] using Cardinal.mk_congr_lift e.toEquiv + _ = residueDegree := by + simp only [Cardinal.mk_fintype, Cardinal.lift_natCast] + rw [← Nat.card_eq_fintype_card, + Nat.card_congr (Multiplicative.toAdd : Multiplicative (ZMod residueDegree) ≃ + ZMod residueDegree), Nat.card_zmod] + +/-- Field-norm value-image criterion: an integer is attained as the valuation +of a field norm exactly when it is divisible by the residue degree. -/ +theorem exists_mem_fieldNormSubgroup_val_eq_iff_residueDegree_dvd + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) (n : ℤ) : + (∃ x : Kˣ, x ∈ fieldNormSubgroup K L ∧ vK.val x = n) ↔ + (residueDegree : ℤ) ∣ n := by + let N := valuedFieldNorm K L vK vL residueDegree hformula + have hnorm : N.normSubgroup = fieldNormSubgroup K L := by + simpa [N] using + valuedFieldNorm_normSubgroup_eq_fieldNormSubgroup + K L vK vL residueDegree hformula + simpa [N, valuedFieldNorm, hnorm] using + (N.exists_normSubgroup_val_eq_iff_residueDegree_dvd_of_uniformizer + hϖL n) + +/-- The value image of the field-norm subgroup is exactly `fℤ`. -/ +theorem fieldNormSubgroup_valueImage_eq_residueDegree + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) : + vK.subgroupValueSubgroup (fieldNormSubgroup K L) = + integerMultipleSubgroup (residueDegree : ℤ) := by + apply le_antisymm + · refine + (MultiplicativeIntegerValuation.subgroupValueSubgroup_le_integerMultipleSubgroup_iff + vK (fieldNormSubgroup K L) (residueDegree : ℤ)).2 ?_ + intro x hx + let N := valuedFieldNorm K L vK vL residueDegree hformula + have hnorm : N.normSubgroup = fieldNormSubgroup K L := by + simpa [N] using + valuedFieldNorm_normSubgroup_eq_fieldNormSubgroup + K L vK vL residueDegree hformula + have hx' : x ∈ N.normSubgroup := by + simpa [hnorm] using hx + simpa [N, valuedFieldNorm] using + N.residueDegree_dvd_valuation_of_mem_normSubgroup hx' + · intro n hn + rw [mem_integerMultipleSubgroup_iff] at hn + rcases + (exists_mem_fieldNormSubgroup_val_eq_iff_residueDegree_dvd + K L vK vL residueDegree hformula hϖL (Multiplicative.toAdd n)).2 + hn with + ⟨x, hx, hval⟩ + rw [vK.mem_subgroupValueSubgroup_iff] + exact ⟨x, hx, by rw [vK.valuationHom_apply, hval, ofAdd_toAdd]⟩ + +/-- +Characterizes `x ∈ fieldNormSubgroup K L` by the equivalent condition `(residueDegree : ℤ) ∣ +vK.val x`. +-/ +theorem mem_fieldNormSubgroup_iff_residueDegree_dvd_val_of_zeroSubgroup_le + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) (x : Kˣ) : + x ∈ fieldNormSubgroup K L ↔ (residueDegree : ℤ) ∣ vK.val x := by + let N := valuedFieldNorm K L vK vL residueDegree hformula + have hnorm : N.normSubgroup = fieldNormSubgroup K L := by + simpa [N] using + valuedFieldNorm_normSubgroup_eq_fieldNormSubgroup + K L vK vL residueDegree hformula + have hzero' : vK.zeroSubgroup ≤ N.normSubgroup := by + rw [hnorm] + exact hzero + simpa [N, valuedFieldNorm, hnorm] using + (N.mem_normSubgroup_iff_residueDegree_dvd_val_of_zeroSubgroup_le + hϖL hzero' x) + +/-- Establishes the divisibility statement `(residueDegree : ℤ) ∣ vK.val x`. -/ +theorem fieldNormSubgroup_residueDegree_dvd_val_of_mem + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {x : Kˣ} (hx : x ∈ fieldNormSubgroup K L) : + (residueDegree : ℤ) ∣ vK.val x := by + let N := valuedFieldNorm K L vK vL residueDegree hformula + have hnorm : N.normSubgroup = fieldNormSubgroup K L := by + simpa [N] using + valuedFieldNorm_normSubgroup_eq_fieldNormSubgroup + K L vK vL residueDegree hformula + have hx' : x ∈ N.normSubgroup := by + simpa [hnorm] using hx + simpa [N, valuedFieldNorm] using + N.residueDegree_dvd_valuation_of_mem_normSubgroup hx' + +/-- Establishes the membership statement `x ∈ fieldNormSubgroup K L`. -/ +theorem fieldNormSubgroup_mem_of_residueDegree_dvd_val_of_zeroSubgroup_le + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + {x : Kˣ} (hx : (residueDegree : ℤ) ∣ vK.val x) : + x ∈ fieldNormSubgroup K L := + (mem_fieldNormSubgroup_iff_residueDegree_dvd_val_of_zeroSubgroup_le + K L vK vL residueDegree hformula hϖL hzero x).2 hx + +/-- +Characterizes `x / y ∈ fieldNormSubgroup K L` by the equivalent condition `(residueDegree : ℤ) ∣ +vK.val x - vK.val y`. +-/ +theorem fieldNormSubgroup_div_mem_iff_residueDegree_dvd_valuation_difference + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + (x y : Kˣ) : + x / y ∈ fieldNormSubgroup K L ↔ + (residueDegree : ℤ) ∣ vK.val x - vK.val y := by + rw [mem_fieldNormSubgroup_iff_residueDegree_dvd_val_of_zeroSubgroup_le + K L vK vL residueDegree hformula hϖL hzero (x / y), + vK.val_div] + +/-- +Characterizes `y⁻¹ * x ∈ fieldNormSubgroup K L` by the equivalent condition `(residueDegree : ℤ) ∣ +vK.val x - vK.val y`. +-/ +theorem fieldNormSubgroup_inv_mul_mem_iff_residueDegree_dvd_valuation_difference + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + (x y : Kˣ) : + y⁻¹ * x ∈ fieldNormSubgroup K L ↔ + (residueDegree : ℤ) ∣ vK.val x - vK.val y := by + rw [fieldNormSubgroup_inv_mul_mem_iff_div_mem K L x y, + fieldNormSubgroup_div_mem_iff_residueDegree_dvd_valuation_difference + K L vK vL residueDegree hformula hϖL hzero x y] + +/-- Under the standard valuation formula and valuation-zero norm-surjectivity, +the norm equation `N z = x` is solvable exactly when `f` divides `v(x)`. -/ +theorem exists_fieldNormUnits_eq_iff_residueDegree_dvd_val + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) (x : Kˣ) : + (∃ z : Lˣ, normUnits K L z = x) ↔ + (residueDegree : ℤ) ∣ vK.val x := by + rw [← (MonoidHom.mem_range (f := normUnits K L))] + change x ∈ fieldNormSubgroup K L ↔ (residueDegree : ℤ) ∣ vK.val x + exact mem_fieldNormSubgroup_iff_residueDegree_dvd_val_of_zeroSubgroup_le + K L vK vL residueDegree hformula hϖL hzero x + +/-- Establishes the identity `∃ z : Lˣ, normUnits K L z = x`. -/ +theorem exists_fieldNormUnits_eq_of_residueDegree_dvd_val + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + {x : Kˣ} (hx : (residueDegree : ℤ) ∣ vK.val x) : + ∃ z : Lˣ, normUnits K L z = x := + (exists_fieldNormUnits_eq_iff_residueDegree_dvd_val + K L vK vL residueDegree hformula hϖL hzero x).2 hx + +/-- Difference form of the concrete norm equation criterion. -/ +theorem exists_fieldNormUnits_eq_div_iff_residueDegree_dvd_valuation_difference + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + (x y : Kˣ) : + (∃ z : Lˣ, normUnits K L z = x / y) ↔ + (residueDegree : ℤ) ∣ vK.val x - vK.val y := by + rw [← (MonoidHom.mem_range (f := normUnits K L))] + change x / y ∈ fieldNormSubgroup K L ↔ + (residueDegree : ℤ) ∣ vK.val x - vK.val y + exact fieldNormSubgroup_div_mem_iff_residueDegree_dvd_valuation_difference + K L vK vL residueDegree hformula hϖL hzero x y + +/-- Multiplicative equation form of the concrete norm-lift criterion. -/ +theorem exists_fieldNormUnits_mul_eq_iff_residueDegree_dvd_valuation_difference + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + (x y : Kˣ) : + (∃ z : Lˣ, normUnits K L z * y = x) ↔ + (residueDegree : ℤ) ∣ vK.val x - vK.val y := by + rw [← fieldNormSubgroup_div_mem_iff_exists_norm_mul_eq K L x y, + fieldNormSubgroup_div_mem_iff_residueDegree_dvd_valuation_difference + K L vK vL residueDegree hformula hϖL hzero x y] + +/-- Left-multiplicative equation form of the concrete norm-lift criterion. -/ +theorem exists_mul_fieldNormUnits_eq_iff_residueDegree_dvd_valuation_difference + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + (x y : Kˣ) : + (∃ z : Lˣ, y * normUnits K L z = x) ↔ + (residueDegree : ℤ) ∣ vK.val x - vK.val y := by + rw [← fieldNormSubgroup_inv_mul_mem_iff_exists_mul_norm_eq K L x y, + fieldNormSubgroup_inv_mul_mem_iff_residueDegree_dvd_valuation_difference + K L vK vL residueDegree hformula hϖL hzero x y] + +/-- +Characterizes `QuotientGroup.mk' (fieldNormSubgroup K L) x = 1` by the equivalent condition +`(residueDegree : ℤ) ∣ vK.val x`. +-/ +theorem fieldNormQuotient_mk_eq_one_iff_residueDegree_dvd_val + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + (x : Kˣ) : + QuotientGroup.mk' (fieldNormSubgroup K L) x = 1 ↔ + (residueDegree : ℤ) ∣ vK.val x := by + rw [fieldNormQuotient_mk_eq_one_iff K L x, + mem_fieldNormSubgroup_iff_residueDegree_dvd_val_of_zeroSubgroup_le + K L vK vL residueDegree hformula hϖL hzero x] + +/-- +Characterizes `QuotientGroup.mk' (fieldNormSubgroup K L) x = QuotientGroup.mk' (fieldNormSubgroup +K L) y` by the equivalent condition `(residueDegree : ℤ) ∣ vK.val x - vK.val y`. +-/ +theorem fieldNormQuotient_mk_eq_iff_residueDegree_dvd_valuation_difference + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + (x y : Kˣ) : + QuotientGroup.mk' (fieldNormSubgroup K L) x = + QuotientGroup.mk' (fieldNormSubgroup K L) y ↔ + (residueDegree : ℤ) ∣ vK.val x - vK.val y := by + rw [fieldNormQuotient_mk_eq_iff_div_mem K L x y, + fieldNormSubgroup_div_mem_iff_residueDegree_dvd_valuation_difference + K L vK vL residueDegree hformula hϖL hzero x y] + +/-- +Characterizes `ϖK ^ n ∈ fieldNormSubgroup K L` by the equivalent condition `(residueDegree : ℤ) ∣ +n`. +-/ +theorem fieldNormSubgroup_uniformizer_zpow_mem_iff + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖK : Kˣ} (hϖK : vK.IsUniformizer ϖK) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + (n : ℤ) : + ϖK ^ n ∈ fieldNormSubgroup K L ↔ + (residueDegree : ℤ) ∣ n := by + rw [mem_fieldNormSubgroup_iff_residueDegree_dvd_val_of_zeroSubgroup_le + K L vK vL residueDegree hformula hϖL hzero (ϖK ^ n), + vK.val_uniformizer_zpow hϖK n] + +/-- +Characterizes `ϖK ^ m / ϖK ^ n ∈ fieldNormSubgroup K L` by the equivalent condition +`(residueDegree : ℤ) ∣ m - n`. +-/ +theorem fieldNormSubgroup_uniformizer_zpow_div_mem_iff + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖK : Kˣ} (hϖK : vK.IsUniformizer ϖK) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + (m n : ℤ) : + ϖK ^ m / ϖK ^ n ∈ fieldNormSubgroup K L ↔ + (residueDegree : ℤ) ∣ m - n := by + rw [fieldNormSubgroup_div_mem_iff_residueDegree_dvd_valuation_difference + K L vK vL residueDegree hformula hϖL hzero (ϖK ^ m) (ϖK ^ n), + vK.val_uniformizer_zpow hϖK m, + vK.val_uniformizer_zpow hϖK n] + +/-- +Establishes the identity `QuotientGroup.mk' (fieldNormSubgroup K L) x = QuotientGroup.mk' +(fieldNormSubgroup K L) (ϖK ^ vK.val x)`. +-/ +theorem fieldNormQuotient_mk_eq_uniformizer_zpow_val + (vK : MultiplicativeIntegerValuation Kˣ) + {ϖK : Kˣ} (hϖK : vK.IsUniformizer ϖK) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) (x : Kˣ) : + QuotientGroup.mk' (fieldNormSubgroup K L) x = + QuotientGroup.mk' (fieldNormSubgroup K L) (ϖK ^ vK.val x) := by + rw [fieldNormQuotient_mk_eq_iff_div_mem K L x (ϖK ^ vK.val x)] + exact hzero ((vK.div_mem_zeroSubgroup_iff x (ϖK ^ vK.val x)).2 + (by rw [vK.val_uniformizer_zpow hϖK (vK.val x)])) + +/-- +Establishes the identity `QuotientGroup.mk' (fieldNormSubgroup K L) x = (QuotientGroup.mk' +(fieldNormSubgroup K L) ϖK) ^ vK.val x`. +-/ +theorem fieldNormQuotient_mk_eq_uniformizerClass_zpow_val + (vK : MultiplicativeIntegerValuation Kˣ) + {ϖK : Kˣ} (hϖK : vK.IsUniformizer ϖK) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) (x : Kˣ) : + QuotientGroup.mk' (fieldNormSubgroup K L) x = + (QuotientGroup.mk' (fieldNormSubgroup K L) ϖK) ^ vK.val x := by + exact (fieldNormQuotient_mk_eq_uniformizer_zpow_val + K L vK hϖK hzero x).trans + (map_zpow (QuotientGroup.mk' (fieldNormSubgroup K L)) ϖK (vK.val x)) + +/-- +Characterizes `QuotientGroup.mk' (fieldNormSubgroup K L) x = QuotientGroup.mk' (fieldNormSubgroup +K L) (ϖK ^ n)` by the equivalent condition `(residueDegree : ℤ) ∣ vK.val x - n`. +-/ +theorem fieldNormQuotient_mk_eq_uniformizer_zpow_iff + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖK : Kˣ} (hϖK : vK.IsUniformizer ϖK) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + (x : Kˣ) (n : ℤ) : + QuotientGroup.mk' (fieldNormSubgroup K L) x = + QuotientGroup.mk' (fieldNormSubgroup K L) (ϖK ^ n) ↔ + (residueDegree : ℤ) ∣ vK.val x - n := by + rw [fieldNormQuotient_mk_eq_iff_residueDegree_dvd_valuation_difference + K L vK vL residueDegree hformula hϖL hzero x (ϖK ^ n), + vK.val_uniformizer_zpow hϖK n] + +/-- +Characterizes `QuotientGroup.mk' (fieldNormSubgroup K L) x = (QuotientGroup.mk' (fieldNormSubgroup +K L) ϖK) ^ n` by the equivalent condition `(residueDegree : ℤ) ∣ vK.val x - n`. +-/ +theorem fieldNormQuotient_mk_eq_uniformizerClass_zpow_iff + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖK : Kˣ} (hϖK : vK.IsUniformizer ϖK) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + (x : Kˣ) (n : ℤ) : + QuotientGroup.mk' (fieldNormSubgroup K L) x = + (QuotientGroup.mk' (fieldNormSubgroup K L) ϖK) ^ n ↔ + (residueDegree : ℤ) ∣ vK.val x - n := by + have hpow : QuotientGroup.mk' (fieldNormSubgroup K L) (ϖK ^ n) = + (QuotientGroup.mk' (fieldNormSubgroup K L) ϖK) ^ n := + map_zpow (QuotientGroup.mk' (fieldNormSubgroup K L)) ϖK n + rw [← hpow] + exact fieldNormQuotient_mk_eq_uniformizer_zpow_iff + K L vK vL residueDegree hformula hϖK hϖL hzero x n + +/-- +Characterizes `(QuotientGroup.mk' (fieldNormSubgroup K L) ϖK) ^ m = (QuotientGroup.mk' +(fieldNormSubgroup K L) ϖK) ^ n` by the equivalent condition `(residueDegree : ℤ) ∣ m - n`. +-/ +theorem fieldNormQuotient_uniformizerClass_zpow_eq_iff + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖK : Kˣ} (hϖK : vK.IsUniformizer ϖK) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + (m n : ℤ) : + (QuotientGroup.mk' (fieldNormSubgroup K L) ϖK) ^ m = + (QuotientGroup.mk' (fieldNormSubgroup K L) ϖK) ^ n ↔ + (residueDegree : ℤ) ∣ m - n := by + have hpow (k : ℤ) : QuotientGroup.mk' (fieldNormSubgroup K L) (ϖK ^ k) = + (QuotientGroup.mk' (fieldNormSubgroup K L) ϖK) ^ k := + map_zpow (QuotientGroup.mk' (fieldNormSubgroup K L)) ϖK k + rw [← hpow m, ← hpow n, + fieldNormQuotient_mk_eq_iff_residueDegree_dvd_valuation_difference + K L vK vL residueDegree hformula hϖL hzero (ϖK ^ m) (ϖK ^ n), + vK.val_uniformizer_zpow hϖK m, + vK.val_uniformizer_zpow hϖK n] + +/-- +Characterizes `(QuotientGroup.mk' (fieldNormSubgroup K L) ϖK) ^ n = 1` by the equivalent condition +`(residueDegree : ℤ) ∣ n`. +-/ +theorem fieldNormQuotient_uniformizerClass_zpow_eq_one_iff + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖK : Kˣ} (hϖK : vK.IsUniformizer ϖK) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + (n : ℤ) : + (QuotientGroup.mk' (fieldNormSubgroup K L) ϖK) ^ n = 1 ↔ + (residueDegree : ℤ) ∣ n := by + have hpow : QuotientGroup.mk' (fieldNormSubgroup K L) (ϖK ^ n) = + (QuotientGroup.mk' (fieldNormSubgroup K L) ϖK) ^ n := + map_zpow (QuotientGroup.mk' (fieldNormSubgroup K L)) ϖK n + rw [← hpow, + fieldNormQuotient_mk_eq_one_iff_residueDegree_dvd_val + K L vK vL residueDegree hformula hϖL hzero (ϖK ^ n), + vK.val_uniformizer_zpow hϖK n] + +/-- +Establishes the identity `(QuotientGroup.mk' (fieldNormSubgroup K L) ϖK) ^ (residueDegree : ℤ) = +1`. +-/ +theorem fieldNormQuotient_uniformizerClass_zpow_residueDegree_eq_one + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖK : Kˣ} (hϖK : vK.IsUniformizer ϖK) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) : + (QuotientGroup.mk' (fieldNormSubgroup K L) ϖK) ^ + (residueDegree : ℤ) = 1 := by + rw [fieldNormQuotient_uniformizerClass_zpow_eq_one_iff + K L vK vL residueDegree hformula hϖK hϖL hzero + (residueDegree : ℤ)] + +/-- The concrete field-norm quotient is generated by the class of any target +uniformizer under the standard valuation-zero norm-surjectivity hypothesis. -/ +theorem fieldNormQuotient_generated_by_uniformizerClass + (vK : MultiplicativeIntegerValuation Kˣ) + {ϖK : Kˣ} (hϖK : vK.IsUniformizer ϖK) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + (q : Kˣ ⧸ fieldNormSubgroup K L) : + ∃ n : ℤ, + q = (QuotientGroup.mk' (fieldNormSubgroup K L) ϖK) ^ n := by + refine QuotientGroup.induction_on q ?_ + intro x + change ∃ n : ℤ, + QuotientGroup.mk' (fieldNormSubgroup K L) x = + (QuotientGroup.mk' (fieldNormSubgroup K L) ϖK) ^ n + exact ⟨vK.val x, + fieldNormQuotient_mk_eq_uniformizerClass_zpow_val + K L vK hϖK hzero x⟩ + +/-- +Establishes the identity `Subgroup.closure ({QuotientGroup.mk' (fieldNormSubgroup K L) ϖK} : Set +(Kˣ ⧸ fieldNormSubgroup K L)) = ⊤`. +-/ +theorem fieldNormQuotient_closure_uniformizerClass_eq_top + (vK : MultiplicativeIntegerValuation Kˣ) + {ϖK : Kˣ} (hϖK : vK.IsUniformizer ϖK) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) : + Subgroup.closure + ({QuotientGroup.mk' (fieldNormSubgroup K L) ϖK} : + Set (Kˣ ⧸ fieldNormSubgroup K L)) = + ⊤ := by + apply le_antisymm + · exact le_top + · intro q hq + rcases fieldNormQuotient_generated_by_uniformizerClass + K L vK hϖK hzero q with + ⟨n, hqpow⟩ + rw [hqpow] + exact Subgroup.zpow_mem + (Subgroup.closure + ({QuotientGroup.mk' (fieldNormSubgroup K L) ϖK} : + Set (Kˣ ⧸ fieldNormSubgroup K L))) + (Subgroup.subset_closure (by simp)) n + +/-- Establishes the identity `fieldNormSubgroup K L = ⊤`. -/ +theorem fieldNormSubgroup_eq_top_of_residueDegree_eq_one + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + (hres : residueDegree = 1) : + fieldNormSubgroup K L = ⊤ := by + ext x + constructor + · intro _ + simp + · intro _ + exact + fieldNormSubgroup_mem_of_residueDegree_dvd_val_of_zeroSubgroup_le + K L vK vL residueDegree hformula hϖL hzero + (by rw [hres]; exact one_dvd (vK.val x)) + +/-- The specified map is surjective: `Function.Surjective (normUnits K L)`. -/ +theorem fieldNormUnits_surjective_of_residueDegree_eq_one + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + (hres : residueDegree = 1) : + Function.Surjective (normUnits K L) := by + rw [← fieldNormSubgroup_eq_top_iff K L] + exact fieldNormSubgroup_eq_top_of_residueDegree_eq_one + K L vK vL residueDegree hformula hϖL hzero hres + +/-- Under the standard valuation formula and valuation-zero norm-surjectivity, +the field norm on units is surjective exactly in residue degree one. -/ +theorem fieldNormUnits_surjective_iff_residueDegree_eq_one + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖK : Kˣ} (hϖK : vK.IsUniformizer ϖK) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) : + Function.Surjective (normUnits K L) ↔ residueDegree = 1 := by + constructor + · intro hsurj + have hvalϖK : vK.val ϖK = 1 := hϖK + rcases hsurj ϖK with ⟨z, hz⟩ + have hmem : ϖK ∈ fieldNormSubgroup K L := ⟨z, hz⟩ + have hdiv : (residueDegree : ℤ) ∣ (1 : ℤ) := by + simpa [hvalϖK] using + fieldNormSubgroup_residueDegree_dvd_val_of_mem + K L vK vL residueDegree hformula hmem + have hInt : (residueDegree : ℤ) = 1 := + Int.eq_one_of_dvd_one (by exact_mod_cast Nat.zero_le residueDegree) hdiv + exact_mod_cast hInt + · intro hres + exact fieldNormUnits_surjective_of_residueDegree_eq_one + K L vK vL residueDegree hformula hϖL hzero hres + +/-- Subgroup form of the residue-degree-one norm-surjectivity criterion. -/ +theorem fieldNormSubgroup_eq_top_iff_residueDegree_eq_one + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖK : Kˣ} (hϖK : vK.IsUniformizer ϖK) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) : + fieldNormSubgroup K L = ⊤ ↔ residueDegree = 1 := by + rw [fieldNormSubgroup_eq_top_iff K L] + exact fieldNormUnits_surjective_iff_residueDegree_eq_one + K L vK vL residueDegree hformula hϖK hϖL hzero + +/-- Establishes the identity `q = 1`. -/ +theorem fieldNormQuotient_eq_one_of_residueDegree_eq_one + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + (hres : residueDegree = 1) + (q : Kˣ ⧸ fieldNormSubgroup K L) : + q = 1 := by + rcases QuotientGroup.mk'_surjective (fieldNormSubgroup K L) q with + ⟨x, rfl⟩ + exact (fieldNormQuotient_mk_eq_one_iff_residueDegree_dvd_val + K L vK vL residueDegree hformula hϖL hzero x).2 + (by rw [hres]; exact one_dvd (vK.val x)) + +/-- Establishes the identity `q = r`. -/ +theorem fieldNormQuotient_eq_of_residueDegree_eq_one + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) + (hres : residueDegree = 1) + (q r : Kˣ ⧸ fieldNormSubgroup K L) : + q = r := by + rw [fieldNormQuotient_eq_one_of_residueDegree_eq_one + K L vK vL residueDegree hformula hϖL hzero hres q, + fieldNormQuotient_eq_one_of_residueDegree_eq_one + K L vK vL residueDegree hformula hϖL hzero hres r] + +/-- Quotient form of the residue-degree-one norm-surjectivity criterion. -/ +theorem fieldNormQuotient_forall_eq_one_iff_residueDegree_eq_one + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + {ϖK : Kˣ} (hϖK : vK.IsUniformizer ϖK) + {ϖL : Lˣ} (hϖL : vL.IsUniformizer ϖL) + (hzero : vK.zeroSubgroup ≤ fieldNormSubgroup K L) : + (∀ q : Kˣ ⧸ fieldNormSubgroup K L, q = 1) ↔ residueDegree = 1 := by + constructor + · intro hq + have hvalϖK : vK.val ϖK = 1 := hϖK + have hclass : + QuotientGroup.mk' (fieldNormSubgroup K L) ϖK = 1 := + hq (QuotientGroup.mk' (fieldNormSubgroup K L) ϖK) + have hdiv : (residueDegree : ℤ) ∣ (1 : ℤ) := by + simpa [hvalϖK] using + (fieldNormQuotient_mk_eq_one_iff_residueDegree_dvd_val + K L vK vL residueDegree hformula hϖL hzero ϖK).1 hclass + have hInt : (residueDegree : ℤ) = 1 := + Int.eq_one_of_dvd_one (by exact_mod_cast Nat.zero_le residueDegree) hdiv + exact_mod_cast hInt + · intro hres q + exact fieldNormQuotient_eq_one_of_residueDegree_eq_one + K L vK vL residueDegree hformula hϖL hzero hres q + +/-- Concrete compatibility condition saying that the field norm maps the +`n`-th source principal-unit subgroup into the requested target level. -/ +abbrev fieldNormMapsFiltrationLevels + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) : Prop := + ∀ n {x : Lˣ}, x ∈ UL.principalUnitSubgroup n → + normUnits K L x ∈ UK.principalUnitSubgroup (targetLevel n) + +/-- +Characterizes `ValuedNorm.MapsFiltrationLevels (valuedFieldNorm K L vK vL residueDegree hformula) +UK UL targetLevel` by the equivalent condition `fieldNormMapsFiltrationLevels K L UK UL +targetLevel`. +-/ +theorem valuedFieldNorm_mapsFiltrationLevels_iff + (vK : MultiplicativeIntegerValuation Kˣ) + (vL : MultiplicativeIntegerValuation Lˣ) + (residueDegree : ℕ) + (hformula : + ∀ x : Lˣ, vK.val (normUnits K L x) = + (residueDegree : ℤ) * vL.val x) + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) : + ValuedNorm.MapsFiltrationLevels + (valuedFieldNorm K L vK vL residueDegree hformula) + UK UL targetLevel ↔ + fieldNormMapsFiltrationLevels K L UK UL targetLevel := + Iff.rfl + +/-- Filtration compatibility can be weakened by replacing the target level by +a coarser one. -/ +theorem fieldNormMapsFiltrationLevels_of_le + {UK : AntitoneSubgroupFiltration Kˣ} {UL : AntitoneSubgroupFiltration Lˣ} + {targetLevel targetLevel' : ℕ → ℕ} + (hN : fieldNormMapsFiltrationLevels K L UK UL targetLevel) + (hle : ∀ n, targetLevel' n ≤ targetLevel n) : + fieldNormMapsFiltrationLevels K L UK UL targetLevel' := by + intro n x hx + exact UK.mem_of_mem_of_le (hle n) (hN n hx) + +/-- The field norm restricted to a principal-unit filtration level. -/ +def fieldNormMapLevelOfMapsFiltrationLevels + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) + (hN : fieldNormMapsFiltrationLevels K L UK UL targetLevel) (n : ℕ) : + UL.principalUnitSubgroup n →* + UK.principalUnitSubgroup (targetLevel n) where + toFun x := ⟨normUnits K L x.1, hN n x.2⟩ + map_one' := by + apply Subtype.ext + exact (normUnits K L).map_one + map_mul' x y := by + apply Subtype.ext + exact (normUnits K L).map_mul x.1 y.1 + +/-- +The defining evaluation formula for `fieldNormMapLevelOfMapsFiltrationLevels` is +`(fieldNormMapLevelOfMapsFiltrationLevels K L UK UL targetLevel hN n x : Kˣ) = normUnits K L +x.1`. +-/ +@[simp] theorem fieldNormMapLevelOfMapsFiltrationLevels_apply + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) + (hN : fieldNormMapsFiltrationLevels K L UK UL targetLevel) (n : ℕ) + (x : UL.principalUnitSubgroup n) : + (fieldNormMapLevelOfMapsFiltrationLevels K L UK UL targetLevel hN n x : + Kˣ) = + normUnits K L x.1 := + rfl + +/-- The field norm descended to quotients by compatible principal-unit +filtration levels. -/ +def fieldNormFiltrationQuotientMap + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) + (hN : fieldNormMapsFiltrationLevels K L UK UL targetLevel) (n : ℕ) + [(UL.principalUnitSubgroup n).Normal] + [(UK.principalUnitSubgroup (targetLevel n)).Normal] : + Lˣ ⧸ UL.principalUnitSubgroup n →* + Kˣ ⧸ UK.principalUnitSubgroup (targetLevel n) := + QuotientGroup.map (UL.principalUnitSubgroup n) + (UK.principalUnitSubgroup (targetLevel n)) (normUnits K L) (by + intro x hx + exact hN n hx) + +/-- +The defining evaluation formula for `fieldNormFiltrationQuotientMap` is +`fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n (QuotientGroup.mk x) = QuotientGroup.mk +(normUnits K L x)`. +-/ +@[simp] theorem fieldNormFiltrationQuotientMap_apply_mk + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) + (hN : fieldNormMapsFiltrationLevels K L UK UL targetLevel) (n : ℕ) + [(UL.principalUnitSubgroup n).Normal] + [(UK.principalUnitSubgroup (targetLevel n)).Normal] (x : Lˣ) : + fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n + (QuotientGroup.mk x) = + QuotientGroup.mk (normUnits K L x) := + rfl + +/-- +Establishes the identity `fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n +(QuotientGroup.mk' (UL.principalUnitSubgroup n) x) = QuotientGroup.mk' (UK.principalUnitSubgroup +(targetLevel n)) (normUnits K L x)`. +-/ +@[simp] theorem fieldNormFiltrationQuotientMap_apply_mk' + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) + (hN : fieldNormMapsFiltrationLevels K L UK UL targetLevel) (n : ℕ) + [(UL.principalUnitSubgroup n).Normal] + [(UK.principalUnitSubgroup (targetLevel n)).Normal] (x : Lˣ) : + fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n + (QuotientGroup.mk' (UL.principalUnitSubgroup n) x) = + QuotientGroup.mk' (UK.principalUnitSubgroup (targetLevel n)) + (normUnits K L x) := + rfl + +/-- +Characterizes `fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n (QuotientGroup.mk' +(UL.principalUnitSubgroup n) x) = 1` by the equivalent condition `normUnits K L x ∈ +UK.principalUnitSubgroup (targetLevel n)`. +-/ +theorem fieldNormFiltrationQuotientMap_mk_eq_one_iff + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) + (hN : fieldNormMapsFiltrationLevels K L UK UL targetLevel) (n : ℕ) + [(UL.principalUnitSubgroup n).Normal] + [(UK.principalUnitSubgroup (targetLevel n)).Normal] (x : Lˣ) : + fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n + (QuotientGroup.mk' (UL.principalUnitSubgroup n) x) = 1 ↔ + normUnits K L x ∈ + UK.principalUnitSubgroup (targetLevel n) := by + rw [fieldNormFiltrationQuotientMap_apply_mk'] + exact UK.quotient_principalUnitSubgroup_mk_eq_one_iff + (targetLevel n) (normUnits K L x) + +/-- +Characterizes `fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n (QuotientGroup.mk' +(UL.principalUnitSubgroup n) x) = fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n +(QuotientGroup.mk' (UL.principalUnitSubgroup n) y)` by the equivalent condition `normUnits K +L (x / y) ∈ UK.principalUnitSubgroup (targetLevel n)`. +-/ +theorem fieldNormFiltrationQuotientMap_mk_eq_iff_div_mem + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) + (hN : fieldNormMapsFiltrationLevels K L UK UL targetLevel) (n : ℕ) + [(UL.principalUnitSubgroup n).Normal] + [(UK.principalUnitSubgroup (targetLevel n)).Normal] (x y : Lˣ) : + fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n + (QuotientGroup.mk' (UL.principalUnitSubgroup n) x) = + fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n + (QuotientGroup.mk' (UL.principalUnitSubgroup n) y) ↔ + normUnits K L (x / y) ∈ + UK.principalUnitSubgroup (targetLevel n) := by + rw [fieldNormFiltrationQuotientMap_apply_mk', + fieldNormFiltrationQuotientMap_apply_mk'] + rw [(normUnits K L).map_div x y] + exact + (UK.quotient_principalUnitSubgroup_mk_eq_iff_div_mem + (targetLevel n) (normUnits K L x) (normUnits K L y)) + +/-- +Characterizes `fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n (QuotientGroup.mk' +(UL.principalUnitSubgroup n) x) = fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n +(QuotientGroup.mk' (UL.principalUnitSubgroup n) y)` by the equivalent condition `normUnits K +L (y⁻¹ * x) ∈ UK.principalUnitSubgroup (targetLevel n)`. +-/ +theorem fieldNormFiltrationQuotientMap_mk_eq_iff_inv_mul_mem + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) + (hN : fieldNormMapsFiltrationLevels K L UK UL targetLevel) (n : ℕ) + [(UL.principalUnitSubgroup n).Normal] + [(UK.principalUnitSubgroup (targetLevel n)).Normal] (x y : Lˣ) : + fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n + (QuotientGroup.mk' (UL.principalUnitSubgroup n) x) = + fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n + (QuotientGroup.mk' (UL.principalUnitSubgroup n) y) ↔ + normUnits K L (y⁻¹ * x) ∈ + UK.principalUnitSubgroup (targetLevel n) := by + rw [fieldNormFiltrationQuotientMap_mk_eq_iff_div_mem + K L UK UL targetLevel hN n x y, + (normUnits K L).map_div x y, + UK.principalUnitSubgroup_div_mem_iff_inv_mul_mem + (targetLevel n) (normUnits K L x) (normUnits K L y)] + simp [mul_comm] + +/-- +Characterizes `Function.Surjective (fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n)` by +the equivalent condition `∀ y : Kˣ, ∃ x : Lˣ, normUnits K L x / y ∈ UK.principalUnitSubgroup +(targetLevel n)`. +-/ +theorem fieldNormFiltrationQuotientMap_surjective_iff_exists_div_mem + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) + (hN : fieldNormMapsFiltrationLevels K L UK UL targetLevel) (n : ℕ) + [(UL.principalUnitSubgroup n).Normal] + [(UK.principalUnitSubgroup (targetLevel n)).Normal] : + Function.Surjective + (fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n) ↔ + ∀ y : Kˣ, ∃ x : Lˣ, + normUnits K L x / y ∈ + UK.principalUnitSubgroup (targetLevel n) := by + constructor + · intro hsurj y + rcases hsurj (QuotientGroup.mk y) with ⟨q, hq⟩ + revert hq + refine QuotientGroup.induction_on q ?_ + intro x hq + rw [fieldNormFiltrationQuotientMap_apply_mk] at hq + exact ⟨x, + (QuotientGroup.eq_iff_div_mem + (N := UK.principalUnitSubgroup (targetLevel n)) + (x := normUnits K L x) (y := y)).1 hq⟩ + · intro h yq + refine QuotientGroup.induction_on yq ?_ + intro y + rcases h y with ⟨x, hx⟩ + refine ⟨QuotientGroup.mk x, ?_⟩ + rw [fieldNormFiltrationQuotientMap_apply_mk] + exact + (QuotientGroup.eq_iff_div_mem + (N := UK.principalUnitSubgroup (targetLevel n)) + (x := normUnits K L x) (y := y)).2 hx + +/-- +The specified map is surjective: `Function.Surjective (fieldNormFiltrationQuotientMap K L UK UL +targetLevel hN n)`. +-/ +theorem fieldNormFiltrationQuotientMap_surjective_of_exists_div_mem + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) + (hN : fieldNormMapsFiltrationLevels K L UK UL targetLevel) (n : ℕ) + [(UL.principalUnitSubgroup n).Normal] + [(UK.principalUnitSubgroup (targetLevel n)).Normal] + (hLift : ∀ y : Kˣ, ∃ x : Lˣ, + normUnits K L x / y ∈ + UK.principalUnitSubgroup (targetLevel n)) : + Function.Surjective + (fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n) := + (fieldNormFiltrationQuotientMap_surjective_iff_exists_div_mem + K L UK UL targetLevel hN n).2 hLift + +/-- The preimage of a target principal-unit filtration subgroup under the +field norm. -/ +def fieldNormFiltrationPreimageSubgroup + (UK : AntitoneSubgroupFiltration Kˣ) (targetLevel : ℕ → ℕ) (n : ℕ) : + Subgroup Lˣ := + (UK.principalUnitSubgroup (targetLevel n)).comap (normUnits K L) + +/-- +Characterizes `x ∈ fieldNormFiltrationPreimageSubgroup K L UK targetLevel n` by the equivalent +condition `normUnits K L x ∈ UK.principalUnitSubgroup (targetLevel n)`. +-/ +@[simp] theorem mem_fieldNormFiltrationPreimageSubgroup_iff + (UK : AntitoneSubgroupFiltration Kˣ) (targetLevel : ℕ → ℕ) (n : ℕ) + (x : Lˣ) : + x ∈ fieldNormFiltrationPreimageSubgroup K L UK targetLevel n ↔ + normUnits K L x ∈ + UK.principalUnitSubgroup (targetLevel n) := + Iff.rfl + +/-- +Proves the bound `UL.principalUnitSubgroup n ≤ fieldNormFiltrationPreimageSubgroup K L UK +targetLevel n`. +-/ +theorem principalUnitSubgroup_le_fieldNormFiltrationPreimageSubgroup + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) + (hN : fieldNormMapsFiltrationLevels K L UK UL targetLevel) (n : ℕ) : + UL.principalUnitSubgroup n ≤ + fieldNormFiltrationPreimageSubgroup K L UK targetLevel n := by + intro x hx + exact hN n hx + +/-- +The subgroup appearing in `(fieldNormFiltrationPreimageSubgroup K L UK targetLevel n).Normal` is +normal. +-/ +instance fieldNormFiltrationPreimageSubgroup_normal + (UK : AntitoneSubgroupFiltration Kˣ) (targetLevel : ℕ → ℕ) (n : ℕ) + [(UK.principalUnitSubgroup (targetLevel n)).Normal] : + (fieldNormFiltrationPreimageSubgroup K L UK targetLevel n).Normal := by + dsimp [fieldNormFiltrationPreimageSubgroup] + infer_instance + +/-- The class of the field-norm preimage of the target filtration subgroup +inside the source filtration quotient. -/ +def fieldNormFiltrationPreimageClassInQuotient + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) (n : ℕ) + [(UL.principalUnitSubgroup n).Normal] : + Subgroup (Lˣ ⧸ UL.principalUnitSubgroup n) := + Subgroup.map (QuotientGroup.mk' (UL.principalUnitSubgroup n)) + (fieldNormFiltrationPreimageSubgroup K L UK targetLevel n) + +/-- +The subgroup appearing in `(fieldNormFiltrationPreimageClassInQuotient K L UK UL targetLevel +n).Normal` is normal. +-/ +instance fieldNormFiltrationPreimageClassInQuotient_normal + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) (n : ℕ) + [(UL.principalUnitSubgroup n).Normal] + [(UK.principalUnitSubgroup (targetLevel n)).Normal] : + (fieldNormFiltrationPreimageClassInQuotient + K L UK UL targetLevel n).Normal := by + dsimp [fieldNormFiltrationPreimageClassInQuotient] + infer_instance + +/-- +Characterizes `q ∈ fieldNormFiltrationPreimageClassInQuotient K L UK UL targetLevel n` by the +equivalent condition `∃ x : Lˣ, x ∈ fieldNormFiltrationPreimageSubgroup K L UK targetLevel n ∧ +QuotientGroup.mk' (UL.principalUnitSubgroup n) x = q`. +-/ +theorem mem_fieldNormFiltrationPreimageClassInQuotient_iff + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) (n : ℕ) + [(UL.principalUnitSubgroup n).Normal] + (q : Lˣ ⧸ UL.principalUnitSubgroup n) : + q ∈ fieldNormFiltrationPreimageClassInQuotient + K L UK UL targetLevel n ↔ + ∃ x : Lˣ, + x ∈ fieldNormFiltrationPreimageSubgroup K L UK targetLevel n ∧ + QuotientGroup.mk' (UL.principalUnitSubgroup n) x = q := + Iff.rfl + +/-- +Characterizes `q ∈ fieldNormFiltrationPreimageClassInQuotient K L UK UL targetLevel n` by the +equivalent condition `∃ x : Lˣ, normUnits K L x ∈ UK.principalUnitSubgroup (targetLevel n) ∧ +QuotientGroup.mk' (UL.principalUnitSubgroup n) x = q`. +-/ +theorem mem_fieldNormFiltrationPreimageClassInQuotient_iff_exists_norm_mem + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) (n : ℕ) + [(UL.principalUnitSubgroup n).Normal] + (q : Lˣ ⧸ UL.principalUnitSubgroup n) : + q ∈ fieldNormFiltrationPreimageClassInQuotient + K L UK UL targetLevel n ↔ + ∃ x : Lˣ, + normUnits K L x ∈ + UK.principalUnitSubgroup (targetLevel n) ∧ + QuotientGroup.mk' (UL.principalUnitSubgroup n) x = q := by + rw [mem_fieldNormFiltrationPreimageClassInQuotient_iff + K L UK UL targetLevel n q] + rfl + +/-- +Establishes the membership statement `QuotientGroup.mk' (UL.principalUnitSubgroup n) x ∈ +fieldNormFiltrationPreimageClassInQuotient K L UK UL targetLevel n`. +-/ +theorem fieldNormFiltrationPreimageClassInQuotient_mk_mem + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) {n : ℕ} + [(UL.principalUnitSubgroup n).Normal] {x : Lˣ} + (hx : x ∈ fieldNormFiltrationPreimageSubgroup K L UK targetLevel n) : + QuotientGroup.mk' (UL.principalUnitSubgroup n) x ∈ + fieldNormFiltrationPreimageClassInQuotient K L UK UL targetLevel n := + Subgroup.mem_map_of_mem (QuotientGroup.mk' (UL.principalUnitSubgroup n)) hx + +/-- The kernel of the concrete field-norm filtration quotient map is the class +of the norm-preimage of the target filtration subgroup. -/ +theorem fieldNormFiltrationQuotientMap_ker_eq_preimageClass + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) + (hN : fieldNormMapsFiltrationLevels K L UK UL targetLevel) (n : ℕ) + [(UL.principalUnitSubgroup n).Normal] + [(UK.principalUnitSubgroup (targetLevel n)).Normal] : + (fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n).ker = + fieldNormFiltrationPreimageClassInQuotient + K L UK UL targetLevel n := by + exact QuotientGroup.ker_map (UL.principalUnitSubgroup n) + (UK.principalUnitSubgroup (targetLevel n)) (normUnits K L) + (by intro x hx; exact hN n hx) + +/-- +Characterizes `fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n q = 1` by the equivalent +condition `q ∈ fieldNormFiltrationPreimageClassInQuotient K L UK UL targetLevel n`. +-/ +theorem fieldNormFiltrationQuotientMap_eq_one_iff_mem_preimageClass + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) + (hN : fieldNormMapsFiltrationLevels K L UK UL targetLevel) (n : ℕ) + [(UL.principalUnitSubgroup n).Normal] + [(UK.principalUnitSubgroup (targetLevel n)).Normal] + (q : Lˣ ⧸ UL.principalUnitSubgroup n) : + fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n q = 1 ↔ + q ∈ fieldNormFiltrationPreimageClassInQuotient + K L UK UL targetLevel n := by + rw [← MonoidHom.mem_ker, + fieldNormFiltrationQuotientMap_ker_eq_preimageClass + K L UK UL targetLevel hN n] + +/-- First-isomorphism form of the concrete field-norm filtration quotient map, +with codomain the actual range when no surjectivity hypothesis is available. -/ +noncomputable def fieldNormFiltrationQuotientModuloPreimageClassEquivRange + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) + (hN : fieldNormMapsFiltrationLevels K L UK UL targetLevel) (n : ℕ) + [(UL.principalUnitSubgroup n).Normal] + [(UK.principalUnitSubgroup (targetLevel n)).Normal] : + (Lˣ ⧸ UL.principalUnitSubgroup n) ⧸ + fieldNormFiltrationPreimageClassInQuotient + K L UK UL targetLevel n ≃* + (fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n).range := + (QuotientGroup.quotientMulEquivOfEq + (fieldNormFiltrationQuotientMap_ker_eq_preimageClass + K L UK UL targetLevel hN n).symm).trans + (QuotientGroup.quotientKerEquivRange + (fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n)) + +/-- +Establishes the identity `fieldNormFiltrationQuotientModuloPreimageClassEquivRange K L UK UL +targetLevel hN n (QuotientGroup.mk' (fieldNormFiltrationPreimageClassInQuotient K L UK UL +targetLevel n) q) = (fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n).rangeRestrict q`. +-/ +theorem fieldNormFiltrationQuotientModuloPreimageClassEquivRange_mk + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) + (hN : fieldNormMapsFiltrationLevels K L UK UL targetLevel) (n : ℕ) + [(UL.principalUnitSubgroup n).Normal] + [(UK.principalUnitSubgroup (targetLevel n)).Normal] + (q : Lˣ ⧸ UL.principalUnitSubgroup n) : + fieldNormFiltrationQuotientModuloPreimageClassEquivRange + K L UK UL targetLevel hN n + (QuotientGroup.mk' + (fieldNormFiltrationPreimageClassInQuotient + K L UK UL targetLevel n) q) = + (fieldNormFiltrationQuotientMap + K L UK UL targetLevel hN n).rangeRestrict q := + rfl + +/-- +Establishes the identity `((fieldNormFiltrationQuotientModuloPreimageClassEquivRange K L UK UL +targetLevel hN n (QuotientGroup.mk' (fieldNormFiltrationPreimageClassInQuotient K L UK UL +targetLevel n) q) : (fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n).range) : Kˣ ⧸ +UK.principalUnitSubgroup (targetLevel n)) = fieldNormFiltrationQuotientMap K L UK UL targetLevel +hN n q`. +-/ +theorem coe_fieldNormFiltrationQuotientModuloPreimageClassEquivRange_mk + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) + (hN : fieldNormMapsFiltrationLevels K L UK UL targetLevel) (n : ℕ) + [(UL.principalUnitSubgroup n).Normal] + [(UK.principalUnitSubgroup (targetLevel n)).Normal] + (q : Lˣ ⧸ UL.principalUnitSubgroup n) : + ((fieldNormFiltrationQuotientModuloPreimageClassEquivRange + K L UK UL targetLevel hN n + (QuotientGroup.mk' + (fieldNormFiltrationPreimageClassInQuotient + K L UK UL targetLevel n) q) : + (fieldNormFiltrationQuotientMap + K L UK UL targetLevel hN n).range) : + Kˣ ⧸ UK.principalUnitSubgroup (targetLevel n)) = + fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n q := by + rw [fieldNormFiltrationQuotientModuloPreimageClassEquivRange_mk] + rfl + +/-- First-isomorphism form of a surjective concrete field-norm filtration +quotient map. -/ +noncomputable def fieldNormFiltrationQuotientModuloPreimageClassEquivTarget + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) + (hN : fieldNormMapsFiltrationLevels K L UK UL targetLevel) (n : ℕ) + [(UL.principalUnitSubgroup n).Normal] + [(UK.principalUnitSubgroup (targetLevel n)).Normal] + (hSurj : Function.Surjective + (fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n)) : + (Lˣ ⧸ UL.principalUnitSubgroup n) ⧸ + fieldNormFiltrationPreimageClassInQuotient + K L UK UL targetLevel n ≃* + Kˣ ⧸ UK.principalUnitSubgroup (targetLevel n) := + (QuotientGroup.quotientMulEquivOfEq + (fieldNormFiltrationQuotientMap_ker_eq_preimageClass + K L UK UL targetLevel hN n).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (φ := fieldNormFiltrationQuotientMap + K L UK UL targetLevel hN n) hSurj) + +/-- +Establishes the identity `fieldNormFiltrationQuotientModuloPreimageClassEquivTarget K L UK UL +targetLevel hN n hSurj (QuotientGroup.mk' (fieldNormFiltrationPreimageClassInQuotient K L UK UL +targetLevel n) q) = fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n q`. +-/ +theorem fieldNormFiltrationQuotientModuloPreimageClassEquivTarget_mk + (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) + (targetLevel : ℕ → ℕ) + (hN : fieldNormMapsFiltrationLevels K L UK UL targetLevel) (n : ℕ) + [(UL.principalUnitSubgroup n).Normal] + [(UK.principalUnitSubgroup (targetLevel n)).Normal] + (hSurj : Function.Surjective + (fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n)) + (q : Lˣ ⧸ UL.principalUnitSubgroup n) : + fieldNormFiltrationQuotientModuloPreimageClassEquivTarget + K L UK UL targetLevel hN n hSurj + (QuotientGroup.mk' + (fieldNormFiltrationPreimageClassInQuotient + K L UK UL targetLevel n) q) = + fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n q := by + rw [fieldNormFiltrationQuotientModuloPreimageClassEquivTarget, + QuotientGroup.quotientKerEquivOfSurjective, + QuotientGroup.quotientKerEquivOfRightInverse] + exact QuotientGroup.kerLift_mk + (φ := fieldNormFiltrationQuotientMap + K L UK UL targetLevel hN n) q + +end DiscreteValuationField + +end + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormBase.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormBase.lean new file mode 100644 index 0000000000..b376a56bbb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormBase.lean @@ -0,0 +1,230 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNorm +/-! +# Base-unit norm images in field towers + +This file isolates the purely algebraic source for the Abhyankar norm-image +argument: embedded base units, their powered image in a lower branch, and the +image obtained after applying the lower norm. The only theorem used is field +norm transitivity. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace LocalFieldTheory.DiscreteValuationField + +open LocalFieldTheory.DiscreteValuationField + +section BaseUnits + +variable {K L : Type u} +variable [Field K] [Field L] [Algebra K L] + +/-- The unit-group map induced by the algebra map. -/ +noncomputable def baseUnitsMap : Kˣ →* Lˣ := + Units.map (algebraMap K L).toMonoidHom + +/-- +The defining evaluation formula for `baseUnitsMap` is `baseUnitsMap (K := K) (L := L) x = +Units.map (algebraMap K L).toMonoidHom x`. +-/ +@[simp] theorem baseUnitsMap_apply (x : Kˣ) : + baseUnitsMap (K := K) (L := L) x = + Units.map (algebraMap K L).toMonoidHom x := + rfl + +/-- +The defining evaluation formula for `coe_baseUnitsMap` is `((baseUnitsMap (K := K) (L := L) x : +Lˣ) : L) = algebraMap K L (x : K)`. +-/ +@[simp] theorem coe_baseUnitsMap_apply (x : Kˣ) : + ((baseUnitsMap (K := K) (L := L) x : Lˣ) : L) = + algebraMap K L (x : K) := + rfl + +/-- The subgroup of extension units generated by embedded base units. -/ +noncomputable def baseUnitsImageSubgroup : Subgroup Lˣ := + (baseUnitsMap (K := K) (L := L)).range + +/-- +Characterizes `x ∈ baseUnitsImageSubgroup (K := K) (L := L)` by the equivalent condition `∃ y : +Kˣ, baseUnitsMap (K := K) (L := L) y = x`. +-/ +@[simp] theorem mem_baseUnitsImageSubgroup_iff (x : Lˣ) : + x ∈ baseUnitsImageSubgroup (K := K) (L := L) ↔ + ∃ y : Kˣ, baseUnitsMap (K := K) (L := L) y = x := + Iff.rfl + +/-- +Establishes the membership statement `baseUnitsMap (K := K) (L := L) x ∈ baseUnitsImageSubgroup (K +:= K) (L := L)`. +-/ +theorem baseUnitsMap_mem_baseUnitsImageSubgroup (x : Kˣ) : + baseUnitsMap (K := K) (L := L) x ∈ + baseUnitsImageSubgroup (K := K) (L := L) := + ⟨x, rfl⟩ + +end BaseUnits + +section Tower + +variable {K L M : Type u} +variable [Field K] [Field L] [Field M] +variable [Algebra K L] [Algebra K M] [Algebra L M] +variable [IsScalarTower K L M] + +/-- Embedded base units are compatible with field towers. -/ +theorem baseUnitsMap_tower (x : Kˣ) : + baseUnitsMap (K := L) (L := M) + (baseUnitsMap (K := K) (L := L) x) = + baseUnitsMap (K := K) (L := M) x := by + ext + simpa [baseUnitsMap] using + (IsScalarTower.algebraMap_apply K L M (x : K)).symm + +/-- Elementwise tower transport for the subgroup of embedded base units. -/ +theorem baseUnitsMap_mem_baseUnitsImageSubgroup_tower + {x : Lˣ} (hx : x ∈ baseUnitsImageSubgroup (K := K) (L := L)) : + baseUnitsMap (K := L) (L := M) x ∈ + baseUnitsImageSubgroup (K := K) (L := M) := by + rcases hx with ⟨y, hy⟩ + refine ⟨y, ?_⟩ + rw [← hy] + exact (baseUnitsMap_tower (K := K) (L := L) (M := M) y).symm + +/-- Subgroup-level tower transport for embedded base units. -/ +theorem baseUnitsImageSubgroup_map_le_tower : + (baseUnitsImageSubgroup (K := K) (L := L)).map + (baseUnitsMap (K := L) (L := M)) ≤ + baseUnitsImageSubgroup (K := K) (L := M) := by + intro x hx + rcases hx with ⟨y, hyS, hyx⟩ + rw [← hyx] + exact baseUnitsMap_mem_baseUnitsImageSubgroup_tower + (K := K) (L := L) (M := M) hyS + +end Tower + +section LowerNormTower + +variable {K L M : Type u} +variable [Field K] [Field L] [Field M] +variable [Algebra K L] [Algebra L M] + +/-- The `[M : L]`-power endomorphism on lower-branch units. -/ +noncomputable def finrankPowerUnitsHom : Lˣ →* Lˣ where + toFun x := x ^ Module.finrank L M + map_one' := by + simp + map_mul' x y := by + simpa using mul_pow x y (Module.finrank L M) + +/-- The subgroup of lower-branch units obtained by taking `[M : L]`-th powers +of embedded base units. -/ +noncomputable def poweredBaseUnitsImageSubgroup : Subgroup Lˣ := + (baseUnitsImageSubgroup (K := K) (L := L)).map + (finrankPowerUnitsHom (L := L) (M := M)) + +/-- A powered embedded base unit lies in the powered image subgroup. -/ +theorem pow_mem_poweredBaseUnitsImageSubgroup_of_mem + {x : Lˣ} (hx : x ∈ baseUnitsImageSubgroup (K := K) (L := L)) : + x ^ Module.finrank L M ∈ + poweredBaseUnitsImageSubgroup (K := K) (L := L) (M := M) := + ⟨x, hx, rfl⟩ + +/-- A base unit embedded from `K` to `L` has its `[M : L]`-th power in the norm +subgroup for `M/L`. -/ +theorem baseUnitsMap_pow_finrank_mem_fieldNormSubgroup_tower + (x : Kˣ) : + baseUnitsMap (K := K) (L := L) x ^ Module.finrank L M ∈ + fieldNormSubgroup L M := + fieldNormSubgroup_pow_finrank_mem L M + (baseUnitsMap (K := K) (L := L) x) + +/-- Elementwise comparison with the norm subgroup: every element of the +`K`-base-unit image inside `L` becomes a norm from `M/L` after taking the +`[M : L]`-th power. -/ +theorem pow_finrank_mem_fieldNormSubgroup_of_mem_baseUnitsImage_tower + {x : Lˣ} (hx : x ∈ baseUnitsImageSubgroup (K := K) (L := L)) : + x ^ Module.finrank L M ∈ fieldNormSubgroup L M := by + rcases hx with ⟨y, hy⟩ + rw [← hy] + exact baseUnitsMap_pow_finrank_mem_fieldNormSubgroup_tower + (K := K) (L := L) (M := M) y + +/-- The powered embedded-base-unit image is contained in the field-norm +subgroup for `M/L`. -/ +theorem poweredBaseUnitsImageSubgroup_le_fieldNormSubgroup : + poweredBaseUnitsImageSubgroup (K := K) (L := L) (M := M) ≤ + fieldNormSubgroup L M := by + intro x hx + rcases hx with ⟨y, hyS, hyx⟩ + rw [← hyx] + exact pow_finrank_mem_fieldNormSubgroup_of_mem_baseUnitsImage_tower + (K := K) (L := L) (M := M) hyS + +end LowerNormTower + +section NormDownTower + +variable {K L M : Type u} +variable [Field K] [Field L] [Field M] +variable [Algebra K L] [Algebra L M] + +/-- The `K`-norm image of the powered embedded-base-unit subgroup in the lower +branch. -/ +noncomputable def normPoweredBaseUnitsImageSubgroup : Subgroup Kˣ := + (poweredBaseUnitsImageSubgroup (K := K) (L := L) (M := M)).map + (normUnits K L) + +/-- A powered embedded base unit, after applying `N_{L/K}`, lies in the normed +powered image subgroup. -/ +theorem fieldNormUnits_pow_mem_normPoweredBaseUnitsImageSubgroup_of_mem + {x : Lˣ} (hx : x ∈ baseUnitsImageSubgroup (K := K) (L := L)) : + normUnits K L (x ^ Module.finrank L M) ∈ + normPoweredBaseUnitsImageSubgroup (K := K) (L := L) (M := M) := + ⟨x ^ Module.finrank L M, + pow_mem_poweredBaseUnitsImageSubgroup_of_mem + (K := K) (L := L) (M := M) hx, + rfl⟩ + +variable [Algebra K M] [IsScalarTower K L M] [Module.Free L M] + +/-- Norm transitivity sends the normed powered embedded-base-unit image into +the common-top field-norm subgroup `N_{M/K}(Mˣ)`. -/ +theorem normPoweredBaseUnitsImageSubgroup_le_fieldNormSubgroup_top : + normPoweredBaseUnitsImageSubgroup (K := K) (L := L) (M := M) ≤ + fieldNormSubgroup K M := by + intro x hx + rcases hx with ⟨y, hyS, hyx⟩ + have hyNorm : + y ∈ fieldNormSubgroup L M := + poweredBaseUnitsImageSubgroup_le_fieldNormSubgroup + (K := K) (L := L) (M := M) hyS + rcases hyNorm with ⟨z, hz⟩ + refine ⟨z, ?_⟩ + calc + normUnits K M z = + normUnits K L (normUnits L M z) := by + exact (normUnits_tower K L M z).symm + _ = normUnits K L y := by + rw [hz] + _ = x := hyx + +end NormDownTower + +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormEquiv.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormEquiv.lean new file mode 100644 index 0000000000..e1a100c3ae --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormEquiv.lean @@ -0,0 +1,61 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNorm +/-! +# Field-norm subgroups under algebra equivalence + +An algebra equivalence over the base field preserves the field norm and +therefore identifies the corresponding norm subgroups of the base unit +group. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w + +namespace LocalFieldTheory.DiscreteValuationField + +variable (K : Type u) (L : Type v) (E : Type w) +variable [Field K] [Field L] [Field E] +variable [Algebra K L] [Algebra K E] + +/-- Mapping a unit through a base-field algebra equivalence does not change +its field norm. -/ +theorem fieldNormUnits_map_algEquiv + (e : L ≃ₐ[K] E) (z : Lˣ) : + normUnits K E + (Units.map e.toRingEquiv.toMonoidHom z) = + normUnits K L z := by + apply Units.ext + change + Algebra.norm K (e (z : L)) = + Algebra.norm K (z : L) + exact Algebra.norm_eq_of_algEquiv e (z : L) + +/-- Base-field algebra-equivalent extensions have the same norm subgroup. -/ +theorem fieldNormSubgroup_eq_of_algEquiv + (e : L ≃ₐ[K] E) : + fieldNormSubgroup K L = fieldNormSubgroup K E := by + ext x + constructor + · rintro ⟨z, rfl⟩ + refine + ⟨Units.map e.toRingEquiv.toMonoidHom z, ?_⟩ + exact fieldNormUnits_map_algEquiv K L E e z + · rintro ⟨z, rfl⟩ + refine + ⟨Units.map e.symm.toRingEquiv.toMonoidHom z, ?_⟩ + exact fieldNormUnits_map_algEquiv K E L e.symm z + +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitDecomposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitDecomposition.lean new file mode 100644 index 0000000000..e0ccb4fbab --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitDecomposition.lean @@ -0,0 +1,1412 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuedExtensionUnitMap +public import Mathlib.Topology.Algebra.Group.Units +/-! +# Principal-unit decomposition + +This file connects the principal-unit decomposition proved in +`PrincipalUnits` to the standard integer-valued field-unit valuation attached +to a `ℤᵐ⁰`-valued complete discrete valuation. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + roots_principalUnit_uniformizer_zpow_eq_iff → + roots_principalUnit_uniformizer_zpow_eq_iff + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming + multiplicativeIntegerValuationOfUniformizer → + multiplicativeIntegerValuationOfUniformizer + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming + multiplicativeIntegerValuationOfUniformizer_isUniformizer → + multiplicativeIntegerValuationOfUniformizer_isUniformizer + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming + multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup → + multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming + uniformizerValueExponent → + uniformizerValueExponent + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming + uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit → + uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit + + +noncomputable +section + +open Filter +open scoped Topology +open ValuationTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + +universe u v + +namespace LocalFieldTheory.DiscreteValuationField +namespace CompleteDVF +namespace higherPrincipalUnitGroup + +variable {K : Type u} [Field K] + +/-- The uniformizer–residue–principal-unit decomposition, complete-DVF form: every field unit is a +product of a lifted residue root of unity, a first principal unit, and an +integral power of a chosen uniformizer. -/ +theorem exists_roots_principalUnit_uniformizer_zpow_of_completeDVF + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (x : Kˣ) : + ∃ ζ : residueRootsOfUnityGroup F, + ∃ p : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1, + ∃ n : ℤ, + x = + valuationSubringUnitFieldUnitHom F + (ζ : F.valuationSubringˣ) * + valuationSubringUnitFieldUnitHom F + (p : F.valuationSubringˣ) * + (Units.mk0 (π : K) hπ.ne_zero) ^ n := by + let V : MultiplicativeIntegerValuation Kˣ := + (multiplicativeIntegerValuationOfUniformizer F) hπ + have hzero : V.zeroSubgroup = F.valuation.valuationSubring.unitGroup := by + simpa [V] using + (multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) + hπ + have hπV : + V.IsUniformizer (Units.mk0 (π : K) hπ.ne_zero) := by + simpa [V] using + (multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ + simpa [V] using + exists_roots_principalUnit_uniformizer_zpow_of_zeroSubgroup_eq_unitGroup + (F := F) V hzero hπV x + +/-- Uniqueness part of the uniformizer–residue–principal-unit decomposition for an arbitrary +complete DVF and fixed uniformizer. -/ +theorem roots_principalUnit_uniformizer_zpow_eq_iff_of_completeDVF + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (ζ η : residueRootsOfUnityGroup F) + (p q : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + (m n : ℤ) : + valuationSubringUnitFieldUnitHom F + (ζ : F.valuationSubringˣ) * + valuationSubringUnitFieldUnitHom F + (p : F.valuationSubringˣ) * + (Units.mk0 (π : K) hπ.ne_zero) ^ m = + valuationSubringUnitFieldUnitHom F + (η : F.valuationSubringˣ) * + valuationSubringUnitFieldUnitHom F + (q : F.valuationSubringˣ) * + (Units.mk0 (π : K) hπ.ne_zero) ^ n ↔ + ζ = η ∧ p = q ∧ m = n := by + let V : MultiplicativeIntegerValuation Kˣ := + (multiplicativeIntegerValuationOfUniformizer F) hπ + have hzero : V.zeroSubgroup = F.valuation.valuationSubring.unitGroup := by + simpa [V] using + (multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) + hπ + have hπV : + V.IsUniformizer (Units.mk0 (π : K) hπ.ne_zero) := by + simpa [V] using + (multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ + simpa [V] using + roots_principalUnit_uniformizer_zpow_eq_iff_of_zeroSubgroup_eq_unitGroup + (F := F) V hzero hπV ζ η p q m n + +/-- The uniformizer–residue–principal-unit decomposition, group-isomorphism form for a complete +DVF with a fixed uniformizer: +`K^* ≃ μ_{q-1} × U^1 × ℤ`. -/ +noncomputable def fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) : + fieldUnitDecompositionFactors F ≃* Kˣ := by + let V : MultiplicativeIntegerValuation Kˣ := + (multiplicativeIntegerValuationOfUniformizer F) hπ + have hzero : V.zeroSubgroup = F.valuation.valuationSubring.unitGroup := by + simpa [V] using + (multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) + hπ + have hπV : + V.IsUniformizer (Units.mk0 (π : K) hπ.ne_zero) := by + simpa [V] using + (multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ + exact + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfZeroSubgroupEqUnitGroup + (F := F) V hzero hπV + +/-- +The defining evaluation formula for `fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF` +is `fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ z = +valuationSubringUnitFieldUnitHom F (z.1.1 : F.valuationSubringˣ) * +valuationSubringUnitFieldUnitHom F (z.1.2 : F.valuationSubringˣ) * (Units.mk0 (π : K) hπ.ne_zero) +^ Multiplicative.toAdd z.2`. +-/ +@[simp] +theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (z : fieldUnitDecompositionFactors F) : + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ z = + valuationSubringUnitFieldUnitHom F + (z.1.1 : F.valuationSubringˣ) * + valuationSubringUnitFieldUnitHom F + (z.1.2 : F.valuationSubringˣ) * + (Units.mk0 (π : K) hπ.ne_zero) ^ Multiplicative.toAdd z.2 := by + let V : MultiplicativeIntegerValuation Kˣ := + (multiplicativeIntegerValuationOfUniformizer F) hπ + have hzero : V.zeroSubgroup = F.valuation.valuationSubring.unitGroup := by + simpa [V] using + (multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) + hπ + have hπV : + V.IsUniformizer (Units.mk0 (π : K) hπ.ne_zero) := by + simpa [V] using + (multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ + have happ := + fieldUnitsEquivRootsPrincipalUnitsUniformizer_apply + F V + (fun y => + mem_zeroSubgroup_iff_exists_valuationSubringUnitFieldUnitHom_eq + (F := F) V hzero y) + hπV z + simp [fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF, + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfZeroSubgroupEqUnitGroup] + +/-- +Establishes the identity `((CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ).val +(fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ z) = Multiplicative.toAdd z.2`. +-/ +theorem multiplicativeIntegerValuationOfUniformizer_fieldUnitsEquivRootsPrincipalUnitsUniformizer + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (z : fieldUnitDecompositionFactors F) : + ((multiplicativeIntegerValuationOfUniformizer F) hπ).val + (fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ z) = + Multiplicative.toAdd z.2 := by + let V : MultiplicativeIntegerValuation Kˣ := + (multiplicativeIntegerValuationOfUniformizer F) hπ + have hzero : + ∀ y : Kˣ, y ∈ V.zeroSubgroup ↔ + ∃ u : F.valuationSubringˣ, + valuationSubringUnitFieldUnitHom F u = y := by + intro y + exact + mem_zeroSubgroup_iff_exists_valuationSubringUnitFieldUnitHom_eq + (F := F) V + (by + simpa [V] using + (multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) hπ) + y + have hπV : + V.IsUniformizer (Units.mk0 (π : K) hπ.ne_zero) := by + simpa [V] using + (multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ + have hunit : + valuationSubringUnitFieldUnitHom F + (z.1.1 : F.valuationSubringˣ) * + valuationSubringUnitFieldUnitHom F + (z.1.2 : F.valuationSubringˣ) ∈ + V.zeroSubgroup := + (hzero _).2 + ⟨(z.1.1 : F.valuationSubringˣ) * (z.1.2 : F.valuationSubringˣ), by + rw [map_mul]⟩ + rw [fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply] + exact V.valuation_uniformizer_normal_form hπV hunit (Multiplicative.toAdd z.2) + +/-- +Establishes the identity `(CompleteDVF.uniformizerValueExponent F) hπ +(fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ z) = Multiplicative.toAdd z.2`. +-/ +theorem uniformizerValueExponent_fieldUnitsEquivRootsPrincipalUnitsUniformizer + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (z : fieldUnitDecompositionFactors F) : + (uniformizerValueExponent F) hπ + (fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ z) = + Multiplicative.toAdd z.2 := + multiplicativeIntegerValuationOfUniformizer_fieldUnitsEquivRootsPrincipalUnitsUniformizer + F hπ z + +/-- +Establishes the identity `Multiplicative.toAdd +((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).2 = +(CompleteDVF.uniformizerValueExponent F) hπ x`. +-/ +theorem uniformizerValueExponent_fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (x : Kˣ) : + Multiplicative.toAdd + ((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ).symm x).2 = + (uniformizerValueExponent F) hπ + x := by + have h := + uniformizerValueExponent_fieldUnitsEquivRootsPrincipalUnitsUniformizer + F hπ + ((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ).symm x) + simpa using h.symm + +/-- +Establishes the identity `((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F +hπ).symm x).2 = Multiplicative.ofAdd ((CompleteDVF.uniformizerValueExponent F) hπ x)`. +-/ +@[simp] +theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_snd + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (x : Kˣ) : + ((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ).symm x).2 = + Multiplicative.ofAdd + ((uniformizerValueExponent F) + hπ x) := by + let E := + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ + have h : + Multiplicative.toAdd ((E.symm x).2) = + (uniformizerValueExponent F) + hπ x := by + exact uniformizerValueExponent_fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm F hπ x + calc + (E.symm x).2 = Multiplicative.ofAdd (Multiplicative.toAdd ((E.symm x).2)) := by + simp + _ = Multiplicative.ofAdd + ((uniformizerValueExponent F) + hπ x) := by + rw [h] + +/-- +`fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_factors_mul_uniformizer` satisfies the +integer-power formula `valuationSubringUnitFieldUnitHom F +(((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).1.1 : +F.valuationSubringˣ) * valuationSubringUnitFieldUnitHom F +(((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).1.2 : +F.valuationSubringˣ) * (Units.mk0 (π : K) hπ.ne_zero) ^ (CompleteDVF.uniformizerValueExponent F) +hπ x = x`. +-/ +theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_factors_mul_uniformizer_zpow + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (x : Kˣ) : + valuationSubringUnitFieldUnitHom F + (((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ).symm x).1.1 : F.valuationSubringˣ) * + valuationSubringUnitFieldUnitHom F + (((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ).symm x).1.2 : F.valuationSubringˣ) * + (Units.mk0 (π : K) hπ.ne_zero) ^ + (uniformizerValueExponent + F) hπ x = + x := by + let E := + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ + have hexp : + Multiplicative.toAdd ((E.symm x).2) = + (uniformizerValueExponent F) + hπ x := by + simp [E] + calc + valuationSubringUnitFieldUnitHom F + (((E.symm x).1.1 : F.valuationSubringˣ)) * + valuationSubringUnitFieldUnitHom F + (((E.symm x).1.2 : F.valuationSubringˣ)) * + (Units.mk0 (π : K) hπ.ne_zero) ^ + (uniformizerValueExponent + F) hπ x = + valuationSubringUnitFieldUnitHom F + (((E.symm x).1.1 : F.valuationSubringˣ)) * + valuationSubringUnitFieldUnitHom F + (((E.symm x).1.2 : F.valuationSubringˣ)) * + (Units.mk0 (π : K) hπ.ne_zero) ^ Multiplicative.toAdd ((E.symm x).2) := by + rw [hexp] + _ = E (E.symm x) := by + rw [fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply] + _ = x := E.apply_symm_apply x + +/-- +`fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_unitPart_eq_mul_uniformizer_zpow` satisfies +the negation formula `valuationSubringUnitFieldUnitHom F +(((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).1.1 : +F.valuationSubringˣ) * valuationSubringUnitFieldUnitHom F +(((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).1.2 : +F.valuationSubringˣ) = x * (Units.mk0 (π : K) hπ.ne_zero) ^ +(-((CompleteDVF.uniformizerValueExponent F) hπ x))`. +-/ +theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_unitPart_eq_mul_uniformizer_zpow_neg + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (x : Kˣ) : + valuationSubringUnitFieldUnitHom F + (((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ).symm x).1.1 : F.valuationSubringˣ) * + valuationSubringUnitFieldUnitHom F + (((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ).symm x).1.2 : F.valuationSubringˣ) = + x * (Units.mk0 (π : K) hπ.ne_zero) ^ + (-((uniformizerValueExponent + F) hπ x)) := by + let ϖ : Kˣ := Units.mk0 (π : K) hπ.ne_zero + let u : Kˣ := + valuationSubringUnitFieldUnitHom F + (((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ).symm x).1.1 : F.valuationSubringˣ) * + valuationSubringUnitFieldUnitHom F + (((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ).symm x).1.2 : F.valuationSubringˣ) + have hux : + u * ϖ ^ + (uniformizerValueExponent F) + hπ x = x := by + simpa [u, ϖ] using + fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_factors_mul_uniformizer_zpow + F hπ x + calc + u = u * 1 := by simp + _ = u * (ϖ ^ + (uniformizerValueExponent F) hπ x * + ϖ ^ (-((uniformizerValueExponent F) hπ x))) := by + rw [← zpow_add, add_neg_cancel, zpow_zero] + _ = x * ϖ ^ + (-((uniformizerValueExponent F) + hπ x)) := by + rw [← mul_assoc, hux] + +/-- +Establishes the membership statement `x * (Units.mk0 (π : K) hπ.ne_zero) ^ +(-((CompleteDVF.uniformizerValueExponent F) hπ x)) ∈ F.valuation.valuationSubring.unitGroup`. +-/ +theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_unitPart_mem_unitGroup + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (x : Kˣ) : + x * (Units.mk0 (π : K) hπ.ne_zero) ^ + (-((uniformizerValueExponent + F) hπ x)) ∈ + F.valuation.valuationSubring.unitGroup := by + let V : MultiplicativeIntegerValuation Kˣ := + (multiplicativeIntegerValuationOfUniformizer F) hπ + have hzero : + V.zeroSubgroup = F.valuation.valuationSubring.unitGroup := by + simpa [V] using + (multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) hπ + have hπV : + V.IsUniformizer (Units.mk0 (π : K) hπ.ne_zero) := by + simpa [V] using + (multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ + have hmem : + x * (Units.mk0 (π : K) hπ.ne_zero) ^ + (-((uniformizerValueExponent F) hπ x)) ∈ + V.zeroSubgroup := by + rw [V.mem_zeroSubgroup_iff, V.val_mul, V.val_uniformizer_zpow hπV] + simp [V] + simpa [hzero] using hmem + +/-- The valuation-ring unit obtained by removing the uniformizer power from a +field unit. -/ +noncomputable def fieldUnitUniformizerUnitPart + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (x : Kˣ) : F.valuationSubringˣ := + F.valuation.valuationSubring.unitGroupMulEquiv + ⟨x * (Units.mk0 (π : K) hπ.ne_zero) ^ + (-((uniformizerValueExponent + F) hπ x)), + fieldUnitsEquivRootsPrincipalUnitsUniformizer_unitPart_mem_unitGroup + F hπ x⟩ + +/-- +Establishes the identity `valuationSubringUnitFieldUnitHom F (fieldUnitUniformizerUnitPart F hπ x) += x * (Units.mk0 (π : K) hπ.ne_zero) ^ (-((CompleteDVF.uniformizerValueExponent F) hπ x))`. +-/ +@[simp] +theorem valuationSubringUnitFieldUnitHom_fieldUnitUniformizerUnitPart + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (x : Kˣ) : + valuationSubringUnitFieldUnitHom F + (fieldUnitUniformizerUnitPart F hπ x) = + x * (Units.mk0 (π : K) hπ.ne_zero) ^ + (-((uniformizerValueExponent + F) hπ x)) := by + apply Units.ext + simp [valuationSubringUnitFieldUnitHom, fieldUnitUniformizerUnitPart] + +/-- +Establishes the identity `(((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F +hπ).symm x).1.1 : F.valuationSubringˣ) * +(((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).1.2 : +F.valuationSubringˣ) = fieldUnitUniformizerUnitPart F hπ x`. +-/ +theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_unitSubringUnit_eq + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (x : Kˣ) : + (((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ).symm x).1.1 : F.valuationSubringˣ) * + (((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ).symm x).1.2 : F.valuationSubringˣ) = + fieldUnitUniformizerUnitPart F hπ x := by + apply valuationSubringUnitFieldUnitHom_injective + rw [map_mul] + rw [fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_unitPart_eq_mul_uniformizer_zpow_neg] + rw [valuationSubringUnitFieldUnitHom_fieldUnitUniformizerUnitPart] + +/-- +Establishes the identity `((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F +hπ).symm x).1 = (valuationSubringUnitsEquivRootsTimesPrincipalUnits F).symm +(fieldUnitUniformizerUnitPart F hπ x)`. +-/ +theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_fst_eq_unitPart + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (x : Kˣ) : + ((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ).symm x).1 = + (valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).symm + (fieldUnitUniformizerUnitPart F hπ x) := by + apply (valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).injective + simpa [valuationSubringUnitsEquivRootsTimesPrincipalUnits_apply] + using + fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_unitSubringUnit_eq + F hπ x + +/-- Equality of range-restricted values forces equality of the integral +uniformizer exponents. -/ +theorem uniformizerValueExponent_eq_of_mrangeRestrict_eq + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + {x y : Kˣ} + (hxy : + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) (y : K) = + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) (x : K)) : + (uniformizerValueExponent F) hπ y = + (uniformizerValueExponent F) hπ + x := by + have hval : F.valuation (y : K) = F.valuation (x : K) := + congrArg Subtype.val hxy + apply + ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_inj + F) hπ).1 + calc + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit F) hπ ^ + (uniformizerValueExponent F) hπ y = + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) y := by + rw [(uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F)] + _ = (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) x := by + ext + simpa [CompleteDVF.fieldUnitValueUnit] using hval + _ = (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit F) hπ ^ + (uniformizerValueExponent F) hπ + x := by + rw [(uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F)] + +/-- The uniformizer exponent is locally constant for the range-restricted +valuation topology. -/ +theorem eventually_uniformizerValueExponent_eq_mrangeRestrict + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (x : Kˣ) : + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + ∀ᶠ y : Kˣ in 𝓝 x, + (uniformizerValueExponent F) hπ y = + (uniformizerValueExponent F) + hπ x := by + let Γ : Type v := + MonoidHom.mrange F.valuation.toMonoidWithZeroHom + let : Valued K Γ := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + have hxne : ((Valued.v : _root_.Valuation K Γ) (x : K) : Γ) ≠ 0 := + ((_root_.Valuation.ne_zero_iff + (Valued.v : _root_.Valuation K Γ)).2 x.ne_zero) + have hlocK : + { y : K | + (Valued.v : _root_.Valuation K Γ) y = + (Valued.v : _root_.Valuation K Γ) (x : K) } ∈ 𝓝 (x : K) := + by + have hxrestrictne : + (Valued.v : _root_.Valuation K Γ).restrict (x : K) ≠ 0 := + ne_of_gt + ((_root_.Valuation.restrict_pos_iff + (Valued.v : _root_.Valuation K Γ) (x : K)).2 + (zero_lt_iff.mpr hxne)) + simpa only [_root_.Valuation.restrict_inj] using + (Valued.isOpen_sphere K hxrestrictne).mem_nhds (by rfl) + have hlocUnits : + { y : Kˣ | + (Valued.v : _root_.Valuation K Γ) (y : K) = + (Valued.v : _root_.Valuation K Γ) (x : K) } ∈ 𝓝 x := by + simpa [Set.preimage] using Units.continuous_val.continuousAt hlocK + exact Filter.mem_of_superset hlocUnits fun y hy => + uniformizerValueExponent_eq_of_mrangeRestrict_eq + F hπ (by + apply Subtype.ext + change F.valuation (y : K) = F.valuation (x : K) + have hval := congrArg Subtype.val hy + change F.valuation (y : K) = F.valuation (x : K) at hval + exact hval) + +/-- The integer-valued uniformizer exponent is continuous for the +range-restricted valuation topology. -/ +theorem continuous_uniformizerValueExponent_mrangeRestrict + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) : + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + Continuous (fun x : Kˣ => + (uniformizerValueExponent F) hπ + x) := by + let Γ : Type v := + MonoidHom.mrange F.valuation.toMonoidWithZeroHom + let : Valued K Γ := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + rw [continuous_iff_continuousAt] + intro x + rw [continuousAt_def] + intro s hs + have hxmem : + (uniformizerValueExponent F) hπ x + ∈ s := + mem_of_mem_nhds hs + exact + Filter.mem_of_superset + (eventually_uniformizerValueExponent_eq_mrangeRestrict + F hπ x) + (fun y hy => by + change + (uniformizerValueExponent + F) hπ y ∈ s + rw [hy] + exact hxmem) + +/-- The integer factor of the inverse decomposition map is continuous. -/ +theorem continuous_fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_snd_mrangeRestrict + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) : + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + Continuous (fun x : Kˣ => + ((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ).symm x).2) := by + let : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + have hval : + Continuous (fun x : Kˣ => + (uniformizerValueExponent F) + hπ x) := + continuous_uniformizerValueExponent_mrangeRestrict + F hπ + have hofAdd : + Continuous (fun n : ℤ => (Multiplicative.ofAdd n : Multiplicative ℤ)) := + continuous_of_discreteTopology + exact (hofAdd.comp hval).congr fun x => + (fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_snd + F hπ x).symm + +/-- Removing the uniformizer power from a field unit is continuous as a map +to valuation-ring units. -/ +theorem continuous_fieldUnitUniformizerUnitPart_mrangeRestrict + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) : + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + Continuous (fun x : Kˣ => + fieldUnitUniformizerUnitPart F hπ x) := by + let : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + let ϖ : Kˣ := Units.mk0 (π : K) hπ.ne_zero + have hval : + Continuous (fun x : Kˣ => + (uniformizerValueExponent F) + hπ x) := + continuous_uniformizerValueExponent_mrangeRestrict + F hπ + have hpow : + Continuous (fun n : ℤ => ϖ ^ (-n)) := + continuous_of_discreteTopology + have hfield : + Continuous (fun x : Kˣ => + x * ϖ ^ + (-((uniformizerValueExponent F) hπ x))) := + continuous_id.mul (hpow.comp hval) + rw [Units.continuous_iff] + constructor + · have hfieldK : + Continuous (fun x : Kˣ => + ((x * ϖ ^ + (-((uniformizerValueExponent F) hπ x)) : Kˣ) : K)) := + Units.continuous_val.comp hfield + have hcoerced : + Continuous (fun x : Kˣ => + ((fieldUnitUniformizerUnitPart F hπ x : + F.valuationSubring) : K)) := by + convert hfieldK using 1 + funext x + calc + _ = ((valuationSubringUnitFieldUnitHom F + (fieldUnitUniformizerUnitPart F hπ x) : Kˣ) : K) := + (coe_valuationSubringUnitFieldUnitHom_apply F + (fieldUnitUniformizerUnitPart F hπ x)).symm + _ = _ := + congrArg (fun y : Kˣ => (y : K)) + (valuationSubringUnitFieldUnitHom_fieldUnitUniformizerUnitPart + F hπ x) + exact Continuous.subtype_mk hcoerced fun x => + (fieldUnitUniformizerUnitPart F hπ x : + F.valuationSubring).2 + · have hfieldInvK : + Continuous (fun x : Kˣ => + (((x * ϖ ^ + (-((uniformizerValueExponent F) hπ x)) : Kˣ)⁻¹ : + Kˣ) : K)) := + Units.continuous_val.comp hfield.inv + have hcoercedInv : + Continuous (fun x : Kˣ => + ((((fieldUnitUniformizerUnitPart F hπ x)⁻¹ : + F.valuationSubringˣ) : F.valuationSubring) : K)) := by + convert hfieldInvK using 1 + funext x + calc + _ = ((valuationSubringUnitFieldUnitHom F + ((fieldUnitUniformizerUnitPart F hπ x)⁻¹) : Kˣ) : K) := + (coe_valuationSubringUnitFieldUnitHom_apply F + ((fieldUnitUniformizerUnitPart F hπ x)⁻¹)).symm + _ = (((valuationSubringUnitFieldUnitHom F + (fieldUnitUniformizerUnitPart F hπ x))⁻¹ : Kˣ) : K) := by + rw [map_inv] + _ = _ := + congrArg (fun y : Kˣ => ((y⁻¹ : Kˣ) : K)) + (valuationSubringUnitFieldUnitHom_fieldUnitUniformizerUnitPart + F hπ x) + exact Continuous.subtype_mk hcoercedInv fun x => + (((fieldUnitUniformizerUnitPart F hπ x)⁻¹ : + F.valuationSubringˣ) : F.valuationSubring).2 + +/-- The first principal-unit subgroup is open in valuation-ring units for the +range-restricted valuation topology. -/ +theorem isOpen_higherPrincipalUnitGroup_one_mrangeRestrict + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) : + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + IsOpen (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 + : Set F.valuationSubringˣ)) := by + let Γ : Type v := + MonoidHom.mrange F.valuation.toMonoidWithZeroHom + let : Valued K Γ := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + rw [isOpen_iff_mem_nhds] + intro u hu + have hu_lt : + F.valuation (((u : F.valuationSubring) - 1 : F.valuationSubring) : K) < 1 := by + have hu_mem : + ((u : F.valuationSubring) - 1 : F.valuationSubring) ∈ F.maximalIdeal := by + simpa [mem_iff] using hu + simpa using + (_root_.Valuation.mem_maximalIdeal_iff K F.valuation).1 hu_mem + have htoK : + Continuous (fun y : F.valuationSubringˣ => + ((y : F.valuationSubring) : K)) := + continuous_subtype_val.comp Units.continuous_val + have hballK : + { y : K | + (Valued.v : _root_.Valuation K Γ) + (y - ((u : F.valuationSubring) : K)) < (1 : Γ) } ∈ + 𝓝 (((u : F.valuationSubring) : K)) := by + rw [Valued.mem_nhds] + refine ⟨1, ?_⟩ + intro y hy + have hy' : + (Valued.v : _root_.Valuation K Γ).restrict + (y - ((u : F.valuationSubring) : K)) < 1 := by + simpa only [Set.mem_ofPred_eq, Units.val_one] using hy + have hval : + (Valued.v : _root_.Valuation K Γ) + (y - ((u : F.valuationSubring) : K)) < 1 := + (_root_.Valuation.restrict_lt_one_iff + (Valued.v : _root_.Valuation K Γ)).1 hy' + simpa only [Set.mem_ofPred_eq] using hval + have hballUnits : + { y : F.valuationSubringˣ | + (Valued.v : _root_.Valuation K Γ) + (((y : F.valuationSubring) : K) - + ((u : F.valuationSubring) : K)) < (1 : Γ) } ∈ + 𝓝 u := by + simpa [Set.preimage] using htoK.continuousAt hballK + exact Filter.mem_of_superset hballUnits fun y hy => by + have hy_lt : + F.valuation + (((y : F.valuationSubring) : K) - + ((u : F.valuationSubring) : K)) < 1 := by + exact hy + have hdecomp : + (((y : F.valuationSubring) - 1 : F.valuationSubring) : K) = + (((y : F.valuationSubring) : K) - + ((u : F.valuationSubring) : K)) + + (((u : F.valuationSubring) - 1 : F.valuationSubring) : K) := by + change ((y : F.valuationSubring) : K) - 1 = + (((y : F.valuationSubring) : K) - ((u : F.valuationSubring) : K)) + + (((u : F.valuationSubring) : K) - 1) + ring + have hyu_lt : + F.valuation (((y : F.valuationSubring) - 1 : F.valuationSubring) : K) < 1 := by + rw [hdecomp] + exact (F.valuation.map_add _ _).trans_lt (max_lt hy_lt hu_lt) + have hy_mem : + ((y : F.valuationSubring) - 1 : F.valuationSubring) ∈ F.maximalIdeal := + (_root_.Valuation.mem_maximalIdeal_iff K F.valuation).2 hyu_lt + simpa [mem_iff] using hy_mem + +/-- The residue-unit map is locally constant on valuation-ring units. -/ +theorem eventually_residueUnitHom_eq_mrangeRestrict + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + (u : F.valuationSubringˣ) : + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + ∀ᶠ y : F.valuationSubringˣ in 𝓝 u, + residueUnitHom F y = + residueUnitHom F u := by + let : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + let Γ : Type v := + MonoidHom.mrange F.valuation.toMonoidWithZeroHom + have htoK : + Continuous (fun y : F.valuationSubringˣ => + ((y : F.valuationSubring) : K)) := + continuous_subtype_val.comp Units.continuous_val + have hballK : + { y : K | + (Valued.v : _root_.Valuation K Γ) + (y - ((u : F.valuationSubring) : K)) < (1 : Γ) } ∈ + 𝓝 (((u : F.valuationSubring) : K)) := by + rw [Valued.mem_nhds] + refine ⟨1, ?_⟩ + intro y hy + simpa using hy + have hballUnits : + { y : F.valuationSubringˣ | + (Valued.v : _root_.Valuation K Γ) + (((y : F.valuationSubring) : K) - + ((u : F.valuationSubring) : K)) < (1 : Γ) } ∈ + 𝓝 u := by + simpa [Set.preimage] using htoK.continuousAt hballK + exact Filter.mem_of_superset hballUnits fun y hy => by + have hy_lt : + F.valuation + (((y : F.valuationSubring) : K) - + ((u : F.valuationSubring) : K)) < 1 := by + exact hy + have hdiff_mem : + ((y : F.valuationSubring) - (u : F.valuationSubring) : + F.valuationSubring) ∈ F.maximalIdeal := + (_root_.Valuation.mem_maximalIdeal_iff K F.valuation).2 (by + simpa using hy_lt) + have hres : + F.residueMap (y : F.valuationSubring) = + F.residueMap (u : F.valuationSubring) := + (ResidueField.residue_eq_residue_iff_sub_mem_maximalIdeal + (R := F.valuationSubring) (y : F.valuationSubring) + (u : F.valuationSubring)).2 hdiff_mem + exact + (residueUnitHom_eq_iff_residue_eq F y u).2 hres + +/-- +Establishes the identity `((valuationSubringUnitsEquivRootsTimesPrincipalUnits F).symm u).1 = +(residueRootsOfUnityEquivResidueFieldUnits F).symm (residueUnitHom F u)`. +-/ +theorem valuationSubringUnitsEquivRootsTimesPrincipalUnits_symm_fst_eq_residue + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] + (u : F.valuationSubringˣ) : + ((valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).symm u).1 = + (residueRootsOfUnityEquivResidueFieldUnits F).symm + (residueUnitHom F u) := by + let E := + valuationSubringUnitsEquivRootsTimesPrincipalUnits + F + let R := + residueRootsOfUnityEquivResidueFieldUnits F + apply R.injective + have hp : + residueUnitHom F + (((E.symm u).2 : F.valuationSubringˣ)) = 1 := + (residueUnitHom_eq_one_iff + F ((E.symm u).2 : F.valuationSubringˣ)).2 (E.symm u).2.property + have hprod : + ((E.symm u).1 : F.valuationSubringˣ) * + ((E.symm u).2 : F.valuationSubringˣ) = + u := by + change E (E.symm u) = u + exact E.apply_symm_apply u + have hres := congrArg (residueUnitHom F) hprod + rw [R.apply_symm_apply] + change + residueUnitHom F + (((E.symm u).1 : F.valuationSubringˣ)) = + residueUnitHom F u + simpa [ + valuationSubringUnitsEquivRootsTimesPrincipalUnits_apply, + map_mul, hp] using hres + +/-- +Establishes the identity `(((valuationSubringUnitsEquivRootsTimesPrincipalUnits F).symm u).2 : +F.valuationSubringˣ) = (((valuationSubringUnitsEquivRootsTimesPrincipalUnits F).symm u).1 : +F.valuationSubringˣ)⁻¹ * u`. +-/ +theorem valuationSubringUnitsEquivRootsTimesPrincipalUnits_symm_snd_eq + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] + (u : F.valuationSubringˣ) : + (((valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).symm u).2 : F.valuationSubringˣ) = + (((valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).symm u).1 : F.valuationSubringˣ)⁻¹ * u := by + let E := + valuationSubringUnitsEquivRootsTimesPrincipalUnits + F + have hprod : + ((E.symm u).1 : F.valuationSubringˣ) * + ((E.symm u).2 : F.valuationSubringˣ) = + u := by + change E (E.symm u) = u + exact E.apply_symm_apply u + calc + ((E.symm u).2 : F.valuationSubringˣ) = + ((E.symm u).1 : F.valuationSubringˣ)⁻¹ * + (((E.symm u).1 : F.valuationSubringˣ) * + ((E.symm u).2 : F.valuationSubringˣ)) := by + simp + _ = ((E.symm u).1 : F.valuationSubringˣ)⁻¹ * u := by + rw [hprod] + +/-- The root-of-unity factor of the inverse unit decomposition is locally +constant. -/ +theorem eventually_valuationSubringUnitsEquivRootsTimesPrincipalUnits_symm_fst_eq_mrangeRestrict + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] + (u : F.valuationSubringˣ) : + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + ∀ᶠ y : F.valuationSubringˣ in 𝓝 u, + ((valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).symm y).1 = + ((valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).symm u).1 := by + let : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + exact + (eventually_residueUnitHom_eq_mrangeRestrict + F u).mono fun y hy => by + rw [ + valuationSubringUnitsEquivRootsTimesPrincipalUnits_symm_fst_eq_residue + F y, + valuationSubringUnitsEquivRootsTimesPrincipalUnits_symm_fst_eq_residue + F u, + hy] + +/-- The root-of-unity factor of the inverse unit decomposition is continuous. -/ +theorem continuous_valuationSubringUnitsEquivRootsTimesPrincipalUnits_symm_fst_mrangeRestrict + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] : + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + Continuous (fun u : F.valuationSubringˣ => + ((valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).symm u).1) := by + let : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + rw [continuous_iff_continuousAt] + intro u + rw [continuousAt_def] + intro s hs + have humem : + ((valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).symm u).1 ∈ s := + mem_of_mem_nhds hs + exact + Filter.mem_of_superset + (eventually_valuationSubringUnitsEquivRootsTimesPrincipalUnits_symm_fst_eq_mrangeRestrict + F u) + (fun y hy => by + change + ((valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).symm y).1 ∈ s + rw [hy] + exact humem) + +/-- The inclusion of valuation-ring units into field units is continuous for +the range-restricted valuation topology. -/ +theorem continuous_valuationSubringUnitFieldUnitHom_mrangeRestrict + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) : + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + Continuous (fun u : F.valuationSubringˣ => + valuationSubringUnitFieldUnitHom F u) := by + let : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + have hsub : Continuous (fun x : F.valuationSubring => (x : K)) := + continuous_subtype_val + rw [Units.continuous_iff] + constructor + · convert hsub.comp Units.continuous_val using 1 + funext u + exact + (coe_valuationSubringUnitFieldUnitHom_apply F u).symm + · convert hsub.comp Units.continuous_coe_inv using 1 + funext u + change + (((valuationSubringUnitFieldUnitHom F u)⁻¹ : Kˣ) : K) = + (((u⁻¹ : F.valuationSubringˣ) : F.valuationSubring) : K) + rw [← map_inv] + exact coe_valuationSubringUnitFieldUnitHom_apply F (u⁻¹) + +/-- The principal-unit factor of the inverse unit decomposition is continuous +as a valuation-ring unit. -/ +theorem continuous_valuationSubringUnitsEquivRootsTimesPrincipalUnits_symm_snd_coe_mrangeRestrict + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] : + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + Continuous (fun u : F.valuationSubringˣ => + (((valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).symm u).2 : F.valuationSubringˣ)) := by + let : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + let E := + valuationSubringUnitsEquivRootsTimesPrincipalUnits + F + let rootToField : F.valuationSubringˣ → Kˣ := fun u => + valuationSubringUnitFieldUnitHom F + (((E.symm u).1 : F.valuationSubringˣ)) + let unitToField : F.valuationSubringˣ → Kˣ := fun u => + valuationSubringUnitFieldUnitHom F u + have hroot : + Continuous (fun u : F.valuationSubringˣ => (E.symm u).1) := + continuous_valuationSubringUnitsEquivRootsTimesPrincipalUnits_symm_fst_mrangeRestrict + F + have hrootUnit : + Continuous (fun u : F.valuationSubringˣ => + (((E.symm u).1 : F.valuationSubringˣ))) := + continuous_subtype_val.comp hroot + have hrootField : Continuous rootToField := + (continuous_valuationSubringUnitFieldUnitHom_mrangeRestrict + F).comp hrootUnit + have hunitField : Continuous unitToField := + continuous_valuationSubringUnitFieldUnitHom_mrangeRestrict + F + have hpartField : + Continuous (fun u : F.valuationSubringˣ => + (rootToField u)⁻¹ * unitToField u) := + hrootField.inv.mul hunitField + rw [Units.continuous_iff] + constructor + · have hpartK : + Continuous (fun u : F.valuationSubringˣ => + (((rootToField u)⁻¹ * unitToField u : Kˣ) : K)) := + Units.continuous_val.comp hpartField + have hcoerced : + Continuous (fun u : F.valuationSubringˣ => + ((((E.symm u).2 : F.valuationSubringˣ) : + F.valuationSubring) : K)) := by + convert hpartK using 1 + ext u + have hsnd := + valuationSubringUnitsEquivRootsTimesPrincipalUnits_symm_snd_eq + F u + have hfield := + congrArg + (fun a : F.valuationSubringˣ => + ((valuationSubringUnitFieldUnitHom F a : Kˣ) : K)) + hsnd + simpa [rootToField, unitToField, map_mul] using hfield + exact Continuous.subtype_mk hcoerced fun u => + (((E.symm u).2 : F.valuationSubringˣ) : F.valuationSubring).2 + · have hpartInvK : + Continuous (fun u : F.valuationSubringˣ => + ((((rootToField u)⁻¹ * unitToField u : Kˣ)⁻¹ : Kˣ) : K)) := + Units.continuous_val.comp hpartField.inv + have hcoercedInv : + Continuous (fun u : F.valuationSubringˣ => + (((((E.symm u).2 : F.valuationSubringˣ)⁻¹ : + F.valuationSubringˣ) : F.valuationSubring) : K)) := by + convert hpartInvK using 1 + ext u + have hsnd := + valuationSubringUnitsEquivRootsTimesPrincipalUnits_symm_snd_eq + F u + have hsndInv : + (((E.symm u).2 : F.valuationSubringˣ)⁻¹ : F.valuationSubringˣ) = + ((((E.symm u).1 : F.valuationSubringˣ)⁻¹ * u)⁻¹ : + F.valuationSubringˣ) := by + rw [hsnd] + have hfieldInv := + congrArg + (fun a : F.valuationSubringˣ => + ((valuationSubringUnitFieldUnitHom F a : Kˣ) : K)) + hsndInv + change + (((valuationSubringUnitFieldUnitHom F + (((E.symm u).2 : F.valuationSubringˣ)))⁻¹ : Kˣ) : K) = + ((((rootToField u)⁻¹ * unitToField u : Kˣ)⁻¹ : Kˣ) : K) + simpa [E, rootToField, unitToField, map_mul] using hfieldInv + exact Continuous.subtype_mk hcoercedInv fun u => + ((((E.symm u).2 : F.valuationSubringˣ)⁻¹ : + F.valuationSubringˣ) : F.valuationSubring).2 + +/-- The principal-unit factor of the inverse unit decomposition is continuous. -/ +theorem continuous_valuationSubringUnitsEquivRootsTimesPrincipalUnits_symm_snd_mrangeRestrict + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] : + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + Continuous (fun u : F.valuationSubringˣ => + ((valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).symm u).2) := by + let : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + let E := + valuationSubringUnitsEquivRootsTimesPrincipalUnits + F + exact + Continuous.subtype_mk + (continuous_valuationSubringUnitsEquivRootsTimesPrincipalUnits_symm_snd_coe_mrangeRestrict + F) + (fun u => (E.symm u).2.property) + +/-- The inverse of the unit-level decomposition `Oˣ ≃ μ × U¹` is continuous. -/ +theorem continuous_valuationSubringUnitsEquivRootsTimesPrincipalUnits_symm_mrangeRestrict + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] : + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + Continuous (fun u : F.valuationSubringˣ => + (valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).symm u) := by + let : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + have hfst : + Continuous (fun u : F.valuationSubringˣ => + ((valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).symm u).1) := + continuous_valuationSubringUnitsEquivRootsTimesPrincipalUnits_symm_fst_mrangeRestrict + F + have hsnd : + Continuous (fun u : F.valuationSubringˣ => + ((valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).symm u).2) := + continuous_valuationSubringUnitsEquivRootsTimesPrincipalUnits_symm_snd_mrangeRestrict + F + rw [continuous_iff_continuousAt] + intro u + rw [ContinuousAt, nhds_prod_eq] + intro s hs + rcases Filter.mem_prod_iff.1 hs with ⟨s₁, hs₁, s₂, hs₂, hsubset⟩ + have hpre₁ : + {x : F.valuationSubringˣ | + ((valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).symm x).1 ∈ s₁} ∈ 𝓝 u := + hfst.tendsto u hs₁ + have hpre₂ : + {x : F.valuationSubringˣ | + ((valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).symm x).2 ∈ s₂} ∈ 𝓝 u := + hsnd.tendsto u hs₂ + exact Filter.mem_of_superset (Filter.inter_mem hpre₁ hpre₂) fun x hx => + hsubset ⟨hx.1, hx.2⟩ + +/-- Topological half of the uniformizer–residue–principal-unit decomposition: for the +range-restricted valuation topology, the product map +`μ × U¹ × ℤ → Kˣ` is continuous. The inverse-continuity packaging is kept +separate from the algebraic decomposition. -/ +theorem continuous_rootsPrincipalUnitUniformizerMulHom_mrangeRestrict + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) : + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + Continuous (fun z : fieldUnitDecompositionFactors F => + rootsPrincipalUnitUniformizerMulHom F + (Units.mk0 (π : K) hπ.ne_zero) z) := by + let : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + dsimp [rootsPrincipalUnitUniformizerMulHom] + have hζ : + Continuous fun z : fieldUnitDecompositionFactors F => + valuationSubringUnitFieldUnitHom F + (z.1.1 : F.valuationSubringˣ) := by + exact + (continuous_valuationSubringUnitFieldUnitHom_mrangeRestrict + F).comp + (continuous_subtype_val.comp (continuous_fst.comp continuous_fst)) + have hp : + Continuous fun z : fieldUnitDecompositionFactors F => + valuationSubringUnitFieldUnitHom F + (z.1.2 : F.valuationSubringˣ) := by + exact + (continuous_valuationSubringUnitFieldUnitHom_mrangeRestrict + F).comp + (continuous_subtype_val.comp (continuous_snd.comp continuous_fst)) + have hn : + Continuous fun z : fieldUnitDecompositionFactors F => + (Units.mk0 (π : K) hπ.ne_zero : Kˣ) ^ Multiplicative.toAdd z.2 := by + exact continuous_of_discreteTopology.comp continuous_snd + exact (hζ.mul hp).mul hn + +/-- public continuity statement for the forward map in the +`K^* ≃ μ_{q-1} × U^1 × ℤ` decomposition. -/ +theorem continuous_fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_mrangeRestrict + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) : + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + Continuous (fun z : fieldUnitDecompositionFactors F => + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ z) := by + let : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + simpa only + [fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply, + rootsPrincipalUnitUniformizerMulHom_apply] + using + continuous_rootsPrincipalUnitUniformizerMulHom_mrangeRestrict + F hπ + +/-- The inverse map in the `K^* ≃ μ × U^1 × ℤ` decomposition is continuous. -/ +theorem continuous_fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_mrangeRestrict + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) : + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + Continuous (fun x : Kˣ => + (fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ).symm x) := by + let : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + let E := + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ + have hfstComp : + Continuous (fun x : Kˣ => + (valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).symm + (fieldUnitUniformizerUnitPart F hπ x)) := + (continuous_valuationSubringUnitsEquivRootsTimesPrincipalUnits_symm_mrangeRestrict + F).comp + (continuous_fieldUnitUniformizerUnitPart_mrangeRestrict + F hπ) + have hfst : + Continuous (fun x : Kˣ => (E.symm x).1) := by + rw [continuous_iff_continuousAt] + intro x + rw [ContinuousAt] + have hpoint (y : Kˣ) : + (E.symm y).1 = + (valuationSubringUnitsEquivRootsTimesPrincipalUnits F).symm + (fieldUnitUniformizerUnitPart F hπ y) := by + dsimp only [E] + exact + fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_fst_eq_unitPart + F hπ y + rw [hpoint x] + exact Filter.Tendsto.congr' + (Filter.Eventually.of_forall fun y => (hpoint y).symm) + (hfstComp.tendsto x) + have hsnd : + Continuous (fun x : Kˣ => (E.symm x).2) := by + simpa [E] using + continuous_fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_snd_mrangeRestrict + F hπ + rw [continuous_iff_continuousAt] + intro x + rw [ContinuousAt, nhds_prod_eq] + intro s hs + rcases Filter.mem_prod_iff.1 hs with ⟨s₁, hs₁, s₂, hs₂, hsubset⟩ + have hpre₁ : {y : Kˣ | (E.symm y).1 ∈ s₁} ∈ 𝓝 x := + hfst.tendsto x hs₁ + have hpre₂ : {y : Kˣ | (E.symm y).2 ∈ s₂} ∈ 𝓝 x := + hsnd.tendsto x hs₂ + exact Filter.mem_of_superset (Filter.inter_mem hpre₁ hpre₂) fun y hy => + hsubset ⟨hy.1, hy.2⟩ + +/-- The uniformizer–residue–principal-unit decomposition, topological group-isomorphism form for +the range-restricted valuation topology. -/ +noncomputable def + fieldUnitsContinuousMulEquivRootsPrincipalUnitsUniformizerOfCompleteDVFMrangeRestrict + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) : + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + fieldUnitDecompositionFactors F ≃ₜ* Kˣ := by + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + exact + { fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ with + continuous_toFun := + continuous_fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_mrangeRestrict + F hπ + continuous_invFun := + continuous_fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_mrangeRestrict + F hπ } + +/-- The uniformizer–residue–principal-unit decomposition, standard `ℤᵐ⁰`-valued form: +every field unit is a product of a lifted residue root of unity, a first +principal unit, and an integral power of a uniformizer. -/ +theorem exists_roots_principalUnit_uniformizer_zpow_of_withZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] + {ϖ : Kˣ} (hϖ : v (ϖ : K) = WithZero.exp (-1 : ℤ)) (x : Kˣ) : + let F : CompleteDVF K := + { ValueGroup := WithZero (Multiplicative ℤ) + valuation := v + instCompleteDiscrete := inferInstance } + letI : Finite F.residueField := by + change Finite (IsLocalRing.ResidueField v.valuationSubring) + infer_instance + ∃ ζ : residueRootsOfUnityGroup F, + ∃ p : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1, + ∃ n : ℤ, + x = + valuationSubringUnitFieldUnitHom F + (ζ : F.valuationSubringˣ) * + valuationSubringUnitFieldUnitHom F + (p : F.valuationSubringˣ) * + ϖ ^ n := by + let F : CompleteDVF K := + { ValueGroup := WithZero (Multiplicative ℤ) + valuation := v + instCompleteDiscrete := inferInstance } + let V : MultiplicativeIntegerValuation Kˣ := + MultiplicativeIntegerValuation.ofWithZeroValuation v + have : Finite F.residueField := by + change Finite (IsLocalRing.ResidueField v.valuationSubring) + infer_instance + have hzero : V.zeroSubgroup = F.valuation.valuationSubring.unitGroup := by + simpa [F, V] using + MultiplicativeIntegerValuation.ofWithZeroValuation_zeroSubgroup_eq_unitGroup + (K := K) v + have hϖV : V.IsUniformizer ϖ := by + simpa [V] using + MultiplicativeIntegerValuation.ofWithZeroValuation_isUniformizer_of_valuation_eq_exp_neg + (K := K) v ϖ hϖ + simpa [F, V] using + exists_roots_principalUnit_uniformizer_zpow_of_zeroSubgroup_eq_unitGroup + (F := F) V hzero hϖV x + +/-- Uniqueness part of the uniformizer–residue–principal-unit decomposition in the same standard +`ℤᵐ⁰`-valued form. -/ +theorem roots_principalUnit_uniformizer_zpow_eq_iff_of_withZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] + {ϖ : Kˣ} (hϖ : v (ϖ : K) = WithZero.exp (-1 : ℤ)) : + let F : CompleteDVF K := + { ValueGroup := WithZero (Multiplicative ℤ) + valuation := v + instCompleteDiscrete := inferInstance } + letI : Finite F.residueField := by + change Finite (IsLocalRing.ResidueField v.valuationSubring) + infer_instance + ∀ (ζ η : residueRootsOfUnityGroup F) + (p q : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + (m n : ℤ), + valuationSubringUnitFieldUnitHom F + (ζ : F.valuationSubringˣ) * + valuationSubringUnitFieldUnitHom F + (p : F.valuationSubringˣ) * + ϖ ^ m = + valuationSubringUnitFieldUnitHom F + (η : F.valuationSubringˣ) * + valuationSubringUnitFieldUnitHom F + (q : F.valuationSubringˣ) * + ϖ ^ n ↔ + ζ = η ∧ p = q ∧ m = n := by + let F : CompleteDVF K := + { ValueGroup := WithZero (Multiplicative ℤ) + valuation := v + instCompleteDiscrete := inferInstance } + let V : MultiplicativeIntegerValuation Kˣ := + MultiplicativeIntegerValuation.ofWithZeroValuation v + have : Finite F.residueField := by + change Finite (IsLocalRing.ResidueField v.valuationSubring) + infer_instance + have hzero : + ∀ y : Kˣ, y ∈ V.zeroSubgroup ↔ + ∃ u : F.valuationSubringˣ, + valuationSubringUnitFieldUnitHom F u = y := by + intro y + exact + mem_zeroSubgroup_iff_exists_valuationSubringUnitFieldUnitHom_eq + (F := F) V + (by + simpa [F, V] using + MultiplicativeIntegerValuation.ofWithZeroValuation_zeroSubgroup_eq_unitGroup + (K := K) v) + y + have hϖV : V.IsUniformizer ϖ := by + simpa [V] using + MultiplicativeIntegerValuation.ofWithZeroValuation_isUniformizer_of_valuation_eq_exp_neg + (K := K) v ϖ hϖ + dsimp + intro ζ η p q m n + simpa [F, V] using + roots_principalUnit_uniformizer_zpow_eq_iff + F V hzero hϖV ζ η p q m n + +end higherPrincipalUnitGroup +end CompleteDVF +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitFactors.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitFactors.lean new file mode 100644 index 0000000000..c2f016ef62 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitFactors.lean @@ -0,0 +1,349 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.ContinuousFieldUnitLog +public import Mathlib.GroupTheory.SpecificGroups.Cyclic +public import Mathlib.Topology.Instances.ZMod +/-! +# Finite and uniformizer factors of the field-unit group + +This file isolates the two factors of the field-unit structure theorem which do not depend on +the structure theorem for first principal units. The Teichmuller factor is +the cyclic group of order `q - 1`, with its (necessarily discrete) topology. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + fieldUnitDecompositionFactors → + fieldUnitDecompositionFactors + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + residueRootsOfUnityEquivResidueFieldUnits → + residueRootsOfUnityEquivResidueFieldUnits + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + residueRootsOfUnityGroup → + residueRootsOfUnityGroup + + +noncomputable +section + +universe u v + +namespace LocalFieldTheory.DiscreteValuationField +namespace CompleteDVF +namespace higherPrincipalUnitGroup + +variable {K : Type u} [Field K] + +/-- A continuous algebraic equivalence from a compact group to a Hausdorff +group is automatically a topological group equivalence. -/ +noncomputable def continuousMulEquivOfCompactToT2 + {A B : Type*} [TopologicalSpace A] [TopologicalSpace B] + [Mul A] [Mul B] [CompactSpace A] [T2Space B] + (e : A ≃* B) (he : Continuous e) : A ≃ₜ* B := + ContinuousMulEquiv.mk' + (he.homeoOfEquivCompactToT2 (f := e.toEquiv)) e.map_mul + +/-- Additive version of `continuousMulEquivOfCompactToT2`. -/ +noncomputable def continuousAddEquivOfCompactToT2 + {A B : Type*} [TopologicalSpace A] [TopologicalSpace B] + [Add A] [Add B] [CompactSpace A] [T2Space B] + (e : A ≃+ B) (he : Continuous e) : A ≃ₜ+ B := + ContinuousAddEquiv.mk' + (he.homeoOfEquivCompactToT2 (f := e.toEquiv)) e.map_add + +/-- Product of two topological multiplicative equivalences. -/ +noncomputable def continuousMulEquivProdCongr + {A B C D : Type*} + [TopologicalSpace A] [TopologicalSpace B] + [TopologicalSpace C] [TopologicalSpace D] + [MulOneClass A] [MulOneClass B] [MulOneClass C] [MulOneClass D] + (e : A ≃ₜ* B) (f : C ≃ₜ* D) : A × C ≃ₜ* B × D := + { e.toMulEquiv.prodCongr f.toMulEquiv with + continuous_toFun := by + change Continuous (fun x : A × C => (e x.1, f x.2)) + fun_prop + continuous_invFun := by + change Continuous (fun x : B × D => (e.symm x.1, f.symm x.2)) + fun_prop } + +/-- Swapping two factors is a topological multiplicative equivalence. -/ +noncomputable def continuousMulEquivProdComm + (A B : Type*) [TopologicalSpace A] [TopologicalSpace B] + [MulOneClass A] [MulOneClass B] : A × B ≃ₜ* B × A := + { (MulEquiv.prodComm : A × B ≃* B × A) with + continuous_toFun := by + change Continuous (fun x : A × B => (x.2, x.1)) + fun_prop + continuous_invFun := by + change Continuous (fun x : B × A => (x.2, x.1)) + fun_prop } + +/-- The Teichmuller roots form, algebraically and topologically, the cyclic +group of order `q - 1`, where `q` is the residue-field cardinality. -/ +noncomputable def residueRootsOfUnityContinuousMulEquivZMod + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] : + letI : Valued K (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F + Multiplicative (ZMod (Nat.card F.residueField - 1)) ≃ₜ* + residueRootsOfUnityGroup F := by + letI : Valued K (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F + rw [← Nat.card_units F.residueField] + let e : Multiplicative (ZMod (Nat.card F.residueFieldˣ)) ≃* + residueRootsOfUnityGroup F := + (zmodCyclicMulEquiv + (G := F.residueFieldˣ) (inferInstance : IsCyclic F.residueFieldˣ)).trans + (residueRootsOfUnityEquivResidueFieldUnits F).symm + haveI : Finite + (residueRootsOfUnityGroup F) := + Finite.of_equiv F.residueFieldˣ + (residueRootsOfUnityEquivResidueFieldUnits F).symm.toEquiv + exact + { e with + continuous_toFun := continuous_of_discreteTopology + continuous_invFun := continuous_of_discreteTopology } + +/-- The field-unit structure theorem with the still-to-be-classified first-principal-unit +factor left visible: the other two factors are already the standard cyclic +factors appearing in the decomposition. -/ +noncomputable def fieldUnitsContinuousMulEquivCyclicRootsPrincipalUnitsUniformizer + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) : + letI : Valued K (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F + ((Multiplicative (ZMod (Nat.card F.residueField - 1)) × + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 1) × + Multiplicative ℤ) ≃ₜ* Kˣ := by + letI : Valued K (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F + exact + (continuousMulEquivProdCongr + (continuousMulEquivProdCongr + (residueRootsOfUnityContinuousMulEquivZMod F) + (ContinuousMulEquiv.refl + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 1))) + (ContinuousMulEquiv.refl (Multiplicative ℤ))).trans + (fieldUnitsContinuousMulEquivRootsPrincipalUnitsUniformizerOfCompleteDVFMrangeRestrict + F hπ) + +/-- The uniformizer–residue–principal-unit decomposition in the topology carried directly by a +standard +`ℤᵐ⁰`-valued valuation. This is the decomposition used to assemble the two +cases of the field-unit structure theorem. -/ +noncomputable def fieldUnitsContinuousMulEquivRootsPrincipalUnitsUniformizerOfWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] + {π : (MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) : + let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := + MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v + letI : Finite F.residueField := by + change Finite (IsLocalRing.ResidueField v.valuationSubring) + infer_instance + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + fieldUnitDecompositionFactors F ≃ₜ* Kˣ := by + let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := + MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v + let direct : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let restricted : Valued K + (MonoidHom.mrange v.toMonoidWithZeroHom) := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F + have huniform : + (Valued.mk' v).toUniformSpace = + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F).toUniformSpace := by + change (Valued.mk' v).toUniformSpace = + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + (WithZeroValuationTopology.completeDVF v)).toUniformSpace + exact WithZeroValuationTopology.valuedMk_uniformSpace_eq_mrangeRestrict v + haveI : Finite F.residueField := by + change Finite (IsLocalRing.ResidueField v.valuationSubring) + infer_instance + let E := + letI : Valued K + (MonoidHom.mrange v.toMonoidWithZeroHom) := restricted + fieldUnitsContinuousMulEquivRootsPrincipalUnitsUniformizerOfCompleteDVFMrangeRestrict + F hπ + have htop : direct.toTopologicalSpace = restricted.toTopologicalSpace := by + exact congrArg (fun U : UniformSpace K => U.toTopologicalSpace) huniform + let unitsTopology (t : TopologicalSpace K) : TopologicalSpace Kˣ := + letI : TopologicalSpace K := t + inferInstance + let factorsTopology (t : TopologicalSpace K) : + TopologicalSpace + (fieldUnitDecompositionFactors + F) := + letI : TopologicalSpace K := t + inferInstance + have hdom : + factorsTopology direct.toTopologicalSpace = + factorsTopology restricted.toTopologicalSpace := + congrArg factorsTopology htop + have hcod : + unitsTopology direct.toTopologicalSpace = + unitsTopology restricted.toTopologicalSpace := + congrArg unitsTopology htop + let e := E.toMulEquiv + have heContinuous : + @Continuous + (fieldUnitDecompositionFactors + F) + Kˣ + (factorsTopology restricted.toTopologicalSpace) + (unitsTopology restricted.toTopologicalSpace) e := by + exact E.continuous + have heSymmContinuous : + @Continuous + Kˣ + (fieldUnitDecompositionFactors + F) + (unitsTopology restricted.toTopologicalSpace) + (factorsTopology restricted.toTopologicalSpace) e.symm := by + exact E.symm.continuous + letI : Valued K (WithZero (Multiplicative ℤ)) := direct + exact + { e with + continuous_toFun := by + change @Continuous + (fieldUnitDecompositionFactors + F) + Kˣ + (factorsTopology direct.toTopologicalSpace) + (unitsTopology direct.toTopologicalSpace) e + rw [hdom, hcod] + exact heContinuous + continuous_invFun := by + change @Continuous + Kˣ + (fieldUnitDecompositionFactors + F) + (unitsTopology direct.toTopologicalSpace) + (factorsTopology direct.toTopologicalSpace) e.symm + rw [hdom, hcod] + exact heSymmContinuous } + +/-- The Teichmuller root factor in the direct topology of a standard +`ℤᵐ⁰`-valued valuation. -/ +noncomputable def residueRootsOfUnityContinuousMulEquivZModOfWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] : + let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := + MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v + letI : Finite F.residueField := by + change Finite (IsLocalRing.ResidueField v.valuationSubring) + infer_instance + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Multiplicative (ZMod (Nat.card F.residueField - 1)) ≃ₜ* + residueRootsOfUnityGroup F := by + let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := + MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v + haveI : Finite F.residueField := by + change Finite (IsLocalRing.ResidueField v.valuationSubring) + infer_instance + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + change Multiplicative (ZMod (Nat.card F.residueField - 1)) ≃ₜ* + residueRootsOfUnityGroup F + rw [← Nat.card_units F.residueField] + let e : Multiplicative (ZMod (Nat.card F.residueFieldˣ)) ≃* + residueRootsOfUnityGroup F := + (zmodCyclicMulEquiv + (G := F.residueFieldˣ) (inferInstance : IsCyclic F.residueFieldˣ)).trans + (residueRootsOfUnityEquivResidueFieldUnits F).symm + haveI : Finite + (residueRootsOfUnityGroup F) := + Finite.of_equiv F.residueFieldˣ + (residueRootsOfUnityEquivResidueFieldUnits F).symm.toEquiv + exact + { e with + continuous_toFun := continuous_of_discreteTopology + continuous_invFun := continuous_of_discreteTopology } + +/-- The field-unit structure theorem with the principal-unit factor left visible, now in the +direct standard valuation topology. -/ +noncomputable def + fieldUnitsContinuousMulEquivCyclicRootsPrincipalUnitsUniformizerOfWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] + {π : (MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) : + let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := + MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v + letI : Finite F.residueField := by + change Finite (IsLocalRing.ResidueField v.valuationSubring) + infer_instance + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + ((Multiplicative (ZMod (Nat.card F.residueField - 1)) × + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 1) × + Multiplicative ℤ) ≃ₜ* Kˣ := by + let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := + MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v + haveI : Finite F.residueField := by + change Finite (IsLocalRing.ResidueField v.valuationSubring) + infer_instance + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + exact + (continuousMulEquivProdCongr + (continuousMulEquivProdCongr + (residueRootsOfUnityContinuousMulEquivZModOfWithZeroValuation v) + (ContinuousMulEquiv.refl + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 1))) + (ContinuousMulEquiv.refl (Multiplicative ℤ))).trans + (fieldUnitsContinuousMulEquivRootsPrincipalUnitsUniformizerOfWithZeroValuation + v hπ) + +/-- Assemble the field-unit structure theorem from a topological classification of `U^1`, +with the factors ordered canonically as: uniformizer, Teichmuller +roots, then principal units. -/ +noncomputable def fieldUnitsContinuousMulEquivUniformizerRootsPrincipalUnitsOfWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] + {π : (MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v).valuationSubring} + (hπ : v.IsUniformizer (π : K)) + (P : Type*) [TopologicalSpace P] [MulOneClass P] : + let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := + MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v + letI : Finite F.residueField := by + change Finite (IsLocalRing.ResidueField v.valuationSubring) + infer_instance + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + (P ≃ₜ* LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 1) → + Multiplicative ℤ × + (Multiplicative (ZMod (Nat.card F.residueField - 1)) × P) ≃ₜ* Kˣ := by + let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := + MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v + haveI : Finite F.residueField := by + change Finite (IsLocalRing.ResidueField v.valuationSubring) + infer_instance + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + change (P ≃ₜ* LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 1) → + Multiplicative ℤ × + (Multiplicative (ZMod (Nat.card F.residueField - 1)) × P) ≃ₜ* Kˣ + intro eP + exact + (continuousMulEquivProdComm (Multiplicative ℤ) + (Multiplicative (ZMod (Nat.card F.residueField - 1)) × P)).trans + ((continuousMulEquivProdCongr + (continuousMulEquivProdCongr + (ContinuousMulEquiv.refl + (Multiplicative (ZMod (Nat.card F.residueField - 1)))) eP) + (ContinuousMulEquiv.refl (Multiplicative ℤ))).trans + (fieldUnitsContinuousMulEquivCyclicRootsPrincipalUnitsUniformizerOfWithZeroValuation + v hπ)) + +end higherPrincipalUnitGroup +end CompleteDVF +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitPowerIndexFormulas.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitPowerIndexFormulas.lean new file mode 100644 index 0000000000..0dc1dc0041 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitPowerIndexFormulas.lean @@ -0,0 +1,441 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import Mathlib.Algebra.Group.Hom.Basic +public import Mathlib.Algebra.Group.Subgroup.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicPowerIndex +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitStructure +/-! +# Power indices in local-field unit groups + +The index formulas below use the actual principal-unit structures from +the field-unit structure theorem. Both the natural-cardinality form and the literal rational +form involving the normalized local absolute value are recorded. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace LocalFieldTheory.DiscreteValuationField +namespace LocalField + +variable {K : Type u} [Field K] + +/-- Reindex the countable p-adic product into the universe of the ambient +field. This is algebraically invisible, but lets the generic product-index +calculation be instantiated without restricting the universe of `K`. -/ +private noncomputable def padicIntNatPiMulEquivULift + (p : ℕ) [Fact p.Prime] : + Multiplicative (ℕ → ℤ_[p]) ≃* + Multiplicative (ULift.{u, 0} ℕ → ℤ_[p]) := by + let r : (ULift.{u, 0} ℕ → ℤ_[p]) ≃+ (ℕ → ℤ_[p]) := + { Equiv.piCongrLeft (fun _ : ℕ => ℤ_[p]) + (Equiv.ulift : ULift.{u, 0} ℕ ≃ ℕ) with + map_add' := by + intro x y + rfl } + exact AddEquiv.toMultiplicative r.symm + +/-- The local-field power-index formula, first equality. The uniformizer factor contributes +exactly `n`, independently of the characteristic. -/ +theorem fieldIndex_eq_mul_unitIndex + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] + (n : ℕ) [NeZero n] + [Finite (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range)] + [Finite + ((MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v).valuationSubringˣ ⧸ + (powMonoidHom n : + (MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v).valuationSubringˣ →* + (MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation + v).valuationSubringˣ).range)] : + let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := + MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v + Nat.card (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range) = + n * Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) := by + let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := + MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v + have : Finite F.residueField := by + change Finite (IsLocalRing.ResidueField v.valuationSubring) + infer_instance + let hex := F.exists_uniformizer + let π := Classical.choose hex + have hπ : F.valuation.IsUniformizer (π : K) := Classical.choose_spec hex + exact card_fieldUnits_nthPowerQuotient_eq_mul_unit_nthPowerQuotient + F hπ n + +/-- The local-field power-index formula in mixed characteristic, in natural-cardinality form for +the full field-unit group. -/ +theorem mixed_fieldIndex + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (hv : Function.Surjective v) + {n : ℕ} [NeZero n] + [Finite (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range)] + [Finite + ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1 ⧸ + (powMonoidHom n : ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1) →* ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1)).range)] : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let d := Module.finrank ℚ_[F.residueCharacteristic] K + Nat.card (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range) = + n * (Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) * + F.residueCharacteristic ^ + (d * padicValNat F.residueCharacteristic n)) := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let d := Module.finrank ℚ_[F.residueCharacteristic] K + let hex := + WithZeroValuation.exists_valuationSubring_valuation_eq_exp_neg_one_of_surjective + v hv + let π := Classical.choose hex + have hπval : v (π : K) = WithZero.exp (-1 : ℤ) := + Classical.choose_spec hex + have hπ : v.IsUniformizer (π : K) := + WithZeroValuation.isUniformizer_of_valuation_eq_exp_neg_one + v (π : K) hπval + obtain ⟨a, e⟩ := + chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation + v hv + exact + card_fieldUnits_nthPowerQuotient_of_mixedPrincipalUnitStructure + (p := F.residueCharacteristic) (F := F.toCompleteDVF) hπ + (ZMod (F.residueCharacteristic ^ a)) d e.symm.toMulEquiv + +/-- The local-field power-index formula in mixed characteristic, in natural-cardinality form for +the valuation-ring unit group. Its finite kernel is written as the canonical +field root group `μ_n(K)`. -/ +theorem mixed_unitIndex + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (hv : Function.Surjective v) + {n : ℕ} [NeZero n] + [Finite + ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1 ⧸ + (powMonoidHom n : ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1) →* ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1)).range)] : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let d := Module.finrank ℚ_[F.residueCharacteristic] K + Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) = + Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) * + F.residueCharacteristic ^ + (d * padicValNat F.residueCharacteristic n) := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let d := Module.finrank ℚ_[F.residueCharacteristic] K + let hex := + WithZeroValuation.exists_valuationSubring_valuation_eq_exp_neg_one_of_surjective + v hv + let π := Classical.choose hex + have hπval : v (π : K) = WithZero.exp (-1 : ℤ) := + Classical.choose_spec hex + have hπ : v.IsUniformizer (π : K) := + WithZeroValuation.isUniformizer_of_valuation_eq_exp_neg_one + v (π : K) hπval + obtain ⟨a, e⟩ := + chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation + v hv + exact + card_units_nthPowerQuotient_of_mixedPrincipalUnitStructure_fieldKernel + (p := F.residueCharacteristic) (F := F.toCompleteDVF) hπ + (ZMod (F.residueCharacteristic ^ a)) d e.symm.toMulEquiv + +/-- In mixed characteristic, an exponent prime to the residue characteristic +has no principal-unit defect. Thus the valuation-ring unit power index is +the cardinality of the canonical field root group `μ_n(K)`. Finiteness of +the principal-unit quotient is obtained internally from the mixed +principal-unit structure. -/ +theorem mixed_unitIndex_of_coprime + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (hv : Function.Surjective v) + {n : ℕ} [NeZero n] + [Fact + (Nat.Coprime n + (ofWithZeroValuation v).residueCharacteristic)] : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) = + Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let d := Module.finrank ℚ_[F.residueCharacteristic] K + obtain ⟨a, e⟩ := + chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation + v hv + let U := + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF 1 + let A := + ZMod (F.residueCharacteristic ^ a) × + (Fin d → ℤ_[F.residueCharacteristic]) + let : NeZero (F.residueCharacteristic ^ a) := + ⟨pow_ne_zero _ F.residueCharacteristic_prime.ne_zero⟩ + let : Finite + (A ⧸ LocalFieldTheory.nsmulAddSubgroup A n) := by + infer_instance + let : Finite + (U ⧸ (powMonoidHom n : U →* U).range) := + LocalFieldTheory.finite_nthPowerQuotient_of_mulEquiv + U (Multiplicative A) n e.symm.toMulEquiv + have hpnd : ¬ F.residueCharacteristic ∣ n := + F.residueCharacteristic_prime.coprime_iff_not_dvd.mp + (Fact.out : Nat.Coprime n F.residueCharacteristic).symm + have hpadic : + padicValNat F.residueCharacteristic n = 0 := + padicValNat.eq_zero_of_not_dvd hpnd + simpa only [F, hpadic, Nat.mul_zero, pow_zero, Nat.mul_one] using + (mixed_unitIndex v hv (n := n)) + +/-- Literal mixed-characteristic field formula from the local-field power-index formula: +`(Kˣ : Kˣⁿ) = n #μ_n(K) / |n|_p`. -/ +theorem mixed_fieldIndex_rationalFormula + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (hv : Function.Surjective v) + {n : ℕ} [NeZero n] + [Finite (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range)] + [Finite + ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1 ⧸ + (powMonoidHom n : ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1) →* ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1)).range)] : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let d := Module.finrank ℚ_[F.residueCharacteristic] K + (Nat.card (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range) : ℚ) = + (n * Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) : ℕ) / + normalizedLocalNatAbs F.residueCharacteristic d n := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let d := Module.finrank ℚ_[F.residueCharacteristic] K + let hex := + WithZeroValuation.exists_valuationSubring_valuation_eq_exp_neg_one_of_surjective + v hv + let π := Classical.choose hex + have hπval : v (π : K) = WithZero.exp (-1 : ℤ) := + Classical.choose_spec hex + have hπ : v.IsUniformizer (π : K) := + WithZeroValuation.isUniformizer_of_valuation_eq_exp_neg_one + v (π : K) hπval + obtain ⟨a, e⟩ := + chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation + v hv + exact + card_fieldUnits_nthPowerQuotient_of_mixedPrincipalUnitStructure_rationalFormula + (p := F.residueCharacteristic) (F := F.toCompleteDVF) hπ + (ZMod (F.residueCharacteristic ^ a)) d e.symm.toMulEquiv + +/-- Literal mixed-characteristic unit formula from the local-field power-index formula: +`(U : Uⁿ) = #μ_n(K) / |n|_p`. -/ +theorem mixed_unitIndex_rationalFormula + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (hv : Function.Surjective v) + {n : ℕ} [NeZero n] + [Finite + ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1 ⧸ + (powMonoidHom n : ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1) →* ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1)).range)] : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let d := Module.finrank ℚ_[F.residueCharacteristic] K + (Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) : ℚ) = + Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) / + normalizedLocalNatAbs F.residueCharacteristic d n := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let d := Module.finrank ℚ_[F.residueCharacteristic] K + let hex := + WithZeroValuation.exists_valuationSubring_valuation_eq_exp_neg_one_of_surjective + v hv + let π := Classical.choose hex + have hπval : v (π : K) = WithZero.exp (-1 : ℤ) := + Classical.choose_spec hex + have hπ : v.IsUniformizer (π : K) := + WithZeroValuation.isUniformizer_of_valuation_eq_exp_neg_one + v (π : K) hπval + obtain ⟨a, e⟩ := + chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation + v hv + exact + card_units_nthPowerQuotient_of_mixedPrincipalUnitStructure_rationalFormula + (p := F.residueCharacteristic) (F := F.toCompleteDVF) hπ + (ZMod (F.residueCharacteristic ^ a)) d e.symm.toMulEquiv + +/-- The local-field power-index formula in equal characteristic. The canonical +`NeZero n` and `Fact (Nat.Coprime n p)` instances state exactly the +hypotheses needed for multiplication by `n` on `ℤ_p`. -/ +theorem equal_fieldIndex + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] + [CharP K (ofWithZeroValuation v).residueCharacteristic] + {n : ℕ} [NeZero n] + [Fact (Nat.Coprime n (ofWithZeroValuation v).residueCharacteristic)] + [Finite (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range)] + [Finite + ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1 ⧸ + (powMonoidHom n : ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1) →* ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1)).range)] : + Nat.card (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range) = + n * Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let hex := F.toCompleteDVF.exists_uniformizer + let π := Classical.choose hex + have hπ : v.IsUniformizer (π : K) := Classical.choose_spec hex + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let e := chosenFirstPrincipalUnitStructureEqualCharacteristic v + exact + card_fieldUnits_nthPowerQuotient_of_equalPrincipalUnitProduct + (p := F.residueCharacteristic) (F := F.toCompleteDVF) + (ι := ULift.{u, 0} ℕ) hπ + (e.symm.toMulEquiv.trans + (padicIntNatPiMulEquivULift F.residueCharacteristic)) + +/-- Equal-characteristic unit-index formula, with the kernel written as the +full field root group `μ_n(K)`. -/ +theorem equal_unitIndex + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] + [CharP K (ofWithZeroValuation v).residueCharacteristic] + {n : ℕ} [NeZero n] + [Fact (Nat.Coprime n (ofWithZeroValuation v).residueCharacteristic)] + [Finite + ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1 ⧸ + (powMonoidHom n : ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1) →* ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1)).range)] : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) = + Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let hex := F.toCompleteDVF.exists_uniformizer + let π := Classical.choose hex + have hπ : v.IsUniformizer (π : K) := Classical.choose_spec hex + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let e := chosenFirstPrincipalUnitStructureEqualCharacteristic v + exact + card_units_nthPowerQuotient_of_equalPrincipalUnitProduct + (p := F.residueCharacteristic) (F := F.toCompleteDVF) + (ι := ULift.{u, 0} ℕ) hπ + (e.symm.toMulEquiv.trans + (padicIntNatPiMulEquivULift F.residueCharacteristic)) + +/-- Literal equal-characteristic field formula from the local-field power-index formula. Under +`Nat.Coprime n p` the normalized local absolute value of `n` is one. -/ +theorem equal_fieldIndex_rationalFormula + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] + [CharP K (ofWithZeroValuation v).residueCharacteristic] + {n : ℕ} [NeZero n] + [Fact (Nat.Coprime n (ofWithZeroValuation v).residueCharacteristic)] + [Finite (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range)] + [Finite + ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1 ⧸ + (powMonoidHom n : ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1) →* ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1)).range)] : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + (Nat.card (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range) : ℚ) = + (n * Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) : ℕ) / + normalizedLocalNatAbs F.residueCharacteristic 0 n := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let hex := F.toCompleteDVF.exists_uniformizer + let π := Classical.choose hex + have hπ : v.IsUniformizer (π : K) := Classical.choose_spec hex + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let e := chosenFirstPrincipalUnitStructureEqualCharacteristic v + exact + card_fieldUnits_nthPowerQuotient_of_equalPrincipalUnitProduct_rationalFormula + (p := F.residueCharacteristic) (F := F.toCompleteDVF) + (ι := ULift.{u, 0} ℕ) hπ + (e.symm.toMulEquiv.trans + (padicIntNatPiMulEquivULift F.residueCharacteristic)) + +/-- Literal equal-characteristic unit formula from the local-field power-index formula. -/ +theorem equal_unitIndex_rationalFormula + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] + [CharP K (ofWithZeroValuation v).residueCharacteristic] + {n : ℕ} [NeZero n] + [Fact (Nat.Coprime n (ofWithZeroValuation v).residueCharacteristic)] + [Finite + ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1 ⧸ + (powMonoidHom n : ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1) →* ((CompleteDVF.higherPrincipalUnitGroup + (ofWithZeroValuation v).toCompleteDVF) 1)).range)] : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + (Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) : ℚ) = + Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) / + normalizedLocalNatAbs F.residueCharacteristic 0 n := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let hex := F.toCompleteDVF.exists_uniformizer + let π := Classical.choose hex + have hπ : v.IsUniformizer (π : K) := Classical.choose_spec hex + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let e := chosenFirstPrincipalUnitStructureEqualCharacteristic v + exact + card_units_nthPowerQuotient_of_equalPrincipalUnitProduct_rationalFormula + (p := F.residueCharacteristic) (F := F.toCompleteDVF) + (ι := ULift.{u, 0} ℕ) hπ + (e.symm.toMulEquiv.trans + (padicIntNatPiMulEquivULift F.residueCharacteristic)) + +end LocalField +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean new file mode 100644 index 0000000000..f8e1efd682 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean @@ -0,0 +1,156 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaPrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.Core +/-! +# Topological structure of local-field units + +This file assembles the valuation, Teichmuller, and principal-unit factors in +the canonical factor order. All topologies are the ones carried directly by +the given `WithZero (Multiplicative ℤ)`-valued valuation. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +open ValuationTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField + +namespace LocalFieldTheory.DiscreteValuationField +namespace LocalField + +variable {K : Type u} [Field K] + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + fieldUnitsContinuousMulEquivUniformizerRootsPrincipalUnitsOfWithZeroValuation → + fieldUnitsEquivUniformizerRootsPrincipalUnits in +/-- The local-field structure theory, the mixed-characteristic field-unit structure theorem. In +mixed characteristic the +first principal units are a finite cyclic `p`-group times +`[K : ℚ_p]` copies of `ℤ_p`; adjoining the valuation and Teichmuller factors +gives the displayed topological decomposition of `Kˣ` in the canonical factor order. -/ +noncomputable def chosenFieldUnitsStructureMixedCharacteristic + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (hv : Function.Surjective v) : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let d := Module.finrank ℚ_[F.residueCharacteristic] K + Σ a : ℕ, + Multiplicative ℤ × + (Multiplicative (ZMod (Nat.card F.residueField - 1)) × + Multiplicative + (ZMod (F.residueCharacteristic ^ a) × + (Fin d → ℤ_[F.residueCharacteristic]))) ≃ₜ* Kˣ := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let d := Module.finrank ℚ_[F.residueCharacteristic] K + let hex := + WithZeroValuation.exists_valuationSubring_valuation_eq_exp_neg_one_of_surjective + v hv + let π := Classical.choose hex + have hπval : v (π : K) = WithZero.exp (-1 : ℤ) := + Classical.choose_spec hex + have hπ : v.IsUniformizer (π : K) := + WithZeroValuation.isUniformizer_of_valuation_eq_exp_neg_one + v (π : K) hπval + obtain ⟨a, e⟩ := + chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation + v hv + exact ⟨a, + fieldUnitsEquivUniformizerRootsPrincipalUnits + v hπ + (Multiplicative + (ZMod (F.residueCharacteristic ^ a) × + (Fin d → ℤ_[F.residueCharacteristic]))) e⟩ + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + adicPrincipalUnitsContinuousAddEquivUnderlyingOfWithZeroValuation → + adicPrincipalUnitsContinuousAddEquivUnderlyingOfWithZeroValuation in +/-- The exact principal-unit factor in the equal-characteristic field-unit structure theorem, +reindexed from +the prime-to-`p` degrees and residue-basis coordinates by `ℕ`. -/ +noncomputable def chosenFirstPrincipalUnitStructureEqualCharacteristic + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] + [CharP K (ofWithZeroValuation v).residueCharacteristic] : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Multiplicative (ℕ → ℤ_[F.residueCharacteristic]) ≃ₜ* + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF 1 := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let hex := F.toCompleteDVF.exists_uniformizer + let π := Classical.choose hex + have hπ : v.IsUniformizer (π : K) := Classical.choose_spec hex + let : ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete + (Valued.v : _root_.Valuation K + (WithZero (Multiplicative ℤ))) := by + change ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v + infer_instance + let E := + (CompleteDVF.higherPrincipalUnitGroup.iwasawaGlobalAdicPrincipalUnitsContinuousAddEquiv + F hπ).trans + (adicPrincipalUnitsContinuousAddEquivUnderlyingOfWithZeroValuation + v) + let I := iwasawaPadicIntProductContinuousAddEquivNat + F.residueCharacteristic + (CompleteDVF.higherPrincipalUnitGroup.iwasawaResidueRank F) + F.residueCharacteristic_prime.pos + Module.finrank_pos + let eAdd : (ℕ → ℤ_[F.residueCharacteristic]) ≃ₜ+ + Additive + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF 1) := + I.symm.trans E + exact LocalFieldTheory.DiscreteValuationField.continuousMulEquivOfAdditiveTarget eAdd + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + fieldUnitsContinuousMulEquivUniformizerRootsPrincipalUnitsOfWithZeroValuation → + fieldUnitsEquivUniformizerRootsPrincipalUnits in +/-- The local-field structure theory, the equal-characteristic field-unit structure theorem. In +equal characteristic the +Iwasawa generators identify the first principal units with a countable +product of `ℤ_p`; adjoining the valuation and Teichmuller factors gives the +canonical topological decomposition of `Kˣ`. -/ +noncomputable def chosenFieldUnitsStructureEqualCharacteristic + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] + [CharP K (ofWithZeroValuation v).residueCharacteristic] : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Multiplicative ℤ × + (Multiplicative (ZMod (Nat.card F.residueField - 1)) × + Multiplicative (ℕ → ℤ_[F.residueCharacteristic])) ≃ₜ* Kˣ := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let hex := F.toCompleteDVF.exists_uniformizer + let π := Classical.choose hex + have hπ : v.IsUniformizer (π : K) := Classical.choose_spec hex + let ePrincipal := + chosenFirstPrincipalUnitStructureEqualCharacteristic v + exact + fieldUnitsEquivUniformizerRootsPrincipalUnits + v hπ (Multiplicative (ℕ → ℤ_[F.residueCharacteristic])) ePrincipal + +end LocalField +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FiniteCoefficientLaurent.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FiniteCoefficientLaurent.lean new file mode 100644 index 0000000000..29ac59fb19 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FiniteCoefficientLaurent.lean @@ -0,0 +1,375 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Algebra.ZMod +public import Mathlib.Algebra.Field.ZMod +public import Mathlib.LinearAlgebra.Basis.Basic +public import Mathlib.LinearAlgebra.Dimension.Free +public import Mathlib.LinearAlgebra.FiniteDimensional.Defs +public import Mathlib.RingTheory.Finiteness.Basic +public import Mathlib.RingTheory.LaurentSeries +public import Mathlib.RingTheory.Localization.Away.Basic +public import Mathlib.RingTheory.RingHom.Finite +/-! +# Coefficient-field descent for Laurent series + +This file starts the remaining equal-characteristic descent in the local-field structure + classification: a finite coefficient field `k` of characteristic `p` gives a canonical +coefficientwise map from `F_p((X))` to `k((X))`. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace LocalFieldTheory.DiscreteValuationField +namespace FiniteCoefficientLaurent + +open scoped LaurentSeries PowerSeries + +section PowerSeriesFinite + +variable {R : Type u} {A : Type v} [Field R] [Field A] [Algebra R A] + +/-- If the coefficient field extension `A/R` is finite-dimensional, then +`A⟦X⟧` is finitely generated over `R⟦X⟧`. A finite `R`-basis of `A` gives +generators by embedding basis vectors as constant power series. -/ +theorem powerSeries_moduleFinite_of_finiteDimensional + [FiniteDimensional R A] : + Module.Finite R⟦X⟧ A⟦X⟧ := by + classical + let b : Module.Basis (Fin (Module.finrank R A)) R A := Module.finBasis R A + let gens : Finset A⟦X⟧ := + Finset.univ.image fun i : Fin (Module.finrank R A) => + PowerSeries.C (b i) + refine ⟨gens, ?_⟩ + rw [eq_top_iff] + intro f _hf + let coord : Fin (Module.finrank R A) → R⟦X⟧ := + fun i => PowerSeries.mk fun n => b.repr (PowerSeries.coeff n f) i + have hsum : + (∑ i : Fin (Module.finrank R A), + coord i • PowerSeries.C (b i)) = f := by + apply PowerSeries.ext + intro n + calc + PowerSeries.coeff n + (∑ i : Fin (Module.finrank R A), + coord i • PowerSeries.C (b i)) = + ∑ i : Fin (Module.finrank R A), + algebraMap R A (b.repr (PowerSeries.coeff n f) i) * b i := by + simp [coord, Algebra.smul_def, PowerSeries.algebraMap_apply'', + PowerSeries.coeff_map] + _ = PowerSeries.coeff n f := by + simpa [Algebra.smul_def] using + (b.sum_repr (PowerSeries.coeff n f)) + rw [← hsum] + exact + Submodule.sum_mem _ fun i _ => + Submodule.smul_mem _ (coord i) <| + Submodule.subset_span (by + simp [gens]) + +end PowerSeriesFinite + +variable (p : ℕ) (k : Type u) [Fact p.Prime] [Field k] [CharP k p] + +/-- A finite field of characteristic `p` is finite-dimensional over its prime +field `ZMod p`. -/ +theorem zmod_finiteDimensional_of_finite [Finite k] : + letI : Algebra (ZMod p) k := ZMod.algebra k p + FiniteDimensional (ZMod p) k := by + let : Algebra (ZMod p) k := ZMod.algebra k p + have : Fintype k := Fintype.ofFinite k + exact Module.finite_def.2 <| by + simpa using + (Submodule.fg_span (R := ZMod p) (M := k) + (s := Set.univ) (Set.finite_univ : (Set.univ : Set k).Finite)) + +/-- Finite generation of `k⟦X⟧` over `F_p⟦X⟧`, for a finite coefficient +field `k` of characteristic `p`. -/ +theorem zmodPowerSeries_moduleFinite [Finite k] : + letI : Algebra (ZMod p) k := ZMod.algebra k p + Module.Finite (ZMod p)⟦X⟧ k⟦X⟧ := by + let : Algebra (ZMod p) k := ZMod.algebra k p + have : FiniteDimensional (ZMod p) k := + zmod_finiteDimensional_of_finite p k + exact powerSeries_moduleFinite_of_finiteDimensional (R := ZMod p) (A := k) + +/-- Coefficientwise map on power series induced by the prime-field embedding +`ZMod p -> k`. -/ +noncomputable def zmodPowerSeriesCoeffMap : + (ZMod p)⟦X⟧ →+* k⟦X⟧ := by + letI : Algebra (ZMod p) k := ZMod.algebra k p + exact PowerSeries.map (algebraMap (ZMod p) k) + +/-- +Establishes the identity `zmodPowerSeriesCoeffMap p k (PowerSeries.C a) = PowerSeries.C +((ZMod.castHom (m := p) dvd_rfl k) a)`. +-/ +@[simp] +theorem zmodPowerSeriesCoeffMap_C (a : ZMod p) : + zmodPowerSeriesCoeffMap p k (PowerSeries.C a) = + PowerSeries.C ((ZMod.castHom (m := p) dvd_rfl k) a) := by + let : Algebra (ZMod p) k := ZMod.algebra k p + rw [zmodPowerSeriesCoeffMap, PowerSeries.map_C] + change PowerSeries.C ((algebraMap (ZMod p) k) a) = + PowerSeries.C ((ZMod.castHom (m := p) dvd_rfl k) a) + rfl + +/-- Establishes the identity `zmodPowerSeriesCoeffMap p k PowerSeries.X = PowerSeries.X`. -/ +@[simp] +theorem zmodPowerSeriesCoeffMap_X : + zmodPowerSeriesCoeffMap p k PowerSeries.X = PowerSeries.X := by + let : Algebra (ZMod p) k := ZMod.algebra k p + simp [zmodPowerSeriesCoeffMap] + +/-- The coefficientwise power-series map is finite when the coefficient field +extension `k / F_p` is finite. -/ +theorem zmodPowerSeriesCoeffMap_finite [Finite k] : + (zmodPowerSeriesCoeffMap p k).Finite := by + let : Algebra (ZMod p) k := ZMod.algebra k p + change Module.Finite (ZMod p)⟦X⟧ k⟦X⟧ + exact zmodPowerSeries_moduleFinite p k + +/-- The image of `X` under the coefficientwise power-series map is invertible +after passing to Laurent series. -/ +theorem zmodPowerSeriesCoeffMap_X_isUnit : + IsUnit + ((algebraMap k⟦X⟧ k⸨X⸩).comp (zmodPowerSeriesCoeffMap p k) + (PowerSeries.X : (ZMod p)⟦X⟧)) := by + let : Algebra (ZMod p) k := ZMod.algebra k p + simp [zmodPowerSeriesCoeffMap] + +/-- Coefficientwise Laurent-series map induced from `ZMod p -> k`. -/ +noncomputable def zmodLaurentCoeffMap : + (ZMod p)⸨X⸩ →+* k⸨X⸩ := by + letI : Algebra (ZMod p) k := ZMod.algebra k p + let φ : ZMod p →+* k := algebraMap (ZMod p) k + exact + { toFun := fun f => f.map φ + map_zero' := by + change HahnSeries.map (0 : (ZMod p)⸨X⸩) φ.toZeroHom = 0 + exact HahnSeries.map_zero (Γ := ℤ) (R := ZMod p) (S := k) φ.toZeroHom + map_one' := by + change HahnSeries.map (1 : (ZMod p)⸨X⸩) φ.toMonoidWithZeroHom = 1 + exact + HahnSeries.map_one (Γ := ℤ) (R := ZMod p) (S := k) + φ.toMonoidWithZeroHom + map_add' := by + intro x y + change + HahnSeries.map (x + y) φ.toAddMonoidHom = + HahnSeries.map x φ.toAddMonoidHom + + HahnSeries.map y φ.toAddMonoidHom + exact + HahnSeries.map_add (Γ := ℤ) (R := ZMod p) (S := k) + φ.toAddMonoidHom + map_mul' := by + intro x y + change + HahnSeries.map (x * y) φ.toNonUnitalRingHom = + HahnSeries.map x φ.toNonUnitalRingHom * + HahnSeries.map y φ.toNonUnitalRingHom + exact + HahnSeries.map_mul (Γ := ℤ) (R := ZMod p) (S := k) + φ.toNonUnitalRingHom } + +/-- +Establishes the identity `(zmodLaurentCoeffMap p k f).coeff n = (ZMod.castHom (m := p) dvd_rfl k) +(f.coeff n)`. +-/ +@[simp] +theorem zmodLaurentCoeffMap_coeff (f : (ZMod p)⸨X⸩) (n : ℤ) : + (zmodLaurentCoeffMap p k f).coeff n = + (ZMod.castHom (m := p) dvd_rfl k) (f.coeff n) := by + let : Algebra (ZMod p) k := ZMod.algebra k p + change (HahnSeries.map f (algebraMap (ZMod p) k)).coeff n = + (ZMod.castHom (m := p) dvd_rfl k) (f.coeff n) + have hφ : + algebraMap (ZMod p) k = ZMod.castHom (m := p) dvd_rfl k := rfl + rw [hφ] + rfl + +/-- +Establishes the identity `zmodLaurentCoeffMap p k (HahnSeries.C (Γ := ℤ) a : (ZMod p)⸨X⸩) = +(HahnSeries.C (Γ := ℤ) ((ZMod.castHom (m := p) dvd_rfl k) a) : k⸨X⸩)`. +-/ +theorem zmodLaurentCoeffMap_C (a : ZMod p) : + zmodLaurentCoeffMap p k (HahnSeries.C (Γ := ℤ) a : (ZMod p)⸨X⸩) = + (HahnSeries.C (Γ := ℤ) ((ZMod.castHom (m := p) dvd_rfl k) a) : + k⸨X⸩) := by + let : Algebra (ZMod p) k := ZMod.algebra k p + change + HahnSeries.map (HahnSeries.C (Γ := ℤ) a : (ZMod p)⸨X⸩) + (algebraMap (ZMod p) k) = + (HahnSeries.C (Γ := ℤ) ((ZMod.castHom (m := p) dvd_rfl k) a) : + k⸨X⸩) + rw [HahnSeries.map_C] + change + HahnSeries.C ((algebraMap (ZMod p) k) a) = + (HahnSeries.C ((ZMod.castHom (m := p) dvd_rfl k) a) : k⸨X⸩) + rfl + +/-- +Establishes the identity `(zmodLaurentCoeffMap p k).comp (algebraMap (ZMod p)⟦X⟧ (ZMod p)⸨X⸩) = +(algebraMap k⟦X⟧ k⸨X⸩).comp (zmodPowerSeriesCoeffMap p k)`. +-/ +theorem zmodLaurentCoeffMap_comp_powerSeries : + (zmodLaurentCoeffMap p k).comp + (algebraMap (ZMod p)⟦X⟧ (ZMod p)⸨X⸩) = + (algebraMap k⟦X⟧ k⸨X⸩).comp + (zmodPowerSeriesCoeffMap p k) := by + ext f n + cases n with + | ofNat n => + simp [zmodLaurentCoeffMap, zmodPowerSeriesCoeffMap, + LaurentSeries.coe_algebraMap, LaurentSeries.coeff_coe_powerSeries, + PowerSeries.coeff_map] + | negSucc n => + simp [zmodLaurentCoeffMap, zmodPowerSeriesCoeffMap, + LaurentSeries.coe_algebraMap, PowerSeries.coeff_coe] + +/-- +Establishes the identity `zmodLaurentCoeffMap p k ((algebraMap (ZMod p)⟦X⟧ (ZMod p)⸨X⸩) +(PowerSeries.X : (ZMod p)⟦X⟧)) = (algebraMap k⟦X⟧ k⸨X⸩) (PowerSeries.X : k⟦X⟧)`. +-/ +theorem zmodLaurentCoeffMap_powerSeries_X : + zmodLaurentCoeffMap p k + ((algebraMap (ZMod p)⟦X⟧ (ZMod p)⸨X⸩) + (PowerSeries.X : (ZMod p)⟦X⟧)) = + (algebraMap k⟦X⟧ k⸨X⸩) (PowerSeries.X : k⟦X⟧) := by + change + ((zmodLaurentCoeffMap p k).comp + (algebraMap (ZMod p)⟦X⟧ (ZMod p)⸨X⸩)) + (PowerSeries.X : (ZMod p)⟦X⟧) = + (algebraMap k⟦X⟧ k⸨X⸩) (PowerSeries.X : k⟦X⟧) + rw [zmodLaurentCoeffMap_comp_powerSeries] + simp + +/-- The induced algebra structure of `k((X))` over `F_p((X))`. -/ +@[reducible] +noncomputable def zmodLaurentCoeffAlgebra : + Algebra ((ZMod p)⸨X⸩) (k⸨X⸩) := + RingHom.toAlgebra (zmodLaurentCoeffMap p k) + +/-- The algebra map from `F_p((X))` to `k((X))` is the coefficientwise extension map. -/ +theorem zmodLaurentCoeffAlgebra_algebraMap : + letI : Algebra ((ZMod p)⸨X⸩) (k⸨X⸩) := + zmodLaurentCoeffAlgebra p k + algebraMap ((ZMod p)⸨X⸩) (k⸨X⸩) = + zmodLaurentCoeffMap p k := by + rfl + +/-- The Laurent series whose coefficients are one coordinate of the coefficients +of `f` with respect to a fixed `ZMod p`-basis of `k`. -/ +noncomputable def zmodLaurentCoeffCoord {ι : Type*} [Algebra (ZMod p) k] + (b : Module.Basis ι (ZMod p) k) (f : k⸨X⸩) (i : ι) : + (ZMod p)⸨X⸩ := + HahnSeries.ofSuppBddBelow + (fun n : ℤ => b.repr (f.coeff n) i) + (by + refine ⟨f.order, ?_⟩ + intro n hn + by_contra hlt + have hzero : f.coeff n = 0 := + HahnSeries.coeff_eq_zero_of_lt_order (not_le.mp hlt) + exact hn (by simp [hzero])) + +omit [CharP k p] in +/-- +Establishes the identity `(zmodLaurentCoeffCoord (p := p) (k := k) b f i).coeff n = b.repr +(f.coeff n) i`. +-/ +@[simp] +theorem zmodLaurentCoeffCoord_coeff {ι : Type*} [Algebra (ZMod p) k] + (b : Module.Basis ι (ZMod p) k) (f : k⸨X⸩) (i : ι) (n : ℤ) : + (zmodLaurentCoeffCoord (p := p) (k := k) b f i).coeff n = + b.repr (f.coeff n) i := by + exact congrFun + (HahnSeries.coeff_ofSuppBddBelow + (f := fun m : ℤ => b.repr (f.coeff m) i)) + n + +/-- Finite generation of `k((X))` as a module over `F_p((X))`. -/ +theorem zmodLaurent_moduleFinite [Finite k] : + letI : Algebra ((ZMod p)⸨X⸩) (k⸨X⸩) := + zmodLaurentCoeffAlgebra p k + Module.Finite ((ZMod p)⸨X⸩) (k⸨X⸩) := by + classical + let : Algebra (ZMod p) k := ZMod.algebra k p + have : FiniteDimensional (ZMod p) k := + zmod_finiteDimensional_of_finite p k + let : Algebra ((ZMod p)⸨X⸩) (k⸨X⸩) := + zmodLaurentCoeffAlgebra p k + let b : Module.Basis (Fin (Module.finrank (ZMod p) k)) (ZMod p) k := + Module.finBasis (ZMod p) k + let gens : Finset k⸨X⸩ := + Finset.univ.image fun i : Fin (Module.finrank (ZMod p) k) => + (HahnSeries.C (Γ := ℤ) (b i) : k⸨X⸩) + refine ⟨gens, ?_⟩ + rw [eq_top_iff] + intro f _hf + let coord : Fin (Module.finrank (ZMod p) k) → (ZMod p)⸨X⸩ := + fun i => zmodLaurentCoeffCoord (p := p) (k := k) b f i + have hsum : + (∑ i : Fin (Module.finrank (ZMod p) k), + coord i • (HahnSeries.C (Γ := ℤ) (b i) : k⸨X⸩)) = f := by + ext n + rw [HahnSeries.coeff_sum] + calc + (∑ i : Fin (Module.finrank (ZMod p) k), + (coord i • (HahnSeries.C (Γ := ℤ) (b i) : k⸨X⸩) : + k⸨X⸩).coeff n) = + ∑ i : Fin (Module.finrank (ZMod p) k), + algebraMap (ZMod p) k (b.repr (f.coeff n) i) * b i := by + apply Finset.sum_congr rfl + intro i _ + change + ((HahnSeries.map + (zmodLaurentCoeffCoord (p := p) (k := k) b f i) + (algebraMap (ZMod p) k)) * + (HahnSeries.C (Γ := ℤ) (b i) : k⸨X⸩)).coeff n = _ + rw [mul_comm, HahnSeries.C_mul_eq_smul, HahnSeries.coeff_smul, + HahnSeries.map_coeff, zmodLaurentCoeffCoord_coeff] + exact mul_comm _ _ + _ = f.coeff n := by + simpa [Algebra.smul_def] using (b.sum_repr (f.coeff n)) + rw [← hsum] + exact + Submodule.sum_mem _ fun i _ => + Submodule.smul_mem _ (coord i) <| + Submodule.subset_span (by + change (HahnSeries.C (Γ := ℤ) (b i) : k⸨X⸩) ∈ + (gens : Set k⸨X⸩) + simp [gens]) + +/-- The Laurent-series coefficient map `F_p((X)) -> k((X))` is finite when +`k` is finite. -/ +theorem zmodLaurentCoeffMap_finite [Finite k] : + (zmodLaurentCoeffMap p k).Finite := by + let : Algebra ((ZMod p)⸨X⸩) (k⸨X⸩) := + zmodLaurentCoeffAlgebra p k + change Module.Finite ((ZMod p)⸨X⸩) (k⸨X⸩) + exact zmodLaurent_moduleFinite p k + +/-- Finite-dimensionality of `k((X))` over the literal prime-field Laurent +series `F_p((X))`. -/ +theorem zmodLaurent_finiteDimensional [Finite k] : + letI : Algebra ((ZMod p)⸨X⸩) (k⸨X⸩) := + zmodLaurentCoeffAlgebra p k + FiniteDimensional ((ZMod p)⸨X⸩) (k⸨X⸩) := by + let : Algebra ((ZMod p)⸨X⸩) (k⸨X⸩) := + zmodLaurentCoeffAlgebra p k + exact zmodLaurent_moduleFinite p k + +end FiniteCoefficientLaurent +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaIndexing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaIndexing.lean new file mode 100644 index 0000000000..dc1e116aa6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaIndexing.lean @@ -0,0 +1,87 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.Padics.RingHoms +public import Mathlib.Topology.Homeomorph.Lemmas +public import Mathlib.Basic.Denumerable +/-! +# Topological structure of local-field units: reindexing the Iwasawa product + +The equal-characteristic proof naturally indexes copies of `ℤ_[p]` by a +positive integer prime to `p` and a residue-field basis vector. This file +records that, when the basis is nonempty, this is exactly a countable product. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalFieldTheory.DiscreteValuationField + +/-- Positive degrees prime to `p`, as used in the Iwasawa product. -/ +def IwasawaDegree (p : ℕ) := {n : ℕ // 1 ≤ n ∧ Nat.Coprime n p} + +/-- A prime-to-`p` degree together with a residue-field basis coordinate. -/ +abbrev IwasawaIndex (p f : ℕ) := IwasawaDegree p × Fin f + +/-- The degrees `1 + pk` give an infinite sequence of pairwise distinct +positive degrees prime to `p`. -/ +def iwasawaDegreeEmbedding (p : ℕ) (hp : 0 < p) : ℕ ↪ IwasawaDegree p where + toFun k := + ⟨1 + p * k, by + constructor + · omega + · exact (Nat.coprime_add_mul_left_left 1 p k).2 (by simp)⟩ + inj' := by + intro a b h + have hv : 1 + p * a = 1 + p * b := congrArg Subtype.val h + apply Nat.mul_left_cancel hp + exact Nat.add_left_cancel hv + +/-- The Iwasawa index is infinite as soon as the finite basis has a vector. -/ +theorem infinite_iwasawaIndex (p f : ℕ) (hp : 0 < p) (hf : 0 < f) : + Infinite (IwasawaIndex p f) := by + let j : ℕ ↪ IwasawaIndex p f := + { toFun := fun k => (iwasawaDegreeEmbedding p hp k, ⟨0, hf⟩) + inj' := by + intro a b h + exact (iwasawaDegreeEmbedding p hp).injective + (congrArg (fun z : IwasawaIndex p f => z.1) h) } + exact Infinite.of_injective j j.injective + +/-- The index used in the equal-characteristic proof is denumerable. -/ +noncomputable def chosenIwasawaIndexEquivNat (p f : ℕ) (hp : 0 < p) (hf : 0 < f) : + IwasawaIndex p f ≃ ℕ := by + letI : Infinite (IwasawaIndex p f) := infinite_iwasawaIndex p f hp hf + letI : Countable (IwasawaDegree p) := by + unfold IwasawaDegree + infer_instance + letI : Countable (IwasawaIndex p f) := by + change Countable (IwasawaDegree p × Fin f) + infer_instance + let d : Denumerable (IwasawaIndex p f) := + Classical.choice (nonempty_denumerable (IwasawaIndex p f)) + exact @Denumerable.eqv (IwasawaIndex p f) d + +/-- Reindexing the Iwasawa product gives the canonical +`ℤ_[p]^ℕ`, both algebraically and topologically. -/ +noncomputable def iwasawaPadicIntProductContinuousAddEquivNat + (p f : ℕ) [Fact p.Prime] (hp : 0 < p) (hf : 0 < f) : + (IwasawaIndex p f → ℤ_[p]) ≃ₜ+ (ℕ → ℤ_[p]) := by + let e := chosenIwasawaIndexEquivNat p f hp hf + exact ContinuousAddEquiv.mk' + (Homeomorph.piCongrLeft (Y := fun _ : ℕ => ℤ_[p]) e) + (by + intro x y + apply funext + intro j + obtain ⟨i, rfl⟩ := e.surjective j + simp) + +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaPrincipalUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaPrincipalUnits.lean new file mode 100644 index 0000000000..7473364267 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaPrincipalUnits.lean @@ -0,0 +1,2844 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaIndexing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitInverseLimitSurjectivity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.EqualCharacteristicLaurent +public import Mathlib.LinearAlgebra.Finsupp.LinearCombination +public import Mathlib.LinearAlgebra.Finsupp.VectorSpace +public import Mathlib.NumberTheory.Padics.ProperSpace +/-! +# The convergent Iwasawa product for principal units + +This module assembles the finite-level Iwasawa factors into a compatible +family in the principal-unit inverse limit, proves continuity and bijectivity, +and packages the resulting topological additive equivalence. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming + higherPrincipalUnitGroup → + classFieldHigherPrincipalUnitGroup + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + principalUnitOneAddOfMemPowSubgroup → + classFieldPrincipalUnitOneAddOfMemPowSubgroup + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + principalUnitOneAddOfMemPowSubgroup_val → + classFieldPrincipalUnitOneAddOfMemPowSubgroup_val + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + principalUnitOneAddOfMemPow_val → + classFieldPrincipalUnitOneAddOfMemPow_val + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + principalUnitPadic_smul_mem_higher → + classFieldPrincipalUnitPadic_smul_mem_higher + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + principalUnitSuccQuot → + classFieldPrincipalUnitSuccQuot + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + principalUnitSuccQuotAddEquivResidueOfUniformizer → + classFieldPrincipalUnitSuccQuotAddEquivResidueOfUniformizer + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + principalUnitSuccQuotAddEquivResidueOfUniformizer_symm_residue → + classFieldPrincipalUnitSuccQuotAddEquivResidueOfUniformizer_symm_residue + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + principalUnitSuccQuotMk → + classFieldPrincipalUnitSuccQuotMk + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + principalUnitSuccQuotOfIdealPow_apply → + principalUnitSuccQuotOfIdealPow_apply + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + residueMap_residueTeichmullerLift → + classFieldResidueMap_residueTeichmullerLift + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + residueTeichmullerLift → + classFieldResidueTeichmullerLift + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + toPrincipalUnitFiltration → + toPrincipalUnitFiltration + + +/-! +# Finite-level Iwasawa generators for principal units + +This file develops an explicit topological product decomposition of principal units. In equal + characteristic, choose +a residue-field basis `omega_i` over `F_p`. For a positive degree `n`, the +prime-to-`p` Iwasawa map is + +`g_n(a_i) = product_i (1 + [omega_i] pi^n) ^ a_i`. + +The powers by p-adic integers are the canonical powers constructed from the +finite principal-unit quotients in `PrincipalUnitPadicAction`. This module +constructs each finite-level factor `g_n`, proves its filtration properties, +and establishes its algebraic injectivity. The convergent global product is +assembled in `IwasawaPrincipalUnits`. +-/ + +noncomputable +section + +open scoped BigOperators + +universe u v + +open ValuationTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField + +namespace LocalFieldTheory.DiscreteValuationField +namespace CompleteDVF +namespace higherPrincipalUnitGroup + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup +open Internal + +variable {K : Type u} [Field K] + +noncomputable instance residueFieldZModAlgebra + (F : LocalField.{u, v} K) : + Algebra (ZMod F.residueCharacteristic) F.residueField := + ZMod.algebra F.residueField F.residueCharacteristic + +/-- The number of vectors in a basis of the residue field over its prime +field. This is the `f` in `q = p^f` in the field-unit structure theorem. -/ +abbrev iwasawaResidueRank (F : LocalField.{u, v} K) : ℕ := + Module.finrank (ZMod F.residueCharacteristic) F.residueField + +/-- A fixed `F_p`-basis of the residue field, denoted `omega_1,...,omega_f` +in this construction. -/ +noncomputable def iwasawaResidueBasis (F : LocalField.{u, v} K) : + Module.Basis (Fin (iwasawaResidueRank F)) + (ZMod F.residueCharacteristic) F.residueField := + Module.finBasis (ZMod F.residueCharacteristic) F.residueField + +/-- The rank chosen above is the exponent in the finite-field cardinality +identity `q = p^f`. -/ +theorem residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank + (F : LocalField.{u, v} K) : + Nat.card F.residueField = + F.residueCharacteristic ^ iwasawaResidueRank F := by + simpa [iwasawaResidueRank, Nat.card_zmod] using + (Module.natCard_eq_pow_finrank + (K := ZMod F.residueCharacteristic) (V := F.residueField)) + +/-- The element `[omega_i] pi^n` of the `n`-th maximal-ideal power. -/ +noncomputable def iwasawaSeedIdeal + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (i : Fin (iwasawaResidueRank F)) : + ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) := + DVF.maximalIdealPowMulUniformizerPowMap F.toDVF hpi n + (classFieldResidueTeichmullerLift F.toCompleteDVF + (iwasawaResidueBasis F i)) + +/-- +Establishes the identity `(iwasawaSeedIdeal F hpi n i : F.valuationSubring) = +CompleteDVF.higherPrincipalUnitGroup.residueTeichmullerLift F.toCompleteDVF (iwasawaResidueBasis F +i) * pi ^ n`. +-/ +@[simp] theorem iwasawaSeedIdeal_val + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (i : Fin (iwasawaResidueRank F)) : + (iwasawaSeedIdeal F hpi n i : F.valuationSubring) = + classFieldResidueTeichmullerLift F.toCompleteDVF + (iwasawaResidueBasis F i) * pi ^ n := + rfl + +/-- The generator `1 + [omega_i] pi^n`, first as an element of `U^n`. -/ +noncomputable def iwasawaSeedAtLevel + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) (i : Fin (iwasawaResidueRank F)) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n := + classFieldPrincipalUnitOneAddOfMemPowSubgroup + F.toCompleteDVF hn (iwasawaSeedIdeal F hpi n i) + (iwasawaSeedIdeal F hpi n i).property + +/-- +Establishes the identity `(((iwasawaSeedAtLevel F hpi n hn i : +((CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : F.valuationSubringˣ) : +F.valuationSubring) = 1 + CompleteDVF.higherPrincipalUnitGroup.residueTeichmullerLift +F.toCompleteDVF (iwasawaResidueBasis F i) * pi ^ n`. +-/ +@[simp] theorem iwasawaSeedAtLevel_val + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) (i : Fin (iwasawaResidueRank F)) : + (((iwasawaSeedAtLevel F hpi n hn i : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n) : F.valuationSubringˣ) : + F.valuationSubring) = + 1 + classFieldResidueTeichmullerLift F.toCompleteDVF + (iwasawaResidueBasis F i) * pi ^ n := by + rw [iwasawaSeedAtLevel, + classFieldPrincipalUnitOneAddOfMemPowSubgroup_val, + classFieldPrincipalUnitOneAddOfMemPow_val] + rfl + +/-- The same generator regarded as a first principal unit, so that the +canonical p-adic scalar action is available. -/ +noncomputable def iwasawaSeed + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) (i : Fin (iwasawaResidueRank F)) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1 := + ⟨(iwasawaSeedAtLevel F hpi n hn i : F.valuationSubringˣ), + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.antitone + F.toCompleteDVF hn + (iwasawaSeedAtLevel F hpi n hn i).property⟩ + +/-- +Establishes the identity `(((iwasawaSeed F hpi n hn i : ((CompleteDVF.higherPrincipalUnitGroup +F.toCompleteDVF)) 1) : F.valuationSubringˣ) : F.valuationSubring) = 1 + +CompleteDVF.higherPrincipalUnitGroup.residueTeichmullerLift F.toCompleteDVF (iwasawaResidueBasis F +i) * pi ^ n`. +-/ +@[simp] theorem iwasawaSeed_val + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) (i : Fin (iwasawaResidueRank F)) : + (((iwasawaSeed F hpi n hn i : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : + F.valuationSubringˣ) : F.valuationSubring) = + 1 + classFieldResidueTeichmullerLift F.toCompleteDVF + (iwasawaResidueBasis F i) * pi ^ n := by + exact iwasawaSeedAtLevel_val F hpi n hn i + +/-- The leading coefficient of `1 + [omega_i] pi^n` in +`U^n/U^(n+1)` is exactly the basis vector `omega_i`. -/ +@[simp] theorem principalUnitSuccQuotAddEquivResidue_iwasawaSeed + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) (i : Fin (iwasawaResidueRank F)) : + classFieldPrincipalUnitSuccQuotAddEquivResidueOfUniformizer + F.toCompleteDVF hpi n hn + (Additive.ofMul + (classFieldPrincipalUnitSuccQuotMk F.toCompleteDVF n + (iwasawaSeedAtLevel F hpi n hn i))) = + iwasawaResidueBasis F i := by + let r : F.valuationSubring := + classFieldResidueTeichmullerLift F.toCompleteDVF + (iwasawaResidueBasis F i) + let e := + classFieldPrincipalUnitSuccQuotAddEquivResidueOfUniformizer + F.toCompleteDVF hpi n hn + have hs := + classFieldPrincipalUnitSuccQuotAddEquivResidueOfUniformizer_symm_residue + F.toCompleteDVF hpi n hn r + have he := congrArg e hs + simpa [e, r, iwasawaSeedAtLevel, iwasawaSeedIdeal, + principalUnitSuccQuotOfIdealPow_apply, + classFieldResidueMap_residueTeichmullerLift] using he.symm + +/-- The basis-coordinate form of the leading-layer calculation. This is the +linear algebra behind formula (1) at `s = 0`: the chosen `f` seed units give +every class in `U^n/U^(n+1)`, uniquely modulo `p`. -/ +noncomputable def iwasawaLeadingLayerAddEquiv + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) : + (Fin (iwasawaResidueRank F) → ZMod F.residueCharacteristic) ≃+ + Additive + (classFieldPrincipalUnitSuccQuot + F.toCompleteDVF n) := + (iwasawaResidueBasis F).equivFun.symm.toAddEquiv.trans + (classFieldPrincipalUnitSuccQuotAddEquivResidueOfUniformizer + F.toCompleteDVF hpi n hn).symm + +/-- +Establishes the identity `iwasawaLeadingLayerAddEquiv F hpi n hn (Pi.single i 1) = Additive.ofMul +(CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotMk F.toCompleteDVF n +(iwasawaSeedAtLevel F hpi n hn i))`. +-/ +@[simp] theorem iwasawaLeadingLayerAddEquiv_single + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) (i : Fin (iwasawaResidueRank F)) : + iwasawaLeadingLayerAddEquiv F hpi n hn (Pi.single i 1) = + Additive.ofMul + (classFieldPrincipalUnitSuccQuotMk F.toCompleteDVF n + (iwasawaSeedAtLevel F hpi n hn i)) := by + let e := + classFieldPrincipalUnitSuccQuotAddEquivResidueOfUniformizer + F.toCompleteDVF hpi n hn + let z := Additive.ofMul + (classFieldPrincipalUnitSuccQuotMk F.toCompleteDVF n + (iwasawaSeedAtLevel F hpi n hn i)) + calc + iwasawaLeadingLayerAddEquiv F hpi n hn (Pi.single i 1) = + e.symm ((iwasawaResidueBasis F).equivFun.symm (Pi.single i 1)) := rfl + _ = e.symm (iwasawaResidueBasis F i) := by + rw [Basis.equivFun_symm_single] + _ = e.symm (e z) := by + exact congrArg e.symm + (principalUnitSuccQuotAddEquivResidue_iwasawaSeed + F hpi n hn i).symm + _ = z := e.symm_apply_apply z + +/-- +Characterizes `iwasawaLeadingLayerAddEquiv F hpi n hn a = 0` by the equivalent condition `a = 0`. +-/ +theorem iwasawaLeadingLayerAddEquiv_eq_zero_iff + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) + (a : Fin (iwasawaResidueRank F) → ZMod F.residueCharacteristic) : + iwasawaLeadingLayerAddEquiv F hpi n hn a = 0 ↔ a = 0 := by + constructor + · intro ha + apply (iwasawaLeadingLayerAddEquiv F hpi n hn).injective + simpa using ha + · rintro rfl + exact map_zero _ + +/-! ## Reduction of p-adic exponents on one graded layer -/ + +/-- A p-adic integer differs from the ordinary representative of its +reduction modulo `p` by a multiple of `p`. -/ +theorem exists_padicInt_sub_toZMod_val_eq_residueCharacteristic_mul + (F : LocalField.{u, v} K) + (a : ℤ_[F.residueCharacteristic]) : + ∃ b : ℤ_[F.residueCharacteristic], + a - ((PadicInt.toZMod a).val : ℤ_[F.residueCharacteristic]) = + (F.residueCharacteristic : ℤ_[F.residueCharacteristic]) * b := by + have h := PadicInt.toZMod_spec a + rw [PadicInt.maximalIdeal_eq_span_p] at h + rw [Ideal.mem_span_singleton] at h + obtain ⟨b, hb⟩ := h + refine ⟨b, ?_⟩ + rw [ZMod.cast_eq_val] at hb + simpa [mul_comm] using hb + +/-- A p-adic power of a first principal unit, remembered at a specified +higher-unit level. -/ +noncomputable def principalUnitPadicSmulAtLevel + (F : LocalField.{u, v} K) (r : ℕ) (hr : 1 ≤ r) + (a : ℤ_[F.residueCharacteristic]) + (x : ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) + (hx : (x : F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) r) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) r := + ⟨(Additive.toMul (a • Additive.ofMul x) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1), + principalUnitPadic_smul_mem_higher F hr a x hx⟩ + +/-- On `U^r/U^(r+1)`, a p-adic exponent may be replaced by its first +ordinary approximation. This is the precise version of choosing the +integers `b_i ≡ a_i (mod p)` in the coefficient calculation. -/ +theorem principalUnitSuccQuotMk_padicSmulAtLevel_eq_toZMod_val + (F : LocalField.{u, v} K) (r : ℕ) (hr : 1 ≤ r) + (a : ℤ_[F.residueCharacteristic]) + (x : ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) + (hx : (x : F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) r) : + principalUnitSuccQuotMk F.toCompleteDVF r + (principalUnitPadicSmulAtLevel F r hr a x hx) = + principalUnitSuccQuotMk F.toCompleteDVF r + (principalUnitPadicSmulAtLevel F r hr + ((PadicInt.toZMod a).val : ℤ_[F.residueCharacteristic]) x hx) := by + apply (principalUnitSuccQuotMk_eq_iff_div_mem F.toCompleteDVF r _ _).2 + change + ((principalUnitPadicSmulAtLevel F r hr a x hx / + principalUnitPadicSmulAtLevel F r hr + ((PadicInt.toZMod a).val : ℤ_[F.residueCharacteristic]) x hx : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) r) : F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (r + 1) + obtain ⟨b, hb⟩ := + exists_padicInt_sub_toZMod_val_eq_residueCharacteristic_mul F a + have hdeep := + principalUnitPadic_residueCharacteristic_mul_smul_mem_succ + F hr b x hx + rw [← hb] at hdeep + change + (((Additive.toMul (a • Additive.ofMul x) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) / + (Additive.toMul + (((PadicInt.toZMod a).val : ℤ_[F.residueCharacteristic]) • + Additive.ofMul x) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (r + 1) + have hsub := sub_smul a + ((PadicInt.toZMod a).val : ℤ_[F.residueCharacteristic]) + (Additive.ofMul x) + rw [hsub] at hdeep + exact hdeep + +/-- The leading coefficient map `U^r -> k`, written additively. -/ +noncomputable def principalUnitLeadingCoefficientAddHom + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (r : ℕ) (hr : 1 ≤ r) : + Additive (((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) r) →+ F.residueField := + (principalUnitSuccQuotAddEquivResidueOfUniformizer + F.toCompleteDVF hpi r hr).toAddMonoidHom.comp + { toFun := fun x => Additive.ofMul + (principalUnitSuccQuotMk F.toCompleteDVF r (Additive.toMul x)) + map_zero' := by + change Additive.ofMul + (principalUnitSuccQuotMk F.toCompleteDVF r 1) = 0 + simp + map_add' := by + intro x y + change Additive.ofMul + (principalUnitSuccQuotMk F.toCompleteDVF r + (Additive.toMul x * Additive.toMul y)) = + Additive.ofMul + (principalUnitSuccQuotMk F.toCompleteDVF r (Additive.toMul x)) + + Additive.ofMul + (principalUnitSuccQuotMk F.toCompleteDVF r (Additive.toMul y)) + rw [map_mul] + rfl } + +/-- +Characterizes `principalUnitLeadingCoefficientAddHom F hpi n hn (Additive.ofMul x) = 0` by the +equivalent condition `((x : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ +((CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (n + 1)`. +-/ +theorem principalUnitLeadingCoefficientAddHom_eq_zero_iff_mem_succ + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) (x : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n) : + principalUnitLeadingCoefficientAddHom F hpi n hn (Additive.ofMul x) = 0 ↔ + ((x : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (n + 1) := by + let e := principalUnitSuccQuotAddEquivResidueOfUniformizer + F.toCompleteDVF hpi n hn + let q := principalUnitSuccQuotMk F.toCompleteDVF n x + change e (Additive.ofMul q) = 0 ↔ _ + constructor + · intro h + have hqadd : Additive.ofMul q = 0 := by + apply e.injective + simpa using h + have hq : q = 1 := Additive.ofMul.injective hqadd + exact (principalUnitSuccQuotMk_eq_one_iff F.toCompleteDVF n x).1 hq + · intro hx + have hq : q = 1 := + (principalUnitSuccQuotMk_eq_one_iff F.toCompleteDVF n x).2 hx + simp [hq] + +/-- Reduction modulo `p` detects divisibility by `p` in `Z_p`. -/ +theorem padicInt_toZMod_eq_zero_iff_exists_residueCharacteristic_mul + (F : LocalField.{u, v} K) (a : ℤ_[F.residueCharacteristic]) : + PadicInt.toZMod a = 0 ↔ + ∃ b : ℤ_[F.residueCharacteristic], + a = (F.residueCharacteristic : ℤ_[F.residueCharacteristic]) * b := by + constructor + · intro ha + have hker : a ∈ RingHom.ker + (PadicInt.toZMod : ℤ_[F.residueCharacteristic] →+* + ZMod F.residueCharacteristic) := ha + rw [PadicInt.ker_toZMod, PadicInt.maximalIdeal_eq_span_p, + Ideal.mem_span_singleton] at hker + obtain ⟨b, hb⟩ := hker + exact ⟨b, by simpa [mul_comm] using hb⟩ + · rintro ⟨b, rfl⟩ + simp + +/-- A vector lies in `p Z_p^f` exactly when all of its residue coordinates +vanish. -/ +theorem exists_residueCharacteristic_smul_eq_iff_toZMod_eq_zero + (F : LocalField.{u, v} K) + (a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) : + (∃ b : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic], + a = (F.residueCharacteristic : ℤ_[F.residueCharacteristic]) • b) ↔ + ∀ i, PadicInt.toZMod (a i) = 0 := by + constructor + · rintro ⟨b, rfl⟩ i + simp + · intro h + choose b hb using fun i => + (padicInt_toZMod_eq_zero_iff_exists_residueCharacteristic_mul + F (a i)).1 (h i) + refine ⟨b, funext fun i => ?_⟩ + change a i = (F.residueCharacteristic : + ℤ_[F.residueCharacteristic]) * b i + exact hb i + +/-- The residue-basis combination is zero exactly when all reduced +coordinates are zero. -/ +theorem iwasawa_residue_combination_eq_zero_iff + (F : LocalField.{u, v} K) + (a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) : + (∑ i, PadicInt.toZMod (a i) • iwasawaResidueBasis F i) = 0 ↔ + ∀ i, PadicInt.toZMod (a i) = 0 := by + rw [← (iwasawaResidueBasis F).equivFun_symm_apply] + constructor + · intro h i + have hf : (fun j => PadicInt.toZMod (a j)) = 0 := by + apply (iwasawaResidueBasis F).equivFun.symm.injective + simpa using h + exact congrFun hf i + · intro h + have hf : (fun i => PadicInt.toZMod (a i)) = 0 := + funext fun i => h i + rw [hf, map_zero] + +/-- The principal unit `1 + r*pi^n`, used as a canonical representative of +a prescribed leading residue coefficient. -/ +noncomputable def principalUnitOneAddUniformizerPowAtLevel + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) (r : F.valuationSubring) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n := + principalUnitOneAddOfMemPowSubgroup F.toCompleteDVF hn + (DVF.maximalIdealPowMulUniformizerPowMap F.toDVF hpi n r) + (DVF.maximalIdealPowMulUniformizerPowMap F.toDVF hpi n r).property + +/-- +Establishes the identity `(((principalUnitOneAddUniformizerPowAtLevel F hpi n hn r : +((CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : F.valuationSubringˣ) : +F.valuationSubring) = 1 + r * pi ^ n`. +-/ +@[simp] theorem principalUnitOneAddUniformizerPowAtLevel_val + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) (r : F.valuationSubring) : + (((principalUnitOneAddUniformizerPowAtLevel F hpi n hn r : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n) : F.valuationSubringˣ) : + F.valuationSubring) = 1 + r * pi ^ n := by + rw [principalUnitOneAddUniformizerPowAtLevel, + principalUnitOneAddOfMemPowSubgroup_val, + principalUnitOneAddOfMemPow_val] + rfl + +/-- The leading coefficient of `1 + r*pi^n` is the residue of `r`. -/ +@[simp] theorem principalUnitLeadingCoefficientAddHom_oneAddUniformizerPow + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) (r : F.valuationSubring) : + principalUnitLeadingCoefficientAddHom F hpi n hn + (Additive.ofMul + (principalUnitOneAddUniformizerPowAtLevel F hpi n hn r)) = + F.residueMap r := by + let e := principalUnitSuccQuotAddEquivResidueOfUniformizer + F.toCompleteDVF hpi n hn + have hs := + principalUnitSuccQuotAddEquivResidueOfUniformizer_symm_residue + F.toCompleteDVF hpi n hn r + change e + (Additive.ofMul + (principalUnitSuccQuotOfIdealPow F.toCompleteDVF n hn + (DVF.maximalIdealPowMulUniformizerPowMap F.toDVF hpi n r))) = + F.residueMap r + rw [← hs, e.apply_symm_apply] + +/-- In equal characteristic, a `p^s`-th power sends `U^n` into +`U^(n*p^s)`. This is the depth multiplication used in both (1) and (2). -/ +theorem pow_residueCharacteristic_pow_mem_higher_mul + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {n : ℕ} (s : ℕ) + (x : ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) + (hx : (x : F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n) : + (((x ^ (F.residueCharacteristic ^ s) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) + (n * F.residueCharacteristic ^ s) := by + rw [LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.mem_iff] + have ha : + (((x : F.valuationSubringˣ) : F.valuationSubring) - 1) ∈ + F.maximalIdeal ^ n := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.mem_iff + F.toCompleteDVF n + (x : F.valuationSubringˣ)).1 hx + have hapow : + ((((x : F.valuationSubringˣ) : F.valuationSubring) - 1) ^ + (F.residueCharacteristic ^ s)) ∈ + F.maximalIdeal ^ (n * F.residueCharacteristic ^ s) := by + have h := Ideal.pow_mem_pow ha (F.residueCharacteristic ^ s) + simpa [pow_mul] using h + have heq : + ((((x ^ (F.residueCharacteristic ^ s) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) : + F.valuationSubring) - 1) = + (((x : F.valuationSubringˣ) : F.valuationSubring) - 1) ^ + (F.residueCharacteristic ^ s) := by + let z : F.valuationSubring := + ((x : F.valuationSubringˣ) : F.valuationSubring) - 1 + have hxz : ((x : F.valuationSubringˣ) : F.valuationSubring) = 1 + z := by + dsimp [z] + ring + change + ((x : F.valuationSubringˣ) : F.valuationSubring) ^ + (F.residueCharacteristic ^ s) - 1 = z ^ + (F.residueCharacteristic ^ s) + rw [hxz, add_pow_char_pow] + simp + rw [heq] + exact hapow + +/-- Inclusion `U^n -> U^1`. -/ +def higherUnitToFirst + (F : LocalField.{u, v} K) (n : ℕ) (hn : 1 ≤ n) + (x : ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1 := + ⟨(x : F.valuationSubringˣ), + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.antitone + F.toCompleteDVF hn x.property⟩ + +/-- Proves the bound `1 ≤ n * F.residueCharacteristic ^ s`. -/ +theorem one_le_mul_residueCharacteristic_pow + (F : LocalField.{u, v} K) {n : ℕ} (hn : 1 ≤ n) (s : ℕ) : + 1 ≤ n * F.residueCharacteristic ^ s := by + have hp : 0 < F.residueCharacteristic ^ s := + pow_pos F.residueCharacteristic_prime.pos s + exact Nat.mul_pos (lt_of_lt_of_le Nat.zero_lt_one hn) hp + +/-- A `p^s`-th power from `U^n`, with its exact equal-characteristic depth +`n*p^s` built into the codomain. -/ +noncomputable def principalUnitFrobeniusAtLevel + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (n : ℕ) (hn : 1 ≤ n) (s : ℕ) + (x : ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (n * F.residueCharacteristic ^ s) := + ⟨((higherUnitToFirst F n hn x) ^ (F.residueCharacteristic ^ s) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1), + pow_residueCharacteristic_pow_mem_higher_mul F s + (higherUnitToFirst F n hn x) x.property⟩ + +/-- Frobenius on a canonical representative: +`(1+r*pi^n)^(p^s) = 1+r^(p^s) pi^(n*p^s)`. -/ +theorem principalUnitFrobeniusAtLevel_oneAddUniformizerPow + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) (s : ℕ) (r : F.valuationSubring) : + let m := n * F.residueCharacteristic ^ s + let hm : 1 ≤ m := one_le_mul_residueCharacteristic_pow F hn s + principalUnitFrobeniusAtLevel F n hn s + (principalUnitOneAddUniformizerPowAtLevel F hpi n hn r) = + principalUnitOneAddUniformizerPowAtLevel F hpi m hm + (r ^ (F.residueCharacteristic ^ s)) := by + dsimp only + apply Subtype.ext + apply Units.ext + change + (1 + r * pi ^ n) ^ (F.residueCharacteristic ^ s) = + 1 + r ^ (F.residueCharacteristic ^ s) * + pi ^ (n * F.residueCharacteristic ^ s) + rw [add_pow_char_pow, mul_pow, pow_mul] + simp + +/-- Frobenius raises the leading residue coefficient to its `p^s`-th +power. -/ +theorem principalUnitLeadingCoefficientAddHom_frobenius + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) (s : ℕ) + (x : ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n) : + let m := n * F.residueCharacteristic ^ s + let hm : 1 ≤ m := one_le_mul_residueCharacteristic_pow F hn s + principalUnitLeadingCoefficientAddHom F hpi m hm + (Additive.ofMul (principalUnitFrobeniusAtLevel F n hn s x)) = + (principalUnitLeadingCoefficientAddHom F hpi n hn + (Additive.ofMul x)) ^ (F.residueCharacteristic ^ s) := by + dsimp only + let q : ℕ := F.residueCharacteristic ^ s + let m : ℕ := n * q + have hq : 1 ≤ q := by + exact pow_pos F.residueCharacteristic_prime.pos s + have hm : 1 ≤ m := by + exact one_le_mul_residueCharacteristic_pow F hn s + let lead : F.residueField := + principalUnitLeadingCoefficientAddHom F hpi n hn (Additive.ofMul x) + let r : F.valuationSubring := + residueTeichmullerLift F.toCompleteDVF lead + let y : ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n := + principalUnitOneAddUniformizerPowAtLevel F hpi n hn r + have hyLead : + principalUnitLeadingCoefficientAddHom F hpi n hn + (Additive.ofMul y) = lead := by + rw [principalUnitLeadingCoefficientAddHom_oneAddUniformizerPow] + exact residueMap_residueTeichmullerLift F.toCompleteDVF lead + have hxyQuot : + principalUnitSuccQuotMk F.toCompleteDVF n x = + principalUnitSuccQuotMk F.toCompleteDVF n y := by + apply (principalUnitSuccQuotAddEquivResidueOfUniformizer + F.toCompleteDVF hpi n hn).injective + change + principalUnitLeadingCoefficientAddHom F hpi n hn (Additive.ofMul x) = + principalUnitLeadingCoefficientAddHom F hpi n hn (Additive.ofMul y) + exact hyLead.symm + have hxyDeep : + (((x / y : ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (n + 1) := + (principalUnitSuccQuotMk_eq_iff_div_mem F.toCompleteDVF n x y).1 hxyQuot + let d : ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (n + 1) := + ⟨((x / y : ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n) : F.valuationSubringˣ), hxyDeep⟩ + have hdPow := pow_residueCharacteristic_pow_mem_higher_mul F s + (higherUnitToFirst F (n + 1) (Nat.succ_le_succ (Nat.zero_le n)) d) + d.property + have hlevel : m + 1 ≤ (n + 1) * q := by + calc + m + 1 ≤ m + q := Nat.add_le_add_left hq m + _ = (n + 1) * q := by simp [m, Nat.add_mul] + have hdPow' : + ((((higherUnitToFirst F (n + 1) + (Nat.succ_le_succ (Nat.zero_le n)) d) ^ q : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1) := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.antitone + F.toCompleteDVF hlevel (by + simpa [q] using hdPow) + have hpowQuot : + principalUnitSuccQuotMk F.toCompleteDVF m + (principalUnitFrobeniusAtLevel F n hn s x) = + principalUnitSuccQuotMk F.toCompleteDVF m + (principalUnitFrobeniusAtLevel F n hn s y) := by + apply (principalUnitSuccQuotMk_eq_iff_div_mem F.toCompleteDVF m _ _).2 + change + (((principalUnitFrobeniusAtLevel F n hn s x / + principalUnitFrobeniusAtLevel F n hn s y : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) m) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1) + simpa [principalUnitFrobeniusAtLevel, higherUnitToFirst, d, q, m, + div_pow] using hdPow' + have hleadEq : + principalUnitLeadingCoefficientAddHom F hpi m hm + (Additive.ofMul (principalUnitFrobeniusAtLevel F n hn s x)) = + principalUnitLeadingCoefficientAddHom F hpi m hm + (Additive.ofMul (principalUnitFrobeniusAtLevel F n hn s y)) := by + exact congrArg + (fun z : principalUnitSuccQuot F.toCompleteDVF m => + (principalUnitSuccQuotAddEquivResidueOfUniformizer + F.toCompleteDVF hpi m hm) (Additive.ofMul z)) hpowQuot + rw [hleadEq, principalUnitFrobeniusAtLevel_oneAddUniformizerPow, + principalUnitLeadingCoefficientAddHom_oneAddUniformizerPow, map_pow] + change F.residueMap r ^ q = lead ^ q + rw [show F.residueMap r = lead from + residueMap_residueTeichmullerLift F.toCompleteDVF lead] + +/-- +Establishes the identity `principalUnitLeadingCoefficientAddHom F hpi r hr (Additive.ofMul +(iwasawaSeedAtLevel F hpi r hr i)) = iwasawaResidueBasis F i`. +-/ +@[simp] theorem principalUnitLeadingCoefficientAddHom_iwasawaSeed + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (r : ℕ) (hr : 1 ≤ r) (i : Fin (iwasawaResidueRank F)) : + principalUnitLeadingCoefficientAddHom F hpi r hr + (Additive.ofMul (iwasawaSeedAtLevel F hpi r hr i)) = + iwasawaResidueBasis F i := + principalUnitSuccQuotAddEquivResidue_iwasawaSeed F hpi r hr i + +/-- The leading coefficient of one p-adically powered seed only depends on +the exponent modulo `p`. -/ +theorem principalUnitLeadingCoefficientAddHom_padicSmul_iwasawaSeed + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (r : ℕ) (hr : 1 ≤ r) + (a : ℤ_[F.residueCharacteristic]) + (i : Fin (iwasawaResidueRank F)) : + principalUnitLeadingCoefficientAddHom F hpi r hr + (Additive.ofMul + (principalUnitPadicSmulAtLevel F r hr a + (iwasawaSeed F hpi r hr i) + (iwasawaSeedAtLevel F hpi r hr i).property)) = + PadicInt.toZMod a • + iwasawaResidueBasis F i := by + let k : ℕ := (PadicInt.toZMod a).val + let xa := principalUnitPadicSmulAtLevel F r hr a + (iwasawaSeed F hpi r hr i) + (iwasawaSeedAtLevel F hpi r hr i).property + let xk := principalUnitPadicSmulAtLevel F r hr + (k : ℤ_[F.residueCharacteristic]) + (iwasawaSeed F hpi r hr i) + (iwasawaSeedAtLevel F hpi r hr i).property + have hquot : + principalUnitSuccQuotMk F.toCompleteDVF r xa = + principalUnitSuccQuotMk F.toCompleteDVF r xk := by + simpa [xa, xk, k] using + principalUnitSuccQuotMk_padicSmulAtLevel_eq_toZMod_val + F r hr a (iwasawaSeed F hpi r hr i) + (iwasawaSeedAtLevel F hpi r hr i).property + have hxk : xk = (iwasawaSeedAtLevel F hpi r hr i) ^ k := by + apply Subtype.ext + exact congrArg + (fun z : ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1 => (z : F.valuationSubringˣ)) + (principalUnitPadic_nsmul_eq_pow + F k (iwasawaSeed F hpi r hr i)) + change + (principalUnitSuccQuotAddEquivResidueOfUniformizer + F.toCompleteDVF hpi r hr) + (Additive.ofMul (principalUnitSuccQuotMk F.toCompleteDVF r xa)) = _ + rw [hquot, hxk, map_pow] + change + (principalUnitSuccQuotAddEquivResidueOfUniformizer + F.toCompleteDVF hpi r hr) + (k • Additive.ofMul + (principalUnitSuccQuotMk F.toCompleteDVF r + (iwasawaSeedAtLevel F hpi r hr i))) = _ + rw [map_nsmul, + principalUnitSuccQuotAddEquivResidue_iwasawaSeed] + calc + k • iwasawaResidueBasis F i = + (k : ZMod F.residueCharacteristic) • iwasawaResidueBasis F i := + (Nat.cast_smul_eq_nsmul + (R := ZMod F.residueCharacteristic) k + (iwasawaResidueBasis F i)).symm + _ = PadicInt.toZMod a • iwasawaResidueBasis F i := by + rw [show (k : ZMod F.residueCharacteristic) = PadicInt.toZMod a by + exact ZMod.natCast_zmod_val (PadicInt.toZMod a)] + +/-- The Iwasawa homomorphism `g_n : Z_p^f -> U^1`. Its range is shown +below to lie in `U^n`. In additive notation the Iwasawa product is a +finite sum of p-adic scalar multiples of the seed units. -/ +noncomputable def iwasawaGn + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) : + (Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) →ₗ[ℤ_[F.residueCharacteristic]] + Additive (((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) := + Fintype.linearCombination ℤ_[F.residueCharacteristic] + (fun i => Additive.ofMul (iwasawaSeed F hpi n hn i)) + +/-- +The defining evaluation formula for `iwasawaGn` is `iwasawaGn F hpi n hn a = ∑ i, a i • +Additive.ofMul (iwasawaSeed F hpi n hn i)`. +-/ +@[simp] theorem iwasawaGn_apply + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) + (a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) : + iwasawaGn F hpi n hn a = + ∑ i, a i • Additive.ofMul (iwasawaSeed F hpi n hn i) := + Fintype.linearCombination_apply + ℤ_[F.residueCharacteristic] + (fun i => Additive.ofMul (iwasawaSeed F hpi n hn i)) a + +/-- Every value of `g_n` belongs to `U^n`, as asserted by its codomain in +the canonical construction. -/ +theorem iwasawaGn_mem_higher + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) + (a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) : + ((Additive.toMul (iwasawaGn F hpi n hn a) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n := by + classical + rw [iwasawaGn_apply] + induction (Finset.univ : Finset (Fin (iwasawaResidueRank F))) + using Finset.induction_on with + | empty => simp + | @insert i s hi ih => + rw [Finset.sum_insert hi] + change + ((Additive.toMul + (a i • Additive.ofMul (iwasawaSeed F hpi n hn i)) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) * + ((Additive.toMul + (∑ j ∈ s, a j • Additive.ofMul (iwasawaSeed F hpi n hn j)) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n + apply (((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n).mul_mem + · exact + classFieldPrincipalUnitPadic_smul_mem_higher + F hn (a i) (iwasawaSeed F hpi n hn i) + (iwasawaSeedAtLevel F hpi n hn i).property + · exact ih + +/-- `g_n(a)`, now with its proved membership in `U^n` built into the type. -/ +noncomputable def iwasawaGnAtLevel + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) + (a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n := + ⟨(Additive.toMul (iwasawaGn F hpi n hn a) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1), + iwasawaGn_mem_higher F hpi n hn a⟩ + +/-- +Establishes the identity `Additive.ofMul (iwasawaGnAtLevel F hpi n hn a) = ∑ i, Additive.ofMul +(principalUnitPadicSmulAtLevel F n hn (a i) (iwasawaSeed F hpi n hn i) (iwasawaSeedAtLevel F hpi n +hn i).property)`. +-/ +theorem additive_iwasawaGnAtLevel_eq_sum + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) + (a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) : + Additive.ofMul (iwasawaGnAtLevel F hpi n hn a) = + ∑ i, Additive.ofMul + (principalUnitPadicSmulAtLevel F n hn (a i) + (iwasawaSeed F hpi n hn i) + (iwasawaSeedAtLevel F hpi n hn i).property) := by + apply Additive.toMul.injective + apply Subtype.ext + change + ((Additive.toMul (iwasawaGn F hpi n hn a) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) = + ((Additive.toMul + (∑ i, Additive.ofMul + (principalUnitPadicSmulAtLevel F n hn (a i) + (iwasawaSeed F hpi n hn i) + (iwasawaSeedAtLevel F hpi n hn i).property)) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n) : F.valuationSubringˣ) + rw [iwasawaGn_apply] + have hsum : ∀ s : Finset (Fin (iwasawaResidueRank F)), + ((Additive.toMul + (∑ i ∈ s, a i • Additive.ofMul (iwasawaSeed F hpi n hn i)) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) = + ((Additive.toMul + (∑ i ∈ s, Additive.ofMul + (principalUnitPadicSmulAtLevel F n hn (a i) + (iwasawaSeed F hpi n hn i) + (iwasawaSeedAtLevel F hpi n hn i).property)) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n) : F.valuationSubringˣ) := by + intro s + induction s using Finset.induction_on with + | empty => rfl + | @insert i s hi ih => + rw [Finset.sum_insert hi, Finset.sum_insert hi] + change + ((Additive.toMul + (a i • Additive.ofMul (iwasawaSeed F hpi n hn i)) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) * _ = + ((principalUnitPadicSmulAtLevel F n hn (a i) + (iwasawaSeed F hpi n hn i) + (iwasawaSeedAtLevel F hpi n hn i).property : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n) : F.valuationSubringˣ) * _ + have hfirst : + ((Additive.toMul + (a i • Additive.ofMul (iwasawaSeed F hpi n hn i)) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) = + ((principalUnitPadicSmulAtLevel F n hn (a i) + (iwasawaSeed F hpi n hn i) + (iwasawaSeedAtLevel F hpi n hn i).property : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n) : F.valuationSubringˣ) := rfl + rw [hfirst, ih] + simpa only [Finset.sum_filter, Finset.mem_univ, ↓reduceIte] using + hsum (Finset.univ : Finset (Fin (iwasawaResidueRank F))) + +/-- The exact leading coefficient of `g_n(a)`: it is the residue-basis +linear combination of the reductions of the p-adic coordinates. -/ +theorem principalUnitLeadingCoefficientAddHom_iwasawaGnAtLevel + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) + (a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) : + principalUnitLeadingCoefficientAddHom F hpi n hn + (Additive.ofMul (iwasawaGnAtLevel F hpi n hn a)) = + ∑ i, + PadicInt.toZMod (a i) • + iwasawaResidueBasis F i := by + rw [additive_iwasawaGnAtLevel_eq_sum, map_sum] + apply Finset.sum_congr rfl + intro i _hi + exact principalUnitLeadingCoefficientAddHom_padicSmul_iwasawaSeed + F hpi n hn (a i) i + +/-- Multiplying every coordinate by the ordinary scalar `p^s` turns `g_n` +into the ordinary `p^s`-th power of `g_n(a)`. -/ +theorem iwasawaGn_residueCharacteristic_pow_smul_eq_pow + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) (s : ℕ) + (a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) : + Additive.toMul + (iwasawaGn F hpi n hn + ((F.residueCharacteristic ^ s : + ℤ_[F.residueCharacteristic]) • a)) = + (Additive.toMul (iwasawaGn F hpi n hn a)) ^ + (F.residueCharacteristic ^ s) := by + have hlinear := (iwasawaGn F hpi n hn).map_smul' + (F.residueCharacteristic ^ s : ℤ_[F.residueCharacteristic]) a + change Additive.toMul + ((iwasawaGn F hpi n hn).toFun + ((F.residueCharacteristic ^ s : ℤ_[F.residueCharacteristic]) • a)) = _ + rw [hlinear] + change Additive.toMul + ((F.residueCharacteristic ^ s : ℤ_[F.residueCharacteristic]) • + Additive.ofMul (Additive.toMul (iwasawaGn F hpi n hn a))) = _ + simpa only [Nat.cast_pow] using + principalUnitPadic_nsmul_eq_pow F + (F.residueCharacteristic ^ s) + (Additive.toMul (iwasawaGn F hpi n hn a)) + +/-- The canonical `g_n(p^s a)`, with the exact depth `m = n*p^s` built into +its type. -/ +noncomputable def iwasawaGnScaledAtLevel + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) (s : ℕ) + (a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) : + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) + (n * F.residueCharacteristic ^ s) := + ⟨(Additive.toMul + (iwasawaGn F hpi n hn + ((F.residueCharacteristic ^ s : + ℤ_[F.residueCharacteristic]) • a)) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1), by + rw [iwasawaGn_residueCharacteristic_pow_smul_eq_pow] + exact pow_residueCharacteristic_pow_mem_higher_mul F s + (Additive.toMul (iwasawaGn F hpi n hn a)) + (iwasawaGn_mem_higher F hpi n hn a)⟩ + +/-- +Establishes the identity `iwasawaGnScaledAtLevel F hpi n hn s a = principalUnitFrobeniusAtLevel F +n hn s (iwasawaGnAtLevel F hpi n hn a)`. +-/ +theorem iwasawaGnScaledAtLevel_eq_frobenius + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) (s : ℕ) + (a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) : + iwasawaGnScaledAtLevel F hpi n hn s a = + principalUnitFrobeniusAtLevel F n hn s + (iwasawaGnAtLevel F hpi n hn a) := by + apply Subtype.ext + exact congrArg + (fun z : ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1 => (z : F.valuationSubringˣ)) + (iwasawaGn_residueCharacteristic_pow_smul_eq_pow F hpi n hn s a) + +/-- The coefficient congruence: +the leading coefficient of `g_n(p^s a)` is the `p^s`-th power of the +residue-basis combination represented by `a`. -/ +theorem principalUnitLeadingCoefficientAddHom_iwasawaGnScaledAtLevel + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) (s : ℕ) + (a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) : + let m := n * F.residueCharacteristic ^ s + let hm : 1 ≤ m := one_le_mul_residueCharacteristic_pow F hn s + principalUnitLeadingCoefficientAddHom F hpi m hm + (Additive.ofMul (iwasawaGnScaledAtLevel F hpi n hn s a)) = + (∑ i, PadicInt.toZMod (a i) • iwasawaResidueBasis F i) ^ + (F.residueCharacteristic ^ s) := by + dsimp only + rw [iwasawaGnScaledAtLevel_eq_frobenius, + principalUnitLeadingCoefficientAddHom_frobenius, + principalUnitLeadingCoefficientAddHom_iwasawaGnAtLevel] + +/-- The first coefficient congruence, for `m = n*p^s`: +`U^m = g_n(p^s Z_p^f) U^(m+1)`. -/ +theorem exists_iwasawaGnScaled_mul_mem_succ + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) (s : ℕ) + (x : ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) + (n * F.residueCharacteristic ^ s)) : + ∃ a : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic], + (((x / iwasawaGnScaledAtLevel F hpi n hn s a : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) + (n * F.residueCharacteristic ^ s)) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) + (n * F.residueCharacteristic ^ s + 1) := by + let m : ℕ := n * F.residueCharacteristic ^ s + have hm : 1 ≤ m := one_le_mul_residueCharacteristic_pow F hn s + let lead : F.residueField := + principalUnitLeadingCoefficientAddHom F hpi m hm (Additive.ofMul x) + let beta : F.residueField := + ((frobeniusEquiv F.residueField F.residueCharacteristic).symm^[s]) lead + have hbeta : beta ^ (F.residueCharacteristic ^ s) = lead := by + exact iterate_frobeniusEquiv_symm_pow_p_pow + F.residueField F.residueCharacteristic lead s + let c : Fin (iwasawaResidueRank F) → ZMod F.residueCharacteristic := + (iwasawaResidueBasis F).equivFun beta + let a : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic] := + fun i => ((c i).val : ℤ_[F.residueCharacteristic]) + refine ⟨a, ?_⟩ + have hcoord : + (∑ i, PadicInt.toZMod (a i) • iwasawaResidueBasis F i) = beta := by + have hcmod : ∀ i, PadicInt.toZMod (a i) = c i := by + intro i + change PadicInt.toZMod + ((c i).val : ℤ_[F.residueCharacteristic]) = c i + rw [map_natCast] + exact ZMod.natCast_zmod_val (c i) + simp_rw [hcmod] + simp [c, beta] + have hscaledLead : + principalUnitLeadingCoefficientAddHom F hpi m hm + (Additive.ofMul (iwasawaGnScaledAtLevel F hpi n hn s a)) = + lead := by + rw [principalUnitLeadingCoefficientAddHom_iwasawaGnScaledAtLevel, + hcoord, hbeta] + change (x / iwasawaGnScaledAtLevel F hpi n hn s a) ∈ + (((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1)).subgroupOf + (((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) m) + apply (principalUnitSuccQuotMk_eq_one_iff F.toCompleteDVF m _).1 + rw [map_div] + have hquot : + principalUnitSuccQuotMk F.toCompleteDVF m x = + principalUnitSuccQuotMk F.toCompleteDVF m + (iwasawaGnScaledAtLevel F hpi n hn s a) := by + apply (principalUnitSuccQuotAddEquivResidueOfUniformizer + F.toCompleteDVF hpi m hm).injective + change + principalUnitLeadingCoefficientAddHom F hpi m hm (Additive.ofMul x) = + principalUnitLeadingCoefficientAddHom F hpi m hm + (Additive.ofMul (iwasawaGnScaledAtLevel F hpi n hn s a)) + exact hscaledLead.symm + rw [hquot] + exact div_self' + (principalUnitSuccQuotMk F.toCompleteDVF m + (iwasawaGnScaledAtLevel F hpi n hn s a)) + +/-- Positive form of formula (2): `g_n(p^s a)` drops into `U^(m+1)` +exactly when every coordinate of `a` is divisible by `p`. -/ +theorem iwasawaGnScaled_mem_succ_iff_exists_residueCharacteristic_smul + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) (s : ℕ) + (a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) : + (((iwasawaGnScaledAtLevel F hpi n hn s a : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) + (n * F.residueCharacteristic ^ s)) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) + (n * F.residueCharacteristic ^ s + 1) ↔ + ∃ b : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic], + a = (F.residueCharacteristic : ℤ_[F.residueCharacteristic]) • b := by + let m : ℕ := n * F.residueCharacteristic ^ s + have hm : 1 ≤ m := one_le_mul_residueCharacteristic_pow F hn s + let omega : F.residueField := + ∑ i, PadicInt.toZMod (a i) • iwasawaResidueBasis F i + have hlead : + principalUnitLeadingCoefficientAddHom F hpi m hm + (Additive.ofMul (iwasawaGnScaledAtLevel F hpi n hn s a)) = + omega ^ (F.residueCharacteristic ^ s) := by + simpa [m, omega] using + principalUnitLeadingCoefficientAddHom_iwasawaGnScaledAtLevel + F hpi n hn s a + have hq0 : F.residueCharacteristic ^ s ≠ 0 := + pow_ne_zero s F.residueCharacteristic_prime.ne_zero + constructor + · intro hz + have hzero : + principalUnitLeadingCoefficientAddHom F hpi m hm + (Additive.ofMul (iwasawaGnScaledAtLevel F hpi n hn s a)) = 0 := + (principalUnitLeadingCoefficientAddHom_eq_zero_iff_mem_succ + F hpi m hm (iwasawaGnScaledAtLevel F hpi n hn s a)).2 hz + rw [hlead] at hzero + have homega : omega = 0 := (pow_eq_zero_iff hq0).1 hzero + have hall : ∀ i, PadicInt.toZMod (a i) = 0 := + (iwasawa_residue_combination_eq_zero_iff F a).1 (by + simpa [omega] using homega) + exact (exists_residueCharacteristic_smul_eq_iff_toZMod_eq_zero F a).2 hall + · intro ha + have hall : ∀ i, PadicInt.toZMod (a i) = 0 := + (exists_residueCharacteristic_smul_eq_iff_toZMod_eq_zero F a).1 ha + have homega : omega = 0 := by + apply (iwasawa_residue_combination_eq_zero_iff F a).2 + exact hall + have hzero : + principalUnitLeadingCoefficientAddHom F hpi m hm + (Additive.ofMul (iwasawaGnScaledAtLevel F hpi n hn s a)) = 0 := by + rw [hlead, homega] + exact zero_pow hq0 + exact (principalUnitLeadingCoefficientAddHom_eq_zero_iff_mem_succ + F hpi m hm (iwasawaGnScaledAtLevel F hpi n hn s a)).1 hzero + +/-- The second coefficient congruence. -/ +theorem iwasawa_formula_two + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) (s : ℕ) + (a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) : + (¬ ∃ b : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic], + a = (F.residueCharacteristic : ℤ_[F.residueCharacteristic]) • b) ↔ + ¬ (((iwasawaGnScaledAtLevel F hpi n hn s a : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) + (n * F.residueCharacteristic ^ s)) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) + (n * F.residueCharacteristic ^ s + 1) := by + exact (not_congr + (iwasawaGnScaled_mem_succ_iff_exists_residueCharacteristic_smul + F hpi n hn s a)).symm + +/-! ## Algebraic injectivity of each Iwasawa factor -/ + +/-- A p-adic integer divisible by every power of `p` is zero. -/ +theorem padicInt_eq_zero_of_forall_exists_eq_pow_mul + (F : LocalField.{u, v} K) (a : ℤ_[F.residueCharacteristic]) + (h : ∀ r : ℕ, ∃ b : ℤ_[F.residueCharacteristic], + a = (F.residueCharacteristic : ℤ_[F.residueCharacteristic]) ^ r * b) : + a = 0 := by + by_contra ha + have hnorm : 0 < ‖a‖ := (norm_pos_iff.mpr ha) + obtain ⟨r, hr⟩ := PadicInt.exists_pow_neg_lt + (p := F.residueCharacteristic) hnorm + obtain ⟨b, hb⟩ := h r + have hle : ‖a‖ ≤ + (F.residueCharacteristic : ℝ) ^ (-(r : ℤ)) := by + calc + ‖a‖ = ‖(F.residueCharacteristic : + ℤ_[F.residueCharacteristic]) ^ r‖ * ‖b‖ := by + rw [hb, norm_mul] + _ ≤ ‖(F.residueCharacteristic : + ℤ_[F.residueCharacteristic]) ^ r‖ * 1 := by + exact mul_le_mul_of_nonneg_left (PadicInt.norm_le_one b) + (norm_nonneg _) + _ = (F.residueCharacteristic : ℝ) ^ (-(r : ℤ)) := by + rw [PadicInt.norm_p_pow, mul_one] + exact (not_lt_of_ge hle) hr + +/-- Equal-characteristic first principal units have no `p`-torsion. -/ +theorem principalUnit_residueCharacteristic_smul_eq_zero + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + (x : Additive + (((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1)) + (hx : (F.residueCharacteristic : + ℤ_[F.residueCharacteristic]) • x = 0) : + x = 0 := by + let u : ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1 := Additive.toMul x + have hpowAdd : Additive.ofMul (u ^ F.residueCharacteristic) = 0 := by + change (F.residueCharacteristic : + ℤ_[F.residueCharacteristic]) • Additive.ofMul u = 0 at hx + rw [principalUnitPadic_natCast_smul] at hx + exact hx + have hpow : u ^ F.residueCharacteristic = 1 := + Additive.ofMul.injective hpowAdd + let z : K := (((u : F.valuationSubringˣ) : F.valuationSubring) : K) + have hpowK : z ^ F.residueCharacteristic = 1 := by + simpa [z] using congrArg + (fun w : ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1 => + ((((w : F.valuationSubringˣ) : F.valuationSubring) : K))) hpow + have hdiffpow : (z - 1) ^ F.residueCharacteristic = 0 := by + have hf := sub_pow_char_pow z 1 1 + simpa [hpowK] using hf + have hdiff : z - 1 = 0 := + (pow_eq_zero_iff F.residueCharacteristic_prime.ne_zero).1 hdiffpow + have hz : z = 1 := sub_eq_zero.mp hdiff + apply Additive.toMul.injective + apply Subtype.ext + apply Units.ext + apply Subtype.ext + simpa [u, z] using hz + +/-- If `g_n(a)=1`, then all coordinates of `a` are divisible by every +power of `p`. -/ +theorem forall_exists_iwasawaGn_eq_pow_smul_of_eq_zero + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) + (a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) + (ha : iwasawaGn F hpi n hn a = 0) : + ∀ r : ℕ, ∃ b : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic], + a = (F.residueCharacteristic ^ r : + ℤ_[F.residueCharacteristic]) • b := by + have H : ∀ r : ℕ, ∃ b : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic], + a = (F.residueCharacteristic ^ r : + ℤ_[F.residueCharacteristic]) • b ∧ + iwasawaGn F hpi n hn b = 0 := by + intro r + induction r with + | zero => + exact ⟨a, by simp [ha]⟩ + | succ r ih => + obtain ⟨b, hab, hb⟩ := ih + have hscaledMem : + (((iwasawaGnScaledAtLevel F hpi n hn 0 b : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) + (n * F.residueCharacteristic ^ 0)) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) + (n * F.residueCharacteristic ^ 0 + 1) := by + simp [iwasawaGnScaledAtLevel, hb] + obtain ⟨c, hbc⟩ := + (iwasawaGnScaled_mem_succ_iff_exists_residueCharacteristic_smul + F hpi n hn 0 b).1 hscaledMem + have hgcScalar : + (F.residueCharacteristic : ℤ_[F.residueCharacteristic]) • + iwasawaGn F hpi n hn c = 0 := by + rw [← map_smul, ← hbc, hb] + have hgc : iwasawaGn F hpi n hn c = 0 := + principalUnit_residueCharacteristic_smul_eq_zero F + (iwasawaGn F hpi n hn c) hgcScalar + refine ⟨c, ?_, hgc⟩ + calc + a = (F.residueCharacteristic ^ r : + ℤ_[F.residueCharacteristic]) • b := hab + _ = (F.residueCharacteristic ^ r : + ℤ_[F.residueCharacteristic]) • + ((F.residueCharacteristic : + ℤ_[F.residueCharacteristic]) • c) := by rw [hbc] + _ = (F.residueCharacteristic ^ (r + 1) : + ℤ_[F.residueCharacteristic]) • c := by + rw [← mul_smul, pow_succ] + intro r + obtain ⟨b, hb, _⟩ := H r + exact ⟨b, hb⟩ + +/-- Every individual Iwasawa map `g_n` is injective in equal +characteristic. -/ +theorem iwasawaGn_injective + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) : + Function.Injective (iwasawaGn F hpi n hn) := by + intro a b hab + have hzero : iwasawaGn F hpi n hn (a - b) = 0 := by + rw [map_sub, hab] + exact sub_self _ + have habzero : a - b = 0 := by + apply funext + intro i + apply padicInt_eq_zero_of_forall_exists_eq_pow_mul F ((a - b) i) + intro r + obtain ⟨c, hc⟩ := + forall_exists_iwasawaGn_eq_pow_smul_of_eq_zero + F hpi n hn (a - b) hzero r + refine ⟨c i, ?_⟩ + have hi := congrFun hc i + simpa [Pi.smul_apply] using hi + exact sub_eq_zero.mp habzero + +/-- A vector of p-adic coefficients is primitive when it is not divisible +coordinatewise by the residue characteristic. -/ +def IwasawaPrimitive + (F : LocalField.{u, v} K) + (a : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic]) : Prop := + ¬ ∃ b : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic], + a = (F.residueCharacteristic : + ℤ_[F.residueCharacteristic]) • b + +/-- Every nonzero p-adic coefficient block has a unique-depth form +`p^s b` with `b` primitive. This is the coefficient valuation used in +Iwasawa's minimal-depth argument. -/ +theorem exists_pow_smul_iwasawaPrimitive_of_ne_zero + (F : LocalField.{u, v} K) + (a : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic]) (ha : a ≠ 0) : + ∃ s : ℕ, ∃ b : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic], + a = (F.residueCharacteristic ^ s : + ℤ_[F.residueCharacteristic]) • b ∧ + IwasawaPrimitive F b := by + classical + have hex : ∃ r : ℕ, ¬ ∃ c : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic], + a = (F.residueCharacteristic ^ r : + ℤ_[F.residueCharacteristic]) • c := by + by_contra h + push Not at h + apply ha + funext i + apply padicInt_eq_zero_of_forall_exists_eq_pow_mul F (a i) + intro r + obtain ⟨c, hc⟩ := h r + refine ⟨c i, ?_⟩ + simpa [Pi.smul_apply] using congrFun hc i + let r : ℕ := Nat.find hex + have hrSpec : ¬ ∃ c : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic], + a = (F.residueCharacteristic ^ r : + ℤ_[F.residueCharacteristic]) • c := by + simpa [r] using Nat.find_spec hex + have hr0 : r ≠ 0 := by + intro hr + apply hrSpec + refine ⟨a, ?_⟩ + simp [hr] + let s : ℕ := r - 1 + have hsr : s + 1 = r := by + omega + have hslt : s < r := by omega + have hsNot : ¬ (¬ ∃ c : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic], + a = (F.residueCharacteristic ^ s : + ℤ_[F.residueCharacteristic]) • c) := by + exact Nat.find_min hex (by simpa [r] using hslt) + obtain ⟨b, hab⟩ := not_not.mp hsNot + refine ⟨s, b, hab, ?_⟩ + intro hdiv + obtain ⟨c, hbc⟩ := hdiv + apply hrSpec + refine ⟨c, ?_⟩ + calc + a = (F.residueCharacteristic ^ s : + ℤ_[F.residueCharacteristic]) • b := hab + _ = (F.residueCharacteristic ^ s : + ℤ_[F.residueCharacteristic]) • + ((F.residueCharacteristic : + ℤ_[F.residueCharacteristic]) • c) := by rw [hbc] + _ = (F.residueCharacteristic ^ (s + 1) : + ℤ_[F.residueCharacteristic]) • c := by + rw [← mul_smul, pow_succ] + _ = (F.residueCharacteristic ^ r : + ℤ_[F.residueCharacteristic]) • c := by rw [hsr] + +/-- The first coefficient congruence in the base case `s = 0`: +`U^n = g_n(Z_p^f) U^(n+1)`. -/ +theorem exists_iwasawaGn_mul_mem_succ + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) + (x : ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n) : + ∃ a : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic], + (((x / iwasawaGnAtLevel F hpi n hn a : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (n + 1) := by + let lead : F.residueField := + principalUnitLeadingCoefficientAddHom F hpi n hn (Additive.ofMul x) + let c : Fin (iwasawaResidueRank F) → ZMod F.residueCharacteristic := + (iwasawaResidueBasis F).equivFun lead + let a : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic] := + fun i => ((c i).val : ℤ_[F.residueCharacteristic]) + refine ⟨a, ?_⟩ + have hlead : + principalUnitLeadingCoefficientAddHom F hpi n hn + (Additive.ofMul (iwasawaGnAtLevel F hpi n hn a)) = lead := by + rw [principalUnitLeadingCoefficientAddHom_iwasawaGnAtLevel] + change + (∑ i, PadicInt.toZMod ((c i).val : + ℤ_[F.residueCharacteristic]) • iwasawaResidueBasis F i) = lead + have hcmod : ∀ i, + PadicInt.toZMod ((c i).val : ℤ_[F.residueCharacteristic]) = c i := by + intro i + rw [map_natCast] + exact ZMod.natCast_zmod_val (c i) + simp_rw [hcmod] + simp [c, lead] + change (x / iwasawaGnAtLevel F hpi n hn a) ∈ + (((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (n + 1)).subgroupOf + (((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n) + apply (principalUnitSuccQuotMk_eq_one_iff F.toCompleteDVF n _).1 + rw [map_div] + have hquot : + principalUnitSuccQuotMk F.toCompleteDVF n x = + principalUnitSuccQuotMk F.toCompleteDVF n + (iwasawaGnAtLevel F hpi n hn a) := by + apply + (principalUnitSuccQuotAddEquivResidueOfUniformizer + F.toCompleteDVF hpi n hn).injective + change + principalUnitLeadingCoefficientAddHom F hpi n hn + (Additive.ofMul x) = + principalUnitLeadingCoefficientAddHom F hpi n hn + (Additive.ofMul (iwasawaGnAtLevel F hpi n hn a)) + exact hlead.symm + rw [hquot] + exact div_self' + (principalUnitSuccQuotMk F.toCompleteDVF n + (iwasawaGnAtLevel F hpi n hn a)) + +end higherPrincipalUnitGroup +end CompleteDVF +end LocalFieldTheory.DiscreteValuationField + +noncomputable +section + +open scoped BigOperators + +open ValuationTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField + +namespace LocalFieldTheory.DiscreteValuationField +namespace CompleteDVF +namespace higherPrincipalUnitGroup + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup +open Internal + +variable {K : Type u} [Field K] + +/-! ## The convergent product, constructed through finite quotients -/ + +/-- The product of one copy of `Z_p^f` for every positive prime-to-`p` +degree. -/ +abbrev iwasawaDomain (F : LocalField.{u, v} K) := + IwasawaIndex F.residueCharacteristic (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic] + +/-- The p-adic coefficient vector belonging to one prime-to-`p` degree. -/ +def iwasawaBlock + (F : LocalField.{u, v} K) (a : iwasawaDomain F) + (d : IwasawaDegree F.residueCharacteristic) : + Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic] := + fun i => a (d, i) + +/-- A depth occurring in a nonzero Iwasawa coefficient family. -/ +def IwasawaDepthWitness + (F : LocalField.{u, v} K) (a : iwasawaDomain F) (m : ℕ) : Prop := + ∃ d : IwasawaDegree F.residueCharacteristic, + ∃ s : ℕ, ∃ b : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic], + iwasawaBlock F a d = + (F.residueCharacteristic ^ s : + ℤ_[F.residueCharacteristic]) • b ∧ + IwasawaPrimitive F b ∧ + m = d.1 * F.residueCharacteristic ^ s + +/-- A nonzero coefficient family has a least depth `n*p^s`. -/ +theorem exists_minimal_iwasawaDepthWitness_of_ne_zero + (F : LocalField.{u, v} K) (a : iwasawaDomain F) (ha : a ≠ 0) : + ∃ m : ℕ, ∃ d : IwasawaDegree F.residueCharacteristic, + ∃ s : ℕ, ∃ b : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic], + iwasawaBlock F a d = + (F.residueCharacteristic ^ s : + ℤ_[F.residueCharacteristic]) • b ∧ + IwasawaPrimitive F b ∧ + m = d.1 * F.residueCharacteristic ^ s ∧ + ∀ e : IwasawaDegree F.residueCharacteristic, + ∀ t : ℕ, ∀ c : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic], + iwasawaBlock F a e = + (F.residueCharacteristic ^ t : + ℤ_[F.residueCharacteristic]) • c → + IwasawaPrimitive F c → + m ≤ e.1 * F.residueCharacteristic ^ t := by + classical + have hnonzeroBlock : ∃ d : IwasawaDegree F.residueCharacteristic, + iwasawaBlock F a d ≠ 0 := by + by_contra h + push Not at h + apply ha + funext j + exact congrFun (h j.1) j.2 + have hex : ∃ m : ℕ, IwasawaDepthWitness F a m := by + obtain ⟨d, hd⟩ := hnonzeroBlock + obtain ⟨s, b, hab, hb⟩ := + exists_pow_smul_iwasawaPrimitive_of_ne_zero F + (iwasawaBlock F a d) hd + exact ⟨d.1 * F.residueCharacteristic ^ s, + d, s, b, hab, hb, rfl⟩ + let m : ℕ := Nat.find hex + obtain ⟨d, s, b, hab, hb, hm⟩ := Nat.find_spec hex + refine ⟨m, d, s, b, hab, hb, hm, ?_⟩ + intro e t c hec hc + apply Nat.find_min' hex + exact ⟨e, t, c, hec, hc, rfl⟩ + +/-- A vector supported in one prime-to-`p` degree. -/ +noncomputable def iwasawaSingleBlock + (F : LocalField.{u, v} K) + (d : IwasawaDegree F.residueCharacteristic) + (b : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) : + iwasawaDomain F := by + classical + exact fun j => if j.1 = d then b j.2 else 0 + +/-- Establishes the identity `iwasawaSingleBlock F d b (d, i) = b i`. -/ +@[simp] theorem iwasawaSingleBlock_apply_same + (F : LocalField.{u, v} K) + (d : IwasawaDegree F.residueCharacteristic) + (b : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) + (i : Fin (iwasawaResidueRank F)) : + iwasawaSingleBlock F d b (d, i) = b i := by + classical + simp [iwasawaSingleBlock] + +/-- Establishes the identity `iwasawaSingleBlock F d b (e, i) = 0`. -/ +@[simp] theorem iwasawaSingleBlock_apply_ne + (F : LocalField.{u, v} K) + {d e : IwasawaDegree F.residueCharacteristic} (hde : e ≠ d) + (b : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) + (i : Fin (iwasawaResidueRank F)) : + iwasawaSingleBlock F d b (e, i) = 0 := by + classical + simp [iwasawaSingleBlock, hde] + +/-- Remove the largest residue-characteristic power from a positive depth. -/ +def iwasawaPrimeToPPart (F : LocalField.{u, v} K) (m : ℕ) : ℕ := + m / F.residueCharacteristic ^ padicValNat F.residueCharacteristic m + +/-- Every positive depth has the canonical form `m = n*p^s`, with `n` +positive and prime to `p`. -/ +theorem iwasawaPrimeToPPart_spec + (F : LocalField.{u, v} K) {m : ℕ} (hm : 1 ≤ m) : + 1 ≤ iwasawaPrimeToPPart F m ∧ + Nat.Coprime (iwasawaPrimeToPPart F m) F.residueCharacteristic ∧ + iwasawaPrimeToPPart F m * + F.residueCharacteristic ^ padicValNat F.residueCharacteristic m = m := by + let p : ℕ := F.residueCharacteristic + let s : ℕ := padicValNat p m + let n : ℕ := m / p ^ s + have hm0 : m ≠ 0 := Nat.ne_zero_of_lt (lt_of_lt_of_le Nat.zero_lt_one hm) + have hp0 : p ≠ 0 := F.residueCharacteristic_prime.ne_zero + have hpPow0 : p ^ s ≠ 0 := pow_ne_zero s hp0 + have hdiv : p ^ s ∣ m := pow_padicValNat_dvd + have heq : n * p ^ s = m := Nat.div_mul_cancel hdiv + have hnpos : 1 ≤ n := by + have hle : p ^ s ≤ m := Nat.le_of_dvd (lt_of_lt_of_le Nat.zero_lt_one hm) hdiv + exact Nat.div_pos hle (Nat.zero_lt_of_ne_zero hpPow0) + have hnot : ¬ p ∣ n := by + intro hpn + apply pow_succ_padicValNat_not_dvd (p := p) hm0 + obtain ⟨c, hc⟩ := hpn + refine ⟨c, ?_⟩ + calc + m = n * p ^ s := heq.symm + _ = (p * c) * p ^ s := by rw [hc] + _ = p ^ (s + 1) * c := by rw [pow_succ]; ring + have hcop : Nat.Coprime n p := + (F.residueCharacteristic_prime.coprime_iff_not_dvd.mpr hnot).symm + simpa [iwasawaPrimeToPPart, p, s, n] using ⟨hnpos, hcop, heq⟩ + +/-- The depths `n*p^s` attached to distinct prime-to-`p` factors are +distinct. This is the uniqueness assertion used in Iwasawa's injectivity +coefficient-lifting argument. -/ +theorem iwasawaDepth_eq_iff + (F : LocalField.{u, v} K) + (d e : IwasawaDegree F.residueCharacteristic) (s t : ℕ) : + d.1 * F.residueCharacteristic ^ s = + e.1 * F.residueCharacteristic ^ t ↔ + d = e ∧ s = t := by + let p : ℕ := F.residueCharacteristic + have hd0 : d.1 ≠ 0 := + Nat.ne_zero_of_lt (lt_of_lt_of_le Nat.zero_lt_one d.property.1) + have he0 : e.1 ≠ 0 := + Nat.ne_zero_of_lt (lt_of_lt_of_le Nat.zero_lt_one e.property.1) + have hpd : ¬ p ∣ d.1 := + F.residueCharacteristic_prime.coprime_iff_not_dvd.mp d.property.2.symm + have hpe : ¬ p ∣ e.1 := + F.residueCharacteristic_prime.coprime_iff_not_dvd.mp e.property.2.symm + have hvd : padicValNat p (d.1 * p ^ s) = s := by + rw [padicValNat.mul hd0 (pow_ne_zero s + F.residueCharacteristic_prime.ne_zero), + padicValNat.eq_zero_of_not_dvd hpd, padicValNat.prime_pow, zero_add] + have hve : padicValNat p (e.1 * p ^ t) = t := by + rw [padicValNat.mul he0 (pow_ne_zero t + F.residueCharacteristic_prime.ne_zero), + padicValNat.eq_zero_of_not_dvd hpe, padicValNat.prime_pow, zero_add] + constructor + · intro hdepth + have hst : s = t := by + rw [← hvd, ← hve, hdepth] + subst t + have hde : d.1 = e.1 := + Nat.mul_right_cancel + (pow_pos F.residueCharacteristic_prime.pos s) hdepth + exact ⟨Subtype.ext hde, rfl⟩ + · rintro ⟨rfl, rfl⟩ + rfl + +/-- The `n`-th factor in Iwasawa's infinite product. It is `1` when `n` +is zero or is divisible by `p`; this lets finite partial products be indexed +by ordinary ranges without making any choice of an enumeration. -/ +noncomputable def iwasawaDegreeTerm + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (a : iwasawaDomain F) (n : ℕ) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1 := + if hn : 1 ≤ n ∧ Nat.Coprime n F.residueCharacteristic then + Additive.toMul + (iwasawaGn F hpi n hn.1 + (fun i => a (⟨n, hn⟩, i))) + else 1 + +/-- A coefficient block `p^s b` gives exactly the scaled factor occurring +at depth `n*p^s`. -/ +theorem iwasawaDegreeTerm_eq_iwasawaGnScaled + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (a : iwasawaDomain F) + (d : IwasawaDegree F.residueCharacteristic) (s : ℕ) + (b : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) + (hab : iwasawaBlock F a d = + (F.residueCharacteristic ^ s : + ℤ_[F.residueCharacteristic]) • b) : + ((iwasawaDegreeTerm F hpi a d.1 : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) = + ((iwasawaGnScaledAtLevel F hpi d.1 d.property.1 s b : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) + (d.1 * F.residueCharacteristic ^ s)) : F.valuationSubringˣ) := by + classical + rw [iwasawaDegreeTerm] + split_ifs with hvalid + · have he : + (⟨d.1, hvalid⟩ : IwasawaDegree F.residueCharacteristic) = d := + Subtype.ext rfl + have hvec : + (fun i => a (⟨d.1, hvalid⟩, i)) = + (F.residueCharacteristic ^ s : + ℤ_[F.residueCharacteristic]) • b := by + rw [he] + exact hab + rw [hvec] + rfl + · exact (hvalid d.property).elim + +/-- +Establishes the membership statement `((iwasawaDegreeTerm F hpi a n : +((CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ +((CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n`. +-/ +theorem iwasawaDegreeTerm_mem_higher + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (a : iwasawaDomain F) (n : ℕ) : + ((iwasawaDegreeTerm F hpi a n : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : + F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n := by + classical + unfold iwasawaDegreeTerm + split_ifs with hn + · exact iwasawaGn_mem_higher F hpi n hn.1 + (fun i => a (⟨n, hn⟩, i)) + · exact (((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) n).one_mem + +/-- Establishes the identity `iwasawaDegreeTerm F hpi (0 : iwasawaDomain F) n = 1`. -/ +@[simp] theorem iwasawaDegreeTerm_zero + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) : + iwasawaDegreeTerm F hpi (0 : iwasawaDomain F) n = 1 := by + classical + rw [iwasawaDegreeTerm] + split_ifs with hn + · change Additive.toMul + (iwasawaGn F hpi n hn.1 (0 : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic])) = 1 + rw [map_zero] + rfl + · rfl + +/-- +`iwasawaDegreeTerm` satisfies the addition formula `iwasawaDegreeTerm F hpi (a + b) n = +iwasawaDegreeTerm F hpi a n * iwasawaDegreeTerm F hpi b n`. +-/ +theorem iwasawaDegreeTerm_add + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (a b : iwasawaDomain F) (n : ℕ) : + iwasawaDegreeTerm F hpi (a + b) n = + iwasawaDegreeTerm F hpi a n * iwasawaDegreeTerm F hpi b n := by + classical + rw [iwasawaDegreeTerm, iwasawaDegreeTerm, iwasawaDegreeTerm] + split_ifs with hn + · change Additive.toMul + (iwasawaGn F hpi n hn.1 + (fun i => a (⟨n, hn⟩, i) + b (⟨n, hn⟩, i))) = _ + rw [show (fun i => a (⟨n, hn⟩, i) + b (⟨n, hn⟩, i)) = + (fun i => a (⟨n, hn⟩, i)) + + (fun i => b (⟨n, hn⟩, i)) by rfl, + map_add] + rfl + · simp + +/-- The product of the Iwasawa factors of degree at most `r`. -/ +noncomputable def iwasawaPartialProduct + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (a : iwasawaDomain F) (r : ℕ) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1 := + ∏ n ∈ Finset.range (r + 1), iwasawaDegreeTerm F hpi a n + +/-- A single-block domain element contributes precisely its one `g_n` +factor to every sufficiently deep partial product. -/ +theorem iwasawaPartialProduct_singleBlock + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (d : IwasawaDegree F.residueCharacteristic) + (b : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) + {r : ℕ} (hdr : d.1 ≤ r) : + iwasawaPartialProduct F hpi (iwasawaSingleBlock F d b) r = + Additive.toMul (iwasawaGn F hpi d.1 d.property.1 b) := by + classical + rw [iwasawaPartialProduct] + calc + ∏ k ∈ Finset.range (r + 1), + iwasawaDegreeTerm F hpi (iwasawaSingleBlock F d b) k = + iwasawaDegreeTerm F hpi (iwasawaSingleBlock F d b) d.1 := by + apply Finset.prod_eq_single d.1 + · intro k hk hkd + rw [iwasawaDegreeTerm] + split_ifs with hkvalid + · let e : IwasawaDegree F.residueCharacteristic := ⟨k, hkvalid⟩ + have hed : e ≠ d := by + intro heq + exact hkd (congrArg Subtype.val heq) + have hvec : + (fun i => iwasawaSingleBlock F d b (e, i)) = 0 := by + funext i + exact iwasawaSingleBlock_apply_ne F hed b i + rw [hvec, map_zero] + rfl + · rfl + · intro hdnot + exact (hdnot (Finset.mem_range.mpr + (Nat.lt_succ_of_le hdr))).elim + _ = Additive.toMul (iwasawaGn F hpi d.1 d.property.1 b) := by + rw [iwasawaDegreeTerm] + split_ifs with hvalid + · have he : + (⟨d.1, hvalid⟩ : IwasawaDegree F.residueCharacteristic) = d := + Subtype.ext rfl + have hvec : + (fun i => iwasawaSingleBlock F d b + (⟨d.1, hvalid⟩, i)) = b := by + funext i + rw [he] + exact iwasawaSingleBlock_apply_same F d b i + rw [hvec] + · exact (hvalid d.property).elim + +/-- Establishes the identity `iwasawaPartialProduct F hpi (0 : iwasawaDomain F) r = 1`. -/ +@[simp] theorem iwasawaPartialProduct_zero_input + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) (r : ℕ) : + iwasawaPartialProduct F hpi (0 : iwasawaDomain F) r = 1 := by + classical + simp [iwasawaPartialProduct] + +/-- +`iwasawaPartialProduct` satisfies the addition formula `iwasawaPartialProduct F hpi (a + b) r = +iwasawaPartialProduct F hpi a r * iwasawaPartialProduct F hpi b r`. +-/ +theorem iwasawaPartialProduct_add + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (a b : iwasawaDomain F) (r : ℕ) : + iwasawaPartialProduct F hpi (a + b) r = + iwasawaPartialProduct F hpi a r * + iwasawaPartialProduct F hpi b r := by + classical + simp only [iwasawaPartialProduct, iwasawaDegreeTerm_add] + exact Finset.prod_mul_distrib + +/-- Establishes the identity `iwasawaDegreeTerm F hpi a n = 1`. -/ +theorem iwasawaDegreeTerm_eq_one_of_block_eq_zero + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (a : iwasawaDomain F) (n : ℕ) + (ha : ∀ hn : 1 ≤ n ∧ Nat.Coprime n F.residueCharacteristic, + ∀ i : Fin (iwasawaResidueRank F), a (⟨n, hn⟩, i) = 0) : + iwasawaDegreeTerm F hpi a n = 1 := by + classical + rw [iwasawaDegreeTerm] + split_ifs with hn + · have hvec : + (fun i => a (⟨n, hn⟩, i)) = + (0 : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic]) := by + funext i + exact ha hn i + rw [hvec, map_zero] + rfl + · rfl + +/-- Expanding the cutoff by one only adds the factor whose degree is the +new cutoff. -/ +theorem iwasawaPartialProduct_succ + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (a : iwasawaDomain F) (r : ℕ) : + iwasawaPartialProduct F hpi a (r + 1) = + iwasawaPartialProduct F hpi a r * + iwasawaDegreeTerm F hpi a (r + 1) := by + classical + unfold iwasawaPartialProduct + change + (∏ n ∈ Finset.range (Nat.succ (r + 1)), + iwasawaDegreeTerm F hpi a n) = _ + rw [Finset.prod_range_succ] + +/-- The finite approximation implicit in formula (1): every first +principal unit is represented modulo `U^(r+1)` by the product of the +Iwasawa factors of degree at most `r`. The support condition records the +inductive coefficient construction. -/ +theorem exists_iwasawaPartialProduct_div_mem_higher + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (x : ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) (r : ℕ) : + ∃ a : iwasawaDomain F, + (∀ j, r < j.1.1 → a j = 0) ∧ + (((x / iwasawaPartialProduct F hpi a r : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (r + 1) := by + classical + induction r with + | zero => + refine ⟨0, ?_, ?_⟩ + · intro j _hj + rfl + · simp [iwasawaPartialProduct] + | succ r ih => + obtain ⟨a, haSupport, haDeep⟩ := ih + let n : ℕ := iwasawaPrimeToPPart F (r + 1) + let s : ℕ := padicValNat F.residueCharacteristic (r + 1) + have hm : 1 ≤ r + 1 := Nat.succ_le_succ (Nat.zero_le r) + have hspec := iwasawaPrimeToPPart_spec F hm + have hn : 1 ≤ n := by simpa [n] using hspec.1 + have hcop : Nat.Coprime n F.residueCharacteristic := by + simpa [n] using hspec.2.1 + have hdepth : n * F.residueCharacteristic ^ s = r + 1 := by + simpa [n, s] using hspec.2.2 + let d : IwasawaDegree F.residueCharacteristic := ⟨n, hn, hcop⟩ + have hnle : n ≤ r + 1 := by + rw [← hdepth] + exact Nat.le_mul_of_pos_right n + (pow_pos F.residueCharacteristic_prime.pos s) + let z : ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) + (n * F.residueCharacteristic ^ s) := + ⟨((x / iwasawaPartialProduct F hpi a r : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ), by + simpa [hdepth] using haDeep⟩ + obtain ⟨beta, hbeta⟩ := + exists_iwasawaGnScaled_mul_mem_succ F hpi n hn s z + let b : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic] := + (F.residueCharacteristic ^ s : + ℤ_[F.residueCharacteristic]) • beta + let a' : iwasawaDomain F := a + iwasawaSingleBlock F d b + refine ⟨a', ?_, ?_⟩ + · intro j hj + have haj : a j = 0 := haSupport j (by omega) + have hjd : j.1 ≠ d := by + intro hjd + have hjval : j.1.1 = n := congrArg Subtype.val hjd + omega + change a j + iwasawaSingleBlock F d b j = 0 + rw [haj] + simpa using iwasawaSingleBlock_apply_ne F hjd b j.2 + · have hterm : iwasawaDegreeTerm F hpi a (r + 1) = 1 := by + apply iwasawaDegreeTerm_eq_one_of_block_eq_zero F hpi + intro hvalid i + exact haSupport (⟨⟨r + 1, hvalid⟩, i⟩) + (Nat.lt_succ_self r) + have hpartialSucc : + iwasawaPartialProduct F hpi a (r + 1) = + iwasawaPartialProduct F hpi a r := by + rw [iwasawaPartialProduct_succ, hterm, mul_one] + have hpartial : + iwasawaPartialProduct F hpi a' (r + 1) = + iwasawaPartialProduct F hpi a r * + Additive.toMul (iwasawaGn F hpi n hn b) := by + rw [show a' = a + iwasawaSingleBlock F d b by rfl, + iwasawaPartialProduct_add, hpartialSucc, + iwasawaPartialProduct_singleBlock F hpi d b hnle] + rw [hpartial] + have hbeta' : + (((z / iwasawaGnScaledAtLevel F hpi n hn s beta : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) + (n * F.residueCharacteristic ^ s)) : + F.valuationSubringˣ) : F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (r + 1 + 1) := by + rw [← hdepth] + exact hbeta + have hunitEq : + (((x / + (iwasawaPartialProduct F hpi a r * + Additive.toMul (iwasawaGn F hpi n hn b)) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) : + F.valuationSubringˣ) = + (((z / iwasawaGnScaledAtLevel F hpi n hn s beta : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) + (n * F.residueCharacteristic ^ s)) : + F.valuationSubringˣ) : F.valuationSubringˣ) := by + change + (x : F.valuationSubringˣ) / + ((iwasawaPartialProduct F hpi a r : + F.valuationSubringˣ) * + ((Additive.toMul (iwasawaGn F hpi n hn b) : + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) : + F.valuationSubringˣ)) = + (x : F.valuationSubringˣ) / + (iwasawaPartialProduct F hpi a r : + F.valuationSubringˣ) / + ((Additive.toMul (iwasawaGn F hpi n hn b) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) + exact div_mul_eq_div_div _ _ _ + rw [hunitEq] + exact hbeta' + +/-- Higher-degree factors disappear in every fixed finite quotient. Thus +the partial products define a compatible family; this is the formal +convergence argument for the infinite product. -/ +theorem Internal.principalUnitQuotientCarrier_mk_iwasawaPartialProduct_eq_of_le + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (a : iwasawaDomain F) {m r : ℕ} (hmr : m ≤ r) : + (higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubquotientMk + 1 (m + 1) (iwasawaPartialProduct F hpi a r) = + (higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubquotientMk + 1 (m + 1) (iwasawaPartialProduct F hpi a m) := by + classical + induction r, hmr using Nat.le_induction with + | base => rfl + | @succ r hmr ihr => + rw [iwasawaPartialProduct, Finset.prod_range_succ] + let N := + (((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1)).subgroupOf + (((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) + change + QuotientGroup.mk' N + (iwasawaPartialProduct F hpi a r * + iwasawaDegreeTerm F hpi a (r + 1)) = + QuotientGroup.mk' N (iwasawaPartialProduct F hpi a m) + change + QuotientGroup.mk' N (iwasawaPartialProduct F hpi a r) = + QuotientGroup.mk' N (iwasawaPartialProduct F hpi a m) at ihr + rw [map_mul, ihr] + have hterm : + QuotientGroup.mk' N (iwasawaDegreeTerm F hpi a (r + 1)) = 1 := by + apply (QuotientGroup.eq_one_iff + (N := N) (iwasawaDegreeTerm F hpi a (r + 1))).2 + change + ((iwasawaDegreeTerm F hpi a (r + 1) : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1) + exact + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.antitone + F.toCompleteDVF + (Nat.succ_le_succ hmr) + (iwasawaDegreeTerm_mem_higher F hpi a (r + 1)) + rw [hterm] + exact mul_one + (QuotientGroup.mk' N (iwasawaPartialProduct F hpi a m)) + +/-- The compatible family of all finite Iwasawa partial products. -/ +noncomputable def Internal.iwasawaGlobalInverseLimitCarrier + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (a : iwasawaDomain F) : + Internal.principalUnitInverseLimitCarrier F.toCompleteDVF := + ⟨fun r => + (higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubquotientMk + 1 (r + 1) (iwasawaPartialProduct F hpi a r), by + intro m r hmr + rw [principalUnitQuotientCarrierTransition_mk] + exact + principalUnitQuotientCarrier_mk_iwasawaPartialProduct_eq_of_le + F hpi a hmr⟩ + +/-- +The defining evaluation formula for `Internal.iwasawaGlobalInverseLimitCarrier` is +`(iwasawaGlobalInverseLimitCarrier F hpi a).1 r = +(higherPrincipalUnitGroup.toPrincipalUnitFiltration F.toCompleteDVF).principalUnitSubquotientMk 1 +(r + 1) (iwasawaPartialProduct F hpi a r)`. +-/ +@[simp] theorem Internal.iwasawaGlobalInverseLimitCarrier_apply + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (a : iwasawaDomain F) (r : ℕ) : + (iwasawaGlobalInverseLimitCarrier F hpi a).1 r = + (higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubquotientMk + 1 (r + 1) (iwasawaPartialProduct F hpi a r) := + rfl + +/-- Every finite coordinate of the Iwasawa product is onto. This is the +finite-quotient consequence of formula (1) used in the compactness argument +in the coefficient calculation. -/ +theorem Internal.surjective_iwasawaGlobalInverseLimitCarrier_coordinate + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) (r : ℕ) : + Function.Surjective (fun a : iwasawaDomain F => + (iwasawaGlobalInverseLimitCarrier F hpi a).1 r) := by + intro q + obtain ⟨x, rfl⟩ := QuotientGroup.mk'_surjective + ((((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (r + 1)).subgroupOf + (((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1)) q + obtain ⟨a, _haSupport, ha⟩ := + exists_iwasawaPartialProduct_div_mem_higher F hpi x r + refine ⟨a, ?_⟩ + change + (QuotientGroup.mk (iwasawaPartialProduct F hpi a r) : + Internal.principalUnitQuotientCarrier F.toCompleteDVF r) = + QuotientGroup.mk x + symm + let U := + toPrincipalUnitFiltration F.toCompleteDVF + exact (U.principalUnitSubquotient_mk_eq_iff_div_mem x + (iwasawaPartialProduct F hpi a r)).2 ha + +/-- One Iwasawa factor valued in the type-level adic principal-unit model. -/ +noncomputable def adicIwasawaGn + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) + (a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) : + AdicPrincipalUnits F.toCompleteDVF := + AdicPrincipalUnits.of F.toCompleteDVF (iwasawaGn F hpi n hn a) + +/-- One degree term valued in the type-level adic principal-unit model. -/ +noncomputable def adicIwasawaDegreeTerm + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (a : iwasawaDomain F) (n : ℕ) : + AdicPrincipalUnits F.toCompleteDVF := + AdicPrincipalUnits.of F.toCompleteDVF + (Additive.ofMul (iwasawaDegreeTerm F hpi a n)) + +/-- A finite Iwasawa partial product valued in the type-level adic +principal-unit model. -/ +noncomputable def adicIwasawaPartialProduct + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (a : iwasawaDomain F) (r : ℕ) : + AdicPrincipalUnits F.toCompleteDVF := + AdicPrincipalUnits.of F.toCompleteDVF + (Additive.ofMul (iwasawaPartialProduct F hpi a r)) + +/-- Continuity of one Iwasawa factor; the adic topology is carried by the +codomain type. -/ +theorem continuous_adicIwasawaGn + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) : + Continuous (adicIwasawaGn F hpi n hn) := by + have h : Continuous fun a : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic] => + ∑ i, a i • AdicPrincipalUnits.of F.toCompleteDVF + (Additive.ofMul (iwasawaSeed F hpi n hn i)) := by + fun_prop + have hof (x : Additive + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF) 1)) : + AdicPrincipalUnits.linearEquivUnderlying F + (AdicPrincipalUnits.of F.toCompleteDVF x) = x := rfl + have hfun : ∀ a : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic], + (∑ i, a i • AdicPrincipalUnits.of F.toCompleteDVF + (Additive.ofMul (iwasawaSeed F hpi n hn i))) = + AdicPrincipalUnits.of F.toCompleteDVF (iwasawaGn F hpi n hn a) := by + intro a + apply (AdicPrincipalUnits.linearEquivUnderlying F).injective + simp only [map_sum, map_smul, hof, iwasawaGn_apply] + change Continuous fun a => + AdicPrincipalUnits.of F.toCompleteDVF (iwasawaGn F hpi n hn a) + exact h.congr hfun + +/-- +The specified map is continuous: `Continuous fun a : iwasawaDomain F => adicIwasawaDegreeTerm F +hpi a n`. +-/ +theorem continuous_adicIwasawaDegreeTerm + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) : + Continuous fun a : iwasawaDomain F => + adicIwasawaDegreeTerm F hpi a n := by + classical + by_cases hn : 1 ≤ n ∧ Nat.Coprime n F.residueCharacteristic + · have hcoordinates : Continuous fun a : iwasawaDomain F => + (fun i => a (⟨n, hn⟩, i)) := by + exact continuous_pi fun i => continuous_apply + ((⟨n, hn⟩ : IwasawaDegree F.residueCharacteristic), i) + have hcont := + (continuous_adicIwasawaGn F hpi n hn.1).comp hcoordinates + apply hcont.congr + intro a + simp only [Function.comp_apply, adicIwasawaDegreeTerm, + iwasawaDegreeTerm, dite_eq_left hn, adicIwasawaGn, ofMul_toMul] + · simpa only [adicIwasawaDegreeTerm, iwasawaDegreeTerm, dite_eq_right hn, + ofMul_one] using + (continuous_const : Continuous fun _ : iwasawaDomain F => + AdicPrincipalUnits.of F.toCompleteDVF 0) + +/-- +The specified map is continuous: `Continuous fun a : iwasawaDomain F => adicIwasawaPartialProduct +F hpi a r`. +-/ +theorem continuous_adicIwasawaPartialProduct + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) (r : ℕ) : + Continuous fun a : iwasawaDomain F => + adicIwasawaPartialProduct F hpi a r := by + unfold adicIwasawaPartialProduct iwasawaPartialProduct + classical + induction Finset.range (r + 1) using Finset.induction_on with + | empty => + simpa only [Finset.prod_empty, ofMul_one] using + (continuous_const : Continuous fun _ : iwasawaDomain F => + AdicPrincipalUnits.of F.toCompleteDVF 0) + | @insert n s hns ih => + simp only [Finset.prod_insert hns] + have hcont := (continuous_adicIwasawaDegreeTerm F hpi n).add ih + apply hcont.congr + intro a + apply (AdicPrincipalUnits.addEquiv F.toCompleteDVF).injective + change + Additive.ofMul (iwasawaDegreeTerm F hpi a n) + + Additive.ofMul + (∏ k ∈ s, iwasawaDegreeTerm F hpi a k) = + Additive.ofMul + (iwasawaDegreeTerm F hpi a n * + ∏ k ∈ s, iwasawaDegreeTerm F hpi a k) + rw [ofMul_mul] + +/-- Internal bridge from the type-level adic partial product to the raw +carrier used by the algebraic inverse-limit construction. -/ +theorem Internal.continuous_iwasawaPartialProduct + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) (r : ℕ) : + letI : TopologicalSpace F.valuationSubring := + (LubinTate.Valuations.uniformizerPowerIdeal + (chosenPrincipalUnitPadicUniformizer F.toCompleteDVF) 1).adicTopology + Continuous fun a : iwasawaDomain F => + iwasawaPartialProduct F hpi a r := by + let : TopologicalSpace F.valuationSubring := + (LubinTate.Valuations.uniformizerPowerIdeal + (chosenPrincipalUnitPadicUniformizer F.toCompleteDVF) 1).adicTopology + let e := Internal.adicPrincipalUnitsHomeomorphUnderlying F.toCompleteDVF + have h := e.continuous.comp + (continuous_adicIwasawaPartialProduct F hpi r) + exact h + +/-- Continuity of the compatible finite products. The target has the +product topology of the discrete finite principal-unit quotients. -/ +theorem Internal.continuous_iwasawaGlobalInverseLimitCarrier + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) : + letI : (n : ℕ) → TopologicalSpace + (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) := fun _ => ⊥ + Continuous (iwasawaGlobalInverseLimitCarrier F hpi) := by + let : TopologicalSpace F.valuationSubring := + (LubinTate.Valuations.uniformizerPowerIdeal + (chosenPrincipalUnitPadicUniformizer F.toCompleteDVF) 1).adicTopology + let : (n : ℕ) → TopologicalSpace + (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) := fun _ => ⊥ + let E := Internal.principalUnitHomeomorphInverseLimitCarrier F.toCompleteDVF + exact Continuous.subtype_mk + (continuous_pi fun r => by + have hcoord : Continuous fun x : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1 => + (E x).1 r := + ((continuous_apply r).comp continuous_subtype_val).comp E.continuous + change Continuous fun x : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1 => + Internal.principalUnitInverseLimitCarrierEval F.toCompleteDVF r + (Internal.principalUnitMulEquivInverseLimitCarrier + F.toCompleteDVF x) at hcoord + have hquot : Continuous fun x : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1 => + (higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubquotientMk 1 (r + 1) x := by + simpa only [principalUnitMulEquivInverseLimitCarrier_apply] using hcoord + exact hquot.comp (Internal.continuous_iwasawaPartialProduct F hpi r)) + (fun a => by + intro m r hmr + exact (iwasawaGlobalInverseLimitCarrier F hpi a).property hmr) + +/-- Additive-homomorphism form of the infinite product in the inverse +limit. -/ +noncomputable def Internal.iwasawaGlobalInverseLimitCarrierAddHom + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) : + iwasawaDomain F →+ + Additive (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF) where + toFun a := Additive.ofMul (iwasawaGlobalInverseLimitCarrier F hpi a) + map_zero' := by + apply Additive.toMul.injective + apply Subtype.ext + funext r + change + (higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubquotientMk 1 (r + 1) + (iwasawaPartialProduct F hpi (0 : iwasawaDomain F) r) = + (1 : Internal.principalUnitQuotientCarrier F.toCompleteDVF r) + rw [iwasawaPartialProduct_zero_input] + exact map_one _ + map_add' a b := by + apply Additive.toMul.injective + apply Subtype.ext + funext r + change + (QuotientGroup.mk (iwasawaPartialProduct F hpi (a + b) r) : + Internal.principalUnitQuotientCarrier F.toCompleteDVF r) = + (QuotientGroup.mk (iwasawaPartialProduct F hpi a r) : + Internal.principalUnitQuotientCarrier F.toCompleteDVF r) * + (QuotientGroup.mk (iwasawaPartialProduct F hpi b r) : + Internal.principalUnitQuotientCarrier F.toCompleteDVF r) + rw [iwasawaPartialProduct_add] + exact map_mul + (QuotientGroup.mk' + ((((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (r + 1)).subgroupOf + (((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1))) _ _ + +/-- The Iwasawa compatible family valued in its type-level prodiscrete model. +For a local field all coordinate quotients are finite. -/ +noncomputable def iwasawaGlobalProdiscreteLimitAddHom + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) : + iwasawaDomain F →+ + PrincipalUnitProdiscreteLimit F.toCompleteDVF := + (PrincipalUnitProdiscreteLimit.addEquiv F.toCompleteDVF).symm.toAddMonoidHom.comp + (iwasawaGlobalInverseLimitCarrierAddHom F hpi) + +/-- The specified map is continuous: `Continuous (iwasawaGlobalProdiscreteLimitAddHom F hpi)`. -/ +theorem Internal.continuous_iwasawaGlobalProdiscreteLimitAddHom + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) : + Continuous (iwasawaGlobalProdiscreteLimitAddHom F hpi) := by + let : (n : ℕ) → TopologicalSpace + (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) := fun _ => ⊥ + let e := Internal.principalUnitProdiscreteLimitHomeomorphUnderlying + F.toCompleteDVF + have h := e.continuous_symm.comp + (Internal.continuous_iwasawaGlobalInverseLimitCarrier F hpi) + exact h + +/-- Continuity of the Iwasawa compatible family; discreteness of every +finite coordinate is encoded by the codomain type. -/ +theorem continuous_iwasawaGlobalProdiscreteLimitAddHom + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) : + Continuous (iwasawaGlobalProdiscreteLimitAddHom F hpi) := + Internal.continuous_iwasawaGlobalProdiscreteLimitAddHom F hpi + +/-- Compactness upgrades formula (1), already proved on every finite +coordinate, to surjectivity of the complete Iwasawa product. -/ +theorem surjective_iwasawaGlobalProdiscreteLimitAddHom + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) : + Function.Surjective (iwasawaGlobalProdiscreteLimitAddHom F hpi) := by + apply + surjective_principalUnitProdiscreteLimit_of_surjective_coordinates + F.toCompleteDVF (iwasawaGlobalProdiscreteLimitAddHom F hpi) + (continuous_iwasawaGlobalProdiscreteLimitAddHom F hpi) + intro r y + obtain ⟨a, ha⟩ := + surjective_iwasawaGlobalInverseLimitCarrier_coordinate F hpi r + (Additive.toMul y.val) + refine ⟨a, ?_⟩ + apply DiscretePrincipalUnitQuotient.ext + exact congrArg Additive.ofMul ha + +/-- +The specified map is surjective: `Function.Surjective (iwasawaGlobalInverseLimitCarrierAddHom F +hpi)`. +-/ +theorem Internal.surjective_iwasawaGlobalInverseLimitCarrierAddHom + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) : + Function.Surjective (iwasawaGlobalInverseLimitCarrierAddHom F hpi) := by + have h := surjective_iwasawaGlobalProdiscreteLimitAddHom F hpi + exact (PrincipalUnitProdiscreteLimit.addEquiv F.toCompleteDVF).surjective.comp h + +/-- Iwasawa's product homomorphism `g : A -> U^1`, obtained from its +compatible finite quotients via the adic inverse-limit isomorphism. -/ +noncomputable def Internal.iwasawaGlobalAddHom + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) : + iwasawaDomain F →+ + Additive (((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) := + (principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF).symm.toAddMonoidHom.comp + (iwasawaGlobalInverseLimitCarrierAddHom F hpi) + +/-- The specified map is surjective: `Function.Surjective (iwasawaGlobalAddHom F hpi)`. -/ +theorem Internal.surjective_iwasawaGlobalAddHom + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) : + Function.Surjective (iwasawaGlobalAddHom F hpi) := by + exact + (principalUnitAddEquivInverseLimitCarrier + F.toCompleteDVF).symm.surjective.comp + (surjective_iwasawaGlobalInverseLimitCarrierAddHom F hpi) + +/-- +Establishes the identity `principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF +(iwasawaGlobalAddHom F hpi a) = Additive.ofMul (iwasawaGlobalInverseLimitCarrier F hpi a)`. +-/ +@[simp] theorem Internal.principalUnitAddEquivInverseLimitCarrier_iwasawaGlobalAddHom + (F : LocalField.{u, v} K) + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (a : iwasawaDomain F) : + principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF + (iwasawaGlobalAddHom F hpi a) = + Additive.ofMul (iwasawaGlobalInverseLimitCarrier F hpi a) := by + exact (principalUnitAddEquivInverseLimitCarrier + F.toCompleteDVF).apply_symm_apply _ + +/-- Every factor distinct from a chosen least-depth factor vanishes in the +next finite quotient. -/ +theorem iwasawaDegreeTerm_mem_succ_of_ne_minimal + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (a : iwasawaDomain F) (m : ℕ) + (d : IwasawaDegree F.residueCharacteristic) (s : ℕ) + (hm : m = d.1 * F.residueCharacteristic ^ s) + (hmin : ∀ e : IwasawaDegree F.residueCharacteristic, + ∀ t : ℕ, ∀ c : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic], + iwasawaBlock F a e = + (F.residueCharacteristic ^ t : + ℤ_[F.residueCharacteristic]) • c → + IwasawaPrimitive F c → + m ≤ e.1 * F.residueCharacteristic ^ t) + (k : ℕ) + (hk : 1 ≤ k ∧ Nat.Coprime k F.residueCharacteristic) + (hkd : k ≠ d.1) : + ((iwasawaDegreeTerm F hpi a k : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1) := by + classical + let e : IwasawaDegree F.residueCharacteristic := ⟨k, hk⟩ + by_cases he0 : iwasawaBlock F a e = 0 + · have hterm : iwasawaDegreeTerm F hpi a k = 1 := by + apply iwasawaDegreeTerm_eq_one_of_block_eq_zero F hpi + intro hvalid i + have heq : + (⟨k, hvalid⟩ : IwasawaDegree F.residueCharacteristic) = e := + Subtype.ext rfl + change iwasawaBlock F a (⟨k, hvalid⟩ : + IwasawaDegree F.residueCharacteristic) i = 0 + rw [heq, he0] + rfl + rw [hterm] + exact (((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1)).one_mem + · obtain ⟨t, c, hec, hc⟩ := + exists_pow_smul_iwasawaPrimitive_of_ne_zero F + (iwasawaBlock F a e) he0 + have hle : m ≤ e.1 * F.residueCharacteristic ^ t := + hmin e t c hec hc + have hne : m ≠ e.1 * F.residueCharacteristic ^ t := by + intro heqDepth + have hdepth : + d.1 * F.residueCharacteristic ^ s = + e.1 * F.residueCharacteristic ^ t := by + rw [← hm, heqDepth] + have hde := (iwasawaDepth_eq_iff F d e s t).1 hdepth + apply hkd + exact congrArg Subtype.val hde.1.symm + have hlevel : m + 1 ≤ e.1 * F.residueCharacteristic ^ t := + Nat.succ_le_of_lt (lt_of_le_of_ne hle hne) + have hscaled : + (((iwasawaGnScaledAtLevel F hpi e.1 e.property.1 t c : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) + (e.1 * F.residueCharacteristic ^ t)) : + F.valuationSubringˣ) : F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1) := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.antitone + F.toCompleteDVF hlevel + (iwasawaGnScaledAtLevel F hpi e.1 e.property.1 t c).property + have hterm := + iwasawaDegreeTerm_eq_iwasawaGnScaled F hpi a e t c hec + change + ((iwasawaDegreeTerm F hpi a e.1 : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1) + rw [hterm] + exact hscaled + +/-- The chosen primitive least-depth factor survives in the next quotient; +this is the second coefficient congruence. -/ +theorem iwasawaDegreeTerm_not_mem_succ_of_primitive + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (a : iwasawaDomain F) (m : ℕ) + (d : IwasawaDegree F.residueCharacteristic) (s : ℕ) + (b : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) + (hab : iwasawaBlock F a d = + (F.residueCharacteristic ^ s : + ℤ_[F.residueCharacteristic]) • b) + (hb : IwasawaPrimitive F b) + (hm : m = d.1 * F.residueCharacteristic ^ s) : + ¬ (((iwasawaDegreeTerm F hpi a d.1 : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1)) := by + have hnotScaled := + (iwasawa_formula_two F hpi d.1 d.property.1 s b).1 hb + intro htermMem + apply hnotScaled + have hterm := + iwasawaDegreeTerm_eq_iwasawaGnScaled F hpi a d s b hab + rw [← hterm] + simpa only [hm] using htermMem + +/-- A nonzero coefficient family has nonzero image in the inverse limit. +The least depth supplied above is detected in its `m`-th coordinate. -/ +theorem Internal.iwasawaGlobalInverseLimitCarrierAddHom_ne_zero_of_ne_zero + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) + (a : iwasawaDomain F) (ha : a ≠ 0) : + iwasawaGlobalInverseLimitCarrierAddHom F hpi a ≠ 0 := by + classical + obtain ⟨m, d, s, b, hab, hb, hm, hmin⟩ := + exists_minimal_iwasawaDepthWitness_of_ne_zero F a ha + have hdle : d.1 ≤ m := by + rw [hm] + exact Nat.le_mul_of_pos_right d.1 + (pow_pos F.residueCharacteristic_prime.pos s) + have hdmem : d.1 ∈ Finset.range (m + 1) := + Finset.mem_range.mpr (Nat.lt_succ_of_le hdle) + have hchosenNot := + iwasawaDegreeTerm_not_mem_succ_of_primitive + F hpi a m d s b hab hb hm + have hpartialEq : + (QuotientGroup.mk (iwasawaPartialProduct F hpi a m) : + Internal.principalUnitQuotientCarrier F.toCompleteDVF m) = + QuotientGroup.mk (iwasawaDegreeTerm F hpi a d.1) := by + change + (QuotientGroup.mk' + ((((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1)).subgroupOf + (((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1))) + (∏ k ∈ Finset.range (m + 1), + iwasawaDegreeTerm F hpi a k) = + QuotientGroup.mk (iwasawaDegreeTerm F hpi a d.1) + rw [map_prod] + apply Finset.prod_eq_single d.1 + · intro k hk hkd + by_cases hvalid : + 1 ≤ k ∧ Nat.Coprime k F.residueCharacteristic + · apply (QuotientGroup.eq_one_iff + (N := (((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1)).subgroupOf + (((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1)) + (iwasawaDegreeTerm F hpi a k)).2 + change + ((iwasawaDegreeTerm F hpi a k : + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1) + exact iwasawaDegreeTerm_mem_succ_of_ne_minimal + F hpi a m d s hm hmin k hvalid hkd + · have hterm : iwasawaDegreeTerm F hpi a k = 1 := by + simp [iwasawaDegreeTerm, hvalid] + rw [hterm, map_one] + · intro hdnot + exact (hdnot hdmem).elim + intro hzero + have hcoord := congrArg + (fun z : Additive + (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF) => + Additive.ofMul ((Additive.toMul z).1 m)) hzero + have hpartialOne : + (QuotientGroup.mk (iwasawaPartialProduct F hpi a m) : + Internal.principalUnitQuotientCarrier F.toCompleteDVF m) = 1 := by + apply Additive.ofMul.injective + exact hcoord + rw [hpartialEq] at hpartialOne + apply hchosenNot + exact (QuotientGroup.eq_one_iff + (N := + ((((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1)).subgroupOf + (((classFieldHigherPrincipalUnitGroup + F.toCompleteDVF)) 1))) + (iwasawaDegreeTerm F hpi a d.1)).1 hpartialOne + +/-- +The specified map is injective: `Function.Injective (iwasawaGlobalInverseLimitCarrierAddHom F +hpi)`. +-/ +theorem Internal.injective_iwasawaGlobalInverseLimitCarrierAddHom + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) : + Function.Injective (iwasawaGlobalInverseLimitCarrierAddHom F hpi) := by + intro a b hab + have hzero : iwasawaGlobalInverseLimitCarrierAddHom F hpi (a - b) = 0 := by + rw [map_sub, hab] + exact sub_self _ + have habzero : a - b = 0 := by + by_contra hne + exact (iwasawaGlobalInverseLimitCarrierAddHom_ne_zero_of_ne_zero + F hpi (a - b) hne) hzero + exact sub_eq_zero.mp habzero + +/-- +The specified map is injective: `Function.Injective (iwasawaGlobalProdiscreteLimitAddHom F hpi)`. +-/ +theorem injective_iwasawaGlobalProdiscreteLimitAddHom + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) : + Function.Injective (iwasawaGlobalProdiscreteLimitAddHom F hpi) := by + intro a b hab + apply injective_iwasawaGlobalInverseLimitCarrierAddHom F hpi + change + (PrincipalUnitProdiscreteLimit.addEquiv F.toCompleteDVF).symm + (iwasawaGlobalInverseLimitCarrierAddHom F hpi a) = + (PrincipalUnitProdiscreteLimit.addEquiv F.toCompleteDVF).symm + (iwasawaGlobalInverseLimitCarrierAddHom F hpi b) at hab + exact (PrincipalUnitProdiscreteLimit.addEquiv + F.toCompleteDVF).symm.injective hab + +/-- The equal-characteristic Iwasawa isomorphism, with the prodiscrete +topology fixed in its codomain type. In the local-field case this topology +is profinite. -/ +noncomputable def iwasawaGlobalProdiscreteLimitAddEquiv + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) : + iwasawaDomain F ≃+ PrincipalUnitProdiscreteLimit F.toCompleteDVF := + AddEquiv.ofBijective (iwasawaGlobalProdiscreteLimitAddHom F hpi) + ⟨injective_iwasawaGlobalProdiscreteLimitAddHom F hpi, + surjective_iwasawaGlobalProdiscreteLimitAddHom F hpi⟩ + +/-- The Iwasawa product is a homeomorphism onto the type-level prodiscrete +principal-unit limit. -/ +noncomputable def iwasawaGlobalProdiscreteLimitContinuousAddEquiv + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) : + iwasawaDomain F ≃ₜ+ PrincipalUnitProdiscreteLimit F.toCompleteDVF := by + let e := iwasawaGlobalProdiscreteLimitAddEquiv F hpi + have he : Continuous e := + continuous_iwasawaGlobalProdiscreteLimitAddHom F hpi + let h := e.toEquiv.toHomeomorphOfContinuousClosed he he.isClosedMap + exact ContinuousAddEquiv.mk' h (fun x y => e.map_add x y) + +/-- Topological form of the equal-characteristic Iwasawa isomorphism. The +adic topology is part of the codomain type. -/ +noncomputable def iwasawaGlobalAdicPrincipalUnitsContinuousAddEquiv + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] + {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) : + iwasawaDomain F ≃ₜ+ AdicPrincipalUnits F.toCompleteDVF := + (iwasawaGlobalProdiscreteLimitContinuousAddEquiv F hpi).trans + (adicPrincipalUnitsContinuousAddEquivProdiscreteLimit + F.toCompleteDVF).symm + +end higherPrincipalUnitGroup +end CompleteDVF +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicQp.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicQp.lean new file mode 100644 index 0000000000..39c3144738 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicQp.lean @@ -0,0 +1,1074 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuedExtensionUnitMap +public import Mathlib.Analysis.Normed.Module.FiniteDimension +public import Mathlib.FieldTheory.PrimeField +public import Mathlib.LinearAlgebra.Dimension.Basic +public import Mathlib.NumberTheory.Padics.WithVal +public import Mathlib.RingTheory.SimpleRing.Basic +public import Mathlib.Topology.Algebra.Field +public import Mathlib.Topology.Algebra.UniformRing +/-! +# Mixed-characteristic input for the `Qp` branch of the local-field structure classification + +This file keeps the converse direction of the local-field structure theory, the local-field + structure classification focused on the mixed-characteristic case. The key point proved here is +that the actual range-restricted local-field valuation still restricts on +`ℚ` to the usual `p`-adic valuation, where `p` is the residue characteristic. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming + mrangeRestrictNontriviallyNormedField → + mrangeRestrictNontriviallyNormedField + + +noncomputable +section + +universe u v + +open LocalFieldTheory.DiscreteValuationField + +namespace LocalFieldTheory.DiscreteValuationField +namespace LocalField + +open scoped WithZero + +variable {K : Type u} [Field K] + +/-- The actual value group used by the range-restricted topology of a local +field package. -/ +abbrev mrangeValueGroup (F : LocalField.{u, v} K) : Type v := + MonoidHom.mrange + F.toCompleteDVF.valuation.toMonoidWithZeroHom + +/-- The rational prime subfield of a mixed-characteristic local field. -/ +abbrev ratSubfield (_F : LocalField.{u, v} K) [CharZero K] : Subfield K := + (algebraMap ℚ K).fieldRange + +/-- Establishes the identity `F.ratSubfield = (⊥ : Subfield K)`. -/ +theorem ratSubfield_eq_bot (F : LocalField.{u, v} K) [CharZero K] : + F.ratSubfield = (⊥ : Subfield K) := by + simpa [ratSubfield] using (Subfield.bot_eq_of_charZero (K := K)).symm + +/-- Establishes the membership statement `(q : K) ∈ F.ratSubfield`. -/ +theorem ratCast_mem_ratSubfield + (F : LocalField.{u, v} K) [CharZero K] (q : ℚ) : + (q : K) ∈ F.ratSubfield := by + simp [ratSubfield] + +/-- The closed subfield generated by `ℚ` inside a mixed-characteristic local +field, with the range-restricted valuation topology. This is the candidate +copy of `ℚ_[p]` in the converse direction of the local-field structure classification. -/ +noncomputable def qpadicClosureSubfield + (F : LocalField.{u, v} K) [CharZero K] : Subfield K := by + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + exact F.ratSubfield.topologicalClosure + +/-- +The underlying set of the `p`-adic closure subfield is the topological closure of the rational +subfield. +-/ +theorem qpadicClosureSubfield_coe + (F : LocalField.{u, v} K) [CharZero K] : + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF + (F.qpadicClosureSubfield : Set K) = + closure (F.ratSubfield : Set K) := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + rfl + +/-- Proves the bound `F.ratSubfield ≤ F.qpadicClosureSubfield`. -/ +theorem ratSubfield_le_qpadicClosureSubfield + (F : LocalField.{u, v} K) [CharZero K] : + F.ratSubfield ≤ F.qpadicClosureSubfield := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + simpa [qpadicClosureSubfield] using + (Subfield.le_topologicalClosure F.ratSubfield) + +/-- Establishes the membership statement `(q : K) ∈ F.qpadicClosureSubfield`. -/ +theorem ratCast_mem_qpadicClosureSubfield + (F : LocalField.{u, v} K) [CharZero K] (q : ℚ) : + (q : K) ∈ F.qpadicClosureSubfield := + F.ratSubfield_le_qpadicClosureSubfield (F.ratCast_mem_ratSubfield q) + +/-- The closed subfield generated by the rationals is topologically closed. -/ +theorem qpadicClosureSubfield_isClosed + (F : LocalField.{u, v} K) [CharZero K] : + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF + IsClosed (F.qpadicClosureSubfield : Set K) := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + simpa [qpadicClosureSubfield] using + (Subfield.isClosed_topologicalClosure F.ratSubfield) + +/-- The rational subfield has dense image in its `p`-adic closure subfield. -/ +theorem ratSubfield_denseRange_in_qpadicClosureSubfield + (F : LocalField.{u, v} K) [CharZero K] : + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF + DenseRange + (Set.inclusion + (show (F.ratSubfield : Set K) ⊆ + (F.qpadicClosureSubfield : Set K) from + F.ratSubfield_le_qpadicClosureSubfield)) := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + refine (denseRange_inclusion_iff + (show (F.ratSubfield : Set K) ⊆ + (F.qpadicClosureSubfield : Set K) from + F.ratSubfield_le_qpadicClosureSubfield)).2 ?_ + intro x hx + exact hx + +/-- Proves the bound `F.qpadicClosureSubfield ≤ E`. -/ +theorem qpadicClosureSubfield_le_of_ratSubfield_le + (F : LocalField.{u, v} K) [CharZero K] {E : Subfield K} + (hEclosed : + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF + IsClosed (E : Set K)) + (hRat : F.ratSubfield ≤ E) : + F.qpadicClosureSubfield ≤ E := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + simpa [qpadicClosureSubfield] using + (Subfield.topologicalClosure_minimal F.ratSubfield hRat hEclosed) + +/-- The `p`-adic closure subfield is complete for the restricted valuation topology. -/ +theorem qpadicClosureSubfield_completeSpace + (F : LocalField.{u, v} K) [CharZero K] : + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF + letI : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + CompleteSpace F.qpadicClosureSubfield := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + let : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + have : CompleteSpace K := + F.mrangeRestrict_completeSpace + exact + (F.qpadicClosureSubfield_isClosed).completeSpace_coe + +/-- The rational embedding, with codomain restricted to the closed `Qp` +candidate inside `K`. -/ +noncomputable def ratCastToQpadicClosureSubfield + (F : LocalField.{u, v} K) [CharZero K] : + ℚ →+* F.qpadicClosureSubfield := + (Rat.castHom K).codRestrict F.qpadicClosureSubfield + (fun q => F.ratCast_mem_qpadicClosureSubfield q) + +/-- +The defining evaluation formula for `ratCastToQpadicClosureSubfield` is +`((F.ratCastToQpadicClosureSubfield q : F.qpadicClosureSubfield) : K) = q`. +-/ +@[simp] +theorem ratCastToQpadicClosureSubfield_apply + (F : LocalField.{u, v} K) [CharZero K] (q : ℚ) : + ((F.ratCastToQpadicClosureSubfield q : + F.qpadicClosureSubfield) : K) = q := + rfl + +/-- The rational embedding from the `p`-adically valued rational type synonym +to the closed `Qp` candidate inside `K`. -/ +noncomputable def ratCastWithValToQpadicClosureSubfield + (F : LocalField.{u, v} K) [CharZero K] : + WithVal (Rat.padicValuation F.residueCharacteristic) →+* + F.qpadicClosureSubfield := + (F.ratCastToQpadicClosureSubfield).comp + (WithVal.equiv + (Rat.padicValuation F.residueCharacteristic)).toRingHom + +/-- +The defining evaluation formula for `ratCastWithValToQpadicClosureSubfield` is +`((F.ratCastWithValToQpadicClosureSubfield q : F.qpadicClosureSubfield) : K) = ((WithVal.equiv +(Rat.padicValuation F.residueCharacteristic) q : ℚ) : K)`. +-/ +@[simp] +theorem ratCastWithValToQpadicClosureSubfield_apply + (F : LocalField.{u, v} K) [CharZero K] + (q : WithVal (Rat.padicValuation F.residueCharacteristic)) : + ((F.ratCastWithValToQpadicClosureSubfield q : + F.qpadicClosureSubfield) : K) = + ((WithVal.equiv + (Rat.padicValuation F.residueCharacteristic) q : ℚ) : K) := + rfl + +/-- The range-restricted local-field valuation has the same `ℚ`-subring of +elements of value at most one as the `p`-adic valuation. -/ +theorem mrangeRestrict_valuation_ratCast_le_one_iff_padicValuation_le_one + (F : LocalField.{u, v} K) [CharZero K] (q : ℚ) : + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F.toCompleteDVF (q + : K) ≤ 1 ↔ + Rat.padicValuation F.residueCharacteristic q ≤ 1 := by + rw [← Subtype.coe_le_coe] + simpa [_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_apply] using + F.valuation_ratCast_le_one_iff_padicValuation_le_one q + +/-- Pulling back the range-restricted valuation subring along `ℚ → K` gives +the usual `p`-adic valuation subring of `ℚ`. -/ +theorem ratCast_preimage_mrangeRestrict_valuationSubring_eq_padicValuationSubring + (F : LocalField.{u, v} K) [CharZero K] : + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F.toCompleteDVF).valuationSubring.comap (Rat.castHom K) = + (Rat.padicValuation F.residueCharacteristic).valuationSubring := by + ext q + rw [ValuationSubring.mem_comap] + change _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F.toCompleteDVF ((Rat.castHom K) q) ≤ 1 ↔ + Rat.padicValuation F.residueCharacteristic q ≤ 1 + simpa using + F.mrangeRestrict_valuation_ratCast_le_one_iff_padicValuation_le_one q + +/-- The range-restricted local-field valuation, restricted along `ℚ → K`, is +equivalent to the usual `p`-adic valuation. -/ +theorem ratCast_mrangeRestrict_valuation_isEquiv_padicValuation + (F : LocalField.{u, v} K) [CharZero K] : + ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F.toCompleteDVF).comap (Rat.castHom K)).IsEquiv + (Rat.padicValuation F.residueCharacteristic) := by + refine (Valuation.isEquiv_iff_valuationSubring + (v₁ := (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F.toCompleteDVF).comap (Rat.castHom K)) + (v₂ := Rat.padicValuation F.residueCharacteristic)).2 ?_ + ext q + change _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F.toCompleteDVF ((Rat.castHom K) q) ≤ 1 ↔ + Rat.padicValuation F.residueCharacteristic q ≤ 1 + simpa using + F.mrangeRestrict_valuation_ratCast_le_one_iff_padicValuation_le_one q + +/-- In mixed characteristic, powers of the residue characteristic are cofinal +among neighborhoods of zero for the range-restricted valuation topology. -/ +theorem mrangeRestrict_exists_residueCharacteristic_pow_lt_unit + (F : LocalField.{u, v} K) [CharZero K] + (gamma : F.mrangeValueGroupˣ) : + ∃ N : ℕ, + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F.toCompleteDVF + (((F.residueCharacteristic ^ N : ℕ) : K)) < gamma := by + have hp_pos : + 0 < _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F.toCompleteDVF (F.residueCharacteristic : K) := by + rw [← Subtype.coe_lt_coe] + simpa [_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_apply] using + (F.toCompleteDVF.valuation.pos_iff).2 + F.natCast_residueCharacteristic_ne_zero_of_charZero + let delta : F.mrangeValueGroupˣ := + Units.mk0 + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F.toCompleteDVF + (F.residueCharacteristic : K)) + hp_pos.ne' + have hdelta_lt_one : delta < (1 : F.mrangeValueGroupˣ) := by + rw [← Units.val_lt_val] + change + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F.toCompleteDVF + (F.residueCharacteristic : K) < + (1 : F.mrangeValueGroup) + rw [← Subtype.coe_lt_coe] + simpa [_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_apply] using + F.valuation_natCast_residueCharacteristic_lt_one + have : IsCyclic F.mrangeValueGroupˣ := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_units_isCyclic + F.toCompleteDVF + have : MulArchimedean F.mrangeValueGroupˣ := + WithZeroValuation.isCyclic_mulArchimedean F.mrangeValueGroupˣ + have hdelta_inv : (1 : F.mrangeValueGroupˣ) < delta⁻¹ := + one_lt_inv'.2 hdelta_lt_one + obtain ⟨N, hN⟩ := exists_lt_pow hdelta_inv gamma⁻¹ + refine ⟨N, ?_⟩ + have hpow_lt_units : delta ^ N < gamma := by + have hinv : (delta⁻¹ ^ N)⁻¹ < (gamma⁻¹)⁻¹ := inv_lt_inv' hN + simpa [inv_pow] using hinv + have hpow_lt : + ((delta ^ N : F.mrangeValueGroupˣ) : F.mrangeValueGroup) < + (gamma : F.mrangeValueGroup) := by + exact Units.val_lt_val.2 hpow_lt_units + simpa [delta, _root_.Valuation.map_pow, Nat.cast_pow] using + hpow_lt + +/-- The rational embedding from `ℚ` with its `p`-adic valuation topology to +`K` with the range-restricted local-field topology is uniformly continuous. -/ +theorem ratCastWithValToK_uniformContinuous + (F : LocalField.{u, v} K) [CharZero K] : + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF + UniformContinuous + ((Rat.castHom K).comp + (WithVal.equiv + (Rat.padicValuation F.residueCharacteristic)).toRingHom) := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + let f : WithVal (Rat.padicValuation F.residueCharacteristic) → K := + ((Rat.castHom K).comp + (WithVal.equiv + (Rat.padicValuation F.residueCharacteristic)).toRingHom) + let vq := Rat.padicValuation F.residueCharacteristic + let vWith : _root_.Valuation (WithVal vq) ℤᵐ⁰ := Valued.v + let w : _root_.Valuation K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F.toCompleteDVF + change UniformContinuous f + refine + ((Valued.hasBasis_uniformity + (WithVal (Rat.padicValuation F.residueCharacteristic)) + ℤᵐ⁰).uniformContinuous_iff + (Valued.hasBasis_uniformity K F.mrangeValueGroup)).2 ?_ + intro gamma _ + let gamma' : F.mrangeValueGroupˣ := + Units.map + MonoidWithZeroHom.ValueGroup₀.embedding.toMonoidHom gamma + obtain ⟨N, hN⟩ := + F.mrangeRestrict_exists_residueCharacteristic_pow_lt_unit gamma' + let pNQ : ℚ := ((F.residueCharacteristic ^ N : ℕ) : ℚ) + have hpN_nat_ne : F.residueCharacteristic ^ N ≠ 0 := + pow_ne_zero N F.residueCharacteristic_ne_zero + have hpNQ_ne : pNQ ≠ 0 := by + simpa [pNQ] using + (Nat.cast_ne_zero.mpr hpN_nat_ne : + ((F.residueCharacteristic ^ N : ℕ) : ℚ) ≠ 0) + let pNW : WithVal vq := (WithVal.equiv vq).symm pNQ + have hpNW_ne : vWith pNW ≠ 0 := by + change vq pNQ ≠ 0 + exact (vq.pos_iff.2 hpNQ_ne).ne' + have hpNW_restrict_ne : vWith.restrict pNW ≠ 0 := by + simpa using hpNW_ne + let delta : + (MonoidWithZeroHom.ValueGroup₀ (.ofClass vWith))ˣ := + Units.mk0 (vWith.restrict pNW) hpNW_restrict_ne + refine ⟨delta, trivial, ?_⟩ + intro x y hxy + let xq : ℚ := + WithVal.equiv (Rat.padicValuation F.residueCharacteristic) x + let yq : ℚ := + WithVal.equiv (Rat.padicValuation F.residueCharacteristic) y + have hpadic : + Rat.padicValuation F.residueCharacteristic (yq - xq) < + Rat.padicValuation F.residueCharacteristic pNQ := by + change vq (yq - xq) < vq pNQ + change vWith.restrict (y - x) < vWith.restrict pNW at hxy + have hvWith : vWith (y - x) < vWith pNW := + (_root_.Valuation.restrict_lt_iff vWith).1 hxy + change vq (yq - xq) < vq pNQ at hvWith + exact hvWith + have hcomap : + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F.toCompleteDVF + ((yq - xq : ℚ) : K) < + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F.toCompleteDVF ((pNQ : ℚ) : K) := by + have hEquiv := + F.ratCast_mrangeRestrict_valuation_isEquiv_padicValuation + have hlt := + (hEquiv.lt_iff_lt (x := yq - xq) (y := pNQ)).2 hpadic + simpa [pNQ] using hlt + have hfsub : + f y - f x = ((yq - xq : ℚ) : K) := by + simp [f, xq, yq] + change (Valued.v : _root_.Valuation K F.mrangeValueGroup).restrict (f y - f x) < gamma + rw [_root_.Valuation.restrict_lt_iff_lt_embedding] + change w (f y - f x) < (gamma' : F.mrangeValueGroup) + calc + w (f y - f x) = w ((yq - xq : ℚ) : K) := by + rw [hfsub] + _ < w ((pNQ : ℚ) : K) := hcomap + _ = w (((F.residueCharacteristic ^ N : ℕ) : K)) := by + congr 1 + simp [pNQ] + _ < gamma' := hN + +/-- The topology induced on the rational prime field from the range-restricted +local-field topology is exactly the usual `p`-adic topology. -/ +theorem ratCastWithValToK_isUniformInducing + (F : LocalField.{u, v} K) [CharZero K] : + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF + IsUniformInducing + ((Rat.castHom K).comp + (WithVal.equiv + (Rat.padicValuation F.residueCharacteristic)).toRingHom) := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + let f : WithVal (Rat.padicValuation F.residueCharacteristic) → K := + ((Rat.castHom K).comp + (WithVal.equiv + (Rat.padicValuation F.residueCharacteristic)).toRingHom) + let vq := Rat.padicValuation F.residueCharacteristic + let vWith : _root_.Valuation (WithVal vq) ℤᵐ⁰ := Valued.v + let w : _root_.Valuation K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F.toCompleteDVF + change IsUniformInducing f + refine + ((Valued.hasBasis_uniformity + (WithVal (Rat.padicValuation F.residueCharacteristic)) + ℤᵐ⁰).isUniformInducing_iff + (Valued.hasBasis_uniformity K F.mrangeValueGroup)).2 ?_ + constructor + · exact + ((Valued.hasBasis_uniformity + (WithVal (Rat.padicValuation F.residueCharacteristic)) + ℤᵐ⁰).uniformContinuous_iff + (Valued.hasBasis_uniformity K F.mrangeValueGroup)).1 + F.ratCastWithValToK_uniformContinuous + · intro delta _ + obtain ⟨q, hq⟩ := + Rat.surjective_padicValuation F.residueCharacteristic + (MonoidWithZeroHom.ValueGroup₀.embedding + (delta : + MonoidWithZeroHom.ValueGroup₀ (.ofClass vWith))) + have hq_ne : q ≠ 0 := by + intro hzero + have hdelta_zero : + MonoidWithZeroHom.ValueGroup₀.embedding + (delta : + MonoidWithZeroHom.ValueGroup₀ (.ofClass vWith)) = 0 := by + simpa [hzero] using hq.symm + exact + (MonoidWithZeroHom.ValueGroup₀.embedding_unit_ne_zero delta) + hdelta_zero + have hqK_ne : ((q : ℚ) : K) ≠ 0 := by + exact Rat.cast_ne_zero.mpr hq_ne + have hvalue_ne : + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F.toCompleteDVF ((q : ℚ) : K) ≠ 0 := by + rw [← Subtype.coe_ne_coe] + simpa [_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_apply] using + ((F.toCompleteDVF.valuation.pos_iff).2 hqK_ne).ne' + have hrestrict_ne : w.restrict ((q : ℚ) : K) ≠ 0 := by + simpa using hvalue_ne + let gamma : + (MonoidWithZeroHom.ValueGroup₀ (.ofClass w))ˣ := + Units.mk0 (w.restrict ((q : ℚ) : K)) hrestrict_ne + refine ⟨gamma, trivial, ?_⟩ + intro x y hxy + let xq : ℚ := + WithVal.equiv (Rat.padicValuation F.residueCharacteristic) x + let yq : ℚ := + WithVal.equiv (Rat.padicValuation F.residueCharacteristic) y + have hfsub : + f y - f x = ((yq - xq : ℚ) : K) := by + simp [f, xq, yq] + have hcomap : + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F.toCompleteDVF ((yq - xq : ℚ) : K) < + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F.toCompleteDVF ((q : ℚ) : K) := by + change w.restrict (f y - f x) < w.restrict ((q : ℚ) : K) at hxy + rw [hfsub] at hxy + exact (_root_.Valuation.restrict_lt_iff w).1 hxy + have hpadic : + Rat.padicValuation F.residueCharacteristic (yq - xq) < + Rat.padicValuation F.residueCharacteristic q := by + have hEquiv := + F.ratCast_mrangeRestrict_valuation_isEquiv_padicValuation + exact (hEquiv.lt_iff_lt (x := yq - xq) (y := q)).1 hcomap + change vWith.restrict (y - x) < delta + rw [_root_.Valuation.restrict_lt_iff_lt_embedding] + change + vq (yq - xq) < + MonoidWithZeroHom.ValueGroup₀.embedding + (delta : + MonoidWithZeroHom.ValueGroup₀ (.ofClass vWith)) + simpa [hq] using hpadic + +/-- The rational embedding from p-adically valued `ℚ` to the closed `Qp` +candidate is uniformly continuous. -/ +theorem ratCastWithValToQpadicClosureSubfield_uniformContinuous + (F : LocalField.{u, v} K) [CharZero K] : + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF + UniformContinuous F.ratCastWithValToQpadicClosureSubfield := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + exact + F.ratCastWithValToK_uniformContinuous.subtype_mk + (fun q => F.ratCast_mem_qpadicClosureSubfield + ((WithVal.equiv + (Rat.padicValuation F.residueCharacteristic) q : ℚ))) + +/-- The closed `Qp` candidate carries exactly the subspace topology induced +from the p-adic topology on the rational prime field. -/ +theorem ratCastWithValToQpadicClosureSubfield_isUniformInducing + (F : LocalField.{u, v} K) [CharZero K] : + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF + IsUniformInducing F.ratCastWithValToQpadicClosureSubfield := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + have hK : + IsUniformInducing + (((↑) : F.qpadicClosureSubfield → K) ∘ + F.ratCastWithValToQpadicClosureSubfield) := by + simpa [Function.comp_def, ratCastWithValToQpadicClosureSubfield, + ratCastToQpadicClosureSubfield] using + F.ratCastWithValToK_isUniformInducing + exact + (isUniformInducing_val + (F.qpadicClosureSubfield : Set K)).of_comp_iff.1 hK + +/-- The p-adically valued rational embedding has dense range in the closed +`Qp` candidate. -/ +theorem ratCastWithValToQpadicClosureSubfield_denseRange + (F : LocalField.{u, v} K) [CharZero K] : + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF + DenseRange F.ratCastWithValToQpadicClosureSubfield := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + let i : ↥(F.ratSubfield : Set K) → F.qpadicClosureSubfield := + Set.inclusion + (show (F.ratSubfield : Set K) ⊆ + (F.qpadicClosureSubfield : Set K) from + F.ratSubfield_le_qpadicClosureSubfield) + let j : WithVal (Rat.padicValuation F.residueCharacteristic) → + ↥(F.ratSubfield : Set K) := + fun q => + ⟨((WithVal.equiv + (Rat.padicValuation F.residueCharacteristic) q : ℚ) : K), + F.ratCast_mem_ratSubfield + ((WithVal.equiv + (Rat.padicValuation F.residueCharacteristic) q : ℚ))⟩ + have hi : DenseRange i := by + simpa only [i] using + F.ratSubfield_denseRange_in_qpadicClosureSubfield + have hj : Function.Surjective j := by + intro z + rcases z.2 with ⟨q, hq⟩ + refine ⟨(WithVal.equiv + (Rat.padicValuation F.residueCharacteristic)).symm q, ?_⟩ + ext + simpa [j, ratSubfield] using hq + have hcomp : DenseRange (i ∘ j) := + hi.comp hj.denseRange (continuous_inclusion _) + have hfun : i ∘ j = F.ratCastWithValToQpadicClosureSubfield := by + funext q + apply Subtype.ext + rfl + rw [hfun] at hcomp + exact hcomp + +/-- The ordinary rational embedding has dense range in the closed `Qp` +candidate. -/ +theorem ratCastToQpadicClosureSubfield_denseRange + (F : LocalField.{u, v} K) [CharZero K] : + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF + DenseRange F.ratCastToQpadicClosureSubfield := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + apply DenseRange.of_comp + (g := WithVal.equiv + (Rat.padicValuation F.residueCharacteristic)) + simpa [Function.comp_def, ratCastWithValToQpadicClosureSubfield] + using F.ratCastWithValToQpadicClosureSubfield_denseRange + +/-- The extension of the rational embedding to the `p`-adic completion, +landing in the closed `Qp` candidate inside `K`. -/ +noncomputable def qpadicCompletionToQpadicClosureSubfield + (F : LocalField.{u, v} K) [CharZero K] : + (Rat.padicValuation F.residueCharacteristic).Completion →+* + F.qpadicClosureSubfield := by + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + letI : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + haveI : CompleteSpace F.qpadicClosureSubfield := + F.qpadicClosureSubfield_completeSpace + exact + UniformSpace.Completion.extensionHom + F.ratCastWithValToQpadicClosureSubfield + F.ratCastWithValToQpadicClosureSubfield_uniformContinuous.continuous + +/-- +Establishes the identity `F.qpadicCompletionToQpadicClosureSubfield q = +F.ratCastWithValToQpadicClosureSubfield q`. +-/ +theorem qpadicCompletionToQpadicClosureSubfield_coe + (F : LocalField.{u, v} K) [CharZero K] + (q : WithVal (Rat.padicValuation F.residueCharacteristic)) : + F.qpadicCompletionToQpadicClosureSubfield q = + F.ratCastWithValToQpadicClosureSubfield q := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + let : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + have : CompleteSpace F.qpadicClosureSubfield := + F.qpadicClosureSubfield_completeSpace + exact + UniformSpace.Completion.extensionHom_coe + F.ratCastWithValToQpadicClosureSubfield + F.ratCastWithValToQpadicClosureSubfield_uniformContinuous.continuous q + +/-- The completion map from the `p`-adically valued rationals to the closed +`Qp` candidate is a uniform inducing map. -/ +theorem qpadicCompletionToQpadicClosureSubfield_isUniformInducing + (F : LocalField.{u, v} K) [CharZero K] : + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF + letI : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + IsUniformInducing F.qpadicCompletionToQpadicClosureSubfield := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + let : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + have : CompleteSpace F.qpadicClosureSubfield := + F.qpadicClosureSubfield_completeSpace + simpa [qpadicCompletionToQpadicClosureSubfield, + UniformSpace.Completion.extensionHom] using + UniformSpace.Completion.isUniformInducing_extension + (f := F.ratCastWithValToQpadicClosureSubfield) + F.ratCastWithValToQpadicClosureSubfield_isUniformInducing + +/-- The completion extension still has dense range in the closed `Qp` +candidate. -/ +theorem qpadicCompletionToQpadicClosureSubfield_denseRange + (F : LocalField.{u, v} K) [CharZero K] : + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF + letI : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + DenseRange F.qpadicCompletionToQpadicClosureSubfield := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + let : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + apply DenseRange.of_comp + (g := fun q : WithVal (Rat.padicValuation F.residueCharacteristic) => + (q : (Rat.padicValuation F.residueCharacteristic).Completion)) + simpa [Function.comp_def, + F.qpadicCompletionToQpadicClosureSubfield_coe] using + F.ratCastWithValToQpadicClosureSubfield_denseRange + +/-- The induced map from the actual `p`-adic number field to the closed `Qp` +candidate inside `K`. -/ +noncomputable def qpadicNumbersToQpadicClosureSubfield + (F : LocalField.{u, v} K) [CharZero K] : + ℚ_[F.residueCharacteristic] →+* F.qpadicClosureSubfield := + F.qpadicCompletionToQpadicClosureSubfield.comp + (Padic.withValRingEquiv + (p := F.residueCharacteristic)).symm.toRingHom + +/-- +Establishes the identity `F.qpadicNumbersToQpadicClosureSubfield (q : ℚ_[F.residueCharacteristic]) += F.ratCastToQpadicClosureSubfield q`. +-/ +theorem qpadicNumbersToQpadicClosureSubfield_ratCast + (F : LocalField.{u, v} K) [CharZero K] (q : ℚ) : + F.qpadicNumbersToQpadicClosureSubfield + (q : ℚ_[F.residueCharacteristic]) = + F.ratCastToQpadicClosureSubfield q := by + let vq := Rat.padicValuation F.residueCharacteristic + let e := Padic.withValRingEquiv (p := F.residueCharacteristic) + have hcast : + e (((WithVal.equiv vq).symm q : WithVal vq) : + vq.Completion) = + (q : ℚ_[F.residueCharacteristic]) := by + rw [Padic.coe_withValRingEquiv] + simpa [vq, Function.comp_def] using + (UniformSpace.Completion.extension_coe + (f := ((Rat.castHom ℚ_[F.residueCharacteristic]).comp + (WithVal.equiv (Rat.padicValuation F.residueCharacteristic)).toRingHom : + WithVal (Rat.padicValuation F.residueCharacteristic) → + ℚ_[F.residueCharacteristic])) + (Padic.isUniformInducing_cast_withVal + (p := F.residueCharacteristic)).uniformContinuous + ((WithVal.equiv (Rat.padicValuation F.residueCharacteristic)).symm q)) + have hsymm : + e.symm (q : ℚ_[F.residueCharacteristic]) = + (((WithVal.equiv vq).symm q : WithVal vq) : + vq.Completion) := by + apply e.injective + rw [RingEquiv.apply_symm_apply] + exact hcast.symm + calc + F.qpadicNumbersToQpadicClosureSubfield + (q : ℚ_[F.residueCharacteristic]) + = F.qpadicCompletionToQpadicClosureSubfield + (e.symm (q : ℚ_[F.residueCharacteristic])) := rfl + _ = F.qpadicCompletionToQpadicClosureSubfield + (((WithVal.equiv vq).symm q : WithVal vq) : + vq.Completion) := by + rw [hsymm] + _ = F.ratCastWithValToQpadicClosureSubfield + ((WithVal.equiv vq).symm q) := by + simpa [vq] using + F.qpadicCompletionToQpadicClosureSubfield_coe + ((WithVal.equiv vq).symm q) + _ = F.ratCastToQpadicClosureSubfield q := by + ext + simp [ratCastWithValToQpadicClosureSubfield, vq] + +/-- The actual `ℚ_[p]` map to the closed `Qp` candidate is a uniform inducing +map. -/ +theorem qpadicNumbersToQpadicClosureSubfield_isUniformInducing + (F : LocalField.{u, v} K) [CharZero K] : + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF + letI : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + IsUniformInducing F.qpadicNumbersToQpadicClosureSubfield := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + let : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + have hcomp : + IsUniformInducing + (F.qpadicCompletionToQpadicClosureSubfield ∘ + (Padic.withValUniformEquiv + (p := F.residueCharacteristic)).symm) := + F.qpadicCompletionToQpadicClosureSubfield_isUniformInducing.comp + (Padic.withValUniformEquiv + (p := F.residueCharacteristic)).symm.isUniformInducing + have hinv : + ⇑(Padic.withValUniformEquiv + (p := F.residueCharacteristic)).symm = + ⇑(Padic.withValRingEquiv + (p := F.residueCharacteristic)).symm := by + funext x + exact congrArg + (fun e : + (Rat.padicValuation F.residueCharacteristic).Completion ≃ + ℚ_[F.residueCharacteristic] => e.symm x) + Padic.toEquiv_withValUniformEquiv_eq_toEquiv_withValRingEquiv + change + IsUniformInducing + (F.qpadicCompletionToQpadicClosureSubfield ∘ + ⇑(Padic.withValRingEquiv + (p := F.residueCharacteristic)).symm) + rw [← hinv] + exact hcomp + +/-- The image of the `ℚ_[p]` map is closed in the closed `Qp` candidate. -/ +theorem qpadicNumbersToQpadicClosureSubfield_isClosed_range + (F : LocalField.{u, v} K) [CharZero K] : + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF + letI : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + IsClosed (Set.range F.qpadicNumbersToQpadicClosureSubfield) := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + let : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + have hEmbedding : + IsUniformEmbedding F.qpadicNumbersToQpadicClosureSubfield := + ⟨F.qpadicNumbersToQpadicClosureSubfield_isUniformInducing, + RingHom.injective _⟩ + exact hEmbedding.isClosedEmbedding.isClosed_range + +/-- The map from `ℚ_[p]` to the closed `Qp` candidate has dense range. -/ +theorem qpadicNumbersToQpadicClosureSubfield_denseRange + (F : LocalField.{u, v} K) [CharZero K] : + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF + letI : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + DenseRange F.qpadicNumbersToQpadicClosureSubfield := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + let : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + apply DenseRange.of_comp + (g := ((↑) : ℚ → ℚ_[F.residueCharacteristic])) + have hfun : + F.qpadicNumbersToQpadicClosureSubfield ∘ + ((↑) : ℚ → ℚ_[F.residueCharacteristic]) = + F.ratCastToQpadicClosureSubfield := by + funext q + exact F.qpadicNumbersToQpadicClosureSubfield_ratCast q + rw [hfun] + exact F.ratCastToQpadicClosureSubfield_denseRange + +/-- The dense closed embedding from `ℚ_[p]` onto the closed `Qp` candidate is +surjective. -/ +theorem qpadicNumbersToQpadicClosureSubfield_surjective + (F : LocalField.{u, v} K) [CharZero K] : + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF + letI : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + Function.Surjective F.qpadicNumbersToQpadicClosureSubfield := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + let : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + rw [← Set.range_eq_univ] + have hdense := F.qpadicNumbersToQpadicClosureSubfield_denseRange + have hclosed := F.qpadicNumbersToQpadicClosureSubfield_isClosed_range + exact hclosed.closure_eq.symm.trans hdense.closure_range + +/-- The closed subfield generated by `ℚ` inside a mixed-characteristic local +field is canonically isomorphic to the actual `p`-adic number field. -/ +noncomputable def qpadicNumbersEquivQpadicClosureSubfield + (F : LocalField.{u, v} K) [CharZero K] : + ℚ_[F.residueCharacteristic] ≃+* F.qpadicClosureSubfield := + RingEquiv.ofBijective F.qpadicNumbersToQpadicClosureSubfield + ⟨RingHom.injective _, + F.qpadicNumbersToQpadicClosureSubfield_surjective⟩ + +/-- +The defining evaluation formula for `qpadicNumbersEquivQpadicClosureSubfield` is +`F.qpadicNumbersEquivQpadicClosureSubfield x = F.qpadicNumbersToQpadicClosureSubfield x`. +-/ +theorem qpadicNumbersEquivQpadicClosureSubfield_apply + (F : LocalField.{u, v} K) [CharZero K] + (x : ℚ_[F.residueCharacteristic]) : + F.qpadicNumbersEquivQpadicClosureSubfield x = + F.qpadicNumbersToQpadicClosureSubfield x := + rfl + +/-- +Establishes the identity `F.qpadicNumbersEquivQpadicClosureSubfield (q : +ℚ_[F.residueCharacteristic]) = F.ratCastToQpadicClosureSubfield q`. +-/ +theorem qpadicNumbersEquivQpadicClosureSubfield_ratCast + (F : LocalField.{u, v} K) [CharZero K] (q : ℚ) : + F.qpadicNumbersEquivQpadicClosureSubfield + (q : ℚ_[F.residueCharacteristic]) = + F.ratCastToQpadicClosureSubfield q := by + simp + +/-- The closed `Qp` candidate has the induced nontrivial normed-field +structure. The residue characteristic itself has norm different from one. -/ +@[implicit_reducible] +noncomputable def qpadicClosureSubfieldNontriviallyNormedField + (F : LocalField.{u, v} K) [CharZero K] : + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF + letI : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + NontriviallyNormedField F.qpadicClosureSubfield := by + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + haveI : + (Valued.v : _root_.Valuation K F.mrangeValueGroup).RankOne := by + change + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F.toCompleteDVF).RankOne + exact + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictRankOne + F.toCompleteDVF + letI : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + let pSub : F.qpadicClosureSubfield := + F.ratCastToQpadicClosureSubfield (F.residueCharacteristic : ℚ) + have hpSub_coe : + (pSub : K) = (F.residueCharacteristic : K) := by + simp [pSub] + refine NontriviallyNormedField.ofNormNeOne ?_ + refine ⟨pSub, ?_, ?_⟩ + · intro hp + have hpK : (pSub : K) = 0 := by + simpa using congrArg Subtype.val hp + rw [hpSub_coe] at hpK + exact F.natCast_residueCharacteristic_ne_zero_of_charZero hpK + · have hpVal_lt_one : + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F.toCompleteDVF + (F.residueCharacteristic : K) < 1 := by + rw [← Subtype.coe_lt_coe] + simpa [_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_apply] using + F.valuation_natCast_residueCharacteristic_lt_one + have hpNorm_lt_one_K : + ‖(F.residueCharacteristic : K)‖ < 1 := by + simpa [_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued] using + (Valued.toNormedField.norm_lt_one_iff + (x := (F.residueCharacteristic : K))).2 hpVal_lt_one + have hpNorm_lt_one : ‖pSub‖ < 1 := by + change ‖(pSub : K)‖ < 1 + simpa [hpSub_coe] using hpNorm_lt_one_K + exact ne_of_lt hpNorm_lt_one + +/-- The ambient local field is a normed algebra over the closed `Qp` +candidate, using the induced subfield norm. -/ +@[implicit_reducible] +noncomputable def qpadicClosureSubfieldNormedAlgebra + (F : LocalField.{u, v} K) [CharZero K] : + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF + letI : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + letI : NontriviallyNormedField F.qpadicClosureSubfield := + F.qpadicClosureSubfieldNontriviallyNormedField + NormedAlgebra F.qpadicClosureSubfield K := by + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + letI : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + letI : NontriviallyNormedField F.qpadicClosureSubfield := + F.qpadicClosureSubfieldNontriviallyNormedField + exact + { (inferInstance : Algebra F.qpadicClosureSubfield K) with + norm_smul_le := fun a x => by + change ‖(a : K) * x‖ ≤ ‖(a : K)‖ * ‖x‖ + exact norm_mul_le (a : K) x } + +/-- A mixed-characteristic local field is finite-dimensional over the closed +subfield generated by its rational prime field. -/ +theorem finiteDimensional_over_qpadicClosureSubfield + (F : LocalField.{u, v} K) [CharZero K] : + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF + letI : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + letI : NontriviallyNormedField F.qpadicClosureSubfield := + F.qpadicClosureSubfieldNontriviallyNormedField + letI : NormedAlgebra F.qpadicClosureSubfield K := + F.qpadicClosureSubfieldNormedAlgebra + FiniteDimensional F.qpadicClosureSubfield K := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + let : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + let : NontriviallyNormedField F.qpadicClosureSubfield := + F.qpadicClosureSubfieldNontriviallyNormedField + let : NormedAlgebra F.qpadicClosureSubfield K := + F.qpadicClosureSubfieldNormedAlgebra + have : ProperSpace K := + F.mrangeRestrict_properSpace + have : CompleteSpace F.qpadicClosureSubfield := + (F.qpadicClosureSubfield_isClosed : IsClosed + (F.qpadicClosureSubfield : Set K)).completeSpace_coe + exact + FiniteDimensional.of_locallyCompactSpace F.qpadicClosureSubfield + +/-- The actual `p`-adic number field acts on `K` through the canonical +isomorphism with the closed `Qp` candidate and the inclusion into `K`. -/ +@[implicit_reducible] +noncomputable def qpadicNumbersAlgebra + (F : LocalField.{u, v} K) [CharZero K] : + Algebra ℚ_[F.residueCharacteristic] K := + RingHom.toAlgebra + (F.qpadicClosureSubfield.subtype.comp + (F.qpadicNumbersEquivQpadicClosureSubfield : + ℚ_[F.residueCharacteristic] →+* F.qpadicClosureSubfield)) + +/-- +The `ℚ_p` algebra map into the local field is the canonical equivalence onto the closed `p`-adic +subfield followed by inclusion. +-/ +theorem qpadicNumbersAlgebra_algebraMap + (F : LocalField.{u, v} K) [CharZero K] : + letI : Algebra ℚ_[F.residueCharacteristic] K := + F.qpadicNumbersAlgebra + algebraMap ℚ_[F.residueCharacteristic] K = + F.qpadicClosureSubfield.subtype.comp + (F.qpadicNumbersEquivQpadicClosureSubfield : + ℚ_[F.residueCharacteristic] →+* F.qpadicClosureSubfield) := by + rfl + +/-- +The `ℚ_p` algebra map sends an element to the underlying field element of its image in the closed +`p`-adic subfield. +-/ +theorem qpadicNumbersAlgebra_algebraMap_apply + (F : LocalField.{u, v} K) [CharZero K] + (x : ℚ_[F.residueCharacteristic]) : + letI : Algebra ℚ_[F.residueCharacteristic] K := + F.qpadicNumbersAlgebra + algebraMap ℚ_[F.residueCharacteristic] K x = + (F.qpadicNumbersEquivQpadicClosureSubfield x : K) := by + rfl + +/-- Mixed-characteristic local fields are finite-dimensional over the actual +`p`-adic number field. This transports the finite-dimensionality already +proved over the closed `Qp` candidate along the canonical field isomorphism. -/ +theorem finiteDimensional_over_qpadicNumbers + (F : LocalField.{u, v} K) [CharZero K] : + letI : Algebra ℚ_[F.residueCharacteristic] K := + F.qpadicNumbersAlgebra + FiniteDimensional ℚ_[F.residueCharacteristic] K := by + let : Algebra ℚ_[F.residueCharacteristic] K := + F.qpadicNumbersAlgebra + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + let : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + let : NontriviallyNormedField F.qpadicClosureSubfield := + F.qpadicClosureSubfieldNontriviallyNormedField + let : NormedAlgebra F.qpadicClosureSubfield K := + F.qpadicClosureSubfieldNormedAlgebra + have : FiniteDimensional F.qpadicClosureSubfield K := + F.finiteDimensional_over_qpadicClosureSubfield + have hcompat : + (algebraMap F.qpadicClosureSubfield K).comp + (F.qpadicNumbersEquivQpadicClosureSubfield : + ℚ_[F.residueCharacteristic] →+* F.qpadicClosureSubfield) = + (RingEquiv.refl K).toRingHom.comp + (algebraMap ℚ_[F.residueCharacteristic] K) := by + ext x + rfl + have hrank : + Module.rank ℚ_[F.residueCharacteristic] K = + Module.rank F.qpadicClosureSubfield K := by + simpa using + (Algebra.rank_eq_of_equiv_equiv + F.qpadicNumbersEquivQpadicClosureSubfield + (RingEquiv.refl K) hcompat) + exact + FiniteDimensional.of_rank_eq_nat + (n := Module.finrank F.qpadicClosureSubfield K) <| by + simpa [Module.finrank_eq_rank'] using hrank + +/-- The local-field structure classification, mixed-characteristic converse branch: a characteristic +zero local field is a finite-dimensional extension of the `p`-adic field for +its residue characteristic `p`. The algebra structure is the canonical one +through the closed copy of `Qp` constructed above. -/ +theorem mixedCharacteristic_exists_qpadic_finiteExtension + (F : LocalField.{u, v} K) [CharZero K] : + ∃ p : ℕ, p = F.residueCharacteristic ∧ + ∃ hp : Nat.Prime p, + letI : Fact p.Prime := ⟨hp⟩ + ∃ hAlg : Algebra ℚ_[p] K, + letI : Algebra ℚ_[p] K := hAlg + FiniteDimensional ℚ_[p] K := by + refine + ⟨F.residueCharacteristic, rfl, F.residueCharacteristic_prime, ?_⟩ + exact + ⟨F.qpadicNumbersAlgebra, F.finiteDimensional_over_qpadicNumbers⟩ + +end LocalField +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure.lean new file mode 100644 index 0000000000..b5b343bb5b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.DeepPrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.IntegralLattice + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean new file mode 100644 index 0000000000..d78196ce33 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean @@ -0,0 +1,604 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.DeepPrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.IntegralLattice +/-! +# First principal units in mixed characteristic + +This module combines the deep free `Z_p` lattice with the finite quotient +exact sequence and packages the algebraic and topological structure of +the first principal-unit group. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + toPrincipalUnitFiltration → + toPrincipalUnitFiltration + + +noncomputable +section + +universe u v + +namespace LocalFieldTheory.DiscreteValuationField +namespace LocalField + +open scoped WithZero nonZeroDivisors +open Module + +variable {K : Type u} [Field K] + +/-! ### The finite-level exact sequence and the first principal units -/ + +/-- Proof-relevant output of the finite-kernel/finite-quotient PID argument. -/ +structure FiniteRankTorsionProjectionData + (R M Q : Type*) [CommRing R] + [AddCommGroup M] [AddCommGroup Q] [Module R M] [Module R Q] + (f : M →ₗ[R] Q) (d : ℕ) where + /-- The middle module is finitely generated over `R`. -/ + moduleFinite : Module.Finite R M + /-- The torsion submodule of the middle module is finite. -/ + finiteTorsion : Finite (Submodule.torsion R M) + /-- The restriction of `f` to the torsion submodule is injective. -/ + torsionProjection_injective : + Function.Injective (f.domRestrict (Submodule.torsion R M)) + /-- The middle module has `R`-finrank `d`. -/ + finrankMiddle : Module.finrank R M = d + /-- The torsion-free quotient of the middle module has `R`-finrank `d`. -/ + finrankFree : + Module.finrank R (M ⧸ Submodule.torsion R M) = d + +/-- A finite quotient together with its free kernel data. -/ +structure FiniteQuotientSetup + (R M Q : Type*) [CommRing R] + [AddCommGroup M] [AddCommGroup Q] [Module R M] [Module R Q] + (d : ℕ) where + /-- The linear projection from the middle module to the quotient. -/ + projection : M →ₗ[R] Q + /-- The projection onto the quotient is surjective. -/ + projection_surjective : Function.Surjective projection + /-- The kernel of the projection is finitely generated over `R`. -/ + kernelFinite : Module.Finite R (LinearMap.ker projection) + /-- The kernel of the projection is free over `R`. -/ + kernelFree : Module.Free R (LinearMap.ker projection) + /-- The kernel of the projection has `R`-finrank `d`. -/ + kernelFinrank : Module.finrank R (LinearMap.ker projection) = d + /-- The quotient module is torsion over `R`. -/ + quotientTorsion : Module.IsTorsion R Q + +/-- The projection-free form of the finite-rank/torsion output. Keeping the +large concrete quotient map out of downstream result types substantially +reduces elaboration. -/ +structure FiniteRankTorsionData + (R M Q : Type*) [CommRing R] + [AddCommGroup M] [AddCommGroup Q] [Module R M] [Module R Q] + (d : ℕ) where + /-- The middle module is finitely generated over `R`. -/ + moduleFinite : Module.Finite R M + /-- The torsion submodule of the middle module is finite. -/ + finiteTorsion : Finite (Submodule.torsion R M) + /-- A linear map from the torsion submodule into the quotient module. -/ + torsionProjection : Submodule.torsion R M →ₗ[R] Q + /-- The torsion projection is injective. -/ + torsionProjection_injective : Function.Injective torsionProjection + /-- The middle module has `R`-finrank `d`. -/ + finrankMiddle : Module.finrank R M = d + /-- The torsion-free quotient of the middle module has `R`-finrank `d`. -/ + finrankFree : + Module.finrank R (M ⧸ Submodule.torsion R M) = d + +/-- Algebraic bookkeeping for a finite torsion quotient of a finite free +kernel. This is the PID step used in the mixed-characteristic field-unit structure theorem: it + proves finite +generation and rank of the middle term, and embeds its torsion into the +finite quotient. -/ +theorem finite_rank_and_torsion_projection_of_surjective + {R M Q : Type*} [CommRing R] [IsDomain R] + [IsPrincipalIdealRing R] + [AddCommGroup M] [AddCommGroup Q] [Module R M] [Module R Q] + (f : M →ₗ[R] Q) (hf : Function.Surjective f) + [Finite Q] [Module.Finite R Q] + [Module.Finite R (LinearMap.ker f)] [Module.Free R (LinearMap.ker f)] + (d : ℕ) (hrankKer : Module.finrank R (LinearMap.ker f) = d) + (hQtorsion : Module.IsTorsion R Q) : + FiniteRankTorsionProjectionData R M Q f d := by + let N := LinearMap.ker f + let eQuot : (M ⧸ N) ≃ₗ[R] Q := + LinearMap.quotKerEquivOfSurjective f hf + let : Module.Finite R (M ⧸ N) := Module.Finite.equiv eQuot.symm + let hM : Module.Finite R M := Module.Finite.of_submodule_quotient N + have hquotTorsion : Module.IsTorsion R (M ⧸ N) := by + intro x + rcases @hQtorsion (eQuot x) with ⟨a, ha⟩ + refine ⟨a, ?_⟩ + apply eQuot.injective + calc + eQuot (a • x) = a • eQuot x := eQuot.map_smul a x + _ = 0 := ha + _ = eQuot 0 := (eQuot.map_zero).symm + have hrankQuot : Module.finrank R (M ⧸ N) = 0 := + Module.finrank_eq_zero_iff_isTorsion.mpr hquotTorsion + have hrankM : Module.finrank R M = d := by + have hsum := N.finrank_quotient_add_finrank + rw [hrankQuot, zero_add] at hsum + exact hsum.symm.trans hrankKer + let T := Submodule.torsion R M + let tproj : T →ₗ[R] Q := f.domRestrict T + have htproj : Function.Injective tproj := by + intro x y hxy + apply Subtype.ext + apply sub_eq_zero.mp + have hzero : tproj (x - y) = 0 := by + rw [map_sub, hxy, sub_self] + have hzN : (((x - y : T) : M)) ∈ N := by + change f (((x - y : T) : M)) = 0 + exact hzero + let zN : N := ⟨(((x - y : T) : M)), hzN⟩ + rcases (x - y).property with ⟨a, ha⟩ + have haz : (a : R) • zN = 0 := by + apply Subtype.ext + exact ha + have ha_ne : (a : R) ≠ 0 := + mem_nonZeroDivisors_iff_ne_zero.mp a.property + have hzN_zero : zN = 0 := + (smul_eq_zero.mp haz).resolve_left ha_ne + exact congrArg Subtype.val hzN_zero + let hT : Finite T := Finite.of_injective tproj htproj + let : Module.Finite R T := inferInstance + have hTtorsion : Module.IsTorsion R T := by + intro x + rcases x.property with ⟨a, ha⟩ + refine ⟨a, ?_⟩ + apply Subtype.ext + exact ha + have hrankT : Module.finrank R T = 0 := + Module.finrank_eq_zero_iff_isTorsion.mpr hTtorsion + let : Module.Finite R (M ⧸ T) := Module.Finite.quotient R T + have hrankFree : Module.finrank R (M ⧸ T) = d := by + have hsum := T.finrank_quotient_add_finrank + rw [hrankT, add_zero] at hsum + exact hsum.trans hrankM + exact + { moduleFinite := hM + finiteTorsion := hT + torsionProjection_injective := htproj + finrankMiddle := hrankM + finrankFree := hrankFree } + +/-- Consume a finite quotient setup and forget the concrete quotient map +from the result type. -/ +noncomputable def finiteRankTorsionDataOfSetup + {R M Q : Type*} [CommRing R] [IsDomain R] + [IsPrincipalIdealRing R] + [AddCommGroup M] [AddCommGroup Q] [Module R M] [Module R Q] + [Finite Q] [Module.Finite R Q] + (d : ℕ) (setup : FiniteQuotientSetup R M Q d) : + FiniteRankTorsionData R M Q d := by + letI : Module.Finite R (LinearMap.ker setup.projection) := + setup.kernelFinite + letI : Module.Free R (LinearMap.ker setup.projection) := + setup.kernelFree + let core := finite_rank_and_torsion_projection_of_surjective + setup.projection setup.projection_surjective d + setup.kernelFinrank setup.quotientTorsion + exact + { moduleFinite := core.moduleFinite + finiteTorsion := core.finiteTorsion + torsionProjection := + setup.projection.domRestrict (Submodule.torsion R M) + torsionProjection_injective := core.torsionProjection_injective + finrankMiddle := core.finrankMiddle + finrankFree := core.finrankFree } + +/-- The proof-relevant algebraic package used to assemble the topological +classification of the first principal units. -/ +structure FirstPrincipalUnitAlgebraicData + (R M : Type*) [CommRing R] [AddCommGroup M] [Module R M] + (p d : ℕ) where + /-- The exponent in the prime-power order `p ^ a` of the torsion subgroup. -/ + a : ℕ + /-- The first principal-unit module is finitely generated over `R`. -/ + moduleFinite : Module.Finite R M + /-- The torsion submodule is finite. -/ + finiteTorsion : Finite (Submodule.torsion R M) + /-- The torsion submodule is cyclic as an additive group. -/ + cyclicTorsion : IsAddCyclic (Submodule.torsion R M) + /-- The torsion submodule has cardinality `p ^ a`. -/ + cardTorsion : + letI := finiteTorsion + Nat.card (Submodule.torsion R M) = p ^ a + /-- The torsion-free quotient has `R`-finrank `d`. -/ + finrankFree : + Module.finrank R (M ⧸ Submodule.torsion R M) = d + +/-- A finite additive group that embeds, after changing notation, into the +multiplicative group of a domain is cyclic. Keeping the type-tag conversion at +this general boundary avoids repeating it for complicated submodule types. -/ +theorem isAddCyclic_of_injective_multiplicative_map + {A U D : Type*} [AddGroup A] [Group U] + [CommRing D] [IsDomain D] [Finite A] + (f : A →+ Additive U) (g : U →* D) + (hf : Function.Injective f) (hg : Function.Injective g) : + IsAddCyclic A := by + let fmul : Multiplicative A →* U := + AddMonoidHom.toMultiplicativeLeft f + have hfmul : Function.Injective fmul := by + intro x y hxy + exact Multiplicative.toAdd.injective + (hf (Additive.toMul.injective hxy)) + exact isCyclic_multiplicative_iff.mp + (isCyclic_of_injective_ringHom (g.comp fmul) (hg.comp hfmul)) + +/-- Transfer the prime-power cardinality of a finite additive quotient across +an injective additive map. -/ +theorem exists_card_eq_prime_power_of_injective_addMonoidHom + {p : ℕ} {A B : Type*} [Fact p.Prime] + [AddGroup A] [AddGroup B] [Finite A] + (f : A →+ B) (hf : Function.Injective f) + (hB : IsPGroup p (Multiplicative B)) : + ∃ a : ℕ, Nat.card A = p ^ a := by + let fmul : Multiplicative A →* Multiplicative B := + AddMonoidHom.toMultiplicative f + have hfmul : Function.Injective fmul := by + intro x y hxy + apply Multiplicative.toAdd.injective + apply hf + simpa [fmul] using congrArg Multiplicative.toAdd hxy + obtain ⟨a, ha⟩ := IsPGroup.iff_card.mp (hB.of_injective fmul hfmul) + exact ⟨a, (Nat.card_congr Multiplicative.ofAdd).trans ha⟩ + +/-- A finite free submodule together with its rank. -/ +structure FiniteFreeSubmoduleData + (R M : Type*) [CommRing R] [AddCommGroup M] [Module R M] + (N : Submodule R M) (d : ℕ) where + /-- The submodule `N` is finitely generated over `R`. -/ + moduleFinite : Module.Finite R N + /-- The submodule `N` is free over `R`. -/ + moduleFree : Module.Free R N + /-- The submodule `N` has `R`-finrank `d`. -/ + finrank : Module.finrank R N = d + +/-- The deep logarithmic lattice, viewed inside `U¹`, is finite free of the +field degree. -/ +theorem mixed_principalUnitSuccKernelData + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (hv : Function.Surjective v) + (n : ℕ) + (hlevel : + (ramificationIndexOfWithZeroValuation v : ℚ) / + (((ofWithZeroValuation v).residueCharacteristic : ℚ) - 1) < + (n : ℚ)) : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let p := F.residueCharacteristic + let R := ℤ_[p] + let M := Additive + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) + letI : MixedQPadicContext F := mixedQPadicContext F + letI : Module R M := + CompleteDVF.higherPrincipalUnitGroup.principalUnitPadicModule F + let d := Module.finrank ℚ_[p] K + FiniteFreeSubmoduleData R M + (F.principalUnitSuccPadicSubmodule n) d := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let p : ℕ := F.residueCharacteristic + let R := ℤ_[p] + let M := Additive + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) + let : MixedQPadicContext F := mixedQPadicContext F + let : Module R M := + CompleteDVF.higherPrincipalUnitGroup.principalUnitPadicModule F + let d : ℕ := Module.finrank ℚ_[p] K + let : Algebra R F.toCompleteDVF.valuationSubring := + F.padicIntValuationSubringAlgebra + have hlevelSucc : + (ramificationIndexOfWithZeroValuation v : ℚ) / + ((F.residueCharacteristic : ℚ) - 1) < ((n + 1 : ℕ) : ℚ) := + lt_trans hlevel (by exact_mod_cast Nat.lt_succ_self n) + let hr : 1 ≤ n + 1 := Nat.succ_le_succ (Nat.zero_le n) + let deep := Additive + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) (n + 1)) + let : Module R deep := F.higherPrincipalUnitPadicModule hr + let : Module.Finite R deep := + mixed_deepPrincipalUnit_moduleFinite + v hv (n + 1) hlevelSucc + let eDeep : deep ≃ₗ[R] (Fin d → R) := + mixedDeepPrincipalUnitLinearEquivPi + v hv (n + 1) hlevelSucc + let higher := F.principalUnitSuccPadicSubmodule n + let eHigher : deep ≃ₗ[R] higher := + F.higherPrincipalUnitLinearEquivPadicSubmodule hr + let hHigherFinite : Module.Finite R higher := + F.higherPrincipalUnitPadicSubmodule_moduleFinite hr inferInstance + let : Module.Free R deep := Module.Free.of_equiv eDeep.symm + let hHigherFree : Module.Free R higher := Module.Free.of_equiv eHigher + have hrankDeep : Module.finrank R deep = d := by + simpa [d] using eDeep.finrank_eq + have hrankHigher : Module.finrank R higher = d := by + calc + Module.finrank R higher = Module.finrank R deep := eHigher.finrank_eq.symm + _ = d := hrankDeep + exact + { moduleFinite := hHigherFinite + moduleFree := hHigherFree + finrank := hrankHigher } + +/-- The finite quotient map in the mixed-characteristic field-unit structure theorem, with the +deep logarithmic +lattice identified as its finite free kernel. -/ +noncomputable def mixedFirstPrincipalUnitFiniteQuotientSetup + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (hv : Function.Surjective v) + (n : ℕ) + (hlevel : + (ramificationIndexOfWithZeroValuation v : ℚ) / + (((ofWithZeroValuation v).residueCharacteristic : ℚ) - 1) < + (n : ℚ)) : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let p := F.residueCharacteristic + let R := ℤ_[p] + let M := Additive + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) + letI : MixedQPadicContext F := mixedQPadicContext F + letI : Module R M := + CompleteDVF.higherPrincipalUnitGroup.principalUnitPadicModule F + let d := Module.finrank ℚ_[p] K + let q := + CompleteDVF.higherPrincipalUnitGroup.DiscretePrincipalUnitQuotient + F.toCompleteDVF n + letI : Module R q := + CompleteDVF.higherPrincipalUnitGroup.discretePrincipalUnitQuotientPadicModule F n + FiniteQuotientSetup R M q d := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let p : ℕ := F.residueCharacteristic + let R := ℤ_[p] + let M := Additive + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) + letI : MixedQPadicContext F := mixedQPadicContext F + letI : Module R M := + CompleteDVF.higherPrincipalUnitGroup.principalUnitPadicModule F + let d : ℕ := Module.finrank ℚ_[p] K + let higher := F.principalUnitSuccPadicSubmodule n + let kernelData := mixed_principalUnitSuccKernelData + v hv n hlevel + let q := + CompleteDVF.higherPrincipalUnitGroup.DiscretePrincipalUnitQuotient + F.toCompleteDVF n + letI : Module R q := + CompleteDVF.higherPrincipalUnitGroup.discretePrincipalUnitQuotientPadicModule F n + letI : Finite q := inferInstance + letI : Module.Finite R q := Module.Finite.of_finite + let projection : M →ₗ[R] q := F.principalUnitQuotientProjectionLinear n + let U := + toPrincipalUnitFiltration + F.toCompleteDVF + let quotientKernel := (U.principalUnitSubgroup (n + 1)).subgroupOf + (U.principalUnitSubgroup 1) + have hsur : Function.Surjective projection := by + intro y + obtain ⟨x, hx⟩ := + QuotientGroup.mk'_surjective quotientKernel (Additive.toMul y.val) + refine ⟨Additive.ofMul x, ?_⟩ + apply (CompleteDVF.higherPrincipalUnitGroup.DiscretePrincipalUnitQuotient.addEquiv + F.toCompleteDVF n).injective + apply Additive.toMul.injective + exact hx + let N := LinearMap.ker projection + have hN : N = higher := + F.principalUnitQuotientProjectionLinear_ker n + letI hNFinite : Module.Finite R N := by + rw [hN] + exact kernelData.moduleFinite + letI hNFree : Module.Free R N := by + rw [hN] + exact kernelData.moduleFree + have hrankN : Module.finrank R N = d := by + rw [hN] + exact kernelData.finrank + have hqTorsion : Module.IsTorsion R q := by + intro x + exact F.discretePrincipalUnitQuotient_moduleIsTorsion n (x := x) + exact + { projection := projection + projection_surjective := hsur + kernelFinite := hNFinite + kernelFree := hNFree + kernelFinrank := hrankN + quotientTorsion := hqTorsion } + +/-- Finite torsion in a module on principal units is cyclic, since it embeds in the field. -/ +private theorem isAddCyclic_principalUnit_torsion + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K) (R : Type*) [CommRing R] + [Module R (Additive (CompleteDVF.higherPrincipalUnitGroup F 1))] + [Finite (Submodule.torsion R (Additive (CompleteDVF.higherPrincipalUnitGroup F 1)))] : + IsAddCyclic (Submodule.torsion R (Additive (CompleteDVF.higherPrincipalUnitGroup F 1))) := by + let U1 := CompleteDVF.higherPrincipalUnitGroup F 1 + let T := Submodule.torsion R (Additive U1) + let valuationUnitsToFieldUnits := CompleteDVF.valuationSubringUnitsToFieldUnits F + let principalToField : U1 →* K := + (Units.coeHom K).comp (valuationUnitsToFieldUnits.comp U1.subtype) + have hvaluationUnitsToFieldUnits : Function.Injective valuationUnitsToFieldUnits := by + intro x y hxy + apply Units.ext + apply Subtype.ext + have hxy' := congrArg (fun z : Kˣ => (z : K)) hxy + simpa [valuationUnitsToFieldUnits] using hxy' + have hprincipalToField : Function.Injective principalToField := + Units.val_injective.comp (hvaluationUnitsToFieldUnits.comp Subtype.val_injective) + exact isAddCyclic_of_injective_multiplicative_map (A := T) (U := U1) + T.subtype.toAddMonoidHom principalToField T.subtype_injective hprincipalToField + +/-- Algebraic data for the first principal units in the mixed-characteristic field-unit +structure theorem. +The deep logarithmic lattice supplies the free kernel; the finite-level +principal-unit quotient detects all torsion. -/ +noncomputable def chosenMixedFirstPrincipalUnitAlgebraicData + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (hv : Function.Surjective v) + (n : ℕ) + (hlevel : + (ramificationIndexOfWithZeroValuation v : ℚ) / + (((ofWithZeroValuation v).residueCharacteristic : ℚ) - 1) < + (n : ℚ)) : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let p := F.residueCharacteristic + let R := ℤ_[p] + let M := Additive + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) + letI : MixedQPadicContext F := mixedQPadicContext F + letI : Module R M := + CompleteDVF.higherPrincipalUnitGroup.principalUnitPadicModule F + let d := Module.finrank ℚ_[p] K + FirstPrincipalUnitAlgebraicData R M p d := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let p : ℕ := F.residueCharacteristic + let R := ℤ_[p] + let M := Additive + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) + letI : MixedQPadicContext F := mixedQPadicContext F + letI : Module R M := + CompleteDVF.higherPrincipalUnitGroup.principalUnitPadicModule F + let d : ℕ := Module.finrank ℚ_[p] K + let q := + CompleteDVF.higherPrincipalUnitGroup.DiscretePrincipalUnitQuotient + F.toCompleteDVF n + letI : Module R q := + CompleteDVF.higherPrincipalUnitGroup.discretePrincipalUnitQuotientPadicModule F n + letI : Finite q := inferInstance + letI : Module.Finite R q := Module.Finite.of_finite + let setup := + mixedFirstPrincipalUnitFiniteQuotientSetup + v hv n hlevel + let exactData : FiniteRankTorsionData R M q d := + finiteRankTorsionDataOfSetup d setup + letI : Module.Finite R M := exactData.moduleFinite + let T := Submodule.torsion R M + letI hTAddCommGroup : AddCommGroup T := Submodule.addCommGroup T + letI hTAddGroup : AddGroup T := hTAddCommGroup.toAddGroup + letI hTModule : Module R T := Submodule.module T + letI : Finite T := exactData.finiteTorsion + letI hqAddGroup : AddGroup q := inferInstance + let tproj : T →ₗ[R] q := exactData.torsionProjection + have hqP : IsPGroup p (Multiplicative q) := + F.discretePrincipalUnitQuotient_isPGroup n + let hcardExists := + exists_card_eq_prime_power_of_injective_addMonoidHom + tproj.toAddMonoidHom exactData.torsionProjection_injective hqP + let a : ℕ := Classical.choose hcardExists + have hcard : Nat.card T = p ^ a := + Classical.choose_spec hcardExists + refine + { a := a + moduleFinite := exactData.moduleFinite + finiteTorsion := exactData.finiteTorsion + cyclicTorsion := by + exact isAddCyclic_principalUnit_torsion F.toCompleteDVF R + cardTorsion := hcard + finrankFree := exactData.finrankFree } + +/-- The mixed-characteristic field-unit structure theorem, principal-unit factor in its literal +algebraic and +topological form. The finite torsion is a cyclic `p`-group and the free +factor has rank `[K : Q_p]`. -/ +noncomputable def mixedFirstPrincipalUnitStructure + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (hv : Function.Surjective v) + (n : ℕ) + (hlevel : + (ramificationIndexOfWithZeroValuation v : ℚ) / + (((ofWithZeroValuation v).residueCharacteristic : ℚ) - 1) < + (n : ℚ)) : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let d := Module.finrank ℚ_[F.residueCharacteristic] K + Σ a : ℕ, + Multiplicative + (ZMod (F.residueCharacteristic ^ a) × + (Fin d → ℤ_[F.residueCharacteristic])) ≃ₜ* + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1 := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let p : ℕ := F.residueCharacteristic + let R := ℤ_[p] + let M := Additive + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let d : ℕ := Module.finrank ℚ_[p] K + let T := Submodule.torsion R M + letI : AddCommGroup T := Submodule.addCommGroup T + letI : Module R T := Submodule.module T + let data := + chosenMixedFirstPrincipalUnitAlgebraicData + v hv n hlevel + letI : Module.Finite R M := data.moduleFinite + letI : Finite T := data.finiteTorsion + letI : ContinuousAdd M := + CompleteDVF.higherPrincipalUnitGroup.principalUnitPadicContinuousAddOfWithZeroValuation v + letI : ContinuousSMul R M := + continuousSMul_padicInt_firstPrincipalUnit_ofWithZeroValuation v + letI : CompactSpace M := Module.Finite.compactSpace R M + letI : T2Space M := + T2Space.of_injective_continuous Additive.toMul.injective continuous_toMul + let eAdd := + CompleteDVF.higherPrincipalUnitGroup.chosenPadicModuleContinuousAddEquivZModProdFinPi + p M data.a d data.cyclicTorsion data.cardTorsion data.finrankFree + exact ⟨data.a, continuousMulEquivOfAdditiveTarget eAdd⟩ + +/-- The mixed-characteristic field-unit structure theorem, principal-unit factor with the +logarithmic depth +chosen internally. Thus the statement retains only the hypotheses attached +to the local field and a normalized valuation. -/ +noncomputable def chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (hv : Function.Surjective v) : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let d := Module.finrank ℚ_[F.residueCharacteristic] K + Σ a : ℕ, + Multiplicative + (ZMod (F.residueCharacteristic ^ a) × + (Fin d → ℤ_[F.residueCharacteristic])) ≃ₜ* + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1 := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let hex := exists_nat_gt + ((ramificationIndexOfWithZeroValuation v : ℚ) / + ((F.residueCharacteristic : ℚ) - 1)) + let n : ℕ := Classical.choose hex + have hn := Classical.choose_spec hex + exact mixedFirstPrincipalUnitStructure + v hv n (by simpa [F] using hn) + +end LocalField +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/DeepPrincipalUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/DeepPrincipalUnits.lean new file mode 100644 index 0000000000..84df72882e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/DeepPrincipalUnits.lean @@ -0,0 +1,601 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.IntegralLattice +/-! +# Deep principal units in mixed characteristic + +This module equips the canonical `Z_p` lattice with the normalized valuation +topology and transports integral-basis coordinates through the deep +exponential--logarithm equivalence. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming + mrangeRestrictNontriviallyNormedField → + mrangeRestrictNontriviallyNormedField + + +noncomputable +section + +universe u v + +namespace LocalFieldTheory.DiscreteValuationField +namespace LocalField + +open scoped WithZero nonZeroDivisors +open Module + +variable {K : Type u} [Field K] + +/-! ### The canonical normalized-valuation model -/ + +/-- The canonical mixed-characteristic algebra and topology attached to a +normalized `ℤᵐ⁰`-valued local field. The bundle retains both the integral +algebra context and the direct valued-field structure; installing it exposes +the coherent `Q_p`/`Z_p` scalar towers and valuation topology. -/ +class MixedWithZeroValuationContext + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] where + /-- The integral-algebra context for the local-field model obtained by + restricting the normalized valuation to its nonzero value group. -/ + integralAlgebra : + MixedIntegralAlgebraContext (ofWithZeroValuation v) + /-- The valued-field structure on `K` whose valuation is the original + normalized `WithZero (Multiplicative ℤ)`-valued valuation. -/ + valued : Valued K (WithZero (Multiplicative ℤ)) + +/-- The canonical normalized-valuation context. -/ +@[implicit_reducible] +def mixedWithZeroValuationContext + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] : + MixedWithZeroValuationContext v := + { integralAlgebra := + mixedIntegralAlgebraContext (ofWithZeroValuation v) + valued := Valued.mk' v } + +/-- +The valued field carries the integral algebra context `MixedIntegralAlgebraContext +(ofWithZeroValuation v)`. +-/ +instance mixedWithZeroValuationContextIntegralAlgebra + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] + [ctx : MixedWithZeroValuationContext v] : + MixedIntegralAlgebraContext (ofWithZeroValuation v) := + ctx.integralAlgebra + +/-! ### Continuity for the normalized valuation used by + the deep exponential–logarithm equivalence -/ + +/-- For a normalized `ℤᵐ⁰`-valued local field, the canonical embedding +`Q_p → K` is continuous for the direct topology induced by `v`. -/ +theorem continuous_qpadicNumbersAlgebra_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Continuous (algebraMap ℚ_[F.residueCharacteristic] K) := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let p : ℕ := F.residueCharacteristic + let direct : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let restricted : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + have hrestricted : + @Continuous ℚ_[p] K inferInstance restricted.toTopologicalSpace + (algebraMap ℚ_[p] K) := by + let : Valued K F.mrangeValueGroup := restricted + let : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + change Continuous + (fun x : ℚ_[p] => + ((F.qpadicNumbersEquivQpadicClosureSubfield x : + F.qpadicClosureSubfield) : K)) + exact continuous_subtype_val.comp + F.qpadicNumbersToQpadicClosureSubfield_isUniformInducing.uniformContinuous.continuous + have huniform : + (Valued.mk' v).toUniformSpace = + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF).toUniformSpace := by + change (Valued.mk' v).toUniformSpace = + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + (WithZeroValuationTopology.completeDVF v)).toUniformSpace + exact WithZeroValuationTopology.valuedMk_uniformSpace_eq_mrangeRestrict v + let : Valued K (WithZero (Multiplicative ℤ)) := direct + rw [show direct.toTopologicalSpace = restricted.toTopologicalSpace by + exact congrArg (fun U : UniformSpace K => U.toTopologicalSpace) huniform] + exact hrestricted + +/-- The restricted map `Z_p → O_K` is continuous in the direct valuation +topology. -/ +theorem continuous_padicIntToValuationSubring_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Continuous F.padicIntToValuationSubring := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + apply Continuous.subtype_mk + exact (continuous_qpadicNumbersAlgebra_ofWithZeroValuation v).comp + continuous_subtype_val + +/-- The natural scalar multiplication of `Z_p` on `O_K` is continuous. -/ +theorem continuousSMul_padicInt_valuationSubring_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + ContinuousSMul ℤ_[F.residueCharacteristic] + F.toCompleteDVF.valuationSubring := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + refine ⟨?_⟩ + apply Continuous.subtype_mk + change Continuous + (fun z : ℤ_[F.residueCharacteristic] × + F.toCompleteDVF.valuationSubring => + ((F.padicIntToValuationSubring z.1 : + F.toCompleteDVF.valuationSubring) : K) * (z.2 : K)) + exact + (continuous_subtype_val.comp + ((continuous_padicIntToValuationSubring_ofWithZeroValuation v).comp + continuous_fst)).mul + (continuous_subtype_val.comp continuous_snd) + +/-- The induced action on every maximal-ideal power is continuous. -/ +theorem continuousSMul_padicInt_maximalIdealPow_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (n : ℕ) : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + ContinuousSMul ℤ_[F.residueCharacteristic] + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let : ContinuousSMul ℤ_[F.residueCharacteristic] + F.toCompleteDVF.valuationSubring := + continuousSMul_padicInt_valuationSubring_ofWithZeroValuation v + refine ⟨?_⟩ + apply Continuous.subtype_mk + change Continuous + (fun z : ℤ_[F.residueCharacteristic] × + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) => + z.1 • (z.2 : F.toCompleteDVF.valuationSubring)) + exact continuous_fst.smul (continuous_subtype_val.comp continuous_snd) + +/-- The canonical p-adic action on `U^1` is jointly continuous for the +direct normalized valuation topology. -/ +theorem continuousSMul_padicInt_firstPrincipalUnit_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + ContinuousSMul ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1)) := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + exact + CompleteDVF.higherPrincipalUnitGroup.principalUnitPadicContinuousSMulOfWithZeroValuation + v + +/-- Every stable higher principal-unit subgroup inherits the joint +continuous p-adic action from `U^1`. -/ +theorem continuousSMul_padicInt_higherPrincipalUnit_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + {r : ℕ} (hr : 1 ≤ r) : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + letI : Module ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := + F.higherPrincipalUnitPadicModule hr + ContinuousSMul ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let : Module ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := + F.higherPrincipalUnitPadicModule hr + let : ContinuousSMul ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1)) := + continuousSMul_padicInt_firstPrincipalUnit_ofWithZeroValuation v + have hinc : Continuous (F.higherPrincipalUnitAddToFirst hr) := by + apply Continuous.subtype_mk + exact continuous_subtype_val + have hsmulFirst : Continuous + (fun z : ℤ_[F.residueCharacteristic] × + Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF r) => + z.1 • F.higherPrincipalUnitAddToFirst hr z.2) := + continuous_fst.smul (hinc.comp continuous_snd) + refine ⟨?_⟩ + apply Continuous.subtype_mk + apply (continuous_subtype_val.comp hsmulFirst).congr + intro z + exact congrArg + (fun y : + Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF 1) => + ((Additive.toMul y : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF 1) : F.toCompleteDVF.valuationSubringˣ)) + (F.higherPrincipalUnitAddToFirst_smul hr z.1 z.2).symm + +/-- The integral-basis coordinates on a maximal-ideal power are a +homeomorphism for the direct normalized valuation topology. -/ +noncomputable def mixedMaximalIdealPowHomeomorphPiOfWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (n : ℕ) : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) ≃ₜ + (Fin (Module.finrank ℚ_[F.residueCharacteristic] K) → + ℤ_[F.residueCharacteristic]) := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let p : ℕ := F.residueCharacteristic + let d : ℕ := Module.finrank ℚ_[p] K + letI : Module.Finite ℤ_[p] + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) := + F.mixed_maximalIdealPow_moduleFinite n + letI : Module.Free ℤ_[p] + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) := + F.mixed_maximalIdealPow_moduleFree n + letI : ContinuousSMul ℤ_[p] + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) := + continuousSMul_padicInt_maximalIdealPow_ofWithZeroValuation v n + letI : ContinuousAdd + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) := by + refine ⟨?_⟩ + apply Continuous.subtype_mk + apply Continuous.subtype_mk + exact + (continuous_subtype_val.comp + (continuous_subtype_val.comp continuous_fst)).add + (continuous_subtype_val.comp + (continuous_subtype_val.comp continuous_snd)) + let b : Basis (Fin d) ℤ_[p] + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) := + Module.finBasisOfFinrankEq ℤ_[p] + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) + (by simpa [d] using + F.mixed_maximalIdealPow_finrank n) + let e := b.equivFun + have heinv : Continuous e.symm := by + have hsum : Continuous (fun x : Fin d → ℤ_[p] => ∑ i, x i • b i) := by + fun_prop + convert hsum using 1 + funext x + exact b.equivFun_symm_apply x + exact + (e.symm.toEquiv.toHomeomorphOfContinuousClosed + heinv heinv.isClosedMap).symm + +/-! ### the deep exponential–logarithm equivalence connected to the integral basis -/ + +/-- The logarithmic depth inequality forces a positive filtration level. -/ +theorem mixed_one_le_of_log_level + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (n : ℕ) + (hlevel : + (ramificationIndexOfWithZeroValuation v : ℚ) / + (((ofWithZeroValuation v).residueCharacteristic : ℚ) - 1) < + (n : ℚ)) : + 1 ≤ n := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + have hpden : (0 : ℚ) < (F.residueCharacteristic : ℚ) - 1 := by + have hpq : (1 : ℚ) < F.residueCharacteristic := by + exact_mod_cast F.residueCharacteristic_prime.one_lt + linarith + have hepos : (0 : ℚ) < + (ramificationIndexOfWithZeroValuation v : ℚ) := by + exact_mod_cast ramificationIndexOfWithZeroValuation_pos v + have hnq : (0 : ℚ) < (n : ℚ) := + lt_trans (div_pos hepos hpden) hlevel + exact_mod_cast hnq + +/-- The logarithm direction of the deep exponential–logarithm equivalence, written as a topological +additive equivalence `U^n ≃ₜ+ m^n`. -/ +noncomputable def mixedDeepLogContinuousAddEquiv + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (hv : Function.Surjective v) + (n : ℕ) + (hlevel : + (ramificationIndexOfWithZeroValuation v : ℚ) / + (((ofWithZeroValuation v).residueCharacteristic : ℚ) - 1) < + (n : ℚ)) : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) n) ≃ₜ+ + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + exact continuousAddEquivOfMultiplicativeSource + (MultiplicativeIntegerValuation.chosenExpLogContinuousMulEquiv + v hv n hlevel) + +/-- The deep logarithm is compatible with natural scalars (ordinary powers) +before the density argument upgrades it to all of `Z_p`. -/ +theorem mixed_deepLog_map_natCast_smul + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (hv : Function.Surjective v) + (n : ℕ) + (hlevel : + (ramificationIndexOfWithZeroValuation v : ℚ) / + (((ofWithZeroValuation v).residueCharacteristic : ℚ) - 1) < + (n : ℚ)) + (m : ℕ) + (x : Additive + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((ofWithZeroValuation v).toCompleteDVF) n)) : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let hn : 1 ≤ n := mixed_one_le_of_log_level v n hlevel + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + letI : Module ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) n)) := + F.higherPrincipalUnitPadicModule hn + mixedDeepLogContinuousAddEquiv + v hv n hlevel + ((m : ℤ_[F.residueCharacteristic]) • x) = + (m : ℤ_[F.residueCharacteristic]) • + mixedDeepLogContinuousAddEquiv + v hv n hlevel x := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let hn : 1 ≤ n := mixed_one_le_of_log_level v n hlevel + let : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let : Module ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) n)) := + F.higherPrincipalUnitPadicModule hn + dsimp only + rw [Nat.cast_smul_eq_nsmul, Nat.cast_smul_eq_nsmul] + change + (mixedDeepLogContinuousAddEquiv v hv n hlevel).toAddEquiv.toAddMonoidHom + (m • x) = + m • + (mixedDeepLogContinuousAddEquiv v hv n hlevel).toAddEquiv.toAddMonoidHom x + exact + (mixedDeepLogContinuousAddEquiv v hv n hlevel).toAddEquiv.toAddMonoidHom.map_nsmul + m x + +/-- At a depth allowed by the deep exponential–logarithm equivalence, logarithm is a `Z_p`-linear +equivalence from `U^n` to the additive ideal `m^n`. -/ +noncomputable def mixedDeepLogLinearEquiv + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (hv : Function.Surjective v) + (n : ℕ) + (hlevel : + (ramificationIndexOfWithZeroValuation v : ℚ) / + (((ofWithZeroValuation v).residueCharacteristic : ℚ) - 1) < + (n : ℚ)) : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let hn : 1 ≤ n := mixed_one_le_of_log_level v n hlevel + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + letI : Module ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) n)) := + F.higherPrincipalUnitPadicModule hn + Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) n) ≃ₗ[ + ℤ_[F.residueCharacteristic]] + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let hn : 1 ≤ n := mixed_one_le_of_log_level v n hlevel + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + letI : Module ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) n)) := + F.higherPrincipalUnitPadicModule hn + letI : ContinuousSMul ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) n)) := + continuousSMul_padicInt_higherPrincipalUnit_ofWithZeroValuation v hn + letI : ContinuousSMul ℤ_[F.residueCharacteristic] + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) := + continuousSMul_padicInt_maximalIdealPow_ofWithZeroValuation v n + let e := mixedDeepLogContinuousAddEquiv + v hv n hlevel + exact padicLinearEquivOfContinuousAddEquiv e.toAddEquiv e.continuous + +/-- The deep principal-unit group is finite over `Z_p`; via logarithm it is +finite free of the same rank as `O_K`. -/ +theorem mixed_deepPrincipalUnit_moduleFinite + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (hv : Function.Surjective v) + (n : ℕ) + (hlevel : + (ramificationIndexOfWithZeroValuation v : ℚ) / + (((ofWithZeroValuation v).residueCharacteristic : ℚ) - 1) < + (n : ℚ)) : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let hn : 1 ≤ n := mixed_one_le_of_log_level v n hlevel + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + letI : Module ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) n)) := + F.higherPrincipalUnitPadicModule hn + Module.Finite ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) n)) := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let hn : 1 ≤ n := mixed_one_le_of_log_level v n hlevel + let : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let : Module ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) n)) := + F.higherPrincipalUnitPadicModule hn + let : Module.Finite ℤ_[F.residueCharacteristic] + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) := + F.mixed_maximalIdealPow_moduleFinite n + exact Module.Finite.equiv + (mixedDeepLogLinearEquiv + v hv n hlevel).symm + +/-- Integral-basis coordinates after logarithm give the algebraic coordinate isomorphism `U^n ≃ +Z_p^d`. -/ +noncomputable def mixedDeepPrincipalUnitLinearEquivPi + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (hv : Function.Surjective v) + (n : ℕ) + (hlevel : + (ramificationIndexOfWithZeroValuation v : ℚ) / + (((ofWithZeroValuation v).residueCharacteristic : ℚ) - 1) < + (n : ℚ)) : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let hn : 1 ≤ n := mixed_one_le_of_log_level v n hlevel + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + letI : Module ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) n)) := + F.higherPrincipalUnitPadicModule hn + Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) n) ≃ₗ[ + ℤ_[F.residueCharacteristic]] + (Fin (Module.finrank ℚ_[F.residueCharacteristic] K) → + ℤ_[F.residueCharacteristic]) := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + let hn : 1 ≤ n := mixed_one_le_of_log_level v n hlevel + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + letI : Module ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) n)) := + F.higherPrincipalUnitPadicModule hn + exact + (mixedDeepLogLinearEquiv + v hv n hlevel).trans + (F.mixedMaximalIdealPowLinearEquivPi n) + +/-- The same coordinate identification is a homeomorphism, as asserted +explicitly in the mixed-characteristic field-unit structure theorem. -/ +noncomputable def mixedDeepPrincipalUnitHomeomorphPi + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (hv : Function.Surjective v) + (n : ℕ) + (hlevel : + (ramificationIndexOfWithZeroValuation v : ℚ) / + (((ofWithZeroValuation v).residueCharacteristic : ℚ) - 1) < + (n : ℚ)) : + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) n) ≃ₜ + (Fin (Module.finrank ℚ_[F.residueCharacteristic] K) → + ℤ_[F.residueCharacteristic]) := by + let F : LocalField.{u, 0} K := ofWithZeroValuation v + letI : MixedWithZeroValuationContext v := + mixedWithZeroValuationContext v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + exact + (mixedDeepLogContinuousAddEquiv + v hv n hlevel).toHomeomorph.trans + (mixedMaximalIdealPowHomeomorphPiOfWithZeroValuation + v n) + +end LocalField +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean new file mode 100644 index 0000000000..fc5dc4a738 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean @@ -0,0 +1,1209 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicQp +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.PrincipalUnitExpLogEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicModuleStructure +public import Mathlib.RingTheory.DedekindDomain.IntegralClosure +public import Mathlib.LinearAlgebra.Dimension.Torsion.Finite +public import Mathlib.Topology.Algebra.Module.Compact +/-! +# The integral lattice of a mixed-characteristic local field + +This file identifies the integer ring of a mixed-characteristic local field +with the integral closure of the p-adic integers. In particular it supplies +the finite free `Z_p` lattice of rank `[K : Q_p]` used in the proof of +the mixed-characteristic field-unit structure theorem. The comparison is made for the canonical + copy of `Q_p` +constructed in the local-field structure classification, not for a separately assumed scalar action. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming + mrangeRestrictNontriviallyNormedField → + mrangeRestrictNontriviallyNormedField + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + moduleFinite_target_valuationSubring_of_finite_separable → + moduleFinite_target_valuationSubring_of_finite_separable + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + target_valuationSubring_isIntegralClosure_of_finite_separable → + target_valuationSubring_isIntegralClosure_of_finite_separable + + +noncomputable +section + +universe u v + +namespace LocalFieldTheory.DiscreteValuationField +namespace LocalField + +open scoped WithZero nonZeroDivisors +open Module + +variable {K : Type u} [Field K] + +/-! ### Canonical mixed-characteristic scalar context -/ + +/-- The canonical `Q_p` scalar context supplied by a mixed-characteristic +local field. It carries the residue-characteristic prime witness; installing +it also installs the coherent algebra and finite-dimensional structures. -/ +class MixedQPadicContext (F : LocalField.{u, v} K) : Prop where + /-- The residue characteristic of a mixed-characteristic local field is prime. -/ + residueCharacteristic_prime : F.residueCharacteristic.Prime + +/-- The canonical `Q_p` scalar context attached to `F`. -/ +theorem mixedQPadicContext (F : LocalField.{u, v} K) : + MixedQPadicContext F := + ⟨F.residueCharacteristic_prime⟩ + +/-- Registers the mathematical fact `Fact F.residueCharacteristic.Prime` for typeclass inference. -/ +instance mixedQPadicContextFact + (F : LocalField.{u, v} K) [ctx : MixedQPadicContext F] : + Fact F.residueCharacteristic.Prime := + ⟨ctx.residueCharacteristic_prime⟩ + +/-- +Equips the target with its canonical `Algebra` structure, namely `Algebra +ℚ_[F.residueCharacteristic] K`. +-/ +noncomputable instance mixedQPadicContextAlgebra + (F : LocalField.{u, v} K) [CharZero K] [MixedQPadicContext F] : + Algebra ℚ_[F.residueCharacteristic] K := + F.qpadicNumbersAlgebra + +/-- +Equips the target with its canonical `FiniteDimensional` structure, namely `FiniteDimensional +ℚ_[F.residueCharacteristic] K`. +-/ +noncomputable instance mixedQPadicContextFiniteDimensional + (F : LocalField.{u, v} K) [CharZero K] [MixedQPadicContext F] : + FiniteDimensional ℚ_[F.residueCharacteristic] K := + F.finiteDimensional_over_qpadicNumbers + +/-- The DVR valuation on `Q_p` has closed unit ball equal to the usual +subring `Z_p`. -/ +theorem padicDVRValuation_le_one_iff_norm_le_one + (p : ℕ) [Fact p.Prime] (x : ℚ_[p]) : + Examples.Qp.padicDVRValuation p x ≤ 1 ↔ ‖x‖ ≤ 1 := by + constructor + · intro hx + obtain ⟨z, hz⟩ := + IsDiscreteValuationRing.exists_lift_of_le_one + (A := ℤ_[p]) (K := ℚ_[p]) hx + have hzx : (z : ℚ_[p]) = x := by + simpa using hz + rw [← hzx] + exact PadicInt.norm_le_one z + · intro hx + let z : ℤ_[p] := ⟨x, hx⟩ + have hz : + Examples.Qp.padicDVRValuation p (z : ℚ_[p]) ≤ 1 := + (Examples.Qp.padicIntEquivValuationSubring p z).property + simpa [z] using hz + +/-- The canonical embedding `Q_p → K` takes `Z_p` into the valuation +subring. This is proved by density of the ordinary natural numbers and +closedness of the valuation subring. -/ +theorem qpadicInt_algebraMap_mem_valuationSubring + (F : LocalField.{u, v} K) [CharZero K] + (z : ℤ_[F.residueCharacteristic]) : + letI : MixedQPadicContext F := mixedQPadicContext F + algebraMap ℚ_[F.residueCharacteristic] K (z : ℚ_[F.residueCharacteristic]) ∈ + F.toCompleteDVF.valuation.valuationSubring := by + let p : ℕ := F.residueCharacteristic + let : MixedQPadicContext F := mixedQPadicContext F + let : Fact p.Prime := ⟨F.residueCharacteristic_prime⟩ + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + let : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F.toCompleteDVF + have hcontinuous : Continuous (algebraMap ℚ_[p] K) := by + change Continuous + (fun x : ℚ_[p] => + ((F.qpadicNumbersEquivQpadicClosureSubfield x : + F.qpadicClosureSubfield) : K)) + exact continuous_subtype_val.comp + F.qpadicNumbersToQpadicClosureSubfield_isUniformInducing.uniformContinuous.continuous + have hclosed : IsClosed + {x : ℤ_[p] | + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F.toCompleteDVF + (algebraMap ℚ_[p] K (x : ℚ_[p])) ≤ 1} := by + have hvclosed : IsClosed + {x : K | _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F.toCompleteDVF x ≤ 1} := by + have hset : + {x : K | + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F.toCompleteDVF x ≤ 1} = + ((Valued.v : Valuation K + (MonoidHom.mrange + F.toCompleteDVF.valuation.toMonoidWithZeroHom)).valuationSubring : + Set K) := by + ext x + change + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F.toCompleteDVF x ≤ 1 ↔ + (Valued.v : Valuation K + (MonoidHom.mrange + F.toCompleteDVF.valuation.toMonoidWithZeroHom)) x ≤ 1 + rfl + rw [hset] + exact Valued.isClosed_valuationSubring K + exact hvclosed.preimage + (hcontinuous.comp continuous_subtype_val) + have hz' : + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F.toCompleteDVF + (algebraMap ℚ_[p] K (z : ℚ_[p])) ≤ 1 := by + refine PadicInt.denseRange_natCast.induction_on z hclosed ?_ + intro n + change _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F.toCompleteDVF + (algebraMap ℚ_[p] K ((n : ℤ_[p]) : ℚ_[p])) ≤ 1 + rw [← Subtype.coe_le_coe] + simpa [_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_apply] using + F.valuation_natCast_le_one n + rw [← Subtype.coe_le_coe] at hz' + simpa [_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_apply, p] + using hz' + +/-- Pulling the valuation ring of `K` back along the canonical `Q_p` map +recovers precisely `Z_p`. The reverse implication uses the DVR identity +`m_(Z_p) = p Z_p` and the strict inequality `v_K(p) < 1`. -/ +theorem qpadicNumbersAlgebra_mem_valuationSubring_iff + (F : LocalField.{u, v} K) [CharZero K] + (x : ℚ_[F.residueCharacteristic]) : + letI : MixedQPadicContext F := mixedQPadicContext F + algebraMap ℚ_[F.residueCharacteristic] K x ∈ + F.toCompleteDVF.valuation.valuationSubring ↔ + ‖x‖ ≤ 1 := by + let p : ℕ := F.residueCharacteristic + let : MixedQPadicContext F := mixedQPadicContext F + let : Fact p.Prime := ⟨F.residueCharacteristic_prime⟩ + constructor + · intro hx + by_contra hxnorm + have hnorm : 1 < ‖x‖ := lt_of_not_ge hxnorm + have hx0 : x ≠ 0 := by + intro hzero + have : ¬ (1 : ℝ) < 0 := not_lt_of_ge zero_le_one + exact this (by simpa [hzero] using hnorm) + have hinvnorm : ‖x⁻¹‖ < 1 := by + rw [norm_inv] + exact inv_lt_one_of_one_lt₀ hnorm + let y : ℤ_[p] := ⟨x⁻¹, hinvnorm.le⟩ + have hymax : y ∈ IsLocalRing.maximalIdeal ℤ_[p] := by + rw [IsLocalRing.mem_maximalIdeal, PadicInt.mem_nonunits] + exact hinvnorm + rw [PadicInt.maximalIdeal_eq_span_p, + Ideal.mem_span_singleton] at hymax + obtain ⟨c, hc⟩ := hymax + have hcmem : + algebraMap ℚ_[p] K (c : ℚ_[p]) ∈ + F.toCompleteDVF.valuation.valuationSubring := by + simpa [p] using + F.qpadicInt_algebraMap_mem_valuationSubring c + have hcval : + F.toCompleteDVF.valuation + (algebraMap ℚ_[p] K (c : ℚ_[p])) ≤ 1 := + (F.toCompleteDVF.mem_valuationSubring_iff _).1 hcmem + have hpval : + F.toCompleteDVF.valuation + (algebraMap ℚ_[p] K (p : ℚ_[p])) < 1 := by + simpa [p] using + F.valuation_natCast_residueCharacteristic_lt_one + have hyfield : (y : ℚ_[p]) = (p : ℚ_[p]) * (c : ℚ_[p]) := by + simpa [mul_comm] using congrArg (fun z : ℤ_[p] => (z : ℚ_[p])) hc + have hyval : + F.toCompleteDVF.valuation + (algebraMap ℚ_[p] K (y : ℚ_[p])) < 1 := by + rw [hyfield, map_mul, F.toCompleteDVF.valuation.map_mul] + exact mul_lt_one_of_lt_of_le hpval hcval + have hprod : + F.toCompleteDVF.valuation (algebraMap ℚ_[p] K x) * + F.toCompleteDVF.valuation + (algebraMap ℚ_[p] K (x⁻¹)) < 1 := by + apply Right.mul_lt_one_of_le_of_lt + · exact (F.toCompleteDVF.mem_valuationSubring_iff _).1 hx + · simpa [y] using hyval + have hone_lt : + F.toCompleteDVF.valuation + (algebraMap ℚ_[p] K (x * x⁻¹)) < 1 := by + simpa only [map_mul, F.toCompleteDVF.valuation.map_mul] using hprod + rw [mul_inv_cancel₀ hx0, map_one, + F.toCompleteDVF.valuation.map_one] at hone_lt + exact (lt_irrefl (1 : F.toCompleteDVF.ValueGroup)) hone_lt + · intro hx + let z : ℤ_[p] := ⟨x, hx⟩ + simpa [z, p] using + F.qpadicInt_algebraMap_mem_valuationSubring z + +/-- The actual valuation of a mixed-characteristic local field extends the +DVR valuation on the canonical `Q_p` subfield. -/ +theorem qpadicDVRValuation_hasExtension + (F : LocalField.{u, v} K) [CharZero K] : + letI : MixedQPadicContext F := mixedQPadicContext F + (Examples.Qp.padicDVRValuation F.residueCharacteristic).HasExtension + F.toCompleteDVF.valuation := by + let p : ℕ := F.residueCharacteristic + let : MixedQPadicContext F := mixedQPadicContext F + refine ⟨(_root_.Valuation.isEquiv_iff_val_le_one).2 ?_⟩ + intro x + have htarget : + F.toCompleteDVF.valuation (algebraMap ℚ_[p] K x) ≤ 1 ↔ + ‖x‖ ≤ 1 := + (F.toCompleteDVF.mem_valuationSubring_iff _).symm.trans + (by simpa [p] using + F.qpadicNumbersAlgebra_mem_valuationSubring_iff x) + exact + (padicDVRValuation_le_one_iff_norm_le_one p x).trans + htarget.symm + +/-- The `p`-adic valuation extends to the valuation on the mixed-characteristic local field. -/ +noncomputable instance mixedQPadicContextValuationExtension + (F : LocalField.{u, v} K) [CharZero K] [MixedQPadicContext F] : + (Examples.Qp.padicCompleteDVF F.residueCharacteristic).valuation.HasExtension + F.toCompleteDVF.valuation := + F.qpadicDVRValuation_hasExtension + +/-- +Equips the target with its canonical `IsScalarTower` structure, namely `IsScalarTower +(Examples.Qp.padicCompleteDVF F.residueCharacteristic).valuationSubring +F.toCompleteDVF.valuationSubring K`. +-/ +instance mixedQPadicContextValuationSubringTower + (F : LocalField.{u, v} K) [CharZero K] [MixedQPadicContext F] : + IsScalarTower + (Examples.Qp.padicCompleteDVF F.residueCharacteristic).valuationSubring + F.toCompleteDVF.valuationSubring K := + IsScalarTower.of_algebraMap_eq (by intro a; rfl) + +/-- The integer ring of `K` is the integral closure of the integer ring of +the canonical `Q_p`. This is the integral-basis input used in the mixed-characteristic + field-unit proof of the mixed-characteristic field-unit structure theorem. -/ +theorem valuationSubring_isIntegralClosure_over_qpadicIntegers + (F : LocalField.{u, v} K) [CharZero K] : + let p := F.residueCharacteristic + letI : MixedQPadicContext F := mixedQPadicContext F + IsIntegralClosure F.toCompleteDVF.valuationSubring + (Examples.Qp.padicCompleteDVF p).valuationSubring K := by + let p : ℕ := F.residueCharacteristic + let : MixedQPadicContext F := mixedQPadicContext F + let : Algebra.IsSeparable ℚ_[p] K := by infer_instance + exact + target_valuationSubring_isIntegralClosure_of_finite_separable + (Examples.Qp.padicCompleteDVF p) F.toCompleteDVF + +/-- Consequently the integer ring of `K` is finite over the integer ring of +the canonical `Q_p`. -/ +theorem valuationSubring_moduleFinite_over_qpadicIntegers + (F : LocalField.{u, v} K) [CharZero K] : + let p := F.residueCharacteristic + letI : MixedQPadicContext F := mixedQPadicContext F + Module.Finite (Examples.Qp.padicCompleteDVF p).valuationSubring + F.toCompleteDVF.valuationSubring := by + let p : ℕ := F.residueCharacteristic + let : MixedQPadicContext F := mixedQPadicContext F + let : Algebra.IsSeparable ℚ_[p] K := by infer_instance + exact + moduleFinite_target_valuationSubring_of_finite_separable + (Examples.Qp.padicCompleteDVF p) F.toCompleteDVF + +/-- The same integer ring is free over the canonical `Q_p` integer ring. -/ +theorem valuationSubring_moduleFree_over_qpadicIntegers + (F : LocalField.{u, v} K) [CharZero K] : + let p := F.residueCharacteristic + letI : MixedQPadicContext F := mixedQPadicContext F + Module.Free (Examples.Qp.padicCompleteDVF p).valuationSubring + F.toCompleteDVF.valuationSubring := by + let p : ℕ := F.residueCharacteristic + let : MixedQPadicContext F := mixedQPadicContext F + let : Algebra.IsSeparable ℚ_[p] K := by infer_instance + let : Module.Finite + (Examples.Qp.padicCompleteDVF p).valuationSubring + F.toCompleteDVF.valuationSubring := + moduleFinite_target_valuationSubring_of_finite_separable + (Examples.Qp.padicCompleteDVF p) F.toCompleteDVF + let : IsIntegralClosure F.toCompleteDVF.valuationSubring + (Examples.Qp.padicCompleteDVF p).valuationSubring K := + target_valuationSubring_isIntegralClosure_of_finite_separable + (Examples.Qp.padicCompleteDVF p) F.toCompleteDVF + let : IsFractionRing + (Examples.Qp.padicCompleteDVF p).valuationSubring ℚ_[p] := + ValuationTheory.DiscreteValuationField.ValuedExtension.base_valuationSubring_isFractionRing + (K := ℚ_[p]) (Examples.Qp.padicCompleteDVF p) + let : FaithfulSMul + (Examples.Qp.padicCompleteDVF p).valuationSubring K := + FaithfulSMul.of_field_isFractionRing + (Examples.Qp.padicCompleteDVF p).valuationSubring K ℚ_[p] K + let : Module.IsTorsionFree + (Examples.Qp.padicCompleteDVF p).valuationSubring K := inferInstance + let : Module.IsTorsionFree + (Examples.Qp.padicCompleteDVF p).valuationSubring + F.toCompleteDVF.valuationSubring := + IsIntegralClosure.isTorsionFree + (Examples.Qp.padicCompleteDVF p).valuationSubring K + exact Module.free_of_finite_type_torsion_free' + +/-- Integral-basis rank formula over the canonical valuation ring. -/ +theorem valuationSubring_finrank_over_qpadicIntegers + (F : LocalField.{u, v} K) [CharZero K] : + let p := F.residueCharacteristic + letI : MixedQPadicContext F := mixedQPadicContext F + Module.finrank (Examples.Qp.padicCompleteDVF p).valuationSubring + F.toCompleteDVF.valuationSubring = + Module.finrank ℚ_[p] K := by + let p : ℕ := F.residueCharacteristic + let : MixedQPadicContext F := mixedQPadicContext F + let : Algebra.IsSeparable ℚ_[p] K := by infer_instance + let : IsIntegralClosure F.toCompleteDVF.valuationSubring + (Examples.Qp.padicCompleteDVF p).valuationSubring K := + target_valuationSubring_isIntegralClosure_of_finite_separable + (Examples.Qp.padicCompleteDVF p) F.toCompleteDVF + let : IsFractionRing + (Examples.Qp.padicCompleteDVF p).valuationSubring ℚ_[p] := + ValuationTheory.DiscreteValuationField.ValuedExtension.base_valuationSubring_isFractionRing + (K := ℚ_[p]) (Examples.Qp.padicCompleteDVF p) + let : FaithfulSMul + (Examples.Qp.padicCompleteDVF p).valuationSubring K := + FaithfulSMul.of_field_isFractionRing + (Examples.Qp.padicCompleteDVF p).valuationSubring K ℚ_[p] K + let : Module.IsTorsionFree + (Examples.Qp.padicCompleteDVF p).valuationSubring K := + inferInstance + exact IsIntegralClosure.rank + (Examples.Qp.padicCompleteDVF p).valuationSubring ℚ_[p] K + F.toCompleteDVF.valuationSubring + +/-! ### the canonical `Z_p` integral basis -/ + +/-- The canonical ring map `Z_p → O_K`, obtained by restricting the +canonical `Q_p → K` map proved above. -/ +noncomputable def padicIntToValuationSubring + (F : LocalField.{u, v} K) [CharZero K] : + ℤ_[F.residueCharacteristic] →+* F.toCompleteDVF.valuationSubring := by + let p : ℕ := F.residueCharacteristic + letI : MixedQPadicContext F := mixedQPadicContext F + exact + ((algebraMap ℚ_[p] K).comp PadicInt.Coe.ringHom).codRestrict + F.toCompleteDVF.valuation.valuationSubring + (fun z => by + exact F.qpadicInt_algebraMap_mem_valuationSubring z) + +/-- +The embedding of `ℤ_p` into the valuation ring has underlying field value given by the `ℚ_p` +algebra map. +-/ +@[simp] +theorem padicIntToValuationSubring_coe + (F : LocalField.{u, v} K) [CharZero K] + (z : ℤ_[F.residueCharacteristic]) : + letI : MixedQPadicContext F := mixedQPadicContext F + ((F.padicIntToValuationSubring z : F.toCompleteDVF.valuationSubring) : K) = + algebraMap ℚ_[F.residueCharacteristic] K + (z : ℚ_[F.residueCharacteristic]) := by + rfl + +/-- The corresponding `Z_p`-algebra structure on `O_K`. -/ +@[implicit_reducible] +noncomputable def padicIntValuationSubringAlgebra + (F : LocalField.{u, v} K) [CharZero K] : + Algebra ℤ_[F.residueCharacteristic] + F.toCompleteDVF.valuationSubring := + RingHom.toAlgebra F.padicIntToValuationSubring + +/-- The corresponding `Z_p`-algebra structure on `K`. -/ +@[implicit_reducible] +noncomputable def padicIntFieldAlgebra + (F : LocalField.{u, v} K) [CharZero K] : + Algebra ℤ_[F.residueCharacteristic] K := by + let p : ℕ := F.residueCharacteristic + letI : MixedQPadicContext F := mixedQPadicContext F + exact RingHom.toAlgebra + ((algebraMap ℚ_[p] K).comp PadicInt.Coe.ringHom) + +/-- The restricted algebra structures form the expected tower +`Z_p → O_K → K`. -/ +theorem padicIntValuationSubring_isScalarTower + (F : LocalField.{u, v} K) [CharZero K] : + letI : Algebra ℤ_[F.residueCharacteristic] + F.toCompleteDVF.valuationSubring := + F.padicIntValuationSubringAlgebra + letI : Algebra ℤ_[F.residueCharacteristic] K := + F.padicIntFieldAlgebra + IsScalarTower ℤ_[F.residueCharacteristic] + F.toCompleteDVF.valuationSubring K := by + let : Algebra ℤ_[F.residueCharacteristic] + F.toCompleteDVF.valuationSubring := + F.padicIntValuationSubringAlgebra + let : Algebra ℤ_[F.residueCharacteristic] K := + F.padicIntFieldAlgebra + exact IsScalarTower.of_algebraMap_eq (by intro z; rfl) + +/-- The coherent canonical `Z_p → O_K → K` algebra model. The bundle +retains its canonical `Q_p` context and installs both integral algebra +structures and their scalar towers. -/ +class MixedIntegralAlgebraContext (F : LocalField.{u, v} K) : Prop where + /-- The canonical `Q_p` scalar context underlying the integral algebra structure. -/ + qpadic : MixedQPadicContext F + +/-- The canonical integral algebra context attached to `F`. -/ +theorem mixedIntegralAlgebraContext (F : LocalField.{u, v} K) : + MixedIntegralAlgebraContext F := + ⟨mixedQPadicContext F⟩ + +/-- +Equips the target with its canonical `MixedQPadicContext` structure, namely `MixedQPadicContext +F`. +-/ +instance mixedIntegralAlgebraContextQPadic + (F : LocalField.{u, v} K) [ctx : MixedIntegralAlgebraContext F] : + MixedQPadicContext F := + ctx.qpadic + +/-- +Equips the target with its canonical `Algebra` structure, namely `Algebra +ℤ_[F.residueCharacteristic] F.toCompleteDVF.valuationSubring`. +-/ +noncomputable instance mixedIntegralAlgebraContextValuationSubringAlgebra + (F : LocalField.{u, v} K) [CharZero K] + [MixedIntegralAlgebraContext F] : + Algebra ℤ_[F.residueCharacteristic] + F.toCompleteDVF.valuationSubring := + F.padicIntValuationSubringAlgebra + +/-- +Equips the target with its canonical `Algebra` structure, namely `Algebra +ℤ_[F.residueCharacteristic] K`. +-/ +noncomputable instance mixedIntegralAlgebraContextFieldAlgebra + (F : LocalField.{u, v} K) [CharZero K] + [MixedIntegralAlgebraContext F] : + Algebra ℤ_[F.residueCharacteristic] K := + F.padicIntFieldAlgebra + +/-- +Equips the target with its canonical `IsScalarTower` structure, namely `IsScalarTower +ℤ_[F.residueCharacteristic] ℚ_[F.residueCharacteristic] K`. +-/ +instance mixedIntegralAlgebraContextQPadicTower + (F : LocalField.{u, v} K) [CharZero K] + [MixedIntegralAlgebraContext F] : + IsScalarTower ℤ_[F.residueCharacteristic] + ℚ_[F.residueCharacteristic] K := + IsScalarTower.of_algebraMap_eq (by intro z; rfl) + +/-- +Equips the target with its canonical `IsScalarTower` structure, namely `IsScalarTower +ℤ_[F.residueCharacteristic] F.toCompleteDVF.valuationSubring K`. +-/ +instance mixedIntegralAlgebraContextValuationSubringTower + (F : LocalField.{u, v} K) [CharZero K] + [MixedIntegralAlgebraContext F] : + IsScalarTower ℤ_[F.residueCharacteristic] + F.toCompleteDVF.valuationSubring K := + F.padicIntValuationSubring_isScalarTower + +/-- canonical integral-closure form: `O_K` is the integral closure of +`Z_p` in `K` for the canonical `Q_p`-algebra structure. -/ +theorem valuationSubring_isIntegralClosure_over_padicInt + (F : LocalField.{u, v} K) [CharZero K] : + letI : MixedIntegralAlgebraContext F := + mixedIntegralAlgebraContext F + IsIntegralClosure F.toCompleteDVF.valuationSubring + ℤ_[F.residueCharacteristic] K := by + let p : ℕ := F.residueCharacteristic + let : MixedIntegralAlgebraContext F := + mixedIntegralAlgebraContext F + let : Algebra.IsSeparable ℚ_[p] K := by infer_instance + let hclosure : IsIntegralClosure F.toCompleteDVF.valuationSubring + (Examples.Qp.padicCompleteDVF p).valuationSubring K := + target_valuationSubring_isIntegralClosure_of_finite_separable + (Examples.Qp.padicCompleteDVF p) F.toCompleteDVF + let e : ℤ_[p] ≃+* (Examples.Qp.padicCompleteDVF p).valuationSubring := + Examples.Qp.padicIntEquivValuationSubring p + have hcompat : + (algebraMap (Examples.Qp.padicCompleteDVF p).valuationSubring K).comp + e.toRingHom = + algebraMap ℤ_[p] K := by + ext z + rfl + refine + { algebraMap_injective := by + intro a b hab + exact Subtype.ext hab + isIntegral_iff := ?_ } + intro x + exact (e.isIntegral_iff hcompat x).trans hclosure.isIntegral_iff + +/-- The mixed-characteristic field-unit structure theorem, integral-basis finiteness: `O_K` is a +finite +`Z_p`-module, with no separately assumed module structure. -/ +theorem mixed_valuationSubring_moduleFinite + (F : LocalField.{u, v} K) [CharZero K] : + letI : MixedIntegralAlgebraContext F := + mixedIntegralAlgebraContext F + Module.Finite ℤ_[F.residueCharacteristic] + F.toCompleteDVF.valuationSubring := by + let p : ℕ := F.residueCharacteristic + let : MixedIntegralAlgebraContext F := + mixedIntegralAlgebraContext F + let : IsIntegralClosure F.toCompleteDVF.valuationSubring ℤ_[p] K := + F.valuationSubring_isIntegralClosure_over_padicInt + exact IsIntegralClosure.finite ℤ_[p] ℚ_[p] K + F.toCompleteDVF.valuationSubring + +/-- The mixed-characteristic field-unit structure theorem, integral-basis freeness. -/ +theorem mixed_valuationSubring_moduleFree + (F : LocalField.{u, v} K) [CharZero K] : + letI : MixedIntegralAlgebraContext F := + mixedIntegralAlgebraContext F + Module.Free ℤ_[F.residueCharacteristic] + F.toCompleteDVF.valuationSubring := by + let p : ℕ := F.residueCharacteristic + let : MixedIntegralAlgebraContext F := + mixedIntegralAlgebraContext F + let : IsIntegralClosure F.toCompleteDVF.valuationSubring ℤ_[p] K := + F.valuationSubring_isIntegralClosure_over_padicInt + let : FaithfulSMul ℤ_[p] K := + FaithfulSMul.of_field_isFractionRing ℤ_[p] K ℚ_[p] K + let : Module.IsTorsionFree ℤ_[p] K := inferInstance + exact IsIntegralClosure.module_free + ℤ_[p] ℚ_[p] K F.toCompleteDVF.valuationSubring + +/-- The mixed-characteristic field-unit structure theorem, exact integral-basis rank. -/ +theorem mixed_valuationSubring_finrank + (F : LocalField.{u, v} K) [CharZero K] : + letI : MixedIntegralAlgebraContext F := + mixedIntegralAlgebraContext F + Module.finrank ℤ_[F.residueCharacteristic] + F.toCompleteDVF.valuationSubring = + Module.finrank ℚ_[F.residueCharacteristic] K := by + let p : ℕ := F.residueCharacteristic + let : MixedIntegralAlgebraContext F := + mixedIntegralAlgebraContext F + let : IsIntegralClosure F.toCompleteDVF.valuationSubring ℤ_[p] K := + F.valuationSubring_isIntegralClosure_over_padicInt + let : FaithfulSMul ℤ_[p] K := + FaithfulSMul.of_field_isFractionRing ℤ_[p] K ℚ_[p] K + let : Module.IsTorsionFree ℤ_[p] K := inferInstance + exact IsIntegralClosure.rank + ℤ_[p] ℚ_[p] K F.toCompleteDVF.valuationSubring + +/-- The finite free canonical `Z_p` lattice model of `O_K`. It retains the +integral algebra context and installs the finite and free module instances. -/ +class MixedIntegralLatticeContext (F : LocalField.{u, v} K) : Prop where + /-- The canonical `Z_p → O_K → K` algebra context underlying the lattice. -/ + integralAlgebra : MixedIntegralAlgebraContext F + +/-- The canonical finite free integral-lattice context attached to `F`. -/ +theorem mixedIntegralLatticeContext (F : LocalField.{u, v} K) : + MixedIntegralLatticeContext F := + ⟨mixedIntegralAlgebraContext F⟩ + +/-- The valued field carries the integral algebra context `MixedIntegralAlgebraContext F`. -/ +instance mixedIntegralLatticeContextAlgebra + (F : LocalField.{u, v} K) [ctx : MixedIntegralLatticeContext F] : + MixedIntegralAlgebraContext F := + ctx.integralAlgebra + +/-- +Equips the target with its canonical `Module.Finite` structure, namely `Module.Finite +ℤ_[F.residueCharacteristic] F.toCompleteDVF.valuationSubring`. +-/ +noncomputable instance mixedIntegralLatticeContextModuleFinite + (F : LocalField.{u, v} K) [CharZero K] + [MixedIntegralLatticeContext F] : + Module.Finite ℤ_[F.residueCharacteristic] + F.toCompleteDVF.valuationSubring := + F.mixed_valuationSubring_moduleFinite + +/-- +Equips the target with its canonical `Module.Free` structure, namely `Module.Free +ℤ_[F.residueCharacteristic] F.toCompleteDVF.valuationSubring`. +-/ +noncomputable instance mixedIntegralLatticeContextModuleFree + (F : LocalField.{u, v} K) [CharZero K] + [MixedIntegralLatticeContext F] : + Module.Free ℤ_[F.residueCharacteristic] + F.toCompleteDVF.valuationSubring := + F.mixed_valuationSubring_moduleFree + +/-- A concrete integral basis indexed by the field degree `d = [K:Q_p]`. -/ +noncomputable def mixedIntegralBasis + (F : LocalField.{u, v} K) [CharZero K] : + letI : MixedIntegralLatticeContext F := + mixedIntegralLatticeContext F + Basis (Fin (Module.finrank ℚ_[F.residueCharacteristic] K)) + ℤ_[F.residueCharacteristic] F.toCompleteDVF.valuationSubring := by + let p : ℕ := F.residueCharacteristic + letI : MixedIntegralLatticeContext F := + mixedIntegralLatticeContext F + exact Module.finBasisOfFinrankEq ℤ_[p] F.toCompleteDVF.valuationSubring + F.mixed_valuationSubring_finrank + +/-- Coordinate form of the integral basis used in the free factor of +the mixed-characteristic field-unit structure theorem. -/ +noncomputable def mixedValuationSubringLinearEquivPi + (F : LocalField.{u, v} K) [CharZero K] : + letI : MixedIntegralLatticeContext F := + mixedIntegralLatticeContext F + F.toCompleteDVF.valuationSubring ≃ₗ[ℤ_[F.residueCharacteristic]] + (Fin (Module.finrank ℚ_[F.residueCharacteristic] K) → + ℤ_[F.residueCharacteristic]) := by + let p : ℕ := F.residueCharacteristic + letI : MixedIntegralLatticeContext F := + mixedIntegralLatticeContext F + exact F.mixedIntegralBasis.equivFun + +/-- Every power of the maximal ideal is a finite `Z_p`-module. -/ +theorem mixed_maximalIdealPow_moduleFinite + (F : LocalField.{u, v} K) [CharZero K] (n : ℕ) : + letI : MixedIntegralLatticeContext F := + mixedIntegralLatticeContext F + Module.Finite ℤ_[F.residueCharacteristic] + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) := by + let p : ℕ := F.residueCharacteristic + let : MixedIntegralLatticeContext F := + mixedIntegralLatticeContext F + exact Module.Finite.of_injective + (((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring).subtype).restrictScalars ℤ_[p]) + Subtype.val_injective + +/-- Every maximal-ideal power is free over `Z_p`. -/ +theorem mixed_maximalIdealPow_moduleFree + (F : LocalField.{u, v} K) [CharZero K] (n : ℕ) : + letI : MixedIntegralLatticeContext F := + mixedIntegralLatticeContext F + Module.Free ℤ_[F.residueCharacteristic] + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) := by + let p : ℕ := F.residueCharacteristic + let : MixedIntegralLatticeContext F := + mixedIntegralLatticeContext F + let : Module.Finite ℤ_[p] + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) := + F.mixed_maximalIdealPow_moduleFinite n + let : Module.IsTorsionFree ℤ_[p] F.toCompleteDVF.valuationSubring := + inferInstance + let : Module.IsTorsionFree ℤ_[p] + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) := by + refine Module.IsTorsionFree.of_smul_eq_zero ?_ + intro r x hrx + have hrx' : r • (x : F.toCompleteDVF.valuationSubring) = 0 := by + simpa using congrArg Subtype.val hrx + rcases (smul_eq_zero.mp hrx') with hr | hx + · exact Or.inl hr + · exact Or.inr (Subtype.ext hx) + exact Module.free_of_finite_type_torsion_free' + +/-- The finite free `Z_p` model of one maximal-ideal power. The ambient +integral-lattice context is an explicit dependency, while the indexed bundle +owns the finite and free witnesses for the selected power. -/ +class MixedMaximalIdealPowContext + (F : LocalField.{u, v} K) [CharZero K] (n : ℕ) + [MixedIntegralLatticeContext F] : Prop where + /-- The `n`th maximal-ideal power is finitely generated over `Z_p`. -/ + moduleFinite : Module.Finite ℤ_[F.residueCharacteristic] + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) + /-- The `n`th maximal-ideal power is free over `Z_p`. -/ + moduleFree : Module.Free ℤ_[F.residueCharacteristic] + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) + +/-- The canonical maximal-ideal-power context. -/ +theorem mixedMaximalIdealPowContext + (F : LocalField.{u, v} K) [CharZero K] (n : ℕ) : + letI : MixedIntegralLatticeContext F := + mixedIntegralLatticeContext F + MixedMaximalIdealPowContext F n := by + let : MixedIntegralLatticeContext F := + mixedIntegralLatticeContext F + exact + ⟨F.mixed_maximalIdealPow_moduleFinite n, + F.mixed_maximalIdealPow_moduleFree n⟩ + +/-- +Equips the target with its canonical `Module.Finite` structure, namely `Module.Finite +ℤ_[F.residueCharacteristic] ((F.toCompleteDVF.maximalIdeal ^ n : Ideal +F.toCompleteDVF.valuationSubring))`. +-/ +noncomputable instance mixedMaximalIdealPowContextModuleFinite + (F : LocalField.{u, v} K) [CharZero K] (n : ℕ) + [MixedIntegralLatticeContext F] + [ctx : MixedMaximalIdealPowContext F n] : + Module.Finite ℤ_[F.residueCharacteristic] + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) := + ctx.moduleFinite + +/-- +Equips the target with its canonical `Module.Free` structure, namely `Module.Free +ℤ_[F.residueCharacteristic] ((F.toCompleteDVF.maximalIdeal ^ n : Ideal +F.toCompleteDVF.valuationSubring))`. +-/ +noncomputable instance mixedMaximalIdealPowContextModuleFree + (F : LocalField.{u, v} K) [CharZero K] (n : ℕ) + [MixedIntegralLatticeContext F] + [ctx : MixedMaximalIdealPowContext F n] : + Module.Free ℤ_[F.residueCharacteristic] + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) := + ctx.moduleFree + +/-- A nonzero maximal-ideal power has the same `Z_p` rank as `O_K`, hence +rank exactly `[K:Q_p]`. -/ +theorem mixed_maximalIdealPow_finrank + (F : LocalField.{u, v} K) [CharZero K] (n : ℕ) : + letI : MixedIntegralLatticeContext F := + mixedIntegralLatticeContext F + letI : MixedMaximalIdealPowContext F n := + mixedMaximalIdealPowContext F n + Module.finrank ℤ_[F.residueCharacteristic] + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) = + Module.finrank ℚ_[F.residueCharacteristic] K := by + let p : ℕ := F.residueCharacteristic + let : MixedIntegralLatticeContext F := + mixedIntegralLatticeContext F + let : MixedMaximalIdealPowContext F n := + mixedMaximalIdealPowContext F n + calc + Module.finrank ℤ_[p] + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) = + Module.finrank ℤ_[p] F.toCompleteDVF.valuationSubring := by + exact Ideal.finrank_eq_finrank + F.mixedIntegralBasis + (F.toCompleteDVF.maximalIdeal ^ n) + (pow_ne_zero n F.toCompleteDVF.maximalIdeal_ne_bot) + _ = Module.finrank ℚ_[p] K := + F.mixed_valuationSubring_finrank + +/-- Coordinate form for a deep additive ideal, the source side of +the deep exponential–logarithm equivalence. -/ +noncomputable def mixedMaximalIdealPowLinearEquivPi + (F : LocalField.{u, v} K) [CharZero K] (n : ℕ) : + letI : MixedIntegralLatticeContext F := + mixedIntegralLatticeContext F + letI : MixedMaximalIdealPowContext F n := + mixedMaximalIdealPowContext F n + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) + ≃ₗ[ℤ_[F.residueCharacteristic]] + (Fin (Module.finrank ℚ_[F.residueCharacteristic] K) → + ℤ_[F.residueCharacteristic]) := by + let p : ℕ := F.residueCharacteristic + letI : MixedIntegralLatticeContext F := + mixedIntegralLatticeContext F + letI : MixedMaximalIdealPowContext F n := + mixedMaximalIdealPowContext F n + exact + (Module.finBasisOfFinrankEq ℤ_[p] + ((F.toCompleteDVF.maximalIdeal ^ n : + Ideal F.toCompleteDVF.valuationSubring)) + (F.mixed_maximalIdealPow_finrank n)).equivFun + +/-! ### The canonical `Z_p` action on `U^r` -/ + +/-- Inclusion of a higher principal-unit group into `U^1`. -/ +def higherPrincipalUnitToFirst + (F : LocalField.{u, v} K) {r : ℕ} (hr : 1 ≤ r) : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r →* + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1 where + toFun x := ⟨(x : F.toCompleteDVF.valuationSubringˣ), + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.antitone + F.toCompleteDVF hr x.property⟩ + map_one' := rfl + map_mul' _ _ := rfl + +/-- The specified map is injective: `Function.Injective (F.higherPrincipalUnitToFirst hr)`. -/ +theorem higherPrincipalUnitToFirst_injective + (F : LocalField.{u, v} K) {r : ℕ} (hr : 1 ≤ r) : + Function.Injective (F.higherPrincipalUnitToFirst hr) := by + intro x y hxy + apply Subtype.ext + exact congrArg + (fun z : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1 => + (z : F.toCompleteDVF.valuationSubringˣ)) hxy + +/-- Additive form of the inclusion `U^r → U^1`. -/ +def higherPrincipalUnitAddToFirst + (F : LocalField.{u, v} K) {r : ℕ} (hr : 1 ≤ r) : + Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r) →+ + Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) := + MonoidHom.toAdditive (F.higherPrincipalUnitToFirst hr) + +/-- The specified map is injective: `Function.Injective (F.higherPrincipalUnitAddToFirst hr)`. -/ +theorem higherPrincipalUnitAddToFirst_injective + (F : LocalField.{u, v} K) {r : ℕ} (hr : 1 ≤ r) : + Function.Injective (F.higherPrincipalUnitAddToFirst hr) := by + intro x y hxy + apply Additive.toMul.injective + exact F.higherPrincipalUnitToFirst_injective hr + (congrArg Additive.toMul hxy) + +/-- Restrict the canonical p-adic scalar action on `U^1` to the stable +subgroup `U^r`. -/ +@[reducible] +noncomputable def higherPrincipalUnitPadicSMul + (F : LocalField.{u, v} K) {r : ℕ} (hr : 1 ≤ r) : + SMul ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) where + smul a x := by + let x1 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1 := + F.higherPrincipalUnitToFirst hr (Additive.toMul x) + let y1 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1 := + Additive.toMul (a • Additive.ofMul x1) + exact Additive.ofMul ⟨(y1 : F.toCompleteDVF.valuationSubringˣ), + CompleteDVF.higherPrincipalUnitGroup.principalUnitPadic_smul_mem_higher + F hr a x1 (by simp [x1, higherPrincipalUnitToFirst])⟩ + +/-- The additive inclusion `U^r → U^1` commutes with the canonical `ℤ_p`-scalar action. -/ +@[simp] +theorem higherPrincipalUnitAddToFirst_smul + (F : LocalField.{u, v} K) {r : ℕ} (hr : 1 ≤ r) + (a : ℤ_[F.residueCharacteristic]) + (x : Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) : + letI : SMul ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := + F.higherPrincipalUnitPadicSMul hr + F.higherPrincipalUnitAddToFirst hr (a • x) = + a • F.higherPrincipalUnitAddToFirst hr x := by + rfl + +/-- The stable subgroup `U^r` with its canonical `Z_p`-module structure. -/ +@[reducible] +noncomputable def higherPrincipalUnitPadicModule + (F : LocalField.{u, v} K) {r : ℕ} (hr : 1 ≤ r) : + Module ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := by + letI : SMul ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := + F.higherPrincipalUnitPadicSMul hr + exact Module.ofMinimalAxioms + (fun a x y => by + apply F.higherPrincipalUnitAddToFirst_injective hr + simp only [map_add, F.higherPrincipalUnitAddToFirst_smul] + exact smul_add a + (F.higherPrincipalUnitAddToFirst hr x : + Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1)) + (F.higherPrincipalUnitAddToFirst hr y : + Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1))) + (fun a b x => by + apply F.higherPrincipalUnitAddToFirst_injective hr + simp only [map_add, F.higherPrincipalUnitAddToFirst_smul] + exact add_smul a b + (F.higherPrincipalUnitAddToFirst hr x : + Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1))) + (fun a b x => by + apply F.higherPrincipalUnitAddToFirst_injective hr + simp only [F.higherPrincipalUnitAddToFirst_smul, mul_smul]) + (fun x => by + apply F.higherPrincipalUnitAddToFirst_injective hr + simp only [F.higherPrincipalUnitAddToFirst_smul, one_smul]) + +/-- Natural scalars on `U^r` are the ordinary group powers. -/ +theorem higherPrincipalUnitPadic_natCast_smul + (F : LocalField.{u, v} K) {r : ℕ} (hr : 1 ≤ r) + (m : ℕ) (x : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r) : + letI : Module ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := + F.higherPrincipalUnitPadicModule hr + (m : ℤ_[F.residueCharacteristic]) • Additive.ofMul x = + Additive.ofMul (x ^ m) := by + let : Module ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := + F.higherPrincipalUnitPadicModule hr + apply F.higherPrincipalUnitAddToFirst_injective hr + rw [F.higherPrincipalUnitAddToFirst_smul] + exact + CompleteDVF.higherPrincipalUnitGroup.principalUnitPadic_natCast_smul + F m (F.higherPrincipalUnitToFirst hr x) + +/-- The inclusion `U^r \hookrightarrow U^1` is linear for the canonical +`Z_p`-actions. -/ +noncomputable def higherPrincipalUnitLinearToFirst + (F : LocalField.{u, v} K) {r : ℕ} (hr : 1 ≤ r) : + letI : Module ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := + F.higherPrincipalUnitPadicModule hr + Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r) →ₗ[ + ℤ_[F.residueCharacteristic]] + Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) := by + letI : Module ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := + F.higherPrincipalUnitPadicModule hr + exact + { F.higherPrincipalUnitAddToFirst hr with + map_smul' := fun a x => F.higherPrincipalUnitAddToFirst_smul hr a x } + +/-- The deep principal units, regarded as a `Z_p`-submodule of `U^1`. -/ +noncomputable def higherPrincipalUnitPadicSubmodule + (F : LocalField.{u, v} K) {r : ℕ} (hr : 1 ≤ r) : + Submodule ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1)) where + carrier := {x | ((Additive.toMul x : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) : + F.toCompleteDVF.valuationSubringˣ) ∈ + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r} + zero_mem' := by + change (1 : F.toCompleteDVF.valuationSubringˣ) ∈ + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r + exact Subgroup.one_mem _ + add_mem' {x y} hx hy := by + change (((Additive.toMul x : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) : + F.toCompleteDVF.valuationSubringˣ) * + ((Additive.toMul y : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) : + F.toCompleteDVF.valuationSubringˣ)) ∈ + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r + exact Subgroup.mul_mem _ hx hy + smul_mem' a x hx := + CompleteDVF.higherPrincipalUnitGroup.principalUnitPadic_smul_mem_higher + F hr a (Additive.toMul x) hx + +/-- A higher principal-unit group is linearly equivalent to its image in +`U^1`. This is the submodule used in the finite-index argument in the +proof of the mixed-characteristic field-unit structure theorem. -/ +noncomputable def higherPrincipalUnitLinearEquivPadicSubmodule + (F : LocalField.{u, v} K) {r : ℕ} (hr : 1 ≤ r) : + letI : Module ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := + F.higherPrincipalUnitPadicModule hr + Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r) ≃ₗ[ + ℤ_[F.residueCharacteristic]] F.higherPrincipalUnitPadicSubmodule hr := by + letI : Module ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := + F.higherPrincipalUnitPadicModule hr + exact + { toFun := fun x => ⟨F.higherPrincipalUnitAddToFirst hr x, + (Additive.toMul x).property⟩ + invFun := fun x => Additive.ofMul + ⟨((Additive.toMul x.1 : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) : + F.toCompleteDVF.valuationSubringˣ), x.2⟩ + left_inv := fun x => by + apply Additive.toMul.injective + apply Subtype.ext + rfl + right_inv := fun x => by + apply Subtype.ext + apply Additive.toMul.injective + apply Subtype.ext + rfl + map_add' := fun x y => by + apply Subtype.ext + exact map_add (F.higherPrincipalUnitAddToFirst hr) x y + map_smul' := fun a x => by + apply Subtype.ext + exact F.higherPrincipalUnitAddToFirst_smul hr a x } + +/-- Projection of `U^1` to the wrapped quotient `U^1/U^(n+1)`, as a +`Z_p`-linear map. -/ +noncomputable def principalUnitQuotientProjectionLinear + (F : LocalField.{u, v} K) (n : ℕ) : + Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) →ₗ[ + ℤ_[F.residueCharacteristic]] + CompleteDVF.higherPrincipalUnitGroup.DiscretePrincipalUnitQuotient + F.toCompleteDVF n := + (CompleteDVF.higherPrincipalUnitGroup.adicPrincipalUnitsCoordinateLinear + F n).comp + (CompleteDVF.higherPrincipalUnitGroup.AdicPrincipalUnits.linearEquivUnderlying + F).symm.toLinearMap + +/-- The canonically indexed image of `U^(n+1)` inside `U^1`. -/ +noncomputable def principalUnitSuccPadicSubmodule + (F : LocalField.{u, v} K) (n : ℕ) : + Submodule ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1)) := + F.higherPrincipalUnitPadicSubmodule + (Nat.succ_le_succ (Nat.zero_le n)) + +/-- The kernel of the finite projection is exactly the image of +`U^(n+1) \hookrightarrow U^1`. -/ +theorem principalUnitQuotientProjectionLinear_ker + (F : LocalField.{u, v} K) (n : ℕ) : + LinearMap.ker (F.principalUnitQuotientProjectionLinear n) = + F.principalUnitSuccPadicSubmodule n := by + let hn : 1 ≤ n + 1 := Nat.succ_le_succ (Nat.zero_le n) + change LinearMap.ker (F.principalUnitQuotientProjectionLinear n) = + F.higherPrincipalUnitPadicSubmodule hn + ext x + rw [LinearMap.mem_ker] + change (F.principalUnitQuotientProjectionLinear n) x = 0 ↔ + ((Additive.toMul x : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) : + F.toCompleteDVF.valuationSubringˣ) ∈ + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) (n + 1) + constructor + · intro hx + have hxq : + (QuotientGroup.mk (Additive.toMul x) : + CompleteDVF.higherPrincipalUnitGroup.Internal.principalUnitQuotientCarrier + F.toCompleteDVF n) = 1 := by + have hx' := congrArg + (CompleteDVF.higherPrincipalUnitGroup.DiscretePrincipalUnitQuotient.addEquiv + F.toCompleteDVF n) hx + have hxadd : Additive.ofMul + (QuotientGroup.mk (Additive.toMul x) : + CompleteDVF.higherPrincipalUnitGroup.Internal.principalUnitQuotientCarrier + F.toCompleteDVF n) = 0 := by + rw [map_zero] at hx' + change Additive.ofMul + (QuotientGroup.mk (Additive.toMul x) : + CompleteDVF.higherPrincipalUnitGroup.Internal.principalUnitQuotientCarrier + F.toCompleteDVF n) = 0 at hx' + exact hx' + have hxtomul := congrArg Additive.toMul hxadd + simpa using hxtomul + have hxmem : ((Additive.toMul x : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) : + F.toCompleteDVF.valuationSubringˣ) ∈ + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) (n + 1) := by + exact (QuotientGroup.eq_one_iff + (N := (CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1)).subgroupOf + (CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF 1)) + (Additive.toMul x)).mp hxq + exact hxmem + · intro hx + apply (CompleteDVF.higherPrincipalUnitGroup.DiscretePrincipalUnitQuotient.addEquiv + F.toCompleteDVF n).injective + apply Additive.ofMul.injective + apply (QuotientGroup.eq_one_iff + (N := (CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF (n + 1)).subgroupOf + (CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF 1)) + (Additive.toMul x)).mpr + exact hx + +open CompleteDVF.higherPrincipalUnitGroup renaming + discretePrincipalUnitQuotient_nsmul_residueCharacteristic_pow_eq_zero → + discretePrincipalUnitQuotient_nsmul_residueCharacteristic_pow_eq_zero in +/-- Every wrapped local-field coordinate `U^1/U^(n+1)` is a torsion +`Z_p`-module. -/ +theorem discretePrincipalUnitQuotient_moduleIsTorsion + (F : LocalField.{u, v} K) (n : ℕ) : + Module.IsTorsion ℤ_[F.residueCharacteristic] + (CompleteDVF.higherPrincipalUnitGroup.DiscretePrincipalUnitQuotient + F.toCompleteDVF n) := by + let exponent : ℕ := F.residueCharacteristic ^ + ((CompleteDVF.higherPrincipalUnitGroup.principalUnitResidueDegree F : ℕ) * n) + have hexponent : exponent ≠ 0 := by + exact pow_ne_zero _ F.residueCharacteristic_prime.ne_zero + let a : (ℤ_[F.residueCharacteristic])⁰ := + ⟨(exponent : ℤ_[F.residueCharacteristic]), by + rw [mem_nonZeroDivisors_iff_ne_zero] + exact_mod_cast hexponent⟩ + intro x + refine ⟨a, ?_⟩ + change (exponent : ℤ_[F.residueCharacteristic]) • x = 0 + rw [Nat.cast_smul_eq_nsmul] + exact + discretePrincipalUnitQuotient_nsmul_residueCharacteristic_pow_eq_zero + F n x + +open CompleteDVF.higherPrincipalUnitGroup renaming + card_discretePrincipalUnitQuotient_eq_residueCharacteristic_pow → + card_discretePrincipalUnitQuotient_eq_residueCharacteristic_pow in +/-- The same finite coordinate is a `p`-group, with its exact cardinality +coming from the principal-unit filtration. -/ +theorem discretePrincipalUnitQuotient_isPGroup + (F : LocalField.{u, v} K) (n : ℕ) : + IsPGroup F.residueCharacteristic + (Multiplicative + (CompleteDVF.higherPrincipalUnitGroup.DiscretePrincipalUnitQuotient + F.toCompleteDVF n)) := by + apply IsPGroup.of_card + (n := (CompleteDVF.higherPrincipalUnitGroup.principalUnitResidueDegree F : ℕ) * n) + calc + Nat.card + (Multiplicative + (CompleteDVF.higherPrincipalUnitGroup.DiscretePrincipalUnitQuotient + F.toCompleteDVF n)) = + Nat.card + (CompleteDVF.higherPrincipalUnitGroup.DiscretePrincipalUnitQuotient + F.toCompleteDVF n) := + Nat.card_congr Multiplicative.toAdd + _ = F.residueCharacteristic ^ + ((CompleteDVF.higherPrincipalUnitGroup.principalUnitResidueDegree F : ℕ) * n) := + card_discretePrincipalUnitQuotient_eq_residueCharacteristic_pow + F n + +/-- Finite generation passes from a higher principal-unit group to its +image as a submodule of `U^1`. -/ +theorem higherPrincipalUnitPadicSubmodule_moduleFinite + (F : LocalField.{u, v} K) {r : ℕ} (hr : 1 ≤ r) + (hfinite : @Module.Finite ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) _ _ + (F.higherPrincipalUnitPadicModule hr)) : + Module.Finite ℤ_[F.residueCharacteristic] + (F.higherPrincipalUnitPadicSubmodule hr) := by + let : Module ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := + F.higherPrincipalUnitPadicModule hr + let : Module.Finite ℤ_[F.residueCharacteristic] + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := hfinite + exact Module.Finite.equiv + (F.higherPrincipalUnitLinearEquivPadicSubmodule hr) + +end LocalField +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm.lean new file mode 100644 index 0000000000..9e9555e9d1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Quotients + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Basic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Basic.lean new file mode 100644 index 0000000000..898fca4b1a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Basic.lean @@ -0,0 +1,1082 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Units +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.IntegerMultipleSubgroup + +/-! # Basic -/ + +@[expose] public section +namespace LocalFieldTheory + +/-! +# Integer-valued norm data + +This file contains the norm-subgroup lemmas used in local CFT from an abstract +integer-valued multiplicative valuation and a norm homomorphism satisfying the +standard valuation formula. +-/ + +noncomputable +section + +universe u v + +namespace DiscreteValuationField + +/-- A multiplicative group valuation with values in additive integers. -/ +structure MultiplicativeIntegerValuation (G : Type u) [Group G] where + /-- The integer valuation of a group element. -/ + val : G → ℤ + /-- The identity has valuation zero. -/ + map_one : val 1 = 0 + /-- Valuation turns multiplication into integer addition. -/ + map_mul : ∀ x y : G, val (x * y) = val x + val y + +namespace MultiplicativeIntegerValuation + +variable {G : Type u} [Group G] (V : MultiplicativeIntegerValuation G) + +/-- Establishes the identity `V.val (1 : G) = 0`. -/ +@[simp] theorem val_one : V.val (1 : G) = 0 := + V.map_one + +/-- `val` satisfies the multiplication formula `V.val (x * y) = V.val x + V.val y`. -/ +@[simp] theorem val_mul (x y : G) : + V.val (x * y) = V.val x + V.val y := + V.map_mul x y + +/-- The integer-valued valuation as a multiplicative homomorphism to the +additive group of integers written multiplicatively. -/ +def valuationHom : G →* Multiplicative ℤ where + toFun x := Multiplicative.ofAdd (V.val x) + map_one' := by + simp [V.val_one] + map_mul' x y := by + rw [V.val_mul, ofAdd_add] + +/-- +The defining evaluation formula for `valuationHom` is `V.valuationHom x = Multiplicative.ofAdd +(V.val x)`. +-/ +@[simp] theorem valuationHom_apply (x : G) : + V.valuationHom x = Multiplicative.ofAdd (V.val x) := + rfl + +/-- Characterizes `x ∈ V.valuationHom.ker` by the equivalent condition `V.val x = 0`. -/ +theorem mem_valuationHom_ker_iff (x : G) : + x ∈ V.valuationHom.ker ↔ V.val x = 0 := by + change V.valuationHom x = 1 ↔ V.val x = 0 + rw [V.valuationHom_apply] + constructor + · intro hx + exact Multiplicative.ofAdd.injective (by simpa using hx) + · intro hx + rw [hx] + simp + +/-- `val` satisfies the inverse formula `V.val x⁻¹ = -V.val x`. -/ +@[simp] theorem val_inv (x : G) : + V.val x⁻¹ = -V.val x := by + have h := V.map_mul x x⁻¹ + have h' : V.val x + V.val x⁻¹ = 0 := by + simpa [V.map_one] using h.symm + exact eq_neg_iff_add_eq_zero.2 (by simpa [add_comm] using h') + +/-- `val` satisfies the division formula `V.val (x / y) = V.val x - V.val y`. -/ +@[simp] theorem val_div (x y : G) : + V.val (x / y) = V.val x - V.val y := by + rw [div_eq_mul_inv, V.val_mul, V.val_inv, sub_eq_add_neg] + +/-- `val` satisfies the natural-power formula `V.val (x ^ n) = (n : ℤ) * V.val x`. -/ +@[simp] theorem val_pow (x : G) (n : ℕ) : + V.val (x ^ n) = (n : ℤ) * V.val x := by + induction n with + | zero => + rw [pow_zero, V.val_one] + simp + | succ n ih => + calc + V.val (x ^ Nat.succ n) = V.val (x ^ n * x) := by + rw [pow_succ] + _ = V.val (x ^ n) + V.val x := V.val_mul _ _ + _ = (n : ℤ) * V.val x + V.val x := by + rw [ih] + _ = ((n : ℤ) + 1) * V.val x := by + rw [add_mul, one_mul] + _ = (Nat.succ n : ℤ) * V.val x := by + rw [Nat.cast_succ] + +/-- `val` satisfies the integer-power formula `V.val (x ^ n) = n * V.val x`. -/ +@[simp] theorem val_zpow (x : G) (n : ℤ) : + V.val (x ^ n) = n * V.val x := by + cases n with + | ofNat n => + rw [Int.ofNat_eq_natCast, zpow_natCast, V.val_pow] + | negSucc n => + rw [zpow_negSucc, V.val_inv, V.val_pow] + change -(((n + 1 : ℕ) : ℤ) * V.val x) = + -(((n + 1 : ℕ) : ℤ)) * V.val x + rw [neg_mul] + +/-- Establishes the identity `V.val x⁻¹ = 0`. -/ +theorem val_inv_eq_zero_of_val_eq_zero {x : G} (hx : V.val x = 0) : + V.val x⁻¹ = 0 := by + rw [V.val_inv, hx, neg_zero] + +/-- Characterizes `V.val (x / y) = 0` by the equivalent condition `V.val x = V.val y`. -/ +theorem val_div_eq_zero_iff (x y : G) : + V.val (x / y) = 0 ↔ V.val x = V.val y := by + rw [V.val_div] + constructor + · exact sub_eq_zero.mp + · exact sub_eq_zero.mpr + +/-- Characterizes `V.val (x ^ n) = 0` by the equivalent condition `V.val x = 0`. -/ +theorem val_pow_eq_zero_iff_of_ne_zero (x : G) {n : ℕ} (hn : n ≠ 0) : + V.val (x ^ n) = 0 ↔ V.val x = 0 := by + rw [V.val_pow] + have hn' : (n : ℤ) ≠ 0 := Int.ofNat_ne_zero.mpr hn + constructor + · intro h + exact (mul_eq_zero.mp h).resolve_left hn' + · intro hx + rw [hx, mul_zero] + +/-- Establishes the identity `V.val x = 0`. -/ +theorem val_eq_zero_of_pow_eq_one (x : G) {n : ℕ} + (hn : n ≠ 0) (hpow : x ^ n = 1) : + V.val x = 0 := by + have hv : V.val (x ^ n) = 0 := by rw [hpow, V.val_one] + exact (V.val_pow_eq_zero_iff_of_ne_zero x hn).1 hv + +/-- Characterizes `V.val (x ^ n) = 0` by the equivalent condition `V.val x = 0`. -/ +theorem val_zpow_eq_zero_iff_of_ne_zero (x : G) {n : ℤ} (hn : n ≠ 0) : + V.val (x ^ n) = 0 ↔ V.val x = 0 := by + rw [V.val_zpow] + constructor + · intro h + exact (mul_eq_zero.mp h).resolve_left hn + · intro hx + rw [hx, mul_zero] + +/-- Establishes the identity `V.val x = 0`. -/ +theorem val_eq_zero_of_zpow_eq_one (x : G) {n : ℤ} + (hn : n ≠ 0) (hpow : x ^ n = 1) : + V.val x = 0 := by + have hv : V.val (x ^ n) = 0 := by rw [hpow, V.val_one] + exact (V.val_zpow_eq_zero_iff_of_ne_zero x hn).1 hv + +/-- Elements of valuation zero. -/ +def zeroSubgroup : Subgroup G where + carrier := {x | V.val x = 0} + one_mem' := by simp [V.map_one] + mul_mem' := by + intro x y hx hy + change V.val (x * y) = 0 + rw [V.map_mul, hx, hy, add_zero] + inv_mem' := by + intro x hx + exact V.val_inv_eq_zero_of_val_eq_zero hx + +/-- Characterizes `x ∈ V.zeroSubgroup` by the equivalent condition `V.val x = 0`. -/ +@[simp] theorem mem_zeroSubgroup_iff (x : G) : + x ∈ V.zeroSubgroup ↔ V.val x = 0 := + Iff.rfl + +/-- Establishes the identity `V.valuationHom.ker = V.zeroSubgroup`. -/ +theorem valuationHom_ker_eq_zeroSubgroup : + V.valuationHom.ker = V.zeroSubgroup := by + ext x + rw [V.mem_valuationHom_ker_iff, V.mem_zeroSubgroup_iff] + +/-- The subgroup appearing in `(V.zeroSubgroup).Normal` is normal. -/ +instance zeroSubgroup_normal : (V.zeroSubgroup).Normal := by + rw [← V.valuationHom_ker_eq_zeroSubgroup] + infer_instance + +/-- The value subgroup of an integer-valued valuation. It is the range of the +valuation homomorphism `valuationHom`. -/ +def valueSubgroup : Subgroup (Multiplicative ℤ) := + V.valuationHom.range + +/-- +Characterizes `n ∈ V.valueSubgroup` by the equivalent condition `∃ x : G, V.valuationHom x = n`. +-/ +@[simp] theorem mem_valueSubgroup_iff (n : Multiplicative ℤ) : + n ∈ V.valueSubgroup ↔ ∃ x : G, V.valuationHom x = n := + Iff.rfl + +/-- +Characterizes `Multiplicative.ofAdd n ∈ V.valueSubgroup` by the equivalent condition `∃ x : G, +V.val x = n`. +-/ +theorem ofAdd_mem_valueSubgroup_iff (n : ℤ) : + Multiplicative.ofAdd n ∈ V.valueSubgroup ↔ ∃ x : G, V.val x = n := by + rw [V.mem_valueSubgroup_iff (Multiplicative.ofAdd n)] + constructor + · rintro ⟨x, hx⟩ + rw [V.valuationHom_apply] at hx + exact ⟨x, Multiplicative.ofAdd.injective hx⟩ + · rintro ⟨x, hx⟩ + exact ⟨x, by rw [V.valuationHom_apply, hx]⟩ + +/-- Establishes the membership statement `Multiplicative.ofAdd n ∈ V.valueSubgroup`. -/ +theorem ofAdd_mem_valueSubgroup_of_exists_val {n : ℤ} + (hn : ∃ x : G, V.val x = n) : + Multiplicative.ofAdd n ∈ V.valueSubgroup := + (V.ofAdd_mem_valueSubgroup_iff n).2 hn + +/-- Establishes the identity `∃ x : G, V.val x = n`. -/ +theorem exists_val_of_ofAdd_mem_valueSubgroup {n : ℤ} + (hn : Multiplicative.ofAdd n ∈ V.valueSubgroup) : + ∃ x : G, V.val x = n := + (V.ofAdd_mem_valueSubgroup_iff n).1 hn + +/-- +Characterizes `Function.Surjective V.valuationHom` by the equivalent condition +`Function.Surjective V.val`. +-/ +theorem valuationHom_surjective_iff : + Function.Surjective V.valuationHom ↔ Function.Surjective V.val := by + constructor + · intro hV n + rcases hV (Multiplicative.ofAdd n) with ⟨x, hx⟩ + rw [V.valuationHom_apply] at hx + exact ⟨x, Multiplicative.ofAdd.injective hx⟩ + · intro hV n + rcases hV (Multiplicative.toAdd n) with ⟨x, hx⟩ + exact ⟨x, by rw [V.valuationHom_apply, hx, ofAdd_toAdd]⟩ + +/-- Establishes the identity `V.valueSubgroup = ⊤`. -/ +theorem valueSubgroup_eq_top_of_surjective (hV : Function.Surjective V.val) : + V.valueSubgroup = ⊤ := by + ext n + constructor + · intro hn + trivial + · intro hn + rcases hV (Multiplicative.toAdd n) with ⟨x, hx⟩ + rw [V.mem_valueSubgroup_iff n] + exact ⟨x, by rw [V.valuationHom_apply, hx, ofAdd_toAdd]⟩ + +/-- First-isomorphism-theorem form for an integer-valued valuation: +the quotient by valuation-zero elements is the value subgroup. -/ +noncomputable def quotientZeroSubgroupEquivValueSubgroup : + G ⧸ V.zeroSubgroup ≃* V.valueSubgroup := + (QuotientGroup.quotientMulEquivOfEq + (V.valuationHom_ker_eq_zeroSubgroup).symm).trans + (QuotientGroup.quotientKerEquivRange V.valuationHom) + +/-- +Establishes the identity `V.quotientZeroSubgroupEquivValueSubgroup (QuotientGroup.mk' +V.zeroSubgroup x) = V.valuationHom.rangeRestrict x`. +-/ +theorem quotientZeroSubgroupEquivValueSubgroup_mk (x : G) : + V.quotientZeroSubgroupEquivValueSubgroup + (QuotientGroup.mk' V.zeroSubgroup x) = + V.valuationHom.rangeRestrict x := + rfl + +/-- +Establishes the identity `((V.quotientZeroSubgroupEquivValueSubgroup (QuotientGroup.mk' +V.zeroSubgroup x) : V.valueSubgroup) : Multiplicative ℤ) = Multiplicative.ofAdd (V.val x)`. +-/ +theorem coe_quotientZeroSubgroupEquivValueSubgroup_mk (x : G) : + ((V.quotientZeroSubgroupEquivValueSubgroup + (QuotientGroup.mk' V.zeroSubgroup x) : V.valueSubgroup) : + Multiplicative ℤ) = + Multiplicative.ofAdd (V.val x) := by + rw [V.quotientZeroSubgroupEquivValueSubgroup_mk] + rfl + +/-- +Establishes the identity `Multiplicative.toAdd (((V.quotientZeroSubgroupEquivValueSubgroup +(QuotientGroup.mk' V.zeroSubgroup x) : V.valueSubgroup) : Multiplicative ℤ)) = V.val x`. +-/ +theorem toAdd_quotientZeroSubgroupEquivValueSubgroup_mk (x : G) : + Multiplicative.toAdd + (((V.quotientZeroSubgroupEquivValueSubgroup + (QuotientGroup.mk' V.zeroSubgroup x) : V.valueSubgroup) : + Multiplicative ℤ)) = V.val x := by + rw [V.coe_quotientZeroSubgroupEquivValueSubgroup_mk, toAdd_ofAdd] + +/-- +Establishes the identity `Multiplicative.toAdd (((V.quotientZeroSubgroupEquivValueSubgroup +(QuotientGroup.mk' V.zeroSubgroup (x / y)) : V.valueSubgroup) : Multiplicative ℤ)) = V.val x - +V.val y`. +-/ +theorem toAdd_quotientZeroSubgroupEquivValueSubgroup_div_mk + (x y : G) : + Multiplicative.toAdd + (((V.quotientZeroSubgroupEquivValueSubgroup + (QuotientGroup.mk' V.zeroSubgroup (x / y)) : V.valueSubgroup) : + Multiplicative ℤ)) = V.val x - V.val y := by + rw [V.toAdd_quotientZeroSubgroupEquivValueSubgroup_mk, V.val_div] + +/-- +Characterizes `((V.quotientZeroSubgroupEquivValueSubgroup (QuotientGroup.mk' V.zeroSubgroup x) : +V.valueSubgroup) : Multiplicative ℤ) ∈ integerMultipleSubgroup d` by the equivalent condition `d ∣ +V.val x`. +-/ +theorem quotientZeroSubgroup_value_mem_integerMultipleSubgroup_iff + (d : ℤ) (x : G) : + ((V.quotientZeroSubgroupEquivValueSubgroup + (QuotientGroup.mk' V.zeroSubgroup x) : V.valueSubgroup) : + Multiplicative ℤ) ∈ integerMultipleSubgroup d ↔ d ∣ V.val x := by + rw [V.coe_quotientZeroSubgroupEquivValueSubgroup_mk, + ofAdd_mem_integerMultipleSubgroup_iff] + +/-- +Characterizes `((V.quotientZeroSubgroupEquivValueSubgroup (QuotientGroup.mk' V.zeroSubgroup (x / +y)) : V.valueSubgroup) : Multiplicative ℤ) ∈ integerMultipleSubgroup d` by the equivalent +condition `d ∣ V.val x - V.val y`. +-/ +theorem quotientZeroSubgroup_value_div_mem_integerMultipleSubgroup_iff + (d : ℤ) (x y : G) : + ((V.quotientZeroSubgroupEquivValueSubgroup + (QuotientGroup.mk' V.zeroSubgroup (x / y)) : V.valueSubgroup) : + Multiplicative ℤ) ∈ integerMultipleSubgroup d ↔ + d ∣ V.val x - V.val y := by + rw [V.coe_quotientZeroSubgroupEquivValueSubgroup_mk, + ofAdd_mem_integerMultipleSubgroup_iff, V.val_div] + +/-- +Establishes the membership statement `((V.quotientZeroSubgroupEquivValueSubgroup +(QuotientGroup.mk' V.zeroSubgroup x) : V.valueSubgroup) : Multiplicative ℤ) ∈ +integerMultipleSubgroup d`. +-/ +theorem quotientZeroSubgroup_value_mem_integerMultipleSubgroup_of_dvd_val + {d : ℤ} {x : G} (hx : d ∣ V.val x) : + ((V.quotientZeroSubgroupEquivValueSubgroup + (QuotientGroup.mk' V.zeroSubgroup x) : V.valueSubgroup) : + Multiplicative ℤ) ∈ integerMultipleSubgroup d := + (V.quotientZeroSubgroup_value_mem_integerMultipleSubgroup_iff d x).2 hx + +/-- Establishes the divisibility statement `d ∣ V.val x`. -/ +theorem dvd_val_of_quotientZeroSubgroup_value_mem_integerMultipleSubgroup + {d : ℤ} {x : G} + (hx : + ((V.quotientZeroSubgroupEquivValueSubgroup + (QuotientGroup.mk' V.zeroSubgroup x) : V.valueSubgroup) : + Multiplicative ℤ) ∈ integerMultipleSubgroup d) : + d ∣ V.val x := + (V.quotientZeroSubgroup_value_mem_integerMultipleSubgroup_iff d x).1 hx + +/-- +Establishes the membership statement `((V.quotientZeroSubgroupEquivValueSubgroup +(QuotientGroup.mk' V.zeroSubgroup (x / y)) : V.valueSubgroup) : Multiplicative ℤ) ∈ +integerMultipleSubgroup d`. +-/ +theorem quotientZeroSubgroup_value_div_mem_integerMultipleSubgroup_of_dvd + {d : ℤ} {x y : G} (hxy : d ∣ V.val x - V.val y) : + ((V.quotientZeroSubgroupEquivValueSubgroup + (QuotientGroup.mk' V.zeroSubgroup (x / y)) : V.valueSubgroup) : + Multiplicative ℤ) ∈ integerMultipleSubgroup d := + (V.quotientZeroSubgroup_value_div_mem_integerMultipleSubgroup_iff d x y).2 hxy + +/-- Establishes the divisibility statement `d ∣ V.val x - V.val y`. -/ +theorem dvd_of_quotientZeroSubgroup_value_div_mem_integerMultipleSubgroup + {d : ℤ} {x y : G} + (hxy : + ((V.quotientZeroSubgroupEquivValueSubgroup + (QuotientGroup.mk' V.zeroSubgroup (x / y)) : V.valueSubgroup) : + Multiplicative ℤ) ∈ integerMultipleSubgroup d) : + d ∣ V.val x - V.val y := + (V.quotientZeroSubgroup_value_div_mem_integerMultipleSubgroup_iff d x y).1 hxy + +/-- If the valuation is surjective, the quotient by valuation-zero elements is +the full multiplicative copy of `ℤ`. -/ +noncomputable def quotientZeroSubgroupEquivMultiplicativeInt + (hV : Function.Surjective V.val) : + G ⧸ V.zeroSubgroup ≃* Multiplicative ℤ := + V.quotientZeroSubgroupEquivValueSubgroup.trans + ((MulEquiv.subgroupCongr (V.valueSubgroup_eq_top_of_surjective hV)).trans + Subgroup.topEquiv) + +/-- A multiplicative element of valuation one. -/ +def IsUniformizer (ϖ : G) : Prop := + V.val ϖ = 1 + +/-- Existence of a multiplicative element of valuation one. -/ +def HasUniformizer : Prop := + ∃ ϖ : G, V.IsUniformizer ϖ + +/-- A surjective integer valuation has an element of valuation one. -/ +theorem hasUniformizer_of_surjective (hV : Function.Surjective V.val) : + V.HasUniformizer := by + rcases hV 1 with ⟨ϖ, hϖ⟩ + exact ⟨ϖ, hϖ⟩ + +/-- Surjectivity of the integer valuation yields a uniformizer. -/ +theorem exists_uniformizer_of_surjective (hV : Function.Surjective V.val) : + ∃ ϖ : G, V.IsUniformizer ϖ := + V.hasUniformizer_of_surjective hV + +/-- `val_uniformizer` satisfies the integer-power formula `V.val (ϖ ^ n) = n`. -/ +theorem val_uniformizer_zpow {ϖ : G} (hϖ : V.IsUniformizer ϖ) + (n : ℤ) : + V.val (ϖ ^ n) = n := by + rw [V.val_zpow, hϖ, mul_one] + +/-- `val_uniformizer` satisfies the natural-power formula `V.val (ϖ ^ n) = (n : ℤ)`. -/ +theorem val_uniformizer_pow {ϖ : G} (hϖ : V.IsUniformizer ϖ) + (n : ℕ) : + V.val (ϖ ^ n) = (n : ℤ) := by + simpa using V.val_uniformizer_zpow hϖ (n : ℤ) + +/-- Characterizes `ϖ ^ n ∈ V.zeroSubgroup` by the equivalent condition `n = 0`. -/ +theorem uniformizer_zpow_mem_zeroSubgroup_iff {ϖ : G} + (hϖ : V.IsUniformizer ϖ) (n : ℤ) : + ϖ ^ n ∈ V.zeroSubgroup ↔ n = 0 := by + rw [V.mem_zeroSubgroup_iff, V.val_uniformizer_zpow hϖ n] + +/-- Characterizes `ϖ ^ n ∈ V.zeroSubgroup` by the equivalent condition `n = 0`. -/ +theorem uniformizer_pow_mem_zeroSubgroup_iff {ϖ : G} + (hϖ : V.IsUniformizer ϖ) (n : ℕ) : + ϖ ^ n ∈ V.zeroSubgroup ↔ n = 0 := by + rw [V.mem_zeroSubgroup_iff, V.val_uniformizer_pow hϖ n] + exact Int.ofNat_eq_zero + +/-- The specified map is surjective: `Function.Surjective V.val`. -/ +theorem val_surjective_of_uniformizer {ϖ : G} (hϖ : V.IsUniformizer ϖ) : + Function.Surjective V.val := by + intro n + exact ⟨ϖ ^ n, V.val_uniformizer_zpow hϖ n⟩ + +/-- Characterizes `V.HasUniformizer` by the equivalent condition `Function.Surjective V.val`. -/ +theorem hasUniformizer_iff_val_surjective : + V.HasUniformizer ↔ Function.Surjective V.val := by + constructor + · rintro ⟨ϖ, hϖ⟩ + exact V.val_surjective_of_uniformizer hϖ + · exact V.hasUniformizer_of_surjective + +/-- Establishes the identity `V.valueSubgroup = ⊤`. -/ +theorem valueSubgroup_eq_top_of_uniformizer {ϖ : G} + (hϖ : V.IsUniformizer ϖ) : + V.valueSubgroup = ⊤ := + V.valueSubgroup_eq_top_of_surjective + (V.val_surjective_of_uniformizer hϖ) + +/-- Uniformizer form of the quotient equivalence `G / G⁰ ≃ Multiplicative ℤ`. +The uniformizer proves that the value group is all of `ℤ`. -/ +noncomputable def quotientZeroSubgroupEquivMultiplicativeIntOfUniformizer + {ϖ : G} (hϖ : V.IsUniformizer ϖ) : + G ⧸ V.zeroSubgroup ≃* Multiplicative ℤ := + V.quotientZeroSubgroupEquivMultiplicativeInt + (V.val_surjective_of_uniformizer hϖ) + +/-- +`coe_quotientZeroSubgroupEquivValueSubgroup_uniformizer` satisfies the integer-power formula +`((V.quotientZeroSubgroupEquivValueSubgroup (QuotientGroup.mk' V.zeroSubgroup (ϖ ^ n)) : +V.valueSubgroup) : Multiplicative ℤ) = Multiplicative.ofAdd n`. +-/ +theorem coe_quotientZeroSubgroupEquivValueSubgroup_uniformizer_zpow + {ϖ : G} (hϖ : V.IsUniformizer ϖ) (n : ℤ) : + ((V.quotientZeroSubgroupEquivValueSubgroup + (QuotientGroup.mk' V.zeroSubgroup (ϖ ^ n)) : V.valueSubgroup) : + Multiplicative ℤ) = Multiplicative.ofAdd n := by + rw [V.coe_quotientZeroSubgroupEquivValueSubgroup_mk, + V.val_uniformizer_zpow hϖ n] + +/-- +`toAdd_quotientZeroSubgroupEquivValueSubgroup_uniformizer` satisfies the integer-power formula +`Multiplicative.toAdd (((V.quotientZeroSubgroupEquivValueSubgroup (QuotientGroup.mk' +V.zeroSubgroup (ϖ ^ n)) : V.valueSubgroup) : Multiplicative ℤ)) = n`. +-/ +theorem toAdd_quotientZeroSubgroupEquivValueSubgroup_uniformizer_zpow + {ϖ : G} (hϖ : V.IsUniformizer ϖ) (n : ℤ) : + Multiplicative.toAdd + (((V.quotientZeroSubgroupEquivValueSubgroup + (QuotientGroup.mk' V.zeroSubgroup (ϖ ^ n)) : V.valueSubgroup) : + Multiplicative ℤ)) = n := by + rw [V.coe_quotientZeroSubgroupEquivValueSubgroup_uniformizer_zpow hϖ n, + toAdd_ofAdd] + +/-- A representative-level decomposition `x = u * ϖ^n`, with `u` of valuation +zero. This is the abstract multiplicative form of `Kˣ = O_Kˣ · ϖ^ℤ`. -/ +structure UnitUniformizerDecomposition (ϖ x : G) where + /-- The valuation-zero factor. -/ + unitPart : G + /-- The unit factor has valuation zero. -/ + unit_mem : unitPart ∈ V.zeroSubgroup + /-- The exponent of the chosen uniformizer. -/ + exponent : ℤ + /-- Reconstruction from the unit factor and uniformizer power. -/ + eq_unit_mul_zpow : x = unitPart * ϖ ^ exponent + +/-- Every element admits a unit-uniformizer decomposition with respect to `ϖ`. -/ +def HasUnitUniformizerDecomposition (ϖ : G) : Prop := + ∀ x : G, Nonempty (V.UnitUniformizerDecomposition ϖ x) + +/-- The canonical unit-uniformizer decomposition attached to a uniformizer. -/ +def canonicalUnitUniformizerDecomposition {ϖ : G} + (hϖ : V.IsUniformizer ϖ) (x : G) : + V.UnitUniformizerDecomposition ϖ x where + unitPart := x * ϖ ^ (-(V.val x)) + unit_mem := by + rw [V.mem_zeroSubgroup_iff, V.val_mul, V.val_zpow, hϖ] + ring + exponent := V.val x + eq_unit_mul_zpow := by + calc + x = x * 1 := by rw [mul_one] + _ = x * (ϖ ^ (-(V.val x)) * ϖ ^ V.val x) := by + rw [← zpow_add, neg_add_cancel, zpow_zero] + _ = (x * ϖ ^ (-(V.val x))) * ϖ ^ V.val x := by + rw [mul_assoc] + +/-- +A chosen uniformizer gives a unit-times-uniformizer-power decomposition of every group element. +-/ +theorem hasUnitUniformizerDecomposition_of_uniformizer {ϖ : G} + (hϖ : V.IsUniformizer ϖ) : + V.HasUnitUniformizerDecomposition ϖ := by + intro x + exact ⟨V.canonicalUnitUniformizerDecomposition hϖ x⟩ + +/-- +Every group element has a unit-times-uniformizer-power decomposition relative to a chosen +uniformizer. +-/ +theorem unitUniformizerDecomposition {ϖ : G} + (hϖ : V.IsUniformizer ϖ) (x : G) : + Nonempty (V.UnitUniformizerDecomposition ϖ x) := + V.hasUnitUniformizerDecomposition_of_uniformizer hϖ x + +/-- +`exists_zeroSubgroup_mul_uniformizer` satisfies the integer-power formula `∃ u : G, u ∈ +V.zeroSubgroup ∧ ∃ n : ℤ, x = u * ϖ ^ n`. +-/ +theorem exists_zeroSubgroup_mul_uniformizer_zpow {ϖ : G} + (hϖ : V.IsUniformizer ϖ) (x : G) : + ∃ u : G, u ∈ V.zeroSubgroup ∧ ∃ n : ℤ, x = u * ϖ ^ n := by + rcases V.unitUniformizerDecomposition hϖ x with ⟨d⟩ + exact ⟨d.unitPart, d.unit_mem, d.exponent, d.eq_unit_mul_zpow⟩ + +/-- Establishes the identity `∃ u : G, u ∈ V.zeroSubgroup ∧ u * ϖ ^ V.val x = x`. -/ +theorem exists_zeroSubgroup_mul_uniformizer_zpow_eq {ϖ : G} + (hϖ : V.IsUniformizer ϖ) (x : G) : + ∃ u : G, u ∈ V.zeroSubgroup ∧ u * ϖ ^ V.val x = x := by + let d := V.canonicalUnitUniformizerDecomposition hϖ x + exact ⟨d.unitPart, d.unit_mem, d.eq_unit_mul_zpow.symm⟩ + +/-- +Characterizes `V.val x = n` by the equivalent condition `∃ u : G, u ∈ V.zeroSubgroup ∧ u * ϖ ^ n = +x`. +-/ +theorem val_eq_iff_exists_zeroSubgroup_mul_uniformizer_zpow {ϖ : G} + (hϖ : V.IsUniformizer ϖ) (x : G) (n : ℤ) : + V.val x = n ↔ ∃ u : G, u ∈ V.zeroSubgroup ∧ u * ϖ ^ n = x := by + constructor + · intro hx + refine ⟨x * (ϖ ^ n)⁻¹, ?_, ?_⟩ + · rw [V.mem_zeroSubgroup_iff, V.val_mul, V.val_inv, + V.val_uniformizer_zpow hϖ n, hx] + ring + · rw [mul_assoc, inv_mul_cancel, mul_one] + · rintro ⟨u, hu, hux⟩ + rw [← hux, V.val_mul, (V.mem_zeroSubgroup_iff u).1 hu, + V.val_uniformizer_zpow hϖ n, zero_add] + +/-- +Characterizes `V.val x = n` by the equivalent condition `∃ u : G, u ∈ V.zeroSubgroup ∧ x = u * ϖ ^ +n`. +-/ +theorem val_eq_iff_exists_eq_zeroSubgroup_mul_uniformizer_zpow {ϖ : G} + (hϖ : V.IsUniformizer ϖ) (x : G) (n : ℤ) : + V.val x = n ↔ ∃ u : G, u ∈ V.zeroSubgroup ∧ x = u * ϖ ^ n := by + constructor + · intro hx + rcases (V.val_eq_iff_exists_zeroSubgroup_mul_uniformizer_zpow hϖ x n).1 hx + with ⟨u, hu, hux⟩ + exact ⟨u, hu, hux.symm⟩ + · rintro ⟨u, hu, hx⟩ + rw [hx, V.val_mul, (V.mem_zeroSubgroup_iff u).1 hu, + V.val_uniformizer_zpow hϖ n] + ring + +namespace UnitUniformizerDecomposition + +variable {V : MultiplicativeIntegerValuation G} {ϖ x : G} + +/-- Establishes the identity `V.val d.unitPart = 0`. -/ +@[simp] theorem unitPart_val_zero + (d : V.UnitUniformizerDecomposition ϖ x) : + V.val d.unitPart = 0 := + (V.mem_zeroSubgroup_iff d.unitPart).1 d.unit_mem + +/-- The valuation of the represented element is the exponent when `ϖ` is a +uniformizer. -/ +theorem val_eq_exponent (hϖ : V.IsUniformizer ϖ) + (d : V.UnitUniformizerDecomposition ϖ x) : + V.val x = d.exponent := by + calc + V.val x = V.val (d.unitPart * ϖ ^ d.exponent) := by + exact congrArg V.val d.eq_unit_mul_zpow + _ = V.val d.unitPart + V.val (ϖ ^ d.exponent) := by + rw [V.val_mul] + _ = 0 + V.val (ϖ ^ d.exponent) := by + rw [unitPart_val_zero d] + _ = 0 + d.exponent := by + rw [V.val_uniformizer_zpow hϖ d.exponent] + _ = d.exponent := by + rw [zero_add] + +/-- The unit part is recovered from the represented element and the recorded +exponent. -/ +theorem unitPart_eq_mul_inv_zpow + (d : V.UnitUniformizerDecomposition ϖ x) : + d.unitPart = x * (ϖ ^ d.exponent)⁻¹ := by + calc + d.unitPart = + (d.unitPart * ϖ ^ d.exponent) * (ϖ ^ d.exponent)⁻¹ := by + rw [mul_assoc, mul_inv_cancel, mul_one] + _ = x * (ϖ ^ d.exponent)⁻¹ := by + rw [← d.eq_unit_mul_zpow] + +/-- If two decompositions use the same exponent, then their unit parts agree. -/ +theorem unitPart_unique_of_exponent_eq + (d₁ d₂ : V.UnitUniformizerDecomposition ϖ x) + (h : d₁.exponent = d₂.exponent) : + d₁.unitPart = d₂.unitPart := by + rw [unitPart_eq_mul_inv_zpow d₁, unitPart_eq_mul_inv_zpow d₂, h] + +/-- The exponent in a unit-uniformizer decomposition is unique. -/ +theorem exponent_unique (hϖ : V.IsUniformizer ϖ) + (d₁ d₂ : V.UnitUniformizerDecomposition ϖ x) : + d₁.exponent = d₂.exponent := by + calc + d₁.exponent = V.val x := (val_eq_exponent hϖ d₁).symm + _ = d₂.exponent := val_eq_exponent hϖ d₂ + +/-- The unit part in a unit-uniformizer decomposition is unique once the +uniformizer is fixed. -/ +theorem unitPart_unique (hϖ : V.IsUniformizer ϖ) + (d₁ d₂ : V.UnitUniformizerDecomposition ϖ x) : + d₁.unitPart = d₂.unitPart := + unitPart_unique_of_exponent_eq d₁ d₂ (exponent_unique hϖ d₁ d₂) + +/-- A valuation-zero multiple of a uniformizer power has valuation equal to +the exponent. -/ +theorem val_unit_mul_zpow (hϖ : V.IsUniformizer ϖ) + {u : G} (hu : u ∈ V.zeroSubgroup) (n : ℤ) : + V.val (u * ϖ ^ n) = n := by + rw [V.val_mul, (V.mem_zeroSubgroup_iff u).1 hu, + V.val_uniformizer_zpow hϖ n, zero_add] + +/-- A uniformizer power has valuation equal to its exponent. -/ +theorem val_uniformizer_zpow (hϖ : V.IsUniformizer ϖ) (n : ℤ) : + V.val (ϖ ^ n) = n := + V.val_uniformizer_zpow hϖ n + +/-- A natural power of a uniformizer has valuation equal to the natural +exponent. -/ +theorem val_uniformizer_pow (hϖ : V.IsUniformizer ϖ) (n : ℕ) : + V.val (ϖ ^ n) = (n : ℤ) := + V.val_uniformizer_pow hϖ n + +/-- Equality of two unit-uniformizer normal forms forces equality of +exponents. -/ +theorem exponent_unique_of_unit_mul_eq (hϖ : V.IsUniformizer ϖ) + {u w : G} (hu : u ∈ V.zeroSubgroup) (hw : w ∈ V.zeroSubgroup) + {m n : ℤ} (h : u * ϖ ^ m = w * ϖ ^ n) : + m = n := by + have hv := congrArg V.val h + rw [val_unit_mul_zpow hϖ hu m, val_unit_mul_zpow hϖ hw n] at hv + exact hv + +/-- Equality of two unit-uniformizer normal forms is equivalent to equality of +both the unit part and exponent. -/ +theorem unit_mul_zpow_eq_iff (hϖ : V.IsUniformizer ϖ) + {u w : G} (hu : u ∈ V.zeroSubgroup) (hw : w ∈ V.zeroSubgroup) + {m n : ℤ} : + u * ϖ ^ m = w * ϖ ^ n ↔ u = w ∧ m = n := by + constructor + · intro h + have hmn : m = n := + exponent_unique_of_unit_mul_eq hϖ hu hw h + have huw : u = w := by + calc + u = (u * ϖ ^ m) * (ϖ ^ m)⁻¹ := by + rw [mul_assoc, mul_inv_cancel, mul_one] + _ = (w * ϖ ^ n) * (ϖ ^ m)⁻¹ := by + rw [h] + _ = (w * ϖ ^ m) * (ϖ ^ m)⁻¹ := by + rw [hmn] + _ = w := by + rw [mul_assoc, mul_inv_cancel, mul_one] + exact ⟨huw, hmn⟩ + · rintro ⟨huw, hmn⟩ + rw [huw, hmn] + +/-- Equality of two unit-uniformizer normal forms is equivalent to equality of +exponents together with equality of unit parts. -/ +theorem unit_mul_zpow_eq_iff_exponent_eq_and_unit_eq + (hϖ : V.IsUniformizer ϖ) + {u w : G} (hu : u ∈ V.zeroSubgroup) (hw : w ∈ V.zeroSubgroup) + {m n : ℤ} : + u * ϖ ^ m = w * ϖ ^ n ↔ m = n ∧ u = w := by + rw [unit_mul_zpow_eq_iff hϖ hu hw] + constructor + · rintro ⟨huw, hmn⟩ + exact ⟨hmn, huw⟩ + · rintro ⟨hmn, huw⟩ + exact ⟨huw, hmn⟩ + +end UnitUniformizerDecomposition + +/-- Establishes the identity `d₁.exponent = d₂.exponent`. -/ +theorem uniformizer_exponent_unique {ϖ x : G} + (hϖ : V.IsUniformizer ϖ) + (d₁ d₂ : V.UnitUniformizerDecomposition ϖ x) : + d₁.exponent = d₂.exponent := + UnitUniformizerDecomposition.exponent_unique hϖ d₁ d₂ + +/-- Establishes the identity `d₁.unitPart = d₂.unitPart`. -/ +theorem uniformizer_unitPart_unique {ϖ x : G} + (hϖ : V.IsUniformizer ϖ) + (d₁ d₂ : V.UnitUniformizerDecomposition ϖ x) : + d₁.unitPart = d₂.unitPart := + UnitUniformizerDecomposition.unitPart_unique hϖ d₁ d₂ + +/-- Establishes the identity `V.val (u * ϖ ^ n) = n`. -/ +theorem valuation_uniformizer_normal_form {ϖ u : G} + (hϖ : V.IsUniformizer ϖ) (hu : u ∈ V.zeroSubgroup) (n : ℤ) : + V.val (u * ϖ ^ n) = n := + UnitUniformizerDecomposition.val_unit_mul_zpow hϖ hu n + +/-- Characterizes `u * ϖ ^ m = w * ϖ ^ n` by the equivalent condition `u = w ∧ m = n`. -/ +theorem unit_uniformizer_normal_form_eq_iff {ϖ u w : G} + (hϖ : V.IsUniformizer ϖ) (hu : u ∈ V.zeroSubgroup) + (hw : w ∈ V.zeroSubgroup) {m n : ℤ} : + u * ϖ ^ m = w * ϖ ^ n ↔ u = w ∧ m = n := + UnitUniformizerDecomposition.unit_mul_zpow_eq_iff hϖ hu hw + +/-- Establishes the membership statement `x * y ∈ V.zeroSubgroup`. -/ +theorem zeroSubgroup_mul_mem {x y : G} + (hx : x ∈ V.zeroSubgroup) (hy : y ∈ V.zeroSubgroup) : + x * y ∈ V.zeroSubgroup := + V.zeroSubgroup.mul_mem hx hy + +/-- Establishes the membership statement `x⁻¹ ∈ V.zeroSubgroup`. -/ +theorem zeroSubgroup_inv_mem {x : G} (hx : x ∈ V.zeroSubgroup) : + x⁻¹ ∈ V.zeroSubgroup := + V.zeroSubgroup.inv_mem hx + +/-- Establishes the membership statement `x / y ∈ V.zeroSubgroup`. -/ +theorem zeroSubgroup_div_mem {x y : G} + (hx : x ∈ V.zeroSubgroup) (hy : y ∈ V.zeroSubgroup) : + x / y ∈ V.zeroSubgroup := by + simpa [div_eq_mul_inv] using + V.zeroSubgroup_mul_mem hx (V.zeroSubgroup_inv_mem hy) + +/-- Characterizes `x / y ∈ V.zeroSubgroup` by the equivalent condition `V.val x = V.val y`. -/ +theorem div_mem_zeroSubgroup_iff (x y : G) : + x / y ∈ V.zeroSubgroup ↔ V.val x = V.val y := by + rw [MultiplicativeIntegerValuation.mem_zeroSubgroup_iff V (x / y), + V.val_div_eq_zero_iff] + +/-- Establishes the identity `V.val x = V.val y`. -/ +theorem val_eq_of_div_mem_zeroSubgroup {x y : G} + (hxy : x / y ∈ V.zeroSubgroup) : + V.val x = V.val y := + (V.div_mem_zeroSubgroup_iff x y).1 hxy + +/-- Establishes the membership statement `x / y ∈ V.zeroSubgroup`. -/ +theorem div_mem_zeroSubgroup_of_val_eq {x y : G} (hxy : V.val x = V.val y) : + x / y ∈ V.zeroSubgroup := + (V.div_mem_zeroSubgroup_iff x y).2 hxy + +/-- In the valuation-zero subgroup, the right quotient `x / y` and the left +quotient `y⁻¹ * x` give the same membership test. -/ +theorem div_mem_zeroSubgroup_iff_inv_mul_mem_zeroSubgroup (x y : G) : + x / y ∈ V.zeroSubgroup ↔ y⁻¹ * x ∈ V.zeroSubgroup := by + simpa [div_eq_mul_inv] using + ((inferInstance : (V.zeroSubgroup).Normal).mem_comm_iff + (a := x) (b := y⁻¹)) + +/-- Left-quotient version of +`div_mem_zeroSubgroup_iff_inv_mul_mem_zeroSubgroup`. -/ +theorem inv_mul_mem_zeroSubgroup_iff_div_mem_zeroSubgroup (x y : G) : + y⁻¹ * x ∈ V.zeroSubgroup ↔ x / y ∈ V.zeroSubgroup := + (V.div_mem_zeroSubgroup_iff_inv_mul_mem_zeroSubgroup x y).symm + +/-- Left-quotient version of `div_mem_zeroSubgroup_iff`. -/ +theorem inv_mul_mem_zeroSubgroup_iff (x y : G) : + y⁻¹ * x ∈ V.zeroSubgroup ↔ V.val x = V.val y := by + rw [V.inv_mul_mem_zeroSubgroup_iff_div_mem_zeroSubgroup x y, + V.div_mem_zeroSubgroup_iff x y] + +/-- Establishes the identity `V.val x = V.val y`. -/ +theorem val_eq_of_inv_mul_mem_zeroSubgroup {x y : G} + (hxy : y⁻¹ * x ∈ V.zeroSubgroup) : + V.val x = V.val y := + (V.inv_mul_mem_zeroSubgroup_iff x y).1 hxy + +/-- Establishes the membership statement `y⁻¹ * x ∈ V.zeroSubgroup`. -/ +theorem inv_mul_mem_zeroSubgroup_of_val_eq {x y : G} + (hxy : V.val x = V.val y) : + y⁻¹ * x ∈ V.zeroSubgroup := + (V.inv_mul_mem_zeroSubgroup_iff x y).2 hxy + +/-- Equality in `G ⧸ zeroSubgroup`, in right-quotient form. -/ +theorem quotientZeroSubgroup_mk_eq_iff_div_mem (x y : G) : + QuotientGroup.mk' V.zeroSubgroup x = + QuotientGroup.mk' V.zeroSubgroup y ↔ + x / y ∈ V.zeroSubgroup := by + simpa [QuotientGroup.mk'_apply] using + (QuotientGroup.eq_iff_div_mem + (N := V.zeroSubgroup) (x := x) (y := y)) + +/-- Equality in `G ⧸ zeroSubgroup`, in left-quotient form. -/ +theorem quotientZeroSubgroup_mk_eq_iff_inv_mul_mem (x y : G) : + QuotientGroup.mk' V.zeroSubgroup x = + QuotientGroup.mk' V.zeroSubgroup y ↔ + y⁻¹ * x ∈ V.zeroSubgroup := by + rw [V.quotientZeroSubgroup_mk_eq_iff_div_mem x y, + V.div_mem_zeroSubgroup_iff_inv_mul_mem_zeroSubgroup x y] + +/-- Equality in `G ⧸ zeroSubgroup` is equality of valuations. -/ +theorem quotientZeroSubgroup_mk_eq_iff_val_eq (x y : G) : + QuotientGroup.mk' V.zeroSubgroup x = + QuotientGroup.mk' V.zeroSubgroup y ↔ + V.val x = V.val y := by + rw [V.quotientZeroSubgroup_mk_eq_iff_div_mem x y, + V.div_mem_zeroSubgroup_iff x y] + +/-- Two elements have quotient in the zero-valuation subgroup exactly when the +left element is the right element multiplied on the left by a zero-valuation +element. This is the right-coset representative form used in +`Kˣ / O_Kˣ` calculations. -/ +theorem div_mem_zeroSubgroup_iff_exists_zeroSubgroup_mul_eq (x y : G) : + x / y ∈ V.zeroSubgroup ↔ + ∃ u : G, u ∈ V.zeroSubgroup ∧ u * y = x := by + constructor + · intro hxy + exact ⟨x / y, hxy, by simp [div_eq_mul_inv, mul_assoc]⟩ + · rintro ⟨u, hu, hux⟩ + have hu_eq : u = x / y := by + have h := congrArg (fun t : G => t * y⁻¹) hux + simpa [div_eq_mul_inv, mul_assoc] using h + simpa [← hu_eq] using hu + +/-- Establishes the identity `∃ u : G, u ∈ V.zeroSubgroup ∧ u * y = x`. -/ +theorem exists_zeroSubgroup_mul_eq_of_div_mem_zeroSubgroup + {x y : G} (hxy : x / y ∈ V.zeroSubgroup) : + ∃ u : G, u ∈ V.zeroSubgroup ∧ u * y = x := + (V.div_mem_zeroSubgroup_iff_exists_zeroSubgroup_mul_eq x y).1 hxy + +/-- Establishes the membership statement `x / y ∈ V.zeroSubgroup`. -/ +theorem div_mem_zeroSubgroup_of_exists_zeroSubgroup_mul_eq + {x y : G} (hxy : ∃ u : G, u ∈ V.zeroSubgroup ∧ u * y = x) : + x / y ∈ V.zeroSubgroup := + (V.div_mem_zeroSubgroup_iff_exists_zeroSubgroup_mul_eq x y).2 hxy + +/-- Two elements have left quotient in the zero-valuation subgroup exactly when +the left element is the right element multiplied on the right by a +zero-valuation element. -/ +theorem inv_mul_mem_zeroSubgroup_iff_exists_mul_zeroSubgroup_eq (x y : G) : + y⁻¹ * x ∈ V.zeroSubgroup ↔ + ∃ u : G, u ∈ V.zeroSubgroup ∧ y * u = x := by + constructor + · intro hxy + exact ⟨y⁻¹ * x, hxy, by simp⟩ + · rintro ⟨u, hu, hyu⟩ + have hu_eq : u = y⁻¹ * x := by + have h := congrArg (fun t : G => y⁻¹ * t) hyu + simpa [mul_assoc] using h + simpa [← hu_eq] using hu + +/-- Establishes the identity `∃ u : G, u ∈ V.zeroSubgroup ∧ y * u = x`. -/ +theorem exists_mul_zeroSubgroup_eq_of_inv_mul_mem_zeroSubgroup + {x y : G} (hxy : y⁻¹ * x ∈ V.zeroSubgroup) : + ∃ u : G, u ∈ V.zeroSubgroup ∧ y * u = x := + (V.inv_mul_mem_zeroSubgroup_iff_exists_mul_zeroSubgroup_eq x y).1 hxy + +/-- Establishes the membership statement `y⁻¹ * x ∈ V.zeroSubgroup`. -/ +theorem inv_mul_mem_zeroSubgroup_of_exists_mul_zeroSubgroup_eq + {x y : G} (hxy : ∃ u : G, u ∈ V.zeroSubgroup ∧ y * u = x) : + y⁻¹ * x ∈ V.zeroSubgroup := + (V.inv_mul_mem_zeroSubgroup_iff_exists_mul_zeroSubgroup_eq x y).2 hxy + +/-- +Characterizes `V.val x = V.val y` by the equivalent condition `∃ u : G, u ∈ V.zeroSubgroup ∧ u * y += x`. +-/ +theorem val_eq_iff_exists_zeroSubgroup_mul_eq (x y : G) : + V.val x = V.val y ↔ + ∃ u : G, u ∈ V.zeroSubgroup ∧ u * y = x := by + rw [← V.div_mem_zeroSubgroup_iff x y, + V.div_mem_zeroSubgroup_iff_exists_zeroSubgroup_mul_eq x y] + +/-- +Characterizes `V.val x = V.val y` by the equivalent condition `∃ u : G, u ∈ V.zeroSubgroup ∧ y * u += x`. +-/ +theorem val_eq_iff_exists_mul_zeroSubgroup_eq (x y : G) : + V.val x = V.val y ↔ + ∃ u : G, u ∈ V.zeroSubgroup ∧ y * u = x := by + rw [← V.inv_mul_mem_zeroSubgroup_iff x y, + V.inv_mul_mem_zeroSubgroup_iff_exists_mul_zeroSubgroup_eq x y] + +/-- Establishes the identity `∃ u : G, u ∈ V.zeroSubgroup ∧ u * y = x`. -/ +theorem exists_zeroSubgroup_mul_eq_of_val_eq {x y : G} + (hxy : V.val x = V.val y) : + ∃ u : G, u ∈ V.zeroSubgroup ∧ u * y = x := + (V.val_eq_iff_exists_zeroSubgroup_mul_eq x y).1 hxy + +/-- Establishes the identity `∃ u : G, u ∈ V.zeroSubgroup ∧ y * u = x`. -/ +theorem exists_mul_zeroSubgroup_eq_of_val_eq {x y : G} + (hxy : V.val x = V.val y) : + ∃ u : G, u ∈ V.zeroSubgroup ∧ y * u = x := + (V.val_eq_iff_exists_mul_zeroSubgroup_eq x y).1 hxy + +/-- Establishes the identity `V.val x = V.val y`. -/ +theorem val_eq_of_exists_zeroSubgroup_mul_eq {x y : G} + (hxy : ∃ u : G, u ∈ V.zeroSubgroup ∧ u * y = x) : + V.val x = V.val y := + (V.val_eq_iff_exists_zeroSubgroup_mul_eq x y).2 hxy + +/-- Establishes the identity `V.val x = V.val y`. -/ +theorem val_eq_of_exists_mul_zeroSubgroup_eq {x y : G} + (hxy : ∃ u : G, u ∈ V.zeroSubgroup ∧ y * u = x) : + V.val x = V.val y := + (V.val_eq_iff_exists_mul_zeroSubgroup_eq x y).2 hxy + +/-- Characterizes `V.val x = 0` by the equivalent condition `x ∈ V.zeroSubgroup`. -/ +theorem val_eq_zero_iff_mem_zeroSubgroup (x : G) : + V.val x = 0 ↔ x ∈ V.zeroSubgroup := + (MultiplicativeIntegerValuation.mem_zeroSubgroup_iff V x).symm + +/-- Establishes the membership statement `x ^ n ∈ V.zeroSubgroup`. -/ +theorem zeroSubgroup_pow_mem {x : G} (hx : x ∈ V.zeroSubgroup) (n : ℕ) : + x ^ n ∈ V.zeroSubgroup := + V.zeroSubgroup.pow_mem hx n + +/-- Establishes the membership statement `x ^ n ∈ V.zeroSubgroup`. -/ +theorem zeroSubgroup_zpow_mem {x : G} (hx : x ∈ V.zeroSubgroup) (n : ℤ) : + x ^ n ∈ V.zeroSubgroup := + V.zeroSubgroup.zpow_mem hx n + +/-- Characterizes `x ^ n ∈ V.zeroSubgroup` by the equivalent condition `x ∈ V.zeroSubgroup`. -/ +theorem zeroSubgroup_pow_mem_iff_of_ne_zero (x : G) {n : ℕ} (hn : n ≠ 0) : + x ^ n ∈ V.zeroSubgroup ↔ x ∈ V.zeroSubgroup := by + rw [MultiplicativeIntegerValuation.mem_zeroSubgroup_iff V (x ^ n), + MultiplicativeIntegerValuation.mem_zeroSubgroup_iff V x] + exact V.val_pow_eq_zero_iff_of_ne_zero x hn + +/-- Characterizes `x ^ n ∈ V.zeroSubgroup` by the equivalent condition `x ∈ V.zeroSubgroup`. -/ +theorem zeroSubgroup_zpow_mem_iff_of_ne_zero (x : G) {n : ℤ} (hn : n ≠ 0) : + x ^ n ∈ V.zeroSubgroup ↔ x ∈ V.zeroSubgroup := by + rw [MultiplicativeIntegerValuation.mem_zeroSubgroup_iff V (x ^ n), + MultiplicativeIntegerValuation.mem_zeroSubgroup_iff V x] + exact V.val_zpow_eq_zero_iff_of_ne_zero x hn + +/-- Characterizes `x * u ∈ V.zeroSubgroup` by the equivalent condition `x ∈ V.zeroSubgroup`. -/ +theorem zeroSubgroup_mul_iff_right {x u : G} (hu : u ∈ V.zeroSubgroup) : + x * u ∈ V.zeroSubgroup ↔ x ∈ V.zeroSubgroup := by + constructor + · intro hxu + have h : (x * u) * u⁻¹ ∈ V.zeroSubgroup := + V.zeroSubgroup_mul_mem hxu (V.zeroSubgroup_inv_mem hu) + simpa [mul_assoc] using h + · intro hx + exact V.zeroSubgroup_mul_mem hx hu + +/-- Characterizes `u * x ∈ V.zeroSubgroup` by the equivalent condition `x ∈ V.zeroSubgroup`. -/ +theorem zeroSubgroup_mul_iff_left {u x : G} (hu : u ∈ V.zeroSubgroup) : + u * x ∈ V.zeroSubgroup ↔ x ∈ V.zeroSubgroup := by + constructor + · intro hux + have h : u⁻¹ * (u * x) ∈ V.zeroSubgroup := + V.zeroSubgroup_mul_mem (V.zeroSubgroup_inv_mem hu) hux + simpa [mul_assoc] using h + · intro hx + exact V.zeroSubgroup_mul_mem hu hx + +/-- Characterizes `x / u ∈ V.zeroSubgroup` by the equivalent condition `x ∈ V.zeroSubgroup`. -/ +theorem zeroSubgroup_div_iff_right {x u : G} (hu : u ∈ V.zeroSubgroup) : + x / u ∈ V.zeroSubgroup ↔ x ∈ V.zeroSubgroup := by + simpa [div_eq_mul_inv] using + V.zeroSubgroup_mul_iff_right (x := x) (u := u⁻¹) + (V.zeroSubgroup_inv_mem hu) + +/-- Characterizes `u / x ∈ V.zeroSubgroup` by the equivalent condition `x ∈ V.zeroSubgroup`. -/ +theorem zeroSubgroup_div_iff_left {u x : G} (hu : u ∈ V.zeroSubgroup) : + u / x ∈ V.zeroSubgroup ↔ x ∈ V.zeroSubgroup := by + rw [V.div_mem_zeroSubgroup_iff, + (MultiplicativeIntegerValuation.mem_zeroSubgroup_iff V u).1 hu] + constructor + · intro h + exact (V.val_eq_zero_iff_mem_zeroSubgroup x).1 h.symm + · intro hx + rw [(V.val_eq_zero_iff_mem_zeroSubgroup x).2 hx] + +/-- Establishes the identity `V.val (x * u) = V.val x`. -/ +theorem val_mul_eq_left_of_right_zero {x u : G} (hu : V.val u = 0) : + V.val (x * u) = V.val x := by + rw [V.val_mul, hu, add_zero] + +/-- Establishes the identity `V.val (u * x) = V.val x`. -/ +theorem val_mul_eq_right_of_left_zero {u x : G} (hu : V.val u = 0) : + V.val (u * x) = V.val x := by + rw [V.val_mul, hu, zero_add] + +/-- `val_zeroSubgroup_mul` satisfies the integer-power formula `V.val (u * γ ^ n) = n * V.val γ`. -/ +theorem val_zeroSubgroup_mul_zpow {u γ : G} + (hu : u ∈ V.zeroSubgroup) (n : ℤ) : + V.val (u * γ ^ n) = n * V.val γ := by + rw [V.val_mul, (V.mem_zeroSubgroup_iff u).1 hu, V.val_zpow, zero_add] + +/-- Establishes the identity `V.val (u * γ ^ n) = n * V.val γ`. -/ +theorem val_subgroup_mul_zpow_of_le_zeroSubgroup + (P : Subgroup G) (hP : P ≤ V.zeroSubgroup) + {u γ : G} (hu : u ∈ P) (n : ℤ) : + V.val (u * γ ^ n) = n * V.val γ := + V.val_zeroSubgroup_mul_zpow (hP hu) n + +/-- +`val_eq_generator_multiple_of_mem_subgroup_mul` satisfies the integer-power formula `V.val x = n * +V.val γ`. +-/ +theorem val_eq_generator_multiple_of_mem_subgroup_mul_zpow + (P : Subgroup G) (hP : P ≤ V.zeroSubgroup) + {x u γ : G} (hu : u ∈ P) {n : ℤ} + (hx : x = u * γ ^ n) : + V.val x = n * V.val γ := by + rw [hx] + exact V.val_subgroup_mul_zpow_of_le_zeroSubgroup P hP hu n + +end MultiplicativeIntegerValuation + +/-- A norm-like homomorphism compatible with integer-valued valuations. + +`residueDegree` is proof-attached data: it is the multiplier in +`valuation_formula`, not an independent field-extension invariant. In the +usual discrete-valued application the source has a uniformizer, and evaluating +`valuation_formula` at that uniformizer uniquely determines this coefficient. +The generic group-level abstraction does not require a uniformizer, so it keeps +the coefficient together with the formula that certifies it. -/ +structure ValuedNorm {G : Type u} {H : Type v} [Group G] [Group H] + (vG : MultiplicativeIntegerValuation G) + (vH : MultiplicativeIntegerValuation H) where + /-- The multiplicative norm homomorphism. -/ + toHom : H →* G + /-- The nonnegative scaling factor in the valuation formula. -/ + residueDegree : ℕ + /-- Applying the norm scales valuation by the residue-degree factor. -/ + valuation_formula : + ∀ x : H, vG.val (toHom x) = (residueDegree : ℤ) * vH.val x + +end DiscreteValuationField + +end + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Quotients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Quotients.lean new file mode 100644 index 0000000000..82e92c883c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Quotients.lean @@ -0,0 +1,2867 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Basic + +/-! +Develops quotient groups attached to an abstract valued norm, including kernel, image, and +representative criteria. +-/ + +@[expose] public section + +/-! +Identifies norm-quotient classes with valuation classes modulo the residue degree and constructs +the resulting cyclic equivalences. +-/ +namespace LocalFieldTheory + +noncomputable +section + +universe u v + +namespace DiscreteValuationField +namespace ValuedNorm + +variable {G : Type u} {H : Type v} [Group G] [Group H] +variable {vG : MultiplicativeIntegerValuation G} +variable {vH : MultiplicativeIntegerValuation H} +variable (N : ValuedNorm vG vH) + +/-- +The defining evaluation formula for `valuation` is `vG.val (N.toHom x) = (N.residueDegree : ℤ) * +vH.val x`. +-/ +@[simp] theorem valuation_apply (x : H) : + vG.val (N.toHom x) = (N.residueDegree : ℤ) * vH.val x := + N.valuation_formula x + +/-- +`valuation_apply` satisfies the division formula `vG.val (N.toHom (x / y)) = (N.residueDegree : ℤ) +* (vH.val x - vH.val y)`. +-/ +theorem valuation_apply_div (x y : H) : + vG.val (N.toHom (x / y)) = + (N.residueDegree : ℤ) * (vH.val x - vH.val y) := by + rw [N.valuation_apply, vH.val_div] + +/-- +`valuation_apply_uniformizer` satisfies the integer-power formula `vG.val (N.toHom (ϖH ^ n)) = +(N.residueDegree : ℤ) * n`. +-/ +theorem valuation_apply_uniformizer_zpow {ϖH : H} + (hϖH : vH.IsUniformizer ϖH) (n : ℤ) : + vG.val (N.toHom (ϖH ^ n)) = (N.residueDegree : ℤ) * n := by + rw [N.valuation_apply, vH.val_uniformizer_zpow hϖH n] + +/-- +`valuation_apply_uniformizer` satisfies the natural-power formula `vG.val (N.toHom (ϖH ^ n)) = +(N.residueDegree : ℤ) * (n : ℤ)`. +-/ +theorem valuation_apply_uniformizer_pow {ϖH : H} + (hϖH : vH.IsUniformizer ϖH) (n : ℕ) : + vG.val (N.toHom (ϖH ^ n)) = (N.residueDegree : ℤ) * (n : ℤ) := by + rw [N.valuation_apply, vH.val_uniformizer_pow hϖH n] + +/-- +`valuation_apply_zeroSubgroup_mul_uniformizer` satisfies the integer-power formula `vG.val +(N.toHom (u * ϖH ^ n)) = (N.residueDegree : ℤ) * n`. +-/ +theorem valuation_apply_zeroSubgroup_mul_uniformizer_zpow + {ϖH u : H} (hϖH : vH.IsUniformizer ϖH) + (hu : u ∈ vH.zeroSubgroup) (n : ℤ) : + vG.val (N.toHom (u * ϖH ^ n)) = (N.residueDegree : ℤ) * n := by + rw [N.valuation_apply, vH.valuation_uniformizer_normal_form hϖH hu n] + +/-- +`valuation_apply_zeroSubgroup_mul_uniformizer` satisfies the natural-power formula `vG.val +(N.toHom (u * ϖH ^ n)) = (N.residueDegree : ℤ) * (n : ℤ)`. +-/ +theorem valuation_apply_zeroSubgroup_mul_uniformizer_pow + {ϖH u : H} (hϖH : vH.IsUniformizer ϖH) + (hu : u ∈ vH.zeroSubgroup) (n : ℕ) : + vG.val (N.toHom (u * ϖH ^ n)) = + (N.residueDegree : ℤ) * (n : ℤ) := by + rw [N.valuation_apply] + have hv := vH.valuation_uniformizer_normal_form hϖH hu (n : ℤ) + simpa using congrArg (fun m : ℤ => (N.residueDegree : ℤ) * m) hv + +/-- +Establishes the identity `vG.valuationHom (N.toHom x) = vH.valuationHom x ^ (N.residueDegree : +ℤ)`. +-/ +theorem valuationHom_apply_norm (x : H) : + vG.valuationHom (N.toHom x) = + vH.valuationHom x ^ (N.residueDegree : ℤ) := by + rw [MultiplicativeIntegerValuation.valuationHom_apply, + N.valuation_apply, + MultiplicativeIntegerValuation.valuationHom_apply, + mul_comm (N.residueDegree : ℤ) (vH.val x), + Int.ofAdd_mul] + +/-- +Establishes the identity `Multiplicative.toAdd (vG.valuationHom (N.toHom x)) = (N.residueDegree : +ℤ) * Multiplicative.toAdd (vH.valuationHom x)`. +-/ +theorem toAdd_valuationHom_apply_norm (x : H) : + Multiplicative.toAdd (vG.valuationHom (N.toHom x)) = + (N.residueDegree : ℤ) * + Multiplicative.toAdd (vH.valuationHom x) := by + rw [N.valuationHom_apply_norm, Int.toAdd_zpow, + MultiplicativeIntegerValuation.valuationHom_apply, toAdd_ofAdd, + mul_comm (vH.val x) (N.residueDegree : ℤ)] + +/-- +`valuationHom_apply_norm` satisfies the division formula `vG.valuationHom (N.toHom (x / y)) = +vH.valuationHom (x / y) ^ (N.residueDegree : ℤ)`. +-/ +theorem valuationHom_apply_norm_div (x y : H) : + vG.valuationHom (N.toHom (x / y)) = + vH.valuationHom (x / y) ^ (N.residueDegree : ℤ) := + N.valuationHom_apply_norm (x / y) + +/-- Norms of valuation-zero elements have valuation zero. -/ +theorem maps_zeroSubgroup {x : H} (hx : x ∈ vH.zeroSubgroup) : + N.toHom x ∈ vG.zeroSubgroup := by + rw [MultiplicativeIntegerValuation.mem_zeroSubgroup_iff, + N.valuation_apply, + (MultiplicativeIntegerValuation.mem_zeroSubgroup_iff vH x).mp hx, + mul_zero] + +/-- The norm subgroup attached to a valued norm. -/ +def normSubgroup : Subgroup G := + N.toHom.range + +/-- The valuation of any norm is divisible by the residue degree. -/ +theorem residueDegree_dvd_valuation_of_mem_normSubgroup + {x : G} (hx : x ∈ N.normSubgroup) : + (N.residueDegree : ℤ) ∣ vG.val x := by + rcases hx with ⟨y, rfl⟩ + exact ⟨vH.val y, N.valuation_apply y⟩ + +/-- If the source valuation has a uniformizer, every residue-degree multiple is +realized as the valuation of an element of the norm subgroup. -/ +theorem exists_normSubgroup_val_eq_residueDegree_mul_of_uniformizer + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) (n : ℤ) : + ∃ x : G, x ∈ N.normSubgroup ∧ + vG.val x = (N.residueDegree : ℤ) * n := + ⟨N.toHom (ϖH ^ n), + (MonoidHom.mem_range (f := N.toHom)).2 ⟨ϖH ^ n, rfl⟩, + N.valuation_apply_uniformizer_zpow hϖH n⟩ + +/-- Source-uniformizer form of the value image of the norm subgroup. -/ +theorem exists_normSubgroup_val_eq_iff_residueDegree_dvd_of_uniformizer + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) (m : ℤ) : + (∃ x : G, x ∈ N.normSubgroup ∧ vG.val x = m) ↔ + (N.residueDegree : ℤ) ∣ m := by + constructor + · rintro ⟨x, hx, hxm⟩ + rw [← hxm] + exact N.residueDegree_dvd_valuation_of_mem_normSubgroup hx + · rintro ⟨n, hm⟩ + rcases + N.exists_normSubgroup_val_eq_residueDegree_mul_of_uniformizer hϖH n + with ⟨x, hx, hvx⟩ + exact ⟨x, hx, by rw [hvx, ← hm]⟩ + +/-- The value of any norm-subgroup element lies in the residue-degree multiple +subgroup of the target value group. -/ +theorem valuationHom_mem_integerMultipleSubgroup_of_mem_normSubgroup + {x : G} (hx : x ∈ N.normSubgroup) : + vG.valuationHom x ∈ integerMultipleSubgroup (N.residueDegree : ℤ) := by + rw [mem_integerMultipleSubgroup_iff, + MultiplicativeIntegerValuation.valuationHom_apply, + toAdd_ofAdd] + exact N.residueDegree_dvd_valuation_of_mem_normSubgroup hx + +/-- +Establishes the membership statement `vG.valuationHom (N.toHom x) ∈ integerMultipleSubgroup +(N.residueDegree : ℤ)`. +-/ +theorem valuationHom_norm_mem_integerMultipleSubgroup (x : H) : + vG.valuationHom (N.toHom x) ∈ + integerMultipleSubgroup (N.residueDegree : ℤ) := + N.valuationHom_mem_integerMultipleSubgroup_of_mem_normSubgroup + ((MonoidHom.mem_range (f := N.toHom)).2 ⟨x, rfl⟩) + +/-- +Establishes the identity `((vG.quotientZeroSubgroupEquivValueSubgroup (QuotientGroup.mk' +vG.zeroSubgroup (N.toHom x)) : vG.valueSubgroup) : Multiplicative ℤ) = vH.valuationHom x ^ +(N.residueDegree : ℤ)`. +-/ +theorem coe_quotientZeroSubgroupEquivValueSubgroup_norm_mk + (x : H) : + ((vG.quotientZeroSubgroupEquivValueSubgroup + (QuotientGroup.mk' vG.zeroSubgroup (N.toHom x)) : vG.valueSubgroup) : + Multiplicative ℤ) = + vH.valuationHom x ^ (N.residueDegree : ℤ) := by + rw [MultiplicativeIntegerValuation.coe_quotientZeroSubgroupEquivValueSubgroup_mk] + exact N.valuationHom_apply_norm x + +/-- +Establishes the identity `Multiplicative.toAdd (((vG.quotientZeroSubgroupEquivValueSubgroup +(QuotientGroup.mk' vG.zeroSubgroup (N.toHom x)) : vG.valueSubgroup) : Multiplicative ℤ)) = +(N.residueDegree : ℤ) * vH.val x`. +-/ +theorem toAdd_quotientZeroSubgroupEquivValueSubgroup_norm_mk + (x : H) : + Multiplicative.toAdd + (((vG.quotientZeroSubgroupEquivValueSubgroup + (QuotientGroup.mk' vG.zeroSubgroup (N.toHom x)) : vG.valueSubgroup) : + Multiplicative ℤ)) = + (N.residueDegree : ℤ) * vH.val x := by + rw [N.coe_quotientZeroSubgroupEquivValueSubgroup_norm_mk, + Int.toAdd_zpow, + MultiplicativeIntegerValuation.valuationHom_apply, toAdd_ofAdd, + mul_comm (vH.val x) (N.residueDegree : ℤ)] + +/-- If an element is a norm, then its class modulo valuation-zero elements maps +to a residue-degree multiple in the value group. -/ +theorem quotientZeroSubgroup_value_mem_integerMultipleSubgroup_of_mem_normSubgroup + {x : G} (hx : x ∈ N.normSubgroup) : + ((vG.quotientZeroSubgroupEquivValueSubgroup + (QuotientGroup.mk' vG.zeroSubgroup x) : vG.valueSubgroup) : + Multiplicative ℤ) ∈ + integerMultipleSubgroup (N.residueDegree : ℤ) := by + change (N.residueDegree : ℤ) ∣ + Multiplicative.toAdd + (((vG.quotientZeroSubgroupEquivValueSubgroup + (QuotientGroup.mk' vG.zeroSubgroup x) : vG.valueSubgroup) : + Multiplicative ℤ)) + rw [vG.toAdd_quotientZeroSubgroupEquivValueSubgroup_mk] + exact N.valuationHom_mem_integerMultipleSubgroup_of_mem_normSubgroup hx + +/-- +Establishes the membership statement `((vG.quotientZeroSubgroupEquivValueSubgroup +(QuotientGroup.mk' vG.zeroSubgroup (N.toHom x)) : vG.valueSubgroup) : Multiplicative ℤ) ∈ +integerMultipleSubgroup (N.residueDegree : ℤ)`. +-/ +theorem quotientZeroSubgroup_value_norm_mem_integerMultipleSubgroup + (x : H) : + ((vG.quotientZeroSubgroupEquivValueSubgroup + (QuotientGroup.mk' vG.zeroSubgroup (N.toHom x)) : vG.valueSubgroup) : + Multiplicative ℤ) ∈ + integerMultipleSubgroup (N.residueDegree : ℤ) := + N.quotientZeroSubgroup_value_mem_integerMultipleSubgroup_of_mem_normSubgroup + ((MonoidHom.mem_range (f := N.toHom)).2 ⟨x, rfl⟩) + +/-- +Establishes the membership statement `((vG.quotientZeroSubgroupEquivValueSubgroup +(QuotientGroup.mk' vG.zeroSubgroup (x / y)) : vG.valueSubgroup) : Multiplicative ℤ) ∈ +integerMultipleSubgroup (N.residueDegree : ℤ)`. +-/ +theorem quotientZeroSubgroup_value_div_mem_integerMultipleSubgroup_of_div_mem_normSubgroup + {x y : G} (hxy : x / y ∈ N.normSubgroup) : + ((vG.quotientZeroSubgroupEquivValueSubgroup + (QuotientGroup.mk' vG.zeroSubgroup (x / y)) : vG.valueSubgroup) : + Multiplicative ℤ) ∈ + integerMultipleSubgroup (N.residueDegree : ℤ) := + N.quotientZeroSubgroup_value_mem_integerMultipleSubgroup_of_mem_normSubgroup + hxy + +/-- If a quotient is a norm, then the valuation difference is divisible by the +residue degree. -/ +theorem residueDegree_dvd_valuation_difference_of_div_mem_normSubgroup + {x y : G} (hxy : x / y ∈ N.normSubgroup) : + (N.residueDegree : ℤ) ∣ vG.val x - vG.val y := by + have h := N.residueDegree_dvd_valuation_of_mem_normSubgroup hxy + simpa [vG.val_div] using h + +/-- Explicit multiple form of +`residueDegree_dvd_valuation_difference_of_div_mem_normSubgroup`. -/ +theorem exists_valuation_difference_eq_residueDegree_mul_of_div_mem_normSubgroup + {x y : G} (hxy : x / y ∈ N.normSubgroup) : + ∃ n : ℤ, vG.val x - vG.val y = (N.residueDegree : ℤ) * n := + N.residueDegree_dvd_valuation_difference_of_div_mem_normSubgroup hxy + +/-- Right-multiple form of the valuation difference forced by norm-subgroup +membership of a quotient. -/ +theorem exists_valuation_difference_eq_mul_residueDegree_of_div_mem_normSubgroup + {x y : G} (hxy : x / y ∈ N.normSubgroup) : + ∃ n : ℤ, vG.val x - vG.val y = n * (N.residueDegree : ℤ) := by + rcases + N.exists_valuation_difference_eq_residueDegree_mul_of_div_mem_normSubgroup + hxy with ⟨n, hn⟩ + exact ⟨n, by rw [hn, mul_comm]⟩ + +/-- If a quotient is represented by the norm of a specific element, its +valuation difference is computed by that element's valuation. -/ +theorem valuation_difference_eq_residueDegree_mul_of_norm_eq_div + {x y : G} {z : H} (hz : N.toHom z = x / y) : + vG.val x - vG.val y = (N.residueDegree : ℤ) * vH.val z := by + calc + vG.val x - vG.val y = vG.val (x / y) := (vG.val_div x y).symm + _ = vG.val (N.toHom z) := by rw [← hz] + _ = (N.residueDegree : ℤ) * vH.val z := N.valuation_apply z + +/-- Right-multiple form of +`valuation_difference_eq_residueDegree_mul_of_norm_eq_div`. -/ +theorem valuation_difference_eq_mul_residueDegree_of_norm_eq_div + {x y : G} {z : H} (hz : N.toHom z = x / y) : + vG.val x - vG.val y = vH.val z * (N.residueDegree : ℤ) := by + rw [N.valuation_difference_eq_residueDegree_mul_of_norm_eq_div hz, + mul_comm] + +/-- A norm-subgroup element is a valuation-zero factor times the norm of a +source-uniformizer power. This is the abstract normal form behind local CFT +norm quotient calculations; no surjectivity on units is assumed. -/ +theorem exists_zeroSubgroup_mul_norm_uniformizer_zpow_eq_of_mem_normSubgroup + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + {x : G} (hx : x ∈ N.normSubgroup) : + ∃ u : G, u ∈ vG.zeroSubgroup ∧ + ∃ n : ℤ, x = u * N.toHom (ϖH ^ n) := by + rcases N.residueDegree_dvd_valuation_of_mem_normSubgroup hx with ⟨n, hn⟩ + have hval : + vG.val x = vG.val (N.toHom (ϖH ^ n)) := by + rw [N.valuation_apply_uniformizer_zpow hϖH n, hn] + rcases vG.exists_zeroSubgroup_mul_eq_of_val_eq hval with ⟨u, hu, hux⟩ + exact ⟨u, hu, n, hux.symm⟩ + +/-- If all valuation-zero target elements are norms and the source valuation +has a uniformizer, valuation divisibility by the residue degree is sufficient +for norm-subgroup membership. -/ +theorem mem_normSubgroup_of_residueDegree_dvd_val_of_zeroSubgroup_le + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) + {x : G} (hx : (N.residueDegree : ℤ) ∣ vG.val x) : + x ∈ N.normSubgroup := by + rcases hx with ⟨n, hn⟩ + have hval : + vG.val x = vG.val (N.toHom (ϖH ^ n)) := by + rw [N.valuation_apply_uniformizer_zpow hϖH n, hn] + rcases vG.exists_zeroSubgroup_mul_eq_of_val_eq hval with ⟨u, hu, hux⟩ + have hu_norm : u ∈ N.normSubgroup := hzero hu + have hnorm : u * N.toHom (ϖH ^ n) ∈ N.normSubgroup := + N.normSubgroup.mul_mem hu_norm + ((MonoidHom.mem_range (f := N.toHom)).2 ⟨ϖH ^ n, rfl⟩) + simpa [← hux] using hnorm + +/-- With source uniformizer and norm-surjectivity on valuation-zero target +elements, the norm subgroup is exactly the elements whose valuation is +divisible by the residue degree. -/ +theorem mem_normSubgroup_iff_residueDegree_dvd_val_of_zeroSubgroup_le + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : + x ∈ N.normSubgroup ↔ (N.residueDegree : ℤ) ∣ vG.val x := by + constructor + · exact N.residueDegree_dvd_valuation_of_mem_normSubgroup + · exact N.mem_normSubgroup_of_residueDegree_dvd_val_of_zeroSubgroup_le + hϖH hzero + +/-- Quotient form of +`mem_normSubgroup_iff_residueDegree_dvd_val_of_zeroSubgroup_le`. -/ +theorem div_mem_normSubgroup_iff_residueDegree_dvd_valuation_difference_of_zeroSubgroup_le + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x y : G) : + x / y ∈ N.normSubgroup ↔ + (N.residueDegree : ℤ) ∣ vG.val x - vG.val y := by + rw [N.mem_normSubgroup_iff_residueDegree_dvd_val_of_zeroSubgroup_le + hϖH hzero (x / y), + vG.val_div] + +/-- In a normal norm subgroup, the right quotient `x / y` and the left quotient +`y⁻¹ * x` give the same membership test. -/ +theorem div_mem_normSubgroup_iff_inv_mul_mem_normSubgroup + [(N.normSubgroup).Normal] (x y : G) : + x / y ∈ N.normSubgroup ↔ y⁻¹ * x ∈ N.normSubgroup := by + simpa [div_eq_mul_inv] using + ((inferInstance : (N.normSubgroup).Normal).mem_comm_iff + (a := x) (b := y⁻¹)) + +/-- Left-quotient version of +`div_mem_normSubgroup_iff_inv_mul_mem_normSubgroup`. -/ +theorem inv_mul_mem_normSubgroup_iff_div_mem_normSubgroup + [(N.normSubgroup).Normal] (x y : G) : + y⁻¹ * x ∈ N.normSubgroup ↔ x / y ∈ N.normSubgroup := + (N.div_mem_normSubgroup_iff_inv_mul_mem_normSubgroup x y).symm + +/-- Left-quotient form of residue-degree divisibility for norm-subgroup +membership. -/ +theorem inv_mul_mem_normSubgroup_iff_residueDegree_dvd_valuation_difference_of_zeroSubgroup_le + [(N.normSubgroup).Normal] + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x y : G) : + y⁻¹ * x ∈ N.normSubgroup ↔ + (N.residueDegree : ℤ) ∣ vG.val x - vG.val y := by + rw [N.inv_mul_mem_normSubgroup_iff_div_mem_normSubgroup x y, + N.div_mem_normSubgroup_iff_residueDegree_dvd_valuation_difference_of_zeroSubgroup_le + hϖH hzero x y] + +/-- The valuation map modulo the residue-degree multiple subgroup. This is +the canonical value-group map used to compare norm quotients with +`ℤ / fℤ`. -/ +def valueModResidueDegreeHom : + G →* Multiplicative ℤ ⧸ integerMultipleSubgroup (N.residueDegree : ℤ) := + (QuotientGroup.mk' + (integerMultipleSubgroup (N.residueDegree : ℤ))).comp + vG.valuationHom + +/-- +The defining evaluation formula for `valueModResidueDegreeHom` is `N.valueModResidueDegreeHom x = +QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) (vG.valuationHom x)`. +-/ +@[simp] theorem valueModResidueDegreeHom_apply (x : G) : + N.valueModResidueDegreeHom x = + QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) + (vG.valuationHom x) := + rfl + +/-- +Establishes the identity `N.valueModResidueDegreeHom x = QuotientGroup.mk' +(integerMultipleSubgroup (N.residueDegree : ℤ)) (Multiplicative.ofAdd (vG.val x))`. +-/ +theorem valueModResidueDegreeHom_apply_ofAdd (x : G) : + N.valueModResidueDegreeHom x = + QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) + (Multiplicative.ofAdd (vG.val x)) := by + rw [N.valueModResidueDegreeHom_apply, + MultiplicativeIntegerValuation.valuationHom_apply] + +/-- The specified map is surjective: `Function.Surjective N.valueModResidueDegreeHom`. -/ +theorem valueModResidueDegreeHom_surjective_of_uniformizer + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) : + Function.Surjective N.valueModResidueDegreeHom := by + intro q + rcases + QuotientGroup.mk'_surjective + (integerMultipleSubgroup (N.residueDegree : ℤ)) q with + ⟨m, rfl⟩ + exact ⟨ϖG ^ Multiplicative.toAdd m, by + rw [N.valueModResidueDegreeHom_apply, + MultiplicativeIntegerValuation.valuationHom_apply, + vG.val_uniformizer_zpow hϖG (Multiplicative.toAdd m), + ofAdd_toAdd]⟩ + +/-- +Characterizes `x ∈ N.valueModResidueDegreeHom.ker` by the equivalent condition `(N.residueDegree : +ℤ) ∣ vG.val x`. +-/ +theorem mem_valueModResidueDegreeHom_ker_iff (x : G) : + x ∈ N.valueModResidueDegreeHom.ker ↔ + (N.residueDegree : ℤ) ∣ vG.val x := by + change N.valueModResidueDegreeHom x = 1 ↔ + (N.residueDegree : ℤ) ∣ vG.val x + rw [N.valueModResidueDegreeHom_apply, + MultiplicativeIntegerValuation.valuationHom_apply] + simp [QuotientGroup.mk'_apply] + +/-- The map `G/G⁰ → ℤ/fℤ` induced by valuation modulo the +residue-degree multiple subgroup. -/ +def zeroSubgroupQuotientToValueModResidueDegree : + G ⧸ vG.zeroSubgroup →* + Multiplicative ℤ ⧸ integerMultipleSubgroup (N.residueDegree : ℤ) := + QuotientGroup.map vG.zeroSubgroup + (integerMultipleSubgroup (N.residueDegree : ℤ)) vG.valuationHom (by + intro x hx + change vG.valuationHom x ∈ + integerMultipleSubgroup (N.residueDegree : ℤ) + rw [mem_integerMultipleSubgroup_iff, + MultiplicativeIntegerValuation.valuationHom_apply, toAdd_ofAdd, + (MultiplicativeIntegerValuation.mem_zeroSubgroup_iff vG x).1 hx] + exact dvd_zero (N.residueDegree : ℤ)) + +/-- +Establishes the identity `N.zeroSubgroupQuotientToValueModResidueDegree (QuotientGroup.mk' +vG.zeroSubgroup x) = QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) +(vG.valuationHom x)`. +-/ +theorem zeroSubgroupQuotientToValueModResidueDegree_mk (x : G) : + N.zeroSubgroupQuotientToValueModResidueDegree + (QuotientGroup.mk' vG.zeroSubgroup x) = + QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) + (vG.valuationHom x) := by + simp [zeroSubgroupQuotientToValueModResidueDegree] + +/-- +Establishes the identity `N.zeroSubgroupQuotientToValueModResidueDegree (QuotientGroup.mk' +vG.zeroSubgroup x) = QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) +(Multiplicative.ofAdd (vG.val x))`. +-/ +theorem zeroSubgroupQuotientToValueModResidueDegree_mk_ofAdd (x : G) : + N.zeroSubgroupQuotientToValueModResidueDegree + (QuotientGroup.mk' vG.zeroSubgroup x) = + QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) + (Multiplicative.ofAdd (vG.val x)) := by + rw [N.zeroSubgroupQuotientToValueModResidueDegree_mk x, + MultiplicativeIntegerValuation.valuationHom_apply] + +/-- +The specified map is surjective: `Function.Surjective +N.zeroSubgroupQuotientToValueModResidueDegree`. +-/ +theorem zeroSubgroupQuotientToValueModResidueDegree_surjective_of_uniformizer + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) : + Function.Surjective N.zeroSubgroupQuotientToValueModResidueDegree := by + intro q + rcases + QuotientGroup.mk'_surjective + (integerMultipleSubgroup (N.residueDegree : ℤ)) q with + ⟨m, rfl⟩ + exact ⟨QuotientGroup.mk' vG.zeroSubgroup + (ϖG ^ Multiplicative.toAdd m), by + rw [N.zeroSubgroupQuotientToValueModResidueDegree_mk, + MultiplicativeIntegerValuation.valuationHom_apply, + vG.val_uniformizer_zpow hϖG (Multiplicative.toAdd m), + ofAdd_toAdd]⟩ + +/-- +Characterizes `N.zeroSubgroupQuotientToValueModResidueDegree (QuotientGroup.mk' vG.zeroSubgroup x) += 1` by the equivalent condition `(N.residueDegree : ℤ) ∣ vG.val x`. +-/ +theorem zeroSubgroupQuotientToValueModResidueDegree_mk_eq_one_iff + (x : G) : + N.zeroSubgroupQuotientToValueModResidueDegree + (QuotientGroup.mk' vG.zeroSubgroup x) = 1 ↔ + (N.residueDegree : ℤ) ∣ vG.val x := by + rw [N.zeroSubgroupQuotientToValueModResidueDegree_mk, + MultiplicativeIntegerValuation.valuationHom_apply] + simp [QuotientGroup.mk'_apply] + +/-- +Characterizes `N.zeroSubgroupQuotientToValueModResidueDegree (QuotientGroup.mk' vG.zeroSubgroup x) += N.zeroSubgroupQuotientToValueModResidueDegree (QuotientGroup.mk' vG.zeroSubgroup y)` by the +equivalent condition `(N.residueDegree : ℤ) ∣ vG.val x - vG.val y`. +-/ +theorem zeroSubgroupQuotientToValueModResidueDegree_mk_eq_iff + (x y : G) : + N.zeroSubgroupQuotientToValueModResidueDegree + (QuotientGroup.mk' vG.zeroSubgroup x) = + N.zeroSubgroupQuotientToValueModResidueDegree + (QuotientGroup.mk' vG.zeroSubgroup y) ↔ + (N.residueDegree : ℤ) ∣ vG.val x - vG.val y := by + rw [N.zeroSubgroupQuotientToValueModResidueDegree_mk x, + N.zeroSubgroupQuotientToValueModResidueDegree_mk y, + MultiplicativeIntegerValuation.valuationHom_apply, + MultiplicativeIntegerValuation.valuationHom_apply] + simpa [QuotientGroup.mk'_apply, ← ofAdd_sub, + ofAdd_mem_integerMultipleSubgroup_iff] using + (QuotientGroup.eq_iff_div_mem + (N := integerMultipleSubgroup (N.residueDegree : ℤ)) + (x := Multiplicative.ofAdd (vG.val x)) + (y := Multiplicative.ofAdd (vG.val y))) + +/-- +Establishes the identity `N.valueModResidueDegreeHom.ker = (integerMultipleSubgroup +(N.residueDegree : ℤ)).comap vG.valuationHom`. +-/ +theorem valueModResidueDegreeHom_ker_eq_valuationHom_comap : + N.valueModResidueDegreeHom.ker = + (integerMultipleSubgroup (N.residueDegree : ℤ)).comap + vG.valuationHom := by + rw [valueModResidueDegreeHom, + ← MonoidHom.comap_ker + (QuotientGroup.mk' + (integerMultipleSubgroup (N.residueDegree : ℤ))) + vG.valuationHom, + QuotientGroup.ker_mk'] + +/-- The subgroup of `G/G⁰` consisting of classes whose value is divisible by the +residue degree. This is the kernel of the value-mod-residue-degree map. -/ +def residueDegreeClassSubgroup : + Subgroup (G ⧸ vG.zeroSubgroup) := + Subgroup.map (QuotientGroup.mk' vG.zeroSubgroup) + N.valueModResidueDegreeHom.ker + +/-- The subgroup appearing in `N.residueDegreeClassSubgroup.Normal` is normal. -/ +instance residueDegreeClassSubgroup_normal : + N.residueDegreeClassSubgroup.Normal := by + dsimp [residueDegreeClassSubgroup] + infer_instance + +/-- +Characterizes `q ∈ N.residueDegreeClassSubgroup` by the equivalent condition `∃ x : G, x ∈ +N.valueModResidueDegreeHom.ker ∧ QuotientGroup.mk' vG.zeroSubgroup x = q`. +-/ +theorem mem_residueDegreeClassSubgroup_iff + (q : G ⧸ vG.zeroSubgroup) : + q ∈ N.residueDegreeClassSubgroup ↔ + ∃ x : G, x ∈ N.valueModResidueDegreeHom.ker ∧ + QuotientGroup.mk' vG.zeroSubgroup x = q := + Iff.rfl + +/-- +Establishes the membership statement `QuotientGroup.mk' vG.zeroSubgroup x ∈ +N.residueDegreeClassSubgroup`. +-/ +theorem residueDegreeClassSubgroup_mk_mem {x : G} + (hx : (N.residueDegree : ℤ) ∣ vG.val x) : + QuotientGroup.mk' vG.zeroSubgroup x ∈ + N.residueDegreeClassSubgroup := + Subgroup.mem_map_of_mem (QuotientGroup.mk' vG.zeroSubgroup) + ((N.mem_valueModResidueDegreeHom_ker_iff x).2 hx) + +/-- +Establishes the identity `N.zeroSubgroupQuotientToValueModResidueDegree.ker = +N.residueDegreeClassSubgroup`. +-/ +theorem zeroSubgroupQuotientToValueModResidueDegree_ker_eq_residueDegreeClassSubgroup : + N.zeroSubgroupQuotientToValueModResidueDegree.ker = + N.residueDegreeClassSubgroup := by + rw [zeroSubgroupQuotientToValueModResidueDegree, QuotientGroup.ker_map, + ← N.valueModResidueDegreeHom_ker_eq_valuationHom_comap] + rfl + +/-- +Characterizes `q ∈ N.zeroSubgroupQuotientToValueModResidueDegree.ker` by the equivalent condition +`q ∈ N.residueDegreeClassSubgroup`. +-/ +theorem mem_zeroSubgroupQuotientToValueModResidueDegree_ker_iff + (q : G ⧸ vG.zeroSubgroup) : + q ∈ N.zeroSubgroupQuotientToValueModResidueDegree.ker ↔ + q ∈ N.residueDegreeClassSubgroup := by + rw [N.zeroSubgroupQuotientToValueModResidueDegree_ker_eq_residueDegreeClassSubgroup] + +/-- +Characterizes `QuotientGroup.mk' vG.zeroSubgroup x ∈ N.residueDegreeClassSubgroup` by the +equivalent condition `(N.residueDegree : ℤ) ∣ vG.val x`. +-/ +theorem quotientZeroSubgroup_mk_mem_residueDegreeClassSubgroup_iff + (x : G) : + QuotientGroup.mk' vG.zeroSubgroup x ∈ + N.residueDegreeClassSubgroup ↔ + (N.residueDegree : ℤ) ∣ vG.val x := by + rw [← N.mem_zeroSubgroupQuotientToValueModResidueDegree_ker_iff + (QuotientGroup.mk' vG.zeroSubgroup x), + MonoidHom.mem_ker, + N.zeroSubgroupQuotientToValueModResidueDegree_mk_eq_one_iff x] + +/-- +Characterizes `N.zeroSubgroupQuotientToValueModResidueDegree q = 1` by the equivalent condition `q +∈ N.residueDegreeClassSubgroup`. +-/ +theorem zeroSubgroupQuotientToValueModResidueDegree_eq_one_iff_mem_residueDegreeClassSubgroup + (q : G ⧸ vG.zeroSubgroup) : + N.zeroSubgroupQuotientToValueModResidueDegree q = 1 ↔ + q ∈ N.residueDegreeClassSubgroup := by + rw [← MonoidHom.mem_ker, + N.mem_zeroSubgroupQuotientToValueModResidueDegree_ker_iff q] + +/-- +Characterizes `N.zeroSubgroupQuotientToValueModResidueDegree q = 1` by the equivalent condition `∃ +x : G, (N.residueDegree : ℤ) ∣ vG.val x ∧ QuotientGroup.mk' vG.zeroSubgroup x = q`. +-/ +theorem zeroSubgroupQuotientToValueModResidueDegree_eq_one_iff_exists_residueDegree_repr + (q : G ⧸ vG.zeroSubgroup) : + N.zeroSubgroupQuotientToValueModResidueDegree q = 1 ↔ + ∃ x : G, (N.residueDegree : ℤ) ∣ vG.val x ∧ + QuotientGroup.mk' vG.zeroSubgroup x = q := by + rw [N.zeroSubgroupQuotientToValueModResidueDegree_eq_one_iff_mem_residueDegreeClassSubgroup + q, + N.mem_residueDegreeClassSubgroup_iff q] + constructor + · rintro ⟨x, hx, hxq⟩ + exact ⟨x, (N.mem_valueModResidueDegreeHom_ker_iff x).1 hx, hxq⟩ + · rintro ⟨x, hx, hxq⟩ + exact ⟨x, (N.mem_valueModResidueDegreeHom_ker_iff x).2 hx, hxq⟩ + +/-- +Characterizes `N.zeroSubgroupQuotientToValueModResidueDegree q = +N.zeroSubgroupQuotientToValueModResidueDegree r` by the equivalent condition `q / r ∈ +N.residueDegreeClassSubgroup`. +-/ +theorem zeroSubgroupQuotientToValueModResidueDegree_eq_iff_div_mem_residueDegreeClassSubgroup + (q r : G ⧸ vG.zeroSubgroup) : + N.zeroSubgroupQuotientToValueModResidueDegree q = + N.zeroSubgroupQuotientToValueModResidueDegree r ↔ + q / r ∈ N.residueDegreeClassSubgroup := by + rw [← N.zeroSubgroupQuotientToValueModResidueDegree_ker_eq_residueDegreeClassSubgroup, + MonoidHom.mem_ker, + MonoidHom.map_div, + div_eq_one] + +/-- First-isomorphism form of the value-mod-residue-degree map. A target +uniformizer makes `G/G⁰ → ℤ/fℤ` surjective. -/ +noncomputable def zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) : + (G ⧸ vG.zeroSubgroup) ⧸ N.residueDegreeClassSubgroup ≃* + Multiplicative ℤ ⧸ integerMultipleSubgroup (N.residueDegree : ℤ) := + (QuotientGroup.quotientMulEquivOfEq + (N.zeroSubgroupQuotientToValueModResidueDegree_ker_eq_residueDegreeClassSubgroup).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (φ := N.zeroSubgroupQuotientToValueModResidueDegree) + (N.zeroSubgroupQuotientToValueModResidueDegree_surjective_of_uniformizer hϖG)) + +/-- +Establishes the identity `N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree hϖG +(QuotientGroup.mk' N.residueDegreeClassSubgroup q) = N.zeroSubgroupQuotientToValueModResidueDegree +q`. +-/ +theorem zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_mk + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + (q : G ⧸ vG.zeroSubgroup) : + N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree hϖG + (QuotientGroup.mk' N.residueDegreeClassSubgroup q) = + N.zeroSubgroupQuotientToValueModResidueDegree q := by + change QuotientGroup.kerLift N.zeroSubgroupQuotientToValueModResidueDegree + ((QuotientGroup.quotientMulEquivOfEq + N.zeroSubgroupQuotientToValueModResidueDegree_ker_eq_residueDegreeClassSubgroup.symm) + (QuotientGroup.mk q)) = N.zeroSubgroupQuotientToValueModResidueDegree q + rw [QuotientGroup.quotientMulEquivOfEq_mk] + exact QuotientGroup.kerLift_mk N.zeroSubgroupQuotientToValueModResidueDegree q + +/-- +Establishes the identity `N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree hϖG +(QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup x)) = +QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) (Multiplicative.ofAdd (vG.val +x))`. +-/ +theorem zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_mk_mk + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) (x : G) : + N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree hϖG + (QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup x)) = + QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) + (Multiplicative.ofAdd (vG.val x)) := by + rw [N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_mk hϖG, + N.zeroSubgroupQuotientToValueModResidueDegree_mk_ofAdd x] + +/-- +Establishes the identity `(N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree +hϖG).symm (QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) (Multiplicative.ofAdd +(vG.val x))) = QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup +x)`. +-/ +theorem zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_symm_mk_val + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) (x : G) : + (N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree hϖG).symm + (QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) + (Multiplicative.ofAdd (vG.val x))) = + QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup x) := by + apply (N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree hϖG).injective + calc + N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree hϖG + ((N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree hϖG).symm + (QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) + (Multiplicative.ofAdd (vG.val x)))) = + QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) + (Multiplicative.ofAdd (vG.val x)) := by + exact + (N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree hϖG).apply_symm_apply _ + _ = + N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree hϖG + (QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup x)) := by + rw [N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_mk_mk + hϖG x] + +/-- +Establishes the identity `(N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree +hϖG).symm (QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) (Multiplicative.ofAdd +n)) = QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup (ϖG ^ +n))`. +-/ +theorem zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_symm_mk_ofAdd + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) (n : ℤ) : + (N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree hϖG).symm + (QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) + (Multiplicative.ofAdd n)) = + QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup (ϖG ^ n)) := by + apply (N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree hϖG).injective + rw [N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_mk_mk + hϖG (ϖG ^ n), + vG.val_uniformizer_zpow hϖG n] + simp + +/-- One criterion in the double quotient by the residue-degree class subgroup. -/ +theorem zeroQuotientModuloResidueDegreeClass_mk_eq_one_iff + (q : G ⧸ vG.zeroSubgroup) : + QuotientGroup.mk' N.residueDegreeClassSubgroup q = 1 ↔ + q ∈ N.residueDegreeClassSubgroup := by + simp [QuotientGroup.mk'_apply] + +/-- +Characterizes `QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup +x) = 1` by the equivalent condition `(N.residueDegree : ℤ) ∣ vG.val x`. +-/ +theorem zeroQuotientModuloResidueDegreeClass_mk_mk_eq_one_iff + (x : G) : + QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup x) = 1 ↔ + (N.residueDegree : ℤ) ∣ vG.val x := by + rw [N.zeroQuotientModuloResidueDegreeClass_mk_eq_one_iff, + N.quotientZeroSubgroup_mk_mem_residueDegreeClassSubgroup_iff x] + +/-- Equality criterion in the double quotient by the residue-degree class +subgroup. -/ +theorem zeroQuotientModuloResidueDegreeClass_mk_eq_iff_div_mem + (q r : G ⧸ vG.zeroSubgroup) : + QuotientGroup.mk' N.residueDegreeClassSubgroup q = + QuotientGroup.mk' N.residueDegreeClassSubgroup r ↔ + q / r ∈ N.residueDegreeClassSubgroup := by + simpa [QuotientGroup.mk'_apply] using + (QuotientGroup.eq_iff_div_mem + (N := N.residueDegreeClassSubgroup) (x := q) (y := r)) + +/-- +Characterizes `QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup +x) = QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup y)` by the +equivalent condition `(N.residueDegree : ℤ) ∣ vG.val x - vG.val y`. +-/ +theorem zeroQuotientModuloResidueDegreeClass_mk_mk_eq_iff_residueDegree_dvd + (x y : G) : + QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup x) = + QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup y) ↔ + (N.residueDegree : ℤ) ∣ vG.val x - vG.val y := by + rw [N.zeroQuotientModuloResidueDegreeClass_mk_eq_iff_div_mem] + rw [← (QuotientGroup.mk' vG.zeroSubgroup).map_div x y, + N.quotientZeroSubgroup_mk_mem_residueDegreeClassSubgroup_iff (x / y), + vG.val_div x y] + +/-- +Characterizes `QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup +(ϖG ^ m)) = QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup (ϖG +^ n))` by the equivalent condition `(N.residueDegree : ℤ) ∣ m - n`. +-/ +theorem zeroQuotientModuloResidueDegreeClass_uniformizer_zpow_mk_eq_iff + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) (m n : ℤ) : + QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup (ϖG ^ m)) = + QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup (ϖG ^ n)) ↔ + (N.residueDegree : ℤ) ∣ m - n := by + rw [N.zeroQuotientModuloResidueDegreeClass_mk_mk_eq_iff_residueDegree_dvd, + vG.val_uniformizer_zpow hϖG m, vG.val_uniformizer_zpow hϖG n] + +/-- +Establishes the identity `QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' +vG.zeroSubgroup (ϖG ^ m)) = QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' +vG.zeroSubgroup (ϖG ^ n))`. +-/ +theorem zeroQuotientModuloResidueDegreeClass_uniformizer_zpow_mk_eq_of_sub_dvd + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) {m n : ℤ} + (hmn : (N.residueDegree : ℤ) ∣ m - n) : + QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup (ϖG ^ m)) = + QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup (ϖG ^ n)) := + (N.zeroQuotientModuloResidueDegreeClass_uniformizer_zpow_mk_eq_iff + hϖG m n).2 hmn + +/-- +Characterizes `QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup +(ϖG ^ n)) = 1` by the equivalent condition `(N.residueDegree : ℤ) ∣ n`. +-/ +theorem zeroQuotientModuloResidueDegreeClass_uniformizer_zpow_mk_eq_one_iff + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) (n : ℤ) : + QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup (ϖG ^ n)) = 1 ↔ + (N.residueDegree : ℤ) ∣ n := by + rw [N.zeroQuotientModuloResidueDegreeClass_mk_mk_eq_one_iff, + vG.val_uniformizer_zpow hϖG n] + +/-- +Establishes the divisibility statement `(N.residueDegree : ℤ) ∣ (n + (N.residueDegree : ℤ) * k) - +n`. +-/ +theorem residueDegree_dvd_add_residueDegree_mul_sub (n k : ℤ) : + (N.residueDegree : ℤ) ∣ + (n + (N.residueDegree : ℤ) * k) - n := by + refine ⟨k, ?_⟩ + ring + +/-- The value-mod-residue-degree map is periodic on target-uniformizer powers +with period the residue degree. -/ +theorem valueModResidueDegreeHom_uniformizer_zpow_add_residueDegree_mul_eq + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) (n k : ℤ) : + N.valueModResidueDegreeHom + (ϖG ^ (n + (N.residueDegree : ℤ) * k)) = + N.valueModResidueDegreeHom (ϖG ^ n) := by + rw [N.valueModResidueDegreeHom_apply_ofAdd, + N.valueModResidueDegreeHom_apply_ofAdd, + vG.val_uniformizer_zpow hϖG (n + (N.residueDegree : ℤ) * k), + vG.val_uniformizer_zpow hϖG n] + have hmem : + Multiplicative.ofAdd (n + (N.residueDegree : ℤ) * k) / + Multiplicative.ofAdd n ∈ + integerMultipleSubgroup (N.residueDegree : ℤ) := by + rw [← ofAdd_sub, ofAdd_mem_integerMultipleSubgroup_iff] + exact N.residueDegree_dvd_add_residueDegree_mul_sub n k + simp [QuotientGroup.mk'_apply] + +/-- The map `G/G⁰ → ℤ/fℤ` induced by valuation is periodic on +target-uniformizer powers with period the residue degree. -/ +theorem zeroSubgroupQuotientToValueModResidueDegree_uniformizer_zpow_add_residueDegree_mul_mk_eq + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) (n k : ℤ) : + N.zeroSubgroupQuotientToValueModResidueDegree + (QuotientGroup.mk' vG.zeroSubgroup + (ϖG ^ (n + (N.residueDegree : ℤ) * k))) = + N.zeroSubgroupQuotientToValueModResidueDegree + (QuotientGroup.mk' vG.zeroSubgroup (ϖG ^ n)) := by + rw [N.zeroSubgroupQuotientToValueModResidueDegree_mk_eq_iff, + vG.val_uniformizer_zpow hϖG (n + (N.residueDegree : ℤ) * k), + vG.val_uniformizer_zpow hϖG n] + exact N.residueDegree_dvd_add_residueDegree_mul_sub n k + +/-- Uniformizer powers in the residue-degree double quotient are periodic modulo +the residue degree. -/ +theorem zeroQuotientModuloResidueDegreeClass_uniformizer_zpow_add_residueDegree_mul_mk_eq + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) (n k : ℤ) : + QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup + (ϖG ^ (n + (N.residueDegree : ℤ) * k))) = + QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup (ϖG ^ n)) := + N.zeroQuotientModuloResidueDegreeClass_uniformizer_zpow_mk_eq_of_sub_dvd + hϖG (N.residueDegree_dvd_add_residueDegree_mul_sub n k) + +/-- Every residue-degree double-quotient class has the same representative as a +target-uniformizer power with exponent given by the valuation. -/ +theorem zeroQuotientModuloResidueDegreeClass_mk_eq_uniformizer_zpow_val + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) (x : G) : + QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup x) = + QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup (ϖG ^ vG.val x)) := by + rw [N.zeroQuotientModuloResidueDegreeClass_mk_mk_eq_iff_residueDegree_dvd, + vG.val_uniformizer_zpow hϖG (vG.val x), sub_self] + exact dvd_zero (N.residueDegree : ℤ) + +/-- Generator-power form of +`zeroQuotientModuloResidueDegreeClass_mk_eq_uniformizer_zpow_val`. -/ +theorem zeroQuotientModuloResidueDegreeClass_mk_eq_uniformizerClass_zpow_val + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) (x : G) : + QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup x) = + (QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ vG.val x := by + rw [← (QuotientGroup.mk' N.residueDegreeClassSubgroup).map_zpow + (QuotientGroup.mk' vG.zeroSubgroup ϖG) (vG.val x), + ← (QuotientGroup.mk' vG.zeroSubgroup).map_zpow ϖG (vG.val x)] + exact N.zeroQuotientModuloResidueDegreeClass_mk_eq_uniformizer_zpow_val + hϖG x + +/-- Criterion for a residue-degree double-quotient class to be a prescribed +power of the target uniformizer class. -/ +theorem zeroQuotientModuloResidueDegreeClass_mk_eq_uniformizerClass_zpow_iff + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) (x : G) (n : ℤ) : + QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup x) = + (QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n ↔ + (N.residueDegree : ℤ) ∣ vG.val x - n := by + rw [← (QuotientGroup.mk' N.residueDegreeClassSubgroup).map_zpow + (QuotientGroup.mk' vG.zeroSubgroup ϖG) n, + ← (QuotientGroup.mk' vG.zeroSubgroup).map_zpow ϖG n, + N.zeroQuotientModuloResidueDegreeClass_mk_mk_eq_iff_residueDegree_dvd, + vG.val_uniformizer_zpow hϖG n] + +/-- Equality of two powers of the target uniformizer class in the residue-degree +double quotient is residue-degree divisibility of the exponent difference. -/ +theorem zeroQuotientModuloResidueDegreeClass_uniformizerClass_zpow_eq_iff + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) (m n : ℤ) : + (QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ m = + (QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n ↔ + (N.residueDegree : ℤ) ∣ m - n := by + rw [← (QuotientGroup.mk' N.residueDegreeClassSubgroup).map_zpow + (QuotientGroup.mk' vG.zeroSubgroup ϖG) m, + ← (QuotientGroup.mk' N.residueDegreeClassSubgroup).map_zpow + (QuotientGroup.mk' vG.zeroSubgroup ϖG) n, + ← (QuotientGroup.mk' vG.zeroSubgroup).map_zpow ϖG m, + ← (QuotientGroup.mk' vG.zeroSubgroup).map_zpow ϖG n] + exact N.zeroQuotientModuloResidueDegreeClass_uniformizer_zpow_mk_eq_iff + hϖG m n + +/-- +Establishes the identity `(QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' +vG.zeroSubgroup ϖG)) ^ m = (QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' +vG.zeroSubgroup ϖG)) ^ n`. +-/ +theorem zeroQuotientModuloResidueDegreeClass_uniformizerClass_zpow_eq_of_sub_dvd + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) {m n : ℤ} + (hmn : (N.residueDegree : ℤ) ∣ m - n) : + (QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ m = + (QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n := + (N.zeroQuotientModuloResidueDegreeClass_uniformizerClass_zpow_eq_iff + hϖG m n).2 hmn + +/-- +Establishes the identity `(QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' +vG.zeroSubgroup ϖG)) ^ (n + (N.residueDegree : ℤ) * k) = (QuotientGroup.mk' +N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n`. +-/ +theorem zeroQuotientModuloResidueDegreeClass_uniformizerClass_zpow_add_residueDegree_mul_eq + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) (n k : ℤ) : + (QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ + (n + (N.residueDegree : ℤ) * k) = + (QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n := + N.zeroQuotientModuloResidueDegreeClass_uniformizerClass_zpow_eq_of_sub_dvd + hϖG (N.residueDegree_dvd_add_residueDegree_mul_sub n k) + +/-- +Establishes the identity `(QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' +vG.zeroSubgroup ϖG)) ^ (N.residueDegree : ℤ) = 1`. +-/ +theorem zeroQuotientModuloResidueDegreeClass_uniformizerClass_zpow_residueDegree_eq_one + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) : + (QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ (N.residueDegree : ℤ) = 1 := by + rw [← (QuotientGroup.mk' N.residueDegreeClassSubgroup).map_zpow + (QuotientGroup.mk' vG.zeroSubgroup ϖG) (N.residueDegree : ℤ), + ← (QuotientGroup.mk' vG.zeroSubgroup).map_zpow + ϖG (N.residueDegree : ℤ)] + exact (N.zeroQuotientModuloResidueDegreeClass_uniformizer_zpow_mk_eq_one_iff + hϖG (N.residueDegree : ℤ)).2 (dvd_refl (N.residueDegree : ℤ)) + +/-- +Characterizes `(QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup +ϖG)) ^ n = 1` by the equivalent condition `(N.residueDegree : ℤ) ∣ n`. +-/ +theorem zeroQuotientModuloResidueDegreeClass_uniformizerClass_zpow_eq_one_iff + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) (n : ℤ) : + (QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n = 1 ↔ + (N.residueDegree : ℤ) ∣ n := by + rw [← (QuotientGroup.mk' N.residueDegreeClassSubgroup).map_zpow + (QuotientGroup.mk' vG.zeroSubgroup ϖG) n, + ← (QuotientGroup.mk' vG.zeroSubgroup).map_zpow ϖG n] + exact N.zeroQuotientModuloResidueDegreeClass_uniformizer_zpow_mk_eq_one_iff + hϖG n + +/-- The residue-degree double quotient is generated by the class of any target +uniformizer. -/ +theorem zeroQuotientModuloResidueDegreeClass_generated_by_uniformizerClass + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + (q : (G ⧸ vG.zeroSubgroup) ⧸ N.residueDegreeClassSubgroup) : + ∃ n : ℤ, q = + (QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n := by + refine QuotientGroup.induction_on q ?_ + intro q₀ + refine QuotientGroup.induction_on q₀ ?_ + intro x + exact ⟨vG.val x, + N.zeroQuotientModuloResidueDegreeClass_mk_eq_uniformizerClass_zpow_val + hϖG x⟩ + +/-- The residue-degree double quotient is cyclic, generated by the class of any +target uniformizer. -/ +theorem zeroQuotientModuloResidueDegreeClass_closure_uniformizerClass_eq_top + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) : + Subgroup.closure + ({QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup ϖG)} : + Set ((G ⧸ vG.zeroSubgroup) ⧸ N.residueDegreeClassSubgroup)) = + ⊤ := by + apply le_antisymm + · exact le_top + · intro q hq + rcases N.zeroQuotientModuloResidueDegreeClass_generated_by_uniformizerClass + hϖG q with ⟨n, hqpow⟩ + rw [hqpow] + exact Subgroup.zpow_mem + (Subgroup.closure + ({QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup ϖG)} : + Set ((G ⧸ vG.zeroSubgroup) ⧸ N.residueDegreeClassSubgroup))) + (Subgroup.subset_closure (by simp)) n + +/-- +`zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_uniformizerClass` satisfies the +integer-power formula `N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree hϖG +((QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n) = +QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) (Multiplicative.ofAdd n)`. +-/ +theorem zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_uniformizerClass_zpow + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) (n : ℤ) : + N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree hϖG + ((QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n) = + QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) + (Multiplicative.ofAdd n) := by + rw [← (QuotientGroup.mk' N.residueDegreeClassSubgroup).map_zpow + (QuotientGroup.mk' vG.zeroSubgroup ϖG) n, + ← (QuotientGroup.mk' vG.zeroSubgroup).map_zpow ϖG n, + N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_mk_mk + hϖG (ϖG ^ n), + vG.val_uniformizer_zpow hϖG n] + +/-- +`zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_symm_mk_ofAdd_uniformizerClass` +satisfies the integer-power formula +`(N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree hϖG).symm (QuotientGroup.mk' +(integerMultipleSubgroup (N.residueDegree : ℤ)) (Multiplicative.ofAdd n)) = (QuotientGroup.mk' +N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n`. +-/ +theorem +zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_symm_mk_ofAdd_uniformizerClass_zpow + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) (n : ℤ) : + (N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree hϖG).symm + (QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) + (Multiplicative.ofAdd n)) = + (QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n := by + rw [N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_symm_mk_ofAdd + hϖG n, + ← (QuotientGroup.mk' N.residueDegreeClassSubgroup).map_zpow + (QuotientGroup.mk' vG.zeroSubgroup ϖG) n, + ← (QuotientGroup.mk' vG.zeroSubgroup).map_zpow ϖG n] + +/-- Establishes the identity `N.valueModResidueDegreeHom.ker = N.normSubgroup`. -/ +theorem valueModResidueDegreeHom_ker_eq_normSubgroup_of_zeroSubgroup_le + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) : + N.valueModResidueDegreeHom.ker = N.normSubgroup := by + ext x + rw [N.mem_valueModResidueDegreeHom_ker_iff, + N.mem_normSubgroup_iff_residueDegree_dvd_val_of_zeroSubgroup_le + hϖH hzero x] + +/-- The subgroup `N/G⁰` inside the zero-valuation quotient `G/G⁰`, where +`N` is the norm subgroup. -/ +def normSubgroupClassInZeroQuotient : Subgroup (G ⧸ vG.zeroSubgroup) := + Subgroup.map (QuotientGroup.mk' vG.zeroSubgroup) N.normSubgroup + +/-- The subgroup appearing in `N.normSubgroupClassInZeroQuotient.Normal` is normal. -/ +instance normSubgroupClassInZeroQuotient_normal + [(N.normSubgroup).Normal] : + N.normSubgroupClassInZeroQuotient.Normal := by + dsimp [normSubgroupClassInZeroQuotient] + infer_instance + +/-- +Characterizes `q ∈ N.normSubgroupClassInZeroQuotient` by the equivalent condition `∃ x : G, x ∈ +N.normSubgroup ∧ QuotientGroup.mk' vG.zeroSubgroup x = q`. +-/ +theorem mem_normSubgroupClassInZeroQuotient_iff + (q : G ⧸ vG.zeroSubgroup) : + q ∈ N.normSubgroupClassInZeroQuotient ↔ + ∃ x : G, x ∈ N.normSubgroup ∧ + QuotientGroup.mk' vG.zeroSubgroup x = q := + Iff.rfl + +/-- +Establishes the membership statement `QuotientGroup.mk' vG.zeroSubgroup x ∈ +N.normSubgroupClassInZeroQuotient`. +-/ +theorem normSubgroupClassInZeroQuotient_mk_mem {x : G} + (hx : x ∈ N.normSubgroup) : + QuotientGroup.mk' vG.zeroSubgroup x ∈ + N.normSubgroupClassInZeroQuotient := + Subgroup.mem_map_of_mem (QuotientGroup.mk' vG.zeroSubgroup) hx + +/-- Establishes the identity `N.residueDegreeClassSubgroup = N.normSubgroupClassInZeroQuotient`. -/ +theorem residueDegreeClassSubgroup_eq_normSubgroupClassInZeroQuotient_of_zeroSubgroup_le + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) : + N.residueDegreeClassSubgroup = + N.normSubgroupClassInZeroQuotient := by + rw [residueDegreeClassSubgroup, normSubgroupClassInZeroQuotient, + N.valueModResidueDegreeHom_ker_eq_normSubgroup_of_zeroSubgroup_le + hϖH hzero] + +/-- The quotient by the value-side residue-degree class subgroup is the same +as the quotient by the norm-class subgroup when valuation-zero target elements +are norms. -/ +noncomputable def zeroQuotientModuloResidueDegreeClassEquivNormClass + [(N.normSubgroup).Normal] + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) : + (G ⧸ vG.zeroSubgroup) ⧸ N.residueDegreeClassSubgroup ≃* + (G ⧸ vG.zeroSubgroup) ⧸ N.normSubgroupClassInZeroQuotient := + QuotientGroup.quotientMulEquivOfEq + (N.residueDegreeClassSubgroup_eq_normSubgroupClassInZeroQuotient_of_zeroSubgroup_le + hϖH hzero) + +/-- +Establishes the identity `N.zeroQuotientModuloResidueDegreeClassEquivNormClass hϖH hzero +(QuotientGroup.mk' N.residueDegreeClassSubgroup q) = QuotientGroup.mk' +N.normSubgroupClassInZeroQuotient q`. +-/ +theorem zeroQuotientModuloResidueDegreeClassEquivNormClass_mk + [(N.normSubgroup).Normal] + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) + (q : G ⧸ vG.zeroSubgroup) : + N.zeroQuotientModuloResidueDegreeClassEquivNormClass hϖH hzero + (QuotientGroup.mk' N.residueDegreeClassSubgroup q) = + QuotientGroup.mk' N.normSubgroupClassInZeroQuotient q := by + rfl + +/-- +Establishes the identity `N.zeroQuotientModuloResidueDegreeClassEquivNormClass hϖH hzero +(QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup x)) = +QuotientGroup.mk' N.normSubgroupClassInZeroQuotient (QuotientGroup.mk' vG.zeroSubgroup x)`. +-/ +theorem zeroQuotientModuloResidueDegreeClassEquivNormClass_mk_mk + [(N.normSubgroup).Normal] + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : + N.zeroQuotientModuloResidueDegreeClassEquivNormClass hϖH hzero + (QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup x)) = + QuotientGroup.mk' N.normSubgroupClassInZeroQuotient + (QuotientGroup.mk' vG.zeroSubgroup x) := by + rw [N.zeroQuotientModuloResidueDegreeClassEquivNormClass_mk hϖH hzero] + +/-- +Establishes the identity `(N.zeroQuotientModuloResidueDegreeClassEquivNormClass hϖH hzero).symm +(QuotientGroup.mk' N.normSubgroupClassInZeroQuotient q) = QuotientGroup.mk' +N.residueDegreeClassSubgroup q`. +-/ +theorem zeroQuotientModuloResidueDegreeClassEquivNormClass_symm_mk + [(N.normSubgroup).Normal] + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) + (q : G ⧸ vG.zeroSubgroup) : + (N.zeroQuotientModuloResidueDegreeClassEquivNormClass hϖH hzero).symm + (QuotientGroup.mk' N.normSubgroupClassInZeroQuotient q) = + QuotientGroup.mk' N.residueDegreeClassSubgroup q := by + apply (N.zeroQuotientModuloResidueDegreeClassEquivNormClass hϖH hzero).injective + calc + N.zeroQuotientModuloResidueDegreeClassEquivNormClass hϖH hzero + ((N.zeroQuotientModuloResidueDegreeClassEquivNormClass hϖH hzero).symm + (QuotientGroup.mk' N.normSubgroupClassInZeroQuotient q)) = + QuotientGroup.mk' N.normSubgroupClassInZeroQuotient q := by + exact + (N.zeroQuotientModuloResidueDegreeClassEquivNormClass hϖH hzero).apply_symm_apply _ + _ = + N.zeroQuotientModuloResidueDegreeClassEquivNormClass hϖH hzero + (QuotientGroup.mk' N.residueDegreeClassSubgroup q) := by + rw [N.zeroQuotientModuloResidueDegreeClassEquivNormClass_mk hϖH hzero q] + +/-- +Establishes the identity `(N.zeroQuotientModuloResidueDegreeClassEquivNormClass hϖH hzero).symm +(QuotientGroup.mk' N.normSubgroupClassInZeroQuotient (QuotientGroup.mk' vG.zeroSubgroup x)) = +QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup x)`. +-/ +theorem zeroQuotientModuloResidueDegreeClassEquivNormClass_symm_mk_mk + [(N.normSubgroup).Normal] + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : + (N.zeroQuotientModuloResidueDegreeClassEquivNormClass hϖH hzero).symm + (QuotientGroup.mk' N.normSubgroupClassInZeroQuotient + (QuotientGroup.mk' vG.zeroSubgroup x)) = + QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup x) := by + rw [N.zeroQuotientModuloResidueDegreeClassEquivNormClass_symm_mk hϖH hzero] + +/-- +`zeroQuotientModuloResidueDegreeClassEquivNormClass_uniformizerClass` satisfies the integer-power +formula `N.zeroQuotientModuloResidueDegreeClassEquivNormClass hϖH hzero ((QuotientGroup.mk' +N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n) = (QuotientGroup.mk' +N.normSubgroupClassInZeroQuotient (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n`. +-/ +theorem zeroQuotientModuloResidueDegreeClassEquivNormClass_uniformizerClass_zpow + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (n : ℤ) : + N.zeroQuotientModuloResidueDegreeClassEquivNormClass hϖH hzero + ((QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n) = + (QuotientGroup.mk' N.normSubgroupClassInZeroQuotient + (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n := by + let _hϖG := hϖG + rw [← (QuotientGroup.mk' N.residueDegreeClassSubgroup).map_zpow + (QuotientGroup.mk' vG.zeroSubgroup ϖG) n, + ← (QuotientGroup.mk' N.normSubgroupClassInZeroQuotient).map_zpow + (QuotientGroup.mk' vG.zeroSubgroup ϖG) n, + ← (QuotientGroup.mk' vG.zeroSubgroup).map_zpow ϖG n, + N.zeroQuotientModuloResidueDegreeClassEquivNormClass_mk_mk + hϖH hzero (ϖG ^ n)] + +/-- +`zeroQuotientModuloResidueDegreeClassEquivNormClass_symm_uniformizerClass` satisfies the +integer-power formula `(N.zeroQuotientModuloResidueDegreeClassEquivNormClass hϖH hzero).symm +((QuotientGroup.mk' N.normSubgroupClassInZeroQuotient (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n) += (QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n`. +-/ +theorem zeroQuotientModuloResidueDegreeClassEquivNormClass_symm_uniformizerClass_zpow + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (n : ℤ) : + (N.zeroQuotientModuloResidueDegreeClassEquivNormClass hϖH hzero).symm + ((QuotientGroup.mk' N.normSubgroupClassInZeroQuotient + (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n) = + (QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n := by + let _hϖG := hϖG + rw [← (QuotientGroup.mk' N.normSubgroupClassInZeroQuotient).map_zpow + (QuotientGroup.mk' vG.zeroSubgroup ϖG) n, + ← (QuotientGroup.mk' N.residueDegreeClassSubgroup).map_zpow + (QuotientGroup.mk' vG.zeroSubgroup ϖG) n, + ← (QuotientGroup.mk' vG.zeroSubgroup).map_zpow ϖG n] + rw [N.zeroQuotientModuloResidueDegreeClassEquivNormClass_symm_mk_mk + hϖH hzero (ϖG ^ n)] + +/-- The natural map `G/G⁰ → G/N`, where `N` is a norm subgroup containing +the valuation-zero subgroup. -/ +def zeroSubgroupQuotientToNormQuotient [(N.normSubgroup).Normal] + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) : + G ⧸ vG.zeroSubgroup →* G ⧸ N.normSubgroup := + QuotientGroup.map vG.zeroSubgroup N.normSubgroup (MonoidHom.id G) (by + intro x hx + exact hzero hx) + +/-- +Establishes the identity `N.zeroSubgroupQuotientToNormQuotient hzero (QuotientGroup.mk' +vG.zeroSubgroup x) = QuotientGroup.mk' N.normSubgroup x`. +-/ +theorem zeroSubgroupQuotientToNormQuotient_mk + [(N.normSubgroup).Normal] + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : + N.zeroSubgroupQuotientToNormQuotient hzero + (QuotientGroup.mk' vG.zeroSubgroup x) = + QuotientGroup.mk' N.normSubgroup x := by + exact QuotientGroup.map_mk' vG.zeroSubgroup N.normSubgroup + (MonoidHom.id G) (fun _ hx => hzero hx) x + +/-- +The specified map is surjective: `Function.Surjective (N.zeroSubgroupQuotientToNormQuotient +hzero)`. +-/ +theorem zeroSubgroupQuotientToNormQuotient_surjective + [(N.normSubgroup).Normal] + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) : + Function.Surjective (N.zeroSubgroupQuotientToNormQuotient hzero) := by + intro q + rcases QuotientGroup.mk'_surjective N.normSubgroup q with ⟨x, rfl⟩ + exact ⟨QuotientGroup.mk' vG.zeroSubgroup x, by + rw [N.zeroSubgroupQuotientToNormQuotient_mk hzero x]⟩ + +/-- +Characterizes `N.zeroSubgroupQuotientToNormQuotient hzero (QuotientGroup.mk' vG.zeroSubgroup x) = +1` by the equivalent condition `x ∈ N.normSubgroup`. +-/ +theorem zeroSubgroupQuotientToNormQuotient_mk_eq_one_iff + [(N.normSubgroup).Normal] + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : + N.zeroSubgroupQuotientToNormQuotient hzero + (QuotientGroup.mk' vG.zeroSubgroup x) = 1 ↔ + x ∈ N.normSubgroup := by + rw [N.zeroSubgroupQuotientToNormQuotient_mk hzero x] + simp [QuotientGroup.mk'_apply] + +/-- The kernel of `G/G⁰ → G/N` is the image of `N` in `G/G⁰`. -/ +theorem zeroSubgroupQuotientToNormQuotient_ker_eq_normSubgroupClassInZeroQuotient + [(N.normSubgroup).Normal] + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) : + (N.zeroSubgroupQuotientToNormQuotient hzero).ker = + N.normSubgroupClassInZeroQuotient := by + exact (QuotientGroup.ker_map vG.zeroSubgroup N.normSubgroup + (MonoidHom.id G) (fun _ hx => hzero hx)).trans + (congrArg (Subgroup.map (QuotientGroup.mk' vG.zeroSubgroup)) + (Subgroup.comap_id N.normSubgroup)) + +/-- +Establishes the identity `N.zeroSubgroupQuotientToValueModResidueDegree.ker = +N.normSubgroupClassInZeroQuotient`. +-/ +theorem zeroSubgroupQuotientToValueModResidueDegree_ker_eq_normSubgroupClassInZeroQuotient + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) : + N.zeroSubgroupQuotientToValueModResidueDegree.ker = + N.normSubgroupClassInZeroQuotient := by + rw [N.zeroSubgroupQuotientToValueModResidueDegree_ker_eq_residueDegreeClassSubgroup, + N.residueDegreeClassSubgroup_eq_normSubgroupClassInZeroQuotient_of_zeroSubgroup_le + hϖH hzero] + +/-- +Characterizes `q ∈ (N.zeroSubgroupQuotientToNormQuotient hzero).ker` by the equivalent condition +`q ∈ N.normSubgroupClassInZeroQuotient`. +-/ +theorem mem_zeroSubgroupQuotientToNormQuotient_ker_iff + [(N.normSubgroup).Normal] + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) + (q : G ⧸ vG.zeroSubgroup) : + q ∈ (N.zeroSubgroupQuotientToNormQuotient hzero).ker ↔ + q ∈ N.normSubgroupClassInZeroQuotient := by + rw [N.zeroSubgroupQuotientToNormQuotient_ker_eq_normSubgroupClassInZeroQuotient + hzero] + +/-- +Characterizes `QuotientGroup.mk' vG.zeroSubgroup x ∈ N.normSubgroupClassInZeroQuotient` by the +equivalent condition `x ∈ N.normSubgroup`. +-/ +theorem quotientZeroSubgroup_mk_mem_normSubgroupClassInZeroQuotient_iff + [(N.normSubgroup).Normal] + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : + QuotientGroup.mk' vG.zeroSubgroup x ∈ + N.normSubgroupClassInZeroQuotient ↔ + x ∈ N.normSubgroup := by + rw [← N.mem_zeroSubgroupQuotientToNormQuotient_ker_iff hzero + (QuotientGroup.mk' vG.zeroSubgroup x), + MonoidHom.mem_ker, + N.zeroSubgroupQuotientToNormQuotient_mk hzero x] + simp [QuotientGroup.mk'_apply] + +/-- +Characterizes `N.zeroSubgroupQuotientToNormQuotient hzero q = 1` by the equivalent condition `q ∈ +N.normSubgroupClassInZeroQuotient`. +-/ +theorem zeroSubgroupQuotientToNormQuotient_eq_one_iff_mem_normSubgroupClassInZeroQuotient + [(N.normSubgroup).Normal] + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) + (q : G ⧸ vG.zeroSubgroup) : + N.zeroSubgroupQuotientToNormQuotient hzero q = 1 ↔ + q ∈ N.normSubgroupClassInZeroQuotient := by + rw [← MonoidHom.mem_ker, + N.mem_zeroSubgroupQuotientToNormQuotient_ker_iff hzero q] + +/-- +Characterizes `N.zeroSubgroupQuotientToNormQuotient hzero q = 1` by the equivalent condition `∃ x +: G, x ∈ N.normSubgroup ∧ QuotientGroup.mk' vG.zeroSubgroup x = q`. +-/ +theorem zeroSubgroupQuotientToNormQuotient_eq_one_iff_exists_normSubgroup_repr + [(N.normSubgroup).Normal] + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) + (q : G ⧸ vG.zeroSubgroup) : + N.zeroSubgroupQuotientToNormQuotient hzero q = 1 ↔ + ∃ x : G, x ∈ N.normSubgroup ∧ + QuotientGroup.mk' vG.zeroSubgroup x = q := by + rw [N.zeroSubgroupQuotientToNormQuotient_eq_one_iff_mem_normSubgroupClassInZeroQuotient + hzero q, + N.mem_normSubgroupClassInZeroQuotient_iff q] + +/-- +Characterizes `N.zeroSubgroupQuotientToNormQuotient hzero q = N.zeroSubgroupQuotientToNormQuotient +hzero r` by the equivalent condition `q / r ∈ N.normSubgroupClassInZeroQuotient`. +-/ +theorem zeroSubgroupQuotientToNormQuotient_eq_iff_div_mem_normSubgroupClassInZeroQuotient + [(N.normSubgroup).Normal] + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) + (q r : G ⧸ vG.zeroSubgroup) : + N.zeroSubgroupQuotientToNormQuotient hzero q = + N.zeroSubgroupQuotientToNormQuotient hzero r ↔ + q / r ∈ N.normSubgroupClassInZeroQuotient := by + rw [← N.zeroSubgroupQuotientToNormQuotient_ker_eq_normSubgroupClassInZeroQuotient + hzero, + MonoidHom.mem_ker, + MonoidHom.map_div, + div_eq_one] + +/-- The third-isomorphism equivalence +`(G/G⁰)/(N/G⁰) ≃ G/N` for the norm subgroup. -/ +noncomputable def zeroQuotientModuloNormClassEquivNormQuotient + [(N.normSubgroup).Normal] + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) : + (G ⧸ vG.zeroSubgroup) ⧸ N.normSubgroupClassInZeroQuotient ≃* + G ⧸ N.normSubgroup := + QuotientGroup.quotientQuotientEquivQuotient + vG.zeroSubgroup N.normSubgroup hzero + +/-- +Establishes the identity `N.zeroQuotientModuloNormClassEquivNormQuotient hzero (QuotientGroup.mk' +N.normSubgroupClassInZeroQuotient q) = N.zeroSubgroupQuotientToNormQuotient hzero q`. +-/ +theorem zeroQuotientModuloNormClassEquivNormQuotient_mk + [(N.normSubgroup).Normal] + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) + (q : G ⧸ vG.zeroSubgroup) : + N.zeroQuotientModuloNormClassEquivNormQuotient hzero + (QuotientGroup.mk' N.normSubgroupClassInZeroQuotient q) = + N.zeroSubgroupQuotientToNormQuotient hzero q := by + change + QuotientGroup.quotientQuotientEquivQuotientAux + vG.zeroSubgroup N.normSubgroup hzero q = + N.zeroSubgroupQuotientToNormQuotient hzero q + exact + (QuotientGroup.quotientQuotientEquivQuotientAux_mk + (N := vG.zeroSubgroup) (M := N.normSubgroup) (h := hzero) q) + +/-- +Establishes the identity `N.zeroQuotientModuloNormClassEquivNormQuotient hzero (QuotientGroup.mk' +N.normSubgroupClassInZeroQuotient (QuotientGroup.mk' vG.zeroSubgroup x)) = QuotientGroup.mk' +N.normSubgroup x`. +-/ +theorem zeroQuotientModuloNormClassEquivNormQuotient_mk_mk + [(N.normSubgroup).Normal] + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : + N.zeroQuotientModuloNormClassEquivNormQuotient hzero + (QuotientGroup.mk' N.normSubgroupClassInZeroQuotient + (QuotientGroup.mk' vG.zeroSubgroup x)) = + QuotientGroup.mk' N.normSubgroup x := by + rw [N.zeroQuotientModuloNormClassEquivNormQuotient_mk hzero, + N.zeroSubgroupQuotientToNormQuotient_mk hzero x] + +/-- Direct form of the quotient comparison from the residue-degree class +subgroup to the norm quotient. -/ +noncomputable def zeroQuotientModuloResidueDegreeClassEquivNormQuotient + [(N.normSubgroup).Normal] + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) : + (G ⧸ vG.zeroSubgroup) ⧸ N.residueDegreeClassSubgroup ≃* + G ⧸ N.normSubgroup := + (N.zeroQuotientModuloResidueDegreeClassEquivNormClass hϖH hzero).trans + (N.zeroQuotientModuloNormClassEquivNormQuotient hzero) + +/-- +Establishes the identity `N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient hϖH hzero +(QuotientGroup.mk' N.residueDegreeClassSubgroup q) = N.zeroSubgroupQuotientToNormQuotient hzero +q`. +-/ +theorem zeroQuotientModuloResidueDegreeClassEquivNormQuotient_mk + [(N.normSubgroup).Normal] + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) + (q : G ⧸ vG.zeroSubgroup) : + N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient hϖH hzero + (QuotientGroup.mk' N.residueDegreeClassSubgroup q) = + N.zeroSubgroupQuotientToNormQuotient hzero q := by + calc + N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient hϖH hzero + (QuotientGroup.mk' N.residueDegreeClassSubgroup q) = + N.zeroQuotientModuloNormClassEquivNormQuotient hzero + (N.zeroQuotientModuloResidueDegreeClassEquivNormClass hϖH hzero + (QuotientGroup.mk' N.residueDegreeClassSubgroup q)) := rfl + _ = N.zeroSubgroupQuotientToNormQuotient hzero q := by + rw [N.zeroQuotientModuloResidueDegreeClassEquivNormClass_mk hϖH hzero q, + N.zeroQuotientModuloNormClassEquivNormQuotient_mk hzero q] + +/-- +Establishes the identity `N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient hϖH hzero +(QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup x)) = +QuotientGroup.mk' N.normSubgroup x`. +-/ +theorem zeroQuotientModuloResidueDegreeClassEquivNormQuotient_mk_mk + [(N.normSubgroup).Normal] + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : + N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient hϖH hzero + (QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup x)) = + QuotientGroup.mk' N.normSubgroup x := by + rw [N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient_mk hϖH hzero, + N.zeroSubgroupQuotientToNormQuotient_mk hzero x] + +/-- +Establishes the identity `(N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient hϖH hzero).symm +(QuotientGroup.mk' N.normSubgroup x) = QuotientGroup.mk' N.residueDegreeClassSubgroup +(QuotientGroup.mk' vG.zeroSubgroup x)`. +-/ +theorem zeroQuotientModuloResidueDegreeClassEquivNormQuotient_symm_mk + [(N.normSubgroup).Normal] + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : + (N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient hϖH hzero).symm + (QuotientGroup.mk' N.normSubgroup x) = + QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup x) := by + apply (N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient hϖH hzero).injective + calc + N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient hϖH hzero + ((N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient hϖH hzero).symm + (QuotientGroup.mk' N.normSubgroup x)) = + QuotientGroup.mk' N.normSubgroup x := by + exact + (N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient hϖH hzero).apply_symm_apply _ + _ = + N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient hϖH hzero + (QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup x)) := by + rw [N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient_mk_mk + hϖH hzero x] + +/-- +`zeroQuotientModuloResidueDegreeClassEquivNormQuotient_uniformizerClass` satisfies the +integer-power formula `N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient hϖH hzero +((QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n) = +(QuotientGroup.mk' N.normSubgroup ϖG) ^ n`. +-/ +theorem zeroQuotientModuloResidueDegreeClassEquivNormQuotient_uniformizerClass_zpow + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (n : ℤ) : + N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient hϖH hzero + ((QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n) = + (QuotientGroup.mk' N.normSubgroup ϖG) ^ n := by + let _hϖG := hϖG + rw [← (QuotientGroup.mk' N.residueDegreeClassSubgroup).map_zpow + (QuotientGroup.mk' vG.zeroSubgroup ϖG) n, + ← (QuotientGroup.mk' N.normSubgroup).map_zpow ϖG n, + ← (QuotientGroup.mk' vG.zeroSubgroup).map_zpow ϖG n, + N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient_mk_mk + hϖH hzero (ϖG ^ n)] + +/-- +`zeroQuotientModuloResidueDegreeClassEquivNormQuotient_symm_uniformizerClass` satisfies the +integer-power formula `(N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient hϖH hzero).symm +((QuotientGroup.mk' N.normSubgroup ϖG) ^ n) = (QuotientGroup.mk' N.residueDegreeClassSubgroup +(QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n`. +-/ +theorem zeroQuotientModuloResidueDegreeClassEquivNormQuotient_symm_uniformizerClass_zpow + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (n : ℤ) : + (N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient hϖH hzero).symm + ((QuotientGroup.mk' N.normSubgroup ϖG) ^ n) = + (QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n := by + let _hϖG := hϖG + rw [← (QuotientGroup.mk' N.normSubgroup).map_zpow ϖG n, + N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient_symm_mk + hϖH hzero (ϖG ^ n), + ← (QuotientGroup.mk' N.residueDegreeClassSubgroup).map_zpow + (QuotientGroup.mk' vG.zeroSubgroup ϖG) n, + ← (QuotientGroup.mk' vG.zeroSubgroup).map_zpow ϖG n] + +/-- +Establishes the identity `N.zeroSubgroupQuotientToValueModResidueDegree.ker = +(N.zeroSubgroupQuotientToNormQuotient hzero).ker`. +-/ +theorem zeroSubgroupQuotientToValueModResidueDegree_ker_eq_zeroSubgroupQuotientToNormQuotient_ker + [(N.normSubgroup).Normal] + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) : + N.zeroSubgroupQuotientToValueModResidueDegree.ker = + (N.zeroSubgroupQuotientToNormQuotient hzero).ker := by + rw [N.zeroSubgroupQuotientToValueModResidueDegree_ker_eq_normSubgroupClassInZeroQuotient + hϖH hzero, + N.zeroSubgroupQuotientToNormQuotient_ker_eq_normSubgroupClassInZeroQuotient + hzero] + +/-- +Characterizes `N.zeroSubgroupQuotientToValueModResidueDegree q = 1` by the equivalent condition +`N.zeroSubgroupQuotientToNormQuotient hzero q = 1`. +-/ +theorem +zeroSubgroupQuotientToValueModResidueDegree_eq_one_iff_zeroSubgroupQuotientToNormQuotient_eq_one + [(N.normSubgroup).Normal] + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) + (q : G ⧸ vG.zeroSubgroup) : + N.zeroSubgroupQuotientToValueModResidueDegree q = 1 ↔ + N.zeroSubgroupQuotientToNormQuotient hzero q = 1 := by + rw [N.zeroSubgroupQuotientToValueModResidueDegree_eq_one_iff_mem_residueDegreeClassSubgroup + q, + N.residueDegreeClassSubgroup_eq_normSubgroupClassInZeroQuotient_of_zeroSubgroup_le + hϖH hzero, + ← N.zeroSubgroupQuotientToNormQuotient_eq_one_iff_mem_normSubgroupClassInZeroQuotient + hzero q] + +/-- +Characterizes `N.zeroSubgroupQuotientToValueModResidueDegree q = +N.zeroSubgroupQuotientToValueModResidueDegree r` by the equivalent condition +`N.zeroSubgroupQuotientToNormQuotient hzero q = N.zeroSubgroupQuotientToNormQuotient hzero r`. +-/ +theorem zeroSubgroupQuotientToValueModResidueDegree_eq_iff_zeroSubgroupQuotientToNormQuotient_eq + [(N.normSubgroup).Normal] + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) + (q r : G ⧸ vG.zeroSubgroup) : + N.zeroSubgroupQuotientToValueModResidueDegree q = + N.zeroSubgroupQuotientToValueModResidueDegree r ↔ + N.zeroSubgroupQuotientToNormQuotient hzero q = + N.zeroSubgroupQuotientToNormQuotient hzero r := by + rw [N.zeroSubgroupQuotientToValueModResidueDegree_eq_iff_div_mem_residueDegreeClassSubgroup + q r, + N.residueDegreeClassSubgroup_eq_normSubgroupClassInZeroQuotient_of_zeroSubgroup_le + hϖH hzero, + ← N.zeroSubgroupQuotientToNormQuotient_eq_iff_div_mem_normSubgroupClassInZeroQuotient + hzero q r] + +/-- +Characterizes `N.zeroSubgroupQuotientToNormQuotient hzero (QuotientGroup.mk' vG.zeroSubgroup x) = +N.zeroSubgroupQuotientToNormQuotient hzero (QuotientGroup.mk' vG.zeroSubgroup y)` by the +equivalent condition `x / y ∈ N.normSubgroup`. +-/ +theorem zeroSubgroupQuotientToNormQuotient_mk_eq_iff + [(N.normSubgroup).Normal] + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x y : G) : + N.zeroSubgroupQuotientToNormQuotient hzero + (QuotientGroup.mk' vG.zeroSubgroup x) = + N.zeroSubgroupQuotientToNormQuotient hzero + (QuotientGroup.mk' vG.zeroSubgroup y) ↔ + x / y ∈ N.normSubgroup := by + rw [N.zeroSubgroupQuotientToNormQuotient_mk hzero x, + N.zeroSubgroupQuotientToNormQuotient_mk hzero y] + simpa [QuotientGroup.mk'_apply] using + (QuotientGroup.eq_iff_div_mem + (N := N.normSubgroup) (x := x) (y := y)) + +/-- Left-quotient version of +`zeroSubgroupQuotientToNormQuotient_mk_eq_iff`. -/ +theorem zeroSubgroupQuotientToNormQuotient_mk_eq_iff_inv_mul_mem + [(N.normSubgroup).Normal] + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x y : G) : + N.zeroSubgroupQuotientToNormQuotient hzero + (QuotientGroup.mk' vG.zeroSubgroup x) = + N.zeroSubgroupQuotientToNormQuotient hzero + (QuotientGroup.mk' vG.zeroSubgroup y) ↔ + y⁻¹ * x ∈ N.normSubgroup := by + rw [N.zeroSubgroupQuotientToNormQuotient_mk_eq_iff hzero x y, + N.div_mem_normSubgroup_iff_inv_mul_mem_normSubgroup x y] + +/-- +Characterizes `N.zeroSubgroupQuotientToNormQuotient hzero (QuotientGroup.mk' vG.zeroSubgroup x) = +1` by the equivalent condition `(N.residueDegree : ℤ) ∣ vG.val x`. +-/ +theorem zeroSubgroupQuotientToNormQuotient_mk_eq_one_iff_residueDegree_dvd + [(N.normSubgroup).Normal] + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : + N.zeroSubgroupQuotientToNormQuotient hzero + (QuotientGroup.mk' vG.zeroSubgroup x) = 1 ↔ + (N.residueDegree : ℤ) ∣ vG.val x := by + rw [N.zeroSubgroupQuotientToNormQuotient_mk_eq_one_iff hzero x, + N.mem_normSubgroup_iff_residueDegree_dvd_val_of_zeroSubgroup_le + hϖH hzero x] + +/-- +Characterizes `N.zeroSubgroupQuotientToNormQuotient hzero (QuotientGroup.mk' vG.zeroSubgroup x) = +N.zeroSubgroupQuotientToNormQuotient hzero (QuotientGroup.mk' vG.zeroSubgroup y)` by the +equivalent condition `(N.residueDegree : ℤ) ∣ vG.val x - vG.val y`. +-/ +theorem zeroSubgroupQuotientToNormQuotient_mk_eq_iff_residueDegree_dvd + [(N.normSubgroup).Normal] + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x y : G) : + N.zeroSubgroupQuotientToNormQuotient hzero + (QuotientGroup.mk' vG.zeroSubgroup x) = + N.zeroSubgroupQuotientToNormQuotient hzero + (QuotientGroup.mk' vG.zeroSubgroup y) ↔ + (N.residueDegree : ℤ) ∣ vG.val x - vG.val y := by + rw [N.zeroSubgroupQuotientToNormQuotient_mk_eq_iff hzero x y, + N.div_mem_normSubgroup_iff_residueDegree_dvd_valuation_difference_of_zeroSubgroup_le + hϖH hzero x y] + +/-- Left-quotient proof route for equality in +`G ⧸ zeroSubgroup → G ⧸ normSubgroup`, expressed by residue-degree +divisibility. -/ +theorem zeroSubgroupQuotientToNormQuotient_mk_eq_iff_inv_mul_residueDegree_dvd + [(N.normSubgroup).Normal] + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x y : G) : + N.zeroSubgroupQuotientToNormQuotient hzero + (QuotientGroup.mk' vG.zeroSubgroup x) = + N.zeroSubgroupQuotientToNormQuotient hzero + (QuotientGroup.mk' vG.zeroSubgroup y) ↔ + (N.residueDegree : ℤ) ∣ vG.val x - vG.val y := by + rw [N.zeroSubgroupQuotientToNormQuotient_mk_eq_iff_inv_mul_mem hzero x y, + N.inv_mul_mem_normSubgroup_iff_residueDegree_dvd_valuation_difference_of_zeroSubgroup_le + hϖH hzero x y] + +/-- The actual norm quotient is the value-group quotient `ℤ / fℤ` when +valuation-zero target elements are norms and the target valuation has a +uniformizer. -/ +noncomputable def normQuotientEquivValueModResidueDegree + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) : + G ⧸ N.normSubgroup ≃* + Multiplicative ℤ ⧸ integerMultipleSubgroup (N.residueDegree : ℤ) := + (QuotientGroup.quotientMulEquivOfEq + (N.valueModResidueDegreeHom_ker_eq_normSubgroup_of_zeroSubgroup_le + hϖH hzero).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + N.valueModResidueDegreeHom + (N.valueModResidueDegreeHom_surjective_of_uniformizer hϖG)) + +/-- +Establishes the identity `N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero +(QuotientGroup.mk' N.normSubgroup x) = QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree +: ℤ)) (vG.valuationHom x)`. +-/ +theorem normQuotientEquivValueModResidueDegree_mk + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : + N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero + (QuotientGroup.mk' N.normSubgroup x) = + QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) + (vG.valuationHom x) := by + change QuotientGroup.kerLift N.valueModResidueDegreeHom + ((QuotientGroup.quotientMulEquivOfEq + (N.valueModResidueDegreeHom_ker_eq_normSubgroup_of_zeroSubgroup_le + hϖH hzero).symm) (QuotientGroup.mk x)) = N.valueModResidueDegreeHom x + rw [QuotientGroup.quotientMulEquivOfEq_mk] + exact QuotientGroup.kerLift_mk N.valueModResidueDegreeHom x + +/-- +Establishes the identity `N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero +(QuotientGroup.mk' N.normSubgroup x) = QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree +: ℤ)) (Multiplicative.ofAdd (vG.val x))`. +-/ +theorem normQuotientEquivValueModResidueDegree_mk_ofAdd + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : + N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero + (QuotientGroup.mk' N.normSubgroup x) = + QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) + (Multiplicative.ofAdd (vG.val x)) := by + rw [N.normQuotientEquivValueModResidueDegree_mk hϖG hϖH hzero x, + MultiplicativeIntegerValuation.valuationHom_apply] + +/-- +`normQuotientEquivValueModResidueDegree_uniformizer` satisfies the integer-power formula +`N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero (QuotientGroup.mk' N.normSubgroup (ϖG ^ +n)) = QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) (Multiplicative.ofAdd n)`. +-/ +theorem normQuotientEquivValueModResidueDegree_uniformizer_zpow + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (n : ℤ) : + N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero + (QuotientGroup.mk' N.normSubgroup (ϖG ^ n)) = + QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) + (Multiplicative.ofAdd n) := by + rw [N.normQuotientEquivValueModResidueDegree_mk_ofAdd + hϖG hϖH hzero (ϖG ^ n), + vG.val_uniformizer_zpow hϖG n] + +/-- +Establishes the identity `(N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero).symm +(QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) (Multiplicative.ofAdd (vG.val +x))) = QuotientGroup.mk' N.normSubgroup x`. +-/ +theorem normQuotientEquivValueModResidueDegree_symm_mk_val + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : + (N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero).symm + (QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) + (Multiplicative.ofAdd (vG.val x))) = + QuotientGroup.mk' N.normSubgroup x := by + apply (N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero).injective + calc + N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero + ((N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero).symm + (QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) + (Multiplicative.ofAdd (vG.val x)))) = + QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) + (Multiplicative.ofAdd (vG.val x)) := by + exact + (N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero).apply_symm_apply _ + _ = + N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero + (QuotientGroup.mk' N.normSubgroup x) := by + rw [N.normQuotientEquivValueModResidueDegree_mk_ofAdd + hϖG hϖH hzero x] + +/-- +Establishes the identity `(N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero).symm +(QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) (Multiplicative.ofAdd n)) = +QuotientGroup.mk' N.normSubgroup (ϖG ^ n)`. +-/ +theorem normQuotientEquivValueModResidueDegree_symm_mk_ofAdd + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (n : ℤ) : + (N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero).symm + (QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) + (Multiplicative.ofAdd n)) = + QuotientGroup.mk' N.normSubgroup (ϖG ^ n) := by + apply (N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero).injective + rw [N.normQuotientEquivValueModResidueDegree_uniformizer_zpow + hϖG hϖH hzero n] + simp + +/-- Compatibility of the natural map `G/G⁰ → G/N` with the value-modulo +residue-degree map. -/ +theorem normQuotientEquivValueModResidueDegree_zeroSubgroupQuotientToNormQuotient_mk + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : + N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero + (N.zeroSubgroupQuotientToNormQuotient hzero + (QuotientGroup.mk' vG.zeroSubgroup x)) = + N.zeroSubgroupQuotientToValueModResidueDegree + (QuotientGroup.mk' vG.zeroSubgroup x) := by + rw [N.zeroSubgroupQuotientToNormQuotient_mk hzero x, + N.normQuotientEquivValueModResidueDegree_mk hϖG hϖH hzero x, + N.zeroSubgroupQuotientToValueModResidueDegree_mk x] + +/-- The direct residue-degree-class quotient to the norm quotient, followed by +the norm-quotient/value-group equivalence, agrees with the direct +value-mod-residue-degree quotient map on representatives. -/ +theorem +normQuotientEquivValueModResidueDegree_zeroQuotientModuloResidueDegreeClassEquivNormQuotient_mk + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) + (q : G ⧸ vG.zeroSubgroup) : + N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero + (N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient hϖH hzero + (QuotientGroup.mk' N.residueDegreeClassSubgroup q)) = + N.zeroSubgroupQuotientToValueModResidueDegree q := by + refine QuotientGroup.induction_on q ?_ + intro x + change + N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero + (N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient hϖH hzero + (QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup x))) = + N.zeroSubgroupQuotientToValueModResidueDegree + (QuotientGroup.mk' vG.zeroSubgroup x) + rw [N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient_mk + hϖH hzero (QuotientGroup.mk' vG.zeroSubgroup x), + N.zeroSubgroupQuotientToNormQuotient_mk hzero x, + N.normQuotientEquivValueModResidueDegree_mk hϖG hϖH hzero x, + N.zeroSubgroupQuotientToValueModResidueDegree_mk x] + +/-- +Establishes the identity `N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero +(N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient hϖH hzero (QuotientGroup.mk' +N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup x))) = QuotientGroup.mk' +(integerMultipleSubgroup (N.residueDegree : ℤ)) (Multiplicative.ofAdd (vG.val x))`. +-/ +theorem +normQuotientEquivValueModResidueDegree_zeroQuotientModuloResidueDegreeClassEquivNormQuotient_mk_mk + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : + N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero + (N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient hϖH hzero + (QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup x))) = + QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) + (Multiplicative.ofAdd (vG.val x)) := by + rw [N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient_mk_mk + hϖH hzero x, + N.normQuotientEquivValueModResidueDegree_mk_ofAdd hϖG hϖH hzero x] + +/-- Pointwise compatibility of the two quotient routes from +`(G/G⁰)/residueDegreeClassSubgroup` to the value group modulo the +residue-degree subgroup. -/ +theorem zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_apply_eq_norm_composite + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) + (z : (G ⧸ vG.zeroSubgroup) ⧸ N.residueDegreeClassSubgroup) : + N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree hϖG z = + N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero + (N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient hϖH hzero z) := by + refine QuotientGroup.induction_on z ?_ + intro q + refine QuotientGroup.induction_on q ?_ + intro x + change + N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree hϖG + (QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup x)) = + N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero + (N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient hϖH hzero + (QuotientGroup.mk' N.residueDegreeClassSubgroup + (QuotientGroup.mk' vG.zeroSubgroup x))) + rw [N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_mk + hϖG (QuotientGroup.mk' vG.zeroSubgroup x), + N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient_mk + hϖH hzero (QuotientGroup.mk' vG.zeroSubgroup x), + N.normQuotientEquivValueModResidueDegree_zeroSubgroupQuotientToNormQuotient_mk + hϖG hϖH hzero x] + +end ValuedNorm + +end DiscreteValuationField + +end + +end LocalFieldTheory + +universe u v + +namespace LocalFieldTheory + +noncomputable +section + +namespace DiscreteValuationField +namespace ValuedNorm + +variable {G : Type u} {H : Type v} [Group G] [Group H] +variable {vG : MultiplicativeIntegerValuation G} +variable {vH : MultiplicativeIntegerValuation H} +variable (N : ValuedNorm vG vH) + +/-- Kernel criterion for the actual quotient by the norm subgroup. -/ +theorem normQuotient_mk_eq_one_iff_mem [(N.normSubgroup).Normal] (x : G) : + QuotientGroup.mk' N.normSubgroup x = 1 ↔ x ∈ N.normSubgroup := by + simp [QuotientGroup.mk'_apply] + +/-- Equality in the actual quotient by the norm subgroup is equality modulo +the norm subgroup. -/ +theorem normQuotient_mk_eq_iff_div_mem [(N.normSubgroup).Normal] (x y : G) : + QuotientGroup.mk' N.normSubgroup x = + QuotientGroup.mk' N.normSubgroup y ↔ + x / y ∈ N.normSubgroup := by + simpa [QuotientGroup.mk'_apply] using + (QuotientGroup.eq_iff_div_mem + (N := N.normSubgroup) (x := x) (y := y)) + +/-- Equality in the actual quotient by the norm subgroup, in left-quotient +form. -/ +theorem normQuotient_mk_eq_iff_inv_mul_mem [(N.normSubgroup).Normal] + (x y : G) : + QuotientGroup.mk' N.normSubgroup x = + QuotientGroup.mk' N.normSubgroup y ↔ + y⁻¹ * x ∈ N.normSubgroup := by + rw [N.normQuotient_mk_eq_iff_div_mem x y, + N.div_mem_normSubgroup_iff_inv_mul_mem_normSubgroup x y] + +/-- Equality in the norm quotient, expressed by valuation divisibility under +the standard hypothesis that valuation-zero target elements are norms. -/ +theorem normQuotient_mk_eq_iff_residueDegree_dvd_valuation_difference + [(N.normSubgroup).Normal] + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x y : G) : + QuotientGroup.mk' N.normSubgroup x = + QuotientGroup.mk' N.normSubgroup y ↔ + (N.residueDegree : ℤ) ∣ vG.val x - vG.val y := by + rw [N.normQuotient_mk_eq_iff_div_mem x y, + N.div_mem_normSubgroup_iff_residueDegree_dvd_valuation_difference_of_zeroSubgroup_le + hϖH hzero x y] + +/-- Left-quotient proof route for equality in the norm quotient, expressed by +residue-degree divisibility. -/ +theorem normQuotient_mk_eq_iff_inv_mul_residueDegree_dvd + [(N.normSubgroup).Normal] + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x y : G) : + QuotientGroup.mk' N.normSubgroup x = + QuotientGroup.mk' N.normSubgroup y ↔ + (N.residueDegree : ℤ) ∣ vG.val x - vG.val y := by + rw [N.normQuotient_mk_eq_iff_inv_mul_mem x y, + N.inv_mul_mem_normSubgroup_iff_residueDegree_dvd_valuation_difference_of_zeroSubgroup_le + hϖH hzero x y] + +/-- Establishes the membership statement `y⁻¹ * x ∈ N.normSubgroup`. -/ +theorem inv_mul_mem_normSubgroup_of_normQuotient_mk_eq + [(N.normSubgroup).Normal] {x y : G} + (hxy : QuotientGroup.mk' N.normSubgroup x = + QuotientGroup.mk' N.normSubgroup y) : + y⁻¹ * x ∈ N.normSubgroup := + (N.normQuotient_mk_eq_iff_inv_mul_mem x y).1 hxy + +/-- +Establishes the identity `QuotientGroup.mk' N.normSubgroup x = QuotientGroup.mk' N.normSubgroup +y`. +-/ +theorem normQuotient_mk_eq_of_inv_mul_mem + [(N.normSubgroup).Normal] {x y : G} + (hxy : y⁻¹ * x ∈ N.normSubgroup) : + QuotientGroup.mk' N.normSubgroup x = + QuotientGroup.mk' N.normSubgroup y := + (N.normQuotient_mk_eq_iff_inv_mul_mem x y).2 hxy + +/-- Elements with the same valuation represent the same norm-quotient class +when valuation-zero target elements are norms. -/ +theorem normQuotient_mk_eq_of_val_eq [(N.normSubgroup).Normal] + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) + {x y : G} (hxy : vG.val x = vG.val y) : + QuotientGroup.mk' N.normSubgroup x = + QuotientGroup.mk' N.normSubgroup y := by + rw [N.normQuotient_mk_eq_iff_div_mem x y] + exact hzero ((vG.div_mem_zeroSubgroup_iff x y).2 hxy) + +/-- Every norm-quotient class has a target-uniformizer-power representative +when valuation-zero target elements are norms. -/ +theorem normQuotient_mk_eq_uniformizer_zpow_val + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : + QuotientGroup.mk' N.normSubgroup x = + QuotientGroup.mk' N.normSubgroup (ϖG ^ vG.val x) := by + apply N.normQuotient_mk_eq_of_val_eq hzero + rw [vG.val_uniformizer_zpow hϖG (vG.val x)] + +/-- Criterion for a norm-quotient class to be represented by a prescribed +target-uniformizer power. -/ +theorem normQuotient_mk_eq_uniformizer_zpow_iff + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) (n : ℤ) : + QuotientGroup.mk' N.normSubgroup x = + QuotientGroup.mk' N.normSubgroup (ϖG ^ n) ↔ + (N.residueDegree : ℤ) ∣ vG.val x - n := by + rw [N.normQuotient_mk_eq_iff_residueDegree_dvd_valuation_difference + hϖH hzero x (ϖG ^ n), + vG.val_uniformizer_zpow hϖG n] + +/-- Equality of two target-uniformizer-power classes in the norm quotient is +equivalent to residue-degree divisibility of the exponent difference. -/ +theorem normQuotient_uniformizer_zpow_mk_eq_iff + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (m n : ℤ) : + QuotientGroup.mk' N.normSubgroup (ϖG ^ m) = + QuotientGroup.mk' N.normSubgroup (ϖG ^ n) ↔ + (N.residueDegree : ℤ) ∣ m - n := by + rw [N.normQuotient_mk_eq_iff_residueDegree_dvd_valuation_difference + hϖH hzero (ϖG ^ m) (ϖG ^ n), + vG.val_uniformizer_zpow hϖG m, vG.val_uniformizer_zpow hϖG n] + +/-- The residue-degree power of a target uniformizer is trivial in the norm +quotient under the standard unit-norm-surjectivity hypothesis. -/ +theorem normQuotient_uniformizer_zpow_residueDegree_eq_one + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) : + QuotientGroup.mk' N.normSubgroup + (ϖG ^ (N.residueDegree : ℤ)) = 1 := by + let _hϖG := hϖG + rw [N.normQuotient_mk_eq_one_iff_mem] + exact N.mem_normSubgroup_of_residueDegree_dvd_val_of_zeroSubgroup_le + hϖH hzero (by + simp) + +/-- Uniformizer powers in the norm quotient are periodic modulo the residue +degree under the standard unit-norm-surjectivity hypothesis. -/ +theorem normQuotient_uniformizer_zpow_add_residueDegree_mul_mk_eq + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (n k : ℤ) : + QuotientGroup.mk' N.normSubgroup + (ϖG ^ (n + (N.residueDegree : ℤ) * k)) = + QuotientGroup.mk' N.normSubgroup (ϖG ^ n) := + (N.normQuotient_uniformizer_zpow_mk_eq_iff + hϖG hϖH hzero (n + (N.residueDegree : ℤ) * k) n).2 + (N.residueDegree_dvd_add_residueDegree_mul_sub n k) + +/-- Generator-power form of +`normQuotient_mk_eq_uniformizer_zpow_val`: every element has the same norm +quotient class as the valuation power of a target uniformizer class. -/ +theorem normQuotient_mk_eq_uniformizerClass_zpow_val + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : + QuotientGroup.mk' N.normSubgroup x = + (QuotientGroup.mk' N.normSubgroup ϖG) ^ vG.val x := by + rw [← (QuotientGroup.mk' N.normSubgroup).map_zpow ϖG (vG.val x)] + exact N.normQuotient_mk_eq_uniformizer_zpow_val hϖG hzero x + +/-- Criterion for a norm-quotient class to be a prescribed power of the target +uniformizer class. -/ +theorem normQuotient_mk_eq_uniformizerClass_zpow_iff + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) (n : ℤ) : + QuotientGroup.mk' N.normSubgroup x = + (QuotientGroup.mk' N.normSubgroup ϖG) ^ n ↔ + (N.residueDegree : ℤ) ∣ vG.val x - n := by + rw [← (QuotientGroup.mk' N.normSubgroup).map_zpow ϖG n] + exact N.normQuotient_mk_eq_uniformizer_zpow_iff + hϖG hϖH hzero x n + +/-- Equality of two powers of the target uniformizer class is residue-degree +divisibility of the exponent difference. -/ +theorem normQuotient_uniformizerClass_zpow_eq_iff + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (m n : ℤ) : + (QuotientGroup.mk' N.normSubgroup ϖG) ^ m = + (QuotientGroup.mk' N.normSubgroup ϖG) ^ n ↔ + (N.residueDegree : ℤ) ∣ m - n := by + rw [← (QuotientGroup.mk' N.normSubgroup).map_zpow ϖG m, + ← (QuotientGroup.mk' N.normSubgroup).map_zpow ϖG n] + exact N.normQuotient_uniformizer_zpow_mk_eq_iff + hϖG hϖH hzero m n + +/-- A sufficient form of the exponent-reduction criterion for the target +uniformizer class. -/ +theorem normQuotient_uniformizerClass_zpow_eq_of_sub_dvd + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) {m n : ℤ} + (hmn : (N.residueDegree : ℤ) ∣ m - n) : + (QuotientGroup.mk' N.normSubgroup ϖG) ^ m = + (QuotientGroup.mk' N.normSubgroup ϖG) ^ n := + (N.normQuotient_uniformizerClass_zpow_eq_iff + hϖG hϖH hzero m n).2 hmn + +/-- The target-uniformizer generator in the norm quotient has exponents periodic +modulo the residue degree. -/ +theorem normQuotient_uniformizerClass_zpow_add_residueDegree_mul_eq + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (n k : ℤ) : + (QuotientGroup.mk' N.normSubgroup ϖG) ^ + (n + (N.residueDegree : ℤ) * k) = + (QuotientGroup.mk' N.normSubgroup ϖG) ^ n := + N.normQuotient_uniformizerClass_zpow_eq_of_sub_dvd hϖG hϖH hzero + (N.residueDegree_dvd_add_residueDegree_mul_sub n k) + +/-- The residue-degree power of the target uniformizer class is trivial in the +norm quotient. -/ +theorem normQuotient_uniformizerClass_zpow_residueDegree_eq_one + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) : + (QuotientGroup.mk' N.normSubgroup ϖG) ^ (N.residueDegree : ℤ) = 1 := by + rw [← (QuotientGroup.mk' N.normSubgroup).map_zpow + ϖG (N.residueDegree : ℤ)] + exact N.normQuotient_uniformizer_zpow_residueDegree_eq_one + hϖG hϖH hzero + +/-- A power of the target uniformizer class is trivial exactly when its +exponent is divisible by the residue degree. -/ +theorem normQuotient_uniformizerClass_zpow_eq_one_iff + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (n : ℤ) : + (QuotientGroup.mk' N.normSubgroup ϖG) ^ n = 1 ↔ + (N.residueDegree : ℤ) ∣ n := by + rw [← (QuotientGroup.mk' N.normSubgroup).map_zpow ϖG n] + simpa [zpow_zero, sub_zero] using + (N.normQuotient_uniformizer_zpow_mk_eq_iff + hϖG hϖH hzero n 0) + +/-- The norm quotient is generated by the class of any target uniformizer. -/ +theorem normQuotient_generated_by_uniformizerClass + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) + (q : G ⧸ N.normSubgroup) : + ∃ n : ℤ, q = (QuotientGroup.mk' N.normSubgroup ϖG) ^ n := by + refine QuotientGroup.induction_on q ?_ + intro x + exact ⟨vG.val x, + N.normQuotient_mk_eq_uniformizerClass_zpow_val + hϖG hzero x⟩ + +/-- The norm quotient is cyclic, generated by the class of any target +uniformizer, under the standard unit-norm-surjectivity hypothesis. -/ +theorem normQuotient_closure_uniformizerClass_eq_top + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) : + Subgroup.closure + ({QuotientGroup.mk' N.normSubgroup ϖG} : Set (G ⧸ N.normSubgroup)) = + ⊤ := by + apply le_antisymm + · exact le_top + · intro q hq + rcases N.normQuotient_generated_by_uniformizerClass hϖG hzero q with + ⟨n, hqpow⟩ + rw [hqpow] + exact Subgroup.zpow_mem + (Subgroup.closure + ({QuotientGroup.mk' N.normSubgroup ϖG} : Set (G ⧸ N.normSubgroup))) + (Subgroup.subset_closure (by simp)) n + +/-- Under the value-group equivalence, the `n`th power of the target +uniformizer class maps to the class of `n` modulo the residue-degree subgroup. -/ +theorem normQuotientEquivValueModResidueDegree_uniformizerClass_zpow + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (n : ℤ) : + N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero + ((QuotientGroup.mk' N.normSubgroup ϖG) ^ n) = + QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) + (Multiplicative.ofAdd n) := by + rw [← (QuotientGroup.mk' N.normSubgroup).map_zpow ϖG n] + exact N.normQuotientEquivValueModResidueDegree_uniformizer_zpow + hϖG hϖH hzero n + +/-- +`normQuotientEquivValueModResidueDegree_symm_mk_ofAdd_uniformizerClass` satisfies the +integer-power formula `(N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero).symm +(QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) (Multiplicative.ofAdd n)) = +(QuotientGroup.mk' N.normSubgroup ϖG) ^ n`. +-/ +theorem normQuotientEquivValueModResidueDegree_symm_mk_ofAdd_uniformizerClass_zpow + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (n : ℤ) : + (N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero).symm + (QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) + (Multiplicative.ofAdd n)) = + (QuotientGroup.mk' N.normSubgroup ϖG) ^ n := by + rw [N.normQuotientEquivValueModResidueDegree_symm_mk_ofAdd + hϖG hϖH hzero n, + ← (QuotientGroup.mk' N.normSubgroup).map_zpow ϖG n] + +/-- The actual norm quotient as the standard cyclic group +`Multiplicative (ZMod f)`, where `f` is the residue degree in the valuation +formula. -/ +noncomputable def normQuotientEquivZMod + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) : + G ⧸ N.normSubgroup ≃* Multiplicative (ZMod N.residueDegree) := + (N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero).trans + (valueModIntegerMultipleSubgroupEquivZMod (N.residueDegree : ℤ)) + +/-- +Establishes the identity `N.normQuotientEquivZMod hϖG hϖH hzero (QuotientGroup.mk' N.normSubgroup +x) = Multiplicative.ofAdd ((vG.val x : ℤ) : ZMod N.residueDegree)`. +-/ +theorem normQuotientEquivZMod_mk + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : + N.normQuotientEquivZMod hϖG hϖH hzero + (QuotientGroup.mk' N.normSubgroup x) = + Multiplicative.ofAdd ((vG.val x : ℤ) : ZMod N.residueDegree) := by + rw [normQuotientEquivZMod, MulEquiv.trans_apply, + N.normQuotientEquivValueModResidueDegree_mk_ofAdd hϖG hϖH hzero x] + rfl + +/-- +`normQuotientEquivZMod_uniformizer` satisfies the integer-power formula `N.normQuotientEquivZMod +hϖG hϖH hzero (QuotientGroup.mk' N.normSubgroup (ϖG ^ n)) = Multiplicative.ofAdd ((n : ℤ) : ZMod +N.residueDegree)`. +-/ +theorem normQuotientEquivZMod_uniformizer_zpow + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (n : ℤ) : + N.normQuotientEquivZMod hϖG hϖH hzero + (QuotientGroup.mk' N.normSubgroup (ϖG ^ n)) = + Multiplicative.ofAdd ((n : ℤ) : ZMod N.residueDegree) := by + rw [N.normQuotientEquivZMod_mk hϖG hϖH hzero (ϖG ^ n), + vG.val_uniformizer_zpow hϖG n] + +/-- +`normQuotientEquivZMod_uniformizerClass` satisfies the integer-power formula +`N.normQuotientEquivZMod hϖG hϖH hzero ((QuotientGroup.mk' N.normSubgroup ϖG) ^ n) = +Multiplicative.ofAdd ((n : ℤ) : ZMod N.residueDegree)`. +-/ +theorem normQuotientEquivZMod_uniformizerClass_zpow + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (n : ℤ) : + N.normQuotientEquivZMod hϖG hϖH hzero + ((QuotientGroup.mk' N.normSubgroup ϖG) ^ n) = + Multiplicative.ofAdd ((n : ℤ) : ZMod N.residueDegree) := by + rw [← (QuotientGroup.mk' N.normSubgroup).map_zpow ϖG n, + N.normQuotientEquivZMod_uniformizer_zpow hϖG hϖH hzero n] + +/-- +Establishes the identity `(N.normQuotientEquivZMod hϖG hϖH hzero).symm (Multiplicative.ofAdd ((n : +ℤ) : ZMod N.residueDegree)) = QuotientGroup.mk' N.normSubgroup (ϖG ^ n)`. +-/ +@[simp] theorem normQuotientEquivZMod_symm_mk_ofAdd + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (n : ℤ) : + (N.normQuotientEquivZMod hϖG hϖH hzero).symm + (Multiplicative.ofAdd ((n : ℤ) : ZMod N.residueDegree)) = + QuotientGroup.mk' N.normSubgroup (ϖG ^ n) := by + apply (N.normQuotientEquivZMod hϖG hϖH hzero).injective + rw [MulEquiv.apply_symm_apply, + N.normQuotientEquivZMod_uniformizer_zpow hϖG hϖH hzero n] + +/-- Cardinality form of the norm-quotient computation when the residue degree is +nonzero. -/ +theorem card_normQuotient_eq_residueDegree + [(N.normSubgroup).Normal] + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) + : + Nat.card (G ⧸ N.normSubgroup) = N.residueDegree := by + calc + Nat.card (G ⧸ N.normSubgroup) = + Nat.card (Multiplicative (ZMod N.residueDegree)) := + Nat.card_congr + (N.normQuotientEquivZMod hϖG hϖH hzero).toEquiv + _ = Nat.card (ZMod N.residueDegree) := + Nat.card_congr Multiplicative.toAdd + _ = N.residueDegree := Nat.card_zmod N.residueDegree + +/-- Uniformizer-power criterion for target powers lying in the norm subgroup, +assuming all target valuation-zero elements are norms. -/ +theorem uniformizer_zpow_mem_normSubgroup_iff_of_zeroSubgroup_le + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (n : ℤ) : + ϖG ^ n ∈ N.normSubgroup ↔ (N.residueDegree : ℤ) ∣ n := by + rw [N.mem_normSubgroup_iff_residueDegree_dvd_val_of_zeroSubgroup_le + hϖH hzero (ϖG ^ n), + vG.val_uniformizer_zpow hϖG n] + +/-- Target uniformizer-power quotients are norms exactly when the exponent +difference is divisible by the residue degree, provided all target +valuation-zero elements are norms. -/ +theorem uniformizer_zpow_div_mem_normSubgroup_iff_of_zeroSubgroup_le + {ϖG : G} (hϖG : vG.IsUniformizer ϖG) + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (m n : ℤ) : + ϖG ^ m / ϖG ^ n ∈ N.normSubgroup ↔ + (N.residueDegree : ℤ) ∣ m - n := by + rw [N.div_mem_normSubgroup_iff_residueDegree_dvd_valuation_difference_of_zeroSubgroup_le + hϖH hzero (ϖG ^ m) (ϖG ^ n), + vG.val_uniformizer_zpow hϖG m, vG.val_uniformizer_zpow hϖG n] + +/-- Normal-form criterion for the norm subgroup when target valuation-zero +elements are norms. -/ +theorem mem_normSubgroup_iff_exists_zeroSubgroup_mul_norm_uniformizer_zpow_eq + {ϖH : H} (hϖH : vH.IsUniformizer ϖH) + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : + x ∈ N.normSubgroup ↔ + ∃ u : G, u ∈ vG.zeroSubgroup ∧ + ∃ n : ℤ, x = u * N.toHom (ϖH ^ n) := by + constructor + · exact N.exists_zeroSubgroup_mul_norm_uniformizer_zpow_eq_of_mem_normSubgroup + hϖH + · rintro ⟨u, hu, n, hx⟩ + rw [hx] + exact N.normSubgroup.mul_mem (hzero hu) + ((MonoidHom.mem_range (f := N.toHom)).2 ⟨ϖH ^ n, rfl⟩) + +/-- Membership in the norm subgroup is invariant under right multiplication by +a norm. -/ +theorem normSubgroup_mul_iff_right {x h : G} (hh : h ∈ N.normSubgroup) : + x * h ∈ N.normSubgroup ↔ x ∈ N.normSubgroup := by + constructor + · intro hxh + have h : (x * h) * h⁻¹ ∈ N.normSubgroup := + N.normSubgroup.mul_mem hxh (N.normSubgroup.inv_mem hh) + simpa [mul_assoc] using h + · intro hx + exact N.normSubgroup.mul_mem hx hh + +/-- Membership in the norm subgroup is invariant under left multiplication by +a norm. -/ +theorem normSubgroup_mul_iff_left {h x : G} (hh : h ∈ N.normSubgroup) : + h * x ∈ N.normSubgroup ↔ x ∈ N.normSubgroup := by + constructor + · intro hhx + have h : h⁻¹ * (h * x) ∈ N.normSubgroup := + N.normSubgroup.mul_mem (N.normSubgroup.inv_mem hh) hhx + simpa [mul_assoc] using h + · intro hx + exact N.normSubgroup.mul_mem hh hx + +/-- Dividing on the right by a norm preserves norm-subgroup membership. -/ +theorem normSubgroup_div_iff_right {x h : G} (hh : h ∈ N.normSubgroup) : + x / h ∈ N.normSubgroup ↔ x ∈ N.normSubgroup := by + simpa [div_eq_mul_inv] using + N.normSubgroup_mul_iff_right (x := x) (h := h⁻¹) + (N.normSubgroup.inv_mem hh) + +/-- Dividing a norm on the left by an element detects membership of that +element in the norm subgroup. -/ +theorem normSubgroup_div_iff_left {h x : G} (hh : h ∈ N.normSubgroup) : + h / x ∈ N.normSubgroup ↔ x ∈ N.normSubgroup := by + constructor + · intro hhx + have h : h⁻¹ * (h / x) ∈ N.normSubgroup := + N.normSubgroup.mul_mem (N.normSubgroup.inv_mem hh) hhx + have hxinv : x⁻¹ ∈ N.normSubgroup := by + simpa [div_eq_mul_inv, mul_assoc] using h + simpa using N.normSubgroup.inv_mem hxinv + · intro hx + exact N.normSubgroup.div_mem hh hx + +/-- +Characterizes `x * N.toHom y ∈ N.normSubgroup` by the equivalent condition `x ∈ N.normSubgroup`. +-/ +theorem normSubgroup_mul_norm_iff (x : G) (y : H) : + x * N.toHom y ∈ N.normSubgroup ↔ x ∈ N.normSubgroup := + N.normSubgroup_mul_iff_right + ((MonoidHom.mem_range (f := N.toHom)).2 ⟨y, rfl⟩) + +/-- +Characterizes `N.toHom y * x ∈ N.normSubgroup` by the equivalent condition `x ∈ N.normSubgroup`. +-/ +theorem normSubgroup_norm_mul_iff (y : H) (x : G) : + N.toHom y * x ∈ N.normSubgroup ↔ x ∈ N.normSubgroup := + N.normSubgroup_mul_iff_left + ((MonoidHom.mem_range (f := N.toHom)).2 ⟨y, rfl⟩) + +/-- +Characterizes `x / N.toHom y ∈ N.normSubgroup` by the equivalent condition `x ∈ N.normSubgroup`. +-/ +theorem normSubgroup_div_norm_iff (x : G) (y : H) : + x / N.toHom y ∈ N.normSubgroup ↔ x ∈ N.normSubgroup := + N.normSubgroup_div_iff_right + ((MonoidHom.mem_range (f := N.toHom)).2 ⟨y, rfl⟩) + +/-- +Characterizes `N.toHom y / x ∈ N.normSubgroup` by the equivalent condition `x ∈ N.normSubgroup`. +-/ +theorem normSubgroup_norm_div_iff (y : H) (x : G) : + N.toHom y / x ∈ N.normSubgroup ↔ x ∈ N.normSubgroup := + N.normSubgroup_div_iff_left + ((MonoidHom.mem_range (f := N.toHom)).2 ⟨y, rfl⟩) + +/-- A norm equality against a quotient can be rewritten as a right-coset +equality. -/ +theorem norm_mul_eq_of_norm_eq_div {x y : G} {z : H} + (hz : N.toHom z = x / y) : + N.toHom z * y = x := by + have h := congrArg (fun t : G => t * y) hz + simpa [div_eq_mul_inv, mul_assoc] using h + +/-- A right-coset equality can be rewritten as a norm equality against a +quotient. -/ +theorem norm_eq_div_of_norm_mul_eq {x y : G} {z : H} + (hz : N.toHom z * y = x) : + N.toHom z = x / y := by + have h := congrArg (fun t : G => t * y⁻¹) hz + simpa [div_eq_mul_inv, mul_assoc] using h + +/-- A norm equality against a left quotient can be rewritten as a left-coset +equality. -/ +theorem mul_norm_eq_of_norm_eq_inv_mul {x y : G} {z : H} + (hz : N.toHom z = y⁻¹ * x) : + y * N.toHom z = x := by + have h := congrArg (fun t : G => y * t) hz + simpa [mul_assoc] using h + +/-- A left-coset equality can be rewritten as a norm equality against a left +quotient. -/ +theorem norm_eq_inv_mul_of_mul_norm_eq {x y : G} {z : H} + (hz : y * N.toHom z = x) : + N.toHom z = y⁻¹ * x := by + have h := congrArg (fun t : G => y⁻¹ * t) hz + simpa [mul_assoc] using h + +/-- Quotient membership in the norm subgroup is the same as representing the +left element as a norm times the right element. -/ +theorem div_mem_normSubgroup_iff_exists_norm_mul_eq (x y : G) : + x / y ∈ N.normSubgroup ↔ ∃ z : H, N.toHom z * y = x := by + constructor + · intro hxy + rcases (MonoidHom.mem_range (f := N.toHom)).1 hxy with ⟨z, hz⟩ + exact ⟨z, N.norm_mul_eq_of_norm_eq_div hz⟩ + · rintro ⟨z, hz⟩ + exact (MonoidHom.mem_range (f := N.toHom)).2 + ⟨z, N.norm_eq_div_of_norm_mul_eq hz⟩ + +/-- Establishes the identity `∃ z : H, N.toHom z * y = x`. -/ +theorem exists_norm_mul_eq_of_div_mem_normSubgroup + {x y : G} (hxy : x / y ∈ N.normSubgroup) : + ∃ z : H, N.toHom z * y = x := + (N.div_mem_normSubgroup_iff_exists_norm_mul_eq x y).1 hxy + +/-- Establishes the membership statement `x / y ∈ N.normSubgroup`. -/ +theorem div_mem_normSubgroup_of_exists_norm_mul_eq + {x y : G} (hxy : ∃ z : H, N.toHom z * y = x) : + x / y ∈ N.normSubgroup := + (N.div_mem_normSubgroup_iff_exists_norm_mul_eq x y).2 hxy + +/-- Left-quotient membership in the norm subgroup is the same as representing +the left element as the right element times a norm. -/ +theorem inv_mul_mem_normSubgroup_iff_exists_mul_norm_eq (x y : G) : + y⁻¹ * x ∈ N.normSubgroup ↔ ∃ z : H, y * N.toHom z = x := by + constructor + · intro hxy + rcases (MonoidHom.mem_range (f := N.toHom)).1 hxy with ⟨z, hz⟩ + exact ⟨z, N.mul_norm_eq_of_norm_eq_inv_mul hz⟩ + · rintro ⟨z, hz⟩ + exact (MonoidHom.mem_range (f := N.toHom)).2 + ⟨z, N.norm_eq_inv_mul_of_mul_norm_eq hz⟩ + +/-- Establishes the identity `∃ z : H, y * N.toHom z = x`. -/ +theorem exists_mul_norm_eq_of_inv_mul_mem_normSubgroup + {x y : G} (hxy : y⁻¹ * x ∈ N.normSubgroup) : + ∃ z : H, y * N.toHom z = x := + (N.inv_mul_mem_normSubgroup_iff_exists_mul_norm_eq x y).1 hxy + +/-- Establishes the membership statement `y⁻¹ * x ∈ N.normSubgroup`. -/ +theorem inv_mul_mem_normSubgroup_of_exists_mul_norm_eq + {x y : G} (hxy : ∃ z : H, y * N.toHom z = x) : + y⁻¹ * x ∈ N.normSubgroup := + (N.inv_mul_mem_normSubgroup_iff_exists_mul_norm_eq x y).2 hxy + +/-- Equality in the norm quotient is equivalent to a left-coset representative +equation when the norm subgroup is normal. -/ +theorem normQuotient_mk_eq_iff_exists_mul_norm_eq + [(N.normSubgroup).Normal] (x y : G) : + QuotientGroup.mk' N.normSubgroup x = + QuotientGroup.mk' N.normSubgroup y ↔ + ∃ z : H, y * N.toHom z = x := by + rw [N.normQuotient_mk_eq_iff_inv_mul_mem x y, + N.inv_mul_mem_normSubgroup_iff_exists_mul_norm_eq x y] + +/-- Equality after mapping from `G ⧸ zeroSubgroup` to the norm quotient is +equivalent to a left-coset representative equation. -/ +theorem zeroSubgroupQuotientToNormQuotient_mk_eq_iff_exists_mul_norm_eq + [(N.normSubgroup).Normal] + (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x y : G) : + N.zeroSubgroupQuotientToNormQuotient hzero + (QuotientGroup.mk' vG.zeroSubgroup x) = + N.zeroSubgroupQuotientToNormQuotient hzero + (QuotientGroup.mk' vG.zeroSubgroup y) ↔ + ∃ z : H, y * N.toHom z = x := by + rw [N.zeroSubgroupQuotientToNormQuotient_mk_eq_iff_inv_mul_mem hzero x y, + N.inv_mul_mem_normSubgroup_iff_exists_mul_norm_eq x y] + +/-- If every source element is a source-unit part times a power of `ϖ`, if the +image of the chosen source-unit subgroup is `P`, and if `ϖ` maps to `γ`, then +the norm subgroup is `P ∨ <γ>`. + +This is the group-theoretic core of finite Lubin--Tate norm-subgroup formulas, +stated without a theorem-carrying presentation structure. -/ +theorem normSubgroup_eq_sup_of_source_decomposition + (U : Subgroup H) (P : Subgroup G) (ϖ : H) (γ : G) + (hdecomp : + ∀ y : H, ∃ u : H, u ∈ U ∧ ∃ n : ℤ, y = u * ϖ ^ n) + (hU : Subgroup.map N.toHom U = P) + (hϖ : N.toHom ϖ = γ) : + N.normSubgroup = P ⊔ Subgroup.closure ({γ} : Set G) := by + apply le_antisymm + · intro x hx + rcases hx with ⟨y, rfl⟩ + rcases hdecomp y with ⟨u, hu, n, hy⟩ + have hNuP : N.toHom u ∈ P := by + have hmap : N.toHom u ∈ Subgroup.map N.toHom U := ⟨u, hu, rfl⟩ + simpa [hU] using hmap + have hγ : γ ^ n ∈ Subgroup.closure ({γ} : Set G) := + (Subgroup.closure ({γ} : Set G)).zpow_mem + (Subgroup.subset_closure (by simp)) n + rw [hy, N.toHom.map_mul, N.toHom.map_zpow, hϖ] + exact (P ⊔ Subgroup.closure ({γ} : Set G)).mul_mem + ((le_sup_left : P ≤ P ⊔ Subgroup.closure ({γ} : Set G)) hNuP) + ((le_sup_right : Subgroup.closure ({γ} : Set G) ≤ + P ⊔ Subgroup.closure ({γ} : Set G)) hγ) + · exact sup_le + (by + intro x hx + have hxmap : x ∈ Subgroup.map N.toHom U := by + simpa [hU] using hx + rcases hxmap with ⟨u, _hu, hux⟩ + exact ⟨u, hux⟩) + (by + rw [Subgroup.closure_le] + intro x hx + have hxγ : x = γ := by simpa using hx + rw [hxγ] + exact ⟨ϖ, hϖ⟩) + +/-- Normal form for an element of the norm subgroup from a source +decomposition and a prescribed image of the source-unit subgroup. -/ +theorem exists_targetSubgroup_mul_generator_zpow_of_mem_normSubgroup + (U : Subgroup H) (P : Subgroup G) (ϖ : H) (γ : G) + (hdecomp : + ∀ y : H, ∃ u : H, u ∈ U ∧ ∃ n : ℤ, y = u * ϖ ^ n) + (hU : Subgroup.map N.toHom U = P) + (hϖ : N.toHom ϖ = γ) + {x : G} (hx : x ∈ N.normSubgroup) : + ∃ p : G, p ∈ P ∧ ∃ n : ℤ, x = p * γ ^ n := by + rcases hx with ⟨y, rfl⟩ + rcases hdecomp y with ⟨u, hu, n, hy⟩ + refine ⟨N.toHom u, ?_, n, ?_⟩ + · have hmap : N.toHom u ∈ Subgroup.map N.toHom U := ⟨u, hu, rfl⟩ + simpa [hU] using hmap + · calc + N.toHom y = N.toHom (u * ϖ ^ n) := by rw [hy] + _ = N.toHom u * γ ^ n := by + rw [N.toHom.map_mul, N.toHom.map_zpow, hϖ] + +/-- A target-subgroup element times a power of the selected generator lies in +the norm subgroup when the target subgroup is the image of the chosen source +subgroup and the generator is the norm of `ϖ`. -/ +theorem mem_normSubgroup_of_targetSubgroup_mul_generator_zpow + (U : Subgroup H) (P : Subgroup G) (ϖ : H) (γ : G) + (hU : Subgroup.map N.toHom U = P) + (hϖ : N.toHom ϖ = γ) + {p x : G} (hp : p ∈ P) {n : ℤ} (hx : x = p * γ ^ n) : + x ∈ N.normSubgroup := by + have hpmap : p ∈ Subgroup.map N.toHom U := by + simpa [hU] using hp + rcases hpmap with ⟨u, _hu, hup⟩ + refine ⟨u * ϖ ^ n, ?_⟩ + calc + N.toHom (u * ϖ ^ n) = N.toHom u * N.toHom (ϖ ^ n) := by + rw [N.toHom.map_mul] + _ = p * γ ^ n := by rw [N.toHom.map_zpow, hϖ, hup] + _ = x := hx.symm + +/-- Elementwise normal-form characterization of the norm subgroup from source +unit decomposition data. -/ +theorem mem_normSubgroup_iff_exists_targetSubgroup_mul_generator_zpow + (U : Subgroup H) (P : Subgroup G) (ϖ : H) (γ : G) + (hdecomp : + ∀ y : H, ∃ u : H, u ∈ U ∧ ∃ n : ℤ, y = u * ϖ ^ n) + (hU : Subgroup.map N.toHom U = P) + (hϖ : N.toHom ϖ = γ) (x : G) : + x ∈ N.normSubgroup ↔ + ∃ p : G, p ∈ P ∧ ∃ n : ℤ, x = p * γ ^ n := by + constructor + · exact N.exists_targetSubgroup_mul_generator_zpow_of_mem_normSubgroup + U P ϖ γ hdecomp hU hϖ + · rintro ⟨p, hp, n, hx⟩ + exact N.mem_normSubgroup_of_targetSubgroup_mul_generator_zpow + U P ϖ γ hU hϖ hp hx + +/-- If the target subgroup in a norm-subgroup normal form has valuation zero, +then every norm-subgroup element has valuation a multiple of the selected +generator's valuation. -/ +theorem exists_valuation_generator_multiple_of_mem_normSubgroup + (U : Subgroup H) (P : Subgroup G) (ϖ : H) (γ : G) + (hdecomp : + ∀ y : H, ∃ u : H, u ∈ U ∧ ∃ n : ℤ, y = u * ϖ ^ n) + (hU : Subgroup.map N.toHom U = P) + (hϖ : N.toHom ϖ = γ) + (hP : P ≤ vG.zeroSubgroup) + {x : G} (hx : x ∈ N.normSubgroup) : + ∃ n : ℤ, vG.val x = n * vG.val γ := by + rcases + N.exists_targetSubgroup_mul_generator_zpow_of_mem_normSubgroup + U P ϖ γ hdecomp hU hϖ hx with + ⟨p, hp, n, hxform⟩ + exact ⟨n, + vG.val_eq_generator_multiple_of_mem_subgroup_mul_zpow + P hP hp hxform⟩ + +/-- If the selected source element is a source uniformizer, the valuation of +its norm-image generator is the residue degree. -/ +theorem valuation_generator_of_source_uniformizer + {ϖ : H} {γ : G} + (hϖH : vH.IsUniformizer ϖ) (hϖ : N.toHom ϖ = γ) : + vG.val γ = (N.residueDegree : ℤ) := by + have h := N.valuation_apply ϖ + rw [hϖH, mul_one] at h + rw [← hϖ] + exact h + +/-- In a normal form `x / y = p * γ^n`, equal target valuations force the +generator exponent to be zero, provided `P` has valuation zero and `γ` has +nonzero valuation. -/ +theorem targetSubgroup_normal_form_exponent_zero_of_equal_valuation + (P : Subgroup G) (hP : P ≤ vG.zeroSubgroup) + {x y p γ : G} (hp : p ∈ P) {n : ℤ} + (hxy : x / y = p * γ ^ n) + (hvxy : vG.val x = vG.val y) + (hγ : vG.val γ ≠ 0) : + n = 0 := by + have hquot0 : vG.val (x / y) = 0 := + (vG.val_div_eq_zero_iff x y).2 hvxy + have hform : vG.val (x / y) = n * vG.val γ := + vG.val_eq_generator_multiple_of_mem_subgroup_mul_zpow + P hP hp hxy + have hn_mul : n * vG.val γ = 0 := by + rw [← hform, hquot0] + exact (mul_eq_zero.mp hn_mul).resolve_right hγ + +/-- Equal target valuations reduce norm-quotient membership to the target +subgroup part of a source-decomposition normal form. -/ +theorem targetSubgroup_quotient_of_mem_normSubgroup_of_equal_valuation + (U : Subgroup H) (P : Subgroup G) (ϖ : H) (γ : G) + (hdecomp : + ∀ y : H, ∃ u : H, u ∈ U ∧ ∃ n : ℤ, y = u * ϖ ^ n) + (hU : Subgroup.map N.toHom U = P) + (hϖ : N.toHom ϖ = γ) + (hP : P ≤ vG.zeroSubgroup) + (hγ : vG.val γ ≠ 0) + {x y : G} (hxyN : x / y ∈ N.normSubgroup) + (hvxy : vG.val x = vG.val y) : + ∃ p : G, p ∈ P ∧ x / y = p := by + rcases + (N.mem_normSubgroup_iff_exists_targetSubgroup_mul_generator_zpow + U P ϖ γ hdecomp hU hϖ (x / y)).1 hxyN with + ⟨p, hp, n, hform⟩ + have hn : n = 0 := + targetSubgroup_normal_form_exponent_zero_of_equal_valuation + P hP hp hform hvxy hγ + exact ⟨p, hp, by simpa [hn] using hform⟩ + +/-- With equal target valuations, norm-quotient membership is equivalent to +having a representative in the target subgroup part. -/ +theorem normSubgroup_quotient_iff_targetSubgroup_of_equal_valuation + (U : Subgroup H) (P : Subgroup G) (ϖ : H) (γ : G) + (hdecomp : + ∀ y : H, ∃ u : H, u ∈ U ∧ ∃ n : ℤ, y = u * ϖ ^ n) + (hU : Subgroup.map N.toHom U = P) + (hϖ : N.toHom ϖ = γ) + (hP : P ≤ vG.zeroSubgroup) + (hγ : vG.val γ ≠ 0) + {x y : G} (hvxy : vG.val x = vG.val y) : + x / y ∈ N.normSubgroup ↔ + ∃ p : G, p ∈ P ∧ x / y = p := by + constructor + · intro hxyN + exact N.targetSubgroup_quotient_of_mem_normSubgroup_of_equal_valuation + U P ϖ γ hdecomp hU hϖ hP hγ hxyN hvxy + · rintro ⟨p, hp, hxy⟩ + exact N.mem_normSubgroup_of_targetSubgroup_mul_generator_zpow + U P ϖ γ hU hϖ hp (n := 0) (by simp [hxy]) + +/-- The source-uniformizer/residue-degree version of +`targetSubgroup_quotient_of_mem_normSubgroup_of_equal_valuation`. -/ +theorem targetSubgroup_quotient_of_mem_normSubgroup_of_equal_valuation_of_source_uniformizer + (U : Subgroup H) (P : Subgroup G) (ϖ : H) (γ : G) + (hdecomp : + ∀ y : H, ∃ u : H, u ∈ U ∧ ∃ n : ℤ, y = u * ϖ ^ n) + (hU : Subgroup.map N.toHom U = P) + (hϖ : N.toHom ϖ = γ) + (hP : P ≤ vG.zeroSubgroup) + (hϖH : vH.IsUniformizer ϖ) + (hdeg : N.residueDegree ≠ 0) + {x y : G} (hxyN : x / y ∈ N.normSubgroup) + (hvxy : vG.val x = vG.val y) : + ∃ p : G, p ∈ P ∧ x / y = p := by + apply N.targetSubgroup_quotient_of_mem_normSubgroup_of_equal_valuation + U P ϖ γ hdecomp hU hϖ hP ?_ hxyN hvxy + rw [N.valuation_generator_of_source_uniformizer hϖH hϖ] + exact Int.ofNat_ne_zero.mpr hdeg + +/-- The source-uniformizer/residue-degree version of the equal-valuation +criterion for norm-quotient membership. -/ +theorem normSubgroup_quotient_iff_targetSubgroup_of_equal_valuation_of_source_uniformizer + (U : Subgroup H) (P : Subgroup G) (ϖ : H) (γ : G) + (hdecomp : + ∀ y : H, ∃ u : H, u ∈ U ∧ ∃ n : ℤ, y = u * ϖ ^ n) + (hU : Subgroup.map N.toHom U = P) + (hϖ : N.toHom ϖ = γ) + (hP : P ≤ vG.zeroSubgroup) + (hϖH : vH.IsUniformizer ϖ) + (hdeg : N.residueDegree ≠ 0) + {x y : G} (hvxy : vG.val x = vG.val y) : + x / y ∈ N.normSubgroup ↔ + ∃ p : G, p ∈ P ∧ x / y = p := by + apply N.normSubgroup_quotient_iff_targetSubgroup_of_equal_valuation + U P ϖ γ hdecomp hU hϖ hP ?_ hvxy + rw [N.valuation_generator_of_source_uniformizer hϖH hϖ] + exact Int.ofNat_ne_zero.mpr hdeg + +/-- A target-subgroup representative of a quotient has zero valuation +displacement when the target subgroup has valuation zero. -/ +theorem equal_valuation_of_targetSubgroup_quotient + (P : Subgroup G) (hP : P ≤ vG.zeroSubgroup) + {x y p : G} (hp : p ∈ P) (hxy : x / y = p) : + vG.val x = vG.val y := by + have hquot0 : vG.val (x / y) = 0 := by + rw [hxy] + exact (vG.mem_zeroSubgroup_iff p).1 (hP hp) + exact (vG.val_div_eq_zero_iff x y).1 hquot0 + +end ValuedNorm + +end DiscreteValuationField + +end + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/NormFiltration.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/NormFiltration.lean new file mode 100644 index 0000000000..491830668c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/NormFiltration.lean @@ -0,0 +1,1614 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Quotients + +/-! # Norm Filtration -/ + +@[expose] public section +namespace LocalFieldTheory + +/-! +# Norm compatibility with unit filtrations + +A compatibility hypothesis for a norm and two unit filtrations immediately +produces homomorphisms on every filtration level. +-/ + +noncomputable +section + +universe u v + +namespace DiscreteValuationField +namespace ValuedNorm + +variable {G : Type u} {H : Type v} [Group G] [Group H] +variable {vG : MultiplicativeIntegerValuation G} +variable {vH : MultiplicativeIntegerValuation H} +variable (N : ValuedNorm vG vH) +variable (UG : AntitoneSubgroupFiltration G) (UH : AntitoneSubgroupFiltration H) +variable (targetLevel : ℕ → ℕ) + +/-- A compatibility hypothesis for the norm and two filtrations. -/ +abbrev MapsFiltrationLevels : Prop := + ∀ n {x : H}, x ∈ UH.principalUnitSubgroup n → + N.toHom x ∈ UG.principalUnitSubgroup (targetLevel n) + +/-- The norm map restricted to a filtration level. -/ +def mapLevelOfMapsFiltrationLevels + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) : + UH.principalUnitSubgroup n →* UG.principalUnitSubgroup (targetLevel n) where + toFun x := ⟨N.toHom x.1, hN n x.2⟩ + map_one' := by + apply Subtype.ext + exact N.toHom.map_one + map_mul' x y := by + apply Subtype.ext + exact N.toHom.map_mul x.1 y.1 + +/-- +The defining evaluation formula for `mapLevelOfMapsFiltrationLevels` is +`(mapLevelOfMapsFiltrationLevels N UG UH targetLevel hN n x : G) = N.toHom x.1`. +-/ +@[simp] theorem mapLevelOfMapsFiltrationLevels_apply + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + (x : UH.principalUnitSubgroup n) : + (mapLevelOfMapsFiltrationLevels N UG UH targetLevel hN n x : G) = + N.toHom x.1 := + rfl + +/-- The raw membership consequence of filtration compatibility. -/ +theorem maps_principalUnitSubgroup_of_mapsFiltrationLevels + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) {x : H} + (hx : x ∈ UH.principalUnitSubgroup n) : + N.toHom x ∈ UG.principalUnitSubgroup (targetLevel n) := + hN n hx + +/-- If the norm sends `U_H^n` into `U_G^(targetLevel n)`, then it also sends +it into any coarser target level. -/ +theorem maps_principalUnitSubgroup_of_mapsFiltrationLevels_of_le + (hN : MapsFiltrationLevels N UG UH targetLevel) {n m : ℕ} + (hm : m ≤ targetLevel n) {x : H} + (hx : x ∈ UH.principalUnitSubgroup n) : + N.toHom x ∈ UG.principalUnitSubgroup m := + UG.mem_of_mem_of_le hm (hN n hx) + +/-- Filtration compatibility can be weakened by replacing the target level by +a coarser one. -/ +theorem mapsFiltrationLevels_of_le {targetLevel' : ℕ → ℕ} + (hN : MapsFiltrationLevels N UG UH targetLevel) + (hle : ∀ n, targetLevel' n ≤ targetLevel n) : + MapsFiltrationLevels N UG UH targetLevel' := by + intro n x hx + exact N.maps_principalUnitSubgroup_of_mapsFiltrationLevels_of_le + UG UH targetLevel hN (hle n) hx + +/-- Surjectivity of the norm on a filtration level, stated without subtypes. -/ +theorem mapLevelOfMapsFiltrationLevels_surjective_iff + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) : + Function.Surjective + (mapLevelOfMapsFiltrationLevels N UG UH targetLevel hN n) ↔ + ∀ y ∈ UG.principalUnitSubgroup (targetLevel n), + ∃ x ∈ UH.principalUnitSubgroup n, N.toHom x = y := by + constructor + · intro hsurj y hy + rcases hsurj ⟨y, hy⟩ with ⟨x, hx⟩ + exact ⟨x.1, x.2, by + simpa [mapLevelOfMapsFiltrationLevels_apply] using congr_arg Subtype.val hx⟩ + · intro h y + rcases h y.1 y.2 with ⟨x, hx, hxy⟩ + exact ⟨⟨x, hx⟩, Subtype.ext hxy⟩ + +/-- +Characterizes `(mapLevelOfMapsFiltrationLevels N UG UH targetLevel hN n).range = ⊤` by the +equivalent condition `∀ y ∈ UG.principalUnitSubgroup (targetLevel n), ∃ x ∈ +UH.principalUnitSubgroup n, N.toHom x = y`. +-/ +theorem mapLevelOfMapsFiltrationLevels_range_eq_top_iff + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) : + (mapLevelOfMapsFiltrationLevels N UG UH targetLevel hN n).range = ⊤ ↔ + ∀ y ∈ UG.principalUnitSubgroup (targetLevel n), + ∃ x ∈ UH.principalUnitSubgroup n, N.toHom x = y := by + rw [MonoidHom.range_eq_top, + mapLevelOfMapsFiltrationLevels_surjective_iff N UG UH targetLevel hN n] + +/-- A compatible norm descends to the quotient by a filtration level. -/ +def quotientMapOfMapsFiltrationLevels + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] : + H ⧸ UH.principalUnitSubgroup n →* + G ⧸ UG.principalUnitSubgroup (targetLevel n) := + QuotientGroup.map (UH.principalUnitSubgroup n) + (UG.principalUnitSubgroup (targetLevel n)) N.toHom (by + intro x hx + exact hN n hx) + +/-- +The defining evaluation formula for `quotientMapOfMapsFiltrationLevels` is +`quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n (QuotientGroup.mk x) = +QuotientGroup.mk (N.toHom x)`. +-/ +@[simp] theorem quotientMapOfMapsFiltrationLevels_apply_mk + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] (x : H) : + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n + (QuotientGroup.mk x) = + QuotientGroup.mk (N.toHom x) := + rfl + +/-- +Establishes the identity `quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n +(QuotientGroup.mk' (UH.principalUnitSubgroup n) x) = QuotientGroup.mk' (UG.principalUnitSubgroup +(targetLevel n)) (N.toHom x)`. +-/ +@[simp] theorem quotientMapOfMapsFiltrationLevels_apply_mk' + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] (x : H) : + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n + (QuotientGroup.mk' (UH.principalUnitSubgroup n) x) = + QuotientGroup.mk' (UG.principalUnitSubgroup (targetLevel n)) + (N.toHom x) := + rfl + +/-- The preimage of the target filtration subgroup under the valued norm. -/ +def filtrationPreimageSubgroup (n : ℕ) : Subgroup H := + (UG.principalUnitSubgroup (targetLevel n)).comap N.toHom + +/-- +Characterizes `x ∈ N.filtrationPreimageSubgroup UG targetLevel n` by the equivalent condition +`N.toHom x ∈ UG.principalUnitSubgroup (targetLevel n)`. +-/ +@[simp] theorem mem_filtrationPreimageSubgroup_iff (n : ℕ) (x : H) : + x ∈ N.filtrationPreimageSubgroup UG targetLevel n ↔ + N.toHom x ∈ UG.principalUnitSubgroup (targetLevel n) := + Iff.rfl + +/-- +Proves the bound `UH.principalUnitSubgroup n ≤ N.filtrationPreimageSubgroup UG targetLevel n`. +-/ +theorem principalUnitSubgroup_le_filtrationPreimageSubgroup + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) : + UH.principalUnitSubgroup n ≤ + N.filtrationPreimageSubgroup UG targetLevel n := by + intro x hx + exact hN n hx + +/-- The subgroup appearing in `(N.filtrationPreimageSubgroup UG targetLevel n).Normal` is normal. -/ +instance filtrationPreimageSubgroup_normal + (n : ℕ) [(UG.principalUnitSubgroup (targetLevel n)).Normal] : + (N.filtrationPreimageSubgroup UG targetLevel n).Normal := by + dsimp [filtrationPreimageSubgroup] + infer_instance + +/-- The class of the norm-preimage of the target filtration subgroup inside +the source quotient `H ⧸ U_H^n`. -/ +def filtrationPreimageClassInQuotient (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] : + Subgroup (H ⧸ UH.principalUnitSubgroup n) := + Subgroup.map (QuotientGroup.mk' (UH.principalUnitSubgroup n)) + (N.filtrationPreimageSubgroup UG targetLevel n) + +/-- +The subgroup appearing in `(N.filtrationPreimageClassInQuotient UG UH targetLevel n).Normal` is +normal. +-/ +instance filtrationPreimageClassInQuotient_normal + (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] : + (N.filtrationPreimageClassInQuotient UG UH targetLevel n).Normal := by + dsimp [filtrationPreimageClassInQuotient] + infer_instance + +/-- +Characterizes `q ∈ N.filtrationPreimageClassInQuotient UG UH targetLevel n` by the equivalent +condition `∃ x : H, x ∈ N.filtrationPreimageSubgroup UG targetLevel n ∧ QuotientGroup.mk' +(UH.principalUnitSubgroup n) x = q`. +-/ +theorem mem_filtrationPreimageClassInQuotient_iff + (n : ℕ) [(UH.principalUnitSubgroup n).Normal] + (q : H ⧸ UH.principalUnitSubgroup n) : + q ∈ N.filtrationPreimageClassInQuotient UG UH targetLevel n ↔ + ∃ x : H, x ∈ N.filtrationPreimageSubgroup UG targetLevel n ∧ + QuotientGroup.mk' (UH.principalUnitSubgroup n) x = q := + Iff.rfl + +/-- +Characterizes `q ∈ N.filtrationPreimageClassInQuotient UG UH targetLevel n` by the equivalent +condition `∃ x : H, N.toHom x ∈ UG.principalUnitSubgroup (targetLevel n) ∧ QuotientGroup.mk' +(UH.principalUnitSubgroup n) x = q`. +-/ +theorem mem_filtrationPreimageClassInQuotient_iff_exists_norm_mem + (n : ℕ) [(UH.principalUnitSubgroup n).Normal] + (q : H ⧸ UH.principalUnitSubgroup n) : + q ∈ N.filtrationPreimageClassInQuotient UG UH targetLevel n ↔ + ∃ x : H, N.toHom x ∈ UG.principalUnitSubgroup (targetLevel n) ∧ + QuotientGroup.mk' (UH.principalUnitSubgroup n) x = q := by + rw [N.mem_filtrationPreimageClassInQuotient_iff UG UH targetLevel n q] + constructor + · rintro ⟨x, hx, hxq⟩ + exact ⟨x, hx, hxq⟩ + · rintro ⟨x, hx, hxq⟩ + exact ⟨x, hx, hxq⟩ + +/-- +Establishes the membership statement `QuotientGroup.mk' (UH.principalUnitSubgroup n) x ∈ +N.filtrationPreimageClassInQuotient UG UH targetLevel n`. +-/ +theorem filtrationPreimageClassInQuotient_mk_mem + {n : ℕ} [(UH.principalUnitSubgroup n).Normal] {x : H} + (hx : x ∈ N.filtrationPreimageSubgroup UG targetLevel n) : + QuotientGroup.mk' (UH.principalUnitSubgroup n) x ∈ + N.filtrationPreimageClassInQuotient UG UH targetLevel n := + Subgroup.mem_map_of_mem + (QuotientGroup.mk' (UH.principalUnitSubgroup n)) hx + +/-- The kernel of the quotient norm map is the class of the preimage of the +target filtration subgroup in the source quotient. -/ +theorem quotientMapOfMapsFiltrationLevels_ker_eq_filtrationPreimageClass + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] : + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).ker = + N.filtrationPreimageClassInQuotient UG UH targetLevel n := by + exact QuotientGroup.ker_map (UH.principalUnitSubgroup n) + (UG.principalUnitSubgroup (targetLevel n)) N.toHom (fun _ hx => hN n hx) + +/-- +Characterizes `q ∈ (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).ker` by the +equivalent condition `q ∈ N.filtrationPreimageClassInQuotient UG UH targetLevel n`. +-/ +theorem mem_quotientMapOfMapsFiltrationLevels_ker_iff + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (q : H ⧸ UH.principalUnitSubgroup n) : + q ∈ (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).ker ↔ + q ∈ N.filtrationPreimageClassInQuotient UG UH targetLevel n := by + rw [N.quotientMapOfMapsFiltrationLevels_ker_eq_filtrationPreimageClass + UG UH targetLevel hN n] + +/-- Kernel criterion for arbitrary quotient elements under a filtration +quotient norm map. -/ +theorem quotientMapOfMapsFiltrationLevels_eq_one_iff_mem_filtrationPreimageClass + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (q : H ⧸ UH.principalUnitSubgroup n) : + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n q = 1 ↔ + q ∈ N.filtrationPreimageClassInQuotient UG UH targetLevel n := by + rw [← MonoidHom.mem_ker, + N.mem_quotientMapOfMapsFiltrationLevels_ker_iff UG UH targetLevel hN n q] + +/-- Kernel criterion for arbitrary quotient elements, expanded as a concrete +representative whose norm lies in the target filtration subgroup. -/ +theorem quotientMapOfMapsFiltrationLevels_eq_one_iff_exists_norm_mem_repr + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (q : H ⧸ UH.principalUnitSubgroup n) : + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n q = 1 ↔ + ∃ x : H, N.toHom x ∈ UG.principalUnitSubgroup (targetLevel n) ∧ + QuotientGroup.mk' (UH.principalUnitSubgroup n) x = q := by + rw [N.quotientMapOfMapsFiltrationLevels_eq_one_iff_mem_filtrationPreimageClass + UG UH targetLevel hN n q, + N.mem_filtrationPreimageClassInQuotient_iff_exists_norm_mem + UG UH targetLevel n q] + +/-- Equality criterion for arbitrary quotient elements under a filtration +quotient norm map, in right-quotient form. -/ +theorem quotientMapOfMapsFiltrationLevels_eq_iff_div_mem_filtrationPreimageClass + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (q r : H ⧸ UH.principalUnitSubgroup n) : + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n q = + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n r ↔ + q / r ∈ N.filtrationPreimageClassInQuotient UG UH targetLevel n := by + rw [← N.quotientMapOfMapsFiltrationLevels_ker_eq_filtrationPreimageClass + UG UH targetLevel hN n, + MonoidHom.mem_ker, MonoidHom.map_div, div_eq_one] + +/-- Equality criterion for arbitrary quotient elements, expanded as a concrete +representative of `q / r` whose norm lies in the target filtration subgroup. -/ +theorem quotientMapOfMapsFiltrationLevels_eq_iff_exists_norm_mem_div_repr + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (q r : H ⧸ UH.principalUnitSubgroup n) : + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n q = + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n r ↔ + ∃ x : H, N.toHom x ∈ UG.principalUnitSubgroup (targetLevel n) ∧ + QuotientGroup.mk' (UH.principalUnitSubgroup n) x = q / r := by + rw [N.quotientMapOfMapsFiltrationLevels_eq_iff_div_mem_filtrationPreimageClass + UG UH targetLevel hN n q r, + N.mem_filtrationPreimageClassInQuotient_iff_exists_norm_mem + UG UH targetLevel n (q / r)] + +/-- Equality criterion for arbitrary quotient elements under a filtration +quotient norm map, in left-quotient form. -/ +theorem quotientMapOfMapsFiltrationLevels_eq_iff_inv_mul_mem_filtrationPreimageClass + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (q r : H ⧸ UH.principalUnitSubgroup n) : + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n q = + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n r ↔ + r⁻¹ * q ∈ N.filtrationPreimageClassInQuotient UG UH targetLevel n := by + rw [N.quotientMapOfMapsFiltrationLevels_eq_iff_div_mem_filtrationPreimageClass + UG UH targetLevel hN n q r] + simpa [div_eq_mul_inv] using + ((inferInstance : + (N.filtrationPreimageClassInQuotient UG UH targetLevel n).Normal).mem_comm_iff + (a := q) (b := r⁻¹)) + +/-- Equality criterion for arbitrary quotient elements, expanded as a concrete +representative of `r⁻¹ * q` whose norm lies in the target filtration subgroup. -/ +theorem quotientMapOfMapsFiltrationLevels_eq_iff_exists_norm_mem_inv_mul_repr + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (q r : H ⧸ UH.principalUnitSubgroup n) : + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n q = + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n r ↔ + ∃ x : H, N.toHom x ∈ UG.principalUnitSubgroup (targetLevel n) ∧ + QuotientGroup.mk' (UH.principalUnitSubgroup n) x = r⁻¹ * q := by + rw [N.quotientMapOfMapsFiltrationLevels_eq_iff_inv_mul_mem_filtrationPreimageClass + UG UH targetLevel hN n q r, + N.mem_filtrationPreimageClassInQuotient_iff_exists_norm_mem + UG UH targetLevel n (r⁻¹ * q)] + +/-- +Characterizes `QuotientGroup.mk' (UH.principalUnitSubgroup n) x ∈ +N.filtrationPreimageClassInQuotient UG UH targetLevel n` by the equivalent condition `N.toHom x ∈ +UG.principalUnitSubgroup (targetLevel n)`. +-/ +theorem quotientMapOfMapsFiltrationLevels_mk_mem_filtrationPreimageClass_iff + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] (x : H) : + QuotientGroup.mk' (UH.principalUnitSubgroup n) x ∈ + N.filtrationPreimageClassInQuotient UG UH targetLevel n ↔ + N.toHom x ∈ UG.principalUnitSubgroup (targetLevel n) := by + rw [← N.quotientMapOfMapsFiltrationLevels_ker_eq_filtrationPreimageClass + UG UH targetLevel hN n] + change + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n + (QuotientGroup.mk' (UH.principalUnitSubgroup n) x) = 1 ↔ + N.toHom x ∈ UG.principalUnitSubgroup (targetLevel n) + rw [N.quotientMapOfMapsFiltrationLevels_apply_mk' UG UH targetLevel hN n x] + simp + +/-- Injectivity of the filtration quotient norm map is equivalent to the +filtration-preimage kernel class being trivial. -/ +theorem quotientMapOfMapsFiltrationLevels_injective_iff_filtrationPreimageClass_eq_bot + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] : + Function.Injective + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n) ↔ + N.filtrationPreimageClassInQuotient UG UH targetLevel n = ⊥ := by + rw [← N.quotientMapOfMapsFiltrationLevels_ker_eq_filtrationPreimageClass + UG UH targetLevel hN n] + exact (MonoidHom.ker_eq_bot_iff + (f := quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n)).symm + +/-- Concrete representative criterion for injectivity of the filtration +quotient norm map. An element whose norm lands in the target filtration must +already be trivial modulo the source filtration. -/ +theorem quotientMapOfMapsFiltrationLevels_injective_iff_forall_norm_mem + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] : + Function.Injective + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n) ↔ + ∀ x : H, N.toHom x ∈ UG.principalUnitSubgroup (targetLevel n) → + QuotientGroup.mk' (UH.principalUnitSubgroup n) x = 1 := by + rw [N.quotientMapOfMapsFiltrationLevels_injective_iff_filtrationPreimageClass_eq_bot + UG UH targetLevel hN n] + constructor + · intro hbot x hx + have hxmem : + QuotientGroup.mk' (UH.principalUnitSubgroup n) x ∈ + N.filtrationPreimageClassInQuotient UG UH targetLevel n := by + exact (N.quotientMapOfMapsFiltrationLevels_mk_mem_filtrationPreimageClass_iff + UG UH targetLevel hN n x).2 hx + have hxbot : + QuotientGroup.mk' (UH.principalUnitSubgroup n) x ∈ + (⊥ : Subgroup (H ⧸ UH.principalUnitSubgroup n)) := by + simpa [hbot] using hxmem + simpa [Subgroup.mem_bot] using hxbot + · intro h + apply le_antisymm + · intro q hq + rw [Subgroup.mem_bot] + rcases + (N.mem_filtrationPreimageClassInQuotient_iff_exists_norm_mem + UG UH targetLevel n q).1 hq with + ⟨x, hx, hxq⟩ + rw [← hxq] + exact h x hx + · intro q hq + rw [Subgroup.mem_bot] at hq + subst q + exact Subgroup.one_mem _ + +/-- A practical injectivity criterion for filtration quotient norm maps. -/ +theorem quotientMapOfMapsFiltrationLevels_injective_of_forall_norm_mem + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (hKer : ∀ x : H, + N.toHom x ∈ UG.principalUnitSubgroup (targetLevel n) → + QuotientGroup.mk' (UH.principalUnitSubgroup n) x = 1) : + Function.Injective + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n) := + (N.quotientMapOfMapsFiltrationLevels_injective_iff_forall_norm_mem + UG UH targetLevel hN n).2 hKer + +/-- One criterion in the double quotient by the filtration-preimage kernel +class. -/ +theorem quotientModuloFiltrationPreimageClass_mk_eq_one_iff + (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (q : H ⧸ UH.principalUnitSubgroup n) : + QuotientGroup.mk' + (N.filtrationPreimageClassInQuotient UG UH targetLevel n) q = 1 ↔ + q ∈ N.filtrationPreimageClassInQuotient UG UH targetLevel n := by + simp [QuotientGroup.mk'_apply] + +/-- +Characterizes `QuotientGroup.mk' (N.filtrationPreimageClassInQuotient UG UH targetLevel n) +(QuotientGroup.mk' (UH.principalUnitSubgroup n) x) = 1` by the equivalent condition `N.toHom x ∈ +UG.principalUnitSubgroup (targetLevel n)`. +-/ +theorem quotientModuloFiltrationPreimageClass_mk_mk_eq_one_iff + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] (x : H) : + QuotientGroup.mk' + (N.filtrationPreimageClassInQuotient UG UH targetLevel n) + (QuotientGroup.mk' (UH.principalUnitSubgroup n) x) = 1 ↔ + N.toHom x ∈ UG.principalUnitSubgroup (targetLevel n) := by + rw [N.quotientModuloFiltrationPreimageClass_mk_eq_one_iff UG UH targetLevel n, + N.quotientMapOfMapsFiltrationLevels_mk_mem_filtrationPreimageClass_iff + UG UH targetLevel hN n x] + +/-- Equality criterion in the double quotient by the filtration-preimage kernel +class. -/ +theorem quotientModuloFiltrationPreimageClass_mk_eq_iff_div_mem + (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (q r : H ⧸ UH.principalUnitSubgroup n) : + QuotientGroup.mk' + (N.filtrationPreimageClassInQuotient UG UH targetLevel n) q = + QuotientGroup.mk' + (N.filtrationPreimageClassInQuotient UG UH targetLevel n) r ↔ + q / r ∈ N.filtrationPreimageClassInQuotient UG UH targetLevel n := by + simpa [QuotientGroup.mk'_apply] using + (QuotientGroup.eq_iff_div_mem + (N := N.filtrationPreimageClassInQuotient UG UH targetLevel n) + (x := q) (y := r)) + +/-- +Characterizes `QuotientGroup.mk' (N.filtrationPreimageClassInQuotient UG UH targetLevel n) +(QuotientGroup.mk' (UH.principalUnitSubgroup n) x) = QuotientGroup.mk' +(N.filtrationPreimageClassInQuotient UG UH targetLevel n) (QuotientGroup.mk' +(UH.principalUnitSubgroup n) y)` by the equivalent condition `N.toHom (x / y) ∈ +UG.principalUnitSubgroup (targetLevel n)`. +-/ +theorem quotientModuloFiltrationPreimageClass_mk_mk_eq_iff + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] (x y : H) : + QuotientGroup.mk' + (N.filtrationPreimageClassInQuotient UG UH targetLevel n) + (QuotientGroup.mk' (UH.principalUnitSubgroup n) x) = + QuotientGroup.mk' + (N.filtrationPreimageClassInQuotient UG UH targetLevel n) + (QuotientGroup.mk' (UH.principalUnitSubgroup n) y) ↔ + N.toHom (x / y) ∈ UG.principalUnitSubgroup (targetLevel n) := by + rw [N.quotientModuloFiltrationPreimageClass_mk_eq_iff_div_mem + UG UH targetLevel n] + rw [← (QuotientGroup.mk' (UH.principalUnitSubgroup n)).map_div x y, + N.quotientMapOfMapsFiltrationLevels_mk_mem_filtrationPreimageClass_iff + UG UH targetLevel hN n (x / y)] + +/-- Left-quotient form of +`quotientModuloFiltrationPreimageClass_mk_mk_eq_iff`. -/ +theorem quotientModuloFiltrationPreimageClass_mk_mk_eq_iff_inv_mul + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] (x y : H) : + QuotientGroup.mk' + (N.filtrationPreimageClassInQuotient UG UH targetLevel n) + (QuotientGroup.mk' (UH.principalUnitSubgroup n) x) = + QuotientGroup.mk' + (N.filtrationPreimageClassInQuotient UG UH targetLevel n) + (QuotientGroup.mk' (UH.principalUnitSubgroup n) y) ↔ + N.toHom (y⁻¹ * x) ∈ UG.principalUnitSubgroup (targetLevel n) := by + rw [N.quotientModuloFiltrationPreimageClass_mk_mk_eq_iff + UG UH targetLevel hN n x y, + N.toHom.map_div, + UG.principalUnitSubgroup_div_mem_iff_inv_mul_mem (targetLevel n) + (N.toHom x) (N.toHom y)] + simp [N.toHom.map_mul, N.toHom.map_inv] + +/-- First-isomorphism form of the filtration quotient norm map, with codomain +the actual range when no surjectivity hypothesis is available. -/ +noncomputable def quotientModuloFiltrationPreimageClassEquivRange + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] : + (H ⧸ UH.principalUnitSubgroup n) ⧸ + N.filtrationPreimageClassInQuotient UG UH targetLevel n ≃* + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).range := + (QuotientGroup.quotientMulEquivOfEq + (N.quotientMapOfMapsFiltrationLevels_ker_eq_filtrationPreimageClass + UG UH targetLevel hN n).symm).trans + (QuotientGroup.quotientKerEquivRange + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n)) + +/-- +Establishes the identity `N.quotientModuloFiltrationPreimageClassEquivRange UG UH targetLevel hN n +(QuotientGroup.mk' (N.filtrationPreimageClassInQuotient UG UH targetLevel n) q) = +(quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).rangeRestrict q`. +-/ +theorem quotientModuloFiltrationPreimageClassEquivRange_mk + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (q : H ⧸ UH.principalUnitSubgroup n) : + N.quotientModuloFiltrationPreimageClassEquivRange + UG UH targetLevel hN n + (QuotientGroup.mk' + (N.filtrationPreimageClassInQuotient UG UH targetLevel n) q) = + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).rangeRestrict q := + rfl + +/-- +Establishes the identity `N.quotientModuloFiltrationPreimageClassEquivRange UG UH targetLevel hN n +(QuotientGroup.mk' (N.filtrationPreimageClassInQuotient UG UH targetLevel n) (QuotientGroup.mk' +(UH.principalUnitSubgroup n) x)) = (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN +n).rangeRestrict (QuotientGroup.mk' (UH.principalUnitSubgroup n) x)`. +-/ +theorem quotientModuloFiltrationPreimageClassEquivRange_mk_mk + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] (x : H) : + N.quotientModuloFiltrationPreimageClassEquivRange + UG UH targetLevel hN n + (QuotientGroup.mk' + (N.filtrationPreimageClassInQuotient UG UH targetLevel n) + (QuotientGroup.mk' (UH.principalUnitSubgroup n) x)) = + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).rangeRestrict + (QuotientGroup.mk' (UH.principalUnitSubgroup n) x) := + rfl + +/-- +Establishes the identity `((N.quotientModuloFiltrationPreimageClassEquivRange UG UH targetLevel hN +n (QuotientGroup.mk' (N.filtrationPreimageClassInQuotient UG UH targetLevel n) q) : +(quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).range) : G ⧸ UG.principalUnitSubgroup +(targetLevel n)) = quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n q`. +-/ +theorem coe_quotientModuloFiltrationPreimageClassEquivRange_mk + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (q : H ⧸ UH.principalUnitSubgroup n) : + ((N.quotientModuloFiltrationPreimageClassEquivRange + UG UH targetLevel hN n + (QuotientGroup.mk' + (N.filtrationPreimageClassInQuotient UG UH targetLevel n) q) : + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).range) : + G ⧸ UG.principalUnitSubgroup (targetLevel n)) = + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n q := by + rw [N.quotientModuloFiltrationPreimageClassEquivRange_mk + UG UH targetLevel hN n q] + rfl + +/-- +Establishes the identity `((N.quotientModuloFiltrationPreimageClassEquivRange UG UH targetLevel hN +n (QuotientGroup.mk' (N.filtrationPreimageClassInQuotient UG UH targetLevel n) (QuotientGroup.mk' +(UH.principalUnitSubgroup n) x)) : (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN +n).range) : G ⧸ UG.principalUnitSubgroup (targetLevel n)) = QuotientGroup.mk' +(UG.principalUnitSubgroup (targetLevel n)) (N.toHom x)`. +-/ +theorem coe_quotientModuloFiltrationPreimageClassEquivRange_mk_mk + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] (x : H) : + ((N.quotientModuloFiltrationPreimageClassEquivRange + UG UH targetLevel hN n + (QuotientGroup.mk' + (N.filtrationPreimageClassInQuotient UG UH targetLevel n) + (QuotientGroup.mk' (UH.principalUnitSubgroup n) x)) : + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).range) : + G ⧸ UG.principalUnitSubgroup (targetLevel n)) = + QuotientGroup.mk' (UG.principalUnitSubgroup (targetLevel n)) + (N.toHom x) := by + rw [N.coe_quotientModuloFiltrationPreimageClassEquivRange_mk + UG UH targetLevel hN n + (QuotientGroup.mk' (UH.principalUnitSubgroup n) x), + N.quotientMapOfMapsFiltrationLevels_apply_mk' UG UH targetLevel hN n x] + +/-- +Establishes the identity `(N.quotientModuloFiltrationPreimageClassEquivRange UG UH targetLevel hN +n).symm ((quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).rangeRestrict q) = +QuotientGroup.mk' (N.filtrationPreimageClassInQuotient UG UH targetLevel n) q`. +-/ +@[simp] theorem quotientModuloFiltrationPreimageClassEquivRange_symm_rangeRestrict + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (q : H ⧸ UH.principalUnitSubgroup n) : + (N.quotientModuloFiltrationPreimageClassEquivRange + UG UH targetLevel hN n).symm + ((quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).rangeRestrict q) = + QuotientGroup.mk' + (N.filtrationPreimageClassInQuotient UG UH targetLevel n) q := by + apply (N.quotientModuloFiltrationPreimageClassEquivRange + UG UH targetLevel hN n).injective + calc + N.quotientModuloFiltrationPreimageClassEquivRange + UG UH targetLevel hN n + ((N.quotientModuloFiltrationPreimageClassEquivRange + UG UH targetLevel hN n).symm + ((quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).rangeRestrict q)) = + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).rangeRestrict q := by + exact + (N.quotientModuloFiltrationPreimageClassEquivRange + UG UH targetLevel hN n).apply_symm_apply _ + _ = + N.quotientModuloFiltrationPreimageClassEquivRange + UG UH targetLevel hN n + (QuotientGroup.mk' + (N.filtrationPreimageClassInQuotient UG UH targetLevel n) q) := by + rw [N.quotientModuloFiltrationPreimageClassEquivRange_mk + UG UH targetLevel hN n q] + +/-- +Establishes the identity `(N.quotientModuloFiltrationPreimageClassEquivRange UG UH targetLevel hN +n).symm ((quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).rangeRestrict +(QuotientGroup.mk' (UH.principalUnitSubgroup n) x)) = QuotientGroup.mk' +(N.filtrationPreimageClassInQuotient UG UH targetLevel n) (QuotientGroup.mk' +(UH.principalUnitSubgroup n) x)`. +-/ +theorem quotientModuloFiltrationPreimageClassEquivRange_symm_rangeRestrict_mk + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] (x : H) : + (N.quotientModuloFiltrationPreimageClassEquivRange + UG UH targetLevel hN n).symm + ((quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).rangeRestrict + (QuotientGroup.mk' (UH.principalUnitSubgroup n) x)) = + QuotientGroup.mk' + (N.filtrationPreimageClassInQuotient UG UH targetLevel n) + (QuotientGroup.mk' (UH.principalUnitSubgroup n) x) := by + rw [N.quotientModuloFiltrationPreimageClassEquivRange_symm_rangeRestrict + UG UH targetLevel hN n] + +/-- First-isomorphism form of a surjective filtration quotient norm map. -/ +noncomputable def quotientModuloFiltrationPreimageClassEquivTargetOfSurjective + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (hSurj : Function.Surjective + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n)) : + (H ⧸ UH.principalUnitSubgroup n) ⧸ + N.filtrationPreimageClassInQuotient UG UH targetLevel n ≃* + G ⧸ UG.principalUnitSubgroup (targetLevel n) := + (QuotientGroup.quotientMulEquivOfEq + (N.quotientMapOfMapsFiltrationLevels_ker_eq_filtrationPreimageClass + UG UH targetLevel hN n).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (φ := quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n) hSurj) + +/-- +Establishes the identity `N.quotientModuloFiltrationPreimageClassEquivTargetOfSurjective UG UH +targetLevel hN n hSurj (QuotientGroup.mk' (N.filtrationPreimageClassInQuotient UG UH targetLevel +n) q) = quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n q`. +-/ +theorem quotientModuloFiltrationPreimageClassEquivTargetOfSurjective_mk + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (hSurj : Function.Surjective + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n)) + (q : H ⧸ UH.principalUnitSubgroup n) : + N.quotientModuloFiltrationPreimageClassEquivTargetOfSurjective + UG UH targetLevel hN n hSurj + (QuotientGroup.mk' + (N.filtrationPreimageClassInQuotient UG UH targetLevel n) q) = + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n q := by + change QuotientGroup.kerLift + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n) + ((QuotientGroup.quotientMulEquivOfEq + (N.quotientMapOfMapsFiltrationLevels_ker_eq_filtrationPreimageClass + UG UH targetLevel hN n).symm) (QuotientGroup.mk q)) = + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n q + rw [QuotientGroup.quotientMulEquivOfEq_mk] + exact QuotientGroup.kerLift_mk + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n) q + +/-- +Establishes the identity `N.quotientModuloFiltrationPreimageClassEquivTargetOfSurjective UG UH +targetLevel hN n hSurj (QuotientGroup.mk' (N.filtrationPreimageClassInQuotient UG UH targetLevel +n) (QuotientGroup.mk' (UH.principalUnitSubgroup n) x)) = QuotientGroup.mk' +(UG.principalUnitSubgroup (targetLevel n)) (N.toHom x)`. +-/ +theorem quotientModuloFiltrationPreimageClassEquivTargetOfSurjective_mk_mk + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (hSurj : Function.Surjective + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n)) (x : H) : + N.quotientModuloFiltrationPreimageClassEquivTargetOfSurjective + UG UH targetLevel hN n hSurj + (QuotientGroup.mk' + (N.filtrationPreimageClassInQuotient UG UH targetLevel n) + (QuotientGroup.mk' (UH.principalUnitSubgroup n) x)) = + QuotientGroup.mk' (UG.principalUnitSubgroup (targetLevel n)) + (N.toHom x) := by + rw [N.quotientModuloFiltrationPreimageClassEquivTargetOfSurjective_mk + UG UH targetLevel hN n hSurj, + N.quotientMapOfMapsFiltrationLevels_apply_mk' UG UH targetLevel hN n x] + +/-- Under quotient-level surjectivity, the target-valued first-isomorphism +equivalence is the range-valued equivalence followed by the range inclusion. -/ +theorem coe_quotientModuloFiltrationPreimageClassEquivRange_eq_targetOfSurjective + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (hSurj : Function.Surjective + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n)) + (z : (H ⧸ UH.principalUnitSubgroup n) ⧸ + N.filtrationPreimageClassInQuotient UG UH targetLevel n) : + ((N.quotientModuloFiltrationPreimageClassEquivRange + UG UH targetLevel hN n z : + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).range) : + G ⧸ UG.principalUnitSubgroup (targetLevel n)) = + N.quotientModuloFiltrationPreimageClassEquivTargetOfSurjective + UG UH targetLevel hN n hSurj z := by + refine QuotientGroup.induction_on z ?_ + intro q + change + ((N.quotientModuloFiltrationPreimageClassEquivRange + UG UH targetLevel hN n + (QuotientGroup.mk' + (N.filtrationPreimageClassInQuotient UG UH targetLevel n) q) : + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).range) : + G ⧸ UG.principalUnitSubgroup (targetLevel n)) = + N.quotientModuloFiltrationPreimageClassEquivTargetOfSurjective + UG UH targetLevel hN n hSurj + (QuotientGroup.mk' + (N.filtrationPreimageClassInQuotient UG UH targetLevel n) q) + rw [N.coe_quotientModuloFiltrationPreimageClassEquivRange_mk + UG UH targetLevel hN n q, + N.quotientModuloFiltrationPreimageClassEquivTargetOfSurjective_mk + UG UH targetLevel hN n hSurj q] + +/-- +Establishes the identity `(N.quotientModuloFiltrationPreimageClassEquivTargetOfSurjective UG UH +targetLevel hN n hSurj).symm (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n q) = +QuotientGroup.mk' (N.filtrationPreimageClassInQuotient UG UH targetLevel n) q`. +-/ +@[simp] theorem quotientModuloFiltrationPreimageClassEquivTargetOfSurjective_symm_map + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (hSurj : Function.Surjective + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n)) + (q : H ⧸ UH.principalUnitSubgroup n) : + (N.quotientModuloFiltrationPreimageClassEquivTargetOfSurjective + UG UH targetLevel hN n hSurj).symm + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n q) = + QuotientGroup.mk' + (N.filtrationPreimageClassInQuotient UG UH targetLevel n) q := by + apply (N.quotientModuloFiltrationPreimageClassEquivTargetOfSurjective + UG UH targetLevel hN n hSurj).injective + calc + N.quotientModuloFiltrationPreimageClassEquivTargetOfSurjective + UG UH targetLevel hN n hSurj + ((N.quotientModuloFiltrationPreimageClassEquivTargetOfSurjective + UG UH targetLevel hN n hSurj).symm + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n q)) = + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n q := by + exact + (N.quotientModuloFiltrationPreimageClassEquivTargetOfSurjective + UG UH targetLevel hN n hSurj).apply_symm_apply _ + _ = + N.quotientModuloFiltrationPreimageClassEquivTargetOfSurjective + UG UH targetLevel hN n hSurj + (QuotientGroup.mk' + (N.filtrationPreimageClassInQuotient UG UH targetLevel n) q) := by + rw [N.quotientModuloFiltrationPreimageClassEquivTargetOfSurjective_mk + UG UH targetLevel hN n hSurj q] + +/-- +Establishes the identity `(N.quotientModuloFiltrationPreimageClassEquivTargetOfSurjective UG UH +targetLevel hN n hSurj).symm (QuotientGroup.mk' (UG.principalUnitSubgroup (targetLevel n)) +(N.toHom x)) = QuotientGroup.mk' (N.filtrationPreimageClassInQuotient UG UH targetLevel n) +(QuotientGroup.mk' (UH.principalUnitSubgroup n) x)`. +-/ +theorem quotientModuloFiltrationPreimageClassEquivTargetOfSurjective_symm_mk + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (hSurj : Function.Surjective + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n)) (x : H) : + (N.quotientModuloFiltrationPreimageClassEquivTargetOfSurjective + UG UH targetLevel hN n hSurj).symm + (QuotientGroup.mk' (UG.principalUnitSubgroup (targetLevel n)) + (N.toHom x)) = + QuotientGroup.mk' + (N.filtrationPreimageClassInQuotient UG UH targetLevel n) + (QuotientGroup.mk' (UH.principalUnitSubgroup n) x) := by + rw [← N.quotientMapOfMapsFiltrationLevels_apply_mk' + UG UH targetLevel hN n x, + N.quotientModuloFiltrationPreimageClassEquivTargetOfSurjective_symm_map + UG UH targetLevel hN n hSurj] + +/-- Kernel criterion for the quotient map induced by filtration-compatible +norms. -/ +theorem quotientMapOfMapsFiltrationLevels_mk_eq_one_iff + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] (x : H) : + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n + (QuotientGroup.mk x) = 1 ↔ + N.toHom x ∈ UG.principalUnitSubgroup (targetLevel n) := by + rw [quotientMapOfMapsFiltrationLevels_apply_mk] + simp + +/-- Equality criterion for the quotient map induced by filtration-compatible +norms. -/ +theorem quotientMapOfMapsFiltrationLevels_mk_eq_iff + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] (x y : H) : + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n + (QuotientGroup.mk x) = + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n + (QuotientGroup.mk y) ↔ + N.toHom (x / y) ∈ UG.principalUnitSubgroup (targetLevel n) := by + rw [quotientMapOfMapsFiltrationLevels_apply_mk, + quotientMapOfMapsFiltrationLevels_apply_mk] + simpa [N.toHom.map_div] using + (QuotientGroup.eq_iff_div_mem + (N := UG.principalUnitSubgroup (targetLevel n)) + (x := N.toHom x) (y := N.toHom y)) + +/-- Left-quotient equality criterion for the quotient map induced by +filtration-compatible norms. -/ +theorem quotientMapOfMapsFiltrationLevels_mk_eq_iff_inv_mul + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] (x y : H) : + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n + (QuotientGroup.mk x) = + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n + (QuotientGroup.mk y) ↔ + N.toHom (y⁻¹ * x) ∈ UG.principalUnitSubgroup (targetLevel n) := by + rw [quotientMapOfMapsFiltrationLevels_mk_eq_iff N UG UH targetLevel hN n x y, + N.toHom.map_div, + UG.principalUnitSubgroup_div_mem_iff_inv_mul_mem (targetLevel n) + (N.toHom x) (N.toHom y)] + simp [N.toHom.map_mul, N.toHom.map_inv] + +/-- Quotient-level surjectivity is equivalent to lifting every target element +up to the target filtration subgroup. -/ +theorem quotientMapOfMapsFiltrationLevels_surjective_iff_exists_div_mem + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] : + Function.Surjective + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n) ↔ + ∀ g : G, ∃ x : H, + N.toHom x / g ∈ UG.principalUnitSubgroup (targetLevel n) := by + constructor + · intro hsurj g + rcases hsurj (QuotientGroup.mk g) with ⟨q, hq⟩ + revert hq + refine QuotientGroup.induction_on q ?_ + intro x hq + rw [quotientMapOfMapsFiltrationLevels_apply_mk] at hq + exact ⟨x, + (QuotientGroup.eq_iff_div_mem + (N := UG.principalUnitSubgroup (targetLevel n)) + (x := N.toHom x) (y := g)).1 hq⟩ + · intro h gq + refine QuotientGroup.induction_on gq ?_ + intro g + rcases h g with ⟨x, hx⟩ + refine ⟨QuotientGroup.mk x, ?_⟩ + rw [quotientMapOfMapsFiltrationLevels_apply_mk] + exact + (QuotientGroup.eq_iff_div_mem + (N := UG.principalUnitSubgroup (targetLevel n)) + (x := N.toHom x) (y := g)).2 hx + +/-- A practical quotient-surjectivity criterion: it is enough to lift every +target element modulo the target filtration subgroup. -/ +theorem quotientMapOfMapsFiltrationLevels_surjective_of_exists_div_mem + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (hLift : ∀ g : G, ∃ x : H, + N.toHom x / g ∈ UG.principalUnitSubgroup (targetLevel n)) : + Function.Surjective + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n) := + (N.quotientMapOfMapsFiltrationLevels_surjective_iff_exists_div_mem + UG UH targetLevel hN n).2 hLift + +/-- Quotient-map range is top exactly when every target element is a norm +modulo the target filtration subgroup. -/ +theorem quotientMapOfMapsFiltrationLevels_range_eq_top_iff_exists_div_mem + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] : + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).range = ⊤ ↔ + ∀ g : G, ∃ x : H, + N.toHom x / g ∈ UG.principalUnitSubgroup (targetLevel n) := by + rw [MonoidHom.range_eq_top, + N.quotientMapOfMapsFiltrationLevels_surjective_iff_exists_div_mem + UG UH targetLevel hN n] + +/-- Left-quotient form of quotient-level surjectivity. -/ +theorem quotientMapOfMapsFiltrationLevels_surjective_iff_exists_inv_mul_mem + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] : + Function.Surjective + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n) ↔ + ∀ g : G, ∃ x : H, + g⁻¹ * N.toHom x ∈ UG.principalUnitSubgroup (targetLevel n) := by + rw [N.quotientMapOfMapsFiltrationLevels_surjective_iff_exists_div_mem + UG UH targetLevel hN n] + constructor + · intro h g + rcases h g with ⟨x, hx⟩ + exact ⟨x, + (UG.principalUnitSubgroup_div_mem_iff_inv_mul_mem (targetLevel n) + (N.toHom x) g).1 hx⟩ + · intro h g + rcases h g with ⟨x, hx⟩ + exact ⟨x, + (UG.principalUnitSubgroup_inv_mul_mem_iff_div_mem (targetLevel n) + (N.toHom x) g).1 hx⟩ + +/-- A practical left-quotient criterion for quotient-level surjectivity. -/ +theorem quotientMapOfMapsFiltrationLevels_surjective_of_exists_inv_mul_mem + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (hLift : ∀ g : G, ∃ x : H, + g⁻¹ * N.toHom x ∈ UG.principalUnitSubgroup (targetLevel n)) : + Function.Surjective + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n) := + (N.quotientMapOfMapsFiltrationLevels_surjective_iff_exists_inv_mul_mem + UG UH targetLevel hN n).2 hLift + +/-- Coarsening the target filtration level commutes with the induced quotient +norm map. -/ +theorem quotientMapOfMapsFiltrationLevels_comp_targetLevelChange + {targetLevel' : ℕ → ℕ} + (hN : MapsFiltrationLevels N UG UH targetLevel) + (hle : ∀ n, targetLevel' n ≤ targetLevel n) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + [(UG.principalUnitSubgroup (targetLevel' n)).Normal] : + (UG.quotientPrincipalUnitSubgroupMapOfLe (hle n)).comp + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n) = + quotientMapOfMapsFiltrationLevels N UG UH targetLevel' + (N.mapsFiltrationLevels_of_le UG UH targetLevel hN hle) n := by + apply MonoidHom.ext + intro q + refine QuotientGroup.induction_on q ?_ + intro x + simp [quotientMapOfMapsFiltrationLevels_apply_mk] + +/-- The quotient norm maps are natural in the source and target filtration +levels. -/ +theorem quotientMapOfMapsFiltrationLevels_sourceLevelChange + (hN : MapsFiltrationLevels N UG UH targetLevel) {m n : ℕ} + (hmn : m ≤ n) (htarget : targetLevel m ≤ targetLevel n) + [(UH.principalUnitSubgroup n).Normal] + [(UH.principalUnitSubgroup m).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + [(UG.principalUnitSubgroup (targetLevel m)).Normal] : + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN m).comp + (UH.quotientPrincipalUnitSubgroupMapOfLe hmn) = + (UG.quotientPrincipalUnitSubgroupMapOfLe htarget).comp + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n) := by + apply MonoidHom.ext + intro q + refine QuotientGroup.induction_on q ?_ + intro x + simp [quotientMapOfMapsFiltrationLevels_apply_mk] + +/-- Surjectivity of a quotient norm map descends when the target filtration +level is coarsened. -/ +theorem quotientMapOfMapsFiltrationLevels_surjective_of_targetLevelChange + {targetLevel' : ℕ → ℕ} + (hN : MapsFiltrationLevels N UG UH targetLevel) + (hle : ∀ n, targetLevel' n ≤ targetLevel n) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + [(UG.principalUnitSubgroup (targetLevel' n)).Normal] + (hSurj : Function.Surjective + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n)) : + Function.Surjective + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel' + (N.mapsFiltrationLevels_of_le UG UH targetLevel hN hle) n) := by + intro z + rcases UG.quotient_principalUnitSubgroup_mapOfLe_surjective (hle n) z with + ⟨y, hy⟩ + rcases hSurj y with ⟨x, hx⟩ + refine ⟨x, ?_⟩ + rw [← N.quotientMapOfMapsFiltrationLevels_comp_targetLevelChange + UG UH targetLevel hN hle n] + simp [MonoidHom.comp_apply, hx, hy] + +/-- Range-top form of +`quotientMapOfMapsFiltrationLevels_surjective_of_targetLevelChange`. -/ +theorem quotientMapOfMapsFiltrationLevels_range_eq_top_of_targetLevelChange + {targetLevel' : ℕ → ℕ} + (hN : MapsFiltrationLevels N UG UH targetLevel) + (hle : ∀ n, targetLevel' n ≤ targetLevel n) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + [(UG.principalUnitSubgroup (targetLevel' n)).Normal] + (hRange : + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).range = + ⊤) : + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel' + (N.mapsFiltrationLevels_of_le UG UH targetLevel hN hle) n).range = + ⊤ := by + rw [MonoidHom.range_eq_top] at hRange ⊢ + exact N.quotientMapOfMapsFiltrationLevels_surjective_of_targetLevelChange + UG UH targetLevel hN hle n hRange + +/-- Surjectivity of quotient norm maps descends along compatible source and +target filtration level changes. -/ +theorem quotientMapOfMapsFiltrationLevels_surjective_of_sourceLevelChange + (hN : MapsFiltrationLevels N UG UH targetLevel) {m n : ℕ} + (hmn : m ≤ n) (htarget : targetLevel m ≤ targetLevel n) + [(UH.principalUnitSubgroup n).Normal] + [(UH.principalUnitSubgroup m).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + [(UG.principalUnitSubgroup (targetLevel m)).Normal] + (hSurj : Function.Surjective + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n)) : + Function.Surjective + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN m) := by + intro z + rcases UG.quotient_principalUnitSubgroup_mapOfLe_surjective htarget z with + ⟨y, hy⟩ + rcases hSurj y with ⟨x, hx⟩ + refine ⟨UH.quotientPrincipalUnitSubgroupMapOfLe hmn x, ?_⟩ + change + ((quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN m).comp + (UH.quotientPrincipalUnitSubgroupMapOfLe hmn)) x = z + rw [N.quotientMapOfMapsFiltrationLevels_sourceLevelChange + UG UH targetLevel hN hmn htarget] + simp [MonoidHom.comp_apply, hx, hy] + +/-- A filtration-compatible norm induces maps on principal-unit subquotients: +`U_H^m/U_H^n → U_G^(targetLevel m)/U_G^(targetLevel n)`. -/ +def principalUnitSubquotientMapOfMapsFiltrationLevels + (hN : MapsFiltrationLevels N UG UH targetLevel) {m n : ℕ} + (_hmn : m ≤ n) (_htarget : targetLevel m ≤ targetLevel n) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] : + UH.principalUnitSubquotient m n →* + UG.principalUnitSubquotient (targetLevel m) (targetLevel n) := + UH.principalUnitSubquotientLift m n + ((UG.principalUnitSubquotientMk (targetLevel m) (targetLevel n)).comp + (mapLevelOfMapsFiltrationLevels N UG UH targetLevel hN m)) + (by + intro x hx + change UG.principalUnitSubquotientMk (targetLevel m) (targetLevel n) + (mapLevelOfMapsFiltrationLevels N UG UH targetLevel hN m x) = 1 + rw [UG.principalUnitSubquotient_mk_eq_one_iff] + exact hN n hx) + +/-- +The defining evaluation formula for `principalUnitSubquotientMapOfMapsFiltrationLevels` is +`N.principalUnitSubquotientMapOfMapsFiltrationLevels UG UH targetLevel hN hmn htarget +(UH.principalUnitSubquotientMk m n x) = UG.principalUnitSubquotientMk (targetLevel m) (targetLevel +n) (mapLevelOfMapsFiltrationLevels N UG UH targetLevel hN m x)`. +-/ +@[simp] theorem principalUnitSubquotientMapOfMapsFiltrationLevels_apply_mk + (hN : MapsFiltrationLevels N UG UH targetLevel) {m n : ℕ} + (hmn : m ≤ n) (htarget : targetLevel m ≤ targetLevel n) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (x : UH.principalUnitSubgroup m) : + N.principalUnitSubquotientMapOfMapsFiltrationLevels + UG UH targetLevel hN hmn htarget + (UH.principalUnitSubquotientMk m n x) = + UG.principalUnitSubquotientMk (targetLevel m) (targetLevel n) + (mapLevelOfMapsFiltrationLevels N UG UH targetLevel hN m x) := + rfl + +/-- The subquotient norm map agrees with the ambient quotient norm map under +the canonical embeddings of subquotients as classes in ambient quotients. -/ +@[simp] theorem coe_principalUnitSubquotientEquivClassInQuotient_map + (hN : MapsFiltrationLevels N UG UH targetLevel) {m n : ℕ} + (hmn : m ≤ n) (htarget : targetLevel m ≤ targetLevel n) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (z : UH.principalUnitSubquotient m n) : + ((UG.principalUnitSubquotientEquivClassInQuotientOfLe htarget + (N.principalUnitSubquotientMapOfMapsFiltrationLevels + UG UH targetLevel hN hmn htarget z) : + UG.principalUnitSubgroupClassInQuotient (targetLevel m) + (targetLevel n)) : + G ⧸ UG.principalUnitSubgroup (targetLevel n)) = + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n + ((UH.principalUnitSubquotientEquivClassInQuotientOfLe hmn z : + UH.principalUnitSubgroupClassInQuotient m n) : + H ⧸ UH.principalUnitSubgroup n) := by + refine + AntitoneSubgroupFiltration.principalUnitSubquotient.inductionOn + UH m n + (motive := fun z' ↦ + ((UG.principalUnitSubquotientEquivClassInQuotientOfLe htarget + (N.principalUnitSubquotientMapOfMapsFiltrationLevels + UG UH targetLevel hN hmn htarget z') : + UG.principalUnitSubgroupClassInQuotient (targetLevel m) + (targetLevel n)) : + G ⧸ UG.principalUnitSubgroup (targetLevel n)) = + quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n + ((UH.principalUnitSubquotientEquivClassInQuotientOfLe hmn z' : + UH.principalUnitSubgroupClassInQuotient m n) : + H ⧸ UH.principalUnitSubgroup n)) z ?_ + intro x + simp + +/-- The graded-piece form of +`principalUnitSubquotientMapOfMapsFiltrationLevels`. -/ +def principalUnitGradedPieceMapOfMapsFiltrationLevels + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + (htarget : targetLevel n ≤ targetLevel (n + 1)) + [(UH.principalUnitSubgroup (n + 1)).Normal] + [(UG.principalUnitSubgroup (targetLevel (n + 1))).Normal] : + UH.principalUnitGradedPiece n →* + UG.principalUnitSubquotient (targetLevel n) (targetLevel (n + 1)) := + (N.principalUnitSubquotientMapOfMapsFiltrationLevels + UG UH targetLevel hN (Nat.le_succ n) htarget).comp + (UH.principalUnitGradedPieceEquivSubquotient n).toMonoidHom + +/-- +The defining evaluation formula for `principalUnitGradedPieceMapOfMapsFiltrationLevels` is +`N.principalUnitGradedPieceMapOfMapsFiltrationLevels UG UH targetLevel hN n htarget +(UH.principalUnitGradedPieceMk n x) = UG.principalUnitSubquotientMk (targetLevel n) (targetLevel +(n + 1)) (mapLevelOfMapsFiltrationLevels N UG UH targetLevel hN n x)`. +-/ +@[simp] theorem principalUnitGradedPieceMapOfMapsFiltrationLevels_apply_mk + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + (htarget : targetLevel n ≤ targetLevel (n + 1)) + [(UH.principalUnitSubgroup (n + 1)).Normal] + [(UG.principalUnitSubgroup (targetLevel (n + 1))).Normal] + (x : UH.principalUnitSubgroup n) : + N.principalUnitGradedPieceMapOfMapsFiltrationLevels + UG UH targetLevel hN n htarget + (UH.principalUnitGradedPieceMk n x) = + UG.principalUnitSubquotientMk (targetLevel n) (targetLevel (n + 1)) + (mapLevelOfMapsFiltrationLevels N UG UH targetLevel hN n x) := + rfl + +/-- Kernel criterion on representatives for the principal-unit subquotient +map induced by a filtration-compatible norm. -/ +theorem principalUnitSubquotientMapOfMapsFiltrationLevels_mk_eq_one_iff + (hN : MapsFiltrationLevels N UG UH targetLevel) {m n : ℕ} + (hmn : m ≤ n) (htarget : targetLevel m ≤ targetLevel n) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (x : UH.principalUnitSubgroup m) : + N.principalUnitSubquotientMapOfMapsFiltrationLevels + UG UH targetLevel hN hmn htarget + (UH.principalUnitSubquotientMk m n x) = 1 ↔ + N.toHom (x : H) ∈ UG.principalUnitSubgroup (targetLevel n) := by + rw [N.principalUnitSubquotientMapOfMapsFiltrationLevels_apply_mk + UG UH targetLevel hN hmn htarget x] + simpa [mapLevelOfMapsFiltrationLevels_apply] using + UG.principalUnitSubquotient_mk_eq_one_iff + (mapLevelOfMapsFiltrationLevels N UG UH targetLevel hN m x) + +/-- Equality criterion on representatives for the principal-unit subquotient +map induced by a filtration-compatible norm, in right-quotient form. -/ +theorem principalUnitSubquotientMapOfMapsFiltrationLevels_mk_eq_iff_div_mem + (hN : MapsFiltrationLevels N UG UH targetLevel) {m n : ℕ} + (hmn : m ≤ n) (htarget : targetLevel m ≤ targetLevel n) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (x y : UH.principalUnitSubgroup m) : + N.principalUnitSubquotientMapOfMapsFiltrationLevels + UG UH targetLevel hN hmn htarget + (UH.principalUnitSubquotientMk m n x) = + N.principalUnitSubquotientMapOfMapsFiltrationLevels + UG UH targetLevel hN hmn htarget + (UH.principalUnitSubquotientMk m n y) ↔ + N.toHom ((x / y : UH.principalUnitSubgroup m) : H) ∈ + UG.principalUnitSubgroup (targetLevel n) := by + rw [N.principalUnitSubquotientMapOfMapsFiltrationLevels_apply_mk + UG UH targetLevel hN hmn htarget x, + N.principalUnitSubquotientMapOfMapsFiltrationLevels_apply_mk + UG UH targetLevel hN hmn htarget y] + simpa [mapLevelOfMapsFiltrationLevels_apply, N.toHom.map_div] using + UG.principalUnitSubquotient_mk_eq_iff_div_mem + (mapLevelOfMapsFiltrationLevels N UG UH targetLevel hN m x) + (mapLevelOfMapsFiltrationLevels N UG UH targetLevel hN m y) + +/-- Equality criterion on representatives for the principal-unit subquotient +map induced by a filtration-compatible norm, in left-quotient form. -/ +theorem principalUnitSubquotientMapOfMapsFiltrationLevels_mk_eq_iff_inv_mul_mem + (hN : MapsFiltrationLevels N UG UH targetLevel) {m n : ℕ} + (hmn : m ≤ n) (htarget : targetLevel m ≤ targetLevel n) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (x y : UH.principalUnitSubgroup m) : + N.principalUnitSubquotientMapOfMapsFiltrationLevels + UG UH targetLevel hN hmn htarget + (UH.principalUnitSubquotientMk m n x) = + N.principalUnitSubquotientMapOfMapsFiltrationLevels + UG UH targetLevel hN hmn htarget + (UH.principalUnitSubquotientMk m n y) ↔ + N.toHom ((y⁻¹ * x : UH.principalUnitSubgroup m) : H) ∈ + UG.principalUnitSubgroup (targetLevel n) := by + rw [N.principalUnitSubquotientMapOfMapsFiltrationLevels_mk_eq_iff_div_mem + UG UH targetLevel hN hmn htarget x y] + simpa [N.toHom.map_div, N.toHom.map_mul, N.toHom.map_inv] using + UG.principalUnitSubgroup_div_mem_iff_inv_mul_mem (targetLevel n) + (N.toHom (x : H)) (N.toHom (y : H)) + +/-- Surjectivity of the principal-unit subquotient norm map is equivalent to +lifting every target representative modulo the next target level. -/ +theorem principalUnitSubquotientMapOfMapsFiltrationLevels_surjective_iff_exists_div_mem + (hN : MapsFiltrationLevels N UG UH targetLevel) {m n : ℕ} + (hmn : m ≤ n) (htarget : targetLevel m ≤ targetLevel n) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] : + Function.Surjective + (N.principalUnitSubquotientMapOfMapsFiltrationLevels + UG UH targetLevel hN hmn htarget) ↔ + ∀ y : UG.principalUnitSubgroup (targetLevel m), + ∃ x : UH.principalUnitSubgroup m, + N.toHom (x : H) / (y : G) ∈ + UG.principalUnitSubgroup (targetLevel n) := by + constructor + · intro hsurj y + rcases hsurj + (UG.principalUnitSubquotientMk (targetLevel m) (targetLevel n) y) with + ⟨z, hz⟩ + revert hz + refine + AntitoneSubgroupFiltration.principalUnitSubquotient.inductionOn + UH m n + (motive := fun z' ↦ + N.principalUnitSubquotientMapOfMapsFiltrationLevels + UG UH targetLevel hN hmn htarget z' = + UG.principalUnitSubquotientMk + (targetLevel m) (targetLevel n) y → + ∃ x : UH.principalUnitSubgroup m, + N.toHom (x : H) / (y : G) ∈ + UG.principalUnitSubgroup (targetLevel n)) z ?_ + intro x hx + rw [N.principalUnitSubquotientMapOfMapsFiltrationLevels_apply_mk + UG UH targetLevel hN hmn htarget x] at hx + exact ⟨x, by + simpa [mapLevelOfMapsFiltrationLevels_apply] using + (UG.principalUnitSubquotient_mk_eq_iff_div_mem + (mapLevelOfMapsFiltrationLevels N UG UH targetLevel hN m x) y).1 hx⟩ + · intro h q + refine + AntitoneSubgroupFiltration.principalUnitSubquotient.inductionOn + UG (targetLevel m) (targetLevel n) + (motive := fun q' ↦ + ∃ a, + N.principalUnitSubquotientMapOfMapsFiltrationLevels + UG UH targetLevel hN hmn htarget a = q') q ?_ + intro y + rcases h y with ⟨x, hx⟩ + refine ⟨UH.principalUnitSubquotientMk m n x, ?_⟩ + rw [N.principalUnitSubquotientMapOfMapsFiltrationLevels_apply_mk + UG UH targetLevel hN hmn htarget x] + exact + (UG.principalUnitSubquotient_mk_eq_iff_div_mem + (mapLevelOfMapsFiltrationLevels N UG UH targetLevel hN m x) y).2 + (by simpa [mapLevelOfMapsFiltrationLevels_apply] using hx) + +/-- A practical surjectivity criterion for principal-unit subquotient norm +maps. -/ +theorem principalUnitSubquotientMapOfMapsFiltrationLevels_surjective_of_exists_div_mem + (hN : MapsFiltrationLevels N UG UH targetLevel) {m n : ℕ} + (hmn : m ≤ n) (htarget : targetLevel m ≤ targetLevel n) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (hLift : ∀ y : UG.principalUnitSubgroup (targetLevel m), + ∃ x : UH.principalUnitSubgroup m, + N.toHom (x : H) / (y : G) ∈ + UG.principalUnitSubgroup (targetLevel n)) : + Function.Surjective + (N.principalUnitSubquotientMapOfMapsFiltrationLevels + UG UH targetLevel hN hmn htarget) := + (N.principalUnitSubquotientMapOfMapsFiltrationLevels_surjective_iff_exists_div_mem + UG UH targetLevel hN hmn htarget).2 hLift + +/-- Range-top form of the principal-unit subquotient norm map surjectivity +criterion. -/ +theorem principalUnitSubquotientMapOfMapsFiltrationLevels_range_eq_top_iff_exists_div_mem + (hN : MapsFiltrationLevels N UG UH targetLevel) {m n : ℕ} + (hmn : m ≤ n) (htarget : targetLevel m ≤ targetLevel n) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] : + (N.principalUnitSubquotientMapOfMapsFiltrationLevels + UG UH targetLevel hN hmn htarget).range = ⊤ ↔ + ∀ y : UG.principalUnitSubgroup (targetLevel m), + ∃ x : UH.principalUnitSubgroup m, + N.toHom (x : H) / (y : G) ∈ + UG.principalUnitSubgroup (targetLevel n) := by + rw [MonoidHom.range_eq_top, + N.principalUnitSubquotientMapOfMapsFiltrationLevels_surjective_iff_exists_div_mem + UG UH targetLevel hN hmn htarget] + +/-- Range-top form of +`principalUnitSubquotientMapOfMapsFiltrationLevels_surjective_of_exists_div_mem`. -/ +theorem principalUnitSubquotientMapOfMapsFiltrationLevels_range_eq_top_of_exists_div_mem + (hN : MapsFiltrationLevels N UG UH targetLevel) {m n : ℕ} + (hmn : m ≤ n) (htarget : targetLevel m ≤ targetLevel n) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (hLift : ∀ y : UG.principalUnitSubgroup (targetLevel m), + ∃ x : UH.principalUnitSubgroup m, + N.toHom (x : H) / (y : G) ∈ + UG.principalUnitSubgroup (targetLevel n)) : + (N.principalUnitSubquotientMapOfMapsFiltrationLevels + UG UH targetLevel hN hmn htarget).range = ⊤ := + (N.principalUnitSubquotientMapOfMapsFiltrationLevels_range_eq_top_iff_exists_div_mem + UG UH targetLevel hN hmn htarget).2 hLift + +/-- Left-quotient form of principal-unit subquotient norm map surjectivity. -/ +theorem principalUnitSubquotientMapOfMapsFiltrationLevels_surjective_iff_exists_inv_mul_mem + (hN : MapsFiltrationLevels N UG UH targetLevel) {m n : ℕ} + (hmn : m ≤ n) (htarget : targetLevel m ≤ targetLevel n) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] : + Function.Surjective + (N.principalUnitSubquotientMapOfMapsFiltrationLevels + UG UH targetLevel hN hmn htarget) ↔ + ∀ y : UG.principalUnitSubgroup (targetLevel m), + ∃ x : UH.principalUnitSubgroup m, + (y : G)⁻¹ * N.toHom (x : H) ∈ + UG.principalUnitSubgroup (targetLevel n) := by + rw [N.principalUnitSubquotientMapOfMapsFiltrationLevels_surjective_iff_exists_div_mem + UG UH targetLevel hN hmn htarget] + constructor + · intro h y + rcases h y with ⟨x, hx⟩ + exact ⟨x, + (UG.principalUnitSubgroup_div_mem_iff_inv_mul_mem (targetLevel n) + (N.toHom (x : H)) (y : G)).1 hx⟩ + · intro h y + rcases h y with ⟨x, hx⟩ + exact ⟨x, + (UG.principalUnitSubgroup_inv_mul_mem_iff_div_mem (targetLevel n) + (N.toHom (x : H)) (y : G)).1 hx⟩ + +/-- A practical left-quotient surjectivity criterion for principal-unit +subquotient norm maps. -/ +theorem principalUnitSubquotientMapOfMapsFiltrationLevels_surjective_of_exists_inv_mul_mem + (hN : MapsFiltrationLevels N UG UH targetLevel) {m n : ℕ} + (hmn : m ≤ n) (htarget : targetLevel m ≤ targetLevel n) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (hLift : ∀ y : UG.principalUnitSubgroup (targetLevel m), + ∃ x : UH.principalUnitSubgroup m, + (y : G)⁻¹ * N.toHom (x : H) ∈ + UG.principalUnitSubgroup (targetLevel n)) : + Function.Surjective + (N.principalUnitSubquotientMapOfMapsFiltrationLevels + UG UH targetLevel hN hmn htarget) := + (N.principalUnitSubquotientMapOfMapsFiltrationLevels_surjective_iff_exists_inv_mul_mem + UG UH targetLevel hN hmn htarget).2 hLift + +/-- Range-top left-quotient criterion for principal-unit subquotient norm maps. -/ +theorem principalUnitSubquotientMapOfMapsFiltrationLevels_range_eq_top_iff_exists_inv_mul_mem + (hN : MapsFiltrationLevels N UG UH targetLevel) {m n : ℕ} + (hmn : m ≤ n) (htarget : targetLevel m ≤ targetLevel n) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] : + (N.principalUnitSubquotientMapOfMapsFiltrationLevels + UG UH targetLevel hN hmn htarget).range = ⊤ ↔ + ∀ y : UG.principalUnitSubgroup (targetLevel m), + ∃ x : UH.principalUnitSubgroup m, + (y : G)⁻¹ * N.toHom (x : H) ∈ + UG.principalUnitSubgroup (targetLevel n) := by + rw [MonoidHom.range_eq_top, + N.principalUnitSubquotientMapOfMapsFiltrationLevels_surjective_iff_exists_inv_mul_mem + UG UH targetLevel hN hmn htarget] + +/-- Range-top form of +`principalUnitSubquotientMapOfMapsFiltrationLevels_surjective_of_exists_inv_mul_mem`. -/ +theorem principalUnitSubquotientMapOfMapsFiltrationLevels_range_eq_top_of_exists_inv_mul_mem + (hN : MapsFiltrationLevels N UG UH targetLevel) {m n : ℕ} + (hmn : m ≤ n) (htarget : targetLevel m ≤ targetLevel n) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (hLift : ∀ y : UG.principalUnitSubgroup (targetLevel m), + ∃ x : UH.principalUnitSubgroup m, + (y : G)⁻¹ * N.toHom (x : H) ∈ + UG.principalUnitSubgroup (targetLevel n)) : + (N.principalUnitSubquotientMapOfMapsFiltrationLevels + UG UH targetLevel hN hmn htarget).range = ⊤ := + (N.principalUnitSubquotientMapOfMapsFiltrationLevels_range_eq_top_iff_exists_inv_mul_mem + UG UH targetLevel hN hmn htarget).2 hLift + +/-- Kernel criterion on representatives for the graded-piece norm map. -/ +theorem principalUnitGradedPieceMapOfMapsFiltrationLevels_mk_eq_one_iff + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + (htarget : targetLevel n ≤ targetLevel (n + 1)) + [(UH.principalUnitSubgroup (n + 1)).Normal] + [(UG.principalUnitSubgroup (targetLevel (n + 1))).Normal] + (x : UH.principalUnitSubgroup n) : + N.principalUnitGradedPieceMapOfMapsFiltrationLevels + UG UH targetLevel hN n htarget + (UH.principalUnitGradedPieceMk n x) = 1 ↔ + N.toHom (x : H) ∈ UG.principalUnitSubgroup (targetLevel (n + 1)) := + N.principalUnitSubquotientMapOfMapsFiltrationLevels_mk_eq_one_iff + UG UH targetLevel hN (Nat.le_succ n) htarget x + +/-- Right-quotient equality criterion on representatives for the graded-piece +norm map. -/ +theorem principalUnitGradedPieceMapOfMapsFiltrationLevels_mk_eq_iff_div_mem + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + (htarget : targetLevel n ≤ targetLevel (n + 1)) + [(UH.principalUnitSubgroup (n + 1)).Normal] + [(UG.principalUnitSubgroup (targetLevel (n + 1))).Normal] + (x y : UH.principalUnitSubgroup n) : + N.principalUnitGradedPieceMapOfMapsFiltrationLevels + UG UH targetLevel hN n htarget + (UH.principalUnitGradedPieceMk n x) = + N.principalUnitGradedPieceMapOfMapsFiltrationLevels + UG UH targetLevel hN n htarget + (UH.principalUnitGradedPieceMk n y) ↔ + N.toHom ((x / y : UH.principalUnitSubgroup n) : H) ∈ + UG.principalUnitSubgroup (targetLevel (n + 1)) := + N.principalUnitSubquotientMapOfMapsFiltrationLevels_mk_eq_iff_div_mem + UG UH targetLevel hN (Nat.le_succ n) htarget x y + +/-- Left-quotient equality criterion on representatives for the graded-piece +norm map. -/ +theorem principalUnitGradedPieceMapOfMapsFiltrationLevels_mk_eq_iff_inv_mul_mem + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + (htarget : targetLevel n ≤ targetLevel (n + 1)) + [(UH.principalUnitSubgroup (n + 1)).Normal] + [(UG.principalUnitSubgroup (targetLevel (n + 1))).Normal] + (x y : UH.principalUnitSubgroup n) : + N.principalUnitGradedPieceMapOfMapsFiltrationLevels + UG UH targetLevel hN n htarget + (UH.principalUnitGradedPieceMk n x) = + N.principalUnitGradedPieceMapOfMapsFiltrationLevels + UG UH targetLevel hN n htarget + (UH.principalUnitGradedPieceMk n y) ↔ + N.toHom ((y⁻¹ * x : UH.principalUnitSubgroup n) : H) ∈ + UG.principalUnitSubgroup (targetLevel (n + 1)) := + N.principalUnitSubquotientMapOfMapsFiltrationLevels_mk_eq_iff_inv_mul_mem + UG UH targetLevel hN (Nat.le_succ n) htarget x y + +/-- Right-quotient surjectivity criterion for the graded-piece norm map. -/ +theorem principalUnitGradedPieceMapOfMapsFiltrationLevels_surjective_iff_exists_div_mem + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + (htarget : targetLevel n ≤ targetLevel (n + 1)) + [(UH.principalUnitSubgroup (n + 1)).Normal] + [(UG.principalUnitSubgroup (targetLevel (n + 1))).Normal] : + Function.Surjective + (N.principalUnitGradedPieceMapOfMapsFiltrationLevels + UG UH targetLevel hN n htarget) ↔ + ∀ y : UG.principalUnitSubgroup (targetLevel n), + ∃ x : UH.principalUnitSubgroup n, + N.toHom (x : H) / (y : G) ∈ + UG.principalUnitSubgroup (targetLevel (n + 1)) := + N.principalUnitSubquotientMapOfMapsFiltrationLevels_surjective_iff_exists_div_mem + UG UH targetLevel hN (Nat.le_succ n) htarget + +/-- Left-quotient surjectivity criterion for the graded-piece norm map. -/ +theorem principalUnitGradedPieceMapOfMapsFiltrationLevels_surjective_iff_exists_inv_mul_mem + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + (htarget : targetLevel n ≤ targetLevel (n + 1)) + [(UH.principalUnitSubgroup (n + 1)).Normal] + [(UG.principalUnitSubgroup (targetLevel (n + 1))).Normal] : + Function.Surjective + (N.principalUnitGradedPieceMapOfMapsFiltrationLevels + UG UH targetLevel hN n htarget) ↔ + ∀ y : UG.principalUnitSubgroup (targetLevel n), + ∃ x : UH.principalUnitSubgroup n, + (y : G)⁻¹ * N.toHom (x : H) ∈ + UG.principalUnitSubgroup (targetLevel (n + 1)) := + N.principalUnitSubquotientMapOfMapsFiltrationLevels_surjective_iff_exists_inv_mul_mem + UG UH targetLevel hN (Nat.le_succ n) htarget + +/-- Range-top right-quotient criterion for the graded-piece norm map. -/ +theorem principalUnitGradedPieceMapOfMapsFiltrationLevels_range_eq_top_iff_exists_div_mem + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + (htarget : targetLevel n ≤ targetLevel (n + 1)) + [(UH.principalUnitSubgroup (n + 1)).Normal] + [(UG.principalUnitSubgroup (targetLevel (n + 1))).Normal] : + (N.principalUnitGradedPieceMapOfMapsFiltrationLevels + UG UH targetLevel hN n htarget).range = ⊤ ↔ + ∀ y : UG.principalUnitSubgroup (targetLevel n), + ∃ x : UH.principalUnitSubgroup n, + N.toHom (x : H) / (y : G) ∈ + UG.principalUnitSubgroup (targetLevel (n + 1)) := + N.principalUnitSubquotientMapOfMapsFiltrationLevels_range_eq_top_iff_exists_div_mem + UG UH targetLevel hN (Nat.le_succ n) htarget + +/-- Range-top left-quotient criterion for the graded-piece norm map. -/ +theorem principalUnitGradedPieceMapOfMapsFiltrationLevels_range_eq_top_iff_exists_inv_mul_mem + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + (htarget : targetLevel n ≤ targetLevel (n + 1)) + [(UH.principalUnitSubgroup (n + 1)).Normal] + [(UG.principalUnitSubgroup (targetLevel (n + 1))).Normal] : + (N.principalUnitGradedPieceMapOfMapsFiltrationLevels + UG UH targetLevel hN n htarget).range = ⊤ ↔ + ∀ y : UG.principalUnitSubgroup (targetLevel n), + ∃ x : UH.principalUnitSubgroup n, + (y : G)⁻¹ * N.toHom (x : H) ∈ + UG.principalUnitSubgroup (targetLevel (n + 1)) := + N.principalUnitSubquotientMapOfMapsFiltrationLevels_range_eq_top_iff_exists_inv_mul_mem + UG UH targetLevel hN (Nat.le_succ n) htarget + +/-- Range-top form of +`quotientMapOfMapsFiltrationLevels_surjective_of_sourceLevelChange`. -/ +theorem quotientMapOfMapsFiltrationLevels_range_eq_top_of_sourceLevelChange + (hN : MapsFiltrationLevels N UG UH targetLevel) {m n : ℕ} + (hmn : m ≤ n) (htarget : targetLevel m ≤ targetLevel n) + [(UH.principalUnitSubgroup n).Normal] + [(UH.principalUnitSubgroup m).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + [(UG.principalUnitSubgroup (targetLevel m)).Normal] + (hRange : + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).range = + ⊤) : + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN m).range = + ⊤ := by + rw [MonoidHom.range_eq_top] at hRange ⊢ + exact N.quotientMapOfMapsFiltrationLevels_surjective_of_sourceLevelChange + UG UH targetLevel hN hmn htarget hRange + +/-- A surjective valued norm induces a surjective map on the quotients by any +compatible filtration level. -/ +theorem quotientMapOfMapsFiltrationLevels_surjective_of_surjective + (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) + [(UH.principalUnitSubgroup n).Normal] + [(UG.principalUnitSubgroup (targetLevel n)).Normal] + (hSurj : Function.Surjective N.toHom) : + Function.Surjective + (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n) := by + intro y + refine QuotientGroup.induction_on y ?_ + intro g + rcases hSurj g with ⟨x, rfl⟩ + exact ⟨QuotientGroup.mk x, + QuotientGroup.map_mk (UH.principalUnitSubgroup n) + (UG.principalUnitSubgroup (targetLevel n)) N.toHom (fun _ hx => hN n hx) x⟩ + +end ValuedNorm +end DiscreteValuationField + +end + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicField.lean new file mode 100644 index 0000000000..653fac3694 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicField.lean @@ -0,0 +1,395 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.Homomorphisms +public import Mathlib.NumberTheory.Padics.RingHoms +public import Mathlib.RingTheory.Polynomial.Cyclotomic.Roots +public import Mathlib.RingTheory.Valuation.Discrete.IsDiscreteValuationRing +/-! +# The concrete p-adic field `ℚ_[p]` + +This file is the first concrete example leaf for the DVF navigation library. +It deliberately uses mathlib's public p-adic objects directly in theorem +statements instead of introducing public aliases for `ℚ_[p]` or its unit group. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalFieldTheory.DiscreteValuationField +namespace Examples +namespace Qp + +open Filter +open scoped Topology +open scoped WithZero + +open ValuationTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField + +/-- The neighbourhood filter on `ℚ_[p]` induced by `Padic.mulValuation`. +This keeps statements below on the valuation topology instead of the ambient +metric topology selected by the global `ℚ_[p]` instance. -/ +noncomputable def padicMulValuationNhds + (p : ℕ) [Fact p.Prime] (x : ℚ_[p]) : Filter ℚ_[p] := + @nhds ℚ_[p] (@UniformSpace.toTopologicalSpace ℚ_[p] + (Valued.mk' (Padic.mulValuation (p := p))).toUniformSpace) x + +/-- Characterization of the named neighbourhood filter by the topology +transported from `Padic.mulValuation`. -/ +theorem padicMulValuationNhds_eq_valuedNhds + (p : ℕ) [Fact p.Prime] (x : ℚ_[p]) : + padicMulValuationNhds p x = + @nhds ℚ_[p] (@UniformSpace.toTopologicalSpace ℚ_[p] + (Valued.mk' (Padic.mulValuation (p := p))).toUniformSpace) x := + rfl + +/-- The DVR valuation on `ℚ_[p]` obtained from the discrete valuation ring +`ℤ_[p]`. This is the chosen-valuation side of the local-field structure theory, +the local-field structure classification, for the basic `p`-adic field. -/ +abbrev padicDVRValuation (p : ℕ) [Fact p.Prime] : + _root_.Valuation ℚ_[p] ℤᵐ⁰ := + (IsDiscreteValuationRing.maximalIdeal ℤ_[p]).valuation ℚ_[p] + +/-- The valuation subring of the DVR valuation on `ℚ_[p]` is the usual +`p`-adic integer ring. -/ +noncomputable def padicIntEquivValuationSubring + (p : ℕ) [Fact p.Prime] : + ℤ_[p] ≃+* (padicDVRValuation p).valuationSubring := + IsDiscreteValuationRing.equivValuationSubring (A := ℤ_[p]) (K := ℚ_[p]) + +/-- The valuation-subring equivalence is the usual inclusion into `ℚ_[p]` +after forgetting the integrality proof. -/ +@[simp] +theorem padicIntEquivValuationSubring_coe + (p : ℕ) [Fact p.Prime] (x : ℤ_[p]) : + ((padicIntEquivValuationSubring p x : + (padicDVRValuation p).valuationSubring) : ℚ_[p]) = + (x : ℚ_[p]) := + rfl + +/-- The residue field of `ℤ_[p]` is `ZMod p`. -/ +noncomputable def padicIntResidueFieldEquivZMod + (p : ℕ) [Fact p.Prime] : + IsLocalRing.ResidueField ℤ_[p] ≃+* ZMod p := + PadicInt.residueField + +/-- The residue field of `ℤ_[p]` is finite. -/ +theorem padicInt_residueField_finite + (p : ℕ) [Fact p.Prime] : + Finite (IsLocalRing.ResidueField ℤ_[p]) := + Finite.of_equiv (ZMod p) + (padicIntResidueFieldEquivZMod p).symm.toEquiv + +/-- The valuation in `(padicDVRValuation p).IsRankOneDiscrete` is rank-one and discrete. -/ +instance padicDVRValuation_isRankOneDiscrete + (p : ℕ) [Fact p.Prime] : + (padicDVRValuation p).IsRankOneDiscrete := by + dsimp [padicDVRValuation] + infer_instance + +/-- The canonical prime element has normalized value `exp (-1)` for the +chosen DVR valuation on `ℚ_[p]`. -/ +theorem padicDVRValuation_apply_p + (p : ℕ) [Fact p.Prime] : + padicDVRValuation p (p : ℚ_[p]) = + WithZero.exp (-1 : ℤ) := by + change (IsDiscreteValuationRing.maximalIdeal ℤ_[p]).valuation ℚ_[p] + (((p : ℤ_[p]) : ℚ_[p])) = WithZero.exp (-1 : ℤ) + calc + (IsDiscreteValuationRing.maximalIdeal ℤ_[p]).valuation ℚ_[p] + (((p : ℤ_[p]) : ℚ_[p])) = + (IsDiscreteValuationRing.maximalIdeal ℤ_[p]).intValuation + (p : ℤ_[p]) := by + simpa using + (IsDiscreteValuationRing.maximalIdeal ℤ_[p]).valuation_of_algebraMap + (K := ℚ_[p]) (p : ℤ_[p]) + _ = WithZero.exp (-1 : ℤ) := + IsDedekindDomain.HeightOneSpectrum.intValuation_singleton + (IsDiscreteValuationRing.maximalIdeal ℤ_[p]) + (by exact_mod_cast (Fact.out : Nat.Prime p).ne_zero) + PadicInt.maximalIdeal_eq_span_p + +/-- The canonical prime element is a uniformizer for the chosen DVR +valuation on `ℚ_[p]`. -/ +theorem padicDVRValuation_isUniformizer_p + (p : ℕ) [Fact p.Prime] : + (padicDVRValuation p).IsUniformizer (p : ℚ_[p]) := + WithZeroValuation.isUniformizer_of_valuation_eq_exp_neg_one + (padicDVRValuation p) (p : ℚ_[p]) + (padicDVRValuation_apply_p p) + +/-- The valuation subring of the DVR valuation on `ℚ_[p]` is complete for its +maximal-ideal topology. The proof transports mathlib's adic completeness of +`ℤ_[p]` across the explicit valuation-subring equivalence. -/ +theorem padicDVRValuation_isAdicComplete + (p : ℕ) [Fact p.Prime] : + IsAdicComplete + (IsLocalRing.maximalIdeal (padicDVRValuation p).valuationSubring) + (padicDVRValuation p).valuationSubring := by + let e : ℤ_[p] ≃+* (padicDVRValuation p).valuationSubring := + padicIntEquivValuationSubring p + let : Algebra ℤ_[p] (padicDVRValuation p).valuationSubring := + e.toRingHom.toAlgebra + let eLin : ℤ_[p] ≃ₗ[ℤ_[p]] (padicDVRValuation p).valuationSubring := + { toFun := e + invFun := e.symm + left_inv := e.left_inv + right_inv := e.right_inv + map_add' := e.map_add + map_smul' := by + intro r x + change e (r * x) = + (algebraMap ℤ_[p] (padicDVRValuation p).valuationSubring r) * e x + simp [RingHom.algebraMap_toAlgebra] } + have hcompleteZp : + IsAdicComplete (IsLocalRing.maximalIdeal ℤ_[p]) ℤ_[p] := + inferInstance + let : IsAdicComplete (IsLocalRing.maximalIdeal ℤ_[p]) ℤ_[p] := + hcompleteZp + have hcompleteAsZp : + IsAdicComplete + (IsLocalRing.maximalIdeal ℤ_[p]) + (padicDVRValuation p).valuationSubring := + isAdicComplete_of_linearEquiv + (M := ℤ_[p]) (N := (padicDVRValuation p).valuationSubring) + (IsLocalRing.maximalIdeal ℤ_[p]) eLin + have hcompleteMap : + IsAdicComplete + ((IsLocalRing.maximalIdeal ℤ_[p]).map + (algebraMap ℤ_[p] (padicDVRValuation p).valuationSubring)) + (padicDVRValuation p).valuationSubring := + (isAdicComplete_map_algebraMap_iff + (I := IsLocalRing.maximalIdeal ℤ_[p]) + (S := (padicDVRValuation p).valuationSubring)).2 hcompleteAsZp + have hmem (x : ℤ_[p]) : + algebraMap ℤ_[p] (padicDVRValuation p).valuationSubring x ∈ + IsLocalRing.maximalIdeal (padicDVRValuation p).valuationSubring ↔ + x ∈ IsLocalRing.maximalIdeal ℤ_[p] := by + simp only [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] + constructor + · intro hx hunit + exact hx (hunit.map (algebraMap ℤ_[p] + (padicDVRValuation p).valuationSubring)) + · intro hx hunit + apply hx + have hpre := hunit.map e.symm.toRingHom + simpa [RingHom.algebraMap_toAlgebra] using hpre + have hmapMax : + (IsLocalRing.maximalIdeal ℤ_[p]).map + (algebraMap ℤ_[p] (padicDVRValuation p).valuationSubring) = + IsLocalRing.maximalIdeal (padicDVRValuation p).valuationSubring := by + apply le_antisymm + · rw [Ideal.map_le_iff_le_comap] + intro x hx + exact (hmem x).2 hx + · intro y hy + have hx : + e.symm y ∈ IsLocalRing.maximalIdeal ℤ_[p] := by + apply (hmem (e.symm y)).1 + simpa [RingHom.algebraMap_toAlgebra] using hy + have hmap := + Ideal.mem_map_of_mem + (algebraMap ℤ_[p] (padicDVRValuation p).valuationSubring) hx + simpa [RingHom.algebraMap_toAlgebra] using hmap + simpa [hmapMax] using hcompleteMap + +/-- The standard `p`-adic valuation is complete as a discrete valuation. -/ +instance padicDVRValuation_isCompleteDiscrete + (p : ℕ) [Fact p.Prime] : + Valuation.IsCompleteDiscrete (padicDVRValuation p) where + isAdicComplete := padicDVRValuation_isAdicComplete p + +/-- The concrete complete-DVF package for the `p`-adic field `ℚ_[p]`. -/ +noncomputable def padicCompleteDVF + (p : ℕ) [Fact p.Prime] : + CompleteDVF ℚ_[p] where + ValueGroup := ℤᵐ⁰ + valuation := padicDVRValuation p + instCompleteDiscrete := inferInstance + +/-- The residue field of the complete-DVF package on `ℚ_[p]` is finite. -/ +theorem padicCompleteDVF_residueField_finite + (p : ℕ) [Fact p.Prime] : + Finite (padicCompleteDVF p).residueField := by + let e : ℤ_[p] ≃+* (padicDVRValuation p).valuationSubring := + padicIntEquivValuationSubring p + let : Finite (IsLocalRing.ResidueField ℤ_[p]) := + padicInt_residueField_finite p + have hfiniteVal : + Finite (IsLocalRing.ResidueField + (padicDVRValuation p).valuationSubring) := + Finite.of_equiv (IsLocalRing.ResidueField ℤ_[p]) + (IsLocalRing.ResidueField.mapEquiv e) + simpa [padicCompleteDVF, CompleteDVF.residueField, + CompleteDVF.valuationSubring, CompleteDVF.toDVF] using hfiniteVal + +/-- The residue field of the concrete complete-DVF package on `ℚ_[p]` has +cardinality exactly `p`. -/ +theorem padicCompleteDVF_residueField_card + (p : ℕ) [Fact p.Prime] : + Nat.card (padicCompleteDVF p).residueField = p := by + let eO : ℤ_[p] ≃+* (padicDVRValuation p).valuationSubring := + padicIntEquivValuationSubring p + let eRes : + IsLocalRing.ResidueField (padicDVRValuation p).valuationSubring ≃+* + ZMod p := + (IsLocalRing.ResidueField.mapEquiv eO).symm.trans + (padicIntResidueFieldEquivZMod p) + change + Nat.card + (IsLocalRing.ResidueField + (padicDVRValuation p).valuationSubring) = + p + calc + Nat.card + (IsLocalRing.ResidueField + (padicDVRValuation p).valuationSubring) = + Nat.card (ZMod p) := + Nat.card_congr eRes.toEquiv + _ = p := Nat.card_zmod p + +/-- The local-field structure theory, the local-field structure classification, `p`-adic +base-field direction: +`ℚ_[p]` is a local field in the chosen-complete-DVF sense used in this +formalization. -/ +noncomputable def padicLocalField + (p : ℕ) [Fact p.Prime] : + LocalField ℚ_[p] := by + let F : CompleteDVF ℚ_[p] := padicCompleteDVF p + haveI : Finite F.residueField := by + simpa [F] using padicCompleteDVF_residueField_finite p + exact { toCompleteDVF := F } + +/-- mathlib's bundled p-adic multiplicative valuation has the expected value +on nonzero natural-number denominators. -/ +theorem padic_mulValuation_natCast_of_ne_zero + (p n : ℕ) [Fact p.Prime] (hn : n ≠ 0) : + Padic.mulValuation (p := p) ((n : ℕ) : ℚ_[p]) = + WithZero.exp (-(padicValNat p n : ℤ)) := by + have hnQp : (((n : ℕ) : ℚ_[p]) ≠ 0) := + Nat.cast_ne_zero.mpr hn + simp [Padic.mulValuation, hnQp] + +/-- Successor form of the natural-number denominator valuation used in the +logarithm-series estimate. -/ +theorem padic_mulValuation_logSeries_denominator + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Padic.mulValuation (p := p) ((n + 1 : ℕ) : ℚ_[p]) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ)) := by + simpa using + padic_mulValuation_natCast_of_ne_zero + p (n + 1) (Nat.succ_ne_zero n) + +/-- Factorial-denominator form used by the exponential-series estimate. -/ +theorem padic_mulValuation_expSeries_denominator + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Padic.mulValuation (p := p) ((n.factorial : ℕ) : ℚ_[p]) = + WithZero.exp (-(padicValNat p n.factorial : ℤ)) := by + simpa using + padic_mulValuation_natCast_of_ne_zero + p n.factorial (Nat.factorial_ne_zero n) + +/-- Standard p-adic specialization of the logarithm-term convergence estimate: +if `v x < 1` for mathlib's `Padic.mulValuation`, then the unsigned +logarithm-series terms tend to zero. -/ +theorem tendsto_zero_logSeriesTermField_padic_mulValuation_of_lt_one + (p : ℕ) [Fact p.Prime] (x : ℚ_[p]) + (hvx : Padic.mulValuation (p := p) x < + (1 : WithZero (Multiplicative ℤ))) : + Tendsto + (fun n : ℕ => + MultiplicativeIntegerValuation.logSeriesTermField x + (fun n => Nat.cast_ne_zero.mpr (Nat.succ_ne_zero n)) n) + atTop (padicMulValuationNhds p (0 : ℚ_[p])) := by + rw [padicMulValuationNhds_eq_valuedNhds] + exact + MultiplicativeIntegerValuation.tendsto_zero_logSeriesTermField_ofWithZeroValuation_of_lt_one + (v := Padic.mulValuation (p := p)) (p := p) x + (fun n => Nat.cast_ne_zero.mpr (Nat.succ_ne_zero n)) + (padic_mulValuation_logSeries_denominator p) hvx + +open _root_.LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation renaming + tendsto_zero_signedLogSeriesTermField_ofWithZeroValuation_of_lt_one → + tendsto_zero_signedLogSeriesTermField_ofWithZeroValuation_of_lt_one in +/-- Signed version of +`tendsto_zero_logSeriesTermField_padic_mulValuation_of_lt_one`. -/ +theorem tendsto_zero_signedLogSeriesTermField_padic_mulValuation_of_lt_one + (p : ℕ) [Fact p.Prime] (x : ℚ_[p]) + (hvx : Padic.mulValuation (p := p) x < + (1 : WithZero (Multiplicative ℤ))) : + Tendsto + (fun n : ℕ => + MultiplicativeIntegerValuation.signedLogSeriesTermField x + (fun n => Nat.cast_ne_zero.mpr (Nat.succ_ne_zero n)) n) + atTop (padicMulValuationNhds p (0 : ℚ_[p])) := by + rw [padicMulValuationNhds_eq_valuedNhds] + exact + tendsto_zero_signedLogSeriesTermField_ofWithZeroValuation_of_lt_one + (v := Padic.mulValuation (p := p)) (p := p) x + (fun n => Nat.cast_ne_zero.mpr (Nat.succ_ne_zero n)) + (padic_mulValuation_logSeries_denominator p) hvx + +open _root_.LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation renaming + tendsto_zero_expSeriesTermField_ofWithZeroValuation_of_lt_exp_neg_one → + tendsto_zero_expSeriesTermField_ofWithZeroValuation_of_lt_exp_neg_one in +/-- Standard p-adic specialization of the exponential-term convergence +estimate on the radius `v x < exp (-1)`. -/ +theorem tendsto_zero_expSeriesTermField_padic_mulValuation_of_lt_exp_neg_one + (p : ℕ) [Fact p.Prime] (x : ℚ_[p]) + (hvx : Padic.mulValuation (p := p) x < WithZero.exp (-1 : ℤ)) : + Tendsto + (fun n : ℕ => + MultiplicativeIntegerValuation.expSeriesTermField x + (fun n => Nat.cast_ne_zero.mpr (Nat.factorial_ne_zero n)) n) + atTop (padicMulValuationNhds p (0 : ℚ_[p])) := by + rw [padicMulValuationNhds_eq_valuedNhds] + exact + tendsto_zero_expSeriesTermField_ofWithZeroValuation_of_lt_exp_neg_one + (v := Padic.mulValuation (p := p)) (p := p) x + (fun n => Nat.cast_ne_zero.mpr (Nat.factorial_ne_zero n)) + (padic_mulValuation_expSeries_denominator p) hvx + +/-- Membership in mathlib's `p^m`-power roots of unity inside the actual +p-adic unit group is the usual unit equation. -/ +theorem mem_rootsOfUnity_padic_iff + (p m : ℕ) [Fact p.Prime] (ζ : (ℚ_[p])ˣ) : + ζ ∈ rootsOfUnity (p ^ m) ℚ_[p] ↔ ζ ^ (p ^ m) = 1 := + mem_rootsOfUnity (p ^ m) ζ + +/-- The same roots-of-unity criterion after coercing the p-adic unit to +`ℚ_[p]`. -/ +theorem mem_rootsOfUnity_padic_iff_coe_pow + (p m : ℕ) [Fact p.Prime] (ζ : (ℚ_[p])ˣ) : + ζ ∈ rootsOfUnity (p ^ m) ℚ_[p] ↔ + ((ζ : ℚ_[p]) ^ (p ^ m) = 1) := + mem_rootsOfUnity' (p ^ m) ζ + +/-- The identity p-adic unit lies in every finite p-power roots-of-unity +subgroup. -/ +theorem one_mem_rootsOfUnity_padic + (p m : ℕ) [Fact p.Prime] : + (1 : (ℚ_[p])ˣ) ∈ rootsOfUnity (p ^ m) ℚ_[p] := + (mem_rootsOfUnity_padic_iff p m 1).2 (by simp) + +/-- A primitive p-adic `p^m`-power root is a root of mathlib's corresponding +cyclotomic polynomial over `ℚ_[p]`. -/ +theorem primitiveRoot_isRoot_cyclotomic_padic + (p m : ℕ) [Fact p.Prime] {ζ : ℚ_[p]} + (hζ : IsPrimitiveRoot ζ (p ^ m)) : + (Polynomial.cyclotomic (p ^ m) ℚ_[p]).IsRoot ζ := by + exact IsPrimitiveRoot.isRoot_cyclotomic + (pow_pos (Fact.out : Nat.Prime p).pos m) hζ + +end Qp +end Examples +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicLinearOfContinuous.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicLinearOfContinuous.lean new file mode 100644 index 0000000000..38e80fe998 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicLinearOfContinuous.lean @@ -0,0 +1,125 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.Padics.RingHoms +public import Mathlib.Topology.Algebra.Module.Basic +public import Mathlib.LinearAlgebra.Pi +public import Mathlib.LinearAlgebra.Isomorphisms +public import Mathlib.RingTheory.Finiteness.Finsupp +/-! +# Continuous additive maps of p-adic modules are p-adic linear + +This is the density argument used explicitly in the local-field structure theory, +the field-unit structure theorem: compatibility with ordinary integral powers, together with +continuity of the p-adic scalar orbit, forces compatibility with every +p-adic scalar. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalFieldTheory.DiscreteValuationField + +/-- Turn a topological group equivalence whose source is an additive group +written multiplicatively into the inverse topological additive equivalence. -/ +noncomputable def continuousAddEquivOfMultiplicativeSource + {C G : Type*} [AddZeroClass C] [MulOneClass G] + [TopologicalSpace C] [TopologicalSpace G] + (e : Multiplicative C ≃ₜ* G) : Additive G ≃ₜ+ C := + { (MulEquiv.toAdditiveRight e.toMulEquiv).symm with + continuous_toFun := e.continuous_invFun + continuous_invFun := e.continuous_toFun } + +/-- Turn a topological additive equivalence into the corresponding +topological multiplicative equivalence after tagging the source +multiplicatively. -/ +noncomputable def continuousMulEquivOfAdditiveTarget + {C G : Type*} [AddZeroClass C] [MulOneClass G] + [TopologicalSpace C] [TopologicalSpace G] + (e : C ≃ₜ+ Additive G) : Multiplicative C ≃ₜ* G := + { e.toAddEquiv.toMultiplicativeLeft with + continuous_toFun := e.continuous_toFun + continuous_invFun := e.continuous_invFun } + +variable {p : ℕ} [Fact p.Prime] +variable {A B : Type*} +variable [TopologicalSpace A] [TopologicalSpace B] +variable [AddCommMonoid A] [AddCommMonoid B] +variable [Module ℤ_[p] A] [Module ℤ_[p] B] +variable [ContinuousSMul ℤ_[p] A] [ContinuousSMul ℤ_[p] B] +variable [T2Space B] + +/-- A continuous additive homomorphism between topological `Z_p`-modules is +`Z_p`-linear. The proof checks natural scalars and extends over the dense +copy of `ℕ` in `Z_p`. -/ +theorem map_padicInt_smul_of_continuous + (f : A →+ B) (hf : Continuous f) (a : ℤ_[p]) (x : A) : + f (a • x) = a • f x := by + have hleft : Continuous (fun z : ℤ_[p] => f (z • x)) := + hf.comp (continuous_id.smul continuous_const) + have hright : Continuous (fun z : ℤ_[p] => z • f x) := + continuous_id.smul continuous_const + have hclosed : IsClosed {z : ℤ_[p] | f (z • x) = z • f x} := + isClosed_eq hleft hright + refine PadicInt.denseRange_natCast.induction_on a hclosed ?_ + intro n + simp only [Nat.cast_smul_eq_nsmul, map_nsmul] + +/-- Package the preceding density argument as a linear equivalence. -/ +noncomputable def padicLinearEquivOfContinuousAddEquiv + (e : A ≃+ B) (he : Continuous e) : A ≃ₗ[ℤ_[p]] B := + { e with + map_smul' := fun a x => + map_padicInt_smul_of_continuous e.toAddMonoidHom he a x } + +/-- Every `Z_p`-linear map from a finite Cartesian power of `Z_p` is +continuous when the target has continuous addition and scalar multiplication. +This is the elementary finite-basis continuity step used in the +mixed-characteristic part of the field-unit structure theorem. -/ +theorem continuous_padicInt_finPi_linearMap + {M : Type*} [TopologicalSpace M] [AddCommMonoid M] + [Module ℤ_[p] M] [ContinuousAdd M] [ContinuousSMul ℤ_[p] M] + (d : ℕ) (f : (Fin d → ℤ_[p]) →ₗ[ℤ_[p]] M) : Continuous f := by + classical + have hfun : + (fun x : Fin d → ℤ_[p] => f x) = + fun x => ∑ i : Fin d, + x i • f (Pi.single (M := fun _ : Fin d => ℤ_[p]) i 1) := by + funext x + have hx : x = ∑ i : Fin d, + x i • Pi.single (M := fun _ : Fin d => ℤ_[p]) i 1 := + pi_eq_sum_univ' x + calc + f x = f (∑ i : Fin d, + x i • Pi.single (M := fun _ : Fin d => ℤ_[p]) i 1) := + congrArg f hx + _ = ∑ i : Fin d, + x i • f (Pi.single (M := fun _ : Fin d => ℤ_[p]) i 1) := by + simp only [map_sum, map_smul] + change Continuous (fun x : Fin d → ℤ_[p] => f x) + rw [hfun] + fun_prop + +/-- Finite generation across a short exact sequence, phrased for a +surjective linear map. This avoids unfolding a large ambient module when a +finite kernel and finite quotient are already available. -/ +theorem moduleFinite_of_surjective_of_ker + {R M N : Type*} [Ring R] + [AddCommGroup M] [AddCommGroup N] [Module R M] [Module R N] + (f : M →ₗ[R] N) (hf : Function.Surjective f) + [Module.Finite R N] [Module.Finite R (LinearMap.ker f)] : + Module.Finite R M := by + let e : (M ⧸ LinearMap.ker f) ≃ₗ[R] N := + f.quotKerEquivOfSurjective hf + let : Module.Finite R (M ⧸ LinearMap.ker f) := + Module.Finite.equiv e.symm + exact Module.Finite.of_submodule_quotient (LinearMap.ker f) + +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicModuleStructure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicModuleStructure.lean new file mode 100644 index 0000000000..784e540e0d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicModuleStructure.lean @@ -0,0 +1,107 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicLinearOfContinuous +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitFactors +public import Mathlib.Algebra.Module.PID +public import Mathlib.NumberTheory.Padics.ProperSpace +/-! +# Topological structure of a finite p-adic module + +This file packages the PID step in the mixed-characteristic proof of +the local-field structure theory, the field-unit structure theorem. Once the torsion submodule + is known to +be a finite cyclic group of order `p^a`, and the torsion-free quotient has +rank `d`, the module is topologically the product of that cyclic factor and +`d` copies of `Z_p`. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace LocalFieldTheory.DiscreteValuationField +namespace CompleteDVF +namespace higherPrincipalUnitGroup + +/-- A finite topological `Z_p`-module with cyclic torsion of order `p^a` and +torsion-free quotient of rank `d` is topologically +`ZMod (p^a) × Z_p^d`. + +The algebraic splitting is obtained by projectively lifting the quotient map +and applying `lequivProdOfRightSplitExact`. For continuity, its restriction +to the finite torsion factor is automatic, while its restriction to the free +factor is a linear map out of a finite Cartesian power of `Z_p`. -/ +noncomputable def chosenPadicModuleContinuousAddEquivZModProdFinPi + (p : ℕ) [Fact p.Prime] + (M : Type u) [TopologicalSpace M] [AddCommGroup M] [Module ℤ_[p] M] + [ContinuousAdd M] [ContinuousSMul ℤ_[p] M] + [T2Space M] [Module.Finite ℤ_[p] M] + (a d : ℕ) + [Finite (Submodule.torsion ℤ_[p] M)] + (hcyclic : IsAddCyclic (Submodule.torsion ℤ_[p] M)) + (hcard : Nat.card (Submodule.torsion ℤ_[p] M) = p ^ a) + (hfinrank : Module.finrank ℤ_[p] + (M ⧸ Submodule.torsion ℤ_[p] M) = d) : + (ZMod (p ^ a) × (Fin d → ℤ_[p])) ≃ₜ+ M := by + let T : Submodule ℤ_[p] M := Submodule.torsion ℤ_[p] M + let Q := M ⧸ T + letI : Module.Finite ℤ_[p] Q := Module.Finite.quotient ℤ_[p] T + letI : Module.IsTorsionFree ℤ_[p] Q := + Submodule.QuotientTorsion.instIsTorsionFree + letI : Module.Free ℤ_[p] Q := + Module.free_of_finite_type_torsion_free' + let b : Module.Basis (Fin d) ℤ_[p] Q := + Module.finBasisOfFinrankEq ℤ_[p] Q (by simpa [Q, T] using hfinrank) + let q : M →ₗ[ℤ_[p]] Q := T.mkQ + have hliftExists : ∃ lift : Q →ₗ[ℤ_[p]] M, + q.comp lift = LinearMap.id := + Module.projective_lifting_property q LinearMap.id T.mkQ_surjective + let lift : Q →ₗ[ℤ_[p]] M := Classical.choose hliftExists + have hlift : q.comp lift = LinearMap.id := Classical.choose_spec hliftExists + have hexact : LinearMap.range T.subtype = LinearMap.ker q := by + change LinearMap.range T.subtype = LinearMap.ker T.mkQ + rw [Submodule.range_subtype, Submodule.ker_mkQ] + let split : (T × Q) ≃ₗ[ℤ_[p]] M := + lequivProdOfRightSplitExact T.injective_subtype hexact hlift + let torsionEquiv : ZMod (p ^ a) ≃+ T := by + rw [← hcard] + exact zmodAddCyclicAddEquiv hcyclic + let freeEquiv : (Fin d → ℤ_[p]) ≃ₗ[ℤ_[p]] Q := b.equivFun.symm + let algebraic : (ZMod (p ^ a) × (Fin d → ℤ_[p])) ≃+ M := + (torsionEquiv.prodCongr freeEquiv.toAddEquiv).trans split.toAddEquiv + let freeToM : (Fin d → ℤ_[p]) →ₗ[ℤ_[p]] M := + split.toLinearMap.comp + ((LinearMap.inr ℤ_[p] T Q).comp freeEquiv.toLinearMap) + have hfree : Continuous freeToM := + continuous_padicInt_finPi_linearMap d freeToM + have htorsion : Continuous (fun z : ZMod (p ^ a) => + split (torsionEquiv z, (0 : Q))) := + continuous_of_discreteTopology + have halgebraic : Continuous algebraic := by + have hfun : (fun z : ZMod (p ^ a) × (Fin d → ℤ_[p]) => algebraic z) = + fun z => + split (torsionEquiv z.1, (0 : Q)) + + freeToM z.2 := by + funext z + change split (torsionEquiv z.1, freeEquiv z.2) = + split (torsionEquiv z.1, 0) + split (0, freeEquiv z.2) + rw [← split.map_add] + simp + change Continuous (fun z => algebraic z) + rw [hfun] + exact (htorsion.comp continuous_fst).add (hfree.comp continuous_snd) + exact continuousAddEquivOfCompactToT2 algebraic halgebraic + +end higherPrincipalUnitGroup +end CompleteDVF +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicPowerIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicPowerIndex.lean new file mode 100644 index 0000000000..c6946ea36a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicPowerIndex.lean @@ -0,0 +1,741 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PowerIndex +public import Mathlib.NumberTheory.Padics.RingHoms +/-! +# The `n`-fold multiple quotient of `Z_p` + +This is the free p-adic factor in the local-field structure theory, the local-field power-index + formula. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +open ValuationTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory + +namespace LocalFieldTheory.DiscreteValuationField + +variable {p : ℕ} [Fact p.Prime] + +/-- The normalized local absolute value of a natural number in a degree-`d` +mixed-characteristic local field. Since `d = ef` and `q = p^f`, this is +exactly `q^(-e v_p(n))`, the normalized factor `|n|_𝔭`. -/ +def normalizedLocalNatAbs (p d n : ℕ) : ℚ := + (p : ℚ) ^ (-(d * padicValNat p n : ℕ) : ℤ) + +omit [Fact p.Prime] in +/-- The reciprocal of the normalized local absolute value is the integral +defect factor occurring in the local-field power-index formula. -/ +theorem one_div_normalizedLocalNatAbs (d n : ℕ) : + 1 / normalizedLocalNatAbs p d n = + (p ^ (d * padicValNat p n) : ℕ) := by + simp [normalizedLocalNatAbs, div_eq_mul_inv] + norm_cast + +/-- Additive `n`-fold multiples in `Z_p` are the principal ideal generated +by the natural number `n`. -/ +theorem nsmulAddSubgroup_padicInt_eq_span (n : ℕ) : + LocalFieldTheory.nsmulAddSubgroup ℤ_[p] n = + (Ideal.span ({(n : ℤ_[p])} : Set ℤ_[p])).toAddSubgroup := by + ext x + rw [LocalFieldTheory.mem_nsmulAddSubgroup_iff] + change (∃ y : ℤ_[p], n • y = x) ↔ + x ∈ Ideal.span ({(n : ℤ_[p])} : Set ℤ_[p]) + rw [Ideal.mem_span_singleton] + constructor + · rintro ⟨y, rfl⟩ + refine ⟨y, ?_⟩ + simp [nsmul_eq_mul] + · rintro ⟨y, rfl⟩ + refine ⟨y, ?_⟩ + simp [nsmul_eq_mul] + +/-- The valuation of a nonzero natural number in `Z_p` is `v_p(n)`. -/ +theorem padicInt_valuation_natCast (n : ℕ) : + (n : ℤ_[p]).valuation = padicValNat p n := by + have h : (((n : ℤ_[p]) : ℚ_[p])).valuation = + (padicValNat p n : ℤ) := by + simpa only [PadicInt.coe_natCast] using + Padic.valuation_natCast (p := p) n + rw [PadicInt.valuation_coe] at h + exact_mod_cast h + +/-- A nonzero natural number generates the same ideal in `Z_p` as the +corresponding power of `p`. -/ +theorem padicInt_span_natCast_eq_span_p_pow_padicValNat + (n : ℕ) (hn : n ≠ 0) : + Ideal.span ({(n : ℤ_[p])} : Set ℤ_[p]) = + Ideal.span ({(p : ℤ_[p]) ^ padicValNat p n} : Set ℤ_[p]) := by + rw [Ideal.span_singleton_eq_span_singleton] + have hnZ : (n : ℤ_[p]) ≠ 0 := by exact_mod_cast hn + have hfactor := PadicInt.unitCoeff_spec hnZ + rw [padicInt_valuation_natCast] at hfactor + rw [hfactor] + exact associated_unit_mul_left _ _ (PadicInt.unitCoeff hnZ).isUnit + +/-- The subgroup of `n`-fold multiples is the kernel of reduction modulo +`p ^ v_p(n)`. -/ +theorem nsmulAddSubgroup_padicInt_eq_ker_toZModPow + (n : ℕ) (hn : n ≠ 0) : + LocalFieldTheory.nsmulAddSubgroup ℤ_[p] n = + (PadicInt.toZModPow (p := p) (padicValNat p n)).toAddMonoidHom.ker := by + rw [nsmulAddSubgroup_padicInt_eq_span, + padicInt_span_natCast_eq_span_p_pow_padicValNat n hn, + ← PadicInt.ker_toZModPow] + rfl + +/-- The additive quotient `Z_p / n Z_p` is the expected finite cyclic +group of order `p ^ v_p(n)`. -/ +noncomputable def padicIntNsmulQuotientEquivZMod + (n : ℕ) (hn : n ≠ 0) : + ℤ_[p] ⧸ LocalFieldTheory.nsmulAddSubgroup ℤ_[p] n ≃+ + ZMod (p ^ padicValNat p n) := by + let f : ℤ_[p] →+ ZMod (p ^ padicValNat p n) := + (PadicInt.toZModPow (p := p) (padicValNat p n)).toAddMonoidHom + have hf : Function.Surjective f := + ZMod.ringHom_surjective + (PadicInt.toZModPow (p := p) (padicValNat p n)) + have hker : LocalFieldTheory.nsmulAddSubgroup ℤ_[p] n = f.ker := by + simpa [f] using nsmulAddSubgroup_padicInt_eq_ker_toZModPow + (p := p) n hn + exact (QuotientAddGroup.quotientAddEquivOfEq hker).trans + (QuotientAddGroup.quotientKerEquivOfSurjective f hf) + +/-- The quotient `Z_p / n Z_p` is finite for nonzero `n`, transported from +its canonical `ZMod` model. -/ +noncomputable instance finite_padicInt_nsmulQuotient + (n : ℕ) [NeZero n] : + Finite (ℤ_[p] ⧸ LocalFieldTheory.nsmulAddSubgroup ℤ_[p] n) := + Finite.of_equiv (ZMod (p ^ padicValNat p n)) + (padicIntNsmulQuotientEquivZMod (p := p) n (NeZero.ne n)).symm.toEquiv + +/-- Cardinality of the one-dimensional p-adic free-factor quotient. -/ +theorem card_padicInt_nsmulQuotient + (n : ℕ) [NeZero n] : + Nat.card (ℤ_[p] ⧸ LocalFieldTheory.nsmulAddSubgroup ℤ_[p] n) = + p ^ padicValNat p n := by + rw [Nat.card_congr (padicIntNsmulQuotientEquivZMod + (p := p) n (NeZero.ne n)).toEquiv, Nat.card_zmod] + +/-- Coordinatewise reduction identifies the quotient of an arbitrary product +of copies of `Z_p` by `n`-fold multiples with a product of finite cyclic +groups. -/ +noncomputable def padicIntPiNsmulQuotientEquiv + {ι : Type u} (n : ℕ) (hn : n ≠ 0) : + (ι → ℤ_[p]) ⧸ LocalFieldTheory.nsmulAddSubgroup (ι → ℤ_[p]) n ≃+ + (ι → ZMod (p ^ padicValNat p n)) := by + let a := padicValNat p n + let f : (ι → ℤ_[p]) →+ (ι → ZMod (p ^ a)) := + { toFun := fun x i => PadicInt.toZModPow a (x i) + map_zero' := by ext i; simp + map_add' := by intro x y; ext i; simp } + have hf : Function.Surjective f := by + intro y + have hcoord : ∀ i : ι, ∃ x : ℤ_[p], + PadicInt.toZModPow a x = y i := by + intro i + exact ZMod.ringHom_surjective (PadicInt.toZModPow a) (y i) + choose x hx using hcoord + refine ⟨x, ?_⟩ + ext i + exact hx i + have hkerOne : LocalFieldTheory.nsmulAddSubgroup ℤ_[p] n = + (PadicInt.toZModPow (p := p) a).toAddMonoidHom.ker := by + simpa [a] using nsmulAddSubgroup_padicInt_eq_ker_toZModPow + (p := p) n hn + have hker : LocalFieldTheory.nsmulAddSubgroup (ι → ℤ_[p]) n = f.ker := by + ext x + constructor + · intro hx + rw [LocalFieldTheory.mem_nsmulAddSubgroup_iff] at hx + rcases hx with ⟨y, rfl⟩ + change f (n • y) = 0 + ext i + have hi : n • y i ∈ LocalFieldTheory.nsmulAddSubgroup ℤ_[p] n := + (LocalFieldTheory.mem_nsmulAddSubgroup_iff (A := ℤ_[p])).2 ⟨y i, rfl⟩ + rw [hkerOne] at hi + exact hi + · intro hx + change f x = 0 at hx + have hcoord : ∀ i : ι, ∃ y : ℤ_[p], n • y = x i := by + intro i + rw [← LocalFieldTheory.mem_nsmulAddSubgroup_iff] + rw [hkerOne] + change PadicInt.toZModPow a (x i) = 0 + exact congrFun hx i + choose y hy using hcoord + rw [LocalFieldTheory.mem_nsmulAddSubgroup_iff] + refine ⟨y, ?_⟩ + funext i + exact hy i + exact (QuotientAddGroup.quotientAddEquivOfEq hker).trans + (QuotientAddGroup.quotientKerEquivOfSurjective f hf) + +/-- A finite product of nonzero scalar quotients of `Z_p` is finite. -/ +noncomputable instance finite_padicInt_finPi_nsmulQuotient + (d n : ℕ) [NeZero n] : + Finite ((Fin d → ℤ_[p]) ⧸ + LocalFieldTheory.nsmulAddSubgroup (Fin d → ℤ_[p]) n) := + Finite.of_equiv + (Fin d → ZMod (p ^ padicValNat p n)) + (padicIntPiNsmulQuotientEquiv + (p := p) (ι := Fin d) n (NeZero.ne n)).symm.toEquiv + +/-- A finite product of `d` copies contributes the expected +`p^(d v_p(n))` factor. -/ +theorem card_padicInt_finPi_nsmulQuotient + (d n : ℕ) [NeZero n] : + Nat.card ((Fin d → ℤ_[p]) ⧸ + LocalFieldTheory.nsmulAddSubgroup (Fin d → ℤ_[p]) n) = + p ^ (d * padicValNat p n) := by + rw [Nat.card_congr + (padicIntPiNsmulQuotientEquiv + (p := p) (ι := Fin d) n (NeZero.ne n)).toEquiv, + Nat.card_pi] + simp only [Nat.card_zmod, Finset.prod_const, Finset.card_univ, + Fintype.card_fin] + rw [← pow_mul, Nat.mul_comm] + +/-- If `n` is nonzero and prime to `p`, the quotient of an arbitrary product +of copies of `Z_p` is finite (indeed, a singleton). -/ +noncomputable instance finite_padicInt_pi_nsmulQuotient_of_coprime + {ι : Type u} (n : ℕ) [NeZero n] [Fact (Nat.Coprime n p)] : + Finite ((ι → ℤ_[p]) ⧸ LocalFieldTheory.nsmulAddSubgroup (ι → ℤ_[p]) n) := by + have hpnd : ¬ p ∣ n := + (Fact.out : Nat.Prime p).coprime_iff_not_dvd.mp + (Fact.out : Nat.Coprime n p).symm + have hv : padicValNat p n = 0 := + padicValNat.eq_zero_of_not_dvd hpnd + let target := ι → ZMod (p ^ padicValNat p n) + let toUnit : target → PUnit := fun _ => PUnit.unit + have hsub : Subsingleton target := by + dsimp only [target] + rw [hv, pow_zero] + infer_instance + let : Finite target := + Finite.of_injective toUnit fun x y _ => hsub.elim x y + exact Finite.of_equiv target + (padicIntPiNsmulQuotientEquiv + (p := p) (ι := ι) n (NeZero.ne n)).symm.toEquiv + +/-- If `n` is prime to `p`, multiplication by `n` is surjective on an +arbitrary product of copies of `Z_p`; hence the quotient is trivial. -/ +theorem card_padicInt_pi_nsmulQuotient_of_coprime + {ι : Type u} (n : ℕ) [NeZero n] [Fact (Nat.Coprime n p)] : + Nat.card ((ι → ℤ_[p]) ⧸ + LocalFieldTheory.nsmulAddSubgroup (ι → ℤ_[p]) n) = 1 := by + rw [Nat.card_congr + (padicIntPiNsmulQuotientEquiv (p := p) (ι := ι) n (NeZero.ne n)).toEquiv] + have hpnd : ¬ p ∣ n := + (Fact.out : Nat.Prime p).coprime_iff_not_dvd.mp + (Fact.out : Nat.Coprime n p).symm + have hv : padicValNat p n = 0 := + padicValNat.eq_zero_of_not_dvd hpnd + rw [hv, pow_zero] + exact Nat.card_unique + +/-- A nonzero natural scalar has trivial kernel on any product of `Z_p`. -/ +theorem nsmulAddKernel_padicInt_pi_eq_bot + {ι : Type u} (n : ℕ) (hn : n ≠ 0) : + LocalFieldTheory.nsmulAddKernel (ι → ℤ_[p]) n = ⊥ := by + have hnZ : (n : ℤ_[p]) ≠ 0 := by exact_mod_cast hn + ext x + rw [LocalFieldTheory.mem_nsmulAddKernel_iff] + simp only [AddSubgroup.mem_bot] + constructor + · intro hx + funext i + have hi := congrFun hx i + change n • x i = 0 at hi + rw [nsmul_eq_mul] at hi + exact (mul_eq_zero.mp hi).resolve_left hnZ + · rintro rfl + simp + +/-- Nonzero scalar multiplication has a finite (trivial) kernel on any +product of copies of `Z_p`. -/ +noncomputable instance finite_nsmulAddKernel_padicInt_pi + {ι : Type u} (n : ℕ) [NeZero n] : + Finite (LocalFieldTheory.nsmulAddKernel (ι → ℤ_[p]) n) := by + rw [nsmulAddKernel_padicInt_pi_eq_bot (p := p) n (NeZero.ne n)] + infer_instance + +/-- Cardinal form of the preceding torsion-freeness statement. -/ +theorem card_nsmulAddKernel_padicInt_pi + {ι : Type u} (n : ℕ) [NeZero n] : + Nat.card (LocalFieldTheory.nsmulAddKernel (ι → ℤ_[p]) n) = 1 := by + rw [nsmulAddKernel_padicInt_pi_eq_bot (p := p) n (NeZero.ne n)] + exact Nat.card_unique + +section Product + +variable (A B : Type*) [AddCommGroup A] [AddCommGroup B] + +/-- Additive quotients by `n`-fold multiples commute with binary products at +the level of cardinality. -/ +theorem card_nsmulAddQuotient_product (n : ℕ) + [Finite (A ⧸ LocalFieldTheory.nsmulAddSubgroup A n)] + [Finite (B ⧸ LocalFieldTheory.nsmulAddSubgroup B n)] : + Nat.card ((A × B) ⧸ LocalFieldTheory.nsmulAddSubgroup (A × B) n) = + Nat.card (A ⧸ LocalFieldTheory.nsmulAddSubgroup A n) * + Nat.card (B ⧸ LocalFieldTheory.nsmulAddSubgroup B n) := by + calc + Nat.card ((A × B) ⧸ LocalFieldTheory.nsmulAddSubgroup (A × B) n) = + Nat.card (Multiplicative (A × B) ⧸ + (powMonoidHom n : (Multiplicative (A × B)) →* (Multiplicative (A × B))).range) := + (LocalFieldTheory.card_multiplicative_nthPowerQuotient_eq_additive_nsmulQuotient + (A × B) n).symm + _ = Nat.card (Multiplicative A ⧸ + (powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).range) * + Nat.card (Multiplicative B ⧸ + (powMonoidHom n : (Multiplicative B) →* (Multiplicative B)).range) := + LocalFieldTheory.card_nthPowerQuotient_eq_mul_of_mulEquiv_prod + (Multiplicative (A × B)) (Multiplicative A) (Multiplicative B) n + (MulEquiv.prodMultiplicative A B) + _ = Nat.card (A ⧸ LocalFieldTheory.nsmulAddSubgroup A n) * + Nat.card (B ⧸ LocalFieldTheory.nsmulAddSubgroup B n) := by + rw [LocalFieldTheory.card_multiplicative_nthPowerQuotient_eq_additive_nsmulQuotient, + LocalFieldTheory.card_multiplicative_nthPowerQuotient_eq_additive_nsmulQuotient] + +/-- Kernels of `n`-fold multiplication commute with binary products at the +level of cardinality. -/ +theorem card_nsmulAddKernel_product (n : ℕ) + [Finite (LocalFieldTheory.nsmulAddKernel A n)] + [Finite (LocalFieldTheory.nsmulAddKernel B n)] : + Nat.card (LocalFieldTheory.nsmulAddKernel (A × B) n) = + Nat.card (LocalFieldTheory.nsmulAddKernel A n) * Nat.card (LocalFieldTheory.nsmulAddKernel + B n) := by + calc + Nat.card (LocalFieldTheory.nsmulAddKernel (A × B) n) = + Nat.card ((powMonoidHom n : (Multiplicative (A × B)) →* (Multiplicative (A × B))).ker) := + (LocalFieldTheory.card_multiplicative_nthPowerKernel_eq_nsmulAddKernel + (A × B) n).symm + _ = Nat.card ((powMonoidHom n : (Multiplicative A × Multiplicative B) →* (Multiplicative A × + Multiplicative B)).ker) := by + rw [Nat.card_congr + (LocalFieldTheory.nthPowerKernelEquivOfMulEquiv + (Multiplicative (A × B)) + (Multiplicative A × Multiplicative B) n + (MulEquiv.prodMultiplicative A B)).toEquiv] + _ = Nat.card ((powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).ker) * + Nat.card ((powMonoidHom n : (Multiplicative B) →* (Multiplicative B)).ker) := + LocalFieldTheory.card_nthPowerKernelProduct (Multiplicative A) (Multiplicative B) n + _ = Nat.card (LocalFieldTheory.nsmulAddKernel A n) * Nat.card + (LocalFieldTheory.nsmulAddKernel B n) := by + rw [LocalFieldTheory.card_multiplicative_nthPowerKernel_eq_nsmulAddKernel, + LocalFieldTheory.card_multiplicative_nthPowerKernel_eq_nsmulAddKernel] + +end Product + +/-- Mixed-characteristic free-factor calculation in the exact kernel-times- +defect form used by the local-field power-index formula. -/ +theorem card_finite_prod_padicInt_finPi_nsmulQuotient_eq_kernel_mul + (T : Type*) [AddCommGroup T] [Finite T] + (d n : ℕ) [NeZero n] : + Nat.card ((T × (Fin d → ℤ_[p])) ⧸ + LocalFieldTheory.nsmulAddSubgroup (T × (Fin d → ℤ_[p])) n) = + Nat.card (LocalFieldTheory.nsmulAddKernel (T × (Fin d → ℤ_[p])) n) * + p ^ (d * padicValNat p n) := by + rw [card_nsmulAddQuotient_product, + LocalFieldTheory.card_additive_nsmulQuotient_eq_nsmulKernel, + card_padicInt_finPi_nsmulQuotient (p := p) d n, + card_nsmulAddKernel_product, + card_nsmulAddKernel_padicInt_pi (p := p) n] + simp + +/-- Equal-characteristic free-factor calculation: when `p ∤ n`, an arbitrary +product of copies of `Z_p` contributes neither kernel nor cokernel. -/ +theorem card_finite_prod_padicInt_pi_nsmulQuotient_eq_kernel_of_coprime + {ι : Type u} (T : Type*) [AddCommGroup T] [Finite T] + (n : ℕ) [NeZero n] [Fact (Nat.Coprime n p)] : + Nat.card ((T × (ι → ℤ_[p])) ⧸ + LocalFieldTheory.nsmulAddSubgroup (T × (ι → ℤ_[p])) n) = + Nat.card (LocalFieldTheory.nsmulAddKernel (T × (ι → ℤ_[p])) n) := by + rw [card_nsmulAddQuotient_product, + LocalFieldTheory.card_additive_nsmulQuotient_eq_nsmulKernel, + card_padicInt_pi_nsmulQuotient_of_coprime (p := p) n, + card_nsmulAddKernel_product, + card_nsmulAddKernel_padicInt_pi (p := p) n] + +section LocalFieldIndex + +variable {K : Type u} [Field K] + +/-- The local-field power-index formula, mixed-characteristic field-index formula supplied directly +by a principal-unit structure theorem. -/ +theorem card_fieldUnits_nthPowerQuotient_of_mixedPrincipalUnitStructure + (F : CompleteDVF.{u, 0} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (T : Type*) [AddCommGroup T] [Finite T] + (d : ℕ) {n : ℕ} [NeZero n] + [Finite (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range)] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative (T × (Fin d → ℤ_[p]))) : + Nat.card (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range) = + n * (Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) * + p ^ (d * padicValNat p n)) := by + exact card_fieldUnits_nthPowerQuotient_eq_mul_fieldKernel_of_logEquiv + (F := F) hπ (A := T × (Fin d → ℤ_[p])) e + (card_finite_prod_padicInt_finPi_nsmulQuotient_eq_kernel_mul + (p := p) T d n) + +/-- Literal rational form of the mixed-characteristic field formula: +`(Kˣ : Kˣⁿ) = n #μ_n(K) / |n|_𝔭`. -/ +theorem card_fieldUnits_nthPowerQuotient_of_mixedPrincipalUnitStructure_rationalFormula + (F : CompleteDVF.{u, 0} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (T : Type*) [AddCommGroup T] [Finite T] + (d : ℕ) {n : ℕ} [NeZero n] + [Finite (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range)] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative (T × (Fin d → ℤ_[p]))) : + (Nat.card (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range) : ℚ) = + (n * Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) : ℕ) / + normalizedLocalNatAbs p d n := by + rw [card_fieldUnits_nthPowerQuotient_of_mixedPrincipalUnitStructure + (p := p) (F := F) hπ T d e] + push_cast + have hdefect : + (p : ℚ) ^ (d * padicValNat p n) = + 1 / normalizedLocalNatAbs p d n := by + calc + (p : ℚ) ^ (d * padicValNat p n) = + ((p ^ (d * padicValNat p n) : ℕ) : ℚ) := by norm_cast + _ = 1 / normalizedLocalNatAbs p d n := + (one_div_normalizedLocalNatAbs (p := p) d n).symm + rw [hdefect] + ring + +/-- The local-field power-index formula, mixed-characteristic unit-index formula from the same +principal-unit structure theorem. -/ +theorem card_units_nthPowerQuotient_of_mixedPrincipalUnitStructure + (F : CompleteDVF.{u, 0} K) [Finite F.residueField] + (T : Type*) [AddCommGroup T] [Finite T] + (d : ℕ) {n : ℕ} [NeZero n] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative (T × (Fin d → ℤ_[p]))) : + Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) = + Nat.card ((powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).ker) * + p ^ (d * padicValNat p n) := by + exact card_unit_nthPowerQuotient_eq_mul_unitKernel_of_logEquiv + (F := F) (A := T × (Fin d → ℤ_[p])) e + (card_finite_prod_padicInt_finPi_nsmulQuotient_eq_kernel_mul + (p := p) T d n) + +/-- The same mixed-characteristic unit formula with the finite kernel written +as the full field root group `μ_n(K)`. -/ +theorem card_units_nthPowerQuotient_of_mixedPrincipalUnitStructure_fieldKernel + (F : CompleteDVF.{u, 0} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (T : Type*) [AddCommGroup T] [Finite T] + (d : ℕ) {n : ℕ} [NeZero n] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative (T × (Fin d → ℤ_[p]))) : + Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) = + Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) * + p ^ (d * padicValNat p n) := by + rw [card_units_nthPowerQuotient_of_mixedPrincipalUnitStructure + (p := p) (F := F) T d e] + rw [card_fieldUnits_nthPowerKernel_eq_unit_nthPowerKernel + (F := F) hπ n] + +/-- Literal rational form of the mixed-characteristic unit formula: +`(U : Uⁿ) = #μ_n(K) / |n|_𝔭`. -/ +theorem card_units_nthPowerQuotient_of_mixedPrincipalUnitStructure_rationalFormula + (F : CompleteDVF.{u, 0} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (T : Type*) [AddCommGroup T] [Finite T] + (d : ℕ) {n : ℕ} [NeZero n] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative (T × (Fin d → ℤ_[p]))) : + (Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) : ℚ) = + Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) / + normalizedLocalNatAbs p d n := by + rw [card_units_nthPowerQuotient_of_mixedPrincipalUnitStructure_fieldKernel + (p := p) (F := F) hπ T d e] + push_cast + have hdefect : + (p : ℚ) ^ (d * padicValNat p n) = + 1 / normalizedLocalNatAbs p d n := by + calc + (p : ℚ) ^ (d * padicValNat p n) = + ((p ^ (d * padicValNat p n) : ℕ) : ℚ) := by norm_cast + _ = 1 / normalizedLocalNatAbs p d n := + (one_div_normalizedLocalNatAbs (p := p) d n).symm + rw [hdefect] + ring + +/-- The local-field power-index formula obtained in equal characteristic from the +field-unit structure theorem, the principal-unit product, and the hypothesis `p ∤ n`. -/ +theorem card_fieldUnits_nthPowerQuotient_of_equalPrincipalUnitStructure + (F : CompleteDVF.{u, 0} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + {ι : Type u} (T : Type*) [AddCommGroup T] [Finite T] + {n : ℕ} [NeZero n] [Fact (Nat.Coprime n p)] + [Finite (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range)] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative (T × (ι → ℤ_[p]))) : + Nat.card (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range) = + n * Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) := by + simpa only [Nat.mul_one] using + card_fieldUnits_nthPowerQuotient_eq_mul_fieldKernel_of_logEquiv + (F := F) hπ (A := T × (ι → ℤ_[p])) (c := 1) e + (by + rw [Nat.mul_one] + exact + card_finite_prod_padicInt_pi_nsmulQuotient_eq_kernel_of_coprime + (p := p) (ι := ι) T n) + +/-- Literal rational form of the equal-characteristic field formula. Here +the permitted hypothesis `(n,p)=1` makes the local absolute value equal to +one, represented uniformly as `normalizedLocalNatAbs p 0 n`. -/ +theorem card_fieldUnits_nthPowerQuotient_of_equalPrincipalUnitStructure_rationalFormula + (F : CompleteDVF.{u, 0} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + {ι : Type u} (T : Type*) [AddCommGroup T] [Finite T] + {n : ℕ} [NeZero n] [Fact (Nat.Coprime n p)] + [Finite (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range)] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative (T × (ι → ℤ_[p]))) : + (Nat.card (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range) : ℚ) = + (n * Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) : ℕ) / + normalizedLocalNatAbs p 0 n := by + rw [card_fieldUnits_nthPowerQuotient_of_equalPrincipalUnitStructure + (p := p) (F := F) hπ T e] + simp [normalizedLocalNatAbs] + +/-- The local-field power-index formula, equal-characteristic unit-index formula. -/ +theorem card_units_nthPowerQuotient_of_equalPrincipalUnitStructure + (F : CompleteDVF.{u, 0} K) [Finite F.residueField] + {ι : Type u} (T : Type*) [AddCommGroup T] [Finite T] + {n : ℕ} [NeZero n] [Fact (Nat.Coprime n p)] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative (T × (ι → ℤ_[p]))) : + Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) = + Nat.card ((powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).ker) := by + simpa only [Nat.mul_one] using + card_unit_nthPowerQuotient_eq_mul_unitKernel_of_logEquiv + (F := F) (A := T × (ι → ℤ_[p])) (c := 1) e + (by + rw [Nat.mul_one] + exact + card_finite_prod_padicInt_pi_nsmulQuotient_eq_kernel_of_coprime + (p := p) (ι := ι) T n) + +/-- The equal-characteristic unit formula with its kernel written as +`μ_n(K)`. -/ +theorem card_units_nthPowerQuotient_of_equalPrincipalUnitStructure_fieldKernel + (F : CompleteDVF.{u, 0} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + {ι : Type u} (T : Type*) [AddCommGroup T] [Finite T] + {n : ℕ} [NeZero n] [Fact (Nat.Coprime n p)] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative (T × (ι → ℤ_[p]))) : + Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) = + Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) := by + rw [card_units_nthPowerQuotient_of_equalPrincipalUnitStructure + (p := p) (F := F) T e] + rw [card_fieldUnits_nthPowerKernel_eq_unit_nthPowerKernel + (F := F) hπ n] + +/-- Literal rational form of the equal-characteristic unit formula. -/ +theorem card_units_nthPowerQuotient_of_equalPrincipalUnitStructure_rationalFormula + (F : CompleteDVF.{u, 0} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + {ι : Type u} (T : Type*) [AddCommGroup T] [Finite T] + {n : ℕ} [NeZero n] [Fact (Nat.Coprime n p)] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative (T × (ι → ℤ_[p]))) : + (Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) : ℚ) = + Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) / + normalizedLocalNatAbs p 0 n := by + rw [card_units_nthPowerQuotient_of_equalPrincipalUnitStructure_fieldKernel + (p := p) (F := F) hπ T e] + simp [normalizedLocalNatAbs] + +/-! The exact equal-characteristic specialization, with no artificial finite +factor in the principal-unit product. -/ + +/-- Equal-characteristic field index from the literal the field-unit structure theorem +product `U^1 ≃ Z_p^ι`. -/ +theorem card_fieldUnits_nthPowerQuotient_of_equalPrincipalUnitProduct + (F : CompleteDVF.{u, 0} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + {ι : Type u} {n : ℕ} [NeZero n] [Fact (Nat.Coprime n p)] + [Finite (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range)] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative (ι → ℤ_[p])) : + Nat.card (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range) = + n * Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) := by + simpa only [Nat.mul_one] using + card_fieldUnits_nthPowerQuotient_eq_mul_fieldKernel_of_logEquiv + (F := F) hπ (A := ι → ℤ_[p]) (c := 1) e + (by + rw [card_padicInt_pi_nsmulQuotient_of_coprime + (p := p) n, + card_nsmulAddKernel_padicInt_pi (p := p) n]) + +/-- Equal-characteristic unit index from the literal principal-unit product, +with its torsion kernel written as the field root group `μ_n(K)`. -/ +theorem card_units_nthPowerQuotient_of_equalPrincipalUnitProduct + (F : CompleteDVF.{u, 0} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + {ι : Type u} {n : ℕ} [NeZero n] [Fact (Nat.Coprime n p)] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative (ι → ℤ_[p])) : + Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) = + Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) := by + have hunit : + Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) = + Nat.card + ((powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).ker) := by + simpa only [Nat.mul_one] using + card_unit_nthPowerQuotient_eq_mul_unitKernel_of_logEquiv + (F := F) (A := ι → ℤ_[p]) (c := 1) e + (by + rw [card_padicInt_pi_nsmulQuotient_of_coprime + (p := p) n, + card_nsmulAddKernel_padicInt_pi (p := p) n]) + rw [hunit] + exact (card_fieldUnits_nthPowerKernel_eq_unit_nthPowerKernel + (F := F) hπ n).symm + +/-- Literal rational field formula in equal characteristic. -/ +theorem card_fieldUnits_nthPowerQuotient_of_equalPrincipalUnitProduct_rationalFormula + (F : CompleteDVF.{u, 0} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + {ι : Type u} {n : ℕ} [NeZero n] [Fact (Nat.Coprime n p)] + [Finite (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range)] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative (ι → ℤ_[p])) : + (Nat.card (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range) : ℚ) = + (n * Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) : ℕ) / + normalizedLocalNatAbs p 0 n := by + rw [card_fieldUnits_nthPowerQuotient_of_equalPrincipalUnitProduct + (p := p) (F := F) hπ e] + simp [normalizedLocalNatAbs] + +/-- Literal rational unit formula in equal characteristic. -/ +theorem card_units_nthPowerQuotient_of_equalPrincipalUnitProduct_rationalFormula + (F : CompleteDVF.{u, 0} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + {ι : Type u} {n : ℕ} [NeZero n] [Fact (Nat.Coprime n p)] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative (ι → ℤ_[p])) : + (Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) : ℚ) = + Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) / + normalizedLocalNatAbs p 0 n := by + rw [card_units_nthPowerQuotient_of_equalPrincipalUnitProduct + (p := p) (F := F) hπ e] + simp [normalizedLocalNatAbs] + +end LocalFieldIndex + +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicValuationComparison.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicValuationComparison.lean new file mode 100644 index 0000000000..7a81866179 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicValuationComparison.lean @@ -0,0 +1,112 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.IntegralLattice +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.NonarchimedeanLocalField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationExtension +/-! +# Comparison of the chosen and canonical valuations on the p-adic field + +The concrete local-field package on `ℚ_[p]` uses the DVR valuation obtained +from `ℤ_[p]`, whereas mathlib's nonarchimedean-local-field API uses +`ValuativeRel.valuation ℚ_[p]`. This file proves that these are equivalent +valuations and makes the comparison usable when transporting valuation +extensions. +-/ + +@[expose] public section + +noncomputable +section + +open scoped ValuativeRel + +namespace LocalFieldTheory +namespace DiscreteValuationField +namespace Examples +namespace Qp + +universe u v + +/-- The DVR valuation on `ℚ_[p]` obtained from `ℤ_[p]` is equivalent to the +canonical valuation attached to the p-adic valuative relation. -/ +theorem padicDVRValuation_isEquiv_valuativeRelValuation + (p : ℕ) [Fact p.Prime] : + (padicDVRValuation p).IsEquiv + (ValuativeRel.valuation ℚ_[p]) := by + apply _root_.Valuation.isEquiv_of_val_le_one + intro a + have hcanonical : + ValuativeRel.valuation ℚ_[p] a ≤ 1 ↔ ‖a‖ ≤ 1 := by + simpa only [_root_.Valuation.mem_integer_iff] using + LocalFieldTheory.Padic.integer_mem_iff_norm_le_one p a + exact + (LocalFieldTheory.DiscreteValuationField.LocalField.padicDVRValuation_le_one_iff_norm_le_one + p a).trans + hcanonical.symm + +/-- The valuation selected by the concrete p-adic local-field package is +equivalent to mathlib's canonical valuation on `ℚ_[p]`. -/ +theorem padicLocalField_valuation_isEquiv_valuativeRelValuation + (p : ℕ) [Fact p.Prime] : + (padicLocalField p).toCompleteDVF.valuation.IsEquiv + (ValuativeRel.valuation ℚ_[p]) := by + change + (padicDVRValuation p).IsEquiv + (ValuativeRel.valuation ℚ_[p]) + exact padicDVRValuation_isEquiv_valuativeRelValuation p + +/-- The chosen valuation in `padicLocalField p` is equivalent to the +canonical complete-DVF valuation supplied by the topology-first local-field +structure on `ℚ_[p]`. -/ +theorem padicLocalField_valuation_isEquiv_localCompleteDVF + (p : ℕ) [Fact p.Prime] : + (padicLocalField p).toCompleteDVF.valuation.IsEquiv + (LocalFieldTheory.localCompleteDVF ℚ_[p]).valuation := by + rw [LocalFieldTheory.localCompleteDVF_valuation_eq] + exact padicLocalField_valuation_isEquiv_valuativeRelValuation p + +/-- Symmetric comparison, oriented for transporting canonical local-field +valuation extensions to the chosen p-adic DVR valuation. -/ +theorem localCompleteDVF_valuation_isEquiv_padicLocalField + (p : ℕ) [Fact p.Prime] : + (LocalFieldTheory.localCompleteDVF ℚ_[p]).valuation.IsEquiv + (padicLocalField p).toCompleteDVF.valuation := + (padicLocalField_valuation_isEquiv_localCompleteDVF p).symm + +/-- Any valuation extension of the canonical complete-DVF valuation on +`ℚ_[p]` is also an extension of the valuation selected by +`padicLocalField p`. -/ +theorem padicLocalFieldValuation_hasExtension_of_localCompleteDVF + (p : ℕ) [Fact p.Prime] + {E : Type u} [Field E] [Algebra ℚ_[p] E] + {Gamma : Type v} [LinearOrderedCommGroupWithZero Gamma] + (wE : _root_.Valuation E Gamma) + [(LocalFieldTheory.localCompleteDVF ℚ_[p]).valuation.HasExtension wE] : + (padicLocalField p).toCompleteDVF.valuation.HasExtension wE := + ValuationTheory.DiscreteValuationField.ValuedExtension.hasExtension_of_isEquiv_base + (padicLocalField_valuation_isEquiv_localCompleteDVF p) + +/-- Conversely, any valuation extension of the valuation selected by +`padicLocalField p` is also an extension of the canonical complete-DVF +valuation on `ℚ_[p]`. -/ +theorem localCompleteDVFValuation_hasExtension_of_padicLocalField + (p : ℕ) [Fact p.Prime] + {E : Type u} [Field E] [Algebra ℚ_[p] E] + {Gamma : Type v} [LinearOrderedCommGroupWithZero Gamma] + (wE : _root_.Valuation E Gamma) + [(padicLocalField p).toCompleteDVF.valuation.HasExtension wE] : + (LocalFieldTheory.localCompleteDVF ℚ_[p]).valuation.HasExtension wE := + ValuationTheory.DiscreteValuationField.ValuedExtension.hasExtension_of_isEquiv_base + (localCompleteDVF_valuation_isEquiv_padicLocalField p) + +end Qp +end Examples +end DiscreteValuationField +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PolynomialRootProximity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PolynomialRootProximity.lean new file mode 100644 index 0000000000..dbe9aca456 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PolynomialRootProximity.lean @@ -0,0 +1,152 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Polynomial.Splits +public import Mathlib.Data.Finset.Max +public import Mathlib.RingTheory.DiscreteValuationRing.Basic +/-! +# A root-proximity estimate over a discrete valuation ring + +If a monic polynomial splits over a discrete valuation ring, one of its +roots is at least as close to a given point as the polynomial value, after +accounting for the derivative at that root. The proof selects a root of +maximal additive valuation and compares the remaining factors by the +ultrametric inequality. + +Repeated roots and zero derivative values are allowed; the statement is in +`ℕ∞`, so the estimate also covers infinite additive valuations. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +universe u + +namespace Polynomial.Splits + +private theorem addVal_multiset_prod_le + {R : Type u} [CommRing R] [IsDomain R] [IsDiscreteValuationRing R] + {α : Type*} (s : Multiset α) (f g : α → R) + (h : + ∀ z ∈ s, + IsDiscreteValuationRing.addVal R (f z) ≤ + IsDiscreteValuationRing.addVal R (g z)) : + IsDiscreteValuationRing.addVal R ((s.map f).prod) ≤ + IsDiscreteValuationRing.addVal R ((s.map g).prod) := by + induction s using Multiset.induction_on with + | empty => + simp + | @cons z s ih => + rw [Multiset.map_cons, Multiset.prod_cons, + Multiset.map_cons, Multiset.prod_cons, + IsDiscreteValuationRing.addVal_mul, + IsDiscreteValuationRing.addVal_mul] + apply add_le_add + · exact h z (by simp) + · apply ih + intro t ht + exact h t (by simp [ht]) + +/-- Let `p` be a nonconstant monic polynomial that splits over a discrete +valuation ring. For every `x`, some root `y` satisfies + +`v(p(x)) ≤ v(x - y) + v(p'(y))`. + +Choosing `y` with maximal `v(x-y)` makes every other factor `x-z` no deeper +than `y-z`; multiplying those inequalities gives the result. -/ +theorem exists_root_addVal_eval_le_sub_add_derivative + {R : Type u} [CommRing R] [IsDomain R] [IsDiscreteValuationRing R] + (p : R[X]) (hs : p.Splits) (hm : p.Monic) + (hdeg : p.natDegree ≠ 0) (x : R) : + ∃ y, y ∈ p.roots ∧ + IsDiscreteValuationRing.addVal R (p.eval x) ≤ + IsDiscreteValuationRing.addVal R (x - y) + + IsDiscreteValuationRing.addVal R (p.derivative.eval y) := by + classical + have hroots : p.roots ≠ 0 := by + intro hzero + apply hdeg + simpa [hzero] using hs.natDegree_eq_card_roots + obtain ⟨y, hy, hymax⟩ := + Multiset.exists_max_image + (s := p.roots) + (fun z => IsDiscreteValuationRing.addVal R (x - z)) hroots + have hfactor : + ∀ z ∈ p.roots.erase y, + IsDiscreteValuationRing.addVal R (x - z) ≤ + IsDiscreteValuationRing.addVal R (y - z) := by + intro z hz + have hzroot : z ∈ p.roots := + Multiset.mem_of_mem_erase hz + have hmax : + IsDiscreteValuationRing.addVal R (x - z) ≤ + IsDiscreteValuationRing.addVal R (x - y) := + hymax z hzroot + have hneg : + IsDiscreteValuationRing.addVal R (y - x) = + IsDiscreteValuationRing.addVal R (x - y) := by + have hsub : y - x = -(x - y) := by ring + rw [hsub, (IsDiscreteValuationRing.addVal R).map_neg] + have hmax' : + IsDiscreteValuationRing.addVal R (x - z) ≤ + IsDiscreteValuationRing.addVal R (y - x) := by + rw [hneg] + exact hmax + have hultra := + IsDiscreteValuationRing.addVal_add + (R := R) (a := y - x) (b := x - z) + have hsum : (y - x) + (x - z) = y - z := by + ring + rw [min_eq_right hmax', hsum] at hultra + exact hultra + have hprod : + IsDiscreteValuationRing.addVal R + (((p.roots.erase y).map (x - ·)).prod) ≤ + IsDiscreteValuationRing.addVal R + (((p.roots.erase y).map (y - ·)).prod) := + addVal_multiset_prod_le (p.roots.erase y) + (x - ·) (y - ·) hfactor + have hroot_prod : + ((p.roots.map (x - ·)).prod) = + (x - y) * (((p.roots.erase y).map (x - ·)).prod) := by + calc + ((p.roots.map (x - ·)).prod) = + (((y ::ₘ p.roots.erase y).map (x - ·)).prod) := + congrArg (fun s : Multiset R => (s.map (x - ·)).prod) + (Multiset.cons_erase hy).symm + _ = (x - y) * (((p.roots.erase y).map (x - ·)).prod) := by + rw [Multiset.map_cons, Multiset.prod_cons] + refine ⟨y, hy, ?_⟩ + calc + IsDiscreteValuationRing.addVal R (p.eval x) = + IsDiscreteValuationRing.addVal R + ((p.roots.map (x - ·)).prod) := by + rw [hs.eval_eq_prod_roots_of_monic hm] + _ = + IsDiscreteValuationRing.addVal R (x - y) + + IsDiscreteValuationRing.addVal R + (((p.roots.erase y).map (x - ·)).prod) := by + rw [hroot_prod, IsDiscreteValuationRing.addVal_mul] + _ ≤ + IsDiscreteValuationRing.addVal R (x - y) + + IsDiscreteValuationRing.addVal R + (((p.roots.erase y).map (y - ·)).prod) := + add_le_add (le_refl _) hprod + _ = + IsDiscreteValuationRing.addVal R (x - y) + + IsDiscreteValuationRing.addVal R + (p.derivative.eval y) := by + rw [hs.eval_root_derivative hm hy] + +end Polynomial.Splits + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PowerIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PowerIndex.lean new file mode 100644 index 0000000000..a28109cbc1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PowerIndex.lean @@ -0,0 +1,1070 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.PowerIndex +/-! +# Power-index computations for complete discrete valuation fields + +This LubinTate consumer specializes the public commutative-group power-index +API to the unit and principal-unit decompositions of a complete discrete +valuation field. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + card_principalUnitSubquotient_one_eq_residue_pow_of_uniformizer → + card_principalUnitSubquotient_one_eq_residue_pow_of_uniformizer + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + fieldUnitDecompositionFactors → + fieldUnitDecompositionFactors + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + finite_principalUnitSubquotient_of_finite_residue → + finite_principalUnitSubquotient_of_finite_residue + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + residueRootsOfUnityEquivResidueFieldUnits → + residueRootsOfUnityEquivResidueFieldUnits + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + residueRootsOfUnityGroup → + residueRootsOfUnityGroup + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + toPrincipalUnitFiltration → + toPrincipalUnitFiltration + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + valuationSubringUnitsEquivRootsTimesPrincipalUnits → + valuationSubringUnitsEquivRootsTimesPrincipalUnits + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF → + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + + +noncomputable +section + +open ValuationTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory + +namespace LocalFieldTheory.DiscreteValuationField + +section CompleteDVF + +universe u v + +variable {K : Type u} [Field K] + +/-- The Teichmüller root factor is finite because it is equivalent to the +unit group of the finite residue field. -/ +noncomputable instance finite_residueRootsOfUnityGroup + (F : CompleteDVF.{u, v} K) [Finite F.residueField] : + Finite + (residueRootsOfUnityGroup F) := + Finite.of_equiv F.residueFieldˣ + (residueRootsOfUnityEquivResidueFieldUnits + F).symm.toEquiv + +/-- A nonzero power has only finitely many roots in the valuation-ring unit +group, by injectivity of `O_Kˣ → Kˣ`. -/ +noncomputable instance finite_valuationSubringUnits_nthPowerKernel + (F : CompleteDVF.{u, v} K) (n : ℕ) [NeZero n] : + Finite ((powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).ker) := by + apply LocalFieldTheory.finite_nthPowerKernel_of_injective F.valuationSubringˣ Kˣ n + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.valuationSubringUnitsToFieldUnits F) + intro a b hab + apply Units.ext + apply Subtype.ext + simpa only [CompleteDVF.coe_valuationSubringUnitsToFieldUnits_apply] using + congrArg (fun z : Kˣ => (z : K)) hab + +/-- A nonzero power has finite kernel on the first principal-unit subgroup. -/ +noncomputable instance finite_principalUnits_nthPowerKernel + (F : CompleteDVF.{u, v} K) (n : ℕ) [NeZero n] : + Finite + ((powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) →* + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).ker) := by + apply LocalFieldTheory.finite_nthPowerKernel_of_injective + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + F.valuationSubringˣ n + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1).subtype + exact Subtype.val_injective + +/-- Finiteness of the principal-unit power quotient implies finiteness of +the full valuation-ring unit quotient through the root/principal product +decomposition. -/ +noncomputable instance finite_valuationSubringUnits_nthPowerQuotient + (F : CompleteDVF.{u, v} K) [Finite F.residueField] (n : ℕ) + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] : + Finite (F.valuationSubringˣ ⧸ (powMonoidHom n : F.valuationSubringˣ →* + F.valuationSubringˣ).range) := by + let e : + F.valuationSubringˣ ≃* + residueRootsOfUnityGroup F × + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 := + (valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).symm + exact LocalFieldTheory.finite_nthPowerQuotient_of_mulEquiv + F.valuationSubringˣ + (residueRootsOfUnityGroup F × + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + n e + +/-- Finiteness of the principal-unit power quotient, together with a chosen +uniformizer, explicitly yields finiteness of the full field-unit quotient. +This remains a constructor rather than a global instance so the analytic +finite boundary stays visible to callers. -/ +theorem finite_fieldUnits_nthPowerQuotient_of_finite_principalUnits + (F : CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (n : ℕ) [NeZero n] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] : + Finite (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range) := by + let eField : + fieldUnitDecompositionFactors F ≃* + Kˣ := + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ + let eUnits : + residueRootsOfUnityGroup F × + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + F.valuationSubringˣ := + valuationSubringUnitsEquivRootsTimesPrincipalUnits + F + let e : + Kˣ ≃* F.valuationSubringˣ × Multiplicative ℤ := + eField.symm.trans + (MulEquiv.prodCongr eUnits (MulEquiv.refl (Multiplicative ℤ))) + exact LocalFieldTheory.finite_nthPowerQuotient_of_mulEquiv_units_prod_int + Kˣ F.valuationSubringˣ e + +/-- The local-field power-index formula, first equality: after choosing a +uniformizer, the field-unit `n`-th-power quotient has the unit quotient as a +factor and the uniformizer direction contributes exactly `n`. -/ +theorem card_fieldUnits_nthPowerQuotient_eq_mul_unit_nthPowerQuotient + (F : CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (n : ℕ) [NeZero n] + [Finite (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range)] + [Finite (F.valuationSubringˣ ⧸ (powMonoidHom n : F.valuationSubringˣ →* + F.valuationSubringˣ).range)] : + Nat.card (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range) = + n * Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) := by + let eField : + fieldUnitDecompositionFactors F ≃* + Kˣ := + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ + let eUnits : + residueRootsOfUnityGroup F × + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + F.valuationSubringˣ := + valuationSubringUnitsEquivRootsTimesPrincipalUnits + F + let e : + Kˣ ≃* F.valuationSubringˣ × Multiplicative ℤ := + eField.symm.trans + (MulEquiv.prodCongr eUnits (MulEquiv.refl (Multiplicative ℤ))) + exact + LocalFieldTheory.card_nthPowerQuotient_eq_mul_of_mulEquiv_units_prod_int + Kˣ F.valuationSubringˣ (NeZero.ne n) e + +/-- The local-field power-index formula, unit-decomposition reduction: the unit +`n`-th-power quotient splits into the residue root-of-unity factor and the +first principal-unit factor. -/ +theorem card_unit_nthPowerQuotient_eq_mul_roots_principalUnit_nthPowerQuotient + (F : CompleteDVF.{u, v} K) [Finite F.residueField] (n : ℕ) + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] : + Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) = + Nat.card + (residueRootsOfUnityGroup F ⧸ + (powMonoidHom n : + (residueRootsOfUnityGroup F) →* (residueRootsOfUnityGroup F)).range) * + Nat.card + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1) →* + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range) := by + let e : + F.valuationSubringˣ ≃* + residueRootsOfUnityGroup F × + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 := + (valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).symm + exact + LocalFieldTheory.card_nthPowerQuotient_eq_mul_of_mulEquiv_prod + F.valuationSubringˣ + (residueRootsOfUnityGroup F) + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) n e + +/-- On the finite Teichmuller root factor, the `n`-th-power quotient has the +same size as the subgroup killed by `n`. -/ +theorem card_residueRoots_nthPowerQuotient_eq_nthPowerKernel + (F : CompleteDVF.{u, v} K) [Finite F.residueField] (n : ℕ) : + Nat.card + (residueRootsOfUnityGroup F ⧸ + (powMonoidHom n : + (residueRootsOfUnityGroup F) →* (residueRootsOfUnityGroup F)).range) = + Nat.card + ((powMonoidHom n : + (residueRootsOfUnityGroup F) →* (residueRootsOfUnityGroup F)).ker) := by + classical + let e : + residueRootsOfUnityGroup F ≃* + F.residueFieldˣ := + residueRootsOfUnityEquivResidueFieldUnits + F + have : + Finite + (residueRootsOfUnityGroup F) := + Finite.of_equiv F.residueFieldˣ e.symm.toEquiv + exact + LocalFieldTheory.card_nthPowerQuotient_eq_nthPowerKernel + (residueRootsOfUnityGroup F) n + +/-- The `n`-torsion kernel of the full unit group splits into the finite +Teichmuller root factor and the first principal-unit factor. -/ +theorem card_unit_nthPowerKernel_eq_mul_roots_principalUnit_nthPowerKernel + (F : CompleteDVF.{u, v} K) [Finite F.residueField] (n : ℕ) [NeZero n] : + Nat.card + ((powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).ker) = + Nat.card + ((powMonoidHom n : + (residueRootsOfUnityGroup F) →* (residueRootsOfUnityGroup F)).ker) * + Nat.card + ((powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).ker) := by + let e : + F.valuationSubringˣ ≃* + residueRootsOfUnityGroup F × + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 := + (valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).symm + exact + LocalFieldTheory.card_nthPowerKernel_eq_mul_of_mulEquiv_prod + F.valuationSubringˣ + (residueRootsOfUnityGroup F) + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) n e + +/-- For nonzero `n`, the field-unit `n`-torsion kernel is the unit +`n`-torsion kernel; the uniformizer direction has no nontrivial finite +`n`-torsion. -/ +theorem card_fieldUnits_nthPowerKernel_eq_unit_nthPowerKernel + (F : CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (n : ℕ) [NeZero n] : + Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) = + Nat.card ((powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).ker) := by + let eField : + fieldUnitDecompositionFactors F ≃* + Kˣ := + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + F hπ + let eUnits : + residueRootsOfUnityGroup F × + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + F.valuationSubringˣ := + valuationSubringUnitsEquivRootsTimesPrincipalUnits + F + let e : + Kˣ ≃* F.valuationSubringˣ × Multiplicative ℤ := + eField.symm.trans + (MulEquiv.prodCongr eUnits (MulEquiv.refl (Multiplicative ℤ))) + exact + LocalFieldTheory.card_nthPowerKernel_eq_of_mulEquiv_units_prod_int + Kˣ F.valuationSubringˣ (NeZero.ne n) e + +/-- For nonzero `n`, the field-unit `n`-torsion kernel is the product of the +Teichmuller `n`-torsion kernel and the first principal-unit `n`-torsion +kernel. This is the group-theoretic `μ_n(K)` decomposition behind +the local-field power-index formula. -/ +theorem card_fieldUnits_nthPowerKernel_eq_mul_roots_principalUnit_nthPowerKernel + (F : CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (n : ℕ) [NeZero n] : + Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) = + Nat.card + ((powMonoidHom n : + (residueRootsOfUnityGroup F) →* (residueRootsOfUnityGroup F)).ker) * + Nat.card + ((powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).ker) := by + rw [card_fieldUnits_nthPowerKernel_eq_unit_nthPowerKernel + (F := F) hπ n] + rw [card_unit_nthPowerKernel_eq_mul_roots_principalUnit_nthPowerKernel + (F := F) n] + +/-- The local-field power-index formula, unit-index reduction after identifying the finite +root-of-unity quotient with its `n`-torsion kernel. The remaining analytic +input is the principal-unit factor, supplied by the field-unit structure theorem. -/ +theorem card_unit_nthPowerQuotient_eq_mul_rootsKernel_principalUnit_nthPowerQuotient + (F : CompleteDVF.{u, v} K) [Finite F.residueField] (n : ℕ) + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] : + Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) = + Nat.card + ((powMonoidHom n : + (residueRootsOfUnityGroup F) →* (residueRootsOfUnityGroup F)).ker) * + Nat.card + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1) →* + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range) := by + rw [card_unit_nthPowerQuotient_eq_mul_roots_principalUnit_nthPowerQuotient, + card_residueRoots_nthPowerQuotient_eq_nthPowerKernel] + +/-- The local-field power-index formula, unit-index form reduced to the analytic principal-unit +input. If the field-unit structure theorem supplies the principal-unit quotient as its +`n`-torsion kernel times a defect factor `c`, then the same defect multiplies +the full unit `n`-torsion kernel. -/ +theorem card_unit_nthPowerQuotient_eq_mul_unitKernel_of_principalUnit_index + (F : CompleteDVF.{u, v} K) [Finite F.residueField] + {n c : ℕ} [NeZero n] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (hprincipal : + Nat.card + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1) →* + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range) = + Nat.card + ((powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).ker) * c) : + Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) = + Nat.card ((powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).ker) * c := by + rw [card_unit_nthPowerQuotient_eq_mul_rootsKernel_principalUnit_nthPowerQuotient] + rw [hprincipal] + rw [card_unit_nthPowerKernel_eq_mul_roots_principalUnit_nthPowerKernel] + ring + +/-- The local-field power-index formula, unit-index residue-power specialization. This is the +unit-index formula once the analytic principal-unit input identifies the +defect factor with the appropriate residue-cardinality power. -/ +theorem card_unit_nthPowerQuotient_eq_mul_unitKernel_residue_pow + (F : CompleteDVF.{u, v} K) [Finite F.residueField] + {n a : ℕ} [NeZero n] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (hprincipal : + Nat.card + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1) →* + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range) = + Nat.card + ((powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).ker) * + Nat.card F.residueField ^ a) : + Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) = + Nat.card ((powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).ker) * + Nat.card F.residueField ^ a := + card_unit_nthPowerQuotient_eq_mul_unitKernel_of_principalUnit_index + (F := F) hprincipal + +/-- Unit-index form with the kernel rewritten as the full field-unit +`n`-torsion kernel. For nonzero `n`, the uniformizer direction contributes no +torsion, so this is the exact kernel appearing in the local-field power-index formula. -/ +theorem card_unit_nthPowerQuotient_eq_mul_fieldKernel_of_principalUnit_index + (F : CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + {n c : ℕ} [NeZero n] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (hprincipal : + Nat.card + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1) →* + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range) = + Nat.card + ((powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).ker) * c) : + Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) = + Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) * c := by + rw [card_unit_nthPowerQuotient_eq_mul_unitKernel_of_principalUnit_index + (F := F) hprincipal] + rw [card_fieldUnits_nthPowerKernel_eq_unit_nthPowerKernel + (F := F) hπ n] + +/-- Residue-power specialization of the unit-index formula with the kernel +written as the full field-unit `n`-torsion kernel. -/ +theorem card_unit_nthPowerQuotient_eq_mul_fieldKernel_residue_pow + (F : CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + {n a : ℕ} [NeZero n] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (hprincipal : + Nat.card + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1) →* + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range) = + Nat.card + ((powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).ker) * + Nat.card F.residueField ^ a) : + Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) = + Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) * + Nat.card F.residueField ^ a := + card_unit_nthPowerQuotient_eq_mul_fieldKernel_of_principalUnit_index + (F := F) hπ hprincipal + +/-- The local-field power-index formula, field-unit index reduced to the finite root factor and the +principal-unit factor. The uniformizer contributes `n`; the finite +root-of-unity factor is already expressed as its `n`-torsion kernel. -/ +theorem card_fieldUnits_nthPowerQuotient_eq_mul_rootsKernel_principalUnit_nthPowerQuotient + (F : CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (n : ℕ) [NeZero n] + [Finite (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range)] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] : + Nat.card (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range) = + n * + (Nat.card + ((powMonoidHom n : + (residueRootsOfUnityGroup F) →* (residueRootsOfUnityGroup F)).ker) * + Nat.card + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F) 1) →* + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F) 1)).range)) := by + rw [card_fieldUnits_nthPowerQuotient_eq_mul_unit_nthPowerQuotient + (F := F) hπ n] + rw [card_unit_nthPowerQuotient_eq_mul_rootsKernel_principalUnit_nthPowerQuotient + (F := F) n] + +/-- Principal-unit index reduction from an explicit `n`-th-power image level: +if the `n`-th powers in `U^1` are exactly `U^m`, then the principal-unit +`n`-th-power quotient has the same cardinality as `U^1/U^m`. -/ +theorem card_principalUnit_nthPowerQuotient_eq_subquotient_of_image_eq + (F : CompleteDVF.{u, v} K) (n m : ℕ) + [Finite + ((toPrincipalUnitFiltration F).principalUnitSubquotient + 1 m)] + (hpow : + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) →* + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range = + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + m).subgroupOf + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)) : + Nat.card + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range) = + Nat.card + ((toPrincipalUnitFiltration F).principalUnitSubquotient + 1 m) := by + let U := + toPrincipalUnitFiltration + F + let : Finite + (U.principalUnitSubgroup 1 ⧸ + (U.principalUnitSubgroup m).subgroupOf + (U.principalUnitSubgroup 1)) := + Finite.of_equiv (U.principalUnitSubquotient 1 m) + (U.principalUnitSubquotientConcreteEquiv 1 m).toEquiv + calc + Nat.card + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range) = + Nat.card + (U.principalUnitSubgroup 1 ⧸ + (U.principalUnitSubgroup m).subgroupOf + (U.principalUnitSubgroup 1)) := by + exact Nat.card_congr + (QuotientGroup.quotientMulEquivOfEq hpow).toEquiv + _ = Nat.card (U.principalUnitSubquotient 1 m) := + Nat.card_congr + (U.principalUnitSubquotientConcreteEquiv 1 m).symm.toEquiv + +/-- Cardinality form of the preceding reduction after the finite-filtration +counting of `U^1/U^m`: once the analytic input identifies the image of the +`n`-th-power map on `U^1` with `U^m`, the quotient has size `#k^(m-1)`. -/ +theorem card_principalUnit_nthPowerQuotient_eq_residue_pow_of_image_eq + (F : CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + {n m : ℕ} (hm : 1 ≤ m) + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (hpow : + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) →* + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range = + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + m).subgroupOf + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)) : + Nat.card + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range) = + Nat.card F.residueField ^ (m - 1) := by + let : Finite + ((toPrincipalUnitFiltration F).principalUnitSubquotient + 1 m) := + finite_principalUnitSubquotient_of_finite_residue + F 1 m + rw [card_principalUnit_nthPowerQuotient_eq_subquotient_of_image_eq + (F := F) n m hpow] + exact + card_principalUnitSubquotient_one_eq_residue_pow_of_uniformizer + F hπ hm + +/-- The field-unit structure theorem logarithmic transport, principal-unit form: any +multiplicative logarithm equivalence from `U¹` to an additive group identifies +the principal-unit `n`-th-power quotient with the additive quotient by +`n`-fold multiples. -/ +theorem card_principalUnit_nthPowerQuotient_eq_additive_nsmulQuotient_of_logEquiv + (F : CompleteDVF.{u, v} K) + (A : Type*) [AddCommGroup A] + (n : ℕ) + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + [Finite (A ⧸ LocalFieldTheory.nsmulAddSubgroup A n)] + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative A) : + Nat.card + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range) = + Nat.card (A ⧸ LocalFieldTheory.nsmulAddSubgroup A n) := + LocalFieldTheory.card_nthPowerQuotient_eq_additive_nsmulQuotient_of_mulEquiv + (A := A) (G := (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F) 1) n e + +/-- The field-unit structure theorem logarithmic transport, kernel form: under the same +principal-unit logarithm equivalence, the principal-unit `n`-torsion kernel +has the same cardinality as the additive kernel of `x ↦ n • x`. -/ +theorem card_principalUnit_nthPowerKernel_eq_additive_nsmulKernel_of_logEquiv + (F : CompleteDVF.{u, v} K) + (A : Type*) [AddCommGroup A] + (n : ℕ) [NeZero n] + [Finite (LocalFieldTheory.nsmulAddKernel A n)] + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative A) : + Nat.card ((powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) →* + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)).ker) = + Nat.card (LocalFieldTheory.nsmulAddKernel A n) := + LocalFieldTheory.card_nthPowerKernel_eq_additive_nsmulKernel_of_mulEquiv + (A := A) (G := (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F) 1) n e + +/-- The field-unit structure theorem logarithmic transport with a named additive image: +if additive `n`-fold multiples are identified with a subgroup `B`, then the +principal-unit quotient is the corresponding additive quotient. -/ +theorem card_principalUnit_nthPowerQuotient_eq_additive_quotient_of_logEquiv_nsmulAddSubgroup_eq + (F : CompleteDVF.{u, v} K) + (A : Type*) [AddCommGroup A] + (n : ℕ) + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + [Finite (A ⧸ LocalFieldTheory.nsmulAddSubgroup A n)] + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative A) + (B : AddSubgroup A) + (hB : LocalFieldTheory.nsmulAddSubgroup A n = B) : + Nat.card + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range) = + Nat.card (A ⧸ B) := by + rw [card_principalUnit_nthPowerQuotient_eq_additive_nsmulQuotient_of_logEquiv + (F := F) (A := A) n e] + rw [hB] + +/-- The field-unit structure theorem logarithmic transport in kernel-factor form: after a +principal-unit logarithm equivalence, a finite additive kernel/cokernel +calculation immediately supplies the kernel times defect factor used by +the local-field power-index formula. -/ +theorem card_principalUnit_nthPowerQuotient_eq_mul_kernel_of_logEquiv + (F : CompleteDVF.{u, v} K) + (A : Type*) [AddCommGroup A] + (n c : ℕ) [NeZero n] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + [Finite (A ⧸ LocalFieldTheory.nsmulAddSubgroup A n)] + [Finite (LocalFieldTheory.nsmulAddKernel A n)] + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative A) + (hadd : + Nat.card (A ⧸ LocalFieldTheory.nsmulAddSubgroup A n) = + Nat.card (LocalFieldTheory.nsmulAddKernel A n) * c) : + Nat.card + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range) = + Nat.card ((powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) →* + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).ker) * c := by + rw [card_principalUnit_nthPowerQuotient_eq_additive_nsmulQuotient_of_logEquiv + (F := F) (A := A) n e] + rw [hadd] + rw [card_principalUnit_nthPowerKernel_eq_additive_nsmulKernel_of_logEquiv + (F := F) (A := A) n e] + +/-- The field-unit structure theorem logarithmic transport in the residue-defect form used in +the local-field power-index formula: after a logarithm identifies `U¹` with an additive group, an +additive kernel/cokernel calculation with defect `#k^a` gives the +principal-unit kernel times the same residue-power defect. -/ +theorem card_principalUnit_nthPowerQuotient_eq_mul_kernel_residue_pow_of_logEquiv + (F : CompleteDVF.{u, v} K) + (A : Type*) [AddCommGroup A] + (n a : ℕ) [NeZero n] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + [Finite (A ⧸ LocalFieldTheory.nsmulAddSubgroup A n)] + [Finite (LocalFieldTheory.nsmulAddKernel A n)] + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative A) + (hadd : + Nat.card (A ⧸ LocalFieldTheory.nsmulAddSubgroup A n) = + Nat.card (LocalFieldTheory.nsmulAddKernel A n) * Nat.card F.residueField ^ a) : + Nat.card + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range) = + Nat.card ((powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) →* + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)).ker) * + Nat.card F.residueField ^ a := + card_principalUnit_nthPowerQuotient_eq_mul_kernel_of_logEquiv + (F := F) (A := A) n (Nat.card F.residueField ^ a) e hadd + +/-- The field-unit structure theorem defect-level wrapper in the kernel-factor form needed by +the local-field power-index formula, in the common case where the principal-unit `n`-torsion kernel +is trivial. The remaining input is the analytic image calculation +`(U¹)^n = U^(a+1)`. -/ +theorem card_principalUnit_nthPowerQuotient_eq_mul_kernel_residue_pow_of_image_eq_succ_of_kernel_one + (F : CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + {n a : ℕ} + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (hkernel : + Nat.card + ((powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).ker) = 1) + (hpow : + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) →* + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range = + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (a + + 1)).subgroupOf + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)) : + Nat.card + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range) = + Nat.card + ((powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).ker) * + Nat.card F.residueField ^ a := by + rw [hkernel, one_mul] + simpa using + card_principalUnit_nthPowerQuotient_eq_residue_pow_of_image_eq + (F := F) hπ (n := n) (m := a + 1) + (Nat.succ_le_succ (Nat.zero_le a)) hpow + +/-- The local-field power-index formula unit-index specialization from an explicit principal-unit +image level and a trivial principal-unit `n`-torsion kernel. -/ +theorem PowerIndex.unitQuotient_residuePow_of_principalImage + (F : CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + {n a : ℕ} [NeZero n] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (hkernel : + Nat.card + ((powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).ker) = 1) + (hpow : + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) →* + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range = + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (a + + 1)).subgroupOf + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)) : + Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) = + Nat.card ((powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).ker) * + Nat.card F.residueField ^ a := + card_unit_nthPowerQuotient_eq_mul_unitKernel_residue_pow + (F := F) + (hprincipal := + card_principalUnit_nthPowerQuotient_eq_mul_kernel_residue_pow_of_image_eq_succ_of_kernel_one + (F := F) hπ (n := n) (a := a) hkernel hpow) + +/-- The local-field power-index formula, unit-index form fed directly by a principal-unit logarithm +equivalence and an additive kernel/cokernel calculation. -/ +theorem card_unit_nthPowerQuotient_eq_mul_unitKernel_of_logEquiv + (F : CompleteDVF.{u, v} K) [Finite F.residueField] + (A : Type*) [AddCommGroup A] + {n c : ℕ} [NeZero n] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + [Finite (A ⧸ LocalFieldTheory.nsmulAddSubgroup A n)] + [Finite (LocalFieldTheory.nsmulAddKernel A n)] + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative A) + (hadd : + Nat.card (A ⧸ LocalFieldTheory.nsmulAddSubgroup A n) = + Nat.card (LocalFieldTheory.nsmulAddKernel A n) * c) : + Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) = + Nat.card ((powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).ker) * c := + card_unit_nthPowerQuotient_eq_mul_unitKernel_of_principalUnit_index + (F := F) + (hprincipal := + card_principalUnit_nthPowerQuotient_eq_mul_kernel_of_logEquiv + (F := F) (A := A) n c e hadd) + +/-- The local-field power-index formula, residue-power unit-index form fed directly by a +principal-unit logarithm equivalence. -/ +theorem card_unit_nthPowerQuotient_eq_mul_unitKernel_residue_pow_of_logEquiv + (F : CompleteDVF.{u, v} K) [Finite F.residueField] + (A : Type*) [AddCommGroup A] + {n a : ℕ} [NeZero n] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + [Finite (A ⧸ LocalFieldTheory.nsmulAddSubgroup A n)] + [Finite (LocalFieldTheory.nsmulAddKernel A n)] + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative A) + (hadd : + Nat.card (A ⧸ LocalFieldTheory.nsmulAddSubgroup A n) = + Nat.card (LocalFieldTheory.nsmulAddKernel A n) * Nat.card F.residueField ^ a) : + Nat.card (F.valuationSubringˣ ⧸ + (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) = + Nat.card ((powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).ker) * + Nat.card F.residueField ^ a := + card_unit_nthPowerQuotient_eq_mul_unitKernel_of_logEquiv + (F := F) (A := A) (n := n) (c := Nat.card F.residueField ^ a) e hadd + +/-- The local-field power-index formula reduced to the analytic principal-unit index statement. +If the field-unit structure theorem supplies the principal-unit quotient as its `n`-torsion +kernel times a defect factor `c`, then the field-unit quotient is `n` times +the field-unit `n`-torsion kernel times the same defect. -/ +theorem card_fieldUnits_nthPowerQuotient_eq_mul_fieldKernel_of_principalUnit_index + (F : CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + {n c : ℕ} [NeZero n] + [Finite (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range)] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (hprincipal : + Nat.card + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1) →* + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range) = + Nat.card + ((powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).ker) * c) : + Nat.card (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range) = + n * (Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) * c) := by + rw [card_fieldUnits_nthPowerQuotient_eq_mul_rootsKernel_principalUnit_nthPowerQuotient + (F := F) hπ n] + rw [hprincipal] + rw [card_fieldUnits_nthPowerKernel_eq_mul_roots_principalUnit_nthPowerKernel + (F := F) hπ n] + ring + +/-- The local-field power-index formula, field-index form fed directly by a principal-unit logarithm +equivalence and an additive kernel/cokernel calculation. -/ +theorem card_fieldUnits_nthPowerQuotient_eq_mul_fieldKernel_of_logEquiv + (F : CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (A : Type*) [AddCommGroup A] + {n c : ℕ} [NeZero n] + [Finite (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range)] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + [Finite (A ⧸ LocalFieldTheory.nsmulAddSubgroup A n)] + [Finite (LocalFieldTheory.nsmulAddKernel A n)] + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative A) + (hadd : + Nat.card (A ⧸ LocalFieldTheory.nsmulAddSubgroup A n) = + Nat.card (LocalFieldTheory.nsmulAddKernel A n) * c) : + Nat.card (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range) = + n * (Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) * c) := + card_fieldUnits_nthPowerQuotient_eq_mul_fieldKernel_of_principalUnit_index + (F := F) hπ + (hprincipal := + card_principalUnit_nthPowerQuotient_eq_mul_kernel_of_logEquiv + (F := F) (A := A) n c e hadd) + +/-- The local-field power-index formula in the residue-power defect form expected from +the field-unit structure theorem: once the principal-unit quotient is known to be its +`n`-torsion kernel times `#k^a`, the field-unit quotient has the same defect +factor and the additional uniformizer factor `n`. -/ +theorem card_fieldUnits_nthPowerQuotient_eq_mul_fieldKernel_residue_pow + (F : CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + {n a : ℕ} [NeZero n] + [Finite (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range)] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (hprincipal : + Nat.card + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1) →* + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range) = + Nat.card + ((powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).ker) * + Nat.card F.residueField ^ a) : + Nat.card (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range) = + n * + (Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) * + Nat.card F.residueField ^ a) := + card_fieldUnits_nthPowerQuotient_eq_mul_fieldKernel_of_principalUnit_index + (F := F) hπ hprincipal + +/-- The local-field power-index formula, residue-power field-index form fed directly by a +principal-unit logarithm equivalence. This is the public bridge from the +additive principal-unit calculation to the final field-unit index formula. -/ +theorem card_fieldUnits_nthPowerQuotient_eq_mul_fieldKernel_residue_pow_of_logEquiv + (F : CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (A : Type*) [AddCommGroup A] + {n a : ℕ} [NeZero n] + [Finite (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range)] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + [Finite (A ⧸ LocalFieldTheory.nsmulAddSubgroup A n)] + [Finite (LocalFieldTheory.nsmulAddKernel A n)] + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative A) + (hadd : + Nat.card (A ⧸ LocalFieldTheory.nsmulAddSubgroup A n) = + Nat.card (LocalFieldTheory.nsmulAddKernel A n) * Nat.card F.residueField ^ a) : + Nat.card (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range) = + n * + (Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) * + Nat.card F.residueField ^ a) := + card_fieldUnits_nthPowerQuotient_eq_mul_fieldKernel_of_logEquiv + (F := F) hπ (A := A) (n := n) (c := Nat.card F.residueField ^ a) + e hadd + +/-- The local-field power-index formula field-index specialization from an explicit principal-unit +image level and a trivial principal-unit `n`-torsion kernel. -/ +theorem PowerIndex.fieldQuotient_residuePow_of_principalImage + (F : CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + {n a : ℕ} [NeZero n] + [Finite (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range)] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range)] + (hkernel : + Nat.card + ((powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).ker) = 1) + (hpow : + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) →* + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range = + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (a + + 1)).subgroupOf + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)) : + Nat.card (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range) = + n * + (Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) * + Nat.card F.residueField ^ a) := + card_fieldUnits_nthPowerQuotient_eq_mul_fieldKernel_residue_pow + (F := F) hπ + (hprincipal := + card_principalUnit_nthPowerQuotient_eq_mul_kernel_residue_pow_of_image_eq_succ_of_kernel_one + (F := F) hπ (n := n) (a := a) hkernel hpow) + +end CompleteDVF + +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitInverseLimitSurjectivity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitInverseLimitSurjectivity.lean new file mode 100644 index 0000000000..f90485ff82 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitInverseLimitSurjectivity.lean @@ -0,0 +1,166 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.Core +/-! +# Compact surjectivity criterion for the principal-unit inverse limit + +This is the compactness step in the local-field structure theory, the equal-characteristic + field-unit structure theorem. +For a map from a compact space to the inverse limit +`lim U^1 / U^(n+1)`, surjectivity on every finite coordinate implies +surjectivity on the inverse limit. Indeed, the fibers over the coordinates +of a fixed target form a decreasing sequence of nonempty compact closed sets. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w + +open LocalFieldTheory.DiscreteValuationField + +namespace LocalFieldTheory.DiscreteValuationField +namespace CompleteDVF +namespace higherPrincipalUnitGroup + +open Internal + +variable {K : Type u} [Field K] + +/-- A continuous map from a compact space to the principal-unit inverse limit +is surjective as soon as all of its finite-coordinate maps are surjective. + +The finite quotients carry the discrete topology. Compatibility makes the +fiber over coordinate `n + 1` a subset of the fiber over coordinate `n`, so +Cantor's intersection theorem supplies a simultaneous preimage of all +coordinates. -/ +theorem Internal.surjective_principalUnitInverseLimitCarrier_of_surjective_coordinates + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + {A : Type w} [TopologicalSpace A] [CompactSpace A] + (g : A → Internal.principalUnitInverseLimitCarrier F) : + letI : (n : ℕ) → TopologicalSpace (Internal.principalUnitQuotientCarrier F n) := + fun _ => ⊥ + Continuous g → + (∀ n, Function.Surjective (fun a : A => (g a).1 n)) → + Function.Surjective g := by + let : (n : ℕ) → TopologicalSpace (Internal.principalUnitQuotientCarrier F n) := + fun _ => ⊥ + let : (n : ℕ) → DiscreteTopology (Internal.principalUnitQuotientCarrier F n) := + fun _ => ⟨rfl⟩ + intro hg hsur y + let C : ℕ → Set A := fun n => {a | (g a).1 n = y.1 n} + have hcoord : ∀ n, Continuous (fun a : A => (g a).1 n) := by + intro n + exact ((continuous_apply n).comp continuous_subtype_val).comp hg + have hclosed : ∀ n, IsClosed (C n) := by + intro n + exact isClosed_eq (hcoord n) continuous_const + have hnonempty : ∀ n, (C n).Nonempty := by + intro n + obtain ⟨a, ha⟩ := hsur n (y.1 n) + exact ⟨a, ha⟩ + have hdecreasing : ∀ n, C (n + 1) ⊆ C n := by + intro n a ha + change (g a).1 n = y.1 n + calc + (g a).1 n = + principalUnitQuotientCarrierTransition F (Nat.le_succ n) + ((g a).1 (n + 1)) := ((g a).2 (Nat.le_succ n)).symm + _ = principalUnitQuotientCarrierTransition F (Nat.le_succ n) + (y.1 (n + 1)) := congrArg + (principalUnitQuotientCarrierTransition F (Nat.le_succ n)) ha + _ = y.1 n := y.2 (Nat.le_succ n) + have hintersection : (⋂ n, C n).Nonempty := + IsCompact.nonempty_iInter_of_sequence_nonempty_isCompact_isClosed + C hdecreasing hnonempty (hclosed 0).isCompact hclosed + obtain ⟨a, ha⟩ := hintersection + refine ⟨a, ?_⟩ + apply Subtype.ext + funext n + exact Set.mem_iInter.mp ha n + +/-- Additive-tag version of +`surjective_principalUnitInverseLimitCarrier_of_surjective_coordinates`, in +the form used by + Iwasawa's additive homomorphism in the equal-characteristic field-unit structure theorem. -/ +theorem Internal.surjective_additive_principalUnitInverseLimitCarrier_of_surjective_coordinates + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + {A : Type w} [TopologicalSpace A] [CompactSpace A] + (g : A → Additive (Internal.principalUnitInverseLimitCarrier F)) : + letI : (n : ℕ) → TopologicalSpace (Internal.principalUnitQuotientCarrier F n) := + fun _ => ⊥ + Continuous g → + (∀ n, Function.Surjective (fun a : A => + Additive.ofMul ((Additive.toMul (g a)).1 n))) → + Function.Surjective g := by + let : (n : ℕ) → TopologicalSpace (Internal.principalUnitQuotientCarrier F n) := + fun _ => ⊥ + intro hg hsur + let gm : A → Internal.principalUnitInverseLimitCarrier F := fun a => + Additive.toMul (g a) + have hgm : Continuous gm := hg + have hsurm : ∀ n, Function.Surjective (fun a : A => (gm a).1 n) := by + intro n y + obtain ⟨a, ha⟩ := hsur n (Additive.ofMul y) + exact ⟨a, Additive.ofMul.injective ha⟩ + have hgmSur : Function.Surjective gm := + Internal.surjective_principalUnitInverseLimitCarrier_of_surjective_coordinates + F gm hgm hsurm + intro y + obtain ⟨a, ha⟩ := hgmSur (Additive.toMul y) + exact ⟨a, Additive.toMul.injective ha⟩ + +/-- Type-safe compact surjectivity criterion for the prodiscrete +principal-unit limit. Both the inverse-limit topology and the discrete +coordinate topologies are part of the codomain types. -/ +theorem Internal.surjective_principalUnitProdiscreteLimit_of_surjective_coordinates + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + {A : Type w} [TopologicalSpace A] [CompactSpace A] + (g : A → PrincipalUnitProdiscreteLimit F) + (hg : Continuous g) + (hsur : ∀ n, Function.Surjective fun a : A => + PrincipalUnitProdiscreteLimit.coordinate F n (g a)) : + Function.Surjective g := by + let : (n : ℕ) → TopologicalSpace (Internal.principalUnitQuotientCarrier F n) := + fun _ => ⊥ + let e := Internal.principalUnitProdiscreteLimitHomeomorphUnderlying F + let gCarrier : A → Additive (Internal.principalUnitInverseLimitCarrier F) := fun a => + e (g a) + have hgCarrier : Continuous gCarrier := e.continuous.comp hg + have hsurCarrier : ∀ n, Function.Surjective fun a : A => + Additive.ofMul ((Additive.toMul (gCarrier a)).1 n) := by + intro n y + obtain ⟨a, ha⟩ := hsur n + (DiscretePrincipalUnitQuotient.of F n y) + refine ⟨a, ?_⟩ + exact congrArg DiscretePrincipalUnitQuotient.val ha + have hCarrier : Function.Surjective gCarrier := + Internal.surjective_additive_principalUnitInverseLimitCarrier_of_surjective_coordinates + F gCarrier hgCarrier hsurCarrier + intro y + obtain ⟨a, ha⟩ := hCarrier (e y) + exact ⟨a, e.injective ha⟩ + +/-- Public type-safe compact surjectivity criterion. -/ +theorem surjective_principalUnitProdiscreteLimit_of_surjective_coordinates + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + {A : Type w} [TopologicalSpace A] [CompactSpace A] + (g : A → PrincipalUnitProdiscreteLimit F) + (hg : Continuous g) + (hsur : ∀ n, Function.Surjective fun a : A => + PrincipalUnitProdiscreteLimit.coordinate F n (g a)) : + Function.Surjective g := + Internal.surjective_principalUnitProdiscreteLimit_of_surjective_coordinates + F g hg hsur + +end higherPrincipalUnitGroup +end CompleteDVF +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction.lean new file mode 100644 index 0000000000..aff2946261 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction.lean @@ -0,0 +1,22 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicPadicModule +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicProdiscreteComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.FiniteQuotientPadicModule +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitCore +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.PadicReductionContinuous +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.ProdiscretePadicModule +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.QuotientTransition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.TopologyModelTypes +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.WithZeroValuationTopology + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicPadicModule.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicPadicModule.lean new file mode 100644 index 0000000000..899e6d7123 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicPadicModule.lean @@ -0,0 +1,301 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Module.MinimalAxioms +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.ProdiscretePadicModule +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicProdiscreteComparison +/-! +# The p-adic module on adic principal units + +The coordinatewise p-adic action is transported across the canonical adic/prodiscrete +comparison, producing its linear and topological forms on first principal units. +-/ + +@[expose] public section + +noncomputable +section + +open scoped BigOperators + +universe u v + +namespace LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField +namespace CompleteDVF +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +namespace higherPrincipalUnitGroup + +open LubinTate +open LubinTate.Valuations + +variable {K : Type u} [Field K] + +open Internal + +/-- Transport the coordinatewise p-adic scalar multiplication from the +inverse limit to `U^1`. -/ +noncomputable instance principalUnitPadicSMul + (F : LocalField.{u, v} K) : + SMul ℤ_[F.residueCharacteristic] + (Additive ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1)) where + smul a x := + (principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF).symm + (a • principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF x) + +/-- +Establishes the identity `a • x = (principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF).symm +(a • principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF x)`. +-/ +@[simp] theorem principalUnitPadic_smul_def + (F : LocalField.{u, v} K) + (a : ℤ_[F.residueCharacteristic]) + (x : Additive ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1)) : + a • x = + (principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF).symm + (a • principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF x) := + rfl + +/-- The standard `Z_p`-module structure on the first principal units of a +local field. -/ +noncomputable instance principalUnitPadicModule + (F : LocalField.{u, v} K) : + Module ℤ_[F.residueCharacteristic] + (Additive ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1)) := + Module.ofMinimalAxioms + (fun (a : ℤ_[F.residueCharacteristic]) + (x y : Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1)) => by + apply (principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF).injective + simp only [principalUnitPadic_smul_def, AddEquiv.apply_symm_apply, + (principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF).map_add] + exact (principalUnitInverseLimitCarrierPadicModule F).smul_add a + (principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF x) + (principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF y)) + (fun (a b : ℤ_[F.residueCharacteristic]) + (x : Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1)) => by + apply (principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF).injective + simp only [principalUnitPadic_smul_def, AddEquiv.apply_symm_apply, + (principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF).map_add] + exact (principalUnitInverseLimitCarrierPadicModule F).add_smul a b + (principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF x)) + (fun (a b : ℤ_[F.residueCharacteristic]) + (x : Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1)) => by + apply (principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF).injective + simp only [principalUnitPadic_smul_def, AddEquiv.apply_symm_apply] + exact (principalUnitInverseLimitCarrierPadicModule F).mul_smul a b + (principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF x)) + (fun (x : Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1)) => by + apply (principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF).injective + simp only [principalUnitPadic_smul_def, AddEquiv.apply_symm_apply] + exact (principalUnitInverseLimitCarrierPadicModule F).one_smul + (principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF x)) + +/-- +Equips the target in `Module ℤ_[F.residueCharacteristic] (AdicPrincipalUnits F.toCompleteDVF)` +with the indicated module structure. +-/ +noncomputable instance adicPrincipalUnitsPadicModule + (F : LocalField.{u, v} K) : + Module ℤ_[F.residueCharacteristic] + (AdicPrincipalUnits F.toCompleteDVF) := + AddEquiv.module + (β := Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1)) + ℤ_[F.residueCharacteristic] + (AdicPrincipalUnits.addEquiv F.toCompleteDVF) + +/-- +Establishes the identity `AdicPrincipalUnits.addEquiv F.toCompleteDVF (a • x) = a • +AdicPrincipalUnits.addEquiv F.toCompleteDVF x`. +-/ +@[simp] +theorem AdicPrincipalUnits.addEquiv_map_smul + (F : LocalField.{u, v} K) (a : ℤ_[F.residueCharacteristic]) + (x : AdicPrincipalUnits F.toCompleteDVF) : + AdicPrincipalUnits.addEquiv F.toCompleteDVF (a • x) = + a • AdicPrincipalUnits.addEquiv F.toCompleteDVF x := + rfl + +/-- The adic wrapper and its underlying principal-unit module are canonically +`Z_p`-linearly equivalent. -/ +noncomputable def AdicPrincipalUnits.linearEquivUnderlying + (F : LocalField.{u, v} K) : + AdicPrincipalUnits F.toCompleteDVF ≃ₗ[ℤ_[F.residueCharacteristic]] + Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1) := + { AdicPrincipalUnits.addEquiv F.toCompleteDVF with + map_smul' := AdicPrincipalUnits.addEquiv_map_smul F } + +/-- +Establishes the identity `principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF (a • x) = a • +principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF x`. +-/ +theorem Internal.principalUnitAddEquivInverseLimitCarrier_map_smul + (F : LocalField.{u, v} K) + (a : ℤ_[F.residueCharacteristic]) + (x : Additive ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1)) : + principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF (a • x) = + a • principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF x := by + change + principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF + ((principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF).symm + (a • principalUnitAddEquivInverseLimitCarrier + F.toCompleteDVF x)) = + a • principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF x + exact (principalUnitAddEquivInverseLimitCarrier + F.toCompleteDVF).apply_symm_apply _ + +/-- Coordinate formula for the canonical action: the class of `a • x` at +level `n` is obtained by reducing `a` modulo `p^(f*n)` and acting on the class +of `x`. -/ +theorem Internal.principalUnitPadic_smul_carrier_coordinate + (F : LocalField.{u, v} K) + (a : ℤ_[F.residueCharacteristic]) + (x : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1) (n : ℕ) : + Additive.ofMul + ((principalUnitMulEquivInverseLimitCarrier F.toCompleteDVF + (Additive.toMul (a • Additive.ofMul x))).1 n) = + principalUnitQuotientCarrierPadicScalar F n a + (Additive.ofMul + ((principalUnitMulEquivInverseLimitCarrier F.toCompleteDVF x).1 n)) := by + rw [principalUnitQuotientCarrierPadicScalar_eq_smul] + have h := congrArg + (fun z : Additive + (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF) => + Additive.ofMul ((Additive.toMul z).1 n)) + (principalUnitAddEquivInverseLimitCarrier_map_smul + F a (Additive.ofMul x)) + exact h + +/-- The canonical identification of adic principal units with the +prodiscrete limit respects the p-adic action. -/ +theorem adicPrincipalUnitsHomeomorphProdiscreteLimit_map_smul + (F : LocalField.{u, v} K) + (a : ℤ_[F.residueCharacteristic]) + (x : AdicPrincipalUnits F.toCompleteDVF) : + adicPrincipalUnitsHomeomorphProdiscreteLimit F.toCompleteDVF (a • x) = + a • adicPrincipalUnitsHomeomorphProdiscreteLimit F.toCompleteDVF x := by + apply (PrincipalUnitProdiscreteLimit.addEquiv F.toCompleteDVF).injective + rw [adicPrincipalUnitsHomeomorphProdiscreteLimit_to_addEquiv, + PrincipalUnitProdiscreteLimit.addEquiv_map_smul, + adicPrincipalUnitsHomeomorphProdiscreteLimit_to_addEquiv, + AdicPrincipalUnits.addEquiv_map_smul, + Internal.principalUnitAddEquivInverseLimitCarrier_map_smul] + +/-- +Establishes the identity `adicPrincipalUnitsAddEquivProdiscreteLimit F.toCompleteDVF (a • x) = a • +adicPrincipalUnitsAddEquivProdiscreteLimit F.toCompleteDVF x`. +-/ +@[simp] +theorem adicPrincipalUnitsAddEquivProdiscreteLimit_map_smul + (F : LocalField.{u, v} K) + (a : ℤ_[F.residueCharacteristic]) + (x : AdicPrincipalUnits F.toCompleteDVF) : + adicPrincipalUnitsAddEquivProdiscreteLimit F.toCompleteDVF (a • x) = + a • adicPrincipalUnitsAddEquivProdiscreteLimit F.toCompleteDVF x := by + apply (PrincipalUnitProdiscreteLimit.addEquiv F.toCompleteDVF).injective + change + PrincipalUnitProdiscreteLimit.addEquiv F.toCompleteDVF + ((PrincipalUnitProdiscreteLimit.addEquiv F.toCompleteDVF).symm + (principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF + (AdicPrincipalUnits.addEquiv F.toCompleteDVF (a • x)))) = + PrincipalUnitProdiscreteLimit.addEquiv F.toCompleteDVF + (a • + (PrincipalUnitProdiscreteLimit.addEquiv F.toCompleteDVF).symm + (principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF + (AdicPrincipalUnits.addEquiv F.toCompleteDVF x))) + rw [(PrincipalUnitProdiscreteLimit.addEquiv F.toCompleteDVF).apply_symm_apply, + PrincipalUnitProdiscreteLimit.addEquiv_map_smul, + (PrincipalUnitProdiscreteLimit.addEquiv F.toCompleteDVF).apply_symm_apply, + AdicPrincipalUnits.addEquiv_map_smul, + Internal.principalUnitAddEquivInverseLimitCarrier_map_smul] + +/-- `Z_p`-linear form of the canonical adic/prodiscrete comparison. -/ +noncomputable def adicPrincipalUnitsLinearEquivProdiscreteLimit + (F : LocalField.{u, v} K) : + AdicPrincipalUnits F.toCompleteDVF ≃ₗ[ℤ_[F.residueCharacteristic]] + PrincipalUnitProdiscreteLimit F.toCompleteDVF := + { adicPrincipalUnitsAddEquivProdiscreteLimit F.toCompleteDVF with + map_smul' := adicPrincipalUnitsAddEquivProdiscreteLimit_map_smul F } + +/-- Projection from adic first principal units to one wrapped quotient +coordinate. -/ +noncomputable def adicPrincipalUnitsCoordinateLinear + (F : LocalField.{u, v} K) (n : ℕ) : + AdicPrincipalUnits F.toCompleteDVF →ₗ[ℤ_[F.residueCharacteristic]] + DiscretePrincipalUnitQuotient F.toCompleteDVF n := + (PrincipalUnitProdiscreteLimit.coordinateLinear F n).comp + (adicPrincipalUnitsLinearEquivProdiscreteLimit F).toLinearMap + +/-- +The specified map is continuous: `Continuous fun z : ℤ_[F.residueCharacteristic] × +AdicPrincipalUnits F.toCompleteDVF => z.1 • z.2`. +-/ +theorem continuous_adicPrincipalUnitsPadic_smul + (F : LocalField.{u, v} K) : + Continuous fun z : ℤ_[F.residueCharacteristic] × + AdicPrincipalUnits F.toCompleteDVF => + z.1 • z.2 := by + let e := adicPrincipalUnitsHomeomorphProdiscreteLimit F.toCompleteDVF + have hpair : Continuous fun z : ℤ_[F.residueCharacteristic] × + AdicPrincipalUnits F.toCompleteDVF => + (z.1, e z.2) := + continuous_fst.prodMk (e.continuous.comp continuous_snd) + have htransport := e.continuous_symm.comp (continuous_smul.comp hpair) + exact htransport + +/-- +The scalar action in `ContinuousSMul ℤ_[F.residueCharacteristic] (AdicPrincipalUnits +F.toCompleteDVF)` is continuous. +-/ +noncomputable instance adicPrincipalUnitsContinuousSMul + (F : LocalField.{u, v} K) : + ContinuousSMul ℤ_[F.residueCharacteristic] + (AdicPrincipalUnits F.toCompleteDVF) := + ⟨continuous_adicPrincipalUnitsPadic_smul F⟩ + +/-- Addition on the adic principal-unit model is continuous. -/ +noncomputable instance adicPrincipalUnitsContinuousAdd + (F : LocalField.{u, v} K) : + ContinuousAdd (AdicPrincipalUnits F.toCompleteDVF) := by + let e := adicPrincipalUnitsContinuousAddEquivProdiscreteLimit F.toCompleteDVF + refine ⟨?_⟩ + have hpair : Continuous fun z : + AdicPrincipalUnits F.toCompleteDVF × + AdicPrincipalUnits F.toCompleteDVF => + (e z.1, e z.2) := + (e.continuous.comp continuous_fst).prodMk + (e.continuous.comp continuous_snd) + have h := e.continuous_symm.comp + (continuous_add.comp hpair) + convert h using 1 + funext z + change z.1 + z.2 = e.symm (e z.1 + e z.2) + apply e.injective + rw [e.apply_symm_apply] + exact e.map_add z.1 z.2 + +end higherPrincipalUnitGroup +end CompleteDVF +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicProdiscreteComparison.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicProdiscreteComparison.lean new file mode 100644 index 0000000000..77919e41f7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicProdiscreteComparison.lean @@ -0,0 +1,217 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitTopology +/-! +# Adic and prodiscrete principal-unit models + +The adic topology on first principal units agrees with the prodiscrete topology carried +by the inverse limit of finite quotient coordinates. +-/ + +@[expose] public section + +noncomputable +section + +open scoped BigOperators + +universe u v + +namespace LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField +namespace CompleteDVF +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +namespace higherPrincipalUnitGroup + +open LubinTate +open LubinTate.Valuations + +variable {K : Type u} [Field K] + +open Internal + +namespace Internal + +/-- Internal comparison from the type-level adic model to the raw +instance-parametric carrier. -/ +noncomputable def adicPrincipalUnitsHomeomorphUnderlying + (F : CompleteDVF.{u, v} K) : + letI : TopologicalSpace F.valuationSubring := + (uniformizerPowerIdeal + (chosenPrincipalUnitPadicUniformizer F) 1).adicTopology + AdicPrincipalUnits F ≃ₜ + Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) := by + letI : TopologicalSpace F.valuationSubring := + (uniformizerPowerIdeal + (chosenPrincipalUnitPadicUniformizer F) 1).adicTopology + exact (AdicPrincipalUnits.homeomorph F).trans + (WithTopology.homeomorph + (α := Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)) + (topology := principalUnitAdicTopology F)) + +/-- +The homeomorphism from the adic principal-unit model evaluates through its underlying additive +equivalence. +-/ +@[simp] +theorem adicPrincipalUnitsHomeomorphUnderlying_apply + (F : CompleteDVF.{u, v} K) (x : AdicPrincipalUnits F) : + letI : TopologicalSpace F.valuationSubring := + (uniformizerPowerIdeal + (chosenPrincipalUnitPadicUniformizer F) 1).adicTopology + adicPrincipalUnitsHomeomorphUnderlying F x = + AdicPrincipalUnits.addEquiv F x := + rfl + +/-- Internal comparison from the type-level prodiscrete model to the raw +instance-parametric inverse-limit carrier. -/ +noncomputable def principalUnitProdiscreteLimitHomeomorphUnderlying + (F : CompleteDVF.{u, v} K) : + letI : (n : ℕ) → TopologicalSpace (Internal.principalUnitQuotientCarrier F n) := + fun _ => ⊥ + PrincipalUnitProdiscreteLimit F ≃ₜ + Additive (Internal.principalUnitInverseLimitCarrier F) := by + letI : (n : ℕ) → TopologicalSpace (Internal.principalUnitQuotientCarrier F n) := + fun _ => ⊥ + exact (PrincipalUnitProdiscreteLimit.homeomorph F).trans + (WithTopology.homeomorph + (α := Additive (Internal.principalUnitInverseLimitCarrier F)) + (topology := principalUnitProdiscreteTopology F)) + +/-- +The homeomorphism from the prodiscrete limit evaluates through its underlying additive +equivalence. +-/ +@[simp] +theorem principalUnitProdiscreteLimitHomeomorphUnderlying_apply + (F : CompleteDVF.{u, v} K) (x : PrincipalUnitProdiscreteLimit F) : + letI : (n : ℕ) → TopologicalSpace + (Internal.principalUnitQuotientCarrier F n) := fun _ => ⊥ + principalUnitProdiscreteLimitHomeomorphUnderlying F x = + PrincipalUnitProdiscreteLimit.addEquiv F x := + rfl + +end Internal + +/-- The only bridge where the raw instance-parametric presentations are +installed. Public topology APIs use `AdicPrincipalUnits` and +`PrincipalUnitProdiscreteLimit` instead. -/ +noncomputable def adicPrincipalUnitsHomeomorphProdiscreteLimit + (F : CompleteDVF.{u, v} K) : + AdicPrincipalUnits F ≃ₜ PrincipalUnitProdiscreteLimit F := by + letI : TopologicalSpace F.valuationSubring := + (uniformizerPowerIdeal + (chosenPrincipalUnitPadicUniformizer F) 1).adicTopology + letI : (n : ℕ) → TopologicalSpace (Internal.principalUnitQuotientCarrier F n) := + fun _ => ⊥ + let source := Internal.adicPrincipalUnitsHomeomorphUnderlying F + let target := Internal.principalUnitProdiscreteLimitHomeomorphUnderlying F + exact source.trans + ((Internal.principalUnitAddHomeomorphInverseLimitCarrier F).trans target.symm) + +/-- +Establishes the identity `PrincipalUnitProdiscreteLimit.addEquiv F +(adicPrincipalUnitsHomeomorphProdiscreteLimit F x) = principalUnitAddEquivInverseLimitCarrier F +(AdicPrincipalUnits.addEquiv F x)`. +-/ +theorem adicPrincipalUnitsHomeomorphProdiscreteLimit_to_addEquiv + (F : CompleteDVF.{u, v} K) (x : AdicPrincipalUnits F) : + PrincipalUnitProdiscreteLimit.addEquiv F + (adicPrincipalUnitsHomeomorphProdiscreteLimit F x) = + principalUnitAddEquivInverseLimitCarrier F + (AdicPrincipalUnits.addEquiv F x) := by + let : TopologicalSpace F.valuationSubring := + (uniformizerPowerIdeal + (chosenPrincipalUnitPadicUniformizer F) 1).adicTopology + let : (n : ℕ) → TopologicalSpace + (Internal.principalUnitQuotientCarrier F n) := fun _ => ⊥ + let source := Internal.adicPrincipalUnitsHomeomorphUnderlying F + let target := Internal.principalUnitProdiscreteLimitHomeomorphUnderlying F + calc + PrincipalUnitProdiscreteLimit.addEquiv F + (adicPrincipalUnitsHomeomorphProdiscreteLimit F x) = + target (adicPrincipalUnitsHomeomorphProdiscreteLimit F x) := by + rw [Internal.principalUnitProdiscreteLimitHomeomorphUnderlying_apply] + _ = principalUnitAddHomeomorphInverseLimitCarrier F (source x) := by + exact target.apply_symm_apply _ + _ = principalUnitAddEquivInverseLimitCarrier F + (AdicPrincipalUnits.addEquiv F x) := by + rw [principalUnitAddHomeomorphInverseLimitCarrier_apply, + Internal.adicPrincipalUnitsHomeomorphUnderlying_apply] + +/-- The prodiscrete principal-unit limit is Hausdorff. -/ +noncomputable instance principalUnitProdiscreteLimitT2Space + (F : CompleteDVF.{u, v} K) : + T2Space (PrincipalUnitProdiscreteLimit F) := by + let : (n : ℕ) → TopologicalSpace (Internal.principalUnitQuotientCarrier F n) := + fun _ => ⊥ + let : (n : ℕ) → DiscreteTopology (Internal.principalUnitQuotientCarrier F n) := + fun _ => ⟨rfl⟩ + let : (n : ℕ) → T2Space (Internal.principalUnitQuotientCarrier F n) := + fun _ => DiscreteTopology.toT2Space + let : T2Space (Internal.principalUnitInverseLimitCarrier F) := by + infer_instance + let : T2Space (Additive (Internal.principalUnitInverseLimitCarrier F)) := by + change T2Space (Internal.principalUnitInverseLimitCarrier F) + infer_instance + exact T2Space.of_injective_continuous + (Internal.principalUnitProdiscreteLimitHomeomorphUnderlying F).injective + (Internal.principalUnitProdiscreteLimitHomeomorphUnderlying F).continuous + +/-- Algebraic form of the canonical identification between adic principal +units and their prodiscrete limit. -/ +noncomputable def adicPrincipalUnitsAddEquivProdiscreteLimit + (F : CompleteDVF.{u, v} K) : + AdicPrincipalUnits F ≃+ PrincipalUnitProdiscreteLimit F := + (AdicPrincipalUnits.addEquiv F).trans + ((principalUnitAddEquivInverseLimitCarrier F).trans + (PrincipalUnitProdiscreteLimit.addEquiv F).symm) + +/-- +The defining evaluation formula for `adicPrincipalUnitsHomeomorphProdiscreteLimit` is +`adicPrincipalUnitsHomeomorphProdiscreteLimit F x = adicPrincipalUnitsAddEquivProdiscreteLimit F +x`. +-/ +@[simp] theorem adicPrincipalUnitsHomeomorphProdiscreteLimit_apply + (F : CompleteDVF.{u, v} K) (x : AdicPrincipalUnits F) : + adicPrincipalUnitsHomeomorphProdiscreteLimit F x = + adicPrincipalUnitsAddEquivProdiscreteLimit F x := + (PrincipalUnitProdiscreteLimit.addEquiv F).injective (by + rw [adicPrincipalUnitsHomeomorphProdiscreteLimit_to_addEquiv] + change + principalUnitAddEquivInverseLimitCarrier F + (AdicPrincipalUnits.addEquiv F x) = + PrincipalUnitProdiscreteLimit.addEquiv F + ((PrincipalUnitProdiscreteLimit.addEquiv F).symm + (principalUnitAddEquivInverseLimitCarrier F + (AdicPrincipalUnits.addEquiv F x))) + exact ((PrincipalUnitProdiscreteLimit.addEquiv F).apply_symm_apply _).symm) + +/-- Additive topological form of +`adicPrincipalUnitsHomeomorphProdiscreteLimit`. -/ +noncomputable def adicPrincipalUnitsContinuousAddEquivProdiscreteLimit + (F : CompleteDVF.{u, v} K) : + AdicPrincipalUnits F ≃ₜ+ PrincipalUnitProdiscreteLimit F := + ContinuousAddEquiv.mk' + (adicPrincipalUnitsHomeomorphProdiscreteLimit F) + (fun x y => by + simpa only [adicPrincipalUnitsHomeomorphProdiscreteLimit_apply] using + (adicPrincipalUnitsAddEquivProdiscreteLimit F).map_add x y) + +/-- The topology on the type in `T2Space (AdicPrincipalUnits F)` is Hausdorff. -/ +noncomputable instance adicPrincipalUnitsT2Space + (F : CompleteDVF.{u, v} K) : T2Space (AdicPrincipalUnits F) := + (adicPrincipalUnitsHomeomorphProdiscreteLimit F).symm.t2Space + +end higherPrincipalUnitGroup +end CompleteDVF +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/Core.lean new file mode 100644 index 0000000000..4f9a2656e3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/Core.lean @@ -0,0 +1,179 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitCore +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.TopologyModelTypes +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicProdiscreteComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.FiniteQuotientPadicModule +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.ProdiscretePadicModule +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicPadicModule +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.WithZeroValuationTopology +/-! +Assembles the inverse-limit and topological models used to define the `ℤ_[p]`-module structure on +principal units. +-/ + +@[expose] public section + +noncomputable +section + +open scoped BigOperators + +universe u v + +namespace LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField +namespace CompleteDVF +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +namespace higherPrincipalUnitGroup + +open LubinTate +open LubinTate.Valuations + +variable {K : Type u} [Field K] + +open Internal + +/-- Natural p-adic scalars act by the ordinary group powers. -/ +theorem principalUnitPadic_natCast_smul + (F : LocalField.{u, v} K) (n : ℕ) + (x : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1) : + (n : ℤ_[F.residueCharacteristic]) • Additive.ofMul x = + Additive.ofMul (x ^ n) := by + calc + (n : ℤ_[F.residueCharacteristic]) • Additive.ofMul x = + n • Additive.ofMul x := + Nat.cast_smul_eq_nsmul ℤ_[F.residueCharacteristic] n (Additive.ofMul x) + _ = Additive.ofMul (x ^ n) := rfl + +/-- Equivalent multiplicative reading of +`principalUnitPadic_natCast_smul`. -/ +theorem principalUnitPadic_nsmul_eq_pow + (F : LocalField.{u, v} K) (n : ℕ) + (x : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1) : + Additive.toMul + ((n : ℤ_[F.residueCharacteristic]) • Additive.ofMul x) = x ^ n := by + exact congrArg Additive.toMul + (principalUnitPadic_natCast_smul F n x) + +/-- Every `U^r`, for `r >= 1`, is stable under the canonical p-adic action +on `U^1`. -/ +theorem principalUnitPadic_smul_mem_higher + (F : LocalField.{u, v} K) {r : ℕ} (hr : 1 ≤ r) + (a : ℤ_[F.residueCharacteristic]) + (x : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1) + (hx : (x : F.valuationSubringˣ) ∈ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) r) : + ((Additive.toMul (a • Additive.ofMul x) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1) : + F.valuationSubringˣ) ∈ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) r := by + let n := r - 1 + have hn : n + 1 = r := Nat.sub_add_cancel hr + let y : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1 := + Additive.toMul (a • Additive.ofMul x) + have hxq : + (higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubquotientMk + 1 (n + 1) x = 1 := by + exact ((higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubquotient_mk_eq_one_iff x).2 + (by + change (x : F.valuationSubringˣ) ∈ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) (n + 1) + rw [hn] + exact hx) + have hcoord : + Additive.ofMul + (principalUnitInverseLimitCarrierEval F.toCompleteDVF n + (principalUnitMulEquivInverseLimitCarrier F.toCompleteDVF y)) = + a • Additive.ofMul + (principalUnitInverseLimitCarrierEval F.toCompleteDVF n + (principalUnitMulEquivInverseLimitCarrier F.toCompleteDVF x)) := by + have h := congrArg + (fun z : Additive + (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF) => + Additive.ofMul + (principalUnitInverseLimitCarrierEval F.toCompleteDVF n + (Additive.toMul z))) + (principalUnitAddEquivInverseLimitCarrier_map_smul + F a (Additive.ofMul x)) + exact h + have hyq : + (higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubquotientMk + 1 (n + 1) y = 1 := by + apply Additive.ofMul.injective + calc + Additive.ofMul + ((higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubquotientMk + 1 (n + 1) y) = + a • Additive.ofMul + ((higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubquotientMk + 1 (n + 1) x) := by + simpa only [principalUnitMulEquivInverseLimitCarrier_apply] using hcoord + _ = a • Additive.ofMul (1 : + Internal.principalUnitQuotientCarrier F.toCompleteDVF n) := by rw [hxq] + _ = 0 := by + rw [show Additive.ofMul + (1 : Internal.principalUnitQuotientCarrier F.toCompleteDVF n) = 0 from rfl] + exact (principalUnitQuotientCarrierPadicModule F n).smul_zero a + _ = Additive.ofMul (1 : + Internal.principalUnitQuotientCarrier F.toCompleteDVF n) := rfl + change (y : F.valuationSubringˣ) ∈ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) r + rw [← hn] + exact ((higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubquotient_mk_eq_one_iff y).1 hyq + +/-- A p-adic scalar divisible by the residue characteristic kills the leading +graded class: on `U^r` it lands in `U^(r+1)`. -/ +theorem principalUnitPadic_residueCharacteristic_mul_smul_mem_succ + (F : LocalField.{u, v} K) {r : ℕ} (hr : 1 ≤ r) + (b : ℤ_[F.residueCharacteristic]) + (x : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1) + (hx : (x : F.valuationSubringˣ) ∈ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) r) : + ((Additive.toMul + (((F.residueCharacteristic : ℤ_[F.residueCharacteristic]) * b) • + Additive.ofMul x) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1) : + F.valuationSubringˣ) ∈ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) (r + 1) := by + have hscalar : + ((F.residueCharacteristic : ℤ_[F.residueCharacteristic]) * b) • + Additive.ofMul x = + b • Additive.ofMul (x ^ F.residueCharacteristic) := by + rw [mul_comm, mul_smul, principalUnitPadic_natCast_smul] + rw [hscalar] + apply principalUnitPadic_smul_mem_higher F + (Nat.succ_le_succ (Nat.zero_le r)) b (x ^ F.residueCharacteristic) + exact higherPrincipalUnitGroup.pow_mem_succ_of_residue_ringChar_eq + F.toCompleteDVF + (residueCharacteristic_prime_and_card_eq_pow_residueDegree F).1 hr rfl hx + +end higherPrincipalUnitGroup +end CompleteDVF +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/FiniteQuotientPadicModule.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/FiniteQuotientPadicModule.lean new file mode 100644 index 0000000000..5068c4fda5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/FiniteQuotientPadicModule.lean @@ -0,0 +1,422 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import Mathlib.Algebra.Module.MinimalAxioms +public import Mathlib.Algebra.Module.ZMod +public import Mathlib.NumberTheory.Padics.RingHoms +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.DenominatorValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.PadicReductionContinuous +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.QuotientTransition +/-! +# P-adic modules on finite principal-unit quotients + +Finite principal-unit quotients have the expected residue-characteristic exponent. +Reduction of p-adic integers therefore supplies canonical module structures, compatible with +the transition maps. +-/ + +@[expose] public section + +noncomputable +section + +open scoped BigOperators + +universe u v + +namespace LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField +namespace CompleteDVF +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +namespace higherPrincipalUnitGroup + +open LubinTate +open LubinTate.Valuations + +variable {K : Type u} [Field K] + +open Internal + +/-! ## The finite-coordinate p-adic actions -/ + +/-- The residue degree `f`, chosen from the finite-field identity `q = p^f`. -/ +noncomputable def principalUnitResidueDegree + (F : LocalField.{u, v} K) : ℕ+ := by + letI := Fintype.ofFinite F.residueField + exact Classical.choose + (FiniteField.card F.residueField F.residueCharacteristic) + +/-- +Establishes the identity `F.residueCharacteristic.Prime ∧ Nat.card F.residueField = +F.residueCharacteristic ^ (principalUnitResidueDegree F : ℕ)`. +-/ +theorem residueCharacteristic_prime_and_card_eq_pow_residueDegree + (F : LocalField.{u, v} K) : + F.residueCharacteristic.Prime ∧ + Nat.card F.residueField = + F.residueCharacteristic ^ (principalUnitResidueDegree F : ℕ) := by + let := Fintype.ofFinite F.residueField + have h := Classical.choose_spec + (FiniteField.card F.residueField F.residueCharacteristic) + refine ⟨h.1, ?_⟩ + simpa [principalUnitResidueDegree, Nat.card_eq_fintype_card] using h.2 + +/-- The finite-field cardinality identity uniquely determines the residue +degree selected above. -/ +theorem principalUnitResidueDegree_unique + (F : LocalField.{u, v} K) (d : ℕ+) + (hcard : + Nat.card F.residueField = + F.residueCharacteristic ^ (d : ℕ)) : + d = principalUnitResidueDegree F := by + have hselected := + residueCharacteristic_prime_and_card_eq_pow_residueDegree F + apply Subtype.ext + apply Nat.pow_right_injective hselected.1.two_le + exact hcard.symm.trans hselected.2 + +/-- The type in `Finite (Internal.principalUnitQuotientCarrier F.toCompleteDVF n)` is finite. -/ +instance Internal.principalUnitQuotientCarrier_finite + (F : LocalField.{u, v} K) (n : ℕ) : + Finite (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) := by + have : Finite + (F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) (n + 1)) := + higherPrincipalUnitGroup.finite_unitsModHigherPrincipalUnitGroup_of_finite_residue + F.toCompleteDVF (n + 1) + exact Finite.of_injective + (principalUnitQuotientCarrierToFull F.toCompleteDVF n) + (principalUnitQuotientCarrierToFull_injective F.toCompleteDVF n) + +/-- The `n`-th first-principal-unit quotient has cardinality `p^(f*n)`. -/ +theorem Internal.card_principalUnitQuotientCarrier_eq_residueCharacteristic_pow + (F : LocalField.{u, v} K) (n : ℕ) : + Nat.card (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) = + F.residueCharacteristic ^ ((principalUnitResidueDegree F : ℕ) * n) := by + have hcard := + higherPrincipalUnitGroup.card_principalUnitSubquotient_one_eq_residue_pow_of_uniformizer + F.toCompleteDVF + (chosenPrincipalUnitPadicUniformizer_isUniformizer F.toCompleteDVF) + (Nat.le_add_left 1 n) + rw [show n + 1 - 1 = n by omega] at hcard + have hcard' : + Nat.card (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) = + Nat.card F.residueField ^ n := by + let e : + Internal.principalUnitQuotientCarrier F.toCompleteDVF n ≃ + (higherPrincipalUnitGroup F.toCompleteDVF 1 ⧸ + (higherPrincipalUnitGroup F.toCompleteDVF (n + 1)).subgroupOf + (higherPrincipalUnitGroup F.toCompleteDVF 1)) := by + change + (higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubquotient 1 (n + 1) ≃ + ((higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubgroup 1 ⧸ + ((higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubgroup (n + 1)).subgroupOf + ((higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubgroup 1)) + exact + (AntitoneSubgroupFiltration.principalUnitSubquotientConcreteEquiv + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F.toCompleteDVF) + 1 (n + 1)).toEquiv + let : Finite + (higherPrincipalUnitGroup F.toCompleteDVF 1 ⧸ + (higherPrincipalUnitGroup F.toCompleteDVF (n + 1)).subgroupOf + (higherPrincipalUnitGroup F.toCompleteDVF 1)) := + Finite.of_equiv + (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) + e + calc + Nat.card (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) = + Nat.card + (higherPrincipalUnitGroup F.toCompleteDVF 1 ⧸ + (higherPrincipalUnitGroup F.toCompleteDVF (n + 1)).subgroupOf + (higherPrincipalUnitGroup F.toCompleteDVF 1)) := + Nat.card_congr e + _ = Nat.card F.residueField ^ n := by + exact hcard + rw [hcard', + (residueCharacteristic_prime_and_card_eq_pow_residueDegree F).2, + pow_mul] + +/-- The type in `Finite (DiscretePrincipalUnitQuotient F.toCompleteDVF n)` is finite. -/ +instance discretePrincipalUnitQuotientFinite + (F : LocalField.{u, v} K) (n : ℕ) : + Finite (DiscretePrincipalUnitQuotient F.toCompleteDVF n) := + Finite.of_injective + (fun x : DiscretePrincipalUnitQuotient F.toCompleteDVF n => x.val) + (DiscretePrincipalUnitQuotient.equiv F.toCompleteDVF n).injective + +/-- A wrapped level quotient has the expected local-field cardinality +`p^(f*n)`. -/ +theorem card_discretePrincipalUnitQuotient_eq_residueCharacteristic_pow + (F : LocalField.{u, v} K) (n : ℕ) : + Nat.card (DiscretePrincipalUnitQuotient F.toCompleteDVF n) = + F.residueCharacteristic ^ ((principalUnitResidueDegree F : ℕ) * n) := by + rw [show + Nat.card (DiscretePrincipalUnitQuotient F.toCompleteDVF n) = + Nat.card + (Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n)) by + exact + Nat.card_congr + (DiscretePrincipalUnitQuotient.equiv F.toCompleteDVF n)] + calc + Nat.card + (Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n)) = + Nat.card + (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) := + Nat.card_congr Additive.toMul + _ = F.residueCharacteristic ^ + ((principalUnitResidueDegree F : ℕ) * n) := + Internal.card_principalUnitQuotientCarrier_eq_residueCharacteristic_pow F n + +/-- Lagrange's theorem gives the exact exponent bound needed to reduce a +p-adic scalar modulo `p^(f*n)`. -/ +theorem Internal.principalUnitQuotientCarrier_pow_residueCharacteristic_pow_eq_one + (F : LocalField.{u, v} K) (n : ℕ) + (x : Internal.principalUnitQuotientCarrier F.toCompleteDVF n) : + x ^ (F.residueCharacteristic ^ + ((principalUnitResidueDegree F : ℕ) * n)) = 1 := by + rw [← card_principalUnitQuotientCarrier_eq_residueCharacteristic_pow F n] + exact pow_card_eq_one' + +/-- +Establishes the identity `(F.residueCharacteristic ^ ((principalUnitResidueDegree F : ℕ) * n)) • x += 0`. +-/ +theorem Internal.principalUnitQuotientCarrier_nsmul_residueCharacteristic_pow_eq_zero + (F : LocalField.{u, v} K) (n : ℕ) + (x : Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n)) : + (F.residueCharacteristic ^ + ((principalUnitResidueDegree F : ℕ) * n)) • x = 0 := by + change Additive.ofMul + ((Additive.toMul x) ^ (F.residueCharacteristic ^ + ((principalUnitResidueDegree F : ℕ) * n))) = Additive.ofMul 1 + rw [principalUnitQuotientCarrier_pow_residueCharacteristic_pow_eq_one] + +/-- The exact exponent bound, stated on the canonical discrete wrapper. -/ +theorem discretePrincipalUnitQuotient_nsmul_residueCharacteristic_pow_eq_zero + (F : LocalField.{u, v} K) (n : ℕ) + (x : DiscretePrincipalUnitQuotient F.toCompleteDVF n) : + (F.residueCharacteristic ^ + ((principalUnitResidueDegree F : ℕ) * n)) • x = 0 := by + apply (DiscretePrincipalUnitQuotient.addEquiv F.toCompleteDVF n).injective + simpa only [map_nsmul, map_zero, + DiscretePrincipalUnitQuotient.addEquiv_apply] using + Internal.principalUnitQuotientCarrier_nsmul_residueCharacteristic_pow_eq_zero + F n x.val + +/-- The canonical `ZMod (p^(f*n))`-module on the `n`-th finite coordinate. -/ +@[implicit_reducible] +noncomputable def Internal.principalUnitQuotientCarrierZModModule + (F : LocalField.{u, v} K) (n : ℕ) : + Module + (ZMod (F.residueCharacteristic ^ + ((principalUnitResidueDegree F : ℕ) * n))) + (Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n)) := + AddCommGroup.zmodModule + (n := F.residueCharacteristic ^ + ((principalUnitResidueDegree F : ℕ) * n)) + (G := Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n)) + (principalUnitQuotientCarrier_nsmul_residueCharacteristic_pow_eq_zero F n) + +/-- Restriction of scalars along `Z_p -> ZMod (p^(f*n))`. -/ +noncomputable instance Internal.principalUnitQuotientCarrierPadicModule + (F : LocalField.{u, v} K) (n : ℕ) : + Module ℤ_[F.residueCharacteristic] + (Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n)) := by + letI := principalUnitQuotientCarrierZModModule F n + exact Module.compHom _ + (PadicInt.toZModPow ((principalUnitResidueDegree F : ℕ) * n)) + +/-- +Equips the target in `Module ℤ_[F.residueCharacteristic] (DiscretePrincipalUnitQuotient +F.toCompleteDVF n)` with the indicated module structure. +-/ +noncomputable instance discretePrincipalUnitQuotientPadicModule + (F : LocalField.{u, v} K) (n : ℕ) : + Module ℤ_[F.residueCharacteristic] + (DiscretePrincipalUnitQuotient F.toCompleteDVF n) := + AddEquiv.module + (β := Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n)) + ℤ_[F.residueCharacteristic] + (DiscretePrincipalUnitQuotient.addEquiv F.toCompleteDVF n) + +/-- +Establishes the identity `DiscretePrincipalUnitQuotient.addEquiv F.toCompleteDVF n (a • x) = a • +DiscretePrincipalUnitQuotient.addEquiv F.toCompleteDVF n x`. +-/ +theorem DiscretePrincipalUnitQuotient.addEquiv_map_smul + (F : LocalField.{u, v} K) (n : ℕ) + (a : ℤ_[F.residueCharacteristic]) + (x : DiscretePrincipalUnitQuotient F.toCompleteDVF n) : + DiscretePrincipalUnitQuotient.addEquiv F.toCompleteDVF n (a • x) = + a • DiscretePrincipalUnitQuotient.addEquiv F.toCompleteDVF n x := + rfl + +/-- The finite-coordinate scalar written explicitly through reduction of a +p-adic integer modulo `p^(f*n)`. -/ +noncomputable def Internal.principalUnitQuotientCarrierPadicScalar + (F : LocalField.{u, v} K) (n : ℕ) + (a : ℤ_[F.residueCharacteristic]) + (x : Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n)) : + Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) := by + letI := principalUnitQuotientCarrierZModModule F n + exact PadicInt.toZModPow + ((principalUnitResidueDegree F : ℕ) * n) a • x + +/-- Establishes the identity `principalUnitQuotientCarrierPadicScalar F n a x = a • x`. -/ +@[simp] theorem Internal.principalUnitQuotientCarrierPadicScalar_eq_smul + (F : LocalField.{u, v} K) (n : ℕ) + (a : ℤ_[F.residueCharacteristic]) + (x : Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n)) : + principalUnitQuotientCarrierPadicScalar F n a x = a • x := + rfl + +/-- Joint continuity of the p-adic scalar action on one finite discrete +coordinate. -/ +theorem Internal.continuous_principalUnitQuotientCarrierPadicScalar + (F : LocalField.{u, v} K) (n : ℕ) : + letI : TopologicalSpace + (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) := ⊥ + Continuous fun z : ℤ_[F.residueCharacteristic] × + Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) => + principalUnitQuotientCarrierPadicScalar F n z.1 z.2 := by + let p := F.residueCharacteristic + let f : ℕ := principalUnitResidueDegree F + let : TopologicalSpace + (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) := ⊥ + let : DiscreteTopology + (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) := ⟨rfl⟩ + let : TopologicalSpace (ZMod (p ^ (f * n))) := ⊥ + let : DiscreteTopology (ZMod (p ^ (f * n))) := ⟨rfl⟩ + let : Module (ZMod (p ^ (f * n))) + (Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n)) := by + simpa [p, f] using principalUnitQuotientCarrierZModModule F n + have hred : Continuous fun z : ℤ_[F.residueCharacteristic] × + Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) => + PadicInt.toZModPow (f * n) z.1 := + (Internal.continuous_padicIntToZModPow p (f * n)).comp continuous_fst + have hact : Continuous fun z : ZMod (p ^ (f * n)) × + Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) => + z.1 • z.2 := + continuous_of_discreteTopology + change Continuous fun z : ℤ_[F.residueCharacteristic] × + Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) => + PadicInt.toZModPow (f * n) z.1 • z.2 + exact hact.comp (hred.prodMk continuous_snd) + +/-- +The specified map is continuous: `Continuous fun z : ℤ_[F.residueCharacteristic] × +DiscretePrincipalUnitQuotient F.toCompleteDVF n => z.1 • z.2`. +-/ +theorem continuous_discretePrincipalUnitQuotientPadic_smul + (F : LocalField.{u, v} K) (n : ℕ) : + Continuous fun z : ℤ_[F.residueCharacteristic] × + DiscretePrincipalUnitQuotient F.toCompleteDVF n => + z.1 • z.2 := by + let : TopologicalSpace + (Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n)) := ⊥ + let : DiscreteTopology + (Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n)) := ⟨rfl⟩ + let e : DiscretePrincipalUnitQuotient F.toCompleteDVF n ≃ₜ + Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) := + { toEquiv := DiscretePrincipalUnitQuotient.equiv F.toCompleteDVF n + continuous_toFun := continuous_of_discreteTopology + continuous_invFun := continuous_of_discreteTopology } + have hpair : Continuous fun z : ℤ_[F.residueCharacteristic] × + DiscretePrincipalUnitQuotient F.toCompleteDVF n => + (z.1, e z.2) := + continuous_fst.prodMk (e.continuous.comp continuous_snd) + have h := e.continuous_symm.comp + ((Internal.continuous_principalUnitQuotientCarrierPadicScalar F n).comp hpair) + refine h.congr fun z => ?_ + apply e.injective + simp only [Function.comp_apply, e.apply_symm_apply] + change + Internal.principalUnitQuotientCarrierPadicScalar F n z.1 + (DiscretePrincipalUnitQuotient.addEquiv F.toCompleteDVF n z.2) = + DiscretePrincipalUnitQuotient.addEquiv F.toCompleteDVF n (z.1 • z.2) + rw [Internal.principalUnitQuotientCarrierPadicScalar_eq_smul, + DiscretePrincipalUnitQuotient.addEquiv_map_smul] + +/-- Reduction between finite principal-unit quotients is `Z_p`-linear. The +key point is compatibility of `toZModPow` with the cast from level `f*n` to +level `f*m`. -/ +theorem Internal.principalUnitQuotientCarrierTransitionAdd_map_smul + (F : LocalField.{u, v} K) {m n : ℕ} (hmn : m ≤ n) + (a : ℤ_[F.residueCharacteristic]) + (x : Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n)) : + principalUnitQuotientCarrierTransitionAdd F.toCompleteDVF hmn (a • x) = + a • principalUnitQuotientCarrierTransitionAdd F.toCompleteDVF hmn x := by + let f : ℕ := principalUnitResidueDegree F + let p : ℕ := F.residueCharacteristic + have hlevels : f * m ≤ f * n := Nat.mul_le_mul_left f hmn + let sourceModule : Module (ZMod (p ^ (f * n))) + (Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n)) := by + simpa [p, f] using principalUnitQuotientCarrierZModModule F n + let targetModule : Module (ZMod (p ^ (f * m))) + (Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF m)) := by + simpa [p, f] using principalUnitQuotientCarrierZModModule F m + let targetModuleAtN : Module (ZMod (p ^ (f * n))) + (Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF m)) := + Module.compHom _ + (ZMod.castHom (pow_dvd_pow p hlevels) (ZMod (p ^ (f * m)))) + change + principalUnitQuotientCarrierTransitionAdd F.toCompleteDVF hmn + (PadicInt.toZModPow (f * n) a • x) = + PadicInt.toZModPow (f * m) a • + principalUnitQuotientCarrierTransitionAdd F.toCompleteDVF hmn x + calc + principalUnitQuotientCarrierTransitionAdd F.toCompleteDVF hmn + (PadicInt.toZModPow (f * n) a • x) = + PadicInt.toZModPow (f * n) a • + principalUnitQuotientCarrierTransitionAdd F.toCompleteDVF hmn x := + ZMod.map_smul + (principalUnitQuotientCarrierTransitionAdd F.toCompleteDVF hmn) + _ _ + _ = (PadicInt.toZModPow (f * n) a).cast • + principalUnitQuotientCarrierTransitionAdd F.toCompleteDVF hmn x := rfl + _ = PadicInt.toZModPow (f * m) a • + principalUnitQuotientCarrierTransitionAdd F.toCompleteDVF hmn x := by + rw [PadicInt.cast_toZModPow (f * m) (f * n) hlevels] + +namespace DiscretePrincipalUnitQuotient + +/-- Wrapped coordinate reduction is `Z_p`-linear. -/ +noncomputable def transitionLinear + (F : LocalField.{u, v} K) {m n : ℕ} (hmn : m ≤ n) : + DiscretePrincipalUnitQuotient F.toCompleteDVF n →ₗ[ + ℤ_[F.residueCharacteristic]] + DiscretePrincipalUnitQuotient F.toCompleteDVF m where + toFun := transition F.toCompleteDVF hmn + map_add' := fun x y => (transition F.toCompleteDVF hmn).map_add x y + map_smul' a x := by + have hx : (a • x).val = a • x.val := by + simpa only [addEquiv_apply] using + addEquiv_map_smul F n a x + have hy : + (a • transition F.toCompleteDVF hmn x).val = + a • (transition F.toCompleteDVF hmn x).val := by + simpa only [addEquiv_apply] using + addEquiv_map_smul F m a (transition F.toCompleteDVF hmn x) + apply (addEquiv F.toCompleteDVF m).injective + simpa only [addEquiv_apply, val_transition, RingHom.id_apply, hx, hy] using + Internal.principalUnitQuotientCarrierTransitionAdd_map_smul + F hmn a x.val + +end DiscretePrincipalUnitQuotient + +end higherPrincipalUnitGroup +end CompleteDVF +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitCore.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitCore.lean new file mode 100644 index 0000000000..d7b78e8b01 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitCore.lean @@ -0,0 +1,459 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicCompletionInverseLimit +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core +/-! +# The canonical p-adic action on first principal units + +This file constructs the common source used in both cases of LubinTate, +The field-unit structure theorem. A first principal unit is recovered from its +classes in the level quotients `U^1 / U^(n+1)`. For a local field these +quotients are finite and have exponent dividing `p^(f*n)`, where the residue +field has cardinality `p^f`. +Reduction of a p-adic integer modulo these powers therefore acts on every +finite coordinate, and compatibility of reduction transports the action to +`U^1`. +-/ + +@[expose] public section + +noncomputable +section + +open scoped BigOperators + +universe u v + +namespace LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField +namespace CompleteDVF +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +namespace higherPrincipalUnitGroup + +open LubinTate +open LubinTate.Valuations + +variable {K : Type u} [Field K] + +/-- A fixed uniformizer used only to invoke the direct quotient form of +the adic inverse-limit equivalence. The resulting p-adic action is characterized below by its +ordinary integral powers. -/ +noncomputable def chosenPrincipalUnitPadicUniformizer + (F : CompleteDVF.{u, v} K) : F.valuationSubring := + Classical.choose F.exists_uniformizer + +/-- The chosen principal-unit parameter has valuation one and is a uniformizer. -/ +theorem chosenPrincipalUnitPadicUniformizer_isUniformizer + (F : CompleteDVF.{u, v} K) : + F.valuation.IsUniformizer (chosenPrincipalUnitPadicUniformizer F : K) := + Classical.choose_spec F.exists_uniformizer + +/-- The chosen valuation-ring uniformizer is irreducible. -/ +theorem chosenPrincipalUnitPadicUniformizer_irreducible + (F : CompleteDVF.{u, v} K) : + Irreducible (chosenPrincipalUnitPadicUniformizer F) := by + rw [IsDiscreteValuationRing.irreducible_iff_uniformizer] + exact F.maximalIdeal_eq_span_uniformizer + (chosenPrincipalUnitPadicUniformizer_isUniformizer F) + +/-- For the chosen uniformizer, the higher-unit subgroup `1 + pi^n O` is the +intrinsic `n`-th higher principal-unit group. -/ +theorem higherUnitSubgroup_chosenPrincipalUnitPadicUniformizer + (F : CompleteDVF.{u, v} K) (n : ℕ) : + higherUnitSubgroup (chosenPrincipalUnitPadicUniformizer F) n = + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) n := by + ext x + rw [mem_higherUnitSubgroup_iff_sub_one_mem_powerIdeal, + higherPrincipalUnitGroup.mem_iff] + have hideal : + uniformizerPowerIdeal (chosenPrincipalUnitPadicUniformizer F) n = + F.maximalIdeal ^ n := by + calc + uniformizerPowerIdeal (chosenPrincipalUnitPadicUniformizer F) n = + (uniformizerPowerIdeal (chosenPrincipalUnitPadicUniformizer F) 1) ^ n := + (dvrPowerIdeal_one_pow _ n).symm + _ = F.maximalIdeal ^ n := by + rw [uniformizerPowerIdeal, pow_one, + ← F.maximalIdeal_eq_span_uniformizer + (chosenPrincipalUnitPadicUniformizer_isUniformizer F)] + rw [hideal] + +/-- Transition on the intrinsic quotients `O^*/U^(n+1)`. -/ +def Internal.higherUnitQuotientTransition + (F : CompleteDVF.{u, v} K) {m n : ℕ} (hmn : m ≤ n) : + F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1) →* + F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (m + 1) := + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F).quotientPrincipalUnitSubgroupMapOfLe + (Nat.succ_le_succ hmn) + +/-- The intrinsic full unit inverse limit `lim O^*/U^(n+1)`. -/ +abbrev Internal.higherUnitInverseLimitCarrier + (F : CompleteDVF.{u, v} K) : Type u := + compatibleGroupFamilies + (fun n : ℕ => + F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1)) + (fun {_ _} hmn => Internal.higherUnitQuotientTransition F hmn) + +open Internal + +/-- Changing from the uniformizer presentation of a level quotient to the +intrinsic principal-unit presentation. -/ +noncomputable def Internal.uniformizerHigherUnitQuotientEquiv + (F : CompleteDVF.{u, v} K) (n : ℕ) : + F.valuationSubringˣ ⧸ + higherUnitSubgroup (chosenPrincipalUnitPadicUniformizer F) (n + 1) ≃* + F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1) := + QuotientGroup.quotientMulEquivOfEq + (higherUnitSubgroup_chosenPrincipalUnitPadicUniformizer F (n + 1)) + +/-- +Establishes the identity `uniformizerHigherUnitQuotientEquiv F n (QuotientGroup.mk x) = +QuotientGroup.mk x`. +-/ +@[simp] theorem Internal.uniformizerHigherUnitQuotientEquiv_mk + (F : CompleteDVF.{u, v} K) (n : ℕ) (x : F.valuationSubringˣ) : + uniformizerHigherUnitQuotientEquiv F n (QuotientGroup.mk x) = + QuotientGroup.mk x := by + exact QuotientGroup.quotientMulEquivOfEq_mk _ x + +/-- The uniformizer and intrinsic presentations give the same full inverse +limit. -/ +noncomputable def Internal.uniformizerHigherUnitInverseLimitEquiv + (F : CompleteDVF.{u, v} K) : + dvrHigherUnitQuotientInverseLimit + (chosenPrincipalUnitPadicUniformizer F) ≃* + Internal.higherUnitInverseLimitCarrier F := + (dvrHigherUnitQuotientInverseLimitRepresentation + (chosenPrincipalUnitPadicUniformizer F)).trans + (compatibleGroupFamiliesMulEquiv + (fun n : ℕ => + F.valuationSubringˣ ⧸ + higherUnitSubgroup (chosenPrincipalUnitPadicUniformizer F) (n + 1)) + (fun n : ℕ => + F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1)) + (fun {_ _} hmn => + dvrHigherUnitQuotientTransition + (chosenPrincipalUnitPadicUniformizer F) hmn) + (fun {_ _} hmn => higherUnitQuotientTransition F hmn) + (uniformizerHigherUnitQuotientEquiv F) + (by + intro m n hmn q + refine QuotientGroup.induction_on q ?_ + intro x + rw [uniformizerHigherUnitQuotientEquiv_mk] + change QuotientGroup.mk x = QuotientGroup.mk x + rfl)) + +/-- The direct quotient isomorphism of the adic inverse-limit equivalence, rewritten using the +intrinsic higher principal-unit filtration. -/ +noncomputable def Internal.unitsEquivHigherUnitQuotientInverseLimit + (F : CompleteDVF.{u, v} K) : + F.valuationSubringˣ ≃* Internal.higherUnitInverseLimitCarrier F := by + let pi := chosenPrincipalUnitPadicUniformizer F + have hpi : Irreducible pi := chosenPrincipalUnitPadicUniformizer_irreducible F + letI : IsAdicComplete (uniformizerPowerIdeal pi 1) F.valuationSubring := by + have hmax : uniformizerPowerIdeal pi 1 = F.maximalIdeal := by + rw [uniformizerPowerIdeal, pow_one, + ← F.maximalIdeal_eq_span_uniformizer + (chosenPrincipalUnitPadicUniformizer_isUniformizer F)] + rw [hmax] + exact ValuationTheory.DiscreteValuationField.Valuation.isAdicComplete F.valuation + exact + (dvrUnitsEquivHigherUnitQuotientInverseLimit hpi).trans + (uniformizerHigherUnitInverseLimitEquiv F) + +/-- +The defining evaluation formula for `Internal.unitsEquivHigherUnitQuotientInverseLimit` is +`(unitsEquivHigherUnitQuotientInverseLimit F x).1 n = QuotientGroup.mk x`. +-/ +theorem Internal.unitsEquivHigherUnitQuotientInverseLimit_apply + (F : CompleteDVF.{u, v} K) (x : F.valuationSubringˣ) (n : ℕ) : + (unitsEquivHigherUnitQuotientInverseLimit F x).1 n = + QuotientGroup.mk x := by + let pi := chosenPrincipalUnitPadicUniformizer F + have hpi : Irreducible pi := chosenPrincipalUnitPadicUniformizer_irreducible F + let : IsAdicComplete (uniformizerPowerIdeal pi 1) F.valuationSubring := by + have hmax : uniformizerPowerIdeal pi 1 = F.maximalIdeal := by + rw [uniformizerPowerIdeal, pow_one, + ← F.maximalIdeal_eq_span_uniformizer + (chosenPrincipalUnitPadicUniformizer_isUniformizer F)] + rw [hmax] + exact ValuationTheory.DiscreteValuationField.Valuation.isAdicComplete F.valuation + change + uniformizerHigherUnitQuotientEquiv F n + (dvrHigherUnitQuotientInverseLimitEval pi n + (dvrUnitsEquivHigherUnitQuotientInverseLimit hpi x)) = + QuotientGroup.mk x + rw [dvrUnitsEquivHigherUnitQuotientInverseLimit_apply, + uniformizerHigherUnitQuotientEquiv_mk] + +/-- The change from the uniformizer presentation of the full unit inverse +limit to the intrinsic presentation is a homeomorphism when all quotient +coordinates are discrete. -/ +noncomputable def Internal.uniformizerHigherUnitInverseLimitHomeomorphIntrinsic + (F : CompleteDVF.{u, v} K) : + letI : (n : ℕ) → TopologicalSpace + (F.valuationSubringˣ ⧸ + higherUnitSubgroup (chosenPrincipalUnitPadicUniformizer F) (n + 1)) := + fun _ => ⊥ + letI : (n : ℕ) → TopologicalSpace + (F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + + 1)) := + fun _ => ⊥ + dvrHigherUnitQuotientInverseLimit + (chosenPrincipalUnitPadicUniformizer F) ≃ₜ + Internal.higherUnitInverseLimitCarrier F := by + letI : (n : ℕ) → TopologicalSpace + (F.valuationSubringˣ ⧸ + higherUnitSubgroup (chosenPrincipalUnitPadicUniformizer F) (n + 1)) := + fun _ => ⊥ + letI : (n : ℕ) → TopologicalSpace + (F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1)) := + fun _ => ⊥ + letI : (n : ℕ) → DiscreteTopology + (F.valuationSubringˣ ⧸ + higherUnitSubgroup (chosenPrincipalUnitPadicUniformizer F) (n + 1)) := + fun _ => ⟨rfl⟩ + letI : (n : ℕ) → DiscreteTopology + (F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1)) := + fun _ => ⟨rfl⟩ + let e := uniformizerHigherUnitInverseLimitEquiv F + refine + { toFun := e + invFun := e.symm + left_inv := e.left_inv + right_inv := e.right_inv + continuous_toFun := ?_ + continuous_invFun := ?_ } + · change Continuous fun x => e x + exact Continuous.subtype_mk + (continuous_pi fun n => by + change Continuous fun x : + dvrHigherUnitQuotientInverseLimit + (chosenPrincipalUnitPadicUniformizer F) => + uniformizerHigherUnitQuotientEquiv F n + (dvrHigherUnitQuotientInverseLimitEval + (chosenPrincipalUnitPadicUniformizer F) n x) + have heval : Continuous fun x : + dvrHigherUnitQuotientInverseLimit + (chosenPrincipalUnitPadicUniformizer F) => + dvrHigherUnitQuotientInverseLimitEval + (chosenPrincipalUnitPadicUniformizer F) n x := + (DiscreteHigherUnitQuotient.homeomorph + (chosenPrincipalUnitPadicUniformizer F) (n + 1)).continuous.comp + (dvrHigherUnitQuotientInverseLimit_discreteEval_continuous + (chosenPrincipalUnitPadicUniformizer F) n) + exact continuous_of_discreteTopology.comp heval) + (fun x : dvrHigherUnitQuotientInverseLimit + (chosenPrincipalUnitPadicUniformizer F) => by + intro i j hij + change higherUnitQuotientTransition F hij + (uniformizerHigherUnitQuotientEquiv F j + (dvrHigherUnitQuotientInverseLimitEval + (chosenPrincipalUnitPadicUniformizer F) j x)) = + uniformizerHigherUnitQuotientEquiv F i + (dvrHigherUnitQuotientInverseLimitEval + (chosenPrincipalUnitPadicUniformizer F) i x) + exact (e x).2 hij) + · change Continuous fun x => e.symm x + apply (dvrHigherUnitQuotientInverseLimit_continuous_iff + (chosenPrincipalUnitPadicUniformizer F) (fun x => e.symm x)).2 + intro n + change Continuous fun x : Internal.higherUnitInverseLimitCarrier F => + DiscreteHigherUnitQuotient.of + (chosenPrincipalUnitPadicUniformizer F) (n + 1) + ((uniformizerHigherUnitQuotientEquiv F n).symm (x.1 n)) + exact + (DiscreteHigherUnitQuotient.homeomorph + (chosenPrincipalUnitPadicUniformizer F) (n + 1)).symm.continuous.comp + (continuous_of_discreteTopology.comp + ((continuous_apply n).comp continuous_subtype_val)) + +/-- Topological full-unit form of the adic inverse-limit equivalence, rewritten intrinsically. -/ +noncomputable def Internal.unitsHomeomorphHigherUnitQuotientInverseLimit + (F : CompleteDVF.{u, v} K) : + letI : TopologicalSpace F.valuationSubring := + (uniformizerPowerIdeal (chosenPrincipalUnitPadicUniformizer F) 1).adicTopology + letI : (n : ℕ) → TopologicalSpace + (F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + + 1)) := + fun _ => ⊥ + F.valuationSubringˣ ≃ₜ Internal.higherUnitInverseLimitCarrier F := by + let pi := chosenPrincipalUnitPadicUniformizer F + letI : TopologicalSpace F.valuationSubring := + (uniformizerPowerIdeal pi 1).adicTopology + letI : (n : ℕ) → TopologicalSpace + (F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1)) := + fun _ => ⊥ + letI : (n : ℕ) → TopologicalSpace + (F.valuationSubringˣ ⧸ higherUnitSubgroup pi (n + 1)) := + fun _ => ⊥ + have hpi : Irreducible pi := chosenPrincipalUnitPadicUniformizer_irreducible F + letI : IsAdicComplete (uniformizerPowerIdeal pi 1) F.valuationSubring := by + have hmax : uniformizerPowerIdeal pi 1 = F.maximalIdeal := by + rw [uniformizerPowerIdeal, pow_one, + ← F.maximalIdeal_eq_span_uniformizer + (chosenPrincipalUnitPadicUniformizer_isUniformizer F)] + rw [hmax] + exact ValuationTheory.DiscreteValuationField.Valuation.isAdicComplete F.valuation + exact + (WithTopology.homeomorph + (α := F.valuationSubringˣ) + (topology := adicUnitsTopology (uniformizerPowerIdeal pi 1))).symm.trans + ((unitsEquivHigherUnitQuotientInverseLimitHomeomorph hpi).trans + (Internal.uniformizerHigherUnitInverseLimitHomeomorphIntrinsic F)) + +/-- +The unit-to-inverse-limit homeomorphism sends a unit to its canonical class at every higher-unit +quotient level. +-/ +theorem Internal.unitsHomeomorphHigherUnitQuotientInverseLimit_apply + (F : CompleteDVF.{u, v} K) (x : F.valuationSubringˣ) (n : ℕ) : + letI : TopologicalSpace F.valuationSubring := + (uniformizerPowerIdeal (chosenPrincipalUnitPadicUniformizer F) 1).adicTopology + letI : (n : ℕ) → TopologicalSpace + (F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + + 1)) := + fun _ => ⊥ + (Internal.unitsHomeomorphHigherUnitQuotientInverseLimit F x).1 n = + QuotientGroup.mk x := by + let pi := chosenPrincipalUnitPadicUniformizer F + let : TopologicalSpace F.valuationSubring := + (uniformizerPowerIdeal pi 1).adicTopology + let : (n : ℕ) → TopologicalSpace + (F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1)) := + fun _ => ⊥ + let : (n : ℕ) → TopologicalSpace + (F.valuationSubringˣ ⧸ higherUnitSubgroup pi (n + 1)) := + fun _ => ⊥ + have hpi : Irreducible pi := chosenPrincipalUnitPadicUniformizer_irreducible F + let : IsAdicComplete (uniformizerPowerIdeal pi 1) F.valuationSubring := by + have hmax : uniformizerPowerIdeal pi 1 = F.maximalIdeal := by + rw [uniformizerPowerIdeal, pow_one, + ← F.maximalIdeal_eq_span_uniformizer + (chosenPrincipalUnitPadicUniformizer_isUniformizer F)] + rw [hmax] + exact ValuationTheory.DiscreteValuationField.Valuation.isAdicComplete F.valuation + change uniformizerHigherUnitQuotientEquiv F n + (dvrHigherUnitQuotientInverseLimitEval pi n + (unitsEquivHigherUnitQuotientInverseLimitHomeomorph + hpi + (WithTopology.toTopology (adicUnitsTopology (uniformizerPowerIdeal pi 1)) x))) = + QuotientGroup.mk x + change uniformizerHigherUnitQuotientEquiv F n (QuotientGroup.mk x) = + QuotientGroup.mk x + exact uniformizerHigherUnitQuotientEquiv_mk F n x + +/-! ## Restriction of the adic inverse-limit equivalence to first principal units -/ + +/-- The raw carrier of the `n`-th coordinate `U^1/U^(n+1)`. -/ +abbrev Internal.principalUnitQuotientCarrier + (F : CompleteDVF.{u, v} K) (n : ℕ) : Type u := + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotient + 1 (n + 1) + +/-- Transition `U^1/U^(n+1) -> U^1/U^(m+1)` for `m <= n`. -/ +def Internal.principalUnitQuotientCarrierTransition + (F : CompleteDVF.{u, v} K) {m n : ℕ} (hmn : m ≤ n) : + Internal.principalUnitQuotientCarrier F n →* + Internal.principalUnitQuotientCarrier F m := by + let U := higherPrincipalUnitGroup.toPrincipalUnitFiltration F + change U.principalUnitSubquotient 1 (n + 1) →* + U.principalUnitSubquotient 1 (m + 1) + refine U.principalUnitSubquotientLift 1 (n + 1) + (U.principalUnitSubquotientMk 1 (m + 1)) ?_ + intro x hx + rw [MonoidHom.mem_ker, + U.principalUnitSubquotient_mk_eq_one_iff] + change (x : F.valuationSubringˣ) ∈ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + (m + 1) + exact higherPrincipalUnitGroup.antitone F (Nat.succ_le_succ hmn) hx + +/-- +Establishes the identity `principalUnitQuotientCarrierTransition F hmn +((higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotientMk 1 (n + 1) x) = +(higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotientMk 1 (m + 1) x`. +-/ +@[simp] theorem Internal.principalUnitQuotientCarrierTransition_mk + (F : CompleteDVF.{u, v} K) {m n : ℕ} (hmn : m ≤ n) + (x : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) : + principalUnitQuotientCarrierTransition F hmn + ((higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotientMk + 1 (n + 1) x) = + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotientMk + 1 (m + 1) x := + rfl + +/-- The projective limit `lim_n U^1/U^(n+1)`. -/ +abbrev Internal.principalUnitInverseLimitCarrier + (F : CompleteDVF.{u, v} K) : Type u := + compatibleGroupFamilies + (Internal.principalUnitQuotientCarrier F) + (fun {_ _} hmn => principalUnitQuotientCarrierTransition F hmn) + +/-- Evaluation of a principal-unit compatible family at level `n`. -/ +def Internal.principalUnitInverseLimitCarrierEval + (F : CompleteDVF.{u, v} K) (n : ℕ) : + Internal.principalUnitInverseLimitCarrier F →* + Internal.principalUnitQuotientCarrier F n := + compatibleGroupFamiliesEval + (Internal.principalUnitQuotientCarrier F) + (fun {_ _} hmn => principalUnitQuotientCarrierTransition F hmn) n + +/-- +The defining evaluation formula for `Internal.principalUnitInverseLimitCarrierEval` is +`principalUnitInverseLimitCarrierEval F n x = x.1 n`. +-/ +@[simp] +theorem Internal.principalUnitInverseLimitCarrierEval_apply + (F : CompleteDVF.{u, v} K) (n : ℕ) + (x : Internal.principalUnitInverseLimitCarrier F) : + principalUnitInverseLimitCarrierEval F n x = x.1 n := + rfl + +/-- Named compatibility law for a principal-unit inverse-limit family. -/ +theorem Internal.principalUnitInverseLimitCarrier_compatible + (F : CompleteDVF.{u, v} K) + (x : Internal.principalUnitInverseLimitCarrier F) + {m n : ℕ} (hmn : m ≤ n) : + principalUnitQuotientCarrierTransition F hmn + (principalUnitInverseLimitCarrierEval F n x) = + principalUnitInverseLimitCarrierEval F m x := + compatibleGroupFamilies_transition + (Internal.principalUnitQuotientCarrier F) + (fun {_ _} hij => principalUnitQuotientCarrierTransition F hij) x hmn + +/-- Principal-unit inverse-limit families are determined by their +coordinates. -/ +@[ext] +theorem Internal.principalUnitInverseLimitCarrier_ext + (F : CompleteDVF.{u, v} K) + {x y : Internal.principalUnitInverseLimitCarrier F} + (h : ∀ n, principalUnitInverseLimitCarrierEval F n x = + principalUnitInverseLimitCarrierEval F n y) : x = y := + compatibleGroupFamilies_ext + (Internal.principalUnitQuotientCarrier F) + (fun {_ _} hij => principalUnitQuotientCarrierTransition F hij) h +end higherPrincipalUnitGroup +end CompleteDVF +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitTopology.lean new file mode 100644 index 0000000000..8c63b40e1b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitTopology.lean @@ -0,0 +1,520 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.TopologyModelTypes +/-! +# Topology of the principal-unit inverse limit + +This module identifies first principal units algebraically and topologically with the +inverse limit of their finite principal-unit quotients. +-/ + +@[expose] public section + +noncomputable +section + +open scoped BigOperators + +universe u v + +namespace LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField +namespace CompleteDVF +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +namespace higherPrincipalUnitGroup + +open LubinTate +open LubinTate.Valuations + +variable {K : Type u} [Field K] + +open Internal + +/-- Embed `U^1/U^(n+1)` as its class inside `O^*/U^(n+1)`. -/ +noncomputable def Internal.principalUnitQuotientCarrierToFull + (F : CompleteDVF.{u, v} K) (n : ℕ) : + Internal.principalUnitQuotientCarrier F n →* + F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1) := + ((higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubgroupClassInQuotient + 1 (n + 1)).subtype.comp + ((higherPrincipalUnitGroup.toPrincipalUnitFiltration + F).principalUnitSubquotientEquivClassInQuotientOfLe + (Nat.le_add_left 1 n)).toMonoidHom + +/-- +Establishes the identity `principalUnitQuotientCarrierToFull F n +((higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotientMk 1 (n + 1) x) = +(QuotientGroup.mk (x : F.valuationSubringˣ) : F.valuationSubringˣ ⧸ +(CompleteDVF.higherPrincipalUnitGroup F) (n + 1))`. +-/ +@[simp] theorem Internal.principalUnitQuotientCarrierToFull_mk + (F : CompleteDVF.{u, v} K) (n : ℕ) + (x : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) : + principalUnitQuotientCarrierToFull F n + ((higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotientMk + 1 (n + 1) x) = + (QuotientGroup.mk (x : F.valuationSubringˣ) : + F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + + 1)) := by + exact + (higherPrincipalUnitGroup.toPrincipalUnitFiltration + F).coe_principalUnitSubquotientEquivClassInQuotientOfLe_mk + (Nat.le_add_left 1 n) x + +/-- +The specified map is injective: `Function.Injective (principalUnitQuotientCarrierToFull F n)`. +-/ +theorem Internal.principalUnitQuotientCarrierToFull_injective + (F : CompleteDVF.{u, v} K) (n : ℕ) : + Function.Injective (principalUnitQuotientCarrierToFull F n) := by + exact Subtype.val_injective.comp + ((higherPrincipalUnitGroup.toPrincipalUnitFiltration + F).principalUnitSubquotientEquivClassInQuotientOfLe + (Nat.le_add_left 1 n)).injective + +/-- A first principal unit, viewed as a point of its class inside the full +finite unit quotient. -/ +def Internal.principalUnitToClassInFullQuotient + (F : CompleteDVF.{u, v} K) (n : ℕ) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubgroupClassInQuotient + 1 (n + 1) where + toFun x := + ⟨QuotientGroup.mk (x : F.valuationSubringˣ), + (higherPrincipalUnitGroup.toPrincipalUnitFiltration + F).principalUnitSubgroupClassInQuotient_mk_mem + x.property⟩ + map_one' := by ext; rfl + map_mul' x y := by ext; rfl + +/-- +Establishes the identity `((higherPrincipalUnitGroup.toPrincipalUnitFiltration +F).principalUnitSubquotientEquivClassInQuotientOfLe (Nat.le_add_left 1 n)).symm +(principalUnitToClassInFullQuotient F n x) = (higherPrincipalUnitGroup.toPrincipalUnitFiltration +F).principalUnitSubquotientMk 1 (n + 1) x`. +-/ +@[simp] theorem Internal.principalUnitQuotientCarrierEquivClass_symm_toClass + (F : CompleteDVF.{u, v} K) (n : ℕ) + (x : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) : + ((higherPrincipalUnitGroup.toPrincipalUnitFiltration + F).principalUnitSubquotientEquivClassInQuotientOfLe + (Nat.le_add_left 1 n)).symm + (principalUnitToClassInFullQuotient F n x) = + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotientMk + 1 (n + 1) x := by + apply ((higherPrincipalUnitGroup.toPrincipalUnitFiltration + F).principalUnitSubquotientEquivClassInQuotientOfLe + (Nat.le_add_left 1 n)).injective + rw [MulEquiv.apply_symm_apply] + apply Subtype.ext + exact ((higherPrincipalUnitGroup.toPrincipalUnitFiltration + F).coe_principalUnitSubquotientEquivClassInQuotientOfLe_mk + (Nat.le_add_left 1 n) x).symm + +/-- +Establishes the identity `higherUnitQuotientTransition F hmn (principalUnitQuotientCarrierToFull F +n q) = principalUnitQuotientCarrierToFull F m (principalUnitQuotientCarrierTransition F hmn q)`. +-/ +theorem Internal.principalUnitQuotientCarrierToFull_transition + (F : CompleteDVF.{u, v} K) {m n : ℕ} (hmn : m ≤ n) + (q : Internal.principalUnitQuotientCarrier F n) : + higherUnitQuotientTransition F hmn + (principalUnitQuotientCarrierToFull F n q) = + principalUnitQuotientCarrierToFull F m + (principalUnitQuotientCarrierTransition F hmn q) := by + refine + AntitoneSubgroupFiltration.principalUnitSubquotient.inductionOn + (motive := fun q => + higherUnitQuotientTransition F hmn + (principalUnitQuotientCarrierToFull F n q) = + principalUnitQuotientCarrierToFull F m + (principalUnitQuotientCarrierTransition F hmn q)) + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F) 1 (n + 1) q ?_ + intro x + exact (congrArg (higherUnitQuotientTransition F hmn) + (principalUnitQuotientCarrierToFull_mk F n x)).trans + (principalUnitQuotientCarrierToFull_mk F m x).symm + +/-- Forget that every coordinate is represented by a first principal unit. -/ +noncomputable def Internal.principalUnitInverseLimitCarrierToFull + (F : CompleteDVF.{u, v} K) : + Internal.principalUnitInverseLimitCarrier F →* + Internal.higherUnitInverseLimitCarrier F where + toFun q := + ⟨fun n => principalUnitQuotientCarrierToFull F n (q.1 n), by + intro m n hmn + rw [principalUnitQuotientCarrierToFull_transition, q.2 hmn]⟩ + map_one' := by + apply Subtype.ext + funext n + change principalUnitQuotientCarrierToFull F n 1 = 1 + exact map_one _ + map_mul' q r := by + apply Subtype.ext + funext n + change principalUnitQuotientCarrierToFull F n (q.1 n * r.1 n) = + principalUnitQuotientCarrierToFull F n (q.1 n) * + principalUnitQuotientCarrierToFull F n (r.1 n) + exact map_mul _ _ _ + +/-- Canonical carrier map from `U^1` to its level-quotient limit. -/ +def Internal.principalUnitToInverseLimitCarrier + (F : CompleteDVF.{u, v} K) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Internal.principalUnitInverseLimitCarrier F where + toFun x := + ⟨fun n => + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotientMk + 1 (n + 1) x, by + intro m n hmn + exact principalUnitQuotientCarrierTransition_mk F hmn x⟩ + map_one' := by ext n; rfl + map_mul' x y := by ext n; rfl + +/-- +Establishes the identity `principalUnitInverseLimitCarrierToFull F +(principalUnitToInverseLimitCarrier F x) = unitsEquivHigherUnitQuotientInverseLimit F (x : +F.valuationSubringˣ)`. +-/ +theorem Internal.principalUnitInverseLimitCarrierToFull_to + (F : CompleteDVF.{u, v} K) (x : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) : + principalUnitInverseLimitCarrierToFull F + (principalUnitToInverseLimitCarrier F x) = + unitsEquivHigherUnitQuotientInverseLimit F + (x : F.valuationSubringˣ) := by + ext n + simp only [compatibleGroupFamiliesEval_apply] + rw [unitsEquivHigherUnitQuotientInverseLimit_apply] + exact principalUnitQuotientCarrierToFull_mk F n x + +/-- Establishes the identity `principalUnitQuotientCarrierToFull F 0 q = 1`. -/ +theorem Internal.principalUnitQuotientCarrierToFull_zero_eq_one + (F : CompleteDVF.{u, v} K) + (q : Internal.principalUnitQuotientCarrier F 0) : + principalUnitQuotientCarrierToFull F 0 q = 1 := by + refine + AntitoneSubgroupFiltration.principalUnitSubquotient.inductionOn + (motive := fun q => principalUnitQuotientCarrierToFull F 0 q = 1) + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F) 1 1 q ?_ + intro x + exact (principalUnitQuotientCarrierToFull_mk F 0 x).trans + ((QuotientGroup.eq_one_iff (x : F.valuationSubringˣ)).2 x.property) + +/-- Recover a first principal unit from a compatible family of its finite +classes, by applying the adic inverse-limit equivalence to the underlying full unit family. -/ +noncomputable def Internal.principalUnitInverseLimitCarrierInv + (F : CompleteDVF.{u, v} K) + (q : Internal.principalUnitInverseLimitCarrier F) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 := by + let e := unitsEquivHigherUnitQuotientInverseLimit F + let qfull := principalUnitInverseLimitCarrierToFull F q + refine ⟨e.symm qfull, ?_⟩ + rw [← QuotientGroup.eq_one_iff] + calc + (QuotientGroup.mk (e.symm qfull) : + F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) = + (e (e.symm qfull)).1 0 := + (unitsEquivHigherUnitQuotientInverseLimit_apply F (e.symm qfull) 0).symm + _ = qfull.1 0 := by rw [e.apply_symm_apply] + _ = 1 := principalUnitQuotientCarrierToFull_zero_eq_one F (q.1 0) + +/-- +Establishes the identity `unitsEquivHigherUnitQuotientInverseLimit F +(principalUnitInverseLimitCarrierInv F q : F.valuationSubringˣ) = +principalUnitInverseLimitCarrierToFull F q`. +-/ +theorem Internal.unitsEquiv_principalUnitInverseLimitCarrierInv + (F : CompleteDVF.{u, v} K) + (q : Internal.principalUnitInverseLimitCarrier F) : + unitsEquivHigherUnitQuotientInverseLimit F + (principalUnitInverseLimitCarrierInv F q : F.valuationSubringˣ) = + principalUnitInverseLimitCarrierToFull F q := by + exact (unitsEquivHigherUnitQuotientInverseLimit F).apply_symm_apply _ + +/-- Algebraic restriction of the adic inverse-limit equivalence: +`U^1` is the inverse limit of `U^1/U^(n+1)`. -/ +noncomputable def Internal.principalUnitMulEquivInverseLimitCarrier + (F : CompleteDVF.{u, v} K) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Internal.principalUnitInverseLimitCarrier F where + toFun := principalUnitToInverseLimitCarrier F + invFun := principalUnitInverseLimitCarrierInv F + left_inv x := by + apply Subtype.ext + change + (unitsEquivHigherUnitQuotientInverseLimit F).symm + (principalUnitInverseLimitCarrierToFull F + (principalUnitToInverseLimitCarrier F x)) = + (x : F.valuationSubringˣ) + rw [principalUnitInverseLimitCarrierToFull_to] + exact (unitsEquivHigherUnitQuotientInverseLimit F).symm_apply_apply _ + right_inv q := by + ext n + apply principalUnitQuotientCarrierToFull_injective F n + change + principalUnitQuotientCarrierToFull F n + ((higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotientMk + 1 (n + 1) (principalUnitInverseLimitCarrierInv F q)) = + principalUnitQuotientCarrierToFull F n (q.1 n) + rw [principalUnitQuotientCarrierToFull_mk] + calc + (QuotientGroup.mk + (principalUnitInverseLimitCarrierInv F q : F.valuationSubringˣ) : + F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + + 1)) = + (unitsEquivHigherUnitQuotientInverseLimit F + (principalUnitInverseLimitCarrierInv F q : + F.valuationSubringˣ)).1 n := + (unitsEquivHigherUnitQuotientInverseLimit_apply F _ n).symm + _ = (principalUnitInverseLimitCarrierToFull F q).1 n := by + rw [unitsEquiv_principalUnitInverseLimitCarrierInv] + _ = principalUnitQuotientCarrierToFull F n (q.1 n) := rfl + map_mul' x y := by + exact (principalUnitToInverseLimitCarrier F).map_mul x y + +/-- Topological restriction of the adic inverse-limit equivalence: with the adic topology on +`U^1` and +the product topology of the discrete quotient coordinates, +`U^1` is homeomorphic to `lim U^1/U^(n+1)`. -/ +noncomputable def Internal.principalUnitHomeomorphInverseLimitCarrier + (F : CompleteDVF.{u, v} K) : + letI : TopologicalSpace F.valuationSubring := + (uniformizerPowerIdeal (chosenPrincipalUnitPadicUniformizer F) 1).adicTopology + letI : (n : ℕ) → TopologicalSpace (Internal.principalUnitQuotientCarrier F n) := + fun _ => ⊥ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃ₜ + Internal.principalUnitInverseLimitCarrier F := by + let pi := chosenPrincipalUnitPadicUniformizer F + letI : TopologicalSpace F.valuationSubring := + (uniformizerPowerIdeal pi 1).adicTopology + letI : (n : ℕ) → TopologicalSpace (Internal.principalUnitQuotientCarrier F n) := + fun _ => ⊥ + letI : (n : ℕ) → DiscreteTopology (Internal.principalUnitQuotientCarrier F n) := + fun _ => ⟨rfl⟩ + let fullQuotientTopology (n : ℕ) : TopologicalSpace + (F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + (n + 1)) := ⊥ + letI : (n : ℕ) → TopologicalSpace + (F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + (n + 1)) := + fullQuotientTopology + letI : (n : ℕ) → DiscreteTopology + (F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + (n + 1)) := + fun _ => ⟨rfl⟩ + let e := principalUnitMulEquivInverseLimitCarrier F + let hfull := Internal.unitsHomeomorphHigherUnitQuotientInverseLimit F + refine + { toFun := e + invFun := e.symm + left_inv := e.left_inv + right_inv := e.right_inv + continuous_toFun := ?_ + continuous_invFun := ?_ } + · change Continuous fun x => e x + exact Continuous.subtype_mk + (continuous_pi fun n => by + change Continuous fun x : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 => + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotientMk + 1 (n + 1) x + have hfullCoord : Continuous fun x : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 => + (QuotientGroup.mk (x : F.valuationSubringˣ) : + F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + (n + 1)) := by + have hsub : Continuous fun x : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 => + (x : F.valuationSubringˣ) := continuous_subtype_val + have hcoord : Continuous fun z : Internal.higherUnitInverseLimitCarrier F => + z.1 n := + (continuous_apply n).comp continuous_subtype_val + have h := hcoord.comp (hfull.continuous.comp hsub) + convert h using 1 + funext x + have hx := + Internal.unitsHomeomorphHigherUnitQuotientInverseLimit_apply + F (x : F.valuationSubringˣ) n + simpa only [hfull, Function.comp_apply] using hx.symm + let f := principalUnitQuotientCarrierToFull F n + let decode : + (F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + (n + 1)) → + Internal.principalUnitQuotientCarrier F n := + Function.invFun f + have hdecode : Continuous decode := + continuous_of_discreteTopology + have hstage : Continuous fun x : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 => + decode + (QuotientGroup.mk (x : F.valuationSubringˣ) : + F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + (n + 1)) := + hdecode.comp hfullCoord + convert hstage using 1 + funext x + symm + change Function.invFun f + (QuotientGroup.mk (x : F.valuationSubringˣ) : + F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + (n + 1)) = + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotientMk + 1 (n + 1) x + rw [← principalUnitQuotientCarrierToFull_mk F n x] + exact Function.leftInverse_invFun + (principalUnitQuotientCarrierToFull_injective F n) _) + (fun x : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1 => by + intro i j hij + exact (e x).2 hij) + · have hToFull : Continuous fun q : Internal.principalUnitInverseLimitCarrier F => + principalUnitInverseLimitCarrierToFull F q := by + exact Continuous.subtype_mk + (continuous_pi fun n => by + change Continuous fun q : Internal.principalUnitInverseLimitCarrier F => + principalUnitQuotientCarrierToFull F n (q.1 n) + exact continuous_of_discreteTopology.comp + ((continuous_apply n).comp continuous_subtype_val)) + (fun q : Internal.principalUnitInverseLimitCarrier F => by + intro i j hij + exact (principalUnitInverseLimitCarrierToFull F q).2 hij) + have hInvFull : Continuous fun q : Internal.principalUnitInverseLimitCarrier F => + hfull.symm (principalUnitInverseLimitCarrierToFull F q) := + hfull.continuous_symm.comp hToFull + change Continuous fun q => e.symm q + exact Continuous.subtype_mk + (by + convert hInvFull using 1 + funext q + change + (principalUnitInverseLimitCarrierInv F q : F.valuationSubringˣ) = + hfull.symm (principalUnitInverseLimitCarrierToFull F q) + apply hfull.injective + rw [hfull.apply_symm_apply] + ext n + change + (hfull + (principalUnitInverseLimitCarrierInv F q : + F.valuationSubringˣ)).1 n = + (principalUnitInverseLimitCarrierToFull F q).1 n + calc + (hfull + (principalUnitInverseLimitCarrierInv F q : + F.valuationSubringˣ)).1 n = + (QuotientGroup.mk + (principalUnitInverseLimitCarrierInv F q : + F.valuationSubringˣ) : + F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + (n + 1)) := by + simpa only [hfull] using + (Internal.unitsHomeomorphHigherUnitQuotientInverseLimit_apply F + (principalUnitInverseLimitCarrierInv F q : + F.valuationSubringˣ) n) + _ = + (unitsEquivHigherUnitQuotientInverseLimit F + (principalUnitInverseLimitCarrierInv F q : + F.valuationSubringˣ)).1 n := + (unitsEquivHigherUnitQuotientInverseLimit_apply F _ n).symm + _ = (principalUnitInverseLimitCarrierToFull F q).1 n := by + rw [unitsEquiv_principalUnitInverseLimitCarrierInv]) + (fun q : Internal.principalUnitInverseLimitCarrier F => (e.symm q).property) + +/-- +The defining evaluation formula for `Internal.principalUnitMulEquivInverseLimitCarrier` is +`principalUnitInverseLimitCarrierEval F n (principalUnitMulEquivInverseLimitCarrier F x) = +(higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotientMk 1 (n + 1) x`. +-/ +theorem Internal.principalUnitMulEquivInverseLimitCarrier_apply + (F : CompleteDVF.{u, v} K) + (x : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) (n + : ℕ) : + principalUnitInverseLimitCarrierEval F n + (principalUnitMulEquivInverseLimitCarrier F x) = + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotientMk + 1 (n + 1) x := + rfl + + + +/-- Additive form of the algebraic restriction `U^1 ≃ lim U^1/U^(n+1)`. -/ +noncomputable def Internal.principalUnitAddEquivInverseLimitCarrier + (F : CompleteDVF.{u, v} K) : + Additive ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) ≃+ + Additive (Internal.principalUnitInverseLimitCarrier F) where + toFun x := Additive.ofMul + (principalUnitMulEquivInverseLimitCarrier F (Additive.toMul x)) + invFun x := Additive.ofMul + ((principalUnitMulEquivInverseLimitCarrier F).symm (Additive.toMul x)) + left_inv x := by + change Additive.ofMul + ((principalUnitMulEquivInverseLimitCarrier F).symm + (principalUnitMulEquivInverseLimitCarrier F (Additive.toMul x))) = x + rw [(principalUnitMulEquivInverseLimitCarrier F).symm_apply_apply] + rfl + right_inv x := by + change Additive.ofMul + (principalUnitMulEquivInverseLimitCarrier F + ((principalUnitMulEquivInverseLimitCarrier F).symm + (Additive.toMul x))) = x + rw [(principalUnitMulEquivInverseLimitCarrier F).apply_symm_apply] + rfl + map_add' x y := by + change Additive.ofMul + (principalUnitMulEquivInverseLimitCarrier F + (Additive.toMul x * Additive.toMul y)) = + Additive.ofMul + (principalUnitMulEquivInverseLimitCarrier F (Additive.toMul x) * + principalUnitMulEquivInverseLimitCarrier F (Additive.toMul y)) + rw [map_mul] + +/-- Additive form of the topological inverse-limit equivalence. -/ +noncomputable def Internal.principalUnitAddHomeomorphInverseLimitCarrier + (F : CompleteDVF.{u, v} K) : + letI : TopologicalSpace F.valuationSubring := + (uniformizerPowerIdeal (chosenPrincipalUnitPadicUniformizer F) 1).adicTopology + letI : (n : ℕ) → TopologicalSpace (Internal.principalUnitQuotientCarrier F n) := + fun _ => ⊥ + Additive ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) ≃ₜ + Additive (Internal.principalUnitInverseLimitCarrier F) := + Internal.principalUnitHomeomorphInverseLimitCarrier F + +/-- +The principal-unit homeomorphism to the inverse-limit carrier has the same underlying map as the +algebraic additive equivalence. +-/ +@[simp] +theorem Internal.principalUnitAddHomeomorphInverseLimitCarrier_apply + (F : CompleteDVF.{u, v} K) + (x : Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)) : + letI : TopologicalSpace F.valuationSubring := + (uniformizerPowerIdeal (chosenPrincipalUnitPadicUniformizer F) 1).adicTopology + letI : (n : ℕ) → TopologicalSpace + (Internal.principalUnitQuotientCarrier F n) := fun _ => ⊥ + Internal.principalUnitAddHomeomorphInverseLimitCarrier F x = + Internal.principalUnitAddEquivInverseLimitCarrier F x := + rfl + +end higherPrincipalUnitGroup +end CompleteDVF +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/PadicReductionContinuous.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/PadicReductionContinuous.lean new file mode 100644 index 0000000000..8ed65152b8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/PadicReductionContinuous.lean @@ -0,0 +1,60 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.Padics.RingHoms +public import Mathlib.Topology.Algebra.Group.Basic +public import Mathlib.Topology.MetricSpace.Ultra.Basic +/-! +# Continuity of reduction of p-adic integers + +Reduction modulo `p^n` has open kernel and is continuous for the discrete +topology on the quotient. This source has no local-field dependencies. +-/ + +@[expose] public section + +namespace LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + +/-- The kernel of reduction `Z_p -> ZMod (p^n)` is open. -/ +theorem isOpen_ker_padicIntToZModPow + (p : ℕ) [Fact p.Prime] (n : ℕ) : + IsOpen + ((RingHom.ker (PadicInt.toZModPow n : ℤ_[p] →+* ZMod (p ^ n)) : + Ideal ℤ_[p]) : Set ℤ_[p]) := by + rw [PadicInt.ker_toZModPow] + have hp0 : (p : ℝ) ≠ 0 := by + exact_mod_cast (Fact.out : p.Prime).ne_zero + have hr : (p : ℝ) ^ (-n : ℤ) ≠ 0 := zpow_ne_zero (-n : ℤ) hp0 + have hball : + IsOpen (Metric.closedBall (0 : ℤ_[p]) ((p : ℝ) ^ (-n : ℤ))) := + IsUltrametricDist.isOpen_closedBall (0 : ℤ_[p]) hr + have heq : + ((Ideal.span {(p : ℤ_[p]) ^ n} : Ideal ℤ_[p]) : Set ℤ_[p]) = + Metric.closedBall (0 : ℤ_[p]) ((p : ℝ) ^ (-n : ℤ)) := by + ext x + rw [Metric.mem_closedBall, dist_zero_right] + exact (PadicInt.norm_le_pow_iff_mem_span_pow x n).symm + rw [heq] + exact hball + +/-- Reduction of p-adic integers modulo `p^n` is continuous for the +discrete topology on the target. -/ +theorem Internal.continuous_padicIntToZModPow + (p : ℕ) [Fact p.Prime] (n : ℕ) : + @Continuous ℤ_[p] (ZMod (p ^ n)) + (inferInstance : TopologicalSpace ℤ_[p]) ⊥ + (PadicInt.toZModPow n : ℤ_[p] → ZMod (p ^ n)) := by + let : TopologicalSpace (ZMod (p ^ n)) := ⊥ + let : DiscreteTopology (ZMod (p ^ n)) := ⟨rfl⟩ + apply continuous_of_continuousAt_zero + (PadicInt.toZModPow n : ℤ_[p] →+* ZMod (p ^ n)) + rw [ContinuousAt, nhds_discrete (ZMod (p ^ n)), map_zero, Filter.tendsto_pure] + exact (isOpen_ker_padicIntToZModPow p n).mem_nhds + (RingHom.ker (PadicInt.toZModPow n)).zero_mem + +end LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/ProdiscretePadicModule.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/ProdiscretePadicModule.lean new file mode 100644 index 0000000000..cd9d64efd8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/ProdiscretePadicModule.lean @@ -0,0 +1,337 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Module.MinimalAxioms +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.FiniteQuotientPadicModule +/-! +# The p-adic module on the prodiscrete principal-unit limit + +Coordinatewise scalar multiplication makes the prodiscrete inverse limit a topological +module over the p-adic integers. +-/ + +@[expose] public section + +noncomputable +section + +open scoped BigOperators + +universe u v + +namespace LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField +namespace CompleteDVF +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +namespace higherPrincipalUnitGroup + +open LubinTate +open LubinTate.Valuations + +variable {K : Type u} [Field K] + +open Internal + +/-! ## The inverse-limit module and transport to `U^1` -/ + +/-- Coordinatewise p-adic scalar multiplication on the compatible inverse +limit. -/ +noncomputable instance Internal.principalUnitInverseLimitCarrierPadicSMul + (F : LocalField.{u, v} K) : + SMul ℤ_[F.residueCharacteristic] + (Additive (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF)) where + smul a x := Additive.ofMul + ⟨fun n => Additive.toMul + (a • Additive.ofMul ((Additive.toMul x).1 n)), by + intro m n hmn + apply Additive.ofMul.injective + change + principalUnitQuotientCarrierTransitionAdd F.toCompleteDVF hmn + (a • Additive.ofMul ((Additive.toMul x).1 n)) = + a • Additive.ofMul ((Additive.toMul x).1 m) + rw [principalUnitQuotientCarrierTransitionAdd_map_smul] + change + a • Additive.ofMul + (principalUnitQuotientCarrierTransition F.toCompleteDVF hmn + ((Additive.toMul x).1 n)) = + a • Additive.ofMul ((Additive.toMul x).1 m) + rw [(Additive.toMul x).2 hmn]⟩ + +/-- +The defining evaluation formula for `Internal.principalUnitInverseLimitCarrierPadic_smul` is +`Additive.ofMul (Internal.principalUnitInverseLimitCarrierEval F.toCompleteDVF n (Additive.toMul +(a • x))) = a • Additive.ofMul (Internal.principalUnitInverseLimitCarrierEval F.toCompleteDVF n +(Additive.toMul x))`. +-/ +theorem Internal.principalUnitInverseLimitCarrierPadic_smul_apply + (F : LocalField.{u, v} K) + (a : ℤ_[F.residueCharacteristic]) + (x : Additive (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF)) + (n : ℕ) : + Additive.ofMul + (Internal.principalUnitInverseLimitCarrierEval F.toCompleteDVF n + (Additive.toMul (a • x))) = + a • Additive.ofMul + (Internal.principalUnitInverseLimitCarrierEval F.toCompleteDVF n + (Additive.toMul x)) := + rfl + +/-- +Equips the target in `Module ℤ_[F.residueCharacteristic] (Additive +(Internal.principalUnitInverseLimitCarrier F.toCompleteDVF))` with the indicated module structure. +-/ +noncomputable instance Internal.principalUnitInverseLimitCarrierPadicModule + (F : LocalField.{u, v} K) : + Module ℤ_[F.residueCharacteristic] + (Additive (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF)) := + Module.ofMinimalAxioms + (fun (a : ℤ_[F.residueCharacteristic]) + (x y : Additive + (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF)) => by + apply Additive.toMul.injective + apply Subtype.ext + funext n + let : Module ℤ_[F.residueCharacteristic] + (Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n)) := + principalUnitQuotientCarrierPadicModule F n + apply Additive.ofMul.injective + change + a • (Additive.ofMul ((Additive.toMul x).1 n) + + Additive.ofMul ((Additive.toMul y).1 n)) = + a • Additive.ofMul ((Additive.toMul x).1 n) + + a • Additive.ofMul ((Additive.toMul y).1 n) + exact (principalUnitQuotientCarrierPadicModule F n).smul_add a + (Additive.ofMul ((Additive.toMul x).1 n)) + (Additive.ofMul ((Additive.toMul y).1 n))) + (fun (a b : ℤ_[F.residueCharacteristic]) + (x : Additive + (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF)) => by + apply Additive.toMul.injective + apply Subtype.ext + funext n + let : Module ℤ_[F.residueCharacteristic] + (Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n)) := + principalUnitQuotientCarrierPadicModule F n + apply Additive.ofMul.injective + change + (a + b) • Additive.ofMul ((Additive.toMul x).1 n) = + a • Additive.ofMul ((Additive.toMul x).1 n) + + b • Additive.ofMul ((Additive.toMul x).1 n) + exact (principalUnitQuotientCarrierPadicModule F n).add_smul a b + (Additive.ofMul ((Additive.toMul x).1 n))) + (fun (a b : ℤ_[F.residueCharacteristic]) + (x : Additive + (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF)) => by + apply Additive.toMul.injective + apply Subtype.ext + funext n + let : Module ℤ_[F.residueCharacteristic] + (Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n)) := + principalUnitQuotientCarrierPadicModule F n + apply Additive.ofMul.injective + change + (a * b) • Additive.ofMul ((Additive.toMul x).1 n) = + a • b • Additive.ofMul ((Additive.toMul x).1 n) + exact (principalUnitQuotientCarrierPadicModule F n).mul_smul a b + (Additive.ofMul ((Additive.toMul x).1 n))) + (fun (x : Additive + (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF)) => by + apply Additive.toMul.injective + apply Subtype.ext + funext n + let : Module ℤ_[F.residueCharacteristic] + (Additive (Internal.principalUnitQuotientCarrier F.toCompleteDVF n)) := + principalUnitQuotientCarrierPadicModule F n + apply Additive.ofMul.injective + change + (1 : ℤ_[F.residueCharacteristic]) • + Additive.ofMul ((Additive.toMul x).1 n) = + Additive.ofMul ((Additive.toMul x).1 n) + exact (principalUnitQuotientCarrierPadicModule F n).one_smul + (Additive.ofMul ((Additive.toMul x).1 n))) + +/-- +Equips the target in `Module ℤ_[F.residueCharacteristic] (PrincipalUnitProdiscreteLimit +F.toCompleteDVF)` with the indicated module structure. +-/ +noncomputable instance principalUnitProdiscreteLimitPadicModule + (F : LocalField.{u, v} K) : + Module ℤ_[F.residueCharacteristic] + (PrincipalUnitProdiscreteLimit F.toCompleteDVF) := + AddEquiv.module + (β := Additive (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF)) + ℤ_[F.residueCharacteristic] + (PrincipalUnitProdiscreteLimit.addEquiv F.toCompleteDVF) + +/-- +Establishes the identity `PrincipalUnitProdiscreteLimit.addEquiv F.toCompleteDVF (a • x) = a • +PrincipalUnitProdiscreteLimit.addEquiv F.toCompleteDVF x`. +-/ +theorem PrincipalUnitProdiscreteLimit.addEquiv_map_smul + (F : LocalField.{u, v} K) (a : ℤ_[F.residueCharacteristic]) + (x : PrincipalUnitProdiscreteLimit F.toCompleteDVF) : + PrincipalUnitProdiscreteLimit.addEquiv F.toCompleteDVF (a • x) = + a • PrincipalUnitProdiscreteLimit.addEquiv F.toCompleteDVF x := + rfl + +/-- +Establishes the identity `PrincipalUnitProdiscreteLimit.coordinate F.toCompleteDVF n (a • x) = a • +PrincipalUnitProdiscreteLimit.coordinate F.toCompleteDVF n x`. +-/ +theorem PrincipalUnitProdiscreteLimit.coordinate_smul + (F : LocalField.{u, v} K) (n : ℕ) + (a : ℤ_[F.residueCharacteristic]) + (x : PrincipalUnitProdiscreteLimit F.toCompleteDVF) : + PrincipalUnitProdiscreteLimit.coordinate F.toCompleteDVF n (a • x) = + a • PrincipalUnitProdiscreteLimit.coordinate F.toCompleteDVF n x := by + apply (DiscretePrincipalUnitQuotient.addEquiv F.toCompleteDVF n).injective + rw [DiscretePrincipalUnitQuotient.addEquiv_map_smul, + PrincipalUnitProdiscreteLimit.coordinate_apply, + PrincipalUnitProdiscreteLimit.coordinate_apply, + DiscretePrincipalUnitQuotient.addEquiv_of, + DiscretePrincipalUnitQuotient.addEquiv_of, + PrincipalUnitProdiscreteLimit.addEquiv_map_smul] + exact Internal.principalUnitInverseLimitCarrierPadic_smul_apply F a + (PrincipalUnitProdiscreteLimit.addEquiv F.toCompleteDVF x) n + +/-- Evaluation at a wrapped coordinate as a `Z_p`-linear map. -/ +noncomputable def PrincipalUnitProdiscreteLimit.coordinateLinear + (F : LocalField.{u, v} K) (n : ℕ) : + PrincipalUnitProdiscreteLimit F.toCompleteDVF →ₗ[ + ℤ_[F.residueCharacteristic]] + DiscretePrincipalUnitQuotient F.toCompleteDVF n where + toFun := PrincipalUnitProdiscreteLimit.coordinate F.toCompleteDVF n + map_add' := fun x y => + (PrincipalUnitProdiscreteLimit.coordinate F.toCompleteDVF n).map_add x y + map_smul' := PrincipalUnitProdiscreteLimit.coordinate_smul F n + +/-- Joint continuity of the coordinatewise p-adic action on the inverse +limit of discrete finite quotients. -/ +theorem Internal.continuous_principalUnitInverseLimitCarrierPadic_smul + (F : LocalField.{u, v} K) : + letI : (n : ℕ) → TopologicalSpace + (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) := fun _ => ⊥ + Continuous fun z : ℤ_[F.residueCharacteristic] × + Additive (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF) => + z.1 • z.2 := by + let : (n : ℕ) → TopologicalSpace + (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) := fun _ => ⊥ + let : (n : ℕ) → DiscreteTopology + (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) := fun _ => ⟨rfl⟩ + have hmul : Continuous fun z : ℤ_[F.residueCharacteristic] × + Additive (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF) => + Additive.toMul (z.1 • z.2) := by + exact Continuous.subtype_mk + (continuous_pi fun n => by + have hlimval : Continuous fun x : Additive + (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF) => + (Additive.toMul x).1 := + continuous_subtype_val + have hcoord : Continuous fun z : ℤ_[F.residueCharacteristic] × + Additive (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF) => + Additive.ofMul ((Additive.toMul z.2).1 n) := + ((continuous_apply n).comp hlimval).comp continuous_snd + have hs := (Internal.continuous_principalUnitQuotientCarrierPadicScalar F n).comp + (continuous_fst.prodMk hcoord) + change Continuous fun z : ℤ_[F.residueCharacteristic] × + Additive (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF) => + Additive.toMul + (principalUnitQuotientCarrierPadicScalar F n z.1 + (Additive.ofMul ((Additive.toMul z.2).1 n))) + exact hs) + (fun z : ℤ_[F.residueCharacteristic] × + Additive (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF) => by + intro i j hij + exact (Additive.toMul (z.1 • z.2)).2 hij) + exact hmul + +/-- +The specified map is continuous: `Continuous fun z : ℤ_[F.residueCharacteristic] × +PrincipalUnitProdiscreteLimit F.toCompleteDVF => z.1 • z.2`. +-/ +theorem continuous_principalUnitProdiscreteLimitPadic_smul + (F : LocalField.{u, v} K) : + Continuous fun z : ℤ_[F.residueCharacteristic] × + PrincipalUnitProdiscreteLimit F.toCompleteDVF => + z.1 • z.2 := by + let : (n : ℕ) → TopologicalSpace + (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) := fun _ => ⊥ + let e := (PrincipalUnitProdiscreteLimit.homeomorph F.toCompleteDVF).trans + (WithTopology.homeomorph + (α := Additive + (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF)) + (topology := principalUnitProdiscreteTopology F.toCompleteDVF)) + have hpair : Continuous fun z : ℤ_[F.residueCharacteristic] × + PrincipalUnitProdiscreteLimit F.toCompleteDVF => + (z.1, e z.2) := + continuous_fst.prodMk (e.continuous.comp continuous_snd) + have h := e.continuous_symm.comp + ((Internal.continuous_principalUnitInverseLimitCarrierPadic_smul F).comp hpair) + exact h + +/-- +The scalar action in `ContinuousSMul ℤ_[F.residueCharacteristic] (PrincipalUnitProdiscreteLimit +F.toCompleteDVF)` is continuous. +-/ +noncomputable instance principalUnitProdiscreteLimitContinuousSMul + (F : LocalField.{u, v} K) : + ContinuousSMul ℤ_[F.residueCharacteristic] + (PrincipalUnitProdiscreteLimit F.toCompleteDVF) := + ⟨continuous_principalUnitProdiscreteLimitPadic_smul F⟩ + +/-- Addition on the type-level prodiscrete principal-unit limit is +continuous. -/ +noncomputable instance principalUnitProdiscreteLimitContinuousAdd + (F : LocalField.{u, v} K) : + ContinuousAdd (PrincipalUnitProdiscreteLimit F.toCompleteDVF) := by + let : (n : ℕ) → TopologicalSpace + (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) := fun _ => ⊥ + let : (n : ℕ) → DiscreteTopology + (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) := fun _ => ⟨rfl⟩ + let e := (PrincipalUnitProdiscreteLimit.homeomorph F.toCompleteDVF).trans + (WithTopology.homeomorph + (α := Additive + (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF)) + (topology := principalUnitProdiscreteTopology F.toCompleteDVF)) + refine ⟨?_⟩ + have hlim : Continuous fun z : + Additive (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF) × + Additive (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF) => + z.1 + z.2 := by + apply Continuous.subtype_mk + apply continuous_pi + intro n + have hx : Continuous fun z : + Additive (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF) × + Additive (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF) => + (Additive.toMul z.1).1 n := + (continuous_apply n).comp + (continuous_subtype_val.comp continuous_fst) + have hy : Continuous fun z : + Additive (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF) × + Additive (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF) => + (Additive.toMul z.2).1 n := + (continuous_apply n).comp + (continuous_subtype_val.comp continuous_snd) + exact (continuous_of_discreteTopology : Continuous fun z : + Internal.principalUnitQuotientCarrier F.toCompleteDVF n × + Internal.principalUnitQuotientCarrier F.toCompleteDVF n => z.1 * z.2).comp + (hx.prodMk hy) + have hpair : Continuous fun z : + PrincipalUnitProdiscreteLimit F.toCompleteDVF × + PrincipalUnitProdiscreteLimit F.toCompleteDVF => + (e z.1, e z.2) := + (e.continuous.comp continuous_fst).prodMk + (e.continuous.comp continuous_snd) + have htransport := e.continuous_symm.comp (hlim.comp hpair) + exact htransport + +end higherPrincipalUnitGroup +end CompleteDVF +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/QuotientTransition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/QuotientTransition.lean new file mode 100644 index 0000000000..b959ca5363 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/QuotientTransition.lean @@ -0,0 +1,82 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitCore +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.TopologyModelTypes +/-! +# Transitions between principal-unit quotients + +These additive maps use the concrete principal-unit filtration of a complete +discrete valuation field. Neither finiteness nor a scalar action is required. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + +open ValuationTheory.DiscreteValuationField +open Internal + +universe u v + +variable {K : Type u} [Field K] + +/-- Additive form of a transition between principal-unit quotients. -/ +def Internal.principalUnitQuotientCarrierTransitionAdd + (F : CompleteDVF.{u, v} K) {m n : ℕ} (hmn : m ≤ n) : + Additive (Internal.principalUnitQuotientCarrier F n) →+ + Additive (Internal.principalUnitQuotientCarrier F m) where + toFun x := Additive.ofMul + (principalUnitQuotientCarrierTransition F hmn (Additive.toMul x)) + map_zero' := by + change Additive.ofMul + (principalUnitQuotientCarrierTransition F hmn 1) = Additive.ofMul 1 + rw [map_one] + map_add' x y := by + change Additive.ofMul + (principalUnitQuotientCarrierTransition F hmn + (Additive.toMul x * Additive.toMul y)) = + Additive.ofMul + (principalUnitQuotientCarrierTransition F hmn (Additive.toMul x) * + principalUnitQuotientCarrierTransition F hmn (Additive.toMul y)) + rw [map_mul] + +namespace DiscretePrincipalUnitQuotient + +/-- Reduction between two wrapped discrete quotient coordinates. -/ +def transition (F : CompleteDVF.{u, v} K) {m n : ℕ} (hmn : m ≤ n) : + DiscretePrincipalUnitQuotient F n →+ + DiscretePrincipalUnitQuotient F m where + toFun x := of F m + (Internal.principalUnitQuotientCarrierTransitionAdd F hmn x.val) + map_zero' := by + apply (addEquiv F m).injective + change Internal.principalUnitQuotientCarrierTransitionAdd F hmn 0 = 0 + exact (Internal.principalUnitQuotientCarrierTransitionAdd F hmn).map_zero + map_add' x y := by + apply (addEquiv F m).injective + change Internal.principalUnitQuotientCarrierTransitionAdd F hmn + (x.val + y.val) = + Internal.principalUnitQuotientCarrierTransitionAdd F hmn x.val + + Internal.principalUnitQuotientCarrierTransitionAdd F hmn y.val + exact (Internal.principalUnitQuotientCarrierTransitionAdd F hmn).map_add x.val y.val + +/-- The wrapped transition has the original additive transition as its value. -/ +@[simp] theorem val_transition + (F : CompleteDVF.{u, v} K) {m n : ℕ} (hmn : m ≤ n) + (x : DiscretePrincipalUnitQuotient F n) : + (transition F hmn x).val = + Internal.principalUnitQuotientCarrierTransitionAdd F hmn x.val := + rfl + +end DiscretePrincipalUnitQuotient + +end LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/TopologyModelTypes.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/TopologyModelTypes.lean new file mode 100644 index 0000000000..fea71bcc9a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/TopologyModelTypes.lean @@ -0,0 +1,387 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitCore +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.Models +/-! +# Type-level topology models for principal units + +Adic principal units, discrete finite quotients, and the prodiscrete inverse limit are +represented by distinct wrapper types so that their topologies cannot be confused by instance +selection. +-/ + +@[expose] public section + +noncomputable +section + +open scoped BigOperators + +universe u v + +namespace LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField +namespace CompleteDVF +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +namespace higherPrincipalUnitGroup + +open LubinTate +open LubinTate.Valuations + +variable {K : Type u} [Field K] + +open Internal + +/-! ## Topology is part of the type + +The algebraic quotient and inverse-limit types above deliberately carry no +preferred topology. The following models distinguish the topologies used in +the p-adic action at the type level. In particular, no theorem below can +silently reinterpret the same quotient as both a quotient-topological and a +discrete space. +-/ + +/-- The topology on additive first principal units induced by the maximal- +ideal adic topology on the valuation ring. -/ +@[implicit_reducible] +noncomputable def principalUnitAdicTopology + (F : CompleteDVF.{u, v} K) : + TopologicalSpace + (Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)) := by + letI : TopologicalSpace F.valuationSubring := + (uniformizerPowerIdeal (chosenPrincipalUnitPadicUniformizer F) 1).adicTopology + exact inferInstance + +/-- First principal units with their canonical adic topology fixed in the +type. -/ +structure AdicPrincipalUnits (F : CompleteDVF.{u, v} K) where + /-- The underlying additive principal unit. -/ + val : Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + +namespace AdicPrincipalUnits + +/-- The carrier equivalence of the adic model. -/ +def equiv (F : CompleteDVF.{u, v} K) : + AdicPrincipalUnits F ≃ + Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) where + toFun := AdicPrincipalUnits.val + invFun := fun x => ⟨x⟩ + left_inv := fun x => by cases x; rfl + right_inv := fun _ => rfl + +/-- +Equips the target with its canonical `TopologicalSpace` structure, namely `TopologicalSpace +(AdicPrincipalUnits F)`. +-/ +noncomputable instance (F : CompleteDVF.{u, v} K) : + TopologicalSpace (AdicPrincipalUnits F) := + (principalUnitAdicTopology F).induced AdicPrincipalUnits.val + +/-- Forget the wrapper while retaining the topology recorded in its type. -/ +noncomputable def homeomorph (F : CompleteDVF.{u, v} K) : + AdicPrincipalUnits F ≃ₜ + WithTopology + (Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)) + (principalUnitAdicTopology F) where + toEquiv := (equiv F).trans + (WithTopology.equiv _ (principalUnitAdicTopology F)).symm + continuous_toFun := by + let : TopologicalSpace + (Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)) := + principalUnitAdicTopology F + change Continuous fun x : AdicPrincipalUnits F => + WithTopology.toTopology (principalUnitAdicTopology F) x.val + exact + (WithTopology.continuous_toTopology (principalUnitAdicTopology F)).comp + continuous_induced_dom + continuous_invFun := by + let : TopologicalSpace + (Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)) := + principalUnitAdicTopology F + change Continuous fun x : WithTopology + (Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)) + (principalUnitAdicTopology F) => + (⟨x.ofTopology⟩ : AdicPrincipalUnits F) + exact + continuous_induced_rng.2 + (WithTopology.continuous_ofTopology (principalUnitAdicTopology F)) + +/-- +Equips the target with its canonical `AddCommGroup` structure, namely `AddCommGroup +(AdicPrincipalUnits F)`. +-/ +instance (F : CompleteDVF.{u, v} K) : AddCommGroup (AdicPrincipalUnits F) := + (equiv F).addCommGroup + +/-- Put a first principal unit into the canonical adic model. -/ +def of (F : CompleteDVF.{u, v} K) + (x : Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)) : + AdicPrincipalUnits F := + ⟨x⟩ + +/-- Establishes the identity `(of F x).val = x`. -/ +@[simp] theorem val_of (F : CompleteDVF.{u, v} K) + (x : Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)) : + (of F x).val = x := rfl + +/-- Establishes the identity `of F x.val = x`. -/ +@[simp] theorem of_val (F : CompleteDVF.{u, v} K) + (x : AdicPrincipalUnits F) : of F x.val = x := by + cases x + rfl + +/-- The algebraic equivalence underlying the adic model. -/ +def addEquiv (F : CompleteDVF.{u, v} K) : + AdicPrincipalUnits F ≃+ + Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) := + (equiv F).addEquiv + +end AdicPrincipalUnits + +/-- The `n`-th principal-unit quotient with its mathematically intended +discrete topology fixed in the type. Its carrier is finite when `F` is a +`LocalField`, but not for an arbitrary `CompleteDVF`. -/ +structure DiscretePrincipalUnitQuotient + (F : CompleteDVF.{u, v} K) (n : ℕ) where + /-- The underlying quotient class. -/ + val : Additive (Internal.principalUnitQuotientCarrier F n) + +namespace DiscretePrincipalUnitQuotient + +/-- Establishes the identity `x = y`. -/ +@[ext] +theorem ext {F : CompleteDVF.{u, v} K} {n : ℕ} + {x y : DiscretePrincipalUnitQuotient F n} (h : x.val = y.val) : x = y := by + cases x + cases y + cases h + rfl + +/-- The carrier equivalence of a discrete coordinate. -/ +def equiv (F : CompleteDVF.{u, v} K) (n : ℕ) : + DiscretePrincipalUnitQuotient F n ≃ + Additive (Internal.principalUnitQuotientCarrier F n) where + toFun := DiscretePrincipalUnitQuotient.val + invFun := fun x => ⟨x⟩ + left_inv := fun x => by cases x; rfl + right_inv := fun _ => rfl + +/-- +Equips the target with its canonical `TopologicalSpace` structure, namely `TopologicalSpace +(DiscretePrincipalUnitQuotient F n)`. +-/ +instance (F : CompleteDVF.{u, v} K) (n : ℕ) : + TopologicalSpace (DiscretePrincipalUnitQuotient F n) := ⊥ + +/-- +Equips the target with its canonical `DiscreteTopology` structure, namely `DiscreteTopology +(DiscretePrincipalUnitQuotient F n)`. +-/ +instance (F : CompleteDVF.{u, v} K) (n : ℕ) : + DiscreteTopology (DiscretePrincipalUnitQuotient F n) := + ⟨rfl⟩ + +/-- +Equips the target with its canonical `AddCommGroup` structure, namely `AddCommGroup +(DiscretePrincipalUnitQuotient F n)`. +-/ +instance (F : CompleteDVF.{u, v} K) (n : ℕ) : + AddCommGroup (DiscretePrincipalUnitQuotient F n) := + (equiv F n).addCommGroup + +/-- Algebraic equivalence forgetting the discrete coordinate wrapper. -/ +def addEquiv (F : CompleteDVF.{u, v} K) (n : ℕ) : + DiscretePrincipalUnitQuotient F n ≃+ + Additive (Internal.principalUnitQuotientCarrier F n) := + (equiv F n).addEquiv + +/-- The defining evaluation formula for `addEquiv` is `addEquiv F n x = x.val`. -/ +@[simp] theorem addEquiv_apply (F : CompleteDVF.{u, v} K) (n : ℕ) + (x : DiscretePrincipalUnitQuotient F n) : + addEquiv F n x = x.val := + rfl + +/-- Put a quotient class into its discrete model. -/ +def of (F : CompleteDVF.{u, v} K) (n : ℕ) + (x : Additive (Internal.principalUnitQuotientCarrier F n)) : + DiscretePrincipalUnitQuotient F n := + ⟨x⟩ + +/-- The defining evaluation formula for `addEquiv` is `(addEquiv F n).symm x = of F n x`. -/ +@[simp] theorem addEquiv_symm_apply (F : CompleteDVF.{u, v} K) (n : ℕ) + (x : Additive (Internal.principalUnitQuotientCarrier F n)) : + (addEquiv F n).symm x = of F n x := + rfl + +/-- Establishes the identity `(of F n x).val = x`. -/ +@[simp] theorem val_of (F : CompleteDVF.{u, v} K) (n : ℕ) + (x : Additive (Internal.principalUnitQuotientCarrier F n)) : + (of F n x).val = x := rfl + +/-- Establishes the identity `addEquiv F n (of F n x) = x`. -/ +@[simp] theorem addEquiv_of (F : CompleteDVF.{u, v} K) (n : ℕ) + (x : Additive (Internal.principalUnitQuotientCarrier F n)) : + addEquiv F n (of F n x) = x := by + rw [addEquiv_apply, val_of] + +/-- Establishes the identity `of F n x.val = x`. -/ +@[simp] theorem of_val (F : CompleteDVF.{u, v} K) (n : ℕ) + (x : DiscretePrincipalUnitQuotient F n) : + of F n x.val = x := by + cases x + rfl + +end DiscretePrincipalUnitQuotient + +/-- The product topology of the discrete coordinates on the additive +principal-unit inverse limit. -/ +@[implicit_reducible] +noncomputable def principalUnitProdiscreteTopology + (F : CompleteDVF.{u, v} K) : + TopologicalSpace (Additive (Internal.principalUnitInverseLimitCarrier F)) := by + letI : (n : ℕ) → TopologicalSpace (Internal.principalUnitQuotientCarrier F n) := + fun _ => ⊥ + exact inferInstance + +/-- The principal-unit inverse limit with its prodiscrete topology fixed in +the type. For a local field, the coordinate quotients are finite and this +specializes to the usual profinite topology. -/ +structure PrincipalUnitProdiscreteLimit (F : CompleteDVF.{u, v} K) where + /-- The underlying compatible family. -/ + val : Additive (Internal.principalUnitInverseLimitCarrier F) + +namespace PrincipalUnitProdiscreteLimit + +/-- The carrier equivalence of the prodiscrete inverse-limit model. -/ +def equiv (F : CompleteDVF.{u, v} K) : + PrincipalUnitProdiscreteLimit F ≃ + Additive (Internal.principalUnitInverseLimitCarrier F) where + toFun := PrincipalUnitProdiscreteLimit.val + invFun := fun x => ⟨x⟩ + left_inv := fun x => by cases x; rfl + right_inv := fun _ => rfl + +/-- +Equips the target with its canonical `TopologicalSpace` structure, namely `TopologicalSpace +(PrincipalUnitProdiscreteLimit F)`. +-/ +noncomputable instance (F : CompleteDVF.{u, v} K) : + TopologicalSpace (PrincipalUnitProdiscreteLimit F) := + (principalUnitProdiscreteTopology F).induced PrincipalUnitProdiscreteLimit.val + +/-- Forget the wrapper while retaining its fixed prodiscrete topology. -/ +noncomputable def homeomorph (F : CompleteDVF.{u, v} K) : + PrincipalUnitProdiscreteLimit F ≃ₜ + WithTopology + (Additive (Internal.principalUnitInverseLimitCarrier F)) + (principalUnitProdiscreteTopology F) where + toEquiv := (equiv F).trans + (WithTopology.equiv _ (principalUnitProdiscreteTopology F)).symm + continuous_toFun := by + let : TopologicalSpace + (Additive (Internal.principalUnitInverseLimitCarrier F)) := + principalUnitProdiscreteTopology F + change Continuous fun x : PrincipalUnitProdiscreteLimit F => + WithTopology.toTopology (principalUnitProdiscreteTopology F) x.val + exact + (WithTopology.continuous_toTopology (principalUnitProdiscreteTopology F)).comp + continuous_induced_dom + continuous_invFun := by + let : TopologicalSpace + (Additive (Internal.principalUnitInverseLimitCarrier F)) := + principalUnitProdiscreteTopology F + change Continuous fun x : WithTopology + (Additive (Internal.principalUnitInverseLimitCarrier F)) + (principalUnitProdiscreteTopology F) => + (⟨x.ofTopology⟩ : PrincipalUnitProdiscreteLimit F) + exact + continuous_induced_rng.2 + (WithTopology.continuous_ofTopology (principalUnitProdiscreteTopology F)) + +/-- +Equips the target with its canonical `AddCommGroup` structure, namely `AddCommGroup +(PrincipalUnitProdiscreteLimit F)`. +-/ +instance (F : CompleteDVF.{u, v} K) : + AddCommGroup (PrincipalUnitProdiscreteLimit F) := + (equiv F).addCommGroup + +/-- The algebraic equivalence forgetting the type-level prodiscrete model. -/ +def addEquiv (F : CompleteDVF.{u, v} K) : + PrincipalUnitProdiscreteLimit F ≃+ + Additive (Internal.principalUnitInverseLimitCarrier F) := + (equiv F).addEquiv + +/-- The defining evaluation formula for `addEquiv` is `addEquiv F x = x.val`. -/ +@[simp] theorem addEquiv_apply (F : CompleteDVF.{u, v} K) + (x : PrincipalUnitProdiscreteLimit F) : + addEquiv F x = x.val := + rfl + +/-- Put a compatible family into its prodiscrete model. -/ +def of (F : CompleteDVF.{u, v} K) + (x : Additive (Internal.principalUnitInverseLimitCarrier F)) : + PrincipalUnitProdiscreteLimit F := + ⟨x⟩ + +/-- The defining evaluation formula for `addEquiv` is `(addEquiv F).symm x = of F x`. -/ +@[simp] theorem addEquiv_symm_apply (F : CompleteDVF.{u, v} K) + (x : Additive (Internal.principalUnitInverseLimitCarrier F)) : + (addEquiv F).symm x = of F x := + rfl + +/-- Establishes the identity `(of F x).val = x`. -/ +@[simp] theorem val_of (F : CompleteDVF.{u, v} K) + (x : Additive (Internal.principalUnitInverseLimitCarrier F)) : + (of F x).val = x := rfl + +/-- Establishes the identity `of F x.val = x`. -/ +@[simp] theorem of_val (F : CompleteDVF.{u, v} K) + (x : PrincipalUnitProdiscreteLimit F) : of F x.val = x := by + cases x + rfl + +/-- Evaluation at one discrete coordinate, as an additive homomorphism. -/ +def coordinate (F : CompleteDVF.{u, v} K) (n : ℕ) : + PrincipalUnitProdiscreteLimit F →+ + DiscretePrincipalUnitQuotient F n := + (DiscretePrincipalUnitQuotient.addEquiv F n).symm.toAddMonoidHom.comp + ((MonoidHom.toAdditive + (Internal.principalUnitInverseLimitCarrierEval F n)).comp + (addEquiv F).toAddMonoidHom) + +/-- +The defining evaluation formula for `coordinate` is `coordinate F n x = +DiscretePrincipalUnitQuotient.of F n (Additive.ofMul +(Internal.principalUnitInverseLimitCarrierEval F n (Additive.toMul (addEquiv F x))))`. +-/ +@[simp] theorem coordinate_apply (F : CompleteDVF.{u, v} K) (n : ℕ) + (x : PrincipalUnitProdiscreteLimit F) : + coordinate F n x = DiscretePrincipalUnitQuotient.of F n + (Additive.ofMul + (Internal.principalUnitInverseLimitCarrierEval F n + (Additive.toMul (addEquiv F x)))) := + rfl + +end PrincipalUnitProdiscreteLimit + +end higherPrincipalUnitGroup +end CompleteDVF +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/WithZeroValuationTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/WithZeroValuationTopology.lean new file mode 100644 index 0000000000..86b7b1c746 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/WithZeroValuationTopology.lean @@ -0,0 +1,236 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.DenominatorValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicPadicModule +/-! +# Principal-unit topology from a normalized valuation + +For a complete discrete valuation with value group `WithZero (Multiplicative ℤ)`, the +inherited topology agrees with the canonical adic model, so the p-adic action and addition are +continuous on the original principal-unit carrier. +-/ + +@[expose] public section + +noncomputable +section + +open scoped BigOperators + +universe u v + +namespace LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField +namespace CompleteDVF +open LocalFieldTheory.DiscreteValuationField.CompleteDVF +namespace higherPrincipalUnitGroup + +open LubinTate +open LubinTate.Valuations + +variable {K : Type u} [Field K] + +open Internal + +/-- Compare the type-level adic model with the principal-unit carrier under +the canonical topology of a normalized complete discrete valuation. -/ +noncomputable def adicPrincipalUnitsContinuousAddEquivUnderlyingOfWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] : + let F : LocalField.{u, 0} K := LocalField.ofWithZeroValuation v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + AdicPrincipalUnits F.toCompleteDVF ≃ₜ+ + Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1) := by + let F : LocalField.{u, 0} K := LocalField.ofWithZeroValuation v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + letI : ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete + (Valued.v : _root_.Valuation K + (WithZero (Multiplicative ℤ))) := by + change ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v + infer_instance + let π := chosenPrincipalUnitPadicUniformizer F.toCompleteDVF + have hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K) := + chosenPrincipalUnitPadicUniformizer_isUniformizer F.toCompleteDVF + have hadic : + (inferInstance : TopologicalSpace F.toCompleteDVF.valuationSubring) = + (LubinTate.Valuations.uniformizerPowerIdeal π 1).adicTopology := by + have hmax : + (inferInstance : TopologicalSpace F.toCompleteDVF.valuationSubring) = + F.toCompleteDVF.maximalIdeal.adicTopology := by + exact ValuationTheory.Valuations.rankOneDiscreteValuationSubring_isAdic + (K := K) (Gamma := WithZero (Multiplicative ℤ)) + have hideal : LubinTate.Valuations.uniformizerPowerIdeal π 1 = + F.toCompleteDVF.maximalIdeal := by + rw [LubinTate.Valuations.uniformizerPowerIdeal, pow_one, + ← F.toCompleteDVF.maximalIdeal_eq_span_uniformizer hπ] + simpa only [hideal] using hmax + let carrierTopology + (t : TopologicalSpace F.toCompleteDVF.valuationSubring) : + TopologicalSpace + (Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1)) := + letI : TopologicalSpace F.toCompleteDVF.valuationSubring := t + inferInstance + have hcarrier : + (inferInstance : TopologicalSpace + (Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1))) = + principalUnitAdicTopology F.toCompleteDVF := by + change carrierTopology + (inferInstance : TopologicalSpace F.toCompleteDVF.valuationSubring) = + carrierTopology + ((LubinTate.Valuations.uniformizerPowerIdeal π 1).adicTopology) + exact congrArg carrierTopology hadic + have hcontinuousAdic : + @Continuous + (AdicPrincipalUnits F.toCompleteDVF) + (Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1)) + inferInstance + (principalUnitAdicTopology F.toCompleteDVF) + (AdicPrincipalUnits.equiv F.toCompleteDVF) := + continuous_induced_dom + have hcontinuousAdic_symm : + @Continuous + (Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1)) + (AdicPrincipalUnits F.toCompleteDVF) + (principalUnitAdicTopology F.toCompleteDVF) + inferInstance + (AdicPrincipalUnits.equiv F.toCompleteDVF).symm := + continuous_induced_rng.2 (continuous_id_of_le le_rfl) + have hcontinuous : Continuous + (AdicPrincipalUnits.equiv F.toCompleteDVF) := by + exact Eq.mpr + (congrArg + (fun t : TopologicalSpace + (Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1)) => + @Continuous + (AdicPrincipalUnits F.toCompleteDVF) + (Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1)) + inferInstance t + (AdicPrincipalUnits.equiv F.toCompleteDVF)) + hcarrier) + hcontinuousAdic + have hcontinuous_symm : Continuous + (AdicPrincipalUnits.equiv F.toCompleteDVF).symm := by + exact Eq.mpr + (congrArg + (fun t : TopologicalSpace + (Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1)) => + @Continuous + (Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1)) + (AdicPrincipalUnits F.toCompleteDVF) + t inferInstance + (AdicPrincipalUnits.equiv F.toCompleteDVF).symm) + hcarrier) + hcontinuousAdic_symm + exact ContinuousAddEquiv.mk' + { toEquiv := AdicPrincipalUnits.equiv F.toCompleteDVF + continuous_toFun := hcontinuous + continuous_invFun := hcontinuous_symm } + (fun _ _ => rfl) + +/-- +The continuous additive comparison from adic principal units to the underlying local-field model +preserves `ℤ_p`-scalar multiplication. +-/ +@[simp] theorem adicPrincipalUnitsContinuousAddEquivUnderlyingOfWithZeroValuation_map_smul + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] : + let F : LocalField.{u, 0} K := LocalField.ofWithZeroValuation v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + ∀ (a : ℤ_[F.residueCharacteristic]) + (x : AdicPrincipalUnits F.toCompleteDVF), + adicPrincipalUnitsContinuousAddEquivUnderlyingOfWithZeroValuation v + (a • x) = + a • adicPrincipalUnitsContinuousAddEquivUnderlyingOfWithZeroValuation + v x := by + let F : LocalField.{u, 0} K := LocalField.ofWithZeroValuation v + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + dsimp only + intro a x + exact (AdicPrincipalUnits.linearEquivUnderlying F).map_smul a x + +/-- The same canonical action is jointly continuous for the topology carried +directly by a standard `ℤᵐ⁰`-valued complete discrete valuation. The bridge +is the equality between the inherited valuation topology on the valuation +ring and its maximal-ideal adic topology. -/ +theorem principalUnitPadicContinuousSMulOfWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] : + let F : LocalField.{u, 0} K := LocalField.ofWithZeroValuation v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + ContinuousSMul ℤ_[F.residueCharacteristic] + (Additive ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1)) := by + let F : LocalField.{u, 0} K := LocalField.ofWithZeroValuation v + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let e := + adicPrincipalUnitsContinuousAddEquivUnderlyingOfWithZeroValuation v + refine ⟨?_⟩ + have hpair : Continuous fun z : ℤ_[F.residueCharacteristic] × + Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1) => + (z.1, e.symm z.2) := + continuous_fst.prodMk (e.continuous_symm.comp continuous_snd) + have htransport := e.continuous.comp (continuous_smul.comp hpair) + exact htransport + +/-- Continuous addition on `Additive U^1` for the direct normalized +valuation topology. -/ +theorem principalUnitPadicContinuousAddOfWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] : + let F : LocalField.{u, 0} K := LocalField.ofWithZeroValuation v + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + ContinuousAdd (Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1)) := by + let F : LocalField.{u, 0} K := LocalField.ofWithZeroValuation v + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let e := + adicPrincipalUnitsContinuousAddEquivUnderlyingOfWithZeroValuation v + refine ⟨?_⟩ + have hpair : Continuous fun z : + Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1) × + Additive + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1) => + (e.symm z.1, e.symm z.2) := + (e.continuous_symm.comp continuous_fst).prodMk + (e.continuous_symm.comp continuous_snd) + have htransport := e.continuous.comp (continuous_add.comp hpair) + exact htransport + +end higherPrincipalUnitGroup +end CompleteDVF +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits.lean new file mode 100644 index 0000000000..d4939a260b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.AutomorphismTransport +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Filtration +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueQuotient +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueRoots +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerLift + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/AutomorphismTransport.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/AutomorphismTransport.lean new file mode 100644 index 0000000000..20c77e6197 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/AutomorphismTransport.lean @@ -0,0 +1,390 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Filtration +public import Mathlib.Algebra.Group.Units.Equiv + +/-! # Automorphism Transport -/ + +@[expose] public section +namespace LocalFieldTheory + +open ValuationTheory +open ValuationTheory.DiscreteValuationField.ResidueField + +/-! +# Automorphism transport for principal units + +A field automorphism preserving the chosen valuation ring acts on the valuation ring, +its residue field, its units, and every principal-unit quotient. +-/ + +noncomputable +section + +open scoped BigOperators + +universe u v + +namespace DiscreteValuationField +namespace CompleteDVF + +variable {K : Type u} [Field K] + +namespace higherPrincipalUnitGroup + +variable (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + +/-- A field automorphism preserving the chosen valuation ring induces a ring +automorphism of the valuation ring. This is the unit/residue source used +before invoking local reciprocity in the local-field arguments. -/ +def valuationSubringRingEquivOfPreserves + (e : K ≃+* K) + (hmem : + ∀ x : K, + x ∈ F.valuation.valuationSubring ↔ + e x ∈ F.valuation.valuationSubring) : + F.valuationSubring ≃+* F.valuationSubring := + RingEquiv.restrict e F.valuation.valuationSubring + F.valuation.valuationSubring hmem + +/-- A valuation-ring-preserving field automorphism preserves every power of the +maximal ideal of the chosen valuation ring. -/ +theorem valuationSubringRingEquivOfPreserves_mem_maximalIdeal_pow_iff + (e : K ≃+* K) + (hmem : + ∀ x : K, + x ∈ F.valuation.valuationSubring ↔ + e x ∈ F.valuation.valuationSubring) + (n : ℕ) (x : F.valuationSubring) : + valuationSubringRingEquivOfPreserves F e hmem x ∈ F.maximalIdeal ^ n ↔ + x ∈ F.maximalIdeal ^ n := by + let r := valuationSubringRingEquivOfPreserves F e hmem + have hmax : + F.maximalIdeal.map + (r : F.valuationSubring →+* F.valuationSubring) = + F.maximalIdeal := + IsLocalRing.map_ringEquiv_maximalIdeal r + have hmap : + (F.maximalIdeal ^ n).map (r : F.valuationSubring →+* F.valuationSubring) = + F.maximalIdeal ^ n := by + rw [Ideal.map_pow, hmax] + constructor + · intro hx + rw [← hmap] at hx + rw [Ideal.mem_map_iff_of_surjective + (r : F.valuationSubring →+* F.valuationSubring) r.surjective] at hx + rcases hx with ⟨y, hy, hyx⟩ + have hy_eq : y = x := r.injective hyx + simpa [hy_eq] using hy + · intro hx + rw [← hmap] + exact Ideal.mem_map_of_mem (r : F.valuationSubring →+* F.valuationSubring) hx + +/-- The residue-field automorphism induced by a field automorphism preserving +the chosen valuation ring. -/ +noncomputable def valuationSubringResidueFieldEquivOfPreserves + (e : K ≃+* K) + (hmem : + ∀ x : K, + x ∈ F.valuation.valuationSubring ↔ + e x ∈ F.valuation.valuationSubring) : + F.residueField ≃+* F.residueField := by + let r := valuationSubringRingEquivOfPreserves F e hmem + letI : IsLocalHom (r : F.valuationSubring →+* F.valuationSubring) := + IsLocalHom.of_surjective (r : F.valuationSubring →+* F.valuationSubring) + r.surjective + exact IsLocalRing.ResidueField.mapEquiv r + +/-- +Establishes the identity `valuationSubringResidueFieldEquivOfPreserves F e hmem (F.residueMap x) = +F.residueMap (valuationSubringRingEquivOfPreserves F e hmem x)`. +-/ +@[simp] theorem valuationSubringResidueFieldEquivOfPreserves_apply_residue + (e : K ≃+* K) + (hmem : + ∀ x : K, + x ∈ F.valuation.valuationSubring ↔ + e x ∈ F.valuation.valuationSubring) + (x : F.valuationSubring) : + valuationSubringResidueFieldEquivOfPreserves F e hmem (F.residueMap x) = + F.residueMap (valuationSubringRingEquivOfPreserves F e hmem x) := by + let r := valuationSubringRingEquivOfPreserves F e hmem + let : IsLocalHom (r : F.valuationSubring →+* F.valuationSubring) := + IsLocalHom.of_surjective (r : F.valuationSubring →+* F.valuationSubring) + r.surjective + rfl + +/-- The induced automorphism on valuation-ring units. -/ +def valuationSubringUnitEquivOfPreserves + (e : K ≃+* K) + (hmem : + ∀ x : K, + x ∈ F.valuation.valuationSubring ↔ + e x ∈ F.valuation.valuationSubring) : + F.valuationSubringˣ ≃* F.valuationSubringˣ := + Units.mapEquiv + (valuationSubringRingEquivOfPreserves F e hmem).toMulEquiv + +/-- +The defining evaluation formula for `valuationSubringUnitEquivOfPreserves` is +`((valuationSubringUnitEquivOfPreserves F e hmem u : F.valuationSubringˣ) : F.valuationSubring) = +valuationSubringRingEquivOfPreserves F e hmem (u : F.valuationSubring)`. +-/ +@[simp] theorem valuationSubringUnitEquivOfPreserves_apply + (e : K ≃+* K) + (hmem : + ∀ x : K, + x ∈ F.valuation.valuationSubring ↔ + e x ∈ F.valuation.valuationSubring) + (u : F.valuationSubringˣ) : + ((valuationSubringUnitEquivOfPreserves F e hmem u : + F.valuationSubringˣ) : F.valuationSubring) = + valuationSubringRingEquivOfPreserves F e hmem + (u : F.valuationSubring) := + rfl + +/-- Compatibility between the induced unit action and the induced residue-field +action. -/ +theorem residueUnitHom_valuationSubringUnitEquivOfPreserves + (e : K ≃+* K) + (hmem : + ∀ x : K, + x ∈ F.valuation.valuationSubring ↔ + e x ∈ F.valuation.valuationSubring) + (u : F.valuationSubringˣ) : + higherPrincipalUnitGroup.residueUnitHom F + (valuationSubringUnitEquivOfPreserves F e hmem u) = + Units.map + (valuationSubringResidueFieldEquivOfPreserves F e hmem).toMonoidHom + (higherPrincipalUnitGroup.residueUnitHom F u) := by + apply Units.ext + simp [higherPrincipalUnitGroup.residueUnitHom, + valuationSubringUnitEquivOfPreserves_apply] + +/-- The induced automorphism on valuation-ring units preserves every concrete +principal-unit level `U^n`. -/ +theorem valuationSubringUnitEquivOfPreserves_mem_principalUnit_iff + (e : K ≃+* K) + (hmem : + ∀ x : K, + x ∈ F.valuation.valuationSubring ↔ + e x ∈ F.valuation.valuationSubring) + (n : ℕ) (u : F.valuationSubringˣ) : + valuationSubringUnitEquivOfPreserves F e hmem u ∈ + higherPrincipalUnitGroup F n ↔ + u ∈ higherPrincipalUnitGroup F n := by + rw [higherPrincipalUnitGroup.mem_iff, higherPrincipalUnitGroup.mem_iff] + have hsub : + ((valuationSubringUnitEquivOfPreserves F e hmem u : + F.valuationSubringˣ) : F.valuationSubring) - 1 = + valuationSubringRingEquivOfPreserves F e hmem + ((u : F.valuationSubring) - 1) := by + simp [valuationSubringUnitEquivOfPreserves_apply] + rw [hsub] + exact valuationSubringRingEquivOfPreserves_mem_maximalIdeal_pow_iff F e hmem + n ((u : F.valuationSubring) - 1) + +/-- The subgroup map form of principal-unit preservation for a +valuation-ring-preserving field automorphism. -/ +theorem higherPrincipalUnitGroup_map_valuationSubringUnitEquivOfPreserves + (e : K ≃+* K) + (hmem : + ∀ x : K, + x ∈ F.valuation.valuationSubring ↔ + e x ∈ F.valuation.valuationSubring) + (n : ℕ) : + (higherPrincipalUnitGroup F n).map + (valuationSubringUnitEquivOfPreserves F e hmem : + F.valuationSubringˣ →* F.valuationSubringˣ) = + higherPrincipalUnitGroup F n := by + let ueq := valuationSubringUnitEquivOfPreserves F e hmem + ext u + constructor + · rintro ⟨v, hv, rfl⟩ + exact (valuationSubringUnitEquivOfPreserves_mem_principalUnit_iff + F e hmem n v).2 hv + · intro hu + refine ⟨ueq.symm u, ?_, by simp [ueq]⟩ + exact (valuationSubringUnitEquivOfPreserves_mem_principalUnit_iff + F e hmem n (ueq.symm u)).1 (by simpa [ueq] using hu) + +/-- A valuation-ring-preserving field automorphism induces an automorphism on +`O^*/U^n` for every concrete principal-unit level. -/ +noncomputable def unitsModPrincipalUnitEquivOfPreserves + (e : K ≃+* K) + (hmem : + ∀ x : K, + x ∈ F.valuation.valuationSubring ↔ + e x ∈ F.valuation.valuationSubring) + (n : ℕ) : + F.valuationSubringˣ ⧸ higherPrincipalUnitGroup F n ≃* + F.valuationSubringˣ ⧸ higherPrincipalUnitGroup F n := + QuotientGroup.congr (higherPrincipalUnitGroup F n) + (higherPrincipalUnitGroup F n) + (valuationSubringUnitEquivOfPreserves F e hmem) + (higherPrincipalUnitGroup_map_valuationSubringUnitEquivOfPreserves F e hmem n) + +/-- +Establishes the identity `unitsModPrincipalUnitEquivOfPreserves F e hmem n (QuotientGroup.mk' +(higherPrincipalUnitGroup F n) u) = QuotientGroup.mk' (higherPrincipalUnitGroup F n) +(valuationSubringUnitEquivOfPreserves F e hmem u)`. +-/ +theorem unitsModPrincipalUnitEquivOfPreserves_mk + (e : K ≃+* K) + (hmem : + ∀ x : K, + x ∈ F.valuation.valuationSubring ↔ + e x ∈ F.valuation.valuationSubring) + (n : ℕ) (u : F.valuationSubringˣ) : + unitsModPrincipalUnitEquivOfPreserves F e hmem n + (QuotientGroup.mk' (higherPrincipalUnitGroup F n) u) = + QuotientGroup.mk' (higherPrincipalUnitGroup F n) + (valuationSubringUnitEquivOfPreserves F e hmem u) := + rfl + +/-- If the induced action on residue-field units is trivial, then the +valuation-ring unit displacement lies in the first principal-unit group. -/ +theorem unitEquiv_div_mem_principalUnit_one_of_residueUnitHom_fixed + (e : K ≃+* K) + (hmem : + ∀ x : K, + x ∈ F.valuation.valuationSubring ↔ + e x ∈ F.valuation.valuationSubring) + (hres : + ∀ u : F.valuationSubringˣ, + higherPrincipalUnitGroup.residueUnitHom F + (valuationSubringUnitEquivOfPreserves F e hmem u) = + higherPrincipalUnitGroup.residueUnitHom F u) + (u : F.valuationSubringˣ) : + valuationSubringUnitEquivOfPreserves F e hmem u / u ∈ + higherPrincipalUnitGroup F 1 := by + rw [← higherPrincipalUnitGroup.residueUnitHom_eq_one_iff] + rw [map_div, hres u] + simp + +/-- Quotient form of +`unitEquiv_div_mem_principalUnit_one_of_residueUnitHom_fixed`: residue-trivial +unit action fixes `O^*/U^1`. -/ +theorem unitEquiv_mod_principalUnit_one_eq_of_residueUnitHom_fixed + (e : K ≃+* K) + (hmem : + ∀ x : K, + x ∈ F.valuation.valuationSubring ↔ + e x ∈ F.valuation.valuationSubring) + (hres : + ∀ u : F.valuationSubringˣ, + higherPrincipalUnitGroup.residueUnitHom F + (valuationSubringUnitEquivOfPreserves F e hmem u) = + higherPrincipalUnitGroup.residueUnitHom F u) + (u : F.valuationSubringˣ) : + QuotientGroup.mk' (higherPrincipalUnitGroup F 1) + (valuationSubringUnitEquivOfPreserves F e hmem u) = + QuotientGroup.mk' (higherPrincipalUnitGroup F 1) u := by + exact + (QuotientGroup.eq_iff_div_mem + (N := higherPrincipalUnitGroup F 1) + (x := valuationSubringUnitEquivOfPreserves F e hmem u) + (y := u)).2 + (unitEquiv_div_mem_principalUnit_one_of_residueUnitHom_fixed + F e hmem hres u) + +/-- Residue-field fixed-point form of +`unitEquiv_div_mem_principalUnit_one_of_residueUnitHom_fixed`: if the induced +residue-field automorphism is pointwise trivial, then every valuation-ring unit +has first-principal-unit displacement. -/ +theorem unitEquiv_div_mem_principalUnit_one_of_residueFieldEquiv_fixed + (e : K ≃+* K) + (hmem : + ∀ x : K, + x ∈ F.valuation.valuationSubring ↔ + e x ∈ F.valuation.valuationSubring) + (hres : + ∀ x : F.residueField, + valuationSubringResidueFieldEquivOfPreserves F e hmem x = x) + (u : F.valuationSubringˣ) : + valuationSubringUnitEquivOfPreserves F e hmem u / u ∈ + higherPrincipalUnitGroup F 1 := + unitEquiv_div_mem_principalUnit_one_of_residueUnitHom_fixed + F e hmem + (by + intro v + rw [residueUnitHom_valuationSubringUnitEquivOfPreserves] + apply Units.ext + exact hres + ((higherPrincipalUnitGroup.residueUnitHom F v : F.residueFieldˣ) : + F.residueField)) + u + +/-- Quotient form of +`unitEquiv_div_mem_principalUnit_one_of_residueFieldEquiv_fixed`. -/ +theorem unitEquiv_mod_principalUnit_one_eq_of_residueFieldEquiv_fixed + (e : K ≃+* K) + (hmem : + ∀ x : K, + x ∈ F.valuation.valuationSubring ↔ + e x ∈ F.valuation.valuationSubring) + (hres : + ∀ x : F.residueField, + valuationSubringResidueFieldEquivOfPreserves F e hmem x = x) + (u : F.valuationSubringˣ) : + QuotientGroup.mk' (higherPrincipalUnitGroup F 1) + (valuationSubringUnitEquivOfPreserves F e hmem u) = + QuotientGroup.mk' (higherPrincipalUnitGroup F 1) u := by + exact + (QuotientGroup.eq_iff_div_mem + (N := higherPrincipalUnitGroup F 1) + (x := valuationSubringUnitEquivOfPreserves F e hmem u) + (y := u)).2 + (unitEquiv_div_mem_principalUnit_one_of_residueFieldEquiv_fixed + F e hmem hres u) + +/-- If the induced residue-field automorphism is pointwise trivial, then the +induced automorphism of `O^*/U^1` is pointwise trivial. -/ +theorem unitsModPrincipalUnitEquivOfPreserves_one_apply_eq_of_residueFieldEquiv_fixed + (e : K ≃+* K) + (hmem : + ∀ x : K, + x ∈ F.valuation.valuationSubring ↔ + e x ∈ F.valuation.valuationSubring) + (hres : + ∀ x : F.residueField, + valuationSubringResidueFieldEquivOfPreserves F e hmem x = x) + (q : F.valuationSubringˣ ⧸ higherPrincipalUnitGroup F 1) : + unitsModPrincipalUnitEquivOfPreserves F e hmem 1 q = q := by + obtain ⟨u, rfl⟩ := QuotientGroup.mk'_surjective + (higherPrincipalUnitGroup F 1) q + rw [unitsModPrincipalUnitEquivOfPreserves_mk] + exact unitEquiv_mod_principalUnit_one_eq_of_residueFieldEquiv_fixed + F e hmem hres u + +/-- Equivalence form of +`unitsModPrincipalUnitEquivOfPreserves_one_apply_eq_of_residueFieldEquiv_fixed`. -/ +theorem unitsModPrincipalUnitEquivOfPreserves_one_eq_refl_of_residueFieldEquiv_fixed + (e : K ≃+* K) + (hmem : + ∀ x : K, + x ∈ F.valuation.valuationSubring ↔ + e x ∈ F.valuation.valuationSubring) + (hres : + ∀ x : F.residueField, + valuationSubringResidueFieldEquivOfPreserves F e hmem x = x) : + unitsModPrincipalUnitEquivOfPreserves F e hmem 1 = + MulEquiv.refl (F.valuationSubringˣ ⧸ higherPrincipalUnitGroup F 1) := by + ext q + exact + unitsModPrincipalUnitEquivOfPreserves_one_apply_eq_of_residueFieldEquiv_fixed + F e hmem hres q +end higherPrincipalUnitGroup + +end CompleteDVF +end DiscreteValuationField + +end + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Core.lean new file mode 100644 index 0000000000..159e667be6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Core.lean @@ -0,0 +1,1367 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RingTheory.Ideal.Quotient.Index +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Filtration +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.AutomorphismTransport +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueRoots +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueQuotient +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerLift +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerDecomposition +/-! +Develops quotients of valuation-ring units by higher principal units and compares their first +layer with residue-field units. +-/ + +@[expose] public section + +namespace LocalFieldTheory + +open ValuationTheory + +noncomputable +section + +open scoped BigOperators + +universe u v + +namespace DiscreteValuationField +namespace CompleteDVF + +variable {K : Type u} [Field K] + +namespace higherPrincipalUnitGroup + +open ValuationTheory.DiscreteValuationField.DVF + +variable (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + +/-- +Characterizes `QuotientGroup.mk' (higherPrincipalUnitGroup F 1) u = QuotientGroup.mk' +(higherPrincipalUnitGroup F 1) v` by the equivalent condition +`higherPrincipalUnitGroup.residueUnitHom F u = higherPrincipalUnitGroup.residueUnitHom F v`. +-/ +theorem unitsModOne_mk_eq_iff_residueUnitHom_eq + (u v : F.valuationSubringˣ) : + QuotientGroup.mk' (higherPrincipalUnitGroup F 1) u = + QuotientGroup.mk' (higherPrincipalUnitGroup F 1) v ↔ + higherPrincipalUnitGroup.residueUnitHom F u = + higherPrincipalUnitGroup.residueUnitHom F v := by + constructor + · intro h + have h' := congrArg + (higherPrincipalUnitGroup.unitsModOneEquivResidueFieldUnits F) h + rw [higherPrincipalUnitGroup.unitsModOneEquivResidueFieldUnits_mk, + higherPrincipalUnitGroup.unitsModOneEquivResidueFieldUnits_mk] at h' + exact h' + · intro h + apply (higherPrincipalUnitGroup.unitsModOneEquivResidueFieldUnits F).injective + rw [higherPrincipalUnitGroup.unitsModOneEquivResidueFieldUnits_mk, + higherPrincipalUnitGroup.unitsModOneEquivResidueFieldUnits_mk] + exact h + +/-- +Characterizes `QuotientGroup.mk' (higherPrincipalUnitGroup F 1) u = QuotientGroup.mk' +(higherPrincipalUnitGroup F 1) v` by the equivalent condition `F.residueMap (u : +F.valuationSubring) = F.residueMap (v : F.valuationSubring)`. +-/ +theorem unitsModOne_mk_eq_iff_residue_eq + (u v : F.valuationSubringˣ) : + QuotientGroup.mk' (higherPrincipalUnitGroup F 1) u = + QuotientGroup.mk' (higherPrincipalUnitGroup F 1) v ↔ + F.residueMap (u : F.valuationSubring) = + F.residueMap (v : F.valuationSubring) := by + rw [higherPrincipalUnitGroup.unitsModOne_mk_eq_iff_residueUnitHom_eq F u v, + higherPrincipalUnitGroup.residueUnitHom_eq_iff_residue_eq F u v] + +/-- A valuation-ring-preserving field automorphism induces a ring automorphism +on every quotient `O/m^n`. -/ +noncomputable def quotientMaximalIdealPowRingEquivOfPreserves + (e : K ≃+* K) + (hmem : + ∀ x : K, + x ∈ F.valuation.valuationSubring ↔ + e x ∈ F.valuation.valuationSubring) + (n : ℕ) : + F.valuationSubring ⧸ F.maximalIdeal ^ n ≃+* + F.valuationSubring ⧸ F.maximalIdeal ^ n := by + let r := valuationSubringRingEquivOfPreserves F e hmem + have hmax : + F.maximalIdeal.map + (r : F.valuationSubring →+* F.valuationSubring) = + F.maximalIdeal := + IsLocalRing.map_ringEquiv_maximalIdeal r + have hpow : + F.maximalIdeal ^ n = + (F.maximalIdeal ^ n).map + (r : F.valuationSubring →+* F.valuationSubring) := by + rw [Ideal.map_pow, hmax] + exact + Ideal.quotientEquiv (F.maximalIdeal ^ n) (F.maximalIdeal ^ n) r + hpow + +/-- +Establishes the identity `quotientMaximalIdealPowRingEquivOfPreserves F e hmem n +(Ideal.Quotient.mk (F.maximalIdeal ^ n) x) = Ideal.Quotient.mk (F.maximalIdeal ^ n) +(valuationSubringRingEquivOfPreserves F e hmem x)`. +-/ +@[simp] theorem quotientMaximalIdealPowRingEquivOfPreserves_mk + (e : K ≃+* K) + (hmem : + ∀ x : K, + x ∈ F.valuation.valuationSubring ↔ + e x ∈ F.valuation.valuationSubring) + (n : ℕ) (x : F.valuationSubring) : + quotientMaximalIdealPowRingEquivOfPreserves F e hmem n + (Ideal.Quotient.mk (F.maximalIdeal ^ n) x) = + Ideal.Quotient.mk (F.maximalIdeal ^ n) + (valuationSubringRingEquivOfPreserves F e hmem x) := by + let r := valuationSubringRingEquivOfPreserves F e hmem + have hmax : + F.maximalIdeal.map + (r : F.valuationSubring →+* F.valuationSubring) = + F.maximalIdeal := + IsLocalRing.map_ringEquiv_maximalIdeal r + have hpow : + F.maximalIdeal ^ n = + (F.maximalIdeal ^ n).map + (r : F.valuationSubring →+* F.valuationSubring) := by + rw [Ideal.map_pow, hmax] + exact + Ideal.quotientEquiv_mk (F.maximalIdeal ^ n) (F.maximalIdeal ^ n) r + hpow x + +/-- Reduction of valuation-ring units modulo the `n`-th power of the maximal +ideal. -/ +def quotientUnitHom (n : ℕ) : + F.valuationSubringˣ →* + (F.valuationSubring ⧸ F.maximalIdeal ^ n)ˣ := + Units.map (Ideal.Quotient.mk (F.maximalIdeal ^ n)) + +/-- +The defining evaluation formula for `quotientUnitHom` is +`((higherPrincipalUnitGroup.quotientUnitHom F n u : (F.valuationSubring ⧸ F.maximalIdeal ^ n)ˣ) : +F.valuationSubring ⧸ F.maximalIdeal ^ n) = Ideal.Quotient.mk (F.maximalIdeal ^ n) (u : +F.valuationSubring)`. +-/ +@[simp] theorem quotientUnitHom_apply (n : ℕ) (u : F.valuationSubringˣ) : + ((higherPrincipalUnitGroup.quotientUnitHom F n u : + (F.valuationSubring ⧸ F.maximalIdeal ^ n)ˣ) : + F.valuationSubring ⧸ F.maximalIdeal ^ n) = + Ideal.Quotient.mk (F.maximalIdeal ^ n) (u : F.valuationSubring) := + rfl + +/-- Compatibility between the induced action on `O^*`, the induced action on +`O/m^n`, and reduction of units modulo `m^n`. -/ +theorem quotientUnitHom_valuationSubringUnitEquivOfPreserves + (e : K ≃+* K) + (hmem : + ∀ x : K, + x ∈ F.valuation.valuationSubring ↔ + e x ∈ F.valuation.valuationSubring) + (n : ℕ) (u : F.valuationSubringˣ) : + Units.map + (quotientMaximalIdealPowRingEquivOfPreserves F e hmem n).toMonoidHom + (higherPrincipalUnitGroup.quotientUnitHom F n u) = + higherPrincipalUnitGroup.quotientUnitHom F n + (valuationSubringUnitEquivOfPreserves F e hmem u) := by + apply Units.ext + simp [higherPrincipalUnitGroup.quotientUnitHom_apply, + valuationSubringUnitEquivOfPreserves_apply] + +/-- The kernel of unit reduction modulo `m^n` is exactly the concrete +principal-unit subgroup `U^n`. -/ +theorem quotientUnitHom_ker_eq (n : ℕ) : + (higherPrincipalUnitGroup.quotientUnitHom F n).ker = + higherPrincipalUnitGroup F n := by + ext u + rw [MonoidHom.mem_ker, higherPrincipalUnitGroup.mem_iff] + constructor + · intro hu + have hval := congrArg + (fun z : (F.valuationSubring ⧸ F.maximalIdeal ^ n)ˣ => + (z : F.valuationSubring ⧸ F.maximalIdeal ^ n)) hu + change + Ideal.Quotient.mk (F.maximalIdeal ^ n) (u : F.valuationSubring) = + 1 at hval + have hmk : + Ideal.Quotient.mk (F.maximalIdeal ^ n) (u : F.valuationSubring) = + Ideal.Quotient.mk (F.maximalIdeal ^ n) + (1 : F.valuationSubring) := by + simpa using hval + exact + (Ideal.Quotient.mk_eq_mk_iff_sub_mem + (I := F.maximalIdeal ^ n) (u : F.valuationSubring) + (1 : F.valuationSubring)).1 hmk + · intro hu + apply Units.ext + change + Ideal.Quotient.mk (F.maximalIdeal ^ n) (u : F.valuationSubring) = + 1 + simpa using + (Ideal.Quotient.mk_eq_mk_iff_sub_mem + (I := F.maximalIdeal ^ n) (u : F.valuationSubring) + (1 : F.valuationSubring)).2 hu + +/-- First-isomorphism form of unit reduction modulo `m^n`: `O^*/U^n` is the +range of the unit group of `O/m^n`. -/ +noncomputable def unitsModHigherPrincipalUnitGroupEquivRange (n : ℕ) : + F.valuationSubringˣ ⧸ higherPrincipalUnitGroup F n ≃* + (higherPrincipalUnitGroup.quotientUnitHom F n).range := + (QuotientGroup.quotientMulEquivOfEq + (higherPrincipalUnitGroup.quotientUnitHom_ker_eq F n).symm).trans + (QuotientGroup.quotientKerEquivRange + (higherPrincipalUnitGroup.quotientUnitHom F n)) + +/-- For `n ≥ 1`, every unit modulo `m^n` is the reduction of a valuation-ring +unit. -/ +theorem quotientUnitHom_surjective_of_pos {n : ℕ} (hn : 1 ≤ n) : + Function.Surjective (higherPrincipalUnitGroup.quotientUnitHom F n) := by + intro y + obtain ⟨a, ha⟩ := + Ideal.Quotient.mk_surjective + (((y : (F.valuationSubring ⧸ F.maximalIdeal ^ n)ˣ) : + F.valuationSubring ⧸ F.maximalIdeal ^ n)) + have ha_unit : IsUnit a := by + by_contra hnot + have ha_mem : a ∈ F.maximalIdeal := by + rw [IsLocalRing.mem_maximalIdeal] + exact (mem_nonunits_iff).2 hnot + obtain ⟨b, hb⟩ := + Ideal.Quotient.mk_surjective + (((y⁻¹ : (F.valuationSubring ⧸ F.maximalIdeal ^ n)ˣ) : + F.valuationSubring ⧸ F.maximalIdeal ^ n)) + have habq : + Ideal.Quotient.mk (F.maximalIdeal ^ n) (a * b) = + (1 : F.valuationSubring ⧸ F.maximalIdeal ^ n) := by + calc + Ideal.Quotient.mk (F.maximalIdeal ^ n) (a * b) = + Ideal.Quotient.mk (F.maximalIdeal ^ n) a * + Ideal.Quotient.mk (F.maximalIdeal ^ n) b := by simp + _ = ((y : (F.valuationSubring ⧸ F.maximalIdeal ^ n)ˣ) : + F.valuationSubring ⧸ F.maximalIdeal ^ n) * + ((y⁻¹ : (F.valuationSubring ⧸ F.maximalIdeal ^ n)ˣ) : + F.valuationSubring ⧸ F.maximalIdeal ^ n) := by + rw [ha, hb] + _ = 1 := by simp + have hdiff_pow : a * b - 1 ∈ F.maximalIdeal ^ n := by + exact (Ideal.Quotient.mk_eq_mk_iff_sub_mem + (I := F.maximalIdeal ^ n) (a * b) (1 : F.valuationSubring)).1 + (by simpa using habq) + have hn0 : n ≠ 0 := by omega + have hdiff_max : a * b - 1 ∈ F.maximalIdeal := + Ideal.pow_le_self hn0 hdiff_pow + have hab_mem : a * b ∈ F.maximalIdeal := + F.maximalIdeal.mul_mem_right b ha_mem + have hone : (1 : F.valuationSubring) ∈ F.maximalIdeal := by + have hsub : a * b - (a * b - 1) ∈ F.maximalIdeal := + F.maximalIdeal.sub_mem hab_mem hdiff_max + simp at hsub + exact (IsLocalRing.maximalIdeal.isMaximal F.valuationSubring).isPrime.one_notMem hone + rcases ha_unit with ⟨u, rfl⟩ + refine ⟨u, ?_⟩ + apply Units.ext + simpa [higherPrincipalUnitGroup.quotientUnitHom_apply] using ha + +/-- The unit-quotient coordinate theorem, first unit-quotient form: +`O^*/U^n ≃ (O/m^n)^*` for `n ≥ 1`. -/ +noncomputable def unitsModHigherPrincipalUnitGroupEquivQuotientUnits + (n : ℕ) (hn : 1 ≤ n) : + F.valuationSubringˣ ⧸ higherPrincipalUnitGroup F n ≃* + (F.valuationSubring ⧸ F.maximalIdeal ^ n)ˣ := + (QuotientGroup.quotientMulEquivOfEq + (higherPrincipalUnitGroup.quotientUnitHom_ker_eq F n).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (higherPrincipalUnitGroup.quotientUnitHom F n) + (higherPrincipalUnitGroup.quotientUnitHom_surjective_of_pos F hn)) + +/-- The maximal ideal of a complete DVF valuation ring is finitely generated: +it is generated by any uniformizer. -/ +theorem maximalIdeal_fg : + F.maximalIdeal.FG := by + rcases F.exists_uniformizer with ⟨pi, hpi⟩ + refine ⟨{pi}, ?_⟩ + simpa using (F.maximalIdeal_eq_span_uniformizer hpi).symm + +/-- If the residue field is finite, then every quotient by a power of the +maximal ideal is finite. -/ +theorem finite_quotient_maximalIdeal_pow_of_finite_residue + [Finite F.residueField] (n : ℕ) : + Finite (F.valuationSubring ⧸ F.maximalIdeal ^ n) := by + have : Finite (F.valuationSubring ⧸ F.maximalIdeal) := by + change Finite F.residueField + infer_instance + exact Ideal.finite_quotient_pow + (I := F.maximalIdeal) (higherPrincipalUnitGroup.maximalIdeal_fg F) n + +/-- Finite-residue complete DVFs have finite unit quotients `O^*/U^n`. -/ +theorem finite_unitsModHigherPrincipalUnitGroup_of_finite_residue + [Finite F.residueField] (n : ℕ) : + Finite (F.valuationSubringˣ ⧸ higherPrincipalUnitGroup F n) := by + have : Finite (F.valuationSubring ⧸ F.maximalIdeal ^ n) := + higherPrincipalUnitGroup.finite_quotient_maximalIdeal_pow_of_finite_residue + F n + exact + Finite.of_equiv + ((higherPrincipalUnitGroup.quotientUnitHom F n).range) + (higherPrincipalUnitGroup.unitsModHigherPrincipalUnitGroupEquivRange F n).symm + +/-- The type in `Finite (F.valuationSubring ⧸ F.maximalIdeal ^ n)` is finite. -/ +noncomputable instance quotientMaximalIdealPowFinite + [Finite F.residueField] (n : ℕ) : + Finite (F.valuationSubring ⧸ F.maximalIdeal ^ n) := + higherPrincipalUnitGroup.finite_quotient_maximalIdeal_pow_of_finite_residue F n + +/-- The type in `Finite (F.valuationSubringˣ ⧸ higherPrincipalUnitGroup F n)` is finite. -/ +noncomputable instance unitsModHigherPrincipalUnitGroupFinite + [Finite F.residueField] (n : ℕ) : + Finite (F.valuationSubringˣ ⧸ higherPrincipalUnitGroup F n) := + higherPrincipalUnitGroup.finite_unitsModHigherPrincipalUnitGroup_of_finite_residue + F n + +/-- Cardinality form of `O^*/U^n ≃ (O/m^n)^*` for `n ≥ 1` over a +finite residue field. The finite instances are derived from the residue +field before either natural cardinal is formed. -/ +theorem card_unitsModHigherPrincipalUnitGroup_eq_quotientUnits + (n : ℕ) (hn : 1 ≤ n) : + Nat.card (F.valuationSubringˣ ⧸ higherPrincipalUnitGroup F n) = + Nat.card ((F.valuationSubring ⧸ F.maximalIdeal ^ n)ˣ) := by + exact Nat.card_congr + (higherPrincipalUnitGroup.unitsModHigherPrincipalUnitGroupEquivQuotientUnits + F n hn).toEquiv + +/-- Every concrete principal-unit subquotient is finite when the residue +field is finite. It is identified with the range of the inclusion into the +finite full unit quotient. -/ +theorem finite_principalUnitSubquotient_of_finite_residue + [Finite F.residueField] (m n : ℕ) : + Finite (higherPrincipalUnitGroup F m ⧸ + (higherPrincipalUnitGroup F n).subgroupOf + (higherPrincipalUnitGroup F m)) := by + let : Finite + (F.valuationSubringˣ ⧸ higherPrincipalUnitGroup F n) := by + exact + higherPrincipalUnitGroup.finite_unitsModHigherPrincipalUnitGroup_of_finite_residue + F n + let f : higherPrincipalUnitGroup F m →* + F.valuationSubringˣ ⧸ higherPrincipalUnitGroup F n := + (QuotientGroup.mk' (higherPrincipalUnitGroup F n)).comp + (higherPrincipalUnitGroup F m).subtype + have hker : f.ker = + (higherPrincipalUnitGroup F n).subgroupOf + (higherPrincipalUnitGroup F m) := by + ext x + rw [MonoidHom.mem_ker, Subgroup.mem_subgroupOf] + change QuotientGroup.mk' (higherPrincipalUnitGroup F n) + (x : F.valuationSubringˣ) = 1 ↔ + (x : F.valuationSubringˣ) ∈ higherPrincipalUnitGroup F n + exact QuotientGroup.eq_one_iff + (N := higherPrincipalUnitGroup F n) (x : F.valuationSubringˣ) + let e : (higherPrincipalUnitGroup F m ⧸ + (higherPrincipalUnitGroup F n).subgroupOf + (higherPrincipalUnitGroup F m)) ≃* f.range := + (QuotientGroup.quotientMulEquivOfEq hker.symm).trans + (QuotientGroup.quotientKerEquivRange f) + exact Finite.of_equiv f.range e.symm + +/-- +The type in `Finite (higherPrincipalUnitGroup F m ⧸ (higherPrincipalUnitGroup F n).subgroupOf +(higherPrincipalUnitGroup F m))` is finite. +-/ +noncomputable instance principalUnitSubquotientFinite + [Finite F.residueField] (m n : ℕ) : + Finite (higherPrincipalUnitGroup F m ⧸ + (higherPrincipalUnitGroup F n).subgroupOf + (higherPrincipalUnitGroup F m)) := + higherPrincipalUnitGroup.finite_principalUnitSubquotient_of_finite_residue + F m n + +/-- The concrete principal-unit filtration as the abstract filtration API. -/ +def toPrincipalUnitFiltration : + AntitoneSubgroupFiltration F.valuationSubringˣ where + subgroup := higherPrincipalUnitGroup F + antitone := fun h => higherPrincipalUnitGroup.antitone F h + +/-- +Establishes the identity `(higherPrincipalUnitGroup.toPrincipalUnitFiltration F).subgroup n = +higherPrincipalUnitGroup F n`. +-/ +@[simp] theorem toPrincipalUnitFiltration_subgroup (n : ℕ) : + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F).subgroup n = + higherPrincipalUnitGroup F n := + rfl + +/-- +The type in `Finite ((higherPrincipalUnitGroup.toPrincipalUnitFiltration +F).principalUnitSubquotient m n)` is finite. +-/ +noncomputable instance toPrincipalUnitFiltrationPrincipalUnitSubquotientFinite + [Finite F.residueField] (m n : ℕ) : + Finite + ((higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotient + m n) := by + let U := higherPrincipalUnitGroup.toPrincipalUnitFiltration F + exact Finite.of_equiv + (higherPrincipalUnitGroup F m ⧸ + (higherPrincipalUnitGroup F n).subgroupOf + (higherPrincipalUnitGroup F m)) + (U.principalUnitSubquotientConcreteEquiv m n).symm.toEquiv + +/-! ### Successive principal-unit quotients -/ + +/-- The adjacent quotient `U^n/U^(n+1)` for the concrete complete-DVF +principal-unit filtration. -/ +def principalUnitSuccQuot (n : ℕ) : Type u := + higherPrincipalUnitGroup F n ⧸ + (higherPrincipalUnitGroup F (n + 1)).subgroupOf (higherPrincipalUnitGroup F n) + +/-- +Equips the target with its canonical `CommGroup` structure, namely `CommGroup +(higherPrincipalUnitGroup.principalUnitSuccQuot F n)`. +-/ +instance principalUnitSuccQuotCommGroup (n : ℕ) : + CommGroup (higherPrincipalUnitGroup.principalUnitSuccQuot F n) := by + change CommGroup + (higherPrincipalUnitGroup F n ⧸ + (higherPrincipalUnitGroup F (n + 1)).subgroupOf + (higherPrincipalUnitGroup F n)) + infer_instance + +/-- Explicit access to the concrete quotient used to implement +`principalUnitSuccQuot`. -/ +def principalUnitSuccQuotConcreteEquiv (n : ℕ) : + higherPrincipalUnitGroup.principalUnitSuccQuot F n ≃* + (higherPrincipalUnitGroup F n ⧸ + (higherPrincipalUnitGroup F (n + 1)).subgroupOf + (higherPrincipalUnitGroup F n)) := by + change + (higherPrincipalUnitGroup F n ⧸ + (higherPrincipalUnitGroup F (n + 1)).subgroupOf + (higherPrincipalUnitGroup F n)) ≃* + (higherPrincipalUnitGroup F n ⧸ + (higherPrincipalUnitGroup F (n + 1)).subgroupOf + (higherPrincipalUnitGroup F n)) + exact MulEquiv.refl _ + +/-- The quotient map `U^n → U^n/U^(n+1)`. -/ +def principalUnitSuccQuotMk (n : ℕ) : + higherPrincipalUnitGroup F n →* + higherPrincipalUnitGroup.principalUnitSuccQuot F n := by + change higherPrincipalUnitGroup F n →* + (higherPrincipalUnitGroup F n ⧸ + (higherPrincipalUnitGroup F (n + 1)).subgroupOf + (higherPrincipalUnitGroup F n)) + exact QuotientGroup.mk' ((higherPrincipalUnitGroup F (n + 1)).subgroupOf + (higherPrincipalUnitGroup F n)) + +/-- +Establishes the identity `higherPrincipalUnitGroup.principalUnitSuccQuotConcreteEquiv F n +(higherPrincipalUnitGroup.principalUnitSuccQuotMk F n u) = QuotientGroup.mk u`. +-/ +@[simp] theorem principalUnitSuccQuotConcreteEquiv_mk (n : ℕ) + (u : higherPrincipalUnitGroup F n) : + higherPrincipalUnitGroup.principalUnitSuccQuotConcreteEquiv F n + (higherPrincipalUnitGroup.principalUnitSuccQuotMk F n u) = + QuotientGroup.mk u := + rfl + +/-- +The specified map is surjective: `Function.Surjective +(higherPrincipalUnitGroup.principalUnitSuccQuotMk F n)`. +-/ +theorem principalUnitSuccQuotMk_surjective (n : ℕ) : + Function.Surjective (higherPrincipalUnitGroup.principalUnitSuccQuotMk F n) := + QuotientGroup.mk'_surjective ((higherPrincipalUnitGroup F (n + 1)).subgroupOf + (higherPrincipalUnitGroup F n)) + +/-- Eliminate an adjacent principal-unit quotient through its canonical +representatives. -/ +protected theorem principalUnitSuccQuot.inductionOn + (n : ℕ) + {motive : higherPrincipalUnitGroup.principalUnitSuccQuot F n → Prop} + (q : higherPrincipalUnitGroup.principalUnitSuccQuot F n) + (h : ∀ u : higherPrincipalUnitGroup F n, + motive (higherPrincipalUnitGroup.principalUnitSuccQuotMk F n u)) : + motive q := by + change motive + (show + higherPrincipalUnitGroup F n ⧸ + (higherPrincipalUnitGroup F (n + 1)).subgroupOf + (higherPrincipalUnitGroup F n) from q) + refine QuotientGroup.induction_on q ?_ + intro u + exact h u + +/-- Descend a homomorphism from `U^n` that kills `U^(n+1)`. -/ +def principalUnitSuccQuotLift + {H : Type*} [Group H] (n : ℕ) + (f : higherPrincipalUnitGroup F n →* H) + (h : (higherPrincipalUnitGroup F (n + 1)).subgroupOf + (higherPrincipalUnitGroup F n) ≤ f.ker) : + higherPrincipalUnitGroup.principalUnitSuccQuot F n →* H := by + change + (higherPrincipalUnitGroup F n ⧸ + (higherPrincipalUnitGroup F (n + 1)).subgroupOf + (higherPrincipalUnitGroup F n)) →* H + exact QuotientGroup.lift + ((higherPrincipalUnitGroup F (n + 1)).subgroupOf + (higherPrincipalUnitGroup F n)) f h + +/-- +Establishes the identity `higherPrincipalUnitGroup.principalUnitSuccQuotLift F n f h +(higherPrincipalUnitGroup.principalUnitSuccQuotMk F n u) = f u`. +-/ +@[simp] theorem principalUnitSuccQuotLift_mk + {H : Type*} [Group H] (n : ℕ) + (f : higherPrincipalUnitGroup F n →* H) + (h : (higherPrincipalUnitGroup F (n + 1)).subgroupOf + (higherPrincipalUnitGroup F n) ≤ f.ker) + (u : higherPrincipalUnitGroup F n) : + higherPrincipalUnitGroup.principalUnitSuccQuotLift F n f h + (higherPrincipalUnitGroup.principalUnitSuccQuotMk F n u) = f u := + rfl + +/-- The type in `Finite (higherPrincipalUnitGroup.principalUnitSuccQuot F n)` is finite. -/ +noncomputable instance principalUnitSuccQuotFinite + [Finite F.residueField] (n : ℕ) : + Finite (higherPrincipalUnitGroup.principalUnitSuccQuot F n) := + Finite.of_equiv + (higherPrincipalUnitGroup F n ⧸ + (higherPrincipalUnitGroup F (n + 1)).subgroupOf + (higherPrincipalUnitGroup F n)) + (higherPrincipalUnitGroup.principalUnitSuccQuotConcreteEquiv F n).symm.toEquiv + +/-- The concrete complete-DVF adjacent quotient agrees with the generic +graded-piece wrapper through explicit public equivalences. -/ +def principalUnitSuccQuotEquivGradedPiece (n : ℕ) : + higherPrincipalUnitGroup.principalUnitSuccQuot F n ≃* + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitGradedPiece n := + (higherPrincipalUnitGroup.principalUnitSuccQuotConcreteEquiv F n).trans + ((AntitoneSubgroupFiltration.principalUnitGradedPieceEquivSubquotient + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F) n).trans + (AntitoneSubgroupFiltration.principalUnitSubquotientConcreteEquiv + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F) n (n + 1))).symm + +/-- +Establishes the identity `higherPrincipalUnitGroup.principalUnitSuccQuotEquivGradedPiece F n +(higherPrincipalUnitGroup.principalUnitSuccQuotMk F n u) = +(higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitGradedPieceMk n u`. +-/ +@[simp] theorem principalUnitSuccQuotEquivGradedPiece_mk + (n : ℕ) (u : higherPrincipalUnitGroup F n) : + higherPrincipalUnitGroup.principalUnitSuccQuotEquivGradedPiece F n + (higherPrincipalUnitGroup.principalUnitSuccQuotMk F n u) = + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitGradedPieceMk + n u := + rfl + +/-- +Characterizes `higherPrincipalUnitGroup.principalUnitSuccQuotMk F n u = 1` by the equivalent +condition `u ∈ (higherPrincipalUnitGroup F (n + 1)).subgroupOf (higherPrincipalUnitGroup F n)`. +-/ +theorem principalUnitSuccQuotMk_eq_one_iff (n : ℕ) + (u : higherPrincipalUnitGroup F n) : + higherPrincipalUnitGroup.principalUnitSuccQuotMk F n u = 1 ↔ + u ∈ (higherPrincipalUnitGroup F (n + 1)).subgroupOf + (higherPrincipalUnitGroup F n) := by + change + ((u : higherPrincipalUnitGroup F n ⧸ + (higherPrincipalUnitGroup F (n + 1)).subgroupOf + (higherPrincipalUnitGroup F n)) = 1 ↔ _) + exact QuotientGroup.eq_one_iff u + +/-- +Characterizes `higherPrincipalUnitGroup.principalUnitSuccQuotMk F n u = +higherPrincipalUnitGroup.principalUnitSuccQuotMk F n v` by the equivalent condition `u / v ∈ +(higherPrincipalUnitGroup F (n + 1)).subgroupOf (higherPrincipalUnitGroup F n)`. +-/ +theorem principalUnitSuccQuotMk_eq_iff_div_mem (n : ℕ) + (u v : higherPrincipalUnitGroup F n) : + higherPrincipalUnitGroup.principalUnitSuccQuotMk F n u = + higherPrincipalUnitGroup.principalUnitSuccQuotMk F n v ↔ + u / v ∈ (higherPrincipalUnitGroup F (n + 1)).subgroupOf + (higherPrincipalUnitGroup F n) := by + change + ((u : higherPrincipalUnitGroup F n ⧸ + (higherPrincipalUnitGroup F (n + 1)).subgroupOf + (higherPrincipalUnitGroup F n)) = + (v : higherPrincipalUnitGroup F n ⧸ + (higherPrincipalUnitGroup F (n + 1)).subgroupOf + (higherPrincipalUnitGroup F n)) ↔ _) + exact QuotientGroup.eq_iff_div_mem + +/-- +Characterizes `u ∈ (higherPrincipalUnitGroup F (n + 1)).subgroupOf (higherPrincipalUnitGroup F n)` +by the equivalent condition `((u : F.valuationSubringˣ) : F.valuationSubring) - 1 ∈ F.maximalIdeal +^ (n + 1)`. +-/ +theorem mem_succ_subgroupOf_iff (n : ℕ) + (u : higherPrincipalUnitGroup F n) : + u ∈ (higherPrincipalUnitGroup F (n + 1)).subgroupOf + (higherPrincipalUnitGroup F n) ↔ + ((u : F.valuationSubringˣ) : F.valuationSubring) - 1 ∈ + F.maximalIdeal ^ (n + 1) := by + rw [Subgroup.mem_subgroupOf, higherPrincipalUnitGroup.mem_iff] + +/-- If `a ∈ m^n` with `n ≥ 1`, then `1 + a` is a unit of the valuation ring. -/ +theorem isUnit_one_add_of_mem_maximalIdeal_pow {n : ℕ} (hn : 1 ≤ n) + (a : F.valuationSubring) (ha : a ∈ F.maximalIdeal ^ n) : IsUnit (1 + a) := by + have ha1 : a ∈ F.maximalIdeal := by + have hle : F.maximalIdeal ^ n ≤ F.maximalIdeal ^ 1 := + Ideal.pow_le_pow_right hn + simpa using hle ha + have hnon : (-a) ∈ nonunits F.valuationSubring := by + rw [← IsLocalRing.mem_maximalIdeal] + exact F.maximalIdeal.neg_mem ha1 + have hunit : IsUnit (1 - (-a)) := + IsLocalRing.isUnit_one_sub_self_of_mem_nonunits (-a) hnon + simpa [sub_neg_eq_add] using hunit + +/-- The unit `1 + a` attached to an element `a ∈ m^n`, for `n ≥ 1`. -/ +noncomputable def principalUnitOneAddOfMemPow {n : ℕ} (hn : 1 ≤ n) + (a : F.valuationSubring) (ha : a ∈ F.maximalIdeal ^ n) : F.valuationSubringˣ := + (higherPrincipalUnitGroup.isUnit_one_add_of_mem_maximalIdeal_pow F hn a ha).unit + +/-- +Establishes the identity `((higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn a ha : +F.valuationSubringˣ) : F.valuationSubring) = 1 + a`. +-/ +@[simp] theorem principalUnitOneAddOfMemPow_val {n : ℕ} (hn : 1 ≤ n) + (a : F.valuationSubring) (ha : a ∈ F.maximalIdeal ^ n) : + ((higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn a ha : + F.valuationSubringˣ) : F.valuationSubring) = + 1 + a := + IsUnit.unit_spec + (higherPrincipalUnitGroup.isUnit_one_add_of_mem_maximalIdeal_pow F hn a ha) + +/-- The unit `1 + a`, viewed as an element of `U^n`. -/ +noncomputable def principalUnitOneAddOfMemPowSubgroup {n : ℕ} (hn : 1 ≤ n) + (a : F.valuationSubring) (ha : a ∈ F.maximalIdeal ^ n) : + higherPrincipalUnitGroup F n := + ⟨higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn a ha, by + rw [higherPrincipalUnitGroup.mem_iff] + simp [higherPrincipalUnitGroup.principalUnitOneAddOfMemPow_val, ha] + ⟩ + +/-- +Establishes the identity `((higherPrincipalUnitGroup.principalUnitOneAddOfMemPowSubgroup F hn a ha +: higherPrincipalUnitGroup F n) : F.valuationSubringˣ) = +higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn a ha`. +-/ +@[simp] theorem principalUnitOneAddOfMemPowSubgroup_val {n : ℕ} (hn : 1 ≤ n) + (a : F.valuationSubring) (ha : a ∈ F.maximalIdeal ^ n) : + ((higherPrincipalUnitGroup.principalUnitOneAddOfMemPowSubgroup F hn a ha : + higherPrincipalUnitGroup F n) : F.valuationSubringˣ) = + higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn a ha := + rfl + +/-- The concrete map `m^n → U^n/U^(n+1)` sending `a` to the class of +`1 + a`. -/ +noncomputable def principalUnitSuccQuotOfIdealPow (n : ℕ) (hn : 1 ≤ n) : + ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) → + higherPrincipalUnitGroup.principalUnitSuccQuot F n := + fun a => + higherPrincipalUnitGroup.principalUnitSuccQuotMk F n + (higherPrincipalUnitGroup.principalUnitOneAddOfMemPowSubgroup F hn a.1 a.2) + +/-- +The defining evaluation formula for `principalUnitSuccQuotOfIdealPow` is +`higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow F n hn a = +higherPrincipalUnitGroup.principalUnitSuccQuotMk F n +(higherPrincipalUnitGroup.principalUnitOneAddOfMemPowSubgroup F hn a.1 a.2)`. +-/ +@[simp] theorem principalUnitSuccQuotOfIdealPow_apply (n : ℕ) (hn : 1 ≤ n) + (a : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u)) : + higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow F n hn a = + higherPrincipalUnitGroup.principalUnitSuccQuotMk F n + (higherPrincipalUnitGroup.principalUnitOneAddOfMemPowSubgroup F hn a.1 a.2) := + rfl + +/-- Elements of `m^(n+1)` map to the trivial class in `U^n/U^(n+1)`. -/ +theorem principalUnitSuccQuotOfIdealPow_eq_one_of_mem_succ + (n : ℕ) (hn : 1 ≤ n) + (a : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u)) + (ha : (a : F.valuationSubring) ∈ F.maximalIdeal ^ (n + 1)) : + higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow F n hn a = 1 := by + apply (higherPrincipalUnitGroup.principalUnitSuccQuotMk_eq_one_iff F n _).2 + rw [higherPrincipalUnitGroup.mem_succ_subgroupOf_iff] + simp [higherPrincipalUnitGroup.principalUnitOneAddOfMemPowSubgroup, + higherPrincipalUnitGroup.principalUnitOneAddOfMemPow_val, ha] + +/-- The map `a ↦ [1 + a]` is insensitive to changing `a` modulo `m^(n+1)`. -/ +theorem principalUnitSuccQuotOfIdealPow_eq_of_sub_mem_succ + (n : ℕ) (hn : 1 ≤ n) + (a b : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u)) + (hab : ((a : F.valuationSubring) - (b : F.valuationSubring)) ∈ + F.maximalIdeal ^ (n + 1)) : + higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow F n hn a = + higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow F n hn b := by + apply (higherPrincipalUnitGroup.principalUnitSuccQuotMk_eq_iff_div_mem F n _ _).2 + rw [higherPrincipalUnitGroup.mem_succ_subgroupOf_iff] + change (((higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + (a : F.valuationSubring) a.2 / + higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + (b : F.valuationSubring) b.2 : F.valuationSubringˣ) : + F.valuationSubring) - 1) ∈ F.maximalIdeal ^ (n + 1) + rw [show (((higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + (a : F.valuationSubring) a.2 / + higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + (b : F.valuationSubring) b.2 : F.valuationSubringˣ) : + F.valuationSubring) - 1) = + ((a : F.valuationSubring) - (b : F.valuationSubring)) * + ↑(higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + (b : F.valuationSubring) b.2)⁻¹ by + simp only [div_eq_mul_inv, Units.val_mul] + rw [higherPrincipalUnitGroup.principalUnitOneAddOfMemPow_val F hn + (a : F.valuationSubring) a.2] + have hbval : + ((higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + (b : F.valuationSubring) b.2 : F.valuationSubringˣ) : + F.valuationSubring) = 1 + (b : F.valuationSubring) := + higherPrincipalUnitGroup.principalUnitOneAddOfMemPow_val F hn + (b : F.valuationSubring) b.2 + have hbinv : + ((higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + (b : F.valuationSubring) b.2 : F.valuationSubringˣ) : + F.valuationSubring) * + ↑(higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + (b : F.valuationSubring) b.2)⁻¹ = 1 := by + simp + calc + (1 + (a : F.valuationSubring)) * + ↑(higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + (b : F.valuationSubring) b.2)⁻¹ - 1 = + (1 + (a : F.valuationSubring)) * + ↑(higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + (b : F.valuationSubring) b.2)⁻¹ - + ((higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + (b : F.valuationSubring) b.2 : F.valuationSubringˣ) : + F.valuationSubring) * + ↑(higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + (b : F.valuationSubring) b.2)⁻¹ := by + rw [hbinv] + _ = ((a : F.valuationSubring) - (b : F.valuationSubring)) * + ↑(higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + (b : F.valuationSubring) b.2)⁻¹ := by + rw [hbval] + ring] + exact (F.maximalIdeal ^ (n + 1)).mul_mem_right _ hab + +/-- The class `[1+a]` is trivial exactly when `a ∈ m^(n+1)`. -/ +theorem principalUnitSuccQuotOfIdealPow_eq_one_iff + (n : ℕ) (hn : 1 ≤ n) + (a : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u)) : + higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow F n hn a = 1 ↔ + (a : F.valuationSubring) ∈ F.maximalIdeal ^ (n + 1) := by + constructor + · intro h + have hmem := + (higherPrincipalUnitGroup.principalUnitSuccQuotMk_eq_one_iff F n _).1 h + rw [higherPrincipalUnitGroup.mem_succ_subgroupOf_iff] at hmem + simpa [higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow, + higherPrincipalUnitGroup.principalUnitOneAddOfMemPowSubgroup, + higherPrincipalUnitGroup.principalUnitOneAddOfMemPow_val] using hmem + · intro ha + exact higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow_eq_one_of_mem_succ + F n hn a ha + +/-- Products of two elements of `m^n`, for `n ≥ 1`, lie in `m^(n+1)`. -/ +theorem maximalIdealPow_mul_mem_succ {n : ℕ} (hn : 1 ≤ n) + (a b : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u)) : + ((a : F.valuationSubring) * (b : F.valuationSubring)) ∈ + F.maximalIdeal ^ (n + 1) := by + have hmul : + ((a : F.valuationSubring) * (b : F.valuationSubring)) ∈ + F.maximalIdeal ^ (n + n) := by + simpa [pow_add] using (Ideal.mul_mem_mul a.2 b.2) + have hle : F.maximalIdeal ^ (n + n) ≤ F.maximalIdeal ^ (n + 1) := + Ideal.pow_le_pow_right (Nat.add_le_add_left hn n) + exact hle hmul + +/-- The map `a ↦ [1+a]` is additive after passing to the successive +principal-unit quotient. -/ +theorem principalUnitSuccQuotOfIdealPow_add + (n : ℕ) (hn : 1 ≤ n) + (a b : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u)) : + higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow F n hn (a + b) = + higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow F n hn a * + higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow F n hn b := by + rw [higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow_apply, + higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow_apply, + higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow_apply, + ← map_mul] + symm + apply (higherPrincipalUnitGroup.principalUnitSuccQuotMk_eq_iff_div_mem F n _ _).2 + rw [higherPrincipalUnitGroup.mem_succ_subgroupOf_iff] + change ((((higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + (a : F.valuationSubring) a.2 * + higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + (b : F.valuationSubring) b.2 : F.valuationSubringˣ) / + higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + ((a + b : (F.maximalIdeal ^ n : Ideal F.valuationSubring)) : + F.valuationSubring) (a + b).2 : F.valuationSubringˣ) : + F.valuationSubring) - 1) ∈ F.maximalIdeal ^ (n + 1) + rw [show ((((higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + (a : F.valuationSubring) a.2 * + higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + (b : F.valuationSubring) b.2 : F.valuationSubringˣ) / + higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + ((a + b : (F.maximalIdeal ^ n : Ideal F.valuationSubring)) : + F.valuationSubring) (a + b).2 : F.valuationSubringˣ) : + F.valuationSubring) - 1) = + ((a : F.valuationSubring) * (b : F.valuationSubring)) * + ↑(higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + ((a + b : (F.maximalIdeal ^ n : Ideal F.valuationSubring)) : + F.valuationSubring) (a + b).2)⁻¹ by + simp only [div_eq_mul_inv, Units.val_mul] + rw [higherPrincipalUnitGroup.principalUnitOneAddOfMemPow_val F hn + (a : F.valuationSubring) a.2, + higherPrincipalUnitGroup.principalUnitOneAddOfMemPow_val F hn + (b : F.valuationSubring) b.2] + have habval : + ((higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + ((a + b : (F.maximalIdeal ^ n : Ideal F.valuationSubring)) : + F.valuationSubring) (a + b).2 : F.valuationSubringˣ) : + F.valuationSubring) = + 1 + (a : F.valuationSubring) + (b : F.valuationSubring) := by + rw [higherPrincipalUnitGroup.principalUnitOneAddOfMemPow_val F hn + ((a + b : (F.maximalIdeal ^ n : Ideal F.valuationSubring)) : + F.valuationSubring) (a + b).2] + change 1 + ((a : F.valuationSubring) + (b : F.valuationSubring)) = + 1 + (a : F.valuationSubring) + (b : F.valuationSubring) + ring + have habinv : + ((higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + ((a + b : (F.maximalIdeal ^ n : Ideal F.valuationSubring)) : + F.valuationSubring) (a + b).2 : F.valuationSubringˣ) : + F.valuationSubring) * + ↑(higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + ((a + b : (F.maximalIdeal ^ n : Ideal F.valuationSubring)) : + F.valuationSubring) (a + b).2)⁻¹ = 1 := by + simp + calc + ((1 + (a : F.valuationSubring)) * (1 + (b : F.valuationSubring))) * + ↑(higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + ((a + b : (F.maximalIdeal ^ n : Ideal F.valuationSubring)) : + F.valuationSubring) (a + b).2)⁻¹ - 1 = + ((1 + (a : F.valuationSubring)) * (1 + (b : F.valuationSubring))) * + ↑(higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + ((a + b : (F.maximalIdeal ^ n : Ideal F.valuationSubring)) : + F.valuationSubring) (a + b).2)⁻¹ - + ((higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + ((a + b : (F.maximalIdeal ^ n : Ideal F.valuationSubring)) : + F.valuationSubring) (a + b).2 : F.valuationSubringˣ) : + F.valuationSubring) * + ↑(higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + ((a + b : (F.maximalIdeal ^ n : Ideal F.valuationSubring)) : + F.valuationSubring) (a + b).2)⁻¹ := by + rw [habinv] + _ = ((a : F.valuationSubring) * (b : F.valuationSubring)) * + ↑(higherPrincipalUnitGroup.principalUnitOneAddOfMemPow F hn + ((a + b : (F.maximalIdeal ^ n : Ideal F.valuationSubring)) : + F.valuationSubring) (a + b).2)⁻¹ := by + rw [habval] + ring] + exact (F.maximalIdeal ^ (n + 1)).mul_mem_right _ + (higherPrincipalUnitGroup.maximalIdealPow_mul_mem_succ F hn a b) + +/-- The descent of `a ↦ [1+a]` to `m^n/m^(n+1)`. -/ +noncomputable def principalUnitSuccQuotOfMaximalIdealPowSuccQuot + (n : ℕ) (hn : 1 ≤ n) : + MaximalIdealPowSuccQuot F.toDVF n → + higherPrincipalUnitGroup.principalUnitSuccQuot F n := + maximalIdealPowSuccQuotLift + F.toDVF n + (higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow F n hn) + (fun a b hsub => + higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow_eq_of_sub_mem_succ + F n hn a b (by simpa using hsub)) + +/-- +Establishes the identity `higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot +F n hn (maximalIdealPowSuccQuotMk F.toDVF n a) = +higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow F n hn a`. +-/ +@[simp] theorem principalUnitSuccQuotOfMaximalIdealPowSuccQuot_mk + (n : ℕ) (hn : 1 ≤ n) + (a : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u)) : + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn + (maximalIdealPowSuccQuotMk F.toDVF n a) = + higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow F n hn a := + rfl + +/-- +`principalUnitSuccQuotOfMaximalIdealPowSuccQuot` has the zero-value formula +`higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn 0 = 1`. +-/ +@[simp] theorem principalUnitSuccQuotOfMaximalIdealPowSuccQuot_map_zero + (n : ℕ) (hn : 1 ≤ n) : + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn 0 = 1 := by + rw [← map_zero + (maximalIdealPowSuccQuotMk F.toDVF n)] + change higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn + (maximalIdealPowSuccQuotMk F.toDVF n + (0 : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u))) = 1 + rw [higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot_mk] + exact higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow_eq_one_of_mem_succ + F n hn (0 : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u)) (by simp) + +/-- +`principalUnitSuccQuotOfMaximalIdealPowSuccQuot` satisfies the addition formula +`higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn (x + y) = +higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn x * +higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn y`. +-/ +theorem principalUnitSuccQuotOfMaximalIdealPowSuccQuot_map_add + (n : ℕ) (hn : 1 ≤ n) + (x y : MaximalIdealPowSuccQuot F.toDVF n) : + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn (x + y) = + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn x * + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn y := by + refine + MaximalIdealPowSuccQuot.inductionOn₂ + (motive := fun x' y' => + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot + F n hn (x' + y') = + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot + F n hn x' * + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot + F n hn y') + F.toDVF n x y ?_ + intro a b + let qa : + MaximalIdealPowSuccQuot F.toDVF n := + maximalIdealPowSuccQuotMk F.toDVF n a + let qb : + MaximalIdealPowSuccQuot F.toDVF n := + maximalIdealPowSuccQuotMk F.toDVF n b + have hleft : + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn + (qa + qb) = + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn + (maximalIdealPowSuccQuotMk + F.toDVF n (a + b)) := by + have hadd : qa + qb = + maximalIdealPowSuccQuotMk + F.toDVF n (a + b) := by + exact (map_add + (maximalIdealPowSuccQuotMk + F.toDVF n) a b).symm + exact congrArg + (higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn) hadd + have hrep : + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn + (maximalIdealPowSuccQuotMk + F.toDVF n (a + b)) = + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn qa * + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn qb := by + dsimp [qa, qb] + change higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn + (maximalIdealPowSuccQuotMk F.toDVF n (a + b)) = + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn + (maximalIdealPowSuccQuotMk F.toDVF n a) * + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn + (maximalIdealPowSuccQuotMk F.toDVF n b) + rw [higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot_mk, + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot_mk, + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot_mk] + exact higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow_add F n hn a b + exact hleft.trans hrep + +/-- Additive form of the descended map `m^n/m^(n+1) → U^n/U^(n+1)`. -/ +noncomputable def principalUnitSuccQuotOfMaximalIdealPowSuccQuotAdd + (n : ℕ) (hn : 1 ≤ n) : + MaximalIdealPowSuccQuot F.toDVF n →+ + Additive (higherPrincipalUnitGroup.principalUnitSuccQuot F n) where + toFun x := Additive.ofMul + (higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn x) + map_zero' := by + change Additive.ofMul + (higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn 0) = 0 + simp + map_add' x y := by + change Additive.ofMul + (higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn (x + y)) = + Additive.ofMul + (higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn x * + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn y) + rw [higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot_map_add] + +/-- +The defining evaluation formula for `principalUnitSuccQuotOfMaximalIdealPowSuccQuotAdd` is +`higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuotAdd F n hn x = +Additive.ofMul (higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn +x)`. +-/ +@[simp] theorem principalUnitSuccQuotOfMaximalIdealPowSuccQuotAdd_apply + (n : ℕ) (hn : 1 ≤ n) (x : MaximalIdealPowSuccQuot F.toDVF n) : + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuotAdd F n hn x = + Additive.ofMul + (higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn x) := + rfl + +/-- +Characterizes `higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn x = +1` by the equivalent condition `x = 0`. +-/ +theorem principalUnitSuccQuotOfMaximalIdealPowSuccQuot_eq_one_iff + (n : ℕ) (hn : 1 ≤ n) (x : MaximalIdealPowSuccQuot F.toDVF n) : + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn x = 1 ↔ + x = 0 := by + refine + MaximalIdealPowSuccQuot.inductionOn + (motive := fun x' => + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot + F n hn x' = 1 ↔ x' = 0) + F.toDVF n x ?_ + intro a + rw [← map_zero + (maximalIdealPowSuccQuotMk F.toDVF n)] + change higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn + (maximalIdealPowSuccQuotMk F.toDVF n a) = 1 ↔ + (maximalIdealPowSuccQuotMk F.toDVF n a : + MaximalIdealPowSuccQuot F.toDVF n) = 0 + rw [higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot_mk, + maximalIdealPowSuccQuotMk_eq_zero_iff] + exact higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow_eq_one_iff F n hn a + +/-- +The specified map is surjective: `Function.Surjective +(higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn)`. +-/ +theorem principalUnitSuccQuotOfMaximalIdealPowSuccQuot_surjective + (n : ℕ) (hn : 1 ≤ n) : + Function.Surjective + (higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn) := by + intro x + rcases higherPrincipalUnitGroup.principalUnitSuccQuotMk_surjective F n x with ⟨u, rfl⟩ + let a0 : F.valuationSubring := ((u : F.valuationSubringˣ) : F.valuationSubring) - 1 + have ha0 : a0 ∈ F.maximalIdeal ^ n := by + dsimp [a0] + exact (higherPrincipalUnitGroup.mem_iff F n (u : F.valuationSubringˣ)).1 u.2 + let a : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) := ⟨a0, ha0⟩ + refine ⟨maximalIdealPowSuccQuotMk F.toDVF n a, ?_⟩ + rw [higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot_mk, + higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow_apply] + congr 1 + dsimp [a] + apply Subtype.ext + rw [higherPrincipalUnitGroup.principalUnitOneAddOfMemPowSubgroup_val] + apply Units.ext + rw [higherPrincipalUnitGroup.principalUnitOneAddOfMemPow_val] + dsimp [a0] + ring + +/-- +The specified map is surjective: `Function.Surjective +(higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuotAdd F n hn)`. +-/ +theorem principalUnitSuccQuotOfMaximalIdealPowSuccQuotAdd_surjective + (n : ℕ) (hn : 1 ≤ n) : + Function.Surjective + (higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuotAdd F n hn) := by + intro y + rcases higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot_surjective + F n hn (Additive.toMul y) with ⟨x, hx⟩ + refine ⟨x, ?_⟩ + change Additive.ofMul + (higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn x) = y + rw [hx] + rfl + +/-- +The specified map is injective: `Function.Injective +(higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuotAdd F n hn)`. +-/ +theorem principalUnitSuccQuotOfMaximalIdealPowSuccQuotAdd_injective + (n : ℕ) (hn : 1 ≤ n) : + Function.Injective + (higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuotAdd F n hn) := by + intro x y hxy + have hzero : + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuotAdd F n hn + (x - y) = 0 := by + rw [map_sub, hxy] + exact sub_self + (higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuotAdd + F n hn y) + have hmul : + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn + (x - y) = 1 := by + change Additive.ofMul + (higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn + (x - y)) = + Additive.ofMul (1 : higherPrincipalUnitGroup.principalUnitSuccQuot F n) at hzero + exact Additive.ofMul.injective hzero + have hxmy : x - y = 0 := + (higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot_eq_one_iff + F n hn (x - y)).1 hmul + exact sub_eq_zero.mp hxmy + +/-- The additive isomorphism `m^n/m^(n+1) ≃ U^n/U^(n+1)` induced by +`a ↦ 1+a`. -/ +noncomputable def maximalIdealPowSuccQuotAddEquivPrincipalUnitSuccQuot + (n : ℕ) (hn : 1 ≤ n) : + MaximalIdealPowSuccQuot F.toDVF n ≃+ + Additive (higherPrincipalUnitGroup.principalUnitSuccQuot F n) := + AddEquiv.ofBijective + (higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuotAdd F n hn) + ⟨higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuotAdd_injective + F n hn, + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuotAdd_surjective + F n hn⟩ + +/-- +The defining evaluation formula for `maximalIdealPowSuccQuotAddEquivPrincipalUnitSuccQuot` is +`higherPrincipalUnitGroup.maximalIdealPowSuccQuotAddEquivPrincipalUnitSuccQuot F n hn x = +higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuotAdd F n hn x`. +-/ +@[simp] theorem maximalIdealPowSuccQuotAddEquivPrincipalUnitSuccQuot_apply + (n : ℕ) (hn : 1 ≤ n) (x : MaximalIdealPowSuccQuot F.toDVF n) : + higherPrincipalUnitGroup.maximalIdealPowSuccQuotAddEquivPrincipalUnitSuccQuot + F n hn x = + higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuotAdd F n hn x := + rfl + +/-- The unit-quotient coordinate theorem for a complete DVF with a specified +uniformizer: `U^n/U^(n+1)` is additively the residue field. -/ +noncomputable def principalUnitSuccQuotAddEquivResidueOfUniformizer + {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) : + Additive (higherPrincipalUnitGroup.principalUnitSuccQuot F n) ≃+ F.residueField := + (higherPrincipalUnitGroup.maximalIdealPowSuccQuotAddEquivPrincipalUnitSuccQuot + F n hn).symm.trans + (residueAddEquivMaximalIdealPowSuccQuotOfUniformizer F.toDVF hpi n).symm + +/-- Cardinality form of the associated-graded identification +`U^n/U^(n+1) ≃ k` for `n ≥ 1`. -/ +theorem card_principalUnitSuccQuot_eq_residue_of_uniformizer + {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) : + Nat.card (higherPrincipalUnitGroup.principalUnitSuccQuot F n) = + Nat.card F.residueField := by + calc + Nat.card (higherPrincipalUnitGroup.principalUnitSuccQuot F n) = + Nat.card (Additive + (higherPrincipalUnitGroup.principalUnitSuccQuot F n)) := + Nat.card_congr + (Additive.ofMul : + higherPrincipalUnitGroup.principalUnitSuccQuot F n ≃ + Additive (higherPrincipalUnitGroup.principalUnitSuccQuot F n)) + _ = Nat.card F.residueField := + Nat.card_congr + (higherPrincipalUnitGroup.principalUnitSuccQuotAddEquivResidueOfUniformizer + F hpi n hn).toEquiv + +/-- Cardinality of the finite principal-unit range `U^1/U^n`, obtained by +iterating the adjacent quotients `U^i/U^(i+1) ≃ k`. -/ +theorem card_principalUnitSubquotient_one_eq_residue_pow_of_uniformizer + [Finite F.residueField] + {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) + {n : ℕ} (hn : 1 ≤ n) : + Nat.card (higherPrincipalUnitGroup F 1 ⧸ + (higherPrincipalUnitGroup F n).subgroupOf + (higherPrincipalUnitGroup F 1)) = + Nat.card F.residueField ^ (n - 1) := by + let U := higherPrincipalUnitGroup.toPrincipalUnitFiltration F + let hfinite (i j : ℕ) : Finite (U.principalUnitSubquotient i j) := by + exact + higherPrincipalUnitGroup.finite_principalUnitSubquotient_of_finite_residue + F i j + have hN : ∀ i : ℕ, (U.principalUnitSubgroup i).Normal := by + intro i + change (higherPrincipalUnitGroup F i).Normal + infer_instance + have hn_eq : 1 + (n - 1) = n := + by + simpa [Nat.succ_eq_add_one, Nat.add_comm] using + (Nat.succ_pred_eq_of_pos hn) + calc + Nat.card (U.principalUnitSubquotient 1 n) = + Nat.card (U.principalUnitSubquotient 1 (1 + (n - 1))) := by + rw [hn_eq] + _ = + ∏ i ∈ Finset.range (n - 1), + Nat.card (U.principalUnitGradedPiece (1 + i)) := by + rw [U.card_principalUnitSubquotient_eq_prod_gradedPiece hN 1 (n - 1)] + _ = + ∏ _i ∈ Finset.range (n - 1), Nat.card F.residueField := by + apply Finset.prod_congr rfl + intro i _hi + have hpos : 1 ≤ 1 + i := by omega + calc + Nat.card (U.principalUnitGradedPiece (1 + i)) = + Nat.card + (higherPrincipalUnitGroup.principalUnitSuccQuot F (1 + i)) := + Nat.card_congr + (higherPrincipalUnitGroup.principalUnitSuccQuotEquivGradedPiece + F (1 + i)).symm.toEquiv + _ = Nat.card F.residueField := + higherPrincipalUnitGroup.card_principalUnitSuccQuot_eq_residue_of_uniformizer + F hpi (1 + i) hpos + _ = Nat.card F.residueField ^ (n - 1) := by + simp + +/-- Under the inverse of `U^n/U^(n+1) ≃ k`, the residue of `r` is represented +by the principal unit `1 + r * pi^n`. -/ +@[simp] theorem principalUnitSuccQuotAddEquivResidueOfUniformizer_symm_residue + {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) (r : F.valuationSubring) : + (higherPrincipalUnitGroup.principalUnitSuccQuotAddEquivResidueOfUniformizer + F hpi n hn).symm (F.residueMap r) = + Additive.ofMul + (higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow F n hn + (maximalIdealPowMulUniformizerPowMap F.toDVF hpi n r)) := by + rw [higherPrincipalUnitGroup.principalUnitSuccQuotAddEquivResidueOfUniformizer] + rw [AddEquiv.symm_trans_apply] + simp only [AddEquiv.symm_symm] + rw [residueAddEquivMaximalIdealPowSuccQuotOfUniformizer_residue] + rw [higherPrincipalUnitGroup.maximalIdealPowSuccQuotAddEquivPrincipalUnitSuccQuot_apply] + rw [higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuotAdd_apply] + change Additive.ofMul + (higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot F n hn + (maximalIdealPowSuccQuotMk F.toDVF n + (maximalIdealPowMulUniformizerPowMap F.toDVF hpi n r))) = + Additive.ofMul + (higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow F n hn + (maximalIdealPowMulUniformizerPowMap F.toDVF hpi n r)) + rw [higherPrincipalUnitGroup.principalUnitSuccQuotOfMaximalIdealPowSuccQuot_mk] + +/-- The equivalence `U^n/U^(n+1) ≃ k` sends the coordinate class +`[1 + r * pi^n]` to the residue of `r`. -/ +theorem principalUnitSuccQuotAddEquivResidueOfUniformizer_coord + {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (hn : 1 ≤ n) (r : F.valuationSubring) : + higherPrincipalUnitGroup.principalUnitSuccQuotAddEquivResidueOfUniformizer + F hpi n hn + (Additive.ofMul + (higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow F n hn + (maximalIdealPowMulUniformizerPowMap F.toDVF hpi n r))) = + F.residueMap r := by + let E := higherPrincipalUnitGroup.principalUnitSuccQuotAddEquivResidueOfUniformizer + F hpi n hn + have hcoord : + E.symm (F.residueMap r) = + Additive.ofMul + (higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow F n hn + (maximalIdealPowMulUniformizerPowMap F.toDVF hpi n r)) := by + simp [E] + change E + (Additive.ofMul + (higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow F n hn + (maximalIdealPowMulUniformizerPowMap F.toDVF hpi n r))) = + F.residueMap r + rw [← hcoord] + exact E.apply_symm_apply (F.residueMap r) + +/-- The induced action on `O^*/U^n` preserves the image of `U^m` in that +quotient. This is the finite-stage principal-unit class compatibility needed +before applying prime-to-`p` quotient invisibility. -/ +theorem unitsModPrincipalUnitEquivOfPreserves_mem_principalUnitClassInQuotient_iff + (e : K ≃+* K) + (hmem : + ∀ x : K, + x ∈ F.valuation.valuationSubring ↔ + e x ∈ F.valuation.valuationSubring) + {m n : ℕ} (hmn : m ≤ n) + (q : F.valuationSubringˣ ⧸ higherPrincipalUnitGroup F n) : + unitsModPrincipalUnitEquivOfPreserves F e hmem n q ∈ + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubgroupClassInQuotient + m n ↔ + q ∈ + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubgroupClassInQuotient + m n := by + obtain ⟨u, rfl⟩ := QuotientGroup.mk'_surjective + (higherPrincipalUnitGroup F n) q + have hleft' : + QuotientGroup.mk' (higherPrincipalUnitGroup F n) + (valuationSubringUnitEquivOfPreserves F e hmem u) ∈ + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubgroupClassInQuotient + m n ↔ + valuationSubringUnitEquivOfPreserves F e hmem u ∈ + higherPrincipalUnitGroup F m := by + exact + AntitoneSubgroupFiltration.quotient_principalUnitSubgroup_mk_mem_classInQuotient_iff + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F) hmn + (valuationSubringUnitEquivOfPreserves F e hmem u) + have hright' : + QuotientGroup.mk' (higherPrincipalUnitGroup F n) u ∈ + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubgroupClassInQuotient + m n ↔ + u ∈ higherPrincipalUnitGroup F m := by + exact + AntitoneSubgroupFiltration.quotient_principalUnitSubgroup_mk_mem_classInQuotient_iff + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F) hmn u + rw [unitsModPrincipalUnitEquivOfPreserves_mk] + rw [hleft', hright'] + exact valuationSubringUnitEquivOfPreserves_mem_principalUnit_iff F e hmem m u + +/-- If the induced residue-field automorphism is pointwise trivial, then the +displacement of the induced action on `O^*/U^n` lies in the image of +`U^1/U^n`. -/ +theorem unitsModPrincipalUnitEquivOfPreserves_div_mem_principalUnitClass_one + (e : K ≃+* K) + (hmem : + ∀ x : K, + x ∈ F.valuation.valuationSubring ↔ + e x ∈ F.valuation.valuationSubring) + (hres : + ∀ x : F.residueField, + valuationSubringResidueFieldEquivOfPreserves F e hmem x = x) + (n : ℕ) + (q : F.valuationSubringˣ ⧸ higherPrincipalUnitGroup F n) : + unitsModPrincipalUnitEquivOfPreserves F e hmem n q / q ∈ + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubgroupClassInQuotient + 1 n := by + obtain ⟨u, rfl⟩ := QuotientGroup.mk'_surjective + (higherPrincipalUnitGroup F n) q + have hdisp : + valuationSubringUnitEquivOfPreserves F e hmem u / u ∈ + higherPrincipalUnitGroup F 1 := + unitEquiv_div_mem_principalUnit_one_of_residueFieldEquiv_fixed + F e hmem hres u + have hclass' : + QuotientGroup.mk' (higherPrincipalUnitGroup F n) + (valuationSubringUnitEquivOfPreserves F e hmem u / u) ∈ + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubgroupClassInQuotient + 1 n := by + apply + AntitoneSubgroupFiltration.principalUnitSubgroupClassInQuotient_mk_mem + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F) + exact hdisp + rw [unitsModPrincipalUnitEquivOfPreserves_mk] + simpa only [map_div] using hclass' + +/-- Therefore every adjacent concrete principal-unit class +`U^i/U^(i+1)` is finite when the residue field is finite. -/ +theorem finite_principalUnitSubgroupClassInQuotient_of_finite_residue + [Finite F.residueField] (i : ℕ) : + Finite + ((higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubgroupClassInQuotient + i (i + 1)) := by + have : + Finite + (F.valuationSubringˣ ⧸ + (higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubgroup + (i + 1)) := by + change Finite + (F.valuationSubringˣ ⧸ higherPrincipalUnitGroup F (i + 1)) + exact + higherPrincipalUnitGroup.finite_unitsModHigherPrincipalUnitGroup_of_finite_residue + F (i + 1) + exact Finite.of_injective Subtype.val Subtype.val_injective + +end higherPrincipalUnitGroup + +end CompleteDVF +end DiscreteValuationField + +end + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Filtration.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Filtration.lean new file mode 100644 index 0000000000..a9984d18f5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Filtration.lean @@ -0,0 +1,260 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ResidueField +public import Mathlib.Algebra.CharP.Lemmas +public import Mathlib.Algebra.Group.Units.Hom + +/-! # Filtration -/ + +@[expose] public section +namespace LocalFieldTheory + +open ValuationTheory +open ValuationTheory.DiscreteValuationField.ResidueField + +/-! +# Principal-unit filtration from a valuation ring + +For a complete DVF `F`, the concrete principal-unit filtration on the unit group +of the valuation ring is + +`U^n = { u | u - 1 ∈ m^n }`. + +This file turns that definition into the abstract `AntitoneSubgroupFiltration` +used by ramification and norm arguments. +-/ + +noncomputable +section + +open scoped BigOperators + +universe u v + +namespace DiscreteValuationField +namespace CompleteDVF + +variable {K : Type u} [Field K] + +/-- The concrete `n`-th principal-unit subgroup of the valuation ring unit group. -/ +def higherPrincipalUnitGroup + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) (n : ℕ) : + Subgroup F.valuationSubringˣ where + carrier := {u | (u : F.valuationSubring) - 1 ∈ F.maximalIdeal ^ n} + one_mem' := by + simp + mul_mem' := by + intro x y hx hy + have hxy : + ((x * y : F.valuationSubringˣ) : F.valuationSubring) - 1 = + (x : F.valuationSubring) * ((y : F.valuationSubring) - 1) + + ((x : F.valuationSubring) - 1) := by + simp + ring + change ((x * y : F.valuationSubringˣ) : F.valuationSubring) - 1 ∈ F.maximalIdeal ^ n + rw [hxy] + exact Ideal.add_mem _ (Ideal.mul_mem_left _ _ hy) hx + inv_mem' := by + intro x hx + have hxinv : + ((x⁻¹ : F.valuationSubringˣ) : F.valuationSubring) - 1 = + -(((x⁻¹ : F.valuationSubringˣ) : F.valuationSubring) * + ((x : F.valuationSubring) - 1)) := by + calc + ((x⁻¹ : F.valuationSubringˣ) : F.valuationSubring) - 1 = + ((x⁻¹ : F.valuationSubringˣ) : F.valuationSubring) - + ((x⁻¹ : F.valuationSubringˣ) : F.valuationSubring) * + (x : F.valuationSubring) := by + simp + _ = -(((x⁻¹ : F.valuationSubringˣ) : F.valuationSubring) * + ((x : F.valuationSubring) - 1)) := by + ring + change ((x⁻¹ : F.valuationSubringˣ) : F.valuationSubring) - 1 ∈ F.maximalIdeal ^ n + rw [hxinv] + exact (F.maximalIdeal ^ n).neg_mem + (Ideal.mul_mem_left (F.maximalIdeal ^ n) + ((x⁻¹ : F.valuationSubringˣ) : F.valuationSubring) hx) + +namespace higherPrincipalUnitGroup + +variable (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + +/-- +Characterizes `u ∈ higherPrincipalUnitGroup F n` by the equivalent condition `(u : +F.valuationSubring) - 1 ∈ F.maximalIdeal ^ n`. +-/ +@[simp] theorem mem_iff (n : ℕ) (u : F.valuationSubringˣ) : + u ∈ higherPrincipalUnitGroup F n ↔ + (u : F.valuationSubring) - 1 ∈ F.maximalIdeal ^ n := + Iff.rfl + +/-- Higher levels are contained in lower levels. -/ +theorem antitone {m n : ℕ} (h : m ≤ n) : + higherPrincipalUnitGroup F n ≤ higherPrincipalUnitGroup F m := by + intro u hu + exact (Ideal.pow_le_pow_right h) hu + +/-- Prime-binomial containment in an ideal. If `p ∈ I` and `a ∈ I^n` with +`n ≥ 1`, then `(1 + a)^p - 1` is one level deeper. -/ +theorem one_add_pow_prime_sub_one_mem_pow_succ + {R : Type*} [CommRing R] (I : Ideal R) + {p n : ℕ} (hp : Nat.Prime p) (hn : 1 ≤ n) + (hp_mem : (p : R) ∈ I) {a : R} (ha : a ∈ I ^ n) : + (1 + a) ^ p - 1 ∈ I ^ (n + 1) := by + rcases exists_add_pow_prime_eq hp (1 : R) a with ⟨r, hr⟩ + have hnp : n + 1 ≤ n * p := by + exact (Nat.add_le_add_left hn n).trans + (by simpa [Nat.mul_two] using Nat.mul_le_mul_left n hp.two_le) + have ha_pow_np : a ^ p ∈ I ^ (n * p) := by + simpa [pow_mul] using (Ideal.pow_mem_pow ha p) + have ha_pow_succ : a ^ p ∈ I ^ (n + 1) := + Ideal.pow_le_pow_right hnp ha_pow_np + have ha_p_succ : a * (p : R) ∈ I ^ (n + 1) := by + simpa [pow_succ] using (Ideal.mul_mem_mul ha hp_mem) + have hp_a_succ : (p : R) * a ∈ I ^ (n + 1) := by + simpa [mul_comm] using ha_p_succ + have hp_a_r_succ : (p : R) * a * r ∈ I ^ (n + 1) := + (I ^ (n + 1)).mul_mem_right r hp_a_succ + have hbinom : (1 + a) ^ p - 1 = a ^ p + (p : R) * a * r := by + rw [hr] + ring + rw [hbinom] + exact Ideal.add_mem _ ha_pow_succ hp_a_r_succ + +/-- If the residue field has ring characteristic `p`, then `p` lies in the +maximal ideal of the valuation ring. -/ +theorem natCast_mem_maximalIdeal_of_residue_ringChar_eq + {p : ℕ} (hchar : ringChar F.residueField = p) : + (p : F.valuationSubring) ∈ F.maximalIdeal := by + have : CharP F.residueField p := (ringChar.eq_iff (R := F.residueField)).1 hchar + rw [← F.residue_eq_zero_iff] + rw [map_natCast] + exact CharP.cast_eq_zero F.residueField p + +/-- Concrete principal-unit form of the prime-binomial containment: +if `p ∈ m`, then the `p`th power carries `U^n` into `U^(n+1)` for `n ≥ 1`. -/ +theorem pow_mem_succ_of_natCast_mem_maximalIdeal + {p n : ℕ} (hp : Nat.Prime p) (hn : 1 ≤ n) + (hp_mem : (p : F.valuationSubring) ∈ F.maximalIdeal) + {u : F.valuationSubringˣ} + (hu : u ∈ higherPrincipalUnitGroup F n) : + u ^ p ∈ higherPrincipalUnitGroup F (n + 1) := by + rw [higherPrincipalUnitGroup.mem_iff] at hu ⊢ + let a : F.valuationSubring := (u : F.valuationSubring) - 1 + have hu_eq : (u : F.valuationSubring) = 1 + a := by + simp [a] + have hpow : + ((u ^ p : F.valuationSubringˣ) : F.valuationSubring) = + (u : F.valuationSubring) ^ p := by + simp + rw [hpow, hu_eq] + exact + higherPrincipalUnitGroup.one_add_pow_prime_sub_one_mem_pow_succ + F.maximalIdeal hp hn hp_mem hu + +/-- Residue-characteristic form of `pow_mem_succ_of_natCast_mem_maximalIdeal`: +if the residue field has characteristic `p`, then `p`th powers move principal +units one step deeper. -/ +theorem pow_mem_succ_of_residue_ringChar_eq + {p n : ℕ} (hp : Nat.Prime p) (hn : 1 ≤ n) + (hchar : ringChar F.residueField = p) + {u : F.valuationSubringˣ} + (hu : u ∈ higherPrincipalUnitGroup F n) : + u ^ p ∈ higherPrincipalUnitGroup F (n + 1) := + higherPrincipalUnitGroup.pow_mem_succ_of_natCast_mem_maximalIdeal + F hp hn + (higherPrincipalUnitGroup.natCast_mem_maximalIdeal_of_residue_ringChar_eq + F hchar) + hu + +/-- Establishes the identity `higherPrincipalUnitGroup F 0 = ⊤`. -/ +@[simp] theorem zero_eq_top : + higherPrincipalUnitGroup F 0 = ⊤ := by + ext u + simp [higherPrincipalUnitGroup] + +/-- The residue of a valuation-ring unit, viewed as a unit of the residue +field. -/ +def residueUnitHom : + F.valuationSubringˣ →* F.residueFieldˣ := + Units.map F.residueMap.toMonoidHom + +/-- +The defining evaluation formula for `residueUnitHom` is `((higherPrincipalUnitGroup.residueUnitHom +F u : F.residueFieldˣ) : F.residueField) = F.residueMap (u : F.valuationSubring)`. +-/ +@[simp] theorem residueUnitHom_apply (u : F.valuationSubringˣ) : + ((higherPrincipalUnitGroup.residueUnitHom F u : F.residueFieldˣ) : + F.residueField) = + F.residueMap (u : F.valuationSubring) := + rfl + +/-- The first concrete principal-unit level consists exactly of units whose +residue is `1`. -/ +theorem mem_one_iff_residue_eq_one (u : F.valuationSubringˣ) : + u ∈ higherPrincipalUnitGroup F 1 ↔ + F.residueMap (u : F.valuationSubring) = 1 := by + rw [higherPrincipalUnitGroup.mem_iff, pow_one] + constructor + · intro hu + have hres : + F.residueMap (u : F.valuationSubring) = F.residueMap 1 := by + exact + (residue_eq_residue_iff_sub_mem_maximalIdeal + (R := F.valuationSubring) (u : F.valuationSubring) 1).2 hu + simpa using hres + · intro hu + exact + (residue_eq_residue_iff_sub_mem_maximalIdeal + (R := F.valuationSubring) (u : F.valuationSubring) 1).1 + (by simpa using hu) + +/-- +Characterizes `higherPrincipalUnitGroup.residueUnitHom F u = 1` by the equivalent condition `u ∈ +higherPrincipalUnitGroup F 1`. +-/ +theorem residueUnitHom_eq_one_iff (u : F.valuationSubringˣ) : + higherPrincipalUnitGroup.residueUnitHom F u = 1 ↔ + u ∈ higherPrincipalUnitGroup F 1 := by + constructor + · intro hu + apply (higherPrincipalUnitGroup.mem_one_iff_residue_eq_one F u).2 + have hval := + congrArg (fun z : F.residueFieldˣ => (z : F.residueField)) hu + simpa using hval + · intro hu + apply Units.ext + simpa using (higherPrincipalUnitGroup.mem_one_iff_residue_eq_one F u).1 hu + +/-- +Characterizes `higherPrincipalUnitGroup.residueUnitHom F u = +higherPrincipalUnitGroup.residueUnitHom F v` by the equivalent condition `F.residueMap (u : +F.valuationSubring) = F.residueMap (v : F.valuationSubring)`. +-/ +theorem residueUnitHom_eq_iff_residue_eq + (u v : F.valuationSubringˣ) : + higherPrincipalUnitGroup.residueUnitHom F u = + higherPrincipalUnitGroup.residueUnitHom F v ↔ + F.residueMap (u : F.valuationSubring) = + F.residueMap (v : F.valuationSubring) := by + constructor + · intro h + exact congrArg (fun z : F.residueFieldˣ => (z : F.residueField)) h + · intro h + apply Units.ext + simpa using h +end higherPrincipalUnitGroup + +end CompleteDVF +end DiscreteValuationField + +end + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueQuotient.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueQuotient.lean new file mode 100644 index 0000000000..754b08d209 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueQuotient.lean @@ -0,0 +1,103 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.AutomorphismTransport + +/-! # Residue Quotient -/ + +@[expose] public section +namespace LocalFieldTheory + +open ValuationTheory +open ValuationTheory.DiscreteValuationField.ResidueField + +/-! +# The first principal-unit quotient + +Identifies valuation-ring units modulo first principal units with residue-field units and +records compatibility with valuation-preserving automorphisms. +-/ + +noncomputable +section + +open scoped BigOperators + +universe u v + +namespace DiscreteValuationField +namespace CompleteDVF + +variable {K : Type u} [Field K] + +namespace higherPrincipalUnitGroup + +variable (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + +/-- The kernel of the residue map on valuation-ring units is the first +principal-unit subgroup. -/ +theorem residueUnitHom_ker_eq : + (higherPrincipalUnitGroup.residueUnitHom F).ker = + higherPrincipalUnitGroup F 1 := by + ext u + rw [MonoidHom.mem_ker, higherPrincipalUnitGroup.residueUnitHom_eq_one_iff] + +/-- The first-isomorphism form of the residue map on valuation-ring units: +`O_K^* / U_K^1` is the unit group of the residue field. -/ +noncomputable def unitsModOneEquivResidueFieldUnits : + F.valuationSubringˣ ⧸ higherPrincipalUnitGroup F 1 ≃* F.residueFieldˣ := + QuotientGroup.liftEquiv + (higherPrincipalUnitGroup F 1) + (by + simpa [higherPrincipalUnitGroup.residueUnitHom] using + (IsLocalRing.surjective_units_map_of_local_ringHom + F.residueMap F.residue_surjective + (inferInstanceAs (IsLocalHom F.residueMap)))) + (higherPrincipalUnitGroup.residueUnitHom_ker_eq F).symm + +/-- +Establishes the identity `higherPrincipalUnitGroup.unitsModOneEquivResidueFieldUnits F +(QuotientGroup.mk' (higherPrincipalUnitGroup F 1) u) = higherPrincipalUnitGroup.residueUnitHom F +u`. +-/ +theorem unitsModOneEquivResidueFieldUnits_mk + (u : F.valuationSubringˣ) : + higherPrincipalUnitGroup.unitsModOneEquivResidueFieldUnits F + (QuotientGroup.mk' (higherPrincipalUnitGroup F 1) u) = + higherPrincipalUnitGroup.residueUnitHom F u := by + rfl + +/-- Compatibility of the induced action on `O^*/U^1` with the induced action +on residue-field units. -/ +theorem unitsModOneEquivResidueFieldUnits_unitsModPrincipalUnitEquivOfPreserves_one + (e : K ≃+* K) + (hmem : + ∀ x : K, + x ∈ F.valuation.valuationSubring ↔ + e x ∈ F.valuation.valuationSubring) + (q : F.valuationSubringˣ ⧸ higherPrincipalUnitGroup F 1) : + higherPrincipalUnitGroup.unitsModOneEquivResidueFieldUnits F + (higherPrincipalUnitGroup.unitsModPrincipalUnitEquivOfPreserves + F e hmem 1 q) = + Units.map + (valuationSubringResidueFieldEquivOfPreserves F e hmem).toMonoidHom + (higherPrincipalUnitGroup.unitsModOneEquivResidueFieldUnits F q) := by + obtain ⟨u, rfl⟩ := QuotientGroup.mk'_surjective + (higherPrincipalUnitGroup F 1) q + rw [higherPrincipalUnitGroup.unitsModPrincipalUnitEquivOfPreserves_mk, + higherPrincipalUnitGroup.unitsModOneEquivResidueFieldUnits_mk, + higherPrincipalUnitGroup.unitsModOneEquivResidueFieldUnits_mk, + residueUnitHom_valuationSubringUnitEquivOfPreserves] +end higherPrincipalUnitGroup + +end CompleteDVF +end DiscreteValuationField + +end + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueRoots.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueRoots.lean new file mode 100644 index 0000000000..68e1f45a9b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueRoots.lean @@ -0,0 +1,305 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Filtration +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.HenselLemma +public import Mathlib.SetTheory.Cardinal.Finite +public import Mathlib.FieldTheory.Finite.Basic +public import Mathlib.RingTheory.RootsOfUnity.Basic + +/-! # Residue Roots -/ + +@[expose] public section +namespace LocalFieldTheory + +open ValuationTheory +open ValuationTheory.DiscreteValuationField.ResidueField + +/-! +# Residue roots of unity + +Hensel lifting identifies the finite residue-field unit group with the lifted roots of +unity in the valuation ring. +-/ + +noncomputable +section + +open scoped BigOperators + +universe u v + +namespace DiscreteValuationField +namespace CompleteDVF + +variable {K : Type u} [Field K] + +namespace higherPrincipalUnitGroup + +variable (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + +/-- The `(q - 1)`-st roots of unity in the valuation ring, where +`q = #κ`. -/ +abbrev residueRootsOfUnityGroup : + Subgroup F.valuationSubringˣ := + rootsOfUnity (Nat.card F.residueField - 1) F.valuationSubring + +/-- Every nonzero residue class is a simple root of +`X^(#κ - 1) - 1`. -/ +theorem residueRootPolynomial_derivative_eval_ne_zero + [Finite F.residueField] (y : F.residueFieldˣ) : + (((Polynomial.X ^ (Nat.card F.residueField - 1) - 1 : + Polynomial F.residueField).derivative).eval + (y : F.residueField)) ≠ 0 := by + classical + let := Fintype.ofFinite F.residueField + have hn : + ((Nat.card F.residueField - 1 : ℕ) : F.residueField) ≠ 0 := by + have hunitcard : + (Fintype.card F.residueFieldˣ : F.residueField) ≠ 0 := by + simpa using + (FiniteField.card_cast_subgroup_card_ne_zero + (K := F.residueField) (⊤ : Subgroup F.residueFieldˣ)) + simpa [Nat.card_eq_fintype_card, Fintype.card_units] using hunitcard + have hy : + (y : F.residueField) ^ ((Nat.card F.residueField - 1) - 1) ≠ 0 := + pow_ne_zero _ y.ne_zero + have hmul : + ((Nat.card F.residueField - 1 : ℕ) : F.residueField) * + (y : F.residueField) ^ + ((Nat.card F.residueField - 1) - 1) ≠ 0 := + mul_ne_zero hn hy + simpa [Polynomial.derivative_sub, Polynomial.derivative_one, + Polynomial.derivative_X_pow, Polynomial.eval_mul] using hmul + +/-- Hensel lift of finite-residue-field roots of unity: every residue-field +unit has a valuation-ring unit representative satisfying `u^(q - 1) = 1`. + +This is the substantive splitting input for the multiplicative unit decomposition: +it upgrades the quotient isomorphism `O^*/U^1 ≃ κ^*` from an abstract +first-isomorphism statement to a root-of-unity representative in `O^*`. -/ +theorem exists_residueRootsOfUnity_lift + [Finite F.residueField] (y : F.residueFieldˣ) : + ∃ u : F.valuationSubringˣ, + u ∈ higherPrincipalUnitGroup.residueRootsOfUnityGroup F ∧ + higherPrincipalUnitGroup.residueUnitHom F u = y := by + classical + let n := Nat.card F.residueField - 1 + let f : Polynomial F.valuationSubring := Polynomial.X ^ n - 1 + have hnpos : 0 < n := by + let := Fintype.ofFinite F.residueField + have hunitpos : 0 < Fintype.card F.residueFieldˣ := + Fintype.card_pos_iff.mpr ⟨1⟩ + simpa [n, Nat.card_eq_fintype_card, Fintype.card_units] using hunitpos + have hf : f.Monic := by + dsimp [f, n] + simpa using + (Polynomial.monic_X_pow_sub_C + (1 : F.valuationSubring) (ne_of_gt hnpos)) + have hroot : (f.map F.residueMap).eval (y : F.residueField) = 0 := by + let := Fintype.ofFinite F.residueField + have hpow : + (y : F.residueField) ^ (Fintype.card F.residueField - 1) = 1 := + FiniteField.pow_card_sub_one_eq_one + (K := F.residueField) (y : F.residueField) y.ne_zero + simp [f, n, Nat.card_eq_fintype_card, Polynomial.eval_sub, hpow] + have hsimple : + ((f.map F.residueMap).derivative).eval + (y : F.residueField) ≠ 0 := by + simpa [f, n] using + (higherPrincipalUnitGroup.residueRootPolynomial_derivative_eval_ne_zero + (F := F) y) + rcases + F.toHenselianDVF.exists_monic_linear_factor_lift_of_reduced_simple_root + f hf (y : F.residueField) hroot hsimple with + ⟨a, q, ha_root, ha_residue, _hlinear, _hq, _hfactor⟩ + have hunit : IsUnit a := + (F.residue_ne_zero_iff_isUnit a).1 + (by + change F.toHenselianDVF.residueMap a ≠ 0 + rw [ha_residue] + exact y.ne_zero) + rcases hunit with ⟨u, hu⟩ + have ha_pow : a ^ n = 1 := by + have ha_eval : f.eval a = 0 := Polynomial.IsRoot.def.mp ha_root + have hsub : a ^ n - 1 = 0 := by + simpa [f, n, Polynomial.eval_sub] using ha_eval + exact sub_eq_zero.mp hsub + refine ⟨u, ?_, ?_⟩ + · rw [mem_rootsOfUnity] + apply Units.ext + change + (((u : F.toHenselianDVF.valuationSubring) : F.valuationSubring) ^ + (Nat.card F.residueField - 1)) = + (1 : F.valuationSubring) + simpa [n, hu] using ha_pow + · apply Units.ext + rw [higherPrincipalUnitGroup.residueUnitHom_apply] + rw [hu] + exact ha_residue + +/-- The residue map restricted to the Hensel-lifted `(q - 1)`-roots of unity. -/ +def residueRootsOfUnityResidueHom [Finite F.residueField] : + higherPrincipalUnitGroup.residueRootsOfUnityGroup F →* F.residueFieldˣ := + (higherPrincipalUnitGroup.residueUnitHom F).comp + (higherPrincipalUnitGroup.residueRootsOfUnityGroup F).subtype + +/-- +The specified map is surjective: `Function.Surjective +(higherPrincipalUnitGroup.residueRootsOfUnityResidueHom F)`. +-/ +theorem residueRootsOfUnityResidueHom_surjective + [Finite F.residueField] : + Function.Surjective + (higherPrincipalUnitGroup.residueRootsOfUnityResidueHom F) := by + intro y + rcases higherPrincipalUnitGroup.exists_residueRootsOfUnity_lift + (F := F) y with + ⟨u, hu, hres⟩ + exact ⟨⟨u, hu⟩, hres⟩ + +/-- A unit satisfying the Teichmuller equation is a root of +`X^(q - 1) - 1` over the valuation ring. -/ +theorem residueRootPolynomial_isRoot_of_mem + [Finite F.residueField] {u : F.valuationSubringˣ} + (hu : u ∈ higherPrincipalUnitGroup.residueRootsOfUnityGroup F) : + (Polynomial.X ^ (Nat.card F.residueField - 1) - 1 : + Polynomial F.valuationSubring).IsRoot + (u : F.valuationSubring) := by + rw [mem_rootsOfUnity] at hu + have hpow : + (u : F.valuationSubring) ^ (Nat.card F.residueField - 1) = 1 := by + have hunit := + congrArg (fun z : F.valuationSubringˣ => (z : F.valuationSubring)) hu + simpa using hunit + exact Polynomial.IsRoot.def.mpr (by + simp [Polynomial.eval_sub, hpow]) + +/-- The derivative of `X^(q - 1) - 1` at a valuation-ring unit is a unit. +This is the simple-root input for uniqueness of Teichmuller representatives. -/ +theorem residueRootPolynomial_derivative_eval_isUnit + [Finite F.residueField] (u : F.valuationSubringˣ) : + IsUnit + (((Polynomial.X ^ (Nat.card F.residueField - 1) - 1 : + Polynomial F.valuationSubring).derivative).eval + (u : F.valuationSubring)) := by + let n := Nat.card F.residueField - 1 + let f : Polynomial F.valuationSubring := Polynomial.X ^ n - 1 + have hres : + F.residueMap (f.derivative.eval (u : F.valuationSubring)) = + ((f.map F.residueMap).derivative).eval + (F.residueMap (u : F.valuationSubring)) := by + calc + F.residueMap (f.derivative.eval (u : F.valuationSubring)) = + (f.derivative.map F.residueMap).eval + (F.residueMap (u : F.valuationSubring)) := by + exact (Polynomial.eval_map_apply (f := F.residueMap) + (p := f.derivative) (u : F.valuationSubring)).symm + _ = ((f.map F.residueMap).derivative).eval + (F.residueMap (u : F.valuationSubring)) := by + rw [Polynomial.derivative_map] + have hsimple : + ((f.map F.residueMap).derivative).eval + (F.residueMap (u : F.valuationSubring)) ≠ 0 := by + simpa [f, n, higherPrincipalUnitGroup.residueUnitHom] using + higherPrincipalUnitGroup.residueRootPolynomial_derivative_eval_ne_zero + (F := F) (higherPrincipalUnitGroup.residueUnitHom F u) + exact + (F.residue_ne_zero_iff_isUnit + (f.derivative.eval (u : F.valuationSubring))).1 + (by + rw [hres] + exact hsimple) + +/-- +The specified map is injective: `Function.Injective +(higherPrincipalUnitGroup.residueRootsOfUnityResidueHom F)`. +-/ +theorem residueRootsOfUnityResidueHom_injective + [Finite F.residueField] : + Function.Injective + (higherPrincipalUnitGroup.residueRootsOfUnityResidueHom F) := by + intro x y hxy + let n := Nat.card F.residueField - 1 + let f : Polynomial F.valuationSubring := Polynomial.X ^ n - 1 + have hxroot : + f.IsRoot ((x : F.valuationSubringˣ) : F.valuationSubring) := by + dsimp [f, n] + exact + higherPrincipalUnitGroup.residueRootPolynomial_isRoot_of_mem + (F := F) x.property + have hyroot : + f.IsRoot ((y : F.valuationSubringˣ) : F.valuationSubring) := by + dsimp [f, n] + exact + higherPrincipalUnitGroup.residueRootPolynomial_isRoot_of_mem + (F := F) y.property + have hres : + F.residueMap ((y : F.valuationSubringˣ) : F.valuationSubring) = + F.residueMap ((x : F.valuationSubringˣ) : F.valuationSubring) := by + have hval := + congrArg (fun z : F.residueFieldˣ => (z : F.residueField)) hxy + simpa [higherPrincipalUnitGroup.residueRootsOfUnityResidueHom, + higherPrincipalUnitGroup.residueUnitHom] using hval.symm + have hderiv : + IsUnit + (f.derivative.eval + ((x : F.valuationSubringˣ) : F.valuationSubring)) := by + dsimp [f, n] + exact + higherPrincipalUnitGroup.residueRootPolynomial_derivative_eval_isUnit + (F := F) (x : F.valuationSubringˣ) + have hring : + ((y : F.valuationSubringˣ) : F.valuationSubring) = + ((x : F.valuationSubringˣ) : F.valuationSubring) := + F.toHenselianDVF.eq_of_isRoot_of_isRoot_of_residue_eq_of_derivative_isUnit + (f := f) hxroot hyroot hres hderiv + apply Subtype.ext + apply Units.ext + exact hring.symm + +/-- +The specified map is bijective: `Function.Bijective +(higherPrincipalUnitGroup.residueRootsOfUnityResidueHom F)`. +-/ +theorem residueRootsOfUnityResidueHom_bijective + [Finite F.residueField] : + Function.Bijective + (higherPrincipalUnitGroup.residueRootsOfUnityResidueHom F) := + ⟨higherPrincipalUnitGroup.residueRootsOfUnityResidueHom_injective F, + higherPrincipalUnitGroup.residueRootsOfUnityResidueHom_surjective F⟩ + +/-- Hensel's splitting of the residue-unit map on the `(q - 1)`-roots of +unity: the Teichmuller representatives in `O^*` are exactly `κ^*`. -/ +noncomputable def residueRootsOfUnityEquivResidueFieldUnits + [Finite F.residueField] : + higherPrincipalUnitGroup.residueRootsOfUnityGroup F ≃* + F.residueFieldˣ := + MulEquiv.ofBijective + (higherPrincipalUnitGroup.residueRootsOfUnityResidueHom F) + (higherPrincipalUnitGroup.residueRootsOfUnityResidueHom_bijective F) + +/-- +The defining evaluation formula for `residueRootsOfUnityEquivResidueFieldUnits` is +`higherPrincipalUnitGroup.residueRootsOfUnityEquivResidueFieldUnits F u = +higherPrincipalUnitGroup.residueUnitHom F u`. +-/ +@[simp] theorem residueRootsOfUnityEquivResidueFieldUnits_apply + [Finite F.residueField] + (u : higherPrincipalUnitGroup.residueRootsOfUnityGroup F) : + higherPrincipalUnitGroup.residueRootsOfUnityEquivResidueFieldUnits F u = + higherPrincipalUnitGroup.residueUnitHom F u := + rfl +end higherPrincipalUnitGroup + +end CompleteDVF +end DiscreteValuationField + +end + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerDecomposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerDecomposition.lean new file mode 100644 index 0000000000..8939883c32 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerDecomposition.lean @@ -0,0 +1,585 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerLift +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Basic + +/-! # Teichmuller Decomposition -/ + +@[expose] public section +namespace LocalFieldTheory + +open ValuationTheory +open ValuationTheory.DiscreteValuationField.ResidueField + +/-! +# Teichmuller and principal-unit decompositions + +Decomposes valuation-ring units and field units into residue roots, first principal units, +and a uniformizer factor. +-/ + +noncomputable +section + +open scoped BigOperators + +universe u v + +namespace DiscreteValuationField +namespace CompleteDVF + +variable {K : Type u} [Field K] + +namespace higherPrincipalUnitGroup + +variable (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + +/-- Multiplication of a Teichmuller representative and a first principal unit, +as a homomorphism into the full valuation-ring unit group. -/ +def residueRootsTimesPrincipalUnitMulHom + [Finite F.residueField] : + higherPrincipalUnitGroup.residueRootsOfUnityGroup F × + higherPrincipalUnitGroup F 1 →* + F.valuationSubringˣ where + toFun z := (z.1 : F.valuationSubringˣ) * (z.2 : F.valuationSubringˣ) + map_one' := by + simp + map_mul' := by + intro x y + simp [mul_left_comm, mul_comm] + +/-- +The specified map is surjective: `Function.Surjective +(higherPrincipalUnitGroup.residueRootsTimesPrincipalUnitMulHom F)`. +-/ +theorem residueRootsTimesPrincipalUnitMulHom_surjective + [Finite F.residueField] : + Function.Surjective + (higherPrincipalUnitGroup.residueRootsTimesPrincipalUnitMulHom F) := by + intro u + rcases higherPrincipalUnitGroup.residueRootsOfUnityResidueHom_surjective + (F := F) (higherPrincipalUnitGroup.residueUnitHom F u) with + ⟨zeta, hzeta⟩ + have hzeta' : + higherPrincipalUnitGroup.residueUnitHom F + (zeta : F.valuationSubringˣ) = + higherPrincipalUnitGroup.residueUnitHom F u := by + simpa [higherPrincipalUnitGroup.residueRootsOfUnityResidueHom] using hzeta + let p : F.valuationSubringˣ := (zeta : F.valuationSubringˣ)⁻¹ * u + have hp : p ∈ higherPrincipalUnitGroup F 1 := by + rw [← higherPrincipalUnitGroup.residueUnitHom_eq_one_iff F p] + dsimp [p] + rw [map_mul, map_inv, hzeta'] + simp + refine ⟨(zeta, ⟨p, hp⟩), ?_⟩ + change (zeta : F.valuationSubringˣ) * p = u + dsimp [p] + simp + +/-- +The specified map is injective: `Function.Injective +(higherPrincipalUnitGroup.residueRootsTimesPrincipalUnitMulHom F)`. +-/ +theorem residueRootsTimesPrincipalUnitMulHom_injective + [Finite F.residueField] : + Function.Injective + (higherPrincipalUnitGroup.residueRootsTimesPrincipalUnitMulHom F) := by + intro x y hxy + have hxprincipal : + higherPrincipalUnitGroup.residueUnitHom F + (x.2 : F.valuationSubringˣ) = 1 := + (higherPrincipalUnitGroup.residueUnitHom_eq_one_iff + F (x.2 : F.valuationSubringˣ)).2 x.2.property + have hyprincipal : + higherPrincipalUnitGroup.residueUnitHom F + (y.2 : F.valuationSubringˣ) = 1 := + (higherPrincipalUnitGroup.residueUnitHom_eq_one_iff + F (y.2 : F.valuationSubringˣ)).2 y.2.property + have hmul : + (x.1 : F.valuationSubringˣ) * (x.2 : F.valuationSubringˣ) = + (y.1 : F.valuationSubringˣ) * (y.2 : F.valuationSubringˣ) := by + simpa [higherPrincipalUnitGroup.residueRootsTimesPrincipalUnitMulHom] + using hxy + have hresroot : + higherPrincipalUnitGroup.residueRootsOfUnityResidueHom F x.1 = + higherPrincipalUnitGroup.residueRootsOfUnityResidueHom F y.1 := by + have hres := + congrArg (higherPrincipalUnitGroup.residueUnitHom F) hmul + simpa [higherPrincipalUnitGroup.residueRootsOfUnityResidueHom, + map_mul, hxprincipal, hyprincipal] using hres + have hroot : + x.1 = y.1 := + higherPrincipalUnitGroup.residueRootsOfUnityResidueHom_injective + (F := F) hresroot + apply Prod.ext + · exact hroot + · apply Subtype.ext + calc + (x.2 : F.valuationSubringˣ) = + (x.1 : F.valuationSubringˣ)⁻¹ * + ((x.1 : F.valuationSubringˣ) * + (x.2 : F.valuationSubringˣ)) := by + simp + _ = (x.1 : F.valuationSubringˣ)⁻¹ * + ((y.1 : F.valuationSubringˣ) * + (y.2 : F.valuationSubringˣ)) := by + rw [hmul] + _ = (y.1 : F.valuationSubringˣ)⁻¹ * + ((y.1 : F.valuationSubringˣ) * + (y.2 : F.valuationSubringˣ)) := by + rw [hroot] + _ = (y.2 : F.valuationSubringˣ) := by + simp + +/-- +The specified map is bijective: `Function.Bijective +(higherPrincipalUnitGroup.residueRootsTimesPrincipalUnitMulHom F)`. +-/ +theorem residueRootsTimesPrincipalUnitMulHom_bijective + [Finite F.residueField] : + Function.Bijective + (higherPrincipalUnitGroup.residueRootsTimesPrincipalUnitMulHom F) := + ⟨higherPrincipalUnitGroup.residueRootsTimesPrincipalUnitMulHom_injective F, + higherPrincipalUnitGroup.residueRootsTimesPrincipalUnitMulHom_surjective F⟩ + +/-- Unit-level form of the multiplicative unit decomposition: +`O^*` is the product of the lifted `(q - 1)`-roots of unity and `U^1`. -/ +noncomputable def valuationSubringUnitsEquivRootsTimesPrincipalUnits + [Finite F.residueField] : + higherPrincipalUnitGroup.residueRootsOfUnityGroup F × + higherPrincipalUnitGroup F 1 ≃* + F.valuationSubringˣ := + MulEquiv.ofBijective + (higherPrincipalUnitGroup.residueRootsTimesPrincipalUnitMulHom F) + (higherPrincipalUnitGroup.residueRootsTimesPrincipalUnitMulHom_bijective F) + +/-- +The defining evaluation formula for `valuationSubringUnitsEquivRootsTimesPrincipalUnits` is +`higherPrincipalUnitGroup.valuationSubringUnitsEquivRootsTimesPrincipalUnits F z = (z.1 : +F.valuationSubringˣ) * (z.2 : F.valuationSubringˣ)`. +-/ +@[simp] theorem valuationSubringUnitsEquivRootsTimesPrincipalUnits_apply + [Finite F.residueField] + (z : + higherPrincipalUnitGroup.residueRootsOfUnityGroup F × + higherPrincipalUnitGroup F 1) : + higherPrincipalUnitGroup.valuationSubringUnitsEquivRootsTimesPrincipalUnits + F z = + (z.1 : F.valuationSubringˣ) * (z.2 : F.valuationSubringˣ) := + rfl + +/-- The natural inclusion of valuation-ring units into field units, kept local +to the principal-unit API to state the field-unit form of the multiplicative unit decomposition. -/ +def valuationSubringUnitFieldUnitHom : + F.valuationSubringˣ →* Kˣ := + Units.map F.valuation.valuationSubring.subtype.toMonoidHom + +/-- +The defining evaluation formula for `coe_valuationSubringUnitFieldUnitHom` is +`((higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F u : Kˣ) : K) = (u : +F.valuationSubring)`. +-/ +@[simp] theorem coe_valuationSubringUnitFieldUnitHom_apply + (u : F.valuationSubringˣ) : + ((higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F u : Kˣ) : + K) = + (u : F.valuationSubring) := + rfl + +/-- +The specified map is injective: `Function.Injective +(higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F)`. +-/ +theorem valuationSubringUnitFieldUnitHom_injective : + Function.Injective + (higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F) := + by + change Function.Injective + (Units.map F.valuation.valuationSubring.subtype.toMonoidHom) + exact + Units.map_injective + F.valuation.valuationSubring.subtype_injective + +/-- If the zero-valuation subgroup of a field-unit valuation is the usual +unit group of the valuation subring, then it is exactly the image of +valuation-ring units under `valuationSubringUnitFieldUnitHom`. -/ +theorem mem_zeroSubgroup_iff_exists_valuationSubringUnitFieldUnitHom_eq + (V : MultiplicativeIntegerValuation Kˣ) + (hzero : V.zeroSubgroup = F.valuation.valuationSubring.unitGroup) + (y : Kˣ) : + y ∈ V.zeroSubgroup ↔ + ∃ u : F.valuationSubringˣ, + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F u = y := by + rw [hzero] + constructor + · intro hy + let a : F.valuation.valuationSubring.unitGroup := ⟨y, hy⟩ + refine ⟨F.valuation.valuationSubring.unitGroupMulEquiv a, ?_⟩ + apply Units.ext + simp [higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom, a] + · rintro ⟨u, hu⟩ + rw [← hu] + simp [higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom] + +/-- Field-unit representative form of the multiplicative unit decomposition. + +Given an existing unit-uniformizer decomposition for a normalized +integer-valued valuation whose zero subgroup is exactly the image of `O^*`, +every field unit is a product of a Teichmuller root, a first principal unit, +and a power of the chosen uniformizer. -/ +theorem exists_roots_principalUnit_uniformizer_zpow + [Finite F.residueField] + (V : MultiplicativeIntegerValuation Kˣ) + (hzero : + ∀ y : Kˣ, y ∈ V.zeroSubgroup ↔ + ∃ u : F.valuationSubringˣ, + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F u = y) + {ϖ : Kˣ} (hϖ : V.IsUniformizer ϖ) (x : Kˣ) : + ∃ ζ : higherPrincipalUnitGroup.residueRootsOfUnityGroup F, + ∃ p : higherPrincipalUnitGroup F 1, + ∃ n : ℤ, + x = + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (ζ : F.valuationSubringˣ) * + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (p : F.valuationSubringˣ) * + ϖ ^ n := by + rcases V.exists_zeroSubgroup_mul_uniformizer_zpow hϖ x with + ⟨u, hu, n, hx⟩ + rcases (hzero u).1 hu with ⟨a, ha⟩ + rcases + higherPrincipalUnitGroup.residueRootsTimesPrincipalUnitMulHom_surjective + (F := F) a with + ⟨zp, hzp⟩ + have hunit : + (zp.1 : F.valuationSubringˣ) * (zp.2 : F.valuationSubringˣ) = a := by + simpa [higherPrincipalUnitGroup.residueRootsTimesPrincipalUnitMulHom] + using hzp + refine ⟨zp.1, zp.2, n, ?_⟩ + calc + x = u * ϖ ^ n := hx + _ = + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F a * + ϖ ^ n := by + rw [ha] + _ = + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + ((zp.1 : F.valuationSubringˣ) * + (zp.2 : F.valuationSubringˣ)) * + ϖ ^ n := by + rw [hunit] + _ = + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (zp.1 : F.valuationSubringˣ) * + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (zp.2 : F.valuationSubringˣ) * + ϖ ^ n := by + rw [map_mul] + +/-- Field-unit form with the standard subgroup equality hypothesis +`V.zeroSubgroup = O^*`. -/ +theorem exists_roots_principalUnit_uniformizer_zpow_of_zeroSubgroup_eq_unitGroup + [Finite F.residueField] + (V : MultiplicativeIntegerValuation Kˣ) + (hzero : V.zeroSubgroup = F.valuation.valuationSubring.unitGroup) + {ϖ : Kˣ} (hϖ : V.IsUniformizer ϖ) (x : Kˣ) : + ∃ ζ : higherPrincipalUnitGroup.residueRootsOfUnityGroup F, + ∃ p : higherPrincipalUnitGroup F 1, + ∃ n : ℤ, + x = + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (ζ : F.valuationSubringˣ) * + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (p : F.valuationSubringˣ) * + ϖ ^ n := + higherPrincipalUnitGroup.exists_roots_principalUnit_uniformizer_zpow + (F := F) V + (fun y => + higherPrincipalUnitGroup.mem_zeroSubgroup_iff_exists_valuationSubringUnitFieldUnitHom_eq + (F := F) V hzero y) + hϖ x + +/-- Uniqueness of the field-unit form of the multiplicative unit decomposition: +with a fixed uniformizer, the Teichmuller representative, the first principal +unit, and the exponent are all uniquely determined. -/ +theorem roots_principalUnit_uniformizer_zpow_eq_iff + [Finite F.residueField] + (V : MultiplicativeIntegerValuation Kˣ) + (hzero : + ∀ y : Kˣ, y ∈ V.zeroSubgroup ↔ + ∃ u : F.valuationSubringˣ, + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F u = y) + {ϖ : Kˣ} (hϖ : V.IsUniformizer ϖ) + (ζ η : higherPrincipalUnitGroup.residueRootsOfUnityGroup F) + (p q : higherPrincipalUnitGroup F 1) (m n : ℤ) : + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (ζ : F.valuationSubringˣ) * + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (p : F.valuationSubringˣ) * + ϖ ^ m = + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (η : F.valuationSubringˣ) * + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (q : F.valuationSubringˣ) * + ϖ ^ n ↔ + ζ = η ∧ p = q ∧ m = n := by + have hleft : + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (ζ : F.valuationSubringˣ) * + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (p : F.valuationSubringˣ) ∈ + V.zeroSubgroup := + (hzero _).2 + ⟨(ζ : F.valuationSubringˣ) * (p : F.valuationSubringˣ), by + rw [map_mul]⟩ + have hright : + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (η : F.valuationSubringˣ) * + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (q : F.valuationSubringˣ) ∈ + V.zeroSubgroup := + (hzero _).2 + ⟨(η : F.valuationSubringˣ) * (q : F.valuationSubringˣ), by + rw [map_mul]⟩ + constructor + · intro h + have hnormal := + (V.unit_uniformizer_normal_form_eq_iff hϖ hleft hright).1 h + rcases hnormal with ⟨hunit, hmn⟩ + have hvaluationUnit : + (ζ : F.valuationSubringˣ) * (p : F.valuationSubringˣ) = + (η : F.valuationSubringˣ) * (q : F.valuationSubringˣ) := + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom_injective + (F := F) + (by + simpa [map_mul] using hunit) + have hpair : + (ζ, p) = (η, q) := + higherPrincipalUnitGroup.residueRootsTimesPrincipalUnitMulHom_injective + (F := F) + (by + simpa [higherPrincipalUnitGroup.residueRootsTimesPrincipalUnitMulHom] + using hvaluationUnit) + cases hpair + exact ⟨rfl, rfl, hmn⟩ + · rintro ⟨rfl, rfl, rfl⟩ + rfl + +/-- Uniqueness form under the standard subgroup equality hypothesis +`V.zeroSubgroup = O^*`. -/ +theorem roots_principalUnit_uniformizer_zpow_eq_iff_of_zeroSubgroup_eq_unitGroup + [Finite F.residueField] + (V : MultiplicativeIntegerValuation Kˣ) + (hzero : V.zeroSubgroup = F.valuation.valuationSubring.unitGroup) + {ϖ : Kˣ} (hϖ : V.IsUniformizer ϖ) + (ζ η : higherPrincipalUnitGroup.residueRootsOfUnityGroup F) + (p q : higherPrincipalUnitGroup F 1) (m n : ℤ) : + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (ζ : F.valuationSubringˣ) * + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (p : F.valuationSubringˣ) * + ϖ ^ m = + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (η : F.valuationSubringˣ) * + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (q : F.valuationSubringˣ) * + ϖ ^ n ↔ + ζ = η ∧ p = q ∧ m = n := + higherPrincipalUnitGroup.roots_principalUnit_uniformizer_zpow_eq_iff + (F := F) V + (fun y => + higherPrincipalUnitGroup.mem_zeroSubgroup_iff_exists_valuationSubringUnitFieldUnitHom_eq + (F := F) V hzero y) + hϖ ζ η p q m n + +/-- The three factors in the multiplicative field-unit decomposition: Teichmuller roots, +first principal units, and an integral power of a fixed uniformizer. -/ +abbrev fieldUnitDecompositionFactors [Finite F.residueField] : + Type u := + (higherPrincipalUnitGroup.residueRootsOfUnityGroup F × + higherPrincipalUnitGroup F 1) × Multiplicative ℤ + +/-- +Multiplication map from the three the multiplicative unit decomposition factors to field units. +-/ +noncomputable def rootsPrincipalUnitUniformizerMulHom + [Finite F.residueField] (ϖ : Kˣ) : + higherPrincipalUnitGroup.fieldUnitDecompositionFactors F →* Kˣ where + toFun z := + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (z.1.1 : F.valuationSubringˣ) * + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (z.1.2 : F.valuationSubringˣ) * + ϖ ^ Multiplicative.toAdd z.2 + map_one' := by + simp + map_mul' := by + intro x y + simp [higherPrincipalUnitGroup.fieldUnitDecompositionFactors, + mul_assoc, mul_left_comm, mul_comm, zpow_add] + +/-- +The defining evaluation formula for `rootsPrincipalUnitUniformizerMulHom` is +`higherPrincipalUnitGroup.rootsPrincipalUnitUniformizerMulHom F ϖ z = +higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F (z.1.1 : F.valuationSubringˣ) * +higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F (z.1.2 : F.valuationSubringˣ) * ϖ ^ +Multiplicative.toAdd z.2`. +-/ +@[simp] theorem rootsPrincipalUnitUniformizerMulHom_apply + [Finite F.residueField] (ϖ : Kˣ) + (z : higherPrincipalUnitGroup.fieldUnitDecompositionFactors F) : + higherPrincipalUnitGroup.rootsPrincipalUnitUniformizerMulHom F ϖ z = + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (z.1.1 : F.valuationSubringˣ) * + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (z.1.2 : F.valuationSubringˣ) * + ϖ ^ Multiplicative.toAdd z.2 := + rfl + +/-- +The specified map is surjective: `Function.Surjective +(higherPrincipalUnitGroup.rootsPrincipalUnitUniformizerMulHom F ϖ)`. +-/ +theorem rootsPrincipalUnitUniformizerMulHom_surjective + [Finite F.residueField] + (V : MultiplicativeIntegerValuation Kˣ) + (hzero : + ∀ y : Kˣ, y ∈ V.zeroSubgroup ↔ + ∃ u : F.valuationSubringˣ, + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F u = y) + {ϖ : Kˣ} (hϖ : V.IsUniformizer ϖ) : + Function.Surjective + (higherPrincipalUnitGroup.rootsPrincipalUnitUniformizerMulHom F ϖ) := by + intro x + rcases + higherPrincipalUnitGroup.exists_roots_principalUnit_uniformizer_zpow + (F := F) V hzero hϖ x with + ⟨ζ, p, n, hx⟩ + refine ⟨((ζ, p), Multiplicative.ofAdd n), ?_⟩ + exact hx.symm + +/-- +The specified map is injective: `Function.Injective +(higherPrincipalUnitGroup.rootsPrincipalUnitUniformizerMulHom F ϖ)`. +-/ +theorem rootsPrincipalUnitUniformizerMulHom_injective + [Finite F.residueField] + (V : MultiplicativeIntegerValuation Kˣ) + (hzero : + ∀ y : Kˣ, y ∈ V.zeroSubgroup ↔ + ∃ u : F.valuationSubringˣ, + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F u = y) + {ϖ : Kˣ} (hϖ : V.IsUniformizer ϖ) : + Function.Injective + (higherPrincipalUnitGroup.rootsPrincipalUnitUniformizerMulHom F ϖ) := by + rintro ⟨⟨ζ, p⟩, m⟩ ⟨⟨η, q⟩, n⟩ h + have hmul : + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (ζ : F.valuationSubringˣ) * + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (p : F.valuationSubringˣ) * + ϖ ^ Multiplicative.toAdd m = + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (η : F.valuationSubringˣ) * + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (q : F.valuationSubringˣ) * + ϖ ^ Multiplicative.toAdd n := by + exact h + have hdecomp := + (higherPrincipalUnitGroup.roots_principalUnit_uniformizer_zpow_eq_iff + (F := F) V hzero hϖ ζ η p q + (Multiplicative.toAdd m) (Multiplicative.toAdd n)).1 hmul + rcases hdecomp with ⟨hζη, hpq, hmn⟩ + have hmn' : m = n := + Multiplicative.toAdd.injective hmn + simp [hζη, hpq, hmn'] + +/-- +The specified map is bijective: `Function.Bijective +(higherPrincipalUnitGroup.rootsPrincipalUnitUniformizerMulHom F ϖ)`. +-/ +theorem rootsPrincipalUnitUniformizerMulHom_bijective + [Finite F.residueField] + (V : MultiplicativeIntegerValuation Kˣ) + (hzero : + ∀ y : Kˣ, y ∈ V.zeroSubgroup ↔ + ∃ u : F.valuationSubringˣ, + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F u = y) + {ϖ : Kˣ} (hϖ : V.IsUniformizer ϖ) : + Function.Bijective + (higherPrincipalUnitGroup.rootsPrincipalUnitUniformizerMulHom F ϖ) := + ⟨higherPrincipalUnitGroup.rootsPrincipalUnitUniformizerMulHom_injective + (F := F) V hzero hϖ, + higherPrincipalUnitGroup.rootsPrincipalUnitUniformizerMulHom_surjective + (F := F) V hzero hϖ⟩ + +/-- Group-isomorphism form of the multiplicative unit decomposition: after fixing +a uniformizer, `Kˣ` is the product of the lifted residue roots of unity, the +first principal units, and the infinite cyclic uniformizer factor. -/ +noncomputable def fieldUnitsEquivRootsPrincipalUnitsUniformizer + [Finite F.residueField] + (V : MultiplicativeIntegerValuation Kˣ) + (hzero : + ∀ y : Kˣ, y ∈ V.zeroSubgroup ↔ + ∃ u : F.valuationSubringˣ, + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F u = y) + {ϖ : Kˣ} (hϖ : V.IsUniformizer ϖ) : + higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ := + MulEquiv.ofBijective + (higherPrincipalUnitGroup.rootsPrincipalUnitUniformizerMulHom F ϖ) + (higherPrincipalUnitGroup.rootsPrincipalUnitUniformizerMulHom_bijective + (F := F) V hzero hϖ) + +/-- +The defining evaluation formula for `fieldUnitsEquivRootsPrincipalUnitsUniformizer` is +`higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer (F := F) V hzero hϖ z = +higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F (z.1.1 : F.valuationSubringˣ) * +higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F (z.1.2 : F.valuationSubringˣ) * ϖ ^ +Multiplicative.toAdd z.2`. +-/ +@[simp] theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_apply + [Finite F.residueField] + (V : MultiplicativeIntegerValuation Kˣ) + (hzero : + ∀ y : Kˣ, y ∈ V.zeroSubgroup ↔ + ∃ u : F.valuationSubringˣ, + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F u = y) + {ϖ : Kˣ} (hϖ : V.IsUniformizer ϖ) + (z : higherPrincipalUnitGroup.fieldUnitDecompositionFactors F) : + higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer + (F := F) V hzero hϖ z = + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (z.1.1 : F.valuationSubringˣ) * + higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (z.1.2 : F.valuationSubringˣ) * + ϖ ^ Multiplicative.toAdd z.2 := + rfl + +/-- Group-isomorphism form under the standard subgroup equality hypothesis +`V.zeroSubgroup = O^*`. -/ +noncomputable def fieldUnitsEquivRootsPrincipalUnitsUniformizerOfZeroSubgroupEqUnitGroup + [Finite F.residueField] + (V : MultiplicativeIntegerValuation Kˣ) + (hzero : V.zeroSubgroup = F.valuation.valuationSubring.unitGroup) + {ϖ : Kˣ} (hϖ : V.IsUniformizer ϖ) : + higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ := + higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer + (F := F) V + (fun y => + higherPrincipalUnitGroup.mem_zeroSubgroup_iff_exists_valuationSubringUnitFieldUnitHom_eq + (F := F) V hzero y) + hϖ +end higherPrincipalUnitGroup + +end CompleteDVF +end DiscreteValuationField + +end + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerLift.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerLift.lean new file mode 100644 index 0000000000..8d0838611b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerLift.lean @@ -0,0 +1,365 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueRoots +public import Mathlib.Algebra.CharP.Lemmas + +/-! # Teichmuller Lift -/ + +@[expose] public section +namespace LocalFieldTheory + +open ValuationTheory +open ValuationTheory.DiscreteValuationField.ResidueField + +/-! +# Teichmuller lifts + +Constructs multiplicative Teichmuller representatives, and in equal characteristic the +coefficient-field section of the residue map. +-/ + +noncomputable +section + +open scoped BigOperators + +universe u v + +namespace DiscreteValuationField +namespace CompleteDVF + +variable {K : Type u} [Field K] + +namespace higherPrincipalUnitGroup + +variable (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + +/-- The Teichmuller representative lift from the finite residue field to the +valuation ring: `0` lifts to `0`, and nonzero residue classes lift through the +root-of-unity splitting of `κˣ`. -/ +noncomputable def residueTeichmullerLift [Finite F.residueField] : + F.residueField → F.valuationSubring := + fun y => + letI := Classical.decEq F.residueField + if hy : y = 0 then + 0 + else + (((higherPrincipalUnitGroup.residueRootsOfUnityEquivResidueFieldUnits F).symm + (Units.mk0 y hy) : + higherPrincipalUnitGroup.residueRootsOfUnityGroup F) : + F.valuationSubringˣ) + +/-- Establishes the identity `higherPrincipalUnitGroup.residueTeichmullerLift F 0 = 0`. -/ +@[simp] theorem residueTeichmullerLift_zero [Finite F.residueField] : + higherPrincipalUnitGroup.residueTeichmullerLift F 0 = 0 := by + simp [higherPrincipalUnitGroup.residueTeichmullerLift] + +/-- Establishes the identity `higherPrincipalUnitGroup.residueTeichmullerLift F 1 = 1`. -/ +@[simp] theorem residueTeichmullerLift_one [Finite F.residueField] : + higherPrincipalUnitGroup.residueTeichmullerLift F 1 = 1 := by + let e := + higherPrincipalUnitGroup.residueRootsOfUnityEquivResidueFieldUnits F + have hone : (1 : F.residueField) ≠ 0 := one_ne_zero + have hroot : + e.symm (Units.mk0 (1 : F.residueField) hone) = 1 := by + apply e.injective + simp [e] + have hunit : + ((e.symm (Units.mk0 (1 : F.residueField) hone) : + higherPrincipalUnitGroup.residueRootsOfUnityGroup F) : + F.valuationSubringˣ) = 1 := by + simp + simp [higherPrincipalUnitGroup.residueTeichmullerLift, hone] + +/-- The Teichmuller lift reduces to the residue class it lifts. -/ +theorem residueMap_residueTeichmullerLift [Finite F.residueField] + (y : F.residueField) : + F.residueMap (higherPrincipalUnitGroup.residueTeichmullerLift F y) = y := by + classical + by_cases hy : y = 0 + · simp [higherPrincipalUnitGroup.residueTeichmullerLift, hy] + · let e := + higherPrincipalUnitGroup.residueRootsOfUnityEquivResidueFieldUnits F + have hroot : + higherPrincipalUnitGroup.residueUnitHom F + (((e.symm (Units.mk0 y hy) : + higherPrincipalUnitGroup.residueRootsOfUnityGroup F) : + F.valuationSubringˣ)) = + Units.mk0 y hy := by + change e (e.symm (Units.mk0 y hy)) = Units.mk0 y hy + simp + have hval := + congrArg (fun u : F.residueFieldˣ => (u : F.residueField)) hroot + simpa [higherPrincipalUnitGroup.residueTeichmullerLift, hy, e, + higherPrincipalUnitGroup.residueUnitHom] using hval + +/-- The Teichmuller lift is multiplicative. -/ +theorem residueTeichmullerLift_mul [Finite F.residueField] + (x y : F.residueField) : + higherPrincipalUnitGroup.residueTeichmullerLift F (x * y) = + higherPrincipalUnitGroup.residueTeichmullerLift F x * + higherPrincipalUnitGroup.residueTeichmullerLift F y := by + classical + by_cases hx : x = 0 + · simp [higherPrincipalUnitGroup.residueTeichmullerLift, hx] + by_cases hy : y = 0 + · simp [higherPrincipalUnitGroup.residueTeichmullerLift, hy] + have hxy : x * y ≠ 0 := mul_ne_zero hx hy + let e := + higherPrincipalUnitGroup.residueRootsOfUnityEquivResidueFieldUnits F + have hroot : + e.symm (Units.mk0 (x * y) hxy) = + e.symm (Units.mk0 x hx) * e.symm (Units.mk0 y hy) := by + apply e.injective + apply Units.ext + simp [e] + have hunit : + ((e.symm (Units.mk0 (x * y) hxy) : + higherPrincipalUnitGroup.residueRootsOfUnityGroup F) : + F.valuationSubringˣ) = + ((e.symm (Units.mk0 x hx) : + higherPrincipalUnitGroup.residueRootsOfUnityGroup F) : + F.valuationSubringˣ) * + ((e.symm (Units.mk0 y hy) : + higherPrincipalUnitGroup.residueRootsOfUnityGroup F) : + F.valuationSubringˣ) := by + simp + simp [higherPrincipalUnitGroup.residueTeichmullerLift, hx, hy, hxy] + +/-- Every Teichmuller representative is a root of `T^q - T`, where +`q = #κ`. -/ +theorem residueTeichmullerLift_pow_card [Finite F.residueField] + (y : F.residueField) : + higherPrincipalUnitGroup.residueTeichmullerLift F y ^ + Nat.card F.residueField = + higherPrincipalUnitGroup.residueTeichmullerLift F y := by + classical + let := Fintype.ofFinite F.residueField + have hcard_pos : 0 < Nat.card F.residueField := by + simpa [Nat.card_eq_fintype_card] using + (Fintype.card_pos : 0 < Fintype.card F.residueField) + by_cases hy : y = 0 + · simp [higherPrincipalUnitGroup.residueTeichmullerLift, hy] + · let u : higherPrincipalUnitGroup.residueRootsOfUnityGroup F := + (higherPrincipalUnitGroup.residueRootsOfUnityEquivResidueFieldUnits F).symm + (Units.mk0 y hy) + have hpowUnits : + (u : F.valuationSubringˣ) ^ + (Nat.card F.residueField - 1) = 1 := + u.property + have hpowRing : + ((u : F.valuationSubringˣ) : F.valuationSubring) ^ + (Nat.card F.residueField - 1) = 1 := by + simpa using + congrArg (fun z : F.valuationSubringˣ => (z : F.valuationSubring)) + hpowUnits + have hpow : + ((u : F.valuationSubringˣ) : F.valuationSubring) ^ + Nat.card F.residueField = + ((u : F.valuationSubringˣ) : F.valuationSubring) := by + calc + ((u : F.valuationSubringˣ) : F.valuationSubring) ^ + Nat.card F.residueField = + ((u : F.valuationSubringˣ) : F.valuationSubring) ^ + ((Nat.card F.residueField - 1) + 1) := by + rw [Nat.sub_one_add_one_eq_of_pos hcard_pos] + _ = + ((u : F.valuationSubringˣ) : F.valuationSubring) ^ + (Nat.card F.residueField - 1) * + ((u : F.valuationSubringˣ) : F.valuationSubring) := by + rw [pow_succ] + _ = ((u : F.valuationSubringˣ) : F.valuationSubring) := by + rw [hpowRing, one_mul] + simpa [higherPrincipalUnitGroup.residueTeichmullerLift, hy, u] using hpow + +/-- +Every residue Teichmüller lift is a root of the polynomial `X^q - X`, where `q` is the +residue-field cardinality. +-/ +theorem residueTeichmullerLift_isRoot_X_pow_card_sub_X + [Finite F.residueField] (y : F.residueField) : + (Polynomial.X ^ Nat.card F.residueField - Polynomial.X : + Polynomial F.valuationSubring).IsRoot + (higherPrincipalUnitGroup.residueTeichmullerLift F y) := by + rw [Polynomial.IsRoot.def] + simp [Polynomial.eval_sub, + higherPrincipalUnitGroup.residueTeichmullerLift_pow_card] + +/-- In equal characteristic, `T^q - T` has unit derivative at every +Teichmuller representative. -/ +theorem residueTeichmullerRootPolynomial_derivative_eval_isUnit_of_charP + [Finite F.residueField] (p : ℕ) [Fact p.Prime] + [CharP F.valuationSubring p] {n : ℕ+} + (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (y : F.residueField) : + IsUnit + (((Polynomial.X ^ Nat.card F.residueField - Polynomial.X : + Polynomial F.valuationSubring).derivative).eval + (higherPrincipalUnitGroup.residueTeichmullerLift F y)) := by + have hp_dvd_card : p ∣ Nat.card F.residueField := by + rw [hcard] + exact dvd_pow_self p n.ne_zero + have hcard_cast : + ((Nat.card F.residueField : ℕ) : F.valuationSubring) = 0 := + (CharP.cast_eq_zero_iff F.valuationSubring p + (Nat.card F.residueField)).2 hp_dvd_card + have hderiv : + ((Polynomial.X ^ Nat.card F.residueField - Polynomial.X : + Polynomial F.valuationSubring).derivative).eval + (higherPrincipalUnitGroup.residueTeichmullerLift F y) = -1 := by + simp [Polynomial.derivative_sub, Polynomial.derivative_X_pow, + Polynomial.derivative_X, hcard_cast] + rw [hderiv] + exact isUnit_neg_one + +/-- In equal characteristic, the Teichmuller lift from the finite residue field +to the valuation ring is additive. -/ +theorem residueTeichmullerLift_add_of_charP [Finite F.residueField] + (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] {n : ℕ+} + (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (x y : F.residueField) : + higherPrincipalUnitGroup.residueTeichmullerLift F (x + y) = + higherPrincipalUnitGroup.residueTeichmullerLift F x + + higherPrincipalUnitGroup.residueTeichmullerLift F y := by + let f : Polynomial F.valuationSubring := + Polynomial.X ^ Nat.card F.residueField - Polynomial.X + let a : F.valuationSubring := + higherPrincipalUnitGroup.residueTeichmullerLift F (x + y) + let b : F.valuationSubring := + higherPrincipalUnitGroup.residueTeichmullerLift F x + + higherPrincipalUnitGroup.residueTeichmullerLift F y + have ha : f.IsRoot a := by + simpa [f, a] using + higherPrincipalUnitGroup.residueTeichmullerLift_isRoot_X_pow_card_sub_X + (F := F) (x + y) + have hb : f.IsRoot b := by + rw [Polynomial.IsRoot.def] + have hxpow := + higherPrincipalUnitGroup.residueTeichmullerLift_pow_card (F := F) x + have hypow := + higherPrincipalUnitGroup.residueTeichmullerLift_pow_card (F := F) y + have hfresh : + b ^ (p ^ (n : ℕ)) = + higherPrincipalUnitGroup.residueTeichmullerLift F x ^ + (p ^ (n : ℕ)) + + higherPrincipalUnitGroup.residueTeichmullerLift F y ^ + (p ^ (n : ℕ)) := by + simpa [b] using + add_pow_char_pow + (higherPrincipalUnitGroup.residueTeichmullerLift F x) + (higherPrincipalUnitGroup.residueTeichmullerLift F y) + p (n : ℕ) + have hxpow' : + higherPrincipalUnitGroup.residueTeichmullerLift F x ^ + (p ^ (n : ℕ)) = + higherPrincipalUnitGroup.residueTeichmullerLift F x := by + simpa [hcard] using hxpow + have hypow' : + higherPrincipalUnitGroup.residueTeichmullerLift F y ^ + (p ^ (n : ℕ)) = + higherPrincipalUnitGroup.residueTeichmullerLift F y := by + simpa [hcard] using hypow + have hbpow : b ^ Nat.card F.residueField = b := by + rw [hcard, hfresh] + rw [hxpow', hypow'] + simp [f, b, Polynomial.eval_sub, hbpow] + have hres : F.residueMap b = F.residueMap a := by + simp [a, b, map_add, + higherPrincipalUnitGroup.residueMap_residueTeichmullerLift] + have hderiv : IsUnit (f.derivative.eval a) := by + simpa [f, a] using + higherPrincipalUnitGroup.residueTeichmullerRootPolynomial_derivative_eval_isUnit_of_charP + (F := F) p hcard (x + y) + have hba : b = a := + F.toHenselianDVF.eq_of_isRoot_of_isRoot_of_residue_eq_of_derivative_isUnit + (f := f) ha hb hres hderiv + simpa [a, b] using hba.symm + +/-- In equal characteristic, the Teichmuller lift is a ring homomorphic +coefficient-field section of the residue map. -/ +noncomputable def residueTeichmullerRingHomOfCharP + [Finite F.residueField] (p : ℕ) [Fact p.Prime] + [CharP F.valuationSubring p] {n : ℕ+} + (hcard : Nat.card F.residueField = p ^ (n : ℕ)) : + F.residueField →+* F.valuationSubring where + toFun := higherPrincipalUnitGroup.residueTeichmullerLift F + map_zero' := by + exact higherPrincipalUnitGroup.residueTeichmullerLift_zero (F := F) + map_one' := by + exact higherPrincipalUnitGroup.residueTeichmullerLift_one (F := F) + map_mul' := fun x y => + higherPrincipalUnitGroup.residueTeichmullerLift_mul (F := F) x y + map_add' := fun x y => + higherPrincipalUnitGroup.residueTeichmullerLift_add_of_charP + (F := F) p hcard x y + +/-- +The defining evaluation formula for `residueTeichmullerRingHomOfCharP` is +`higherPrincipalUnitGroup.residueTeichmullerRingHomOfCharP (F := F) p hcard x = +higherPrincipalUnitGroup.residueTeichmullerLift F x`. +-/ +@[simp] theorem residueTeichmullerRingHomOfCharP_apply + [Finite F.residueField] (p : ℕ) [Fact p.Prime] + [CharP F.valuationSubring p] {n : ℕ+} + (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (x : F.residueField) : + higherPrincipalUnitGroup.residueTeichmullerRingHomOfCharP + (F := F) p hcard x = + higherPrincipalUnitGroup.residueTeichmullerLift F x := + rfl + +/-- +Establishes the identity `F.residueMap.comp +(higherPrincipalUnitGroup.residueTeichmullerRingHomOfCharP (F := F) p hcard) = RingHom.id +F.residueField`. +-/ +theorem residueMap_comp_residueTeichmullerRingHomOfCharP + [Finite F.residueField] (p : ℕ) [Fact p.Prime] + [CharP F.valuationSubring p] {n : ℕ+} + (hcard : Nat.card F.residueField = p ^ (n : ℕ)) : + F.residueMap.comp + (higherPrincipalUnitGroup.residueTeichmullerRingHomOfCharP + (F := F) p hcard) = + RingHom.id F.residueField := by + ext x + exact higherPrincipalUnitGroup.residueMap_residueTeichmullerLift + (F := F) x + +/-- The corresponding coefficient-field embedding into the fraction field. -/ +noncomputable def residueTeichmullerFieldHomOfCharP + [Finite F.residueField] (p : ℕ) [Fact p.Prime] + [CharP F.valuationSubring p] {n : ℕ+} + (hcard : Nat.card F.residueField = p ^ (n : ℕ)) : + F.residueField →+* K := + F.valuation.valuationSubring.subtype.comp + (higherPrincipalUnitGroup.residueTeichmullerRingHomOfCharP + (F := F) p hcard) + +/-- +The defining evaluation formula for `residueTeichmullerFieldHomOfCharP` is +`higherPrincipalUnitGroup.residueTeichmullerFieldHomOfCharP (F := F) p hcard x = +(higherPrincipalUnitGroup.residueTeichmullerLift F x : K)`. +-/ +@[simp] theorem residueTeichmullerFieldHomOfCharP_apply + [Finite F.residueField] (p : ℕ) [Fact p.Prime] + [CharP F.valuationSubring p] {n : ℕ+} + (hcard : Nat.card F.residueField = p ^ (n : ℕ)) + (x : F.residueField) : + higherPrincipalUnitGroup.residueTeichmullerFieldHomOfCharP + (F := F) p hcard x = + (higherPrincipalUnitGroup.residueTeichmullerLift F x : K) := + rfl +end higherPrincipalUnitGroup + +end CompleteDVF +end DiscreteValuationField + +end + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationAddVal.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationAddVal.lean new file mode 100644 index 0000000000..46b0422aee --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationAddVal.lean @@ -0,0 +1,173 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal +/-! +# Additive valuations in finite complete-DVF extensions + +The normalized additive valuation on the target valuation ring restricts to +the ramification index times the normalized additive valuation on the base +valuation ring. The proof is characteristic-independent and follows from the +ideal identity +`m_K · O_L = m_L ^ e`. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w x + +namespace LocalFieldTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField +namespace ValuedExtension +open ValuationTheory.DiscreteValuationField.ValuedExtension + +variable {K : Type u} {L : Type w} [Field K] [Field L] +variable [Algebra K L] +variable (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) +variable [base.valuation.HasExtension target.valuation] + +/-- The target normalized additive valuation of an element from the base +valuation ring is its base additive valuation multiplied by the ramification +index. This includes the zero element, whose additive valuation is `⊤`. -/ +theorem addVal_integerMap_eq_ramificationIndex_nsmul + (a : base.valuationSubring) : + IsDiscreteValuationRing.addVal target.valuationSubring + (integerMap base.toDVF target.toDVF a) = + ramificationIndex base.toDVF target.toDVF • + IsDiscreteValuationRing.addVal base.valuationSubring a := by + let e := ramificationIndex base.toDVF target.toDVF + have he_ne : e ≠ 0 := by + intro he + have hle := + maximalIdeal_map_integerMap_le base.toDVF target.toDVF + have hmap := + maximalIdeal_map_eq_target_maximalIdeal_pow_ramificationIndex + base target + rw [show ramificationIndex base.toDVF target.toDVF = e from rfl, + he, pow_zero] at hmap + rw [hmap] at hle + have hle_top : + (⊤ : Ideal target.valuationSubring) ≤ + IsLocalRing.maximalIdeal target.valuationSubring := by + simpa only [Ideal.one_eq_top] using hle + exact + (IsLocalRing.maximalIdeal.isMaximal + target.valuationSubring).ne_top (top_unique hle_top) + by_cases ha : a = 0 + · subst a + have he_coe_ne : (e : ℕ∞) ≠ 0 := by + exact_mod_cast he_ne + rw [map_zero, IsDiscreteValuationRing.addVal_zero, + IsDiscreteValuationRing.addVal_zero, nsmul_eq_mul, + ENat.mul_top he_coe_ne] + obtain ⟨pi, hpi⟩ := + IsDiscreteValuationRing.exists_irreducible base.valuationSubring + obtain ⟨varpi, hvarpi⟩ := + IsDiscreteValuationRing.exists_irreducible target.valuationSubring + obtain ⟨m, unit, ha_decomp⟩ := + IsDiscreteValuationRing.eq_unit_mul_pow_irreducible ha hpi + have hspan : + Ideal.span + ({integerMap base.toDVF target.toDVF pi} : + Set target.valuationSubring) = + Ideal.span ({varpi ^ e} : Set target.valuationSubring) := by + calc + Ideal.span + ({integerMap base.toDVF target.toDVF pi} : + Set target.valuationSubring) = + Ideal.map (integerMap base.toDVF target.toDVF) + (Ideal.span ({pi} : Set base.valuationSubring)) := by + rw [Ideal.map_span, Set.image_singleton] + _ = Ideal.map (integerMap base.toDVF target.toDVF) + base.maximalIdeal := by + rw [show base.maximalIdeal = + IsLocalRing.maximalIdeal base.valuationSubring from rfl, + hpi.maximalIdeal_eq] + _ = target.maximalIdeal ^ e := by + exact + maximalIdeal_map_eq_target_maximalIdeal_pow_ramificationIndex + base target + _ = Ideal.span ({varpi ^ e} : Set target.valuationSubring) := by + rw [show target.maximalIdeal = + IsLocalRing.maximalIdeal target.valuationSubring from rfl, + hvarpi.maximalIdeal_eq, Ideal.span_singleton_pow] + have hmap_uniformizer : + IsDiscreteValuationRing.addVal target.valuationSubring + (integerMap base.toDVF target.toDVF pi) = + (e : ℕ∞) := by + calc + IsDiscreteValuationRing.addVal target.valuationSubring + (integerMap base.toDVF target.toDVF pi) = + IsDiscreteValuationRing.addVal target.valuationSubring + (varpi ^ e) := + (IsDiscreteValuationRing.addVal_eq_iff_associated _ _).2 + (Ideal.span_singleton_eq_span_singleton.mp hspan) + _ = (e : ℕ∞) := hvarpi.addVal_pow e + rw [ha_decomp, map_mul, map_pow, + IsDiscreteValuationRing.addVal_mul, + IsDiscreteValuationRing.addVal_pow, hmap_uniformizer, + IsDiscreteValuationRing.addVal_def + ((unit : base.valuationSubring) * pi ^ m) + unit hpi m rfl] + have hmap_unit : + IsDiscreteValuationRing.addVal target.valuationSubring + (integerMap base.toDVF target.toDVF + (unit : base.valuationSubring)) = 0 := by + exact + IsDiscreteValuationRing.addVal_eq_zero_iff.mpr + ((unit.isUnit : IsUnit (unit : base.valuationSubring)).map + (integerMap base.toDVF target.toDVF)) + rw [hmap_unit, zero_add] + simp [e, nsmul_eq_mul, mul_comm] + +/-- The target additive valuation of the image of a base uniformizer is the +ramification index. -/ +theorem addVal_integerMap_eq_ramificationIndex_of_irreducible + {a : base.valuationSubring} (ha : Irreducible a) : + IsDiscreteValuationRing.addVal target.valuationSubring + (integerMap base.toDVF target.toDVF a) = + (ramificationIndex base.toDVF target.toDVF : ℕ∞) := by + rw [addVal_integerMap_eq_ramificationIndex_nsmul base target a, + IsDiscreteValuationRing.addVal_uniformizer ha, nsmul_eq_mul, mul_one] + +/-- If a base uniformizer remains a uniformizer after applying the +valuation-ring map, then the relative ramification index is one. -/ +theorem ramificationIndex_eq_one_of_integerMap_uniformizer + (a : base.valuationSubring) + (ha : base.valuation.IsUniformizer (a : K)) + (hmap : + target.valuation.IsUniformizer + ((integerMap base.toDVF target.toDVF a : + target.valuationSubring) : L)) : + ramificationIndex base.toDVF target.toDVF = 1 := by + have haIrreducible : Irreducible a := + (IsDiscreteValuationRing.irreducible_iff_uniformizer a).2 + (base.maximalIdeal_eq_span_uniformizer ha) + have hmapIrreducible : + Irreducible (integerMap base.toDVF target.toDVF a) := + (IsDiscreteValuationRing.irreducible_iff_uniformizer + (integerMap base.toDVF target.toDVF a)).2 + (target.maximalIdeal_eq_span_uniformizer hmap) + have hadd := + addVal_integerMap_eq_ramificationIndex_nsmul base target a + rw [IsDiscreteValuationRing.addVal_uniformizer hmapIrreducible, + IsDiscreteValuationRing.addVal_uniformizer haIrreducible, + nsmul_eq_mul, mul_one] at hadd + have hcoe : + (ramificationIndex base.toDVF target.toDVF : ℕ∞) = 1 := + hadd.symm + exact_mod_cast hcoe + +end ValuedExtension +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationIdeal.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationIdeal.lean new file mode 100644 index 0000000000..522fcce7b7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationIdeal.lean @@ -0,0 +1,351 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationInvariants +/-! +# Ramification ideals in finite complete-DVF extensions + +This file records the ideal-theoretic source behind the local-field structure theory. +The base maximal ideal maps to the `e`-th power of the target maximal ideal, where +`e` is the canonical ramification index. Every statement is expressed directly +in the ambient valued-extension context; no extension marker is involved. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w x + +namespace LocalFieldTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField +namespace ValuedExtension +open ValuationTheory.DiscreteValuationField.ValuedExtension + +variable {K : Type u} {L : Type w} [Field K] [Field L] +variable [Algebra K L] +variable (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) +variable [base.valuation.HasExtension target.valuation] + +/-- No power of the target maximal ideal is contained in the next power. + +This is the ideal-level form of the uniformizer-power separation lemma. -/ +theorem target_maximalIdeal_pow_not_le_pow_succ + {π : target.valuationSubring} + (hπ : target.valuation.IsUniformizer (π : L)) (n : ℕ) : + ¬ target.maximalIdeal ^ n ≤ target.maximalIdeal ^ (n + 1) := by + intro hle + have hπpow_mem : π ^ n ∈ target.maximalIdeal ^ n := by + rw [target.maximalIdeal_pow_eq_span_uniformizer_pow hπ n] + exact Ideal.mem_span_singleton_self (π ^ n) + exact target.uniformizer_pow_not_mem_maximalIdeal_pow_succ hπ n + (hle hπpow_mem) + +/-- The image of the base maximal ideal is the `e`-th power of the target +maximal ideal. -/ +theorem maximalIdeal_map_eq_target_maximalIdeal_pow_ramificationIndex : + Ideal.map (integerMap base.toDVF target.toDVF) base.maximalIdeal = + target.maximalIdeal ^ ramificationIndex base.toDVF target.toDVF := by + rcases target.nonzero_ideal_eq_maximalIdeal_pow + (Ideal.map (integerMap base.toDVF target.toDVF) base.maximalIdeal) + (maximalIdeal_map_integerMap_ne_bot base.toDVF target.toDVF) with + ⟨n, hn⟩ + have hle : + Ideal.map (integerMap base.toDVF target.toDVF) base.maximalIdeal ≤ + target.maximalIdeal ^ n := by + rw [hn] + have hnot : + ¬ Ideal.map (integerMap base.toDVF target.toDVF) base.maximalIdeal ≤ + target.maximalIdeal ^ (n + 1) := by + intro hle_succ + rcases target.exists_uniformizer with ⟨π, hπ⟩ + exact target_maximalIdeal_pow_not_le_pow_succ target hπ n + (by simpa [hn] using hle_succ) + have he : ramificationIndex base.toDVF target.toDVF = n := by + simpa [ramificationIndex, integerMap] using + (Ideal.ramificationIdx'_spec + (p := base.maximalIdeal) (P := target.maximalIdeal) hle hnot) + rw [he] + exact hn + +/-- The image of the `n`-th power of the base maximal ideal is the +`(e*n)`-th power of the target maximal ideal. -/ +theorem maximalIdeal_pow_map_eq_target_maximalIdeal_pow_mul_ramificationIndex + (n : ℕ) : + Ideal.map (integerMap base.toDVF target.toDVF) (base.maximalIdeal ^ n) = + target.maximalIdeal ^ (ramificationIndex base.toDVF target.toDVF * n) := by + calc + Ideal.map (integerMap base.toDVF target.toDVF) (base.maximalIdeal ^ n) = + (Ideal.map (integerMap base.toDVF target.toDVF) base.maximalIdeal) ^ n := by + rw [Ideal.map_pow] + _ = (target.maximalIdeal ^ ramificationIndex base.toDVF target.toDVF) ^ n := by + rw [maximalIdeal_map_eq_target_maximalIdeal_pow_ramificationIndex base target] + _ = target.maximalIdeal ^ (ramificationIndex base.toDVF target.toDVF * n) := by + rw [pow_mul] + +/-- Elements in `m_K^n` map into `m_L^(e*n)`. -/ +theorem integerMap_mem_target_maximalIdeal_pow_mul_ramificationIndex + {n : ℕ} {x : base.valuationSubring} + (hx : x ∈ base.maximalIdeal ^ n) : + integerMap base.toDVF target.toDVF x ∈ + target.maximalIdeal ^ (ramificationIndex base.toDVF target.toDVF * n) := by + rw [← maximalIdeal_pow_map_eq_target_maximalIdeal_pow_mul_ramificationIndex + base target n] + exact Ideal.mem_map_of_mem (integerMap base.toDVF target.toDVF) hx + +/-- The image of `m_K^n` is not contained in the next target maximal-ideal +power after `m_L^(e*n)`. -/ +theorem maximalIdeal_pow_map_not_le_target_next_pow_mul_ramificationIndex + (n : ℕ) : + ¬ Ideal.map (integerMap base.toDVF target.toDVF) (base.maximalIdeal ^ n) ≤ + target.maximalIdeal ^ + (ramificationIndex base.toDVF target.toDVF * n + 1) := by + rw [maximalIdeal_pow_map_eq_target_maximalIdeal_pow_mul_ramificationIndex + base target n] + rcases target.exists_uniformizer with ⟨π, hπ⟩ + exact target_maximalIdeal_pow_not_le_pow_succ target hπ + (ramificationIndex base.toDVF target.toDVF * n) + +/-- The image of a base uniformizer generates the `e`-th target maximal-ideal +power. -/ +theorem span_base_uniformizer_image_eq_target_maximalIdeal_pow_ramificationIndex + {ϖ : base.valuationSubring} + (hϖ : base.valuation.IsUniformizer (ϖ : K)) : + Ideal.span ({integerMap base.toDVF target.toDVF ϖ} : + Set target.valuationSubring) = + target.maximalIdeal ^ ramificationIndex base.toDVF target.toDVF := by + calc + Ideal.span ({integerMap base.toDVF target.toDVF ϖ} : + Set target.valuationSubring) = + Ideal.map (integerMap base.toDVF target.toDVF) + (Ideal.span ({ϖ} : Set base.valuationSubring)) := by + rw [Ideal.map_span, Set.image_singleton] + _ = Ideal.map (integerMap base.toDVF target.toDVF) base.maximalIdeal := by + rw [base.maximalIdeal_eq_span_uniformizer hϖ] + _ = target.maximalIdeal ^ ramificationIndex base.toDVF target.toDVF := + maximalIdeal_map_eq_target_maximalIdeal_pow_ramificationIndex base target + +/-- The image of the `n`-th power of a base uniformizer generates +`m_L^(e*n)`. -/ +theorem span_base_uniformizer_pow_image_eq_target_maximalIdeal_pow_mul_ramificationIndex + {ϖ : base.valuationSubring} + (hϖ : base.valuation.IsUniformizer (ϖ : K)) (n : ℕ) : + Ideal.span ({integerMap base.toDVF target.toDVF (ϖ ^ n)} : + Set target.valuationSubring) = + target.maximalIdeal ^ + (ramificationIndex base.toDVF target.toDVF * n) := by + calc + Ideal.span ({integerMap base.toDVF target.toDVF (ϖ ^ n)} : + Set target.valuationSubring) = + Ideal.map (integerMap base.toDVF target.toDVF) + (Ideal.span ({ϖ ^ n} : Set base.valuationSubring)) := by + rw [Ideal.map_span, Set.image_singleton] + _ = Ideal.map (integerMap base.toDVF target.toDVF) + (base.maximalIdeal ^ n) := by + rw [base.maximalIdeal_pow_eq_span_uniformizer_pow hϖ n] + _ = target.maximalIdeal ^ + (ramificationIndex base.toDVF target.toDVF * n) := + maximalIdeal_pow_map_eq_target_maximalIdeal_pow_mul_ramificationIndex + base target n + +/-- The image of a base uniformizer lies in the `e`-th target maximal-ideal +power. -/ +theorem base_uniformizer_image_mem_target_maximalIdeal_pow_ramificationIndex + {ϖ : base.valuationSubring} + (hϖ : base.valuation.IsUniformizer (ϖ : K)) : + integerMap base.toDVF target.toDVF ϖ ∈ + target.maximalIdeal ^ ramificationIndex base.toDVF target.toDVF := by + rw [← span_base_uniformizer_image_eq_target_maximalIdeal_pow_ramificationIndex + base target hϖ] + exact Ideal.mem_span_singleton_self (integerMap base.toDVF target.toDVF ϖ) + +/-- The image of a base uniformizer has exact target maximal-ideal order `e`: +it is not in the next power. -/ +theorem base_uniformizer_image_not_mem_target_maximalIdeal_pow_succ_ramificationIndex + {ϖ : base.valuationSubring} + (hϖ : base.valuation.IsUniformizer (ϖ : K)) : + integerMap base.toDVF target.toDVF ϖ ∉ + target.maximalIdeal ^ + (ramificationIndex base.toDVF target.toDVF + 1) := by + intro hx + have hspan : + Ideal.span ({integerMap base.toDVF target.toDVF ϖ} : + Set target.valuationSubring) = + target.maximalIdeal ^ ramificationIndex base.toDVF target.toDVF := + span_base_uniformizer_image_eq_target_maximalIdeal_pow_ramificationIndex + base target hϖ + have hspan_le : + Ideal.span ({integerMap base.toDVF target.toDVF ϖ} : + Set target.valuationSubring) ≤ + target.maximalIdeal ^ + (ramificationIndex base.toDVF target.toDVF + 1) := by + rw [Ideal.span_le] + intro y hy + have hy_eq : y = integerMap base.toDVF target.toDVF ϖ := by + simpa using hy + simpa [hy_eq] using hx + rcases target.exists_uniformizer with ⟨π, hπ⟩ + exact target_maximalIdeal_pow_not_le_pow_succ target hπ + (ramificationIndex base.toDVF target.toDVF) + (by simpa [hspan] using hspan_le) + +/-- The image of a base uniformizer is a unit multiple of the `e`-th power of +any target uniformizer. -/ +theorem exists_unit_mul_target_uniformizer_pow_eq_base_uniformizer_image + {ϖ : base.valuationSubring} {π : target.valuationSubring} + (hϖ : base.valuation.IsUniformizer (ϖ : K)) + (hπ : target.valuation.IsUniformizer (π : L)) : + ∃ u : target.valuationSubringˣ, + integerMap base.toDVF target.toDVF ϖ = + (u : target.valuationSubring) * + π ^ ramificationIndex base.toDVF target.toDVF := by + have hspan : + Ideal.span ({integerMap base.toDVF target.toDVF ϖ} : + Set target.valuationSubring) = + target.maximalIdeal ^ ramificationIndex base.toDVF target.toDVF := + span_base_uniformizer_image_eq_target_maximalIdeal_pow_ramificationIndex + base target hϖ + have hx_mem : + integerMap base.toDVF target.toDVF ϖ ∈ + target.maximalIdeal ^ ramificationIndex base.toDVF target.toDVF := + base_uniformizer_image_mem_target_maximalIdeal_pow_ramificationIndex + base target hϖ + rcases + (target.mem_maximalIdeal_pow_iff_uniformizer_pow_dvd hπ + (ramificationIndex base.toDVF target.toDVF)).1 hx_mem with + ⟨u, hu⟩ + have hu_unit : IsUnit u := by + by_contra hnot_unit + have hu_mem : u ∈ target.maximalIdeal := by + by_contra hnot_mem + exact hnot_unit ((IsLocalRing.notMem_maximalIdeal (x := u)).1 hnot_mem) + have hπpow_mem : + π ^ ramificationIndex base.toDVF target.toDVF ∈ + target.maximalIdeal ^ ramificationIndex base.toDVF target.toDVF := by + rw [target.maximalIdeal_pow_eq_span_uniformizer_pow hπ + (ramificationIndex base.toDVF target.toDVF)] + exact Ideal.mem_span_singleton_self + (π ^ ramificationIndex base.toDVF target.toDVF) + have hx_deep : + integerMap base.toDVF target.toDVF ϖ ∈ + target.maximalIdeal ^ + (ramificationIndex base.toDVF target.toDVF + 1) := by + rw [hu] + have hmul : + π ^ ramificationIndex base.toDVF target.toDVF * u ∈ + target.maximalIdeal ^ ramificationIndex base.toDVF target.toDVF * + target.maximalIdeal := + Ideal.mul_mem_mul hπpow_mem hu_mem + simpa [pow_succ] using hmul + have hspan_le : + Ideal.span ({integerMap base.toDVF target.toDVF ϖ} : + Set target.valuationSubring) ≤ + target.maximalIdeal ^ + (ramificationIndex base.toDVF target.toDVF + 1) := by + rw [Ideal.span_le] + intro y hy + have hy_eq : y = integerMap base.toDVF target.toDVF ϖ := by + simpa using hy + simpa [hy_eq] using hx_deep + exact target_maximalIdeal_pow_not_le_pow_succ target hπ + (ramificationIndex base.toDVF target.toDVF) + (by simpa [hspan] using hspan_le) + rcases hu_unit with ⟨uunit, huunit⟩ + refine ⟨uunit, ?_⟩ + simpa [huunit, mul_comm] using hu + +/-- Powers of a base uniformizer map to unit multiples of the corresponding +target uniformizer power. -/ +theorem exists_unit_mul_target_uniformizer_pow_mul_eq_base_uniformizer_pow_image + {ϖ : base.valuationSubring} {π : target.valuationSubring} + (hϖ : base.valuation.IsUniformizer (ϖ : K)) + (hπ : target.valuation.IsUniformizer (π : L)) (n : ℕ) : + ∃ u : target.valuationSubringˣ, + integerMap base.toDVF target.toDVF (ϖ ^ n) = + (u : target.valuationSubring) * + π ^ (ramificationIndex base.toDVF target.toDVF * n) := by + rcases exists_unit_mul_target_uniformizer_pow_eq_base_uniformizer_image + base target hϖ hπ with ⟨u, hu⟩ + refine ⟨u ^ n, ?_⟩ + calc + integerMap base.toDVF target.toDVF (ϖ ^ n) = + integerMap base.toDVF target.toDVF ϖ ^ n := by + rw [map_pow] + _ = ((u : target.valuationSubring) * + π ^ ramificationIndex base.toDVF target.toDVF) ^ n := by + rw [hu] + _ = (u : target.valuationSubring) ^ n * + (π ^ ramificationIndex base.toDVF target.toDVF) ^ n := by + rw [mul_pow] + _ = ((u ^ n : target.valuationSubringˣ) : target.valuationSubring) * + π ^ (ramificationIndex base.toDVF target.toDVF * n) := by + rw [pow_mul] + simp + +/-- The image of a power of a base uniformizer lies in the corresponding +target maximal-ideal power. -/ +theorem base_uniformizer_pow_image_mem_target_maximalIdeal_pow_mul_ramificationIndex + {ϖ : base.valuationSubring} {π : target.valuationSubring} + (hϖ : base.valuation.IsUniformizer (ϖ : K)) + (hπ : target.valuation.IsUniformizer (π : L)) (n : ℕ) : + integerMap base.toDVF target.toDVF (ϖ ^ n) ∈ + target.maximalIdeal ^ + (ramificationIndex base.toDVF target.toDVF * n) := by + rcases + exists_unit_mul_target_uniformizer_pow_mul_eq_base_uniformizer_pow_image + base target hϖ hπ n with + ⟨u, hu⟩ + rw [hu, target.maximalIdeal_pow_eq_span_uniformizer_pow hπ] + exact Ideal.mul_mem_left _ (u : target.valuationSubring) + (Ideal.mem_span_singleton_self + (π ^ (ramificationIndex base.toDVF target.toDVF * n))) + +/-- The image of a power of a base uniformizer has exact target +maximal-ideal order `e*n`. -/ +theorem base_uniformizer_pow_image_not_mem_target_next_pow_mul_ramificationIndex + {ϖ : base.valuationSubring} {π : target.valuationSubring} + (hϖ : base.valuation.IsUniformizer (ϖ : K)) + (hπ : target.valuation.IsUniformizer (π : L)) (n : ℕ) : + integerMap base.toDVF target.toDVF (ϖ ^ n) ∉ + target.maximalIdeal ^ + (ramificationIndex base.toDVF target.toDVF * n + 1) := by + rcases + exists_unit_mul_target_uniformizer_pow_mul_eq_base_uniformizer_pow_image + base target hϖ hπ n with + ⟨u, hu⟩ + intro hx + have hpow : + (u : target.valuationSubring) * + π ^ (ramificationIndex base.toDVF target.toDVF * n) ∈ + target.maximalIdeal ^ + (ramificationIndex base.toDVF target.toDVF * n + 1) := by + simpa [hu] using hx + have hu_unit : IsUnit (u : target.valuationSubring) := u.isUnit + let I : Ideal target.valuationSubring := + target.maximalIdeal ^ + (ramificationIndex base.toDVF target.toDVF * n + 1) + have hpowI : + (u : target.valuationSubring) * + π ^ (ramificationIndex base.toDVF target.toDVF * n) ∈ I := by + simpa [I] using hpow + have hpow' : + π ^ (ramificationIndex base.toDVF target.toDVF * n) ∈ + target.maximalIdeal ^ + (ramificationIndex base.toDVF target.toDVF * n + 1) := by + have hpiI : + π ^ (ramificationIndex base.toDVF target.toDVF * n) ∈ I := + (I.unit_mul_mem_iff_mem hu_unit).1 hpowI + simpa [I] using hpiI + exact target.uniformizer_pow_not_mem_maximalIdeal_pow_succ hπ + (ramificationIndex base.toDVF target.toDVF * n) hpow' + +end ValuedExtension +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationInvariants.lean new file mode 100644 index 0000000000..a1a64b5d51 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationInvariants.lean @@ -0,0 +1,411 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core +/-! +# Canonical ramification invariants + +The ramification index and residue degree are the ideal-theoretic invariants of +the chosen valuation rings. Every theorem below is stated directly in the +ambient valued-extension context; there are no compatibility aliases or +extension-marker arguments. +-/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + moduleFinite_target_valuationSubring_of_finite_separable → + moduleFinite_target_valuationSubring_of_finite_separable + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + moduleIsTorsionFree_target_valuationSubring_of_finite_separable → + moduleIsTorsionFree_target_valuationSubring_of_finite_separable + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + ramificationIndex_mul_residueDegree_eq_degree → + ramificationIndex_mul_residueDegree_eq_degree + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + ramificationIndex_mul_residueDegree_eq_degree_of_finite_separable → + ramificationIndex_mul_residueDegree_eq_degree_of_finite_separable + + +noncomputable +section + +universe u v w x + +namespace LocalFieldTheory.DiscreteValuationField + +open ValuationTheory.DiscreteValuationField + +namespace ValuedExtension + +variable {K : Type u} {L : Type w} [Field K] [Field L] +variable [Algebra K L] +variable (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) +variable [base.valuation.HasExtension target.valuation] + +/-- The local fundamental identity for a finite extension of valuation rings. -/ +theorem degree_eq_ramificationIndex_mul_residueDegree + [Module.Finite base.valuationSubring target.valuationSubring] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + ValuationTheory.DiscreteValuationField.ValuedExtension.degree + base.toDVF target.toDVF = + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF * + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + base.toDVF target.toDVF := + (ramificationIndex_mul_residueDegree_eq_degree + base target).symm + +/-- +Establishes the inequality +`ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex base.toDVF target.toDVF +≠ 0`. +-/ +theorem ramificationIndex_ne_zero + [Module.IsTorsionFree base.valuationSubring target.valuationSubring] : + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF ≠ 0 := + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex_ne_zero + base target + +/-- +Establishes the strict bound `0 < +ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex base.toDVF target.toDVF`. +-/ +theorem ramificationIndex_pos + [Module.IsTorsionFree base.valuationSubring target.valuationSubring] : + 0 < ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF := + Nat.pos_of_ne_zero (ramificationIndex_ne_zero base target) + +/-- +Establishes the inequality `ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree +base.toDVF target.toDVF ≠ 0`. +-/ +theorem residueDegree_ne_zero + [Module.Finite base.valuationSubring target.valuationSubring] : + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + base.toDVF target.toDVF ≠ 0 := + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree_ne_zero + base target + +/-- +Establishes the strict bound `0 < +ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree base.toDVF target.toDVF`. +-/ +theorem residueDegree_pos + [Module.Finite base.valuationSubring target.valuationSubring] : + 0 < ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + base.toDVF target.toDVF := + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree_pos + base target + +/-- +Proves the bound `ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex +base.toDVF target.toDVF ≤ ValuationTheory.DiscreteValuationField.ValuedExtension.degree base.toDVF +target.toDVF`. +-/ +theorem ramificationIndex_le_degree + [Module.Finite base.valuationSubring target.valuationSubring] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF ≤ + ValuationTheory.DiscreteValuationField.ValuedExtension.degree + base.toDVF target.toDVF := by + rw [degree_eq_ramificationIndex_mul_residueDegree base target] + nth_rw 1 [← mul_one + (ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF)] + exact Nat.mul_le_mul_left _ + (Nat.succ_le_of_lt (residueDegree_pos base target)) + +/-- +Proves the bound `ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree base.toDVF +target.toDVF ≤ ValuationTheory.DiscreteValuationField.ValuedExtension.degree base.toDVF +target.toDVF`. +-/ +theorem residueDegree_le_degree + [Module.Finite base.valuationSubring target.valuationSubring] + [Module.IsTorsionFree base.valuationSubring target.valuationSubring] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + base.toDVF target.toDVF ≤ + ValuationTheory.DiscreteValuationField.ValuedExtension.degree + base.toDVF target.toDVF := by + rw [degree_eq_ramificationIndex_mul_residueDegree base target] + calc + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + base.toDVF target.toDVF ≤ + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + base.toDVF target.toDVF * + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF := by + nth_rw 1 [← mul_one + (ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + base.toDVF target.toDVF)] + exact Nat.mul_le_mul_left _ + (Nat.succ_le_of_lt (ramificationIndex_pos base target)) + _ = _ := Nat.mul_comm _ _ + +/-- +Characterizes `ValuationTheory.DiscreteValuationField.ValuedExtension.degree base.toDVF +target.toDVF = 1` by the equivalent condition +`ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex base.toDVF target.toDVF += 1 ∧ ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree base.toDVF target.toDVF += 1`. +-/ +theorem degree_eq_one_iff_ramificationIndex_eq_one_and_residueDegree_eq_one + [Module.Finite base.valuationSubring target.valuationSubring] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + ValuationTheory.DiscreteValuationField.ValuedExtension.degree + base.toDVF target.toDVF = 1 ↔ + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF = 1 ∧ + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + base.toDVF target.toDVF = 1 := by + constructor + · intro hdegree + have hprod : + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF * + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + base.toDVF target.toDVF = 1 := by + rw [← degree_eq_ramificationIndex_mul_residueDegree base target, hdegree] + exact ⟨Nat.eq_one_of_mul_eq_one_right hprod, + Nat.eq_one_of_mul_eq_one_left hprod⟩ + · rintro ⟨he, hf⟩ + rw [degree_eq_ramificationIndex_mul_residueDegree base target, + he, hf, one_mul] + +/-- +Establishes the identity `ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree +base.toDVF target.toDVF = ValuationTheory.DiscreteValuationField.ValuedExtension.degree base.toDVF +target.toDVF`. +-/ +theorem residueDegree_eq_degree_of_ramificationIndex_eq_one + [Module.Finite base.valuationSubring target.valuationSubring] + [IsScalarTower base.valuationSubring target.valuationSubring L] + (h : + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF = 1) : + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + base.toDVF target.toDVF = + ValuationTheory.DiscreteValuationField.ValuedExtension.degree + base.toDVF target.toDVF := by + rw [degree_eq_ramificationIndex_mul_residueDegree base target, h, one_mul] + +/-- +Establishes the identity `ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex +base.toDVF target.toDVF = ValuationTheory.DiscreteValuationField.ValuedExtension.degree base.toDVF +target.toDVF`. +-/ +theorem ramificationIndex_eq_degree_of_residueDegree_eq_one + [Module.Finite base.valuationSubring target.valuationSubring] + [IsScalarTower base.valuationSubring target.valuationSubring L] + (h : + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + base.toDVF target.toDVF = 1) : + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF = + ValuationTheory.DiscreteValuationField.ValuedExtension.degree + base.toDVF target.toDVF := by + rw [degree_eq_ramificationIndex_mul_residueDegree base target, h, mul_one] + +/-- +Characterizes `ValuationTheory.DiscreteValuationField.ValuedExtension.IsUnramified base.toDVF +target.toDVF` by the equivalent condition +`ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex base.toDVF target.toDVF += 1`. +-/ +@[simp] theorem isUnramified_iff_ramificationIndex_eq_one : + ValuationTheory.DiscreteValuationField.ValuedExtension.IsUnramified + base.toDVF target.toDVF ↔ + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF = 1 := + Iff.rfl + +/-- +Characterizes `ValuationTheory.DiscreteValuationField.ValuedExtension.IsTotallyRamified base.toDVF +target.toDVF` by the equivalent condition +`ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree base.toDVF target.toDVF = +1`. +-/ +@[simp] theorem isTotallyRamified_iff_residueDegree_eq_one : + ValuationTheory.DiscreteValuationField.ValuedExtension.IsTotallyRamified + base.toDVF target.toDVF ↔ + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + base.toDVF target.toDVF = 1 := + Iff.rfl + +variable [FiniteDimensional K L] + +/-- +Establishes the identity `ValuationTheory.DiscreteValuationField.ValuedExtension.degree base.toDVF +target.toDVF = ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex base.toDVF +target.toDVF * ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree base.toDVF +target.toDVF`. +-/ +theorem degree_eq_ramificationIndex_mul_residueDegree_of_finite_separable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + ValuationTheory.DiscreteValuationField.ValuedExtension.degree + base.toDVF target.toDVF = + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF * + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + base.toDVF target.toDVF := + (ramificationIndex_mul_residueDegree_eq_degree_of_finite_separable + base target).symm + +/-- A finite separable extension of the discrete valued fields is defectless. -/ +theorem isDefectless_of_finite_separable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + ValuationTheory.DiscreteValuationField.ValuedExtension.IsDefectless + base.toDVF target.toDVF := + degree_eq_ramificationIndex_mul_residueDegree_of_finite_separable base target + +/-- +Proves the bound `ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex +base.toDVF target.toDVF ≤ ValuationTheory.DiscreteValuationField.ValuedExtension.degree base.toDVF +target.toDVF`. +-/ +theorem ramificationIndex_le_degree_of_finite_separable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF ≤ + ValuationTheory.DiscreteValuationField.ValuedExtension.degree + base.toDVF target.toDVF := by + let : Module.Finite base.valuationSubring target.valuationSubring := + moduleFinite_target_valuationSubring_of_finite_separable + base target + exact ramificationIndex_le_degree base target + +/-- +Proves the bound `ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree base.toDVF +target.toDVF ≤ ValuationTheory.DiscreteValuationField.ValuedExtension.degree base.toDVF +target.toDVF`. +-/ +theorem residueDegree_le_degree_of_finite_separable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + base.toDVF target.toDVF ≤ + ValuationTheory.DiscreteValuationField.ValuedExtension.degree + base.toDVF target.toDVF := by + let : Module.Finite base.valuationSubring target.valuationSubring := + moduleFinite_target_valuationSubring_of_finite_separable + base target + let : Module.IsTorsionFree base.valuationSubring target.valuationSubring := + moduleIsTorsionFree_target_valuationSubring_of_finite_separable + base target + exact residueDegree_le_degree base target + +/-- +Characterizes `ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex base.toDVF +target.toDVF = 1` by the equivalent condition +`ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree base.toDVF target.toDVF = +ValuationTheory.DiscreteValuationField.ValuedExtension.degree base.toDVF target.toDVF`. +-/ +theorem ramificationIndex_eq_one_iff_residueDegree_eq_degree_of_finite_separable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF = 1 ↔ + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + base.toDVF target.toDVF = + ValuationTheory.DiscreteValuationField.ValuedExtension.degree + base.toDVF target.toDVF := by + let : Module.Finite base.valuationSubring target.valuationSubring := + moduleFinite_target_valuationSubring_of_finite_separable + base target + constructor + · exact residueDegree_eq_degree_of_ramificationIndex_eq_one base target + · intro hf + have hdegree := + degree_eq_ramificationIndex_mul_residueDegree_of_finite_separable + base target + have hpos := residueDegree_pos base target + apply Nat.eq_of_mul_eq_mul_right hpos + simpa [hf] using hdegree.symm + +/-- +Characterizes `ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree base.toDVF +target.toDVF = 1` by the equivalent condition +`ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex base.toDVF target.toDVF += ValuationTheory.DiscreteValuationField.ValuedExtension.degree base.toDVF target.toDVF`. +-/ +theorem residueDegree_eq_one_iff_ramificationIndex_eq_degree_of_finite_separable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + base.toDVF target.toDVF = 1 ↔ + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF = + ValuationTheory.DiscreteValuationField.ValuedExtension.degree + base.toDVF target.toDVF := by + let : Module.Finite base.valuationSubring target.valuationSubring := + moduleFinite_target_valuationSubring_of_finite_separable + base target + let : Module.IsTorsionFree base.valuationSubring target.valuationSubring := + moduleIsTorsionFree_target_valuationSubring_of_finite_separable + base target + constructor + · exact ramificationIndex_eq_degree_of_residueDegree_eq_one base target + · intro he + have hdegree := + degree_eq_ramificationIndex_mul_residueDegree_of_finite_separable + base target + have hpos := ramificationIndex_pos base target + apply Nat.eq_of_mul_eq_mul_left hpos + simpa [he] using hdegree.symm + +/-- +Characterizes `ValuationTheory.DiscreteValuationField.ValuedExtension.IsUnramified base.toDVF +target.toDVF` by the equivalent condition +`ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree base.toDVF target.toDVF = +ValuationTheory.DiscreteValuationField.ValuedExtension.degree base.toDVF target.toDVF`. +-/ +theorem isUnramified_iff_residueDegree_eq_degree_of_finite_separable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + ValuationTheory.DiscreteValuationField.ValuedExtension.IsUnramified + base.toDVF target.toDVF ↔ + ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree + base.toDVF target.toDVF = + ValuationTheory.DiscreteValuationField.ValuedExtension.degree + base.toDVF target.toDVF := + ramificationIndex_eq_one_iff_residueDegree_eq_degree_of_finite_separable + base target + +/-- +Characterizes `ValuationTheory.DiscreteValuationField.ValuedExtension.IsTotallyRamified base.toDVF +target.toDVF` by the equivalent condition +`ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex base.toDVF target.toDVF += ValuationTheory.DiscreteValuationField.ValuedExtension.degree base.toDVF target.toDVF`. +-/ +theorem isTotallyRamified_iff_ramificationIndex_eq_degree_of_finite_separable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + ValuationTheory.DiscreteValuationField.ValuedExtension.IsTotallyRamified + base.toDVF target.toDVF ↔ + ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex + base.toDVF target.toDVF = + ValuationTheory.DiscreteValuationField.ValuedExtension.degree + base.toDVF target.toDVF := + residueDegree_eq_one_iff_ramificationIndex_eq_degree_of_finite_separable + base target + +end ValuedExtension +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Units.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Units.lean new file mode 100644 index 0000000000..515cdf4df2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Units.lean @@ -0,0 +1,1369 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import Mathlib.GroupTheory.Index +public import Mathlib.GroupTheory.QuotientGroup.Basic + +/-! # Units -/ + +@[expose] public section +namespace LocalFieldTheory + +/-! +# Principal-unit filtrations + +This file provides a theorem API for antitone principal-unit filtrations used by +ramification and norm arguments. +-/ + +universe u v + +open scoped BigOperators + +namespace DiscreteValuationField + +/-- A generic antitone filtration by subgroups of a group. No valued-field +semantics are asserted by this interface alone. -/ +structure AntitoneSubgroupFiltration (G : Type u) [Group G] where + /-- The subgroup at each natural-number filtration level. -/ + subgroup : ℕ → Subgroup G + /-- Higher filtration levels are contained in lower ones. -/ + antitone : ∀ {m n : ℕ}, m ≤ n → subgroup n ≤ subgroup m + +namespace AntitoneSubgroupFiltration + +variable {G : Type u} [Group G] (U : AntitoneSubgroupFiltration G) + +/-- The `n`-th principal-unit subgroup. -/ +def principalUnitSubgroup (n : ℕ) : Subgroup G := + U.subgroup n + +/-- Characterizes `x ∈ U.principalUnitSubgroup n` by the equivalent condition `x ∈ U.subgroup n`. -/ +@[simp] theorem mem_principalUnitSubgroup_iff (n : ℕ) (x : G) : + x ∈ U.principalUnitSubgroup n ↔ x ∈ U.subgroup n := + Iff.rfl + +/-- Higher filtration levels are contained in lower levels. -/ +theorem principalUnitSubgroup_antitone {m n : ℕ} (h : m ≤ n) : + U.principalUnitSubgroup n ≤ U.principalUnitSubgroup m := + U.antitone h + +/-- Establishes the membership statement `x ∈ U.principalUnitSubgroup m`. -/ +theorem mem_of_mem_of_le {m n : ℕ} (h : m ≤ n) {x : G} + (hx : x ∈ U.principalUnitSubgroup n) : + x ∈ U.principalUnitSubgroup m := + U.principalUnitSubgroup_antitone h hx + +/-- Establishes the membership statement `(1 : G) ∈ U.principalUnitSubgroup n`. -/ +theorem one_mem_principalUnitSubgroup (n : ℕ) : + (1 : G) ∈ U.principalUnitSubgroup n := + (U.principalUnitSubgroup n).one_mem + +/-- Establishes the membership statement `x * y ∈ U.principalUnitSubgroup n`. -/ +theorem principalUnitSubgroup_mul_mem (n : ℕ) {x y : G} + (hx : x ∈ U.principalUnitSubgroup n) + (hy : y ∈ U.principalUnitSubgroup n) : + x * y ∈ U.principalUnitSubgroup n := + (U.principalUnitSubgroup n).mul_mem hx hy + +/-- Establishes the membership statement `x⁻¹ ∈ U.principalUnitSubgroup n`. -/ +theorem principalUnitSubgroup_inv_mem (n : ℕ) {x : G} + (hx : x ∈ U.principalUnitSubgroup n) : + x⁻¹ ∈ U.principalUnitSubgroup n := + (U.principalUnitSubgroup n).inv_mem hx + +/-- Establishes the membership statement `x / y ∈ U.principalUnitSubgroup n`. -/ +theorem principalUnitSubgroup_div_mem (n : ℕ) {x y : G} + (hx : x ∈ U.principalUnitSubgroup n) + (hy : y ∈ U.principalUnitSubgroup n) : + x / y ∈ U.principalUnitSubgroup n := by + simpa [div_eq_mul_inv] using + U.principalUnitSubgroup_mul_mem n hx (U.principalUnitSubgroup_inv_mem n hy) + +/-- Establishes the membership statement `x ^ m ∈ U.principalUnitSubgroup n`. -/ +theorem principalUnitSubgroup_pow_mem (n : ℕ) {x : G} + (hx : x ∈ U.principalUnitSubgroup n) (m : ℕ) : + x ^ m ∈ U.principalUnitSubgroup n := + (U.principalUnitSubgroup n).pow_mem hx m + +/-- Establishes the membership statement `x ^ m ∈ U.principalUnitSubgroup n`. -/ +theorem principalUnitSubgroup_zpow_mem (n : ℕ) {x : G} + (hx : x ∈ U.principalUnitSubgroup n) (m : ℤ) : + x ^ m ∈ U.principalUnitSubgroup n := + (U.principalUnitSubgroup n).zpow_mem hx m + +/-- Multiplication on the right by a same-level element preserves membership. -/ +theorem principalUnitSubgroup_mul_iff_right (n : ℕ) {x u : G} + (hu : u ∈ U.principalUnitSubgroup n) : + x * u ∈ U.principalUnitSubgroup n ↔ x ∈ U.principalUnitSubgroup n := by + constructor + · intro hxu + have h : (x * u) * u⁻¹ ∈ U.principalUnitSubgroup n := + U.principalUnitSubgroup_mul_mem n hxu + (U.principalUnitSubgroup_inv_mem n hu) + simpa [mul_assoc] using h + · intro hx + exact U.principalUnitSubgroup_mul_mem n hx hu + +/-- Multiplication on the left by a same-level element preserves membership. -/ +theorem principalUnitSubgroup_mul_iff_left (n : ℕ) {u x : G} + (hu : u ∈ U.principalUnitSubgroup n) : + u * x ∈ U.principalUnitSubgroup n ↔ x ∈ U.principalUnitSubgroup n := by + constructor + · intro hux + have h : u⁻¹ * (u * x) ∈ U.principalUnitSubgroup n := + U.principalUnitSubgroup_mul_mem n + (U.principalUnitSubgroup_inv_mem n hu) hux + simpa [mul_assoc] using h + · intro hx + exact U.principalUnitSubgroup_mul_mem n hu hx + +/-- Dividing on the right by a same-level element preserves membership. -/ +theorem principalUnitSubgroup_div_iff_right (n : ℕ) {x u : G} + (hu : u ∈ U.principalUnitSubgroup n) : + x / u ∈ U.principalUnitSubgroup n ↔ x ∈ U.principalUnitSubgroup n := by + simpa [div_eq_mul_inv] using + U.principalUnitSubgroup_mul_iff_right n (x := x) (u := u⁻¹) + (U.principalUnitSubgroup_inv_mem n hu) + +/-- Dividing a same-level element on the left by `x` detects membership of +`x`. -/ +theorem principalUnitSubgroup_div_iff_left (n : ℕ) {u x : G} + (hu : u ∈ U.principalUnitSubgroup n) : + u / x ∈ U.principalUnitSubgroup n ↔ x ∈ U.principalUnitSubgroup n := by + constructor + · intro hux + have h : u⁻¹ * (u / x) ∈ U.principalUnitSubgroup n := + U.principalUnitSubgroup_mul_mem n + (U.principalUnitSubgroup_inv_mem n hu) hux + have hxinv : x⁻¹ ∈ U.principalUnitSubgroup n := by + simpa [div_eq_mul_inv, mul_assoc] using h + simpa using U.principalUnitSubgroup_inv_mem n hxinv + · intro hx + exact U.principalUnitSubgroup_div_mem n hu hx + +/-- In a normal principal-unit filtration subgroup, the right quotient `x / y` +and left quotient `y⁻¹ * x` give the same membership test. -/ +theorem principalUnitSubgroup_div_mem_iff_inv_mul_mem + (n : ℕ) [(U.principalUnitSubgroup n).Normal] (x y : G) : + x / y ∈ U.principalUnitSubgroup n ↔ + y⁻¹ * x ∈ U.principalUnitSubgroup n := by + simpa [div_eq_mul_inv] using + ((inferInstance : (U.principalUnitSubgroup n).Normal).mem_comm_iff + (a := x) (b := y⁻¹)) + +/-- Left-quotient version of +`principalUnitSubgroup_div_mem_iff_inv_mul_mem`. -/ +theorem principalUnitSubgroup_inv_mul_mem_iff_div_mem + (n : ℕ) [(U.principalUnitSubgroup n).Normal] (x y : G) : + y⁻¹ * x ∈ U.principalUnitSubgroup n ↔ + x / y ∈ U.principalUnitSubgroup n := + (U.principalUnitSubgroup_div_mem_iff_inv_mul_mem n x y).symm + +/-- Kernel criterion in the quotient by a principal-unit filtration subgroup. -/ +theorem quotient_principalUnitSubgroup_mk_eq_one_iff + (n : ℕ) [(U.principalUnitSubgroup n).Normal] (x : G) : + QuotientGroup.mk' (U.principalUnitSubgroup n) x = 1 ↔ + x ∈ U.principalUnitSubgroup n := by + rw [QuotientGroup.mk'_apply] + exact QuotientGroup.eq_one_iff (N := U.principalUnitSubgroup n) x + +/-- Equality in the quotient by a principal-unit filtration subgroup, in +right-quotient form. -/ +theorem quotient_principalUnitSubgroup_mk_eq_iff_div_mem + (n : ℕ) [(U.principalUnitSubgroup n).Normal] (x y : G) : + QuotientGroup.mk' (U.principalUnitSubgroup n) x = + QuotientGroup.mk' (U.principalUnitSubgroup n) y ↔ + x / y ∈ U.principalUnitSubgroup n := by + simpa [QuotientGroup.mk'_apply] using + (QuotientGroup.eq_iff_div_mem + (N := U.principalUnitSubgroup n) (x := x) (y := y)) + +/-- Equality in the quotient by a principal-unit filtration subgroup, in +left-quotient form. -/ +theorem quotient_principalUnitSubgroup_mk_eq_iff_inv_mul_mem + (n : ℕ) [(U.principalUnitSubgroup n).Normal] (x y : G) : + QuotientGroup.mk' (U.principalUnitSubgroup n) x = + QuotientGroup.mk' (U.principalUnitSubgroup n) y ↔ + y⁻¹ * x ∈ U.principalUnitSubgroup n := by + rw [U.quotient_principalUnitSubgroup_mk_eq_iff_div_mem n x y, + U.principalUnitSubgroup_div_mem_iff_inv_mul_mem n x y] + +/-- The natural map from a finer filtration quotient to a coarser filtration +quotient. If `m ≤ n`, then `U^n ≤ U^m`, so quotienting by `U^n` maps to +quotienting by `U^m`. -/ +def quotientPrincipalUnitSubgroupMapOfLe {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] : + G ⧸ U.principalUnitSubgroup n →* + G ⧸ U.principalUnitSubgroup m := + QuotientGroup.map (U.principalUnitSubgroup n) (U.principalUnitSubgroup m) + (MonoidHom.id G) (by + intro x hx + exact U.mem_of_mem_of_le hmn hx) + +/-- +The defining evaluation formula for `quotientPrincipalUnitSubgroupMapOfLe` is +`U.quotientPrincipalUnitSubgroupMapOfLe hmn (QuotientGroup.mk x) = QuotientGroup.mk x`. +-/ +@[simp] theorem quotient_principalUnitSubgroup_mapOfLe_apply_mk + {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] (x : G) : + U.quotientPrincipalUnitSubgroupMapOfLe hmn (QuotientGroup.mk x) = + QuotientGroup.mk x := + rfl + +/-- +Establishes the identity `U.quotientPrincipalUnitSubgroupMapOfLe hmn (QuotientGroup.mk' +(U.principalUnitSubgroup n) x) = QuotientGroup.mk' (U.principalUnitSubgroup m) x`. +-/ +@[simp] theorem quotient_principalUnitSubgroup_mapOfLe_apply_mk' + {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] (x : G) : + U.quotientPrincipalUnitSubgroupMapOfLe hmn + (QuotientGroup.mk' (U.principalUnitSubgroup n) x) = + QuotientGroup.mk' (U.principalUnitSubgroup m) x := + rfl + +/-- The class of `U^m` inside `G ⧸ U^n`. For `m ≤ n`, this is the kernel of +the natural map `G ⧸ U^n →* G ⧸ U^m`. -/ +def principalUnitSubgroupClassInQuotient (m n : ℕ) + [(U.principalUnitSubgroup n).Normal] : + Subgroup (G ⧸ U.principalUnitSubgroup n) := + Subgroup.map (QuotientGroup.mk' (U.principalUnitSubgroup n)) + (U.principalUnitSubgroup m) + +/-- The subgroup appearing in `(U.principalUnitSubgroupClassInQuotient m n).Normal` is normal. -/ +instance principalUnitSubgroupClassInQuotient_normal + (m n : ℕ) [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] : + (U.principalUnitSubgroupClassInQuotient m n).Normal := by + dsimp [principalUnitSubgroupClassInQuotient] + infer_instance + +/-- +Characterizes `q ∈ U.principalUnitSubgroupClassInQuotient m n` by the equivalent condition `∃ x : +G, x ∈ U.principalUnitSubgroup m ∧ QuotientGroup.mk' (U.principalUnitSubgroup n) x = q`. +-/ +theorem mem_principalUnitSubgroupClassInQuotient_iff + (m n : ℕ) [(U.principalUnitSubgroup n).Normal] + (q : G ⧸ U.principalUnitSubgroup n) : + q ∈ U.principalUnitSubgroupClassInQuotient m n ↔ + ∃ x : G, x ∈ U.principalUnitSubgroup m ∧ + QuotientGroup.mk' (U.principalUnitSubgroup n) x = q := + Iff.rfl + +/-- +Establishes the membership statement `QuotientGroup.mk' (U.principalUnitSubgroup n) x ∈ +U.principalUnitSubgroupClassInQuotient m n`. +-/ +theorem principalUnitSubgroupClassInQuotient_mk_mem + {m n : ℕ} [(U.principalUnitSubgroup n).Normal] {x : G} + (hx : x ∈ U.principalUnitSubgroup m) : + QuotientGroup.mk' (U.principalUnitSubgroup n) x ∈ + U.principalUnitSubgroupClassInQuotient m n := + Subgroup.mem_map_of_mem + (QuotientGroup.mk' (U.principalUnitSubgroup n)) hx + +/-- The subquotient `U^m/U^n` of a principal-unit filtration. Under +`m ≤ n`, antitonicity makes this the usual quotient of `U^m` by `U^n`. -/ +def principalUnitSubquotient (m n : ℕ) : Type u := + U.principalUnitSubgroup m ⧸ + (U.principalUnitSubgroup n).subgroupOf (U.principalUnitSubgroup m) + +/-- +Equips the target with its canonical `Group` structure, namely `Group (U.principalUnitSubquotient +m n)`. +-/ +instance principalUnitSubquotientGroup + (m n : ℕ) [(U.principalUnitSubgroup n).Normal] : + Group (U.principalUnitSubquotient m n) := by + change Group + (U.principalUnitSubgroup m ⧸ + (U.principalUnitSubgroup n).subgroupOf + (U.principalUnitSubgroup m)) + infer_instance + +/-- Explicit access to the concrete quotient representation. -/ +def principalUnitSubquotientConcreteEquiv + (m n : ℕ) [(U.principalUnitSubgroup n).Normal] : + U.principalUnitSubquotient m n ≃* + (U.principalUnitSubgroup m ⧸ + (U.principalUnitSubgroup n).subgroupOf + (U.principalUnitSubgroup m)) := by + change + (U.principalUnitSubgroup m ⧸ + (U.principalUnitSubgroup n).subgroupOf + (U.principalUnitSubgroup m)) ≃* + (U.principalUnitSubgroup m ⧸ + (U.principalUnitSubgroup n).subgroupOf + (U.principalUnitSubgroup m)) + exact MulEquiv.refl _ + +/-- A subquotient of a commutative principal-unit filtration retains the +commutative group structure of its concrete quotient representation. -/ +instance principalUnitSubquotientCommGroup + {H : Type u} [CommGroup H] (V : AntitoneSubgroupFiltration H) + (m n : ℕ) [(V.principalUnitSubgroup n).Normal] : + CommGroup (V.principalUnitSubquotient m n) := + { (inferInstance : Group (V.principalUnitSubquotient m n)) with + mul_comm := fun x y => by + apply (V.principalUnitSubquotientConcreteEquiv m n).injective + simp only [map_mul] + exact mul_comm _ _ } + +/-- The canonical class map `U^m → U^m/U^n`. -/ +def principalUnitSubquotientMk + (m n : ℕ) [(U.principalUnitSubgroup n).Normal] : + U.principalUnitSubgroup m →* U.principalUnitSubquotient m n := by + change U.principalUnitSubgroup m →* + (U.principalUnitSubgroup m ⧸ + (U.principalUnitSubgroup n).subgroupOf + (U.principalUnitSubgroup m)) + exact QuotientGroup.mk' + ((U.principalUnitSubgroup n).subgroupOf + (U.principalUnitSubgroup m)) + +/-- +Establishes the identity `U.principalUnitSubquotientConcreteEquiv m n +(U.principalUnitSubquotientMk m n x) = QuotientGroup.mk x`. +-/ +@[simp] +theorem principalUnitSubquotientConcreteEquiv_mk + (m n : ℕ) [(U.principalUnitSubgroup n).Normal] + (x : U.principalUnitSubgroup m) : + U.principalUnitSubquotientConcreteEquiv m n + (U.principalUnitSubquotientMk m n x) = + QuotientGroup.mk x := + rfl + +/-- The specified map is surjective: `Function.Surjective (U.principalUnitSubquotientMk m n)`. -/ +theorem principalUnitSubquotientMk_surjective + (m n : ℕ) [(U.principalUnitSubgroup n).Normal] : + Function.Surjective (U.principalUnitSubquotientMk m n) := + QuotientGroup.mk'_surjective + ((U.principalUnitSubgroup n).subgroupOf + (U.principalUnitSubgroup m)) + +/-- Eliminate a principal-unit subquotient through its canonical map. -/ +protected theorem principalUnitSubquotient.inductionOn + (m n : ℕ) [(U.principalUnitSubgroup n).Normal] + {motive : U.principalUnitSubquotient m n → Prop} + (q : U.principalUnitSubquotient m n) + (h : ∀ x : U.principalUnitSubgroup m, + motive (U.principalUnitSubquotientMk m n x)) : + motive q := by + change motive + (show U.principalUnitSubgroup m ⧸ + (U.principalUnitSubgroup n).subgroupOf + (U.principalUnitSubgroup m) from q) + refine QuotientGroup.induction_on q ?_ + intro x + exact h x + +/-- Descend a homomorphism that kills `U^n` inside `U^m`. -/ +def principalUnitSubquotientLift + {H : Type*} [Group H] (m n : ℕ) + [(U.principalUnitSubgroup n).Normal] + (f : U.principalUnitSubgroup m →* H) + (h : (U.principalUnitSubgroup n).subgroupOf + (U.principalUnitSubgroup m) ≤ f.ker) : + U.principalUnitSubquotient m n →* H := by + change + (U.principalUnitSubgroup m ⧸ + (U.principalUnitSubgroup n).subgroupOf + (U.principalUnitSubgroup m)) →* H + exact QuotientGroup.lift + ((U.principalUnitSubgroup n).subgroupOf + (U.principalUnitSubgroup m)) f h + +/-- +Establishes the identity `U.principalUnitSubquotientLift m n f h (U.principalUnitSubquotientMk m n +x) = f x`. +-/ +@[simp] +theorem principalUnitSubquotientLift_mk + {H : Type*} [Group H] (m n : ℕ) + [(U.principalUnitSubgroup n).Normal] + (f : U.principalUnitSubgroup m →* H) + (h : (U.principalUnitSubgroup n).subgroupOf + (U.principalUnitSubgroup m) ≤ f.ker) + (x : U.principalUnitSubgroup m) : + U.principalUnitSubquotientLift m n f h + (U.principalUnitSubquotientMk m n x) = f x := + rfl + +/-- The principal-unit graded piece `U^n/U^{n+1}`. -/ +def principalUnitGradedPiece (n : ℕ) : Type u := + U.principalUnitSubquotient n (n + 1) + +/-- +Equips the target with its canonical `Group` structure, namely `Group (U.principalUnitGradedPiece +n)`. +-/ +instance principalUnitGradedPieceGroup + (n : ℕ) [(U.principalUnitSubgroup (n + 1)).Normal] : + Group (U.principalUnitGradedPiece n) := by + change Group (U.principalUnitSubquotient n (n + 1)) + infer_instance + +/-- The canonical class map into the adjacent graded piece. -/ +def principalUnitGradedPieceMk + (n : ℕ) [(U.principalUnitSubgroup (n + 1)).Normal] : + U.principalUnitSubgroup n →* U.principalUnitGradedPiece n := by + change U.principalUnitSubgroup n →* + U.principalUnitSubquotient n (n + 1) + exact U.principalUnitSubquotientMk n (n + 1) + +/-- Explicit identification of a graded piece with its named adjacent +subquotient. -/ +def principalUnitGradedPieceEquivSubquotient + (n : ℕ) [(U.principalUnitSubgroup (n + 1)).Normal] : + U.principalUnitGradedPiece n ≃* + U.principalUnitSubquotient n (n + 1) := by + change U.principalUnitSubquotient n (n + 1) ≃* + U.principalUnitSubquotient n (n + 1) + exact MulEquiv.refl _ + +/-- The type in `Finite (U.principalUnitGradedPiece n)` is finite. -/ +noncomputable instance principalUnitGradedPieceFinite + (n : ℕ) [(U.principalUnitSubgroup (n + 1)).Normal] + [Finite (U.principalUnitSubquotient n (n + 1))] : + Finite (U.principalUnitGradedPiece n) := + Finite.of_equiv (U.principalUnitSubquotient n (n + 1)) + (U.principalUnitGradedPieceEquivSubquotient n).symm.toEquiv + +/-- Cardinality bridge between the adjacent named subquotient and the graded +piece wrapper. -/ +theorem card_principalUnitSubquotient_succ_eq_gradedPiece + (n : ℕ) [(U.principalUnitSubgroup (n + 1)).Normal] : + Nat.card (U.principalUnitSubquotient n (n + 1)) = + Nat.card (U.principalUnitGradedPiece n) := + Nat.card_congr (U.principalUnitGradedPieceEquivSubquotient n).symm.toEquiv + +/-- Representative criterion for the identity in `U^m/U^n`. -/ +theorem principalUnitSubquotient_mk_eq_one_iff + {m n : ℕ} [(U.principalUnitSubgroup n).Normal] + (x : U.principalUnitSubgroup m) : + U.principalUnitSubquotientMk m n x = 1 ↔ + (x : G) ∈ U.principalUnitSubgroup n := by + change (QuotientGroup.mk x : + U.principalUnitSubgroup m ⧸ + (U.principalUnitSubgroup n).subgroupOf + (U.principalUnitSubgroup m)) = + 1 ↔ x ∈ (U.principalUnitSubgroup n).subgroupOf + (U.principalUnitSubgroup m) + exact QuotientGroup.eq_one_iff + (N := (U.principalUnitSubgroup n).subgroupOf + (U.principalUnitSubgroup m)) x + +/-- Representative equality criterion in `U^m/U^n`, in right-quotient form. -/ +theorem principalUnitSubquotient_mk_eq_iff_div_mem + {m n : ℕ} [(U.principalUnitSubgroup n).Normal] + (x y : U.principalUnitSubgroup m) : + U.principalUnitSubquotientMk m n x = + U.principalUnitSubquotientMk m n y ↔ + ((x / y : U.principalUnitSubgroup m) : G) ∈ + U.principalUnitSubgroup n := by + change (QuotientGroup.mk x : + U.principalUnitSubgroup m ⧸ + (U.principalUnitSubgroup n).subgroupOf + (U.principalUnitSubgroup m)) = + QuotientGroup.mk y ↔ _ + simpa [Subgroup.mem_subgroupOf] using + (QuotientGroup.eq_iff_div_mem + (N := (U.principalUnitSubgroup n).subgroupOf + (U.principalUnitSubgroup m)) (x := x) (y := y)) + +/-- Representative equality criterion in `U^m/U^n`, in left-quotient form. -/ +theorem principalUnitSubquotient_mk_eq_iff_inv_mul_mem + {m n : ℕ} [(U.principalUnitSubgroup n).Normal] + (x y : U.principalUnitSubgroup m) : + U.principalUnitSubquotientMk m n x = + U.principalUnitSubquotientMk m n y ↔ + ((y⁻¹ * x : U.principalUnitSubgroup m) : G) ∈ + U.principalUnitSubgroup n := by + rw [U.principalUnitSubquotient_mk_eq_iff_div_mem x y] + simpa [div_eq_mul_inv, Subgroup.mem_subgroupOf] using + ((inferInstance : + ((U.principalUnitSubgroup n).subgroupOf + (U.principalUnitSubgroup m)).Normal).mem_comm_iff + (a := x) (b := y⁻¹)) + +/-- The map from `U^m` into `G/U^n`. -/ +def principalUnitSubgroupToQuotient {m n : ℕ} (_hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] : + U.principalUnitSubgroup m →* G ⧸ U.principalUnitSubgroup n := + (QuotientGroup.mk' (U.principalUnitSubgroup n)).comp + (U.principalUnitSubgroup m).subtype + +/-- +The defining evaluation formula for `principalUnitSubgroupToQuotient` is +`U.principalUnitSubgroupToQuotient hmn x = QuotientGroup.mk' (U.principalUnitSubgroup n) (x : G)`. +-/ +@[simp] theorem principalUnitSubgroupToQuotient_apply + {m n : ℕ} (hmn : m ≤ n) [(U.principalUnitSubgroup n).Normal] + (x : U.principalUnitSubgroup m) : + U.principalUnitSubgroupToQuotient hmn x = + QuotientGroup.mk' (U.principalUnitSubgroup n) (x : G) := + rfl + +/-- The kernel of `U^m → G/U^n` is `U^n` inside `U^m`. -/ +theorem principalUnitSubgroupToQuotient_ker_eq + {m n : ℕ} (hmn : m ≤ n) [(U.principalUnitSubgroup n).Normal] : + (U.principalUnitSubgroupToQuotient hmn).ker = + (U.principalUnitSubgroup n).subgroupOf + (U.principalUnitSubgroup m) := by + ext x + rw [MonoidHom.mem_ker, Subgroup.mem_subgroupOf] + rw [principalUnitSubgroupToQuotient_apply, QuotientGroup.mk'_apply] + exact QuotientGroup.eq_one_iff (N := U.principalUnitSubgroup n) (x : G) + +/-- The range of `U^m → G/U^n` is the class of `U^m` in `G/U^n`. -/ +theorem principalUnitSubgroupToQuotient_range_eq_classInQuotient + {m n : ℕ} (hmn : m ≤ n) [(U.principalUnitSubgroup n).Normal] : + (U.principalUnitSubgroupToQuotient hmn).range = + U.principalUnitSubgroupClassInQuotient m n := by + ext q + constructor + · rintro ⟨x, rfl⟩ + exact ⟨(x : G), x.property, rfl⟩ + · rintro ⟨x, hx, rfl⟩ + exact ⟨⟨x, hx⟩, rfl⟩ + +/-- The subquotient `U^m/U^n` as the class of `U^m` inside `G/U^n`. -/ +noncomputable def principalUnitSubquotientEquivClassInQuotientOfLe + {m n : ℕ} (hmn : m ≤ n) [(U.principalUnitSubgroup n).Normal] : + U.principalUnitSubquotient m n ≃* + U.principalUnitSubgroupClassInQuotient m n := + (U.principalUnitSubquotientConcreteEquiv m n).trans + ((QuotientGroup.quotientMulEquivOfEq + (U.principalUnitSubgroupToQuotient_ker_eq hmn).symm).trans + ((QuotientGroup.quotientKerEquivRange + (U.principalUnitSubgroupToQuotient hmn)).trans + (MulEquiv.subgroupCongr + (U.principalUnitSubgroupToQuotient_range_eq_classInQuotient hmn)))) + +/-- +Establishes the identity `((U.principalUnitSubquotientEquivClassInQuotientOfLe hmn +(U.principalUnitSubquotientMk m n x) : U.principalUnitSubgroupClassInQuotient m n) : G ⧸ +U.principalUnitSubgroup n) = QuotientGroup.mk' (U.principalUnitSubgroup n) (x : G)`. +-/ +@[simp] theorem coe_principalUnitSubquotientEquivClassInQuotientOfLe_mk + {m n : ℕ} (hmn : m ≤ n) [(U.principalUnitSubgroup n).Normal] + (x : U.principalUnitSubgroup m) : + ((U.principalUnitSubquotientEquivClassInQuotientOfLe hmn + (U.principalUnitSubquotientMk m n x) : + U.principalUnitSubgroupClassInQuotient m n) : + G ⧸ U.principalUnitSubgroup n) = + QuotientGroup.mk' (U.principalUnitSubgroup n) (x : G) := by + simp [principalUnitSubquotientEquivClassInQuotientOfLe] + rfl + +/-- The graded piece `U^n/U^{n+1}` as the class of `U^n` inside +`G/U^{n+1}`. -/ +noncomputable def principalUnitGradedPieceEquivClassInQuotient + (n : ℕ) [(U.principalUnitSubgroup (n + 1)).Normal] : + U.principalUnitGradedPiece n ≃* + U.principalUnitSubgroupClassInQuotient n (n + 1) := + (U.principalUnitGradedPieceEquivSubquotient n).trans + (U.principalUnitSubquotientEquivClassInQuotientOfLe (Nat.le_succ n)) + +/-- +Establishes the identity `((U.principalUnitGradedPieceEquivClassInQuotient n +(U.principalUnitGradedPieceMk n x) : U.principalUnitSubgroupClassInQuotient n (n + 1)) : G ⧸ +U.principalUnitSubgroup (n + 1)) = QuotientGroup.mk' (U.principalUnitSubgroup (n + 1)) (x : G)`. +-/ +@[simp] theorem coe_principalUnitGradedPieceEquivClassInQuotient_mk + (n : ℕ) [(U.principalUnitSubgroup (n + 1)).Normal] + (x : U.principalUnitSubgroup n) : + ((U.principalUnitGradedPieceEquivClassInQuotient n + (U.principalUnitGradedPieceMk n x) : + U.principalUnitSubgroupClassInQuotient n (n + 1)) : + G ⧸ U.principalUnitSubgroup (n + 1)) = + QuotientGroup.mk' (U.principalUnitSubgroup (n + 1)) (x : G) := by + exact U.coe_principalUnitSubquotientEquivClassInQuotientOfLe_mk + (Nat.le_succ n) x + +/-- Kernel criterion on representatives for the natural map +`G ⧸ U^n →* G ⧸ U^m`. -/ +theorem quotient_principalUnitSubgroup_mapOfLe_mk_eq_one_iff + {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] (x : G) : + U.quotientPrincipalUnitSubgroupMapOfLe hmn (QuotientGroup.mk x) = 1 ↔ + x ∈ U.principalUnitSubgroup m := by + rw [U.quotient_principalUnitSubgroup_mapOfLe_apply_mk hmn x] + exact QuotientGroup.eq_one_iff (N := U.principalUnitSubgroup m) x + +/-- Equality criterion on representatives after the natural map +`G ⧸ U^n →* G ⧸ U^m`, in right-quotient form. -/ +theorem quotient_principalUnitSubgroup_mapOfLe_mk_eq_iff_div_mem + {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] (x y : G) : + U.quotientPrincipalUnitSubgroupMapOfLe hmn (QuotientGroup.mk x) = + U.quotientPrincipalUnitSubgroupMapOfLe hmn (QuotientGroup.mk y) ↔ + x / y ∈ U.principalUnitSubgroup m := by + rw [U.quotient_principalUnitSubgroup_mapOfLe_apply_mk hmn x, + U.quotient_principalUnitSubgroup_mapOfLe_apply_mk hmn y] + simpa using + (QuotientGroup.eq_iff_div_mem + (N := U.principalUnitSubgroup m) (x := x) (y := y)) + +/-- Equality criterion on representatives after the natural map +`G ⧸ U^n →* G ⧸ U^m`, in left-quotient form. -/ +theorem quotient_principalUnitSubgroup_mapOfLe_mk_eq_iff_inv_mul_mem + {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] (x y : G) : + U.quotientPrincipalUnitSubgroupMapOfLe hmn (QuotientGroup.mk x) = + U.quotientPrincipalUnitSubgroupMapOfLe hmn (QuotientGroup.mk y) ↔ + y⁻¹ * x ∈ U.principalUnitSubgroup m := by + rw [U.quotient_principalUnitSubgroup_mapOfLe_mk_eq_iff_div_mem hmn x y, + U.principalUnitSubgroup_div_mem_iff_inv_mul_mem m x y] + +/-- The natural map between filtration quotients is surjective. -/ +theorem quotient_principalUnitSubgroup_mapOfLe_surjective + {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] : + Function.Surjective (U.quotientPrincipalUnitSubgroupMapOfLe hmn) := by + intro q + refine QuotientGroup.induction_on q ?_ + intro x + exact ⟨QuotientGroup.mk x, + U.quotient_principalUnitSubgroup_mapOfLe_apply_mk hmn x⟩ + +/-- The natural map between filtration quotients has full range. -/ +theorem quotient_principalUnitSubgroup_mapOfLe_range_eq_top + {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] : + (U.quotientPrincipalUnitSubgroupMapOfLe hmn).range = ⊤ := by + rw [MonoidHom.range_eq_top] + exact U.quotient_principalUnitSubgroup_mapOfLe_surjective hmn + +/-- The kernel of `G ⧸ U^n →* G ⧸ U^m` is the image of `U^m` in +`G ⧸ U^n`. -/ +theorem quotient_principalUnitSubgroup_mapOfLe_ker_eq_classInQuotient + {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] : + (U.quotientPrincipalUnitSubgroupMapOfLe hmn).ker = + U.principalUnitSubgroupClassInQuotient m n := by + exact (QuotientGroup.ker_map (U.principalUnitSubgroup n) + (U.principalUnitSubgroup m) (MonoidHom.id G) (by + intro x hx + exact U.mem_of_mem_of_le hmn hx)).trans + (congrArg (Subgroup.map (QuotientGroup.mk' (U.principalUnitSubgroup n))) + (Subgroup.comap_id (U.principalUnitSubgroup m))) + +/-- Level-change maps send the class of `U^l` in `G/U^n` into the class of +`U^l` in `G/U^m`, for `l ≤ m ≤ n`. -/ +theorem quotient_principalUnitSubgroup_mapOfLe_mem_classInQuotient + {l m n : ℕ} (_hlm : l ≤ m) (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] + {q : G ⧸ U.principalUnitSubgroup n} + (hq : q ∈ U.principalUnitSubgroupClassInQuotient l n) : + U.quotientPrincipalUnitSubgroupMapOfLe hmn q ∈ + U.principalUnitSubgroupClassInQuotient l m := by + rcases (U.mem_principalUnitSubgroupClassInQuotient_iff l n q).1 hq with + ⟨x, hx, hxq⟩ + rw [← hxq, U.quotient_principalUnitSubgroup_mapOfLe_apply_mk'] + exact U.principalUnitSubgroupClassInQuotient_mk_mem hx + +/-- The level-change map restricted to principal-unit classes: +`U^l/U^n → U^l/U^m`, for `l ≤ m ≤ n`. -/ +def principalUnitClassMapOfLe {l m n : ℕ} (hlm : l ≤ m) (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] : + U.principalUnitSubgroupClassInQuotient l n →* + U.principalUnitSubgroupClassInQuotient l m := + ((U.quotientPrincipalUnitSubgroupMapOfLe hmn).domRestrict + (U.principalUnitSubgroupClassInQuotient l n)).codRestrict + (U.principalUnitSubgroupClassInQuotient l m) + (by + intro q + exact U.quotient_principalUnitSubgroup_mapOfLe_mem_classInQuotient + hlm hmn q.property) + +/-- +The defining evaluation formula for `principalUnitClassMapOfLe` is `((U.principalUnitClassMapOfLe +hlm hmn q : U.principalUnitSubgroupClassInQuotient l m) : G ⧸ U.principalUnitSubgroup m) = +U.quotientPrincipalUnitSubgroupMapOfLe hmn (q : G ⧸ U.principalUnitSubgroup n)`. +-/ +@[simp] theorem principalUnitClassMapOfLe_apply {l m n : ℕ} + (hlm : l ≤ m) (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] + (q : U.principalUnitSubgroupClassInQuotient l n) : + ((U.principalUnitClassMapOfLe hlm hmn q : + U.principalUnitSubgroupClassInQuotient l m) : + G ⧸ U.principalUnitSubgroup m) = + U.quotientPrincipalUnitSubgroupMapOfLe hmn + (q : G ⧸ U.principalUnitSubgroup n) := + rfl + +/-- The restricted map `U^l/U^n → U^l/U^m` has kernel `U^m/U^n`. -/ +theorem principalUnitClassMapOfLe_ker_eq {l m n : ℕ} + (hlm : l ≤ m) (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] : + (U.principalUnitClassMapOfLe hlm hmn).ker = + (U.principalUnitSubgroupClassInQuotient m n).subgroupOf + (U.principalUnitSubgroupClassInQuotient l n) := by + ext q + rw [MonoidHom.mem_ker, Subgroup.mem_subgroupOf] + constructor + · intro hq + have hq' := congrArg Subtype.val hq + change + U.quotientPrincipalUnitSubgroupMapOfLe hmn + (q : G ⧸ U.principalUnitSubgroup n) = 1 at hq' + rw [← U.quotient_principalUnitSubgroup_mapOfLe_ker_eq_classInQuotient hmn, + MonoidHom.mem_ker] + exact hq' + · intro hq + apply Subtype.ext + change + U.quotientPrincipalUnitSubgroupMapOfLe hmn + (q : G ⧸ U.principalUnitSubgroup n) = 1 + rw [← MonoidHom.mem_ker, + U.quotient_principalUnitSubgroup_mapOfLe_ker_eq_classInQuotient hmn] + exact hq + +/-- The restricted map `U^l/U^n → U^l/U^m` is surjective. -/ +theorem principalUnitClassMapOfLe_surjective {l m n : ℕ} + (hlm : l ≤ m) (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] : + Function.Surjective (U.principalUnitClassMapOfLe hlm hmn) := by + intro q + rcases q with ⟨q, hq⟩ + rcases (U.mem_principalUnitSubgroupClassInQuotient_iff l m q).1 hq with + ⟨x, hx, hxq⟩ + refine ⟨⟨QuotientGroup.mk' (U.principalUnitSubgroup n) x, + U.principalUnitSubgroupClassInQuotient_mk_mem hx⟩, ?_⟩ + apply Subtype.ext + rw [U.principalUnitClassMapOfLe_apply, U.quotient_principalUnitSubgroup_mapOfLe_apply_mk'] + exact hxq + +/-- First isomorphism theorem inside principal-unit classes: +`(U^l/U^n)/ker(U^l/U^n → U^l/U^m) ≃ U^l/U^m`, for `l ≤ m ≤ n`. +The kernel is identified with `U^m/U^n` by +`principalUnitClassMapOfLe_ker_eq`. -/ +noncomputable def principalUnitClassQuotientKerEquivClassOfLe {l m n : ℕ} + (hlm : l ≤ m) (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] : + U.principalUnitSubgroupClassInQuotient l n ⧸ + (U.principalUnitClassMapOfLe hlm hmn).ker ≃* + U.principalUnitSubgroupClassInQuotient l m := + QuotientGroup.quotientKerEquivOfSurjective + (U.principalUnitClassMapOfLe hlm hmn) + (U.principalUnitClassMapOfLe_surjective hlm hmn) + +/-- +Establishes the identity `U.principalUnitClassQuotientKerEquivClassOfLe hlm hmn (QuotientGroup.mk' +(U.principalUnitClassMapOfLe hlm hmn).ker q) = U.principalUnitClassMapOfLe hlm hmn q`. +-/ +theorem principalUnitClassQuotientKerEquivClassOfLe_mk' + {l m n : ℕ} (hlm : l ≤ m) (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] + (q : U.principalUnitSubgroupClassInQuotient l n) : + U.principalUnitClassQuotientKerEquivClassOfLe hlm hmn + (QuotientGroup.mk' (U.principalUnitClassMapOfLe hlm hmn).ker q) = + U.principalUnitClassMapOfLe hlm hmn q := by + exact QuotientGroup.kerLift_mk (U.principalUnitClassMapOfLe hlm hmn) q + +/-- The subgroup of `U^l/U^n` represented by `U^m/U^n` is canonically +the class of `U^m` in `G/U^n`. -/ +noncomputable def principalUnitClassSubgroupOfEquivClassOfLe {l m n : ℕ} + (hlm : l ≤ m) [(U.principalUnitSubgroup n).Normal] : + (U.principalUnitSubgroupClassInQuotient m n).subgroupOf + (U.principalUnitSubgroupClassInQuotient l n) ≃* + U.principalUnitSubgroupClassInQuotient m n where + toFun q := + ⟨((q : U.principalUnitSubgroupClassInQuotient l n) : + G ⧸ U.principalUnitSubgroup n), by + exact q.property⟩ + invFun q := + ⟨⟨(q : G ⧸ U.principalUnitSubgroup n), by + rcases (U.mem_principalUnitSubgroupClassInQuotient_iff m n + (q : G ⧸ U.principalUnitSubgroup n)).1 q.property with + ⟨x, hx, hxq⟩ + exact ⟨x, U.mem_of_mem_of_le hlm hx, hxq⟩⟩, by + change (q : G ⧸ U.principalUnitSubgroup n) ∈ + U.principalUnitSubgroupClassInQuotient m n + exact q.property⟩ + left_inv q := by + ext + rfl + right_inv q := by + ext + rfl + map_mul' q r := by + ext + rfl + +/-- Kernel form of `principalUnitClassMapOfLe_ker_eq`, with the kernel +identified as the class `U^m/U^n`. -/ +noncomputable def principalUnitClassMapOfLeKerEquivClass {l m n : ℕ} + (hlm : l ≤ m) (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] : + (U.principalUnitClassMapOfLe hlm hmn).ker ≃* + U.principalUnitSubgroupClassInQuotient m n := + (MulEquiv.subgroupCongr + (U.principalUnitClassMapOfLe_ker_eq hlm hmn)).trans + (U.principalUnitClassSubgroupOfEquivClassOfLe hlm) + +/-- Cardinality multiplication for three levels of a principal-unit +filtration: `#(U^l/U^n) = #(U^m/U^n) * #(U^l/U^m)`. -/ +theorem card_principalUnitClassInQuotient_eq_mul_of_le {l m n : ℕ} + (hlm : l ≤ m) (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] : + Nat.card (U.principalUnitSubgroupClassInQuotient l n) = + Nat.card (U.principalUnitSubgroupClassInQuotient m n) * + Nat.card (U.principalUnitSubgroupClassInQuotient l m) := by + let φ := U.principalUnitClassMapOfLe hlm hmn + calc + Nat.card (U.principalUnitSubgroupClassInQuotient l n) = + Nat.card φ.ker * φ.ker.index := by + exact (Subgroup.card_mul_index φ.ker).symm + _ = + Nat.card (U.principalUnitSubgroupClassInQuotient m n) * + Nat.card ((U.principalUnitSubgroupClassInQuotient l n) ⧸ φ.ker) := by + rw [Subgroup.index_eq_card] + rw [Nat.card_congr + (U.principalUnitClassMapOfLeKerEquivClass hlm hmn).toEquiv] + _ = + Nat.card (U.principalUnitSubgroupClassInQuotient m n) * + Nat.card (U.principalUnitSubgroupClassInQuotient l m) := by + rw [Nat.card_congr + (U.principalUnitClassQuotientKerEquivClassOfLe hlm hmn).toEquiv] + +/-- Cardinality form of the class/subquotient identification. -/ +theorem card_principalUnitSubquotient_eq_classInQuotient_of_le + {m n : ℕ} (hmn : m ≤ n) [(U.principalUnitSubgroup n).Normal] : + Nat.card (U.principalUnitSubquotient m n) = + Nat.card (U.principalUnitSubgroupClassInQuotient m n) := by + rw [Nat.card_congr + (U.principalUnitSubquotientEquivClassInQuotientOfLe hmn).toEquiv] + +/-- The degenerate subquotient `U^n/U^n` has cardinality one. -/ +theorem card_principalUnitSubquotient_self + (n : ℕ) : + Nat.card (U.principalUnitSubquotient n n) = 1 := by + have htop : + (U.principalUnitSubgroup n).subgroupOf + (U.principalUnitSubgroup n) = ⊤ := by + ext x + simp + change Nat.card + (U.principalUnitSubgroup n ⧸ + (U.principalUnitSubgroup n).subgroupOf + (U.principalUnitSubgroup n)) = 1 + rw [htop] + simp + +/-- Cardinality multiplication for principal-unit subquotients: +`#(U^l/U^n) = #(U^m/U^n) * #(U^l/U^m)`. -/ +theorem card_principalUnitSubquotient_eq_mul_of_le {l m n : ℕ} + (hlm : l ≤ m) (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] + [Finite (U.principalUnitSubquotient l n)] + [Finite (U.principalUnitSubquotient m n)] + [Finite (U.principalUnitSubquotient l m)] : + Nat.card (U.principalUnitSubquotient l n) = + Nat.card (U.principalUnitSubquotient m n) * + Nat.card (U.principalUnitSubquotient l m) := by + let : Finite (U.principalUnitSubgroupClassInQuotient l n) := + Finite.of_injective + (U.principalUnitSubquotientEquivClassInQuotientOfLe + (le_trans hlm hmn)).symm + (U.principalUnitSubquotientEquivClassInQuotientOfLe + (le_trans hlm hmn)).symm.injective + let : Finite (U.principalUnitSubgroupClassInQuotient m n) := + Finite.of_injective + (U.principalUnitSubquotientEquivClassInQuotientOfLe hmn).symm + (U.principalUnitSubquotientEquivClassInQuotientOfLe hmn).symm.injective + let : Finite (U.principalUnitSubgroupClassInQuotient l m) := + Finite.of_injective + (U.principalUnitSubquotientEquivClassInQuotientOfLe hlm).symm + (U.principalUnitSubquotientEquivClassInQuotientOfLe hlm).symm.injective + rw [U.card_principalUnitSubquotient_eq_classInQuotient_of_le + (le_trans hlm hmn)] + rw [U.card_principalUnitSubquotient_eq_classInQuotient_of_le hmn] + rw [U.card_principalUnitSubquotient_eq_classInQuotient_of_le hlm] + exact U.card_principalUnitClassInQuotient_eq_mul_of_le hlm hmn + +/-- Iterated cardinality form of the filtration counting argument: +`#(U^l/U^(l+r))` is the product of the adjacent graded-piece cardinalities. -/ +theorem card_principalUnitSubquotient_eq_prod_gradedPiece + (hN : ∀ i : ℕ, (U.principalUnitSubgroup i).Normal) + [∀ i j : ℕ, Finite (U.principalUnitSubquotient i j)] + (l r : ℕ) : + Nat.card (U.principalUnitSubquotient l (l + r)) = + ∏ i ∈ Finset.range r, + Nat.card (U.principalUnitGradedPiece (l + i)) := by + induction r with + | zero => + let := hN l + exact U.card_principalUnitSubquotient_self l + | succ r ih => + let := hN (l + r) + let := hN ((l + r) + 1) + calc + Nat.card (U.principalUnitSubquotient l (l + Nat.succ r)) = + Nat.card (U.principalUnitSubquotient l ((l + r) + 1)) := by + rw [Nat.add_succ] + _ = + Nat.card (U.principalUnitSubquotient (l + r) ((l + r) + 1)) * + Nat.card (U.principalUnitSubquotient l (l + r)) := by + exact U.card_principalUnitSubquotient_eq_mul_of_le + (Nat.le_add_right l r) (Nat.le_succ (l + r)) + _ = + Nat.card (U.principalUnitGradedPiece (l + r)) * + (∏ i ∈ Finset.range r, + Nat.card (U.principalUnitGradedPiece (l + i))) := by + rw [ih, + U.card_principalUnitSubquotient_succ_eq_gradedPiece] + _ = + ∏ i ∈ Finset.range (Nat.succ r), + Nat.card (U.principalUnitGradedPiece (l + i)) := by + rw [Finset.prod_range_succ] + rw [Nat.mul_comm] + +/-- +Characterizes `q ∈ (U.quotientPrincipalUnitSubgroupMapOfLe hmn).ker` by the equivalent condition +`q ∈ U.principalUnitSubgroupClassInQuotient m n`. +-/ +theorem mem_quotient_principalUnitSubgroup_mapOfLe_ker_iff + {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] + (q : G ⧸ U.principalUnitSubgroup n) : + q ∈ (U.quotientPrincipalUnitSubgroupMapOfLe hmn).ker ↔ + q ∈ U.principalUnitSubgroupClassInQuotient m n := by + rw [U.quotient_principalUnitSubgroup_mapOfLe_ker_eq_classInQuotient hmn] + +/-- Kernel criterion for arbitrary quotient elements under the natural +filtration level-change map. -/ +theorem quotient_principalUnitSubgroup_mapOfLe_eq_one_iff_mem_classInQuotient + {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] + (q : G ⧸ U.principalUnitSubgroup n) : + U.quotientPrincipalUnitSubgroupMapOfLe hmn q = 1 ↔ + q ∈ U.principalUnitSubgroupClassInQuotient m n := by + rw [← MonoidHom.mem_ker, + U.mem_quotient_principalUnitSubgroup_mapOfLe_ker_iff hmn q] + +/-- Kernel criterion for arbitrary quotient elements, expanded as a +representative lying in the coarser principal-unit subgroup. -/ +theorem quotient_principalUnitSubgroup_mapOfLe_eq_one_iff_exists_mem_repr + {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] + (q : G ⧸ U.principalUnitSubgroup n) : + U.quotientPrincipalUnitSubgroupMapOfLe hmn q = 1 ↔ + ∃ x : G, x ∈ U.principalUnitSubgroup m ∧ + QuotientGroup.mk' (U.principalUnitSubgroup n) x = q := by + rw [U.quotient_principalUnitSubgroup_mapOfLe_eq_one_iff_mem_classInQuotient + hmn q, + U.mem_principalUnitSubgroupClassInQuotient_iff m n q] + +/-- Equality criterion for arbitrary quotient elements after the natural +filtration level-change map, in right-quotient form. -/ +theorem quotient_principalUnitSubgroup_mapOfLe_eq_iff_div_mem_classInQuotient + {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] + (q r : G ⧸ U.principalUnitSubgroup n) : + U.quotientPrincipalUnitSubgroupMapOfLe hmn q = + U.quotientPrincipalUnitSubgroupMapOfLe hmn r ↔ + q / r ∈ U.principalUnitSubgroupClassInQuotient m n := by + rw [← U.quotient_principalUnitSubgroup_mapOfLe_ker_eq_classInQuotient hmn, + MonoidHom.mem_ker, MonoidHom.map_div, div_eq_one] + +/-- Equality criterion for arbitrary quotient elements after the natural +filtration level-change map, expanded as a representative of `q / r` lying in +the coarser principal-unit subgroup. -/ +theorem quotient_principalUnitSubgroup_mapOfLe_eq_iff_exists_mem_div_repr + {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] + (q r : G ⧸ U.principalUnitSubgroup n) : + U.quotientPrincipalUnitSubgroupMapOfLe hmn q = + U.quotientPrincipalUnitSubgroupMapOfLe hmn r ↔ + ∃ x : G, x ∈ U.principalUnitSubgroup m ∧ + QuotientGroup.mk' (U.principalUnitSubgroup n) x = q / r := by + rw [U.quotient_principalUnitSubgroup_mapOfLe_eq_iff_div_mem_classInQuotient + hmn q r, + U.mem_principalUnitSubgroupClassInQuotient_iff m n (q / r)] + +/-- Equality criterion for arbitrary quotient elements after the natural +filtration level-change map, in left-quotient form. -/ +theorem quotient_principalUnitSubgroup_mapOfLe_eq_iff_inv_mul_mem_classInQuotient + {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] + (q r : G ⧸ U.principalUnitSubgroup n) : + U.quotientPrincipalUnitSubgroupMapOfLe hmn q = + U.quotientPrincipalUnitSubgroupMapOfLe hmn r ↔ + r⁻¹ * q ∈ U.principalUnitSubgroupClassInQuotient m n := by + rw [U.quotient_principalUnitSubgroup_mapOfLe_eq_iff_div_mem_classInQuotient + hmn q r] + simpa [div_eq_mul_inv] using + ((inferInstance : + (U.principalUnitSubgroupClassInQuotient m n).Normal).mem_comm_iff + (a := q) (b := r⁻¹)) + +/-- Equality criterion for arbitrary quotient elements after the natural +filtration level-change map, expanded as a representative of `r⁻¹ * q` lying +in the coarser principal-unit subgroup. -/ +theorem quotient_principalUnitSubgroup_mapOfLe_eq_iff_exists_mem_inv_mul_repr + {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] + (q r : G ⧸ U.principalUnitSubgroup n) : + U.quotientPrincipalUnitSubgroupMapOfLe hmn q = + U.quotientPrincipalUnitSubgroupMapOfLe hmn r ↔ + ∃ x : G, x ∈ U.principalUnitSubgroup m ∧ + QuotientGroup.mk' (U.principalUnitSubgroup n) x = r⁻¹ * q := by + rw [U.quotient_principalUnitSubgroup_mapOfLe_eq_iff_inv_mul_mem_classInQuotient + hmn q r, + U.mem_principalUnitSubgroupClassInQuotient_iff m n (r⁻¹ * q)] + +/-- +Characterizes `QuotientGroup.mk' (U.principalUnitSubgroup n) x ∈ +U.principalUnitSubgroupClassInQuotient m n` by the equivalent condition `x ∈ +U.principalUnitSubgroup m`. +-/ +theorem quotient_principalUnitSubgroup_mk_mem_classInQuotient_iff + {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] (x : G) : + QuotientGroup.mk' (U.principalUnitSubgroup n) x ∈ + U.principalUnitSubgroupClassInQuotient m n ↔ + x ∈ U.principalUnitSubgroup m := by + rw [← U.quotient_principalUnitSubgroup_mapOfLe_ker_eq_classInQuotient hmn] + change + U.quotientPrincipalUnitSubgroupMapOfLe hmn + (QuotientGroup.mk' (U.principalUnitSubgroup n) x) = 1 ↔ + x ∈ U.principalUnitSubgroup m + rw [U.quotient_principalUnitSubgroup_mapOfLe_apply_mk' hmn x] + exact QuotientGroup.eq_one_iff (N := U.principalUnitSubgroup m) x + +/-- The third-isomorphism equivalence for principal-unit filtration quotients: +`(G / U^n) / (U^m / U^n) ≃ G / U^m` when `m ≤ n`. -/ +noncomputable def quotientModuloPrincipalUnitClassEquivQuotientOfLe + {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] : + (G ⧸ U.principalUnitSubgroup n) ⧸ + U.principalUnitSubgroupClassInQuotient m n ≃* + G ⧸ U.principalUnitSubgroup m := + QuotientGroup.quotientQuotientEquivQuotient + (U.principalUnitSubgroup n) (U.principalUnitSubgroup m) + (U.principalUnitSubgroup_antitone hmn) + +/-- +Establishes the identity `U.quotientModuloPrincipalUnitClassEquivQuotientOfLe hmn +(QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) q) = +U.quotientPrincipalUnitSubgroupMapOfLe hmn q`. +-/ +theorem quotientModuloPrincipalUnitClassEquivQuotientOfLe_mk + {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] + (q : G ⧸ U.principalUnitSubgroup n) : + U.quotientModuloPrincipalUnitClassEquivQuotientOfLe hmn + (QuotientGroup.mk' + (U.principalUnitSubgroupClassInQuotient m n) q) = + U.quotientPrincipalUnitSubgroupMapOfLe hmn q := by + change + QuotientGroup.quotientQuotientEquivQuotientAux + (U.principalUnitSubgroup n) (U.principalUnitSubgroup m) + (U.principalUnitSubgroup_antitone hmn) q = + U.quotientPrincipalUnitSubgroupMapOfLe hmn q + exact + QuotientGroup.quotientQuotientEquivQuotientAux_mk + (N := U.principalUnitSubgroup n) + (M := U.principalUnitSubgroup m) + (h := U.principalUnitSubgroup_antitone hmn) q + +/-- +Establishes the identity `U.quotientModuloPrincipalUnitClassEquivQuotientOfLe hmn +(QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) (QuotientGroup.mk' +(U.principalUnitSubgroup n) x)) = QuotientGroup.mk' (U.principalUnitSubgroup m) x`. +-/ +theorem quotientModuloPrincipalUnitClassEquivQuotientOfLe_mk_mk + {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] (x : G) : + U.quotientModuloPrincipalUnitClassEquivQuotientOfLe hmn + (QuotientGroup.mk' + (U.principalUnitSubgroupClassInQuotient m n) + (QuotientGroup.mk' (U.principalUnitSubgroup n) x)) = + QuotientGroup.mk' (U.principalUnitSubgroup m) x := by + rw [U.quotientModuloPrincipalUnitClassEquivQuotientOfLe_mk hmn, + U.quotient_principalUnitSubgroup_mapOfLe_apply_mk' hmn x] + +/-- +Establishes the identity `(U.quotientModuloPrincipalUnitClassEquivQuotientOfLe hmn).symm +(QuotientGroup.mk' (U.principalUnitSubgroup m) x) = QuotientGroup.mk' +(U.principalUnitSubgroupClassInQuotient m n) (QuotientGroup.mk' (U.principalUnitSubgroup n) x)`. +-/ +theorem quotientModuloPrincipalUnitClassEquivQuotientOfLe_symm_mk + {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] (x : G) : + (U.quotientModuloPrincipalUnitClassEquivQuotientOfLe hmn).symm + (QuotientGroup.mk' (U.principalUnitSubgroup m) x) = + QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) + (QuotientGroup.mk' (U.principalUnitSubgroup n) x) := by + apply (U.quotientModuloPrincipalUnitClassEquivQuotientOfLe hmn).injective + calc + U.quotientModuloPrincipalUnitClassEquivQuotientOfLe hmn + ((U.quotientModuloPrincipalUnitClassEquivQuotientOfLe hmn).symm + (QuotientGroup.mk' (U.principalUnitSubgroup m) x)) = + QuotientGroup.mk' (U.principalUnitSubgroup m) x := by + exact (U.quotientModuloPrincipalUnitClassEquivQuotientOfLe hmn).apply_symm_apply _ + _ = + U.quotientModuloPrincipalUnitClassEquivQuotientOfLe hmn + (QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) + (QuotientGroup.mk' (U.principalUnitSubgroup n) x)) := by + rw [U.quotientModuloPrincipalUnitClassEquivQuotientOfLe_mk_mk hmn x] + +/-- One criterion in the double quotient by the class of `U^m` in +`G ⧸ U^n`. -/ +theorem quotientModuloPrincipalUnitClass_mk_eq_one_iff + (m n : ℕ) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] + (q : G ⧸ U.principalUnitSubgroup n) : + QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) q = 1 ↔ + q ∈ U.principalUnitSubgroupClassInQuotient m n := by + rw [QuotientGroup.mk'_apply] + exact QuotientGroup.eq_one_iff + (N := U.principalUnitSubgroupClassInQuotient m n) q + +/-- One criterion in the double quotient, expanded as a representative in the +coarser principal-unit subgroup. -/ +theorem quotientModuloPrincipalUnitClass_mk_eq_one_iff_exists_mem_repr + (m n : ℕ) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] + (q : G ⧸ U.principalUnitSubgroup n) : + QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) q = 1 ↔ + ∃ x : G, x ∈ U.principalUnitSubgroup m ∧ + QuotientGroup.mk' (U.principalUnitSubgroup n) x = q := by + rw [U.quotientModuloPrincipalUnitClass_mk_eq_one_iff m n q, + U.mem_principalUnitSubgroupClassInQuotient_iff m n q] + +/-- +Characterizes `QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) (QuotientGroup.mk' +(U.principalUnitSubgroup n) x) = 1` by the equivalent condition `x ∈ U.principalUnitSubgroup m`. +-/ +theorem quotientModuloPrincipalUnitClass_mk_mk_eq_one_iff + {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] (x : G) : + QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) + (QuotientGroup.mk' (U.principalUnitSubgroup n) x) = 1 ↔ + x ∈ U.principalUnitSubgroup m := by + rw [U.quotientModuloPrincipalUnitClass_mk_eq_one_iff m n, + U.quotient_principalUnitSubgroup_mk_mem_classInQuotient_iff hmn x] + +/-- Equality criterion in the double quotient by the class of `U^m` in +`G ⧸ U^n`. -/ +theorem quotientModuloPrincipalUnitClass_mk_eq_iff_div_mem + (m n : ℕ) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] + (q r : G ⧸ U.principalUnitSubgroup n) : + QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) q = + QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) r ↔ + q / r ∈ U.principalUnitSubgroupClassInQuotient m n := by + simpa [QuotientGroup.mk'_apply] using + (QuotientGroup.eq_iff_div_mem + (N := U.principalUnitSubgroupClassInQuotient m n) + (x := q) (y := r)) + +/-- Equality criterion in the double quotient, expanded as a representative of +`q / r` lying in the coarser principal-unit subgroup. -/ +theorem quotientModuloPrincipalUnitClass_mk_eq_iff_exists_mem_div_repr + (m n : ℕ) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] + (q r : G ⧸ U.principalUnitSubgroup n) : + QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) q = + QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) r ↔ + ∃ x : G, x ∈ U.principalUnitSubgroup m ∧ + QuotientGroup.mk' (U.principalUnitSubgroup n) x = q / r := by + rw [U.quotientModuloPrincipalUnitClass_mk_eq_iff_div_mem m n q r, + U.mem_principalUnitSubgroupClassInQuotient_iff m n (q / r)] + +/-- Equality criterion in the double quotient, in left-quotient form. -/ +theorem quotientModuloPrincipalUnitClass_mk_eq_iff_inv_mul_mem + (m n : ℕ) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] + (q r : G ⧸ U.principalUnitSubgroup n) : + QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) q = + QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) r ↔ + r⁻¹ * q ∈ U.principalUnitSubgroupClassInQuotient m n := by + rw [U.quotientModuloPrincipalUnitClass_mk_eq_iff_div_mem m n q r] + simpa [div_eq_mul_inv] using + ((inferInstance : + (U.principalUnitSubgroupClassInQuotient m n).Normal).mem_comm_iff + (a := q) (b := r⁻¹)) + +/-- Equality criterion in the double quotient, expanded as a representative of +`r⁻¹ * q` lying in the coarser principal-unit subgroup. -/ +theorem quotientModuloPrincipalUnitClass_mk_eq_iff_exists_mem_inv_mul_repr + (m n : ℕ) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] + (q r : G ⧸ U.principalUnitSubgroup n) : + QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) q = + QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) r ↔ + ∃ x : G, x ∈ U.principalUnitSubgroup m ∧ + QuotientGroup.mk' (U.principalUnitSubgroup n) x = r⁻¹ * q := by + rw [U.quotientModuloPrincipalUnitClass_mk_eq_iff_inv_mul_mem m n q r, + U.mem_principalUnitSubgroupClassInQuotient_iff m n (r⁻¹ * q)] + +/-- +Characterizes `QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) (QuotientGroup.mk' +(U.principalUnitSubgroup n) x) = QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) +(QuotientGroup.mk' (U.principalUnitSubgroup n) y)` by the equivalent condition `x / y ∈ +U.principalUnitSubgroup m`. +-/ +theorem quotientModuloPrincipalUnitClass_mk_mk_eq_iff_div_mem + {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] (x y : G) : + QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) + (QuotientGroup.mk' (U.principalUnitSubgroup n) x) = + QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) + (QuotientGroup.mk' (U.principalUnitSubgroup n) y) ↔ + x / y ∈ U.principalUnitSubgroup m := by + rw [U.quotientModuloPrincipalUnitClass_mk_eq_iff_div_mem m n] + rw [← (QuotientGroup.mk' (U.principalUnitSubgroup n)).map_div x y, + U.quotient_principalUnitSubgroup_mk_mem_classInQuotient_iff hmn (x / y)] + +/-- +Characterizes `QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) (QuotientGroup.mk' +(U.principalUnitSubgroup n) x) = QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) +(QuotientGroup.mk' (U.principalUnitSubgroup n) y)` by the equivalent condition `y⁻¹ * x ∈ +U.principalUnitSubgroup m`. +-/ +theorem quotientModuloPrincipalUnitClass_mk_mk_eq_iff_inv_mul_mem + {m n : ℕ} (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] (x y : G) : + QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) + (QuotientGroup.mk' (U.principalUnitSubgroup n) x) = + QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) + (QuotientGroup.mk' (U.principalUnitSubgroup n) y) ↔ + y⁻¹ * x ∈ U.principalUnitSubgroup m := by + rw [U.quotientModuloPrincipalUnitClass_mk_mk_eq_iff_div_mem hmn x y, + U.principalUnitSubgroup_div_mem_iff_inv_mul_mem m x y] + +/-- The natural maps between filtration quotients compose as expected. -/ +theorem quotient_principalUnitSubgroup_mapOfLe_comp + {k m n : ℕ} (hkm : k ≤ m) (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] + [(U.principalUnitSubgroup k).Normal] : + (U.quotientPrincipalUnitSubgroupMapOfLe hkm).comp + (U.quotientPrincipalUnitSubgroupMapOfLe hmn) = + U.quotientPrincipalUnitSubgroupMapOfLe (le_trans hkm hmn) := by + apply MonoidHom.ext + intro q + refine QuotientGroup.induction_on q ?_ + intro x + simp [quotient_principalUnitSubgroup_mapOfLe_apply_mk] + +/-- The level-change map for `n ≤ n` is the identity. -/ +theorem quotient_principalUnitSubgroup_mapOfLe_refl + (n : ℕ) [(U.principalUnitSubgroup n).Normal] : + U.quotientPrincipalUnitSubgroupMapOfLe (le_rfl : n ≤ n) = + MonoidHom.id (G ⧸ U.principalUnitSubgroup n) := by + apply MonoidHom.ext + intro q + refine QuotientGroup.induction_on q ?_ + intro x + simp [quotient_principalUnitSubgroup_mapOfLe_apply_mk] + +/-- The class of `U^n` in `G/U^n` is trivial. -/ +theorem principalUnitSubgroupClassInQuotient_refl_eq_bot + (n : ℕ) [(U.principalUnitSubgroup n).Normal] : + U.principalUnitSubgroupClassInQuotient n n = ⊥ := by + rw [← U.quotient_principalUnitSubgroup_mapOfLe_ker_eq_classInQuotient + (le_rfl : n ≤ n), + U.quotient_principalUnitSubgroup_mapOfLe_refl n] + simp + +/-- The restricted level-change map for `n ≤ n` is the identity on +`U^l/U^n`. -/ +theorem principalUnitClassMapOfLe_refl + {l n : ℕ} (hln : l ≤ n) [(U.principalUnitSubgroup n).Normal] : + U.principalUnitClassMapOfLe hln (le_rfl : n ≤ n) = + MonoidHom.id (U.principalUnitSubgroupClassInQuotient l n) := by + apply MonoidHom.ext + intro q + apply Subtype.ext + change + U.quotientPrincipalUnitSubgroupMapOfLe (le_rfl : n ≤ n) + (q : G ⧸ U.principalUnitSubgroup n) = + (q : G ⧸ U.principalUnitSubgroup n) + rw [U.quotient_principalUnitSubgroup_mapOfLe_refl n] + rfl + +/-- Restricted principal-unit class maps compose transitively. -/ +theorem principalUnitClassMapOfLe_comp + {k l m n : ℕ} (hkl : k ≤ l) (hlm : l ≤ m) (hmn : m ≤ n) + [(U.principalUnitSubgroup n).Normal] + [(U.principalUnitSubgroup m).Normal] + [(U.principalUnitSubgroup l).Normal] : + (U.principalUnitClassMapOfLe hkl hlm).comp + (U.principalUnitClassMapOfLe (le_trans hkl hlm) hmn) = + U.principalUnitClassMapOfLe hkl (le_trans hlm hmn) := by + apply MonoidHom.ext + intro q + apply Subtype.ext + change + U.quotientPrincipalUnitSubgroupMapOfLe hlm + (U.quotientPrincipalUnitSubgroupMapOfLe hmn + (q : G ⧸ U.principalUnitSubgroup n)) = + U.quotientPrincipalUnitSubgroupMapOfLe (le_trans hlm hmn) + (q : G ⧸ U.principalUnitSubgroup n) + change + ((U.quotientPrincipalUnitSubgroupMapOfLe hlm).comp + (U.quotientPrincipalUnitSubgroupMapOfLe hmn)) + (q : G ⧸ U.principalUnitSubgroup n) = + U.quotientPrincipalUnitSubgroupMapOfLe (le_trans hlm hmn) + (q : G ⧸ U.principalUnitSubgroup n) + rw [U.quotient_principalUnitSubgroup_mapOfLe_comp hlm hmn] + +end AntitoneSubgroupFiltration + +end DiscreteValuationField + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits.lean new file mode 100644 index 0000000000..96198ca3fe --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits.lean @@ -0,0 +1,22 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuedExtensionUnitMap + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CompleteRangeRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CompleteRangeRestriction.lean new file mode 100644 index 0000000000..31b82fd6d2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CompleteRangeRestriction.lean @@ -0,0 +1,276 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal +public import Mathlib.RingTheory.AdicCompletion.Topology +/-! +# Range restriction for complete discretely valued fields + +This file specializes multiplicative-range restriction to `CompleteDVF` and +transports residue finiteness, adic completeness, cyclicity, and discreteness. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +open WithZero +open scoped NNReal Valued WithZero + +namespace LocalFieldTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField + +namespace CompleteDVF + +variable {K : Type u} [Field K] + +/-- Restrict the chosen valuation of a complete DVF to its actual +multiplicative range. This keeps the valuation ring, maximal ideal, and +residue field unchanged while eliminating irrelevant ambient value-group +elements. -/ +def mrangeRestrict (F : CompleteDVF.{u, v} K) : + _root_.Valuation K (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + WithZeroValuation.mrangeRestrict F.valuation + +/-- +The defining evaluation formula for `mrangeRestrict` is `((CompleteDVF.mrangeRestrict F) x : +F.ValueGroup) = F.valuation x`. +-/ +@[simp] +theorem mrangeRestrict_apply (F : CompleteDVF.{u, v} K) (x : K) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) x : F.ValueGroup) = + F.valuation x := + rfl + +/-- The residue field remains finite after restricting the value group to the +actual multiplicative range. -/ +theorem mrangeRestrict_residueField_finite + (F : CompleteDVF.{u, v} K) [Finite F.residueField] : + Finite (IsLocalRing.ResidueField + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring) := + Finite.of_equiv F.residueField + (WithZeroValuation.residueFieldEquivMrangeRestrict + F.valuation).toEquiv + +/-- The range-restricted valuation ring is adically complete because it is +identified with the original complete-DVF valuation ring and the maximal ideal +is preserved by that identification. -/ +theorem mrangeRestrict_isAdicComplete + (F : CompleteDVF.{u, v} K) : + IsAdicComplete + (IsLocalRing.maximalIdeal + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring) + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring := by + let e : F.valuationSubring ≃+* + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring := + WithZeroValuation.valuationSubringEquivMrangeRestrict + F.valuation + let : Algebra F.valuationSubring + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring := + e.toRingHom.toAlgebra + let eLin : + F.valuationSubring ≃ₗ[F.valuationSubring] + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring := + { toFun := e + invFun := e.symm + left_inv := e.left_inv + right_inv := e.right_inv + map_add' := e.map_add + map_smul' := by + intro a x + change e (a * x) = + (algebraMap F.valuationSubring + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F).valuationSubring a) * e x + simp [RingHom.algebraMap_toAlgebra] } + have hcompleteBase : IsAdicComplete F.maximalIdeal F.valuationSubring := + F.isAdicComplete + let : IsAdicComplete F.maximalIdeal F.valuationSubring := hcompleteBase + have hcompleteAsBase : + IsAdicComplete F.maximalIdeal + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring := + isAdicComplete_of_linearEquiv + (M := F.valuationSubring) + (N := (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring) + F.maximalIdeal eLin + have hcompleteMap : + IsAdicComplete + (F.maximalIdeal.map + (algebraMap F.valuationSubring + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F).valuationSubring)) + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring := + (isAdicComplete_map_algebraMap_iff + (I := F.maximalIdeal) + (S := (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F).valuationSubring)).2 hcompleteAsBase + have hmap : + F.maximalIdeal.map + (algebraMap F.valuationSubring + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F).valuationSubring) = + IsLocalRing.maximalIdeal + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F).valuationSubring := by + change + F.maximalIdeal.map + (e : F.valuationSubring →+* + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F).valuationSubring) = + IsLocalRing.maximalIdeal + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring + exact IsLocalRing.map_ringEquiv_maximalIdeal e + simpa [hmap] using hcompleteMap + +/-- The actual multiplicative range of a complete-DVF valuation is generated +by the image of a discrete valuation generator. -/ +theorem mrangeRestrict_units_isCyclic + (F : CompleteDVF.{u, v} K) : + IsCyclic (MonoidHom.mrange F.valuation.toMonoidWithZeroHom)ˣ := by + let γ : F.ValueGroupˣ := + _root_.Valuation.IsRankOneDiscrete.generator F.valuation + have hγrange : (γ : F.ValueGroup) ∈ Set.range F.valuation := + _root_.Valuation.IsRankOneDiscrete.generator_mem_range K F.valuation + let γm : MonoidHom.mrange F.valuation.toMonoidWithZeroHom := + ⟨(γ : F.ValueGroup), hγrange⟩ + have hγm_ne : γm ≠ 0 := by + intro hzero + have hγzero : (γ : F.ValueGroup) = 0 := by + simpa [γm] using + congrArg + (fun z : MonoidHom.mrange + F.valuation.toMonoidWithZeroHom => (z : F.ValueGroup)) + hzero + exact Units.ne_zero γ hγzero + let δ : (MonoidHom.mrange F.valuation.toMonoidWithZeroHom)ˣ := + Units.mk0 γm hγm_ne + have htop : Subgroup.zpowers δ = ⊤ := by + rw [eq_top_iff] + intro η _ + have hη_ne : ((η : MonoidHom.mrange + F.valuation.toMonoidWithZeroHom) : F.ValueGroup) ≠ 0 := by + intro hzero + have hηzero : + (η : MonoidHom.mrange + F.valuation.toMonoidWithZeroHom) = 0 := by + ext + exact hzero + exact Units.ne_zero η hηzero + obtain ⟨x, hx⟩ := + MonoidHom.mem_mrange.mp + ((η : MonoidHom.mrange + F.valuation.toMonoidWithZeroHom).2) + let ηΓ : F.ValueGroupˣ := + Units.mk0 + (((η : MonoidHom.mrange + F.valuation.toMonoidWithZeroHom) : F.ValueGroup)) + hη_ne + have hηΓ_mem : + ηΓ ∈ MonoidWithZeroHom.valueGroup + (MonoidWithZeroHom.ofClass F.valuation) := + MonoidWithZeroHom.mem_valueGroup + (MonoidWithZeroHom.ofClass F.valuation) ⟨x, hx⟩ + rw [← _root_.Valuation.IsRankOneDiscrete.generator_zpowers_eq_valueGroup + F.valuation, Subgroup.mem_zpowers_iff] at hηΓ_mem + rcases hηΓ_mem with ⟨z, hz⟩ + rw [Subgroup.mem_zpowers_iff] + refine ⟨z, ?_⟩ + let φ : + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom)ˣ →* + F.ValueGroupˣ := + Units.map (MonoidHom.mrange F.valuation.toMonoidWithZeroHom).subtype + have hsub_inj : + Function.Injective + ((MonoidHom.mrange F.valuation.toMonoidWithZeroHom).subtype) := by + intro a b h + exact Subtype.ext h + have hφinj : Function.Injective φ := + Units.map_injective hsub_inj + have hφδ : φ δ = γ := by + apply Units.ext + rfl + have hφη : φ η = ηΓ := by + apply Units.ext + rfl + apply hφinj + calc + φ (δ ^ z) = φ δ ^ z := map_zpow φ δ z + _ = γ ^ z := by rw [hφδ] + _ = ηΓ := hz + _ = φ η := hφη.symm + exact (isCyclic_iff_exists_zpowers_eq_top).2 ⟨δ, htop⟩ + +/-- The range-restricted valuation is nontrivial whenever the original +complete-DVF valuation is nontrivial. -/ +theorem mrangeRestrict_isNontrivial + (F : CompleteDVF.{u, v} K) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).IsNontrivial := by + rcases _root_.Valuation.IsNontrivial.exists_val_nontrivial + (v := F.valuation) with ⟨x, hx0, hx1⟩ + refine ⟨⟨x, ?_, ?_⟩⟩ + · intro hx + exact hx0 (by + have h := + congrArg + (fun z : MonoidHom.mrange + F.valuation.toMonoidWithZeroHom => (z : F.ValueGroup)) hx + simpa [CompleteDVF.mrangeRestrict, WithZeroValuation.mrangeRestrict] using h) + · intro hx + exact hx1 (by + have h := + congrArg + (fun z : MonoidHom.mrange + F.valuation.toMonoidWithZeroHom => (z : F.ValueGroup)) hx + simpa [CompleteDVF.mrangeRestrict, WithZeroValuation.mrangeRestrict] using h) + +/-- Restricting a complete-DVF valuation to its actual multiplicative range +preserves rank-one discreteness. -/ +theorem mrangeRestrict_isRankOneDiscrete + (F : CompleteDVF.{u, v} K) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).IsRankOneDiscrete := by + have : + IsCyclic + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom)ˣ := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_units_isCyclic F) + have : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).IsNontrivial := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_isNontrivial F) + have : + IsCyclic (MonoidWithZeroHom.valueGroup + (MonoidWithZeroHom.ofClass + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F))) := + Subgroup.isCyclic_of_le (show + MonoidWithZeroHom.valueGroup + (MonoidWithZeroHom.ofClass + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F)) ≤ + ⊤ from le_top) + infer_instance + +/-- The range-restricted valuation is rank one as a valuation into its actual +value group. -/ +@[implicit_reducible] +noncomputable def mrangeRestrictRankOne + (F : CompleteDVF.{u, v} K) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).RankOne := by + haveI : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).IsNontrivial := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_isNontrivial F) + haveI : + IsCyclic + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom)ˣ := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_units_isCyclic F) + exact WithZeroValuation.rankOneOfUnitsIsCyclic + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) + +end CompleteDVF +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CyclicValueGroup.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CyclicValueGroup.lean new file mode 100644 index 0000000000..48143da4b6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CyclicValueGroup.lean @@ -0,0 +1,177 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic +public import Mathlib.Algebra.Order.Group.Cyclic +public import Mathlib.Algebra.Group.Int.TypeTags +public import Mathlib.Data.Int.WithZero +public import Mathlib.RingTheory.Valuation.Archimedean +public import Mathlib.RingTheory.Valuation.RankOne +/-! +# Cyclic value groups and normalized uniformizers + +This file supplies the ordered-group and rank-one facts used for actual +multiplicative valuation ranges, together with normalized uniformizer results +for `ℤᵐ⁰`-valued valuations. +-/ + +@[expose] public section + +noncomputable +section + +universe u x + +open WithZero +open scoped NNReal Valued WithZero + +namespace LocalFieldTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField + +namespace WithZeroValuation + +variable {R : Type u} +variable {Gamma : Type x} [LinearOrderedCommGroupWithZero Gamma] + +/-- A nontrivial `ℤᵐ⁰`-valued valuation is rank one via the standard strictly +monotone embedding `ℤᵐ⁰ -> ℝ≥0`. This is kept as an explicit definition, not +a global instance, so later finite-dimensional closedness arguments can opt in +without changing typeclass search everywhere. -/ +@[implicit_reducible] +noncomputable def rankOne + [Ring R] + (v : _root_.Valuation R ℤᵐ⁰) [v.IsNontrivial] : v.RankOne where + hom' := + (WithZeroMulInt.toNNReal (by norm_num : (2 : ℝ≥0) ≠ 0)).comp + MonoidWithZeroHom.ValueGroup₀.embedding + strictMono' := + (WithZeroMulInt.toNNReal_strictMono + (by norm_num : (1 : ℝ≥0) < 2)).comp + MonoidWithZeroHom.ValueGroup₀.embedding_strictMono + exists_val_nontrivial := + _root_.Valuation.IsNontrivial.exists_val_nontrivial (v := v) + +/-- A cyclic linearly ordered commutative group is multiplicatively +Archimedean. Mathlib supplies the valuation-theoretic equivalence +`RankOne <-> MulArchimedean`; this lemma supplies the missing ordered-group +input for actual valuation ranges whose unit group has already been proved +cyclic. -/ +theorem isCyclic_mulArchimedean + (G : Type*) [CommGroup G] [LinearOrder G] [IsOrderedMonoid G] + [IsCyclic G] : + MulArchimedean G := by + classical + by_cases hsub : Subsingleton G + · refine ⟨fun _ y hy => ?_⟩ + exact (hy.ne' (Subsingleton.elim y 1)).elim + have : Nontrivial G := not_subsingleton_iff_nontrivial.mp hsub + let a : G := LinearOrderedCommGroup.Subgroup.genLTOne (⊤ : Subgroup G) + let b : G := a⁻¹ + have hb : 1 < b := by + have ha : a < 1 := by + simpa [a] using + LinearOrderedCommGroup.Subgroup.genLTOne_lt_one (⊤ : Subgroup G) + simpa [b] using (one_lt_inv'.2 ha) + have hbtop : Subgroup.zpowers b = (⊤ : Subgroup G) := by + have hatop : Subgroup.zpowers a = (⊤ : Subgroup G) := by + simp [a] + simpa [b, Subgroup.zpowers_inv] using hatop + refine ⟨fun x y hy => ?_⟩ + have hxmem : x ∈ Subgroup.zpowers b := by + rw [hbtop] + trivial + have hymem : y ∈ Subgroup.zpowers b := by + rw [hbtop] + trivial + rw [Subgroup.mem_zpowers_iff] at hxmem hymem + rcases hxmem with ⟨m, rfl⟩ + rcases hymem with ⟨l, hy_eq⟩ + rw [← hy_eq] at hy + have hlpos : 0 < l := + (zpow_lt_zpow_iff_right hb).1 (by simpa using hy) + obtain ⟨n, hn⟩ := Archimedean.arch m hlpos + refine ⟨n, ?_⟩ + rw [← hy_eq] + have hmn : m ≤ l * (n : ℤ) := by + simpa [nsmul_eq_mul, mul_comm] using hn + calc + b ^ m ≤ b ^ (l * (n : ℤ)) := + (zpow_le_zpow_iff_right hb).2 hmn + _ = (b ^ l) ^ n := by + rw [zpow_mul, zpow_natCast] + +/-- If the nonzero part of a value group is cyclic, the value group is +multiplicatively Archimedean. -/ +theorem units_isCyclic_mulArchimedean + (Gamma : Type x) [LinearOrderedCommGroupWithZero Gamma] + [IsCyclic Gammaˣ] : + MulArchimedean Gamma := by + have : MulArchimedean Gammaˣ := + isCyclic_mulArchimedean Gammaˣ + exact (Units.mulArchimedean_iff (G₀ := Gamma)).1 inferInstance + +/-- A nontrivial valuation whose ambient value group has cyclic unit group is +rank one. This is used only after restricting an abstract complete-DVF +valuation to its actual range. -/ +@[implicit_reducible] +noncomputable def rankOneOfUnitsIsCyclic + [Ring R] + (v : _root_.Valuation R Gamma) [v.IsNontrivial] [IsCyclic Gammaˣ] : + v.RankOne := by + haveI : MulArchimedean Gamma := + units_isCyclic_mulArchimedean Gamma + haveI : + MulArchimedean + (MonoidWithZeroHom.ValueGroup₀ + (MonoidWithZeroHom.ofClass v)) := + MulArchimedean.comap + MonoidWithZeroHom.ValueGroup₀.embedding.toMonoidHom + MonoidWithZeroHom.ValueGroup₀.embedding_strictMono + exact + Classical.choice + ((_root_.Valuation.nonempty_rankOne_iff_mulArchimedean + (v := v)).2 inferInstance) + +open LinearOrderedCommGroup + +/-- For a valuation with values in the standard group `ℤᵐ⁰`, an element of +value `exp (-1)` is a uniformizer. -/ +theorem isUniformizer_of_valuation_eq_exp_neg_one + {K : Type u} [Field K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [v.IsRankOneDiscrete] (π : K) + (hπ : v π = WithZero.exp (-1 : ℤ)) : + v.IsUniformizer π := by + rw [_root_.Valuation.IsUniformizer.iff, hπ] + simpa using + (congrArg Units.val + (_root_.Valuation.IsRankOneDiscrete.generator_eq_exp_neg_one_of_mem_range + (v := v) ⟨π, hπ⟩)).symm + +/-- A surjective standard `ℤᵐ⁰`-valued valuation has a normalized +uniformizer in its valuation subring. -/ +theorem exists_valuationSubring_valuation_eq_exp_neg_one_of_surjective + {K : Type u} [Field K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + (hv : Function.Surjective v) : + ∃ π : v.valuationSubring, + v (π : K) = WithZero.exp (-1 : ℤ) := by + rcases hv (WithZero.exp (-1 : ℤ)) with ⟨π, hπ⟩ + have hπmem : π ∈ v.valuationSubring := by + change v π ≤ 1 + rw [hπ] + change WithZero.exp (-1 : ℤ) ≤ WithZero.exp (0 : ℤ) + rw [WithZero.exp_le_exp] + norm_num + exact ⟨⟨π, hπmem⟩, hπ⟩ + + +end WithZeroValuation +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuation.lean new file mode 100644 index 0000000000..9f2bf7640f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuation.lean @@ -0,0 +1,189 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.Arithmetic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValueGroup +public import Mathlib.Data.Int.WithZero +/-! +# Integer valuations induced by `ℤᵐ⁰`-valued valuations + +This file constructs the sign-normalized integer valuation on field units and +proves the elementary formulas for powers and natural-number denominators. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +open WithZero +open scoped NNReal WithZero + +namespace LocalFieldTheory.DiscreteValuationField + +namespace MultiplicativeIntegerValuation + +variable {K : Type u} [Field K] + +/-- The integer-valued multiplicative valuation attached to a +`ℤᵐ⁰`-valued field valuation. The sign convention is normalized so that a +uniformizer of value `exp (-1)` has integer value `1`. -/ +noncomputable def ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) : + MultiplicativeIntegerValuation Kˣ where + val x := -WithZero.log (v (x : K)) + map_one := by + simp + map_mul x y := by + have hx : v (x : K) ≠ 0 := + (_root_.Valuation.ne_zero_iff v).2 x.ne_zero + have hy : v (y : K) ≠ 0 := + (_root_.Valuation.ne_zero_iff v).2 y.ne_zero + change + -WithZero.log (v ((x : K) * (y : K))) = + -WithZero.log (v (x : K)) + -WithZero.log (v (y : K)) + rw [v.map_mul, WithZero.log_mul hx hy] + ring + +/-- Establishes the identity `(ofWithZeroValuation v).val x = -WithZero.log (v (x : K))`. -/ +@[simp] theorem ofWithZeroValuation_val + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) (x : Kˣ) : + (ofWithZeroValuation v).val x = -WithZero.log (v (x : K)) := + rfl + +/-- +`ofWithZeroValuation_val_eq_of_valuation_eq_exp` satisfies the negation formula +`(ofWithZeroValuation v).val x = n`. +-/ +theorem ofWithZeroValuation_val_eq_of_valuation_eq_exp_neg + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) (x : Kˣ) {n : ℤ} + (hx : v (x : K) = WithZero.exp (-n)) : + (ofWithZeroValuation v).val x = n := by + rw [ofWithZeroValuation_val, hx, WithZero.log_exp] + ring + +/-- In the normalized `ℤᵐ⁰` convention, a valuation-one unit times the `n`-th +power of an element of value `exp (-1)` has integer value `n`. -/ +theorem ofWithZeroValuation_val_unit_mul_pow + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) (u π : Kˣ) (n : ℕ) + (hu : v (u : K) = 1) + (hπ : v (π : K) = WithZero.exp (-1 : ℤ)) : + (ofWithZeroValuation v).val (u * π ^ n) = n := by + refine + ofWithZeroValuation_val_eq_of_valuation_eq_exp_neg + v (u * π ^ n) ?_ + simp [map_pow, hu, hπ, ← WithZero.exp_nsmul] + +/-- The special case of +`ofWithZeroValuation_val_unit_mul_pow` with the valuation-one unit equal to +one. -/ +theorem ofWithZeroValuation_val_pow + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) (π : Kˣ) (n : ℕ) + (hπ : v (π : K) = WithZero.exp (-1 : ℤ)) : + (ofWithZeroValuation v).val (π ^ n) = n := by + simpa using + ofWithZeroValuation_val_unit_mul_pow + v 1 π n (by simp) hπ + +/-- Natural-number denominator form of the attached integer valuation. + +This is the denominator input for the logarithm-series term +`x^n / n` in the field-unit logarithm theorem. -/ +theorem ofWithZeroValuation_val_natCast + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p n : ℕ} (hnK : (n : K) ≠ 0) + (hnval : v (n : K) = WithZero.exp (-(padicValNat p n : ℤ))) : + (ofWithZeroValuation v).val (Units.mk0 (n : K) hnK) = + (padicValNat p n : ℤ) := + ofWithZeroValuation_val_eq_of_valuation_eq_exp_neg + v (Units.mk0 (n : K) hnK) (by simpa using hnval) + +/-- Natural-number denominator form with a ramification-index scale in the +integer valuation. This is the denominator input for finite extensions where +the normalized field valuation satisfies `v(n) = e * v_p(n)`. -/ +theorem ofWithZeroValuation_val_natCast_scaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p n : ℕ} (e : ℕ) (hnK : (n : K) ≠ 0) + (hnval : + v (n : K) = + WithZero.exp (-((e : ℤ) * (padicValNat p n : ℤ)))) : + (ofWithZeroValuation v).val (Units.mk0 (n : K) hnK) = + (e : ℤ) * (padicValNat p n : ℤ) := + ofWithZeroValuation_val_eq_of_valuation_eq_exp_neg + v (Units.mk0 (n : K) hnK) + (n := (e : ℤ) * (padicValNat p n : ℤ)) (by simpa using hnval) + +/-- Valuation of the logarithm-series term `x^n / n`, assuming the natural +number denominator has the expected `p`-adic value. -/ +theorem ofWithZeroValuation_val_pow_div_natCast + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p n : ℕ} (x : Kˣ) (hnK : (n : K) ≠ 0) + (hnval : v (n : K) = WithZero.exp (-(padicValNat p n : ℤ))) : + (ofWithZeroValuation v).val + (x ^ n / Units.mk0 (n : K) hnK) = + (n : ℤ) * (ofWithZeroValuation v).val x - + (padicValNat p n : ℤ) := by + rw [(ofWithZeroValuation v).val_div, (ofWithZeroValuation v).val_pow, + ofWithZeroValuation_val_natCast v hnK hnval] + +/-- Valuation of the logarithm-series term `x^n / n`, with a fixed +ramification-index scale in the denominator valuation. -/ +theorem ofWithZeroValuation_val_pow_div_natCast_scaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p n : ℕ} (e : ℕ) (x : Kˣ) (hnK : (n : K) ≠ 0) + (hnval : + v (n : K) = + WithZero.exp (-((e : ℤ) * (padicValNat p n : ℤ)))) : + (ofWithZeroValuation v).val + (x ^ n / Units.mk0 (n : K) hnK) = + (n : ℤ) * (ofWithZeroValuation v).val x - + (e : ℤ) * (padicValNat p n : ℤ) := by + rw [(ofWithZeroValuation v).val_div, (ofWithZeroValuation v).val_pow, + ofWithZeroValuation_val_natCast_scaled v e hnK hnval] + +/-- Valuation of the exponential-series term `x^n / n!`, assuming the +factorial denominator has the expected `p`-adic value. -/ +theorem ofWithZeroValuation_val_pow_div_natCast_factorial + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p n : ℕ} (x : Kˣ) + (hnK : (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) : + (ofWithZeroValuation v).val + (x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) hnK) = + (n : ℤ) * (ofWithZeroValuation v).val x - + (padicValNat p n.factorial : ℤ) := by + rw [(ofWithZeroValuation v).val_div, (ofWithZeroValuation v).val_pow, + ofWithZeroValuation_val_natCast v hnK hnval] + +/-- Valuation of the exponential-series term `x^n / n!`, with a fixed +ramification-index scale in the factorial denominator valuation. -/ +theorem ofWithZeroValuation_val_pow_div_natCast_factorial_scaled + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p n : ℕ} (e : ℕ) (x : Kˣ) + (hnK : (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) : + (ofWithZeroValuation v).val + (x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) hnK) = + (n : ℤ) * (ofWithZeroValuation v).val x - + (e : ℤ) * (padicValNat p n.factorial : ℤ) := by + rw [(ofWithZeroValuation v).val_div, (ofWithZeroValuation v).val_pow, + ofWithZeroValuation_val_natCast_scaled + (v := v) (p := p) (n := n.factorial) e hnK hnval] + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuationUniformizer.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuationUniformizer.lean new file mode 100644 index 0000000000..ddb542c254 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuationUniformizer.lean @@ -0,0 +1,145 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormBase +public import Mathlib.RingTheory.Valuation.Extension +/-! +# Uniformizers and unit subgroups for induced integer valuations + +This file relates the induced integer valuation to normalized uniformizers, +valuation-ring units, and scalar extension of field units. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation renaming + mem_zeroSubgroup_iff → + mem_zeroSubgroup_iff + + +noncomputable +section + +universe u + +open WithZero +open scoped WithZero + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +variable {K : Type u} [Field K] + +/-- An element of `ℤᵐ⁰`-value `exp (-1)` is a uniformizer for the attached +integer-valued multiplicative valuation. -/ +theorem ofWithZeroValuation_isUniformizer_of_valuation_eq_exp_neg + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) (π : Kˣ) + (hπ : v (π : K) = WithZero.exp (-1 : ℤ)) : + (ofWithZeroValuation v).IsUniformizer π := + ofWithZeroValuation_val_eq_of_valuation_eq_exp_neg v π hπ + +/-- A normalized `ℤᵐ⁰`-valued valuation with an element of value `exp (-1)` +has a uniformizer in the attached integer-valued multiplicative valuation. -/ +theorem ofWithZeroValuation_hasUniformizer_of_exists_valuation_eq_exp_neg + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + (h : ∃ π : Kˣ, v (π : K) = WithZero.exp (-1 : ℤ)) : + (ofWithZeroValuation v).HasUniformizer := by + rcases h with ⟨π, hπ⟩ + exact ⟨π, + ofWithZeroValuation_isUniformizer_of_valuation_eq_exp_neg v π hπ⟩ + +/-- A surjective `ℤᵐ⁰`-valued valuation has a field unit of value +`exp (-1)`. -/ +theorem exists_unit_valuation_eq_exp_neg_of_surjective + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) (hv : Function.Surjective v) : + ∃ π : Kˣ, v (π : K) = WithZero.exp (-1 : ℤ) := by + rcases hv (WithZero.exp (-1 : ℤ)) with ⟨π, hπ⟩ + have hπ_ne : π ≠ 0 := by + intro hzero + have hzero_val : v π = 0 := by + simp [hzero] + rw [hπ] at hzero_val + exact WithZero.exp_ne_zero hzero_val + exact ⟨Units.mk0 π hπ_ne, by simpa using hπ⟩ + +/-- A surjective `ℤᵐ⁰`-valued valuation gives a uniformizer for the attached +integer-valued multiplicative valuation. -/ +theorem ofWithZeroValuation_hasUniformizer_of_surjective + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) (hv : Function.Surjective v) : + (ofWithZeroValuation v).HasUniformizer := + ofWithZeroValuation_hasUniformizer_of_exists_valuation_eq_exp_neg v + (exists_unit_valuation_eq_exp_neg_of_surjective v hv) + +/-- A surjective `ℤᵐ⁰`-valued valuation gives a surjective integer-valued +valuation on field units. -/ +theorem ofWithZeroValuation_val_surjective_of_surjective + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) (hv : Function.Surjective v) : + Function.Surjective (ofWithZeroValuation v).val := by + intro n + rcases hv (WithZero.exp (-n)) with ⟨x, hx⟩ + have hx_ne : x ≠ 0 := by + intro hzero + have hzero_val : v x = 0 := by + simp [hzero] + rw [hx] at hzero_val + exact WithZero.exp_ne_zero hzero_val + exact ⟨Units.mk0 x hx_ne, + ofWithZeroValuation_val_eq_of_valuation_eq_exp_neg + v (Units.mk0 x hx_ne) (by simpa using hx)⟩ + +/-- +Establishes the identity `(ofWithZeroValuation v).zeroSubgroup = v.valuationSubring.unitGroup`. +-/ +theorem ofWithZeroValuation_zeroSubgroup_eq_unitGroup + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) : + (ofWithZeroValuation v).zeroSubgroup = + v.valuationSubring.unitGroup := by + ext x + rw [mem_zeroSubgroup_iff, _root_.Valuation.mem_unitGroup_iff] + change -WithZero.log (v (x : K)) = 0 ↔ v (x : K) = 1 + have hx : v (x : K) ≠ 0 := + (_root_.Valuation.ne_zero_iff v).2 x.ne_zero + constructor + · intro h + have hlog : WithZero.log (v (x : K)) = 0 := by + exact neg_eq_zero.mp h + calc + v (x : K) = WithZero.exp (WithZero.log (v (x : K))) := by + rw [WithZero.exp_log hx] + _ = 1 := by + rw [hlog] + simp + · intro h + rw [h] + simp + +variable {L : Type u} [Field L] [Algebra K L] + +/-- +Establishes the membership statement `∀ u : Kˣ, u ∈ (ofWithZeroValuation vK).zeroSubgroup → +baseUnitsMap (K := K) (L := L) u ∈ (ofWithZeroValuation vL).zeroSubgroup`. +-/ +theorem baseUnitsMap_zeroSubgroup_ofWithZeroValuation + (vK : _root_.Valuation K (WithZero (Multiplicative ℤ))) + (vL : _root_.Valuation L (WithZero (Multiplicative ℤ))) [vK.HasExtension vL] : + ∀ u : Kˣ, u ∈ (ofWithZeroValuation vK).zeroSubgroup → + baseUnitsMap (K := K) (L := L) u ∈ + (ofWithZeroValuation vL).zeroSubgroup := by + intro u hu + rw [ofWithZeroValuation_zeroSubgroup_eq_unitGroup] at hu ⊢ + rw [_root_.Valuation.mem_unitGroup_iff] at hu ⊢ + simpa using + (_root_.Valuation.HasExtension.val_map_eq_one_iff + (vR := vK) (vA := vL) (u : K)).2 hu + + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/LocalFieldRangeRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/LocalFieldRangeRestriction.lean new file mode 100644 index 0000000000..98114592c5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/LocalFieldRangeRestriction.lean @@ -0,0 +1,88 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology +/-! +# Multiplicative-range restriction for local fields + +This file packages range restriction as a `LocalField` and exposes the +properness and completeness of the resulting topology. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming + mrangeRestrict_completeSpace_of_residueField_finite → + mrangeRestrict_completeSpace_of_residueField_finite + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming + mrangeRestrict_properSpace_of_residueField_finite → + mrangeRestrict_properSpace_of_residueField_finite + + +noncomputable +section + +universe u v + +open scoped Valued + +namespace LocalFieldTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField + +namespace LocalField + +variable {K : Type u} [Field K] + +/-- A local-field package with its chosen valuation restricted to the actual +multiplicative range. -/ +def mrangeRestrict (F : LocalField.{u, v} K) : + LocalField.{u, v} K := by + let G : CompleteDVF.{u, v} K := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictCompleteDVF F.toCompleteDVF) + haveI : Finite G.residueField := by + simpa [G, CompleteDVF.mrangeRestrictCompleteDVF, + CompleteDVF.residueField, CompleteDVF.valuationSubring, + CompleteDVF.toDVF] using + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_residueField_finite + F.toCompleteDVF) + exact { toCompleteDVF := G } + +/-- The range-restricted topology attached to a local-field package is proper. -/ +theorem mrangeRestrict_properSpace + (F : LocalField.{u, v} K) : + letI : Valued K + (MonoidHom.mrange + F.toCompleteDVF.valuation.toMonoidWithZeroHom) := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF) + letI : NontriviallyNormedField K := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField + F.toCompleteDVF) + ProperSpace K := by + exact + (mrangeRestrict_properSpace_of_residueField_finite F.toCompleteDVF) + +/-- The range-restricted topology attached to a local-field package is complete. -/ +theorem mrangeRestrict_completeSpace + (F : LocalField.{u, v} K) : + letI : Valued K + (MonoidHom.mrange + F.toCompleteDVF.valuation.toMonoidWithZeroHom) := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF) + letI : NontriviallyNormedField K := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField + F.toCompleteDVF) + CompleteSpace K := by + exact + (mrangeRestrict_completeSpace_of_residueField_finite F.toCompleteDVF) + + +end LocalField +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean new file mode 100644 index 0000000000..531e2677d7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean @@ -0,0 +1,408 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.ValuedAdicComplete +public import Mathlib.RingTheory.AdicCompletion.Topology +public import Mathlib.Topology.Algebra.Valued.LocallyCompact +public import Mathlib.Topology.Algebra.Valued.NormedValued +/-! +# Topology of range-restricted complete discretely valued fields + +This file equips the multiplicative-range valuation with its valued and normed +field structures and transports adic completeness, compactness, properness, +and completeness. +-/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + mem_maximalIdeal_pow_iff_valuation_le_uniformizer_pow → + mem_maximalIdeal_pow_iff_valuation_le_uniformizer_pow + + +noncomputable +section + +universe u v + +open Filter WithZero +open scoped NNReal Valued Filter WithZero + +namespace LocalFieldTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField + +namespace CompleteDVF + +variable {K : Type u} [Field K] + +/-- The canonical `Valued` structure attached to the range-restricted complete +DVF valuation. -/ +@[implicit_reducible] +noncomputable def mrangeRestrictValued + (F : CompleteDVF.{u, v} K) : + Valued K (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + Valued.mk' (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) + +/-- The range-restricted valuation has its canonical rank-one embedding. -/ +@[instance_reducible] +noncomputable def mrangeRestrictValuedRankOne + (F : CompleteDVF.{u, v} K) : + (@Valued.v K _ + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) _ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F)).RankOne := by + change + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).RankOne + exact + LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictRankOne F + +/-- The rank-one normalized complete-DVF valuation supplies the normed-field +structure expected by mathlib's finite-dimensional closed-subspace theorem. -/ +@[implicit_reducible] +noncomputable def mrangeRestrictNontriviallyNormedField + (F : CompleteDVF.{u, v} K) : + NontriviallyNormedField K := + Valued.toNontriviallyNormedField + (L := K) + (Γ₀ := MonoidHom.mrange F.valuation.toMonoidWithZeroHom) + (val := LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + (hv := mrangeRestrictValuedRankOne F) + +/-- Powers of a uniformizer are cofinal among neighborhoods of zero for the +range-restricted valuation topology. -/ +theorem mrangeRestrict_exists_uniformizer_pow_lt_unit + (F : CompleteDVF.{u, v} K) + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (gamma : + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom)ˣ) : + ∃ N : ℕ, + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) (((π ^ N : + F.valuationSubring) : K)) < gamma := by + let Γ : Type v := + MonoidHom.mrange F.valuation.toMonoidWithZeroHom + have hπ_ne : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) (π : K) ≠ (0 : Γ) := by + intro hzero + exact hπ.val_ne_zero (by + simpa [Γ, CompleteDVF.mrangeRestrict] using + congrArg (fun z : Γ => (z : F.ValueGroup)) hzero) + let delta : Γˣ := Units.mk0 + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) (π : K)) hπ_ne + have hdelta_lt_one : delta < (1 : Γˣ) := by + rw [← Units.val_lt_val] + change (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) (π : K) < (1 : Γ) + rw [← Subtype.coe_lt_coe] + simpa [Γ, CompleteDVF.mrangeRestrict] using hπ.val_lt_one + have : IsCyclic Γˣ := by + simpa [Γ] using + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_units_isCyclic F) + have : MulArchimedean Γˣ := + WithZeroValuation.isCyclic_mulArchimedean Γˣ + have hdelta_inv : (1 : Γˣ) < delta⁻¹ := + one_lt_inv'.2 hdelta_lt_one + obtain ⟨N, hN⟩ := exists_lt_pow hdelta_inv gamma⁻¹ + refine ⟨N, ?_⟩ + have hpow_lt : delta ^ N < gamma := by + have hN' : gamma⁻¹ < (delta ^ N)⁻¹ := by + simpa [inv_pow] using hN + exact lt_of_inv_lt_inv hN' + simpa [delta, Γ, _root_.Valuation.map_pow] using + (show (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) (π : K)) ^ N + : Γ) < gamma from + (Units.val_lt_val.2 hpow_lt)) + +/-- A closed subfield for the range-restricted valuation topology contains any +valuation-ring element that is approximated modulo all powers of the maximal +ideal by elements of that subfield. -/ +theorem mem_subfield_of_mrangeRestrict_isClosed_of_forall_valuationSubring_smodEq + (F : CompleteDVF.{u, v} K) (E : Subfield K) + (hEclosed : + letI : + Valued K (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + IsClosed (E : Set K)) + (b : F.valuationSubring) + (happrox : + ∀ N : ℕ, + ∃ z : E, + ∃ hz : (z : K) ∈ F.valuation.valuationSubring, + (⟨(z : K), hz⟩ : F.valuationSubring) ≡ b + [SMOD + ((F.maximalIdeal ^ N) • + (⊤ : Submodule F.valuationSubring F.valuationSubring))]) : + (b : K) ∈ E := by + let : + Valued K (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + have hbClosure : (b : K) ∈ closure (E : Set K) := by + rw [mem_closure_iff_nhds] + intro U hU + rw [Valued.mem_nhds] at hU + rcases hU with ⟨gamma, hgamma⟩ + rcases F.exists_uniformizer with ⟨π, hπ⟩ + let gamma' : + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom)ˣ := + Units.map + MonoidWithZeroHom.ValueGroup₀.embedding.toMonoidHom gamma + obtain ⟨N, hN⟩ := + (mrangeRestrict_exists_uniformizer_pow_lt_unit F) + hπ gamma' + obtain ⟨z, hz, hzcongr⟩ := happrox N + let zInt : F.valuationSubring := ⟨(z : K), hz⟩ + have hdiff_mem : + zInt - b ∈ F.maximalIdeal ^ N := by + have hsub := SModEq.sub_mem.mp hzcongr + simpa [smul_eq_mul, Ideal.mul_top] using hsub + have hdiff_le : + F.valuation ((zInt - b : F.valuationSubring) : K) ≤ + F.valuation (((π ^ N : F.valuationSubring) : K)) := by + exact + (mem_maximalIdeal_pow_iff_valuation_le_uniformizer_pow + (val := F.valuation) hπ N (x := zInt - b)).1 hdiff_mem + refine ⟨(z : K), ?_, z.2⟩ + apply hgamma + have hdiff_le' : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) ((z : K) - (b : K)) ≤ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) (((π ^ N : + F.valuationSubring) : K)) := by + rw [← Subtype.coe_le_coe] + simpa [zInt] using hdiff_le + change + (Valued.v : + _root_.Valuation K + (MonoidHom.mrange + F.valuation.toMonoidWithZeroHom)).restrict + ((z : K) - (b : K)) < gamma + rw [_root_.Valuation.restrict_lt_iff_lt_embedding] + rw [← Subtype.coe_lt_coe] + have hlt := lt_of_le_of_lt hdiff_le' hN + rw [← Subtype.coe_lt_coe] at hlt + change + F.valuation ((z : K) - (b : K)) < + ((MonoidWithZeroHom.ValueGroup₀.embedding + (f := MonoidWithZeroHom.ofClass + (Valued.v : + _root_.Valuation K + (MonoidHom.mrange + F.valuation.toMonoidWithZeroHom))) + (↑gamma) : + MonoidHom.mrange F.valuation.toMonoidWithZeroHom) : F.ValueGroup) + simpa [gamma'] using hlt + simpa [hEclosed.closure_eq] using hbClosure + +/-- The complete-DVF package obtained by replacing the ambient value group by +the actual multiplicative range of the chosen valuation. -/ +def mrangeRestrictCompleteDVF (F : CompleteDVF.{u, v} K) : + CompleteDVF.{u, v} K := by + let vK : _root_.Valuation K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) + letI : vK.IsRankOneDiscrete := by + simpa [vK] using + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_isRankOneDiscrete F) + letI : + IsAdicComplete (IsLocalRing.maximalIdeal vK.valuationSubring) + vK.valuationSubring := by + simpa [vK] using + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_isAdicComplete F) + letI : ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete vK := + { isRankOneDiscrete := inferInstance + isAdicComplete := inferInstance } + exact + { ValueGroup := MonoidHom.mrange F.valuation.toMonoidWithZeroHom + valuation := vK } + +/-- For the topology induced by the range-restricted rank-one valuation, the +valuation ring has its maximal-ideal adic topology. -/ +theorem mrangeRestrict_integer_isAdic + (F : CompleteDVF.{u, v} K) : + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + letI : NontriviallyNormedField K := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F) + IsAdic (𝓂[K]) := by + let Γ : Type v := + MonoidHom.mrange F.valuation.toMonoidWithZeroHom + let : Valued K Γ := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + let : NontriviallyNormedField K := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F) + have : IsCyclic Γˣ := by + simpa [Γ] using + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_units_isCyclic F) + let : MulArchimedean Γ := + WithZeroValuation.units_isCyclic_mulArchimedean Γ + have : (Valued.v : _root_.Valuation K Γ).IsRankOneDiscrete := by + change + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).IsRankOneDiscrete + exact + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_isRankOneDiscrete F) + exact ValuationTheory.Valuations.rankOneDiscreteValuationSubring_isAdic + +/-- The valuation ring of a range-restricted complete DVF is complete for the +subspace topology coming from the corresponding normed-field topology. -/ +theorem mrangeRestrict_integer_completeSpace + (F : CompleteDVF.{u, v} K) : + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + letI : NontriviallyNormedField K := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F) + CompleteSpace 𝒪[K] := by + let Γ : Type v := + MonoidHom.mrange F.valuation.toMonoidWithZeroHom + let : Valued K Γ := (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + have : (Valued.v : _root_.Valuation K Γ).IsRankOneDiscrete := by + change + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).IsRankOneDiscrete + exact + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_isRankOneDiscrete F) + have : (Valued.v : _root_.Valuation K Γ).RankOne := by + change + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).RankOne + exact + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictRankOne F) + let : NontriviallyNormedField K := + Valued.toNontriviallyNormedField + (L := K) + (Γ₀ := MonoidHom.mrange + F.valuation.toMonoidWithZeroHom) + have : IsUltrametricDist K := by infer_instance + have : IsDiscreteValuationRing 𝒪[K] := by + change IsDiscreteValuationRing (Valued.v : _root_.Valuation K Γ).valuationSubring + infer_instance + have hadic : IsAdic (𝓂[K]) := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_integer_isAdic F) + have hcomplete : IsAdicComplete (𝓂[K]) 𝒪[K] := by + change + IsAdicComplete + (IsLocalRing.maximalIdeal + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring) + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring + exact (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_isAdicComplete F) + exact (hadic.isAdicComplete_iff.mp hcomplete).1 + +open Valued.integer renaming + compactSpace_iff_completeSpace_and_isDiscreteValuationRing_and_finite_residueField → + compactSpace_iff_complete_discrete_finite_residue in +/-- The valuation ring of a range-restricted complete DVF with finite residue +field is compact. This is the compactness input in the local-field structure theory, +the local compactness criterion. -/ +theorem mrangeRestrict_integer_compactSpace_of_residueField_finite + (F : CompleteDVF.{u, v} K) [Finite F.residueField] : + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + letI : NontriviallyNormedField K := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F) + CompactSpace 𝒪[K] := by + let : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + have : + (Valued.v : + _root_.Valuation K + (MonoidHom.mrange + F.valuation.toMonoidWithZeroHom)).IsRankOneDiscrete := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_isRankOneDiscrete F) + have : + (Valued.v : + _root_.Valuation K + (MonoidHom.mrange + F.valuation.toMonoidWithZeroHom)).RankOne := + mrangeRestrictValuedRankOne F + let : NontriviallyNormedField K := + Valued.toNontriviallyNormedField + (L := K) + (Γ₀ := MonoidHom.mrange + F.valuation.toMonoidWithZeroHom) + have : IsUltrametricDist K := by infer_instance + have : IsDiscreteValuationRing 𝒪[K] := by + change + IsDiscreteValuationRing + (Valued.v : + _root_.Valuation K + (MonoidHom.mrange + F.valuation.toMonoidWithZeroHom)).valuationSubring + infer_instance + have : Finite 𝓀[K] := by + change + Finite + (IsLocalRing.ResidueField + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring) + exact (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_residueField_finite F) + have hcomplete : CompleteSpace 𝒪[K] := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_integer_completeSpace F) + exact + (compactSpace_iff_complete_discrete_finite_residue + (K := K) + (Γ₀ := MonoidHom.mrange F.valuation.toMonoidWithZeroHom)).2 + ⟨hcomplete, inferInstance, inferInstance⟩ + +/-- A range-restricted complete DVF with finite residue field is proper for +the associated normed-field topology. -/ +theorem mrangeRestrict_properSpace_of_residueField_finite + (F : CompleteDVF.{u, v} K) [Finite F.residueField] : + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + letI : NontriviallyNormedField K := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F) + ProperSpace K := by + let : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + have : + (Valued.v : + _root_.Valuation K + (MonoidHom.mrange + F.valuation.toMonoidWithZeroHom)).RankOne := + mrangeRestrictValuedRankOne F + let : NontriviallyNormedField K := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F) + have hcompact : CompactSpace 𝒪[K] := + (mrangeRestrict_integer_compactSpace_of_residueField_finite F) + unfold mrangeRestrictNontriviallyNormedField + unfold Valued.toNontriviallyNormedField + change @ProperSpace K + (Valued.toNormedField K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) + (val := LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + (hv := mrangeRestrictValuedRankOne F)).toPseudoMetricSpace + exact + (@Valued.integer.properSpace_iff_compactSpace_integer + K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) + inferInstance inferInstance + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + (mrangeRestrictValuedRankOne F)).2 hcompact + +/-- A range-restricted complete DVF with finite residue field is complete for +the associated normed-field topology. -/ +theorem mrangeRestrict_completeSpace_of_residueField_finite + (F : CompleteDVF.{u, v} K) [Finite F.residueField] : + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + letI : NontriviallyNormedField K := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F) + CompleteSpace K := by + let Γ : Type v := + MonoidHom.mrange F.valuation.toMonoidWithZeroHom + let : Valued K Γ := (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + let : NontriviallyNormedField K := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F) + have : ProperSpace K := + (mrangeRestrict_properSpace_of_residueField_finite F) + exact complete_of_proper + +end CompleteDVF +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestriction.lean new file mode 100644 index 0000000000..4facbb2469 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestriction.lean @@ -0,0 +1,160 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic +/-! +# Restricting a valuation to its multiplicative range + +The restricted valuation has the same valuation ring, maximal ideal, and +residue field as the original valuation. +-/ + +@[expose] public section + +noncomputable +section + +universe u x + +open WithZero +open scoped NNReal Valued WithZero + +namespace LocalFieldTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField + +namespace WithZeroValuation + +variable {R : Type u} +variable {Gamma : Type x} [LinearOrderedCommGroupWithZero Gamma] + +section Field + +variable [Field R] + +/-- Restrict a valuation's codomain to its actual multiplicative range. + +This removes irrelevant ambient value-group elements. It is the value-group +normalization needed before finite-dimensional closedness can be used for an +abstract chosen local-field valuation. -/ +def mrangeRestrict (v : _root_.Valuation R Gamma) : + _root_.Valuation R (MonoidHom.mrange v.toMonoidWithZeroHom) where + toFun r := ⟨v r, ⟨r, rfl⟩⟩ + map_one' := by + ext + exact map_one v + map_zero' := by + ext + exact map_zero v + map_mul' x y := by + ext + exact map_mul v x y + map_add_le_max' x y := by + rw [← Subtype.coe_le_coe] + exact map_add_le_max v x y + +/-- The defining evaluation formula for `mrangeRestrict` is `(mrangeRestrict v x : Gamma) = v x`. -/ +@[simp] +theorem mrangeRestrict_apply (v : _root_.Valuation R Gamma) (x : R) : + (mrangeRestrict v x : Gamma) = v x := + rfl + +/-- Passing to the actual multiplicative range does not change the valuation +subring predicate. -/ +theorem mem_mrangeRestrict_valuationSubring_iff + (v : _root_.Valuation R Gamma) (x : R) : + x ∈ (mrangeRestrict v).valuationSubring ↔ x ∈ v.valuationSubring := by + rw [_root_.Valuation.mem_valuationSubring_iff, + _root_.Valuation.mem_valuationSubring_iff] + rw [← Subtype.coe_le_coe] + rfl + +/-- The valuation subring is unchanged after restricting the value group to +the actual multiplicative range. -/ +noncomputable def valuationSubringEquivMrangeRestrict + (v : _root_.Valuation R Gamma) : + v.valuationSubring ≃+* (mrangeRestrict v).valuationSubring where + toFun x := + ⟨x, (mem_mrangeRestrict_valuationSubring_iff v x).2 x.2⟩ + invFun x := + ⟨x, (mem_mrangeRestrict_valuationSubring_iff v x).1 x.2⟩ + left_inv x := by ext; rfl + right_inv x := by ext; rfl + map_mul' x y := by ext; rfl + map_add' x y := by ext; rfl + +/-- +Establishes the identity `((valuationSubringEquivMrangeRestrict v x : (mrangeRestrict +v).valuationSubring) : R) = x`. +-/ +@[simp] +theorem valuationSubringEquivMrangeRestrict_apply_coe + (v : _root_.Valuation R Gamma) (x : v.valuationSubring) : + ((valuationSubringEquivMrangeRestrict v x : + (mrangeRestrict v).valuationSubring) : R) = x := + rfl + +variable {K : Type u} [Field K] + +/-- The valuation-subring equivalence induced by range restriction preserves +the maximal ideal. -/ +theorem valuationSubringEquivMrangeRestrict_mem_maximalIdeal_iff + (v : _root_.Valuation K Gamma) (x : v.valuationSubring) : + valuationSubringEquivMrangeRestrict v x ∈ + IsLocalRing.maximalIdeal (mrangeRestrict v).valuationSubring ↔ + x ∈ IsLocalRing.maximalIdeal v.valuationSubring := by + rw [_root_.Valuation.mem_maximalIdeal_iff, + _root_.Valuation.mem_maximalIdeal_iff] + rw [← Subtype.coe_lt_coe] + rfl + +/-- +Establishes the identity `(IsLocalRing.maximalIdeal v.valuationSubring).map +(valuationSubringEquivMrangeRestrict v : v.valuationSubring →+* (mrangeRestrict +v).valuationSubring) = IsLocalRing.maximalIdeal (mrangeRestrict v).valuationSubring`. +-/ +@[simp] +theorem valuationSubringEquivMrangeRestrict_map_maximalIdeal + (v : _root_.Valuation K Gamma) : + (IsLocalRing.maximalIdeal v.valuationSubring).map + (valuationSubringEquivMrangeRestrict v : + v.valuationSubring →+* (mrangeRestrict v).valuationSubring) = + IsLocalRing.maximalIdeal (mrangeRestrict v).valuationSubring := by + let e := valuationSubringEquivMrangeRestrict v + ext y + rw [Ideal.mem_map_iff_of_surjective + (e : v.valuationSubring →+* (mrangeRestrict v).valuationSubring) + e.surjective] + constructor + · rintro ⟨x, hx, rfl⟩ + exact (valuationSubringEquivMrangeRestrict_mem_maximalIdeal_iff v x).2 hx + · intro hy + refine ⟨e.symm y, ?_, by simp [e]⟩ + exact + (valuationSubringEquivMrangeRestrict_mem_maximalIdeal_iff v (e.symm y)).1 + (by simpa [e] using hy) + +/-- Restricting a valuation to its actual multiplicative range induces the +same residue field. -/ +noncomputable def residueFieldEquivMrangeRestrict + (v : _root_.Valuation K Gamma) : + IsLocalRing.ResidueField v.valuationSubring ≃+* + IsLocalRing.ResidueField (mrangeRestrict v).valuationSubring := by + let e := valuationSubringEquivMrangeRestrict v + letI : IsLocalHom + (e : v.valuationSubring →+* (mrangeRestrict v).valuationSubring) := + IsLocalHom.of_surjective + (e : v.valuationSubring →+* (mrangeRestrict v).valuationSubring) + e.surjective + exact IsLocalRing.ResidueField.mapEquiv e + +end Field + +end WithZeroValuation +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/SeriesValuationEstimates.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/SeriesValuationEstimates.lean new file mode 100644 index 0000000000..6663a72c28 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/SeriesValuationEstimates.lean @@ -0,0 +1,369 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation +public import Mathlib.Order.Filter.AtTopBot.Tendsto +/-! +# Valuation estimates for logarithm and exponential series + +This file proves lower bounds and divergence-to-infinity statements for the +integer valuations of the logarithm and exponential series terms. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +open Filter WithZero +open scoped NNReal Filter WithZero + +namespace LocalFieldTheory.DiscreteValuationField +namespace MultiplicativeIntegerValuation + +variable {K : Type u} [Field K] + +/-- Positive-degree exponential terms have positive integer valuation when +the input has valuation strictly bigger than one. -/ +theorem ofWithZeroValuation_val_pow_div_natCast_factorial_pos_of_one_lt + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p n : ℕ} [Fact p.Prime] (x : Kˣ) + (hnK : (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + (hxone : 1 < (ofWithZeroValuation v).val x) + (hn : n ≠ 0) : + 0 < + (ofWithZeroValuation v).val + (x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) hnK) := by + have hterm := + ofWithZeroValuation_val_pow_div_natCast_factorial + (v := v) (p := p) (n := n) x hnK hnval + have hxge : (2 : ℤ) ≤ (ofWithZeroValuation v).val x := by + omega + have hnnonneg : (0 : ℤ) ≤ (n : ℤ) := by + exact_mod_cast Nat.zero_le n + have hlin : + (n : ℤ) * 2 ≤ + (n : ℤ) * (ofWithZeroValuation v).val x := + mul_le_mul_of_nonneg_left hxge hnnonneg + have hden : + (padicValNat p n.factorial : ℤ) ≤ (n : ℤ) := by + exact_mod_cast padicValNat_factorial_le (p := p) n + have hnpos : (0 : ℤ) < (n : ℤ) := by + exact_mod_cast Nat.pos_of_ne_zero hn + rw [hterm] + linarith + +/-- Real lower bound for the valuation of the exponential-series term +`x^n / n!`. -/ +theorem ofWithZeroValuation_val_pow_div_natCast_factorial_real_lower_bound + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p n : ℕ} (x : Kˣ) + (hnK : (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + {c : ℝ} (hc : c ≤ ((ofWithZeroValuation v).val x : ℝ)) : + (n : ℝ) * c - (padicValNat p n.factorial : ℝ) ≤ + ((ofWithZeroValuation v).val + (x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) hnK) : ℝ) := by + have hterm := + ofWithZeroValuation_val_pow_div_natCast_factorial + (v := v) (p := p) (n := n) x hnK hnval + have hlin : + (n : ℝ) * c ≤ + (n : ℝ) * ((ofWithZeroValuation v).val x : ℝ) := + mul_le_mul_of_nonneg_left hc (Nat.cast_nonneg n) + calc + (n : ℝ) * c - (padicValNat p n.factorial : ℝ) ≤ + (n : ℝ) * ((ofWithZeroValuation v).val x : ℝ) - + (padicValNat p n.factorial : ℝ) := by + linarith + _ = + ((ofWithZeroValuation v).val + (x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) hnK) : ℝ) := by + rw [hterm] + norm_num [Int.cast_sub, Int.cast_mul] + +/-- Real lower bound for the valuation of the exponential-series term +`x^n / n!`, with a ramification-index scale in the denominator valuation. -/ +theorem ofWithZeroValuation_val_pow_div_natCast_factorial_scaled_real_lower_bound + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p n : ℕ} (e : ℕ) (x : Kˣ) + (hnK : (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + {c : ℝ} (hc : c ≤ ((ofWithZeroValuation v).val x : ℝ)) : + (n : ℝ) * c - (e : ℝ) * (padicValNat p n.factorial : ℝ) ≤ + ((ofWithZeroValuation v).val + (x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) hnK) : ℝ) := by + have hterm := + ofWithZeroValuation_val_pow_div_natCast_factorial_scaled + (v := v) (p := p) (n := n) e x hnK hnval + have hlin : + (n : ℝ) * c ≤ + (n : ℝ) * ((ofWithZeroValuation v).val x : ℝ) := + mul_le_mul_of_nonneg_left hc (Nat.cast_nonneg n) + calc + (n : ℝ) * c - (e : ℝ) * (padicValNat p n.factorial : ℝ) ≤ + (n : ℝ) * ((ofWithZeroValuation v).val x : ℝ) - + (e : ℝ) * (padicValNat p n.factorial : ℝ) := by + linarith + _ = + ((ofWithZeroValuation v).val + (x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) hnK) : ℝ) := by + rw [hterm] + norm_num [Int.cast_sub, Int.cast_mul] + +/-- The valuations of the exponential-series terms `x^n / n!` tend to `+∞` +when the value of `x` is strictly larger than one. This is the convergence +estimate used for the exponential half of the field-unit logarithm theorem. -/ +theorem ofWithZeroValuation_val_pow_div_natCast_factorial_tendsto_atTop + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : Kˣ) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-(padicValNat p n.factorial : ℤ))) + {c : ℝ} (hcOne : 1 < c) + (hc : c ≤ ((ofWithZeroValuation v).val x : ℝ)) : + Tendsto + (fun n : ℕ => + ((ofWithZeroValuation v).val + (x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n)) : ℝ)) + atTop atTop := by + have hsource : + Tendsto + (fun n : ℕ => + (n : ℝ) * c - (padicValNat p n.factorial : ℝ)) + atTop atTop := + tendsto_nat_mul_const_sub_padicValNat_factorial_atTop + (p := p) hcOne + have hle : + (fun n : ℕ => + (n : ℝ) * c - (padicValNat p n.factorial : ℝ)) ≤ᶠ[atTop] + (fun n : ℕ => + ((ofWithZeroValuation v).val + (x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n)) : ℝ)) := by + exact Eventually.of_forall fun n => + ofWithZeroValuation_val_pow_div_natCast_factorial_real_lower_bound + (v := v) (p := p) (n := n) x (hnK n) (hnval n) hc + exact tendsto_atTop_mono' atTop hle hsource + +/-- Sharp ramified convergence estimate for the exponential-series terms +`x^n / n!`: a value of `x` strictly above `e/(p-1)` dominates the scaled +factorial denominator contribution `e * v_p(n!)`. -/ +theorem ofWithZeroValuation_val_pow_div_natCast_factorial_scaled_tendsto_atTop + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : Kˣ) + (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n.factorial : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p n.factorial : ℤ)))) + {c : ℝ} + (hcThreshold : (e : ℝ) / ((p : ℝ) - 1) < c) + (hc : c ≤ ((ofWithZeroValuation v).val x : ℝ)) : + Tendsto + (fun n : ℕ => + ((ofWithZeroValuation v).val + (x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n)) : ℝ)) + atTop atTop := by + have hsource : + Tendsto + (fun n : ℕ => + (n : ℝ) * c - + (e : ℝ) * (padicValNat p n.factorial : ℝ)) + atTop atTop := + tendsto_nat_mul_const_sub_const_mul_padicValNat_factorial_atTop + (p := p) (c := c) (C := (e : ℝ)) (Nat.cast_nonneg e) + hcThreshold + have hle : + (fun n : ℕ => + (n : ℝ) * c - + (e : ℝ) * (padicValNat p n.factorial : ℝ)) ≤ᶠ[atTop] + (fun n : ℕ => + ((ofWithZeroValuation v).val + (x ^ n / + Units.mk0 (((n.factorial : ℕ) : K)) (hnK n)) : ℝ)) := by + exact Eventually.of_forall fun n => + ofWithZeroValuation_val_pow_div_natCast_factorial_scaled_real_lower_bound + (v := v) (p := p) (n := n) e x (hnK n) (hnval n) hc + exact tendsto_atTop_mono' atTop hle hsource + +/-- Real lower bound for the valuation of `x^n / n`, in the form used to prove +that the logarithm-series terms tend to zero. -/ +theorem ofWithZeroValuation_val_pow_div_natCast_real_lower_bound + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p n : ℕ} [Fact p.Prime] (x : Kˣ) (hnK : (n : K) ≠ 0) + (hnval : v (n : K) = WithZero.exp (-(padicValNat p n : ℤ))) + {c : ℝ} (hc : c ≤ ((ofWithZeroValuation v).val x : ℝ)) : + (n : ℝ) * c - Real.logb p n ≤ + ((ofWithZeroValuation v).val + (x ^ n / Units.mk0 (n : K) hnK) : ℝ) := by + have hterm := + ofWithZeroValuation_val_pow_div_natCast + (v := v) (p := p) (n := n) x hnK hnval + have hlin : + (n : ℝ) * c ≤ + (n : ℝ) * ((ofWithZeroValuation v).val x : ℝ) := + mul_le_mul_of_nonneg_left hc (Nat.cast_nonneg n) + have hden : + (padicValNat p n : ℝ) ≤ Real.logb p n := + padicValNat_le_real_logb (p := p) n + have hmain : + (n : ℝ) * c - Real.logb p n ≤ + (n : ℝ) * ((ofWithZeroValuation v).val x : ℝ) - + (padicValNat p n : ℝ) := by + linarith + calc + (n : ℝ) * c - Real.logb p n ≤ + (n : ℝ) * ((ofWithZeroValuation v).val x : ℝ) - + (padicValNat p n : ℝ) := hmain + _ = + ((ofWithZeroValuation v).val + (x ^ n / Units.mk0 (n : K) hnK) : ℝ) := by + rw [hterm] + norm_num [Int.cast_sub, Int.cast_mul] + +/-- Real lower bound for the valuation of `x^n / n`, with a fixed +ramification-index scale in the denominator valuation. -/ +theorem ofWithZeroValuation_val_pow_div_natCast_scaled_real_lower_bound + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p n : ℕ} [Fact p.Prime] (e : ℕ) (x : Kˣ) + (hnK : (n : K) ≠ 0) + (hnval : + v (n : K) = + WithZero.exp (-((e : ℤ) * (padicValNat p n : ℤ)))) + {c : ℝ} (hc : c ≤ ((ofWithZeroValuation v).val x : ℝ)) : + (n : ℝ) * c - (e : ℝ) * Real.logb (p : ℝ) (n : ℝ) ≤ + ((ofWithZeroValuation v).val + (x ^ n / Units.mk0 (n : K) hnK) : ℝ) := by + have hterm := + ofWithZeroValuation_val_pow_div_natCast_scaled + (v := v) (p := p) (n := n) e x hnK hnval + have hlin : + (n : ℝ) * c ≤ + (n : ℝ) * ((ofWithZeroValuation v).val x : ℝ) := + mul_le_mul_of_nonneg_left hc (Nat.cast_nonneg n) + have hden_base : + (padicValNat p n : ℝ) ≤ Real.logb (p : ℝ) (n : ℝ) := + padicValNat_le_real_logb (p := p) n + have hden : + (e : ℝ) * (padicValNat p n : ℝ) ≤ + (e : ℝ) * Real.logb (p : ℝ) (n : ℝ) := + mul_le_mul_of_nonneg_left hden_base (Nat.cast_nonneg e) + have hmain : + (n : ℝ) * c - (e : ℝ) * Real.logb (p : ℝ) (n : ℝ) ≤ + (n : ℝ) * ((ofWithZeroValuation v).val x : ℝ) - + (e : ℝ) * (padicValNat p n : ℝ) := by + linarith + calc + (n : ℝ) * c - (e : ℝ) * Real.logb (p : ℝ) (n : ℝ) ≤ + (n : ℝ) * ((ofWithZeroValuation v).val x : ℝ) - + (e : ℝ) * (padicValNat p n : ℝ) := hmain + _ = + ((ofWithZeroValuation v).val + (x ^ n / Units.mk0 (n : K) hnK) : ℝ) := by + rw [hterm] + norm_num [Int.cast_sub, Int.cast_mul] + +/-- The valuations of the logarithm-series terms `x^(n+1)/(n+1)` tend to +`+∞`, assuming the natural-number denominators have their expected `p`-adic +values and `x` has positive valuation. -/ +theorem ofWithZeroValuation_val_pow_succ_div_natCast_tendsto_atTop + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (x : Kˣ) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-(padicValNat p (n + 1) : ℤ))) + {c : ℝ} (hcpos : 0 < c) + (hc : c ≤ ((ofWithZeroValuation v).val x : ℝ)) : + Tendsto + (fun n : ℕ => + ((ofWithZeroValuation v).val + (x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n)) : ℝ)) + atTop atTop := by + have hsource : + Tendsto + (fun n : ℕ => + ((n + 1 : ℕ) : ℝ) * c - Real.logb p (n + 1)) + atTop atTop := + tendsto_nat_succ_mul_const_sub_logb_atTop (p := p) hcpos + have hle : + (fun n : ℕ => + ((n + 1 : ℕ) : ℝ) * c - Real.logb p (n + 1)) ≤ᶠ[atTop] + (fun n : ℕ => + ((ofWithZeroValuation v).val + (x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n)) : ℝ)) := by + exact Eventually.of_forall fun n => by + simpa [Nat.cast_add, Nat.cast_one] using + ofWithZeroValuation_val_pow_div_natCast_real_lower_bound + (v := v) (p := p) (n := n + 1) x (hnK n) (hnval n) hc + exact tendsto_atTop_mono' atTop hle hsource + +/-- The valuations of the logarithm-series terms `x^(n+1)/(n+1)` tend to +`+∞` when the natural-number denominators have a fixed ramification-index +scale in their `p`-adic valuation. -/ +theorem ofWithZeroValuation_val_pow_succ_div_natCast_scaled_tendsto_atTop + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + {p : ℕ} [Fact p.Prime] (e : ℕ) (x : Kˣ) + (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) + (hnval : ∀ n : ℕ, + v (((n + 1 : ℕ) : K)) = + WithZero.exp (-((e : ℤ) * (padicValNat p (n + 1) : ℤ)))) + {c : ℝ} (hcpos : 0 < c) + (hc : c ≤ ((ofWithZeroValuation v).val x : ℝ)) : + Tendsto + (fun n : ℕ => + ((ofWithZeroValuation v).val + (x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n)) : ℝ)) + atTop atTop := by + have hsource : + Tendsto + (fun n : ℕ => + ((n + 1 : ℕ) : ℝ) * c - + (e : ℝ) * Real.logb (p : ℝ) ((n + 1 : ℕ) : ℝ)) + atTop atTop := + tendsto_nat_succ_mul_const_sub_const_mul_logb_atTop + (p := p) (c := c) (C := (e : ℝ)) hcpos + have hle : + (fun n : ℕ => + ((n + 1 : ℕ) : ℝ) * c - + (e : ℝ) * Real.logb (p : ℝ) ((n + 1 : ℕ) : ℝ)) ≤ᶠ[atTop] + (fun n : ℕ => + ((ofWithZeroValuation v).val + (x ^ (n + 1) / + Units.mk0 (((n + 1 : ℕ) : K)) (hnK n)) : ℝ)) := by + exact Eventually.of_forall fun n => by + simpa [Nat.cast_add, Nat.cast_one] using + ofWithZeroValuation_val_pow_div_natCast_scaled_real_lower_bound + (v := v) (p := p) (e := e) (n := n + 1) x + (hnK n) (hnval n) hc + exact tendsto_atTop_mono' atTop hle hsource + +end MultiplicativeIntegerValuation +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/UniformizerIntegerValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/UniformizerIntegerValuation.lean new file mode 100644 index 0000000000..2cf237d479 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/UniformizerIntegerValuation.lean @@ -0,0 +1,229 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValueGroup +/-! +# Integer valuations from complete-DVF uniformizers + +A chosen uniformizer determines the exponent of every nonzero field value and +therefore an integer-valued multiplicative valuation on field units. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +open WithZero +open scoped NNReal Valued WithZero + +namespace LocalFieldTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField + +namespace CompleteDVF + +variable {K : Type u} [Field K] + +/-- The nonzero value of a field unit, regarded as a unit of the ambient value +group. -/ +noncomputable def fieldUnitValueUnit + (F : CompleteDVF.{u, v} K) (x : Kˣ) : F.ValueGroupˣ := + Units.mk0 (F.valuation (x : K)) + ((_root_.Valuation.ne_zero_iff F.valuation).2 x.ne_zero) + +/-- Establishes the identity `(CompleteDVF.fieldUnitValueUnit F) (1 : Kˣ) = 1`. -/ +@[simp] +theorem fieldUnitValueUnit_one (F : CompleteDVF.{u, v} K) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) (1 : Kˣ) = 1 := by + ext + simp [fieldUnitValueUnit] + +/-- +`fieldUnitValueUnit` satisfies the multiplication formula `(CompleteDVF.fieldUnitValueUnit F) (x * +y) = (CompleteDVF.fieldUnitValueUnit F) x * (CompleteDVF.fieldUnitValueUnit F) y`. +-/ +@[simp] +theorem fieldUnitValueUnit_mul + (F : CompleteDVF.{u, v} K) (x y : Kˣ) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) (x * y) = + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) x * + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) y := by + ext + simp [fieldUnitValueUnit] + +/-- The value of a chosen uniformizer, regarded as a unit of the ambient value +group. -/ +noncomputable def uniformizerValueUnit + (F : CompleteDVF.{u, v} K) + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) : + F.ValueGroupˣ := + Units.mk0 (F.valuation (π : K)) hπ.val_ne_zero + +/-- The value of every field unit is an integral power of the value of a chosen +uniformizer. -/ +theorem exists_uniformizerValueUnit_zpow_eq_fieldUnitValueUnit + (F : CompleteDVF.{u, v} K) + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (x : Kˣ) : + ∃ n : ℤ, + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit F) hπ ^ n = + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) x := by + have hxmem : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) x ∈ + MonoidWithZeroHom.valueGroup + (MonoidWithZeroHom.ofClass F.valuation) := by + exact + MonoidWithZeroHom.mem_valueGroup + (MonoidWithZeroHom.ofClass F.valuation) + (show (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) x : + F.ValueGroup)) ∈ + Set.range F.valuation from + ⟨(x : K), by simp [fieldUnitValueUnit]⟩) + rw [hπ.zpowers_eq_valueGroup, Subgroup.mem_zpowers_iff] at hxmem + simpa [uniformizerValueUnit] using hxmem + +/-- Integral powers of the value of a uniformizer are indexed uniquely. -/ +theorem uniformizerValueUnit_zpow_inj + (F : CompleteDVF.{u, v} K) + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + {m n : ℤ} : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit F) hπ ^ m = + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit F) hπ ^ n ↔ + m = n := by + constructor + · intro h + have hvalue : + F.valuation (π : K) ^ m = + F.valuation (π : K) ^ n := by + simpa [uniformizerValueUnit, Units.val_zpow_eq_zpow_val] using + congrArg (fun γ : F.ValueGroupˣ => (γ : F.ValueGroup)) h + exact + (zpow_right_inj₀ hπ.val_pos (ne_of_lt hπ.val_lt_one)).1 hvalue + · intro h + rw [h] + +/-- The integer exponent of the value of a field unit with respect to a chosen +uniformizer. -/ +noncomputable def uniformizerValueExponent + (F : CompleteDVF.{u, v} K) + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (x : Kˣ) : ℤ := + Classical.choose + ((exists_uniformizerValueUnit_zpow_eq_fieldUnitValueUnit F) hπ x) + +/-- The chosen exponent really recovers the value of the field unit. -/ +theorem uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit + (F : CompleteDVF.{u, v} K) + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (x : Kˣ) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit F) hπ ^ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x = + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) x := + Classical.choose_spec + ((exists_uniformizerValueUnit_zpow_eq_fieldUnitValueUnit F) hπ x) + +/-- The integer-valued multiplicative valuation on `Kˣ` attached to a chosen +uniformizer of an arbitrary complete DVF. Its value is the exponent of the +field-unit value as a power of the uniformizer value. -/ +noncomputable def multiplicativeIntegerValuationOfUniformizer + (F : CompleteDVF.{u, v} K) + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) : + MultiplicativeIntegerValuation Kˣ where + val x := (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x + map_one := by + apply ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_inj F) + hπ).1 + rw [(uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F)] + simp + map_mul x y := by + apply ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_inj F) + hπ).1 + calc + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit F) hπ ^ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ (x + * y) = + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) (x * y) := by + rw [(uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F)] + _ = (LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) x * + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) y := by + rw [(LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit_mul F)] + _ = + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit F) hπ ^ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x * + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit F) hπ ^ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) + hπ y := by + rw [(uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F), + (uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F)] + _ = + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit F) hπ ^ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x + + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) + hπ y) := by + rw [← zpow_add] + +/-- +Establishes the identity `((CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ).val x = +(CompleteDVF.uniformizerValueExponent F) hπ x`. +-/ +@[simp] +theorem multiplicativeIntegerValuationOfUniformizer_val + (F : CompleteDVF.{u, v} K) + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (x : Kˣ) : + ((multiplicativeIntegerValuationOfUniformizer F) hπ).val x = + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x := + rfl + +/-- The chosen uniformizer has integer value one for the attached valuation. -/ +theorem multiplicativeIntegerValuationOfUniformizer_isUniformizer + (F : CompleteDVF.{u, v} K) + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) : + ((multiplicativeIntegerValuationOfUniformizer F) hπ).IsUniformizer + (Units.mk0 (π : K) hπ.ne_zero) := by + change (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ + (Units.mk0 (π : K) hπ.ne_zero) = 1 + apply ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_inj F) hπ).1 + rw [(uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F)] + ext + simp [fieldUnitValueUnit, uniformizerValueUnit] + +/-- The zero subgroup of the attached integer-valued valuation is exactly the +valuation-subring unit group. -/ +theorem multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup + (F : CompleteDVF.{u, v} K) + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) : + ((multiplicativeIntegerValuationOfUniformizer F) hπ).zeroSubgroup = + F.valuation.valuationSubring.unitGroup := by + ext x + rw [LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.mem_zeroSubgroup_iff, + _root_.Valuation.mem_unitGroup_iff] + change (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x = 0 ↔ + F.valuation (x : K) = 1 + constructor + · intro hx + have hvalue := + (uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F) hπ x + rw [hx, zpow_zero] at hvalue + have hvalue' := + congrArg (fun γ : F.ValueGroupˣ => (γ : F.ValueGroup)) hvalue + simpa [fieldUnitValueUnit] using hvalue'.symm + · intro hx + apply ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_inj F) + hπ).1 + rw [(uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F)] + ext + simp [fieldUnitValueUnit, hx] + +end CompleteDVF +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuationSubringUnitMap.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuationSubringUnitMap.lean new file mode 100644 index 0000000000..e95383b065 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuationSubringUnitMap.lean @@ -0,0 +1,71 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic +/-! +# Valuation-subring units inside field units + +This file defines the canonical homomorphism from units of a complete-DVF +valuation ring to units of its fraction field. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace LocalFieldTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField + +namespace CompleteDVF + +variable {K : Type u} [Field K] + +/-- The inclusion `O_K^* -> K^*` for the chosen valuation ring of a complete +DVF. -/ +noncomputable def valuationSubringUnitsToFieldUnits + (F : CompleteDVF.{u, v} K) : F.valuationSubringˣ →* Kˣ := + F.valuation.valuationSubring.unitGroup.subtype.comp + F.valuation.valuationSubring.unitGroupMulEquiv.symm.toMonoidHom + +/-- +The defining evaluation formula for `coe_valuationSubringUnitsToFieldUnits` is +`(((CompleteDVF.valuationSubringUnitsToFieldUnits F) a : Kˣ) : K) = (a : F.valuationSubring)`. +-/ +@[simp] theorem coe_valuationSubringUnitsToFieldUnits_apply + (F : CompleteDVF.{u, v} K) (a : F.valuationSubringˣ) : + (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.valuationSubringUnitsToFieldUnits F) + a : Kˣ) : K) = + (a : F.valuationSubring) := by + change + ((F.valuation.valuationSubring.unitGroupMulEquiv.symm a : Kˣ) : K) = + (a : K) + exact _root_.ValuationSubring.coe_unitGroupMulEquiv_symm_apply + (A := F.valuation.valuationSubring) (K := K) a + +/-- +Establishes the membership statement `(CompleteDVF.valuationSubringUnitsToFieldUnits F) a ∈ +F.valuation.valuationSubring.unitGroup`. +-/ +theorem valuationSubringUnitsToFieldUnits_mem_unitGroup + (F : CompleteDVF.{u, v} K) (a : F.valuationSubringˣ) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.valuationSubringUnitsToFieldUnits F) a ∈ + F.valuation.valuationSubring.unitGroup := by + change + ((F.valuation.valuationSubring.unitGroupMulEquiv.symm a : + F.valuation.valuationSubring.unitGroup) : Kˣ) ∈ + F.valuation.valuationSubring.unitGroup + exact (F.valuation.valuationSubring.unitGroupMulEquiv.symm a).2 + + +end CompleteDVF +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuedExtensionUnitMap.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuedExtensionUnitMap.lean new file mode 100644 index 0000000000..c956a19918 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuedExtensionUnitMap.lean @@ -0,0 +1,137 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormBase +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal +/-! +# Valuation-subring units in complete-DVF extensions + +This file proves compatibility of valuation-ring units with scalar extension +and relates the value of an embedded base uniformizer to the ramification +index. +-/ + +@[expose] public section + +noncomputable +section + +universe u v x + +namespace LocalFieldTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField + +namespace ValuedExtension + +open ValuationTheory.DiscreteValuationField.ValuedExtension + +variable {K : Type u} {L : Type u} [Field K] [Field L] +variable [Algebra K L] +variable (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{u, x} L) +variable [base.valuation.HasExtension target.valuation] + +/-- Embedded base field units of valuation one remain valuation-one units in +the target field. -/ +theorem baseUnitsMap_mem_target_unitGroup_of_mem_base_unitGroup + {a : Kˣ} + (ha : a ∈ base.valuation.valuationSubring.unitGroup) : + baseUnitsMap (K := K) (L := L) a ∈ + target.valuation.valuationSubring.unitGroup := by + rw [_root_.Valuation.mem_unitGroup_iff] at ha ⊢ + simpa using + (_root_.Valuation.HasExtension.val_map_eq_one_iff + (vR := base.valuation) (vA := target.valuation) (a : K)).2 ha + +/-- Subgroup form: the embedded base valuation-one unit group maps into the +target valuation-one unit group. -/ +theorem baseUnitGroup_map_le_target_unitGroup + : + (base.valuation.valuationSubring.unitGroup).map + (baseUnitsMap (K := K) (L := L)) ≤ + target.valuation.valuationSubring.unitGroup := by + intro a ha + rcases ha with ⟨b, hb, rfl⟩ + exact baseUnitsMap_mem_target_unitGroup_of_mem_base_unitGroup base target hb + +/-- Compatibility between the valuation-ring unit map and the field-unit map. -/ +theorem baseUnitsMap_valuationSubringUnitsToFieldUnits + (a : base.valuationSubringˣ) : + baseUnitsMap (K := K) (L := L) + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.valuationSubringUnitsToFieldUnits + base) a) = + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.valuationSubringUnitsToFieldUnits target) + (Units.map (integerMap base.toDVF target.toDVF).toMonoidHom a) := by + ext + simp [CompleteDVF.coe_valuationSubringUnitsToFieldUnits_apply, + integerMap_apply base.toDVF target.toDVF] + +/-- The ramification-ideal unit-multiple source gives the value of the embedded +base uniformizer. + +This is the source-producing bridge from +`exists_unit_mul_target_uniformizer_pow_eq_base_uniformizer_image` to the +`hϖmap` input used by `ValuationScaling.lean`. -/ +theorem base_uniformizer_image_val_eq_ramificationIndex + (vL : MultiplicativeIntegerValuation Lˣ) + (hunit : + ∀ u : target.valuationSubringˣ, + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.valuationSubringUnitsToFieldUnits + target) u ∈ vL.zeroSubgroup) + {ϖ : base.valuationSubring} {π : target.valuationSubring} + (hϖ : base.valuation.IsUniformizer (ϖ : K)) + (hπ : target.valuation.IsUniformizer (π : L)) + (hπval : vL.val (Units.mk0 (π : L) hπ.ne_zero) = 1) : + vL.val + (baseUnitsMap (K := K) (L := L) + (Units.mk0 (ϖ : K) hϖ.ne_zero)) = + (ramificationIndex base.toDVF target.toDVF : ℤ) := by + rcases + (exists_unit_mul_target_uniformizer_pow_eq_base_uniformizer_image + base target hϖ hπ) with + ⟨u, hu⟩ + let ϖK : Kˣ := Units.mk0 (ϖ : K) hϖ.ne_zero + let πL : Lˣ := Units.mk0 (π : L) hπ.ne_zero + have hfield : + algebraMap K L (ϖ : K) = + ((u : target.valuationSubring) : L) * + (π : L) ^ ramificationIndex base.toDVF target.toDVF := by + calc + algebraMap K L (ϖ : K) = + ((integerMap base.toDVF target.toDVF ϖ : + target.valuationSubring) : L) := + (integerMap_apply base.toDVF target.toDVF ϖ).symm + _ = (((u : target.valuationSubring) * + π ^ ramificationIndex base.toDVF target.toDVF : + target.valuationSubring) : L) := by + rw [hu] + _ = ((u : target.valuationSubring) : L) * + (π : L) ^ ramificationIndex base.toDVF target.toDVF := by + simp + have hbase : + baseUnitsMap (K := K) (L := L) ϖK = + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.valuationSubringUnitsToFieldUnits + target) u * + πL ^ ramificationIndex base.toDVF target.toDVF := by + ext + simpa [ϖK, πL, + CompleteDVF.coe_valuationSubringUnitsToFieldUnits_apply] using hfield + have hπLval : vL.val πL = 1 := by + simpa [πL] using hπval + change + vL.val (baseUnitsMap (K := K) (L := L) ϖK) = + (ramificationIndex base.toDVF target.toDVF : ℤ) + rw [hbase, vL.val_mul, + (vL.mem_zeroSubgroup_iff _).1 (hunit u), vL.val_pow, hπLval] + ring + +end ValuedExtension + +end LocalFieldTheory.DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValueGroup.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValueGroup.lean new file mode 100644 index 0000000000..e1d3b51784 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValueGroup.lean @@ -0,0 +1,218 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Quotients +public import Mathlib.Data.Int.ModEq + +/-! # Value Group -/ + +@[expose] public section +namespace LocalFieldTheory + +/-! +# Integer value-group images + +This file contains the integer value-group subgroup-image lemmas used by + the norm and ramification-image arguments. The results are purely about +integer-valued multiplicative valuations and integer lcm divisibility. +-/ + +noncomputable +section + +namespace DiscreteValuationField + +/-- Membership in both integer-multiple value subgroups is the same as +membership in the subgroup cut out by the lcm. -/ +theorem int_lcm_dvd_iff_dvd_and_dvd (d e n : ℤ) : + ((d.lcm e : ℕ) : ℤ) ∣ n ↔ d ∣ n ∧ e ∣ n := by + have h := + (Int.modEq_and_modEq_iff_modEq_lcm + (a := n) (b := 0) (m := d) (n := e)) + simpa [Int.modEq_iff_dvd] using h.symm + +/-- Introduction form for integer lcm divisibility. -/ +theorem int_lcm_dvd_of_dvd_of_dvd {d e n : ℤ} + (hd : d ∣ n) (he : e ∣ n) : + ((d.lcm e : ℕ) : ℤ) ∣ n := + (int_lcm_dvd_iff_dvd_and_dvd d e n).2 ⟨hd, he⟩ + +/-- The integer-multiple subgroup for `lcm d e` is the intersection of the two +integer-multiple subgroups for `d` and `e`. -/ +theorem integerMultipleSubgroup_lcm_eq_inf (d e : ℤ) : + integerMultipleSubgroup ((d.lcm e : ℕ) : ℤ) = + integerMultipleSubgroup d ⊓ integerMultipleSubgroup e := by + ext n + change n ∈ integerMultipleSubgroup ((d.lcm e : ℕ) : ℤ) ↔ + n ∈ integerMultipleSubgroup d ∧ n ∈ integerMultipleSubgroup e + rw [mem_integerMultipleSubgroup_iff, + mem_integerMultipleSubgroup_iff, + mem_integerMultipleSubgroup_iff] + exact int_lcm_dvd_iff_dvd_and_dvd d e (Multiplicative.toAdd n) + +/-- Inclusion between integer-multiple value subgroups is exactly divisibility +of the corresponding integer steps, with the order reversed. -/ +theorem integerMultipleSubgroup_le_iff_dvd (a b : ℤ) : + integerMultipleSubgroup b ≤ integerMultipleSubgroup a ↔ a ∣ b := by + constructor + · intro h + have hb : Multiplicative.ofAdd b ∈ integerMultipleSubgroup b := by + rw [ofAdd_mem_integerMultipleSubgroup_iff] + simpa using h hb + · intro h + exact integerMultipleSubgroup_le_of_dvd h + +/-- Extract lcm divisibility from two integer-multiple subgroup inclusions. -/ +theorem int_lcm_dvd_of_integerMultipleSubgroup_le_of_le + {n d e : ℤ} + (hd : integerMultipleSubgroup n ≤ integerMultipleSubgroup d) + (he : integerMultipleSubgroup n ≤ integerMultipleSubgroup e) : + ((d.lcm e : ℕ) : ℤ) ∣ n := by + have hle : integerMultipleSubgroup n ≤ + integerMultipleSubgroup d ⊓ integerMultipleSubgroup e := + le_inf hd he + rw [← integerMultipleSubgroup_lcm_eq_inf d e] at hle + exact (integerMultipleSubgroup_le_iff_dvd ((d.lcm e : ℕ) : ℤ) n).1 hle + +namespace MultiplicativeIntegerValuation + +variable {G : Type _} [Group G] + +/-- The subgroup of valuation values attained by elements of a subgroup of the +valued group. -/ +def subgroupValueSubgroup + (V : MultiplicativeIntegerValuation G) (S : Subgroup G) : + Subgroup (Multiplicative ℤ) where + carrier := {n | ∃ x : G, x ∈ S ∧ V.valuationHom x = n} + one_mem' := ⟨1, S.one_mem, V.valuationHom.map_one⟩ + mul_mem' := by + rintro a b ⟨x, hx, rfl⟩ ⟨y, hy, rfl⟩ + exact ⟨x * y, S.mul_mem hx hy, V.valuationHom.map_mul x y⟩ + inv_mem' := by + rintro a ⟨x, hx, rfl⟩ + exact ⟨x⁻¹, S.inv_mem hx, V.valuationHom.map_inv x⟩ + +/-- +Characterizes `n ∈ V.subgroupValueSubgroup S` by the equivalent condition `∃ x : G, x ∈ S ∧ +V.valuationHom x = n`. +-/ +@[simp] theorem mem_subgroupValueSubgroup_iff + (V : MultiplicativeIntegerValuation G) (S : Subgroup G) + (n : Multiplicative ℤ) : + n ∈ V.subgroupValueSubgroup S ↔ + ∃ x : G, x ∈ S ∧ V.valuationHom x = n := + Iff.rfl + +/-- Membership of `Multiplicative.ofAdd n` in a subgroup value image is exactly +the existence of an element of that subgroup whose valuation is `n`. -/ +theorem ofAdd_mem_subgroupValueSubgroup_iff + (V : MultiplicativeIntegerValuation G) (S : Subgroup G) (n : ℤ) : + Multiplicative.ofAdd n ∈ V.subgroupValueSubgroup S ↔ + ∃ x : G, x ∈ S ∧ V.val x = n := by + rw [V.mem_subgroupValueSubgroup_iff S (Multiplicative.ofAdd n)] + constructor + · rintro ⟨x, hxS, hx⟩ + rw [V.valuationHom_apply] at hx + exact ⟨x, hxS, Multiplicative.ofAdd.injective hx⟩ + · rintro ⟨x, hxS, hx⟩ + exact ⟨x, hxS, by rw [V.valuationHom_apply, hx]⟩ + +/-- Subgroup inclusion induces inclusion on the corresponding value images. -/ +theorem subgroupValueSubgroup_mono + (V : MultiplicativeIntegerValuation G) {S T : Subgroup G} + (hST : S ≤ T) : + V.subgroupValueSubgroup S ≤ V.subgroupValueSubgroup T := by + intro n hn + rw [V.mem_subgroupValueSubgroup_iff S n] at hn + rw [V.mem_subgroupValueSubgroup_iff T n] + rcases hn with ⟨x, hxS, hxn⟩ + exact ⟨x, hST hxS, hxn⟩ + +/-- A subgroup value image lies in an integer-multiple subgroup exactly when +every element of the source subgroup has valuation divisible by that integer. -/ +theorem subgroupValueSubgroup_le_integerMultipleSubgroup_iff + (V : MultiplicativeIntegerValuation G) (S : Subgroup G) (d : ℤ) : + V.subgroupValueSubgroup S ≤ integerMultipleSubgroup d ↔ + ∀ x : G, x ∈ S → d ∣ V.val x := by + constructor + · intro h x hx + have hxvalue : V.valuationHom x ∈ V.subgroupValueSubgroup S := by + rw [V.mem_subgroupValueSubgroup_iff] + exact ⟨x, hx, rfl⟩ + have hxmultiple := h hxvalue + rw [mem_integerMultipleSubgroup_iff] at hxmultiple + simpa + [_root_.LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.valuationHom] + using hxmultiple + · intro h n hn + rw [V.mem_subgroupValueSubgroup_iff S n] at hn + rcases hn with ⟨x, hx, rfl⟩ + rw [mem_integerMultipleSubgroup_iff] + simpa + [_root_.LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.valuationHom] + using h x hx + +/-- A lower value-step inclusion for a larger subgroup value image restricts to +any smaller subgroup value image. -/ +theorem subgroupValueSubgroup_le_integerMultipleSubgroup_of_le + (V : MultiplicativeIntegerValuation G) {S T : Subgroup G} {d : ℤ} + (hST : S ≤ T) + (hT : V.subgroupValueSubgroup T ≤ integerMultipleSubgroup d) : + V.subgroupValueSubgroup S ≤ integerMultipleSubgroup d := + le_trans (V.subgroupValueSubgroup_mono hST) hT + +/-- If a subgroup contains an element of valuation `n`, then the +integer-multiple subgroup generated by `n` lies in the subgroup's value image. -/ +theorem integerMultipleSubgroup_le_subgroupValueSubgroup_of_exists_mem_val + (V : MultiplicativeIntegerValuation G) {S : Subgroup G} {n : ℤ} + (hn : ∃ x : G, x ∈ S ∧ V.val x = n) : + integerMultipleSubgroup n ≤ V.subgroupValueSubgroup S := by + rcases hn with ⟨x, hxS, hxval⟩ + intro m hm + rw [mem_integerMultipleSubgroup_iff] at hm + rcases hm with ⟨k, hk⟩ + rw [V.mem_subgroupValueSubgroup_iff] + refine ⟨x ^ k, S.zpow_mem hxS k, ?_⟩ + apply Multiplicative.toAdd.injective + rw [V.valuationHom_apply, toAdd_ofAdd, V.val_zpow, hxval] + exact (mul_comm k n).trans hk.symm + +/-- Generator form of the subgroup-image lcm sandwich. -/ +theorem int_lcm_dvd_of_exists_mem_val_of_subgroupValueSubgroup_le + (V : MultiplicativeIntegerValuation G) {S : Subgroup G} {n d e : ℤ} + (hn : ∃ x : G, x ∈ S ∧ V.val x = n) + (hd : V.subgroupValueSubgroup S ≤ integerMultipleSubgroup d) + (he : V.subgroupValueSubgroup S ≤ integerMultipleSubgroup e) : + ((d.lcm e : ℕ) : ℤ) ∣ n := + int_lcm_dvd_of_integerMultipleSubgroup_le_of_le + (le_trans + (V.integerMultipleSubgroup_le_subgroupValueSubgroup_of_exists_mem_val hn) + hd) + (le_trans + (V.integerMultipleSubgroup_le_subgroupValueSubgroup_of_exists_mem_val hn) + he) + +/-- Larger common-image form of the lcm sandwich. -/ +theorem int_lcm_dvd_of_exists_mem_val_of_le_of_subgroupValueSubgroup_le + (V : MultiplicativeIntegerValuation G) {S T : Subgroup G} {n d e : ℤ} + (hn : ∃ x : G, x ∈ S ∧ V.val x = n) + (hST : S ≤ T) + (hd : V.subgroupValueSubgroup T ≤ integerMultipleSubgroup d) + (he : V.subgroupValueSubgroup T ≤ integerMultipleSubgroup e) : + ((d.lcm e : ℕ) : ℤ) ∣ n := + V.int_lcm_dvd_of_exists_mem_val_of_subgroupValueSubgroup_le hn + (V.subgroupValueSubgroup_le_integerMultipleSubgroup_of_le hST hd) + (V.subgroupValueSubgroup_le_integerMultipleSubgroup_of_le hST he) + +end MultiplicativeIntegerValuation + +end DiscreteValuationField + +end + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/WithZeroValuationTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/WithZeroValuationTopology.lean new file mode 100644 index 0000000000..d100733359 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/WithZeroValuationTopology.lean @@ -0,0 +1,123 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuedExtensionUnitMap +/-! +# The direct topology of a standard multiplicative integer valuation + +This file transfers completeness from the actual-range restriction of a +complete discrete valuation back to the topology obtained directly from +`Valued.mk' v`. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming + mrangeRestrictNontriviallyNormedField → + mrangeRestrictNontriviallyNormedField + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming + mrangeRestrict_completeSpace_of_residueField_finite → + mrangeRestrict_completeSpace_of_residueField_finite + + +noncomputable +section + +universe u + +open Filter +open scoped Valued +open LocalFieldTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField + +namespace LocalFieldTheory.DiscreteValuationField +namespace WithZeroValuationTopology + +variable {K : Type u} [Field K] + +/-- The complete-DVF package attached to a standard `ℤᵐ⁰`-valued complete +discrete valuation. -/ +def completeDVF + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [Valuation.IsCompleteDiscrete v] : CompleteDVF.{u, 0} K where + ValueGroup := WithZero (Multiplicative ℤ) + valuation := v + instCompleteDiscrete := inferInstance + +/-- Restricting a standard `ℤᵐ⁰`-valued valuation to its actual range does not +change the uniform structure on the field. -/ +theorem valuedMk_uniformSpace_eq_mrangeRestrict + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [Valuation.IsCompleteDiscrete v] : + (Valued.mk' v).toUniformSpace = + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + (completeDVF v)).toUniformSpace := by + let w := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + (completeDVF v) + have hequiv : v.IsEquiv w := by + intro x y + rw [← Subtype.coe_le_coe] + rfl + change (Valued.mk' v).toUniformSpace = (Valued.mk' w).toUniformSpace + apply le_antisymm + · rw [le_iff_uniformContinuous_id] + simpa using hequiv.symm.uniformContinuous + · rw [le_iff_uniformContinuous_id] + simpa using hequiv.uniformContinuous + +/-- A standard complete discrete valuation with finite residue field makes the +field complete for the topology obtained directly from `Valued.mk' v`. -/ +theorem completeSpace_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] : + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + CompleteSpace K := by + let F : CompleteDVF.{u, 0} K := completeDVF v + let direct : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let restrictedNormed : NontriviallyNormedField K := + mrangeRestrictNontriviallyNormedField F + have : Finite F.residueField := by + change Finite (IsLocalRing.ResidueField v.valuationSubring) + infer_instance + have hcomplete : @CompleteSpace K restrictedNormed.toUniformSpace := by + exact + mrangeRestrict_completeSpace_of_residueField_finite F + have huniform : direct.toUniformSpace = restrictedNormed.toUniformSpace := by + change + (Valued.mk' v).toUniformSpace = + (mrangeRestrictNontriviallyNormedField + (completeDVF v)).toUniformSpace + calc + (Valued.mk' v).toUniformSpace = + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + (completeDVF v)).toUniformSpace := + valuedMk_uniformSpace_eq_mrangeRestrict v + _ = + (mrangeRestrictNontriviallyNormedField + (completeDVF v)).toUniformSpace := by + rfl + let : Valued K (WithZero (Multiplicative ℤ)) := direct + change @CompleteSpace K direct.toUniformSpace + rw [huniform] + exact hcomplete + +end WithZeroValuationTopology +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory.lean new file mode 100644 index 0000000000..8a1621d109 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.ContinuousQuotientEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.IntegerMultipleSubgroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.PowerIndex + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/ContinuousQuotientEquiv.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/ContinuousQuotientEquiv.lean new file mode 100644 index 0000000000..804189edd0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/ContinuousQuotientEquiv.lean @@ -0,0 +1,65 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Topology.Algebra.Group.Quotient +public import Mathlib.Topology.Algebra.ContinuousMonoidHom +/-! +# Continuous equivalences of quotient groups + +This module supplies the quotient equivalence induced by a continuous +multiplicative equivalence. It belongs to the general local-field support +layer and does not depend on the separate pro-\(C\) groups library. +-/ + +@[expose] public section + +open scoped Topology + +noncomputable +section + +namespace LocalFieldTheory.QuotientGroup + +universe u v + +variable {G : Type u} {H : Type v} +variable [Group G] [TopologicalSpace G] +variable [Group H] [TopologicalSpace H] + +/-- A continuous multiplicative equivalence descends to continuously +equivalent quotients when it maps one normal subgroup onto the other. -/ +noncomputable def continuousCongr + (N : Subgroup G) (M : Subgroup H) [N.Normal] [M.Normal] + (e : G ≃ₜ* H) (h : N.map e.toMulEquiv.toMonoidHom = M) : + G ⧸ N ≃ₜ* H ⧸ M := by + let eAlg : G ⧸ N ≃* H ⧸ M := + QuotientGroup.congr (G' := N) (H' := M) e.toMulEquiv h + refine + { toMulEquiv := eAlg + continuous_toFun := ?_ + continuous_invFun := ?_ } + · refine (QuotientGroup.isQuotientMap_mk N).continuous_iff.2 ?_ + change Continuous fun x : G => QuotientGroup.mk' M (e x) + exact continuous_quotient_mk'.comp e.continuous_toFun + · refine (QuotientGroup.isQuotientMap_mk M).continuous_iff.2 ?_ + have hsymm : M.map e.symm.toMulEquiv.toMonoidHom = N := + (Subgroup.map_symm_eq_iff_map_eq (K := N) (H := M) + (e := e.toMulEquiv)).mpr h + change Continuous fun y : H => QuotientGroup.mk' N (e.symm y) + exact continuous_quotient_mk'.comp e.symm.continuous_toFun + +/-- The descended equivalence acts on quotient classes through the original +equivalence. -/ +theorem continuousCongr_mk + (N : Subgroup G) (M : Subgroup H) [N.Normal] [M.Normal] + (e : G ≃ₜ* H) (h : N.map e.toMulEquiv.toMonoidHom = M) (g : G) : + continuousCongr N M e h (QuotientGroup.mk' N g) = + QuotientGroup.mk' M (e g) := + rfl + +end LocalFieldTheory.QuotientGroup diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/IntegerMultipleSubgroup.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/IntegerMultipleSubgroup.lean new file mode 100644 index 0000000000..69c191e2de --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/IntegerMultipleSubgroup.lean @@ -0,0 +1,153 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Group.Int.TypeTags +public import Mathlib.Data.ZMod.QuotientGroup +public import Mathlib.Tactic + +/-! +# Integer multiple subgroups + +Pure group-theoretic infrastructure for the subgroup of multiplicative +integers divisible by a fixed integer and its cyclic quotient. It lives below +the discrete-valuation-field layer so generic power-index code does not depend +on valued-field norm modules. + +The declarations retain the established +`LocalFieldTheory.DiscreteValuationField` namespace because the same value +group is used by the valuation API; their implementation has no valued-field +hypotheses. +-/ + +@[expose] public section +namespace LocalFieldTheory.DiscreteValuationField + +/-- The subgroup of `Multiplicative ℤ` consisting of elements whose additive +integer is divisible by `d`. -/ +def integerMultipleSubgroup (d : ℤ) : Subgroup (Multiplicative ℤ) where + carrier := {n | d ∣ Multiplicative.toAdd n} + one_mem' := by + change d ∣ (0 : ℤ) + exact dvd_zero d + mul_mem' := by + intro x y hx hy + change d ∣ Multiplicative.toAdd (x * y) + rw [toAdd_mul] + exact dvd_add hx hy + inv_mem' := by + intro x hx + change d ∣ Multiplicative.toAdd x⁻¹ + rw [toAdd_inv] + exact dvd_neg.mpr hx + +/-- An integer lies in the subgroup generated by multiples of `n` exactly when `n` divides it. -/ +@[simp] theorem mem_integerMultipleSubgroup_iff + (d : ℤ) (n : Multiplicative ℤ) : + n ∈ integerMultipleSubgroup d ↔ d ∣ Multiplicative.toAdd n := + Iff.rfl + +/-- Membership of a multiplicative integer in the multiple subgroup is equivalent to divisibility of +its additive value. -/ +theorem ofAdd_mem_integerMultipleSubgroup_iff (d n : ℤ) : + Multiplicative.ofAdd n ∈ integerMultipleSubgroup d ↔ d ∣ n := by + rw [mem_integerMultipleSubgroup_iff, toAdd_ofAdd] + +/-- Multiplying two multiplicative integers from the multiple subgroup remains in that subgroup. -/ +theorem ofAdd_mul_mem_integerMultipleSubgroup (d n : ℤ) : + Multiplicative.ofAdd (d * n) ∈ integerMultipleSubgroup d := by + rw [ofAdd_mem_integerMultipleSubgroup_iff] + exact dvd_mul_right d n + +/-- The multiple subgroup is closed under multiplication in either order. -/ +theorem ofAdd_mul_comm_mem_integerMultipleSubgroup (d n : ℤ) : + Multiplicative.ofAdd (n * d) ∈ integerMultipleSubgroup d := by + rw [mul_comm] + exact ofAdd_mul_mem_integerMultipleSubgroup d n + +/-- Divisibility of generators reverses inclusion between their integer-multiple subgroups. -/ +theorem integerMultipleSubgroup_le_of_dvd {a b : ℤ} (hab : a ∣ b) : + integerMultipleSubgroup b ≤ integerMultipleSubgroup a := by + intro n hn + rw [mem_integerMultipleSubgroup_iff] at hn ⊢ + exact dvd_trans hab hn + +/-- Every multiplicative integer belongs to the subgroup of multiples of one. -/ +@[simp] theorem integerMultipleSubgroup_one_eq_top : + integerMultipleSubgroup (1 : ℤ) = ⊤ := by + ext n + rw [mem_integerMultipleSubgroup_iff] + simp + +/-- Reduction of multiplicative integers modulo the subgroup of multiples of +`d`, written as a homomorphism to `Multiplicative (ZMod |d|)`. -/ +def multiplicativeIntToZModHom (d : ℤ) : + Multiplicative ℤ →* Multiplicative (ZMod d.natAbs) := + AddMonoidHom.toMultiplicative (Int.castAddHom (ZMod d.natAbs)) + +/-- Reduction modulo `n` sends a multiplicative integer to the residue class of its additive value. +Reduction modulo `n` sends a multiplicative integer to the residue class of its additive value. -/ +@[simp] theorem multiplicativeIntToZModHom_apply + (d : ℤ) (n : Multiplicative ℤ) : + multiplicativeIntToZModHom d n = + Multiplicative.ofAdd ((n.toAdd : ZMod d.natAbs)) := + rfl + +/-- The kernel of reduction modulo `n` is precisely the subgroup of integer multiples of `n`. -/ +theorem multiplicativeIntToZModHom_ker_eq_integerMultipleSubgroup (d : ℤ) : + (multiplicativeIntToZModHom d).ker = integerMultipleSubgroup d := by + ext n + change ((n.toAdd : ZMod d.natAbs) = 0) ↔ d ∣ n.toAdd + rw [ZMod.intCast_zmod_eq_zero_iff_dvd] + exact Int.natAbs_dvd + +/-- Every residue class modulo `n` is represented by a multiplicative integer. -/ +theorem multiplicativeIntToZModHom_surjective (d : ℤ) : + Function.Surjective (multiplicativeIntToZModHom d) := by + intro q + rcases ZMod.intCast_surjective q.toAdd with ⟨n, hn⟩ + refine ⟨Multiplicative.ofAdd n, ?_⟩ + change Multiplicative.ofAdd ((n : ZMod d.natAbs)) = q + rw [hn] + rfl + +/-- The quotient of multiplicative integers by multiples of `d` is the +standard cyclic value group `Multiplicative (ZMod |d|)`. -/ +noncomputable def valueModIntegerMultipleSubgroupEquivZMod (d : ℤ) : + Multiplicative ℤ ⧸ integerMultipleSubgroup d ≃* + Multiplicative (ZMod d.natAbs) := + (QuotientGroup.quotientMulEquivOfEq + (multiplicativeIntToZModHom_ker_eq_integerMultipleSubgroup d).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (multiplicativeIntToZModHom d) + (multiplicativeIntToZModHom_surjective d)) + +/-- The quotient-to-`ZMod` equivalence sends a quotient class to reduction of its representative +modulo `n`. -/ +theorem valueModIntegerMultipleSubgroupEquivZMod_mk + (d n : ℤ) : + valueModIntegerMultipleSubgroupEquivZMod d + (QuotientGroup.mk' (integerMultipleSubgroup d) + (Multiplicative.ofAdd n)) = + Multiplicative.ofAdd ((n : ZMod d.natAbs)) := by + change + (QuotientGroup.quotientKerEquivOfSurjective + (multiplicativeIntToZModHom d) + (multiplicativeIntToZModHom_surjective d)) + (QuotientGroup.mk' (multiplicativeIntToZModHom d).ker + (Multiplicative.ofAdd n)) = + Multiplicative.ofAdd ((n : ZMod d.natAbs)) + unfold QuotientGroup.quotientKerEquivOfSurjective + QuotientGroup.quotientKerEquivOfRightInverse + change + QuotientGroup.kerLift (multiplicativeIntToZModHom d) + (QuotientGroup.mk' (multiplicativeIntToZModHom d).ker + (Multiplicative.ofAdd n)) = + Multiplicative.ofAdd ((n : ZMod d.natAbs)) + rfl + +end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/PowerIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/PowerIndex.lean new file mode 100644 index 0000000000..c46819cb38 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/PowerIndex.lean @@ -0,0 +1,909 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import Mathlib.Algebra.Group.Subgroup.Ker +public import Mathlib.Algebra.Group.Hom.Basic +public import Mathlib.Algebra.Group.Subgroup.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.IntegerMultipleSubgroup +public import Mathlib.RingTheory.RootsOfUnity.Basic +/-! +# Power indices in commutative groups + +Reusable kernel, quotient, product, and additive-transport formulas for +`n`-th powers in commutative groups. The basic power map and its image and +kernel are mathlib's `powMonoidHom`, `MonoidHom.range`, and `MonoidHom.ker`. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalFieldTheory + +open LocalFieldTheory.DiscreteValuationField +open scoped Int + +section NthPowers + +universe uG uH uU + +variable (G : Type uG) (H : Type uH) (U : Type uU) +variable [CommGroup G] [CommGroup H] [CommGroup U] + + +/-- The identity element is an `n`-th power and hence lies in the range of the power endomorphism. +The identity element is an `n`-th power and hence lies in the range of the power endomorphism. -/ +theorem powMonoidHom_range_one_mem (n : ℕ) : + (1 : G) ∈ (powMonoidHom n : G →* G).range := by + rw [MonoidHom.mem_range] + exact ⟨1, one_pow n⟩ + +/-- A subgroup of a commutative group contains the powers indexed by its +index. -/ +theorem powMonoidHom_range_index_le (H : Subgroup G) : + (powMonoidHom H.index : G →* G).range ≤ H := by + intro x hx + obtain ⟨y, rfl⟩ := (MonoidHom.mem_range (G := G)).1 hx + exact H.pow_index_mem y + +/-- In a finite commutative group, the `n`-th-power quotient has the same +cardinality as the subgroup of `n`-torsion elements. This is the finite +kernel/cokernel equality for the power endomorphism. -/ +theorem card_nthPowerQuotient_eq_nthPowerKernel + [Finite G] (n : ℕ) : + Nat.card (G ⧸ (powMonoidHom n : G →* G).range) = + Nat.card ((powMonoidHom n : G →* G).ker) := by + change ((powMonoidHom n : G →* G)).range.index = Nat.card ((powMonoidHom n : G →* G)).ker + rw [Subgroup.index_range] + +/-- A multiplicative equivalence transports `n`-torsion kernels. -/ +def nthPowerKernelEquivOfMulEquiv (n : ℕ) (e : G ≃* H) : + (powMonoidHom n : G →* G).ker ≃* (powMonoidHom n : H →* H).ker where + toFun x := + ⟨e (x : G), by + have hx : (x : G) ^ n = 1 := + (MonoidHom.mem_ker (G := G)).1 x.property + change (e (x : G)) ^ n = 1 + simpa [map_pow] using congrArg e hx⟩ + invFun y := + ⟨e.symm (y : H), by + have hy : (y : H) ^ n = 1 := + (MonoidHom.mem_ker (G := H)).1 y.property + change (e.symm (y : H)) ^ n = 1 + simpa [map_pow] using congrArg e.symm hy⟩ + left_inv x := by + ext + simp + right_inv y := by + ext + simp + map_mul' x y := by + ext + simp + +/-- A multiplicative equivalence carries the range of the `n`-th power map onto the corresponding +range. -/ +theorem powMonoidHom_range_map (n : ℕ) (e : G ≃* H) : + ((powMonoidHom n : G →* G).range).map e.toMonoidHom = (powMonoidHom n : H →* H).range := by + exact e.map_range_powMonoidHom n + +/-- A multiplicative equivalence transports `n`-torsion kernels. -/ +theorem powMonoidHom_ker_map (n : ℕ) (e : G ≃* H) : + ((powMonoidHom n : G →* G).ker).map e.toMonoidHom = + (powMonoidHom n : H →* H).ker := by + ext y + constructor + · rintro ⟨x, hx, rfl⟩ + exact (MonoidHom.mem_ker (G := H)).2 (by + have hxpow : x ^ n = 1 := + (MonoidHom.mem_ker (G := G)).1 hx + change (e.toMonoidHom x) ^ n = 1 + simpa [map_pow] using congrArg e hxpow) + · intro hy + refine ⟨e.symm y, ?_, ?_⟩ + · exact (MonoidHom.mem_ker (G := G)).2 (by + have hypow : y ^ n = 1 := + (MonoidHom.mem_ker (G := H)).1 hy + change (e.symm y) ^ n = 1 + simpa [map_pow] using congrArg e.symm hypow) + · simp + +/-- An injective multiplicative homomorphism transports finiteness of the +ambient power kernel to the source power kernel. -/ +theorem finite_nthPowerKernel_of_injective + (n : ℕ) (f : G →* H) (hf : Function.Injective f) + [Finite ((powMonoidHom n : H →* H).ker)] : + Finite ((powMonoidHom n : G →* G).ker) := by + let mapKernel : (powMonoidHom n : G →* G).ker → + (powMonoidHom n : H →* H).ker := fun x => + ⟨f x, (MonoidHom.mem_ker (G := H)).2 (by + have hx : (x : G) ^ n = 1 := by + simpa only [powMonoidHom_apply] using + (MonoidHom.mem_ker (G := G)).1 x.property + rw [powMonoidHom_apply, ← map_pow, hx, map_one])⟩ + exact Finite.of_injective mapKernel fun x y hxy => by + apply Subtype.ext + exact hf (congrArg Subtype.val hxy) + +/-- The power kernel in the unit group of a commutative ring is Mathlib's +group of roots of unity. -/ +theorem powMonoidHom_ker_units_eq_rootsOfUnity + (R : Type*) [CommRing R] (n : ℕ) : + (powMonoidHom n : Rˣ →* Rˣ).ker = rootsOfUnity n R := by + ext x + exact MonoidHom.mem_ker + +/-- For nonzero exponent over a domain, the unit-group power kernel is +finite because it is the finite set of roots of `X ^ n - 1`. -/ +noncomputable instance finite_powMonoidHom_ker_units + (R : Type*) [CommRing R] [IsDomain R] (n : ℕ) [NeZero n] : + Finite ((powMonoidHom n : Rˣ →* Rˣ).ker) := by + rw [powMonoidHom_ker_units_eq_rootsOfUnity] + infer_instance + +/-- A multiplicative equivalence transports quotients by `n`-th powers. -/ +def nthPowerQuotientEquivOfMulEquiv (n : ℕ) (e : G ≃* H) : + G ⧸ (powMonoidHom n : G →* G).range ≃* H ⧸ (powMonoidHom n : H →* H).range := + QuotientGroup.congr ((powMonoidHom n : G →* G).range) ((powMonoidHom n : H →* H).range) e + (powMonoidHom_range_map G H n e) + +/-- The quotient equivalence induced by a multiplicative equivalence maps each power-class +representative to its image. -/ +theorem nthPowerQuotientEquivOfMulEquiv_mk (n : ℕ) (e : G ≃* H) (x : G) : + nthPowerQuotientEquivOfMulEquiv G H n e + (QuotientGroup.mk' ((powMonoidHom n : G →* G).range) x) = + QuotientGroup.mk' ((powMonoidHom n : H →* H).range) (e x) := + rfl + +/-- Finiteness of a power quotient transports backwards along a +multiplicative equivalence. -/ +theorem finite_nthPowerQuotient_of_mulEquiv + (n : ℕ) (e : G ≃* H) + [Finite (H ⧸ (powMonoidHom n : H →* H).range)] : + Finite (G ⧸ (powMonoidHom n : G →* G).range) := + Finite.of_equiv + (H ⧸ (powMonoidHom n : H →* H).range) + (nthPowerQuotientEquivOfMulEquiv G H n e).symm.toEquiv + +/-- The `n`-torsion kernel of a product is the product of the two +`n`-torsion kernels. -/ +def nthPowerKernelProductEquiv (n : ℕ) : + (powMonoidHom n : (G × H) →* (G × H)).ker ≃* + (powMonoidHom n : G →* G).ker × (powMonoidHom n : H →* H).ker where + toFun x := + (⟨(x : G × H).1, by + have hx : (x : G × H) ^ n = 1 := + (MonoidHom.mem_ker (G := G × H)).1 x.property + have hfst := congrArg Prod.fst hx + simpa using hfst⟩, + ⟨(x : G × H).2, by + have hx : (x : G × H) ^ n = 1 := + (MonoidHom.mem_ker (G := G × H)).1 x.property + have hsnd := congrArg Prod.snd hx + simpa using hsnd⟩) + invFun x := + ⟨((x.1 : G), (x.2 : H)), by + have hx₁ : (x.1 : G) ^ n = 1 := + (MonoidHom.mem_ker (G := G)).1 x.1.property + have hx₂ : (x.2 : H) ^ n = 1 := + (MonoidHom.mem_ker (G := H)).1 x.2.property + change (((x.1 : G), (x.2 : H)) : G × H) ^ n = 1 + ext <;> simp [hx₁, hx₂]⟩ + left_inv x := by + ext <;> rfl + right_inv x := by + ext <;> rfl + map_mul' x y := by + ext <;> rfl + +/-- Finiteness of the two factor kernels transports across the canonical +product-kernel equivalence. -/ +noncomputable instance finite_powMonoidHom_ker_prod (n : ℕ) + [Finite ((powMonoidHom n : G →* G).ker)] + [Finite ((powMonoidHom n : H →* H).ker)] : + Finite ((powMonoidHom n : (G × H) →* (G × H)).ker) := + Finite.of_equiv + ((powMonoidHom n : G →* G).ker × (powMonoidHom n : H →* H).ker) + (nthPowerKernelProductEquiv G H n).symm.toEquiv + +/-- General cardinal form of the product-kernel decomposition. This is the +source of truth before any finiteness specialization. -/ +theorem cardinal_mk_nthPowerKernelProduct (n : ℕ) : + Cardinal.mk ((powMonoidHom n : (G × H) →* (G × H)).ker) = + Cardinal.mk + ((powMonoidHom n : G →* G).ker × (powMonoidHom n : H →* H).ker) := + Cardinal.mk_congr (nthPowerKernelProductEquiv G H n).toEquiv + +/-- Cardinality form of `nthPowerKernelProductEquiv`. -/ +theorem card_nthPowerKernelProduct (n : ℕ) : + Nat.card ((powMonoidHom n : (G × H) →* (G × H)).ker) = + Nat.card ((powMonoidHom n : G →* G).ker) * + Nat.card ((powMonoidHom n : H →* H).ker) := by + rw [Nat.card_congr (nthPowerKernelProductEquiv G H n).toEquiv, + Nat.card_prod] + +/-- A product decomposition of a commutative group splits the cardinality of +the `n`-torsion kernel as the product of the two factor kernels. -/ +theorem card_nthPowerKernel_eq_mul_of_mulEquiv_prod + (n : ℕ) (e : G ≃* H × U) : + Nat.card ((powMonoidHom n : G →* G).ker) = + Nat.card ((powMonoidHom n : H →* H).ker) * + Nat.card ((powMonoidHom n : U →* U).ker) := by + calc + Nat.card ((powMonoidHom n : G →* G).ker) = + Nat.card ((powMonoidHom n : (H × U) →* (H × U)).ker) := by + rw [Nat.card_congr + (nthPowerKernelEquivOfMulEquiv G (H × U) n e).toEquiv] + _ = + Nat.card ((powMonoidHom n : H →* H).ker) * + Nat.card ((powMonoidHom n : U →* U).ker) := + card_nthPowerKernelProduct H U n + +/-- General cardinal form of the kernel decomposition transported by a +multiplicative product equivalence. -/ +theorem cardinal_mk_nthPowerKernel_eq_of_mulEquiv_prod + (n : ℕ) (e : G ≃* H × U) : + Cardinal.lift.{max uH uU, uG} + (Cardinal.mk ((powMonoidHom n : G →* G).ker)) = + Cardinal.lift.{uG, max uH uU} (Cardinal.mk + ((powMonoidHom n : H →* H).ker × (powMonoidHom n : U →* U).ker)) := + Cardinal.mk_congr_lift + ((nthPowerKernelEquivOfMulEquiv G (H × U) n e).trans + (nthPowerKernelProductEquiv H U n)).toEquiv + +/-- The product map from a product group to the product of its `n`-th-power +quotients. -/ +def nthPowerProductQuotientHom (n : ℕ) : + G × H →* (G ⧸ (powMonoidHom n : G →* G).range) × (H ⧸ (powMonoidHom n : H →* H).range) where + toFun x := + (QuotientGroup.mk' ((powMonoidHom n : G →* G).range) x.1, + QuotientGroup.mk' ((powMonoidHom n : H →* H).range) x.2) + map_one' := rfl + map_mul' _ _ := rfl + +/-- Every pair of power classes is represented by a power class in the product group. -/ +theorem nthPowerProductQuotientHom_surjective (n : ℕ) : + Function.Surjective (nthPowerProductQuotientHom G H n) := by + intro q + rcases q with ⟨qG, qH⟩ + refine Quotient.inductionOn' qG ?_ + intro g + refine Quotient.inductionOn' qH ?_ + intro h + exact ⟨(g, h), rfl⟩ + +/-- The product power-class homomorphism has trivial kernel. -/ +theorem nthPowerProductQuotientHom_ker (n : ℕ) : + (nthPowerProductQuotientHom G H n).ker = + (powMonoidHom n : (G × H) →* (G × H)).range := by + ext x + constructor + · intro hx + rw [MonoidHom.mem_ker] at hx + change + (QuotientGroup.mk' ((powMonoidHom n : G →* G).range) x.1, + QuotientGroup.mk' ((powMonoidHom n : H →* H).range) x.2) = 1 at hx + have hxG : + QuotientGroup.mk' ((powMonoidHom n : G →* G).range) x.1 = 1 := + congrArg Prod.fst hx + have hxH : + QuotientGroup.mk' ((powMonoidHom n : H →* H).range) x.2 = 1 := + congrArg Prod.snd hx + have hxGmem : x.1 ∈ (powMonoidHom n : G →* G).range := + (QuotientGroup.eq_one_iff x.1).1 hxG + have hxHmem : x.2 ∈ (powMonoidHom n : H →* H).range := + (QuotientGroup.eq_one_iff x.2).1 hxH + rw [MonoidHom.mem_range] at hxGmem hxHmem ⊢ + rcases hxGmem with ⟨g, hg⟩ + rcases hxHmem with ⟨h, hh⟩ + refine ⟨(g, h), ?_⟩ + ext + · change g ^ n = x.1 + simpa only [powMonoidHom_apply] using hg + · change h ^ n = x.2 + simpa only [powMonoidHom_apply] using hh + · intro hx + rw [MonoidHom.mem_ker] + rw [MonoidHom.mem_range] at hx + rcases hx with ⟨y, rfl⟩ + apply Prod.ext + · exact (QuotientGroup.eq_one_iff ((y.1) ^ n)).2 + ((MonoidHom.mem_range (G := G)).2 ⟨y.1, rfl⟩) + · exact (QuotientGroup.eq_one_iff ((y.2) ^ n)).2 + ((MonoidHom.mem_range (G := H)).2 ⟨y.2, rfl⟩) + +/-- Quotienting a product by `n`-th powers is the product of the two +`n`-th-power quotients. -/ +def nthPowerProductQuotientEquiv (n : ℕ) : + (G × H) ⧸ (powMonoidHom n : (G × H) →* (G × H)).range ≃* + (G ⧸ (powMonoidHom n : G →* G).range) × (H ⧸ (powMonoidHom n : H →* H).range) := + (QuotientGroup.quotientMulEquivOfEq + (nthPowerProductQuotientHom_ker G H n).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (nthPowerProductQuotientHom G H n) + (nthPowerProductQuotientHom_surjective G H n)) + +/-- Finiteness of the factor power quotients transports across the canonical +product-quotient equivalence. -/ +noncomputable instance finite_powMonoidHom_rangeQuotient_prod (n : ℕ) + [Finite (G ⧸ (powMonoidHom n : G →* G).range)] + [Finite (H ⧸ (powMonoidHom n : H →* H).range)] : + Finite ((G × H) ⧸ (powMonoidHom n : (G × H) →* (G × H)).range) := + Finite.of_equiv + ((G ⧸ (powMonoidHom n : G →* G).range) × (H ⧸ (powMonoidHom n : H →* H).range)) + (nthPowerProductQuotientEquiv G H n).symm.toEquiv + +/-- General cardinal form of the product-quotient decomposition. -/ +theorem cardinal_mk_nthPowerProductQuotient (n : ℕ) : + Cardinal.mk ((G × H) ⧸ (powMonoidHom n : (G × H) →* (G × H)).range) = + Cardinal.mk + ((G ⧸ (powMonoidHom n : G →* G).range) × (H ⧸ (powMonoidHom n : H →* H).range)) := + Cardinal.mk_congr (nthPowerProductQuotientEquiv G H n).toEquiv + +/-- The number of `n`-th power classes in a product is the product of the two factor class numbers. +The number of `n`-th power classes in a product is the product of the two factor class numbers. -/ +theorem card_nthPowerProductQuotient (n : ℕ) : + Nat.card ((G × H) ⧸ (powMonoidHom n : (G × H) →* (G × H)).range) = + Nat.card (G ⧸ (powMonoidHom n : G →* G).range) * + Nat.card (H ⧸ (powMonoidHom n : H →* H).range) := by + rw [Nat.card_congr (nthPowerProductQuotientEquiv G H n).toEquiv, + Nat.card_prod] + +/-- A product decomposition of a commutative group splits the `n`-th-power +quotient index as the product of the two factor indices. -/ +theorem card_nthPowerQuotient_eq_mul_of_mulEquiv_prod + (n : ℕ) (e : G ≃* H × U) : + Nat.card (G ⧸ (powMonoidHom n : G →* G).range) = + Nat.card (H ⧸ (powMonoidHom n : H →* H).range) * + Nat.card (U ⧸ (powMonoidHom n : U →* U).range) := by + calc + Nat.card (G ⧸ (powMonoidHom n : G →* G).range) = + Nat.card ((H × U) ⧸ (powMonoidHom n : (H × U) →* (H × U)).range) := by + rw [Nat.card_congr + (nthPowerQuotientEquivOfMulEquiv G (H × U) n e).toEquiv] + _ = + Nat.card (H ⧸ (powMonoidHom n : H →* H).range) * + Nat.card (U ⧸ (powMonoidHom n : U →* U).range) := + card_nthPowerProductQuotient H U n + +/-- General cardinal form of the quotient decomposition transported by a +multiplicative product equivalence. -/ +theorem cardinal_mk_nthPowerQuotient_eq_of_mulEquiv_prod + (n : ℕ) (e : G ≃* H × U) : + Cardinal.lift.{max uH uU, uG} + (Cardinal.mk (G ⧸ (powMonoidHom n : G →* G).range)) = + Cardinal.lift.{uG, max uH uU} (Cardinal.mk + ((H ⧸ (powMonoidHom n : H →* H).range) × (U ⧸ (powMonoidHom n : U →* U).range))) := + Cardinal.mk_congr_lift + ((nthPowerQuotientEquivOfMulEquiv G (H × U) n e).trans + (nthPowerProductQuotientEquiv H U n)).toEquiv + +/-- For multiplicative integers, the range of the `n`-th power map is the subgroup of additive +multiples of `n`. -/ +theorem powMonoidHom_range_multiplicativeInt_eq_integerMultipleSubgroup + (n : ℕ) : + (powMonoidHom n : (Multiplicative ℤ) →* (Multiplicative ℤ)).range = + integerMultipleSubgroup (n : ℤ) := by + ext x + constructor + · intro hx + rw [MonoidHom.mem_range] at hx + rcases hx with ⟨y, rfl⟩ + rw [mem_integerMultipleSubgroup_iff, powMonoidHom_apply, Int.toAdd_pow] + exact ⟨y.toAdd, by ring⟩ + · intro hx + rw [mem_integerMultipleSubgroup_iff] at hx + rcases hx with ⟨k, hk⟩ + rw [MonoidHom.mem_range] + refine ⟨Multiplicative.ofAdd k, ?_⟩ + apply Multiplicative.toAdd.injective + rw [powMonoidHom_apply, Int.toAdd_pow, toAdd_ofAdd, hk] + ring + +/-- For nonzero `n`, multiplicative integers modulo `n`-th powers form a finite quotient. -/ +theorem finite_multiplicativeInt_nthPowerQuotient + {n : ℕ} (hn : n ≠ 0) : + Finite (Multiplicative ℤ ⧸ (powMonoidHom n : (Multiplicative ℤ) →* (Multiplicative + ℤ)).range) := by + rw [powMonoidHom_range_multiplicativeInt_eq_integerMultipleSubgroup] + have hnabs : (n : ℤ).natAbs ≠ 0 := by simpa using hn + let : NeZero (n : ℤ).natAbs := ⟨hnabs⟩ + exact Finite.of_equiv + (Multiplicative (ZMod (n : ℤ).natAbs)) + (valueModIntegerMultipleSubgroupEquivZMod (n : ℤ)).symm.toEquiv + +/-- An explicit `G ≃ U × ℤ` decomposition transports finiteness of the +unit-factor power quotient to the full group. This is deliberately a +constructor rather than a global instance: callers must expose the +decomposition and the exact finite boundary. -/ +theorem finite_nthPowerQuotient_of_mulEquiv_units_prod_int + {n : ℕ} [NeZero n] (e : G ≃* U × Multiplicative ℤ) + [Finite (U ⧸ (powMonoidHom n : U →* U).range)] : + Finite (G ⧸ (powMonoidHom n : G →* G).range) := by + let : Finite + (Multiplicative ℤ ⧸ + (powMonoidHom n : (Multiplicative ℤ) →* (Multiplicative ℤ)).range) := + finite_multiplicativeInt_nthPowerQuotient (NeZero.ne n) + exact finite_nthPowerQuotient_of_mulEquiv + G (U × Multiplicative ℤ) n e + +/-- General cardinal identification of the integer-direction power quotient. +For `n = 0` the right side is infinite; the natural-cardinality specialization +below is therefore intentionally restricted to `n ≠ 0`. -/ +theorem cardinal_mk_multiplicativeInt_nthPowerQuotient (n : ℕ) : + Cardinal.mk + (Multiplicative ℤ ⧸ (powMonoidHom n : (Multiplicative ℤ) →* (Multiplicative ℤ)).range) = + Cardinal.mk (Multiplicative (ZMod (n : ℤ).natAbs)) := + Cardinal.mk_congr + ((QuotientGroup.quotientMulEquivOfEq + (powMonoidHom_range_multiplicativeInt_eq_integerMultipleSubgroup n)).trans + (valueModIntegerMultipleSubgroupEquivZMod (n : ℤ))).toEquiv + +/-- For nonzero `n`, the multiplicative-integer power quotient has cardinality `n`. -/ +theorem card_multiplicativeInt_nthPowerQuotient + {n : ℕ} (hn : n ≠ 0) : + Nat.card + (Multiplicative ℤ ⧸ (powMonoidHom n : (Multiplicative ℤ) →* (Multiplicative ℤ)).range) = + n := by + rw [Nat.card_congr + ((QuotientGroup.quotientMulEquivOfEq + (powMonoidHom_range_multiplicativeInt_eq_integerMultipleSubgroup n)).trans + (valueModIntegerMultipleSubgroupEquivZMod (n : ℤ))).toEquiv] + rw [Nat.card_congr + (Multiplicative.toAdd : + Multiplicative (ZMod ((n : ℤ).natAbs)) ≃ ZMod ((n : ℤ).natAbs))] + have hnabs : (n : ℤ).natAbs ≠ 0 := by simpa using hn + let : NeZero (n : ℤ).natAbs := ⟨hnabs⟩ + have hcard : Nat.card (ZMod ((n : ℤ).natAbs)) = (n : ℤ).natAbs := + Nat.card_zmod ((n : ℤ).natAbs) + simp at hcard ⊢ + +/-- For nonzero `n`, the `n`-th power map on multiplicative integers has trivial kernel. -/ +theorem powMonoidHom_ker_multiplicativeInt_eq_bot + {n : ℕ} (hn : n ≠ 0) : + (powMonoidHom n : (Multiplicative ℤ) →* (Multiplicative ℤ)).ker = ⊥ := by + ext x + constructor + · intro hx + rw [MonoidHom.mem_ker] at hx + rw [Subgroup.mem_bot] + apply Multiplicative.toAdd.injective + have hmul : (n : ℤ) * Multiplicative.toAdd x = 0 := by + have h := congrArg Multiplicative.toAdd hx + simpa [Int.toAdd_pow] using h + have hnZ : (n : ℤ) ≠ 0 := by + exact_mod_cast hn + exact (mul_eq_zero.mp hmul).resolve_left hnZ + · intro hx + rw [Subgroup.mem_bot] at hx + rw [MonoidHom.mem_ker, hx, powMonoidHom_apply, one_pow] + +/-- The kernel of a nonzero power map on multiplicative integers is finite. -/ +theorem finite_multiplicativeInt_nthPowerKernel + {n : ℕ} (hn : n ≠ 0) : + Finite ((powMonoidHom n : (Multiplicative ℤ) →* (Multiplicative ℤ)).ker) := by + rw [powMonoidHom_ker_multiplicativeInt_eq_bot (n := n) hn] + infer_instance + +/-- The kernel of a nonzero power map on multiplicative integers has one element. -/ +theorem card_multiplicativeInt_nthPowerKernel + {n : ℕ} (hn : n ≠ 0) : + Nat.card ((powMonoidHom n : (Multiplicative ℤ) →* (Multiplicative ℤ)).ker) = 1 := by + rw [powMonoidHom_ker_multiplicativeInt_eq_bot (n := n) hn] + simp + +/-- If a commutative group splits as `U × Multiplicative ℤ`, its `n`-th-power +quotient index is `n` times the corresponding quotient index for `U`. -/ +theorem card_nthPowerQuotient_eq_mul_of_mulEquiv_units_prod_int + {n : ℕ} (hn : n ≠ 0) (e : G ≃* U × Multiplicative ℤ) : + Nat.card (G ⧸ (powMonoidHom n : G →* G).range) = + n * Nat.card (U ⧸ (powMonoidHom n : U →* U).range) := by + calc + Nat.card (G ⧸ (powMonoidHom n : G →* G).range) = + Nat.card ((U × Multiplicative ℤ) ⧸ + (powMonoidHom n : (U × Multiplicative ℤ) →* (U × Multiplicative ℤ)).range) := by + rw [Nat.card_congr + (nthPowerQuotientEquivOfMulEquiv G (U × Multiplicative ℤ) n e).toEquiv] + _ = + Nat.card (U ⧸ (powMonoidHom n : U →* U).range) * + Nat.card (Multiplicative ℤ ⧸ + (powMonoidHom n : (Multiplicative ℤ) →* (Multiplicative ℤ)).range) := + card_nthPowerProductQuotient U (Multiplicative ℤ) n + _ = Nat.card (U ⧸ (powMonoidHom n : U →* U).range) * n := by + rw [card_multiplicativeInt_nthPowerQuotient hn] + _ = n * Nat.card (U ⧸ (powMonoidHom n : U →* U).range) := by + rw [Nat.mul_comm] + +/-- General cardinal form of the `U × Multiplicative ℤ` quotient +decomposition, valid without a nonzero or finiteness hypothesis. -/ +theorem cardinal_mk_nthPowerQuotient_eq_of_mulEquiv_units_prod_int + (n : ℕ) (e : G ≃* U × Multiplicative ℤ) : + Cardinal.lift.{uU, uG} (Cardinal.mk (G ⧸ (powMonoidHom n : G →* G).range)) = + Cardinal.lift.{uG, uU} (Cardinal.mk + ((U ⧸ (powMonoidHom n : U →* U).range) × + (Multiplicative ℤ ⧸ (powMonoidHom n : (Multiplicative ℤ) →* (Multiplicative + ℤ)).range))) := + Cardinal.mk_congr_lift + ((nthPowerQuotientEquivOfMulEquiv G (U × Multiplicative ℤ) n e).trans + (nthPowerProductQuotientEquiv U (Multiplicative ℤ) n)).toEquiv + +/-- For nonzero `n`, a decomposition `G ≃ U × ℤ` identifies the `n`-torsion +kernel of `G` with the `n`-torsion kernel of the unit factor. -/ +theorem card_nthPowerKernel_eq_of_mulEquiv_units_prod_int + {n : ℕ} (hn : n ≠ 0) (e : G ≃* U × Multiplicative ℤ) : + Nat.card ((powMonoidHom n : G →* G).ker) = + Nat.card ((powMonoidHom n : U →* U).ker) := by + rw [card_nthPowerKernel_eq_mul_of_mulEquiv_prod + G U (Multiplicative ℤ) n e] + rw [card_multiplicativeInt_nthPowerKernel hn, Nat.mul_one] + +/-- General cardinal form of the `U × Multiplicative ℤ` kernel decomposition. -/ +theorem cardinal_mk_nthPowerKernel_eq_of_mulEquiv_units_prod_int + (n : ℕ) (e : G ≃* U × Multiplicative ℤ) : + Cardinal.lift.{uU, uG} + (Cardinal.mk ((powMonoidHom n : G →* G).ker)) = + Cardinal.lift.{uG, uU} (Cardinal.mk + ((powMonoidHom n : U →* U).ker × + (powMonoidHom n : (Multiplicative ℤ) →* (Multiplicative ℤ)).ker)) := + Cardinal.mk_congr_lift + ((nthPowerKernelEquivOfMulEquiv G (U × Multiplicative ℤ) n e).trans + (nthPowerKernelProductEquiv U (Multiplicative ℤ) n)).toEquiv + +end NthPowers + +section AdditivePowers + +universe uA uB uG + +variable (A : Type uA) [AddCommGroup A] + +/-- The additive homomorphism `x ↦ n • x`. -/ +abbrev nsmulAddHom (n : ℕ) : A →+ A := + nsmulAddMonoidHom n + +/-- The additive subgroup of `n`-fold multiples. -/ +abbrev nsmulAddSubgroup (n : ℕ) : AddSubgroup A := + (nsmulAddMonoidHom n).range + +/-- The additive subgroup killed by `x ↦ n • x`. -/ +abbrev nsmulAddKernel (n : ℕ) : AddSubgroup A := + (nsmulAddMonoidHom n).ker + +/-- Membership in the image of multiplication by `n` is equivalent to being an `n`-fold additive +multiple. -/ +theorem mem_nsmulAddSubgroup_iff {n : ℕ} {x : A} : + x ∈ nsmulAddSubgroup A n ↔ ∃ y : A, n • y = x := by + simp [nsmulAddSubgroup, AddMonoidHom.mem_range] + +/-- Membership in the kernel of multiplication by `n` is equivalent to being annihilated by `n`. -/ +theorem mem_nsmulAddKernel_iff {n : ℕ} {x : A} : + x ∈ nsmulAddKernel A n ↔ n • x = 0 := by + simp [nsmulAddKernel, AddMonoidHom.mem_ker] + +/-- Under the `Multiplicative` wrapper, `n`-th powers are exactly additive +`n`-fold multiples. -/ +theorem powMonoidHom_range_multiplicative_eq_nsmulAddSubgroup_toSubgroup + (n : ℕ) : + (powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).range = + AddSubgroup.toSubgroup (nsmulAddSubgroup A n) := by + ext x + constructor + · intro hx + rw [MonoidHom.mem_range] at hx + rcases hx with ⟨y, rfl⟩ + simp + · intro hx + rw [MonoidHom.mem_range] + have hxadd : Multiplicative.toAdd x ∈ nsmulAddSubgroup A n := by + simpa using hx + rw [mem_nsmulAddSubgroup_iff] at hxadd + rcases hxadd with ⟨y, hy⟩ + refine ⟨Multiplicative.ofAdd y, ?_⟩ + apply Multiplicative.toAdd.injective + simp [hy] + +/-- General cardinal form of the multiplicative/additive quotient +translation. -/ +theorem cardinal_mk_multiplicative_nthPowerQuotient_eq_additive_nsmulQuotient + (n : ℕ) : + Cardinal.mk + (Multiplicative A ⧸ (powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).range) = + Cardinal.mk (A ⧸ nsmulAddSubgroup A n) := by + rw [powMonoidHom_range_multiplicative_eq_nsmulAddSubgroup_toSubgroup] + rfl + +/-- The underlying quotient types in multiplicative and additive notation +are canonically equivalent. -/ +def multiplicativeNthPowerQuotientEquivAdditive (n : ℕ) : + (Multiplicative A ⧸ (powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).range) ≃ + (A ⧸ nsmulAddSubgroup A n) := by + rw [powMonoidHom_range_multiplicative_eq_nsmulAddSubgroup_toSubgroup] + exact Equiv.refl _ + +/-- Finiteness of the additive quotient transports to its multiplicative +presentation without any choice of representatives. -/ +noncomputable instance finite_multiplicative_nthPowerQuotient + (n : ℕ) [Finite (A ⧸ nsmulAddSubgroup A n)] : + Finite + (Multiplicative A ⧸ (powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).range) := + Finite.of_equiv (A ⧸ nsmulAddSubgroup A n) + (multiplicativeNthPowerQuotientEquivAdditive A n).symm + +/-- Cardinality/index form of +`powMonoidHom_range_multiplicative_eq_nsmulAddSubgroup_toSubgroup`. -/ +theorem card_multiplicative_nthPowerQuotient_eq_nsmulAddSubgroup_index + (n : ℕ) : + Nat.card (Multiplicative A ⧸ (powMonoidHom n : (Multiplicative A) →* (Multiplicative + A)).range) = + (nsmulAddSubgroup A n).index := by + rw [← Subgroup.index_eq_card + (H := (powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).range)] + rw [powMonoidHom_range_multiplicative_eq_nsmulAddSubgroup_toSubgroup] + simp + +/-- Under logarithmic/additive notation, the `n`-th-power quotient is the +additive quotient by `n`-fold multiples. -/ +theorem card_multiplicative_nthPowerQuotient_eq_additive_nsmulQuotient + (n : ℕ) : + Nat.card (Multiplicative A ⧸ (powMonoidHom n : (Multiplicative A) →* (Multiplicative + A)).range) = + Nat.card (A ⧸ nsmulAddSubgroup A n) := by + rw [card_multiplicative_nthPowerQuotient_eq_nsmulAddSubgroup_index] + rw [AddSubgroup.index_eq_card] + +/-- Under the `Multiplicative` wrapper, `n`-torsion is exactly the additive +kernel of `x ↦ n • x`. -/ +theorem powMonoidHom_ker_multiplicative_eq_nsmulAddKernel_toSubgroup + (n : ℕ) : + (powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).ker = + AddSubgroup.toSubgroup (nsmulAddKernel A n) := by + ext x + constructor + · intro hx + rw [MonoidHom.mem_ker] at hx + change Multiplicative.toAdd x ∈ nsmulAddKernel A n + rw [mem_nsmulAddKernel_iff] + have h := congrArg Multiplicative.toAdd hx + simpa using h + · intro hx + have hxadd : Multiplicative.toAdd x ∈ nsmulAddKernel A n := by + simpa using hx + rw [mem_nsmulAddKernel_iff] at hxadd + rw [MonoidHom.mem_ker] + apply Multiplicative.toAdd.injective + simpa using hxadd + +/-- General cardinal form of the multiplicative/additive kernel +translation. -/ +theorem cardinal_mk_multiplicative_nthPowerKernel_eq_nsmulAddKernel + (n : ℕ) : + Cardinal.mk ((powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).ker) = + Cardinal.mk (nsmulAddKernel A n) := by + rw [powMonoidHom_ker_multiplicative_eq_nsmulAddKernel_toSubgroup] + rfl + +/-- The multiplicative power kernel and additive scalar kernel have the same +underlying type. -/ +def multiplicativeNthPowerKernelEquivAdditive (n : ℕ) : + (powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).ker ≃ nsmulAddKernel A n := by + rw [powMonoidHom_ker_multiplicative_eq_nsmulAddKernel_toSubgroup] + exact Equiv.refl _ + +/-- Finiteness of the additive scalar kernel transports to multiplicative +notation without introducing a noncanonical enumeration. -/ +noncomputable instance finite_multiplicative_nthPowerKernel + (n : ℕ) [Finite (nsmulAddKernel A n)] : + Finite ((powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).ker) := + Finite.of_equiv (nsmulAddKernel A n) + (multiplicativeNthPowerKernelEquivAdditive A n).symm + +section AdditiveProducts + +variable (B : Type uB) [AddCommGroup B] + +/-- Finiteness of additive scalar quotients is stable under binary products. -/ +noncomputable instance finite_nsmulAddQuotient_prod (n : ℕ) + [Finite (A ⧸ nsmulAddSubgroup A n)] + [Finite (B ⧸ nsmulAddSubgroup B n)] : + Finite ((A × B) ⧸ nsmulAddSubgroup (A × B) n) := by + let e := MulEquiv.prodMultiplicative A B + let : Finite + (Multiplicative (A × B) ⧸ + (powMonoidHom n : (Multiplicative (A × B)) →* (Multiplicative (A × B))).range) := + finite_nthPowerQuotient_of_mulEquiv + (Multiplicative (A × B)) + (Multiplicative A × Multiplicative B) n e + exact Finite.of_equiv + (Multiplicative (A × B) ⧸ + (powMonoidHom n : (Multiplicative (A × B)) →* (Multiplicative (A × B))).range) + (multiplicativeNthPowerQuotientEquivAdditive (A × B) n) + +/-- Finiteness of additive scalar kernels is stable under binary products. -/ +noncomputable instance finite_nsmulAddKernel_prod (n : ℕ) + [Finite (nsmulAddKernel A n)] + [Finite (nsmulAddKernel B n)] : + Finite (nsmulAddKernel (A × B) n) := by + let e := MulEquiv.prodMultiplicative A B + let : Finite + ((powMonoidHom n : (Multiplicative (A × B)) →* (Multiplicative (A × B))).ker) := + Finite.of_equiv + ((powMonoidHom n : (Multiplicative A × Multiplicative B) →* (Multiplicative A × + Multiplicative B)).ker) + (nthPowerKernelEquivOfMulEquiv + (Multiplicative (A × B)) + (Multiplicative A × Multiplicative B) n e).symm.toEquiv + exact Finite.of_equiv + ((powMonoidHom n : (Multiplicative (A × B)) →* (Multiplicative (A × B))).ker) + (multiplicativeNthPowerKernelEquivAdditive (A × B) n) + +end AdditiveProducts + +/-- Cardinality form of the multiplicative/additive kernel translation. -/ +theorem card_multiplicative_nthPowerKernel_eq_nsmulAddKernel + (n : ℕ) : + Nat.card ((powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).ker) = + Nat.card (nsmulAddKernel A n) := by + rw [powMonoidHom_ker_multiplicative_eq_nsmulAddKernel_toSubgroup] + rfl + +/-- Finite additive kernel/cokernel equality for the map `x ↦ n • x`, proved +through the multiplicative `n`-th-power translation. -/ +theorem card_additive_nsmulQuotient_eq_nsmulKernel + [Finite A] (n : ℕ) : + Nat.card (A ⧸ nsmulAddSubgroup A n) = + Nat.card (nsmulAddKernel A n) := by + rw [← card_multiplicative_nthPowerQuotient_eq_additive_nsmulQuotient A n] + rw [card_nthPowerQuotient_eq_nthPowerKernel + (Multiplicative A) n] + exact card_multiplicative_nthPowerKernel_eq_nsmulAddKernel A n + +variable (G : Type uG) [CommGroup G] + +/-- General cardinal form of a logarithmic quotient transport. -/ +theorem cardinal_mk_nthPowerQuotient_eq_additive_nsmulQuotient_of_mulEquiv + (n : ℕ) (e : G ≃* Multiplicative A) : + Cardinal.lift.{uA, uG} (Cardinal.mk (G ⧸ (powMonoidHom n : G →* G).range)) = + Cardinal.lift.{uG, uA} (Cardinal.mk (A ⧸ nsmulAddSubgroup A n)) := by + calc + Cardinal.lift.{uA, uG} (Cardinal.mk (G ⧸ (powMonoidHom n : G →* G).range)) = + Cardinal.lift.{uG, uA} + (Cardinal.mk (Multiplicative A ⧸ + (powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).range)) := + Cardinal.mk_congr_lift + (nthPowerQuotientEquivOfMulEquiv G (Multiplicative A) n e).toEquiv + _ = Cardinal.lift.{uG, uA} + (Cardinal.mk (A ⧸ nsmulAddSubgroup A n)) := + congrArg Cardinal.lift + (cardinal_mk_multiplicative_nthPowerQuotient_eq_additive_nsmulQuotient A n) + +/-- A logarithmic multiplicative equivalence transports an `n`-th-power quotient +to the additive quotient by `n`-fold multiples. -/ +theorem card_nthPowerQuotient_eq_additive_nsmulQuotient_of_mulEquiv + (n : ℕ) (e : G ≃* Multiplicative A) : + Nat.card (G ⧸ (powMonoidHom n : G →* G).range) = + Nat.card (A ⧸ nsmulAddSubgroup A n) := by + rw [Nat.card_congr + (nthPowerQuotientEquivOfMulEquiv G (Multiplicative A) n e).toEquiv] + exact card_multiplicative_nthPowerQuotient_eq_additive_nsmulQuotient A n + +/-- A logarithmic multiplicative equivalence transports the `n`-torsion kernel +to the additive kernel of `x ↦ n • x`. -/ +theorem card_nthPowerKernel_eq_additive_nsmulKernel_of_mulEquiv + (n : ℕ) (e : G ≃* Multiplicative A) : + Nat.card ((powMonoidHom n : G →* G).ker) = + Nat.card (nsmulAddKernel A n) := by + rw [Nat.card_congr + (nthPowerKernelEquivOfMulEquiv G (Multiplicative A) n e).toEquiv] + exact card_multiplicative_nthPowerKernel_eq_nsmulAddKernel A n + +/-- General cardinal form of a logarithmic kernel transport. -/ +theorem cardinal_mk_nthPowerKernel_eq_additive_nsmulKernel_of_mulEquiv + (n : ℕ) (e : G ≃* Multiplicative A) : + Cardinal.lift.{uA, uG} + (Cardinal.mk ((powMonoidHom n : G →* G).ker)) = + Cardinal.lift.{uG, uA} (Cardinal.mk (nsmulAddKernel A n)) := by + calc + Cardinal.lift.{uA, uG} + (Cardinal.mk ((powMonoidHom n : G →* G).ker)) = + Cardinal.lift.{uG, uA} + (Cardinal.mk ((powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).ker)) := + Cardinal.mk_congr_lift + (nthPowerKernelEquivOfMulEquiv G (Multiplicative A) n e).toEquiv + _ = Cardinal.lift.{uG, uA} (Cardinal.mk (nsmulAddKernel A n)) := + congrArg Cardinal.lift + (cardinal_mk_multiplicative_nthPowerKernel_eq_nsmulAddKernel A n) + +/-- Under a logarithmic multiplicative equivalence, the `n`-th-power subgroup +is the inverse image of the additive `n`-fold-multiple subgroup. -/ +theorem powMonoidHom_range_eq_comap_nsmulAddSubgroup_toSubgroup_of_mulEquiv + (n : ℕ) (e : G ≃* Multiplicative A) : + (powMonoidHom n : G →* G).range = + (AddSubgroup.toSubgroup (nsmulAddSubgroup A n)).comap e.toMonoidHom := by + ext x + constructor + · intro hx + change e x ∈ AddSubgroup.toSubgroup (nsmulAddSubgroup A n) + have hxpow : e x ∈ (powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).range := by + rw [MonoidHom.mem_range] at hx ⊢ + rcases hx with ⟨y, hy⟩ + refine ⟨e y, ?_⟩ + rw [← hy] + simp only [powMonoidHom_apply, map_pow] + simpa [powMonoidHom_range_multiplicative_eq_nsmulAddSubgroup_toSubgroup + (A := A) n] using hxpow + · intro hx + change e x ∈ AddSubgroup.toSubgroup (nsmulAddSubgroup A n) at hx + have hxpow : e x ∈ (powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).range := by + simpa [powMonoidHom_range_multiplicative_eq_nsmulAddSubgroup_toSubgroup + (A := A) n] using hx + rw [MonoidHom.mem_range] at hxpow + rcases hxpow with ⟨y, hy⟩ + rw [MonoidHom.mem_range] + refine ⟨e.symm y, ?_⟩ + apply e.injective + rw [powMonoidHom_apply] at hy + rw [powMonoidHom_apply, map_pow, MulEquiv.apply_symm_apply, hy] + +/-- Kernel version of +`powMonoidHom_range_eq_comap_nsmulAddSubgroup_toSubgroup_of_mulEquiv`. -/ +theorem powMonoidHom_ker_eq_comap_nsmulAddKernel_toSubgroup_of_mulEquiv + (n : ℕ) (e : G ≃* Multiplicative A) : + (powMonoidHom n : G →* G).ker = + (AddSubgroup.toSubgroup (nsmulAddKernel A n)).comap e.toMonoidHom := by + ext x + constructor + · intro hx + change e x ∈ AddSubgroup.toSubgroup (nsmulAddKernel A n) + have hxker : e x ∈ (powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).ker := by + exact (MonoidHom.mem_ker + (G := Multiplicative A)).2 (by + have hxpow : x ^ n = 1 := + (MonoidHom.mem_ker (G := G)).1 hx + change (e x) ^ n = 1 + simpa [map_pow] using congrArg e hxpow) + simpa [powMonoidHom_ker_multiplicative_eq_nsmulAddKernel_toSubgroup + (A := A) n] using hxker + · intro hx + change e x ∈ AddSubgroup.toSubgroup (nsmulAddKernel A n) at hx + have hxker : e x ∈ (powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).ker := by + simpa [powMonoidHom_ker_multiplicative_eq_nsmulAddKernel_toSubgroup + (A := A) n] using hx + rw [MonoidHom.mem_ker] at hxker ⊢ + apply e.injective + simpa [map_pow] using hxker + +/-- If the additive `n`-fold multiples have already been identified with a +specific additive subgroup, a logarithmic equivalence transports that equality +back to the original multiplicative group. -/ +theorem powMonoidHom_range_eq_comap_toSubgroup_of_nsmulAddSubgroup_eq + (n : ℕ) (e : G ≃* Multiplicative A) (B : AddSubgroup A) + (hB : nsmulAddSubgroup A n = B) : + (powMonoidHom n : G →* G).range = + (AddSubgroup.toSubgroup B).comap e.toMonoidHom := by + rw [← hB] + exact powMonoidHom_range_eq_comap_nsmulAddSubgroup_toSubgroup_of_mulEquiv + (A := A) (G := G) n e + +/-- Kernel analogue of +`powMonoidHom_range_eq_comap_toSubgroup_of_nsmulAddSubgroup_eq`. -/ +theorem powMonoidHom_ker_eq_comap_toSubgroup_of_nsmulAddKernel_eq + (n : ℕ) (e : G ≃* Multiplicative A) (B : AddSubgroup A) + (hB : nsmulAddKernel A n = B) : + (powMonoidHom n : G →* G).ker = + (AddSubgroup.toSubgroup B).comap e.toMonoidHom := by + rw [← hB] + exact powMonoidHom_ker_eq_comap_nsmulAddKernel_toSubgroup_of_mulEquiv + (A := A) (G := G) n e + +end AdditivePowers + +end LocalFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField.lean new file mode 100644 index 0000000000..b239d74e5c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField.lean @@ -0,0 +1,43 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.AdditiveEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.MultiplicativeDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Norm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormContinuity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormSubgroupFunctoriality +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PowerClassFiniteness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitActions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ProfiniteUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueGalois +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.SeparableNormValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ShrinkTransport +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Small +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UniformizerPrincipalQuotient +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnitTopology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Valuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuativeExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/AdditiveEquiv.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/AdditiveEquiv.lean new file mode 100644 index 0000000000..3a75841484 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/AdditiveEquiv.lean @@ -0,0 +1,42 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Module.Equiv.Basic +/-! +# Additive recoding of multiplicative equivalences + +Turns a multiplicative group equivalence into the corresponding equivalence +between the additive recodings of its source and target. +-/ + +@[expose] public section +namespace LocalFieldTheory + +noncomputable +section + +universe u + +/-- Transport a multiplicative equivalence to an additive equivalence. -/ +def additiveEquivOfMulEquiv {A B : Type u} [Group A] [Group B] (e : A ≃* B) : + Additive A ≃+ Additive B where + toFun := fun a => Additive.ofMul (e (Additive.toMul a)) + invFun := fun b => Additive.ofMul (e.symm (Additive.toMul b)) + left_inv := by + intro a + simp + right_inv := by + intro b + simp + map_add' := by + intro a b + ext + exact e.map_mul _ _ + +end +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Basic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Basic.lean new file mode 100644 index 0000000000..be0cd4093e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Basic.lean @@ -0,0 +1,228 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.LocalField.Basic +/-! +# Basic structure of nonarchimedean local fields + +Compactness facts and the normalized integer-valued valuation attached to a +nonarchimedean local field. +-/ + +@[expose] public section +namespace LocalFieldTheory + +noncomputable +section + +universe u + +namespace IsNonarchimedeanLocalField + +open scoped ValuativeRel WithZero + +/-- The normalized integer valuation attached to a nonarchimedean local field. + +It is obtained by transporting the value group to `WithZero (Multiplicative Int)` and then taking +the exponent of the nonzero value of a field unit. -/ +noncomputable def v (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : Additive Kˣ → Int := + fun x => + Multiplicative.toAdd + (WithZero.unzero + (x := (_root_.IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K) + (ValuativeRel.valuation K ((Additive.toMul x : Kˣ) : K))) + (by simp)) + +/-- The normalized integer valuation is obtained by transporting the field valuation to +multiplicative integers and taking its additive exponent. -/ +@[simp] +theorem v_apply (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (x : Additive Kˣ) : + v K x = + Multiplicative.toAdd + (WithZero.unzero + (x := (_root_.IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K) + (ValuativeRel.valuation K ((Additive.toMul x : Kˣ) : K))) + (by simp)) := + rfl + +/-- Every integer occurs as the normalized valuation of a nonzero field element. -/ +theorem v_surjective (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + Function.Surjective (v K) := by + intro n + let γ : ValuativeRel.ValueGroupWithZero K := + (_root_.IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K).symm + ((Multiplicative.ofAdd n : Multiplicative Int) : WithZero (Multiplicative Int)) + obtain ⟨a, ha⟩ := ValuativeRel.valuation_surjective γ + have hγ_ne : γ ≠ 0 := by + dsimp [γ] + simp + have ha0 : a ≠ 0 := by + intro h + apply hγ_ne + simpa [h] using ha.symm + refine ⟨Additive.ofMul (Units.mk0 a ha0), ?_⟩ + simp [v, γ, ha] + +/-- The normalized valuation turns multiplication of field units into addition of integers. -/ +theorem v_mul (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (x y : Kˣ) : + v K (Additive.ofMul (x * y)) = + v K (Additive.ofMul x) + v K (Additive.ofMul y) := by + simp [v, Valuation.map_mul, WithZero.unzero_mul, toAdd_mul] + +/-- The normalized valuation of the multiplicative identity is zero. -/ +theorem v_one (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + v K (Additive.ofMul (1 : Kˣ)) = 0 := by + dsimp [v] + have hunzero : + WithZero.unzero + (x := (_root_.IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K) + (ValuativeRel.valuation K (((1 : Kˣ) : K)))) + (by simp) = (1 : Multiplicative Int) := by + apply WithZero.coe_injective + rw [WithZero.coe_unzero] + simp + rw [hunzero] + exact toAdd_one + +/-- The normalized valuation of an inverse is the negative of the original valuation. -/ +theorem v_inv (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (x : Kˣ) : + v K (Additive.ofMul x⁻¹) = -v K (Additive.ofMul x) := by + have hmul := v_mul K x x⁻¹ + rw [mul_inv_cancel, v_one] at hmul + omega + +/-- The normalized valuation of a quotient is the difference of the two valuations. -/ +theorem v_div (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (x y : Kˣ) : + v K (Additive.ofMul (x / y)) = + v K (Additive.ofMul x) - v K (Additive.ofMul y) := by + rw [div_eq_mul_inv, v_mul, v_inv, sub_eq_add_neg] + +/-- Raising a field unit to a natural power multiplies its normalized valuation by that power. -/ +theorem v_pow (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (x : Kˣ) (n : Nat) : + v K (Additive.ofMul (x ^ n)) = (n : Int) * v K (Additive.ofMul x) := by + induction n with + | zero => + rw [pow_zero, v_one] + simp + | succ n ih => + rw [pow_succ, v_mul, ih] + rw [show ((n + 1 : Nat) : Int) = (n : Int) + 1 by simp] + ring + +/-- Raising a field unit to an integral power multiplies its normalized valuation by that integer. +Raising a field unit to an integral power multiplies its normalized valuation by that integer. -/ +theorem v_zpow (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (x : Kˣ) (n : Int) : + v K (Additive.ofMul (x ^ n)) = n * v K (Additive.ofMul x) := by + cases n with + | ofNat n => + simpa using v_pow K x n + | negSucc n => + rw [zpow_negSucc, v_inv, v_pow] + change -(((n + 1 : Nat) : Int) * v K (Additive.ofMul x)) = + (-(((n + 1 : Nat) : Int))) * v K (Additive.ofMul x) + ring + +/-- The valuation of a unit times an integral power is the valuation of the unit plus the scaled +valuation of the powered factor. -/ +theorem v_mul_zpow (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (x ϖ : Kˣ) (n : Int) : + v K (Additive.ofMul (x * ϖ ^ n)) = + v K (Additive.ofMul x) + n * v K (Additive.ofMul ϖ) := by + rw [v_mul, v_zpow] + +/-- An integral power of a normalized uniformizer has valuation equal to its exponent. -/ +theorem v_zpow_of_uniformizer (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (ϖ : Kˣ) + (hϖ : v K (Additive.ofMul ϖ) = 1) (n : Int) : + v K (Additive.ofMul (ϖ ^ n)) = n := by + rw [v_zpow, hϖ, mul_one] + +/-- Multiplying by the `n`-th power of a normalized uniformizer shifts valuation by `n`. -/ +theorem v_mul_zpow_of_uniformizer (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (x ϖ : Kˣ) + (hϖ : v K (Additive.ofMul ϖ) = 1) (n : Int) : + v K (Additive.ofMul (x * ϖ ^ n)) = v K (Additive.ofMul x) + n := by + rw [v_mul_zpow, hϖ, mul_one] + +/-- A quotient has valuation zero exactly when its numerator and denominator have equal valuation. +A quotient has valuation zero exactly when its numerator and denominator have equal valuation. -/ +theorem v_div_eq_zero_iff (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (x y : Kˣ) : + v K (Additive.ofMul (x / y)) = 0 ↔ + v K (Additive.ofMul x) = v K (Additive.ofMul y) := by + rw [v_div, sub_eq_zero] + +/-- Two field units have equal valuation exactly when their quotient has valuation zero. -/ +theorem v_eq_iff_v_div_eq_zero (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (x y : Kˣ) : + v K (Additive.ofMul x) = v K (Additive.ofMul y) ↔ + v K (Additive.ofMul (x / y)) = 0 := + (v_div_eq_zero_iff K x y).symm + +/-- A nonarchimedean local field contains a unit representative of normalized valuation one. -/ +theorem v_uniformiser (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + ∃ ϖ : Kˣ, v K (Additive.ofMul ϖ) = 1 := by + obtain ⟨x, hx⟩ := v_surjective K 1 + exact ⟨Additive.toMul x, hx⟩ + +/-- The canonical inclusion of valuation-integer units into field units. -/ +def integerUnitsToFieldUnits (K : Type u) [Field K] [ValuativeRel K] : 𝒪[K]ˣ →* Kˣ := + Units.map (algebraMap 𝒪[K] K).toMonoidHom + +/-- The inclusion of valuation-ring units into field units preserves the underlying field element. +The inclusion of valuation-ring units into field units preserves the underlying field element. -/ +@[simp] +theorem integerUnitsToFieldUnits_apply (K : Type u) [Field K] [ValuativeRel K] + (x : 𝒪[K]ˣ) : + ((integerUnitsToFieldUnits K x : Kˣ) : K) = (((x : 𝒪[K]ˣ) : 𝒪[K]) : K) := + rfl + +/-- The canonical inclusion of valuation-integer units into field units is +injective. -/ +theorem integerUnitsToFieldUnits_injective + (K : Type u) [Field K] [ValuativeRel K] : + Function.Injective (integerUnitsToFieldUnits K) := by + intro x y hxy + apply Units.ext + apply Subtype.ext + simpa [integerUnitsToFieldUnits] using congrArg Units.val hxy + +/-- A valuation-integer unit has normalized valuation zero as a field unit. -/ +theorem v_integerUnitsToFieldUnits (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (x : 𝒪[K]ˣ) : + v K (Additive.ofMul (integerUnitsToFieldUnits K x)) = 0 := by + have hxv : + ValuativeRel.valuation K ((integerUnitsToFieldUnits K x : Kˣ) : K) = 1 := by + simpa [integerUnitsToFieldUnits] using + (Valuation.Integers.valuation_unit + (Valuation.integer.integers (ValuativeRel.valuation K)) x) + rw [v_apply] + apply (WithZero.toAdd_unzero_eq_iff _ 0).2 + change + (_root_.IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K) + (ValuativeRel.valuation K + ((integerUnitsToFieldUnits K x : Kˣ) : K)) = + ((Multiplicative.ofAdd (0 : Int) : Multiplicative Int) : + WithZero (Multiplicative Int)) + rw [hxv, map_one] + rfl + +end IsNonarchimedeanLocalField + +end +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionCompleteDVF.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionCompleteDVF.lean new file mode 100644 index 0000000000..59cf216cd7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionCompleteDVF.lean @@ -0,0 +1,213 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic +public import Mathlib.Algebra.Order.Hom.Units +public import Mathlib.NumberTheory.LocalField.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.ValuedAdicComplete +/-! +# Complete-DVF packages for local fields and their finite extensions + +The canonical complete discrete valuation on a nonarchimedean local field, +and an integral-closure valuation chosen on each finite separable extension. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalFieldTheory + +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension +open scoped ValuativeRel + +universe u v y + +/-! ## The canonical complete discrete valuation -/ + +/-- The canonical valuation of a nonarchimedean local field, packaged as a +complete discrete valuation field. -/ +noncomputable def localCompleteDVF + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + CompleteDVF.{u, u} K := by + letI : UniformSpace K := IsTopologicalAddGroup.rightUniformSpace K + letI : IsUniformAddGroup K := isUniformAddGroup_of_addCommGroup + let v : Valuation K (ValuativeRel.ValueGroupWithZero K) := Valued.v + let e := + (OrderMonoidIso.unitsCongr + (IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K)).trans + OrderMonoidIso.unitsWithZero + letI : IsCyclic (ValuativeRel.ValueGroupWithZero K)ˣ := + e.toMulEquiv.isCyclic.mpr inferInstance + letI : v.IsNontrivial := + (ValuativeRel.isNontrivial_iff_isNontrivial v).mp inferInstance + letI : IsCyclic (MonoidWithZeroHom.valueGroup v.toMonoidWithZeroHom) := + Subgroup.isCyclic_of_le + (show MonoidWithZeroHom.valueGroup v.toMonoidWithZeroHom ≤ ⊤ from le_top) + letI : v.IsRankOneDiscrete := Valuation.IsRankOneDiscrete.mk' v + exact ValuationTheory.Valuations.completeDVFOfCompleteValuedField + +/-- The canonical complete-DVF packages preserve an existing extension of +the underlying valuative relations. -/ +theorem localCompleteDVFValuation_hasExtension + (K : Type u) (L : Type v) [Field K] [Field L] [Algebra K L] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] : + (localCompleteDVF K).valuation.HasExtension + (localCompleteDVF L).valuation := by + apply Valuation.HasExtension.ofComapInteger + ext x + change + ValuativeRel.valuation L (algebraMap K L x) ≤ 1 ↔ + ValuativeRel.valuation K x ≤ 1 + exact + Valuation.HasExtension.val_map_le_one_iff + (ValuativeRel.valuation K) (ValuativeRel.valuation L) x + +/-- The valuation integer ring of a finite separable local extension is the +integral closure of the base valuation integer ring. -/ +theorem localCompleteDVF_integerRing_isIntegralClosure + (K : Type u) (L : Type v) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] : + IsIntegralClosure 𝒪[L] 𝒪[K] L := by + let : (localCompleteDVF K).valuation.HasExtension + (localCompleteDVF L).valuation := + localCompleteDVFValuation_hasExtension K L + let : IsScalarTower + (localCompleteDVF K).valuationSubring + (localCompleteDVF L).valuationSubring L := + Valuation.valuationSubring_isScalarTower_of_hasExtension + (localCompleteDVF K).valuation (localCompleteDVF L).valuation + exact + target_valuationSubring_isIntegralClosure_of_finite_separable + (K := K) (L := L) (localCompleteDVF K) (localCompleteDVF L) + +/-- The valuation integer ring of a finite separable local extension is a +finite module over the base valuation integer ring. -/ +theorem localCompleteDVF_integerRing_moduleFinite + (K : Type u) (L : Type v) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] : + Module.Finite 𝒪[K] 𝒪[L] := by + let : IsIntegralClosure 𝒪[L] 𝒪[K] L := + localCompleteDVF_integerRing_isIntegralClosure K L + exact IsIntegralClosure.finite 𝒪[K] K L 𝒪[L] + +/-! ## Chosen ramification data for an arbitrary finite local extension -/ + +private theorem chosenLocalExtensionCompleteDVF_exists + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + ∃ target : CompleteDVF.{0, 0} L, + ∃ hExt : (localCompleteDVF K).valuation.HasExtension target.valuation, + letI : (localCompleteDVF K).valuation.HasExtension target.valuation := + hExt + IsIntegralClosure target.valuationSubring + (localCompleteDVF K).valuationSubring L := by + obtain ⟨target, hExt, hIntegralClosure, _hDefectless⟩ := + exists_integralClosure_standard_fundamental_identity + (K := K) (L := L) (localCompleteDVF K) + exact ⟨target, hExt, hIntegralClosure⟩ + +/-- A complete discrete valuation on an arbitrary finite separable extension +of a nonarchimedean local field, chosen from its actual integral closure. -/ +noncomputable def chosenLocalExtensionCompleteDVF + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + CompleteDVF.{0, 0} L := + Classical.choose (show ∃ target : CompleteDVF.{0, 0} L, + ∃ hExt : (localCompleteDVF K).valuation.HasExtension target.valuation, + letI : (localCompleteDVF K).valuation.HasExtension target.valuation := hExt + IsIntegralClosure target.valuationSubring + (localCompleteDVF K).valuationSubring L from by + exact chosenLocalExtensionCompleteDVF_exists K L) + +/-- The chosen valuation on a finite local extension extends the canonical +valuation of its base field. -/ +theorem chosenLocalExtensionCompleteDVF_hasExtension + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + (localCompleteDVF K).valuation.HasExtension + (chosenLocalExtensionCompleteDVF K L).valuation := + Classical.choose + (Classical.choose_spec (chosenLocalExtensionCompleteDVF_exists K L)) + +/-- Supplies the valuation-extension instance for the chosen finite local +extension target. -/ +noncomputable instance chosenLocalExtensionCompleteDVF.instHasExtension + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + (localCompleteDVF K).valuation.HasExtension + (chosenLocalExtensionCompleteDVF K L).valuation := + chosenLocalExtensionCompleteDVF_hasExtension K L + +/-- The chosen valuation ring is the actual integral closure of the +canonical valuation ring of the base local field. -/ +theorem chosenLocalExtensionCompleteDVF_isIntegralClosure + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + IsIntegralClosure + (chosenLocalExtensionCompleteDVF K L).valuationSubring + (localCompleteDVF K).valuationSubring L := + Classical.choose_spec + (Classical.choose_spec (chosenLocalExtensionCompleteDVF_exists K L)) + +/-- The chosen valuation ring of a finite separable local extension is a +finite module over the canonical base valuation ring. -/ +theorem chosenLocalExtensionCompleteDVF_valuationSubring_moduleFinite + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + Module.Finite + (localCompleteDVF K).valuationSubring + (chosenLocalExtensionCompleteDVF K L).valuationSubring := by + let : IsIntegralClosure + (chosenLocalExtensionCompleteDVF K L).valuationSubring + (localCompleteDVF K).valuationSubring L := + chosenLocalExtensionCompleteDVF_isIntegralClosure K L + exact IsIntegralClosure.finite + (localCompleteDVF K).valuationSubring K L + (chosenLocalExtensionCompleteDVF K L).valuationSubring + +/-- Completeness of the base makes the chosen valuation extension unique. -/ +theorem chosenLocalExtensionCompleteDVF_hasUniqueValuationExtension + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + ValuedExtension.HasUniqueValuationExtension.{0, 0, 0, 0, y} + (base := localCompleteDVF K) + (target := chosenLocalExtensionCompleteDVF K L) := + hasUniqueValuationExtension_of_finite_separable + (localCompleteDVF K) (chosenLocalExtensionCompleteDVF K L) + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionTopology.lean new file mode 100644 index 0000000000..de0799587b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionTopology.lean @@ -0,0 +1,293 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology +public import Mathlib.Analysis.Normed.Unbundled.SpectralNorm +public import Mathlib.RingTheory.Valuation.Extension +/-! +# The canonical topology on a finite extension of a local field + +This file packages the spectral norm topology on a finite extension of a +nonarchimedean local field. The definitions are deliberately explicit: they +let downstream constructions put several finite extensions in one diagram +while using the same topology on every field. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalFieldTheory + +open scoped NNReal ValuativeRel + +/-- The normed-field structure canonically associated with the native +topology of a nonarchimedean local field. -/ +@[reducible] +noncomputable def localFieldNontriviallyNormedField + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : NontriviallyNormedField K := by + letI : UniformSpace K := IsTopologicalAddGroup.rightUniformSpace K + letI : IsUniformAddGroup K := isUniformAddGroup_of_addCommGroup + letI : (Valued.v : Valuation K + (ValuativeRel.ValueGroupWithZero K)).RankOne := + { hom' := ValuativeRel.IsRankLeOne.nonempty.some.emb (R := K) |>.comp + MonoidWithZeroHom.ValueGroup₀.embedding + strictMono' := ValuativeRel.IsRankLeOne.nonempty.some.strictMono.comp + MonoidWithZeroHom.ValueGroup₀.embedding_strictMono } + exact Valued.toNontriviallyNormedField + (L := K) (Γ₀ := ValuativeRel.ValueGroupWithZero K) + +/-- The native norm obtained from a nonarchimedean local field is +ultrametric. This is kept as a named companion to +`localFieldNontriviallyNormedField` so that every use of the spectral norm +starts from the same norm and the same ultrametric structure. -/ +theorem localFieldIsUltrametricDist + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + letI : NontriviallyNormedField K := + localFieldNontriviallyNormedField K + IsUltrametricDist K := by + let : UniformSpace K := IsTopologicalAddGroup.rightUniformSpace K + let : IsUniformAddGroup K := isUniformAddGroup_of_addCommGroup + let : (Valued.v : Valuation K + (ValuativeRel.ValueGroupWithZero K)).RankOne := + { hom' := ValuativeRel.IsRankLeOne.nonempty.some.emb (R := K) |>.comp + MonoidWithZeroHom.ValueGroup₀.embedding + strictMono' := ValuativeRel.IsRankLeOne.nonempty.some.strictMono.comp + MonoidWithZeroHom.ValueGroup₀.embedding_strictMono } + infer_instance + +/-- A finite extension, equipped with the spectral norm extending the native +topology of its nonarchimedean local base field. -/ +@[reducible] +noncomputable def finiteExtensionSpectralNormedField + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : NontriviallyNormedField L := by + letI : NontriviallyNormedField K := + localFieldNontriviallyNormedField K + letI : IsUltrametricDist K := localFieldIsUltrametricDist K + exact spectralNorm.nontriviallyNormedField K L + +/-- A finite extension is complete for its canonical spectral norm. -/ +theorem finiteExtensionSpectralCompleteSpace + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + letI : NontriviallyNormedField L := + finiteExtensionSpectralNormedField K L + CompleteSpace L := by + let : NontriviallyNormedField K := + localFieldNontriviallyNormedField K + let : IsUltrametricDist K := localFieldIsUltrametricDist K + exact spectralNorm.completeSpace K L + +/-- A finite extension is locally compact for its canonical spectral norm. -/ +theorem finiteExtensionSpectralLocallyCompactSpace + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + letI : NontriviallyNormedField L := + finiteExtensionSpectralNormedField K L + LocallyCompactSpace L := by + let : NontriviallyNormedField K := + localFieldNontriviallyNormedField K + let : IsUltrametricDist K := localFieldIsUltrametricDist K + exact + (fun (V : Type) [nV : NontriviallyNormedField V] + [spaceKV : NormedSpace K V] [FiniteDimensional K V] => + LocallyCompactSpace.of_finiteDimensional_of_complete K V) + L (nV := finiteExtensionSpectralNormedField K L) + (spaceKV := spectralNorm.normedSpace K L) + +/-- The spectral norm on a finite extension of a nonarchimedean local field +is ultrametric. -/ +theorem finiteExtensionSpectralIsUltrametricDist + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + letI : NontriviallyNormedField L := + finiteExtensionSpectralNormedField K L + IsUltrametricDist L := by + let : NontriviallyNormedField K := + localFieldNontriviallyNormedField K + let : IsUltrametricDist K := localFieldIsUltrametricDist K + exact + (fun (F : Type) [nF : NormedField F] + (h : IsNonarchimedean (norm : F → ℝ)) => + IsUltrametricDist.isUltrametricDist_of_isNonarchimedean_norm h) + L (nF := (finiteExtensionSpectralNormedField K L).toNormedField) + (isNonarchimedean_spectralNorm (K := K) (L := L)) + +/-- The valuative relation induced by the canonical spectral norm. -/ +@[reducible] +noncomputable def finiteExtensionSpectralValuativeRel + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + letI : NontriviallyNormedField L := + finiteExtensionSpectralNormedField K L + ValuativeRel L := by + letI hUltra := finiteExtensionSpectralIsUltrametricDist K L + exact ValuativeRel.ofValuation + (NormedField.valuation (K := L) + (hK := (finiteExtensionSpectralNormedField K L).toNormedField)) + +/-- A finite extension with the spectral norm is again a nonarchimedean +local field. -/ +theorem finiteExtensionSpectralIsNonarchimedeanLocalField + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + letI : NontriviallyNormedField L := + finiteExtensionSpectralNormedField K L + letI : ValuativeRel L := finiteExtensionSpectralValuativeRel K L + IsNonarchimedeanLocalField L := by + exact + (fun (F : Type) [nF : NontriviallyNormedField F] [hUltra : IsUltrametricDist F] + [hCompact : LocallyCompactSpace F] => + letI : Valued F ℝ≥0 := NormedField.toValued + let vL : Valuation F ℝ≥0 := Valued.v + letI : ValuativeRel F := ValuativeRel.ofValuation vL + letI : vL.Compatible := Valuation.Compatible.ofValuation vL + letI : ValuativeRel.IsNontrivial F := + (ValuativeRel.isNontrivial_iff_isNontrivial vL).2 + (inferInstanceAs (NormedField.valuation (K := F)).IsNontrivial) + letI : IsValuativeTopology F := + isValuativeTopology_of_valued_ofValuation F ℝ≥0 + show IsNonarchimedeanLocalField F from + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := hCompact + toIsNontrivial := inferInstance }) + L (nF := finiteExtensionSpectralNormedField K L) + (hUltra := finiteExtensionSpectralIsUltrametricDist K L) + (hCompact := finiteExtensionSpectralLocallyCompactSpace K L) + +/-- The valuative relation coming from the spectral norm is the canonical +extension of the native valuation on the local base field. -/ +theorem finiteExtensionSpectralValuation_hasExtension + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + letI : NontriviallyNormedField L := + finiteExtensionSpectralNormedField K L + letI : ValuativeRel L := finiteExtensionSpectralValuativeRel K L + Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L) := by + let : NontriviallyNormedField K := + localFieldNontriviallyNormedField K + let : IsUltrametricDist K := localFieldIsUltrametricDist K + let : (Valued.v : Valuation K + (ValuativeRel.ValueGroupWithZero K)).RankOne := + { hom' := ValuativeRel.IsRankLeOne.nonempty.some.emb (R := K) |>.comp + MonoidWithZeroHom.ValueGroup₀.embedding + strictMono' := ValuativeRel.IsRankLeOne.nonempty.some.strictMono.comp + MonoidWithZeroHom.ValueGroup₀.embedding_strictMono } + apply Valuation.HasExtension.ofComapInteger + ext x + simp only [Subring.mem_comap, Valuation.mem_integer_iff] + have hL := + (fun (F : Type) [nF : NormedField F] [hUltra : IsUltrametricDist F] + (y : F) => + let v : Valuation F ℝ≥0 := NormedField.valuation (K := F) + letI : ValuativeRel F := ValuativeRel.ofValuation v + letI : v.Compatible := Valuation.Compatible.ofValuation v + (Valuation.vle_one_iff (ValuativeRel.valuation F) (x := y)).symm.trans + (Valuation.vle_one_iff v (x := y))) + L (nF := (finiteExtensionSpectralNormedField K L).toNormedField) + (hUltra := finiteExtensionSpectralIsUltrametricDist K L) + (algebraMap K L x) + refine hL.trans ?_ + change spectralNorm K L (algebraMap K L x) ≤ 1 ↔ + ValuativeRel.valuation K x ≤ 1 + rw [spectralNorm_extends (K := K) (L := L) x] + exact Valued.toNormedField.norm_le_one_iff + (L := K) (Γ₀ := ValuativeRel.ValueGroupWithZero K) + +/-- If `E/K` and `L/K` carry their canonical `K`-spectral norms in a +tower `K \to E \to L`, then the given `E`-algebra structure on `L` is a +normed algebra. In particular, inclusion and norm maps in finite towers are +continuous for one topology on each field. -/ +@[reducible] +noncomputable def finiteExtensionSpectralNormedAlgebra + (K E L : Type) [Field K] [Field E] [Field L] + [Algebra K E] [Algebra E L] [Algebra K L] [IsScalarTower K E L] + [FiniteDimensional K E] [FiniteDimensional K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + letI : NontriviallyNormedField E := + finiteExtensionSpectralNormedField K E + letI : NontriviallyNormedField L := + finiteExtensionSpectralNormedField K L + NormedAlgebra E L := by + letI : NontriviallyNormedField K := + localFieldNontriviallyNormedField K + letI : IsUltrametricDist K := localFieldIsUltrametricDist K + exact + (fun (F : Type) [nF : NormedField F] [aKF : NormedAlgebra K F] + [Algebra F L] [IsScalarTower K F L] => + spectralNorm.normedAlgebra' (K := K) F L) + E (nF := (finiteExtensionSpectralNormedField K E).toNormedField) + (aKF := spectralNorm.normedAlgebra K E) + +/-- In a finite tower equipped throughout with the spectral norms over its +local base, the upper spectral valuation extends the intermediate spectral +valuation. -/ +theorem finiteExtensionSpectralValuation_hasExtension_of_tower + (K E L : Type) [Field K] [Field E] [Field L] + [Algebra K E] [Algebra E L] [Algebra K L] [IsScalarTower K E L] + [FiniteDimensional K E] [FiniteDimensional K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + letI : NontriviallyNormedField E := + finiteExtensionSpectralNormedField K E + letI : NontriviallyNormedField L := + finiteExtensionSpectralNormedField K L + letI : ValuativeRel E := + finiteExtensionSpectralValuativeRel K E + letI : ValuativeRel L := + finiteExtensionSpectralValuativeRel K L + Valuation.HasExtension (ValuativeRel.valuation E) + (ValuativeRel.valuation L) := by + let : NontriviallyNormedField K := + localFieldNontriviallyNormedField K + let : IsUltrametricDist K := localFieldIsUltrametricDist K + apply Valuation.HasExtension.ofComapInteger + ext x + simp only [Subring.mem_comap, Valuation.mem_integer_iff] + have hCompare := + (fun (F : Type) [nF : NormedField F] [hUltra : IsUltrametricDist F] + (y : F) => + let v : Valuation F ℝ≥0 := NormedField.valuation (K := F) + letI : ValuativeRel F := ValuativeRel.ofValuation v + letI : v.Compatible := Valuation.Compatible.ofValuation v + (Valuation.vle_one_iff (ValuativeRel.valuation F) (x := y)).symm.trans + (Valuation.vle_one_iff v (x := y))) + have hL := + hCompare L (nF := (finiteExtensionSpectralNormedField K L).toNormedField) + (hUltra := finiteExtensionSpectralIsUltrametricDist K L) + (algebraMap E L x) + have hE := + hCompare E (nF := (finiteExtensionSpectralNormedField K E).toNormedField) + (hUltra := finiteExtensionSpectralIsUltrametricDist K E) x + refine hL.trans (Iff.trans ?_ hE.symm) + change spectralNorm K L (algebraMap E L x) ≤ 1 ↔ + spectralNorm K E x ≤ 1 + rw [(spectralNorm.eq_of_tower (K := K) (E := E) (L := L) x).symm] + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteUnramified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteUnramified.lean new file mode 100644 index 0000000000..89a5fa31a2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteUnramified.lean @@ -0,0 +1,950 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import Mathlib.FieldTheory.Galois.Basic +public import Mathlib.RingTheory.DedekindDomain.Factorization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueGalois +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +/-! +# Finite unramified valued extensions + +Develops the ideal, residue-field, Galois, trace, and norm consequences of a +finite valued extension with ramification index one and full residue degree. +-/ + +@[expose] public section + +namespace LocalFieldTheory + +noncomputable +section + +universe u + +namespace IsNonarchimedeanLocalField + +open scoped ValuativeRel + +/-- A finite valuation extension is unramified at the actual valuation-ring +frontier when the ramification index of the maximal ideals is one. + +This is the concrete source needed for residue-field automorphism comparisons. -/ +class IsUnramifiedValuedExtension (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] : Prop where + /-- The maximal ideal of `𝒪[L]` has ramification index one over `𝒪[K]`. -/ + maximalIdeal_ramificationIdx_eq_one : + (𝓂[L] : Ideal 𝒪[L]).ramificationIdx 𝒪[K] = 1 + +/-- An unramified valued extension has ramification index one. -/ +theorem unramifiedValuation_ramificationIdx_eq_one + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] [IsUnramifiedValuedExtension K L] : + (𝓂[L] : Ideal 𝒪[L]).ramificationIdx 𝒪[K] = 1 := + IsUnramifiedValuedExtension.maximalIdeal_ramificationIdx_eq_one + (K := K) (L := L) + +/-- For an unramified valued extension, the residue-field degree equals the field-extension degree. +For an unramified valued extension, the residue-field degree equals the field-extension degree. -/ +theorem unramifiedValuation_residue_finrank_eq_finrank + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] [IsUnramifiedValuedExtension K L] : + Module.finrank 𝓀[K] 𝓀[L] = Module.finrank K L := by + have h := + LocalFieldTheory.maximalIdeal_ramificationIdx_mul_residue_finrank_eq_finrank K L + have hp : (𝓂[K] : Ideal 𝒪[K]) ≠ ⊥ := + Ring.ne_bot_of_isMaximal_of_not_isField + (IsLocalRing.maximalIdeal.isMaximal 𝒪[K]) + (IsDiscreteValuationRing.not_isField 𝒪[K]) + rw [Ideal.ramificationIdx'_eq_ramificationIdx _ _ hp, + unramifiedValuation_ramificationIdx_eq_one K L, one_mul] at h + exact h + +end IsNonarchimedeanLocalField + +open scoped ValuativeRel +open _root_.LocalFieldTheory.IsNonarchimedeanLocalField +open Filter + +/-- In an actual unramified valuation extension, the image of the base maximal +ideal is the maximal ideal upstairs. -/ +theorem maximalIdeal_map_eq_maximalIdeal_of_unramifiedValuation (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + Ideal.map (algebraMap 𝒪[K] 𝒪[L]) (𝓂[K] : Ideal 𝒪[K]) = + (𝓂[L] : Ideal 𝒪[L]) := by + have hp : (𝓂[K] : Ideal 𝒪[K]) ≠ ⊥ := by + exact Ring.ne_bot_of_isMaximal_of_not_isField + (IsLocalRing.maximalIdeal.isMaximal 𝒪[K]) + (IsDiscreteValuationRing.not_isField 𝒪[K]) + have hfact := Ideal.map_algebraMap_eq_finsetProd_pow + (R := 𝒪[L]) (S := 𝒪[K]) (p := (𝓂[K] : Ideal 𝒪[K])) hp + have hfin : ((𝓂[K] : Ideal 𝒪[K]).primesOver 𝒪[L]).toFinset = + ({(𝓂[L] : Ideal 𝒪[L])} : Finset (Ideal 𝒪[L])) := by + ext P + simp [IsLocalRing.primesOver_eq 𝒪[L] hp] + rw [hfin] at hfact + simpa [LocalFieldTheory.IsNonarchimedeanLocalField.unramifiedValuation_ramificationIdx_eq_one K L] + using hfact + +/-- A base DVR uniformizer remains a DVR uniformizer after an actual +unramified valuation extension. -/ +theorem integerRingMap_uniformizer_irreducible_of_unramifiedValuation + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + Irreducible (integerRingMapOfValuationExtension K L (chosenIntegerRingUniformizer K)) := by + rw [IsDiscreteValuationRing.irreducible_iff_uniformizer] + calc + (𝓂[L] : Ideal 𝒪[L]) = + Ideal.map (algebraMap 𝒪[K] 𝒪[L]) (𝓂[K] : Ideal 𝒪[K]) := + (maximalIdeal_map_eq_maximalIdeal_of_unramifiedValuation K L).symm + _ = Ideal.map (algebraMap 𝒪[K] 𝒪[L]) + (Ideal.span ({chosenIntegerRingUniformizer K} : Set 𝒪[K])) := by + rw [chosenIntegerRingUniformizer_maximalIdeal_eq K] + _ = Ideal.span + ({integerRingMapOfValuationExtension K L (chosenIntegerRingUniformizer K)} : + Set 𝒪[L]) := by + rw [Ideal.map_span, Set.image_singleton] + rfl + +/-- in an actual unramified valuation extension, the base +prime element remains a prime element upstairs and therefore has upstairs +normalized value `-1`. + +This is the source-producing replacement for passing an upstairs +uniformizer-value input to later norm-valuation arguments. -/ +theorem v_mapBaseUnitsToExtensionUnits_integerRingUniformizerFieldUnit_of_unramifiedValuation + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + LocalFieldTheory.IsNonarchimedeanLocalField.v L + (Additive.ofMul + (mapBaseUnitsToExtensionUnits K L (integerRingUniformizerFieldUnit K))) = -1 := by + let πL : 𝒪[L] := integerRingMapOfValuationExtension K L (chosenIntegerRingUniformizer K) + have hπL : Irreducible πL := by + simpa [πL] using integerRingMap_uniformizer_irreducible_of_unramifiedValuation K L + exact v_integerRingIrreducibleFieldUnit L πL hπL + (mapBaseUnitsToExtensionUnits K L (integerRingUniformizerFieldUnit K)) (by + dsimp [πL] + rfl) + +/-- In an actual unramified valuation extension, the inverse of the base prime +element has upstairs normalized value `1`. This is the L-side generator needed +before the local class-field norm-valuation calculation. -/ +theorem v_mapBaseUnitsToExtensionUnits_inverseIntegerRingUniformizerFieldUnit_of_unramifiedValuation + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + LocalFieldTheory.IsNonarchimedeanLocalField.v L + (Additive.ofMul + (mapBaseUnitsToExtensionUnits K L (inverseIntegerRingUniformizerFieldUnit K))) = + 1 := by + rw [inverseIntegerRingUniformizerFieldUnit, + (mapBaseUnitsToExtensionUnits K L).map_inv] + rw [LocalFieldTheory.IsNonarchimedeanLocalField.v_inv] + rw [v_mapBaseUnitsToExtensionUnits_integerRingUniformizerFieldUnit_of_unramifiedValuation] + norm_num + +/-- In an actual unramified valuation extension, the integer-ring map sends +`𝓂_K^n` into `𝓂_L^n`. The proof uses the base uniformizer as an upstairs +uniformizer, which is the local source needed before comparing graded +principal-unit quotients with residue fields. -/ +theorem integerRingMap_mem_maximalIdeal_pow_of_unramifiedValuation + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) {a : 𝒪[K]} (ha : a ∈ (𝓂[K] ^ n : Ideal 𝒪[K])) : + integerRingMapOfValuationExtension K L a ∈ (𝓂[L] ^ n : Ideal 𝒪[L]) := by + let πK : 𝒪[K] := chosenIntegerRingUniformizer K + have hπL : Irreducible (integerRingMapOfValuationExtension K L πK) := by + simpa [πK] using integerRingMap_uniformizer_irreducible_of_unramifiedValuation K L + have ha_span : a ∈ Ideal.span ({πK ^ n} : Set 𝒪[K]) := by + simpa [πK, maximalIdeal_pow_eq_span_uniformizer_pow K n] using ha + rcases (Ideal.mem_span_singleton.mp ha_span) with ⟨r, hr⟩ + rw [maximalIdeal_pow_eq_span_uniformizer_pow_of_irreducible L + (integerRingMapOfValuationExtension K L πK) hπL n] + rw [Ideal.mem_span_singleton] + refine ⟨integerRingMapOfValuationExtension K L r, ?_⟩ + simp [integerRingMapOfValuationExtension, hr, map_pow] + +/-- The additive map on `𝓂^n` induced by base extension in an actual +unramified valuation extension. -/ +def maximalIdealPowMapOfUnramifiedValuation (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) : + ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) →+ ((𝓂[L] ^ n : Ideal 𝒪[L]) : Type u) where + toFun a := + ⟨integerRingMapOfValuationExtension K L (a : 𝒪[K]), + integerRingMap_mem_maximalIdeal_pow_of_unramifiedValuation K L n a.2⟩ + map_zero' := by + ext + simp [integerRingMapOfValuationExtension] + map_add' a b := by + ext + simp [integerRingMapOfValuationExtension] + +/-- The map on maximal-ideal powers induced by an unramified extension is given by the integer-ring +inclusion. -/ +@[simp] +theorem maximalIdealPowMapOfUnramifiedValuation_apply (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (a : ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u)) : + (maximalIdealPowMapOfUnramifiedValuation K L n a : 𝒪[L]) = + integerRingMapOfValuationExtension K L (a : 𝒪[K]) := + rfl + +/-- The induced additive map on `𝓂^n/𝓂^(n+1)` in an actual unramified +valuation extension. -/ +def maximalIdealPowSuccQuotMapOfUnramifiedValuation (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) : + MaximalIdealPowSuccQuot K n →+ MaximalIdealPowSuccQuot L n := + QuotientAddGroup.map + (maximalIdealPowSuccSubmodule K n).toAddSubgroup + (maximalIdealPowSuccSubmodule L n).toAddSubgroup + (maximalIdealPowMapOfUnramifiedValuation K L n) + (by + intro a ha + exact (mem_maximalIdealPowSuccSubmodule_iff L n + (maximalIdealPowMapOfUnramifiedValuation K L n a)).2 + (integerRingMap_mem_maximalIdeal_pow_of_unramifiedValuation K L (n + 1) + ((mem_maximalIdealPowSuccSubmodule_iff K n a).1 ha))) + +/-- The induced map on successive maximal-ideal quotients sends a representative to its image under +the integer-ring inclusion. -/ +theorem maximalIdealPowSuccQuotMapOfUnramifiedValuation_mk (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (a : ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u)) : + maximalIdealPowSuccQuotMapOfUnramifiedValuation K L n + (maximalIdealPowSuccQuotMk K n a) = + maximalIdealPowSuccQuotMk L n + (maximalIdealPowMapOfUnramifiedValuation K L n a) := + QuotientAddGroup.map_mk _ _ _ _ a + +/-- Base extension on `𝓂^n` sends the representative `r * ϖ_K^n` to the +corresponding upstairs representative using the image of the base uniformizer. -/ +theorem maximalIdealPowMapOfUnramifiedValuation_mul_uniformizer_pow + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (r : 𝒪[K]) : + maximalIdealPowMapOfUnramifiedValuation K L n + (maximalIdealPowMulUniformizerPowMap K (chosenIntegerRingUniformizer K) + (chosenIntegerRingUniformizer_irreducible K) n r) = + maximalIdealPowMulUniformizerPowMap L + (integerRingMapOfValuationExtension K L (chosenIntegerRingUniformizer K)) + (integerRingMap_uniformizer_irreducible_of_unramifiedValuation K L) n + (integerRingMapOfValuationExtension K L r) := by + ext + simp [maximalIdealPowMulUniformizerPowMap, integerRingMapOfValuationExtension, map_pow] + +/-- On `𝓂^n/𝓂^(n+1)`, base extension commutes with the representative map +`r ↦ r * ϖ_K^n` when the upstairs uniformizer is the image of `ϖ_K`. -/ +theorem maximalIdealPowSuccQuotMapOfUnramifiedValuation_mul_uniformizer_pow + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (r : 𝒪[K]) : + maximalIdealPowSuccQuotMapOfUnramifiedValuation K L n + (maximalIdealPowSuccQuotMulUniformizerPowMap K (chosenIntegerRingUniformizer K) + (chosenIntegerRingUniformizer_irreducible K) n r) = + maximalIdealPowSuccQuotMulUniformizerPowMap L + (integerRingMapOfValuationExtension K L (chosenIntegerRingUniformizer K)) + (integerRingMap_uniformizer_irreducible_of_unramifiedValuation K L) n + (integerRingMapOfValuationExtension K L r) := by + rw [maximalIdealPowSuccQuotMulUniformizerPowMap_apply, + maximalIdealPowSuccQuotMapOfUnramifiedValuation_mk, + maximalIdealPowSuccQuotMulUniformizerPowMap_apply] + exact congrArg (maximalIdealPowSuccQuotMk L n) + (maximalIdealPowMapOfUnramifiedValuation_mul_uniformizer_pow K L n r) + +/-- With the upstairs uniformizer chosen as the image of the base uniformizer, +the associated-graded base-extension map is compatible with reduction on +integer-ring representatives. -/ +theorem residueAddEquivMaximalIdealPowSuccQuotOfIrreducible_map_residue + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (r : 𝒪[K]) : + maximalIdealPowSuccQuotMapOfUnramifiedValuation K L n + (residueAddEquivMaximalIdealPowSuccQuotOfIrreducible K + (chosenIntegerRingUniformizer K) (chosenIntegerRingUniformizer_irreducible K) n + (IsLocalRing.residue 𝒪[K] r)) = + residueAddEquivMaximalIdealPowSuccQuotOfIrreducible L + (integerRingMapOfValuationExtension K L (chosenIntegerRingUniformizer K)) + (integerRingMap_uniformizer_irreducible_of_unramifiedValuation K L) n + (residueFieldMapOfValuationExtension K L (IsLocalRing.residue 𝒪[K] r)) := by + rw [residueAddEquivMaximalIdealPowSuccQuotOfIrreducible_residue, + maximalIdealPowSuccQuotMapOfUnramifiedValuation_mul_uniformizer_pow] + rw [residueFieldMapOfValuationExtension_residue] + rw [residueAddEquivMaximalIdealPowSuccQuotOfIrreducible_residue] + +/-- The base-uniformizer comparison `𝓀[K] ≃ 𝓂_K^n/𝓂_K^(n+1)` commutes with +base extension of residue fields in an actual unramified valuation extension. + +The upstairs comparison deliberately uses `algebraMap ϖ_K` as uniformizer, not +the independently chosen canonical uniformizer of `L`; this is the twist-free +form needed before the principal-unit norm/trace calculation. -/ +theorem residueAddEquivMaximalIdealPowSuccQuotOfIrreducible_map + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (x : 𝓀[K]) : + maximalIdealPowSuccQuotMapOfUnramifiedValuation K L n + (residueAddEquivMaximalIdealPowSuccQuotOfIrreducible K + (chosenIntegerRingUniformizer K) (chosenIntegerRingUniformizer_irreducible K) n x) = + residueAddEquivMaximalIdealPowSuccQuotOfIrreducible L + (integerRingMapOfValuationExtension K L (chosenIntegerRingUniformizer K)) + (integerRingMap_uniformizer_irreducible_of_unramifiedValuation K L) n + (residueFieldMapOfValuationExtension K L x) := by + refine Quotient.inductionOn' x ?_ + intro r + exact residueAddEquivMaximalIdealPowSuccQuotOfIrreducible_map_residue K L n r + +/-- In an actual unramified valuation extension, base extension sends +`U_K^n` into `U_L^n`. -/ +theorem integerUnitsMapOfValuationExtension_mem_principalUnits_of_unramifiedValuation + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) {u : 𝒪[K]ˣ} (hu : u ∈ principalUnits K n) : + integerUnitsMapOfValuationExtension K L u ∈ principalUnits L n := by + rw [mem_principalUnits_iff] at hu ⊢ + have hmap := + integerRingMap_mem_maximalIdeal_pow_of_unramifiedValuation K L n hu + simpa [integerUnitsMapOfValuationExtension_apply, integerRingMapOfValuationExtension, + sub_eq_add_neg] using hmap + +/-- Base extension restricted to the `n`-th principal-unit group in an actual +unramified valuation extension. -/ +def principalUnitsMapOfUnramifiedValuation (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) : + principalUnits K n →* principalUnits L n where + toFun u := + ⟨integerUnitsMapOfValuationExtension K L u.1, + integerUnitsMapOfValuationExtension_mem_principalUnits_of_unramifiedValuation + K L n u.2⟩ + map_one' := by + ext + simp + map_mul' u v := by + ext + simp + +/-- The map on principal units for an unramified extension is induced by the integer-ring inclusion. +The map on principal units for an unramified extension is induced by the integer-ring inclusion. -/ +@[simp] +theorem principalUnitsMapOfUnramifiedValuation_apply (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (u : principalUnits K n) : + ((principalUnitsMapOfUnramifiedValuation K L n u : principalUnits L n) : + 𝒪[L]ˣ) = + integerUnitsMapOfValuationExtension K L u.1 := + rfl + +/-- Base extension carries the concrete unit `1 + a` to the concrete upstairs +unit `1 + algebraMap a`. -/ +theorem principalUnitsMapOfUnramifiedValuation_oneAdd (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) (a : (𝓂[K] ^ n : Ideal 𝒪[K])) : + principalUnitsMapOfUnramifiedValuation K L n + (principalUnitOneAddOfMemPowSubgroup K hn (a : 𝒪[K]) a.2) = + principalUnitOneAddOfMemPowSubgroup L hn + (integerRingMapOfValuationExtension K L (a : 𝒪[K])) + (integerRingMap_mem_maximalIdeal_pow_of_unramifiedValuation K L n a.2) := by + ext + simp [principalUnitsMapOfUnramifiedValuation, principalUnitOneAddOfMemPowSubgroup, + principalUnitOneAddOfMemPow_val, integerRingMapOfValuationExtension] + +/-- Base extension on successive principal-unit quotients in an actual +unramified valuation extension. -/ +def principalUnitsSuccQuotMapOfUnramifiedValuation (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) : + PrincipalUnitsSuccQuot K n →* PrincipalUnitsSuccQuot L n := + principalUnitsSuccQuotLift n + ((principalUnitsSuccQuotMk L n).comp + (principalUnitsMapOfUnramifiedValuation K L n)) + (by + intro u hu + rw [MonoidHom.mem_ker, MonoidHom.comp_apply, + principalUnitsSuccQuotMk_eq_one_iff] + change ((principalUnitsMapOfUnramifiedValuation K L n u : + principalUnits L n) : 𝒪[L]ˣ) ∈ principalUnits L (n + 1) + simpa [principalUnitsMapOfUnramifiedValuation_apply] + using integerUnitsMapOfValuationExtension_mem_principalUnits_of_unramifiedValuation + K L (n + 1) (u := u.1) hu) + +/-- The induced map on successive principal-unit quotients sends a class to the class of its +included representative. -/ +@[simp] +theorem principalUnitsSuccQuotMapOfUnramifiedValuation_mk (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (u : principalUnits K n) : + principalUnitsSuccQuotMapOfUnramifiedValuation K L n + (principalUnitsSuccQuotMk K n u) = + principalUnitsSuccQuotMk L n + (principalUnitsMapOfUnramifiedValuation K L n u) := + rfl + +/-- Base extension on `𝓂^n/𝓂^(n+1)` is compatible with the comparison +`a ↦ 1 + a` to successive principal-unit quotients. -/ +theorem principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_map + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) (x : MaximalIdealPowSuccQuot K n) : + principalUnitsSuccQuotMapOfUnramifiedValuation K L n + (principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn x) = + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot L n hn + (maximalIdealPowSuccQuotMapOfUnramifiedValuation K L n x) := by + refine MaximalIdealPowSuccQuot.inductionOn n + (motive := fun x => + principalUnitsSuccQuotMapOfUnramifiedValuation K L n + (principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn x) = + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot L n hn + (maximalIdealPowSuccQuotMapOfUnramifiedValuation K L n x)) + x ?_ + intro a + rw [maximalIdealPowSuccQuotMapOfUnramifiedValuation_mk, + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_mk, + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_mk] + rw [principalUnitsSuccQuotOfIdealPow_apply, principalUnitsSuccQuotOfIdealPow_apply, + principalUnitsSuccQuotMapOfUnramifiedValuation_mk] + congr 1 + exact principalUnitsMapOfUnramifiedValuation_oneAdd K L n hn a + +/-- Additive form of compatibility between base extension and the comparison +`𝓂^n/𝓂^(n+1) ≃ U^n/U^(n+1)`. -/ +theorem principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd_map + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) (x : MaximalIdealPowSuccQuot K n) : + MonoidHom.toAdditive (principalUnitsSuccQuotMapOfUnramifiedValuation K L n) + (principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd K n hn x) = + principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd L n hn + (maximalIdealPowSuccQuotMapOfUnramifiedValuation K L n x) := by + change Additive.ofMul + (principalUnitsSuccQuotMapOfUnramifiedValuation K L n + (principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn x)) = + Additive.ofMul + (principalUnitsSuccQuotOfMaximalIdealPowSuccQuot L n hn + (maximalIdealPowSuccQuotMapOfUnramifiedValuation K L n x)) + rw [principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_map] + +/-- The base-uniformizer identification `U^n/U^(n+1) ≃ 𝓀` commutes with +base extension in an actual unramified valuation extension, when the upstairs +uniformizer is chosen as the image of the base uniformizer. -/ +theorem principalUnitsSuccQuotAddEquivResidueOfIrreducible_symm_map + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) (x : 𝓀[K]) : + MonoidHom.toAdditive (principalUnitsSuccQuotMapOfUnramifiedValuation K L n) + ((principalUnitsSuccQuotAddEquivResidueOfIrreducible K + (chosenIntegerRingUniformizer K) (chosenIntegerRingUniformizer_irreducible K) + n hn).symm x) = + (principalUnitsSuccQuotAddEquivResidueOfIrreducible L + (integerRingMapOfValuationExtension K L (chosenIntegerRingUniformizer K)) + (integerRingMap_uniformizer_irreducible_of_unramifiedValuation K L) + n hn).symm (residueFieldMapOfValuationExtension K L x) := by + change MonoidHom.toAdditive (principalUnitsSuccQuotMapOfUnramifiedValuation K L n) + (principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd K n hn + (residueAddEquivMaximalIdealPowSuccQuotOfIrreducible K + (chosenIntegerRingUniformizer K) (chosenIntegerRingUniformizer_irreducible K) n x)) = + principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd L n hn + (residueAddEquivMaximalIdealPowSuccQuotOfIrreducible L + (integerRingMapOfValuationExtension K L (chosenIntegerRingUniformizer K)) + (integerRingMap_uniformizer_irreducible_of_unramifiedValuation K L) + n (residueFieldMapOfValuationExtension K L x)) + rw [principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd_map] + rw [residueAddEquivMaximalIdealPowSuccQuotOfIrreducible_map] + +/-- Base extension on successive principal-unit quotients is injective in an +actual unramified valuation extension. -/ +theorem principalUnitsSuccQuotMapOfUnramifiedValuation_injective + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (hn : 1 ≤ n) : + Function.Injective (principalUnitsSuccQuotMapOfUnramifiedValuation K L n) := by + intro x y hxy + let eK := + principalUnitsSuccQuotAddEquivResidueOfIrreducible K + (chosenIntegerRingUniformizer K) (chosenIntegerRingUniformizer_irreducible K) n hn + let eL := + principalUnitsSuccQuotAddEquivResidueOfIrreducible L + (integerRingMapOfValuationExtension K L (chosenIntegerRingUniformizer K)) + (integerRingMap_uniformizer_irreducible_of_unramifiedValuation K L) n hn + let xκ : 𝓀[K] := eK (Additive.ofMul x) + let yκ : 𝓀[K] := eK (Additive.ofMul y) + have hxmap : + MonoidHom.toAdditive (principalUnitsSuccQuotMapOfUnramifiedValuation K L n) + (Additive.ofMul x) = + eL.symm (residueFieldMapOfValuationExtension K L xκ) := by + simpa [eK, eL, xκ] using + principalUnitsSuccQuotAddEquivResidueOfIrreducible_symm_map K L n hn xκ + have hymap : + MonoidHom.toAdditive (principalUnitsSuccQuotMapOfUnramifiedValuation K L n) + (Additive.ofMul y) = + eL.symm (residueFieldMapOfValuationExtension K L yκ) := by + simpa [eK, eL, yκ] using + principalUnitsSuccQuotAddEquivResidueOfIrreducible_symm_map K L n hn yκ + have hxyAdd : + MonoidHom.toAdditive (principalUnitsSuccQuotMapOfUnramifiedValuation K L n) + (Additive.ofMul x) = + MonoidHom.toAdditive (principalUnitsSuccQuotMapOfUnramifiedValuation K L n) + (Additive.ofMul y) := by + change Additive.ofMul + (principalUnitsSuccQuotMapOfUnramifiedValuation K L n x) = + Additive.ofMul (principalUnitsSuccQuotMapOfUnramifiedValuation K L n y) + exact congrArg Additive.ofMul hxy + have hres : + residueFieldMapOfValuationExtension K L xκ = + residueFieldMapOfValuationExtension K L yκ := + eL.symm.injective (hxmap.symm.trans (hxyAdd.trans hymap)) + have hκ : xκ = yκ := + (RingHom.injective (residueFieldMapOfValuationExtension K L)) hres + have hadd : Additive.ofMul x = Additive.ofMul y := + eK.injective (by simpa [xκ, yκ] using hκ) + exact Additive.ofMul.injective hadd + +/-- Principal-unit contraction for an actual unramified valuation extension. + +If a base integer unit becomes an `n`-th principal unit upstairs, then it was +already an `n`-th principal unit downstairs. -/ +theorem principalUnits_of_integerUnitsMap_mem_principalUnits_of_unramifiedValuation + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) {a : 𝒪[K]ˣ} + (haL : integerUnitsMapOfValuationExtension K L a ∈ principalUnits L n) : + a ∈ principalUnits K n := by + let xK : 𝒪[K] := (a : 𝒪[K]) - 1 + let πK : 𝒪[K] := chosenIntegerRingUniformizer K + have hxLpow : integerRingMapOfValuationExtension K L xK ∈ (𝓂[L] ^ n : Ideal 𝒪[L]) := by + have haLpow := + (mem_principalUnits_iff L (integerUnitsMapOfValuationExtension K L a) n).1 haL + simpa [xK, integerRingMapOfValuationExtension, sub_eq_add_neg] using haLpow + have hπL : Irreducible (integerRingMapOfValuationExtension K L πK) := by + simpa [πK] using integerRingMap_uniformizer_irreducible_of_unramifiedValuation K L + have hvalL : + ValuativeRel.valuation L + ((integerRingMapOfValuationExtension K L xK : 𝒪[L]) : L) ≤ + ValuativeRel.valuation L + ((integerRingMapOfValuationExtension K L πK : 𝒪[L]) : L) ^ n := by + have hset := Irreducible.maximalIdeal_pow_eq_setOfPred_le_v_coe_pow + (ValuativeRel.valuation L) hπL n + exact (show integerRingMapOfValuationExtension K L xK ∈ + ({y : 𝒪[L] | ValuativeRel.valuation L (y : L) ≤ + ValuativeRel.valuation L + ((integerRingMapOfValuationExtension K L πK : 𝒪[L]) : L) ^ n}) from by + rw [← hset] + exact hxLpow) + have hvalL' : + ValuativeRel.valuation L (algebraMap K L (xK : K)) ≤ + ValuativeRel.valuation L (algebraMap K L (((πK ^ n : 𝒪[K]) : K))) := by + simpa [integerRingMapOfValuationExtension, map_pow] using hvalL + have hvalKpow : + ValuativeRel.valuation K (xK : K) ≤ + ValuativeRel.valuation K (((πK ^ n : 𝒪[K]) : K)) := + (Valuation.HasExtension.val_map_le_iff + (ValuativeRel.valuation K) (ValuativeRel.valuation L) + (xK : K) (((πK ^ n : 𝒪[K]) : K))).1 hvalL' + rw [mem_principalUnits_iff] + change xK ∈ (𝓂[K] ^ n : Ideal 𝒪[K]) + have hsetK := Irreducible.maximalIdeal_pow_eq_setOfPred_le_v_coe_pow + (ValuativeRel.valuation K) (chosenIntegerRingUniformizer_irreducible K) n + have hvalK : xK ∈ + ({y : 𝒪[K] | ValuativeRel.valuation K (y : K) ≤ + ValuativeRel.valuation K ((πK : 𝒪[K]) : K) ^ n}) := by + simpa [πK, map_pow] using hvalKpow + change xK ∈ ((𝓂[K] ^ n : Ideal 𝒪[K]) : Set 𝒪[K]) + rw [hsetK] + exact hvalK + + +/-- The Galois group of a finite Galois extension has cardinality equal to the field-extension +degree. -/ +theorem galoisGroup_card_eq_finrank (K L : Type u) + [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] [IsGalois K L] : + Nat.card Gal(L/K) = Module.finrank K L := + IsGalois.card_aut_eq_finrank (F := K) (E := L) + +/-- For an unramified extension, the residue-field automorphism group has cardinality equal to the +field-extension degree. -/ +theorem residueAlgEquiv_card_eq_finrank_of_unramifiedValuation + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + Nat.card (𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L]) = Module.finrank K L := by + rw [residueAlgEquiv_card_eq_finrank K L, + LocalFieldTheory.IsNonarchimedeanLocalField.unramifiedValuation_residue_finrank_eq_finrank K L] + +/-- For an unramified Galois extension, the residue automorphism group and field Galois group have +equal cardinality. -/ +theorem residueAlgEquiv_card_eq_galoisGroup_card_of_unramifiedValuation + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] [FiniteDimensional K L] + [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + Nat.card (𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L]) = Nat.card Gal(L/K) := by + rw [residueAlgEquiv_card_eq_finrank_of_unramifiedValuation K L, + galoisGroup_card_eq_finrank K L] + +/-- In an actual unramified valuation extension, the integral-closure inertia +subgroup has cardinality one. -/ +theorem galoisGroupMaximalIdealInertiaOfIsIntegralClosure_card_eq_one_of_unramifiedValuation + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] [FiniteDimensional K L] + [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + Nat.card (galoisGroupMaximalIdealInertiaOfIsIntegralClosure K L) = 1 := + galoisGroupMaximalIdealInertiaOfIsIntegralClosure_card_eq_one_of_ramificationIdx_eq_one K L + (LocalFieldTheory.IsNonarchimedeanLocalField.unramifiedValuation_ramificationIdx_eq_one K L) + +/-- In an actual unramified valuation extension, the integral-closure residue +action has kernel of cardinality one. -/ +theorem galoisGroupResidueAlgEquivHomOfIsIntegralClosure_ker_card_eq_one_of_unramifiedValuation + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] [FiniteDimensional K L] + [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + Nat.card (galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L).ker = 1 := + galoisGroupResidueAlgEquivHomOfIsIntegralClosure_ker_card_eq_one_of_ramificationIdx_eq_one K L + (LocalFieldTheory.IsNonarchimedeanLocalField.unramifiedValuation_ramificationIdx_eq_one K L) + +/-- In an actual unramified valuation extension, the integral-closure residue +action is injective. -/ +theorem galoisGroupResidueAlgEquivHomOfIsIntegralClosure_injective_of_unramifiedValuation + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] [FiniteDimensional K L] + [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + Function.Injective (galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L) := by + refine (MonoidHom.ker_eq_bot_iff _).mp ?_ + exact ((galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L).ker).eq_bot_of_card_eq + (galoisGroupResidueAlgEquivHomOfIsIntegralClosure_ker_card_eq_one_of_unramifiedValuation + K L) + +/-- In an actual unramified valuation extension, the integral-closure residue +action is surjective onto the residue-field automorphism group. -/ +theorem galoisGroupResidueAlgEquivHomOfIsIntegralClosure_surjective_of_unramifiedValuation + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] [FiniteDimensional K L] + [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + Function.Surjective (galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L) := by + exact ((Nat.bijective_iff_injective_and_card + (galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L)).2 + ⟨galoisGroupResidueAlgEquivHomOfIsIntegralClosure_injective_of_unramifiedValuation + K L, + (residueAlgEquiv_card_eq_galoisGroup_card_of_unramifiedValuation K L).symm⟩).2 + +/-- In an actual unramified valuation extension, the integral-closure residue +action is bijective. -/ +theorem galoisGroupResidueAlgEquivHomOfIsIntegralClosure_bijective_of_unramifiedValuation + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] [FiniteDimensional K L] + [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + Function.Bijective (galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L) := + ⟨galoisGroupResidueAlgEquivHomOfIsIntegralClosure_injective_of_unramifiedValuation K L, + galoisGroupResidueAlgEquivHomOfIsIntegralClosure_surjective_of_unramifiedValuation K L⟩ + +/-- The actual integral-closure residue action as an isomorphism in the +unramified valuation case. -/ +noncomputable def galoisGroupEquivResidueAlgEquivOfUnramifiedValuationOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] [FiniteDimensional K L] + [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + Gal(L/K) ≃* (𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L]) := + MulEquiv.ofBijective (galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L) + (galoisGroupResidueAlgEquivHomOfIsIntegralClosure_bijective_of_unramifiedValuation K L) + +/-- The unramified Galois-to-residue equivalence sends an automorphism to its induced action on +residue classes. -/ +@[simp] +theorem galoisGroupEquivResidueAlgEquivOfUnramifiedValuationOfIsIntegralClosure_apply + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] [FiniteDimensional K L] + [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (σ : Gal(L/K)) : + galoisGroupEquivResidueAlgEquivOfUnramifiedValuationOfIsIntegralClosure K L σ = + galoisGroupResidueAlgEquivOfIsIntegralClosure K L σ := + rfl + +/-- In the unramified valuation case, products over the actual +integral-closure real Galois residue action can be reindexed as products over +the full residue-field automorphism group. -/ +theorem galoisGroupResidueAlgEquivOfIsIntegralClosure_prod_eq_prod_algEquiv_of_unramifiedValuation + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] [FiniteDimensional K L] + [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (u : 𝓀[L]ˣ) : + Finset.univ.prod (fun σ : Gal(L/K) => + Units.mapEquiv + (galoisGroupResidueAlgEquivOfIsIntegralClosure K L σ).toMulEquiv u) = + Finset.univ.prod (fun τ : 𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L] => + Units.mapEquiv τ.toMulEquiv u) := + Fintype.prod_equiv + (galoisGroupEquivResidueAlgEquivOfUnramifiedValuationOfIsIntegralClosure K L).toEquiv + (fun σ : Gal(L/K) => + Units.mapEquiv + (galoisGroupResidueAlgEquivOfIsIntegralClosure K L σ).toMulEquiv u) + (fun τ : 𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L] => Units.mapEquiv τ.toMulEquiv u) + (by intro σ; rfl) + +/-- In the unramified valuation case, sums over the actual integral-closure +real Galois residue action can be reindexed as sums over the full residue-field +automorphism group. -/ +theorem galoisGroupResidueAlgEquivOfIsIntegralClosure_sum_eq_sum_algEquiv_of_unramifiedValuation + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] [FiniteDimensional K L] + [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (x : 𝓀[L]) : + Finset.univ.sum (fun σ : Gal(L/K) => + galoisGroupResidueAlgEquivOfIsIntegralClosure K L σ x) = + Finset.univ.sum (fun τ : 𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L] => τ x) := + Fintype.sum_equiv + (galoisGroupEquivResidueAlgEquivOfUnramifiedValuationOfIsIntegralClosure K L).toEquiv + (fun σ : Gal(L/K) => galoisGroupResidueAlgEquivOfIsIntegralClosure K L σ x) + (fun τ : 𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L] => τ x) + (by intro σ; rfl) + +/-- In the unramified valuation case, reducing the actual integral-closure +Galois sum gives the base extension of the finite residue-field trace. -/ +theorem galoisGroup_sum_residue_eq_algebraMap_trace_of_unramifiedValuation_of_isIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] [FiniteDimensional K L] + [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (a : 𝒪[L]) : + IsLocalRing.residue 𝒪[L] + (Finset.univ.sum fun σ : Gal(L/K) => + galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ a) = + algebraMap 𝓀[K] 𝓀[L] + (Algebra.trace 𝓀[K] 𝓀[L] (IsLocalRing.residue 𝒪[L] a)) := by + rw [galoisGroup_sum_residue_eq_residueAlgEquiv_sum_of_isIntegralClosure K L a] + rw [galoisGroupResidueAlgEquivOfIsIntegralClosure_sum_eq_sum_algEquiv_of_unramifiedValuation + K L] + exact (trace_eq_sum_automorphisms + (K := 𝓀[K]) (L := 𝓀[L]) (IsLocalRing.residue 𝒪[L] a)).symm + +/-- Actual integral-closure version of the base-uniformizer coefficient +calculation for the real Galois sum. -/ +theorem galoisGroup_sum_mul_base_uniformizer_pow_eq_coeff_sum_of_isIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) (r : 𝒪[L]) : + let πL := integerRingMapOfValuationExtension K L (chosenIntegerRingUniformizer K) + Finset.univ.sum (fun σ : Gal(L/K) => + galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ (r * πL ^ n)) = + (Finset.univ.sum fun σ : Gal(L/K) => + galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ r) * πL ^ n := by + intro πL + rw [Finset.sum_mul] + refine Finset.sum_congr rfl ?_ + intro σ _ + rw [map_mul, map_pow] + change galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ r * + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ + (integerRingMapOfValuationExtension K L (chosenIntegerRingUniformizer K))) ^ n = + galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ r * πL ^ n + rw [galoisGroupIntegerRingEquivOfIsIntegralClosure_integerRingMap] + +/-- On the associated graded piece defined by the base uniformizer, the +coefficient of the Galois sum is the finite residue-field trace. -/ +theorem galoisSum_uniformizerGraded_eq_residueTrace + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] [Algebra K L] [FiniteDimensional K L] + [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (r : 𝒪[L]) : + let πL := integerRingMapOfValuationExtension K L (chosenIntegerRingUniformizer K) + let hπL := integerRingMap_uniformizer_irreducible_of_unramifiedValuation K L + maximalIdealPowSuccQuotMulUniformizerPowMap L πL hπL n + (Finset.univ.sum fun σ : Gal(L/K) => + galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ r) = + residueAddEquivMaximalIdealPowSuccQuotOfIrreducible L πL hπL n + (algebraMap 𝓀[K] 𝓀[L] + (Algebra.trace 𝓀[K] 𝓀[L] (IsLocalRing.residue 𝒪[L] r))) := by + intro πL hπL + rw [← residueAddEquivMaximalIdealPowSuccQuotOfIrreducible_residue L πL hπL n + (Finset.univ.sum fun σ : Gal(L/K) => + galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ r)] + rw [galoisGroup_sum_residue_eq_algebraMap_trace_of_unramifiedValuation_of_isIntegralClosure + K L r] + +end +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean new file mode 100644 index 0000000000..42fbee4842 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean @@ -0,0 +1,781 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.IsGaloisGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Norm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitActions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Valuation +/-! +# Galois actions on valuation rings + +Restricts Galois automorphisms to valuation rings and transports their action +to ideals, ideal-power quotients, principal units, and successive quotients. +-/ + +@[expose] public section +namespace LocalFieldTheory + +noncomputable +section + +universe u + +open scoped ValuativeRel + +/-- A real Galois automorphism preserves the valuation integer ring when that +ring is the integral closure of the base valuation integer ring. + +This is the source-producing replacement for proving integer-ring preservation +from a valuation-invariance certificate: integrality is transported by the +`K`-algebra automorphism, and integral-closure membership brings the element +back to `𝒪[L]`. -/ +theorem galoisGroup_mem_integerRing_of_isIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (σ : Gal(L/K)) (x : 𝒪[L]) : + σ (x : L) ∈ 𝒪[L] := by + have hx : IsIntegral 𝒪[K] ((x : 𝒪[L]) : L) := + (IsIntegralClosure.isIntegral_iff (A := 𝒪[L]) (R := 𝒪[K]) (B := L)).2 + ⟨x, rfl⟩ + have hσ : IsIntegral 𝒪[K] (σ ((x : 𝒪[L]) : L)) := + IsIntegral.map σ.toAlgHom hx + rcases (IsIntegralClosure.isIntegral_iff (A := 𝒪[L]) (R := 𝒪[K]) (B := L)).1 hσ + with ⟨y, hy⟩ + exact hy ▸ y.2 + +/-- Restrict a real Galois automorphism to the valuation integer ring using the +actual integral-closure property of valuation integer rings. -/ +def galoisGroupIntegerRingEquivOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (σ : Gal(L/K)) : + 𝒪[L] ≃+* 𝒪[L] where + toFun x := + ⟨σ (x : L), galoisGroup_mem_integerRing_of_isIntegralClosure K L σ x⟩ + invFun x := + ⟨σ.symm (x : L), galoisGroup_mem_integerRing_of_isIntegralClosure K L σ.symm x⟩ + left_inv := by + intro x + ext + simp + right_inv := by + intro x + ext + simp + map_mul' := by + intro x y + ext + simp + map_add' := by + intro x y + ext + simp + +/-- Restriction sends a field automorphism to the corresponding automorphism of the integral-closure +valuation ring. -/ +@[simp] +theorem galoisGroupIntegerRingEquivOfIsIntegralClosure_apply + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (σ : Gal(L/K)) (x : 𝒪[L]) : + ((galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ x : 𝒪[L]) : L) = + σ (x : L) := + rfl + +/-- The inverse restriction equivalence extends an integer-ring automorphism to the ambient +field. -/ +@[simp] +theorem galoisGroupIntegerRingEquivOfIsIntegralClosure_symm_apply + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (σ : Gal(L/K)) (x : 𝒪[L]) : + (((galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ).symm x : 𝒪[L]) : L) = + σ.symm (x : L) := + rfl + +/-- Real Galois automorphisms act on `𝒪[L]` through the actual integral-closure +restriction. -/ +def galoisGroupIntegerRingEquivHomOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + Gal(L/K) →* (𝒪[L] ≃+* 𝒪[L]) where + toFun := galoisGroupIntegerRingEquivOfIsIntegralClosure K L + map_one' := by + ext x + rfl + map_mul' := by + intro σ τ + ext x + rfl + +/-- The semiring action on the valuation integer ring induced by the actual +integral-closure restriction of `Gal(L / K)`. -/ +@[reducible] +def galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + MulSemiringAction (Gal(L/K)) 𝒪[L] := + MulSemiringAction.compHom 𝒪[L] (galoisGroupIntegerRingEquivHomOfIsIntegralClosure K L) + +/-- Restriction of a Galois automorphism commutes with the inclusion of the integer ring into the +field. -/ +theorem galoisGroupIntegerRingEquivOfIsIntegralClosure_integerRingMap + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (σ : Gal(L/K)) (x : 𝒪[K]) : + galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ + (integerRingMapOfValuationExtension K L x) = + integerRingMapOfValuationExtension K L x := by + ext + change σ (algebraMap K L (x : K)) = algebraMap K L (x : K) + exact σ.commutes (x : K) + +/-- The actual `Gal(L / K)` action on `𝒪[L]` fixes the image of `𝒪[K]`. -/ +theorem galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure_integerRingMap + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (σ : Gal(L/K)) (x : 𝒪[K]) : + letI := galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L + σ • integerRingMapOfValuationExtension K L x = + integerRingMapOfValuationExtension K L x := by + change galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ + (integerRingMapOfValuationExtension K L x) = + integerRingMapOfValuationExtension K L x + exact galoisGroupIntegerRingEquivOfIsIntegralClosure_integerRingMap K L σ x + +/-- The actual integral-closure action commutes with the canonical +`𝒪[K]`-scalar action on `𝒪[L]`. -/ +theorem galoisGroupIntegerRingSMulCommClassOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + letI := galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L + SMulCommClass (Gal(L/K)) 𝒪[K] 𝒪[L] := by + let := galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L + refine ⟨?_⟩ + intro σ x y + rw [Algebra.smul_def, Algebra.smul_def] + change galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ + (algebraMap 𝒪[K] 𝒪[L] x * y) = + algebraMap 𝒪[K] 𝒪[L] x * + galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ y + rw [map_mul] + have hx : galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ + (algebraMap 𝒪[K] 𝒪[L] x) = algebraMap 𝒪[K] 𝒪[L] x := by + simpa [integerRingMapOfValuationExtension] using + galoisGroupIntegerRingEquivOfIsIntegralClosure_integerRingMap K L σ x + rw [hx] + +/-- The actual integral-closure action is compatible with the field-level +`Gal(L / K)` action after coercion to `L`. -/ +theorem galoisGroupIntegerRingFieldSMulDistribClassOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + letI := galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L + SMulDistribClass (Gal(L/K)) 𝒪[L] L := by + let := galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L + refine ⟨?_⟩ + intro σ r s + change σ (((r : 𝒪[L]) : L) * s) = + ((galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ r : 𝒪[L]) : L) * σ s + rw [map_mul] + rw [galoisGroupIntegerRingEquivOfIsIntegralClosure_apply] + +/-- The actual integral-closure action on valuation integer rings is a mathlib +Galois group. This is the source-producing version of the ring-level Galois +input needed for inertia/cardinality arguments. -/ +theorem galoisGroupIntegerRing_isGaloisGroup_of_isIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + letI := galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L + IsGaloisGroup (Gal(L/K)) 𝒪[K] 𝒪[L] := by + let := galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L + let := galoisGroupIntegerRingFieldSMulDistribClassOfIsIntegralClosure K L + let : Algebra.IsIntegral 𝒪[K] 𝒪[L] := + IsIntegralClosure.isIntegral_algebra 𝒪[K] L + exact IsGaloisGroup.of_isFractionRing (Gal(L/K)) 𝒪[K] 𝒪[L] K L + +/-- The ideal action induced by the actual integral-closure restriction. -/ +@[reducible] +def galoisGroupIntegerRingIdealDistribMulActionOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + DistribMulAction (Gal(L/K)) (Ideal 𝒪[L]) := by + letI := galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L + exact Ideal.pointwiseDistribMulAction + +/-- The multiplicative ideal action induced by the actual integral-closure +restriction. -/ +@[reducible] +def galoisGroupIntegerRingIdealMulActionOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + MulAction (Gal(L/K)) (Ideal 𝒪[L]) := by + exact (galoisGroupIntegerRingIdealDistribMulActionOfIsIntegralClosure K L).toMulAction + +/-- The Galois action on an integral-closure valuation ring preserves its maximal ideal. -/ +theorem galoisGroupIntegerRingAction_map_maximalIdeal_of_isIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (σ : Gal(L/K)) : + Ideal.map (@MulSemiringAction.toRingHom (Gal(L/K)) _ 𝒪[L] _ + (galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L) σ) + (𝓂[L] : Ideal 𝒪[L]) = + (𝓂[L] : Ideal 𝒪[L]) := by + change Ideal.map + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ).toRingHom + (𝓂[L] : Ideal 𝒪[L]) = + (𝓂[L] : Ideal 𝒪[L]) + exact integerRingEquiv_map_maximalIdeal L + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) + +/-- Every Galois automorphism belongs to the stabilizer of the maximal ideal of the integral-closure +valuation ring. -/ +theorem galoisGroupIntegerRingAction_mem_maximalIdeal_stabilizer_of_isIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (σ : Gal(L/K)) : + σ ∈ @MulAction.stabilizer (Gal(L/K)) (Ideal 𝒪[L]) _ + (galoisGroupIntegerRingIdealMulActionOfIsIntegralClosure K L) + (𝓂[L] : Ideal 𝒪[L]) := by + rw [@MulAction.mem_stabilizer_iff (Gal(L/K)) (Ideal 𝒪[L]) _ + (galoisGroupIntegerRingIdealMulActionOfIsIntegralClosure K L)] + change Ideal.map (@MulSemiringAction.toRingHom (Gal(L/K)) _ 𝒪[L] _ + (galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L) σ) + (𝓂[L] : Ideal 𝒪[L]) = + (𝓂[L] : Ideal 𝒪[L]) + exact galoisGroupIntegerRingAction_map_maximalIdeal_of_isIntegralClosure K L σ + +/-- Real Galois automorphisms, viewed inside the maximal-ideal stabilizer, using +the actual integral-closure restriction. -/ +def galoisGroupMaximalIdealStabilizerHomOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + Gal(L/K) →* @MulAction.stabilizer (Gal(L/K)) (Ideal 𝒪[L]) _ + (galoisGroupIntegerRingIdealMulActionOfIsIntegralClosure K L) + (𝓂[L] : Ideal 𝒪[L]) where + toFun σ := + ⟨σ, galoisGroupIntegerRingAction_mem_maximalIdeal_stabilizer_of_isIntegralClosure K L σ⟩ + map_one' := by + ext + rfl + map_mul' σ τ := by + ext + rfl + +/-- Actual integral-closure real Galois action on the `n`-th principal-unit +group. -/ +def galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) (σ : Gal(L/K)) : + principalUnits L n ≃* principalUnits L n := + principalUnitsMapEquivOfIntegerRingEquiv L n + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) + +/-- The induced equivalence on principal units applies the restricted Galois automorphism to the +underlying unit. -/ +theorem galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure_apply + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) (σ : Gal(L/K)) (u : principalUnits L n) : + ((galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure K L n σ u : + principalUnits L n) : 𝒪[L]ˣ) = + Units.mapEquiv + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ).toMulEquiv u.1 := + rfl + +/-- Integral-closure Galois action on principal units as a group +homomorphism. -/ +def galoisGroupPrincipalUnitsMapEquivHomOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) : + Gal(L/K) →* (principalUnits L n ≃* principalUnits L n) where + toFun := galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure K L n + map_one' := by + ext u + rfl + map_mul' := by + intro σ τ + ext u + rfl + +/-- Integral-closure Galois action on `𝓂_L^n/𝓂_L^(n+1)`. -/ +def galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) (σ : Gal(L/K)) : + MaximalIdealPowSuccQuot L n ≃+ MaximalIdealPowSuccQuot L n := + maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv L n + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) + +/-- The Galois equivalence on a successive maximal-ideal quotient maps the class of a representative +to the class of its conjugate. -/ +theorem galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure_mk + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) (σ : Gal(L/K)) + (a : ((𝓂[L] ^ n : Ideal 𝒪[L]) : Type u)) : + galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure K L n σ + (maximalIdealPowSuccQuotMk L n a) = + maximalIdealPowSuccQuotMk L n + (maximalIdealPowMapEquivOfIntegerRingEquiv L n + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) a) := + maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv_mk L n + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) a + +/-- Integral-closure Galois action on maximal-ideal graded pieces. -/ +def galoisGroupMaximalIdealPowSuccQuotMapEquivHomOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) : + Gal(L/K) →* + Multiplicative + (AddAut (MaximalIdealPowSuccQuot L n)) where + toFun σ := Multiplicative.ofAdd + (galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure K L n σ) + map_one' := by + ext x + refine MaximalIdealPowSuccQuot.inductionOn n + (motive := fun x => + galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure + K L n 1 x = x) + x ?_ + intro a + rw [galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure_mk] + rfl + map_mul' := by + intro σ τ + ext x + refine MaximalIdealPowSuccQuot.inductionOn n + (motive := fun x => + galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure + K L n (σ * τ) x = + galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure + K L n σ + (galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure + K L n τ x)) + x ?_ + intro a + rw [galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure_mk] + rw [galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure_mk, + galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure_mk] + rfl + +/-- Integral-closure Galois action on maximal-ideal graded pieces, +packaged as an additive action. -/ +@[reducible] +def galoisGroupMaximalIdealPowSuccQuotDistribMulActionOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) : + DistribMulAction (Gal(L/K)) (MaximalIdealPowSuccQuot L n) where + smul σ x := galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure K L n σ x + one_smul := by + intro x + change galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure K L n 1 x = x + have h := congrArg (fun e : + Multiplicative (AddAut (MaximalIdealPowSuccQuot L n)) => + Multiplicative.toAdd e x) + (map_one (galoisGroupMaximalIdealPowSuccQuotMapEquivHomOfIsIntegralClosure K L n)) + exact h + mul_smul := by + intro σ τ x + change galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure K L n (σ * τ) x = + galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure K L n σ + (galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure K L n τ x) + have h := congrArg (fun e : + Multiplicative (AddAut (MaximalIdealPowSuccQuot L n)) => + Multiplicative.toAdd e x) + (map_mul (galoisGroupMaximalIdealPowSuccQuotMapEquivHomOfIsIntegralClosure K L n) σ τ) + exact h + smul_zero := by + intro σ + exact map_zero (galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure K L n σ) + smul_add := by + intro σ x y + exact map_add (galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure K L n σ) x y + +/-- The distributive Galois action on a successive maximal-ideal quotient is computed by conjugating +representatives. -/ +theorem galoisGroupMaximalIdealPowSuccQuotDistribMulActionOfIsIntegralClosure_smul + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) (σ : Gal(L/K)) (x : MaximalIdealPowSuccQuot L n) : + letI := galoisGroupMaximalIdealPowSuccQuotDistribMulActionOfIsIntegralClosure K L n + σ • x = galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure K L n σ x := + rfl + +/-- Actual integral-closure real Galois action on the multiplicative form of +maximal-ideal graded pieces. -/ +@[reducible] +def galoisGroupMaximalIdealPowSuccQuotMultiplicativeMulDistribMulActionOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) : + MulDistribMulAction (Gal(L/K)) (Multiplicative (MaximalIdealPowSuccQuot L n)) where + smul σ x := + maximalIdealPowSuccQuotMultiplicativeMapEquivOfIntegerRingEquiv L n + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) x + one_smul := by + intro x + change maximalIdealPowSuccQuotMultiplicativeMapEquivOfIntegerRingEquiv L n + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L 1) x = x + have h := congrArg (fun e : + Multiplicative (AddAut (MaximalIdealPowSuccQuot L n)) => + Multiplicative.toAdd e (Multiplicative.toAdd x)) + (map_one (galoisGroupMaximalIdealPowSuccQuotMapEquivHomOfIsIntegralClosure K L n)) + exact congrArg Multiplicative.ofAdd h + mul_smul := by + intro σ τ x + change maximalIdealPowSuccQuotMultiplicativeMapEquivOfIntegerRingEquiv L n + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L (σ * τ)) x = + maximalIdealPowSuccQuotMultiplicativeMapEquivOfIntegerRingEquiv L n + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) + (maximalIdealPowSuccQuotMultiplicativeMapEquivOfIntegerRingEquiv L n + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L τ) x) + have h := congrArg (fun e : + Multiplicative (AddAut (MaximalIdealPowSuccQuot L n)) => + Multiplicative.toAdd e (Multiplicative.toAdd x)) + (map_mul (galoisGroupMaximalIdealPowSuccQuotMapEquivHomOfIsIntegralClosure K L n) σ τ) + exact congrArg Multiplicative.ofAdd h + smul_mul := by + intro σ x y + exact map_mul + (maximalIdealPowSuccQuotMultiplicativeMapEquivOfIntegerRingEquiv L n + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ)) x y + smul_one := by + intro σ + exact map_one + (maximalIdealPowSuccQuotMultiplicativeMapEquivOfIntegerRingEquiv L n + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ)) + +/-- After multiplicative re-encoding, the Galois action on a maximal-ideal quotient is still induced +by conjugation. -/ +theorem galoisGroupMaximalIdealPowSuccQuotMultiplicativeMulDistribMulActionOfIsIntegralClosure_smul + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) (σ : Gal(L/K)) + (x : Multiplicative (MaximalIdealPowSuccQuot L n)) : + letI := galoisGroupMaximalIdealPowSuccQuotMultiplicativeMulDistribMulActionOfIsIntegralClosure + K L n + σ • x = maximalIdealPowSuccQuotMultiplicativeMapEquivOfIntegerRingEquiv L n + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) x := + rfl + +/-- Actual integral-closure action on `U^n/U^(n+1)`. -/ +def galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) (σ : Gal(L/K)) : + PrincipalUnitsSuccQuot L n ≃* PrincipalUnitsSuccQuot L n := + principalUnitsSuccQuotMapEquivOfIntegerRingEquiv L n + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) + +/-- The Galois equivalence on a successive principal-unit quotient maps each class to the class of +its conjugate. -/ +theorem galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure_apply + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) (σ : Gal(L/K)) (u : principalUnits L n) : + galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ + (QuotientGroup.mk u) = + QuotientGroup.mk + (galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure K L n σ u) := + rfl + +/-- Actual integral-closure real Galois action on successive principal-unit +quotients as a group homomorphism. -/ +def galoisGroupPrincipalUnitsSuccQuotMapEquivHomOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) : + Gal(L/K) →* (PrincipalUnitsSuccQuot L n ≃* PrincipalUnitsSuccQuot L n) where + toFun := galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n + map_one' := by + ext x + refine QuotientGroup.induction_on x ?_ + intro u + rfl + map_mul' := by + intro σ τ + ext x + refine QuotientGroup.induction_on x ?_ + intro u + rfl + +/-- Actual integral-closure real Galois action on successive principal-unit +quotients, packaged as the multiplicative action required by low-degree +Herbrand quotients. -/ +@[reducible] +def galoisGroupPrincipalUnitsSuccQuotMulDistribMulActionOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) : + MulDistribMulAction (Gal(L/K)) (PrincipalUnitsSuccQuot L n) where + smul σ x := galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ x + one_smul := by + intro x + change galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n 1 x = x + have h := congrArg (fun e : PrincipalUnitsSuccQuot L n ≃* + PrincipalUnitsSuccQuot L n => e x) + (map_one (galoisGroupPrincipalUnitsSuccQuotMapEquivHomOfIsIntegralClosure K L n)) + exact h + mul_smul := by + intro σ τ x + change galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n (σ * τ) x = + galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ + (galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n τ x) + have h := congrArg (fun e : PrincipalUnitsSuccQuot L n ≃* + PrincipalUnitsSuccQuot L n => e x) + (map_mul (galoisGroupPrincipalUnitsSuccQuotMapEquivHomOfIsIntegralClosure K L n) σ τ) + exact h + smul_mul := by + intro σ x y + exact map_mul (galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ) x y + smul_one := by + intro σ + exact map_one (galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ) + +/-- The packaged integral-closure action is the quotient map equivalence action +pointwise. -/ +theorem galoisGroupPrincipalUnitsSuccQuotMulDistribMulActionOfIsIntegralClosure_smul + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) (σ : Gal(L/K)) (x : PrincipalUnitsSuccQuot L n) : + letI := galoisGroupPrincipalUnitsSuccQuotMulDistribMulActionOfIsIntegralClosure K L n + σ • x = galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ x := + rfl + +/-- Actual integral-closure real Galois action on the additive form of +successive principal-unit quotients. -/ +@[reducible] +def galoisGroupPrincipalUnitsSuccQuotAddDistribMulActionOfIsIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) : + DistribMulAction (Gal(L/K)) (Additive (PrincipalUnitsSuccQuot L n)) where + smul σ x := + Additive.ofMul + (galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ + (Additive.toMul x)) + one_smul := by + intro x + change Additive.ofMul + (galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n 1 + (Additive.toMul x)) = Additive.ofMul (Additive.toMul x) + exact congrArg Additive.ofMul + (congrArg (fun e : PrincipalUnitsSuccQuot L n ≃* + PrincipalUnitsSuccQuot L n => e (Additive.toMul x)) + (map_one (galoisGroupPrincipalUnitsSuccQuotMapEquivHomOfIsIntegralClosure K L n))) + mul_smul := by + intro σ τ x + change Additive.ofMul + (galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n (σ * τ) + (Additive.toMul x)) = + Additive.ofMul + (galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ + (galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n τ + (Additive.toMul x))) + exact congrArg Additive.ofMul + (congrArg (fun e : PrincipalUnitsSuccQuot L n ≃* + PrincipalUnitsSuccQuot L n => e (Additive.toMul x)) + (map_mul (galoisGroupPrincipalUnitsSuccQuotMapEquivHomOfIsIntegralClosure K L n) σ τ)) + smul_zero := by + intro σ + change Additive.ofMul + (galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ 1) = + Additive.ofMul (1 : PrincipalUnitsSuccQuot L n) + exact congrArg Additive.ofMul + (map_one (galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ)) + smul_add := by + intro σ x y + change Additive.ofMul + (galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ + (Additive.toMul (x + y))) = + Additive.ofMul + (galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ + (Additive.toMul x) * + galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ + (Additive.toMul y)) + rw [show Additive.toMul (x + y) = Additive.toMul x * Additive.toMul y from rfl] + rw [map_mul] + +/-- The additive Galois action on a successive principal-unit quotient is induced by conjugation of +representatives. -/ +theorem galoisGroupPrincipalUnitsSuccQuotAddDistribMulActionOfIsIntegralClosure_smul + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) (σ : Gal(L/K)) (x : Additive (PrincipalUnitsSuccQuot L n)) : + letI := galoisGroupPrincipalUnitsSuccQuotAddDistribMulActionOfIsIntegralClosure K L n + σ • x = Additive.ofMul + (galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ + (Additive.toMul x)) := + rfl + +/-- The comparison from a maximal-ideal quotient to a principal-unit quotient intertwines the Galois +actions. -/ +theorem principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_galoisGroup_of_isIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) (hn : 1 ≤ n) (σ : Gal(L/K)) + (x : MaximalIdealPowSuccQuot L n) : + galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ + (principalUnitsSuccQuotOfMaximalIdealPowSuccQuot L n hn x) = + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot L n hn + (galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure K L n σ x) := + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_integerRingEquiv L n hn + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) x + +/-- The additive comparison between maximal-ideal and principal-unit quotients is Galois +equivariant. -/ +theorem principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd_galoisGroup_of_isIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) (hn : 1 ≤ n) (σ : Gal(L/K)) + (x : MaximalIdealPowSuccQuot L n) : + Additive.ofMul + (galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ + (principalUnitsSuccQuotOfMaximalIdealPowSuccQuot L n hn x)) = + principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd L n hn + (galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure K L n σ x) := by + rw [principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_galoisGroup_of_isIntegralClosure] + rfl + +/-- Real Galois equivariance of the additive associated-graded comparison, +with both sides using the packaged additive actions. -/ +theorem maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot_galoisGroup_of_isIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) (hn : 1 ≤ n) (σ : Gal(L/K)) + (x : MaximalIdealPowSuccQuot L n) : + letI := galoisGroupMaximalIdealPowSuccQuotDistribMulActionOfIsIntegralClosure K L n + letI := galoisGroupPrincipalUnitsSuccQuotAddDistribMulActionOfIsIntegralClosure K L n + σ • (maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot L n hn x) = + maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot L n hn (σ • x) := by + change principalUnitsSuccQuotAddEquivOfIntegerRingEquiv L n + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) + (maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot L n hn x) = + maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot L n hn + (galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure K L n σ x) + exact maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot_integerRingEquiv L n hn + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) x + +/-- Real Galois equivariance of the multiplicative associated-graded +comparison, with both sides using the multiplicative packaged actions. -/ +theorem maximalIdealPowSuccQuotMulEquivPrincipalUnitsSuccQuot_galoisGroup_of_isIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) (hn : 1 ≤ n) (σ : Gal(L/K)) + (x : Multiplicative (MaximalIdealPowSuccQuot L n)) : + letI := + galoisGroupMaximalIdealPowSuccQuotMultiplicativeMulDistribMulActionOfIsIntegralClosure + K L n + letI := galoisGroupPrincipalUnitsSuccQuotMulDistribMulActionOfIsIntegralClosure K L n + σ • (maximalIdealPowSuccQuotMulEquivPrincipalUnitsSuccQuot L n hn x) = + maximalIdealPowSuccQuotMulEquivPrincipalUnitsSuccQuot L n hn (σ • x) := by + change principalUnitsSuccQuotMapEquivOfIntegerRingEquiv L n + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) + (maximalIdealPowSuccQuotMulEquivPrincipalUnitsSuccQuot L n hn x) = + maximalIdealPowSuccQuotMulEquivPrincipalUnitsSuccQuot L n hn + (maximalIdealPowSuccQuotMultiplicativeMapEquivOfIntegerRingEquiv L n + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) x) + exact maximalIdealPowSuccQuotMulEquivPrincipalUnitsSuccQuot_integerRingEquiv L n hn + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) x + +/-- Actual integral-closure first-order expansion of the real Galois product +attached to a principal-unit representative. -/ +theorem galoisGroup_prod_one_add_sub_one_sub_sum_mem_maximalIdeal_pow_succ_of_isIntegralClosure + (K L : Type u) [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (n : Nat) (hn : 1 ≤ n) (a : (𝓂[L] ^ n : Ideal 𝒪[L])) : + (Finset.univ.prod fun σ : Gal(L/K) => + 1 + galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ (a : 𝒪[L])) - 1 - + (Finset.univ.sum fun σ : Gal(L/K) => + galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ (a : 𝒪[L])) ∈ + (𝓂[L] ^ (n + 1) : Ideal 𝒪[L]) := by + classical + refine finset_prod_one_add_sub_one_sub_sum_mem_maximalIdeal_pow_succ L + (Finset.univ : Finset (Gal(L/K))) n hn + (fun σ => galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ (a : 𝒪[L])) ?_ + intro σ _ + exact (integerRingEquiv_mem_maximalIdeal_pow L + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) n (a : 𝒪[L])).2 a.2 + +end +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/IdealQuotients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/IdealQuotients.lean new file mode 100644 index 0000000000..6ea614b6ef --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/IdealQuotients.lean @@ -0,0 +1,917 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients + +/-! # Ideal Quotients -/ + +@[expose] public section +namespace LocalFieldTheory + +noncomputable +section + +universe u + +open scoped ValuativeRel + +/-! ### Residue and maximal-ideal successive quotients -/ + +/-- Additive identification of the residue field with `𝒪[K]/𝓂[K]`. + +This is definitional for mathlib's local-ring residue field, but we expose it as +part of the local CFT boundary so later files do not depend on unfolding the +residue-field definition. -/ +def integerRingModMaximalIdealAddEquivResidue + (K : Type u) [Field K] [ValuativeRel K] : + (𝒪[K] ⧸ (𝓂[K] : Ideal 𝒪[K])) ≃+ 𝓀[K] := + AddEquiv.refl _ + +/-- The additive equivalence from the integer ring modulo its maximal ideal sends a representative +to its residue class. -/ +@[simp] +theorem integerRingModMaximalIdealAddEquivResidue_mk + (K : Type u) [Field K] [ValuativeRel K] (x : 𝒪[K]) : + integerRingModMaximalIdealAddEquivResidue K + (Ideal.Quotient.mk (𝓂[K] : Ideal 𝒪[K]) x) = + IsLocalRing.residue 𝒪[K] x := + rfl + +/-- An integer-ring element has zero residue exactly when it belongs to the maximal ideal. -/ +theorem residue_eq_zero_iff_mem_maximalIdeal + (K : Type u) [Field K] [ValuativeRel K] (x : 𝒪[K]) : + IsLocalRing.residue 𝒪[K] x = 0 ↔ x ∈ (𝓂[K] : Ideal 𝒪[K]) := + IsLocalRing.residue_eq_zero_iff x + +/-- A chosen DVR uniformizer of the valuation ring of a nonarchimedean local +field, viewed as an irreducible element of `𝒪[K]`. -/ +def chosenIntegerRingUniformizer + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : 𝒪[K] := + Classical.choose (IsDiscreteValuationRing.exists_irreducible 𝒪[K]) + +/-- The chosen integer-ring uniformizer is irreducible in the discrete valuation ring. -/ +theorem chosenIntegerRingUniformizer_irreducible + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + Irreducible (chosenIntegerRingUniformizer K) := + Classical.choose_spec (IsDiscreteValuationRing.exists_irreducible 𝒪[K]) + +/-- The maximal ideal is the principal ideal generated by the chosen integer-ring uniformizer. -/ +theorem chosenIntegerRingUniformizer_maximalIdeal_eq + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + (𝓂[K] : Ideal 𝒪[K]) = Ideal.span ({chosenIntegerRingUniformizer K} : Set 𝒪[K]) := + (chosenIntegerRingUniformizer_irreducible K).maximalIdeal_eq + +/-- The chosen DVR uniformizer of `𝒪[K]`, viewed as a nonzero field unit. + +This is the source object for the local class-field decomposition by powers of +a prime element. Valuation normalization is proved separately; it is not an +extra argument of this definition. -/ +def integerRingUniformizerFieldUnit + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : Kˣ := + Units.mk0 (((chosenIntegerRingUniformizer K : 𝒪[K]) : K)) (by + intro h + exact (chosenIntegerRingUniformizer_irreducible K).ne_zero (Subtype.ext h)) + +/-- The field unit associated to the chosen integer-ring uniformizer has the same underlying field +element. -/ +@[simp] +theorem integerRingUniformizerFieldUnit_coe + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + ((integerRingUniformizerFieldUnit K : Kˣ) : K) = + (((chosenIntegerRingUniformizer K : 𝒪[K]) : K)) := + rfl + +/-- The inverse of the chosen DVR uniformizer, as a field unit. + +With the normalized additive valuation used by `valuationMap`, this is the +element expected to have value `1`. The proof of that normalization is the next +source-producing frontier. -/ +def inverseIntegerRingUniformizerFieldUnit + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : Kˣ := + (integerRingUniformizerFieldUnit K)⁻¹ + +/-- The inverse uniformizer field unit coerces to the inverse of the chosen uniformizer. -/ +@[simp] +theorem inverseIntegerRingUniformizerFieldUnit_coe + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + ((inverseIntegerRingUniformizerFieldUnit K : Kˣ) : K) = + (((chosenIntegerRingUniformizer K : 𝒪[K]) : K))⁻¹ := + rfl + +private lemma withZeroMultiplicativeInt_le_of_lt_one + (δ : WithZero (Multiplicative Int)) (hδ : δ < 1) : + δ ≤ ((Multiplicative.ofAdd (-1 : Int) : Multiplicative Int) : + WithZero (Multiplicative Int)) := by + cases δ using WithZero.recZeroCoe with + | zero => exact bot_le + | coe d => + rw [WithZero.coe_le_coe] + rw [← Multiplicative.toAdd_le] + change Multiplicative.toAdd d ≤ (-1 : Int) + have hdlt : Multiplicative.toAdd d < (0 : Int) := by + have h' : d < (1 : Multiplicative Int) := by + simpa using hδ + change Multiplicative.toAdd d < Multiplicative.toAdd (1 : Multiplicative Int) + exact Multiplicative.toAdd_lt.mpr h' + omega + +private lemma withZeroMultiplicativeInt_maximal_lt_one_eq_ofAdd_neg_one + {a : WithZero (Multiplicative Int)} (ha : a < 1) + (hmax : ∀ δ : WithZero (Multiplicative Int), δ < 1 → δ ≤ a) : + a = ((Multiplicative.ofAdd (-1 : Int) : Multiplicative Int) : + WithZero (Multiplicative Int)) := by + apply le_antisymm + · exact withZeroMultiplicativeInt_le_of_lt_one a ha + · apply hmax + rw [← WithZero.coe_one, WithZero.coe_lt_coe] + change (-1 : Int) < 0 + omega + +private theorem valueGroupWithZeroIsoInt_eq_of_maximal_lt_one + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + {a : ValuativeRel.ValueGroupWithZero K} (ha : a < 1) + (hmax : ∀ δ : ValuativeRel.ValueGroupWithZero K, δ < 1 → δ ≤ a) : + IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K a = + ((Multiplicative.ofAdd (-1 : Int) : Multiplicative Int) : + WithZero (Multiplicative Int)) := by + let φ := IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K + apply withZeroMultiplicativeInt_maximal_lt_one_eq_ofAdd_neg_one + · simpa using φ.strictMono ha + · intro δ hδ + let ε : ValuativeRel.ValueGroupWithZero K := φ.symm δ + have hε : ε < 1 := by + have h := φ.symm.strictMono hδ + simpa using h + have hle : ε ≤ a := hmax ε hε + have hle' := φ.strictMono.monotone hle + dsimp [ε, φ] at hle' + simpa using hle' + +/-- any prime element of the valuation ring has +multiplicative value `ofAdd (-1)` under the local-field normalization. + +The proof is the DVR argument used in this construction: `𝓂 = (ϖ)`, so every +valuation value below `1` is bounded by the value of `ϖ`; in the normalized +value group this maximal element below `1` is `ofAdd (-1)`. -/ +theorem valueGroupWithZeroIsoInt_of_integerRing_irreducible + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) : + IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K + (ValuativeRel.valuation K ((ϖ : 𝒪[K]) : K)) = + ((Multiplicative.ofAdd (-1 : Int) : Multiplicative Int) : + WithZero (Multiplicative Int)) := by + apply valueGroupWithZeroIsoInt_eq_of_maximal_lt_one K + · simpa using (Valuation.integer.v_irreducible_lt_one + (v := ValuativeRel.valuation K) hϖ) + · intro δ hδ + obtain ⟨x, hx⟩ := ValuativeRel.valuation_surjective (K := K) δ + by_cases hx0 : x = 0 + · have hδ0 : δ = 0 := by + simpa [hx0] using hx.symm + rw [hδ0] + exact bot_le + · let y : 𝒪[K] := ⟨x, by + change ValuativeRel.valuation K x ≤ 1 + rw [hx] + exact le_of_lt hδ⟩ + have hylt : ValuativeRel.valuation K (y : K) < 1 := by + change ValuativeRel.valuation K x < 1 + simpa [hx] + have hynot : ¬ IsUnit y := by + rw [Valuation.Integer.not_isUnit_iff_valuation_lt_one + (v := ValuativeRel.valuation K)] + exact hylt + have hym : y ∈ (𝓂[K] : Ideal 𝒪[K]) := by + rw [IsLocalRing.mem_maximalIdeal] + simpa [nonunits] using hynot + have hyspan : y ∈ + (Ideal.span ({ϖ} : Set 𝒪[K]) : Ideal 𝒪[K]) := by + simpa [hϖ.maximalIdeal_eq] using hym + have hset := Valuation.integer.coe_span_singleton_eq_setOfPred_le_v_coe + (v := ValuativeRel.valuation K) ϖ + have hyle : ValuativeRel.valuation K (y : K) ≤ + ValuativeRel.valuation K ((ϖ : 𝒪[K]) : K) := by + have hyspanSet : y ∈ + ((Ideal.span ({ϖ} : Set 𝒪[K]) : Ideal 𝒪[K]) : Set 𝒪[K]) := hyspan + rw [hset] at hyspanSet + exact hyspanSet + simpa [y, hx] using hyle + +/-- A field unit whose value is represented by a valuation-ring prime element +has normalized additive value `-1`. -/ +theorem v_integerRingIrreducibleFieldUnit + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (u : Kˣ) (hu : (u : K) = ((ϖ : 𝒪[K]) : K)) : + LocalFieldTheory.IsNonarchimedeanLocalField.v K (Additive.ofMul u) = -1 := by + dsimp [LocalFieldTheory.IsNonarchimedeanLocalField.v] + have hne : + IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K + (ValuativeRel.valuation K ((u : Kˣ) : K)) ≠ 0 := by + rw [hu] + simp [hϖ.ne_zero] + have hunzero : + WithZero.unzero + (x := IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K + (ValuativeRel.valuation K ((u : Kˣ) : K))) hne = + (Multiplicative.ofAdd (-1 : Int) : Multiplicative Int) := by + apply WithZero.coe_injective + rw [WithZero.coe_unzero] + rw [hu] + simpa using valueGroupWithZeroIsoInt_of_integerRing_irreducible K ϖ hϖ + rw [hunzero] + simp + +/-- The inverse of a field unit represented by a valuation-ring prime element +has normalized additive value `1`. -/ +theorem v_integerRingIrreducibleFieldUnit_inv + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (u : Kˣ) (hu : (u : K) = ((ϖ : 𝒪[K]) : K)) : + LocalFieldTheory.IsNonarchimedeanLocalField.v K (Additive.ofMul u⁻¹) = 1 := by + rw [LocalFieldTheory.IsNonarchimedeanLocalField.v_inv] + rw [v_integerRingIrreducibleFieldUnit K ϖ hϖ u hu] + norm_num + +/-- The chosen prime element of the valuation ring has +multiplicative value `ofAdd (-1)` under the local-field normalization. + +This is the source-producing normalization for the later decomposition +`x = u * π^m`; it is proved from the DVR fact `𝓂 = (π)`, not assumed as a +separate uniformizer-value input. -/ +theorem valueGroupWithZeroIsoInt_chosenIntegerRingUniformizer + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K + (ValuativeRel.valuation K ((chosenIntegerRingUniformizer K : 𝒪[K]) : K)) = + ((Multiplicative.ofAdd (-1 : Int) : Multiplicative Int) : + WithZero (Multiplicative Int)) := + valueGroupWithZeroIsoInt_of_integerRing_irreducible K + (chosenIntegerRingUniformizer K) (chosenIntegerRingUniformizer_irreducible K) + +/-- The chosen valuation-ring prime element has normalized additive value `-1` +as a field unit. We use the inverse convention for a positive +uniformizer in the exact sequence. -/ +theorem v_integerRingUniformizerFieldUnit + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + LocalFieldTheory.IsNonarchimedeanLocalField.v K + (Additive.ofMul (integerRingUniformizerFieldUnit K)) = -1 := by + exact v_integerRingIrreducibleFieldUnit K + (chosenIntegerRingUniformizer K) (chosenIntegerRingUniformizer_irreducible K) + (integerRingUniformizerFieldUnit K) rfl + +/-- The inverse of the chosen valuation-ring prime element has normalized +additive value `1`. This is the source object needed before using powers of a +uniformizer in the local class-field calculation. -/ +theorem v_inverseIntegerRingUniformizerFieldUnit + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + LocalFieldTheory.IsNonarchimedeanLocalField.v K + (Additive.ofMul (inverseIntegerRingUniformizerFieldUnit K)) = 1 := by + rw [inverseIntegerRingUniformizerFieldUnit] + exact v_integerRingIrreducibleFieldUnit_inv K + (chosenIntegerRingUniformizer K) (chosenIntegerRingUniformizer_irreducible K) + (integerRingUniformizerFieldUnit K) rfl + +/-- Denominator clearing in the valuation ring: +every element of `K` becomes integral after multiplying by a sufficiently high +power of the chosen prime element of `𝒪[K]`. + +This local-DVR denominator-clearing theorem supports normal-basis lattice bounds; the +proof uses the fraction representation over `𝒪[K]` and the DVR factorization of +the denominator into a unit times a power of the prime element. -/ +theorem exists_chosenIntegerRingUniformizer_pow_mul_mem_integerRing + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (x : K) : + ∃ n : Nat, + (((chosenIntegerRingUniformizer K : 𝒪[K]) : K) ^ n) * x ∈ 𝒪[K] := by + obtain ⟨a, b, hb, hfrac⟩ := IsFractionRing.div_surjective (A := 𝒪[K]) x + have hb_ne : b ≠ 0 := nonZeroDivisors.ne_zero hb + obtain ⟨n, u, hb_factor⟩ := + IsDiscreteValuationRing.eq_unit_mul_pow_irreducible hb_ne + (chosenIntegerRingUniformizer_irreducible K) + refine ⟨n, ?_⟩ + rw [← hfrac, hb_factor] + have hϖ_ne : (((chosenIntegerRingUniformizer K : 𝒪[K]) : K)) ≠ 0 := by + intro h + exact (chosenIntegerRingUniformizer_irreducible K).ne_zero + ((IsFractionRing.injective 𝒪[K] K) h) + have hϖ_pow_ne : + (((chosenIntegerRingUniformizer K : 𝒪[K]) : K) ^ n) ≠ 0 := + pow_ne_zero n hϖ_ne + have hu_ne : (((u : 𝒪[K]) : K)) ≠ 0 := by + intro h + exact u.ne_zero ((IsFractionRing.injective 𝒪[K] K) h) + have hclear : + (((chosenIntegerRingUniformizer K : 𝒪[K]) : K) ^ n) * + ((a : K) / + (((u : 𝒪[K]) * chosenIntegerRingUniformizer K ^ n : 𝒪[K]) : K)) = + ((a * ↑u⁻¹ : 𝒪[K]) : K) := by + calc + (((chosenIntegerRingUniformizer K : 𝒪[K]) : K) ^ n) * + ((a : K) / + (((u : 𝒪[K]) * chosenIntegerRingUniformizer K ^ n : 𝒪[K]) : K)) + = + (((chosenIntegerRingUniformizer K : 𝒪[K]) : K) ^ n) * + ((a : K) / (((u : 𝒪[K]) : K) * + (((chosenIntegerRingUniformizer K : 𝒪[K]) : K) ^ n))) := by + simp + _ = (a : K) * (((u : 𝒪[K]) : K))⁻¹ := by + field_simp [hu_ne, hϖ_pow_ne] + _ = ((a * ↑u⁻¹ : 𝒪[K]) : K) := by + have hu_inv : + (((↑u⁻¹ : 𝒪[K]) : K)) = (((u : 𝒪[K]) : K))⁻¹ := by + exact map_units_inv (algebraMap 𝒪[K] K) u + rw [← hu_inv] + simp + change (((chosenIntegerRingUniformizer K : 𝒪[K]) : K) ^ n) * + ((a : K) / + (((u : 𝒪[K]) * chosenIntegerRingUniformizer K ^ n : 𝒪[K]) : K)) ∈ 𝒪[K] + rw [hclear] + exact (a * ↑u⁻¹ : 𝒪[K]).2 + +/-- If a uniformizer is irreducible, each maximal-ideal power is generated by the corresponding +power of that uniformizer. -/ +theorem maximalIdeal_pow_eq_span_uniformizer_pow_of_irreducible + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) (n : Nat) : + (𝓂[K] ^ n : Ideal 𝒪[K]) = Ideal.span ({ϖ ^ n} : Set 𝒪[K]) := by + rw [hϖ.maximalIdeal_eq, Ideal.span_singleton_pow] + +/-- Each power of the maximal ideal is generated by the matching power of the chosen uniformizer. -/ +theorem maximalIdeal_pow_eq_span_uniformizer_pow + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (n : Nat) : + (𝓂[K] ^ n : Ideal 𝒪[K]) = + Ideal.span ({chosenIntegerRingUniformizer K ^ n} : Set 𝒪[K]) := + maximalIdeal_pow_eq_span_uniformizer_pow_of_irreducible K + (chosenIntegerRingUniformizer K) (chosenIntegerRingUniformizer_irreducible K) n + +/-- Multiplying an integer by the `n`-th uniformizer power places it in the `n`-th maximal-ideal +power. -/ +theorem mul_uniformizer_pow_mem_maximalIdeal_pow + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) (r : 𝒪[K]) : + r * ϖ ^ n ∈ (𝓂[K] ^ n : Ideal 𝒪[K]) := by + rw [maximalIdeal_pow_eq_span_uniformizer_pow_of_irreducible K ϖ hϖ n] + rw [Ideal.mem_span_singleton] + exact ⟨r, by rw [mul_comm]⟩ + +/-- A multiple of the `n`-th uniformizer power lies in the next ideal power exactly when its +coefficient lies in the maximal ideal. -/ +theorem mul_uniformizer_pow_mem_maximalIdeal_pow_succ_iff + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) (r : 𝒪[K]) : + r * ϖ ^ n ∈ (𝓂[K] ^ (n + 1) : Ideal 𝒪[K]) ↔ + r ∈ (𝓂[K] : Ideal 𝒪[K]) := by + rw [hϖ.maximalIdeal_eq, Ideal.span_singleton_pow] + rw [Ideal.mem_span_singleton, Ideal.mem_span_singleton] + constructor + · rintro ⟨c, hc⟩ + refine ⟨c, ?_⟩ + have hne : ϖ ^ n ≠ 0 := pow_ne_zero n hϖ.ne_zero + have hcancel : r * ϖ ^ n = (ϖ * c) * ϖ ^ n := by + calc + r * ϖ ^ n = ϖ ^ (n + 1) * c := hc + _ = (ϖ * c) * ϖ ^ n := by + rw [pow_succ'] + ring + exact mul_right_cancel₀ hne hcancel + · rintro ⟨c, hc⟩ + refine ⟨c, ?_⟩ + rw [hc] + rw [pow_succ'] + ring + +/-- Multiplication by `ϖ^n`, landing in the ideal `𝓂^n`. -/ +def maximalIdealPowMulUniformizerPowMap + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) : + 𝒪[K] →ₗ[𝒪[K]] ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) where + toFun r := ⟨r * ϖ ^ n, mul_uniformizer_pow_mem_maximalIdeal_pow K ϖ hϖ n r⟩ + map_add' r s := by + ext + simp [add_mul] + map_smul' a r := by + ext + simp [mul_assoc] + +/-- The map into a maximal-ideal power multiplies its input by the corresponding uniformizer power. +The map into a maximal-ideal power multiplies its input by the corresponding uniformizer power. -/ +@[simp] +theorem maximalIdealPowMulUniformizerPowMap_apply + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) (r : 𝒪[K]) : + (maximalIdealPowMulUniformizerPowMap K ϖ hϖ n r : 𝒪[K]) = + r * ϖ ^ n := + rfl + +/-- The map `𝒪[K] → 𝓂^n/𝓂^(n+1)` induced by multiplication by `ϖ^n`. -/ +def maximalIdealPowSuccQuotMulUniformizerPowMap + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) : + 𝒪[K] →ₗ[𝒪[K]] MaximalIdealPowSuccQuot K n := + (maximalIdealPowSuccQuotMk K n).comp + (maximalIdealPowMulUniformizerPowMap K ϖ hϖ n) + +/-- On successive ideal quotients, multiplication by a uniformizer power sends a residue +representative to its ideal-quotient class. -/ +@[simp] +theorem maximalIdealPowSuccQuotMulUniformizerPowMap_apply + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) (r : 𝒪[K]) : + maximalIdealPowSuccQuotMulUniformizerPowMap K ϖ hϖ n r = + maximalIdealPowSuccQuotMk K n + (maximalIdealPowMulUniformizerPowMap K ϖ hϖ n r) := + rfl + +/-- The kernel of multiplication into a successive ideal quotient is the maximal ideal. -/ +theorem maximalIdealPowSuccQuotMulUniformizerPowMap_ker + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) : + LinearMap.ker (maximalIdealPowSuccQuotMulUniformizerPowMap K ϖ hϖ n) = + (𝓂[K] : Ideal 𝒪[K]) := by + ext r + rw [LinearMap.mem_ker] + change maximalIdealPowSuccQuotMk K n + (maximalIdealPowMulUniformizerPowMap K ϖ hϖ n r) = 0 ↔ + r ∈ (𝓂[K] : Ideal 𝒪[K]) + rw [maximalIdealPowSuccQuotMk_eq_zero_iff] + change r * ϖ ^ n ∈ (𝓂[K] ^ (n + 1) : Ideal 𝒪[K]) ↔ + r ∈ (𝓂[K] : Ideal 𝒪[K]) + exact mul_uniformizer_pow_mem_maximalIdeal_pow_succ_iff K ϖ hϖ n r + +/-- Every class in a successive maximal-ideal quotient is represented by a uniformizer power times +an integer. -/ +theorem maximalIdealPowSuccQuotMulUniformizerPowMap_surjective + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) : + Function.Surjective (maximalIdealPowSuccQuotMulUniformizerPowMap K ϖ hϖ n) := by + intro x + refine MaximalIdealPowSuccQuot.inductionOn n + (motive := fun x' => + ∃ r, maximalIdealPowSuccQuotMulUniformizerPowMap K ϖ hϖ n r = x') + x ?_ + intro a + have ha_span : (a : 𝒪[K]) ∈ Ideal.span ({ϖ ^ n} : Set 𝒪[K]) := by + simpa [maximalIdeal_pow_eq_span_uniformizer_pow_of_irreducible K ϖ hϖ n] using a.2 + rcases (Ideal.mem_span_singleton.mp ha_span) with ⟨r, hr⟩ + refine ⟨r, ?_⟩ + change maximalIdealPowSuccQuotMk K n + (maximalIdealPowMulUniformizerPowMap K ϖ hϖ n r) = + maximalIdealPowSuccQuotMk K n a + have hrep : maximalIdealPowMulUniformizerPowMap K ϖ hϖ n r = a := by + ext + simp [maximalIdealPowMulUniformizerPowMap, hr, mul_comm] + rw [hrep] + +/-- The DVR comparison `𝒪[K]/𝓂[K] ≃ 𝓂^n/𝓂^(n+1)` attached to an irreducible +uniformizer `ϖ`. -/ +def residueLinearEquivMaximalIdealPowSuccQuotOfIrreducible + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) : + 𝓀[K] ≃ₗ[𝒪[K]] MaximalIdealPowSuccQuot K n := + (Submodule.quotEquivOfEq (𝓂[K] : Submodule 𝒪[K] 𝒪[K]) + (LinearMap.ker (maximalIdealPowSuccQuotMulUniformizerPowMap K ϖ hϖ n)) + (maximalIdealPowSuccQuotMulUniformizerPowMap_ker K ϖ hϖ n).symm).trans + ((maximalIdealPowSuccQuotMulUniformizerPowMap K ϖ hϖ n).quotKerEquivOfSurjective + (maximalIdealPowSuccQuotMulUniformizerPowMap_surjective K ϖ hϖ n)) + +/-- Additive form of `𝒪[K]/𝓂[K] ≃ 𝓂^n/𝓂^(n+1)`. -/ +def residueAddEquivMaximalIdealPowSuccQuotOfIrreducible + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) : + 𝓀[K] ≃+ MaximalIdealPowSuccQuot K n := + (residueLinearEquivMaximalIdealPowSuccQuotOfIrreducible K ϖ hϖ n).toAddEquiv + +/-- The residue-to-ideal-quotient equivalence sends a residue class to the class of its lift times +the uniformizer power. -/ +@[simp] +theorem residueAddEquivMaximalIdealPowSuccQuotOfIrreducible_residue + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) (r : 𝒪[K]) : + residueAddEquivMaximalIdealPowSuccQuotOfIrreducible K ϖ hϖ n + (IsLocalRing.residue 𝒪[K] r) = + maximalIdealPowSuccQuotMulUniformizerPowMap K ϖ hϖ n r := by + let f := maximalIdealPowSuccQuotMulUniformizerPowMap K ϖ hϖ n + let hker : (𝓂[K] : Submodule 𝒪[K] 𝒪[K]) = LinearMap.ker f := + (maximalIdealPowSuccQuotMulUniformizerPowMap_ker K ϖ hϖ n).symm + change (Submodule.quotEquivOfEq (𝓂[K] : Submodule 𝒪[K] 𝒪[K]) + (LinearMap.ker f) hker).trans + (f.quotKerEquivOfSurjective + (maximalIdealPowSuccQuotMulUniformizerPowMap_surjective K ϖ hϖ n)) + (Submodule.Quotient.mk r) = f r + rw [LinearEquiv.trans_apply] + have hquot : + Submodule.quotEquivOfEq (𝓂[K] : Submodule 𝒪[K] 𝒪[K]) + (LinearMap.ker f) hker (Submodule.Quotient.mk r) = + (Submodule.Quotient.mk r : 𝒪[K] ⧸ LinearMap.ker f) := by + exact Submodule.quotEquivOfEq_mk + (p := (𝓂[K] : Submodule 𝒪[K] 𝒪[K])) (p' := LinearMap.ker f) hker r + rw [hquot] + rw [LinearMap.quotKerEquivOfSurjective_apply_mk] + +/-- The version of `𝒪[K]/𝓂[K] ≃ 𝓂^n/𝓂^(n+1)` determined by the library's +chosen integer-ring uniformizer. -/ +def chosenResidueLinearEquivMaximalIdealPowSuccQuot + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (n : Nat) : + 𝓀[K] ≃ₗ[𝒪[K]] MaximalIdealPowSuccQuot K n := + residueLinearEquivMaximalIdealPowSuccQuotOfIrreducible K + (chosenIntegerRingUniformizer K) (chosenIntegerRingUniformizer_irreducible K) n + +/-- Additive equivalence determined by the library's chosen integer-ring +uniformizer. -/ +def chosenResidueAddEquivMaximalIdealPowSuccQuot + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (n : Nat) : + 𝓀[K] ≃+ MaximalIdealPowSuccQuot K n := + (chosenResidueLinearEquivMaximalIdealPowSuccQuot K n).toAddEquiv + +/-- A successive maximal-ideal quotient over a local field is finite. -/ +instance maximalIdealPowSuccQuot_finite + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (n : Nat) : + Finite (MaximalIdealPowSuccQuot K n) := + Finite.of_equiv 𝓀[K] (chosenResidueAddEquivMaximalIdealPowSuccQuot K n) + +/-- Every successive maximal-ideal quotient has the same cardinality as the residue field. -/ +theorem maximalIdealPowSuccQuot_card_eq_residue + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (n : Nat) : + Nat.card (MaximalIdealPowSuccQuot K n) = Nat.card 𝓀[K] := by + exact Nat.card_congr + (chosenResidueAddEquivMaximalIdealPowSuccQuot K n).symm.toEquiv + +/-- The unit-quotient coordinate theorem in additive form: +`U^n/U^(n+1) ≃ 𝓀[K]`, for `n ≥ 1`. -/ +def principalUnitsSuccQuotAddEquivResidue + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (n : Nat) (hn : 1 ≤ n) : + Additive (PrincipalUnitsSuccQuot K n) ≃+ 𝓀[K] := + (maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot K n hn).symm.trans + (chosenResidueAddEquivMaximalIdealPowSuccQuot K n).symm + +/-- The unit-quotient coordinate theorem in additive form, using a specified +irreducible uniformizer. This avoids the independent canonical-uniformizer +choice when comparing an unramified extension with the image of a base +uniformizer upstairs. -/ +def principalUnitsSuccQuotAddEquivResidueOfIrreducible + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) (hn : 1 ≤ n) : + Additive (PrincipalUnitsSuccQuot K n) ≃+ 𝓀[K] := + (maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot K n hn).symm.trans + (residueAddEquivMaximalIdealPowSuccQuotOfIrreducible K ϖ hϖ n).symm + +/-- The inverse residue equivalence extracts the residue coordinate of a successive principal-unit +class. -/ +@[simp] +theorem principalUnitsSuccQuotAddEquivResidueOfIrreducible_symm_apply + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) (hn : 1 ≤ n) (x : 𝓀[K]) : + (principalUnitsSuccQuotAddEquivResidueOfIrreducible K ϖ hϖ n hn).symm x = + principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd K n hn + (residueAddEquivMaximalIdealPowSuccQuotOfIrreducible K ϖ hϖ n x) := + rfl + +/-- Applying the inverse principal-unit quotient equivalence to a residue representative recovers +that residue. -/ +theorem principalUnitsSuccQuotAddEquivResidueOfIrreducible_symm_residue + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) (hn : 1 ≤ n) (r : 𝒪[K]) : + (principalUnitsSuccQuotAddEquivResidueOfIrreducible K ϖ hϖ n hn).symm + (IsLocalRing.residue 𝒪[K] r) = + Additive.ofMul + (principalUnitsSuccQuotMk K n + (principalUnitOneAddOfMemPowSubgroup K hn + ((maximalIdealPowMulUniformizerPowMap K ϖ hϖ n r : + (𝓂[K] ^ n : Ideal 𝒪[K])) : 𝒪[K]) + (maximalIdealPowMulUniformizerPowMap K ϖ hϖ n r).2)) := by + rw [principalUnitsSuccQuotAddEquivResidueOfIrreducible_symm_apply] + rw [residueAddEquivMaximalIdealPowSuccQuotOfIrreducible_residue] + rw [principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd_apply] + rw [maximalIdealPowSuccQuotMulUniformizerPowMap_apply] + rw [principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_mk] + rfl + +/-- The class of `1 + rϖ^n` in `U^n/U^(n+1)`, for a DVR uniformizer `ϖ`. + +This is the concrete coordinate used in the unit-quotient coordinate theorem: +successive principal-unit quotients are residue-field additive quotients. -/ +noncomputable def principalUnitsSuccQuotUniformizerCoord + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) (hn : 1 ≤ n) (r : 𝒪[K]) : + PrincipalUnitsSuccQuot K n := + principalUnitsSuccQuotMk K n + (principalUnitOneAddOfMemPowSubgroup K hn + ((maximalIdealPowMulUniformizerPowMap K ϖ hϖ n r : + (𝓂[K] ^ n : Ideal 𝒪[K])) : 𝒪[K]) + (maximalIdealPowMulUniformizerPowMap K ϖ hϖ n r).2) + +/-- The zero coordinate gives the trivial class in `U^n/U^(n+1)`. -/ +@[simp] +theorem principalUnitsSuccQuotUniformizerCoord_zero + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) (hn : 1 ≤ n) : + principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn 0 = 1 := by + change principalUnitsSuccQuotOfIdealPow K n hn + (maximalIdealPowMulUniformizerPowMap K ϖ hϖ n 0) = 1 + rw [map_zero] + exact principalUnitsSuccQuotOfIdealPow_zero K n hn + +/-- Uniformizer coordinates add as expected in the successive principal-unit +quotient: `1 + (r+s)ϖ^n` and `(1+rϖ^n)(1+sϖ^n)` have the same class modulo +`U^(n+1)`. -/ +theorem principalUnitsSuccQuotUniformizerCoord_add + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) (hn : 1 ≤ n) (r s : 𝒪[K]) : + principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn (r + s) = + principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn r * + principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn s := by + change principalUnitsSuccQuotOfIdealPow K n hn + (maximalIdealPowMulUniformizerPowMap K ϖ hϖ n (r + s)) = + principalUnitsSuccQuotOfIdealPow K n hn + (maximalIdealPowMulUniformizerPowMap K ϖ hϖ n r) * + principalUnitsSuccQuotOfIdealPow K n hn + (maximalIdealPowMulUniformizerPowMap K ϖ hϖ n s) + rw [map_add] + exact principalUnitsSuccQuotOfIdealPow_add K n hn + (maximalIdealPowMulUniformizerPowMap K ϖ hϖ n r) + (maximalIdealPowMulUniformizerPowMap K ϖ hϖ n s) + +/-- Additive homomorphism form of the uniformizer coordinate +`r ↦ [1 + rϖ^n]` into the successive principal-unit quotient. -/ +noncomputable def principalUnitsSuccQuotUniformizerCoordAddHom + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) (hn : 1 ≤ n) : + 𝒪[K] →+ Additive (PrincipalUnitsSuccQuot K n) where + toFun r := Additive.ofMul (principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn r) + map_zero' := by + change Additive.ofMul (principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn 0) = 0 + rw [principalUnitsSuccQuotUniformizerCoord_zero] + rfl + map_add' r s := by + change Additive.ofMul (principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn (r + s)) = + Additive.ofMul (principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn r) + + Additive.ofMul (principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn s) + rw [principalUnitsSuccQuotUniformizerCoord_add] + rfl + +/-- The uniformizer-coordinate homomorphism sends a principal-unit class to its residue-field +coordinate. -/ +@[simp] +theorem principalUnitsSuccQuotUniformizerCoordAddHom_apply + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) (hn : 1 ≤ n) (r : 𝒪[K]) : + principalUnitsSuccQuotUniformizerCoordAddHom K ϖ hϖ n hn r = + Additive.ofMul (principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn r) := + rfl + +/-- The inverse of the additive equivalence `U^n/U^(n+1) ≃ 𝓀[K]` sends the +residue of `r` to the uniformizer coordinate class `[1 + rϖ^n]`. -/ +theorem principalUnitsSuccQuotAddEquivResidueOfIrreducible_symm_residue_coord + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) (hn : 1 ≤ n) (r : 𝒪[K]) : + (principalUnitsSuccQuotAddEquivResidueOfIrreducible K ϖ hϖ n hn).symm + (IsLocalRing.residue 𝒪[K] r) = + Additive.ofMul (principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn r) := by + exact principalUnitsSuccQuotAddEquivResidueOfIrreducible_symm_residue + K ϖ hϖ n hn r + +/-- The additive equivalence `U^n/U^(n+1) ≃ 𝓀[K]` sends the uniformizer +coordinate class `[1 + rϖ^n]` to the residue of `r`. -/ +theorem principalUnitsSuccQuotAddEquivResidueOfIrreducible_coord + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) (hn : 1 ≤ n) (r : 𝒪[K]) : + principalUnitsSuccQuotAddEquivResidueOfIrreducible K ϖ hϖ n hn + (Additive.ofMul (principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn r)) = + IsLocalRing.residue 𝒪[K] r := by + let E := principalUnitsSuccQuotAddEquivResidueOfIrreducible K ϖ hϖ n hn + have hcoord : + E.symm (IsLocalRing.residue 𝒪[K] r) = + Additive.ofMul (principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn r) := by + simpa [E] using + principalUnitsSuccQuotAddEquivResidueOfIrreducible_symm_residue_coord + K ϖ hϖ n hn r + change E (Additive.ofMul (principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn r)) = + IsLocalRing.residue 𝒪[K] r + rw [← hcoord] + exact E.apply_symm_apply (IsLocalRing.residue 𝒪[K] r) + +/-- The coordinate homomorphism factors through reduction to the residue field, +pointwise. -/ +theorem principalUnitsSuccQuotUniformizerCoordAddHom_eq_symm_residue + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) (hn : 1 ≤ n) (r : 𝒪[K]) : + principalUnitsSuccQuotUniformizerCoordAddHom K ϖ hϖ n hn r = + (principalUnitsSuccQuotAddEquivResidueOfIrreducible K ϖ hϖ n hn).symm + (IsLocalRing.residue 𝒪[K] r) := by + rw [principalUnitsSuccQuotUniformizerCoordAddHom_apply] + exact (principalUnitsSuccQuotAddEquivResidueOfIrreducible_symm_residue_coord + K ϖ hϖ n hn r).symm + +/-- The coordinate homomorphism is the composite of residue reduction and the +inverse of the additive equivalence `U^n/U^(n+1) ≃ 𝓀[K]`. -/ +theorem principalUnitsSuccQuotUniformizerCoordAddHom_eq_symm_comp_residue + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) (hn : 1 ≤ n) : + principalUnitsSuccQuotUniformizerCoordAddHom K ϖ hϖ n hn = + (principalUnitsSuccQuotAddEquivResidueOfIrreducible K ϖ hϖ n hn).symm.toAddMonoidHom.comp + (IsLocalRing.residue 𝒪[K]).toAddMonoidHom := by + ext r + exact principalUnitsSuccQuotUniformizerCoordAddHom_eq_symm_residue K ϖ hϖ n hn r + +/-- Every class in `U^n/U^(n+1)` has a uniformizer-coordinate representative +`[1 + rϖ^n]`, in additive homomorphism form. -/ +theorem principalUnitsSuccQuotUniformizerCoordAddHom_surjective + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) (hn : 1 ≤ n) : + Function.Surjective (principalUnitsSuccQuotUniformizerCoordAddHom K ϖ hϖ n hn) := by + intro y + let E := principalUnitsSuccQuotAddEquivResidueOfIrreducible K ϖ hϖ n hn + obtain ⟨r, hr⟩ := Ideal.Quotient.mk_surjective (E y) + refine ⟨r, ?_⟩ + apply E.injective + rw [principalUnitsSuccQuotUniformizerCoordAddHom_apply, + principalUnitsSuccQuotAddEquivResidueOfIrreducible_coord] + change Ideal.Quotient.mk (𝓂[K] : Ideal 𝒪[K]) r = E y + exact hr + +/-- Every class in `U^n/U^(n+1)` has a uniformizer-coordinate representative +`[1 + rϖ^n]`. -/ +theorem principalUnitsSuccQuotUniformizerCoord_surjective + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) (hn : 1 ≤ n) : + Function.Surjective (principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn) := by + intro y + obtain ⟨r, hr⟩ := + principalUnitsSuccQuotUniformizerCoordAddHom_surjective K ϖ hϖ n hn + (Additive.ofMul y) + refine ⟨r, ?_⟩ + change Additive.ofMul (principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn r) = + Additive.ofMul y at hr + exact Additive.ofMul.injective hr + +/-- In uniformizer coordinates, equality in `U^n/U^(n+1)` is exactly equality +of residues of the coefficients. -/ +theorem principalUnitsSuccQuotUniformizerCoord_eq_iff_residue_eq + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) (hn : 1 ≤ n) (r s : 𝒪[K]) : + principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn r = + principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn s ↔ + IsLocalRing.residue 𝒪[K] r = IsLocalRing.residue 𝒪[K] s := by + let E := principalUnitsSuccQuotAddEquivResidueOfIrreducible K ϖ hϖ n hn + have hr : + E.symm (IsLocalRing.residue 𝒪[K] r) = + Additive.ofMul (principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn r) := by + exact principalUnitsSuccQuotAddEquivResidueOfIrreducible_symm_residue_coord + K ϖ hϖ n hn r + have hs : + E.symm (IsLocalRing.residue 𝒪[K] s) = + Additive.ofMul (principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn s) := by + exact principalUnitsSuccQuotAddEquivResidueOfIrreducible_symm_residue_coord + K ϖ hϖ n hn s + constructor + · intro h + have hcoords : + Additive.ofMul (principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn r) = + Additive.ofMul (principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn s) := + congrArg Additive.ofMul h + have hres : + E.symm (IsLocalRing.residue 𝒪[K] r) = + E.symm (IsLocalRing.residue 𝒪[K] s) := by + calc + E.symm (IsLocalRing.residue 𝒪[K] r) = + Additive.ofMul (principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn r) := hr + _ = Additive.ofMul (principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn s) := + hcoords + _ = E.symm (IsLocalRing.residue 𝒪[K] s) := hs.symm + exact E.symm.injective hres + · intro h + have hres : + E.symm (IsLocalRing.residue 𝒪[K] r) = + E.symm (IsLocalRing.residue 𝒪[K] s) := + congrArg E.symm h + have hcoords : + Additive.ofMul (principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn r) = + Additive.ofMul (principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn s) := by + calc + Additive.ofMul (principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn r) = + E.symm (IsLocalRing.residue 𝒪[K] r) := hr.symm + _ = E.symm (IsLocalRing.residue 𝒪[K] s) := hres + _ = Additive.ofMul (principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn s) := hs + simpa using congrArg Additive.toMul hcoords + +/-- In uniformizer coordinates, the class of `1 + rϖ^n` is trivial exactly +when the coefficient has zero residue. -/ +theorem principalUnitsSuccQuotUniformizerCoord_eq_one_iff_residue_eq_zero + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) (hn : 1 ≤ n) (r : 𝒪[K]) : + principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn r = 1 ↔ + IsLocalRing.residue 𝒪[K] r = 0 := by + rw [principalUnitsSuccQuotUniformizerCoord] + change principalUnitsSuccQuotOfIdealPow K n hn + (maximalIdealPowMulUniformizerPowMap K ϖ hϖ n r) = 1 ↔ + IsLocalRing.residue 𝒪[K] r = 0 + rw [principalUnitsSuccQuotOfIdealPow_eq_one_iff] + rw [maximalIdealPowMulUniformizerPowMap_apply] + rw [mul_uniformizer_pow_mem_maximalIdeal_pow_succ_iff K ϖ hϖ n r] + exact (residue_eq_zero_iff_mem_maximalIdeal K r).symm + +/-- In uniformizer coordinates, the class `[1 + rϖ^n]` is trivial exactly +when the coefficient lies in the maximal ideal. -/ +theorem principalUnitsSuccQuotUniformizerCoord_eq_one_iff_mem_maximalIdeal + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) (hn : 1 ≤ n) (r : 𝒪[K]) : + principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn r = 1 ↔ + r ∈ (𝓂[K] : Ideal 𝒪[K]) := by + rw [principalUnitsSuccQuotUniformizerCoord_eq_one_iff_residue_eq_zero] + exact residue_eq_zero_iff_mem_maximalIdeal K r + +/-- Kernel criterion for the additive uniformizer-coordinate homomorphism: +`r ↦ [1 + rϖ^n]` kills exactly the maximal ideal. -/ +theorem principalUnitsSuccQuotUniformizerCoordAddHom_eq_zero_iff_mem_maximalIdeal + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) + (n : Nat) (hn : 1 ≤ n) (r : 𝒪[K]) : + principalUnitsSuccQuotUniformizerCoordAddHom K ϖ hϖ n hn r = 0 ↔ + r ∈ (𝓂[K] : Ideal 𝒪[K]) := by + constructor + · intro h + rw [principalUnitsSuccQuotUniformizerCoordAddHom_apply] at h + change Additive.ofMul (principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn r) = + Additive.ofMul (1 : PrincipalUnitsSuccQuot K n) at h + have hcoord : + principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn r = 1 := + Additive.ofMul.injective h + exact (principalUnitsSuccQuotUniformizerCoord_eq_one_iff_mem_maximalIdeal + K ϖ hϖ n hn r).1 hcoord + · intro hr + have hcoord : + principalUnitsSuccQuotUniformizerCoord K ϖ hϖ n hn r = 1 := + (principalUnitsSuccQuotUniformizerCoord_eq_one_iff_mem_maximalIdeal + K ϖ hϖ n hn r).2 hr + rw [principalUnitsSuccQuotUniformizerCoordAddHom_apply, hcoord] + rfl + +/-- Every successive principal-unit quotient has cardinality equal to that of the residue field. -/ +theorem principalUnitsSuccQuot_card_eq_residue + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (n : Nat) (hn : 1 ≤ n) : + Nat.card (PrincipalUnitsSuccQuot K n) = Nat.card 𝓀[K] := by + exact Nat.card_congr + (Additive.ofMul.trans (principalUnitsSuccQuotAddEquivResidue K n hn).toEquiv) + +/-- Successive principal-unit quotients over a local field are finite. -/ +theorem finite_principalUnitsSuccQuot + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (n : Nat) (hn : 1 ≤ n) : + Finite (PrincipalUnitsSuccQuot K n) := + Finite.of_equiv 𝓀[K] + ((Additive.ofMul.trans (principalUnitsSuccQuotAddEquivResidue K n hn).toEquiv).symm) + +end +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/MultiplicativeDecomposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/MultiplicativeDecomposition.lean new file mode 100644 index 0000000000..ba1407cdd3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/MultiplicativeDecomposition.lean @@ -0,0 +1,174 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormContinuity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ProfiniteUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +public import Mathlib.Topology.LocallyConstant.Basic +/-! +# Topological decomposition of a local multiplicative group + +This file packages the normalized valuation and the unit factor in the standard +decomposition of `Kˣ` as continuous homomorphisms. After fixing a +noncanonical uniformizer internally, the resulting parameter-free map lets +downstream separation arguments avoid carrying a uniformizer parameter. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace LocalFieldTheory.IsNonarchimedeanLocalField + +open scoped ValuativeRel WithZero + +/-- Equality under the normalized valuation is equality under the field valuation. -/ +theorem valuationUnitsMulHom_eq_iff_valuation_eq + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (x y : Kˣ) : + valuationUnitsMulHom K x = valuationUnitsMulHom K y ↔ + ValuativeRel.valuation K (x : K) = ValuativeRel.valuation K (y : K) := by + constructor + · intro h + apply (_root_.IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K).injective + have h' := congrArg + (fun z : Multiplicative Int => (z : WithZero (Multiplicative Int))) h + simpa [valuationUnitsMulHom] using h' + · intro h + simp [valuationUnitsMulHom, h] + +/-- The normalized valuation on `Kˣ`, viewed multiplicatively, is continuous. -/ +theorem valuationUnitsMulHom_continuous + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : Continuous (valuationUnitsMulHom K) := by + apply IsLocallyConstant.continuous + apply IsLocallyConstant.iff_isOpen_fiber_apply.mpr + intro x + have hset : + (valuationUnitsMulHom K) ⁻¹' {valuationUnitsMulHom K x} = + {y : Kˣ | ValuativeRel.valuation K (y : K) = + ValuativeRel.valuation K (x : K)} := by + ext y + exact valuationUnitsMulHom_eq_iff_valuation_eq K y x + rw [hset] + have hopen := + (Valuation.isOpen_sphere (v := ValuativeRel.valuation K) + (r := (ValuativeRel.valuation K).restrict (x : K)) (by simp)).preimage + Units.continuous_val + simpa only [Set.preimage_ofPred_eq, Valuation.restrict_inj] using hopen + +/-- The normalized valuation as a continuous multiplicative homomorphism. -/ +def valuationUnitsContinuousMonoidHom + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : Kˣ →ₜ* Multiplicative Int where + toMonoidHom := valuationUnitsMulHom K + continuous_toFun := valuationUnitsMulHom_continuous K + +/-- The unit factor of one is one. -/ +@[simp] +theorem uniformizerUnitFactor_one + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (ϖ : Kˣ) (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : + uniformizerUnitFactor K ϖ hϖ 1 = 1 := by + apply integerUnitsToFieldUnits_injective K + rw [integerUnitsToFieldUnits_uniformizerUnitFactor] + rw [valuationMap_ofMul_one] + simp + +/-- The unit factor respects multiplication. -/ +theorem uniformizerUnitFactor_mul + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (ϖ : Kˣ) (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (x y : Kˣ) : + uniformizerUnitFactor K ϖ hϖ (x * y) = + uniformizerUnitFactor K ϖ hϖ x * uniformizerUnitFactor K ϖ hϖ y := by + apply integerUnitsToFieldUnits_injective K + rw [map_mul] + simp only [integerUnitsToFieldUnits_uniformizerUnitFactor] + rw [valuationMap_ofMul_mul, zpow_add] + simp only [div_eq_mul_inv, mul_inv_rev] + ac_rfl + +/-- The unit factor in the uniformizer decomposition as a homomorphism. -/ +def uniformizerUnitFactorMonoidHom + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (ϖ : Kˣ) (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : + Kˣ →* 𝒪[K]ˣ where + toFun := uniformizerUnitFactor K ϖ hϖ + map_one' := uniformizerUnitFactor_one K ϖ hϖ + map_mul' := uniformizerUnitFactor_mul K ϖ hϖ + +/-- The unit factor in the uniformizer decomposition is continuous. -/ +theorem uniformizerUnitFactor_continuous + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (ϖ : Kˣ) (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : + Continuous (uniformizerUnitFactor K ϖ hϖ) := by + have hpow : Continuous + (fun n : Multiplicative Int => ϖ ^ Multiplicative.toAdd n) := + continuous_of_discreteTopology + have hexponent : Continuous + (fun x : Kˣ => ϖ ^ valuationMap K (Additive.ofMul x)) := by + change Continuous + (fun x : Kˣ => ϖ ^ Multiplicative.toAdd (valuationUnitsMulHom K x)) + exact hpow.comp (valuationUnitsMulHom_continuous K) + have hquotient : Continuous + (fun x : Kˣ => x / ϖ ^ valuationMap K (Additive.ofMul x)) := + by + apply (continuous_id.mul hexponent.inv).congr + intro x + change x * (ϖ ^ valuationMap K (Additive.ofMul x))⁻¹ = + x / ϖ ^ valuationMap K (Additive.ofMul x) + rw [div_eq_mul_inv] + change Continuous (uniformizerUnitFactorMonoidHom K ϖ hϖ) + apply Continuous.of_coeHom_comp + rw [Topology.IsEmbedding.subtypeVal.continuous_iff] + have hval := Units.continuous_val.comp hquotient + convert hval using 1 + funext x + exact (integerUnitsToFieldUnits_apply K + (uniformizerUnitFactor K ϖ hϖ x)).symm.trans + (congrArg Units.val + (integerUnitsToFieldUnits_uniformizerUnitFactor K ϖ hϖ x)) + +/-- The unit factor in the uniformizer decomposition as a continuous homomorphism. -/ +def uniformizerUnitFactorContinuousMonoidHom + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (ϖ : Kˣ) (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : + Kˣ →ₜ* 𝒪[K]ˣ where + toMonoidHom := uniformizerUnitFactorMonoidHom K ϖ hϖ + continuous_toFun := uniformizerUnitFactor_continuous K ϖ hϖ + +/-- The fixed noncanonical uniformizer used by the parameter-free unit map. -/ +def chosenLocalUniformizer + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : Kˣ := + Classical.choose (valuationMap_uniformiser K) + +/-- The chosen local uniformizer has normalized valuation one. -/ +theorem chosenLocalUniformizer_spec + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + valuationMap K (Additive.ofMul (chosenLocalUniformizer K)) = 1 := + Classical.choose_spec (valuationMap_uniformiser K) + +/-- A parameter-free continuous projection from `Kˣ` to its unit factor. -/ +def localUnitFactorContinuousMonoidHom + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : Kˣ →ₜ* 𝒪[K]ˣ := + uniformizerUnitFactorContinuousMonoidHom K (chosenLocalUniformizer K) + (chosenLocalUniformizer_spec K) + +end LocalFieldTheory.IsNonarchimedeanLocalField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Norm.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Norm.lean new file mode 100644 index 0000000000..d870ac6d19 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Norm.lean @@ -0,0 +1,263 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.LinearAlgebra.Determinant +public import Mathlib.RingTheory.Norm.Transitivity +public import Mathlib.RingTheory.Valuation.Integral +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NormUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuativeExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic +/-! +# Norms in valued field extensions + +Packages field norms as homomorphisms on units and restricts them to valuation +rings and their unit groups under the appropriate integral hypotheses. +-/ + +@[expose] public section +namespace LocalFieldTheory + +noncomputable +section + +universe u v + +namespace IsNonarchimedeanLocalField + +open scoped BigOperators ValuativeRel + +variable {K : Type u} {L : Type v} + +section AlgebraNorm + +variable [Field K] [Field L] [Algebra K L] [Module.Free K L] [Module.Finite K L] + +omit [Module.Free K L] [Module.Finite K L] in +/-- Left multiplication by a nonzero field element is injective as a linear map. -/ +lemma mulLeft_injective_of_ne_zero {x : L} (hx : x ≠ 0) : + Function.Injective (LinearMap.mulLeft K x) := by + intro y z hyz + exact mul_left_cancel₀ hx hyz + +omit [Module.Free K L] [Module.Finite K L] in +/-- Left multiplication by a nonzero field element is surjective as a linear map. -/ +lemma mulLeft_surjective_of_ne_zero {x : L} (hx : x ≠ 0) : + Function.Surjective (LinearMap.mulLeft K x) := by + intro y + refine ⟨x⁻¹ * y, ?_⟩ + simp [LinearMap.mulLeft, hx] + +/-- A bijective linear endomorphism has nonzero determinant. -/ +lemma det_ne_zero_of_bijective (f : L →ₗ[K] L) (hf : Function.Bijective f) : + LinearMap.det f ≠ 0 := by + intro hdet + have hker_ne : LinearMap.ker f ≠ ⊥ := + (LinearMap.det_eq_zero_iff_ker_ne_bot (f := f)).1 hdet + have hker : LinearMap.ker f = ⊥ := + LinearMap.ker_eq_bot.mpr hf.1 + exact hker_ne hker + +end AlgebraNorm + +section UnitNorm + +variable [Field K] [Field L] [Algebra K L] + +/-- Base units embedded in an extension. -/ +def mapBaseUnitsToExtensionUnits + (K : Type u) (L : Type v) [Field K] [Field L] [Algebra K L] : + Kˣ →* Lˣ := + Units.map (algebraMap K L).toMonoidHom + + +/-- The inclusion of base-field units into extension-field units agrees with the algebra map on +underlying elements. -/ +@[simp] +lemma mapBaseUnitsToExtensionUnits_apply_coe (x : Kˣ) : + ((mapBaseUnitsToExtensionUnits K L x : Lˣ) : L) = algebraMap K L (x : K) := + rfl + +/-- The norm of a base unit embedded in the extension is its underlying element raised to the +extension degree. -/ +lemma normUnits_mapBaseUnitsToExtensionUnits_apply_coe (x : Kˣ) : + ((normUnits K L (mapBaseUnitsToExtensionUnits K L x) : Kˣ) : K) = + (x : K) ^ Module.finrank K L := by + simp [normUnits, mapBaseUnitsToExtensionUnits, Algebra.norm_algebraMap] + +/-- The unit norm of an embedded base unit is the degree-th power of that base unit. -/ +lemma normUnits_algebraMap_base (x : Kˣ) : + normUnits K L (mapBaseUnitsToExtensionUnits K L x) = + Units.map (MonoidHom.id K) (x ^ Module.finrank K L) := by + ext + simp [normUnits, mapBaseUnitsToExtensionUnits, Algebra.norm_algebraMap] + +/-- The field norm is invariant under `K`-algebra automorphisms of the extension. -/ +lemma normUnits_algEquiv_apply (σ : L ≃ₐ[K] L) (x : Lˣ) : + normUnits K L (Units.mapEquiv σ.toMulEquiv x) = normUnits K L x := by + ext + exact Algebra.norm_eq_of_algEquiv σ (x : L) + +/-- The norm of an element integral over the base valuation ring lies in the base valuation ring. -/ +lemma algebraNorm_mem_integers_of_mem_integers [ValuativeRel K] [ValuativeRel L] + [LocalFieldTheory.ValuativeExtension K L] (x : 𝒪[L]) : + Algebra.norm K (x : L) ∈ 𝒪[K] := by + exact Valuation.Integers.mem_of_integral + (Valuation.integer.integers (ValuativeRel.valuation K)) + (Algebra.isIntegral_norm K (LocalFieldTheory.ValuativeExtension.integer_isIntegral x)) + +/-- An element of an integral-closure valuation ring is integral over the base valuation ring. -/ +lemma integer_element_isIntegral_over_base_integer_of_isIntegralClosure [ValuativeRel K] + [ValuativeRel L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] (x : 𝒪[L]) : + IsIntegral 𝒪[K] (x : L) := + (IsIntegralClosure.isIntegral_iff (A := 𝒪[L]) (R := 𝒪[K]) (B := L)).2 ⟨x, rfl⟩ + +/-- Under an integral-closure identification, the norm of a target valuation-ring element lies in +the base valuation ring. -/ +lemma algebraNorm_mem_integers_of_mem_integers_of_isIntegralClosure [ValuativeRel K] + [ValuativeRel L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] (x : 𝒪[L]) : + Algebra.norm K (x : L) ∈ 𝒪[K] := by + exact Valuation.Integers.mem_of_integral + (Valuation.integer.integers (ValuativeRel.valuation K)) + (Algebra.isIntegral_norm K + (integer_element_isIntegral_over_base_integer_of_isIntegralClosure x)) + +/-- A target valuation-ring element is integral over the base valuation ring. -/ +lemma integer_element_isIntegral_over_base_integer [ValuativeRel K] [ValuativeRel L] + [LocalFieldTheory.ValuativeExtension K L] (x : 𝒪[L]) : + IsIntegral 𝒪[K] (x : L) := + LocalFieldTheory.ValuativeExtension.integer_isIntegral x + +/-- A valuation-ring element in a finite valuative extension is integral over the base valuation +ring. -/ +lemma integer_element_isIntegral_over_base_integer_of_valuativeExtension [ValuativeRel K] + [ValuativeRel L] [LocalFieldTheory.ValuativeExtension K L] (x : 𝒪[L]) : + IsIntegral 𝒪[K] (x : L) := + integer_element_isIntegral_over_base_integer x + +/-- The algebra norm of an element integral over the base ring is integral over that ring. -/ +lemma algebraNorm_isIntegral_of_isIntegral + {R : Type u} [CommRing R] [Algebra R K] [Algebra R L] [IsScalarTower R K L] + {x : L} (hx : IsIntegral R x) : + IsIntegral R (Algebra.norm K x) := + Algebra.isIntegral_norm K hx + +/-- An element of the base field integral over its valuation ring belongs to that valuation ring. -/ +lemma mem_integers_of_isIntegral_base [ValuativeRel K] {x : K} + (hx : IsIntegral 𝒪[K] x) : + x ∈ 𝒪[K] := + Valuation.Integers.mem_of_integral + (Valuation.integer.integers (ValuativeRel.valuation K)) hx + +/-- The norm of an element integral over the base valuation ring belongs to the base valuation ring. +The norm of an element integral over the base valuation ring belongs to the base valuation ring. -/ +lemma algebraNorm_mem_integers_of_isIntegral [ValuativeRel K] + {x : L} (hx : IsIntegral 𝒪[K] x) : + Algebra.norm K x ∈ 𝒪[K] := + mem_integers_of_isIntegral_base (K := K) + (algebraNorm_isIntegral_of_isIntegral (K := K) (L := L) (R := 𝒪[K]) hx) + +/-- The norm of a target valuation-ring element has base valuation at most one. -/ +lemma valuation_norm_le_one_of_integer [ValuativeRel K] {x : K} + (hx : x ∈ 𝒪[K]) : + ValuativeRel.valuation K x ≤ 1 := + (Valuation.mem_integer_iff (ValuativeRel.valuation K) x).1 hx + +/-- The inverse norm of a target valuation-ring unit also belongs to the base valuation ring. -/ +lemma algebraNorm_inv_mem_integers_of_unit [ValuativeRel K] [ValuativeRel L] + [LocalFieldTheory.ValuativeExtension K L] (x : 𝒪[L]ˣ) : + Algebra.norm K (((x⁻¹ : 𝒪[L]ˣ) : 𝒪[L]) : L) ∈ 𝒪[K] := + algebraNorm_mem_integers_of_mem_integers (((x⁻¹ : 𝒪[L]ˣ) : 𝒪[L])) + +/-- Defines `normIntegerUnitsValue`. -/ +def normIntegerUnitsValue [ValuativeRel K] [ValuativeRel L] + [LocalFieldTheory.ValuativeExtension K L] (x : 𝒪[L]ˣ) : 𝒪[K] := + ⟨Algebra.norm K (((x : 𝒪[L]ˣ) : 𝒪[L]) : L), + algebraNorm_mem_integers_of_mem_integers ((x : 𝒪[L]ˣ) : 𝒪[L])⟩ + +/-- The norm value constructed from an integer unit multiplied by its inverse is one. -/ +lemma normIntegerUnitsValue_mul_inv [ValuativeRel K] [ValuativeRel L] + [LocalFieldTheory.ValuativeExtension K L] (x : 𝒪[L]ˣ) : + normIntegerUnitsValue (K := K) (L := L) x * + normIntegerUnitsValue (K := K) (L := L) x⁻¹ = 1 := by + ext + change Algebra.norm K (((x : 𝒪[L]ˣ) : 𝒪[L]) : L) * + Algebra.norm K (((x⁻¹ : 𝒪[L]ˣ) : 𝒪[L]) : L) = 1 + have hx : (((x : 𝒪[L]ˣ) : 𝒪[L]) : L) * + (((x⁻¹ : 𝒪[L]ˣ) : 𝒪[L]) : L) = 1 := by + change (((x * x⁻¹ : 𝒪[L]ˣ) : 𝒪[L]) : L) = 1 + simp + rw [← map_mul (Algebra.norm K)] + simp [hx] + +/-- The inverse norm value multiplied by the norm value of an integer unit is one. -/ +lemma normIntegerUnitsValue_inv_mul [ValuativeRel K] [ValuativeRel L] + [LocalFieldTheory.ValuativeExtension K L] (x : 𝒪[L]ˣ) : + normIntegerUnitsValue (K := K) (L := L) x⁻¹ * + normIntegerUnitsValue (K := K) (L := L) x = 1 := by + ext + change Algebra.norm K (((x⁻¹ : 𝒪[L]ˣ) : 𝒪[L]) : L) * + Algebra.norm K (((x : 𝒪[L]ˣ) : 𝒪[L]) : L) = 1 + have hx : (((x⁻¹ : 𝒪[L]ˣ) : 𝒪[L]) : L) * + (((x : 𝒪[L]ˣ) : 𝒪[L]) : L) = 1 := by + change (((x⁻¹ * x : 𝒪[L]ˣ) : 𝒪[L]) : L) = 1 + simp + rw [← map_mul (Algebra.norm K)] + simp [hx] + +/-- Norm restricted to valuation-integer units. -/ +def normIntegerUnits + (K : Type u) (L : Type v) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] + [Algebra K L] [LocalFieldTheory.ValuativeExtension K L] : 𝒪[L]ˣ →* 𝒪[K]ˣ where + toFun := fun x => { + val := normIntegerUnitsValue (K := K) (L := L) x + inv := normIntegerUnitsValue (K := K) (L := L) x⁻¹ + val_inv := normIntegerUnitsValue_mul_inv (K := K) (L := L) x + inv_val := normIntegerUnitsValue_inv_mul (K := K) (L := L) x + } + map_one' := by + ext + simp [normIntegerUnitsValue] + map_mul' := by + intro x y + ext + simp [normIntegerUnitsValue] + +/-- Coercing the integer-unit norm to the base field yields the algebra norm of the original +unit. -/ +lemma normIntegerUnits_apply_coe [ValuativeRel K] [ValuativeRel L] + [LocalFieldTheory.ValuativeExtension K L] (x : 𝒪[L]ˣ) : + (((normIntegerUnits K L x : 𝒪[K]ˣ) : 𝒪[K]) : K) = + Algebra.norm K (((x : 𝒪[L]ˣ) : 𝒪[L]) : L) := + rfl + +end UnitNorm + +section Valuation + +variable [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] +variable [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] +variable [Algebra K L] + +omit [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] in +/-- For a finite Galois extension, embedding the unit norm back into the extension equals the +product of all Galois conjugates. -/ +lemma mapBaseUnits_normUnits_eq_prod_gal [FiniteDimensional K L] [IsGalois K L] + (x : Lˣ) : + mapBaseUnitsToExtensionUnits K L (normUnits K L x) = + ∏ σ : L ≃ₐ[K] L, Units.mapEquiv σ.toMulEquiv x := by + ext + simp [mapBaseUnitsToExtensionUnits, normUnits, Algebra.norm_eq_prod_automorphisms] + +end Valuation + +end IsNonarchimedeanLocalField + +end +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormContinuity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormContinuity.lean new file mode 100644 index 0000000000..fd88da7264 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormContinuity.lean @@ -0,0 +1,71 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NormUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic +public import Mathlib.Analysis.Normed.Module.FiniteDimension +public import Mathlib.Topology.Instances.Matrix +/-! +# Continuity of finite field norms + +This module records the analytic input used by the topological finite local +reciprocity law: on a finite-dimensional normed algebra, the field norm is a +determinant and is therefore continuous. It also bundles the corresponding +statements for field units and valuation-ring units. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace LocalFieldTheory + +open scoped ValuativeRel +open _root_.LocalFieldTheory.IsNonarchimedeanLocalField + +/-- The field norm of a finite-dimensional normed algebra over a complete +nontrivially normed field is continuous. -/ +theorem algebraNorm_continuous_of_finiteDimensional + (K : Type u) (L : Type v) + [NontriviallyNormedField K] [NormedField L] + [Algebra K L] [FiniteDimensional K L] [CompleteSpace K] + [ContinuousSMul K L] : + Continuous (Algebra.norm K : L → K) := by + classical + let b := Module.Free.chooseBasis K L + rw [show (Algebra.norm K : L → K) = + fun x => (Algebra.leftMulMatrix b x).det by + funext x + exact Algebra.norm_eq_matrix_det b x] + apply Continuous.matrix_det + exact (Algebra.leftMulMatrix b).toLinearMap.continuous_of_finiteDimensional + +/-- The field norm induced on unit groups is continuous. -/ +theorem normUnits_continuous_of_finiteDimensional + (K : Type u) (L : Type v) + [NontriviallyNormedField K] [NormedField L] + [Algebra K L] [FiniteDimensional K L] [CompleteSpace K] + [ContinuousSMul K L] : + Continuous (normUnits K L) := by + unfold normUnits + exact Continuous.units_map (Algebra.norm K : L →* K) + (algebraNorm_continuous_of_finiteDimensional K L) + +/-- The canonical inclusion from valuation-ring units to field units is +continuous for the subtype topologies. -/ +theorem integerUnitsToFieldUnits_continuous + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] : + Continuous (integerUnitsToFieldUnits K) := by + unfold IsNonarchimedeanLocalField.integerUnitsToFieldUnits + exact Continuous.units_map + ((algebraMap 𝒪[K] K).toMonoidHom) continuous_subtype_val + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormQuotient.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormQuotient.lean new file mode 100644 index 0000000000..fcc654fbdc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormQuotient.lean @@ -0,0 +1,387 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NormUnits +public import Mathlib.Algebra.Group.Subgroup.Basic +public import Mathlib.Data.Finset.Basic +public import Mathlib.GroupTheory.OrderOfElement +public import Mathlib.GroupTheory.QuotientGroup.Basic +public import Mathlib.LinearAlgebra.FiniteDimensional.Basic +public import Mathlib.RingTheory.Norm.Basic +/-! +# Quotients by local norm subgroups + +Constructs `Kˣ/N(Lˣ)`, its universal maps and comparison equivalences, and +relates its finite cardinality to the index of the norm subgroup. +-/ + +@[expose] public section + +namespace LocalFieldTheory + +noncomputable +section + +universe u v + +/-- The norm subgroup N_{L/K}(Lˣ) ≤ Kˣ. -/ +def localNormSubgroup (K L : Type u) [Field K] [Field L] [Algebra K L] : Subgroup Kˣ := + (normUnits K L).range + +/-- Units modulo field norms. -/ +def NormQuotient (K L : Type u) [Field K] [Field L] [Algebra K L] : Type u := + Kˣ ⧸ localNormSubgroup K L + +/-- Field units modulo the local norm subgroup form a commutative group. -/ +instance normQuotientCommGroup (K L : Type u) [Field K] [Field L] [Algebra K L] : + CommGroup (NormQuotient K L) := by + change CommGroup (Kˣ ⧸ localNormSubgroup K L) + infer_instance + +/-- The explicit boundary to the concrete quotient implementation. Clients +that need quotient-level constructions should use this equivalence instead of +unfolding `NormQuotient`. -/ +def normQuotientConcreteEquiv + (K L : Type u) [Field K] [Field L] [Algebra K L] : + NormQuotient K L ≃* Kˣ ⧸ localNormSubgroup K L := by + change (Kˣ ⧸ localNormSubgroup K L) ≃* Kˣ ⧸ localNormSubgroup K L + exact MulEquiv.refl _ + +/-- Defines `normClass`. -/ +def normClass (K L : Type u) [Field K] [Field L] [Algebra K L] : + Kˣ →* NormQuotient K L := by + change Kˣ →* Kˣ ⧸ localNormSubgroup K L + let N := localNormSubgroup K L + exact QuotientGroup.mk' N + +/-- The concrete quotient equivalence sends a norm class to the quotient class of its +representative. -/ +@[simp] +theorem normQuotientConcreteEquiv_normClass + (K L : Type u) [Field K] [Field L] [Algebra K L] (x : Kˣ) : + normQuotientConcreteEquiv K L (normClass K L x) = + QuotientGroup.mk x := by + rfl + +/-- Define a homomorphism out of a norm quotient from a homomorphism on +`Kˣ` that kills every local norm. -/ +def normQuotientLift {K L : Type u} {M : Type v} [Field K] [Field L] [Algebra K L] + [Group M] (f : Kˣ →* M) (h : localNormSubgroup K L ≤ f.ker) : + NormQuotient K L →* M := by + change (Kˣ ⧸ localNormSubgroup K L) →* M + let N := localNormSubgroup K L + exact QuotientGroup.lift N f h + +/-- A homomorphism descended through the norm quotient agrees with the original homomorphism on +representatives. -/ +@[simp] +theorem normQuotientLift_normClass {K L : Type u} {M : Type v} [Field K] [Field L] + [Algebra K L] [Group M] (f : Kˣ →* M) + (h : localNormSubgroup K L ≤ f.ker) (x : Kˣ) : + normQuotientLift f h (normClass K L x) = f x := by + rfl + +/-- A map obtained by descending a surjective homomorphism through the norm +quotient is still surjective. -/ +theorem normQuotientLift_surjective {K L : Type u} {M : Type v} [Field K] [Field L] + [Algebra K L] [Group M] (f : Kˣ →* M) + (h : localNormSubgroup K L ≤ f.ker) (hf : Function.Surjective f) : + Function.Surjective (normQuotientLift f h) := by + intro y + obtain ⟨x, rfl⟩ := hf y + exact ⟨normClass K L x, normQuotientLift_normClass f h x⟩ + +/-- Identify a norm quotient with any concrete quotient once its defining +subgroup has been identified. This is the sole public boundary for such +representation changes. -/ +def normQuotientEquivOfSubgroupEq + (K L : Type u) [Field K] [Field L] [Algebra K L] + (N : Subgroup Kˣ) (h : localNormSubgroup K L = N) : + NormQuotient K L ≃* Kˣ ⧸ N := by + change (Kˣ ⧸ localNormSubgroup K L) ≃* (Kˣ ⧸ N) + exact QuotientGroup.quotientMulEquivOfEq h + +/-- After identifying the norm subgroup with another subgroup, a norm class maps to the +corresponding quotient class. -/ +@[simp] +theorem normQuotientEquivOfSubgroupEq_normClass + (K L : Type u) [Field K] [Field L] [Algebra K L] + (N : Subgroup Kˣ) (h : localNormSubgroup K L = N) (x : Kˣ) : + normQuotientEquivOfSubgroupEq K L N h (normClass K L x) = + QuotientGroup.mk x := by + change QuotientGroup.quotientMulEquivOfEq h (QuotientGroup.mk x) = + QuotientGroup.mk x + exact QuotientGroup.quotientMulEquivOfEq_mk h x + +/-- Identify two norm quotients when their defining norm subgroups agree. -/ +def normQuotientEquivOfNormSubgroupEq + (K L M : Type u) [Field K] [Field L] [Field M] + [Algebra K L] [Algebra K M] + (h : localNormSubgroup K L = localNormSubgroup K M) : + NormQuotient K L ≃* NormQuotient K M := by + change (Kˣ ⧸ localNormSubgroup K L) ≃* (Kˣ ⧸ localNormSubgroup K M) + exact QuotientGroup.quotientMulEquivOfEq h + +/-- An equality of norm subgroups identifies norm classes represented by the same base-field unit. +An equality of norm subgroups identifies norm classes represented by the same base-field unit. -/ +@[simp] +theorem normQuotientEquivOfNormSubgroupEq_normClass + (K L M : Type u) [Field K] [Field L] [Field M] + [Algebra K L] [Algebra K M] + (h : localNormSubgroup K L = localNormSubgroup K M) (x : Kˣ) : + normQuotientEquivOfNormSubgroupEq K L M h (normClass K L x) = + normClass K M x := by + change QuotientGroup.quotientMulEquivOfEq h (QuotientGroup.mk x) = + QuotientGroup.mk x + exact QuotientGroup.quotientMulEquivOfEq_mk h x + +/-- First isomorphism theorem with an opaque norm quotient as its source. -/ +def normQuotientEquivOfSurjective + {K L : Type u} {M : Type v} [Field K] [Field L] [Algebra K L] + [Group M] (f : Kˣ →* M) (hf : Function.Surjective f) + (hker : f.ker = localNormSubgroup K L) : NormQuotient K L ≃* M := by + change (Kˣ ⧸ localNormSubgroup K L) ≃* M + exact (QuotientGroup.quotientMulEquivOfEq hker.symm).trans + (QuotientGroup.quotientKerEquivOfSurjective f hf) + +/-- The first-isomorphism equivalence sends a norm class to the image of its representative. -/ +@[simp] +theorem normQuotientEquivOfSurjective_normClass + {K L : Type u} {M : Type v} [Field K] [Field L] [Algebra K L] + [Group M] (f : Kˣ →* M) (hf : Function.Surjective f) + (hker : f.ker = localNormSubgroup K L) (x : Kˣ) : + normQuotientEquivOfSurjective f hf hker (normClass K L x) = f x := by + change + ((QuotientGroup.quotientMulEquivOfEq hker.symm).trans + (QuotientGroup.quotientKerEquivOfSurjective f hf)) + (QuotientGroup.mk x) = f x + rw [MulEquiv.trans_apply, QuotientGroup.quotientMulEquivOfEq_mk] + rfl + +/-- Eliminate a norm-quotient class through the canonical quotient map, +without exposing the quotient representation to clients. -/ +protected theorem NormQuotient.inductionOn {K L : Type u} [Field K] [Field L] + [Algebra K L] {motive : NormQuotient K L → Prop} + (q : NormQuotient K L) + (h : ∀ x : Kˣ, motive (normClass K L x)) : motive q := by + change motive (show Kˣ ⧸ localNormSubgroup K L from q) + refine QuotientGroup.induction_on q ?_ + intro x + exact h x + +/-- The quotient class of any extension-unit norm is the identity norm class. -/ +theorem mk_normUnits_eq_one (K L : Type u) [Field K] [Field L] [Algebra K L] (x : Lˣ) : + normClass K L (normUnits K L x) = 1 := by + exact (QuotientGroup.eq_one_iff (normUnits K L x)).2 ⟨x, rfl⟩ + +/-- A base-field unit has trivial norm class exactly when it lies in the local norm subgroup. -/ +theorem normClass_eq_one_iff (K L : Type u) [Field K] [Field L] + [Algebra K L] (x : Kˣ) : + normClass K L x = 1 ↔ ∃ y : Lˣ, normUnits K L y = x := by + rw [← MonoidHom.mem_range] + exact QuotientGroup.eq_one_iff x + +/-- Two units have the same norm class exactly when their quotient is a local norm. -/ +theorem normClass_eq_iff_div_mem (K L : Type u) [Field K] [Field L] + [Algebra K L] (x y : Kˣ) : + normClass K L x = normClass K L y ↔ + x / y ∈ localNormSubgroup K L := + by + let N := localNormSubgroup K L + exact QuotientGroup.eq_iff_div_mem (N := N) + +/-- The kernel of the norm-class homomorphism is the local norm subgroup. -/ +theorem normClass_ker (K L : Type u) [Field K] [Field L] [Algebra K L] : + MonoidHom.ker (normClass K L) = localNormSubgroup K L := + by + let N := localNormSubgroup K L + exact QuotientGroup.ker_mk' (N := N) + +/-- Membership in the kernel of the norm-class map is equivalent to membership in the local norm +subgroup. -/ +theorem normClass_mem_ker_iff (K L : Type u) [Field K] [Field L] + [Algebra K L] (x : Kˣ) : + x ∈ MonoidHom.ker (normClass K L) ↔ x ∈ localNormSubgroup K L := by + rw [normClass_ker K L] + +/-- A norm class is one exactly when its representative is a local norm. -/ +theorem normClass_eq_one_iff_mem (K L : Type u) [Field K] [Field L] + [Algebra K L] (x : Kˣ) : + normClass K L x = 1 ↔ x ∈ localNormSubgroup K L := by + rw [← normClass_mem_ker_iff K L x] + rfl + +/-- The map of norm quotients induced by inclusion of their norm subgroups. -/ +def normQuotientMapOfLE + (K L M : Type u) [Field K] [Field L] [Field M] + [Algebra K L] [Algebra K M] + (h : localNormSubgroup K L ≤ localNormSubgroup K M) : + NormQuotient K L →* NormQuotient K M := + normQuotientLift (normClass K M) fun x hx => + (normClass_eq_one_iff_mem K M x).2 (h hx) + +/-- The quotient map induced by inclusion of norm subgroups preserves representatives. -/ +@[simp] +theorem normQuotientMapOfLE_normClass + (K L M : Type u) [Field K] [Field L] [Field M] + [Algebra K L] [Algebra K M] + (h : localNormSubgroup K L ≤ localNormSubgroup K M) (x : Kˣ) : + normQuotientMapOfLE K L M h (normClass K L x) = normClass K M x := by + exact normQuotientLift_normClass (normClass K M) _ x + +/-- Over the identity extension, the unit norm fixes every base-field unit. -/ +theorem normUnits_self_apply (K : Type u) [Field K] (x : Kˣ) : + normUnits K K x = x := by + ext + simp [normUnits] + +/-- For the identity extension, every base-field unit is a norm. -/ +theorem localNormSubgroup_self (K : Type u) [Field K] : + localNormSubgroup K K = ⊤ := by + ext x + constructor + · intro _ + exact Subgroup.mem_top x + · intro _ + exact ⟨x, normUnits_self_apply K x⟩ + +/-- Every norm class for the identity extension is the identity. -/ +theorem normQuotient_self_eq_one (K : Type u) [Field K] (x : NormQuotient K K) : + x = 1 := by + refine NormQuotient.inductionOn (motive := fun q => q = 1) x ?_ + intro a + exact (normClass_eq_one_iff_mem K K a).2 (by + rw [localNormSubgroup_self K] + exact Subgroup.mem_top a) + +/-- The norm quotient of a field over itself is a subsingleton. -/ +instance normQuotient_self_subsingleton (K : Type u) [Field K] : + Subsingleton (NormQuotient K K) where + allEq x y := by + rw [normQuotient_self_eq_one K x, normQuotient_self_eq_one K y] + +/-- A representative from the local norm subgroup has trivial norm class. -/ +theorem normClass_eq_one_of_mem (K L : Type u) [Field K] [Field L] + [Algebra K L] {x : Kˣ} (hx : x ∈ localNormSubgroup K L) : + normClass K L x = 1 := + (normClass_eq_one_iff_mem K L x).2 hx + +/-- An integral power of a unit norm has trivial norm class. -/ +theorem normClass_normUnits_zpow_eq_one + (K L : Type u) [Field K] [Field L] [Algebra K L] (x : Lˣ) (n : Int) : + normClass K L ((normUnits K L x) ^ n) = 1 := by + rw [map_zpow, mk_normUnits_eq_one, one_zpow] + +/-- Two norm classes agree exactly when their representatives differ by a unit norm. -/ +theorem normClass_eq_iff_exists_norm_div (K L : Type u) + [Field K] [Field L] [Algebra K L] (x y : Kˣ) : + normClass K L x = normClass K L y ↔ + ∃ z : Lˣ, x / y = normUnits K L z := by + rw [normClass_eq_iff_div_mem K L x y] + change x / y ∈ (normUnits K L).range ↔ _ + rw [MonoidHom.mem_range] + constructor + · rintro ⟨z, hz⟩ + exact ⟨z, hz.symm⟩ + · rintro ⟨z, hz⟩ + exact ⟨z, hz.symm⟩ + +/-- Multiplying a representative on the left by a unit norm leaves its norm class unchanged. -/ +theorem normClass_normUnits_mul (K L : Type u) + [Field K] [Field L] [Algebra K L] (z : Lˣ) (x : Kˣ) : + normClass K L (normUnits K L z * x) = normClass K L x := by + rw [map_mul, mk_normUnits_eq_one] + exact one_mul (normClass K L x) + +/-- Multiplying a representative on the right by a unit norm leaves its norm class unchanged. -/ +theorem normClass_mul_normUnits (K L : Type u) + [Field K] [Field L] [Algebra K L] (x : Kˣ) (z : Lˣ) : + normClass K L (x * normUnits K L z) = normClass K L x := by + rw [map_mul, mk_normUnits_eq_one] + exact mul_one (normClass K L x) + +/-- Left multiplication by an integral power of a unit norm leaves a norm class unchanged. -/ +theorem normClass_normUnits_zpow_mul (K L : Type u) + [Field K] [Field L] [Algebra K L] (z : Lˣ) (n : Int) (x : Kˣ) : + normClass K L ((normUnits K L z) ^ n * x) = + normClass K L x := by + rw [map_mul, normClass_normUnits_zpow_eq_one K L z n] + exact one_mul (normClass K L x) + +/-- Right multiplication by an integral power of a unit norm leaves a norm class unchanged. -/ +theorem normClass_mul_normUnits_zpow (K L : Type u) + [Field K] [Field L] [Algebra K L] (x : Kˣ) (z : Lˣ) (n : Int) : + normClass K L (x * (normUnits K L z) ^ n) = + normClass K L x := by + rw [map_mul, normClass_normUnits_zpow_eq_one K L z n] + exact mul_one (normClass K L x) + +/-! ### Surjectivity and equality refinements for norm quotients -/ + +/-- A representative obtained by multiplying another by a unit norm defines the same norm class. -/ +theorem normClass_eq_of_eq_normUnits_mul (K L : Type u) + [Field K] [Field L] [Algebra K L] {x y : Kˣ} (z : Lˣ) + (h : x = normUnits K L z * y) : + normClass K L x = normClass K L y := by + rw [h, normClass_normUnits_mul] + +/-- Two norm classes agree exactly when one representative times the other's inverse is a local +norm. -/ +theorem normClass_eq_iff_mul_inv_mem (K L : Type u) + [Field K] [Field L] [Algebra K L] (x y : Kˣ) : + normClass K L x = normClass K L y ↔ + x * y⁻¹ ∈ localNormSubgroup K L := by + simpa [div_eq_mul_inv] using normClass_eq_iff_div_mem K L x y + +/-- Two norm classes agree exactly when a unit norm converts the second representative to the first +on the left. -/ +theorem normClass_eq_iff_exists_norm_mul_left (K L : Type u) + [Field K] [Field L] [Algebra K L] (x y : Kˣ) : + normClass K L x = normClass K L y ↔ + ∃ z : Lˣ, x = normUnits K L z * y := by + constructor + · intro hxy + rcases (normClass_eq_iff_exists_norm_div K L x y).1 hxy with ⟨z, hz⟩ + refine ⟨z, ?_⟩ + rw [← hz] + exact (div_mul_cancel x y).symm + · rintro ⟨z, hz⟩ + exact normClass_eq_of_eq_normUnits_mul K L z hz + +/-- Two norm classes agree exactly when a unit norm converts the second representative to the first +on the right. -/ +theorem normClass_eq_iff_exists_norm_mul_right (K L : Type u) + [Field K] [Field L] [Algebra K L] (x y : Kˣ) : + normClass K L x = normClass K L y ↔ + ∃ z : Lˣ, x = y * normUnits K L z := by + constructor + · intro hxy + rcases (normClass_eq_iff_exists_norm_mul_left K L x y).1 hxy with ⟨z, hz⟩ + exact ⟨z, by simpa [mul_comm] using hz⟩ + · rintro ⟨z, hz⟩ + rw [hz] + exact normClass_mul_normUnits K L y z + +/-- If the unit norm is surjective, all base-field units have the same norm class. -/ +theorem normClass_eq_all_of_normUnits_surjective (K L : Type u) + [Field K] [Field L] [Algebra K L] + (h : Function.Surjective (normUnits K L)) (x y : Kˣ) : + normClass K L x = normClass K L y := by + apply (normClass_eq_iff_div_mem K L x y).2 + exact MonoidHom.mem_range.mpr (h (x / y)) + +/-- If every base-field unit is a local norm, all norm classes coincide. -/ +theorem normClass_eq_of_localNormSubgroup_eq_top (K L : Type u) + [Field K] [Field L] [Algebra K L] (h : localNormSubgroup K L = ⊤) (x y : Kˣ) : + normClass K L x = normClass K L y := + (normClass_eq_iff_div_mem K L x y).2 (by + rw [h] + exact Subgroup.mem_top (x / y)) + +end +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormSubgroupFunctoriality.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormSubgroupFunctoriality.lean new file mode 100644 index 0000000000..68c03318e7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormSubgroupFunctoriality.lean @@ -0,0 +1,87 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient +/-! +# Functoriality of finite-extension norm subgroups + +The local existence proof repeatedly enlarges a finite extension and replaces +finite extensions by isomorphic realizations. This file records the resulting +identities for unit norms and their images in the base field. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalFieldTheory + +open LocalFieldTheory + +/-- Enlarging the top field in a finite tower can only shrink its norm +subgroup in the base field. -/ +theorem normSubgroup_le_of_tower + (K M L : Type) [Field K] [Field M] [Field L] + [Algebra K M] [Algebra M L] [Algebra K L] + [IsScalarTower K M L] : + localNormSubgroup K L ≤ localNormSubgroup K M := by + rintro x ⟨y, rfl⟩ + refine ⟨normUnits M L y, ?_⟩ + exact normUnits_tower K M L y + +/-- The norm on units is unchanged after replacing a finite extension by an +isomorphic realization. -/ +theorem normUnits_algEquiv + (K L M : Type) [Field K] [Field L] [Field M] + [Algebra K L] [Algebra K M] + (e : L ≃ₐ[K] M) (x : Lˣ) : + normUnits K M (Units.mapEquiv e.toMulEquiv x) = normUnits K L x := by + apply Units.ext + exact Algebra.norm_eq_of_algEquiv e (x : L) + +/-- Norm subgroups are unchanged after replacing an extension by an +isomorphic realization. -/ +theorem normSubgroup_algEquiv + (K L M : Type) [Field K] [Field L] [Field M] + [Algebra K L] [Algebra K M] + (e : L ≃ₐ[K] M) : + localNormSubgroup K M = localNormSubgroup K L := by + ext x + constructor + · rintro ⟨y, rfl⟩ + let z : Lˣ := Units.mapEquiv e.symm.toMulEquiv y + refine ⟨z, ?_⟩ + have hz : Units.mapEquiv e.toMulEquiv z = y := by + exact (Units.mapEquiv e.toMulEquiv).apply_symm_apply y + calc + normUnits K L z = + normUnits K M (Units.mapEquiv e.toMulEquiv z) := + (normUnits_algEquiv K L M e z).symm + _ = normUnits K M y := congrArg (normUnits K M) hz + · rintro ⟨x, rfl⟩ + refine ⟨Units.mapEquiv e.toMulEquiv x, ?_⟩ + exact normUnits_algEquiv K L M e x + +/-- An algebra embedding of finite extensions reverses inclusion of their +norm subgroups. -/ +theorem normSubgroup_le_of_algHom + (K M D : Type) [Field K] [Field M] [Field D] + [Algebra K M] [Algebra K D] + [FiniteDimensional K D] + (i : M →ₐ[K] D) : + localNormSubgroup K D ≤ localNormSubgroup K M := by + let : Algebra M D := i.toRingHom.toAlgebra + let : IsScalarTower K M D := IsScalarTower.of_algebraMap_eq fun x => by + exact (i.commutes x).symm + let : FiniteDimensional M D := FiniteDimensional.right K M D + exact normSubgroup_le_of_tower K M D + +end LocalFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormalizedIntegerValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormalizedIntegerValuation.lean new file mode 100644 index 0000000000..9c0b5b2d9c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormalizedIntegerValuation.lean @@ -0,0 +1,304 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AdicPower +/-! +# The normalized integer valuation of a local field + +The Kummer branch of the local existence theorem uses power-class index +formulas stated for valuations with value group +`WithZero (Multiplicative ℤ)`. A nonarchimedean local field carries its +canonical valuation in an intrinsic value group. This file transports that +valuation to the integer model and proves that completeness and the finite +residue field are preserved. +-/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + moduleFinite_target_valuationSubring_of_finite_separable → + moduleFinite_target_valuationSubring_of_finite_separable + + +noncomputable +section + +namespace LocalFieldTheory + +open scoped ValuativeRel + +universe u + +variable (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The canonical local valuation, normalized to the value group +`WithZero (Multiplicative ℤ)`. -/ +noncomputable def localIntegerValuation : + _root_.Valuation K (WithZero (Multiplicative ℤ)) := + _root_.Valuation.map + (IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K).toMulEquiv.toMonoidWithZeroHom + (IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K).toOrderIso.monotone + (ValuativeRel.valuation K) + +/-- The integer-valued valuation applies the canonical value-group isomorphism. -/ +@[simp] +theorem localIntegerValuation_apply (x : K) : + localIntegerValuation K x = + IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K + (ValuativeRel.valuation K x) := + rfl + +/-- The valuation in the canonical complete-DVF package is the original local valuation. -/ +theorem localCompleteDVF_valuation_eq : + (localCompleteDVF K).valuation = ValuativeRel.valuation K := by + unfold localCompleteDVF + unfold ValuationTheory.Valuations.completeDVFOfCompleteValuedField + rfl + +/-- A finite separable local extension is finite over the actual canonical +valuation integer ring. This transports the finite-module theorem for the +complete-DVF packages along the equality of their valuations. -/ +theorem integerRing_moduleFinite_of_finite_separable + (L : Type u) [Field L] [Algebra K L] [FiniteDimensional K L] + [Algebra.IsSeparable K L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] : + Module.Finite + (ValuativeRel.valuation K).integer + (ValuativeRel.valuation L).integer := by + let : + (localCompleteDVF K).valuation.HasExtension + (localCompleteDVF L).valuation := + localCompleteDVFValuation_hasExtension K L + let : + IsScalarTower (localCompleteDVF K).valuationSubring + (localCompleteDVF L).valuationSubring L := + IsScalarTower.of_algebraMap_eq' rfl + let : + Module.Finite (localCompleteDVF K).valuationSubring + (localCompleteDVF L).valuationSubring := + moduleFinite_target_valuationSubring_of_finite_separable + (localCompleteDVF K) (localCompleteDVF L) + have hK : + (ValuativeRel.valuation K).integer = + ((localCompleteDVF K).valuation.valuationSubring).toSubring := by + ext x + change + (ValuativeRel.valuation K) x ≤ 1 ↔ + (localCompleteDVF K).valuation x ≤ 1 + rw [localCompleteDVF_valuation_eq] + rfl + have hL : + (ValuativeRel.valuation L).integer = + ((localCompleteDVF L).valuation.valuationSubring).toSubring := by + ext x + change + (ValuativeRel.valuation L) x ≤ 1 ↔ + (localCompleteDVF L).valuation x ≤ 1 + rw [localCompleteDVF_valuation_eq] + rfl + let eK : + (localCompleteDVF K).valuationSubring ≃+* + (ValuativeRel.valuation K).integer := + RingEquiv.subringCongr hK.symm + let eL : + (localCompleteDVF L).valuationSubring ≃+* + (ValuativeRel.valuation L).integer := + RingEquiv.subringCongr hL.symm + refine Module.Finite.of_equiv_equiv eK eL ?_ + ext x + rfl + +/-- Normalizing the value group does not change the valuation ring. -/ +theorem localIntegerValuation_valuationSubring_eq : + (localIntegerValuation K).valuationSubring = + (localCompleteDVF K).valuation.valuationSubring := by + rw [localCompleteDVF_valuation_eq] + ext x + change + IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K + (ValuativeRel.valuation K x) ≤ 1 ↔ + ValuativeRel.valuation K x ≤ 1 + simpa only [map_one] using + (map_le_map_iff + (IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K) + (a := ValuativeRel.valuation K x) (b := 1)) + +/-- The normalized integer valuation is onto. -/ +theorem localIntegerValuation_surjective : + Function.Surjective (localIntegerValuation K) := by + intro gamma + obtain ⟨x, hx⟩ := + ValuativeRel.valuation_surjective + ((IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K).symm gamma) + refine ⟨x, ?_⟩ + simp [localIntegerValuation, hx] + +/-- Identity on field elements gives the valuation-ring equivalence attached +to the normalization of the value group. -/ +noncomputable def localIntegerValuationSubringEquiv : + (localIntegerValuation K).valuationSubring ≃+* + (localCompleteDVF K).valuationSubring where + toFun := fun x => ⟨x, by + change (localCompleteDVF K).valuation (x : K) ≤ 1 + rw [localCompleteDVF_valuation_eq] + have hx : + IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K + (ValuativeRel.valuation K (x : K)) ≤ + IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K 1 := by + have hxmem := x.property + change localIntegerValuation K (x : K) ≤ 1 at hxmem + rw [localIntegerValuation_apply] at hxmem + simpa only [map_one] using hxmem + exact + (map_le_map_iff + (IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K)).mp hx⟩ + invFun := fun x => ⟨x, by + have hx : ValuativeRel.valuation K (x : K) ≤ 1 := by + have hxmem := x.property + change (localCompleteDVF K).valuation (x : K) ≤ 1 at hxmem + rw [localCompleteDVF_valuation_eq] at hxmem + exact hxmem + change + IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K + (ValuativeRel.valuation K (x : K)) ≤ 1 + simpa only [localIntegerValuation, _root_.Valuation.map_apply, + map_one] using + (map_le_map_iff + (IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K)).mpr hx⟩ + left_inv := fun x => by ext; rfl + right_inv := fun x => by ext; rfl + map_mul' := fun x y => by ext; rfl + map_add' := fun x y => by ext; rfl + +/-- The valuation-subring equivalence preserves the underlying element of `K`. -/ +@[simp] +theorem localIntegerValuationSubringEquiv_apply_coe + (x : (localIntegerValuation K).valuationSubring) : + ((localIntegerValuationSubringEquiv K x : + (localCompleteDVF K).valuationSubring) : K) = x := by + rfl + +/-- The valuation-subring equivalence preserves membership in the maximal ideal. -/ +theorem localIntegerValuationSubringEquiv_mem_maximalIdeal_iff + (x : (localIntegerValuation K).valuationSubring) : + localIntegerValuationSubringEquiv K x ∈ + IsLocalRing.maximalIdeal (localCompleteDVF K).valuationSubring ↔ + x ∈ IsLocalRing.maximalIdeal + (localIntegerValuation K).valuationSubring := by + rw [_root_.Valuation.mem_maximalIdeal_iff, + _root_.Valuation.mem_maximalIdeal_iff] + change + ValuativeRel.valuation K (x : K) < 1 ↔ + IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K + (ValuativeRel.valuation K (x : K)) < 1 + simpa only [map_one] using + (map_lt_map_iff + (IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K) + (a := ValuativeRel.valuation K (x : K)) (b := 1)).symm + +/-- The valuation-subring equivalence maps the integer maximal ideal onto the canonical one. -/ +@[simp] +theorem localIntegerValuationSubringEquiv_map_maximalIdeal : + (IsLocalRing.maximalIdeal + (localIntegerValuation K).valuationSubring).map + (localIntegerValuationSubringEquiv K : + (localIntegerValuation K).valuationSubring →+* + (localCompleteDVF K).valuationSubring) = + IsLocalRing.maximalIdeal (localCompleteDVF K).valuationSubring := by + let e := localIntegerValuationSubringEquiv K + ext y + rw [Ideal.mem_map_iff_of_surjective (e : + (localIntegerValuation K).valuationSubring →+* + (localCompleteDVF K).valuationSubring) e.surjective] + constructor + · rintro ⟨x, hx, rfl⟩ + exact + (localIntegerValuationSubringEquiv_mem_maximalIdeal_iff K x).2 hx + · intro hy + refine ⟨e.symm y, ?_, by simp [e]⟩ + exact + (localIntegerValuationSubringEquiv_mem_maximalIdeal_iff K + (e.symm y)).1 (by simpa [e] using hy) + +/-- The normalized valuation is a complete discrete valuation. -/ +noncomputable instance localIntegerValuation_isCompleteDiscrete : + ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete + (localIntegerValuation K) where + isRankOneDiscrete := by + let v := localIntegerValuation K + have : v.IsNontrivial := by + obtain ⟨x, hx⟩ := + localIntegerValuation_surjective K (WithZero.exp (-1 : ℤ)) + refine ⟨⟨x, ?_, ?_⟩⟩ + · rw [hx] + simp + · rw [hx] + change WithZero.exp (-1 : ℤ) ≠ WithZero.exp (0 : ℤ) + simp + have : IsCyclic (MonoidWithZeroHom.valueGroup v.toMonoidWithZeroHom) := + Subgroup.isCyclic_of_le + (show MonoidWithZeroHom.valueGroup v.toMonoidWithZeroHom ≤ ⊤ from le_top) + exact _root_.Valuation.IsRankOneDiscrete.mk' v + isAdicComplete := by + let e := localIntegerValuationSubringEquiv K + let : IsAdicComplete + (IsLocalRing.maximalIdeal (localCompleteDVF K).valuationSubring) + (localCompleteDVF K).valuationSubring := + (localCompleteDVF K).isAdicComplete + have hcomplete : + IsAdicComplete + ((IsLocalRing.maximalIdeal + (localCompleteDVF K).valuationSubring).map + (e.symm : (localCompleteDVF K).valuationSubring →+* + (localIntegerValuation K).valuationSubring)) + (localIntegerValuation K).valuationSubring := + ValuationTheory.DiscreteValuationField.isAdicComplete_map_ringEquiv + (I := IsLocalRing.maximalIdeal + (localCompleteDVF K).valuationSubring) e.symm + have hmap : + (IsLocalRing.maximalIdeal + (localCompleteDVF K).valuationSubring).map + (e.symm : (localCompleteDVF K).valuationSubring →+* + (localIntegerValuation K).valuationSubring) = + IsLocalRing.maximalIdeal + (localIntegerValuation K).valuationSubring := by + ext x + rw [Ideal.mem_map_iff_of_surjective + (e.symm : (localCompleteDVF K).valuationSubring →+* + (localIntegerValuation K).valuationSubring) e.symm.surjective] + constructor + · rintro ⟨y, hy, rfl⟩ + exact + (localIntegerValuationSubringEquiv_mem_maximalIdeal_iff K + (e.symm y)).1 (by simpa [e] using hy) + · intro hx + refine ⟨e x, ?_, by simp [e]⟩ + exact + (localIntegerValuationSubringEquiv_mem_maximalIdeal_iff K x).2 hx + simpa [hmap] using hcomplete + +/-- The normalized valuation has the same finite residue field as the +canonical local valuation. -/ +noncomputable instance localIntegerValuation_residueFinite : + Finite + (IsLocalRing.ResidueField + (localIntegerValuation K).valuationSubring) := by + have hfinite : Finite (localCompleteDVF K).residueField := by + change Finite 𝓀[K] + infer_instance + let e := localIntegerValuationSubringEquiv K + exact Finite.of_equiv (localCompleteDVF K).residueField + (IsLocalRing.ResidueField.mapEquiv e).symm.toEquiv + +end LocalFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PowerClassFiniteness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PowerClassFiniteness.lean new file mode 100644 index 0000000000..8d9b708c08 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PowerClassFiniteness.lean @@ -0,0 +1,132 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitStructure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicPowerIndex +/-! +# Finiteness of local power-class groups + +The multiplicative power-class group `Kˣ / Kˣⁿ` of a nonarchimedean local +field is finite whenever `n` is nonzero in `K`. This is the finiteness input +for maximal Kummer extensions and the characteristic-zero local existence +theorem. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.LocalField renaming + chosenFirstPrincipalUnitStructureEqualCharacteristic → + chosenFirstPrincipalUnitStructureEqualCharacteristic + +open _root_.LocalFieldTheory.DiscreteValuationField.LocalField renaming + chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation → + chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation + +open _root_.LocalFieldTheory.DiscreteValuationField renaming + finite_fieldUnits_nthPowerQuotient_of_finite_principalUnits → + finite_fieldUnits_nthPowerQuotient_of_finite_principalUnits + + +noncomputable +section + +namespace LocalFieldTheory + +open scoped ValuativeRel +open LocalFieldTheory.DiscreteValuationField + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +/-- The local power-class group is finite whenever the exponent is nonzero +in the field. -/ +theorem finite_nthPowerQuotient_of_natCast_ne_zero + (n : ℕ) (hnK : (n : K) ≠ 0) : + Finite (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range) := by + have hn : n ≠ 0 := by + intro hn + apply hnK + simp [hn] + let : NeZero n := ⟨hn⟩ + let v := localIntegerValuation K + let F : LocalFieldTheory.DiscreteValuationField.LocalField K := + LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation v + rcases CharP.exists' K with hcharZero | ⟨p, hp, hcharP⟩ + · let : CharZero K := hcharZero + let : + LocalFieldTheory.DiscreteValuationField.LocalField.MixedWithZeroValuationContext v := + LocalFieldTheory.DiscreteValuationField.LocalField.mixedWithZeroValuationContext v + let d := Module.finrank ℚ_[F.residueCharacteristic] K + obtain ⟨a, e⟩ := + chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation + v (localIntegerValuation_surjective K) + let U1 := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF 1 + let A := + ZMod (F.residueCharacteristic ^ a) × + (Fin d → ℤ_[F.residueCharacteristic]) + let : Finite (A ⧸ LocalFieldTheory.nsmulAddSubgroup A n) := by + infer_instance + let emul : U1 ≃* Multiplicative A := by + letI valuedK : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + letI : TopologicalSpace K := valuedK.toTopologicalSpace + exact e.symm.toMulEquiv + let : Finite (U1 ⧸ (powMonoidHom n : U1 →* U1).range) := + LocalFieldTheory.finite_nthPowerQuotient_of_mulEquiv U1 (Multiplicative A) n + emul + let hex := F.toCompleteDVF.exists_uniformizer + let π := Classical.choose hex + have hπ : + F.toCompleteDVF.valuation.IsUniformizer (π : K) := + Classical.choose_spec hex + exact + finite_fieldUnits_nthPowerQuotient_of_finite_principalUnits + F.toCompleteDVF hπ n + · let : CharP K p := hcharP + have hpne : p ≠ 0 := hp.out.ne_zero + have hres : F.residueCharacteristic = p := + F.residueCharacteristic_eq_of_charP p hpne + let : CharP K F.residueCharacteristic := by + rw [hres] + infer_instance + have hpn : ¬ F.residueCharacteristic ∣ n := by + intro hdiv + apply hnK + exact (CharP.cast_eq_zero_iff K F.residueCharacteristic n).2 hdiv + let : Fact (Nat.Coprime n F.residueCharacteristic) := + ⟨(F.residueCharacteristic_prime.coprime_iff_not_dvd.mpr hpn).symm⟩ + let valuedK : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let e := + chosenFirstPrincipalUnitStructureEqualCharacteristic + v + let U1 := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF 1 + let A := ℕ → ℤ_[F.residueCharacteristic] + let : Finite (A ⧸ LocalFieldTheory.nsmulAddSubgroup A n) := by + infer_instance + let emul : U1 ≃* Multiplicative A := by + letI : TopologicalSpace K := valuedK.toTopologicalSpace + exact e.symm.toMulEquiv + let : Finite (U1 ⧸ (powMonoidHom n : U1 →* U1).range) := + LocalFieldTheory.finite_nthPowerQuotient_of_mulEquiv U1 (Multiplicative A) n + emul + let hex := F.toCompleteDVF.exists_uniformizer + let π := Classical.choose hex + have hπ : + F.toCompleteDVF.valuation.IsUniformizer (π : K) := + Classical.choose_spec hex + exact + finite_fieldUnits_nthPowerQuotient_of_finite_principalUnits + F.toCompleteDVF hπ n + +end LocalFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitActions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitActions.lean new file mode 100644 index 0000000000..21b3a1def2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitActions.lean @@ -0,0 +1,549 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients +/-! +# Actions on principal-unit quotients + +Transports valuation-ring automorphisms to maximal-ideal powers, principal +units, and their successive quotients, together with the resulting actions. +-/ + +@[expose] public section +namespace LocalFieldTheory + +noncomputable +section + +universe u + +open scoped ValuativeRel + +/-- A ring equivalence of a valuation integer ring preserves the maximal ideal. -/ +theorem integerRingEquiv_mem_maximalIdeal + (K : Type u) [Field K] [ValuativeRel K] + (e : 𝒪[K] ≃+* 𝒪[K]) (x : 𝒪[K]) : + e x ∈ (𝓂[K] : Ideal 𝒪[K]) ↔ x ∈ (𝓂[K] : Ideal 𝒪[K]) := by + rw [IsLocalRing.mem_maximalIdeal, map_mem_nonunits_iff e, + ← IsLocalRing.mem_maximalIdeal] + +/-- A ring equivalence of a valuation integer ring maps the maximal ideal to itself. -/ +theorem integerRingEquiv_map_maximalIdeal + (K : Type u) [Field K] [ValuativeRel K] + (e : 𝒪[K] ≃+* 𝒪[K]) : + Ideal.map e.toRingHom (𝓂[K] : Ideal 𝒪[K]) = (𝓂[K] : Ideal 𝒪[K]) := by + ext y + constructor + · intro hy + rcases (Ideal.mem_map_iff_of_surjective e.toRingHom e.surjective).1 hy with + ⟨x, hx, rfl⟩ + exact (integerRingEquiv_mem_maximalIdeal K e x).2 hx + · intro hy + refine (Ideal.mem_map_iff_of_surjective e.toRingHom e.surjective).2 ?_ + refine ⟨e.symm y, ?_, by simp⟩ + have hy' : e (e.symm y) ∈ (𝓂[K] : Ideal 𝒪[K]) := by + simpa using hy + exact (integerRingEquiv_mem_maximalIdeal K e (e.symm y)).1 hy' + +/-- A ring equivalence of a valuation integer ring maps every maximal-ideal power to itself. -/ +theorem integerRingEquiv_map_maximalIdeal_pow + (K : Type u) [Field K] [ValuativeRel K] + (e : 𝒪[K] ≃+* 𝒪[K]) (n : Nat) : + Ideal.map e.toRingHom (𝓂[K] ^ n : Ideal 𝒪[K]) = + (𝓂[K] ^ n : Ideal 𝒪[K]) := by + rw [Ideal.map_pow, integerRingEquiv_map_maximalIdeal] + +/-- Membership in every maximal-ideal power is invariant under an integer-ring equivalence. -/ +theorem integerRingEquiv_mem_maximalIdeal_pow + (K : Type u) [Field K] [ValuativeRel K] + (e : 𝒪[K] ≃+* 𝒪[K]) (n : Nat) (x : 𝒪[K]) : + e x ∈ (𝓂[K] ^ n : Ideal 𝒪[K]) ↔ x ∈ (𝓂[K] ^ n : Ideal 𝒪[K]) := by + constructor + · intro hx + have hxmap : + e.symm (e x) ∈ Ideal.map e.symm.toRingHom (𝓂[K] ^ n : Ideal 𝒪[K]) := + Ideal.mem_map_of_mem e.symm.toRingHom hx + rw [integerRingEquiv_map_maximalIdeal_pow K e.symm n] at hxmap + simpa using hxmap + · intro hx + have hxmap : e x ∈ Ideal.map e.toRingHom (𝓂[K] ^ n : Ideal 𝒪[K]) := + Ideal.mem_map_of_mem e.toRingHom hx + rw [integerRingEquiv_map_maximalIdeal_pow K e n] at hxmap + exact hxmap + +/-- The induced additive equivalence on the ideal power `𝓂^n`. -/ +def maximalIdealPowMapEquivOfIntegerRingEquiv + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (e : 𝒪[K] ≃+* 𝒪[K]) : + ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) ≃+ + ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) where + toFun a := ⟨e (a : 𝒪[K]), (integerRingEquiv_mem_maximalIdeal_pow K e n a).2 a.2⟩ + invFun a := + ⟨e.symm (a : 𝒪[K]), (integerRingEquiv_mem_maximalIdeal_pow K e.symm n a).2 a.2⟩ + left_inv := by + intro a + ext + simp + right_inv := by + intro a + ext + simp + map_add' := by + intro a b + ext + simp + +/-- An integer-ring equivalence transports an element of a maximal-ideal power by applying the +underlying ring equivalence. -/ +theorem maximalIdealPowMapEquivOfIntegerRingEquiv_apply + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (e : 𝒪[K] ≃+* 𝒪[K]) + (a : ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u)) : + (maximalIdealPowMapEquivOfIntegerRingEquiv K n e a : 𝒪[K]) = e (a : 𝒪[K]) := + rfl + +private theorem maximalIdealPowSuccQuotMapOfIntegerRingEquiv_respects + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (e : 𝒪[K] ≃+* 𝒪[K]) + (a b : ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u)) + (hab : a - b ∈ maximalIdealPowSuccSubmodule K n) : + maximalIdealPowSuccQuotMk K n + (maximalIdealPowMapEquivOfIntegerRingEquiv K n e a) = + maximalIdealPowSuccQuotMk K n + (maximalIdealPowMapEquivOfIntegerRingEquiv K n e b) := by + apply (maximalIdealPowSuccQuotMk_eq_iff K n _ _).2 + rw [mem_maximalIdealPowSuccSubmodule_iff] + change e (a : 𝒪[K]) - e (b : 𝒪[K]) ∈ + (𝓂[K] ^ (n + 1) : Ideal 𝒪[K]) + rw [← map_sub] + exact (integerRingEquiv_mem_maximalIdeal_pow K e (n + 1) + ((a - b : (𝓂[K] ^ n : Ideal 𝒪[K])) : 𝒪[K])).2 + ((mem_maximalIdealPowSuccSubmodule_iff K n (a - b)).1 hab) + +/-- The induced additive homomorphism on `𝓂^n/𝓂^(n+1)`. -/ +def maximalIdealPowSuccQuotMapOfIntegerRingEquiv + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (e : 𝒪[K] ≃+* 𝒪[K]) : + MaximalIdealPowSuccQuot K n →+ MaximalIdealPowSuccQuot K n := by + let f : MaximalIdealPowSuccQuot K n → MaximalIdealPowSuccQuot K n := + maximalIdealPowSuccQuotLift n + (fun a => maximalIdealPowSuccQuotMk K n + (maximalIdealPowMapEquivOfIntegerRingEquiv K n e a)) + (by exact maximalIdealPowSuccQuotMapOfIntegerRingEquiv_respects K n e) + refine + { toFun := f + map_zero' := ?_ + map_add' := ?_ } + · change f 0 = 0 + rw [← map_zero (maximalIdealPowSuccQuotMk K n)] + dsimp only [f] + rw [maximalIdealPowSuccQuotLift_mk, map_zero, map_zero] + · intro x y + change f (x + y) = f x + f y + refine MaximalIdealPowSuccQuot.inductionOn₂ n + (motive := fun x' y' => f (x' + y') = f x' + f y') x y ?_ + intro a b + rw [← map_add (maximalIdealPowSuccQuotMk K n)] + dsimp only [f] + rw [maximalIdealPowSuccQuotLift_mk, + maximalIdealPowSuccQuotLift_mk, + maximalIdealPowSuccQuotLift_mk, map_add, map_add] + +/-- The map on successive maximal-ideal quotients sends a representative to the class of its image +under the ring equivalence. -/ +theorem maximalIdealPowSuccQuotMapOfIntegerRingEquiv_mk + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (e : 𝒪[K] ≃+* 𝒪[K]) + (a : ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u)) : + maximalIdealPowSuccQuotMapOfIntegerRingEquiv K n e + (maximalIdealPowSuccQuotMk K n a) = + maximalIdealPowSuccQuotMk K n + (maximalIdealPowMapEquivOfIntegerRingEquiv K n e a) := by + change maximalIdealPowSuccQuotLift n + (fun b => maximalIdealPowSuccQuotMk K n + (maximalIdealPowMapEquivOfIntegerRingEquiv K n e b)) + (by exact maximalIdealPowSuccQuotMapOfIntegerRingEquiv_respects K n e) + (maximalIdealPowSuccQuotMk K n a) = + maximalIdealPowSuccQuotMk K n + (maximalIdealPowMapEquivOfIntegerRingEquiv K n e a) + exact maximalIdealPowSuccQuotLift_mk n _ _ a + +/-- The induced additive equivalence on `𝓂^n/𝓂^(n+1)`. -/ +def maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (e : 𝒪[K] ≃+* 𝒪[K]) : + MaximalIdealPowSuccQuot K n ≃+ MaximalIdealPowSuccQuot K n where + toFun := maximalIdealPowSuccQuotMapOfIntegerRingEquiv K n e + invFun := maximalIdealPowSuccQuotMapOfIntegerRingEquiv K n e.symm + left_inv := by + intro x + refine MaximalIdealPowSuccQuot.inductionOn n + (motive := fun x' => + maximalIdealPowSuccQuotMapOfIntegerRingEquiv K n e.symm + (maximalIdealPowSuccQuotMapOfIntegerRingEquiv K n e x') = x') + x ?_ + intro a + rw [maximalIdealPowSuccQuotMapOfIntegerRingEquiv_mk, + maximalIdealPowSuccQuotMapOfIntegerRingEquiv_mk] + have h := (maximalIdealPowMapEquivOfIntegerRingEquiv K n e).left_inv a + exact congrArg (maximalIdealPowSuccQuotMk K n) h + right_inv := by + intro x + refine MaximalIdealPowSuccQuot.inductionOn n + (motive := fun x' => + maximalIdealPowSuccQuotMapOfIntegerRingEquiv K n e + (maximalIdealPowSuccQuotMapOfIntegerRingEquiv K n e.symm x') = x') + x ?_ + intro a + rw [maximalIdealPowSuccQuotMapOfIntegerRingEquiv_mk, + maximalIdealPowSuccQuotMapOfIntegerRingEquiv_mk] + have h := (maximalIdealPowMapEquivOfIntegerRingEquiv K n e).right_inv a + exact congrArg (maximalIdealPowSuccQuotMk K n) h + map_add' := by + intro x y + exact map_add (maximalIdealPowSuccQuotMapOfIntegerRingEquiv K n e) x y + +/-- The equivalence of successive maximal-ideal quotients acts on classes by applying the +integer-ring equivalence. -/ +theorem maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv_mk + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (e : 𝒪[K] ≃+* 𝒪[K]) + (a : ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u)) : + maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv K n e + (maximalIdealPowSuccQuotMk K n a) = + maximalIdealPowSuccQuotMk K n + (maximalIdealPowMapEquivOfIntegerRingEquiv K n e a) := + maximalIdealPowSuccQuotMapOfIntegerRingEquiv_mk K n e a + +/-- Principal units are preserved by every valuation-integer-ring equivalence. -/ +theorem principalUnits_integerRingEquiv_mem_self + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (e : 𝒪[K] ≃+* 𝒪[K]) (u : 𝒪[K]ˣ) + (hu : u ∈ principalUnits K n) : + Units.mapEquiv e.toMulEquiv u ∈ principalUnits K n := + principalUnits_integerRingEquiv_mem K n e + (fun x hx => (integerRingEquiv_mem_maximalIdeal_pow K e n x).2 hx) u hu + +/-- The induced multiplicative equivalence on the `n`-th principal-unit group. -/ +def principalUnitsMapEquivOfIntegerRingEquiv + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (e : 𝒪[K] ≃+* 𝒪[K]) : + principalUnits K n ≃* principalUnits K n where + toFun u := + ⟨Units.mapEquiv e.toMulEquiv u.1, + principalUnits_integerRingEquiv_mem_self K n e u.1 u.2⟩ + invFun u := + ⟨Units.mapEquiv e.symm.toMulEquiv u.1, + principalUnits_integerRingEquiv_mem_self K n e.symm u.1 u.2⟩ + left_inv := by + intro u + ext + simp + right_inv := by + intro u + ext + simp + map_mul' := by + intro a b + ext + simp + +/-- An integer-ring equivalence transports principal units by applying it to their underlying units. +An integer-ring equivalence transports principal units by applying it to their underlying units. -/ +theorem principalUnitsMapEquivOfIntegerRingEquiv_apply + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (e : 𝒪[K] ≃+* 𝒪[K]) (u : principalUnits K n) : + principalUnitsMapEquivOfIntegerRingEquiv K n e u = + ⟨Units.mapEquiv e.toMulEquiv u.1, + principalUnits_integerRingEquiv_mem_self K n e u.1 u.2⟩ := + rfl + +/-- Transport of a principal unit of the form `1 + x` is the principal unit formed from the +transported `x`. -/ +theorem principalUnitsMapEquivOfIntegerRingEquiv_oneAdd + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (hn : 1 ≤ n) (e : 𝒪[K] ≃+* 𝒪[K]) + (a : (𝓂[K] ^ n : Ideal 𝒪[K])) : + principalUnitsMapEquivOfIntegerRingEquiv K n e + (principalUnitOneAddOfMemPowSubgroup K hn (a : 𝒪[K]) a.2) = + principalUnitOneAddOfMemPowSubgroup K hn + (e (a : 𝒪[K])) ((integerRingEquiv_mem_maximalIdeal_pow K e n a).2 a.2) := by + ext + simp [principalUnitsMapEquivOfIntegerRingEquiv, + principalUnitOneAddOfMemPowSubgroup, principalUnitOneAddOfMemPow_val] + +/-- The induced homomorphism on the successive principal-unit quotient. -/ +def principalUnitsSuccQuotMapOfIntegerRingEquiv + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (e : 𝒪[K] ≃+* 𝒪[K]) : + PrincipalUnitsSuccQuot K n →* PrincipalUnitsSuccQuot K n := + principalUnitsSuccQuotLift n + ((principalUnitsSuccQuotMk K n).comp + (principalUnitsMapEquivOfIntegerRingEquiv K n e).toMonoidHom) + (by + intro u hu + rw [MonoidHom.mem_ker, MonoidHom.comp_apply, + principalUnitsSuccQuotMk_eq_one_iff] + exact principalUnits_integerRingEquiv_mem_self K (n + 1) e u.1 hu) + +/-- The map on successive principal-unit quotients sends each class to the class of its transported +representative. -/ +theorem principalUnitsSuccQuotMapOfIntegerRingEquiv_apply + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (e : 𝒪[K] ≃+* 𝒪[K]) (u : principalUnits K n) : + principalUnitsSuccQuotMapOfIntegerRingEquiv K n e + (principalUnitsSuccQuotMk K n u) = + principalUnitsSuccQuotMk K n + (principalUnitsMapEquivOfIntegerRingEquiv K n e u) := + rfl + +/-- The induced multiplicative equivalence on `U^n/U^(n+1)`. -/ +def principalUnitsSuccQuotMapEquivOfIntegerRingEquiv + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (e : 𝒪[K] ≃+* 𝒪[K]) : + PrincipalUnitsSuccQuot K n ≃* PrincipalUnitsSuccQuot K n where + toFun := principalUnitsSuccQuotMapOfIntegerRingEquiv K n e + invFun := principalUnitsSuccQuotMapOfIntegerRingEquiv K n e.symm + left_inv := by + intro x + refine PrincipalUnitsSuccQuot.inductionOn n + (motive := fun x' => + principalUnitsSuccQuotMapOfIntegerRingEquiv K n e.symm + (principalUnitsSuccQuotMapOfIntegerRingEquiv K n e x') = x') + x ?_ + intro u + rw [principalUnitsSuccQuotMapOfIntegerRingEquiv_apply, + principalUnitsSuccQuotMapOfIntegerRingEquiv_apply] + have h := (principalUnitsMapEquivOfIntegerRingEquiv K n e).left_inv u + exact congrArg + (fun z : principalUnits K n => + principalUnitsSuccQuotMk K n z) h + right_inv := by + intro x + refine PrincipalUnitsSuccQuot.inductionOn n + (motive := fun x' => + principalUnitsSuccQuotMapOfIntegerRingEquiv K n e + (principalUnitsSuccQuotMapOfIntegerRingEquiv K n e.symm x') = x') + x ?_ + intro u + rw [principalUnitsSuccQuotMapOfIntegerRingEquiv_apply, + principalUnitsSuccQuotMapOfIntegerRingEquiv_apply] + have h := (principalUnitsMapEquivOfIntegerRingEquiv K n e).right_inv u + exact congrArg + (fun z : principalUnits K n => + principalUnitsSuccQuotMk K n z) h + map_mul' := by + intro x y + exact map_mul (principalUnitsSuccQuotMapOfIntegerRingEquiv K n e) x y + +/-- The equivalence of successive principal-unit quotients is induced by transport along the +integer-ring equivalence. -/ +theorem principalUnitsSuccQuotMapEquivOfIntegerRingEquiv_apply + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (e : 𝒪[K] ≃+* 𝒪[K]) (u : principalUnits K n) : + principalUnitsSuccQuotMapEquivOfIntegerRingEquiv K n e + (principalUnitsSuccQuotMk K n u) = + principalUnitsSuccQuotMk K n + (principalUnitsMapEquivOfIntegerRingEquiv K n e u) := + rfl + +/-- The induced additive equivalence on the additive form of +`U^n/U^(n+1)`. -/ +def principalUnitsSuccQuotAddEquivOfIntegerRingEquiv + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (e : 𝒪[K] ≃+* 𝒪[K]) : + Additive (PrincipalUnitsSuccQuot K n) ≃+ + Additive (PrincipalUnitsSuccQuot K n) where + toFun x := + Additive.ofMul + (principalUnitsSuccQuotMapEquivOfIntegerRingEquiv K n e (Additive.toMul x)) + invFun x := + Additive.ofMul + (principalUnitsSuccQuotMapEquivOfIntegerRingEquiv K n e.symm (Additive.toMul x)) + left_inv := by + intro x + change Additive.ofMul + (principalUnitsSuccQuotMapEquivOfIntegerRingEquiv K n e.symm + (principalUnitsSuccQuotMapEquivOfIntegerRingEquiv K n e (Additive.toMul x))) = + Additive.ofMul (Additive.toMul x) + exact congrArg Additive.ofMul + ((principalUnitsSuccQuotMapEquivOfIntegerRingEquiv K n e).left_inv + (Additive.toMul x)) + right_inv := by + intro x + change Additive.ofMul + (principalUnitsSuccQuotMapEquivOfIntegerRingEquiv K n e + (principalUnitsSuccQuotMapEquivOfIntegerRingEquiv K n e.symm + (Additive.toMul x))) = + Additive.ofMul (Additive.toMul x) + exact congrArg Additive.ofMul + ((principalUnitsSuccQuotMapEquivOfIntegerRingEquiv K n e).right_inv + (Additive.toMul x)) + map_add' := by + intro x y + change Additive.ofMul + (principalUnitsSuccQuotMapEquivOfIntegerRingEquiv K n e + (Additive.toMul (x + y))) = + Additive.ofMul + (principalUnitsSuccQuotMapEquivOfIntegerRingEquiv K n e (Additive.toMul x) * + principalUnitsSuccQuotMapEquivOfIntegerRingEquiv K n e (Additive.toMul y)) + rw [show Additive.toMul (x + y) = Additive.toMul x * Additive.toMul y from rfl] + rw [map_mul] + +/-- The additive equivalence on successive principal-unit quotients agrees with transport of +quotient representatives. -/ +@[simp] +theorem principalUnitsSuccQuotAddEquivOfIntegerRingEquiv_apply + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (e : 𝒪[K] ≃+* 𝒪[K]) (x : PrincipalUnitsSuccQuot K n) : + principalUnitsSuccQuotAddEquivOfIntegerRingEquiv K n e (Additive.ofMul x) = + Additive.ofMul (principalUnitsSuccQuotMapEquivOfIntegerRingEquiv K n e x) := + rfl + +/-- Multiplicative form of the induced equivalence on +`𝓂^n/𝓂^(n+1)`. -/ +def maximalIdealPowSuccQuotMultiplicativeMapEquivOfIntegerRingEquiv + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (e : 𝒪[K] ≃+* 𝒪[K]) : + Multiplicative (MaximalIdealPowSuccQuot K n) ≃* + Multiplicative (MaximalIdealPowSuccQuot K n) where + toFun x := + Multiplicative.ofAdd + (maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv K n e + (Multiplicative.toAdd x)) + invFun x := + Multiplicative.ofAdd + (maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv K n e.symm + (Multiplicative.toAdd x)) + left_inv := by + intro x + change Multiplicative.ofAdd + (maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv K n e.symm + (maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv K n e + (Multiplicative.toAdd x))) = + Multiplicative.ofAdd (Multiplicative.toAdd x) + exact congrArg Multiplicative.ofAdd + ((maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv K n e).left_inv + (Multiplicative.toAdd x)) + right_inv := by + intro x + change Multiplicative.ofAdd + (maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv K n e + (maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv K n e.symm + (Multiplicative.toAdd x))) = + Multiplicative.ofAdd (Multiplicative.toAdd x) + exact congrArg Multiplicative.ofAdd + ((maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv K n e).right_inv + (Multiplicative.toAdd x)) + map_mul' := by + intro x y + change Multiplicative.ofAdd + (maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv K n e + (Multiplicative.toAdd (x * y))) = + Multiplicative.ofAdd + (maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv K n e + (Multiplicative.toAdd x) + + maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv K n e + (Multiplicative.toAdd y)) + rw [show Multiplicative.toAdd (x * y) = + Multiplicative.toAdd x + Multiplicative.toAdd y from rfl] + rw [map_add] + +/-- The multiplicative encoding of a successive ideal-quotient equivalence applies the original +additive transport map. -/ +@[simp] +theorem maximalIdealPowSuccQuotMultiplicativeMapEquivOfIntegerRingEquiv_apply + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (e : 𝒪[K] ≃+* 𝒪[K]) (x : MaximalIdealPowSuccQuot K n) : + maximalIdealPowSuccQuotMultiplicativeMapEquivOfIntegerRingEquiv K n e + (Multiplicative.ofAdd x) = + Multiplicative.ofAdd (maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv K n e x) := + rfl + +/-- The map `𝓂^n/𝓂^(n+1) → U^n/U^(n+1)` induced by `a ↦ 1+a` is equivariant +for every valuation-integer-ring automorphism. -/ +theorem principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_integerRingEquiv + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (hn : 1 ≤ n) (e : 𝒪[K] ≃+* 𝒪[K]) + (x : MaximalIdealPowSuccQuot K n) : + principalUnitsSuccQuotMapEquivOfIntegerRingEquiv K n e + (principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn x) = + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn + (maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv K n e x) := by + refine MaximalIdealPowSuccQuot.inductionOn n + (motive := fun x' => + principalUnitsSuccQuotMapEquivOfIntegerRingEquiv K n e + (principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn x') = + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn + (maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv K n e x')) + x ?_ + intro a + rw [maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv_mk] + change principalUnitsSuccQuotMapEquivOfIntegerRingEquiv K n e + (principalUnitsSuccQuotOfIdealPow K n hn a) = + principalUnitsSuccQuotOfIdealPow K n hn + (maximalIdealPowMapEquivOfIntegerRingEquiv K n e a) + rw [principalUnitsSuccQuotOfIdealPow_apply, principalUnitsSuccQuotOfIdealPow_apply, + principalUnitsSuccQuotMapEquivOfIntegerRingEquiv_apply] + congr 1 + exact principalUnitsMapEquivOfIntegerRingEquiv_oneAdd K n hn e a + +/-- Additive form of equivariance of `a ↦ 1+a` on successive quotients. -/ +theorem principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd_integerRingEquiv + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (hn : 1 ≤ n) (e : 𝒪[K] ≃+* 𝒪[K]) + (x : MaximalIdealPowSuccQuot K n) : + Additive.ofMul + (principalUnitsSuccQuotMapEquivOfIntegerRingEquiv K n e + (principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn x)) = + principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd K n hn + (maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv K n e x) := by + rw [principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_integerRingEquiv] + rfl + +/-- The additive isomorphism `𝓂^n/𝓂^(n+1) ≃ U^n/U^(n+1)` is equivariant for +every valuation-integer-ring automorphism. -/ +theorem maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot_integerRingEquiv + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (hn : 1 ≤ n) (e : 𝒪[K] ≃+* 𝒪[K]) + (x : MaximalIdealPowSuccQuot K n) : + principalUnitsSuccQuotAddEquivOfIntegerRingEquiv K n e + (maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot K n hn x) = + maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot K n hn + (maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv K n e x) := by + rw [maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot_apply, + principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd_apply, + principalUnitsSuccQuotAddEquivOfIntegerRingEquiv_apply, + maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot_apply] + exact principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd_integerRingEquiv K n hn e x + +/-- Multiplicative equivariance of the associated-graded comparison +`Multiplicative (𝓂^n/𝓂^(n+1)) ≃* U^n/U^(n+1)` for every +valuation-integer-ring automorphism. -/ +theorem maximalIdealPowSuccQuotMulEquivPrincipalUnitsSuccQuot_integerRingEquiv + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (hn : 1 ≤ n) (e : 𝒪[K] ≃+* 𝒪[K]) + (x : Multiplicative (MaximalIdealPowSuccQuot K n)) : + principalUnitsSuccQuotMapEquivOfIntegerRingEquiv K n e + (maximalIdealPowSuccQuotMulEquivPrincipalUnitsSuccQuot K n hn x) = + maximalIdealPowSuccQuotMulEquivPrincipalUnitsSuccQuot K n hn + (maximalIdealPowSuccQuotMultiplicativeMapEquivOfIntegerRingEquiv K n e x) := by + change Additive.toMul + (principalUnitsSuccQuotAddEquivOfIntegerRingEquiv K n e + (maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot K n hn + (Multiplicative.toAdd x))) = + Additive.toMul + (maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot K n hn + (maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv K n e + (Multiplicative.toAdd x))) + exact congrArg Additive.toMul + (maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot_integerRingEquiv + K n hn e (Multiplicative.toAdd x)) + +end +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitQuotients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitQuotients.lean new file mode 100644 index 0000000000..4c11e0c183 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitQuotients.lean @@ -0,0 +1,1565 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import Mathlib.RingTheory.Filtration +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnits +/-! +# Successive principal-unit quotients + +Develops `U^n/U^(n+1)` and identifies it with the additive ideal quotient +`𝓂^n/𝓂^(n+1)` through the first-order map `a ↦ 1 + a`. +-/ + +@[expose] public section +namespace LocalFieldTheory + +noncomputable +section + +universe u + +open scoped ValuativeRel + +open Filter + +/-- The actual successive quotient `U^n / U^(n+1)` of principal units. -/ +def PrincipalUnitsSuccQuot (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + Type u := + principalUnits K n ⧸ (principalUnits K (n + 1)).subgroupOf (principalUnits K n) + +/-- Equips the successive principal-unit quotient `U^n/U^(n+1)` with its commutative group +structure. -/ +instance principalUnitsSuccQuotCommGroup + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + CommGroup (PrincipalUnitsSuccQuot K n) := by + change CommGroup + (principalUnits K n ⧸ + (principalUnits K (n + 1)).subgroupOf (principalUnits K n)) + infer_instance + +/-- Explicit access to the concrete quotient representation. -/ +def principalUnitsSuccQuotConcreteEquiv + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + PrincipalUnitsSuccQuot K n ≃* + (principalUnits K n ⧸ + (principalUnits K (n + 1)).subgroupOf (principalUnits K n)) := by + change + (principalUnits K n ⧸ + (principalUnits K (n + 1)).subgroupOf (principalUnits K n)) ≃* + (principalUnits K n ⧸ + (principalUnits K (n + 1)).subgroupOf (principalUnits K n)) + exact MulEquiv.refl _ + +/-- The quotient map `U^n → U^n/U^(n+1)`. -/ +def principalUnitsSuccQuotMk (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + principalUnits K n →* PrincipalUnitsSuccQuot K n := by + change principalUnits K n →* + (principalUnits K n ⧸ + (principalUnits K (n + 1)).subgroupOf (principalUnits K n)) + exact QuotientGroup.mk' + ((principalUnits K (n + 1)).subgroupOf (principalUnits K n)) + +/-- Descend a homomorphism that kills `U^(n+1)` inside `U^n`. -/ +def principalUnitsSuccQuotLift + {K : Type u} {M : Type*} [Field K] [ValuativeRel K] [Group M] + (n : Nat) (f : principalUnits K n →* M) + (h : (principalUnits K (n + 1)).subgroupOf + (principalUnits K n) ≤ f.ker) : + PrincipalUnitsSuccQuot K n →* M := by + change + (principalUnits K n ⧸ + (principalUnits K (n + 1)).subgroupOf (principalUnits K n)) →* M + exact QuotientGroup.lift + ((principalUnits K (n + 1)).subgroupOf (principalUnits K n)) f h + +/-- The homomorphism descended from `U^n` agrees with the original homomorphism on quotient +representatives. -/ +@[simp] +theorem principalUnitsSuccQuotLift_mk + {K : Type u} {M : Type*} [Field K] [ValuativeRel K] [Group M] + (n : Nat) (f : principalUnits K n →* M) + (h : (principalUnits K (n + 1)).subgroupOf + (principalUnits K n) ≤ f.ker) (x : principalUnits K n) : + principalUnitsSuccQuotLift n f h + (principalUnitsSuccQuotMk K n x) = f x := + rfl + +/-- Eliminate a successive principal-unit class through the canonical map. -/ +protected theorem PrincipalUnitsSuccQuot.inductionOn + {K : Type u} [Field K] [ValuativeRel K] (n : Nat) + {motive : PrincipalUnitsSuccQuot K n → Prop} + (q : PrincipalUnitsSuccQuot K n) + (h : ∀ x : principalUnits K n, + motive (principalUnitsSuccQuotMk K n x)) : + motive q := by + change motive + (show principalUnits K n ⧸ + (principalUnits K (n + 1)).subgroupOf (principalUnits K n) from q) + refine QuotientGroup.induction_on q ?_ + intro x + exact h x + +/-! ### Separatedness of the principal-unit filtration -/ + +/-- Krull separatedness of the maximal-ideal filtration of the valuation integer +ring of a nonarchimedean local field. -/ +theorem maximalIdeal_iInf_pow_eq_bot + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + (⨅ n : Nat, (𝓂[K] ^ n : Ideal 𝒪[K])) = ⊥ := by + exact Ideal.iInf_pow_eq_bot_of_isLocalRing + (I := (𝓂[K] : Ideal 𝒪[K])) Ideal.IsPrime.ne_top' + +/-- An element of the valuation integer ring lying in every power of the +maximal ideal is zero. -/ +theorem eq_zero_of_mem_all_maximalIdeal_pow + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (x : 𝒪[K]) + (hx : ∀ n : Nat, x ∈ (𝓂[K] ^ n : Ideal 𝒪[K])) : + x = 0 := by + have hxInf : x ∈ (⨅ n : Nat, (𝓂[K] ^ n : Ideal 𝒪[K])) := by + rw [Ideal.mem_iInf] + exact hx + rw [maximalIdeal_iInf_pow_eq_bot K] at hxInf + exact (Ideal.mem_bot.mp hxInf) + +/-- The principal-unit filtration is separated: a unit lying in every `U^n` +is the unit `1`. -/ +theorem principalUnits_eq_one_of_mem_all + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (u : 𝒪[K]ˣ) + (hu : ∀ n : Nat, u ∈ principalUnits K n) : + u = 1 := by + apply Units.ext + have hsub : + ((u : 𝒪[K]) - 1) = 0 := + eq_zero_of_mem_all_maximalIdeal_pow K ((u : 𝒪[K]) - 1) (by + intro n + exact (mem_principalUnits_iff K u n).1 (hu n)) + exact sub_eq_zero.mp hsub + +/-- Variant tailored to finite-depth approximation statements: if a unit lies +in `U^(n+d)` for every `d`, then it is `1`. -/ +theorem principalUnits_eq_one_of_mem_add_all + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (n : Nat) (u : 𝒪[K]ˣ) + (hu : ∀ d : Nat, u ∈ principalUnits K (n + d)) : + u = 1 := by + refine principalUnits_eq_one_of_mem_all K u ?_ + intro m + by_cases hm : m ≤ n + · exact principalUnits_antitone K hm (hu 0) + · have hnm : n ≤ m := Nat.le_of_not_ge hm + obtain ⟨d, rfl⟩ := Nat.exists_eq_add_of_le hnm + exact hu d + +/-! ### Maximal-ideal powers as local neighborhoods -/ + +/-- Every neighborhood of zero in the valuation integer ring contains a +sufficiently deep power of the maximal ideal. -/ +theorem exists_maximalIdeal_pow_subset_nhds_zero + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (s : Set 𝒪[K]) + (hs : s ∈ nhds (0 : 𝒪[K])) : + ∃ N : Nat, ((𝓂[K] ^ N : Ideal 𝒪[K]) : Set 𝒪[K]) ⊆ s := by + rcases (mem_nhds_subtype ((ValuativeRel.valuation K).integer : Set K) + (0 : 𝒪[K]) s).1 hs with + ⟨t, ht, hts⟩ + rcases (IsValuativeTopology.hasBasis_nhds_zero K).mem_iff.mp ht with + ⟨γ, -, hγt⟩ + rcases IsDiscreteValuationRing.exists_irreducible 𝒪[K] with ⟨ϖ, hϖ⟩ + rcases exists_pow_lt₀ + (Valuation.integer.v_irreducible_lt_one (v := ValuativeRel.valuation K) hϖ) + γ with + ⟨N, hN⟩ + refine ⟨N, ?_⟩ + intro x hx + apply hts + apply hγt + have hset := Irreducible.maximalIdeal_pow_eq_setOfPred_le_v_coe_pow + (v := ValuativeRel.valuation K) hϖ N + have hxset : x ∈ ((𝓂[K] ^ N : Ideal 𝒪[K]) : Set 𝒪[K]) := hx + rw [hset] at hxset + exact hxset.trans_lt hN + +/-- Eventual form of `exists_maximalIdeal_pow_subset_nhds_zero`: all deeper +powers of the maximal ideal lie in a fixed zero-neighborhood. -/ +theorem eventually_maximalIdeal_pow_subset_nhds_zero + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (s : Set 𝒪[K]) + (hs : s ∈ nhds (0 : 𝒪[K])) : + ∃ N : Nat, ∀ m : Nat, N ≤ m → + ((𝓂[K] ^ m : Ideal 𝒪[K]) : Set 𝒪[K]) ⊆ s := by + rcases exists_maximalIdeal_pow_subset_nhds_zero K s hs with ⟨N, hN⟩ + refine ⟨N, fun m hm x hx => hN ?_⟩ + exact Ideal.pow_le_pow_right hm hx + +/-- Each power of the maximal ideal is closed in the valuation integer ring. -/ +theorem isClosed_maximalIdeal_pow + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (n : Nat) : + IsClosed (((𝓂[K] ^ n : Ideal 𝒪[K]) : Set 𝒪[K])) := by + rcases IsDiscreteValuationRing.exists_irreducible 𝒪[K] with ⟨ϖ, hϖ⟩ + have hset := Irreducible.maximalIdeal_pow_eq_setOfPred_le_v_coe_pow + (v := ValuativeRel.valuation K) hϖ n + rw [hset] + have hclosed : + IsClosed {x : 𝒪[K] | + (ValuativeRel.valuation K).restrict (x : K) ≤ + (ValuativeRel.valuation K).restrict ((ϖ : K) ^ n)} := + ((ValuativeRel.valuation K).isClosed_closedBall + ((ValuativeRel.valuation K).restrict ((ϖ : K) ^ n))).preimage + (continuous_subtype_val : Continuous (fun x : 𝒪[K] => (x : K))) + convert hclosed using 1 + ext x + simp only [Set.mem_ofPred_eq] + rw [← map_pow, Valuation.restrict_le_iff, map_pow] + +/-- Each power of the maximal ideal is a zero-neighborhood in the valuation +integer ring. -/ +theorem maximalIdeal_pow_mem_nhds_zero + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (n : Nat) : + (((𝓂[K] ^ n : Ideal 𝒪[K]) : Set 𝒪[K])) ∈ nhds (0 : 𝒪[K]) := by + rcases IsDiscreteValuationRing.exists_irreducible 𝒪[K] with ⟨ϖ, hϖ⟩ + let γ : (ValuativeRel.ValueGroupWithZero K)ˣ := + Units.mk0 (ValuativeRel.valuation K ((ϖ : 𝒪[K]) : K) ^ n) + (pow_ne_zero n (ne_of_gt (Valuation.integer.v_irreducible_pos + (v := ValuativeRel.valuation K) hϖ))) + refine (mem_nhds_subtype ((ValuativeRel.valuation K).integer : Set K) + (0 : 𝒪[K]) (((𝓂[K] ^ n : Ideal 𝒪[K]) : Set 𝒪[K]))).2 ?_ + refine ⟨{x : K | ValuativeRel.valuation K x < + (γ : ValuativeRel.ValueGroupWithZero K)}, ?_, ?_⟩ + · exact (IsValuativeTopology.hasBasis_nhds_zero K).mem_of_mem (i := γ) trivial + · intro x hx + change x ∈ ((𝓂[K] ^ n : Ideal 𝒪[K]) : Set 𝒪[K]) + have hset := Irreducible.maximalIdeal_pow_eq_setOfPred_le_v_coe_pow + (v := ValuativeRel.valuation K) hϖ n + rw [hset] + have hxv : ValuativeRel.valuation K ((x : 𝒪[K]) : K) < + (γ : ValuativeRel.ValueGroupWithZero K) := hx + exact le_of_lt hxv + +/-- Powers of an element of the maximal ideal tend to zero in the valuation +integer ring. -/ +theorem tendsto_pow_succ_of_mem_maximalIdeal + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] {x : 𝒪[K]} + (hx : x ∈ (𝓂[K] : Ideal 𝒪[K])) : + Tendsto (fun d : Nat => x ^ (d + 1)) atTop (nhds (0 : 𝒪[K])) := by + rw [tendsto_def] + intro s hs + rcases eventually_maximalIdeal_pow_subset_nhds_zero K s hs with ⟨N, hN⟩ + filter_upwards [eventually_ge_atTop N] with d hd + exact hN (d + 1) (le_trans hd (Nat.le_succ d)) + (Ideal.pow_mem_pow hx (d + 1)) + +/-- The signed version used by finite geometric inverse corrections. -/ +theorem tendsto_neg_pow_succ_of_mem_maximalIdeal + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] {x : 𝒪[K]} + (hx : x ∈ (𝓂[K] : Ideal 𝒪[K])) : + Tendsto (fun d : Nat => (-x) ^ (d + 1)) atTop (nhds (0 : 𝒪[K])) := + tendsto_pow_succ_of_mem_maximalIdeal K ((𝓂[K] : Ideal 𝒪[K]).neg_mem hx) + +/-- If a sequence of valuation integers converges, then its difference from +the limit is eventually in any fixed power of the maximal ideal. -/ +theorem eventually_sub_mem_maximalIdeal_pow_of_tendsto + (K : Type u) [Field K] [ValuativeRel K] [UniformSpace K] + [IsNonarchimedeanLocalField K] {f : Nat → 𝒪[K]} {x : 𝒪[K]} (n : Nat) + (hf : Tendsto f atTop (nhds x)) : + ∀ᶠ d in atTop, f d - x ∈ (𝓂[K] ^ n : Ideal 𝒪[K]) := by + have hdiff : Tendsto (fun d : Nat => f d - x) atTop (nhds (0 : 𝒪[K])) := by + simpa using hf.sub (tendsto_const_nhds (x := x)) + exact hdiff.eventually (maximalIdeal_pow_mem_nhds_zero K n) + +/-- If valuation-ring units converge in the valuation integer ring, then their +quotient by the limit is eventually in every fixed principal-unit level. -/ +theorem eventually_div_mem_principalUnits_of_tendsto_units + (K : Type u) [Field K] [ValuativeRel K] [UniformSpace K] [IsUniformAddGroup K] + [IsNonarchimedeanLocalField K] {f : Nat → 𝒪[K]ˣ} {x : 𝒪[K]ˣ} (n : Nat) + (hf : Tendsto (fun d : Nat => ((f d : 𝒪[K]ˣ) : 𝒪[K])) atTop + (nhds ((x : 𝒪[K]ˣ) : 𝒪[K]))) : + ∀ᶠ d in atTop, f d / x ∈ principalUnits K n := by + have hsub := eventually_sub_mem_maximalIdeal_pow_of_tendsto K n hf + filter_upwards [hsub] with d hd + rw [mem_principalUnits_iff] + change (((f d / x : 𝒪[K]ˣ) : 𝒪[K]) - 1) ∈ (𝓂[K] ^ n : Ideal 𝒪[K]) + rw [show (((f d / x : 𝒪[K]ˣ) : 𝒪[K]) - 1) = + (((f d : 𝒪[K]ˣ) : 𝒪[K]) - ((x : 𝒪[K]ˣ) : 𝒪[K])) * ↑(x⁻¹) by + simp only [div_eq_mul_inv, Units.val_mul] + calc + ((f d : 𝒪[K]ˣ) : 𝒪[K]) * ↑(x⁻¹) - 1 = + ((f d : 𝒪[K]ˣ) : 𝒪[K]) * ↑(x⁻¹) - + ((x : 𝒪[K]ˣ) : 𝒪[K]) * ↑(x⁻¹) := by + simp + _ = (((f d : 𝒪[K]ˣ) : 𝒪[K]) - ((x : 𝒪[K]ˣ) : 𝒪[K])) * ↑(x⁻¹) := by + ring] + exact (𝓂[K] ^ n : Ideal 𝒪[K]).mul_mem_right _ hd + +/-! ### Finite correction products for complete lifting -/ + +/-- Finite product of a correction sequence whose `d`-th term lies in +`U^(n+d)`. This algebraic partial product is the finite-stage input to the +complete-limit construction. -/ +def principalUnitsCorrectionProduct (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (z : ∀ d : Nat, principalUnits K (n + d)) : + Nat → 𝒪[K]ˣ + | 0 => 1 + | d + 1 => principalUnitsCorrectionProduct K n z d * (z d : 𝒪[K]ˣ) + +/-- The correction product with no factors is the identity unit. -/ +@[simp] +theorem principalUnitsCorrectionProduct_zero + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) + (z : ∀ d : Nat, principalUnits K (n + d)) : + principalUnitsCorrectionProduct K n z 0 = 1 := + rfl + +/-- The next correction product appends the correction at the current filtration depth. -/ +@[simp] +theorem principalUnitsCorrectionProduct_succ + (K : Type u) [Field K] [ValuativeRel K] (n d : Nat) + (z : ∀ d : Nat, principalUnits K (n + d)) : + principalUnitsCorrectionProduct K n z (d + 1) = + principalUnitsCorrectionProduct K n z d * (z d : 𝒪[K]ˣ) := + rfl + +/-- Every finite correction product stays in the initial principal-unit level +`U^n`. -/ +theorem principalUnitsCorrectionProduct_mem + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) + (z : ∀ d : Nat, principalUnits K (n + d)) (d : Nat) : + principalUnitsCorrectionProduct K n z d ∈ principalUnits K n := by + induction d with + | zero => + simp [principalUnitsCorrectionProduct] + | succ d ih => + rw [principalUnitsCorrectionProduct_succ] + exact (principalUnits K n).mul_mem ih + (principalUnits_antitone K (Nat.le_add_right n d) (z d).2) + +/-- The tail quotient of two finite correction products lies in the principal +unit level controlled by the earlier index. This is the filtration input for +the later Cauchy argument. -/ +theorem principalUnitsCorrectionProduct_div_mem + (K : Type u) [Field K] [ValuativeRel K] (n m d : Nat) + (z : ∀ d : Nat, principalUnits K (n + d)) : + principalUnitsCorrectionProduct K n z (m + d) / + principalUnitsCorrectionProduct K n z m ∈ + principalUnits K (n + m) := by + induction d with + | zero => + simp + | succ d ih => + have hprod : + principalUnitsCorrectionProduct K n z (m + (d + 1)) = + principalUnitsCorrectionProduct K n z (m + d) * + (z (m + d) : 𝒪[K]ˣ) := by + rw [Nat.add_succ] + rfl + rw [hprod] + have hz : + (z (m + d) : 𝒪[K]ˣ) ∈ principalUnits K (n + m) := by + exact principalUnits_antitone K + (Nat.add_le_add_left (Nat.le_add_right m d) n) (z (m + d)).2 + have hEq : + principalUnitsCorrectionProduct K n z (m + d) * + (z (m + d) : 𝒪[K]ˣ) / + principalUnitsCorrectionProduct K n z m = + (principalUnitsCorrectionProduct K n z (m + d) / + principalUnitsCorrectionProduct K n z m) * + (z (m + d) : 𝒪[K]ˣ) := by + simp [div_eq_mul_inv, mul_assoc, mul_comm] + rw [hEq] + exact (principalUnits K (n + m)).mul_mem ih hz + +/-- Ring-valued form of the tail-control statement: the two finite correction +products are congruent modulo `𝓂^(n+m)`. -/ +theorem principalUnitsCorrectionProduct_div_sub_one_mem + (K : Type u) [Field K] [ValuativeRel K] (n m d : Nat) + (z : ∀ d : Nat, principalUnits K (n + d)) : + ((principalUnitsCorrectionProduct K n z (m + d) / + principalUnitsCorrectionProduct K n z m : 𝒪[K]ˣ) : 𝒪[K]) - 1 ∈ + (𝓂[K] ^ (n + m) : Ideal 𝒪[K]) := by + exact (mem_principalUnits_iff K + (principalUnitsCorrectionProduct K n z (m + d) / + principalUnitsCorrectionProduct K n z m) (n + m)).1 + (principalUnitsCorrectionProduct_div_mem K n m d z) + +/-- Rewrites a difference of units as the earlier unit times a quotient error. +This is the algebraic bridge from multiplicative tail control to additive +uniformity control. -/ +lemma unit_sub_eq_mul_div_sub_one + (K : Type u) [Field K] [ValuativeRel K] (a b : 𝒪[K]ˣ) : + (a : 𝒪[K]) - (b : 𝒪[K]) = + (b : 𝒪[K]) * (((a / b : 𝒪[K]ˣ) : 𝒪[K]) - 1) := by + have hmul : (b : 𝒪[K]) * ((a / b : 𝒪[K]ˣ) : 𝒪[K]) = (a : 𝒪[K]) := by + simp [div_eq_mul_inv, mul_left_comm] + calc + (a : 𝒪[K]) - (b : 𝒪[K]) = + (b : 𝒪[K]) * ((a / b : 𝒪[K]ˣ) : 𝒪[K]) - (b : 𝒪[K]) := by + rw [hmul] + _ = (b : 𝒪[K]) * (((a / b : 𝒪[K]ˣ) : 𝒪[K]) - 1) := by + ring + +/-- Additive form of the correction-product tail control. This is the form +needed by the additive uniformity on the valuation integer ring. -/ +theorem principalUnitsCorrectionProduct_sub_mem + (K : Type u) [Field K] [ValuativeRel K] (n m d : Nat) + (z : ∀ d : Nat, principalUnits K (n + d)) : + ((principalUnitsCorrectionProduct K n z (m + d) : 𝒪[K]ˣ) : 𝒪[K]) - + ((principalUnitsCorrectionProduct K n z m : 𝒪[K]ˣ) : 𝒪[K]) ∈ + (𝓂[K] ^ (n + m) : Ideal 𝒪[K]) := by + let a : 𝒪[K]ˣ := principalUnitsCorrectionProduct K n z (m + d) + let b : 𝒪[K]ˣ := principalUnitsCorrectionProduct K n z m + have htail : (((a / b : 𝒪[K]ˣ) : 𝒪[K]) - 1) ∈ + (𝓂[K] ^ (n + m) : Ideal 𝒪[K]) := by + simpa [a, b] using principalUnitsCorrectionProduct_div_sub_one_mem K n m d z + rw [unit_sub_eq_mul_div_sub_one K a b] + exact Ideal.mul_mem_left _ _ htail + +/-- Uniform-tail algebraic input: two sufficiently late correction products +are congruent modulo any fixed earlier level of the maximal-ideal filtration. -/ +theorem principalUnitsCorrectionProduct_sub_mem_of_le + (K : Type u) [Field K] [ValuativeRel K] (n N i j : Nat) + (z : ∀ d : Nat, principalUnits K (n + d)) + (hi : N ≤ i) (hj : N ≤ j) : + ((principalUnitsCorrectionProduct K n z i : 𝒪[K]ˣ) : 𝒪[K]) - + ((principalUnitsCorrectionProduct K n z j : 𝒪[K]ˣ) : 𝒪[K]) ∈ + (𝓂[K] ^ (n + N) : Ideal 𝒪[K]) := by + by_cases hji : j ≤ i + · obtain ⟨d, rfl⟩ := Nat.exists_eq_add_of_le hji + exact Ideal.pow_le_pow_right (Nat.add_le_add_left hj n) + (principalUnitsCorrectionProduct_sub_mem K n j d z) + · have hij : i ≤ j := Nat.le_of_not_ge hji + obtain ⟨d, rfl⟩ := Nat.exists_eq_add_of_le hij + have hdiff : + ((principalUnitsCorrectionProduct K n z (i + d) : 𝒪[K]ˣ) : 𝒪[K]) - + ((principalUnitsCorrectionProduct K n z i : 𝒪[K]ˣ) : 𝒪[K]) ∈ + (𝓂[K] ^ (n + N) : Ideal 𝒪[K]) := by + exact Ideal.pow_le_pow_right (Nat.add_le_add_left hi n) + (principalUnitsCorrectionProduct_sub_mem K n i d z) + have hEq : + ((principalUnitsCorrectionProduct K n z i : 𝒪[K]ˣ) : 𝒪[K]) - + ((principalUnitsCorrectionProduct K n z (i + d) : 𝒪[K]ˣ) : 𝒪[K]) = + -(((principalUnitsCorrectionProduct K n z (i + d) : 𝒪[K]ˣ) : 𝒪[K]) - + ((principalUnitsCorrectionProduct K n z i : 𝒪[K]ˣ) : 𝒪[K])) := by + ring + rw [hEq] + exact (𝓂[K] ^ (n + N) : Ideal 𝒪[K]).neg_mem hdiff + +/-- The finite correction products form a Cauchy sequence in the valuation +integer ring. This is the first complete-side output of the tail estimates. -/ +theorem principalUnitsCorrectionProduct_cauchySeq + (K : Type u) [Field K] [ValuativeRel K] [UniformSpace K] + [IsNonarchimedeanLocalField K] (n : Nat) + (z : ∀ d : Nat, principalUnits K (n + d)) : + CauchySeq fun d : Nat => + ((principalUnitsCorrectionProduct K n z d : 𝒪[K]ˣ) : 𝒪[K]) := by + rw [cauchySeq_iff] + intro V hV + rw [uniformity_eq_comap_nhds_zero 𝒪[K]] at hV + rw [mem_comap] at hV + rcases hV with ⟨s, hs, hsub⟩ + rcases eventually_maximalIdeal_pow_subset_nhds_zero K s hs with ⟨N, hN⟩ + refine ⟨N, ?_⟩ + intro i hi j hj + apply hsub + exact hN (n + N) (Nat.le_add_left N n) + (principalUnitsCorrectionProduct_sub_mem_of_le K n N j i z hj hi) + +/-- Completeness of the valuation integer ring gives a limit for the finite +correction products. The statement deliberately stops at an `𝒪[K]`-valued +limit; proving that the limit is a unit and remains in the intended +principal-unit level is the next frontier. -/ +theorem exists_tendsto_principalUnitsCorrectionProduct + (K : Type u) [Field K] [ValuativeRel K] [UniformSpace K] [IsUniformAddGroup K] + [IsNonarchimedeanLocalField K] (n : Nat) + (z : ∀ d : Nat, principalUnits K (n + d)) : + ∃ x : 𝒪[K], Tendsto + (fun d : Nat => ((principalUnitsCorrectionProduct K n z d : 𝒪[K]ˣ) : 𝒪[K])) + atTop (nhds x) := + cauchySeq_tendsto_of_complete + (principalUnitsCorrectionProduct_cauchySeq K n z) + +/-- Any limit of the correction-product sequence still satisfies the defining +congruence of `U^n`, viewed inside the valuation integer ring. -/ +theorem principalUnitsCorrectionProduct_limit_sub_one_mem + (K : Type u) [Field K] [ValuativeRel K] [UniformSpace K] + [IsNonarchimedeanLocalField K] (n : Nat) + (z : ∀ d : Nat, principalUnits K (n + d)) (x : 𝒪[K]) + (hx : Tendsto + (fun d : Nat => ((principalUnitsCorrectionProduct K n z d : 𝒪[K]ˣ) : 𝒪[K])) + atTop (nhds x)) : + x - 1 ∈ (𝓂[K] ^ n : Ideal 𝒪[K]) := by + have hclosed := isClosed_maximalIdeal_pow K n + refine hclosed.mem_of_tendsto + (f := fun d : Nat => + ((principalUnitsCorrectionProduct K n z d : 𝒪[K]ˣ) : 𝒪[K]) - 1) + (b := (atTop : Filter Nat)) (x := x - 1) ?_ ?_ + · exact hx.sub tendsto_const_nhds + · exact Eventually.of_forall fun d => + (mem_principalUnits_iff K (principalUnitsCorrectionProduct K n z d) n).1 + (principalUnitsCorrectionProduct_mem K n z d) + +/-- Complete-side output with the retained principal-unit congruence: the +finite correction products have an `𝒪[K]`-valued limit whose difference from +`1` lies in `𝓂^n`. -/ +theorem exists_tendsto_principalUnitsCorrectionProduct_sub_one_mem + (K : Type u) [Field K] [ValuativeRel K] [UniformSpace K] [IsUniformAddGroup K] + [IsNonarchimedeanLocalField K] (n : Nat) + (z : ∀ d : Nat, principalUnits K (n + d)) : + ∃ x : 𝒪[K], Tendsto + (fun d : Nat => ((principalUnitsCorrectionProduct K n z d : 𝒪[K]ˣ) : 𝒪[K])) + atTop (nhds x) ∧ + x - 1 ∈ (𝓂[K] ^ n : Ideal 𝒪[K]) := by + rcases exists_tendsto_principalUnitsCorrectionProduct K n z with ⟨x, hx⟩ + exact ⟨x, hx, principalUnitsCorrectionProduct_limit_sub_one_mem K n z x hx⟩ + +/-- The concrete quotient equivalence sends a principal-unit class to the corresponding +`QuotientGroup` class. -/ +@[simp] +theorem principalUnitsSuccQuotConcreteEquiv_mk + (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (u : principalUnits K n) : + principalUnitsSuccQuotConcreteEquiv K n + (principalUnitsSuccQuotMk K n u) = + QuotientGroup.mk u := + rfl + +/-- The actual inclusion `U^(n+1) → U^n` of principal units. -/ +def principalUnitsSuccIncl (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + principalUnits K (n + 1) →* principalUnits K n where + toFun u := ⟨u.1, principalUnits_succ_le K n u.2⟩ + map_one' := rfl + map_mul' := by + intro a b + rfl + +/-- The inclusion `U^(n+1) → U^n` retains the underlying unit and its stronger filtration +witness. -/ +theorem principalUnitsSuccIncl_apply + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) + (u : principalUnits K (n + 1)) : + principalUnitsSuccIncl K n u = + ⟨u.1, principalUnits_succ_le K n u.2⟩ := + rfl + +/-- The inclusion `U^(n+1) → U^n` does not change the underlying valuation-ring unit. -/ +theorem principalUnitsSuccIncl_val + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) + (u : principalUnits K (n + 1)) : + ((principalUnitsSuccIncl K n u : principalUnits K n) : 𝒪[K]ˣ) = + (u : 𝒪[K]ˣ) := + rfl + +/-- The inclusion `U^(n+1) → U^n` is injective. -/ +theorem principalUnitsSuccIncl_injective + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + Function.Injective (principalUnitsSuccIncl K n) := by + intro a b h + have hval : (a : 𝒪[K]ˣ) = (b : 𝒪[K]ˣ) := + congrArg (fun x : principalUnits K n => (x : 𝒪[K]ˣ)) h + exact Subtype.ext hval + +/-- The range of `U^(n+1) → U^n` is the subgroup used to form +`U^n/U^(n+1)`. -/ +theorem principalUnitsSuccIncl_range + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + MonoidHom.range (principalUnitsSuccIncl K n) = + (principalUnits K (n + 1)).subgroupOf (principalUnits K n) := by + ext u + constructor + · intro hu + rcases hu with ⟨v, hv⟩ + rw [← hv] + exact v.2 + · intro hu + exact ⟨⟨u.1, hu⟩, by ext; rfl⟩ + +/-- A principal unit lies in the range of `U^(n+1) → U^n` exactly when it belongs to the next +filtration subgroup. -/ +theorem principalUnitsSuccIncl_mem_range_iff + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) + (u : principalUnits K n) : + u ∈ MonoidHom.range (principalUnitsSuccIncl K n) ↔ + u ∈ (principalUnits K (n + 1)).subgroupOf (principalUnits K n) := by + rw [principalUnitsSuccIncl_range] + +/-- Every class in `U^n/U^(n+1)` has a representative in `U^n`. -/ +theorem principalUnitsSuccQuotMk_surjective + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + Function.Surjective (principalUnitsSuccQuotMk K n) := + QuotientGroup.mk'_surjective ((principalUnits K (n + 1)).subgroupOf (principalUnits K n)) + +/-- The kernel of the canonical map `U^n → U^n/U^(n+1)` is the subgroup `U^(n+1)`. -/ +theorem principalUnitsSuccQuotMk_ker (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + MonoidHom.ker (principalUnitsSuccQuotMk K n) = + (principalUnits K (n + 1)).subgroupOf (principalUnits K n) := + QuotientGroup.ker_mk' + (N := (principalUnits K (n + 1)).subgroupOf (principalUnits K n)) + +/-- A principal unit is killed by the canonical quotient map exactly when it lies in `U^(n+1)`. -/ +theorem principalUnitsSuccQuotMk_mem_ker_iff + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) + (u : principalUnits K n) : + u ∈ MonoidHom.ker (principalUnitsSuccQuotMk K n) ↔ + u ∈ (principalUnits K (n + 1)).subgroupOf (principalUnits K n) := by + rw [principalUnitsSuccQuotMk_ker] + +/-- The canonical map from `U^n` has the whole successive quotient as its range. -/ +theorem principalUnitsSuccQuotMk_range + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + MonoidHom.range (principalUnitsSuccQuotMk K n) = ⊤ := by + ext x + constructor + · intro _ + exact Subgroup.mem_top x + · intro _ + rcases principalUnitsSuccQuotMk_surjective K n x with ⟨u, hu⟩ + exact ⟨u, hu⟩ + +/-- Every element of `U^n/U^(n+1)` belongs to the range of the canonical quotient map. -/ +theorem principalUnitsSuccQuotMk_mem_range + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) + (x : PrincipalUnitsSuccQuot K n) : + x ∈ MonoidHom.range (principalUnitsSuccQuotMk K n) := by + rw [principalUnitsSuccQuotMk_range] + exact Subgroup.mem_top x + +/-- The range of the canonical quotient map has the same finite cardinality as `U^n/U^(n+1)`. -/ +theorem principalUnitsSuccQuotMk_range_card_eq + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + Nat.card (MonoidHom.range (principalUnitsSuccQuotMk K n)) = + Nat.card (PrincipalUnitsSuccQuot K n) := by + refine Nat.card_congr ?_ + exact + { toFun := fun x => x.1 + invFun := fun x => + ⟨x, by + rcases principalUnitsSuccQuotMk_surjective K n x with ⟨u, hu⟩ + exact ⟨u, hu⟩⟩ + left_inv := by + intro x + rfl + right_inv := by + intro x + rfl } + +/-- The class of a principal unit is trivial exactly when the unit belongs to `U^(n+1)`. -/ +theorem principalUnitsSuccQuotMk_eq_one_iff + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) + (u : principalUnits K n) : + principalUnitsSuccQuotMk K n u = 1 ↔ + u ∈ (principalUnits K (n + 1)).subgroupOf (principalUnits K n) := by + constructor + · intro h + apply (QuotientGroup.eq_one_iff + (N := (principalUnits K (n + 1)).subgroupOf (principalUnits K n)) u).mp + have h' := congrArg (principalUnitsSuccQuotConcreteEquiv K n) h + simpa using h' + · intro h + apply (principalUnitsSuccQuotConcreteEquiv K n).injective + simpa using + (QuotientGroup.eq_one_iff + (N := (principalUnits K (n + 1)).subgroupOf (principalUnits K n)) u).mpr h + +/-- Two principal units define the same successive-quotient class exactly when one differs by a +factor in `U^(n+1)`. -/ +theorem principalUnitsSuccQuotMk_mk_eq_mk_iff + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) + (u v : principalUnits K n) : + principalUnitsSuccQuotMk K n u = principalUnitsSuccQuotMk K n v ↔ + ∃ z ∈ (principalUnits K (n + 1)).subgroupOf (principalUnits K n), + u * z = v := by + constructor + · intro h + have h' := congrArg (principalUnitsSuccQuotConcreteEquiv K n) h + exact (QuotientGroup.mk'_eq_mk' + (N := (principalUnits K (n + 1)).subgroupOf (principalUnits K n))).mp h' + · intro h + apply (principalUnitsSuccQuotConcreteEquiv K n).injective + exact (QuotientGroup.mk'_eq_mk' + (N := (principalUnits K (n + 1)).subgroupOf (principalUnits K n))).mpr h + +/-- Two principal units define the same successive-quotient class exactly when their quotient lies +in `U^(n+1)`. -/ +theorem principalUnitsSuccQuotMk_eq_iff_div_mem + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) + (u v : principalUnits K n) : + principalUnitsSuccQuotMk K n u = principalUnitsSuccQuotMk K n v ↔ + u / v ∈ (principalUnits K (n + 1)).subgroupOf (principalUnits K n) := by + constructor + · intro h + have h' := congrArg (principalUnitsSuccQuotConcreteEquiv K n) h + exact (QuotientGroup.eq_iff_div_mem + (N := (principalUnits K (n + 1)).subgroupOf (principalUnits K n))).mp h' + · intro h + apply (principalUnitsSuccQuotConcreteEquiv K n).injective + exact (QuotientGroup.eq_iff_div_mem + (N := (principalUnits K (n + 1)).subgroupOf (principalUnits K n))).mpr h + +/-- Exactness of the concrete sequence `U^(n+1) → U^n → U^n/U^(n+1)`. -/ +theorem principalUnitsSuccIncl_exact + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + MonoidHom.range (principalUnitsSuccIncl K n) = + MonoidHom.ker (principalUnitsSuccQuotMk K n) := by + rw [principalUnitsSuccIncl_range, principalUnitsSuccQuotMk_ker] + +/-- Every element included from `U^(n+1)` lies in the kernel of the quotient map from `U^n`. -/ +theorem principalUnitsSuccIncl_mem_ker + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) + (u : principalUnits K (n + 1)) : + principalUnitsSuccIncl K n u ∈ MonoidHom.ker (principalUnitsSuccQuotMk K n) := by + rw [← principalUnitsSuccIncl_exact K n] + exact ⟨u, rfl⟩ + +/-- Quotienting an element after including it from `U^(n+1)` produces the identity class. -/ +@[simp] +theorem principalUnitsSuccQuotMk_comp_incl_apply + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) + (u : principalUnits K (n + 1)) : + principalUnitsSuccQuotMk K n (principalUnitsSuccIncl K n u) = 1 := by + exact principalUnitsSuccIncl_mem_ker K n u + +/-- The composite `U^(n+1) → U^n → U^n/U^(n+1)` is the trivial homomorphism. -/ +theorem principalUnitsSuccQuotMk_comp_incl + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + (principalUnitsSuccQuotMk K n).comp (principalUnitsSuccIncl K n) = 1 := by + ext u + exact principalUnitsSuccQuotMk_comp_incl_apply K n u + +/-- Membership in the embedded subgroup `U^(n+1)` is equivalent to congruence to one modulo +`𝓂^(n+1)`. -/ +theorem mem_principalUnits_succ_subgroupOf_iff + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) + (u : principalUnits K n) : + u ∈ (principalUnits K (n + 1)).subgroupOf (principalUnits K n) ↔ + (((u : 𝒪[K]ˣ) : 𝒪[K]) - 1) ∈ + (𝓂[K] ^ (n + 1) : Ideal 𝒪[K]) := by + rw [Subgroup.mem_subgroupOf, mem_principalUnits_iff] + +/-- The submodule `𝓂^(n+1)` inside `𝓂^n`. -/ +abbrev maximalIdealPowSuccSubmodule + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + Submodule (𝒪[K]) ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) := + Submodule.comap (Submodule.subtype (p := (𝓂[K] ^ n : Ideal 𝒪[K]))) + ((𝓂[K] ^ (n + 1) : Ideal 𝒪[K]) : Submodule (𝒪[K]) (𝒪[K])) + +/-- The additive ideal-power quotient `𝓂^n/𝓂^(n+1)`. -/ +def MaximalIdealPowSuccQuot + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : Type u := + ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) ⧸ maximalIdealPowSuccSubmodule K n + +/-- Equips the additive quotient `𝓂^n/𝓂^(n+1)` with its additive commutative group structure. -/ +instance maximalIdealPowSuccQuotAddCommGroup + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + AddCommGroup (MaximalIdealPowSuccQuot K n) := by + change AddCommGroup + (((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) ⧸ + maximalIdealPowSuccSubmodule K n) + infer_instance + +/-- Equips `𝓂^n/𝓂^(n+1)` with the module structure induced from the valuation ring. -/ +instance maximalIdealPowSuccQuotModule + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + Module 𝒪[K] (MaximalIdealPowSuccQuot K n) := by + change Module 𝒪[K] + (((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) ⧸ + maximalIdealPowSuccSubmodule K n) + infer_instance + +/-- Explicit access to the concrete submodule-quotient representation. -/ +def maximalIdealPowSuccQuotConcreteLinearEquiv + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + MaximalIdealPowSuccQuot K n ≃ₗ[𝒪[K]] + (((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) ⧸ + maximalIdealPowSuccSubmodule K n) := by + change + (((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) ⧸ + maximalIdealPowSuccSubmodule K n) ≃ₗ[𝒪[K]] + (((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) ⧸ + maximalIdealPowSuccSubmodule K n) + exact LinearEquiv.refl 𝒪[K] _ + +/-- The quotient map `𝓂^n → 𝓂^n/𝓂^(n+1)`. -/ +def maximalIdealPowSuccQuotMk + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) →ₗ[𝒪[K]] + MaximalIdealPowSuccQuot K n := by + change ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) →ₗ[𝒪[K]] + (((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) ⧸ + maximalIdealPowSuccSubmodule K n) + exact Submodule.mkQ (maximalIdealPowSuccSubmodule K n) + +/-- The concrete linear equivalence sends an ideal-power class to the corresponding +submodule-quotient class. -/ +@[simp] +theorem maximalIdealPowSuccQuotConcreteLinearEquiv_mk + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) + (a : ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u)) : + maximalIdealPowSuccQuotConcreteLinearEquiv K n + (maximalIdealPowSuccQuotMk K n a) = + Submodule.Quotient.mk a := + rfl + +/-- Every class in `𝓂^n/𝓂^(n+1)` has a representative in `𝓂^n`. -/ +theorem maximalIdealPowSuccQuotMk_surjective + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + Function.Surjective (maximalIdealPowSuccQuotMk K n) := + Submodule.mkQ_surjective (maximalIdealPowSuccSubmodule K n) + +/-- Eliminate an ideal-power quotient class through its canonical class map. -/ +protected theorem MaximalIdealPowSuccQuot.inductionOn + {K : Type u} [Field K] [ValuativeRel K] (n : Nat) + {motive : MaximalIdealPowSuccQuot K n → Prop} + (q : MaximalIdealPowSuccQuot K n) + (h : ∀ a : ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u), + motive (maximalIdealPowSuccQuotMk K n a)) : + motive q := by + change motive + (show ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) ⧸ + maximalIdealPowSuccSubmodule K n from q) + refine Quotient.inductionOn q ?_ + intro a + exact h a + +/-- Binary elimination through arbitrary ideal-power representatives. -/ +protected theorem MaximalIdealPowSuccQuot.inductionOn₂ + {K : Type u} [Field K] [ValuativeRel K] (n : Nat) + {motive : MaximalIdealPowSuccQuot K n → + MaximalIdealPowSuccQuot K n → Prop} + (q r : MaximalIdealPowSuccQuot K n) + (h : ∀ a b : ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u), + motive (maximalIdealPowSuccQuotMk K n a) + (maximalIdealPowSuccQuotMk K n b)) : + motive q r := by + refine MaximalIdealPowSuccQuot.inductionOn n + (motive := fun q' => motive q' r) q ?_ + intro a + refine MaximalIdealPowSuccQuot.inductionOn n + (motive := fun r' => motive (maximalIdealPowSuccQuotMk K n a) r') r ?_ + intro b + exact h a b + +/-- Descend an arbitrary representative-level function that is constant +modulo `𝓂^(n+1)`. -/ +def maximalIdealPowSuccQuotLift + {K : Type u} {P : Sort*} [Field K] [ValuativeRel K] (n : Nat) + (f : ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) → P) + (h : ∀ a b, a - b ∈ maximalIdealPowSuccSubmodule K n → + f a = f b) : + MaximalIdealPowSuccQuot K n → P := by + change + ((((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) ⧸ + maximalIdealPowSuccSubmodule K n) → P) + refine Quotient.lift f ?_ + intro a b hab + have hq : + (Submodule.Quotient.mk a : + ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) ⧸ + maximalIdealPowSuccSubmodule K n) = + Submodule.Quotient.mk b := + Quotient.sound hab + exact h a b + ((Submodule.Quotient.eq (maximalIdealPowSuccSubmodule K n)).1 hq) + +/-- A function descended to `𝓂^n/𝓂^(n+1)` agrees with the original function on representatives. -/ +@[simp] +theorem maximalIdealPowSuccQuotLift_mk + {K : Type u} {P : Sort*} [Field K] [ValuativeRel K] (n : Nat) + (f : ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) → P) + (h : ∀ a b, a - b ∈ maximalIdealPowSuccSubmodule K n → + f a = f b) + (a : ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u)) : + maximalIdealPowSuccQuotLift n f h + (maximalIdealPowSuccQuotMk K n a) = f a := + rfl + +/-- Descend a linear map that vanishes on `𝓂^(n+1)` inside `𝓂^n`. -/ +def maximalIdealPowSuccQuotLinearLift + {K : Type u} {M : Type*} [Field K] [ValuativeRel K] + [AddCommGroup M] [Module 𝒪[K] M] (n : Nat) + (f : ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) →ₗ[𝒪[K]] M) + (h : maximalIdealPowSuccSubmodule K n ≤ f.ker) : + MaximalIdealPowSuccQuot K n →ₗ[𝒪[K]] M := by + change + (((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) ⧸ + maximalIdealPowSuccSubmodule K n) →ₗ[𝒪[K]] M + exact (maximalIdealPowSuccSubmodule K n).liftQ f h + +/-- A linear map descended to `𝓂^n/𝓂^(n+1)` agrees with the original linear map on representatives. +A linear map descended to `𝓂^n/𝓂^(n+1)` agrees with the original linear map on representatives. -/ +@[simp] +theorem maximalIdealPowSuccQuotLinearLift_mk + {K : Type u} {M : Type*} [Field K] [ValuativeRel K] + [AddCommGroup M] [Module 𝒪[K] M] (n : Nat) + (f : ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) →ₗ[𝒪[K]] M) + (h : maximalIdealPowSuccSubmodule K n ≤ f.ker) + (a : ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u)) : + maximalIdealPowSuccQuotLinearLift n f h + (maximalIdealPowSuccQuotMk K n a) = f a := + rfl + +/-- An element of `𝓂^n` belongs to the defining submodule exactly when its value lies in `𝓂^(n+1)`. +An element of `𝓂^n` belongs to the defining submodule exactly when its value lies in `𝓂^(n+1)`. -/ +theorem mem_maximalIdealPowSuccSubmodule_iff + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) + (a : ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u)) : + a ∈ maximalIdealPowSuccSubmodule K n ↔ + (a : 𝒪[K]) ∈ (𝓂[K] ^ (n + 1) : Ideal 𝒪[K]) := + Iff.rfl + +/-- The class of an element of `𝓂^n` is zero exactly when its value lies in `𝓂^(n+1)`. -/ +theorem maximalIdealPowSuccQuotMk_eq_zero_iff + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) + (a : ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u)) : + maximalIdealPowSuccQuotMk K n a = 0 ↔ + (a : 𝒪[K]) ∈ (𝓂[K] ^ (n + 1) : Ideal 𝒪[K]) := by + change (Submodule.Quotient.mk a : + ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) ⧸ + maximalIdealPowSuccSubmodule K n) = 0 ↔ _ + rw [Submodule.Quotient.mk_eq_zero] + rfl + +/-- Two elements of `𝓂^n` define the same quotient class exactly when their difference lies in +`𝓂^(n+1)`. -/ +@[simp] +theorem maximalIdealPowSuccQuotMk_eq_iff + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) + (a b : ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u)) : + maximalIdealPowSuccQuotMk K n a = + maximalIdealPowSuccQuotMk K n b ↔ + a - b ∈ maximalIdealPowSuccSubmodule K n := by + change (Submodule.Quotient.mk a : + ((𝓂[K] ^ n : Ideal 𝒪[K]) : Type u) ⧸ + maximalIdealPowSuccSubmodule K n) = + Submodule.Quotient.mk b ↔ _ + exact Submodule.Quotient.eq (maximalIdealPowSuccSubmodule K n) + +/-- If `a ∈ 𝓂^n` with `n ≥ 1`, then `1 + a` is a unit of the valuation ring. -/ +theorem isUnit_one_add_of_mem_maximalIdeal_pow + (K : Type u) [Field K] [ValuativeRel K] {n : Nat} (hn : 1 ≤ n) + (a : 𝒪[K]) (ha : a ∈ (𝓂[K] ^ n : Ideal 𝒪[K])) : IsUnit (1 + a) := by + have ha1 : a ∈ (𝓂[K] : Ideal 𝒪[K]) := by + have hle : (𝓂[K] ^ n : Ideal 𝒪[K]) ≤ (𝓂[K] ^ 1 : Ideal 𝒪[K]) := + Ideal.pow_le_pow_right hn + simpa using hle ha + have hnon : (-a) ∈ nonunits 𝒪[K] := by + rw [← IsLocalRing.mem_maximalIdeal] + exact (𝓂[K] : Ideal 𝒪[K]).neg_mem ha1 + have hunit : IsUnit (1 - (-a)) := + IsLocalRing.isUnit_one_sub_self_of_mem_nonunits (-a) hnon + simpa [sub_neg_eq_add] using hunit + +/-- The unit `1 + a` attached to an element `a ∈ 𝓂^n`, for `n ≥ 1`. -/ +noncomputable def principalUnitOneAddOfMemPow + (K : Type u) [Field K] [ValuativeRel K] {n : Nat} (hn : 1 ≤ n) + (a : 𝒪[K]) (ha : a ∈ (𝓂[K] ^ n : Ideal 𝒪[K])) : 𝒪[K]ˣ := + (isUnit_one_add_of_mem_maximalIdeal_pow K hn a ha).unit + +/-- The valuation-ring value of the unit constructed from `a ∈ 𝓂^n` is `1 + a`. -/ +@[simp] +theorem principalUnitOneAddOfMemPow_val + (K : Type u) [Field K] [ValuativeRel K] {n : Nat} (hn : 1 ≤ n) + (a : 𝒪[K]) (ha : a ∈ (𝓂[K] ^ n : Ideal 𝒪[K])) : + ((principalUnitOneAddOfMemPow K hn a ha : 𝒪[K]ˣ) : 𝒪[K]) = 1 + a := + IsUnit.unit_spec (isUnit_one_add_of_mem_maximalIdeal_pow K hn a ha) + +/-- The unit `1 + a`, viewed as an element of `U^n`. -/ +noncomputable def principalUnitOneAddOfMemPowSubgroup + (K : Type u) [Field K] [ValuativeRel K] {n : Nat} (hn : 1 ≤ n) + (a : 𝒪[K]) (ha : a ∈ (𝓂[K] ^ n : Ideal 𝒪[K])) : principalUnits K n := + ⟨principalUnitOneAddOfMemPow K hn a ha, by + rw [mem_principalUnits_iff] + simp [principalUnitOneAddOfMemPow_val, ha] + ⟩ + +/-- Viewing the unit `1 + a` in `U^n` preserves its underlying valuation-ring unit. -/ +@[simp] +theorem principalUnitOneAddOfMemPowSubgroup_val + (K : Type u) [Field K] [ValuativeRel K] {n : Nat} (hn : 1 ≤ n) + (a : 𝒪[K]) (ha : a ∈ (𝓂[K] ^ n : Ideal 𝒪[K])) : + ((principalUnitOneAddOfMemPowSubgroup K hn a ha : principalUnits K n) : 𝒪[K]ˣ) = + principalUnitOneAddOfMemPow K hn a ha := + rfl + +/-- For `n ≥ 1`, the complete limit of finite correction products can be +viewed as an element of the principal-unit subgroup `U^n`. -/ +theorem exists_tendsto_principalUnitsCorrectionProduct_principalUnit + (K : Type u) [Field K] [ValuativeRel K] [UniformSpace K] [IsUniformAddGroup K] + [IsNonarchimedeanLocalField K] (n : Nat) (hn : 1 ≤ n) + (z : ∀ d : Nat, principalUnits K (n + d)) : + ∃ x : principalUnits K n, Tendsto + (fun d : Nat => ((principalUnitsCorrectionProduct K n z d : 𝒪[K]ˣ) : 𝒪[K])) + atTop (nhds (((x : principalUnits K n) : 𝒪[K]ˣ) : 𝒪[K])) := by + rcases exists_tendsto_principalUnitsCorrectionProduct_sub_one_mem K n z with + ⟨x, hx, hmem⟩ + let u : principalUnits K n := + principalUnitOneAddOfMemPowSubgroup K hn (x - 1) hmem + refine ⟨u, ?_⟩ + have huval : (((u : principalUnits K n) : 𝒪[K]ˣ) : 𝒪[K]) = x := by + change ((principalUnitOneAddOfMemPow K hn (x - 1) hmem : 𝒪[K]ˣ) : 𝒪[K]) = x + rw [principalUnitOneAddOfMemPow_val] + ring + simpa [huval] using hx + +/-- The concrete map `𝓂^n → U^n/U^(n+1)` sending `a` to the class of `1 + a`. -/ +noncomputable def principalUnitsSuccQuotOfIdealPow + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) : + (𝓂[K] ^ n : Ideal 𝒪[K]) → PrincipalUnitsSuccQuot K n := + fun a => + principalUnitsSuccQuotMk K n + (principalUnitOneAddOfMemPowSubgroup K hn a.1 a.2) + +/-- The map from `𝓂^n` sends `a` to the successive principal-unit class represented by `1 + a`. -/ +@[simp] +theorem principalUnitsSuccQuotOfIdealPow_apply + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) + (a : (𝓂[K] ^ n : Ideal 𝒪[K])) : + principalUnitsSuccQuotOfIdealPow K n hn a = + principalUnitsSuccQuotMk K n + (principalUnitOneAddOfMemPowSubgroup K hn a.1 a.2) := + rfl + +/-- If a principal unit has the same first-order term as `1 + a` modulo +`𝓂^(n+1)`, then it has the same class in `U^n/U^(n+1)`. -/ +theorem principalUnitsSuccQuotMk_eq_oneAdd_of_sub_one_sub_mem_succ + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) + (u : principalUnits K n) (a : (𝓂[K] ^ n : Ideal 𝒪[K])) + (h : (((u : 𝒪[K]ˣ) : 𝒪[K]) - 1 - (a : 𝒪[K])) ∈ + (𝓂[K] ^ (n + 1) : Ideal 𝒪[K])) : + principalUnitsSuccQuotMk K n u = + principalUnitsSuccQuotOfIdealPow K n hn a := by + rw [principalUnitsSuccQuotOfIdealPow_apply] + apply (principalUnitsSuccQuotMk_eq_iff_div_mem K n _ _).2 + rw [mem_principalUnits_succ_subgroupOf_iff] + change ((((u : 𝒪[K]ˣ) / + principalUnitOneAddOfMemPow K hn (a : 𝒪[K]) a.2 : 𝒪[K]ˣ) : 𝒪[K]) - 1) ∈ + (𝓂[K] ^ (n + 1) : Ideal 𝒪[K]) + rw [show ((((u : 𝒪[K]ˣ) / + principalUnitOneAddOfMemPow K hn (a : 𝒪[K]) a.2 : 𝒪[K]ˣ) : 𝒪[K]) - 1) = + (((u : 𝒪[K]ˣ) : 𝒪[K]) - 1 - (a : 𝒪[K])) * + ↑(principalUnitOneAddOfMemPow K hn (a : 𝒪[K]) a.2)⁻¹ by + simp only [div_eq_mul_inv, Units.val_mul] + have hunit : + ((principalUnitOneAddOfMemPow K hn (a : 𝒪[K]) a.2 : 𝒪[K]ˣ) : 𝒪[K]) * + ↑(principalUnitOneAddOfMemPow K hn (a : 𝒪[K]) a.2)⁻¹ = 1 := by + simp + calc + ((u : 𝒪[K]ˣ) : 𝒪[K]) * + ↑(principalUnitOneAddOfMemPow K hn (a : 𝒪[K]) a.2)⁻¹ - 1 = + ((u : 𝒪[K]ˣ) : 𝒪[K]) * + ↑(principalUnitOneAddOfMemPow K hn (a : 𝒪[K]) a.2)⁻¹ - + ((principalUnitOneAddOfMemPow K hn (a : 𝒪[K]) a.2 : 𝒪[K]ˣ) : 𝒪[K]) * + ↑(principalUnitOneAddOfMemPow K hn (a : 𝒪[K]) a.2)⁻¹ := by + rw [hunit] + _ = (((u : 𝒪[K]ˣ) : 𝒪[K]) - 1 - (a : 𝒪[K])) * + ↑(principalUnitOneAddOfMemPow K hn (a : 𝒪[K]) a.2)⁻¹ := by + rw [principalUnitOneAddOfMemPow_val K hn (a : 𝒪[K]) a.2] + ring] + exact (𝓂[K] ^ (n + 1) : Ideal 𝒪[K]).mul_mem_right _ h + +/-- Elements of `𝓂^(n+1)` map to the trivial class in `U^n/U^(n+1)`. -/ +theorem principalUnitsSuccQuotOfIdealPow_eq_one_of_mem_succ + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) + (a : (𝓂[K] ^ n : Ideal 𝒪[K])) + (ha : (a : 𝒪[K]) ∈ (𝓂[K] ^ (n + 1) : Ideal 𝒪[K])) : + principalUnitsSuccQuotOfIdealPow K n hn a = 1 := by + apply (principalUnitsSuccQuotMk_eq_one_iff K n _).2 + rw [mem_principalUnits_succ_subgroupOf_iff] + simp [principalUnitOneAddOfMemPowSubgroup, principalUnitOneAddOfMemPow_val, ha] + +/-- A representative of the zero class in `𝓂^n/𝓂^(n+1)` maps to the identity class in `U^n/U^(n+1)`. +A representative of the zero class in `𝓂^n/𝓂^(n+1)` maps to the identity class in `U^n/U^(n+1)`. -/ +theorem principalUnitsSuccQuotOfIdealPow_eq_one_of_idealQuot_mk_eq_zero + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) + (a : (𝓂[K] ^ n : Ideal 𝒪[K])) + (ha : maximalIdealPowSuccQuotMk K n a = 0) : + principalUnitsSuccQuotOfIdealPow K n hn a = 1 := + principalUnitsSuccQuotOfIdealPow_eq_one_of_mem_succ K n hn a + ((maximalIdealPowSuccQuotMk_eq_zero_iff K n a).1 ha) + +/-- The map `a ↦ 1 + a` is insensitive to changing `a` modulo `𝓂^(n+1)`. -/ +theorem principalUnitsSuccQuotOfIdealPow_eq_of_sub_mem_succ + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) + (a b : (𝓂[K] ^ n : Ideal 𝒪[K])) + (hab : ((a : 𝒪[K]) - (b : 𝒪[K])) ∈ (𝓂[K] ^ (n + 1) : Ideal 𝒪[K])) : + principalUnitsSuccQuotOfIdealPow K n hn a = + principalUnitsSuccQuotOfIdealPow K n hn b := by + apply (principalUnitsSuccQuotMk_eq_iff_div_mem K n _ _).2 + rw [mem_principalUnits_succ_subgroupOf_iff] + change (((principalUnitOneAddOfMemPow K hn (a : 𝒪[K]) a.2 / + principalUnitOneAddOfMemPow K hn (b : 𝒪[K]) b.2 : 𝒪[K]ˣ) : 𝒪[K]) - 1) ∈ + (𝓂[K] ^ (n + 1) : Ideal 𝒪[K]) + rw [show (((principalUnitOneAddOfMemPow K hn (a : 𝒪[K]) a.2 / + principalUnitOneAddOfMemPow K hn (b : 𝒪[K]) b.2 : 𝒪[K]ˣ) : 𝒪[K]) - 1) = + ((a : 𝒪[K]) - (b : 𝒪[K])) * + ↑(principalUnitOneAddOfMemPow K hn (b : 𝒪[K]) b.2)⁻¹ by + simp only [div_eq_mul_inv, Units.val_mul] + rw [principalUnitOneAddOfMemPow_val K hn (a : 𝒪[K]) a.2] + have hbval : + ((principalUnitOneAddOfMemPow K hn (b : 𝒪[K]) b.2 : 𝒪[K]ˣ) : 𝒪[K]) = + 1 + (b : 𝒪[K]) := + principalUnitOneAddOfMemPow_val K hn (b : 𝒪[K]) b.2 + have hbinv : + ((principalUnitOneAddOfMemPow K hn (b : 𝒪[K]) b.2 : 𝒪[K]ˣ) : 𝒪[K]) * + ↑(principalUnitOneAddOfMemPow K hn (b : 𝒪[K]) b.2)⁻¹ = 1 := by + simp + calc + (1 + (a : 𝒪[K])) * ↑(principalUnitOneAddOfMemPow K hn ↑b b.2)⁻¹ - 1 = + (1 + (a : 𝒪[K])) * ↑(principalUnitOneAddOfMemPow K hn ↑b b.2)⁻¹ - + ((principalUnitOneAddOfMemPow K hn ↑b b.2 : 𝒪[K]ˣ) : 𝒪[K]) * + ↑(principalUnitOneAddOfMemPow K hn ↑b b.2)⁻¹ := by + rw [hbinv] + _ = (↑a - ↑b) * ↑(principalUnitOneAddOfMemPow K hn ↑b b.2)⁻¹ := by + rw [hbval] + ring] + exact (𝓂[K] ^ (n + 1) : Ideal 𝒪[K]).mul_mem_right _ hab + +/-- Representatives of the same class in `𝓂^n/𝓂^(n+1)` yield the same class of `1 + a` in +`U^n/U^(n+1)`. -/ +theorem principalUnitsSuccQuotOfIdealPow_eq_of_idealQuot_mk_eq + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) + (a b : (𝓂[K] ^ n : Ideal 𝒪[K])) + (hab : maximalIdealPowSuccQuotMk K n a = maximalIdealPowSuccQuotMk K n b) : + principalUnitsSuccQuotOfIdealPow K n hn a = + principalUnitsSuccQuotOfIdealPow K n hn b := by + have hsub : a - b ∈ maximalIdealPowSuccSubmodule K n := + (maximalIdealPowSuccQuotMk_eq_iff K n a b).1 hab + exact principalUnitsSuccQuotOfIdealPow_eq_of_sub_mem_succ K n hn a b (by + simpa using (mem_maximalIdealPowSuccSubmodule_iff K n (a - b)).1 hsub) + +/-- The descent of `a ↦ [1 + a]` to `𝓂^n/𝓂^(n+1)`. -/ +noncomputable def principalUnitsSuccQuotOfMaximalIdealPowSuccQuot + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) : + MaximalIdealPowSuccQuot K n → PrincipalUnitsSuccQuot K n := + maximalIdealPowSuccQuotLift n + (principalUnitsSuccQuotOfIdealPow K n hn) + (fun a b hab => + principalUnitsSuccQuotOfIdealPow_eq_of_sub_mem_succ K n hn a b (by + simpa using + (mem_maximalIdealPowSuccSubmodule_iff K n (a - b)).1 hab)) + +/-- The descended map on `𝓂^n/𝓂^(n+1)` sends a representative class to the class represented by `1 + +a`. -/ +@[simp] +theorem principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_mk + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) + (a : (𝓂[K] ^ n : Ideal 𝒪[K])) : + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn + (maximalIdealPowSuccQuotMk K n a) = + principalUnitsSuccQuotOfIdealPow K n hn a := + rfl + +/-- Products of two elements of `𝓂^n`, for `n ≥ 1`, lie in `𝓂^(n+1)`. -/ +theorem maximalIdealPow_mul_mem_succ + (K : Type u) [Field K] [ValuativeRel K] {n : Nat} (hn : 1 ≤ n) + (a b : (𝓂[K] ^ n : Ideal 𝒪[K])) : + ((a : 𝒪[K]) * (b : 𝒪[K])) ∈ (𝓂[K] ^ (n + 1) : Ideal 𝒪[K]) := by + have hmul : ((a : 𝒪[K]) * (b : 𝒪[K])) ∈ (𝓂[K] ^ (n + n) : Ideal 𝒪[K]) := by + simpa [pow_add] using (Ideal.mul_mem_mul a.2 b.2) + have hle : (𝓂[K] ^ (n + n) : Ideal 𝒪[K]) ≤ + (𝓂[K] ^ (n + 1) : Ideal 𝒪[K]) := + Ideal.pow_le_pow_right (Nat.add_le_add_left hn n) + exact hle hmul + +/-- If every `aᵢ` lies in `𝓂^n` with `n ≥ 1`, then +`∏ᵢ (1 + aᵢ) - 1` lies in the maximal ideal. -/ +theorem finset_prod_one_add_sub_one_mem_maximalIdeal_of_mem_pow + (K : Type u) [Field K] [ValuativeRel K] {ι : Type*} + (s : Finset ι) (n : Nat) (hn : 1 ≤ n) (a : ι → 𝒪[K]) + (ha : ∀ i ∈ s, a i ∈ (𝓂[K] ^ n : Ideal 𝒪[K])) : + (s.prod fun i => 1 + a i) - 1 ∈ (𝓂[K] : Ideal 𝒪[K]) := by + classical + revert a + refine Finset.induction_on s ?base ?step + · intro a ha + simp + · intro i s hi ih a ha + have hai_pow : a i ∈ (𝓂[K] ^ n : Ideal 𝒪[K]) := ha i (by simp [hi]) + have hai : a i ∈ (𝓂[K] : Ideal 𝒪[K]) := by + have hle : (𝓂[K] ^ n : Ideal 𝒪[K]) ≤ (𝓂[K] ^ 1 : Ideal 𝒪[K]) := + Ideal.pow_le_pow_right hn + simpa using hle hai_pow + have hs : ∀ j ∈ s, a j ∈ (𝓂[K] ^ n : Ideal 𝒪[K]) := by + intro j hj + exact ha j (by simp [hj]) + have hprod : (s.prod fun j => 1 + a j) - 1 ∈ (𝓂[K] : Ideal 𝒪[K]) := + ih a hs + have hterm : a i * (s.prod fun j => 1 + a j) ∈ (𝓂[K] : Ideal 𝒪[K]) := + (𝓂[K] : Ideal 𝒪[K]).mul_mem_right _ hai + rw [Finset.prod_insert hi] + rw [show (1 + a i) * (s.prod fun j => 1 + a j) - 1 = + ((s.prod fun j => 1 + a j) - 1) + + a i * (s.prod fun j => 1 + a j) by + ring] + exact (𝓂[K] : Ideal 𝒪[K]).add_mem hprod hterm + +/-- First-order expansion of products in the principal-unit filtration: +if every `aᵢ ∈ 𝓂^n` and `n ≥ 1`, then +`∏ᵢ (1 + aᵢ) ≡ 1 + Σᵢ aᵢ mod 𝓂^(n+1)`. -/ +theorem finset_prod_one_add_sub_one_sub_sum_mem_maximalIdeal_pow_succ + (K : Type u) [Field K] [ValuativeRel K] {ι : Type*} + (s : Finset ι) (n : Nat) (hn : 1 ≤ n) (a : ι → 𝒪[K]) + (ha : ∀ i ∈ s, a i ∈ (𝓂[K] ^ n : Ideal 𝒪[K])) : + (s.prod fun i => 1 + a i) - 1 - (s.sum fun i => a i) ∈ + (𝓂[K] ^ (n + 1) : Ideal 𝒪[K]) := by + classical + revert a + refine Finset.induction_on s ?base ?step + · intro a ha + simp + · intro i s hi ih a ha + have hai : a i ∈ (𝓂[K] ^ n : Ideal 𝒪[K]) := ha i (by simp [hi]) + have hs : ∀ j ∈ s, a j ∈ (𝓂[K] ^ n : Ideal 𝒪[K]) := by + intro j hj + exact ha j (by simp [hj]) + have hind : + (s.prod fun j => 1 + a j) - 1 - (s.sum fun j => a j) ∈ + (𝓂[K] ^ (n + 1) : Ideal 𝒪[K]) := + ih a hs + have hprod : + (s.prod fun j => 1 + a j) - 1 ∈ (𝓂[K] : Ideal 𝒪[K]) := + finset_prod_one_add_sub_one_mem_maximalIdeal_of_mem_pow K s n hn a hs + have hmul_raw : + a i * ((s.prod fun j => 1 + a j) - 1) ∈ + (𝓂[K] ^ n : Ideal 𝒪[K]) * (𝓂[K] : Ideal 𝒪[K]) := + Ideal.mul_mem_mul hai hprod + have hmul : + a i * ((s.prod fun j => 1 + a j) - 1) ∈ + (𝓂[K] ^ (n + 1) : Ideal 𝒪[K]) := by + simpa [pow_add] using hmul_raw + rw [Finset.prod_insert hi, Finset.sum_insert hi] + rw [show (1 + a i) * (s.prod fun j => 1 + a j) - 1 - + (a i + (s.sum fun j => a j)) = + ((s.prod fun j => 1 + a j) - 1 - (s.sum fun j => a j)) + + a i * ((s.prod fun j => 1 + a j) - 1) by + ring] + exact (𝓂[K] ^ (n + 1) : Ideal 𝒪[K]).add_mem hind hmul + +/-- The zero element of `𝓂^n` maps to the identity class in `U^n/U^(n+1)`. -/ +theorem principalUnitsSuccQuotOfIdealPow_zero + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) : + principalUnitsSuccQuotOfIdealPow K n hn (0 : (𝓂[K] ^ n : Ideal 𝒪[K])) = 1 := by + apply principalUnitsSuccQuotOfIdealPow_eq_one_of_mem_succ + simp + +/-- Modulo `U^(n+1)`, the class represented by `1 + (a+b)` is the product of the classes represented +by `1+a` and `1+b`. -/ +theorem principalUnitsSuccQuotOfIdealPow_add + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) + (a b : (𝓂[K] ^ n : Ideal 𝒪[K])) : + principalUnitsSuccQuotOfIdealPow K n hn (a + b) = + principalUnitsSuccQuotOfIdealPow K n hn a * + principalUnitsSuccQuotOfIdealPow K n hn b := by + rw [principalUnitsSuccQuotOfIdealPow_apply, + principalUnitsSuccQuotOfIdealPow_apply, + principalUnitsSuccQuotOfIdealPow_apply, + ← (principalUnitsSuccQuotMk K n).map_mul] + symm + apply (principalUnitsSuccQuotMk_eq_iff_div_mem K n _ _).2 + rw [mem_principalUnits_succ_subgroupOf_iff] + change ((((principalUnitOneAddOfMemPow K hn (a : 𝒪[K]) a.2 * + principalUnitOneAddOfMemPow K hn (b : 𝒪[K]) b.2 : 𝒪[K]ˣ) / + principalUnitOneAddOfMemPow K hn + ((a + b : (𝓂[K] ^ n : Ideal 𝒪[K])) : 𝒪[K]) (a + b).2 : + 𝒪[K]ˣ) : 𝒪[K]) - 1) ∈ + (𝓂[K] ^ (n + 1) : Ideal 𝒪[K]) + rw [show ((((principalUnitOneAddOfMemPow K hn (a : 𝒪[K]) a.2 * + principalUnitOneAddOfMemPow K hn (b : 𝒪[K]) b.2 : 𝒪[K]ˣ) / + principalUnitOneAddOfMemPow K hn + ((a + b : (𝓂[K] ^ n : Ideal 𝒪[K])) : 𝒪[K]) (a + b).2 : + 𝒪[K]ˣ) : 𝒪[K]) - 1) = + ((a : 𝒪[K]) * (b : 𝒪[K])) * + ↑(principalUnitOneAddOfMemPow K hn + ((a + b : (𝓂[K] ^ n : Ideal 𝒪[K])) : 𝒪[K]) (a + b).2)⁻¹ by + simp only [div_eq_mul_inv, Units.val_mul] + rw [principalUnitOneAddOfMemPow_val K hn (a : 𝒪[K]) a.2, + principalUnitOneAddOfMemPow_val K hn (b : 𝒪[K]) b.2] + have habval : + ((principalUnitOneAddOfMemPow K hn + ((a + b : (𝓂[K] ^ n : Ideal 𝒪[K])) : 𝒪[K]) (a + b).2 : 𝒪[K]ˣ) : + 𝒪[K]) = + 1 + (a : 𝒪[K]) + (b : 𝒪[K]) := by + rw [principalUnitOneAddOfMemPow_val K hn + ((a + b : (𝓂[K] ^ n : Ideal 𝒪[K])) : 𝒪[K]) (a + b).2] + change 1 + ((a : 𝒪[K]) + (b : 𝒪[K])) = 1 + (a : 𝒪[K]) + (b : 𝒪[K]) + ring + have habinv : + ((principalUnitOneAddOfMemPow K hn + ((a + b : (𝓂[K] ^ n : Ideal 𝒪[K])) : 𝒪[K]) (a + b).2 : 𝒪[K]ˣ) : + 𝒪[K]) * + ↑(principalUnitOneAddOfMemPow K hn + ((a + b : (𝓂[K] ^ n : Ideal 𝒪[K])) : 𝒪[K]) (a + b).2)⁻¹ = 1 := by + simp + calc + ((1 + (a : 𝒪[K])) * (1 + (b : 𝒪[K]))) * + ↑(principalUnitOneAddOfMemPow K hn + ((a + b : (𝓂[K] ^ n : Ideal 𝒪[K])) : 𝒪[K]) (a + b).2)⁻¹ - 1 = + ((1 + (a : 𝒪[K])) * (1 + (b : 𝒪[K]))) * + ↑(principalUnitOneAddOfMemPow K hn + ((a + b : (𝓂[K] ^ n : Ideal 𝒪[K])) : 𝒪[K]) (a + b).2)⁻¹ - + ((principalUnitOneAddOfMemPow K hn + ((a + b : (𝓂[K] ^ n : Ideal 𝒪[K])) : 𝒪[K]) (a + b).2 : + 𝒪[K]ˣ) : 𝒪[K]) * + ↑(principalUnitOneAddOfMemPow K hn + ((a + b : (𝓂[K] ^ n : Ideal 𝒪[K])) : 𝒪[K]) (a + b).2)⁻¹ := by + rw [habinv] + _ = ((a : 𝒪[K]) * (b : 𝒪[K])) * + ↑(principalUnitOneAddOfMemPow K hn + ((a + b : (𝓂[K] ^ n : Ideal 𝒪[K])) : 𝒪[K]) (a + b).2)⁻¹ := by + rw [habval] + ring] + exact (𝓂[K] ^ (n + 1) : Ideal 𝒪[K]).mul_mem_right _ + (maximalIdealPow_mul_mem_succ K hn a b) + +/-- The descended map from `𝓂^n/𝓂^(n+1)` sends zero to the identity principal-unit class. -/ +@[simp] +theorem principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_map_zero + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) : + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn 0 = 1 := by + rw [← map_zero (maximalIdealPowSuccQuotMk K n)] + change principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn + (maximalIdealPowSuccQuotMk K n (0 : (𝓂[K] ^ n : Ideal 𝒪[K]))) = 1 + rw [principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_mk] + exact principalUnitsSuccQuotOfIdealPow_zero K n hn + +/-- The descended map sends addition in `𝓂^n/𝓂^(n+1)` to multiplication in `U^n/U^(n+1)`. -/ +theorem principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_map_add + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) + (x y : MaximalIdealPowSuccQuot K n) : + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn (x + y) = + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn x * + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn y := by + refine MaximalIdealPowSuccQuot.inductionOn₂ n + (motive := fun x' y' => + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn (x' + y') = + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn x' * + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn y') x y ?_ + intro a b + let qa : MaximalIdealPowSuccQuot K n := maximalIdealPowSuccQuotMk K n a + let qb : MaximalIdealPowSuccQuot K n := maximalIdealPowSuccQuotMk K n b + have hleft : + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn (qa + qb) = + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn + (maximalIdealPowSuccQuotMk K n (a + b)) := by + have hadd : qa + qb = maximalIdealPowSuccQuotMk K n (a + b) := by + exact (map_add (maximalIdealPowSuccQuotMk K n) a b).symm + exact congrArg (principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn) hadd + have hrep : + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn + (maximalIdealPowSuccQuotMk K n (a + b)) = + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn qa * + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn qb := by + dsimp [qa, qb] + change principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn + (maximalIdealPowSuccQuotMk K n (a + b)) = + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn + (maximalIdealPowSuccQuotMk K n a) * + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn + (maximalIdealPowSuccQuotMk K n b) + rw [principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_mk, + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_mk, + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_mk] + exact principalUnitsSuccQuotOfIdealPow_add K n hn a b + exact hleft.trans hrep + +/-- Additive form of the descended map `𝓂^n/𝓂^(n+1) → U^n/U^(n+1)`. -/ +noncomputable def principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) : + MaximalIdealPowSuccQuot K n →+ Additive (PrincipalUnitsSuccQuot K n) where + toFun x := Additive.ofMul (principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn x) + map_zero' := by + change Additive.ofMul (principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn 0) = 0 + simp [principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_map_zero] + map_add' x y := by + change Additive.ofMul (principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn (x + y)) = + Additive.ofMul (principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn x * + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn y) + rw [principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_map_add] + +/-- The additive recoding of the descended map has the same underlying successive principal-unit +class. -/ +@[simp] +theorem principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd_apply + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) + (x : MaximalIdealPowSuccQuot K n) : + principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd K n hn x = + Additive.ofMul (principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn x) := + rfl + +/-- The class represented by `1 + a` is trivial exactly when `a` lies in `𝓂^(n+1)`. -/ +theorem principalUnitsSuccQuotOfIdealPow_eq_one_iff + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) + (a : (𝓂[K] ^ n : Ideal 𝒪[K])) : + principalUnitsSuccQuotOfIdealPow K n hn a = 1 ↔ + (a : 𝒪[K]) ∈ (𝓂[K] ^ (n + 1) : Ideal 𝒪[K]) := by + constructor + · intro h + have hmem := (principalUnitsSuccQuotMk_eq_one_iff K n _).1 h + rw [mem_principalUnits_succ_subgroupOf_iff] at hmem + simpa [principalUnitsSuccQuotOfIdealPow, principalUnitOneAddOfMemPowSubgroup, + principalUnitOneAddOfMemPow_val] using hmem + · intro ha + exact principalUnitsSuccQuotOfIdealPow_eq_one_of_mem_succ K n hn a ha + +/-- The descended image of an ideal-power quotient class is trivial exactly when that class is zero. +The descended image of an ideal-power quotient class is trivial exactly when that class is zero. -/ +theorem principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_eq_one_iff + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) + (x : MaximalIdealPowSuccQuot K n) : + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn x = 1 ↔ x = 0 := by + refine MaximalIdealPowSuccQuot.inductionOn n + (motive := fun x' => + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn x' = 1 ↔ x' = 0) + x ?_ + intro a + rw [← map_zero (maximalIdealPowSuccQuotMk K n)] + change principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn + (maximalIdealPowSuccQuotMk K n a) = 1 ↔ + (maximalIdealPowSuccQuotMk K n a : MaximalIdealPowSuccQuot K n) = 0 + rw [principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_mk, + maximalIdealPowSuccQuotMk_eq_zero_iff] + exact principalUnitsSuccQuotOfIdealPow_eq_one_iff K n hn a + +/-- Every successive principal-unit class is represented by `1 + a` for some `a ∈ 𝓂^n`. -/ +theorem principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_surjective + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) : + Function.Surjective (principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn) := by + intro x + rcases principalUnitsSuccQuotMk_surjective K n x with ⟨u, rfl⟩ + let a0 : 𝒪[K] := ((u : 𝒪[K]ˣ) : 𝒪[K]) - 1 + have ha0 : a0 ∈ (𝓂[K] ^ n : Ideal 𝒪[K]) := by + dsimp [a0] + exact (mem_principalUnits_iff K (u : 𝒪[K]ˣ) n).1 u.2 + let a : (𝓂[K] ^ n : Ideal 𝒪[K]) := ⟨a0, ha0⟩ + refine ⟨maximalIdealPowSuccQuotMk K n a, ?_⟩ + rw [principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_mk, + principalUnitsSuccQuotOfIdealPow_apply] + congr 1 + dsimp [a] + apply Subtype.ext + rw [principalUnitOneAddOfMemPowSubgroup_val] + apply Units.ext + rw [principalUnitOneAddOfMemPow_val] + dsimp [a0] + ring + +/-- The additive map induced by `a ↦ 1 + a` onto the successive principal-unit quotient is +surjective. -/ +theorem principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd_surjective + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) : + Function.Surjective (principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd K n hn) := by + intro y + rcases principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_surjective K n hn + (Additive.toMul y) with ⟨x, hx⟩ + refine ⟨x, ?_⟩ + change Additive.ofMul (principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn x) = y + rw [hx] + rfl + +/-- The additive map induced by `a ↦ 1 + a` on successive quotients is injective. -/ +theorem principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd_injective + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) : + Function.Injective (principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd K n hn) := by + intro x y hxy + have hzero : principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd K n hn (x - y) = 0 := by + rw [map_sub, hxy, sub_self] + have hmul : principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn (x - y) = 1 := by + change Additive.ofMul (principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn (x - y)) = + Additive.ofMul (1 : PrincipalUnitsSuccQuot K n) at hzero + exact Additive.ofMul.injective hzero + have hxmy : x - y = 0 := + (principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_eq_one_iff K n hn (x - y)).1 hmul + exact sub_eq_zero.mp hxmy + +/-- The additive isomorphism `𝓂^n/𝓂^(n+1) ≃ U^n/U^(n+1)` induced by `a ↦ 1+a`. -/ +noncomputable def maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) : + MaximalIdealPowSuccQuot K n ≃+ Additive (PrincipalUnitsSuccQuot K n) := + AddEquiv.ofBijective (principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd K n hn) + ⟨principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd_injective K n hn, + principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd_surjective K n hn⟩ + +/-- The additive equivalence between successive ideal and principal-unit quotients agrees with the +descended `a ↦ 1+a` map. -/ +@[simp] +theorem maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot_apply + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) + (x : MaximalIdealPowSuccQuot K n) : + maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot K n hn x = + principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd K n hn x := + rfl + +/-- Multiplicative form of +`𝓂^n/𝓂^(n+1) ≃+ Additive (U^n/U^(n+1))`, suitable for the multiplicative +Herbrand quotient API. -/ +noncomputable def maximalIdealPowSuccQuotMulEquivPrincipalUnitsSuccQuot + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) : + Multiplicative (MaximalIdealPowSuccQuot K n) ≃* + PrincipalUnitsSuccQuot K n where + toFun x := + Additive.toMul + (maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot K n hn + (Multiplicative.toAdd x)) + invFun x := + Multiplicative.ofAdd + ((maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot K n hn).symm + (Additive.ofMul x)) + left_inv := by + intro x + change Multiplicative.ofAdd + ((maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot K n hn).symm + (maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot K n hn + (Multiplicative.toAdd x))) = + Multiplicative.ofAdd (Multiplicative.toAdd x) + exact congrArg Multiplicative.ofAdd + ((maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot K n hn).left_inv + (Multiplicative.toAdd x)) + right_inv := by + intro x + change Additive.toMul + (maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot K n hn + ((maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot K n hn).symm + (Additive.ofMul x))) = + Additive.toMul (Additive.ofMul x) + exact congrArg Additive.toMul + ((maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot K n hn).right_inv + (Additive.ofMul x)) + map_mul' := by + intro x y + rw [show Multiplicative.toAdd (x * y) = + Multiplicative.toAdd x + Multiplicative.toAdd y from rfl] + change Additive.toMul + (maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot K n hn + (Multiplicative.toAdd x + Multiplicative.toAdd y)) = + Additive.toMul + (maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot K n hn + (Multiplicative.toAdd x) + + maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot K n hn + (Multiplicative.toAdd y)) + exact congrArg Additive.toMul + ((maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot K n hn).map_add + (Multiplicative.toAdd x) (Multiplicative.toAdd y)) + +/-- The multiplicative recoding of the successive-quotient equivalence sends `a` to the +principal-unit class represented by `1+a`. -/ +@[simp] +theorem maximalIdealPowSuccQuotMulEquivPrincipalUnitsSuccQuot_apply + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (hn : 1 ≤ n) + (x : MaximalIdealPowSuccQuot K n) : + maximalIdealPowSuccQuotMulEquivPrincipalUnitsSuccQuot K n hn + (Multiplicative.ofAdd x) = + principalUnitsSuccQuotOfMaximalIdealPowSuccQuot K n hn x := + rfl + +end +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnits.lean new file mode 100644 index 0000000000..60a0927dee --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnits.lean @@ -0,0 +1,216 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic +/-! +# Principal units + +Defines the filtration `U^n = 1 + 𝓂^n`, proves its basic order properties, and +constructs the quotient of valuation-ring units by the first filtration step. +-/ + +@[expose] public section +namespace LocalFieldTheory + +noncomputable +section + +universe u + +open scoped ValuativeRel + +/-- The actual principal-unit filtration `U^n = {u ∈ 𝒪[K]ˣ | u - 1 ∈ 𝓂[K]^n}`. -/ +def principalUnits (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + Subgroup 𝒪[K]ˣ where + carrier := {u | ((u : 𝒪[K]) - 1) ∈ (𝓂[K] ^ n : Ideal 𝒪[K])} + one_mem' := by + simp + mul_mem' := by + intro a b ha hb + change ((a : 𝒪[K]) * (b : 𝒪[K]) - 1) ∈ (𝓂[K] ^ n : Ideal 𝒪[K]) + rw [show ((a : 𝒪[K]) * (b : 𝒪[K]) - 1) = + ((a : 𝒪[K]) - 1) * (b : 𝒪[K]) + ((b : 𝒪[K]) - 1) by + ring] + exact Ideal.add_mem _ (Ideal.mul_mem_right _ _ ha) hb + inv_mem' := by + intro a ha + change (((a⁻¹ : 𝒪[K]ˣ) : 𝒪[K]) - 1) ∈ (𝓂[K] ^ n : Ideal 𝒪[K]) + rw [show (((a⁻¹ : 𝒪[K]ˣ) : 𝒪[K]) - 1) = + -(((a⁻¹ : 𝒪[K]ˣ) : 𝒪[K]) * ((a : 𝒪[K]) - 1)) by + calc + (((a⁻¹ : 𝒪[K]ˣ) : 𝒪[K]) - 1) + = ((a⁻¹ : 𝒪[K]ˣ) : 𝒪[K]) + - (((a⁻¹ : 𝒪[K]ˣ) : 𝒪[K]) * (a : 𝒪[K])) := by + simp + _ = -(((a⁻¹ : 𝒪[K]ˣ) : 𝒪[K]) * ((a : 𝒪[K]) - 1)) := by + ring] + exact (𝓂[K] ^ n : Ideal 𝒪[K]).neg_mem (Ideal.mul_mem_left _ _ ha) + +/-- A valuation-ring unit lies in the `n`-th principal-unit group exactly when it is congruent to +one modulo the `n`-th maximal-ideal power. -/ +theorem mem_principalUnits_iff (K : Type u) [Field K] [ValuativeRel K] + (u : 𝒪[K]ˣ) (n : Nat) : + u ∈ principalUnits K n ↔ ((u : 𝒪[K]) - 1) ∈ (𝓂[K] ^ n : Ideal 𝒪[K]) := + Iff.rfl + +/-- An automorphism of the valuation integer ring preserves the principal-unit +filtration whenever it preserves the corresponding maximal-ideal power. -/ +theorem principalUnits_integerRingEquiv_mem (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) (σ𝒪 : 𝒪[K] ≃+* 𝒪[K]) + (hpow : ∀ x : 𝒪[K], + x ∈ (𝓂[K] ^ n : Ideal 𝒪[K]) → σ𝒪 x ∈ (𝓂[K] ^ n : Ideal 𝒪[K])) + (u : 𝒪[K]ˣ) (hu : u ∈ principalUnits K n) : + Units.mapEquiv σ𝒪.toMulEquiv u ∈ principalUnits K n := by + rw [mem_principalUnits_iff] at hu ⊢ + have hmem : σ𝒪 ((u : 𝒪[K]) - 1) ∈ (𝓂[K] ^ n : Ideal 𝒪[K]) := + hpow ((u : 𝒪[K]) - 1) hu + simpa using hmem + +/-- The zeroth principal-unit group is the full unit group of the valuation ring. -/ +@[simp] theorem principalUnits_zero (K : Type u) [Field K] [ValuativeRel K] : + principalUnits K 0 = ⊤ := by + ext u + simp [principalUnits] + +/-- Principal-unit groups decrease as the filtration index increases. -/ +theorem principalUnits_antitone (K : Type u) [Field K] [ValuativeRel K] + {m n : Nat} (h : m ≤ n) : + principalUnits K n ≤ principalUnits K m := by + intro u hu + exact Ideal.pow_le_pow_right h hu + +/-- Each successor principal-unit group is contained in the preceding filtration step. -/ +theorem principalUnits_succ_le (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + principalUnits K (n + 1) ≤ principalUnits K n := + principalUnits_antitone K (Nat.le_succ n) + +/-- Every positive-index principal unit lies in the first principal-unit group. -/ +theorem principalUnits_le_one (K : Type u) [Field K] [ValuativeRel K] + {n : Nat} (hn : 1 ≤ n) : + principalUnits K n ≤ principalUnits K 1 := + principalUnits_antitone K hn + +/-- Quotient of integer units by the actual principal-unit filtration. -/ +def IntegerUnitsPrincipalQuot (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) : Type u := + 𝒪[K]ˣ ⧸ principalUnits K n + +/-- The quotient of valuation-ring units by an `n`-th principal-unit subgroup is a commutative +group. -/ +instance integerUnitsPrincipalQuotCommGroup + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + CommGroup (IntegerUnitsPrincipalQuot K n) := by + change CommGroup (𝒪[K]ˣ ⧸ principalUnits K n) + infer_instance + +/-- Explicit access to the concrete quotient model. Public consumers should +use the named constructor and eliminators below instead of unfolding the +quotient representation. -/ +def integerUnitsPrincipalQuotConcreteEquiv + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + IntegerUnitsPrincipalQuot K n ≃* (𝒪[K]ˣ ⧸ principalUnits K n) := by + change (𝒪[K]ˣ ⧸ principalUnits K n) ≃* (𝒪[K]ˣ ⧸ principalUnits K n) + exact MulEquiv.refl _ + +/-- The quotient map `𝒪[K]ˣ → 𝒪[K]ˣ/U^n`. -/ +def integerUnitsPrincipalQuotMk (K : Type u) [Field K] [ValuativeRel K] + (n : Nat) : 𝒪[K]ˣ →* IntegerUnitsPrincipalQuot K n := by + change 𝒪[K]ˣ →* (𝒪[K]ˣ ⧸ principalUnits K n) + exact QuotientGroup.mk' (principalUnits K n) + +/-- The concrete quotient equivalence sends the class of a valuation-ring unit to its quotient-group +class. -/ +@[simp] +theorem integerUnitsPrincipalQuotConcreteEquiv_mk + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (u : 𝒪[K]ˣ) : + integerUnitsPrincipalQuotConcreteEquiv K n + (integerUnitsPrincipalQuotMk K n u) = + QuotientGroup.mk u := + rfl + +/-- Every principal-unit quotient class has a valuation-ring unit representative. -/ +theorem integerUnitsPrincipalQuotMk_surjective + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + Function.Surjective (integerUnitsPrincipalQuotMk K n) := + QuotientGroup.mk'_surjective (principalUnits K n) + +/-- The kernel of the principal-unit quotient map is the `n`-th principal-unit subgroup. -/ +theorem integerUnitsPrincipalQuotMk_ker + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : + MonoidHom.ker (integerUnitsPrincipalQuotMk K n) = principalUnits K n := + QuotientGroup.ker_mk' (N := principalUnits K n) + +/-- A unit maps to the identity quotient class exactly when it lies in the `n`-th principal-unit +subgroup. -/ +@[simp] +theorem integerUnitsPrincipalQuotMk_eq_one_iff + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (u : 𝒪[K]ˣ) : + integerUnitsPrincipalQuotMk K n u = 1 ↔ u ∈ principalUnits K n := by + change QuotientGroup.mk' (principalUnits K n) u = 1 ↔ _ + exact QuotientGroup.eq_one_iff (N := principalUnits K n) u + +/-- Two units determine the same quotient class exactly when their quotient lies in the `n`-th +principal-unit subgroup. -/ +@[simp] +theorem integerUnitsPrincipalQuotMk_eq_iff_div_mem + (K : Type u) [Field K] [ValuativeRel K] (n : Nat) (u v : 𝒪[K]ˣ) : + integerUnitsPrincipalQuotMk K n u = + integerUnitsPrincipalQuotMk K n v ↔ + u / v ∈ principalUnits K n := by + change (QuotientGroup.mk u : 𝒪[K]ˣ ⧸ principalUnits K n) = + QuotientGroup.mk v ↔ _ + exact QuotientGroup.eq_iff_div_mem (N := principalUnits K n) + +/-- Descend a homomorphism that kills `U^n` to the named quotient. -/ +def integerUnitsPrincipalQuotLift + {K : Type u} {M : Type*} [Field K] [ValuativeRel K] [Group M] + (n : Nat) (f : 𝒪[K]ˣ →* M) (h : principalUnits K n ≤ f.ker) : + IntegerUnitsPrincipalQuot K n →* M := by + change (𝒪[K]ˣ ⧸ principalUnits K n) →* M + exact QuotientGroup.lift (principalUnits K n) f h + +/-- A homomorphism lifted from the principal-unit quotient agrees with the original map on +representatives. -/ +@[simp] +theorem integerUnitsPrincipalQuotLift_mk + {K : Type u} {M : Type*} [Field K] [ValuativeRel K] [Group M] + (n : Nat) (f : 𝒪[K]ˣ →* M) (h : principalUnits K n ≤ f.ker) + (u : 𝒪[K]ˣ) : + integerUnitsPrincipalQuotLift n f h + (integerUnitsPrincipalQuotMk K n u) = f u := + rfl + +/-- Eliminate a quotient class through the canonical class map on arbitrary +representatives. -/ +protected theorem IntegerUnitsPrincipalQuot.inductionOn + {K : Type u} [Field K] [ValuativeRel K] (n : Nat) + {motive : IntegerUnitsPrincipalQuot K n → Prop} + (q : IntegerUnitsPrincipalQuot K n) + (h : ∀ u : 𝒪[K]ˣ, motive (integerUnitsPrincipalQuotMk K n u)) : + motive q := by + change motive (show 𝒪[K]ˣ ⧸ principalUnits K n from q) + refine QuotientGroup.induction_on q ?_ + intro u + exact h u + +/-- Algebra identity used to prove multiplicative closure of principal units. -/ +lemma unit_mul_sub_one_eq (K : Type u) [Field K] [ValuativeRel K] (a b : 𝒪[K]ˣ) : + ((a * b : 𝒪[K]ˣ) : 𝒪[K]) - 1 = + ((a : 𝒪[K]) - 1) * ((b : 𝒪[K]) - 1) + + ((a : 𝒪[K]) - 1) + ((b : 𝒪[K]) - 1) := by + simp only [Units.val_mul] + ring + +/-- Powers of the maximal ideal decrease as their exponent increases. -/ +lemma maximalIdeal_pow_antitone (K : Type u) [Field K] [ValuativeRel K] + {m n : Nat} (h : m ≤ n) : + (𝓂[K] ^ n : Ideal 𝒪[K]) ≤ (𝓂[K] ^ m : Ideal 𝒪[K]) := + Ideal.pow_le_pow_right h + +end +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ProfiniteUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ProfiniteUnits.lean new file mode 100644 index 0000000000..eb09c64ef3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ProfiniteUnits.lean @@ -0,0 +1,84 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic +public import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Basic +public import Mathlib.Topology.Algebra.ClopenNhdofOne +public import Mathlib.Topology.Algebra.Group.Units +/-! +# Profinite valuation-ring units + +The topology of a nonarchimedean local field is Hausdorff and totally disconnected because +valuation balls are clopen. This file records those structures as named results, without +registering additional global instances, and packages the valuation-ring unit group as a +profinite group. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace LocalFieldTheory + +open scoped ValuativeRel + +/-- A nonarchimedean local field is Hausdorff for its valuative topology. -/ +theorem localFieldT2Space + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : T2Space K := by + apply IsTopologicalAddGroup.t2Space_of_zero_sep + intro x hx + let r := (ValuativeRel.valuation K).restrict x + refine ⟨{y : K | (ValuativeRel.valuation K).restrict y < r}, ?_, ?_⟩ + · exact ((ValuativeRel.valuation K).isOpen_ball r).mem_nhds + (by + simpa [r, zero_lt_iff, ValuativeRel.valuation_eq_zero_iff] using hx) + · simp [r] + +/-- Distinct points of a nonarchimedean local field are separated by a clopen valuation ball. -/ +theorem localFieldTotallySeparatedSpace + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : TotallySeparatedSpace K := by + rw [totallySeparatedSpace_iff_exists_isClopen] + intro x y hxy + let r := (ValuativeRel.valuation K).restrict (y - x) + refine ⟨{z : K | (ValuativeRel.valuation K).restrict (z - x) < r}, ?_, ?_, ?_⟩ + · change IsClopen + ((fun z : K => z - x) ⁻¹' + {w : K | (ValuativeRel.valuation K).restrict w < r}) + exact ((ValuativeRel.valuation K).isClopen_ball r).preimage + (continuous_id.sub continuous_const) + · have hyx : y - x ≠ 0 := sub_ne_zero.mpr hxy.symm + simpa [r, zero_lt_iff, ValuativeRel.valuation_eq_zero_iff] using hyx + · simp [r] + +/-- A nonarchimedean local field is totally disconnected for its valuative topology. -/ +theorem localFieldTotallyDisconnectedSpace + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : TotallyDisconnectedSpace K := by + let : TotallySeparatedSpace K := localFieldTotallySeparatedSpace K + infer_instance + +/-- The unit group of the valuation ring of a nonarchimedean local field, as a profinite group. -/ +noncomputable def localUnitsProfinite + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : ProfiniteGrp := by + letI : T2Space K := localFieldT2Space K + letI : TotallyDisconnectedSpace K := localFieldTotallyDisconnectedSpace K + letI : TotallyDisconnectedSpace (𝒪[K])ᵐᵒᵖ := + Homeomorph.totallyDisconnectedSpace + (MulOpposite.opHomeomorph : 𝒪[K] ≃ₜ (𝒪[K])ᵐᵒᵖ) + letI : TotallyDisconnectedSpace 𝒪[K]ˣ := by + rw [← (Units.isEmbedding_embedProduct (M := 𝒪[K])).isTotallyDisconnected_range] + exact isTotallyDisconnected_of_totallyDisconnectedSpace _ + exact ProfiniteGrp.of 𝒪[K]ˣ + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueExtension.lean new file mode 100644 index 0000000000..f05fe5381f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueExtension.lean @@ -0,0 +1,520 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import Mathlib.FieldTheory.Finite.GaloisField +public import Mathlib.LinearAlgebra.Dimension.DivisionRing +public import Mathlib.NumberTheory.RamificationInertia.Inertia +public import Mathlib.NumberTheory.RamificationInertia.Ramification +public import Mathlib.RingTheory.Ideal.Norm.AbsNorm +public import Mathlib.RingTheory.RamificationInertia.Basic +public import Mathlib.RingTheory.SimpleModule.Basic +public import Mathlib.RingTheory.DedekindDomain.IntegralClosure +public import Mathlib.RingTheory.Trace.Basic +public import Mathlib.RingTheory.Valuation.Extension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueUnits +/-! +# Residue extensions + +Constructs the maps induced on valuation rings, residue fields, and residue +units by a valued extension, with degree, trace, norm, and Frobenius results. +-/ + +@[expose] public section +namespace LocalFieldTheory + +noncomputable +section + +universe u + +open scoped ValuativeRel + +/-- The local-ring homomorphism on valuation integer rings induced by an extension +of valuations. -/ +def integerRingMapOfValuationExtension (K L : Type u) [Field K] [ValuativeRel K] + [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + 𝒪[K] →+* 𝒪[L] := + algebraMap 𝒪[K] 𝒪[L] + +/-- The map of valuation rings induced by a valued-field extension is a local ring homomorphism. -/ +instance integerRingMapOfValuationExtension_isLocalHom (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + IsLocalHom (integerRingMapOfValuationExtension K L) := by + change IsLocalHom (algebraMap 𝒪[K] 𝒪[L]) + infer_instance + +/-- The valuation-ring map of an extension is the ambient algebra map on underlying elements. -/ +@[simp] +theorem integerRingMapOfValuationExtension_apply (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (x : 𝒪[K]) : + integerRingMapOfValuationExtension K L x = algebraMap 𝒪[K] 𝒪[L] x := + rfl + +/-- The residue-field map induced by a valuation extension. This is the +canonical `algebraMap 𝓀[K] 𝓀[L]`, named so later +local class field theory files can use it without unfolding mathlib's valuation-extension + instances. -/ +def residueFieldMapOfValuationExtension (K L : Type u) [Field K] [ValuativeRel K] + [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + 𝓀[K] →+* 𝓀[L] := + IsLocalRing.ResidueField.map (integerRingMapOfValuationExtension K L) + +/-- The map between residue fields induced by a valued extension agrees with the residue-field +algebra map. -/ +theorem residueFieldMapOfValuationExtension_eq_algebraMap (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + residueFieldMapOfValuationExtension K L = algebraMap 𝓀[K] 𝓀[L] := + rfl + +/-- The residue-field map sends the residue of a base integer to the residue of its image in the +extension. -/ +@[simp] +theorem residueFieldMapOfValuationExtension_residue (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (x : 𝒪[K]) : + residueFieldMapOfValuationExtension K L (IsLocalRing.residue 𝒪[K] x) = + IsLocalRing.residue 𝒪[L] (integerRingMapOfValuationExtension K L x) := + rfl + +/-- The residue-field algebra map commutes with reduction of valuation-ring elements. -/ +@[simp] +theorem residueField_algebraMap_residue (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (x : 𝒪[K]) : + algebraMap 𝓀[K] 𝓀[L] (IsLocalRing.residue 𝒪[K] x) = + IsLocalRing.residue 𝒪[L] (algebraMap 𝒪[K] 𝒪[L] x) := + rfl + +/-- The induced map on residue-field unit groups. -/ +def residueUnitsMapOfValuationExtension (K L : Type u) [Field K] [ValuativeRel K] + [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + 𝓀[K]ˣ →* 𝓀[L]ˣ := + Units.map (residueFieldMapOfValuationExtension K L) + +/-- The induced map on residue-field units applies the residue-field extension map to the underlying +residue. -/ +@[simp] +theorem residueUnitsMapOfValuationExtension_apply (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (u : 𝓀[K]ˣ) : + ((residueUnitsMapOfValuationExtension K L u : 𝓀[L]ˣ) : 𝓀[L]) = + algebraMap 𝓀[K] 𝓀[L] (u : 𝓀[K]) := + rfl + +/-- The induced map on residue-field unit groups is injective. -/ +theorem residueUnitsMapOfValuationExtension_injective (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + Function.Injective (residueUnitsMapOfValuationExtension K L) := + Units.map_injective (RingHom.injective (residueFieldMapOfValuationExtension K L)) + +/-- Base integer units embedded into extension integer units. -/ +def integerUnitsMapOfValuationExtension (K L : Type u) [Field K] [ValuativeRel K] + [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + 𝒪[K]ˣ →* 𝒪[L]ˣ := + Units.map (integerRingMapOfValuationExtension K L).toMonoidHom + +/-- The induced map on valuation-ring units applies the extension's integer-ring map to the +underlying unit. -/ +@[simp] +theorem integerUnitsMapOfValuationExtension_apply (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (u : 𝒪[K]ˣ) : + ((integerUnitsMapOfValuationExtension K L u : 𝒪[L]ˣ) : 𝒪[L]) = + integerRingMapOfValuationExtension K L (u : 𝒪[K]) := + rfl + +/-- Mapping an integer unit to the extension and then reducing agrees with reducing first and +mapping residue units. -/ +@[simp] +theorem residueUnitsMap_integerUnitsToResidueUnits (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (u : 𝒪[K]ˣ) : + residueUnitsMapOfValuationExtension K L (integerUnitsToResidueUnits K u) = + integerUnitsToResidueUnits L (integerUnitsMapOfValuationExtension K L u) := by + ext + rfl + +/-- A first principal unit remains a first principal unit after extension of valued fields. -/ +theorem integerUnitsMapOfValuationExtension_mem_principalUnits_one (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (u : 𝒪[K]ˣ) (hu : u ∈ principalUnits K 1) : + integerUnitsMapOfValuationExtension K L u ∈ principalUnits L 1 := by + rw [← integerUnitsToResidueUnits_eq_one_iff_mem_principalUnits_one L] + rw [← residueUnitsMap_integerUnitsToResidueUnits K L u] + rw [(integerUnitsToResidueUnits_eq_one_iff_mem_principalUnits_one K u).2 hu] + exact map_one (residueUnitsMapOfValuationExtension K L) + +/-- The map on integer-unit residue quotients induced by a valuation extension. -/ +def integerUnitsModPrincipalUnitsMapOfValuationExtension (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + IntegerUnitsModPrincipalUnits K →* IntegerUnitsModPrincipalUnits L := + integerUnitsModPrincipalUnitsLift + ((integerUnitsModPrincipalUnitsMk L).comp + (integerUnitsMapOfValuationExtension K L)) + (by + intro u hu + rw [MonoidHom.mem_ker, MonoidHom.comp_apply, + IntegerUnitsModPrincipalUnits_mk_eq_one_iff] + exact integerUnitsMapOfValuationExtension_mem_principalUnits_one K L u hu) + +/-- The map modulo first principal units sends a class to the class of the extended integer unit. -/ +@[simp] +theorem integerUnitsModPrincipalUnitsMapOfValuationExtension_mk (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (u : 𝒪[K]ˣ) : + integerUnitsModPrincipalUnitsMapOfValuationExtension K L + (integerUnitsModPrincipalUnitsMk K u) = + integerUnitsModPrincipalUnitsMk L + (integerUnitsMapOfValuationExtension K L u) := + rfl + +/-- The quotient map modulo first principal units commutes with the residue-unit comparison +equivalence. -/ +theorem integerUnitsModPrincipalUnitsMap_residue_comm (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (x : IntegerUnitsModPrincipalUnits K) : + integerUnitsModPrincipalUnitsEquivResidueUnits L + (integerUnitsModPrincipalUnitsMapOfValuationExtension K L x) = + residueUnitsMapOfValuationExtension K L + (integerUnitsModPrincipalUnitsEquivResidueUnits K x) := by + refine IntegerUnitsModPrincipalUnits.inductionOn + (motive := fun y => + integerUnitsModPrincipalUnitsEquivResidueUnits L + (integerUnitsModPrincipalUnitsMapOfValuationExtension K L y) = + residueUnitsMapOfValuationExtension K L + (integerUnitsModPrincipalUnitsEquivResidueUnits K y)) + x ?_ + intro u + rw [integerUnitsModPrincipalUnitsMapOfValuationExtension_mk] + rw [integerUnitsModPrincipalUnitsEquivResidueUnits_mk] + rw [integerUnitsModPrincipalUnitsEquivResidueUnits_mk] + exact (residueUnitsMap_integerUnitsToResidueUnits K L u).symm + +/-- If the extension of an integer unit is a first principal unit, its class modulo first principal +units is trivial. -/ +theorem principalUnits_one_of_integerUnitsMap_mem_principalUnits_one (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + {a : 𝒪[K]ˣ} + (haL : integerUnitsMapOfValuationExtension K L a ∈ principalUnits L 1) : + a ∈ principalUnits K 1 := by + rw [← integerUnitsToResidueUnits_eq_one_iff_mem_principalUnits_one K] + have hred : integerUnitsToResidueUnits L (integerUnitsMapOfValuationExtension K L a) = 1 := + (integerUnitsToResidueUnits_eq_one_iff_mem_principalUnits_one L _).2 haL + apply residueUnitsMapOfValuationExtension_injective K L + rw [residueUnitsMap_integerUnitsToResidueUnits K L a] + exact hred.trans (map_one (residueUnitsMapOfValuationExtension K L)).symm + +/-- The residue-field norm transported to the integer-unit quotients +`𝒪[L]ˣ/U_L¹ → 𝒪[K]ˣ/U_K¹`. + +This is not the local field norm on integer units; it is the quotient-level +residue norm model used before proving compatibility with `normIntegerUnits`. -/ +def integerUnitsModPrincipalUnitsResidueNormOfValuationExtension (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + IntegerUnitsModPrincipalUnits L →* IntegerUnitsModPrincipalUnits K := + (integerUnitsModPrincipalUnitsEquivResidueUnits K).symm.toMonoidHom.comp + ((Units.map (Algebra.norm 𝓀[K] (S := 𝓀[L]))).comp + (integerUnitsModPrincipalUnitsEquivResidueUnits L).toMonoidHom) + +/-- The residue norm on classes modulo first principal units agrees with the finite residue-field +norm. -/ +theorem integerUnitsModPrincipalUnitsResidueNorm_residue (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (x : IntegerUnitsModPrincipalUnits L) : + integerUnitsModPrincipalUnitsEquivResidueUnits K + (integerUnitsModPrincipalUnitsResidueNormOfValuationExtension K L x) = + Units.map (Algebra.norm 𝓀[K] (S := 𝓀[L])) + (integerUnitsModPrincipalUnitsEquivResidueUnits L x) := by + change + integerUnitsModPrincipalUnitsEquivResidueUnits K + ((integerUnitsModPrincipalUnitsEquivResidueUnits K).symm + (Units.map (Algebra.norm 𝓀[K] (S := 𝓀[L])) + (integerUnitsModPrincipalUnitsEquivResidueUnits L x))) = + Units.map (Algebra.norm 𝓀[K] (S := 𝓀[L])) + (integerUnitsModPrincipalUnitsEquivResidueUnits L x) + exact (integerUnitsModPrincipalUnitsEquivResidueUnits K).apply_symm_apply _ + +/-- The finite-field residue norm, after base extension to `𝓀[L]`, is the +product over all residue-field automorphisms. -/ +theorem residueUnitsMap_residueField_norm_eq_prod_algEquiv (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (u : 𝓀[L]ˣ) : + residueUnitsMapOfValuationExtension K L + (Units.map (Algebra.norm 𝓀[K] (S := 𝓀[L])) u) = + Finset.univ.prod (fun τ : 𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L] => + Units.mapEquiv τ.toMulEquiv u) := by + ext + change algebraMap 𝓀[K] 𝓀[L] (Algebra.norm 𝓀[K] (u : 𝓀[L])) = + ↑(Finset.univ.prod (fun τ : 𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L] => + Units.mapEquiv τ.toMulEquiv u)) + rw [Algebra.norm_eq_prod_automorphisms] + simp + +/-- Quotient-level form of +`residueUnitsMap_residueField_norm_eq_prod_algEquiv`. -/ +theorem integerUnitsModPrincipalUnitsResidueNorm_base_extend_eq_prod_algEquiv + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (x : IntegerUnitsModPrincipalUnits L) : + residueUnitsMapOfValuationExtension K L + (integerUnitsModPrincipalUnitsEquivResidueUnits K + (integerUnitsModPrincipalUnitsResidueNormOfValuationExtension K L x)) = + Finset.univ.prod (fun τ : 𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L] => + Units.mapEquiv τ.toMulEquiv (integerUnitsModPrincipalUnitsEquivResidueUnits L x)) := by + rw [integerUnitsModPrincipalUnitsResidueNorm_residue] + exact residueUnitsMap_residueField_norm_eq_prod_algEquiv K L + (integerUnitsModPrincipalUnitsEquivResidueUnits L x) + +/-- The residue-field automorphism group has order the finite residue-field +extension degree. -/ +theorem residueAlgEquiv_card_eq_finrank (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + Nat.card (𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L]) = Module.finrank 𝓀[K] 𝓀[L] := + IsGalois.card_aut_eq_finrank (F := 𝓀[K]) (E := 𝓀[L]) + +/-- The mathlib inertia degree of the maximal ideals agrees with the concrete +degree of the canonical residue-field extension supplied by a valuation +extension. -/ +theorem maximalIdeal_inertiaDeg_eq_residue_finrank (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + (𝓂[L] : Ideal 𝒪[L]).inertiaDeg 𝒪[K] = + Module.finrank 𝓀[K] 𝓀[L] := by + rw [Ideal.inertiaDeg_eq_of_isMaximal (𝓂[K] : Ideal 𝒪[K]) (𝓂[L] : Ideal 𝒪[L])] + rfl + +/-- The residue-field automorphism group has order the mathlib inertia degree +of the maximal ideals for the canonical valuation-ring extension. -/ +theorem residueAlgEquiv_card_eq_maximalIdeal_inertiaDeg (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + Nat.card (𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L]) = + (𝓂[L] : Ideal 𝒪[L]).inertiaDeg 𝒪[K] := by + rw [residueAlgEquiv_card_eq_finrank K L, + maximalIdeal_inertiaDeg_eq_residue_finrank K L] + +/-- Finite separable extensions whose valuation ring is the integral closure of +the base valuation ring give a finite module extension of valuation integer +rings. -/ +theorem integerRing_moduleFinite_of_isIntegralClosure (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [Algebra K L] [FiniteDimensional K L] + [Algebra.IsSeparable K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + Module.Finite 𝒪[K] 𝒪[L] := + IsIntegralClosure.finite 𝒪[K] K L 𝒪[L] + +/-- If the extension valuation ring is the integral closure of the base +valuation ring, then the induced extension of valuation integer rings is +integral. -/ +theorem integerRing_algebra_isIntegral_of_isIntegralClosure (K L : Type u) + [Field K] [ValuativeRel K] + [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + Algebra.IsIntegral 𝒪[K] 𝒪[L] := + IsIntegralClosure.isIntegral_algebra 𝒪[K] L + +/-- The actual ramification index and inertia degree of the valuation-integer +ring extension satisfy the local ramification identity. -/ +theorem maximalIdeal_ramificationIdx_mul_inertiaDeg_eq_finrank (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] : + Ideal.ramificationIdx' (𝓂[K] : Ideal 𝒪[K]) (𝓂[L] : Ideal 𝒪[L]) * + (𝓂[L] : Ideal 𝒪[L]).inertiaDeg 𝒪[K] = + Module.finrank K L := by + classical + have := FaithfulSMul.of_field_isFractionRing 𝒪[K] 𝒪[L] K L + have hp := IsDiscreteValuationRing.not_a_field 𝒪[K] + have hprimes := IsLocalRing.primesOver_eq (A := 𝒪[L]) hp + have hq (q : (𝓂[K] : Ideal 𝒪[K]).primesOver 𝒪[L]) : + (q : Ideal 𝒪[L]) = 𝓂[L] := + Set.mem_singleton_iff.mp (hprimes ▸ q.property) + let : Unique ((𝓂[K] : Ideal 𝒪[K]).primesOver 𝒪[L]) := + { default := ⟨𝓂[L], hprimes ▸ Set.mem_singleton _⟩ + uniq := fun q => Subtype.ext (Set.mem_singleton_iff.mp (hprimes ▸ q.property)) } + rw [Ideal.ramificationIdx'_eq_ramificationIdx _ _ hp, + IsFractionRing.finrank_eq 𝒪[K] K 𝒪[L] L] + simpa only [Fintype.sum_unique, hq] using + (Ideal.sum_ramification_inertia_eq_finrank (𝓂[K] : Ideal 𝒪[K]) 𝒪[L]) + +/-- The local ramification identity with the inertia degree rewritten as the +finite-dimensional degree of the canonical residue-field extension. -/ +theorem maximalIdeal_ramificationIdx_mul_residue_finrank_eq_finrank + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] : + Ideal.ramificationIdx' (𝓂[K] : Ideal 𝒪[K]) (𝓂[L] : Ideal 𝒪[L]) * + Module.finrank 𝓀[K] 𝓀[L] = + Module.finrank K L := by + rw [← maximalIdeal_inertiaDeg_eq_residue_finrank K L] + exact maximalIdeal_ramificationIdx_mul_inertiaDeg_eq_finrank K L + +/-- finite extensions of discrete valuations, finite-extension degree formula with +module-finiteness generated from the actual integral-closure hypothesis. + +This is the source-producing form used by later local CFT files: the finite +`𝒪[K]`-module structure on `𝒪[L]` is produced from integral closure and +separability, not exposed as a separate theorem-shaped input. -/ +theorem maximalIdeal_ramificationIdx_mul_residue_finrank_eq_finrank_of_isIntegralClosure + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [Algebra.IsSeparable K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + Ideal.ramificationIdx' (𝓂[K] : Ideal 𝒪[K]) (𝓂[L] : Ideal 𝒪[L]) * + Module.finrank 𝓀[K] 𝓀[L] = + Module.finrank K L := by + let : Module.Finite 𝒪[K] 𝒪[L] := + integerRing_moduleFinite_of_isIntegralClosure K L + exact maximalIdeal_ramificationIdx_mul_residue_finrank_eq_finrank K L + +/-- finite extensions of discrete valuations: in an unramified finite valuation extension, the +residue degree is the full field degree. + +The ramification-index-one input is the mathematical unramified datum. The +finite `𝒪[K]`-module structure is still generated from integral closure and +separability, rather than being exposed as a separate hypothesis. -/ +theorem residue_finrank_eq_finrank_of_ramificationIdx_eq_one_of_isIntegralClosure + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [Algebra.IsSeparable K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (h : + Ideal.ramificationIdx' (𝓂[K] : Ideal 𝒪[K]) (𝓂[L] : Ideal 𝒪[L]) = 1) : + Module.finrank 𝓀[K] 𝓀[L] = Module.finrank K L := by + have hdegree := + maximalIdeal_ramificationIdx_mul_residue_finrank_eq_finrank_of_isIntegralClosure K L + rw [h, one_mul] at hdegree + exact hdegree + +/-- The residue-field automorphism group has order the full field degree in +an unramified finite valuation extension, with finite valuation-ring +module-finiteness generated from integral closure. -/ +theorem residueAlgEquiv_card_eq_finrank_of_ramificationIdx_eq_one_of_isIntegralClosure + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [Algebra.IsSeparable K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (h : + Ideal.ramificationIdx' (𝓂[K] : Ideal 𝒪[K]) (𝓂[L] : Ideal 𝒪[L]) = 1) : + Nat.card (𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L]) = Module.finrank K L := by + rw [residueAlgEquiv_card_eq_finrank K L, + residue_finrank_eq_finrank_of_ramificationIdx_eq_one_of_isIntegralClosure K L h] + +/-- The residue-field extension supplied by a local-field valuation extension is separable. -/ +theorem residueFieldAlgebra_isSeparable_of_valuationExtension (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + Algebra.IsSeparable 𝓀[K] 𝓀[L] := by + infer_instance + +/-- The trace map for the canonical residue-field extension supplied by a +valuation extension is surjective. -/ +theorem residueField_trace_surjective_of_valuationExtension (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + Function.Surjective (Algebra.trace 𝓀[K] 𝓀[L]) := by + let : Algebra.IsSeparable 𝓀[K] 𝓀[L] := + residueFieldAlgebra_isSeparable_of_valuationExtension K L + exact Algebra.trace_surjective 𝓀[K] 𝓀[L] + +/-- The finite-field norm on residue-field units is surjective for the canonical +residue extension induced by a valuation extension. -/ +theorem residueField_units_norm_surjective_of_valuationExtension (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + Function.Surjective (Units.map (Algebra.norm 𝓀[K] (S := 𝓀[L]))) := by + let := Fintype.ofFinite 𝓀[K] + exact FiniteField.unitsMap_norm_surjective 𝓀[K] 𝓀[L] + +/-- The chosen right inverse to the residue-field unit norm maps back to the prescribed residue +unit. -/ +theorem residueField_units_norm_surjective_of_valuationExtension_apply + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (u : 𝓀[K]ˣ) : + ∃ v : 𝓀[L]ˣ, Units.map (Algebra.norm 𝓀[K] (S := 𝓀[L])) v = u := + residueField_units_norm_surjective_of_valuationExtension K L u + +/-- The residue norm on integer units modulo first principal units is surjective. -/ +theorem integerUnitsModPrincipalUnitsResidueNorm_surjective_of_valuationExtension + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + Function.Surjective + (integerUnitsModPrincipalUnitsResidueNormOfValuationExtension K L) := by + intro y + obtain ⟨v, hv⟩ := residueField_units_norm_surjective_of_valuationExtension K L + (integerUnitsModPrincipalUnitsEquivResidueUnits K y) + refine ⟨(integerUnitsModPrincipalUnitsEquivResidueUnits L).symm v, ?_⟩ + apply (integerUnitsModPrincipalUnitsEquivResidueUnits K).injective + rw [integerUnitsModPrincipalUnitsResidueNorm_residue] + exact (congrArg (Units.map (Algebra.norm 𝓀[K] (S := 𝓀[L]))) + ((integerUnitsModPrincipalUnitsEquivResidueUnits L).apply_symm_apply v)).trans hv + +end +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueGalois.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueGalois.lean new file mode 100644 index 0000000000..77bdc1324e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueGalois.lean @@ -0,0 +1,409 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import Mathlib.FieldTheory.Galois.Basic +public import Mathlib.NumberTheory.RamificationInertia.Galois +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing +/-! +# Galois actions on residue fields + +Restricts field automorphisms to residue-field automorphisms and identifies +the resulting kernels and stabilizers with inertia subgroups. +-/ + +@[expose] public section + +namespace LocalFieldTheory + +noncomputable +section + +universe u + +open scoped ValuativeRel +open _root_.LocalFieldTheory.IsNonarchimedeanLocalField + +/-- Actual integral-closure version of the residue-field automorphism induced by +a real Galois automorphism. + +the local class-field calculation reduces the product of conjugates modulo the maximal ideal; + this is the source map for that reduction, built from the already constructed + integral-closure action on `𝒪[L]`. -/ +def galoisGroupResidueFieldEquivOfIsIntegralClosure (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (σ : Gal(L/K)) : + 𝓀[L] ≃+* 𝓀[L] := + IsLocalRing.ResidueField.mapEquiv + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) + +/-- The residue-field action of a Galois automorphism sends a reduced integer to the reduction of +its conjugate. -/ +@[simp] +theorem galoisGroupResidueFieldEquivOfIsIntegralClosure_residue (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (σ : Gal(L/K)) (x : 𝒪[L]) : + galoisGroupResidueFieldEquivOfIsIntegralClosure K L σ + (IsLocalRing.residue 𝒪[L] x) = + IsLocalRing.residue 𝒪[L] + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ x) := by + rfl + +/-- The Galois action on residue units agrees with reducing the conjugate of an integer unit. -/ +theorem galoisGroupResidueFieldEquivOfIsIntegralClosure_integerUnitsToResidueUnits + (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (σ : Gal(L/K)) (u : 𝒪[L]ˣ) : + Units.mapEquiv (galoisGroupResidueFieldEquivOfIsIntegralClosure K L σ).toMulEquiv + (integerUnitsToResidueUnits L u) = + integerUnitsToResidueUnits L + (Units.mapEquiv + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ).toMulEquiv u) := by + ext + rfl + +/-- The induced residue-field automorphism fixes the image of the base residue field. -/ +theorem galoisGroupResidueFieldEquivOfIsIntegralClosure_algebraMap (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (σ : Gal(L/K)) (x : 𝓀[K]) : + galoisGroupResidueFieldEquivOfIsIntegralClosure K L σ (algebraMap 𝓀[K] 𝓀[L] x) = + algebraMap 𝓀[K] 𝓀[L] x := by + obtain ⟨a, rfl⟩ := Ideal.Quotient.mk_surjective x + change galoisGroupResidueFieldEquivOfIsIntegralClosure K L σ + (algebraMap 𝓀[K] 𝓀[L] (IsLocalRing.residue 𝒪[K] a)) = + algebraMap 𝓀[K] 𝓀[L] (IsLocalRing.residue 𝒪[K] a) + rw [residueField_algebraMap_residue K L a] + rw [galoisGroupResidueFieldEquivOfIsIntegralClosure_residue] + exact congrArg (fun z : 𝒪[L] => IsLocalRing.residue 𝒪[L] z) + (galoisGroupIntegerRingEquivOfIsIntegralClosure_integerRingMap K L σ a) + +/-- Actual integral-closure residue action as a `𝓀[K]`-algebra automorphism. -/ +@[implicit_reducible] +def galoisGroupResidueAlgEquivOfIsIntegralClosure (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (σ : Gal(L/K)) : + 𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L] where + __ := galoisGroupResidueFieldEquivOfIsIntegralClosure K L σ + commutes' := galoisGroupResidueFieldEquivOfIsIntegralClosure_algebraMap K L σ + +/-- Actual integral-closure residue action as a group homomorphism. -/ +def galoisGroupResidueAlgEquivHomOfIsIntegralClosure (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + Gal(L/K) →* (𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L]) where + toFun := galoisGroupResidueAlgEquivOfIsIntegralClosure K L + map_one' := by + apply AlgEquiv.ext + intro x + obtain ⟨a, rfl⟩ := Ideal.Quotient.mk_surjective x + rfl + map_mul' := by + intro σ τ + apply AlgEquiv.ext + intro x + obtain ⟨a, rfl⟩ := Ideal.Quotient.mk_surjective x + rfl + +/-- The residue representation of the Galois group evaluates to the induced residue-field algebra +automorphism. -/ +@[simp] +theorem galoisGroupResidueAlgEquivHomOfIsIntegralClosure_apply (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (σ : Gal(L/K)) : + galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L σ = + galoisGroupResidueAlgEquivOfIsIntegralClosure K L σ := + rfl + +/-- Reducing the sum of the actual integral-closure Galois conjugates gives the +sum of the induced residue-field conjugates. -/ +theorem galoisGroup_sum_residue_eq_residueAlgEquiv_sum_of_isIntegralClosure + (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (a : 𝒪[L]) : + IsLocalRing.residue 𝒪[L] + (Finset.univ.sum fun σ : Gal(L/K) => + galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ a) = + Finset.univ.sum fun σ : Gal(L/K) => + galoisGroupResidueAlgEquivOfIsIntegralClosure K L σ + (IsLocalRing.residue 𝒪[L] a) := by + rw [map_sum] + refine Finset.sum_congr rfl ?_ + intro σ _ + simp [galoisGroupResidueAlgEquivOfIsIntegralClosure] + +/-- The mathlib stabilizer action on the residue field, specialized to the +actual integral-closure action of `Gal(L / K)` on `𝒪[L]`. -/ +def galoisGroupResidueStabilizerHomOfIsIntegralClosure (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + @MulAction.stabilizer Gal(L/K) (Ideal 𝒪[L]) _ + (galoisGroupIntegerRingIdealMulActionOfIsIntegralClosure K L) + (𝓂[L] : Ideal 𝒪[L]) →* + (𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L]) := by + letI := galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L + letI := galoisGroupIntegerRingSMulCommClassOfIsIntegralClosure K L + letI := galoisGroupIntegerRingIdealDistribMulActionOfIsIntegralClosure K L + exact Ideal.Quotient.stabilizerHom (𝓂[L] : Ideal 𝒪[L]) + (𝓂[K] : Ideal 𝒪[K]) Gal(L/K) + +/-- The inertia subgroup for the actual integral-closure action on `𝒪[L]`. -/ +def galoisGroupMaximalIdealInertiaOfIsIntegralClosure (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + Subgroup Gal(L/K) := by + letI := galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L + exact (𝓂[L] : Ideal 𝒪[L]).toAddSubgroup.inertia Gal(L/K) + +/-- The actual residue action obtained through the maximal-ideal stabilizer. -/ +def galoisGroupResidueStabilizerHomFromGaloisGroupOfIsIntegralClosure (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + Gal(L/K) →* (𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L]) := + (galoisGroupResidueStabilizerHomOfIsIntegralClosure K L).comp + (galoisGroupMaximalIdealStabilizerHomOfIsIntegralClosure K L) + +/-- The stabilizer representation obtained from the Galois group agrees with the canonical residue +stabilizer map. -/ +theorem galoisGroupResidueStabilizerHomFromGaloisGroupOfIsIntegralClosure_eq + (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + galoisGroupResidueStabilizerHomFromGaloisGroupOfIsIntegralClosure K L = + galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L := by + ext σ x + obtain ⟨a, rfl⟩ := Ideal.Quotient.mk_surjective x + rfl + +/-- A Galois automorphism acts trivially on the residue field exactly when its stabilizer image is +trivial. -/ +theorem galoisGroupResidueAlgEquivHomOfIsIntegralClosure_mem_ker_iff_stabilizerHom + (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (σ : Gal(L/K)) : + σ ∈ (galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L).ker ↔ + galoisGroupMaximalIdealStabilizerHomOfIsIntegralClosure K L σ ∈ + (galoisGroupResidueStabilizerHomOfIsIntegralClosure K L).ker := by + rw [← galoisGroupResidueStabilizerHomFromGaloisGroupOfIsIntegralClosure_eq K L] + rfl + +/-- The kernel of the residue stabilizer action is the maximal-ideal inertia subgroup. -/ +theorem galoisGroupResidueStabilizerHomOfIsIntegralClosure_ker_eq_maximalIdealInertia + (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + (galoisGroupResidueStabilizerHomOfIsIntegralClosure K L).ker = + (galoisGroupMaximalIdealInertiaOfIsIntegralClosure K L).subgroupOf + (@MulAction.stabilizer Gal(L/K) (Ideal 𝒪[L]) _ + (galoisGroupIntegerRingIdealMulActionOfIsIntegralClosure K L) + (𝓂[L] : Ideal 𝒪[L])) := by + let := galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L + let := galoisGroupIntegerRingSMulCommClassOfIsIntegralClosure K L + let := galoisGroupIntegerRingIdealDistribMulActionOfIsIntegralClosure K L + exact Ideal.Quotient.ker_stabilizerHom (𝓂[L] : Ideal 𝒪[L]) + (𝓂[K] : Ideal 𝒪[K]) Gal(L/K) + +/-- A Galois automorphism acts trivially on the residue field exactly when it belongs to +maximal-ideal inertia. -/ +theorem galoisGroupResidueAlgEquivHomOfIsIntegralClosure_mem_ker_iff_mem_maximalIdealInertia + (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (σ : Gal(L/K)) : + σ ∈ (galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L).ker ↔ + σ ∈ galoisGroupMaximalIdealInertiaOfIsIntegralClosure K L := by + rw [galoisGroupResidueAlgEquivHomOfIsIntegralClosure_mem_ker_iff_stabilizerHom] + rw [galoisGroupResidueStabilizerHomOfIsIntegralClosure_ker_eq_maximalIdealInertia K L] + rfl + +/-- The kernel of the residue-field Galois representation is the maximal-ideal inertia subgroup. -/ +theorem galoisGroupResidueAlgEquivHomOfIsIntegralClosure_ker_eq_maximalIdealInertia + (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + (galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L).ker = + galoisGroupMaximalIdealInertiaOfIsIntegralClosure K L := by + ext σ + exact galoisGroupResidueAlgEquivHomOfIsIntegralClosure_mem_ker_iff_mem_maximalIdealInertia + K L σ + +/-- A Galois automorphism lies in the residue kernel exactly when every integer has the same residue +as its conjugate. -/ +theorem galoisGroupResidueAlgEquivHomOfIsIntegralClosure_mem_ker_iff_residue_eq + (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (σ : Gal(L/K)) : + σ ∈ (galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L).ker ↔ + ∀ x : 𝒪[L], + IsLocalRing.residue 𝒪[L] + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ x) = + IsLocalRing.residue 𝒪[L] x := by + constructor + · intro h x + have hfun := congrArg (fun e : 𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L] => + e (IsLocalRing.residue 𝒪[L] x)) h + simpa [galoisGroupResidueAlgEquivHomOfIsIntegralClosure_apply, + galoisGroupResidueAlgEquivOfIsIntegralClosure, + galoisGroupResidueFieldEquivOfIsIntegralClosure_residue] using hfun + · intro h + apply AlgEquiv.ext + intro y + obtain ⟨x, rfl⟩ := Ideal.Quotient.mk_surjective y + change IsLocalRing.residue 𝒪[L] + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ x) = + IsLocalRing.residue 𝒪[L] x + exact h x + +/-- A Galois automorphism lies in residue inertia exactly when each conjugate difference belongs to +the maximal ideal. -/ +theorem galoisGroupResidueAlgEquivHomOfIsIntegralClosure_mem_ker_iff_sub_mem_maximalIdeal + (K L : Type u) + [Field K] [ValuativeRel K] [Field L] [ValuativeRel L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (σ : Gal(L/K)) : + σ ∈ (galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L).ker ↔ + ∀ x : 𝒪[L], + galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ x - x ∈ + (𝓂[L] : Ideal 𝒪[L]) := by + rw [galoisGroupResidueAlgEquivHomOfIsIntegralClosure_mem_ker_iff_residue_eq K L σ] + constructor + · intro h x + have hx0 : IsLocalRing.residue 𝒪[L] + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ x - x) = 0 := by + simpa using congrArg (fun z => z - IsLocalRing.residue 𝒪[L] x) (h x) + exact (IsLocalRing.residue_eq_zero_iff + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ x - x)).1 hx0 + · intro h x + have hx0 : IsLocalRing.residue 𝒪[L] + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ x - x) = 0 := + (IsLocalRing.residue_eq_zero_iff + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ x - x)).2 (h x) + have : IsLocalRing.residue 𝒪[L] + (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ x) - + IsLocalRing.residue 𝒪[L] x = 0 := by + simpa using hx0 + exact sub_eq_zero.mp this + +/-- The actual integral-closure inertia subgroup has cardinality equal to the +mathlib ramification index over the base maximal ideal. -/ +theorem galoisGroupMaximalIdealInertiaOfIsIntegralClosure_card_eq_ramificationIdxIn + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + Nat.card (galoisGroupMaximalIdealInertiaOfIsIntegralClosure K L) = + (𝓂[K] : Ideal 𝒪[K]).ramificationIdxIn 𝒪[L] := by + let := galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L + let := galoisGroupIntegerRing_isGaloisGroup_of_isIntegralClosure K L + let : Module.Finite 𝒪[K] 𝒪[L] := + integerRing_moduleFinite_of_isIntegralClosure K L + let : Algebra.IsSeparable (𝒪[K] ⧸ (𝓂[K] : Ideal 𝒪[K])) + (𝒪[L] ⧸ (𝓂[L] : Ideal 𝒪[L])) := + residueFieldAlgebra_isSeparable_of_valuationExtension K L + let : Finite (𝒪[K] ⧸ (𝓂[K] : Ideal 𝒪[K])) := by + change Finite 𝓀[K] + infer_instance + simpa [galoisGroupMaximalIdealInertiaOfIsIntegralClosure] using + (Ideal.card_inertia_eq_ramificationIdxIn + (R := 𝒪[K]) (S := 𝒪[L]) (G := Gal(L/K)) + (𝓂[K] : Ideal 𝒪[K]) (𝓂[L] : Ideal 𝒪[L])) + +/-- The actual integral-closure inertia cardinality, rewritten with the +concrete ramification index of the valuation-integer-ring extension. -/ +theorem galoisGroupMaximalIdealInertiaOfIsIntegralClosure_card_eq_ramificationIdx + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + Nat.card (galoisGroupMaximalIdealInertiaOfIsIntegralClosure K L) = + (𝓂[L] : Ideal 𝒪[L]).ramificationIdx 𝒪[K] := by + let := galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L + let := galoisGroupIntegerRing_isGaloisGroup_of_isIntegralClosure K L + rw [galoisGroupMaximalIdealInertiaOfIsIntegralClosure_card_eq_ramificationIdxIn K L] + exact Ideal.ramificationIdxIn_eq_ramificationIdx + (𝓂[K] : Ideal 𝒪[K]) (𝓂[L] : Ideal 𝒪[L]) Gal(L/K) + +/-- If the valuation-integer-ring extension has ramification index one, then +the actual integral-closure inertia subgroup has cardinality one. -/ +theorem galoisGroupMaximalIdealInertiaOfIsIntegralClosure_card_eq_one_of_ramificationIdx_eq_one + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (h : + (𝓂[L] : Ideal 𝒪[L]).ramificationIdx 𝒪[K] = 1) : + Nat.card (galoisGroupMaximalIdealInertiaOfIsIntegralClosure K L) = 1 := by + rw [galoisGroupMaximalIdealInertiaOfIsIntegralClosure_card_eq_ramificationIdx K L, h] + +/-- The kernel cardinality of the actual integral-closure residue action is the +ramification index over the base maximal ideal. -/ +theorem galoisGroupResidueAlgEquivHomOfIsIntegralClosure_ker_card_eq_ramificationIdxIn + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + Nat.card (galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L).ker = + (𝓂[K] : Ideal 𝒪[K]).ramificationIdxIn 𝒪[L] := by + rw [galoisGroupResidueAlgEquivHomOfIsIntegralClosure_ker_eq_maximalIdealInertia K L] + exact galoisGroupMaximalIdealInertiaOfIsIntegralClosure_card_eq_ramificationIdxIn K L + +/-- The kernel cardinality of the actual integral-closure residue action, +rewritten using the concrete ramification index. -/ +theorem galoisGroupResidueAlgEquivHomOfIsIntegralClosure_ker_card_eq_ramificationIdx + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + Nat.card (galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L).ker = + (𝓂[L] : Ideal 𝒪[L]).ramificationIdx 𝒪[K] := by + rw [galoisGroupResidueAlgEquivHomOfIsIntegralClosure_ker_eq_maximalIdealInertia K L] + exact galoisGroupMaximalIdealInertiaOfIsIntegralClosure_card_eq_ramificationIdx K L + +/-- If the valuation-integer-ring extension has ramification index one, then +the actual integral-closure residue action has kernel of cardinality one. -/ +theorem galoisGroupResidueAlgEquivHomOfIsIntegralClosure_ker_card_eq_one_of_ramificationIdx_eq_one + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (h : + (𝓂[L] : Ideal 𝒪[L]).ramificationIdx 𝒪[K] = 1) : + Nat.card (galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L).ker = 1 := by + rw [galoisGroupResidueAlgEquivHomOfIsIntegralClosure_ker_card_eq_ramificationIdx K L, h] + + +end +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueUnits.lean new file mode 100644 index 0000000000..7645408960 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueUnits.lean @@ -0,0 +1,344 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import Mathlib.Algebra.Category.ModuleCat.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.AdditiveEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnits +/-! +# Residue units + +Constructs the quotient of valuation-ring units by first principal units and +identifies it, multiplicatively and additively, with the residue-field units. +-/ + +@[expose] public section +namespace LocalFieldTheory + +noncomputable +section + +universe u + +open scoped ValuativeRel + +/-- The residue-field unit group attached to a valued field. -/ +def ResidueUnits (K : Type u) [Field K] [ValuativeRel K] : Type u := + 𝓀[K]ˣ + +/-- The unit group of the residue field is a commutative group. -/ +instance residueUnitsCommGroup + (K : Type u) [Field K] [ValuativeRel K] : + CommGroup (ResidueUnits K) := by + change CommGroup 𝓀[K]ˣ + infer_instance + +/-- Explicit comparison with the concrete unit group of the residue field. -/ +def residueUnitsConcreteEquiv + (K : Type u) [Field K] [ValuativeRel K] : + ResidueUnits K ≃* 𝓀[K]ˣ := by + change 𝓀[K]ˣ ≃* 𝓀[K]ˣ + exact MulEquiv.refl _ + +/-- The concrete residue-unit comparison preserves the underlying residue +unit. -/ +@[simp] +theorem residueUnitsConcreteEquiv_apply + (K : Type u) [Field K] [ValuativeRel K] (u : ResidueUnits K) : + residueUnitsConcreteEquiv K u = u := + rfl + +/-- The unit group of the finite residue field is finite. -/ +noncomputable instance residueUnitsFinite + (K : Type u) [Field K] [ValuativeRel K] [Finite 𝓀[K]] : + Finite (ResidueUnits K) := by + exact Finite.of_equiv 𝓀[K]ˣ (residueUnitsConcreteEquiv K).symm.toEquiv + +/-- Integer units modulo first principal units. -/ +@[implicit_reducible] +def IntegerUnitsModPrincipalUnits + (K : Type u) [Field K] [ValuativeRel K] : Type u := + 𝒪[K]ˣ ⧸ principalUnits K 1 + +/-- Valuation-ring units modulo first principal units form a commutative quotient group. -/ +@[implicit_reducible] +instance integerUnitsModPrincipalUnitsCommGroup + (K : Type u) [Field K] [ValuativeRel K] : + CommGroup (IntegerUnitsModPrincipalUnits K) := by + change CommGroup (𝒪[K]ˣ ⧸ principalUnits K 1) + infer_instance + +/-- Explicit access to the concrete quotient model. -/ +def integerUnitsModPrincipalUnitsConcreteEquiv + (K : Type u) [Field K] [ValuativeRel K] : + IntegerUnitsModPrincipalUnits K ≃* + (𝒪[K]ˣ ⧸ principalUnits K 1) := by + change (𝒪[K]ˣ ⧸ principalUnits K 1) ≃* + (𝒪[K]ˣ ⧸ principalUnits K 1) + exact MulEquiv.refl _ + +/-- The canonical class of an integer unit modulo first principal units. -/ +@[implicit_reducible] +def integerUnitsModPrincipalUnitsMk + (K : Type u) [Field K] [ValuativeRel K] : + 𝒪[K]ˣ →* IntegerUnitsModPrincipalUnits K := by + change 𝒪[K]ˣ →* (𝒪[K]ˣ ⧸ principalUnits K 1) + exact QuotientGroup.mk' (principalUnits K 1) + +/-- The concrete quotient equivalence sends a valuation-ring unit to its class modulo first +principal units. -/ +@[simp] +theorem integerUnitsModPrincipalUnitsConcreteEquiv_mk + (K : Type u) [Field K] [ValuativeRel K] (x : 𝒪[K]ˣ) : + integerUnitsModPrincipalUnitsConcreteEquiv K + (integerUnitsModPrincipalUnitsMk K x) = + QuotientGroup.mk x := + rfl + +/-- Every class modulo first principal units has a valuation-ring unit representative. -/ +theorem integerUnitsModPrincipalUnitsMk_surjective + (K : Type u) [Field K] [ValuativeRel K] : + Function.Surjective (integerUnitsModPrincipalUnitsMk K) := + QuotientGroup.mk'_surjective (principalUnits K 1) + +/-- Eliminate a quotient class through the canonical class map. -/ +protected theorem IntegerUnitsModPrincipalUnits.inductionOn + {K : Type u} [Field K] [ValuativeRel K] + {motive : IntegerUnitsModPrincipalUnits K → Prop} + (q : IntegerUnitsModPrincipalUnits K) + (h : ∀ x : 𝒪[K]ˣ, motive (integerUnitsModPrincipalUnitsMk K x)) : + motive q := by + change motive (show 𝒪[K]ˣ ⧸ principalUnits K 1 from q) + refine QuotientGroup.induction_on q ?_ + intro x + exact h x + +/-- Descend a homomorphism that kills the first principal-unit group. -/ +def integerUnitsModPrincipalUnitsLift + {K : Type u} {M : Type*} [Field K] [ValuativeRel K] [Group M] + (f : 𝒪[K]ˣ →* M) (h : principalUnits K 1 ≤ f.ker) : + IntegerUnitsModPrincipalUnits K →* M := by + change (𝒪[K]ˣ ⧸ principalUnits K 1) →* M + exact QuotientGroup.lift (principalUnits K 1) f h + +/-- A map lifted from units modulo first principal units agrees with the original map on +representatives. -/ +@[simp] +theorem integerUnitsModPrincipalUnitsLift_mk + {K : Type u} {M : Type*} [Field K] [ValuativeRel K] [Group M] + (f : 𝒪[K]ˣ →* M) (h : principalUnits K 1 ≤ f.ker) (x : 𝒪[K]ˣ) : + integerUnitsModPrincipalUnitsLift f h + (integerUnitsModPrincipalUnitsMk K x) = f x := + rfl + +/-- Reduction of valuation-integer units to residue-field units. -/ +def integerUnitsToResidueUnits (K : Type u) [Field K] [ValuativeRel K] : + 𝒪[K]ˣ →* ResidueUnits K := + Units.map (IsLocalRing.residue 𝒪[K]).toMonoidHom + +/-- Reduction of a valuation-ring unit has underlying residue equal to reduction of its underlying +integer. -/ +theorem integerUnitsToResidueUnits_apply (K : Type u) [Field K] [ValuativeRel K] + (x : 𝒪[K]ˣ) : + ((residueUnitsConcreteEquiv K (integerUnitsToResidueUnits K x) : 𝓀[K]ˣ) : + 𝓀[K]) = + IsLocalRing.residue 𝒪[K] (x : 𝒪[K]) := + rfl + +/-- Kernel criterion for reduction on valuation-integer units. -/ +theorem mem_ker_integerUnitsToResidueUnits_iff (K : Type u) [Field K] [ValuativeRel K] + (x : 𝒪[K]ˣ) : + x ∈ (integerUnitsToResidueUnits K).ker ↔ + IsLocalRing.residue 𝒪[K] (x : 𝒪[K]) = 1 := by + rw [MonoidHom.mem_ker] + constructor + · intro h + have h' := congrArg (residueUnitsConcreteEquiv K) h + have h'' := congrArg Units.val h' + simpa only [integerUnitsToResidueUnits_apply, map_one, Units.val_one] using h'' + · intro h + apply (residueUnitsConcreteEquiv K).injective + apply Units.ext + simpa only [integerUnitsToResidueUnits_apply, map_one, Units.val_one] using h + +/-- The first principal-unit group is the kernel of reduction to residue-field units. -/ +theorem principalUnits_one_eq_ker_integerUnitsToResidueUnits + (K : Type u) [Field K] [ValuativeRel K] : + principalUnits K 1 = (integerUnitsToResidueUnits K).ker := by + ext x + rw [mem_principalUnits_iff, mem_ker_integerUnitsToResidueUnits_iff] + rw [pow_one] + rw [← sub_eq_zero] + rw [← map_one (IsLocalRing.residue 𝒪[K]), ← map_sub] + exact Ideal.Quotient.eq_zero_iff_mem.symm + +/-- A valuation-ring unit reduces to one exactly when it is a first principal unit. -/ +theorem integerUnitsToResidueUnits_eq_one_iff_mem_principalUnits_one + (K : Type u) [Field K] [ValuativeRel K] (x : 𝒪[K]ˣ) : + integerUnitsToResidueUnits K x = 1 ↔ x ∈ principalUnits K 1 := by + rw [principalUnits_one_eq_ker_integerUnitsToResidueUnits K, MonoidHom.mem_ker] + +/-- Two valuation-ring units have the same residue exactly when their quotient is a first principal +unit. -/ +theorem integerUnitsToResidueUnits_eq_iff_div_mem_principalUnits_one + (K : Type u) [Field K] [ValuativeRel K] (x y : 𝒪[K]ˣ) : + integerUnitsToResidueUnits K x = integerUnitsToResidueUnits K y ↔ + x / y ∈ principalUnits K 1 := by + constructor + · intro h + rw [← integerUnitsToResidueUnits_eq_one_iff_mem_principalUnits_one K] + simp only [div_eq_mul_inv, (integerUnitsToResidueUnits K).map_mul, + (integerUnitsToResidueUnits K).map_inv, h, mul_inv_cancel] + · intro h + have h1 : integerUnitsToResidueUnits K (x / y) = 1 := + (integerUnitsToResidueUnits_eq_one_iff_mem_principalUnits_one K (x / y)).2 h + have hdiv : integerUnitsToResidueUnits K x / integerUnitsToResidueUnits K y = 1 := by + simpa only [div_eq_mul_inv, (integerUnitsToResidueUnits K).map_mul, + (integerUnitsToResidueUnits K).map_inv] using h1 + exact div_eq_one.mp hdiv + +/-- Higher principal units reduce to `1` in the residue-field unit group. -/ +theorem principalUnits_le_ker_reduction + (K : Type u) [Field K] [ValuativeRel K] {n : Nat} (hn : 1 ≤ n) : + principalUnits K n ≤ (integerUnitsToResidueUnits K).ker := by + rw [← principalUnits_one_eq_ker_integerUnitsToResidueUnits K] + exact principalUnits_antitone K hn + +/-- Every residue-field unit lifts to a valuation-ring unit. -/ +theorem integerUnitsToResidueUnits_surjective (K : Type u) [Field K] [ValuativeRel K] : + Function.Surjective (integerUnitsToResidueUnits K) := + IsLocalRing.surjective_units_map_of_local_ringHom _ Ideal.Quotient.mk_surjective + (inferInstanceAs (IsLocalHom (IsLocalRing.residue 𝒪[K]))) + +/-- Reduction induces `𝒪[K]ˣ / U¹ ≃ 𝓀[K]ˣ`. -/ +def integerUnitsModPrincipalUnitsEquivResidueUnits + (K : Type u) [Field K] [ValuativeRel K] : + IntegerUnitsModPrincipalUnits K ≃* ResidueUnits K := + (integerUnitsModPrincipalUnitsConcreteEquiv K).trans + ((QuotientGroup.quotientMulEquivOfEq + (principalUnits_one_eq_ker_integerUnitsToResidueUnits K)).trans + (QuotientGroup.quotientKerEquivOfSurjective (integerUnitsToResidueUnits K) + (integerUnitsToResidueUnits_surjective K))) + +/-- The quotient-to-residue-unit equivalence sends a unit class to the reduction of its +representative. -/ +@[simp] +theorem integerUnitsModPrincipalUnitsEquivResidueUnits_mk + (K : Type u) [Field K] [ValuativeRel K] (x : 𝒪[K]ˣ) : + integerUnitsModPrincipalUnitsEquivResidueUnits K + (integerUnitsModPrincipalUnitsMk K x) = + integerUnitsToResidueUnits K x := by + simp only [integerUnitsModPrincipalUnitsEquivResidueUnits, MulEquiv.trans_apply, + integerUnitsModPrincipalUnitsConcreteEquiv_mk, + QuotientGroup.quotientMulEquivOfEq_mk] + rw [QuotientGroup.quotientKerEquivOfSurjective, + QuotientGroup.quotientKerEquivOfRightInverse_apply, + QuotientGroup.kerLift_mk] + +/-- The residue-unit quotient equivalence sends a class to `1` exactly for first +principal units. -/ +theorem integerUnitsModPrincipalUnitsEquivResidueUnits_mk_eq_one_iff + (K : Type u) [Field K] [ValuativeRel K] (x : 𝒪[K]ˣ) : + integerUnitsModPrincipalUnitsEquivResidueUnits K + (integerUnitsModPrincipalUnitsMk K x) = 1 ↔ + x ∈ principalUnits K 1 := by + rw [integerUnitsModPrincipalUnitsEquivResidueUnits_mk] + exact integerUnitsToResidueUnits_eq_one_iff_mem_principalUnits_one K x + +/-- Equality of residue classes is the same as quotient by a first principal unit. -/ +theorem integerUnitsModPrincipalUnitsEquivResidueUnits_mk_eq_mk_iff + (K : Type u) [Field K] [ValuativeRel K] (x y : 𝒪[K]ˣ) : + integerUnitsModPrincipalUnitsEquivResidueUnits K + (integerUnitsModPrincipalUnitsMk K x) = + integerUnitsModPrincipalUnitsEquivResidueUnits K + (integerUnitsModPrincipalUnitsMk K y) ↔ + x / y ∈ principalUnits K 1 := by + rw [integerUnitsModPrincipalUnitsEquivResidueUnits_mk, + integerUnitsModPrincipalUnitsEquivResidueUnits_mk] + exact integerUnitsToResidueUnits_eq_iff_div_mem_principalUnits_one K x y + +/-- Additive form of `𝒪[K]ˣ / U¹ ≃ 𝓀[K]ˣ`. -/ +def integerUnitsModPrincipalUnitsAddEquivResidueUnits + (K : Type u) [Field K] [ValuativeRel K] : + Additive (IntegerUnitsModPrincipalUnits K) ≃+ Additive (ResidueUnits K) := + additiveEquivOfMulEquiv (integerUnitsModPrincipalUnitsEquivResidueUnits K) + +/-- Equality in `𝒪[K]ˣ / U¹`, expressed by a first-principal-unit quotient. -/ +theorem IntegerUnitsModPrincipalUnits_mk_eq_mk_iff + (K : Type u) [Field K] [ValuativeRel K] (x y : 𝒪[K]ˣ) : + integerUnitsModPrincipalUnitsMk K x = + integerUnitsModPrincipalUnitsMk K y ↔ + x / y ∈ principalUnits K 1 := + by + change (QuotientGroup.mk x : 𝒪[K]ˣ ⧸ principalUnits K 1) = + QuotientGroup.mk y ↔ _ + exact QuotientGroup.eq_iff_div_mem (N := principalUnits K 1) + +/-- Triviality criterion in `𝒪[K]ˣ / U¹`. -/ +theorem IntegerUnitsModPrincipalUnits_mk_eq_one_iff + (K : Type u) [Field K] [ValuativeRel K] (x : 𝒪[K]ˣ) : + integerUnitsModPrincipalUnitsMk K x = 1 ↔ + x ∈ principalUnits K 1 := + by + change (QuotientGroup.mk x : 𝒪[K]ˣ ⧸ principalUnits K 1) = 1 ↔ _ + exact QuotientGroup.eq_one_iff (N := principalUnits K 1) x + +/-- Equality in `𝒪[K]ˣ / U¹` is exactly equality after reduction to residue +units. -/ +theorem IntegerUnitsModPrincipalUnits_mk_eq_mk_iff_residue + (K : Type u) [Field K] [ValuativeRel K] (x y : 𝒪[K]ˣ) : + integerUnitsModPrincipalUnitsMk K x = + integerUnitsModPrincipalUnitsMk K y ↔ + integerUnitsToResidueUnits K x = integerUnitsToResidueUnits K y := by + constructor + · intro h + exact (integerUnitsToResidueUnits_eq_iff_div_mem_principalUnits_one K x y).2 + ((IntegerUnitsModPrincipalUnits_mk_eq_mk_iff K x y).1 h) + · intro h + exact (IntegerUnitsModPrincipalUnits_mk_eq_mk_iff K x y).2 + ((integerUnitsToResidueUnits_eq_iff_div_mem_principalUnits_one K x y).1 h) + +/-- The class of an integer unit in `𝒪[K]ˣ / U¹` is trivial exactly when its +residue is `1`. -/ +theorem IntegerUnitsModPrincipalUnits_mk_eq_one_iff_residue_eq_one + (K : Type u) [Field K] [ValuativeRel K] (x : 𝒪[K]ˣ) : + integerUnitsModPrincipalUnitsMk K x = 1 ↔ + integerUnitsToResidueUnits K x = 1 := by + constructor + · intro h + exact (integerUnitsToResidueUnits_eq_one_iff_mem_principalUnits_one K x).2 + ((IntegerUnitsModPrincipalUnits_mk_eq_one_iff K x).1 h) + · intro h + exact (IntegerUnitsModPrincipalUnits_mk_eq_one_iff K x).2 + ((integerUnitsToResidueUnits_eq_one_iff_mem_principalUnits_one K x).1 h) + +/-- Additive version of the residue-unit quotient equivalence on quotient representatives. -/ +@[simp] +theorem integerUnitsModPrincipalUnitsAddEquivResidueUnits_mk + (K : Type u) [Field K] [ValuativeRel K] (x : 𝒪[K]ˣ) : + integerUnitsModPrincipalUnitsAddEquivResidueUnits K + (Additive.ofMul (integerUnitsModPrincipalUnitsMk K x)) = + Additive.ofMul (integerUnitsToResidueUnits K x) := by + exact congrArg Additive.ofMul + (integerUnitsModPrincipalUnitsEquivResidueUnits_mk K x) + +/-- Module form of the residue-unit quotient equivalence. -/ +def integerUnitsModPrincipalUnitsIsoResidueUnits + (K : Type u) [Field K] [ValuativeRel K] : + CategoryTheory.Iso (ModuleCat.of ℤ (Additive (IntegerUnitsModPrincipalUnits K))) + (ModuleCat.of ℤ (Additive (ResidueUnits K))) := + (integerUnitsModPrincipalUnitsAddEquivResidueUnits K).toIntLinearEquiv.toModuleIso + +/-- Cardinality statement transported from the quotient equivalence with residue units. -/ +theorem integerUnitsModPrincipalUnits_card_eq_residueUnits_card + (K : Type u) [Field K] [ValuativeRel K] : + Nat.card (IntegerUnitsModPrincipalUnits K) = Nat.card (ResidueUnits K) := + Nat.card_congr (integerUnitsModPrincipalUnitsEquivResidueUnits K).toEquiv + +end +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/SeparableNormValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/SeparableNormValuation.lean new file mode 100644 index 0000000000..ab949420ab --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/SeparableNormValuation.lean @@ -0,0 +1,783 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.SeparableClosure +public import Mathlib.RingTheory.Ideal.Norm.RelNorm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing + +/-! # Separable Norm Valuation -/ + +@[expose] public section +namespace LocalClassFieldTheory + +open LocalFieldTheory + +/-! +# Finite local reciprocity: normalized valuation of field norms + +This file supplies the local-field calculation used when the abstract +class-formation framework is specialized to separable-closure units. All +ramification and residue degrees below are the actual invariants of the +valuation-ring extension; no packaged norm-valuation hypothesis is assumed. +-/ + +noncomputable +section + +universe u v w + +open scoped BigOperators ValuativeRel +open IsNonarchimedeanLocalField + +section SeparableIdealNorm + +variable (R : Type u) (S : Type v) + [CommRing R] [IsDomain R] [CommRing S] [IsDomain S] + [IsIntegrallyClosed R] [IsIntegrallyClosed S] + [Algebra R S] [Module.Finite R S] [Module.IsTorsionFree R S] + +attribute [local instance] FractionRing.liftAlgebra + +/-- A normal closure inside a separable ambient field is separable over the +base whenever the extension being closed is separable. Keeping this +field-theoretic step separate prevents the integral-closure transport below +from repeatedly elaborating the full `iSup` of embedding ranges. -/ +private theorem intermediateNormalClosure_isSeparable_of_isSeparable + (K : Type u) (L : Type v) (A : Type w) + [Field K] [Field L] [Field A] + [Algebra K L] [Algebra K A] [Algebra L A] + [Algebra.IsSeparable K L] : + Algebra.IsSeparable K (IntermediateField.normalClosure K L A) := by + change Algebra.IsSeparable K ↥(⨆ f : L →ₐ[K] A, f.fieldRange) + exact IntermediateField.isSeparable_iSup K A + (h := fun f => AlgEquiv.Algebra.isSeparable (AlgEquiv.ofInjectiveField f)) + +/-- The field-theoretic normal closure of a finite separable extension is +Galois, with no perfectness assumption on the base. -/ +private theorem intermediateNormalClosure_isGalois_of_isSeparable + (K : Type u) (L : Type v) (A : Type w) + [Field K] [Field L] [Field A] + [Algebra K L] [Algebra K A] [Algebra L A] + [IsScalarTower K L A] + [Algebra.IsSeparable K L] [Normal K A] : + IsGalois K (IntermediateField.normalClosure K L A) := by + exact + { to_isSeparable := + intermediateNormalClosure_isSeparable_of_isSeparable K L A + to_normal := normalClosure.normal K L A } + +/-- A finite extension remains finite over the field-theoretic normal +closure when viewed from the top of the tower. -/ +private theorem intermediateNormalClosure_finiteDimensional_top + (K : Type u) (L : Type v) (A : Type w) + [Field K] [Field L] [Field A] + [Algebra K L] [Algebra K A] [Algebra L A] + [IsScalarTower K L A] [FiniteDimensional K L] : + let E := IntermediateField.normalClosure K L A + letI : Algebra L E := normalClosure.algebra K L A + FiniteDimensional L E := by + exact Module.Finite.right K L (IntermediateField.normalClosure K L A) + +omit [IsIntegrallyClosed R] [IsIntegrallyClosed S] in +/-- The integral normal closure has the field-theoretic normal closure as +its fraction field. -/ +private theorem ringNormalClosure_isFractionRing : + let K := FractionRing R + let L := FractionRing S + let A := AlgebraicClosure L + let E := IntermediateField.normalClosure K L A + let T := Ring.NormalClosure R S + letI : Algebra L E := normalClosure.algebra K L A + letI : Algebra S E := ((algebraMap L E).comp (algebraMap S L)).toAlgebra + letI : Algebra T E := by + change Algebra (integralClosure S E) E + infer_instance + IsFractionRing T E := by + let K := FractionRing R + let L := FractionRing S + let A := AlgebraicClosure L + let E := IntermediateField.normalClosure K L A + let : Algebra L E := normalClosure.algebra K L A + let T := Ring.NormalClosure R S + let : Algebra S E := ((algebraMap L E).comp (algebraMap S L)).toAlgebra + let : IsScalarTower S L E := by + apply IsScalarTower.of_algebraMap_eq + intro x + rfl + let : Algebra T E := by + change Algebra (integralClosure S E) E + infer_instance + let : FiniteDimensional L E := + intermediateNormalClosure_finiteDimensional_top K L A + change IsFractionRing (integralClosure S E) E + exact integralClosure.isFractionRing_of_finite_extension L E + +omit [IsIntegrallyClosed R] [IsIntegrallyClosed S] in +/-- Transport Galoisness from the field-theoretic normal closure to the +fraction field of the integral normal closure. -/ +private theorem ringNormalClosure_isGalois_transport : + let K := FractionRing R + let L := FractionRing S + let A := AlgebraicClosure L + let E := IntermediateField.normalClosure K L A + let T := Ring.NormalClosure R S + letI : Algebra K E := SubalgebraClass.toAlgebra E + letI : Algebra K (FractionRing T) := + FractionRing.liftAlgebra R (FractionRing T) + IsGalois K E → IsGalois K (FractionRing T) := by + simp only + let K := FractionRing R + let L := FractionRing S + let A := AlgebraicClosure L + let E := IntermediateField.normalClosure K L A + let : Algebra L E := normalClosure.algebra K L A + let T := Ring.NormalClosure R S + let : Algebra S E := ((algebraMap L E).comp (algebraMap S L)).toAlgebra + let : IsScalarTower S L E := by + apply IsScalarTower.of_algebraMap_eq + intro x + rfl + let : Algebra T E := by + change Algebra (integralClosure S E) E + infer_instance + let : IsScalarTower S T E := + IsScalarTower.subalgebra' S E E (integralClosure S E) + let : IsScalarTower R L E := IsScalarTower.to₁₃₄ R K L E + let : IsScalarTower R S E := IsScalarTower.to₁₂₄ R S L E + let : IsScalarTower R T E := IsScalarTower.to₁₃₄ R S T E + let : IsFractionRing T E := ringNormalClosure_isFractionRing R S + intro hGalois + refine IsGalois.of_equiv_equiv (F := K) («E» := E) + (f := (FractionRing.algEquiv R K).symm.toRingEquiv) + (g := (FractionRing.algEquiv T E).symm.toRingEquiv) ?_ + ext + simpa using IsFractionRing.algEquiv_commutes + (FractionRing.algEquiv R K).symm + (FractionRing.algEquiv T E).symm _ + +omit [IsIntegrallyClosed R] in +/-- Finiteness of the integral normal closure follows from separability of +the original fraction-field extension. -/ +private theorem ringNormalClosure_moduleFinite_of_isSeparable + [IsNoetherianRing S] + [Algebra.IsSeparable (FractionRing R) (FractionRing S)] : + Module.Finite S (Ring.NormalClosure R S) := by + let K := FractionRing R + let L := FractionRing S + let A := AlgebraicClosure L + let E := IntermediateField.normalClosure K L A + let : Algebra L E := normalClosure.algebra K L A + let T := Ring.NormalClosure R S + let : Algebra S E := ((algebraMap L E).comp (algebraMap S L)).toAlgebra + let : IsScalarTower S L E := by + apply IsScalarTower.of_algebraMap_eq + intro x + rfl + let : Algebra T E := by + change Algebra (integralClosure S E) E + infer_instance + let : IsScalarTower S T E := + IsScalarTower.subalgebra' S E E (integralClosure S E) + let : IsIntegralClosure T S E := integralClosure.isIntegralClosure S E + let : FiniteDimensional L E := + intermediateNormalClosure_finiteDimensional_top K L A + let : Algebra.IsSeparable K E := + intermediateNormalClosure_isSeparable_of_isSeparable K L A + let : Algebra.IsSeparable L E := + Algebra.isSeparable_tower_top_of_isSeparable K L E + change Module.Finite S (integralClosure S E) + exact IsIntegralClosure.finite S L E (integralClosure S E) + +end SeparableIdealNorm + +section SeparableIdealNormDedekind + +variable (R : Type u) (S : Type v) + [CommRing R] [IsDomain R] [CommRing S] [IsDedekindDomain S] + [Algebra R S] [Module.Finite R S] [Module.IsTorsionFree R S] + +attribute [local instance] FractionRing.liftAlgebra + +/-- The same separable normal-closure construction is Dedekind when the +original rings are Dedekind. -/ +private theorem ringNormalClosure_isDedekindDomain_of_isSeparable + [Algebra.IsSeparable (FractionRing R) (FractionRing S)] : + IsDedekindDomain (Ring.NormalClosure R S) := by + let K := FractionRing R + let L := FractionRing S + let A := AlgebraicClosure L + let E := IntermediateField.normalClosure K L A + let : Algebra L E := normalClosure.algebra K L A + let T := Ring.NormalClosure R S + let : Algebra S E := ((algebraMap L E).comp (algebraMap S L)).toAlgebra + let : IsScalarTower S L E := by + apply IsScalarTower.of_algebraMap_eq + intro x + rfl + let : Algebra T E := by + change Algebra (integralClosure S E) E + infer_instance + let : IsScalarTower S T E := + IsScalarTower.subalgebra' S E E (integralClosure S E) + let : IsIntegralClosure T S E := integralClosure.isIntegralClosure S E + let : FiniteDimensional L E := + intermediateNormalClosure_finiteDimensional_top K L A + let : Algebra.IsSeparable K E := + intermediateNormalClosure_isSeparable_of_isSeparable K L A + let : Algebra.IsSeparable L E := + Algebra.isSeparable_tower_top_of_isSeparable K L E + change IsDedekindDomain (integralClosure S E) + exact integralClosure.isDedekindDomain S L E + +end SeparableIdealNormDedekind + +section SeparableIdealNormGalois + +variable (R : Type u) (S : Type v) + [CommRing R] [IsDomain R] [CommRing S] [IsDomain S] + [Algebra R S] [Module.Finite R S] [Module.IsTorsionFree R S] + +attribute [local instance] FractionRing.liftAlgebra + +/-- The normal closure of a finite separable extension of fraction fields is +Galois without assuming that the base fraction field is perfect. Mathlib's +default instance uses perfectness because it treats arbitrary finite +extensions; here separability is precisely the available hypothesis. -/ +theorem ringNormalClosure_isGalois_of_isSeparable + [Algebra.IsSeparable (FractionRing R) (FractionRing S)] : + IsGalois (FractionRing R) + (FractionRing (Ring.NormalClosure R S)) := by + let K := FractionRing R + let L := FractionRing S + let A := AlgebraicClosure L + let E := IntermediateField.normalClosure K L A + let T := Ring.NormalClosure R S + exact ringNormalClosure_isGalois_transport R S + (intermediateNormalClosure_isGalois_of_isSeparable K L A) + +end SeparableIdealNormGalois + +section SeparableIdealNormRelNorm + +variable (R : Type u) (S : Type v) + [CommRing R] [IsDedekindDomain R] + [CommRing S] [IsDedekindDomain S] + [Algebra R S] [Module.Finite R S] [Module.IsTorsionFree R S] + +attribute [local instance] FractionRing.liftAlgebra + +/-- Relative ideal norm of a maximal ideal in a finite separable extension. +This is the separable replacement for mathlib's perfect-base theorem and is +proved by the same normal-closure descent. -/ +theorem relNorm_eq_pow_inertiaDeg_of_isSeparable + [Algebra.IsSeparable (FractionRing R) (FractionRing S)] + (P : Ideal S) (p : Ideal R) [P.LiesOver p] + [P.IsMaximal] [p.IsMaximal] : + Ideal.relNorm R P = p ^ P.inertiaDeg R := by + let T := Ring.NormalClosure R S + let : Module.Finite S T := + ringNormalClosure_moduleFinite_of_isSeparable R S + let : Module.Finite R T := Module.Finite.trans S T + let : IsDedekindDomain T := + ringNormalClosure_isDedekindDomain_of_isSeparable R S + let : IsScalarTower R (FractionRing S) (FractionRing T) := + IsScalarTower.to₁₃₄ R S (FractionRing S) (FractionRing T) + let : IsScalarTower (FractionRing R) (FractionRing S) (FractionRing T) := + IsScalarTower.of_algebraMap_eq' (by + apply IsFractionRing.ringHom_ext (A := R) + intro x + rw [← IsScalarTower.algebraMap_apply R (FractionRing R) (FractionRing T)] + change algebraMap R (FractionRing T) x = + algebraMap (FractionRing S) (FractionRing T) + (algebraMap (FractionRing R) (FractionRing S) + (algebraMap R (FractionRing R) x)) + rw [← IsScalarTower.algebraMap_apply R (FractionRing R) (FractionRing S), + ← IsScalarTower.algebraMap_apply R (FractionRing S) (FractionRing T)]) + let : IsGalois (FractionRing R) (FractionRing T) := + ringNormalClosure_isGalois_of_isSeparable R S + let : IsGalois (FractionRing S) (FractionRing T) := + IsGalois.tower_top_of_isGalois + (FractionRing R) (FractionRing S) (FractionRing T) + obtain ⟨Q, hQm, hQP⟩ : ∃ Q : Ideal T, Q.IsMaximal ∧ Q.LiesOver P := + Ideal.exists_maximal_ideal_liesOver_of_isIntegral P + let : Q.IsMaximal := hQm + let : Q.LiesOver P := hQP + let : Q.LiesOver p := Ideal.LiesOver.trans Q P p + have h := Ideal.relNorm_eq_pow_of_isPrime_isGalois Q p + rwa [← Ideal.relNorm_relNorm R S, + Ideal.relNorm_eq_pow_of_isPrime_isGalois Q P, map_pow, + Ideal.inertiaDeg_tower (R := R) P Q, pow_mul, pow_left_inj] at h + exact Nat.ne_zero_iff_zero_lt.mpr (Ideal.inertiaDeg_pos Q S) + +end SeparableIdealNormRelNorm + +attribute [local instance] FractionRing.liftAlgebra + +/-- The image of the base maximal ideal in a finite local-field extension is +the power of the upstairs maximal ideal given by the actual Dedekind +ramification index. -/ +theorem maximalIdeal_map_eq_maximalIdeal_pow_ramificationIdx + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] : + Ideal.map (algebraMap 𝒪[K] 𝒪[L]) (𝓂[K] : Ideal 𝒪[K]) = + (𝓂[L] : Ideal 𝒪[L]) ^ + (𝓂[L] : Ideal 𝒪[L]).ramificationIdx 𝒪[K] := by + have hp : (𝓂[K] : Ideal 𝒪[K]) ≠ ⊥ := + Ring.ne_bot_of_isMaximal_of_not_isField + (IsLocalRing.maximalIdeal.isMaximal 𝒪[K]) + (IsDiscreteValuationRing.not_isField 𝒪[K]) + have hfactor := Ideal.map_algebraMap_eq_finsetProd_pow + (R := 𝒪[L]) (S := 𝒪[K]) (p := (𝓂[K] : Ideal 𝒪[K])) hp + have hsingleton : ((𝓂[K] : Ideal 𝒪[K]).primesOver 𝒪[L]).toFinset = + ({(𝓂[L] : Ideal 𝒪[L])} : Finset (Ideal 𝒪[L])) := by + ext P + simp [IsLocalRing.primesOver_eq 𝒪[L] hp] + rw [hsingleton] at hfactor + simpa using hfactor + +/-- Integral closure and separability produce the finite valuation-ring +module needed by the preceding ideal factorization. -/ +theorem maximalIdeal_map_eq_maximalIdeal_pow_ramificationIdx_of_isIntegralClosure + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [Algebra.IsSeparable K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + Ideal.map (algebraMap 𝒪[K] 𝒪[L]) (𝓂[K] : Ideal 𝒪[K]) = + (𝓂[L] : Ideal 𝒪[L]) ^ + (𝓂[L] : Ideal 𝒪[L]).ramificationIdx 𝒪[K] := by + let : Module.Finite 𝒪[K] 𝒪[L] := + integerRing_moduleFinite_of_isIntegralClosure K L + exact maximalIdeal_map_eq_maximalIdeal_pow_ramificationIdx K L + +/-- Separability of an actual field extension transfers to the canonical +fraction fields of its valuation integer rings. -/ +theorem fractionRing_integerRing_isSeparable + (K : Type u) (L : Type v) + [Field K] [ValuativeRel K] + [Field L] [ValuativeRel L] + [Algebra K L] [Algebra.IsSeparable K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] : + Algebra.IsSeparable (FractionRing 𝒪[K]) (FractionRing 𝒪[L]) := by + apply Algebra.IsSeparable.of_equiv_equiv + (FractionRing.algEquiv 𝒪[K] K).symm.toRingEquiv + (FractionRing.algEquiv 𝒪[L] L).symm.toRingEquiv + ext x + exact IsFractionRing.algEquiv_commutes + (FractionRing.algEquiv 𝒪[K] K).symm + (FractionRing.algEquiv 𝒪[L] L).symm x + +/-- In a finite separable local-field extension, the relative ideal norm of +the upstairs maximal ideal is the residue-degree power of the base maximal +ideal. -/ +theorem relNorm_maximalIdeal_eq_pow_residue_finrank + (K : Type u) (L : Type v) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [Algebra.IsSeparable K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] : + Ideal.relNorm 𝒪[K] (𝓂[L] : Ideal 𝒪[L]) = + (𝓂[K] : Ideal 𝒪[K]) ^ Module.finrank 𝓀[K] 𝓀[L] := by + let : Algebra.IsSeparable (FractionRing 𝒪[K]) (FractionRing 𝒪[L]) := + fractionRing_integerRing_isSeparable K L + have h := relNorm_eq_pow_inertiaDeg_of_isSeparable + 𝒪[K] 𝒪[L] (𝓂[L] : Ideal 𝒪[L]) (𝓂[K] : Ideal 𝒪[K]) + rw [Ideal.inertiaDeg_eq_of_isMaximal + (𝓂[K] : Ideal 𝒪[K]) (𝓂[L] : Ideal 𝒪[L])] at h + exact h + +/-- The norm of the chosen upstairs prime element has base normalized value +the negative of the actual residue degree, for every finite separable +extension (not only a Galois one). -/ +theorem v_normUnits_integerRingUniformizerFieldUnit_of_isSeparable + (K : Type u) (L : Type v) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [Algebra.IsSeparable K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + v K (Additive.ofMul + (normUnits K L (integerRingUniformizerFieldUnit L))) = + -(Module.finrank 𝓀[K] 𝓀[L] : Int) := by + let : Module.Finite 𝒪[K] 𝒪[L] := + IsIntegralClosure.finite 𝒪[K] K L 𝒪[L] + let f : Nat := Module.finrank 𝓀[K] 𝓀[L] + have hspan : + Ideal.span + ({Algebra.intNorm 𝒪[K] 𝒪[L] + (chosenIntegerRingUniformizer L)} : Set 𝒪[K]) = + Ideal.span ({chosenIntegerRingUniformizer K ^ f} : Set 𝒪[K]) := by + calc + Ideal.span + ({Algebra.intNorm 𝒪[K] 𝒪[L] + (chosenIntegerRingUniformizer L)} : Set 𝒪[K]) = + Ideal.relNorm 𝒪[K] + (Ideal.span ({chosenIntegerRingUniformizer L} : Set 𝒪[L])) := by + exact (Ideal.spanNorm_singleton (R := 𝒪[K]) + (r := chosenIntegerRingUniformizer L)).symm + _ = Ideal.relNorm 𝒪[K] (𝓂[L] : Ideal 𝒪[L]) := by + rw [chosenIntegerRingUniformizer_maximalIdeal_eq L] + _ = (𝓂[K] : Ideal 𝒪[K]) ^ f := by + simpa [f] using relNorm_maximalIdeal_eq_pow_residue_finrank K L + _ = Ideal.span ({chosenIntegerRingUniformizer K ^ f} : Set 𝒪[K]) := + maximalIdeal_pow_eq_span_uniformizer_pow K f + obtain ⟨u, hu⟩ := Ideal.span_singleton_eq_span_singleton.mp hspan + have hfieldUnits : + normUnits K L (integerRingUniformizerFieldUnit L) * + integerUnitsToFieldUnits K u = + integerRingUniformizerFieldUnit K ^ f := by + apply Units.ext + have huField := congrArg (algebraMap 𝒪[K] K) hu + rw [map_mul, Algebra.algebraMap_intNorm (K := K) (L := L)] at huField + change + Algebra.norm K (algebraMap 𝒪[L] L (chosenIntegerRingUniformizer L)) * + algebraMap 𝒪[K] K (u : 𝒪[K]) = + algebraMap 𝒪[K] K (chosenIntegerRingUniformizer K) ^ f + exact huField + have hvalue := congrArg + (fun z : Kˣ => v K (Additive.ofMul z)) hfieldUnits + change v K (Additive.ofMul + (normUnits K L (integerRingUniformizerFieldUnit L) * + integerUnitsToFieldUnits K u)) = + v K (Additive.ofMul (integerRingUniformizerFieldUnit K ^ f)) at hvalue + rw [v_mul, v_integerUnitsToFieldUnits, add_zero, v_pow, + v_integerRingUniformizerFieldUnit] at hvalue + simpa [f] using hvalue + +/-- The norm of the positive generator (the inverse chosen prime element) has +base normalized value equal to the actual residue degree. -/ +theorem v_normUnits_inverseIntegerRingUniformizerFieldUnit_of_isSeparable + (K : Type u) (L : Type v) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [Algebra.IsSeparable K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + v K (Additive.ofMul + (normUnits K L (inverseIntegerRingUniformizerFieldUnit L))) = + (Module.finrank 𝓀[K] 𝓀[L] : Int) := by + rw [inverseIntegerRingUniformizerFieldUnit, map_inv, v_inv, + v_normUnits_integerRingUniformizerFieldUnit_of_isSeparable] + simp only [neg_neg] + +/-- Finite local reciprocity, normalized norm calculation for every finite separable +local-field extension: the normalized value of a field norm is the actual +residue degree times the upstairs normalized value. -/ +theorem v_normUnits_eq_residue_finrank_mul_of_isSeparable + (K : Type u) (L : Type v) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [Algebra.IsSeparable K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (x : Lˣ) : + v K (Additive.ofMul (normUnits K L x)) = + (Module.finrank 𝓀[K] 𝓀[L] : Int) * + v L (Additive.ofMul x) := by + let ϖ : Lˣ := inverseIntegerRingUniformizerFieldUnit L + have hϖ : v L (Additive.ofMul ϖ) = 1 := + v_inverseIntegerRingUniformizerFieldUnit L + let n : Int := v L (Additive.ofMul x) + let a : 𝒪[L]ˣ := uniformizerUnitFactor L ϖ hϖ x + have haNorm : + normUnits K L (integerUnitsToFieldUnits L a) = + integerUnitsToFieldUnits K (normIntegerUnits K L a) := by + apply Units.ext + rfl + have hx : integerUnitsToFieldUnits L a * ϖ ^ n = x := by + exact uniformizerUnitFactor_mul_uniformizer_zpow L ϖ hϖ x + have hxNorm : + normUnits K L x = + integerUnitsToFieldUnits K (normIntegerUnits K L a) * + (normUnits K L ϖ) ^ n := by + calc + normUnits K L x = + normUnits K L (integerUnitsToFieldUnits L a * ϖ ^ n) := + congrArg (normUnits K L) hx.symm + _ = normUnits K L (integerUnitsToFieldUnits L a) * + (normUnits K L ϖ) ^ n := by + simp only [map_mul, map_zpow] + _ = integerUnitsToFieldUnits K (normIntegerUnits K L a) * + (normUnits K L ϖ) ^ n := by rw [haNorm] + rw [hxNorm, v_mul, v_integerUnitsToFieldUnits, zero_add, v_zpow, + v_normUnits_inverseIntegerRingUniformizerFieldUnit_of_isSeparable] + simp only [n] + ring + +/-- The image of the chosen base prime element has upstairs normalized value +the negative of the actual ramification index. -/ +theorem v_mapBaseUnitsToExtensionUnits_integerRingUniformizerFieldUnit + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] : + v L (Additive.ofMul + (mapBaseUnitsToExtensionUnits K L + (integerRingUniformizerFieldUnit K))) = + -((𝓂[L] : Ideal 𝒪[L]).ramificationIdx 𝒪[K] : Int) := by + let e := (𝓂[L] : Ideal 𝒪[L]).ramificationIdx 𝒪[K] + have hspan : + Ideal.span + ({integerRingMapOfValuationExtension K L + (chosenIntegerRingUniformizer K)} : Set 𝒪[L]) = + Ideal.span ({chosenIntegerRingUniformizer L ^ e} : Set 𝒪[L]) := by + calc + Ideal.span + ({integerRingMapOfValuationExtension K L + (chosenIntegerRingUniformizer K)} : Set 𝒪[L]) = + Ideal.map (algebraMap 𝒪[K] 𝒪[L]) + (𝓂[K] : Ideal 𝒪[K]) := by + rw [chosenIntegerRingUniformizer_maximalIdeal_eq K, + Ideal.map_span, Set.image_singleton] + rfl + _ = (𝓂[L] : Ideal 𝒪[L]) ^ e := by + exact maximalIdeal_map_eq_maximalIdeal_pow_ramificationIdx K L + _ = Ideal.span ({chosenIntegerRingUniformizer L ^ e} : Set 𝒪[L]) := + maximalIdeal_pow_eq_span_uniformizer_pow L e + obtain ⟨u, hu⟩ := Ideal.span_singleton_eq_span_singleton.mp hspan + have hfieldUnits : + mapBaseUnitsToExtensionUnits K L + (integerRingUniformizerFieldUnit K) * + integerUnitsToFieldUnits L u = + integerRingUniformizerFieldUnit L ^ e := by + apply Units.ext + have huField := congrArg (fun z : 𝒪[L] => (z : L)) hu + simpa [integerRingMapOfValuationExtension] using huField + have hvalue := congrArg + (fun z : Lˣ => v L (Additive.ofMul z)) hfieldUnits + change v L (Additive.ofMul + (mapBaseUnitsToExtensionUnits K L + (integerRingUniformizerFieldUnit K) * + integerUnitsToFieldUnits L u)) = + v L (Additive.ofMul (integerRingUniformizerFieldUnit L ^ e)) at hvalue + rw [v_mul, v_integerUnitsToFieldUnits, add_zero, v_pow, + v_integerRingUniformizerFieldUnit] at hvalue + simpa [e] using hvalue + +/-- Integral closure and separability produce the module-finiteness used in +the uniformizer scaling calculation. -/ +theorem v_mapBaseUnitsToExtensionUnits_integerRingUniformizerFieldUnit_of_isIntegralClosure + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [Algebra.IsSeparable K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + v L (Additive.ofMul + (mapBaseUnitsToExtensionUnits K L + (integerRingUniformizerFieldUnit K))) = + -((𝓂[L] : Ideal 𝒪[L]).ramificationIdx 𝒪[K] : Int) := by + let : Module.Finite 𝒪[K] 𝒪[L] := + integerRing_moduleFinite_of_isIntegralClosure K L + exact + v_mapBaseUnitsToExtensionUnits_integerRingUniformizerFieldUnit K L + +/-- Base extension commutes with the two canonical inclusions of valuation +integer units into field units. -/ +theorem mapBaseUnitsToExtensionUnits_integerUnitsToFieldUnits + (K L : Type u) + [Field K] [ValuativeRel K] + [Field L] [ValuativeRel L] + [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + (x : 𝒪[K]ˣ) : + mapBaseUnitsToExtensionUnits K L (integerUnitsToFieldUnits K x) = + integerUnitsToFieldUnits L + (Units.map (algebraMap 𝒪[K] 𝒪[L]).toMonoidHom x) := by + apply Units.ext + rfl + +/-- The positive generator (the inverse chosen prime element) scales by the +actual ramification index under base extension. -/ +theorem v_mapBaseUnitsToExtensionUnits_inverseIntegerRingUniformizerFieldUnit_of_isIntegralClosure + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [Algebra.IsSeparable K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + v L (Additive.ofMul + (mapBaseUnitsToExtensionUnits K L + (inverseIntegerRingUniformizerFieldUnit K))) = + ((𝓂[L] : Ideal 𝒪[L]).ramificationIdx 𝒪[K] : Int) := by + rw [inverseIntegerRingUniformizerFieldUnit, + (mapBaseUnitsToExtensionUnits K L).map_inv, v_inv, + v_mapBaseUnitsToExtensionUnits_integerRingUniformizerFieldUnit_of_isIntegralClosure] + simp only [neg_neg] + +/-- Normalized valuations in a finite separable local-field extension scale +under the base embedding by the actual ramification index. -/ +theorem v_mapBaseUnitsToExtensionUnits_eq_ramificationIdx_mul + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [Algebra.IsSeparable K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (x : Kˣ) : + v L (Additive.ofMul (mapBaseUnitsToExtensionUnits K L x)) = + ((𝓂[L] : Ideal 𝒪[L]).ramificationIdx 𝒪[K] : Int) * + v K (Additive.ofMul x) := by + let ϖ : Kˣ := inverseIntegerRingUniformizerFieldUnit K + have hϖ : v K (Additive.ofMul ϖ) = 1 := + v_inverseIntegerRingUniformizerFieldUnit K + let n : Int := v K (Additive.ofMul x) + let a : 𝒪[K]ˣ := uniformizerUnitFactor K ϖ hϖ x + let aL : 𝒪[L]ˣ := Units.map + (algebraMap 𝒪[K] 𝒪[L]).toMonoidHom a + have haMap : + mapBaseUnitsToExtensionUnits K L (integerUnitsToFieldUnits K a) = + integerUnitsToFieldUnits L aL := by + exact mapBaseUnitsToExtensionUnits_integerUnitsToFieldUnits K L a + have hx : integerUnitsToFieldUnits K a * ϖ ^ n = x := by + exact uniformizerUnitFactor_mul_uniformizer_zpow K ϖ hϖ x + have hxMap : + mapBaseUnitsToExtensionUnits K L x = + integerUnitsToFieldUnits L aL * + (mapBaseUnitsToExtensionUnits K L ϖ) ^ n := by + calc + mapBaseUnitsToExtensionUnits K L x = + mapBaseUnitsToExtensionUnits K L + (integerUnitsToFieldUnits K a * ϖ ^ n) := + congrArg (mapBaseUnitsToExtensionUnits K L) hx.symm + _ = mapBaseUnitsToExtensionUnits K L + (integerUnitsToFieldUnits K a) * + (mapBaseUnitsToExtensionUnits K L ϖ) ^ n := by + simp only [map_mul, map_zpow] + _ = integerUnitsToFieldUnits L aL * + (mapBaseUnitsToExtensionUnits K L ϖ) ^ n := by rw [haMap] + rw [hxMap, v_mul, v_integerUnitsToFieldUnits, zero_add, v_zpow, + v_mapBaseUnitsToExtensionUnits_inverseIntegerRingUniformizerFieldUnit_of_isIntegralClosure] + simp only [n] + ring + +/-- The Galois specialization of the finite-separable normalized norm +calculation in the finite local reciprocity construction. -/ +theorem v_normUnits_eq_residue_finrank_mul_of_isGalois + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + (x : Lˣ) : + v K (Additive.ofMul (normUnits K L x)) = + (Module.finrank 𝓀[K] 𝓀[L] : Int) * + v L (Additive.ofMul x) := + v_normUnits_eq_residue_finrank_mul_of_isSeparable K L x + +/-- Finite local reciprocity, normalized norm range for every finite separable +local-field extension. Surjectivity of the upstairs normalized valuation +turns the pointwise norm formula into the exact subgroup `fℤ`. -/ +theorem valuationMap_comp_normUnits_range_eq_zmultiples_of_isSeparable + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [Algebra.IsSeparable K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + ((valuationMap K).comp + (MonoidHom.toAdditive (normUnits K L))).range = + AddSubgroup.zmultiples (Module.finrank 𝓀[K] 𝓀[L] : Int) := by + ext z + constructor + · rintro ⟨x, rfl⟩ + rw [AddSubgroup.mem_zmultiples_iff] + refine ⟨valuationMap L x, ?_⟩ + change valuationMap L x • (Module.finrank 𝓀[K] 𝓀[L] : Int) = + valuationMap K + (Additive.ofMul (normUnits K L (Additive.toMul x))) + have hnorm := + v_normUnits_eq_residue_finrank_mul_of_isSeparable K L (Additive.toMul x) + simpa [valuationMap_apply, zsmul_eq_mul, mul_comm] using hnorm.symm + · intro hz + rw [AddSubgroup.mem_zmultiples_iff] at hz + obtain ⟨m, hm⟩ := hz + obtain ⟨x, hx⟩ := valuationMap_surjective L m + refine ⟨x, ?_⟩ + change valuationMap K + (Additive.ofMul (normUnits K L (Additive.toMul x))) = z + have hnorm := + v_normUnits_eq_residue_finrank_mul_of_isSeparable K L (Additive.toMul x) + calc + valuationMap K + (Additive.ofMul (normUnits K L (Additive.toMul x))) = + (Module.finrank 𝓀[K] 𝓀[L] : Int) * valuationMap L x := by + simpa [valuationMap_apply] using hnorm + _ = z := by + rw [hx] + simpa [zsmul_eq_mul, mul_comm] using hm + +/-- The Galois specialization of the finite-separable norm-range theorem in +the finite local reciprocity construction. -/ +theorem valuationMap_comp_normUnits_range_eq_zmultiples_of_isGalois + (K L : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) + (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + ((valuationMap K).comp + (MonoidHom.toAdditive (normUnits K L))).range = + AddSubgroup.zmultiples (Module.finrank 𝓀[K] 𝓀[L] : Int) := + valuationMap_comp_normUnits_range_eq_zmultiples_of_isSeparable K L + +end +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ShrinkTransport.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ShrinkTransport.lean new file mode 100644 index 0000000000..554491aab4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ShrinkTransport.lean @@ -0,0 +1,261 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Small +public import Mathlib.Algebra.Field.Shrink +public import Mathlib.Topology.Instances.Shrink +/-! +# Transporting local-field structures to a small representative + +This file records the valuation and topology on the `Type 0` representative +of an arbitrary-universe nonarchimedean local field. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalFieldTheory + +open ValuativeRel Filter +open scoped Topology + +universe u + +variable (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + +private theorem smallLocalField : Small.{0} K := + nonarchimedeanLocalField_small K + +/-- The canonical valuation pulled back to the small carrier. -/ +noncomputable def shrinkLocalFieldValuation : + letI : Small.{0} K := by exact smallLocalField K + Valuation (Shrink.{0} K) (ValueGroupWithZero K) := by + letI : Small.{0} K := by exact smallLocalField K + exact (valuation K).comap (Shrink.ringEquiv K).toRingHom + +/-- The valuative relation on the small carrier, transported from `K`. -/ +@[instance_reducible] +noncomputable def shrinkLocalFieldValuativeRel : + letI : Small.{0} K := by exact smallLocalField K + ValuativeRel (Shrink.{0} K) := by + letI : Small.{0} K := by exact smallLocalField K + exact ValuativeRel.ofValuation (shrinkLocalFieldValuation K) + +/-- The small carrier inherits local compactness from `K`. -/ +theorem shrinkLocalField_locallyCompact : + letI : Small.{0} K := by exact smallLocalField K + LocallyCompactSpace (Shrink.{0} K) := by + let : Small.{0} K := by exact smallLocalField K + exact (Shrink.homeomorph K).symm.isOpenEmbedding.locallyCompactSpace + +/-- The pulled-back valuative relation is nontrivial. -/ +theorem shrinkLocalField_isNontrivial : + letI : Small.{0} K := by exact smallLocalField K + letI : ValuativeRel (Shrink.{0} K) := shrinkLocalFieldValuativeRel K + ValuativeRel.IsNontrivial (Shrink.{0} K) := by + let : Small.{0} K := by exact smallLocalField K + let : ValuativeRel (Shrink.{0} K) := shrinkLocalFieldValuativeRel K + let v := shrinkLocalFieldValuation K + let : v.Compatible := Valuation.Compatible.ofValuation v + have hvK : (valuation K).IsNontrivial := + (ValuativeRel.isNontrivial_iff_isNontrivial (valuation K)).mp inferInstance + have hvS : v.IsNontrivial := by + obtain ⟨x, hx0, hx1⟩ := hvK.exists_val_nontrivial + refine ⟨(Shrink.ringEquiv K).symm x, ?_, ?_⟩ + · simpa [v, shrinkLocalFieldValuation] using hx0 + · simpa [v, shrinkLocalFieldValuation] using hx1 + exact (ValuativeRel.isNontrivial_iff_isNontrivial v).2 hvS + +/-- Strict valuation comparisons are preserved by the small-carrier ring +equivalence. -/ +theorem shrinkLocalField_valuation_lt_iff : + letI : Small.{0} K := by exact smallLocalField K + letI : ValuativeRel (Shrink.{0} K) := shrinkLocalFieldValuativeRel K + ∀ x y : Shrink.{0} K, + valuation (Shrink.{0} K) x < valuation (Shrink.{0} K) y ↔ + valuation K (Shrink.ringEquiv K x) < + valuation K (Shrink.ringEquiv K y) := by + let : Small.{0} K := by exact smallLocalField K + let : ValuativeRel (Shrink.{0} K) := shrinkLocalFieldValuativeRel K + intro x y + let v := shrinkLocalFieldValuation K + let : v.Compatible := Valuation.Compatible.ofValuation v + calc + valuation (Shrink.{0} K) x < valuation (Shrink.{0} K) y + ↔ x <ᵥ y := (valuation (Shrink.{0} K)).vlt_iff_lt.symm + _ ↔ v x < v y := v.vlt_iff_lt + _ ↔ valuation K (Shrink.ringEquiv K x) < + valuation K (Shrink.ringEquiv K y) := by + simp [v, shrinkLocalFieldValuation] + +/-- The transported topology is compatible with the transported additive +group structure. -/ +theorem shrinkLocalField_isTopologicalAddGroup : + letI : Small.{0} K := by exact smallLocalField K + IsTopologicalAddGroup (Shrink.{0} K) := by + let : Small.{0} K := by exact smallLocalField K + change @IsTopologicalAddGroup (Shrink.{0} K) + (TopologicalSpace.induced (Shrink.ringEquiv K) inferInstance) _ + exact isTopologicalAddGroup_induced (Shrink.ringEquiv K).toAddMonoidHom + +/-- The transported topology is the valuative topology of the pulled-back +valuation. -/ +theorem shrinkLocalField_isValuativeTopology : + letI : Small.{0} K := by exact smallLocalField K + letI : ValuativeRel (Shrink.{0} K) := shrinkLocalFieldValuativeRel K + IsValuativeTopology (Shrink.{0} K) := by + let : Small.{0} K := by exact smallLocalField K + let : ValuativeRel (Shrink.{0} K) := shrinkLocalFieldValuativeRel K + let : IsTopologicalAddGroup (Shrink.{0} K) := + shrinkLocalField_isTopologicalAddGroup K + let e : Shrink.{0} K ≃+* K := Shrink.ringEquiv K + let h : Shrink.{0} K ≃ₜ K := (Shrink.homeomorph K).symm + have hnhds (s : Set (Shrink.{0} K)) : + s ∈ 𝓝 (0 : Shrink.{0} K) ↔ h '' s ∈ 𝓝 (0 : K) := by + have h0 : h (0 : Shrink.{0} K) = (0 : K) := by + change e (0 : Shrink.{0} K) = 0 + exact map_zero e + calc + s ∈ 𝓝 (0 : Shrink.{0} K) ↔ + h ⁻¹' (h '' s) ∈ 𝓝 (0 : Shrink.{0} K) := by + rw [Set.preimage_image_eq _ h.injective] + _ ↔ h '' s ∈ map h (𝓝 (0 : Shrink.{0} K)) := Iff.rfl + _ ↔ h '' s ∈ 𝓝 (0 : K) := by rw [h.map_nhds_eq, h0] + have basisK (t : Set K) : + t ∈ 𝓝 (0 : K) ↔ + ∃ a : K, a ≠ 0 ∧ {z : K | valuation K z < valuation K a} ⊆ t := by + rw [IsValuativeTopology.mem_nhds_zero_iff] + constructor + · rintro ⟨γ, hγ⟩ + obtain ⟨a, ha⟩ := ValuativeRel.valuation_surjective (γ : ValueGroupWithZero K) + refine ⟨a, ?_, ?_⟩ + · intro ha0 + have hγ0 : (γ : ValueGroupWithZero K) = 0 := by + simpa [ha0] using ha.symm + exact γ.ne_zero hγ0 + · simpa [ha] using hγ + · rintro ⟨a, ha0, hsub⟩ + refine ⟨Units.mk0 (valuation K a) (by simpa using ha0), ?_⟩ + simpa using hsub + have basisSmall (s : Set (Shrink.{0} K)) : + (∃ γ : (ValueGroupWithZero (Shrink.{0} K))ˣ, + {z : Shrink.{0} K | valuation (Shrink.{0} K) z < γ} ⊆ s) ↔ + ∃ a : Shrink.{0} K, a ≠ 0 ∧ + {z : Shrink.{0} K | + valuation (Shrink.{0} K) z < valuation (Shrink.{0} K) a} ⊆ s := by + constructor + · rintro ⟨γ, hγ⟩ + obtain ⟨a, ha⟩ := + ValuativeRel.valuation_surjective (γ : ValueGroupWithZero (Shrink.{0} K)) + refine ⟨a, ?_, ?_⟩ + · intro ha0 + have hγ0 : (γ : ValueGroupWithZero (Shrink.{0} K)) = 0 := by + simpa [ha0] using ha.symm + exact γ.ne_zero hγ0 + · simpa [ha] using hγ + · rintro ⟨a, ha0, hsub⟩ + refine ⟨Units.mk0 (valuation (Shrink.{0} K) a) (by simpa using ha0), ?_⟩ + simpa using hsub + apply IsValuativeTopology.of_zero + intro s + rw [hnhds s, basisK, basisSmall] + constructor + · rintro ⟨a, ha0, hsub⟩ + refine ⟨e.symm a, by simpa using ha0, ?_⟩ + intro z hz + have hzK : e z ∈ h '' s := by + apply hsub + change valuation K (e z) < valuation K a + have hv := (shrinkLocalField_valuation_lt_iff K z (e.symm a)).mp hz + change valuation K (e z) < valuation K (e (e.symm a)) at hv + simpa only [e.apply_symm_apply] using hv + change e z ∈ e '' s at hzK + rcases hzK with ⟨w, hw, hew⟩ + simpa [e.injective hew] using hw + · rintro ⟨a, ha0, hsub⟩ + refine ⟨e a, by simpa using ha0, ?_⟩ + intro z hz + have hzS : e.symm z ∈ s := hsub (by + apply (shrinkLocalField_valuation_lt_iff K (e.symm z) a).2 + change valuation K (e (e.symm z)) < valuation K (e a) + change valuation K z < valuation K (e a) at hz + simpa only [e.apply_symm_apply] using hz) + change z ∈ e '' s + exact ⟨e.symm z, hzS, e.apply_symm_apply z⟩ + +/-- The small representative of a nonarchimedean local field is itself a +nonarchimedean local field for the transported structures. -/ +theorem shrinkLocalField_isNonarchimedeanLocalField : + letI : Small.{0} K := by exact smallLocalField K + letI : ValuativeRel (Shrink.{0} K) := shrinkLocalFieldValuativeRel K + IsNonarchimedeanLocalField (Shrink.{0} K) := by + let : Small.{0} K := by exact smallLocalField K + let : ValuativeRel (Shrink.{0} K) := shrinkLocalFieldValuativeRel K + exact { + toIsValuativeTopology := shrinkLocalField_isValuativeTopology K + toLocallyCompactSpace := shrinkLocalField_locallyCompact K + toIsNontrivial := shrinkLocalField_isNontrivial K + } + +section ValuationExtension + +universe v w x y + +/-- A valuation-extension relation survives transport along compatible field +equivalences. This applies in particular to the two `Shrink` equivalences. -/ +theorem hasExtension_comap_ringEquivs + {F : Type v} {G : Type w} {F₀ : Type x} {G₀ : Type y} + [Field F] [Field G] [Field F₀] [Field G₀] + [Algebra F G] [Algebra F₀ G₀] + {ΓF ΓG : Type*} + [LinearOrderedCommGroupWithZero ΓF] + [LinearOrderedCommGroupWithZero ΓG] + (eF : F₀ ≃+* F) (eG : G₀ ≃+* G) + (h : ∀ a : F₀, eG (algebraMap F₀ G₀ a) = + algebraMap F G (eF a)) + (vF : Valuation F ΓF) (vG : Valuation G ΓG) + [vF.HasExtension vG] : + (vF.comap eF.toRingHom).HasExtension + (vG.comap eG.toRingHom) := by + constructor + rw [Valuation.isEquiv_iff_val_le_one] + intro a + change vF (eF a) ≤ 1 ↔ vG (eG (algebraMap F₀ G₀ a)) ≤ 1 + rw [h] + exact (Valuation.HasExtension.val_map_le_one_iff vF vG (eF a)).symm + +/-- Equivalent valuations may replace both valuations in an extension +relation. This is useful when a transported valuation is equivalent, but +not definitionally equal, to the canonical valuation on `Shrink`. -/ +theorem hasExtension_of_isEquiv + {F : Type v} {G : Type w} + [CommRing F] [Ring G] [Algebra F G] + {ΓF ΓF' ΓG ΓG' : Type*} + [LinearOrderedCommMonoidWithZero ΓF] + [LinearOrderedCommMonoidWithZero ΓF'] + [LinearOrderedCommMonoidWithZero ΓG] + [LinearOrderedCommMonoidWithZero ΓG'] + (vF : Valuation F ΓF) (vF' : Valuation F ΓF') + (vG : Valuation G ΓG) (vG' : Valuation G ΓG') + [vF.HasExtension vG] + (hF : vF.IsEquiv vF') (hG : vG.IsEquiv vG') : + vF'.HasExtension vG' := by + constructor + intro x y + have hext : vF.IsEquiv (vG.comap (algebraMap F G)) := + Valuation.HasExtension.val_isEquiv_comap + exact (hF.symm x y).trans + ((hext x y).trans + (hG (algebraMap F G x) (algebraMap F G y))) + +end ValuationExtension + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Small.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Small.lean new file mode 100644 index 0000000000..a6c8aa89f0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Small.lean @@ -0,0 +1,61 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core +public import Mathlib.Logic.Small.Basic +/-! +# The carrier of a nonarchimedean local field is universe-small + +The integer ring injects into the sequence of its finite quotients by powers +of the maximal ideal. Its fraction field is therefore also small enough to +be represented in `Type 0`. No countability of the field itself is asserted. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalFieldTheory + +open ValuationTheory.DiscreteValuationField +open ValuativeRel + +universe u + +/-- A local field in any universe has a carrier equivalent to a type in +`Type 0`. -/ +theorem nonarchimedeanLocalField_small + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : Small.{0} K := by + let F : CompleteDVF.{u, u} K := localCompleteDVF K + let O := F.valuationSubring + let I := F.maximalIdeal + let : Finite F.residueField := by + change Finite 𝓀[K] + infer_instance + let : IsAdicComplete I O := F.isAdicComplete + have hO : Small.{0} O := by + let f : O → (∀ n : ℕ, O ⧸ I ^ n) := + fun x n => Ideal.Quotient.mk (I ^ n) x + have hf : Function.Injective f := by + intro x y h + apply (IsHausdorff.eq_iff_smodEq (I := I)).2 + intro n + simpa [f, Ideal.Quotient.mk_eq_mk_iff_sub_mem, SModEq] using congrFun h n + exact small_of_injective hf + let : Small.{0} O := hO + let : IsFractionRing O K := F.toDVF.valuationSubring_isFractionRing + apply small_of_surjective + (f := fun p : O × O => (algebraMap O K p.1) / (algebraMap O K p.2)) + intro x + obtain ⟨a, b, _, hab⟩ := IsFractionRing.div_surjective O x + exact ⟨(a, b), hab⟩ + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/StandardOpenSubgroups.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/StandardOpenSubgroups.lean new file mode 100644 index 0000000000..0f8cf5d9bf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/StandardOpenSubgroups.lean @@ -0,0 +1,107 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients +/-! +# Standard open subgroups of a nonarchimedean local field + +An open finite-index subgroup of a nonarchimedean local field multiplicative group +contains a standard subgroup built from a uniformizer and a sufficiently deep +principal-unit group. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalFieldTheory + +open scoped ValuativeRel + +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +universe u + +/-- The `n`-th principal-unit group, viewed as a subgroup of the field's +multiplicative group. -/ +def fieldPrincipalUnits + (K : Type u) [Field K] [ValuativeRel K] (n : ℕ) : Subgroup Kˣ := + (principalUnits K n).map (integerUnitsToFieldUnits K) + +/-- The standard subgroup `(ϖ^d) · U^n` used in the existence theorem. +The product of the two commuting subgroups is written as their supremum. -/ +def uniformizerPrincipalSubgroup + (K : Type u) [Field K] [ValuativeRel K] + (ϖ : Kˣ) (d n : ℕ) : Subgroup Kˣ := + Subgroup.zpowers (ϖ ^ d) ⊔ fieldPrincipalUnits K n + +/-- Every open subgroup of the multiplicative group of a nonarchimedean local +field contains a sufficiently deep positive principal-unit group. -/ +theorem exists_fieldPrincipalUnits_le_of_isOpen + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : Subgroup Kˣ) (hH : IsOpen (H : Set Kˣ)) : + ∃ n : ℕ, 1 ≤ n ∧ fieldPrincipalUnits K n ≤ H := by + rcases Units.isEmbedding_val₀.isOpen_iff.mp hH with + ⟨V : Set K, hVopen, hV⟩ + have hOneV : (1 : K) ∈ V := by + have hOneH : (1 : Kˣ) ∈ H := H.one_mem + have hOnePre : (1 : Kˣ) ∈ Units.val ⁻¹' V := hV.symm ▸ hOneH + exact hOnePre + let s : Set 𝒪[K] := {a | (((a : 𝒪[K]) : K) + 1) ∈ V} + have hs : s ∈ nhds (0 : 𝒪[K]) := by + have hsOpen : IsOpen s := by + exact hVopen.preimage (continuous_subtype_val.add continuous_const) + apply hsOpen.mem_nhds + simpa [s] using hOneV + obtain ⟨N, hN⟩ := exists_maximalIdeal_pow_subset_nhds_zero K s hs + refine ⟨N + 1, Nat.succ_pos N, ?_⟩ + rintro x ⟨u, hu, rfl⟩ + have huPowSucc : + (((u : 𝒪[K]ˣ) : 𝒪[K]) - 1) ∈ + (𝓂[K] ^ (N + 1) : Ideal 𝒪[K]) := + (mem_principalUnits_iff K u (N + 1)).1 hu + have huPow : + (((u : 𝒪[K]ˣ) : 𝒪[K]) - 1) ∈ + (𝓂[K] ^ N : Ideal 𝒪[K]) := + Ideal.pow_le_pow_right (Nat.le_succ N) huPowSucc + have huV : (((u : 𝒪[K]ˣ) : 𝒪[K]) : K) ∈ V := by + have hus := hN huPow + change (((((u : 𝒪[K]ˣ) : 𝒪[K]) - 1 : 𝒪[K]) : K) + 1) ∈ V at hus + simpa using hus + have huPre : integerUnitsToFieldUnits K u ∈ Units.val ⁻¹' V := huV + have huH : integerUnitsToFieldUnits K u ∈ (H : Set Kˣ) := by + rw [← hV] + exact huPre + exact huH + +/-- An open finite-index subgroup contains a standard subgroup generated by a +uniformizer power and a sufficiently deep principal-unit group. -/ +theorem exists_uniformizerPrincipalSubgroup_le_of_isOpen_finiteIndex + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : Subgroup Kˣ) [H.FiniteIndex] (hH : IsOpen (H : Set Kˣ)) : + ∃ (ϖ : Kˣ) (d n : ℕ), + v K (Additive.ofMul ϖ) = 1 ∧ + 0 < d ∧ 1 ≤ n ∧ + uniformizerPrincipalSubgroup K ϖ d n ≤ H := by + obtain ⟨ϖ, hϖ⟩ := v_uniformiser K + obtain ⟨n, hn, hUn⟩ := + exists_fieldPrincipalUnits_le_of_isOpen K H hH + have hd : 0 < H.index := + Nat.pos_of_ne_zero Subgroup.FiniteIndex.index_ne_zero + refine ⟨ϖ, H.index, n, hϖ, hd, hn, ?_⟩ + apply sup_le + · exact (Subgroup.zpowers_le).2 (H.pow_index_mem ϖ) + · exact hUn + +end LocalFieldTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UniformizerPrincipalQuotient.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UniformizerPrincipalQuotient.lean new file mode 100644 index 0000000000..a8260dbc1d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UniformizerPrincipalQuotient.lean @@ -0,0 +1,192 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence + +/-! # Uniformizer Principal Quotient -/ + +@[expose] public section + +open _root_.LocalFieldTheory.IsNonarchimedeanLocalField renaming + integerUnitsToFieldUnits_uniformizerUnitFactor → + integerUnitsToFieldUnits_uniformizerUnitFactor + +open scoped ValuativeRel + +/-! +# Quotients by a uniformizer and principal units + +For a nonarchimedean local field, quotienting the field-unit group by the +standard subgroup generated by a normalized uniformizer and `U^n` is +canonically equivalent to quotienting the integer-unit group by `U^n`. +-/ + +namespace LocalFieldTheory + +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +private theorem integerUnitsToFieldUnits_injective + (L : Type*) [Field L] [ValuativeRel L] : + Function.Injective (integerUnitsToFieldUnits L) := by + intro x y hxy + ext + exact congrArg (fun z : Lˣ => (z : L)) hxy + +/-- The unit factor associated with a normalized uniformizer sends one to +the trivial integer unit. -/ +theorem uniformizerUnitFactor_one + (K : Type*) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (pi : Kˣ) + (hpi : LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul pi) = 1) : + LocalFieldTheory.IsNonarchimedeanLocalField.uniformizerUnitFactor K pi hpi 1 = 1 := by + apply integerUnitsToFieldUnits_injective K + rw [integerUnitsToFieldUnits_uniformizerUnitFactor] + rw [LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_ofMul_one] + simp + +/-- The unit factor associated with a normalized uniformizer is +multiplicative. -/ +theorem uniformizerUnitFactor_mul + (K : Type*) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (pi : Kˣ) + (hpi : LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul pi) = 1) + (x y : Kˣ) : + LocalFieldTheory.IsNonarchimedeanLocalField.uniformizerUnitFactor K pi hpi (x * y) = + LocalFieldTheory.IsNonarchimedeanLocalField.uniformizerUnitFactor K pi hpi x * + LocalFieldTheory.IsNonarchimedeanLocalField.uniformizerUnitFactor K pi hpi y := by + apply integerUnitsToFieldUnits_injective K + rw [map_mul] + simp only + [integerUnitsToFieldUnits_uniformizerUnitFactor] + rw [LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_ofMul_mul, zpow_add] + simp only [div_eq_mul_inv, mul_inv_rev] + ac_rfl + +/-- Extracting the unit factor of an embedded integer unit recovers the +original integer unit. -/ +theorem uniformizerUnitFactor_integerUnit + (K : Type*) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (pi : Kˣ) + (hpi : LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul pi) = 1) + (u : 𝒪[K]ˣ) : + LocalFieldTheory.IsNonarchimedeanLocalField.uniformizerUnitFactor K pi hpi + (integerUnitsToFieldUnits K u) = u := by + apply integerUnitsToFieldUnits_injective K + rw [integerUnitsToFieldUnits_uniformizerUnitFactor] + have hv : LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul (integerUnitsToFieldUnits K u)) = 0 := by + rw [LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_apply] + exact v_integerUnitsToFieldUnits K u + rw [hv] + simp + +/-- Extract the unit factor and reduce it modulo the `n`-th principal-unit +subgroup. -/ +noncomputable def fieldUnitsToIntegerUnitsPrincipalQuotientHom + (K : Type*) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (pi : Kˣ) + (hpi : LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul pi) = 1) + (n : ℕ) : Kˣ →* IntegerUnitsPrincipalQuot K n where + toFun x := integerUnitsPrincipalQuotMk K n + (LocalFieldTheory.IsNonarchimedeanLocalField.uniformizerUnitFactor K pi hpi x) + map_one' := by rw [uniformizerUnitFactor_one]; exact map_one _ + map_mul' x y := by + rw [uniformizerUnitFactor_mul] + exact map_mul _ _ _ + +/-- Reduction of normalized unit factors modulo principal units is +surjective. -/ +theorem fieldUnitsToIntegerUnitsPrincipalQuotientHom_surjective + (K : Type*) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (pi : Kˣ) + (hpi : LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul pi) = 1) + (n : ℕ) : + Function.Surjective (fieldUnitsToIntegerUnitsPrincipalQuotientHom K pi hpi n) := by + intro q + obtain ⟨u, rfl⟩ := integerUnitsPrincipalQuotMk_surjective K n q + refine ⟨integerUnitsToFieldUnits K u, ?_⟩ + change integerUnitsPrincipalQuotMk K n + (LocalFieldTheory.IsNonarchimedeanLocalField.uniformizerUnitFactor K pi hpi + (integerUnitsToFieldUnits K u)) = integerUnitsPrincipalQuotMk K n u + rw [uniformizerUnitFactor_integerUnit] + +/-- The kernel is generated by the normalized uniformizer together with the +`n`-th field principal-unit subgroup. -/ +theorem fieldUnitsToIntegerUnitsPrincipalQuotientHom_ker + (K : Type*) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (pi : Kˣ) + (hpi : LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul pi) = 1) + (n : ℕ) : + MonoidHom.ker (fieldUnitsToIntegerUnitsPrincipalQuotientHom K pi hpi n) = + uniformizerPrincipalSubgroup K pi 1 n := by + apply le_antisymm + · intro x hx + have hfactor : LocalFieldTheory.IsNonarchimedeanLocalField.uniformizerUnitFactor K pi hpi x ∈ + principalUnits K n := by + rw [← integerUnitsPrincipalQuotMk_ker K n] + exact hx + rw [← LocalFieldTheory.IsNonarchimedeanLocalField.uniformizerUnitFactor_mul_uniformizer_zpow + K pi hpi x] + apply (uniformizerPrincipalSubgroup K pi 1 n).mul_mem + · exact (show fieldPrincipalUnits K n ≤ + uniformizerPrincipalSubgroup K pi 1 n from le_sup_right) + ⟨IsNonarchimedeanLocalField.uniformizerUnitFactor K pi hpi x, + hfactor, rfl⟩ + · exact (show Subgroup.zpowers (pi ^ 1) ≤ + uniformizerPrincipalSubgroup K pi 1 n from le_sup_left) + (by + rw [pow_one] + exact (Subgroup.zpowers pi).zpow_mem + (Subgroup.mem_zpowers pi) + (LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul x))) + · apply sup_le + · rw [Subgroup.zpowers_le] + change fieldUnitsToIntegerUnitsPrincipalQuotientHom K pi hpi n (pi ^ 1) = 1 + rw [pow_one] + change integerUnitsPrincipalQuotMk K n + (LocalFieldTheory.IsNonarchimedeanLocalField.uniformizerUnitFactor K pi hpi pi) = 1 + have hfactor : LocalFieldTheory.IsNonarchimedeanLocalField.uniformizerUnitFactor K pi hpi + pi = 1 := by + apply integerUnitsToFieldUnits_injective K + rw [integerUnitsToFieldUnits_uniformizerUnitFactor, + hpi] + simp + rw [hfactor] + exact map_one _ + · rintro x ⟨u, hu, rfl⟩ + change integerUnitsPrincipalQuotMk K n + (LocalFieldTheory.IsNonarchimedeanLocalField.uniformizerUnitFactor K pi hpi + (integerUnitsToFieldUnits K u)) = 1 + rw [uniformizerUnitFactor_integerUnit] + exact (QuotientGroup.eq_one_iff u).2 hu + +/-- Quotienting field units by a normalized uniformizer and `U^n` is +canonically equivalent to quotienting integer units by `U^n`. -/ +noncomputable def uniformizerPrincipalQuotientEquivIntegerUnitsPrincipalQuotient + (K : Type*) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (pi : Kˣ) + (hpi : LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul pi) = 1) + (n : ℕ) : + Kˣ ⧸ uniformizerPrincipalSubgroup K pi 1 n ≃* + IntegerUnitsPrincipalQuot K n := + (QuotientGroup.quotientMulEquivOfEq + (fieldUnitsToIntegerUnitsPrincipalQuotientHom_ker K pi hpi n).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (fieldUnitsToIntegerUnitsPrincipalQuotientHom K pi hpi n) + (fieldUnitsToIntegerUnitsPrincipalQuotientHom_surjective K pi hpi n)) + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnitTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnitTopology.lean new file mode 100644 index 0000000000..0983075306 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnitTopology.lean @@ -0,0 +1,75 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic +/-! +# The unit subgroup of a nonarchimedean local field + +This module identifies the image of valuation-ring units in the field unit +group with the valuation-one sphere and records that this subgroup is open in +the native topology of a nonarchimedean local field. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace LocalFieldTheory + +open scoped ValuativeRel +open _root_.LocalFieldTheory.IsNonarchimedeanLocalField + +/-- The image of valuation-ring units in the field unit group. -/ +def localBaseUnitSubgroup + (K : Type u) [Field K] [ValuativeRel K] : Subgroup Kˣ := + MonoidHom.range (integerUnitsToFieldUnits K) + +/-- A field unit lies in the image of valuation-ring units exactly when its +valuation is one. -/ +theorem mem_localBaseUnitSubgroup_iff_valuation_eq_one + (K : Type u) [Field K] [ValuativeRel K] (x : Kˣ) : + x ∈ localBaseUnitSubgroup K ↔ ValuativeRel.valuation K (x : K) = 1 := by + constructor + · rintro ⟨a, rfl⟩ + simpa [integerUnitsToFieldUnits] using + (Valuation.Integers.valuation_unit + (Valuation.integer.integers (ValuativeRel.valuation K)) a) + · intro hx + let a : 𝒪[K]ˣ := + { val := ⟨(x : K), by + rw [Valuation.mem_integer_iff] + exact hx.le⟩ + inv := ⟨(x⁻¹ : K), by + rw [Valuation.mem_integer_iff] + simp [hx]⟩ + val_inv := by ext; simp + inv_val := by ext; simp } + exact ⟨a, by ext; rfl⟩ + +/-- The image of valuation-ring units is open in the native topology of a +nonarchimedean local field. -/ +theorem localBaseUnitSubgroup_isOpen + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + IsOpen (localBaseUnitSubgroup K : Set Kˣ) := by + have hsphere : IsOpen {x : K | ValuativeRel.valuation K x = 1} := + by + simpa only [Valuation.restrict_eq_one_iff] using + (ValuativeRel.valuation K).isOpen_sphere one_ne_zero + have hpre := hsphere.preimage (Units.continuous_val : + Continuous (fun x : Kˣ => (x : K))) + rw [show (localBaseUnitSubgroup K : Set Kˣ) = + {x : Kˣ | ValuativeRel.valuation K (x : K) = 1} by + ext x + exact mem_localBaseUnitSubgroup_iff_valuation_eq_one K x] + exact hpre + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean new file mode 100644 index 0000000000..6704268f6a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean @@ -0,0 +1,593 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import Mathlib.FieldTheory.Galois.Basic +public import Mathlib.FieldTheory.Finite.Extension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.HenselLemma + +/-! # Unramified Frobenius -/ + +@[expose] public section +namespace LocalFieldTheory + +/-! +# Actual unramified Frobenius + +The arithmetic Frobenius is first defined as finite-field Frobenius on the +residue extension, then lifted to `Gal(L / K)` through the canonical +residue-action isomorphism for a finite unramified extension. +-/ + +noncomputable +section + +universe u + +open scoped ValuativeRel +open _root_.LocalFieldTheory.IsNonarchimedeanLocalField + +/-- Arithmetic Frobenius of the actual residue-field extension supplied by a +valuation extension. This is finite Galois ramification theory's finite-field Frobenius, +applied to the canonical residue extension `𝓀[L]/𝓀[K]`. -/ +noncomputable def residueExtensionArithmeticFrobeniusOfValuationExtension + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + 𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L] := by + letI := Fintype.ofFinite 𝓀[K] + letI : Algebra.IsAlgebraic 𝓀[K] 𝓀[L] := inferInstance + exact FiniteField.frobeniusAlgEquivOfAlgebraic 𝓀[K] 𝓀[L] + +/-- The arithmetic Frobenius of a finite residue extension raises each residue element to the size +of the base residue field. -/ +theorem residueExtensionArithmeticFrobeniusOfValuationExtension_apply + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (x : 𝓀[L]) : + residueExtensionArithmeticFrobeniusOfValuationExtension K L x = + x ^ Nat.card 𝓀[K] := by + let := Fintype.ofFinite 𝓀[K] + let : Algebra.IsAlgebraic 𝓀[K] 𝓀[L] := inferInstance + change + FiniteField.frobeniusAlgEquivOfAlgebraic 𝓀[K] 𝓀[L] x = + x ^ Nat.card 𝓀[K] + simp [Nat.card_eq_fintype_card] + +/-- Arithmetic Frobenius fixes the image of the base residue field. -/ +theorem residueExtensionArithmeticFrobeniusOfValuationExtension_preserves_base + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + (x : 𝓀[K]) : + residueExtensionArithmeticFrobeniusOfValuationExtension K L + (algebraMap 𝓀[K] 𝓀[L] x) = + algebraMap 𝓀[K] 𝓀[L] x := by + let := Fintype.ofFinite 𝓀[K] + let : Algebra.IsAlgebraic 𝓀[K] 𝓀[L] := inferInstance + simp [residueExtensionArithmeticFrobeniusOfValuationExtension] + +/-- The order of residue arithmetic Frobenius is the degree of the finite residue-field +extension. -/ +theorem orderOf_residueExtensionArithmeticFrobeniusOfValuationExtension + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + orderOf (residueExtensionArithmeticFrobeniusOfValuationExtension K L) = + Module.finrank 𝓀[K] 𝓀[L] := by + let := Fintype.ofFinite 𝓀[K] + let : Algebra.IsAlgebraic 𝓀[K] 𝓀[L] := inferInstance + simpa [residueExtensionArithmeticFrobeniusOfValuationExtension] using + (FiniteField.orderOf_frobeniusAlgEquivOfAlgebraic + (K := 𝓀[K]) (L := 𝓀[L])) + +/-- For an unramified valued extension, residue arithmetic Frobenius has order equal to the +field-extension degree. -/ +theorem orderOf_residueExtensionArithmeticFrobeniusOfUnramifiedValuation + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Algebra K L] + [FiniteDimensional K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + orderOf (residueExtensionArithmeticFrobeniusOfValuationExtension K L) = + Module.finrank K L := by + rw [orderOf_residueExtensionArithmeticFrobeniusOfValuationExtension K L, + LocalFieldTheory.IsNonarchimedeanLocalField.unramifiedValuation_residue_finrank_eq_finrank K L] + +/-- Arithmetic Frobenius generates the automorphism group of a finite residue-field extension. -/ +theorem residueExtensionArithmeticFrobeniusOfValuationExtension_generates + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Algebra K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + ∀ σ : 𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L], + σ ∈ Subgroup.zpowers (residueExtensionArithmeticFrobeniusOfValuationExtension K L) := by + let := Fintype.ofFinite 𝓀[K] + let : Algebra.IsAlgebraic 𝓀[K] 𝓀[L] := inferInstance + intro σ + rcases + (FiniteField.bijective_frobeniusAlgEquivOfAlgebraic_pow + (K := 𝓀[K]) (L := 𝓀[L])).2 σ with + ⟨n, hn⟩ + refine ⟨(n : ℕ), ?_⟩ + rw [← hn] + simp [residueExtensionArithmeticFrobeniusOfValuationExtension] + +/-- Actual arithmetic Frobenius in `Gal(L / K)`, obtained by lifting the residue +finite-field Frobenius through the already constructed unramified residue-action +isomorphism. -/ +noncomputable def arithmeticFrobeniusOfUnramifiedValuation + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + Gal(L/K) := + (galoisGroupEquivResidueAlgEquivOfUnramifiedValuationOfIsIntegralClosure K L).symm + (residueExtensionArithmeticFrobeniusOfValuationExtension K L) + +/-- The unramified Galois-residue equivalence lifts residue arithmetic Frobenius to field arithmetic +Frobenius. -/ +theorem galoisGroupEquivResidueAlgEquivOfUnramifiedValuationOfIsIntegralClosure_arithmeticFrobenius + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + galoisGroupEquivResidueAlgEquivOfUnramifiedValuationOfIsIntegralClosure K L + (arithmeticFrobeniusOfUnramifiedValuation K L) = + residueExtensionArithmeticFrobeniusOfValuationExtension K L := by + simp [arithmeticFrobeniusOfUnramifiedValuation] + +/-- The residue action of field arithmetic Frobenius is residue arithmetic Frobenius. -/ +@[simp] +theorem galoisGroupResidueAlgEquivOfIsIntegralClosure_arithmeticFrobenius + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + galoisGroupResidueAlgEquivOfIsIntegralClosure K L + (arithmeticFrobeniusOfUnramifiedValuation K L) = + residueExtensionArithmeticFrobeniusOfValuationExtension K L := by + simpa [galoisGroupEquivResidueAlgEquivOfUnramifiedValuationOfIsIntegralClosure_apply] + using + galoisGroupEquivResidueAlgEquivOfUnramifiedValuationOfIsIntegralClosure_arithmeticFrobenius + K L + +/-- Field arithmetic Frobenius acts on residues by raising them to the size of the base residue +field. -/ +theorem galoisGroupResidueAlgEquivOfIsIntegralClosure_arithmeticFrobenius_apply + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (x : 𝓀[L]) : + galoisGroupResidueAlgEquivOfIsIntegralClosure K L + (arithmeticFrobeniusOfUnramifiedValuation K L) x = + x ^ Nat.card 𝓀[K] := by + rw [galoisGroupResidueAlgEquivOfIsIntegralClosure_arithmeticFrobenius] + exact residueExtensionArithmeticFrobeniusOfValuationExtension_apply K L x + +/-- Two simple roots over a local domain with the same residue are equal. -/ +theorem eq_of_simple_roots_of_residue_eq + {R : Type*} [CommRing R] [IsDomain R] [IsLocalRing R] + {f : Polynomial R} {a b : R} + (ha : f.IsRoot a) (hb : f.IsRoot b) + (hres : IsLocalRing.residue R b = IsLocalRing.residue R a) + (hderiv : IsUnit (f.derivative.eval a)) : + b = a := by + let q : Polynomial R := f /ₘ (Polynomial.X - Polynomial.C a) + have hfactor : (Polynomial.X - Polynomial.C a) * q = f := by + dsimp [q] + rw [Polynomial.mul_divByMonic_eq_iff_isRoot] + exact ha + have hqEval : q.eval a = f.derivative.eval a := by + simpa [q] using + ValuationTheory.DiscreteValuationField.divByMonic_X_sub_C_eval_eq_derivative_eval f a + have hqUnit : IsUnit (q.eval a) := by + simpa [hqEval] using hderiv + have hqResidue : + IsLocalRing.residue R (q.eval b) = + IsLocalRing.residue R (q.eval a) := by + calc + IsLocalRing.residue R (q.eval b) = + (q.map (IsLocalRing.residue R)).eval + (IsLocalRing.residue R b) := by + exact (Polynomial.eval_map_apply + (f := IsLocalRing.residue R) (p := q) b).symm + _ = (q.map (IsLocalRing.residue R)).eval + (IsLocalRing.residue R a) := by rw [hres] + _ = IsLocalRing.residue R (q.eval a) := by + exact Polynomial.eval_map_apply + (f := IsLocalRing.residue R) (p := q) a + have hqResidueNe : IsLocalRing.residue R (q.eval b) ≠ 0 := by + rw [hqResidue] + exact (IsLocalRing.residue_ne_zero_iff_isUnit (q.eval a)).2 hqUnit + have hqNe : q.eval b ≠ 0 := by + intro hzero + exact hqResidueNe (by rw [hzero, map_zero]) + have hmul : (b - a) * q.eval b = 0 := by + have hbEval : ((Polynomial.X - Polynomial.C a) * q).eval b = 0 := by + rw [hfactor] + exact Polynomial.IsRoot.def.mp hb + simpa [Polynomial.eval_mul, Polynomial.eval_sub] using hbEval + exact sub_eq_zero.mp ((mul_eq_zero.mp hmul).resolve_right hqNe) + +/-- Arithmetic Frobenius sends a primitive root of unity of order prime to the +base residue cardinality to its residue-cardinality power. -/ +theorem arithmeticFrobeniusOfUnramifiedValuation_apply_primitiveRoot + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + {n : Nat} {ζ : L} (hζ : IsPrimitiveRoot ζ n) + (hcoprime : (Nat.card 𝓀[K]).Coprime n) : + arithmeticFrobeniusOfUnramifiedValuation K L ζ = + ζ ^ Nat.card 𝓀[K] := by + classical + let := Fintype.ofFinite 𝓀[K] + obtain ⟨d, hp, hcard⟩ := + FiniteField.card 𝓀[K] (ringChar 𝓀[K]) + have hpCard : ringChar 𝓀[K] ∣ Nat.card 𝓀[K] := by + rw [Nat.card_eq_fintype_card, hcard] + exact dvd_pow_self (ringChar 𝓀[K]) d.ne_zero + have hnChar : ¬ringChar 𝓀[K] ∣ n := + hp.coprime_iff_not_dvd.mp (hcoprime.coprime_dvd_left hpCard) + have hnK : (n : 𝓀[K]) ≠ 0 := by + intro hzero + exact hnChar ((ringChar.spec 𝓀[K] n).mp hzero) + have hnL : (n : 𝓀[L]) ≠ 0 := by + intro hzero + apply hnK + apply (algebraMap 𝓀[K] 𝓀[L]).injective + calc + algebraMap 𝓀[K] 𝓀[L] (n : 𝓀[K]) = (n : 𝓀[L]) := map_natCast _ n + _ = 0 := hzero + _ = algebraMap 𝓀[K] 𝓀[L] 0 := (map_zero _).symm + have hn : n ≠ 0 := by + intro hzero + exact hnK (by simp [hzero]) + have hζIntegral : IsIntegral 𝒪[K] ζ := by + apply IsIntegral.of_pow (Nat.pos_iff_ne_zero.mpr hn) + rw [hζ.pow_eq_one] + exact isIntegral_one + rcases + (IsIntegralClosure.isIntegral_iff + (A := 𝒪[L]) (R := 𝒪[K]) (B := L)).1 hζIntegral with + ⟨a, ha⟩ + change (a : L) = ζ at ha + let φ : Gal(L/K) := + arithmeticFrobeniusOfUnramifiedValuation K L + let b : 𝒪[L] := + galoisGroupIntegerRingEquivOfIsIntegralClosure K L φ a + let c : 𝒪[L] := a ^ Nat.card 𝓀[K] + let f : Polynomial 𝒪[L] := Polynomial.X ^ n - 1 + have haPow : a ^ n = 1 := by + apply 𝒪[L].subtype_injective + change (a : L) ^ n = 1 + rw [ha] + exact hζ.pow_eq_one + have hbPow : b ^ n = 1 := by + have hφa : φ (a : L) ^ n = 1 := by + rw [ha] + simpa using congrArg φ hζ.pow_eq_one + apply 𝒪[L].subtype_injective + simpa [b] using hφa + have hcPow : c ^ n = 1 := by + change (a ^ Nat.card 𝓀[K]) ^ n = 1 + rw [← pow_mul, Nat.mul_comm, pow_mul, haPow, one_pow] + have hbRoot : f.IsRoot b := by + rw [Polynomial.IsRoot.def] + simp [f, hbPow] + have hcRoot : f.IsRoot c := by + rw [Polynomial.IsRoot.def] + simp [f, hcPow] + have hres : + IsLocalRing.residue 𝒪[L] b = + IsLocalRing.residue 𝒪[L] c := by + calc + IsLocalRing.residue 𝒪[L] b = + galoisGroupResidueAlgEquivOfIsIntegralClosure K L φ + (IsLocalRing.residue 𝒪[L] a) := by + exact + (galoisGroupResidueFieldEquivOfIsIntegralClosure_residue + K L φ a).symm + _ = (IsLocalRing.residue 𝒪[L] a) ^ Nat.card 𝓀[K] := by + simpa [φ] using + galoisGroupResidueAlgEquivOfIsIntegralClosure_arithmeticFrobenius_apply + K L (IsLocalRing.residue 𝒪[L] a) + _ = IsLocalRing.residue 𝒪[L] c := by + simp [c] + have hnUnit : IsUnit (n : 𝒪[L]) := by + apply (IsLocalRing.residue_ne_zero_iff_isUnit (n : 𝒪[L])).1 + simpa using hnL + have hcUnit : IsUnit c := + IsUnit.of_pow_eq_one hcPow hn + have hderiv : IsUnit (f.derivative.eval c) := by + simpa [f, Polynomial.derivative_sub, Polynomial.derivative_one, + Polynomial.derivative_X_pow, Polynomial.eval_mul] using + hnUnit.mul (hcUnit.pow (n - 1)) + have hbc : b = c := + eq_of_simple_roots_of_residue_eq hcRoot hbRoot hres hderiv + have hval := congrArg (fun x : 𝒪[L] => (x : L)) hbc + have hval' : + φ (a : L) = (a : L) ^ Nat.card 𝓀[K] := by + simpa [b, c] using hval + change φ ζ = ζ ^ Nat.card 𝓀[K] + calc + φ ζ = φ (a : L) := by rw [ha] + _ = (a : L) ^ Nat.card 𝓀[K] := hval' + _ = ζ ^ Nat.card 𝓀[K] := by rw [ha] + +/-- Arithmetic Frobenius in an unramified Galois extension has order equal to the extension +degree. -/ +theorem orderOf_arithmeticFrobeniusOfUnramifiedValuation + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + orderOf (arithmeticFrobeniusOfUnramifiedValuation K L) = + Module.finrank K L := by + have horder := + (galoisGroupEquivResidueAlgEquivOfUnramifiedValuationOfIsIntegralClosure K L).orderOf_eq + (arithmeticFrobeniusOfUnramifiedValuation K L) + rw [galoisGroupEquivResidueAlgEquivOfUnramifiedValuationOfIsIntegralClosure_arithmeticFrobenius] + at horder + exact horder.symm.trans + (orderOf_residueExtensionArithmeticFrobeniusOfUnramifiedValuation K L) + +/-- Arithmetic Frobenius generates the Galois group of a finite unramified extension. -/ +theorem arithmeticFrobeniusOfUnramifiedValuation_generates + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + ∀ σ : Gal(L/K), + σ ∈ Subgroup.zpowers (arithmeticFrobeniusOfUnramifiedValuation K L) := by + intro σ + let e := galoisGroupEquivResidueAlgEquivOfUnramifiedValuationOfIsIntegralClosure K L + rcases residueExtensionArithmeticFrobeniusOfValuationExtension_generates K L (e σ) with + ⟨i, hi⟩ + refine ⟨i, ?_⟩ + apply e.injective + simpa [e, map_zpow, + galoisGroupEquivResidueAlgEquivOfUnramifiedValuationOfIsIntegralClosure_arithmeticFrobenius] + using hi + +/-- The subgroup of integral powers of arithmetic Frobenius is the full Galois group. -/ +theorem arithmeticFrobeniusOfUnramifiedValuation_zpowers_eq_top + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + Subgroup.zpowers (arithmeticFrobeniusOfUnramifiedValuation K L) = ⊤ := by + ext σ + simp [arithmeticFrobeniusOfUnramifiedValuation_generates K L σ] + +/-- The Galois group of a finite unramified extension is cyclic. -/ +theorem isCyclic_galoisGroup_of_unramifiedValuation + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + IsCyclic Gal(L/K) := by + rw [isCyclic_iff_exists_zpowers_eq_top] + exact ⟨arithmeticFrobeniusOfUnramifiedValuation K L, + arithmeticFrobeniusOfUnramifiedValuation_zpowers_eq_top K L⟩ + +/-- The order of the actual unramified Galois group is the degree. This is the +cardinality consequence of the normalized Frobenius construction: arithmetic +Frobenius has order `[L : K]` and generates `Gal(L/K)`. -/ +theorem galoisGroup_card_eq_finrank_of_unramifiedValuation + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + Nat.card Gal(L/K) = Module.finrank K L := by + have hcard := + orderOf_eq_card_of_zpowers_eq_top + (arithmeticFrobeniusOfUnramifiedValuation_zpowers_eq_top K L) + exact hcard.symm.trans (orderOf_arithmeticFrobeniusOfUnramifiedValuation K L) + +/-- A `ZMod` model of the unramified Galois group obtained from cyclicity and +the order of arithmetic Frobenius. This equivalence does not prescribe which +generator maps to `1`; the normalized model below does. -/ +noncomputable def galoisGroupEquivZModOfUnramifiedValuation + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + Gal(L/K) ≃* Multiplicative (ZMod (Module.finrank K L)) := by + letI : IsCyclic Gal(L/K) := + isCyclic_galoisGroup_of_unramifiedValuation K L + exact (galoisGroup_card_eq_finrank_of_unramifiedValuation K L) ▸ + (zmodCyclicMulEquiv (G := Gal(L/K)) inferInstance).symm + +/-- Internal quotient construction for a specified additive generator. The +public local-field API below supplies `horder` and `hgen` from the already proved +Frobenius source lemmas, so these hypotheses are not exposed as new endpoints. -/ +noncomputable def zmodAddEquivOfGenerator {A : Type*} [AddGroup A] + (g : A) {n : Nat} (horder : addOrderOf g = n) + (hgen : AddSubgroup.zmultiples g = ⊤) : + ZMod n ≃+ A := by + let f : { f : ℤ →+ A // f n = 0 } := + ⟨zmultiplesHom A g, by + rw [← horder] + simp [zmultiplesHom_apply]⟩ + refine AddEquiv.ofBijective (ZMod.lift n f) ⟨?_, ?_⟩ + · rw [ZMod.lift_injective] + intro m hm + rw [ZMod.intCast_zmod_eq_zero_iff_dvd] + rw [show f.1 m = (m : ℤ) • g by rfl] at hm + rw [← horder] + exact (addOrderOf_dvd_iff_zsmul_eq_zero (x := g)).mpr hm + · intro x + have hx : x ∈ AddSubgroup.zmultiples g := by + rw [hgen] + exact AddSubgroup.mem_top x + rcases hx with ⟨i, hi⟩ + exact ⟨(i : ZMod n), by simpa [f, ZMod.lift_coe] using hi⟩ + +private theorem zmodAddEquivOfGenerator_apply_one {A : Type*} [AddGroup A] + (g : A) {n : Nat} (horder : addOrderOf g = n) + (hgen : AddSubgroup.zmultiples g = ⊤) : + zmodAddEquivOfGenerator g horder hgen (1 : ZMod n) = g := by + unfold zmodAddEquivOfGenerator + dsimp [AddEquiv.ofBijective, Equiv.ofBijective] + let f : { f : ℤ →+ A // f n = 0 } := + ⟨zmultiplesHom A g, by + rw [← horder] + simp [zmultiplesHom_apply]⟩ + change (ZMod.lift n f) (1 : ZMod n) = g + have hcast : Int.castAddHom (ZMod n) (1 : ℤ) = (1 : ZMod n) := by + simp [Int.castAddHom] + rw [← hcast, ZMod.lift_castAddHom] + simp [f, zmultiplesHom_apply] + +private lemma additive_zmultiples_eq_top_of_zpowers_eq_top {G : Type*} [Group G] + (g : G) (hgen : Subgroup.zpowers g = ⊤) : + AddSubgroup.zmultiples (Additive.ofMul g) = ⊤ := by + ext x + constructor + · intro _ + exact AddSubgroup.mem_top x + · intro _ + change x ∈ (AddSubgroup.zmultiples (Additive.ofMul g) : Set (Additive G)) + rw [← ofMul_image_zpowers_eq_zmultiples_ofMul] + refine ⟨Additive.toMul x, ?_, rfl⟩ + rw [hgen] + exact Subgroup.mem_top (Additive.toMul x) + +/-- Identify a cyclic group generated by an element of order `n` with multiplicative `ZMod n`. -/ +noncomputable def zmodCyclicMulEquivOfGenerator {G : Type*} [Group G] + (g : G) {n : Nat} (horder : orderOf g = n) + (hgen : Subgroup.zpowers g = ⊤) : + Multiplicative (ZMod n) ≃* G := + AddEquiv.toMultiplicative <| + zmodAddEquivOfGenerator (Additive.ofMul g) + (by simpa [addOrderOf_ofMul_eq_orderOf] using horder) + (by exact additive_zmultiples_eq_top_of_zpowers_eq_top g hgen) + +private theorem zmodCyclicMulEquivOfGenerator_apply_one {G : Type*} [Group G] + (g : G) {n : Nat} (horder : orderOf g = n) + (hgen : Subgroup.zpowers g = ⊤) : + zmodCyclicMulEquivOfGenerator g horder hgen + (Multiplicative.ofAdd (1 : ZMod n)) = g := by + unfold zmodCyclicMulEquivOfGenerator + change Additive.toMul + (zmodAddEquivOfGenerator (Additive.ofMul g) + (by simpa [addOrderOf_ofMul_eq_orderOf] using horder) + (by exact additive_zmultiples_eq_top_of_zpowers_eq_top g hgen) (1 : ZMod n)) = g + rw [zmodAddEquivOfGenerator_apply_one] + rfl + +/-- The generator-normalized ZMod model of the actual unramified Galois group. +Unlike `galoisGroupEquivZModOfUnramifiedValuation`, this quotient construction uses +the specified arithmetic Frobenius as the generator, following the normalized Frobenius + construction before the uniformizer/Frobenius calculation. -/ +noncomputable def galoisGroupEquivZModOfUnramifiedValuationNormalized + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + Gal(L/K) ≃* Multiplicative (ZMod (Module.finrank K L)) := + (zmodCyclicMulEquivOfGenerator + (arithmeticFrobeniusOfUnramifiedValuation K L) + (orderOf_arithmeticFrobeniusOfUnramifiedValuation K L) + (arithmeticFrobeniusOfUnramifiedValuation_zpowers_eq_top K L)).symm + +/-- The normalized equivalence from the unramified Galois group to `ZMod` sends arithmetic Frobenius +to one. -/ +@[simp] +theorem galoisGroupEquivZModOfUnramifiedValuationNormalized_arithmeticFrobenius + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + galoisGroupEquivZModOfUnramifiedValuationNormalized K L + (arithmeticFrobeniusOfUnramifiedValuation K L) = + Multiplicative.ofAdd (1 : ZMod (Module.finrank K L)) := by + let e := + zmodCyclicMulEquivOfGenerator + (arithmeticFrobeniusOfUnramifiedValuation K L) + (orderOf_arithmeticFrobeniusOfUnramifiedValuation K L) + (arithmeticFrobeniusOfUnramifiedValuation_zpowers_eq_top K L) + change e.symm (arithmeticFrobeniusOfUnramifiedValuation K L) = + Multiplicative.ofAdd (1 : ZMod (Module.finrank K L)) + rw [← zmodCyclicMulEquivOfGenerator_apply_one + (arithmeticFrobeniusOfUnramifiedValuation K L) + (orderOf_arithmeticFrobeniusOfUnramifiedValuation K L) + (arithmeticFrobeniusOfUnramifiedValuation_zpowers_eq_top K L)] + exact e.symm_apply_apply _ + +/-- Power form of the generator-normalized Frobenius model. This is the +Frobenius-side model used before composing with the +valuation quotient. -/ +@[simp] +theorem galoisGroupEquivZModOfUnramifiedValuationNormalized_arithmeticFrobenius_zpow + (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] + [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] (m : Int) : + galoisGroupEquivZModOfUnramifiedValuationNormalized K L + ((arithmeticFrobeniusOfUnramifiedValuation K L) ^ m) = + Multiplicative.ofAdd (m : ZMod (Module.finrank K L)) := by + rw [map_zpow, galoisGroupEquivZModOfUnramifiedValuationNormalized_arithmeticFrobenius] + rw [← ofAdd_zsmul] + simp [zsmul_eq_mul] + +end +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Valuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Valuation.lean new file mode 100644 index 0000000000..603adccc5b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Valuation.lean @@ -0,0 +1,80 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNorm +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Norm +/-! +# Integer-valued valuations + +Relates membership in the valuation ring to the ambient valuation and exposes +the associated surjective multiplicative valuation with a uniformizer. +-/ + +@[expose] public section +namespace LocalFieldTheory + +noncomputable +section + +universe u + +namespace IsNonarchimedeanLocalField + +open DiscreteValuationField +open scoped ValuativeRel + +/-- An element belongs to the valuation ring exactly when its valuation is at most one. -/ +theorem valuation_integer_membership + (K : Type u) [Field K] [ValuativeRel K] (x : K) : + x ∈ 𝒪[K] ↔ ValuativeRel.valuation K x ≤ 1 := + (Valuation.mem_integer_iff (ValuativeRel.valuation K) x).symm + +/-- The normalized integer valuation, packaged as the +`MultiplicativeIntegerValuation` used by the value-group layer. -/ +def multiplicativeIntegerValuation + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + MultiplicativeIntegerValuation Kˣ where + val x := LocalFieldTheory.IsNonarchimedeanLocalField.v K (Additive.ofMul x) + map_one := by + exact LocalFieldTheory.IsNonarchimedeanLocalField.v_one K + map_mul x y := by + exact LocalFieldTheory.IsNonarchimedeanLocalField.v_mul K x y + +/-- The multiplicative integer valuation records the additive integer exponent of the original +valuation. -/ +@[simp] theorem multiplicativeIntegerValuation_val + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] (x : Kˣ) : + (multiplicativeIntegerValuation K).val x = + LocalFieldTheory.IsNonarchimedeanLocalField.v K (Additive.ofMul x) := + rfl + +/-- The normalized integer valuation is onto `ℤ`. -/ +theorem multiplicativeIntegerValuation_surjective + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + Function.Surjective (multiplicativeIntegerValuation K).val := by + intro n + rcases LocalFieldTheory.IsNonarchimedeanLocalField.v_surjective K n with ⟨x, hx⟩ + refine ⟨Additive.toMul x, ?_⟩ + simpa [multiplicativeIntegerValuation] using hx + +/-- A nonarchimedean local field has a multiplicative element of normalized value one +for the value-group API. -/ +theorem multiplicativeIntegerValuation_exists_uniformizer + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + ∃ ϖ : Kˣ, (multiplicativeIntegerValuation K).IsUniformizer ϖ := + (multiplicativeIntegerValuation K).exists_uniformizer_of_surjective + (multiplicativeIntegerValuation_surjective K) + +end IsNonarchimedeanLocalField + +end +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuationExactSequence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuationExactSequence.lean new file mode 100644 index 0000000000..392dbc887a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuationExactSequence.lean @@ -0,0 +1,481 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Valuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +public import Mathlib.Algebra.Group.Hom.Basic +public import Mathlib.Algebra.Group.Subgroup.Basic +/-! +# The valuation exact sequence + +Builds the normalized valuation map `Kˣ → ℤ` and proves exactness of the +sequence from valuation-ring units through field units to `ℤ`. +-/ + +@[expose] public section + +namespace LocalFieldTheory + +noncomputable +section + +universe u + +namespace IsNonarchimedeanLocalField + +open scoped ValuativeRel WithZero + +/-- The multiplicative normalized valuation on field units. -/ +noncomputable def valuationUnitsMulHom + (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : Kˣ →* Multiplicative Int := + (@WithZero.unitsWithZeroEquiv (Multiplicative Int) _).toMonoidHom.comp + ((Units.map (_root_.IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K).toMonoidHom).comp + (Units.map (ValuativeRel.valuation K).toMonoidWithZeroHom.toMonoidHom)) + +/-- The actual normalized valuation map on field units, bundled as an additive hom. -/ +noncomputable def valuationMap (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] : Additive Kˣ →+ Int := + MonoidHom.toAdditive (valuationUnitsMulHom K) + +/-- Defines `valuationShortComplex`. -/ +def valuationShortComplex (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] : Additive Kˣ →+ Int := + valuationMap K + +/-- The additive valuation map evaluates a field unit by applying the normalized integer valuation. +The additive valuation map evaluates a field unit by applying the normalized integer valuation. -/ +@[simp] +theorem valuationMap_apply (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (x : Additive Kˣ) : + valuationMap K x = v K x := + rfl + +/-- Every integer is the valuation of some field unit. -/ +theorem valuationMap_surjective (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] : + Function.Surjective (valuationMap K) := + v_surjective K + +/-- A chosen normalized uniformizer maps to one under the additive valuation map. -/ +theorem valuationMap_uniformiser (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] : + ∃ ϖ : Kˣ, valuationMap K (Additive.ofMul ϖ) = 1 := + v_uniformiser K + +/-- A valuation-theoretic uniformizer, regarded as a unit of the ambient +field. The nonzero proof is supplied by the actual uniformizer property. -/ +noncomputable def uniformizerFieldUnit + (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (π : 𝒪[K]) + (hπ : (ValuativeRel.valuation K).IsUniformizer (π : K)) : + Kˣ := + Units.mk0 (π : K) hπ.ne_zero + +/-- Coercing the field unit attached to a valuation-theoretic uniformizer +recovers the original field element. -/ +@[simp] +theorem uniformizerFieldUnit_coe + (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (π : 𝒪[K]) + (hπ : (ValuativeRel.valuation K).IsUniformizer (π : K)) : + (uniformizerFieldUnit K π hπ : K) = (π : K) := + rfl + +/-- A valuation-theoretic uniformizer has normalized additive value `-1` +in the inverse-standard convention used by the concrete local Artin map. -/ +theorem valuationMap_uniformizerFieldUnit + (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (π : 𝒪[K]) + (hπ : (ValuativeRel.valuation K).IsUniformizer (π : K)) : + valuationMap K + (Additive.ofMul (uniformizerFieldUnit K π hπ)) = + -1 := by + have hπIrreducible : Irreducible π := + (IsDiscreteValuationRing.irreducible_iff_uniformizer π).2 + (Valuation.IsUniformizer.is_generator + (v := ValuativeRel.valuation K) hπ) + simpa [valuationMap_apply] using + (v_integerRingIrreducibleFieldUnit K π hπIrreducible + (uniformizerFieldUnit K π hπ) rfl) + + +/-- The additive valuation map sends the zero element of the additive unit group to zero. -/ +theorem valuationMap_zero (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] : + valuationMap K (0 : Additive Kˣ) = 0 := + map_zero (valuationMap K) + +/-- The additive valuation map sends addition of additive field units to addition of integers. -/ +theorem valuationMap_add (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (x y : Additive Kˣ) : + valuationMap K (x + y) = valuationMap K x + valuationMap K y := + map_add (valuationMap K) x y + +/-- The additive valuation map sends additive negation to integer negation. -/ +theorem valuationMap_neg (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (x : Additive Kˣ) : + valuationMap K (-x) = -valuationMap K x := + map_neg (valuationMap K) x + +/-- The additive valuation map sends subtraction to subtraction of valuations. -/ +theorem valuationMap_sub (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (x y : Additive Kˣ) : + valuationMap K (x - y) = valuationMap K x - valuationMap K y := + map_sub (valuationMap K) x y + +/-- The additive valuation map commutes with integral scalar multiplication. -/ +theorem valuationMap_zsmul (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (n : Int) (x : Additive Kˣ) : + valuationMap K (n • x) = n • valuationMap K x := + map_zsmul (valuationMap K) n x + +/-- An additive field unit maps to zero exactly when its normalized valuation is zero. -/ +theorem valuationMap_eq_zero_iff_v_eq_zero (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (x : Additive Kˣ) : + valuationMap K x = 0 ↔ v K x = 0 := by + rw [valuationMap_apply] + +/-- The kernel of the additive valuation map consists precisely of units of normalized valuation +zero. -/ +theorem valuationMap_mem_ker_iff (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (x : Additive Kˣ) : + x ∈ AddMonoidHom.ker (valuationMap K) ↔ v K x = 0 := by + rw [AddMonoidHom.mem_ker, valuationMap_apply] + +/-- The multiplicative identity, viewed additively, has valuation zero. -/ +theorem valuationMap_ofMul_one (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] : + valuationMap K (Additive.ofMul (1 : Kˣ)) = 0 := by + change valuationMap K (0 : Additive Kˣ) = 0 + exact valuationMap_zero K + +/-- The valuation of a product of field units is the sum of their valuations. -/ +theorem valuationMap_ofMul_mul (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (x y : Kˣ) : + valuationMap K (Additive.ofMul (x * y)) = + valuationMap K (Additive.ofMul x) + valuationMap K (Additive.ofMul y) := by + change v K (Additive.ofMul (x * y)) = + v K (Additive.ofMul x) + v K (Additive.ofMul y) + exact v_mul K x y + +/-- The valuation of an inverse field unit is the negative of its valuation. -/ +theorem valuationMap_ofMul_inv (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (x : Kˣ) : + valuationMap K (Additive.ofMul x⁻¹) = + -valuationMap K (Additive.ofMul x) := by + change v K (Additive.ofMul x⁻¹) = -v K (Additive.ofMul x) + exact v_inv K x + +/-- A field unit with additive valuation zero has multiplicative valuation one. -/ +theorem valuation_eq_one_of_valuationMap_eq_zero (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + {x : Kˣ} (hx : valuationMap K (Additive.ofMul x) = 0) : + ValuativeRel.valuation K (x : K) = 1 := by + rw [valuationMap_apply] at hx + dsimp [v] at hx + have hunzero : + WithZero.unzero + (x := (_root_.IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K) + (ValuativeRel.valuation K (x : K))) + (by simp) = (1 : Multiplicative Int) := by + have h := congrArg Multiplicative.ofAdd hx + simpa using h + apply (_root_.IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K).injective + have hcoe : + ((WithZero.unzero + (x := (_root_.IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K) + (ValuativeRel.valuation K (x : K))) + (by simp) : Multiplicative Int) : WithZero (Multiplicative Int)) = + (1 : WithZero (Multiplicative Int)) := by + simpa using congrArg + (fun y : Multiplicative Int => (y : WithZero (Multiplicative Int))) hunzero + rw [WithZero.coe_unzero] at hcoe + simpa using hcoe + +/-- The valuation of a quotient of field units is the difference of their valuations. -/ +theorem valuationMap_ofMul_div (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (x y : Kˣ) : + valuationMap K (Additive.ofMul (x / y)) = + valuationMap K (Additive.ofMul x) - valuationMap K (Additive.ofMul y) := by + change v K (Additive.ofMul (x / y)) = v K (Additive.ofMul x) - v K (Additive.ofMul y) + exact v_div K x y + +/-- The valuation of an integral power is the exponent times the original valuation. -/ +theorem valuationMap_ofMul_zpow (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (x : Kˣ) (n : Int) : + valuationMap K (Additive.ofMul (x ^ n)) = + n * valuationMap K (Additive.ofMul x) := by + change v K (Additive.ofMul (x ^ n)) = n * v K (Additive.ofMul x) + exact v_zpow K x n + +/-- The valuation of a natural power is the power times the original valuation. -/ +theorem valuationMap_ofMul_pow (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (x : Kˣ) (n : Nat) : + valuationMap K (Additive.ofMul (x ^ n)) = + (n : Int) * valuationMap K (Additive.ofMul x) := by + change v K (Additive.ofMul (x ^ n)) = (n : Int) * v K (Additive.ofMul x) + exact v_pow K x n + +/-- A field unit has additive valuation zero exactly when its multiplicative valuation is one. -/ +theorem valuationMap_ofMul_eq_zero_iff (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (x : Kˣ) : + valuationMap K (Additive.ofMul x) = 0 ↔ v K (Additive.ofMul x) = 0 := + valuationMap_eq_zero_iff_v_eq_zero K (Additive.ofMul x) + +/-- Defines `additiveIntegerUnitsToFieldUnits`. -/ +def additiveIntegerUnitsToFieldUnits (K : Type u) [Field K] [ValuativeRel K] : + Additive 𝒪[K]ˣ →+ Additive Kˣ := + MonoidHom.toAdditive (integerUnitsToFieldUnits K) + +/-- The additive inclusion of valuation-ring units agrees with the underlying multiplicative +inclusion. -/ +@[simp] +theorem additiveIntegerUnitsToFieldUnits_apply (K : Type u) [Field K] [ValuativeRel K] + (u : 𝒪[K]ˣ) : + additiveIntegerUnitsToFieldUnits K (Additive.ofMul u) = + Additive.ofMul (integerUnitsToFieldUnits K u) := + rfl + +/-- Defines `integerUnitOfValuationMapZero`. -/ +def integerUnitOfValuationMapZero (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (x : Kˣ) (hx : valuationMap K (Additive.ofMul x) = 0) : 𝒪[K]ˣ where + val := ⟨(x : K), by + rw [valuation_integer_membership] + have hv := valuation_eq_one_of_valuationMap_eq_zero K hx + simp [hv]⟩ + inv := ⟨(x⁻¹ : K), by + rw [valuation_integer_membership] + have hv := valuation_eq_one_of_valuationMap_eq_zero K hx + simp [hv]⟩ + val_inv := by + ext + simp + inv_val := by + ext + simp + +/-- The valuation-ring unit reconstructed from a field unit of valuation zero maps back to that +field unit. -/ +@[simp] +theorem integerUnitOfValuationMapZero_spec (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (x : Kˣ) (hx : valuationMap K (Additive.ofMul x) = 0) : + integerUnitsToFieldUnits K (integerUnitOfValuationMapZero K x hx) = x := by + ext + rfl + +/-- A field unit comes from a valuation-ring unit exactly when its additive valuation is zero. -/ +theorem integerUnitsToFieldUnits_mem_range_iff_valuationMap_eq_zero (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (x : Kˣ) : + x ∈ MonoidHom.range (integerUnitsToFieldUnits K) ↔ + valuationMap K (Additive.ofMul x) = 0 := by + constructor + · rintro ⟨u, rfl⟩ + rw [valuationMap_apply] + exact v_integerUnitsToFieldUnits K u + · intro hx + exact ⟨integerUnitOfValuationMapZero K x hx, + integerUnitOfValuationMapZero_spec K x hx⟩ + +/-- A valuation-integer unit is an `n`-th power among integer units exactly +when it is an `n`-th power among field units. -/ +theorem mem_powMonoidHom_range_integerUnits_iff (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (n : ℕ+) (x : 𝒪[K]ˣ) : + x ∈ (powMonoidHom (n : ℕ) : 𝒪[K]ˣ →* 𝒪[K]ˣ).range ↔ + integerUnitsToFieldUnits K x ∈ + (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range := by + constructor + · intro hx + obtain ⟨y, hy⟩ := + (MonoidHom.mem_range + (G := 𝒪[K]ˣ)).mp hx + rw [powMonoidHom_apply] at hy + apply + (MonoidHom.mem_range + (G := Kˣ)).mpr + refine ⟨integerUnitsToFieldUnits K y, ?_⟩ + rw [powMonoidHom_apply, ← map_pow, hy] + · intro hx + obtain ⟨y, hy⟩ := + (MonoidHom.mem_range + (G := Kˣ)).mp hx + rw [powMonoidHom_apply] at hy + have hyValPow : + valuationMap K (Additive.ofMul (y ^ (n : ℕ))) = 0 := by + rw [hy, valuationMap_apply] + exact v_integerUnitsToFieldUnits K x + rw [valuationMap_ofMul_pow] at hyValPow + have hyVal : + valuationMap K (Additive.ofMul y) = 0 := + (mul_eq_zero.mp hyValPow).resolve_left + (Int.ofNat_ne_zero.mpr n.ne_zero) + let z : 𝒪[K]ˣ := + integerUnitOfValuationMapZero K y hyVal + apply + (MonoidHom.mem_range + (G := 𝒪[K]ˣ)).mpr + refine ⟨z, ?_⟩ + apply integerUnitsToFieldUnits_injective K + rw [powMonoidHom_apply, map_pow, + integerUnitOfValuationMapZero_spec, hy] + +/-- The image of valuation-ring units inside field units is exactly the kernel of the additive +valuation map. -/ +theorem additiveIntegerUnitsToFieldUnits_range_eq_ker_valuationMap (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] : + AddMonoidHom.range (additiveIntegerUnitsToFieldUnits K) = + AddMonoidHom.ker (valuationMap K) := by + ext x + constructor + · rintro ⟨u, rfl⟩ + change valuationMap K + (Additive.ofMul (integerUnitsToFieldUnits K (Additive.toMul u))) = 0 + rw [valuationMap_apply] + exact v_integerUnitsToFieldUnits K (Additive.toMul u) + · intro hx + rw [AddMonoidHom.mem_ker] at hx + refine ⟨Additive.ofMul + (integerUnitOfValuationMapZero K (Additive.toMul x) ?_), ?_⟩ + · simpa using hx + · simp [additiveIntegerUnitsToFieldUnits] + +/-- Additive quotient form of the local valuation sequence: `Kˣ / 𝒪[K]ˣ ≃ ℤ`. -/ +noncomputable def fieldUnitsModIntegerUnitsAddEquivInt (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] : + Additive Kˣ ⧸ AddMonoidHom.range (additiveIntegerUnitsToFieldUnits K) ≃+ Int := + (QuotientAddGroup.quotientAddEquivOfEq + (additiveIntegerUnitsToFieldUnits_range_eq_ker_valuationMap K)).trans + (QuotientAddGroup.quotientKerEquivOfSurjective + (valuationMap K) (valuationMap_surjective K)) + +/-- The quotient of field units by valuation-ring units sends the class of a unit to its integer +valuation. -/ +@[simp] +theorem fieldUnitsModIntegerUnitsAddEquivInt_mk (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (x : Additive Kˣ) : + fieldUnitsModIntegerUnitsAddEquivInt K (QuotientAddGroup.mk x) = + valuationMap K x := by + simp only [fieldUnitsModIntegerUnitsAddEquivInt, AddEquiv.trans_apply, + QuotientAddGroup.quotientAddEquivOfEq_mk] + rw [QuotientAddGroup.quotientKerEquivOfSurjective, + QuotientAddGroup.quotientKerEquivOfRightInverse_apply, + QuotientAddGroup.kerLift_mk] + +/-- A field-unit quotient class maps to zero exactly when its representative is a valuation-ring +unit. -/ +theorem fieldUnitsModIntegerUnitsAddEquivInt_mk_eq_zero_iff (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (x : Additive Kˣ) : + fieldUnitsModIntegerUnitsAddEquivInt K (QuotientAddGroup.mk x) = 0 ↔ + valuationMap K x = 0 := by + rw [fieldUnitsModIntegerUnitsAddEquivInt_mk] + +/-- Two field units define the same class modulo valuation-ring units exactly when they have equal +valuation. -/ +theorem fieldUnitsModIntegerUnitsAddEquivInt_mk_eq_mk_iff (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (x y : Additive Kˣ) : + (QuotientAddGroup.mk x : + Additive Kˣ ⧸ AddMonoidHom.range (additiveIntegerUnitsToFieldUnits K)) = + QuotientAddGroup.mk y ↔ valuationMap K x = valuationMap K y := by + constructor + · intro h + simpa [fieldUnitsModIntegerUnitsAddEquivInt_mk] using + congrArg (fieldUnitsModIntegerUnitsAddEquivInt K) h + · intro h + apply (fieldUnitsModIntegerUnitsAddEquivInt K).injective + simpa [fieldUnitsModIntegerUnitsAddEquivInt_mk] using h + +/-- The difference of two quotient classes vanishes exactly when the representatives have equal +valuation. -/ +theorem fieldUnitsModIntegerUnitsAddEquivInt_mk_sub_eq_zero_iff (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (x y : Additive Kˣ) : + fieldUnitsModIntegerUnitsAddEquivInt K (QuotientAddGroup.mk (x - y)) = 0 ↔ + valuationMap K x = valuationMap K y := by + rw [fieldUnitsModIntegerUnitsAddEquivInt_mk, map_sub, sub_eq_zero] + +/-- The quotient of a field unit by the corresponding power of a uniformizer has +normalized valuation zero. -/ +theorem uniformizerUnitFactorValuationZero (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (ϖ x : Kˣ) (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) : + valuationMap K + (Additive.ofMul (x / ϖ ^ valuationMap K (Additive.ofMul x))) = 0 := by + rw [valuationMap_ofMul_div, valuationMap_ofMul_zpow, hϖ, mul_one, sub_self] + +/-- The integer-unit factor in the standard decomposition `x = u * ϖ ^ v(x)`. -/ +noncomputable def uniformizerUnitFactor (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (ϖ : Kˣ) (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) + (x : Kˣ) : 𝒪[K]ˣ := + integerUnitOfValuationMapZero K + (x / ϖ ^ valuationMap K (Additive.ofMul x)) + (uniformizerUnitFactorValuationZero K ϖ x hϖ) + +/-- Removing the uniformizer power prescribed by a field unit's valuation leaves a valuation-ring +unit. -/ +@[simp] +theorem integerUnitsToFieldUnits_uniformizerUnitFactor (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (ϖ : Kˣ) (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) (x : Kˣ) : + integerUnitsToFieldUnits K (uniformizerUnitFactor K ϖ hϖ x) = + x / ϖ ^ valuationMap K (Additive.ofMul x) := + integerUnitOfValuationMapZero_spec K + (x / ϖ ^ valuationMap K (Additive.ofMul x)) + (uniformizerUnitFactorValuationZero K ϖ x hϖ) + +/-- Standard local-field unit/uniformizer decomposition in multiplicative form. -/ +theorem uniformizerUnitFactor_mul_uniformizer_zpow (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (ϖ : Kˣ) (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) (x : Kˣ) : + integerUnitsToFieldUnits K (uniformizerUnitFactor K ϖ hϖ x) * + ϖ ^ valuationMap K (Additive.ofMul x) = x := by + rw [integerUnitsToFieldUnits_uniformizerUnitFactor] + simp [div_eq_mul_inv, mul_assoc] + +/-- Existence form of the standard decomposition `Kˣ = O_Kˣ · ⟨ϖ⟩`. -/ +theorem exists_integerUnit_mul_uniformizer_zpow (K : Type u) + [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] + (ϖ : Kˣ) (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) (x : Kˣ) : + ∃ u : 𝒪[K]ˣ, + integerUnitsToFieldUnits K u * + ϖ ^ valuationMap K (Additive.ofMul x) = x := + ⟨uniformizerUnitFactor K ϖ hϖ x, + uniformizerUnitFactor_mul_uniformizer_zpow K ϖ hϖ x⟩ + +/-- The chosen preimage operation for the valuation map has the requested integer valuation. -/ +theorem valuationMap_surjective_apply (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (n : Int) : + ∃ x : Additive Kˣ, valuationMap K x = n := + valuationMap_surjective K n + +/-- Defines `chosenValuationMapSection`. -/ +noncomputable def chosenValuationMapSection (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] : Int → Additive Kˣ := + fun n => Classical.choose (valuationMap_surjective_apply K n) + +/-- The chosen section of the additive valuation map is a right inverse. -/ +theorem chosenValuationMapSection_spec (K : Type u) [Field K] [ValuativeRel K] + [TopologicalSpace K] [IsNonarchimedeanLocalField K] (n : Int) : + valuationMap K (chosenValuationMapSection K n) = n := + Classical.choose_spec (valuationMap_surjective_apply K n) + +end IsNonarchimedeanLocalField + +end +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuativeExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuativeExtension.lean new file mode 100644 index 0000000000..6f87bc6697 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuativeExtension.lean @@ -0,0 +1,84 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RingTheory.IntegralClosure.IsIntegralClosure.Basic +public import Mathlib.RingTheory.Valuation.Extension +public import Mathlib.Topology.Algebra.Valued.ValuativeRel +/-! +# Valuative extensions + +Records when the valuation ring of an extension field is integral over the +base valuation ring, the hypothesis needed to restrict field norms integrally. +-/ + +@[expose] public section +namespace Valuation + +/-- A nontrivial valuation stays nontrivial after passing to any valuation +which extends it along an algebra map. -/ +theorem IsNontrivial.of_hasExtension + {R A ΓR ΓA : Type*} + [CommRing R] [Ring A] + [LinearOrderedCommMonoidWithZero ΓR] + [LinearOrderedCommMonoidWithZero ΓA] + [Algebra R A] + (vR : Valuation R ΓR) (vA : Valuation A ΓA) + [vR.IsNontrivial] [vR.HasExtension vA] : + vA.IsNontrivial := { + exists_val_nontrivial := by + rcases Valuation.IsNontrivial.exists_val_nontrivial + (v := vR) with ⟨x, hx0, hx1⟩ + refine ⟨algebraMap R A x, ?_, ?_⟩ + · intro h + have hm : + vA (algebraMap R A x) = + vA (algebraMap R A 0) := by + simpa using h + exact hx0 (by + simpa using + ((HasExtension.val_map_eq_iff vR vA x 0).1 hm)) + · intro h + have hm : + vA (algebraMap R A x) = + vA (algebraMap R A 1) := by + simpa using h + exact hx1 (by + simpa using + ((HasExtension.val_map_eq_iff vR vA x 1).1 hm)) } + +end Valuation + +namespace LocalFieldTheory + +noncomputable +section + +universe u v + +open scoped ValuativeRel + +/-- A valued extension whose valuation integer ring in `L` is integral over the base integer ring. + +This is the algebraic input used to restrict field norms to valuation integer rings. -/ +class ValuativeExtension (K : Type u) (L : Type v) [Field K] [ValuativeRel K] + [Field L] [ValuativeRel L] [Algebra K L] : Prop where + /-- Every target valuation integer is integral over the base valuation + integers. -/ + integer_isIntegral : ∀ x : 𝒪[L], IsIntegral 𝒪[K] (x : L) + +/-- An integral-closure identification of valuation rings makes the target valuation an extension of +the base valuation. -/ +instance valuativeExtensionOfIsIntegralClosure + (K : Type u) (L : Type v) [Field K] [ValuativeRel K] + [Field L] [ValuativeRel L] [Algebra K L] [IsIntegralClosure 𝒪[L] 𝒪[K] L] : + ValuativeExtension K L where + integer_isIntegral x := + (IsIntegralClosure.isIntegral_iff (A := 𝒪[L]) (R := 𝒪[K]) (B := L)).2 ⟨x, rfl⟩ + +end +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuedTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuedTopology.lean new file mode 100644 index 0000000000..7bffc387df --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuedTopology.lean @@ -0,0 +1,72 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Topology.Algebra.Valued.ValuativeRel +/-! +# Valued-field topology and the induced valuative relation + +This file records the topology bridge used when a nonarchimedean norm is +turned into a `ValuativeRel`: the topology already carried by a nontrivially +valued field is the valuative topology for that induced relation. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalFieldTheory + +open scoped ValuativeRel + +universe u v + +/-- The topology of a nontrivially valued field is valuative for the +valuative relation induced by its distinguished valuation. -/ +theorem isValuativeTopology_of_valued_ofValuation + (F : Type u) (Γ : Type v) + [Field F] [LinearOrderedCommGroupWithZero Γ] + [Valued F Γ] + [Valuation.IsNontrivial (Valued.v : Valuation F Γ)] : + letI := ValuativeRel.ofValuation (Valued.v : Valuation F Γ) + IsValuativeTopology F := by + let v : Valuation F Γ := Valued.v + let : ValuativeRel F := ValuativeRel.ofValuation v + let : v.Compatible := Valuation.Compatible.ofValuation v + let : ValuativeRel.IsNontrivial F := + (ValuativeRel.isNontrivial_iff_isNontrivial v).2 inferInstance + apply IsValuativeTopology.of_zero + intro s + rw [Valued.mem_nhds_zero] + constructor + · rintro ⟨δ, hδ⟩ + refine + ⟨δ.mapEquiv + (ValuativeRel.ValueGroupWithZero.orderMonoidIso v).symm, ?_⟩ + intro z hz + apply hδ + exact + (ValuativeRel.valuation_lt_symm_orderMonoidIso + v (δ : MonoidWithZeroHom.ValueGroup₀ (.ofClass v)) z).1 + (by simpa using hz) + · rintro ⟨γ, hγ⟩ + refine + ⟨γ.mapEquiv + (ValuativeRel.ValueGroupWithZero.orderMonoidIso v), ?_⟩ + intro z hz + apply hγ + have hz' : + v.restrict z < + (ValuativeRel.ValueGroupWithZero.orderMonoidIso v) + (γ : ValuativeRel.ValueGroupWithZero F) := by + exact hz + exact + (ValuativeRel.restrict_lt_orderMonoidIso + v (γ : ValuativeRel.ValueGroupWithZero F) z).1 hz' + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NormUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NormUnits.lean new file mode 100644 index 0000000000..33c667b6c7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NormUnits.lean @@ -0,0 +1,52 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RingTheory.Norm.Transitivity + +/-! +# Field norms on unit groups + +This file provides the common algebraic norm map on unit groups. It is +independent of any valuation or local-field structure, so valued-field and +discrete-valuation APIs can share the same definition. +-/ + +@[expose] public section +namespace LocalFieldTheory + +noncomputable +section + +universe u v w + +variable (K : Type u) (L : Type v) +variable [Field K] [Field L] [Algebra K L] + +/-- The algebra norm, restricted to unit groups. -/ +def normUnits : Lˣ →* Kˣ := + Units.map (Algebra.norm K) + +/-- The underlying field element of a unit norm is the algebra norm. -/ +@[simp] +theorem normUnits_apply_coe (x : Lˣ) : + ((normUnits K L x : Kˣ) : K) = Algebra.norm K (x : L) := + rfl + +/-- Field norms on unit groups are transitive in a tower. -/ +theorem normUnits_tower + (K : Type u) (M : Type v) (L : Type w) + [Field K] [Field M] [Field L] + [Algebra K M] [Algebra M L] [Algebra K L] + [IsScalarTower K M L] [Module.Free M L] (x : Lˣ) : + normUnits K M (normUnits M L x) = normUnits K L x := by + apply Units.ext + exact Algebra.norm_norm + +end + +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic.lean new file mode 100644 index 0000000000..682ebb9789 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.ClosedAddSubgroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.NonarchimedeanLocalField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.PrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.UnitDecomposition + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/ClosedAddSubgroup.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/ClosedAddSubgroup.lean new file mode 100644 index 0000000000..4ab1843bf0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/ClosedAddSubgroup.lean @@ -0,0 +1,134 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.Padics.RingHoms +public import Mathlib.Topology.Algebra.OpenSubgroup +/-! +# Closed additive subgroups of the p-adic integers + +A nonzero closed additive subgroup of `ℤ_[p]` contains a nonzero principal +ideal. Since every nonzero ideal of `ℤ_[p]` is generated by a power of `p`, +such a subgroup is open. +-/ + +@[expose] public section + +open scoped Topology + +namespace PadicInt + +/-- A nonzero closed additive subgroup of the `p`-adic integers is open. -/ +theorem addSubgroup_isOpen_of_isClosed_of_ne_bot + (p : ℕ) [hp : Fact p.Prime] + (H : AddSubgroup ℤ_[p]) + (hclosed : IsClosed (H : Set ℤ_[p])) + (hne : H ≠ ⊥) : + IsOpen (H : Set ℤ_[p]) := by + obtain ⟨⟨x, hxH⟩, hx⟩ := + AddSubgroup.ne_bot_iff_exists_ne_zero.mp hne + have hx0 : x ≠ 0 := fun h ↦ hx (Subtype.ext h) + have hmul (a : ℤ_[p]) : x * a ∈ H := by + refine PadicInt.denseRange_intCast.induction_on a ?_ ?_ + · change IsClosed ((fun y : ℤ_[p] ↦ x * y) ⁻¹' (H : Set ℤ_[p])) + exact hclosed.preimage (continuous_const.mul continuous_id) + · intro z + simpa only [zsmul_eq_mul, mul_comm] using H.zsmul_mem hxH z + have hspan_le : + (Ideal.span ({x} : Set ℤ_[p])).toAddSubgroup ≤ H := by + intro y hy + change y ∈ Ideal.span ({x} : Set ℤ_[p]) at hy + rw [Ideal.mem_span_singleton] at hy + obtain ⟨a, rfl⟩ := hy + exact hmul a + have hspan_ne : + (Ideal.span ({x} : Set ℤ_[p]) : Ideal ℤ_[p]) ≠ ⊥ := by + intro hzero + have hxmem : + x ∈ (Ideal.span ({x} : Set ℤ_[p]) : Ideal ℤ_[p]) := + Ideal.subset_span (by simp) + rw [hzero] at hxmem + exact hx0 (by simpa using hxmem) + obtain ⟨n, hn⟩ := PadicInt.ideal_eq_span_pow_p hspan_ne + have hpow_open : + IsOpen + ((Ideal.span ({(p : ℤ_[p]) ^ n} : Set ℤ_[p]) : + Ideal ℤ_[p]) : + Set ℤ_[p]) := by + have hset : + ((Ideal.span ({(p : ℤ_[p]) ^ n} : Set ℤ_[p]) : + Ideal ℤ_[p]) : + Set ℤ_[p]) = + Metric.closedBall 0 ((p : ℝ) ^ (-n : ℤ)) := by + ext y + change y ∈ + (Ideal.span ({(p : ℤ_[p]) ^ n} : Set ℤ_[p]) : + Ideal ℤ_[p]) ↔ + dist y 0 ≤ (p : ℝ) ^ (-n : ℤ) + rw [dist_zero_right, + PadicInt.norm_le_pow_iff_mem_span_pow] + rw [hset] + exact IsUltrametricDist.isOpen_closedBall + (0 : ℤ_[p]) (by + apply zpow_ne_zero + exact_mod_cast hp.out.ne_zero) + have hspan_open : + IsOpen + ((Ideal.span ({x} : Set ℤ_[p]) : Ideal ℤ_[p]) : + Set ℤ_[p]) := by + rw [hn] + exact hpow_open + exact AddSubgroup.isOpen_mono hspan_le hspan_open + +/-- Every additive coset of an open subgroup of the `p`-adic integers +contains the cast of a positive natural number. + +The positive natural numbers are dense because they are the translate +by one of the dense image of `ℕ` in `ℤ_[p]`. -/ +theorem exists_positive_natCast_sub_mem_of_isOpen_addSubgroup + (p : ℕ) [Fact p.Prime] + (H : AddSubgroup ℤ_[p]) + (hopen : IsOpen (H : Set ℤ_[p])) + (z : ℤ_[p]) : + ∃ n : ℕ, 0 < n ∧ z - (n : ℤ_[p]) ∈ H := by + have htranslate : + Function.Surjective (fun y : ℤ_[p] ↦ y + 1) := by + intro y + exact ⟨y - 1, sub_add_cancel y 1⟩ + have hdense : + DenseRange (fun n : ℕ ↦ (n : ℤ_[p]) + 1) := by + exact + htranslate.denseRange.comp + PadicInt.denseRange_natCast + (continuous_id.add continuous_const) + let U : Set ℤ_[p] := {y | z - y ∈ H} + have hUopen : IsOpen U := by + exact hopen.preimage (continuous_const.sub continuous_id) + have hUne : U.Nonempty := by + refine ⟨z, ?_⟩ + change z - z ∈ H + simpa only [sub_self] using H.zero_mem + obtain ⟨n, hn⟩ := hdense.exists_mem_open hUopen hUne + refine ⟨n + 1, Nat.zero_lt_succ n, ?_⟩ + simpa only [U, Set.mem_ofPred_eq, Nat.cast_add, Nat.cast_one] using hn + +/-- A positive integral degree is nontrivial in the multiplicative +copy of the additive group of `ℤ_p`. -/ +theorem multiplicative_positiveNatDegree_ne_one + (p : ℕ) [Fact p.Prime] + (n : ℕ) (hn : 0 < n) : + (Multiplicative.ofAdd (1 : ℤ_[p])) ^ n ≠ 1 := by + intro h + have h' := congrArg Multiplicative.toAdd h + change n • (1 : ℤ_[p]) = 0 at h' + have hn0 : (n : ℤ_[p]) = 0 := by + simpa only [nsmul_one] using h' + have : n = 0 := by + exact_mod_cast hn0 + exact (Nat.ne_of_gt hn) this + +end PadicInt diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic.lean new file mode 100644 index 0000000000..7df9cba557 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.Unramified + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified.lean new file mode 100644 index 0000000000..50f92cbefb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified.lean @@ -0,0 +1,19 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinPolynomial +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinRelation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.Existence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralTranslate +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.PrimeElement +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.RamificationIndex +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.ValuationRingEquiv + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinPolynomial.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinPolynomial.lean new file mode 100644 index 0000000000..d76e8644cd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinPolynomial.lean @@ -0,0 +1,301 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +public import Mathlib.NumberTheory.Cyclotomic.Gal +public import Mathlib.NumberTheory.Cyclotomic.Discriminant +public import Mathlib.RingTheory.Polynomial.Eisenstein.IsIntegral +public import Mathlib.RingTheory.IsAdjoinRoot +/-! +# The Eisenstein polynomial of the `p`-power cyclotomic extension + +For a primitive `p ^ m`-th root of unity `ζ`, with `m > 0`, the local +cyclotomic calculation proves that `ℚ_[p](ζ) / ℚ_[p]` is totally ramified of degree +`φ (p ^ m)`, identifies its Galois group with `(ZMod (p ^ m))ˣ`, identifies +its valuation ring with `ℤ_[p][ζ]`, and shows that `1 - ζ` is a prime +element of norm `p`. + +The source is the translated cyclotomic Eisenstein polynomial +`Φ_{p^(k+1)}(X + 1)`. We first transport its integral Eisenstein criterion +to the actual p-adic integer ring; no irreducibility or ramification +conclusion is assumed. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +open Polynomial +open scoped Polynomial + +universe u + +theorem padicCyclotomicTotallyRamified_norm_isUnit_iff + {R A : Type*} [CommRing R] [CommRing A] [Algebra R A] + [Module.Finite R A] [Module.Free R A] (x : A) : + IsUnit (Algebra.norm R x) ↔ IsUnit x := by + rw [Algebra.norm_apply, ← LinearMap.isUnit_iff_isUnit_det, + Algebra.lmul_isUnit_iff] + +/-- The translated prime-power cyclotomic polynomial over the actual p-adic +integer ring. -/ +def padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt + (p k : ℕ) [Fact p.Prime] : ℤ_[p][X] := + (cyclotomic (p ^ (k + 1)) ℤ_[p]).comp (X + 1) + +theorem padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt_eq_map + (p k : ℕ) [Fact p.Prime] : + padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt p k = + (((cyclotomic (p ^ (k + 1)) ℤ).comp (X + 1)).map + (algebraMap ℤ ℤ_[p])) := by + simp [padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt, Polynomial.map_comp] + +/-- The translated cyclotomic polynomial remains Eisenstein after +completion from `ℤ` to `ℤ_[p]`. -/ +theorem padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt_isEisensteinAt + (p k : ℕ) [Fact p.Prime] : + (padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt p k).IsEisensteinAt + (Ideal.span ({(p : ℤ_[p])} : Set ℤ_[p])) := by + let F : ℤ[X] := (cyclotomic (p ^ (k + 1)) ℤ).comp (X + 1) + let G : ℤ_[p][X] := padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt p k + have hF : F.IsEisensteinAt (Ideal.span ({(p : ℤ)} : Set ℤ)) := by + simpa [F] using cyclotomic_prime_pow_comp_X_add_one_isEisensteinAt p k + have hGmonic : G.Monic := by + dsimp [G, padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt] + exact (cyclotomic.monic _ ℤ_[p]).comp_X_add_C 1 + refine hGmonic.isEisensteinAt_of_mem_of_notMem + (Ideal.IsPrime.ne_top ((Ideal.span_singleton_prime PadicInt.prime_p.ne_zero).2 + PadicInt.prime_p)) ?_ ?_ + · intro i hi + have hdeg : G.natDegree = F.natDegree := by + change (padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt p k).natDegree = F.natDegree + rw [padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt_eq_map] + exact Polynomial.Monic.natDegree_map + ((cyclotomic.monic (p ^ (k + 1)) ℤ).comp_X_add_C 1) + (algebraMap ℤ ℤ_[p]) + have hmemF : F.coeff i ∈ Ideal.span ({(p : ℤ)} : Set ℤ) := + hF.mem (hdeg ▸ hi) + rw [Ideal.mem_span_singleton] at hmemF ⊢ + change (p : ℤ_[p]) ∣ (padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt p k).coeff i + rw [padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt_eq_map, coeff_map] + obtain ⟨a, ha⟩ := hmemF + refine ⟨(a : ℤ_[p]), ?_⟩ + simpa [F] using congrArg (algebraMap ℤ ℤ_[p]) ha + · rw [Ideal.span_singleton_pow, Ideal.mem_span_singleton] + intro hdiv + change (p : ℤ_[p]) ^ 2 ∣ + (padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt p k).coeff 0 at hdiv + rw [padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt_eq_map, coeff_map] at hdiv + have hdivZ : (p : ℤ) ^ 2 ∣ F.coeff 0 := + (PadicInt.pow_p_dvd_int_iff 2 (F.coeff 0)).mp hdiv + exact hF.notMem (by + rw [Ideal.span_singleton_pow, Ideal.mem_span_singleton] + exact hdivZ) + +/-- The translated polynomial is irreducible over `ℤ_[p]` by Eisenstein. -/ +theorem padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt_irreducible + (p k : ℕ) [Fact p.Prime] : + Irreducible (padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt p k) := by + have hei := padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt_isEisensteinAt p k + have hprime : + (Ideal.span ({(p : ℤ_[p])} : Set ℤ_[p])).IsPrime := + (Ideal.span_singleton_prime PadicInt.prime_p.ne_zero).2 PadicInt.prime_p + have hmonic : (padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt p k).Monic := + (cyclotomic.monic _ ℤ_[p]).comp_X_add_C 1 + apply hei.irreducible hprime hmonic.isPrimitive + rw [padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt, natDegree_comp, + show (X + 1 : ℤ_[p][X]) = X + C 1 by simp, + natDegree_X_add_C, mul_one, natDegree_cyclotomic] + exact (Nat.totient_pos.mpr (pow_pos (Fact.out : Nat.Prime p).pos _)) + +/-- The translated polynomial is irreducible over the p-adic field. -/ +theorem padicCyclotomicTotallyRamifiedShiftedCyclotomicPadic_irreducible + (p k : ℕ) [Fact p.Prime] : + Irreducible + ((cyclotomic (p ^ (k + 1)) ℚ_[p]).comp (X + 1)) := by + let G := padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt p k + have hG : Irreducible G := + padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt_irreducible p k + have hGmonic : G.Monic := (cyclotomic.monic _ ℤ_[p]).comp_X_add_C 1 + have hmap : Irreducible (G.map (algebraMap ℤ_[p] ℚ_[p])) := + hGmonic.irreducible_iff_irreducible_map_fraction_map.mp hG + simpa [G, padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt, + Polynomial.map_comp] using hmap + +/-- The prime-power cyclotomic polynomial is irreducible over `ℚ_[p]`. +This supplies the local irreducibility input for the ramification analysis. -/ +theorem padicCyclotomicPolynomial_irreducible_prime_pow_succ + (p k : ℕ) [Fact p.Prime] : + Irreducible (cyclotomic (p ^ (k + 1)) ℚ_[p]) := by + let F : ℚ_[p][X] := cyclotomic (p ^ (k + 1)) ℚ_[p] + have hs : Irreducible (F.comp (X + 1)) := by + simpa [F] using padicCyclotomicTotallyRamifiedShiftedCyclotomicPadic_irreducible p k + have hb := hs.map (Polynomial.algEquivAevalXAddC (-1 : ℚ_[p])) + rw [Polynomial.algEquivAevalXAddC_apply, ← comp_eq_aeval] at hb + simpa [F, comp_assoc] using hb + +section CyclotomicExtension + +variable {p k : ℕ} [Fact p.Prime] +variable {L : Type u} [Field L] [Algebra ℚ_[p] L] + +/-- The `ℤ_[p]`-algebra on the cyclotomic extension is induced through `ℚ_[p]`. -/ +local instance padicCyclotomicTotallyRamifiedAlgebraPadicInt : Algebra ℤ_[p] L := + ((algebraMap ℚ_[p] L).comp (algebraMap ℤ_[p] ℚ_[p])).toAlgebra + +local instance padicCyclotomicTotallyRamifiedScalarTowerPadicInt : + IsScalarTower ℤ_[p] ℚ_[p] L := + IsScalarTower.of_algebraMap_eq' rfl + +/-- A field generated over `ℚ_[p]` by the displayed primitive root is the +corresponding cyclotomic extension. The generation hypothesis only spells +out the notation `ℚ_[p](ζ)`; none of the totally ramified cyclotomic theorem's conclusions is +assumed. -/ +theorem padic_isCyclotomicExtension_of_primitiveRoot_adjoin_eq_top + (ζ : L) (hζ : IsPrimitiveRoot ζ (p ^ (k + 1))) + (hgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) : + IsCyclotomicExtension {p ^ (k + 1)} ℚ_[p] L := by + let A := Algebra.adjoin ℚ_[p] ({ζ} : Set L) + let : NeZero (p ^ (k + 1)) := ⟨pow_ne_zero _ (Fact.out : Nat.Prime p).ne_zero⟩ + let hA : IsCyclotomicExtension {p ^ (k + 1)} ℚ_[p] A := + hζ.adjoin_isCyclotomicExtension ℚ_[p] + let e : A ≃ₐ[ℚ_[p]] L := + (Subalgebra.equivOfEq A ⊤ hgen).trans Subalgebra.topEquiv + exact IsCyclotomicExtension.equiv {p ^ (k + 1)} ℚ_[p] A e + +/-- the totally ramified cyclotomic theorem(i), degree in Euler-totient form. -/ +theorem padicCyclotomicTotallyRamified_finrank_eq_totient + (ζ : L) (hζ : IsPrimitiveRoot ζ (p ^ (k + 1))) + (hgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) : + Module.finrank ℚ_[p] L = Nat.totient (p ^ (k + 1)) := by + let : NeZero (p ^ (k + 1)) := ⟨pow_ne_zero _ (Fact.out : Nat.Prime p).ne_zero⟩ + let : IsCyclotomicExtension {p ^ (k + 1)} ℚ_[p] L := + padic_isCyclotomicExtension_of_primitiveRoot_adjoin_eq_top ζ hζ hgen + exact IsCyclotomicExtension.finrank L + (padicCyclotomicPolynomial_irreducible_prime_pow_succ p k) + +/-- The explicit degree of the totally ramified cyclotomic extension +`(p - 1) * p ^ k`. -/ +theorem padicCyclotomic_finrank_eq_prime_sub_one_mul_pow + (ζ : L) (hζ : IsPrimitiveRoot ζ (p ^ (k + 1))) + (hgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) : + Module.finrank ℚ_[p] L = (p - 1) * p ^ k := by + rw [padicCyclotomicTotallyRamified_finrank_eq_totient ζ hζ hgen, + Nat.totient_prime_pow (Fact.out : Nat.Prime p) (Nat.succ_pos k)] + simp [Nat.mul_comm] + +/-- the totally ramified cyclotomic theorem(ii): the full Galois group is the unit group modulo +`p ^ (k + 1)`. -/ +noncomputable def padicCyclotomicTotallyRamifiedGaloisGroupEquivUnits + (ζ : L) (hζ : IsPrimitiveRoot ζ (p ^ (k + 1))) + (hgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) : + (L ≃ₐ[ℚ_[p]] L) ≃* (ZMod (p ^ (k + 1)))ˣ := by + letI : NeZero (p ^ (k + 1)) := ⟨pow_ne_zero _ (Fact.out : Nat.Prime p).ne_zero⟩ + letI : IsCyclotomicExtension {p ^ (k + 1)} ℚ_[p] L := + padic_isCyclotomicExtension_of_primitiveRoot_adjoin_eq_top ζ hζ hgen + exact IsCyclotomicExtension.autEquivPow L + (padicCyclotomicPolynomial_irreducible_prime_pow_succ p k) + +/-- the totally ramified cyclotomic theorem(iv), including the exceptional order-two case: +the field norm of `1 - ζ` is exactly the rational prime `p`. -/ +theorem padicCyclotomic_norm_one_sub_primitiveRoot_eq_prime + (ζ : L) (hζ : IsPrimitiveRoot ζ (p ^ (k + 1))) + (hgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) : + Algebra.norm ℚ_[p] (1 - ζ) = (p : ℚ_[p]) := by + let n := p ^ (k + 1) + let : NeZero n := ⟨pow_ne_zero _ (Fact.out : Nat.Prime p).ne_zero⟩ + let : IsCyclotomicExtension {n} ℚ_[p] L := by + simpa [n] using padic_isCyclotomicExtension_of_primitiveRoot_adjoin_eq_top ζ hζ hgen + let : FiniteDimensional ℚ_[p] L := + IsCyclotomicExtension.finiteDimensional {n} ℚ_[p] L + have hirr : Irreducible (cyclotomic n ℚ_[p]) := by + simpa [n] using padicCyclotomicPolynomial_irreducible_prime_pow_succ p k + by_cases hn : n = 2 + · have hp_dvd_two : p ∣ 2 := by + rw [← hn] + exact dvd_pow_self p (Nat.succ_ne_zero k) + have hp2 : p = 2 := + ((Nat.dvd_prime Nat.prime_two).mp hp_dvd_two).resolve_left + (Fact.out : Nat.Prime p).ne_one + have hζ2 : IsPrimitiveRoot ζ 2 := by simpa [n, hn] using hζ + have hfinrank : Module.finrank ℚ_[p] L = 1 := by + calc + Module.finrank ℚ_[p] L = Nat.totient (p ^ (k + 1)) := + padicCyclotomicTotallyRamified_finrank_eq_totient ζ hζ hgen + _ = Nat.totient n := by rfl + _ = 1 := by rw [hn]; norm_num + rw [hζ2.eq_neg_one_of_two_right] + rw [show (1 - (-1 : L)) = algebraMap ℚ_[p] L (2 : ℚ_[p]) by + calc + 1 - (-1 : L) = (2 : L) := by norm_num + _ = algebraMap ℚ_[p] L (2 : ℚ_[p]) := by + simpa using (map_natCast (algebraMap ℚ_[p] L) 2).symm, + Algebra.norm_algebraMap, hfinrank, pow_one] + exact_mod_cast hp2.symm + · have hprimePow : IsPrimePow n := by + simpa [n] using + (show IsPrimePow (p ^ (k + 1)) from + (show IsPrimePow p from (Fact.out : Nat.Prime p).isPrimePow).pow + (Nat.succ_ne_zero k)) + have hsub : Algebra.norm ℚ_[p] (ζ - 1) = (p : ℚ_[p]) := by + rw [hζ.sub_one_norm_isPrimePow hprimePow hirr hn, + show n.minFac = p by + simpa [n] using + (Fact.out : Nat.Prime p).pow_minFac (Nat.succ_ne_zero k)] + have hn_ge_two : 2 ≤ n := by + exact le_trans (Fact.out : Nat.Prime p).two_le + (by simpa [n] using Nat.le_pow (a := p) (Nat.succ_pos k)) + have hn_gt_two : 2 < n := lt_of_le_of_ne hn_ge_two (Ne.symm hn) + have heven : Even (Module.finrank ℚ_[p] L) := by + rw [padicCyclotomicTotallyRamified_finrank_eq_totient ζ hζ hgen] + change Even (Nat.totient n) + exact Nat.totient_even hn_gt_two + rw [show 1 - ζ = -(ζ - 1) by ring, + show -(ζ - 1) = algebraMap ℚ_[p] L (-1) * (ζ - 1) by simp, + map_mul, Algebra.norm_algebraMap, hsub, heven.neg_one_pow, one_mul] + +/-- The primitive root is integral over the actual p-adic integer ring. -/ +theorem padicCyclotomicTotallyRamified_primitiveRoot_isIntegral_padicInt + (ζ : L) (hζ : IsPrimitiveRoot ζ (p ^ (k + 1))) : + IsIntegral ℤ_[p] ζ := by + refine ⟨X ^ (p ^ (k + 1)) - 1, + monic_X_pow_sub_C 1 (pow_ne_zero _ (Fact.out : Nat.Prime p).ne_zero), ?_⟩ + simp [hζ.pow_eq_one] + +/-- The p-adic-integer minimal polynomial of `ζ - 1` is the Eisenstein +translate `Φ_{p^(k+1)}(X+1)`. -/ +theorem padicCyclotomicTotallyRamified_minpoly_sub_one_padicInt + (ζ : L) (hζ : IsPrimitiveRoot ζ (p ^ (k + 1))) + (hgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) : + minpoly ℤ_[p] (ζ - 1) = + padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt p k := by + let n := p ^ (k + 1) + let : NeZero n := ⟨pow_ne_zero _ (Fact.out : Nat.Prime p).ne_zero⟩ + let : IsCyclotomicExtension {n} ℚ_[p] L := by + simpa [n] using padic_isCyclotomicExtension_of_primitiveRoot_adjoin_eq_top ζ hζ hgen + have hirr : Irreducible (cyclotomic n ℚ_[p]) := by + simpa [n] using padicCyclotomicPolynomial_irreducible_prime_pow_succ p k + have hint : IsIntegral ℤ_[p] (ζ - 1) := + (padicCyclotomicTotallyRamified_primitiveRoot_isIntegral_padicInt ζ hζ).sub isIntegral_one + apply Polynomial.map_injective (algebraMap ℤ_[p] ℚ_[p]) + (FaithfulSMul.algebraMap_injective ℤ_[p] ℚ_[p]) + rw [← minpoly.isIntegrallyClosed_eq_field_fractions' ℚ_[p] hint, + hζ.minpoly_sub_one_eq_cyclotomic_comp hirr] + simp [padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt, Polynomial.map_comp] + +end CyclotomicExtension + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinRelation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinRelation.lean new file mode 100644 index 0000000000..7bfa74aefd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinRelation.lean @@ -0,0 +1,116 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.PrimeElement +/-! +# The Eisenstein relation for the cyclotomic uniformizer + +This file extracts the unit relation `p · u = (ζ - 1)^φ` from the translated Eisenstein polynomial. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +open Polynomial +open scoped Polynomial + +universe u + +section CyclotomicExtension + +variable {p k : ℕ} [Fact p.Prime] +variable {L : Type u} [Field L] [Algebra ℚ_[p] L] + +/-- The `ℤ_[p]`-algebra on the cyclotomic extension is induced through `ℚ_[p]`. -/ +local instance padicCyclotomicTotallyRamifiedEisensteinRelationAlgebraPadicInt : Algebra ℤ_[p] L := + ((algebraMap ℚ_[p] L).comp (algebraMap ℤ_[p] ℚ_[p])).toAlgebra + +local instance padicCyclotomicTotallyRamifiedEisensteinRelationScalarTowerPadicInt : + IsScalarTower ℤ_[p] ℚ_[p] L := + IsScalarTower.of_algebraMap_eq' rfl + +/-- The Eisenstein relation behind total ramification: in +`ℤ_[p][ζ - 1]`, the base prime times a unit is the field generator raised +to the full power-basis degree. -/ +theorem padicCyclotomicTotallyRamified_exists_unit_mul_p_eq_sub_one_pow + (ζ : L) (hζ : IsPrimitiveRoot ζ (p ^ (k + 1))) + (hgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) : + let α : L := ζ - 1 + let A := Algebra.adjoin ℤ_[p] ({α} : Set L) + ∃ y : A, IsUnit y ∧ + algebraMap ℤ_[p] A (p : ℤ_[p]) * y = + (⟨α, Algebra.self_mem_adjoin_singleton ℤ_[p] α⟩ : A) ^ + Nat.totient (p ^ (k + 1)) := by + let α : L := ζ - 1 + have hintα : IsIntegral ℤ_[p] α := + (padicCyclotomicTotallyRamified_primitiveRoot_isIntegral_padicInt ζ hζ).sub isIntegral_one + let A := Algebra.adjoin ℤ_[p] ({α} : Set L) + let : Module.IsTorsionFree ℤ_[p] L := + Module.IsTorsionFree.trans_faithfulSMul ℤ_[p] ℚ_[p] L + let B : PowerBasis ℤ_[p] A := Algebra.adjoin.powerBasis' hintα + let : Module.Finite ℤ_[p] A := B.finite + let : Module.Free ℤ_[p] A := Module.Free.of_basis B.basis + have hmin : minpoly ℤ_[p] α = + padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt p k := by + simpa [α] using padicCyclotomicTotallyRamified_minpoly_sub_one_padicInt ζ hζ hgen + have hei : (minpoly ℤ_[p] α).IsEisensteinAt + (Ideal.span ({(p : ℤ_[p])} : Set ℤ_[p])) := by + rw [hmin] + exact padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt_isEisensteinAt p k + have heiB : (minpoly ℤ_[p] B.gen).IsEisensteinAt + (Ideal.span ({(p : ℤ_[p])} : Set ℤ_[p])) := by + rw [← Algebra.adjoin.powerBasis'_minpoly_gen hintα] + exact hei + obtain ⟨y, _hyMem, hy⟩ := + heiB.isWeaklyEisensteinAt.exists_mem_adjoin_mul_eq_pow_natDegree + (minpoly.aeval ℤ_[p] B.gen) (minpoly.monic B.isIntegral_gen) + have hy' : algebraMap ℤ_[p] A (p : ℤ_[p]) * y = B.gen ^ B.dim := by + rw [(minpoly.monic B.isIntegral_gen).natDegree_map, + B.natDegree_minpoly] at hy + simpa using hy + have hnorm : Algebra.norm ℤ_[p] B.gen = + (-1) ^ B.dim * (p : ℤ_[p]) := by + rw [Algebra.PowerBasis.norm_gen_eq_coeff_zero_minpoly, + ← Algebra.adjoin.powerBasis'_minpoly_gen hintα, hmin, + coeff_zero_eq_eval_zero] + simp [padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt, eval_comp] + have hnormEq := congrArg (Algebra.norm ℤ_[p]) hy' + rw [map_mul, Algebra.norm_algebraMap_of_basis B.basis, map_pow, + hnorm, mul_pow] at hnormEq + have hcancel : Algebra.norm ℤ_[p] y = + ((-1 : ℤ_[p]) ^ B.dim) ^ B.dim := by + apply mul_left_cancel₀ (pow_ne_zero B.dim PadicInt.prime_p.ne_zero) + simpa [mul_comm] using hnormEq + have hyu : IsUnit y := by + apply (padicCyclotomicTotallyRamified_norm_isUnit_iff (R := ℤ_[p]) (A := A) y).mp + rw [hcancel] + exact (isUnit_neg_one.pow _).pow _ + have hdim : B.dim = Nat.totient (p ^ (k + 1)) := by + calc + B.dim = (minpoly ℤ_[p] α).natDegree := by simp [B] + _ = (padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt p k).natDegree := + congrArg Polynomial.natDegree hmin + _ = Nat.totient (p ^ (k + 1)) := by + rw [padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt, natDegree_comp, + show (X + 1 : ℤ_[p][X]) = X + C 1 by simp, + natDegree_X_add_C, mul_one, natDegree_cyclotomic] + refine ⟨y, hyu, ?_⟩ + rw [hdim] at hy' + simpa [B, Algebra.adjoin.powerBasis'_gen, α] using hy' + +end CyclotomicExtension + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/Existence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/Existence.lean new file mode 100644 index 0000000000..fb6b534c5a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/Existence.lean @@ -0,0 +1,99 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.RamificationIndex +/-! +# The totally ramified cyclotomic endpoint + +This file packages the actual integral-closure complete-DVF model as a totally ramified extension. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.ValuedExtension renaming + isTotallyRamified_iff_ramificationIndex_eq_degree_of_finite_separable → + isTotallyRamified_iff_ramificationIndex_eq_degree_of_finite_separable + + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +open Polynomial +open ValuationTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open scoped Polynomial + +universe u + +section CyclotomicExtension + +variable {p k : ℕ} [Fact p.Prime] +variable {L : Type u} [Field L] [Algebra ℚ_[p] L] + +/-- The `ℤ_[p]`-algebra on the cyclotomic extension is induced through `ℚ_[p]`. -/ +local instance padicCyclotomicTotallyRamifiedRamificationEndpointAlgebraPadicInt : Algebra ℤ_[p] + L := + ((algebraMap ℚ_[p] L).comp (algebraMap ℤ_[p] ℚ_[p])).toAlgebra + +local instance padicCyclotomicTotallyRamifiedRamificationEndpointScalarTowerPadicInt : + IsScalarTower ℤ_[p] ℚ_[p] L := + IsScalarTower.of_algebraMap_eq' rfl + +/-- the totally ramified cyclotomic theorem(i), valuative conclusion: the extension +`ℚ_[p](ζ) / ℚ_[p]` is totally ramified. The target valuation is the +canonical complete discrete valuation supplied by the actual integral +closure of `ℤ_[p]` in `L`. -/ +theorem padicCyclotomicTotallyRamified_exists_totallyRamified_extension + (ζ : L) (hζ : IsPrimitiveRoot ζ (p ^ (k + 1))) + (hgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) : + ∃ hfd : FiniteDimensional ℚ_[p] L, + letI : FiniteDimensional ℚ_[p] L := hfd + ∃ target : CompleteDVF.{u, 0} L, + ∃ hExt : + (padicCompleteDVF p).valuation.HasExtension + target.valuation, + letI : + (padicCompleteDVF p).valuation.HasExtension + target.valuation := hExt + target.valuation.IsUniformizer (1 - ζ) ∧ + ValuedExtension.IsTotallyRamified + (padicCompleteDVF p).toDVF target.toDVF := by + let : NeZero (p ^ (k + 1)) := + ⟨pow_ne_zero _ (Fact.out : Nat.Prime p).ne_zero⟩ + let : IsCyclotomicExtension {p ^ (k + 1)} ℚ_[p] L := + padic_isCyclotomicExtension_of_primitiveRoot_adjoin_eq_top ζ hζ hgen + let hfd : FiniteDimensional ℚ_[p] L := + IsCyclotomicExtension.finiteDimensional {p ^ (k + 1)} ℚ_[p] L + let : FiniteDimensional ℚ_[p] L := hfd + let : Algebra.IsSeparable ℚ_[p] L := by infer_instance + let base := padicCompleteDVF p + obtain ⟨target, hExt, hTarget, _⟩ := + ValuedExtension.exists_integralClosure_standard_fundamental_identity + (K := ℚ_[p]) (L := L) base + let : base.valuation.HasExtension target.valuation := hExt + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := hTarget + let : IsScalarTower base.valuationSubring target.valuationSubring L := by + apply IsScalarTower.of_algebraMap_eq + intro x + rfl + have hsource := + padicCyclotomicTotallyRamified_uniformizer_and_ramificationIndex_eq_degree + ζ hζ hgen target + exact ⟨hfd, target, hExt, hsource.1, + (isTotallyRamified_iff_ramificationIndex_eq_degree_of_finite_separable + base target).2 hsource.2⟩ + +end CyclotomicExtension + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralClosure.lean new file mode 100644 index 0000000000..576be64765 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralClosure.lean @@ -0,0 +1,192 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinPolynomial +/-! +# The integral closure in the totally ramified cyclotomic extension + +This file identifies `ℤ_[p][ζ]` with the actual integral closure and proves +that it is a discrete valuation ring. +-/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + integralClosure_isDiscreteValuationRing_of_finite_separable → + integralClosure_isDiscreteValuationRing_of_finite_separable + + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +open Polynomial +open scoped Polynomial + +universe u + +section CyclotomicExtension + +variable {p k : ℕ} [Fact p.Prime] +variable {L : Type u} [Field L] [Algebra ℚ_[p] L] + +/-- The `ℤ_[p]`-algebra on the cyclotomic extension is induced through `ℚ_[p]`. -/ +local instance padicCyclotomicTotallyRamifiedIntegralClosureAlgebraPadicInt : Algebra ℤ_[p] L := + ((algebraMap ℚ_[p] L).comp (algebraMap ℤ_[p] ℚ_[p])).toAlgebra + +local instance padicCyclotomicTotallyRamifiedIntegralClosureScalarTowerPadicInt : + IsScalarTower ℤ_[p] ℚ_[p] L := + IsScalarTower.of_algebraMap_eq' rfl + +/-- the totally ramified cyclotomic theorem(iii): `ℤ_[p][ζ]` is the integral closure of `ℤ_[p]` +in `ℚ_[p](ζ)`. Since the base is complete, the integral closure is the +unique valuation ring upstairs. -/ +theorem padicCyclotomicTotallyRamified_isIntegralClosure_adjoin + (ζ : L) (hζ : IsPrimitiveRoot ζ (p ^ (k + 1))) + (hgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) : + IsIntegralClosure (Algebra.adjoin ℤ_[p] ({ζ} : Set L)) ℤ_[p] L := by + let n := p ^ (k + 1) + let : NeZero n := ⟨pow_ne_zero _ (Fact.out : Nat.Prime p).ne_zero⟩ + let hcycl : IsCyclotomicExtension {n} ℚ_[p] L := by + simpa [n] using padic_isCyclotomicExtension_of_primitiveRoot_adjoin_eq_top ζ hζ hgen + let : FiniteDimensional ℚ_[p] L := + IsCyclotomicExtension.finiteDimensional {n} ℚ_[p] L + let : Algebra.IsSeparable ℚ_[p] L := by infer_instance + have hirr : Irreducible (cyclotomic n ℚ_[p]) := by + simpa [n] using padicCyclotomicPolynomial_irreducible_prime_pow_succ p k + have hintζ : IsIntegral ℤ_[p] ζ := + padicCyclotomicTotallyRamified_primitiveRoot_isIntegral_padicInt ζ hζ + have hintα : IsIntegral ℤ_[p] (ζ - 1) := hintζ.sub isIntegral_one + let Bζ := hζ.powerBasis ℚ_[p] + let Bα := hζ.subOnePowerBasis ℚ_[p] + have hintBζ : IsIntegral ℤ_[p] Bζ.gen := by + simpa [Bζ] using hintζ + have hintBα : IsIntegral ℤ_[p] Bα.gen := by + simpa [Bα] using hintα + have hadjoin : + Algebra.adjoin ℤ_[p] ({ζ} : Set L) = + Algebra.adjoin ℤ_[p] ({ζ - 1} : Set L) := by + apply le_antisymm + · apply Algebra.adjoin_le + intro x hx + rw [Set.mem_singleton_iff] at hx + subst x + simpa using Subalgebra.add_mem _ + (Algebra.self_mem_adjoin_singleton ℤ_[p] (ζ - 1)) + (Subalgebra.one_mem _) + · apply Algebra.adjoin_le + intro x hx + rw [Set.mem_singleton_iff] at hx + subst x + exact Subalgebra.sub_mem _ + (Algebra.self_mem_adjoin_singleton ℤ_[p] ζ) + (Subalgebra.one_mem _) + refine ⟨Subtype.val_injective, @fun x => ⟨fun hx => ⟨⟨x, ?_⟩, rfl⟩, ?_⟩⟩ + swap + · rintro ⟨y, rfl⟩ + exact + IsIntegral.algebraMap + ((le_integralClosure_iff_isIntegral.1 + (adjoin_le_integralClosure hintζ)).isIntegral _) + have H := Algebra.discr_mul_isIntegral_mem_adjoin ℚ_[p] hintBζ hx + obtain ⟨u, r, hu⟩ := + IsCyclotomicExtension.discr_prime_pow_eq_unit_mul_pow hζ hirr + rw [hu] at H + let uZ : ℤ_[p]ˣ := Units.map (algebraMap ℤ ℤ_[p]) u + replace H := Subalgebra.smul_mem _ H (↑(uZ⁻¹) : ℤ_[p]) + have huZ : algebraMap ℤ_[p] ℚ_[p] (uZ : ℤ_[p]) = (u : ℚ_[p]) := by + simp [uZ] + have huZL : algebraMap ℤ_[p] L (uZ : ℤ_[p]) = + algebraMap ℚ_[p] L (u : ℚ_[p]) := by + rw [IsScalarTower.algebraMap_apply ℤ_[p] ℚ_[p] L, huZ] + have Hζ : (↑(uZ⁻¹) : ℤ_[p]) • + (((uZ : ℤ_[p]) * (p : ℤ_[p]) ^ r) • x) ∈ + Algebra.adjoin ℤ_[p] ({ζ} : Set L) := by + simpa [Bζ, Algebra.smul_def, IsScalarTower.algebraMap_apply, huZ, huZL, + map_mul, map_pow] using H + have Hpow : (p : ℤ_[p]) ^ r • x ∈ + Algebra.adjoin ℤ_[p] ({Bα.gen} : Set L) := by + rw [hadjoin] at Hζ + simpa [Bα, ← mul_smul, mul_assoc] using Hζ + have hmin : + (minpoly ℤ_[p] Bα.gen).IsEisensteinAt + (Ideal.span ({(p : ℤ_[p])} : Set ℤ_[p])) := by + rw [show Bα.gen = ζ - 1 by simp [Bα], + padicCyclotomicTotallyRamified_minpoly_sub_one_padicInt ζ hζ hgen] + exact padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt_isEisensteinAt p k + have hxα : x ∈ Algebra.adjoin ℤ_[p] ({Bα.gen} : Set L) := + mem_adjoin_of_smul_prime_pow_smul_of_minpoly_isEisensteinAt + (n := r) PadicInt.prime_p hintBα hx Hpow hmin + rw [show Algebra.adjoin ℤ_[p] ({Bα.gen} : Set L) = + Algebra.adjoin ℤ_[p] ({ζ} : Set L) by simpa [Bα] using hadjoin.symm] at hxα + exact hxα + +/-- Literal ring-of-integers equality in the totally ramified cyclotomic theorem(iii). -/ +theorem padicCyclotomicTotallyRamified_integralClosure_eq_adjoin + (ζ : L) (hζ : IsPrimitiveRoot ζ (p ^ (k + 1))) + (hgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) : + integralClosure ℤ_[p] L = Algebra.adjoin ℤ_[p] ({ζ} : Set L) := by + let hIC := padicCyclotomicTotallyRamified_isIntegralClosure_adjoin ζ hζ hgen + apply le_antisymm + · intro x hx + obtain ⟨y, hy⟩ := hIC.isIntegral_iff.mp hx + rw [← hy] + exact y.2 + · exact adjoin_le_integralClosure + (padicCyclotomicTotallyRamified_primitiveRoot_isIntegral_padicInt ζ hζ) + +/-- The explicit ring `ℤ_[p][ζ]` is a DVR. This transports the standard +finite-integral-closure theorem across the concrete equivalence between +`ℤ_[p]` and the valuation subring of `ℚ_[p]`. -/ +theorem padicCyclotomicTotallyRamified_adjoin_isDiscreteValuationRing + (ζ : L) (hζ : IsPrimitiveRoot ζ (p ^ (k + 1))) + (hgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) : + IsDiscreteValuationRing (Algebra.adjoin ℤ_[p] ({ζ} : Set L)) := by + let n := p ^ (k + 1) + let : NeZero n := ⟨pow_ne_zero _ (Fact.out : Nat.Prime p).ne_zero⟩ + let : IsCyclotomicExtension {n} ℚ_[p] L := by + simpa [n] using padic_isCyclotomicExtension_of_primitiveRoot_adjoin_eq_top ζ hζ hgen + let : FiniteDimensional ℚ_[p] L := + IsCyclotomicExtension.finiteDimensional {n} ℚ_[p] L + let : Algebra.IsSeparable ℚ_[p] L := by infer_instance + let base := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p + let V := base.valuationSubring + let : Algebra V L := + ((algebraMap ℚ_[p] L).comp (algebraMap V ℚ_[p])).toAlgebra + let : IsScalarTower V ℚ_[p] L := IsScalarTower.of_algebraMap_eq' rfl + let e : ℤ_[p] ≃+* V := + LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicIntEquivValuationSubring p + have he : (algebraMap V L).comp e.toRingHom = algebraMap ℤ_[p] L := by + ext z + rfl + let eIC : integralClosure ℤ_[p] L ≃+* integralClosure V L := + { toFun := fun z => ⟨z.1, (e.isIntegral_iff he z.1).mp z.2⟩ + invFun := fun z => ⟨z.1, (e.isIntegral_iff he z.1).mpr z.2⟩ + left_inv := fun _ => rfl + right_inv := fun _ => rfl + map_mul' := fun _ _ => rfl + map_add' := fun _ _ => rfl } + let : IsDiscreteValuationRing (integralClosure V L) := + integralClosure_isDiscreteValuationRing_of_finite_separable + base + let : IsDiscreteValuationRing (integralClosure ℤ_[p] L) := + IsDiscreteValuationRing.RingEquivClass.isDiscreteValuationRing eIC.symm + let eA : integralClosure ℤ_[p] L ≃+* + Algebra.adjoin ℤ_[p] ({ζ} : Set L) := + (Subalgebra.equivOfEq _ _ + (padicCyclotomicTotallyRamified_integralClosure_eq_adjoin ζ hζ hgen)).toRingEquiv + exact IsDiscreteValuationRing.RingEquivClass.isDiscreteValuationRing eA + +end CyclotomicExtension + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralTranslate.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralTranslate.lean new file mode 100644 index 0000000000..23758f2fb2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralTranslate.lean @@ -0,0 +1,69 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinRelation +/-! +# Translation of the integral ring in the totally ramified cyclotomic extension + +This file records that translating `ζ` by one preserves the explicit integral closure. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +open Polynomial +open scoped Polynomial + +universe u + +section CyclotomicExtension + +variable {p k : ℕ} [Fact p.Prime] +variable {L : Type u} [Field L] [Algebra ℚ_[p] L] + +/-- The `ℤ_[p]`-algebra on the cyclotomic extension is induced through `ℚ_[p]`. -/ +local instance padicCyclotomicTotallyRamifiedIntegralTranslateAlgebraPadicInt : Algebra ℤ_[p] L := + ((algebraMap ℚ_[p] L).comp (algebraMap ℤ_[p] ℚ_[p])).toAlgebra + +local instance padicCyclotomicTotallyRamifiedIntegralTranslateScalarTowerPadicInt : + IsScalarTower ℤ_[p] ℚ_[p] L := + IsScalarTower.of_algebraMap_eq' rfl + +/-- Translating the generator by one does not change the explicit +`ℤ_[p]`-algebra. -/ +theorem padicCyclotomicTotallyRamified_adjoin_sub_one_eq_adjoin + (ζ : L) : + Algebra.adjoin ℤ_[p] ({ζ - 1} : Set L) = + Algebra.adjoin ℤ_[p] ({ζ} : Set L) := by + apply le_antisymm + · apply Algebra.adjoin_le + intro x hx + rw [Set.mem_singleton_iff] at hx + subst x + exact Subalgebra.sub_mem _ + (Algebra.self_mem_adjoin_singleton ℤ_[p] ζ) + (Subalgebra.one_mem _) + · apply Algebra.adjoin_le + intro x hx + rw [Set.mem_singleton_iff] at hx + subst x + simpa using Subalgebra.add_mem _ + (Algebra.self_mem_adjoin_singleton ℤ_[p] (ζ - 1)) + (Subalgebra.one_mem _) + +end CyclotomicExtension + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/PrimeElement.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/PrimeElement.lean new file mode 100644 index 0000000000..96725282c7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/PrimeElement.lean @@ -0,0 +1,121 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralClosure +/-! +# A prime element for the totally ramified cyclotomic extension + +This file proves directly from its norm that `1 - ζ` is prime in the explicit DVR `ℤ_[p][ζ]`. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +open Polynomial +open scoped Polynomial + +universe u + +section CyclotomicExtension + +variable {p k : ℕ} [Fact p.Prime] +variable {L : Type u} [Field L] [Algebra ℚ_[p] L] + +/-- The `ℤ_[p]`-algebra on the cyclotomic extension is induced through `ℚ_[p]`. -/ +local instance padicCyclotomicTotallyRamifiedPrimeElementAlgebraPadicInt : Algebra ℤ_[p] L := + ((algebraMap ℚ_[p] L).comp (algebraMap ℤ_[p] ℚ_[p])).toAlgebra + +local instance padicCyclotomicTotallyRamifiedPrimeElementScalarTowerPadicInt : + IsScalarTower ℤ_[p] ℚ_[p] L := + IsScalarTower.of_algebraMap_eq' rfl + +/-- The element `1 - ζ`, viewed in the explicit integer ring `ℤ_[p][ζ]`. -/ +def padicCyclotomicTotallyRamifiedOneSubPrimitiveRootInteger (ζ : L) : + Algebra.adjoin ℤ_[p] ({ζ} : Set L) := + ⟨1 - ζ, Subalgebra.sub_mem _ (Subalgebra.one_mem _) + (Algebra.self_mem_adjoin_singleton ℤ_[p] ζ)⟩ + +/-- the totally ramified cyclotomic theorem(iv): `1 - ζ` is a prime element of `ℤ_[p][ζ]`. -/ +theorem padicCyclotomicTotallyRamified_one_sub_primitiveRoot_prime + (ζ : L) (hζ : IsPrimitiveRoot ζ (p ^ (k + 1))) + (hgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) : + Prime (padicCyclotomicTotallyRamifiedOneSubPrimitiveRootInteger (p := p) ζ) := by + let α : L := ζ - 1 + have hintα : IsIntegral ℤ_[p] α := by + exact (padicCyclotomicTotallyRamified_primitiveRoot_isIntegral_padicInt ζ hζ).sub isIntegral_one + let Aζ := Algebra.adjoin ℤ_[p] ({ζ} : Set L) + let A := Algebra.adjoin ℤ_[p] ({α} : Set L) + let : Module.IsTorsionFree ℤ_[p] L := + Module.IsTorsionFree.trans_faithfulSMul ℤ_[p] ℚ_[p] L + let B : PowerBasis ℤ_[p] A := Algebra.adjoin.powerBasis' hintα + let : Module.Finite ℤ_[p] A := B.finite + let : Module.Free ℤ_[p] A := Module.Free.of_basis B.basis + have hadjoin : Aζ = A := by + apply le_antisymm + · apply Algebra.adjoin_le + intro x hx + rw [Set.mem_singleton_iff] at hx + subst x + change ζ ∈ A + simpa [α] using Subalgebra.add_mem _ + (Algebra.self_mem_adjoin_singleton ℤ_[p] α) + (Subalgebra.one_mem _) + · apply Algebra.adjoin_le + intro x hx + rw [Set.mem_singleton_iff] at hx + subst x + change α ∈ Aζ + exact Subalgebra.sub_mem _ + (Algebra.self_mem_adjoin_singleton ℤ_[p] ζ) + (Subalgebra.one_mem _) + let : IsDiscreteValuationRing Aζ := by + simpa [Aζ] using + padicCyclotomicTotallyRamified_adjoin_isDiscreteValuationRing ζ hζ hgen + let e : Aζ ≃+* A := (Subalgebra.equivOfEq Aζ A hadjoin).toRingEquiv + let : IsDiscreteValuationRing A := + IsDiscreteValuationRing.RingEquivClass.isDiscreteValuationRing e + have hmin : minpoly ℤ_[p] α = + padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt p k := by + simpa [α] using padicCyclotomicTotallyRamified_minpoly_sub_one_padicInt ζ hζ hgen + have hnorm : Algebra.norm ℤ_[p] B.gen = + (-1) ^ B.dim * (p : ℤ_[p]) := by + rw [Algebra.PowerBasis.norm_gen_eq_coeff_zero_minpoly, + ← Algebra.adjoin.powerBasis'_minpoly_gen hintα, hmin, + coeff_zero_eq_eval_zero] + simp [padicCyclotomicTotallyRamifiedShiftedCyclotomicPadicInt, eval_comp] + have hirrNorm : Irreducible (Algebra.norm ℤ_[p] B.gen) := by + rw [hnorm] + have ha : Associated + (((-1 : ℤ_[p]) ^ B.dim) * (p : ℤ_[p])) (p : ℤ_[p]) := + associated_unit_mul_left _ _ (isUnit_neg_one.pow _) + exact ha.symm.irreducible PadicInt.irreducible_p + let : IsLocalHom (Algebra.norm ℤ_[p] : A →* ℤ_[p]) := + ⟨fun y hy => (padicCyclotomicTotallyRamified_norm_isUnit_iff y).mp hy⟩ + have hirrGen : Irreducible B.gen := hirrNorm.of_map + have hirrNegGen : Irreducible (-B.gen) := by + have ha : Associated (-B.gen) B.gen := + (Associated.refl B.gen).neg_left + exact ha.symm.irreducible hirrGen + have hprimeNegGen : Prime (-B.gen) := hirrNegGen.prime + apply (MulEquiv.prime_iff e).mp + convert hprimeNegGen using 1 + apply Subtype.ext + simp [e, padicCyclotomicTotallyRamifiedOneSubPrimitiveRootInteger, B, + Algebra.adjoin.powerBasis'_gen, α, Aζ, A] + +end CyclotomicExtension + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/RamificationIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/RamificationIndex.lean new file mode 100644 index 0000000000..994bb6a483 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/RamificationIndex.lean @@ -0,0 +1,206 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.ValuationRingEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal +/-! +# The ramification index of the totally ramified cyclotomic extension + +This file maps the Eisenstein unit relation into the target valuation ring and proves `e = [L : + ℚ_[p]]`, together with the uniformizer statement. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.ValuedExtension renaming + target_maximalIdeal_pow_not_le_pow_succ → + target_maximalIdeal_pow_not_le_pow_succ + + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +open Polynomial +open ValuationTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open scoped Polynomial + +universe u + +section CyclotomicExtension + +variable {p k : ℕ} [Fact p.Prime] +variable {L : Type u} [Field L] [Algebra ℚ_[p] L] + +/-- The `ℤ_[p]`-algebra on the cyclotomic extension is induced through `ℚ_[p]`. -/ +local instance padicCyclotomicTotallyRamifiedRamificationIndexAlgebraPadicInt : Algebra ℤ_[p] L := + ((algebraMap ℚ_[p] L).comp (algebraMap ℤ_[p] ℚ_[p])).toAlgebra + +local instance padicCyclotomicTotallyRamifiedRamificationIndexScalarTowerPadicInt : + IsScalarTower ℤ_[p] ℚ_[p] L := + IsScalarTower.of_algebraMap_eq' rfl + +/-- The ideal-theoretic core of the totally ramified cyclotomic theorem(i): for the actual +integral-closure valuation, `1 - ζ` is a uniformizer and the Eisenstein +relation forces the ramification index to equal the field degree. -/ +theorem padicCyclotomicTotallyRamified_uniformizer_and_ramificationIndex_eq_degree + (ζ : L) (hζ : IsPrimitiveRoot ζ (p ^ (k + 1))) + (hgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) + [FiniteDimensional ℚ_[p] L] [Algebra.IsSeparable ℚ_[p] L] + (target : CompleteDVF.{u, 0} L) + [hExt : (padicCompleteDVF p).valuation.HasExtension + target.valuation] + [hTarget : IsIntegralClosure target.valuationSubring + (padicCompleteDVF p).valuationSubring L] : + target.valuation.IsUniformizer (1 - ζ) ∧ + ValuedExtension.ramificationIndex + (padicCompleteDVF p).toDVF target.toDVF = + ValuedExtension.degree + (padicCompleteDVF p).toDVF target.toDVF := by + let n := p ^ (k + 1) + let d := Nat.totient n + let α : L := ζ - 1 + let Aζ := Algebra.adjoin ℤ_[p] ({ζ} : Set L) + let A := Algebra.adjoin ℤ_[p] ({α} : Set L) + let a : A := ⟨α, Algebra.self_mem_adjoin_singleton ℤ_[p] α⟩ + have hadjoin : Aζ = A := by + simpa [Aζ, A, α] using + (padicCyclotomicTotallyRamified_adjoin_sub_one_eq_adjoin ζ).symm + let eζα : Aζ ≃+* A := (Subalgebra.equivOfEq Aζ A hadjoin).toRingEquiv + have hprimeβ : Prime (padicCyclotomicTotallyRamifiedOneSubPrimitiveRootInteger (p := p) ζ) := + padicCyclotomicTotallyRamified_one_sub_primitiveRoot_prime ζ hζ hgen + have hprimeNegA : Prime (-a) := by + have hmapped : Prime + (eζα (padicCyclotomicTotallyRamifiedOneSubPrimitiveRootInteger (p := p) ζ)) := + (MulEquiv.prime_iff eζα).2 hprimeβ + convert hmapped using 1 + apply Subtype.ext + simp [eζα, padicCyclotomicTotallyRamifiedOneSubPrimitiveRootInteger, a, α, Aζ, A] + have hirrA : Irreducible a := by + have hassoc : Associated (-a) a := + (Associated.refl a).neg_left + exact hassoc.irreducible hprimeNegA.irreducible + obtain ⟨y, hyu, hy⟩ := + padicCyclotomicTotallyRamified_exists_unit_mul_p_eq_sub_one_pow ζ hζ hgen + change algebraMap ℤ_[p] A (p : ℤ_[p]) * y = a ^ d at hy + have hdDegree : d = Module.finrank ℚ_[p] L := by + exact (padicCyclotomicTotallyRamified_finrank_eq_totient ζ hζ hgen).symm + let base := padicCompleteDVF p + let V := base.valuationSubring + let : Algebra V L := Algebra.ofSubsemiring base.valuation.valuationSubring + let : IsScalarTower V ℚ_[p] L := IsScalarTower.of_algebraMap_eq' rfl + let eZV : ℤ_[p] ≃+* V := + padicIntEquivValuationSubring p + let : IsIntegralClosure target.valuationSubring V L := by + simpa [V] using hTarget + let : IsScalarTower V target.valuationSubring L := by + apply IsScalarTower.of_algebraMap_eq + intro x + rfl + obtain ⟨q, hq⟩ := + padicCyclotomicTotallyRamified_exists_adjoin_sub_one_equiv_valuationSubring + ζ hζ hgen target + change A ≃+* target.valuationSubring at q + change ∀ z : A, algebraMap target.valuationSubring L (q z) = + algebraMap A L z at hq + let ϖ : V := eZV (p : ℤ_[p]) + have hϖirr : Irreducible ϖ := + (MulEquiv.irreducible_iff eZV).2 PadicInt.irreducible_p + have hϖ : base.valuation.IsUniformizer (ϖ : ℚ_[p]) := + base.valuation.isUniformizer_of_maximalIdeal_eq_span hϖirr.maximalIdeal_eq + let π : target.valuationSubring := q a + have hπirr : Irreducible π := + (MulEquiv.irreducible_iff q).2 hirrA + have hπ : target.valuation.IsUniformizer (π : L) := + target.valuation.isUniformizer_of_maximalIdeal_eq_span hπirr.maximalIdeal_eq + have hπcoe : (π : L) = ζ - 1 := by + calc + (π : L) = algebraMap A L a := hq a + _ = ζ - 1 := rfl + have hone : target.valuation.IsUniformizer (1 - ζ) := by + rw [show 1 - ζ = -(ζ - 1) by ring, ← hπcoe] + simpa [Valuation.IsUniformizer] using hπ + have hpmap : q (algebraMap ℤ_[p] A (p : ℤ_[p])) = + ValuedExtension.integerMap + base.toDVF target.toDVF ϖ := by + apply Subtype.ext + change algebraMap target.valuationSubring L + (q (algebraMap ℤ_[p] A (p : ℤ_[p]))) = + algebraMap target.valuationSubring L + (ValuedExtension.integerMap + base.toDVF target.toDVF ϖ) + rw [hq] + rfl + have hyq := congrArg q hy + simp only [map_mul, map_pow] at hyq + have hassocQ : Associated + (q (algebraMap ℤ_[p] A (p : ℤ_[p]))) ((q a) ^ d) := by + refine ⟨(hyu.map q).unit, ?_⟩ + simpa using hyq + have ha : Associated + (ValuedExtension.integerMap + base.toDVF target.toDVF ϖ) + (π ^ d) := by + rw [← hpmap] + exact hassocQ + have hmapT : Ideal.map + (ValuedExtension.integerMap + base.toDVF target.toDVF) + base.maximalIdeal = + target.maximalIdeal ^ d := by + calc + _ = Ideal.span + ({ValuedExtension.integerMap + base.toDVF target.toDVF ϖ} : + Set target.valuationSubring) := by + rw [base.maximalIdeal_eq_span_uniformizer hϖ, Ideal.map_span, + Set.image_singleton] + _ = Ideal.span ({π ^ d} : Set target.valuationSubring) := + (Ideal.span_singleton_eq_span_singleton).2 ha + _ = (Ideal.span ({π} : Set target.valuationSubring)) ^ d := by + rw [Ideal.span_singleton_pow] + _ = target.maximalIdeal ^ d := by + rw [← target.maximalIdeal_eq_span_uniformizer hπ] + have hnot : ¬ Ideal.map + (ValuedExtension.integerMap base.toDVF target.toDVF) + base.maximalIdeal ≤ target.maximalIdeal ^ (d + 1) := by + rw [hmapT] + exact + target_maximalIdeal_pow_not_le_pow_succ + target hπ d + have he : + ValuedExtension.ramificationIndex + base.toDVF target.toDVF = d := by + rw [ValuedExtension.ramificationIndex] + apply Ideal.ramificationIdx'_spec + · simpa [ValuedExtension.integerMap] using hmapT.le + · simpa [ValuedExtension.integerMap] using hnot + have hramDegree : + ValuedExtension.ramificationIndex + base.toDVF target.toDVF = + ValuedExtension.degree + base.toDVF target.toDVF := by + calc + ValuedExtension.ramificationIndex + base.toDVF target.toDVF = d := he + _ = Module.finrank ℚ_[p] L := hdDegree + _ = ValuedExtension.degree + base.toDVF target.toDVF := + (ValuedExtension.degree_eq_finrank + base.toDVF target.toDVF).symm + exact ⟨hone, hramDegree⟩ + +end CyclotomicExtension + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/ValuationRingEquiv.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/ValuationRingEquiv.lean new file mode 100644 index 0000000000..928f9e6c0b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/ValuationRingEquiv.lean @@ -0,0 +1,125 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralTranslate +/-! +# The valuation-ring equivalence for the totally ramified cyclotomic extension + +This file constructs the concrete equivalence from `ℤ_[p][ζ - 1]` to the actual valuation subring. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +open Polynomial +open scoped Polynomial + +universe u + +section CyclotomicExtension + +variable {p k : ℕ} [Fact p.Prime] +variable {L : Type u} [Field L] [Algebra ℚ_[p] L] + +/-- The `ℤ_[p]`-algebra on the cyclotomic extension is induced through `ℚ_[p]`. -/ +local instance padicCyclotomicTotallyRamifiedValuationRingEquivAlgebraPadicInt : Algebra ℤ_[p] L := + ((algebraMap ℚ_[p] L).comp (algebraMap ℤ_[p] ℚ_[p])).toAlgebra + +local instance padicCyclotomicTotallyRamifiedValuationRingEquivScalarTowerPadicInt : + IsScalarTower ℤ_[p] ℚ_[p] L := + IsScalarTower.of_algebraMap_eq' rfl + +/-- The concrete ring `ℤ_[p][ζ - 1]` is canonically equivalent to the +valuation subring in the actual-integral-closure complete-DVF model, and the +equivalence preserves the represented element of `L`. -/ +theorem padicCyclotomicTotallyRamified_exists_adjoin_sub_one_equiv_valuationSubring + (ζ : L) (hζ : IsPrimitiveRoot ζ (p ^ (k + 1))) + (hgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) + (target : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} L) + [hExt : (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).valuation.HasExtension + target.valuation] + [hTarget : IsIntegralClosure target.valuationSubring + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuationSubring L] : + ∃ q : Algebra.adjoin ℤ_[p] ({ζ - 1} : Set L) ≃+* + target.valuationSubring, + ∀ z, algebraMap target.valuationSubring L (q z) = + algebraMap (Algebra.adjoin ℤ_[p] ({ζ - 1} : Set L)) L z := by + let A := Algebra.adjoin ℤ_[p] ({ζ - 1} : Set L) + let Aζ := Algebra.adjoin ℤ_[p] ({ζ} : Set L) + have hA : A = Aζ := by + simpa [A, Aζ] using padicCyclotomicTotallyRamified_adjoin_sub_one_eq_adjoin ζ + let eTranslate : A ≃+* Aζ := + (Subalgebra.equivOfEq A Aζ hA).toRingEquiv + let base := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p + let V := base.valuationSubring + let : Algebra V L := Algebra.ofSubsemiring base.valuation.valuationSubring + let : IsScalarTower V ℚ_[p] L := IsScalarTower.of_algebraMap_eq' rfl + let : IsIntegralClosure target.valuationSubring V L := by + simpa [V, base] using hTarget + let : IsScalarTower V target.valuationSubring L := by + apply IsScalarTower.of_algebraMap_eq + intro x + rfl + let : IsIntegralClosure Aζ ℤ_[p] L := by + simpa [Aζ] using padicCyclotomicTotallyRamified_isIntegralClosure_adjoin ζ hζ hgen + let eZV : ℤ_[p] ≃+* V := + LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicIntEquivValuationSubring p + have heZV : (algebraMap V L).comp eZV.toRingHom = algebraMap ℤ_[p] L := by + ext z + rfl + let eIC : integralClosure ℤ_[p] L ≃+* integralClosure V L := + { toFun := fun z => ⟨z.1, (eZV.isIntegral_iff heZV z.1).mp z.2⟩ + invFun := fun z => ⟨z.1, (eZV.isIntegral_iff heZV z.1).mpr z.2⟩ + left_inv := fun _ => rfl + right_inv := fun _ => rfl + map_mul' := fun _ _ => rfl + map_add' := fun _ _ => rfl } + let eAζ : Aζ ≃+* integralClosure ℤ_[p] L := + (IsIntegralClosure.equiv ℤ_[p] Aζ L + (integralClosure ℤ_[p] L)).toRingEquiv + let eTarget : integralClosure V L ≃+* target.valuationSubring := + (IsIntegralClosure.equiv V (integralClosure V L) L + target.valuationSubring).toRingEquiv + let q : A ≃+* target.valuationSubring := + eTranslate.trans (eAζ.trans (eIC.trans eTarget)) + refine ⟨q, ?_⟩ + intro z + have heAζ : + algebraMap (integralClosure ℤ_[p] L) L (eAζ (eTranslate z)) = + algebraMap Aζ L (eTranslate z) := + IsIntegralClosure.algebraMap_equiv ℤ_[p] Aζ L + (integralClosure ℤ_[p] L) (eTranslate z) + have heTarget : + algebraMap target.valuationSubring L + (eTarget (eIC (eAζ (eTranslate z)))) = + algebraMap (integralClosure V L) L (eIC (eAζ (eTranslate z))) := + IsIntegralClosure.algebraMap_equiv V (integralClosure V L) L + target.valuationSubring (eIC (eAζ (eTranslate z))) + calc + algebraMap target.valuationSubring L (q z) = + algebraMap target.valuationSubring L + (eTarget (eIC (eAζ (eTranslate z)))) := rfl + _ = algebraMap (integralClosure V L) L + (eIC (eAζ (eTranslate z))) := heTarget + _ = algebraMap (integralClosure ℤ_[p] L) L + (eAζ (eTranslate z)) := rfl + _ = algebraMap Aζ L (eTranslate z) := heAζ + _ = algebraMap A L z := rfl + +end CyclotomicExtension + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified.lean new file mode 100644 index 0000000000..f61bd21e5c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified.lean @@ -0,0 +1,12 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.Unramified.ArithmeticFrobenius + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean new file mode 100644 index 0000000000..8c1188280f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean @@ -0,0 +1,1758 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChangeCore +public import Mathlib.FieldTheory.IntermediateField.Adjoin.Basic +public import Mathlib.RingTheory.IntegralClosure.IsIntegralClosure.Basic +public import Mathlib.RingTheory.Polynomial.Cyclotomic.Factorization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv +/-! +# Arithmetic Frobenius on the unramified cyclotomic extension + +Let `K` be a complete discretely valued field with finite residue field +`k = F_q`, let `ζ` be a primitive `n`-th root of unity, and suppose that `n` +is prime to the residue characteristic. the unramified cyclotomic theorem states that +`K(ζ) / K` is unramified of degree the order of `q` modulo `n`, identifies +its Galois group with the residue Galois group and arithmetic Frobenius, and +proves `O_{K(ζ)} = O_K[ζ]`. + +The proof follows the arithmetic construction directly and uses no comparison certificate: + +* the exact least-positive-exponent characterization of the order of `q` + modulo `n`; +* the cyclotomic polynomial as the primitive separable integral model in the + the unramified base-change theorem Hensel core, giving unramifiedness and the degree formula; +* the canonical reduction homomorphism from field automorphisms to residue + automorphisms, with injectivity from uniqueness of simple Hensel lifts and + surjectivity from the genuine Galois cardinalities; +* arithmetic Frobenius, its formula `ζ ↦ ζ^q`, and generation of the Galois + group; +* the reverse integral-ring inclusion by residue generation, ramification + index one, and Nakayama, yielding `O_{K(ζ)} = O_K[ζ]`. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace AlgebraicNumberTheory +namespace Valuations + +open Polynomial ZMod + + +/-- The integer `f` in the unramified cyclotomic theorem: the multiplicative order of the +residue cardinality `q` modulo `n`. -/ +def padicCyclotomicUnramifiedResidueDegree (n q : ℕ) (hqn : q.Coprime n) : ℕ := + orderOf (ZMod.unitOfCoprime q hqn) + +theorem padicCyclotomicUnramifiedResidueDegree_pos + (n q : ℕ) (hqn : q.Coprime n) : + 0 < padicCyclotomicUnramifiedResidueDegree n q hqn := by + exact orderOf_pos _ + +/-- The defining exponent satisfies `q^f = 1 mod n`. -/ +theorem padicCyclotomicUnramifiedResidueDegree_modEq_one + (n q : ℕ) (hqn : q.Coprime n) : + q ^ padicCyclotomicUnramifiedResidueDegree n q hqn ≡ 1 [MOD n] := by + have hpow := pow_orderOf_eq_one (ZMod.unitOfCoprime q hqn) + have hval := congrArg Units.val hpow + rw [Units.val_pow_eq_pow_val, coe_unitOfCoprime, Units.val_one, + ← Nat.cast_pow, ← Nat.cast_one, ZMod.natCast_eq_natCast_iff] at hval + exact hval + +/-- Minimality of the exponent in the unramified cyclotomic theorem. -/ +theorem padicCyclotomicUnramifiedResidueDegree_le_of_modEq_one + (n q : ℕ) (hqn : q.Coprime n) {m : ℕ} + (hm : 0 < m) (hqm : q ^ m ≡ 1 [MOD n]) : + padicCyclotomicUnramifiedResidueDegree n q hqn ≤ m := by + apply orderOf_le_of_pow_eq_one hm + apply Units.ext + rw [Units.val_pow_eq_pow_val, coe_unitOfCoprime, Units.val_one, + ← Nat.cast_pow, ← Nat.cast_one, ZMod.natCast_eq_natCast_iff] + exact hqm + +/-- Literal least-positive-natural-number formulation of the degree in +the unramified cyclotomic theorem(i). -/ +theorem padicCyclotomicUnramifiedResidueDegree_isLeast + (n q : ℕ) (hqn : q.Coprime n) : + 0 < padicCyclotomicUnramifiedResidueDegree n q hqn ∧ + q ^ padicCyclotomicUnramifiedResidueDegree n q hqn ≡ 1 [MOD n] ∧ + ∀ m : ℕ, 0 < m → q ^ m ≡ 1 [MOD n] → + padicCyclotomicUnramifiedResidueDegree n q hqn ≤ m := by + exact + ⟨padicCyclotomicUnramifiedResidueDegree_pos n q hqn, + padicCyclotomicUnramifiedResidueDegree_modEq_one n q hqn, + fun _ hm hqm ↦ + padicCyclotomicUnramifiedResidueDegree_le_of_modEq_one n q hqn hm hqm⟩ + + +/-- A root of unity is integral over any coefficient ring acting on its +ambient field. This is the element-level source for the unramified cyclotomic theorem(iii). -/ +theorem padicCyclotomicUnramified_primitiveRoot_isIntegral + {R : Type u} {L : Type v} [CommRing R] [Field L] [Algebra R L] + {n : ℕ} {ζ : L} (hn : 0 < n) (hζ : IsPrimitiveRoot ζ n) : + IsIntegral R ζ := by + apply IsIntegral.of_pow hn + rw [hζ.pow_eq_one] + exact isIntegral_one + +/-- Turn a literal equality with the integral closure into the standard +`IsIntegralClosure` instance. -/ +private theorem padicCyclotomicUnramified_isIntegralClosure_of_subring_eq + {K L : Type*} [Field K] [Field L] + (V : Subring K) (W : Subring L) [Algebra V L] + (h : W = (integralClosure V L).toSubring) : + IsIntegralClosure W V L := by + refine + { algebraMap_injective := W.subtype_injective + isIntegral_iff := ?_ } + intro x + constructor + · intro hx + have hxW : x ∈ W := by + rw [h] + exact hx + exact ⟨⟨x, hxW⟩, rfl⟩ + · rintro ⟨y, rfl⟩ + change (y : L) ∈ (integralClosure V L).toSubring + rw [← h] + exact y.property + +/-- Two simple roots over a local domain which have the same residue class +are equal. This is the uniqueness half of Hensel's lemma, in the small +generality needed for the residue-action comparisons below and in the +generic unramified support lemma for the unramified cyclotomic theorem. -/ +theorem padicCyclotomicUnramified_eq_of_roots_of_residue_eq_of_derivative_isUnit + {R : Type*} [CommRing R] [IsDomain R] [IsLocalRing R] + {f : R[X]} {a b : R} + (ha : f.IsRoot a) (hb : f.IsRoot b) + (hres : IsLocalRing.residue R b = IsLocalRing.residue R a) + (hderiv : IsUnit (f.derivative.eval a)) : + b = a := by + let q : R[X] := f /ₘ (X - C a) + have hfactor : (X - C a) * q = f := by + dsimp [q] + rw [Polynomial.mul_divByMonic_eq_iff_isRoot] + exact ha + have hqEval : q.eval a = f.derivative.eval a := by + simpa [q] using + ValuationTheory.DiscreteValuationField.divByMonic_X_sub_C_eval_eq_derivative_eval f a + have hqUnit : IsUnit (q.eval a) := by + simpa [hqEval] using hderiv + have hqResidue : + IsLocalRing.residue R (q.eval b) = + IsLocalRing.residue R (q.eval a) := by + calc + IsLocalRing.residue R (q.eval b) = + (q.map (IsLocalRing.residue R)).eval + (IsLocalRing.residue R b) := by + exact (Polynomial.eval_map_apply + (f := IsLocalRing.residue R) (p := q) b).symm + _ = (q.map (IsLocalRing.residue R)).eval + (IsLocalRing.residue R a) := by rw [hres] + _ = IsLocalRing.residue R (q.eval a) := by + exact Polynomial.eval_map_apply + (f := IsLocalRing.residue R) (p := q) a + have hqResidueNe : IsLocalRing.residue R (q.eval b) ≠ 0 := by + rw [hqResidue] + exact (IsLocalRing.residue_ne_zero_iff_isUnit (q.eval a)).2 hqUnit + have hqNe : q.eval b ≠ 0 := by + intro hzero + exact hqResidueNe (by rw [hzero, map_zero]) + have hmul : (b - a) * q.eval b = 0 := by + have hbEval : ((X - C a) * q).eval b = 0 := by + rw [hfactor] + exact Polynomial.IsRoot.def.mp hb + simpa [Polynomial.eval_mul, Polynomial.eval_sub] using hbEval + exact sub_eq_zero.mp ((mul_eq_zero.mp hmul).resolve_right hqNe) + +section CanonicalResidueAction + +variable {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] +variable [FiniteDimensional K L] + +/-- Restriction of a `K`-automorphism to the target valuation ring. The +target ring is the integral closure of the Henselian base valuation ring, so +this restriction is canonical. -/ +noncomputable def padicCyclotomicUnramifiedGalIntegerRingEquiv + (vK : LubinTate.Valuations.ExponentialValuation K) (vL : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ x : K, vL (algebraMap K L x) = vK x) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK).valuation) + (σ : Gal(L/K)) : + LubinTate.Valuations.exponentialValuationSubring vL ≃+* + LubinTate.Valuations.exponentialValuationSubring vL := by + let Vv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK + let Wv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vL + let V := LubinTate.Valuations.exponentialValuationSubring vK + let W := LubinTate.Valuations.exponentialValuationSubring vL + let algVL : Algebra V L := + ((algebraMap K L).comp V.subtype).toAlgebra + letI : Algebra V L := algVL + letI : SMul V L := algVL.toSMul + letI : Module V L := algVL.toModule + letI : IsScalarTower V K L := IsScalarTower.of_algebraMap_eq + (R := V) (S := K) (A := L) (by intro; rfl) + letI : Algebra.IsAlgebraic K L := Algebra.IsAlgebraic.of_finite K L + have hclosureVv : + Wv.toSubring = (integralClosure Vv L).toSubring := + exponentialValuationSubring_eq_integralClosure_of_henselian + vK vL hExt hhens + have hclosure : W = (integralClosure V L).toSubring := by + change Wv.toSubring = (integralClosure Vv L).toSubring + exact hclosureVv + letI : IsIntegralClosure W V L := by + exact padicCyclotomicUnramified_isIntegralClosure_of_subring_eq V W hclosure + have hmem (τ : Gal(L/K)) (x : W) : τ (x : L) ∈ W := by + have hx : IsIntegral V (x : L) := + (IsIntegralClosure.isIntegral_iff + (A := W) (R := V) (B := L)).2 ⟨x, rfl⟩ + have hτ : IsIntegral V (τ (x : L)) := + IsIntegral.map τ.toAlgHom hx + rcases (IsIntegralClosure.isIntegral_iff + (A := W) (R := V) (B := L)).1 hτ with ⟨y, hy⟩ + exact hy ▸ y.property + exact + { toFun := fun x ↦ ⟨σ (x : L), hmem σ x⟩ + invFun := fun x ↦ ⟨σ.symm (x : L), hmem σ.symm x⟩ + left_inv := by intro x; ext; simp + right_inv := by intro x; ext; simp + map_mul' := by intro x y; ext; simp + map_add' := by intro x y; ext; simp } + +@[simp] +theorem padicCyclotomicUnramified_galIntegerRingEquiv_apply + (vK : LubinTate.Valuations.ExponentialValuation K) (vL : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ x : K, vL (algebraMap K L x) = vK x) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK).valuation) + (σ : Gal(L/K)) (x : LubinTate.Valuations.exponentialValuationSubring vL) : + ((padicCyclotomicUnramifiedGalIntegerRingEquiv + vK vL hExt hhens σ x : LubinTate.Valuations.exponentialValuationSubring vL) : L) = + σ (x : L) := + rfl + +/-- The residue field attached to an exponential valuation. -/ +abbrev padicCyclotomicUnramifiedResidueField {F : Type*} [Field F] + (vF : LubinTate.Valuations.ExponentialValuation F) := + IsLocalRing.ResidueField (LubinTate.Valuations.exponentialValuationSubring vF) + +/-- The canonical residue-field algebra structure of a valuation extension. -/ +@[reducible] noncomputable def padicCyclotomicUnramifiedResidueAlgebra + (vK : LubinTate.Valuations.ExponentialValuation K) (vL : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ x : K, vL (algebraMap K L x) = vK x) : + Algebra (padicCyclotomicUnramifiedResidueField vK) + (padicCyclotomicUnramifiedResidueField vL) := by + let i := unramifiedValuationRingValuationRingMap vK vL hExt + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom vK vL hExt + exact (IsLocalRing.ResidueField.map i).toAlgebra + +/-- Finite-dimensionality of the residue extension, transported to the +module structure induced by `padicCyclotomicUnramifiedResidueAlgebra`. -/ +theorem padicCyclotomicUnramified_residueFiniteDimensional + (vK : LubinTate.Valuations.ExponentialValuation K) + (vL : LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ x : K, vL (algebraMap K L x) = vK x) : + letI : Algebra (padicCyclotomicUnramifiedResidueField vK) + (padicCyclotomicUnramifiedResidueField vL) := + padicCyclotomicUnramifiedResidueAlgebra vK vL hExt + FiniteDimensional (padicCyclotomicUnramifiedResidueField vK) + (padicCyclotomicUnramifiedResidueField vL) := by + let V := LubinTate.Valuations.exponentialValuationSubring vK + let W := LubinTate.Valuations.exponentialValuationSubring vL + let i := unramifiedValuationRingValuationRingMap vK vL hExt + let : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom vK vL hExt + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + let : Algebra k ell := padicCyclotomicUnramifiedResidueAlgebra vK vL hExt + let algebraModule : Module k ell := + (inferInstance : Algebra k ell).toModule + let : Algebra V W := i.toAlgebra + let residueModule : Module k ell := + @IsLocalRing.ResidueField.instModule + V W _ _ _ _ (i.toAlgebra) inferInstance + have hfinite : + @FiniteDimensional k ell _ _ residueModule := + residueExtension_finiteDimensional_of_finiteDimensional + vK vL hExt + have hmodule : residueModule = algebraModule := by + apply Module.ext + funext r x + obtain ⟨r, rfl⟩ := IsLocalRing.residue_surjective r + obtain ⟨x, rfl⟩ := IsLocalRing.residue_surjective x + rfl + change @FiniteDimensional k ell _ _ algebraModule + rw [← hmodule] + exact hfinite + +omit [FiniteDimensional K L] in +/-- The residue degree uses the quotient-induced module structure; +this identifies it with the finrank for `padicCyclotomicUnramifiedResidueAlgebra`. -/ +theorem padicCyclotomicUnramified_exponentialResidueDegree_eq_finrank + (vK : LubinTate.Valuations.ExponentialValuation K) + (vL : LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ x : K, vL (algebraMap K L x) = vK x) : + letI : Algebra (padicCyclotomicUnramifiedResidueField vK) + (padicCyclotomicUnramifiedResidueField vL) := + padicCyclotomicUnramifiedResidueAlgebra vK vL hExt + exponentialResidueDegree vK vL hExt = + Module.finrank (padicCyclotomicUnramifiedResidueField vK) + (padicCyclotomicUnramifiedResidueField vL) := by + let V := LubinTate.Valuations.exponentialValuationSubring vK + let W := LubinTate.Valuations.exponentialValuationSubring vL + let i := exponentialValuationRingMap vK vL hExt + let : IsLocalHom i := + exponentialValuationRingMap_isLocalHom vK vL hExt + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + let : Algebra k ell := padicCyclotomicUnramifiedResidueAlgebra vK vL hExt + let algebraModule : Module k ell := + (inferInstance : Algebra k ell).toModule + let : Algebra V W := i.toAlgebra + let residueModule : Module k ell := + @IsLocalRing.ResidueField.instModule + V W _ _ _ _ (i.toAlgebra) inferInstance + have hmodule : residueModule = algebraModule := by + apply Module.ext + funext r x + obtain ⟨r, rfl⟩ := IsLocalRing.residue_surjective r + obtain ⟨x, rfl⟩ := IsLocalRing.residue_surjective x + rfl + change @Module.finrank k ell _ _ residueModule = + @Module.finrank k ell _ _ algebraModule + rw [hmodule] + +/-- A ring equivalence of a local extension which fixes the base ring induces +an algebra equivalence of residue fields. -/ +private theorem padicCyclotomicUnramified_residueMapEquiv_commutes + {R S : Type*} [CommRing R] [IsLocalRing R] + [CommRing S] [IsLocalRing S] + (i : R →+* S) [IsLocalHom i] (e : S ≃+* S) + (hfix : ∀ x : R, e (i x) = i x) : + letI : Algebra (IsLocalRing.ResidueField R) + (IsLocalRing.ResidueField S) := + (IsLocalRing.ResidueField.map i).toAlgebra + ∀ x : IsLocalRing.ResidueField R, + IsLocalRing.ResidueField.mapEquiv e (algebraMap + (IsLocalRing.ResidueField R) (IsLocalRing.ResidueField S) x) = + algebraMap (IsLocalRing.ResidueField R) + (IsLocalRing.ResidueField S) x := by + let : Algebra (IsLocalRing.ResidueField R) + (IsLocalRing.ResidueField S) := + (IsLocalRing.ResidueField.map i).toAlgebra + intro x + obtain ⟨y, rfl⟩ := Ideal.Quotient.mk_surjective x + change IsLocalRing.ResidueField.mapEquiv e + (IsLocalRing.ResidueField.map i (IsLocalRing.residue R y)) = + IsLocalRing.ResidueField.map i (IsLocalRing.residue R y) + rw [IsLocalRing.ResidueField.map_residue, + IsLocalRing.ResidueField.mapEquiv_apply, + IsLocalRing.ResidueField.map_residue] + exact congrArg (IsLocalRing.residue S) (hfix y) + +/-- The canonical action of `Gal(L/K)` on the residue extension. -/ +noncomputable def padicCyclotomicUnramifiedGalResidueAlgEquiv + (vK : LubinTate.Valuations.ExponentialValuation K) (vL : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ x : K, vL (algebraMap K L x) = vK x) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK).valuation) + (σ : Gal(L/K)) : + letI : Algebra (padicCyclotomicUnramifiedResidueField vK) + (padicCyclotomicUnramifiedResidueField vL) := + padicCyclotomicUnramifiedResidueAlgebra vK vL hExt + padicCyclotomicUnramifiedResidueField vL ≃ₐ[padicCyclotomicUnramifiedResidueField vK] + padicCyclotomicUnramifiedResidueField vL := by + let V := LubinTate.Valuations.exponentialValuationSubring vK + let W := LubinTate.Valuations.exponentialValuationSubring vL + let i := unramifiedValuationRingValuationRingMap vK vL hExt + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom vK vL hExt + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + letI : Algebra k ell := padicCyclotomicUnramifiedResidueAlgebra vK vL hExt + let eW := padicCyclotomicUnramifiedGalIntegerRingEquiv vK vL hExt hhens σ + let eell : ell ≃+* ell := IsLocalRing.ResidueField.mapEquiv eW + exact AlgEquiv.ofRingEquiv (f := eell) (by + apply padicCyclotomicUnramified_residueMapEquiv_commutes i eW + intro y + apply Subtype.ext + change σ (algebraMap K L (y : K)) = algebraMap K L (y : K) + exact σ.commutes (y : K)) + +@[simp] +theorem padicCyclotomicUnramified_galResidueAlgEquiv_residue + (vK : LubinTate.Valuations.ExponentialValuation K) (vL : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ x : K, vL (algebraMap K L x) = vK x) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK).valuation) + (σ : Gal(L/K)) (x : LubinTate.Valuations.exponentialValuationSubring vL) : + letI : Algebra (padicCyclotomicUnramifiedResidueField vK) + (padicCyclotomicUnramifiedResidueField vL) := + padicCyclotomicUnramifiedResidueAlgebra vK vL hExt + padicCyclotomicUnramifiedGalResidueAlgEquiv vK vL hExt hhens σ + (IsLocalRing.residue (LubinTate.Valuations.exponentialValuationSubring vL) x) = + IsLocalRing.residue (LubinTate.Valuations.exponentialValuationSubring vL) + (padicCyclotomicUnramifiedGalIntegerRingEquiv vK vL hExt hhens σ x) := by + simp only [padicCyclotomicUnramifiedGalResidueAlgEquiv, + AlgEquiv.ofRingEquiv_apply, + IsLocalRing.ResidueField.mapEquiv_apply, + IsLocalRing.ResidueField.map_residue] + rfl + +/-- The canonical residue action as a group homomorphism. -/ +noncomputable def padicCyclotomicUnramifiedGalToResidueGal + (vK : LubinTate.Valuations.ExponentialValuation K) (vL : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ x : K, vL (algebraMap K L x) = vK x) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK).valuation) : + letI : Algebra (padicCyclotomicUnramifiedResidueField vK) + (padicCyclotomicUnramifiedResidueField vL) := + padicCyclotomicUnramifiedResidueAlgebra vK vL hExt + Gal(L/K) →* + Gal(padicCyclotomicUnramifiedResidueField vL/padicCyclotomicUnramifiedResidueField vK) := by + let V := LubinTate.Valuations.exponentialValuationSubring vK + let W := LubinTate.Valuations.exponentialValuationSubring vL + let i := unramifiedValuationRingValuationRingMap vK vL hExt + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom vK vL hExt + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + letI : Algebra k ell := padicCyclotomicUnramifiedResidueAlgebra vK vL hExt + refine + { toFun := padicCyclotomicUnramifiedGalResidueAlgEquiv vK vL hExt hhens + map_one' := ?_ + map_mul' := ?_ } + · ext x + obtain ⟨y, rfl⟩ := Ideal.Quotient.mk_surjective x + change padicCyclotomicUnramifiedGalResidueAlgEquiv vK vL hExt hhens 1 + (IsLocalRing.residue W y) = IsLocalRing.residue W y + rw [padicCyclotomicUnramified_galResidueAlgEquiv_residue] + change IsLocalRing.residue W + (padicCyclotomicUnramifiedGalIntegerRingEquiv vK vL hExt hhens 1 y) = + IsLocalRing.residue W y + apply congrArg (IsLocalRing.residue W) + apply Subtype.ext + change (1 : Gal(L/K)) (y : L) = (y : L) + rfl + · intro σ τ + ext x + obtain ⟨y, rfl⟩ := Ideal.Quotient.mk_surjective x + change padicCyclotomicUnramifiedGalResidueAlgEquiv vK vL hExt hhens (σ * τ) + (IsLocalRing.residue W y) = + padicCyclotomicUnramifiedGalResidueAlgEquiv vK vL hExt hhens σ + (padicCyclotomicUnramifiedGalResidueAlgEquiv vK vL hExt hhens τ + (IsLocalRing.residue W y)) + rw [padicCyclotomicUnramified_galResidueAlgEquiv_residue] + change IsLocalRing.residue W + (padicCyclotomicUnramifiedGalIntegerRingEquiv vK vL hExt hhens (σ * τ) y) = _ + rw [padicCyclotomicUnramified_galResidueAlgEquiv_residue, + padicCyclotomicUnramified_galResidueAlgEquiv_residue] + apply congrArg (IsLocalRing.residue W) + apply Subtype.ext + change (σ * τ) (y : L) = σ (τ (y : L)) + rfl + +end CanonicalResidueAction + +/-- A field generated by a primitive root of unity is normal; together with +separability this gives the Galois input used in the unramified cyclotomic theorem(ii). -/ +theorem padicCyclotomicUnramified_isGalois_of_primitiveRoot_adjoin_eq_top + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [Algebra.IsSeparable K L] + {n : ℕ} {ζ : L} (hn : 0 < n) (hζ : IsPrimitiveRoot ζ n) + (hζgen : Algebra.adjoin K ({ζ} : Set L) = ⊤) : + IsGalois K L := by + let P : K[X] := X ^ n - C 1 + let : P.IsSplittingField K L := + { splits' := by + simpa [P] using Polynomial.X_pow_sub_one_splits hζ + adjoin_rootSet' := by + apply top_unique + rw [← hζgen] + apply Algebra.adjoin_mono + intro x hx + have hxζ : x = ζ := by simpa using hx + subst x + rw [Polynomial.mem_rootSet] + constructor + · exact (Polynomial.monic_X_pow_sub_C (1 : K) hn.ne').ne_zero + · rw [Polynomial.aeval_def, Polynomial.eval₂_sub, + Polynomial.eval₂_pow, Polynomial.eval₂_X, + Polynomial.eval₂_C] + simp [hζ.pow_eq_one] } + let : Normal K L := Normal.of_isSplittingField P + exact IsGalois.mk + +section FiniteResidueCyclotomic + +variable {k : Type u} {Ω : Type v} +variable [Field k] [Fintype k] [Field Ω] [Algebra k Ω] +variable {p r n : ℕ} [hp : Fact p.Prime] + +private theorem padicCyclotomicUnramified_order_pos (hpn : p.Coprime n) : 0 < n := by + apply Nat.pos_of_ne_zero + intro hn + have hnot : ¬p ∣ n := hp.out.coprime_iff_not_dvd.mp hpn + exact hnot (hn ▸ dvd_zero p) + +/-- Finite-field degree calculation underlying the unramified cyclotomic theorem(i). + +If `k` has cardinality `p^r` and `ζ` is a primitive `n`-th root in an +extension field, then the simple residue extension `k(ζ)` has degree equal +to the order of `p^r` modulo `n`. This is the irreducible-factor calculation +used after reducing the cyclotomic polynomial. -/ +theorem padicCyclotomicUnramified_residue_adjoin_finrank + (hk : Fintype.card k = p ^ r) (hpn : p.Coprime n) + {ζ : Ω} (hζ : IsPrimitiveRoot ζ n) : + Module.finrank k (IntermediateField.adjoin k ({ζ} : Set Ω)) = + padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) := by + have hn : 0 < n := padicCyclotomicUnramified_order_pos hpn + have hζint : IsIntegral k ζ := + padicCyclotomicUnramified_primitiveRoot_isIntegral hn hζ + have hdiv : minpoly k ζ ∣ cyclotomic n k := by + apply minpoly.dvd k ζ + simpa [aeval_def, eval₂_eq_eval_map, map_cyclotomic, IsRoot.def] using + hζ.isRoot_cyclotomic hn + rw [IntermediateField.adjoin.finrank hζint] + exact + Polynomial.natDegree_of_dvd_cyclotomic_of_irreducible + (p := p) (f := r) hk hpn hdiv (minpoly.irreducible hζint) + +omit hp in +/-- Arithmetic Frobenius on a finite residue extension acts by the `q`-th +power, with `q = p^r`. This is the action asserted in the unramified cyclotomic theorem(ii). -/ +theorem padicCyclotomicUnramified_residue_frobenius_apply + {ell : Type v} [Field ell] [Algebra k ell] + [Algebra.IsAlgebraic k ell] + (hk : Fintype.card k = p ^ r) (x : ell) : + FiniteField.frobeniusAlgEquivOfAlgebraic k ell x = x ^ (p ^ r) := by + change x ^ Fintype.card k = x ^ (p ^ r) + rw [hk] + +/-- For the residue cyclotomic field `k(ζ)`, arithmetic Frobenius generates +the full Galois group, and the number of powers needed is the least `f` from +the unramified cyclotomic theorem(i). -/ +theorem padicCyclotomicUnramified_residue_adjoin_galois_generated_by_frobenius + (hk : Fintype.card k = p ^ r) (hpn : p.Coprime n) + {ζ : Ω} (hζ : IsPrimitiveRoot ζ n) : + let ell := IntermediateField.adjoin k ({ζ} : Set Ω) + let hζint : IsIntegral k ζ := by + exact padicCyclotomicUnramified_primitiveRoot_isIntegral + (padicCyclotomicUnramified_order_pos hpn) hζ + letI : FiniteDimensional k ell := + IntermediateField.adjoin.finiteDimensional hζint + letI : Algebra.IsAlgebraic k ell := Algebra.IsAlgebraic.of_finite k ell + letI : Finite ell := Module.finite_of_finite k + let φ := FiniteField.frobeniusAlgEquivOfAlgebraic k ell + (∀ σ : Gal(ell/k), + ∃ i < padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r), + φ ^ i = σ) ∧ + ∀ x : ell, φ x = x ^ (p ^ r) := by + let ell := IntermediateField.adjoin k ({ζ} : Set Ω) + have hζint : IsIntegral k ζ := + padicCyclotomicUnramified_primitiveRoot_isIntegral + (padicCyclotomicUnramified_order_pos hpn) hζ + let : FiniteDimensional k ell := + IntermediateField.adjoin.finiteDimensional hζint + let : Algebra.IsAlgebraic k ell := Algebra.IsAlgebraic.of_finite k ell + let : Finite ell := Module.finite_of_finite k + let φ := FiniteField.frobeniusAlgEquivOfAlgebraic k ell + change + (∀ σ : Gal(ell/k), + ∃ i < padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r), + φ ^ i = σ) ∧ + ∀ x : ell, φ x = x ^ (p ^ r) + constructor + · intro σ + obtain ⟨i, hi⟩ := + (FiniteField.bijective_frobeniusAlgEquivOfAlgebraic_pow k ell).2 σ + refine ⟨i, ?_, hi⟩ + rw [← padicCyclotomicUnramified_residue_adjoin_finrank hk hpn hζ] + exact i.isLt + · intro x + exact padicCyclotomicUnramified_residue_frobenius_apply hk x + +end FiniteResidueCyclotomic + +section LocalCyclotomicUnramified + +variable {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] +variable [FiniteDimensional K L] + +/-- the unramified cyclotomic theorem(i), local Hensel step. + +For a Henselian exponential valuation with finite residue field of cardinality +`p^r`, adjoining a primitive `n`-th root of unity, with `p` prime to `n`, is a +finite unramified extension in the literal sense of the finite unramified-extension definition. The +primitive integral model used here is the cyclotomic polynomial itself; its +reduction is separable because `n` is nonzero in the residue field. -/ +theorem padicCyclotomicUnramified_finiteUnramifiedExtension + (vK : LubinTate.Valuations.ExponentialValuation K) (vL : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ x : K, vL (algebraMap K L x) = vK x) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK).valuation) + {p r n : ℕ} [hp : Fact p.Prime] + [Fintype (IsLocalRing.ResidueField + (LubinTate.Valuations.exponentialValuationSubring vK))] + (hk : Fintype.card (IsLocalRing.ResidueField + (LubinTate.Valuations.exponentialValuationSubring vK)) = p ^ r) + (hpn : p.Coprime n) {ζ : L} (hζ : IsPrimitiveRoot ζ n) + (hζgen : Algebra.adjoin K ({ζ} : Set L) = ⊤) : + FiniteUnramifiedExtension vK vL hExt := by + classical + let Vv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK + let Wv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vL + let V := LubinTate.Valuations.exponentialValuationSubring vK + let W := LubinTate.Valuations.exponentialValuationSubring vL + let k := IsLocalRing.ResidueField V + let i := unramifiedValuationRingValuationRingMap vK vL hExt + let : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom vK vL hExt + let algVW : Algebra V W := i.toAlgebra + let : Algebra V W := algVW + let algVL : Algebra V L := + ((algebraMap K L).comp V.subtype).toAlgebra + let : Algebra V L := algVL + let : Algebra.IsAlgebraic K L := Algebra.IsAlgebraic.of_finite K L + have hn : 0 < n := padicCyclotomicUnramified_order_pos hpn + have hclosureVv : + Wv.toSubring = (integralClosure Vv L).toSubring := + exponentialValuationSubring_eq_integralClosure_of_henselian + vK vL hExt hhens + have hclosure : W = (integralClosure V L).toSubring := by + change Wv.toSubring = (integralClosure Vv L).toSubring + exact hclosureVv + have hζIntegral : IsIntegral V ζ := + padicCyclotomicUnramified_primitiveRoot_isIntegral hn hζ + have hζmem : ζ ∈ W := by + rw [hclosure] + exact hζIntegral + let a : W := ⟨ζ, hζmem⟩ + let F : V[X] := cyclotomic n V + have hFmonic : F.Monic := by + exact Polynomial.cyclotomic.monic n V + have hFroot : + (F.map ((algebraMap K L).comp V.subtype)).eval (a : L) = 0 := by + change Polynomial.eval ζ + ((cyclotomic n V).map ((algebraMap K L).comp V.subtype)) = 0 + rw [map_cyclotomic] + exact hζ.isRoot_cyclotomic hn + let : CharP k p := charP_of_card_eq_prime_pow hk + have hnCast : (n : k) ≠ 0 := by + intro hzero + exact (hp.out.coprime_iff_not_dvd.mp hpn) + ((CharP.cast_eq_zero_iff k p n).mp hzero) + let : NeZero (n : k) := ⟨hnCast⟩ + have hFreduction : + (F.map (IsLocalRing.residue V)).Separable := by + simpa [F, k] using Polynomial.separable_cyclotomic n k + exact + finiteUnramifiedExtension_of_primitive_separable_integral_model + vK vL hExt hhens a F hFmonic hFroot hFreduction hζgen + +/-- the unramified cyclotomic theorem(i), degree calculation upstairs. + +The integral minimal polynomial of `ζ` has irreducible reduction by the +Hensel step of the factor-lifting criterion. That reduction is an irreducible factor of +the `n`-th cyclotomic polynomial over the finite residue field, so all of its +irreducible factors have degree `ord_n(p^r)`. -/ +theorem padicCyclotomicUnramified_finrank_eq_residueDegree + (vK : LubinTate.Valuations.ExponentialValuation K) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK).valuation) + {p r n : ℕ} [hp : Fact p.Prime] + [Fintype (IsLocalRing.ResidueField + (LubinTate.Valuations.exponentialValuationSubring vK))] + (hk : Fintype.card (IsLocalRing.ResidueField + (LubinTate.Valuations.exponentialValuationSubring vK)) = p ^ r) + (hpn : p.Coprime n) {ζ : L} (hζ : IsPrimitiveRoot ζ n) + (hζgen : Algebra.adjoin K ({ζ} : Set L) = ⊤) : + Module.finrank K L = + padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) := by + classical + let Vv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK + let V := LubinTate.Valuations.exponentialValuationSubring vK + let k := IsLocalRing.ResidueField V + let algVL : Algebra V L := + ((algebraMap K L).comp V.subtype).toAlgebra + let : Algebra V L := algVL + let : SMul V L := algVL.toSMul + let : Module V L := algVL.toModule + let : IsScalarTower V K L := IsScalarTower.of_algebraMap_eq + (R := V) (S := K) (A := L) (by intro; rfl) + let : IsFractionRing V K := by + change IsFractionRing Vv K + have hfr : IsFractionRing Vv.valuation.valuationSubring K := + (Valuation.valuationSubring.integers + (v := Vv.valuation)).isFractionRing + rw [Vv.valuationSubring_valuation] at hfr + exact hfr + let : IsIntegrallyClosed V := by + change IsIntegrallyClosed Vv + infer_instance + let : Module.IsTorsionFree V L := + Module.IsTorsionFree.trans_faithfulSMul V K L + have hn : 0 < n := padicCyclotomicUnramified_order_pos hpn + have hζIntegralV : IsIntegral V ζ := + padicCyclotomicUnramified_primitiveRoot_isIntegral hn hζ + have hζIntegralK : IsIntegral K ζ := + Algebra.IsIntegral.isIntegral (R := K) ζ + let G : V[X] := minpoly V ζ + let qbar : k[X] := G.map (IsLocalRing.residue V) + have hGmonic : G.Monic := minpoly.monic hζIntegralV + have hGfield : G.map (algebraMap V K) = minpoly K ζ := by + exact (minpoly.isIntegrallyClosed_eq_field_fractions' K hζIntegralV).symm + have hGirreducible : Irreducible (G.map (algebraMap V K)) := by + rw [hGfield] + exact minpoly.irreducible hζIntegralK + have hGdvd : G ∣ cyclotomic n V := by + apply minpoly.isIntegrallyClosed_dvd hζIntegralV + rw [Polynomial.aeval_def, Polynomial.eval₂_eq_eval_map] + change + ((cyclotomic n V).map ((algebraMap K L).comp V.subtype)).eval ζ = 0 + rw [map_cyclotomic] + exact hζ.isRoot_cyclotomic hn + have hqDvd : qbar ∣ cyclotomic n k := by + rcases hGdvd with ⟨H, hH⟩ + refine ⟨H.map (IsLocalRing.residue V), ?_⟩ + rw [← map_cyclotomic n (IsLocalRing.residue V), hH, + Polynomial.map_mul] + let : CharP k p := charP_of_card_eq_prime_pow hk + have hnCast : (n : k) ≠ 0 := by + intro hzero + exact (hp.out.coprime_iff_not_dvd.mp hpn) + ((CharP.cast_eq_zero_iff k p n).mp hzero) + let : NeZero (n : k) := ⟨hnCast⟩ + have hqSep : qbar.Separable := + (Polynomial.separable_cyclotomic n k).of_dvd hqDvd + have hhensV : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty Vv := by + change ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + Vv.valuation.valuationSubring at hhens + rw [Vv.valuationSubring_valuation] at hhens + exact hhens + have hqIrreducible : Irreducible qbar := + irreducible_residue_of_irreducible_of_separable_of_henselian + Vv hhensV hGmonic hGirreducible hqSep + have hfieldDegree : + Module.finrank K L = (minpoly K ζ).natDegree := by + have hAdjoin : + IntermediateField.adjoin K ({ζ} : Set L) = + (⊤ : IntermediateField K L) := + (IntermediateField.adjoin_eq_top_iff).2 hζgen + calc + Module.finrank K L = Module.finrank K + (IntermediateField.adjoin K ({ζ} : Set L)) := by + rw [hAdjoin] + simp + _ = (minpoly K ζ).natDegree := + IntermediateField.adjoin.finrank hζIntegralK + have hqDegree : qbar.natDegree = Module.finrank K L := by + calc + qbar.natDegree = G.natDegree := + hGmonic.natDegree_map (IsLocalRing.residue V) + _ = (G.map (algebraMap V K)).natDegree := by + rw [Polynomial.natDegree_map_eq_of_injective + (show Function.Injective (algebraMap V K) from + IsFractionRing.injective V K)] + _ = (minpoly K ζ).natDegree := by rw [hGfield] + _ = Module.finrank K L := hfieldDegree.symm + rw [← hqDegree] + exact + Polynomial.natDegree_of_dvd_cyclotomic_of_irreducible + (p := p) (f := r) hk hpn hqDvd hqIrreducible + +/-- The canonical reduction homomorphism on Galois groups is injective for +the prime-to-residue-characteristic cyclotomic extension. If two +automorphisms have the same residue action, their images of `ζ` are simple +roots of the cyclotomic polynomial with the same residue, hence are equal by +Hensel uniqueness; `ζ` generates the field. -/ +theorem padicCyclotomicUnramified_galToResidueGal_injective + (vK : LubinTate.Valuations.ExponentialValuation K) (vL : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ x : K, vL (algebraMap K L x) = vK x) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK).valuation) + {p r n : ℕ} [hp : Fact p.Prime] + [Fintype (padicCyclotomicUnramifiedResidueField vK)] + (hk : Fintype.card (padicCyclotomicUnramifiedResidueField vK) = p ^ r) + (hpn : p.Coprime n) {ζ : L} (hζ : IsPrimitiveRoot ζ n) + (hζgen : Algebra.adjoin K ({ζ} : Set L) = ⊤) : + letI : Algebra (padicCyclotomicUnramifiedResidueField vK) + (padicCyclotomicUnramifiedResidueField vL) := + padicCyclotomicUnramifiedResidueAlgebra vK vL hExt + Function.Injective (padicCyclotomicUnramifiedGalToResidueGal vK vL hExt hhens) := by + classical + let Vv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK + let Wv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vL + let V := LubinTate.Valuations.exponentialValuationSubring vK + let W := LubinTate.Valuations.exponentialValuationSubring vL + let i := unramifiedValuationRingValuationRingMap vK vL hExt + let : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom vK vL hExt + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + let : Algebra k ell := padicCyclotomicUnramifiedResidueAlgebra vK vL hExt + let algVL : Algebra V L := + ((algebraMap K L).comp V.subtype).toAlgebra + let : Algebra V L := algVL + let : SMul V L := algVL.toSMul + let : Module V L := algVL.toModule + let : IsScalarTower V K L := IsScalarTower.of_algebraMap_eq + (R := V) (S := K) (A := L) (by intro; rfl) + let : Algebra.IsAlgebraic K L := Algebra.IsAlgebraic.of_finite K L + have hclosureVv : + Wv.toSubring = (integralClosure Vv L).toSubring := + exponentialValuationSubring_eq_integralClosure_of_henselian + vK vL hExt hhens + have hclosure : W = (integralClosure V L).toSubring := by + change Wv.toSubring = (integralClosure Vv L).toSubring + exact hclosureVv + have hn : 0 < n := padicCyclotomicUnramified_order_pos hpn + have hζIntegral : IsIntegral V ζ := + padicCyclotomicUnramified_primitiveRoot_isIntegral hn hζ + have hζmem : ζ ∈ W := by + rw [hclosure] + exact hζIntegral + let a : W := ⟨ζ, hζmem⟩ + let F : W[X] := cyclotomic n W + let : CharP k p := charP_of_card_eq_prime_pow hk + have hnCast : (n : k) ≠ 0 := by + intro hzero + exact (hp.out.coprime_iff_not_dvd.mp hpn) + ((CharP.cast_eq_zero_iff k p n).mp hzero) + let : NeZero (n : k) := ⟨hnCast⟩ + let : NeZero (n : ell) := by + refine ⟨?_⟩ + intro hzero + apply hnCast + apply (algebraMap k ell).injective + calc + algebraMap k ell (n : k) = (n : ell) := map_natCast _ n + _ = 0 := hzero + _ = algebraMap k ell 0 := (map_zero _).symm + intro σ τ hστ + let bσ : W := + padicCyclotomicUnramifiedGalIntegerRingEquiv vK vL hExt hhens σ a + let bτ : W := + padicCyclotomicUnramifiedGalIntegerRingEquiv vK vL hExt hhens τ a + have hresEq : IsLocalRing.residue W bσ = IsLocalRing.residue W bτ := by + have happ := congrArg + (fun g : Gal(ell/k) ↦ g (IsLocalRing.residue W a)) hστ + change padicCyclotomicUnramifiedGalResidueAlgEquiv vK vL hExt hhens σ + (IsLocalRing.residue W a) = + padicCyclotomicUnramifiedGalResidueAlgEquiv vK vL hExt hhens τ + (IsLocalRing.residue W a) at happ + rw [padicCyclotomicUnramified_galResidueAlgEquiv_residue, + padicCyclotomicUnramified_galResidueAlgEquiv_residue] at happ + exact happ + have hσPrimitive : IsPrimitiveRoot (σ ζ) n := + hζ.map_of_injective σ.injective + have hτPrimitive : IsPrimitiveRoot (τ ζ) n := + hζ.map_of_injective τ.injective + have hσRoot : F.IsRoot bσ := by + apply W.subtype_injective + change W.subtype (F.eval bσ) = W.subtype 0 + rw [← Polynomial.eval_map_apply] + simpa [F, bσ] using hσPrimitive.isRoot_cyclotomic hn + have hτRoot : F.IsRoot bτ := by + apply W.subtype_injective + change W.subtype (F.eval bτ) = W.subtype 0 + rw [← Polynomial.eval_map_apply] + simpa [F, bτ] using hτPrimitive.isRoot_cyclotomic hn + have hτResidueRoot : + (cyclotomic n ell).IsRoot (IsLocalRing.residue W bτ) := by + have hmap := hτRoot.map (f := IsLocalRing.residue W) + simpa [F] using hmap + have hderivResidueNe : + IsLocalRing.residue W (F.derivative.eval bτ) ≠ 0 := by + have hsep := Polynomial.separable_cyclotomic n ell + have hne : + (cyclotomic n ell).derivative.eval + (IsLocalRing.residue W bτ) ≠ 0 := by + simpa [Polynomial.IsRoot.def] using + hsep.eval₂_derivative_ne_zero (RingHom.id ell) + (Polynomial.IsRoot.def.mp hτResidueRoot) + have hcompat : + IsLocalRing.residue W (F.derivative.eval bτ) = + (cyclotomic n ell).derivative.eval + (IsLocalRing.residue W bτ) := by + calc + IsLocalRing.residue W (F.derivative.eval bτ) = + (F.derivative.map (IsLocalRing.residue W)).eval + (IsLocalRing.residue W bτ) := by + exact (Polynomial.eval_map_apply + (f := IsLocalRing.residue W) (p := F.derivative) bτ).symm + _ = (cyclotomic n ell).derivative.eval + (IsLocalRing.residue W bτ) := by + rw [← Polynomial.derivative_map, show + F.map (IsLocalRing.residue W) = + cyclotomic n (IsLocalRing.ResidueField W) by simp [F]] + rw [hcompat] + exact hne + have hderivUnit : IsUnit (F.derivative.eval bτ) := + (IsLocalRing.residue_ne_zero_iff_isUnit _).1 hderivResidueNe + have hbEq : bσ = bτ := + padicCyclotomicUnramified_eq_of_roots_of_residue_eq_of_derivative_isUnit + hτRoot hσRoot hresEq hderivUnit + have hζEq : σ ζ = τ ζ := by + have hval := congrArg Subtype.val hbEq + simpa [bσ, bτ] using hval + apply AlgEquiv.ext + intro x + have hx : x ∈ Algebra.adjoin K ({ζ} : Set L) := by + rw [hζgen] + trivial + exact Algebra.adjoin_induction + (R := K) (A := L) (s := ({ζ} : Set L)) + (p := fun x _ ↦ σ x = τ x) + (fun y hy ↦ by + have hyζ : y = ζ := by simpa using hy + subst y + exact hζEq) + (fun y ↦ by + change σ (algebraMap K L y) = τ (algebraMap K L y) + rw [σ.commutes, τ.commutes]) + (fun x y _ _ hx hy ↦ by + rw [map_add, map_add, hx, hy]) + (fun x y _ _ hx hy ↦ by + rw [map_mul, map_mul, hx, hy]) hx + +/-- the unramified cyclotomic theorem(ii), canonical Galois comparison: the reduction +homomorphism is bijective. Injectivity is the Hensel-uniqueness argument +above; surjectivity follows by comparing the two genuine Galois group +cardinalities with the equal field and residue degrees from part (i). -/ +theorem padicCyclotomicUnramified_galToResidueGal_bijective + (vK : LubinTate.Valuations.ExponentialValuation K) (vL : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ x : K, vL (algebraMap K L x) = vK x) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK).valuation) + {p r n : ℕ} [hp : Fact p.Prime] + [Fintype (padicCyclotomicUnramifiedResidueField vK)] + (hk : Fintype.card (padicCyclotomicUnramifiedResidueField vK) = p ^ r) + (hpn : p.Coprime n) {ζ : L} (hζ : IsPrimitiveRoot ζ n) + (hζgen : Algebra.adjoin K ({ζ} : Set L) = ⊤) : + letI : Algebra (padicCyclotomicUnramifiedResidueField vK) + (padicCyclotomicUnramifiedResidueField vL) := + padicCyclotomicUnramifiedResidueAlgebra vK vL hExt + Function.Bijective + (padicCyclotomicUnramifiedGalToResidueGal vK vL hExt hhens) := by + let V := LubinTate.Valuations.exponentialValuationSubring vK + let W := LubinTate.Valuations.exponentialValuationSubring vL + let i := unramifiedValuationRingValuationRingMap vK vL hExt + let : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom vK vL hExt + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + let : Algebra k ell := padicCyclotomicUnramifiedResidueAlgebra vK vL hExt + let : FiniteDimensional k ell := + padicCyclotomicUnramified_residueFiniteDimensional vK vL hExt + let : Algebra.IsAlgebraic k ell := Algebra.IsAlgebraic.of_finite k ell + let : Finite ell := Module.finite_of_finite k + have hUnramified : FiniteUnramifiedExtension vK vL hExt := + padicCyclotomicUnramified_finiteUnramifiedExtension + vK vL hExt hhens hk hpn hζ hζgen + let : Algebra.IsSeparable K L := + finiteUnramifiedExtension_isSeparable_of_henselian + vK vL hExt hhens hUnramified + let : IsGalois K L := + padicCyclotomicUnramified_isGalois_of_primitiveRoot_adjoin_eq_top + (padicCyclotomicUnramified_order_pos hpn) hζ hζgen + let : IsGalois k ell := inferInstance + let : Fintype Gal(L/K) := Fintype.ofFinite Gal(L/K) + let : Fintype Gal(ell/k) := Fintype.ofFinite Gal(ell/k) + apply (Fintype.bijective_iff_injective_and_card + (padicCyclotomicUnramifiedGalToResidueGal vK vL hExt hhens)).2 + refine ⟨padicCyclotomicUnramified_galToResidueGal_injective + vK vL hExt hhens hk hpn hζ hζgen, ?_⟩ + rw [← Nat.card_eq_fintype_card, ← Nat.card_eq_fintype_card, + IsGalois.card_aut_eq_finrank, IsGalois.card_aut_eq_finrank] + exact hUnramified.2.trans + (padicCyclotomicUnramified_exponentialResidueDegree_eq_finrank vK vL hExt) + +/-- the unramified cyclotomic theorem(ii): the canonical multiplicative equivalence obtained +from reduction of valuation-ring automorphisms. -/ +noncomputable def padicCyclotomicUnramifiedGalEquivResidueGal + (vK : LubinTate.Valuations.ExponentialValuation K) (vL : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ x : K, vL (algebraMap K L x) = vK x) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK).valuation) + {p r n : ℕ} [hp : Fact p.Prime] + [Fintype (padicCyclotomicUnramifiedResidueField vK)] + (hk : Fintype.card (padicCyclotomicUnramifiedResidueField vK) = p ^ r) + (hpn : p.Coprime n) {ζ : L} (hζ : IsPrimitiveRoot ζ n) + (hζgen : Algebra.adjoin K ({ζ} : Set L) = ⊤) : + letI : Algebra (padicCyclotomicUnramifiedResidueField vK) + (padicCyclotomicUnramifiedResidueField vL) := + padicCyclotomicUnramifiedResidueAlgebra vK vL hExt + Gal(L/K) ≃* + Gal(padicCyclotomicUnramifiedResidueField vL/padicCyclotomicUnramifiedResidueField vK) := by + letI : Algebra (padicCyclotomicUnramifiedResidueField vK) + (padicCyclotomicUnramifiedResidueField vL) := + padicCyclotomicUnramifiedResidueAlgebra vK vL hExt + exact MulEquiv.ofBijective + (padicCyclotomicUnramifiedGalToResidueGal vK vL hExt hhens) + (padicCyclotomicUnramified_galToResidueGal_bijective + vK vL hExt hhens hk hpn hζ hζgen) + +/-- The arithmetic Frobenius in `Gal(K(ζ)/K)`, defined canonically as the +inverse image of finite-field Frobenius under the reduction equivalence. -/ +noncomputable def padicCyclotomicUnramifiedArithmeticFrobenius + (vK : LubinTate.Valuations.ExponentialValuation K) (vL : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ x : K, vL (algebraMap K L x) = vK x) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK).valuation) + {p r n : ℕ} [hp : Fact p.Prime] + [Fintype (padicCyclotomicUnramifiedResidueField vK)] + (hk : Fintype.card (padicCyclotomicUnramifiedResidueField vK) = p ^ r) + (hpn : p.Coprime n) {ζ : L} (hζ : IsPrimitiveRoot ζ n) + (hζgen : Algebra.adjoin K ({ζ} : Set L) = ⊤) : + Gal(L/K) := by + let k := padicCyclotomicUnramifiedResidueField vK + let ell := padicCyclotomicUnramifiedResidueField vL + letI : Algebra k ell := padicCyclotomicUnramifiedResidueAlgebra vK vL hExt + letI : FiniteDimensional k ell := + padicCyclotomicUnramified_residueFiniteDimensional vK vL hExt + letI : Algebra.IsAlgebraic k ell := Algebra.IsAlgebraic.of_finite k ell + exact + (padicCyclotomicUnramifiedGalEquivResidueGal + vK vL hExt hhens hk hpn hζ hζgen).symm + (FiniteField.frobeniusAlgEquivOfAlgebraic k ell) + +@[simp] +theorem padicCyclotomicUnramified_galEquivResidueGal_arithmeticFrobenius + (vK : LubinTate.Valuations.ExponentialValuation K) (vL : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ x : K, vL (algebraMap K L x) = vK x) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK).valuation) + {p r n : ℕ} [hp : Fact p.Prime] + [Fintype (padicCyclotomicUnramifiedResidueField vK)] + (hk : Fintype.card (padicCyclotomicUnramifiedResidueField vK) = p ^ r) + (hpn : p.Coprime n) {ζ : L} (hζ : IsPrimitiveRoot ζ n) + (hζgen : Algebra.adjoin K ({ζ} : Set L) = ⊤) : + letI : Algebra (padicCyclotomicUnramifiedResidueField vK) + (padicCyclotomicUnramifiedResidueField vL) := + padicCyclotomicUnramifiedResidueAlgebra vK vL hExt + letI : FiniteDimensional (padicCyclotomicUnramifiedResidueField vK) + (padicCyclotomicUnramifiedResidueField vL) := + padicCyclotomicUnramified_residueFiniteDimensional vK vL hExt + letI : Algebra.IsAlgebraic (padicCyclotomicUnramifiedResidueField vK) + (padicCyclotomicUnramifiedResidueField vL) := + Algebra.IsAlgebraic.of_finite _ _ + padicCyclotomicUnramifiedGalEquivResidueGal + vK vL hExt hhens hk hpn hζ hζgen + (padicCyclotomicUnramifiedArithmeticFrobenius + vK vL hExt hhens hk hpn hζ hζgen) = + FiniteField.frobeniusAlgEquivOfAlgebraic + (padicCyclotomicUnramifiedResidueField vK) + (padicCyclotomicUnramifiedResidueField vL) := by + simp [padicCyclotomicUnramifiedArithmeticFrobenius] + +/-- the unramified cyclotomic theorem(ii): arithmetic Frobenius sends the chosen primitive +root to its `q = p^r` power. Both sides are simple cyclotomic roots and their +residues agree by construction of Frobenius, so Hensel uniqueness identifies +them upstairs. -/ +theorem padicCyclotomicUnramifiedArithmeticFrobenius_apply_primitiveRoot + (vK : LubinTate.Valuations.ExponentialValuation K) (vL : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ x : K, vL (algebraMap K L x) = vK x) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK).valuation) + {p r n : ℕ} [hp : Fact p.Prime] + [Fintype (padicCyclotomicUnramifiedResidueField vK)] + (hk : Fintype.card (padicCyclotomicUnramifiedResidueField vK) = p ^ r) + (hpn : p.Coprime n) {ζ : L} (hζ : IsPrimitiveRoot ζ n) + (hζgen : Algebra.adjoin K ({ζ} : Set L) = ⊤) : + padicCyclotomicUnramifiedArithmeticFrobenius + vK vL hExt hhens hk hpn hζ hζgen ζ = ζ ^ (p ^ r) := by + classical + let Vv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK + let Wv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vL + let V := LubinTate.Valuations.exponentialValuationSubring vK + let W := LubinTate.Valuations.exponentialValuationSubring vL + let i := unramifiedValuationRingValuationRingMap vK vL hExt + let : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom vK vL hExt + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + let : Algebra k ell := padicCyclotomicUnramifiedResidueAlgebra vK vL hExt + let : FiniteDimensional k ell := + padicCyclotomicUnramified_residueFiniteDimensional vK vL hExt + let : Algebra.IsAlgebraic k ell := Algebra.IsAlgebraic.of_finite k ell + let algVL : Algebra V L := + ((algebraMap K L).comp V.subtype).toAlgebra + let : Algebra V L := algVL + let : SMul V L := algVL.toSMul + let : Module V L := algVL.toModule + let : IsScalarTower V K L := IsScalarTower.of_algebraMap_eq + (R := V) (S := K) (A := L) (by intro; rfl) + let : Algebra.IsAlgebraic K L := Algebra.IsAlgebraic.of_finite K L + have hclosureVv : + Wv.toSubring = (integralClosure Vv L).toSubring := + exponentialValuationSubring_eq_integralClosure_of_henselian + vK vL hExt hhens + have hclosure : W = (integralClosure V L).toSubring := by + change Wv.toSubring = (integralClosure Vv L).toSubring + exact hclosureVv + have hn : 0 < n := padicCyclotomicUnramified_order_pos hpn + have hζIntegral : IsIntegral V ζ := + padicCyclotomicUnramified_primitiveRoot_isIntegral hn hζ + have hζmem : ζ ∈ W := by + rw [hclosure] + exact hζIntegral + let a : W := ⟨ζ, hζmem⟩ + let φ : Gal(L/K) := + padicCyclotomicUnramifiedArithmeticFrobenius + vK vL hExt hhens hk hpn hζ hζgen + let b : W := padicCyclotomicUnramifiedGalIntegerRingEquiv + vK vL hExt hhens φ a + let c : W := a ^ (p ^ r) + let F : W[X] := cyclotomic n W + let : CharP k p := charP_of_card_eq_prime_pow hk + have hnCast : (n : k) ≠ 0 := by + intro hzero + exact (hp.out.coprime_iff_not_dvd.mp hpn) + ((CharP.cast_eq_zero_iff k p n).mp hzero) + let : NeZero (n : k) := ⟨hnCast⟩ + let : NeZero (n : ell) := by + refine ⟨?_⟩ + intro hzero + apply hnCast + apply (algebraMap k ell).injective + calc + algebraMap k ell (n : k) = (n : ell) := map_natCast _ n + _ = 0 := hzero + _ = algebraMap k ell 0 := (map_zero _).symm + have hφReduction : + padicCyclotomicUnramifiedGalEquivResidueGal + vK vL hExt hhens hk hpn hζ hζgen φ = + FiniteField.frobeniusAlgEquivOfAlgebraic k ell := by + exact padicCyclotomicUnramified_galEquivResidueGal_arithmeticFrobenius + vK vL hExt hhens hk hpn hζ hζgen + have hresEq : IsLocalRing.residue W b = IsLocalRing.residue W c := by + have happ := congrArg (fun g : Gal(ell/k) ↦ + g (IsLocalRing.residue W a)) hφReduction + change padicCyclotomicUnramifiedGalResidueAlgEquiv vK vL hExt hhens φ + (IsLocalRing.residue W a) = + FiniteField.frobeniusAlgEquivOfAlgebraic k ell + (IsLocalRing.residue W a) at happ + rw [padicCyclotomicUnramified_galResidueAlgEquiv_residue] at happ + calc + IsLocalRing.residue W b = + FiniteField.frobeniusAlgEquivOfAlgebraic k ell + (IsLocalRing.residue W a) := happ + _ = (IsLocalRing.residue W a) ^ (p ^ r) := + padicCyclotomicUnramified_residue_frobenius_apply hk _ + _ = IsLocalRing.residue W c := by simp [c] + have hφPrimitive : IsPrimitiveRoot (φ ζ) n := + hζ.map_of_injective φ.injective + have hcPrimitive : IsPrimitiveRoot (ζ ^ (p ^ r)) n := + hζ.pow_of_coprime (p ^ r) (hpn.pow_left r) + have hbRoot : F.IsRoot b := by + apply W.subtype_injective + change W.subtype (F.eval b) = W.subtype 0 + rw [← Polynomial.eval_map_apply] + simpa [F, b] using hφPrimitive.isRoot_cyclotomic hn + have hcRoot : F.IsRoot c := by + apply W.subtype_injective + change W.subtype (F.eval c) = W.subtype 0 + rw [← Polynomial.eval_map_apply] + simpa [F, c, a] using hcPrimitive.isRoot_cyclotomic hn + have hcResidueRoot : + (cyclotomic n ell).IsRoot (IsLocalRing.residue W c) := by + have hmap := hcRoot.map (f := IsLocalRing.residue W) + simpa [F] using hmap + have hderivResidueNe : + IsLocalRing.residue W (F.derivative.eval c) ≠ 0 := by + have hsep := Polynomial.separable_cyclotomic n ell + have hne : + (cyclotomic n ell).derivative.eval + (IsLocalRing.residue W c) ≠ 0 := by + simpa [Polynomial.IsRoot.def] using + hsep.eval₂_derivative_ne_zero (RingHom.id ell) + (Polynomial.IsRoot.def.mp hcResidueRoot) + have hcompat : + IsLocalRing.residue W (F.derivative.eval c) = + (cyclotomic n ell).derivative.eval + (IsLocalRing.residue W c) := by + calc + IsLocalRing.residue W (F.derivative.eval c) = + (F.derivative.map (IsLocalRing.residue W)).eval + (IsLocalRing.residue W c) := by + exact (Polynomial.eval_map_apply + (f := IsLocalRing.residue W) (p := F.derivative) c).symm + _ = (cyclotomic n ell).derivative.eval + (IsLocalRing.residue W c) := by + rw [← Polynomial.derivative_map, show + F.map (IsLocalRing.residue W) = + cyclotomic n (IsLocalRing.ResidueField W) by simp [F]] + rw [hcompat] + exact hne + have hderivUnit : IsUnit (F.derivative.eval c) := + (IsLocalRing.residue_ne_zero_iff_isUnit _).1 hderivResidueNe + have hbc : b = c := + padicCyclotomicUnramified_eq_of_roots_of_residue_eq_of_derivative_isUnit + hcRoot hbRoot hresEq hderivUnit + have hval := congrArg Subtype.val hbc + simpa [b, c, a, φ] using hval + +/-- the unramified cyclotomic theorem(ii): arithmetic Frobenius generates the whole Galois +group, with exponents bounded by the degree `f = ord_n(p^r)`. -/ +theorem padicCyclotomicUnramifiedArithmeticFrobenius_generates + (vK : LubinTate.Valuations.ExponentialValuation K) (vL : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ x : K, vL (algebraMap K L x) = vK x) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK).valuation) + {p r n : ℕ} [hp : Fact p.Prime] + [Fintype (padicCyclotomicUnramifiedResidueField vK)] + (hk : Fintype.card (padicCyclotomicUnramifiedResidueField vK) = p ^ r) + (hpn : p.Coprime n) {ζ : L} (hζ : IsPrimitiveRoot ζ n) + (hζgen : Algebra.adjoin K ({ζ} : Set L) = ⊤) : + ∀ σ : Gal(L/K), + ∃ j < padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r), + padicCyclotomicUnramifiedArithmeticFrobenius + vK vL hExt hhens hk hpn hζ hζgen ^ j = σ := by + let V := LubinTate.Valuations.exponentialValuationSubring vK + let W := LubinTate.Valuations.exponentialValuationSubring vL + let i := unramifiedValuationRingValuationRingMap vK vL hExt + let : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom vK vL hExt + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + let : Algebra k ell := padicCyclotomicUnramifiedResidueAlgebra vK vL hExt + let : FiniteDimensional k ell := + padicCyclotomicUnramified_residueFiniteDimensional vK vL hExt + let : Algebra.IsAlgebraic k ell := Algebra.IsAlgebraic.of_finite k ell + let : Finite ell := Module.finite_of_finite k + let e := padicCyclotomicUnramifiedGalEquivResidueGal + vK vL hExt hhens hk hpn hζ hζgen + let φ := padicCyclotomicUnramifiedArithmeticFrobenius + vK vL hExt hhens hk hpn hζ hζgen + have heφ : e φ = FiniteField.frobeniusAlgEquivOfAlgebraic k ell := + padicCyclotomicUnramified_galEquivResidueGal_arithmeticFrobenius + vK vL hExt hhens hk hpn hζ hζgen + have hUnramified : FiniteUnramifiedExtension vK vL hExt := + padicCyclotomicUnramified_finiteUnramifiedExtension + vK vL hExt hhens hk hpn hζ hζgen + have hfieldDegree : + Module.finrank K L = + padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) := + padicCyclotomicUnramified_finrank_eq_residueDegree + vK hhens hk hpn hζ hζgen + have hresidueDegree : + Module.finrank k ell = + padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) := by + have hdegree : Module.finrank K L = Module.finrank k ell := + hUnramified.2.trans + (padicCyclotomicUnramified_exponentialResidueDegree_eq_finrank vK vL hExt) + rw [← hdegree] + exact hfieldDegree + intro σ + obtain ⟨j, hj⟩ := + (FiniteField.bijective_frobeniusAlgEquivOfAlgebraic_pow k ell).2 (e σ) + refine ⟨j, ?_, ?_⟩ + · rw [← hresidueDegree] + exact j.isLt + · apply e.injective + rw [map_pow, heφ] + exact hj + +/-- Nakayama lifts generation modulo the maximal ideal to a finite algebra. -/ +private theorem subalgebra_eq_top_of_residue_approximation + {R S : Type*} [CommRing R] [CommRing S] [IsLocalRing R] [IsLocalRing S] + [Algebra R S] [Module.Finite R S] (A : Subalgebra R S) + (hmap : Ideal.map (algebraMap R S) (IsLocalRing.maximalIdeal R) = + IsLocalRing.maximalIdeal S) + (hcongr : ∀ b : S, ∃ z : S, z ∈ A ∧ b - z ∈ IsLocalRing.maximalIdeal S) : + A = ⊤ := by + have htop : (⊤ : Submodule R S) ≤ + A.toSubmodule ⊔ IsLocalRing.maximalIdeal R • (⊤ : Submodule R S) := by + intro b _ + obtain ⟨z, hz, hdiff⟩ := hcongr b + have hdiffMap : b - z ∈ Ideal.map (algebraMap R S) (IsLocalRing.maximalIdeal R) := by + simpa only [hmap] using hdiff + have hdiffSmul : b - z ∈ IsLocalRing.maximalIdeal R • (⊤ : Submodule R S) := by + simpa [Ideal.smul_top_eq_map] using hdiffMap + have hsum : z + (b - z) ∈ + A.toSubmodule ⊔ IsLocalRing.maximalIdeal R • (⊤ : Submodule R S) := + Submodule.add_mem_sup hz hdiffSmul + have hsum_eq : z + (b - z) = b := by ring + simpa only [hsum_eq] using hsum + have hle : (⊤ : Submodule R S) ≤ A.toSubmodule := + Submodule.le_of_le_smul_of_le_jacobson_bot + (I := IsLocalRing.maximalIdeal R) (N := A.toSubmodule) + (N' := (⊤ : Submodule R S)) Module.Finite.fg_top + (IsLocalRing.maximalIdeal_le_jacobson (⊥ : Ideal R)) htop + exact Algebra.toSubmodule_eq_top.mp (le_antisymm le_top hle) + +/-- A primitive root whose residue degree exhausts a finite extension generates its algebra. -/ +private theorem primitive_root_adjoin_eq_top_of_degree + {A B : Type*} [Field A] [Fintype A] [Field B] [Algebra A B] + [FiniteDimensional A B] {p r n : ℕ} [Fact p.Prime] + (hk : Fintype.card A = p ^ r) (hpn : p.Coprime n) + (alpha : B) (ha : IsPrimitiveRoot alpha n) + (hdegree : Module.finrank A B = + padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r)) : + Algebra.adjoin A ({alpha} : Set B) = ⊤ := by + have hsub := padicCyclotomicUnramified_residue_adjoin_finrank hk hpn ha + have htop : IntermediateField.adjoin A ({alpha} : Set B) = ⊤ := + IntermediateField.eq_of_le_of_finrank_eq le_top (by + simpa using hsub.trans hdegree.symm) + exact Algebra.adjoin_eq_top_of_primitive_element + (Algebra.IsAlgebraic.isAlgebraic alpha) htop + +omit [FiniteDimensional K L] in +/-- Extending a discrete exponential valuation gives a valuation ring that is not a field. -/ +private theorem exponential_extension_valuationRing_not_isField + (vK : LubinTate.Valuations.ExponentialValuation K) + (vL : LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ x : K, vL (algebraMap K L x) = vK x) + (hvdisc : LubinTate.Valuations.DiscreteExponentialValuation vK) : + ¬ IsField (LubinTate.Valuations.exponentialValuationSubring vL) := by + let V := LubinTate.Valuations.exponentialValuationSubring vK + let W := LubinTate.Valuations.exponentialValuationSubring vL + let i := unramifiedValuationRingValuationRingMap vK vL hExt + intro hfield + let : Field W := hfield.toField + obtain ⟨s, hs, _hvalues, pi, hpival⟩ := hvdisc + have hpi0 : pi ≠ 0 := + LubinTate.Valuations.discretePrimeElement_ne_zero_of_value vK hpival + let piV : V := + LubinTate.Valuations.discretePrimeElementInValuationSubring vK hs.le hpival + have hpiV0 : piV ≠ 0 := by + intro hzero + exact hpi0 (congrArg Subtype.val hzero) + have hi : Function.Injective i := by + intro x y hxy + apply Subtype.ext + exact (algebraMap K L).injective (congrArg Subtype.val hxy) + have hiPi0 : i piV ≠ 0 := by simpa using hi.ne hpiV0 + have hiPiUnit : IsUnit (i piV) := isUnit_iff_ne_zero.mpr hiPi0 + have hzero := + LubinTate.Valuations.exponentialValuation_eq_zero_of_isUnit vL hiPiUnit + have hvalue : vL ((((i piV : W)) : L)) = (s : WithTop ℝ) := by + change vL (algebraMap K L pi) = (s : WithTop ℝ) + rw [hExt, hpival] + rw [hvalue] at hzero + have hs0 : s = 0 := + WithTop.coe_eq_coe.mp (by simpa using hzero) + exact (ne_of_gt hs) hs0 + +/-- the unramified cyclotomic theorem(iii), valuation-ring generation by the specified root. + +The residue of `ζ` is again primitive of order `n`; its residue-field degree +equals the full residue degree by part (i). Thus it generates the residue +extension. Since the extension is unramified, the source maximal ideal maps +onto the target maximal ideal, and Nakayama applied to the finite integral +closure proves `O_L = O_K[ζ]`. -/ +theorem padicCyclotomicUnramified_valuationSubring_adjoin_eq_top + (vK : LubinTate.Valuations.ExponentialValuation K) (vL : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ x : K, vL (algebraMap K L x) = vK x) + (hvdisc : LubinTate.Valuations.DiscreteExponentialValuation vK) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK).valuation) + {p r n : ℕ} [hp : Fact p.Prime] + [Fintype (IsLocalRing.ResidueField + (LubinTate.Valuations.exponentialValuationSubring vK))] + (hk : Fintype.card (IsLocalRing.ResidueField + (LubinTate.Valuations.exponentialValuationSubring vK)) = p ^ r) + (hpn : p.Coprime n) {ζ : L} (hζ : IsPrimitiveRoot ζ n) + (hζgen : Algebra.adjoin K ({ζ} : Set L) = ⊤) : + let V := LubinTate.Valuations.exponentialValuationSubring vK + let W := LubinTate.Valuations.exponentialValuationSubring vL + let i := unramifiedValuationRingValuationRingMap vK vL hExt + letI : Algebra V W := i.toAlgebra + ∃ a : W, (a : L) = ζ ∧ + Algebra.adjoin V ({a} : Set W) = (⊤ : Subalgebra V W) := by + classical + let Vv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK + let Wv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vL + let V := LubinTate.Valuations.exponentialValuationSubring vK + let W := LubinTate.Valuations.exponentialValuationSubring vL + let i := unramifiedValuationRingValuationRingMap vK vL hExt + let : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom vK vL hExt + let algVW : Algebra V W := i.toAlgebra + let : Algebra V W := algVW + let algVL : Algebra V L := + ((algebraMap K L).comp V.subtype).toAlgebra + let : Algebra V L := algVL + let : SMul V L := algVL.toSMul + let : SMul V W := algVW.toSMul + let : Module V L := algVL.toModule + let : Module V W := algVW.toModule + let : IsScalarTower V K L := IsScalarTower.of_algebraMap_eq + (R := V) (S := K) (A := L) (by intro; rfl) + let : IsScalarTower V W L := IsScalarTower.of_algebraMap_eq + (R := V) (S := W) (A := L) (by intro; rfl) + let : Algebra.IsAlgebraic K L := Algebra.IsAlgebraic.of_finite K L + let : IsFractionRing V K := + inferInstanceAs (IsFractionRing Vv K) + have hclosure : W = (integralClosure V L).toSubring := + exponentialValuationSubring_eq_integralClosure_of_henselian vK vL hExt hhens + let : IsIntegralClosure W V L := + padicCyclotomicUnramified_isIntegralClosure_of_subring_eq V W hclosure + let : IsDiscreteValuationRing V := + LubinTate.Valuations.discreteExponentialValuationSubring_isDiscreteValuationRing hvdisc + let : IsFractionRing W L := + inferInstanceAs (IsFractionRing Wv L) + have hUnramified : FiniteUnramifiedExtension vK vL hExt := + padicCyclotomicUnramified_finiteUnramifiedExtension + vK vL hExt hhens hk hpn hζ hζgen + let : Algebra.IsSeparable K L := + finiteUnramifiedExtension_isSeparable_of_henselian + vK vL hExt hhens hUnramified + let : IsDedekindDomain V := inferInstance + let : Module.Finite V W := IsIntegralClosure.finite V K L W + let : IsDedekindDomain W := + IsIntegralClosure.isDedekindDomain V K L W + have hWnotField : ¬ IsField W := + exponential_extension_valuationRing_not_isField vK vL hExt hvdisc + let : IsNoetherianRing W := inferInstance + let : IsDiscreteValuationRing W := + ((IsDiscreteValuationRing.TFAE W hWnotField).out 3 1).mp + (show IsDedekindDomain W from inferInstance) + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + let : Algebra k ell := (IsLocalRing.ResidueField.map i).toAlgebra + have hresfin : FiniteDimensional k ell := + residueExtension_finiteDimensional_of_finiteDimensional + vK vL hExt + let : FiniteDimensional k ell := hresfin + let residueModule : Module k ell := inferInstance + let algebraModule : Module k ell := + (inferInstance : Algebra k ell).toModule + have hresidueModule : residueModule = algebraModule := by + apply Module.ext + funext r x + obtain ⟨r, rfl⟩ := IsLocalRing.residue_surjective r + obtain ⟨x, rfl⟩ := IsLocalRing.residue_surjective x + rfl + have hresfinAlgebra : + @FiniteDimensional k ell _ _ algebraModule := by + rw [← hresidueModule] + exact hresfin + let : Algebra.IsAlgebraic k ell := + @Algebra.IsAlgebraic.of_finite k ell _ _ _ _ hresfinAlgebra + have hn : 0 < n := padicCyclotomicUnramified_order_pos hpn + have hζIntegralV : IsIntegral V ζ := + padicCyclotomicUnramified_primitiveRoot_isIntegral hn hζ + have hζmem : ζ ∈ W := by + rw [hclosure] + exact hζIntegralV + let a : W := ⟨ζ, hζmem⟩ + let alpha : ell := IsLocalRing.residue W a + let F : V[X] := cyclotomic n V + have hFaW : Polynomial.aeval a F = 0 := by + apply W.subtype_injective + have hcompat : + (algebraMap V L).comp (RingHom.id V) = + W.subtype.comp (algebraMap V W) := by + ext x + rfl + have hmap := Polynomial.map_aeval_eq_aeval_map hcompat F a + have hroot : Polynomial.aeval ζ F = 0 := by + rw [Polynomial.aeval_def, Polynomial.eval₂_eq_eval_map] + change ((cyclotomic n V).map + ((algebraMap K L).comp V.subtype)).eval ζ = 0 + rw [map_cyclotomic] + exact hζ.isRoot_cyclotomic hn + change W.subtype (Polynomial.aeval a F) = W.subtype 0 + rw [hmap] + simpa [F] using hroot + let : CharP k p := charP_of_card_eq_prime_pow hk + have hnCastK : (n : k) ≠ 0 := by + intro hzero + exact (hp.out.coprime_iff_not_dvd.mp hpn) + ((CharP.cast_eq_zero_iff k p n).mp hzero) + let : NeZero (n : k) := ⟨hnCastK⟩ + let : NeZero (n : ell) := ⟨fun hzero => hnCastK + ((algebraMap k ell).injective + ((_root_.map_natCast _ n).trans (hzero.trans (_root_.map_zero _).symm)))⟩ + have halphaRoot : IsRoot (cyclotomic n ell) alpha := by + have hres := + unramifiedValuationRing_polynomial_aeval_residue_eq + vK vL hExt F a + dsimp only at hres + rw [hFaW, map_zero] at hres + have hmapF : F.map (IsLocalRing.residue V) = cyclotomic n k := by + change F.map (IsLocalRing.residue V) = + cyclotomic n (IsLocalRing.ResidueField V) + simp [F] + rw [hmapF] at hres + change 0 = ((cyclotomic n k).map (algebraMap k ell)).eval alpha at hres + rw [map_cyclotomic] at hres + exact hres.symm + have halphaPrimitive : IsPrimitiveRoot alpha n := + (Polynomial.isRoot_cyclotomic_iff (R := ell)).1 halphaRoot + have hfieldDegree : + Module.finrank K L = + padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) := + padicCyclotomicUnramified_finrank_eq_residueDegree + vK hhens hk hpn hζ hζgen + have hfullResidueDegreeAlgebra : + @Module.finrank k ell _ _ algebraModule = + padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) := by + rw [← hresidueModule] + exact hUnramified.2.symm.trans hfieldDegree + have halphaAlgTop : Algebra.adjoin k ({alpha} : Set ell) = ⊤ := + @primitive_root_adjoin_eq_top_of_degree k ell _ _ _ _ hresfinAlgebra + p r n hp hk hpn alpha halphaPrimitive hfullResidueDegreeAlgebra + have hIdentity := + ramificationInvariants_fundamental_identity_of_discrete_of_separable + vK vL hExt hvdisc hhens + have hresiduePos : 0 < exponentialResidueDegree vK vL hExt := by + exact exponentialResidueDegree_pos_of_finiteDimensional vK vL hExt + have hRamification : exponentialRamificationIndex vK vL = 1 := by + have hdegree := hUnramified.2 + nlinarith + have hidealRamification : + Ideal.ramificationIdx' + (IsLocalRing.maximalIdeal V) (IsLocalRing.maximalIdeal W) = 1 := by + have heq := + exponentialRamificationIndex_eq_ideal_ramificationIdx + vK vL hExt hvdisc + change exponentialRamificationIndex vK vL = + Ideal.ramificationIdx' + (IsLocalRing.maximalIdeal V) (IsLocalRing.maximalIdeal W) at heq + rw [← heq] + exact hRamification + have hi : Function.Injective i := by + intro x y hxy + apply Subtype.ext + exact (algebraMap K L).injective (congrArg Subtype.val hxy) + have hmapMaximal : + Ideal.map i (IsLocalRing.maximalIdeal V) = + IsLocalRing.maximalIdeal W := by + have hmap := + ValuationTheory.map_maximalIdeal_eq_pow_ramificationIdx hi + rw [hidealRamification, pow_one] at hmap + exact hmap + let A : Subalgebra V W := Algebra.adjoin V ({a} : Set W) + have hcongr : ∀ b : W, ∃ z : W, + z ∈ A ∧ b - z ∈ IsLocalRing.maximalIdeal W := by + intro b + have hbmem : IsLocalRing.residue W b ∈ + Algebra.adjoin k ({alpha} : Set ell) := by + simp [halphaAlgTop] + rcases Algebra.adjoin_mem_exists_aeval k alpha hbmem with + ⟨fbar, hfbar⟩ + have hresSurj : Function.Surjective (IsLocalRing.residue V) := + Ideal.Quotient.mk_surjective + rcases Polynomial.map_surjective + (IsLocalRing.residue V) hresSurj fbar with ⟨P, hP⟩ + let z : W := Polynomial.aeval a P + refine ⟨z, ?_, ?_⟩ + · exact Polynomial.aeval_mem_adjoin_singleton + (R := V) (p := P) a + · rw [← IsLocalRing.residue_eq_zero_iff] + rw [map_sub] + have hres := + unramifiedValuationRing_polynomial_aeval_residue_eq + vK vL hExt P a + dsimp only at hres + change IsLocalRing.residue W z = _ at hres + rw [hres, hP] + rw [sub_eq_zero] + simpa [alpha, Polynomial.aeval_def] using hfbar.symm + refine ⟨a, rfl, ?_⟩ + exact subalgebra_eq_top_of_residue_approximation A hmapMaximal hcongr + +/-- Finite-dimensional core of the complete the unramified cyclotomic theorem endpoint. +The public endpoint below derives finite-dimensionality from `L = K(ζ)`. -/ +private theorem padicCyclotomicUnramified_of_finiteDimensional + (vK : LubinTate.Valuations.ExponentialValuation K) (vL : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ x : K, vL (algebraMap K L x) = vK x) + (hvdisc : LubinTate.Valuations.DiscreteExponentialValuation vK) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK).valuation) + {p r n : ℕ} [hp : Fact p.Prime] + [Fintype (padicCyclotomicUnramifiedResidueField vK)] + (hk : Fintype.card (padicCyclotomicUnramifiedResidueField vK) = p ^ r) + (hpn : p.Coprime n) {ζ : L} (hζ : IsPrimitiveRoot ζ n) + (hζgen : Algebra.adjoin K ({ζ} : Set L) = ⊤) : + let V := LubinTate.Valuations.exponentialValuationSubring vK + let W := LubinTate.Valuations.exponentialValuationSubring vL + let i := unramifiedValuationRingValuationRingMap vK vL hExt + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom vK vL hExt + letI : Algebra V W := i.toAlgebra + letI : Algebra (padicCyclotomicUnramifiedResidueField vK) + (padicCyclotomicUnramifiedResidueField vL) := + padicCyclotomicUnramifiedResidueAlgebra vK vL hExt + FiniteUnramifiedExtension vK vL hExt ∧ + Module.finrank K L = + padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) ∧ + (0 < padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) ∧ + (p ^ r) ^ padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) ≡ + 1 [MOD n] ∧ + ∀ m : ℕ, 0 < m → (p ^ r) ^ m ≡ 1 [MOD n] → + padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) ≤ m) ∧ + Function.Bijective + (padicCyclotomicUnramifiedGalToResidueGal vK vL hExt hhens) ∧ + padicCyclotomicUnramifiedArithmeticFrobenius + vK vL hExt hhens hk hpn hζ hζgen ζ = ζ ^ (p ^ r) ∧ + (∀ σ : Gal(L/K), + ∃ j < padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r), + padicCyclotomicUnramifiedArithmeticFrobenius + vK vL hExt hhens hk hpn hζ hζgen ^ j = σ) ∧ + ∃ a : W, (a : L) = ζ ∧ + Algebra.adjoin V ({a} : Set W) = (⊤ : Subalgebra V W) := by + let V := LubinTate.Valuations.exponentialValuationSubring vK + let W := LubinTate.Valuations.exponentialValuationSubring vL + let i := unramifiedValuationRingValuationRingMap vK vL hExt + let : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom vK vL hExt + let : Algebra V W := i.toAlgebra + let : Algebra (padicCyclotomicUnramifiedResidueField vK) + (padicCyclotomicUnramifiedResidueField vL) := + padicCyclotomicUnramifiedResidueAlgebra vK vL hExt + refine ⟨?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ + · exact padicCyclotomicUnramified_finiteUnramifiedExtension + vK vL hExt hhens hk hpn hζ hζgen + · exact padicCyclotomicUnramified_finrank_eq_residueDegree + vK hhens hk hpn hζ hζgen + · exact padicCyclotomicUnramifiedResidueDegree_isLeast + n (p ^ r) (hpn.pow_left r) + · exact padicCyclotomicUnramified_galToResidueGal_bijective + vK vL hExt hhens hk hpn hζ hζgen + · exact padicCyclotomicUnramifiedArithmeticFrobenius_apply_primitiveRoot + vK vL hExt hhens hk hpn hζ hζgen + · exact padicCyclotomicUnramifiedArithmeticFrobenius_generates + vK vL hExt hhens hk hpn hζ hζgen + · exact padicCyclotomicUnramified_valuationSubring_adjoin_eq_top + vK vL hExt hvdisc hhens hk hpn hζ hζgen + +end LocalCyclotomicUnramified + +section LocalCyclotomicEndpoint + +variable {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + +/-- A field generated by one integral element is finite-dimensional. This +removes the redundant finite-dimensionality assumption from the literal +the unramified cyclotomic theorem endpoint. -/ +private theorem padicCyclotomicUnramified_finiteDimensional_of_primitiveRoot_adjoin_eq_top + {n : ℕ} {ζ : L} (hn : 0 < n) (hζ : IsPrimitiveRoot ζ n) + (hζgen : Algebra.adjoin K ({ζ} : Set L) = ⊤) : + FiniteDimensional K L := by + have hζIntegral : IsIntegral K ζ := + padicCyclotomicUnramified_primitiveRoot_isIntegral hn hζ + let E := IntermediateField.adjoin K ({ζ} : Set L) + let : FiniteDimensional K E := + IntermediateField.adjoin.finiteDimensional hζIntegral + have hAlgebraAdjoinLe : + Algebra.adjoin K ({ζ} : Set L) ≤ E.toSubalgebra := by + apply Algebra.adjoin_le + intro x hx + exact IntermediateField.subset_adjoin K ({ζ} : Set L) hx + have htop : E = (⊤ : IntermediateField K L) := by + apply top_unique + intro x _hx + exact hAlgebraAdjoinLe (hζgen.symm ▸ trivial) + let : FiniteDimensional K (⊤ : IntermediateField K L) := + htop ▸ inferInstance + exact IntermediateField.topEquiv.toLinearEquiv.finiteDimensional + +/-- Complete arithmetic-Frobenius endpoint for the unramified cyclotomic extension. + +For the extension generated by a primitive prime-to-`p` root of unity, this +packages: finite unramifiedness and the least-exponent degree formula; the +canonical Galois/residue-Galois comparison and its arithmetic Frobenius +generator; and `O_L = O_K[ζ]` for the specified `ζ`. No separate +finite-dimensionality hypothesis is needed: it follows from `L = K(ζ)`. -/ +theorem padicCyclotomicUnramified + (vK : LubinTate.Valuations.ExponentialValuation K) (vL : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ x : K, vL (algebraMap K L x) = vK x) + (hvdisc : LubinTate.Valuations.DiscreteExponentialValuation vK) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK).valuation) + {p r n : ℕ} [hp : Fact p.Prime] + [Fintype (padicCyclotomicUnramifiedResidueField vK)] + (hk : Fintype.card (padicCyclotomicUnramifiedResidueField vK) = p ^ r) + (hpn : p.Coprime n) {ζ : L} (hζ : IsPrimitiveRoot ζ n) + (hζgen : Algebra.adjoin K ({ζ} : Set L) = ⊤) : + letI : FiniteDimensional K L := by + exact padicCyclotomicUnramified_finiteDimensional_of_primitiveRoot_adjoin_eq_top + (padicCyclotomicUnramified_order_pos hpn) hζ hζgen + let V := LubinTate.Valuations.exponentialValuationSubring vK + let W := LubinTate.Valuations.exponentialValuationSubring vL + let i := unramifiedValuationRingValuationRingMap vK vL hExt + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom vK vL hExt + letI : Algebra V W := i.toAlgebra + letI : Algebra (padicCyclotomicUnramifiedResidueField vK) + (padicCyclotomicUnramifiedResidueField vL) := + padicCyclotomicUnramifiedResidueAlgebra vK vL hExt + FiniteUnramifiedExtension vK vL hExt ∧ + Module.finrank K L = + padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) ∧ + (0 < padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) ∧ + (p ^ r) ^ padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) ≡ + 1 [MOD n] ∧ + ∀ m : ℕ, 0 < m → (p ^ r) ^ m ≡ 1 [MOD n] → + padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) ≤ m) ∧ + Function.Bijective + (padicCyclotomicUnramifiedGalToResidueGal vK vL hExt hhens) ∧ + padicCyclotomicUnramifiedArithmeticFrobenius + vK vL hExt hhens hk hpn hζ hζgen ζ = ζ ^ (p ^ r) ∧ + (∀ σ : Gal(L/K), + ∃ j < padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r), + padicCyclotomicUnramifiedArithmeticFrobenius + vK vL hExt hhens hk hpn hζ hζgen ^ j = σ) ∧ + ∃ a : W, (a : L) = ζ ∧ + Algebra.adjoin V ({a} : Set W) = (⊤ : Subalgebra V W) := by + let : FiniteDimensional K L := + padicCyclotomicUnramified_finiteDimensional_of_primitiveRoot_adjoin_eq_top + (padicCyclotomicUnramified_order_pos hpn) hζ hζgen + exact padicCyclotomicUnramified_of_finiteDimensional + vK vL hExt hvdisc hhens hk hpn hζ hζgen + +end LocalCyclotomicEndpoint + +section IntegralInclusion + +variable {R : Type u} {L : Type v} +variable [CommRing R] [Field L] [Algebra R L] + +/-- The easy inclusion in the unramified cyclotomic theorem(iii): every root of unity is +integral, hence the algebra generated by a primitive root lies in the integral +closure. The reverse inclusion for the local cyclotomic setting is proved by +`padicCyclotomicUnramified_valuationSubring_adjoin_eq_top` above. -/ +theorem padicCyclotomicUnramified_adjoin_le_integralClosure + {n : ℕ} {ζ : L} (hn : 0 < n) (hζ : IsPrimitiveRoot ζ n) : + Algebra.adjoin R ({ζ} : Set L) ≤ integralClosure R L := by + exact adjoin_le_integralClosure + (padicCyclotomicUnramified_primitiveRoot_isIntegral hn hζ) + +end IntegralInclusion + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/NonarchimedeanLocalField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/NonarchimedeanLocalField.lean new file mode 100644 index 0000000000..8485dae0d0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/NonarchimedeanLocalField.lean @@ -0,0 +1,94 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic +public import Mathlib.NumberTheory.Padics.ProperSpace +public import Mathlib.NumberTheory.Padics.ValuativeRel +/-! +# The p-adic field as a nonarchimedean local field + +This file connects Mathlib's normed and valuative structures on `ℚ_p` to +the topology-first local-field interface used by this library. +-/ + +@[expose] public section + +noncomputable +section + +open scoped ValuativeRel WithZero + +namespace LocalFieldTheory.Padic + +variable (p : ℕ) [Fact p.Prime] + +/-- The canonical multiplicative valuation of `ℚ_p` is at most one exactly +when the p-adic norm is at most one. -/ +theorem mulValuation_le_one_iff_norm_le_one + (x : ℚ_[p]) : + Padic.mulValuation (p := p) x ≤ 1 ↔ ‖x‖ ≤ 1 := by + classical + by_cases hx : x = 0 + · simp [hx] + · rw [Padic.norm_le_one_iff_val_nonneg] + change (if x = 0 then 0 else WithZero.exp (-x.valuation)) ≤ 1 ↔ + 0 ≤ x.valuation + rw [ite_eq_right hx, ← WithZero.exp_zero, WithZero.exp_le_exp, neg_nonpos] + +/-- The integer ring defined by the canonical valuative relation on `ℚ_p` +consists exactly of the elements of norm at most one. -/ +theorem integer_mem_iff_norm_le_one (x : ℚ_[p]) : + x ∈ (ValuativeRel.valuation ℚ_[p]).integer ↔ ‖x‖ ≤ 1 := by + rw [Valuation.mem_integer_iff, + ← Valuation.vle_one_iff (ValuativeRel.valuation ℚ_[p]), + Valuation.vle_one_iff (Padic.mulValuation (p := p)), + mulValuation_le_one_iff_norm_le_one] + +/-- The norm-induced valuation on `ℚ_p` is compatible with the canonical +p-adic valuation ordering. -/ +theorem normedFieldValuation_compatible_padic : + (NormedField.valuation : Valuation ℚ_[p] NNReal).Compatible := by + classical + constructor + intro x y + rw [(Padic.mulValuation (p := p)).vle_iff_le] + change Padic.mulValuation x ≤ Padic.mulValuation y ↔ ‖x‖₊ ≤ ‖y‖₊ + rw [← NNReal.coe_le_coe] + change Padic.mulValuation x ≤ Padic.mulValuation y ↔ ‖x‖ ≤ ‖y‖ + by_cases hx : x = 0 + · simp [hx] + by_cases hy : y = 0 + · simp [hy, hx] + rw [Padic.norm_eq_zpow_neg_valuation hx, + Padic.norm_eq_zpow_neg_valuation hy] + change (if x = 0 then 0 else WithZero.exp (-x.valuation)) ≤ + (if y = 0 then 0 else WithZero.exp (-y.valuation)) ↔ + (p : ℝ) ^ (-x.valuation) ≤ (p : ℝ) ^ (-y.valuation) + rw [ite_eq_right hx, ite_eq_right hy, WithZero.exp_le_exp] + have hpone : (1 : ℝ) < (p : ℝ) := by + exact_mod_cast (Fact.out : Nat.Prime p).one_lt + exact (zpow_right_strictMono₀ hpone).le_iff_le.symm + +/-- The usual topology on `ℚ_p` is induced by its canonical valuation. -/ +theorem padicIsValuativeTopology : IsValuativeTopology ℚ_[p] := by + let v : Valuation ℚ_[p] NNReal := NormedField.valuation + let : Valued ℚ_[p] NNReal := NormedField.toValued + let : v.Compatible := normedFieldValuation_compatible_padic p + apply IsValuativeTopology.of_mem_nhds_zero_iff_vle v + intro s + exact Valued.mem_nhds_zero + +/-- Mathlib's p-adic field is a nonarchimedean local field for the +topology-first interface used by local class field theory. -/ +noncomputable instance padicIsNonarchimedeanLocalField : + IsNonarchimedeanLocalField ℚ_[p] where + toIsValuativeTopology := padicIsValuativeTopology p + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance + +end LocalFieldTheory.Padic diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/PrincipalUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/PrincipalUnits.lean new file mode 100644 index 0000000000..12bfc0acba --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/PrincipalUnits.lean @@ -0,0 +1,607 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.PrincipalUnitExpLogEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicPowerIndex +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UniformizerPrincipalQuotient +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.NonarchimedeanLocalField +public import Mathlib.NumberTheory.Padics.ValuativeRel +public import Mathlib.NumberTheory.Padics.ProperSpace +/-! +# Principal units of the p-adic field + +This file identifies the standard p-adic integer and complete-DVF models, +computes their principal-unit quotients, and records the logarithm/exponential +power formulas used by local cyclotomic norm calculations. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + card_unitsModHigherPrincipalUnitGroup_eq_quotientUnits → + card_unitsModHigherPrincipalUnitGroup_eq_quotientUnits + +open _root_.LocalFieldTheory.DiscreteValuationField.LocalField renaming + ramificationIndexOfWithZeroValuation_intCast → + ramificationIndexOfWithZeroValuation_intCast + +open _root_.LocalFieldTheory.DiscreteValuationField.LocalField renaming + valuation_natCast_factorial_eq_exp_neg_ramificationIndex_mul_padicValNat → + valuation_natCast_factorial_eq_exp_neg_ramificationIndex_mul_padicValNat + +open _root_.LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation renaming + chosenExpLogContinuousMulEquiv → + chosenExpLogContinuousMulEquiv + +open _root_.LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation renaming + completeDVFOfWithZeroValuation → + completeDVFOfWithZeroValuation + +open _root_.LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation renaming + expSeriesFieldOfWithZeroValuation → + expSeriesFieldOfWithZeroValuation + +open _root_.LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation renaming + principalUnitExpLogContinuousMulEquivOfExactOfWithZeroValuationScaled → + principalUnitExpLogContinuousMulEquivOfExactOfWithZeroValuationScaled + +open _root_.LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation renaming + principalUnitExpLogMulEquivOfExactOfWithZeroValuationScaled → + principalUnitExpLogMulEquivOfExactOfWithZeroValuationScaled + +open _root_.LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation renaming + principalUnitExpSeries_maximalIdealPow_val_ofWithZeroValuationScaled → + principalUnitExpSeries_maximalIdealPow_val_ofWithZeroValuationScaled + +open _root_.LocalFieldTheory.DiscreteValuationField.WithZeroValuation renaming + exists_valuationSubring_valuation_eq_exp_neg_one_of_surjective → + exists_valuationSubring_valuation_eq_exp_neg_one_of_surjective + +open _root_.LocalFieldTheory.DiscreteValuationField.WithZeroValuation renaming + isUniformizer_of_valuation_eq_exp_neg_one → + isUniformizer_of_valuation_eq_exp_neg_one + +open _root_.LocalFieldTheory.DiscreteValuationField.WithZeroValuationTopology renaming + completeSpace_ofWithZeroValuation → + completeSpace_ofWithZeroValuation + + +noncomputable +section + +open scoped ValuativeRel WithZero + +namespace LocalFieldTheory.Padic + +open LocalFieldTheory +open ValuationTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +variable (p : ℕ) [Fact p.Prime] + +/-- The valuative integer ring of `ℚ_p` is canonically equivalent to +`ℤ_p`. -/ +noncomputable def integerRingEquivPadicInt : + 𝒪[ℚ_[p]] ≃+* ℤ_[p] where + toFun x := ⟨x, (integer_mem_iff_norm_le_one p x).1 x.property⟩ + invFun x := ⟨x, (integer_mem_iff_norm_le_one p x).2 x.property⟩ + left_inv _ := Subtype.ext rfl + right_inv _ := Subtype.ext rfl + map_add' _ _ := Subtype.ext rfl + map_mul' _ _ := Subtype.ext rfl + +/-- The equivalence with `ℤ_p` preserves the underlying element of `ℚ_p`. -/ +@[simp] theorem integerRingEquivPadicInt_coe (x : 𝒪[ℚ_[p]]) : + ((integerRingEquivPadicInt p x : ℤ_[p]) : ℚ_[p]) = (x : ℚ_[p]) := rfl + +/-- The valuative integer ring of `ℚ_p` is canonically equivalent to the +valuation subring of the bundled p-adic complete discrete valuation field. -/ +noncomputable def integerRingEquivPadicDVRValuationSubring : + 𝒪[ℚ_[p]] ≃+* + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuationSubring := + (integerRingEquivPadicInt p).trans + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicIntEquivValuationSubring p) + +/-- The equivalence with the bundled p-adic valuation subring preserves the +underlying field element. -/ +@[simp] theorem integerRingEquivPadicDVRValuationSubring_coe + (x : 𝒪[ℚ_[p]]) : + ((integerRingEquivPadicDVRValuationSubring p x : + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuationSubring) : + ℚ_[p]) = (x : ℚ_[p]) := by + rfl + +/-- Transport to the bundled p-adic valuation ring identifies the two +definitions of the `n`-th principal-unit group. -/ +theorem unitsMapEquiv_mem_higherPrincipalUnitGroup_iff + (n : ℕ) (u : 𝒪[ℚ_[p]]ˣ) : + Units.mapEquiv (integerRingEquivPadicDVRValuationSubring p).toMulEquiv u ∈ + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p) n ↔ + u ∈ principalUnits ℚ_[p] n := by + rw [LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.mem_iff, + mem_principalUnits_iff] + change integerRingEquivPadicDVRValuationSubring p + ((u : 𝒪[ℚ_[p]]) - 1) ∈ + IsLocalRing.maximalIdeal + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).valuationSubring ^ n ↔ + (u : 𝒪[ℚ_[p]]) - 1 ∈ IsLocalRing.maximalIdeal 𝒪[ℚ_[p]] ^ n + exact ringEquiv_mem_maximalIdeal_pow_iff + (integerRingEquivPadicDVRValuationSubring p) n ((u : 𝒪[ℚ_[p]]) - 1) + +/-- The image of p-adic principal units is the bundled complete-DVF +higher-principal-unit group. -/ +theorem principalUnits_map_eq_higherPrincipalUnitGroup (n : ℕ) : + (principalUnits ℚ_[p] n).map + (Units.mapEquiv + (integerRingEquivPadicDVRValuationSubring p).toMulEquiv).toMonoidHom = + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p) n := by + let E := Units.mapEquiv + (integerRingEquivPadicDVRValuationSubring p).toMulEquiv + ext u + constructor + · rintro ⟨v, hv, rfl⟩ + exact (unitsMapEquiv_mem_higherPrincipalUnitGroup_iff p n v).2 hv + · intro hu + refine ⟨E.symm u, ?_, ?_⟩ + · exact (unitsMapEquiv_mem_higherPrincipalUnitGroup_iff p n (E.symm u)).1 + (by simpa [E] using hu) + · change E (E.symm u) = u + exact E.apply_symm_apply u + +/-- The quotient of p-adic integer units by principal units is equivalent to +the corresponding quotient in the bundled complete-DVF model. -/ +noncomputable def integerUnitsPrincipalQuotEquivPadicDVR (n : ℕ) : + IntegerUnitsPrincipalQuot ℚ_[p] n ≃* + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuationSubringˣ ⧸ + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p) n := + QuotientGroup.congr _ _ + (Units.mapEquiv + (integerRingEquivPadicDVRValuationSubring p).toMulEquiv) + (principalUnits_map_eq_higherPrincipalUnitGroup p n) + +/-- Reduction modulo the `n`-th maximal-ideal power in the bundled p-adic +valuation ring is canonically `ZMod (p ^ n)`. -/ +noncomputable def padicDVRQuotientEquivZMod (n : ℕ) : + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuationSubring ⧸ + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).maximalIdeal ^ + n ≃+* + ZMod (p ^ n) := by + let F := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p + let e : F.valuationSubring ≃+* ℤ_[p] := + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicIntEquivValuationSubring p).symm + have hmap : Ideal.map e.toRingHom (F.maximalIdeal ^ n) = + Ideal.span ({(p : ℤ_[p]) ^ n} : Set ℤ_[p]) := by + rw [ringEquiv_map_maximalIdeal_pow, PadicInt.maximalIdeal_eq_span_p, + Ideal.span_singleton_pow] + exact (Ideal.quotientEquiv (F.maximalIdeal ^ n) + (Ideal.span ({(p : ℤ_[p]) ^ n} : Set ℤ_[p])) e hmap.symm).trans + ((Ideal.quotEquivOfEq (PadicInt.ker_toZModPow n).symm).trans + (RingHom.quotientKerEquivOfSurjective + (ZMod.ringHom_surjective (PadicInt.toZModPow n)))) + +/-- The quotient of p-adic integer units by `U^(k+1)` has cardinality +`(p - 1) * p ^ k`. -/ +theorem nat_card_integerUnitsPrincipalQuot_padic_succ (k : ℕ) : + Nat.card (IntegerUnitsPrincipalQuot ℚ_[p] (k + 1)) = + (p - 1) * p ^ k := by + let F := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p + let : Finite F.residueField := + LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF_residueField_finite p + calc + Nat.card (IntegerUnitsPrincipalQuot ℚ_[p] (k + 1)) = + Nat.card (F.valuationSubringˣ ⧸ + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F (k + 1)) := + Nat.card_congr (integerUnitsPrincipalQuotEquivPadicDVR p (k + 1)).toEquiv + _ = Nat.card ((F.valuationSubring ⧸ F.maximalIdeal ^ (k + 1))ˣ) := + card_unitsModHigherPrincipalUnitGroup_eq_quotientUnits + F (k + 1) (Nat.succ_le_succ (Nat.zero_le k)) + _ = Nat.card (ZMod (p ^ (k + 1)))ˣ := + Nat.card_congr + (Units.mapEquiv (padicDVRQuotientEquivZMod p (k + 1)).toMulEquiv).toEquiv + _ = Nat.totient (p ^ (k + 1)) := by + rw [← Fintype.card_eq_nat_card, ZMod.card_units_eq_totient] + _ = (p - 1) * p ^ k := by + rw [Nat.totient_prime_pow (Fact.out : Nat.Prime p) (Nat.succ_pos k)] + simp [Nat.mul_comm] + +/-- The rational prime `p`, regarded as a unit of the field `ℚ_p`. -/ +noncomputable def padicPrimeUnit : ℚ_[p]ˣ := + Units.mk0 (p : ℚ_[p]) (by exact_mod_cast (Fact.out : Nat.Prime p).ne_zero) + +/-- The rational prime `p`, regarded as an element of the p-adic integer +ring. -/ +noncomputable def padicPrimeInteger : 𝒪[ℚ_[p]] := + (integerRingEquivPadicInt p).symm (p : ℤ_[p]) + +/-- Coercing the p-adic prime integer back to `ℚ_p` gives `p`. -/ +@[simp] theorem padicPrimeInteger_coe : + ((padicPrimeInteger p : 𝒪[ℚ_[p]]) : ℚ_[p]) = (p : ℚ_[p]) := rfl + +/-- The p-adic prime integer is irreducible. -/ +theorem padicPrimeInteger_irreducible : + Irreducible (padicPrimeInteger p) := by + exact (MulEquiv.irreducible_iff + (integerRingEquivPadicInt p).symm.toMulEquiv).2 + ((PadicInt.prime_p : Prime (p : ℤ_[p])).irreducible) + +/-- The normalized additive valuation of the field unit `p` is `-1` in the +field-unit convention used by local class field theory. -/ +theorem valuationMap_padicPrimeUnit : + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap ℚ_[p] + (Additive.ofMul (padicPrimeUnit p)) = -1 := by + simpa [LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_apply] using + (v_integerRingIrreducibleFieldUnit ℚ_[p] + (padicPrimeInteger p) (padicPrimeInteger_irreducible p) + (padicPrimeUnit p) rfl) + +/-- The inverse of the p-adic prime unit is a normalized uniformizer of +additive valuation one. -/ +theorem valuationMap_padicPrimeUnit_inv : + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap ℚ_[p] + (Additive.ofMul (padicPrimeUnit p)⁻¹) = 1 := by + rw [LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_ofMul_inv, + valuationMap_padicPrimeUnit] + norm_num + +/-- The standard field-unit quotient generated by `p⁻¹` and `U^(k+1)` has +cardinality `(p - 1) * p ^ k`. -/ +theorem nat_card_fieldUnitsUniformizerPrincipalQuot_padic_succ + (k : ℕ) : + Nat.card (ℚ_[p]ˣ ⧸ LocalFieldTheory.uniformizerPrincipalSubgroup ℚ_[p] + (padicPrimeUnit p)⁻¹ 1 (k + 1)) = (p - 1) * p ^ k := by + let := padicIsNonarchimedeanLocalField p + calc + Nat.card (ℚ_[p]ˣ ⧸ LocalFieldTheory.uniformizerPrincipalSubgroup ℚ_[p] + (padicPrimeUnit p)⁻¹ 1 (k + 1)) = + Nat.card (IntegerUnitsPrincipalQuot ℚ_[p] (k + 1)) := + Nat.card_congr + (LocalFieldTheory.uniformizerPrincipalQuotientEquivIntegerUnitsPrincipalQuotient ℚ_[p] + (padicPrimeUnit p)⁻¹ + (valuationMap_padicPrimeUnit_inv p) (k + 1)).toEquiv + _ = (p - 1) * p ^ k := + nat_card_integerUnitsPrincipalQuot_padic_succ p k + +/-- Every element of the `(k+1)`-st p-adic maximal-ideal power is the +`((p-1) * p^k)`-fold additive multiple of an element of the maximal ideal. -/ +theorem padicInt_exists_degree_root_of_mem_maximalIdeal_pow_succ + (k : ℕ) (z : ℤ_[p]) + (hz : z ∈ IsLocalRing.maximalIdeal ℤ_[p] ^ (k + 1)) : + ∃ b : ℤ_[p], + b ∈ IsLocalRing.maximalIdeal ℤ_[p] ∧ + ((p - 1) * p ^ k) • b = z := by + have hpone : 1 ≤ p := (Fact.out : Nat.Prime p).one_le + have hptwo : 2 ≤ p := (Fact.out : Nat.Prime p).two_le + have hpred_ne : p - 1 ≠ 0 := by omega + have hp_not_dvd_pred : ¬ p ∣ p - 1 := by + intro h + have hle : p ≤ p - 1 := Nat.le_of_dvd (by omega) h + omega + have hvalpred : (p - 1 : ℤ_[p]).valuation = 0 := by + have hvalNat : (((p - 1 : ℕ) : ℤ_[p])).valuation = 0 := by + rw [LocalFieldTheory.DiscreteValuationField.padicInt_valuation_natCast, + padicValNat.eq_zero_of_not_dvd hp_not_dvd_pred] + rw [Nat.cast_sub hpone, Nat.cast_one] at hvalNat + exact hvalNat + have hpred_qp_ne : (p - 1 : ℤ_[p]) ≠ 0 := by exact_mod_cast hpred_ne + have hpred_unit : IsUnit (p - 1 : ℤ_[p]) := by + rw [PadicInt.isUnit_iff, PadicInt.norm_eq_zpow_neg_valuation hpred_qp_ne, + hvalpred] + simp + let u : ℤ_[p]ˣ := hpred_unit.unit + have hu : (u : ℤ_[p]) = (p - 1 : ℤ_[p]) := hpred_unit.unit_spec + rw [PadicInt.maximalIdeal_eq_span_p, Ideal.span_singleton_pow, + Ideal.mem_span_singleton] at hz + obtain ⟨c, rfl⟩ := hz + let b : ℤ_[p] := c * p * ((↑(u⁻¹) : ℤ_[p])) + refine ⟨b, ?_, ?_⟩ + · rw [PadicInt.maximalIdeal_eq_span_p, Ideal.mem_span_singleton] + refine ⟨c * (↑(u⁻¹) : ℤ_[p]), ?_⟩ + simp [b, mul_left_comm, mul_assoc] + · simp only [nsmul_eq_mul, Nat.cast_mul, Nat.cast_sub hpone, + Nat.cast_one, Nat.cast_pow] + rw [← hu] + simp [b, pow_succ, mul_comm, mul_left_comm, mul_assoc] + +/-- The residue field of the canonical p-adic discrete valuation is finite. -/ +noncomputable instance padicDVR_residueField_finite : + Finite (IsLocalRing.ResidueField + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation + p).valuationSubring) := by + simpa [LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF, + ValuationTheory.DiscreteValuationField.CompleteDVF.residueField, + ValuationTheory.DiscreteValuationField.CompleteDVF.valuationSubring, + ValuationTheory.DiscreteValuationField.CompleteDVF.toDVF] using + LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF_residueField_finite p + +/-- The residue characteristic of the canonical p-adic discrete valuation +is `p`. -/ +theorem padicDVR_residueCharacteristic : + (LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation + p)).residueCharacteristic = p := by + let v := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p + let eO : ℤ_[p] ≃+* v.valuationSubring := + LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicIntEquivValuationSubring p + let eRes : IsLocalRing.ResidueField v.valuationSubring ≃+* ZMod p := + (IsLocalRing.ResidueField.mapEquiv eO).symm.trans + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicIntResidueFieldEquivZMod p) + let : CharP (IsLocalRing.ResidueField v.valuationSubring) p := + charP_of_injective_ringHom (f := eRes.symm.toRingHom) eRes.symm.injective p + change ringChar (IsLocalRing.ResidueField v.valuationSubring) = p + exact ringChar.eq (IsLocalRing.ResidueField v.valuationSubring) p + +/-- The canonical multiplicative discrete valuation sends `p` to +`exp (-1)`. -/ +theorem padicDVR_valuation_p : + LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p (p : ℚ_[p]) = + WithZero.exp (-1 : ℤ) := by + change (IsDiscreteValuationRing.maximalIdeal ℤ_[p]).valuation ℚ_[p] + (((p : ℤ_[p]) : ℚ_[p])) = WithZero.exp (-1 : ℤ) + calc + (IsDiscreteValuationRing.maximalIdeal ℤ_[p]).valuation ℚ_[p] + (((p : ℤ_[p]) : ℚ_[p])) = + (IsDiscreteValuationRing.maximalIdeal ℤ_[p]).intValuation (p : ℤ_[p]) := by + simpa using + (IsDiscreteValuationRing.maximalIdeal ℤ_[p]).valuation_of_algebraMap + (K := ℚ_[p]) (p : ℤ_[p]) + _ = WithZero.exp (-1 : ℤ) := + IsDedekindDomain.HeightOneSpectrum.intValuation_singleton + (IsDiscreteValuationRing.maximalIdeal ℤ_[p]) + (by exact_mod_cast (Fact.out : Nat.Prime p).ne_zero) + PadicInt.maximalIdeal_eq_span_p + +/-- The absolute ramification index of the canonical valuation on `ℚ_p` is +one. -/ +theorem padicDVR_ramificationIndex_eq_one : + LocalFieldTheory.DiscreteValuationField.LocalField.ramificationIndexOfWithZeroValuation + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p) = 1 := by + let v := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p + have h := + ramificationIndexOfWithZeroValuation_intCast v + rw [padicDVR_residueCharacteristic p, padicDVR_valuation_p p] at h + simp only [WithZero.log_exp, neg_neg] at h + exact_mod_cast h + +/-- For odd `p`, depth one lies in the convergence range of the p-adic +logarithm and exponential. -/ +theorem padicDVR_logExp_level_one_of_odd (hp2 : p ≠ 2) : + (LocalFieldTheory.DiscreteValuationField.LocalField.ramificationIndexOfWithZeroValuation + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p) : ℚ) / + (((LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation + p)).residueCharacteristic : ℚ) - 1) < + (1 : ℚ) := by + rw [padicDVR_ramificationIndex_eq_one p, + padicDVR_residueCharacteristic p] + have hp3 : 3 ≤ p := by + have hp2le : 2 ≤ p := (Fact.out : Nat.Prime p).two_le + omega + have hden : (0 : ℚ) < (p : ℚ) - 1 := by + have hp1 : (1 : ℚ) < (p : ℚ) := by + exact_mod_cast (Fact.out : Nat.Prime p).one_lt + linarith + rw [div_lt_one hden] + have hi : (1 : ℤ) < Int.subNatNat p 1 := by + rw [Int.subNatNat_eq_coe] + omega + exact_mod_cast hi + +/-- For odd `p`, every positive depth lies in the convergence range of the +p-adic logarithm and exponential. -/ +theorem padicDVR_logExp_level_succ_of_odd + (hp2 : p ≠ 2) (k : ℕ) : + (LocalFieldTheory.DiscreteValuationField.LocalField.ramificationIndexOfWithZeroValuation + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p) : ℚ) / + (((LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation + p)).residueCharacteristic : ℚ) - 1) < + (k + 1 : ℚ) := by + apply lt_of_lt_of_le (padicDVR_logExp_level_one_of_odd p hp2) + exact_mod_cast (Nat.succ_le_succ (Nat.zero_le k)) + +/-- At a depth in the convergence range, exponential and logarithm identify +the multiplicative maximal-ideal power with the higher principal units. -/ +noncomputable def expLogMulEquivOfWithZeroValuation + {K : Type*} [Field K] + (v : Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (hv : Function.Surjective v) (n : ℕ) + (hlevel : + (LocalFieldTheory.DiscreteValuationField.LocalField.ramificationIndexOfWithZeroValuation v + : ℚ) / + (((LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation + v).residueCharacteristic : ℚ) - 1) < + (n : ℚ)) : + Multiplicative + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal + (completeDVFOfWithZeroValuation v).valuationSubring) ≃* + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v) n := by + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let P := + chosenExpLogContinuousMulEquiv + v hv n hlevel + refine + { toFun := fun a => P a + invFun := fun u => P.symm u + left_inv := ?_ + right_inv := ?_ + map_mul' := ?_ } + · exact P.left_inv + · exact P.right_inv + · exact P.map_mul + +/-- The underlying field value of the exponential/logarithm equivalence is +given by the evaluated exponential series. -/ +theorem expLogMulEquivOfWithZeroValuation_fieldVal + {K : Type*} [Field K] + (v : Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] + (hv : Function.Surjective v) (n : ℕ) + (hlevel : + (LocalFieldTheory.DiscreteValuationField.LocalField.ramificationIndexOfWithZeroValuation v + : ℚ) / + (((LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation + v).residueCharacteristic : ℚ) - 1) < + (n : ℚ)) + (a : Multiplicative + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal + (completeDVFOfWithZeroValuation v).valuationSubring)) : + let F := + completeDVFOfWithZeroValuation v + let E := expLogMulEquivOfWithZeroValuation v hv n hlevel + ((((E a : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F n) + : F.valuationSubringˣ) : + F.valuationSubring) : K) = + expSeriesFieldOfWithZeroValuation + v (((a.toAdd : F.valuationSubring) : K)) + (fun m => + Nat.cast_ne_zero.mpr (Nat.factorial_ne_zero m)) := by + let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let p : ℕ := + (LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation v).residueCharacteristic + let _ : Fact p.Prime := by + dsimp [p] + infer_instance + simp only [expLogMulEquivOfWithZeroValuation] + simp only [ + chosenExpLogContinuousMulEquiv, + principalUnitExpLogContinuousMulEquivOfExactOfWithZeroValuationScaled, + principalUnitExpLogMulEquivOfExactOfWithZeroValuationScaled] + apply + principalUnitExpSeries_maximalIdealPow_val_ofWithZeroValuationScaled + (v := v) (p := p) + (LocalFieldTheory.DiscreteValuationField.LocalField.ramificationIndexOfWithZeroValuation v) + n + case hπval => + exact Classical.choose_spec + (exists_valuationSubring_valuation_eq_exp_neg_one_of_surjective + v hv) + case hπ => + exact + isUniformizer_of_valuation_eq_exp_neg_one + v _ + (Classical.choose_spec + (exists_valuationSubring_valuation_eq_exp_neg_one_of_surjective + v hv)) + case hlevel => exact hlevel + case hnval => + intro m + exact + valuation_natCast_factorial_eq_exp_neg_ramificationIndex_mul_padicValNat + v m + case hcomplete => + exact + completeSpace_ofWithZeroValuation + v + +/-- For odd `p`, every element of `U^(k+1)` is a +`((p-1) * p^k)`-th power of an element of `U¹`. -/ +theorem padicDVR_higherPrincipalUnit_degree_is_power_odd + (hp2 : p ≠ 2) (k : ℕ) : + let v := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p + let F := + completeDVFOfWithZeroValuation v + ∀ u : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F (k + 1), + ∃ r : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 1, + (r : F.valuationSubringˣ) ^ ((p - 1) * p ^ k) = + (u : F.valuationSubringˣ) := by + let v := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p + let F := + completeDVFOfWithZeroValuation v + change ∀ u : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F (k + + 1), + ∃ r : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 1, + (r : F.valuationSubringˣ) ^ ((p - 1) * p ^ k) = + (u : F.valuationSubringˣ) + have hv : Function.Surjective v := + (IsDiscreteValuationRing.maximalIdeal ℤ_[p]).valuation_surjective ℚ_[p] + let E1 := expLogMulEquivOfWithZeroValuation v hv 1 + (padicDVR_logExp_level_one_of_odd p hp2) + let En := expLogMulEquivOfWithZeroValuation v hv (k + 1) (by + simpa [Nat.cast_add, Nat.cast_one] using + padicDVR_logExp_level_succ_of_odd p hp2 k) + let eO : ℤ_[p] ≃+* F.valuationSubring := + LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicIntEquivValuationSubring p + intro u + let a : Multiplicative (F.maximalIdeal ^ (k + 1) : Ideal F.valuationSubring) := + En.symm u + let z : ℤ_[p] := eO.symm (a.toAdd : F.valuationSubring) + have hz : z ∈ IsLocalRing.maximalIdeal ℤ_[p] ^ (k + 1) := by + apply (ringEquiv_mem_maximalIdeal_pow_iff eO (k + 1) z).1 + simp [z] + obtain ⟨b, hb, hdb⟩ := + padicInt_exists_degree_root_of_mem_maximalIdeal_pow_succ p k z hz + have hbO : eO b ∈ F.maximalIdeal := by + rw [← pow_one F.maximalIdeal] + exact (ringEquiv_mem_maximalIdeal_pow_iff eO 1 b).2 (by simpa using hb) + let b1 : (F.maximalIdeal ^ 1 : Ideal F.valuationSubring) := + ⟨eO b, by simpa using hbO⟩ + have hdbO : ((p - 1) * p ^ k) • (eO b) = (a.toAdd : F.valuationSubring) := by + rw [← map_nsmul eO ((p - 1) * p ^ k) b, hdb] + simp [z] + let r : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 1 := E1 + (Multiplicative.ofAdd b1) + refine ⟨r, ?_⟩ + have hua : En a = u := En.apply_symm_apply u + have hrpow : + r ^ ((p - 1) * p ^ k) = + E1 ((Multiplicative.ofAdd b1) ^ ((p - 1) * p ^ k)) := by + change E1 (Multiplicative.ofAdd b1) ^ ((p - 1) * p ^ k) = + E1 ((Multiplicative.ofAdd b1) ^ ((p - 1) * p ^ k)) + exact (map_pow E1 (Multiplicative.ofAdd b1) ((p - 1) * p ^ k)).symm + change ((r ^ ((p - 1) * p ^ k) : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 1) : + F.valuationSubringˣ) = (u : F.valuationSubringˣ) + rw [hrpow, ← hua] + apply Units.ext + apply Subtype.ext + have hleft := expLogMulEquivOfWithZeroValuation_fieldVal v hv 1 + (padicDVR_logExp_level_one_of_odd p hp2) + ((Multiplicative.ofAdd b1) ^ ((p - 1) * p ^ k)) + have hright := expLogMulEquivOfWithZeroValuation_fieldVal v hv (k + 1) + (by + simpa [Nat.cast_add, Nat.cast_one] using + padicDVR_logExp_level_succ_of_odd p hp2 k) a + have hleft' : + ((((E1 ((Multiplicative.ofAdd b1) ^ ((p - 1) * p ^ k)) : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 1) : + F.valuationSubringˣ) : + F.valuationSubring) : ℚ_[p]) = + expSeriesFieldOfWithZeroValuation + v ((((Multiplicative.ofAdd b1) ^ ((p - 1) * p ^ k)).toAdd : + F.valuationSubring) : ℚ_[p]) + (fun m => + Nat.cast_ne_zero.mpr (Nat.factorial_ne_zero m)) := by + exact hleft + have hright' : + ((((En a : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F + (k + 1)) : F.valuationSubringˣ) : + F.valuationSubring) : ℚ_[p]) = + expSeriesFieldOfWithZeroValuation + v ((a.toAdd : F.valuationSubring) : ℚ_[p]) + (fun m => + Nat.cast_ne_zero.mpr (Nat.factorial_ne_zero m)) := by + exact hright + rw [hleft', hright'] + congr 2 + +end LocalFieldTheory.Padic + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean new file mode 100644 index 0000000000..6f4f3ae886 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean @@ -0,0 +1,635 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitStructure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.NonarchimedeanLocalField +public import Mathlib.Topology.Algebra.Group.Units +public import Mathlib.NumberTheory.Padics.ValuativeRel +public import Mathlib.NumberTheory.Padics.ProperSpace +public import Mathlib.GroupTheory.Torsion +/-! +# Unit decomposition of the p-adic integers + +This file constructs the reusable topological decomposition of +`ℤ_[p]ˣ` into its finite factor and its principal `p`-adic factor. +-/ + +@[expose] public section + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + continuousMulEquivOfCompactToT2 → + continuousMulEquivOfCompactToT2 + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + residueRootsOfUnityContinuousMulEquivZMod → + residueRootsOfUnityContinuousMulEquivZMod + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + residueRootsOfUnityEquivResidueFieldUnits → + residueRootsOfUnityEquivResidueFieldUnits + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + valuationSubringUnitsEquivRootsTimesPrincipalUnits → + valuationSubringUnitsEquivRootsTimesPrincipalUnits + +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + valuationSubringUnitsEquivRootsTimesPrincipalUnits_apply → + valuationSubringUnitsEquivRootsTimesPrincipalUnits_apply + + +open scoped Topology + +noncomputable +section + +namespace LocalFieldTheory +namespace Padic + +open scoped WithZero +open IsDedekindDomain IsDedekindDomain.HeightOneSpectrum +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp + +theorem padicDVRValuation_surjective + (p : ℕ) [Fact p.Prime] : + Function.Surjective (padicDVRValuation p) := by + intro y + by_cases hy : y = 0 + · exact ⟨0, by simp [hy]⟩ + let π := + valuation_exists_uniformizer ℚ_[p] + (IsDiscreteValuationRing.maximalIdeal ℤ_[p]) |>.choose + have hπ : + padicDVRValuation p π = + WithZero.exp (-1 : ℤ) := + valuation_exists_uniformizer ℚ_[p] + (IsDiscreteValuationRing.maximalIdeal ℤ_[p]) |>.choose_spec + refine ⟨π ^ (- WithZero.log y), ?_⟩ + rw [map_zpow₀ (padicDVRValuation p) π (- WithZero.log y)] + rw [hπ] + rw [← WithZero.exp_zsmul] + simpa using WithZero.exp_log hy + +local instance padicDVRResidueFinite + (p : ℕ) [Fact p.Prime] : + Finite + (IsLocalRing.ResidueField + (padicDVRValuation p).valuationSubring) := by + simpa [padicCompleteDVF] using + padicCompleteDVF_residueField_finite p + +/-- The residue field of the valuation-theoretic presentation of `ℚ_[p]` +is canonically `ZMod p`. -/ +noncomputable def padicResidueEquivZMod + (p : ℕ) [Fact p.Prime] : + (LocalField.ofWithZeroValuation + (padicDVRValuation p)).residueField ≃+* ZMod p := + (IsLocalRing.ResidueField.mapEquiv + (padicIntEquivValuationSubring p)).symm.trans + (padicIntResidueFieldEquivZMod p) + +theorem padic_residueCharacteristic_eq + (p : ℕ) [Fact p.Prime] : + (LocalField.ofWithZeroValuation + (padicDVRValuation p)).residueCharacteristic = p := by + let F := + LocalField.ofWithZeroValuation + (padicDVRValuation p) + let e : F.residueField ≃+* ZMod p := + padicResidueEquivZMod p + have : CharP F.residueField p := by + constructor + intro n + rw [← e.injective.eq_iff, map_natCast, map_zero] + exact CharP.cast_eq_zero_iff (ZMod p) p n + exact ringChar.eq F.residueField p + +theorem padicDVRValued_uniformSpace_eq_standard + (p : ℕ) [Fact p.Prime] : + (Valued.mk' (padicDVRValuation p)).toUniformSpace = + (inferInstance : UniformSpace ℚ_[p]) := by + let v := padicDVRValuation p + let standard : Valued ℚ_[p] NNReal := + NormedField.toValued + let w : Valuation ℚ_[p] NNReal := standard.v + have hvw : v.IsEquiv w := by + apply Valuation.isEquiv_of_val_le_one + intro x + change v x ≤ 1 ↔ ‖x‖₊ ≤ 1 + rw [LocalField.padicDVRValuation_le_one_iff_norm_le_one] + change + (↑‖x‖₊ : ℝ) ≤ (↑(1 : NNReal) : ℝ) ↔ ‖x‖₊ ≤ 1 + exact NNReal.coe_le_coe + have hmk : + (Valued.mk' v).toUniformSpace = + (Valued.mk' w).toUniformSpace := by + apply le_antisymm + · rw [le_iff_uniformContinuous_id] + simpa using hvw.symm.uniformContinuous + · rw [le_iff_uniformContinuous_id] + simpa using hvw.uniformContinuous + have hstandard : + standard.toUniformSpace = + (Valued.mk' w).toUniformSpace := + (@Valued.toUniformSpace_eq ℚ_[p] _ NNReal _ standard).trans + (@Valued.toUniformSpace_eq ℚ_[p] _ NNReal _ + (Valued.mk' w)).symm + exact hmk.trans hstandard.symm + +theorem padic_finrank_eq_one + (p : ℕ) [Fact p.Prime] : + let v := padicDVRValuation p + let F := LocalField.ofWithZeroValuation v + letI : LocalField.MixedWithZeroValuationContext v := + LocalField.mixedWithZeroValuationContext v + Module.finrank ℚ_[F.residueCharacteristic] ℚ_[p] = 1 := by + let v := padicDVRValuation p + let F := LocalField.ofWithZeroValuation v + let : LocalField.MixedWithZeroValuationContext v := + LocalField.mixedWithZeroValuationContext v + dsimp only + apply Algebra.finrank_eq_one_iff_bijective_algebraMap.mpr + refine ⟨RingHom.injective _, ?_⟩ + let direct : Valued ℚ_[p] (WithZero (Multiplicative ℤ)) := + Valued.mk' v + let restricted : Valued ℚ_[p] F.mrangeValueGroup := + CompleteDVF.mrangeRestrictValued F.toCompleteDVF + have hrestricted : + @IsUniformInducing + ℚ_[F.residueCharacteristic] ℚ_[p] + inferInstance restricted.toUniformSpace + (algebraMap ℚ_[F.residueCharacteristic] ℚ_[p]) := by + let : Valued ℚ_[p] F.mrangeValueGroup := restricted + change IsUniformInducing + (fun x : ℚ_[F.residueCharacteristic] => + ((F.qpadicNumbersEquivQpadicClosureSubfield x : + F.qpadicClosureSubfield) : ℚ_[p])) + exact isUniformEmbedding_subtype_val.isUniformInducing.comp + F.qpadicNumbersToQpadicClosureSubfield_isUniformInducing + have huniform : + direct.toUniformSpace = restricted.toUniformSpace := by + change + (Valued.mk' v).toUniformSpace = + (CompleteDVF.mrangeRestrictValued + (WithZeroValuationTopology.completeDVF v)).toUniformSpace + exact WithZeroValuationTopology.valuedMk_uniformSpace_eq_mrangeRestrict v + have hUR : + (PseudoMetricSpace.toUniformSpace : UniformSpace ℚ_[p]) = + restricted.toUniformSpace := + (padicDVRValued_uniformSpace_eq_standard p).symm.trans huniform + have hclosed : + @IsClosed ℚ_[p] restricted.toTopologicalSpace + (Set.range + (algebraMap ℚ_[F.residueCharacteristic] ℚ_[p])) := by + have hembedding : + @IsUniformEmbedding + ℚ_[F.residueCharacteristic] ℚ_[p] + inferInstance restricted.toUniformSpace + (algebraMap ℚ_[F.residueCharacteristic] ℚ_[p]) := + ⟨hrestricted, RingHom.injective _⟩ + exact hembedding.isClosedEmbedding.isClosed_range + have hratDense : + @DenseRange ℚ_[p] restricted.toTopologicalSpace + ℚ ((↑) : ℚ → ℚ_[p]) := by + have htop : + (PseudoMetricSpace.toUniformSpace : + UniformSpace ℚ_[p]).toTopologicalSpace = + restricted.toTopologicalSpace := + congrArg (fun U : UniformSpace ℚ_[p] => U.toTopologicalSpace) hUR + let P := fun T : TopologicalSpace ℚ_[p] => + @DenseRange ℚ_[p] T ℚ ((↑) : ℚ → ℚ_[p]) + exact (congrArg P htop).mp (Padic.denseRange_ratCast p) + have hdense : + @DenseRange ℚ_[p] restricted.toTopologicalSpace + ℚ_[F.residueCharacteristic] + (algebraMap ℚ_[F.residueCharacteristic] ℚ_[p]) := by + apply DenseRange.of_comp + (g := ((↑) : ℚ → ℚ_[F.residueCharacteristic])) + have hcomp : + (algebraMap ℚ_[F.residueCharacteristic] ℚ_[p]) ∘ + ((↑) : ℚ → ℚ_[F.residueCharacteristic]) = + ((↑) : ℚ → ℚ_[p]) := by + funext q + simpa only [Function.comp_apply] using + (map_ratCast + (algebraMap ℚ_[F.residueCharacteristic] ℚ_[p]) q) + rw [hcomp] + exact hratDense + rw [← Set.range_eq_univ] + exact hclosed.closure_eq.symm.trans hdense.closure_range + +/-- After identifying the residue characteristic with `p` and the relative +degree with one, the free additive factor is canonically `ℤ_[p]`. -/ +noncomputable def padicFreeContinuousAddEquivOfEq + (p q d : ℕ) [Fact p.Prime] [Fact q.Prime] + (hq : q = p) (hd : d = 1) : + (Fin d → ℤ_[q]) ≃ₜ+ ℤ_[p] := by + subst q + subst d + exact + { AddEquiv.funUnique (Fin 1) ℤ_[p] with + continuous_toFun := continuous_apply 0 + continuous_invFun := continuous_pi fun _ => continuous_id } + +/-- The free additive factor in the mixed-characteristic structure theorem +for `ℚ_[p]` is continuously equivalent to `ℤ_[p]`. -/ +noncomputable def padicFreeContinuousAddEquiv + (p : ℕ) [Fact p.Prime] : + let v := padicDVRValuation p + let F := LocalField.ofWithZeroValuation v + letI : LocalField.MixedWithZeroValuationContext v := + LocalField.mixedWithZeroValuationContext v + let d := Module.finrank ℚ_[F.residueCharacteristic] ℚ_[p] + (Fin d → ℤ_[F.residueCharacteristic]) ≃ₜ+ ℤ_[p] := by + let v := padicDVRValuation p + let F := LocalField.ofWithZeroValuation v + letI : LocalField.MixedWithZeroValuationContext v := + LocalField.mixedWithZeroValuationContext v + let q := F.residueCharacteristic + let d := Module.finrank ℚ_[q] ℚ_[p] + change (Fin d → ℤ_[q]) ≃ₜ+ ℤ_[p] + have hq : q = p := by + simpa [q, F, v] using padic_residueCharacteristic_eq p + have hd : d = 1 := by + simpa [d, F, v] using padic_finrank_eq_one p + exact padicFreeContinuousAddEquivOfEq p q d hq hd + +theorem padicIntEquivValuationSubring_coe + (p : ℕ) [Fact p.Prime] (z : ℤ_[p]) : + ((padicIntEquivValuationSubring p z : + (padicDVRValuation p).valuationSubring) : ℚ_[p]) = + (z : ℚ_[p]) := by + rfl + +theorem padicIntEquivValuationSubring_symm_coe + (p : ℕ) [Fact p.Prime] + (z : (padicDVRValuation p).valuationSubring) : + (((padicIntEquivValuationSubring p).symm z : ℤ_[p]) : ℚ_[p]) = + (z : ℚ_[p]) := by + calc + (((padicIntEquivValuationSubring p).symm z : ℤ_[p]) : ℚ_[p]) = + ((padicIntEquivValuationSubring p + ((padicIntEquivValuationSubring p).symm z) : + (padicDVRValuation p).valuationSubring) : ℚ_[p]) := by + symm + exact padicIntEquivValuationSubring_coe p _ + _ = (z : ℚ_[p]) := by + rw [RingEquiv.apply_symm_apply] + +/-- The standard `p`-adic integers and the valuation subring of `ℚ_[p]` +are continuously multiplicatively equivalent. -/ +noncomputable def padicIntValuationSubringContinuousMulEquiv + (p : ℕ) [Fact p.Prime] : + let v := padicDVRValuation p + ℤ_[p] ≃ₜ* v.valuationSubring := by + let v := padicDVRValuation p + let e := padicIntEquivValuationSubring p + exact + { e.toMulEquiv with + continuous_toFun := by + apply Continuous.subtype_mk + exact isometry_subtype_coe.continuous.congr fun z => + padicIntEquivValuationSubring_coe p z + continuous_invFun := by + apply Continuous.subtype_mk + exact isometry_subtype_coe.continuous.congr fun z => + (padicIntEquivValuationSubring_symm_coe p z).symm } + +/-- Multiplicative tagging turns a continuous additive equivalence into a +continuous multiplicative equivalence. -/ +noncomputable def continuousMultiplicativeEquivOfAddEquiv + {A B : Type*} [AddZeroClass A] [AddZeroClass B] + [TopologicalSpace A] [TopologicalSpace B] + (e : A ≃ₜ+ B) : + Multiplicative A ≃ₜ* Multiplicative B := + { e.toAddEquiv.toMultiplicative with + continuous_toFun := e.continuous_toFun + continuous_invFun := e.continuous_invFun } + +/-- Multiplicative tagging commutes continuously with binary products. -/ +noncomputable def prodMultiplicativeContinuousMulEquiv + (A B : Type*) [AddZeroClass A] [AddZeroClass B] + [TopologicalSpace A] [TopologicalSpace B] : + Multiplicative (A × B) ≃ₜ* + Multiplicative A × Multiplicative B := + { MulEquiv.prodMultiplicative A B with + continuous_toFun := continuous_fst.prodMk continuous_snd + continuous_invFun := continuous_fst.prodMk continuous_snd } + +/-- The product of two continuous multiplicative equivalences. -/ +noncomputable def continuousMulEquivProdCongr + {A B C D : Type*} + [TopologicalSpace A] [TopologicalSpace B] + [TopologicalSpace C] [TopologicalSpace D] + [MulOneClass A] [MulOneClass B] [MulOneClass C] [MulOneClass D] + (e : A ≃ₜ* B) (f : C ≃ₜ* D) : + A × C ≃ₜ* B × D := + { MulEquiv.prodCongr e.toMulEquiv f.toMulEquiv with + continuous_toFun := + (e.continuous_toFun.comp continuous_fst).prodMk + (f.continuous_toFun.comp continuous_snd) + continuous_invFun := + (e.continuous_invFun.comp continuous_fst).prodMk + (f.continuous_invFun.comp continuous_snd) } + +/-- Continuous multiplicative reassociation of a triple product. -/ +noncomputable def continuousMulEquivProdAssoc + (A B C : Type*) [TopologicalSpace A] [TopologicalSpace B] + [TopologicalSpace C] [MulOneClass A] [MulOneClass B] [MulOneClass C] : + (A × B) × C ≃ₜ* A × (B × C) := + { MulEquiv.prodAssoc with + continuous_toFun := + (continuous_fst.comp continuous_fst).prodMk + ((continuous_snd.comp continuous_fst).prodMk continuous_snd) + continuous_invFun := + (continuous_fst.prodMk (continuous_fst.comp continuous_snd)).prodMk + (continuous_snd.comp continuous_snd) } + +/-- The topology on the first principal-unit group induced directly from +the valuation topology on `ℚ_[p]`. -/ +@[implicit_reducible] +noncomputable def padicPrincipalUnitDirectTopology + (p : ℕ) [Fact p.Prime] : + let v := padicDVRValuation p + let F := LocalField.ofWithZeroValuation v + TopologicalSpace + (CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF 1) := by + let v := padicDVRValuation p + let F := LocalField.ofWithZeroValuation v + letI : Valued ℚ_[p] (WithZero (Multiplicative ℤ)) := + Valued.mk' v + exact inferInstance + +/-- The standard topology on the first principal-unit group of `ℚ_[p]`. -/ +@[implicit_reducible] +noncomputable def padicPrincipalUnitStandardTopology + (p : ℕ) [Fact p.Prime] : + let v := padicDVRValuation p + let F := LocalField.ofWithZeroValuation v + TopologicalSpace + (CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF 1) := by + exact inferInstance + +/-- The directly induced valuation topology agrees with the standard topology +on the first principal-unit group of `ℚ_[p]`. -/ +theorem padicPrincipalUnitDirectTopology_eq_standard + (p : ℕ) [Fact p.Prime] : + padicPrincipalUnitDirectTopology p = + padicPrincipalUnitStandardTopology p := by + let v := padicDVRValuation p + let F := LocalField.ofWithZeroValuation v + let U := CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF 1 + let liftTopology := fun T : TopologicalSpace ℚ_[p] => by + letI : TopologicalSpace ℚ_[p] := T + exact (inferInstance : TopologicalSpace U) + unfold padicPrincipalUnitDirectTopology + padicPrincipalUnitStandardTopology + change + liftTopology (Valued.mk' v).toTopologicalSpace = + liftTopology PseudoMetricSpace.toUniformSpace.toTopologicalSpace + exact congrArg liftTopology + (congrArg (fun U : UniformSpace ℚ_[p] => U.toTopologicalSpace) + (padicDVRValued_uniformSpace_eq_standard p)) + +/-- The mixed-characteristic structure data for the first principal units, +using the valuation-induced topology directly. -/ +noncomputable def padicPrincipalDataDirect + (p : ℕ) [Fact p.Prime] : + let v := padicDVRValuation p + let F := LocalField.ofWithZeroValuation v + letI : LocalField.MixedWithZeroValuationContext v := + LocalField.mixedWithZeroValuationContext v + letI : Valued ℚ_[p] (WithZero (Multiplicative ℤ)) := + Valued.mk' v + let d := Module.finrank ℚ_[F.residueCharacteristic] ℚ_[p] + Σ a : ℕ, + Multiplicative + (ZMod (F.residueCharacteristic ^ a) × + (Fin d → ℤ_[F.residueCharacteristic])) ≃ₜ* + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF 1 := by + let v := padicDVRValuation p + let F := LocalField.ofWithZeroValuation v + letI : LocalField.MixedWithZeroValuationContext v := + LocalField.mixedWithZeroValuationContext v + letI : Valued ℚ_[p] (WithZero (Multiplicative ℤ)) := + Valued.mk' v + exact LocalField.chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation + v (padicDVRValuation_surjective p) + +/-- The multiplicative equivalence underlying the first-principal-unit +structure data for `ℚ_[p]`. -/ +noncomputable def padicPrincipalMulData + (p : ℕ) [Fact p.Prime] : + let v := padicDVRValuation p + let F := LocalField.ofWithZeroValuation v + letI : LocalField.MixedWithZeroValuationContext v := + LocalField.mixedWithZeroValuationContext v + let d := Module.finrank ℚ_[F.residueCharacteristic] ℚ_[p] + Σ a : ℕ, + Multiplicative + (ZMod (F.residueCharacteristic ^ a) × + (Fin d → ℤ_[F.residueCharacteristic])) ≃* + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF 1 := by + let v := padicDVRValuation p + let F := LocalField.ofWithZeroValuation v + letI : LocalField.MixedWithZeroValuationContext v := + LocalField.mixedWithZeroValuationContext v + letI : Valued ℚ_[p] (WithZero (Multiplicative ℤ)) := + Valued.mk' v + exact ⟨(padicPrincipalDataDirect p).1, + (padicPrincipalDataDirect p).2.toMulEquiv⟩ + +/-- Forgetting topology preserves the finite cyclic exponent in the principal-unit data. -/ +theorem padicPrincipalMulData_fst (p : ℕ) [Fact p.Prime] : + (padicPrincipalMulData p).1 = (padicPrincipalDataDirect p).1 := rfl + +/-- The first-principal-unit structure data transported to the standard +`p`-adic topology. -/ +noncomputable def padicPrincipalData + (p : ℕ) [Fact p.Prime] : + let v := padicDVRValuation p + let F := LocalField.ofWithZeroValuation v + letI : LocalField.MixedWithZeroValuationContext v := + LocalField.mixedWithZeroValuationContext v + let d := Module.finrank ℚ_[F.residueCharacteristic] ℚ_[p] + Σ a : ℕ, + Multiplicative + (ZMod (F.residueCharacteristic ^ a) × + (Fin d → ℤ_[F.residueCharacteristic])) ≃ₜ* + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF 1 := by + let v := padicDVRValuation p + let F := LocalField.ofWithZeroValuation v + letI : LocalField.MixedWithZeroValuationContext v := + LocalField.mixedWithZeroValuationContext v + let d := Module.finrank ℚ_[F.residueCharacteristic] ℚ_[p] + let U := CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF 1 + let direct : Valued ℚ_[p] (WithZero (Multiplicative ℤ)) := + Valued.mk' v + letI : Valued ℚ_[p] (WithZero (Multiplicative ℤ)) := direct + let raw := + LocalField.chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation + v (padicDVRValuation_surjective p) + let directTopology : TopologicalSpace U := inferInstance + let standardTopology : TopologicalSpace U := + padicPrincipalUnitStandardTopology p + have hdirect : + directTopology = padicPrincipalUnitDirectTopology p := by + unfold directTopology padicPrincipalUnitDirectTopology + rfl + have htop : directTopology = standardTopology := + hdirect.trans (padicPrincipalUnitDirectTopology_eq_standard p) + let P : TopologicalSpace U → Type := fun T => + letI : TopologicalSpace U := T + Σ a : ℕ, + Multiplicative + (ZMod (F.residueCharacteristic ^ a) × + (Fin d → ℤ_[F.residueCharacteristic])) ≃ₜ* U + have hraw : P directTopology := raw + have hstandard : P standardTopology := + (congrArg P htop).mp hraw + exact hstandard + +/-- The finite factor in the topological decomposition of `ℤ_pˣ`. -/ +noncomputable abbrev padicUnitFiniteFactor + (p : ℕ) [Fact p.Prime] : Type := + let v := padicDVRValuation p + let F := LocalField.ofWithZeroValuation v + letI : LocalField.MixedWithZeroValuationContext v := + LocalField.mixedWithZeroValuationContext v + Multiplicative + (ZMod (Nat.card F.residueField - 1)) × + Multiplicative + (ZMod + (F.residueCharacteristic ^ (padicPrincipalData p).1)) + +/-- The standard topological decomposition +`ℤ_pˣ ≃ finite × ℤ_p` used in the local reciprocity calculation. -/ +noncomputable def padicUnitDecomposition + (p : ℕ) [Fact p.Prime] : + padicUnitFiniteFactor p × Multiplicative ℤ_[p] ≃ₜ* + ℤ_[p]ˣ := by + let v := padicDVRValuation p + let F := LocalField.ofWithZeroValuation v + letI : LocalField.MixedWithZeroValuationContext v := + LocalField.mixedWithZeroValuationContext v + let d := Module.finrank ℚ_[F.residueCharacteristic] ℚ_[p] + let a := (padicPrincipalData p).1 + let RootCyc := + Multiplicative + (ZMod (Nat.card F.residueField - 1)) + let FinCyc := + Multiplicative (ZMod (F.residueCharacteristic ^ a)) + let Free := + Fin d → ℤ_[F.residueCharacteristic] + let RootGroup := + CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup + F.toCompleteDVF + let U := + CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF 1 + change (RootCyc × FinCyc) × Multiplicative ℤ_[p] ≃ₜ* + ℤ_[p]ˣ + let rootsAlg : RootCyc ≃* RootGroup := by + letI : Valued ℚ_[p] + (MonoidHom.mrange + F.toCompleteDVF.valuation.toMonoidWithZeroHom) := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF + exact + (residueRootsOfUnityContinuousMulEquivZMod + F.toCompleteDVF).toMulEquiv + letI : Finite RootGroup := + Finite.of_equiv F.residueFieldˣ + (residueRootsOfUnityEquivResidueFieldUnits + F.toCompleteDVF).symm.toEquiv + letI : Finite RootCyc := + Finite.of_equiv RootGroup rootsAlg.symm.toEquiv + letI : NeZero (F.residueCharacteristic ^ a) := + ⟨pow_ne_zero _ + F.residueCharacteristic_prime.ne_zero⟩ + let roots : RootCyc ≃ₜ* RootGroup := + { rootsAlg with + continuous_toFun := continuous_of_discreteTopology + continuous_invFun := continuous_of_discreteTopology } + let principalRaw : Multiplicative (ZMod + (F.residueCharacteristic ^ a) × Free) ≃ₜ* U := by + exact (padicPrincipalData p).2 + let principalSplit : FinCyc × Multiplicative Free ≃ₜ* U := + (prodMultiplicativeContinuousMulEquiv + (ZMod (F.residueCharacteristic ^ a)) Free).symm.trans + principalRaw + let free : + Multiplicative Free ≃ₜ* Multiplicative ℤ_[p] := + continuousMultiplicativeEquivOfAddEquiv + (padicFreeContinuousAddEquiv p) + let principal : + FinCyc × Multiplicative ℤ_[p] ≃ₜ* U := + (continuousMulEquivProdCongr + (ContinuousMulEquiv.refl FinCyc) free.symm).trans + principalSplit + let factors : (RootCyc × FinCyc) × Multiplicative ℤ_[p] ≃ₜ* + RootGroup × U := + (continuousMulEquivProdAssoc + RootCyc FinCyc (Multiplicative ℤ_[p])).trans + (continuousMulEquivProdCongr roots principal) + let unitsAlg : RootGroup × U ≃* + F.valuationSubringˣ := + valuationSubringUnitsEquivRootsTimesPrincipalUnits + F.toCompleteDVF + let totalAlg : + (RootCyc × FinCyc) × Multiplicative ℤ_[p] ≃* + F.valuationSubringˣ := + factors.toMulEquiv.trans unitsAlg + have hUnitsAlg : Continuous unitsAlg := by + have hmul : Continuous (fun z : RootGroup × U => + (z.1 : F.valuationSubringˣ) * + (z.2 : F.valuationSubringˣ)) := + (continuous_subtype_val.comp continuous_fst).mul + (continuous_subtype_val.comp continuous_snd) + refine hmul.congr ?_ + intro z + exact + (valuationSubringUnitsEquivRootsTimesPrincipalUnits_apply + F.toCompleteDVF z).symm + have hTotal : Continuous totalAlg := + hUnitsAlg.comp factors.continuous_toFun + let total : + (RootCyc × FinCyc) × Multiplicative ℤ_[p] ≃ₜ* + F.valuationSubringˣ := + continuousMulEquivOfCompactToT2 + totalAlg hTotal + let integral : + ℤ_[p]ˣ ≃ₜ* F.valuationSubringˣ := by + exact Units.mapContinuousMulEquiv + (padicIntValuationSubringContinuousMulEquiv p) + exact total.trans integral.symm + +noncomputable instance padicUnitFiniteFactor_finite + (p : ℕ) [Fact p.Prime] : + Finite (padicUnitFiniteFactor p) := by + let v := padicDVRValuation p + let F := LocalField.ofWithZeroValuation v + let : LocalField.MixedWithZeroValuationContext v := + LocalField.mixedWithZeroValuationContext v + let a := (padicPrincipalData p).1 + change Finite + (Multiplicative + (ZMod (Nat.card F.residueField - 1)) × + Multiplicative + (ZMod (F.residueCharacteristic ^ a))) + let : NeZero (Nat.card F.residueField - 1) := + ⟨by + have hcard : 1 < Nat.card F.residueField := + Finite.one_lt_card + omega⟩ + let : NeZero (F.residueCharacteristic ^ a) := + ⟨pow_ne_zero _ F.residueCharacteristic_prime.ne_zero⟩ + infer_instance + +end Padic +end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified.lean new file mode 100644 index 0000000000..ef57b3ddb3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified.lean @@ -0,0 +1,25 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChange +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChangeCore +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BasicInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Composition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.FiniteSupport +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselReduction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselianAlgebraicExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalResidue +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalSubextension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.RamificationIndexTower +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueEmbedding +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueLifting +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Separable + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChange.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChange.lean new file mode 100644 index 0000000000..207b70e43d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChange.lean @@ -0,0 +1,396 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChangeCore +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Compositum +/-! +# A base-change polynomial model for unramified extensions + +Let `L` and `K'` be intermediate fields of a common algebraic ambient field +`Ω`. Starting from the primitive integral model of a finite unramified +extension `L/K`, this file maps its generator and polynomial to the actual +compositum `L ⊔ K'`. The resulting data are exactly the inputs of the +primitive-separable integral-model criterion: generation over `K'`, a monic +polynomial vanishing at the mapped generator, and separable reduction. + +No finite-dimensionality of `K'/K` is used. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace AlgebraicNumberTheory +namespace Valuations + +open DiscreteValuationField.FieldCompositum + +section RestrictedValuationMaps + +variable {K Ω : Type u} [Field K] [Field Ω] [Algebra K Ω] + +/-- Inclusion of restricted valuation rings along an inclusion of ambient +intermediate fields. -/ +def restrictedValuationRingMapOfLE + (w : LubinTate.Valuations.ExponentialValuation Ω) + {E F : IntermediateField K Ω} (hEF : E ≤ F) : + LubinTate.Valuations.exponentialValuationSubring + (exponentialValuationRestrict w E) →+* + LubinTate.Valuations.exponentialValuationSubring + (exponentialValuationRestrict w F) := + (IntermediateField.inclusion hEF).toRingHom.restrict _ _ fun x hx ↦ by + change (0 : WithTop ℝ) ≤ w (x : Ω) + exact hx + +@[simp] +theorem restrictedValuationRingMapOfLE_apply + (w : LubinTate.Valuations.ExponentialValuation Ω) + {E F : IntermediateField K Ω} (hEF : E ≤ F) + (x : LubinTate.Valuations.exponentialValuationSubring + (exponentialValuationRestrict w E)) : + ((restrictedValuationRingMapOfLE w hEF x : + LubinTate.Valuations.exponentialValuationSubring + (exponentialValuationRestrict w F)) : F) = + IntermediateField.inclusion hEF (x : E) := + rfl + +end RestrictedValuationMaps + +section BaseChangeModel + +variable {K Ω : Type u} [Field K] [Field Ω] [Algebra K Ω] + +/-! The private common-top core retains the source generator together with +its canonical image. Public projections below expose both the original +primitive integral model and the residue-generator endpoint without +duplicating the base-change proof. -/ +private theorem primitive_separable_integral_model_on_commonTop_core + (L K' : IntermediateField K Ω) + [FiniteDimensional K L] + [Algebra.IsAlgebraic K K'] + (v : LubinTate.Valuations.ExponentialValuation K) + (w : LubinTate.Valuations.ExponentialValuation Ω) + (hExt : ∀ a : K, w (algebraMap K Ω a) = v a) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) + (hUnramified : FiniteUnramifiedExtension v + (exponentialValuationRestrict w L) + (exponentialValuationRestrict_extends v w hExt L)) : + let wLeft := exponentialValuationRestrict w L + let wRight := exponentialValuationRestrict w K' + let wTop := exponentialValuationRestrict w (L ⊔ K') + ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring wRight).valuation ∧ + (∀ a : K', + wTop (algebraMap K' (L ⊔ K' : IntermediateField K Ω) a) = + wRight a) ∧ + ∃ aLeft : LubinTate.Valuations.exponentialValuationSubring wLeft, + ∃ aTop : LubinTate.Valuations.exponentialValuationSubring wTop, + ∃ FRight : Polynomial (LubinTate.Valuations.exponentialValuationSubring wRight), + aTop = restrictedValuationRingMapOfLE w + (show L ≤ (L ⊔ K' : IntermediateField K Ω) from le_sup_left) + aLeft ∧ + Algebra.adjoin K' + ({(aTop : (L ⊔ K' : IntermediateField K Ω))} : + Set (L ⊔ K' : IntermediateField K Ω)) = ⊤ ∧ + FRight.Monic ∧ + (FRight.map + ((algebraMap K' + (L ⊔ K' : IntermediateField K Ω)).comp + (LubinTate.Valuations.exponentialValuationSubring wRight).subtype)).eval + (aTop : (L ⊔ K' : IntermediateField K Ω)) = 0 ∧ + (FRight.map (IsLocalRing.residue + (LubinTate.Valuations.exponentialValuationSubring wRight))).Separable := by + classical + let wLeft := exponentialValuationRestrict w L + let wRight := exponentialValuationRestrict w K' + let wTop := exponentialValuationRestrict w (L ⊔ K') + let hLeft : ∀ a : K, wLeft (algebraMap K L a) = v a := + exponentialValuationRestrict_extends v w hExt L + let hRight : ∀ a : K, wRight (algebraMap K K' a) = v a := + exponentialValuationRestrict_extends v w hExt K' + let hRightTop : ∀ a : K', + wTop (algebraMap K' (L ⊔ K' : IntermediateField K Ω) a) = + wRight a := by + intro a + rfl + let V := LubinTate.Valuations.exponentialValuationSubring v + let WRight := LubinTate.Valuations.exponentialValuationSubring wRight + let WTop := LubinTate.Valuations.exponentialValuationSubring wTop + let iRight := unramifiedValuationRingValuationRingMap v wRight hRight + let : IsLocalHom iRight := + unramifiedValuationRingValuationRingMap_isLocalHom v wRight hRight + let k := IsLocalRing.ResidueField V + let kRight := IsLocalRing.ResidueField WRight + let : Algebra k kRight := + (IsLocalRing.ResidueField.map iRight).toAlgebra + let : Algebra.IsAlgebraic K L := Algebra.IsAlgebraic.of_finite K L + have hhensRight : + ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring wRight).valuation := + henselianValuation_of_algebraic_extension + v wRight hRight hhens + obtain ⟨a, F, haGen, hFfield, _hFresidueMinpoly, + hFreduction, _haSeparable⟩ := + exists_primitive_lift_minpoly_of_finiteUnramifiedExtension + v wLeft hLeft hhens hUnramified + let aTop : WTop := + restrictedValuationRingMapOfLE w + (show L ≤ (L ⊔ K' : IntermediateField K Ω) from le_sup_left) a + let FRight : Polynomial WRight := F.map iRight + have haGenAlg : + Algebra.adjoin K ({(a : L)} : Set L) = + (⊤ : Subalgebra K L) := by + exact Algebra.adjoin_eq_top_of_intermediateField + (by intro x hx; exact Algebra.IsAlgebraic.isAlgebraic x) haGen + have haTopGen : + Algebra.adjoin K' + ({(aTop : (L ⊔ K' : IntermediateField K Ω))} : + Set (L ⊔ K' : IntermediateField K Ω)) = ⊤ := by + simpa [aTop] using + (sup_right_adjoin_left_singleton_eq_top_of_adjoin_eq_top + (K := K) (Ω := Ω) L K' (a : L) haGenAlg) + have hFRightMonic : FRight.Monic := by + have hFmapMonic : (F.map V.subtype).Monic := by + rw [hFfield] + exact minpoly.monic (Algebra.IsIntegral.isIntegral (a : L)) + have hFMonic : F.Monic := + (V.subtype_injective.monic_map_iff (p := F)).2 hFmapMonic + exact hFMonic.map iRight + have hFrootLeft : + (F.map ((algebraMap K L).comp V.subtype)).eval (a : L) = 0 := by + have hmin : Polynomial.aeval (a : L) (minpoly K (a : L)) = 0 := + minpoly.aeval K (a : L) + rw [Polynomial.aeval_def, Polynomial.eval₂_eq_eval_map] at hmin + have hpoly : + F.map ((algebraMap K L).comp V.subtype) = + (F.map V.subtype).map (algebraMap K L) := by + rw [Polynomial.map_map] + rw [hpoly, hFfield] + exact hmin + let iLeftTop : L →+* (L ⊔ K' : IntermediateField K Ω) := + (IntermediateField.inclusion + (show L ≤ (L ⊔ K' : IntermediateField K Ω) from le_sup_left)).toRingHom + have hFrootTopFromLeft : + ((F.map ((algebraMap K L).comp V.subtype)).map iLeftTop).eval + (aTop : (L ⊔ K' : IntermediateField K Ω)) = 0 := by + change ((F.map ((algebraMap K L).comp V.subtype)).map iLeftTop).eval + (iLeftTop (a : L)) = 0 + rw [Polynomial.eval_map_apply, hFrootLeft, map_zero] + have hFmapTop : + FRight.map + ((algebraMap K' (L ⊔ K' : IntermediateField K Ω)).comp + WRight.subtype) = + (F.map ((algebraMap K L).comp V.subtype)).map iLeftTop := by + apply Polynomial.ext + intro n + apply Subtype.ext + simp only [Polynomial.coeff_map, RingHom.coe_comp, Subring.coe_subtype, Function.comp_apply, + AlgHom.toRingHom_eq_coe, RingHom.coe_coe, AlgHom.commutes, SubalgebraClass.coe_algebraMap, + FRight, iRight, iLeftTop] + rw [unramifiedValuationRingValuationRingMap_apply] + change (((algebraMap K' (L ⊔ K' : IntermediateField K Ω)) + (algebraMap K K' (F.coeff n : K)) : + (L ⊔ K' : IntermediateField K Ω)) : Ω) = + algebraMap K Ω (F.coeff n : K) + rw [← IsScalarTower.algebraMap_apply K K' + (L ⊔ K' : IntermediateField K Ω)] + rfl + have hFRightRoot : + (FRight.map + ((algebraMap K' (L ⊔ K' : IntermediateField K Ω)).comp + WRight.subtype)).eval + (aTop : (L ⊔ K' : IntermediateField K Ω)) = 0 := by + rw [hFmapTop] + exact hFrootTopFromLeft + have hFRightReduction : + (FRight.map (IsLocalRing.residue WRight)).Separable := by + have hReductionMap := + unramifiedValuationRing_polynomial_target_reduction_eq + v wRight hRight F + change (F.map iRight).map (IsLocalRing.residue WRight) = + (F.map (IsLocalRing.residue V)).map (algebraMap k kRight) + at hReductionMap + rw [hReductionMap] + exact hFreduction.map + exact ⟨hhensRight, hRightTop, a, aTop, FRight, rfl, haTopGen, + hFRightMonic, hFRightRoot, hFRightReduction⟩ + +/-- the unramified base-change theorem, concrete base-change model. + +The original extension `L/K` is finite, but `K'/K` is only algebraic. The +ambient valuation is restricted to `L`, `K'`, and `L ⊔ K'`. The returned +generator and polynomial have the exact four properties required by the +primitive-separable integral-model criterion on the upper branch. -/ +theorem exists_primitive_separable_integral_model_on_commonTop + (L K' : IntermediateField K Ω) + [FiniteDimensional K L] + [Algebra.IsAlgebraic K K'] + (v : LubinTate.Valuations.ExponentialValuation K) + (w : LubinTate.Valuations.ExponentialValuation Ω) + (hExt : ∀ a : K, w (algebraMap K Ω a) = v a) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) + (hUnramified : FiniteUnramifiedExtension v + (exponentialValuationRestrict w L) + (exponentialValuationRestrict_extends v w hExt L)) : + let wRight := exponentialValuationRestrict w K' + let wTop := exponentialValuationRestrict w (L ⊔ K') + ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring wRight).valuation ∧ + (∀ a : K', + wTop (algebraMap K' (L ⊔ K' : IntermediateField K Ω) a) = + wRight a) ∧ + ∃ aTop : LubinTate.Valuations.exponentialValuationSubring wTop, + ∃ FRight : Polynomial (LubinTate.Valuations.exponentialValuationSubring wRight), + Algebra.adjoin K' + ({(aTop : (L ⊔ K' : IntermediateField K Ω))} : + Set (L ⊔ K' : IntermediateField K Ω)) = ⊤ ∧ + FRight.Monic ∧ + (FRight.map + ((algebraMap K' + (L ⊔ K' : IntermediateField K Ω)).comp + (LubinTate.Valuations.exponentialValuationSubring wRight).subtype)).eval + (aTop : (L ⊔ K' : IntermediateField K Ω)) = 0 ∧ + (FRight.map (IsLocalRing.residue + (LubinTate.Valuations.exponentialValuationSubring wRight))).Separable := by + rcases primitive_separable_integral_model_on_commonTop_core + L K' v w hExt hhens hUnramified with + ⟨hhensRight, hRightTop, _aLeft, aTop, FRight, _haTop, + haGen, hFmonic, hFroot, hFreduction⟩ + exact ⟨hhensRight, hRightTop, aTop, FRight, haGen, + hFmonic, hFroot, hFreduction⟩ + +/-- the unramified base-change theorem, residue generator on the actual common top. + +The primitive generator may be kept on the original unramified factor: its +canonical image in `L ⊔ K'` has residue generating the whole common-top +residue field over the residue field of `K'`. -/ +theorem unramifiedBaseChange_exists_commonTop_residue_generator_from_left + (L K' : IntermediateField K Ω) + [FiniteDimensional K L] + [Algebra.IsAlgebraic K K'] + (v : LubinTate.Valuations.ExponentialValuation K) + (w : LubinTate.Valuations.ExponentialValuation Ω) + (hExt : ∀ a : K, w (algebraMap K Ω a) = v a) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) + (hUnramified : FiniteUnramifiedExtension v + (exponentialValuationRestrict w L) + (exponentialValuationRestrict_extends v w hExt L)) : + let wLeft := exponentialValuationRestrict w L + let wRight := exponentialValuationRestrict w K' + let wTop := exponentialValuationRestrict w (L ⊔ K') + let hRightTop : ∀ a : K', + wTop (algebraMap K' (L ⊔ K' : IntermediateField K Ω) a) = + wRight a := by intro a; rfl + ∃ aLeft : LubinTate.Valuations.exponentialValuationSubring wLeft, + ∃ aTop : LubinTate.Valuations.exponentialValuationSubring wTop, + aTop = restrictedValuationRingMapOfLE w + (show L ≤ (L ⊔ K' : IntermediateField K Ω) from le_sup_left) + aLeft ∧ + (let i := unramifiedValuationRingValuationRingMap wRight wTop hRightTop + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom + wRight wTop hRightTop + letI : Algebra (LubinTate.Valuations.exponentialValuationSubring wRight) + (LubinTate.Valuations.exponentialValuationSubring wTop) := i.toAlgebra + letI : Algebra + (IsLocalRing.ResidueField + (LubinTate.Valuations.exponentialValuationSubring wRight)) + (IsLocalRing.ResidueField + (LubinTate.Valuations.exponentialValuationSubring wTop)) := + (IsLocalRing.ResidueField.map i).toAlgebra + IntermediateField.adjoin + (IsLocalRing.ResidueField + (LubinTate.Valuations.exponentialValuationSubring wRight)) + ({IsLocalRing.residue + (LubinTate.Valuations.exponentialValuationSubring wTop) aTop} : + Set (IsLocalRing.ResidueField + (LubinTate.Valuations.exponentialValuationSubring wTop))) = ⊤) := by + let wLeft := exponentialValuationRestrict w L + let wRight := exponentialValuationRestrict w K' + let wTop := exponentialValuationRestrict w (L ⊔ K') + let hRightTop : ∀ a : K', + wTop (algebraMap K' (L ⊔ K' : IntermediateField K Ω) a) = + wRight a := by + intro a + rfl + rcases primitive_separable_integral_model_on_commonTop_core + L K' v w hExt hhens hUnramified with + ⟨hhensRight, hRightTop', aLeft, aTop, FRight, haTop, + haGen, hFmonic, hFroot, hFreduction⟩ + have hRightTopEq : hRightTop' = hRightTop := by + funext a + rfl + subst hRightTop' + refine ⟨aLeft, aTop, haTop, ?_⟩ + let : FiniteDimensional K' (L ⊔ K' : IntermediateField K Ω) := + finiteDimensional_sup_over_right_of_left L K' + exact + unramifiedBaseChange_residue_adjoin_eq_top_of_primitive_separable_integral_model + wRight wTop hRightTop hhensRight aTop FRight hFmonic hFroot + hFreduction haGen + +/-- Finite base-change endpoint for unramified extensions. + +If `L/K` is finite unramified and `K'/K` is an arbitrary algebraic +intermediate extension in the common ambient field, then the actual +compositum `L ⊔ K'` is finite unramified over `K'` for the restricted ambient +valuation. In particular, no finite-dimensionality hypothesis on `K'/K` +appears at the theorem boundary. -/ +theorem finiteUnramifiedExtension_commonTop_of_baseChange + (L K' : IntermediateField K Ω) + [FiniteDimensional K L] + [Algebra.IsAlgebraic K K'] + (v : LubinTate.Valuations.ExponentialValuation K) + (w : LubinTate.Valuations.ExponentialValuation Ω) + (hExt : ∀ a : K, w (algebraMap K Ω a) = v a) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) + (hUnramified : FiniteUnramifiedExtension v + (exponentialValuationRestrict w L) + (exponentialValuationRestrict_extends v w hExt L)) : + let wRight := exponentialValuationRestrict w K' + let wTop := exponentialValuationRestrict w (L ⊔ K') + let hRightTop : ∀ a : K', + wTop (algebraMap K' (L ⊔ K' : IntermediateField K Ω) a) = + wRight a := by intro a; rfl + letI : FiniteDimensional K' (L ⊔ K' : IntermediateField K Ω) := + finiteDimensional_sup_over_right_of_left L K' + FiniteUnramifiedExtension wRight wTop hRightTop := by + let wRight := exponentialValuationRestrict w K' + let wTop := exponentialValuationRestrict w (L ⊔ K') + let hRightTop : ∀ a : K', + wTop (algebraMap K' (L ⊔ K' : IntermediateField K Ω) a) = + wRight a := by + intro a + rfl + let : FiniteDimensional K' (L ⊔ K' : IntermediateField K Ω) := + finiteDimensional_sup_over_right_of_left L K' + rcases exists_primitive_separable_integral_model_on_commonTop + L K' v w hExt hhens hUnramified with + ⟨hhensRight, hRightTop', aTop, FRight, haGen, + hFmonic, hFroot, hFreduction⟩ + have hRightTopEq : hRightTop' = hRightTop := by + funext a + rfl + subst hRightTop' + exact finiteUnramifiedExtension_of_primitive_separable_integral_model + wRight wTop hRightTop hhensRight aTop FRight hFmonic hFroot + hFreduction haGen + +end BaseChangeModel + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChangeCore.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChangeCore.lean new file mode 100644 index 0000000000..5b9a10769b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChangeCore.lean @@ -0,0 +1,323 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselReduction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Separable +/-! +# the unramified base-change theorem: primitive Hensel base-change core + +This file proves the polynomial core of the unramified base-change argument. A +primitive integral generator whose monic model has separable reduction gives +a finite unramified extension. The proof takes the actual integral minimal +polynomial, proves its reduction irreducible by Hensel's lemma, and compares +the resulting residue subfield degree with the fundamental inequality. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +namespace AlgebraicNumberTheory +namespace Valuations + +/-! The private core retains both conclusions produced by the same degree +comparison: finite unramifiedness and generation of the target residue field +by the supplied generator's residue. -/ +private theorem primitive_separable_integral_model_core + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) + (a : LubinTate.Valuations.exponentialValuationSubring w) + (F : (LubinTate.Valuations.exponentialValuationSubring v)[X]) + (hFmonic : F.Monic) + (hFroot : + (F.map ((algebraMap K L).comp + (LubinTate.Valuations.exponentialValuationSubring v).subtype)).eval (a : L) = 0) + (hFreduction : + (F.map (IsLocalRing.residue + (LubinTate.Valuations.exponentialValuationSubring v))).Separable) + (haGen : Algebra.adjoin K ({(a : L)} : Set L) = ⊤) : + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v w hExt + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + letI : Algebra V W := i.toAlgebra + letI : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (IsLocalRing.ResidueField.map i).toAlgebra + FiniteUnramifiedExtension v w hExt ∧ + IntermediateField.adjoin (IsLocalRing.ResidueField V) + ({IsLocalRing.residue W a} : + Set (IsLocalRing.ResidueField W)) = ⊤ := by + classical + let Vv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v + let Wv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring w + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v w hExt + let : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let algVW : Algebra V W := i.toAlgebra + let : Algebra V W := algVW + let algVL : Algebra V L := + ((algebraMap K L).comp V.subtype).toAlgebra + let : Algebra V L := algVL + let : SMul V L := algVL.toSMul + let : SMul V W := algVW.toSMul + let : Module V L := algVL.toModule + let : Module V W := algVW.toModule + let : IsScalarTower V K L := IsScalarTower.of_algebraMap_eq + (R := V) (S := K) (A := L) (by intro; rfl) + let : IsScalarTower V W L := IsScalarTower.of_algebraMap_eq + (R := V) (S := W) (A := L) (by intro; rfl) + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + let : Algebra k ell := (IsLocalRing.ResidueField.map i).toAlgebra + let : IsFractionRing V K := by + change IsFractionRing Vv K + have hfr : IsFractionRing Vv.valuation.valuationSubring K := + (Valuation.valuationSubring.integers + (v := Vv.valuation)).isFractionRing + rw [Vv.valuationSubring_valuation] at hfr + exact hfr + let : IsIntegrallyClosed V := by + change IsIntegrallyClosed Vv + infer_instance + let : Module.IsTorsionFree V L := + Module.IsTorsionFree.trans_faithfulSMul V K L + have haIntegralV : IsIntegral V (a : L) := by + refine ⟨F, hFmonic, ?_⟩ + rw [Polynomial.eval₂_eq_eval_map] + change + (F.map ((algebraMap K L).comp V.subtype)).eval (a : L) = 0 + exact hFroot + have haIntegralK : IsIntegral K (a : L) := + Algebra.IsIntegral.isIntegral (R := K) (a : L) + let G : V[X] := minpoly V (a : L) + let qbar : k[X] := G.map (IsLocalRing.residue V) + have hGmonic : G.Monic := minpoly.monic haIntegralV + have hGfield : G.map (algebraMap V K) = minpoly K (a : L) := by + exact (minpoly.isIntegrallyClosed_eq_field_fractions' K haIntegralV).symm + have hGirreducible : Irreducible (G.map (algebraMap V K)) := by + rw [hGfield] + exact minpoly.irreducible haIntegralK + have hGdvdF : G ∣ F := by + apply minpoly.isIntegrallyClosed_dvd haIntegralV + rw [Polynomial.aeval_def, Polynomial.eval₂_eq_eval_map] + change + (F.map ((algebraMap K L).comp V.subtype)).eval (a : L) = 0 + exact hFroot + have hqSep : qbar.Separable := + hFreduction.of_dvd (Polynomial.map_dvd (IsLocalRing.residue V) hGdvdF) + have hhensV : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty Vv := by + change ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + Vv.valuation.valuationSubring at hhens + rw [Vv.valuationSubring_valuation] at hhens + exact hhens + have hqIrreducible : Irreducible qbar := by + exact irreducible_residue_of_irreducible_of_separable_of_henselian + Vv hhensV hGmonic hGirreducible hqSep + have hGaW : Polynomial.aeval a G = 0 := by + have hcompat : + (algebraMap V L).comp (RingHom.id V) = + W.subtype.comp (algebraMap V W) := by + ext x + rfl + have hmap := Polynomial.map_aeval_eq_aeval_map + hcompat G a + have hmin : Polynomial.aeval (a : L) G = 0 := + minpoly.aeval V (a : L) + apply W.subtype_injective + change W.subtype (Polynomial.aeval a G) = W.subtype 0 + rw [hmap] + simpa using hmin + let alpha : ell := IsLocalRing.residue W a + have hqRoot : Polynomial.aeval alpha qbar = 0 := by + have hres := unramifiedValuationRing_polynomial_aeval_residue_eq v w hExt G a + dsimp only at hres + rw [hGaW, map_zero] at hres + simpa [alpha, qbar, Polynomial.aeval_def] using hres.symm + have hqMinpoly : qbar = minpoly k alpha := + minpoly.eq_of_irreducible_of_monic + hqIrreducible hqRoot (hGmonic.map (IsLocalRing.residue V)) + have halphaSep : IsSeparable k alpha := by + rw [IsSeparable, ← hqMinpoly] + exact hqSep + have halphaIntegral : IsIntegral k alpha := halphaSep.isIntegral + have hfieldDegree : + Module.finrank K L = (minpoly K (a : L)).natDegree := by + have hAdjoin : + IntermediateField.adjoin K ({(a : L)} : Set L) = + (⊤ : IntermediateField K L) := + (IntermediateField.adjoin_eq_top_iff).2 haGen + calc + Module.finrank K L = Module.finrank K + (IntermediateField.adjoin K ({(a : L)} : Set L)) := by + rw [hAdjoin] + simp + _ = (minpoly K (a : L)).natDegree := + IntermediateField.adjoin.finrank haIntegralK + have hqDegree : qbar.natDegree = Module.finrank K L := by + calc + qbar.natDegree = G.natDegree := + hGmonic.natDegree_map (IsLocalRing.residue V) + _ = (G.map (algebraMap V K)).natDegree := by + rw [Polynomial.natDegree_map_eq_of_injective + (show Function.Injective (algebraMap V K) from + IsFractionRing.injective V K)] + _ = (minpoly K (a : L)).natDegree := by rw [hGfield] + _ = Module.finrank K L := hfieldDegree.symm + have hresfin : FiniteDimensional k ell := + residueExtension_finiteDimensional_of_finiteDimensional v w hExt + let : FiniteDimensional k ell := hresfin + let residueModule : Module k ell := inferInstance + let algebraModule : Module k ell := + (inferInstance : Algebra k ell).toModule + have hresidueModule : residueModule = algebraModule := by + apply Module.ext + funext r x + obtain ⟨r, rfl⟩ := IsLocalRing.residue_surjective r + obtain ⟨x, rfl⟩ := IsLocalRing.residue_surjective x + rfl + have hresfinAlgebra : + @FiniteDimensional k ell _ _ algebraModule := by + rw [← hresidueModule] + exact hresfin + have hfinTopAlgebra : + FiniteDimensional k (⊤ : IntermediateField k ell) := + @IntermediateField.finiteDimensional_left + k ell _ _ _ (⊤ : IntermediateField k ell) hresfinAlgebra + have hresidueSubDegree : + Module.finrank k + (IntermediateField.adjoin k ({alpha} : Set ell)) = + Module.finrank K L := by + rw [IntermediateField.adjoin.finrank halphaIntegral, ← hqMinpoly] + exact hqDegree + have hsuble : + Module.finrank K L ≤ @Module.finrank k ell _ _ residueModule := by + rw [← hresidueSubDegree, hresidueModule] + simpa using (@IntermediateField.finrank_le_of_le_right k ell _ _ _ + (IntermediateField.adjoin k ({alpha} : Set ell)) + (⊤ : IntermediateField k ell) hfinTopAlgebra le_top) + let : Finite (ExponentialValueGroupQuotient v w) := + exponentialValueGroupQuotient_finite_of_finiteDimensional v w hExt + have hepos : 0 < exponentialRamificationIndex v w := by + let : Nonempty (ExponentialValueGroupQuotient v w) := + ⟨QuotientAddGroup.mk (0 : exponentialValueSubgroup w)⟩ + rw [exponentialRamificationIndex] + exact Nat.card_pos + have hfundamental := ramificationInvariants_fundamental_inequality v w hExt + have hresle : + @Module.finrank k ell _ _ residueModule ≤ Module.finrank K L := by + change exponentialResidueDegree v w hExt ≤ Module.finrank K L + nlinarith + have hdegreeEq : + Module.finrank K L = + @Module.finrank k ell _ _ residueModule := + Nat.le_antisymm hsuble hresle + have hdegreeEqAlgebra : + Module.finrank K L = @Module.finrank k ell _ _ algebraModule := by + rwa [hresidueModule] at hdegreeEq + have hAdjoinResidue : + IntermediateField.adjoin k ({alpha} : Set ell) = ⊤ := by + apply (@Field.primitive_element_iff_minpoly_natDegree_eq + k ell _ _ _ hresfinAlgebra alpha).2 + rw [← hqMinpoly, hqDegree] + exact hdegreeEqAlgebra + have hsepEll : Algebra.IsSeparable k ell := by + rw [← IntermediateField.isSeparable_top, ← hAdjoinResidue, + IntermediateField.isSeparable_adjoin_iff_isSeparable] + intro x hx + obtain rfl := Set.mem_singleton_iff.mp hx + exact halphaSep + refine ⟨⟨?_, ?_⟩, hAdjoinResidue⟩ + · exact hsepEll + · change Module.finrank K L = + @Module.finrank k ell _ _ residueModule + exact hdegreeEq + +/-- Primitive-generator form of the finite base-change argument in +the unramified base-change theorem. + +The data `a` and `F` are concrete outputs of the primitive residue lift for +the original unramified extension: `a` generates the field, `F` is a monic +integral polynomial vanishing at `a`, and its actual reduction is separable. +No unramified conclusion or degree comparison is assumed. -/ +theorem finiteUnramifiedExtension_of_primitive_separable_integral_model + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) + (a : LubinTate.Valuations.exponentialValuationSubring w) + (F : (LubinTate.Valuations.exponentialValuationSubring v)[X]) + (hFmonic : F.Monic) + (hFroot : + (F.map ((algebraMap K L).comp + (LubinTate.Valuations.exponentialValuationSubring v).subtype)).eval (a : L) = 0) + (hFreduction : + (F.map (IsLocalRing.residue + (LubinTate.Valuations.exponentialValuationSubring v))).Separable) + (haGen : Algebra.adjoin K ({(a : L)} : Set L) = ⊤) : + FiniteUnramifiedExtension v w hExt := by + exact (primitive_separable_integral_model_core + v w hExt hhens a F hFmonic hFroot hFreduction haGen).1 + +/-- the unramified base-change theorem, residue-generator endpoint for the primitive integral +model. + +Under the same source hypotheses as the finite base-change criterion, the +residue of the supplied primitive generator generates the entire target +residue field over the base residue field. -/ +theorem unramifiedBaseChange_residue_adjoin_eq_top_of_primitive_separable_integral_model + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) + (a : LubinTate.Valuations.exponentialValuationSubring w) + (F : (LubinTate.Valuations.exponentialValuationSubring v)[X]) + (hFmonic : F.Monic) + (hFroot : + (F.map ((algebraMap K L).comp + (LubinTate.Valuations.exponentialValuationSubring v).subtype)).eval (a : L) = 0) + (hFreduction : + (F.map (IsLocalRing.residue + (LubinTate.Valuations.exponentialValuationSubring v))).Separable) + (haGen : Algebra.adjoin K ({(a : L)} : Set L) = ⊤) : + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v w hExt + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + letI : Algebra V W := i.toAlgebra + letI : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (IsLocalRing.ResidueField.map i).toAlgebra + IntermediateField.adjoin (IsLocalRing.ResidueField V) + ({IsLocalRing.residue W a} : + Set (IsLocalRing.ResidueField W)) = ⊤ := by + exact (primitive_separable_integral_model_core + v w hExt hhens a F hFmonic hFroot hFreduction haGen).2 + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BasicInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BasicInvariants.lean new file mode 100644 index 0000000000..9015e11bb9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BasicInvariants.lean @@ -0,0 +1,428 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions +public import Mathlib.LinearAlgebra.FiniteDimensional.Lemmas +/-! +# Value-group invariants of finite unramified extensions + +The first finite step in the unramified base-change theorem is forced already by + the finite unramified-extension definition +and the fundamental inequality of the fundamental inequality. The actual quotient of +value groups is finite; degree equality then forces its cardinality to be one, +and hence the source and target value subgroups coincide. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +open Module + +section FiniteValuedExtensionInvariants + +variable {K : Type*} {L : Type*} [Field K] [Field L] [Algebra K L] + +omit [Algebra K L] in +/-- Every class of the actual value-group quotient has a representative in +`Lˣ`. This is the public representative source needed to apply the arbitrary +linear-independence theorem from the fundamental inequality. -/ +theorem exponentialValueCoset_units_surjective + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) : + Function.Surjective + (fun x : Lˣ ↦ exponentialValueCoset v w (x : L) x.ne_zero) := by + intro q + obtain ⟨gamma, hgamma⟩ := QuotientAddGroup.mk_surjective q + obtain ⟨x, hx, hvalue⟩ := gamma.property + refine ⟨Units.mk0 x hx, ?_⟩ + rw [← hgamma] + unfold exponentialValueCoset + apply congrArg QuotientAddGroup.mk + apply Subtype.ext + simp [hvalue] + +/-- For a finite-dimensional valued extension, the actual quotient +`w(Lˣ) / v(Kˣ)` is finite. + +The proof is the one-element residue-lift specialization of the fundamental inequality: +representatives of distinct value cosets form a linearly independent family +over `K`, so their indexing type is finite in the finite-dimensional space +`L`. -/ +theorem exponentialValueGroupQuotient_finite_of_finiteDimensional + [FiniteDimensional K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) : + Finite (ExponentialValueGroupQuotient v w) := by + classical + let Q := ExponentialValueGroupQuotient v w + have hsur : Function.Surjective + (fun x : Lˣ ↦ exponentialValueCoset v w (x : L) x.ne_zero) := + exponentialValueCoset_units_surjective v w + let sigma : Q → Lˣ := fun q ↦ Classical.choose (hsur q) + let pi : Q → L := fun q ↦ (sigma q : L) + have hpi0 : ∀ q, pi q ≠ 0 := fun q ↦ (sigma q).ne_zero + have hpiClass : ∀ q, + exponentialValueCoset v w (pi q) (hpi0 q) = q := by + intro q + exact Classical.choose_spec (hsur q) + have hpiInjective : Function.Injective + (fun q ↦ exponentialValueCoset v w (pi q) (hpi0 q)) := by + intro q r hqr + simpa only [hpiClass] using hqr + have hpiDistinct : DistinctExponentialValueCosetRepresentatives v w pi := + distinctExponentialValueCosetRepresentatives_of_injective + v w hExt pi hpi0 hpiInjective + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v w hExt + let : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let : Algebra V W := i.toAlgebra + let : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (IsLocalRing.ResidueField.map i).toAlgebra + have honeLI : LinearIndependent (IsLocalRing.ResidueField V) + (fun _ : Unit ↦ IsLocalRing.residue W (1 : W)) := by + rw [linearIndependent_unique_iff] + simp + have hprodQ : LinearIndependent K + (fun p : Q × Unit ↦ + (((1 : LubinTate.Valuations.exponentialValuationSubring w) : L) * pi p.1)) := + ramificationInvariants_valueCosets_mul_residueLifts_linearIndependent_arbitrary + v w hExt pi hpiDistinct + (fun _ : Unit ↦ (1 : LubinTate.Valuations.exponentialValuationSubring w)) honeLI + exact + (hprodQ.comp (fun q ↦ (q, ())) (by + intro q r hqr + exact congrArg Prod.fst hqr)).finite + +/-- The value-group ramification index of a finite-dimensional exact valued +extension is positive. -/ +theorem exponentialRamificationIndex_pos_of_finiteDimensional + [FiniteDimensional K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) : + 0 < exponentialRamificationIndex v w := by + let : Finite (ExponentialValueGroupQuotient v w) := + exponentialValueGroupQuotient_finite_of_finiteDimensional v w hExt + let : Nonempty (ExponentialValueGroupQuotient v w) := + ⟨QuotientAddGroup.mk (0 : exponentialValueSubgroup w)⟩ + unfold exponentialRamificationIndex + exact Nat.card_pos + +/-- Lifts to the target valuation ring of an arbitrary residue-field basis +are linearly independent over the base field. + +This is the one-value-coset specialization of the public arbitrary-index +linear-independence theorem in the fundamental inequality. No finiteness or +separability hypothesis on `L/K` is used. -/ +theorem residueBasisLifts_linearIndependent + {J : Type*} + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (beta : + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v w hExt + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + letI : Algebra V W := i.toAlgebra + letI : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (IsLocalRing.ResidueField.map i).toAlgebra + Basis J (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W)) + (omega : J → LubinTate.Valuations.exponentialValuationSubring w) + (homega : + let W := LubinTate.Valuations.exponentialValuationSubring w + ∀ j, IsLocalRing.residue W (omega j) = beta j) : + LinearIndependent K (fun j ↦ (omega j : L)) := by + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v w hExt + let : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let : Algebra V W := i.toAlgebra + let : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (IsLocalRing.ResidueField.map i).toAlgebra + have homegaLI : LinearIndependent (IsLocalRing.ResidueField V) + (fun j ↦ IsLocalRing.residue W (omega j)) := by + rw [show (fun j ↦ IsLocalRing.residue W (omega j)) = beta from + funext homega] + exact beta.linearIndependent + let piOne : Unit → L := fun _ ↦ 1 + have hpiOne : DistinctExponentialValueCosetRepresentatives v w piOne := by + refine ⟨by intro; simp [piOne], ?_⟩ + intro a b hab + exact (hab (Subsingleton.elim a b)).elim + have hprod : LinearIndependent K + (fun p : Unit × J ↦ (omega p.2 : L) * piOne p.1) := + ramificationInvariants_valueCosets_mul_residueLifts_linearIndependent_arbitrary + v w hExt piOne hpiOne omega homegaLI + have hcomp := hprod.comp (fun j ↦ ((), j)) (by + intro a b hab + exact congrArg Prod.snd hab) + simpa only [Function.comp_def, piOne, mul_one] using hcomp + +/-- In every finite-dimensional valued field extension, the actual residue +extension is finite-dimensional. Its finiteness is produced by lifting a +chosen residue basis and applying the preceding linear-independence theorem. -/ +theorem residueExtension_finiteDimensional_of_finiteDimensional + [FiniteDimensional K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) : + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v w hExt + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + letI : Algebra V W := i.toAlgebra + letI : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (IsLocalRing.ResidueField.map i).toAlgebra + FiniteDimensional (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := by + classical + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v w hExt + let : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let : Algebra V W := i.toAlgebra + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + let : Algebra k ell := (IsLocalRing.ResidueField.map i).toAlgebra + let J := Module.Free.ChooseBasisIndex k ell + let beta : Basis J k ell := Module.Free.chooseBasis k ell + let omega : J → W := fun j ↦ + Classical.choose (IsLocalRing.residue_surjective (beta j)) + have homega : ∀ j, IsLocalRing.residue W (omega j) = beta j := by + intro j + exact Classical.choose_spec (IsLocalRing.residue_surjective (beta j)) + have hli : LinearIndependent K (fun j ↦ (omega j : L)) := + residueBasisLifts_linearIndependent v w hExt beta omega homega + have hfiniteJ : Finite J := hli.finite + let : Finite J := hfiniteJ + exact beta.finiteDimensional_of_finite + +/-- The residue degree of a finite-dimensional exact valued extension is +positive. -/ +theorem exponentialResidueDegree_pos_of_finiteDimensional + [FiniteDimensional K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) : + 0 < exponentialResidueDegree v w hExt := by + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v w hExt + let : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let : Algebra V W := i.toAlgebra + let : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (IsLocalRing.ResidueField.map i).toAlgebra + let : FiniteDimensional (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + residueExtension_finiteDimensional_of_finiteDimensional v w hExt + change 0 < Module.finrank (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) + exact Module.finrank_pos + +/-- The value-group ramification index of a finite-dimensional exact valued +extension is at most its field degree. -/ +theorem exponentialRamificationIndex_le_finrank + [FiniteDimensional K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) : + exponentialRamificationIndex v w ≤ Module.finrank K L := by + exact (Nat.le_mul_of_pos_right _ + (exponentialResidueDegree_pos_of_finiteDimensional v w hExt)).trans + (ramificationInvariants_fundamental_inequality v w hExt) + +/-- Under the finite unramified-extension definition, every residue basis has the same +cardinality as the +field degree. The statement uses `Nat.card`, so no finiteness assumption on +the chosen index type is added to the theorem boundary. -/ +theorem finiteUnramifiedExtension_residueBasis_card_eq_finrank + [FiniteDimensional K L] {J : Type*} + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (hUnramified : FiniteUnramifiedExtension v w hExt) + (beta : + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v w hExt + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + letI : Algebra V W := i.toAlgebra + letI : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (IsLocalRing.ResidueField.map i).toAlgebra + Basis J (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W)) + (omega : J → LubinTate.Valuations.exponentialValuationSubring w) + (homega : + let W := LubinTate.Valuations.exponentialValuationSubring w + ∀ j, IsLocalRing.residue W (omega j) = beta j) : + Nat.card J = Module.finrank K L := by + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v w hExt + let : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let : Algebra V W := i.toAlgebra + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + let : Algebra k ell := (IsLocalRing.ResidueField.map i).toAlgebra + have hli : LinearIndependent K (fun j ↦ (omega j : L)) := + residueBasisLifts_linearIndependent v w hExt beta omega homega + have hfiniteJ : Finite J := hli.finite + let : Finite J := hfiniteJ + let : Fintype J := Fintype.ofFinite J + have hresfinite : FiniteDimensional k ell := + beta.finiteDimensional_of_finite + let : FiniteDimensional k ell := hresfinite + have hdegree := + finiteUnramifiedExtension_degree_eq_residueDegree + v w hExt hUnramified + change Module.finrank K L = Module.finrank k ell at hdegree + calc + Nat.card J = Fintype.card J := Nat.card_eq_fintype_card + _ = Module.finrank k ell := (Module.finrank_eq_card_basis beta).symm + _ = Module.finrank K L := hdegree.symm + +/-- Valuation-ring lifts of any chosen residue basis form a basis of `L/K` +for a finite unramified extension. Finiteness and nonemptiness of the index +type are derived internally rather than assumed. -/ +theorem exists_basis_eq_residueBasisLifts_of_finiteUnramifiedExtension + [FiniteDimensional K L] {J : Type*} + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (hUnramified : FiniteUnramifiedExtension v w hExt) + (beta : + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v w hExt + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + letI : Algebra V W := i.toAlgebra + letI : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (IsLocalRing.ResidueField.map i).toAlgebra + Basis J (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W)) + (omega : J → LubinTate.Valuations.exponentialValuationSubring w) + (homega : + let W := LubinTate.Valuations.exponentialValuationSubring w + ∀ j, IsLocalRing.residue W (omega j) = beta j) : + ∃ b : Basis J K L, ∀ j, b j = (omega j : L) := by + have hli : LinearIndependent K (fun j ↦ (omega j : L)) := + residueBasisLifts_linearIndependent v w hExt beta omega homega + have hfiniteJ : Finite J := hli.finite + let : Finite J := hfiniteJ + let : Fintype J := Fintype.ofFinite J + have hcardNat : Nat.card J = Module.finrank K L := + finiteUnramifiedExtension_residueBasis_card_eq_finrank + v w hExt hUnramified beta omega homega + have hcard : Fintype.card J = Module.finrank K L := by + rw [← Nat.card_eq_fintype_card] + exact hcardNat + have hcardpos : 0 < Fintype.card J := by + rw [hcard] + exact Module.finrank_pos + let : Nonempty J := Fintype.card_pos_iff.mp hcardpos + let b : Basis J K L := + basisOfLinearIndependentOfCardEqFinrank hli hcard + refine ⟨b, ?_⟩ + intro j + exact congrFun + (coe_basisOfLinearIndependentOfCardEqFinrank hli hcard) j + +/-- the finite unramified-extension definition and the fundamental inequality force the actual +ramification index of +a finite unramified extension to be one. -/ +theorem exponentialRamificationIndex_eq_one_of_finiteUnramifiedExtension + [FiniteDimensional K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (hUnramified : FiniteUnramifiedExtension v w hExt) : + exponentialRamificationIndex v w = 1 := by + let : Finite (ExponentialValueGroupQuotient v w) := + exponentialValueGroupQuotient_finite_of_finiteDimensional v w hExt + have hfpos : 0 < exponentialResidueDegree v w hExt := by + rw [← finiteUnramifiedExtension_degree_eq_residueDegree + v w hExt hUnramified] + exact Module.finrank_pos + have hfundamental : + exponentialRamificationIndex v w * exponentialResidueDegree v w hExt ≤ + Module.finrank K L := + ramificationInvariants_fundamental_inequality v w hExt + have hmul : + exponentialRamificationIndex v w * exponentialResidueDegree v w hExt ≤ + 1 * exponentialResidueDegree v w hExt := by + simpa [finiteUnramifiedExtension_degree_eq_residueDegree + v w hExt hUnramified] using hfundamental + have he_le_one : exponentialRamificationIndex v w ≤ 1 := by + exact Nat.le_of_mul_le_mul_right hmul hfpos + have hepos : 0 < exponentialRamificationIndex v w := by + let : Nonempty (ExponentialValueGroupQuotient v w) := + ⟨QuotientAddGroup.mk (0 : exponentialValueSubgroup w)⟩ + rw [exponentialRamificationIndex] + exact Nat.card_pos + exact Nat.le_antisymm he_le_one (Nat.succ_le_of_lt hepos) + +/-- The value subgroup does not change in a finite unramified extension. -/ +theorem exponentialValueSubgroup_eq_of_finiteUnramifiedExtension + [FiniteDimensional K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (hUnramified : FiniteUnramifiedExtension v w hExt) : + exponentialValueSubgroup w = exponentialValueSubgroup v := by + let Gamma := exponentialValueSubgroup w + let H : AddSubgroup Gamma := + (exponentialValueSubgroup v).comap Gamma.subtype + have hindex : H.index = 1 := by + have he := + exponentialRamificationIndex_eq_one_of_finiteUnramifiedExtension + v w hExt hUnramified + rw [AddSubgroup.index_eq_card] + simpa only [exponentialRamificationIndex, ExponentialValueGroupQuotient, Gamma, H] + using he + have hH : H = ⊤ := AddSubgroup.index_eq_one.mp hindex + apply le_antisymm + · intro r hr + let gamma : Gamma := ⟨r, hr⟩ + have hgamma : gamma ∈ H := by + rw [hH] + exact Set.mem_univ gamma + change r ∈ exponentialValueSubgroup v at hgamma + exact hgamma + · exact exponentialValueSubgroup_le_of_extends v w hExt + +end FiniteValuedExtensionInvariants + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Composition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Composition.lean new file mode 100644 index 0000000000..5b2450ea9e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Composition.lean @@ -0,0 +1,240 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChange +public import Mathlib.FieldTheory.SeparableDegree +/-! +# Finite composita of unramified extensions + +The finite case of stability under finite composita says that the composite of two finite +unramified extensions is again unramified. The proof first applies +the unramified base-change theorem to one extension along the other and then uses transitivity +of residue separability and multiplicativity of the field and residue +degrees. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace AlgebraicNumberTheory +namespace Valuations + +open DiscreteValuationField.FieldCompositum + +section Tower + +variable {K M L : Type u} +variable [Field K] [Field M] [Field L] +variable [Algebra K M] [Algebra M L] [Algebra K L] +variable [IsScalarTower K M L] + +/-- The finite tower step used in the proof of stability under finite composita. + +This is the literal the finite unramified-extension definition argument: separability of the residue +extensions is transitive, while both field degrees and residue degrees are +multiplicative in a tower. -/ +theorem finiteUnramifiedExtension_trans + [FiniteDimensional K M] + [FiniteDimensional M L] + [FiniteDimensional K L] + (v : LubinTate.Valuations.ExponentialValuation K) + (w : LubinTate.Valuations.ExponentialValuation M) + (u : LubinTate.Valuations.ExponentialValuation L) + (hKM : ∀ a : K, w (algebraMap K M a) = v a) + (hML : ∀ a : M, u (algebraMap M L a) = w a) + (hKL : ∀ a : K, u (algebraMap K L a) = v a) + (hM : FiniteUnramifiedExtension v w hKM) + (hL : FiniteUnramifiedExtension w u hML) : + FiniteUnramifiedExtension v u hKL := by + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let U := LubinTate.Valuations.exponentialValuationSubring u + let iVM := unramifiedValuationRingValuationRingMap v w hKM + let iWU := unramifiedValuationRingValuationRingMap w u hML + let iVU := unramifiedValuationRingValuationRingMap v u hKL + let : IsLocalHom iVM := + unramifiedValuationRingValuationRingMap_isLocalHom v w hKM + let : IsLocalHom iWU := + unramifiedValuationRingValuationRingMap_isLocalHom w u hML + let : IsLocalHom iVU := + unramifiedValuationRingValuationRingMap_isLocalHom v u hKL + let : Algebra V W := iVM.toAlgebra + let : Algebra W U := iWU.toAlgebra + let : Algebra V U := iVU.toAlgebra + let k := IsLocalRing.ResidueField V + let m := IsLocalRing.ResidueField W + let ell := IsLocalRing.ResidueField U + let f := IsLocalRing.ResidueField.map iVM + let g := IsLocalRing.ResidueField.map iWU + let d := IsLocalRing.ResidueField.map iVU + let : Algebra k m := f.toAlgebra + let : Algebra m ell := g.toAlgebra + let : Algebra k ell := d.toAlgebra + have hi : iVU = iWU.comp iVM := by + ext x + change algebraMap K L (x : K) = + algebraMap M L (algebraMap K M (x : K)) + exact IsScalarTower.algebraMap_apply K M L (x : K) + have hd : d = g.comp f := by + dsimp only [d, g, f] + simpa only [hi] using + (IsLocalRing.ResidueField.map_comp iVM iWU) + let residueTower : IsScalarTower k m ell := + IsScalarTower.of_algebraMap_eq fun x ↦ by + change d x = g (f x) + rw [hd] + rfl + let : IsScalarTower k m ell := residueTower + let kmResidueModule : Module k m := inferInstance + let mellResidueModule : Module m ell := inferInstance + let kellResidueModule : Module k ell := inferInstance + let kmAlgebraModule : Module k m := + (inferInstance : Algebra k m).toModule + let mellAlgebraModule : Module m ell := + (inferInstance : Algebra m ell).toModule + let kellAlgebraModule : Module k ell := + (inferInstance : Algebra k ell).toModule + have hkmModule : kmResidueModule = kmAlgebraModule := by + apply Module.ext + funext r x + obtain ⟨r, rfl⟩ := IsLocalRing.residue_surjective r + obtain ⟨x, rfl⟩ := IsLocalRing.residue_surjective x + rfl + have hmellModule : mellResidueModule = mellAlgebraModule := by + apply Module.ext + funext r x + obtain ⟨r, rfl⟩ := IsLocalRing.residue_surjective r + obtain ⟨x, rfl⟩ := IsLocalRing.residue_surjective x + rfl + have hkellModule : kellResidueModule = kellAlgebraModule := by + apply Module.ext + funext r x + obtain ⟨r, rfl⟩ := IsLocalRing.residue_surjective r + obtain ⟨x, rfl⟩ := IsLocalRing.residue_surjective x + rfl + have hMsep : Algebra.IsSeparable k m := by + exact hM.1 + have hLsep : Algebra.IsSeparable m ell := by + exact hL.1 + have hsep : Algebra.IsSeparable k ell := + Algebra.IsSeparable.trans k m ell + have hMdegreeResidue : + Module.finrank K M = + @Module.finrank k m _ _ kmResidueModule := by + exact hM.2 + have hLdegreeResidue : + Module.finrank M L = + @Module.finrank m ell _ _ mellResidueModule := by + exact hL.2 + have hMdegreeAlgebra : + Module.finrank K M = + @Module.finrank k m _ _ kmAlgebraModule := by + calc + Module.finrank K M = + @Module.finrank k m _ _ kmResidueModule := + hMdegreeResidue + _ = @Module.finrank k m _ _ kmAlgebraModule := by + rw [hkmModule] + have hLdegreeAlgebra : + Module.finrank M L = + @Module.finrank m ell _ _ mellAlgebraModule := by + calc + Module.finrank M L = + @Module.finrank m ell _ _ mellResidueModule := + hLdegreeResidue + _ = @Module.finrank m ell _ _ mellAlgebraModule := by + rw [hmellModule] + have hdegreeResidue : + Module.finrank K L = + @Module.finrank k ell _ _ kellResidueModule := by + calc + Module.finrank K L = + Module.finrank K M * Module.finrank M L := + (Module.finrank_mul_finrank K M L).symm + _ = @Module.finrank k m _ _ kmAlgebraModule * + @Module.finrank m ell _ _ mellAlgebraModule := by + rw [hMdegreeAlgebra, hLdegreeAlgebra] + _ = @Module.finrank k ell _ _ kellAlgebraModule := + @Module.finrank_mul_finrank k m ell _ _ _ + kmAlgebraModule mellAlgebraModule kellAlgebraModule + residueTower _ _ _ _ + _ = @Module.finrank k ell _ _ kellResidueModule := by + rw [hkellModule] + refine ⟨hsep, ?_⟩ + change Module.finrank K L = + @Module.finrank k ell _ _ kellResidueModule + exact hdegreeResidue + +end Tower + +section FiniteCompositum + +variable {K Ω : Type u} [Field K] [Field Ω] [Algebra K Ω] + +/-- Finite common-ambient form of stability under composita. + +If `L/K` and `K'/K` are finite unramified extensions inside the same +algebraic ambient field, then their actual compositum `L ⊔ K'` is finite +unramified over `K`. No separate degree or separability hypothesis is used. +-/ +theorem finiteUnramifiedExtension_sup + (L K' : IntermediateField K Ω) + [FiniteDimensional K L] + [FiniteDimensional K K'] + (v : LubinTate.Valuations.ExponentialValuation K) + (w : LubinTate.Valuations.ExponentialValuation Ω) + (hExt : ∀ a : K, w (algebraMap K Ω a) = v a) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) + (hL : FiniteUnramifiedExtension v + (exponentialValuationRestrict w L) + (exponentialValuationRestrict_extends v w hExt L)) + (hK' : FiniteUnramifiedExtension v + (exponentialValuationRestrict w K') + (exponentialValuationRestrict_extends v w hExt K')) : + let wTop := exponentialValuationRestrict w (L ⊔ K') + let hBaseTop : ∀ a : K, + wTop (algebraMap K (L ⊔ K' : IntermediateField K Ω) a) = + v a := exponentialValuationRestrict_extends v w hExt (L ⊔ K') + letI : FiniteDimensional K (L ⊔ K' : IntermediateField K Ω) := + IntermediateField.finiteDimensional_sup L K' + FiniteUnramifiedExtension v wTop hBaseTop := by + let wRight := exponentialValuationRestrict w K' + let wTop := exponentialValuationRestrict w (L ⊔ K') + let hBaseRight : ∀ a : K, + wRight (algebraMap K K' a) = v a := + exponentialValuationRestrict_extends v w hExt K' + let hRightTop : ∀ a : K', + wTop (algebraMap K' (L ⊔ K' : IntermediateField K Ω) a) = + wRight a := by + intro a + rfl + let hBaseTop : ∀ a : K, + wTop (algebraMap K (L ⊔ K' : IntermediateField K Ω) a) = + v a := exponentialValuationRestrict_extends v w hExt (L ⊔ K') + let : Algebra.IsAlgebraic K K' := Algebra.IsAlgebraic.of_finite K K' + let : FiniteDimensional K' (L ⊔ K' : IntermediateField K Ω) := + finiteDimensional_sup_over_right_of_left L K' + let : FiniteDimensional K (L ⊔ K' : IntermediateField K Ω) := + IntermediateField.finiteDimensional_sup L K' + have hTopRight : FiniteUnramifiedExtension wRight wTop hRightTop := by + exact finiteUnramifiedExtension_commonTop_of_baseChange + L K' v w hExt hhens hL + exact finiteUnramifiedExtension_trans + v wRight wTop hBaseRight hRightTop hBaseTop hK' hTopRight + +end FiniteCompositum + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Definitions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Definitions.lean new file mode 100644 index 0000000000..0cf911bddb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Definitions.lean @@ -0,0 +1,322 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +public import Mathlib.FieldTheory.IntermediateField.Adjoin.Algebra +/-! +# Finite and algebraic unramified valued extensions + +Finite unramified valued extensions are expressed directly by the +degree equality and residue separability condition. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w x + +open ValuationTheory.DiscreteValuationField + +namespace ValuationTheory.DiscreteValuationField.ValuedExtension + +variable {K : Type u} {L : Type w} [Field K] [Field L] +variable [Algebra K L] [FiniteDimensional K L] + +/-- A finite valued extension is unramified +when its residue extension is separable and its field degree equals its +residue degree. -/ +def IsFiniteUnramified (base : DVF.{u, v} K) (target : DVF.{w, x} L) + [base.valuation.HasExtension target.valuation] : Prop := + Algebra.IsSeparable base.residueField target.residueField ∧ + degree base target = residueDegree base target + +end ValuationTheory.DiscreteValuationField.ValuedExtension + +namespace ValuationTheory.DiscreteValuationField.ValuedExtension + +section AlgebraicUnramified + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] +variable (base : CompleteDVF.{u, v} K) (ambient : CompleteDVF.{w, x} L) +variable [base.valuation.HasExtension ambient.valuation] + +/-- A finite unramified subextension of an +ambient valued extension. -/ +def IsFiniteUnramifiedSubextension (E : IntermediateField K L) : Prop := + ∃ hfin : FiniteDimensional K E, + ∃ hsep : Algebra.IsSeparable K E, + ∃ target : CompleteDVF.{w, x} E, + ∃ hBase : base.valuation.HasExtension target.valuation, + ∃ hAmbient : target.valuation.HasExtension ambient.valuation, + letI : FiniteDimensional K E := hfin + letI : Algebra.IsSeparable K E := hsep + letI : base.valuation.HasExtension target.valuation := hBase + letI : target.valuation.HasExtension ambient.valuation := hAmbient + IsFiniteUnramified base.toDVF target.toDVF + +/-- An algebraic unramified ambient extension. + +The ambient extension is unramified when every finite set of elements lies in +one finite unramified intermediate extension. This is the finite-support form +of the phrase "a union of finite unramified subextensions" and is the +form used in finite-support reductions for algebraic unramified extensions. -/ +def IsAlgebraicUnramifiedExtension : Prop := + ∀ S : Finset L, ∃ E : IntermediateField K L, + (∀ x ∈ S, (x : L) ∈ E) ∧ IsFiniteUnramifiedSubextension base ambient E + +/- the finite unramified-extension definition finite-support eliminator. + +In an algebraic unramified ambient extension, every finitely generated +intermediate field is contained in a finite unramified subextension. -/ +omit [base.valuation.HasExtension ambient.valuation] in +theorem exists_isFiniteUnramifiedSubextension_of_fg + (h : IsAlgebraicUnramifiedExtension base ambient) + {E : IntermediateField K L} (hE : E.FG) : + ∃ U : IntermediateField K L, + E ≤ U ∧ IsFiniteUnramifiedSubextension base ambient U := by + obtain ⟨S, hS⟩ := hE + obtain ⟨U, hUS, hU⟩ := h S + refine ⟨U, ?_, hU⟩ + rw [← hS] + exact IntermediateField.adjoin_le_iff.2 fun x hx => + hUS x (by simpa using hx) + +end AlgebraicUnramified + +end ValuationTheory.DiscreteValuationField.ValuedExtension + +namespace AlgebraicNumberTheory +namespace Valuations + +section UnramifiedExtensions + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] + +/-- Restriction of an exponential valuation to an intermediate field. +This is the valuation carried by each finite subextension in the union clause +of the finite unramified-extension definition. -/ +def exponentialValuationRestrict + (w : LubinTate.Valuations.ExponentialValuation L) (E : IntermediateField K L) : + LubinTate.Valuations.ExponentialValuation E where + toFun x := w (x : L) + eq_top_iff x := by + rw [w.eq_top_iff] + simp + map_mul x y := by + exact w.map_mul (x : L) (y : L) + add_le_min x y := by + exact w.add_le_min (x : L) (y : L) + +@[simp] +theorem exponentialValuationRestrict_apply + (w : LubinTate.Valuations.ExponentialValuation L) (E : IntermediateField K L) (x : E) : + exponentialValuationRestrict w E x = w (x : L) := + rfl + +/-- Exact extension is preserved when the target valuation is restricted to +an intermediate field. -/ +theorem exponentialValuationRestrict_extends + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (E : IntermediateField K L) (a : K) : + exponentialValuationRestrict w E (algebraMap K E a) = v a := by + change w (algebraMap K L a) = v a + exact hExt a + +/-- The valuation-ring map associated with an exact extension of exponential +exponential valuations. the fundamental inequality uses the same map internally; it is +exposed here because the finite unramified-extension definition also asks for separability of + the actual +residue-field extension. -/ +def unramifiedValuationRingValuationRingMap + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) : + LubinTate.Valuations.exponentialValuationSubring v →+* + LubinTate.Valuations.exponentialValuationSubring w := + (algebraMap K L).restrict _ _ fun a ha ↦ by + change (0 : WithTop ℝ) ≤ w (algebraMap K L a) + rw [hExt] + exact ha + +@[simp] +theorem unramifiedValuationRingValuationRingMap_apply + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (a : LubinTate.Valuations.exponentialValuationSubring v) : + ((unramifiedValuationRingValuationRingMap v w hExt a : + LubinTate.Valuations.exponentialValuationSubring w) : L) = + algebraMap K L (a : K) := + rfl + +/-- Exact extension makes the finite unramified-extension valuation-ring map local, hence +it induces the actual map of residue fields used below. -/ +theorem unramifiedValuationRingValuationRingMap_isLocalHom + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) : + IsLocalHom (unramifiedValuationRingValuationRingMap v w hExt) := by + constructor + intro a ha + have hwzero : + w (((unramifiedValuationRingValuationRingMap v w hExt) a : + LubinTate.Valuations.exponentialValuationSubring w) : L) = 0 := + LubinTate.Valuations.exponentialValuation_eq_zero_of_isUnit w ha + have hvzero : v (a : K) = 0 := by + rw [unramifiedValuationRingValuationRingMap_apply, hExt] at hwzero + exact hwzero + exact LubinTate.Valuations.isUnit_of_exponentialValuation_eq_zero v hvzero + +/-- Separability of the actual residue-field extension induced by an exact +extension of exponential valuations. -/ +def ResidueExtensionIsSeparable + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) : Prop := + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v w hExt + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + letI : Algebra V W := i.toAlgebra + letI : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (IsLocalRing.ResidueField.map i).toAlgebra + Algebra.IsSeparable (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) + +/-- Literal finite-extension form for the +general exponential valuations. + +The first conjunct is separability of the *actual residue-field extension*. +The second is exactly `[L : K] = [lambda : kappa]`, with the right-hand side +given by the actual residue finrank from the fundamental inequality. In particular no +separability assumption on the field extension `L/K` is inserted. -/ +def FiniteUnramifiedExtension + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) : Prop := + ResidueExtensionIsSeparable v w hExt ∧ + Module.finrank K L = exponentialResidueDegree v w hExt + +/-- Projection of residue separability in the literal finite the finite unramified-extension +definition +predicate. -/ +theorem finiteUnramifiedExtension_residue_isSeparable + [FiniteDimensional K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (h : FiniteUnramifiedExtension v w hExt) : + ResidueExtensionIsSeparable v w hExt := + h.1 + +/-- Projection of the degree equality in the literal finite the finite unramified-extension +definition +predicate. -/ +theorem finiteUnramifiedExtension_degree_eq_residueDegree + [FiniteDimensional K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (h : FiniteUnramifiedExtension v w hExt) : + Module.finrank K L = exponentialResidueDegree v w hExt := by + exact h.2 + +/-- A finite intermediate extension is unramified when its restricted +valuation satisfies the literal finite condition of the finite unramified-extension definition. -/ +def FiniteUnramifiedSubextension + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (E : IntermediateField K L) : Prop := + ∃ hfin : FiniteDimensional K E, + letI : FiniteDimensional K E := hfin + FiniteUnramifiedExtension v + (exponentialValuationRestrict w E) + (exponentialValuationRestrict_extends v w hExt E) + +/-- A finite unramified intermediate extension is finite-dimensional over the +base field; this extracts the genuine finiteness datum from the finite unramified-extension + definition. -/ +theorem finiteDimensional_of_finiteUnramifiedSubextension + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + {E : IntermediateField K L} + (h : FiniteUnramifiedSubextension v w hExt E) : + FiniteDimensional K E := by + rcases h with ⟨hfin, _⟩ + exact hfin + +/-- The literal set-theoretic union of all finite unramified intermediate +extensions. -/ +def finiteUnramifiedSubextensionUnion + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) : Set L := + {x | ∃ E : IntermediateField K L, + x ∈ E ∧ FiniteUnramifiedSubextension v w hExt E} + +/-- Arbitrary algebraic-extension form: +the ambient field is the union of its finite unramified subextensions. -/ +def AlgebraicUnramifiedExtension + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) : Prop := + finiteUnramifiedSubextensionUnion v w hExt = Set.univ + +/-- Elementwise form of the finite-subextension union clause. -/ +theorem algebraicUnramifiedExtension_iff + [Algebra.IsAlgebraic K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) : + AlgebraicUnramifiedExtension v w hExt ↔ + ∀ x : L, ∃ E : IntermediateField K L, + x ∈ E ∧ FiniteUnramifiedSubextension v w hExt E := by + rw [AlgebraicUnramifiedExtension, Set.eq_univ_iff_forall] + rfl + +/-- Finite-support form used by the later base-change proof. It is kept +separate from the literal union definition, so the finite unramified-extension definition itself + does not +silently assume closure of finite unramified extensions under compositum. -/ +def AlgebraicUnramifiedExtensionFiniteSupport + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) : Prop := + ∀ S : Finset L, ∃ E : IntermediateField K L, + (∀ x ∈ S, x ∈ E) ∧ FiniteUnramifiedSubextension v w hExt E + +/-- A finite-support presentation is, in particular, the literal union from +the finite unramified-extension definition. The converse belongs after the compositum theorem + rather than +being built into the definition. -/ +theorem algebraicUnramifiedExtension_of_finiteSupport + [Algebra.IsAlgebraic K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (h : AlgebraicUnramifiedExtensionFiniteSupport v w hExt) : + AlgebraicUnramifiedExtension v w hExt := by + rw [algebraicUnramifiedExtension_iff] + intro x + obtain ⟨E, hmem, hE⟩ := h {x} + exact ⟨E, hmem x (by simp), hE⟩ + +end UnramifiedExtensions + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/FiniteSupport.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/FiniteSupport.lean new file mode 100644 index 0000000000..8eaa9c1987 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/FiniteSupport.lean @@ -0,0 +1,167 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalSubextension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Composition +/-! +# Finite support in the maximal unramified field + +The maximal unramified subextension is defined as a compositum. Compactness +of a simple intermediate field and stability under finite composita imply that every one of its +elements already belongs to a single finite unramified subextension. This is +the finite-support fact used in the maximal-residue theorem. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace AlgebraicNumberTheory +namespace Valuations + +section FiniteSupport + +variable {K L : Type u} [Field K] [Field L] [Algebra K L] + +/-- The base field, viewed as the bottom intermediate field, is finite +unramified. This supplies the empty finite-compositum case. -/ +theorem finiteUnramifiedSubextension_bot + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) : + FiniteUnramifiedSubextension v w hExt ⊥ := by + let w0 := exponentialValuationRestrict w (⊥ : IntermediateField K L) + let h0 := exponentialValuationRestrict_extends v w hExt + (⊥ : IntermediateField K L) + let a : LubinTate.Valuations.exponentialValuationSubring w0 := 0 + let F : Polynomial (LubinTate.Valuations.exponentialValuationSubring v) := Polynomial.X + have hFmonic : F.Monic := Polynomial.monic_X + have hFroot : + (F.map ((algebraMap K (⊥ : IntermediateField K L)).comp + (LubinTate.Valuations.exponentialValuationSubring v).subtype)).eval + (a : (⊥ : IntermediateField K L)) = 0 := by + simp [F, a] + have hFreduction : + (F.map (IsLocalRing.residue + (LubinTate.Valuations.exponentialValuationSubring v))).Separable := by + simpa [F] using + (Polynomial.separable_X : (Polynomial.X : Polynomial + (IsLocalRing.ResidueField + (LubinTate.Valuations.exponentialValuationSubring v))).Separable) + have haGen : + Algebra.adjoin K ({(a : (⊥ : IntermediateField K L))} : + Set (⊥ : IntermediateField K L)) = ⊤ := by + apply top_unique + intro x _hx + obtain ⟨b, rfl⟩ := (IntermediateField.botEquiv K L).symm.surjective x + exact algebraMap_mem _ b + refine ⟨inferInstance, ?_⟩ + exact finiteUnramifiedExtension_of_primitive_separable_integral_model + v w0 h0 hhens a F hFmonic hFroot hFreduction haGen + +/-- A finite supremum of finite unramified intermediate fields is finite +unramified. -/ +theorem finiteUnramifiedSubextension_finset_iSup + {ι : Type*} + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) + (s : Finset ι) (F : ι → IntermediateField K L) + (hs : ∀ i ∈ s, FiniteUnramifiedSubextension v w hExt (F i)) : + FiniteUnramifiedSubextension v w hExt + (⨆ i : ι, ⨆ (_h : i ∈ s), F i) := by + classical + induction s using Finset.induction_on with + | empty => + simpa using finiteUnramifiedSubextension_bot v w hExt hhens + | @insert i s his ih => + let E := F i + have hE := hs i (by simp) + have hs' : ∀ j ∈ s, + FiniteUnramifiedSubextension v w hExt (F j) := by + intro j hjs + exact hs j (by simp [hjs]) + have hS := ih hs' + rcases hE with ⟨hfinE, hEunramified⟩ + rcases hS with ⟨hfinS, hSunramified⟩ + let : FiniteDimensional K E := hfinE + let Ssup : IntermediateField K L := + ⨆ j : ι, ⨆ (_h : j ∈ s), F j + let : FiniteDimensional K Ssup := hfinS + let hfinTop : FiniteDimensional K + (E ⊔ Ssup : IntermediateField K L) := + IntermediateField.finiteDimensional_sup E Ssup + have hTop : FiniteUnramifiedSubextension v w hExt + (E ⊔ Ssup : IntermediateField K L) := by + refine ⟨hfinTop, ?_⟩ + exact finiteUnramifiedExtension_sup E Ssup + v w hExt hhens hEunramified hSunramified + have hsup : + (⨆ j : ι, ⨆ (_h : j ∈ insert i s), F j) = + E ⊔ Ssup := by + apply le_antisymm + · apply iSup_le + intro j + apply iSup_le + intro hj + rcases Finset.mem_insert.mp hj with rfl | hj + · exact le_sup_left + · exact le_sup_of_le_right + (le_iSup_of_le j (le_iSup_of_le hj le_rfl)) + · apply sup_le + · exact le_iSup_of_le i + (le_iSup_of_le (Finset.mem_insert_self i s) le_rfl) + · dsimp [Ssup] + apply iSup_le + intro j + apply iSup_le + intro hj + exact le_iSup_of_le j + (le_iSup_of_le (Finset.mem_insert_of_mem hj) le_rfl) + rw [hsup] + exact hTop + +/-- Every element of the maximal unramified subextension belongs to one +finite unramified intermediate field. -/ +theorem exists_finiteUnramifiedSubextension_of_mem_maximal + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) + {x : L} + (hx : x ∈ maximalUnramifiedSubextension v w hExt) : + ∃ E : IntermediateField K L, + x ∈ E ∧ FiniteUnramifiedSubextension v w hExt E := by + classical + let S := finiteUnramifiedSubextensions v w hExt + have hxSup : x ∈ ⨆ E : S, (E : IntermediateField K L) := by + simpa [maximalUnramifiedSubextension, S, sSup_eq_iSup'] using hx + obtain ⟨s, hxs⟩ := IntermediateField.exists_finset_of_mem_iSup hxSup + let E : IntermediateField K L := + ⨆ U : S, ⨆ (_h : U ∈ s), (U : IntermediateField K L) + have hEunramified : FiniteUnramifiedSubextension v w hExt E := by + apply finiteUnramifiedSubextension_finset_iSup + v w hExt hhens s (fun U : S ↦ (U : IntermediateField K L)) + intro U hUs + exact U.property + exact ⟨E, hxs, hEunramified⟩ + +end FiniteSupport + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselReduction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselReduction.lean new file mode 100644 index 0000000000..5c91e359b3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselReduction.lean @@ -0,0 +1,77 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselianAlgebraicExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.ValuationExtensionCriterion +/-! +# the unramified base-change theorem: irreducible reduction source + +The base-change proof uses the following exact Hensel step. If a +monic polynomial over a Henselian valuation ring is irreducible over the +fraction field and its reduction is separable, then that reduction is already +irreducible. Otherwise a nontrivial residual factorization is coprime and +Hensel lifting contradicts irreducibility upstairs. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- A monic polynomial irreducible over the valued field has irreducible +reduction whenever that reduction is separable. -/ +theorem irreducible_residue_of_irreducible_of_separable_of_henselian + {K : Type*} [Field K] + (V : ValuationSubring K) + (hhens : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty V) + {f : V[X]} (hf : f.Monic) + (hirr : Irreducible (f.map (algebraMap V K))) + (hsep : (f.map (IsLocalRing.residue V)).Separable) : + Irreducible (f.map (IsLocalRing.residue V)) := by + let qbar := f.map (IsLocalRing.residue V) + have hqmonic : qbar.Monic := hf.map (IsLocalRing.residue V) + have hinj : Function.Injective (algebraMap V K) := by + intro a b hab + exact Subtype.ext hab + have hfFieldDegree : + (f.map (algebraMap V K)).natDegree = f.natDegree := + Polynomial.natDegree_map_eq_of_injective hinj f + have hfpos : 0 < f.natDegree := by + rw [← hfFieldDegree] + exact hirr.natDegree_pos + have hqne : qbar ≠ 1 := by + intro hq + have hfzero : f.natDegree = 0 := by + rw [← hf.natDegree_map (IsLocalRing.residue V), show + f.map (IsLocalRing.residue V) = qbar from rfl, hq] + simp + exact (Nat.ne_of_gt hfpos) hfzero + rw [Polynomial.irreducible_of_monic hqmonic hqne] + intro gbar hbar hgmonic hhmonic hfactor + have hprodSep : (gbar * hbar).Separable := by + rw [hfactor] + exact hsep + have hcoprime : IsCoprime gbar hbar := hprodSep.isCoprime + have hlift : DiscreteValuationField.MonicResidualCoprimeFactorLifting V := + DiscreteValuationField.monicResidualCoprimeFactorLifting_of_henselFactorization + hhens + have hdegree := + hlift.irreducible_monic_reduction_coprime_factor_degree_zero + hf hirr hgmonic hhmonic (by simpa [qbar] using hfactor.symm) hcoprime + exact hdegree.imp hgmonic.natDegree_eq_zero.mp + hhmonic.natDegree_eq_zero.mp + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselianAlgebraicExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselianAlgebraicExtension.lean new file mode 100644 index 0000000000..7bc0c436f4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselianAlgebraicExtension.lean @@ -0,0 +1,169 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions +/-! +# Henselianity along algebraic valued extensions + +The proof of the unramified base-change theorem applies Hensel's lemma after +base change from `K` to an algebraic extension `K'`. This file supplies the +source used there: the unique extension of a Henselian valuation to an +algebraic field is again Henselian. The result is derived from the unique +extension criterion of the unique-extension criterion, rather than added as an assumption to +the unramified base-change theorem. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +universe u + + +/-- The exponential presentation of a Henselian valuation has a unique +valuation-subring extension to every algebraic field in the same universe. +This is the unique-extension criterion transported through the associated nonarchimedean +absolute value. -/ +theorem exponentialValuation_hasUniqueAlgebraicValuationSubringExtensions + {K : Type u} [Field K] + (v : LubinTate.Valuations.ExponentialValuation K) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) : + HasUniqueAlgebraicValuationSubringExtensions + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v) := by + let av := exponentialAssociatedAbsoluteValue v + have hav : LubinTate.Valuations.AssociatedAbsoluteValue v (Real.exp 1) av := + exponentialAssociatedAbsoluteValue_associated v + have havNonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue av := + associatedAbsoluteValue_nonarchimedean v (Real.exp 1) av hav + let Vv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v + let Va := absoluteValueValuationSubring av havNonarch + have hV : Vv = Va := + associatedAbsoluteValue_valuationSubring_eq + v (Real.exp 1) av havNonarch hav + have hhensA : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + Va.valuation := by + rw [← hV] + exact hhens + change HasUniqueAlgebraicValuationSubringExtensions Vv + rw [hV] + exact henselianUniqueExtension_unique_algebraic_valuationSubring_extensions_of_henselian + av havNonarch hhensA + + +/-- An algebraic extension of a Henselian valued field is Henselian for its +unique extended valuation. + +Only the actual exact extension of the two exponential valuations is an +input. For a further algebraic extension `M/L`, uniqueness over `K` first +forces the restriction of its unique valuation ring to be the chosen ring on +`L`; transitivity then gives uniqueness over `L`, and the unique-extension criterion supplies +Hensel factorization on the target valuation ring. -/ +theorem henselianValuation_of_algebraic_extension + {K L : Type u} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) : + ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring w).valuation := by + let av := exponentialAssociatedAbsoluteValue v + let aw := exponentialAssociatedAbsoluteValue w + have hav : LubinTate.Valuations.AssociatedAbsoluteValue v (Real.exp 1) av := + exponentialAssociatedAbsoluteValue_associated v + have haw : LubinTate.Valuations.AssociatedAbsoluteValue w (Real.exp 1) aw := + exponentialAssociatedAbsoluteValue_associated w + have havNonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue av := + associatedAbsoluteValue_nonarchimedean v (Real.exp 1) av hav + have hawNonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue aw := + associatedAbsoluteValue_nonarchimedean w (Real.exp 1) aw haw + let Vv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v + let Wv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring w + let Va := absoluteValueValuationSubring av havNonarch + let Wa := absoluteValueValuationSubring aw hawNonarch + have hV : Vv = Va := + associatedAbsoluteValue_valuationSubring_eq + v (Real.exp 1) av havNonarch hav + have hW : Wv = Wa := + associatedAbsoluteValue_valuationSubring_eq + w (Real.exp 1) aw hawNonarch haw + have habsExt : ∀ a : K, aw (algebraMap K L a) = av a := + associatedAbsoluteValue_extends + v w hExt (Real.exp 1) av aw hav haw + have hVaWa : Va.valuation.HasExtension Wa.valuation := + absoluteValueValuation_hasExtension_of_extends + av aw havNonarch hawNonarch habsExt + have hVvWv : Vv.valuation.HasExtension Wv.valuation := by + rw [hV, hW] + exact hVaWa + let : Vv.valuation.HasExtension Wv.valuation := hVvWv + have hUniqueV : HasUniqueAlgebraicValuationSubringExtensions Vv := + exponentialValuation_hasUniqueAlgebraicValuationSubringExtensions + v hhens + have hUniqueVW : HasUniqueValuationSubringExtension (L := L) Vv := + hUniqueV L + have hUniqueW : HasUniqueAlgebraicValuationSubringExtensions Wv := by + intro M _fieldM _algLM _algM + let : Algebra K M := + ((algebraMap L M).comp (algebraMap K L)).toAlgebra + let : IsScalarTower K L M := + IsScalarTower.of_algebraMap_eq (by intro; rfl) + let : Algebra.IsAlgebraic K M := Algebra.IsAlgebraic.trans K L M + obtain ⟨B, hVB, hBunique⟩ := hUniqueV M + let : Vv.valuation.HasExtension B.valuation := hVB + let vBL := B.valuation.comap (algebraMap L M) + have hVvBL : Vv.valuation.HasExtension vBL := + DiscreteValuationField.Valuation.comap_to_middle_hasExtension_of_top_hasExtension + Vv.valuation B.valuation + let : Vv.valuation.HasExtension vBL := hVvBL + have hVvRestrict : + Vv.valuation.HasExtension vBL.valuationSubring.valuation := by + apply _root_.Valuation.HasExtension.ofComapInteger + ext a + simp only [Subring.mem_comap, Valuation.mem_integer_iff, + ValuationSubring.valuation_le_one_iff] + rw [vBL.mem_valuationSubring_iff] + rw [← Vv.valuationSubring_valuation] + rw [Vv.valuation.mem_valuationSubring_iff] + exact _root_.Valuation.HasExtension.val_map_le_one_iff + (vR := Vv.valuation) (vA := vBL) a + let : Vv.valuation.HasExtension vBL.valuationSubring.valuation := + hVvRestrict + have hrestrict : vBL.valuationSubring = Wv := by + obtain ⟨W0, hVW0, hW0unique⟩ := hUniqueVW + exact (hW0unique vBL.valuationSubring inferInstance).trans + (hW0unique Wv inferInstance).symm + have hWB : Wv.valuation.HasExtension B.valuation := by + apply _root_.Valuation.HasExtension.ofComapInteger + change vBL.valuationSubring.toSubring = + Wv.valuation.valuationSubring.toSubring + rw [ValuationSubring.valuationSubring_valuation] + exact congrArg ValuationSubring.toSubring hrestrict + refine ⟨B, hWB, ?_⟩ + intro C hWC + let : Wv.valuation.HasExtension C.valuation := hWC + let : Vv.valuation.HasExtension C.valuation := + ValuationTheory.DiscreteValuationField.Valuation.hasExtension_trans + Vv.valuation Wv.valuation C.valuation + exact hBunique C inferInstance + change ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + Wv.valuation.valuationSubring + rw [ValuationSubring.valuationSubring_valuation] + exact henselFactorization_of_unique_algebraic_valuationSubring_extensions + Wv hUniqueW + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalResidue.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalResidue.lean new file mode 100644 index 0000000000..34d16d1e95 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalResidue.lean @@ -0,0 +1,130 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueEmbedding +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.FiniteSupport +/-! +# The maximal unramified subextension from residue-field data + +Finite support in the compositum reduces the value-group equality and the +forward residue-field inclusion to the corresponding finite statements. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace AlgebraicNumberTheory +namespace Valuations + +section MaximalUnramifiedSubextensionInvariants + +variable {K L : Type u} [Field K] [Field L] [Algebra K L] + +/-- the maximal-residue theorem, exact value-group equality for the maximal unramified +subextension. -/ +theorem maximalUnramifiedSubextension_valueSubgroup_eq + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) : + exponentialValueSubgroup + (exponentialValuationRestrict w + (maximalUnramifiedSubextension v w hExt)) = + exponentialValueSubgroup v := by + classical + let T := maximalUnramifiedSubextension v w hExt + let wT := exponentialValuationRestrict w T + ext r + constructor + · rintro ⟨x, hx0, hxval⟩ + obtain ⟨E, hxE, hEunramified⟩ := + exists_finiteUnramifiedSubextension_of_mem_maximal + v w hExt hhens x.property + let y : E := ⟨((x : T) : L), hxE⟩ + have hy0 : y ≠ 0 := by + intro hy + apply hx0 + apply Subtype.ext + have hyL := congrArg (fun z : E ↦ (z : L)) hy + simpa [y] using hyL + have hyr : r ∈ exponentialValueSubgroup + (exponentialValuationRestrict w E) := by + refine ⟨y, hy0, ?_⟩ + exact hxval + rw [finiteUnramifiedSubextension_valueSubgroup_eq + v w hExt hEunramified] at hyr + exact hyr + · rintro ⟨a, ha0, haval⟩ + let x : T := algebraMap K T a + have hx0 : x ≠ 0 := (map_ne_zero (algebraMap K T)).2 ha0 + refine ⟨x, hx0, ?_⟩ + change w (algebraMap K L a) = (r : WithTop ℝ) + rw [hExt] + exact haval + +/-- the maximal-residue theorem, the residue field of `T` embeds into the separable +closure of the base residue field in the ambient residue field. -/ +theorem maximalUnramifiedSubextension_residue_fieldRange_le_separableClosure + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) : + let T := maximalUnramifiedSubextension v w hExt + let wT := exponentialValuationRestrict w T + let V := LubinTate.Valuations.exponentialValuationSubring v + let VT := LubinTate.Valuations.exponentialValuationSubring wT + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v wT + (exponentialValuationRestrict_extends v w hExt T) + let b := unramifiedValuationRingValuationRingMap v w hExt + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v wT + (exponentialValuationRestrict_extends v w hExt T) + letI : IsLocalHom b := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let k := IsLocalRing.ResidueField V + let kT := IsLocalRing.ResidueField VT + let ell := IsLocalRing.ResidueField W + letI : Algebra k kT := (IsLocalRing.ResidueField.map i).toAlgebra + letI : Algebra k ell := (IsLocalRing.ResidueField.map b).toAlgebra + (restrictedResidueAlgHomToAmbient v w hExt T).fieldRange ≤ + separableClosure k ell := by + classical + simp only + intro y hy + rcases hy with ⟨yT, rfl⟩ + let T := maximalUnramifiedSubextension v w hExt + let wT := exponentialValuationRestrict w T + let VT := LubinTate.Valuations.exponentialValuationSubring wT + obtain ⟨t, rfl⟩ := IsLocalRing.residue_surjective yT + obtain ⟨E, htE, hEunramified⟩ := + exists_finiteUnramifiedSubextension_of_mem_maximal + v w hExt hhens (show ((t : T) : L) ∈ T from (t : T).property) + let wE := exponentialValuationRestrict w E + let VE := LubinTate.Valuations.exponentialValuationSubring wE + let z : VE := + ⟨⟨((t : T) : L), htE⟩, by + change (0 : WithTop ℝ) ≤ w ((t : T) : L) + exact t.property⟩ + have hz := + finiteUnramifiedSubextension_residue_image_mem_separableClosure + v w hExt hEunramified (IsLocalRing.residue VE z) + exact hz + +end MaximalUnramifiedSubextensionInvariants + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalSubextension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalSubextension.lean new file mode 100644 index 0000000000..5034b8a6bb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalSubextension.lean @@ -0,0 +1,109 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions +/-! +# The maximal unramified subextension + +Let `L/K` be an algebraic valued extension. Its maximal unramified +subextension is the compositum, inside `L`, of all unramified subextensions. +Since the finite unramified-extension definition defines an arbitrary unramified extension as a + union of +finite unramified subextensions, this compositum is the supremum of the finite +unramified intermediate fields. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +section MaximalUnramifiedSubextension + +variable {K : Type*} {L : Type*} [Field K] [Field L] [Algebra K L] + +/-- The finite unramified intermediate fields occurring in the finite unramified-extension +definition. -/ +def finiteUnramifiedSubextensions + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) : + Set (IntermediateField K L) := + {E | FiniteUnramifiedSubextension v w hExt E} + +@[simp] +theorem mem_finiteUnramifiedSubextensions_iff + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + {E : IntermediateField K L} : + E ∈ finiteUnramifiedSubextensions v w hExt ↔ + FiniteUnramifiedSubextension v w hExt E := + Iff.rfl + +/-- The maximal unramified +subextension `T/K` of `L/K`. + +The supremum is the field compositum. Indexing by finite unramified +subextensions is literal the finite unramified-extension definition: every arbitrary unramified +subextension is their union. -/ +def maximalUnramifiedSubextension + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) : + IntermediateField K L := + sSup (finiteUnramifiedSubextensions v w hExt) + +/-- Every finite unramified subextension is contained in `T`. -/ +theorem finiteUnramifiedSubextension_le_maximal + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + {E : IntermediateField K L} + (hE : FiniteUnramifiedSubextension v w hExt E) : + E ≤ maximalUnramifiedSubextension v w hExt := by + apply le_sSup + exact hE + +/-- `T` is the least intermediate field containing every finite unramified +subextension. -/ +theorem maximalUnramifiedSubextension_le + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + {M : IntermediateField K L} + (hM : ∀ E : IntermediateField K L, + FiniteUnramifiedSubextension v w hExt E → E ≤ M) : + maximalUnramifiedSubextension v w hExt ≤ M := by + apply sSup_le + intro E hE + exact hM E hE + +/-- The least-upper-bound characterization of the maximal-unramified-subextension definition. -/ +theorem maximalUnramifiedSubextension_le_iff + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + {M : IntermediateField K L} : + maximalUnramifiedSubextension v w hExt ≤ M ↔ + ∀ E : IntermediateField K L, + FiniteUnramifiedSubextension v w hExt E → E ≤ M := by + constructor + · intro h E hE + exact (finiteUnramifiedSubextension_le_maximal v w hExt hE).trans h + · exact maximalUnramifiedSubextension_le v w hExt + +end MaximalUnramifiedSubextension + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/RamificationIndexTower.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/RamificationIndexTower.lean new file mode 100644 index 0000000000..ce9d623595 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/RamificationIndexTower.lean @@ -0,0 +1,124 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BasicInvariants +/-! +# Ramification index in valued-field towers + +The generic tower and embedding-monotonicity lemmas extracted from the tame adapter. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace AlgebraicNumberTheory +namespace Valuations + +section RamificationIndexTower + +variable {K M L : Type u} [Field K] [Field M] [Field L] +variable [Algebra K M] [Algebra M L] + +/-- The actual value-group ramification index is multiplicative in exact +valued-field towers. -/ +theorem exponentialRamificationIndex_mul_in_tower + (v : LubinTate.Valuations.ExponentialValuation K) + (u : LubinTate.Valuations.ExponentialValuation M) + (w : LubinTate.Valuations.ExponentialValuation L) + (hKM : ∀ a : K, u (algebraMap K M a) = v a) + (hML : ∀ a : M, w (algebraMap M L a) = u a) : + exponentialRamificationIndex v u * exponentialRamificationIndex u w = + exponentialRamificationIndex v w := by + let GammaK := exponentialValueSubgroup v + let GammaM := exponentialValueSubgroup u + let GammaL := exponentialValueSubgroup w + let H : AddSubgroup GammaL := GammaK.comap GammaL.subtype + let J : AddSubgroup GammaL := GammaM.comap GammaL.subtype + have hHJ : H ≤ J := by + intro x hx + change (x : ℝ) ∈ GammaM + exact exponentialValueSubgroup_le_of_extends v u hKM hx + let f : J →+ GammaM := + { toFun := fun x ↦ ⟨(x : ℝ), x.property⟩ + map_zero' := rfl + map_add' := fun _ _ ↦ rfl } + have hf : Function.Surjective f := by + intro y + have hyL : (y : ℝ) ∈ GammaL := + exponentialValueSubgroup_le_of_extends u w hML y.property + let x : J := ⟨⟨(y : ℝ), hyL⟩, y.property⟩ + refine ⟨x, ?_⟩ + exact Subtype.ext rfl + let HKM : AddSubgroup GammaM := GammaK.comap GammaM.subtype + have hcomap : HKM.comap f = H.addSubgroupOf J := by + ext x + rfl + have hrelative : H.relIndex J = exponentialRamificationIndex v u := by + have hi := AddSubgroup.index_comap_of_surjective HKM hf + rw [hcomap] at hi + simpa only [AddSubgroup.relIndex, exponentialRamificationIndex, + ExponentialValueGroupQuotient, AddSubgroup.index_eq_card, + GammaK, GammaM, HKM] using hi + rw [← hrelative] + simpa only [exponentialRamificationIndex, ExponentialValueGroupQuotient, + AddSubgroup.index_eq_card, GammaK, GammaM, GammaL, H, J] using + (AddSubgroup.relIndex_mul_index hHJ) + +/-- In a finite relative extension, the ramification index of the lower +stage is at most that of the whole exact valued-field tower. -/ +theorem exponentialRamificationIndex_le_in_tower + [FiniteDimensional M L] + (v : LubinTate.Valuations.ExponentialValuation K) + (u : LubinTate.Valuations.ExponentialValuation M) + (w : LubinTate.Valuations.ExponentialValuation L) + (hKM : ∀ a : K, u (algebraMap K M a) = v a) + (hML : ∀ a : M, w (algebraMap M L a) = u a) : + exponentialRamificationIndex v u ≤ exponentialRamificationIndex v w := by + calc + exponentialRamificationIndex v u ≤ + exponentialRamificationIndex v u * exponentialRamificationIndex u w := + Nat.le_mul_of_pos_right _ + (exponentialRamificationIndex_pos_of_finiteDimensional u w hML) + _ = exponentialRamificationIndex v w := + exponentialRamificationIndex_mul_in_tower v u w hKM hML + +/-- Ramification index is monotone along an algebra embedding of finite +extensions. The embedding supplies the relative algebra and scalar-tower +structures used by `exponentialRamificationIndex_le_in_tower`. -/ +theorem exponentialRamificationIndex_le_of_algHom + {K E D : Type} [Field K] [Field E] [Field D] + [Algebra K E] [Algebra K D] + [FiniteDimensional K D] + (i : E →ₐ[K] D) + (v : LubinTate.Valuations.ExponentialValuation K) + (u : LubinTate.Valuations.ExponentialValuation E) + (w : LubinTate.Valuations.ExponentialValuation D) + (hKE : ∀ x : K, u (algebraMap K E x) = v x) + (hED : ∀ x : E, w (i x) = u x) : + exponentialRamificationIndex v u ≤ exponentialRamificationIndex v w := by + let : Algebra E D := i.toRingHom.toAlgebra + let : IsScalarTower K E D := IsScalarTower.of_algebraMap_eq fun x => by + exact (i.commutes x).symm + let : FiniteDimensional E D := FiniteDimensional.right K E D + have hED' : ∀ x : E, w (algebraMap E D x) = u x := by + intro x + exact hED x + exact exponentialRamificationIndex_le_in_tower v u w hKE hED' + +end RamificationIndexTower + + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueEmbedding.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueEmbedding.lean new file mode 100644 index 0000000000..4cb292378d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueEmbedding.lean @@ -0,0 +1,241 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalSubextension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BasicInvariants +public import Mathlib.FieldTheory.SeparableClosure +/-! +# Finite-subextension sources for residue embeddings + +For the maximal unramified subextension `T`, the maximal-residue theorem identifies the +residue field with the separable closure of the base residue field and the +value group with that of the base. This file proves the two corresponding +statements for every finite unramified subextension used to form `T`. + +Passing these statements through the whole supremum requires closure under +finite composita (stability under finite composita); that missing step is not inserted here as an +extra hypothesis. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +section FiniteUnramifiedSubextensionInvariants + +variable {K : Type*} {L : Type*} [Field K] [Field L] [Algebra K L] + +/-- Inclusion of the valuation ring of a restricted valuation into the +ambient valuation ring. -/ +def restrictedValuationRingMapToAmbient + (w : LubinTate.Valuations.ExponentialValuation L) (E : IntermediateField K L) : + LubinTate.Valuations.exponentialValuationSubring + (exponentialValuationRestrict w E) →+* + LubinTate.Valuations.exponentialValuationSubring w := + E.val.toRingHom.restrict _ _ fun x hx ↦ by + change (0 : WithTop ℝ) ≤ w (x : L) + exact hx + +@[simp] +theorem restrictedValuationRingMapToAmbient_apply + (w : LubinTate.Valuations.ExponentialValuation L) (E : IntermediateField K L) + (x : LubinTate.Valuations.exponentialValuationSubring + (exponentialValuationRestrict w E)) : + ((restrictedValuationRingMapToAmbient w E x : + LubinTate.Valuations.exponentialValuationSubring w) : L) = (x : E) := + rfl + +/-- The restricted-to-ambient valuation-ring map is local, hence induces an +injective map on the actual residue fields. -/ +theorem restrictedValuationRingMapToAmbient_isLocalHom + (w : LubinTate.Valuations.ExponentialValuation L) (E : IntermediateField K L) : + IsLocalHom (restrictedValuationRingMapToAmbient w E) := by + constructor + intro x hx + have hwzero : + w (((restrictedValuationRingMapToAmbient w E) x : + LubinTate.Valuations.exponentialValuationSubring w) : L) = 0 := + LubinTate.Valuations.exponentialValuation_eq_zero_of_isUnit w hx + have hrestrict : exponentialValuationRestrict w E (x : E) = 0 := by + exact hwzero + exact LubinTate.Valuations.isUnit_of_exponentialValuation_eq_zero + (exponentialValuationRestrict w E) hrestrict + +/-- The residue-field embedding from a restricted intermediate field into +the ambient residue field, as an algebra homomorphism over the base residue +field. -/ +def restrictedResidueAlgHomToAmbient + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (E : IntermediateField K L) : + let vE := exponentialValuationRestrict w E + let V := LubinTate.Valuations.exponentialValuationSubring v + let VE := LubinTate.Valuations.exponentialValuationSubring vE + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v vE + (exponentialValuationRestrict_extends v w hExt E) + let j := restrictedValuationRingMapToAmbient w E + let b := unramifiedValuationRingValuationRingMap v w hExt + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v vE + (exponentialValuationRestrict_extends v w hExt E) + letI : IsLocalHom j := + restrictedValuationRingMapToAmbient_isLocalHom w E + letI : IsLocalHom b := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let k := IsLocalRing.ResidueField V + let kE := IsLocalRing.ResidueField VE + let ell := IsLocalRing.ResidueField W + letI : Algebra k kE := (IsLocalRing.ResidueField.map i).toAlgebra + letI : Algebra k ell := (IsLocalRing.ResidueField.map b).toAlgebra + kE →ₐ[k] ell := by + let vE := exponentialValuationRestrict w E + let V := LubinTate.Valuations.exponentialValuationSubring v + let VE := LubinTate.Valuations.exponentialValuationSubring vE + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v vE + (exponentialValuationRestrict_extends v w hExt E) + let j := restrictedValuationRingMapToAmbient w E + let b := unramifiedValuationRingValuationRingMap v w hExt + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v vE + (exponentialValuationRestrict_extends v w hExt E) + letI : IsLocalHom j := + restrictedValuationRingMapToAmbient_isLocalHom w E + letI : IsLocalHom b := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let k := IsLocalRing.ResidueField V + let kE := IsLocalRing.ResidueField VE + let ell := IsLocalRing.ResidueField W + letI : Algebra k kE := (IsLocalRing.ResidueField.map i).toAlgebra + letI : Algebra k ell := (IsLocalRing.ResidueField.map b).toAlgebra + refine + { IsLocalRing.ResidueField.map j with + commutes' := ?_ } + intro x + obtain ⟨a, rfl⟩ := IsLocalRing.residue_surjective x + rfl + +/-- Value-group source for the finite unramified embedding. + +Every finite unramified subextension occurring in the maximal-unramified-subextension definition + has exactly +the value subgroup of the base field. -/ +theorem finiteUnramifiedSubextension_valueSubgroup_eq + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + {E : IntermediateField K L} + (hE : FiniteUnramifiedSubextension v w hExt E) : + exponentialValueSubgroup + (exponentialValuationRestrict w E) = + exponentialValueSubgroup v := by + rcases hE with ⟨hfin, hUnramified⟩ + let : FiniteDimensional K E := hfin + exact exponentialValueSubgroup_eq_of_finiteUnramifiedExtension + v (exponentialValuationRestrict w E) + (exponentialValuationRestrict_extends v w hExt E) hUnramified + +/-- Residue-field source for the finite unramified embedding. + +The image in the ambient residue field of every residue class from a finite +unramified subextension lies in the separable closure of the base residue +field. -/ +theorem finiteUnramifiedSubextension_residue_image_mem_separableClosure + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + {E : IntermediateField K L} + (hE : FiniteUnramifiedSubextension v w hExt E) + (x : IsLocalRing.ResidueField + (LubinTate.Valuations.exponentialValuationSubring + (exponentialValuationRestrict w E))) : + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let b := unramifiedValuationRingValuationRingMap v w hExt + letI : IsLocalHom b := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + letI : Algebra k ell := (IsLocalRing.ResidueField.map b).toAlgebra + restrictedResidueAlgHomToAmbient v w hExt E x ∈ + separableClosure k ell := by + rcases hE with ⟨hfin, hUnramified⟩ + let : FiniteDimensional K E := hfin + let vE := exponentialValuationRestrict w E + let V := LubinTate.Valuations.exponentialValuationSubring v + let VE := LubinTate.Valuations.exponentialValuationSubring vE + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v vE + (exponentialValuationRestrict_extends v w hExt E) + let j := restrictedValuationRingMapToAmbient w E + let b := unramifiedValuationRingValuationRingMap v w hExt + let : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v vE + (exponentialValuationRestrict_extends v w hExt E) + let : IsLocalHom j := + restrictedValuationRingMapToAmbient_isLocalHom w E + let : IsLocalHom b := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let k := IsLocalRing.ResidueField V + let kE := IsLocalRing.ResidueField VE + let ell := IsLocalRing.ResidueField W + let : Algebra k kE := (IsLocalRing.ResidueField.map i).toAlgebra + let : Algebra k ell := (IsLocalRing.ResidueField.map b).toAlgebra + have hsep : Algebra.IsSeparable k kE := hUnramified.1 + let : Algebra.IsSeparable k kE := hsep + let f : kE →ₐ[k] ell := + restrictedResidueAlgHomToAmbient v w hExt E + apply (map_mem_separableClosure_iff f).2 + exact mem_separableClosure_iff.2 + (Algebra.IsSeparable.isSeparable k x) + +/-- Field-range form of the finite residue-field inclusion for an unramified +subextension. -/ +theorem finiteUnramifiedSubextension_residue_fieldRange_le_separableClosure + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + {E : IntermediateField K L} + (hE : FiniteUnramifiedSubextension v w hExt E) : + let V := LubinTate.Valuations.exponentialValuationSubring v + let vE := exponentialValuationRestrict w E + let VE := LubinTate.Valuations.exponentialValuationSubring vE + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v vE + (exponentialValuationRestrict_extends v w hExt E) + let b := unramifiedValuationRingValuationRingMap v w hExt + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v vE + (exponentialValuationRestrict_extends v w hExt E) + letI : IsLocalHom b := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let k := IsLocalRing.ResidueField V + let kE := IsLocalRing.ResidueField VE + let ell := IsLocalRing.ResidueField W + letI : Algebra k kE := (IsLocalRing.ResidueField.map i).toAlgebra + letI : Algebra k ell := (IsLocalRing.ResidueField.map b).toAlgebra + (restrictedResidueAlgHomToAmbient v w hExt E).fieldRange ≤ + separableClosure k ell := by + simp only + intro y hy + rcases hy with ⟨x, rfl⟩ + exact finiteUnramifiedSubextension_residue_image_mem_separableClosure + v w hExt hE x + +end FiniteUnramifiedSubextensionInvariants + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueLifting.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueLifting.lean new file mode 100644 index 0000000000..0c51de568e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueLifting.lean @@ -0,0 +1,401 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalResidue +/-! +# Lifting separable residue elements to unramified extensions + +The reverse residue-field inclusion in the maximal-residue theorem is the Hensel step +from the residue-lifting argument: lift the minimal polynomial of a separable ambient residue +element, then lift its simple linear factor over the ambient valuation ring. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace AlgebraicNumberTheory +namespace Valuations + +section SeparableResidueLift + +variable {K L : Type u} [Field K] [Field L] [Algebra K L] +variable [Algebra.IsAlgebraic K L] + +/-- A separable ambient residue element is the residue of an actual root of +a monic lift of its base minimal polynomial. -/ +theorem exists_integral_root_lifting_separable_residue_element + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) : + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v w hExt + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + letI : Algebra k ell := (IsLocalRing.ResidueField.map i).toAlgebra + ∀ alpha : ell, IsSeparable k alpha → + ∃ F : Polynomial V, + ∃ beta : W, + F.Monic ∧ + F.map (IsLocalRing.residue V) = minpoly k alpha ∧ + (F.map ((algebraMap K L).comp + V.subtype)).eval (beta : L) = 0 ∧ + IsLocalRing.residue W beta = alpha := by + classical + simp only + intro alpha halpha + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v w hExt + let : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + let : Algebra k ell := (IsLocalRing.ResidueField.map i).toAlgebra + let fbar : Polynomial k := minpoly k alpha + have hfbarMonic : fbar.Monic := minpoly.monic halpha.isIntegral + have hfbarSep : fbar.Separable := halpha + have hlifts : fbar ∈ Polynomial.lifts (IsLocalRing.residue V) := by + rw [Polynomial.lifts_iff_coeff_lifts] + intro n + exact IsLocalRing.residue_surjective (fbar.coeff n) + obtain ⟨F, hFmap, _hFdegree, hFmonic⟩ := + Polynomial.lifts_and_natDegree_eq_and_monic hlifts hfbarMonic + let FW : Polynomial W := F.map i + let pbar : Polynomial ell := fbar.map (algebraMap k ell) + have hFWmonic : FW.Monic := hFmonic.map i + have hFWmap : FW.map (IsLocalRing.residue W) = pbar := by + have hred := unramifiedValuationRing_polynomial_target_reduction_eq + v w hExt F + change (F.map i).map (IsLocalRing.residue W) = + (F.map (IsLocalRing.residue V)).map (algebraMap k ell) at hred + rw [hred, hFmap] + have hpbarMonic : pbar.Monic := hfbarMonic.map (algebraMap k ell) + have hpbarSep : pbar.Separable := hfbarSep.map + have hpbarRoot : pbar.eval alpha = 0 := by + have hroot := minpoly.aeval k alpha + rw [Polynomial.aeval_def, Polynomial.eval₂_eq_eval_map] at hroot + exact hroot + have hpbarDerivative : pbar.derivative.eval alpha ≠ 0 := by + exact hpbarSep.eval₂_derivative_ne_zero (RingHom.id ell) (by + simpa using hpbarRoot) + let gbar : Polynomial ell := Polynomial.X - Polynomial.C alpha + let hbar : Polynomial ell := pbar /ₘ gbar + have hgbarMonic : gbar.Monic := Polynomial.monic_X_sub_C alpha + have hfactor : pbar = gbar * hbar := by + have hdivision := + Polynomial.X_sub_C_mul_divByMonic_eq_sub_modByMonic pbar alpha + have hmod : pbar %ₘ (Polynomial.X - Polynomial.C alpha) = 0 := by + rw [Polynomial.modByMonic_X_sub_C_eq_C_eval, hpbarRoot, + Polynomial.C_0] + rw [hmod, sub_zero] at hdivision + simpa [gbar, hbar] using hdivision.symm + have hhbarMonic : hbar.Monic := by + exact hgbarMonic.of_mul_monic_left (hfactor ▸ hpbarMonic) + have hcoprime : IsCoprime gbar hbar := by + exact Polynomial.isCoprime_of_is_root_of_eval_derivative_ne_zero + pbar alpha hpbarDerivative + have hHenselianW : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring w).valuation := + henselianValuation_of_algebraic_extension v w hExt hhens + let Wv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring w + have hfactorization : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty Wv := by + change ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + Wv.valuation.valuationSubring at hHenselianW + rw [ValuationSubring.valuationSubring_valuation] at hHenselianW + exact hHenselianW + have hlift : DiscreteValuationField.MonicResidualCoprimeFactorLifting Wv := + DiscreteValuationField.monicResidualCoprimeFactorLifting_of_henselFactorization + hfactorization + have hFWfactor : FW.map (IsLocalRing.residue W) = gbar * hbar := + hFWmap.trans hfactor + rcases hlift hFWmonic hgbarMonic hhbarMonic hFWfactor hcoprime with + ⟨G, H, hGmonic, _hHmonic, hGH, hGmap, _hHmap⟩ + have hGdegree : G.natDegree = 1 := by + calc + G.natDegree = (G.map (IsLocalRing.residue W)).natDegree := + (hGmonic.natDegree_map (IsLocalRing.residue W)).symm + _ = gbar.natDegree := congrArg Polynomial.natDegree hGmap + _ = 1 := Polynomial.natDegree_X_sub_C alpha + let betaV : Wv := -G.coeff 0 + let beta : W := ⟨betaV.1, betaV.2⟩ + have hGform : G = Polynomial.X - Polynomial.C betaV := by + simpa [betaV, sub_eq_add_neg] using hGmonic.eq_X_add_C hGdegree + have hbetaResidue : IsLocalRing.residue W beta = alpha := by + have hcoeff := congrArg (fun P ↦ P.coeff 0) hGmap + rw [Polynomial.coeff_map] at hcoeff + have hC : (Polynomial.C alpha : Polynomial ell).coeff 0 = alpha := + Polynomial.coeff_C_zero + have hg0 : gbar.coeff 0 = -alpha := by + rw [show gbar = Polynomial.X - Polynomial.C alpha from rfl, + Polynomial.coeff_sub, Polynomial.coeff_X_zero, hC, zero_sub] + have hcoeffNeg := hcoeff.trans hg0 + let coeffW : W := ⟨G.coeff 0, (G.coeff 0).property⟩ + have hresCoeff : + IsLocalRing.residue W coeffW = + IsLocalRing.residue Wv (G.coeff 0) := by + rfl + have hcoeffWNeg : + IsLocalRing.residue W coeffW = -alpha := + hresCoeff.trans hcoeffNeg + calc + IsLocalRing.residue W beta = + -(IsLocalRing.residue W coeffW) := by rfl + _ = -(-alpha) := congrArg Neg.neg hcoeffWNeg + _ = alpha := neg_neg alpha + have hbetaRootV : (G * H).IsRoot betaV := by + apply Polynomial.dvd_iff_isRoot.mp + refine ⟨H, ?_⟩ + rw [hGform] + have hbetaRootL : + (F.map ((algebraMap K L).comp V.subtype)).eval (beta : L) = 0 := by + change (F.map ((algebraMap K L).comp V.subtype)).eval (betaV : L) = 0 + have hpoly : + F.map ((algebraMap K L).comp V.subtype) = + (G * H).map Wv.subtype := by + apply Polynomial.ext + intro n + rw [Polynomial.coeff_map, Polynomial.coeff_map] + calc + (algebraMap K L) ↑(F.coeff n) = + Wv.subtype (show Wv from FW.coeff n) := by + rw [show FW.coeff n = i (F.coeff n) by + simp [FW]] + exact (unramifiedValuationRingValuationRingMap_apply + v w hExt (F.coeff n)).symm + _ = Wv.subtype ((G * H).coeff n) := by + exact congrArg Wv.subtype + (congrArg (fun P : Polynomial Wv => P.coeff n) hGH) + rw [hpoly] + calc + _ = Wv.subtype ((G * H).eval betaV) := + Polynomial.eval_map_apply Wv.subtype betaV + _ = Wv.subtype 0 := congrArg Wv.subtype hbetaRootV + _ = 0 := map_zero Wv.subtype + exact ⟨F, beta, hFmonic, hFmap, hbetaRootL, hbetaResidue⟩ + +/-- The lifted root generates a concrete finite unramified subextension whose +residue image is the prescribed separable ambient residue element. -/ +theorem exists_finiteUnramifiedSubextension_residue_image_eq + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) : + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v w hExt + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + letI : Algebra k ell := (IsLocalRing.ResidueField.map i).toAlgebra + ∀ alpha : ell, IsSeparable k alpha → + ∃ E : IntermediateField K L, + ∃ z : IsLocalRing.ResidueField + (LubinTate.Valuations.exponentialValuationSubring + (exponentialValuationRestrict w E)), + FiniteUnramifiedSubextension v w hExt E ∧ + restrictedResidueAlgHomToAmbient v w hExt E z = alpha := by + classical + simp only + intro alpha halpha + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v w hExt + let : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + let : Algebra k ell := (IsLocalRing.ResidueField.map i).toAlgebra + obtain ⟨F, beta, hFmonic, hFmap, hFroot, hbetaResidue⟩ := + exists_integral_root_lifting_separable_residue_element + v w hExt hhens alpha halpha + let pK : Polynomial K := F.map V.subtype + have hpKmonic : pK.Monic := hFmonic.map V.subtype + have hpKroot : Polynomial.aeval (beta : L) pK = 0 := by + rw [Polynomial.aeval_def, Polynomial.eval₂_eq_eval_map] + have hpoly : pK.map (algebraMap K L) = + F.map ((algebraMap K L).comp V.subtype) := by + rw [Polynomial.map_map] + rw [hpoly] + exact hFroot + have hbetaIntegral : IsIntegral K (beta : L) := + ⟨pK, hpKmonic, hpKroot⟩ + let E : IntermediateField K L := + IntermediateField.adjoin K ({(beta : L)} : Set L) + let hfinE : FiniteDimensional K E := by + apply IntermediateField.finiteDimensional_adjoin + intro x hx + have hx' : x = (beta : L) := by simpa using hx + subst x + exact hbetaIntegral + let : FiniteDimensional K E := hfinE + let wE := exponentialValuationRestrict w E + let hKE := exponentialValuationRestrict_extends v w hExt E + let betaE : LubinTate.Valuations.exponentialValuationSubring wE := + ⟨⟨(beta : L), IntermediateField.subset_adjoin K + ({(beta : L)} : Set L) (Set.mem_singleton (beta : L))⟩, + beta.property⟩ + have hFrootE : + (F.map ((algebraMap K E).comp V.subtype)).eval (betaE : E) = 0 := by + apply E.val.injective + rw [← Polynomial.eval_map_apply] + have hpoly : + (F.map ((algebraMap K E).comp V.subtype)).map E.val.toRingHom = + F.map ((algebraMap K L).comp V.subtype) := by + rw [Polynomial.map_map] + apply Polynomial.ext + intro n + rfl + rw [hpoly] + simp only [map_zero] + exact hFroot + have hFreduction : + (F.map (IsLocalRing.residue V)).Separable := by + rw [hFmap] + exact halpha + have hGenIF : + IntermediateField.adjoin K ({(betaE : E)} : Set E) = ⊤ := by + have hmapTop : IntermediateField.map E.val ⊤ = E := by + ext x + constructor + · rintro ⟨y, _hy, rfl⟩ + exact y.property + · intro hx + exact ⟨⟨x, hx⟩, by trivial, rfl⟩ + apply IntermediateField.map_injective E.val + rw [IntermediateField.adjoin_map, Set.image_singleton] + change IntermediateField.adjoin K ({(beta : L)} : Set L) = + IntermediateField.map E.val ⊤ + change E = IntermediateField.map E.val ⊤ + exact hmapTop.symm + have hGen : Algebra.adjoin K ({(betaE : E)} : Set E) = ⊤ := by + apply Algebra.adjoin_eq_top_of_intermediateField + (fun x _hx ↦ Algebra.IsAlgebraic.isAlgebraic x) + exact hGenIF + have hEfinite : FiniteUnramifiedExtension v wE hKE := + finiteUnramifiedExtension_of_primitive_separable_integral_model + v wE hKE hhens betaE F hFmonic hFrootE hFreduction hGen + let VE := LubinTate.Valuations.exponentialValuationSubring wE + let z := IsLocalRing.residue VE betaE + refine ⟨E, z, ⟨hfinE, hEfinite⟩, ?_⟩ + change IsLocalRing.residue W beta = alpha + exact hbetaResidue + +/-- the maximal-residue theorem, reverse residue-field inclusion: every ambient residue +element separable over the base occurs already in the residue field of the +maximal unramified subextension. -/ +theorem separableClosure_le_maximalUnramifiedSubextension_residue_fieldRange + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) : + let T := maximalUnramifiedSubextension v w hExt + let wT := exponentialValuationRestrict w T + let V := LubinTate.Valuations.exponentialValuationSubring v + let VT := LubinTate.Valuations.exponentialValuationSubring wT + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v wT + (exponentialValuationRestrict_extends v w hExt T) + let b := unramifiedValuationRingValuationRingMap v w hExt + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v wT + (exponentialValuationRestrict_extends v w hExt T) + letI : IsLocalHom b := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let k := IsLocalRing.ResidueField V + let kT := IsLocalRing.ResidueField VT + let ell := IsLocalRing.ResidueField W + letI : Algebra k kT := (IsLocalRing.ResidueField.map i).toAlgebra + letI : Algebra k ell := (IsLocalRing.ResidueField.map b).toAlgebra + separableClosure k ell ≤ + (restrictedResidueAlgHomToAmbient v w hExt T).fieldRange := by + classical + simp only + intro alpha halpha + let T := maximalUnramifiedSubextension v w hExt + let wT := exponentialValuationRestrict w T + let V := LubinTate.Valuations.exponentialValuationSubring v + let VT := LubinTate.Valuations.exponentialValuationSubring wT + let W := LubinTate.Valuations.exponentialValuationSubring w + let b := unramifiedValuationRingValuationRingMap v w hExt + let : IsLocalHom b := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + let : Algebra k ell := (IsLocalRing.ResidueField.map b).toAlgebra + have hsep : IsSeparable k alpha := + mem_separableClosure_iff.mp halpha + obtain ⟨E, z, hEunramified, hz⟩ := + exists_finiteUnramifiedSubextension_residue_image_eq + v w hExt hhens alpha hsep + have hET : E ≤ T := + finiteUnramifiedSubextension_le_maximal v w hExt hEunramified + let wE := exponentialValuationRestrict w E + let VE := LubinTate.Valuations.exponentialValuationSubring wE + obtain ⟨e, rfl⟩ := IsLocalRing.residue_surjective z + let eT : VT := restrictedValuationRingMapOfLE w hET e + let zT := IsLocalRing.residue VT eT + refine ⟨zT, ?_⟩ + calc + restrictedResidueAlgHomToAmbient v w hExt T zT = + restrictedResidueAlgHomToAmbient v w hExt E + (IsLocalRing.residue VE e) := by rfl + _ = alpha := hz + +/-- Exact residue-field identity for the lifted unramified extension. -/ +theorem maximalUnramifiedSubextension_residue_fieldRange_eq_separableClosure + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) : + let T := maximalUnramifiedSubextension v w hExt + let wT := exponentialValuationRestrict w T + let V := LubinTate.Valuations.exponentialValuationSubring v + let VT := LubinTate.Valuations.exponentialValuationSubring wT + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v wT + (exponentialValuationRestrict_extends v w hExt T) + let b := unramifiedValuationRingValuationRingMap v w hExt + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v wT + (exponentialValuationRestrict_extends v w hExt T) + letI : IsLocalHom b := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let k := IsLocalRing.ResidueField V + let kT := IsLocalRing.ResidueField VT + let ell := IsLocalRing.ResidueField W + letI : Algebra k kT := (IsLocalRing.ResidueField.map i).toAlgebra + letI : Algebra k ell := (IsLocalRing.ResidueField.map b).toAlgebra + (restrictedResidueAlgHomToAmbient v w hExt T).fieldRange = + separableClosure k ell := by + apply le_antisymm + · exact + maximalUnramifiedSubextension_residue_fieldRange_le_separableClosure + v w hExt hhens + · exact + separableClosure_le_maximalUnramifiedSubextension_residue_fieldRange + v w hExt hhens + +end SeparableResidueLift + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Separable.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Separable.lean new file mode 100644 index 0000000000..420b071fe6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Separable.lean @@ -0,0 +1,385 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselianAlgebraicExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BasicInvariants +public import Mathlib.FieldTheory.Minpoly.IsIntegrallyClosed +public import Mathlib.FieldTheory.PrimitiveElement +public import Mathlib.FieldTheory.SeparableClosure +public import Mathlib.RingTheory.Adjoin.PowerBasis +/-! +# Separability sources for finite unramified extensions + +A finite unramified extension of a Henselian valued field is separable. The +proof follows the primitive-residue-element argument on p. 153: lift a +primitive generator of the separable residue extension, use the fundamental inequality +to show that its powers are a basis of the field extension, and compare its +minimal polynomial with its separable reduction. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +section ResiduePolynomial + +variable {K : Type*} {L : Type*} [Field K] [Field L] [Algebra K L] + +/-- Reducing a base valuation-ring polynomial after mapping it to the target +valuation ring agrees with first reducing it over the base residue field. -/ +theorem unramifiedValuationRing_polynomial_target_reduction_eq + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (P : Polynomial (LubinTate.Valuations.exponentialValuationSubring v)) : + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v w hExt + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + letI : Algebra k ell := (IsLocalRing.ResidueField.map i).toAlgebra + (P.map i).map (IsLocalRing.residue W) = + (P.map (IsLocalRing.residue V)).map (algebraMap k ell) := by + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v w hExt + let : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + let : Algebra k ell := (IsLocalRing.ResidueField.map i).toAlgebra + ext n + simp only [Polynomial.coeff_map] + change IsLocalRing.residue W (i (P.coeff n)) = + IsLocalRing.ResidueField.map i + (IsLocalRing.residue V (P.coeff n)) + rfl + +/-- Evaluation of a valuation-ring polynomial commutes with passage to the +actual residue fields. -/ +theorem unramifiedValuationRing_polynomial_aeval_residue_eq + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (P : Polynomial (LubinTate.Valuations.exponentialValuationSubring v)) + (x : LubinTate.Valuations.exponentialValuationSubring w) : + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v w hExt + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + letI : Algebra V W := i.toAlgebra + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + letI : Algebra k ell := (IsLocalRing.ResidueField.map i).toAlgebra + IsLocalRing.residue W (Polynomial.aeval x P) = + ((P.map (IsLocalRing.residue V)).map (algebraMap k ell)).eval + (IsLocalRing.residue W x) := by + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v w hExt + let : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let : Algebra V W := i.toAlgebra + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + let : Algebra k ell := (IsLocalRing.ResidueField.map i).toAlgebra + calc + IsLocalRing.residue W (Polynomial.aeval x P) = + ((P.map i).map (IsLocalRing.residue W)).eval + (IsLocalRing.residue W x) := by + rw [Polynomial.aeval_def, Polynomial.eval₂_eq_eval_map] + exact + (Polynomial.eval_map_apply + (f := IsLocalRing.residue W) (p := P.map i) x).symm + _ = ((P.map (IsLocalRing.residue V)).map + (algebraMap k ell)).eval (IsLocalRing.residue W x) := by + rw [unramifiedValuationRing_polynomial_target_reduction_eq v w hExt P] + +end ResiduePolynomial + +/-- A monic reduction is its monic divisor when another coefficient model +has the divisor's degree. -/ +private theorem monic_reduction_eq_of_model_degree + {R K k : Type*} [CommRing R] [Field K] [Field k] + (f : R →+* K) (g : R →+* k) (p : Polynomial R) (q : Polynomial k) + (hp : p.Monic) (hq : q.Monic) (hdvd : q ∣ p.map g) + (hdegree : (p.map f).natDegree = q.natDegree) : p.map g = q := by + apply Polynomial.eq_of_monic_of_dvd_of_natDegree_le hq (hp.map g) hdvd + exact le_of_eq ((hp.natDegree_map g).trans ((hp.natDegree_map f).symm.trans hdegree)) + +/-- Separability of an irreducible reduction lifts through an injective map of coefficient rings. -/ +private theorem separable_map_of_separable_reduction + {R K k : Type*} [CommRing R] [Field K] [Field k] + (f : R →+* K) (hf : Function.Injective f) (g : R →+* k) + (p : Polynomial R) (hK : Irreducible (p.map f)) + (hk : Irreducible (p.map g)) (hsep : (p.map g).Separable) : + (p.map f).Separable := by + apply (Polynomial.separable_iff_derivative_ne_zero hK).2 + intro hzero + have hpzero : p.derivative = 0 := (Polynomial.map_eq_zero_iff hf).1 (by + rw [← Polynomial.derivative_map, hzero]) + apply (Polynomial.separable_iff_derivative_ne_zero hk).1 hsep + simp only [Polynomial.derivative_map, hpzero, Polynomial.map_zero] + +section FiniteUnramifiedExtensionSeparability + +variable {K : Type*} {L : Type*} [Field K] [Field L] [Algebra K L] +variable [FiniteDimensional K L] + +/-- Primitive-lift source for a finite unramified extension. + +For a finite unramified extension, this constructs the lifted primitive +residue element used on p. 153 and its integral minimal polynomial. The +element generates `L/K`; the polynomial becomes its field minimal polynomial +over `K`, and its residue is the separable minimal polynomial of the residue +class. -/ +theorem exists_primitive_lift_minpoly_of_finiteUnramifiedExtension + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) + (hUnramified : FiniteUnramifiedExtension v w hExt) : + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v w hExt + letI : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + letI : Algebra k ell := (IsLocalRing.ResidueField.map i).toAlgebra + ∃ a : W, ∃ F : Polynomial V, + IntermediateField.adjoin K ({(a : L)} : Set L) = ⊤ ∧ + F.map V.subtype = minpoly K (a : L) ∧ + F.map (IsLocalRing.residue V) = + minpoly k (IsLocalRing.residue W a) ∧ + (F.map (IsLocalRing.residue V)).Separable ∧ + IsSeparable K (a : L) := by + classical + let : Algebra.IsAlgebraic K L := Algebra.IsAlgebraic.of_finite K L + let Vv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v + let Wv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring w + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := unramifiedValuationRingValuationRingMap v w hExt + let : IsLocalHom i := + unramifiedValuationRingValuationRingMap_isLocalHom v w hExt + let : Algebra V W := i.toAlgebra + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + let : Algebra k ell := (IsLocalRing.ResidueField.map i).toAlgebra + have hresfin : FiniteDimensional k ell := + residueExtension_finiteDimensional_of_finiteDimensional v w hExt + let : FiniteDimensional k ell := hresfin + let residueModule : Module k ell := inferInstance + let algebraModule : Module k ell := + (inferInstance : Algebra k ell).toModule + have hresidueModule : residueModule = algebraModule := by + apply Module.ext + funext r x + obtain ⟨r, rfl⟩ := IsLocalRing.residue_surjective r + obtain ⟨x, rfl⟩ := IsLocalRing.residue_surjective x + rfl + have hresfinAlgebra : + @FiniteDimensional k ell _ _ + algebraModule := by + rw [← hresidueModule] + exact hresfin + have hressep : Algebra.IsSeparable k ell := + finiteUnramifiedExtension_residue_isSeparable + v w hExt hUnramified + let : Algebra.IsSeparable k ell := hressep + obtain ⟨abar, habarPrimitive⟩ := + @Field.exists_primitive_element k ell _ _ _ hresfinAlgebra hressep + have habarIntegral : IsIntegral k abar := + Algebra.IsIntegral.isIntegral abar + have habarAlgebraAdjoin : + Algebra.adjoin k ({abar} : Set ell) = ⊤ := + Algebra.adjoin_eq_top_of_primitive_element + habarIntegral.isAlgebraic habarPrimitive + let pb : PowerBasis k ell := + PowerBasis.ofAdjoinEqTop habarIntegral habarAlgebraAdjoin + let betaFamily : Fin pb.dim → ell := fun j => pb.basis j + have hbetaLinearIndependent : + @LinearIndependent (Fin pb.dim) k ell betaFamily _ _ + residueModule := by + rw [hresidueModule] + exact pb.basis.linearIndependent + have hbetaSpan : + (⊤ : @Submodule k ell _ _ residueModule) ≤ + @Submodule.span k ell _ _ residueModule + (Set.range betaFamily) := by + rw [hresidueModule] + exact le_of_eq pb.basis.span_eq.symm + let beta : + @Module.Basis (Fin pb.dim) k ell _ _ residueModule := + @Module.Basis.mk (Fin pb.dim) k ell _ _ residueModule + betaFamily hbetaLinearIndependent hbetaSpan + have hbeta_apply (j : Fin pb.dim) : beta j = pb.basis j := by + calc + beta j = betaFamily j := + @Module.Basis.mk_apply (Fin pb.dim) k ell _ _ residueModule + betaFamily hbetaLinearIndependent hbetaSpan j + _ = pb.basis j := rfl + obtain ⟨a, hares⟩ := IsLocalRing.residue_surjective abar + have homega : ∀ j : Fin pb.dim, + IsLocalRing.residue W (a ^ (j : ℕ)) = beta j := by + intro j + calc + IsLocalRing.residue W (a ^ (j : ℕ)) = + abar ^ (j : ℕ) := by rw [map_pow, hares] + _ = pb.gen ^ (j : ℕ) := by + rw [PowerBasis.ofAdjoinEqTop_gen] + _ = pb.basis j := (pb.basis_eq_pow j).symm + _ = beta j := (hbeta_apply j).symm + obtain ⟨bL, hbL⟩ := + exists_basis_eq_residueBasisLifts_of_finiteUnramifiedExtension + v w hExt hUnramified beta + (fun j : Fin pb.dim ↦ a ^ (j : ℕ)) homega + let pbL : PowerBasis K L := + { gen := (a : L) + dim := pb.dim + basis := bL + basis_eq_pow := by + intro j + rw [hbL j] + rfl } + let algVL : Algebra V L := + ((algebraMap K L).comp V.subtype).toAlgebra + let : Algebra V L := algVL + let : SMul V L := algVL.toSMul + let : SMul V K := (inferInstance : Algebra V K).toSMul + let : IsScalarTower V K L := + IsScalarTower.of_algebraMap_eq + (R := V) (S := K) (A := L) (by intro x; rfl) + let : IsFractionRing V K := by + change IsFractionRing Vv K + have hfr : IsFractionRing Vv.valuation.valuationSubring K := + (Valuation.valuationSubring.integers + (v := Vv.valuation)).isFractionRing + rw [Vv.valuationSubring_valuation] at hfr + exact hfr + let : IsIntegrallyClosed V := by + change IsIntegrallyClosed Vv + infer_instance + have hclosureVv : + Wv.toSubring = (integralClosure Vv L).toSubring := + exponentialValuationSubring_eq_integralClosure_of_henselian + v w hExt hhens + let eV : V ≃+* Vv := + { toFun := fun x => ⟨x, x.property⟩ + invFun := fun x => ⟨x, x.property⟩ + left_inv := fun x => Subtype.ext rfl + right_inv := fun x => Subtype.ext rfl + map_mul' := fun _ _ => Subtype.ext rfl + map_add' := fun _ _ => Subtype.ext rfl } + have heV : + (algebraMap Vv L).comp eV.toRingHom = algebraMap V L := by + ext x + rfl + have haIntegralVv : IsIntegral Vv (a : L) := by + change (a : L) ∈ (integralClosure Vv L).toSubring + rw [← hclosureVv] + exact a.property + have haIntegralV : IsIntegral V (a : L) := + (eV.isIntegral_iff heV (a : L)).mpr haIntegralVv + let pV : Polynomial V := minpoly V (a : L) + let pK : Polynomial K := minpoly K (a : L) + let pbar : Polynomial k := pV.map (IsLocalRing.residue V) + let q : Polynomial k := minpoly k abar + have hpW : Polynomial.aeval a pV = 0 := by + change pV.eval₂ i a = 0 + apply W.subtype_injective + rw [map_zero, Polynomial.hom_eval₂] + change pV.eval₂ (algebraMap V L) (a : L) = 0 + exact minpoly.aeval V (a : L) + have hpbarRoot : Polynomial.aeval abar pbar = 0 := by + have hred := + unramifiedValuationRing_polynomial_aeval_residue_eq v w hExt pV a + simp only at hred + rw [hpW, map_zero] at hred + rw [Polynomial.aeval_def, Polynomial.eval₂_eq_eval_map] + rw [← hares] + exact hred.symm + have hqdvd : q ∣ pbar := minpoly.dvd k abar hpbarRoot + have hpVmonic : pV.Monic := minpoly.monic haIntegralV + have hqMonic : q.Monic := minpoly.monic habarIntegral + have hpKmap : pK = pV.map (algebraMap V K) := + minpoly.isIntegrallyClosed_eq_field_fractions' K haIntegralV + have hpbarEq : pbar = q := by + apply monic_reduction_eq_of_model_degree (algebraMap V K) + (IsLocalRing.residue V) pV q hpVmonic hqMonic hqdvd + rw [← hpKmap] + exact pbL.natDegree_minpoly.trans pb.natDegree_minpoly.symm + have hqSeparable : q.Separable := + Algebra.IsSeparable.isSeparable k abar + have haSeparable : IsSeparable K (a : L) := by + change pK.Separable + rw [hpKmap] + apply separable_map_of_separable_reduction (algebraMap V K) + V.subtype_injective (IsLocalRing.residue V) pV + · rw [← hpKmap] + exact minpoly.irreducible (Algebra.IsIntegral.isIntegral (a : L)) + · change Irreducible pbar + rw [hpbarEq] + exact minpoly.irreducible habarIntegral + · change pbar.Separable + rwa [hpbarEq] + have hprimitiveK : + IntermediateField.adjoin K ({(a : L)} : Set L) = ⊤ := + IntermediateField.adjoin_eq_top_iff.2 pbL.adjoin_gen_eq_top + have hresidueMinpoly : + pV.map (IsLocalRing.residue V) = + minpoly k (IsLocalRing.residue W a) := by + simpa only [hares] using hpbarEq + have hpbarSeparable : + (pV.map (IsLocalRing.residue V)).Separable := by + simpa only [← hpbarEq] using hqSeparable + refine ⟨a, pV, hprimitiveK, ?_, hresidueMinpoly, + hpbarSeparable, haSeparable⟩ + exact hpKmap.symm + +/-- Finite separability source for an unramified extension. + +A finite extension satisfying the literal unramified condition is separable +when the base valuation is Henselian. No separability of +`L/K` is assumed. -/ +theorem finiteUnramifiedExtension_isSeparable_of_henselian + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) + (hUnramified : FiniteUnramifiedExtension v w hExt) : + Algebra.IsSeparable K L := by + obtain ⟨a, _F, hprimitiveK, _hfieldMinpoly, _hresidueMinpoly, + _hresidueSeparable, haSeparable⟩ := + exists_primitive_lift_minpoly_of_finiteUnramifiedExtension + v w hExt hhens hUnramified + apply (separableClosure.eq_top_iff (F := K) (E := L)).1 + apply top_unique + rw [← hprimitiveK] + apply IntermediateField.adjoin_le_iff.2 + intro x hx + have hxEq : x = (a : L) := by simpa using hx + rw [hxEq] + exact mem_separableClosure_iff.2 haSeparable + +end FiniteUnramifiedExtensionSeparability + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification.lean new file mode 100644 index 0000000000..13c17f713a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification.lean @@ -0,0 +1,20 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.ClosedSubgroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Different +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Filtration +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.InertiaCardinality +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.ProfiniteInvariant + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ClosedSubgroups.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ClosedSubgroups.lean new file mode 100644 index 0000000000..da48959ee7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ClosedSubgroups.lean @@ -0,0 +1,221 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationGroup +public import Mathlib.FieldTheory.Galois.Infinite + +/-! # Closed Subgroups -/ + +@[expose] public section +namespace RamificationTheory + +/-! +# finite Galois ramification theory: closed canonical subgroups + +The paragraph following the decomposition and inertia subgroup definitions observes that the +decomposition, inertia, and ramification groups are closed in the Krull topology, also for an +infinite Galois extension. Each failure is witnessed by one field element, hence persists on a +coset of the open subgroup fixing the finite simple extension generated by that element. +-/ + +noncomputable +section + +universe u v + +namespace HilbertRamification +namespace ValuationSubring + +open scoped Pointwise Topology + +variable (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] +variable [Algebra.IsAlgebraic K L] + +omit [Algebra.IsAlgebraic K L] in +private theorem mem_decompositionGroup_iff_apply_mem + (A : _root_.ValuationSubring L) (sigma : L ≃ₐ[K] L) : + sigma ∈ decompositionGroup K A ↔ + ∀ x : L, sigma x ∈ A ↔ x ∈ A := by + change sigma • A = A ↔ _ + constructor + · intro hsigma x + have hmem := congrArg (fun B : _root_.ValuationSubring L => sigma x ∈ B) hsigma + change (sigma x ∈ sigma • A) = (sigma x ∈ A) at hmem + rw [_root_.ValuationSubring.mem_pointwise_smul_iff_inv_smul_mem] at hmem + change (sigma⁻¹ (sigma x) ∈ A) = (sigma x ∈ A) at hmem + have hinv : sigma⁻¹ (sigma x) = x := by simp + rw [hinv] at hmem + exact hmem.symm.to_iff + · intro hsigma + ext x + rw [_root_.ValuationSubring.mem_pointwise_smul_iff_inv_smul_mem] + simpa using (hsigma (sigma⁻¹ x)).symm + +/-- The valuation-subring decomposition group is closed in the Krull +topology. -/ +theorem decompositionGroup_isClosed + (A : _root_.ValuationSubring L) : + IsClosed (decompositionGroup K A : Set (L ≃ₐ[K] L)) where + isOpen_compl := isOpen_iff_mem_nhds.mpr fun sigma hsigma => by + rw [Set.mem_compl_iff, SetLike.mem_coe, + mem_decompositionGroup_iff_apply_mem] at hsigma + rcases Classical.not_forall.mp hsigma with ⟨x, hx⟩ + let E : IntermediateField K L := IntermediateField.adjoin K {x} + let : FiniteDimensional K E := + IntermediateField.adjoin.finiteDimensional + (Algebra.IsIntegral.isIntegral x) + apply mem_nhds_iff.mpr + refine ⟨sigma • (E.fixingSubgroup : Set (L ≃ₐ[K] L)), ?_, ?_, ?_⟩ + · intro tau htau + rcases Set.mem_smul_set.mp htau with ⟨g, hg, rfl⟩ + rw [Set.mem_compl_iff, SetLike.mem_coe, + mem_decompositionGroup_iff_apply_mem] + intro hmem + apply hx + have hgx : g x = x := + (IntermediateField.mem_fixingSubgroup_iff E g).mp hg x + (IntermediateField.subset_adjoin (F := K) (S := {x}) (by simp)) + simpa [AlgEquiv.mul_apply, hgx] using hmem x + · exact E.fixingSubgroup_isOpen.smul sigma + · exact ⟨1, E.fixingSubgroup.one_mem, by simp⟩ + +/-- The copy of inertia in the ambient Galois group is closed in the Krull +topology. -/ +theorem inertiaGroupInAut_isClosed + (A : _root_.ValuationSubring L) : + IsClosed (inertiaGroupInAut K A : Set (L ≃ₐ[K] L)) where + isOpen_compl := isOpen_iff_mem_nhds.mpr fun sigma hsigma => by + rw [Set.mem_compl_iff, SetLike.mem_coe] at hsigma + by_cases hD : sigma ∈ decompositionGroup K A + · let delta : decompositionGroup K A := ⟨sigma, hD⟩ + have hdelta : delta ∉ inertiaGroup K A := by + intro hI + exact hsigma ⟨delta, hI, rfl⟩ + have haction : residueAction K A delta ≠ 1 := by + simpa [← residueAction_ker (K := K) A, MonoidHom.mem_ker] using hdelta + obtain ⟨y, hy⟩ := DFunLike.ne_iff.mp haction + obtain ⟨x, rfl⟩ := IsLocalRing.residue_surjective y + let E : IntermediateField K L := IntermediateField.adjoin K {(x : L)} + let : FiniteDimensional K E := + IntermediateField.adjoin.finiteDimensional + (Algebra.IsIntegral.isIntegral (x : L)) + apply mem_nhds_iff.mpr + refine ⟨sigma • (E.fixingSubgroup : Set (L ≃ₐ[K] L)), ?_, + E.fixingSubgroup_isOpen.smul sigma, + ⟨1, E.fixingSubgroup.one_mem, by simp⟩⟩ + rintro tau ⟨g, hg, rfl⟩ + rw [Set.mem_compl_iff, SetLike.mem_coe] + rintro ⟨i, hi, hitau⟩ + have hgx : g (x : L) = (x : L) := + (IntermediateField.mem_fixingSubgroup_iff E g).mp hg (x : L) + (IntermediateField.subset_adjoin (F := K) (S := {(x : L)}) (by simp)) + have hiAction : residueAction K A (i : decompositionGroup K A) = 1 := by + exact MonoidHom.mem_ker.mp + ((residueAction_ker (K := K) A).symm ▸ hi) + apply hy + have happ := DFunLike.congr_fun hiAction (IsLocalRing.residue A x) + change i • IsLocalRing.residue A x = IsLocalRing.residue A x at happ + change delta • IsLocalRing.residue A x = IsLocalRing.residue A x + have heq := DFunLike.congr_fun hitau (x : L) + have hsmul : i • x = delta • x := by + apply Subtype.ext + change + (((i : decompositionGroup K A) : L ≃ₐ[K] L) (x : L)) = + ((delta : L ≃ₐ[K] L) (x : L)) + simpa [AlgEquiv.mul_apply, hgx] using heq + change + IsLocalRing.residue A (delta • x) = IsLocalRing.residue A x + rw [← hsmul] + exact happ + · apply mem_nhds_iff.mpr + refine ⟨(decompositionGroup K A : Set (L ≃ₐ[K] L))ᶜ, ?_, + isOpen_compl_iff.mpr (decompositionGroup_isClosed K A), ?_⟩ + · intro tau htau + rw [Set.mem_compl_iff, SetLike.mem_coe] at htau ⊢ + rintro ⟨i, _hi, rfl⟩ + exact htau (i : decompositionGroup K A).property + · simpa only [Set.mem_compl_iff, SetLike.mem_coe] using hD + +/-- The copy of the ramification group in the ambient Galois group is closed +in the Krull topology. -/ +theorem ramificationGroupInAut_isClosed + (A : _root_.ValuationSubring L) : + IsClosed (ramificationGroupInAut K A : Set (L ≃ₐ[K] L)) where + isOpen_compl := isOpen_iff_mem_nhds.mpr fun sigma hsigma => by + rw [Set.mem_compl_iff, SetLike.mem_coe] at hsigma + by_cases hI : sigma ∈ inertiaGroupInAut K A + · rcases hI with ⟨delta, hdeltaI, hdelta⟩ + subst sigma + let i : inertiaGroup K A := ⟨delta, hdeltaI⟩ + have hiR : i ∉ ramificationGroup K A := by + intro hR + exact hsigma ⟨i, hR, rfl⟩ + rw [mem_ramificationGroup_iff] at hiR + rcases Classical.not_forall.mp hiR with ⟨x, hx⟩ + let E : IntermediateField K L := IntermediateField.adjoin K {(x : L)} + let : FiniteDimensional K E := + IntermediateField.adjoin.finiteDimensional + (Algebra.IsIntegral.isIntegral (x : L)) + apply mem_nhds_iff.mpr + refine ⟨((delta : L ≃ₐ[K] L) • + (E.fixingSubgroup : Set (L ≃ₐ[K] L))), ?_, + E.fixingSubgroup_isOpen.smul _, + ⟨1, E.fixingSubgroup.one_mem, by simp⟩⟩ + rintro tau ⟨g, hg, rfl⟩ + rw [Set.mem_compl_iff, SetLike.mem_coe] + rintro ⟨j, hjR, hjtau⟩ + have hgx : g (x : L) = (x : L) := + (IntermediateField.mem_fixingSubgroup_iff E g).mp hg (x : L) + (IntermediateField.subset_adjoin (F := K) (S := {(x : L)}) (by simp)) + apply hx + have hjx := (mem_ramificationGroup_iff (K := K) A j).mp hjR x + have heq := DFunLike.congr_fun hjtau (x : L) + have hquot : + automorphismUnitQuotient K A (i : decompositionGroup K A) x = + automorphismUnitQuotient K A (j : decompositionGroup K A) x := by + have hmap : + Units.mapEquiv + (((i : decompositionGroup K A) : L ≃ₐ[K] L).toMulEquiv) x = + Units.mapEquiv + (((j : decompositionGroup K A) : L ≃ₐ[K] L).toMulEquiv) x := by + apply Units.ext + simpa [AlgEquiv.mul_apply, hgx] using heq.symm + unfold automorphismUnitQuotient + rw [hmap] + rw [hquot] + exact hjx + · apply mem_nhds_iff.mpr + refine ⟨(inertiaGroupInAut K A : Set (L ≃ₐ[K] L))ᶜ, ?_, + isOpen_compl_iff.mpr (inertiaGroupInAut_isClosed K A), ?_⟩ + · intro tau htau + rw [Set.mem_compl_iff, SetLike.mem_coe] at htau ⊢ + rintro ⟨i, _hi, rfl⟩ + exact htau ⟨(i : inertiaGroup K A), i.property, rfl⟩ + · simpa only [Set.mem_compl_iff, SetLike.mem_coe] using hI + +/-- Infinite Galois correspondence for the inertia field. -/ +theorem inertiaField_fixingSubgroup_eq + [IsGalois K L] (A : _root_.ValuationSubring L) : + (inertiaField K A).fixingSubgroup = inertiaGroupInAut K A := by + let H : ClosedSubgroup (L ≃ₐ[K] L) := + ⟨inertiaGroupInAut K A, inertiaGroupInAut_isClosed K A⟩ + exact InfiniteGalois.fixingSubgroup_fixedField H + +/-- Infinite Galois correspondence for the ramification field. -/ +theorem ramificationField_fixingSubgroup_eq + [IsGalois K L] (A : _root_.ValuationSubring L) : + (ramificationField K A).fixingSubgroup = ramificationGroupInAut K A := by + let H : ClosedSubgroup (L ≃ₐ[K] L) := + ⟨ramificationGroupInAut K A, ramificationGroupInAut_isClosed K A⟩ + exact InfiniteGalois.fixingSubgroup_fixedField H + +end ValuationSubring +end HilbertRamification + +end +end RamificationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean new file mode 100644 index 0000000000..884368d8a9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean @@ -0,0 +1,748 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core +public import Mathlib.RingTheory.DedekindDomain.Different +/-! +# Different and codifferent for valued finite extensions + +This file specializes mathlib's Dedekind-domain different ideal to complete +DVF valuation rings. The ideal itself remains mathlib's `differentIdeal`; the +extra API here connects it to the chosen valuation rings, the codifferent, and +the local unramified criterion. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w x + +attribute [local instance] FractionRing.liftAlgebra FractionRing.isScalarTower_liftAlgebra + +namespace RamificationTheory +namespace DiscreteValuationField + +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +namespace ValuedExtension + +variable {K : Type u} {L : Type w} [Field K] [Field L] +variable [Algebra K L] [FiniteDimensional K L] +variable (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) +variable [base.valuation.HasExtension target.valuation] + +/-- The codifferent submodule of the valuation ring extension, i.e. the +trace-dual of the target valuation ring. -/ +noncomputable def codifferentSubmodule + [IsScalarTower base.valuationSubring target.valuationSubring L] : + Submodule target.valuationSubring L := + Submodule.traceDual base.valuationSubring K + (1 : Submodule target.valuationSubring L) + +omit [FiniteDimensional K L] in +/-- Trace-dual membership written directly as a trace integrality condition. -/ +theorem mem_codifferentSubmodule_iff_trace_mul_integral + [IsScalarTower base.valuationSubring target.valuationSubring L] + {z : L} : + z ∈ (RamificationTheory.DiscreteValuationField.ValuedExtension.codifferentSubmodule base + target) ↔ + ∀ a ∈ (1 : Submodule target.valuationSubring L), + IsIntegral base.valuationSubring (Algebra.trace K L (z * a)) := by + change + z ∈ Submodule.traceDual base.valuationSubring K + (1 : Submodule target.valuationSubring L) ↔ + ∀ a ∈ (1 : Submodule target.valuationSubring L), + IsIntegral base.valuationSubring (Algebra.trace K L (z * a)) + rw [Submodule.mem_traceDual_iff_isIntegral] + simp [Algebra.traceForm_apply] + +omit [FiniteDimensional K L] in +/-- The trace-dual operation is antitone. This is the general filtration +transfer lemma used to move between ideal/submodule levels and trace bounds. -/ +theorem traceDual_antitone + [IsScalarTower base.valuationSubring target.valuationSubring L] + {I J : Submodule target.valuationSubring L} (hIJ : I ≤ J) : + Submodule.traceDual base.valuationSubring K J ≤ + Submodule.traceDual base.valuationSubring K I := by + intro z hz + rw [Submodule.mem_traceDual] at hz ⊢ + intro a ha + exact hz a (hIJ ha) + +omit [FiniteDimensional K L] in +/-- Elements of the codifferent pair integrally with every integral element +under the trace form. -/ +theorem trace_mul_mem_integer_range_of_mem_codifferent + [IsScalarTower base.valuationSubring target.valuationSubring L] + {z a : L} (hz : z ∈ + (RamificationTheory.DiscreteValuationField.ValuedExtension.codifferentSubmodule base target)) + (ha : a ∈ (1 : Submodule target.valuationSubring L)) : + Algebra.trace K L (z * a) ∈ + (algebraMap base.valuationSubring K).range := by + change + z ∈ Submodule.traceDual base.valuationSubring K + (1 : Submodule target.valuationSubring L) at hz + have htrace := (Submodule.mem_traceDual.mp hz) a ha + simpa [Algebra.traceForm_apply] using htrace + +/-- The different ideal with the torsion-free certificate supplied by finite +separability of complete-DVF extensions. -/ +noncomputable def differentIdealOfFiniteSeparable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + Ideal target.valuationSubring := + @differentIdeal base.valuationSubring target.valuationSubring + inferInstance inferInstance inferInstance inferInstance inferInstance + (moduleIsTorsionFree_target_valuationSubring_of_finite_separable + (K := K) (L := L) (base := base) (target := target)) + +/-- The finite-separable different ideal agrees with mathlib's `differentIdeal` +whenever a torsion-free instance is already in scope. -/ +theorem differentIdealOfFiniteSeparable_eq_differentIdeal + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + [Module.IsTorsionFree base.valuationSubring target.valuationSubring] : + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + base target) = + differentIdeal base.valuationSubring target.valuationSubring := by + simp [differentIdealOfFiniteSeparable] + +/-- Finite-separable trace-dual membership written directly as a trace +integrality condition. -/ +theorem mem_codifferentSubmodule_iff_trace_mul_integral_of_finite_separable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + {z : L} : + z ∈ (RamificationTheory.DiscreteValuationField.ValuedExtension.codifferentSubmodule base + target) ↔ + ∀ a ∈ (1 : Submodule target.valuationSubring L), + IsIntegral base.valuationSubring (Algebra.trace K L (z * a)) := by + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_finite_separable base target + exact + (mem_codifferentSubmodule_iff_trace_mul_integral base target) + +/-- The local different/codifferent relation in finite separable complete-DVF +extensions, using the finite-separable different ideal. -/ +theorem coeSubmodule_differentIdealOfFiniteSeparable_eq_one_div_codifferent + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + IsLocalization.coeSubmodule L + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + base target) = + 1 / (RamificationTheory.DiscreteValuationField.ValuedExtension.codifferentSubmodule base + target) := by + unfold differentIdealOfFiniteSeparable + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_finite_separable base target + let : Module.IsTorsionFree base.valuationSubring target.valuationSubring := + moduleIsTorsionFree_target_valuationSubring_of_finite_separable + (K := K) (L := L) (base := base) (target := target) + change + IsLocalization.coeSubmodule L + (differentIdeal base.valuationSubring target.valuationSubring) = + 1 / Submodule.traceDual base.valuationSubring K + (1 : Submodule target.valuationSubring L) + exact _root_.coeSubmodule_differentIdeal + base.valuationSubring K target.valuationSubring + +omit [FiniteDimensional K L] in +/-- The different ideal is nonzero for finite separable torsion-free valuation +ring extensions. -/ +theorem differentIdeal_ne_bot + [Module.IsTorsionFree base.valuationSubring target.valuationSubring] + [Module.Finite base.valuationSubring target.valuationSubring] + [Algebra.IsSeparable + (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring)] : + differentIdeal base.valuationSubring target.valuationSubring ≠ ⊥ := by + exact _root_.differentIdeal_ne_bot + +omit [FiniteDimensional K L] in +/-- The fraction-field extension attached to a finite separable complete-DVF +extension is separable. This is kept private to prevent typeclass search from +trying the very general `FractionRing.liftAlgebra` instance globally. -/ +private theorem fractionRing_isSeparable_of_finite_separable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + [Module.IsTorsionFree base.valuationSubring target.valuationSubring] : + letI : FaithfulSMul base.valuationSubring target.valuationSubring := + Module.IsTorsionFree.to_faithfulSMul + letI : FaithfulSMul base.valuationSubring + (FractionRing target.valuationSubring) := inferInstance + letI : Algebra (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring) := FractionRing.liftAlgebra _ _ + Algebra.IsSeparable (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring) := by + let : FaithfulSMul base.valuationSubring target.valuationSubring := + Module.IsTorsionFree.to_faithfulSMul + let : FaithfulSMul base.valuationSubring + (FractionRing target.valuationSubring) := inferInstance + let fracAlgebra : Algebra (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring) := FractionRing.liftAlgebra _ _ + let : SMul (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring) := + @Algebra.toSMul _ _ _ _ fracAlgebra + let : IsScalarTower base.valuationSubring + (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring) := + FractionRing.isScalarTower_liftAlgebra _ _ + have H : RingHom.comp + (algebraMap (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring)) + (FractionRing.algEquiv base.valuationSubring K).symm.toRingEquiv = + RingHom.comp + (FractionRing.algEquiv target.valuationSubring L).symm.toRingEquiv + (algebraMap K L) := by + apply IsLocalization.ringHom_ext (nonZeroDivisors base.valuationSubring) + ext a + simp only [RingHom.coe_comp, RingHom.coe_coe, + AlgEquiv.coe_ringEquiv, Function.comp_apply, + AlgEquiv.commutes, ← IsScalarTower.algebraMap_apply] + rw [IsScalarTower.algebraMap_apply + base.valuationSubring target.valuationSubring L, + AlgEquiv.commutes, ← IsScalarTower.algebraMap_apply] + exact Algebra.IsSeparable.of_equiv_equiv _ _ H + +/-- The finite-separable different ideal is nonzero without separately +providing the module-finiteness, torsion-free, or fraction-field separability +certificates. -/ +theorem differentIdealOfFiniteSeparable_ne_bot + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + base target) ≠ ⊥ := by + unfold differentIdealOfFiniteSeparable + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_finite_separable base target + let : Module.Finite base.valuationSubring target.valuationSubring := + moduleFinite_target_valuationSubring_of_finite_separable base target + let : Module.IsTorsionFree base.valuationSubring target.valuationSubring := + moduleIsTorsionFree_target_valuationSubring_of_finite_separable base target + let : Algebra (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring) := FractionRing.liftAlgebra _ _ + let : Algebra.IsSeparable (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring) := + (fractionRing_isSeparable_of_finite_separable base target) + exact (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdeal_ne_bot base + target) + +/-- The local different/codifferent relation specialized to the valuation +rings. -/ +theorem coeSubmodule_differentIdeal_eq_one_div_codifferent + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + [IsIntegralClosure target.valuationSubring base.valuationSubring L] + [Module.IsTorsionFree base.valuationSubring target.valuationSubring] : + IsLocalization.coeSubmodule L + (differentIdeal base.valuationSubring target.valuationSubring) = + 1 / (RamificationTheory.DiscreteValuationField.ValuedExtension.codifferentSubmodule base + target) := by + change + IsLocalization.coeSubmodule L + (differentIdeal base.valuationSubring target.valuationSubring) = + 1 / Submodule.traceDual base.valuationSubring K + (1 : Submodule target.valuationSubring L) + exact _root_.coeSubmodule_differentIdeal + base.valuationSubring K target.valuationSubring + +/-- Discriminant control for the codifferent: if a `K`-basis of `L` is +integral over the base valuation ring, then multiplying an element of the +codifferent by the discriminant and an integral element gives an integral +element. -/ +theorem isIntegral_discriminant_mul_of_mem_codifferent + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + [IsIntegralClosure target.valuationSubring base.valuationSubring L] + {ι : Type*} [DecidableEq ι] [Fintype ι] + {b : Module.Basis ι K L} (hb : ∀ i, IsIntegral base.valuationSubring (b i)) + {a z : L} (ha : a ∈ (1 : Submodule target.valuationSubring L)) + (hz : z ∈ (RamificationTheory.DiscreteValuationField.ValuedExtension.codifferentSubmodule + base target)) : + IsIntegral base.valuationSubring + (Algebra.discr K b • a * z) := by + exact _root_.isIntegral_discr_mul_of_mem_traceDual + (A := base.valuationSubring) (K := K) + (B := target.valuationSubring) (I := (1 : Submodule target.valuationSubring L)) + hb ha hz + +/-- Finite-separable discriminant control for the codifferent. -/ +theorem isIntegral_discriminant_mul_of_mem_codifferent_of_finite_separable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + {ι : Type*} [DecidableEq ι] [Fintype ι] + {b : Module.Basis ι K L} (hb : ∀ i, IsIntegral base.valuationSubring (b i)) + {a z : L} (ha : a ∈ (1 : Submodule target.valuationSubring L)) + (hz : z ∈ (RamificationTheory.DiscreteValuationField.ValuedExtension.codifferentSubmodule + base target)) : + IsIntegral base.valuationSubring + (Algebra.discr K b • a * z) := by + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_finite_separable base target + exact + (isIntegral_discriminant_mul_of_mem_codifferent base target) hb ha hz + +/-- Finite-separable version of the different/unramified criterion, using +`differentIdealOfFiniteSeparable` to avoid separate torsion-free and +fraction-field separability certificates. -/ +theorem maximalIdeal_not_dvd_differentIdealOfFiniteSeparable_iff_isUnramifiedAt + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + ¬ target.maximalIdeal ∣ + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + base target) ↔ + Algebra.IsUnramifiedAt base.valuationSubring target.maximalIdeal := by + unfold differentIdealOfFiniteSeparable + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_finite_separable base target + let : Module.Finite base.valuationSubring target.valuationSubring := + moduleFinite_target_valuationSubring_of_finite_separable base target + let : Module.IsTorsionFree base.valuationSubring target.valuationSubring := + moduleIsTorsionFree_target_valuationSubring_of_finite_separable base target + let : Algebra (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring) := FractionRing.liftAlgebra _ _ + let : Algebra.IsSeparable (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring) := + (fractionRing_isSeparable_of_finite_separable base target) + exact _root_.not_dvd_differentIdeal_iff + +/-- Finite-separable version of the ramified/different divisibility criterion, +using `differentIdealOfFiniteSeparable`. -/ +theorem maximalIdeal_dvd_differentIdealOfFiniteSeparable_iff_not_isUnramifiedAt + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + target.maximalIdeal ∣ + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + base target) ↔ + ¬ Algebra.IsUnramifiedAt base.valuationSubring target.maximalIdeal := by + unfold differentIdealOfFiniteSeparable + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_finite_separable base target + let : Module.Finite base.valuationSubring target.valuationSubring := + moduleFinite_target_valuationSubring_of_finite_separable base target + let : Module.IsTorsionFree base.valuationSubring target.valuationSubring := + moduleIsTorsionFree_target_valuationSubring_of_finite_separable base target + let : Algebra (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring) := FractionRing.liftAlgebra _ _ + let : Algebra.IsSeparable (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring) := + (fractionRing_isSeparable_of_finite_separable base target) + exact _root_.dvd_differentIdeal_iff + +omit [FiniteDimensional K L] in +/-- In a local valuation-ring extension, the different is a unit exactly when +the extension is unramified at the target maximal ideal. -/ +theorem isUnit_differentIdeal_iff_isUnramifiedAt + [Module.IsTorsionFree base.valuationSubring target.valuationSubring] + [Module.Finite base.valuationSubring target.valuationSubring] + [Algebra.IsSeparable + (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring)] : + IsUnit (differentIdeal base.valuationSubring target.valuationSubring) ↔ + Algebra.IsUnramifiedAt base.valuationSubring target.maximalIdeal := by + constructor + · intro hunit + have htop : + differentIdeal base.valuationSubring target.valuationSubring = ⊤ := + Ideal.isUnit_iff.mp hunit + have hnot : + ¬ target.maximalIdeal ∣ + differentIdeal base.valuationSubring target.valuationSubring := by + intro hdvd + have hle : + differentIdeal base.valuationSubring target.valuationSubring ≤ + target.maximalIdeal := + Ideal.dvd_iff_le.mp hdvd + rw [htop] at hle + have hproper : target.maximalIdeal ≠ ⊤ := + (IsLocalRing.maximalIdeal.isMaximal target.valuationSubring).ne_top + exact hproper (eq_top_iff.mpr hle) + exact (_root_.not_dvd_differentIdeal_iff).1 hnot + · intro hunram + have hnot : + ¬ target.maximalIdeal ∣ + differentIdeal base.valuationSubring target.valuationSubring := + (_root_.not_dvd_differentIdeal_iff).2 hunram + rw [Ideal.isUnit_iff] + by_contra hne + have hle : + differentIdeal base.valuationSubring target.valuationSubring ≤ + target.maximalIdeal := + IsLocalRing.le_maximalIdeal hne + exact hnot (Ideal.dvd_iff_le.mpr hle) + +/-- Finite-separable version of the local unit criterion for the different. -/ +theorem isUnit_differentIdealOfFiniteSeparable_iff_isUnramifiedAt + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + IsUnit + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + base target) ↔ + Algebra.IsUnramifiedAt base.valuationSubring target.maximalIdeal := by + unfold differentIdealOfFiniteSeparable + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_finite_separable base target + let : Module.Finite base.valuationSubring target.valuationSubring := + moduleFinite_target_valuationSubring_of_finite_separable base target + let : Module.IsTorsionFree base.valuationSubring target.valuationSubring := + moduleIsTorsionFree_target_valuationSubring_of_finite_separable base target + let : Algebra (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring) := FractionRing.liftAlgebra _ _ + let : Algebra.IsSeparable (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring) := + (fractionRing_isSeparable_of_finite_separable base target) + exact + (isUnit_differentIdeal_iff_isUnramifiedAt base target) + +omit [FiniteDimensional K L] in +/-- States the theorem `differentIdeal_eq_top_iff_isUnramifiedAt`. -/ +theorem differentIdeal_eq_top_iff_isUnramifiedAt + [Module.IsTorsionFree base.valuationSubring target.valuationSubring] + [Module.Finite base.valuationSubring target.valuationSubring] + [Algebra.IsSeparable + (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring)] : + differentIdeal base.valuationSubring target.valuationSubring = ⊤ ↔ + Algebra.IsUnramifiedAt base.valuationSubring target.maximalIdeal := by + rw [← Ideal.isUnit_iff] + exact + (isUnit_differentIdeal_iff_isUnramifiedAt base target) + +/-- Finite-separable version of the top/different criterion for +unramifiedness. -/ +theorem differentIdealOfFiniteSeparable_eq_top_iff_isUnramifiedAt + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + base target) = ⊤ ↔ + Algebra.IsUnramifiedAt base.valuationSubring target.maximalIdeal := by + unfold differentIdealOfFiniteSeparable + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_finite_separable base target + let : Module.Finite base.valuationSubring target.valuationSubring := + moduleFinite_target_valuationSubring_of_finite_separable base target + let : Module.IsTorsionFree base.valuationSubring target.valuationSubring := + moduleIsTorsionFree_target_valuationSubring_of_finite_separable base target + let : Algebra (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring) := FractionRing.liftAlgebra _ _ + let : Algebra.IsSeparable (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring) := + (fractionRing_isSeparable_of_finite_separable base target) + exact + (differentIdeal_eq_top_iff_isUnramifiedAt base target) + +/-- The monogenic different formula: conductor times different is generated by +the derivative of the minimal polynomial. This is the Dedekind-domain formula +used in Eisenstein computations. -/ +theorem conductor_mul_differentIdeal_eq_span_derivative + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + [IsIntegralClosure target.valuationSubring base.valuationSubring L] + [Module.IsTorsionFree base.valuationSubring target.valuationSubring] + (z : target.valuationSubring) + (hz : Algebra.adjoin K {(algebraMap target.valuationSubring L) z} = ⊤) : + conductor base.valuationSubring z * + differentIdeal base.valuationSubring target.valuationSubring = + Ideal.span + {Polynomial.aeval z + (Polynomial.derivative (minpoly base.valuationSubring z))} := by + exact _root_.conductor_mul_differentIdeal + base.valuationSubring K L z hz + +/-- In a monogenic finite separable extension, the derivative of the minimal +polynomial belongs to the different. -/ +theorem aeval_derivative_mem_differentIdeal + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + [IsIntegralClosure target.valuationSubring base.valuationSubring L] + [Module.IsTorsionFree base.valuationSubring target.valuationSubring] + (z : target.valuationSubring) + (hz : Algebra.adjoin K {(algebraMap target.valuationSubring L) z} = ⊤) : + Polynomial.aeval z + (Polynomial.derivative (minpoly base.valuationSubring z)) ∈ + differentIdeal base.valuationSubring target.valuationSubring := by + exact _root_.aeval_derivative_mem_differentIdeal + base.valuationSubring K L z hz + +/-- Monogenic different formula in finite separable complete-DVF extensions, +using the finite-separable different ideal. -/ +theorem conductor_mul_differentIdealOfFiniteSeparable_eq_span_derivative + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + (z : target.valuationSubring) + (hz : Algebra.adjoin K {(algebraMap target.valuationSubring L) z} = ⊤) : + conductor base.valuationSubring z * + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + base target) = + Ideal.span + {Polynomial.aeval z + (Polynomial.derivative (minpoly base.valuationSubring z))} := by + unfold differentIdealOfFiniteSeparable + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_finite_separable base target + let : Module.IsTorsionFree base.valuationSubring target.valuationSubring := + moduleIsTorsionFree_target_valuationSubring_of_finite_separable + (K := K) (L := L) (base := base) (target := target) + exact + (conductor_mul_differentIdeal_eq_span_derivative base target) z hz + +/-- In a monogenic finite separable complete-DVF extension, the derivative of +the minimal polynomial belongs to the finite-separable different ideal. -/ +theorem aeval_derivative_mem_differentIdealOfFiniteSeparable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + (z : target.valuationSubring) + (hz : Algebra.adjoin K {(algebraMap target.valuationSubring L) z} = ⊤) : + Polynomial.aeval z + (Polynomial.derivative (minpoly base.valuationSubring z)) ∈ + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + base target) := by + unfold differentIdealOfFiniteSeparable + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_finite_separable base target + let : Module.IsTorsionFree base.valuationSubring target.valuationSubring := + moduleIsTorsionFree_target_valuationSubring_of_finite_separable + (K := K) (L := L) (base := base) (target := target) + exact + (aeval_derivative_mem_differentIdeal base target) z hz + +/-- A monogenic finite separable complete-DVF extension is unramified when +an integral equation for its generator has unit derivative. The equation +need not be the minimal polynomial: integrally closed divisibility transfers +the unit condition to the derivative of the minimal polynomial, which then +generates the different. -/ +theorem isUnramifiedAt_of_aeval_derivative_isUnit + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + (z : target.valuationSubring) + (hz : Algebra.adjoin K {(algebraMap target.valuationSubring L) z} = ⊤) + (P : Polynomial base.valuationSubring) + (hP : Polynomial.aeval z P = 0) + (hPderiv : + IsUnit (Polynomial.aeval z (Polynomial.derivative P))) : + Algebra.IsUnramifiedAt base.valuationSubring target.maximalIdeal := by + let : IsIntegralClosure target.valuationSubring + base.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_finite_separable + base target + let : Module.IsTorsionFree base.valuationSubring + target.valuationSubring := + moduleIsTorsionFree_target_valuationSubring_of_finite_separable + (K := K) (L := L) (base := base) (target := target) + obtain ⟨Q, hQ⟩ := + minpoly.isIntegrallyClosed_dvd + (IsIntegralClosure.isIntegral base.valuationSubring L z) hP + have hderiv : + Polynomial.aeval z (Polynomial.derivative P) = + Polynomial.aeval z + (Polynomial.derivative + (minpoly base.valuationSubring z)) * + Polynomial.aeval z Q := by + rw [hQ, Polynomial.derivative_mul] + simp + have hminpolyDeriv : + IsUnit + (Polynomial.aeval z + (Polynomial.derivative + (minpoly base.valuationSubring z))) := by + apply isUnit_of_mul_isUnit_left + rw [← hderiv] + exact hPderiv + apply + (differentIdealOfFiniteSeparable_eq_top_iff_isUnramifiedAt + base target).1 + apply + (differentIdealOfFiniteSeparable base target).eq_top_of_isUnit_mem + (aeval_derivative_mem_differentIdealOfFiniteSeparable + base target z hz) + exact hminpolyDeriv + +omit [FiniteDimensional K L] in +/-- Dedekind's different lower bound: if the image of the base maximal ideal is +divisible by `P^e`, then `P^(e-1)` divides the different. For Eisenstein +extensions this is the standard source of the derivative/different exponent +bound. -/ +theorem maximalIdeal_pow_sub_one_dvd_differentIdeal + [Module.IsTorsionFree base.valuationSubring target.valuationSubring] + [Module.Finite base.valuationSubring target.valuationSubring] + [Algebra.IsSeparable + (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring)] + (e : ℕ) + (hpow : + target.maximalIdeal ^ e ∣ + Ideal.map (algebraMap base.valuationSubring target.valuationSubring) + base.maximalIdeal) : + target.maximalIdeal ^ (e - 1) ∣ + differentIdeal base.valuationSubring target.valuationSubring := by + exact _root_.pow_sub_one_dvd_differentIdeal + (A := base.valuationSubring) (B := target.valuationSubring) + (P := target.maximalIdeal) (e := e) base.maximalIdeal_ne_bot hpow + +/-- Finite-separable different lower bound, using +`differentIdealOfFiniteSeparable`. -/ +theorem maximalIdeal_pow_sub_one_dvd_differentIdealOfFiniteSeparable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + (e : ℕ) + (hpow : + target.maximalIdeal ^ e ∣ + Ideal.map (algebraMap base.valuationSubring target.valuationSubring) + base.maximalIdeal) : + target.maximalIdeal ^ (e - 1) ∣ + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + base target) := by + unfold differentIdealOfFiniteSeparable + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_finite_separable base target + let : Module.Finite base.valuationSubring target.valuationSubring := + moduleFinite_target_valuationSubring_of_finite_separable base target + let : Module.IsTorsionFree base.valuationSubring target.valuationSubring := + moduleIsTorsionFree_target_valuationSubring_of_finite_separable base target + let : Algebra (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring) := FractionRing.liftAlgebra _ _ + let : Algebra.IsSeparable (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring) := + (fractionRing_isSeparable_of_finite_separable base target) + exact + (maximalIdeal_pow_sub_one_dvd_differentIdeal base target) e hpow + +/-- Finite-separable different lower bound at the canonical +ramification index: `P^(e - 1)` divides the finite-separable different. This +uses mathlib's defining containment for `Ideal.ramificationIdx`, so callers do +not have to supply the divisibility hypothesis separately. -/ +theorem maximalIdeal_pow_ramificationIndex_sub_one_dvd_differentIdealOfFiniteSeparable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + target.maximalIdeal ^ (ramificationIndex base.toDVF target.toDVF - 1) ∣ + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + base target) := by + refine + (maximalIdeal_pow_sub_one_dvd_differentIdealOfFiniteSeparable base target) + (ramificationIndex base.toDVF target.toDVF) ?_ + rw [ramificationIndex] + exact Ideal.dvd_iff_le.mpr + (Ideal.le_pow_ramificationIdx' + (p := base.maximalIdeal) (P := target.maximalIdeal)) + +/-- If the canonical ramification index is nontrivial, the target +maximal ideal divides the finite-separable different. -/ +theorem maximalIdeal_dvd_differentIdealOfFiniteSeparable_of_one_lt_ramificationIndex + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + (he : 1 < ramificationIndex base.toDVF target.toDVF) : + target.maximalIdeal ∣ + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + base target) := by + have hlower : + target.maximalIdeal ^ (ramificationIndex base.toDVF target.toDVF - 1) ∣ + (differentIdealOfFiniteSeparable base target) := + (maximalIdeal_pow_ramificationIndex_sub_one_dvd_differentIdealOfFiniteSeparable base target) + have hpos : 0 < ramificationIndex base.toDVF target.toDVF - 1 := Nat.sub_pos_of_lt he + rcases Nat.exists_eq_succ_of_ne_zero (Nat.ne_of_gt hpos) with ⟨n, hn⟩ + have hdivPow : + target.maximalIdeal ∣ + target.maximalIdeal ^ (ramificationIndex base.toDVF target.toDVF - 1) := by + rw [hn, pow_succ] + exact dvd_mul_left target.maximalIdeal (target.maximalIdeal ^ n) + exact dvd_trans hdivPow hlower + +/-- A finite separable extension with nontrivial ramification index is +ramified at the target maximal ideal. -/ +theorem not_isUnramifiedAt_of_one_lt_ramificationIndex_of_finite_separable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + (he : 1 < ramificationIndex base.toDVF target.toDVF) : + ¬ Algebra.IsUnramifiedAt base.valuationSubring target.maximalIdeal := by + exact + ((maximalIdeal_dvd_differentIdealOfFiniteSeparable_iff_not_isUnramifiedAt base target)).1 + ((maximalIdeal_dvd_differentIdealOfFiniteSeparable_of_one_lt_ramificationIndex + base target) he) + +section Tower + +variable {M : Type*} [Field M] +variable [Algebra K M] [Algebra M L] +variable [FiniteDimensional K M] [FiniteDimensional M L] +variable {middle : CompleteDVF M} +variable [base.valuation.HasExtension middle.valuation] +variable [middle.valuation.HasExtension target.valuation] + +omit [FiniteDimensional K L] [FiniteDimensional K M] + [FiniteDimensional M L] in +/-- Transitivity of the different ideal in a tower of valuation-ring +extensions. -/ +theorem differentIdeal_tower + [IsScalarTower base.valuationSubring middle.valuationSubring target.valuationSubring] + [Module.Finite base.valuationSubring middle.valuationSubring] + [Module.Finite base.valuationSubring target.valuationSubring] + [Module.Finite middle.valuationSubring target.valuationSubring] + [Module.IsTorsionFree base.valuationSubring middle.valuationSubring] + [Module.IsTorsionFree base.valuationSubring target.valuationSubring] + [Module.IsTorsionFree middle.valuationSubring target.valuationSubring] + [Algebra.IsSeparable + (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring)] : + differentIdeal base.valuationSubring target.valuationSubring = + differentIdeal middle.valuationSubring target.valuationSubring * + Ideal.map (algebraMap middle.valuationSubring target.valuationSubring) + (differentIdeal base.valuationSubring middle.valuationSubring) := by + exact _root_.differentIdeal_eq_differentIdeal_mul_differentIdeal + base.valuationSubring middle.valuationSubring target.valuationSubring + +/-- Finite-separable tower formula for the different, using the +finite-separable different ideals on all three steps. -/ +theorem differentIdealOfFiniteSeparable_tower + [Algebra.IsSeparable K M] [Algebra.IsSeparable M L] + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring middle.valuationSubring target.valuationSubring] + [IsScalarTower base.valuationSubring middle.valuationSubring M] + [IsScalarTower middle.valuationSubring target.valuationSubring L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + base target) = + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + middle target) * + Ideal.map (algebraMap middle.valuationSubring target.valuationSubring) + (differentIdealOfFiniteSeparable base middle) := by + unfold differentIdealOfFiniteSeparable + let : IsIntegralClosure middle.valuationSubring base.valuationSubring M := + target_valuationSubring_isIntegralClosure_of_finite_separable base middle + let : IsIntegralClosure target.valuationSubring middle.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_finite_separable middle target + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_finite_separable base target + let : Module.Finite base.valuationSubring middle.valuationSubring := + moduleFinite_target_valuationSubring_of_finite_separable base middle + let : Module.Finite middle.valuationSubring target.valuationSubring := + moduleFinite_target_valuationSubring_of_finite_separable middle target + let : Module.Finite base.valuationSubring target.valuationSubring := + moduleFinite_target_valuationSubring_of_finite_separable base target + let : Module.IsTorsionFree base.valuationSubring middle.valuationSubring := + moduleIsTorsionFree_target_valuationSubring_of_finite_separable base middle + let : Module.IsTorsionFree middle.valuationSubring target.valuationSubring := + moduleIsTorsionFree_target_valuationSubring_of_finite_separable middle target + let : Module.IsTorsionFree base.valuationSubring target.valuationSubring := + moduleIsTorsionFree_target_valuationSubring_of_finite_separable base target + let : Algebra (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring) := FractionRing.liftAlgebra _ _ + let : Algebra.IsSeparable (FractionRing base.valuationSubring) + (FractionRing target.valuationSubring) := + (fractionRing_isSeparable_of_finite_separable base target) + exact differentIdeal_tower base target + +end Tower + +end ValuedExtension +end DiscreteValuationField +end RamificationTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Filtration.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Filtration.lean new file mode 100644 index 0000000000..78576f0a8c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Filtration.lean @@ -0,0 +1,128 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Group.Subgroup.Lattice +public import Mathlib.Algebra.Order.Floor.Ring +public import Mathlib.Algebra.Order.Archimedean.Real.Basic +/-! +# Natural-ceiling subgroup filtrations + +Generic order-theoretic infrastructure for extending a natural-number-indexed +subgroup filtration to the real line by the natural-number ceiling. +-/ + +@[expose] public section + +noncomputable +section + +namespace RamificationTheory + +section IntegerStepFiltration + +variable {G : Type*} [Group G] + +/-- Extend a subgroup filtration indexed by natural numbers to the real line +by taking the natural-number ceiling. This is the ceiling-indexed step +filtration relevant to the principal-unit filtration. -/ +def natCeilStepFiltration + (F : ℕ → Subgroup G) (t : ℝ) : Subgroup G := + F ⌈t⌉₊ + +/-- The right-limit subgroup of a natural-ceiling step filtration. -/ +def natCeilStepFiltrationAfter + (F : ℕ → Subgroup G) (t : ℝ) : Subgroup G := + ⨆ s : {s : ℝ // t < s}, natCeilStepFiltration F s + +/-- A jump of a natural-ceiling step filtration is a strict drop from the +group at the index to its right-limit subgroup. -/ +def IsNatCeilStepFiltrationJump + (F : ℕ → Subgroup G) (t : ℝ) : Prop := + natCeilStepFiltration F t ≠ natCeilStepFiltrationAfter F t + +/-- An antitone natural-number filtration remains antitone after extension by +the natural-number ceiling. -/ +theorem natCeilStepFiltration_antitone + {F : ℕ → Subgroup G} (hF : Antitone F) : + Antitone (natCeilStepFiltration F) := by + intro s t hst + exact hF (Nat.ceil_mono hst) + +/-- The right-limit subgroup of an antitone natural-ceiling filtration lies +in the group at the limiting index. -/ +theorem natCeilStepFiltrationAfter_le + {F : ℕ → Subgroup G} (hF : Antitone F) (t : ℝ) : + natCeilStepFiltrationAfter F t ≤ natCeilStepFiltration F t := by + apply iSup_le + intro s + exact natCeilStepFiltration_antitone hF (le_of_lt s.property) + +/-- At a natural-number index, the right-limit of a ceiling-indexed +antitone filtration is exactly the next group. -/ +theorem natCeilStepFiltrationAfter_natCast + {F : ℕ → Subgroup G} (hF : Antitone F) (n : ℕ) : + natCeilStepFiltrationAfter F (n : ℝ) = F (n + 1) := by + apply le_antisymm + · apply iSup_le + intro s + exact hF (Nat.add_one_le_ceil_iff.mpr s.property) + · let s : {s : ℝ // (n : ℝ) < s} := + ⟨((n + 1 : ℕ) : ℝ), by exact_mod_cast Nat.lt_succ_self n⟩ + exact le_iSup_of_le s (by + simp only [natCeilStepFiltration] + have hs : (s : ℝ) = (n : ℝ) + 1 := by + simp [s] + have hnat : (n : ℝ) + 1 = ((n + 1 : ℕ) : ℝ) := by + norm_num + rw [hs, hnat, Nat.ceil_natCast]) + +/-- At a natural-number index, being a jump is equivalent to a strict change +between two consecutive groups. -/ +theorem isNatCeilStepFiltrationJump_natCast_iff + {F : ℕ → Subgroup G} (hF : Antitone F) (n : ℕ) : + IsNatCeilStepFiltrationJump F (n : ℝ) ↔ + F n ≠ F (n + 1) := by + simp [IsNatCeilStepFiltrationJump, natCeilStepFiltration, + natCeilStepFiltrationAfter_natCast hF n] + +/-- Every jump of an antitone natural-ceiling step filtration is a +nonnegative rational integer. -/ +theorem isNatCeilStepFiltrationJump_integer + {F : ℕ → Subgroup G} (hF : Antitone F) {t : ℝ} + (ht : IsNatCeilStepFiltrationJump F t) : + ∃ n : ℕ, t = n := by + let n : ℕ := ⌈t⌉₊ + by_cases htn : t = (n : ℝ) + · exact ⟨n, htn⟩ + · have ht_lt_n : t < (n : ℝ) := + lt_of_le_of_ne (Nat.le_ceil t) htn + let s : ℝ := (t + n) / 2 + have hts : t < s := by + dsimp [s] + linarith + have hs_lt_n : s < (n : ℝ) := by + dsimp [s] + linarith + have hceil : ⌈s⌉₊ = n := by + apply le_antisymm + · exact Nat.ceil_le.mpr hs_lt_n.le + · change ⌈t⌉₊ ≤ ⌈s⌉₊ + exact Nat.ceil_mono hts.le + have hstep : + natCeilStepFiltration F s = natCeilStepFiltration F t := by + simp [natCeilStepFiltration, n, hceil] + exfalso + apply ht + apply le_antisymm + · exact le_iSup_of_le (⟨s, hts⟩ : + {u : ℝ // t < u}) hstep.symm.le + · exact natCeilStepFiltrationAfter_le hF t + +end IntegerStepFiltration + +end RamificationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation.lean new file mode 100644 index 0000000000..84955c0a48 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.ClosedFixingSubgroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.CompositumRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.Ramification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.RamificationQuotients + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois.lean new file mode 100644 index 0000000000..d074a21bf0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.AbsoluteRamification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteExtensionCorrespondence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteLevelValuationRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.InfiniteGaloisCorrespondence + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/AbsoluteRamification.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/AbsoluteRamification.lean new file mode 100644 index 0000000000..41e86a0ba6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/AbsoluteRamification.lean @@ -0,0 +1,1010 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteLevelValuationRestriction + +/-! # Absolute Ramification -/ + +@[expose] public section + +open _root_.RamificationTheory.ValuationSubring renaming + mem_algEquiv_apply_iff_of_restrictIntermediateField_henselianUnique → + mem_algEquiv_apply_iff_of_restrictIntermediateField_henselianUnique + +open _root_.RamificationTheory.ValuationSubring renaming + mem_algEquiv_apply_iff_of_restrictIntermediateField_unique → + mem_algEquiv_apply_iff_of_restrictIntermediateField_unique + +open _root_.ValuationTheory.DiscreteValuationField.HenselianDVF renaming + HasUniqueValuationExtension → + HasUniqueValuationExtension + +open _root_.ValuationTheory.DiscreteValuationField.HenselianDVF renaming + valuationSubring_eq_of_hasUniqueValuationExtension → + valuationSubring_eq_of_hasUniqueValuationExtension + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + integralClosure_mem_valuationSubring_of_hasExtension → + integralClosure_mem_valuationSubring_of_hasExtension + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + valuationSubring_mem_integralClosure_of_isIntegral → + valuationSubring_mem_integralClosure_of_isIntegral + +namespace RamificationTheory + +open ValuationTheory + +/-! +# Absolute Galois ramification + +This file develops the decomposition and inertia subgroups of an absolute +Galois group after the finite-level valuation-restriction layer. +-/ + +noncomputable +section + +universe u v w z + +namespace Field +namespace absoluteGaloisGroup + +open scoped Topology Pointwise +open CategoryTheory + +section AbsoluteRamification + +variable (K : Type u) [Field K] + +/-- Absolute Galois automorphisms commute with natural powers in the algebraic +closure. -/ +theorem apply_pow + (σ : Field.absoluteGaloisGroup K) (z : AlgebraicClosure K) (n : ℕ) : + (show Gal(AlgebraicClosure K/K) from σ) (z ^ n) = + ((show Gal(AlgebraicClosure K/K) from σ) z) ^ n := by + exact map_pow (show Gal(AlgebraicClosure K/K) from σ) z n + +/-- Provides the instance `absoluteGaloisGroupMulSemiringActionAlgebraicClosure`. -/ +noncomputable instance absoluteGaloisGroupMulSemiringActionAlgebraicClosure : + MulSemiringAction + (Field.absoluteGaloisGroup K) (AlgebraicClosure K) := by + change MulSemiringAction + (AlgebraicClosure K ≃ₐ[K] AlgebraicClosure K) (AlgebraicClosure K) + infer_instance + +/-- The absolute decomposition subgroup attached to a chosen valuation subring +of the algebraic closure. -/ +abbrev decompositionSubgroup + (A : ValuationSubring (AlgebraicClosure K)) : + Subgroup (Field.absoluteGaloisGroup K) := + A.decompositionSubgroup K + +/-- Provides the instance `decompositionSubgroupMulSemiringAction`. -/ +instance decompositionSubgroupMulSemiringAction + (A : ValuationSubring (AlgebraicClosure K)) : + MulSemiringAction (decompositionSubgroup K A) A := by + change MulSemiringAction (A.decompositionSubgroup K) A + infer_instance + +/-- The absolute decomposition subgroup is the stabilizer of the chosen +valuation subring. -/ +theorem decompositionSubgroup_eq_stabilizer + (A : ValuationSubring (AlgebraicClosure K)) : + decompositionSubgroup K A = + MulAction.stabilizer (Field.absoluteGaloisGroup K) A := + rfl + +/-- Membership in the absolute decomposition subgroup is stabilization of the +chosen valuation subring. -/ +@[simp] theorem mem_decompositionSubgroup_iff + (A : ValuationSubring (AlgebraicClosure K)) + (σ : Field.absoluteGaloisGroup K) : + σ ∈ decompositionSubgroup K A ↔ σ • A = A := by + rw [decompositionSubgroup_eq_stabilizer, MulAction.mem_stabilizer_iff] + +/-- Absolute decomposition is all of `G_K` exactly when every absolute +automorphism stabilizes the chosen valuation subring. -/ +theorem decompositionSubgroup_eq_top_iff_forall_smul_eq + (A : ValuationSubring (AlgebraicClosure K)) : + decompositionSubgroup K A = ⊤ ↔ + ∀ σ : Field.absoluteGaloisGroup K, σ • A = A := by + constructor + · intro hA σ + rw [← mem_decompositionSubgroup_iff (K := K) A σ] + rw [hA] + exact Subgroup.mem_top σ + · intro hA + ext σ + rw [mem_decompositionSubgroup_iff] + simp [hA σ] + +/-- Route-P core for the absolute decomposition group: if every finite +separable intermediate restriction of the ambient valuation subring is the +unique extension of the base valuation, then the absolute decomposition group +is all of `G_K`. + +The proof reduces an arbitrary algebraic element to a positive power in a +finite separable intermediate field, uses finite-level uniqueness there, and +returns to the original element by valuation-subring power membership. -/ +theorem decompositionSubgroup_eq_top_of_finite_separable_restrictUnique + {Γ : Type w} [LinearOrderedCommGroupWithZero Γ] + (v : Valuation K Γ) (A : ValuationSubring (AlgebraicClosure K)) + [_root_.Valuation.HasExtension v A.valuation] + (huniq : + ∀ (E : IntermediateField K (AlgebraicClosure K)) + [FiniteDimensional K E] [Algebra.IsSeparable K E], + ∀ (B : ValuationSubring E) + [_root_.Valuation.HasExtension v B.valuation], + (RamificationTheory.ValuationSubring.restrictIntermediateField A E) = B) : + decompositionSubgroup K A = ⊤ := by + have hpres + (σ : Field.absoluteGaloisGroup K) (z : AlgebraicClosure K) : + z ∈ A ↔ (show Gal(AlgebraicClosure K/K) from σ) z ∈ A := by + obtain ⟨n, E, hn, hFin, hSep, hzpowE⟩ := + RamificationTheory.exists_finite_separable_intermediate_pow_mem (K := K) z + let : FiniteDimensional K E := hFin + let : Algebra.IsSeparable K E := hSep + let x : E := ⟨z ^ n, hzpowE⟩ + have hlevel : + ((x : AlgebraicClosure K) ∈ A) ↔ + (show Gal(AlgebraicClosure K/K) from σ) + (x : AlgebraicClosure K) ∈ A := by + exact + mem_algEquiv_apply_iff_of_restrictIntermediateField_unique + (v := v) (A := A) (E := E) (huniq E) + (show Gal(AlgebraicClosure K/K) from σ) x + have hpow : + z ^ n ∈ A ↔ + (show Gal(AlgebraicClosure K/K) from σ) (z ^ n) ∈ A := by + simpa [x] using hlevel + have hpowmap : + z ^ n ∈ A ↔ + ((show Gal(AlgebraicClosure K/K) from σ) z) ^ n ∈ A := by + simpa [apply_pow (K := K) σ z n] using hpow + exact (RamificationTheory.ValuationSubring.mem_iff_pow_mem A z hn).trans + (hpowmap.trans + (RamificationTheory.ValuationSubring.mem_iff_pow_mem A + ((show Gal(AlgebraicClosure K/K) from σ) z) hn).symm) + rw [decompositionSubgroup_eq_top_iff_forall_smul_eq] + intro σ + ext z + rw [ValuationSubring.mem_pointwise_smul_iff_inv_smul_mem] + change (show Gal(AlgebraicClosure K/K) from σ⁻¹) z ∈ A ↔ z ∈ A + exact (hpres σ⁻¹ z).symm + +/-- Target-free finite-level membership preservation on a finite separable +intermediate field, assuming the restricted valuation subring is the unique +extension of the base valuation on that level. -/ +theorem valuationSubring_mem_preserved_on_finite_separable_intermediate_of_restrictUnique + (F : ValuationTheory.DiscreteValuationField.HenselianDVF.{u, v} K) + (A : ValuationSubring (AlgebraicClosure K)) + [_root_.Valuation.HasExtension F.valuation A.valuation] + (E : IntermediateField K (AlgebraicClosure K)) + [FiniteDimensional K E] [Algebra.IsSeparable K E] + (huniq : + ∀ (B : ValuationSubring E) + [_root_.Valuation.HasExtension F.valuation B.valuation], + (RamificationTheory.ValuationSubring.restrictIntermediateField A E) = B) + (σ : Field.absoluteGaloisGroup K) (x : E) : + ((x : AlgebraicClosure K) ∈ A) ↔ + (show Gal(AlgebraicClosure K/K) from σ) (x : AlgebraicClosure K) ∈ A := + mem_algEquiv_apply_iff_of_restrictIntermediateField_unique + (v := F.valuation) (A := A) (E := E) huniq + (show Gal(AlgebraicClosure K/K) from σ) x + +/-- Target-free finite-level membership preservation from the integral +valuation-ring frontier on that finite separable level. -/ +theorem valuationSubring_mem_preserved_on_finite_separable_intermediate_of_integral + (F : ValuationTheory.DiscreteValuationField.HenselianDVF.{u, v} K) + (A : ValuationSubring (AlgebraicClosure K)) + [_root_.Valuation.HasExtension F.valuation A.valuation] + (E : IntermediateField K (AlgebraicClosure K)) + [FiniteDimensional K E] [Algebra.IsSeparable K E] + (hintegral : + ∀ (B : ValuationSubring E) + [_root_.Valuation.HasExtension F.valuation B.valuation], + Algebra.IsIntegral F.valuation.valuationSubring + B.valuation.valuationSubring) + (σ : Field.absoluteGaloisGroup K) (x : E) : + ((x : AlgebraicClosure K) ∈ A) ↔ + (show Gal(AlgebraicClosure K/K) from σ) (x : AlgebraicClosure K) ∈ A := by + exact + valuationSubring_mem_preserved_on_finite_separable_intermediate_of_restrictUnique + (K := K) (F := F) (A := A) (E := E) + (huniq := by + intro B _ + have hAExt : _root_.Valuation.HasExtension F.valuation + ((RamificationTheory.ValuationSubring.restrictIntermediateField A E)).valuation := + RamificationTheory.ValuationSubring.restrictIntermediateField_hasExtension + (v := F.valuation) (A := A) E + have hAInt : Algebra.IsIntegral F.valuation.valuationSubring + ((RamificationTheory.ValuationSubring.restrictIntermediateField A + E)).valuation.valuationSubring := + hintegral ((RamificationTheory.ValuationSubring.restrictIntermediateField A E)) + have hBInt : Algebra.IsIntegral F.valuation.valuationSubring + B.valuation.valuationSubring := + hintegral B + have hsub : + ((RamificationTheory.ValuationSubring.restrictIntermediateField A + E)).valuation.valuationSubring = + B.valuation.valuationSubring := by + ext z + constructor + · intro hz + have hz_int : z ∈ integralClosure F.valuation.valuationSubring E := + valuationSubring_mem_integralClosure_of_isIntegral + (L := E) F.valuation + ((RamificationTheory.ValuationSubring.restrictIntermediateField A + E)).valuation ⟨z, hz⟩ + exact + integralClosure_mem_valuationSubring_of_hasExtension + (L := E) F.valuation B.valuation ⟨z, hz_int⟩ + · intro hz + have hz_int : z ∈ integralClosure F.valuation.valuationSubring E := + valuationSubring_mem_integralClosure_of_isIntegral + (L := E) F.valuation B.valuation ⟨z, hz⟩ + exact + integralClosure_mem_valuationSubring_of_hasExtension + (L := E) F.valuation + ((RamificationTheory.ValuationSubring.restrictIntermediateField A + E)).valuation ⟨z, hz_int⟩ + calc + RamificationTheory.ValuationSubring.restrictIntermediateField A E = + (RamificationTheory.ValuationSubring.restrictIntermediateField A + E).valuation.valuationSubring := + (ValuationSubring.valuationSubring_valuation _).symm + _ = B.valuation.valuationSubring := hsub + _ = B := ValuationSubring.valuationSubring_valuation B) + (σ := σ) (x := x) + +/-- Module-finite variant of finite-level membership preservation. -/ +theorem valuationSubring_mem_preserved_on_finite_separable_intermediate_of_moduleFinite + (F : ValuationTheory.DiscreteValuationField.HenselianDVF.{u, v} K) + (A : ValuationSubring (AlgebraicClosure K)) + [_root_.Valuation.HasExtension F.valuation A.valuation] + (E : IntermediateField K (AlgebraicClosure K)) + [FiniteDimensional K E] [Algebra.IsSeparable K E] + (hfinite : + ∀ (B : ValuationSubring E) + [_root_.Valuation.HasExtension F.valuation B.valuation], + Module.Finite F.valuation.valuationSubring + B.valuation.valuationSubring) + (σ : Field.absoluteGaloisGroup K) (x : E) : + ((x : AlgebraicClosure K) ∈ A) ↔ + (show Gal(AlgebraicClosure K/K) from σ) (x : AlgebraicClosure K) ∈ A := + valuationSubring_mem_preserved_on_finite_separable_intermediate_of_integral + (K := K) (F := F) (A := A) (E := E) + (hintegral := by + intro B _ + let : Module.Finite F.valuation.valuationSubring + B.valuation.valuationSubring := + hfinite B + infer_instance) + (σ := σ) (x := x) + +/-- Finite-level membership preservation from a Henselian-DVF unique-extension +package on that level. -/ +theorem valuationSubring_mem_preserved_on_finite_separable_intermediate + (F : ValuationTheory.DiscreteValuationField.HenselianDVF.{u, v} K) + (A : ValuationSubring (AlgebraicClosure K)) + [_root_.Valuation.HasExtension F.valuation A.valuation] + (E : IntermediateField K (AlgebraicClosure K)) + [FiniteDimensional K E] [Algebra.IsSeparable K E] + (target : ValuationTheory.DiscreteValuationField.HenselianDVF.{u, w} E) + (hA : target.valuation.valuationSubring = + (RamificationTheory.ValuationSubring.restrictIntermediateField A E)) + (huniq : + HasUniqueValuationExtension.{u, v, u, + w, u} + F target) + (σ : Field.absoluteGaloisGroup K) (x : E) : + ((x : AlgebraicClosure K) ∈ A) ↔ + (show Gal(AlgebraicClosure K/K) from σ) (x : AlgebraicClosure K) ∈ A := + mem_algEquiv_apply_iff_of_restrictIntermediateField_henselianUnique + (base := F) (A := A) (E := E) (target := target) hA huniq + (show Gal(AlgebraicClosure K/K) from σ) x + +/-- Henselian-DVF specialization of the target-free Route-P core. -/ +theorem decompositionSubgroup_eq_top_of_henselianDVF_restrictUnique + (F : ValuationTheory.DiscreteValuationField.HenselianDVF.{u, v} K) + (A : ValuationSubring (AlgebraicClosure K)) + [_root_.Valuation.HasExtension F.valuation A.valuation] + (huniq : + ∀ (E : IntermediateField K (AlgebraicClosure K)) + [FiniteDimensional K E] [Algebra.IsSeparable K E], + ∀ (B : ValuationSubring E) + [_root_.Valuation.HasExtension F.valuation B.valuation], + (RamificationTheory.ValuationSubring.restrictIntermediateField A E) = B) : + decompositionSubgroup K A = ⊤ := + decompositionSubgroup_eq_top_of_finite_separable_restrictUnique + (K := K) (v := F.valuation) (A := A) (huniq := huniq) + +/-- Absolute decomposition is top once every finite separable intermediate +extension valuation ring is integral over the base valuation ring. + +This is the target-free form of the Henselian finite-level frontier: the +remaining local Henselian argument only has to prove the displayed integrality +predicate, without packaging the restricted valuation rings as `HenselianDVF`s. -/ +theorem decompositionSubgroup_eq_top_of_finite_separable_integral + (F : ValuationTheory.DiscreteValuationField.HenselianDVF.{u, v} K) + (A : ValuationSubring (AlgebraicClosure K)) + [_root_.Valuation.HasExtension F.valuation A.valuation] + (hintegral : + ∀ (E : IntermediateField K (AlgebraicClosure K)) + [FiniteDimensional K E] [Algebra.IsSeparable K E], + ∀ (B : ValuationSubring E) + [_root_.Valuation.HasExtension F.valuation B.valuation], + Algebra.IsIntegral F.valuation.valuationSubring + B.valuation.valuationSubring) : + decompositionSubgroup K A = ⊤ := by + apply decompositionSubgroup_eq_top_of_henselianDVF_restrictUnique + (F := F) (A := A) + intro E _ _ B _ + have hAExt : _root_.Valuation.HasExtension F.valuation + ((RamificationTheory.ValuationSubring.restrictIntermediateField A E)).valuation := + RamificationTheory.ValuationSubring.restrictIntermediateField_hasExtension + (v := F.valuation) (A := A) E + have hAInt : Algebra.IsIntegral F.valuation.valuationSubring + ((RamificationTheory.ValuationSubring.restrictIntermediateField A + E)).valuation.valuationSubring := + hintegral E ((RamificationTheory.ValuationSubring.restrictIntermediateField A E)) + have hBInt : Algebra.IsIntegral F.valuation.valuationSubring + B.valuation.valuationSubring := + hintegral E B + have hsub : + ((RamificationTheory.ValuationSubring.restrictIntermediateField A + E)).valuation.valuationSubring = + B.valuation.valuationSubring := by + ext z + constructor + · intro hz + have hz_int : z ∈ integralClosure F.valuation.valuationSubring E := + valuationSubring_mem_integralClosure_of_isIntegral + (L := E) F.valuation ((RamificationTheory.ValuationSubring.restrictIntermediateField A + E)).valuation ⟨z, hz⟩ + exact + integralClosure_mem_valuationSubring_of_hasExtension + (L := E) F.valuation B.valuation ⟨z, hz_int⟩ + · intro hz + have hz_int : z ∈ integralClosure F.valuation.valuationSubring E := + valuationSubring_mem_integralClosure_of_isIntegral + (L := E) F.valuation B.valuation ⟨z, hz⟩ + exact + integralClosure_mem_valuationSubring_of_hasExtension + (L := E) F.valuation ((RamificationTheory.ValuationSubring.restrictIntermediateField A + E)).valuation ⟨z, hz_int⟩ + calc + RamificationTheory.ValuationSubring.restrictIntermediateField A E = + (RamificationTheory.ValuationSubring.restrictIntermediateField A + E).valuation.valuationSubring := + (ValuationSubring.valuationSubring_valuation _).symm + _ = B.valuation.valuationSubring := hsub + _ = B := ValuationSubring.valuationSubring_valuation B + +/-- Absolute decomposition is top once every finite separable intermediate +extension valuation ring is finite over the base valuation ring. + +This is the module-finite variant of +`decompositionSubgroup_eq_top_of_finite_separable_integral`; it converts finite +algebra extensions to integral extensions before applying the integral route. -/ +theorem decompositionSubgroup_eq_top_of_finite_separable_moduleFinite + (F : ValuationTheory.DiscreteValuationField.HenselianDVF.{u, v} K) + (A : ValuationSubring (AlgebraicClosure K)) + [_root_.Valuation.HasExtension F.valuation A.valuation] + (hfinite : + ∀ (E : IntermediateField K (AlgebraicClosure K)) + [FiniteDimensional K E] [Algebra.IsSeparable K E], + ∀ (B : ValuationSubring E) + [_root_.Valuation.HasExtension F.valuation B.valuation], + Module.Finite F.valuation.valuationSubring + B.valuation.valuationSubring) : + decompositionSubgroup K A = ⊤ := + decompositionSubgroup_eq_top_of_finite_separable_integral + (K := K) F A + (by + intro E _ _ B _ + let : Module.Finite F.valuation.valuationSubring + B.valuation.valuationSubring := + hfinite E B + infer_instance) + +/-- Absolute decomposition is top once every finite separable intermediate +restriction is supplied as a Henselian-DVF finite-level unique extension. -/ +theorem decompositionSubgroup_eq_top_of_finite_separable_henselianUnique + (F : ValuationTheory.DiscreteValuationField.HenselianDVF.{u, v} K) + (A : ValuationSubring (AlgebraicClosure K)) + [_root_.Valuation.HasExtension F.valuation A.valuation] + (huniq : + ∀ (E : IntermediateField K (AlgebraicClosure K)) + [FiniteDimensional K E] [Algebra.IsSeparable K E], + ∃ target : ValuationTheory.DiscreteValuationField.HenselianDVF.{u, w} E, + target.valuation.valuationSubring = + (RamificationTheory.ValuationSubring.restrictIntermediateField A E) ∧ + HasUniqueValuationExtension.{u, v, u, w, u} + F target) : + decompositionSubgroup K A = ⊤ := by + apply decompositionSubgroup_eq_top_of_finite_separable_restrictUnique + (v := F.valuation) (A := A) + intro E _ _ B _ + rcases huniq E with ⟨target, hA, htargetUnique⟩ + have htarget : + target.valuation.valuationSubring = B := by + have hsub := + valuationSubring_eq_of_hasUniqueValuationExtension + F target htargetUnique B.valuation + simpa [ValuationSubring.valuationSubring_valuation] using hsub + exact hA.symm.trans htarget + +/-- Plan-facing name for the absolute Henselian-DVF power route. The finite +separable level Henselian-DVF targets and unique-extension proofs remain +explicit because constructing them is the remaining local finite-extension +frontier. -/ +theorem decompositionSubgroup_eq_top_of_henselianDVF_powerRoute + (F : ValuationTheory.DiscreteValuationField.HenselianDVF.{u, v} K) + (A : ValuationSubring (AlgebraicClosure K)) + [_root_.Valuation.HasExtension F.valuation A.valuation] + (huniq : + ∀ (E : IntermediateField K (AlgebraicClosure K)) + [FiniteDimensional K E] [Algebra.IsSeparable K E], + ∃ target : ValuationTheory.DiscreteValuationField.HenselianDVF.{u, w} E, + target.valuation.valuationSubring = + (RamificationTheory.ValuationSubring.restrictIntermediateField A E) ∧ + HasUniqueValuationExtension.{u, v, u, w, u} + F target) : + decompositionSubgroup K A = ⊤ := + decompositionSubgroup_eq_top_of_finite_separable_henselianUnique + (K := K) F A huniq + +/-- If every absolute automorphism stabilizes the chosen valuation subring, the +absolute decomposition group is all of `G_K`. -/ +theorem decompositionSubgroup_eq_top_of_forall_smul_eq + (A : ValuationSubring (AlgebraicClosure K)) + (hA : ∀ σ : Field.absoluteGaloisGroup K, σ • A = A) : + decompositionSubgroup K A = ⊤ := + (decompositionSubgroup_eq_top_iff_forall_smul_eq (K := K) A).2 hA + +/-- Moving the chosen valuation subring by an absolute Galois element conjugates +the corresponding absolute decomposition subgroup. -/ +theorem decompositionSubgroup_pointwise_smul + (A : ValuationSubring (AlgebraicClosure K)) + (σ : Field.absoluteGaloisGroup K) : + decompositionSubgroup K (σ • A) = + Subgroup.map (MulAut.conj σ).toMonoidHom + (decompositionSubgroup K A) := by + ext τ + change τ ∈ MulAction.stabilizer (Field.absoluteGaloisGroup K) (σ • A) ↔ + τ ∈ Subgroup.map (MulAut.conj σ).toMonoidHom + (MulAction.stabilizer (Field.absoluteGaloisGroup K) A) + rw [MulAction.mem_stabilizer_iff] + constructor + · intro hτ + refine ⟨σ⁻¹ * τ * σ, ?_, ?_⟩ + · change (σ⁻¹ * τ * σ) • A = A + calc + (σ⁻¹ * τ * σ) • A = σ⁻¹ • (τ • (σ • A)) := by + simp [smul_smul, mul_assoc] + _ = σ⁻¹ • (σ • A) := by rw [hτ] + _ = A := by simp [smul_smul] + · simp [MulAut.conj_apply, mul_assoc] + · rintro ⟨η, hη, rfl⟩ + change η • A = A at hη + calc + (MulAut.conj σ η) • (σ • A) = + σ • (η • (σ⁻¹ • (σ • A))) := by + simp [MulAut.conj_apply, smul_smul, mul_assoc] + _ = σ • (η • A) := by simp [smul_smul] + _ = σ • A := by rw [hη] + +/-- The absolute inertia subgroup attached to a chosen valuation subring of the +algebraic closure. -/ +noncomputable abbrev inertiaSubgroup + (A : ValuationSubring (AlgebraicClosure K)) : + Subgroup (decompositionSubgroup K A) := + A.inertiaSubgroup K + +/-- The absolute decomposition-group action on the residue field of the chosen +valuation subring. -/ +noncomputable def decompositionResidueAction + (A : ValuationSubring (AlgebraicClosure K)) : + decompositionSubgroup K A →* + (IsLocalRing.ResidueField A ≃+* IsLocalRing.ResidueField A) := + MulSemiringAction.toRingAut + (decompositionSubgroup K A) (IsLocalRing.ResidueField A) + +/-- Absolute inertia is the kernel of the decomposition action on the residue +field of the chosen valuation subring. -/ +theorem inertiaSubgroup_eq_ker + (A : ValuationSubring (AlgebraicClosure K)) : + inertiaSubgroup K A = + MonoidHom.ker (decompositionResidueAction K A) := + rfl + +/-- States the theorem `decompositionResidueAction_ker`. -/ +theorem decompositionResidueAction_ker + (A : ValuationSubring (AlgebraicClosure K)) : + MonoidHom.ker (decompositionResidueAction K A) = + inertiaSubgroup K A := + rfl + +/-- Provides the instance `inertiaSubgroup_normal`. -/ +instance inertiaSubgroup_normal + (A : ValuationSubring (AlgebraicClosure K)) : + (inertiaSubgroup K A).Normal := by + rw [inertiaSubgroup_eq_ker] + infer_instance + +/-- Membership in absolute inertia is triviality of the induced residue-field +automorphism. -/ +@[simp] theorem mem_inertiaSubgroup_iff + (A : ValuationSubring (AlgebraicClosure K)) + (σ : decompositionSubgroup K A) : + σ ∈ inertiaSubgroup K A ↔ + decompositionResidueAction K A σ = 1 := by + rw [inertiaSubgroup_eq_ker, MonoidHom.mem_ker] + +/-- Exactness at the absolute decomposition subgroup for +`I_A -> D_A -> Aut(k_A)`. -/ +theorem inertiaSubtype_mulExact_decompositionResidueAction + (A : ValuationSubring (AlgebraicClosure K)) : + Function.MulExact + (inertiaSubgroup K A).subtype + (decompositionResidueAction K A) := by + rw [MonoidHom.mulExact_iff, decompositionResidueAction_ker] + exact (Subgroup.range_subtype _).symm + +/-- Absolute inertia as a subgroup of the ambient absolute Galois group. -/ +noncomputable abbrev inertiaSubgroupInAbsolute + (A : ValuationSubring (AlgebraicClosure K)) : + Subgroup (Field.absoluteGaloisGroup K) := + Subgroup.map (decompositionSubgroup K A).subtype (inertiaSubgroup K A) + +/-- Ambient absolute inertia lies in absolute decomposition. -/ +theorem inertiaSubgroupInAbsolute_le_decompositionSubgroup + (A : ValuationSubring (AlgebraicClosure K)) : + inertiaSubgroupInAbsolute K A ≤ decompositionSubgroup K A := by + rintro σ ⟨τ, _hτ, rfl⟩ + exact τ.property + +/-- Ambient absolute inertia membership is decomposition membership plus +triviality of the induced residue-field automorphism. -/ +theorem mem_inertiaSubgroupInAbsolute_iff + (A : ValuationSubring (AlgebraicClosure K)) + (σ : Field.absoluteGaloisGroup K) : + σ ∈ inertiaSubgroupInAbsolute K A ↔ + ∃ hσ : σ ∈ decompositionSubgroup K A, + decompositionResidueAction K A ⟨σ, hσ⟩ = 1 := by + constructor + · rintro ⟨τ, hτ, rfl⟩ + exact ⟨τ.property, (mem_inertiaSubgroup_iff K A τ).1 hτ⟩ + · rintro ⟨hσ, hres⟩ + refine ⟨⟨σ, hσ⟩, ?_, rfl⟩ + exact (mem_inertiaSubgroup_iff K A ⟨σ, hσ⟩).2 hres + +/-- Ambient absolute inertia is the whole decomposition subgroup exactly when +the decomposition residue action is trivial. -/ +theorem inertiaSubgroupInAbsolute_eq_decompositionSubgroup_iff + (A : ValuationSubring (AlgebraicClosure K)) : + inertiaSubgroupInAbsolute K A = decompositionSubgroup K A ↔ + decompositionResidueAction K A = 1 := by + constructor + · intro hA + ext σ x + have hmem : (σ : Field.absoluteGaloisGroup K) ∈ + inertiaSubgroupInAbsolute K A := by + rw [hA] + exact σ.property + rcases (mem_inertiaSubgroupInAbsolute_iff K A σ).1 hmem with + ⟨hσ, hres⟩ + have hσeq : + (⟨(σ : Field.absoluteGaloisGroup K), hσ⟩ : + decompositionSubgroup K A) = σ := by + ext + rfl + have hresx := congrArg + (fun e : IsLocalRing.ResidueField A ≃+* IsLocalRing.ResidueField A => + e x) hres + simpa [hσeq] using hresx + · intro hA + ext σ + constructor + · intro hσ + exact (inertiaSubgroupInAbsolute_le_decompositionSubgroup (K := K) A) hσ + · intro hσ + rw [mem_inertiaSubgroupInAbsolute_iff] + exact ⟨hσ, by rw [hA]; rfl⟩ + +/-- Ambient absolute inertia is trivial exactly when the decomposition residue +action is injective. -/ +theorem inertiaSubgroupInAbsolute_eq_bot_iff_decompositionResidueAction_injective + (A : ValuationSubring (AlgebraicClosure K)) : + inertiaSubgroupInAbsolute K A = ⊥ ↔ + Function.Injective (decompositionResidueAction K A) := by + rw [← MonoidHom.ker_eq_bot_iff (decompositionResidueAction K A), + decompositionResidueAction_ker] + constructor + · intro hA + exact (Subgroup.map_eq_bot_iff_of_injective + (H := inertiaSubgroup K A) + (f := (decompositionSubgroup K A).subtype) + (by + intro x y hxy + exact Subtype.ext hxy)).1 + (by simpa [inertiaSubgroupInAbsolute] using hA) + · intro hA + exact (Subgroup.map_eq_bot_iff_of_injective + (H := inertiaSubgroup K A) + (f := (decompositionSubgroup K A).subtype) + (by + intro x y hxy + exact Subtype.ext hxy)).2 hA + +/-- Ambient absolute inertia is all of `G_K` exactly when decomposition is all +of `G_K` and the decomposition residue action is trivial. -/ +theorem inertiaSubgroupInAbsolute_eq_top_iff + (A : ValuationSubring (AlgebraicClosure K)) : + inertiaSubgroupInAbsolute K A = ⊤ ↔ + decompositionSubgroup K A = ⊤ ∧ decompositionResidueAction K A = 1 := by + constructor + · intro hA + have hD : decompositionSubgroup K A = ⊤ := by + rw [eq_top_iff] + intro σ _hσ + exact (inertiaSubgroupInAbsolute_le_decompositionSubgroup (K := K) A) (by + rw [hA] + exact Subgroup.mem_top σ) + refine ⟨hD, ?_⟩ + rw [← inertiaSubgroupInAbsolute_eq_decompositionSubgroup_iff (K := K) A] + rw [hA, hD] + · rintro ⟨hD, hres⟩ + rw [eq_top_iff] + intro σ _hσ + rw [mem_inertiaSubgroupInAbsolute_iff] + have hσ : σ ∈ decompositionSubgroup K A := by + rw [hD] + exact Subgroup.mem_top σ + exact ⟨hσ, by rw [hres]; rfl⟩ + +/-- If the absolute decomposition subgroup is all of `G_K`, every absolute +automorphism can be viewed as a decomposition element. -/ +def toDecompositionSubgroupOfEqTop + (A : ValuationSubring (AlgebraicClosure K)) + (hA : decompositionSubgroup K A = ⊤) : + Field.absoluteGaloisGroup K →* + decompositionSubgroup K A where + toFun σ := ⟨σ, by rw [hA]; exact Subgroup.mem_top σ⟩ + map_one' := by + ext + rfl + map_mul' _ _ := by + ext + rfl + +/-- States the theorem `toDecompositionSubgroupOfEqTop_coe`. -/ +@[simp] theorem toDecompositionSubgroupOfEqTop_coe + (A : ValuationSubring (AlgebraicClosure K)) + (hA : decompositionSubgroup K A = ⊤) + (σ : Field.absoluteGaloisGroup K) : + (toDecompositionSubgroupOfEqTop K A hA σ : + Field.absoluteGaloisGroup K) = σ := + rfl + +/-- When `D_A = G_K`, the decomposition residue action becomes an ambient +absolute Galois action on the residue field. -/ +noncomputable def absoluteResidueActionOfDecompositionSubgroupEqTop + (A : ValuationSubring (AlgebraicClosure K)) + (hA : decompositionSubgroup K A = ⊤) : + Field.absoluteGaloisGroup K →* + (IsLocalRing.ResidueField A ≃+* IsLocalRing.ResidueField A) := + (decompositionResidueAction K A).comp + (toDecompositionSubgroupOfEqTop K A hA) + +/-- States the theorem `absoluteResidueActionOfDecompositionSubgroupEqTop_apply`. -/ +@[simp] theorem absoluteResidueActionOfDecompositionSubgroupEqTop_apply + (A : ValuationSubring (AlgebraicClosure K)) + (hA : decompositionSubgroup K A = ⊤) + (σ : Field.absoluteGaloisGroup K) : + absoluteResidueActionOfDecompositionSubgroupEqTop K A hA σ = + decompositionResidueAction K A + (toDecompositionSubgroupOfEqTop K A hA σ) := + rfl + +/-- Under `D_A = G_K`, the ambient residue-action range is the decomposition +residue-action range. -/ +theorem absoluteResidueActionOfDecompositionSubgroupEqTop_range + (A : ValuationSubring (AlgebraicClosure K)) + (hA : decompositionSubgroup K A = ⊤) : + MonoidHom.range + (absoluteResidueActionOfDecompositionSubgroupEqTop K A hA) = + MonoidHom.range (decompositionResidueAction K A) := by + ext φ + constructor + · rintro ⟨σ, rfl⟩ + exact ⟨toDecompositionSubgroupOfEqTop K A hA σ, rfl⟩ + · rintro ⟨σ, rfl⟩ + refine ⟨(σ : Field.absoluteGaloisGroup K), ?_⟩ + have hσeq : + toDecompositionSubgroupOfEqTop K A hA + (σ : Field.absoluteGaloisGroup K) = σ := by + ext + rfl + simp [absoluteResidueActionOfDecompositionSubgroupEqTop, hσeq] + +/-- The ambient residue action attached to `D_A = G_K` has kernel equal to +ambient absolute inertia. -/ +theorem absoluteResidueActionOfDecompositionSubgroupEqTop_ker + (A : ValuationSubring (AlgebraicClosure K)) + (hA : decompositionSubgroup K A = ⊤) : + MonoidHom.ker + (absoluteResidueActionOfDecompositionSubgroupEqTop K A hA) = + inertiaSubgroupInAbsolute K A := by + ext σ + rw [MonoidHom.mem_ker, mem_inertiaSubgroupInAbsolute_iff] + constructor + · intro hσ + refine ⟨by rw [hA]; exact Subgroup.mem_top σ, ?_⟩ + simpa [absoluteResidueActionOfDecompositionSubgroupEqTop, + toDecompositionSubgroupOfEqTop] using hσ + · rintro ⟨hσD, hres⟩ + have hσeq : + (toDecompositionSubgroupOfEqTop K A hA σ : + decompositionSubgroup K A) = ⟨σ, hσD⟩ := by + ext + rfl + simpa [absoluteResidueActionOfDecompositionSubgroupEqTop, hσeq] using hres + +/-- Exactness at `G_K` for the ambient residue action under `D_A = G_K`. -/ +theorem inertiaSubgroupInAbsoluteSubtype_mulExact_absoluteResidueActionOfDecompositionSubgroupEqTop + (A : ValuationSubring (AlgebraicClosure K)) + (hA : decompositionSubgroup K A = ⊤) : + Function.MulExact + (inertiaSubgroupInAbsolute K A).subtype + (absoluteResidueActionOfDecompositionSubgroupEqTop K A hA) := by + rw [MonoidHom.mulExact_iff, + absoluteResidueActionOfDecompositionSubgroupEqTop_ker] + exact (Subgroup.range_subtype _).symm + +/-- Proof-dependent Henselian-DVF-facing absolute residue action. The +Henselian top theorem is kept as an explicit argument; once +`decompositionSubgroup_eq_top_of_henselianDVF` is available, this is the stable +name used downstream without changing the residue-action target. -/ +noncomputable def absoluteResidueActionOfHenselianDVF + (F : ValuationTheory.DiscreteValuationField.HenselianDVF.{u, v} K) + (A : ValuationSubring (AlgebraicClosure K)) + [_root_.Valuation.HasExtension F.valuation A.valuation] + (hA : decompositionSubgroup K A = ⊤) : + MonoidHom (Field.absoluteGaloisGroup K) + (RingEquiv (IsLocalRing.ResidueField A) (IsLocalRing.ResidueField A)) := + absoluteResidueActionOfDecompositionSubgroupEqTop K A hA + +/-- States the theorem `absoluteResidueActionOfHenselianDVF_apply`. -/ +@[simp] theorem absoluteResidueActionOfHenselianDVF_apply + (F : ValuationTheory.DiscreteValuationField.HenselianDVF.{u, v} K) + (A : ValuationSubring (AlgebraicClosure K)) + [_root_.Valuation.HasExtension F.valuation A.valuation] + (hA : decompositionSubgroup K A = ⊤) + (sigma : Field.absoluteGaloisGroup K) : + absoluteResidueActionOfHenselianDVF K F A hA sigma = + absoluteResidueActionOfDecompositionSubgroupEqTop K A hA sigma := + rfl + +/-- Kernel of the proof-dependent Henselian-DVF-facing absolute residue action. -/ +theorem absoluteResidueActionOfHenselianDVF_ker + (F : ValuationTheory.DiscreteValuationField.HenselianDVF.{u, v} K) + (A : ValuationSubring (AlgebraicClosure K)) + [_root_.Valuation.HasExtension F.valuation A.valuation] + (hA : decompositionSubgroup K A = ⊤) : + MonoidHom.ker (absoluteResidueActionOfHenselianDVF K F A hA) = + inertiaSubgroupInAbsolute K A := + absoluteResidueActionOfDecompositionSubgroupEqTop_ker K A hA + +/-- Exactness for the proof-dependent Henselian-DVF-facing absolute residue +action. -/ +theorem inertiaSubgroupInAbsoluteSubtype_mulExact_absoluteResidueActionOfHenselianDVF + (F : ValuationTheory.DiscreteValuationField.HenselianDVF.{u, v} K) + (A : ValuationSubring (AlgebraicClosure K)) + [_root_.Valuation.HasExtension F.valuation A.valuation] + (hA : decompositionSubgroup K A = ⊤) : + Function.MulExact + (inertiaSubgroupInAbsolute K A).subtype + (absoluteResidueActionOfHenselianDVF K F A hA) := by + rw [MonoidHom.mulExact_iff, + absoluteResidueActionOfHenselianDVF_ker] + exact (Subgroup.range_subtype _).symm + +/-- Kernel membership for the ambient residue action under `D_A = G_K`. -/ +theorem absoluteResidueActionOfDecompositionSubgroupEqTop_eq_one_iff_mem_inertia + (A : ValuationSubring (AlgebraicClosure K)) + (hA : decompositionSubgroup K A = ⊤) + (σ : Field.absoluteGaloisGroup K) : + absoluteResidueActionOfDecompositionSubgroupEqTop K A hA σ = 1 ↔ + σ ∈ inertiaSubgroupInAbsolute K A := by + rw [← MonoidHom.mem_ker, + absoluteResidueActionOfDecompositionSubgroupEqTop_ker] + +/-- Equality of ambient residue actions, in right-quotient form. -/ +theorem absoluteResidueActionOfDecompositionSubgroupEqTop_eq_iff_div_mem_inertia + (A : ValuationSubring (AlgebraicClosure K)) + (hA : decompositionSubgroup K A = ⊤) + (σ τ : Field.absoluteGaloisGroup K) : + absoluteResidueActionOfDecompositionSubgroupEqTop K A hA σ = + absoluteResidueActionOfDecompositionSubgroupEqTop K A hA τ ↔ + σ / τ ∈ inertiaSubgroupInAbsolute K A := by + rw [← absoluteResidueActionOfDecompositionSubgroupEqTop_ker + (K := K) A hA] + exact (MonoidHom.div_mem_ker_iff + (absoluteResidueActionOfDecompositionSubgroupEqTop K A hA)).symm + +/-- Under `D_A = G_K`, ambient absolute inertia is normal in `G_K`. -/ +theorem inertiaSubgroupInAbsolute_normal_of_decompositionSubgroup_eq_top + (A : ValuationSubring (AlgebraicClosure K)) + (hA : decompositionSubgroup K A = ⊤) : + (inertiaSubgroupInAbsolute K A).Normal := by + rw [← absoluteResidueActionOfDecompositionSubgroupEqTop_ker K A hA] + infer_instance + +/-- Equality of ambient residue actions, in left-quotient form. -/ +theorem absoluteResidueActionOfDecompositionSubgroupEqTop_eq_iff_inv_mul_mem_inertia + (A : ValuationSubring (AlgebraicClosure K)) + (hA : decompositionSubgroup K A = ⊤) + (σ τ : Field.absoluteGaloisGroup K) : + absoluteResidueActionOfDecompositionSubgroupEqTop K A hA σ = + absoluteResidueActionOfDecompositionSubgroupEqTop K A hA τ ↔ + τ⁻¹ * σ ∈ inertiaSubgroupInAbsolute K A := by + rw [absoluteResidueActionOfDecompositionSubgroupEqTop_eq_iff_div_mem_inertia + (K := K) A hA σ τ] + simpa [div_eq_mul_inv] using + ((inertiaSubgroupInAbsolute_normal_of_decompositionSubgroup_eq_top + (K := K) A hA).mem_comm_iff (a := σ) (b := τ⁻¹)) + +/-- The ambient residue action under `D_A = G_K` is injective exactly when +ambient inertia is trivial. -/ +theorem absoluteResidueActionOfDecompositionSubgroupEqTop_injective_iff_inertia_eq_bot + (A : ValuationSubring (AlgebraicClosure K)) + (hA : decompositionSubgroup K A = ⊤) : + Function.Injective + (absoluteResidueActionOfDecompositionSubgroupEqTop K A hA) ↔ + inertiaSubgroupInAbsolute K A = ⊥ := by + rw [← MonoidHom.ker_eq_bot_iff + (absoluteResidueActionOfDecompositionSubgroupEqTop K A hA), + absoluteResidueActionOfDecompositionSubgroupEqTop_ker] + +/-- Under `D_A = G_K`, quotienting the absolute Galois group by the kernel of +the ambient residue action gives the range of that action. The kernel is +identified with ambient inertia by +`absoluteResidueActionOfDecompositionSubgroupEqTop_ker`. -/ +noncomputable def absoluteQuotientKernelEquivResidueActionRangeOfDecompositionSubgroupEqTop + (A : ValuationSubring (AlgebraicClosure K)) + (hA : decompositionSubgroup K A = ⊤) : + Field.absoluteGaloisGroup K ⧸ + MonoidHom.ker + (absoluteResidueActionOfDecompositionSubgroupEqTop K A hA) ≃* + (absoluteResidueActionOfDecompositionSubgroupEqTop K A hA).range := + QuotientGroup.quotientKerEquivRange + (absoluteResidueActionOfDecompositionSubgroupEqTop K A hA) + +/-- States the theorem +`absoluteQuotientKernelEquivResidueActionRangeOfDecompositionSubgroupEqTop_mk`. -/ +theorem absoluteQuotientKernelEquivResidueActionRangeOfDecompositionSubgroupEqTop_mk + (A : ValuationSubring (AlgebraicClosure K)) + (hA : decompositionSubgroup K A = ⊤) + (σ : Field.absoluteGaloisGroup K) : + absoluteQuotientKernelEquivResidueActionRangeOfDecompositionSubgroupEqTop + K A hA + (QuotientGroup.mk' + (MonoidHom.ker + (absoluteResidueActionOfDecompositionSubgroupEqTop K A hA)) σ) = + (absoluteResidueActionOfDecompositionSubgroupEqTop K A hA).rangeRestrict + σ := + rfl + +/-- Under `D_A = G_K`, quotienting the absolute Galois group by ambient +inertia gives the range of the ambient residue action. -/ +noncomputable def absoluteQuotientInertiaEquivResidueActionRangeOfDecompositionSubgroupEqTop + (A : ValuationSubring (AlgebraicClosure K)) + (hA : decompositionSubgroup K A = ⊤) : + letI : (inertiaSubgroupInAbsolute K A).Normal := + inertiaSubgroupInAbsolute_normal_of_decompositionSubgroup_eq_top K A hA + Field.absoluteGaloisGroup K ⧸ inertiaSubgroupInAbsolute K A ≃* + (absoluteResidueActionOfDecompositionSubgroupEqTop K A hA).range := by + letI : (inertiaSubgroupInAbsolute K A).Normal := + inertiaSubgroupInAbsolute_normal_of_decompositionSubgroup_eq_top K A hA + exact (QuotientGroup.quotientMulEquivOfEq + (absoluteResidueActionOfDecompositionSubgroupEqTop_ker K A hA).symm).trans + (absoluteQuotientKernelEquivResidueActionRangeOfDecompositionSubgroupEqTop K A hA) + +/-- States the theorem +`absoluteQuotientInertiaEquivResidueActionRangeOfDecompositionSubgroupEqTop_mk`. -/ +theorem absoluteQuotientInertiaEquivResidueActionRangeOfDecompositionSubgroupEqTop_mk + (A : ValuationSubring (AlgebraicClosure K)) + (hA : decompositionSubgroup K A = ⊤) + (σ : Field.absoluteGaloisGroup K) : + letI : (inertiaSubgroupInAbsolute K A).Normal := + inertiaSubgroupInAbsolute_normal_of_decompositionSubgroup_eq_top K A hA + absoluteQuotientInertiaEquivResidueActionRangeOfDecompositionSubgroupEqTop + K A hA + (QuotientGroup.mk' (inertiaSubgroupInAbsolute K A) σ) = + (absoluteResidueActionOfDecompositionSubgroupEqTop K A hA).rangeRestrict + σ := by + let : (inertiaSubgroupInAbsolute K A).Normal := + inertiaSubgroupInAbsolute_normal_of_decompositionSubgroup_eq_top K A hA + change + absoluteQuotientKernelEquivResidueActionRangeOfDecompositionSubgroupEqTop + K A hA + (QuotientGroup.mk' + (MonoidHom.ker + (absoluteResidueActionOfDecompositionSubgroupEqTop K A hA)) σ) = + (absoluteResidueActionOfDecompositionSubgroupEqTop K A hA).rangeRestrict σ + rfl + +/-- States the theorem +`absoluteQuotientInertiaEquivResidueActionRangeOfDecompositionSubgroupEqTop_symm_rangeRestrict`. +-/ +@[simp] theorem + absoluteQuotientInertiaEquivResidueActionRangeOfDecompositionSubgroupEqTop_symm_rangeRestrict + (A : ValuationSubring (AlgebraicClosure K)) + (hA : decompositionSubgroup K A = ⊤) + (σ : Field.absoluteGaloisGroup K) : + letI : (inertiaSubgroupInAbsolute K A).Normal := + inertiaSubgroupInAbsolute_normal_of_decompositionSubgroup_eq_top K A hA + (absoluteQuotientInertiaEquivResidueActionRangeOfDecompositionSubgroupEqTop + K A hA).symm + ((absoluteResidueActionOfDecompositionSubgroupEqTop K A hA).rangeRestrict + σ) = + QuotientGroup.mk' (inertiaSubgroupInAbsolute K A) σ := by + let : (inertiaSubgroupInAbsolute K A).Normal := + inertiaSubgroupInAbsolute_normal_of_decompositionSubgroup_eq_top K A hA + apply + (absoluteQuotientInertiaEquivResidueActionRangeOfDecompositionSubgroupEqTop + K A hA).injective + rw [absoluteQuotientInertiaEquivResidueActionRangeOfDecompositionSubgroupEqTop_mk] + exact + (absoluteQuotientInertiaEquivResidueActionRangeOfDecompositionSubgroupEqTop + K A hA).apply_symm_apply + ((absoluteResidueActionOfDecompositionSubgroupEqTop K A hA).rangeRestrict σ) + +/-- Absolute decomposition modulo inertia is the range of the residue-field +action. -/ +noncomputable def decompositionQuotientInertiaEquivResidueActionRange + (A : ValuationSubring (AlgebraicClosure K)) : + decompositionSubgroup K A ⧸ inertiaSubgroup K A ≃* + (decompositionResidueAction K A).range := + (QuotientGroup.quotientMulEquivOfEq + (decompositionResidueAction_ker K A).symm).trans + (QuotientGroup.quotientKerEquivRange + (decompositionResidueAction K A)) + +/-- States the theorem `decompositionQuotientInertiaEquivResidueActionRange_mk`. -/ +theorem decompositionQuotientInertiaEquivResidueActionRange_mk + (A : ValuationSubring (AlgebraicClosure K)) + (σ : decompositionSubgroup K A) : + decompositionQuotientInertiaEquivResidueActionRange K A + (QuotientGroup.mk' (inertiaSubgroup K A) σ) = + (decompositionResidueAction K A).rangeRestrict σ := + rfl + +/-- States the theorem `decompositionQuotientInertiaEquivResidueActionRange_symm_rangeRestrict`. -/ +@[simp] theorem decompositionQuotientInertiaEquivResidueActionRange_symm_rangeRestrict + (A : ValuationSubring (AlgebraicClosure K)) + (σ : decompositionSubgroup K A) : + (decompositionQuotientInertiaEquivResidueActionRange K A).symm + ((decompositionResidueAction K A).rangeRestrict σ) = + QuotientGroup.mk' (inertiaSubgroup K A) σ := by + apply (decompositionQuotientInertiaEquivResidueActionRange K A).injective + rw [decompositionQuotientInertiaEquivResidueActionRange_mk] + exact (decompositionQuotientInertiaEquivResidueActionRange K A).apply_symm_apply + ((decompositionResidueAction K A).rangeRestrict σ) + +end AbsoluteRamification + +end absoluteGaloisGroup +end Field + +end + +end RamificationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean new file mode 100644 index 0000000000..905a3b0925 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean @@ -0,0 +1,1650 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.InfiniteGaloisCorrespondence +/-! Provides the public declarations in the + `RamificationTheory.GaloisValuation.AbsoluteGalois.FiniteExtensionCorrespondence` Lean module. -/ + +@[expose] public section + +open _root_.RamificationTheory.Field.absoluteGaloisGroup renaming + valuationSubring_mem_preserved_on_finite_separable_intermediate → + valuationSubring_mem_preserved_on_finite_separable_intermediate + + +namespace RamificationTheory + +open ValuationTheory + +noncomputable +section + +universe u v w z + +namespace Field +namespace absoluteGaloisGroup + +open scoped Topology Pointwise +open CategoryTheory + +variable (K : Type u) [Field K] + +section FiniteExtension + +variable {L : Type v} [Field L] [Algebra K L] + +local instance fieldRangeIsScalarTower + (i : L →ₐ[K] AlgebraicClosure K) : + IsScalarTower K (AlgHom.fieldRange i) (AlgebraicClosure K) := + IsScalarTower.of_algebraMap_eq fun _ => rfl + +/-- The image of a finite extension inside `K^al` is finite over `K`. -/ +theorem finiteDimensional_fieldRange [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + FiniteDimensional K (AlgHom.fieldRange i) := + (AlgEquiv.ofInjectiveField i).toLinearEquiv.finiteDimensional + +/-- The subgroup of `G_K` fixing the embedded copy `i(L)` pointwise. This +definition does not require `L/K` to be finite; finiteness is only needed to +know that it is open. -/ +def fixingSubgroupOfExtension (i : L →ₐ[K] AlgebraicClosure K) : + Subgroup (Field.absoluteGaloisGroup K) where + carrier := + {σ | ∀ x : L, + (show Gal(AlgebraicClosure K/K) from σ) (i x) = i x} + one_mem' := by + intro x + rfl + mul_mem' := by + intro σ τ hσ hτ x + change (show Gal(AlgebraicClosure K/K) from σ) + ((show Gal(AlgebraicClosure K/K) from τ) (i x)) = i x + rw [hτ x, hσ x] + inv_mem' := by + intro σ hσ x + change (show Gal(AlgebraicClosure K/K) from σ).symm (i x) = i x + have h := + congrArg (fun y => + (show Gal(AlgebraicClosure K/K) from σ).symm y) (hσ x) + exact h.symm.trans + ((show Gal(AlgebraicClosure K/K) from σ).symm_apply_apply (i x)) + +/-- States the theorem `mem_fixingSubgroupOfExtension`. -/ +@[simp] +theorem mem_fixingSubgroupOfExtension + (i : L →ₐ[K] AlgebraicClosure K) (σ : Field.absoluteGaloisGroup K) : + σ ∈ fixingSubgroupOfExtension K i ↔ + ∀ x : L, (show Gal(AlgebraicClosure K/K) from σ) (i x) = i x := + Iff.rfl + +/-- The concrete pointwise-fixing subgroup is the usual fixing subgroup of +the field range `i(L)`. -/ +theorem fixingSubgroupOfExtension_eq_fieldRange_fixingSubgroup + (i : L →ₐ[K] AlgebraicClosure K) : + fixingSubgroupOfExtension K i = + (AlgHom.fieldRange i).fixingSubgroup := by + change + (show Subgroup (Gal(AlgebraicClosure K/K)) from + fixingSubgroupOfExtension K i) = + (AlgHom.fieldRange i).fixingSubgroup + ext σ + constructor + · intro hσ + rw [IntermediateField.mem_fixingSubgroup_iff] + intro y hy + rcases (AlgHom.mem_fieldRange (f := i)).mp hy with ⟨x, rfl⟩ + exact hσ x + · intro hσ x + exact (IntermediateField.mem_fixingSubgroup_iff + (AlgHom.fieldRange i) σ).1 hσ (i x) ⟨x, rfl⟩ + +section TwoFiniteExtensions + +variable {M : Type w} [Field M] [Algebra K M] + +/-- If the embedded copy of `L` is contained in the embedded copy of `M`, +then the subgroup fixing `i(M)` is contained in the subgroup fixing `i(L)`. -/ +theorem fixingSubgroupOfExtension_le_of_fieldRange_le + (iL : L →ₐ[K] AlgebraicClosure K) + (iM : M →ₐ[K] AlgebraicClosure K) + (h : AlgHom.fieldRange iL ≤ AlgHom.fieldRange iM) : + fixingSubgroupOfExtension K iM ≤ fixingSubgroupOfExtension K iL := by + intro σ hσ x + rcases (AlgHom.mem_fieldRange (f := iM)).mp (h ⟨x, rfl⟩) with ⟨y, hy⟩ + change (show Gal(AlgebraicClosure K/K) from σ) (iL.toRingHom x) = + iL.toRingHom x + rw [← hy] + exact hσ y + +/-- For a tower embedding `L -> M -> K^al`, the subgroup fixing `M` is +contained in the subgroup fixing `L`. -/ +theorem fixingSubgroupOfExtension_comp_le + (i : M →ₐ[K] AlgebraicClosure K) (j : L →ₐ[K] M) : + fixingSubgroupOfExtension K i ≤ + fixingSubgroupOfExtension K (i.comp j) := by + intro σ hσ x + exact hσ (j x) + +end TwoFiniteExtensions + +/-- For a finite extension `L/K` embedded in `K^al`, this is the concrete +open subgroup of `G_K` identified with `G_L`: it is +`Gal(K^al / i(L))`. -/ +def openSubgroupOfFiniteExtension [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + OpenSubgroup (Field.absoluteGaloisGroup K) := by + letI := finiteDimensional_fieldRange (K := K) i + exact openSubgroupOfFiniteIntermediateField K (AlgHom.fieldRange i) + +/-- States the theorem `openSubgroupOfFiniteExtension_toSubgroup`. -/ +@[simp] +theorem openSubgroupOfFiniteExtension_toSubgroup [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + (openSubgroupOfFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)) = + (AlgHom.fieldRange i).fixingSubgroup := by + let := finiteDimensional_fieldRange (K := K) i + rfl + +/-- States the theorem `mem_openSubgroupOfFiniteExtension`. -/ +@[simp] +theorem mem_openSubgroupOfFiniteExtension [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) (σ : Field.absoluteGaloisGroup K) : + σ ∈ openSubgroupOfFiniteExtension K i ↔ + ∀ x ∈ AlgHom.fieldRange i, + (show Gal(AlgebraicClosure K/K) from σ) x = x := by + let := finiteDimensional_fieldRange (K := K) i + exact mem_openSubgroupOfFiniteIntermediateField K (AlgHom.fieldRange i) σ + +/-- Concrete membership in the finite-extension open subgroup: an element of +`G_K` lies in the copy of `G_L` exactly when it fixes every embedded element +`i x`. -/ +theorem mem_openSubgroupOfFiniteExtension_iff_forall_apply_eq + [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) (σ : Field.absoluteGaloisGroup K) : + σ ∈ openSubgroupOfFiniteExtension K i ↔ + ∀ x : L, (show Gal(AlgebraicClosure K/K) from σ) (i x) = i x := by + rw [mem_openSubgroupOfFiniteExtension] + constructor + · intro hσ x + exact hσ (i x) ⟨x, rfl⟩ + · intro hσ y hy + rcases (AlgHom.mem_fieldRange (f := i)).mp hy with ⟨x, rfl⟩ + exact hσ x + +/-- The finite-extension open subgroup is exactly the concrete subgroup +fixing the embedded copy `i(L)` pointwise. -/ +theorem openSubgroupOfFiniteExtension_toSubgroup_eq_fixingSubgroupOfExtension + [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) : + (openSubgroupOfFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)) = + fixingSubgroupOfExtension K i := by + rw [openSubgroupOfFiniteExtension_toSubgroup, + fixingSubgroupOfExtension_eq_fieldRange_fixingSubgroup] + +/-- The subgroup fixing an embedded finite extension is open. -/ +theorem isOpen_fixingSubgroupOfExtension [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + IsOpen (fixingSubgroupOfExtension K i : + Set (Field.absoluteGaloisGroup K)) := by + rw [← openSubgroupOfFiniteExtension_toSubgroup_eq_fixingSubgroupOfExtension] + exact (openSubgroupOfFiniteExtension K i).isOpen' + +/-- The normal-closure open subgroup attached to an embedded finite extension. -/ +def openSubgroupOfNormalClosureFiniteExtension [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + OpenSubgroup (Field.absoluteGaloisGroup K) := by + letI := finiteDimensional_fieldRange (K := K) i + exact openSubgroupOfNormalClosureFiniteIntermediateField K + (AlgHom.fieldRange i) + +/-- States the theorem `openSubgroupOfNormalClosureFiniteExtension_toSubgroup`. -/ +@[simp] +theorem openSubgroupOfNormalClosureFiniteExtension_toSubgroup + [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + (openSubgroupOfNormalClosureFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)) = + (IntermediateField.normalClosure K (AlgHom.fieldRange i) + (AlgebraicClosure K)).fixingSubgroup := by + let := finiteDimensional_fieldRange (K := K) i + rfl + +/-- The normal-closure open subgroup lies inside the concrete open subgroup +identified with `G_L`. -/ +theorem openSubgroupOfNormalClosureFiniteExtension_le + [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + (openSubgroupOfNormalClosureFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)) ≤ + openSubgroupOfFiniteExtension K i := by + let := finiteDimensional_fieldRange (K := K) i + exact openSubgroupOfNormalClosureFiniteIntermediateField_le K + (AlgHom.fieldRange i) + +/-- The normal-closure open subgroup attached to an embedded finite extension +is normal in `G_K`. -/ +theorem openSubgroupOfNormalClosureFiniteExtension_normal + [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + ((openSubgroupOfNormalClosureFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K))).Normal := by + let := finiteDimensional_fieldRange (K := K) i + exact openSubgroupOfNormalClosureFiniteIntermediateField_normal K + (AlgHom.fieldRange i) + +/-- Provides the instance `instNormal`. -/ +instance openSubgroupOfNormalClosureFiniteExtension.instNormal + [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + (openSubgroupOfNormalClosureFiniteExtension K i).toSubgroup.Normal := + openSubgroupOfNormalClosureFiniteExtension_normal K i + +/-- Quotienting by the normal-closure open subgroup attached to an embedded +finite extension gives the finite Galois group of the normal closure of +`i(L)`. -/ +def quotientNormalClosureOpenSubgroupEquivGalOfFiniteExtension + [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + Field.absoluteGaloisGroup K ⧸ + (openSubgroupOfNormalClosureFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)) ≃* + Gal(IntermediateField.normalClosure K (AlgHom.fieldRange i) + (AlgebraicClosure K)/K) := by + letI := finiteDimensional_fieldRange (K := K) i + exact quotientNormalClosureOpenSubgroupEquivGal K (AlgHom.fieldRange i) + +/-- States the theorem `quotientNormalClosureOpenSubgroupEquivGalOfFiniteExtension_mk'`. -/ +theorem quotientNormalClosureOpenSubgroupEquivGalOfFiniteExtension_mk' + [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup K) : + quotientNormalClosureOpenSubgroupEquivGalOfFiniteExtension K i + (QuotientGroup.mk' + (openSubgroupOfNormalClosureFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)) σ) = + AlgEquiv.restrictNormalHom + (IntermediateField.normalClosure K (AlgHom.fieldRange i) + (AlgebraicClosure K)) σ := by + let := finiteDimensional_fieldRange (K := K) i + exact quotientNormalClosureOpenSubgroupEquivGal_mk' K + (AlgHom.fieldRange i) σ + +/-- The cardinality of the Galois group of the normal closure of an embedded +extension. The later index comparison supplies finite-dimensionality when +this cardinal is used for a finite extension. -/ +noncomputable def normalClosureFiniteExtensionGaloisCard + (i : L →ₐ[K] AlgebraicClosure K) : ℕ := by + exact Nat.card (Gal(IntermediateField.normalClosure K (AlgHom.fieldRange i) + (AlgebraicClosure K)/K)) + +/-- The index of the normal-closure open subgroup attached to an embedded +finite extension is the safely computed cardinality of its Galois group. -/ +theorem openSubgroupOfNormalClosureFiniteExtension_index_eq_galoisCard + [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + (openSubgroupOfNormalClosureFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)).index = + normalClosureFiniteExtensionGaloisCard K i := by + let := finiteDimensional_fieldRange (K := K) i + exact openSubgroupOfNormalClosureFiniteIntermediateField_index_eq_natCard_gal K + (AlgHom.fieldRange i) + +/-- Provides the instance `instFiniteIndex`. -/ +instance openSubgroupOfFiniteExtension.instFiniteIndex [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + ((openSubgroupOfFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K))).FiniteIndex := by + let := finiteDimensional_fieldRange (K := K) i + change ((openSubgroupOfFiniteIntermediateField K (AlgHom.fieldRange i) : + Subgroup (Gal(AlgebraicClosure K/K)))).FiniteIndex + infer_instance + +/-- Provides the instance `instFiniteIndex`. -/ +instance openSubgroupOfNormalClosureFiniteExtension.instFiniteIndex + [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + ((openSubgroupOfNormalClosureFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K))).FiniteIndex := by + let := finiteDimensional_fieldRange (K := K) i + change ((openSubgroupOfNormalClosureFiniteIntermediateField K + (AlgHom.fieldRange i) : + Subgroup (Gal(AlgebraicClosure K/K)))).FiniteIndex + infer_instance + +/-- If the chosen algebraic closure is Galois over `K`, the index of the +open subgroup fixing an embedded finite extension is `[L : K]`. -/ +theorem openSubgroupOfFiniteExtension_index_eq_finrank + [FiniteDimensional K L] [IsGalois K (AlgebraicClosure K)] + (i : L →ₐ[K] AlgebraicClosure K) : + (openSubgroupOfFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)).index = Module.finrank K L := by + rw [openSubgroupOfFiniteExtension_toSubgroup] + change (AlgHom.fieldRange i).fixingSubgroup.index = Module.finrank K L + exact (IntermediateField.finrank_eq_fixingSubgroup_index + (F := K) (AlgebraicClosure K) (AlgHom.fieldRange i)).symm.trans + (AlgEquiv.ofInjectiveField i).toLinearEquiv.finrank_eq.symm + +/-- Conjugate an embedding `i : L -> K^al` by an element of `G_K`. -/ +def conjugateEmbedding + (i : L →ₐ[K] AlgebraicClosure K) (σ : Field.absoluteGaloisGroup K) : + L →ₐ[K] AlgebraicClosure K := + (show Gal(AlgebraicClosure K/K) from σ).toAlgHom.comp i + +/-- States the theorem `conjugateEmbedding_apply`. -/ +@[simp] +theorem conjugateEmbedding_apply + (i : L →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup K) (x : L) : + conjugateEmbedding K i σ x = + (show Gal(AlgebraicClosure K/K) from σ) (i x) := + rfl + +/-- The field range of the conjugated embedding is the image of the original +embedded field range. -/ +theorem fieldRange_conjugateEmbedding + (i : L →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup K) : + AlgHom.fieldRange (conjugateEmbedding K i σ) = + (AlgHom.fieldRange i).map + (show Gal(AlgebraicClosure K/K) from σ).toAlgHom := + (AlgHom.map_fieldRange i + (show Gal(AlgebraicClosure K/K) from σ).toAlgHom).symm + +/-- Membership in the open subgroup attached to a conjugated embedding is +membership in the original open subgroup after conjugating the automorphism +back. -/ +theorem mem_openSubgroupOfFiniteExtension_conjugateEmbedding_iff + [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) + (σ τ : Field.absoluteGaloisGroup K) : + τ ∈ openSubgroupOfFiniteExtension K (conjugateEmbedding K i σ) ↔ + σ⁻¹ * τ * σ ∈ openSubgroupOfFiniteExtension K i := by + rw [mem_openSubgroupOfFiniteExtension_iff_forall_apply_eq, + mem_openSubgroupOfFiniteExtension_iff_forall_apply_eq] + constructor + · intro h x + have hx := h x + change (show Gal(AlgebraicClosure K/K) from σ⁻¹ * τ * σ) (i x) = i x + change (show Gal(AlgebraicClosure K/K) from σ).symm + ((show Gal(AlgebraicClosure K/K) from τ) + ((show Gal(AlgebraicClosure K/K) from σ) (i x))) = i x + exact (congrArg + (fun y => (show Gal(AlgebraicClosure K/K) from σ).symm y) hx).trans + ((show Gal(AlgebraicClosure K/K) from σ).symm_apply_apply (i x)) + · intro h x + have hx := h x + change (show Gal(AlgebraicClosure K/K) from σ).symm + ((show Gal(AlgebraicClosure K/K) from τ) + ((show Gal(AlgebraicClosure K/K) from σ) (i x))) = i x at hx + change (show Gal(AlgebraicClosure K/K) from τ) + ((show Gal(AlgebraicClosure K/K) from σ) (i x)) = + (show Gal(AlgebraicClosure K/K) from σ) (i x) + have hx' := congrArg + (fun y => (show Gal(AlgebraicClosure K/K) from σ) y) hx + exact ((show Gal(AlgebraicClosure K/K) from σ).apply_symm_apply + ((show Gal(AlgebraicClosure K/K) from τ) + ((show Gal(AlgebraicClosure K/K) from σ) (i x)))).symm.trans hx' + +/-- Conjugating the embedding conjugates the associated concrete open subgroup +inside `G_K`. -/ +theorem openSubgroupOfFiniteExtension_conjugateEmbedding_eq_map + [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup K) : + (openSubgroupOfFiniteExtension K (conjugateEmbedding K i σ) : + Subgroup (Field.absoluteGaloisGroup K)) = + Subgroup.map (MulAut.conj σ).toMonoidHom + (openSubgroupOfFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)) := by + ext τ + change τ ∈ openSubgroupOfFiniteExtension K (conjugateEmbedding K i σ) ↔ + τ ∈ Subgroup.map (MulAut.conj σ).toMonoidHom + (openSubgroupOfFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)) + rw [mem_openSubgroupOfFiniteExtension_conjugateEmbedding_iff] + constructor + · intro hτ + refine ⟨σ⁻¹ * τ * σ, hτ, ?_⟩ + simp [MulAut.conj_apply, mul_assoc] + · rintro ⟨η, hη, rfl⟩ + simpa [MulAut.conj_apply, mul_assoc] using + (mem_openSubgroupOfFiniteExtension_iff_forall_apply_eq K i η).1 hη + +section TwoFiniteExtensions + +variable {M : Type w} [Field M] [Algebra K M] + +/-- If the embedded copy of `L` is contained in the embedded copy of `M`, +then the open subgroup identified with `G_M` is contained in the one +identified with `G_L`. -/ +theorem openSubgroupOfFiniteExtension_le_of_fieldRange_le + [FiniteDimensional K L] [FiniteDimensional K M] + (iL : L →ₐ[K] AlgebraicClosure K) + (iM : M →ₐ[K] AlgebraicClosure K) + (h : AlgHom.fieldRange iL ≤ AlgHom.fieldRange iM) : + (openSubgroupOfFiniteExtension K iM : + Subgroup (Field.absoluteGaloisGroup K)) ≤ + openSubgroupOfFiniteExtension K iL := by + rw [openSubgroupOfFiniteExtension_toSubgroup_eq_fixingSubgroupOfExtension, + openSubgroupOfFiniteExtension_toSubgroup_eq_fixingSubgroupOfExtension] + exact fixingSubgroupOfExtension_le_of_fieldRange_le K iL iM h + +/-- For a tower embedding `L -> M -> K^al`, the open subgroup identified with +`G_M` is contained in the one identified with `G_L`. -/ +theorem openSubgroupOfFiniteExtension_comp_le + [FiniteDimensional K L] [FiniteDimensional K M] + (i : M →ₐ[K] AlgebraicClosure K) (j : L →ₐ[K] M) : + (openSubgroupOfFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)) ≤ + openSubgroupOfFiniteExtension K (i.comp j) := by + rw [openSubgroupOfFiniteExtension_toSubgroup_eq_fixingSubgroupOfExtension, + openSubgroupOfFiniteExtension_toSubgroup_eq_fixingSubgroupOfExtension] + exact fixingSubgroupOfExtension_comp_le K i j + +/-- The open subgroup corresponding to the compositum of the two embedded +finite extensions `iL(L)` and `iM(M)` inside `K^al`. -/ +def openSubgroupOfFiniteExtensionSup + [FiniteDimensional K L] [FiniteDimensional K M] + (iL : L →ₐ[K] AlgebraicClosure K) + (iM : M →ₐ[K] AlgebraicClosure K) : + OpenSubgroup (Field.absoluteGaloisGroup K) := by + letI : FiniteDimensional K (AlgHom.fieldRange iL) := + finiteDimensional_fieldRange (K := K) iL + letI : FiniteDimensional K (AlgHom.fieldRange iM) := + finiteDimensional_fieldRange (K := K) iM + exact + openSubgroupOfFiniteIntermediateFieldSup K + (AlgHom.fieldRange iL) (AlgHom.fieldRange iM) + +/-- States the theorem `openSubgroupOfFiniteExtensionSup_toSubgroup`. -/ +@[simp] +theorem openSubgroupOfFiniteExtensionSup_toSubgroup + [FiniteDimensional K L] [FiniteDimensional K M] + (iL : L →ₐ[K] AlgebraicClosure K) + (iM : M →ₐ[K] AlgebraicClosure K) : + (openSubgroupOfFiniteExtensionSup K iL iM : + Subgroup (Field.absoluteGaloisGroup K)) = + (openSubgroupOfFiniteExtension K iL : + Subgroup (Field.absoluteGaloisGroup K)) ⊓ + openSubgroupOfFiniteExtension K iM := by + let : FiniteDimensional K (AlgHom.fieldRange iL) := + finiteDimensional_fieldRange (K := K) iL + let : FiniteDimensional K (AlgHom.fieldRange iM) := + finiteDimensional_fieldRange (K := K) iM + change + (openSubgroupOfFiniteIntermediateFieldSup K + (AlgHom.fieldRange iL) (AlgHom.fieldRange iM) : + Subgroup (Gal(AlgebraicClosure K/K))) = + (openSubgroupOfFiniteIntermediateField K (AlgHom.fieldRange iL) : + Subgroup (Gal(AlgebraicClosure K/K))) ⊓ + openSubgroupOfFiniteIntermediateField K (AlgHom.fieldRange iM) + exact openSubgroupOfFiniteIntermediateFieldSup_toSubgroup K + (AlgHom.fieldRange iL) (AlgHom.fieldRange iM) + +/-- States the theorem `mem_openSubgroupOfFiniteExtensionSup`. -/ +theorem mem_openSubgroupOfFiniteExtensionSup + [FiniteDimensional K L] [FiniteDimensional K M] + (iL : L →ₐ[K] AlgebraicClosure K) + (iM : M →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup K) : + σ ∈ openSubgroupOfFiniteExtensionSup K iL iM ↔ + σ ∈ openSubgroupOfFiniteExtension K iL ∧ + σ ∈ openSubgroupOfFiniteExtension K iM := by + let : FiniteDimensional K (AlgHom.fieldRange iL) := + finiteDimensional_fieldRange (K := K) iL + let : FiniteDimensional K (AlgHom.fieldRange iM) := + finiteDimensional_fieldRange (K := K) iM + change + (show Gal(AlgebraicClosure K/K) from σ) ∈ + (openSubgroupOfFiniteIntermediateFieldSup K + (AlgHom.fieldRange iL) (AlgHom.fieldRange iM) : + Subgroup (Gal(AlgebraicClosure K/K))) ↔ + (show Gal(AlgebraicClosure K/K) from σ) ∈ + (openSubgroupOfFiniteIntermediateField K (AlgHom.fieldRange iL) : + Subgroup (Gal(AlgebraicClosure K/K))) ∧ + (show Gal(AlgebraicClosure K/K) from σ) ∈ + (openSubgroupOfFiniteIntermediateField K (AlgHom.fieldRange iM) : + Subgroup (Gal(AlgebraicClosure K/K))) + rw [openSubgroupOfFiniteIntermediateFieldSup_toSubgroup] + exact Iff.rfl + +/-- Concrete pointwise criterion for the compositum open subgroup attached to +two embedded finite extensions. -/ +theorem mem_openSubgroupOfFiniteExtensionSup_iff_forall_apply_eq + [FiniteDimensional K L] [FiniteDimensional K M] + (iL : L →ₐ[K] AlgebraicClosure K) + (iM : M →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup K) : + σ ∈ openSubgroupOfFiniteExtensionSup K iL iM ↔ + (∀ x : L, (show Gal(AlgebraicClosure K/K) from σ) (iL x) = iL x) ∧ + ∀ y : M, (show Gal(AlgebraicClosure K/K) from σ) (iM y) = iM y := by + rw [mem_openSubgroupOfFiniteExtensionSup, + mem_openSubgroupOfFiniteExtension_iff_forall_apply_eq, + mem_openSubgroupOfFiniteExtension_iff_forall_apply_eq] + +end TwoFiniteExtensions + +/-- The finite-extension open subgroup fixing `i(L)` is topologically +isomorphic to `Gal(K^al/i(L))`. -/ +def openSubgroupOfFiniteExtensionContinuousMulEquiv [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + openSubgroupOfFiniteExtension K i ≃ₜ* + Gal(AlgebraicClosure K/AlgHom.fieldRange i) := by + letI := finiteDimensional_fieldRange (K := K) i + exact + openSubgroupOfFiniteIntermediateFieldContinuousMulEquiv K + (AlgHom.fieldRange i) + +/-- The inclusion `Gal(K^al / i(L)) → G_K` attached to an embedded finite +extension. -/ +def ofFiniteExtension (i : L →ₐ[K] AlgebraicClosure K) : + Gal(AlgebraicClosure K/AlgHom.fieldRange i) →* + Field.absoluteGaloisGroup K := + ofIntermediateField K (AlgHom.fieldRange i) + +/-- States the theorem `ofFiniteExtension_apply`. -/ +@[simp] +theorem ofFiniteExtension_apply + (i : L →ₐ[K] AlgebraicClosure K) + (σ : Gal(AlgebraicClosure K/AlgHom.fieldRange i)) : + ofFiniteExtension K i σ = σ.restrictScalars K := + rfl + +/-- The natural inclusion `Gal(K^al/i(L)) → G_K` is injective. -/ +theorem ofFiniteExtension_injective + (i : L →ₐ[K] AlgebraicClosure K) : + Function.Injective (ofFiniteExtension K i) := + ofIntermediateField_injective K (AlgHom.fieldRange i) + +/-- The inclusion `Gal(K^al / i(L)) → G_K` attached to an embedded finite +extension is continuous for finite `L/K`. -/ +theorem ofFiniteExtension_continuous [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + Continuous (ofFiniteExtension K i) := by + let := finiteDimensional_fieldRange (K := K) i + exact ofIntermediateField_continuous K (AlgHom.fieldRange i) + +/-- The image of `Gal(K^al / i(L))` in `G_K` is the open subgroup attached +to the embedded finite extension `i : L → K^al`. -/ +theorem range_ofFiniteExtension [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + MonoidHom.range (ofFiniteExtension K i) = + (openSubgroupOfFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)) := by + let := finiteDimensional_fieldRange (K := K) i + exact range_ofIntermediateField_eq_openSubgroup K (AlgHom.fieldRange i) + +/-- The image of `Gal(K^al/i(L)) → G_K` has finite index for finite `L/K`. -/ +theorem range_ofFiniteExtension_finiteIndex [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + (MonoidHom.range (ofFiniteExtension K i)).FiniteIndex := by + rw [range_ofFiniteExtension] + infer_instance + +/-- If the chosen algebraic closure is Galois over `K`, the image of +`Gal(K^al/i(L)) → G_K` has index `[L : K]`. -/ +theorem range_ofFiniteExtension_index_eq_finrank + [FiniteDimensional K L] [IsGalois K (AlgebraicClosure K)] + (i : L →ₐ[K] AlgebraicClosure K) : + (MonoidHom.range (ofFiniteExtension K i)).index = Module.finrank K L := by + rw [range_ofFiniteExtension] + exact openSubgroupOfFiniteExtension_index_eq_finrank K i + +/-- Hence the image of `Gal(K^al / i(L))` in `G_K` is open for finite +`L/K`. -/ +theorem isOpen_range_ofFiniteExtension [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + IsOpen (MonoidHom.range (ofFiniteExtension K i) : + Set (Field.absoluteGaloisGroup K)) := by + let := finiteDimensional_fieldRange (K := K) i + exact isOpen_range_ofIntermediateField K (AlgHom.fieldRange i) + +/-- States the theorem `mem_range_ofFiniteExtension_iff`. -/ +theorem mem_range_ofFiniteExtension_iff + (i : L →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup K) : + σ ∈ MonoidHom.range (ofFiniteExtension K i) ↔ + ∀ x ∈ AlgHom.fieldRange i, + (show Gal(AlgebraicClosure K/K) from σ) x = x := by + change + (show Gal(AlgebraicClosure K/K) from σ) ∈ + MonoidHom.range (ofIntermediateField K (AlgHom.fieldRange i)) ↔ + ∀ x ∈ AlgHom.fieldRange i, + (show Gal(AlgebraicClosure K/K) from σ) x = x + rw [mem_range_ofIntermediateField_iff] + exact IntermediateField.mem_fixingSubgroup_iff (AlgHom.fieldRange i) σ + +/-- Concrete range criterion for `Gal(K^al/i(L)) → G_K`. -/ +theorem mem_range_ofFiniteExtension_iff_forall_apply_eq + [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup K) : + σ ∈ MonoidHom.range (ofFiniteExtension K i) ↔ + ∀ x : L, (show Gal(AlgebraicClosure K/K) from σ) (i x) = i x := by + rw [range_ofFiniteExtension] + exact mem_openSubgroupOfFiniteExtension_iff_forall_apply_eq K i σ + +/-- Normality of `L/K` transports to the embedded field range `i(L)`. -/ +instance normal_fieldRangeOfExtension + (i : L →ₐ[K] AlgebraicClosure K) [Normal K L] : + Normal K (AlgHom.fieldRange i) := + Normal.of_algEquiv (AlgEquiv.ofInjectiveField i) + +/-- The open subgroup attached to an embedded finite extension is normal when +the embedded image is normal over `K`. -/ +theorem openSubgroupOfFiniteExtension_normal [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) [Normal K (AlgHom.fieldRange i)] : + ((openSubgroupOfFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K))).Normal := by + let := finiteDimensional_fieldRange (K := K) i + exact openSubgroupOfFiniteIntermediateField_normal K (AlgHom.fieldRange i) + +/-- For a finite normal extension, the concrete copy of `G_L` inside `G_K` is +a normal open subgroup. -/ +theorem openSubgroupOfFiniteExtension_normal_of_normal + [FiniteDimensional K L] [Normal K L] + (i : L →ₐ[K] AlgebraicClosure K) : + ((openSubgroupOfFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K))).Normal := + openSubgroupOfFiniteExtension_normal K i + +/-- Provides the instance `instNormal`. -/ +instance openSubgroupOfFiniteExtension.instNormal + [FiniteDimensional K L] [Normal K L] + (i : L →ₐ[K] AlgebraicClosure K) : + (openSubgroupOfFiniteExtension K i).toSubgroup.Normal := + openSubgroupOfFiniteExtension_normal_of_normal K i + +/-- Provides the instance `instNormal_coe`. -/ +instance openSubgroupOfFiniteExtension.instNormal_coe + [FiniteDimensional K L] [Normal K L] + (i : L →ₐ[K] AlgebraicClosure K) : + ((openSubgroupOfFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K))).Normal := + openSubgroupOfFiniteExtension_normal_of_normal K i + +/-- For an embedded finite normal extension, `G_K/G_L` is the automorphism +group of the embedded field range. -/ +def quotientEquivGalFieldRangeOfNormalFiniteExtension + (i : L →ₐ[K] AlgebraicClosure K) [Normal K (AlgHom.fieldRange i)] : + Gal(AlgebraicClosure K/K) ⧸ (AlgHom.fieldRange i).fixingSubgroup ≃* + Gal(AlgHom.fieldRange i/K) := + quotientEquivGalOfNormalIntermediateField K (AlgHom.fieldRange i) + +/-- States the theorem `quotientEquivGalFieldRangeOfNormalFiniteExtension_mk'`. -/ +theorem quotientEquivGalFieldRangeOfNormalFiniteExtension_mk' + [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) + [Normal K (AlgHom.fieldRange i)] (σ : Gal(AlgebraicClosure K/K)) : + quotientEquivGalFieldRangeOfNormalFiniteExtension K i + (QuotientGroup.mk' (AlgHom.fieldRange i).fixingSubgroup σ) = + AlgEquiv.restrictNormalHom (AlgHom.fieldRange i) σ := + quotientEquivGalOfNormalIntermediateField_mk' K (AlgHom.fieldRange i) σ + +/-- For an embedded finite normal extension, `G_K/G_L` is the original +automorphism group `Gal(L/K)`, transported across the chosen embedding. -/ +def quotientEquivGalOfNormalFiniteExtension [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) [Normal K (AlgHom.fieldRange i)] : + Gal(AlgebraicClosure K/K) ⧸ (AlgHom.fieldRange i).fixingSubgroup ≃* + Gal(L/K) := + (quotientEquivGalFieldRangeOfNormalFiniteExtension K i).trans + (AlgEquiv.autCongr (AlgEquiv.ofInjectiveField i)).symm + +/-- States the theorem `quotientEquivGalOfNormalFiniteExtension_mk'`. -/ +theorem quotientEquivGalOfNormalFiniteExtension_mk' + [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) + [Normal K (AlgHom.fieldRange i)] (σ : Gal(AlgebraicClosure K/K)) : + quotientEquivGalOfNormalFiniteExtension K i + (QuotientGroup.mk' (AlgHom.fieldRange i).fixingSubgroup σ) = + (AlgEquiv.autCongr (AlgEquiv.ofInjectiveField i)).symm + ((@AlgEquiv.restrictNormalHom K _ (AlgebraicClosure K) _ _ + (AlgHom.fieldRange i) _ _ _ (fieldRangeIsScalarTower K i) _) σ) := by + rfl + +/-- For an embedded finite normal extension, the quotient by the concrete open +subgroup attached to `L` is the automorphism group of the embedded field range. +This is the open-subgroup form of +`quotientEquivGalFieldRangeOfNormalFiniteExtension`. -/ +def quotientOpenSubgroupEquivGalFieldRangeOfNormalFiniteExtension + [FiniteDimensional K L] [Normal K L] + (i : L →ₐ[K] AlgebraicClosure K) : + Field.absoluteGaloisGroup K ⧸ + (openSubgroupOfFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)) ≃* + Gal(AlgHom.fieldRange i/K) := + quotientEquivGalFieldRangeOfNormalFiniteExtension K i + +/-- States the theorem `quotientOpenSubgroupEquivGalFieldRangeOfNormalFiniteExtension_mk'`. -/ +theorem quotientOpenSubgroupEquivGalFieldRangeOfNormalFiniteExtension_mk' + [FiniteDimensional K L] [Normal K L] + (i : L →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup K) : + quotientOpenSubgroupEquivGalFieldRangeOfNormalFiniteExtension K i + (QuotientGroup.mk' + (openSubgroupOfFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)) σ) = + AlgEquiv.restrictNormalHom (AlgHom.fieldRange i) σ := + quotientEquivGalFieldRangeOfNormalFiniteExtension_mk' K i σ + +/-- For an embedded finite normal extension, `G_K / G_L` is the original +automorphism group `Gal(L/K)` when `G_L` is written as the concrete open +subgroup of `G_K`. -/ +def quotientOpenSubgroupEquivGalOfNormalFiniteExtension + [FiniteDimensional K L] [Normal K L] + (i : L →ₐ[K] AlgebraicClosure K) : + Field.absoluteGaloisGroup K ⧸ + (openSubgroupOfFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)) ≃* + Gal(L/K) := + (quotientOpenSubgroupEquivGalFieldRangeOfNormalFiniteExtension K i).trans + (AlgEquiv.autCongr (AlgEquiv.ofInjectiveField i)).symm + +/-- States the theorem `quotientOpenSubgroupEquivGalOfNormalFiniteExtension_mk'`. -/ +theorem quotientOpenSubgroupEquivGalOfNormalFiniteExtension_mk' + [FiniteDimensional K L] [Normal K L] + (i : L →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup K) : + quotientOpenSubgroupEquivGalOfNormalFiniteExtension K i + (QuotientGroup.mk' + (openSubgroupOfFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)) σ) = + (AlgEquiv.autCongr (AlgEquiv.ofInjectiveField i)).symm + ((@AlgEquiv.restrictNormalHom K _ (AlgebraicClosure K) _ _ + (AlgHom.fieldRange i) _ _ _ (fieldRangeIsScalarTower K i) _) σ) := by + rfl + +/-- Rebase automorphisms over an embedded finite extension from `L` to its +field range `i(L)`. -/ +def automorphismsOverFieldRangeEquiv + (i : L →ₐ[K] AlgebraicClosure K) [Algebra L (AlgebraicClosure K)] + (hmap : ∀ x, algebraMap L (AlgebraicClosure K) x = i x) : + (AlgebraicClosure K ≃ₐ[L] AlgebraicClosure K) ≃* + Gal(AlgebraicClosure K/AlgHom.fieldRange i) where + toFun σ := + { σ.toRingEquiv with + commutes' := by + intro y + obtain ⟨x, hx⟩ := (AlgHom.mem_fieldRange (f := i)).mp y.2 + change σ y.1 = y.1 + rw [← hx] + change σ (i x) = i x + rw [← hmap x] + exact σ.commutes x } + invFun σ := + { σ.toRingEquiv with + commutes' := by + intro x + rw [hmap x] + exact σ.commutes ⟨i x, ⟨x, rfl⟩⟩ } + left_inv σ := by + ext x + rfl + right_inv σ := by + ext x + rfl + map_mul' σ τ := by + ext x + rfl + +private theorem automorphismsOverFieldRangeEquiv_continuous + (i : L →ₐ[K] AlgebraicClosure K) [Algebra L (AlgebraicClosure K)] + (hmap : ∀ x, algebraMap L (AlgebraicClosure K) x = i x) : + Continuous (automorphismsOverFieldRangeEquiv K i hmap : + (AlgebraicClosure K ≃ₐ[L] AlgebraicClosure K) → + Gal(AlgebraicClosure K/AlgHom.fieldRange i)) := by + let : Algebra L (AlgHom.fieldRange i) := + (AlgEquiv.ofInjectiveField i).toRingHom.toAlgebra + have : IsScalarTower L (AlgHom.fieldRange i) (AlgebraicClosure K) := + IsScalarTower.of_algebraMap_eq fun x => by + change algebraMap L (AlgebraicClosure K) x = i x + exact hmap x + have : Module.Finite L (AlgHom.fieldRange i) := by + let eLin : L ≃ₗ[L] AlgHom.fieldRange i := + { toFun := fun x => algebraMap L (AlgHom.fieldRange i) x + invFun := fun y => (AlgEquiv.ofInjectiveField i).symm y + left_inv := by + intro x + change (AlgEquiv.ofInjectiveField i).symm + ((AlgEquiv.ofInjectiveField i) x) = x + exact (AlgEquiv.ofInjectiveField i).left_inv x + right_inv := by + intro y + change (AlgEquiv.ofInjectiveField i) + ((AlgEquiv.ofInjectiveField i).symm y) = y + exact (AlgEquiv.ofInjectiveField i).right_inv y + map_add' := by + intro x y + exact map_add (algebraMap L (AlgHom.fieldRange i)) x y + map_smul' := by + intro a x + change (algebraMap L (AlgHom.fieldRange i)) (a * x) = + (algebraMap L (AlgHom.fieldRange i)) a * + (algebraMap L (AlgHom.fieldRange i)) x + exact map_mul (algebraMap L (AlgHom.fieldRange i)) a x } + exact Module.Finite.equiv eLin + let e := automorphismsOverFieldRangeEquiv K i hmap + refine continuous_of_continuousAt_one e.toMonoidHom ?_ + rw [ContinuousAt, MonoidHom.map_one, Filter.Tendsto] + intro s hs + rw [Filter.mem_map] + rcases (krullTopology_mem_nhds_one_iff (AlgHom.fieldRange i) + (AlgebraicClosure K) s).1 hs with + ⟨F, hF, hFs⟩ + let FL : IntermediateField L (AlgebraicClosure K) := F.restrictScalars L + have : FiniteDimensional (AlgHom.fieldRange i) F := hF + have : FiniteDimensional L F := + FiniteDimensional.trans L (AlgHom.fieldRange i) F + have : Module.Finite L FL := by + let eLin : FL ≃ₗ[L] F := + { toFun := fun x => ⟨x.1, x.2⟩ + invFun := fun x => ⟨x.1, x.2⟩ + left_inv := by + intro x + ext + rfl + right_inv := by + intro x + ext + rfl + map_add' := by + intro x y + ext + rfl + map_smul' := by + intro a x + ext + rfl } + exact Module.Finite.equiv eLin.symm + refine (krullTopology_mem_nhds_one_iff L (AlgebraicClosure K) + (e ⁻¹' s)).2 ?_ + refine ⟨FL, inferInstance, ?_⟩ + intro σ hσ + apply hFs + change e σ ∈ F.fixingSubgroup + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + change σ x = x + have hxFL : x ∈ FL := by + change x ∈ F + exact hx + exact (IntermediateField.mem_fixingSubgroup_iff FL σ).1 hσ x hxFL + +private theorem automorphismsOverFieldRangeEquiv_symm_continuous + (i : L →ₐ[K] AlgebraicClosure K) [Algebra L (AlgebraicClosure K)] + (hmap : ∀ x, algebraMap L (AlgebraicClosure K) x = i x) : + Continuous ((automorphismsOverFieldRangeEquiv K i hmap).symm : + Gal(AlgebraicClosure K/AlgHom.fieldRange i) → + (AlgebraicClosure K ≃ₐ[L] AlgebraicClosure K)) := by + have : IsScalarTower K L (AlgebraicClosure K) := + IsScalarTower.of_algebraMap_eq fun x => by + rw [hmap] + exact (i.commutes x).symm + let : Algebra L (AlgHom.fieldRange i) := + (AlgEquiv.ofInjectiveField i).toRingHom.toAlgebra + have : IsScalarTower L (AlgHom.fieldRange i) (AlgebraicClosure K) := + IsScalarTower.of_algebraMap_eq fun x => by + change algebraMap L (AlgebraicClosure K) x = i x + exact hmap x + have : Module.Finite L (AlgHom.fieldRange i) := by + let eLin : L ≃ₗ[L] AlgHom.fieldRange i := + { toFun := fun x => algebraMap L (AlgHom.fieldRange i) x + invFun := fun y => (AlgEquiv.ofInjectiveField i).symm y + left_inv := by + intro x + change (AlgEquiv.ofInjectiveField i).symm + ((AlgEquiv.ofInjectiveField i) x) = x + exact (AlgEquiv.ofInjectiveField i).left_inv x + right_inv := by + intro y + change (AlgEquiv.ofInjectiveField i) + ((AlgEquiv.ofInjectiveField i).symm y) = y + exact (AlgEquiv.ofInjectiveField i).right_inv y + map_add' := by + intro x y + exact map_add (algebraMap L (AlgHom.fieldRange i)) x y + map_smul' := by + intro a x + change (algebraMap L (AlgHom.fieldRange i)) (a * x) = + (algebraMap L (AlgHom.fieldRange i)) a * + (algebraMap L (AlgHom.fieldRange i)) x + exact map_mul (algebraMap L (AlgHom.fieldRange i)) a x } + exact Module.Finite.equiv eLin + let e := automorphismsOverFieldRangeEquiv K i hmap + refine continuous_of_continuousAt_one e.symm.toMonoidHom ?_ + rw [ContinuousAt, MonoidHom.map_one, Filter.Tendsto] + intro s hs + rw [Filter.mem_map] + rcases (krullTopology_mem_nhds_one_iff L (AlgebraicClosure K) s).1 hs with + ⟨F, hF, hFs⟩ + have hFRbase : AlgHom.fieldRange i ≤ F.restrictScalars K := by + intro y hy + change y ∈ F + obtain ⟨x, hx⟩ := (AlgHom.mem_fieldRange (f := i)).mp hy + rw [← hx, ← hmap x] + exact F.algebraMap_mem x + let FR : IntermediateField (AlgHom.fieldRange i) (AlgebraicClosure K) := + IntermediateField.extendScalars + (F := AlgHom.fieldRange i) + (E := F.restrictScalars K) hFRbase + have : FiniteDimensional L F := hF + have : Module.Finite L FR := by + let eLin : FR ≃ₗ[L] F := + { toFun := fun x => ⟨x.1, x.2⟩ + invFun := fun x => ⟨x.1, x.2⟩ + left_inv := by + intro x + ext + rfl + right_inv := by + intro x + ext + rfl + map_add' := by + intro x y + ext + rfl + map_smul' := by + intro a x + ext + rfl } + exact Module.Finite.equiv eLin.symm + have : FiniteDimensional (AlgHom.fieldRange i) FR := + FiniteDimensional.right L (AlgHom.fieldRange i) FR + refine (krullTopology_mem_nhds_one_iff (AlgHom.fieldRange i) + (AlgebraicClosure K) (e.symm ⁻¹' s)).2 ?_ + refine ⟨FR, inferInstance, ?_⟩ + intro σ hσ + apply hFs + change e.symm σ ∈ F.fixingSubgroup + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + change σ x = x + have hxFR : x ∈ FR := by + change x ∈ F.restrictScalars K + change x ∈ F + exact hx + exact (IntermediateField.mem_fixingSubgroup_iff FR σ).1 hσ x hxFR + +/-- For a finite extension `L/K` embedded in `K^al`, the absolute Galois +group `G_L` is canonically (up to the chosen algebraic-closure equivalence) +identified with `Gal(K^al / i(L))`. -/ +def equivGalFieldRangeOfFiniteExtension + (i : L →ₐ[K] AlgebraicClosure K) : + Field.absoluteGaloisGroup L ≃* + Gal(AlgebraicClosure K/AlgHom.fieldRange i) := by + letI : Algebra L (AlgebraicClosure K) := i.toRingHom.toAlgebra + have hmap : ∀ x, algebraMap L (AlgebraicClosure K) x = i x := fun _ => rfl + haveI : IsScalarTower K L (AlgebraicClosure K) := .of_algebraMap_eq fun x => by + simp [RingHom.algebraMap_toAlgebra] + haveI : Algebra.IsAlgebraic L (AlgebraicClosure K) := + Algebra.IsAlgebraic.tower_top (K := K) (L := L) (A := AlgebraicClosure K) + haveI : IsAlgClosure L (AlgebraicClosure K) := + { isAlgClosed := inferInstance, isAlgebraic := inferInstance } + let e : AlgebraicClosure L ≃ₐ[L] AlgebraicClosure K := + IsAlgClosure.equiv L (AlgebraicClosure L) (AlgebraicClosure K) + exact (AlgEquiv.autCongr e).trans + (automorphismsOverFieldRangeEquiv K i hmap) + +/-- The field-range identification `G_L ≃ Gal(K^al/i(L))` is continuous. -/ +theorem equivGalFieldRangeOfFiniteExtension_continuous + [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) : + Continuous (equivGalFieldRangeOfFiniteExtension K i : + Field.absoluteGaloisGroup L → + Gal(AlgebraicClosure K/AlgHom.fieldRange i)) := by + let : Algebra L (AlgebraicClosure K) := i.toRingHom.toAlgebra + have hmap : ∀ x, algebraMap L (AlgebraicClosure K) x = i x := fun _ => rfl + have : IsScalarTower K L (AlgebraicClosure K) := .of_algebraMap_eq fun x => by + simp [RingHom.algebraMap_toAlgebra] + have : Algebra.IsAlgebraic K L := Algebra.IsAlgebraic.of_finite K L + have : Algebra.IsAlgebraic L (AlgebraicClosure K) := + Algebra.IsAlgebraic.tower_top (K := K) (L := L) (A := AlgebraicClosure K) + have : IsAlgClosure L (AlgebraicClosure K) := + { isAlgClosed := inferInstance, isAlgebraic := inferInstance } + let e : AlgebraicClosure L ≃ₐ[L] AlgebraicClosure K := + IsAlgClosure.equiv L (AlgebraicClosure L) (AlgebraicClosure K) + change Continuous (((AlgEquiv.autCongr e).trans + (automorphismsOverFieldRangeEquiv K i hmap)) : + Field.absoluteGaloisGroup L → + Gal(AlgebraicClosure K/AlgHom.fieldRange i)) + exact (automorphismsOverFieldRangeEquiv_continuous K i hmap).comp + (algEquiv_autCongr_continuous e) + +/-- The inverse field-range identification `Gal(K^al/i(L)) ≃ G_L` is +continuous. -/ +theorem equivGalFieldRangeOfFiniteExtension_symm_continuous + [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) : + Continuous ((equivGalFieldRangeOfFiniteExtension K i).symm : + Gal(AlgebraicClosure K/AlgHom.fieldRange i) → + Field.absoluteGaloisGroup L) := by + let : Algebra L (AlgebraicClosure K) := i.toRingHom.toAlgebra + have hmap : ∀ x, algebraMap L (AlgebraicClosure K) x = i x := fun _ => rfl + have : IsScalarTower K L (AlgebraicClosure K) := .of_algebraMap_eq fun x => by + simp [RingHom.algebraMap_toAlgebra] + have : Algebra.IsAlgebraic K L := Algebra.IsAlgebraic.of_finite K L + have : Algebra.IsAlgebraic L (AlgebraicClosure K) := + Algebra.IsAlgebraic.tower_top (K := K) (L := L) (A := AlgebraicClosure K) + have : IsAlgClosure L (AlgebraicClosure K) := + { isAlgClosed := inferInstance, isAlgebraic := inferInstance } + let e : AlgebraicClosure L ≃ₐ[L] AlgebraicClosure K := + IsAlgClosure.equiv L (AlgebraicClosure L) (AlgebraicClosure K) + change Continuous ((((AlgEquiv.autCongr e).trans + (automorphismsOverFieldRangeEquiv K i hmap)).symm) : + Gal(AlgebraicClosure K/AlgHom.fieldRange i) → + Field.absoluteGaloisGroup L) + exact (algEquiv_autCongr_symm_continuous e).comp + (automorphismsOverFieldRangeEquiv_symm_continuous K i hmap) + +/-- The field-range identification between `G_L` and `Gal(K^al/i(L))` as a +topological group isomorphism. -/ +def equivGalFieldRangeOfFiniteExtensionContinuousMulEquiv + [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) : + Field.absoluteGaloisGroup L ≃ₜ* + Gal(AlgebraicClosure K/AlgHom.fieldRange i) := + { toMulEquiv := equivGalFieldRangeOfFiniteExtension K i + continuous_toFun := equivGalFieldRangeOfFiniteExtension_continuous K i + continuous_invFun := equivGalFieldRangeOfFiniteExtension_symm_continuous K i } + +/-- The concrete open subgroup of `G_K` attached to `i : L → K^al` is +identified with the absolute Galois group `G_L`. -/ +def equivOpenSubgroupOfFiniteExtension [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + Field.absoluteGaloisGroup L ≃* openSubgroupOfFiniteExtension K i := by + letI := finiteDimensional_fieldRange (K := K) i + exact (equivGalFieldRangeOfFiniteExtension K i).trans + (openSubgroupOfFiniteIntermediateFieldEquiv K (AlgHom.fieldRange i)).symm + +/-- The concrete open subgroup of `G_K` attached to `i : L → K^al` is +topologically identified with `G_L`. -/ +def equivOpenSubgroupOfFiniteExtensionContinuousMulEquiv + [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) : + Field.absoluteGaloisGroup L ≃ₜ* openSubgroupOfFiniteExtension K i := + (equivGalFieldRangeOfFiniteExtensionContinuousMulEquiv K i).trans + (openSubgroupOfFiniteExtensionContinuousMulEquiv K i).symm + +/-- The concrete map from `G_L` to the finite-extension open subgroup of +`G_K`. This is the subgroup-valued form of the identification +`G_L ≃ openSubgroupOfFiniteExtension K i`. -/ +def toOpenSubgroupOfFiniteExtension [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + Field.absoluteGaloisGroup L →* openSubgroupOfFiniteExtension K i := + (equivOpenSubgroupOfFiniteExtension K i).toMonoidHom + +/-- The subgroup-valued inclusion `G_L -> openSubgroupOfFiniteExtension K i` +as a continuous homomorphism. -/ +def toOpenSubgroupOfFiniteExtensionContinuous [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + Field.absoluteGaloisGroup L →ₜ* openSubgroupOfFiniteExtension K i := + (equivOpenSubgroupOfFiniteExtensionContinuousMulEquiv K i : + Field.absoluteGaloisGroup L →ₜ* openSubgroupOfFiniteExtension K i) + +/-- States the theorem `toOpenSubgroupOfFiniteExtension_apply`. -/ +@[simp] +theorem toOpenSubgroupOfFiniteExtension_apply + [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup L) : + toOpenSubgroupOfFiniteExtension K i σ = + equivOpenSubgroupOfFiniteExtension K i σ := + rfl + +/-- States the theorem `toOpenSubgroupOfFiniteExtensionContinuous_apply`. -/ +@[simp] +theorem toOpenSubgroupOfFiniteExtensionContinuous_apply + [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup L) : + toOpenSubgroupOfFiniteExtensionContinuous K i σ = + equivOpenSubgroupOfFiniteExtension K i σ := + rfl + +/-- States the theorem `coe_equivOpenSubgroupOfFiniteExtension_apply`. -/ +@[simp] +theorem coe_equivOpenSubgroupOfFiniteExtension_apply + [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup L) : + ((equivOpenSubgroupOfFiniteExtension K i σ : + openSubgroupOfFiniteExtension K i) : + Field.absoluteGaloisGroup K) = + ofFiniteExtension K i (equivGalFieldRangeOfFiniteExtension K i σ) := by + dsimp [equivOpenSubgroupOfFiniteExtension, + openSubgroupOfFiniteIntermediateFieldEquiv, ofFiniteExtension, + ofIntermediateField] + rfl + +/-- The inclusion `G_L → G_K` obtained by identifying `G_L` with the open +subgroup fixing the embedded image `i(L) ⊆ K^al`. -/ +def ofFiniteExtensionAbsolute [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + Field.absoluteGaloisGroup L →* Field.absoluteGaloisGroup K := + ((openSubgroupOfFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)).subtype).comp + (equivOpenSubgroupOfFiniteExtension K i).toMonoidHom + +/-- The inclusion `G_L -> G_K` as a continuous homomorphism. Its range is +the concrete open subgroup fixing `i(L)`. -/ +def ofFiniteExtensionAbsoluteContinuous [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + Field.absoluteGaloisGroup L →ₜ* Field.absoluteGaloisGroup K := + { toMonoidHom := ofFiniteExtensionAbsolute K i + continuous_toFun := by + change Continuous fun σ => + ((equivOpenSubgroupOfFiniteExtension K i σ : + openSubgroupOfFiniteExtension K i) : + Field.absoluteGaloisGroup K) + exact + (continuous_subtype_val.comp + (equivOpenSubgroupOfFiniteExtensionContinuousMulEquiv K i).continuous_toFun) } + +/-- States the theorem `ofFiniteExtensionAbsolute_apply`. -/ +@[simp] +theorem ofFiniteExtensionAbsolute_apply [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) (σ : Field.absoluteGaloisGroup L) : + ofFiniteExtensionAbsolute K i σ = + (equivOpenSubgroupOfFiniteExtension K i σ : + Field.absoluteGaloisGroup K) := + rfl + +/-- States the theorem `ofFiniteExtensionAbsoluteContinuous_apply`. -/ +@[simp] +theorem ofFiniteExtensionAbsoluteContinuous_apply [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) (σ : Field.absoluteGaloisGroup L) : + ofFiniteExtensionAbsoluteContinuous K i σ = + ofFiniteExtensionAbsolute K i σ := + rfl + +/-- States the theorem `ofFiniteExtensionAbsolute_continuous`. -/ +theorem ofFiniteExtensionAbsolute_continuous [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + Continuous (ofFiniteExtensionAbsolute K i) := + (ofFiniteExtensionAbsoluteContinuous K i).continuous_toFun + +/-- States the theorem `openSubgroupOfFiniteExtension_subtype_isOpenEmbedding`. -/ +theorem openSubgroupOfFiniteExtension_subtype_isOpenEmbedding + [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) : + Topology.IsOpenEmbedding (fun σ : openSubgroupOfFiniteExtension K i => + (σ : Field.absoluteGaloisGroup K)) := + (openSubgroupOfFiniteExtension K i : + TopologicalSpace.Opens (Field.absoluteGaloisGroup K)).isOpenEmbedding' + +/-- The inclusion `G_L -> G_K` is an open embedding onto the finite-extension +open subgroup fixing `i(L)`. -/ +theorem ofFiniteExtensionAbsolute_isOpenEmbedding [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + Topology.IsOpenEmbedding (ofFiniteExtensionAbsolute K i) := by + have h := + (openSubgroupOfFiniteExtension_subtype_isOpenEmbedding K i).comp + (equivOpenSubgroupOfFiniteExtensionContinuousMulEquiv K i).toHomeomorph.isOpenEmbedding + change Topology.IsOpenEmbedding fun σ => + ((equivOpenSubgroupOfFiniteExtension K i σ : + openSubgroupOfFiniteExtension K i) : + Field.absoluteGaloisGroup K) + exact h + +/-- The concrete map `G_L → G_K` agrees with the usual scalar-restriction +map after identifying `G_L` with `Gal(K^al / i(L))`. -/ +theorem ofFiniteExtensionAbsolute_eq_ofFiniteExtension + [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup L) : + ofFiniteExtensionAbsolute K i σ = + ofFiniteExtension K i (equivGalFieldRangeOfFiniteExtension K i σ) := by + rw [ofFiniteExtensionAbsolute_apply, + coe_equivOpenSubgroupOfFiniteExtension_apply] + +/-- Every element of `G_L`, viewed inside `G_K`, lies in the finite-extension +open subgroup fixing `i(L)`. -/ +theorem ofFiniteExtensionAbsolute_mem_openSubgroup + [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup L) : + ofFiniteExtensionAbsolute K i σ ∈ openSubgroupOfFiniteExtension K i := by + rw [ofFiniteExtensionAbsolute_apply] + exact (equivOpenSubgroupOfFiniteExtension K i σ).property + +/-- The concrete inclusion `G_L → G_K` attached to an embedded finite extension +is injective. -/ +theorem ofFiniteExtensionAbsolute_injective [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + Function.Injective (ofFiniteExtensionAbsolute K i) := by + intro σ τ hστ + apply (equivOpenSubgroupOfFiniteExtension K i).injective + apply Subtype.ext + exact hστ + +/-- The image of `G_L → G_K` is exactly the finite-extension open subgroup +fixing `i(L)`. -/ +theorem range_ofFiniteExtensionAbsolute [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + MonoidHom.range (ofFiniteExtensionAbsolute K i) = + (openSubgroupOfFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)) := by + rw [ofFiniteExtensionAbsolute, MonoidHom.range_comp] + rw [MonoidHom.range_eq_top_of_surjective _ + (equivOpenSubgroupOfFiniteExtension K i).surjective] + rw [← (MonoidHom.range_eq_map + ((openSubgroupOfFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)).subtype))] + exact Subgroup.range_subtype + (openSubgroupOfFiniteExtension K i : Subgroup (Field.absoluteGaloisGroup K)) + +/-- States the theorem `map_top_ofFiniteExtensionAbsolute`. -/ +theorem map_top_ofFiniteExtensionAbsolute [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + Subgroup.map (ofFiniteExtensionAbsolute K i) ⊤ = + (openSubgroupOfFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)) := by + rw [← MonoidHom.range_eq_map, range_ofFiniteExtensionAbsolute] + +/-- The normal-closure open subgroup is contained in the actual image of +`G_L -> G_K`. -/ +theorem openSubgroupOfNormalClosureFiniteExtension_le_range + [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + (openSubgroupOfNormalClosureFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)) ≤ + MonoidHom.range (ofFiniteExtensionAbsolute K i) := by + rw [range_ofFiniteExtensionAbsolute] + exact openSubgroupOfNormalClosureFiniteExtension_le K i + +/-- States the theorem `range_ofFiniteExtensionAbsolute_finiteIndex`. -/ +theorem range_ofFiniteExtensionAbsolute_finiteIndex [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + (MonoidHom.range (ofFiniteExtensionAbsolute K i)).FiniteIndex := by + rw [range_ofFiniteExtensionAbsolute] + infer_instance + +/-- If the chosen algebraic closure is Galois over `K`, the concrete image of +`G_L → G_K` has index `[L : K]`. -/ +theorem range_ofFiniteExtensionAbsolute_index_eq_finrank + [FiniteDimensional K L] [IsGalois K (AlgebraicClosure K)] + (i : L →ₐ[K] AlgebraicClosure K) : + (MonoidHom.range (ofFiniteExtensionAbsolute K i)).index = + Module.finrank K L := by + rw [range_ofFiniteExtensionAbsolute] + exact openSubgroupOfFiniteExtension_index_eq_finrank K i + +/-- Hence the concrete image of `G_L` in `G_K` is open for finite `L/K`. -/ +theorem isOpen_range_ofFiniteExtensionAbsolute [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : + IsOpen (MonoidHom.range (ofFiniteExtensionAbsolute K i) : + Set (Field.absoluteGaloisGroup K)) := by + rw [range_ofFiniteExtensionAbsolute] + exact (openSubgroupOfFiniteExtension K i).isOpen' + +/-- Conjugating the embedding conjugates the actual image of `G_L -> G_K`. -/ +theorem range_ofFiniteExtensionAbsolute_conjugateEmbedding_eq_map + [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup K) : + MonoidHom.range + (ofFiniteExtensionAbsolute K (conjugateEmbedding K i σ)) = + Subgroup.map (MulAut.conj σ).toMonoidHom + (MonoidHom.range (ofFiniteExtensionAbsolute K i)) := by + rw [range_ofFiniteExtensionAbsolute, range_ofFiniteExtensionAbsolute, + openSubgroupOfFiniteExtension_conjugateEmbedding_eq_map] + +/-- Membership in the image attached to a conjugated embedding can be tested by +conjugating back into the original image. -/ +theorem mem_range_ofFiniteExtensionAbsolute_conjugateEmbedding_iff + [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) + (σ τ : Field.absoluteGaloisGroup K) : + τ ∈ MonoidHom.range + (ofFiniteExtensionAbsolute K (conjugateEmbedding K i σ)) ↔ + σ⁻¹ * τ * σ ∈ MonoidHom.range (ofFiniteExtensionAbsolute K i) := by + rw [range_ofFiniteExtensionAbsolute, range_ofFiniteExtensionAbsolute] + change τ ∈ openSubgroupOfFiniteExtension K (conjugateEmbedding K i σ) ↔ + σ⁻¹ * τ * σ ∈ openSubgroupOfFiniteExtension K i + exact mem_openSubgroupOfFiniteExtension_conjugateEmbedding_iff K i σ τ + +/-- States the theorem `mem_range_ofFiniteExtensionAbsolute_iff`. -/ +theorem mem_range_ofFiniteExtensionAbsolute_iff [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup K) : + σ ∈ MonoidHom.range (ofFiniteExtensionAbsolute K i) ↔ + ∀ x ∈ AlgHom.fieldRange i, + (show Gal(AlgebraicClosure K/K) from σ) x = x := by + rw [range_ofFiniteExtensionAbsolute] + exact mem_openSubgroupOfFiniteExtension K i σ + +/-- The image of `G_L → G_K` is the concrete subgroup fixing `i(L)` +pointwise. -/ +theorem range_ofFiniteExtensionAbsolute_eq_fixingSubgroupOfExtension + [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) : + MonoidHom.range (ofFiniteExtensionAbsolute K i) = + fixingSubgroupOfExtension K i := by + rw [range_ofFiniteExtensionAbsolute, + openSubgroupOfFiniteExtension_toSubgroup_eq_fixingSubgroupOfExtension] + +/-- Provides the instance `instNormal`. -/ +instance range_ofFiniteExtensionAbsolute.instNormal + [FiniteDimensional K L] [Normal K L] + (i : L →ₐ[K] AlgebraicClosure K) : + (MonoidHom.range (ofFiniteExtensionAbsolute K i)).Normal := by + rw [range_ofFiniteExtensionAbsolute] + infer_instance + +/-- For a finite normal extension, the quotient by the actual image of +`G_L -> G_K` is the automorphism group of the embedded field range. -/ +def quotientRangeEquivGalFieldRangeOfNormalFiniteExtension + [FiniteDimensional K L] [Normal K L] + (i : L →ₐ[K] AlgebraicClosure K) : + Field.absoluteGaloisGroup K ⧸ + MonoidHom.range (ofFiniteExtensionAbsolute K i) ≃* + Gal(AlgHom.fieldRange i/K) := + (QuotientGroup.quotientMulEquivOfEq + (range_ofFiniteExtensionAbsolute K i)).trans + (quotientOpenSubgroupEquivGalFieldRangeOfNormalFiniteExtension K i) + +/-- States the theorem `quotientRangeEquivGalFieldRangeOfNormalFiniteExtension_mk'`. -/ +theorem quotientRangeEquivGalFieldRangeOfNormalFiniteExtension_mk' + [FiniteDimensional K L] [Normal K L] + (i : L →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup K) : + quotientRangeEquivGalFieldRangeOfNormalFiniteExtension K i + (QuotientGroup.mk' + (MonoidHom.range (ofFiniteExtensionAbsolute K i)) σ) = + AlgEquiv.restrictNormalHom (AlgHom.fieldRange i) σ := by + rw [quotientRangeEquivGalFieldRangeOfNormalFiniteExtension, + MulEquiv.trans_apply] + change + quotientOpenSubgroupEquivGalFieldRangeOfNormalFiniteExtension K i + (QuotientGroup.mk' + (openSubgroupOfFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)) σ) = + AlgEquiv.restrictNormalHom (AlgHom.fieldRange i) σ + exact quotientOpenSubgroupEquivGalFieldRangeOfNormalFiniteExtension_mk' K i σ + +/-- For a finite normal extension, `G_K/G_L` is `Gal(L/K)` when `G_L` is +written as the actual image of `G_L -> G_K`. -/ +def quotientRangeEquivGalOfNormalFiniteExtension + [FiniteDimensional K L] [Normal K L] + (i : L →ₐ[K] AlgebraicClosure K) : + Field.absoluteGaloisGroup K ⧸ + MonoidHom.range (ofFiniteExtensionAbsolute K i) ≃* + Gal(L/K) := + (quotientRangeEquivGalFieldRangeOfNormalFiniteExtension K i).trans + (AlgEquiv.autCongr (AlgEquiv.ofInjectiveField i)).symm + +/-- States the theorem `quotientRangeEquivGalOfNormalFiniteExtension_mk'`. -/ +theorem quotientRangeEquivGalOfNormalFiniteExtension_mk' + [FiniteDimensional K L] [Normal K L] + (i : L →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup K) : + quotientRangeEquivGalOfNormalFiniteExtension K i + (QuotientGroup.mk' + (MonoidHom.range (ofFiniteExtensionAbsolute K i)) σ) = + (AlgEquiv.autCongr (AlgEquiv.ofInjectiveField i)).symm + ((@AlgEquiv.restrictNormalHom K _ (AlgebraicClosure K) _ _ + (AlgHom.fieldRange i) _ _ _ (fieldRangeIsScalarTower K i) _) σ) := by + exact congrArg (AlgEquiv.autCongr (AlgEquiv.ofInjectiveField i)).symm + (quotientRangeEquivGalFieldRangeOfNormalFiniteExtension_mk' K i σ) + +section TwoFiniteExtensions + +variable {M : Type w} [Field M] [Algebra K M] + +/-- The images of absolute Galois groups inside `G_K` are contravariant in +embedded finite extensions. -/ +theorem range_ofFiniteExtensionAbsolute_le_of_fieldRange_le + [FiniteDimensional K L] [FiniteDimensional K M] + (iL : L →ₐ[K] AlgebraicClosure K) + (iM : M →ₐ[K] AlgebraicClosure K) + (h : AlgHom.fieldRange iL ≤ AlgHom.fieldRange iM) : + MonoidHom.range (ofFiniteExtensionAbsolute K iM) ≤ + MonoidHom.range (ofFiniteExtensionAbsolute K iL) := by + rw [range_ofFiniteExtensionAbsolute, range_ofFiniteExtensionAbsolute] + exact openSubgroupOfFiniteExtension_le_of_fieldRange_le K iL iM h + +/-- For a tower embedding `L -> M -> K^al`, the image of `G_M` in `G_K` is +contained in the image of `G_L` in `G_K`. -/ +theorem range_ofFiniteExtensionAbsolute_comp_le + [FiniteDimensional K L] [FiniteDimensional K M] + (i : M →ₐ[K] AlgebraicClosure K) (j : L →ₐ[K] M) : + MonoidHom.range (ofFiniteExtensionAbsolute K i) ≤ + MonoidHom.range (ofFiniteExtensionAbsolute K (i.comp j)) := by + rw [range_ofFiniteExtensionAbsolute, range_ofFiniteExtensionAbsolute] + exact openSubgroupOfFiniteExtension_comp_le K i j + +/-- States the theorem `openSubgroupOfFiniteExtensionSup_eq_range_inf`. -/ +theorem openSubgroupOfFiniteExtensionSup_eq_range_inf + [FiniteDimensional K L] [FiniteDimensional K M] + (iL : L →ₐ[K] AlgebraicClosure K) + (iM : M →ₐ[K] AlgebraicClosure K) : + (openSubgroupOfFiniteExtensionSup K iL iM : + Subgroup (Field.absoluteGaloisGroup K)) = + MonoidHom.range (ofFiniteExtensionAbsolute K iL) ⊓ + MonoidHom.range (ofFiniteExtensionAbsolute K iM) := by + rw [openSubgroupOfFiniteExtensionSup_toSubgroup, + range_ofFiniteExtensionAbsolute, range_ofFiniteExtensionAbsolute] + +/-- States the theorem `mem_range_ofFiniteExtensionAbsolute_inf_iff`. -/ +theorem mem_range_ofFiniteExtensionAbsolute_inf_iff + [FiniteDimensional K L] [FiniteDimensional K M] + (iL : L →ₐ[K] AlgebraicClosure K) + (iM : M →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup K) : + σ ∈ MonoidHom.range (ofFiniteExtensionAbsolute K iL) ⊓ + MonoidHom.range (ofFiniteExtensionAbsolute K iM) ↔ + (∀ x : L, (show Gal(AlgebraicClosure K/K) from σ) (iL x) = iL x) ∧ + ∀ y : M, (show Gal(AlgebraicClosure K/K) from σ) (iM y) = iM y := by + rw [← openSubgroupOfFiniteExtensionSup_eq_range_inf] + change + σ ∈ openSubgroupOfFiniteExtensionSup K iL iM ↔ + (∀ x : L, (show Gal(AlgebraicClosure K/K) from σ) (iL x) = iL x) ∧ + ∀ y : M, (show Gal(AlgebraicClosure K/K) from σ) (iM y) = iM y + exact mem_openSubgroupOfFiniteExtensionSup_iff_forall_apply_eq K iL iM σ + +end TwoFiniteExtensions + +/-- Concrete range criterion for the identified inclusion `G_L → G_K`. -/ +theorem mem_range_ofFiniteExtensionAbsolute_iff_forall_apply_eq + [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup K) : + σ ∈ MonoidHom.range (ofFiniteExtensionAbsolute K i) ↔ + ∀ x : L, (show Gal(AlgebraicClosure K/K) from σ) (i x) = i x := by + rw [range_ofFiniteExtensionAbsolute_eq_fixingSubgroupOfExtension] + rfl + +/-- States the theorem `ofFiniteExtensionAbsolute_apply_embedding`. -/ +theorem ofFiniteExtensionAbsolute_apply_embedding + [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup L) (x : L) : + (show Gal(AlgebraicClosure K/K) from + ofFiniteExtensionAbsolute K i σ) (i x) = i x := by + exact (mem_openSubgroupOfFiniteExtension_iff_forall_apply_eq K i + (ofFiniteExtensionAbsolute K i σ)).1 + (ofFiniteExtensionAbsolute_mem_openSubgroup K i σ) x + +/-- States the theorem `coe_toOpenSubgroupOfFiniteExtension_apply_embedding`. -/ +theorem coe_toOpenSubgroupOfFiniteExtension_apply_embedding + [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup L) (x : L) : + (show Gal(AlgebraicClosure K/K) from + ((toOpenSubgroupOfFiniteExtension K i σ : + openSubgroupOfFiniteExtension K i) : + Field.absoluteGaloisGroup K)) (i x) = i x := by + simpa [ofFiniteExtensionAbsolute_apply] + using ofFiniteExtensionAbsolute_apply_embedding K i σ x + +/-- States the theorem `exists_ofFiniteExtensionAbsolute_eq_iff_mem_openSubgroup`. -/ +theorem exists_ofFiniteExtensionAbsolute_eq_iff_mem_openSubgroup + [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup K) : + (∃ τ : Field.absoluteGaloisGroup L, + ofFiniteExtensionAbsolute K i τ = σ) ↔ + σ ∈ openSubgroupOfFiniteExtension K i := by + rw [← MonoidHom.mem_range, range_ofFiniteExtensionAbsolute] + rfl + +/-- States the theorem `ofFiniteExtensionAbsolute_equivOpenSubgroupOfFiniteExtension_symm`. -/ +theorem ofFiniteExtensionAbsolute_equivOpenSubgroupOfFiniteExtension_symm + [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) + (σ : openSubgroupOfFiniteExtension K i) : + ofFiniteExtensionAbsolute K i + ((equivOpenSubgroupOfFiniteExtension K i).symm σ) = + (σ : Field.absoluteGaloisGroup K) := by + rw [ofFiniteExtensionAbsolute_apply] + simp + +section TwoFiniteExtensionsTower + +variable {M : Type w} [Field M] [Algebra K M] + +/-- The tower restriction map `G_M -> G_L` induced by embeddings +`L -> M -> K^al`, constructed through the concrete open-subgroup +identifications inside `G_K`. -/ +def ofFiniteExtensionAbsoluteTower + [FiniteDimensional K L] [FiniteDimensional K M] + (i : M →ₐ[K] AlgebraicClosure K) (j : L →ₐ[K] M) : + Field.absoluteGaloisGroup M →* Field.absoluteGaloisGroup L := + let hle : + (openSubgroupOfFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)) ≤ + openSubgroupOfFiniteExtension K (i.comp j) := + openSubgroupOfFiniteExtension_comp_le K i j + let φ : Field.absoluteGaloisGroup M →* + openSubgroupOfFiniteExtension K (i.comp j) := + { toFun := fun σ => + ⟨ofFiniteExtensionAbsolute K i σ, + hle (ofFiniteExtensionAbsolute_mem_openSubgroup K i σ)⟩ + map_one' := by + ext + simp [ofFiniteExtensionAbsolute] + map_mul' := by + intro σ τ + ext + simp [ofFiniteExtensionAbsolute] } + ((equivOpenSubgroupOfFiniteExtension K (i.comp j)).symm.toMonoidHom).comp φ + +/-- The tower map is natural with respect to the concrete inclusions into +`G_K`: the inclusion `G_L -> G_K` after `G_M -> G_L` is the inclusion +`G_M -> G_K`. -/ +theorem ofFiniteExtensionAbsoluteTower_naturality + [FiniteDimensional K L] [FiniteDimensional K M] + (i : M →ₐ[K] AlgebraicClosure K) (j : L →ₐ[K] M) + (σ : Field.absoluteGaloisGroup M) : + ofFiniteExtensionAbsolute K (i.comp j) + (ofFiniteExtensionAbsoluteTower K i j σ) = + ofFiniteExtensionAbsolute K i σ := by + let hle : + (openSubgroupOfFiniteExtension K i : + Subgroup (Field.absoluteGaloisGroup K)) ≤ + openSubgroupOfFiniteExtension K (i.comp j) := + openSubgroupOfFiniteExtension_comp_le K i j + let s : openSubgroupOfFiniteExtension K (i.comp j) := + ⟨ofFiniteExtensionAbsolute K i σ, + hle (ofFiniteExtensionAbsolute_mem_openSubgroup K i σ)⟩ + unfold ofFiniteExtensionAbsoluteTower + change + ofFiniteExtensionAbsolute K (i.comp j) + ((equivOpenSubgroupOfFiniteExtension K (i.comp j)).symm s) = + ofFiniteExtensionAbsolute K i σ + exact ofFiniteExtensionAbsolute_equivOpenSubgroupOfFiniteExtension_symm + K (i.comp j) s + +/-- The tower map `G_M -> G_L` is injective. -/ +theorem ofFiniteExtensionAbsoluteTower_injective + [FiniteDimensional K L] [FiniteDimensional K M] + (i : M →ₐ[K] AlgebraicClosure K) (j : L →ₐ[K] M) : + Function.Injective (ofFiniteExtensionAbsoluteTower K i j) := by + intro σ τ hστ + apply ofFiniteExtensionAbsolute_injective K i + rw [← ofFiniteExtensionAbsoluteTower_naturality K i j σ, + hστ, ofFiniteExtensionAbsoluteTower_naturality K i j τ] + +/-- The image of the tower map `G_M -> G_L` is the pullback, along +`G_L -> G_K`, of the image of `G_M -> G_K`. -/ +theorem map_top_ofFiniteExtensionAbsoluteTower_eq_comap_range + [FiniteDimensional K L] [FiniteDimensional K M] + (i : M →ₐ[K] AlgebraicClosure K) (j : L →ₐ[K] M) : + Subgroup.map (ofFiniteExtensionAbsoluteTower K i j) ⊤ = + Subgroup.comap (ofFiniteExtensionAbsolute K (i.comp j)) + (MonoidHom.range (ofFiniteExtensionAbsolute K i)) := by + ext σ + constructor + · rintro ⟨τ, -, rfl⟩ + rw [Subgroup.mem_comap] + exact ⟨τ, (ofFiniteExtensionAbsoluteTower_naturality K i j τ).symm⟩ + · intro hσ + rw [Subgroup.mem_comap] at hσ + rcases hσ with ⟨τ, hτ⟩ + refine ⟨τ, trivial, ?_⟩ + apply ofFiniteExtensionAbsolute_injective K (i.comp j) + rw [ofFiniteExtensionAbsoluteTower_naturality K i j τ] + exact hτ + +end TwoFiniteExtensionsTower + +/-- Elements of the finite-extension open subgroup of `G_K` have a unique +preimage in the identified absolute Galois group `G_L`. -/ +theorem existsUnique_ofFiniteExtensionAbsolute_eq_of_mem_openSubgroup + [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup K) + (hσ : σ ∈ openSubgroupOfFiniteExtension K i) : + ∃! τ : Field.absoluteGaloisGroup L, + ofFiniteExtensionAbsolute K i τ = σ := by + let s : openSubgroupOfFiniteExtension K i := ⟨σ, hσ⟩ + refine ⟨(equivOpenSubgroupOfFiniteExtension K i).symm s, ?_, ?_⟩ + · exact ofFiniteExtensionAbsolute_equivOpenSubgroupOfFiniteExtension_symm K i s + · intro τ hτ + exact ofFiniteExtensionAbsolute_injective K i (by + rw [hτ, + ofFiniteExtensionAbsolute_equivOpenSubgroupOfFiniteExtension_symm K i s]) + +/-- Concrete unique-preimage criterion for the identified inclusion +`G_L → G_K`. -/ +theorem existsUnique_ofFiniteExtensionAbsolute_eq_iff_forall_apply_eq + [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) + (σ : Field.absoluteGaloisGroup K) : + (∃! τ : Field.absoluteGaloisGroup L, + ofFiniteExtensionAbsolute K i τ = σ) ↔ + ∀ x : L, (show Gal(AlgebraicClosure K/K) from σ) (i x) = i x := by + constructor + · rintro ⟨τ, hτ, _⟩ x + rw [← hτ] + exact ofFiniteExtensionAbsolute_apply_embedding K i τ x + · intro hσ + exact existsUnique_ofFiniteExtensionAbsolute_eq_of_mem_openSubgroup K i σ + ((mem_openSubgroupOfFiniteExtension_iff_forall_apply_eq K i σ).2 hσ) + +end FiniteExtension + +end absoluteGaloisGroup +end Field + +namespace DiscreteValuationField +namespace HenselianDVF + +variable {K : Type u} [Field K] + +/-- Finite-level membership preservation for the absolute valuation subring, +exposed from the Henselian-DVF namespace. The finite-level Henselian-DVF +target and unique-extension proof are explicit; this is the non-dummy wrapper +used by the absolute power route. -/ +theorem mem_absoluteValuationSubring_iff_apply_mem_of_finite_separable_intermediate + (F : ValuationTheory.DiscreteValuationField.HenselianDVF.{u, v} K) + (A : ValuationSubring (AlgebraicClosure K)) + [_root_.Valuation.HasExtension F.valuation A.valuation] + (E : IntermediateField K (AlgebraicClosure K)) + [FiniteDimensional K E] [Algebra.IsSeparable K E] + (target : ValuationTheory.DiscreteValuationField.HenselianDVF.{u, w} E) + (hA : target.valuation.valuationSubring = + (RamificationTheory.ValuationSubring.restrictIntermediateField A E)) + (huniq : + ValuationTheory.DiscreteValuationField.HenselianDVF.HasUniqueValuationExtension.{u, v, u, + w, u} + F target) + (sigma : Field.absoluteGaloisGroup K) (x : E) : + ((x : AlgebraicClosure K) ∈ A) ↔ + (show Gal(AlgebraicClosure K/K) from sigma) (x : AlgebraicClosure K) ∈ A := + valuationSubring_mem_preserved_on_finite_separable_intermediate + (K := K) F A E target hA huniq sigma x + +end HenselianDVF +end DiscreteValuationField + +end + +end RamificationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteLevelValuationRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteLevelValuationRestriction.lean new file mode 100644 index 0000000000..e57b6713c3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteLevelValuationRestriction.lean @@ -0,0 +1,348 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Complete +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.AdicLimits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Assembly +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.CoefficientMinimum +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Complete +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DegreeBounds +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DivisionBounds +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.ErrorPowers +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.FiniteApproximation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.InfiniteApproximation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Iteration +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.PrincipalLimits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Step +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Truncation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.WeakLimits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialBounds +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialLifting +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.MonicFactorization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.NonmonicReduction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveFactorization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveReduction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueAlgebraicExtensions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionPrimitive +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionReduction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.ValuationExtensionCriterion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.Ramification +public import Mathlib.Algebra.Exact.Basic +public import Mathlib.FieldTheory.AbsoluteGaloisGroup +public import Mathlib.FieldTheory.Galois.Infinite +public import Mathlib.FieldTheory.Galois.Profinite +public import Mathlib.FieldTheory.PurelyInseparable.Basic +public import Mathlib.RingTheory.Valuation.RamificationGroup +public import Mathlib.Topology.Algebra.ContinuousMonoidHom +public import Mathlib.Topology.Maps.Basic +public import Mathlib.Topology.Sets.Opens + +/-! # Finite Level Valuation Restriction -/ + +@[expose] public section +namespace RamificationTheory + +open ValuationTheory +open ValuationTheory.DiscreteValuationField.HenselianDVF + +/-! +# Finite-level valuation restriction for absolute Galois arguments + +This file isolates the valuation-restriction and separable-power lemmas +used to pass from absolute Galois questions to finite intermediate fields. +-/ + +noncomputable +section + +universe u v w z + +namespace ValuationSubring + +variable {K : Type u} [Field K] (A : ValuationSubring K) + +/-- Membership in a valuation subring is detected by any positive natural +power. + +This is useful in absolute arguments: after moving an element into a finite +separable level only after taking a positive power, valuation-subring +membership can be pulled back to the original element. -/ +theorem mem_iff_pow_mem (x : K) {n : ℕ} (hn : 0 < n) : + x ∈ A ↔ x ^ n ∈ A := by + constructor + · intro hx + exact A.toSubring.pow_mem hx n + · intro hxpow + induction n with + | zero => + cases hn + | succ n ih => + by_cases hn0 : n = 0 + · simpa [hn0] using hxpow + · have hnpos : 0 < n := Nat.pos_of_ne_zero hn0 + by_cases hx0 : x = 0 + · simp [hx0] + rcases A.mem_or_inv_mem x with hx | hxinv + · exact hx + · have hxpred : x ^ n ∈ A := by + have hmul : x ^ (n + 1) * x⁻¹ ∈ A := + A.mul_mem _ _ hxpow hxinv + have hpow : x ^ (n + 1) * x⁻¹ = x ^ n := by + rw [pow_succ, mul_assoc, mul_inv_cancel₀, mul_one] + exact hx0 + simpa [hpow] using hmul + exact ih hnpos hxpred + +/-- States the theorem `mem_of_pow_mem`. -/ +theorem mem_of_pow_mem (x : K) {n : ℕ} (hn : 0 < n) (hx : x ^ n ∈ A) : + x ∈ A := + (mem_iff_pow_mem A x hn).2 hx + +/-- States the theorem `pow_mem_iff_mem`. -/ +theorem pow_mem_iff_mem (x : K) {n : ℕ} (hn : 0 < n) : + x ^ n ∈ A ↔ x ∈ A := + (mem_iff_pow_mem A x hn).symm + +section RestrictIntermediateField + +variable {K : Type u} {Ω : Type v} [Field K] [Field Ω] [Algebra K Ω] + +/-- Restrict a valuation subring of an ambient field to an intermediate field. -/ +def restrictIntermediateField + (A : ValuationSubring Ω) (E : IntermediateField K Ω) : + ValuationSubring E := + A.comap (algebraMap E Ω) + +/-- States the theorem `restrictIntermediateField_eq_comap`. -/ +@[simp] theorem restrictIntermediateField_eq_comap + (A : ValuationSubring Ω) (E : IntermediateField K Ω) : + (restrictIntermediateField A E) = A.comap (algebraMap E Ω) := + rfl + +/-- States the theorem `mem_restrictIntermediateField_iff`. -/ +theorem mem_restrictIntermediateField_iff + (A : ValuationSubring Ω) (E : IntermediateField K Ω) (x : E) : + x ∈ (restrictIntermediateField A E) ↔ (x : Ω) ∈ A := + Iff.rfl + +/-- States the theorem `restrictIntermediateField_hasExtension`. -/ +theorem restrictIntermediateField_hasExtension + {Γ : Type w} [LinearOrderedCommGroupWithZero Γ] + (v : Valuation K Γ) (A : ValuationSubring Ω) + [_root_.Valuation.HasExtension v A.valuation] + (E : IntermediateField K Ω) : + _root_.Valuation.HasExtension v ((restrictIntermediateField A E)).valuation := by + apply _root_.Valuation.HasExtension.ofComapInteger + ext x + simp only [Subring.mem_comap, Valuation.mem_integer_iff, + ValuationSubring.valuation_le_one_iff, + mem_restrictIntermediateField_iff] + change algebraMap E Ω (algebraMap K E x) ∈ A ↔ v x ≤ 1 + rw [← IsScalarTower.algebraMap_apply K E Ω x] + rw [← A.valuation_le_one_iff (algebraMap K Ω x)] + exact _root_.Valuation.HasExtension.val_map_le_one_iff + (vR := v) (vA := A.valuation) x + +open scoped Pointwise + +/-- Membership in the inverse translate is the same as membership after +applying the automorphism. -/ +theorem mem_inv_smul_iff_apply_mem + (A : ValuationSubring Ω) (σ : Ω ≃ₐ[K] Ω) (z : Ω) : + z ∈ σ⁻¹ • A ↔ σ z ∈ A := by + simpa [AlgEquiv.smul_def] using + (ValuationSubring.mem_inv_pointwise_smul_iff + (g := σ) (S := A) (x := z)) + +/-- Membership in an automorphic translate is membership after applying the +inverse automorphism. -/ +theorem mem_smul_valuationSubring_iff + (A : ValuationSubring Ω) (σ : Ω ≃ₐ[K] Ω) (z : Ω) : + z ∈ σ • A ↔ σ⁻¹ z ∈ A := by + simpa [AlgEquiv.smul_def] using + (ValuationSubring.mem_pointwise_smul_iff_inv_smul_mem + (g := σ) (S := A) (x := z)) + +/-- A `K`-algebra automorphic translate of an extension valuation subring is +again an extension of the base valuation. -/ +theorem smul_hasExtension + {Γ : Type w} [LinearOrderedCommGroupWithZero Γ] + (v : Valuation K Γ) (A : ValuationSubring Ω) + [_root_.Valuation.HasExtension v A.valuation] + (σ : Ω ≃ₐ[K] Ω) : + _root_.Valuation.HasExtension v (σ • A).valuation := by + apply _root_.Valuation.HasExtension.ofComapInteger + ext x + simp only [ValuationSubring.integer_valuation, ValuationSubring.pointwise_smul_toSubring, + Subring.mem_comap, Valuation.mem_integer_iff] + rw [Subring.mem_pointwise_smul_iff_inv_smul_mem] + have hcomm : (σ⁻¹) (algebraMap K Ω x) = algebraMap K Ω x := + (σ⁻¹).commutes x + change (σ⁻¹) (algebraMap K Ω x) ∈ A.toSubring ↔ v x ≤ 1 + rw [hcomm] + change (algebraMap K Ω x) ∈ A ↔ v x ≤ 1 + rw [← A.valuation_le_one_iff (algebraMap K Ω x)] + exact _root_.Valuation.HasExtension.val_map_le_one_iff + (vR := v) (vA := A.valuation) x + +/-- Restricting an automorphic translate to an intermediate field preserves +the extension property over the base valuation. -/ +theorem restrictIntermediateField_smul_hasExtension + {Γ : Type w} [LinearOrderedCommGroupWithZero Γ] + (v : Valuation K Γ) (A : ValuationSubring Ω) + [_root_.Valuation.HasExtension v A.valuation] + (σ : Ω ≃ₐ[K] Ω) (E : IntermediateField K Ω) : + _root_.Valuation.HasExtension v ((restrictIntermediateField (σ • A) E)).valuation := by + have hσ : _root_.Valuation.HasExtension v (σ • A).valuation := + smul_hasExtension v A σ + exact restrictIntermediateField_hasExtension + (v := v) (A := σ • A) E + +/-- The inverse translate used in absolute Galois stabilization also restricts +to an extension of the base valuation. -/ +theorem restrictIntermediateField_inv_smul_hasExtension + {Γ : Type w} [LinearOrderedCommGroupWithZero Γ] + (v : Valuation K Γ) (A : ValuationSubring Ω) + [_root_.Valuation.HasExtension v A.valuation] + (σ : Ω ≃ₐ[K] Ω) (E : IntermediateField K Ω) : + _root_.Valuation.HasExtension v ((restrictIntermediateField (σ⁻¹ • A) E)).valuation := + restrictIntermediateField_smul_hasExtension v A σ⁻¹ E + +/-- Under finite-level uniqueness, the restriction of `A` is equal to the +restriction of its inverse automorphic translate. -/ +theorem restrictIntermediateField_eq_inv_smul_restrictIntermediateField_of_unique + {Γ : Type w} [LinearOrderedCommGroupWithZero Γ] + (v : Valuation K Γ) (A : ValuationSubring Ω) + [_root_.Valuation.HasExtension v A.valuation] + (E : IntermediateField K Ω) + (huniq : + ∀ (B : ValuationSubring E) + [_root_.Valuation.HasExtension v B.valuation], + (restrictIntermediateField A E) = B) + (σ : Ω ≃ₐ[K] Ω) : + (restrictIntermediateField A E) = (restrictIntermediateField (σ⁻¹ • A) E) := by + have hC : _root_.Valuation.HasExtension v + ((restrictIntermediateField (σ⁻¹ • A) E)).valuation := + restrictIntermediateField_inv_smul_hasExtension v A σ E + exact huniq ((restrictIntermediateField (σ⁻¹ • A) E)) + +/-- If the restricted valuation on a finite level is the unique extension of +the base valuation, then every ambient `K`-automorphism preserves membership +in the ambient valuation subring on that level. -/ +theorem mem_algEquiv_apply_iff_of_restrictIntermediateField_unique + {Γ : Type w} [LinearOrderedCommGroupWithZero Γ] + (v : Valuation K Γ) (A : ValuationSubring Ω) + [_root_.Valuation.HasExtension v A.valuation] + (E : IntermediateField K Ω) + (huniq : + ∀ (B : ValuationSubring E) + [_root_.Valuation.HasExtension v B.valuation], + (restrictIntermediateField A E) = B) + (σ : Ω ≃ₐ[K] Ω) (x : E) : + ((x : Ω) ∈ A) ↔ σ (x : Ω) ∈ A := by + let B : ValuationSubring E := (restrictIntermediateField A E) + let C : ValuationSubring E := (restrictIntermediateField (σ⁻¹ • A) E) + have hBC : B = C := by + simpa [B, C] using + restrictIntermediateField_eq_inv_smul_restrictIntermediateField_of_unique + v A E huniq σ + constructor + · intro hx + have hxB : x ∈ B := by + simpa [B] using hx + have hxC : x ∈ C := by + simpa [hBC] using hxB + have hxInv : (x : Ω) ∈ σ⁻¹ • A := by + simpa [C] using hxC + exact (mem_inv_smul_iff_apply_mem A σ (x : Ω)).1 hxInv + · intro hxσ + have hxInv : (x : Ω) ∈ σ⁻¹ • A := by + exact (mem_inv_smul_iff_apply_mem A σ (x : Ω)).2 hxσ + have hxC : x ∈ C := by + simpa [C] using hxInv + have hxB : x ∈ B := by + simpa [hBC] using hxC + simpa [B] using hxB + +/-- A Henselian-DVF unique-extension package on the finite level supplies the +membership preservation core needed for the absolute power route. -/ +theorem mem_algEquiv_apply_iff_of_restrictIntermediateField_henselianUnique + (base : ValuationTheory.DiscreteValuationField.HenselianDVF.{u, w} K) + (A : ValuationSubring Ω) + [_root_.Valuation.HasExtension base.valuation A.valuation] + (E : IntermediateField K Ω) + (target : ValuationTheory.DiscreteValuationField.HenselianDVF.{v, z} E) + (hA : target.valuation.valuationSubring = (restrictIntermediateField A E)) + (huniq : + HasUniqueValuationExtension.{u, w, v, z, v} + base target) + (σ : Ω ≃ₐ[K] Ω) (x : E) : + ((x : Ω) ∈ A) ↔ σ (x : Ω) ∈ A := by + refine + mem_algEquiv_apply_iff_of_restrictIntermediateField_unique + base.valuation A E ?_ σ x + intro B hB + have htarget : + target.valuation.valuationSubring = B := by + have hsub := + valuationSubring_eq_of_hasUniqueValuationExtension + base target huniq B.valuation + simpa [ValuationSubring.valuationSubring_valuation] using hsub + exact hA.symm.trans htarget + +end RestrictIntermediateField + +end ValuationSubring + +/-- A power of an algebraic element lies in a finite separable intermediate +field. + +This packages the standard reduction through the separable closure: an +algebraic extension is purely inseparable over its separable closure, so a +positive power of the element lands in the separable closure, and adjoining +that power gives the finite separable level. -/ +theorem exists_finite_separable_intermediate_pow_mem + {K : Type u} {Ω : Type v} [Field K] [Field Ω] [Algebra K Ω] + [Algebra.IsAlgebraic K Ω] (z : Ω) : + ∃ n : ℕ, ∃ E : IntermediateField K Ω, + 0 < n ∧ FiniteDimensional K E ∧ Algebra.IsSeparable K E ∧ z ^ n ∈ E := by + let S : IntermediateField K Ω := separableClosure K Ω + let q : ℕ := ringExpChar S + have hq : 0 < q := by + dsimp [q, ringExpChar] + exact Nat.lt_of_lt_of_le Nat.zero_lt_one (Nat.le_max_right _ _) + obtain ⟨m, y, hy⟩ := IsPurelyInseparable.pow_mem S q z + refine ⟨q ^ m, IntermediateField.adjoin K ({z ^ (q ^ m)} : Set Ω), + pow_pos hq m, ?_, ?_, ?_⟩ + · exact IntermediateField.adjoin.finiteDimensional + (Algebra.IsIntegral.isIntegral (R := K) (z ^ (q ^ m))) + · have hmem : z ^ (q ^ m) ∈ separableClosure K Ω := by + have hmem' : algebraMap S Ω y ∈ separableClosure K Ω := by + simp [S, y.2] + simpa [hy] using hmem' + exact (IntermediateField.isSeparable_adjoin_simple_iff_isSeparable + (F := K) (E := Ω)).2 (mem_separableClosure_iff.1 hmem) + · exact IntermediateField.mem_adjoin_simple_self K (z ^ (q ^ m)) + +/-- A positive power of any algebraic element is separable over the base. -/ +theorem exists_pow_isSeparable_of_isAlgebraic + {K : Type u} {Ω : Type v} [Field K] [Field Ω] [Algebra K Ω] + [Algebra.IsAlgebraic K Ω] (z : Ω) : + ∃ n : ℕ, 0 < n ∧ IsSeparable K (z ^ n) := by + obtain ⟨n, E, hn, _hFin, hSep, hzE⟩ := + RamificationTheory.exists_finite_separable_intermediate_pow_mem (K := K) z + let : Algebra.IsSeparable K E := hSep + exact ⟨n, hn, (mem_separableClosure_iff).1 ((le_separableClosure K Ω E) hzE)⟩ + + +end + +end RamificationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean new file mode 100644 index 0000000000..4344bcd539 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean @@ -0,0 +1,1753 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.AbsoluteRamification +/-! Provides the public declarations in the + `RamificationTheory.GaloisValuation.AbsoluteGalois.InfiniteGaloisCorrespondence` Lean module. -/ + +@[expose] public section + +namespace RamificationTheory + +open ValuationTheory + +noncomputable +section + +universe u v w z + +namespace Field +namespace absoluteGaloisGroup + +open scoped Topology Pointwise +open CategoryTheory + +private theorem quotientAction_ker_eq_normalCore + {G : Type*} [Group G] (H : Subgroup G) : + (MulAction.toPermHom G (G ⧸ H)).ker = H.normalCore := by + ext g + constructor + · intro hg b + have hq : g • (QuotientGroup.mk (b⁻¹) : G ⧸ H) = + QuotientGroup.mk (b⁻¹) := by + have := congrArg + (fun e : Equiv.Perm (G ⧸ H) => e (QuotientGroup.mk (b⁻¹))) hg + simpa using this + have hmem : (g * b⁻¹)⁻¹ * b⁻¹ ∈ H := QuotientGroup.eq.1 hq + have hinv := H.inv_mem hmem + simpa [mul_assoc] using hinv + · intro hg + ext q + refine Quotient.inductionOn q ?_ + intro b + apply QuotientGroup.eq.2 + have hmem := hg (b⁻¹) + have hinv := H.inv_mem hmem + simpa [mul_assoc] using hinv + +private theorem normalCore_finiteIndex_of_finite_quotient + {G : Type*} [Group G] (H : Subgroup G) [Finite (G ⧸ H)] : + H.normalCore.FiniteIndex := by + rw [← quotientAction_ker_eq_normalCore H, Subgroup.finiteIndex_iff, + Subgroup.index_ker] + exact ne_of_gt Nat.card_pos + +private theorem finiteDimensional_comap_algEquiv + {F : Type u} {A : Type v} {B : Type w} [Field F] [Field A] [Field B] + [Algebra F A] [Algebra F B] + (e : A ≃ₐ[F] B) (E : IntermediateField F B) + [FiniteDimensional F E] : + FiniteDimensional F (E.comap e.toAlgHom) := by + let Ecomap : IntermediateField F A := E.comap e.toAlgHom + let eLin : Ecomap ≃ₗ[F] E := + { toFun := fun x => ⟨e x.1, x.2⟩ + invFun := fun x => ⟨e.symm x.1, by + change e (e.symm x.1) ∈ E + rw [e.apply_symm_apply] + exact x.2⟩ + left_inv := by + intro x + ext + exact e.symm_apply_apply x.1 + right_inv := by + intro x + ext + exact e.apply_symm_apply x.1 + map_add' := by + intro x y + ext + simp + map_smul' := by + intro a x + ext + simp } + exact Module.Finite.equiv eLin.symm + +private theorem finiteDimensional_map_algEquiv + {F : Type u} {A : Type v} {B : Type w} [Field F] [Field A] [Field B] + [Algebra F A] [Algebra F B] + (e : A ≃ₐ[F] B) (E : IntermediateField F A) + [FiniteDimensional F E] : + FiniteDimensional F (E.map e.toAlgHom) := by + let Emap : IntermediateField F B := E.map e.toAlgHom + let eLin : E ≃ₗ[F] Emap := + { toFun := fun x => ⟨e x.1, ⟨x.1, x.2, rfl⟩⟩ + invFun := fun x => ⟨e.symm x.1, by + rcases x.2 with ⟨y, hy, hxy⟩ + rw [← hxy] + simpa using hy⟩ + left_inv := by + intro x + ext + exact e.symm_apply_apply x.1 + right_inv := by + intro x + ext + exact e.apply_symm_apply x.1 + map_add' := by + intro x y + ext + simp + map_smul' := by + intro a x + ext + exact e.toLinearEquiv.map_smul a x.1 } + exact Module.Finite.equiv eLin + +/-- Pull back an intermediate field along a ring equivalence which is +semilinear over a base-field equivalence. This is the finite-level source +needed for Krull-continuity of conjugation by such a semilinear equivalence. -/ +def semilinearRingEquivPreimageIntermediateField + {F : Type u} {F' : Type w} {Ω : Type v} {Ω' : Type z} + [Field F] [Field F'] [Field Ω] [Field Ω'] + [Algebra F Ω] [Algebra F' Ω'] + (τ : F ≃+* F') (e : Ω ≃+* Ω') + (he : ∀ x : F, + e (algebraMap F Ω x) = algebraMap F' Ω' (τ x)) + (E : IntermediateField F' Ω') : IntermediateField F Ω where + carrier := {x : Ω | e x ∈ E} + zero_mem' := by + simp + one_mem' := by + simp + add_mem' := by + intro x y hx hy + simpa using E.add_mem hx hy + mul_mem' := by + intro x y hx hy + simpa using E.mul_mem hx hy + inv_mem' := by + intro x hx + simpa using E.inv_mem hx + algebraMap_mem' := by + intro x + change e (algebraMap F Ω x) ∈ E + rw [he x] + exact E.algebraMap_mem (τ x) + +/-- States the theorem `mem_semilinearRingEquivPreimageIntermediateField_iff`. -/ +@[simp] +theorem mem_semilinearRingEquivPreimageIntermediateField_iff + {F : Type u} {F' : Type w} {Ω : Type v} {Ω' : Type z} + [Field F] [Field F'] [Field Ω] [Field Ω'] + [Algebra F Ω] [Algebra F' Ω'] + (τ : F ≃+* F') (e : Ω ≃+* Ω') + (he : ∀ x : F, + e (algebraMap F Ω x) = algebraMap F' Ω' (τ x)) + (E : IntermediateField F' Ω') (x : Ω) : + x ∈ semilinearRingEquivPreimageIntermediateField τ e he E ↔ e x ∈ E := + Iff.rfl + +/-- States the theorem `semilinearRingEquivPreimageIntermediateField_symm_mem`. -/ +theorem semilinearRingEquivPreimageIntermediateField_symm_mem + {F : Type u} {F' : Type w} {Ω : Type v} {Ω' : Type z} + [Field F] [Field F'] [Field Ω] [Field Ω'] + [Algebra F Ω] [Algebra F' Ω'] + (τ : F ≃+* F') (e : Ω ≃+* Ω') + (he : ∀ x : F, + e (algebraMap F Ω x) = algebraMap F' Ω' (τ x)) + (E : IntermediateField F' Ω') {x : Ω'} (hx : x ∈ E) : + e.symm x ∈ semilinearRingEquivPreimageIntermediateField τ e he E := by + change e (e.symm x) ∈ E + simpa using hx + +/-- The semilinear pullback of a finite intermediate field is finite. -/ +theorem finiteDimensional_semilinearRingEquivPreimageIntermediateField + {F : Type u} {F' : Type w} {Ω : Type v} {Ω' : Type z} + [Field F] [Field F'] [Field Ω] [Field Ω'] + [Algebra F Ω] [Algebra F' Ω'] + (τ : F ≃+* F') (e : Ω ≃+* Ω') + (he : ∀ x : F, + e (algebraMap F Ω x) = algebraMap F' Ω' (τ x)) + (E : IntermediateField F' Ω') [FiniteDimensional F' E] : + FiniteDimensional F + (semilinearRingEquivPreimageIntermediateField τ e he E) := by + let T := semilinearRingEquivPreimageIntermediateField τ e he E + let f : E →ₛₗ[(τ.symm : F' →+* F)] T := + { toFun := fun x => + ⟨e.symm x.1, + semilinearRingEquivPreimageIntermediateField_symm_mem + τ e he E x.2⟩ + map_add' := by + intro x y + ext + simp + map_smul' := by + intro a x + ext + simp only [Algebra.smul_def] + change e.symm (algebraMap F' Ω' a * x.1) = + algebraMap F Ω (τ.symm a) * e.symm x.1 + have hbase : + e (algebraMap F Ω (τ.symm a)) = + algebraMap F' Ω' a := by + simpa using he (τ.symm a) + apply e.injective + calc + e (e.symm (algebraMap F' Ω' a * x.1)) = + algebraMap F' Ω' a * x.1 := by + rw [e.apply_symm_apply] + _ = e (algebraMap F Ω (τ.symm a)) * x.1 := by + rw [hbase] + _ = e (algebraMap F Ω (τ.symm a)) * e (e.symm x.1) := by + rw [e.apply_symm_apply] + _ = e (algebraMap F Ω (τ.symm a) * e.symm x.1) := by + rw [map_mul] } + have hsurj : Function.Surjective f := by + intro y + refine ⟨⟨e y.1, y.2⟩, ?_⟩ + ext + exact e.symm_apply_apply y.1 + have hfgImage : Submodule.FG ((⊤ : Submodule F' E).map f) := + (Module.Finite.fg_top (R := F') (M := E)).map f + have hmaptop : (⊤ : Submodule F' E).map f = + (⊤ : Submodule F T) := by + rw [Submodule.map_top, LinearMap.range_eq_top_of_surjective f hsurj] + change Module.Finite F T + exact Module.Finite.of_fg_top (by simpa [hmaptop] using hfgImage) + +/-- Conjugation by a semilinear equivalence of an algebraic closure is +continuous for the Krull topology. The semilinear base action is recorded +explicitly by `he`, and the group homomorphism is required only to have the +corresponding conjugation formula on underlying ring equivalences. -/ +theorem semilinear_conjugation_continuous + {F : Type u} {F' : Type w} {Ω : Type v} {Ω' : Type z} + [Field F] [Field F'] [Field Ω] [Field Ω'] + [Algebra F Ω] [Algebra F' Ω'] + (τ : F ≃+* F') (e : Ω ≃+* Ω') + (he : ∀ x : F, + e (algebraMap F Ω x) = algebraMap F' Ω' (τ x)) + (φ : Gal(Ω/F) →* Gal(Ω'/F')) + (hφ : ∀ g : Gal(Ω/F), + (φ g).toRingEquiv = + e.symm.trans (g.toRingEquiv.trans e)) : + Continuous φ := by + refine continuous_of_continuousAt_one φ ?_ + rw [ContinuousAt, MonoidHom.map_one, Filter.Tendsto] + intro s hs + rw [Filter.mem_map] + rcases (krullTopology_mem_nhds_one_iff F' Ω' s).1 hs with + ⟨E, hE, hEs⟩ + let Epre : IntermediateField F Ω := + semilinearRingEquivPreimageIntermediateField τ e he E + have : FiniteDimensional F' E := hE + have : FiniteDimensional F Epre := + finiteDimensional_semilinearRingEquivPreimageIntermediateField + τ e he E + refine (krullTopology_mem_nhds_one_iff F Ω (φ ⁻¹' s)).2 ?_ + refine ⟨Epre, inferInstance, ?_⟩ + intro σ hσ + apply hEs + change φ σ ∈ E.fixingSubgroup + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + have hxpre : e.symm x ∈ Epre := + semilinearRingEquivPreimageIntermediateField_symm_mem + τ e he E hx + have hfix := + (IntermediateField.mem_fixingSubgroup_iff Epre σ).1 hσ + (e.symm x) hxpre + change (φ σ).toRingEquiv x = x + rw [hφ σ] + change e (σ (e.symm x)) = x + rw [hfix, e.apply_symm_apply] + +/-- Algebra-equivalence conjugation is continuous for Krull topologies. -/ +theorem algEquiv_autCongr_continuous + {F : Type u} {A : Type v} {B : Type w} [Field F] [Field A] [Field B] + [Algebra F A] [Algebra F B] + (e : A ≃ₐ[F] B) : + Continuous (AlgEquiv.autCongr e : Gal(A/F) → Gal(B/F)) := by + refine continuous_of_continuousAt_one (AlgEquiv.autCongr e).toMonoidHom ?_ + rw [ContinuousAt, MonoidHom.map_one, Filter.Tendsto] + intro s hs + rw [Filter.mem_map] + rcases (krullTopology_mem_nhds_one_iff F B s).1 hs with + ⟨E, hE, hEs⟩ + let Ecomap : IntermediateField F A := E.comap e.toAlgHom + have : FiniteDimensional F E := hE + have : FiniteDimensional F Ecomap := + finiteDimensional_comap_algEquiv e E + refine (krullTopology_mem_nhds_one_iff F A + ((AlgEquiv.autCongr e) ⁻¹' s)).2 ?_ + refine ⟨Ecomap, inferInstance, ?_⟩ + intro σ hσ + apply hEs + change AlgEquiv.autCongr e σ ∈ E.fixingSubgroup + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + change e (σ (e.symm x)) = x + have hxEcomap : e.symm x ∈ Ecomap := by + change e (e.symm x) ∈ E + rw [e.apply_symm_apply] + exact hx + have hfix := (IntermediateField.mem_fixingSubgroup_iff Ecomap σ).1 hσ + (e.symm x) hxEcomap + rw [hfix] + exact e.apply_symm_apply x + +/-- The inverse of algebra-equivalence conjugation is continuous for Krull +topologies. -/ +theorem algEquiv_autCongr_symm_continuous + {F : Type u} {A : Type v} {B : Type w} [Field F] [Field A] [Field B] + [Algebra F A] [Algebra F B] + (e : A ≃ₐ[F] B) : + Continuous ((AlgEquiv.autCongr e).symm : Gal(B/F) → Gal(A/F)) := by + rw [AlgEquiv.autCongr_symm] + exact algEquiv_autCongr_continuous e.symm + +/-- Extend a `K`-automorphism of the absolute separable closure to the fixed +chosen algebraic closure. The extension is canonical because +`AlgebraicClosure K` is purely inseparable over `SeparableClosure K`. -/ +noncomputable def separableClosureExtensionAlgEquiv + (K : Type u) [Field K] + (τ : Gal(SeparableClosure K/K)) : + Gal(AlgebraicClosure K/K) := by + letI : Algebra (SeparableClosure K) (AlgebraicClosure K) := + (separableClosure K (AlgebraicClosure K)).val.toRingHom.toAlgebra + haveI : IsScalarTower K (SeparableClosure K) (AlgebraicClosure K) := + IsScalarTower.of_algebraMap_eq fun _ => by + rfl + haveI : Algebra.IsAlgebraic (SeparableClosure K) (AlgebraicClosure K) := + Algebra.IsAlgebraic.tower_top (K := K) (L := SeparableClosure K) + (A := AlgebraicClosure K) + haveI : IsAlgClosure (SeparableClosure K) (AlgebraicClosure K) := + { isAlgClosed := inferInstance + isAlgebraic := inferInstance } + let eRing : SeparableClosure K ≃+* SeparableClosure K := τ.toRingEquiv + let e0 : AlgebraicClosure K ≃+* AlgebraicClosure K := + IsAlgClosure.equivOfEquiv (AlgebraicClosure K) (AlgebraicClosure K) eRing + refine + { e0 with + commutes' := ?_ } + intro x + calc + e0 (algebraMap K (AlgebraicClosure K) x) = + algebraMap (SeparableClosure K) (AlgebraicClosure K) + (eRing (algebraMap K (SeparableClosure K) x)) := by + change + IsAlgClosure.equivOfEquiv (AlgebraicClosure K) (AlgebraicClosure K) + eRing (algebraMap K (AlgebraicClosure K) x) = + algebraMap (SeparableClosure K) (AlgebraicClosure K) + (eRing (algebraMap K (SeparableClosure K) x)) + have hmap : + algebraMap K (AlgebraicClosure K) x = + algebraMap (SeparableClosure K) (AlgebraicClosure K) + (algebraMap K (SeparableClosure K) x) := + (IsScalarTower.algebraMap_apply K (SeparableClosure K) + (AlgebraicClosure K) x).symm + rw [hmap] + exact + IsAlgClosure.equivOfEquiv_algebraMap + (AlgebraicClosure K) (AlgebraicClosure K) eRing + (algebraMap K (SeparableClosure K) x) + _ = algebraMap (SeparableClosure K) (AlgebraicClosure K) + (algebraMap K (SeparableClosure K) x) := by + rw [show eRing (algebraMap K (SeparableClosure K) x) = + algebraMap K (SeparableClosure K) x from τ.commutes x] + _ = algebraMap K (AlgebraicClosure K) x := rfl + +/-- Restrict an absolute Galois element of the chosen algebraic closure to the +absolute separable closure. -/ +def restrictToSeparableClosure + (K : Type u) [Field K] : + Gal(AlgebraicClosure K/K) →* Gal(SeparableClosure K/K) where + toFun σ := AlgEquiv.separableClosure σ + map_one' := by + ext x + rfl + map_mul' σ τ := by + ext x + rfl + +/-- States the theorem `separableClosureExtensionAlgEquiv_restricts`. -/ +@[simp] +theorem separableClosureExtensionAlgEquiv_restricts + (K : Type u) [Field K] + (τ : Gal(SeparableClosure K/K)) (x : SeparableClosure K) : + separableClosureExtensionAlgEquiv K τ x = τ x := by + dsimp [separableClosureExtensionAlgEquiv] + let : Algebra (SeparableClosure K) (AlgebraicClosure K) := + (separableClosure K (AlgebraicClosure K)).val.toRingHom.toAlgebra + have : IsScalarTower K (SeparableClosure K) (AlgebraicClosure K) := + IsScalarTower.of_algebraMap_eq fun _ => by + rfl + have : Algebra.IsAlgebraic (SeparableClosure K) (AlgebraicClosure K) := + Algebra.IsAlgebraic.tower_top (K := K) (L := SeparableClosure K) + (A := AlgebraicClosure K) + have : IsAlgClosure (SeparableClosure K) (AlgebraicClosure K) := + { isAlgClosed := inferInstance + isAlgebraic := inferInstance } + change + IsAlgClosure.equivOfEquiv (AlgebraicClosure K) (AlgebraicClosure K) + τ.toRingEquiv (algebraMap (SeparableClosure K) (AlgebraicClosure K) x) = + algebraMap (SeparableClosure K) (AlgebraicClosure K) (τ x) + exact + IsAlgClosure.equivOfEquiv_algebraMap + (AlgebraicClosure K) (AlgebraicClosure K) τ.toRingEquiv x + +/-- States the theorem `restrictToSeparableClosure_extension`. -/ +@[simp] +theorem restrictToSeparableClosure_extension + (K : Type u) [Field K] (τ : Gal(SeparableClosure K/K)) : + AlgEquiv.separableClosure (separableClosureExtensionAlgEquiv K τ) = τ := by + ext x + exact separableClosureExtensionAlgEquiv_restricts K τ x + +/-- States the theorem `extension_restrictToSeparableClosure`. -/ +@[simp] +theorem extension_restrictToSeparableClosure + (K : Type u) [Field K] (σ : Gal(AlgebraicClosure K/K)) : + separableClosureExtensionAlgEquiv K (AlgEquiv.separableClosure σ) = σ := by + let : Algebra (SeparableClosure K) (AlgebraicClosure K) := + (separableClosure K (AlgebraicClosure K)).val.toRingHom.toAlgebra + have : IsScalarTower K (SeparableClosure K) (AlgebraicClosure K) := + IsScalarTower.of_algebraMap_eq fun _ => by + rfl + have : Algebra.IsAlgebraic (SeparableClosure K) (AlgebraicClosure K) := + Algebra.IsAlgebraic.tower_top (K := K) (L := SeparableClosure K) + (A := AlgebraicClosure K) + have : IsPurelyInseparable (SeparableClosure K) (AlgebraicClosure K) := + separableClosure.isPurelyInseparable K (AlgebraicClosure K) + have hAlg : + (separableClosureExtensionAlgEquiv K + (AlgEquiv.separableClosure σ)).toAlgHom = σ.toAlgHom := by + apply IsPurelyInseparable.injective_restrictDomain + (F := SeparableClosure K) (E := AlgebraicClosure K) + (R := K) (L := AlgebraicClosure K) + ext x + change + separableClosureExtensionAlgEquiv K (AlgEquiv.separableClosure σ) x = + σ x + exact separableClosureExtensionAlgEquiv_restricts K + (AlgEquiv.separableClosure σ) x + ext x + exact congrArg (fun f : AlgebraicClosure K →ₐ[K] AlgebraicClosure K => f x) hAlg + +/-- The algebraic absolute Galois group of the chosen algebraic closure is +canonically the Galois group of the absolute separable closure. -/ +noncomputable def separableClosureMulEquiv + (K : Type u) [Field K] : + Gal(AlgebraicClosure K/K) ≃* Gal(SeparableClosure K/K) where + toFun σ := AlgEquiv.separableClosure σ + invFun τ := separableClosureExtensionAlgEquiv K τ + left_inv σ := extension_restrictToSeparableClosure K σ + right_inv τ := restrictToSeparableClosure_extension K τ + map_mul' σ τ := by + ext x + rfl + +/-- States the theorem `separableClosureMulEquiv_continuous`. -/ +theorem separableClosureMulEquiv_continuous + (K : Type u) [Field K] : + Continuous (separableClosureMulEquiv K : + Gal(AlgebraicClosure K/K) → Gal(SeparableClosure K/K)) := by + refine continuous_of_continuousAt_one (restrictToSeparableClosure K) ?_ + rw [ContinuousAt, MonoidHom.map_one, Filter.Tendsto] + intro s hs + rw [Filter.mem_map] + rcases (krullTopology_mem_nhds_one_iff K (SeparableClosure K) s).1 hs with + ⟨E, hE, hEs⟩ + let Elift : IntermediateField K (AlgebraicClosure K) := IntermediateField.lift E + have : FiniteDimensional K E := hE + have : FiniteDimensional K Elift := by + let eLin : E ≃ₗ[K] Elift := (IntermediateField.liftAlgEquiv E).toLinearEquiv + exact Module.Finite.equiv eLin + refine (krullTopology_mem_nhds_one_iff K (AlgebraicClosure K) + ((separableClosureMulEquiv K) ⁻¹' s)).2 ?_ + refine ⟨Elift, inferInstance, ?_⟩ + intro σ hσ + apply hEs + change AlgEquiv.separableClosure σ ∈ E.fixingSubgroup + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + apply Subtype.ext + change σ x = x + have hxElift : (x : AlgebraicClosure K) ∈ Elift := by + exact (IntermediateField.mem_lift x).2 hx + exact (IntermediateField.mem_fixingSubgroup_iff Elift σ).1 hσ x hxElift + +/-- States the theorem `lift_separableClosure_le_absoluteSeparableClosure`. -/ +theorem lift_separableClosure_le_absoluteSeparableClosure + (K : Type u) [Field K] + (E : IntermediateField K (AlgebraicClosure K)) : + IntermediateField.lift (separableClosure K E) ≤ + (separableClosure K (AlgebraicClosure K)) := by + intro x hx + rcases hx with ⟨y, hy, rfl⟩ + exact (mem_separableClosure_iff.1 hy).map E.val E.val.injective + +/-- The separable part of a finite algebraic-closure intermediate field, viewed +inside the absolute separable closure. -/ +def separablePartInAbsoluteSeparableClosure + (K : Type u) [Field K] + (E : IntermediateField K (AlgebraicClosure K)) : + IntermediateField K (SeparableClosure K) := + IntermediateField.restrict + (lift_separableClosure_le_absoluteSeparableClosure K E) + +/-- States the theorem `finiteDimensional_separablePartInAbsoluteSeparableClosure`. -/ +theorem finiteDimensional_separablePartInAbsoluteSeparableClosure + (K : Type u) [Field K] + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : + FiniteDimensional K (separablePartInAbsoluteSeparableClosure K E) := by + let Esep : IntermediateField K E := separableClosure K E + have : FiniteDimensional K Esep := inferInstance + let EsepLift : IntermediateField K (AlgebraicClosure K) := + IntermediateField.lift Esep + have : FiniteDimensional K EsepLift := by + let eLin : Esep ≃ₗ[K] EsepLift := + (IntermediateField.liftAlgEquiv Esep).toLinearEquiv + exact Module.Finite.equiv eLin + let hle := lift_separableClosure_le_absoluteSeparableClosure K E + let eAlg : + EsepLift ≃ₐ[K] separablePartInAbsoluteSeparableClosure K E := + IntermediateField.restrictAlgEquiv hle + exact Module.Finite.equiv eAlg.toLinearEquiv + +/-- States the theorem `separableClosureExtension_mem_fixingSubgroup_of_mem_separablePart`. -/ +theorem separableClosureExtension_mem_fixingSubgroup_of_mem_separablePart + (K : Type u) [Field K] + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] + (τ : Gal(SeparableClosure K/K)) + (hτ : τ ∈ (separablePartInAbsoluteSeparableClosure K E).fixingSubgroup) : + separableClosureExtensionAlgEquiv K τ ∈ E.fixingSubgroup := by + let Esep : IntermediateField K E := separableClosure K E + let EsepLift : IntermediateField K (AlgebraicClosure K) := + IntermediateField.lift Esep + let hle := lift_separableClosure_le_absoluteSeparableClosure K E + have hfixSepLift : + ∀ y ∈ EsepLift, separableClosureExtensionAlgEquiv K τ y = y := by + intro y hy + have hyS : y ∈ separableClosure K (AlgebraicClosure K) := hle hy + let ys : SeparableClosure K := ⟨y, hyS⟩ + have hyF : ys ∈ separablePartInAbsoluteSeparableClosure K E := by + exact (IntermediateField.mem_restrict hle ys).2 hy + have hτfix : + τ ys = ys := + (IntermediateField.mem_fixingSubgroup_iff + (separablePartInAbsoluteSeparableClosure K E) τ).1 hτ ys hyF + calc + separableClosureExtensionAlgEquiv K τ y = + separableClosureExtensionAlgEquiv K τ (ys : AlgebraicClosure K) := rfl + _ = τ ys := separableClosureExtensionAlgEquiv_restricts K τ ys + _ = ys := congrArg Subtype.val hτfix + _ = y := rfl + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + let : Algebra E (AlgebraicClosure K) := E.val.toRingHom.toAlgebra + have : IsScalarTower K E (AlgebraicClosure K) := + IsScalarTower.of_algebraMap_eq fun _ => by + rfl + have : IsPurelyInseparable Esep E := + separableClosure.isPurelyInseparable K E + let : Algebra Esep (AlgebraicClosure K) := + ((algebraMap E (AlgebraicClosure K)).comp + (algebraMap Esep E)).toAlgebra + let incl : E →ₐ[Esep] AlgebraicClosure K := + { algebraMap E (AlgebraicClosure K) with + commutes' := by + intro y + rfl } + let moved : E →ₐ[Esep] AlgebraicClosure K := + { ((separableClosureExtensionAlgEquiv K τ).toRingHom.comp + (algebraMap E (AlgebraicClosure K))) with + commutes' := by + intro y + change separableClosureExtensionAlgEquiv K τ + (algebraMap E (AlgebraicClosure K) (algebraMap Esep E y)) = + algebraMap E (AlgebraicClosure K) (algebraMap Esep E y) + have hyLift : (algebraMap E (AlgebraicClosure K) + (algebraMap Esep E y)) ∈ EsepLift := by + exact (IntermediateField.mem_lift (algebraMap Esep E y)).2 y.2 + exact hfixSepLift + (algebraMap E (AlgebraicClosure K) (algebraMap Esep E y)) hyLift } + have hmoved : moved = incl := Subsingleton.elim _ _ + have hpoint := + congrArg (fun f : E →ₐ[Esep] AlgebraicClosure K => f ⟨x, hx⟩) hmoved + dsimp [moved, incl] at hpoint + exact hpoint + +/-- States the theorem `separableClosureMulEquiv_symm_continuous`. -/ +theorem separableClosureMulEquiv_symm_continuous + (K : Type u) [Field K] : + Continuous ((separableClosureMulEquiv K).symm : + Gal(SeparableClosure K/K) → Gal(AlgebraicClosure K/K)) := by + refine continuous_of_continuousAt_one (separableClosureMulEquiv K).symm.toMonoidHom ?_ + rw [ContinuousAt, MonoidHom.map_one, Filter.Tendsto] + intro s hs + rw [Filter.mem_map] + rcases (krullTopology_mem_nhds_one_iff K (AlgebraicClosure K) s).1 hs with + ⟨E, hE, hEs⟩ + let F : IntermediateField K (SeparableClosure K) := + separablePartInAbsoluteSeparableClosure K E + have : FiniteDimensional K E := hE + have : FiniteDimensional K F := + finiteDimensional_separablePartInAbsoluteSeparableClosure K E + refine (krullTopology_mem_nhds_one_iff K (SeparableClosure K) + (((separableClosureMulEquiv K).symm) ⁻¹' s)).2 ?_ + refine ⟨F, inferInstance, ?_⟩ + intro τ hτ + apply hEs + change separableClosureExtensionAlgEquiv K τ ∈ E.fixingSubgroup + exact + separableClosureExtension_mem_fixingSubgroup_of_mem_separablePart + K E τ hτ + +/-- Topological identification of the usual algebraic-closure absolute Galois +group with the Galois group of the absolute separable closure. -/ +noncomputable def separableClosureContinuousMulEquiv + (K : Type u) [Field K] : + Gal(AlgebraicClosure K/K) ≃ₜ* Gal(SeparableClosure K/K) where + toMulEquiv := separableClosureMulEquiv K + continuous_toFun := separableClosureMulEquiv_continuous K + continuous_invFun := separableClosureMulEquiv_symm_continuous K + +/-- The natural inclusion `Gal(M/E) -> Gal(M/K)` for an intermediate field +`E` of a field extension `M/K`. -/ +def ofIntermediateFieldInExtension + {K : Type u} {M : Type v} [Field K] [Field M] [Algebra K M] + (E : IntermediateField K M) : + Gal(M/E) →* Gal(M/K) where + toFun σ := σ.restrictScalars K + map_one' := rfl + map_mul' _ _ := rfl + +/-- States the theorem `ofIntermediateFieldInExtension_apply`. -/ +@[simp] +theorem ofIntermediateFieldInExtension_apply + {K : Type u} {M : Type v} [Field K] [Field M] [Algebra K M] + (E : IntermediateField K M) (σ : Gal(M/E)) : + ofIntermediateFieldInExtension E σ = σ.restrictScalars K := + rfl + +/-- The image of `Gal(M/E)` in `Gal(M/K)` is exactly the subgroup fixing `E`. -/ +theorem range_ofIntermediateFieldInExtension + {K : Type u} {M : Type v} [Field K] [Field M] [Algebra K M] + (E : IntermediateField K M) : + MonoidHom.range (ofIntermediateFieldInExtension E) = E.fixingSubgroup := by + ext σ + constructor + · rintro ⟨τ, rfl⟩ + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + change τ x = x + simpa using τ.commutes ⟨x, hx⟩ + · intro hσ + refine ⟨IntermediateField.fixingSubgroupEquiv E ⟨σ, hσ⟩, ?_⟩ + apply AlgEquiv.ext + intro x + rfl + +/-- Exactness of the finite-level Galois restriction map: +`ker(Gal(M/K) -> Gal(E/K))` is the image of `Gal(M/E) -> Gal(M/K)`. -/ +theorem restrictNormalHom_ker_eq_range_ofIntermediateFieldInExtension + {K : Type u} {M : Type v} [Field K] [Field M] [Algebra K M] + (E : IntermediateField K M) [Normal K E] : + (AlgEquiv.restrictNormalHom E : Gal(M/K) →* Gal(E/K)).ker = + MonoidHom.range (ofIntermediateFieldInExtension E) := by + rw [IntermediateField.restrictNormalHom_ker E, + range_ofIntermediateFieldInExtension] + +variable (K : Type u) [Field K] + +/-- The natural inclusion `Gal(K^al/E) → G_K`, for an intermediate field +`E ⊆ K^al`. -/ +def ofIntermediateField (E : IntermediateField K (AlgebraicClosure K)) : + Gal(AlgebraicClosure K/E) →* Gal(AlgebraicClosure K/K) where + toFun σ := σ.restrictScalars K + map_one' := rfl + map_mul' _ _ := rfl + +/-- States the theorem `ofIntermediateField_apply`. -/ +@[simp] +theorem ofIntermediateField_apply + (E : IntermediateField K (AlgebraicClosure K)) + (σ : Gal(AlgebraicClosure K/E)) : + ofIntermediateField K E σ = σ.restrictScalars K := + rfl + +/-- The image of `Gal(K^al/E)` in `G_K` is exactly the subgroup fixing `E`. -/ +theorem range_ofIntermediateField + (E : IntermediateField K (AlgebraicClosure K)) : + MonoidHom.range (ofIntermediateField K E) = E.fixingSubgroup := by + ext σ + constructor + · rintro ⟨τ, rfl⟩ + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + change τ x = x + simpa using τ.commutes ⟨x, hx⟩ + · intro hσ + refine ⟨IntermediateField.fixingSubgroupEquiv E ⟨σ, hσ⟩, ?_⟩ + apply AlgEquiv.ext + intro x + rfl + +/-- The natural inclusion `Gal(K^al/E) → G_K` is injective. -/ +theorem ofIntermediateField_injective + (E : IntermediateField K (AlgebraicClosure K)) : + Function.Injective (ofIntermediateField K E) := by + intro σ τ hστ + apply AlgEquiv.ext + intro x + exact congrArg + (fun ρ : Gal(AlgebraicClosure K/K) => ρ x) hστ + +/-- States the theorem `ofIntermediateField_eq_iff`. -/ +theorem ofIntermediateField_eq_iff + (E : IntermediateField K (AlgebraicClosure K)) + (σ τ : Gal(AlgebraicClosure K/E)) : + ofIntermediateField K E σ = ofIntermediateField K E τ ↔ σ = τ := + ⟨fun h => ofIntermediateField_injective K E h, fun h => by rw [h]⟩ + +theorem finiteDimensional_extendScalars_sup + (k : Type u) (M : Type v) [Field k] [Field M] [Algebra k M] + (E F : IntermediateField k M) + [FiniteDimensional k E] [FiniteDimensional k F] : + FiniteDimensional E + (IntermediateField.extendScalars (F := E) (E := E ⊔ F) le_sup_left) := by + let EF : IntermediateField k M := E ⊔ F + let EEF : IntermediateField E M := + IntermediateField.extendScalars (F := E) (E := EF) le_sup_left + have : FiniteDimensional k EF := E.finiteDimensional_sup F + let : Algebra E EF := (IntermediateField.inclusion le_sup_left).toAlgebra + have : IsScalarTower k E EF := by + apply IsScalarTower.of_algebraMap_eq + intro x + apply Subtype.ext + change (algebraMap k M) x = + ((IntermediateField.inclusion le_sup_left) ((algebraMap k E) x) : + M) + rfl + have : Module.Finite E EF := FiniteDimensional.right k E EF + let eLin : EEF ≃ₗ[E] EF := + { toFun := fun x => ⟨x.1, x.2⟩ + invFun := fun x => ⟨x.1, x.2⟩ + left_inv := by + intro x + ext + rfl + right_inv := by + intro x + ext + rfl + map_add' := by + intro x y + ext + rfl + map_smul' := by + intro a x + ext + rfl } + exact Module.Finite.equiv eLin.symm + +/-- For a finite intermediate extension `E/K`, the natural inclusion +`Gal(M/E) → Gal(M/K)` is continuous for the two Krull topologies. -/ +theorem ofIntermediateFieldInExtension_continuous + {k : Type u} {M : Type v} [Field k] [Field M] [Algebra k M] + (E : IntermediateField k M) [FiniteDimensional k E] : + Continuous (ofIntermediateFieldInExtension E) := by + refine continuous_of_continuousAt_one + (ofIntermediateFieldInExtension E) ?_ + rw [ContinuousAt, MonoidHom.map_one, Filter.Tendsto] + intro s hs + rcases (krullTopology_mem_nhds_one_iff k M s).1 hs with + ⟨F, hF, hFs⟩ + let EF : IntermediateField k M := E ⊔ F + let EEF : IntermediateField E M := + IntermediateField.extendScalars (F := E) (E := EF) le_sup_left + have : FiniteDimensional k F := hF + have : FiniteDimensional E EEF := + finiteDimensional_extendScalars_sup k M E F + refine (krullTopology_mem_nhds_one_iff E M + ((ofIntermediateFieldInExtension E) ⁻¹' s)).2 ?_ + refine ⟨EEF, inferInstance, ?_⟩ + intro σ hσ + apply hFs + change ofIntermediateFieldInExtension E σ ∈ F.fixingSubgroup + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + change σ x = x + have hxEF : x ∈ EF := (show F ≤ EF from le_sup_right) hx + have hxEEF : x ∈ EEF := by + change x ∈ EF + exact hxEF + exact (IntermediateField.mem_fixingSubgroup_iff EEF σ).1 hσ x hxEEF + +private theorem finiteDimensional_restrictScalars + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] + (F : IntermediateField E (AlgebraicClosure K)) [FiniteDimensional E F] : + FiniteDimensional K (F.restrictScalars K) := by + have : FiniteDimensional K F := FiniteDimensional.trans K E F + let FK : IntermediateField K (AlgebraicClosure K) := F.restrictScalars K + let eLin : FK ≃ₗ[K] F := + { toFun := fun x => ⟨x.1, x.2⟩ + invFun := fun x => ⟨x.1, x.2⟩ + left_inv := by + intro x + ext + rfl + right_inv := by + intro x + ext + rfl + map_add' := by + intro x y + ext + rfl + map_smul' := by + intro a x + ext + rfl } + exact Module.Finite.equiv eLin.symm + +/-- The natural inclusion `Gal(K^al/E) → G_K` is continuous for the Krull +topologies when `E/K` is finite. -/ +theorem ofIntermediateField_continuous + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : + Continuous (ofIntermediateField K E) := by + refine continuous_of_continuousAt_one (ofIntermediateField K E) ?_ + rw [ContinuousAt, MonoidHom.map_one, Filter.Tendsto] + intro s hs + rcases (krullTopology_mem_nhds_one_iff K (AlgebraicClosure K) s).1 hs with + ⟨F, hF, hFs⟩ + let EF : IntermediateField K (AlgebraicClosure K) := E ⊔ F + let EEF : IntermediateField E (AlgebraicClosure K) := + IntermediateField.extendScalars (F := E) (E := EF) le_sup_left + have : FiniteDimensional K F := hF + have : FiniteDimensional E EEF := + finiteDimensional_extendScalars_sup K (AlgebraicClosure K) E F + refine (krullTopology_mem_nhds_one_iff E (AlgebraicClosure K) + ((ofIntermediateField K E) ⁻¹' s)).2 ?_ + refine ⟨EEF, inferInstance, ?_⟩ + intro σ hσ + apply hFs + change ofIntermediateField K E σ ∈ F.fixingSubgroup + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + change σ x = x + have hxEF : x ∈ EF := (show F ≤ EF from le_sup_right) hx + have hxEEF : x ∈ EEF := by + change x ∈ EF + exact hxEF + exact (IntermediateField.mem_fixingSubgroup_iff EEF σ).1 hσ x hxEEF + +/-- The finite-subextension open subgroup of `G_K` corresponding to +`E ⊆ K^al`. This is the concrete form of `G_E ≤ G_K`. -/ +def openSubgroupOfFiniteIntermediateField + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : + OpenSubgroup (Gal(AlgebraicClosure K/K)) := + ⟨E.fixingSubgroup, IntermediateField.fixingSubgroup_isOpen E⟩ + +/-- States the theorem `openSubgroupOfFiniteIntermediateField_toSubgroup`. -/ +@[simp] +theorem openSubgroupOfFiniteIntermediateField_toSubgroup + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : + (openSubgroupOfFiniteIntermediateField K E : + Subgroup (Gal(AlgebraicClosure K/K))) = + E.fixingSubgroup := + rfl + +/-- States the theorem `mem_openSubgroupOfFiniteIntermediateField`. -/ +@[simp] +theorem mem_openSubgroupOfFiniteIntermediateField + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] + (σ : Gal(AlgebraicClosure K/K)) : + σ ∈ openSubgroupOfFiniteIntermediateField K E ↔ + ∀ x ∈ E, σ x = x := by + rw [← IntermediateField.mem_fixingSubgroup_iff E σ] + rfl + +/-- The finite-intermediate-field open subgroup construction is contravariant: +if `E ≤ F`, then `G_F ≤ G_E` inside `G_K`. -/ +theorem openSubgroupOfFiniteIntermediateField_le + (E F : IntermediateField K (AlgebraicClosure K)) + [FiniteDimensional K E] [FiniteDimensional K F] (hEF : E ≤ F) : + (openSubgroupOfFiniteIntermediateField K F : + Subgroup (Gal(AlgebraicClosure K/K))) ≤ + openSubgroupOfFiniteIntermediateField K E := by + change F.fixingSubgroup ≤ E.fixingSubgroup + exact E.fixingSubgroup_le hEF + +/-- The finite-subextension open subgroup attached to the compositum `E ⊔ F`. +Its underlying subgroup is the intersection of the open subgroups attached to +`E` and `F`. -/ +def openSubgroupOfFiniteIntermediateFieldSup + (E F : IntermediateField K (AlgebraicClosure K)) + [FiniteDimensional K E] [FiniteDimensional K F] : + OpenSubgroup (Gal(AlgebraicClosure K/K)) := by + let EF : IntermediateField K (AlgebraicClosure K) := E ⊔ F + haveI : FiniteDimensional K EF := E.finiteDimensional_sup F + exact openSubgroupOfFiniteIntermediateField K EF + +/-- States the theorem `openSubgroupOfFiniteIntermediateFieldSup_toSubgroup`. -/ +@[simp] +theorem openSubgroupOfFiniteIntermediateFieldSup_toSubgroup + (E F : IntermediateField K (AlgebraicClosure K)) + [FiniteDimensional K E] [FiniteDimensional K F] : + (openSubgroupOfFiniteIntermediateFieldSup K E F : + Subgroup (Gal(AlgebraicClosure K/K))) = + (openSubgroupOfFiniteIntermediateField K E : + Subgroup (Gal(AlgebraicClosure K/K))) ⊓ + openSubgroupOfFiniteIntermediateField K F := by + change (E ⊔ F).fixingSubgroup = E.fixingSubgroup ⊓ F.fixingSubgroup + exact IntermediateField.fixingSubgroup_sup + +/-- States the theorem `mem_openSubgroupOfFiniteIntermediateFieldSup`. -/ +theorem mem_openSubgroupOfFiniteIntermediateFieldSup + (E F : IntermediateField K (AlgebraicClosure K)) + [FiniteDimensional K E] [FiniteDimensional K F] + (σ : Gal(AlgebraicClosure K/K)) : + σ ∈ openSubgroupOfFiniteIntermediateFieldSup K E F ↔ + σ ∈ openSubgroupOfFiniteIntermediateField K E ∧ + σ ∈ openSubgroupOfFiniteIntermediateField K F := by + change + σ ∈ (openSubgroupOfFiniteIntermediateFieldSup K E F : + Subgroup (Gal(AlgebraicClosure K/K))) ↔ + σ ∈ (openSubgroupOfFiniteIntermediateField K E : + Subgroup (Gal(AlgebraicClosure K/K))) ∧ + σ ∈ (openSubgroupOfFiniteIntermediateField K F : + Subgroup (Gal(AlgebraicClosure K/K))) + rw [openSubgroupOfFiniteIntermediateFieldSup_toSubgroup] + simp + +/-- States the theorem `range_ofIntermediateField_sup`. -/ +theorem range_ofIntermediateField_sup + (E F : IntermediateField K (AlgebraicClosure K)) : + MonoidHom.range (ofIntermediateField K (E ⊔ F)) = + E.fixingSubgroup ⊓ F.fixingSubgroup := by + rw [range_ofIntermediateField, IntermediateField.fixingSubgroup_sup] + +/-- States the theorem `mem_range_ofIntermediateField_sup_iff`. -/ +theorem mem_range_ofIntermediateField_sup_iff + (E F : IntermediateField K (AlgebraicClosure K)) + (σ : Gal(AlgebraicClosure K/K)) : + σ ∈ MonoidHom.range (ofIntermediateField K (E ⊔ F)) ↔ + σ ∈ E.fixingSubgroup ∧ σ ∈ F.fixingSubgroup := by + rw [range_ofIntermediateField_sup, Subgroup.mem_inf] + +/-- The normal-closure open subgroup contained in the open subgroup attached +to a finite intermediate field. -/ +def openSubgroupOfNormalClosureFiniteIntermediateField + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : + OpenSubgroup (Gal(AlgebraicClosure K/K)) := + openSubgroupOfFiniteIntermediateField K + (IntermediateField.normalClosure K E (AlgebraicClosure K)) + +/-- States the theorem `openSubgroupOfNormalClosureFiniteIntermediateField_toSubgroup`. -/ +@[simp] +theorem openSubgroupOfNormalClosureFiniteIntermediateField_toSubgroup + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : + (openSubgroupOfNormalClosureFiniteIntermediateField K E : + Subgroup (Gal(AlgebraicClosure K/K))) = + (IntermediateField.normalClosure K E + (AlgebraicClosure K)).fixingSubgroup := + rfl + +/-- The normal-closure open subgroup lies inside the open subgroup for `E`. -/ +theorem openSubgroupOfNormalClosureFiniteIntermediateField_le + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : + (openSubgroupOfNormalClosureFiniteIntermediateField K E : + Subgroup (Gal(AlgebraicClosure K/K))) ≤ + openSubgroupOfFiniteIntermediateField K E := by + change (IntermediateField.normalClosure K E + (AlgebraicClosure K)).fixingSubgroup ≤ E.fixingSubgroup + exact E.fixingSubgroup_le (IntermediateField.le_normalClosure E) + +/-- The open subgroup `Gal(K^al/E) ≤ G_K` is canonically isomorphic to the +ordinary Galois group `Gal(K^al/E)`. -/ +def openSubgroupOfFiniteIntermediateFieldEquiv + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : + openSubgroupOfFiniteIntermediateField K E ≃* Gal(AlgebraicClosure K/E) := + IntermediateField.fixingSubgroupEquiv E + +/-- States the theorem `openSubgroupOfFiniteIntermediateFieldEquiv_apply`. -/ +@[simp] +theorem openSubgroupOfFiniteIntermediateFieldEquiv_apply + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] + (σ : openSubgroupOfFiniteIntermediateField K E) : + openSubgroupOfFiniteIntermediateFieldEquiv K E σ = + { AlgEquiv.toRingEquiv (σ : Gal(AlgebraicClosure K/K)) with + commutes' := σ.2 } := + rfl + +/-- States the theorem `coe_openSubgroupOfFiniteIntermediateFieldEquiv_symm_apply`. -/ +@[simp] +theorem coe_openSubgroupOfFiniteIntermediateFieldEquiv_symm_apply + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] + (σ : Gal(AlgebraicClosure K/E)) : + ((openSubgroupOfFiniteIntermediateFieldEquiv K E).symm σ : + Gal(AlgebraicClosure K/K)) = + ofIntermediateField K E σ := + rfl + +/-- The identification between the finite-subextension open subgroup and +`Gal(K^al/E)` is continuous from the open subgroup to the Galois group. -/ +theorem openSubgroupOfFiniteIntermediateFieldEquiv_continuous + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : + Continuous (openSubgroupOfFiniteIntermediateFieldEquiv K E : + openSubgroupOfFiniteIntermediateField K E → Gal(AlgebraicClosure K/E)) := by + let H : Subgroup (Gal(AlgebraicClosure K/K)) := + openSubgroupOfFiniteIntermediateField K E + let e : H ≃* Gal(AlgebraicClosure K/E) := + openSubgroupOfFiniteIntermediateFieldEquiv K E + change Continuous (e : H → Gal(AlgebraicClosure K/E)) + refine continuous_of_continuousAt_one e.toMonoidHom ?_ + rw [ContinuousAt, MonoidHom.map_one, Filter.Tendsto] + intro s hs + rw [Filter.mem_map] + rcases (krullTopology_mem_nhds_one_iff E (AlgebraicClosure K) s).1 hs with + ⟨F, hF, hFs⟩ + let FK : IntermediateField K (AlgebraicClosure K) := F.restrictScalars K + have : FiniteDimensional E F := hF + have : FiniteDimensional K FK := + finiteDimensional_restrictScalars K E F + have hOpen : + IsOpen {τ : openSubgroupOfFiniteIntermediateField K E | + (τ : Gal(AlgebraicClosure K/K)) ∈ FK.fixingSubgroup} := + (IntermediateField.fixingSubgroup_isOpen FK).preimage continuous_subtype_val + have hMem : + {τ : openSubgroupOfFiniteIntermediateField K E | + (τ : Gal(AlgebraicClosure K/K)) ∈ FK.fixingSubgroup} ∈ + 𝓝 (1 : openSubgroupOfFiniteIntermediateField K E) := by + apply hOpen.mem_nhds + change (1 : Gal(AlgebraicClosure K/K)) ∈ FK.fixingSubgroup + exact FK.fixingSubgroup.one_mem + refine Filter.mem_of_superset hMem ?_ + intro τ hτ + apply hFs + change e τ ∈ F.fixingSubgroup + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + change (τ : Gal(AlgebraicClosure K/K)) x = x + have hxFK : x ∈ FK := by + change x ∈ F + exact hx + exact (IntermediateField.mem_fixingSubgroup_iff FK + (τ : Gal(AlgebraicClosure K/K))).1 hτ x hxFK + +/-- The inverse identification `Gal(K^al/E) → Gal(K^al/E) ≤ G_K` is +continuous for finite `E/K`. -/ +theorem openSubgroupOfFiniteIntermediateFieldEquiv_symm_continuous + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : + Continuous ((openSubgroupOfFiniteIntermediateFieldEquiv K E).symm : + Gal(AlgebraicClosure K/E) → openSubgroupOfFiniteIntermediateField K E) := by + have hcomp : + Continuous + (fun σ : Gal(AlgebraicClosure K/E) => + (((openSubgroupOfFiniteIntermediateFieldEquiv K E).symm σ : + openSubgroupOfFiniteIntermediateField K E) : + Gal(AlgebraicClosure K/K))) := by + simpa only [coe_openSubgroupOfFiniteIntermediateFieldEquiv_symm_apply, + ofIntermediateField] using ofIntermediateField_continuous K E + exact Continuous.subtype_mk hcomp fun σ => + ((openSubgroupOfFiniteIntermediateFieldEquiv K E).symm σ).property + +/-- The finite-subextension open subgroup is topologically isomorphic to +`Gal(K^al/E)`. -/ +def openSubgroupOfFiniteIntermediateFieldContinuousMulEquiv + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : + openSubgroupOfFiniteIntermediateField K E ≃ₜ* + Gal(AlgebraicClosure K/E) := + { toMulEquiv := openSubgroupOfFiniteIntermediateFieldEquiv K E + continuous_toFun := openSubgroupOfFiniteIntermediateFieldEquiv_continuous K E + continuous_invFun := openSubgroupOfFiniteIntermediateFieldEquiv_symm_continuous K E } + +/-- The range of the natural inclusion is the finite-subextension open +subgroup. -/ +theorem range_ofIntermediateField_eq_openSubgroup + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : + MonoidHom.range (ofIntermediateField K E) = + (openSubgroupOfFiniteIntermediateField K E : + Subgroup (Gal(AlgebraicClosure K/K))) := by + rw [range_ofIntermediateField] + rfl + +/-- In particular, the image of `Gal(K^al/E)` inside `G_K` is open whenever +`E/K` is finite. -/ +theorem isOpen_range_ofIntermediateField + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : + IsOpen (MonoidHom.range (ofIntermediateField K E) : + Set (Gal(AlgebraicClosure K/K))) := by + rw [range_ofIntermediateField_eq_openSubgroup] + exact (openSubgroupOfFiniteIntermediateField K E).isOpen' + +/-- States the theorem `mem_range_ofIntermediateField_iff`. -/ +theorem mem_range_ofIntermediateField_iff + (E : IntermediateField K (AlgebraicClosure K)) + (σ : Gal(AlgebraicClosure K/K)) : + σ ∈ MonoidHom.range (ofIntermediateField K E) ↔ + σ ∈ E.fixingSubgroup := by + rw [range_ofIntermediateField] + +/-- If `E/K` is normal inside `K^al`, then the subgroup fixing `E` is normal +in `G_K`. -/ +instance fixingSubgroup_normal_of_normal + (E : IntermediateField K (AlgebraicClosure K)) [Normal K E] : + E.fixingSubgroup.Normal := by + rw [← IntermediateField.restrictNormalHom_ker E] + infer_instance + +/-- The finite-subextension open subgroup is normal when the finite +subextension is normal over `K`. -/ +theorem openSubgroupOfFiniteIntermediateField_normal + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] + [Normal K E] : + ((openSubgroupOfFiniteIntermediateField K E : + Subgroup (Gal(AlgebraicClosure K/K)))).Normal := by + change E.fixingSubgroup.Normal + infer_instance + +/-- The normal-closure open subgroup is normal in `G_K`. -/ +theorem openSubgroupOfNormalClosureFiniteIntermediateField_normal + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : + ((openSubgroupOfNormalClosureFiniteIntermediateField K E : + Subgroup (Gal(AlgebraicClosure K/K)))).Normal := by + change (IntermediateField.normalClosure K E + (AlgebraicClosure K)).fixingSubgroup.Normal + have : Normal K (IntermediateField.normalClosure K E (AlgebraicClosure K)) := by + have : Algebra.IsAlgebraic K E := Algebra.IsAlgebraic.of_finite K E + exact (Algebra.IsAlgebraic.isNormalClosure_normalClosure + (F := K) (K := E) (L := AlgebraicClosure K) + (fun _ => IsAlgClosed.splits _)).normal + infer_instance + +/-- Provides the instance `instNormal`. -/ +instance openSubgroupOfNormalClosureFiniteIntermediateField.instNormal + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : + (openSubgroupOfNormalClosureFiniteIntermediateField K E).toSubgroup.Normal := + openSubgroupOfNormalClosureFiniteIntermediateField_normal K E + +/-- For a normal intermediate field `E ⊆ K^al`, the quotient `G_K/G_E` is the +ordinary Galois group `Gal(E/K)`. The quotient is written with +`Gal(AlgebraicClosure K / K)` so that the normal-subgroup instance for +`E.fixingSubgroup` is available by typeclass search. -/ +def quotientEquivGalOfNormalIntermediateField + (E : IntermediateField K (AlgebraicClosure K)) [Normal K E] : + Gal(AlgebraicClosure K/K) ⧸ E.fixingSubgroup ≃* Gal(E/K) := + (QuotientGroup.quotientMulEquivOfEq + ((IntermediateField.restrictNormalHom_ker E).symm)).trans + (QuotientGroup.quotientKerEquivOfSurjective + (AlgEquiv.restrictNormalHom E : Gal(AlgebraicClosure K/K) →* Gal(E/K)) + (AlgEquiv.restrictNormalHom_surjective (AlgebraicClosure K))) + +/-- States the theorem `quotientEquivGalOfNormalIntermediateField_mk'`. -/ +theorem quotientEquivGalOfNormalIntermediateField_mk' + (E : IntermediateField K (AlgebraicClosure K)) [Normal K E] + (σ : Gal(AlgebraicClosure K/K)) : + quotientEquivGalOfNormalIntermediateField K E + (QuotientGroup.mk' E.fixingSubgroup σ) = + AlgEquiv.restrictNormalHom E σ := by + exact QuotientGroup.kerLift_mk + (AlgEquiv.restrictNormalHom E : Gal(AlgebraicClosure K/K) →* Gal(E/K)) σ + +/-- Quotienting `G_K` by the normal-closure open subgroup attached to a finite +intermediate field gives the Galois group of that normal closure. -/ +def quotientNormalClosureOpenSubgroupEquivGal + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : + Gal(AlgebraicClosure K/K) ⧸ + (openSubgroupOfNormalClosureFiniteIntermediateField K E : + Subgroup (Gal(AlgebraicClosure K/K))) ≃* + Gal(IntermediateField.normalClosure K E (AlgebraicClosure K)/K) := + quotientEquivGalOfNormalIntermediateField K + (IntermediateField.normalClosure K E (AlgebraicClosure K)) + +/-- States the theorem `quotientNormalClosureOpenSubgroupEquivGal_mk'`. -/ +theorem quotientNormalClosureOpenSubgroupEquivGal_mk' + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] + (σ : Gal(AlgebraicClosure K/K)) : + quotientNormalClosureOpenSubgroupEquivGal K E + (QuotientGroup.mk' + (openSubgroupOfNormalClosureFiniteIntermediateField K E : + Subgroup (Gal(AlgebraicClosure K/K))) σ) = + AlgEquiv.restrictNormalHom + (IntermediateField.normalClosure K E (AlgebraicClosure K)) σ := + quotientEquivGalOfNormalIntermediateField_mk' K + (IntermediateField.normalClosure K E (AlgebraicClosure K)) σ + +/-- The index of the normal-closure open subgroup is the cardinality of the +finite automorphism group of the normal closure. -/ +theorem openSubgroupOfNormalClosureFiniteIntermediateField_index_eq_natCard_gal + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : + (openSubgroupOfNormalClosureFiniteIntermediateField K E : + Subgroup (Gal(AlgebraicClosure K/K))).index = + Nat.card (Gal(IntermediateField.normalClosure K E (AlgebraicClosure K)/K)) := by + rw [Subgroup.index_eq_card] + exact Nat.card_congr (quotientNormalClosureOpenSubgroupEquivGal K E).toEquiv + +/-- Provides the instance `instFiniteIndex`. -/ +instance openSubgroupOfNormalClosureFiniteIntermediateField.instFiniteIndex + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : + ((openSubgroupOfNormalClosureFiniteIntermediateField K E : + Subgroup (Gal(AlgebraicClosure K/K)))).FiniteIndex := by + rw [Subgroup.finiteIndex_iff, + openSubgroupOfNormalClosureFiniteIntermediateField_index_eq_natCard_gal] + exact Nat.card_pos.ne' + +/-- Provides the instance `instFiniteIndex`. -/ +instance openSubgroupOfFiniteIntermediateField.instFiniteIndex + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : + ((openSubgroupOfFiniteIntermediateField K E : + Subgroup (Gal(AlgebraicClosure K/K)))).FiniteIndex := + Subgroup.finiteIndex_of_le + (openSubgroupOfNormalClosureFiniteIntermediateField_le K E) + +/-- If the chosen algebraic closure is Galois over `K`, the index of the +finite-intermediate-field open subgroup is `[E : K]`. This hypothesis is +automatic in characteristic zero, but is intentionally explicit in general. -/ +theorem openSubgroupOfFiniteIntermediateField_index_eq_finrank + [IsGalois K (AlgebraicClosure K)] + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : + (openSubgroupOfFiniteIntermediateField K E : + Subgroup (Gal(AlgebraicClosure K/K))).index = Module.finrank K E := by + change E.fixingSubgroup.index = Module.finrank K E + exact (IntermediateField.finrank_eq_fixingSubgroup_index + (F := K) (AlgebraicClosure K) E).symm + +/-- The image of `Gal(K^al/E) → G_K` has finite index for finite `E/K`. -/ +theorem range_ofIntermediateField_finiteIndex + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : + (MonoidHom.range (ofIntermediateField K E)).FiniteIndex := by + rw [range_ofIntermediateField_eq_openSubgroup] + infer_instance + +/-- If the chosen algebraic closure is Galois over `K`, the image of +`Gal(K^al/E) → G_K` has index `[E : K]`. -/ +theorem range_ofIntermediateField_index_eq_finrank + [IsGalois K (AlgebraicClosure K)] + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : + (MonoidHom.range (ofIntermediateField K E)).index = Module.finrank K E := by + rw [range_ofIntermediateField_eq_openSubgroup] + exact openSubgroupOfFiniteIntermediateField_index_eq_finrank K E + +/-- An open subgroup of `G_K`, viewed as a closed subgroup. This is the bridge +from the topological finite-level API to mathlib's infinite Galois +correspondence. -/ +def closedSubgroupOfOpenSubgroup + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + ClosedSubgroup (Gal(AlgebraicClosure K/K)) := + ⟨H.toSubgroup, by + change IsClosed (H : Set (Gal(AlgebraicClosure K/K))) + exact H.isClosed⟩ + +/-- States the theorem `closedSubgroupOfOpenSubgroup_toSubgroup`. -/ +@[simp] +theorem closedSubgroupOfOpenSubgroup_toSubgroup + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + (closedSubgroupOfOpenSubgroup K H : + Subgroup (Gal(AlgebraicClosure K/K))) = H.toSubgroup := + rfl + +/-- The finite fixed field attached to an open subgroup of `G_K`. -/ +def fixedFieldOfOpenSubgroup + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + IntermediateField K (AlgebraicClosure K) := + IntermediateField.fixedField H.toSubgroup + +/-- States the theorem `fixedFieldOfOpenSubgroup_def`. -/ +@[simp] +theorem fixedFieldOfOpenSubgroup_def + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + fixedFieldOfOpenSubgroup K H = + IntermediateField.fixedField H.toSubgroup := + rfl + +/-- The fixing subgroup of the fixed field of an open subgroup is the original +open subgroup, as a subgroup of `G_K`. -/ +theorem fixingSubgroup_fixedFieldOfOpenSubgroup + [IsGalois K (AlgebraicClosure K)] + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + (fixedFieldOfOpenSubgroup K H).fixingSubgroup = H.toSubgroup := by + exact InfiniteGalois.fixingSubgroup_fixedField + (closedSubgroupOfOpenSubgroup K H) + +/-- Open subgroups of `G_K` have finite fixed fields. -/ +theorem finiteDimensional_fixedFieldOfOpenSubgroup + [IsGalois K (AlgebraicClosure K)] + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + FiniteDimensional K (fixedFieldOfOpenSubgroup K H) := by + refine (InfiniteGalois.isOpen_iff_finite + (K := AlgebraicClosure K) (fixedFieldOfOpenSubgroup K H)).1 ?_ + rw [fixingSubgroup_fixedFieldOfOpenSubgroup K H] + exact H.isOpen' + +/-- Provides the instance `instFiniteDimensional`. -/ +instance fixedFieldOfOpenSubgroup.instFiniteDimensional + [IsGalois K (AlgebraicClosure K)] + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + FiniteDimensional K (fixedFieldOfOpenSubgroup K H) := + finiteDimensional_fixedFieldOfOpenSubgroup K H + +/-- The reverse construction sends the finite-subextension open subgroup back +to the original finite intermediate field. -/ +theorem fixedFieldOfOpenSubgroup_openSubgroupOfFiniteIntermediateField + [IsGalois K (AlgebraicClosure K)] + (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : + fixedFieldOfOpenSubgroup K + (openSubgroupOfFiniteIntermediateField K E) = E := by + change IntermediateField.fixedField E.fixingSubgroup = E + exact InfiniteGalois.fixedField_fixingSubgroup E + +/-- The finite-intermediate-field construction sends the fixed field of an +open subgroup back to that open subgroup. -/ +theorem openSubgroupOfFiniteIntermediateField_fixedFieldOfOpenSubgroup + [IsGalois K (AlgebraicClosure K)] + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + openSubgroupOfFiniteIntermediateField K + (fixedFieldOfOpenSubgroup K H) = H := by + apply OpenSubgroup.toSubgroup_injective + exact fixingSubgroup_fixedFieldOfOpenSubgroup K H + +private theorem intermediateField_eq_of_fixingSubgroup_eq + [IsGalois K (AlgebraicClosure K)] + {E F : IntermediateField K (AlgebraicClosure K)} + (h : E.fixingSubgroup = F.fixingSubgroup) : + E = F := by + rw [← InfiniteGalois.fixedField_fixingSubgroup E, + ← InfiniteGalois.fixedField_fixingSubgroup F, h] + +/-- The open-subgroup fixed-field construction is antitone. -/ +theorem fixedFieldOfOpenSubgroup_le_of_le + (H J : OpenSubgroup (Gal(AlgebraicClosure K/K))) (hHJ : H ≤ J) : + fixedFieldOfOpenSubgroup K J ≤ fixedFieldOfOpenSubgroup K H := by + exact IntermediateField.fixedField_le hHJ + +/-- Order comparison under the open-subgroup fixed-field correspondence. -/ +theorem fixedFieldOfOpenSubgroup_le_iff + [IsGalois K (AlgebraicClosure K)] + (H J : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + fixedFieldOfOpenSubgroup K H ≤ fixedFieldOfOpenSubgroup K J ↔ J ≤ H := by + constructor + · intro h + have hfix : + (fixedFieldOfOpenSubgroup K J).fixingSubgroup ≤ + (fixedFieldOfOpenSubgroup K H).fixingSubgroup := + IntermediateField.fixingSubgroup_le h + rw [fixingSubgroup_fixedFieldOfOpenSubgroup K J, + fixingSubgroup_fixedFieldOfOpenSubgroup K H] at hfix + exact hfix + · intro h + exact fixedFieldOfOpenSubgroup_le_of_le K J H h + +/-- Intersection of open subgroups corresponds to compositum of finite fixed +fields. -/ +theorem fixedFieldOfOpenSubgroup_inf + [IsGalois K (AlgebraicClosure K)] + (H J : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + fixedFieldOfOpenSubgroup K (H ⊓ J) = + fixedFieldOfOpenSubgroup K H ⊔ fixedFieldOfOpenSubgroup K J := by + apply intermediateField_eq_of_fixingSubgroup_eq K + rw [fixingSubgroup_fixedFieldOfOpenSubgroup K (H ⊓ J), + IntermediateField.fixingSubgroup_sup, + fixingSubgroup_fixedFieldOfOpenSubgroup K H, + fixingSubgroup_fixedFieldOfOpenSubgroup K J, + OpenSubgroup.toSubgroup_inf] + +/-- The open subgroup generated by two open subgroups corresponds to the +intersection of their finite fixed fields. -/ +theorem fixedFieldOfOpenSubgroup_sup + (H J : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + fixedFieldOfOpenSubgroup K (H ⊔ J) = + fixedFieldOfOpenSubgroup K H ⊓ fixedFieldOfOpenSubgroup K J := by + ext x + rw [IntermediateField.mem_inf] + constructor + · intro hx + constructor + · exact (fixedFieldOfOpenSubgroup_le_of_le K H (H ⊔ J) le_sup_left) hx + · exact (fixedFieldOfOpenSubgroup_le_of_le K J (H ⊔ J) le_sup_right) hx + · rintro ⟨hxH, hxJ⟩ + rw [fixedFieldOfOpenSubgroup_def, IntermediateField.mem_fixedField_iff] at hxH hxJ ⊢ + intro σ hσ + change σ ∈ (H.toSubgroup ⊔ J.toSubgroup : + Subgroup (Gal(AlgebraicClosure K/K))) at hσ + rw [Subgroup.sup_eq_closure] at hσ + refine Subgroup.closure_induction (p := fun τ _ => + (show Gal(AlgebraicClosure K/K) from τ) x = x) ?mem ?one ?mul ?inv hσ + · intro τ hτ + rcases hτ with hτ | hτ + · exact hxH τ hτ + · exact hxJ τ hτ + · rfl + · intro τ η _ _ hτ hη + change (show Gal(AlgebraicClosure K/K) from τ) + ((show Gal(AlgebraicClosure K/K) from η) x) = x + rw [hη, hτ] + · intro τ _ hτ + have h := + congrArg (fun y => + ((show Gal(AlgebraicClosure K/K) from τ)⁻¹) y) hτ + simpa using h.symm + +/-- Conjugate an arbitrary open subgroup of `G_K` through the finite-level +reverse Galois correspondence. Its fixed field is the image of the original +finite fixed field under the chosen absolute Galois element. -/ +def conjugateOpenSubgroupOfOpenSubgroup + [IsGalois K (AlgebraicClosure K)] + (σ : Gal(AlgebraicClosure K/K)) + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + OpenSubgroup (Gal(AlgebraicClosure K/K)) := by + let E : IntermediateField K (AlgebraicClosure K) := + fixedFieldOfOpenSubgroup K H + haveI : FiniteDimensional K E := + fixedFieldOfOpenSubgroup.instFiniteDimensional K H + let σ' : Gal(AlgebraicClosure K/K) := σ + haveI : FiniteDimensional K (E.map σ'.toAlgHom) := by + exact finiteDimensional_map_algEquiv σ' E + exact openSubgroupOfFiniteIntermediateField K (E.map σ'.toAlgHom) + +/-- The subgroup underlying the conjugate open subgroup is the pointwise +conjugate subgroup. -/ +@[simp] +theorem conjugateOpenSubgroupOfOpenSubgroup_toSubgroup + [IsGalois K (AlgebraicClosure K)] + (σ : Gal(AlgebraicClosure K/K)) + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + (conjugateOpenSubgroupOfOpenSubgroup K σ H : + Subgroup (Gal(AlgebraicClosure K/K))) = + Subgroup.map (MulAut.conj σ).toMonoidHom H.toSubgroup := by + let E : IntermediateField K (AlgebraicClosure K) := + fixedFieldOfOpenSubgroup K H + let σ' : Gal(AlgebraicClosure K/K) := σ + change (E.map σ'.toAlgHom).fixingSubgroup = + Subgroup.map (MulAut.conj σ').toMonoidHom H.toSubgroup + calc + (E.map σ'.toAlgHom).fixingSubgroup = + (MulAut.conj σ') • E.fixingSubgroup := + IsGalois.map_fixingSubgroup E σ' + _ = Subgroup.map (MulAut.conj σ').toMonoidHom E.fixingSubgroup := by + ext τ + rw [Subgroup.pointwise_smul_def] + constructor <;> rintro ⟨η, hη, rfl⟩ <;> exact ⟨η, hη, rfl⟩ + _ = Subgroup.map (MulAut.conj σ').toMonoidHom H.toSubgroup := by + rw [fixingSubgroup_fixedFieldOfOpenSubgroup K H] + +/-- Membership in a conjugate arbitrary open subgroup can be tested by +conjugating the element back into the original open subgroup. -/ +theorem mem_conjugateOpenSubgroupOfOpenSubgroup_iff + [IsGalois K (AlgebraicClosure K)] + (σ τ : Gal(AlgebraicClosure K/K)) + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + τ ∈ conjugateOpenSubgroupOfOpenSubgroup K σ H ↔ + σ⁻¹ * τ * σ ∈ H := by + change τ ∈ (conjugateOpenSubgroupOfOpenSubgroup K σ H : + Subgroup (Gal(AlgebraicClosure K/K))) ↔ + σ⁻¹ * τ * σ ∈ H + rw [conjugateOpenSubgroupOfOpenSubgroup_toSubgroup] + constructor + · rintro ⟨η, hη, rfl⟩ + simpa [MulAut.conj_apply, mul_assoc] using hη + · intro hτ + refine ⟨σ⁻¹ * τ * σ, hτ, ?_⟩ + simp [MulAut.conj_apply, mul_assoc] + +/-- The fixed field of the conjugate open subgroup is the conjugate of the +finite fixed field. -/ +theorem fixedFieldOfConjugateOpenSubgroupOfOpenSubgroup + [IsGalois K (AlgebraicClosure K)] + (σ : Gal(AlgebraicClosure K/K)) + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + fixedFieldOfOpenSubgroup K + (conjugateOpenSubgroupOfOpenSubgroup K σ H) = + (fixedFieldOfOpenSubgroup K H).map + (show Gal(AlgebraicClosure K/K) from σ).toAlgHom := by + let E : IntermediateField K (AlgebraicClosure K) := + fixedFieldOfOpenSubgroup K H + change fixedFieldOfOpenSubgroup K + (openSubgroupOfFiniteIntermediateField K + (E.map (show Gal(AlgebraicClosure K/K) from σ).toAlgHom)) = + E.map (show Gal(AlgebraicClosure K/K) from σ).toAlgHom + exact fixedFieldOfOpenSubgroup_openSubgroupOfFiniteIntermediateField K + (E.map (show Gal(AlgebraicClosure K/K) from σ).toAlgHom) + +/-- Conjugation carries the fixed field of an intersection of open subgroups +to the conjugate of the compositum of their fixed fields. -/ +theorem fixedFieldOfConjugateOpenSubgroupOfOpenSubgroup_inf + [IsGalois K (AlgebraicClosure K)] + (σ : Gal(AlgebraicClosure K/K)) + (H J : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + fixedFieldOfOpenSubgroup K + (conjugateOpenSubgroupOfOpenSubgroup K σ (H ⊓ J)) = + (fixedFieldOfOpenSubgroup K H ⊔ fixedFieldOfOpenSubgroup K J).map + (show Gal(AlgebraicClosure K/K) from σ).toAlgHom := by + rw [fixedFieldOfConjugateOpenSubgroupOfOpenSubgroup, + fixedFieldOfOpenSubgroup_inf] + +/-- Conjugation carries the fixed field of the generated open subgroup to the +conjugate of the intersection of the fixed fields. -/ +theorem fixedFieldOfConjugateOpenSubgroupOfOpenSubgroup_sup + [IsGalois K (AlgebraicClosure K)] + (σ : Gal(AlgebraicClosure K/K)) + (H J : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + fixedFieldOfOpenSubgroup K + (conjugateOpenSubgroupOfOpenSubgroup K σ (H ⊔ J)) = + (fixedFieldOfOpenSubgroup K H ⊓ fixedFieldOfOpenSubgroup K J).map + (show Gal(AlgebraicClosure K/K) from σ).toAlgHom := by + rw [fixedFieldOfConjugateOpenSubgroupOfOpenSubgroup, + fixedFieldOfOpenSubgroup_sup] + +/-- States the theorem `conjugateOpenSubgroupOfOpenSubgroup_one`. -/ +@[simp] +theorem conjugateOpenSubgroupOfOpenSubgroup_one + [IsGalois K (AlgebraicClosure K)] + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + conjugateOpenSubgroupOfOpenSubgroup K 1 H = H := by + apply OpenSubgroup.toSubgroup_injective + rw [conjugateOpenSubgroupOfOpenSubgroup_toSubgroup] + ext τ + simp + +/-- States the theorem `conjugateOpenSubgroupOfOpenSubgroup_inf`. -/ +@[simp] +theorem conjugateOpenSubgroupOfOpenSubgroup_inf + [IsGalois K (AlgebraicClosure K)] + (σ : Gal(AlgebraicClosure K/K)) + (H J : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + conjugateOpenSubgroupOfOpenSubgroup K σ (H ⊓ J) = + conjugateOpenSubgroupOfOpenSubgroup K σ H ⊓ + conjugateOpenSubgroupOfOpenSubgroup K σ J := by + apply OpenSubgroup.toSubgroup_injective + rw [conjugateOpenSubgroupOfOpenSubgroup_toSubgroup] + rw [OpenSubgroup.toSubgroup_inf, OpenSubgroup.toSubgroup_inf, + conjugateOpenSubgroupOfOpenSubgroup_toSubgroup, + conjugateOpenSubgroupOfOpenSubgroup_toSubgroup, + Subgroup.map_inf] + exact (MulAut.conj σ).injective + +/-- States the theorem `conjugateOpenSubgroupOfOpenSubgroup_sup`. -/ +@[simp] +theorem conjugateOpenSubgroupOfOpenSubgroup_sup + [IsGalois K (AlgebraicClosure K)] + (σ : Gal(AlgebraicClosure K/K)) + (H J : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + conjugateOpenSubgroupOfOpenSubgroup K σ (H ⊔ J) = + conjugateOpenSubgroupOfOpenSubgroup K σ H ⊔ + conjugateOpenSubgroupOfOpenSubgroup K σ J := by + apply OpenSubgroup.toSubgroup_injective + rw [conjugateOpenSubgroupOfOpenSubgroup_toSubgroup] + rw [OpenSubgroup.toSubgroup_sup, OpenSubgroup.toSubgroup_sup, + conjugateOpenSubgroupOfOpenSubgroup_toSubgroup, + conjugateOpenSubgroupOfOpenSubgroup_toSubgroup, + Subgroup.map_sup] + +/-- The normal core of an open subgroup of `G_K`, as an open normal subgroup. +This is the canonical finite Galois quotient lying below an arbitrary finite +level. -/ +def openNormalCoreOfOpenSubgroup + [IsGalois K (AlgebraicClosure K)] + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + OpenNormalSubgroup (Gal(AlgebraicClosure K/K)) where + toOpenSubgroup := + ⟨H.toSubgroup.normalCore, by + have : Finite (Gal(AlgebraicClosure K/K) ⧸ H.toSubgroup) := + Subgroup.quotient_finite_of_isOpen H.toSubgroup H.isOpen + have : H.toSubgroup.normalCore.FiniteIndex := + normalCore_finiteIndex_of_finite_quotient H.toSubgroup + exact Subgroup.isOpen_of_isClosed_of_finiteIndex H.toSubgroup.normalCore + (Subgroup.normalCore_isClosed H.toSubgroup (by simpa using H.isClosed))⟩ + isNormal' := Subgroup.normalCore_normal H.toSubgroup + +/-- States the theorem `openNormalCoreOfOpenSubgroup_toSubgroup`. -/ +@[simp] +theorem openNormalCoreOfOpenSubgroup_toSubgroup + [IsGalois K (AlgebraicClosure K)] + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + (openNormalCoreOfOpenSubgroup K H : + Subgroup (Gal(AlgebraicClosure K/K))) = H.toSubgroup.normalCore := + rfl + +/-- The normal core is contained in the original open subgroup. -/ +theorem openNormalCoreOfOpenSubgroup_le + [IsGalois K (AlgebraicClosure K)] + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + (openNormalCoreOfOpenSubgroup K H : + Subgroup (Gal(AlgebraicClosure K/K))) ≤ H.toSubgroup := by + rw [openNormalCoreOfOpenSubgroup_toSubgroup] + exact Subgroup.normalCore_le H.toSubgroup + +/-- The fixed field of an open normal subgroup is a finite Galois +intermediate field. -/ +def fixedFieldOfOpenNormalSubgroup + (H : OpenNormalSubgroup (Gal(AlgebraicClosure K/K))) : + IntermediateField K (AlgebraicClosure K) := + fixedFieldOfOpenSubgroup K H.toOpenSubgroup + +/-- States the theorem `fixedFieldOfOpenNormalSubgroup_def`. -/ +@[simp] +theorem fixedFieldOfOpenNormalSubgroup_def + (H : OpenNormalSubgroup (Gal(AlgebraicClosure K/K))) : + fixedFieldOfOpenNormalSubgroup K H = + IntermediateField.fixedField H.toSubgroup := + rfl + +/-- Provides the instance `instFiniteDimensional`. -/ +instance fixedFieldOfOpenNormalSubgroup.instFiniteDimensional + [IsGalois K (AlgebraicClosure K)] + (H : OpenNormalSubgroup (Gal(AlgebraicClosure K/K))) : + FiniteDimensional K (fixedFieldOfOpenNormalSubgroup K H) := + fixedFieldOfOpenSubgroup.instFiniteDimensional K H.toOpenSubgroup + +/-- States the theorem `isGalois_fixedFieldOfOpenNormalSubgroup`. -/ +theorem isGalois_fixedFieldOfOpenNormalSubgroup + [IsGalois K (AlgebraicClosure K)] + (H : OpenNormalSubgroup (Gal(AlgebraicClosure K/K))) : + IsGalois K (fixedFieldOfOpenNormalSubgroup K H) := by + refine (InfiniteGalois.normal_iff_isGalois + (K := AlgebraicClosure K) (fixedFieldOfOpenNormalSubgroup K H)).1 ?_ + change (fixedFieldOfOpenSubgroup K H.toOpenSubgroup).fixingSubgroup.Normal + rw [fixingSubgroup_fixedFieldOfOpenSubgroup K H.toOpenSubgroup] + infer_instance + +/-- Provides the instance `instNormal`. -/ +instance fixedFieldOfOpenNormalSubgroup.instNormal + [IsGalois K (AlgebraicClosure K)] + (H : OpenNormalSubgroup (Gal(AlgebraicClosure K/K))) : + Normal K (fixedFieldOfOpenNormalSubgroup K H) := by + have : IsGalois K (fixedFieldOfOpenNormalSubgroup K H) := + isGalois_fixedFieldOfOpenNormalSubgroup K H + infer_instance + +/-- The finite Galois quotient attached to an arbitrary open normal subgroup +of `G_K`. -/ +def quotientOpenNormalSubgroupEquivGalFixedField + [IsGalois K (AlgebraicClosure K)] + (H : OpenNormalSubgroup (Gal(AlgebraicClosure K/K))) : + Gal(AlgebraicClosure K/K) ⧸ H.toSubgroup ≃* + Gal(fixedFieldOfOpenNormalSubgroup K H/K) := by + let Hc : ClosedSubgroup (Gal(AlgebraicClosure K/K)) := + closedSubgroupOfOpenSubgroup K H.toOpenSubgroup + haveI : Hc.Normal := by + change H.toSubgroup.Normal + infer_instance + exact InfiniteGalois.normalAutEquivQuotient Hc + +/-- States the theorem `quotientOpenNormalSubgroupEquivGalFixedField_mk'`. -/ +theorem quotientOpenNormalSubgroupEquivGalFixedField_mk' + [IsGalois K (AlgebraicClosure K)] + (H : OpenNormalSubgroup (Gal(AlgebraicClosure K/K))) + (σ : Gal(AlgebraicClosure K/K)) : + quotientOpenNormalSubgroupEquivGalFixedField K H + (QuotientGroup.mk' H.toSubgroup σ) = + AlgEquiv.restrictNormalHom + (fixedFieldOfOpenNormalSubgroup K H) σ := by + let Hc : ClosedSubgroup (Gal(AlgebraicClosure K/K)) := + closedSubgroupOfOpenSubgroup K H.toOpenSubgroup + have : Hc.Normal := by + change H.toSubgroup.Normal + infer_instance + change InfiniteGalois.normalAutEquivQuotient Hc + (QuotientGroup.mk' Hc.toSubgroup σ) = + AlgEquiv.restrictNormalHom (IntermediateField.fixedField Hc.toSubgroup) σ + exact InfiniteGalois.normalAutEquivQuotient_apply Hc σ + +/-- Passing from an open subgroup to its normal core corresponds on fixed +fields to taking the normal closure. -/ +theorem fixedFieldOfOpenNormalCoreOfOpenSubgroup + [IsGalois K (AlgebraicClosure K)] + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + fixedFieldOfOpenNormalSubgroup K + (openNormalCoreOfOpenSubgroup K H) = + IntermediateField.normalClosure K (fixedFieldOfOpenSubgroup K H) + (AlgebraicClosure K) := by + let E : IntermediateField K (AlgebraicClosure K) := + fixedFieldOfOpenSubgroup K H + let C : OpenNormalSubgroup (Gal(AlgebraicClosure K/K)) := + openNormalCoreOfOpenSubgroup K H + apply intermediateField_eq_of_fixingSubgroup_eq K + change (fixedFieldOfOpenSubgroup K C.toOpenSubgroup).fixingSubgroup = + (IntermediateField.normalClosure K E (AlgebraicClosure K)).fixingSubgroup + rw [fixingSubgroup_fixedFieldOfOpenSubgroup K C.toOpenSubgroup] + change H.toSubgroup.normalCore = + (IntermediateField.normalClosure K E (AlgebraicClosure K)).fixingSubgroup + apply le_antisymm + · have hE_le_core : + E ≤ fixedFieldOfOpenNormalSubgroup K C := by + change fixedFieldOfOpenSubgroup K H ≤ + fixedFieldOfOpenSubgroup K C.toOpenSubgroup + exact fixedFieldOfOpenSubgroup_le_of_le K C.toOpenSubgroup H + (openNormalCoreOfOpenSubgroup_le K H) + have : Normal K (fixedFieldOfOpenNormalSubgroup K C) := by + infer_instance + have hcl : + IntermediateField.normalClosure K E (AlgebraicClosure K) ≤ + fixedFieldOfOpenNormalSubgroup K C := by + exact (IntermediateField.normalClosure_le_iff_of_normal + (K₁ := E) (K₂ := fixedFieldOfOpenNormalSubgroup K C)).2 hE_le_core + have hfix : + (fixedFieldOfOpenNormalSubgroup K C).fixingSubgroup ≤ + (IntermediateField.normalClosure K E + (AlgebraicClosure K)).fixingSubgroup := + IntermediateField.fixingSubgroup_le hcl + change H.toSubgroup.normalCore ≤ + (IntermediateField.normalClosure K E + (AlgebraicClosure K)).fixingSubgroup + rw [← openNormalCoreOfOpenSubgroup_toSubgroup K H, + ← fixingSubgroup_fixedFieldOfOpenSubgroup K C.toOpenSubgroup] + exact hfix + · have hNleH : + (IntermediateField.normalClosure K E + (AlgebraicClosure K)).fixingSubgroup ≤ H.toSubgroup := by + rw [← fixingSubgroup_fixedFieldOfOpenSubgroup K H] + exact IntermediateField.fixingSubgroup_le + (IntermediateField.le_normalClosure E) + have : IsGalois K + (IntermediateField.normalClosure K E (AlgebraicClosure K)) := by + infer_instance + have : + ((IntermediateField.normalClosure K E + (AlgebraicClosure K)).fixingSubgroup).Normal := by + infer_instance + exact (Subgroup.normal_le_normalCore + (H := H.toSubgroup) + (N := (IntermediateField.normalClosure K E + (AlgebraicClosure K)).fixingSubgroup)).2 hNleH + +/-- Normal core is invariant under conjugating the original open subgroup, +expressed on fixed fields. -/ +theorem fixedFieldOfOpenNormalCoreOfConjugateOpenSubgroupOfOpenSubgroup + [IsGalois K (AlgebraicClosure K)] + (σ : Gal(AlgebraicClosure K/K)) + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + fixedFieldOfOpenNormalSubgroup K + (openNormalCoreOfOpenSubgroup K + (conjugateOpenSubgroupOfOpenSubgroup K σ H)) = + fixedFieldOfOpenNormalSubgroup K + (openNormalCoreOfOpenSubgroup K H) := by + rw [fixedFieldOfOpenNormalCoreOfOpenSubgroup, + fixedFieldOfConjugateOpenSubgroupOfOpenSubgroup, + IntermediateField.normalClosure_map_eq, + fixedFieldOfOpenNormalCoreOfOpenSubgroup] + +end absoluteGaloisGroup +end Field + +end + +end RamificationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/ClosedFixingSubgroup.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/ClosedFixingSubgroup.lean new file mode 100644 index 0000000000..767f40fc88 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/ClosedFixingSubgroup.lean @@ -0,0 +1,32 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Infinite +public import Mathlib.FieldTheory.Galois.Profinite +/-! +# Closed fixing subgroups + +This module packages the closed subgroup attached to an intermediate field in +the Krull topology. +-/ + +@[expose] public section + +noncomputable +section + +namespace RamificationTheory + +/-- The closed fixing subgroup attached to an intermediate field. -/ +@[implicit_reducible] +noncomputable def closedFixingSubgroup + (k Ω : Type*) [Field k] [Field Ω] [Algebra k Ω] [IsGalois k Ω] + (K : IntermediateField k Ω) : ClosedSubgroup Gal(Ω/k) := + ⟨K.fixingSubgroup, InfiniteGalois.fixingSubgroup_isClosed K⟩ + +end RamificationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/CompositumRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/CompositumRestriction.lean new file mode 100644 index 0000000000..2b6fc1fada --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/CompositumRestriction.lean @@ -0,0 +1,188 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction +/-! +# Restriction from a compositum + +An automorphism of a field generated by two normal intermediate fields is +determined by its restrictions to those fields. +-/ + +@[expose] public section + +noncomputable +section + +namespace LocalClassFieldTheory + +open LocalClassFieldTheory +open RamificationTheory + +universe u v + +variable (K : Type u) {P : Type v} [Field K] [Field P] [Algebra K P] + +/-- Restriction to two normal intermediate fields is jointly injective when +the two fields generate the ambient field. -/ +theorem restrictNormalHom_prod_injective_of_sup_eq_top + (E₁ E₂ : IntermediateField K P) [Normal K E₁] [Normal K E₂] + (hsup : E₁ ⊔ E₂ = ⊤) : + Function.Injective + ((AlgEquiv.restrictNormalHom (F := K) (K₁ := P) E₁).prod + (AlgEquiv.restrictNormalHom (F := K) (K₁ := P) E₂)) := by + refine (injective_iff_map_eq_one _).mpr ?_ + intro sigma hsigma + have hE₁ : AlgEquiv.restrictNormalHom (F := K) (K₁ := P) E₁ sigma = 1 := + congrArg Prod.fst hsigma + have hE₂ : AlgEquiv.restrictNormalHom (F := K) (K₁ := P) E₂ sigma = 1 := + congrArg Prod.snd hsigma + have hfixE₁ : sigma ∈ E₁.fixingSubgroup := by + rw [← IntermediateField.restrictNormalHom_ker] + exact MonoidHom.mem_ker.mpr hE₁ + have hfixE₂ : sigma ∈ E₂.fixingSubgroup := by + rw [← IntermediateField.restrictNormalHom_ker] + exact MonoidHom.mem_ker.mpr hE₂ + have hfix : sigma ∈ (E₁ ⊔ E₂).fixingSubgroup := by + rw [IntermediateField.fixingSubgroup_sup] + exact ⟨hfixE₁, hfixE₂⟩ + rw [hsup, IntermediateField.fixingSubgroup_top] at hfix + exact hfix + +universe w + +/-- If two normal intermediate fields generate a third intermediate field in +a common ambient extension, restriction from the generated field to the two +factors is jointly injective. -/ +theorem intermediateFieldRestrictNormalHom_prod_injective_of_sup_eq + {Omega : Type w} [Field Omega] [Algebra K Omega] + (E₁ E₂ F : IntermediateField K Omega) + (hE₁ : E₁ ≤ F) (hE₂ : E₂ ≤ F) + [Normal K E₁] [Normal K E₂] + (hsup : E₁ ⊔ E₂ = F) : + Function.Injective + ((intermediateFieldRestrictNormalHom E₁ F hE₁ : + (F ≃ₐ[K] F) →* (E₁ ≃ₐ[K] E₁)).prod + (intermediateFieldRestrictNormalHom E₂ F hE₂ : + (F ≃ₐ[K] F) →* (E₂ ≃ₐ[K] E₂))) := by + let E₁F : IntermediateField K F := IntermediateField.restrict hE₁ + let E₂F : IntermediateField K F := IntermediateField.restrict hE₂ + let : Normal K E₁F := + Normal.of_algEquiv (IntermediateField.restrictAlgEquiv hE₁) + let : Normal K E₂F := + Normal.of_algEquiv (IntermediateField.restrictAlgEquiv hE₂) + have hsupF : E₁F ⊔ E₂F = ⊤ := by + apply IntermediateField.lift_injective F + rw [IntermediateField.lift_sup, IntermediateField.lift_restrict, + IntermediateField.lift_restrict, IntermediateField.lift_top, hsup] + intro σ τ hστ + apply + (restrictNormalHom_prod_injective_of_sup_eq_top K E₁F E₂F hsupF) + apply Prod.ext + · apply AlgEquiv.ext + intro x + have hres : + intermediateFieldRestrictNormalHom E₁ F hE₁ σ = + intermediateFieldRestrictNormalHom E₁ F hE₁ τ := + congrArg Prod.fst hστ + let y : E₁ := + ⟨(E₁F.val x : F).1, + (IntermediateField.mem_restrict hE₁ x).mp x.property⟩ + have hy : IntermediateField.inclusion hE₁ y = E₁F.val x := by + apply Subtype.ext + rfl + have heval : + F.val (σ (E₁F.val x)) = + F.val (τ (E₁F.val x)) := by + have h := + congrArg + (fun a : E₁ ≃ₐ[K] E₁ => E₁.val (a y)) hres + rw [intermediateFieldRestrictNormalHom_apply_val, + intermediateFieldRestrictNormalHom_apply_val] at h + simpa only [hy] using h + apply E₁F.val.injective + calc + E₁F.val + ((AlgEquiv.restrictNormalHom (F := K) (K₁ := F) E₁F) σ x) = + σ (E₁F.val x) := + AlgEquiv.restrictNormal_commutes σ E₁F x + _ = τ (E₁F.val x) := F.val.injective heval + _ = + E₁F.val + ((AlgEquiv.restrictNormalHom (F := K) (K₁ := F) E₁F) τ x) := + (AlgEquiv.restrictNormal_commutes τ E₁F x).symm + · apply AlgEquiv.ext + intro x + have hres : + intermediateFieldRestrictNormalHom E₂ F hE₂ σ = + intermediateFieldRestrictNormalHom E₂ F hE₂ τ := + congrArg Prod.snd hστ + let y : E₂ := + ⟨(E₂F.val x : F).1, + (IntermediateField.mem_restrict hE₂ x).mp x.property⟩ + have hy : IntermediateField.inclusion hE₂ y = E₂F.val x := by + apply Subtype.ext + rfl + have heval : + F.val (σ (E₂F.val x)) = + F.val (τ (E₂F.val x)) := by + have h := + congrArg + (fun a : E₂ ≃ₐ[K] E₂ => E₂.val (a y)) hres + rw [intermediateFieldRestrictNormalHom_apply_val, + intermediateFieldRestrictNormalHom_apply_val] at h + simpa only [hy] using h + apply E₂F.val.injective + calc + E₂F.val + ((AlgEquiv.restrictNormalHom (F := K) (K₁ := F) E₂F) σ x) = + σ (E₂F.val x) := + AlgEquiv.restrictNormal_commutes σ E₂F x + _ = τ (E₂F.val x) := F.val.injective heval + _ = + E₂F.val + ((AlgEquiv.restrictNormalHom (F := K) (K₁ := F) E₂F) τ x) := + (AlgEquiv.restrictNormal_commutes τ E₂F x).symm + +/-- Two subgroups are equal when one jointly injective pair of homomorphisms +has equal right images and both left images are trivial. -/ +theorem subgroup_eq_of_prod_map_injective_of_left_maps_eq_bot + {G G₁ G₂ : Type*} [Group G] [Group G₁] [Group G₂] + (f₁ : G →* G₁) (f₂ : G →* G₂) + (hinjective : Function.Injective (f₁.prod f₂)) + (A B : Subgroup G) + (hA₁ : A.map f₁ = ⊥) (hB₁ : B.map f₁ = ⊥) + (h₂ : A.map f₂ = B.map f₂) : + A = B := by + have hle (C D : Subgroup G) + (hC₁ : C.map f₁ = ⊥) (hD₁ : D.map f₁ = ⊥) + (hCD₂ : C.map f₂ = D.map f₂) : + C ≤ D := by + intro x hx + have hfx₂ : f₂ x ∈ D.map f₂ := by + rw [← hCD₂] + exact ⟨x, hx, rfl⟩ + obtain ⟨y, hy, hy₂⟩ := hfx₂ + have hx₁mem : f₁ x ∈ C.map f₁ := ⟨x, hx, rfl⟩ + have hy₁mem : f₁ y ∈ D.map f₁ := ⟨y, hy, rfl⟩ + rw [hC₁] at hx₁mem + rw [hD₁] at hy₁mem + have hx₁ : f₁ x = 1 := Subgroup.mem_bot.mp hx₁mem + have hy₁ : f₁ y = 1 := Subgroup.mem_bot.mp hy₁mem + have hxy : x = y := by + apply hinjective + apply Prod.ext + · exact hx₁.trans hy₁.symm + · exact hy₂.symm + exact hxy.symm ▸ hy + exact le_antisymm + (hle A B hA₁ hB₁ h₂) + (hle B A hB₁ hA₁ h₂.symm) + +end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/IntermediateFieldRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/IntermediateFieldRestriction.lean new file mode 100644 index 0000000000..39141a5c9c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/IntermediateFieldRestriction.lean @@ -0,0 +1,53 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +/-! +# Restriction between normal intermediate fields + +This module packages the canonical restriction map between two intermediate +fields in a common ambient extension without requiring callers to install the +auxiliary algebra and scalar-tower instances. +-/ + +@[expose] public section + +noncomputable +section + +namespace RamificationTheory + +universe u v + +variable {K : Type u} {Omega : Type v} + [Field K] [Field Omega] [Algebra K Omega] + +/-- Restriction `Gal(F/K) → Gal(E/K)` for two intermediate fields `E ≤ F` +in one ambient extension. -/ +noncomputable def intermediateFieldRestrictNormalHom + (E F : IntermediateField K Omega) (hEF : E ≤ F) [Normal K E] : + (F ≃ₐ[K] F) →* (E ≃ₐ[K] E) := by + letI : Algebra E F := + RingHom.toAlgebra (IntermediateField.inclusion hEF).toRingHom + letI : IsScalarTower K E F := IsScalarTower.of_algebraMap_eq' rfl + exact AlgEquiv.restrictNormalHom E + +/-- Evaluation of the canonical intermediate-field restriction after both +sides are included in the common ambient field. -/ +theorem intermediateFieldRestrictNormalHom_apply_val + (E F : IntermediateField K Omega) (hEF : E ≤ F) [Normal K E] + (sigma : F ≃ₐ[K] F) (x : E) : + E.val (intermediateFieldRestrictNormalHom E F hEF sigma x) = + F.val (sigma (IntermediateField.inclusion hEF x)) := by + let : Algebra E F := + RingHom.toAlgebra (IntermediateField.inclusion hEF).toRingHom + let : IsScalarTower K E F := IsScalarTower.of_algebraMap_eq' rfl + have h := AlgEquiv.restrictNormal_commutes sigma E x + exact congrArg F.val h + +end RamificationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/Ramification.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/Ramification.lean new file mode 100644 index 0000000000..4e3d52de78 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/Ramification.lean @@ -0,0 +1,1762 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.RamificationQuotients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core +public import Mathlib.Data.Rat.Lemmas + +/-! # Ramification -/ + +@[expose] public section +namespace RamificationTheory + +open LocalFieldTheory + +/-! +# Ramification filtrations + +This file provides the group-theoretic lower ramification APIs used by local CFT. +Concrete valued extensions supply the action quotient estimates; the subgroup +and normality/antitonicity consequences are proved here. +-/ + +noncomputable +section + +universe u v + +namespace DiscreteValuationField + +namespace AntitoneNormalSubgroupFiltration + +variable {G : Type u} [Group G] (F : AntitoneNormalSubgroupFiltration G) + +/-- The finite-level Herbrand step +`|G_i| / |G_0|`, written with `Nat.card` so it can be used before a global +fintype instance has been installed. Positivity theorems below carry the +finite-level hypotheses needed to rule out the infinite-cardinality fallback +of `Nat.card`. -/ +noncomputable def herbrandStep (i : Nat) : Rat := + (Nat.card (F.lower i) : Rat) / (Nat.card (F.lower 0) : Rat) + +/-- The natural-index lower Herbrand function as the cumulative sum of the +finite-level steps through `0, ..., n - 1`. -/ +noncomputable def herbrandFunctionNat (n : Nat) : Rat := + Finset.sum (Finset.range n) fun i => F.herbrandStep i + +/-- States the theorem `herbrandFunctionNat_zero`. -/ +@[simp] theorem herbrandFunctionNat_zero : + F.herbrandFunctionNat 0 = 0 := by + simp [herbrandFunctionNat] + +/-- States the theorem `herbrandFunctionNat_succ`. -/ +theorem herbrandFunctionNat_succ (n : Nat) : + F.herbrandFunctionNat (n + 1) = + F.herbrandFunctionNat n + F.herbrandStep n := by + simp [herbrandFunctionNat, Finset.sum_range_succ] + +/-- States the theorem `herbrandStep_nonneg`. -/ +theorem herbrandStep_nonneg (i : Nat) : + 0 <= F.herbrandStep i := by + exact div_nonneg (Nat.cast_nonneg _) (Nat.cast_nonneg _) + +/-- States the theorem `herbrandStep_pos`. -/ +theorem herbrandStep_pos (i : Nat) + [Finite (F.lower i)] [Finite (F.lower 0)] : + 0 < F.herbrandStep i := by + have hi : 0 < Nat.card (F.lower i) := Finite.card_pos + have h0 : 0 < Nat.card (F.lower 0) := Finite.card_pos + exact + div_pos + (Nat.cast_pos.mpr hi) + (Nat.cast_pos.mpr h0) + +/-- States the theorem `herbrandFunctionNat_mono`. -/ +theorem herbrandFunctionNat_mono : + Monotone F.herbrandFunctionNat := by + intro m n hmn + refine Nat.le_induction (m := m) ?base ?step n hmn + · exact le_rfl + · intro k _hmk ih + exact le_trans ih (by + rw [F.herbrandFunctionNat_succ k] + exact le_add_of_nonneg_right (F.herbrandStep_nonneg k)) + +/-- Representative equality criterion in the graded piece `G_n/G_{n+1}`, +in left-quotient form. -/ +theorem gradedPieceMk_eq_iff_inv_mul_mem (n : ℕ) (σ τ : F.lower n) : + F.gradedPieceMk n σ = F.gradedPieceMk n τ ↔ + ((τ⁻¹ * σ : F.lower n) : G) ∈ F.lower (n + 1) := by + rw [F.gradedPieceMk_eq_iff n σ τ] + simpa [div_eq_mul_inv, Subgroup.mem_subgroupOf] using + ((inferInstance : + ((F.lower (n + 1)).subgroupOf (F.lower n)).Normal).mem_comm_iff + (a := σ) (b := τ⁻¹)) + +/-- Representative equality criterion in the tame quotient `G_0/G_1`, in +left-quotient form. -/ +theorem tameQuotientMk_eq_iff_inv_mul_mem (σ τ : F.inertiaSubgroup) : + F.tameQuotientMk σ = F.tameQuotientMk τ ↔ + ((τ⁻¹ * σ : F.inertiaSubgroup) : G) ∈ F.wildInertiaSubgroup := by + rw [F.tameQuotientMk_eq_iff σ τ] + simpa [div_eq_mul_inv, Subgroup.mem_subgroupOf] using + ((inferInstance : + ((F.wildInertiaSubgroup).subgroupOf F.inertiaSubgroup).Normal).mem_comm_iff + (a := σ) (b := τ⁻¹)) + +/-- The natural quotient map `G/G_n → G/G_m` for `m ≤ n`. -/ +def quotientMapOfLe {m n : ℕ} (hmn : m ≤ n) : + F.quotient n →* F.quotient m := + F.quotientMap F n m (MonoidHom.id G) (by + intro σ hσ + simpa using F.antitone hmn hσ) + +/-- States the theorem `quotientMapOfLe_apply_mk`. -/ +@[simp] theorem quotientMapOfLe_apply_mk {m n : ℕ} (hmn : m ≤ n) + (σ : G) : + F.quotientMapOfLe hmn (F.quotientMk n σ) = + F.quotientMk m σ := + rfl + +/-- Level-change quotient maps compose transitively. -/ +theorem quotientMapOfLe_comp {l m n : ℕ} + (hlm : l ≤ m) (hmn : m ≤ n) : + (F.quotientMapOfLe hlm).comp (F.quotientMapOfLe hmn) = + F.quotientMapOfLe (le_trans hlm hmn) := by + apply MonoidHom.ext + intro q + refine F.quotient_inductionOn n + (motive := fun q => + ((F.quotientMapOfLe hlm).comp (F.quotientMapOfLe hmn)) q = + F.quotientMapOfLe (le_trans hlm hmn) q) q ?_ + intro σ + change F.quotientMapOfLe hlm + (F.quotientMapOfLe hmn (F.quotientMk n σ)) = + F.quotientMapOfLe (le_trans hlm hmn) (F.quotientMk n σ) + rw [F.quotientMapOfLe_apply_mk, F.quotientMapOfLe_apply_mk, + F.quotientMapOfLe_apply_mk] + +/-- The level-change quotient map for `n ≤ n` is the identity. -/ +theorem quotientMapOfLe_refl (n : ℕ) : + F.quotientMapOfLe (le_rfl : n ≤ n) = MonoidHom.id (F.quotient n) := by + apply MonoidHom.ext + intro q + refine F.quotient_inductionOn n + (motive := fun q => + F.quotientMapOfLe (le_rfl : n ≤ n) q = + MonoidHom.id (F.quotient n) q) q ?_ + intro σ + change F.quotientMapOfLe (le_rfl : n ≤ n) (F.quotientMk n σ) = + F.quotientMk n σ + exact F.quotientMapOfLe_apply_mk (le_rfl : n ≤ n) σ + +/-- The subgroup of `G/G_n` represented by the coarser ramification group +`G_m`, for `m ≤ n`. -/ +def quotientKernelOfLe {m n : ℕ} (_hmn : m ≤ n) : + Subgroup (F.quotient n) := + (F.quotientMapOfLe _hmn).ker + +/-- The map from the `m`th lower ramification group into `G/G_n`. -/ +def levelSubgroupToQuotient {m n : ℕ} (_hmn : m ≤ n) : + F.lower m →* F.quotient n := + (F.quotientMk n).comp (F.lower m).subtype + +/-- States the theorem `levelSubgroupToQuotient_apply`. -/ +@[simp] theorem levelSubgroupToQuotient_apply {m n : ℕ} (hmn : m ≤ n) + (σ : F.lower m) : + F.levelSubgroupToQuotient hmn σ = + F.quotientMk n (σ : G) := + rfl + +/-- The kernel of `G_m → G/G_n` is `G_n` inside `G_m`. -/ +theorem levelSubgroupToQuotient_ker_eq {m n : ℕ} (hmn : m ≤ n) : + (F.levelSubgroupToQuotient hmn).ker = + (F.lower n).subgroupOf (F.lower m) := by + ext σ + rw [MonoidHom.mem_ker, Subgroup.mem_subgroupOf] + exact F.quotientMk_eq_one_iff n (σ : G) + +/-- The range of `G_m → G/G_n` is the kernel subgroup of +`G/G_n → G/G_m`. -/ +theorem levelSubgroupToQuotient_range_eq_quotientKernelOfLe {m n : ℕ} + (hmn : m ≤ n) : + (F.levelSubgroupToQuotient hmn).range = F.quotientKernelOfLe hmn := by + ext q + constructor + · rintro ⟨σ, rfl⟩ + rw [quotientKernelOfLe, MonoidHom.mem_ker, + F.levelSubgroupToQuotient_apply, F.quotientMapOfLe_apply_mk, + F.quotientMk_eq_one_iff] + exact σ.property + · intro hq + revert hq + refine F.quotient_inductionOn n + (motive := fun q => + q ∈ F.quotientKernelOfLe hmn → + q ∈ (F.levelSubgroupToQuotient hmn).range) q ?_ + intro σ hq + rw [quotientKernelOfLe, MonoidHom.mem_ker, + F.quotientMapOfLe_apply_mk, F.quotientMk_eq_one_iff] at hq + exact ⟨⟨σ, hq⟩, rfl⟩ + +/-- The kernel of `G/G_n → G/G_m` is the image of `G_m` in `G/G_n`. -/ +theorem quotientMapOfLe_ker_eq_quotientKernelOfLe {m n : ℕ} + (hmn : m ≤ n) : + (F.quotientMapOfLe hmn).ker = F.quotientKernelOfLe hmn := + rfl + +/-- The named kernel subgroup `G_m/G_n` is normal in `G/G_n`. -/ +instance quotientKernelOfLe_normal {m n : ℕ} (hmn : m ≤ n) : + (F.quotientKernelOfLe hmn).Normal := by + rw [← F.quotientMapOfLe_ker_eq_quotientKernelOfLe hmn] + infer_instance + +/-- Representative kernel criterion for `G/G_n → G/G_m`. -/ +theorem quotientMapOfLe_mk_eq_one_iff {m n : ℕ} (hmn : m ≤ n) + (σ : G) : + F.quotientMapOfLe hmn (F.quotientMk n σ) = 1 ↔ + σ ∈ F.lower m := by + rw [F.quotientMapOfLe_apply_mk, F.quotientMk_eq_one_iff] + +/-- Representative membership criterion for the kernel of `G/G_n → G/G_m`. -/ +theorem quotientMapOfLe_mk_mem_ker_iff {m n : ℕ} (hmn : m ≤ n) + (σ : G) : + F.quotientMk n σ ∈ (F.quotientMapOfLe hmn).ker ↔ + σ ∈ F.lower m := by + rw [MonoidHom.mem_ker, F.quotientMapOfLe_mk_eq_one_iff hmn σ] + +/-- Equality after changing level, in right-quotient form. -/ +theorem quotientMapOfLe_mk_eq_iff_div_mem {m n : ℕ} (hmn : m ≤ n) + (σ τ : G) : + F.quotientMapOfLe hmn (F.quotientMk n σ) = + F.quotientMapOfLe hmn (F.quotientMk n τ) ↔ + σ / τ ∈ F.lower m := by + rw [F.quotientMapOfLe_apply_mk, F.quotientMapOfLe_apply_mk, + F.quotientMk_eq_iff] + +/-- Equality after changing level, in left-quotient form. -/ +theorem quotientMapOfLe_mk_eq_iff_inv_mul_mem {m n : ℕ} (hmn : m ≤ n) + (σ τ : G) : + F.quotientMapOfLe hmn (F.quotientMk n σ) = + F.quotientMapOfLe hmn (F.quotientMk n τ) ↔ + τ⁻¹ * σ ∈ F.lower m := by + rw [F.quotientMapOfLe_mk_eq_iff_div_mem hmn σ τ] + simpa [div_eq_mul_inv] using + ((inferInstance : (F.lower m).Normal).mem_comm_iff + (a := σ) (b := τ⁻¹)) + +/-- Arbitrary class kernel criterion for `G/G_n → G/G_m`. -/ +theorem quotientMapOfLe_eq_one_iff_exists_mem_repr {m n : ℕ} + (hmn : m ≤ n) (q : F.quotient n) : + F.quotientMapOfLe hmn q = 1 ↔ + ∃ σ : G, σ ∈ F.lower m ∧ + F.quotientMk n σ = q := by + rw [← MonoidHom.mem_ker, + F.quotientMapOfLe_ker_eq_quotientKernelOfLe hmn] + rw [← F.levelSubgroupToQuotient_range_eq_quotientKernelOfLe hmn] + constructor + · rintro ⟨σ, rfl⟩ + exact ⟨(σ : G), σ.property, rfl⟩ + · rintro ⟨σ, hσ, rfl⟩ + exact ⟨⟨σ, hσ⟩, rfl⟩ + +/-- Kernel-membership criterion for an arbitrary class in `G/G_n → G/G_m`, +expanded by a representative from `G_m`. -/ +theorem quotientMapOfLe_mem_ker_iff_exists_mem_repr {m n : ℕ} + (hmn : m ≤ n) (q : F.quotient n) : + q ∈ (F.quotientMapOfLe hmn).ker ↔ + ∃ σ : G, σ ∈ F.lower m ∧ + F.quotientMk n σ = q := by + rw [MonoidHom.mem_ker] + exact F.quotientMapOfLe_eq_one_iff_exists_mem_repr hmn q + +/-- Membership in the named kernel subgroup of `G/G_n → G/G_m`, expanded by a +representative from `G_m`. -/ +theorem mem_quotientKernelOfLe_iff_exists_mem_repr {m n : ℕ} + (hmn : m ≤ n) (q : F.quotient n) : + q ∈ F.quotientKernelOfLe hmn ↔ + ∃ σ : G, σ ∈ F.lower m ∧ + F.quotientMk n σ = q := by + rw [← F.quotientMapOfLe_ker_eq_quotientKernelOfLe hmn] + exact F.quotientMapOfLe_mem_ker_iff_exists_mem_repr hmn q + +/-- Membership in the named kernel subgroup is the same as mapping to `1` +under the corresponding level-change map. -/ +theorem mem_quotientKernelOfLe_iff_quotientMap_eq_one {m n : ℕ} + (hmn : m ≤ n) (q : F.quotient n) : + q ∈ F.quotientKernelOfLe hmn ↔ + F.quotientMapOfLe hmn q = 1 := by + rw [← F.quotientMapOfLe_ker_eq_quotientKernelOfLe hmn, + MonoidHom.mem_ker] + +/-- Kernel subgroups are nested as the target quotient is coarsened: +`G_m/G_n` is contained in `G_l/G_n` for `l ≤ m ≤ n`. -/ +theorem quotientKernelOfLe_le {l m n : ℕ} + (hlm : l ≤ m) (hmn : m ≤ n) : + F.quotientKernelOfLe hmn ≤ + F.quotientKernelOfLe (le_trans hlm hmn) := by + intro q hq + rw [F.mem_quotientKernelOfLe_iff_exists_mem_repr hmn] at hq + rcases hq with ⟨σ, hσ, hqσ⟩ + rw [F.mem_quotientKernelOfLe_iff_exists_mem_repr (le_trans hlm hmn)] + exact ⟨σ, F.antitone hlm hσ, hqσ⟩ + +/-- Membership in the coarser kernel after applying a level-change map is +equivalent to membership in the corresponding direct kernel. -/ +theorem quotientMapOfLe_mem_quotientKernelOfLe_iff {l m n : ℕ} + (hlm : l ≤ m) (hmn : m ≤ n) (q : F.quotient n) : + F.quotientMapOfLe hmn q ∈ F.quotientKernelOfLe hlm ↔ + q ∈ F.quotientKernelOfLe (le_trans hlm hmn) := by + rw [F.mem_quotientKernelOfLe_iff_quotientMap_eq_one hlm, + F.mem_quotientKernelOfLe_iff_quotientMap_eq_one (le_trans hlm hmn)] + change ((F.quotientMapOfLe hlm).comp (F.quotientMapOfLe hmn)) q = 1 ↔ + F.quotientMapOfLe (le_trans hlm hmn) q = 1 + rw [F.quotientMapOfLe_comp hlm hmn] + +/-- The preimage of the coarser kernel subgroup under a level-change map is +the corresponding direct kernel subgroup. -/ +theorem quotientMapOfLe_comap_quotientKernelOfLe_eq {l m n : ℕ} + (hlm : l ≤ m) (hmn : m ≤ n) : + Subgroup.comap (F.quotientMapOfLe hmn) (F.quotientKernelOfLe hlm) = + F.quotientKernelOfLe (le_trans hlm hmn) := by + ext q + exact F.quotientMapOfLe_mem_quotientKernelOfLe_iff hlm hmn q + +/-- Representative version of +`quotientMapOfLe_mem_quotientKernelOfLe_iff`. -/ +theorem quotientMapOfLe_mk_mem_quotientKernelOfLe_iff {l m n : ℕ} + (hlm : l ≤ m) (hmn : m ≤ n) (σ : G) : + F.quotientMapOfLe hmn (F.quotientMk n σ) ∈ + F.quotientKernelOfLe hlm ↔ + σ ∈ F.lower l := by + rw [F.quotientMapOfLe_mem_quotientKernelOfLe_iff hlm hmn, + F.mem_quotientKernelOfLe_iff_quotientMap_eq_one (le_trans hlm hmn), + F.quotientMapOfLe_apply_mk, F.quotientMk_eq_one_iff] + +/-- Equality after changing level is kernel membership of the quotient `q / r`. -/ +theorem quotientMapOfLe_eq_iff_div_mem_ker {m n : ℕ} (hmn : m ≤ n) + (q r : F.quotient n) : + F.quotientMapOfLe hmn q = F.quotientMapOfLe hmn r ↔ + q / r ∈ (F.quotientMapOfLe hmn).ker := by + rw [MonoidHom.mem_ker] + constructor + · intro h + rw [MonoidHom.map_div, h] + exact div_self' ((F.quotientMapOfLe hmn) r) + · intro h + rwa [MonoidHom.map_div, div_eq_one] at h + +/-- Equality after changing level is membership of `q / r` in the named kernel +subgroup of `G/G_n → G/G_m`. -/ +theorem quotientMapOfLe_eq_iff_div_mem_quotientKernelOfLe {m n : ℕ} + (hmn : m ≤ n) (q r : F.quotient n) : + F.quotientMapOfLe hmn q = F.quotientMapOfLe hmn r ↔ + q / r ∈ F.quotientKernelOfLe hmn := by + rw [F.quotientMapOfLe_eq_iff_div_mem_ker hmn q r, + F.quotientMapOfLe_ker_eq_quotientKernelOfLe hmn] + +/-- Level-change maps send the larger kernel subgroup `G_l/G_n` onto the +corresponding kernel subgroup `G_l/G_m`, for `l ≤ m ≤ n`. -/ +theorem quotientMapOfLe_map_quotientKernelOfLe_eq {l m n : ℕ} + (hlm : l ≤ m) (hmn : m ≤ n) : + Subgroup.map (F.quotientMapOfLe hmn) + (F.quotientKernelOfLe (le_trans hlm hmn)) = + F.quotientKernelOfLe hlm := by + ext q + constructor + · rintro ⟨x, hx, hxq⟩ + rcases + (F.mem_quotientKernelOfLe_iff_exists_mem_repr + (le_trans hlm hmn) x).1 hx with + ⟨σ, hσ, hxσ⟩ + rw [← hxq, ← hxσ, F.quotientMapOfLe_apply_mk] + exact (F.mem_quotientKernelOfLe_iff_exists_mem_repr hlm _).2 + ⟨σ, hσ, rfl⟩ + · intro hq + rcases + (F.mem_quotientKernelOfLe_iff_exists_mem_repr hlm q).1 hq with + ⟨σ, hσ, hqσ⟩ + refine ⟨F.quotientMk n σ, ?_, ?_⟩ + · exact + (F.mem_quotientKernelOfLe_iff_exists_mem_repr + (le_trans hlm hmn) _).2 ⟨σ, hσ, rfl⟩ + · rw [F.quotientMapOfLe_apply_mk] + exact hqσ + +/-- A level-change map kills exactly the kernel subgroup it is named by. -/ +theorem quotientMapOfLe_map_quotientKernelOfLe_eq_bot {m n : ℕ} + (hmn : m ≤ n) : + Subgroup.map (F.quotientMapOfLe hmn) (F.quotientKernelOfLe hmn) = ⊥ := by + ext q + constructor + · rintro ⟨x, hx, hxq⟩ + have hx' : F.quotientMapOfLe hmn x = 1 := + (F.mem_quotientKernelOfLe_iff_quotientMap_eq_one hmn x).1 hx + rw [← hxq, hx'] + simp + · intro hq + have hq' : q = 1 := by + simpa using hq + subst q + exact ⟨1, (F.quotientKernelOfLe hmn).one_mem, by simp⟩ + +/-- The level-change map restricted to kernel subgroups: +`G_l/G_n → G_l/G_m`, for `l ≤ m ≤ n`. -/ +def quotientKernelMapOfLe {l m n : ℕ} (hlm : l ≤ m) (hmn : m ≤ n) : + F.quotientKernelOfLe (le_trans hlm hmn) →* + F.quotientKernelOfLe hlm := + ((F.quotientMapOfLe hmn).domRestrict + (F.quotientKernelOfLe (le_trans hlm hmn))).codRestrict + (F.quotientKernelOfLe hlm) + (by + intro q + exact + (F.quotientMapOfLe_mem_quotientKernelOfLe_iff hlm hmn q).2 q.property) + +/-- States the theorem `quotientKernelMapOfLe_apply`. -/ +@[simp] theorem quotientKernelMapOfLe_apply {l m n : ℕ} + (hlm : l ≤ m) (hmn : m ≤ n) + (q : F.quotientKernelOfLe (le_trans hlm hmn)) : + ((F.quotientKernelMapOfLe hlm hmn q : + F.quotientKernelOfLe hlm) : F.quotient m) = + F.quotientMapOfLe hmn (q : F.quotient n) := + rfl + +/-- Restricted level-change maps on ramification kernels are identities at a +fixed quotient level. -/ +theorem quotientKernelMapOfLe_refl {l m : ℕ} (hlm : l ≤ m) : + F.quotientKernelMapOfLe hlm (le_rfl : m ≤ m) = + MonoidHom.id (F.quotientKernelOfLe hlm) := by + apply MonoidHom.ext + intro q + apply Subtype.ext + change F.quotientMapOfLe (le_rfl : m ≤ m) (q : F.quotient m) = + (q : F.quotient m) + rw [F.quotientMapOfLe_refl m] + rfl + +/-- Restricted level-change maps on ramification kernels compose +transitively. -/ +theorem quotientKernelMapOfLe_comp {k l m n : ℕ} + (hkl : k ≤ l) (hlm : l ≤ m) (hmn : m ≤ n) : + (F.quotientKernelMapOfLe hkl hlm).comp + (F.quotientKernelMapOfLe (le_trans hkl hlm) hmn) = + F.quotientKernelMapOfLe hkl (le_trans hlm hmn) := by + apply MonoidHom.ext + intro q + apply Subtype.ext + change F.quotientMapOfLe hlm + (F.quotientMapOfLe hmn (q : F.quotient n)) = + F.quotientMapOfLe (le_trans hlm hmn) (q : F.quotient n) + change ((F.quotientMapOfLe hlm).comp (F.quotientMapOfLe hmn)) + (q : F.quotient n) = + F.quotientMapOfLe (le_trans hlm hmn) (q : F.quotient n) + rw [F.quotientMapOfLe_comp hlm hmn] + +/-- The restricted map `G_l/G_n → G_l/G_m` has kernel `G_m/G_n`. -/ +theorem quotientKernelMapOfLe_ker_eq {l m n : ℕ} + (hlm : l ≤ m) (hmn : m ≤ n) : + (F.quotientKernelMapOfLe hlm hmn).ker = + (F.quotientKernelOfLe hmn).subgroupOf + (F.quotientKernelOfLe (le_trans hlm hmn)) := by + ext q + rw [MonoidHom.mem_ker, Subgroup.mem_subgroupOf] + constructor + · intro hq + have hq' := congrArg Subtype.val hq + change F.quotientMapOfLe hmn (q : F.quotient n) = 1 at hq' + exact (F.mem_quotientKernelOfLe_iff_quotientMap_eq_one hmn + (q : F.quotient n)).2 hq' + · intro hq + apply Subtype.ext + change F.quotientMapOfLe hmn (q : F.quotient n) = 1 + exact (F.mem_quotientKernelOfLe_iff_quotientMap_eq_one hmn + (q : F.quotient n)).1 hq + +/-- The restricted map `G_l/G_n → G_l/G_m` is surjective. -/ +theorem quotientKernelMapOfLe_surjective {l m n : ℕ} + (hlm : l ≤ m) (hmn : m ≤ n) : + Function.Surjective (F.quotientKernelMapOfLe hlm hmn) := by + intro q + rcases q with ⟨q, hq⟩ + have hq' : + q ∈ Subgroup.map (F.quotientMapOfLe hmn) + (F.quotientKernelOfLe (le_trans hlm hmn)) := by + rw [F.quotientMapOfLe_map_quotientKernelOfLe_eq hlm hmn] + exact hq + rcases hq' with ⟨r, hr, hrq⟩ + refine ⟨⟨r, hr⟩, ?_⟩ + apply Subtype.ext + exact hrq + +/-- First isomorphism theorem inside ramification kernels: +`(G_l/G_n)/ker(G_l/G_n → G_l/G_m) ≃ G_l/G_m`, for `l ≤ m ≤ n`. +The kernel is identified with `G_m/G_n` by +`quotientKernelMapOfLe_ker_eq`. -/ +def quotientKernelQuotientKerEquivQuotientKernelOfLe {l m n : ℕ} + (hlm : l ≤ m) (hmn : m ≤ n) : + F.quotientKernelOfLe (le_trans hlm hmn) ⧸ + (F.quotientKernelMapOfLe hlm hmn).ker ≃* + F.quotientKernelOfLe hlm := + QuotientGroup.quotientKerEquivOfSurjective + (F.quotientKernelMapOfLe hlm hmn) + (F.quotientKernelMapOfLe_surjective hlm hmn) + +/-- States the theorem `quotientKernelQuotientKerEquivQuotientKernelOfLe_mk'`. -/ +theorem quotientKernelQuotientKerEquivQuotientKernelOfLe_mk' + {l m n : ℕ} (hlm : l ≤ m) (hmn : m ≤ n) + (q : F.quotientKernelOfLe (le_trans hlm hmn)) : + F.quotientKernelQuotientKerEquivQuotientKernelOfLe hlm hmn + (QuotientGroup.mk' + (F.quotientKernelMapOfLe hlm hmn).ker q) = + F.quotientKernelMapOfLe hlm hmn q := by + exact QuotientGroup.kerLift_mk (F.quotientKernelMapOfLe hlm hmn) q + +/-- Second-isomorphism-style form of the ramification-kernel quotient: +`(G_l/G_n)/(G_m/G_n) ≃ G_l/G_m`, for `l ≤ m ≤ n`. -/ +def quotientKernelQuotientSubgroupOfEquivQuotientKernelOfLe {l m n : ℕ} + (hlm : l ≤ m) (hmn : m ≤ n) : + F.quotientKernelOfLe (le_trans hlm hmn) ⧸ + (F.quotientKernelOfLe hmn).subgroupOf + (F.quotientKernelOfLe (le_trans hlm hmn)) ≃* + F.quotientKernelOfLe hlm := + (QuotientGroup.quotientMulEquivOfEq + (F.quotientKernelMapOfLe_ker_eq hlm hmn).symm).trans + (F.quotientKernelQuotientKerEquivQuotientKernelOfLe hlm hmn) + +/-- States the theorem `quotientKernelQuotientSubgroupOfEquivQuotientKernelOfLe_mk'`. -/ +theorem quotientKernelQuotientSubgroupOfEquivQuotientKernelOfLe_mk' + {l m n : ℕ} (hlm : l ≤ m) (hmn : m ≤ n) + (q : F.quotientKernelOfLe (le_trans hlm hmn)) : + F.quotientKernelQuotientSubgroupOfEquivQuotientKernelOfLe hlm hmn + (QuotientGroup.mk' + ((F.quotientKernelOfLe hmn).subgroupOf + (F.quotientKernelOfLe (le_trans hlm hmn))) q) = + F.quotientKernelMapOfLe hlm hmn q := by + simpa [quotientKernelQuotientSubgroupOfEquivQuotientKernelOfLe] using + F.quotientKernelQuotientKerEquivQuotientKernelOfLe_mk' hlm hmn q + +/-- Cardinality form of the second-isomorphism quotient compatibility +`(G_l/G_n)/(G_m/G_n) ≃ G_l/G_m`. -/ +theorem card_quotientKernelQuotientSubgroupOfLe {l m n : ℕ} + (hlm : l ≤ m) (hmn : m ≤ n) [Finite G] : + Nat.card + (F.quotientKernelOfLe (le_trans hlm hmn) ⧸ + (F.quotientKernelOfLe hmn).subgroupOf + (F.quotientKernelOfLe (le_trans hlm hmn))) = + Nat.card (F.quotientKernelOfLe hlm) := + Nat.card_congr + (F.quotientKernelQuotientSubgroupOfEquivQuotientKernelOfLe hlm hmn).toEquiv + +/-- Arbitrary class equality criterion for `G/G_n → G/G_m`, expanded as a +representative of `q / r` from `G_m`. -/ +theorem quotientMapOfLe_eq_iff_exists_mem_div_repr {m n : ℕ} + (hmn : m ≤ n) (q r : F.quotient n) : + F.quotientMapOfLe hmn q = F.quotientMapOfLe hmn r ↔ + ∃ σ : G, σ ∈ F.lower m ∧ + F.quotientMk n σ = q / r := by + rw [F.quotientMapOfLe_eq_iff_div_mem_quotientKernelOfLe hmn q r, + F.mem_quotientKernelOfLe_iff_exists_mem_repr hmn] + +/-- The ramification subquotient `G_m/G_n` is canonically the kernel of +`G/G_n → G/G_m`. -/ +def subquotientEquivQuotientKernelOfLe {m n : ℕ} (hmn : m ≤ n) : + F.subquotient m n ≃* + F.quotientKernelOfLe hmn := + (F.subquotientConcreteMulEquiv m n).trans + ((QuotientGroup.quotientMulEquivOfEq + (F.levelSubgroupToQuotient_ker_eq hmn).symm).trans + ((QuotientGroup.quotientKerEquivRange + (F.levelSubgroupToQuotient hmn)).trans + (MulEquiv.subgroupCongr + (F.levelSubgroupToQuotient_range_eq_quotientKernelOfLe hmn)))) + +/-- States the theorem `coe_subquotientEquivQuotientKernelOfLe_mk`. -/ +@[simp] theorem coe_subquotientEquivQuotientKernelOfLe_mk + {m n : ℕ} (hmn : m ≤ n) (σ : F.lower m) : + ((F.subquotientEquivQuotientKernelOfLe hmn + (F.subquotientMk m n σ) : + F.quotientKernelOfLe hmn) : F.quotient n) = + F.quotientMk n (σ : G) := by + simp [subquotientEquivQuotientKernelOfLe] + rfl + +/-- The graded piece `G_n/G_{n+1}` as the kernel of +`G/G_{n+1} → G/G_n`. -/ +def gradedPieceEquivQuotientKernel (n : ℕ) : + F.gradedPiece n ≃* + F.quotientKernelOfLe (Nat.le_succ n) := + (F.gradedPieceEquivSubquotient n).trans + (F.subquotientEquivQuotientKernelOfLe (Nat.le_succ n)) + +/-- States the theorem `coe_gradedPieceEquivQuotientKernel_mk`. -/ +@[simp] theorem coe_gradedPieceEquivQuotientKernel_mk + (n : ℕ) (σ : F.lower n) : + ((F.gradedPieceEquivQuotientKernel n + (F.gradedPieceMk n σ) : + F.quotientKernelOfLe (Nat.le_succ n)) : F.quotient (n + 1)) = + F.quotientMk (n + 1) (σ : G) := by + exact F.coe_subquotientEquivQuotientKernelOfLe_mk (Nat.le_succ n) σ + +/-- At every finite level `N ≥ n + 1`, the `n`th graded piece is the quotient +of finite-level kernels `(G_n/G_N)/(G_{n+1}/G_N)`. -/ +def quotientKernelByNextKernelEquivGradedPiece {n N : ℕ} (hN : n + 1 ≤ N) : + F.quotientKernelOfLe (le_trans (Nat.le_succ n) hN) ⧸ + (F.quotientKernelOfLe hN).subgroupOf + (F.quotientKernelOfLe (le_trans (Nat.le_succ n) hN)) ≃* + F.gradedPiece n := + (F.quotientKernelQuotientSubgroupOfEquivQuotientKernelOfLe + (Nat.le_succ n) hN).trans (F.gradedPieceEquivQuotientKernel n).symm + +/-- States the theorem `gradedPieceEquivQuotientKernel_quotientKernelByNextKernel_mk'`. -/ +theorem gradedPieceEquivQuotientKernel_quotientKernelByNextKernel_mk' + {n N : ℕ} (hN : n + 1 ≤ N) + (q : F.quotientKernelOfLe (le_trans (Nat.le_succ n) hN)) : + F.gradedPieceEquivQuotientKernel n + (F.quotientKernelByNextKernelEquivGradedPiece hN + (QuotientGroup.mk' + ((F.quotientKernelOfLe hN).subgroupOf + (F.quotientKernelOfLe (le_trans (Nat.le_succ n) hN))) q)) = + F.quotientKernelMapOfLe (Nat.le_succ n) hN q := by + simpa [quotientKernelByNextKernelEquivGradedPiece] using + F.quotientKernelQuotientSubgroupOfEquivQuotientKernelOfLe_mk' + (Nat.le_succ n) hN q + +/-- Cardinality form of the finite-level graded-piece compatibility +`(G_n/G_N)/(G_{n+1}/G_N) ≃ G_n/G_{n+1}`. -/ +theorem card_quotientKernelByNextKernel_eq_gradedPiece {n N : ℕ} + (hN : n + 1 ≤ N) [Finite G] : + Nat.card + (F.quotientKernelOfLe (le_trans (Nat.le_succ n) hN) ⧸ + (F.quotientKernelOfLe hN).subgroupOf + (F.quotientKernelOfLe (le_trans (Nat.le_succ n) hN))) = + Nat.card (F.gradedPiece n) := + Nat.card_congr (F.quotientKernelByNextKernelEquivGradedPiece hN).toEquiv + +/-- The natural level-change map `G/G_n → G/G_m` is surjective. -/ +theorem quotientMapOfLe_surjective {m n : ℕ} (hmn : m ≤ n) : + Function.Surjective (F.quotientMapOfLe hmn) := by + intro q + refine F.quotient_inductionOn m + (motive := fun q => ∃ r, F.quotientMapOfLe hmn r = q) q ?_ + intro σ + exact ⟨F.quotientMk n σ, F.quotientMapOfLe_apply_mk hmn σ⟩ + +/-- States the theorem `quotientMapOfLe_range_eq_top`. -/ +theorem quotientMapOfLe_range_eq_top {m n : ℕ} (hmn : m ≤ n) : + (F.quotientMapOfLe hmn).range = ⊤ := + MonoidHom.range_eq_top.2 (F.quotientMapOfLe_surjective hmn) + +/-- The tame quotient `G_0/G_1` as the kernel of `G/G_1 → G/G_0`. -/ +def tameQuotientEquivQuotientKernel : + F.tameQuotient ≃* F.quotientKernelOfLe (Nat.zero_le 1) := + F.tameQuotientEquivGradedPiece.trans + (F.gradedPieceEquivQuotientKernel 0) + +/-- States the theorem `coe_tameQuotientEquivQuotientKernel_mk`. -/ +@[simp] theorem coe_tameQuotientEquivQuotientKernel_mk + (σ : F.inertiaSubgroup) : + ((F.tameQuotientEquivQuotientKernel + (F.tameQuotientMk σ) : + F.quotientKernelOfLe (Nat.zero_le 1)) : F.quotient 1) = + F.quotientMk 1 (σ : G) := by + exact F.coe_gradedPieceEquivQuotientKernel_mk 0 σ + +/-- At every finite level `n ≥ 1`, the tame quotient is the quotient of +finite-level inertia by finite-level wild inertia: +`(G_0/G_n)/(G_1/G_n) ≃ G_0/G_1`. -/ +def quotientInertiaByWildKernelEquivTameQuotient {n : ℕ} (hn : 1 ≤ n) : + F.quotientKernelOfLe (le_trans (Nat.zero_le 1) hn) ⧸ + (F.quotientKernelOfLe hn).subgroupOf + (F.quotientKernelOfLe (le_trans (Nat.zero_le 1) hn)) ≃* + F.tameQuotient := + (F.quotientKernelQuotientSubgroupOfEquivQuotientKernelOfLe + (Nat.zero_le 1) hn).trans F.tameQuotientEquivQuotientKernel.symm + +/-- States the theorem `tameQuotientEquivQuotientKernel_quotientInertiaByWildKernel_mk'`. -/ +theorem tameQuotientEquivQuotientKernel_quotientInertiaByWildKernel_mk' + {n : ℕ} (hn : 1 ≤ n) + (q : F.quotientKernelOfLe (le_trans (Nat.zero_le 1) hn)) : + F.tameQuotientEquivQuotientKernel + (F.quotientInertiaByWildKernelEquivTameQuotient hn + (QuotientGroup.mk' + ((F.quotientKernelOfLe hn).subgroupOf + (F.quotientKernelOfLe (le_trans (Nat.zero_le 1) hn))) q)) = + F.quotientKernelMapOfLe (Nat.zero_le 1) hn q := by + simpa [quotientInertiaByWildKernelEquivTameQuotient] using + F.quotientKernelQuotientSubgroupOfEquivQuotientKernelOfLe_mk' + (Nat.zero_le 1) hn q + +/-- Cardinality form of the finite-level tame quotient compatibility +`(G_0/G_n)/(G_1/G_n) ≃ G_0/G_1`. -/ +theorem card_quotientInertiaByWildKernel_eq_tameQuotient {n : ℕ} + (hn : 1 ≤ n) [Finite G] : + Nat.card + (F.quotientKernelOfLe (le_trans (Nat.zero_le 1) hn) ⧸ + (F.quotientKernelOfLe hn).subgroupOf + (F.quotientKernelOfLe (le_trans (Nat.zero_le 1) hn))) = + Nat.card F.tameQuotient := + Nat.card_congr (F.quotientInertiaByWildKernelEquivTameQuotient hn).toEquiv + +/-- Kernel membership for `G/G_1 → G/G_0`, with a representative already in +the inertia subgroup. -/ +theorem mem_tameQuotientKernel_iff_exists_inertia_repr + (q : F.quotient 1) : + q ∈ F.quotientKernelOfLe (Nat.zero_le 1) ↔ + ∃ σ : F.inertiaSubgroup, + F.quotientMk 1 (σ : G) = q := by + rw [F.mem_quotientKernelOfLe_iff_exists_mem_repr (Nat.zero_le 1)] + constructor + · rintro ⟨σ, hσ, hq⟩ + exact ⟨⟨σ, hσ⟩, hq⟩ + · rintro ⟨σ, hσ⟩ + exact ⟨(σ : G), σ.property, hσ⟩ + +/-- First isomorphism theorem for level-change maps: +`(G/G_n)/(G_m/G_n) ≃ G/G_m`. -/ +def quotientQuotientKernelOfLeEquivQuotient {m n : ℕ} (hmn : m ≤ n) : + F.quotient n ⧸ F.quotientKernelOfLe hmn ≃* F.quotient m := + (QuotientGroup.quotientMulEquivOfEq + (F.quotientMapOfLe_ker_eq_quotientKernelOfLe hmn).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (F.quotientMapOfLe hmn) (F.quotientMapOfLe_surjective hmn)) + +/-- States the theorem `quotientQuotientKernelOfLeEquivQuotient_mk'`. -/ +theorem quotientQuotientKernelOfLeEquivQuotient_mk' + {m n : ℕ} (hmn : m ≤ n) (q : F.quotient n) : + F.quotientQuotientKernelOfLeEquivQuotient hmn + (QuotientGroup.mk' (F.quotientKernelOfLe hmn) q) = + F.quotientMapOfLe hmn q := by + exact QuotientGroup.kerLift_mk (F.quotientMapOfLe hmn) q + +/-- States the theorem `quotientQuotientKernelOfLeEquivQuotient_mk'_mk'`. -/ +theorem quotientQuotientKernelOfLeEquivQuotient_mk'_mk' + {m n : ℕ} (hmn : m ≤ n) (σ : G) : + F.quotientQuotientKernelOfLeEquivQuotient hmn + (QuotientGroup.mk' (F.quotientKernelOfLe hmn) + (F.quotientMk n σ)) = + F.quotientMk m σ := by + rw [F.quotientQuotientKernelOfLeEquivQuotient_mk', + F.quotientMapOfLe_apply_mk] + +/-- The kernel subgroup for the identity level-change map is trivial. -/ +theorem quotientKernelOfLe_refl_eq_bot (n : ℕ) : + F.quotientKernelOfLe (le_rfl : n ≤ n) = ⊥ := by + rw [← F.quotientMapOfLe_ker_eq_quotientKernelOfLe (le_rfl : n ≤ n), + F.quotientMapOfLe_refl n] + simp + +end AntitoneNormalSubgroupFiltration + +/-- A depth function whose threshold subgroups form a lower ramification filtration. -/ +structure LowerRamificationDepth (G : Type u) [Group G] where + /-- The lower ramification depth of each group element. -/ + depth : G → WithTop ℕ + /-- The identity has infinite ramification depth. -/ + depth_one : depth 1 = ⊤ + /-- Each depth threshold is closed under multiplication. -/ + depth_mul_mem : + ∀ {n : ℕ} {σ τ : G}, + (n : WithTop ℕ) ≤ depth σ → + (n : WithTop ℕ) ≤ depth τ → + (n : WithTop ℕ) ≤ depth (σ * τ) + /-- Each depth threshold is closed under inversion. -/ + depth_inv_mem : + ∀ {n : ℕ} {σ : G}, + (n : WithTop ℕ) ≤ depth σ → + (n : WithTop ℕ) ≤ depth σ⁻¹ + /-- Each depth threshold is preserved under conjugation. -/ + depth_conj_mem : + ∀ {n : ℕ} {γ σ : G}, + (n : WithTop ℕ) ≤ depth σ → + (n : WithTop ℕ) ≤ depth (γ * σ * γ⁻¹) + +namespace LowerRamificationDepth + +variable {G : Type u} [Group G] (D : LowerRamificationDepth G) + +/-- The threshold subgroup cut out by a ramification depth function. -/ +def lowerRamificationGroup (n : ℕ) : Subgroup G where + carrier := {σ | (n : WithTop ℕ) ≤ D.depth σ} + one_mem' := by + change (n : WithTop ℕ) ≤ D.depth 1 + rw [D.depth_one] + exact le_top + mul_mem' := by + intro σ τ hσ hτ + exact D.depth_mul_mem hσ hτ + inv_mem' := by + intro σ hσ + exact D.depth_inv_mem hσ + +/-- States the theorem `mem_lowerRamificationGroup_iff`. -/ +@[simp] theorem mem_lowerRamificationGroup_iff (n : ℕ) (σ : G) : + σ ∈ D.lowerRamificationGroup n ↔ (n : WithTop ℕ) ≤ D.depth σ := + Iff.rfl + +/-- States the theorem `lowerRamificationGroup_normal`. -/ +theorem lowerRamificationGroup_normal (n : ℕ) : + (D.lowerRamificationGroup n).Normal where + conj_mem := by + intro σ hσ γ + exact D.depth_conj_mem (γ := γ) hσ + +/-- Provides the instance `lowerRamificationGroup_normal_instance`. -/ +instance lowerRamificationGroup_normal_instance (n : ℕ) : + (D.lowerRamificationGroup n).Normal := + D.lowerRamificationGroup_normal n + +/-- States the theorem `lowerRamificationGroup_antitone`. -/ +theorem lowerRamificationGroup_antitone {m n : ℕ} (hmn : m ≤ n) : + D.lowerRamificationGroup n ≤ D.lowerRamificationGroup m := by + intro σ hσ + change (m : WithTop ℕ) ≤ D.depth σ + have hmn' : (m : WithTop ℕ) ≤ (n : WithTop ℕ) := by + exact_mod_cast hmn + exact le_trans hmn' hσ + +/-- States the theorem `mem_lowerRamificationGroup_of_le`. -/ +theorem mem_lowerRamificationGroup_of_le {m n : ℕ} (hmn : m ≤ n) {σ : G} + (hσ : σ ∈ D.lowerRamificationGroup n) : + σ ∈ D.lowerRamificationGroup m := + D.lowerRamificationGroup_antitone hmn hσ + +/-- Package a depth function as a lower ramification filtration. -/ +def toLowerRamificationFiltration : AntitoneNormalSubgroupFiltration G where + lower := D.lowerRamificationGroup + lower_normal := D.lowerRamificationGroup_normal + antitone := by + intro m n hmn + exact D.lowerRamificationGroup_antitone hmn + +/-- States the theorem `toLowerRamificationFiltration_apply`. -/ +@[simp] theorem toLowerRamificationFiltration_apply (n : ℕ) : + D.toLowerRamificationFiltration.lower n = D.lowerRamificationGroup n := + rfl + +/-- Herbrand step attached to a depth-defined lower filtration. -/ +noncomputable def herbrandStep (i : Nat) : Rat := + D.toLowerRamificationFiltration.herbrandStep i + +/-- Natural-index Herbrand function attached to a depth-defined lower +filtration. -/ +noncomputable def herbrandFunctionNat (n : Nat) : Rat := + D.toLowerRamificationFiltration.herbrandFunctionNat n + +/-- States the theorem `herbrandStep_pos`. -/ +theorem herbrandStep_pos (i : Nat) + [Finite (D.lowerRamificationGroup i)] + [Finite (D.lowerRamificationGroup 0)] : + 0 < D.herbrandStep i := by + let : Finite (D.toLowerRamificationFiltration.lower i) := by + simpa [toLowerRamificationFiltration_apply] using + (inferInstance : Finite (D.lowerRamificationGroup i)) + let : Finite (D.toLowerRamificationFiltration.lower 0) := by + simpa [toLowerRamificationFiltration_apply] using + (inferInstance : Finite (D.lowerRamificationGroup 0)) + simpa [herbrandStep, toLowerRamificationFiltration_apply] using + D.toLowerRamificationFiltration.herbrandStep_pos i + +/-- States the theorem `herbrandFunctionNat_mono`. -/ +theorem herbrandFunctionNat_mono : + Monotone D.herbrandFunctionNat := by + change Monotone D.toLowerRamificationFiltration.herbrandFunctionNat + exact D.toLowerRamificationFiltration.herbrandFunctionNat_mono + +end LowerRamificationDepth + +/-- A ramification filtration coming from an action quotient tested against +principal units. -/ +structure ValuationActionRamification (G : Type u) [Group G] + (K : Type v) [Group K] where + /-- The principal-unit filtration used to test action quotients. -/ + principalUnits : LocalFieldTheory.DiscreteValuationField.AntitoneSubgroupFiltration K + /-- The action of `G` on `K` by multiplicative automorphisms. -/ + action : G →* MulAut K + /-- The element of `K` on which action quotients are evaluated. -/ + probe : K + /-- Membership of action quotients at a fixed level is closed under multiplication. -/ + quotient_mul_mem : + ∀ {n : ℕ} {σ τ : G}, + ((action σ) probe / probe) ∈ principalUnits.subgroup n → + ((action τ) probe / probe) ∈ principalUnits.subgroup n → + ((action (σ * τ)) probe / probe) ∈ principalUnits.subgroup n + /-- Membership of action quotients at a fixed level is closed under inversion. -/ + quotient_inv_mem : + ∀ {n : ℕ} {σ : G}, + ((action σ) probe / probe) ∈ principalUnits.subgroup n → + ((action σ⁻¹) probe / probe) ∈ principalUnits.subgroup n + /-- Membership of action quotients at a fixed level is preserved under conjugation. -/ + quotient_conj_mem : + ∀ {n : ℕ} {γ σ : G}, + ((action σ) probe / probe) ∈ principalUnits.subgroup n → + ((action (γ * σ * γ⁻¹)) probe / probe) ∈ principalUnits.subgroup n + +namespace ValuationActionRamification + +variable {G : Type u} [Group G] {K : Type v} [Group K] +variable (A : ValuationActionRamification G K) + +/-- The action quotient used to test ramification depth. -/ +def actionQuotient (σ : G) : K := + (A.action σ) A.probe / A.probe + +/-- States the theorem `actionQuotient_one`. -/ +@[simp] theorem actionQuotient_one : + A.actionQuotient 1 = 1 := by + simp [actionQuotient] + +/-- Defines `actionDepthAtLeast`. -/ +def actionDepthAtLeast (n : ℕ) (σ : G) : Prop := + A.actionQuotient σ ∈ A.principalUnits.subgroup n + +/-- States the theorem `actionDepthAtLeast_iff`. -/ +@[simp] theorem actionDepthAtLeast_iff (n : ℕ) (σ : G) : + A.actionDepthAtLeast n σ ↔ + A.actionQuotient σ ∈ A.principalUnits.subgroup n := + Iff.rfl + +/-- States the theorem `actionDepthAtLeast_one`. -/ +theorem actionDepthAtLeast_one (n : ℕ) : + A.actionDepthAtLeast n 1 := by + rw [A.actionDepthAtLeast_iff, A.actionQuotient_one] + exact (A.principalUnits.subgroup n).one_mem + +/-- States the theorem `actionDepthAtLeast_mul`. -/ +theorem actionDepthAtLeast_mul {n : ℕ} {σ τ : G} + (hσ : A.actionDepthAtLeast n σ) (hτ : A.actionDepthAtLeast n τ) : + A.actionDepthAtLeast n (σ * τ) := + A.quotient_mul_mem hσ hτ + +/-- States the theorem `actionDepthAtLeast_inv`. -/ +theorem actionDepthAtLeast_inv {n : ℕ} {σ : G} + (hσ : A.actionDepthAtLeast n σ) : + A.actionDepthAtLeast n σ⁻¹ := + A.quotient_inv_mem hσ + +/-- States the theorem `actionDepthAtLeast_conj`. -/ +theorem actionDepthAtLeast_conj {n : ℕ} {γ σ : G} + (hσ : A.actionDepthAtLeast n σ) : + A.actionDepthAtLeast n (γ * σ * γ⁻¹) := + A.quotient_conj_mem hσ + +/-- The action-defined lower ramification group. -/ +def lowerRamificationGroup (n : ℕ) : Subgroup G where + carrier := {σ | A.actionDepthAtLeast n σ} + one_mem' := A.actionDepthAtLeast_one n + mul_mem' := by + intro σ τ hσ hτ + exact A.actionDepthAtLeast_mul hσ hτ + inv_mem' := by + intro σ hσ + exact A.actionDepthAtLeast_inv hσ + +/-- States the theorem `mem_lowerRamificationGroup_iff`. -/ +@[simp] theorem mem_lowerRamificationGroup_iff (n : ℕ) (σ : G) : + σ ∈ A.lowerRamificationGroup n ↔ A.actionDepthAtLeast n σ := + Iff.rfl + +/-- Membership in the action-defined lower ramification group, expanded as a +principal-unit condition on the action quotient. -/ +theorem mem_lowerRamificationGroup_iff_actionQuotient (n : ℕ) (σ : G) : + σ ∈ A.lowerRamificationGroup n ↔ + A.actionQuotient σ ∈ A.principalUnits.subgroup n := + (A.mem_lowerRamificationGroup_iff n σ).trans + (A.actionDepthAtLeast_iff n σ) + +/-- States the theorem `lowerRamificationGroup_normal`. -/ +theorem lowerRamificationGroup_normal (n : ℕ) : + (A.lowerRamificationGroup n).Normal where + conj_mem := by + intro σ hσ γ + exact A.actionDepthAtLeast_conj (γ := γ) hσ + +/-- Provides the instance `lowerRamificationGroup_normal_instance`. -/ +instance lowerRamificationGroup_normal_instance (n : ℕ) : + (A.lowerRamificationGroup n).Normal := + A.lowerRamificationGroup_normal n + +/-- States the theorem `lowerRamificationGroup_antitone`. -/ +theorem lowerRamificationGroup_antitone {m n : ℕ} (hmn : m ≤ n) : + A.lowerRamificationGroup n ≤ A.lowerRamificationGroup m := by + intro σ hσ + exact A.principalUnits.antitone hmn hσ + +/-- Package the action-defined groups as a lower ramification filtration. -/ +def toLowerRamificationFiltration : AntitoneNormalSubgroupFiltration G where + lower := A.lowerRamificationGroup + lower_normal := A.lowerRamificationGroup_normal + antitone := by + intro m n hmn + exact A.lowerRamificationGroup_antitone hmn + +/-- States the theorem `toLowerRamificationFiltration_apply`. -/ +@[simp] theorem toLowerRamificationFiltration_apply (n : ℕ) : + A.toLowerRamificationFiltration.lower n = A.lowerRamificationGroup n := + rfl + +/-- Herbrand step attached to an action-defined lower filtration. -/ +noncomputable def herbrandStep (i : Nat) : Rat := + A.toLowerRamificationFiltration.herbrandStep i + +/-- Natural-index Herbrand function attached to an action-defined lower +filtration. -/ +noncomputable def herbrandFunctionNat (n : Nat) : Rat := + A.toLowerRamificationFiltration.herbrandFunctionNat n + +/-- States the theorem `herbrandStep_pos`. -/ +theorem herbrandStep_pos (i : Nat) + [Finite (A.lowerRamificationGroup i)] + [Finite (A.lowerRamificationGroup 0)] : + 0 < A.herbrandStep i := by + let : Finite (A.toLowerRamificationFiltration.lower i) := by + simpa [toLowerRamificationFiltration_apply] using + (inferInstance : Finite (A.lowerRamificationGroup i)) + let : Finite (A.toLowerRamificationFiltration.lower 0) := by + simpa [toLowerRamificationFiltration_apply] using + (inferInstance : Finite (A.lowerRamificationGroup 0)) + simpa [herbrandStep, toLowerRamificationFiltration_apply] using + A.toLowerRamificationFiltration.herbrandStep_pos i + +/-- States the theorem `herbrandFunctionNat_mono`. -/ +theorem herbrandFunctionNat_mono : + Monotone A.herbrandFunctionNat := by + change Monotone A.toLowerRamificationFiltration.herbrandFunctionNat + exact A.toLowerRamificationFiltration.herbrandFunctionNat_mono + +/-- The inertia subgroup `G_0` for an action-defined filtration. -/ +abbrev inertiaSubgroup : Subgroup G := + A.lowerRamificationGroup 0 + +/-- States the theorem `lowerRamificationGroup_zero_eq_inertiaSubgroup`. -/ +theorem lowerRamificationGroup_zero_eq_inertiaSubgroup : + A.lowerRamificationGroup 0 = A.inertiaSubgroup := + rfl + +/-- The wild inertia subgroup `G_1` for an action-defined filtration. -/ +abbrev wildInertiaSubgroup : Subgroup G := + A.lowerRamificationGroup 1 + +/-- The tame quotient `G_0/G_1` for an action-defined filtration. -/ +def tameQuotient : Type u := + A.toLowerRamificationFiltration.tameQuotient + +/-- Provides the instance `tameQuotientGroup`. -/ +instance tameQuotientGroup : Group A.tameQuotient := by + change Group A.toLowerRamificationFiltration.tameQuotient + infer_instance + +/-- The action-defined tame quotient is canonically identified with the +underlying lower-filtration model. -/ +def tameQuotientEquivLowerFiltration : + A.tameQuotient ≃* + A.toLowerRamificationFiltration.tameQuotient := + MulEquiv.refl _ + +/-- Provides the instance `tameQuotientFinite`. -/ +instance tameQuotientFinite [Finite G] : Finite A.tameQuotient := + Finite.of_equiv A.toLowerRamificationFiltration.tameQuotient + A.tameQuotientEquivLowerFiltration.symm.toEquiv + +/-- Canonical projection to the action-defined tame quotient. -/ +def tameQuotientMk : A.inertiaSubgroup →* A.tameQuotient := + A.tameQuotientEquivLowerFiltration.symm.toMonoidHom.comp + A.toLowerRamificationFiltration.tameQuotientMk + +/-- States the theorem `tameQuotientEquivLowerFiltration_apply_mk`. -/ +@[simp] +theorem tameQuotientEquivLowerFiltration_apply_mk + (σ : A.inertiaSubgroup) : + A.tameQuotientEquivLowerFiltration (A.tameQuotientMk σ) = + A.toLowerRamificationFiltration.tameQuotientMk σ := + rfl + +/-- States the theorem `tameQuotientMk_surjective`. -/ +theorem tameQuotientMk_surjective : + Function.Surjective A.tameQuotientMk := by + intro q + let q' := A.tameQuotientEquivLowerFiltration q + obtain ⟨σ, hσ⟩ := + A.toLowerRamificationFiltration.tameQuotient_inductionOn + (motive := fun q' => ∃ σ, + A.toLowerRamificationFiltration.tameQuotientMk σ = q') + q' (fun σ => ⟨σ, rfl⟩) + refine ⟨σ, A.tameQuotientEquivLowerFiltration.injective ?_⟩ + exact (A.tameQuotientEquivLowerFiltration_apply_mk + (show A.inertiaSubgroup from σ)).trans hσ + +/-- States the theorem `tameQuotientMk_eq_one_iff`. -/ +@[simp] +theorem tameQuotientMk_eq_one_iff (σ : A.inertiaSubgroup) : + A.tameQuotientMk σ = 1 ↔ (σ : G) ∈ A.wildInertiaSubgroup := by + constructor + · intro h + have h' := congrArg A.tameQuotientEquivLowerFiltration h + rw [A.tameQuotientEquivLowerFiltration_apply_mk, map_one] at h' + simpa only [toLowerRamificationFiltration_apply] using + (A.toLowerRamificationFiltration.tameQuotientMk_eq_one_iff σ).1 h' + · intro h + apply A.tameQuotientEquivLowerFiltration.injective + rw [A.tameQuotientEquivLowerFiltration_apply_mk, map_one] + apply + (A.toLowerRamificationFiltration.tameQuotientMk_eq_one_iff σ).2 + simpa only [toLowerRamificationFiltration_apply] using h + +/-- States the theorem `tameQuotientMk_eq_iff`. -/ +@[simp] +theorem tameQuotientMk_eq_iff (σ τ : A.inertiaSubgroup) : + A.tameQuotientMk σ = A.tameQuotientMk τ ↔ + ((σ / τ : A.inertiaSubgroup) : G) ∈ A.wildInertiaSubgroup := by + constructor + · intro h + have h' := congrArg A.tameQuotientEquivLowerFiltration h + rw [A.tameQuotientEquivLowerFiltration_apply_mk, + A.tameQuotientEquivLowerFiltration_apply_mk] at h' + change ((σ / τ : A.inertiaSubgroup) : G) ∈ + A.lowerRamificationGroup 1 + exact + (A.toLowerRamificationFiltration.tameQuotientMk_eq_iff σ τ).1 h' + · intro h + apply A.tameQuotientEquivLowerFiltration.injective + rw [A.tameQuotientEquivLowerFiltration_apply_mk, + A.tameQuotientEquivLowerFiltration_apply_mk] + apply + (A.toLowerRamificationFiltration.tameQuotientMk_eq_iff σ τ).2 + change ((σ / τ : A.inertiaSubgroup) : G) ∈ + A.lowerRamificationGroup 1 at h + exact h + +/-- Eliminate the action-defined tame quotient through inertia +representatives. -/ +protected theorem tameQuotient_inductionOn + {motive : A.tameQuotient → Prop} (q : A.tameQuotient) + (h : ∀ σ : A.inertiaSubgroup, motive (A.tameQuotientMk σ)) : + motive q := by + obtain ⟨σ, rfl⟩ := A.tameQuotientMk_surjective q + exact h σ + +/-- The tame character attached to the chosen action probe. + +For valued-extension applications the probe is the chosen uniformizer and the +action quotient is `σ ϖ / ϖ`; at this abstraction level the target is the +tame quotient `G_0/G_1`. Residue-field unit realizations can be composed on +top once the concrete unit quotient has been constructed. -/ +def tameCharacterOfUniformizer : A.inertiaSubgroup →* A.tameQuotient := + A.tameQuotientMk + +/-- States the theorem `tameCharacterOfUniformizer_apply`. -/ +@[simp] theorem tameCharacterOfUniformizer_apply (σ : A.inertiaSubgroup) : + A.tameCharacterOfUniformizer σ = + A.tameQuotientMk σ := + rfl + +/-- The kernel of the action-probe tame character is wild inertia. -/ +theorem tameCharacter_ker_eq_wildInertia : + MonoidHom.ker A.tameCharacterOfUniformizer = + (A.wildInertiaSubgroup).subgroupOf A.inertiaSubgroup := by + ext σ + rw [MonoidHom.mem_ker, Subgroup.mem_subgroupOf, + A.tameCharacterOfUniformizer_apply, A.tameQuotientMk_eq_one_iff] + +/-- States the theorem `mem_inertiaSubgroup_iff_actionDepthAtLeast`. -/ +theorem mem_inertiaSubgroup_iff_actionDepthAtLeast (σ : G) : + σ ∈ A.inertiaSubgroup ↔ A.actionDepthAtLeast 0 σ := + A.mem_lowerRamificationGroup_iff 0 σ + +/-- States the theorem `mem_wildInertiaSubgroup_iff_actionDepthAtLeast`. -/ +theorem mem_wildInertiaSubgroup_iff_actionDepthAtLeast (σ : G) : + σ ∈ A.wildInertiaSubgroup ↔ A.actionDepthAtLeast 1 σ := + A.mem_lowerRamificationGroup_iff 1 σ + +/-- Membership in inertia, expanded as a principal-unit condition on the action +quotient. -/ +theorem mem_inertiaSubgroup_iff_actionQuotient (σ : G) : + σ ∈ A.inertiaSubgroup ↔ + A.actionQuotient σ ∈ A.principalUnits.subgroup 0 := + A.mem_lowerRamificationGroup_iff_actionQuotient 0 σ + +/-- Membership in wild inertia, expanded as a principal-unit condition on the +action quotient. -/ +theorem mem_wildInertiaSubgroup_iff_actionQuotient (σ : G) : + σ ∈ A.wildInertiaSubgroup ↔ + A.actionQuotient σ ∈ A.principalUnits.subgroup 1 := + A.mem_lowerRamificationGroup_iff_actionQuotient 1 σ + +/-- States the theorem `wildInertiaSubgroup_le_inertiaSubgroup`. -/ +theorem wildInertiaSubgroup_le_inertiaSubgroup : + A.wildInertiaSubgroup ≤ A.inertiaSubgroup := + A.lowerRamificationGroup_antitone (Nat.zero_le 1) + +/-- Defines `tameQuotientEquivQuotientKernel`. -/ +def tameQuotientEquivQuotientKernel : + A.tameQuotient ≃* + A.toLowerRamificationFiltration.quotientKernelOfLe (Nat.zero_le 1) := + A.tameQuotientEquivLowerFiltration.trans + A.toLowerRamificationFiltration.tameQuotientEquivQuotientKernel + +/-- States the theorem `coe_tameQuotientEquivQuotientKernel_mk`. -/ +@[simp] theorem coe_tameQuotientEquivQuotientKernel_mk + (σ : A.inertiaSubgroup) : + ((A.tameQuotientEquivQuotientKernel + (A.tameQuotientMk σ) : + A.toLowerRamificationFiltration.quotientKernelOfLe (Nat.zero_le 1)) : + A.toLowerRamificationFiltration.quotient 1) = + A.toLowerRamificationFiltration.quotientMk 1 (σ : G) := by + exact + A.toLowerRamificationFiltration.coe_tameQuotientEquivQuotientKernel_mk σ + +/-- At every finite level `n ≥ 1`, the action-defined tame quotient is the +quotient of finite-level inertia by finite-level wild inertia: +`(G_0/G_n)/(G_1/G_n) ≃ G_0/G_1`. -/ +def quotientInertiaByWildKernelEquivTameQuotient {n : ℕ} (hn : 1 ≤ n) : + A.toLowerRamificationFiltration.quotientKernelOfLe + (le_trans (Nat.zero_le 1) hn) ⧸ + (A.toLowerRamificationFiltration.quotientKernelOfLe hn).subgroupOf + (A.toLowerRamificationFiltration.quotientKernelOfLe + (le_trans (Nat.zero_le 1) hn)) ≃* + A.tameQuotient := + (AntitoneNormalSubgroupFiltration.quotientInertiaByWildKernelEquivTameQuotient + A.toLowerRamificationFiltration hn).trans + A.tameQuotientEquivLowerFiltration.symm + +/-- States the theorem `tameQuotientEquivQuotientKernel_quotientInertiaByWildKernel_mk'`. -/ +theorem tameQuotientEquivQuotientKernel_quotientInertiaByWildKernel_mk' + {n : ℕ} (hn : 1 ≤ n) + (q : + A.toLowerRamificationFiltration.quotientKernelOfLe + (le_trans (Nat.zero_le 1) hn)) : + A.tameQuotientEquivQuotientKernel + (A.quotientInertiaByWildKernelEquivTameQuotient hn + (QuotientGroup.mk' + ((A.toLowerRamificationFiltration.quotientKernelOfLe hn).subgroupOf + (A.toLowerRamificationFiltration.quotientKernelOfLe + (le_trans (Nat.zero_le 1) hn))) q)) = + A.toLowerRamificationFiltration.quotientKernelMapOfLe + (Nat.zero_le 1) hn q := + AntitoneNormalSubgroupFiltration.tameQuotientEquivQuotientKernel_quotientInertiaByWildKernel_mk' + A.toLowerRamificationFiltration hn q + +/-- Cardinality form of the action-defined finite-level tame quotient +compatibility `(G_0/G_n)/(G_1/G_n) ≃ G_0/G_1`. -/ +theorem card_quotientInertiaByWildKernel_eq_tameQuotient {n : ℕ} + (hn : 1 ≤ n) [Finite G] : + Nat.card + (A.toLowerRamificationFiltration.quotientKernelOfLe + (le_trans (Nat.zero_le 1) hn) ⧸ + (A.toLowerRamificationFiltration.quotientKernelOfLe hn).subgroupOf + (A.toLowerRamificationFiltration.quotientKernelOfLe + (le_trans (Nat.zero_le 1) hn))) = + Nat.card A.tameQuotient := by + calc + _ = Nat.card + A.toLowerRamificationFiltration.tameQuotient := + AntitoneNormalSubgroupFiltration.card_quotientInertiaByWildKernel_eq_tameQuotient + A.toLowerRamificationFiltration hn + _ = Nat.card A.tameQuotient := + Nat.card_congr A.tameQuotientEquivLowerFiltration.symm.toEquiv + +/-- Kernel membership for the action-defined map `G/G_1 → G/G_0`, with a +representative already in inertia. -/ +theorem mem_tameQuotientKernel_iff_exists_inertia_repr + (q : A.toLowerRamificationFiltration.quotient 1) : + q ∈ A.toLowerRamificationFiltration.quotientKernelOfLe (Nat.zero_le 1) ↔ + ∃ σ : A.inertiaSubgroup, + A.toLowerRamificationFiltration.quotientMk 1 (σ : G) = q := by + simpa only [toLowerRamificationFiltration_apply] using + A.toLowerRamificationFiltration.mem_tameQuotientKernel_iff_exists_inertia_repr q + +/-- Kernel membership for the action-defined map `G/G_1 → G/G_0`, expanded by +an action-quotient representative in `U^0`. -/ +theorem mem_tameQuotientKernel_iff_exists_actionQuotient_mem_repr + (q : A.toLowerRamificationFiltration.quotient 1) : + q ∈ A.toLowerRamificationFiltration.quotientKernelOfLe (Nat.zero_le 1) ↔ + ∃ σ : G, A.actionQuotient σ ∈ A.principalUnits.subgroup 0 ∧ + A.toLowerRamificationFiltration.quotientMk 1 σ = q := by + rw [A.mem_tameQuotientKernel_iff_exists_inertia_repr] + constructor + · rintro ⟨σ, hσ⟩ + exact ⟨(σ : G), (A.mem_inertiaSubgroup_iff_actionQuotient (σ : G)).1 + σ.property, hσ⟩ + · rintro ⟨σ, hσ, hq⟩ + exact ⟨⟨σ, (A.mem_inertiaSubgroup_iff_actionQuotient σ).2 hσ⟩, hq⟩ + +/-- Provides the instance `lowerRamificationGroup_subgroupOf_normal_instance`. -/ +instance lowerRamificationGroup_subgroupOf_normal_instance (n : ℕ) : + ((A.lowerRamificationGroup (n + 1)).subgroupOf + (A.lowerRamificationGroup n)).Normal := by + change ((A.toLowerRamificationFiltration.lower (n + 1)).subgroupOf + (A.toLowerRamificationFiltration.lower n)).Normal + infer_instance + +/-- Representative criterion for the identity class in the action-defined tame +quotient `G_0/G_1`. -/ +theorem tameQuotientMk_eq_one_iff_actionDepthAtLeast + (σ : A.inertiaSubgroup) : + A.tameQuotientMk σ = 1 ↔ + A.actionDepthAtLeast 1 (σ : G) := by + exact (A.tameQuotientMk_eq_one_iff σ).trans + (A.mem_wildInertiaSubgroup_iff_actionDepthAtLeast (σ : G)) + +/-- Representative criterion for the identity class in the action-defined tame +quotient `G_0/G_1`, expanded as membership of the action quotient in `U^1`. -/ +theorem tameQuotientMk_eq_one_iff_actionQuotient_mem + (σ : A.inertiaSubgroup) : + A.tameQuotientMk σ = 1 ↔ + A.actionQuotient (σ : G) ∈ A.principalUnits.subgroup 1 := + (A.tameQuotientMk_eq_one_iff_actionDepthAtLeast σ).trans + (A.actionDepthAtLeast_iff 1 (σ : G)) + +/-- Representative equality criterion in the action-defined tame quotient +`G_0/G_1`, in right-quotient form. -/ +theorem tameQuotientMk_eq_iff_actionDepthAtLeast_div + (σ τ : A.inertiaSubgroup) : + A.tameQuotientMk σ = A.tameQuotientMk τ ↔ + A.actionDepthAtLeast 1 ((σ / τ : A.inertiaSubgroup) : G) := by + exact (A.tameQuotientMk_eq_iff σ τ).trans + (A.mem_wildInertiaSubgroup_iff_actionDepthAtLeast + ((σ / τ : A.inertiaSubgroup) : G)) + +/-- Representative equality criterion in the action-defined tame quotient +`G_0/G_1`, in right-quotient form, expanded as membership of the action quotient +in `U^1`. -/ +theorem tameQuotientMk_eq_iff_actionQuotient_div_mem + (σ τ : A.inertiaSubgroup) : + A.tameQuotientMk σ = A.tameQuotientMk τ ↔ + A.actionQuotient (((σ / τ : A.inertiaSubgroup) : G)) ∈ + A.principalUnits.subgroup 1 := + (A.tameQuotientMk_eq_iff_actionDepthAtLeast_div σ τ).trans + (A.actionDepthAtLeast_iff 1 (((σ / τ : A.inertiaSubgroup) : G))) + +/-- Representative equality criterion in the action-defined tame quotient +`G_0/G_1`, in left-quotient form. -/ +theorem tameQuotientMk_eq_iff_actionDepthAtLeast_inv_mul + (σ τ : A.inertiaSubgroup) : + A.tameQuotientMk σ = A.tameQuotientMk τ ↔ + A.actionDepthAtLeast 1 ((τ⁻¹ * σ : A.inertiaSubgroup) : G) := by + have hcomm : + (((σ / τ : A.inertiaSubgroup) : G) ∈ A.wildInertiaSubgroup ↔ + ((τ⁻¹ * σ : A.inertiaSubgroup) : G) ∈ A.wildInertiaSubgroup) := by + simpa [div_eq_mul_inv, Subgroup.mem_subgroupOf] using + ((inferInstance : + ((A.wildInertiaSubgroup).subgroupOf A.inertiaSubgroup).Normal).mem_comm_iff + (a := σ) (b := τ⁻¹)) + exact (A.tameQuotientMk_eq_iff σ τ).trans + (hcomm.trans (A.mem_wildInertiaSubgroup_iff_actionDepthAtLeast + ((τ⁻¹ * σ : A.inertiaSubgroup) : G))) + +/-- Representative equality criterion in the action-defined tame quotient +`G_0/G_1`, in left-quotient form, expanded as membership of the action quotient +in `U^1`. -/ +theorem tameQuotientMk_eq_iff_actionQuotient_inv_mul_mem + (σ τ : A.inertiaSubgroup) : + A.tameQuotientMk σ = A.tameQuotientMk τ ↔ + A.actionQuotient (((τ⁻¹ * σ : A.inertiaSubgroup) : G)) ∈ + A.principalUnits.subgroup 1 := + (A.tameQuotientMk_eq_iff_actionDepthAtLeast_inv_mul σ τ).trans + (A.actionDepthAtLeast_iff 1 (((τ⁻¹ * σ : A.inertiaSubgroup) : G))) + +/-- Representative kernel criterion for the action-defined quotient map +`G/G_n → G/G_m`, expressed by the action-depth predicate. -/ +theorem quotientMapOfLe_mk_eq_one_iff_actionDepthAtLeast {m n : ℕ} + (hmn : m ≤ n) (σ : G) : + A.toLowerRamificationFiltration.quotientMapOfLe hmn + (A.toLowerRamificationFiltration.quotientMk n σ) = 1 ↔ + A.actionDepthAtLeast m σ := by + exact + (A.toLowerRamificationFiltration.quotientMapOfLe_mk_eq_one_iff hmn σ).trans + (A.mem_lowerRamificationGroup_iff m σ) + +/-- Representative kernel criterion for the action-defined quotient map +`G/G_n → G/G_m`, expanded as membership of the action quotient in `U^m`. -/ +theorem quotientMapOfLe_mk_eq_one_iff_actionQuotient_mem {m n : ℕ} + (hmn : m ≤ n) (σ : G) : + A.toLowerRamificationFiltration.quotientMapOfLe hmn + (A.toLowerRamificationFiltration.quotientMk n σ) = 1 ↔ + A.actionQuotient σ ∈ A.principalUnits.subgroup m := + (A.quotientMapOfLe_mk_eq_one_iff_actionDepthAtLeast hmn σ).trans + (A.actionDepthAtLeast_iff m σ) + +/-- Representative kernel-membership criterion for the action-defined quotient +map `G/G_n → G/G_m`, expanded as membership of the action quotient in `U^m`. -/ +theorem quotientMapOfLe_mk_mem_ker_iff_actionQuotient_mem {m n : ℕ} + (hmn : m ≤ n) (σ : G) : + A.toLowerRamificationFiltration.quotientMk n σ ∈ + (A.toLowerRamificationFiltration.quotientMapOfLe hmn).ker ↔ + A.actionQuotient σ ∈ A.principalUnits.subgroup m := by + exact + (A.toLowerRamificationFiltration.quotientMapOfLe_mk_mem_ker_iff hmn σ).trans + (A.mem_lowerRamificationGroup_iff_actionQuotient m σ) + +/-- Representative equality criterion for the action-defined quotient map +`G/G_n → G/G_m`, in right-quotient form. -/ +theorem quotientMapOfLe_mk_eq_iff_actionDepthAtLeast_div {m n : ℕ} + (hmn : m ≤ n) (σ τ : G) : + A.toLowerRamificationFiltration.quotientMapOfLe hmn + (A.toLowerRamificationFiltration.quotientMk n σ) = + A.toLowerRamificationFiltration.quotientMapOfLe hmn + (A.toLowerRamificationFiltration.quotientMk n τ) ↔ + A.actionDepthAtLeast m (σ / τ) := by + exact + (A.toLowerRamificationFiltration.quotientMapOfLe_mk_eq_iff_div_mem + hmn σ τ).trans (A.mem_lowerRamificationGroup_iff m (σ / τ)) + +/-- Representative equality criterion for the action-defined quotient map +`G/G_n → G/G_m`, in right-quotient form, expanded as membership of the action +quotient in `U^m`. -/ +theorem quotientMapOfLe_mk_eq_iff_actionQuotient_div_mem {m n : ℕ} + (hmn : m ≤ n) (σ τ : G) : + A.toLowerRamificationFiltration.quotientMapOfLe hmn + (A.toLowerRamificationFiltration.quotientMk n σ) = + A.toLowerRamificationFiltration.quotientMapOfLe hmn + (A.toLowerRamificationFiltration.quotientMk n τ) ↔ + A.actionQuotient (σ / τ) ∈ A.principalUnits.subgroup m := + (A.quotientMapOfLe_mk_eq_iff_actionDepthAtLeast_div hmn σ τ).trans + (A.actionDepthAtLeast_iff m (σ / τ)) + +/-- Representative equality criterion for the action-defined quotient map +`G/G_n → G/G_m`, in left-quotient form. -/ +theorem quotientMapOfLe_mk_eq_iff_actionDepthAtLeast_inv_mul {m n : ℕ} + (hmn : m ≤ n) (σ τ : G) : + A.toLowerRamificationFiltration.quotientMapOfLe hmn + (A.toLowerRamificationFiltration.quotientMk n σ) = + A.toLowerRamificationFiltration.quotientMapOfLe hmn + (A.toLowerRamificationFiltration.quotientMk n τ) ↔ + A.actionDepthAtLeast m (τ⁻¹ * σ) := by + simpa [toLowerRamificationFiltration_apply, + mem_lowerRamificationGroup_iff] using + A.toLowerRamificationFiltration.quotientMapOfLe_mk_eq_iff_inv_mul_mem + hmn σ τ + +/-- Representative equality criterion for the action-defined quotient map +`G/G_n → G/G_m`, in left-quotient form, expanded as membership of the action +quotient in `U^m`. -/ +theorem quotientMapOfLe_mk_eq_iff_actionQuotient_inv_mul_mem {m n : ℕ} + (hmn : m ≤ n) (σ τ : G) : + A.toLowerRamificationFiltration.quotientMapOfLe hmn + (A.toLowerRamificationFiltration.quotientMk n σ) = + A.toLowerRamificationFiltration.quotientMapOfLe hmn + (A.toLowerRamificationFiltration.quotientMk n τ) ↔ + A.actionQuotient (τ⁻¹ * σ) ∈ A.principalUnits.subgroup m := + (A.quotientMapOfLe_mk_eq_iff_actionDepthAtLeast_inv_mul hmn σ τ).trans + (A.actionDepthAtLeast_iff m (τ⁻¹ * σ)) + +/-- Arbitrary-class kernel criterion for the action-defined quotient map +`G/G_n → G/G_m`, expressed by an action quotient representative in `U^m`. -/ +theorem quotientMapOfLe_eq_one_iff_exists_actionQuotient_mem_repr + {m n : ℕ} (hmn : m ≤ n) + (q : A.toLowerRamificationFiltration.quotient n) : + A.toLowerRamificationFiltration.quotientMapOfLe hmn q = 1 ↔ + ∃ σ : G, A.actionQuotient σ ∈ A.principalUnits.subgroup m ∧ + A.toLowerRamificationFiltration.quotientMk n σ = q := by + simpa [toLowerRamificationFiltration_apply, + mem_lowerRamificationGroup_iff_actionQuotient] using + A.toLowerRamificationFiltration.quotientMapOfLe_eq_one_iff_exists_mem_repr + hmn q + +/-- Kernel-membership criterion for an arbitrary class in the action-defined +quotient map `G/G_n → G/G_m`, expressed by an action quotient representative +in `U^m`. -/ +theorem quotientMapOfLe_mem_ker_iff_exists_actionQuotient_mem_repr + {m n : ℕ} (hmn : m ≤ n) + (q : A.toLowerRamificationFiltration.quotient n) : + q ∈ (A.toLowerRamificationFiltration.quotientMapOfLe hmn).ker ↔ + ∃ σ : G, A.actionQuotient σ ∈ A.principalUnits.subgroup m ∧ + A.toLowerRamificationFiltration.quotientMk n σ = q := by + simpa [toLowerRamificationFiltration_apply, + mem_lowerRamificationGroup_iff_actionQuotient] using + A.toLowerRamificationFiltration.quotientMapOfLe_mem_ker_iff_exists_mem_repr + hmn q + +/-- Membership in the named kernel subgroup of the action-defined quotient map +`G/G_n → G/G_m`, expressed by an action quotient representative in `U^m`. -/ +theorem mem_quotientKernelOfLe_iff_exists_actionQuotient_mem_repr + {m n : ℕ} (hmn : m ≤ n) + (q : A.toLowerRamificationFiltration.quotient n) : + q ∈ A.toLowerRamificationFiltration.quotientKernelOfLe hmn ↔ + ∃ σ : G, A.actionQuotient σ ∈ A.principalUnits.subgroup m ∧ + A.toLowerRamificationFiltration.quotientMk n σ = q := by + simpa [toLowerRamificationFiltration_apply, + mem_lowerRamificationGroup_iff_actionQuotient] using + A.toLowerRamificationFiltration.mem_quotientKernelOfLe_iff_exists_mem_repr + hmn q + +/-- First isomorphism theorem inside action-defined ramification kernels: +`(G_l/G_n)/ker(G_l/G_n → G_l/G_m) ≃ G_l/G_m`, for `l ≤ m ≤ n`. +The kernel is identified with `G_m/G_n` by +`AntitoneNormalSubgroupFiltration.quotientKernelMapOfLe_ker_eq`. -/ +def quotientKernelQuotientKerEquivQuotientKernelOfLe {l m n : ℕ} + (hlm : l ≤ m) (hmn : m ≤ n) : + A.toLowerRamificationFiltration.quotientKernelOfLe + (le_trans hlm hmn) ⧸ + (A.toLowerRamificationFiltration.quotientKernelMapOfLe hlm hmn).ker ≃* + A.toLowerRamificationFiltration.quotientKernelOfLe hlm := + AntitoneNormalSubgroupFiltration.quotientKernelQuotientKerEquivQuotientKernelOfLe + A.toLowerRamificationFiltration hlm hmn + +/-- States the theorem `quotientKernelQuotientKerEquivQuotientKernelOfLe_mk'`. -/ +theorem quotientKernelQuotientKerEquivQuotientKernelOfLe_mk' + {l m n : ℕ} (hlm : l ≤ m) (hmn : m ≤ n) + (q : + A.toLowerRamificationFiltration.quotientKernelOfLe + (le_trans hlm hmn)) : + A.quotientKernelQuotientKerEquivQuotientKernelOfLe hlm hmn + (QuotientGroup.mk' + (A.toLowerRamificationFiltration.quotientKernelMapOfLe hlm hmn).ker q) = + A.toLowerRamificationFiltration.quotientKernelMapOfLe hlm hmn q := + AntitoneNormalSubgroupFiltration.quotientKernelQuotientKerEquivQuotientKernelOfLe_mk' + A.toLowerRamificationFiltration hlm hmn q + +/-- Second-isomorphism-style form for action-defined ramification kernels: +`(G_l/G_n)/(G_m/G_n) ≃ G_l/G_m`, for `l ≤ m ≤ n`. -/ +def quotientKernelQuotientSubgroupOfEquivQuotientKernelOfLe {l m n : ℕ} + (hlm : l ≤ m) (hmn : m ≤ n) : + A.toLowerRamificationFiltration.quotientKernelOfLe + (le_trans hlm hmn) ⧸ + (A.toLowerRamificationFiltration.quotientKernelOfLe hmn).subgroupOf + (A.toLowerRamificationFiltration.quotientKernelOfLe + (le_trans hlm hmn)) ≃* + A.toLowerRamificationFiltration.quotientKernelOfLe hlm := + AntitoneNormalSubgroupFiltration.quotientKernelQuotientSubgroupOfEquivQuotientKernelOfLe + A.toLowerRamificationFiltration hlm hmn + +/-- States the theorem `quotientKernelQuotientSubgroupOfEquivQuotientKernelOfLe_mk'`. -/ +theorem quotientKernelQuotientSubgroupOfEquivQuotientKernelOfLe_mk' + {l m n : ℕ} (hlm : l ≤ m) (hmn : m ≤ n) + (q : + A.toLowerRamificationFiltration.quotientKernelOfLe + (le_trans hlm hmn)) : + A.quotientKernelQuotientSubgroupOfEquivQuotientKernelOfLe hlm hmn + (QuotientGroup.mk' + ((A.toLowerRamificationFiltration.quotientKernelOfLe hmn).subgroupOf + (A.toLowerRamificationFiltration.quotientKernelOfLe + (le_trans hlm hmn))) q) = + A.toLowerRamificationFiltration.quotientKernelMapOfLe hlm hmn q := + AntitoneNormalSubgroupFiltration.quotientKernelQuotientSubgroupOfEquivQuotientKernelOfLe_mk' + A.toLowerRamificationFiltration hlm hmn q + +/-- Cardinality form of the action-defined second-isomorphism quotient +compatibility `(G_l/G_n)/(G_m/G_n) ≃ G_l/G_m`. -/ +theorem card_quotientKernelQuotientSubgroupOfLe {l m n : ℕ} + (hlm : l ≤ m) (hmn : m ≤ n) [Finite G] : + Nat.card + (A.toLowerRamificationFiltration.quotientKernelOfLe + (le_trans hlm hmn) ⧸ + (A.toLowerRamificationFiltration.quotientKernelOfLe hmn).subgroupOf + (A.toLowerRamificationFiltration.quotientKernelOfLe + (le_trans hlm hmn))) = + Nat.card (A.toLowerRamificationFiltration.quotientKernelOfLe hlm) := + AntitoneNormalSubgroupFiltration.card_quotientKernelQuotientSubgroupOfLe + A.toLowerRamificationFiltration hlm hmn + +/-- First isomorphism theorem for action-defined level-change maps: +`(G/G_n)/(G_m/G_n) ≃ G/G_m`. -/ +def quotientQuotientKernelOfLeEquivQuotient + {m n : ℕ} (hmn : m ≤ n) : + A.toLowerRamificationFiltration.quotient n ⧸ + A.toLowerRamificationFiltration.quotientKernelOfLe hmn ≃* + A.toLowerRamificationFiltration.quotient m := + A.toLowerRamificationFiltration.quotientQuotientKernelOfLeEquivQuotient hmn + +/-- States the theorem `quotientQuotientKernelOfLeEquivQuotient_mk'`. -/ +theorem quotientQuotientKernelOfLeEquivQuotient_mk' + {m n : ℕ} (hmn : m ≤ n) + (q : A.toLowerRamificationFiltration.quotient n) : + A.quotientQuotientKernelOfLeEquivQuotient hmn + (QuotientGroup.mk' + (A.toLowerRamificationFiltration.quotientKernelOfLe hmn) q) = + A.toLowerRamificationFiltration.quotientMapOfLe hmn q := + A.toLowerRamificationFiltration.quotientQuotientKernelOfLeEquivQuotient_mk' + hmn q + +/-- States the theorem `quotientQuotientKernelOfLeEquivQuotient_mk'_mk'`. -/ +theorem quotientQuotientKernelOfLeEquivQuotient_mk'_mk' + {m n : ℕ} (hmn : m ≤ n) (σ : G) : + A.quotientQuotientKernelOfLeEquivQuotient hmn + (QuotientGroup.mk' + (A.toLowerRamificationFiltration.quotientKernelOfLe hmn) + (A.toLowerRamificationFiltration.quotientMk n σ)) = + A.toLowerRamificationFiltration.quotientMk m σ := + A.toLowerRamificationFiltration.quotientQuotientKernelOfLeEquivQuotient_mk'_mk' + hmn σ + +/-- The action-defined kernel subgroup for the identity level-change map is +trivial. -/ +theorem quotientKernelOfLe_refl_eq_bot (n : ℕ) : + A.toLowerRamificationFiltration.quotientKernelOfLe + (le_rfl : n ≤ n) = ⊥ := + A.toLowerRamificationFiltration.quotientKernelOfLe_refl_eq_bot n + +/-- Representative criterion for the image of an action-defined quotient class +to lie in a coarser kernel subgroup, expanded as membership of the action +quotient in `U^l`. -/ +theorem quotientMapOfLe_mk_mem_quotientKernelOfLe_iff_actionQuotient_mem + {l m n : ℕ} (hlm : l ≤ m) (hmn : m ≤ n) (σ : G) : + A.toLowerRamificationFiltration.quotientMapOfLe hmn + (A.toLowerRamificationFiltration.quotientMk n σ) ∈ + A.toLowerRamificationFiltration.quotientKernelOfLe hlm ↔ + A.actionQuotient σ ∈ A.principalUnits.subgroup l := by + simpa [toLowerRamificationFiltration_apply, + mem_lowerRamificationGroup_iff_actionQuotient] using + A.toLowerRamificationFiltration.quotientMapOfLe_mk_mem_quotientKernelOfLe_iff + hlm hmn σ + +/-- Arbitrary-class criterion for the image of an action-defined quotient class +to lie in a coarser kernel subgroup, expressed by an action quotient +representative in `U^l`. -/ +theorem quotientMapOfLe_mem_quotientKernelOfLe_iff_exists_actionQuotient_mem_repr + {l m n : ℕ} (hlm : l ≤ m) (hmn : m ≤ n) + (q : A.toLowerRamificationFiltration.quotient n) : + A.toLowerRamificationFiltration.quotientMapOfLe hmn q ∈ + A.toLowerRamificationFiltration.quotientKernelOfLe hlm ↔ + ∃ σ : G, A.actionQuotient σ ∈ A.principalUnits.subgroup l ∧ + A.toLowerRamificationFiltration.quotientMk n σ = q := by + rw [A.toLowerRamificationFiltration.quotientMapOfLe_mem_quotientKernelOfLe_iff + hlm hmn q] + exact + A.mem_quotientKernelOfLe_iff_exists_actionQuotient_mem_repr + (le_trans hlm hmn) q + +/-- Arbitrary-class equality criterion for the action-defined quotient map +`G/G_n → G/G_m`, expressed by an action quotient representative of `q / r` in +`U^m`. -/ +theorem quotientMapOfLe_eq_iff_exists_actionQuotient_mem_div_repr + {m n : ℕ} (hmn : m ≤ n) + (q r : A.toLowerRamificationFiltration.quotient n) : + A.toLowerRamificationFiltration.quotientMapOfLe hmn q = + A.toLowerRamificationFiltration.quotientMapOfLe hmn r ↔ + ∃ σ : G, A.actionQuotient σ ∈ A.principalUnits.subgroup m ∧ + A.toLowerRamificationFiltration.quotientMk n σ = q / r := by + simpa [toLowerRamificationFiltration_apply, + mem_lowerRamificationGroup_iff_actionQuotient] using + A.toLowerRamificationFiltration.quotientMapOfLe_eq_iff_exists_mem_div_repr + hmn q r + +/-- At every finite level `N ≥ n + 1`, the action-defined `n`th graded piece +is the quotient of finite-level kernels `(G_n/G_N)/(G_{n+1}/G_N)`. -/ +def quotientKernelByNextKernelEquivGradedPiece {n N : ℕ} (hN : n + 1 ≤ N) : + A.toLowerRamificationFiltration.quotientKernelOfLe + (le_trans (Nat.le_succ n) hN) ⧸ + (A.toLowerRamificationFiltration.quotientKernelOfLe hN).subgroupOf + (A.toLowerRamificationFiltration.quotientKernelOfLe + (le_trans (Nat.le_succ n) hN)) ≃* + A.toLowerRamificationFiltration.gradedPiece n := + A.toLowerRamificationFiltration.quotientKernelByNextKernelEquivGradedPiece hN + +/-- States the theorem `gradedPieceEquivQuotientKernel_quotientKernelByNextKernel_mk'`. -/ +theorem gradedPieceEquivQuotientKernel_quotientKernelByNextKernel_mk' + {n N : ℕ} (hN : n + 1 ≤ N) + (q : + A.toLowerRamificationFiltration.quotientKernelOfLe + (le_trans (Nat.le_succ n) hN)) : + A.toLowerRamificationFiltration.gradedPieceEquivQuotientKernel n + (A.quotientKernelByNextKernelEquivGradedPiece hN + (QuotientGroup.mk' + ((A.toLowerRamificationFiltration.quotientKernelOfLe hN).subgroupOf + (A.toLowerRamificationFiltration.quotientKernelOfLe + (le_trans (Nat.le_succ n) hN))) q)) = + A.toLowerRamificationFiltration.quotientKernelMapOfLe (Nat.le_succ n) hN q := + AntitoneNormalSubgroupFiltration.gradedPieceEquivQuotientKernel_quotientKernelByNextKernel_mk' + A.toLowerRamificationFiltration hN q + +/-- Cardinality form of the action-defined finite-level graded-piece +compatibility `(G_n/G_N)/(G_{n+1}/G_N) ≃ G_n/G_{n+1}`. -/ +theorem card_quotientKernelByNextKernel_eq_gradedPiece {n N : ℕ} + (hN : n + 1 ≤ N) [Finite G] : + Nat.card + (A.toLowerRamificationFiltration.quotientKernelOfLe + (le_trans (Nat.le_succ n) hN) ⧸ + (A.toLowerRamificationFiltration.quotientKernelOfLe hN).subgroupOf + (A.toLowerRamificationFiltration.quotientKernelOfLe + (le_trans (Nat.le_succ n) hN))) = + Nat.card (A.toLowerRamificationFiltration.gradedPiece n) := + AntitoneNormalSubgroupFiltration.card_quotientKernelByNextKernel_eq_gradedPiece + A.toLowerRamificationFiltration hN + +/-- Representative criterion for the identity class in the action-defined +graded piece `G_n/G_{n+1}`. -/ +theorem gradedPieceMk_eq_one_iff_actionDepthAtLeast + (n : ℕ) (σ : A.lowerRamificationGroup n) : + A.toLowerRamificationFiltration.gradedPieceMk n σ = 1 ↔ + A.actionDepthAtLeast (n + 1) (σ : G) := by + simpa [toLowerRamificationFiltration_apply, + mem_lowerRamificationGroup_iff] using + A.toLowerRamificationFiltration.gradedPieceMk_eq_one_iff n σ + +/-- Representative criterion for the identity class in the action-defined +graded piece `G_n/G_{n+1}`, expanded as membership of the action quotient in +`U^{n+1}`. -/ +theorem gradedPieceMk_eq_one_iff_actionQuotient_mem + (n : ℕ) (σ : A.lowerRamificationGroup n) : + A.toLowerRamificationFiltration.gradedPieceMk n σ = 1 ↔ + A.actionQuotient (σ : G) ∈ A.principalUnits.subgroup (n + 1) := + (A.gradedPieceMk_eq_one_iff_actionDepthAtLeast n σ).trans + (A.actionDepthAtLeast_iff (n + 1) (σ : G)) + +/-- Representative equality criterion in the action-defined graded piece +`G_n/G_{n+1}`, in right-quotient form. -/ +theorem gradedPieceMk_eq_iff_actionDepthAtLeast_div + (n : ℕ) (σ τ : A.lowerRamificationGroup n) : + A.toLowerRamificationFiltration.gradedPieceMk n σ = + A.toLowerRamificationFiltration.gradedPieceMk n τ ↔ + A.actionDepthAtLeast (n + 1) + ((σ / τ : A.lowerRamificationGroup n) : G) := by + exact + (A.toLowerRamificationFiltration.gradedPieceMk_eq_iff n σ τ).trans + (A.mem_lowerRamificationGroup_iff (n + 1) + ((σ / τ : A.lowerRamificationGroup n) : G)) + +/-- Representative equality criterion in the action-defined graded piece +`G_n/G_{n+1}`, in right-quotient form, expanded as membership of the action +quotient in `U^{n+1}`. -/ +theorem gradedPieceMk_eq_iff_actionQuotient_div_mem + (n : ℕ) (σ τ : A.lowerRamificationGroup n) : + A.toLowerRamificationFiltration.gradedPieceMk n σ = + A.toLowerRamificationFiltration.gradedPieceMk n τ ↔ + A.actionQuotient + (((σ / τ : A.lowerRamificationGroup n) : G)) ∈ + A.principalUnits.subgroup (n + 1) := + (A.gradedPieceMk_eq_iff_actionDepthAtLeast_div n σ τ).trans + (A.actionDepthAtLeast_iff (n + 1) + (((σ / τ : A.lowerRamificationGroup n) : G))) + +/-- Representative equality criterion in the action-defined graded piece +`G_n/G_{n+1}`, in left-quotient form. -/ +theorem gradedPieceMk_eq_iff_actionDepthAtLeast_inv_mul + (n : ℕ) (σ τ : A.lowerRamificationGroup n) : + A.toLowerRamificationFiltration.gradedPieceMk n σ = + A.toLowerRamificationFiltration.gradedPieceMk n τ ↔ + A.actionDepthAtLeast (n + 1) + ((τ⁻¹ * σ : A.lowerRamificationGroup n) : G) := by + exact + (A.toLowerRamificationFiltration.gradedPieceMk_eq_iff_inv_mul_mem + n σ τ).trans + (A.mem_lowerRamificationGroup_iff (n + 1) + ((τ⁻¹ * σ : A.lowerRamificationGroup n) : G)) + +/-- Representative equality criterion in the action-defined graded piece +`G_n/G_{n+1}`, in left-quotient form, expanded as membership of the action +quotient in `U^{n+1}`. -/ +theorem gradedPieceMk_eq_iff_actionQuotient_inv_mul_mem + (n : ℕ) (σ τ : A.lowerRamificationGroup n) : + A.toLowerRamificationFiltration.gradedPieceMk n σ = + A.toLowerRamificationFiltration.gradedPieceMk n τ ↔ + A.actionQuotient + (((τ⁻¹ * σ : A.lowerRamificationGroup n) : G)) ∈ + A.principalUnits.subgroup (n + 1) := + (A.gradedPieceMk_eq_iff_actionDepthAtLeast_inv_mul n σ τ).trans + (A.actionDepthAtLeast_iff (n + 1) + (((τ⁻¹ * σ : A.lowerRamificationGroup n) : G))) + +end ValuationActionRamification + +end DiscreteValuationField + +end + +end RamificationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/RamificationQuotients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/RamificationQuotients.lean new file mode 100644 index 0000000000..cecfbfe568 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/RamificationQuotients.lean @@ -0,0 +1,605 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.GroupTheory.QuotientGroup.Finite +/-! +# Named quotients of antitone normal-subgroup filtrations + +This module owns the opaque quotient carriers of a lower ramification +filtration and their construction, elimination, lifting, and mapping API. +Arithmetic Herbrand functions and valuation-action specializations live in +`RamificationTheory.GaloisValuation.Ramification`. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace RamificationTheory +namespace DiscreteValuationField + +/-- A generic antitone filtration by normal subgroups. This interface contains +only the group-theoretic laws; arithmetic lower ramification filtrations are +canonical values constructed from valued extensions. -/ +structure AntitoneNormalSubgroupFiltration (G : Type u) [Group G] where + /-- The subgroup at each lower-filtration index. -/ + lower : ℕ → Subgroup G + /-- Every subgroup in the lower filtration is normal. -/ + lower_normal : ∀ n : ℕ, (lower n).Normal + /-- The lower filtration decreases as its index increases. -/ + antitone : ∀ {m n : ℕ}, m ≤ n → lower n ≤ lower m + +namespace AntitoneNormalSubgroupFiltration + +variable {G : Type u} [Group G] (F : AntitoneNormalSubgroupFiltration G) + +/-- Provides the instance `lower_normal_instance`. -/ +instance lower_normal_instance (n : ℕ) : (F.lower n).Normal := + F.lower_normal n + +/-- The quotient by the `n`th lower ramification group. -/ +def quotient (n : ℕ) : Type u := + G ⧸ F.lower n + +/-- The subquotient `G_m / G_n`, used for ramification graded pieces when +`m ≤ n`. The type is available for all `m,n`; under `m ≤ n`, `G_n` is a +subgroup of `G_m` by antitonicity. -/ +def subquotient (m n : ℕ) : Type u := + F.lower m ⧸ (F.lower n).subgroupOf (F.lower m) + +/-- The lower ramification graded piece `G_n/G_{n+1}`. -/ +def gradedPiece (n : ℕ) : Type u := + F.subquotient n (n + 1) + +/-- The inertia subgroup `G_0` of a lower ramification filtration. -/ +abbrev inertiaSubgroup : Subgroup G := + F.lower 0 + +/-- States the theorem `lower_zero_eq_inertiaSubgroup`. -/ +theorem lower_zero_eq_inertiaSubgroup : + F.lower 0 = F.inertiaSubgroup := + rfl + +/-- The wild inertia subgroup `G_1` of a lower ramification filtration. -/ +abbrev wildInertiaSubgroup : Subgroup G := + F.lower 1 + +/-- The tame quotient `G_0/G_1`. -/ +def tameQuotient : Type u := + F.gradedPiece 0 + +/-- Provides the instance `inertiaSubgroup_normal`. -/ +instance inertiaSubgroup_normal : F.inertiaSubgroup.Normal := by + change (F.lower 0).Normal + infer_instance + +/-- Provides the instance `wildInertiaSubgroup_normal`. -/ +instance wildInertiaSubgroup_normal : F.wildInertiaSubgroup.Normal := by + change (F.lower 1).Normal + infer_instance + +/-- States the theorem `wildInertiaSubgroup_le_inertiaSubgroup`. -/ +theorem wildInertiaSubgroup_le_inertiaSubgroup : + F.wildInertiaSubgroup ≤ F.inertiaSubgroup := + F.antitone (Nat.zero_le 1) + +/-- Provides the instance `wildInertiaSubgroup_subgroupOf_inertiaSubgroup_normal`. -/ +instance wildInertiaSubgroup_subgroupOf_inertiaSubgroup_normal : + ((F.wildInertiaSubgroup).subgroupOf F.inertiaSubgroup).Normal := by + change ((F.lower 1).subgroupOf (F.lower 0)).Normal + infer_instance + +/-! ### Named quotient boundaries + +The four ramification quotient carriers are opaque public objects. Raw +`QuotientGroup` presentations occur only in the concrete equivalences and in +the implementation of the operations below. -/ + +/-- Provides the instance `quotientGroup`. -/ +instance quotientGroup (n : ℕ) : Group (F.quotient n) := by + change Group (G ⧸ F.lower n) + infer_instance + +/-- Provides the instance `subquotientGroup`. -/ +instance subquotientGroup (m n : ℕ) : Group (F.subquotient m n) := by + change Group + (F.lower m ⧸ (F.lower n).subgroupOf (F.lower m)) + infer_instance + +/-- Provides the instance `gradedPieceGroup`. -/ +instance gradedPieceGroup (n : ℕ) : Group (F.gradedPiece n) := by + change Group + (F.lower n ⧸ + (F.lower (n + 1)).subgroupOf (F.lower n)) + infer_instance + +/-- Provides the instance `tameQuotientGroup`. -/ +instance tameQuotientGroup : Group F.tameQuotient := by + change Group + (F.inertiaSubgroup ⧸ + (F.wildInertiaSubgroup).subgroupOf F.inertiaSubgroup) + infer_instance + +/-- Concrete presentation of `G/G_n`. -/ +def quotientConcreteMulEquiv (n : ℕ) : + F.quotient n ≃* G ⧸ F.lower n := + MulEquiv.refl _ + +/-- Concrete presentation of `G_m/G_n`. -/ +def subquotientConcreteMulEquiv (m n : ℕ) : + F.subquotient m n ≃* + F.lower m ⧸ (F.lower n).subgroupOf (F.lower m) := + MulEquiv.refl _ + +/-- The graded piece as its adjacent named subquotient. -/ +def gradedPieceEquivSubquotient (n : ℕ) : + F.gradedPiece n ≃* F.subquotient n (n + 1) := + MulEquiv.refl _ + +/-- Concrete presentation of `G_n/G_{n+1}`. -/ +def gradedPieceConcreteMulEquiv (n : ℕ) : + F.gradedPiece n ≃* + F.lower n ⧸ (F.lower (n + 1)).subgroupOf (F.lower n) := + (F.gradedPieceEquivSubquotient n).trans + (F.subquotientConcreteMulEquiv n (n + 1)) + +/-- The tame quotient as the zeroth named graded piece. -/ +def tameQuotientEquivGradedPiece : + F.tameQuotient ≃* F.gradedPiece 0 := + MulEquiv.refl _ + +/-- Concrete presentation of `G_0/G_1`. -/ +def tameQuotientConcreteMulEquiv : + F.tameQuotient ≃* + F.inertiaSubgroup ⧸ + (F.wildInertiaSubgroup).subgroupOf F.inertiaSubgroup := + (F.tameQuotientEquivGradedPiece).trans + (F.gradedPieceConcreteMulEquiv 0) + +/-- Canonical projection to `G/G_n`. -/ +def quotientMk (n : ℕ) : G →* F.quotient n := + (F.quotientConcreteMulEquiv n).symm.toMonoidHom.comp + (QuotientGroup.mk' (F.lower n)) + +/-- States the theorem `quotientMk_apply`. -/ +@[simp] +theorem quotientMk_apply (n : ℕ) (σ : G) : + F.quotientConcreteMulEquiv n (F.quotientMk n σ) = + QuotientGroup.mk' (F.lower n) σ := + rfl + +/-- States the theorem `quotientMk_eq_one_iff`. -/ +@[simp] +theorem quotientMk_eq_one_iff (n : ℕ) (σ : G) : + F.quotientMk n σ = 1 ↔ σ ∈ F.lower n := by + constructor + · intro h + have h' := congrArg (F.quotientConcreteMulEquiv n) h + rw [F.quotientMk_apply, map_one] at h' + exact (QuotientGroup.eq_one_iff σ).1 h' + · intro h + apply (F.quotientConcreteMulEquiv n).injective + rw [F.quotientMk_apply, map_one] + exact (QuotientGroup.eq_one_iff σ).2 h + +/-- States the theorem `quotientMk_eq_iff`. -/ +@[simp] +theorem quotientMk_eq_iff (n : ℕ) (σ τ : G) : + F.quotientMk n σ = F.quotientMk n τ ↔ σ / τ ∈ F.lower n := by + constructor + · intro h + have h' := congrArg (F.quotientConcreteMulEquiv n) h + rw [F.quotientMk_apply, F.quotientMk_apply] at h' + exact QuotientGroup.eq_iff_div_mem.mp h' + · intro h + apply (F.quotientConcreteMulEquiv n).injective + rw [F.quotientMk_apply, F.quotientMk_apply] + exact QuotientGroup.eq_iff_div_mem.mpr h + +/-- Eliminate a named ramification quotient through canonical +representatives. -/ +protected theorem quotient_inductionOn (n : ℕ) + {motive : F.quotient n → Prop} (q : F.quotient n) + (h : ∀ σ : G, motive (F.quotientMk n σ)) : + motive q := by + obtain ⟨σ, rfl⟩ := + ((F.quotientConcreteMulEquiv n).symm.surjective.comp + (QuotientGroup.mk'_surjective (F.lower n))) q + exact h σ + +/-- Descend a homomorphism that kills the `n`th lower group. -/ +def quotientLift {H : Type v} [Group H] (n : ℕ) + (f : G →* H) (h : F.lower n ≤ f.ker) : + F.quotient n →* H := + (QuotientGroup.lift (F.lower n) f h).comp + (F.quotientConcreteMulEquiv n).toMonoidHom + +/-- States the theorem `quotientLift_mk`. -/ +@[simp] +theorem quotientLift_mk {H : Type v} [Group H] (n : ℕ) + (f : G →* H) (h : F.lower n ≤ f.ker) (σ : G) : + F.quotientLift n f h (F.quotientMk n σ) = f σ := + rfl + +/-- Map between named ramification quotients induced by a group +homomorphism. -/ +def quotientMap {H : Type v} [Group H] + (E : AntitoneNormalSubgroupFiltration H) (n m : ℕ) + (f : G →* H) + (h : ∀ σ : G, σ ∈ F.lower n → f σ ∈ E.lower m) : + F.quotient n →* E.quotient m := + F.quotientLift n ((E.quotientMk m).comp f) (by + intro σ hσ + rw [MonoidHom.mem_ker] + exact (E.quotientMk_eq_one_iff m (f σ)).2 (h σ hσ)) + +/-- States the theorem `quotientMap_apply_mk`. -/ +@[simp] +theorem quotientMap_apply_mk {H : Type v} [Group H] + (E : AntitoneNormalSubgroupFiltration H) (n m : ℕ) + (f : G →* H) + (h : ∀ σ : G, σ ∈ F.lower n → f σ ∈ E.lower m) (σ : G) : + F.quotientMap E n m f h (F.quotientMk n σ) = + E.quotientMk m (f σ) := + rfl + +/-- Canonical projection to `G_m/G_n`. -/ +def subquotientMk (m n : ℕ) : F.lower m →* F.subquotient m n := + (F.subquotientConcreteMulEquiv m n).symm.toMonoidHom.comp + (QuotientGroup.mk' ((F.lower n).subgroupOf (F.lower m))) + +/-- States the theorem `subquotientMk_apply`. -/ +@[simp] +theorem subquotientMk_apply (m n : ℕ) (σ : F.lower m) : + F.subquotientConcreteMulEquiv m n (F.subquotientMk m n σ) = + QuotientGroup.mk' ((F.lower n).subgroupOf (F.lower m)) σ := + rfl + +/-- States the theorem `subquotientMk_eq_one_iff`. -/ +@[simp] +theorem subquotientMk_eq_one_iff (m n : ℕ) (σ : F.lower m) : + F.subquotientMk m n σ = 1 ↔ (σ : G) ∈ F.lower n := by + constructor + · intro h + have h' := congrArg (F.subquotientConcreteMulEquiv m n) h + rw [F.subquotientMk_apply, map_one] at h' + simpa [Subgroup.mem_subgroupOf] using + ((QuotientGroup.eq_one_iff + (N := (F.lower n).subgroupOf (F.lower m)) σ).1 h') + · intro h + apply (F.subquotientConcreteMulEquiv m n).injective + rw [F.subquotientMk_apply, map_one] + apply (QuotientGroup.eq_one_iff + (N := (F.lower n).subgroupOf (F.lower m)) σ).2 + simpa [Subgroup.mem_subgroupOf] using h + +/-- States the theorem `subquotientMk_eq_iff`. -/ +@[simp] +theorem subquotientMk_eq_iff (m n : ℕ) (σ τ : F.lower m) : + F.subquotientMk m n σ = F.subquotientMk m n τ ↔ + ((σ / τ : F.lower m) : G) ∈ F.lower n := by + constructor + · intro h + have h' := congrArg (F.subquotientConcreteMulEquiv m n) h + rw [F.subquotientMk_apply, F.subquotientMk_apply] at h' + simpa [Subgroup.mem_subgroupOf] using + ((QuotientGroup.eq_iff_div_mem + (N := (F.lower n).subgroupOf (F.lower m)) + (x := σ) (y := τ)).1 h') + · intro h + apply (F.subquotientConcreteMulEquiv m n).injective + rw [F.subquotientMk_apply, F.subquotientMk_apply] + apply (QuotientGroup.eq_iff_div_mem + (N := (F.lower n).subgroupOf (F.lower m)) + (x := σ) (y := τ)).2 + simpa [Subgroup.mem_subgroupOf] using h + +/-- Eliminate a named ramification subquotient. -/ +protected theorem subquotient_inductionOn (m n : ℕ) + {motive : F.subquotient m n → Prop} (q : F.subquotient m n) + (h : ∀ σ : F.lower m, motive (F.subquotientMk m n σ)) : + motive q := by + obtain ⟨σ, rfl⟩ := + ((F.subquotientConcreteMulEquiv m n).symm.surjective.comp + (QuotientGroup.mk'_surjective + ((F.lower n).subgroupOf (F.lower m)))) q + exact h σ + +/-- Descend a homomorphism from `G_m` that kills the copy of `G_n`. -/ +def subquotientLift {H : Type v} [Group H] (m n : ℕ) + (f : F.lower m →* H) + (h : (F.lower n).subgroupOf (F.lower m) ≤ f.ker) : + F.subquotient m n →* H := + (QuotientGroup.lift + ((F.lower n).subgroupOf (F.lower m)) f h).comp + (F.subquotientConcreteMulEquiv m n).toMonoidHom + +/-- States the theorem `subquotientLift_mk`. -/ +@[simp] +theorem subquotientLift_mk {H : Type v} [Group H] (m n : ℕ) + (f : F.lower m →* H) + (h : (F.lower n).subgroupOf (F.lower m) ≤ f.ker) + (σ : F.lower m) : + F.subquotientLift m n f h (F.subquotientMk m n σ) = f σ := + rfl + +/-- Map between named subquotients induced by a homomorphism of their upper +groups which sends the lower relation into the target lower group. -/ +def subquotientMap {H : Type v} [Group H] + (E : AntitoneNormalSubgroupFiltration H) + (m n p q : ℕ) (f : F.lower m →* E.lower p) + (h : ∀ σ : F.lower m, (σ : G) ∈ F.lower n → + ((f σ : E.lower p) : H) ∈ E.lower q) : + F.subquotient m n →* E.subquotient p q := + F.subquotientLift m n ((E.subquotientMk p q).comp f) (by + intro σ hσ + rw [MonoidHom.mem_ker] + exact (E.subquotientMk_eq_one_iff p q (f σ)).2 (h σ hσ)) + +/-- States the theorem `subquotientMap_apply_mk`. -/ +@[simp] +theorem subquotientMap_apply_mk {H : Type v} [Group H] + (E : AntitoneNormalSubgroupFiltration H) + (m n p q : ℕ) (f : F.lower m →* E.lower p) + (h : ∀ σ : F.lower m, (σ : G) ∈ F.lower n → + ((f σ : E.lower p) : H) ∈ E.lower q) + (σ : F.lower m) : + F.subquotientMap E m n p q f h (F.subquotientMk m n σ) = + E.subquotientMk p q (f σ) := + rfl + +/-- Canonical projection to `G_n/G_{n+1}`. -/ +def gradedPieceMk (n : ℕ) : F.lower n →* F.gradedPiece n := + (F.gradedPieceConcreteMulEquiv n).symm.toMonoidHom.comp + (QuotientGroup.mk' + ((F.lower (n + 1)).subgroupOf (F.lower n))) + +/-- States the theorem `gradedPieceMk_apply`. -/ +@[simp] +theorem gradedPieceMk_apply (n : ℕ) (σ : F.lower n) : + F.gradedPieceConcreteMulEquiv n (F.gradedPieceMk n σ) = + QuotientGroup.mk' + ((F.lower (n + 1)).subgroupOf (F.lower n)) σ := + rfl + +/-- States the theorem `gradedPieceMk_eq_one_iff`. -/ +@[simp] +theorem gradedPieceMk_eq_one_iff (n : ℕ) (σ : F.lower n) : + F.gradedPieceMk n σ = 1 ↔ (σ : G) ∈ F.lower (n + 1) := by + constructor + · intro h + have h' := congrArg (F.gradedPieceConcreteMulEquiv n) h + rw [F.gradedPieceMk_apply, map_one] at h' + simpa [Subgroup.mem_subgroupOf] using + ((QuotientGroup.eq_one_iff + (N := (F.lower (n + 1)).subgroupOf (F.lower n)) σ).1 h') + · intro h + apply (F.gradedPieceConcreteMulEquiv n).injective + rw [F.gradedPieceMk_apply, map_one] + apply (QuotientGroup.eq_one_iff + (N := (F.lower (n + 1)).subgroupOf (F.lower n)) σ).2 + simpa [Subgroup.mem_subgroupOf] using h + +/-- States the theorem `gradedPieceMk_eq_iff`. -/ +@[simp] +theorem gradedPieceMk_eq_iff (n : ℕ) (σ τ : F.lower n) : + F.gradedPieceMk n σ = F.gradedPieceMk n τ ↔ + ((σ / τ : F.lower n) : G) ∈ F.lower (n + 1) := by + constructor + · intro h + have h' := congrArg (F.gradedPieceConcreteMulEquiv n) h + rw [F.gradedPieceMk_apply, F.gradedPieceMk_apply] at h' + simpa [Subgroup.mem_subgroupOf] using + ((QuotientGroup.eq_iff_div_mem + (N := (F.lower (n + 1)).subgroupOf (F.lower n)) + (x := σ) (y := τ)).1 h') + · intro h + apply (F.gradedPieceConcreteMulEquiv n).injective + rw [F.gradedPieceMk_apply, F.gradedPieceMk_apply] + apply (QuotientGroup.eq_iff_div_mem + (N := (F.lower (n + 1)).subgroupOf (F.lower n)) + (x := σ) (y := τ)).2 + simpa [Subgroup.mem_subgroupOf] using h + +/-- Eliminate a named graded piece. -/ +protected theorem gradedPiece_inductionOn (n : ℕ) + {motive : F.gradedPiece n → Prop} (q : F.gradedPiece n) + (h : ∀ σ : F.lower n, motive (F.gradedPieceMk n σ)) : + motive q := by + obtain ⟨σ, rfl⟩ := + ((F.gradedPieceConcreteMulEquiv n).symm.surjective.comp + (QuotientGroup.mk'_surjective + ((F.lower (n + 1)).subgroupOf (F.lower n)))) q + exact h σ + +/-- Descend a homomorphism from `G_n` that kills `G_{n+1}`. -/ +def gradedPieceLift {H : Type v} [Group H] (n : ℕ) + (f : F.lower n →* H) + (h : (F.lower (n + 1)).subgroupOf (F.lower n) ≤ f.ker) : + F.gradedPiece n →* H := + (QuotientGroup.lift + ((F.lower (n + 1)).subgroupOf (F.lower n)) f h).comp + (F.gradedPieceConcreteMulEquiv n).toMonoidHom + +/-- States the theorem `gradedPieceLift_mk`. -/ +@[simp] +theorem gradedPieceLift_mk {H : Type v} [Group H] (n : ℕ) + (f : F.lower n →* H) + (h : (F.lower (n + 1)).subgroupOf (F.lower n) ≤ f.ker) + (σ : F.lower n) : + F.gradedPieceLift n f h (F.gradedPieceMk n σ) = f σ := + rfl + +/-- Map between named graded pieces. -/ +def gradedPieceMap {H : Type v} [Group H] + (E : AntitoneNormalSubgroupFiltration H) (n m : ℕ) + (f : F.lower n →* E.lower m) + (h : ∀ σ : F.lower n, (σ : G) ∈ F.lower (n + 1) → + ((f σ : E.lower m) : H) ∈ E.lower (m + 1)) : + F.gradedPiece n →* E.gradedPiece m := + F.gradedPieceLift n ((E.gradedPieceMk m).comp f) (by + intro σ hσ + rw [MonoidHom.mem_ker] + exact (E.gradedPieceMk_eq_one_iff m (f σ)).2 (h σ hσ)) + +/-- States the theorem `gradedPieceMap_apply_mk`. -/ +@[simp] +theorem gradedPieceMap_apply_mk {H : Type v} [Group H] + (E : AntitoneNormalSubgroupFiltration H) (n m : ℕ) + (f : F.lower n →* E.lower m) + (h : ∀ σ : F.lower n, (σ : G) ∈ F.lower (n + 1) → + ((f σ : E.lower m) : H) ∈ E.lower (m + 1)) + (σ : F.lower n) : + F.gradedPieceMap E n m f h (F.gradedPieceMk n σ) = + E.gradedPieceMk m (f σ) := + rfl + +/-- Canonical projection to `G_0/G_1`. -/ +def tameQuotientMk : F.inertiaSubgroup →* F.tameQuotient := + F.tameQuotientConcreteMulEquiv.symm.toMonoidHom.comp + (QuotientGroup.mk' + ((F.wildInertiaSubgroup).subgroupOf F.inertiaSubgroup)) + +/-- States the theorem `tameQuotientMk_apply`. -/ +@[simp] +theorem tameQuotientMk_apply (σ : F.inertiaSubgroup) : + F.tameQuotientConcreteMulEquiv (F.tameQuotientMk σ) = + QuotientGroup.mk' + ((F.wildInertiaSubgroup).subgroupOf F.inertiaSubgroup) σ := + rfl + +/-- States the theorem `tameQuotientMk_eq_one_iff`. -/ +@[simp] +theorem tameQuotientMk_eq_one_iff (σ : F.inertiaSubgroup) : + F.tameQuotientMk σ = 1 ↔ (σ : G) ∈ F.wildInertiaSubgroup := by + constructor + · intro h + have h' := congrArg F.tameQuotientConcreteMulEquiv h + rw [F.tameQuotientMk_apply, map_one] at h' + simpa [Subgroup.mem_subgroupOf] using + ((QuotientGroup.eq_one_iff + (N := (F.wildInertiaSubgroup).subgroupOf F.inertiaSubgroup) σ).1 h') + · intro h + apply F.tameQuotientConcreteMulEquiv.injective + rw [F.tameQuotientMk_apply, map_one] + apply (QuotientGroup.eq_one_iff + (N := (F.wildInertiaSubgroup).subgroupOf F.inertiaSubgroup) σ).2 + simpa [Subgroup.mem_subgroupOf] using h + +/-- States the theorem `tameQuotientMk_eq_iff`. -/ +@[simp] +theorem tameQuotientMk_eq_iff (σ τ : F.inertiaSubgroup) : + F.tameQuotientMk σ = F.tameQuotientMk τ ↔ + ((σ / τ : F.inertiaSubgroup) : G) ∈ F.wildInertiaSubgroup := by + constructor + · intro h + have h' := congrArg F.tameQuotientConcreteMulEquiv h + rw [F.tameQuotientMk_apply, F.tameQuotientMk_apply] at h' + simpa [Subgroup.mem_subgroupOf] using + ((QuotientGroup.eq_iff_div_mem + (N := (F.wildInertiaSubgroup).subgroupOf F.inertiaSubgroup) + (x := σ) (y := τ)).1 h') + · intro h + apply F.tameQuotientConcreteMulEquiv.injective + rw [F.tameQuotientMk_apply, F.tameQuotientMk_apply] + apply (QuotientGroup.eq_iff_div_mem + (N := (F.wildInertiaSubgroup).subgroupOf F.inertiaSubgroup) + (x := σ) (y := τ)).2 + simpa [Subgroup.mem_subgroupOf] using h + +/-- Eliminate the named tame quotient. -/ +protected theorem tameQuotient_inductionOn + {motive : F.tameQuotient → Prop} (q : F.tameQuotient) + (h : ∀ σ : F.inertiaSubgroup, motive (F.tameQuotientMk σ)) : + motive q := by + obtain ⟨σ, rfl⟩ := + (F.tameQuotientConcreteMulEquiv.symm.surjective.comp + (QuotientGroup.mk'_surjective + ((F.wildInertiaSubgroup).subgroupOf F.inertiaSubgroup))) q + exact h σ + +/-- Descend an inertia homomorphism which kills wild inertia. -/ +def tameQuotientLift {H : Type v} [Group H] + (f : F.inertiaSubgroup →* H) + (h : (F.wildInertiaSubgroup).subgroupOf F.inertiaSubgroup ≤ f.ker) : + F.tameQuotient →* H := + (QuotientGroup.lift + ((F.wildInertiaSubgroup).subgroupOf F.inertiaSubgroup) f h).comp + F.tameQuotientConcreteMulEquiv.toMonoidHom + +/-- States the theorem `tameQuotientLift_mk`. -/ +@[simp] +theorem tameQuotientLift_mk {H : Type v} [Group H] + (f : F.inertiaSubgroup →* H) + (h : (F.wildInertiaSubgroup).subgroupOf F.inertiaSubgroup ≤ f.ker) + (σ : F.inertiaSubgroup) : + F.tameQuotientLift f h (F.tameQuotientMk σ) = f σ := + rfl + +/-- Map between named tame quotients. -/ +def tameQuotientMap {H : Type v} [Group H] + (E : AntitoneNormalSubgroupFiltration H) + (f : F.inertiaSubgroup →* E.inertiaSubgroup) + (h : ∀ σ : F.inertiaSubgroup, (σ : G) ∈ F.wildInertiaSubgroup → + ((f σ : E.inertiaSubgroup) : H) ∈ E.wildInertiaSubgroup) : + F.tameQuotient →* E.tameQuotient := + F.tameQuotientLift (E.tameQuotientMk.comp f) (by + intro σ hσ + rw [MonoidHom.mem_ker] + exact (E.tameQuotientMk_eq_one_iff (f σ)).2 (h σ hσ)) + +/-- States the theorem `tameQuotientMap_apply_mk`. -/ +@[simp] +theorem tameQuotientMap_apply_mk {H : Type v} [Group H] + (E : AntitoneNormalSubgroupFiltration H) + (f : F.inertiaSubgroup →* E.inertiaSubgroup) + (h : ∀ σ : F.inertiaSubgroup, (σ : G) ∈ F.wildInertiaSubgroup → + ((f σ : E.inertiaSubgroup) : H) ∈ E.wildInertiaSubgroup) + (σ : F.inertiaSubgroup) : + F.tameQuotientMap E f h (F.tameQuotientMk σ) = + E.tameQuotientMk (f σ) := + rfl + +/-- Provides the instance `quotientFinite`. -/ +instance quotientFinite [Finite G] (n : ℕ) : Finite (F.quotient n) := + Finite.of_surjective (F.quotientMk n) fun q => + F.quotient_inductionOn n + (motive := fun q => ∃ σ, F.quotientMk n σ = q) q + (fun σ => ⟨σ, rfl⟩) + +/-- Provides the instance `subquotientFinite`. -/ +instance subquotientFinite [Finite G] (m n : ℕ) : + Finite (F.subquotient m n) := + Finite.of_surjective (F.subquotientMk m n) fun q => + F.subquotient_inductionOn m n + (motive := fun q => ∃ σ, F.subquotientMk m n σ = q) q + (fun σ => ⟨σ, rfl⟩) + +/-- Provides the instance `gradedPieceFinite`. -/ +instance gradedPieceFinite [Finite G] (n : ℕ) : + Finite (F.gradedPiece n) := + Finite.of_surjective (F.gradedPieceMk n) fun q => + F.gradedPiece_inductionOn n + (motive := fun q => ∃ σ, F.gradedPieceMk n σ = q) q + (fun σ => ⟨σ, rfl⟩) + +/-- Provides the instance `tameQuotientFinite`. -/ +instance tameQuotientFinite [Finite G] : Finite F.tameQuotient := + Finite.of_surjective F.tameQuotientMk fun q => + F.tameQuotient_inductionOn + (motive := fun q => ∃ σ, F.tameQuotientMk σ = q) q + (fun σ => ⟨σ, rfl⟩) + + +end AntitoneNormalSubgroupFiltration + +end DiscreteValuationField +end RamificationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand.lean new file mode 100644 index 0000000000..0bfbe5b02f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Average +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.FixedField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Function +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Quotient +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Tower + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Average.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Average.lean new file mode 100644 index 0000000000..c26e66fb93 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Average.lean @@ -0,0 +1,457 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Function +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Tower +/-! +# The fibre average in Herbrand's theorem + +This file formalizes the remaining finite-group calculation in +the Herbrand quotient theorem. For a normal subgroup `H`, the depth on `G` +defines the lower filtration + +`H_s = {τ : H | s + 1 ≤ depth τ}`. + +For a nonidentity class in `G ⧸ H`, all depths in its fibre are finite, so +their normalized average is a definition rather than an assumed quotient +depth. The main theorem identifies this average, at a representative of +maximal depth, with the Herbrand function of the above filtration. The +valued-field equality between this average and the actual quotient depth is +the separate input of the quotient-depth identity. +-/ + +@[expose] public section + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction → + herbrandFunction + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction_strictMono → + herbrandFunction_strictMono + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandValueNat → + herbrandValueNat + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandValueNat_eq_depth_sum → + herbrandValueNat_eq_depth_sum + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + truncatedLowerDepth → + truncatedLowerDepth + + +noncomputable +section + +universe u + +namespace RamificationTheory.DiscreteValuationField +namespace HerbrandGroupTheory +namespace NonarchimedeanDepth + +variable {G : Type u} [Group G] + +variable (D : NonarchimedeanDepth G) + +/-- States the theorem `depth_inv`. -/ +theorem depth_inv (σ : G) : D.depth σ⁻¹ = D.depth σ := by + by_contra h + have hmin := D.depth_mul_eq_min_of_ne h + have htop : min (D.depth σ⁻¹) (D.depth σ) = ⊤ := by + rw [← hmin] + simp [D.depth_one] + have hσinv : D.depth σ⁻¹ = ⊤ := (min_eq_top.mp htop).1 + have hσ : D.depth σ = ⊤ := (min_eq_top.mp htop).2 + exact h (hσinv.trans hσ.symm) + +variable (H : Subgroup G) [H.Normal] + +/-- A subgroup of a finite group is equipped with its finite enumeration. -/ +noncomputable local instance averageSubgroupFintype [Finite G] : Fintype H := + Fintype.ofFinite H + +/-- Each fiber of the quotient map from a finite group has a finite enumeration. -/ +noncomputable local instance averageQuotientFiberFintype [Finite G] (q : G ⧸ H) : + Fintype (QuotientFiber H q) := + Fintype.ofFinite (QuotientFiber H q) + +/-- The `n`th lower group of `H` cut out by the ambient depth: +`H_n = {τ | n + 1 ≤ depth τ}`. -/ +def depthLowerSubgroup (n : ℕ) : Subgroup H where + carrier := {τ | WithTop.some (n + 1) ≤ D.depth (τ : G)} + one_mem' := by simp [D.depth_one] + mul_mem' := by + intro σ τ hσ hτ + exact le_trans (le_min hσ hτ) (D.depth_mul_ge_min (σ : G) (τ : G)) + inv_mem' := by + intro σ hσ + simpa [D.depth_inv] using hσ + +omit [H.Normal] in +/-- States the theorem `mem_depthLowerSubgroup_iff`. -/ +@[simp] theorem mem_depthLowerSubgroup_iff (n : ℕ) (τ : H) : + τ ∈ D.depthLowerSubgroup H n ↔ + WithTop.some (n + 1) ≤ D.depth (τ : G) := + Iff.rfl + +/-- The exact lower filtration on `H` induced by `D`. Conjugation +invariance of the depth supplies normality of every level. -/ +def depthLowerFiltration : AntitoneNormalSubgroupFiltration H where + lower := D.depthLowerSubgroup H + lower_normal := by + intro n + constructor + intro τ hτ σ + change WithTop.some (n + 1) ≤ D.depth (((σ * τ * σ⁻¹ : H) : G)) + rw [show (((σ * τ * σ⁻¹ : H) : G)) = + (σ : G) * (τ : G) * (σ : G)⁻¹ by rfl, D.depth_conj] + exact hτ + antitone := fun {m n} hmn τ hτ => by + change WithTop.some (m + 1) ≤ D.depth (τ : G) + have hmn' : m + 1 ≤ n + 1 := Nat.add_le_add_right hmn 1 + exact le_trans (WithTop.coe_le_coe.2 hmn') hτ + +omit [H.Normal] in +/-- States the theorem `depthLowerFiltration_lower`. -/ +@[simp] theorem depthLowerFiltration_lower (n : ℕ) : + (D.depthLowerFiltration H).lower n = D.depthLowerSubgroup H n := + rfl + +/-- The ramification index in the purely group-theoretic calculation, +namely `|H_0|`. -/ +def depthRamificationIndex : ℕ := + Nat.card ((D.depthLowerFiltration H).lower 0) + +/-- The actual normalized average of the finite depths in a nontrivial +quotient fibre. No quotient-depth datum is included in this definition. -/ +def quotientFiberAverage [Fintype G] {q : G ⧸ H} (hq : q ≠ 1) : ℝ := + (∑ γ : QuotientFiber H q, (D.quotientFiberDepth H hq γ : ℝ)) / + D.depthRamificationIndex H + +omit [H.Normal] in +/-- States the theorem `truncatedLowerDepth_add_one`. -/ +theorem truncatedLowerDepth_add_one (n : ℕ) + (τ : (D.depthLowerFiltration H).lower 0) : + (truncatedLowerDepth (D.depthLowerFiltration H)) n τ + 1 = + WithTop.untopD (α := ℕ) 0 + (min (D.depth ((τ : H) : G)) (WithTop.some (n + 1))) := by + classical + by_cases htop : D.depth ((τ : H) : G) = ⊤ + · have hfilter : + (Finset.range n).filter (fun i => + (τ : H) ∈ (D.depthLowerFiltration H).lower (i + 1)) = + Finset.range n := by + ext i + simp [depthLowerFiltration, depthLowerSubgroup, htop] + rw [truncatedLowerDepth, hfilter] + simp only [Finset.card_range, htop, min_eq_right le_top, + WithTop.untopD_coe] + · let k := (D.depth ((τ : H) : G)).untop htop + have hdepth : WithTop.some k = D.depth ((τ : H) : G) := + WithTop.coe_untop _ _ + have hk : 1 ≤ k := by + have hprop := τ.property + change WithTop.some 1 ≤ D.depth ((τ : H) : G) at hprop + rw [← hdepth] at hprop + exact WithTop.coe_le_coe.mp hprop + have hfilter : + (Finset.range n).filter (fun i => + (τ : H) ∈ (D.depthLowerFiltration H).lower (i + 1)) = + Finset.range (min n (k - 1)) := by + ext i + simp only [Finset.mem_filter, Finset.mem_range, + mem_depthLowerSubgroup_iff, depthLowerFiltration_lower] + rw [← hdepth] + constructor + · rintro ⟨hin, hle⟩ + have hle' : i + 1 + 1 ≤ k := WithTop.coe_le_coe.mp hle + simp only [lt_min_iff] + omega + · intro hi + simp only [lt_min_iff] at hi + refine ⟨hi.1, WithTop.coe_le_coe.2 ?_⟩ + omega + rw [truncatedLowerDepth, hfilter, ← hdepth] + rw [← WithTop.coe_min] + simp only [Finset.card_range, WithTop.untopD_coe] + omega + +omit [H.Normal] in +/-- States the theorem `depth_eq_zero_of_not_mem_lower_zero`. -/ +theorem depth_eq_zero_of_not_mem_lower_zero (τ : H) + (hτ : τ ∉ (D.depthLowerFiltration H).lower 0) : + D.depth (τ : G) = (0 : ℕ) := by + have hnot : ¬ (1 : ℕ) ≤ D.depth (τ : G) := hτ + by_cases htop : D.depth (τ : G) = ⊤ + · rw [htop] at hnot + simp at hnot + · let k := (D.depth (τ : G)).untop htop + have hdepth : WithTop.some k = D.depth (τ : G) := + WithTop.coe_untop _ _ + rw [← hdepth] at hnot ⊢ + have hk : ¬ 1 ≤ k := by + intro hk + exact hnot (WithTop.coe_le_coe.2 hk) + have : k = 0 := by omega + simp [this] + +omit [H.Normal] in +/-- The truncation sum over all of `H` is the inertia-cardinality constant +plus the Herbrand depth sum over `H_0`. -/ +theorem sum_min_depth_eq_card_add_truncated (n : ℕ) [Finite G] : + (∑ τ : H, + (WithTop.untopD (α := ℕ) 0 + (min (D.depth (τ : G)) (WithTop.some (n + 1))) : ℝ)) = + D.depthRamificationIndex H + + ∑ τ : (D.depthLowerFiltration H).lower 0, + ((truncatedLowerDepth (D.depthLowerFiltration H)) n τ : ℝ) := by + classical + let := Fintype.ofFinite G + classical + let F := D.depthLowerFiltration H + let p : H → Prop := fun τ => τ ∈ F.lower 0 + let f : H → ℝ := fun τ => + (WithTop.untopD (α := ℕ) 0 + (min (D.depth (τ : G)) (WithTop.some (n + 1))) : ℝ) + have hout : ∀ τ ∈ (Finset.univ : Finset H), τ ∉ Finset.univ.filter p → f τ = 0 := by + intro τ _ hτ + have hnot : τ ∉ F.lower 0 := by simpa [p] using hτ + have hzero : D.depth (τ : G) = (0 : ℕ) := by + simpa [F] using D.depth_eq_zero_of_not_mem_lower_zero H τ hnot + simp [f, hzero] + calc + (∑ τ : H, + (WithTop.untopD (α := ℕ) 0 + (min (D.depth (τ : G)) (WithTop.some (n + 1))) : ℝ)) = + ∑ τ : H, f τ := rfl + _ = ∑ τ ∈ Finset.univ.filter p, f τ := + (Finset.sum_subset (Finset.filter_subset _ _) hout).symm + _ = ∑ τ : F.lower 0, f (τ : H) := by + apply Finset.sum_subtype + intro τ + simp [p] + _ = ∑ τ : F.lower 0, + ((1 : ℝ) + + ((truncatedLowerDepth F) n τ : ℝ)) := by + apply Finset.sum_congr rfl + intro τ _ + dsimp [f, F] + exact_mod_cast (by + simpa [add_comm] using (D.truncatedLowerDepth_add_one H n τ).symm) + _ = D.depthRamificationIndex H + + ∑ τ : F.lower 0, + ((truncatedLowerDepth F) n τ : ℝ) := by + rw [Finset.sum_add_distrib] + congr 1 + calc + (∑ _τ : F.lower 0, (1 : ℝ)) = + (Fintype.card (F.lower 0) : ℝ) := by + simp only [Finset.sum_const, Finset.card_univ, nsmul_eq_mul, mul_one] + _ = (D.depthRamificationIndex H : ℝ) := + congrArg (fun k : ℕ => (k : ℝ)) + (Fintype.card_eq_nat_card (α := F.lower 0)) + +/-- The natural-argument calculation at the heart of Herbrand's theorem. +For a maximal representative of depth `n + 1`, the normalized fibre +average minus one is the Herbrand function of `H` at `n`. + +The proof uses the maximal-representative fibre-sum identity and exactly the +integral Herbrand sum formula. -/ +theorem quotientFiberAverage_sub_one_eq_herbrandValueNat_of_depth_eq_succ + [Fintype G] {q : G ⧸ H} (hq : q ≠ 1) {σ : G} + (hσq : QuotientGroup.mk' H σ = q) + (hmax : ∀ γ : G, QuotientGroup.mk' H γ = q → + D.depth γ ≤ D.depth σ) + (n : ℕ) (hdepth : D.depth σ = WithTop.some (n + 1)) : + D.quotientFiberAverage H hq - 1 = + (herbrandValueNat (D.depthLowerFiltration H)) n := by + classical + let F := D.depthLowerFiltration H + let f : WithTop ℕ → ℝ := fun d => + (WithTop.untopD (α := ℕ) 0 d : ℝ) + have hsum0 := D.sum_depth_quotientFiber_eq_sum_min_of_maximal_representative + H f (σ := σ) (by + intro γ hγ + exact hmax γ (hγ.trans hσq)) + rw [hσq] at hsum0 + have hsumLeft : + (∑ γ : QuotientFiber H q, f (D.depth (γ : G))) = + ∑ γ : QuotientFiber H q, + (D.quotientFiberDepth H hq γ : ℝ) := by + apply Finset.sum_congr rfl + intro γ _ + dsimp [f] + rw [← D.coe_quotientFiberDepth H hq γ] + exact_mod_cast WithTop.untopD_coe 0 (D.quotientFiberDepth H hq γ) + have hsum : + (∑ γ : QuotientFiber H q, + (D.quotientFiberDepth H hq γ : ℝ)) = + ∑ τ : H, + (WithTop.untopD (α := ℕ) 0 + (min (D.depth (τ : G)) (WithTop.some (n + 1))) : ℝ) := by + rw [← hsumLeft, hsum0] + apply Finset.sum_congr rfl + intro τ _ + simp only [f, hdepth] + have hdecomp := D.sum_min_depth_eq_card_add_truncated H n + rw [← hsum] at hdecomp + rw [quotientFiberAverage, hdecomp] + rw [show + (herbrandValueNat + (D.depthLowerFiltration H)) n = + (∑ τ : (D.depthLowerFiltration H).lower 0, + ((truncatedLowerDepth (D.depthLowerFiltration H)) n τ : ℝ)) / + D.depthRamificationIndex H by + simpa [depthRamificationIndex] using + herbrandValueNat_eq_depth_sum (D.depthLowerFiltration H) n] + have he : (D.depthRamificationIndex H : ℝ) ≠ 0 := by + exact_mod_cast + (show 0 < Nat.card ((D.depthLowerFiltration H).lower 0) from + Finite.card_pos).ne' + field_simp + ring + +/-- The missing `m = 0` endpoint of the fibre calculation. If a maximal +representative has depth zero, every element of its fibre has depth zero, +so the actual normalized average is zero. -/ +theorem quotientFiberAverage_eq_zero_of_maximal_depth_zero + [Fintype G] {q : G ⧸ H} (hq : q ≠ 1) {σ : G} + (hmax : ∀ γ : G, QuotientGroup.mk' H γ = q → + D.depth γ ≤ D.depth σ) + (hdepth : D.depth σ = WithTop.some 0) : + D.quotientFiberAverage H hq = 0 := by + classical + have hzero : ∀ γ : QuotientFiber H q, + D.quotientFiberDepth H hq γ = 0 := by + intro γ + have hle : D.depth (γ : G) ≤ WithTop.some 0 := by + rw [← hdepth] + exact hmax γ γ.property + have hdepthγ : D.depth (γ : G) = WithTop.some 0 := + le_antisymm hle (bot_le : WithTop.some 0 ≤ D.depth (γ : G)) + apply WithTop.coe_injective + calc + WithTop.some (D.quotientFiberDepth H hq γ) = D.depth (γ : G) := + D.coe_quotientFiberDepth H hq γ + _ = WithTop.some 0 := hdepthγ + simp [quotientFiberAverage, hzero] + +/-- The fibre-average identity in the exact form used in the Herbrand quotient theorem. +The finite natural depth of the chosen maximal representative is used in the +real argument `m - 1`, including the endpoint `m = 0`. -/ +theorem quotientFiberAverage_sub_one_eq_herbrandFunction_of_maximal + [Fintype G] {q : G ⧸ H} (hq : q ≠ 1) {σ : G} + (hσq : QuotientGroup.mk' H σ = q) + (hmax : ∀ γ : G, QuotientGroup.mk' H γ = q → + D.depth γ ≤ D.depth σ) : + D.quotientFiberAverage H hq - 1 = + (herbrandFunction (D.depthLowerFiltration H)) + ((D.quotientFiberDepth H hq ⟨σ, hσq⟩ : ℝ) - 1) := by + by_cases hm : D.quotientFiberDepth H hq ⟨σ, hσq⟩ = 0 + · have hdepth : D.depth σ = WithTop.some 0 := by + calc + D.depth σ = WithTop.some (D.quotientFiberDepth H hq ⟨σ, hσq⟩) := + (D.coe_quotientFiberDepth H hq ⟨σ, hσq⟩).symm + _ = WithTop.some 0 := congrArg WithTop.some hm + have havg := D.quotientFiberAverage_eq_zero_of_maximal_depth_zero + H hq hmax hdepth + rw [havg, hm] + norm_num + · obtain ⟨n, hn⟩ := Nat.exists_eq_succ_of_ne_zero hm + have hdepth : D.depth σ = WithTop.some (n + 1) := by + calc + D.depth σ = WithTop.some (D.quotientFiberDepth H hq ⟨σ, hσq⟩) := + (D.coe_quotientFiberDepth H hq ⟨σ, hσq⟩).symm + _ = WithTop.some n.succ := congrArg WithTop.some hn + _ = WithTop.some (n + 1) := by rw [Nat.succ_eq_add_one] + have hnat := + D.quotientFiberAverage_sub_one_eq_herbrandValueNat_of_depth_eq_succ + H hq hσq hmax n hdepth + rw [hn] + norm_num + exact hnat + +/-- Natural-threshold form of the last equivalence in the proof of +Herbrand's theorem. The normalized average is at least `η_H(s) + 1` +exactly when its quotient fibre contains an element of depth at least +`s + 1`. -/ +theorem quotientFiberAverage_ge_herbrandFunction_add_one_iff_exists + [Fintype G] {q : G ⧸ H} (hq : q ≠ 1) {σ : G} + (hσq : QuotientGroup.mk' H σ = q) + (hmax : ∀ γ : G, QuotientGroup.mk' H γ = q → + D.depth γ ≤ D.depth σ) + (s : ℕ) : + D.quotientFiberAverage H hq ≥ + (herbrandFunction (D.depthLowerFiltration H)) s + 1 ↔ + ∃ γ : QuotientFiber H q, + WithTop.some (s + 1) ≤ D.depth (γ : G) := by + let F := D.depthLowerFiltration H + let m := D.quotientFiberDepth H hq ⟨σ, hσq⟩ + have hdepth : D.depth σ = WithTop.some m := + (D.coe_quotientFiberDepth H hq ⟨σ, hσq⟩).symm + have havg := D.quotientFiberAverage_sub_one_eq_herbrandFunction_of_maximal + H hq hσq hmax + have hfiber : + (∃ γ : QuotientFiber H q, + WithTop.some (s + 1) ≤ D.depth (γ : G)) ↔ + WithTop.some (s + 1) ≤ D.depth σ := by + constructor + · rintro ⟨γ, hγ⟩ + exact hγ.trans (hmax γ γ.property) + · intro hσ + exact ⟨⟨σ, hσq⟩, hσ⟩ + have hrealNat : + (s : ℝ) ≤ (m : ℝ) - 1 ↔ s + 1 ≤ m := by + constructor + · intro h + have h' : (s + 1 : ℕ) ≤ (m : ℝ) := by + push_cast + linarith + exact_mod_cast h' + · intro h + have h' : (s + 1 : ℝ) ≤ m := by exact_mod_cast h + linarith + have hwithTopNat : + WithTop.some (s + 1) ≤ D.depth σ ↔ s + 1 ≤ m := by + rw [hdepth] + exact WithTop.coe_le_coe + rw [hfiber, hwithTopNat, ← hrealNat] + change D.quotientFiberAverage H hq ≥ + (herbrandFunction + F) s + 1 ↔ _ + rw [show D.quotientFiberAverage H hq ≥ + (herbrandFunction + F) s + 1 ↔ + (herbrandFunction F) s ≤ D.quotientFiberAverage H hq - 1 by + constructor <;> intro h <;> linarith] + rw [havg] + exact + (herbrandFunction_strictMono F).le_iff_le + +/-- Every nontrivial quotient fibre admits a maximal representative for +which the Herbrand fibre-average identity holds. -/ +theorem exists_maximal_representative_quotientFiberAverage [Fintype G] + {q : G ⧸ H} (hq : q ≠ 1) : + ∃ σ : G, ∃ hσq : QuotientGroup.mk' H σ = q, + (∀ γ : G, QuotientGroup.mk' H γ = q → + D.depth γ ≤ D.depth σ) ∧ + D.quotientFiberAverage H hq - 1 = + (herbrandFunction (D.depthLowerFiltration H)) + ((D.quotientFiberDepth H hq ⟨σ, hσq⟩ : ℝ) - 1) := by + obtain ⟨σ, hσq, hmax⟩ := D.exists_maximal_depth_representative H hq + refine ⟨σ, hσq, hmax, ?_⟩ + exact D.quotientFiberAverage_sub_one_eq_herbrandFunction_of_maximal + H hq hσq hmax + +end NonarchimedeanDepth +end HerbrandGroupTheory +end RamificationTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/FixedField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/FixedField.lean new file mode 100644 index 0000000000..717e6bab41 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/FixedField.lean @@ -0,0 +1,191 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Quotient +public import Mathlib.FieldTheory.Galois.Basic +/-! +# Fixed-field group models for Herbrand towers +-/ + +@[expose] public section + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + card_lower_transportEquiv → + card_lower_transportEquiv + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + card_subgroupFiltration_mul_card_quotientImageTransport → + card_subgroupFiltration_mul_card_quotientImageTransport + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction → + herbrandFunction + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction_transportEquiv → + herbrandFunction_transportEquiv + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + inverseHerbrandFunction → + inverseHerbrandFunction + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + inverseHerbrandFunction_transportEquiv → + inverseHerbrandFunction_transportEquiv + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + quotientImageFiltration → + quotientImageFiltration + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + quotientImageTransport → + quotientImageTransport + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + quotientImageTransport_herbrandFunction → + quotientImageTransport_herbrandFunction + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + quotientImageTransport_inverseHerbrandFunction → + quotientImageTransport_inverseHerbrandFunction + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + subgroupFiltration → + subgroupFiltration + + +noncomputable +section + +universe u w + +namespace RamificationTheory.HilbertRamification +namespace Higher + +open RamificationTheory.DiscreteValuationField +open RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] +variable [FiniteDimensional K L] [IsGalois K L] + +/-- The ambient subgroup filtration transported to the actual Galois group +of `L / L^H`. -/ +def fixedFieldSubextensionFiltration + (F : AntitoneNormalSubgroupFiltration Gal(L/K)) + (H : Subgroup Gal(L/K)) : + AntitoneNormalSubgroupFiltration Gal(L/IntermediateField.fixedField H) := + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.transportEquiv + (subgroupFiltration F H) + (IntermediateField.subgroupEquivAlgEquiv H) + +omit [IsGalois K L] in +/-- States the theorem `fixedFieldSubextensionFiltration_lower`. -/ +@[simp] theorem fixedFieldSubextensionFiltration_lower + (F : AntitoneNormalSubgroupFiltration Gal(L/K)) + (H : Subgroup Gal(L/K)) (n : ℕ) : + (fixedFieldSubextensionFiltration F H).lower n = + ((F.lower n).comap H.subtype).comap + (IntermediateField.subgroupEquivAlgEquiv H).symm.toMonoidHom := + rfl + +/-- The quotient-image filtration transported to the actual Galois group +of `L^H / K`. -/ +def fixedFieldQuotientImageFiltration + (F : AntitoneNormalSubgroupFiltration Gal(L/K)) + (H : Subgroup Gal(L/K)) [H.Normal] : + AntitoneNormalSubgroupFiltration Gal(IntermediateField.fixedField H/K) := + (quotientImageTransport F H) (IsGalois.normalAutEquivQuotient H) + +/-- States the theorem `fixedFieldQuotientImageFiltration_lower`. -/ +@[simp] theorem fixedFieldQuotientImageFiltration_lower + (F : AntitoneNormalSubgroupFiltration Gal(L/K)) + (H : Subgroup Gal(L/K)) [H.Normal] (n : ℕ) : + (fixedFieldQuotientImageFiltration F H).lower n = + ((F.lower n).map (QuotientGroup.mk' H)).comap + (IsGalois.normalAutEquivQuotient H).symm.toMonoidHom := + rfl + +/-- Exact cardinality factorization in the two actual fixed-field Galois +group models. -/ +theorem card_fixedFieldSubextension_mul_card_fixedFieldQuotientImage + [Finite Gal(L/K)] + (F : AntitoneNormalSubgroupFiltration Gal(L/K)) + (H : Subgroup Gal(L/K)) [H.Normal] (n : ℕ) : + Nat.card ((fixedFieldSubextensionFiltration F H).lower n) * + Nat.card ((fixedFieldQuotientImageFiltration F H).lower n) = + Nat.card (F.lower n) := by + change Nat.card + ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.transportEquiv + (subgroupFiltration F H) + (IntermediateField.subgroupEquivAlgEquiv H)).lower n) * + Nat.card + (((quotientImageTransport F H) + (IsGalois.normalAutEquivQuotient H)).lower n) = _ + rw [card_lower_transportEquiv (subgroupFiltration F H) + (IntermediateField.subgroupEquivAlgEquiv H) n] + exact + card_subgroupFiltration_mul_card_quotientImageTransport F H + (IsGalois.normalAutEquivQuotient H) n + +omit [IsGalois K L] in +/-- States the theorem `fixedFieldSubextension_herbrandFunction`. -/ +theorem fixedFieldSubextension_herbrandFunction + (F : AntitoneNormalSubgroupFiltration Gal(L/K)) + (H : Subgroup Gal(L/K)) (s : ℝ) : + (herbrandFunction + (fixedFieldSubextensionFiltration F H)) s = + (herbrandFunction (subgroupFiltration F H)) s := by + let : Fintype H := Fintype.ofFinite H + let : Fintype Gal(L/IntermediateField.fixedField H) := + Fintype.ofFinite Gal(L/IntermediateField.fixedField H) + exact + herbrandFunction_transportEquiv (subgroupFiltration F H) + (IntermediateField.subgroupEquivAlgEquiv H) s + +omit [IsGalois K L] in +/-- States the theorem `fixedFieldSubextension_inverseHerbrandFunction`. -/ +theorem fixedFieldSubextension_inverseHerbrandFunction + (F : AntitoneNormalSubgroupFiltration Gal(L/K)) + (H : Subgroup Gal(L/K)) (t : ℝ) : + (inverseHerbrandFunction (fixedFieldSubextensionFiltration F H)) t = + (inverseHerbrandFunction (subgroupFiltration F H)) t := by + let : Fintype H := Fintype.ofFinite H + let : Fintype Gal(L/IntermediateField.fixedField H) := + Fintype.ofFinite Gal(L/IntermediateField.fixedField H) + exact + inverseHerbrandFunction_transportEquiv (subgroupFiltration F H) + (IntermediateField.subgroupEquivAlgEquiv H) t + +/-- States the theorem `fixedFieldQuotientImage_herbrandFunction`. -/ +theorem fixedFieldQuotientImage_herbrandFunction + (F : AntitoneNormalSubgroupFiltration Gal(L/K)) + (H : Subgroup Gal(L/K)) [H.Normal] (s : ℝ) : + (herbrandFunction + (fixedFieldQuotientImageFiltration F H)) s = + (herbrandFunction (quotientImageFiltration F H)) s := by + let : Fintype Gal(IntermediateField.fixedField H/K) := + Fintype.ofFinite Gal(IntermediateField.fixedField H/K) + exact + quotientImageTransport_herbrandFunction F H + (IsGalois.normalAutEquivQuotient H) s + +/-- States the theorem `fixedFieldQuotientImage_inverseHerbrandFunction`. -/ +theorem fixedFieldQuotientImage_inverseHerbrandFunction + (F : AntitoneNormalSubgroupFiltration Gal(L/K)) + (H : Subgroup Gal(L/K)) [H.Normal] (t : ℝ) : + (inverseHerbrandFunction (fixedFieldQuotientImageFiltration F H)) t = + (inverseHerbrandFunction (quotientImageFiltration F H)) t := by + let : Fintype Gal(IntermediateField.fixedField H/K) := + Fintype.ofFinite Gal(IntermediateField.fixedField H/K) + exact + quotientImageTransport_inverseHerbrandFunction F H + (IsGalois.normalAutEquivQuotient H) t + +end Higher +end RamificationTheory.HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Function.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Function.lean new file mode 100644 index 0000000000..34be5e25b6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Function.lean @@ -0,0 +1,491 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.Ramification +public import Mathlib.Algebra.Order.Floor.Ring +public import Mathlib.Topology.Order.MonotoneContinuity +/-! +# The Herbrand function + +This file supplies the group-theoretic content of +the Herbrand-function sum formula. The old `AntitoneNormalSubgroupFiltration.herbrandStep` starts +with `|G₀| / |G₀|`; the normalized Herbrand function has, on `(m,m+1)`, +slope `|Gₘ₊₁| / |G₀|`. We therefore deliberately use a new, +shifted definition here. + +The definition is made on all of `ℝ`. Below zero it is the identity, so +its restriction to `[-1,∞)` is exactly the normalized function on this range. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace RamificationTheory.DiscreteValuationField +namespace AntitoneNormalSubgroupFiltration + +variable {G : Type u} [Group G] [Finite G] +variable (F : AntitoneNormalSubgroupFiltration G) + +/-- Each subgroup in the finite ambient group has a finite enumeration. -/ +local instance subgroupFintype (H : Subgroup G) : Fintype H := + Fintype.ofFinite H + +/-- Classical decidability of subgroup membership for the Herbrand filtration formulas. -/ +local instance subgroupMembershipDecidable (H : Subgroup G) (x : G) : + Decidable (x ∈ H) := + Classical.propDecidable _ + +/-- The slope of the Herbrand function on `(i,i+1)`. This is the shifted +quantity `|G_(i+1)| / |G_0|`, not the pre-existing `herbrandStep i`. -/ +noncomputable def herbrandSlope (i : ℕ) : ℝ := + (Nat.card (F.lower (i + 1)) : ℝ) / Nat.card (F.lower 0) + +/-- The value of the normalized Herbrand function at a natural number. -/ +noncomputable def herbrandValueNat (n : ℕ) : ℝ := + ∑ i ∈ Finset.range n, (herbrandSlope F) i + +omit [Finite G] in +/-- States the theorem `herbrandValueNat_zero`. -/ +@[simp] theorem herbrandValueNat_zero : (herbrandValueNat F) 0 = 0 := by + simp [herbrandValueNat] + +omit [Finite G] in +/-- States the theorem `herbrandValueNat_succ`. -/ +theorem herbrandValueNat_succ (n : ℕ) : + (herbrandValueNat F) (n + 1) = + (herbrandValueNat F) n + (herbrandSlope F) n := by + simp [herbrandValueNat, Finset.sum_range_succ] + +/-- States the theorem `herbrandSlope_pos`. -/ +theorem herbrandSlope_pos (i : ℕ) : + 0 < (herbrandSlope F) i := by + have hi : 0 < Nat.card (F.lower (i + 1)) := Finite.card_pos + have h0 : 0 < Nat.card (F.lower 0) := Finite.card_pos + exact div_pos (Nat.cast_pos.mpr hi) (Nat.cast_pos.mpr h0) + +/-- States the theorem `herbrandSlope_nonneg`. -/ +theorem herbrandSlope_nonneg (i : ℕ) : + 0 ≤ (herbrandSlope F) i := + ((herbrandSlope_pos F) i).le + +/-- States the theorem `one_div_card_le_herbrandSlope`. -/ +theorem one_div_card_le_herbrandSlope (i : ℕ) : + (1 : ℝ) / Nat.card (F.lower 0) ≤ (herbrandSlope F) i := by + rw [herbrandSlope] + have h0 : (0 : ℝ) < Nat.card (F.lower 0) := by + exact_mod_cast (show 0 < Nat.card (F.lower 0) from Finite.card_pos) + apply (div_le_div_iff_of_pos_right h0).2 + exact_mod_cast (show 0 < Nat.card (F.lower (i + 1)) from Finite.card_pos) + +/-- States the theorem `herbrandValueNat_nonneg`. -/ +theorem herbrandValueNat_nonneg (n : ℕ) : + 0 ≤ (herbrandValueNat F) n := by + exact Finset.sum_nonneg fun i _ => (herbrandSlope_nonneg F) i + +/-- States the theorem `nat_div_card_le_herbrandValueNat`. -/ +theorem nat_div_card_le_herbrandValueNat (n : ℕ) : + (n : ℝ) / Nat.card (F.lower 0) ≤ (herbrandValueNat F) n := by + rw [herbrandValueNat] + calc + (n : ℝ) / Nat.card (F.lower 0) = + ∑ _i ∈ Finset.range n, (1 : ℝ) / Nat.card (F.lower 0) := by + simp [div_eq_mul_inv] + _ ≤ ∑ i ∈ Finset.range n, (herbrandSlope F) i := by + exact Finset.sum_le_sum fun i _ => (one_div_card_le_herbrandSlope F) i + +/-- States the theorem `herbrandValueNat_strictMono`. -/ +theorem herbrandValueNat_strictMono : StrictMono (herbrandValueNat F) := by + apply strictMono_nat_of_lt_succ + intro n + rw [(herbrandValueNat_succ F)] + exact lt_add_of_pos_right _ ((herbrandSlope_pos F) n) + +/-- The Herbrand-function sum formula, in its explicit piecewise-linear form. -/ +noncomputable def herbrandFunction (s : ℝ) : ℝ := + if 0 ≤ s then + let m := ⌊s⌋₊ + (herbrandValueNat F) m + + (s - (m : ℝ)) * (herbrandSlope F) m + else + s + +omit [Finite G] in +/-- The Herbrand function depends only on the cardinalities of the lower +groups. This comparison lemma is useful when a Galois group is replaced by +an isomorphic subgroup or quotient model. -/ +theorem herbrandFunction_eq_of_card_lower_eq + {G' : Type*} [Group G'] + (F' : AntitoneNormalSubgroupFiltration G') + (hcard : ∀ n : ℕ, Nat.card (F.lower n) = Nat.card (F'.lower n)) + (s : ℝ) : + (herbrandFunction F) s = (herbrandFunction F') s := by + have hslope : ∀ n : ℕ, + (herbrandSlope F) n = (herbrandSlope F') n := by + intro n + simp only [herbrandSlope, hcard] + have hnat : ∀ n : ℕ, + (herbrandValueNat F) n = (herbrandValueNat F') n := by + intro n + simp only [herbrandValueNat, hslope] + by_cases hs : 0 ≤ s + · simp only [herbrandFunction, hs, ↓reduceIte, hnat, hslope] + · simp only [herbrandFunction, hs, ↓reduceIte] + +omit [Finite G] in +/-- States the theorem `herbrandFunction_of_nonpos`. -/ +theorem herbrandFunction_of_nonpos {s : ℝ} (hs : s ≤ 0) : + (herbrandFunction F) s = s := by + rcases hs.eq_or_lt with rfl | hs + · simp [herbrandFunction] + · have hns : ¬ 0 ≤ s := not_le.mpr hs + simp [herbrandFunction, hns] + +omit [Finite G] in +/-- States the theorem `herbrandFunction_zero`. -/ +@[simp] theorem herbrandFunction_zero : (herbrandFunction F) 0 = 0 := by + simp [herbrandFunction] + +omit [Finite G] in +/-- States the theorem `herbrandFunction_neg_one`. -/ +@[simp] theorem herbrandFunction_neg_one : (herbrandFunction F) (-1) = -1 := by + exact (herbrandFunction_of_nonpos F) (by norm_num) + +omit [Finite G] in +/-- States the theorem `herbrandFunction_of_floor`. -/ +theorem herbrandFunction_of_floor {s : ℝ} (hs : 0 ≤ s) (m : ℕ) + (hm : ⌊s⌋₊ = m) : + (herbrandFunction F) s = (herbrandValueNat F) m + + (s - (m : ℝ)) * (herbrandSlope F) m := by + simp [herbrandFunction, hs, hm] + +omit [Finite G] in +/-- States the theorem `herbrandFunction_nat`. -/ +@[simp] theorem herbrandFunction_nat (n : ℕ) : + (herbrandFunction F) (n : ℝ) = (herbrandValueNat F) n := by + simp [herbrandFunction] + +/-- The first Herbrand value is the ratio of the first two lower-group orders. -/ +theorem herbrandFunction_one_eq : + (herbrandFunction F) 1 = + (Nat.card (F.lower 1) : ℝ) / Nat.card (F.lower 0) := by + rw [show (1 : ℝ) = ((1 : ℕ) : ℝ) by norm_num, + herbrandFunction_nat, show (1 : ℕ) = 0 + 1 by omega, + herbrandValueNat_succ] + simp [herbrandValueNat_zero, herbrandSlope] + +/-- The first Herbrand value lies strictly above zero and at most one. -/ +theorem herbrandFunction_one_pos_le_one : + 0 < (herbrandFunction F) 1 ∧ (herbrandFunction F) 1 ≤ 1 := by + have hden : (0 : ℝ) < Nat.card (F.lower 0) := by + exact_mod_cast (show 0 < Nat.card (F.lower 0) from Finite.card_pos) + have hnum : (0 : ℝ) < Nat.card (F.lower 1) := by + exact_mod_cast (show 0 < Nat.card (F.lower 1) from Finite.card_pos) + have hsub : F.lower 1 ≤ F.lower 0 := F.antitone (by omega) + let incl : F.lower 1 → F.lower 0 := fun x => ⟨x.1, hsub x.2⟩ + have hincl : Function.Injective incl := by + intro x y h + have hval : (x : G) = (y : G) := + congrArg (fun z : F.lower 0 => (z : G)) h + exact Subtype.ext hval + have hcard : Nat.card (F.lower 1) ≤ Nat.card (F.lower 0) := + Nat.card_le_card_of_injective incl hincl + rw [herbrandFunction_one_eq] + constructor + · exact div_pos hnum hden + · apply (div_le_iff₀ hden).2 + simpa using (Nat.cast_le.mpr hcard : + (Nat.card (F.lower 1) : ℝ) ≤ Nat.card (F.lower 0)) + +omit [Finite G] in +/-- The defining affine formula on a half-open unit interval. -/ +theorem herbrandFunction_eq_on_Ico (m : ℕ) {s : ℝ} + (hms : (m : ℝ) ≤ s) (hsm : s < m + 1) : + (herbrandFunction F) s = (herbrandValueNat F) m + + (s - (m : ℝ)) * (herbrandSlope F) m := by + apply (herbrandFunction_of_floor F) (le_trans (Nat.cast_nonneg m) hms) m + exact (Nat.floor_eq_iff (le_trans (Nat.cast_nonneg m) hms)).2 ⟨hms, by simpa using hsm⟩ + +omit [Finite G] in +/-- The closed-interval form. At the right endpoint the +two adjacent affine expressions agree. -/ +theorem herbrandFunction_eq_on_Icc (m : ℕ) {s : ℝ} + (hms : (m : ℝ) ≤ s) (hsm : s ≤ m + 1) : + (herbrandFunction F) s = (herbrandValueNat F) m + + (s - (m : ℝ)) * (herbrandSlope F) m := by + rcases hsm.eq_or_lt with hsm | hsm + · subst s + rw [show (m : ℝ) + 1 = ((m + 1 : ℕ) : ℝ) by norm_num, + (herbrandFunction_nat F), (herbrandValueNat_succ F)] + norm_num + · exact (herbrandFunction_eq_on_Ico F) m hms hsm + +/-- The displayed formula immediately preceding the Herbrand-function sum formula. -/ +theorem herbrandFunction_eq_card_sum_of_mem_Icc (m : ℕ) {s : ℝ} + (hms : (m : ℝ) ≤ s) (hsm : s ≤ m + 1) : + (herbrandFunction F) s = + ((∑ i ∈ Finset.range m, (Nat.card (F.lower (i + 1)) : ℝ)) + + (s - m) * Nat.card (F.lower (m + 1))) / + Nat.card (F.lower 0) := by + rw [(herbrandFunction_eq_on_Icc F) m hms hsm] + simp_rw [herbrandValueNat, herbrandSlope, div_eq_mul_inv] + rw [← Finset.sum_mul] + have h0 : (Nat.card (F.lower 0) : ℝ) ≠ 0 := by + exact_mod_cast + (ne_of_gt (show 0 < Nat.card (F.lower 0) from Finite.card_pos)) + field_simp + +/-- States the theorem `herbrandFunction_nonneg`. -/ +theorem herbrandFunction_nonneg {s : ℝ} (hs : 0 ≤ s) : + 0 ≤ (herbrandFunction F) s := by + rw [(herbrandFunction_of_floor F) hs ⌊s⌋₊ rfl] + exact add_nonneg ((herbrandValueNat_nonneg F) ⌊s⌋₊) + (mul_nonneg (sub_nonneg.mpr (Nat.floor_le hs)) + ((herbrandSlope_nonneg F) ⌊s⌋₊)) + +/-- The Herbrand function is strictly increasing, as asserted after +the Herbrand quotient theorem. -/ +theorem herbrandFunction_strictMono : StrictMono (herbrandFunction F) := by + intro s t hst + by_cases ht : t ≤ 0 + · rw [(herbrandFunction_of_nonpos F) (le_trans hst.le ht), + (herbrandFunction_of_nonpos F) ht] + exact hst + by_cases hs : s < 0 + · rw [(herbrandFunction_of_nonpos F) hs.le] + exact lt_of_lt_of_le hs ((herbrandFunction_nonneg F) (le_of_not_ge ht)) + have hs0 : 0 ≤ s := le_of_not_gt hs + have ht0 : 0 ≤ t := hs0.trans hst.le + let m := ⌊s⌋₊ + let n := ⌊t⌋₊ + have hmle : (m : ℝ) ≤ s := Nat.floor_le hs0 + have hmlt : s < m + 1 := by + exact (Nat.floor_eq_iff hs0).1 rfl |>.2 + have hnle : (n : ℝ) ≤ t := Nat.floor_le ht0 + have hnlt : t < n + 1 := by + exact (Nat.floor_eq_iff ht0).1 rfl |>.2 + have hmn : m ≤ n := Nat.floor_mono hst.le + rw [(herbrandFunction_eq_on_Ico F) m hmle hmlt, + (herbrandFunction_eq_on_Ico F) n hnle hnlt] + rcases hmn.eq_or_lt with hmn | hmn + · rw [← hmn] + nlinarith [(herbrandSlope_pos F) m] + · have hs_upper : + (herbrandValueNat F) m + (s - m) * (herbrandSlope F) m < + (herbrandValueNat F) (m + 1) := by + rw [(herbrandValueNat_succ F)] + nlinarith [(herbrandSlope_pos F) m] + have hnat : (herbrandValueNat F) (m + 1) ≤ (herbrandValueNat F) n := by + exact (herbrandValueNat_strictMono F).monotone (by omega) + have ht_lower : (herbrandValueNat F) n ≤ + (herbrandValueNat F) n + (t - n) * (herbrandSlope F) n := by + exact le_add_of_nonneg_right + (mul_nonneg (by exact sub_nonneg.mpr hnle) + ((herbrandSlope_nonneg F) n)) + exact hs_upper.trans_le (hnat.trans ht_lower) + +/-- States the theorem `herbrandFunction_surjective`. -/ +theorem herbrandFunction_surjective : Function.Surjective (herbrandFunction F) := by + intro y + by_cases hy : y ≤ 0 + · exact ⟨y, (herbrandFunction_of_nonpos F) hy⟩ + have hy0 : 0 < y := lt_of_not_ge hy + let d : ℝ := Nat.card (F.lower 0) + have hd : 0 < d := by + dsimp [d] + exact_mod_cast (show 0 < Nat.card (F.lower 0) from Finite.card_pos) + obtain ⟨N, hN⟩ := exists_nat_gt (y * d) + have hyN : y ≤ (herbrandValueNat F) N := by + apply le_trans ?_ ((nat_div_card_le_herbrandValueNat F) N) + change y ≤ (N : ℝ) / d + exact (le_div_iff₀ hd).2 hN.le + let hex : ∃ n : ℕ, y ≤ (herbrandValueNat F) n := ⟨N, hyN⟩ + let n := Nat.find hex + have hn_upper : y ≤ (herbrandValueNat F) n := Nat.find_spec hex + have hn_pos : 0 < n := by + by_contra hn + have hn0 : n = 0 := Nat.eq_zero_of_not_pos hn + rw [hn0, (herbrandValueNat_zero F)] at hn_upper + exact hy hn_upper + let m := n - 1 + have hn_eq : n = m + 1 := by + dsimp [m] + omega + have hm_lt_n : m < n := by omega + have hm_lower : (herbrandValueNat F) m < y := by + exact lt_of_not_ge (Nat.find_min hex hm_lt_n) + let x : ℝ := m + + (y - (herbrandValueNat F) m) / (herbrandSlope F) m + have hx_lower : (m : ℝ) ≤ x := by + dsimp [x] + exact le_add_of_nonneg_right + (div_nonneg (sub_nonneg.mpr hm_lower.le) ((herbrandSlope_nonneg F) m)) + have hx_upper : x ≤ m + 1 := by + have hyadd : y ≤ + (herbrandValueNat F) m + (herbrandSlope F) m := by + rw [← (herbrandValueNat_succ F), ← hn_eq] + exact hn_upper + have hfrac : + (y - (herbrandValueNat F) m) / (herbrandSlope F) m ≤ 1 := + (div_le_one ((herbrandSlope_pos F) m)).2 (by linarith) + dsimp [x] + linarith + refine ⟨x, ?_⟩ + rw [(herbrandFunction_eq_on_Icc F) m hx_lower hx_upper] + dsimp [x] + field_simp [((herbrandSlope_pos F) m).ne'] + ring + +/-- Continuity of the piecewise-linear Herbrand function. -/ +theorem continuous_herbrandFunction : Continuous (herbrandFunction F) := + (herbrandFunction_strictMono F).monotone.continuous_of_surjective + (herbrandFunction_surjective F) + +/-- The inverse Herbrand function `ψ`. -/ +noncomputable def inverseHerbrandFunction (t : ℝ) : ℝ := + Function.invFun (herbrandFunction F) t + +/-- States the theorem `herbrandFunction_inverseHerbrandFunction`. -/ +@[simp] theorem herbrandFunction_inverseHerbrandFunction (t : ℝ) : + (herbrandFunction F) ((inverseHerbrandFunction F) t) = t := + Function.rightInverse_invFun (herbrandFunction_surjective F) t + +/-- States the theorem `inverseHerbrandFunction_herbrandFunction`. -/ +@[simp] theorem inverseHerbrandFunction_herbrandFunction (s : ℝ) : + (inverseHerbrandFunction F) ((herbrandFunction F) s) = s := + Function.leftInverse_invFun (herbrandFunction_strictMono F).injective s + +/-- States the theorem `inverseHerbrandFunction_strictMono`. -/ +theorem inverseHerbrandFunction_strictMono : StrictMono (inverseHerbrandFunction F) := by + intro s t hst + apply (herbrandFunction_strictMono F).lt_iff_lt.mp + simpa using hst + +/-- States the theorem `inverseHerbrandFunction_surjective`. -/ +theorem inverseHerbrandFunction_surjective : Function.Surjective (inverseHerbrandFunction F) := by + intro s + exact ⟨(herbrandFunction F) s, (inverseHerbrandFunction_herbrandFunction F) s⟩ + +/-- States the theorem `continuous_inverseHerbrandFunction`. -/ +theorem continuous_inverseHerbrandFunction : Continuous (inverseHerbrandFunction F) := + (inverseHerbrandFunction_strictMono F).monotone.continuous_of_surjective + (inverseHerbrandFunction_surjective F) + +/-- The mutually inverse Herbrand functions as an order isomorphism of the +real line. Its canonical form uses the restriction to `[-1,∞)`. -/ +noncomputable def herbrandOrderIso : ℝ ≃o ℝ where + toFun := (herbrandFunction F) + invFun := (inverseHerbrandFunction F) + left_inv := (inverseHerbrandFunction_herbrandFunction F) + right_inv := (herbrandFunction_inverseHerbrandFunction F) + map_rel_iff' := (herbrandFunction_strictMono F).le_iff_le + +/-- States the theorem `herbrandFunction_mem_Ici_neg_one_iff`. -/ +theorem herbrandFunction_mem_Ici_neg_one_iff {s : ℝ} : + (herbrandFunction F) s ∈ Set.Ici (-1) ↔ s ∈ Set.Ici (-1) := by + change -1 ≤ (herbrandFunction F) s ↔ -1 ≤ s + simpa only [(herbrandFunction_neg_one F)] using + ((herbrandFunction_strictMono F).le_iff_le : + (herbrandFunction F) (-1) ≤ (herbrandFunction F) s ↔ (-1 : ℝ) ≤ s) + +/-- States the theorem `inverseHerbrandFunction_mem_Ici_neg_one_iff`. -/ +theorem inverseHerbrandFunction_mem_Ici_neg_one_iff {t : ℝ} : + (inverseHerbrandFunction F) t ∈ Set.Ici (-1) ↔ t ∈ Set.Ici (-1) := by + change -1 ≤ (inverseHerbrandFunction F) t ↔ -1 ≤ t + have hψ : (inverseHerbrandFunction F) (-1) = -1 := by + simpa only [(herbrandFunction_neg_one F)] using + (inverseHerbrandFunction_herbrandFunction F) (-1) + simpa only [hψ] using + ((inverseHerbrandFunction_strictMono F).le_iff_le : + (inverseHerbrandFunction F) (-1) ≤ (inverseHerbrandFunction F) t ↔ (-1 : ℝ) ≤ t) + +/-- The number of positive lower-numbered levels, truncated at `n`, through +which an inertia element survives. For a classical depth `i(σ)`, this is +`min (i(σ) - 1) n`. -/ +noncomputable def truncatedLowerDepth (n : ℕ) (σ : F.lower 0) : ℕ := by + classical + exact ((Finset.range n).filter fun i => (σ : G) ∈ F.lower (i + 1)).card + +/-- States the theorem `card_lower_succ_eq_sum_indicator`. -/ +theorem card_lower_succ_eq_sum_indicator (i : ℕ) : + Nat.card (F.lower (i + 1)) = + ∑ σ : F.lower 0, if (σ : G) ∈ F.lower (i + 1) then 1 else 0 := by + classical + let ι : F.lower (i + 1) → F.lower 0 := fun σ => + ⟨(σ : G), F.antitone (Nat.zero_le (i + 1)) σ.property⟩ + have hι : Function.Injective ι := by + intro σ τ h + exact Subtype.ext (congrArg (fun x : F.lower 0 => (x : G)) h) + rw [Nat.card_eq_fintype_card] + change Finset.univ.card = + ∑ σ : F.lower 0, if (σ : G) ∈ F.lower (i + 1) then 1 else 0 + rw [← Finset.card_image_of_injective Finset.univ hι] + rw [show (∑ σ : F.lower 0, + if (σ : G) ∈ F.lower (i + 1) then 1 else 0) = + (Finset.univ.filter fun σ : F.lower 0 => + (σ : G) ∈ F.lower (i + 1)).card by simp] + congr 1 + ext σ + simp only [Finset.mem_image, Finset.mem_univ, true_and, Finset.mem_filter] + constructor + · rintro ⟨τ, hτ⟩ + have hcoe : (τ : G) = (σ : G) := + congrArg (fun z : F.lower 0 => (z : G)) hτ + rw [← hcoe] + exact τ.property + · intro hσ + refine ⟨⟨(σ : G), hσ⟩, ?_⟩ + exact Subtype.ext rfl + +/-- The Herbrand-function sum formula at an integral argument, in the intrinsic depth form. +It is the defining identity +`g₀⁻¹ ∑σ (min {i(σ), n+1} - 1)` with the truncated depth +expressed directly by membership in the lower groups. -/ +theorem herbrandValueNat_eq_depth_sum (n : ℕ) : + (herbrandValueNat F) n = + (∑ σ : F.lower 0, ((truncatedLowerDepth F) n σ : ℝ)) / + Nat.card (F.lower 0) := by + classical + rw [herbrandValueNat] + simp_rw [herbrandSlope, div_eq_mul_inv] + rw [← Finset.sum_mul] + congr 1 + simp_rw [(card_lower_succ_eq_sum_indicator F)] + push_cast + rw [Finset.sum_comm] + apply Finset.sum_congr rfl + intro σ _ + rw [show (truncatedLowerDepth F) n σ = + ∑ i ∈ Finset.range n, if (σ : G) ∈ F.lower (i + 1) then 1 else 0 by + simp [truncatedLowerDepth]] + push_cast + rfl + +/-- The Herbrand-function sum formula for a general real argument in `[m,m+1]`. The first +sum is the intrinsic version of `∑σ (min {i(σ),m+1}-1)`; the last +term records the elements surviving in `G_(m+1)` for the fractional part. -/ +theorem herbrandFunction_eq_depth_sum_of_mem_Icc (m : ℕ) {s : ℝ} + (hms : (m : ℝ) ≤ s) (hsm : s ≤ m + 1) : + (herbrandFunction F) s = + ((∑ σ : F.lower 0, ((truncatedLowerDepth F) m σ : ℝ)) + + (s - m) * Nat.card (F.lower (m + 1))) / + Nat.card (F.lower 0) := by + rw [(herbrandFunction_eq_on_Icc F) m hms hsm, + (herbrandValueNat_eq_depth_sum F)] + rw [herbrandSlope] + have h0 : (Nat.card (F.lower 0) : ℝ) ≠ 0 := by + exact_mod_cast + (ne_of_gt (show 0 < Nat.card (F.lower 0) from Finite.card_pos)) + field_simp + +end AntitoneNormalSubgroupFiltration +end RamificationTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean new file mode 100644 index 0000000000..7761da6706 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean @@ -0,0 +1,346 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Function +public import Mathlib.GroupTheory.Index +/-! +# Pure group theory for Herbrand towers + +This file contains the completion-free finite-group bookkeeping used in +the Herbrand quotient theorem and the quotient and tower filtration theorems. It packages +the filtrations induced on a subgroup and on its quotient image, proves the +exact cardinality factorization at every level, and records compatibility of +Herbrand functions with transport along group equivalences. + +The valued-field inputs of the quotient-depth and upper-numbering identities do not occur here. +Valued-field endpoints combine these structural lemmas with ramification-number +averaging; the inverse-function and upper-numbering statements are proved directly +in the Hilbert-ramification Herbrand theorem module. +-/ + +@[expose] public section + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction → + herbrandFunction + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction_eq_of_card_lower_eq → + herbrandFunction_eq_of_card_lower_eq + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction_inverseHerbrandFunction → + herbrandFunction_inverseHerbrandFunction + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction_strictMono → + herbrandFunction_strictMono + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + inverseHerbrandFunction → + inverseHerbrandFunction + + +noncomputable +section + +universe u v + +namespace RamificationTheory.DiscreteValuationField +namespace AntitoneNormalSubgroupFiltration + +variable {G : Type u} [Group G] + +/-- The filtration induced on a subgroup by intersection with every ambient +lower group. -/ +def subgroupFiltration (F : AntitoneNormalSubgroupFiltration G) (H : Subgroup G) : + AntitoneNormalSubgroupFiltration H where + lower n := (F.lower n).comap H.subtype + lower_normal n := (F.lower_normal n).comap H.subtype + antitone := by + intro m n hmn + exact Subgroup.comap_mono (F.antitone hmn) + +/-- States the theorem `subgroupFiltration_lower`. -/ +@[simp] theorem subgroupFiltration_lower + (F : AntitoneNormalSubgroupFiltration G) (H : Subgroup G) (n : ℕ) : + (subgroupFiltration F H).lower n = (F.lower n).comap H.subtype := + rfl + +/-- States the theorem `mem_subgroupFiltration_lower_iff`. -/ +theorem mem_subgroupFiltration_lower_iff + (F : AntitoneNormalSubgroupFiltration G) (H : Subgroup G) + (n : ℕ) (h : H) : + h ∈ (subgroupFiltration F H).lower n ↔ (h : G) ∈ F.lower n := + Iff.rfl + +/-- The pointwise image filtration on a quotient by a normal subgroup. This +is not asserted to be the actual lower filtration of a valued quotient; that +identification is precisely the content supplied by Herbrand's theorem. -/ +def quotientImageFiltration (F : AntitoneNormalSubgroupFiltration G) + (H : Subgroup G) [H.Normal] : + AntitoneNormalSubgroupFiltration (G ⧸ H) where + lower n := (F.lower n).map (QuotientGroup.mk' H) + lower_normal n := (F.lower_normal n).map + (QuotientGroup.mk' H) (QuotientGroup.mk'_surjective H) + antitone := by + intro m n hmn + exact Subgroup.map_mono (F.antitone hmn) + +/-- States the theorem `quotientImageFiltration_lower`. -/ +@[simp] theorem quotientImageFiltration_lower + (F : AntitoneNormalSubgroupFiltration G) (H : Subgroup G) [H.Normal] + (n : ℕ) : + (quotientImageFiltration F H).lower n = + (F.lower n).map (QuotientGroup.mk' H) := + rfl + +/-- At each level, the subgroup filtration is the kernel of the quotient map +restricted to the corresponding ambient lower group. -/ +def lowerToQuotientImageHom (F : AntitoneNormalSubgroupFiltration G) + (H : Subgroup G) [H.Normal] (n : ℕ) : + F.lower n →* (quotientImageFiltration F H).lower n where + toFun sigma := + ⟨QuotientGroup.mk' H (sigma : G), ⟨sigma, sigma.property, rfl⟩⟩ + map_one' := by + apply Subtype.ext + simp + map_mul' sigma tau := by + apply Subtype.ext + change QuotientGroup.mk' H (((sigma * tau : F.lower n) : G)) = + QuotientGroup.mk' H (sigma : G) * QuotientGroup.mk' H (tau : G) + rw [show (((sigma * tau : F.lower n) : G)) = + (sigma : G) * (tau : G) by rfl, map_mul] + +/-- States the theorem `lowerToQuotientImageHom_surjective`. -/ +theorem lowerToQuotientImageHom_surjective + (F : AntitoneNormalSubgroupFiltration G) + (H : Subgroup G) [H.Normal] (n : ℕ) : + Function.Surjective (lowerToQuotientImageHom F H n) := by + rintro ⟨q, hq⟩ + rcases hq with ⟨sigma, hsigma, hsigmaq⟩ + refine ⟨⟨sigma, hsigma⟩, ?_⟩ + apply Subtype.ext + exact hsigmaq + +/-- The kernel of the restricted quotient map is canonically the intersection +filtration on `H`. -/ +def lowerToQuotientImageKerEquiv (F : AntitoneNormalSubgroupFiltration G) + (H : Subgroup G) [H.Normal] (n : ℕ) : + (lowerToQuotientImageHom F H n).ker ≃ + (subgroupFiltration F H).lower n where + toFun sigma := by + let sigmaLower : F.lower n := sigma + have hmk : QuotientGroup.mk' H ((sigma : F.lower n) : G) = 1 := by + exact congrArg Subtype.val sigma.property + have hsigmaH : ((sigma : F.lower n) : G) ∈ H := + (QuotientGroup.eq_one_iff (N := H) + (x := ((sigma : F.lower n) : G))).1 hmk + exact ⟨⟨((sigma : F.lower n) : G), hsigmaH⟩, sigmaLower.property⟩ + invFun h := by + refine ⟨⟨((h : H) : G), h.property⟩, ?_⟩ + apply Subtype.ext + exact (QuotientGroup.eq_one_iff (N := H) (x := ((h : H) : G))).2 h.val.property + left_inv sigma := by + apply Subtype.ext + apply Subtype.ext + rfl + right_inv h := by + apply Subtype.ext + apply Subtype.ext + rfl + +/-- Exact level-cardinality factorization +`|F_n| = |F_n ∩ H| * |image(F_n)|`. -/ +theorem card_subgroupFiltration_mul_card_quotientImageFiltration + (F : AntitoneNormalSubgroupFiltration G) + (H : Subgroup G) [H.Normal] (n : ℕ) : + Nat.card ((subgroupFiltration F H).lower n) * + Nat.card ((quotientImageFiltration F H).lower n) = + Nat.card (F.lower n) := by + let f := lowerToQuotientImageHom F H n + have hker : Nat.card f.ker = + Nat.card ((subgroupFiltration F H).lower n) := + Nat.card_congr (lowerToQuotientImageKerEquiv F H n) + have hrange : Nat.card f.range = + Nat.card ((quotientImageFiltration F H).lower n) := by + rw [MonoidHom.range_eq_top.mpr + (lowerToQuotientImageHom_surjective F H n)] + exact Subgroup.card_top + rw [← hker, ← hrange, ← Subgroup.index_ker] + exact Subgroup.card_mul_index f.ker + +variable {G' : Type v} [Group G'] + +/-- Transport a lower ramification filtration across a group equivalence. -/ +def transportEquiv (F : AntitoneNormalSubgroupFiltration G) (e : G ≃* G') : + AntitoneNormalSubgroupFiltration G' where + lower n := (F.lower n).comap e.symm.toMonoidHom + lower_normal n := (F.lower_normal n).comap e.symm.toMonoidHom + antitone := by + intro m n hmn + exact Subgroup.comap_mono (F.antitone hmn) + +/-- States the theorem `transportEquiv_lower`. -/ +@[simp] theorem transportEquiv_lower + (F : AntitoneNormalSubgroupFiltration G) (e : G ≃* G') (n : ℕ) : + (transportEquiv F e).lower n = + (F.lower n).comap e.symm.toMonoidHom := + rfl + +/-- States the theorem `mem_transportEquiv_lower_iff`. -/ +theorem mem_transportEquiv_lower_iff + (F : AntitoneNormalSubgroupFiltration G) (e : G ≃* G') + (n : ℕ) (sigma : G') : + sigma ∈ (transportEquiv F e).lower n ↔ e.symm sigma ∈ F.lower n := + Iff.rfl + +/-- Every integral level is carried to the corresponding transported level. -/ +def lowerEquivTransportEquiv + (F : AntitoneNormalSubgroupFiltration G) (e : G ≃* G') (n : ℕ) : + F.lower n ≃ (transportEquiv F e).lower n where + toFun sigma := ⟨e (sigma : G), by simp⟩ + invFun tau := ⟨e.symm (tau : G'), tau.property⟩ + left_inv sigma := by + apply Subtype.ext + simp + right_inv tau := by + apply Subtype.ext + simp + +/-- States the theorem `card_lower_transportEquiv`. -/ +theorem card_lower_transportEquiv + (F : AntitoneNormalSubgroupFiltration G) (e : G ≃* G') (n : ℕ) : + Nat.card ((transportEquiv F e).lower n) = Nat.card (F.lower n) := by + exact Nat.card_congr (lowerEquivTransportEquiv F e n).symm + +/-- The Herbrand function is invariant under transport across a group +equivalence. -/ +theorem herbrandFunction_transportEquiv + [Finite G] [Finite G'] + (F : AntitoneNormalSubgroupFiltration G) (e : G ≃* G') (s : ℝ) : + (herbrandFunction + (transportEquiv F e)) s = + (herbrandFunction F) s := by + apply + herbrandFunction_eq_of_card_lower_eq (transportEquiv F e) F + intro n + exact card_lower_transportEquiv F e n + +/-- The inverse Herbrand function is invariant under transport across a +group equivalence. -/ +theorem inverseHerbrandFunction_transportEquiv + [Finite G] [Finite G'] + (F : AntitoneNormalSubgroupFiltration G) (e : G ≃* G') (t : ℝ) : + (inverseHerbrandFunction (transportEquiv F e)) t = (inverseHerbrandFunction F) t := by + apply + (herbrandFunction_strictMono (transportEquiv F e)).injective + rw [herbrandFunction_inverseHerbrandFunction (transportEquiv F e)] + rw [(herbrandFunction_transportEquiv F)] + rw [(herbrandFunction_inverseHerbrandFunction F)] + +/-- The quotient-image filtration, transported to any isomorphic model of +the quotient group. -/ +def quotientImageTransport + (F : AntitoneNormalSubgroupFiltration G) (H : Subgroup G) [H.Normal] + (e : (G ⧸ H) ≃* G') : AntitoneNormalSubgroupFiltration G' := + transportEquiv (quotientImageFiltration F H) e + +/-- States the theorem `quotientImageTransport_lower`. -/ +@[simp] theorem quotientImageTransport_lower + (F : AntitoneNormalSubgroupFiltration G) (H : Subgroup G) [H.Normal] + (e : (G ⧸ H) ≃* G') (n : ℕ) : + (quotientImageTransport F H e).lower n = + ((F.lower n).map (QuotientGroup.mk' H)).comap e.symm.toMonoidHom := + rfl + +/-- Mapping a subgroup across a group equivalence is inverse to pulling it +back. This orientation is the one used by the fixed-field quotient map. -/ +theorem subgroup_map_equiv_eq_iff_eq_comap + (e : G ≃* G') (A : Subgroup G) (B : Subgroup G') : + A.map e.toMonoidHom = B ↔ + A = B.comap e.toMonoidHom := by + constructor + · intro h + rw [← h] + exact (Subgroup.comap_map_eq_self_of_injective + (f := e.toMonoidHom) e.injective A).symm + · intro h + rw [h] + exact Subgroup.map_comap_eq_self_of_surjective + (f := e.toMonoidHom) e.surjective B + +/-- States the theorem `transportEquiv_lower_eq_map`. -/ +theorem transportEquiv_lower_eq_map + (F : AntitoneNormalSubgroupFiltration G) (e : G ≃* G') (n : ℕ) : + (transportEquiv F e).lower n = (F.lower n).map e.toMonoidHom := by + ext sigma + constructor + · intro hsigma + exact ⟨e.symm sigma, hsigma, e.apply_symm_apply sigma⟩ + · rintro ⟨tau, htau, rfl⟩ + simpa using htau + + +/-- States the theorem `transportEquiv_lower_eq_iff`. -/ +theorem transportEquiv_lower_eq_iff + (F : AntitoneNormalSubgroupFiltration G) (e : G ≃* G') + (n : ℕ) (B : Subgroup G') : + (transportEquiv F e).lower n = B ↔ + F.lower n = B.comap e.toMonoidHom := by + rw [transportEquiv_lower_eq_map F e n] + exact subgroup_map_equiv_eq_iff_eq_comap e (F.lower n) B + +/-- Equality with a transported quotient-image level is exactly the usual +map/comap formulation of a lower-quotient theorem. -/ +theorem quotientImageTransport_lower_eq_iff + (F : AntitoneNormalSubgroupFiltration G) (H : Subgroup G) [H.Normal] + (e : (G ⧸ H) ≃* G') (n : ℕ) (B : Subgroup G') : + (quotientImageTransport F H e).lower n = B ↔ + (F.lower n).map (QuotientGroup.mk' H) = + B.comap e.toMonoidHom := by + exact transportEquiv_lower_eq_iff (quotientImageFiltration F H) e n B + + +/-- Exact level-cardinality factorization after replacing the abstract +quotient by any isomorphic group model. -/ +theorem card_subgroupFiltration_mul_card_quotientImageTransport + [Finite G] [Finite G'] (F : AntitoneNormalSubgroupFiltration G) + (H : Subgroup G) [H.Normal] (e : (G ⧸ H) ≃* G') (n : ℕ) : + Nat.card ((subgroupFiltration F H).lower n) * + Nat.card ((quotientImageTransport F H e).lower n) = + Nat.card (F.lower n) := by + change Nat.card ((subgroupFiltration F H).lower n) * + Nat.card ((transportEquiv (quotientImageFiltration F H) e).lower n) = _ + rw [card_lower_transportEquiv (quotientImageFiltration F H) e n] + exact card_subgroupFiltration_mul_card_quotientImageFiltration F H n + +/-- States the theorem `quotientImageTransport_herbrandFunction`. -/ +theorem quotientImageTransport_herbrandFunction + [Finite G] [Finite G'] + (F : AntitoneNormalSubgroupFiltration G) (H : Subgroup G) [H.Normal] + (e : (G ⧸ H) ≃* G') (s : ℝ) : + (herbrandFunction + (quotientImageTransport F H e)) s = + (herbrandFunction (quotientImageFiltration F H)) s := + by + exact herbrandFunction_transportEquiv (quotientImageFiltration F H) e s + +/-- States the theorem `quotientImageTransport_inverseHerbrandFunction`. -/ +theorem quotientImageTransport_inverseHerbrandFunction + [Finite G] [Finite G'] + (F : AntitoneNormalSubgroupFiltration G) (H : Subgroup G) [H.Normal] + (e : (G ⧸ H) ≃* G') (t : ℝ) : + (inverseHerbrandFunction (quotientImageTransport F H e)) t = + (inverseHerbrandFunction (quotientImageFiltration F H)) t := + by + exact inverseHerbrandFunction_transportEquiv (quotientImageFiltration F H) e t + +end AntitoneNormalSubgroupFiltration +end RamificationTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Tower.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Tower.lean new file mode 100644 index 0000000000..bb26f789a4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Tower.lean @@ -0,0 +1,264 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.Ramification +/-! +# Finite-group sources for Herbrand's theorem + +This file isolates the part of the Herbrand quotient theorem which is +independent of valuations. A discrete nonarchimedean depth has the two +properties of `i(σ) = v(σ(a) - a)` used in the ramification-depth proof: multiplication +does not decrease the minimum depth, and it is exactly the minimum when the +two depths differ. + +For a finite group modulo a normal subgroup, every nontrivial quotient fibre +has a representative of maximal (finite) depth. The main result below proves +the identity + +`i(σ τ) = min (i(σ), i(τ))` + +for such a representative `σ` and every `τ` in the normal subgroup. The +remaining valued-field input for the Herbrand quotient theorem is the quotient-depth identity: + the depth +on the quotient is the normalized sum of the depths in this fibre. That +input is deliberately not packaged here as a hypothesis or data field. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace RamificationTheory.DiscreteValuationField +namespace HerbrandGroupTheory + +variable {G : Type u} [Group G] + +/-- The purely group-theoretic laws of the discrete depth used in the proof +of Herbrand's theorem. The value `⊤` occurs exactly at the identity. -/ +structure NonarchimedeanDepth (G : Type u) [Group G] where + /-- The discrete nonarchimedean depth of each group element. -/ + depth : G → WithTop ℕ + /-- An element has infinite depth exactly when it is the identity. -/ + depth_eq_top_iff : ∀ σ, depth σ = ⊤ ↔ σ = 1 + /-- The depth of a product is at least the minimum depth of its factors. -/ + depth_mul_ge_min : ∀ σ τ, min (depth σ) (depth τ) ≤ depth (σ * τ) + /-- Factors of unequal depth give a product whose depth is their minimum. -/ + depth_mul_eq_min_of_ne : + ∀ {σ τ}, depth σ ≠ depth τ → depth (σ * τ) = min (depth σ) (depth τ) + /-- Depth is invariant under conjugation. -/ + depth_conj : ∀ γ σ, depth (γ * σ * γ⁻¹) = depth σ + +namespace NonarchimedeanDepth + +variable (D : NonarchimedeanDepth G) + +/-- States the theorem `depth_one`. -/ +@[simp] theorem depth_one : D.depth 1 = ⊤ := + (D.depth_eq_top_iff 1).2 rfl + +/-- States the theorem `depth_ne_top_iff`. -/ +theorem depth_ne_top_iff {σ : G} : D.depth σ ≠ ⊤ ↔ σ ≠ 1 := by + rw [not_iff_not] + exact D.depth_eq_top_iff σ + +variable (H : Subgroup G) [H.Normal] + +/-- The fibre of the canonical quotient map over `q`. -/ +abbrev QuotientFiber (q : G ⧸ H) : Type u := + {σ : G // QuotientGroup.mk' H σ = q} + +/-- A subgroup of a finite group is equipped with its finite enumeration. -/ +noncomputable local instance subgroupFintype [Finite G] : Fintype H := + Fintype.ofFinite H + +/-- The finite ambient group is equipped with an enumeration for the depth sums. -/ +noncomputable local instance groupFintype [Finite G] : Fintype G := + Fintype.ofFinite G + +/-- Each fiber of the quotient map from a finite group has a finite enumeration. -/ +noncomputable local instance quotientFiberFintype [Finite G] (q : G ⧸ H) : + Fintype (QuotientFiber H q) := + Fintype.ofFinite (QuotientFiber H q) + +/-- The quotient of the finite ambient group is equipped with a finite enumeration. -/ +noncomputable local instance quotientFintype [Finite G] : Fintype (G ⧸ H) := + Fintype.ofFinite (G ⧸ H) + +/-- Provides the instance `quotientFiber_nonempty`. -/ +instance quotientFiber_nonempty (q : G ⧸ H) : Nonempty (QuotientFiber H q) := by + obtain ⟨σ, rfl⟩ := QuotientGroup.mk'_surjective H q + exact ⟨⟨σ, rfl⟩⟩ + +/-- States the theorem `ne_one_of_mem_quotientFiber`. -/ +theorem ne_one_of_mem_quotientFiber {q : G ⧸ H} (hq : q ≠ 1) + (σ : QuotientFiber H q) : (σ : G) ≠ 1 := by + intro hσ + apply hq + rw [← σ.property, hσ] + simp + +/-- States the theorem `depth_ne_top_of_mem_quotientFiber`. -/ +theorem depth_ne_top_of_mem_quotientFiber {q : G ⧸ H} (hq : q ≠ 1) + (σ : QuotientFiber H q) : D.depth (σ : G) ≠ ⊤ := + D.depth_ne_top_iff.2 (ne_one_of_mem_quotientFiber H hq σ) + +/-- The finite natural depth of an element in a nontrivial quotient fibre. -/ +def quotientFiberDepth {q : G ⧸ H} (hq : q ≠ 1) + (σ : QuotientFiber H q) : ℕ := + (D.depth (σ : G)).untop (D.depth_ne_top_of_mem_quotientFiber H hq σ) + +/-- States the theorem `coe_quotientFiberDepth`. -/ +theorem coe_quotientFiberDepth {q : G ⧸ H} (hq : q ≠ 1) + (σ : QuotientFiber H q) : + (D.quotientFiberDepth H hq σ : WithTop ℕ) = D.depth (σ : G) := + WithTop.coe_untop _ _ + +/-- Every nontrivial fibre of a finite quotient has a representative of +maximal depth. The conclusion is stated back in `WithTop ℕ`, rather than in +terms of the auxiliary `untop`, so it can be fed directly into the valuation +identity used in the Herbrand quotient theorem. -/ +theorem exists_maximal_depth_representative [Finite G] + {q : G ⧸ H} (hq : q ≠ 1) : + ∃ σ : G, QuotientGroup.mk' H σ = q ∧ + ∀ γ : G, QuotientGroup.mk' H γ = q → D.depth γ ≤ D.depth σ := by + classical + obtain ⟨σ, -, hσ⟩ := Finset.exists_max_image + (Finset.univ : Finset (QuotientFiber H q)) + (D.quotientFiberDepth H hq) Finset.univ_nonempty + refine ⟨σ, σ.property, ?_⟩ + intro γ hγ + let γ' : QuotientFiber H q := ⟨γ, hγ⟩ + have hnat : D.quotientFiberDepth H hq γ' ≤ + D.quotientFiberDepth H hq σ := hσ γ' (Finset.mem_univ γ') + rw [← D.coe_quotientFiberDepth H hq γ', + ← D.coe_quotientFiberDepth H hq σ] + exact WithTop.coe_le_coe.2 hnat + +/-- A right coset is naturally equivalent to the corresponding quotient +fibre. This is the finite-sum reindexing used after choosing a maximal-depth +representative. -/ +def rightCosetEquivQuotientFiber (σ : G) : H ≃ QuotientFiber H (QuotientGroup.mk' H σ) where + toFun τ := ⟨σ * τ, by + rw [map_mul] + simp [(QuotientGroup.eq_one_iff (N := H) (x := (τ : G))).2 τ.property]⟩ + invFun γ := ⟨σ⁻¹ * γ, by + apply (QuotientGroup.eq_one_iff (N := H) (x := σ⁻¹ * (γ : G))).1 + change QuotientGroup.mk' H (σ⁻¹ * (γ : G)) = 1 + rw [map_mul, map_inv, γ.property] + simp⟩ + left_inv τ := by + apply Subtype.ext + simp + right_inv γ := by + apply Subtype.ext + simp + +/-- States the theorem `card_quotientFiber`. -/ +theorem card_quotientFiber [Finite G] (σ : G) : + Fintype.card (QuotientFiber H (QuotientGroup.mk' H σ)) = Fintype.card H := by + classical + exact (Fintype.card_congr (rightCosetEquivQuotientFiber H σ)).symm + +/-- Reindex a sum over a quotient fibre by multiplication with elements of +the normal subgroup. -/ +theorem sum_quotientFiber_eq_sum_subgroup [Finite G] + {M : Type*} [AddCommMonoid M] (f : G → M) (σ : G) : + (∑ γ : QuotientFiber H (QuotientGroup.mk' H σ), f (γ : G)) = + ∑ τ : H, f (σ * τ) := by + classical + simpa using Fintype.sum_equiv + (rightCosetEquivQuotientFiber H σ).symm + (fun γ : QuotientFiber H (QuotientGroup.mk' H σ) => f (γ : G)) + (fun τ : H => f (σ * τ)) (fun γ => by + change f (γ : G) = f (σ * (σ⁻¹ * (γ : G))) + simp) + +/-- Partition a finite sum over `G` into the fibres of the quotient map. -/ +theorem sum_quotientFiber [Finite G] + {M : Type*} [AddCommMonoid M] (f : G → M) : + (∑ q : G ⧸ H, ∑ σ : QuotientFiber H q, f (σ : G)) = ∑ σ : G, f σ := by + classical + calc + (∑ q : G ⧸ H, ∑ σ : QuotientFiber H q, f (σ : G)) = + ∑ z : (q : G ⧸ H) × QuotientFiber H q, f (z.2 : G) := + (Fintype.sum_sigma + (fun z : (q : G ⧸ H) × QuotientFiber H q => f (z.2 : G))).symm + _ = ∑ σ : G, f σ := Fintype.sum_equiv + (Equiv.sigmaFiberEquiv (QuotientGroup.mk' H)) + (fun z : (q : G ⧸ H) × QuotientFiber H q => f (z.2 : G)) + f (fun _ => rfl) + +/-- The maximal-representative identity in the proof of Herbrand's theorem. +If `σ` has maximal depth in its quotient fibre, then multiplication by every +`τ ∈ H` truncates the depth exactly at `i(σ)`. -/ +theorem depth_mul_eq_min_of_maximal_representative + {σ : G} + (hmax : ∀ γ : G, QuotientGroup.mk' H γ = QuotientGroup.mk' H σ → + D.depth γ ≤ D.depth σ) + (τ : H) : + D.depth (σ * τ) = min (D.depth (τ : G)) (D.depth σ) := by + have hfiber : QuotientGroup.mk' H (σ * (τ : G)) = QuotientGroup.mk' H σ := by + rw [map_mul] + simp [(QuotientGroup.eq_one_iff (N := H) (x := (τ : G))).2 τ.property] + rcases lt_trichotomy (D.depth (τ : G)) (D.depth σ) with hlt | heq | hgt + · simpa [min_comm] using D.depth_mul_eq_min_of_ne hlt.ne' + · rw [heq, min_self] + apply le_antisymm (hmax _ hfiber) + simpa [heq] using D.depth_mul_ge_min σ (τ : G) + · simpa [min_comm] using D.depth_mul_eq_min_of_ne hgt.ne + +/-- The fibre-sum form of the maximal-representative identity. Composing +`f` with a finite-depth cast gives exactly the sum appearing in +the Herbrand quotient theorem, after the quotient-depth identity supplies the quotient-depth + average. -/ +theorem sum_depth_quotientFiber_eq_sum_min_of_maximal_representative + [Finite G] {M : Type*} [AddCommMonoid M] + (f : WithTop ℕ → M) {σ : G} + (hmax : ∀ γ : G, QuotientGroup.mk' H γ = QuotientGroup.mk' H σ → + D.depth γ ≤ D.depth σ) : + (∑ γ : QuotientFiber H (QuotientGroup.mk' H σ), f (D.depth (γ : G))) = + ∑ τ : H, f (min (D.depth (τ : G)) (D.depth σ)) := by + rw [sum_quotientFiber_eq_sum_subgroup H (fun γ => f (D.depth γ)) σ] + apply Finset.sum_congr rfl + intro τ _ + rw [D.depth_mul_eq_min_of_maximal_representative H hmax τ] + +/-- Combined existence form used verbatim in the group-theoretic step of +the Herbrand quotient theorem. -/ +theorem exists_representative_depth_mul_eq_min [Finite G] + {q : G ⧸ H} (hq : q ≠ 1) : + ∃ σ : G, QuotientGroup.mk' H σ = q ∧ + ∀ τ : H, D.depth (σ * τ) = min (D.depth (τ : G)) (D.depth σ) := by + obtain ⟨σ, hσq, hmax⟩ := D.exists_maximal_depth_representative H hq + refine ⟨σ, hσq, ?_⟩ + intro τ + apply D.depth_mul_eq_min_of_maximal_representative H + intro γ hγ + exact hmax γ (hγ.trans hσq) + +/-- Existence form of the fibre-sum identity for a nontrivial quotient +element. -/ +theorem exists_representative_sum_depth_eq_sum_min [Finite G] + {M : Type*} [AddCommMonoid M] (f : WithTop ℕ → M) + {q : G ⧸ H} (hq : q ≠ 1) : + ∃ σ : G, QuotientGroup.mk' H σ = q ∧ + (∑ γ : QuotientFiber H q, f (D.depth (γ : G))) = + ∑ τ : H, f (min (D.depth (τ : G)) (D.depth σ)) := by + obtain ⟨σ, hσq, hmax⟩ := D.exists_maximal_depth_representative H hq + refine ⟨σ, hσq, ?_⟩ + rw [← hσq] + apply D.sum_depth_quotientFiber_eq_sum_min_of_maximal_representative H f + intro γ hγ + exact hmax γ (hγ.trans hσq) + +end NonarchimedeanDepth +end HerbrandGroupTheory +end RamificationTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification.lean new file mode 100644 index 0000000000..34bf120409 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification.lean @@ -0,0 +1,56 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AbsoluteValueConjugacy +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.BaseChange +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CharacterMap +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CompleteDVF +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CyclotomicDegreeBound +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteGaloisLevel +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteGaloisLevelIndependence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteInertiaStructure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteOrderValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteRamificationPrimary +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FirstRamificationComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamificationIndex +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldValuationRing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.GaloisStabilizer +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandFunction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandTheorem +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRamificationCard +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRestrictionCard +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationDensity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationRamificationGroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Monogeneity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.OrbitPolynomialIdeal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.PadicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Polynomial +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationCharacterization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationDepth +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumber +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumberFormula +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumberRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationPrimeToResidueTorsion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ResidueExactSequence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniformizerGradedHom +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniqueExtensionIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationKrasner +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AbsoluteValueConjugacy.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AbsoluteValueConjugacy.lean new file mode 100644 index 0000000000..6324df38d9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AbsoluteValueConjugacy.lean @@ -0,0 +1,160 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ExponentialValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Ostrowski +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.PrincipalAdicCompleteness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.SpectralExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.AbsoluteValueExtensions +/-! +# Valuation conjugacy + +For a possibly infinite Galois extension `L/K`, the Galois group acts +transitively on the extensions to `L` of a nontrivial absolute value of `K`. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- Pull an absolute value back by a field automorphism. This is the canonical +right action `w ↦ w ∘ σ`. -/ +def absoluteValueConjugate + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (w : AbsoluteValue L ℝ) (σ : L ≃ₐ[K] L) : AbsoluteValue L ℝ := + w.comp (f := σ.toRingEquiv.toRingHom) σ.injective + +@[simp] theorem absoluteValueConjugate_apply + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (w : AbsoluteValue L ℝ) (σ : L ≃ₐ[K] L) (x : L) : + absoluteValueConjugate w σ x = w (σ x) := + rfl + +/-- Conjugating an extension by a ground-field automorphism gives another +exact extension of the same base absolute value. -/ +theorem absoluteValueConjugate_extends + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (w : AbsoluteValueExtension vK L) + (σ : L ≃ₐ[K] L) : + AbsoluteValue.Extends vK (absoluteValueConjugate w.1 σ) := by + intro x + rw [absoluteValueConjugate_apply, σ.commutes, w.2 x] + +/-- The conjugated extension as an element of the exact-extension type. -/ +def absoluteValueExtensionConjugate + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (w : AbsoluteValueExtension vK L) + (σ : L ≃ₐ[K] L) : AbsoluteValueExtension vK L := + ⟨absoluteValueConjugate w.1 σ, + absoluteValueConjugate_extends vK w σ⟩ + +/-- Equivalent exact extensions of a nontrivial base absolute value are equal. +Thus `AbsoluteValueExtension vK L` is a faithful normalized model for the +absolute-value classes lying over the class of `vK`. -/ +theorem equivalent_exactExtensions_eq + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w w' : AbsoluteValueExtension vK L) + (h : LubinTate.Valuations.EquivalentAbsoluteValues w.1 w'.1) : + w = w' := by + rcases (LubinTate.Valuations.equivalentAbsoluteValues_iff_exists_rpow_eq w.1 w'.1).mp h with + ⟨s, hs, hpow⟩ + rcases hvK with ⟨a, ha, hva⟩ + have hbase : vK a ^ s = vK a := by + have hpoint := congrFun hpow (algebraMap K L a) + simpa [w.2 a, w'.2 a] using hpoint + have hs_one : s = 1 := + (Real.rpow_right_inj (vK.pos ha) hva).mp (by simpa using hbase) + apply Subtype.ext + ext x + have hpoint := congrFun hpow x + simpa [hs_one] using hpoint + +/-- Normality descent for the embeddings supplied by the valuation-extension theorem: two exact +extensions differ by an actual `K`-automorphism of `L`, not merely by an +automorphism of the ambient algebraic closure. -/ +theorem absoluteValueConjugacy_exists_conjugatingAlgEquiv + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [IsGalois K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w w' : AbsoluteValueExtension vK L) : + ∃ σ : L ≃ₐ[K] L, w'.1 = absoluteValueConjugate w.1 σ := by + let A := absoluteValueExtensionAlgebraicCompletionClosure vK + let τ : L →ₐ[K] A := absoluteValueExtensionEmbeddingOfExtension vK w + let τ' : L →ₐ[K] A := absoluteValueExtensionEmbeddingOfExtension vK w' + let : Algebra L A := τ.toRingHom.toAlgebra + let : IsScalarTower K L A := + IsScalarTower.of_algebraMap_eq' τ.comp_algebraMap.symm + let σ : L ≃ₐ[K] L := Normal.algHomEquivAut K A L τ' + refine ⟨σ, ?_⟩ + rw [absoluteValueExtension_extension_eq_pullback_embeddingOfExtension vK hvK w', + absoluteValueExtension_extension_eq_pullback_embeddingOfExtension vK hvK w] + ext x + change + absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK (τ' x) = + absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK (τ (σ x)) + congr 1 + simpa [σ, τ, AlgHom.restrictNormal', RingHom.algebraMap_toAlgebra] using + (τ'.restrictNormal_commutes L x).symm + +/-- The valuation-conjugacy theorem: the Galois group acts transitively +on the exact extensions of a nontrivial valuation. This statement covers +finite and infinite Galois extensions and both archimedean and +nonarchimedean absolute values. -/ +theorem absoluteValueConjugacy + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [IsGalois K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w w' : AbsoluteValueExtension vK L) : + ∃ σ : L ≃ₐ[K] L, + w' = absoluteValueExtensionConjugate vK w σ := by + rcases absoluteValueConjugacy_exists_conjugatingAlgEquiv vK hvK w w' with + ⟨σ, hσ⟩ + exact ⟨σ, Subtype.ext hσ⟩ + +/-- Class-level form of the valuation-conjugacy theorem. The exact-representative equality +above in particular gives equality of the corresponding absolute value +classes. -/ +theorem absoluteValueConjugacy_valuationClass + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [IsGalois K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w w' : AbsoluteValueExtension vK L) : + ∃ σ : L ≃ₐ[K] L, + LubinTate.Valuations.EquivalentAbsoluteValues w'.1 + (absoluteValueExtensionConjugate vK w σ).1 := by + rcases absoluteValueConjugacy vK hvK w w' with ⟨σ, hσ⟩ + refine ⟨σ, ?_⟩ + rw [← hσ] + exact LubinTate.Valuations.equivalentAbsoluteValues_refl w'.1 + +end Valuations +end AlgebraicNumberTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AlgebraicLocalization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AlgebraicLocalization.lean new file mode 100644 index 0000000000..ac2c82ed2b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AlgebraicLocalization.lean @@ -0,0 +1,631 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionGroup +/-! +# Localization and decomposition comparison for decomposition groups + +For a possibly infinite Galois extension, this file constructs the canonical +isomorphism between the decomposition group of an exact absolute value and +the Galois group of the localization over the completed base field. The +localization is algebraic, not the +whole metric completion in infinite degree. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace HilbertRamification + +open AlgebraicNumberTheory.Valuations + +variable {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + +section LocalizationLift + +variable (vK : AbsoluteValue K ℝ) (w : AbsoluteValueExtension vK L) + +/-- The ring equivalence of the normed copy of `L` attached to an automorphism +which preserves `w`. -/ +def valuationPreservingWithAbsRingEquiv + (σ : L ≃ₐ[K] L) : WithAbs w.1 ≃+* WithAbs w.1 := + (WithAbs.equiv w.1).trans + (σ.toRingEquiv.trans (WithAbs.equiv w.1).symm) + +@[simp] theorem valuationPreservingWithAbsRingEquiv_apply + (σ : L ≃ₐ[K] L) (x : L) : + WithAbs.equiv w.1 + (valuationPreservingWithAbsRingEquiv vK w σ + ((WithAbs.equiv w.1).symm x)) = σ x := + rfl + +theorem valuationPreservingWithAbsRingEquiv_isometry + (σ : L ≃ₐ[K] L) (hσ : ∀ x : L, w.1 (σ x) = w.1 x) : + Isometry (valuationPreservingWithAbsRingEquiv vK w σ) := by + apply AddMonoidHomClass.isometry_of_norm + intro x + rw [WithAbs.norm_eq_apply_ofAbs, WithAbs.norm_eq_apply_ofAbs] + exact hσ (WithAbs.equiv w.1 x) + +theorem valuationPreservingWithAbsRingEquiv_symm_isometry + (σ : L ≃ₐ[K] L) (hσ : ∀ x : L, w.1 (σ x) = w.1 x) : + Isometry (valuationPreservingWithAbsRingEquiv vK w σ).symm := by + apply AddMonoidHomClass.isometry_of_norm + intro x + rw [WithAbs.norm_eq_apply_ofAbs, WithAbs.norm_eq_apply_ofAbs] + have h := hσ (σ⁻¹ (WithAbs.equiv w.1 x)) + simpa [valuationPreservingWithAbsRingEquiv] using h.symm + +/-- A valuation-preserving automorphism of `L` extends functorially to a ring +automorphism of the metric completion of `(L,w)`. -/ +def valuationPreservingCompletionRingEquiv + (σ : L ≃ₐ[K] L) (hσ : ∀ x : L, w.1 (σ x) = w.1 x) : + w.1.Completion ≃+* w.1.Completion := + UniformSpace.Completion.mapRingEquiv + (valuationPreservingWithAbsRingEquiv vK w σ) + (valuationPreservingWithAbsRingEquiv_isometry vK w σ hσ).continuous + (valuationPreservingWithAbsRingEquiv_symm_isometry vK w σ hσ).continuous + +theorem valuationPreservingCompletionRingEquiv_toCompletion + (σ : L ≃ₐ[K] L) (hσ : ∀ x : L, w.1 (σ x) = w.1 x) (x : L) : + valuationPreservingCompletionRingEquiv vK w σ hσ + (AbsoluteValue.toCompletion w.1 x) = + AbsoluteValue.toCompletion w.1 (σ x) := by + change + UniformSpace.Completion.mapRingEquiv + (valuationPreservingWithAbsRingEquiv vK w σ) + (valuationPreservingWithAbsRingEquiv_isometry vK w σ hσ).continuous + (valuationPreservingWithAbsRingEquiv_symm_isometry vK w σ hσ).continuous + (((WithAbs.equiv w.1).symm x : WithAbs w.1) : w.1.Completion) = _ + rw [UniformSpace.Completion.mapRingEquiv_apply, + UniformSpace.Completion.map_coe + (valuationPreservingWithAbsRingEquiv_isometry + vK w σ hσ).uniformContinuous] + rfl + +/-- The extended automorphism fixes the embedded completed base field. -/ +theorem valuationPreservingCompletionRingEquiv_completionMap + (σ : L ≃ₐ[K] L) (hσ : ∀ x : L, w.1 (σ x) = w.1 x) + (x : vK.Completion) : + valuationPreservingCompletionRingEquiv vK w σ hσ + (AbsoluteValue.completionMap vK w.1 w.2 x) = + AbsoluteValue.completionMap vK w.1 w.2 x := by + have hfun : + (fun y : vK.Completion => + valuationPreservingCompletionRingEquiv vK w σ hσ + (AbsoluteValue.completionMap vK w.1 w.2 y)) = + AbsoluteValue.completionMap vK w.1 w.2 := by + apply UniformSpace.Completion.ext + · exact UniformSpace.Completion.continuous_map.comp + (AbsoluteValue.completionMap_isometry vK w.1 w.2).continuous + · exact (AbsoluteValue.completionMap_isometry vK w.1 w.2).continuous + · intro y + have hy : (y : vK.Completion) = + algebraMap K vK.Completion (WithAbs.equiv vK y) := by + rw [← AbsoluteValue.toCompletion_eq_algebraMap] + simp + rw [hy, AbsoluteValue.completionMap_coe] + change + valuationPreservingCompletionRingEquiv vK w σ hσ + (AbsoluteValue.toCompletion w.1 + (algebraMap K L (WithAbs.equiv vK y))) = + AbsoluteValue.toCompletion w.1 + (algebraMap K L (WithAbs.equiv vK y)) + rw [valuationPreservingCompletionRingEquiv_toCompletion, σ.commutes] + exact congrFun hfun x + +/-- The completion lift preserves the algebraic localization `L K_v`. -/ +theorem valuationPreservingCompletionRingEquiv_mem_localization + (σ : L ≃ₐ[K] L) (hσ : ∀ x : L, w.1 (σ x) = w.1 x) + {z : w.1.Completion} (hz : z ∈ AbsoluteValue.algebraicLocalization vK w.1 w.2) : + valuationPreservingCompletionRingEquiv vK w σ hσ z ∈ + AbsoluteValue.algebraicLocalization vK w.1 w.2 := by + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + apply IntermediateField.adjoin_induction + (p := fun x (_ : x ∈ E) => + valuationPreservingCompletionRingEquiv vK w σ hσ x ∈ E) + (s := Set.range (AbsoluteValue.toCompletion w.1)) + · intro x hx + rcases hx with ⟨a, rfl⟩ + rw [valuationPreservingCompletionRingEquiv_toCompletion] + exact IntermediateField.subset_adjoin vK.Completion _ ⟨σ a, rfl⟩ + · intro x + change + valuationPreservingCompletionRingEquiv vK w σ hσ + (AbsoluteValue.completionMap vK w.1 w.2 x) ∈ E + rw [valuationPreservingCompletionRingEquiv_completionMap] + exact E.algebraMap_mem x + · intro x y hx hy hx' hy' + simpa only [map_add] using E.add_mem hx' hy' + · intro x hx hx' + simpa only [map_inv₀] using E.inv_mem hx' + · intro x y hx hy hx' hy' + simpa only [map_mul] using E.mul_mem hx' hy' + · exact hz + +/-- The inverse completion lift also preserves `L K_v`. -/ +theorem valuationPreservingCompletionRingEquiv_symm_mem_localization + (σ : L ≃ₐ[K] L) (hσ : ∀ x : L, w.1 (σ x) = w.1 x) + {z : w.1.Completion} (hz : z ∈ AbsoluteValue.algebraicLocalization vK w.1 w.2) : + (valuationPreservingCompletionRingEquiv vK w σ hσ).symm z ∈ + AbsoluteValue.algebraicLocalization vK w.1 w.2 := by + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + apply IntermediateField.adjoin_induction + (p := fun x (_ : x ∈ E) => + (valuationPreservingCompletionRingEquiv vK w σ hσ).symm x ∈ E) + (s := Set.range (AbsoluteValue.toCompletion w.1)) + · intro x hx + rcases hx with ⟨a, rfl⟩ + have hgen := valuationPreservingCompletionRingEquiv_toCompletion + vK w σ hσ (σ⁻¹ a) + have hsymm : + (valuationPreservingCompletionRingEquiv vK w σ hσ).symm + (AbsoluteValue.toCompletion w.1 a) = + AbsoluteValue.toCompletion w.1 (σ⁻¹ a) := by + rw [← (valuationPreservingCompletionRingEquiv vK w σ hσ).injective.eq_iff, + (valuationPreservingCompletionRingEquiv vK w σ hσ).apply_symm_apply] + simpa using hgen.symm + rw [hsymm] + exact IntermediateField.subset_adjoin vK.Completion _ ⟨σ⁻¹ a, rfl⟩ + · intro x + have hbase := valuationPreservingCompletionRingEquiv_completionMap + vK w σ hσ x + have hsymm : + (valuationPreservingCompletionRingEquiv vK w σ hσ).symm + (AbsoluteValue.completionMap vK w.1 w.2 x) = + AbsoluteValue.completionMap vK w.1 w.2 x := by + rw [← (valuationPreservingCompletionRingEquiv vK w σ hσ).injective.eq_iff, + (valuationPreservingCompletionRingEquiv vK w σ hσ).apply_symm_apply] + exact hbase.symm + change + (valuationPreservingCompletionRingEquiv vK w σ hσ).symm + (AbsoluteValue.completionMap vK w.1 w.2 x) ∈ E + rw [hsymm] + exact E.algebraMap_mem x + · intro x y hx hy hx' hy' + simpa only [map_add] using E.add_mem hx' hy' + · intro x hx hx' + simpa only [map_inv₀] using E.inv_mem hx' + · intro x y hx hy hx' hy' + simpa only [map_mul] using E.mul_mem hx' hy' + · exact hz + +/-- A valuation-preserving automorphism of `L` extends to a +`K_v`-automorphism of the algebraic localization. -/ +def valuationPreservingLocalizationAlgEquiv + (σ : L ≃ₐ[K] L) (hσ : ∀ x : L, w.1 (σ x) = w.1 x) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + AbsoluteValue.algebraicLocalization vK w.1 w.2 ≃ₐ[vK.Completion] + AbsoluteValue.algebraicLocalization vK w.1 w.2 := by + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + let e := valuationPreservingCompletionRingEquiv vK w σ hσ + exact + { toFun := fun z => + ⟨e z, valuationPreservingCompletionRingEquiv_mem_localization + vK w σ hσ z.property⟩ + invFun := fun z => + ⟨e.symm z, + valuationPreservingCompletionRingEquiv_symm_mem_localization + vK w σ hσ z.property⟩ + left_inv := fun z => by + apply Subtype.ext + exact e.symm_apply_apply z + right_inv := fun z => by + apply Subtype.ext + exact e.apply_symm_apply z + map_mul' := fun x y => by + apply Subtype.ext + exact e.map_mul x y + map_add' := fun x y => by + apply Subtype.ext + exact e.map_add x y + commutes' := fun x => by + apply Subtype.ext + exact valuationPreservingCompletionRingEquiv_completionMap + vK w σ hσ x } + +@[simp] theorem valuationPreservingLocalizationAlgEquiv_toLocalization + (σ : L ≃ₐ[K] L) (hσ : ∀ x : L, w.1 (σ x) = w.1 x) (x : L) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + valuationPreservingLocalizationAlgEquiv vK w σ hσ + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x) = + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 (σ x) := by + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + apply Subtype.ext + exact valuationPreservingCompletionRingEquiv_toCompletion vK w σ hσ x + +end LocalizationLift + +section DecompositionEquiv + +variable (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + +include hvK + +/-- Membership in the decomposition group supplies equality, not merely +equivalence, of the normalized absolute-value representatives. -/ +theorem absoluteValueDecompositionGroup_preserves_absoluteValue + (σ : absoluteValueDecompositionGroup K w.1) (x : L) : + w.1 ((σ : L ≃ₐ[K] L) x) = w.1 x := by + have hσ := + (mem_absoluteValueDecompositionGroup_iff_extensionConjugate_eq + vK hvK w (σ : L ≃ₐ[K] L)).mp σ.property + have hx := congrArg (fun q : AbsoluteValueExtension vK L => q.1 x) hσ + simpa [absoluteValueExtensionConjugate, + absoluteValueConjugate, AbsoluteValue.comp] using hx + +omit hvK + +variable [IsGalois K L] + +include hvK + +/-- Every automorphism of the algebraic localization over `K_v` preserves its +unique extended absolute value. -/ +theorem localizationAbsoluteValue_algEquiv + (τ : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + AbsoluteValue.algebraicLocalization vK w.1 w.2 ≃ₐ[vK.Completion] + AbsoluteValue.algebraicLocalization vK w.1 w.2) + (x : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + AbsoluteValue.algebraicLocalization vK w.1 w.2) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 (τ x) = + AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 x := by + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + let vhat := AbsoluteValue.completionAbsoluteValue vK + let wloc := AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 + let : Algebra.IsAlgebraic vK.Completion E := + AbsoluteValue.algebraicLocalization_isAlgebraic vK w.1 w.2 + let R := AbsoluteValue.uniqueAlgebraicExtension + (K := vK.Completion) (L := E) vhat + (AbsoluteValue.completionAbsoluteValue_complete vK) + (AbsoluteValue.completionAbsoluteValue_isNontrivial vK hvK) + have hwloc : wloc = R.extension := by + apply R.unique + intro y + exact AbsoluteValue.algebraicLocalizationAbsoluteValue_extends vK w.1 w.2 y + let wconj : AbsoluteValue E ℝ := + wloc.comp (f := τ.toRingEquiv.toRingHom) τ.injective + have hwconj : wconj = R.extension := by + apply R.unique + intro y + change wloc (τ (algebraMap vK.Completion E y)) = vhat y + rw [τ.commutes] + exact AbsoluteValue.algebraicLocalizationAbsoluteValue_extends vK w.1 w.2 y + have h := congrArg (fun q : AbsoluteValue E ℝ => q x) + (hwconj.trans hwloc.symm) + exact h + +omit hvK + +/-- Restrict a local automorphism to `L`. Normality of `L/K` ensures that +the image of the dense algebraic copy of `L` is again that copy. -/ +def localizationAlgEquivRestrict + (τ : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + AbsoluteValue.algebraicLocalization vK w.1 w.2 ≃ₐ[vK.Completion] + AbsoluteValue.algebraicLocalization vK w.1 w.2) : L ≃ₐ[K] L := by + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + let i : L →+* E := AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + letI : Algebra K E := (i.comp (algebraMap K L)).toAlgebra + let iAlg : L →ₐ[K] E := + { __ := i + commutes' := fun x => by + change i (algebraMap K L x) = (i.comp (algebraMap K L)) x + rfl } + letI : Algebra L E := i.toAlgebra + letI : IsScalarTower K L E := + IsScalarTower.of_algebraMap_eq' rfl + let τK : E ≃ₐ[K] E := + { __ := τ.toRingEquiv + commutes' := fun x => by + change τ (i (algebraMap K L x)) = i (algebraMap K L x) + rw [AbsoluteValue.toAlgebraicLocalization_algebraMap, τ.commutes] } + exact Normal.algHomEquivAut K E L (τK.toAlgHom.comp iAlg) + +/-- The normality restriction is characterized by its action on the embedded +copy of `L`. -/ +theorem localizationAlgEquivRestrict_toLocalization + (τ : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + AbsoluteValue.algebraicLocalization vK w.1 w.2 ≃ₐ[vK.Completion] + AbsoluteValue.algebraicLocalization vK w.1 w.2) + (x : L) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + (localizationAlgEquivRestrict vK w τ x) = + τ (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x) := by + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + let i : L →+* E := AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + let : Algebra K E := (i.comp (algebraMap K L)).toAlgebra + let iAlg : L →ₐ[K] E := + { __ := i + commutes' := fun x => by + change i (algebraMap K L x) = (i.comp (algebraMap K L)) x + rfl } + let : Algebra L E := i.toAlgebra + let : IsScalarTower K L E := + IsScalarTower.of_algebraMap_eq' rfl + let τK : E ≃ₐ[K] E := + { __ := τ.toRingEquiv + commutes' := fun y => by + change τ (i (algebraMap K L y)) = i (algebraMap K L y) + rw [AbsoluteValue.toAlgebraicLocalization_algebraMap, τ.commutes] } + change i (Normal.algHomEquivAut K E L (τK.toAlgHom.comp iAlg) x) = + τ (i x) + simpa [iAlg, τK, AlgHom.restrictNormal', RingHom.algebraMap_toAlgebra] using + ((τK.toAlgHom.comp iAlg).restrictNormal_commutes L x) + +/-- Restriction of a local automorphism belongs to the decomposition group. -/ +def localizationToDecompositionGroup + (τ : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + AbsoluteValue.algebraicLocalization vK w.1 w.2 ≃ₐ[vK.Completion] + AbsoluteValue.algebraicLocalization vK w.1 w.2) : + absoluteValueDecompositionGroup K w.1 := by + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + let σ := localizationAlgEquivRestrict vK w τ + refine ⟨σ, ?_⟩ + intro x + have habs : w.1 (σ x) = w.1 x := by + calc + w.1 (σ x) = AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 (σ x)) := + (AbsoluteValue.algebraicLocalizationAbsoluteValue_toAlgebraicLocalization vK w.1 w.2 (σ + x)).symm + _ = AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 + (τ (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x)) := by + rw [localizationAlgEquivRestrict_toLocalization] + _ = AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x) := + localizationAbsoluteValue_algEquiv vK hvK w τ _ + _ = w.1 x := + AbsoluteValue.algebraicLocalizationAbsoluteValue_toAlgebraicLocalization vK w.1 w.2 x + rw [habs] + +include hvK + +/-- Extend an element of the decomposition group from `L` to the algebraic +localization `L_w`. -/ +def decompositionGroupToLocalization + (σ : absoluteValueDecompositionGroup K w.1) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + AbsoluteValue.algebraicLocalization vK w.1 w.2 ≃ₐ[vK.Completion] + AbsoluteValue.algebraicLocalization vK w.1 w.2 := + valuationPreservingLocalizationAlgEquiv vK w (σ : L ≃ₐ[K] L) + (absoluteValueDecompositionGroup_preserves_absoluteValue vK hvK w σ) + +omit [IsGalois K L] in +@[simp] theorem decompositionGroupToLocalization_toLocalization + (σ : absoluteValueDecompositionGroup K w.1) (x : L) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + decompositionGroupToLocalization vK hvK w σ + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x) = + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 ((σ : L ≃ₐ[K] L) x) := + valuationPreservingLocalizationAlgEquiv_toLocalization vK w + (σ : L ≃ₐ[K] L) + (absoluteValueDecompositionGroup_preserves_absoluteValue vK hvK w σ) x + +omit hvK + +include hvK + +/-- Restriction after extension is the original element of the decomposition +group. -/ +theorem localizationToDecompositionGroup_decompositionGroupToLocalization + (σ : absoluteValueDecompositionGroup K w.1) : + localizationToDecompositionGroup vK hvK w + (decompositionGroupToLocalization vK hvK w σ) = σ := by + apply Subtype.ext + apply AlgEquiv.ext + intro x + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let i := AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + apply i.injective + calc + i ((localizationToDecompositionGroup vK hvK w + (decompositionGroupToLocalization vK hvK w σ) : + L ≃ₐ[K] L) x) = + decompositionGroupToLocalization vK hvK w σ (i x) := + localizationAlgEquivRestrict_toLocalization vK w + (decompositionGroupToLocalization vK hvK w σ) x + _ = i ((σ : L ≃ₐ[K] L) x) := + decompositionGroupToLocalization_toLocalization vK hvK w σ x + +/-- Extension after restriction is the original local automorphism. -/ +theorem decompositionGroupToLocalization_localizationToDecompositionGroup + (τ : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + AbsoluteValue.algebraicLocalization vK w.1 w.2 ≃ₐ[vK.Completion] + AbsoluteValue.algebraicLocalization vK w.1 w.2) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + decompositionGroupToLocalization vK hvK w + (localizationToDecompositionGroup vK hvK w τ) = τ := by + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let i := AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + let ρ := decompositionGroupToLocalization vK hvK w + (localizationToDecompositionGroup vK hvK w τ) + have hρ : ρ.toAlgHom = τ.toAlgHom := by + apply IntermediateField.adjoin_algHom_ext + intro z hz + rcases hz with ⟨x, rfl⟩ + change ρ (i x) = τ (i x) + rw [decompositionGroupToLocalization_toLocalization] + change i (localizationAlgEquivRestrict vK w τ x) = τ (i x) + exact localizationAlgEquivRestrict_toLocalization vK w τ x + exact AlgEquiv.ext fun x => DFunLike.congr_fun hρ x + +omit hvK + +include hvK + +omit [IsGalois K L] in +/-- Extension from the decomposition group respects composition. -/ +theorem decompositionGroupToLocalization_mul + (σ τ : absoluteValueDecompositionGroup K w.1) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + decompositionGroupToLocalization vK hvK w (σ * τ) = + decompositionGroupToLocalization vK hvK w σ * + decompositionGroupToLocalization vK hvK w τ := by + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let i := AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + let ρL := decompositionGroupToLocalization vK hvK w (σ * τ) + let ρR := decompositionGroupToLocalization vK hvK w σ * + decompositionGroupToLocalization vK hvK w τ + have hρ : ρL.toAlgHom = ρR.toAlgHom := by + apply IntermediateField.adjoin_algHom_ext + intro z hz + rcases hz with ⟨x, rfl⟩ + change ρL (i x) = ρR (i x) + calc + ρL (i x) = i (((σ * τ : absoluteValueDecompositionGroup K w.1) : + L ≃ₐ[K] L) x) := + decompositionGroupToLocalization_toLocalization vK hvK w (σ * τ) x + _ = i ((σ : L ≃ₐ[K] L) ((τ : L ≃ₐ[K] L) x)) := rfl + _ = decompositionGroupToLocalization vK hvK w σ + (i ((τ : L ≃ₐ[K] L) x)) := + (decompositionGroupToLocalization_toLocalization + vK hvK w σ ((τ : L ≃ₐ[K] L) x)).symm + _ = decompositionGroupToLocalization vK hvK w σ + (decompositionGroupToLocalization vK hvK w τ (i x)) := by + exact congrArg (decompositionGroupToLocalization vK hvK w σ) + (decompositionGroupToLocalization_toLocalization + vK hvK w τ x).symm + _ = ρR (i x) := rfl + exact AlgEquiv.ext fun x => DFunLike.congr_fun hρ x + +omit hvK + +include hvK + +/-- The localization and decomposition comparison (decomposition groups): for a possibly +infinite Galois +extension, the decomposition group at `w` is canonically isomorphic to the +Galois group of the algebraic localization over `K_v`. -/ +def decompositionGroupEquivAlgebraicLocalizationAut : + absoluteValueDecompositionGroup K w.1 ≃* + (letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + AbsoluteValue.algebraicLocalization vK w.1 w.2 ≃ₐ[vK.Completion] + AbsoluteValue.algebraicLocalization vK w.1 w.2) where + toFun := decompositionGroupToLocalization vK hvK w + invFun := localizationToDecompositionGroup vK hvK w + left_inv := localizationToDecompositionGroup_decompositionGroupToLocalization + vK hvK w + right_inv := + decompositionGroupToLocalization_localizationToDecompositionGroup vK hvK w + map_mul' := decompositionGroupToLocalization_mul vK hvK w + +@[simp] theorem localizationRamificationGroups_decompositionGroupEquiv_apply + (σ : absoluteValueDecompositionGroup K w.1) : + decompositionGroupEquivAlgebraicLocalizationAut vK hvK w σ = + decompositionGroupToLocalization vK hvK w σ := + rfl + +@[simp] theorem localizationRamificationGroups_decompositionGroupEquiv_symm_apply + (τ : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + AbsoluteValue.algebraicLocalization vK w.1 w.2 ≃ₐ[vK.Completion] + AbsoluteValue.algebraicLocalization vK w.1 w.2) : + (decompositionGroupEquivAlgebraicLocalizationAut vK hvK w).symm τ = + localizationToDecompositionGroup vK hvK w τ := + rfl + +theorem localizationRamificationGroups_decompositionGroupEquiv_toLocalization + (σ : absoluteValueDecompositionGroup K w.1) (x : L) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + decompositionGroupEquivAlgebraicLocalizationAut vK hvK w σ + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x) = + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 ((σ : L ≃ₐ[K] L) x) := + decompositionGroupToLocalization_toLocalization vK hvK w σ x + +omit hvK + +end DecompositionEquiv + +end HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean new file mode 100644 index 0000000000..61e092dcb6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean @@ -0,0 +1,353 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ResidueField +/-! +# Conjugation and base change + +This file proves functoriality of the decomposition, inertia, and +ramification groups under a commutative square of field embeddings. Only +normality of the lower extension is needed to restrict conjugation to its +Galois group. The decomposition statement for absolute values includes +the archimedean case; the valuation-subring statements give the three +nonarchimedean homomorphisms. +-/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.ResidueField renaming + residue_eq_residue_iff_sub_mem_maximalIdeal → + residue_eq_residue_iff_sub_mem_maximalIdeal + + +noncomputable +section + +universe u v u' v' + +namespace HilbertRamification + +open AlgebraicNumberTheory.Valuations +open scoped Pointwise + +variable {K : Type u} {L : Type v} {K' : Type u'} {L' : Type v'} +variable [Field K] [Field L] [Field K'] [Field L'] +variable [Algebra K L] [Algebra K' L'] + +section GaloisPullback + +variable (tauK : K →+* K') (tauL : L →+* L') +variable (hsquare : tauL.comp (algebraMap K L) = + (algebraMap K' L').comp tauK) +variable [Normal K L] + +include hsquare in +/-- Restrict an automorphism through a commutative square of field embeddings. -/ +def galoisPullbackElement (sigma : L' ≃ₐ[K'] L') : L ≃ₐ[K] L := by + letI : Algebra K K' := tauK.toAlgebra + letI : Algebra K L' := ((algebraMap K' L').comp tauK).toAlgebra + letI : Algebra L L' := tauL.toAlgebra + letI : IsScalarTower K K' L' := + IsScalarTower.of_algebraMap_eq' rfl + letI : IsScalarTower K L L' := + IsScalarTower.of_algebraMap_eq' (by + simpa only [RingHom.algebraMap_toAlgebra] using hsquare.symm) + let tauLK : L →ₐ[K] L' := + { tauL with + commutes' := fun x => by + exact (congrFun (RingHom.coe_coe tauL) _).trans + (DFunLike.congr_fun hsquare x) } + exact + Normal.algHomEquivAut K L' L + ((sigma.restrictScalars K).toAlgHom.comp + tauLK) + +private theorem galoisPullbackElement_commutes + (sigma : L' ≃ₐ[K'] L') (x : L) : + tauL (galoisPullbackElement tauK tauL hsquare sigma x) = + sigma (tauL x) := by + let : Algebra K K' := tauK.toAlgebra + let : Algebra K L' := ((algebraMap K' L').comp tauK).toAlgebra + let : Algebra L L' := tauL.toAlgebra + let : IsScalarTower K K' L' := + IsScalarTower.of_algebraMap_eq' rfl + let : IsScalarTower K L L' := + IsScalarTower.of_algebraMap_eq' (by + simpa only [RingHom.algebraMap_toAlgebra] using hsquare.symm) + let tauLK : L →ₐ[K] L' := + { tauL with + commutes' := fun y => by + exact (congrFun (RingHom.coe_coe tauL) _).trans + (DFunLike.congr_fun hsquare y) } + change algebraMap L L' + (galoisPullbackElement tauK tauL hsquare sigma x) = _ + change algebraMap L L' + ((((sigma.restrictScalars K).toAlgHom.comp tauLK).restrictNormal' L) x) = _ + rw [show + (((sigma.restrictScalars K).toAlgHom.comp tauLK).restrictNormal' L) x = + (((sigma.restrictScalars K).toAlgHom.comp tauLK).restrictNormal L) x by + apply congrFun + exact AlgEquiv.coe_ofBijective _ _] + rw [AlgHom.restrictNormal_commutes] + rfl + +include hsquare in +/-- The conjugation and base-change law: conjugation along a commutative +square restricts to a homomorphism on Galois groups. -/ +def galoisPullbackGaloisPullback : (L' ≃ₐ[K'] L') →* (L ≃ₐ[K] L) where + toFun := galoisPullbackElement tauK tauL hsquare + map_one' := by + ext x + apply tauL.injective + rw [galoisPullbackElement_commutes] + simp + map_mul' sigma rho := by + ext x + apply tauL.injective + rw [galoisPullbackElement_commutes] + change sigma (rho (tauL x)) = + tauL (galoisPullbackElement tauK tauL hsquare sigma + (galoisPullbackElement tauK tauL hsquare rho x)) + rw [galoisPullbackElement_commutes, galoisPullbackElement_commutes] + +/-- The defining equation `tauL (tau^* sigma x) = sigma (tauL x)`. -/ +@[simp] theorem galoisPullback_galoisPullback_commutes + (sigma : L' ≃ₐ[K'] L') (x : L) : + tauL (galoisPullbackGaloisPullback tauK tauL hsquare sigma x) = + sigma (tauL x) := + galoisPullbackElement_commutes tauK tauL hsquare sigma x + +include hsquare in +/-- The conjugation and base-change law, including the archimedean case: the pullback on Galois +groups sends the decomposition group of `w'` to the decomposition group of +the pulled-back absolute value. -/ +def galoisPullbackAbsoluteValueDecompositionGroupMap (w' : AbsoluteValue L' ℝ) : + absoluteValueDecompositionGroup K' w' →* + absoluteValueDecompositionGroup K (w'.comp (f := tauL) tauL.injective) where + toFun sigma := + ⟨galoisPullbackGaloisPullback tauK tauL hsquare (sigma : L' ≃ₐ[K'] L'), by + intro x + change w' (tauL + (galoisPullbackGaloisPullback tauK tauL hsquare + (sigma : L' ≃ₐ[K'] L') x)) < 1 ↔ + w' (tauL x) < 1 + rw [galoisPullback_galoisPullback_commutes] + exact sigma.property (tauL x)⟩ + map_one' := by + apply Subtype.ext + exact map_one (galoisPullbackGaloisPullback tauK tauL hsquare) + map_mul' sigma rho := by + apply Subtype.ext + exact map_mul (galoisPullbackGaloisPullback tauK tauL hsquare) + (sigma : L' ≃ₐ[K'] L') (rho : L' ≃ₐ[K'] L') + +namespace ValuationSubring + +open RamificationTheory.HilbertRamification.ValuationSubring + +variable (A' : _root_.ValuationSubring L') + +/-- The valuation subring pulled back along the field embedding. -/ +abbrev pulledValuationSubring : _root_.ValuationSubring L := + A'.comap tauL + +private theorem mem_nonunits_pulled_iff (x : L) : + x ∈ (pulledValuationSubring tauL A').nonunits ↔ + tauL x ∈ A'.nonunits := by + rw [_root_.ValuationSubring.mem_nonunits_iff_or, + _root_.ValuationSubring.mem_nonunits_iff_or] + constructor + · rintro (rfl | hx) + · exact Or.inl (map_zero tauL) + · exact Or.inr (by + simpa only [map_inv₀, _root_.ValuationSubring.mem_comap] using hx) + · rintro (hx | hx) + · exact Or.inl (tauL.injective (by simpa using hx)) + · exact Or.inr (by + simpa only [map_inv₀, _root_.ValuationSubring.mem_comap] using hx) + +private theorem units_map_mem_principalUnitGroup_iff (x : Lˣ) : + Units.map tauL x ∈ A'.principalUnitGroup ↔ + x ∈ (pulledValuationSubring tauL A').principalUnitGroup := by + rw [_root_.ValuationSubring.mem_principalUnitGroup_iff, + _root_.ValuationSubring.mem_principalUnitGroup_iff] + have h := (mem_nonunits_pulled_iff tauL A' ((x : L) - 1)).symm + have hcoe : + (↑(Units.map (tauL : L →* L') x) : L') = tauL (x : L) := + (Units.coe_map (tauL : L →* L') x).trans + (congrFun (RingHom.coe_coe tauL) _) + rw [hcoe] + simpa only [_root_.ValuationSubring.mem_nonunits_iff, map_sub, map_one] using h + +private theorem mem_inertiaGroup_iff_sub_mem_nonunits + {F : Type*} {E : Type*} [Field F] [Field E] [Algebra F E] + (A : _root_.ValuationSubring E) (sigma : decompositionGroup F A) : + sigma ∈ inertiaGroup F A ↔ + ∀ x : A, + ((sigma : E ≃ₐ[F] E) (x : E) - (x : E)) ∈ A.nonunits := by + change residueAction F A sigma = 1 ↔ _ + constructor + · intro hsigma x + have happ := congrArg + (fun e : IsLocalRing.ResidueField A ≃+* IsLocalRing.ResidueField A => + e (IsLocalRing.residue A x)) hsigma + change sigma • (IsLocalRing.residue A x) = + IsLocalRing.residue A x at happ + rw [← IsLocalRing.ResidueField.residue_smul, + residue_eq_residue_iff_sub_mem_maximalIdeal] + at happ + exact A.coe_mem_nonunits_iff.mpr happ + · intro hsigma + apply RingEquiv.ext + intro y + obtain ⟨x, rfl⟩ := IsLocalRing.residue_surjective y + change sigma • (IsLocalRing.residue A x) = + IsLocalRing.residue A x + rw [← IsLocalRing.ResidueField.residue_smul, + residue_eq_residue_iff_sub_mem_maximalIdeal] + exact A.coe_mem_nonunits_iff.mp (hsigma x) + +include hsquare in +/-- The conjugation and base-change law in the valuation-subring model: decomposition groups map +under pullback along the commutative square. -/ +def galoisPullbackDecompositionGroupMap : + decompositionGroup K' A' →* + decompositionGroup K (pulledValuationSubring tauL A') where + toFun sigma := + ⟨galoisPullbackGaloisPullback tauK tauL hsquare (sigma : L' ≃ₐ[K'] L'), by + ext x + rw [_root_.ValuationSubring.mem_pointwise_smul_iff_inv_smul_mem] + change tauL + ((galoisPullbackGaloisPullback tauK tauL hsquare + (sigma : L' ≃ₐ[K'] L'))⁻¹ x) ∈ A' ↔ + tauL x ∈ A' + have hinv := galoisPullback_galoisPullback_commutes + tauK tauL hsquare ((sigma : L' ≃ₐ[K'] L')⁻¹) x + rw [← map_inv, hinv] + have hsigma : (sigma : L' ≃ₐ[K'] L') • A' = A' := sigma.property + have hmem := + congrArg (fun B : _root_.ValuationSubring L' => tauL x ∈ B) hsigma + simp only [_root_.ValuationSubring.mem_pointwise_smul_iff_inv_smul_mem, + AlgEquiv.smul_def] at hmem + exact ⟨fun h => hmem.mp h, fun h => hmem.symm.mp h⟩⟩ + map_one' := by + apply Subtype.ext + exact map_one (galoisPullbackGaloisPullback tauK tauL hsquare) + map_mul' sigma rho := by + apply Subtype.ext + exact map_mul (galoisPullbackGaloisPullback tauK tauL hsquare) + (sigma : L' ≃ₐ[K'] L') (rho : L' ≃ₐ[K'] L') + +private theorem decompositionGroupMap_commutes + (sigma : decompositionGroup K' A') (x : L) : + tauL ((((galoisPullbackDecompositionGroupMap tauK tauL hsquare A' sigma : + decompositionGroup K (pulledValuationSubring tauL A')) : + L ≃ₐ[K] L) x)) = + (sigma : L' ≃ₐ[K'] L') (tauL x) := + galoisPullback_galoisPullback_commutes tauK tauL hsquare + (sigma : L' ≃ₐ[K'] L') x + +include hsquare in +/-- The conjugation and base-change law in the valuation-subring model: inertia groups map under +pullback along the commutative square. -/ +def galoisPullbackInertiaGroupMap : + inertiaGroup K' A' →* + inertiaGroup K (pulledValuationSubring tauL A') where + toFun sigma := by + let delta := galoisPullbackDecompositionGroupMap tauK tauL hsquare A' + (sigma : decompositionGroup K' A') + refine ⟨delta, by + rw [mem_inertiaGroup_iff_sub_mem_nonunits] + intro x + rw [mem_nonunits_pulled_iff] + rw [map_sub, decompositionGroupMap_commutes] + exact (mem_inertiaGroup_iff_sub_mem_nonunits A' + (sigma : decompositionGroup K' A')).mp sigma.property + ⟨tauL (x : L), x.property⟩⟩ + map_one' := by + apply Subtype.ext + exact map_one (galoisPullbackDecompositionGroupMap tauK tauL hsquare A') + map_mul' sigma rho := by + apply Subtype.ext + exact map_mul (galoisPullbackDecompositionGroupMap tauK tauL hsquare A') + (sigma : decompositionGroup K' A') (rho : decompositionGroup K' A') + +private theorem inertiaGroupMap_commutes + (sigma : inertiaGroup K' A') (x : L) : + tauL (((((galoisPullbackInertiaGroupMap tauK tauL hsquare A' sigma : + inertiaGroup K (pulledValuationSubring tauL A')) : + decompositionGroup K (pulledValuationSubring tauL A')) : + L ≃ₐ[K] L) x)) = + (((sigma : inertiaGroup K' A') : decompositionGroup K' A') : + L' ≃ₐ[K'] L') (tauL x) := by + simpa [galoisPullbackInertiaGroupMap] using + decompositionGroupMap_commutes tauK tauL hsquare A' + (sigma : decompositionGroup K' A') x + +private theorem automorphismUnitQuotient_map + (sigma : inertiaGroup K' A') (x : Lˣ) : + Units.map tauL + (automorphismUnitQuotient K (pulledValuationSubring tauL A') + ((galoisPullbackInertiaGroupMap tauK tauL hsquare A' sigma : + inertiaGroup K (pulledValuationSubring tauL A')) : + decompositionGroup K (pulledValuationSubring tauL A')) x) = + automorphismUnitQuotient K' A' + (sigma : decompositionGroup K' A') (Units.map tauL x) := by + ext + simp [automorphismUnitQuotient, inertiaGroupMap_commutes] + +private theorem ramificationPredicate_map + (sigma : inertiaGroup K' A') + (hsigma : ∀ y : L'ˣ, + automorphismUnitQuotient K' A' (sigma : decompositionGroup K' A') y ∈ + A'.principalUnitGroup) : + ∀ x : Lˣ, + automorphismUnitQuotient K (pulledValuationSubring tauL A') + ((galoisPullbackInertiaGroupMap tauK tauL hsquare A' sigma : + inertiaGroup K (pulledValuationSubring tauL A')) : + decompositionGroup K (pulledValuationSubring tauL A')) x ∈ + (pulledValuationSubring tauL A').principalUnitGroup := by + intro x + specialize hsigma (Units.map tauL x) + rw [← units_map_mem_principalUnitGroup_iff tauL A'] + rw [automorphismUnitQuotient_map] + exact hsigma + +include hsquare in +/-- The conjugation and base-change law in the valuation-subring model: ramification groups map +under pullback along the commutative square. -/ +def galoisPullbackRamificationGroupMap : + ramificationGroup K' A' →* + ramificationGroup K (pulledValuationSubring tauL A') := + ((galoisPullbackInertiaGroupMap tauK tauL hsquare A').domRestrict + (ramificationGroup K' A')).codRestrict + (ramificationGroup K (pulledValuationSubring tauL A')) + (fun sigma => by + change ∀ x : Lˣ, + automorphismUnitQuotient K (pulledValuationSubring tauL A') + ((galoisPullbackInertiaGroupMap tauK tauL hsquare A' + (sigma : inertiaGroup K' A') : + inertiaGroup K (pulledValuationSubring tauL A')) : + decompositionGroup K (pulledValuationSubring tauL A')) x ∈ + (pulledValuationSubring tauL A').principalUnitGroup + apply ramificationPredicate_map tauK tauL hsquare A' + have hsigma := sigma.property + change ∀ y : L'ˣ, + automorphismUnitQuotient K' A' + ((sigma : inertiaGroup K' A') : decompositionGroup K' A') y ∈ + A'.principalUnitGroup at hsigma + exact hsigma) + +end ValuationSubring + +end GaloisPullback + +end HilbertRamification + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CharacterMap.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CharacterMap.lean new file mode 100644 index 0000000000..ddd7face77 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CharacterMap.lean @@ -0,0 +1,957 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationGroup + +/-! # Character Map -/ + +@[expose] public section +namespace RamificationTheory + +/-! +# Hilbert ramification theory: character-map source + +This file records the source lemmas for the canonical map +`I_w -> Hom(Delta / Gamma, lambda*)` in prime-decomposition theory. We do not +package the final value-group quotient here. Instead, we prove the pieces +which make the formula + +`x ↦ (σ x / x) mod U^1` + +independent of the unit and base-unit choices used to represent a value class, +and we identify the ramification group as the subgroup on which all these +classes are trivial. +-/ + +noncomputable +section + +universe u v + +namespace HilbertRamification +namespace ValuationSubring + + +variable (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + +/-- The unit quotient is multiplicative in the unit argument. -/ +theorem automorphismUnitQuotient_mul_arg + (A : _root_.ValuationSubring L) (σ : decompositionGroup K A) + (x y : Lˣ) : + automorphismUnitQuotient K A σ (x * y) = + automorphismUnitQuotient K A σ x * + automorphismUnitQuotient K A σ y := by + ext + simp [automorphismUnitQuotient, div_eq_mul_inv, mul_assoc, mul_left_comm, + mul_comm] + +/-- The unit quotient is trivial on the unit `1`. -/ +theorem automorphismUnitQuotient_one_arg + (A : _root_.ValuationSubring L) (σ : decompositionGroup K A) : + automorphismUnitQuotient K A σ 1 = 1 := by + ext + simp [automorphismUnitQuotient] + +/-- A `K`-unit contributes trivially to the unit quotient. -/ +theorem automorphismUnitQuotient_algebraMapUnit + (A : _root_.ValuationSubring L) (σ : decompositionGroup K A) (a : Kˣ) : + automorphismUnitQuotient K A σ + (Units.map (algebraMap K L).toMonoidHom a) = 1 := by + ext + simp [automorphismUnitQuotient] + +/-- Prime-decomposition statement: +an inertia element sends valuation-ring units to the same residue class, hence +its unit quotient on such a unit is principal. -/ +theorem inertia_automorphismUnitQuotient_mem_principalUnitGroup_of_mem_unitGroup + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) + {u : Lˣ} (hu : u ∈ A.unitGroup) : + automorphismUnitQuotient K A (σ : decompositionGroup K A) u ∈ + A.principalUnitGroup := by + let uA : A.unitGroup := ⟨u, hu⟩ + let eA : A ≃+* A := + MulSemiringAction.toRingEquiv + (decompositionGroup K A) A (σ : decompositionGroup K A) + let qA : A.unitGroup := + A.unitGroupMulEquiv.symm + (Units.mapEquiv eA.toMulEquiv (A.unitGroupMulEquiv uA) / + A.unitGroupMulEquiv uA) + have hres : + Units.map (IsLocalRing.residue A).toMonoidHom + (Units.mapEquiv eA.toMulEquiv (A.unitGroupMulEquiv uA)) = + Units.map (IsLocalRing.residue A).toMonoidHom + (A.unitGroupMulEquiv uA) := by + ext + change + IsLocalRing.residue A + (MulSemiringAction.toRingEquiv + (decompositionGroup K A) A (σ : decompositionGroup K A) + (A.unitGroupMulEquiv uA : A)) = + IsLocalRing.residue A (A.unitGroupMulEquiv uA : A) + calc + IsLocalRing.residue A + (MulSemiringAction.toRingEquiv + (decompositionGroup K A) A (σ : decompositionGroup K A) + (A.unitGroupMulEquiv uA : A)) = + (σ : decompositionGroup K A) • + IsLocalRing.residue A (A.unitGroupMulEquiv uA : A) := by + change + IsLocalRing.residue A + ((σ : decompositionGroup K A) • + (A.unitGroupMulEquiv uA : A)) = + (σ : decompositionGroup K A) • + IsLocalRing.residue A (A.unitGroupMulEquiv uA : A) + exact + IsLocalRing.ResidueField.residue_smul + (R := A) (G := decompositionGroup K A) + (σ : decompositionGroup K A) (A.unitGroupMulEquiv uA : A) + _ = IsLocalRing.residue A (A.unitGroupMulEquiv uA : A) := by + have hσ : + residueAction K A (σ : decompositionGroup K A) = 1 := + MonoidHom.mem_ker.mp σ.property + change + (residueAction K A (σ : decompositionGroup K A)) + (IsLocalRing.residue A (A.unitGroupMulEquiv uA : A)) = + IsLocalRing.residue A (A.unitGroupMulEquiv uA : A) + rw [hσ] + rfl + have hq : (qA : Lˣ) ∈ A.principalUnitGroup := by + rw [A.coe_mem_principalUnitGroup_iff (x := qA)] + rw [MonoidHom.mem_ker] + change + Units.map (IsLocalRing.residue A).toMonoidHom + (Units.mapEquiv eA.toMulEquiv (A.unitGroupMulEquiv uA) / + A.unitGroupMulEquiv uA) = 1 + rw [map_div, hres] + simp only [div_eq_mul_inv, mul_inv_cancel] + have hq_coe : + (qA : Lˣ) = + automorphismUnitQuotient K A (σ : decompositionGroup K A) u := by + ext + rfl + rw [← hq_coe] + exact hq + +/-- Prime-decomposition statement: +for `σ ∈ I_w`, the class of `σ x / x` modulo principal units. This is the +raw class from which the character `χ_σ` is assembled after quotienting the +value group. -/ +abbrev inertiaUnitQuotientClass + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) (x : Lˣ) : + Lˣ ⧸ A.principalUnitGroup := + QuotientGroup.mk + (automorphismUnitQuotient K A (σ : decompositionGroup K A) x) + +/-- States the theorem `inertiaUnitQuotientClass_eq_one_iff`. -/ +theorem inertiaUnitQuotientClass_eq_one_iff + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) (x : Lˣ) : + inertiaUnitQuotientClass K A σ x = 1 ↔ + automorphismUnitQuotient K A (σ : decompositionGroup K A) x ∈ + A.principalUnitGroup := + QuotientGroup.eq_one_iff _ + +/-- Multiplying the representative by a valuation-ring unit does not change +the class of `σ x / x` modulo principal units. -/ +theorem inertiaUnitQuotientClass_mul_right_unit + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) + (x u : Lˣ) (hu : u ∈ A.unitGroup) : + inertiaUnitQuotientClass K A σ (x * u) = + inertiaUnitQuotientClass K A σ x := by + have hquot : + automorphismUnitQuotient K A (σ : decompositionGroup K A) (x * u) = + automorphismUnitQuotient K A (σ : decompositionGroup K A) x * + automorphismUnitQuotient K A (σ : decompositionGroup K A) u := + automorphismUnitQuotient_mul_arg (K := K) A + (σ : decompositionGroup K A) x u + have hu' : + automorphismUnitQuotient K A (σ : decompositionGroup K A) u ∈ + A.principalUnitGroup := + inertia_automorphismUnitQuotient_mem_principalUnitGroup_of_mem_unitGroup + (K := K) A σ hu + change + (QuotientGroup.mk + (automorphismUnitQuotient K A (σ : decompositionGroup K A) (x * u)) : + Lˣ ⧸ A.principalUnitGroup) = + QuotientGroup.mk + (automorphismUnitQuotient K A (σ : decompositionGroup K A) x) + rw [hquot] + exact QuotientGroup.mk_mul_of_mem + (automorphismUnitQuotient K A (σ : decompositionGroup K A) x) hu' + +/-- Valuation-ring units map to the trivial raw class. -/ +theorem inertiaUnitQuotientClass_eq_one_of_mem_unitGroup + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) + {u : Lˣ} (hu : u ∈ A.unitGroup) : + inertiaUnitQuotientClass K A σ u = 1 := + (inertiaUnitQuotientClass_eq_one_iff (K := K) A σ u).mpr + (inertia_automorphismUnitQuotient_mem_principalUnitGroup_of_mem_unitGroup + (K := K) A σ hu) + +/-- Multiplying the representative by a base-field unit does not change the +class of `σ x / x`. -/ +theorem inertiaUnitQuotientClass_mul_right_algebraMapUnit + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) + (x : Lˣ) (a : Kˣ) : + inertiaUnitQuotientClass K A σ + (x * Units.map (algebraMap K L).toMonoidHom a) = + inertiaUnitQuotientClass K A σ x := by + have hquot : + automorphismUnitQuotient K A (σ : decompositionGroup K A) + (x * Units.map (algebraMap K L).toMonoidHom a) = + automorphismUnitQuotient K A (σ : decompositionGroup K A) x * + automorphismUnitQuotient K A (σ : decompositionGroup K A) + (Units.map (algebraMap K L).toMonoidHom a) := + automorphismUnitQuotient_mul_arg (K := K) A + (σ : decompositionGroup K A) x + (Units.map (algebraMap K L).toMonoidHom a) + have ha : + automorphismUnitQuotient K A (σ : decompositionGroup K A) + (Units.map (algebraMap K L).toMonoidHom a) = 1 := + automorphismUnitQuotient_algebraMapUnit (K := K) A + (σ : decompositionGroup K A) a + change + (QuotientGroup.mk + (automorphismUnitQuotient K A (σ : decompositionGroup K A) + (x * Units.map (algebraMap K L).toMonoidHom a)) : + Lˣ ⧸ A.principalUnitGroup) = + QuotientGroup.mk + (automorphismUnitQuotient K A (σ : decompositionGroup K A) x) + rw [hquot, ha, mul_one] + +/-- Prime-decomposition statement: +the residue-unit class is unchanged when a representative is multiplied by a +base-field unit and then by a valuation-ring unit. -/ +theorem inertiaUnitQuotientClass_mul_right_algebraMapUnit_mul_unit + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) + (x : Lˣ) (a : Kˣ) (u : Lˣ) (hu : u ∈ A.unitGroup) : + inertiaUnitQuotientClass K A σ + ((x * Units.map (algebraMap K L).toMonoidHom a) * u) = + inertiaUnitQuotientClass K A σ x := by + rw [inertiaUnitQuotientClass_mul_right_unit + (K := K) A σ (x * Units.map (algebraMap K L).toMonoidHom a) u hu] + exact inertiaUnitQuotientClass_mul_right_algebraMapUnit + (K := K) A σ x a + +/-- Inertia-character exactness: +`R_w` is exactly the subgroup of inertia on which all raw residue-unit classes +`[σ x / x]` are trivial. -/ +theorem mem_ramificationGroup_iff_forall_inertiaUnitQuotientClass_eq_one + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) : + σ ∈ ramificationGroup K A ↔ + ∀ x : Lˣ, inertiaUnitQuotientClass K A σ x = 1 := by + rw [mem_ramificationGroup_iff] + constructor + · intro h x + exact (inertiaUnitQuotientClass_eq_one_iff (K := K) A σ x).mpr (h x) + · intro h x + exact (inertiaUnitQuotientClass_eq_one_iff (K := K) A σ x).mp (h x) + +/-- The quotient map `Lˣ/U^1 -> Lˣ/Aˣ`. It measures the remaining value +class of a raw residue-unit quotient. -/ +def principalUnitQuotientToValueClass + (A : _root_.ValuationSubring L) : + Lˣ ⧸ A.principalUnitGroup →* Lˣ ⧸ A.unitGroup := + QuotientGroup.map A.principalUnitGroup A.unitGroup + (MonoidHom.id Lˣ) + (by + intro x hx + exact A.principal_units_le_units hx) + +/-- States the theorem `principalUnitQuotientToValueClass_mk`. -/ +theorem principalUnitQuotientToValueClass_mk + (A : _root_.ValuationSubring L) (x : Lˣ) : + principalUnitQuotientToValueClass A + (QuotientGroup.mk' A.principalUnitGroup x) = + QuotientGroup.mk' A.unitGroup x := + rfl + +/-- The value displacement of a decomposition-group automorphism at `x`. It +is the class of `σ x / x` in the value-class quotient `Lˣ/Aˣ`. -/ +abbrev valueDisplacementClass + (A : _root_.ValuationSubring L) (σ : decompositionGroup K A) (x : Lˣ) : + Lˣ ⧸ A.unitGroup := + QuotientGroup.mk' A.unitGroup (automorphismUnitQuotient K A σ x) + +/-- States the theorem `valueDisplacementClass_eq_one_iff`. -/ +theorem valueDisplacementClass_eq_one_iff + (A : _root_.ValuationSubring L) (σ : decompositionGroup K A) (x : Lˣ) : + valueDisplacementClass K A σ x = 1 ↔ + automorphismUnitQuotient K A σ x ∈ A.unitGroup := + QuotientGroup.eq_one_iff _ + +/-- States the theorem `principalUnitQuotientToValueClass_inertiaUnitQuotientClass`. -/ +@[simp] theorem principalUnitQuotientToValueClass_inertiaUnitQuotientClass + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) (x : Lˣ) : + principalUnitQuotientToValueClass A + (inertiaUnitQuotientClass K A σ x) = + valueDisplacementClass K A (σ : decompositionGroup K A) x := + rfl + +/-- For fixed `σ`, value displacement is a group homomorphism on `Lˣ`. -/ +def valueDisplacementHom + (A : _root_.ValuationSubring L) (σ : decompositionGroup K A) : + Lˣ →* Lˣ ⧸ A.unitGroup where + toFun x := valueDisplacementClass K A σ x + map_one' := by + rw [valueDisplacementClass_eq_one_iff, + automorphismUnitQuotient_one_arg] + exact A.unitGroup.one_mem + map_mul' x y := by + change + QuotientGroup.mk' A.unitGroup + (automorphismUnitQuotient K A σ (x * y)) = + QuotientGroup.mk' A.unitGroup + (automorphismUnitQuotient K A σ x) * + QuotientGroup.mk' A.unitGroup + (automorphismUnitQuotient K A σ y) + rw [automorphismUnitQuotient_mul_arg] + exact map_mul (QuotientGroup.mk' A.unitGroup) + (automorphismUnitQuotient K A σ x) + (automorphismUnitQuotient K A σ y) + +/-- States the theorem `valueDisplacementHom_apply`. -/ +@[simp] theorem valueDisplacementHom_apply + (A : _root_.ValuationSubring L) (σ : decompositionGroup K A) (x : Lˣ) : + valueDisplacementHom K A σ x = + valueDisplacementClass K A σ x := + rfl + +/-- Prime-decomposition statement: +every element of `R_w` has trivial value displacement. This is the precise +boundary between the raw quotient `Lˣ/U^1` and the residue-unit target. -/ +theorem valueDisplacementClass_eq_one_of_mem_ramificationGroup + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) + (hσ : σ ∈ ramificationGroup K A) (x : Lˣ) : + valueDisplacementClass K A (σ : decompositionGroup K A) x = 1 := by + rw [valueDisplacementClass_eq_one_iff] + exact A.principal_units_le_units + ((mem_ramificationGroup_iff (K := K) A σ).mp hσ x) + +/-- In the valuation-subring model, the inertia elements whose value +displacement is trivial. For the chosen-valuation decomposition group +this condition is automatic; for mathlib's stabilizer of the valuation subring +it is the exact source needed to turn the raw `Lˣ/U^1` class into a residue +field unit. -/ +def valueTrivialInertiaGroup + (A : _root_.ValuationSubring L) : + Subgroup (inertiaGroup K A) where + carrier := + {σ | ∀ x : Lˣ, + valueDisplacementClass K A (σ : decompositionGroup K A) x = 1} + one_mem' := by + intro x + rw [valueDisplacementClass_eq_one_iff, + show ((1 : inertiaGroup K A) : decompositionGroup K A) = 1 by rfl, + automorphismUnitQuotient_one] + exact A.unitGroup.one_mem + mul_mem' := by + intro σ τ hσ hτ x + rw [valueDisplacementClass_eq_one_iff] + rw [show + ((σ * τ : inertiaGroup K A) : decompositionGroup K A) = + (σ : decompositionGroup K A) * (τ : decompositionGroup K A) by rfl] + rw [automorphismUnitQuotient_mul] + exact A.unitGroup.mul_mem + ((valueDisplacementClass_eq_one_iff (K := K) A + (σ : decompositionGroup K A) + (Units.mapEquiv (((τ : decompositionGroup K A) : L ≃ₐ[K] L).toMulEquiv) + x)).mp + (hσ _)) + ((valueDisplacementClass_eq_one_iff (K := K) A + (τ : decompositionGroup K A) x).mp + (hτ x)) + inv_mem' := by + intro σ hσ x + rw [valueDisplacementClass_eq_one_iff] + let y : Lˣ := + (Units.mapEquiv + ((((σ : inertiaGroup K A)⁻¹ : inertiaGroup K A) : + decompositionGroup K A) : L ≃ₐ[K] L).toMulEquiv) x + have hy : + automorphismUnitQuotient K A (σ : decompositionGroup K A) y ∈ + A.unitGroup := + (valueDisplacementClass_eq_one_iff (K := K) A + (σ : decompositionGroup K A) y).mp (hσ y) + have hquot : + automorphismUnitQuotient K A + ((σ⁻¹ : inertiaGroup K A) : decompositionGroup K A) x = + (automorphismUnitQuotient K A (σ : decompositionGroup K A) y)⁻¹ := by + ext + simp [automorphismUnitQuotient, y, div_eq_mul_inv] + rw [hquot] + exact A.unitGroup.inv_mem hy + +/-- The ramification group is contained in the value-trivial inertia group. -/ +theorem ramificationGroup_le_valueTrivialInertiaGroup + (A : _root_.ValuationSubring L) : + ramificationGroup K A ≤ valueTrivialInertiaGroup K A := by + intro σ hσ x + exact valueDisplacementClass_eq_one_of_mem_ramificationGroup + (K := K) A σ hσ x + +/-- For a value-trivial inertia element, the quotient `σ x / x` is an actual +unit of the valuation ring. -/ +def valueTrivialAutomorphismUnit + (A : _root_.ValuationSubring L) + (σ : valueTrivialInertiaGroup K A) (x : Lˣ) : + A.unitGroup := + ⟨automorphismUnitQuotient K A + ((σ : inertiaGroup K A) : decompositionGroup K A) x, + (valueDisplacementClass_eq_one_iff (K := K) A + ((σ : inertiaGroup K A) : decompositionGroup K A) x).mp + (σ.property x)⟩ + +/-- States the theorem `valueTrivialAutomorphismUnit_coe`. -/ +@[simp] theorem valueTrivialAutomorphismUnit_coe + (A : _root_.ValuationSubring L) + (σ : valueTrivialInertiaGroup K A) (x : Lˣ) : + (valueTrivialAutomorphismUnit K A σ x : Lˣ) = + automorphismUnitQuotient K A + ((σ : inertiaGroup K A) : decompositionGroup K A) x := + rfl + +/-- States the theorem `valueTrivialAutomorphismUnit_one_arg`. -/ +@[simp] theorem valueTrivialAutomorphismUnit_one_arg + (A : _root_.ValuationSubring L) + (σ : valueTrivialInertiaGroup K A) : + valueTrivialAutomorphismUnit K A σ 1 = 1 := by + ext + simp [valueTrivialAutomorphismUnit, automorphismUnitQuotient_one_arg] + +/-- States the theorem `valueTrivialAutomorphismUnit_mul_arg`. -/ +theorem valueTrivialAutomorphismUnit_mul_arg + (A : _root_.ValuationSubring L) + (σ : valueTrivialInertiaGroup K A) (x y : Lˣ) : + valueTrivialAutomorphismUnit K A σ (x * y) = + valueTrivialAutomorphismUnit K A σ x * + valueTrivialAutomorphismUnit K A σ y := by + ext + simp [valueTrivialAutomorphismUnit, automorphismUnitQuotient_mul_arg] + +/-- The character `χ_σ` is defined by: +for value-trivial inertia, `x ↦ σ x / x mod P` is a homomorphism +`Lˣ -> λˣ`. -/ +def valueTrivialInertiaResidueUnitHom + (A : _root_.ValuationSubring L) + (σ : valueTrivialInertiaGroup K A) : + Lˣ →* (IsLocalRing.ResidueField A)ˣ where + toFun x := + A.unitGroupToResidueFieldUnits + (valueTrivialAutomorphismUnit K A σ x) + map_one' := by + rw [valueTrivialAutomorphismUnit_one_arg] + exact map_one A.unitGroupToResidueFieldUnits + map_mul' x y := by + rw [valueTrivialAutomorphismUnit_mul_arg] + exact map_mul A.unitGroupToResidueFieldUnits + (valueTrivialAutomorphismUnit K A σ x) + (valueTrivialAutomorphismUnit K A σ y) + +/-- States the theorem `valueTrivialInertiaResidueUnitHom_apply`. -/ +@[simp] theorem valueTrivialInertiaResidueUnitHom_apply + (A : _root_.ValuationSubring L) + (σ : valueTrivialInertiaGroup K A) (x : Lˣ) : + valueTrivialInertiaResidueUnitHom K A σ x = + A.unitGroupToResidueFieldUnits + (valueTrivialAutomorphismUnit K A σ x) := + rfl + +/-- Valuation-ring units are killed by the residue-unit character. -/ +theorem unitGroup_le_valueTrivialInertiaResidueUnitHom_ker + (A : _root_.ValuationSubring L) + (σ : valueTrivialInertiaGroup K A) : + A.unitGroup ≤ (valueTrivialInertiaResidueUnitHom K A σ).ker := by + intro u hu + rw [MonoidHom.mem_ker, valueTrivialInertiaResidueUnitHom_apply] + let uA : A.unitGroup := valueTrivialAutomorphismUnit K A σ u + have hprincipal : + automorphismUnitQuotient K A + ((σ : inertiaGroup K A) : decompositionGroup K A) u ∈ + A.principalUnitGroup := + inertia_automorphismUnitQuotient_mem_principalUnitGroup_of_mem_unitGroup + (K := K) A (σ : inertiaGroup K A) hu + have hker : uA ∈ A.unitGroupToResidueFieldUnits.ker := by + rw [A.ker_unitGroupToResidueFieldUnits] + change (uA : Lˣ) ∈ A.principalUnitGroup + simpa [uA, valueTrivialAutomorphismUnit] using hprincipal + change A.unitGroupToResidueFieldUnits uA = 1 + exact MonoidHom.mem_ker.mp hker + +/-- Base-field units are killed by the residue-unit character. -/ +theorem valueTrivialInertiaResidueUnitHom_baseUnit + (A : _root_.ValuationSubring L) + (σ : valueTrivialInertiaGroup K A) (a : Kˣ) : + valueTrivialInertiaResidueUnitHom K A σ + (Units.map (algebraMap K L).toMonoidHom a) = 1 := by + rw [valueTrivialInertiaResidueUnitHom_apply] + let uA : A.unitGroup := + valueTrivialAutomorphismUnit K A σ + (Units.map (algebraMap K L).toMonoidHom a) + have hprincipal : + automorphismUnitQuotient K A + ((σ : inertiaGroup K A) : decompositionGroup K A) + (Units.map (algebraMap K L).toMonoidHom a) ∈ + A.principalUnitGroup := by + rw [automorphismUnitQuotient_algebraMapUnit] + exact A.principalUnitGroup.one_mem + have hker : uA ∈ A.unitGroupToResidueFieldUnits.ker := by + rw [A.ker_unitGroupToResidueFieldUnits] + change (uA : Lˣ) ∈ A.principalUnitGroup + simpa [uA, valueTrivialAutomorphismUnit] using hprincipal + change A.unitGroupToResidueFieldUnits uA = 1 + exact MonoidHom.mem_ker.mp hker + +/-- A value-trivial inertia element changes a unit representative only by a +valuation-ring unit, hence every residue-unit character is unchanged after +applying it to the representative. -/ +theorem valueTrivialInertiaResidueUnitHom_mapEquiv_arg + (A : _root_.ValuationSubring L) + (σ τ : valueTrivialInertiaGroup K A) (x : Lˣ) : + valueTrivialInertiaResidueUnitHom K A σ + (Units.mapEquiv + ((((τ : inertiaGroup K A) : decompositionGroup K A) : + L ≃ₐ[K] L).toMulEquiv) x) = + valueTrivialInertiaResidueUnitHom K A σ x := by + let q : Lˣ := + automorphismUnitQuotient K A + ((τ : inertiaGroup K A) : decompositionGroup K A) x + have hq_mem : q ∈ A.unitGroup := + (valueDisplacementClass_eq_one_iff (K := K) A + ((τ : inertiaGroup K A) : decompositionGroup K A) x).mp + (τ.property x) + have harg : + Units.mapEquiv + ((((τ : inertiaGroup K A) : decompositionGroup K A) : + L ≃ₐ[K] L).toMulEquiv) x = + q * x := by + ext + simp [q, automorphismUnitQuotient, div_eq_mul_inv, mul_comm] + rw [harg, map_mul] + have hq : + valueTrivialInertiaResidueUnitHom K A σ q = 1 := + MonoidHom.mem_ker.mp + (unitGroup_le_valueTrivialInertiaResidueUnitHom_ker + (K := K) A σ hq_mem) + rw [hq, one_mul] + +/-- The identity inertia element gives the trivial residue-unit character. -/ +theorem valueTrivialInertiaResidueUnitHom_one + (A : _root_.ValuationSubring L) (x : Lˣ) : + valueTrivialInertiaResidueUnitHom K A + (1 : valueTrivialInertiaGroup K A) x = 1 := by + rw [valueTrivialInertiaResidueUnitHom_apply] + have hunit : + valueTrivialAutomorphismUnit K A + (1 : valueTrivialInertiaGroup K A) x = 1 := by + ext + simp [valueTrivialAutomorphismUnit, automorphismUnitQuotient_one] + rw [hunit] + exact map_one A.unitGroupToResidueFieldUnits + +/-- Prime-decomposition statement: +the residue-unit characters multiply with the inertia element. -/ +theorem valueTrivialInertiaResidueUnitHom_mul + (A : _root_.ValuationSubring L) + (σ τ : valueTrivialInertiaGroup K A) (x : Lˣ) : + valueTrivialInertiaResidueUnitHom K A (σ * τ) x = + valueTrivialInertiaResidueUnitHom K A σ x * + valueTrivialInertiaResidueUnitHom K A τ x := by + rw [valueTrivialInertiaResidueUnitHom_apply] + have hunit : + valueTrivialAutomorphismUnit K A (σ * τ) x = + valueTrivialAutomorphismUnit K A σ + (Units.mapEquiv + ((((τ : inertiaGroup K A) : decompositionGroup K A) : + L ≃ₐ[K] L).toMulEquiv) x) * + valueTrivialAutomorphismUnit K A τ x := by + ext + simp [valueTrivialAutomorphismUnit, automorphismUnitQuotient_mul] + rw [hunit, map_mul] + change + valueTrivialInertiaResidueUnitHom K A σ + (Units.mapEquiv + ((((τ : inertiaGroup K A) : decompositionGroup K A) : + L ≃ₐ[K] L).toMulEquiv) x) * + valueTrivialInertiaResidueUnitHom K A τ x = + valueTrivialInertiaResidueUnitHom K A σ x * + valueTrivialInertiaResidueUnitHom K A τ x + rw [valueTrivialInertiaResidueUnitHom_mapEquiv_arg] + +/-- Prime-decomposition statement: +the residue-unit character descends from representatives `x : Lˣ` to value +classes modulo valuation-ring units. -/ +def valueClassToResidueUnits + (A : _root_.ValuationSubring L) + (σ : valueTrivialInertiaGroup K A) : + Lˣ ⧸ A.unitGroup →* (IsLocalRing.ResidueField A)ˣ := + QuotientGroup.lift A.unitGroup + (valueTrivialInertiaResidueUnitHom K A σ) + (unitGroup_le_valueTrivialInertiaResidueUnitHom_ker (K := K) A σ) + +/-- States the theorem `valueClassToResidueUnits_mk`. -/ +theorem valueClassToResidueUnits_mk + (A : _root_.ValuationSubring L) + (σ : valueTrivialInertiaGroup K A) (x : Lˣ) : + valueClassToResidueUnits K A σ + (QuotientGroup.mk' A.unitGroup x) = + valueTrivialInertiaResidueUnitHom K A σ x := + rfl + +/-- States the theorem `valueTrivialInertiaResidueUnitHom_eq_one_of_mem_ramificationGroup`. -/ +theorem valueTrivialInertiaResidueUnitHom_eq_one_of_mem_ramificationGroup + (A : _root_.ValuationSubring L) + (σ : valueTrivialInertiaGroup K A) + (hσ : (σ : inertiaGroup K A) ∈ ramificationGroup K A) + (x : Lˣ) : + valueTrivialInertiaResidueUnitHom K A σ x = 1 := by + rw [valueTrivialInertiaResidueUnitHom_apply] + let uA : A.unitGroup := valueTrivialAutomorphismUnit K A σ x + have hprincipal : + automorphismUnitQuotient K A + ((σ : inertiaGroup K A) : decompositionGroup K A) x ∈ + A.principalUnitGroup := + (mem_ramificationGroup_iff (K := K) A (σ : inertiaGroup K A)).mp hσ x + have hker : uA ∈ A.unitGroupToResidueFieldUnits.ker := by + rw [A.ker_unitGroupToResidueFieldUnits] + change (uA : Lˣ) ∈ A.principalUnitGroup + simpa [uA, valueTrivialAutomorphismUnit] using hprincipal + change A.unitGroupToResidueFieldUnits uA = 1 + exact MonoidHom.mem_ker.mp hker + +/-- Prime-decomposition statement: +for fixed `σ ∈ I_w`, the raw unit quotient is a group homomorphism +`Lˣ -> Lˣ / U^1`. -/ +def inertiaUnitQuotientHom + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) : + Lˣ →* Lˣ ⧸ A.principalUnitGroup where + toFun x := inertiaUnitQuotientClass K A σ x + map_one' := by + rw [inertiaUnitQuotientClass_eq_one_iff, + automorphismUnitQuotient_one_arg] + exact A.principalUnitGroup.one_mem + map_mul' x y := by + change + QuotientGroup.mk' A.principalUnitGroup + (automorphismUnitQuotient K A + (σ : decompositionGroup K A) (x * y)) = + QuotientGroup.mk' A.principalUnitGroup + (automorphismUnitQuotient K A + (σ : decompositionGroup K A) x) * + QuotientGroup.mk' A.principalUnitGroup + (automorphismUnitQuotient K A + (σ : decompositionGroup K A) y) + rw [automorphismUnitQuotient_mul_arg] + exact map_mul (QuotientGroup.mk' A.principalUnitGroup) + (automorphismUnitQuotient K A (σ : decompositionGroup K A) x) + (automorphismUnitQuotient K A (σ : decompositionGroup K A) y) + +/-- States the theorem `inertiaUnitQuotientHom_apply`. -/ +@[simp] theorem inertiaUnitQuotientHom_apply + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) (x : Lˣ) : + inertiaUnitQuotientHom K A σ x = + inertiaUnitQuotientClass K A σ x := + rfl + +/-- The raw inertia quotient followed by `Lˣ/U^1 -> Lˣ/Aˣ` is exactly value +displacement. -/ +theorem principalUnitQuotientToValueClass_comp_inertiaUnitQuotientHom + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) : + (principalUnitQuotientToValueClass A).comp + (inertiaUnitQuotientHom K A σ) = + valueDisplacementHom K A (σ : decompositionGroup K A) := by + ext x + rfl + +/-- The raw quotient homomorphism kills the valuation-ring unit group. -/ +theorem unitGroup_le_inertiaUnitQuotientHom_ker + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) : + A.unitGroup ≤ (inertiaUnitQuotientHom K A σ).ker := by + intro u hu + rw [MonoidHom.mem_ker, inertiaUnitQuotientHom_apply] + exact inertiaUnitQuotientClass_eq_one_of_mem_unitGroup (K := K) A σ hu + +/-- Prime-decomposition statement: +the raw character descends from representatives `x : Lˣ` to value classes +modulo valuation-ring units. This is the quotient layer corresponding to +`Delta = w(L*)`. -/ +def valueClassToPrincipalUnitQuotient + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) : + Lˣ ⧸ A.unitGroup →* Lˣ ⧸ A.principalUnitGroup := + QuotientGroup.lift A.unitGroup + (inertiaUnitQuotientHom K A σ) + (unitGroup_le_inertiaUnitQuotientHom_ker (K := K) A σ) + +/-- States the theorem `valueClassToPrincipalUnitQuotient_mk`. -/ +theorem valueClassToPrincipalUnitQuotient_mk + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) (x : Lˣ) : + valueClassToPrincipalUnitQuotient K A σ + (QuotientGroup.mk' A.unitGroup x) = + inertiaUnitQuotientClass K A σ x := + rfl + +/-- The image of base-field units in `Lˣ / A.unitGroup`. This is the +subgroup that later realizes `Gamma` inside `Delta`. -/ +def baseUnitToValueClass (A : _root_.ValuationSubring L) : + Kˣ →* Lˣ ⧸ A.unitGroup := + (QuotientGroup.mk' A.unitGroup).comp + (Units.map (algebraMap K L).toMonoidHom) + +/-- States the theorem `baseUnitToValueClass_apply`. -/ +@[simp] theorem baseUnitToValueClass_apply + (A : _root_.ValuationSubring L) (a : Kˣ) : + baseUnitToValueClass K A a = + QuotientGroup.mk' A.unitGroup + (Units.map (algebraMap K L).toMonoidHom a) := + rfl + +/-- The subgroup of `Lˣ/A.unitGroup` generated by base-field value classes. -/ +abbrev baseUnitValueClassSubgroup (A : _root_.ValuationSubring L) : + Subgroup (Lˣ ⧸ A.unitGroup) := + (baseUnitToValueClass K A).range + +/-- Provides the instance `baseUnitValueClassSubgroup_normal`. -/ +instance baseUnitValueClassSubgroup_normal + (A : _root_.ValuationSubring L) : + (baseUnitValueClassSubgroup K A).Normal := + ⟨by + intro n hn g + have hconj : g * n * g⁻¹ = n := by + rw [mul_comm g n, mul_assoc, mul_inv_cancel, mul_one] + rw [hconj] + exact hn⟩ + +/-- Base-field units map trivially under the descended raw character. -/ +theorem valueClassToPrincipalUnitQuotient_baseUnit + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) (a : Kˣ) : + valueClassToPrincipalUnitQuotient K A σ + (baseUnitToValueClass K A a) = 1 := by + rw [baseUnitToValueClass_apply, valueClassToPrincipalUnitQuotient_mk] + exact (inertiaUnitQuotientClass_eq_one_iff + (K := K) A σ (Units.map (algebraMap K L).toMonoidHom a)).mpr (by + rw [automorphismUnitQuotient_algebraMapUnit] + exact A.principalUnitGroup.one_mem) + +/-- The base-field value classes lie in the kernel of the descended raw +character. -/ +theorem baseUnitValueClassSubgroup_le_valueClassToPrincipalUnitQuotient_ker + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) : + baseUnitValueClassSubgroup K A ≤ + (valueClassToPrincipalUnitQuotient K A σ).ker := by + rintro _ ⟨a, rfl⟩ + rw [MonoidHom.mem_ker] + exact valueClassToPrincipalUnitQuotient_baseUnit (K := K) A σ a + +/-- Prime-decomposition statement: +the raw character descends further modulo the base value group. This quotient +is the group-theoretic model of `Delta/Gamma` before identifying it with a +concrete value-group quotient. -/ +def valueModuloBaseToPrincipalUnitQuotient + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) : + (Lˣ ⧸ A.unitGroup) ⧸ baseUnitValueClassSubgroup K A →* + Lˣ ⧸ A.principalUnitGroup := + QuotientGroup.lift (baseUnitValueClassSubgroup K A) + (valueClassToPrincipalUnitQuotient K A σ) + (baseUnitValueClassSubgroup_le_valueClassToPrincipalUnitQuotient_ker + (K := K) A σ) + +/-- States the theorem `valueModuloBaseToPrincipalUnitQuotient_mk`. -/ +theorem valueModuloBaseToPrincipalUnitQuotient_mk + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) + (x : Lˣ ⧸ A.unitGroup) : + valueModuloBaseToPrincipalUnitQuotient K A σ + (QuotientGroup.mk' (baseUnitValueClassSubgroup K A) x) = + valueClassToPrincipalUnitQuotient K A σ x := + rfl + +/-- States the theorem `valueModuloBaseToPrincipalUnitQuotient_mk_mk`. -/ +theorem valueModuloBaseToPrincipalUnitQuotient_mk_mk + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) (x : Lˣ) : + valueModuloBaseToPrincipalUnitQuotient K A σ + (QuotientGroup.mk' (baseUnitValueClassSubgroup K A) + (QuotientGroup.mk' A.unitGroup x)) = + inertiaUnitQuotientClass K A σ x := + rfl + +/-- The base value classes are killed by the residue-unit character. -/ +theorem baseUnitValueClassSubgroup_le_valueClassToResidueUnits_ker + (A : _root_.ValuationSubring L) + (σ : valueTrivialInertiaGroup K A) : + baseUnitValueClassSubgroup K A ≤ + (valueClassToResidueUnits K A σ).ker := by + rintro _ ⟨a, rfl⟩ + rw [MonoidHom.mem_ker, baseUnitToValueClass_apply, + valueClassToResidueUnits_mk] + exact valueTrivialInertiaResidueUnitHom_baseUnit (K := K) A σ a + +/-- Prime-decomposition statement: +the residue-unit character on `Delta/Gamma`, modeled as +`(Lˣ/Aˣ)/(Kˣ)`, for value-trivial inertia. -/ +def valueModuloBaseToResidueUnits + (A : _root_.ValuationSubring L) + (σ : valueTrivialInertiaGroup K A) : + (Lˣ ⧸ A.unitGroup) ⧸ baseUnitValueClassSubgroup K A →* + (IsLocalRing.ResidueField A)ˣ := + QuotientGroup.lift (baseUnitValueClassSubgroup K A) + (valueClassToResidueUnits K A σ) + (baseUnitValueClassSubgroup_le_valueClassToResidueUnits_ker + (K := K) A σ) + +/-- States the theorem `valueModuloBaseToResidueUnits_mk`. -/ +theorem valueModuloBaseToResidueUnits_mk + (A : _root_.ValuationSubring L) + (σ : valueTrivialInertiaGroup K A) (x : Lˣ ⧸ A.unitGroup) : + valueModuloBaseToResidueUnits K A σ + (QuotientGroup.mk' (baseUnitValueClassSubgroup K A) x) = + valueClassToResidueUnits K A σ x := + rfl + +/-- States the theorem `valueModuloBaseToResidueUnits_mk_mk`. -/ +theorem valueModuloBaseToResidueUnits_mk_mk + (A : _root_.ValuationSubring L) + (σ : valueTrivialInertiaGroup K A) (x : Lˣ) : + valueModuloBaseToResidueUnits K A σ + (QuotientGroup.mk' (baseUnitValueClassSubgroup K A) + (QuotientGroup.mk' A.unitGroup x)) = + valueTrivialInertiaResidueUnitHom K A σ x := + rfl + +/-- The inertia-character construction satisfies: +an element of `R_w` gives the trivial residue-unit character on +`Delta/Gamma`. This is the kernel direction for the canonical map from +inertia to `Hom(Delta/Gamma, lambda*)`. -/ +theorem valueModuloBaseToResidueUnits_eq_one_of_mem_ramificationGroup + (A : _root_.ValuationSubring L) + (σ : valueTrivialInertiaGroup K A) + (hσ : (σ : inertiaGroup K A) ∈ ramificationGroup K A) : + valueModuloBaseToResidueUnits K A σ = 1 := by + apply QuotientGroup.monoidHom_ext + apply QuotientGroup.monoidHom_ext + apply MonoidHom.ext + intro x + simp only [MonoidHom.comp_apply, + valueModuloBaseToResidueUnits_mk_mk, + MonoidHom.one_apply] + simpa using valueTrivialInertiaResidueUnitHom_eq_one_of_mem_ramificationGroup + (K := K) A σ hσ x + +/-- prime-decomposition theory: +`σ ↦ χ_σ`, realized on the group-theoretic model of `Delta/Gamma`. + +For mathlib's valuation-subring stabilizer this is stated on the value-trivial +inertia subgroup; for a chosen valuation in the exact-extension sense this is the +ordinary inertia group. -/ +def valueTrivialInertiaCharacterHom + (A : _root_.ValuationSubring L) : + valueTrivialInertiaGroup K A →* + ((Lˣ ⧸ A.unitGroup) ⧸ baseUnitValueClassSubgroup K A →* + (IsLocalRing.ResidueField A)ˣ) where + toFun σ := valueModuloBaseToResidueUnits K A σ + map_one' := by + apply QuotientGroup.monoidHom_ext + apply QuotientGroup.monoidHom_ext + apply MonoidHom.ext + intro x + simp only [MonoidHom.comp_apply, + valueModuloBaseToResidueUnits_mk_mk, + MonoidHom.one_apply] + exact valueTrivialInertiaResidueUnitHom_one (K := K) A x + map_mul' σ τ := by + apply QuotientGroup.monoidHom_ext + apply QuotientGroup.monoidHom_ext + apply MonoidHom.ext + intro x + change + valueModuloBaseToResidueUnits K A (σ * τ) + (QuotientGroup.mk' (baseUnitValueClassSubgroup K A) + (QuotientGroup.mk' A.unitGroup x)) = + valueModuloBaseToResidueUnits K A σ + (QuotientGroup.mk' (baseUnitValueClassSubgroup K A) + (QuotientGroup.mk' A.unitGroup x)) * + valueModuloBaseToResidueUnits K A τ + (QuotientGroup.mk' (baseUnitValueClassSubgroup K A) + (QuotientGroup.mk' A.unitGroup x)) + rw [valueModuloBaseToResidueUnits_mk_mk, + valueModuloBaseToResidueUnits_mk_mk, + valueModuloBaseToResidueUnits_mk_mk] + exact valueTrivialInertiaResidueUnitHom_mul (K := K) A σ τ x + +/-- States the theorem `valueTrivialInertiaCharacterHom_apply`. -/ +@[simp] theorem valueTrivialInertiaCharacterHom_apply + (A : _root_.ValuationSubring L) + (σ : valueTrivialInertiaGroup K A) : + valueTrivialInertiaCharacterHom K A σ = + valueModuloBaseToResidueUnits K A σ := + rfl + +/-- The ramification group is contained in the kernel of the character map. -/ +theorem valueTrivialInertiaCharacterHom_mem_ker_of_mem_ramificationGroup + (A : _root_.ValuationSubring L) + (σ : valueTrivialInertiaGroup K A) + (hσ : (σ : inertiaGroup K A) ∈ ramificationGroup K A) : + σ ∈ (valueTrivialInertiaCharacterHom K A).ker := by + rw [MonoidHom.mem_ker, valueTrivialInertiaCharacterHom_apply] + exact valueModuloBaseToResidueUnits_eq_one_of_mem_ramificationGroup + (K := K) A σ hσ + +/-- Conversely, a value-trivial inertia element with trivial character lies in +the ramification group. -/ +theorem mem_ramificationGroup_of_valueTrivialInertiaCharacterHom_mem_ker + (A : _root_.ValuationSubring L) + (σ : valueTrivialInertiaGroup K A) + (hσ : σ ∈ (valueTrivialInertiaCharacterHom K A).ker) : + (σ : inertiaGroup K A) ∈ ramificationGroup K A := by + rw [mem_ramificationGroup_iff] + intro x + have hchar : + valueModuloBaseToResidueUnits K A σ + (QuotientGroup.mk' (baseUnitValueClassSubgroup K A) + (QuotientGroup.mk' A.unitGroup x)) = 1 := by + have hhom : + valueTrivialInertiaCharacterHom K A σ = 1 := + MonoidHom.mem_ker.mp hσ + have happ := + congrArg + (fun f : + (Lˣ ⧸ A.unitGroup) ⧸ baseUnitValueClassSubgroup K A →* + (IsLocalRing.ResidueField A)ˣ => + f (QuotientGroup.mk' (baseUnitValueClassSubgroup K A) + (QuotientGroup.mk' A.unitGroup x))) hhom + simpa [valueTrivialInertiaCharacterHom_apply] using happ + have hres : + A.unitGroupToResidueFieldUnits + (valueTrivialAutomorphismUnit K A σ x) = 1 := by + rw [valueModuloBaseToResidueUnits_mk_mk] at hchar + simpa only [valueTrivialInertiaResidueUnitHom_apply] using hchar + have hker : + valueTrivialAutomorphismUnit K A σ x ∈ + A.unitGroupToResidueFieldUnits.ker := + MonoidHom.mem_ker.mpr hres + rw [A.ker_unitGroupToResidueFieldUnits] at hker + have hker' : + (valueTrivialAutomorphismUnit K A σ x : Lˣ) ∈ + A.principalUnitGroup := hker + simpa [valueTrivialAutomorphismUnit] using hker' + +/-- Prime-decomposition statement: +on value-trivial inertia, the kernel of `σ ↦ χ_σ` is exactly `R_w`. -/ +theorem valueTrivialInertiaCharacterHom_mem_ker_iff + (A : _root_.ValuationSubring L) + (σ : valueTrivialInertiaGroup K A) : + σ ∈ (valueTrivialInertiaCharacterHom K A).ker ↔ + (σ : inertiaGroup K A) ∈ ramificationGroup K A := by + constructor + · exact mem_ramificationGroup_of_valueTrivialInertiaCharacterHom_mem_ker + (K := K) A σ + · exact valueTrivialInertiaCharacterHom_mem_ker_of_mem_ramificationGroup + (K := K) A σ + +end ValuationSubring +end HilbertRamification + +end +end RamificationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CompleteDVF.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CompleteDVF.lean new file mode 100644 index 0000000000..a9f2d91e9a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CompleteDVF.lean @@ -0,0 +1,507 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Exact.Basic +public import Mathlib.FieldTheory.Galois.IsGaloisGroup +public import Mathlib.GroupTheory.GroupAction.Quotient +public import Mathlib.RingTheory.Invariant.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core +/-! +# Decomposition and inertia for finite extensions of complete DVFs + +For a finite separable extension of complete discretely valued fields, the +extension of the base valuation is unique. Consequently every +base-field automorphism stabilizes the chosen target valuation ring and the +full Galois group is the decomposition group. Reduction then gives the +finite Galois exact sequence + +`1 -> I(L/K) -> Gal(L/K) -> Gal(k_L/k_K) -> 1`. + +The valuation-subring definitions and their ordinary exactness are reused +from `HilbertRamification.ValuationSubring`; this file only supplies the +complete-DVF specialization and the finite-Galois surjectivity theorem. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Pointwise + +universe u v w x + +namespace RamificationTheory.HilbertRamification.CompleteDVF + +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] +variable (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) +variable [base.valuation.HasExtension target.valuation] + +private instance decompositionGroupMulSemiringAction : + MulSemiringAction + (ValuationSubring.decompositionGroup K + target.valuation.valuationSubring) + target.valuationSubring := by + change MulSemiringAction + (target.valuation.valuationSubring.decompositionSubgroup K) + target.valuation.valuationSubring + infer_instance + +private noncomputable instance decompositionGroupResidueFieldMulSemiringAction : + MulSemiringAction + (ValuationSubring.decompositionGroup K + target.valuation.valuationSubring) + target.residueField := by + change MulSemiringAction + (target.valuation.valuationSubring.decompositionSubgroup K) + (IsLocalRing.ResidueField target.valuation.valuationSubring) + infer_instance + +private theorem comapValuation_hasExtension + (sigma : L ≃ₐ[K] L) : + base.valuation.HasExtension + (target.valuation.comap (sigma : L →+* L)) where + val_isEquiv_comap := by + rw [_root_.Valuation.isEquiv_iff_val_le_one] + intro a + simpa [_root_.Valuation.comap, sigma.commutes a] using + (_root_.Valuation.HasExtension.val_map_le_one_iff + (vR := base.valuation) (vA := target.valuation) a).symm + +section ValuationUniqueness + +variable [FiniteDimensional K L] + +include base target + +private theorem inv_smul_valuationSubring_eq + [Algebra.IsSeparable K L] + (sigma : L ≃ₐ[K] L) : + sigma⁻¹ • target.valuation.valuationSubring = + target.valuation.valuationSubring := by + let pulledBack := target.valuation.comap (sigma : L →+* L) + let : base.valuation.HasExtension pulledBack := + comapValuation_hasExtension (base := base) (target := target) sigma + have hEquiv : target.valuation.IsEquiv pulledBack := + (hasUniqueValuationExtension_of_finite_separable base target : + ValuedExtension.HasUniqueValuationExtension.{u, v, w, x, x} + (base := base) (target := target)) pulledBack + have hSubring : + target.valuation.valuationSubring = pulledBack.valuationSubring := + (_root_.Valuation.isEquiv_iff_valuationSubring + target.valuation pulledBack).1 hEquiv + have hComap : + pulledBack.valuationSubring = + sigma⁻¹ • target.valuation.valuationSubring := by + ext z + change target.valuation (sigma z) ≤ 1 ↔ + z ∈ sigma⁻¹ • target.valuation.valuationSubring + rw [_root_.ValuationSubring.mem_inv_pointwise_smul_iff] + simp [AlgEquiv.smul_def, _root_.Valuation.mem_valuationSubring_iff] + exact hComap.symm.trans hSubring.symm + +/-- Every automorphism of a finite separable extension of complete DVFs +stabilizes the target valuation ring. -/ +theorem automorphism_stabilizes_valuationSubring + [Algebra.IsSeparable K L] + (sigma : L ≃ₐ[K] L) : + sigma • target.valuation.valuationSubring = + target.valuation.valuationSubring := by + have hinv := inv_smul_valuationSubring_eq + (base := base) (target := target) sigma + calc + sigma • target.valuation.valuationSubring = + sigma • (sigma⁻¹ • target.valuation.valuationSubring) := by rw [hinv] + _ = target.valuation.valuationSubring := by simp [smul_smul] + +/-- For a finite separable extension of complete DVFs, the full automorphism +group is canonically the decomposition group of the target valuation ring. -/ +def galEquivDecompositionGroup + [Algebra.IsSeparable K L] : + (L ≃ₐ[K] L) ≃* + ValuationSubring.decompositionGroup K + target.valuation.valuationSubring where + toFun sigma := ⟨sigma, by + change sigma • target.valuation.valuationSubring = + target.valuation.valuationSubring + exact automorphism_stabilizes_valuationSubring + (base := base) (target := target) sigma⟩ + invFun sigma := (sigma : L ≃ₐ[K] L) + left_inv _ := rfl + right_inv _ := by apply Subtype.ext; rfl + map_mul' _ _ := by apply Subtype.ext; rfl + +/-- States the theorem `galEquivDecompositionGroup_coe`. -/ +@[simp] +theorem galEquivDecompositionGroup_coe + [Algebra.IsSeparable K L] + (sigma : L ≃ₐ[K] L) : + ((galEquivDecompositionGroup (base := base) (target := target) sigma : + ValuationSubring.decompositionGroup K + target.valuation.valuationSubring) : L ≃ₐ[K] L) = sigma := + rfl + +end ValuationUniqueness + +/-- Reduction of the decomposition-group action, as automorphisms over the +base residue field. -/ +def decompositionResidueAction : + ValuationSubring.decompositionGroup K + target.valuation.valuationSubring →* + (target.residueField ≃ₐ[base.residueField] target.residueField) where + toFun sigma := + { ValuationSubring.residueAction K target.valuation.valuationSubring sigma with + commutes' := by + intro z + obtain ⟨a, rfl⟩ := IsLocalRing.residue_surjective z + change + ValuationSubring.residueAction K target.valuation.valuationSubring sigma + (IsLocalRing.residue target.valuationSubring + (algebraMap base.valuationSubring target.valuationSubring a)) = + IsLocalRing.residue target.valuationSubring + (algebraMap base.valuationSubring target.valuationSubring a) + change + sigma • + (IsLocalRing.residue target.valuationSubring + (algebraMap base.valuationSubring target.valuationSubring a)) = + IsLocalRing.residue target.valuationSubring + (algebraMap base.valuationSubring target.valuationSubring a) + change + IsLocalRing.residue target.valuationSubring + (sigma • + algebraMap base.valuationSubring target.valuationSubring a) = + IsLocalRing.residue target.valuationSubring + (algebraMap base.valuationSubring target.valuationSubring a) + congr 1 + apply Subtype.ext + change + (sigma : L ≃ₐ[K] L) (algebraMap K L (a : K)) = + algebraMap K L (a : K) + exact (sigma : L ≃ₐ[K] L).commutes (a : K) } + map_one' := by + apply AlgEquiv.ext + intro z + change + ValuationSubring.residueAction K target.valuation.valuationSubring 1 z = + (1 : target.residueField ≃ₐ[base.residueField] target.residueField) z + rw [MonoidHom.map_one] + exact AlgEquiv.one_apply (R := base.residueField) (A₁ := target.residueField) z + map_mul' := by + intro sigma tau + apply AlgEquiv.ext + intro z + change + ValuationSubring.residueAction K target.valuation.valuationSubring + (sigma * tau) z = + (ValuationSubring.residueAction K target.valuation.valuationSubring sigma * + ValuationSubring.residueAction K target.valuation.valuationSubring tau) z + rw [MonoidHom.map_mul] + +/-- States the theorem `decompositionResidueAction_apply`. -/ +@[simp] +theorem decompositionResidueAction_apply + (sigma : ValuationSubring.decompositionGroup K + target.valuation.valuationSubring) + (z : target.residueField) : + decompositionResidueAction (K := K) (base := base) (target := target) sigma z = + ValuationSubring.residueAction K + target.valuation.valuationSubring sigma z := + rfl + +/-- States the theorem `decompositionResidueAction_algebraMap`. -/ +theorem decompositionResidueAction_algebraMap + (sigma : ValuationSubring.decompositionGroup K + target.valuation.valuationSubring) + (z : base.residueField) : + decompositionResidueAction (K := K) (base := base) (target := target) sigma + (algebraMap base.residueField target.residueField z) = + algebraMap base.residueField target.residueField z := + (decompositionResidueAction + (K := K) (base := base) (target := target) sigma).commutes z + +/-- The kernel of reduction on the decomposition group is its inertia group. -/ +theorem decompositionResidueAction_ker : + MonoidHom.ker + (decompositionResidueAction + (K := K) (base := base) (target := target)) = + ValuationSubring.inertiaGroup K + target.valuation.valuationSubring := by + rw [← ValuationSubring.residueAction_ker + (K := K) target.valuation.valuationSubring] + ext sigma + change + decompositionResidueAction (K := K) (base := base) (target := target) sigma = 1 ↔ + ValuationSubring.residueAction K + target.valuation.valuationSubring sigma = 1 + constructor + · intro h + apply RingEquiv.ext + intro z + have hz := congrArg + (fun e : target.residueField ≃ₐ[base.residueField] target.residueField => e z) h + simpa using hz + · intro h + apply AlgEquiv.ext + intro z + have hz := congrArg + (fun e : target.residueField ≃+* target.residueField => e z) h + simpa using hz + +omit [base.valuation.HasExtension target.valuation] in +/-- Ideal-theoretic inertia of the target maximal ideal, for the canonical +decomposition-group action on the valuation ring, is the ordinary +valuation-subring inertia group. -/ +theorem maximalIdealInertia_eq_decompositionInertia : + target.maximalIdeal.toAddSubgroup.inertia + (ValuationSubring.decompositionGroup K + target.valuation.valuationSubring) = + ValuationSubring.inertiaGroup K + target.valuation.valuationSubring := by + ext sigma + rw [← ValuationSubring.residueAction_ker + (K := K) target.valuation.valuationSubring, MonoidHom.mem_ker] + constructor + · intro hsigma + apply RingEquiv.ext + intro z + obtain ⟨a, rfl⟩ := IsLocalRing.residue_surjective z + change sigma • + (IsLocalRing.residue target.valuationSubring a : target.residueField) = + IsLocalRing.residue target.valuationSubring a + change + IsLocalRing.residue target.valuationSubring (sigma • a) = + IsLocalRing.residue target.valuationSubring a + rw [ResidueField.residue_eq_residue_iff_sub_mem_maximalIdeal] + exact hsigma a + · intro hsigma a + change sigma • a - a ∈ target.maximalIdeal + rw [← ResidueField.residue_eq_residue_iff_sub_mem_maximalIdeal] + have happ := congrArg + (fun e : target.residueField ≃+* target.residueField => + e (IsLocalRing.residue target.valuationSubring a)) hsigma + change sigma • + (IsLocalRing.residue target.valuationSubring a : target.residueField) = + IsLocalRing.residue target.valuationSubring a at happ + change + IsLocalRing.residue target.valuationSubring (sigma • a) = + IsLocalRing.residue target.valuationSubring a at happ + exact happ + +/-- Exactness of inertia inclusion followed by reduction on the decomposition +group. -/ +theorem decompositionInertia_mulExact_decompositionResidueAction : + Function.MulExact + (ValuationSubring.inertiaGroup K + target.valuation.valuationSubring).subtype + (decompositionResidueAction + (K := K) (base := base) (target := target)) := by + rw [MonoidHom.mulExact_iff, decompositionResidueAction_ker] + exact (Subgroup.range_subtype _).symm + +section FullGaloisGroup + +variable [FiniteDimensional K L] + +include base target + +/-- The residue action of the full automorphism group, transported through +the canonical identification with the decomposition group. -/ +def residueAction + [Algebra.IsSeparable K L] : + (L ≃ₐ[K] L) →* + (target.residueField ≃ₐ[base.residueField] target.residueField) := + (decompositionResidueAction + (K := K) (base := base) (target := target)).comp + (galEquivDecompositionGroup + (base := base) (target := target)).toMonoidHom + +/-- States the theorem `residueAction_apply`. -/ +@[simp] +theorem residueAction_apply + [Algebra.IsSeparable K L] + (sigma : L ≃ₐ[K] L) : + residueAction (K := K) (base := base) (target := target) sigma = + decompositionResidueAction + (K := K) (base := base) (target := target) + (galEquivDecompositionGroup + (base := base) (target := target) sigma) := + rfl + +/-- Inertia inside the full Galois group is the inverse image of the ordinary +decomposition-side inertia group. -/ +def inertiaGroup + [Algebra.IsSeparable K L] : + Subgroup (L ≃ₐ[K] L) := + Subgroup.comap + (galEquivDecompositionGroup + (base := base) (target := target)).toMonoidHom + (ValuationSubring.inertiaGroup K + target.valuation.valuationSubring) + +/-- States the theorem `mem_inertiaGroup_iff`. -/ +@[simp] +theorem mem_inertiaGroup_iff + [Algebra.IsSeparable K L] + (sigma : L ≃ₐ[K] L) : + sigma ∈ inertiaGroup (K := K) (base := base) (target := target) ↔ + galEquivDecompositionGroup + (base := base) (target := target) sigma ∈ + ValuationSubring.inertiaGroup K + target.valuation.valuationSubring := + Iff.rfl + +/-- Transporting full inertia through `Gal(L/K) ≃ D(L/K)` gives exactly the +ordinary decomposition-side inertia group. -/ +theorem inertiaGroup_map_galEquivDecompositionGroup + [Algebra.IsSeparable K L] : + Subgroup.map + (galEquivDecompositionGroup + (base := base) (target := target)).toMonoidHom + (inertiaGroup (K := K) (base := base) (target := target)) = + ValuationSubring.inertiaGroup K + target.valuation.valuationSubring := by + ext tau + constructor + · rintro ⟨sigma, hsigma, rfl⟩ + exact hsigma + · intro htau + refine ⟨(galEquivDecompositionGroup + (base := base) (target := target)).symm tau, ?_, ?_⟩ + · change galEquivDecompositionGroup + (base := base) (target := target) + ((galEquivDecompositionGroup + (base := base) (target := target)).symm tau) ∈ + ValuationSubring.inertiaGroup K + target.valuation.valuationSubring + simpa using htau + · simp + +/-- The kernel of the full residue action is the full inertia group. -/ +theorem residueAction_ker + [Algebra.IsSeparable K L] : + MonoidHom.ker + (residueAction (K := K) (base := base) (target := target)) = + inertiaGroup (K := K) (base := base) (target := target) := by + ext sigma + change + decompositionResidueAction + (K := K) (base := base) (target := target) + (galEquivDecompositionGroup + (base := base) (target := target) sigma) = 1 ↔ + galEquivDecompositionGroup + (base := base) (target := target) sigma ∈ + ValuationSubring.inertiaGroup K + target.valuation.valuationSubring + rw [← decompositionResidueAction_ker + (K := K) (base := base) (target := target)] + rfl + +/-- Provides the instance `inertiaGroup_normal`. -/ +instance inertiaGroup_normal + [Algebra.IsSeparable K L] : + (inertiaGroup (K := K) (base := base) (target := target)).Normal := by + rw [← residueAction_ker] + infer_instance + +/-- Exactness of full inertia inclusion followed by reduction. -/ +theorem inertia_mulExact_residueAction + [Algebra.IsSeparable K L] : + Function.MulExact + (inertiaGroup (K := K) (base := base) (target := target)).subtype + (residueAction (K := K) (base := base) (target := target)) := by + rw [MonoidHom.mulExact_iff, residueAction_ker] + exact (Subgroup.range_subtype _).symm + +/-- For a finite Galois extension of complete DVFs, reduction of the full +Galois group is onto the residue-field Galois group. -/ +theorem residueAction_surjective_of_isGalois + [IsGalois K L] : + Function.Surjective + (residueAction (K := K) (base := base) (target := target)) := by + let : IsScalarTower base.valuationSubring target.valuationSubring L := + ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_isScalarTower_of_hasExtension + base.valuation target.valuation + let : Module.Finite base.valuationSubring target.valuationSubring := + moduleFinite_target_valuationSubring_of_finite_separable base target + let : MulSemiringAction (L ≃ₐ[K] L) target.valuationSubring := by + change MulSemiringAction (L ≃ₐ[K] L) + target.valuation.valuationSubring + exact MulSemiringAction.compHom + (R := target.valuation.valuationSubring) + (galEquivDecompositionGroup + (base := base) (target := target)).toMonoidHom + let : SMulDistribClass (L ≃ₐ[K] L) target.valuationSubring L := + { smul_distrib_smul := by + intro sigma r z + change sigma ((r : L) * z) = sigma (r : L) * sigma z + rw [map_mul] } + let : IsGaloisGroup (L ≃ₐ[K] L) + base.valuationSubring target.valuationSubring := + IsGaloisGroup.of_isFractionRing (L ≃ₐ[K] L) + base.valuationSubring target.valuationSubring K L + let : target.maximalIdeal.LiesOver base.maximalIdeal := + maximalIdeal_liesOver base target + intro rho + rcases Ideal.Quotient.stabilizerHom_surjective + (G := L ≃ₐ[K] L) base.maximalIdeal target.maximalIdeal rho with + ⟨sigma, hsigma⟩ + refine ⟨sigma.1, ?_⟩ + rw [← hsigma] + apply AlgEquiv.ext + intro z + obtain ⟨a, rfl⟩ := Ideal.Quotient.mk_surjective z + rfl + +/-- The decomposition-group residue action is also onto in the finite Galois +case. -/ +theorem decompositionResidueAction_surjective_of_isGalois + [IsGalois K L] : + Function.Surjective + (decompositionResidueAction + (K := K) (base := base) (target := target)) := by + intro rho + obtain ⟨sigma, hsigma⟩ := + residueAction_surjective_of_isGalois + (K := K) (base := base) (target := target) rho + exact ⟨galEquivDecompositionGroup + (base := base) (target := target) sigma, hsigma⟩ + +/-- The finite-Galois residue exact sequence in quotient form. -/ +def galQuotientInertiaEquivResidueGalois + [IsGalois K L] : + (L ≃ₐ[K] L) ⧸ + inertiaGroup (K := K) (base := base) (target := target) ≃* + (target.residueField ≃ₐ[base.residueField] target.residueField) := + (QuotientGroup.quotientMulEquivOfEq + (residueAction_ker + (K := K) (base := base) (target := target)).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (residueAction (K := K) (base := base) (target := target)) + (residueAction_surjective_of_isGalois + (K := K) (base := base) (target := target))) + +/-- States the theorem `galQuotientInertiaEquivResidueGalois_mk`. -/ +theorem galQuotientInertiaEquivResidueGalois_mk + [IsGalois K L] + (sigma : L ≃ₐ[K] L) : + galQuotientInertiaEquivResidueGalois + (K := K) (base := base) (target := target) + (QuotientGroup.mk' + (inertiaGroup (K := K) (base := base) (target := target)) sigma) = + residueAction (K := K) (base := base) (target := target) sigma := by + exact residueAction_apply (base := base) (target := target) sigma + +end FullGaloisGroup + +end RamificationTheory.HilbertRamification.CompleteDVF + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CyclotomicDegreeBound.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CyclotomicDegreeBound.lean new file mode 100644 index 0000000000..99bc5ad003 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CyclotomicDegreeBound.lean @@ -0,0 +1,110 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Group.Subgroup.Finite +public import Mathlib.NumberTheory.Cyclotomic.PrimitiveRoots +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring +/-! +# Cyclotomic degree bounds for inertia + +An inertia group is bounded by the degree of its Galois extension. An +embedding into a concrete cyclotomic field therefore bounds its cardinality +by Euler's totient. +-/ + +@[expose] public section + +noncomputable +section + +namespace HilbertRamification + +open Polynomial + +/-- The inertia group of a finite Galois extension has cardinality at most +the degree of the extension. -/ +theorem natCard_inertiaGroup_le_finrank + {K E : Type*} [Field K] [Field E] [Algebra K E] + [FiniteDimensional K E] [IsGalois K E] + (A : _root_.ValuationSubring E) : + Nat.card + (RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup K A) ≤ + Module.finrank K E := by + let f : + RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup K A → + (E ≃ₐ[K] E) := + fun σ ↦ + ((σ : + RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup K A) : + E ≃ₐ[K] E) + have hf : Function.Injective f := by + intro σ τ hστ + apply Subtype.ext + apply Subtype.ext + exact hστ + calc + Nat.card + (RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup K A) ≤ + Nat.card (E ≃ₐ[K] E) := + Nat.card_le_card_of_injective f hf + _ = Module.finrank K E := IsGalois.card_aut_eq_finrank K E + +/-- Over a characteristic-zero field, the concrete cyclotomic field of +order `m` has degree at most `φ(m)`. -/ +theorem cyclotomicField_finrank_le_totient + (K : Type*) [Field K] [CharZero K] (m : ℕ) (hm : 0 < m) : + Module.finrank K (CyclotomicField m K) ≤ Nat.totient m := by + let : NeZero m := ⟨hm.ne'⟩ + let C := CyclotomicField m K + let : IsCyclotomicExtension {m} K C := + CyclotomicField.isCyclotomicExtension m K + let : FiniteDimensional K C := + IsCyclotomicExtension.finiteDimensional {m} K C + obtain ⟨ζ, hζ⟩ := + (CyclotomicField.isCyclotomicExtension m K).exists_isPrimitiveRoot + (Set.mem_singleton m) hm.ne' + have hgen : Algebra.adjoin K ({ζ} : Set C) = ⊤ := + IsCyclotomicExtension.adjoin_primitive_root_eq_top hζ + have htop : IntermediateField.adjoin K ({ζ} : Set C) = ⊤ := + IntermediateField.adjoin_eq_top_of_algebra K ({ζ} : Set C) hgen + have hroot : Polynomial.aeval ζ (Polynomial.cyclotomic m K) = 0 := by + rw [Polynomial.aeval_def, Polynomial.eval₂_eq_eval_map, + Polynomial.map_cyclotomic, ← Polynomial.IsRoot.def] + exact hζ.isRoot_cyclotomic hm + have hdegree : + (minpoly K ζ).natDegree ≤ (Polynomial.cyclotomic m K).natDegree := + Polynomial.natDegree_le_natDegree + (minpoly.min K ζ (Polynomial.cyclotomic.monic m K) hroot) + calc + Module.finrank K (CyclotomicField m K) = Module.finrank K C := rfl + _ = Module.finrank K (IntermediateField.adjoin K ({ζ} : Set C)) := by + rw [htop] + simp + _ = (minpoly K ζ).natDegree := + IntermediateField.adjoin.finrank (IsIntegral.of_finite K ζ) + _ ≤ (Polynomial.cyclotomic m K).natDegree := hdegree + _ = Nat.totient m := Polynomial.natDegree_cyclotomic m K + +/-- A concrete cyclotomic embedding bounds the inertia cardinality by the +totient of its defining order. -/ +theorem natCard_inertiaGroup_le_totient_of_cyclotomicEmbedding + {K E : Type*} [Field K] [CharZero K] [Field E] [Algebra K E] + [FiniteDimensional K E] [IsGalois K E] + (A : _root_.ValuationSubring E) {m : ℕ} (hm : 0 < m) + (i : E →ₐ[K] CyclotomicField m K) : + Nat.card + (RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup K A) ≤ + Nat.totient m := by + let : NeZero m := ⟨hm.ne'⟩ + let : FiniteDimensional K (CyclotomicField m K) := + IsCyclotomicExtension.finiteDimensional {m} K (CyclotomicField m K) + exact (natCard_inertiaGroup_le_finrank A).trans + ((i.toLinearMap.finrank_le_finrank_of_injective i.injective).trans + (cyclotomicField_finrank_le_totient K m hm)) + +end HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionField.lean new file mode 100644 index 0000000000..3ec5f2ec2e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionField.lean @@ -0,0 +1,82 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionGroup +public import Mathlib.FieldTheory.Galois.Infinite +/-! +# Decomposition field + +The decomposition field is the fixed field of the decomposition group. This +formulation uses absolute values and therefore includes the archimedean case. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace HilbertRamification + +open scoped Pointwise Topology + +variable (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + +/-- The decomposition-field definition: the decomposition field `Z_w` of a +absolute value `w` over `K`. -/ +abbrev absoluteValueDecompositionField (w : AbsoluteValue L ℝ) : + IntermediateField K L := + IntermediateField.fixedField (absoluteValueDecompositionGroup K w) + +theorem mem_absoluteValueDecompositionField_iff + (w : AbsoluteValue L ℝ) (x : L) : + x ∈ absoluteValueDecompositionField K w ↔ + ∀ σ ∈ absoluteValueDecompositionGroup K w, σ x = x := + IntermediateField.mem_fixedField_iff (H := absoluteValueDecompositionGroup K w) x + +/-- The decomposition group is closed in the Krull topology. A failure to +preserve the valuation class is witnessed by one element `x`; the coset of +the open subgroup fixing `K(x)` is then contained in the complement. -/ +theorem absoluteValueDecompositionGroup_isClosed + [Algebra.IsAlgebraic K L] (w : AbsoluteValue L ℝ) : + IsClosed (absoluteValueDecompositionGroup K w : Set (L ≃ₐ[K] L)) where + isOpen_compl := isOpen_iff_mem_nhds.mpr fun σ hσ => by + rw [Set.mem_compl_iff, SetLike.mem_coe, + mem_absoluteValueDecompositionGroup_iff] at hσ + rcases Classical.not_forall.mp hσ with ⟨x, hx⟩ + let E : IntermediateField K L := IntermediateField.adjoin K {x} + let : FiniteDimensional K E := + IntermediateField.adjoin.finiteDimensional + (Algebra.IsIntegral.isIntegral x) + apply mem_nhds_iff.mpr + refine ⟨σ • (E.fixingSubgroup : Set (L ≃ₐ[K] L)), ?_, ?_, ?_⟩ + · intro τ hτ + rcases Set.mem_smul_set.mp hτ with ⟨g, hg, rfl⟩ + rw [Set.mem_compl_iff, SetLike.mem_coe, + mem_absoluteValueDecompositionGroup_iff] + intro hmem + apply hx + have hgx : g x = x := + (IntermediateField.mem_fixingSubgroup_iff E g).mp hg x + (IntermediateField.subset_adjoin (F := K) (S := {x}) (by simp)) + simpa [AlgEquiv.mul_apply, hgx] using hmem x + · exact E.fixingSubgroup_isOpen.smul σ + · exact ⟨1, E.fixingSubgroup.one_mem, by simp⟩ + +/-- For a finite or infinite Galois extension, the decomposition group is the +subgroup fixing its decomposition field. -/ +theorem absoluteValueDecompositionField_fixingSubgroup_eq + [IsGalois K L] (w : AbsoluteValue L ℝ) : + (absoluteValueDecompositionField K w).fixingSubgroup = + absoluteValueDecompositionGroup K w := by + let H : ClosedSubgroup (L ≃ₐ[K] L) := + ⟨absoluteValueDecompositionGroup K w, absoluteValueDecompositionGroup_isClosed K w⟩ + exact InfiniteGalois.fixingSubgroup_fixedField H + +end HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldExtension.lean new file mode 100644 index 0000000000..5e7d6ae8df --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldExtension.lean @@ -0,0 +1,110 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionField +/-! +# Decomposition-field extension comparison + +This file starts with clause (i): the restriction of `w` to its decomposition +field has a unique extension back to `L`. The proof works for finite or +infinite Galois extensions and for archimedean or nonarchimedean valuations. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- Restriction of an absolute value on `L` to an intermediate field. -/ +def absoluteValueRestrictIntermediateField + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (w : AbsoluteValue L ℝ) (E : IntermediateField K L) : AbsoluteValue E ℝ := + w.comp (f := algebraMap E L) (algebraMap E L).injective + +@[simp] theorem absoluteValueRestrictIntermediateField_apply + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (w : AbsoluteValue L ℝ) (E : IntermediateField K L) (x : E) : + absoluteValueRestrictIntermediateField w E x = w (x : L) := + rfl + +/-- Restricting an extension to an intermediate field that contains the base +preserves nontriviality. -/ +theorem absoluteValueRestrictIntermediateField_isNontrivial + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) (E : IntermediateField K L) : + (absoluteValueRestrictIntermediateField w.1 E).IsNontrivial := by + rcases hvK with ⟨a, ha, hva⟩ + refine ⟨algebraMap K E a, ?_, ?_⟩ + · intro hzero + apply ha + apply (algebraMap K E).injective + simpa using hzero + change w.1 (algebraMap E L (algebraMap K E a)) ≠ 1 + rw [← IsScalarTower.algebraMap_apply K E L, w.2 a] + exact hva + +/-- Regard `w` as an exact extension of its restriction to an intermediate +field. -/ +def absoluteValueExtensionOverRestriction + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (w : AbsoluteValue L ℝ) (E : IntermediateField K L) : + AbsoluteValueExtension + (absoluteValueRestrictIntermediateField w E) L := + ⟨w, fun _ => rfl⟩ + +/-- The decomposition-field extension comparison: `w|Z_w` has exactly one +extension to `L`. -/ +theorem decompositionField_unique_extension_over_decompositionField + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [IsGalois K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (w' : AbsoluteValueExtension + (absoluteValueRestrictIntermediateField w.1 + (HilbertRamification.absoluteValueDecompositionField K w.1)) L) : + w' = absoluteValueExtensionOverRestriction w.1 + (HilbertRamification.absoluteValueDecompositionField K w.1) := by + let Z := HilbertRamification.absoluteValueDecompositionField K w.1 + let wZ := absoluteValueRestrictIntermediateField w.1 Z + let wLZ : AbsoluteValueExtension wZ L := + absoluteValueExtensionOverRestriction w.1 Z + have hwZ : wZ.IsNontrivial := + absoluteValueRestrictIntermediateField_isNontrivial vK hvK w Z + rcases absoluteValueConjugacy wZ hwZ wLZ w' with ⟨σ, hσ⟩ + let σK : L ≃ₐ[K] L := + RamificationTheory.HilbertRamification.ValuationSubring.restrictAutomorphismScalars + (K := K) (M := Z) σ + have hfix : σK ∈ Z.fixingSubgroup := by + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + let z : Z := ⟨x, hx⟩ + simpa [σK, z, + RamificationTheory.HilbertRamification.ValuationSubring.restrictAutomorphismScalars] + using σ.commutes z + have hD : σK ∈ HilbertRamification.absoluteValueDecompositionGroup K w.1 := by + rw [← HilbertRamification.absoluteValueDecompositionField_fixingSubgroup_eq K w.1] + exact hfix + have hstab : + absoluteValueExtensionConjugate vK w σK = w := + (HilbertRamification.mem_absoluteValueDecompositionGroup_iff_extensionConjugate_eq + vK hvK w σK).mp hD + apply Subtype.ext + have hw' := congrArg Subtype.val hσ + calc + w'.1 = (absoluteValueExtensionConjugate wZ wLZ σ).1 := hw' + _ = (absoluteValueExtensionConjugate vK w σK).1 := rfl + _ = w.1 := congrArg Subtype.val hstab + +end Valuations +end AlgebraicNumberTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean new file mode 100644 index 0000000000..3f182a6b03 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean @@ -0,0 +1,528 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationDensity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionInvariants +public import Mathlib.FieldTheory.SeparableClosure +/-! +# Decomposition-field value and residue comparison + +This file identifies the decomposition field with the literal intersection +`L ∩ K_v` inside the algebraic localization `L_w`. It then records the +canonical residue-field isomorphism and equality of absolute-value ranges in +the nonarchimedean case. +-/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.ResidueField renaming + residue_eq_residue_iff_sub_mem_maximalIdeal → + residue_eq_residue_iff_sub_mem_maximalIdeal + + +noncomputable +section + +universe u v + +namespace HilbertRamification + +open AlgebraicNumberTheory.Valuations + +variable {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + +section LocalizationGalois + +variable [IsGalois K L] +variable (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + +/-- The completion at the extended absolute value is a `K`-algebra through the original +extension. -/ +local instance proposition98CompletionBaseAlgebra : Algebra K w.1.Completion := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + +/-- The action of `K` on the extended completion is induced by its completion algebra. -/ +local instance proposition98CompletionBaseSMul : SMul K w.1.Completion := + (AbsoluteValue.extensionCompletionAlgebra (K := K) w.1).toSMul + +/-- The completion at the extended absolute value is an algebra over the completed base field. -/ +local instance proposition98CompletionAlgebra : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + +/- The localization and its embedding are shared with `LocalizationDensity`; the two +source aliases used the same absolute-value constructions. -/ + +/-- The algebraic localization is a `K`-algebra through the completed base field. -/ +local instance proposition98LocalizationBaseAlgebra : Algebra K (localization vK w) := + ((algebraMap vK.Completion (localization vK w)).comp + (algebraMap K vK.Completion)).toAlgebra + +local instance proposition98LocalizationScalarTower : + IsScalarTower K vK.Completion (localization vK w) := + IsScalarTower.of_algebraMap_eq' (by + ext x + rfl) + +/-- The dense copy of `L` in the localization, as a `K`-algebra embedding +for the scalar tower `K → K_v → L_w`. -/ +def decompositionFieldToLocalizationAlgHom : + L →ₐ[K] localization vK w where + __ := toLocalization vK w + commutes' x := AbsoluteValue.toAlgebraicLocalization_algebraMap vK w.1 w.2 x + +omit [IsGalois K L] in +/-- The localization is generated over `K_v` by the subtype-valued copy of +`L`, not only by its ambient-completion representatives. -/ +theorem decompositionField_localization_adjoin_range_eq_top : + IntermediateField.adjoin vK.Completion + (Set.range (toLocalization vK w)) = ⊤ := by + let E := localization vK w + apply IntermediateField.lift_injective E + rw [IntermediateField.lift_adjoin, IntermediateField.lift_top] + change IntermediateField.adjoin vK.Completion + (Subtype.val '' Set.range (toLocalization vK w)) = + AbsoluteValue.algebraicLocalization vK w.1 w.2 + congr 1 + ext z + constructor + · rintro ⟨_, ⟨x, rfl⟩, rfl⟩ + exact ⟨x, rfl⟩ + · rintro ⟨x, rfl⟩ + exact ⟨toLocalization vK w x, ⟨x, rfl⟩, rfl⟩ + +omit hvK in +/-- Every generator coming from `L` is separable over `K_v`. -/ +theorem decompositionField_toLocalization_isSeparable (x : L) : + IsSeparable vK.Completion (toLocalization vK w x) := by + have hx : IsSeparable K + (decompositionFieldToLocalizationAlgHom vK w x) := + (Algebra.IsSeparable.isSeparable K x).map + (decompositionFieldToLocalizationAlgHom vK w) + (decompositionFieldToLocalizationAlgHom vK w).injective + exact IsSeparable.tower_top vK.Completion hx + +omit hvK in +/-- Every generator coming from `L` has its `K_v`-minimal polynomial split +inside the localization. -/ +theorem decompositionField_toLocalization_minpoly_splits (x : L) : + ((minpoly vK.Completion (toLocalization vK w x)).map + (algebraMap vK.Completion (localization vK w))).Splits := by + let i := decompositionFieldToLocalizationAlgHom vK w + have hxint : IsIntegral K x := Algebra.IsIntegral.isIntegral x + have hsK : ((minpoly K x).map + (algebraMap K (localization vK w))).Splits := by + have hi : i.toRingHom.comp (algebraMap K L) = + algebraMap K (localization vK w) := i.comp_algebraMap + have hs := (Normal.splits (F := K) (K := L) inferInstance x).map + i.toRingHom + simpa only [Polynomial.map_map, hi] using hs + have hsTower : (((minpoly K x).map (algebraMap K vK.Completion)).map + (algebraMap vK.Completion (localization vK w))).Splits := by + simpa only [Polynomial.map_map, + IsScalarTower.algebraMap_eq K vK.Completion (localization vK w)] using hsK + have hdvd : minpoly vK.Completion (toLocalization vK w x) ∣ + (minpoly K x).map (algebraMap K vK.Completion) := by + have h := minpoly.dvd_map_of_isScalarTower K vK.Completion + (toLocalization vK w x) + have hmin : minpoly K (toLocalization vK w x) = minpoly K x := + minpoly.algHom_eq i i.injective x + rwa [hmin] at h + exact hsTower.of_dvd + (Polynomial.map_ne_zero + (Polynomial.map_ne_zero (minpoly.ne_zero hxint))) + ((Polynomial.map_dvd_map' _).mpr hdvd) + +omit hvK in +/-- The algebraic localization of a Galois extension is normal over the +completed base field, with no finite-degree hypothesis. -/ +theorem decompositionField_localization_normal : + Normal vK.Completion (localization vK w) := by + let : Algebra.IsAlgebraic vK.Completion (localization vK w) := + AbsoluteValue.algebraicLocalization_isAlgebraic vK w.1 w.2 + rw [normal_iff] + intro z + refine ⟨Algebra.IsIntegral.isIntegral z, ?_⟩ + apply IntermediateField.splits_of_mem_adjoin + (F := vK.Completion) (K := localization vK w) + (L := localization vK w) + (S := Set.range (toLocalization vK w)) + · intro y hy + rcases hy with ⟨x, rfl⟩ + exact ⟨(decompositionField_toLocalization_isSeparable vK w x).isIntegral, + decompositionField_toLocalization_minpoly_splits vK w x⟩ + · rw [decompositionField_localization_adjoin_range_eq_top vK w] + trivial + +omit hvK in +/-- The algebraic localization of a Galois extension is separable over the +completed base field, with no finite-degree hypothesis. -/ +theorem decompositionField_localization_separable : + Algebra.IsSeparable vK.Completion (localization vK w) := by + let S := Set.range (toLocalization vK w) + have hS : Algebra.IsSeparable vK.Completion + (IntermediateField.adjoin vK.Completion S) := + (IntermediateField.isSeparable_adjoin_iff_isSeparable + (F := vK.Completion) (E := localization vK w)).mpr fun y hy => by + rcases hy with ⟨x, rfl⟩ + exact decompositionField_toLocalization_isSeparable vK w x + let : Algebra.IsSeparable vK.Completion + (IntermediateField.adjoin vK.Completion S) := hS + refine ⟨fun z => ?_⟩ + have hz : z ∈ IntermediateField.adjoin vK.Completion S := by + rw [decompositionField_localization_adjoin_range_eq_top vK w] + trivial + exact IntermediateField.isSeparable_of_mem_isSeparable vK.Completion + (localization vK w) hz + +omit hvK in +/-- The algebraic localization of a Galois extension is Galois over `K_v`. +This permits the fixed-field argument in infinite degree. -/ +theorem algebraicLocalization_isGalois : + IsGalois vK.Completion (localization vK w) := + isGalois_iff.mpr + ⟨decompositionField_localization_separable vK w, + decompositionField_localization_normal vK w⟩ + +/-- The copy of `K_v` as an actual subfield of the algebraic localization. -/ +abbrev decompositionFieldCompletionImageSubfield : + Subfield (localization vK w) := + (algebraMap vK.Completion (localization vK w)).fieldRange + +include hvK + +/-- The decomposition-field extension comparison, comap form: an element of `L` lies in the +decomposition field exactly when its image in `L_w` belongs to the embedded +copy of `K_v`. -/ +theorem decompositionField_decompositionField_eq_completionImage_comap : + (decompositionFieldCompletionImageSubfield vK w).comap + (toLocalization vK w) = + (absoluteValueDecompositionField K w.1).toSubfield := by + let : IsGalois vK.Completion (localization vK w) := + algebraicLocalization_isGalois vK w + ext x + change toLocalization vK w x ∈ + Set.range (algebraMap vK.Completion (localization vK w)) ↔ + x ∈ absoluteValueDecompositionField K w.1 + rw [InfiniteGalois.mem_range_algebraMap_iff_fixed, + mem_absoluteValueDecompositionField_iff] + constructor + · intro hfixed σ hσ + let δ : absoluteValueDecompositionGroup K w.1 := ⟨σ, hσ⟩ + apply (toLocalization vK w).injective + calc + toLocalization vK w (σ x) = + decompositionGroupEquivAlgebraicLocalizationAut vK hvK w δ + (toLocalization vK w x) := + (localizationRamificationGroups_decompositionGroupEquiv_toLocalization + vK hvK w δ x).symm + _ = toLocalization vK w x := hfixed _ + · intro hZ τ + let δ : absoluteValueDecompositionGroup K w.1 := + (decompositionGroupEquivAlgebraicLocalizationAut vK hvK w).symm τ + have hδ : ((δ : L ≃ₐ[K] L) x) = x := hZ δ δ.property + calc + τ (toLocalization vK w x) = + decompositionGroupEquivAlgebraicLocalizationAut vK hvK w δ + (toLocalization vK w x) := by + rw [MulEquiv.apply_symm_apply] + _ = toLocalization vK w ((δ : L ≃ₐ[K] L) x) := + localizationRamificationGroups_decompositionGroupEquiv_toLocalization + vK hvK w δ x + _ = toLocalization vK w x := congrArg (toLocalization vK w) hδ + +/-- The decomposition-field extension comparison, literal intersection form inside `L_w`: +the image of `Z_w` is the infimum of the images of `L` and `K_v`. -/ +theorem decompositionField_decompositionField_image_eq_intersection : + (toLocalization vK w).fieldRange ⊓ + decompositionFieldCompletionImageSubfield vK w = + (absoluteValueDecompositionField K w.1).toSubfield.map + (toLocalization vK w) := by + calc + (toLocalization vK w).fieldRange ⊓ + decompositionFieldCompletionImageSubfield vK w = + decompositionFieldCompletionImageSubfield vK w ⊓ + (toLocalization vK w).fieldRange := by rw [inf_comm] + _ = ((decompositionFieldCompletionImageSubfield vK w).comap + (toLocalization vK w)).map (toLocalization vK w) := + (Subfield.map_comap_eq (toLocalization vK w) + (decompositionFieldCompletionImageSubfield vK w)).symm + _ = (absoluteValueDecompositionField K w.1).toSubfield.map + (toLocalization vK w) := by + rw [decompositionField_decompositionField_eq_completionImage_comap + vK hvK w] + +omit hvK + +omit [IsGalois K L] in +/-- Nonarchimedeanness passes from the exact base valuation to its extension +`w`; this uses only the bounded-natural-number definition. -/ +theorem absoluteValueExtension_nonarchimedean_of_base + (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : + LubinTate.Valuations.NonarchimedeanAbsoluteValue w.1 := by + rcases hv with ⟨C, hC⟩ + refine ⟨C, fun n => ?_⟩ + have hext := w.2 (n : K) + simpa using hext.trans_le (hC n) + +omit [IsGalois K L] in +/-- Nonarchimedeanness also passes to the restriction of `w` to `Z_w`. -/ +theorem decompositionField_decompositionField_nonarchimedean + (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : + LubinTate.Valuations.NonarchimedeanAbsoluteValue + (AlgebraicNumberTheory.Valuations.absoluteValueRestrictIntermediateField w.1 + (absoluteValueDecompositionField K w.1)) := by + rcases absoluteValueExtension_nonarchimedean_of_base vK w hv with ⟨C, hC⟩ + exact ⟨C, fun n => by simpa using hC n⟩ + +/-- The norm absolute value on `K_v` is nonarchimedean whenever `v` is. -/ +theorem decompositionField_completion_nonarchimedean + (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : + LubinTate.Valuations.NonarchimedeanAbsoluteValue + (AbsoluteValue.completionAbsoluteValue vK) := + (AbsoluteValue.isNonarchimedean_iff_bounded_nat + (AbsoluteValue.completionAbsoluteValue vK)).1 + (AbsoluteValue.completionAbsoluteValue_isNonarchimedean vK + ((AbsoluteValue.isNonarchimedean_iff_bounded_nat vK).2 hv)) + +/-- Completion does not enlarge the range of a nonarchimedean absolute +value. This provides the value-group equality used in the decomposition-field extension + comparison. -/ +theorem decompositionField_completionAbsoluteValue_range_eq + (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : + Set.range (AbsoluteValue.completionAbsoluteValue vK) = Set.range vK := + AbsoluteValue.completionAbsoluteValue_range_eq vK + ((AbsoluteValue.isNonarchimedean_iff_bounded_nat vK).2 hv) + +include hvK + +/-- The decomposition-field extension comparison, value-group form: `w|Z_w` and `v` have literally +the same range in `ℝ`. -/ +theorem decompositionField_decompositionField_valueRange_eq + (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : + Set.range + (AlgebraicNumberTheory.Valuations.absoluteValueRestrictIntermediateField w.1 + (absoluteValueDecompositionField K w.1)) = + Set.range vK := by + let Z := absoluteValueDecompositionField K w.1 + let wZ := AlgebraicNumberTheory.Valuations.absoluteValueRestrictIntermediateField w.1 Z + let aE := AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 + apply Set.Subset.antisymm + · rintro r ⟨z, rfl⟩ + have hz : (z : L) ∈ Z.toSubfield := z.property + rw [← decompositionField_decompositionField_eq_completionImage_comap + vK hvK w] at hz + rcases hz with ⟨y, hy⟩ + have hvalue : wZ z = AbsoluteValue.completionAbsoluteValue vK y := by + calc + wZ z = aE (toLocalization vK w (z : L)) := + (AbsoluteValue.algebraicLocalizationAbsoluteValue_toAlgebraicLocalization vK w.1 w.2 + (z : L)).symm + _ = aE (algebraMap vK.Completion (localization vK w) y) := by + rw [hy] + _ = AbsoluteValue.completionAbsoluteValue vK y := + AbsoluteValue.algebraicLocalizationAbsoluteValue_extends vK w.1 w.2 y + rw [hvalue] + exact (Set.ext_iff.mp + (decompositionField_completionAbsoluteValue_range_eq vK hv) + (AbsoluteValue.completionAbsoluteValue vK y)).mp ⟨y, rfl⟩ + · rintro r ⟨x, rfl⟩ + refine ⟨algebraMap K Z x, ?_⟩ + change w.1 (algebraMap Z L (algebraMap K Z x)) = vK x + rw [← IsScalarTower.algebraMap_apply K Z L, w.2 x] + +omit hvK + +/-- The valuation subring of the nonarchimedean base absolute value. -/ +abbrev decompositionFieldBaseValuationSubring + (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : + _root_.ValuationSubring K := + absoluteValueValuationSubring vK hv + +/-- The valuation subring of `w|Z_w`. -/ +abbrev decompositionFieldDecompositionFieldValuationSubring + (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : + _root_.ValuationSubring (absoluteValueDecompositionField K w.1) := + absoluteValueValuationSubring + (AlgebraicNumberTheory.Valuations.absoluteValueRestrictIntermediateField w.1 + (absoluteValueDecompositionField K w.1)) + (decompositionField_decompositionField_nonarchimedean vK w hv) + +/-- The canonical local homomorphism between the two valuation subrings in +the decomposition-field extension comparison. -/ +def decompositionFieldDecompositionFieldIntegerMap + (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : + decompositionFieldBaseValuationSubring vK hv →+* + decompositionFieldDecompositionFieldValuationSubring vK w hv := by + let Z := absoluteValueDecompositionField K w.1 + let AK := decompositionFieldBaseValuationSubring vK hv + let AZ := decompositionFieldDecompositionFieldValuationSubring vK w hv + apply RingHom.codRestrict ((algebraMap K Z).comp AK.subtype) AZ + intro x + rw [mem_absoluteValueValuationSubring_iff] + change w.1 (algebraMap Z L (algebraMap K Z x)) ≤ 1 + rw [← IsScalarTower.algebraMap_apply K Z L, w.2] + exact (mem_absoluteValueValuationSubring_iff + vK hv x).mp x.property + +omit [IsGalois K L] in +@[simp] theorem decompositionField_decompositionField_integerMap_apply + (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) + (x : decompositionFieldBaseValuationSubring vK hv) : + ((decompositionFieldDecompositionFieldIntegerMap vK w hv x : + decompositionFieldDecompositionFieldValuationSubring vK w hv) : + absoluteValueDecompositionField K w.1) = + algebraMap K (absoluteValueDecompositionField K w.1) (x : K) := + rfl + +/-- The valuation-ring map in the decomposition-field extension comparison is local. -/ +instance decompositionField_decompositionField_integerMap_isLocalHom + (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : + IsLocalHom (decompositionFieldDecompositionFieldIntegerMap vK w hv) where + map_nonunit x hx := by + rw [← IsLocalRing.notMem_maximalIdeal] at hx ⊢ + intro hxmax + apply hx + have hxabs : vK (x : K) < 1 := + (absoluteValueValuationSubring_mem_maximalIdeal_iff_abs_lt_one + vK hv x).mp hxmax + rw [absoluteValueValuationSubring_mem_maximalIdeal_iff_abs_lt_one] + rw [decompositionField_decompositionField_integerMap_apply] + change w.1 (algebraMap + (absoluteValueDecompositionField K w.1) L + (algebraMap K (absoluteValueDecompositionField K w.1) (x : K))) < 1 + rw [← IsScalarTower.algebraMap_apply K + (absoluteValueDecompositionField K w.1) L, w.2] + exact hxabs + +/-- The induced canonical map of actual residue fields. -/ +def decompositionFieldDecompositionFieldResidueMap + (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : + IsLocalRing.ResidueField (decompositionFieldBaseValuationSubring vK hv) →+* + IsLocalRing.ResidueField + (decompositionFieldDecompositionFieldValuationSubring vK w hv) := + IsLocalRing.ResidueField.map + (decompositionFieldDecompositionFieldIntegerMap vK w hv) + +include hvK + +/-- The canonical residue-field map in the decomposition-field extension comparison is surjective. +The proof chooses a representative in `K_v`, then approximates +it modulo the maximal ideal by an element of `K`. -/ +theorem decompositionField_decompositionField_residueMap_surjective + (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : + Function.Surjective + (decompositionFieldDecompositionFieldResidueMap vK w hv) := by + let Z := absoluteValueDecompositionField K w.1 + let AK := decompositionFieldBaseValuationSubring vK hv + let AZ := decompositionFieldDecompositionFieldValuationSubring vK w hv + let f := decompositionFieldDecompositionFieldIntegerMap vK w hv + let aK := AbsoluteValue.completionAbsoluteValue vK + let aE := AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 + let vId : AbsoluteValueExtension vK K := ⟨vK, fun _ => rfl⟩ + intro q + obtain ⟨z, rfl⟩ := IsLocalRing.residue_surjective q + have hzmem : ((z : Z) : L) ∈ Z.toSubfield := (z : Z).property + rw [← decompositionField_decompositionField_eq_completionImage_comap + vK hvK w] at hzmem + rcases hzmem with ⟨y, hy⟩ + have hzle : + (AlgebraicNumberTheory.Valuations.absoluteValueRestrictIntermediateField w.1 Z) + (z : Z) ≤ 1 := + (mem_absoluteValueValuationSubring_iff + _ (decompositionField_decompositionField_nonarchimedean vK w hv) _).mp + z.property + have hyle : aK y ≤ 1 := by + calc + aK y = aE (algebraMap vK.Completion (localization vK w) y) := + (AbsoluteValue.algebraicLocalizationAbsoluteValue_extends vK w.1 w.2 y).symm + _ = aE (toLocalization vK w ((z : Z) : L)) := by rw [hy] + _ = w.1 ((z : Z) : L) := + AbsoluteValue.algebraicLocalizationAbsoluteValue_toAlgebraicLocalization vK w.1 w.2 _ + _ ≤ 1 := hzle + obtain ⟨x, hx⟩ := + (AbsoluteValue.denseRange_toCompletion vId.1).exists_dist_lt + y (show (0 : ℝ) < 1 by norm_num) + have hclose : aK (y - algebraMap K vK.Completion x) < 1 := by + change ‖y - AbsoluteValue.toCompletion vId.1 x‖ < 1 + simpa only [dist_eq_norm] using hx + have hstrong : LubinTate.Valuations.StrongTriangle aK := + LubinTate.Valuations.strong_triangle_of_nonarchimedean aK + (decompositionField_completion_nonarchimedean vK hv) + have hxle : aK (algebraMap K vK.Completion x) ≤ 1 := by + calc + aK (algebraMap K vK.Completion x) = + aK (y + -(y - algebraMap K vK.Completion x)) := by + congr 1 + ring + _ ≤ max (aK y) (aK (-(y - algebraMap K vK.Completion x))) := + hstrong _ _ + _ = max (aK y) (aK (y - algebraMap K vK.Completion x)) := by + rw [AbsoluteValue.map_neg] + _ ≤ 1 := max_le hyle hclose.le + have hxbase : vK x ≤ 1 := by + rw [← AbsoluteValue.completionAbsoluteValue_coe vK x] + exact hxle + let xA : AK := + ⟨x, (mem_absoluteValueValuationSubring_iff + vK hv x).mpr hxbase⟩ + refine ⟨IsLocalRing.residue AK xA, ?_⟩ + change IsLocalRing.ResidueField.map f (IsLocalRing.residue AK xA) = + IsLocalRing.residue AZ z + rw [IsLocalRing.ResidueField.map_residue] + rw [residue_eq_residue_iff_sub_mem_maximalIdeal] + rw [absoluteValueValuationSubring_mem_maximalIdeal_iff_abs_lt_one] + calc + (AlgebraicNumberTheory.Valuations.absoluteValueRestrictIntermediateField w.1 Z) + (((f xA : AZ) : Z) - (z : Z)) = + aE (toLocalization vK w + ((((f xA : AZ) : Z) - (z : Z) : Z) : L)) := + (AbsoluteValue.algebraicLocalizationAbsoluteValue_toAlgebraicLocalization vK w.1 w.2 _).symm + _ = aE (algebraMap vK.Completion (localization vK w) + (algebraMap K vK.Completion x - y)) := by + congr 1 + rw [map_sub (algebraMap vK.Completion (localization vK w))] + dsimp [f] + dsimp [xA] + rw [map_sub, AbsoluteValue.toAlgebraicLocalization_algebraMap, ← hy] + _ = aK (algebraMap K vK.Completion x - y) := + AbsoluteValue.algebraicLocalizationAbsoluteValue_extends vK w.1 w.2 _ + _ = aK (y - algebraMap K vK.Completion x) := by + rw [← AbsoluteValue.map_neg] + congr 1 + ring + _ < 1 := hclose + +/-- The decomposition-field extension comparison, residue-field form: the canonical residue map +is an +isomorphism of the actual residue fields. -/ +def decompositionFieldDecompositionFieldResidueFieldEquiv + (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : + IsLocalRing.ResidueField (decompositionFieldBaseValuationSubring vK hv) ≃+* + IsLocalRing.ResidueField + (decompositionFieldDecompositionFieldValuationSubring vK w hv) := + ValuationTheory.DiscreteValuationField.ResidueField.ringEquivOfSurjective + (decompositionFieldDecompositionFieldIntegerMap vK w hv) + (decompositionField_decompositionField_residueMap_surjective vK hvK w hv) + +@[simp] theorem decompositionField_decompositionField_residueFieldEquiv_apply + (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) + (x : IsLocalRing.ResidueField + (decompositionFieldBaseValuationSubring vK hv)) : + decompositionFieldDecompositionFieldResidueFieldEquiv vK hvK w hv x = + decompositionFieldDecompositionFieldResidueMap vK w hv x := + rfl + +omit hvK + +end LocalizationGalois + +end HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionGroup.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionGroup.lean new file mode 100644 index 0000000000..2fd5016bc0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionGroup.lean @@ -0,0 +1,230 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AbsoluteValueConjugacy +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring +/-! +# Decomposition-group restriction law + +This file gives the three tower-intersection formulas in their common ambient +Galois group. The decomposition-group statement is formulated for arbitrary +absolute values, including the archimedean case. The inertia and ramification +statements use valuation subrings and therefore cover the nonarchimedean case +in which those groups are defined. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w + +namespace HilbertRamification + +open AlgebraicNumberTheory.Valuations +open RamificationTheory.HilbertRamification.ValuationSubring + +variable (K : Type u) {L : Type w} [Field K] [Field L] [Algebra K L] + +/-- The decomposition group of an absolute-value class. Membership says that pullback by the +automorphism preserves the strict unit ball, equivalently the valuation +class, rather than requiring equality of chosen absolute-value representatives. +-/ +def absoluteValueDecompositionGroup (w : AbsoluteValue L ℝ) : + Subgroup (L ≃ₐ[K] L) where + carrier := { σ | ∀ x : L, w (σ x) < 1 ↔ w x < 1 } + one_mem' := by + intro x + rfl + mul_mem' := by + intro σ τ hσ hτ x + exact (hσ (τ x)).trans (hτ x) + inv_mem' := by + intro σ hσ x + have h := hσ (σ⁻¹ x) + simpa using h.symm + +@[simp] theorem mem_absoluteValueDecompositionGroup_iff + (w : AbsoluteValue L ℝ) (σ : L ≃ₐ[K] L) : + σ ∈ absoluteValueDecompositionGroup K w ↔ + ∀ x : L, w (σ x) < 1 ↔ w x < 1 := + Iff.rfl + +/-- Membership really is preservation of the absolute-value class: the +pullback absolute value is equivalent to the chosen representative. -/ +theorem mem_absoluteValueDecompositionGroup_iff_equivalent + (w : AbsoluteValue L ℝ) (σ : L ≃ₐ[K] L) : + σ ∈ absoluteValueDecompositionGroup K w ↔ + LubinTate.Valuations.EquivalentAbsoluteValues + (w.comp (f := σ.toRingEquiv.toRingHom) σ.injective) w := by + rw [LubinTate.Valuations.equivalentAbsoluteValues_iff_isEquiv, + AbsoluteValue.isEquiv_iff_lt_one_iff] + rfl + +/-- The decomposition and inertia definition: on the normalized extension type, +the decomposition group is exactly the stabilizer of the chosen extension +under `w ↦ w ∘ σ`. -/ +theorem mem_absoluteValueDecompositionGroup_iff_extensionConjugate_eq + {K₀ : Type u} {L₀ : Type w} [Field K₀] [Field L₀] [Algebra K₀ L₀] + (vK : AbsoluteValue K₀ ℝ) (hvK : vK.IsNontrivial) + (vL : AbsoluteValueExtension vK L₀) (σ : L₀ ≃ₐ[K₀] L₀) : + σ ∈ absoluteValueDecompositionGroup K₀ vL.1 ↔ + absoluteValueExtensionConjugate vK vL σ = vL := by + rw [mem_absoluteValueDecompositionGroup_iff_equivalent] + change + LubinTate.Valuations.EquivalentAbsoluteValues + (absoluteValueExtensionConjugate vK vL σ).1 vL.1 ↔ _ + constructor + · exact equivalent_exactExtensions_eq vK hvK + (absoluteValueExtensionConjugate vK vL σ) vL + · intro h + rw [h] + exact LubinTate.Valuations.equivalentAbsoluteValues_refl vL.1 + +section IntermediateField + +variable {M : Type v} [Field M] [Algebra K M] [Algebra M L] + [IsScalarTower K M L] + +/-- The scalar-restriction map in the decomposition-group restriction law is the canonical inclusion +`G(L/M) → G(L/K)`. -/ +theorem decompositionGroupRestriction_restrictAutomorphismScalars_injective : + Function.Injective + (RamificationTheory.HilbertRamification.ValuationSubring.restrictAutomorphismScalars + (K := K) (M := M) (L := L)) := by + intro σ τ h + ext x + exact DFunLike.congr_fun h x + +/-- The decomposition-group restriction law, decomposition-group membership form: scalar restriction +does not change the action on the chosen valuation of `L`. -/ +theorem decompositionGroupRestriction_mem_absoluteValueDecompositionGroup_restrictScalars_iff + (w : AbsoluteValue L ℝ) (σ : L ≃ₐ[M] L) : + RamificationTheory.HilbertRamification.ValuationSubring.restrictAutomorphismScalars (K := K) + (M := M) σ ∈ + absoluteValueDecompositionGroup K w ↔ + σ ∈ absoluteValueDecompositionGroup M w := + Iff.rfl + +/-- The decomposition-group restriction law, including the archimedean case: +inside `G(L/K)`, the decomposition group over `M` is +`G_w(L/K) ∩ G(L/M)`. -/ +theorem decompositionGroupRestriction_absoluteValueDecompositionGroup_range_eq_inf + (w : AbsoluteValue L ℝ) : + Subgroup.map + (RamificationTheory.HilbertRamification.ValuationSubring.restrictAutomorphismScalars (K + := K) (M := M)) + (absoluteValueDecompositionGroup M w) = + absoluteValueDecompositionGroup K w ⊓ + (RamificationTheory.HilbertRamification.ValuationSubring.restrictAutomorphismScalars + (K := K) (M := M)).range := by + ext σ + constructor + · rintro ⟨τ, hτ, rfl⟩ + exact + ⟨(decompositionGroupRestriction_mem_absoluteValueDecompositionGroup_restrictScalars_iff + (K := K) (M := M) w τ).mpr hτ, + ⟨τ, rfl⟩⟩ + · rintro ⟨hσ, τ, rfl⟩ + exact + ⟨τ, + (decompositionGroupRestriction_mem_absoluteValueDecompositionGroup_restrictScalars_iff + (K := K) (M := M) w τ).mp hσ, + rfl⟩ + +end IntermediateField + +namespace ValuationSubring + +section NonarchimedeanIntermediateField + +variable {M : Type v} [Field M] [Algebra K M] [Algebra M L] + [IsScalarTower K M L] + +/-- The decomposition-group restriction law, ambient-automorphism form: +inside `G(L/K)`, one has `I_w(L/M) = I_w(L/K) ∩ G(L/M)`. -/ +theorem decompositionGroupRestriction_inertiaGroupInAut_range_eq_inf + (A : _root_.ValuationSubring L) : + Subgroup.map (restrictAutomorphismScalars (K := K) (M := M)) + (inertiaGroupInAut M A) = + inertiaGroupInAut K A ⊓ + (restrictAutomorphismScalars (K := K) (M := M)).range := by + ext σ + constructor + · rintro ⟨τ, ⟨δ, hδ, rfl⟩, rfl⟩ + refine ⟨?_, ⟨(δ : L ≃ₐ[M] L), rfl⟩⟩ + exact + ⟨decompositionGroupRestrictScalars (K := K) (M := M) A δ, + (mem_inertiaGroup_restrictScalars_iff + (K := K) (M := M) A δ).mpr hδ, + rfl⟩ + · rintro ⟨hσ, τ, rfl⟩ + rcases hσ with ⟨δ, hδ, hδτ⟩ + let δM : decompositionGroup M A := + ⟨τ, + (mem_decompositionGroup_restrictScalars_iff + (K := K) (M := M) A τ).mp (hδτ ▸ δ.property)⟩ + have hrestrict : + decompositionGroupRestrictScalars (K := K) (M := M) A δM = δ := by + apply Subtype.ext + exact hδτ.symm + have hδM : δM ∈ inertiaGroup M A := + (mem_inertiaGroup_restrictScalars_iff + (K := K) (M := M) A δM).mp (hrestrict ▸ hδ) + refine ⟨τ, ?_, rfl⟩ + exact ⟨δM, hδM, rfl⟩ + +/-- The decomposition-group restriction law, ambient-automorphism form: +inside `G(L/K)`, one has `R_w(L/M) = R_w(L/K) ∩ G(L/M)`. -/ +theorem decompositionGroupRestriction_ramificationGroupInAut_range_eq_inf + (A : _root_.ValuationSubring L) : + Subgroup.map (restrictAutomorphismScalars (K := K) (M := M)) + (ramificationGroupInAut M A) = + ramificationGroupInAut K A ⊓ + (restrictAutomorphismScalars (K := K) (M := M)).range := by + ext σ + constructor + · rintro ⟨τ, ⟨ι, hι, rfl⟩, rfl⟩ + refine ⟨?_, ⟨inertiaGroupToAut (K := M) A ι, rfl⟩⟩ + exact + ⟨inertiaGroupRestrictScalars (K := K) (M := M) A ι, + (mem_ramificationGroup_restrictScalars_iff + (K := K) (M := M) A ι).mpr hι, + rfl⟩ + · rintro ⟨hσ, τ, rfl⟩ + rcases hσ with ⟨ι, hι, hιτ⟩ + let δM : decompositionGroup M A := + ⟨τ, + (mem_decompositionGroup_restrictScalars_iff + (K := K) (M := M) A τ).mp + (hιτ ▸ (ι : decompositionGroup K A).property)⟩ + have hrestrictD : + decompositionGroupRestrictScalars (K := K) (M := M) A δM = + (ι : decompositionGroup K A) := by + apply Subtype.ext + exact hιτ.symm + have hδM : δM ∈ inertiaGroup M A := + (mem_inertiaGroup_restrictScalars_iff + (K := K) (M := M) A δM).mp (hrestrictD ▸ ι.property) + let ιM : inertiaGroup M A := ⟨δM, hδM⟩ + have hrestrictI : + inertiaGroupRestrictScalars (K := K) (M := M) A ιM = ι := by + apply Subtype.ext + exact hrestrictD + have hιM : ιM ∈ ramificationGroup M A := + (mem_ramificationGroup_restrictScalars_iff + (K := K) (M := M) A ιM).mp (hrestrictI ▸ hι) + refine ⟨τ, ?_, rfl⟩ + exact ⟨ιM, hιM, rfl⟩ + +end NonarchimedeanIntermediateField + +end ValuationSubring + +end HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind.lean new file mode 100644 index 0000000000..ea2c8a3437 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind.lean @@ -0,0 +1,22 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.CompositumUnramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Conjugation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFieldTower +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFieldUnramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFields +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.NumberFieldPrimes +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.OrbitCardinality +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.PrimeContractions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.TowerInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.ValuedGalois + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Basic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Basic.lean new file mode 100644 index 0000000000..149d618d61 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Basic.lean @@ -0,0 +1,572 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.RamificationInertia.Galois +public import Mathlib.NumberTheory.RamificationInertia.Inertia +public import Mathlib.Algebra.Exact.Basic +public import Mathlib.RingTheory.DedekindDomain.Factorization +/-! +# Hilbert ramification theory: Dedekind-domain layer + +This file manages the Dedekind-domain part of Hilbert ramification theory in +prime-decomposition theory. + +The implementation uses mathlib's ramification/inertia theorems where those +are already the source proof, but the decomposition/inertia/residue-action +interface is proved here: membership criteria, residue-action formula, +normality of inertia in the decomposition group, exactness, and quotient form. +-/ + +@[expose] public section + +noncomputable +section + +namespace HilbertRamification +namespace Dedekind + +open scoped Pointwise +open Algebra Module + +attribute [local instance] Ideal.Quotient.field + +variable {A B : Type*} [CommRing A] [CommRing B] [Algebra A B] + +/-- The decomposition and inertia definition: +the decomposition group of a prime ideal. -/ +abbrev decompositionGroup + (P : Ideal B) (G : Type*) [Group G] [MulSemiringAction G B] : + Subgroup G := + MulAction.stabilizer G P + +/-- Membership in the decomposition group is exactly stabilization of the prime +ideal. -/ +theorem mem_decompositionGroup_iff + {P : Ideal B} {G : Type*} [Group G] [MulSemiringAction G B] {σ : G} : + σ ∈ decompositionGroup P G ↔ σ • P = P := + Iff.rfl + +/-- The inertia-field definition: +the inertia group of a prime ideal. -/ +abbrev inertiaGroup + (P : Ideal B) (G : Type*) [Group G] [MulSemiringAction G B] : + Subgroup G := + P.toAddSubgroup.inertia G + +/-- Membership in the inertia group is trivial action on the residue ring. -/ +theorem mem_inertiaGroup_iff + {P : Ideal B} {G : Type*} [Group G] [MulSemiringAction G B] {σ : G} : + σ ∈ inertiaGroup P G ↔ ∀ x : B, σ • x - x ∈ P := + Iff.rfl + +/-- prime-decomposition theory: +the residue-field action of the decomposition group. -/ +abbrev residueStabilizerHom + (p : Ideal A) (P : Ideal B) [P.LiesOver p] + (G : Type*) [Group G] [MulSemiringAction G B] [SMulCommClass G A B] : + decompositionGroup P G →* (B ⧸ P) ≃ₐ[A ⧸ p] B ⧸ P := + Ideal.Quotient.stabilizerHom P p G + +/-- prime-decomposition theory: +the residue action is concretely `a mod P ↦ σ a mod P`. -/ +@[simp] theorem residueStabilizerHom_apply + (p : Ideal A) (P : Ideal B) [P.LiesOver p] + (G : Type*) [Group G] [MulSemiringAction G B] [SMulCommClass G A B] + (σ : decompositionGroup P G) (b : B) : + residueStabilizerHom p P G σ b = ↑(σ • b) := + Ideal.Quotient.stabilizerHom_apply P p G σ b + +/-- Inertia is normal inside the decomposition group. The proof is the +intrinsic conjugation argument: if `σ` is trivial mod `P`, then +`τ σ τ⁻¹` is also trivial mod `P` because `τ` stabilizes `P`. -/ +instance inertiaSubgroupOfDecomposition_normal + (P : Ideal B) (G : Type*) [Group G] [MulSemiringAction G B] : + ((inertiaGroup P G).subgroupOf (decompositionGroup P G)).Normal := by + refine ⟨?_⟩ + intro σ hσ τ + rw [Subgroup.mem_subgroupOf] at hσ ⊢ + rw [mem_inertiaGroup_iff] at hσ ⊢ + intro x + let y : B := (σ : G) • ((τ : G)⁻¹ • x) - ((τ : G)⁻¹ • x) + have hy : y ∈ P := hσ ((τ : G)⁻¹ • x) + have hτy : (τ : G) • y ∈ (τ : G) • P := + Ideal.smul_mem_pointwise_smul (τ : G) y P hy + rw [τ.property] at hτy + simpa [y, smul_sub, mul_smul, inv_smul_smul] using hτy + +/-- The valuation-conjugacy theorem: +the Galois group acts transitively on primes over a fixed prime. -/ +theorem exists_smul_eq_of_isGaloisGroup + (p : Ideal A) (P Q : Ideal B) + [P.IsPrime] [P.LiesOver p] [Q.IsPrime] [Q.LiesOver p] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] + [IsGaloisGroup G A B] : + ∃ σ : G, σ • P = Q := by + exact Ideal.exists_smul_eq_of_isGaloisGroup p P Q G + +/-- prime-decomposition theory: in the Galois case the ramification index is +independent of the prime above `p`. -/ +theorem dedekindRamification_ramificationIdx_eq + (p : Ideal A) (P Q : Ideal B) + [P.IsPrime] [P.LiesOver p] [Q.IsPrime] [Q.LiesOver p] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] + [IsGaloisGroup G A B] : + P.ramificationIdx A = Q.ramificationIdx A := by + exact Ideal.ramificationIdx_eq_of_isGaloisGroup p P Q G + +/-- prime-decomposition theory: in the Galois case the inertia degree is +independent of the prime above `p`. -/ +theorem dedekindRamification_inertiaDeg_eq + (p : Ideal A) (P Q : Ideal B) + [P.IsPrime] [P.LiesOver p] [Q.IsPrime] [Q.LiesOver p] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] + [IsGaloisGroup G A B] : + P.inertiaDeg A = Q.inertiaDeg A := by + exact Ideal.inertiaDeg_eq_of_isGaloisGroup p P Q G + + +/-- Decomposition and inertia groups satisfy: +the primes above `p` are identified with the cosets `G/G_P`. -/ +noncomputable def dedekindDecompositionPrimesOverEquivQuotientDecompositionGroup + (p : Ideal A) (P : Ideal B) [P.IsPrime] [P.LiesOver p] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] + [IsGaloisGroup G A B] : + p.primesOver B ≃ G ⧸ decompositionGroup P G := + (Set.equivOfEq + (IsInvariant.orbit_eq_primesOver A B G p P).symm).trans + (MulAction.orbitEquivQuotientStabilizer G P) + +/-- Decomposition and inertia groups satisfy: +the number of primes above `p` is the index `(G : G_P)`. -/ +theorem dedekindDecomposition_ncard_primesOver_eq_decomposition_index + (p : Ideal A) (P : Ideal B) [P.IsPrime] [P.LiesOver p] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] + [IsGaloisGroup G A B] : + (p.primesOver B).ncard = (decompositionGroup P G).index := by + rw [← IsInvariant.orbit_eq_primesOver A B G p P] + exact (MulAction.index_stabilizer G P).symm + +/-- Decomposition and inertia groups satisfy: +the group-action form of nonsplitting, `G_P = G` iff there is one prime above +`p`. -/ +theorem dedekindDecomposition_decompositionGroup_eq_top_iff_primesOver_ncard_eq_one + (p : Ideal A) (P : Ideal B) [P.IsPrime] [P.LiesOver p] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] + [IsGaloisGroup G A B] : + decompositionGroup P G = ⊤ ↔ (p.primesOver B).ncard = 1 := by + rw [dedekindDecomposition_ncard_primesOver_eq_decomposition_index (A := A) (B := B) p P G] + exact Iff.symm Subgroup.index_eq_one + +/-- Decomposition and inertia groups satisfy: +the group-action form of total splitting, `G_P = 1` iff the number of primes +above `p` is `#G`. -/ +theorem dedekindDecomposition_decompositionGroup_eq_bot_iff_primesOver_ncard_eq_card + (p : Ideal A) (P : Ideal B) [P.IsPrime] [P.LiesOver p] + {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] + [IsGaloisGroup G A B] : + decompositionGroup P G = ⊥ ↔ (p.primesOver B).ncard = Nat.card G := by + constructor + · intro hG + rw [dedekindDecomposition_ncard_primesOver_eq_decomposition_index + (A := A) (B := B) p P G, hG, Subgroup.index_bot] + · intro hp + have hindex : (decompositionGroup P G).index = Nat.card G := by + rw [← dedekindDecomposition_ncard_primesOver_eq_decomposition_index + (A := A) (B := B) p P G, hp] + apply Subgroup.eq_bot_of_card_eq + exact Nat.eq_of_mul_eq_mul_left (Nat.card_pos (α := G)) + (by simpa [hindex] using (decompositionGroup P G).index_mul_card) + + + +/-- prime-decomposition theory: +the kernel of the residue action is the inertia group. -/ +theorem dedekindRamification_residueAction_ker + (p : Ideal A) (P : Ideal B) [P.LiesOver p] + (G : Type*) [Group G] [MulSemiringAction G B] [SMulCommClass G A B] : + MonoidHom.ker (residueStabilizerHom p P G) = + (inertiaGroup P G).subgroupOf (decompositionGroup P G) := by + exact Ideal.Quotient.ker_stabilizerHom P p G + +/-- prime-decomposition theory: +`I_P -> G_P -> Aut(kappa(P)/kappa(p))` is exact at `G_P`. -/ +theorem dedekindRamification_residueAction_mulExact + (p : Ideal A) (P : Ideal B) [P.LiesOver p] + (G : Type*) [Group G] [MulSemiringAction G B] [SMulCommClass G A B] : + Function.MulExact + ((inertiaGroup P G).subgroupOf (decompositionGroup P G)).subtype + (residueStabilizerHom p P G) := by + rw [MonoidHom.mulExact_iff, dedekindRamification_residueAction_ker] + exact (Subgroup.range_subtype _).symm + +/-- prime-decomposition theory: +for a finite invariant Galois action, the residue action is surjective. -/ +theorem dedekindRamification_residueAction_surjective + (p : Ideal A) (P : Ideal B) [P.IsPrime] [P.LiesOver p] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] [SMulCommClass G A B] + [Algebra.IsInvariant A B G] : + Function.Surjective (residueStabilizerHom p P G) := by + exact Ideal.Quotient.stabilizerHom_surjective G p P + +/-- prime-decomposition theory: +the residue class field extension is normal. -/ +theorem dedekindRamification_residueExtension_normal + (p : Ideal A) [p.IsMaximal] (P : Ideal B) + [P.IsMaximal] [P.LiesOver p] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] + [Algebra.IsInvariant A B G] : + Normal (A ⧸ p) (B ⧸ P) := by + exact Ideal.Quotient.normal (A := A) G p P + +/-- prime-decomposition theory: +if the residue class field extension is separable, then it is Galois. -/ +theorem dedekindRamification_residueExtension_isGalois + (p : Ideal A) [p.IsMaximal] (P : Ideal B) + [P.IsMaximal] [P.LiesOver p] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] + [Algebra.IsInvariant A B G] [Algebra.IsSeparable (A ⧸ p) (B ⧸ P)] : + IsGalois (A ⧸ p) (B ⧸ P) := by + exact isGalois_iff.mpr + ⟨inferInstance, dedekindRamification_residueExtension_normal (A := A) (B := B) p P G⟩ + +/-- The conjugation and base-change law: +the residue extension is normal and the decomposition group maps onto its +residue Galois group. -/ +theorem dedekindResidue_residueExtension_normal_and_residueAction_surjective + (p : Ideal A) [p.IsMaximal] (P : Ideal B) + [P.IsMaximal] [P.LiesOver p] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] [SMulCommClass G A B] + [Algebra.IsInvariant A B G] : + Normal (A ⧸ p) (B ⧸ P) ∧ + Function.Surjective (residueStabilizerHom p P G) := by + exact + ⟨dedekindRamification_residueExtension_normal (A := A) (B := B) p P G, + dedekindRamification_residueAction_surjective (A := A) (B := B) p P G⟩ + +/-- The localization and decomposition comparison gives: +`1 -> I_P -> G_P -> Gal(kappa(P)/kappa(p)) -> 1`, in the finite invariant +Galois-action form. -/ +theorem dedekindRamification_residueAction_shortExact + (p : Ideal A) (P : Ideal B) [P.IsPrime] [P.LiesOver p] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] [SMulCommClass G A B] + [Algebra.IsInvariant A B G] : + Function.Injective + ((inertiaGroup P G).subgroupOf (decompositionGroup P G)).subtype ∧ + Function.MulExact + ((inertiaGroup P G).subgroupOf (decompositionGroup P G)).subtype + (residueStabilizerHom p P G) ∧ + Function.Surjective (residueStabilizerHom p P G) := by + exact + ⟨Subtype.coe_injective, dedekindRamification_residueAction_mulExact p P G, + dedekindRamification_residueAction_surjective p P G⟩ + +/-- The localization and decomposition comparison gives: +the quotient of the decomposition group by inertia is the residue Galois group. +-/ +def dedekindRamificationDecompositionQuotientInertiaEquivResidueGalois + (p : Ideal A) (P : Ideal B) [P.IsPrime] [P.LiesOver p] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] [SMulCommClass G A B] + [Algebra.IsInvariant A B G] : + decompositionGroup P G ⧸ + (inertiaGroup P G).subgroupOf (decompositionGroup P G) ≃* + (B ⧸ P) ≃ₐ[A ⧸ p] B ⧸ P := + (QuotientGroup.quotientMulEquivOfEq + (dedekindRamification_residueAction_ker p P G).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (residueStabilizerHom p P G) + (dedekindRamification_residueAction_surjective p P G)) + +/-- A trivial-inertia special case: +if the inertia group is trivial, then the residue action is injective. -/ +theorem dedekindRamification_residueAction_injective_of_inertiaGroup_eq_bot + (p : Ideal A) (P : Ideal B) [P.LiesOver p] + (G : Type*) [Group G] [MulSemiringAction G B] [SMulCommClass G A B] + (hI : inertiaGroup P G = ⊥) : + Function.Injective (residueStabilizerHom p P G) := + (MonoidHom.ker_eq_bot_iff (residueStabilizerHom p P G)).mp <| by + rw [dedekindRamification_residueAction_ker, hI, Subgroup.bot_subgroupOf] + +/-- A trivial-inertia special case: +if the inertia group is trivial, then the residue action identifies `G_P` with +the residue Galois group. -/ +theorem dedekindRamification_residueAction_bijective_of_inertiaGroup_eq_bot + (p : Ideal A) (P : Ideal B) [P.IsPrime] [P.LiesOver p] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] [SMulCommClass G A B] + [Algebra.IsInvariant A B G] (hI : inertiaGroup P G = ⊥) : + Function.Bijective (residueStabilizerHom p P G) := + ⟨dedekindRamification_residueAction_injective_of_inertiaGroup_eq_bot p P G hI, + dedekindRamification_residueAction_surjective p P G⟩ + +/-- A trivial-inertia special case: +when `I_P = 1`, the residue Galois group is isomorphic to `G_P`. -/ +noncomputable def dedekindRamificationDecompositionGroupEquivResidueGaloisOfInertiaGroupEqBot + (p : Ideal A) (P : Ideal B) [P.IsPrime] [P.LiesOver p] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] [SMulCommClass G A B] + [Algebra.IsInvariant A B G] (hI : inertiaGroup P G = ⊥) : + decompositionGroup P G ≃* + (B ⧸ P) ≃ₐ[A ⧸ p] B ⧸ P := + MulEquiv.ofBijective (residueStabilizerHom p P G) + (dedekindRamification_residueAction_bijective_of_inertiaGroup_eq_bot p P G hI) + +/-- A trivial-inertia special case: +when `I_P = 1`, the residue Galois group embeds into `G` through the +decomposition group. -/ +noncomputable def dedekindRamificationResidueGaloisEmbeddingIntoGOfInertiaGroupEqBot + (p : Ideal A) (P : Ideal B) [P.IsPrime] [P.LiesOver p] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] [SMulCommClass G A B] + [Algebra.IsInvariant A B G] (hI : inertiaGroup P G = ⊥) : + ((B ⧸ P) ≃ₐ[A ⧸ p] B ⧸ P) →* G := + (decompositionGroup P G).subtype.comp + (dedekindRamificationDecompositionGroupEquivResidueGaloisOfInertiaGroupEqBot + p P G hI).symm.toMonoidHom + +/-- The residue-Galois embedding into `G` from the preceding declaration is +injective. -/ +theorem dedekindRamification_residueGaloisEmbeddingIntoG_of_inertiaGroup_eq_bot_injective + (p : Ideal A) (P : Ideal B) [P.IsPrime] [P.LiesOver p] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] [SMulCommClass G A B] + [Algebra.IsInvariant A B G] (hI : inertiaGroup P G = ⊥) : + Function.Injective + (dedekindRamificationResidueGaloisEmbeddingIntoGOfInertiaGroupEqBot p P G hI) := by + intro σ τ hστ + apply (dedekindRamificationDecompositionGroupEquivResidueGaloisOfInertiaGroupEqBot + p P G hI).symm.injective + exact Subtype.ext <| by + simpa [dedekindRamificationResidueGaloisEmbeddingIntoGOfInertiaGroupEqBot] using hστ + + + +/-- prime-decomposition theory: +in the Galois case the prime decomposition has a common ramification index, +`p B = ∏ P|p P^e`. -/ +theorem dedekindRamification_galois_prime_decomposition + [IsDedekindDomain A] [IsDedekindDomain B] [Module.Finite A B] + [IsTorsionFree A B] + (p : Ideal A) [p.IsMaximal] (hp : p ≠ ⊥) + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] + [IsGaloisGroup G A B] : + Ideal.map (algebraMap A B) p = + ∏ P ∈ p.primesOver B, P ^ Ideal.ramificationIdxIn p B := by + have : Algebra.IsIntegral A B := Algebra.IsIntegral.of_finite A B + rw [Ideal.map_algebraMap_eq_finsetProd_pow (R := B) (S := A) (p := p) hp] + apply Finset.prod_congr rfl + intro P hP + have hP' : P ∈ p.primesOver B := by + simpa [Set.mem_toFinset] using hP + have : P.IsPrime := hP'.1 + have : P.LiesOver p := hP'.2 + rw [Ideal.ramificationIdxIn_eq_ramificationIdx p P G] + +/-- prime-decomposition theory, Galois fundamental identity: +`r * e * f = |G|`, with `e` and `f` independent of the chosen prime above `p`. +-/ +theorem dedekindRamification_galois_fundamental_identity + [IsDedekindDomain A] (p : Ideal A) [p.IsMaximal] (_hpb : p ≠ ⊥) + (B : Type*) [CommRing B] [IsDedekindDomain B] [Algebra A B] + [Module.Finite A B] [IsTorsionFree A B] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] + [IsGaloisGroup G A B] : + (p.primesOver B).ncard * + (Ideal.ramificationIdxIn p B * Ideal.inertiaDegIn p B) = + Nat.card G := by + exact Ideal.ncard_primesOver_mul_ramificationIdxIn_mul_inertiaDegIn p B G + +/-- At an unramified prime, the Galois fundamental identity reduces to +`r * f = |G|`. -/ +theorem dedekindRamification_unramified_decomposition_law + [IsDedekindDomain A] + (p : Ideal A) [p.IsMaximal] (hp : p ≠ ⊥) + (B : Type*) [CommRing B] [IsDedekindDomain B] [Algebra A B] + [Module.Finite A B] [IsTorsionFree A B] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] + [IsGaloisGroup G A B] + (hunramified : Ideal.ramificationIdxIn p B = 1) : + (p.primesOver B).ncard * Ideal.inertiaDegIn p B = + Nat.card G := by + have hfund := + dedekindRamification_galois_fundamental_identity + (A := A) p hp B G + simpa [hunramified] using hfund + +/-- Division form of the unramified Galois decomposition law. -/ +theorem + dedekindRamification_unramified_numberOfPrimes_eq_degree_div_inertiaDegree + [IsDedekindDomain A] + (p : Ideal A) [p.IsMaximal] (hp : p ≠ ⊥) + (B : Type*) [CommRing B] [IsDedekindDomain B] [Algebra A B] + [Module.Finite A B] [IsTorsionFree A B] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] + [IsGaloisGroup G A B] + (hunramified : Ideal.ramificationIdxIn p B = 1) : + (p.primesOver B).ncard = + Nat.card G / Ideal.inertiaDegIn p B := by + have h := + dedekindRamification_unramified_decomposition_law + (A := A) p hp B G hunramified + rw [← h] + symm + simpa [Nat.mul_comm] using + (Nat.mul_div_cancel_left + (p.primesOver B).ncard + (Nat.pos_of_ne_zero + (Ideal.inertiaDegIn_ne_zero + (A := A) (B := B) (p := p) G))) + +/-- The prime-decomposition tower identity: +orbit-stabilizer for the action on primes above `p`, +`r * #G_P = #G`. -/ +theorem dedekindRamification_ncard_primesOver_mul_decomposition_card + (p : Ideal A) (P : Ideal B) [P.IsPrime] [P.LiesOver p] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] + [IsGaloisGroup G A B] : + (p.primesOver B).ncard * Nat.card (decompositionGroup P G) = + Nat.card G := by + rw [← IsInvariant.orbit_eq_primesOver A B G p P] + simpa [decompositionGroup] using + Nat.card_congr (MulAction.orbitProdStabilizerEquivGroup G P) + +/-- The prime-decomposition tower identity: +the decomposition group has cardinality `e * f`. -/ +theorem dedekindRamification_decomposition_card_eq_ramificationIdxIn_mul_inertiaDegIn + [IsDedekindDomain A] [IsDedekindDomain B] [Module.Finite A B] + [IsTorsionFree A B] + (p : Ideal A) [p.IsMaximal] (hp : p ≠ ⊥) + (P : Ideal B) [P.IsPrime] [P.LiesOver p] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] + [IsGaloisGroup G A B] : + Nat.card (decompositionGroup P G) = + Ideal.ramificationIdxIn p B * Ideal.inertiaDegIn p B := by + have hdec := + dedekindRamification_ncard_primesOver_mul_decomposition_card + (A := A) (B := B) p P G + have hfund := + dedekindRamification_galois_fundamental_identity + (A := A) p hp B G + exact + Nat.mul_left_cancel + (Nat.pos_of_ne_zero (IsDedekindDomain.primesOver_ncard_ne_zero p B)) + (hdec.trans hfund.symm) + + + +/-- Prime-decomposition statement: +the quotient of the decomposition group by inertia has cardinality equal to +the inertia degree. -/ +theorem dedekindRamification_decompositionQuotientInertia_card_eq_inertiaDeg + (p : Ideal A) [p.IsMaximal] + (P : Ideal B) [P.IsPrime] [P.LiesOver p] [P.IsMaximal] + [Algebra.IsSeparable (A ⧸ p) (B ⧸ P)] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] + [IsGaloisGroup G A B] : + Nat.card + (decompositionGroup P G ⧸ + (inertiaGroup P G).subgroupOf (decompositionGroup P G)) = + P.inertiaDeg A := by + have h : IsGalois (A ⧸ p) (B ⧸ P) := + isGalois_iff.mpr ⟨inferInstance, Ideal.Quotient.normal (A := A) G p P⟩ + let : Module.Finite (A ⧸ p) (B ⧸ P) := Ideal.Quotient.finite_of_isInvariant G p P + let : FiniteDimensional (A ⧸ p) (B ⧸ P) := IsGalois.finiteDimensional_of_finite + (F := A ⧸ p) (E := B ⧸ P) + calc + Nat.card + (decompositionGroup P G ⧸ + (inertiaGroup P G).subgroupOf (decompositionGroup P G)) = + Nat.card ((B ⧸ P) ≃ₐ[A ⧸ p] B ⧸ P) := by + exact + Nat.card_congr + (dedekindRamificationDecompositionQuotientInertiaEquivResidueGalois + (A := A) (B := B) p P G).toEquiv + _ = Module.finrank (A ⧸ p) (B ⧸ P) := by + simpa using (IsGalois.card_aut_eq_finrank (F := A ⧸ p) (E := B ⧸ P)) + _ = P.inertiaDeg A := by + rw [Ideal.inertiaDeg_eq_of_isMaximal p P] + +/-- Prime-decomposition statement: +the quotient cardinality is the Galois-invariant inertia degree `f`. -/ +theorem dedekindRamification_decompositionQuotientInertia_card_eq_inertiaDegIn + (p : Ideal A) [p.IsMaximal] + (P : Ideal B) [P.IsPrime] [P.LiesOver p] [P.IsMaximal] + [Algebra.IsSeparable (A ⧸ p) (B ⧸ P)] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] + [IsGaloisGroup G A B] : + Nat.card + (decompositionGroup P G ⧸ + (inertiaGroup P G).subgroupOf (decompositionGroup P G)) = + Ideal.inertiaDegIn p B := by + rw [dedekindRamification_decompositionQuotientInertia_card_eq_inertiaDeg + (A := A) (B := B) p P G] + exact (Ideal.inertiaDegIn_eq_inertiaDeg p P G).symm + +/-- Prime-decomposition statement: +`#G_P = #(G_P/I_P) * #I_P` for the exact residue sequence. -/ +theorem dedekindRamification_decomposition_card_eq_quotient_card_mul_inertia_card + (P : Ideal B) (G : Type*) [Group G] [MulSemiringAction G B] : + Nat.card (decompositionGroup P G) = + Nat.card + (decompositionGroup P G ⧸ + (inertiaGroup P G).subgroupOf (decompositionGroup P G)) * + Nat.card (inertiaGroup P G) := by + rw [Subgroup.card_eq_card_quotient_mul_card_subgroup + ((inertiaGroup P G).subgroupOf (decompositionGroup P G))] + congr 1 + exact + Nat.card_congr + (Subgroup.subgroupOfEquivOfLe + (Ideal.inertia_le_stabilizer (M := G) P)).toEquiv + +/-- Prime-decomposition statement: +`#G_P = #I_P * f`, with `f` the Galois-invariant inertia degree. -/ +theorem dedekindRamification_decomposition_card_eq_inertia_card_mul_inertiaDegIn + (p : Ideal A) [p.IsMaximal] + (P : Ideal B) [P.IsPrime] [P.LiesOver p] [P.IsMaximal] + [Algebra.IsSeparable (A ⧸ p) (B ⧸ P)] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] + [IsGaloisGroup G A B] : + Nat.card (decompositionGroup P G) = + Nat.card (inertiaGroup P G) * Ideal.inertiaDegIn p B := by + rw [dedekindRamification_decomposition_card_eq_quotient_card_mul_inertia_card + (B := B) P G, + dedekindRamification_decompositionQuotientInertia_card_eq_inertiaDegIn + (A := A) (B := B) p P G, + mul_comm] + + +/-- prime-decomposition theory: the inertia subgroup has cardinality equal to the +Galois ramification index. -/ +theorem dedekindRamification_inertia_card_eq_ramificationIdxIn + [IsDedekindDomain A] [IsDedekindDomain B] [Module.Finite A B] + [IsTorsionFree A B] + (p : Ideal A) (P : Ideal B) [P.LiesOver p] [P.IsMaximal] + [Algebra.IsSeparable (A ⧸ p) (B ⧸ P)] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] + [IsGaloisGroup G A B] (hp : p ≠ ⊥) : + Nat.card (P.toAddSubgroup.inertia G) = Ideal.ramificationIdxIn p B := by + let : Algebra.IsIntegral A B := Algebra.IsIntegral.of_finite A B + let : p.IsMaximal := Ideal.IsMaximal.of_isMaximal_liesOver P p + have hdecomp_inertia := + dedekindRamification_decomposition_card_eq_inertia_card_mul_inertiaDegIn + (A := A) (B := B) p P G + have hdecomp_ramification := + dedekindRamification_decomposition_card_eq_ramificationIdxIn_mul_inertiaDegIn + (A := A) (B := B) p hp P G + have hinertiaDeg_pos : 0 < Ideal.inertiaDegIn p B := by + rw [Ideal.inertiaDegIn_eq_inertiaDeg p P G] + exact P.inertiaDeg_pos A + apply Nat.mul_left_cancel hinertiaDeg_pos + calc + Ideal.inertiaDegIn p B * Nat.card (P.toAddSubgroup.inertia G) = + Nat.card (P.toAddSubgroup.inertia G) * Ideal.inertiaDegIn p B := by + rw [mul_comm] + _ = Nat.card (decompositionGroup P G) := hdecomp_inertia.symm + _ = Ideal.ramificationIdxIn p B * Ideal.inertiaDegIn p B := + hdecomp_ramification + _ = Ideal.inertiaDegIn p B * Ideal.ramificationIdxIn p B := by + rw [mul_comm] + +end Dedekind +end HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/CompositumUnramified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/CompositumUnramified.lean new file mode 100644 index 0000000000..95e3232f1d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/CompositumUnramified.lean @@ -0,0 +1,358 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.LinearAlgebra.FreeModule.IdealQuotient +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFields +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.NumberFieldPrimes +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.OrbitCardinality +/-! +# Unramifiedness in a compositum + +This file contains reusable criteria for proving that a prime in a number +field compositum is unramified from the inertia groups of its two factors. +-/ + +@[expose] public section + +noncomputable +section + +namespace HilbertRamification.Dedekind + +open NumberField +open scoped NumberField + +attribute [local instance] Ideal.Quotient.field + +/-- If two normal intermediate fields generate a number-field extension +and the inertia of a prime restricts trivially to both, then the original +inertia group is trivial. The base field is arbitrary; in particular this +applies to the Kummer composita used in the global existence theorem. -/ +theorem inertiaGroup_eq_bot_of_restrictNormal_of_sup_eq_top + {K M : Type*} + [Field K] + [Field M] [Algebra K M] + (A B : IntermediateField K M) [Normal K A] [Normal K B] + (Q : Ideal (𝓞 M)) + (hsup : A ⊔ B = ⊤) + (hIA : + inertiaGroup (Q.under (𝓞 A)) Gal(A/K) = ⊥) + (hIB : + inertiaGroup (Q.under (𝓞 B)) Gal(B/K) = ⊥) : + inertiaGroup Q Gal(M/K) = ⊥ := by + let rA : Gal(M/K) →* Gal(A/K) := + AlgEquiv.restrictNormalHom A + let rB : Gal(M/K) →* Gal(B/K) := + AlgEquiv.restrictNormalHom B + apply le_antisymm + · intro σ hσ + have hσA : + rA σ ∈ inertiaGroup (Q.under (𝓞 A)) Gal(A/K) := by + rw [mem_inertiaGroup_iff] + intro x + change algebraMap (𝓞 A) (𝓞 M) (rA σ • x - x) ∈ Q + rw [map_sub] + have hcompat : + algebraMap (𝓞 A) (𝓞 M) (rA σ • x) = + σ • algebraMap (𝓞 A) (𝓞 M) x := by + apply RingOfIntegers.coe_injective + change algebraMap A M (σ.restrictNormal A x.1) = + σ (algebraMap A M x.1) + exact AlgEquiv.restrictNormal_commutes σ A x.1 + rw [hcompat] + exact (mem_inertiaGroup_iff.mp hσ) + (algebraMap (𝓞 A) (𝓞 M) x) + have hσB : + rB σ ∈ inertiaGroup (Q.under (𝓞 B)) Gal(B/K) := by + rw [mem_inertiaGroup_iff] + intro x + change algebraMap (𝓞 B) (𝓞 M) (rB σ • x - x) ∈ Q + rw [map_sub] + have hcompat : + algebraMap (𝓞 B) (𝓞 M) (rB σ • x) = + σ • algebraMap (𝓞 B) (𝓞 M) x := by + apply RingOfIntegers.coe_injective + change algebraMap B M (σ.restrictNormal B x.1) = + σ (algebraMap B M x.1) + exact AlgEquiv.restrictNormal_commutes σ B x.1 + rw [hcompat] + exact (mem_inertiaGroup_iff.mp hσ) + (algebraMap (𝓞 B) (𝓞 M) x) + have hAone : rA σ = 1 := by + rw [← Subgroup.mem_bot, ← hIA] + exact hσA + have hBone : rB σ = 1 := by + rw [← Subgroup.mem_bot, ← hIB] + exact hσB + have hmemA : σ ∈ A.fixingSubgroup := by + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + calc + σ x = algebraMap A M ((rA σ) ⟨x, hx⟩) := by + change σ x = + algebraMap A M ((σ.restrictNormal A) ⟨x, hx⟩) + exact (AlgEquiv.restrictNormal_commutes σ A ⟨x, hx⟩).symm + _ = algebraMap A M ((1 : Gal(A/K)) ⟨x, hx⟩) := + congrArg (fun τ : Gal(A/K) ↦ algebraMap A M (τ ⟨x, hx⟩)) hAone + _ = x := rfl + have hmemB : σ ∈ B.fixingSubgroup := by + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + calc + σ x = algebraMap B M ((rB σ) ⟨x, hx⟩) := by + change σ x = + algebraMap B M ((σ.restrictNormal B) ⟨x, hx⟩) + exact (AlgEquiv.restrictNormal_commutes σ B ⟨x, hx⟩).symm + _ = algebraMap B M ((1 : Gal(B/K)) ⟨x, hx⟩) := + congrArg (fun τ : Gal(B/K) ↦ algebraMap B M (τ ⟨x, hx⟩)) hBone + _ = x := rfl + have hmem : σ ∈ (A ⊔ B).fixingSubgroup := by + rw [IntermediateField.fixingSubgroup_sup] + exact ⟨hmemA, hmemB⟩ + simpa [hsup] using hmem + · exact bot_le + +/-- If a finite family of normal simple intermediate fields generates a +finite Galois number-field extension and the inertia at a prime restricts +trivially to every member of the family, then the inertia of the full +extension is trivial. This is the finite-radical form of the compositum +argument used for the full `S`-unit Kummer extension. -/ +theorem inertiaGroup_eq_bot_of_finset_adjoin_eq_top + {K M : Type*} + [Field K] + [Field M] [NumberField M] [Algebra K M] + (T : Finset M) + (Q : Ideal (𝓞 M)) + (hnormal : + ∀ x : M, x ∈ T → + Normal K (IntermediateField.adjoin K {x})) + (hI : + ∀ (x : M) (_ : x ∈ T), + inertiaGroup + (Q.under + (𝓞 (IntermediateField.adjoin K {x}))) + Gal((IntermediateField.adjoin K {x})/K) = + ⊥) + (hadjoin : + IntermediateField.adjoin K (T : Set M) = ⊤) : + inertiaGroup Q Gal(M/K) = ⊥ := by + apply le_antisymm + · intro sigma hsigma + have hfix : + ∀ x : M, x ∈ T → sigma x = x := by + intro x hx + let B : IntermediateField K M := + IntermediateField.adjoin K {x} + let : Normal K B := hnormal x hx + let rB : Gal(M/K) →* Gal(B/K) := + AlgEquiv.restrictNormalHom B + have hsigmaB : + rB sigma ∈ + inertiaGroup (Q.under (𝓞 B)) Gal(B/K) := by + rw [mem_inertiaGroup_iff] + intro y + change + algebraMap (𝓞 B) (𝓞 M) + (rB sigma • y - y) ∈ Q + rw [map_sub] + have hcompat : + algebraMap (𝓞 B) (𝓞 M) (rB sigma • y) = + sigma • algebraMap (𝓞 B) (𝓞 M) y := by + apply RingOfIntegers.coe_injective + change + algebraMap B M + (sigma.restrictNormal B y.1) = + sigma (algebraMap B M y.1) + exact + AlgEquiv.restrictNormal_commutes sigma B y.1 + rw [hcompat] + exact + (mem_inertiaGroup_iff.mp hsigma) + (algebraMap (𝓞 B) (𝓞 M) y) + have hsigmaBone : rB sigma = 1 := by + rw [← Subgroup.mem_bot, ← hI x hx] + exact hsigmaB + have hxB : x ∈ B := + IntermediateField.subset_adjoin K {x} + (Set.mem_singleton x) + calc + sigma x = + algebraMap B M + ((rB sigma) ⟨x, hxB⟩) := by + change + sigma x = + algebraMap B M + (sigma.restrictNormal B ⟨x, hxB⟩) + exact + (AlgEquiv.restrictNormal_commutes + sigma B ⟨x, hxB⟩).symm + _ = + algebraMap B M + ((1 : Gal(B/K)) ⟨x, hxB⟩) := + congrArg + (fun tau : Gal(B/K) => + algebraMap B M (tau ⟨x, hxB⟩)) + hsigmaBone + _ = x := rfl + have hmem : + sigma ∈ + (IntermediateField.adjoin K + (T : Set M)).fixingSubgroup := by + rw [IntermediateField.mem_fixingSubgroup_iff] + intro x hx + induction hx using IntermediateField.adjoin_induction with + | mem x hx => + exact hfix x hx + | algebraMap a => + exact sigma.commutes a + | add x y hx hy ihx ihy => + rw [map_add, ihx, ihy] + | inv x hx ihx => + rw [map_inv₀, ihx] + | mul x y hx hy ihx ihy => + rw [map_mul, ihx, ihy] + simpa [hadjoin] using hmem + · exact bot_le + +/-- For a finite Galois extension of number fields, ramification index +one at a prime forces the corresponding inertia group to be trivial. +The residue extension is separable because the residue field of a number +field is finite. -/ +theorem inertiaGroup_eq_bot_of_ramificationIdx_eq_one + {K M : Type*} + [Field K] [NumberField K] + [Field M] [NumberField M] [Algebra K M] + [FiniteDimensional K M] [IsGalois K M] + (p : Ideal (𝓞 K)) (P : Ideal (𝓞 M)) + [p.IsPrime] [P.IsPrime] [P.IsMaximal] [P.LiesOver p] + (hp0 : p ≠ ⊥) + (he : P.ramificationIdx (𝓞 K) = 1) : + inertiaGroup P Gal(M/K) = ⊥ := by + let : p.IsMaximal := + (inferInstance : p.IsPrime).isMaximal hp0 + let : Finite ((𝓞 K) ⧸ p) := + Ideal.finiteQuotientOfFreeOfNeBot p hp0 + let : PerfectField ((𝓞 K) ⧸ p) := + PerfectField.ofFinite + let : Algebra.IsSeparable + ((𝓞 K) ⧸ p) ((𝓞 M) ⧸ P) := + Algebra.IsAlgebraic.isSeparable_of_perfectField + rw [← Subgroup.card_eq_one, + inertia_card_eq_ramificationIdx + (A := 𝓞 K) (B := 𝓞 M) p P Gal(M/K) hp0] + exact he + +/-- Algebraic unramifiedness at a prime of a finite Galois number-field +extension forces the corresponding inertia group to be trivial. -/ +theorem inertiaGroup_eq_bot_of_isUnramifiedAt + {K M : Type*} + [Field K] [NumberField K] + [Field M] [NumberField M] [Algebra K M] + [FiniteDimensional K M] [IsGalois K M] + (P : Ideal (𝓞 M)) [P.IsPrime] [P.IsMaximal] + (hunram : Algebra.IsUnramifiedAt (𝓞 K) P) : + inertiaGroup P Gal(M/K) = ⊥ := by + let p : Ideal (𝓞 K) := P.under (𝓞 K) + let : p.IsPrime := inferInstance + let : P.LiesOver p := ⟨rfl⟩ + have hP0 : P ≠ ⊥ := + Ring.ne_bot_of_isMaximal_of_not_isField + (M := P) inferInstance (RingOfIntegers.not_isField M) + have hp0 : p ≠ ⊥ := + Ideal.under_ne_bot (𝓞 K) hP0 + let : Algebra.IsUnramifiedAt (𝓞 K) P := hunram + apply inertiaGroup_eq_bot_of_ramificationIdx_eq_one + (K := K) (M := M) p P hp0 + exact Ideal.ramificationIdx_eq_one P (𝓞 K) + +/-- Trivial inertia at a prime of a finite Galois number-field +extension gives algebraic unramifiedness at that prime. -/ +theorem isUnramifiedAt_of_inertiaGroup_eq_bot + {K M : Type*} + [Field K] [NumberField K] + [Field M] [NumberField M] [Algebra K M] + [FiniteDimensional K M] [IsGalois K M] + (P : Ideal (𝓞 M)) [P.IsPrime] [P.IsMaximal] + (hI : inertiaGroup P Gal(M/K) = ⊥) : + Algebra.IsUnramifiedAt (𝓞 K) P := by + let p : Ideal (𝓞 K) := P.under (𝓞 K) + let : p.IsPrime := inferInstance + let : P.LiesOver p := ⟨rfl⟩ + have hP0 : P ≠ ⊥ := + Ring.ne_bot_of_isMaximal_of_not_isField + (M := P) inferInstance (RingOfIntegers.not_isField M) + have hp0 : p ≠ ⊥ := + Ideal.under_ne_bot (𝓞 K) hP0 + let : p.IsMaximal := + (inferInstance : p.IsPrime).isMaximal hp0 + let : Finite ((𝓞 K) ⧸ p) := + Ideal.finiteQuotientOfFreeOfNeBot p hp0 + let : PerfectField ((𝓞 K) ⧸ p) := + PerfectField.ofFinite + let : Algebra.IsSeparable + ((𝓞 K) ⧸ p) ((𝓞 M) ⧸ P) := + Algebra.IsAlgebraic.isSeparable_of_perfectField + have he : + P.ramificationIdx (𝓞 K) = 1 := by + rw [← inertia_card_eq_ramificationIdx + (A := 𝓞 K) (B := 𝓞 M) + p P Gal(M/K) hp0, hI] + simp + exact Ideal.ramificationIdx_eq_one_iff.mp he + +/-- In the rational-base case, ramification index one forces the +corresponding inertia group to be trivial. -/ +theorem inertiaGroup_eq_bot_of_ramificationIdx_eq_one_int + {K : Type*} [Field K] [NumberField K] [IsGalois ℚ K] + (p : Ideal ℤ) (P : Ideal (𝓞 K)) + [p.IsPrime] [P.IsPrime] [P.IsMaximal] [P.LiesOver p] + (hp0 : p ≠ ⊥) + (he : P.ramificationIdx ℤ = 1) : + inertiaGroup P Gal(K/ℚ) = ⊥ := by + let : p.IsMaximal := + (inferInstance : p.IsPrime).isMaximal hp0 + let : Finite (ℤ ⧸ p) := + Ideal.finiteQuotientOfFreeOfNeBot p hp0 + let : PerfectField (ℤ ⧸ p) := PerfectField.ofFinite + let : Algebra.IsSeparable (ℤ ⧸ p) ((𝓞 K) ⧸ P) := + Algebra.IsAlgebraic.isSeparable_of_perfectField + rw [← Subgroup.card_eq_one, + inertia_card_eq_ramificationIdx + (A := ℤ) (B := 𝓞 K) p P Gal(K/ℚ) hp0] + exact he + +/-- Trivial rational inertia gives unramifiedness at the chosen finite +prime. -/ +theorem isUnramifiedAt_int_of_inertiaGroup_eq_bot + {K : Type*} [Field K] [NumberField K] [IsGalois ℚ K] + (P : Ideal (𝓞 K)) [P.IsPrime] [P.IsMaximal] + (hI : inertiaGroup P Gal(K/ℚ) = ⊥) : + Algebra.IsUnramifiedAt ℤ P := by + let p : Ideal ℤ := P.under ℤ + let : p.IsPrime := inferInstance + let : P.LiesOver p := ⟨rfl⟩ + have hP0 : P ≠ ⊥ := + Ring.ne_bot_of_isMaximal_of_not_isField + (M := P) inferInstance (RingOfIntegers.not_isField K) + have hp0 : p ≠ ⊥ := Ideal.under_ne_bot ℤ hP0 + let : p.IsMaximal := + (inferInstance : p.IsPrime).isMaximal hp0 + let : Finite (ℤ ⧸ p) := + Ideal.finiteQuotientOfFreeOfNeBot p hp0 + let : PerfectField (ℤ ⧸ p) := PerfectField.ofFinite + let : Algebra.IsSeparable (ℤ ⧸ p) ((𝓞 K) ⧸ P) := + Algebra.IsAlgebraic.isSeparable_of_perfectField + have he : + P.ramificationIdx ℤ = 1 := by + rw [← inertia_card_eq_ramificationIdx + (A := ℤ) (B := 𝓞 K) p P Gal(K/ℚ) hp0, hI] + simp + exact Ideal.ramificationIdx_eq_one_iff.mp he + +end HilbertRamification.Dedekind diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Conjugation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Conjugation.lean new file mode 100644 index 0000000000..4c5acd255f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Conjugation.lean @@ -0,0 +1,77 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic +/-! +# Hilbert ramification theory: conjugate prime ideals + +This file records the conjugation statement in prime-decomposition theory: +the decomposition group of a conjugate prime ideal is the conjugate subgroup. +-/ + +@[expose] public section + +noncomputable +section + +namespace HilbertRamification +namespace Dedekind + +open scoped Pointwise + +variable {A B : Type*} [CommRing A] [CommRing B] [Algebra A B] + +/-- Decomposition and inertia groups satisfy: +the decomposition group of the conjugate prime `σ P` is the conjugate +subgroup `σ G_P σ⁻¹`. -/ +theorem dedekindDecomposition_decompositionGroup_smul_eq_map_conj + (P : Ideal B) (G : Type*) [Group G] [MulSemiringAction G B] + (σ : G) : + decompositionGroup (σ • P) G = + (decompositionGroup P G).map (MulAut.conj σ).toMonoidHom := by + exact MulAction.stabilizer_smul_eq_stabilizer_map_conj σ P + +/-- Prime-decomposition statement: +membership in the inertia group of a conjugate prime ideal. This is the +inertia-group part of the simultaneous conjugacy used later for Frobenius +classes. -/ +theorem mem_inertiaGroup_smul_iff + {P : Ideal B} {G : Type*} [Group G] [MulSemiringAction G B] + {σ τ : G} : + τ ∈ inertiaGroup (σ • P) G ↔ + σ⁻¹ * τ * σ ∈ inertiaGroup P G := by + rw [mem_inertiaGroup_iff, mem_inertiaGroup_iff] + constructor + · intro h x + have hx := h (σ • x) + have hx' : + σ⁻¹ • (τ • (σ • x) - σ • x) ∈ σ⁻¹ • (σ • P) := + Ideal.smul_mem_pointwise_smul σ⁻¹ _ _ hx + simpa [smul_sub, mul_smul, mul_assoc, inv_smul_smul] using hx' + · intro h x + have hx := h (σ⁻¹ • x) + have hx' : + σ • ((σ⁻¹ * τ * σ) • (σ⁻¹ • x) - σ⁻¹ • x) ∈ σ • P := + Ideal.smul_mem_pointwise_smul σ _ _ hx + simpa [smul_sub, mul_smul, mul_assoc] using hx' + +/-- Prime-decomposition statement: +the inertia group of the conjugate prime `σ P` is the conjugate subgroup +`σ I_P σ⁻¹`. -/ +theorem dedekindRamification_inertiaGroup_smul_eq_map_conj + (P : Ideal B) (G : Type*) [Group G] [MulSemiringAction G B] + (σ : G) : + inertiaGroup (σ • P) G = + (inertiaGroup P G).map (MulAut.conj σ).toMonoidHom := by + ext τ + rw [mem_inertiaGroup_smul_iff (P := P) (G := G) (σ := σ)] + rw [Subgroup.mem_map_equiv] + simp [MulAut.conj_symm_apply] + +end Dedekind +end HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldTower.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldTower.lean new file mode 100644 index 0000000000..b3aeca55b5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldTower.lean @@ -0,0 +1,309 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFields +/-! +# Hilbert ramification theory: decomposition and inertia tower + +This file contains the group-theoretic fixed-field part of the tower +`Z_P ⊆ T_P ⊆ L` in prime-decomposition theory. +-/ + +@[expose] public section + +noncomputable +section + +namespace HilbertRamification +namespace Dedekind + +open Algebra Module + +variable {A B K L : Type*} +variable [CommRing A] [CommRing B] [Algebra A B] +variable [Field K] [Field L] [Algebra K L] +variable (G : Type*) [Group G] [MulSemiringAction G L] [SMulCommClass G K L] + +/-- prime-decomposition theory: +the inertia field, viewed as an intermediate field over the decomposition +field. -/ +abbrev inertiaFieldOverDecompositionField + (P : Ideal B) [MulSemiringAction G B] : + IntermediateField (decompositionField (K := K) (L := L) G P) L := + IntermediateField.extendScalars + (decompositionField_le_inertiaField (K := K) (L := L) G P) + +variable {G} + +/-- Elementwise membership in the inertia field viewed over the decomposition +field. -/ +theorem mem_inertiaFieldOverDecompositionField_iff + {P : Ideal B} [MulSemiringAction G B] {x : L} : + x ∈ inertiaFieldOverDecompositionField (K := K) (L := L) G P ↔ + ∀ σ ∈ inertiaGroup P G, σ • x = x := by + rw [inertiaFieldOverDecompositionField, IntermediateField.mem_extendScalars, + mem_inertiaField_iff] + +variable (G) + +/-- Restricting the inertia field over the decomposition field back to `K` +recovers the inertia field over `K`. -/ +@[simp] +theorem inertiaFieldOverDecompositionField_restrictScalars + (P : Ideal B) [MulSemiringAction G B] : + (inertiaFieldOverDecompositionField (K := K) (L := L) G P).restrictScalars K = + inertiaField (K := K) (L := L) G P := + rfl + +/-- The prime-decomposition tower identity: +identify the decomposition group with `Gal(L/Z_P)`. -/ +def dedekindTowerDecompositionGroupEquivGalDecompositionField + (P : Ideal B) [MulSemiringAction G B] + [Finite G] [IsGaloisGroup G K L] : + decompositionGroup P G ≃* + (L ≃ₐ[decompositionField (K := K) (L := L) G P] L) := + haveI : Finite (decompositionGroup P G) := inferInstance + IsGaloisGroup.mulEquivAlgEquiv + (decompositionGroup P G) + (decompositionField (K := K) (L := L) G P) L + +/-- The equivalence `G_P ≃ Gal(L/Z_P)` acts by the original group action on +elements of `L`. -/ +@[simp] +theorem dedekindTower_decompositionGroupEquivGalDecompositionField_apply + (P : Ideal B) [MulSemiringAction G B] + [Finite G] [IsGaloisGroup G K L] + (σ : decompositionGroup P G) (x : L) : + dedekindTowerDecompositionGroupEquivGalDecompositionField + (K := K) (L := L) G P σ x = + (σ : G) • x := + rfl + +/-- Source fact for the tower `Z_P ⊆ L`: `L` is finite-dimensional over the +decomposition field. -/ +theorem dedekindTower_decompositionField_finiteDimensional + (P : Ideal B) [MulSemiringAction G B] + [Finite G] [IsGaloisGroup G K L] : + FiniteDimensional (decompositionField (K := K) (L := L) G P) L := by + have : Finite (decompositionGroup P G) := inferInstance + exact + IsGaloisGroup.finiteDimensional + (decompositionGroup P G) + (decompositionField (K := K) (L := L) G P) L + +/-- Source fact for the tower `Z_P ⊆ L`: `L/Z_P` is Galois. -/ +theorem dedekindTower_decompositionField_isGalois + (P : Ideal B) [MulSemiringAction G B] + [Finite G] [IsGaloisGroup G K L] : + IsGalois (decompositionField (K := K) (L := L) G P) L := by + have : Finite (decompositionGroup P G) := inferInstance + exact + IsGaloisGroup.isGalois + (decompositionGroup P G) + (decompositionField (K := K) (L := L) G P) L + +/-- prime-decomposition theory: +the inertia subgroup transported to `Gal(L/Z_P)`. -/ +abbrev inertiaGroupOverDecompositionField + (P : Ideal B) [MulSemiringAction G B] + [Finite G] [IsGaloisGroup G K L] : + Subgroup (L ≃ₐ[decompositionField (K := K) (L := L) G P] L) := + Subgroup.map + (dedekindTowerDecompositionGroupEquivGalDecompositionField + (K := K) (L := L) G P).toMonoidHom + ((inertiaGroup P G).subgroupOf (decompositionGroup P G)) + +variable {G} + +/-- Membership in the transported inertia subgroup over the decomposition field. -/ +theorem mem_inertiaGroupOverDecompositionField_iff + {P : Ideal B} [MulSemiringAction G B] + [Finite G] [IsGaloisGroup G K L] + {σ : L ≃ₐ[decompositionField (K := K) (L := L) G P] L} : + σ ∈ inertiaGroupOverDecompositionField (K := K) (L := L) G P ↔ + ∃ τ : (inertiaGroup P G).subgroupOf (decompositionGroup P G), + dedekindTowerDecompositionGroupEquivGalDecompositionField + (K := K) (L := L) G P (τ : decompositionGroup P G) = σ := by + constructor + · rintro ⟨τ, hτ, rfl⟩ + exact ⟨⟨τ, hτ⟩, rfl⟩ + · rintro ⟨τ, rfl⟩ + exact ⟨(τ : decompositionGroup P G), τ.property, rfl⟩ + +variable (G) + +/-- The transported inertia subgroup is normal in `Gal(L/Z_P)`. -/ +instance inertiaGroupOverDecompositionField_normal + (P : Ideal B) [MulSemiringAction G B] + [Finite G] [IsGaloisGroup G K L] : + (inertiaGroupOverDecompositionField (K := K) (L := L) G P).Normal := by + let e := + dedekindTowerDecompositionGroupEquivGalDecompositionField + (K := K) (L := L) G P + simpa [inertiaGroupOverDecompositionField, e] using + (Subgroup.Normal.map + (inertiaSubgroupOfDecomposition_normal P G) + e.toMonoidHom e.surjective) + +/-- A prime-decomposition consequence: +the fixed field of the transported inertia subgroup over `Z_P` is `T_P`. -/ +theorem dedekindRamification_inertiaFieldOverDecompositionField_fixedField_eq + (P : Ideal B) [MulSemiringAction G B] + [Finite G] [IsGaloisGroup G K L] : + IntermediateField.fixedField + (inertiaGroupOverDecompositionField (K := K) (L := L) G P) = + inertiaFieldOverDecompositionField (K := K) (L := L) G P := by + ext x + rw [IntermediateField.mem_fixedField_iff, + mem_inertiaFieldOverDecompositionField_iff] + constructor + · intro hx σ hσ + let τ : decompositionGroup P G := + ⟨σ, Ideal.inertia_le_stabilizer (M := G) P hσ⟩ + have hτ : + τ ∈ (inertiaGroup P G).subgroupOf (decompositionGroup P G) := + hσ + have hτmap : + dedekindTowerDecompositionGroupEquivGalDecompositionField + (K := K) (L := L) G P τ ∈ + inertiaGroupOverDecompositionField (K := K) (L := L) G P := by + exact ⟨τ, hτ, rfl⟩ + simpa [τ] using hx + (dedekindTowerDecompositionGroupEquivGalDecompositionField + (K := K) (L := L) G P τ) hτmap + · intro hx σ hσ + rcases + (mem_inertiaGroupOverDecompositionField_iff + (K := K) (L := L) (G := G) (P := P) (σ := σ)).mp hσ with + ⟨τ, rfl⟩ + simpa using hx ((τ : decompositionGroup P G) : G) τ.property + +/-- A prime-decomposition consequence: +`G(L/T_P)` over the decomposition field is the transported inertia subgroup. +-/ +theorem dedekindRamification_inertiaFieldOverDecompositionField_fixingSubgroup_eq + (P : Ideal B) [MulSemiringAction G B] + [Finite G] [IsGaloisGroup G K L] : + (inertiaFieldOverDecompositionField (K := K) (L := L) G P).fixingSubgroup = + inertiaGroupOverDecompositionField (K := K) (L := L) G P := by + have := dedekindTower_decompositionField_finiteDimensional (K := K) (L := L) G P + rw [← dedekindRamification_inertiaFieldOverDecompositionField_fixedField_eq + (K := K) (L := L) G P] + exact + IntermediateField.fixingSubgroup_fixedField + (inertiaGroupOverDecompositionField (K := K) (L := L) G P) + +/-- The localization and decomposition comparison: +`T_P/Z_P` is normal, at the fixed-field source level. -/ +instance inertiaFieldOverDecompositionField_isGalois + (P : Ideal B) [MulSemiringAction G B] + [Finite G] [IsGaloisGroup G K L] : + IsGalois (decompositionField (K := K) (L := L) G P) + (inertiaFieldOverDecompositionField (K := K) (L := L) G P) := by + have := dedekindTower_decompositionField_finiteDimensional (K := K) (L := L) G P + have := dedekindTower_decompositionField_isGalois (K := K) (L := L) G P + rw [← dedekindRamification_inertiaFieldOverDecompositionField_fixedField_eq + (K := K) (L := L) G P] + infer_instance + +/-- The localization and decomposition comparison gives: +`G_P/I_P ≃ Gal(T_P/Z_P)`, the fixed-field quotient form. -/ +def dedekindRamificationDecompositionQuotientInertiaEquivGalInertiaFieldOverDecomposition + (P : Ideal B) [MulSemiringAction G B] + [Finite G] [IsGaloisGroup G K L] : + decompositionGroup P G ⧸ + (inertiaGroup P G).subgroupOf (decompositionGroup P G) ≃* + (inertiaFieldOverDecompositionField (K := K) (L := L) G P ≃ₐ[decompositionField (K := K) + (L := L) G P] + inertiaFieldOverDecompositionField (K := K) (L := L) G P) := by + haveI := dedekindTower_decompositionField_finiteDimensional (K := K) (L := L) G P + haveI := dedekindTower_decompositionField_isGalois (K := K) (L := L) G P + exact + (QuotientGroup.congr + ((inertiaGroup P G).subgroupOf (decompositionGroup P G)) + (inertiaGroupOverDecompositionField (K := K) (L := L) G P) + (dedekindTowerDecompositionGroupEquivGalDecompositionField + (K := K) (L := L) G P) + rfl).trans + (by + rw [← dedekindRamification_inertiaFieldOverDecompositionField_fixedField_eq + (K := K) (L := L) G P] + exact + IsGalois.normalAutEquivQuotient + (inertiaGroupOverDecompositionField (K := K) (L := L) G P)) + +/-- A prime-decomposition consequence: +`[T_P : Z_P] = #(G_P / I_P)`. -/ +theorem dedekindRamification_inertiaFieldOverDecompositionField_finrank_eq_quotient_card + (P : Ideal B) [MulSemiringAction G B] + [Finite G] [IsGaloisGroup G K L] : + Module.finrank (decompositionField (K := K) (L := L) G P) + (inertiaFieldOverDecompositionField (K := K) (L := L) G P) = + Nat.card + (decompositionGroup P G ⧸ + (inertiaGroup P G).subgroupOf (decompositionGroup P G)) := by + have := dedekindTower_decompositionField_finiteDimensional (K := K) (L := L) G P + calc + Module.finrank (decompositionField (K := K) (L := L) G P) + (inertiaFieldOverDecompositionField (K := K) (L := L) G P) = + Nat.card + (inertiaFieldOverDecompositionField (K := K) (L := L) G P ≃ₐ[decompositionField (K := + K) (L := L) G P] + inertiaFieldOverDecompositionField (K := K) (L := L) G P) := by + rw [← IsGalois.card_aut_eq_finrank] + _ = + Nat.card + (decompositionGroup P G ⧸ + (inertiaGroup P G).subgroupOf (decompositionGroup P G)) := by + exact + Nat.card_congr + (dedekindRamificationDecompositionQuotientInertiaEquivGalInertiaFieldOverDecomposition + (K := K) (L := L) G P).symm.toEquiv + +/-- The localization and decomposition comparison: +`Gal(T_P/Z_P) ≃ Gal(kappa(P)/kappa(p))`, obtained by composing the +fixed-field quotient identification with the residue exact sequence. -/ +def dedekindRamificationGalInertiaFieldOverDecompositionEquivResidueGalois + (p : Ideal A) (P : Ideal B) [P.IsPrime] [P.LiesOver p] + [MulSemiringAction G B] [SMulCommClass G A B] + [Finite G] [IsGaloisGroup G K L] [Algebra.IsInvariant A B G] : + (inertiaFieldOverDecompositionField (K := K) (L := L) G P ≃ₐ[decompositionField (K := K) (L + := L) G P] + inertiaFieldOverDecompositionField (K := K) (L := L) G P) ≃* + (B ⧸ P) ≃ₐ[A ⧸ p] B ⧸ P := + (dedekindRamificationDecompositionQuotientInertiaEquivGalInertiaFieldOverDecomposition + (K := K) (L := L) G P).symm.trans + (dedekindRamificationDecompositionQuotientInertiaEquivResidueGalois + (A := A) (B := B) p P G) + +/-- The localization and decomposition comparison: +the inertia field proposition, bundled in the field-theoretic form: `T_P/Z_P` is +normal, `Gal(T_P/Z_P)` is the residue Galois group, and `G(L/T_P)=I_P`. -/ +theorem dedekindInertiaField_inertiaField_properties + (p : Ideal A) (P : Ideal B) [P.IsPrime] [P.LiesOver p] + [MulSemiringAction G B] [SMulCommClass G A B] + [Finite G] [IsGaloisGroup G K L] [Algebra.IsInvariant A B G] : + IsGalois (decompositionField (K := K) (L := L) G P) + (inertiaFieldOverDecompositionField (K := K) (L := L) G P) ∧ + Nonempty + ((inertiaFieldOverDecompositionField (K := K) (L := L) G P ≃ₐ[decompositionField (K := + K) (L := L) G P] + inertiaFieldOverDecompositionField (K := K) (L := L) G P) ≃* + (B ⧸ P) ≃ₐ[A ⧸ p] B ⧸ P) ∧ + fixingSubgroup G + ((inertiaField (K := K) (L := L) G P : IntermediateField K L) : + Set L) = + inertiaGroup P G := by + exact + ⟨inferInstance, + ⟨dedekindRamificationGalInertiaFieldOverDecompositionEquivResidueGalois + (A := A) (B := B) (K := K) (L := L) G p P⟩, + dedekindRamification_inertiaField_fixingSubgroup_eq (K := K) (L := L) G P⟩ + +end Dedekind +end HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldUnramified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldUnramified.lean new file mode 100644 index 0000000000..52b45a5d24 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldUnramified.lean @@ -0,0 +1,145 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.NumberField.Discriminant.Different +public import Mathlib.NumberTheory.NumberField.Ideal.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.NumberFieldPrimes +/-! +# Global cyclotomic inertia argument: the inertia-generated fixed field is unramified + +This file records the ramification-theoretic step in the proof of the global +Kronecker--Weber theorem. If a subgroup of a finite Galois group contains +the inertia group at every prime of the top field, then its fixed field is +unramified at every finite prime. +-/ + +@[expose] public section + +noncomputable +section + +namespace HilbertRamification.Dedekind + +open NumberField +open scoped NumberField + +attribute [local instance] Ideal.Quotient.field + +variable {G M : Type*} +variable [Group G] +variable [Field M] [NumberField M] +variable [MulSemiringAction G M] +variable [IsGaloisGroup G ℚ M] + +/-- Fixed-field unramifiedness from the global cyclotomic inertia argument. + +If `H` contains every inertia group of `M / ℚ`, then every finite prime of +the fixed field `Mᴴ` is unramified over `ℤ`. For a prime `P` of the fixed +field, choose a prime `Q` of `M` above it. The inertia group of `Q` for +`M / Mᴴ` has the same cardinality as the inertia group for `M / ℚ`, because +the latter is contained in `H`. prime-decomposition theory identifies these cardinalities +with the two upper ramification indices. Multiplicativity of ramification +indices in the tower then forces the lower ramification index to be one. -/ +theorem fixedFieldOfSubgroup_forall_isUnramifiedAt_of_inertiaGroup_le + (H : Subgroup G) + (hI : ∀ (Q : Ideal (𝓞 M)) [Q.IsPrime] [Q.IsMaximal], + inertiaGroup Q G ≤ H) : + ∀ (P : Ideal + (𝓞 (fixedFieldOfSubgroup (K := ℚ) (L := M) G H))) + [P.IsPrime], + Algebra.IsUnramifiedAt ℤ P := by + intro P _ + let F : IntermediateField ℚ M := + fixedFieldOfSubgroup (K := ℚ) (L := M) G H + change Algebra.IsUnramifiedAt ℤ (show Ideal (𝓞 F) from P) + let : Finite G := IsGaloisGroup.finite G ℚ M + let : IsGaloisGroup H F M := by + dsimp only [F, fixedFieldOfSubgroup] + infer_instance + let : IsGaloisGroup H (𝓞 F) (𝓞 M) := + IsGaloisGroup.of_isFractionRing H (𝓞 F) (𝓞 M) F M + by_cases hP0 : P = ⊥ + · subst P + rw [← not_dvd_differentIdeal_iff] + simp_rw [← Ideal.zero_eq_bot, zero_dvd_iff] + simpa only [Submodule.zero_eq_bot] using + (differentIdeal_ne_bot (A := ℤ) (B := 𝓞 F)) + let : P.IsMaximal := + (inferInstance : P.IsPrime).isMaximal hP0 + obtain ⟨⟨Q, hQprime, hQP⟩⟩ := + P.nonempty_primesOver (S := 𝓞 M) + let : Q.IsPrime := hQprime + let : Q.LiesOver P := hQP + have hQ0 : Q ≠ ⊥ := + Ideal.ne_bot_of_liesOver_of_ne_bot hP0 Q + let : Q.IsMaximal := + (inferInstance : Q.IsPrime).isMaximal hQ0 + let p : Ideal ℤ := P.under ℤ + let : p.IsPrime := inferInstance + let : P.LiesOver p := ⟨rfl⟩ + let : Q.LiesOver p := Ideal.LiesOver.trans Q P p + have hp0 : p ≠ ⊥ := + Ring.ne_bot_of_isMaximal_of_not_isField + (M := p) inferInstance Int.not_isField + let : Module.Finite (𝓞 F) (𝓞 M) := + ringOfIntegers_moduleFinite (K := F) (L := M) + let : Finite (ℤ ⧸ p) := + Ring.HasFiniteQuotients.finiteQuotient hp0 + let : PerfectField (ℤ ⧸ p) := PerfectField.ofFinite + let : Algebra.IsSeparable (ℤ ⧸ p) ((𝓞 M) ⧸ Q) := + Algebra.IsAlgebraic.isSeparable_of_perfectField + let : Finite ((𝓞 F) ⧸ P) := + inferInstance + let : PerfectField ((𝓞 F) ⧸ P) := PerfectField.ofFinite + let : Algebra.IsSeparable ((𝓞 F) ⧸ P) ((𝓞 M) ⧸ Q) := + Algebra.IsAlgebraic.isSeparable_of_perfectField + have hIH : + inertiaGroup Q H = (inertiaGroup Q G).subgroupOf H := by + ext σ + rfl + have hcard : + Nat.card (inertiaGroup Q H) = Nat.card (inertiaGroup Q G) := by + rw [hIH] + exact Nat.card_congr + (Subgroup.subgroupOfEquivOfLe (hI Q)).toEquiv + have hcard_base : + Nat.card (inertiaGroup Q G) = + Q.ramificationIdx ℤ := + inertia_card_eq_ramificationIdx + (A := ℤ) (B := 𝓞 M) p Q G hp0 + have hcard_relative : + Nat.card (inertiaGroup Q H) = + Q.ramificationIdx (𝓞 F) := + inertia_card_eq_ramificationIdx + (A := 𝓞 F) (B := 𝓞 M) P Q H hP0 + have heq : + Q.ramificationIdx ℤ = Q.ramificationIdx (𝓞 F) := by + exact hcard_base.symm.trans (hcard.symm.trans hcard_relative) + have htower : + Q.ramificationIdx ℤ = + P.ramificationIdx ℤ * Q.ramificationIdx (𝓞 F) := + Ideal.ramificationIdx_tower (R := ℤ) P Q + have hrelative0 : + Q.ramificationIdx (𝓞 F) ≠ 0 := + (Ideal.ramificationIdx_pos Q (𝓞 F)).ne' + have hlower : + P.ramificationIdx ℤ = 1 := by + apply Eq.symm + apply Nat.mul_right_cancel (Nat.pos_of_ne_zero hrelative0) + calc + 1 * Q.ramificationIdx (𝓞 F) = + Q.ramificationIdx (𝓞 F) := by simp + _ = Q.ramificationIdx ℤ := heq.symm + _ = P.ramificationIdx ℤ * Q.ramificationIdx (𝓞 F) := htower + exact + (Ideal.ramificationIdx_eq_one_iff + (R := ℤ) (S := 𝓞 F) (q := P)).1 hlower + +end HilbertRamification.Dedekind + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFields.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFields.lean new file mode 100644 index 0000000000..abd28ddddd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFields.lean @@ -0,0 +1,306 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic +/-! +# Hilbert ramification theory: decomposition and inertia fields + +This file contains the fixed-field layer of prime-decomposition theory. The +Dedekind-domain file defines the decomposition and inertia groups attached to +a prime ideal; here we view those groups as subgroups of a finite Galois group +acting on the fraction field and use mathlib's Galois correspondence. +-/ + +@[expose] public section + +noncomputable +section + +namespace HilbertRamification +namespace Dedekind + +open Algebra Module + +variable {A B K L : Type*} +variable [CommRing A] [CommRing B] [Algebra A B] +variable [Field K] [Field L] [Algebra K L] +variable (G : Type*) [Group G] [MulSemiringAction G L] [SMulCommClass G K L] + +/-- The fixed field of a subgroup of a finite Galois group, in the +`IsGaloisGroup` formulation used by the Dedekind ramification API. -/ +abbrev fixedFieldOfSubgroup (H : Subgroup G) : IntermediateField K L := + FixedPoints.intermediateField H + +variable {G} + +/-- Elementwise membership in the fixed field of a subgroup. -/ +theorem mem_fixedFieldOfSubgroup_iff + {H : Subgroup G} {x : L} : + x ∈ fixedFieldOfSubgroup (K := K) (L := L) G H ↔ + ∀ σ : H, (σ : G) • x = x := by + rfl + +/-- Membership in a subgroup fixed field, written with subgroup membership +rather than subtype elements. -/ +theorem mem_fixedFieldOfSubgroup_iff_forall_mem + {H : Subgroup G} {x : L} : + x ∈ fixedFieldOfSubgroup (K := K) (L := L) G H ↔ + ∀ σ ∈ H, σ • x = x := by + rw [mem_fixedFieldOfSubgroup_iff] + exact ⟨fun h σ hσ => h ⟨σ, hσ⟩, fun h σ => h σ σ.property⟩ + +variable (G) + +/-- The subgroup fixing the fixed field of a subgroup is the subgroup itself. -/ +theorem fixedFieldOfSubgroup_fixingSubgroup_eq + (H : Subgroup G) [Finite G] [IsGaloisGroup G K L] : + fixingSubgroup G + ((fixedFieldOfSubgroup (K := K) (L := L) G H : IntermediateField K L) : + Set L) = + H := by + simp [fixedFieldOfSubgroup, + (IsGaloisGroup.fixingSubgroup_fixedPoints + (G := G) (K := K) (L := L) (H := H))] + +variable {G} + +/-- A subgroup has full fixed field exactly when it is trivial. -/ +theorem fixedFieldOfSubgroup_eq_top_iff_subgroup_eq_bot + {H : Subgroup G} [Finite G] [IsGaloisGroup G K L] : + fixedFieldOfSubgroup (K := K) (L := L) G H = ⊤ ↔ H = ⊥ := by + constructor + · intro hF + calc + H = + fixingSubgroup G + ((fixedFieldOfSubgroup (K := K) (L := L) G H : + IntermediateField K L) : Set L) := + (fixedFieldOfSubgroup_fixingSubgroup_eq (K := K) (L := L) G H).symm + _ = + fixingSubgroup G ((⊤ : IntermediateField K L) : Set L) := by + rw [hF] + _ = ⊥ := IsGaloisGroup.fixingSubgroup_top (G := G) (K := K) (L := L) + · intro hH + rw [hH] + exact IsGaloisGroup.fixedPoints_bot (G := G) (K := K) (L := L) + +/-- A subgroup has base fixed field exactly when it is all of the Galois group. -/ +theorem fixedFieldOfSubgroup_eq_bot_iff_subgroup_eq_top + {H : Subgroup G} [Finite G] [IsGaloisGroup G K L] : + fixedFieldOfSubgroup (K := K) (L := L) G H = ⊥ ↔ H = ⊤ := by + constructor + · intro hF + calc + H = + fixingSubgroup G + ((fixedFieldOfSubgroup (K := K) (L := L) G H : + IntermediateField K L) : Set L) := + (fixedFieldOfSubgroup_fixingSubgroup_eq (K := K) (L := L) G H).symm + _ = + fixingSubgroup G ((⊥ : IntermediateField K L) : Set L) := by + rw [hF] + _ = ⊤ := IsGaloisGroup.fixingSubgroup_bot (G := G) (K := K) (L := L) + · intro hH + rw [hH] + exact IsGaloisGroup.fixedPoints_top (G := G) (K := K) (L := L) + +variable (G) + +/-- The decomposition and inertia definition: +the decomposition field `Z_P`, as the fixed field of the decomposition group. +-/ +abbrev decompositionField + (P : Ideal B) [MulSemiringAction G B] : IntermediateField K L := + fixedFieldOfSubgroup (K := K) (L := L) G (decompositionGroup P G) + +variable {G} + +/-- Elementwise membership in the decomposition field. -/ +theorem mem_decompositionField_iff + {P : Ideal B} [MulSemiringAction G B] {x : L} : + x ∈ decompositionField (K := K) (L := L) G P ↔ + ∀ σ ∈ decompositionGroup P G, σ • x = x := by + simp [decompositionField] + +variable (G) + +/-- Decomposition and inertia groups satisfy: +the subgroup fixing the decomposition field is the decomposition group. -/ +theorem dedekindDecomposition_decompositionField_fixingSubgroup_eq + (P : Ideal B) [MulSemiringAction G B] + [Finite G] [IsGaloisGroup G K L] : + fixingSubgroup G + ((decompositionField (K := K) (L := L) G P : IntermediateField K L) : + Set L) = + decompositionGroup P G := by + simp [decompositionField] + +variable {G} + +/-- Decomposition and inertia groups satisfy: +`G_P = 1` if and only if `Z_P = L`. -/ +theorem dedekindDecomposition_decompositionField_eq_top_iff_decompositionGroup_eq_bot + {P : Ideal B} [MulSemiringAction G B] + [Finite G] [IsGaloisGroup G K L] : + decompositionField (K := K) (L := L) G P = ⊤ ↔ + decompositionGroup P G = ⊥ := by + simpa [decompositionField] using + fixedFieldOfSubgroup_eq_top_iff_subgroup_eq_bot + (K := K) (L := L) (G := G) (H := decompositionGroup P G) + +/-- Decomposition and inertia groups satisfy: +`G_P = G` if and only if `Z_P = K`. -/ +theorem dedekindDecomposition_decompositionField_eq_bot_iff_decompositionGroup_eq_top + {P : Ideal B} [MulSemiringAction G B] + [Finite G] [IsGaloisGroup G K L] : + decompositionField (K := K) (L := L) G P = ⊥ ↔ + decompositionGroup P G = ⊤ := by + simpa [decompositionField] using + fixedFieldOfSubgroup_eq_bot_iff_subgroup_eq_top + (K := K) (L := L) (G := G) (H := decompositionGroup P G) + +/-- Decomposition and inertia groups satisfy: +the fixed-field form of total splitting, `Z_P = L` iff the number of primes +above `p` is `#G`. -/ +theorem dedekindDecomposition_decompositionField_eq_top_iff_primesOver_ncard_eq_card + (p : Ideal A) (P : Ideal B) [P.IsPrime] [P.LiesOver p] + [MulSemiringAction G B] + [Finite G] [IsGaloisGroup G K L] [IsGaloisGroup G A B] : + decompositionField (K := K) (L := L) G P = ⊤ ↔ + (p.primesOver B).ncard = Nat.card G := + (dedekindDecomposition_decompositionField_eq_top_iff_decompositionGroup_eq_bot + (K := K) (L := L) (G := G) (P := P)).trans + (dedekindDecomposition_decompositionGroup_eq_bot_iff_primesOver_ncard_eq_card + (A := A) (B := B) (G := G) p P) + +/-- Decomposition and inertia groups satisfy: +the fixed-field form of nonsplitting, `Z_P = K` iff `P` is the only prime +above `p`. -/ +theorem dedekindDecomposition_decompositionField_eq_bot_iff_primesOver_ncard_eq_one + (p : Ideal A) (P : Ideal B) [P.IsPrime] [P.LiesOver p] + [MulSemiringAction G B] + [Finite G] [IsGaloisGroup G K L] [IsGaloisGroup G A B] : + decompositionField (K := K) (L := L) G P = ⊥ ↔ + (p.primesOver B).ncard = 1 := + (dedekindDecomposition_decompositionField_eq_bot_iff_decompositionGroup_eq_top + (K := K) (L := L) (G := G) (P := P)).trans + (dedekindDecomposition_decompositionGroup_eq_top_iff_primesOver_ncard_eq_one + (A := A) (B := B) p P G) + +variable (G) + +/-- The prime-decomposition tower identity: +`[L : Z_P] = #G_P`. -/ +theorem dedekindTower_decompositionField_finrank_eq_decomposition_card + (P : Ideal B) [MulSemiringAction G B] [IsGaloisGroup G K L] : + Module.finrank (decompositionField (K := K) (L := L) G P) L = + Nat.card (decompositionGroup P G) := by + simp [decompositionField, fixedFieldOfSubgroup, + (IsGaloisGroup.finrank_fixedPoints_eq_card_subgroup + (G := G) (K := K) (L := L) (H := decompositionGroup P G))] + +/-- The prime-decomposition tower identity: +the decomposition group is the Galois group of `L/Z_P`. -/ +instance decompositionGroup_isGaloisGroup + (P : Ideal B) [MulSemiringAction G B] [IsGaloisGroup G K L] : + IsGaloisGroup (decompositionGroup P G) + (decompositionField (K := K) (L := L) G P) L := by + dsimp [decompositionField, fixedFieldOfSubgroup] + infer_instance + +/-- The inertia-field definition: +the inertia field `T_P`, as the fixed field of the inertia group. -/ +abbrev inertiaField + (P : Ideal B) [MulSemiringAction G B] : IntermediateField K L := + fixedFieldOfSubgroup (K := K) (L := L) G (inertiaGroup P G) + +variable {G} + +/-- Elementwise membership in the inertia field. -/ +theorem mem_inertiaField_iff + {P : Ideal B} [MulSemiringAction G B] {x : L} : + x ∈ inertiaField (K := K) (L := L) G P ↔ + ∀ σ ∈ inertiaGroup P G, σ • x = x := by + simp [inertiaField] + +variable (G) + +/-- Prime-decomposition statement: +the decomposition field is contained in the inertia field. -/ +theorem decompositionField_le_inertiaField + (P : Ideal B) [MulSemiringAction G B] : + decompositionField (K := K) (L := L) G P ≤ + inertiaField (K := K) (L := L) G P := + by + simpa [decompositionField, inertiaField, fixedFieldOfSubgroup, inertiaGroup, + decompositionGroup] using + (IsGaloisGroup.fixedPoints_le_of_le + (G := G) (K := K) (L := L) + (H := inertiaGroup P G) (H' := decompositionGroup P G) + (by + simpa [inertiaGroup, decompositionGroup] using + (Ideal.inertia_le_stabilizer (M := G) P))) + +/-- Prime-decomposition statement: +the subgroup fixing the inertia field is the inertia group. -/ +theorem dedekindRamification_inertiaField_fixingSubgroup_eq + (P : Ideal B) [MulSemiringAction G B] + [Finite G] [IsGaloisGroup G K L] : + fixingSubgroup G + ((inertiaField (K := K) (L := L) G P : IntermediateField K L) : + Set L) = + inertiaGroup P G := by + simp [inertiaField] + +variable {G} + +/-- A fixed-field special case: +`I_P = 1` if and only if `T_P = L`. -/ +theorem dedekindRamification_inertiaField_eq_top_iff_inertiaGroup_eq_bot + {P : Ideal B} [MulSemiringAction G B] + [Finite G] [IsGaloisGroup G K L] : + inertiaField (K := K) (L := L) G P = ⊤ ↔ + inertiaGroup P G = ⊥ := by + simpa [inertiaField] using + fixedFieldOfSubgroup_eq_top_iff_subgroup_eq_bot + (K := K) (L := L) (G := G) (H := inertiaGroup P G) + +/-- Fixed-field source for the opposite extreme of the inertia field: +`I_P = G` if and only if `T_P = K`. -/ +theorem dedekindRamification_inertiaField_eq_bot_iff_inertiaGroup_eq_top + {P : Ideal B} [MulSemiringAction G B] + [Finite G] [IsGaloisGroup G K L] : + inertiaField (K := K) (L := L) G P = ⊥ ↔ + inertiaGroup P G = ⊤ := by + simpa [inertiaField] using + fixedFieldOfSubgroup_eq_bot_iff_subgroup_eq_top + (K := K) (L := L) (G := G) (H := inertiaGroup P G) + +variable (G) + +/-- A prime-decomposition consequence: +`[L : T_P] = #I_P`. -/ +theorem dedekindRamification_inertiaField_finrank_eq_inertia_card + (P : Ideal B) [MulSemiringAction G B] [IsGaloisGroup G K L] : + Module.finrank (inertiaField (K := K) (L := L) G P) L = + Nat.card (inertiaGroup P G) := by + simp [inertiaField, fixedFieldOfSubgroup, + (IsGaloisGroup.finrank_fixedPoints_eq_card_subgroup + (G := G) (K := K) (L := L) (H := inertiaGroup P G))] + +/-- A prime-decomposition consequence: +the inertia group is the Galois group of `L/T_P`. -/ +instance inertiaGroup_isGaloisGroup + (P : Ideal B) [MulSemiringAction G B] [IsGaloisGroup G K L] : + IsGaloisGroup (inertiaGroup P G) + (inertiaField (K := K) (L := L) G P) L := by + dsimp [inertiaField, fixedFieldOfSubgroup] + infer_instance + +end Dedekind +end HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/NumberFieldPrimes.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/NumberFieldPrimes.lean new file mode 100644 index 0000000000..db8c0811ae --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/NumberFieldPrimes.lean @@ -0,0 +1,583 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.RamificationInertia.Unramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.PrimeContractions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.OrbitCardinality +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.TowerInvariants +/-! +# Hilbert ramification theory: number-field prime ideals in the fixed fields + +This file proves the ramification and inertia invariant statements for the +contracted primes `P_Z` and `P_T` appearing in +the decomposition and inertia fixed-field tower. +-/ + +@[expose] public section + +noncomputable +section + +namespace HilbertRamification +namespace Dedekind + +open Algebra NumberField +open scoped Pointwise + +attribute [local instance] Ideal.Quotient.field + +variable {K L : Type*} +variable [Field K] [Field L] [NumberField K] [NumberField L] [Algebra K L] +variable (G : Type*) [Group G] [MulSemiringAction G L] [SMulCommClass G K L] + +/-- The prime-decomposition tower identity: +`P` is the only prime of `O_L` above `P_Z`. -/ +theorem dedekindTower_decompositionFieldPrime_primesOver_ncard_eq_one + (P : Ideal (𝓞 L)) [P.IsPrime] + [Finite G] [IsGaloisGroup G K L] : + ((decompositionFieldPrime (K := K) (L := L) G P).primesOver (𝓞 L)).ncard = + 1 := by + let : + IsGaloisGroup (decompositionGroup P G) + (decompositionField (K := K) (L := L) G P) L := + IsGaloisGroup.subgroup G K L (decompositionGroup P G) + let : + IsGaloisGroup (decompositionGroup P G) + (𝓞 (decompositionField (K := K) (L := L) G P)) (𝓞 L) := + IsGaloisGroup.of_isFractionRing (decompositionGroup P G) + (𝓞 (decompositionField (K := K) (L := L) G P)) (𝓞 L) + (decompositionField (K := K) (L := L) G P) L + have horbit : + MulAction.orbit (decompositionGroup P G) P = + (decompositionFieldPrime (K := K) (L := L) G P).primesOver (𝓞 L) := by + exact + IsInvariant.orbit_eq_primesOver + (𝓞 (decompositionField (K := K) (L := L) G P)) (𝓞 L) + (decompositionGroup P G) + (decompositionFieldPrime (K := K) (L := L) G P) P + rw [← horbit] + exact dedekindTower_decompositionGroup_orbit_ncard_eq_one P G + +/-- The prime-decomposition tower identity: +over the decomposition field, the local product `e(P/P_Z) * f(P/P_Z)` +equals the original product `e(P/p) * f(P/p)`. This is the exact +`e' f' = e f` product comparison in the prime-decomposition proof. -/ +theorem dedekindTower_decompositionFieldPrime_product_eq_base_product + (P : Ideal (𝓞 L)) [P.IsPrime] [P.IsMaximal] + [Finite G] [IsGaloisGroup G K L] : + Ideal.ramificationIdx' (decompositionFieldPrime (K := K) (L := L) G P) P * + P.inertiaDeg + (𝓞 (decompositionField (K := K) (L := L) G P)) = + Ideal.ramificationIdx' (basePrime (K := K) P) P * + P.inertiaDeg (𝓞 K) := by + let : + IsGaloisGroup (decompositionGroup P G) + (decompositionField (K := K) (L := L) G P) L := + IsGaloisGroup.subgroup G K L (decompositionGroup P G) + let : + IsGaloisGroup (decompositionGroup P G) + (𝓞 (decompositionField (K := K) (L := L) G P)) (𝓞 L) := + IsGaloisGroup.of_isFractionRing (decompositionGroup P G) + (𝓞 (decompositionField (K := K) (L := L) G P)) (𝓞 L) + (decompositionField (K := K) (L := L) G P) L + have : + Module.Finite + (𝓞 (decompositionField (K := K) (L := L) G P)) (𝓞 L) := + ringOfIntegers_moduleFinite + (K := decompositionField (K := K) (L := L) G P) (L := L) + have : Module.Finite (𝓞 K) (𝓞 L) := + ringOfIntegers_moduleFinite (K := K) (L := L) + have htop : + Ideal.ramificationIdx' (decompositionFieldPrime (K := K) (L := L) G P) P * + P.inertiaDeg + (𝓞 (decompositionField (K := K) (L := L) G P)) = + Nat.card (decompositionGroup P G) := by + rw [Ideal.ramificationIdx'_eq_ramificationIdx + (decompositionFieldPrime (K := K) (L := L) G P) P + (decompositionFieldPrime_ne_bot (K := K) (L := L) G P)] + exact + dedekindTower_ramificationIdx_mul_inertiaDeg_eq_card_of_nonsplit + (A := 𝓞 (decompositionField (K := K) (L := L) G P)) + (B := 𝓞 L) + (p := decompositionFieldPrime (K := K) (L := L) G P) + (P := P) + (decompositionFieldPrime_ne_bot (K := K) (L := L) G P) + (decompositionGroup P G) + (dedekindTower_decompositionFieldPrime_primesOver_ncard_eq_one + (K := K) (L := L) G P) + have hbase : + Nat.card (decompositionGroup P G) = + Ideal.ramificationIdx' (basePrime (K := K) P) P * + P.inertiaDeg (𝓞 K) := by + rw [Ideal.ramificationIdx'_eq_ramificationIdx + (basePrime (K := K) P) P (basePrime_ne_bot (K := K) P)] + exact + dedekindTower_decomposition_card_eq_ramificationIdx_mul_inertiaDeg + (A := 𝓞 K) (B := 𝓞 L) + (basePrime (K := K) P) (basePrime_ne_bot (K := K) P) P G + exact htop.trans hbase + +/-- The prime-decomposition tower identity: +for the decomposition field prime `P_Z`, the top extension has the original +ramification index and inertia degree, while `P_Z/p` has both invariants +equal to `1`. -/ +theorem dedekindTower_decompositionFieldPrime_tower_invariants + (P : Ideal (𝓞 L)) [P.IsPrime] [P.IsMaximal] + [Finite G] [IsGaloisGroup G K L] : + Ideal.ramificationIdx' (basePrime (K := K) P) (decompositionFieldPrime (K := K) (L := L) G + P) = 1 ∧ + (decompositionFieldPrime (K := K) (L := L) G P).inertiaDeg + (𝓞 K) = 1 ∧ + Ideal.ramificationIdx' (decompositionFieldPrime (K := K) (L := L) G P) P = + Ideal.ramificationIdx' (basePrime (K := K) P) P ∧ + P.inertiaDeg (𝓞 (decompositionField (K := K) (L := L) G P)) = + P.inertiaDeg (𝓞 K) := by + have : + Module.Finite + (𝓞 (decompositionField (K := K) (L := L) G P)) (𝓞 L) := + ringOfIntegers_moduleFinite + (K := decompositionField (K := K) (L := L) G P) (L := L) + have hPZ_ne : + Ideal.map + (algebraMap + (𝓞 (decompositionField (K := K) (L := L) G P)) (𝓞 L)) + (decompositionFieldPrime (K := K) (L := L) G P) ≠ ⊥ := + Ideal.map_ne_bot_of_ne_bot + (decompositionFieldPrime_ne_bot (K := K) (L := L) G P) + have hp_ne : + Ideal.map (algebraMap (𝓞 K) (𝓞 L)) + (basePrime (K := K) P) ≠ ⊥ := + Ideal.map_ne_bot_of_ne_bot (basePrime_ne_bot (K := K) P) + have hPZ_le : + Ideal.map + (algebraMap + (𝓞 (decompositionField (K := K) (L := L) G P)) (𝓞 L)) + (decompositionFieldPrime (K := K) (L := L) G P) ≤ P := by + rw [decompositionFieldPrime, Ideal.under_def] + exact Ideal.map_comap_le + exact + dedekindTower_ideal_tower_invariants_of_top_product + (A := 𝓞 K) + (B := 𝓞 (decompositionField (K := K) (L := L) G P)) + (C := 𝓞 L) + (p := basePrime (K := K) P) + (P := decompositionFieldPrime (K := K) (L := L) G P) + (Q := P) + hPZ_ne hp_ne hPZ_le + (dedekindTower_decompositionFieldPrime_product_eq_base_product + (K := K) (L := L) G P) + +/-- A prime-decomposition consequence: +`P` is the only prime of `O_L` above `P_T`. -/ +theorem dedekindRamification_inertiaFieldPrime_primesOver_ncard_eq_one + (P : Ideal (𝓞 L)) [P.IsPrime] + [Finite G] [IsGaloisGroup G K L] : + ((inertiaFieldPrime (K := K) (L := L) G P).primesOver (𝓞 L)).ncard = + 1 := by + let : + IsGaloisGroup (inertiaGroup P G) + (inertiaField (K := K) (L := L) G P) L := + IsGaloisGroup.subgroup G K L (inertiaGroup P G) + let : + IsGaloisGroup (inertiaGroup P G) + (𝓞 (inertiaField (K := K) (L := L) G P)) (𝓞 L) := + IsGaloisGroup.of_isFractionRing (inertiaGroup P G) + (𝓞 (inertiaField (K := K) (L := L) G P)) (𝓞 L) + (inertiaField (K := K) (L := L) G P) L + have horbit : + MulAction.orbit (inertiaGroup P G) P = + (inertiaFieldPrime (K := K) (L := L) G P).primesOver (𝓞 L) := by + exact + IsInvariant.orbit_eq_primesOver + (𝓞 (inertiaField (K := K) (L := L) G P)) (𝓞 L) + (inertiaGroup P G) + (inertiaFieldPrime (K := K) (L := L) G P) P + rw [← horbit] + exact dedekindRamification_inertiaGroup_orbit_ncard_eq_one P G + +/-- A prime-decomposition consequence: +over the inertia field, the local product `e(P/P_T) * f(P/P_T)` equals the +original ramification index `e(P/p)` when the residue extension is separable. +-/ +theorem dedekindRamification_inertiaFieldPrime_product_eq_base_ramificationIdx + (P : Ideal (𝓞 L)) [P.IsPrime] [P.IsMaximal] + [Finite G] [IsGaloisGroup G K L] + [Algebra.IsSeparable ((𝓞 K) ⧸ basePrime (K := K) P) ((𝓞 L) ⧸ P)] : + Ideal.ramificationIdx' (inertiaFieldPrime (K := K) (L := L) G P) P * + P.inertiaDeg + (𝓞 (inertiaField (K := K) (L := L) G P)) = + Ideal.ramificationIdx' (basePrime (K := K) P) P := by + let : + IsGaloisGroup (inertiaGroup P G) + (inertiaField (K := K) (L := L) G P) L := + IsGaloisGroup.subgroup G K L (inertiaGroup P G) + let : + IsGaloisGroup (inertiaGroup P G) + (𝓞 (inertiaField (K := K) (L := L) G P)) (𝓞 L) := + IsGaloisGroup.of_isFractionRing (inertiaGroup P G) + (𝓞 (inertiaField (K := K) (L := L) G P)) (𝓞 L) + (inertiaField (K := K) (L := L) G P) L + have : + Module.Finite + (𝓞 (inertiaField (K := K) (L := L) G P)) (𝓞 L) := + ringOfIntegers_moduleFinite + (K := inertiaField (K := K) (L := L) G P) (L := L) + have : Module.Finite (𝓞 K) (𝓞 L) := + ringOfIntegers_moduleFinite (K := K) (L := L) + have htop : + Ideal.ramificationIdx' (inertiaFieldPrime (K := K) (L := L) G P) P * + P.inertiaDeg + (𝓞 (inertiaField (K := K) (L := L) G P)) = + Nat.card (inertiaGroup P G) := by + rw [Ideal.ramificationIdx'_eq_ramificationIdx + (inertiaFieldPrime (K := K) (L := L) G P) P + (inertiaFieldPrime_ne_bot (K := K) (L := L) G P)] + exact + dedekindTower_ramificationIdx_mul_inertiaDeg_eq_card_of_nonsplit + (A := 𝓞 (inertiaField (K := K) (L := L) G P)) + (B := 𝓞 L) + (p := inertiaFieldPrime (K := K) (L := L) G P) + (P := P) + (inertiaFieldPrime_ne_bot (K := K) (L := L) G P) + (inertiaGroup P G) + (dedekindRamification_inertiaFieldPrime_primesOver_ncard_eq_one + (K := K) (L := L) G P) + have hbase : + Nat.card (inertiaGroup P G) = + Ideal.ramificationIdx' (basePrime (K := K) P) P := by + rw [Ideal.ramificationIdx'_eq_ramificationIdx + (basePrime (K := K) P) P (basePrime_ne_bot (K := K) P)] + exact + inertia_card_eq_ramificationIdx + (A := 𝓞 K) (B := 𝓞 L) + (basePrime (K := K) P) P G (basePrime_ne_bot (K := K) P) + exact htop.trans hbase + +omit [NumberField K] [NumberField L] in +/-- A prime-decomposition consequence: +the residue extension for `P/P_T` is separable whenever the original residue +extension `kappa(P)/kappa(p)` is separable. -/ +theorem dedekindRamification_inertiaFieldPrime_residue_isSeparable + (P : Ideal (𝓞 L)) [P.IsMaximal] + [Algebra.IsSeparable ((𝓞 K) ⧸ basePrime (K := K) P) ((𝓞 L) ⧸ P)] : + Algebra.IsSeparable + ((𝓞 (inertiaField (K := K) (L := L) G P)) ⧸ + inertiaFieldPrime (K := K) (L := L) G P) + ((𝓞 L) ⧸ P) := by + have hKT := + (inertiaFieldPrime (K := K) (L := L) G P).over_def + (basePrime (K := K) P) + have hTL := + P.over_def (inertiaFieldPrime (K := K) (L := L) G P) + have hKL := + P.over_def (basePrime (K := K) P) + let : + Algebra ((𝓞 K) ⧸ basePrime (K := K) P) + ((𝓞 (inertiaField (K := K) (L := L) G P)) ⧸ + inertiaFieldPrime (K := K) (L := L) G P) := + Ideal.Quotient.algebraQuotientOfLEComap hKT.le + let : + Algebra + ((𝓞 (inertiaField (K := K) (L := L) G P)) ⧸ + inertiaFieldPrime (K := K) (L := L) G P) + ((𝓞 L) ⧸ P) := + Ideal.Quotient.algebraQuotientOfLEComap hTL.le + let : + Algebra ((𝓞 K) ⧸ basePrime (K := K) P) ((𝓞 L) ⧸ P) := + Ideal.Quotient.algebraQuotientOfLEComap hKL.le + let : + IsScalarTower + ((𝓞 K) ⧸ basePrime (K := K) P) + ((𝓞 (inertiaField (K := K) (L := L) G P)) ⧸ + inertiaFieldPrime (K := K) (L := L) G P) + ((𝓞 L) ⧸ P) := + IsScalarTower.of_algebraMap_eq <| by + rintro ⟨x⟩ + exact + congr_arg _ + (IsScalarTower.algebraMap_apply + (𝓞 K) (𝓞 (inertiaField (K := K) (L := L) G P)) (𝓞 L) x) + exact + Algebra.isSeparable_tower_top_of_isSeparable + ((𝓞 K) ⧸ basePrime (K := K) P) + ((𝓞 (inertiaField (K := K) (L := L) G P)) ⧸ + inertiaFieldPrime (K := K) (L := L) G P) + ((𝓞 L) ⧸ P) + +/-- A prime-decomposition consequence: +`P/P_T` has residue degree one. -/ +theorem dedekindRamification_inertiaFieldPrime_inertiaDeg_eq_one + (P : Ideal (𝓞 L)) [P.IsPrime] [P.IsMaximal] + [Finite G] [IsGaloisGroup G K L] + [Algebra.IsSeparable ((𝓞 K) ⧸ basePrime (K := K) P) ((𝓞 L) ⧸ P)] : + P.inertiaDeg (𝓞 (inertiaField (K := K) (L := L) G P)) = 1 := by + let : + IsGaloisGroup (inertiaGroup P G) + (inertiaField (K := K) (L := L) G P) L := + IsGaloisGroup.subgroup G K L (inertiaGroup P G) + let : + IsGaloisGroup (inertiaGroup P G) + (𝓞 (inertiaField (K := K) (L := L) G P)) (𝓞 L) := + IsGaloisGroup.of_isFractionRing (inertiaGroup P G) + (𝓞 (inertiaField (K := K) (L := L) G P)) (𝓞 L) + (inertiaField (K := K) (L := L) G P) L + have : + Module.Finite + (𝓞 (inertiaField (K := K) (L := L) G P)) (𝓞 L) := + ringOfIntegers_moduleFinite + (K := inertiaField (K := K) (L := L) G P) (L := L) + have : + Algebra.IsSeparable + ((𝓞 (inertiaField (K := K) (L := L) G P)) ⧸ + inertiaFieldPrime (K := K) (L := L) G P) + ((𝓞 L) ⧸ P) := + dedekindRamification_inertiaFieldPrime_residue_isSeparable (K := K) (L := L) G P + have hquot : + Nat.card + (decompositionGroup P (inertiaGroup P G) ⧸ + (inertiaGroup P (inertiaGroup P G)).subgroupOf + (decompositionGroup P (inertiaGroup P G))) = + P.inertiaDeg (𝓞 (inertiaField (K := K) (L := L) G P)) := by + exact + dedekindRamification_decompositionQuotientInertia_card_eq_inertiaDeg + (A := 𝓞 (inertiaField (K := K) (L := L) G P)) (B := 𝓞 L) + (inertiaFieldPrime (K := K) (L := L) G P) P (inertiaGroup P G) + have hsubtop : + (inertiaGroup P (inertiaGroup P G)).subgroupOf + (decompositionGroup P (inertiaGroup P G)) = ⊤ := by + rw [dedekindRamification_inertiaGroup_inertiaGroup_eq_top (B := 𝓞 L) P G, + dedekindRamification_inertiaGroup_decompositionGroup_eq_top (B := 𝓞 L) P G, + Subgroup.top_subgroupOf] + have hquot_one : + Nat.card + (decompositionGroup P (inertiaGroup P G) ⧸ + (inertiaGroup P (inertiaGroup P G)).subgroupOf + (decompositionGroup P (inertiaGroup P G))) = 1 := by + rw [hsubtop] + exact + Nat.card_eq_one_iff_unique.mpr + ⟨QuotientGroup.subsingleton_quotient_top, ⟨1⟩⟩ + exact hquot.symm.trans hquot_one + +/-- Ramification over the inertia field: +over the inertia field, `P` has ramification index `e` and residue degree `1`. +-/ +theorem dedekindRamification_inertiaFieldPrime_top_invariants + (P : Ideal (𝓞 L)) [P.IsPrime] [P.IsMaximal] + [Finite G] [IsGaloisGroup G K L] + [Algebra.IsSeparable ((𝓞 K) ⧸ basePrime (K := K) P) ((𝓞 L) ⧸ P)] : + Ideal.ramificationIdx' (inertiaFieldPrime (K := K) (L := L) G P) P = + Ideal.ramificationIdx' (basePrime (K := K) P) P ∧ + P.inertiaDeg (𝓞 (inertiaField (K := K) (L := L) G P)) = 1 := by + have hf : + P.inertiaDeg (𝓞 (inertiaField (K := K) (L := L) G P)) = 1 := + dedekindRamification_inertiaFieldPrime_inertiaDeg_eq_one (K := K) (L := L) G P + refine ⟨?_, hf⟩ + have hprod := + dedekindRamification_inertiaFieldPrime_product_eq_base_ramificationIdx + (K := K) (L := L) G P + rwa [hf, mul_one] at hprod + +/-- Ramification between the decomposition and inertia fields: +between the decomposition field and inertia field, `P_T/P_Z` has +ramification index `1` and residue degree `f`. -/ +theorem dedekindRamification_inertiaFieldPrime_middle_invariants + (P : Ideal (𝓞 L)) [P.IsPrime] [P.IsMaximal] + [Finite G] [IsGaloisGroup G K L] + [Algebra.IsSeparable ((𝓞 K) ⧸ basePrime (K := K) P) ((𝓞 L) ⧸ P)] : + Ideal.ramificationIdx' (decompositionFieldPrime (K := K) (L := L) G P) (inertiaFieldPrime (K + := K) (L := L) G P) = 1 ∧ + (inertiaFieldPrime (K := K) (L := L) G P).inertiaDeg + (𝓞 (decompositionField (K := K) (L := L) G P)) = + P.inertiaDeg (𝓞 K) := by + have : + Module.Finite + (𝓞 (inertiaField (K := K) (L := L) G P)) (𝓞 L) := + ringOfIntegers_moduleFinite + (K := inertiaField (K := K) (L := L) G P) (L := L) + have hPT_ne : + Ideal.map + (algebraMap + (𝓞 (inertiaField (K := K) (L := L) G P)) (𝓞 L)) + (inertiaFieldPrime (K := K) (L := L) G P) ≠ ⊥ := + Ideal.map_ne_bot_of_ne_bot + (inertiaFieldPrime_ne_bot (K := K) (L := L) G P) + have hPZ_ne : + Ideal.map + (algebraMap + (𝓞 (decompositionField (K := K) (L := L) G P)) (𝓞 L)) + (decompositionFieldPrime (K := K) (L := L) G P) ≠ ⊥ := + Ideal.map_ne_bot_of_ne_bot + (decompositionFieldPrime_ne_bot (K := K) (L := L) G P) + have hPT_le : + Ideal.map + (algebraMap + (𝓞 (inertiaField (K := K) (L := L) G P)) (𝓞 L)) + (inertiaFieldPrime (K := K) (L := L) G P) ≤ P := by + rw [inertiaFieldPrime, Ideal.under_def] + exact Ideal.map_comap_le + have htop := + dedekindRamification_inertiaFieldPrime_top_invariants (K := K) (L := L) G P + have hdecomposition := + dedekindTower_decompositionFieldPrime_tower_invariants + (K := K) (L := L) G P + have heTop : + Ideal.ramificationIdx' (inertiaFieldPrime (K := K) (L := L) G P) P = + Ideal.ramificationIdx' (decompositionFieldPrime (K := K) (L := L) G P) P := + htop.1.trans hdecomposition.2.2.1.symm + have hmiddle : + Ideal.ramificationIdx' (decompositionFieldPrime (K := K) (L := L) G P) (inertiaFieldPrime + (K := K) (L := L) G P) = 1 ∧ + (inertiaFieldPrime (K := K) (L := L) G P).inertiaDeg + (𝓞 (decompositionField (K := K) (L := L) G P)) = + P.inertiaDeg + (𝓞 (decompositionField (K := K) (L := L) G P)) := + dedekindRamification_ideal_tower_middle_invariants_of_top_invariants + (A := 𝓞 (decompositionField (K := K) (L := L) G P)) + (B := 𝓞 (inertiaField (K := K) (L := L) G P)) + (C := 𝓞 L) + (p := decompositionFieldPrime (K := K) (L := L) G P) + (P := inertiaFieldPrime (K := K) (L := L) G P) + (Q := P) + hPT_ne hPZ_ne hPT_le heTop htop.2 + exact ⟨hmiddle.1, hmiddle.2.trans hdecomposition.2.2.2⟩ + +/-- A prime-decomposition consequence: +`[L : T_P] = e`. -/ +theorem dedekindRamification_inertiaField_finrank_eq_base_ramificationIdx + (P : Ideal (𝓞 L)) [P.IsPrime] [P.IsMaximal] + [Finite G] [IsGaloisGroup G K L] + [Algebra.IsSeparable ((𝓞 K) ⧸ basePrime (K := K) P) ((𝓞 L) ⧸ P)] : + Module.finrank (inertiaField (K := K) (L := L) G P) L = + P.ramificationIdx (𝓞 K) := by + calc + Module.finrank (inertiaField (K := K) (L := L) G P) L = + Nat.card (inertiaGroup P G) := + dedekindRamification_inertiaField_finrank_eq_inertia_card + (K := K) (L := L) G P + _ = + P.ramificationIdx (𝓞 K) := by + exact + inertia_card_eq_ramificationIdx + (A := 𝓞 K) (B := 𝓞 L) + (basePrime (K := K) P) P G (basePrime_ne_bot (K := K) P) + +/-- A prime-decomposition consequence: +`[T_P : Z_P] = f`. -/ +theorem dedekindRamification_inertiaFieldOverDecompositionField_finrank_eq_base_inertiaDeg + (P : Ideal (𝓞 L)) [P.IsPrime] [P.IsMaximal] + [Finite G] [IsGaloisGroup G K L] + [Algebra.IsSeparable ((𝓞 K) ⧸ basePrime (K := K) P) ((𝓞 L) ⧸ P)] : + Module.finrank (decompositionField (K := K) (L := L) G P) + (inertiaFieldOverDecompositionField (K := K) (L := L) G P) = + P.inertiaDeg (𝓞 K) := by + calc + Module.finrank (decompositionField (K := K) (L := L) G P) + (inertiaFieldOverDecompositionField (K := K) (L := L) G P) = + Nat.card + (decompositionGroup P G ⧸ + (inertiaGroup P G).subgroupOf (decompositionGroup P G)) := + dedekindRamification_inertiaFieldOverDecompositionField_finrank_eq_quotient_card + (K := K) (L := L) G P + _ = + P.inertiaDeg (𝓞 K) := by + exact + dedekindRamification_decompositionQuotientInertia_card_eq_inertiaDeg + (A := 𝓞 K) (B := 𝓞 L) (basePrime (K := K) P) P G + +/-- Degree and cardinality relations in the fixed-field tower: +`#I_P = [L:T_P] = e` and `#(G_P/I_P) = [T_P:Z_P] = f`. -/ +theorem dedekindRamification_inertiaField_degree_cardinalities + (P : Ideal (𝓞 L)) [P.IsPrime] [P.IsMaximal] + [Finite G] [IsGaloisGroup G K L] + [Algebra.IsSeparable ((𝓞 K) ⧸ basePrime (K := K) P) ((𝓞 L) ⧸ P)] : + Nat.card (inertiaGroup P G) = + P.ramificationIdx (𝓞 K) ∧ + Module.finrank (inertiaField (K := K) (L := L) G P) L = + P.ramificationIdx (𝓞 K) ∧ + Nat.card + (decompositionGroup P G ⧸ + (inertiaGroup P G).subgroupOf (decompositionGroup P G)) = + P.inertiaDeg (𝓞 K) ∧ + Module.finrank (decompositionField (K := K) (L := L) G P) + (inertiaFieldOverDecompositionField (K := K) (L := L) G P) = + P.inertiaDeg (𝓞 K) := by + refine ⟨?_, ?_, ?_, ?_⟩ + · exact + inertia_card_eq_ramificationIdx + (A := 𝓞 K) (B := 𝓞 L) + (basePrime (K := K) P) P G (basePrime_ne_bot (K := K) P) + · exact + dedekindRamification_inertiaField_finrank_eq_base_ramificationIdx + (K := K) (L := L) G P + · exact + dedekindRamification_decompositionQuotientInertia_card_eq_inertiaDeg + (A := 𝓞 K) (B := 𝓞 L) (basePrime (K := K) P) P G + · exact + dedekindRamification_inertiaFieldOverDecompositionField_finrank_eq_base_inertiaDeg + (K := K) (L := L) G P + +/-- Ramification and residue degrees in the ideal-level fixed-field tower: +`Z_P -> T_P -> L` has ramification indices `1, e` and residue degrees +`f, 1`. -/ +theorem dedekindRamification_inertiaFieldPrime_tower_invariants + (P : Ideal (𝓞 L)) [P.IsPrime] [P.IsMaximal] + [Finite G] [IsGaloisGroup G K L] + [Algebra.IsSeparable ((𝓞 K) ⧸ basePrime (K := K) P) ((𝓞 L) ⧸ P)] : + Ideal.ramificationIdx' (inertiaFieldPrime (K := K) (L := L) G P) P = + Ideal.ramificationIdx' (basePrime (K := K) P) P ∧ + P.inertiaDeg (𝓞 (inertiaField (K := K) (L := L) G P)) = 1 ∧ + Ideal.ramificationIdx' (decompositionFieldPrime (K := K) (L := L) G P) (inertiaFieldPrime + (K := K) (L := L) G P) = 1 ∧ + (inertiaFieldPrime (K := K) (L := L) G P).inertiaDeg + (𝓞 (decompositionField (K := K) (L := L) G P)) = + P.inertiaDeg (𝓞 K) := by + have htop := + dedekindRamification_inertiaFieldPrime_top_invariants (K := K) (L := L) G P + have hmiddle := + dedekindRamification_inertiaFieldPrime_middle_invariants (K := K) (L := L) G P + exact ⟨htop.1, htop.2, hmiddle.1, hmiddle.2⟩ + +omit [SMulCommClass G K L] in +/-- A trivial-inertia special case: +under the separable residue hypothesis, `I_P = 1` if and only if `P` is +unramified over `O_K`. -/ +theorem inertiaGroup_eq_bot_iff_isUnramifiedAt + {P : Ideal (𝓞 L)} [P.IsPrime] [P.IsMaximal] + [Finite G] [IsGaloisGroup G K L] + [Algebra.IsSeparable ((𝓞 K) ⧸ basePrime (K := K) P) ((𝓞 L) ⧸ P)] : + inertiaGroup P G = ⊥ ↔ Algebra.IsUnramifiedAt (𝓞 K) P := by + have hunram : + Algebra.IsUnramifiedAt (𝓞 K) P ↔ + P.ramificationIdx (𝓞 K) = 1 := + (Ideal.ramificationIdx_eq_one_iff (q := P) (R := 𝓞 K)).symm + have hram : + inertiaGroup P G = ⊥ ↔ + P.ramificationIdx (𝓞 K) = 1 := by + rw [← Subgroup.card_eq_one, + inertia_card_eq_ramificationIdx + (A := 𝓞 K) (B := 𝓞 L) + (basePrime (K := K) P) P G (basePrime_ne_bot (K := K) P)] + exact hram.trans hunram.symm + +/-- A trivial-inertia special case: +under the separable residue hypothesis, `T_P = L` if and only if `P` is +unramified over `O_K`. -/ +theorem dedekindRamification_inertiaField_eq_top_iff_isUnramifiedAt + {P : Ideal (𝓞 L)} [P.IsPrime] [P.IsMaximal] + [Finite G] [IsGaloisGroup G K L] + [Algebra.IsSeparable ((𝓞 K) ⧸ basePrime (K := K) P) ((𝓞 L) ⧸ P)] : + inertiaField (K := K) (L := L) G P = ⊤ ↔ + Algebra.IsUnramifiedAt (𝓞 K) P := + (dedekindRamification_inertiaField_eq_top_iff_inertiaGroup_eq_bot + (K := K) (L := L) (G := G) (P := P)).trans + (inertiaGroup_eq_bot_iff_isUnramifiedAt + (K := K) (L := L) (G := G) (P := P)) + +end Dedekind +end HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/OrbitCardinality.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/OrbitCardinality.lean new file mode 100644 index 0000000000..c6209d56fa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/OrbitCardinality.lean @@ -0,0 +1,199 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic +/-! +# Hilbert ramification theory: prime-decomposition cardinalities + +This file records the parts of the prime-decomposition tower identity that are +already available from the Dedekind-domain Galois action and mathlib's +ramification/inertia API. +-/ + +@[expose] public section + +noncomputable +section + +namespace HilbertRamification +namespace Dedekind + +open scoped Pointwise +open Algebra Module + +variable {A B : Type*} [CommRing A] [CommRing B] [Algebra A B] + +private theorem orbit_eq_singleton_of_le_stabilizer + {G X : Type*} [Group G] [MulAction G X] + (H : Subgroup G) {x : X} (hH : H ≤ MulAction.stabilizer G x) : + MulAction.orbit H x = {x} := by + ext y + constructor + · intro hy + rw [Set.mem_singleton_iff] + rcases MulAction.mem_orbit_iff.mp hy with ⟨σ, hσ⟩ + rw [← hσ] + exact (MulAction.mem_stabilizer_iff.mp (hH σ.property)) + · intro hy + rw [Set.mem_singleton_iff] at hy + subst y + exact MulAction.mem_orbit_self x + +/-- The prime-decomposition tower identity: +under the decomposition group `G_P`, the orbit of `P` is a singleton. This is +the group-action core of the assertion that over the decomposition field +`Z_P`, the prime `P` is nonsplit. -/ +theorem dedekindTower_decompositionGroup_orbit_eq_singleton + (P : Ideal B) (G : Type*) [Group G] [MulSemiringAction G B] : + MulAction.orbit (decompositionGroup P G) P = {P} := by + exact orbit_eq_singleton_of_le_stabilizer + (decompositionGroup P G) + (fun σ hσ => (mem_decompositionGroup_iff (P := P) (G := G) (σ := σ)).1 hσ) + +/-- The prime-decomposition tower identity: +the decomposition-group orbit of `P` has one element. -/ +theorem dedekindTower_decompositionGroup_orbit_ncard_eq_one + (P : Ideal B) (G : Type*) [Group G] [MulSemiringAction G B] : + (MulAction.orbit (decompositionGroup P G) P).ncard = 1 := by + rw [dedekindTower_decompositionGroup_orbit_eq_singleton (B := B) P G] + simp + +/-- A prime-decomposition consequence: +under the inertia group `I_P`, the orbit of `P` is a singleton. -/ +theorem dedekindRamification_inertiaGroup_orbit_eq_singleton + (P : Ideal B) (G : Type*) [Group G] [MulSemiringAction G B] : + MulAction.orbit (inertiaGroup P G) P = {P} := by + exact orbit_eq_singleton_of_le_stabilizer + (inertiaGroup P G) + (fun σ hσ => Ideal.inertia_le_stabilizer (M := G) P hσ) + +/-- A prime-decomposition consequence: +the inertia-group orbit of `P` has one element. -/ +theorem dedekindRamification_inertiaGroup_orbit_ncard_eq_one + (P : Ideal B) (G : Type*) [Group G] [MulSemiringAction G B] : + (MulAction.orbit (inertiaGroup P G) P).ncard = 1 := by + rw [dedekindRamification_inertiaGroup_orbit_eq_singleton (B := B) P G] + simp + +/-- A prime-decomposition consequence: +when `I_P` itself is viewed as the acting Galois group, every element fixes +`P`, so the decomposition group is the whole group. -/ +theorem dedekindRamification_inertiaGroup_decompositionGroup_eq_top + (P : Ideal B) (G : Type*) [Group G] [MulSemiringAction G B] : + decompositionGroup P (inertiaGroup P G) = ⊤ := by + apply le_antisymm le_top + intro σ _hσ + rw [mem_decompositionGroup_iff] + change (σ : G) • P = P + exact Ideal.inertia_le_stabilizer (M := G) P σ.property + +/-- A prime-decomposition consequence: +when `I_P` itself is viewed as the acting Galois group, its inertia group is +the whole group. -/ +theorem dedekindRamification_inertiaGroup_inertiaGroup_eq_top + (P : Ideal B) (G : Type*) [Group G] [MulSemiringAction G B] : + inertiaGroup P (inertiaGroup P G) = ⊤ := by + apply le_antisymm le_top + intro σ _hσ + rw [mem_inertiaGroup_iff] + intro x + exact σ.property x + +/-- The prime-decomposition tower identity: +the decomposition group has cardinality `e(P/p) * f(P/p)` for the chosen +prime `P` over `p`, not just for the Galois-invariant representatives +`ramificationIdxIn` and `inertiaDegIn`. -/ +theorem dedekindTower_decomposition_card_eq_ramificationIdx_mul_inertiaDeg + [IsDedekindDomain A] [IsDedekindDomain B] [Module.Finite A B] + [IsTorsionFree A B] + (p : Ideal A) [p.IsMaximal] (hp : p ≠ ⊥) + (P : Ideal B) [P.IsPrime] [P.LiesOver p] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] + [IsGaloisGroup G A B] : + Nat.card (decompositionGroup P G) = + P.ramificationIdx A * P.inertiaDeg A := by + rw [dedekindRamification_decomposition_card_eq_ramificationIdxIn_mul_inertiaDegIn + (A := A) (B := B) p hp P G] + rw [Ideal.ramificationIdxIn_eq_ramificationIdx p P G, + Ideal.inertiaDegIn_eq_inertiaDeg p P G] + +/-- The prime-decomposition tower identity: +if a prime is nonsplit in a finite Galois Dedekind extension, then the product +`e * f` equals the order of the Galois group. -/ +theorem dedekindTower_ramificationIdxIn_mul_inertiaDegIn_eq_card_of_nonsplit + [IsDedekindDomain A] [IsDedekindDomain B] [Module.Finite A B] + [IsTorsionFree A B] + (p : Ideal A) [p.IsMaximal] (hp : p ≠ ⊥) + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] + [IsGaloisGroup G A B] + (hnonsplit : (p.primesOver B).ncard = 1) : + Ideal.ramificationIdxIn p B * Ideal.inertiaDegIn p B = Nat.card G := by + have hfund := + dedekindRamification_galois_fundamental_identity + (A := A) p hp B G + rwa [hnonsplit, one_mul] at hfund + +/-- The prime-decomposition tower identity: +chosen-prime form of `e * f = #G` under nonsplitting. -/ +theorem dedekindTower_ramificationIdx_mul_inertiaDeg_eq_card_of_nonsplit + [IsDedekindDomain A] [IsDedekindDomain B] [Module.Finite A B] + [IsTorsionFree A B] + (p : Ideal A) [p.IsMaximal] (hp : p ≠ ⊥) + (P : Ideal B) [P.IsPrime] [P.LiesOver p] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] + [IsGaloisGroup G A B] + (hnonsplit : (p.primesOver B).ncard = 1) : + P.ramificationIdx A * P.inertiaDeg A = + Nat.card G := by + rw [← Ideal.ramificationIdxIn_eq_ramificationIdx p P G, + ← Ideal.inertiaDegIn_eq_inertiaDeg p P G] + exact + dedekindTower_ramificationIdxIn_mul_inertiaDegIn_eq_card_of_nonsplit + (A := A) (B := B) p hp G hnonsplit + +/-- The separable-residue cardinality relation: +when the residue extension is separable, the inertia group has cardinality +equal to the ramification index of the chosen prime. -/ +theorem inertia_card_eq_ramificationIdx + [IsDedekindDomain A] [IsDedekindDomain B] [Module.Finite A B] + [IsTorsionFree A B] + (p : Ideal A) (P : Ideal B) [P.LiesOver p] [P.IsPrime] [P.IsMaximal] + [Algebra.IsSeparable (A ⧸ p) (B ⧸ P)] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] + [IsGaloisGroup G A B] (hp : p ≠ ⊥) : + Nat.card (inertiaGroup P G) = + P.ramificationIdx A := by + rw [dedekindRamification_inertia_card_eq_ramificationIdxIn + (A := A) (B := B) p P G hp] + exact Ideal.ramificationIdxIn_eq_ramificationIdx p P G + +/-- The separable-residue cardinality relation: +the separable-residue cardinality conclusions +`#I_P = e(P/p)` and `#(G_P/I_P) = f(P/p)`. -/ +theorem dedekindRamification_separable_residue_cardinalities + [IsDedekindDomain A] [IsDedekindDomain B] [Module.Finite A B] + [IsTorsionFree A B] + (p : Ideal A) [p.IsMaximal] (P : Ideal B) + [P.IsPrime] [P.LiesOver p] [P.IsMaximal] + [Algebra.IsSeparable (A ⧸ p) (B ⧸ P)] + (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] + [IsGaloisGroup G A B] (hp : p ≠ ⊥) : + Nat.card (inertiaGroup P G) = + P.ramificationIdx A ∧ + Nat.card + (decompositionGroup P G ⧸ + (inertiaGroup P G).subgroupOf (decompositionGroup P G)) = + P.inertiaDeg A := by + exact + ⟨inertia_card_eq_ramificationIdx + (A := A) (B := B) p P G hp, + dedekindRamification_decompositionQuotientInertia_card_eq_inertiaDeg + (A := A) (B := B) p P G⟩ + +end Dedekind +end HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/PrimeContractions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/PrimeContractions.lean new file mode 100644 index 0000000000..46c8b9d278 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/PrimeContractions.lean @@ -0,0 +1,195 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFieldTower +/-! +# Hilbert ramification theory: number-field prime contractions + +This file specializes the fixed fields `Z_P` and `T_P` to rings of integers +of number fields and defines the contracted primes `p`, `P_Z`, and `P_T`. +-/ + +@[expose] public section + +noncomputable +section + +namespace HilbertRamification +namespace Dedekind + +open Algebra NumberField +open scoped Pointwise + +attribute [local instance] Ideal.Quotient.field + +variable {K L : Type*} +variable [Field K] [Field L] [NumberField K] [NumberField L] [Algebra K L] +variable (G : Type*) [Group G] [MulSemiringAction G L] [SMulCommClass G K L] + +/-- Number-field ring-of-integers extensions are finite as modules. Mathlib +keeps the corresponding `Algebra.IsIntegral.finite` conversion out of instance +search, so the HRT number-field layer records the source explicitly. -/ +theorem ringOfIntegers_moduleFinite : + Module.Finite (𝓞 K) (𝓞 L) := by + exact + ⟨(isNoetherian_def.mp + (inferInstance : IsNoetherian (𝓞 K) (𝓞 L)) ⊤)⟩ + +/-- The contraction of a maximal finite prime of a number-field ring of +integers to a subfield ring of integers is nonzero. -/ +theorem ringOfIntegers_under_ne_bot + {E F : Type*} [Field E] [Field F] [NumberField E] + [Algebra E F] (P : Ideal (𝓞 F)) [P.IsMaximal] : + P.under (𝓞 E) ≠ ⊥ := by + exact + Ring.ne_bot_of_isMaximal_of_not_isField + (M := P.under (𝓞 E)) inferInstance + (RingOfIntegers.not_isField E) + +/-- prime-decomposition theory: +`p = P ∩ O_K`, the prime ideal of the base number field below `P`. -/ +abbrev basePrime + (P : Ideal (𝓞 L)) : + Ideal (𝓞 K) := + P.under (𝓞 K) + +/-- The contracted base prime is prime. -/ +instance basePrime_isPrime + (P : Ideal (𝓞 L)) [P.IsPrime] : + (basePrime (K := K) P).IsPrime := + inferInstance + +/-- The top prime lies over its contraction to the base ring of integers. -/ +instance basePrime_liesOver + (P : Ideal (𝓞 L)) : + P.LiesOver (basePrime (K := K) P) where + over := rfl + +omit [NumberField L] in +/-- Prime-decomposition statement: +for a finite prime `P` of `O_L`, its contraction to `O_K` is nonzero. -/ +theorem basePrime_ne_bot + (P : Ideal (𝓞 L)) [P.IsMaximal] : + basePrime (K := K) P ≠ ⊥ := by + exact ringOfIntegers_under_ne_bot (E := K) (F := L) P + +/-- The prime-decomposition tower identity: +`P_Z = P ∩ O_{Z_P}` for the decomposition field. -/ +abbrev decompositionFieldPrime + (P : Ideal (𝓞 L)) : + Ideal (𝓞 (decompositionField (K := K) (L := L) G P)) := + P.under (𝓞 (decompositionField (K := K) (L := L) G P)) + +/-- The contracted decomposition-field prime is prime. -/ +instance decompositionFieldPrime_isPrime + (P : Ideal (𝓞 L)) [P.IsPrime] : + (decompositionFieldPrime (K := K) (L := L) G P).IsPrime := + inferInstance + +/-- The top prime lies over its contraction to the decomposition field. -/ +instance decompositionFieldPrime_liesOver + (P : Ideal (𝓞 L)) : + P.LiesOver (decompositionFieldPrime (K := K) (L := L) G P) where + over := rfl + +/-- The decomposition-field contraction lies over the base contraction. -/ +instance decompositionFieldPrime_liesOver_basePrime + (P : Ideal (𝓞 L)) : + (decompositionFieldPrime (K := K) (L := L) G P).LiesOver + (basePrime (K := K) P) := + Ideal.LiesOver.tower_bot P + (decompositionFieldPrime (K := K) (L := L) G P) + (basePrime (K := K) P) + +/-- The prime-decomposition tower identity: +the contracted decomposition-field prime `P_Z` is nonzero for a finite prime +`P` of `O_L`. -/ +theorem decompositionFieldPrime_ne_bot + (P : Ideal (𝓞 L)) [P.IsMaximal] : + decompositionFieldPrime (K := K) (L := L) G P ≠ ⊥ := by + exact + ringOfIntegers_under_ne_bot + (E := decompositionField (K := K) (L := L) G P) (F := L) P + +/-- A prime-decomposition consequence: +`P_T = P ∩ O_{T_P}` for the inertia field. -/ +abbrev inertiaFieldPrime + (P : Ideal (𝓞 L)) : + Ideal (𝓞 (inertiaField (K := K) (L := L) G P)) := + P.under (𝓞 (inertiaField (K := K) (L := L) G P)) + +/-- The contracted inertia-field prime is prime. -/ +instance inertiaFieldPrime_isPrime + (P : Ideal (𝓞 L)) [P.IsPrime] : + (inertiaFieldPrime (K := K) (L := L) G P).IsPrime := + inferInstance + +/-- The top prime lies over its contraction to the inertia field. -/ +instance inertiaFieldPrime_liesOver + (P : Ideal (𝓞 L)) : + P.LiesOver (inertiaFieldPrime (K := K) (L := L) G P) where + over := rfl + +/-- The inertia field has the same underlying field whether viewed over `K` +or over the decomposition field; this instance keeps ring-of-integers +extensions in the tower explicit. -/ +instance inertiaFieldAlgebraDecompositionField + (P : Ideal (𝓞 L)) : + Algebra (decompositionField (K := K) (L := L) G P) + (inertiaField (K := K) (L := L) G P) := by + change + Algebra (decompositionField (K := K) (L := L) G P) + (inertiaFieldOverDecompositionField (K := K) (L := L) G P) + infer_instance + +/-- The ring-of-integers tower from the decomposition field through the inertia +field to `L` is scalar-compatible. -/ +instance ringOfIntegers_isScalarTower_decomposition_inertia + (P : Ideal (𝓞 L)) : + IsScalarTower + (𝓞 (decompositionField (K := K) (L := L) G P)) + (𝓞 (inertiaField (K := K) (L := L) G P)) + (𝓞 L) := by + change + IsScalarTower + (𝓞 (decompositionField (K := K) (L := L) G P)) + (𝓞 (inertiaFieldOverDecompositionField (K := K) (L := L) G P)) + (𝓞 L) + infer_instance + +/-- The inertia-field contraction lies over the decomposition-field +contraction. -/ +instance inertiaFieldPrime_liesOver_decompositionFieldPrime + (P : Ideal (𝓞 L)) : + (inertiaFieldPrime (K := K) (L := L) G P).LiesOver + (decompositionFieldPrime (K := K) (L := L) G P) := + Ideal.LiesOver.tower_bot P + (inertiaFieldPrime (K := K) (L := L) G P) + (decompositionFieldPrime (K := K) (L := L) G P) + +/-- The inertia-field contraction lies over the base contraction. -/ +instance inertiaFieldPrime_liesOver_basePrime + (P : Ideal (𝓞 L)) : + (inertiaFieldPrime (K := K) (L := L) G P).LiesOver + (basePrime (K := K) P) := + Ideal.LiesOver.tower_bot P + (inertiaFieldPrime (K := K) (L := L) G P) + (basePrime (K := K) P) + +/-- A prime-decomposition consequence: +the contracted inertia-field prime `P_T` is nonzero for a finite prime `P` of +`O_L`. -/ +theorem inertiaFieldPrime_ne_bot + (P : Ideal (𝓞 L)) [P.IsMaximal] : + inertiaFieldPrime (K := K) (L := L) G P ≠ ⊥ := by + exact + ringOfIntegers_under_ne_bot + (E := inertiaField (K := K) (L := L) G P) (F := L) P + +end Dedekind +end HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/TowerInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/TowerInvariants.lean new file mode 100644 index 0000000000..7b814ed161 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/TowerInvariants.lean @@ -0,0 +1,173 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic +/-! +# Hilbert ramification theory: ramification and inertia in towers + +This file records the tower identities for ramification indices and inertia +degrees used in the prime-decomposition tower identity. +-/ + +@[expose] public section + +noncomputable +section + +namespace HilbertRamification +namespace Dedekind + +variable {A B C : Type*} +variable [CommRing A] [CommRing B] [CommRing C] +variable [Algebra A B] [Algebra B C] [Algebra A C] +variable [IsScalarTower A B C] + +/-- The prime-decomposition tower identity: +ramification indices multiply in a tower. -/ +theorem ramificationIdx_tower + [IsDedekindDomain B] [IsDedekindDomain C] + {p : Ideal A} {P : Ideal B} {Q : Ideal C} + [P.IsPrime] [Q.IsPrime] + (hP : Ideal.map (algebraMap B C) P ≠ ⊥) + (hp : Ideal.map (algebraMap A C) p ≠ ⊥) + (hPQ : Ideal.map (algebraMap B C) P ≤ Q) : + Ideal.ramificationIdx' p Q = + Ideal.ramificationIdx' p P * + Ideal.ramificationIdx' P Q := by + exact Ideal.ramificationIdx'_algebra_tower hP hp hPQ + +/-- The prime-decomposition tower identity: +inertia degrees multiply in a tower. -/ +theorem dedekindTower_inertiaDeg_tower + (_p : Ideal A) + (P : Ideal B) + (Q : Ideal C) [Q.LiesOver P] : + Q.inertiaDeg A = + P.inertiaDeg A * Q.inertiaDeg B := by + exact Ideal.inertiaDeg_tower (R := A) P Q + +/-- The prime-decomposition tower arithmetic identity: +if the top layer of a tower already accounts for the full product `e * f`, +while ramification indices and inertia degrees multiply in the tower, then the +lower layer is unramified with residue degree one, and the top layer has the +original invariants. -/ +theorem dedekindTower_tower_invariants_of_top_product + {e f eBase fBase eTop fTop : ℕ} + (heTop : eTop ≠ 0) (hfTop : fTop ≠ 0) + (he : e = eBase * eTop) + (hf : f = fBase * fTop) + (hprod : eTop * fTop = e * f) : + eBase = 1 ∧ fBase = 1 ∧ eTop = e ∧ fTop = f := by + have htop_pos : 0 < eTop * fTop := + Nat.mul_pos (Nat.pos_of_ne_zero heTop) (Nat.pos_of_ne_zero hfTop) + have hmain : eBase * fBase = 1 := by + apply Nat.mul_right_cancel htop_pos + calc + (eBase * fBase) * (eTop * fTop) + = (eBase * eTop) * (fBase * fTop) := by ac_rfl + _ = e * f := by rw [← he, ← hf] + _ = eTop * fTop := hprod.symm + _ = 1 * (eTop * fTop) := by simp + have heBase : eBase = 1 := + Nat.eq_one_of_mul_eq_one_right hmain + have hfBase : fBase = 1 := + Nat.eq_one_of_mul_eq_one_left hmain + refine ⟨heBase, hfBase, ?_, ?_⟩ + · rw [he, heBase, one_mul] + · rw [hf, hfBase, one_mul] + +/-- The prime-decomposition tower identity: +the ideal-theoretic tower form of the preceding arithmetic cancellation. The +hypothesis `hprod` is exactly the equality supplied in the prime-decomposition tower identity by +the nonsplitting of the top prime and the fixed-field degree computation +`[L : Z_P] = e * f`. -/ +theorem dedekindTower_ideal_tower_invariants_of_top_product + [IsDedekindDomain B] [IsDedekindDomain C] [Module.Finite B C] + {p : Ideal A} [p.IsMaximal] + {P : Ideal B} [P.IsPrime] [P.IsMaximal] [P.LiesOver p] + {Q : Ideal C} [Q.IsPrime] [Q.LiesOver P] + (hP : Ideal.map (algebraMap B C) P ≠ ⊥) + (hp : Ideal.map (algebraMap A C) p ≠ ⊥) + (hPQ : Ideal.map (algebraMap B C) P ≤ Q) + (hprod : + Ideal.ramificationIdx' P Q * Q.inertiaDeg B = + Ideal.ramificationIdx' p Q * Q.inertiaDeg A) : + Ideal.ramificationIdx' p P = 1 ∧ + P.inertiaDeg A = 1 ∧ + Ideal.ramificationIdx' P Q = + Ideal.ramificationIdx' p Q ∧ + Q.inertiaDeg B = Q.inertiaDeg A := by + have heTop : + Ideal.ramificationIdx' P Q ≠ 0 := + Ideal.IsDedekindDomain.ramificationIdx'_ne_zero + (p := P) (P := Q) hP inferInstance hPQ + exact + dedekindTower_tower_invariants_of_top_product + heTop (Q.inertiaDeg_pos B).ne' + (ramificationIdx_tower + (A := A) (B := B) (C := C) hP hp hPQ) + (dedekindTower_inertiaDeg_tower + (A := A) (B := B) (C := C) p P Q) + hprod + +/-- A prime-decomposition arithmetic consequence: +if the top layer of a tower has the full ramification index and residue degree +one, then the middle layer has ramification index one and the full residue +degree. -/ +theorem dedekindRamification_tower_middle_invariants_of_top_invariants + {e f eBase fBase eTop fTop : ℕ} + (heTop : eTop ≠ 0) + (he : e = eBase * eTop) + (hf : f = fBase * fTop) + (heTop_eq : eTop = e) + (hfTop_eq : fTop = 1) : + eBase = 1 ∧ fBase = f := by + have heBase : eBase = 1 := by + apply Eq.symm + apply Nat.mul_right_cancel (Nat.pos_of_ne_zero heTop) + calc + 1 * eTop = eTop := one_mul eTop + _ = e := heTop_eq + _ = eBase * eTop := he + have hfBase : fBase = f := by + rw [hf, hfTop_eq, mul_one] + exact ⟨heBase, hfBase⟩ + +/-- A prime-decomposition consequence: +the ideal-theoretic tower form of the preceding arithmetic cancellation. This +is the step from the already-proved `P/P_T` invariants to the `P_T/P_Z` +invariants in the diagram `Z_P -> T_P -> L`. -/ +theorem dedekindRamification_ideal_tower_middle_invariants_of_top_invariants + [IsDedekindDomain B] [IsDedekindDomain C] + {p : Ideal A} [p.IsMaximal] + {P : Ideal B} [P.IsPrime] [P.IsMaximal] [P.LiesOver p] + {Q : Ideal C} [Q.IsPrime] [Q.LiesOver P] + (hP : Ideal.map (algebraMap B C) P ≠ ⊥) + (hp : Ideal.map (algebraMap A C) p ≠ ⊥) + (hPQ : Ideal.map (algebraMap B C) P ≤ Q) + (heTop : + Ideal.ramificationIdx' P Q = + Ideal.ramificationIdx' p Q) + (hfTop : Q.inertiaDeg B = 1) : + Ideal.ramificationIdx' p P = 1 ∧ + P.inertiaDeg A = Q.inertiaDeg A := by + have heTop_ne : + Ideal.ramificationIdx' P Q ≠ 0 := + Ideal.IsDedekindDomain.ramificationIdx'_ne_zero + (p := P) (P := Q) hP inferInstance hPQ + exact + dedekindRamification_tower_middle_invariants_of_top_invariants + heTop_ne + (ramificationIdx_tower + (A := A) (B := B) (C := C) hP hp hPQ) + (dedekindTower_inertiaDeg_tower + (A := A) (B := B) (C := C) p P Q) + heTop hfTop + +end Dedekind +end HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/ValuedGalois.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/ValuedGalois.lean new file mode 100644 index 0000000000..50d2e01e81 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/ValuedGalois.lean @@ -0,0 +1,64 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core +public import Mathlib.NumberTheory.RamificationInertia.Galois +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic +/-! +# Inertia cardinality for finite valued extensions + +The ideal-theoretic inertia group has cardinality equal to the canonical +ramification index of a finite separable extension of complete discrete +valuation fields. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w x + +namespace ValuationTheory.DiscreteValuationField.ValuedExtension + +variable {K : Type u} {L : Type w} [Field K] [Field L] +variable [Algebra K L] [FiniteDimensional K L] +variable (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) +variable [base.valuation.HasExtension target.valuation] +variable (G : Type*) [Group G] [Finite G] +variable [MulSemiringAction G target.valuationSubring] +variable [IsGaloisGroup G base.valuationSubring target.valuationSubring] + +/-- In a finite separable valued extension, ideal-theoretic inertia has +cardinality equal to the canonical ramification index. -/ +theorem card_inertia_eq_ramificationIndex_of_finite_separable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + [Algebra.IsSeparable + (base.valuationSubring ⧸ base.maximalIdeal) + (target.valuationSubring ⧸ target.maximalIdeal)] : + Nat.card (target.maximalIdeal.toAddSubgroup.inertia G) = + ramificationIndex base.toDVF target.toDVF := by + let : Module.Finite base.valuationSubring target.valuationSubring := + moduleFinite_target_valuationSubring_of_finite_separable base target + let : Module.IsTorsionFree base.valuationSubring target.valuationSubring := + moduleIsTorsionFree_target_valuationSubring_of_finite_separable base target + let : target.maximalIdeal.LiesOver base.maximalIdeal := + maximalIdeal_liesOver base target + rw [HilbertRamification.Dedekind.dedekindRamification_inertia_card_eq_ramificationIdxIn + (A := base.valuationSubring) (B := target.valuationSubring) + base.maximalIdeal target.maximalIdeal G base.maximalIdeal_ne_bot] + simpa [ramificationIndex] using + (Ideal.ramificationIdxIn_eq_ramificationIdx + base.maximalIdeal target.maximalIdeal G).trans + (Ideal.ramificationIdx'_eq_ramificationIdx + base.maximalIdeal target.maximalIdeal base.maximalIdeal_ne_bot).symm + +end ValuationTheory.DiscreteValuationField.ValuedExtension + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevel.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevel.lean new file mode 100644 index 0000000000..1d66c4e7ca --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevel.lean @@ -0,0 +1,200 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Profinite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandFunction +/-! +# Chosen integral-closure ramification filtrations at finite Galois levels + +For a complete discretely valued field `K` and a finite Galois intermediate +field `E` of an algebraic closure, an existence theorem for the integral +closure of the valuation ring of `K` supplies complete-DVF structures on +`E`. This file makes one noncomputable choice of such data. Completeness +then gives uniqueness of the extended valuation, so real lower groups and +Herbrand upper groups can be formed without asking a caller to provide a +filtration. Choice independence is proved in the companion module. +-/ + +@[expose] public section + +noncomputable +section + +universe u v y + +namespace RamificationTheory.HilbertRamification.FiniteGaloisLevel + +open ValuationTheory +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +variable {K : Type u} [Field K] + +private theorem chosenIntegralClosureData_exists + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) : + ∃ target : CompleteDVF.{u, 0} E, + ∃ hExt : base.valuation.HasExtension target.valuation, + letI : base.valuation.HasExtension target.valuation := hExt + IsIntegralClosure target.valuationSubring + base.valuationSubring E ∧ + degree base.toDVF target.toDVF = + ramificationIndex base.toDVF target.toDVF * + residueDegree base.toDVF target.toDVF := + exists_integralClosure_standard_fundamental_identity + (K := K) (L := E) base + +/-- A complete-DVF structure on a finite Galois level, chosen from the +integral-closure existence theorem. -/ +noncomputable def chosenIntegralClosureTarget + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) : + CompleteDVF.{u, 0} E := + Classical.choose (show ∃ target : CompleteDVF.{u, 0} E, + ∃ hExt : base.valuation.HasExtension target.valuation, + letI : base.valuation.HasExtension target.valuation := hExt + IsIntegralClosure target.valuationSubring + base.valuationSubring E ∧ + degree base.toDVF target.toDVF = + ramificationIndex base.toDVF target.toDVF * + residueDegree base.toDVF target.toDVF from by + exact chosenIntegralClosureData_exists base E) + +/-- The valuation on `chosenIntegralClosureTarget` extends the valuation on the base +complete DVF. -/ +theorem chosenIntegralClosureTargetHasExtension + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) : + base.valuation.HasExtension (chosenIntegralClosureTarget base E).valuation := + Classical.choose (Classical.choose_spec (chosenIntegralClosureData_exists base E)) + +/-- Provides the instance `instChosenIntegralClosureTargetHasExtension`. -/ +noncomputable instance instChosenIntegralClosureTargetHasExtension + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) : + base.valuation.HasExtension (chosenIntegralClosureTarget base E).valuation := + chosenIntegralClosureTargetHasExtension base E + +/-- The valuation ring of the chosen finite-level target is the integral +closure of the base valuation ring. -/ +theorem chosenIntegralClosureTarget_isIntegralClosure + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) : + IsIntegralClosure (chosenIntegralClosureTarget base E).valuationSubring + base.valuationSubring E := + (Classical.choose_spec + (Classical.choose_spec (chosenIntegralClosureData_exists base E))).1 + +/-- The chosen target satisfies the fundamental equality; no auxiliary +extension marker is selected. -/ +theorem chosenIntegralClosureTarget_isDefectless + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) : + IsDefectless base.toDVF (chosenIntegralClosureTarget base E).toDVF := + (Classical.choose_spec + (Classical.choose_spec (chosenIntegralClosureData_exists base E))).2 + +/-- Uniqueness of the extended valuation at a finite Galois level, in the +complete-DVF formulation. -/ +theorem chosenIntegralClosureTarget_hasUniqueValuationExtension + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) : + ValuedExtension.HasUniqueValuationExtension.{u, v, u, 0, y} + (base := base) (target := chosenIntegralClosureTarget base E) := + hasUniqueValuationExtension_of_finite_separable + base (chosenIntegralClosureTarget base E) + +/-- Uniqueness after forgetting completeness, in the precise universe needed +by the real lower ramification groups. -/ +theorem chosenIntegralClosureTarget_hasUniqueDVFValuationExtension + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, u, 0, y} + base.toDVF (chosenIntegralClosureTarget base E).toDVF := + chosenIntegralClosureTarget_hasUniqueValuationExtension base E + +/-- The finite-level lower ramification filtration attached to the chosen +integral-closure valuation. -/ +noncomputable def chosenLowerRamificationFiltration + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) : + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration + Gal(E/K) := + Higher.lowerRamificationFiltrationOfUniqueExtension + (base := base.toDVF) (target := (chosenIntegralClosureTarget base E).toDVF) + (chosenIntegralClosureTarget_hasUniqueDVFValuationExtension base E) + +/-- The finite-level real upper ramification filtration attached to the chosen +integral-closure valuation. -/ +noncomputable def chosenUpperRamificationFiltration + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) : + ℝ → Subgroup Gal(E/K) := fun t => + Higher.upperRamificationGroupOfUniqueExtension + (base := base.toDVF) (target := (chosenIntegralClosureTarget base E).toDVF) + (chosenIntegralClosureTarget_hasUniqueDVFValuationExtension base E) t + +/-- The chosen upper ramification group at a real index. -/ +noncomputable abbrev chosenUpperRamificationGroup + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) + (t : ℝ) : Subgroup Gal(E/K) := + chosenUpperRamificationFiltration base E t + +/-- States the theorem `chosenUpperRamificationFiltration_apply`. -/ +@[simp] +theorem chosenUpperRamificationFiltration_apply + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) + (t : ℝ) : + chosenUpperRamificationFiltration base E t = + Higher.upperRamificationGroupOfUniqueExtension + (base := base.toDVF) (target := (chosenIntegralClosureTarget base E).toDVF) + (chosenIntegralClosureTarget_hasUniqueDVFValuationExtension base E) t := + rfl + +/-- States the theorem `chosenLowerRamificationGroup_normal`. -/ +theorem chosenLowerRamificationGroup_normal + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) + (n : ℕ) : + ((chosenLowerRamificationFiltration base E).lower n).Normal := + (chosenLowerRamificationFiltration base E).lower_normal n + +/-- Every chosen finite-level integral lower ramification group is closed. -/ +theorem chosenLowerRamificationGroup_isClosed + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) + (n : ℕ) : + IsClosed + ((chosenLowerRamificationFiltration base E).lower n : Set Gal(E/K)) := + ((chosenLowerRamificationFiltration base E).lower n : Set Gal(E/K)).toFinite.isClosed + +/-- States the theorem `chosenUpperRamificationGroup_normal`. -/ +theorem chosenUpperRamificationGroup_normal + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) + (t : ℝ) : + (chosenUpperRamificationGroup base E t).Normal := by + exact Higher.lowerRamificationGroup_normal + (base := base.toDVF) (target := (chosenIntegralClosureTarget base E).toDVF) + (chosenIntegralClosureTarget_hasUniqueDVFValuationExtension base E) + (Higher.inverseHerbrandFunctionOfUniqueExtension + (base := base.toDVF) (target := (chosenIntegralClosureTarget base E).toDVF) + (chosenIntegralClosureTarget_hasUniqueDVFValuationExtension base E) t) + +/-- Every chosen finite-level upper ramification group is closed. -/ +theorem chosenUpperRamificationGroup_isClosed + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) + (t : ℝ) : + IsClosed (chosenUpperRamificationGroup base E t : Set Gal(E/K)) := + (chosenUpperRamificationGroup base E t : Set Gal(E/K)).toFinite.isClosed + +end RamificationTheory.HilbertRamification.FiniteGaloisLevel diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevelIndependence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevelIndependence.lean new file mode 100644 index 0000000000..a9d82f8085 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevelIndependence.lean @@ -0,0 +1,393 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteGaloisLevel +/-! +# Choice independence at finite Galois levels + +The ramification filtration of a finite extension depends only on its +valuation ring. For a finite Galois level over a complete discretely valued +field, uniqueness of the extended valuation therefore identifies the +filtration formed from the chosen integral-closure target with the filtration +formed from any other complete-DVF target extending the base valuation. +-/ + +@[expose] public section + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + inverseHerbrandFunction → + inverseHerbrandFunction + + +noncomputable +section + +universe u v w x y z + +namespace RamificationTheory.HilbertRamification.Higher + +open ValuationTheory +open ValuationTheory.DiscreteValuationField + + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] +variable {base : DVF.{u, v} K} +variable {target : DVF.{w, x} L} {target' : DVF.{w, y} L} +variable [base.valuation.HasExtension target.valuation] +variable [base.valuation.HasExtension target'.valuation] + +private theorem lowerRamificationFiltration_ext + {G : Type z} [Group G] + {F F' : + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration G} + (h : F.lower = F'.lower) : + F = F' := by + cases F + cases F' + cases h + rfl + +/-- Real lower ramification groups are unchanged when the two target +valuations have the same valuation ring. -/ +theorem lowerRamificationGroup_eq_of_valuationSubring_eq + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} base target) + (huniq' : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, + w, y, y} base target') + (hvaluationSubring : + target.valuation.valuationSubring = target'.valuation.valuationSubring) + (s : ℝ) : + lowerRamificationGroup + (base := base) (target := target) huniq s = + lowerRamificationGroup + (base := base) (target := target') huniq' s := by + let e : target.valuationSubring ≃+* target'.valuationSubring := + { toFun := fun a => ⟨(a : L), by + rw [← hvaluationSubring] + exact a.property⟩ + invFun := fun a => ⟨(a : L), by + rw [hvaluationSubring] + exact a.property⟩ + left_inv := by + intro a + apply Subtype.ext + rfl + right_inv := by + intro a + apply Subtype.ext + rfl + map_mul' := by + intro a b + apply Subtype.ext + rfl + map_add' := by + intro a b + apply Subtype.ext + rfl } + let : IsLocalHom + (e : target.valuationSubring →+* target'.valuationSubring) := + e.surjective.isLocalHom + have hcomap : + Ideal.comap + (e : target.valuationSubring →+* target'.valuationSubring) + target'.maximalIdeal = + target.maximalIdeal := by + ext a + change e a ∈ target'.maximalIdeal ↔ a ∈ target.maximalIdeal + rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff, + IsLocalRing.mem_maximalIdeal, mem_nonunits_iff, isUnit_map_iff] + have hmap : + Ideal.map + (e : target.valuationSubring →+* target'.valuationSubring) + target.maximalIdeal = + target'.maximalIdeal := by + rw [← hcomap] + exact target'.maximalIdeal.map_comap_of_surjective + (e : target.valuationSubring →+* target'.valuationSubring) + e.surjective + have hmap_real : + Ideal.map + (e : target.valuationSubring →+* target'.valuationSubring) + (realRamificationIdeal target s) = + realRamificationIdeal target' s := by + simp only [realRamificationIdeal, Ideal.map_pow, hmap] + have he_aut (σ : Gal(L/K)) (a : target.valuationSubring) : + e (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a) = + valuationSubringAutOfUniqueExtension + (base := base) (target := target') huniq' σ (e a) := by + ext + rfl + ext σ + rw [mem_lowerRamificationGroup_iff, mem_lowerRamificationGroup_iff] + constructor + · intro hσ a' + obtain ⟨a, rfl⟩ := e.surjective a' + have ha := hσ a + have hemap : + e (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a - a) ∈ + Ideal.map + (e : target.valuationSubring →+* target'.valuationSubring) + (realRamificationIdeal target s) := + Ideal.mem_map_of_mem _ ha + rw [hmap_real] at hemap + simpa only [map_sub, he_aut] using hemap + · intro hσ a + have ha' := hσ (e a) + have hemap : + e (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a - a) ∈ + realRamificationIdeal target' s := by + simpa only [map_sub, he_aut] using ha' + rw [← hmap_real] at hemap + rcases (Ideal.mem_map_iff_of_surjective + (e : target.valuationSubring →+* target'.valuationSubring) + e.surjective).1 hemap with ⟨b, hb, hbe⟩ + have hba : + b = valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a - a := + e.injective hbe + simpa only [hba] using hb + +/-- Integral lower ramification filtrations are unchanged when the two target +valuations have the same valuation ring. -/ +theorem lowerRamificationFiltration_eq_of_valuationSubring_eq + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} base target) + (huniq' : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, + w, y, y} base target') + (hvaluationSubring : + target.valuation.valuationSubring = target'.valuation.valuationSubring) : + lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq = + lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target') huniq' := by + apply lowerRamificationFiltration_ext + funext n + exact lowerRamificationGroup_eq_of_valuationSubring_eq + huniq huniq' hvaluationSubring (n : ℝ) + + +/-- Herbrand functions are unchanged when the two target valuations have the +same valuation ring. -/ +theorem herbrandFunction_eq_of_valuationSubring_eq + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} base target) + (huniq' : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, + w, y, y} base target') + (hvaluationSubring : + target.valuation.valuationSubring = target'.valuation.valuationSubring) : + herbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq = + herbrandFunctionOfUniqueExtension + (base := base) (target := target') huniq' := by + have hF := + lowerRamificationFiltration_eq_of_valuationSubring_eq + huniq huniq' hvaluationSubring + exact congrArg + (fun F => + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction F) + hF + +/-- Inverse Herbrand functions are unchanged when the two target valuations +have the same valuation ring. -/ +theorem inverseHerbrandFunction_eq_of_valuationSubring_eq + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} base target) + (huniq' : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, + w, y, y} base target') + (hvaluationSubring : + target.valuation.valuationSubring = target'.valuation.valuationSubring) : + inverseHerbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq = + inverseHerbrandFunctionOfUniqueExtension + (base := base) (target := target') huniq' := by + have hF := + lowerRamificationFiltration_eq_of_valuationSubring_eq + huniq huniq' hvaluationSubring + exact congrArg + (fun F => + inverseHerbrandFunction F) + hF + +/-- Upper ramification groups are unchanged when the two target valuations +have the same valuation ring. -/ +theorem upperRamificationGroup_eq_of_valuationSubring_eq + [FiniteDimensional K L] + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} base target) + (huniq' : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, + w, y, y} base target') + (hvaluationSubring : + target.valuation.valuationSubring = target'.valuation.valuationSubring) + (t : ℝ) : + upperRamificationGroupOfUniqueExtension + (base := base) (target := target) huniq t = + upperRamificationGroupOfUniqueExtension + (base := base) (target := target') huniq' t := by + change lowerRamificationGroup (base := base) (target := target) huniq + (inverseHerbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq t) = + lowerRamificationGroup (base := base) (target := target') huniq' + (inverseHerbrandFunctionOfUniqueExtension + (base := base) (target := target') huniq' t) + rw [inverseHerbrandFunction_eq_of_valuationSubring_eq + huniq huniq' hvaluationSubring] + exact lowerRamificationGroup_eq_of_valuationSubring_eq + huniq huniq' hvaluationSubring _ + +end RamificationTheory.HilbertRamification.Higher + +namespace RamificationTheory.HilbertRamification.FiniteGaloisLevel + +open ValuationTheory +open ValuationTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- The valuation on the chosen integral-closure target is equivalent to the +valuation on every other complete-DVF target extending the base valuation. -/ +theorem chosenIntegralClosureTarget_valuation_isEquiv + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) + (target : CompleteDVF.{u, x} E) + [base.valuation.HasExtension target.valuation] : + (chosenIntegralClosureTarget base E).valuation.IsEquiv target.valuation := + chosenIntegralClosureTarget_hasUniqueValuationExtension base E target.valuation + +/-- The chosen integral-closure valuation ring equals the valuation ring of +every other complete-DVF target extending the base valuation. -/ +theorem chosenIntegralClosureTarget_valuationSubring_eq + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) + (target : CompleteDVF.{u, x} E) + [base.valuation.HasExtension target.valuation] : + (chosenIntegralClosureTarget base E).valuation.valuationSubring = + target.valuation.valuationSubring := + (_root_.Valuation.isEquiv_iff_valuationSubring + (chosenIntegralClosureTarget base E).valuation target.valuation).1 + (chosenIntegralClosureTarget_valuation_isEquiv base E target) + +/-- Every complete-DVF target at the same finite Galois level inherits unique +valuation extension from the chosen target. -/ +theorem hasUniqueValuationExtension_of_finiteGaloisLevel + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) + (target : CompleteDVF.{u, x} E) + [base.valuation.HasExtension target.valuation] : + ValuedExtension.HasUniqueValuationExtension.{u, v, u, x, y} + (base := base) (target := target) := by + intro Gamma' _ valuation' _ + exact + (chosenIntegralClosureTarget_valuation_isEquiv base E target).symm.trans + (chosenIntegralClosureTarget_hasUniqueValuationExtension base E valuation') + +/-- The preceding uniqueness statement after forgetting completeness. -/ +theorem hasUniqueDVFValuationExtension_of_finiteGaloisLevel + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) + (target : CompleteDVF.{u, x} E) + [base.valuation.HasExtension target.valuation] : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, u, x, y} + base.toDVF target.toDVF := + hasUniqueValuationExtension_of_finiteGaloisLevel base E target + +/-- The chosen real lower ramification groups agree with those formed from +any other complete-DVF target at the same finite Galois level. -/ +theorem chosenLowerRamificationGroup_eq + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) + (target : CompleteDVF.{u, x} E) + [base.valuation.HasExtension target.valuation] + (s : ℝ) : + Higher.lowerRamificationGroup + (base := base.toDVF) + (target := (chosenIntegralClosureTarget base E).toDVF) + (chosenIntegralClosureTarget_hasUniqueDVFValuationExtension base E) s = + Higher.lowerRamificationGroup + (base := base.toDVF) (target := target.toDVF) + (hasUniqueDVFValuationExtension_of_finiteGaloisLevel base E target) s := + Higher.lowerRamificationGroup_eq_of_valuationSubring_eq + (chosenIntegralClosureTarget_hasUniqueDVFValuationExtension base E) + (hasUniqueDVFValuationExtension_of_finiteGaloisLevel base E target) + (chosenIntegralClosureTarget_valuationSubring_eq base E target) s + +/-- The chosen integral lower filtration agrees with that formed from any +other complete-DVF target at the same finite Galois level. -/ +theorem chosenLowerRamificationFiltration_eq + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) + (target : CompleteDVF.{u, x} E) + [base.valuation.HasExtension target.valuation] : + chosenLowerRamificationFiltration base E = + Higher.lowerRamificationFiltrationOfUniqueExtension + (base := base.toDVF) (target := target.toDVF) + (hasUniqueDVFValuationExtension_of_finiteGaloisLevel base E target) := + Higher.lowerRamificationFiltration_eq_of_valuationSubring_eq + (chosenIntegralClosureTarget_hasUniqueDVFValuationExtension base E) + (hasUniqueDVFValuationExtension_of_finiteGaloisLevel base E target) + (chosenIntegralClosureTarget_valuationSubring_eq base E target) + +/-- The chosen Herbrand function agrees with that formed from any other +complete-DVF target at the same finite Galois level. -/ +theorem chosenHerbrandFunction_eq + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) + (target : CompleteDVF.{u, x} E) + [base.valuation.HasExtension target.valuation] : + Higher.herbrandFunctionOfUniqueExtension + (base := base.toDVF) + (target := (chosenIntegralClosureTarget base E).toDVF) + (chosenIntegralClosureTarget_hasUniqueDVFValuationExtension base E) = + Higher.herbrandFunctionOfUniqueExtension + (base := base.toDVF) (target := target.toDVF) + (hasUniqueDVFValuationExtension_of_finiteGaloisLevel base E target) := + Higher.herbrandFunction_eq_of_valuationSubring_eq + (chosenIntegralClosureTarget_hasUniqueDVFValuationExtension base E) + (hasUniqueDVFValuationExtension_of_finiteGaloisLevel base E target) + (chosenIntegralClosureTarget_valuationSubring_eq base E target) + +/-- The chosen inverse Herbrand function agrees with that formed from any +other complete-DVF target at the same finite Galois level. -/ +theorem chosenInverseHerbrandFunction_eq + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) + (target : CompleteDVF.{u, x} E) + [base.valuation.HasExtension target.valuation] : + Higher.inverseHerbrandFunctionOfUniqueExtension + (base := base.toDVF) + (target := (chosenIntegralClosureTarget base E).toDVF) + (chosenIntegralClosureTarget_hasUniqueDVFValuationExtension base E) = + Higher.inverseHerbrandFunctionOfUniqueExtension + (base := base.toDVF) (target := target.toDVF) + (hasUniqueDVFValuationExtension_of_finiteGaloisLevel base E target) := + Higher.inverseHerbrandFunction_eq_of_valuationSubring_eq + (chosenIntegralClosureTarget_hasUniqueDVFValuationExtension base E) + (hasUniqueDVFValuationExtension_of_finiteGaloisLevel base E target) + (chosenIntegralClosureTarget_valuationSubring_eq base E target) + +/-- The chosen upper ramification groups agree with those formed from any +other complete-DVF target at the same finite Galois level. -/ +theorem chosenUpperRamificationGroup_eq + (base : CompleteDVF.{u, v} K) + (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) + (target : CompleteDVF.{u, x} E) + [base.valuation.HasExtension target.valuation] + (t : ℝ) : + chosenUpperRamificationGroup base E t = + Higher.upperRamificationGroupOfUniqueExtension + (base := base.toDVF) (target := target.toDVF) + (hasUniqueDVFValuationExtension_of_finiteGaloisLevel base E target) t := + Higher.upperRamificationGroup_eq_of_valuationSubring_eq + (chosenIntegralClosureTarget_hasUniqueDVFValuationExtension base E) + (hasUniqueDVFValuationExtension_of_finiteGaloisLevel base E target) + (chosenIntegralClosureTarget_valuationSubring_eq base E target) t + + +end RamificationTheory.HilbertRamification.FiniteGaloisLevel diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteInertiaStructure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteInertiaStructure.lean new file mode 100644 index 0000000000..9bdd27d8b3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteInertiaStructure.lean @@ -0,0 +1,120 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteRamificationPrimary +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteOrderValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CharacterMap +public import Mathlib.Algebra.CharP.Reduced +public import Mathlib.GroupTheory.Sylow +/-! +# Structure of finite inertia + +The actual residue-unit character has ramification kernel. Finite inertia fixes +values, so this character is defined on all inertia. In residue characteristic +zero its kernel is trivial and inertia is commutative. In residue characteristic +p every p-subgroup lies in the ramification kernel, which is itself a p-group. +-/ + +@[expose] public section + +namespace RamificationTheory.HilbertRamification.ValuationSubring + +universe u v + +variable (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + +/-- Finite inertia is commutative in residue characteristic zero. -/ +theorem inertiaGroup_isMulCommutative_of_residueCharZero + (A : _root_.ValuationSubring L) [Finite (inertiaGroup K A)] + [CharZero (IsLocalRing.ResidueField A)] : + IsMulCommutative (inertiaGroup K A) := by + have htop := valueTrivialInertiaGroup_eq_top_of_finite K A + have hinj : Function.Injective (valueTrivialInertiaCharacterHom K A) := by + apply (injective_iff_map_eq_one (valueTrivialInertiaCharacterHom K A)).mpr + intro σ hσ + apply Subtype.ext + have hmem : (σ : inertiaGroup K A) ∈ ramificationGroup K A := + (valueTrivialInertiaCharacterHom_mem_ker_iff K A σ).mp hσ + rw [ramificationGroup_eq_bot_of_residueCharZero K A] at hmem + exact hmem + apply IsMulCommutative.of_comm + intro σ τ + let s : valueTrivialInertiaGroup K A := ⟨σ, htop.symm ▸ Subgroup.mem_top σ⟩ + let t : valueTrivialInertiaGroup K A := ⟨τ, htop.symm ▸ Subgroup.mem_top τ⟩ + have hst : s * t = t * s := hinj (by + apply MonoidHom.ext + intro x + simp only [map_mul, MonoidHom.mul_apply] + exact mul_comm _ _) + exact congrArg (fun a : valueTrivialInertiaGroup K A => (a : inertiaGroup K A)) hst + +/-- Every p-subgroup of inertia lies in the actual ramification group. -/ +theorem pSubgroup_le_ramificationGroup_of_residueChar + (A : _root_.ValuationSubring L) (p : ℕ) [Fact p.Prime] + [CharP (IsLocalRing.ResidueField A) p] + (P : Subgroup (inertiaGroup K A)) (hP : IsPGroup p P) : + P ≤ ramificationGroup K A := by + intro σ hσ + obtain ⟨a, ha⟩ := hP ⟨σ, hσ⟩ + have hpow : σ ^ (p ^ a) = 1 := + congrArg (fun x : P => (x : inertiaGroup K A)) ha + have hfinite : IsOfFinOrder σ := + isOfFinOrder_iff_pow_eq_one.mpr + ⟨p ^ a, pow_pos (Fact.out : p.Prime).pos a, hpow⟩ + let s : valueTrivialInertiaGroup K A := + ⟨σ, mem_valueTrivialInertiaGroup_of_isOfFinOrder K A σ hfinite⟩ + have hs : s ^ (p ^ a) = 1 := Subtype.ext hpow + apply (valueTrivialInertiaCharacterHom_mem_ker_iff K A s).mp + change valueTrivialInertiaCharacterHom K A s = 1 + apply MonoidHom.ext + intro x + apply Units.ext + have hchar : (valueTrivialInertiaCharacterHom K A s x : + IsLocalRing.ResidueField A) ^ (p ^ a) = 1 := by + have h := congrArg (fun f => (f x : IsLocalRing.ResidueField A)) + (congrArg (valueTrivialInertiaCharacterHom K A) hs) + simpa only [map_pow, map_one, MonoidHom.pow_apply, MonoidHom.one_apply, + Units.val_pow_eq_pow_val, Units.val_one] using h + have h := (ExpChar.pow_prime_pow_mul_eq_one_iff p a 1 + (valueTrivialInertiaCharacterHom K A s x : IsLocalRing.ResidueField A)).mp + (by simpa only [mul_one] using hchar) + simpa only [pow_one, MonoidHom.one_apply, Units.val_one] using h + +/-- The actual ramification group is the unique Sylow p-subgroup of finite inertia. -/ +theorem sylow_eq_ramificationGroup_of_residueChar + (A : _root_.ValuationSubring L) (p : ℕ) [Fact p.Prime] + [Finite (inertiaGroup K A)] [CharP (IsLocalRing.ResidueField A) p] + (P : Sylow p (inertiaGroup K A)) : + (P : Subgroup (inertiaGroup K A)) = ramificationGroup K A := by + exact (P.is_maximal' (ramificationGroup_isPGroup_of_residueChar K A p) + (pSubgroup_le_ramificationGroup_of_residueChar K A p P P.isPGroup')).symm + +/-- In positive residue characteristic, the actual finite ramification group +is trivial exactly when the residue characteristic does not divide the order +of inertia. -/ +theorem ramificationGroup_eq_bot_iff_residueChar_not_dvd_inertia_card + (A : _root_.ValuationSubring L) (p : ℕ) [Fact p.Prime] + [Finite (inertiaGroup K A)] + [CharP (IsLocalRing.ResidueField A) p] : + ramificationGroup K A = ⊥ ↔ + ¬ p ∣ Nat.card (inertiaGroup K A) := by + classical + let P : Sylow p (inertiaGroup K A) := + Classical.choice (inferInstance : Nonempty (Sylow p (inertiaGroup K A))) + have hP : (P : Subgroup (inertiaGroup K A)) = ramificationGroup K A := + sylow_eq_ramificationGroup_of_residueChar K A p P + rw [← hP] + constructor + · intro hbot hp + exact (Sylow.ne_bot_of_dvd_card P hp) hbot + · intro hp + apply Subgroup.eq_bot_of_card_eq + rw [P.card_eq_multiplicity, + Nat.factorization_eq_zero_of_not_dvd hp, pow_zero] + +end RamificationTheory.HilbertRamification.ValuationSubring diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteOrderValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteOrderValuation.lean new file mode 100644 index 0000000000..d26d1d37c3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteOrderValuation.lean @@ -0,0 +1,100 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.GroupTheory.OrderOfElement +public import Mathlib.Order.Iterate +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CharacterMap + +/-! # Finite Order Valuation -/ + +@[expose] public section +namespace RamificationTheory.HilbertRamification.ValuationSubring + +noncomputable +section + +universe u v + +variable (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + +/-- A finite-order element of the valuation-subring decomposition group fixes +all values. The induced map on the canonical value group is monotone, and a +positive iterate equal to the identity forces a monotone map to be the identity. -/ +theorem valuation_decomposition_apply_eq_of_isOfFinOrder + (A : _root_.ValuationSubring L) (σ : decompositionGroup K A) + (hσ : IsOfFinOrder σ) (x : L) : + A.valuation ((σ : L ≃ₐ[K] L) x) = A.valuation x := by + have hle {a b : L} (hab : A.valuation a ≤ A.valuation b) : + A.valuation ((σ : L ≃ₐ[K] L) a) ≤ + A.valuation ((σ : L ≃ₐ[K] L) b) := by + obtain ⟨c, hc⟩ := (A.valuation_le_iff a b).1 hab + apply (A.valuation_le_iff _ _).2 + refine ⟨σ • c, ?_⟩ + change (σ : L ≃ₐ[K] L) (c : L) * (σ : L ≃ₐ[K] L) b = + (σ : L ≃ₐ[K] L) a + rw [← map_mul, hc] + let f : A.ValueGroup → A.ValueGroup := fun γ => + A.valuation ((σ : L ≃ₐ[K] L) + (Function.surjInv A.valuation_surjective γ)) + have hfv (a : L) : + f (A.valuation a) = A.valuation ((σ : L ≃ₐ[K] L) a) := by + dsimp only [f] + apply le_antisymm + · apply hle + exact le_of_eq (Function.surjInv_eq A.valuation_surjective _) + · apply hle + exact le_of_eq (Function.surjInv_eq A.valuation_surjective _).symm + have hf : Monotone f := by + intro a b hab + apply hle + simpa only [Function.surjInv_eq] using hab + have hiter (n : ℕ) (a : L) : + f^[n] (A.valuation a) = A.valuation (((σ : L ≃ₐ[K] L) ^ n) a) := by + induction n with + | zero => rfl + | succ n ih => + rw [Function.iterate_succ_apply', ih, hfv, pow_succ', AlgEquiv.mul_apply] + obtain ⟨n, hn, hσn⟩ := hσ.exists_pow_eq_one + have hσn' : (σ : L ≃ₐ[K] L) ^ n = 1 := + congrArg (fun τ : decompositionGroup K A => (τ : L ≃ₐ[K] L)) hσn + have hperiod : f^[n] (A.valuation x) = A.valuation x := by + rw [hiter, hσn', AlgEquiv.one_apply] + have hcomm : Function.Commute f id := fun _ => rfl + have hfixed : f (A.valuation x) = A.valuation x := + (hcomm.iterate_pos_eq_iff_map_eq hf strictMono_id hn).1 (by + simpa only [Function.iterate_id, id_eq] using hperiod) + rwa [hfv] at hfixed + +/-- Each finite-order inertia element lies in the actual value-trivial subgroup. -/ +theorem mem_valueTrivialInertiaGroup_of_isOfFinOrder + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) + (hσ : IsOfFinOrder σ) : σ ∈ valueTrivialInertiaGroup K A := by + change ∀ x : Lˣ, + valueDisplacementClass K A (σ : decompositionGroup K A) x = 1 + intro x + rw [valueDisplacementClass_eq_one_iff, A.mem_unitGroup_iff] + simp only [automorphismUnitQuotient, Units.val_div_eq_div_val] + change A.valuation + ((((σ : decompositionGroup K A) : L ≃ₐ[K] L) (x : L)) / (x : L)) = 1 + rw [map_div₀, valuation_decomposition_apply_eq_of_isOfFinOrder K A + (σ : decompositionGroup K A) + ((inertiaGroup K A).subtype.isOfFinOrder hσ)] + exact div_self (A.valuation.ne_zero_iff.mpr x.ne_zero) + +/-- Finite inertia acts trivially on the actual value group, without any +finiteness assumption on the full group of field automorphisms. -/ +theorem valueTrivialInertiaGroup_eq_top_of_finite + (A : _root_.ValuationSubring L) [Finite (inertiaGroup K A)] : + valueTrivialInertiaGroup K A = ⊤ := by + apply top_unique + intro σ _ + exact mem_valueTrivialInertiaGroup_of_isOfFinOrder K A σ (isOfFinOrder_of_finite σ) + +end + +end RamificationTheory.HilbertRamification.ValuationSubring diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteRamificationPrimary.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteRamificationPrimary.lean new file mode 100644 index 0000000000..341ec10555 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteRamificationPrimary.lean @@ -0,0 +1,65 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationPrimeToResidueTorsion +public import Mathlib.Algebra.Group.Subgroup.Finite +public import Mathlib.Algebra.CharP.Defs +public import Mathlib.Data.Nat.Factorization.Basic +public import Mathlib.GroupTheory.OrderOfElement +public import Mathlib.GroupTheory.PGroup +/-! +# Finite ramification groups in positive and zero residue characteristic + +In positive residue characteristic p, factoring a finite annihilating order +as p^a times a prime-to-p integer reduces the assertion to prime-to-residue +torsion triviality. In residue characteristic zero, every positive finite +order is nonzero in the residue field, so the ramification group is trivial. + +All groups and principal-unit conditions are the actual valuation-subring +constructions. Only finiteness of the ramification group is used; +no normality, Henselianity, discreteness, perfectness, or finite residue field +is required. +-/ + +@[expose] public section + +namespace RamificationTheory.HilbertRamification.ValuationSubring + +universe u v + +variable (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + +/-- The actual finite ramification group is a p-group in residue characteristic p. -/ +theorem ramificationGroup_isPGroup_of_residueChar + (A : _root_.ValuationSubring L) (p : ℕ) [Fact p.Prime] + [CharP (IsLocalRing.ResidueField A) p] [Finite (ramificationGroup K A)] : + IsPGroup p (ramificationGroup K A) := by + intro σ + obtain ⟨a, m, hm, hfactor⟩ := + Nat.exists_eq_pow_mul_and_not_dvd (orderOf_pos σ).ne' p (Fact.out : p.Prime).ne_one + refine ⟨a, ?_⟩ + apply ramificationGroup_eq_one_of_pow_eq_one_of_residue_natCast_ne_zero K A + (σ ^ (p ^ a)) m ((CharP.cast_eq_zero_iff (IsLocalRing.ResidueField A) p m).not.mpr hm) + rw [← pow_mul, ← hfactor] + exact pow_orderOf_eq_one σ + +/-- The actual finite ramification group is trivial in residue characteristic zero. -/ +theorem ramificationGroup_eq_bot_of_residueCharZero + (A : _root_.ValuationSubring L) [CharZero (IsLocalRing.ResidueField A)] + [Finite (ramificationGroup K A)] : + ramificationGroup K A = ⊥ := by + apply bot_unique + intro σ hσ + change σ = 1 + let τ : ramificationGroup K A := ⟨σ, hσ⟩ + have hτ : τ = 1 := + ramificationGroup_eq_one_of_pow_eq_one_of_residue_natCast_ne_zero K A + τ (orderOf τ) (Nat.cast_ne_zero.mpr (orderOf_pos τ).ne') (pow_orderOf_eq_one τ) + exact congrArg (fun t : ramificationGroup K A => (t : inertiaGroup K A)) hτ + +end RamificationTheory.HilbertRamification.ValuationSubring diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FirstRamificationComparison.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FirstRamificationComparison.lean new file mode 100644 index 0000000000..68096fa568 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FirstRamificationComparison.lean @@ -0,0 +1,322 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniformizerGradedHom +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CharacterMap +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CompleteDVF +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationCharacterization +/-! +# Comparing first principal units in the two ramification conventions + +The DVF filtration uses units of the valuation ring, whereas Hilbert's +ramification group uses the principal-unit subgroup of the field units. +This file identifies their first levels before comparing group actions. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w x + +namespace RamificationTheory.HilbertRamification + +open ValuationTheory.DiscreteValuationField + +variable {L : Type u} [Field L] + +/-- A valuation-ring unit belongs to the first DVF principal-unit group +exactly when its image among field units is principal in Hilbert's sense. -/ +theorem mem_dvfHigherPrincipalUnitGroup_one_iff_principalUnitGroup + (target : DVF.{u, v} L) (a : target.valuationSubringˣ) : + a ∈ Higher.dvfHigherPrincipalUnitGroup target 1 ↔ + ((target.valuation.valuationSubring.unitGroupMulEquiv.symm a : + target.valuation.valuationSubring.unitGroup) : Lˣ) ∈ + target.valuation.valuationSubring.principalUnitGroup := by + rw [Higher.mem_dvfHigherPrincipalUnitGroup_iff, pow_one, + target.mem_maximalIdeal_iff, + target.valuation.valuationSubring.mem_principalUnitGroup_iff] + simpa using + (_root_.Valuation.isEquiv_valuation_valuationSubring + target.valuation).lt_one_iff_lt_one + (x := (((a : target.valuationSubring) : L) - 1)) + +/-- The DVF unit `σ(π)/π` and Hilbert's field-unit quotient are the same +after the canonical embedding of valuation-ring units into field units. -/ +theorem coe_dvfUniformizerQuotientUnit_eq_automorphismUnitQuotient + {K : Type w} [Field K] [Algebra K L] + {base : DVF.{w, x} K} {target : DVF.{u, v} L} + [base.valuation.HasExtension target.valuation] + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{w, x, u, v, v} + base target) + (pi : target.valuationSubring) + (hpi : target.valuation.IsUniformizer (pi : L)) + (sigma : ValuationSubring.decompositionGroup K + target.valuation.valuationSubring) : + ((target.valuation.valuationSubring.unitGroupMulEquiv.symm + (Higher.dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi + (sigma : Gal(L/K))) : + target.valuation.valuationSubring.unitGroup) : Lˣ) = + ValuationSubring.automorphismUnitQuotient K + target.valuation.valuationSubring sigma + (Units.mk0 (pi : L) hpi.ne_zero) := by + let q := Higher.dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi (sigma : Gal(L/K)) + have hq : (sigma : L ≃ₐ[K] L) (pi : L) = + ((q : target.valuationSubring) : L) * (pi : L) := by + have h := Higher.dvfUniformizerQuotientUnit_mul_uniformizer + (base := base) (target := target) huniq pi hpi (sigma : Gal(L/K)) + have h' := congrArg (fun z : target.valuationSubring => (z : L)) h + simpa [q] using h' + apply Units.ext + rw [_root_.ValuationSubring.coe_unitGroupMulEquiv_symm_apply] + simp only [ValuationSubring.automorphismUnitQuotient, + Units.val_div_eq_div_val, Units.val_mk0] + change ((q : target.valuationSubring) : L) = + (sigma : L ≃ₐ[K] L) (pi : L) / (pi : L) + exact (eq_div_iff hpi.ne_zero).2 hq.symm + +/-- For an inertia element of a discretely valued field, Hilbert's +principal-unit condition on every field unit is determined by one +uniformizer. -/ +theorem inertia_forall_automorphismUnitQuotient_mem_principal_iff_uniformizer + {K : Type w} [Field K] [Algebra K L] + (target : DVF.{u, v} L) + (pi : target.valuationSubring) + (hpi : target.valuation.IsUniformizer (pi : L)) + (sigma : ValuationSubring.inertiaGroup K + target.valuation.valuationSubring) : + (∀ y : Lˣ, + ValuationSubring.automorphismUnitQuotient K + target.valuation.valuationSubring + (sigma : ValuationSubring.decompositionGroup K + target.valuation.valuationSubring) y ∈ + target.valuation.valuationSubring.principalUnitGroup) ↔ + ValuationSubring.automorphismUnitQuotient K + target.valuation.valuationSubring + (sigma : ValuationSubring.decompositionGroup K + target.valuation.valuationSubring) + (Units.mk0 (pi : L) hpi.ne_zero) ∈ + target.valuation.valuationSubring.principalUnitGroup := by + let A := target.valuation.valuationSubring + let piUnit : Lˣ := Units.mk0 (pi : L) hpi.ne_zero + let qHom : Lˣ →* Lˣ := + { toFun := ValuationSubring.automorphismUnitQuotient K A + (sigma : ValuationSubring.decompositionGroup K A) + map_one' := ValuationSubring.automorphismUnitQuotient_one_arg + (K := K) A (sigma : ValuationSubring.decompositionGroup K A) + map_mul' := ValuationSubring.automorphismUnitQuotient_mul_arg + (K := K) A (sigma : ValuationSubring.decompositionGroup K A) } + let S : Subgroup Lˣ := A.principalUnitGroup.comap qHom + constructor + · intro h + exact h piUnit + · intro hpiPrincipal y + have hpiS : piUnit ∈ S := hpiPrincipal + have hunit (z : A.unitGroup) : (z : Lˣ) ∈ S := + ValuationSubring.inertia_automorphismUnitQuotient_mem_principalUnitGroup_of_mem_unitGroup + (K := K) A sigma z.property + have hintegral (z : Lˣ) (hz : (z : L) ∈ A) : z ∈ S := by + let r : A := ⟨(z : L), hz⟩ + have hr : r ≠ 0 := by + intro hr0 + apply z.ne_zero + exact congrArg (fun a : A => (a : L)) hr0 + rcases _root_.Valuation.exists_pow_Uniformizer + (v := target.valuation) hr ⟨pi, hpi⟩ with ⟨n, unit, hfactor⟩ + let unitField : A.unitGroup := A.unitGroupMulEquiv.symm unit + have hzfactor : z = piUnit ^ n * (unitField : Lˣ) := by + apply Units.ext + simpa [r, piUnit, unitField] using hfactor + rw [hzfactor] + exact S.mul_mem (S.pow_mem hpiS n) (hunit unitField) + rcases A.mem_or_inv_mem (y : L) with hy | hy + · exact hintegral y hy + · have hyinv : y⁻¹ ∈ S := hintegral y⁻¹ (by simpa using hy) + have hyS : y ∈ S := by simpa only [inv_inv] using S.inv_mem hyinv + exact hyS + +/-- The zeroth lower group is the inertia group for a finite separable +extension of complete DVFs, under the canonical identification of the +Galois and decomposition groups. -/ +theorem mem_lowerRamificationGroup_zero_iff_completeDVF_inertiaGroup + {K : Type w} [Field K] [Algebra K L] + (base : CompleteDVF.{w, x} K) (target : CompleteDVF.{u, v} L) + [FiniteDimensional K L] [Algebra.IsSeparable K L] + [base.valuation.HasExtension target.valuation] + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{w, x, u, v, v} + base.toDVF target.toDVF) + (sigma : Gal(L/K)) : + sigma ∈ Higher.lowerRamificationGroup + (base := base.toDVF) (target := target.toDVF) huniq (0 : ℝ) ↔ + sigma ∈ CompleteDVF.inertiaGroup (base := base) (target := target) := by + have hact (a : target.valuationSubring) : + Higher.valuationSubringAutOfUniqueExtension + (base := base.toDVF) (target := target.toDVF) huniq sigma a = + (CompleteDVF.galEquivDecompositionGroup + (base := base) (target := target) sigma) • a := by + apply Subtype.ext + rfl + have hG0 : + sigma ∈ Higher.lowerRamificationGroup + (base := base.toDVF) (target := target.toDVF) huniq (0 : ℝ) ↔ + ∀ a : target.valuationSubring, + Higher.valuationSubringAutOfUniqueExtension + (base := base.toDVF) (target := target.toDVF) huniq sigma a - a ∈ + target.maximalIdeal := by + simpa only [Nat.cast_zero, zero_add, pow_one] using + (Higher.mem_lowerRamificationGroup_nat_iff + (base := base.toDVF) (target := target.toDVF) huniq 0 sigma) + rw [hG0, CompleteDVF.mem_inertiaGroup_iff + (base := base) (target := target) sigma, + ← CompleteDVF.maximalIdealInertia_eq_decompositionInertia + (K := K) (target := target), + AddSubgroup.mem_inertia] + simp only [hact, Submodule.mem_toAddSubgroup] + +/-- Under separable residue extension, the uniformizer quotient detects the +first lower ramification subgroup inside the zeroth one. -/ +theorem mem_lowerRamificationGroup_one_of_uniformizerQuotient_mem + {K : Type w} [Field K] [Algebra K L] + {base : DVF.{w, x} K} {target : DVF.{u, v} L} + [FiniteDimensional K L] [IsGalois K L] + [base.valuation.HasExtension target.valuation] + [Algebra.IsSeparable base.residueField target.residueField] + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{w, x, u, v, v} + base target) + (pi : target.valuationSubring) + (hpi : target.valuation.IsUniformizer (pi : L)) + (sigma : Gal(L/K)) + (hzero : sigma ∈ Higher.lowerRamificationGroup + (base := base) (target := target) huniq (0 : ℝ)) + (hpiUnit : Higher.dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi sigma ∈ + Higher.dvfHigherPrincipalUnitGroup target 1) : + sigma ∈ Higher.lowerRamificationGroup + (base := base) (target := target) huniq (1 : ℝ) := by + let sigmaZero : Higher.lowerRamificationGroup + (base := base) (target := target) huniq ((0 : ℕ) : ℝ) := + ⟨sigma, by simpa only [Nat.cast_zero] using hzero⟩ + have hgraded : + Higher.uniformizerGradedHom + (base := base) (target := target) huniq pi hpi 0 + (QuotientGroup.mk' _ sigmaZero) = 1 := + (Higher.uniformizerGradedHom_mk_eq_one_iff + (base := base) (target := target) huniq pi hpi 0 sigmaZero).2 + (by simpa only [zero_add] using hpiUnit) + have hinj := Higher.uniformizerGradedHom_injective_of_residue_isSeparable + (base := base) (target := target) huniq pi hpi 0 + have hone : + (QuotientGroup.mk' _ sigmaZero : + Higher.lowerRamificationGradedPiece + (base := base) (target := target) huniq 0) = 1 := by + apply hinj + simpa using hgraded + have hnext := + (QuotientGroup.eq_one_iff + (N := (Higher.lowerRamificationGroup + (base := base) (target := target) huniq ((0 + 1 : ℕ) : ℝ)).subgroupOf + (Higher.lowerRamificationGroup + (base := base) (target := target) huniq ((0 : ℕ) : ℝ))) + sigmaZero).1 hone + change sigma ∈ Higher.lowerRamificationGroup + (base := base) (target := target) huniq ((0 + 1 : ℕ) : ℝ) at hnext + simpa only [zero_add, Nat.cast_one] using hnext + +/-- For a finite Galois extension of complete DVFs with separable residue +extension, the first lower ramification group is Hilbert's ramification +group, transported from the decomposition group to the full Galois group. -/ +theorem lowerRamificationGroup_one_eq_hilbertRamificationGroup + {K : Type w} [Field K] [Algebra K L] + (base : CompleteDVF.{w, x} K) (target : CompleteDVF.{u, v} L) + [FiniteDimensional K L] [IsGalois K L] [Algebra.IsSeparable K L] + [base.valuation.HasExtension target.valuation] + [Algebra.IsSeparable base.residueField target.residueField] + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{w, x, u, v, v} + base.toDVF target.toDVF) : + Higher.lowerRamificationGroup + (base := base.toDVF) (target := target.toDVF) huniq (1 : ℝ) = + Subgroup.comap + (CompleteDVF.galEquivDecompositionGroup + (base := base) (target := target)).toMonoidHom + (ValuationSubring.ramificationGroupInDecomposition K + target.valuation.valuationSubring) := by + let A := target.valuation.valuationSubring + obtain ⟨pi, hpi⟩ := target.exists_uniformizer + ext sigma + let dSigma : ValuationSubring.decompositionGroup K A := + CompleteDVF.galEquivDecompositionGroup + (base := base) (target := target) sigma + change sigma ∈ Higher.lowerRamificationGroup + (base := base.toDVF) (target := target.toDVF) huniq (1 : ℝ) ↔ + dSigma ∈ ValuationSubring.ramificationGroupInDecomposition K A + rw [ValuationSubring.mem_ramificationGroupInDecomposition_iff] + constructor + · intro hOne + have hZero : sigma ∈ Higher.lowerRamificationGroup + (base := base.toDVF) (target := target.toDVF) huniq (0 : ℝ) := + (Higher.lowerRamificationGroup_antitone + (base := base.toDVF) (target := target.toDVF) huniq + (show (0 : ℝ) ≤ 1 by norm_num)) hOne + have hInertia : dSigma ∈ ValuationSubring.inertiaGroup K A := + (CompleteDVF.mem_inertiaGroup_iff + (base := base) (target := target) sigma).mp + ((mem_lowerRamificationGroup_zero_iff_completeDVF_inertiaGroup + (base := base) (target := target) huniq sigma).mp hZero) + let iSigma : ValuationSubring.inertiaGroup K A := ⟨dSigma, hInertia⟩ + have hUone : Higher.dvfUniformizerQuotientUnit + (base := base.toDVF) (target := target.toDVF) huniq pi hpi sigma ∈ + Higher.dvfHigherPrincipalUnitGroup target.toDVF 1 := + Higher.dvfUniformizerQuotientUnit_mem_of_mem_lowerRamificationGroup + (base := base.toDVF) (target := target.toDVF) huniq hpi + (by simpa only [Nat.cast_one] using hOne) + have hPiPrincipal : + ValuationSubring.automorphismUnitQuotient K A dSigma + (Units.mk0 (pi : L) hpi.ne_zero) ∈ A.principalUnitGroup := by + rw [← coe_dvfUniformizerQuotientUnit_eq_automorphismUnitQuotient + (base := base.toDVF) (target := target.toDVF) huniq pi hpi dSigma] + exact (mem_dvfHigherPrincipalUnitGroup_one_iff_principalUnitGroup + target.toDVF _).mp (by simpa [dSigma] using hUone) + exact (inertia_forall_automorphismUnitQuotient_mem_principal_iff_uniformizer + (K := K) target.toDVF pi hpi iSigma).mpr hPiPrincipal + · intro hAll + have hInertia : dSigma ∈ ValuationSubring.inertiaGroup K A := + ValuationSubring.ramificationCondition_mem_inertiaGroup + (K := K) A dSigma hAll + have hZero : sigma ∈ Higher.lowerRamificationGroup + (base := base.toDVF) (target := target.toDVF) huniq (0 : ℝ) := + (mem_lowerRamificationGroup_zero_iff_completeDVF_inertiaGroup + (base := base) (target := target) huniq sigma).mpr + ((CompleteDVF.mem_inertiaGroup_iff + (base := base) (target := target) sigma).mpr hInertia) + have hPiPrincipal : + ((A.unitGroupMulEquiv.symm + (Higher.dvfUniformizerQuotientUnit + (base := base.toDVF) (target := target.toDVF) + huniq pi hpi (dSigma : Gal(L/K))) : A.unitGroup) : Lˣ) ∈ + A.principalUnitGroup := by + rw [coe_dvfUniformizerQuotientUnit_eq_automorphismUnitQuotient + (base := base.toDVF) (target := target.toDVF) huniq pi hpi dSigma] + exact hAll (Units.mk0 (pi : L) hpi.ne_zero) + have hUone : Higher.dvfUniformizerQuotientUnit + (base := base.toDVF) (target := target.toDVF) huniq pi hpi sigma ∈ + Higher.dvfHigherPrincipalUnitGroup target.toDVF 1 := by + have h := (mem_dvfHigherPrincipalUnitGroup_one_iff_principalUnitGroup + target.toDVF _).mpr hPiPrincipal + simpa [dSigma] using h + exact mem_lowerRamificationGroup_one_of_uniformizerQuotient_mem + (base := base.toDVF) (target := target.toDVF) + huniq pi hpi sigma hZero hUone + +end RamificationTheory.HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamification.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamification.lean new file mode 100644 index 0000000000..6fd297c233 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamification.lean @@ -0,0 +1,270 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldValuationRing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal +/-! +# Canonical ramification numbers on an actual fixed field + +For `M = L ^ H`, this file works with the literal restricted valuation ring +`O_M = O_L ∩ M`. The ramification number of an actual element of +`Gal(M/K)` is the value of the principal ideal generated by all of its +integral displacements. Thus the public definition is independent of a +monogenic generator. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w x + +namespace RamificationTheory.HilbertRamification +namespace Higher + + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] +variable {base : ValuationTheory.DiscreteValuationField.DVF.{u, v} K} +variable {target : ValuationTheory.DiscreteValuationField.DVF.{w, x} L} +variable [base.valuation.HasExtension target.valuation] +variable [FiniteDimensional K L] [IsGalois K L] + +/-- The displacement ideal in the literal restricted valuation ring of the +actual fixed field. -/ +def fixedFieldDisplacementIdealDVF + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] + (q : Gal((fixedFieldDVF (K := K) H)/K)) : + Ideal (fixedFieldValuationSubringDVF (K := K) (target := target) H) := + Ideal.span + {d | ∃ a : fixedFieldValuationSubringDVF + (K := K) (target := target) H, + d = fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H q a - a} + +/-- The canonical fixed-field ramification number. Since the restricted +valuation ring is a DVR, its displacement ideal is principal; the additive +value of an ideal generator is independent of the chosen generator. -/ +def fixedFieldRamificationNumber + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] + (q : Gal((fixedFieldDVF (K := K) H)/K)) : ℕ∞ := by + let B := fixedFieldValuationSubringDVF (K := K) (target := target) H + letI : IsDiscreteValuationRing B := + fixedFieldValuationSubringDVF_isDiscreteValuationRing + (base := base) (target := target) huniq H + exact IsDiscreteValuationRing.addVal B + (Submodule.IsPrincipal.generator + (fixedFieldDisplacementIdealDVF + (base := base) (target := target) huniq H q)) + +/-- The real-index ideal on the actual restricted valuation ring. -/ +def fixedFieldRamificationIdealDVF + (H : Subgroup Gal(L/K)) (s : ℝ) : + Ideal (fixedFieldValuationSubringDVF (K := K) (target := target) H) := + IsLocalRing.maximalIdeal + (fixedFieldValuationSubringDVF (K := K) (target := target) H) ^ + realRamificationExponent s + +/-- The real lower ramification group of the actual Galois extension +`(L ^ H)/K`, formed using the literal restricted valuation ring. -/ +def fixedFieldLowerRamificationGroup + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] + (s : ℝ) : Subgroup Gal((fixedFieldDVF (K := K) H)/K) where + carrier := + {q | ∀ a : fixedFieldValuationSubringDVF + (K := K) (target := target) H, + fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H q a - a ∈ + fixedFieldRamificationIdealDVF + (K := K) (target := target) H s} + one_mem' := by + intro a + simp [fixedFieldValuationSubringAutDVF] + mul_mem' := by + intro q r hq hr a + let eqv := fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H q + have hra := hr a + have hmap : eqv + (fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H r a - a) ∈ + fixedFieldRamificationIdealDVF + (K := K) (target := target) H s := + (ValuationTheory.ringEquiv_mem_maximalIdeal_pow_iff eqv + (realRamificationExponent s) _).2 hra + have hqa := hq a + have hdecomp : + fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H (q * r) a - a = + eqv + (fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H r a - a) + + (eqv a - a) := by + rw [fixedFieldValuationSubringAutDVF_mul_apply, map_sub] + ring + rw [hdecomp] + exact Ideal.add_mem _ hmap hqa + inv_mem' := by + intro q hq a + let b := fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H q⁻¹ a + have hb := hq b + have hqb : + fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H q b = a := by + rw [show b = fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H q⁻¹ a by rfl] + rw [← fixedFieldValuationSubringAutDVF_mul_apply] + simp [fixedFieldValuationSubringAutDVF] + have hab : a - b ∈ fixedFieldRamificationIdealDVF + (K := K) (target := target) H s := by + simpa [hqb] using hb + have hba : b - a ∈ fixedFieldRamificationIdealDVF + (K := K) (target := target) H s := by + simpa [sub_eq_add_neg, add_comm] using + (fixedFieldRamificationIdealDVF + (K := K) (target := target) H s).neg_mem hab + simpa [b] using hba + +/-- States the theorem `mem_fixedFieldLowerRamificationGroup_iff`. -/ +@[simp] theorem mem_fixedFieldLowerRamificationGroup_iff + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] + (s : ℝ) (q : Gal((fixedFieldDVF (K := K) H)/K)) : + q ∈ fixedFieldLowerRamificationGroup + (base := base) (target := target) huniq H s ↔ + ∀ a : fixedFieldValuationSubringDVF + (K := K) (target := target) H, + fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H q a - a ∈ + fixedFieldRamificationIdealDVF + (K := K) (target := target) H s := + Iff.rfl + +/-- Real lower-group membership is exactly the threshold imposed by the +canonical fixed-field ramification number. -/ +theorem mem_fixedFieldLowerRamificationGroup_iff_ramificationNumber + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] + (s : ℝ) (q : Gal((fixedFieldDVF (K := K) H)/K)) : + q ∈ fixedFieldLowerRamificationGroup + (base := base) (target := target) huniq H s ↔ + (realRamificationExponent s : ℕ∞) ≤ + fixedFieldRamificationNumber + (base := base) (target := target) huniq H q := by + let B := fixedFieldValuationSubringDVF (K := K) (target := target) H + let J := fixedFieldDisplacementIdealDVF + (base := base) (target := target) huniq H q + let : IsDiscreteValuationRing B := + fixedFieldValuationSubringDVF_isDiscreteValuationRing + (base := base) (target := target) huniq H + let g : B := Submodule.IsPrincipal.generator J + have hspan : Ideal.span ({g} : Set B) = J := + Submodule.IsPrincipal.span_singleton_generator J + rw [mem_fixedFieldLowerRamificationGroup_iff] + simp only [fixedFieldRamificationIdealDVF] + unfold fixedFieldRamificationNumber + dsimp only + change + (∀ a : B, + fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H q a - a ∈ + IsLocalRing.maximalIdeal B ^ realRamificationExponent s) ↔ + (realRamificationExponent s : ℕ∞) ≤ + IsDiscreteValuationRing.addVal B g + constructor + · intro hall + rw [← IsDiscreteValuationRing.mem_maximalIdeal_pow_iff_addVal_ge] + have hJle : J ≤ + IsLocalRing.maximalIdeal B ^ realRamificationExponent s := by + simp only [J, fixedFieldDisplacementIdealDVF, Ideal.span_le] + rintro d ⟨a, rfl⟩ + exact hall a + exact hJle (Submodule.IsPrincipal.generator_mem J) + · intro hgen + have hg : g ∈ IsLocalRing.maximalIdeal B ^ realRamificationExponent s := + (IsDiscreteValuationRing.mem_maximalIdeal_pow_iff_addVal_ge g + (realRamificationExponent s)).2 hgen + have hJle : J ≤ + IsLocalRing.maximalIdeal B ^ realRamificationExponent s := by + rw [← hspan, Ideal.span_le] + simpa using hg + intro a + apply hJle + exact Ideal.subset_span ⟨a, rfl⟩ + + +/-- At integral lower indices, actual fixed-field group membership is +equivalent to the canonical ramification-number inequality. -/ +theorem mem_fixedFieldLowerRamificationGroup_nat_iff + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] + (n : ℕ) (q : Gal((fixedFieldDVF (K := K) H)/K)) : + q ∈ fixedFieldLowerRamificationGroup + (base := base) (target := target) huniq H (n : ℝ) ↔ + ((n + 1 : ℕ) : ℕ∞) ≤ + fixedFieldRamificationNumber + (base := base) (target := target) huniq H q := by + let B := fixedFieldValuationSubringDVF (K := K) (target := target) H + let J := fixedFieldDisplacementIdealDVF + (base := base) (target := target) huniq H q + let : IsDiscreteValuationRing B := + fixedFieldValuationSubringDVF_isDiscreteValuationRing + (base := base) (target := target) huniq H + let g : B := Submodule.IsPrincipal.generator J + have hspan : Ideal.span ({g} : Set B) = J := by + exact Submodule.IsPrincipal.span_singleton_generator J + rw [mem_fixedFieldLowerRamificationGroup_iff] + simp only [fixedFieldRamificationIdealDVF, + realRamificationExponent_nat] + unfold fixedFieldRamificationNumber + dsimp only + change + (∀ a : B, + fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H q a - a ∈ + IsLocalRing.maximalIdeal B ^ (n + 1)) ↔ + ((n + 1 : ℕ) : ℕ∞) ≤ IsDiscreteValuationRing.addVal B g + constructor + · intro hall + rw [← IsDiscreteValuationRing.mem_maximalIdeal_pow_iff_addVal_ge] + have hJle : J ≤ IsLocalRing.maximalIdeal B ^ (n + 1) := by + simp only [J, fixedFieldDisplacementIdealDVF, Ideal.span_le] + rintro d ⟨a, rfl⟩ + exact hall a + exact hJle (Submodule.IsPrincipal.generator_mem J) + · intro hgen + have hg : g ∈ IsLocalRing.maximalIdeal B ^ (n + 1) := + (IsDiscreteValuationRing.mem_maximalIdeal_pow_iff_addVal_ge g + (n + 1)).2 hgen + have hJle : J ≤ IsLocalRing.maximalIdeal B ^ (n + 1) := by + rw [← hspan, Ideal.span_le] + simpa using hg + intro a + apply hJle + exact Ideal.subset_span ⟨a, rfl⟩ + +end Higher +end RamificationTheory.HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamificationIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamificationIndex.lean new file mode 100644 index 0000000000..39dcdbbc16 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamificationIndex.lean @@ -0,0 +1,576 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldValuationRing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationDepth +public import Mathlib.NumberTheory.RamificationInertia.Galois +/-! +# The ramification index of an actual fixed field over a general DVF + +For `M = L ^ H`, this file defines `e(L/M)` from the literal inclusion +`O_M = O_L ∩ M → O_L`. The definition and its comparison with the zeroth +depth subgroup require no completeness or Henselian hypothesis. +-/ + +@[expose] public section + +open _root_.RamificationTheory.DiscreteValuationField.HerbrandGroupTheory.NonarchimedeanDepth + renaming + depthLowerFiltration_lower → + depthLowerFiltration_lower + +open _root_.RamificationTheory.DiscreteValuationField.HerbrandGroupTheory.NonarchimedeanDepth + renaming + mem_depthLowerSubgroup_iff → + mem_depthLowerSubgroup_iff + + +noncomputable +section + +universe u v w x + +namespace RamificationTheory.HilbertRamification +namespace Higher + +open scoped Pointwise + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] +variable {base : ValuationTheory.DiscreteValuationField.DVF.{u, v} K} +variable {target : ValuationTheory.DiscreteValuationField.DVF.{w, x} L} +variable [base.valuation.HasExtension target.valuation] +variable [FiniteDimensional K L] [IsGalois K L] + +/-- The ramification index of `L/(L ^ H)`, formed from the literal inclusion +of the restricted fixed-field valuation ring into the top valuation ring. -/ +def fixedFieldRamificationIndex + (H : Subgroup Gal(L/K)) : ℕ := by + let B := fixedFieldValuationSubringDVF (K := K) (target := target) H + let O := target.valuationSubring + let j := fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H + letI : Algebra B O := j.toAlgebra + exact Ideal.ramificationIdx' (IsLocalRing.maximalIdeal B) + target.maximalIdeal + +/-- The image of the fixed-field maximal ideal is the power of the top +maximal ideal indexed by the literal ramification index. -/ +theorem map_fixedField_maximalIdeal_eq_pow_ramificationIndex + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] : + Ideal.map + (fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H) + (IsLocalRing.maximalIdeal + (fixedFieldValuationSubringDVF (K := K) (target := target) H)) = + target.maximalIdeal ^ + fixedFieldRamificationIndex + (target := target) H := by + let B := fixedFieldValuationSubringDVF (K := K) (target := target) H + let j := fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H + let : Algebra B target.valuationSubring := j.toAlgebra + let p := IsLocalRing.maximalIdeal B + let P := target.maximalIdeal + let : IsDiscreteValuationRing B := + fixedFieldValuationSubringDVF_isDiscreteValuationRing + (base := base) (target := target) huniq H + have hj : Function.Injective j := + fixedFieldValuationSubringDVFToTarget_injective + (K := K) (target := target) H + have hp0 : p ≠ ⊥ := IsDiscreteValuationRing.not_a_field B + have hmap0 : Ideal.map j p ≠ ⊥ := + (Ideal.map_eq_bot_iff_of_injective hj).not.mpr hp0 + obtain ⟨pi, hpi⟩ := + IsDiscreteValuationRing.exists_irreducible target.valuationSubring + obtain ⟨m, hm⟩ := + IsDiscreteValuationRing.ideal_eq_span_pow_irreducible hmap0 hpi + have hmapPow : Ideal.map j p = P ^ m := by + rw [hm, show P = IsLocalRing.maximalIdeal target.valuationSubring from rfl, + hpi.maximalIdeal_eq, Ideal.span_singleton_pow] + have hnot : ¬ Ideal.map j p ≤ P ^ (m + 1) := by + rw [hmapPow] + exact not_le_of_gt + (Ideal.pow_succ_lt_pow + (IsDiscreteValuationRing.not_a_field target.valuationSubring) m) + have hjalg : algebraMap B target.valuationSubring = j := rfl + have he : Ideal.ramificationIdx' p P = m := + Ideal.ramificationIdx'_spec + (by rw [hjalg]; exact hmapPow.le) + (by rw [hjalg]; exact hnot) + change Ideal.map j p = P ^ Ideal.ramificationIdx' p P + rw [he] + exact hmapPow + +omit [FiniteDimensional K L] [IsGalois K L] in +private theorem isUnit_fixedFieldValuationSubringDVFToTarget_iff + (H : Subgroup Gal(L/K)) + (a : fixedFieldValuationSubringDVF (K := K) (target := target) H) : + IsUnit + (fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H a) ↔ + IsUnit a := by + let M := fixedFieldDVF (K := K) H + let B := fixedFieldValuationSubringDVF (K := K) (target := target) H + let j := fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H + constructor + · intro ha + have haTop : + algebraMap M L (a : M) ≠ 0 ∧ + (algebraMap M L (a : M))⁻¹ ∈ + target.valuation.valuationSubring := by + simpa [M, j] using + (Submonoid.isUnit_iff_and + (S := target.valuation.valuationSubring) (a := j a)).mp ha + rw [Submonoid.isUnit_iff_and (S := B) (a := a)] + refine ⟨?_, ?_⟩ + · intro ha0 + apply haTop.1 + rw [ha0, map_zero] + · change algebraMap M L ((a : M)⁻¹) ∈ + target.valuation.valuationSubring + rw [map_inv₀] + exact haTop.2 + · intro ha + exact ha.map j + +/-- States the theorem `fixedFieldRamificationIndex_ne_zero`. -/ +theorem fixedFieldRamificationIndex_ne_zero + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] : + fixedFieldRamificationIndex + (target := target) H ≠ 0 := by + let B := fixedFieldValuationSubringDVF (K := K) (target := target) H + let j := fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H + let : IsDiscreteValuationRing B := + fixedFieldValuationSubringDVF_isDiscreteValuationRing + (base := base) (target := target) huniq H + obtain ⟨pi, hpi⟩ := IsDiscreteValuationRing.exists_irreducible B + have hspan : + Ideal.span ({j pi} : Set target.valuationSubring) = + target.maximalIdeal ^ + fixedFieldRamificationIndex + (target := target) H := by + calc + Ideal.span ({j pi} : Set target.valuationSubring) = + Ideal.map j (Ideal.span ({pi} : Set B)) := by + rw [Ideal.map_span, Set.image_singleton] + _ = Ideal.map j (IsLocalRing.maximalIdeal B) := by + rw [hpi.maximalIdeal_eq] + _ = target.maximalIdeal ^ + fixedFieldRamificationIndex + (target := target) H := + map_fixedField_maximalIdeal_eq_pow_ramificationIndex + (base := base) (target := target) huniq H + intro he + have hjpi : IsUnit (j pi) := by + rw [← Ideal.span_singleton_eq_top] + simpa [he] using hspan + have hpiUnit : IsUnit pi := + (isUnit_fixedFieldValuationSubringDVFToTarget_iff + (K := K) (target := target) H pi).mp hjpi + exact hpi.not_isUnit hpiUnit + +/-- The normalized additive valuation on the top valuation ring restricts +to the ramification index times the normalized additive valuation on the +literal fixed-field valuation ring. -/ +theorem addVal_fixedFieldValuationSubringToTarget_eq_ramificationIndex_nsmul + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] + (a : fixedFieldValuationSubringDVF (K := K) (target := target) H) : + IsDiscreteValuationRing.addVal target.valuationSubring + (fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H a) = + fixedFieldRamificationIndex + (target := target) H • + (@IsDiscreteValuationRing.addVal + (fixedFieldValuationSubringDVF (K := K) (target := target) H) + inferInstance inferInstance + (fixedFieldValuationSubringDVF_isDiscreteValuationRing + (base := base) (target := target) huniq H)) a := by + let B := fixedFieldValuationSubringDVF (K := K) (target := target) H + let j := fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H + let e := fixedFieldRamificationIndex + (target := target) H + let : IsDiscreteValuationRing B := + fixedFieldValuationSubringDVF_isDiscreteValuationRing + (base := base) (target := target) huniq H + have he_ne : e ≠ 0 := + fixedFieldRamificationIndex_ne_zero + (base := base) (target := target) huniq H + by_cases ha : a = 0 + · subst a + have he_coe_ne : (e : ℕ∞) ≠ 0 := by + exact_mod_cast he_ne + rw [map_zero, IsDiscreteValuationRing.addVal_zero, + IsDiscreteValuationRing.addVal_zero, nsmul_eq_mul, ENat.mul_top he_coe_ne] + obtain ⟨pi, hpi⟩ := IsDiscreteValuationRing.exists_irreducible B + obtain ⟨varpi, hvarpi⟩ := + IsDiscreteValuationRing.exists_irreducible target.valuationSubring + obtain ⟨n, u, ha_decomp⟩ := + IsDiscreteValuationRing.eq_unit_mul_pow_irreducible ha hpi + have hspan : + Ideal.span ({j pi} : Set target.valuationSubring) = + Ideal.span ({varpi ^ e} : Set target.valuationSubring) := by + calc + Ideal.span ({j pi} : Set target.valuationSubring) = + Ideal.map j (Ideal.span ({pi} : Set B)) := by + rw [Ideal.map_span, Set.image_singleton] + _ = Ideal.map j (IsLocalRing.maximalIdeal B) := by + rw [hpi.maximalIdeal_eq] + _ = target.maximalIdeal ^ e := + map_fixedField_maximalIdeal_eq_pow_ramificationIndex + (base := base) (target := target) huniq H + _ = Ideal.span ({varpi ^ e} : Set target.valuationSubring) := by + rw [show target.maximalIdeal = + IsLocalRing.maximalIdeal target.valuationSubring from rfl, + hvarpi.maximalIdeal_eq, Ideal.span_singleton_pow] + have hmap_uniformizer : + IsDiscreteValuationRing.addVal target.valuationSubring (j pi) = + (e : ℕ∞) := by + calc + IsDiscreteValuationRing.addVal target.valuationSubring (j pi) = + IsDiscreteValuationRing.addVal target.valuationSubring + (varpi ^ e) := + (IsDiscreteValuationRing.addVal_eq_iff_associated _ _).2 + (Ideal.span_singleton_eq_span_singleton.mp hspan) + _ = (e : ℕ∞) := hvarpi.addVal_pow e + rw [ha_decomp, map_mul, map_pow, IsDiscreteValuationRing.addVal_mul, + IsDiscreteValuationRing.addVal_pow, hmap_uniformizer, + IsDiscreteValuationRing.addVal_def + ((u : B) * pi ^ n) u hpi n rfl] + have hmap_unit : + IsDiscreteValuationRing.addVal target.valuationSubring + (j (u : B)) = 0 := by + exact IsDiscreteValuationRing.addVal_eq_zero_iff.mpr + ((u.isUnit : IsUnit (u : B)).map j) + rw [hmap_unit, zero_add] + simp [e, nsmul_eq_mul, mul_comm] + +omit [FiniteDimensional K L] [IsGalois K L] in +private noncomputable def fixedFieldTopValuationSubringActionHomDVF + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) : + H →* (target.valuationSubring ≃+* target.valuationSubring) where + toFun tau := valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq (tau : Gal(L/K)) + map_one' := by + ext a + simp + map_mul' sigma tau := by + ext a + simp + +private noncomputable def fixedFieldInertiaSubgroupDVF + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) : Subgroup H := by + letI : MulSemiringAction H target.valuationSubring := + MulSemiringAction.compHom (R := target.valuationSubring) + (fixedFieldTopValuationSubringActionHomDVF + (base := base) (target := target) huniq H) + exact target.maximalIdeal.toAddSubgroup.inertia H + +variable [Algebra.IsSeparable base.residueField target.residueField] + +/-- The zeroth subgroup cut out by the canonical general-DVF depth is the +inertia subgroup for the action of H on the top valuation ring. -/ +private theorem depthLowerFiltration_zero_eq_fixedFieldInertiaSubgroupDVF + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) : + ((ramificationNumberDepthOfUniqueExtension + (base := base) (target := target) huniq).depthLowerFiltration H).lower 0 = + fixedFieldInertiaSubgroupDVF + (base := base) (target := target) huniq H := by + let : MulSemiringAction H target.valuationSubring := + MulSemiringAction.compHom (R := target.valuationSubring) + (fixedFieldTopValuationSubringActionHomDVF + (base := base) (target := target) huniq H) + change + ((ramificationNumberDepthOfUniqueExtension + (base := base) (target := target) huniq).depthLowerFiltration H).lower 0 = + target.maximalIdeal.toAddSubgroup.inertia H + ext tau + rw [depthLowerFiltration_lower, + mem_depthLowerSubgroup_iff] + change + (1 : ℕ∞) ≤ intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq (tau : Gal(L/K)) ↔ + ∀ a : target.valuationSubring, + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq (tau : Gal(L/K)) a - a ∈ + target.maximalIdeal + simpa using + ((mem_lowerRamificationGroup_nat_iff_intrinsicRamificationNumberOfUniqueExtension_ge + (base := base) (target := target) huniq 0 (tau : Gal(L/K))).symm.trans + (mem_lowerRamificationGroup_nat_iff + (base := base) (target := target) huniq 0 (tau : Gal(L/K)))) + +/-- Computes a decomposition-group stabilizer from inertia and residue degree +when the induced residue extension is separable. -/ +private theorem card_stabilizer_eq_inertia_mul_inertiaDeg + {R S G : Type*} [CommRing R] [CommRing S] [Algebra R S] + [Group G] [Finite G] [MulSemiringAction G S] [IsGaloisGroup G R S] + (p : Ideal R) [p.IsPrime] [p.IsMaximal] + (P : Ideal S) [P.LiesOver p] [P.IsPrime] [P.IsMaximal] + [Algebra.IsSeparable (R ⧸ p) (S ⧸ P)] : + Nat.card (MulAction.stabilizer G P) = + Nat.card (Ideal.inertia G P) * P.inertiaDeg R := by + let := Localization.AtPrime.algebraOfLiesOver p P + let : Algebra.IsSeparable p.ResidueField P.ResidueField := + Algebra.isSeparable_residueField_iff.mpr + (inferInstance : Algebra.IsSeparable (R ⧸ p) (S ⧸ P)) + have heq : + (algebraMap (S ⧸ P) P.ResidueField).comp + (algebraMap (R ⧸ p) (S ⧸ P)) = + (algebraMap p.ResidueField P.ResidueField).comp + (algebraMap (R ⧸ p) p.ResidueField) := by + ext + simp [← IsScalarTower.algebraMap_apply] + let := + ((algebraMap (S ⧸ P) P.ResidueField).comp + (algebraMap (R ⧸ p) (S ⧸ P))).toAlgebra + have : IsScalarTower (R ⧸ p) (S ⧸ P) P.ResidueField := + .of_algebraMap_eq' rfl + have : IsScalarTower (R ⧸ p) p.ResidueField P.ResidueField := + .of_algebraMap_eq' heq + have : IsGalois p.ResidueField P.ResidueField := + { __ := Ideal.IsFractionRing.normal + G p P p.ResidueField P.ResidueField } + have : Module.Finite p.ResidueField P.ResidueField := + Ideal.IsFractionRing.finite_of_isInvariant + G p P p.ResidueField P.ResidueField + have hindex : + Subgroup.index (Ideal.inertia (MulAction.stabilizer G P) P) = + Nat.card Gal(P.ResidueField/p.ResidueField) := + Nat.card_congr + (IsFractionRing.stabilizerQuotientInertiaEquiv + G p P p.ResidueField P.ResidueField).toEquiv + have hsubgroup : + (Ideal.inertia G P).subgroupOf (MulAction.stabilizer G P) = + Ideal.inertia (MulAction.stabilizer G P) P := + AddSubgroup.subgroupOf_inertia P.toAddSubgroup + (MulAction.stabilizer G P) + have hcardInertia : + Nat.card (Ideal.inertia (MulAction.stabilizer G P) P) = + Nat.card (Ideal.inertia G P) := by + rw [← hsubgroup] + exact Nat.card_congr + (Subgroup.subgroupOfEquivOfLe + (Ideal.inertia_le_stabilizer (M := G) P)).toEquiv + rw [Ideal.inertiaDeg_eq p P, + ← IsGalois.card_aut_eq_finrank p.ResidueField P.ResidueField, + ← hindex] + calc + Nat.card (MulAction.stabilizer G P) = + Nat.card (Ideal.inertia (MulAction.stabilizer G P) P) * + Subgroup.index (Ideal.inertia (MulAction.stabilizer G P) P) := by + exact + (Ideal.inertia + (MulAction.stabilizer G P) P).card_mul_index.symm + _ = Nat.card (Ideal.inertia G P) * + Subgroup.index (Ideal.inertia (MulAction.stabilizer G P) P) := by + rw [hcardInertia] + +/-- Identifies the finite inertia cardinality with the ramification index +without assuming that the base residue field is perfect. -/ +private theorem card_inertia_eq_ramificationIdxIn + {R S G : Type*} [CommRing R] [CommRing S] [Algebra R S] + [Group G] [Finite G] [MulSemiringAction G S] [IsGaloisGroup G R S] + [IsDomain R] [IsDomain S] [Module.Finite R S] [Module.Flat R S] + (p : Ideal R) (P : Ideal S) [P.LiesOver p] + [p.IsPrime] [p.IsMaximal] [P.IsPrime] [P.IsMaximal] + [Algebra.IsSeparable (R ⧸ p) (S ⧸ P)] : + Nat.card (Ideal.inertia G P) = + Ideal.ramificationIdxIn p S := by + have hstabilizer := + card_stabilizer_eq_inertia_mul_inertiaDeg + (G := G) p P + have hinertia : + (p.primesOver S).ncard * Nat.card (Ideal.inertia G P) * + P.inertiaDeg R = + Nat.card G := by + rw [mul_assoc, ← hstabilizer, + ← Algebra.IsInvariant.orbit_eq_primesOver R S G p P] + simpa only [Nat.card_prod, + Nat.card_coe_set_eq] using + Nat.card_congr (MulAction.orbitProdStabilizerEquivGroup G P) + rw [← Ideal.inertiaDegIn_eq_inertiaDeg p P G] at hinertia + have htotal : + (p.primesOver S).ncard * + (Ideal.ramificationIdxIn p S * Ideal.inertiaDegIn p S) = + Nat.card G := by + exact + Ideal.ncard_primesOver_mul_ramificationIdxIn_mul_inertiaDegIn p S G + have hmul : + (p.primesOver S).ncard * + (Nat.card (Ideal.inertia G P) * Ideal.inertiaDegIn p S) = + (p.primesOver S).ncard * + (Ideal.ramificationIdxIn p S * Ideal.inertiaDegIn p S) := by + rw [← mul_assoc, hinertia, htotal] + have hprimeCount : (p.primesOver S).ncard ≠ 0 := by + grind [Nat.card_pos] + have hinertiaDegree : Ideal.inertiaDegIn p S ≠ 0 := + Ideal.inertiaDegIn_ne_zero G + have hcancelPrime := + Nat.eq_of_mul_eq_mul_left + (Nat.pos_of_ne_zero hprimeCount) hmul + exact Nat.eq_of_mul_eq_mul_right + (Nat.pos_of_ne_zero hinertiaDegree) hcancelPrime + +/-- The literal ramification index of L/(L^H) is the cardinality of the +zeroth subgroup induced on H by the canonical general-DVF depth. -/ +theorem fixedFieldRamificationIndex_eq_card_depthLowerFiltration_zero + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] : + fixedFieldRamificationIndex + (target := target) H = + Nat.card + (((ramificationNumberDepthOfUniqueExtension + (base := base) (target := target) huniq).depthLowerFiltration H).lower 0) := by + let M := fixedFieldDVF (K := K) H + let B := fixedFieldValuationSubringDVF (K := K) (target := target) H + let O := target.valuationSubring + let j := fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H + let p := IsLocalRing.maximalIdeal B + let P := target.maximalIdeal + let : IsDiscreteValuationRing B := + fixedFieldValuationSubringDVF_isDiscreteValuationRing + (base := base) (target := target) huniq H + let algBM : Algebra B M := B.subtype.toAlgebra + let : IsFractionRing B M := by + apply + isFractionRing_of_exists_eq_algebraMap_or_inv_eq_algebraMap_of_injective + · intro z + rcases B.mem_or_inv_mem z with hz | hz + · exact ⟨⟨z, hz⟩, Or.inl rfl⟩ + · exact ⟨⟨z⁻¹, hz⟩, Or.inr rfl⟩ + · intro a b hab + exact Subtype.ext hab + let : Algebra B O := j.toAlgebra + let algBL : Algebra B L := + ((algebraMap O L).comp j).toAlgebra + let : IsScalarTower B O L := by + apply IsScalarTower.of_algebraMap_eq + intro a + rfl + let : IsScalarTower B M L := by + apply IsScalarTower.of_algebraMap_eq + intro a + rfl + let : IsScalarTower base.valuationSubring B L := by + apply IsScalarTower.of_algebraMap_eq + intro a + rfl + let : IsScalarTower base.valuationSubring B O := by + apply IsScalarTower.of_algebraMap_eq + intro a + apply Subtype.ext + rfl + let : Algebra.IsIntegral base.valuationSubring O := + target_valuationSubring_isIntegral_of_uniqueExtension + (base := base) (target := target) huniq + let : Algebra.IsIntegral base.valuationSubring B := + fixedFieldValuationSubringDVF_isIntegral + (base := base) (target := target) huniq H + let : Algebra.IsIntegral B O := + Algebra.IsIntegral.tower_top base.valuationSubring + let : IsIntegralClosure O B L := by + let : IsIntegralClosure O base.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_uniqueExtension + (base := base) (target := target) huniq + exact IsIntegralClosure.tower_top + (R := base.valuationSubring) (A := B) (B := L) (C := O) + let : Module.Finite base.valuationSubring O := + target_valuationSubring_moduleFinite_of_uniqueExtension + (base := base) (target := target) huniq + let : Module.Finite B O := + Module.Finite.of_restrictScalars_finite base.valuationSubring B O + let : FaithfulSMul B L := + FaithfulSMul.of_field_isFractionRing B L M L + let : Module.IsTorsionFree B L := + FaithfulSMul.to_isTorsionFree (R := B) (A := L) + let : Module.IsTorsionFree B O := + IsIntegralClosure.isTorsionFree B L + let : IsLocalHom (algebraMap B O) := by + refine ⟨?_⟩ + intro a ha + exact + (isUnit_fixedFieldValuationSubringDVFToTarget_iff + (K := K) (target := target) H a).mp ha + let : IsLocalHom (algebraMap base.valuationSubring B) := by + apply (algebraMap_isIntegral_iff.mpr + (show Algebra.IsIntegral base.valuationSubring B from inferInstance)).isLocalHom + intro a b hab + apply Subtype.ext + apply (algebraMap K M).injective + exact congrArg Subtype.val hab + let : MulSemiringAction H O := + MulSemiringAction.compHom (R := O) + (fixedFieldTopValuationSubringActionHomDVF + (base := base) (target := target) huniq H) + let : SMulDistribClass H O L := + { smul_distrib_smul := by + intro tau a y + change (tau : Gal(L/K)) ((a : L) * y) = + ((tau : Gal(L/K)) (a : L)) * (tau : Gal(L/K)) y + rw [map_mul] } + let : IsGaloisGroup H M L := by + change IsGaloisGroup H + (FixedPoints.intermediateField H : IntermediateField K L) L + infer_instance + let : IsGaloisGroup H B O := + IsGaloisGroup.of_isFractionRing H B O M L + let : P.LiesOver p := inferInstance + let : Algebra.IsSeparable (IsLocalRing.ResidueField B) + target.residueField := + Algebra.isSeparable_tower_top_of_isSeparable + base.residueField (IsLocalRing.ResidueField B) target.residueField + let : Algebra.IsSeparable (B ⧸ p) (O ⧸ P) := by + change Algebra.IsSeparable (IsLocalRing.ResidueField B) + target.residueField + infer_instance + have hp0 : p ≠ ⊥ := IsDiscreteValuationRing.not_a_field B + rw [depthLowerFiltration_zero_eq_fixedFieldInertiaSubgroupDVF + (base := base) (target := target) huniq H] + change + Ideal.ramificationIdx' p P = + Nat.card (P.toAddSubgroup.inertia H) + symm + calc + Nat.card (P.toAddSubgroup.inertia H) = + Ideal.ramificationIdxIn p O := + card_inertia_eq_ramificationIdxIn + (G := H) p P + _ = P.ramificationIdx B := + Ideal.ramificationIdxIn_eq_ramificationIdx p P H + _ = Ideal.ramificationIdx' p P := + (Ideal.ramificationIdx'_eq_ramificationIdx p P hp0).symm + +end Higher +end RamificationTheory.HilbertRamification + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldValuationRing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldValuationRing.lean new file mode 100644 index 0000000000..6ea0618276 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldValuationRing.lean @@ -0,0 +1,451 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniqueExtensionIntegralClosure +public import Mathlib.RingTheory.DiscreteValuationRing.TFAE +/-! +# Restricted valuation rings on actual fixed fields + +For a normal subgroup of a finite Galois group, this file uses the literal +fixed field and the restriction of the chosen top valuation ring. Unique +extension identifies that restricted ring with the integral closure of the +base valuation ring. It is consequently a DVR, without a completeness or +Henselian assumption. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w x + +namespace RamificationTheory.HilbertRamification +namespace Higher + +open RamificationTheory.DiscreteValuationField.DVF + + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] +variable {base : ValuationTheory.DiscreteValuationField.DVF.{u, v} K} +variable {target : ValuationTheory.DiscreteValuationField.DVF.{w, x} L} +variable [base.valuation.HasExtension target.valuation] + +/-- The actual fixed field of a subgroup. -/ +abbrev fixedFieldDVF (H : Subgroup Gal(L/K)) := + IntermediateField.fixedField H + +/-- Restriction of the chosen top valuation ring to the actual fixed field. -/ +def fixedFieldValuationSubringDVF (H : Subgroup Gal(L/K)) : + ValuationSubring (fixedFieldDVF (K := K) H) := + target.valuation.valuationSubring.comap + (algebraMap (fixedFieldDVF (K := K) H) L) + +/-- States the theorem `mem_fixedFieldValuationSubringDVF_iff`. -/ +@[simp] theorem mem_fixedFieldValuationSubringDVF_iff + (H : Subgroup Gal(L/K)) (a : fixedFieldDVF (K := K) H) : + a ∈ fixedFieldValuationSubringDVF (K := K) (target := target) H ↔ + algebraMap (fixedFieldDVF (K := K) H) L a ∈ + target.valuation.valuationSubring := + Iff.rfl + +/-- Inclusion of the restricted fixed-field valuation ring into the top +valuation ring. -/ +def fixedFieldValuationSubringDVFToTarget + (H : Subgroup Gal(L/K)) : + fixedFieldValuationSubringDVF (K := K) (target := target) H →+* + target.valuationSubring := + (algebraMap (fixedFieldDVF (K := K) H) L).restrict + (fixedFieldValuationSubringDVF (K := K) (target := target) H) + target.valuation.valuationSubring (fun _ ha => ha) + +/-- States the theorem `fixedFieldValuationSubringDVFToTarget_apply_coe`. -/ +@[simp] theorem fixedFieldValuationSubringDVFToTarget_apply_coe + (H : Subgroup Gal(L/K)) + (a : fixedFieldValuationSubringDVF (K := K) (target := target) H) : + ((fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H a : target.valuationSubring) : L) = + algebraMap (fixedFieldDVF (K := K) H) L (a : fixedFieldDVF (K := K) H) := + rfl + +/-- States the theorem `fixedFieldValuationSubringDVFToTarget_injective`. -/ +theorem fixedFieldValuationSubringDVFToTarget_injective + (H : Subgroup Gal(L/K)) : + Function.Injective + (fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H) := by + intro a b hab + apply Subtype.ext + apply (algebraMap (fixedFieldDVF (K := K) H) L).injective + exact congrArg (fun z : target.valuationSubring => (z : L)) hab + +/-- The base valuation-ring map into the restricted valuation ring of the +fixed field. -/ +def baseToFixedFieldValuationSubringDVF + (H : Subgroup Gal(L/K)) : + base.valuationSubring →+* + fixedFieldValuationSubringDVF (K := K) (target := target) H := + (algebraMap K (fixedFieldDVF (K := K) H)).restrict + base.valuation.valuationSubring + (fixedFieldValuationSubringDVF (K := K) (target := target) H) + (fun a _ha => by + change target.valuation (algebraMap K L (a : K)) ≤ 1 + exact (_root_.Valuation.HasExtension.val_map_le_one_iff + (vR := base.valuation) (vA := target.valuation) (a : K)).2 _ha) + +/-- Provides the instance `instAlgebraBaseFixedFieldValuationSubringDVF`. -/ +noncomputable instance instAlgebraBaseFixedFieldValuationSubringDVF + (H : Subgroup Gal(L/K)) : + Algebra base.valuationSubring + (fixedFieldValuationSubringDVF (K := K) (target := target) H) := + (baseToFixedFieldValuationSubringDVF + (base := base) (target := target) H).toAlgebra + +/-- The restricted valuation on the fixed field extends the base valuation. -/ +theorem base_hasExtension_fixedFieldValuationSubringDVF + (H : Subgroup Gal(L/K)) : + base.valuation.HasExtension + (fixedFieldValuationSubringDVF + (K := K) (target := target) H).valuation := by + apply _root_.Valuation.HasExtension.ofComapInteger + ext a + simp only [ValuationSubring.integer_valuation, Subring.mem_comap, + ValuationSubring.mem_toSubring, mem_fixedFieldValuationSubringDVF_iff, + IntermediateField.algebraMap_apply, SubalgebraClass.coe_algebraMap, + Valuation.mem_valuationSubring_iff, Valuation.mem_integer_iff] + exact _root_.Valuation.HasExtension.val_map_le_one_iff + (vR := base.valuation) (vA := target.valuation) a + +/-- Provides the instance `instBaseHasExtensionFixedFieldValuationSubringDVF`. -/ +instance instBaseHasExtensionFixedFieldValuationSubringDVF + (H : Subgroup Gal(L/K)) : + base.valuation.HasExtension + (fixedFieldValuationSubringDVF + (K := K) (target := target) H).valuation := + base_hasExtension_fixedFieldValuationSubringDVF + (base := base) (target := target) H + +/-- The inclusion of valuation rings, as an algebra homomorphism over the +base valuation ring. -/ +def fixedFieldValuationSubringDVFToTargetAlgHom + (H : Subgroup Gal(L/K)) : + fixedFieldValuationSubringDVF (K := K) (target := target) H →ₐ[ + base.valuationSubring] target.valuationSubring where + toRingHom := fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H + commutes' a := by + apply Subtype.ext + rfl + +/-- States the theorem `fixedFieldValuationSubringDVFToTargetAlgHom_injective`. -/ +theorem fixedFieldValuationSubringDVFToTargetAlgHom_injective + (H : Subgroup Gal(L/K)) : + Function.Injective + (fixedFieldValuationSubringDVFToTargetAlgHom + (K := K) (base := base) (target := target) H) := + fixedFieldValuationSubringDVFToTarget_injective + (K := K) (target := target) H + +variable [FiniteDimensional K L] +variable [IsGalois K L] + +/-- The restricted fixed-field valuation ring is integral over the base +valuation ring. -/ +theorem fixedFieldValuationSubringDVF_isIntegral + (huniq : + HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) : + Algebra.IsIntegral base.valuationSubring + (fixedFieldValuationSubringDVF (K := K) (target := target) H) := by + let : Algebra.IsIntegral base.valuationSubring target.valuationSubring := + target_valuationSubring_isIntegral_of_uniqueExtension + (base := base) (target := target) huniq + exact Algebra.IsIntegral.of_injective + (fixedFieldValuationSubringDVFToTargetAlgHom + (K := K) (base := base) (target := target) H) + (fixedFieldValuationSubringDVFToTargetAlgHom_injective + (K := K) (base := base) (target := target) H) + +/-- The restricted fixed-field valuation ring is the actual integral closure +of the base valuation ring in the fixed field. -/ +theorem fixedFieldValuationSubringDVF_isIntegralClosure + (huniq : + HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) : + IsIntegralClosure + (fixedFieldValuationSubringDVF (K := K) (target := target) H) + base.valuationSubring (fixedFieldDVF (K := K) H) := by + let B := fixedFieldValuationSubringDVF (K := K) (target := target) H + let M := fixedFieldDVF (K := K) H + let : Algebra.IsIntegral base.valuationSubring B := + fixedFieldValuationSubringDVF_isIntegral + (base := base) (target := target) huniq H + let hTarget : IsIntegralClosure target.valuationSubring + base.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_uniqueExtension + (base := base) (target := target) huniq + let : IsScalarTower base.valuationSubring M L := by + apply IsScalarTower.of_algebraMap_eq + intro a + rfl + let : IsScalarTower base.valuationSubring B M := by + apply IsScalarTower.of_algebraMap_eq + intro a + rfl + refine { algebraMap_injective := ?_, isIntegral_iff := ?_ } + · exact Subtype.coe_injective + · intro z + constructor + · intro hz + have hzTop : IsIntegral base.valuationSubring + (algebraMap M L z) := + hz.map (IsScalarTower.toAlgHom base.valuationSubring M L) + rcases hTarget.isIntegral_iff.mp hzTop with ⟨y, hy⟩ + refine ⟨⟨z, ?_⟩, rfl⟩ + change algebraMap M L z ∈ target.valuation.valuationSubring + rw [← hy] + exact y.property + · rintro ⟨y, rfl⟩ + exact (Algebra.IsIntegral.isIntegral (R := base.valuationSubring) y).map + (IsScalarTower.toAlgHom base.valuationSubring B M) + +/-- Module finiteness of the restricted integral closure. -/ +theorem fixedFieldValuationSubringDVF_moduleFinite + (huniq : + HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) : + Module.Finite base.valuationSubring + (fixedFieldValuationSubringDVF (K := K) (target := target) H) := by + let : IsNoetherianRing base.valuationSubring := + base.valuationSubring_isNoetherianRing + let : IsIntegralClosure + (fixedFieldValuationSubringDVF (K := K) (target := target) H) + base.valuationSubring (fixedFieldDVF (K := K) H) := + fixedFieldValuationSubringDVF_isIntegralClosure + (base := base) (target := target) huniq H + let : IsFractionRing base.valuationSubring K := + base.valuationSubring_isFractionRing + let : IsScalarTower base.valuationSubring + (fixedFieldValuationSubringDVF (K := K) (target := target) H) + (fixedFieldDVF (K := K) H) := by + apply IsScalarTower.of_algebraMap_eq; intro; rfl + exact IsIntegralClosure.finite base.valuationSubring K (fixedFieldDVF (K := K) H) _ + +/-- The restricted valuation ring on a nontrivial finite fixed field is a +DVR. This is an algebraic consequence of module finiteness and does not use +completeness. -/ +theorem fixedFieldValuationSubringDVF_isDiscreteValuationRing + (huniq : + HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] : + IsDiscreteValuationRing + (fixedFieldValuationSubringDVF (K := K) (target := target) H) := by + let B := fixedFieldValuationSubringDVF (K := K) (target := target) H + let : Module.Finite base.valuationSubring B := + fixedFieldValuationSubringDVF_moduleFinite + (base := base) (target := target) huniq H + let : IsNoetherianRing base.valuationSubring := + base.valuationSubring_isNoetherianRing + let : IsNoetherianRing B := + IsNoetherianRing.of_finite base.valuationSubring B + let : Algebra.IsIntegral base.valuationSubring B := + fixedFieldValuationSubringDVF_isIntegral + (base := base) (target := target) huniq H + have hinj : Function.Injective (algebraMap base.valuationSubring B) := by + intro a b hab + apply Subtype.ext + apply (algebraMap K (fixedFieldDVF (K := K) H)).injective + exact congrArg (fun z : B => (z : fixedFieldDVF (K := K) H)) hab + have hnotField : ¬ IsField B := by + intro hB + exact IsDiscreteValuationRing.not_isField base.valuationSubring + (isField_of_isIntegral_of_isField hinj hB) + exact ((IsDiscreteValuationRing.TFAE B hnotField).out 2 1).mp + (inferInstance : ValuationRing B) + +/-- The quotient automorphism on the fixed field commutes with inclusion into +the top field. -/ +theorem algebraMap_normalAutEquivQuotient_apply_dvf + (H : Subgroup Gal(L/K)) [H.Normal] + (sigma : Gal(L/K)) (a : fixedFieldDVF (K := K) H) : + algebraMap (fixedFieldDVF (K := K) H) L + (IsGalois.normalAutEquivQuotient H sigma a) = + sigma (algebraMap (fixedFieldDVF (K := K) H) L a) := by + rw [IsGalois.normalAutEquivQuotient_apply] + exact AlgEquiv.restrictNormal_commutes sigma + (fixedFieldDVF (K := K) H) a + +/-- Restriction of the quotient automorphism to the actual fixed-field +valuation ring. -/ +def fixedFieldValuationSubringLiftedAutDVF + (huniq : + HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] + (sigma : Gal(L/K)) : + fixedFieldValuationSubringDVF (K := K) (target := target) H ≃+* + fixedFieldValuationSubringDVF (K := K) (target := target) H where + toFun a := + ⟨IsGalois.normalAutEquivQuotient H sigma (a : fixedFieldDVF (K := K) H), by + rw [mem_fixedFieldValuationSubringDVF_iff, + algebraMap_normalAutEquivQuotient_apply_dvf + (K := K) H sigma] + exact + (mem_valuationSubring_algEquiv_iff_of_hasUniqueValuationExtension + (base := base) (target := target) huniq sigma _).1 a.property⟩ + invFun a := + ⟨(IsGalois.normalAutEquivQuotient H sigma).symm + (a : fixedFieldDVF (K := K) H), by + rw [mem_fixedFieldValuationSubringDVF_iff] + have hEq : + algebraMap (fixedFieldDVF (K := K) H) L + ((IsGalois.normalAutEquivQuotient H sigma).symm + (a : fixedFieldDVF (K := K) H)) = + sigma⁻¹ (algebraMap (fixedFieldDVF (K := K) H) L a) := by + simpa using algebraMap_normalAutEquivQuotient_apply_dvf + (K := K) H (sigma⁻¹) (a : fixedFieldDVF (K := K) H) + rw [hEq] + exact + (mem_valuationSubring_algEquiv_iff_of_hasUniqueValuationExtension + (base := base) (target := target) huniq (sigma⁻¹) _).1 a.property⟩ + left_inv a := by + ext + simp + right_inv a := by + ext + simp + map_mul' a b := by + ext + simp + map_add' a b := by + ext + simp + +/-- States the theorem `fixedFieldValuationSubringDVFToTarget_aut_apply`. -/ +@[simp] theorem fixedFieldValuationSubringDVFToTarget_aut_apply + (huniq : + HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] + (sigma : Gal(L/K)) + (a : fixedFieldValuationSubringDVF (K := K) (target := target) H) : + fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H + (fixedFieldValuationSubringLiftedAutDVF + (base := base) (target := target) huniq H sigma a) = + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma + (fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H a) := by + apply Subtype.ext + exact algebraMap_normalAutEquivQuotient_apply_dvf + (K := K) H sigma (a : fixedFieldDVF (K := K) H) + +/-- Every automorphism of the fixed field preserves its restricted +valuation ring. Surjectivity in the finite Galois correspondence is used +only to prove preservation; the automorphism appearing in the statement is +an automorphism of `L ^ H` itself. -/ +theorem fixedFieldDVF_aut_mem_valuationSubring_iff + (huniq : + HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] + (q : Gal((fixedFieldDVF (K := K) H)/K)) + (a : fixedFieldDVF (K := K) H) : + a ∈ fixedFieldValuationSubringDVF (K := K) (target := target) H ↔ + q a ∈ fixedFieldValuationSubringDVF (K := K) (target := target) H := by + let qbar : Gal(L/K) ⧸ H := + (IsGalois.normalAutEquivQuotient H).symm q + obtain ⟨sigma, hsigma⟩ := QuotientGroup.mk'_surjective H qbar + have hq : IsGalois.normalAutEquivQuotient H sigma = q := by + change (IsGalois.normalAutEquivQuotient H) + ((QuotientGroup.mk' H) sigma) = q + rw [hsigma] + exact (IsGalois.normalAutEquivQuotient H).apply_symm_apply q + rw [mem_fixedFieldValuationSubringDVF_iff, + mem_fixedFieldValuationSubringDVF_iff] + rw [← hq, algebraMap_normalAutEquivQuotient_apply_dvf] + exact + mem_valuationSubring_algEquiv_iff_of_hasUniqueValuationExtension + (base := base) (target := target) huniq sigma _ + +/-- The canonical action of the fixed-field Galois group on its restricted +valuation ring. -/ +def fixedFieldValuationSubringAutDVF + (huniq : + HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] + (q : Gal((fixedFieldDVF (K := K) H)/K)) : + fixedFieldValuationSubringDVF (K := K) (target := target) H ≃+* + fixedFieldValuationSubringDVF (K := K) (target := target) H where + toFun a := ⟨q (a : fixedFieldDVF (K := K) H), + (fixedFieldDVF_aut_mem_valuationSubring_iff + (base := base) (target := target) huniq H q _).1 a.property⟩ + invFun a := ⟨q⁻¹ (a : fixedFieldDVF (K := K) H), + (fixedFieldDVF_aut_mem_valuationSubring_iff + (base := base) (target := target) huniq H q⁻¹ _).1 a.property⟩ + left_inv a := by ext; simp + right_inv a := by ext; simp + map_mul' a b := by ext; simp + map_add' a b := by ext; simp + +/-- States the theorem `fixedFieldValuationSubringAutDVF_apply_coe`. -/ +@[simp] theorem fixedFieldValuationSubringAutDVF_apply_coe + (huniq : + HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] + (q : Gal((fixedFieldDVF (K := K) H)/K)) + (a : fixedFieldValuationSubringDVF (K := K) (target := target) H) : + ((fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H q a : + fixedFieldValuationSubringDVF (K := K) (target := target) H) : + fixedFieldDVF (K := K) H) = q (a : fixedFieldDVF (K := K) H) := + rfl + +/-- States the theorem `fixedFieldValuationSubringAutDVF_mul_apply`. -/ +@[simp] theorem fixedFieldValuationSubringAutDVF_mul_apply + (huniq : + HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] + (q r : Gal((fixedFieldDVF (K := K) H)/K)) + (a : fixedFieldValuationSubringDVF (K := K) (target := target) H) : + fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H (q * r) a = + fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H q + (fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H r a) := by + ext + rfl + +/-- The fixed-field action agrees with the lifted action obtained from any +chosen lift in the top Galois group. -/ +theorem fixedFieldValuationSubringAutDVF_normalAutEquivQuotient + (huniq : + HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] + (sigma : Gal(L/K)) + (a : fixedFieldValuationSubringDVF (K := K) (target := target) H) : + fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H + (IsGalois.normalAutEquivQuotient H sigma) a = + fixedFieldValuationSubringLiftedAutDVF + (base := base) (target := target) huniq H sigma a := by + ext + rfl + +end Higher +end RamificationTheory.HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/GaloisStabilizer.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/GaloisStabilizer.lean new file mode 100644 index 0000000000..3027d0c617 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/GaloisStabilizer.lean @@ -0,0 +1,56 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Basic +public import Mathlib.FieldTheory.IntermediateField.Adjoin.Basic +/-! +# A finite-Galois stabilizer criterion for simple subfields + +In a finite Galois extension, if every automorphism fixing `b` also fixes +`a`, then the simple field generated by `a` is contained in the simple field +generated by `b`. +-/ + +@[expose] public section + +noncomputable +section + +open scoped IntermediateField + +universe u v + +namespace RamificationTheory.HilbertRamification +namespace Higher + +variable {K : Type u} {M : Type v} +variable [Field K] [Field M] [Algebra K M] + +/-- A pointwise stabilizer inclusion gives the reverse inclusion between +the corresponding simple intermediate fields. -/ +theorem adjoin_le_adjoin_of_forall_fixed_imp_fixed + [FiniteDimensional K M] [IsGalois K M] + (a b : M) + (hfixed : + ∀ σ : Gal(M/K), σ b = b → σ a = a) : + K⟮a⟯ ≤ K⟮b⟯ := by + rw [← IsGalois.fixedField_fixingSubgroup K⟮b⟯, + IntermediateField.adjoin_le_iff] + intro x hx + rw [Set.mem_singleton_iff] at hx + subst x + refine + (IntermediateField.mem_fixedField_iff K⟮b⟯.fixingSubgroup a).2 ?_ + intro σ hσ + exact hfixed σ + (hσ ⟨b, IntermediateField.mem_adjoin_simple_self K b⟩) + +end Higher +end RamificationTheory.HilbertRamification + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandFunction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandFunction.lean new file mode 100644 index 0000000000..954ee34219 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandFunction.lean @@ -0,0 +1,233 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Function +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups +/-! +# Herbrand functions for a general discretely valued field + +This file attaches the group-theoretic Herbrand functions directly to the +real lower ramification groups of `RealLowerGroups`. The only valued-field +input is the stated unique-extension hypothesis that the chosen valuation on the top +field is the unique extension of the base valuation. In particular, none of +the definitions or elementary inverse-function facts below assumes that either +field is complete. +-/ + +@[expose] public section + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction_inverseHerbrandFunction → + herbrandFunction_inverseHerbrandFunction + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction_strictMono → + herbrandFunction_strictMono + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + inverseHerbrandFunction → + inverseHerbrandFunction + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + inverseHerbrandFunction_herbrandFunction → + inverseHerbrandFunction_herbrandFunction + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + inverseHerbrandFunction_mem_Ici_neg_one_iff → + inverseHerbrandFunction_mem_Ici_neg_one_iff + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + inverseHerbrandFunction_strictMono → + inverseHerbrandFunction_strictMono + + +noncomputable +section + +universe u v w x + +namespace RamificationTheory.HilbertRamification +open ValuationTheory.DiscreteValuationField +namespace Higher + + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] +variable {base : ValuationTheory.DiscreteValuationField.DVF.{u, v} K} +variable {target : ValuationTheory.DiscreteValuationField.DVF.{w, x} L} +variable [base.valuation.HasExtension target.valuation] + +/-- The integral levels of the real lower-ramification groups, packaged as a +`AntitoneNormalSubgroupFiltration`. This is the general-DVF replacement for the +complete-only `toLowerRamificationFiltration`. -/ +def lowerRamificationFiltrationOfUniqueExtension + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} + base target) : + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration Gal(L/K) where + lower n := lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ) + lower_normal n := lowerRamificationGroup_normal + (base := base) (target := target) huniq (n : ℝ) + antitone := by + intro m n hmn + apply lowerRamificationGroup_antitone + (base := base) (target := target) huniq + exact_mod_cast hmn + +/-- States the theorem `lowerRamificationFiltrationOfUniqueExtension_lower`. -/ +@[simp] theorem lowerRamificationFiltrationOfUniqueExtension_lower + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} + base target) + (n : ℕ) : + (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq).lower n = + lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ) := + rfl + +variable [FiniteDimensional K L] + +/-- The finite Galois group is equipped with an enumeration for ramification-group sums. -/ +noncomputable local instance generalDVFGalFintype : Fintype Gal(L/K) := + Fintype.ofFinite Gal(L/K) + +/-- The Herbrand-function sum formula, defined under the stated unique-extension and +separable-residue assumptions: +the Herbrand function attached to the actual lower groups. -/ +noncomputable def herbrandFunctionOfUniqueExtension + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} + base target) (s : ℝ) : ℝ := + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq) s + +/-- The inverse Herbrand function in the general-DVF setting. -/ +noncomputable def inverseHerbrandFunctionOfUniqueExtension + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} + base target) (t : ℝ) : ℝ := + inverseHerbrandFunction + (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq) t + +omit [FiniteDimensional K L] in +/-- States the theorem `herbrandFunctionOfUniqueExtension_apply`. -/ +@[simp] theorem herbrandFunctionOfUniqueExtension_apply + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} + base target) (s : ℝ) : + herbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq s = + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq) s := + rfl + +omit [FiniteDimensional K L] in +/-- States the theorem `inverseHerbrandFunctionOfUniqueExtension_apply`. -/ +@[simp] theorem inverseHerbrandFunctionOfUniqueExtension_apply + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} + base target) (t : ℝ) : + inverseHerbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq t = + inverseHerbrandFunction + (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq) t := + rfl + +/-- States the theorem `herbrandFunctionOfUniqueExtension_psi`. -/ +theorem herbrandFunctionOfUniqueExtension_psi + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} + base target) (t : ℝ) : + herbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq + (inverseHerbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq t) = t := + herbrandFunction_inverseHerbrandFunction + (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq) t + +/-- States the theorem `inverseHerbrandFunctionOfUniqueExtension_eta`. -/ +theorem inverseHerbrandFunctionOfUniqueExtension_eta + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} + base target) (s : ℝ) : + inverseHerbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq + (herbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq s) = s := + inverseHerbrandFunction_herbrandFunction + (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq) s + +/-- States the theorem `herbrandFunctionOfUniqueExtension_strictMono`. -/ +theorem herbrandFunctionOfUniqueExtension_strictMono + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} + base target) : + StrictMono (herbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq) := + herbrandFunction_strictMono + (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq) + +/-- States the theorem `inverseHerbrandFunctionOfUniqueExtension_strictMono`. -/ +theorem inverseHerbrandFunctionOfUniqueExtension_strictMono + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} + base target) : + StrictMono (inverseHerbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq) := + inverseHerbrandFunction_strictMono + (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq) + +/-- The upper ramification group defined through the inverse Herbrand function +under the noncomplete standing assumptions: `G^t = G_{psi(t)}`. -/ +def upperRamificationGroupOfUniqueExtension + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} + base target) (t : ℝ) : Subgroup Gal(L/K) := + lowerRamificationGroup + (base := base) (target := target) huniq + (inverseHerbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq t) + +/-- States the theorem `upperRamificationGroupOfUniqueExtension_herbrandFunction`. -/ +theorem upperRamificationGroupOfUniqueExtension_herbrandFunction + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} + base target) (s : ℝ) : + upperRamificationGroupOfUniqueExtension + (base := base) (target := target) huniq + (herbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq s) = + lowerRamificationGroup + (base := base) (target := target) huniq s := by + exact congrArg + (lowerRamificationGroup (base := base) (target := target) huniq) + (inverseHerbrandFunctionOfUniqueExtension_eta + (base := base) (target := target) huniq s) + +/-- States the theorem `inverseHerbrandFunctionOfUniqueExtension_ge_neg_one_iff`. -/ +theorem inverseHerbrandFunctionOfUniqueExtension_ge_neg_one_iff + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} + base target) {t : ℝ} : + -1 ≤ inverseHerbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq t ↔ -1 ≤ t := + inverseHerbrandFunction_mem_Ici_neg_one_iff + (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq) + +end Higher +end RamificationTheory.HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandTheorem.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandTheorem.lean new file mode 100644 index 0000000000..5615f60f56 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandTheorem.lean @@ -0,0 +1,1389 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumberFormula +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.FixedField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumberRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationDepth +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv +/-! +# Herbrand's theorem for general discrete valuation fields + +This leaf contains the completion-free endpoints of +the Herbrand quotient theorem and the quotient and tower filtration theorems. The private + lemmas below isolate +the finite-group averaging argument used in the quotient-filtration comparison. +-/ + +@[expose] public section + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction → + herbrandFunction + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction_inverseHerbrandFunction → + herbrandFunction_inverseHerbrandFunction + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction_of_nonpos → + herbrandFunction_of_nonpos + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction_strictMono → + herbrandFunction_strictMono + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + inverseHerbrandFunction → + inverseHerbrandFunction + + +noncomputable +section + +namespace RamificationTheory.HilbertRamification +namespace Higher + +open RamificationTheory.DiscreteValuationField +open RamificationTheory.DiscreteValuationField.HerbrandGroupTheory + +universe u v w x + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] +variable {base : ValuationTheory.DiscreteValuationField.DVF.{u, v} K} +variable {target : ValuationTheory.DiscreteValuationField.DVF.{w, x} L} +variable [base.valuation.HasExtension target.valuation] +variable [FiniteDimensional K L] [IsGalois K L] + +private theorem mem_lowerRamificationGroup_iff_ramificationNumber_dvf + [Algebra.IsSeparable base.residueField target.residueField] + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (s : ℝ) (sigma : Gal(L/K)) : + sigma ∈ lowerRamificationGroup + (base := base) (target := target) huniq s ↔ + (realRamificationExponent s : ℕ∞) ≤ + intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq sigma := by + unfold intrinsicRamificationNumberOfUniqueExtension + rw [mem_lowerRamificationGroup_iff, + natCast_le_ramificationNumberOfUniqueExtension_iff] + simp only [realRamificationIdeal] + constructor + · intro hsigma + exact hsigma _ + · intro hgenerator a + exact valuationSubringAutOfUniqueExtension_sub_mem_of_mem_adjoin + (base := base) (target := target) huniq hgenerator (by + rw [chosenRamificationGeneratorOfUniqueExtension_adjoin_eq_top + (base := base) (target := target) huniq] + simp) + +private theorem realRamificationExponent_le_iff_add_one_le_dvf + (s : ℝ) (n : ℕ) : + realRamificationExponent s ≤ n ↔ s + 1 ≤ n := by + rw [realRamificationExponent, Int.toNat_le, Int.ceil_le, Int.cast_natCast] + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- States the theorem `fixedFieldRamificationIdeal_antitone`. -/ +theorem fixedFieldRamificationIdeal_antitone + (H : Subgroup Gal(L/K)) {s t : ℝ} (hst : s ≤ t) : + fixedFieldRamificationIdealDVF + (K := K) (target := target) H t ≤ + fixedFieldRamificationIdealDVF + (K := K) (target := target) H s := by + exact Ideal.pow_le_pow_right (realRamificationExponent_mono hst) + +/-- States the theorem `fixedFieldLowerRamificationGroup_antitone`. -/ +theorem fixedFieldLowerRamificationGroup_antitone + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] : + Antitone (fixedFieldLowerRamificationGroup + (base := base) (target := target) huniq H) := by + intro s t hst q hq a + exact fixedFieldRamificationIdeal_antitone + (K := K) (target := target) H hst (hq a) + +/-- States the theorem `fixedFieldLowerRamificationGroup_normal`. -/ +theorem fixedFieldLowerRamificationGroup_normal + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] (s : ℝ) : + (fixedFieldLowerRamificationGroup + (base := base) (target := target) huniq H s).Normal := by + refine Subgroup.Normal.mk ?_ + intro q hq r a + let b := fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H r⁻¹ a + have hb : + fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H q b - b ∈ + fixedFieldRamificationIdealDVF + (K := K) (target := target) H s := + hq b + let eqv := fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H r + have hmap : + eqv + (fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H q b - b) ∈ + fixedFieldRamificationIdealDVF + (K := K) (target := target) H s := by + exact (ValuationTheory.ringEquiv_mem_maximalIdeal_pow_iff eqv + (realRamificationExponent s) _).2 hb + have hrewrite : + fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H (r * q * r⁻¹) a - a = + eqv + (fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H q b - b) := by + simp [eqv, b, map_sub, fixedFieldValuationSubringAutDVF] + rwa [hrewrite] + +/-- The integral fixed-field lower groups, packaged as a lower filtration. -/ +def fixedFieldLowerRamificationFiltration + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] : + AntitoneNormalSubgroupFiltration Gal((fixedFieldDVF (K := K) H)/K) where + lower n := fixedFieldLowerRamificationGroup + (base := base) (target := target) huniq H (n : ℝ) + lower_normal n := + fixedFieldLowerRamificationGroup_normal + (base := base) (target := target) huniq H (n : ℝ) + antitone := by + intro m n hmn + apply fixedFieldLowerRamificationGroup_antitone + (base := base) (target := target) huniq H + exact_mod_cast hmn + +/-- States the theorem `fixedFieldLowerRamificationFiltration_lower`. -/ +@[simp] theorem fixedFieldLowerRamificationFiltration_lower + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] (n : ℕ) : + (fixedFieldLowerRamificationFiltration + (base := base) (target := target) huniq H).lower n = + fixedFieldLowerRamificationGroup + (base := base) (target := target) huniq H (n : ℝ) := + rfl + +/-- Herbrand's eta function for the actual fixed extension `(L ^ H)/K`. -/ +def fixedFieldHerbrandFunction + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] (s : ℝ) : ℝ := + (fixedFieldLowerRamificationFiltration + (base := base) (target := target) huniq H).herbrandFunction s + +/-- The inverse Herbrand function for the actual fixed extension. -/ +def fixedFieldInverseHerbrandFunction + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] (t : ℝ) : ℝ := + (fixedFieldLowerRamificationFiltration + (base := base) (target := target) huniq H).inverseHerbrandFunction t + +/-- States the theorem `fixedFieldHerbrandFunction_inverseHerbrandFunction`. -/ +@[simp] theorem fixedFieldHerbrandFunction_inverseHerbrandFunction + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] (t : ℝ) : + fixedFieldHerbrandFunction + (base := base) (target := target) huniq H + (fixedFieldInverseHerbrandFunction + (base := base) (target := target) huniq H t) = t := + (fixedFieldLowerRamificationFiltration + (base := base) (target := target) huniq H).herbrandFunction_inverseHerbrandFunction t + +/-- States the theorem `fixedFieldInverseHerbrandFunction_herbrandFunction`. -/ +@[simp] theorem fixedFieldInverseHerbrandFunction_herbrandFunction + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] (s : ℝ) : + fixedFieldInverseHerbrandFunction + (base := base) (target := target) huniq H + (fixedFieldHerbrandFunction + (base := base) (target := target) huniq H s) = s := + (fixedFieldLowerRamificationFiltration + (base := base) (target := target) huniq H).inverseHerbrandFunction_herbrandFunction s + +/-- States the theorem `fixedFieldHerbrandFunction_strictMono`. -/ +theorem fixedFieldHerbrandFunction_strictMono + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] : + StrictMono (fixedFieldHerbrandFunction + (base := base) (target := target) huniq H) := + (fixedFieldLowerRamificationFiltration + (base := base) (target := target) huniq H).herbrandFunction_strictMono + +/-- States the theorem `fixedFieldInverseHerbrandFunction_strictMono`. -/ +theorem fixedFieldInverseHerbrandFunction_strictMono + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] : + StrictMono (fixedFieldInverseHerbrandFunction + (base := base) (target := target) huniq H) := + (fixedFieldLowerRamificationFiltration + (base := base) (target := target) huniq H).inverseHerbrandFunction_strictMono + +/-- States the theorem `fixedFieldInverseHerbrandFunction_ge_neg_one_iff`. -/ +theorem fixedFieldInverseHerbrandFunction_ge_neg_one_iff + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] {t : ℝ} : + -1 ≤ fixedFieldInverseHerbrandFunction + (base := base) (target := target) huniq H t ↔ -1 ≤ t := + (fixedFieldLowerRamificationFiltration + (base := base) (target := target) huniq H).inverseHerbrandFunction_mem_Ici_neg_one_iff + +/-- Upper ramification groups of the actual fixed extension. -/ +def fixedFieldUpperRamificationGroup + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] (t : ℝ) : + Subgroup Gal((fixedFieldDVF (K := K) H)/K) := + fixedFieldLowerRamificationGroup + (base := base) (target := target) huniq H + (fixedFieldInverseHerbrandFunction + (base := base) (target := target) huniq H t) + +/-- States the theorem `fixedFieldUpperRamificationGroup_herbrandFunction`. -/ +@[simp] theorem fixedFieldUpperRamificationGroup_herbrandFunction + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] (s : ℝ) : + fixedFieldUpperRamificationGroup + (base := base) (target := target) huniq H + (fixedFieldHerbrandFunction + (base := base) (target := target) huniq H s) = + fixedFieldLowerRamificationGroup + (base := base) (target := target) huniq H s := by + unfold fixedFieldUpperRamificationGroup + rw [fixedFieldInverseHerbrandFunction_herbrandFunction] +/-- Classical decidability of membership in each lower ramification subgroup. -/ +noncomputable local instance lowerMembershipDecidable + {G : Type*} [Group G] (F : AntitoneNormalSubgroupFiltration G) + (n : ℕ) (sigma : G) : Decidable (sigma ∈ F.lower n) := + Classical.propDecidable _ + +/-- Every subgroup of a finite group is equipped with a finite enumeration. -/ +noncomputable local instance finiteSubgroupFintype + {G : Type*} [Group G] [Finite G] (H : Subgroup G) : Fintype H := + Fintype.ofFinite H + +private theorem truncate_depth_eq_intrinsic_summand_of_mem + {G : Type*} [Group G] + (F : AntitoneNormalSubgroupFiltration G) (depth : G → ℕ∞) + (hmem : ∀ n sigma, + sigma ∈ F.lower n ↔ (((n + 1 : ℕ) : ℕ∞) ≤ depth sigma)) + (m : ℕ) {s : ℝ} (hms : (m : ℝ) ≤ s) (hsm : s ≤ m + 1) + (sigma : F.lower 0) : + truncateENatAtDVF (depth (sigma : G)) (s + 1) = + 1 + (F.truncatedLowerDepth m sigma : ℝ) + + (s - m) * (if (sigma : G) ∈ F.lower (m + 1) then 1 else 0) := by + classical + let i := depth (sigma : G) + have hi_one : (1 : ℕ∞) ≤ i := by + simpa [i] using (hmem 0 (sigma : G)).1 sigma.property + by_cases hhigh : ((m + 2 : ℕ) : ℕ∞) ≤ i + · have hsigma : (sigma : G) ∈ F.lower (m + 1) := by + apply (hmem (m + 1) (sigma : G)).2 + simpa [i, Nat.add_assoc] using hhigh + have hdepth : F.truncatedLowerDepth m sigma = m := by + rw [AntitoneNormalSubgroupFiltration.truncatedLowerDepth] + rw [Finset.filter_eq_self.2] + · simp + · intro j hj + apply (hmem (j + 1) (sigma : G)).2 + have hjm : j < m := Finset.mem_range.1 hj + have hjle : ((j + 2 : ℕ) : ℕ∞) ≤ ((m + 2 : ℕ) : ℕ∞) := + ENat.natCast_le_natCast.2 (by omega) + simpa [i, Nat.add_assoc] using hjle.trans hhigh + have htrunc : truncateENatAtDVF i (s + 1) = s + 1 := by + exact truncateENatAtDVF_eq_right_of_natCast_le + (m := m + 2) (by + norm_num [Nat.cast_add, Nat.cast_ofNat] at hsm ⊢ + linarith) hhigh + rw [htrunc, hdepth] + simp [hsigma] + ring + · have hlt : i < ((m + 2 : ℕ) : ℕ∞) := lt_of_not_ge hhigh + have hine : i ≠ ⊤ := ne_top_of_lt hlt + obtain ⟨k, hk⟩ := ENat.ne_top_iff_exists.1 hine + have hk_one : 1 ≤ k := by + exact_mod_cast (hi_one.trans_eq hk.symm) + have hk_upper : k ≤ m + 1 := by + have : k < m + 2 := by exact_mod_cast (hk.symm ▸ hlt) + omega + have hsigma : (sigma : G) ∉ F.lower (m + 1) := by + intro hsigma + apply hhigh + simpa [i, Nat.add_assoc] using (hmem (m + 1) (sigma : G)).1 hsigma + have hdepth : F.truncatedLowerDepth m sigma = k - 1 := by + rw [AntitoneNormalSubgroupFiltration.truncatedLowerDepth] + have hfilter : + (Finset.range m).filter + (fun j => (sigma : G) ∈ F.lower (j + 1)) = + Finset.range (k - 1) := by + ext j + simp only [Finset.mem_filter, Finset.mem_range] + have hthreshold : + ((sigma : G) ∈ F.lower (j + 1)) ↔ j + 2 ≤ k := by + rw [hmem] + change (((j + 1 + 1 : ℕ) : ℕ∞) ≤ i) ↔ j + 2 ≤ k + rw [← hk] + norm_cast + rw [hthreshold] + omega + rw [hfilter, Finset.card_range] + have htrunc : truncateENatAtDVF i (s + 1) = k := by + rw [← hk, truncateENatAtDVF_coe, min_eq_left] + have : (k : ℝ) ≤ m + 1 := by exact_mod_cast hk_upper + linarith + rw [htrunc, hdepth] + simp only [hsigma, ↓reduceIte, mul_zero, add_zero] + exact_mod_cast (by omega : k = 1 + (k - 1)) + +private theorem truncate_depth_eq_zero_of_not_mem_lower_zero + {G : Type*} [Group G] + (F : AntitoneNormalSubgroupFiltration G) (depth : G → ℕ∞) + (hmem : ∀ n sigma, + sigma ∈ F.lower n ↔ (((n + 1 : ℕ) : ℕ∞) ≤ depth sigma)) + {s : ℝ} (hs : -1 ≤ s) {sigma : G} + (hsigma : sigma ∉ F.lower 0) : + truncateENatAtDVF (depth sigma) (s + 1) = 0 := by + have hi : depth sigma < 1 := by + rw [← not_le] + intro hi + exact hsigma ((hmem 0 sigma).2 (by simpa using hi)) + have hi0 : depth sigma = 0 := Order.lt_one_iff.1 hi + rw [hi0] + simp [truncateENatAtDVF, + min_eq_left (show (0 : ℝ) ≤ s + 1 by linarith)] + +private theorem sum_truncate_depth_eq_sum_lower_zero_of_mem + {G : Type*} [Group G] [Fintype G] + (F : AntitoneNormalSubgroupFiltration G) (depth : G → ℕ∞) + (hmem : ∀ n sigma, + sigma ∈ F.lower n ↔ (((n + 1 : ℕ) : ℕ∞) ≤ depth sigma)) + {s : ℝ} (hs : -1 ≤ s) : + (∑ sigma : G, truncateENatAtDVF (depth sigma) (s + 1)) = + ∑ sigma : F.lower 0, + truncateENatAtDVF (depth (sigma : G)) (s + 1) := by + classical + let q : G → ℝ := fun sigma => + truncateENatAtDVF (depth sigma) (s + 1) + calc + ∑ sigma : G, q sigma = + ∑ sigma : G, if sigma ∈ F.lower 0 then q sigma else 0 := by + apply Finset.sum_congr rfl + intro sigma _ + by_cases hsigma : sigma ∈ F.lower 0 + · simp [hsigma] + · rw [ite_eq_right hsigma] + exact truncate_depth_eq_zero_of_not_mem_lower_zero + F depth hmem hs hsigma + _ = ∑ sigma : F.lower 0, q (sigma : G) := by + rw [← Finset.sum_filter (p := fun sigma : G => sigma ∈ F.lower 0)] + simpa using + (Finset.sum_subtype_eq_sum_filter + (s := (Finset.univ : Finset G)) q + (p := fun sigma : G => sigma ∈ F.lower 0)).symm + +private theorem sum_lower_zero_truncate_depth_eq_intrinsic_of_mem + {G : Type*} [Group G] [Finite G] + (F : AntitoneNormalSubgroupFiltration G) (depth : G → ℕ∞) + (hmem : ∀ n sigma, + sigma ∈ F.lower n ↔ (((n + 1 : ℕ) : ℕ∞) ≤ depth sigma)) + (m : ℕ) {s : ℝ} (hms : (m : ℝ) ≤ s) (hsm : s ≤ m + 1) : + (∑ sigma : F.lower 0, + truncateENatAtDVF (depth (sigma : G)) (s + 1)) = + Nat.card (F.lower 0) + + (∑ sigma : F.lower 0, (F.truncatedLowerDepth m sigma : ℝ)) + + (s - m) * Nat.card (F.lower (m + 1)) := by + classical + let := Fintype.ofFinite G + classical + simp_rw [truncate_depth_eq_intrinsic_summand_of_mem + F depth hmem m hms hsm] + have hindicator : + (∑ sigma : F.lower 0, + (if (sigma : G) ∈ F.lower (m + 1) then (1 : ℝ) else 0)) = + Nat.card (F.lower (m + 1)) := by + exact_mod_cast (F.card_lower_succ_eq_sum_indicator m).symm + change Finset.sum Finset.univ (fun sigma : F.lower 0 => + (1 : ℝ) + (F.truncatedLowerDepth m sigma : ℝ) + + (s - m) * + (if (sigma : G) ∈ F.lower (m + 1) then 1 else 0)) = _ + rw [Finset.sum_add_distrib, Finset.sum_add_distrib] + rw [← Finset.mul_sum, hindicator] + simp + +private theorem herbrandFunction_eq_depth_sum_of_mem + {G : Type*} [Group G] [Fintype G] + (F : AntitoneNormalSubgroupFiltration G) (depth : G → ℕ∞) + (hmem : ∀ n sigma, + sigma ∈ F.lower n ↔ (((n + 1 : ℕ) : ℕ∞) ≤ depth sigma)) + {s : ℝ} (hs : -1 ≤ s) : + (herbrandFunction + F) s = + (1 / Nat.card (F.lower 0) : ℝ) * + (∑ sigma : G, truncateENatAtDVF (depth sigma) (s + 1)) - 1 := by + classical + have hcard : (Nat.card (F.lower 0) : ℝ) ≠ 0 := by + exact_mod_cast + (ne_of_gt (show 0 < Nat.card (F.lower 0) from Finite.card_pos)) + rw [sum_truncate_depth_eq_sum_lower_zero_of_mem F depth hmem hs] + by_cases hs0 : 0 ≤ s + · let m := ⌊s⌋₊ + have hms : (m : ℝ) ≤ s := Nat.floor_le hs0 + have hsm : s ≤ m + 1 := (Nat.lt_floor_add_one s).le + rw [sum_lower_zero_truncate_depth_eq_intrinsic_of_mem + F depth hmem m hms hsm] + rw [F.herbrandFunction_eq_depth_sum_of_mem_Icc m hms hsm] + field_simp + ring + · have hsle : s ≤ 0 := le_of_not_ge hs0 + rw [(herbrandFunction_of_nonpos F) hsle] + have hpoint : ∀ sigma : F.lower 0, + truncateENatAtDVF (depth (sigma : G)) (s + 1) = s + 1 := by + intro sigma + have hi : (1 : ℕ∞) ≤ depth (sigma : G) := by + simpa using (hmem 0 (sigma : G)).1 sigma.property + exact truncateENatAtDVF_eq_right_of_natCast_le + (m := 1) (by + norm_num at hsle ⊢ + linarith) hi + simp_rw [hpoint] + simp only [Finset.sum_const, nsmul_eq_mul] + rw [Finset.card_univ, ← Nat.card_eq_fintype_card] + field_simp + ring + +private theorem fixedField_herbrandFunction_formula_dvf + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] {s : ℝ} (hs : -1 ≤ s) : + fixedFieldHerbrandFunction + (base := base) (target := target) huniq H s = + (1 / Nat.card ((fixedFieldLowerRamificationFiltration + (base := base) (target := target) huniq H).lower 0) : ℝ) * + (∑ q : Gal((fixedFieldDVF (K := K) H)/K), + truncateENatAtDVF + (fixedFieldRamificationNumber + (base := base) (target := target) huniq H q) (s + 1)) - 1 := by + apply herbrandFunction_eq_depth_sum_of_mem + (fixedFieldLowerRamificationFiltration + (base := base) (target := target) huniq H) + (fixedFieldRamificationNumber + (base := base) (target := target) huniq H) + · intro n q + exact mem_fixedFieldLowerRamificationGroup_nat_iff + (base := base) (target := target) huniq H n q + · exact hs + + + +/-- A quotient fiber of a finite group is equipped with an enumeration for the depth average. -/ +noncomputable local instance finiteQuotientFiberFintype + {G : Type*} [Group G] [Finite G] (H : Subgroup G) [H.Normal] + (q : G ⧸ H) : Fintype (NonarchimedeanDepth.QuotientFiber H q) := + Fintype.ofFinite _ + +private theorem truncate_depth_eq_intrinsic_summand + {G : Type*} [Group G] + (D : NonarchimedeanDepth G) (H : Subgroup G) + (m : ℕ) {s : ℝ} (hms : (m : ℝ) ≤ s) (hsm : s ≤ m + 1) + (tau : (D.depthLowerFiltration H).lower 0) : + truncateENatAtDVF (D.depth ((tau : H) : G)) (s + 1) = + 1 + ((D.depthLowerFiltration H).truncatedLowerDepth m tau : ℝ) + + (s - m) * + (if (tau : H) ∈ (D.depthLowerFiltration H).lower (m + 1) + then 1 else 0) := by + classical + let F := D.depthLowerFiltration H + let i := D.depth ((tau : H) : G) + have hi_one : (1 : ℕ∞) ≤ i := tau.property + by_cases hhigh : ((m + 2 : ℕ) : ℕ∞) ≤ i + · have hmem : (tau : H) ∈ + (D.depthLowerFiltration H).lower (m + 1) := hhigh + have hdepth : F.truncatedLowerDepth m tau = m := by + rw [AntitoneNormalSubgroupFiltration.truncatedLowerDepth] + rw [Finset.filter_eq_self.2] + · simp + · intro j hj + change ((j + 2 : ℕ) : ℕ∞) ≤ i + have hjm : j < m := Finset.mem_range.1 hj + have hjm' : ((j + 2 : ℕ) : ℕ∞) ≤ ((m + 2 : ℕ) : ℕ∞) := + ENat.natCast_le_natCast.2 (by omega) + exact hjm'.trans hhigh + have htrunc : truncateENatAtDVF i (s + 1) = s + 1 := by + exact truncateENatAtDVF_eq_right_of_natCast_le + (m := m + 2) (by + norm_num [Nat.cast_add, Nat.cast_ofNat] at hsm ⊢ + linarith) hhigh + rw [htrunc, hdepth] + rw [ite_eq_left hmem] + ring + · have hlt : i < ((m + 2 : ℕ) : ℕ∞) := lt_of_not_ge hhigh + have hine : i ≠ ⊤ := ne_top_of_lt hlt + obtain ⟨k, hk⟩ := ENat.ne_top_iff_exists.1 hine + have hk_one : 1 ≤ k := by + exact_mod_cast (hi_one.trans_eq hk.symm) + have hk_upper : k ≤ m + 1 := by + have : k < m + 2 := ENat.natCast_lt_natCast.1 (hk.symm ▸ hlt) + omega + have hmem : (tau : H) ∉ + (D.depthLowerFiltration H).lower (m + 1) := hhigh + have hdepth : F.truncatedLowerDepth m tau = k - 1 := by + rw [AntitoneNormalSubgroupFiltration.truncatedLowerDepth] + have hfilter : + (Finset.range m).filter + (fun j => (tau : H) ∈ F.lower (j + 1)) = + Finset.range (k - 1) := by + ext j + simp only [Finset.mem_filter, Finset.mem_range] + have hthreshold : + ((tau : H) ∈ F.lower (j + 1)) ↔ j + 2 ≤ k := by + change (((j + 2 : ℕ) : ℕ∞) ≤ i) ↔ j + 2 ≤ k + rw [← hk] + norm_cast + rw [hthreshold] + omega + rw [hfilter, Finset.card_range] + have htrunc : truncateENatAtDVF i (s + 1) = k := by + rw [← hk, truncateENatAtDVF_coe, min_eq_left] + have : (k : ℝ) ≤ m + 1 := by exact_mod_cast hk_upper + linarith + rw [htrunc, hdepth] + rw [ite_eq_right hmem] + simp only [mul_zero, add_zero] + exact_mod_cast (by omega : k = 1 + (k - 1)) + +private theorem sum_truncate_depth_eq_sum_lower_zero + {G : Type*} [Group G] [Finite G] + (D : NonarchimedeanDepth G) (H : Subgroup G) + {s : ℝ} (hs : -1 ≤ s) : + (∑ tau : H, truncateENatAtDVF (D.depth (tau : G)) (s + 1)) = + ∑ tau : (D.depthLowerFiltration H).lower 0, + truncateENatAtDVF (D.depth ((tau : H) : G)) (s + 1) := by + classical + let := Fintype.ofFinite G + classical + let F := D.depthLowerFiltration H + let f : H → ℝ := fun tau => truncateENatAtDVF (D.depth (tau : G)) (s + 1) + calc + ∑ tau : H, f tau = + ∑ tau : H, if tau ∈ F.lower 0 then f tau else 0 := by + apply Finset.sum_congr rfl + intro tau _ + by_cases htau : tau ∈ F.lower 0 + · simp [htau] + · rw [ite_eq_right htau] + have hzero : D.depth (tau : G) = (0 : ℕ∞) := by + exact D.depth_eq_zero_of_not_mem_lower_zero H tau htau + change truncateENatAtDVF (D.depth (tau : G)) (s + 1) = 0 + rw [hzero] + simp [truncateENatAtDVF, show (0 : ℝ) ≤ s + 1 by linarith] + _ = ∑ tau : F.lower 0, f (tau : H) := by + rw [← Finset.sum_filter (p := fun tau : H => tau ∈ F.lower 0)] + change + (∑ tau ∈ (Finset.univ : Finset H) with tau ∈ F.lower 0, f tau) = + ∑ tau : {tau : H // tau ∈ F.lower 0}, f tau + simpa using + (Finset.sum_subtype_eq_sum_filter + (s := (Finset.univ : Finset H)) f + (p := fun tau : H => tau ∈ F.lower 0)).symm + +private theorem sum_lower_zero_truncate_depth_eq_intrinsic + {G : Type*} [Group G] [Finite G] + (D : NonarchimedeanDepth G) (H : Subgroup G) [H.Normal] + (m : ℕ) {s : ℝ} (hms : (m : ℝ) ≤ s) (hsm : s ≤ m + 1) : + (∑ tau : (D.depthLowerFiltration H).lower 0, + truncateENatAtDVF (D.depth ((tau : H) : G)) (s + 1)) = + Nat.card ((D.depthLowerFiltration H).lower 0) + + (∑ tau : (D.depthLowerFiltration H).lower 0, + ((D.depthLowerFiltration H).truncatedLowerDepth m tau : ℝ)) + + (s - m) * Nat.card ((D.depthLowerFiltration H).lower (m + 1)) := by + classical + let := Fintype.ofFinite G + classical + let F := D.depthLowerFiltration H + change (∑ tau : F.lower 0, + truncateENatAtDVF (D.depth (((tau : F.lower 0) : H) : G)) (s + 1)) = + Nat.card (F.lower 0) + + (∑ tau : F.lower 0, (F.truncatedLowerDepth m tau : ℝ)) + + (s - m) * Nat.card (F.lower (m + 1)) + simp_rw [truncate_depth_eq_intrinsic_summand D H m hms hsm] + have hindicator : + (∑ tau : F.lower 0, + (if (tau : H) ∈ F.lower (m + 1) then (1 : ℝ) else 0)) = + Nat.card (F.lower (m + 1)) := by + exact_mod_cast (F.card_lower_succ_eq_sum_indicator m).symm + change Finset.sum Finset.univ (fun tau : F.lower 0 => + (1 : ℝ) + (F.truncatedLowerDepth m tau : ℝ) + + (s - m) * (if (tau : H) ∈ F.lower (m + 1) then 1 else 0)) = _ + rw [Finset.sum_add_distrib, Finset.sum_add_distrib] + rw [← Finset.mul_sum, hindicator] + simp + +/-- The Herbrand-function sum formula for an abstract nonarchimedean depth, in the form used +to compare the subgroup Herbrand parameter with a normalized depth sum. -/ +private theorem depth_herbrandFunction_add_one_eq_average + {G : Type*} [Group G] [Finite G] + (D : NonarchimedeanDepth G) (H : Subgroup G) [H.Normal] + {s : ℝ} (hs : -1 ≤ s) : + (D.depthLowerFiltration H).herbrandFunction s + 1 = + (1 / D.depthRamificationIndex H : ℝ) * + ∑ tau : H, truncateENatAtDVF (D.depth (tau : G)) (s + 1) := by + classical + let := Fintype.ofFinite G + classical + let F := D.depthLowerFiltration H + change + (herbrandFunction + F) s + 1 = + (1 / (Nat.card (F.lower 0) : ℝ)) * + ∑ tau : H, truncateENatAtDVF (D.depth (tau : G)) (s + 1) + have he : (Nat.card (F.lower 0) : ℝ) ≠ 0 := by + exact_mod_cast (show 0 < Nat.card (F.lower 0) from Finite.card_pos).ne' + rw [sum_truncate_depth_eq_sum_lower_zero D H hs] + by_cases hs0 : 0 ≤ s + · let m := ⌊s⌋₊ + have hms : (m : ℝ) ≤ s := Nat.floor_le hs0 + have hsm : s ≤ m + 1 := (Nat.lt_floor_add_one s).le + rw [sum_lower_zero_truncate_depth_eq_intrinsic D H m hms hsm] + rw [F.herbrandFunction_eq_depth_sum_of_mem_Icc m hms hsm] + field_simp + ring + · have hsle : s ≤ 0 := le_of_not_ge hs0 + rw [(herbrandFunction_of_nonpos F) hsle] + have hpoint : ∀ tau : F.lower 0, + truncateENatAtDVF (D.depth (((tau : F.lower 0) : H) : G)) (s + 1) = + s + 1 := by + intro tau + exact truncateENatAtDVF_eq_right_of_natCast_le + (m := 1) (by + norm_num + linarith) tau.property + simp_rw [hpoint] + simp only [Finset.sum_const, nsmul_eq_mul] + rw [Finset.card_univ, ← Nat.card_eq_fintype_card] + change s + 1 = (1 / (Nat.card (F.lower 0) : ℝ)) * + (Nat.card (F.lower 0) * (s + 1)) + field_simp + +private theorem truncate_min_coe_eq_of_le + {i : ℕ∞} {m : ℕ} {r : ℝ} (hr : r ≤ m) : + truncateENatAtDVF (min i (m : ℕ∞)) r = truncateENatAtDVF i r := by + induction i using ENat.recTopCoe with + | top => + simp only [min_top_left, truncateENatAtDVF_top, + truncateENatAtDVF_coe] + exact min_eq_right hr + | coe n => + have hmin : min (n : ℕ∞) (m : ℕ∞) = ((min n m : ℕ) : ℕ∞) := by + norm_cast + rw [hmin, truncateENatAtDVF_coe, truncateENatAtDVF_coe] + push_cast + rw [min_assoc, min_eq_right hr] + +/-- Truncating a nontrivial quotient-fibre average at the subgroup Herbrand +parameter equals the normalized sum of the truncated ambient depths. -/ +private theorem min_quotientFiberAverage_eq_average_truncate + {G : Type*} [Group G] [Fintype G] + (D : NonarchimedeanDepth G) (H : Subgroup G) [H.Normal] + {q : G ⧸ H} (hq : q ≠ 1) {s : ℝ} (hs : -1 ≤ s) : + min (D.quotientFiberAverage H hq) + ((D.depthLowerFiltration H).herbrandFunction s + 1) = + (1 / D.depthRamificationIndex H : ℝ) * + ∑ gamma : NonarchimedeanDepth.QuotientFiber H q, + truncateENatAtDVF (D.depth (gamma : G)) (s + 1) := by + classical + obtain ⟨sigma, hsigmaq, hmax⟩ := D.exists_maximal_depth_representative H hq + let m := D.quotientFiberDepth H hq ⟨sigma, hsigmaq⟩ + have hdepth : D.depth sigma = WithTop.some m := + (D.coe_quotientFiberDepth H hq ⟨sigma, hsigmaq⟩).symm + have havg : D.quotientFiberAverage H hq - 1 = + (D.depthLowerFiltration H).herbrandFunction ((m : ℝ) - 1) := by + simpa [m] using + D.quotientFiberAverage_sub_one_eq_herbrandFunction_of_maximal + H hq hsigmaq hmax + have he : (D.depthRamificationIndex H : ℝ) ≠ 0 := by + exact_mod_cast + (show 0 < Nat.card ((D.depthLowerFiltration H).lower 0) from + Finite.card_pos).ne' + by_cases hms : (m : ℝ) - 1 ≤ s + · have heta : + (D.depthLowerFiltration H).herbrandFunction ((m : ℝ) - 1) ≤ + (D.depthLowerFiltration H).herbrandFunction s := + (D.depthLowerFiltration H).herbrandFunction_strictMono.monotone hms + rw [min_eq_left (by linarith [havg, heta])] + have hpoint : ∀ gamma : NonarchimedeanDepth.QuotientFiber H q, + truncateENatAtDVF (D.depth (gamma : G)) (s + 1) = + (D.quotientFiberDepth H hq gamma : ℝ) := by + intro gamma + have hle : D.depth (gamma : G) ≤ D.depth sigma := + hmax gamma gamma.property + rw [hdepth] at hle + have hnat : D.quotientFiberDepth H hq gamma ≤ m := by + apply WithTop.coe_le_coe.mp + calc + WithTop.some (D.quotientFiberDepth H hq gamma) = + D.depth (gamma : G) := + D.coe_quotientFiberDepth H hq gamma + _ ≤ WithTop.some m := hle + have hbound : + (D.quotientFiberDepth H hq gamma : ℝ) ≤ s + 1 := + (show (D.quotientFiberDepth H hq gamma : ℝ) ≤ (m : ℝ) by + exact_mod_cast hnat) |>.trans (by linarith) + calc + truncateENatAtDVF (D.depth (gamma : G)) (s + 1) = + truncateENatAtDVF + (D.quotientFiberDepth H hq gamma : ℕ∞) (s + 1) := + congrArg + (fun i : ℕ∞ => truncateENatAtDVF i (s + 1)) + (D.coe_quotientFiberDepth H hq gamma).symm + _ = min (D.quotientFiberDepth H hq gamma : ℝ) (s + 1) := + truncateENatAtDVF_coe _ _ + _ = (D.quotientFiberDepth H hq gamma : ℝ) := + min_eq_left hbound + rw [NonarchimedeanDepth.quotientFiberAverage] + rw [show (∑ gamma : NonarchimedeanDepth.QuotientFiber H q, + (D.quotientFiberDepth H hq gamma : ℝ)) = + ∑ gamma : NonarchimedeanDepth.QuotientFiber H q, + truncateENatAtDVF (D.depth (gamma : G)) (s + 1) by + apply Finset.sum_congr rfl + intro gamma _ + exact (hpoint gamma).symm] + ring + · have hsm : s ≤ (m : ℝ) - 1 := le_of_not_ge hms + have heta : + (D.depthLowerFiltration H).herbrandFunction s ≤ + (D.depthLowerFiltration H).herbrandFunction ((m : ℝ) - 1) := + (D.depthLowerFiltration H).herbrandFunction_strictMono.monotone hsm + rw [min_eq_right (by linarith [havg, heta])] + let trunc : WithTop ℕ → ℝ := fun i => + truncateENatAtDVF i (s + 1) + have hsum := D.sum_depth_quotientFiber_eq_sum_min_of_maximal_representative + H trunc + (by + intro gamma hgamma + exact hmax gamma (hgamma.trans hsigmaq)) + rw [hsigmaq] at hsum + have hr : s + 1 ≤ (m : ℝ) := by linarith + have htrunc_min (tau : H) : + trunc (min (D.depth (tau : G)) (D.depth sigma)) = + trunc (D.depth (tau : G)) := by + change truncateENatAtDVF + (min (D.depth (tau : G)) (D.depth sigma)) (s + 1) = + truncateENatAtDVF (D.depth (tau : G)) (s + 1) + rw [hdepth] + exact truncate_min_coe_eq_of_le hr + have hsum' : + (∑ gamma : NonarchimedeanDepth.QuotientFiber H q, + truncateENatAtDVF (D.depth (gamma : G)) (s + 1)) = + ∑ tau : H, + truncateENatAtDVF (D.depth (tau : G)) (s + 1) := by + change (∑ gamma : NonarchimedeanDepth.QuotientFiber H q, + trunc (D.depth (gamma : G))) = + ∑ tau : H, trunc (D.depth (tau : G)) + calc + _ = ∑ tau : H, + trunc (min (D.depth (tau : G)) (D.depth sigma)) := hsum + _ = _ := by + apply Finset.sum_congr rfl + intro tau _ + exact htrunc_min tau + rw [hsum'] + exact depth_herbrandFunction_add_one_eq_average D H hs + +private theorem subgroupFiltration_lower_eq_depthLowerFiltration_dvf + [Algebra.IsSeparable base.residueField target.residueField] + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) (n : ℕ) : + ((lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq).subgroupFiltration H).lower n = + ((ramificationNumberDepthOfUniqueExtension + (base := base) (target := target) huniq).depthLowerFiltration H).lower n := by + ext tau + change ((tau : H) : Gal(L/K)) ∈ + lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ) ↔ + (((n + 1 : ℕ) : ℕ∞) ≤ + intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq ((tau : H) : Gal(L/K))) + exact mem_lowerRamificationGroup_nat_iff_intrinsicRamificationNumberOfUniqueExtension_ge + (base := base) (target := target) huniq n ((tau : H) : Gal(L/K)) + +private theorem fixedFieldSubextension_herbrandFunction_eq_depth_dvf + [Algebra.IsSeparable base.residueField target.residueField] + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] (s : ℝ) : + (fixedFieldSubextensionFiltration + (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq) H).herbrandFunction s = + ((ramificationNumberDepthOfUniqueExtension + (base := base) (target := target) huniq).depthLowerFiltration H).herbrandFunction s := by + rw [fixedFieldSubextension_herbrandFunction] + apply + ((lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq).subgroupFiltration + H).herbrandFunction_eq_of_card_lower_eq + ((ramificationNumberDepthOfUniqueExtension + (base := base) (target := target) huniq).depthLowerFiltration H) + intro n + rw [subgroupFiltration_lower_eq_depthLowerFiltration_dvf + (base := base) (target := target) huniq H n] + +private theorem card_fixedFieldSubextension_lower_eq_depth_dvf + [Algebra.IsSeparable base.residueField target.residueField] + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] (n : ℕ) : + Nat.card ((fixedFieldSubextensionFiltration + (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq) H).lower n) = + Nat.card (((ramificationNumberDepthOfUniqueExtension + (base := base) (target := target) huniq).depthLowerFiltration H).lower n) := by + change Nat.card + ((((lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq).subgroupFiltration H).transportEquiv + (IntermediateField.subgroupEquivAlgEquiv H)).lower n) = _ + rw [AntitoneNormalSubgroupFiltration.card_lower_transportEquiv + ((lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq).subgroupFiltration H) + (IntermediateField.subgroupEquivAlgEquiv H) n] + rw [subgroupFiltration_lower_eq_depthLowerFiltration_dvf + (base := base) (target := target) huniq H n] +private theorem fixedFieldRamificationNumber_untop_eq_quotientFiberAverage + [Algebra.IsSeparable base.residueField target.residueField] + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] + (sigma : Gal(L/K)) (hq : QuotientGroup.mk' H sigma ≠ 1) : + ∃ hfinite : + fixedFieldRamificationNumber + (base := base) (target := target) huniq H + (IsGalois.normalAutEquivQuotient H sigma) ≠ ⊤, + ((fixedFieldRamificationNumber + (base := base) (target := target) huniq H + (IsGalois.normalAutEquivQuotient H sigma)).untop hfinite : ℝ) = + (ramificationNumberDepthOfUniqueExtension + (base := base) (target := target) huniq).quotientFiberAverage H hq := by + classical + let D := ramificationNumberDepthOfUniqueExtension + (base := base) (target := target) huniq + let iM := fixedFieldRamificationNumber + (base := base) (target := target) huniq H + (IsGalois.normalAutEquivQuotient H sigma) + let S := ∑ gamma : NonarchimedeanDepth.QuotientFiber + H (QuotientGroup.mk' H sigma), D.quotientFiberDepth H hq gamma + have hcoset : + intrinsicCosetRamificationNumberSum + (base := base) (target := target) huniq H sigma = + (S : ℕ∞) := by + unfold intrinsicCosetRamificationNumberSum + calc + (∑ tau : H, + intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq (sigma * tau)) = + ∑ gamma : NonarchimedeanDepth.QuotientFiber + H (QuotientGroup.mk' H sigma), + (D.quotientFiberDepth H hq gamma : ℕ∞) := by + apply Fintype.sum_equiv + (NonarchimedeanDepth.rightCosetEquivQuotientFiber H sigma) + intro tau + exact (D.coe_quotientFiberDepth H hq + ((NonarchimedeanDepth.rightCosetEquivQuotientFiber H sigma) tau)).symm + _ = (S : ℕ∞) := by + dsimp [S] + norm_cast + have hprop := ramificationIndex_nsmul_fixedFieldRamificationNumber_eq_cosetSum + (base := base) (target := target) huniq H sigma + rw [fixedFieldRamificationIndex_eq_card_depthLowerFiltration_zero + (base := base) (target := target) huniq H, hcoset] at hprop + change D.depthRamificationIndex H • iM = (S : ℕ∞) at hprop + have hfinite : iM ≠ ⊤ := by + intro htop + have hcontra := hprop + rw [htop] at hcontra + have hpos : D.depthRamificationIndex H ≠ 0 := + (show 0 < Nat.card ((D.depthLowerFiltration H).lower 0) from + Finite.card_pos).ne' + simp [hpos] at hcontra + refine ⟨hfinite, ?_⟩ + let m := iM.untop hfinite + have hiM : (m : ℕ∞) = iM := WithTop.coe_untop iM hfinite + rw [← hiM] at hprop + have hnat : D.depthRamificationIndex H * m = S := by + have hcast : ((D.depthRamificationIndex H * m : ℕ) : ℕ∞) = (S : ℕ∞) := by + simpa [nsmul_eq_mul] using hprop + exact_mod_cast hcast + change (m : ℝ) = D.quotientFiberAverage H hq + rw [NonarchimedeanDepth.quotientFiberAverage] + change (m : ℝ) = + (∑ gamma : NonarchimedeanDepth.QuotientFiber + H (QuotientGroup.mk' H sigma), + (D.quotientFiberDepth H hq gamma : ℝ)) / + D.depthRamificationIndex H + rw [show (∑ gamma : NonarchimedeanDepth.QuotientFiber + H (QuotientGroup.mk' H sigma), + (D.quotientFiberDepth H hq gamma : ℝ)) = (S : ℝ) by + exact_mod_cast rfl] + rw [← hnat] + have he : (D.depthRamificationIndex H : ℝ) ≠ 0 := by + exact_mod_cast + (show 0 < Nat.card ((D.depthLowerFiltration H).lower 0) from + Finite.card_pos).ne' + field_simp + norm_num [Nat.cast_mul, mul_comm] + +/-- The Herbrand quotient theorem over the stated discretely valued field hypotheses +hypotheses. The image of the ambient lower group is the lower group of the +actual fixed extension at the subgroup Herbrand parameter. -/ +theorem lowerRamificationGroup_quotient + [Algebra.IsSeparable base.residueField target.residueField] + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] (s : ℝ) : + Subgroup.map (QuotientGroup.mk' H) + (lowerRamificationGroup + (base := base) (target := target) huniq s) = + Subgroup.comap (IsGalois.normalAutEquivQuotient H).toMonoidHom + (fixedFieldLowerRamificationGroup + (base := base) (target := target) huniq H + ((fixedFieldSubextensionFiltration + (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq) H).herbrandFunction s)) := by + classical + let D := ramificationNumberDepthOfUniqueExtension + (base := base) (target := target) huniq + let F := lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq + have hetaSub (r : ℝ) : + (fixedFieldSubextensionFiltration F H).herbrandFunction r = + (D.depthLowerFiltration H).herbrandFunction r := by + rw [fixedFieldSubextension_herbrandFunction] + apply (F.subgroupFiltration H).herbrandFunction_eq_of_card_lower_eq + (D.depthLowerFiltration H) + intro n + have hlevel : + (F.subgroupFiltration H).lower n = + (D.depthLowerFiltration H).lower n := by + ext tau + change ((tau : H) : Gal(L/K)) ∈ + lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ) ↔ + (((n + 1 : ℕ) : ℕ∞) ≤ + intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq ((tau : H) : Gal(L/K))) + exact mem_lowerRamificationGroup_nat_iff_intrinsicRamificationNumberOfUniqueExtension_ge + (base := base) (target := target) huniq n ((tau : H) : Gal(L/K)) + rw [hlevel] + ext q + by_cases hq : q = 1 + · subst q + simp + · obtain ⟨sigma, hsigmaq, hmax⟩ := + D.exists_maximal_depth_representative H hq + subst q + have hsigmaq : + QuotientGroup.mk' H sigma = QuotientGroup.mk' H sigma := rfl + let m := D.quotientFiberDepth H hq ⟨sigma, hsigmaq⟩ + have hdepth : (m : ℕ∞) = D.depth sigma := + D.coe_quotientFiberDepth H hq ⟨sigma, hsigmaq⟩ + have hleft : + QuotientGroup.mk' H sigma ∈ + Subgroup.map (QuotientGroup.mk' H) + (lowerRamificationGroup + (base := base) (target := target) huniq s) ↔ + realRamificationExponent s ≤ m := by + constructor + · rintro ⟨gamma, hgamma, hgammaq⟩ + have hgammaDepth : + (realRamificationExponent s : ℕ∞) ≤ D.depth gamma := by + change (realRamificationExponent s : ℕ∞) ≤ + intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq gamma + exact (mem_lowerRamificationGroup_iff_ramificationNumber_dvf + (base := base) (target := target) huniq s gamma).1 hgamma + have hle : D.depth gamma ≤ D.depth sigma := + hmax gamma hgammaq + have : (realRamificationExponent s : ℕ∞) ≤ (m : ℕ∞) := by + rw [hdepth] + exact hgammaDepth.trans hle + exact_mod_cast this + · intro hm + refine ⟨sigma, ?_, hsigmaq⟩ + apply (mem_lowerRamificationGroup_iff_ramificationNumber_dvf + (base := base) (target := target) huniq s sigma).2 + change (realRamificationExponent s : ℕ∞) ≤ D.depth sigma + rw [← hdepth] + exact_mod_cast hm + obtain ⟨hfinite, havg⟩ := + fixedFieldRamificationNumber_untop_eq_quotientFiberAverage + (base := base) (target := target) huniq H sigma hq + have hright : + QuotientGroup.mk' H sigma ∈ + Subgroup.comap (IsGalois.normalAutEquivQuotient H).toMonoidHom + (fixedFieldLowerRamificationGroup + (base := base) (target := target) huniq H + ((fixedFieldSubextensionFiltration F H).herbrandFunction s)) ↔ + s ≤ (m : ℝ) - 1 := by + simp only [Subgroup.mem_comap] + change IsGalois.normalAutEquivQuotient H sigma ∈ + fixedFieldLowerRamificationGroup + (base := base) (target := target) huniq H + ((fixedFieldSubextensionFiltration F H).herbrandFunction s) ↔ _ + rw [mem_fixedFieldLowerRamificationGroup_iff_ramificationNumber] + let iM := fixedFieldRamificationNumber + (base := base) (target := target) huniq H + (IsGalois.normalAutEquivQuotient H sigma) + let k := iM.untop hfinite + have hcoe : (k : ℕ∞) = iM := WithTop.coe_untop iM hfinite + change (realRamificationExponent + ((fixedFieldSubextensionFiltration F H).herbrandFunction s) : ℕ∞) ≤ + iM ↔ _ + rw [← hcoe, ENat.natCast_le_natCast] + rw [realRamificationExponent_le_iff_add_one_le_dvf] + rw [havg, hetaSub] + have havgMax := + D.quotientFiberAverage_sub_one_eq_herbrandFunction_of_maximal + H hq hsigmaq hmax + change (D.depthLowerFiltration H).herbrandFunction s + 1 ≤ + D.quotientFiberAverage H hq ↔ s ≤ (m : ℝ) - 1 + rw [show + (D.depthLowerFiltration H).herbrandFunction s + 1 ≤ + D.quotientFiberAverage H hq ↔ + (D.depthLowerFiltration H).herbrandFunction s ≤ + D.quotientFiberAverage H hq - 1 by + constructor <;> intro h <;> linarith] + rw [havgMax] + exact (D.depthLowerFiltration H).herbrandFunction_strictMono.le_iff_le + rw [hleft, hright] + rw [realRamificationExponent_le_iff_add_one_le_dvf] + constructor <;> intro h <;> linarith + + + +/-- The quotient-filtration comparison over the stated discretely valued field hypotheses +hypotheses: Herbrand eta is transitive in the actual fixed-field tower. -/ +private theorem herbrandFunction_trans_of_neg_one_le + [Algebra.IsSeparable base.residueField target.residueField] + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] + {s : ℝ} (hs : -1 ≤ s) : + herbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq s = + fixedFieldHerbrandFunction + (base := base) (target := target) huniq H + ((fixedFieldSubextensionFiltration + (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq) H).herbrandFunction s) := by + classical + let : Fintype Gal(L/K) := Fintype.ofFinite _ + let : Fintype (Gal(L/K) ⧸ H) := Fintype.ofFinite _ + let F := lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq + let D := ramificationNumberDepthOfUniqueExtension + (base := base) (target := target) huniq + let t := (fixedFieldSubextensionFiltration F H).herbrandFunction s + let e0 := Nat.card (F.lower 0) + let e1 := Nat.card ((fixedFieldLowerRamificationFiltration + (base := base) (target := target) huniq H).lower 0) + let e2 := D.depthRamificationIndex H + have ht : -1 ≤ t := + ((fixedFieldSubextensionFiltration F H).herbrandFunction_mem_Ici_neg_one_iff).2 hs + have heta2 : (D.depthLowerFiltration H).herbrandFunction s = t := by + simpa [F, D, t] using + (fixedFieldSubextension_herbrandFunction_eq_depth_dvf + (base := base) (target := target) huniq H s).symm + have hcard2 : + Nat.card ((fixedFieldSubextensionFiltration F H).lower 0) = e2 := by + simpa [F, D, e2, NonarchimedeanDepth.depthRamificationIndex] using + card_fixedFieldSubextension_lower_eq_depth_dvf + (base := base) (target := target) huniq H 0 + have hquot0 : + (fixedFieldQuotientImageFiltration F H).lower 0 = + (fixedFieldLowerRamificationFiltration + (base := base) (target := target) huniq H).lower 0 := by + change + (F.quotientImageTransport H + (IsGalois.normalAutEquivQuotient H)).lower 0 = _ + apply (F.quotientImageTransport_lower_eq_iff H + (IsGalois.normalAutEquivQuotient H) 0 _).2 + simpa [F] using + lowerRamificationGroup_quotient + (base := base) (target := target) huniq H 0 + have hfactor := + card_fixedFieldSubextension_mul_card_fixedFieldQuotientImage F H 0 + rw [hcard2, hquot0] at hfactor + have hetower : e0 = e1 * e2 := by + simpa [e0, e1, Nat.mul_comm] using hfactor.symm + have he0 : (e0 : ℝ) ≠ 0 := by + exact_mod_cast (show 0 < e0 by + dsimp [e0] + exact Finite.card_pos).ne' + have he1 : (e1 : ℝ) ≠ 0 := by + exact_mod_cast (show 0 < e1 by + dsimp [e1] + exact Finite.card_pos).ne' + have he2 : (e2 : ℝ) ≠ 0 := by + exact_mod_cast (show 0 < e2 by + dsimp [e2] + exact Finite.card_pos).ne' + have hpoint : ∀ q : Gal(L/K) ⧸ H, + truncateENatAtDVF + (fixedFieldRamificationNumber + (base := base) (target := target) huniq H + (IsGalois.normalAutEquivQuotient H q)) (t + 1) = + (1 / e2 : ℝ) * + ∑ gamma : NonarchimedeanDepth.QuotientFiber H q, + truncateENatAtDVF (D.depth (gamma : Gal(L/K))) (s + 1) := by + intro q + by_cases hq : q = 1 + · subst q + rw [map_one] + have hone : + fixedFieldRamificationNumber + (base := base) (target := target) huniq H 1 = ⊤ := by + rw [ENat.eq_top_iff_forall_ge] + intro m + cases m with + | zero => exact bot_le + | succ n => + rw [← mem_fixedFieldLowerRamificationGroup_nat_iff + (base := base) (target := target) huniq H n 1] + exact Subgroup.one_mem _ + rw [hone, truncateENatAtDVF_top, ← heta2] + change (D.depthLowerFiltration H).herbrandFunction s + 1 = + (1 / D.depthRamificationIndex H : ℝ) * + ∑ gamma : NonarchimedeanDepth.QuotientFiber H 1, + truncateENatAtDVF (D.depth (gamma : Gal(L/K))) (s + 1) + rw [depth_herbrandFunction_add_one_eq_average D H hs] + congr 1 + have hsumOne : + (∑ tau : H, + truncateENatAtDVF + (D.depth ((1 : Gal(L/K)) * (tau : Gal(L/K)))) (s + 1)) = + ∑ gamma : NonarchimedeanDepth.QuotientFiber H + (QuotientGroup.mk' H (1 : Gal(L/K))), + truncateENatAtDVF + (D.depth (gamma : Gal(L/K))) (s + 1) := + (NonarchimedeanDepth.sum_quotientFiber_eq_sum_subgroup H + (fun sigma => truncateENatAtDVF (D.depth sigma) (s + 1)) + (1 : Gal(L/K))).symm + convert hsumOne using 1 + · simp only [one_mul] + · rfl + · obtain ⟨sigma, rfl⟩ := QuotientGroup.mk'_surjective H q + obtain ⟨hfinite, havg⟩ := + fixedFieldRamificationNumber_untop_eq_quotientFiberAverage + (base := base) (target := target) huniq H sigma hq + rw [← WithTop.coe_untop + (fixedFieldRamificationNumber + (base := base) (target := target) huniq H + (IsGalois.normalAutEquivQuotient H (QuotientGroup.mk' H sigma))) + hfinite] + change min + ((fixedFieldRamificationNumber + (base := base) (target := target) huniq H + (IsGalois.normalAutEquivQuotient H + (sigma : Gal(L/K) ⧸ H))).untop hfinite : ℝ) (t + 1) = _ + rw [havg, ← heta2] + change min (D.quotientFiberAverage H hq) + ((D.depthLowerFiltration H).herbrandFunction s + 1) = + (1 / D.depthRamificationIndex H : ℝ) * + ∑ gamma : NonarchimedeanDepth.QuotientFiber + H (QuotientGroup.mk' H sigma), + truncateENatAtDVF (D.depth (gamma : Gal(L/K))) (s + 1) + exact min_quotientFiberAverage_eq_average_truncate D H hq hs + have hsum : + (∑ alpha : Gal((fixedFieldDVF (K := K) H)/K), + truncateENatAtDVF + (fixedFieldRamificationNumber + (base := base) (target := target) huniq H alpha) (t + 1)) = + (1 / e2 : ℝ) * + ∑ sigma : Gal(L/K), + truncateENatAtDVF (D.depth sigma) (s + 1) := by + calc + _ = ∑ q : Gal(L/K) ⧸ H, + truncateENatAtDVF + (fixedFieldRamificationNumber + (base := base) (target := target) huniq H + (IsGalois.normalAutEquivQuotient H q)) (t + 1) := + (Equiv.sum_comp (IsGalois.normalAutEquivQuotient H).toEquiv _).symm + _ = ∑ q : Gal(L/K) ⧸ H, + (1 / e2 : ℝ) * + ∑ gamma : NonarchimedeanDepth.QuotientFiber H q, + truncateENatAtDVF (D.depth (gamma : Gal(L/K))) (s + 1) := by + apply Finset.sum_congr rfl + intro q _ + exact hpoint q + _ = (1 / e2 : ℝ) * + ∑ q : Gal(L/K) ⧸ H, + ∑ gamma : NonarchimedeanDepth.QuotientFiber H q, + truncateENatAtDVF (D.depth (gamma : Gal(L/K))) (s + 1) := by + rw [Finset.mul_sum] + _ = _ := by + congr 1 + exact NonarchimedeanDepth.sum_quotientFiber H + (fun sigma => truncateENatAtDVF (D.depth sigma) (s + 1)) + have h0 := herbrandFunctionOfUniqueExtension_eq_intrinsicRamificationNumber_sum + (base := base) (target := target) huniq hs + have h1 := fixedField_herbrandFunction_formula_dvf + (base := base) (target := target) huniq H ht + change herbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq s = + fixedFieldHerbrandFunction + (base := base) (target := target) huniq H t + rw [h0, h1, hsum] + change (1 / (e0 : ℝ)) * + (∑ sigma : Gal(L/K), + truncateENatAtDVF (D.depth sigma) (s + 1)) - 1 = + (1 / (e1 : ℝ)) * + ((1 / (e2 : ℝ)) * + ∑ sigma : Gal(L/K), + truncateENatAtDVF (D.depth sigma) (s + 1)) - 1 + rw [hetower] + push_cast + field_simp + + +/-- States the theorem `herbrandFunction_trans`. -/ +theorem herbrandFunction_trans + [Algebra.IsSeparable base.residueField target.residueField] + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] (s : ℝ) : + herbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq s = + fixedFieldHerbrandFunction + (base := base) (target := target) huniq H + ((fixedFieldSubextensionFiltration + (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq) H).herbrandFunction s) := by + by_cases hs : -1 ≤ s + · exact herbrandFunction_trans_of_neg_one_le + (base := base) (target := target) huniq H hs + · have hs0 : s ≤ 0 := by linarith + let F := lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq + let Q := fixedFieldLowerRamificationFiltration + (base := base) (target := target) huniq H + let S := fixedFieldSubextensionFiltration F H + change + (herbrandFunction F) s = Q.herbrandFunction (S.herbrandFunction s) + rw [(herbrandFunction_of_nonpos F) hs0, + S.herbrandFunction_of_nonpos hs0, + Q.herbrandFunction_of_nonpos hs0] + +/-- The quotient-filtration comparison over the stated discretely valued field hypotheses +hypotheses: inverse Herbrand functions compose in reverse tower order. -/ +theorem inverseHerbrandFunction_trans + [Algebra.IsSeparable base.residueField target.residueField] + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] (t : ℝ) : + inverseHerbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq t = + (fixedFieldSubextensionFiltration + (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq) H).inverseHerbrandFunction + (fixedFieldInverseHerbrandFunction + (base := base) (target := target) huniq H t) := by + let F := lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq + let Q := fixedFieldLowerRamificationFiltration + (base := base) (target := target) huniq H + let S := fixedFieldSubextensionFiltration F H + have heta : ∀ s : ℝ, + (herbrandFunction F) s = Q.herbrandFunction (S.herbrandFunction s) := by + intro s + simpa [F, Q, S, fixedFieldHerbrandFunction] using + herbrandFunction_trans + (base := base) (target := target) huniq H s + change + (inverseHerbrandFunction F) t = S.inverseHerbrandFunction (Q.inverseHerbrandFunction t) + apply + (herbrandFunction_strictMono F).injective + rw [(herbrandFunction_inverseHerbrandFunction F)] + rw [heta] + rw [S.herbrandFunction_inverseHerbrandFunction, + Q.herbrandFunction_inverseHerbrandFunction] + +/-- The tower-filtration comparison over the stated discretely valued field hypotheses +hypotheses: upper numbering is invariant under a Galois quotient. -/ +theorem upperRamificationGroup_quotient + [Algebra.IsSeparable base.residueField target.residueField] + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] (t : ℝ) : + Subgroup.map (QuotientGroup.mk' H) + (upperRamificationGroupOfUniqueExtension + (base := base) (target := target) huniq t) = + Subgroup.comap (IsGalois.normalAutEquivQuotient H).toMonoidHom + (fixedFieldUpperRamificationGroup + (base := base) (target := target) huniq H t) := by + unfold upperRamificationGroupOfUniqueExtension + unfold fixedFieldUpperRamificationGroup + have h107 := lowerRamificationGroup_quotient + (base := base) (target := target) huniq H + (inverseHerbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq t) + have hparam : + (fixedFieldSubextensionFiltration + (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq) H).herbrandFunction + (inverseHerbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq t) = + fixedFieldInverseHerbrandFunction + (base := base) (target := target) huniq H t := by + rw [inverseHerbrandFunction_trans + (base := base) (target := target) huniq H t] + exact + (fixedFieldSubextensionFiltration + (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq) H).herbrandFunction_inverseHerbrandFunction _ + rw [hparam] at h107 + exact h107 +end Higher +end RamificationTheory.HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRamificationCard.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRamificationCard.lean new file mode 100644 index 0000000000..8d59e658f6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRamificationCard.lean @@ -0,0 +1,100 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.ValuedGalois +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CompleteDVF +/-! +# Inertia cardinality and the ramification index + +For a finite Galois extension of complete discrete valuation fields, the +decomposition-side inertia subgroup has cardinality equal to the canonical +ramification index. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w x + +namespace RamificationTheory.HilbertRamification.CompleteDVF + +open ValuationTheory.DiscreteValuationField + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] +variable [FiniteDimensional K L] +variable (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) +variable [base.valuation.HasExtension target.valuation] + +/-- In a finite Galois extension of complete discrete valued fields, the +decomposition-side inertia subgroup has cardinality equal to the canonical +ramification index. -/ +theorem natCard_decompositionInertiaSubgroup_eq_ramificationIndex + [IsGalois K L] + [Algebra.IsSeparable + (base.valuationSubring ⧸ base.maximalIdeal) + (target.valuationSubring ⧸ target.maximalIdeal)] : + Nat.card (target.valuation.valuationSubring.inertiaSubgroup K) = + ValuedExtension.ramificationIndex base.toDVF target.toDVF := by + let : IsScalarTower base.valuationSubring target.valuationSubring L := + Valuation.valuationSubring_isScalarTower_of_hasExtension + base.valuation target.valuation + let : Module.Finite base.valuationSubring target.valuationSubring := + ValuedExtension.moduleFinite_target_valuationSubring_of_finite_separable + base target + let : MulSemiringAction (L ≃ₐ[K] L) target.valuationSubring := by + change MulSemiringAction (L ≃ₐ[K] L) target.valuation.valuationSubring + exact MulSemiringAction.compHom (R := target.valuation.valuationSubring) + (galEquivDecompositionGroup + (base := base) (target := target)).toMonoidHom + let : SMulDistribClass (L ≃ₐ[K] L) target.valuationSubring L := + { smul_distrib_smul := by + intro sigma r z + change sigma ((r : L) * z) = sigma (r : L) * sigma z + rw [map_mul] } + let : IsGaloisGroup (L ≃ₐ[K] L) + base.valuationSubring target.valuationSubring := + IsGaloisGroup.of_isFractionRing (L ≃ₐ[K] L) + base.valuationSubring target.valuationSubring K L + have hIdealInertia : + target.maximalIdeal.toAddSubgroup.inertia (L ≃ₐ[K] L) = + inertiaGroup (K := K) (base := base) (target := target) := by + ext sigma + rw [mem_inertiaGroup_iff] + rw [← maximalIdealInertia_eq_decompositionInertia + (K := K) (target := target)] + rfl + have hFullCard : + Nat.card (inertiaGroup (K := K) (base := base) (target := target)) = + ValuedExtension.ramificationIndex base.toDVF target.toDVF := by + rw [← hIdealInertia] + exact + ValuedExtension.card_inertia_eq_ramificationIndex_of_finite_separable + base target (L ≃ₐ[K] L) + have hMap := + inertiaGroup_map_galEquivDecompositionGroup + (K := K) (base := base) (target := target) + calc + Nat.card (target.valuation.valuationSubring.inertiaSubgroup K) = + Nat.card + (Subgroup.map + (galEquivDecompositionGroup + (base := base) (target := target)).toMonoidHom + (inertiaGroup (K := K) (base := base) (target := target))) := by + rw [hMap] + _ = Nat.card + (inertiaGroup (K := K) (base := base) (target := target)) := + Subgroup.card_map_of_injective + (galEquivDecompositionGroup + (base := base) (target := target)).injective + _ = ValuedExtension.ramificationIndex base.toDVF target.toDVF := hFullCard + +end RamificationTheory.HilbertRamification.CompleteDVF + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRestrictionCard.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRestrictionCard.lean new file mode 100644 index 0000000000..19efe2de04 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRestrictionCard.lean @@ -0,0 +1,67 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Group.Subgroup.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionGroup +/-! +# Cardinality under inertia scalar restriction + +This is the finite-cardinality consequence of the inertia-subgroup cardinality formula used when +the base completion is identified with a concrete local field. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w + +namespace HilbertRamification +namespace ValuationSubring + +open RamificationTheory.HilbertRamification.ValuationSubring + +variable {K : Type u} {M : Type v} {L : Type w} +variable [Field K] [Field M] [Field L] +variable [Algebra K M] [Algebra M L] [Algebra K L] +variable [IsScalarTower K M L] + +/-- Restriction of scalars embeds the inertia group over an intermediate +base into the inertia group over the smaller base. -/ +theorem inertiaGroupRestrictScalars_injective + (A : _root_.ValuationSubring L) : + Function.Injective + (inertiaGroupRestrictScalars (K := K) (M := M) A) := by + intro σ τ hστ + apply Subtype.ext + apply Subtype.ext + apply decompositionGroupRestriction_restrictAutomorphismScalars_injective + (K := K) (M := M) (L := L) + simpa [inertiaGroupRestrictScalars, decompositionGroupRestrictScalars] using + congrArg + (fun ρ : inertiaGroup K A ↦ + (((ρ : decompositionGroup K A) : L ≃ₐ[K] L))) hστ + +/-- The inertia cardinality cannot increase when restricting scalars from +an intermediate base field. -/ +theorem natCard_inertiaGroup_le_restrictScalars + [FiniteDimensional K L] + (A : _root_.ValuationSubring L) : + Nat.card (inertiaGroup M A) ≤ Nat.card (inertiaGroup K A) := by + let : Finite (L ≃ₐ[K] L) := inferInstance + let : Finite (decompositionGroup K A) := inferInstance + let : Finite (inertiaGroup K A) := inferInstance + exact Nat.card_le_card_of_injective + (inertiaGroupRestrictScalars (K := K) (M := M) A) + (inertiaGroupRestrictScalars_injective (K := K) (M := M) A) + +end ValuationSubring +end HilbertRamification + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean new file mode 100644 index 0000000000..4ab616e995 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean @@ -0,0 +1,574 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.BaseChange +/-! +# Localization and decomposition comparison through density + +For an infinite algebraic extension, the canonical `L_w` is the algebraic +localization `L K_v`, not the whole metric completion. This file records the +density consequences needed to transport inertia and ramification conditions +between `L` and `L_w`. None of the results below assumes finite degree. +-/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.ResidueField renaming + residue_eq_residue_iff_sub_mem_maximalIdeal → + residue_eq_residue_iff_sub_mem_maximalIdeal + + +noncomputable +section + +universe u v + +namespace HilbertRamification +open RamificationTheory.HilbertRamification.ValuationSubring + +open AlgebraicNumberTheory.Valuations + +variable {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + +section AbsoluteValuePrincipalUnits + +variable {F : Type*} [Field F] + +/-- For the valuation subring attached to a nonarchimedean absolute value, +the ambient-field nonunits are exactly the open unit ball. -/ +theorem algebraicLocalizationDensity_mem_nonunits_iff_abs_lt_one + (a : AbsoluteValue F ℝ) (ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a) + (x : F) : + x ∈ (absoluteValueValuationSubring a ha).nonunits ↔ + a x < 1 := by + let A := absoluteValueValuationSubring a ha + change x ∈ A.nonunits ↔ a x < 1 + rw [A.mem_nonunits_iff_exists_mem_maximalIdeal] + constructor + · rintro ⟨hxA, hx⟩ + exact + (absoluteValueValuationSubring_mem_maximalIdeal_iff_abs_lt_one + a ha ⟨x, hxA⟩).mp hx + · intro hx + have hxA : x ∈ A := + (mem_absoluteValueValuationSubring_iff + a ha x).mpr hx.le + refine ⟨hxA, ?_⟩ + exact + (absoluteValueValuationSubring_mem_maximalIdeal_iff_abs_lt_one + a ha ⟨x, hxA⟩).mpr hx + +/-- Principal-unit membership in an absolute-value valuation subring is the +strict-unit inequality `|u - 1| < 1`. -/ +theorem algebraicLocalizationDensity_mem_principalUnitGroup_iff_abs_lt_one + (a : AbsoluteValue F ℝ) (ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a) + (x : Fˣ) : + x ∈ (absoluteValueValuationSubring a ha).principalUnitGroup ↔ + a ((x : F) - 1) < 1 := by + let A := absoluteValueValuationSubring a ha + change A.valuation ((x : F) - 1) < 1 ↔ a ((x : F) - 1) < 1 + rw [← A.mem_nonunits_iff, + algebraicLocalizationDensity_mem_nonunits_iff_abs_lt_one a ha] + +end AbsoluteValuePrincipalUnits + +namespace ValuationSubring + +/-- Inertia membership as the congruence `sigma x = x` modulo the maximal +ideal for every integral element. -/ +theorem mem_inertiaGroup_iff_sub_mem_nonunits + {F : Type*} {E : Type*} [Field F] [Field E] [Algebra F E] + (A : _root_.ValuationSubring E) (sigma : decompositionGroup F A) : + sigma ∈ inertiaGroup F A ↔ + ∀ x : A, + ((sigma : E ≃ₐ[F] E) (x : E) - (x : E)) ∈ A.nonunits := by + change residueAction F A sigma = 1 ↔ _ + constructor + · intro hsigma x + have happ := congrArg + (fun e : IsLocalRing.ResidueField A ≃+* IsLocalRing.ResidueField A ↦ + e (IsLocalRing.residue A x)) hsigma + change sigma • (IsLocalRing.residue A x) = + IsLocalRing.residue A x at happ + rw [← IsLocalRing.ResidueField.residue_smul, + residue_eq_residue_iff_sub_mem_maximalIdeal] + at happ + exact A.coe_mem_nonunits_iff.mpr happ + · intro hsigma + apply RingEquiv.ext + intro y + obtain ⟨x, rfl⟩ := IsLocalRing.residue_surjective y + change sigma • (IsLocalRing.residue A x) = + IsLocalRing.residue A x + rw [← IsLocalRing.ResidueField.residue_smul, + residue_eq_residue_iff_sub_mem_maximalIdeal] + exact A.coe_mem_nonunits_iff.mp (hsigma x) + +end ValuationSubring + +section Localization + +variable (vK : AbsoluteValue K ℝ) +variable (w : AbsoluteValueExtension vK L) + +/-- The completion at the extended absolute value is a `K`-algebra through the original +extension. -/ +local instance completionBaseAlgebra : Algebra K w.1.Completion := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + +/-- The action of `K` on the extended completion is induced by its completion algebra. -/ +local instance completionBaseSMul : SMul K w.1.Completion := + (AbsoluteValue.extensionCompletionAlgebra (K := K) w.1).toSMul + +/-- The completion at the extended absolute value is an algebra over the completed base field. -/ +local instance completionAlgebra : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + +/-- The algebraic localization of the extension inside its completed valued field. -/ +abbrev localization : IntermediateField vK.Completion w.1.Completion := + AbsoluteValue.algebraicLocalization vK w.1 w.2 + +/-- The canonical embedding of the extension into its algebraic localization. -/ +abbrev toLocalization : L →+* localization vK w := + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + +/-- The absolute value on the algebraic localization induced from the completed extension. -/ +abbrev localizationAbsoluteValue : + AbsoluteValue (localization vK w) ℝ := + AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 + +/-- The dense copy of `L` approximates every element of the algebraic +localization. This is the common source for residue and principal-unit +transport in the localization and decomposition comparison. -/ +theorem algebraicLocalizationDensity_localization_exists_close + (z : localization vK w) {epsilon : ℝ} (hepsilon : 0 < epsilon) : + ∃ x : L, + localizationAbsoluteValue vK w (z - toLocalization vK w x) < epsilon := by + obtain ⟨x, hx⟩ := + (AbsoluteValue.denseRange_toCompletion w.1).exists_dist_lt + (z : w.1.Completion) hepsilon + refine ⟨x, ?_⟩ + change ‖(z : w.1.Completion) - + AbsoluteValue.toCompletion w.1 x‖ < epsilon + simpa only [dist_eq_norm] using hx + +/-- Nonarchimedeanness passes from `w` to the absolute value on `L K_v`. +The bounded-natural-number definition makes this a direct consequence of +the restriction formula on the dense copy of `L`. -/ +theorem algebraicLocalizationDensity_localization_nonarchimedean + (hw : LubinTate.Valuations.NonarchimedeanAbsoluteValue w.1) : + LubinTate.Valuations.NonarchimedeanAbsoluteValue (localizationAbsoluteValue vK w) := by + rcases hw with ⟨C, hC⟩ + refine ⟨C, fun n ↦ ?_⟩ + have hrestrict := + AbsoluteValue.algebraicLocalizationAbsoluteValue_toAlgebraicLocalization vK w.1 w.2 (n : L) + simpa using hrestrict.trans_le (hC n) + +/-- The valuation subring of the original extension for its nonarchimedean absolute value. -/ +abbrev extensionValuationSubring + (hw : LubinTate.Valuations.NonarchimedeanAbsoluteValue w.1) : + _root_.ValuationSubring L := + absoluteValueValuationSubring w.1 hw + +/-- The valuation subring of the algebraic localization for the induced absolute value. -/ +abbrev localizationValuationSubring + (hw : LubinTate.Valuations.NonarchimedeanAbsoluteValue w.1) : + _root_.ValuationSubring (localization vK w) := + absoluteValueValuationSubring + (localizationAbsoluteValue vK w) + (algebraicLocalizationDensity_localization_nonarchimedean vK w hw) + +/-- The valuation subring on `L K_v` pulls back to the valuation subring on +`L`. This is the concrete valuation-ring square used by the conjugation and base-change law in +the localization specialization. -/ +theorem algebraicLocalizationDensity_localizationValuationSubring_comap + (hw : LubinTate.Valuations.NonarchimedeanAbsoluteValue w.1) : + (localizationValuationSubring vK w hw).comap (toLocalization vK w) = + extensionValuationSubring vK w hw := by + ext x + rw [_root_.ValuationSubring.mem_comap] + rw [mem_absoluteValueValuationSubring_iff, + mem_absoluteValueValuationSubring_iff, + AbsoluteValue.algebraicLocalizationAbsoluteValue_toAlgebraicLocalization] + +/-- Every automorphism of the algebraic localization over `K_v` preserves +its unique extended absolute value. This is the isometry source used when +transporting strict congruences from the dense copy of `L`. -/ +theorem algebraicLocalizationDensity_localizationAbsoluteValue_algEquiv + [Algebra.IsAlgebraic K L] + (hvK : vK.IsNontrivial) + (tau : localization vK w ≃ₐ[vK.Completion] localization vK w) + (z : localization vK w) : + localizationAbsoluteValue vK w (tau z) = + localizationAbsoluteValue vK w z := by + let aK := AbsoluteValue.completionAbsoluteValue vK + let aE := localizationAbsoluteValue vK w + let : Algebra.IsAlgebraic vK.Completion (localization vK w) := + AbsoluteValue.algebraicLocalization_isAlgebraic vK w.1 w.2 + let R := AbsoluteValue.uniqueAlgebraicExtension + (K := vK.Completion) (L := localization vK w) + aK + (AbsoluteValue.completionAbsoluteValue_complete vK) + (AbsoluteValue.completionAbsoluteValue_isNontrivial vK hvK) + have haE : aE = R.extension := by + apply R.unique + exact AbsoluteValue.algebraicLocalizationAbsoluteValue_extends vK w.1 w.2 + have htau : + aE.comp (f := tau.toRingEquiv.toRingHom) tau.injective = R.extension := by + apply R.unique + intro x + change aE (tau (algebraMap vK.Completion (localization vK w) x)) = aK x + rw [tau.commutes] + exact AbsoluteValue.algebraicLocalizationAbsoluteValue_extends vK w.1 w.2 x + calc + aE (tau z) = + (aE.comp (f := tau.toRingEquiv.toRingHom) tau.injective) z := rfl + _ = R.extension z := DFunLike.congr_fun htau z + _ = aE z := (DFunLike.congr_fun haE z).symm + +/-- Every integral element of `L K_v` has the same residue as an integral +element from `L`. The displayed strict inequality is the source form of +surjectivity on residue fields and avoids choosing a quotient model. -/ +theorem algebraicLocalizationDensity_localization_exists_residueRepresentative + (hw : LubinTate.Valuations.NonarchimedeanAbsoluteValue w.1) + (z : localizationValuationSubring vK w hw) : + ∃ x : extensionValuationSubring vK w hw, + localizationAbsoluteValue vK w + ((z : localization vK w) - + toLocalization vK w (x : L)) < 1 := by + obtain ⟨x, hx⟩ := + algebraicLocalizationDensity_localization_exists_close vK w + (z : localization vK w) (show (0 : ℝ) < 1 by norm_num) + let aE := localizationAbsoluteValue vK w + let hE := algebraicLocalizationDensity_localization_nonarchimedean vK w hw + have hstrong : LubinTate.Valuations.StrongTriangle aE := + LubinTate.Valuations.strong_triangle_of_nonarchimedean aE hE + have hz : aE (z : localization vK w) ≤ 1 := + (mem_absoluteValueValuationSubring_iff + aE hE (z : localization vK w)).mp z.property + have hxLocal : aE (toLocalization vK w x) ≤ 1 := by + calc + aE (toLocalization vK w x) = + aE ((z : localization vK w) + + -((z : localization vK w) - toLocalization vK w x)) := by + congr 1 + ring + _ ≤ max (aE (z : localization vK w)) + (aE (-((z : localization vK w) - toLocalization vK w x))) := + hstrong _ _ + _ = max (aE (z : localization vK w)) + (aE ((z : localization vK w) - toLocalization vK w x)) := by + rw [AbsoluteValue.map_neg] + _ ≤ 1 := max_le hz hx.le + have hxGlobal : w.1 x ≤ 1 := by + rw [← AbsoluteValue.algebraicLocalizationAbsoluteValue_toAlgebraicLocalization vK w.1 w.2 x] + exact hxLocal + let xA : extensionValuationSubring vK w hw := + ⟨x, + (mem_absoluteValueValuationSubring_iff + w.1 hw x).mpr hxGlobal⟩ + exact ⟨xA, hx⟩ + +/-- The difficult direction of inertia transport in the localization and decomposition comparison. +An automorphism of `L K_v` whose restriction is inertial on `L` is inertial +on the whole localization. Density supplies an integral representative of +each residue class. -/ +theorem algebraicLocalizationDensity_localization_mem_inertia_of_commutes + [Algebra.IsAlgebraic K L] + (hvK : vK.IsNontrivial) + (hw : LubinTate.Valuations.NonarchimedeanAbsoluteValue w.1) + (tau : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup vK.Completion + (localizationValuationSubring vK w hw)) + (sigma : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup K + (extensionValuationSubring vK w hw)) + (hcomm : ∀ x : L, + ((tau : localization vK w ≃ₐ[vK.Completion] localization vK w) + (toLocalization vK w x)) = + toLocalization vK w + ((sigma : L ≃ₐ[K] L) x)) + (hsigma : sigma ∈ RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup K + (extensionValuationSubring vK w hw)) : + tau ∈ RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup vK.Completion + (localizationValuationSubring vK w hw) := by + rw [ValuationSubring.mem_inertiaGroup_iff_sub_mem_nonunits] + intro z + rw [algebraicLocalizationDensity_mem_nonunits_iff_abs_lt_one] + obtain ⟨x, hx⟩ := + algebraicLocalizationDensity_localization_exists_residueRepresentative vK w hw z + let aE := localizationAbsoluteValue vK w + let hE := algebraicLocalizationDensity_localization_nonarchimedean vK w hw + let tauE : localization vK w ≃ₐ[vK.Completion] localization vK w := tau + let sigmaL : L ≃ₐ[K] L := sigma + let e : localization vK w := + (z : localization vK w) - toLocalization vK w (x : L) + have hstrong : LubinTate.Valuations.StrongTriangle aE := + LubinTate.Valuations.strong_triangle_of_nonarchimedean aE hE + have htau (y : localization vK w) : aE (tauE y) = aE y := + algebraicLocalizationDensity_localizationAbsoluteValue_algEquiv vK w hvK tauE y + have herror : aE (tauE e - e) < 1 := by + calc + aE (tauE e - e) = aE (tauE e + -e) := by rw [sub_eq_add_neg] + _ ≤ max (aE (tauE e)) (aE (-e)) := hstrong _ _ + _ = aE e := by rw [htau e, AbsoluteValue.map_neg, max_self] + _ < 1 := hx + have hglobalNonunit : + (sigmaL (x : L) - (x : L)) ∈ + (extensionValuationSubring vK w hw).nonunits := + (ValuationSubring.mem_inertiaGroup_iff_sub_mem_nonunits + (extensionValuationSubring vK w hw) sigma).mp hsigma x + have hglobal : w.1 (sigmaL (x : L) - (x : L)) < 1 := + (algebraicLocalizationDensity_mem_nonunits_iff_abs_lt_one w.1 hw _).mp hglobalNonunit + have hmain : + aE (tauE (toLocalization vK w (x : L)) - + toLocalization vK w (x : L)) < 1 := by + calc + aE (tauE (toLocalization vK w (x : L)) - + toLocalization vK w (x : L)) = + aE (toLocalization vK w (sigmaL (x : L)) - + toLocalization vK w (x : L)) := by rw [hcomm] + _ = aE (toLocalization vK w + (sigmaL (x : L) - (x : L))) := by + congr 1 + exact (map_sub (toLocalization vK w) (sigmaL (x : L)) (x : L)).symm + _ = w.1 (sigmaL (x : L) - (x : L)) := + AbsoluteValue.algebraicLocalizationAbsoluteValue_toAlgebraicLocalization vK w.1 w.2 _ + _ < 1 := hglobal + have hdecomp : + tauE (z : localization vK w) - (z : localization vK w) = + (tauE e - e) + + (tauE (toLocalization vK w (x : L)) - + toLocalization vK w (x : L)) := by + dsimp [e] + rw [map_sub] + ring + rw [hdecomp] + exact (hstrong _ _).trans_lt (max_lt herror hmain) + +/-- Every nonzero element of `L K_v` is congruent modulo principal units to +an element from `Lˣ`. The equality of absolute values is included because +it is the value-group transport used in the ramification argument. -/ +theorem algebraicLocalizationDensity_localization_exists_principalUnitRepresentative_abs + (hw : LubinTate.Valuations.NonarchimedeanAbsoluteValue w.1) + (z : (localization vK w)ˣ) : + ∃ x : Lˣ, + localizationAbsoluteValue vK w + (toLocalization vK w (x : L)) = + localizationAbsoluteValue vK w (z : localization vK w) ∧ + localizationAbsoluteValue vK w + ((z : localization vK w) / + toLocalization vK w (x : L) - 1) < 1 := by + let aE := localizationAbsoluteValue vK w + let hE := algebraicLocalizationDensity_localization_nonarchimedean vK w hw + have hstrong : LubinTate.Valuations.StrongTriangle aE := + LubinTate.Valuations.strong_triangle_of_nonarchimedean aE hE + have hz0 : (z : localization vK w) ≠ 0 := Units.ne_zero z + have hzpos : 0 < aE (z : localization vK w) := aE.pos hz0 + obtain ⟨y, hyClose⟩ := + algebraicLocalizationDensity_localization_exists_close vK w + (z : localization vK w) hzpos + change aE ((z : localization vK w) - toLocalization vK w y) < + aE (z : localization vK w) at hyClose + have hy0 : y ≠ 0 := by + intro hy + subst y + rw [map_zero, sub_zero] at hyClose + exact (lt_irrefl _ hyClose) + have hyValue : aE (toLocalization vK w y) = + aE (z : localization vK w) := by + have hne : aE (z : localization vK w) ≠ + aE (-((z : localization vK w) - toLocalization vK w y)) := by + rw [AbsoluteValue.map_neg] + exact ne_of_gt hyClose + have hsum := LubinTate.Valuations.strong_triangle_eq_max_of_ne hstrong hne + calc + aE (toLocalization vK w y) = + aE ((z : localization vK w) + + -((z : localization vK w) - toLocalization vK w y)) := by + congr 1 + ring + _ = max (aE (z : localization vK w)) + (aE (-((z : localization vK w) - toLocalization vK w y))) := hsum + _ = max (aE (z : localization vK w)) + (aE ((z : localization vK w) - toLocalization vK w y)) := by + rw [AbsoluteValue.map_neg] + _ = aE (z : localization vK w) := max_eq_left hyClose.le + let x : Lˣ := Units.mk0 y hy0 + refine ⟨x, hyValue, ?_⟩ + change aE ((z : localization vK w) / toLocalization vK w y - 1) < 1 + rw [div_sub_one ((map_ne_zero (toLocalization vK w)).mpr hy0), + map_div₀, hyValue] + exact (div_lt_one hzpos).mpr hyClose + +/-- Quotient formulation of the preceding approximation: the natural map +`Lˣ / U_L¹ → (L K_v)ˣ / U_{L K_v}¹` is surjective on +representatives. -/ +theorem algebraicLocalizationDensity_localization_exists_principalUnitRepresentative + (hw : LubinTate.Valuations.NonarchimedeanAbsoluteValue w.1) + (z : (localization vK w)ˣ) : + ∃ x : Lˣ, + z / Units.map (toLocalization vK w) x ∈ + (localizationValuationSubring vK w hw).principalUnitGroup := by + obtain ⟨x, _, hx⟩ := + algebraicLocalizationDensity_localization_exists_principalUnitRepresentative_abs + vK w hw z + refine ⟨x, ?_⟩ + rw [algebraicLocalizationDensity_mem_principalUnitGroup_iff_abs_lt_one] + simpa using hx + +/-- The dense embedding `L → L K_v` sends global principal units to +local principal units. -/ +theorem algebraicLocalizationDensity_localization_principalUnit_map + (hw : LubinTate.Valuations.NonarchimedeanAbsoluteValue w.1) + (x : Lˣ) + (hx : x ∈ (extensionValuationSubring vK w hw).principalUnitGroup) : + Units.map (toLocalization vK w) x ∈ + (localizationValuationSubring vK w hw).principalUnitGroup := by + have hxAbs : w.1 ((x : L) - 1) < 1 := + (algebraicLocalizationDensity_mem_principalUnitGroup_iff_abs_lt_one w.1 hw x).mp hx + rw [algebraicLocalizationDensity_mem_principalUnitGroup_iff_abs_lt_one] + calc + localizationAbsoluteValue vK w + (((Units.map (toLocalization vK w) x : + (localization vK w)ˣ) : localization vK w) - 1) = + localizationAbsoluteValue vK w + (toLocalization vK w ((x : L) - 1)) := by + congr 1 + simp + _ = w.1 ((x : L) - 1) := + AbsoluteValue.algebraicLocalizationAbsoluteValue_toAlgebraicLocalization vK w.1 w.2 _ + _ < 1 := hxAbs + +/-- The difficult direction of ramification transport in the localization and decomposition +comparison. +Once the restrictions commute, an automorphism ramified-trivially on every +global multiplicative class is ramified-trivially on every local class. +Surjectivity modulo principal units is the essential density input. -/ +theorem algebraicLocalizationDensity_localization_mem_ramification_of_commutes + [Algebra.IsAlgebraic K L] + (hvK : vK.IsNontrivial) + (hw : LubinTate.Valuations.NonarchimedeanAbsoluteValue w.1) + (tau : RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup vK.Completion + (localizationValuationSubring vK w hw)) + (sigma : RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup K + (extensionValuationSubring vK w hw)) + (hcomm : ∀ x : L, + (((tau : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup + vK.Completion + (localizationValuationSubring vK w hw)) : + localization vK w ≃ₐ[vK.Completion] localization vK w) + (toLocalization vK w x)) = + toLocalization vK w + ((((sigma : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup K + (extensionValuationSubring vK w hw)) : L ≃ₐ[K] L) x))) + (hsigma : sigma ∈ RamificationTheory.HilbertRamification.ValuationSubring.ramificationGroup K + (extensionValuationSubring vK w hw)) : + tau ∈ RamificationTheory.HilbertRamification.ValuationSubring.ramificationGroup vK.Completion + (localizationValuationSubring vK w hw) := by + rw [RamificationTheory.HilbertRamification.ValuationSubring.mem_ramificationGroup_iff] + intro z + let AE := localizationValuationSubring vK w hw + let AL := extensionValuationSubring vK w hw + let j := toLocalization vK w + let tauD : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup + vK.Completion AE := tau + let sigmaD : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup K AL + := sigma + let tauE : localization vK w ≃ₐ[vK.Completion] localization vK w := tauD + let sigmaL : L ≃ₐ[K] L := sigmaD + obtain ⟨x, hu⟩ := + algebraicLocalizationDensity_localization_exists_principalUnitRepresentative vK w hw z + let xE : (localization vK w)ˣ := Units.map j x + let u : (localization vK w)ˣ := z / xE + have hu' : u ∈ AE.principalUnitGroup := hu + have htauU : Units.mapEquiv tauE.toMulEquiv u ∈ + AE.principalUnitGroup := by + have huAbs : localizationAbsoluteValue vK w + ((u : localization vK w) - 1) < 1 := + (algebraicLocalizationDensity_mem_principalUnitGroup_iff_abs_lt_one + (localizationAbsoluteValue vK w) + (algebraicLocalizationDensity_localization_nonarchimedean vK w hw) u).mp hu' + rw [algebraicLocalizationDensity_mem_principalUnitGroup_iff_abs_lt_one] + calc + localizationAbsoluteValue vK w + (((Units.mapEquiv tauE.toMulEquiv u : + (localization vK w)ˣ) : localization vK w) - 1) = + localizationAbsoluteValue vK w + (tauE ((u : localization vK w) - 1)) := by + congr 1 + simp + _ = localizationAbsoluteValue vK w + ((u : localization vK w) - 1) := + algebraicLocalizationDensity_localizationAbsoluteValue_algEquiv vK w hvK tauE _ + _ < 1 := huAbs + have hquotU : + RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient + vK.Completion AE tauD u ∈ + AE.principalUnitGroup := by + change Units.mapEquiv tauE.toMulEquiv u / u ∈ AE.principalUnitGroup + exact AE.principalUnitGroup.div_mem htauU hu' + have hxGlobal : + RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient K AL + sigmaD x ∈ + AL.principalUnitGroup := + (RamificationTheory.HilbertRamification.ValuationSubring.mem_ramificationGroup_iff K AL + sigma).mp hsigma x + have hxMapped : Units.map j + (RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient K AL + sigmaD x) ∈ + AE.principalUnitGroup := + algebraicLocalizationDensity_localization_principalUnit_map vK w hw _ hxGlobal + have hquotX : + RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient + vK.Completion AE tauD xE ∈ + AE.principalUnitGroup := by + have heq : + RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient + vK.Completion AE tauD xE = + Units.map j + (RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient K + AL sigmaD x) := by + ext + simp [RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient, xE, + tauD, sigmaD, j, hcomm] + rw [heq] + exact hxMapped + have hzFactor : u * xE = z := by + exact div_mul_cancel z xE + rw [← hzFactor] + have hquotMul : + RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient + vK.Completion AE tauD (u * xE) = + RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient + vK.Completion AE tauD u * + RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient + vK.Completion AE tauD xE := by + ext + simp [RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient, + div_eq_mul_inv] + ac_rfl + rw [hquotMul] + exact AE.principalUnitGroup.mul_mem hquotU hquotX + +end Localization + +end HilbertRamification + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean new file mode 100644 index 0000000000..8865372232 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean @@ -0,0 +1,491 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationDensity +/-! +# Localization of inertia and ramification groups + +This file packages the decomposition-group equivalence of the localization and decomposition + comparison +as equivalences of the valuation-subring decomposition, inertia, and +ramification groups. The difficult global-to-local implications use density +of `L` in the algebraic localization, proved in +`RamificationTheory.HilbertRamification.LocalizationDensity`. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace HilbertRamification + +open AlgebraicNumberTheory.Valuations +open scoped Pointwise + +variable {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [IsGalois K L] + +section + +variable (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (hw : LubinTate.Valuations.NonarchimedeanAbsoluteValue w.1) + +/-- The completion at the extended absolute value is a `K`-algebra through the original +extension. -/ +local instance irCompletionBaseAlgebra : Algebra K w.1.Completion := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + +/-- The action of `K` on the extended completion is induced by its completion algebra. -/ +local instance irCompletionBaseSMul : SMul K w.1.Completion := + (AbsoluteValue.extensionCompletionAlgebra (K := K) w.1).toSMul + +/-- The completion at the extended absolute value is an algebra over the completed base field. -/ +local instance irCompletionAlgebra : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + +/-- The algebraic localization `L K_v` occurring in the localization and decomposition +comparison. -/ +abbrev localizationRamificationGroupsLocalization : + IntermediateField vK.Completion w.1.Completion := + AbsoluteValue.algebraicLocalization vK w.1 w.2 + +/-- The valuation subring of `L` defined by `w`. -/ +abbrev absoluteValueExtensionValuationSubring : + _root_.ValuationSubring L := + absoluteValueValuationSubring w.1 hw + +/-- The valuation subring of the algebraic localization defined by the +extended absolute value. -/ +abbrev algebraicLocalizationValuationSubring : + _root_.ValuationSubring (localizationRamificationGroupsLocalization vK w) := + absoluteValueValuationSubring + (AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2) + (algebraicLocalizationDensity_localization_nonarchimedean vK w hw) + +include hvK + +omit [IsGalois K L] in +private theorem mem_extensionValuationSubring_smul + (sigma : absoluteValueDecompositionGroup K w.1) : + (sigma : L ≃ₐ[K] L) • + absoluteValueExtensionValuationSubring vK w hw = + absoluteValueExtensionValuationSubring vK w hw := by + ext x + rw [_root_.ValuationSubring.mem_pointwise_smul_iff_inv_smul_mem, + mem_absoluteValueValuationSubring_iff, + mem_absoluteValueValuationSubring_iff] + have h := absoluteValueDecompositionGroup_preserves_absoluteValue + vK hvK w sigma ((sigma : L ≃ₐ[K] L)⁻¹ x) + calc + w.1 ((sigma : L ≃ₐ[K] L)⁻¹ x) ≤ 1 ↔ + w.1 ((sigma : L ≃ₐ[K] L) + ((sigma : L ≃ₐ[K] L)⁻¹ x)) ≤ 1 := by rw [h] + _ ↔ w.1 x ≤ 1 := by simp + +/-- The chosen-valuation decomposition group is the valuation-subring decomposition +group attached to the same absolute value. -/ +def localizationRamificationGroupsAbsoluteValueDecompositionGroupEquiv : + absoluteValueDecompositionGroup K w.1 ≃* + RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup K + (absoluteValueExtensionValuationSubring vK w hw) where + toFun sigma := + ⟨(sigma : L ≃ₐ[K] L), + by exact mem_extensionValuationSubring_smul vK (hvK := hvK) w hw sigma⟩ + invFun sigma := by + refine ⟨(sigma : L ≃ₐ[K] L), ?_⟩ + intro x + rw [← algebraicLocalizationDensity_mem_nonunits_iff_abs_lt_one w.1 hw, + ← algebraicLocalizationDensity_mem_nonunits_iff_abs_lt_one w.1 hw] + rw [_root_.ValuationSubring.mem_nonunits_iff_or, + _root_.ValuationSubring.mem_nonunits_iff_or] + have hmem (y : L) : + (sigma : L ≃ₐ[K] L) y ∈ + absoluteValueExtensionValuationSubring vK w hw ↔ + y ∈ absoluteValueExtensionValuationSubring vK w hw := by + have h := congrArg + (fun A : _root_.ValuationSubring L ↦ + (sigma : L ≃ₐ[K] L) y ∈ A) sigma.property + have h' : + (y ∈ absoluteValueExtensionValuationSubring vK w hw) = + ((sigma : L ≃ₐ[K] L) y ∈ + absoluteValueExtensionValuationSubring vK w hw) := by + simpa [_root_.ValuationSubring.mem_pointwise_smul_iff_inv_smul_mem, + AlgEquiv.smul_def] using h + exact Eq.to_iff h'.symm + have hinv : + ((sigma : L ≃ₐ[K] L) x)⁻¹ ∈ + absoluteValueExtensionValuationSubring vK w hw ↔ + x⁻¹ ∈ absoluteValueExtensionValuationSubring vK w hw := by + simpa only [map_inv₀] using hmem x⁻¹ + constructor + · rintro (hzero | hnot) + · exact Or.inl ((sigma : L ≃ₐ[K] L).injective (by simpa using hzero)) + · exact Or.inr (fun hx ↦ hnot (hinv.mpr hx)) + · rintro (hzero | hnot) + · subst x + exact Or.inl (map_zero (sigma : L ≃ₐ[K] L)) + · exact Or.inr (fun hx ↦ hnot (hinv.mp hx)) + left_inv sigma := by + apply Subtype.ext + rfl + right_inv sigma := by + apply Subtype.ext + rfl + map_mul' sigma tau := by + apply Subtype.ext + rfl + +private theorem local_mem_localizationValuationSubring_smul + (tau : localizationRamificationGroupsLocalization vK w ≃ₐ[vK.Completion] + localizationRamificationGroupsLocalization vK w) : + tau • algebraicLocalizationValuationSubring vK w hw = + algebraicLocalizationValuationSubring vK w hw := by + ext z + rw [_root_.ValuationSubring.mem_pointwise_smul_iff_inv_smul_mem, + mem_absoluteValueValuationSubring_iff, + mem_absoluteValueValuationSubring_iff] + have h := localizationAbsoluteValue_algEquiv vK hvK w tau (tau⁻¹ z) + calc + AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 (tau⁻¹ z) ≤ 1 ↔ + AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 + (tau (tau⁻¹ z)) ≤ 1 := by rw [h] + _ ↔ AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 z ≤ 1 := by simp + +/-- Every automorphism of the localization over `K_v` belongs to its +valuation-subring decomposition group. -/ +def localizationRamificationGroupsLocalDecompositionGroupEquiv : + (localizationRamificationGroupsLocalization vK w ≃ₐ[vK.Completion] + localizationRamificationGroupsLocalization vK w) ≃* + RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup vK.Completion + (algebraicLocalizationValuationSubring vK w hw) where + toFun tau := + ⟨tau, by + exact local_mem_localizationValuationSubring_smul + vK (hvK := hvK) w hw tau⟩ + invFun tau := tau + left_inv tau := rfl + right_inv tau := by + apply Subtype.ext + rfl + map_mul' sigma tau := by + apply Subtype.ext + rfl + +/-- The localization and decomposition comparison for valuation-subring decomposition groups. -/ +def localizationRamificationGroupsValuationDecompositionGroupEquiv : + RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup K + (absoluteValueExtensionValuationSubring vK w hw) ≃* + RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup vK.Completion + (algebraicLocalizationValuationSubring vK w hw) := + (localizationRamificationGroupsAbsoluteValueDecompositionGroupEquiv + vK (hvK := hvK) w hw).symm.trans + ((decompositionGroupEquivAlgebraicLocalizationAut vK hvK w).trans + (localizationRamificationGroupsLocalDecompositionGroupEquiv + vK (hvK := hvK) w hw)) + +@[simp] theorem localizationRamificationGroups_valuationDecompositionGroupEquiv_toLocalization + (sigma : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup K + (absoluteValueExtensionValuationSubring vK w hw)) + (x : L) : + (((localizationRamificationGroupsValuationDecompositionGroupEquiv + vK (hvK := hvK) w hw sigma : + RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup vK.Completion + (algebraicLocalizationValuationSubring vK w hw)) : + localizationRamificationGroupsLocalization vK w ≃ₐ[vK.Completion] + localizationRamificationGroupsLocalization vK w) + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x)) = + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + ((sigma : L ≃ₐ[K] L) x) := by + exact localizationRamificationGroups_decompositionGroupEquiv_toLocalization + vK hvK w + ((localizationRamificationGroupsAbsoluteValueDecompositionGroupEquiv + vK (hvK := hvK) w hw).symm sigma) x + +/-- The decomposition-group equivalence carries inertia precisely to +inertia. The global-to-local implication is the residue-density argument; +the converse is restriction along `L → L K_v`. -/ +theorem localizationRamificationGroups_valuationDecompositionGroupEquiv_mem_inertia_iff + (sigma : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup K + (absoluteValueExtensionValuationSubring vK w hw)) : + localizationRamificationGroupsValuationDecompositionGroupEquiv + vK (hvK := hvK) w hw sigma ∈ + RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup vK.Completion + (algebraicLocalizationValuationSubring vK w hw) ↔ + sigma ∈ RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup K + (absoluteValueExtensionValuationSubring vK w hw) := by + constructor + · intro hsigma + rw [ValuationSubring.mem_inertiaGroup_iff_sub_mem_nonunits] + intro x + rw [algebraicLocalizationDensity_mem_nonunits_iff_abs_lt_one] + let xLocal : algebraicLocalizationValuationSubring vK w hw := + ⟨AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 (x : L), by + rw [mem_absoluteValueValuationSubring_iff, + AbsoluteValue.algebraicLocalizationAbsoluteValue_toAlgebraicLocalization] + exact + (mem_absoluteValueValuationSubring_iff + w.1 hw (x : L)).mp x.property⟩ + have hlocalNonunit := + (ValuationSubring.mem_inertiaGroup_iff_sub_mem_nonunits + (algebraicLocalizationValuationSubring vK w hw) + (localizationRamificationGroupsValuationDecompositionGroupEquiv + vK (hvK := hvK) w hw sigma)).mp hsigma xLocal + have hlocal : + AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 + (((localizationRamificationGroupsValuationDecompositionGroupEquiv + vK (hvK := hvK) w hw sigma : + RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup + vK.Completion + (algebraicLocalizationValuationSubring vK w hw)) : + localizationRamificationGroupsLocalization vK w ≃ₐ[vK.Completion] + localizationRamificationGroupsLocalization vK w) + (xLocal : localizationRamificationGroupsLocalization vK w) - + (xLocal : localizationRamificationGroupsLocalization vK w)) < 1 := + (algebraicLocalizationDensity_mem_nonunits_iff_abs_lt_one + (AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2) + (algebraicLocalizationDensity_localization_nonarchimedean vK w hw) _).mp hlocalNonunit + calc + w.1 (((sigma : L ≃ₐ[K] L) (x : L)) - (x : L)) = + AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + (((sigma : L ≃ₐ[K] L) (x : L)) - (x : L))) := + (AbsoluteValue.algebraicLocalizationAbsoluteValue_toAlgebraicLocalization vK w.1 w.2 _).symm + _ = AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 + (((localizationRamificationGroupsValuationDecompositionGroupEquiv + vK (hvK := hvK) w hw sigma : + RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup + vK.Completion + (algebraicLocalizationValuationSubring vK w hw)) : + localizationRamificationGroupsLocalization vK w ≃ₐ[vK.Completion] + localizationRamificationGroupsLocalization vK w) + (xLocal : localizationRamificationGroupsLocalization vK w) - + (xLocal : localizationRamificationGroupsLocalization vK w)) := by + congr 1 + rw [map_sub, + localizationRamificationGroups_valuationDecompositionGroupEquiv_toLocalization] + _ < 1 := hlocal + · intro hsigma + apply algebraicLocalizationDensity_localization_mem_inertia_of_commutes vK w hvK hw + (localizationRamificationGroupsValuationDecompositionGroupEquiv + vK (hvK := hvK) w hw sigma) sigma + · intro x + exact localizationRamificationGroups_valuationDecompositionGroupEquiv_toLocalization + vK hvK w hw sigma x + · exact hsigma + +/-- The localization and decomposition comparison for inertia groups. -/ +def inertiaGroupEquivAlgebraicLocalization : + RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup K + (absoluteValueExtensionValuationSubring vK w hw) ≃* + RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup vK.Completion + (algebraicLocalizationValuationSubring vK w hw) where + toFun sigma := + ⟨localizationRamificationGroupsValuationDecompositionGroupEquiv + vK (hvK := hvK) w hw sigma, + (localizationRamificationGroups_valuationDecompositionGroupEquiv_mem_inertia_iff + vK hvK w hw sigma).mpr sigma.property⟩ + invFun tau := by + let sigma := (localizationRamificationGroupsValuationDecompositionGroupEquiv + vK (hvK := hvK) w hw).symm + (tau : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup + vK.Completion + (algebraicLocalizationValuationSubring vK w hw)) + refine ⟨sigma, ?_⟩ + apply (localizationRamificationGroups_valuationDecompositionGroupEquiv_mem_inertia_iff + vK hvK w hw sigma).mp + simp [sigma, tau.property] + left_inv sigma := by + apply Subtype.ext + exact (localizationRamificationGroupsValuationDecompositionGroupEquiv + vK (hvK := hvK) w hw).symm_apply_apply sigma + right_inv tau := by + apply Subtype.ext + exact (localizationRamificationGroupsValuationDecompositionGroupEquiv + vK (hvK := hvK) w hw).apply_symm_apply tau + map_mul' sigma tau := by + apply Subtype.ext + exact map_mul (localizationRamificationGroupsValuationDecompositionGroupEquiv + vK (hvK := hvK) w hw) + (sigma : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup K + (absoluteValueExtensionValuationSubring vK w hw)) + (tau : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup K + (absoluteValueExtensionValuationSubring vK w hw)) + +@[simp] theorem localizationRamificationGroups_inertiaGroupEquiv_toLocalization + (sigma : RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup K + (absoluteValueExtensionValuationSubring vK w hw)) + (x : L) : + ((((inertiaGroupEquivAlgebraicLocalization vK hvK w hw sigma : + RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup vK.Completion + (algebraicLocalizationValuationSubring vK w hw)) : + RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup vK.Completion + (algebraicLocalizationValuationSubring vK w hw)) : + localizationRamificationGroupsLocalization vK w ≃ₐ[vK.Completion] + localizationRamificationGroupsLocalization vK w) + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x)) = + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + (((sigma : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup K + (absoluteValueExtensionValuationSubring vK w hw)) : + L ≃ₐ[K] L) x) := + localizationRamificationGroups_valuationDecompositionGroupEquiv_toLocalization + vK hvK w hw sigma x + +/-- The inertia-group equivalence carries ramification precisely to +ramification. The global-to-local implication uses density modulo principal +units; the converse follows by restricting unit quotients. -/ +theorem localizationRamificationGroups_inertiaGroupEquiv_mem_ramification_iff + (sigma : RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup K + (absoluteValueExtensionValuationSubring vK w hw)) : + inertiaGroupEquivAlgebraicLocalization vK hvK w hw sigma ∈ + RamificationTheory.HilbertRamification.ValuationSubring.ramificationGroup vK.Completion + (algebraicLocalizationValuationSubring vK w hw) ↔ + sigma ∈ RamificationTheory.HilbertRamification.ValuationSubring.ramificationGroup K + (absoluteValueExtensionValuationSubring vK w hw) := by + constructor + · intro hsigma + rw [RamificationTheory.HilbertRamification.ValuationSubring.mem_ramificationGroup_iff] + intro x + rw [algebraicLocalizationDensity_mem_principalUnitGroup_iff_abs_lt_one] + let j : L →+* localizationRamificationGroupsLocalization vK w := + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + let xLocal : (localizationRamificationGroupsLocalization vK w)ˣ := Units.map j x + let sigmaGlobal : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup K + (absoluteValueExtensionValuationSubring vK w hw) := sigma + let sigmaLocal : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup + vK.Completion + (algebraicLocalizationValuationSubring vK w hw) := + inertiaGroupEquivAlgebraicLocalization vK hvK w hw sigma + have hquotient : + Units.map j + (RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient K + (absoluteValueExtensionValuationSubring vK w hw) + sigmaGlobal x) = + RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient + vK.Completion + (algebraicLocalizationValuationSubring vK w hw) + sigmaLocal xLocal := by + ext + simp [RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient, + sigmaGlobal, + sigmaLocal, xLocal, j, + localizationRamificationGroups_inertiaGroupEquiv_toLocalization] + have hlocalPrincipal := + (RamificationTheory.HilbertRamification.ValuationSubring.mem_ramificationGroup_iff + vK.Completion + (algebraicLocalizationValuationSubring vK w hw) + (inertiaGroupEquivAlgebraicLocalization vK hvK w hw sigma)).mp + hsigma xLocal + have hlocal : + AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 + (((RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient + vK.Completion + (algebraicLocalizationValuationSubring vK w hw) + sigmaLocal xLocal : + (localizationRamificationGroupsLocalization vK w)ˣ) : + localizationRamificationGroupsLocalization vK w) - 1) < 1 := + (algebraicLocalizationDensity_mem_principalUnitGroup_iff_abs_lt_one + (AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2) + (algebraicLocalizationDensity_localization_nonarchimedean vK w hw) _).mp + hlocalPrincipal + calc + w.1 (((RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient K + (absoluteValueExtensionValuationSubring vK w hw) + sigmaGlobal x : Lˣ) : L) - 1) = + AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 + (j (((RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient K + (absoluteValueExtensionValuationSubring vK w hw) + sigmaGlobal x : Lˣ) : L) - 1)) := + (AbsoluteValue.algebraicLocalizationAbsoluteValue_toAlgebraicLocalization vK w.1 w.2 _).symm + _ = AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 + (((RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient + vK.Completion + (algebraicLocalizationValuationSubring vK w hw) + sigmaLocal xLocal : + (localizationRamificationGroupsLocalization vK w)ˣ) : + localizationRamificationGroupsLocalization vK w) - 1) := by + congr 1 + rw [← hquotient] + simp [j] + _ < 1 := hlocal + · intro hsigma + apply algebraicLocalizationDensity_localization_mem_ramification_of_commutes + vK w hvK hw + (inertiaGroupEquivAlgebraicLocalization vK hvK w hw sigma) sigma + · intro x + exact localizationRamificationGroups_inertiaGroupEquiv_toLocalization + vK hvK w hw sigma x + · exact hsigma + +/-- The localization and decomposition comparison for ramification groups. -/ +def localizationRamificationGroupsRamificationGroupEquiv : + RamificationTheory.HilbertRamification.ValuationSubring.ramificationGroup K + (absoluteValueExtensionValuationSubring vK w hw) ≃* + RamificationTheory.HilbertRamification.ValuationSubring.ramificationGroup vK.Completion + (algebraicLocalizationValuationSubring vK w hw) where + toFun sigma := + ⟨inertiaGroupEquivAlgebraicLocalization vK hvK w hw sigma, + (localizationRamificationGroups_inertiaGroupEquiv_mem_ramification_iff + vK hvK w hw sigma).mpr sigma.property⟩ + invFun tau := by + let sigma := (inertiaGroupEquivAlgebraicLocalization vK hvK w hw).symm + (tau : RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup vK.Completion + (algebraicLocalizationValuationSubring vK w hw)) + refine ⟨sigma, ?_⟩ + apply (localizationRamificationGroups_inertiaGroupEquiv_mem_ramification_iff + vK hvK w hw sigma).mp + simp [sigma, tau.property] + left_inv sigma := by + apply Subtype.ext + exact (inertiaGroupEquivAlgebraicLocalization + vK hvK w hw).symm_apply_apply sigma + right_inv tau := by + apply Subtype.ext + exact (inertiaGroupEquivAlgebraicLocalization + vK hvK w hw).apply_symm_apply tau + map_mul' sigma tau := by + apply Subtype.ext + exact map_mul (inertiaGroupEquivAlgebraicLocalization vK hvK w hw) + (sigma : RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup K + (absoluteValueExtensionValuationSubring vK w hw)) + (tau : RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup K + (absoluteValueExtensionValuationSubring vK w hw)) + +@[simp] theorem localizationRamificationGroups_ramificationGroupEquiv_toLocalization + (sigma : RamificationTheory.HilbertRamification.ValuationSubring.ramificationGroup K + (absoluteValueExtensionValuationSubring vK w hw)) + (x : L) : + ((show localizationRamificationGroupsLocalization vK w ≃ₐ[vK.Completion] + localizationRamificationGroupsLocalization vK w from + (((localizationRamificationGroupsRamificationGroupEquiv vK hvK w hw sigma : + RamificationTheory.HilbertRamification.ValuationSubring.ramificationGroup vK.Completion + (algebraicLocalizationValuationSubring vK w hw)) : + RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup vK.Completion + (algebraicLocalizationValuationSubring vK w hw)) : + RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup vK.Completion + (algebraicLocalizationValuationSubring vK w hw))) + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x)) = + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + ((show L ≃ₐ[K] L from + ((sigma : RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup K + (absoluteValueExtensionValuationSubring vK w hw)) : + RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup K + (absoluteValueExtensionValuationSubring vK w hw))) x) := + localizationRamificationGroups_inertiaGroupEquiv_toLocalization + vK hvK w hw sigma x + +end + +end HilbertRamification + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Monogeneity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Monogeneity.lean new file mode 100644 index 0000000000..40b3c2d8ff --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Monogeneity.lean @@ -0,0 +1,601 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.HenselLemma +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniqueExtensionIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Polynomial +public import Mathlib.NumberTheory.RamificationInertia.Inertia +public import Mathlib.NumberTheory.RamificationInertia.Ramification +/-! +# Monogeneity over a noncomplete discretely valued field + +This file proves the algebraic, noncomplete form of the monogeneity argument +used in the monogenic integral-generator theorem. The proof uses the finite integral +closure supplied by unique extension, a primitive residue element, the +representative adjustment , and Nakayama's lemma. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w x + +namespace RamificationTheory.HilbertRamification +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ResidueField +namespace Higher + +open scoped Polynomial + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] +variable {base : ValuationTheory.DiscreteValuationField.DVF.{u, v} K} +variable {target : ValuationTheory.DiscreteValuationField.DVF.{w, x} L} +variable [FiniteDimensional K L] [base.valuation.HasExtension target.valuation] +variable [IsGalois K L] + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- A local injection of DVRs maps the source maximal ideal to the power of +the target maximal ideal indexed by its ramification index. -/ +theorem map_maximalIdeal_eq_pow_ramificationIdx_dvf : + Ideal.map (algebraMap base.valuationSubring target.valuationSubring) + base.maximalIdeal = + target.maximalIdeal ^ + Ideal.ramificationIdx' base.maximalIdeal target.maximalIdeal := by + let i := algebraMap base.valuationSubring target.valuationSubring + let p := base.maximalIdeal + let P := target.maximalIdeal + have hi : Function.Injective i := by + intro a b hab + apply Subtype.ext + apply (algebraMap K L).injective + exact congrArg Subtype.val hab + have hp0 : p ≠ ⊥ := + IsDiscreteValuationRing.not_a_field base.valuationSubring + have hmap0 : Ideal.map i p ≠ ⊥ := + (Ideal.map_eq_bot_iff_of_injective hi).not.mpr hp0 + obtain ⟨pi, hpi⟩ := + IsDiscreteValuationRing.exists_irreducible target.valuationSubring + obtain ⟨m, hm⟩ := + IsDiscreteValuationRing.ideal_eq_span_pow_irreducible hmap0 hpi + have hmapPow : Ideal.map i p = P ^ m := by + rw [hm, show P = IsLocalRing.maximalIdeal target.valuationSubring from rfl, + hpi.maximalIdeal_eq, Ideal.span_singleton_pow] + have hnot : ¬ Ideal.map i p ≤ P ^ (m + 1) := by + rw [hmapPow] + exact not_le_of_gt + (Ideal.pow_succ_lt_pow + (IsDiscreteValuationRing.not_a_field target.valuationSubring) m) + have he : Ideal.ramificationIdx' p P = m := + Ideal.ramificationIdx'_spec (by rw [hmapPow]) hnot + change Ideal.map i p = P ^ Ideal.ramificationIdx' p P + rw [he] + exact hmapPow + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Module finiteness of the valuation-ring extension implies finiteness of +the residue-field extension, without completeness. -/ +theorem residueField_finiteDimensional_of_moduleFinite_dvf + [Module.Finite base.valuationSubring target.valuationSubring] : + FiniteDimensional base.residueField target.residueField := by + refine FiniteDimensional.of_finrank_pos + (K := base.residueField) (V := target.residueField) ?_ + let : target.maximalIdeal.LiesOver base.maximalIdeal := + ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_liesOver_of_hasExtension + (L := L) base.valuation target.valuation + change 0 < Module.finrank + (base.valuationSubring ⧸ base.maximalIdeal) + (target.valuationSubring ⧸ target.maximalIdeal) + have h := target.maximalIdeal.inertiaDeg_pos base.valuationSubring + rw [Ideal.inertiaDeg_eq_of_isMaximal base.maximalIdeal target.maximalIdeal] at h + exact h + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Lift a residue polynomial coefficientwise to the base valuation ring. -/ +theorem exists_base_polynomial_lift_residue_eq_dvf + (fbar : base.residueField[X]) : + ∃ P : base.valuationSubring[X], P.map base.residueMap = fbar := + Polynomial.map_surjective base.residueMap base.residue_surjective fbar + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Reduction after extension of coefficients agrees with extension after +reduction. -/ +theorem base_polynomial_lift_target_reduction_eq_dvf + {P : base.valuationSubring[X]} {fbar : base.residueField[X]} + (hP : P.map base.residueMap = fbar) : + (P.map (algebraMap base.valuationSubring target.valuationSubring)).map + target.residueMap = + fbar.map (algebraMap base.residueField target.residueField) := by + rw [← hP] + ext k + rw [algebraMap_eq_map_algebraMap] + simp only [Polynomial.coeff_map] + exact + (IsLocalRing.ResidueField.map_residue + (algebraMap base.valuationSubring target.valuationSubring) + (P.coeff k)).symm + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- A reduced polynomial root is an actual value in the maximal ideal. -/ +theorem polynomial_eval_mem_maximalIdeal_of_reduced_eval_eq_zero_dvf + {P : Polynomial target.valuationSubring} {a : target.valuationSubring} + (hroot : (P.map target.residueMap).eval (target.residueMap a) = 0) : + P.eval a ∈ target.maximalIdeal := by + rw [← target.residue_eq_zero_iff] + calc + target.residueMap (P.eval a) = + (P.map target.residueMap).eval (target.residueMap a) := by + exact + (Polynomial.eval_map_apply + (f := target.residueMap) (p := P) a).symm + _ = 0 := hroot + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- A nonzero reduced derivative lifts to a unit derivative. -/ +theorem polynomial_derivative_eval_isUnit_of_reduced_ne_zero_dvf + {P : Polynomial target.valuationSubring} {a : target.valuationSubring} + (hsimple : + ((P.map target.residueMap).derivative).eval + (target.residueMap a) ≠ 0) : + IsUnit (P.derivative.eval a) := by + apply (target.residue_ne_zero_iff_isUnit (P.derivative.eval a)).1 + calc + target.residueMap (P.derivative.eval a) = + (P.derivative.map target.residueMap).eval + (target.residueMap a) := by + exact + (Polynomial.eval_map_apply + (f := target.residueMap) (p := P.derivative) a).symm + _ = ((P.map target.residueMap).derivative).eval + (target.residueMap a) := by + rw [Polynomial.derivative_map] + _ ≠ 0 := hsimple + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- If a polynomial value is already in the square of the maximal ideal and +the derivative is a unit, adding a uniformizer to the argument makes the +polynomial value a uniformizer. -/ +theorem polynomial_eval_add_uniformizer_isUniformizer_dvf + {P : Polynomial target.valuationSubring} + {a pi : target.valuationSubring} + (hpi : target.valuation.IsUniformizer (pi : L)) + (hdeep : P.eval a ∈ target.maximalIdeal ^ 2) + (hderiv : IsUnit (P.derivative.eval a)) : + target.valuation.IsUniformizer + ((P.eval (a + pi) : target.valuationSubring) : L) := by + let q : Polynomial target.valuationSubring := + P /ₘ (Polynomial.X - Polynomial.C a) + have hdecomp : + P = Polynomial.C (P.eval a) + + (Polynomial.X - Polynomial.C a) * q := by + dsimp [q] + calc + P = P %ₘ (Polynomial.X - Polynomial.C a) + + (Polynomial.X - Polynomial.C a) * + (P /ₘ (Polynomial.X - Polynomial.C a)) := + (Polynomial.modByMonic_add_div P + (Polynomial.X - Polynomial.C a)).symm + _ = Polynomial.C (P.eval a) + + (Polynomial.X - Polynomial.C a) * + (P /ₘ (Polynomial.X - Polynomial.C a)) := by + rw [Polynomial.modByMonic_X_sub_C_eq_C_eval] + have hEval : + P.eval (a + pi) = P.eval a + pi * q.eval (a + pi) := by + rw [hdecomp] + simp [Polynomial.eval_add, Polynomial.eval_mul, Polynomial.eval_sub] + have hqEval : q.eval a = P.derivative.eval a := by + simpa [q] using + ValuationTheory.DiscreteValuationField.divByMonic_X_sub_C_eval_eq_derivative_eval + (p := P) a + have hqUnit : IsUnit (q.eval a) := by + simpa [hqEval] using hderiv + have hpiMem : pi ∈ target.maximalIdeal := + target.uniformizer_mem_maximalIdeal hpi + have hPMem : P.eval (a + pi) ∈ target.maximalIdeal := by + have haMem : P.eval a ∈ target.maximalIdeal := by + simpa using + Ideal.pow_le_pow_right (show 1 ≤ 2 by norm_num) hdeep + rw [hEval] + exact Ideal.add_mem _ haMem + (Ideal.mul_mem_right (q.eval (a + pi)) target.maximalIdeal hpiMem) + have hqdiff : + q.eval (a + pi) - q.eval a ∈ target.maximalIdeal := by + have harg : (a + pi) - a ∈ target.maximalIdeal := by + simpa using hpiMem + simpa using + polynomial_eval₂_sub_mem_of_sub_mem + (f := RingHom.id target.valuationSubring) + (I := target.maximalIdeal) + (x := a + pi) (y := a) harg q + have hpiqdiff : + pi * (q.eval (a + pi) - q.eval a) ∈ target.maximalIdeal ^ 2 := by + simpa [pow_two] using + (Ideal.mul_mem_mul hpiMem hqdiff : + pi * (q.eval (a + pi) - q.eval a) ∈ + target.maximalIdeal * target.maximalIdeal) + have herr : + P.eval (a + pi) - pi * q.eval a ∈ target.maximalIdeal ^ 2 := by + have hre : + P.eval (a + pi) - pi * q.eval a = + P.eval a + pi * (q.eval (a + pi) - q.eval a) := by + rw [hEval] + ring + rw [hre] + exact Ideal.add_mem _ hdeep hpiqdiff + have hnot : P.eval (a + pi) ∉ target.maximalIdeal ^ 2 := by + intro hsquare + have hmain : pi * q.eval a ∈ target.maximalIdeal ^ 2 := by + have hsub := Ideal.sub_mem _ hsquare herr + convert hsub using 1 + ring + exact target.uniformizer_mul_unit_not_mem_maximalIdeal_sq + hpi hqUnit hmain + exact target.isUniformizer_of_mem_maximalIdeal_of_not_mem_maximalIdeal_sq + hPMem hnot + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Representative adjustment from the proof of the monogenic integral-generator theorem. -/ +theorem exists_residue_eq_polynomial_eval_isUniformizer_dvf + {P : Polynomial target.valuationSubring} + {a pi : target.valuationSubring} + (hpi : target.valuation.IsUniformizer (pi : L)) + (hP : P.eval a ∈ target.maximalIdeal) + (hderiv : IsUnit (P.derivative.eval a)) : + ∃ y : target.valuationSubring, + target.residueMap y = target.residueMap a ∧ + target.valuation.IsUniformizer ((P.eval y : target.valuationSubring) : L) := by + by_cases hdeep : P.eval a ∈ target.maximalIdeal ^ 2 + · refine ⟨a + pi, ?_, ?_⟩ + · rw [residue_eq_residue_iff_sub_mem_maximalIdeal + (R := target.valuationSubring)] + simpa using target.uniformizer_mem_maximalIdeal hpi + · exact polynomial_eval_add_uniformizer_isUniformizer_dvf + (target := target) hpi hdeep hderiv + · exact + ⟨a, rfl, + target.isUniformizer_of_mem_maximalIdeal_of_not_mem_maximalIdeal_sq + hP hdeep⟩ + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Reducing a base-polynomial evaluation agrees with evaluating the reduced +polynomial at the reduced argument. -/ +theorem base_polynomial_aeval_residue_eq_dvf + (P : base.valuationSubring[X]) (a : target.valuationSubring) : + target.residueMap (Polynomial.aeval a P) = + ((P.map base.residueMap).map + (algebraMap base.residueField target.residueField)).eval + (target.residueMap a) := by + calc + target.residueMap (Polynomial.aeval a P) = + ((P.map + (algebraMap base.valuationSubring target.valuationSubring)).map + target.residueMap).eval (target.residueMap a) := by + rw [Polynomial.aeval_def, Polynomial.eval₂_eq_eval_map] + exact + (Polynomial.eval_map_apply + (f := target.residueMap) + (p := P.map + (algebraMap base.valuationSubring target.valuationSubring)) + a).symm + _ = + ((P.map base.residueMap).map + (algebraMap base.residueField target.residueField)).eval + (target.residueMap a) := by + rw [base_polynomial_lift_target_reduction_eq_dvf + (base := base) (target := target) + (P := P) (fbar := P.map base.residueMap) rfl] + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Every residue class is represented in the algebra generated by a lift of +a primitive residue element. -/ +theorem exists_mem_adjoin_residue_eq_dvf + [Algebra.IsAlgebraic base.residueField target.residueField] + {a : target.valuationSubring} + (hprim : + IntermediateField.adjoin base.residueField + ({target.residueMap a} : Set target.residueField) = + (⊤ : IntermediateField base.residueField target.residueField)) + (zbar : target.residueField) : + ∃ z : target.valuationSubring, + z ∈ Algebra.adjoin base.valuationSubring + ({a} : Set target.valuationSubring) ∧ + target.residueMap z = zbar := by + have htop : + Algebra.adjoin base.residueField + ({target.residueMap a} : Set target.residueField) = + (⊤ : Subalgebra base.residueField target.residueField) := + Algebra.adjoin_eq_top_of_primitive_element + (Algebra.IsAlgebraic.isAlgebraic (target.residueMap a)) hprim + have hz : + zbar ∈ Algebra.adjoin base.residueField + ({target.residueMap a} : Set target.residueField) := by + simp [htop] + rcases Algebra.adjoin_mem_exists_aeval + base.residueField (target.residueMap a) hz with + ⟨fbar, hfbar⟩ + rcases exists_base_polynomial_lift_residue_eq_dvf + (base := base) fbar with + ⟨P, hP⟩ + refine ⟨Polynomial.aeval a P, ?_, ?_⟩ + · exact + Polynomial.aeval_mem_adjoin_singleton + (R := base.valuationSubring) (p := P) a + · rw [base_polynomial_aeval_residue_eq_dvf + (base := base) (target := target) P a, hP] + simpa [Polynomial.aeval_def] using hfbar + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- First-order approximation by the algebra generated by a primitive residue +lift. -/ +theorem exists_mem_adjoin_sub_mem_maximalIdeal_dvf + [Algebra.IsAlgebraic base.residueField target.residueField] + {a : target.valuationSubring} + (hprim : + IntermediateField.adjoin base.residueField + ({target.residueMap a} : Set target.residueField) = + (⊤ : IntermediateField base.residueField target.residueField)) + (z : target.valuationSubring) : + ∃ y : target.valuationSubring, + y ∈ Algebra.adjoin base.valuationSubring + ({a} : Set target.valuationSubring) ∧ + z - y ∈ target.maximalIdeal := by + rcases exists_mem_adjoin_residue_eq_dvf + (base := base) (target := target) hprim + (target.residueMap z) with + ⟨y, hy, hyres⟩ + refine ⟨y, hy, ?_⟩ + rw [← target.residue_eq_zero_iff, map_sub, hyres, sub_self] + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Approximation to arbitrary maximal-ideal order, using the fact that the +lifted minimal polynomial evaluates to a target uniformizer. -/ +theorem exists_mem_adjoin_sub_mem_maximalIdeal_pow_dvf + [Algebra.IsAlgebraic base.residueField target.residueField] + {P : base.valuationSubring[X]} {a : target.valuationSubring} + (hprim : + IntermediateField.adjoin base.residueField + ({target.residueMap a} : Set target.residueField) = + (⊤ : IntermediateField base.residueField target.residueField)) + (hpi : + target.valuation.IsUniformizer + (Polynomial.aeval a P : L)) + (n : ℕ) (z : target.valuationSubring) : + ∃ y : target.valuationSubring, + y ∈ Algebra.adjoin base.valuationSubring + ({a} : Set target.valuationSubring) ∧ + z - y ∈ target.maximalIdeal ^ n := by + let pi : target.valuationSubring := Polynomial.aeval a P + let A : Subalgebra base.valuationSubring target.valuationSubring := + Algebra.adjoin base.valuationSubring ({a} : Set target.valuationSubring) + have hpiA : pi ∈ A := by + exact + Polynomial.aeval_mem_adjoin_singleton + (R := base.valuationSubring) (p := P) a + induction n generalizing z with + | zero => + refine ⟨0, A.zero_mem, ?_⟩ + simp + | succ n ih => + rcases ih z with ⟨y, hyA, hdiff⟩ + have hdiv : pi ^ n ∣ z - y := by + exact + (target.mem_maximalIdeal_pow_iff_uniformizer_pow_dvd + (pi := pi) (x := z - y) hpi n).1 + (by simpa [pi] using hdiff) + rcases hdiv with ⟨b, hb⟩ + rcases exists_mem_adjoin_sub_mem_maximalIdeal_dvf + (base := base) (target := target) (a := a) hprim b with + ⟨c, hcA, hbc⟩ + refine ⟨y + pi ^ n * c, ?_, ?_⟩ + · exact A.add_mem hyA (A.mul_mem (A.pow_mem hpiA n) hcA) + · have hpiPow : pi ^ n ∈ target.maximalIdeal ^ n := by + exact + (target.mem_maximalIdeal_pow_iff_uniformizer_pow_dvd + (pi := pi) (x := pi ^ n) hpi n).2 + ⟨1, by rw [mul_one]⟩ + have hmul : + pi ^ n * (b - c) ∈ + target.maximalIdeal ^ n * target.maximalIdeal := + Ideal.mul_mem_mul hpiPow hbc + have hre : z - (y + pi ^ n * c) = pi ^ n * (b - c) := by + calc + z - (y + pi ^ n * c) = (z - y) - pi ^ n * c := by ring + _ = pi ^ n * b - pi ^ n * c := by rw [hb] + _ = pi ^ n * (b - c) := by ring + rw [hre] + simpa [pow_succ] using hmul + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- A primitive residue lift can be adjusted so that its lifted minimal +polynomial value is a target uniformizer. -/ +theorem exists_primitive_residue_lift_polynomial_uniformizer_dvf + [FiniteDimensional base.residueField target.residueField] + [Algebra.IsSeparable base.residueField target.residueField] : + ∃ P : base.valuationSubring[X], ∃ a : target.valuationSubring, + IntermediateField.adjoin base.residueField + ({target.residueMap a} : Set target.residueField) = + (⊤ : IntermediateField base.residueField target.residueField) ∧ + target.valuation.IsUniformizer (Polynomial.aeval a P : L) ∧ + IsUnit + ((P.map + (algebraMap base.valuationSubring target.valuationSubring)).derivative.eval a) := by + rcases Field.exists_primitive_element + base.residueField target.residueField with + ⟨xbar, hprim⟩ + have hsep : IsSeparable base.residueField xbar := + Algebra.IsSeparable.isSeparable base.residueField xbar + let fbar : base.residueField[X] := minpoly base.residueField xbar + rcases exists_base_polynomial_lift_residue_eq_dvf + (base := base) fbar with + ⟨P, hP⟩ + rcases target.residue_surjective xbar with ⟨a0, ha0⟩ + rcases target.exists_uniformizer with ⟨pi, hpi⟩ + let Q : target.valuationSubring[X] := + P.map (algebraMap base.valuationSubring target.valuationSubring) + have hred : + Q.map target.residueMap = + fbar.map (algebraMap base.residueField target.residueField) := by + exact base_polynomial_lift_target_reduction_eq_dvf + (base := base) (target := target) hP + have hrootbar : + (fbar.map + (algebraMap base.residueField target.residueField)).eval xbar = 0 := by + dsimp [fbar] + rw [Polynomial.eval_map_algebraMap] + exact minpoly.aeval base.residueField xbar + have hsimplebar : + ((fbar.map + (algebraMap base.residueField target.residueField)).derivative).eval + xbar ≠ 0 := by + dsimp [fbar] + rw [Polynomial.derivative_map, Polynomial.eval_map_algebraMap] + exact hsep.aeval_derivative_ne_zero + (minpoly.aeval base.residueField xbar) + have hroot : + (Q.map target.residueMap).eval (target.residueMap a0) = 0 := by + rw [hred, ha0] + exact hrootbar + have hsimple : + ((Q.map target.residueMap).derivative).eval + (target.residueMap a0) ≠ 0 := by + rw [hred, ha0] + exact hsimplebar + have hQmem : Q.eval a0 ∈ target.maximalIdeal := + polynomial_eval_mem_maximalIdeal_of_reduced_eval_eq_zero_dvf + (target := target) hroot + have hQderiv : IsUnit (Q.derivative.eval a0) := + polynomial_derivative_eval_isUnit_of_reduced_ne_zero_dvf + (target := target) hsimple + rcases exists_residue_eq_polynomial_eval_isUniformizer_dvf + (target := target) (P := Q) (a := a0) (pi := pi) + hpi hQmem hQderiv with + ⟨a, hares, hauniform⟩ + have hsimpleA : + ((Q.map target.residueMap).derivative).eval + (target.residueMap a) ≠ 0 := by + rw [hares] + exact hsimple + have hderivA : IsUnit (Q.derivative.eval a) := + polynomial_derivative_eval_isUnit_of_reduced_ne_zero_dvf + (target := target) hsimpleA + refine ⟨P, a, ?_, ?_, ?_⟩ + · rw [hares, ha0] + exact hprim + · have heval : Q.eval a = Polynomial.aeval a P := by + rw [Polynomial.aeval_def, Polynomial.eval₂_eq_eval_map] + rw [← heval] + exact hauniform + · exact hderivA + +/-- The full noncomplete generator data used by the monogenic integral-generator theorem and the +first ramification-quotient homomorphism: a primitive residue lift, a lifted polynomial whose +value is a +uniformizer, its unit derivative, and generation of the entire target +valuation ring. -/ +theorem exists_valuationSubring_generator_data_of_uniqueExtension + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + [Algebra.IsSeparable base.residueField target.residueField] : + ∃ P : base.valuationSubring[X], ∃ a : target.valuationSubring, + IntermediateField.adjoin base.residueField + ({target.residueMap a} : Set target.residueField) = + (⊤ : IntermediateField base.residueField target.residueField) ∧ + target.valuation.IsUniformizer (Polynomial.aeval a P : L) ∧ + IsUnit + ((P.map + (algebraMap base.valuationSubring target.valuationSubring)).derivative.eval a) ∧ + Algebra.adjoin base.valuationSubring + ({a} : Set target.valuationSubring) = + (⊤ : Subalgebra base.valuationSubring target.valuationSubring) := by + let : Module.Finite base.valuationSubring target.valuationSubring := + target_valuationSubring_moduleFinite_of_uniqueExtension + (base := base) (target := target) huniq + let : FiniteDimensional base.residueField target.residueField := + residueField_finiteDimensional_of_moduleFinite_dvf + (base := base) (target := target) + rcases exists_primitive_residue_lift_polynomial_uniformizer_dvf + (base := base) (target := target) with + ⟨P, a, hprim, hpi, hderiv⟩ + let A : Subalgebra base.valuationSubring target.valuationSubring := + Algebra.adjoin base.valuationSubring ({a} : Set target.valuationSubring) + let e : ℕ := + Ideal.ramificationIdx' base.maximalIdeal target.maximalIdeal + have hmap : + Ideal.map (algebraMap base.valuationSubring target.valuationSubring) + base.maximalIdeal = + target.maximalIdeal ^ e := by + exact map_maximalIdeal_eq_pow_ramificationIdx_dvf + (base := base) (target := target) + have htop : + (⊤ : Submodule base.valuationSubring target.valuationSubring) ≤ + A.toSubmodule ⊔ + base.maximalIdeal • + (⊤ : Submodule base.valuationSubring target.valuationSubring) := by + intro z _hz + rcases exists_mem_adjoin_sub_mem_maximalIdeal_pow_dvf + (base := base) (target := target) (P := P) (a := a) + hprim hpi e z with + ⟨y, hyA, hdiff⟩ + have hySub : y ∈ A.toSubmodule := by + simpa [A] using hyA + have hdiffMap : + z - y ∈ + Ideal.map + (algebraMap base.valuationSubring target.valuationSubring) + base.maximalIdeal := by + rw [hmap] + exact hdiff + have hdiffSmul : + z - y ∈ + base.maximalIdeal • + (⊤ : Submodule base.valuationSubring target.valuationSubring) := by + simpa [Ideal.smul_top_eq_map] using hdiffMap + have hsum : + y + (z - y) ∈ + A.toSubmodule ⊔ + base.maximalIdeal • + (⊤ : Submodule base.valuationSubring target.valuationSubring) := + Submodule.add_mem_sup hySub hdiffSmul + have hsumEq : y + (z - y) = z := by ring + rw [hsumEq] at hsum + exact hsum + have hjac : + base.maximalIdeal ≤ + Ideal.jacobson (⊥ : Ideal base.valuationSubring) := by + simpa using + (IsLocalRing.maximalIdeal_le_jacobson + (⊥ : Ideal base.valuationSubring)) + have hle : + (⊤ : Submodule base.valuationSubring target.valuationSubring) ≤ + A.toSubmodule := + Submodule.le_of_le_smul_of_le_jacobson_bot + (I := base.maximalIdeal) (N := A.toSubmodule) + (N' := (⊤ : Submodule base.valuationSubring target.valuationSubring)) + Module.Finite.fg_top hjac htop + have hA : A.toSubmodule = ⊤ := le_antisymm le_top hle + exact ⟨P, a, hprim, hpi, hderiv, Algebra.toSubmodule_eq_top.mp hA⟩ + +/-- A noncomplete monogeneity theorem for integral valuation rings. -/ +theorem exists_valuationSubring_adjoin_eq_top_of_uniqueExtension + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + [Algebra.IsSeparable base.residueField target.residueField] : + ∃ a : target.valuationSubring, + Algebra.adjoin base.valuationSubring + ({a} : Set target.valuationSubring) = + (⊤ : Subalgebra base.valuationSubring target.valuationSubring) := by + rcases exists_valuationSubring_generator_data_of_uniqueExtension + (base := base) (target := target) huniq with + ⟨_P, a, _hprim, _hpi, _hderiv, ha⟩ + exact ⟨a, ha⟩ + +end Higher +end RamificationTheory.HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/OrbitPolynomialIdeal.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/OrbitPolynomialIdeal.lean new file mode 100644 index 0000000000..6fd877574d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/OrbitPolynomialIdeal.lean @@ -0,0 +1,552 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniformizerGradedHom +/-! +# Quotient-depth identity over a general DVF + +This file proves the orbit-polynomial ideal identity before normalization of +the fixed-field valuation. It uses the literal fixed field and its literal +restricted valuation ring; no completeness or Henselian hypothesis occurs. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w x + +namespace RamificationTheory.HilbertRamification +namespace Higher + +open scoped Polynomial + +/-- A polynomial vanishing at every point of a finite set is divisible by +the product of the corresponding distinct linear factors. -/ +theorem prod_X_sub_C_dvd_of_eval_eq_zero_dvf + {R : Type*} [CommRing R] [IsDomain R] + (s : Finset R) (p : Polynomial R) + (hp : ∀ a ∈ s, p.eval a = 0) : + (∏ a ∈ s, (Polynomial.X - Polynomial.C a)) ∣ p := by + classical + induction s using Finset.induction_on generalizing p with + | empty => simp + | @insert a s ha ih => + have hroot : p.IsRoot a := hp a (Finset.mem_insert_self a s) + rcases Polynomial.dvd_iff_isRoot.mpr hroot with ⟨q, hq⟩ + have hqzero : ∀ z ∈ s, q.eval z = 0 := by + intro z hz + have hzroot : p.eval z = 0 := hp z (Finset.mem_insert_of_mem hz) + have hmul : (z - a) * q.eval z = 0 := by + rw [hq, Polynomial.eval_mul] at hzroot + simpa using hzroot + exact (mul_eq_zero.mp hmul).resolve_left (sub_ne_zero.mpr (by + intro hza + subst z + exact ha hz)) + rcases ih q hqzero with ⟨r, hr⟩ + refine ⟨r, ?_⟩ + rw [hq, hr] + simp only [Finset.prod_insert, ha, not_false_eq_true] + ring + +/-- States the theorem `fintype_prod_X_sub_C_dvd_of_eval_eq_zero_of_injective_dvf`. -/ +theorem fintype_prod_X_sub_C_dvd_of_eval_eq_zero_of_injective_dvf + {R ι : Type*} [CommRing R] [IsDomain R] [Fintype ι] + (r : ι → R) (hr : Function.Injective r) (p : Polynomial R) + (hp : ∀ i, p.eval (r i) = 0) : + (∏ i, (Polynomial.X - Polynomial.C (r i))) ∣ p := by + classical + have hdiv := prod_X_sub_C_dvd_of_eval_eq_zero_dvf + (Finset.univ.image r) p (by + intro a ha + rcases Finset.mem_image.mp ha with ⟨i, _hi, rfl⟩ + exact hp i) + have hprod : + (∏ a ∈ Finset.univ.image r, (Polynomial.X - Polynomial.C a)) = + ∏ i : ι, (Polynomial.X - Polynomial.C (r i)) := by + rw [Finset.prod_image] + intro i _hi j _hj hij + exact hr hij + rwa [hprod] at hdiv + +/-- States the theorem `polynomial_eval_mem_ideal_of_coeff_mem_dvf`. -/ +theorem polynomial_eval_mem_ideal_of_coeff_mem_dvf + {R : Type*} [CommRing R] (I : Ideal R) (p : Polynomial R) (z : R) + (hp : ∀ n, p.coeff n ∈ I) : p.eval z ∈ I := by + rw [Polynomial.eval_eq_sum, Polynomial.sum] + exact sum_mem fun n _hn => I.mul_mem_right (z ^ n) (hp n) + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] +variable {base : ValuationTheory.DiscreteValuationField.DVF.{u, v} K} +variable {target : ValuationTheory.DiscreteValuationField.DVF.{w, x} L} +variable [base.valuation.HasExtension target.valuation] +variable [FiniteDimensional K L] [IsGalois K L] + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- A generator of the top valuation ring has a faithful Galois orbit. -/ +theorem valuationSubringAutOfUniqueExtension_generator_injective + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + {z : target.valuationSubring} + (hz : Algebra.adjoin base.valuationSubring + ({z} : Set target.valuationSubring) = ⊤) : + Function.Injective + (fun sigma : Gal(L/K) => + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma z) := by + intro sigma tau hst + have hring : + (valuationSubringAlgEquivOfUniqueExtension + (base := base) (target := target) huniq sigma).toAlgHom = + (valuationSubringAlgEquivOfUniqueExtension + (base := base) (target := target) huniq tau).toAlgHom := by + apply AlgHom.ext_of_adjoin_eq_top hz + intro a ha + rw [Set.mem_singleton_iff] at ha + subst a + exact hst + have hfix (a : target.valuationSubring) : + sigma (algebraMap target.valuationSubring L a) = + tau (algebraMap target.valuationSubring L a) := by + change sigma (a : L) = tau (a : L) + have ha := congrArg Subtype.val (DFunLike.congr_fun hring a) + change sigma (a : L) = tau (a : L) at ha + exact ha + apply AlgEquiv.ext + intro a + let : IsFractionRing target.valuationSubring L := + target.valuationSubring_isFractionRing + obtain ⟨b, c, _hc, ha⟩ := + IsFractionRing.div_surjective (A := target.valuationSubring) a + rw [← ha, map_div₀, map_div₀, hfix b, hfix c] + +/-- The polynomial whose roots are the `H`-orbit of the top generator. -/ +def subgroupOrbitPolynomialDVF + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) (z : target.valuationSubring) : + Polynomial target.valuationSubring := by + classical + letI : Fintype H := Fintype.ofFinite H + exact ∏ tau : H, + (Polynomial.X - Polynomial.C + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq tau z)) + +omit [IsGalois K L] in +/-- States the theorem `subgroupOrbitPolynomialDVF_map_aut`. -/ +theorem subgroupOrbitPolynomialDVF_map_aut + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) (z : target.valuationSubring) (rho : H) : + (subgroupOrbitPolynomialDVF + (base := base) (target := target) huniq H z).map + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq rho).toRingHom = + subgroupOrbitPolynomialDVF + (base := base) (target := target) huniq H z := by + classical + let : Fintype H := Fintype.ofFinite H + change + (∏ tau : H, (Polynomial.X - Polynomial.C + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq tau z))).map + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq rho).toRingHom = + ∏ tau : H, (Polynomial.X - Polynomial.C + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq tau z)) + rw [Polynomial.map_prod] + simp only [Polynomial.map_sub, Polynomial.map_X, Polynomial.map_C] + exact Fintype.prod_equiv (Equiv.mulLeft rho) + (fun tau : H => Polynomial.X - Polynomial.C + ((valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq rho).toRingHom + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq tau z))) + (fun tau : H => Polynomial.X - Polynomial.C + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq tau z)) + (fun _ => by congr 2) + +/-- Every orbit-polynomial coefficient, packaged in the literal restricted +valuation ring of the actual fixed field. -/ +def subgroupOrbitPolynomialCoeffFixedFieldDVF + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) (z : target.valuationSubring) (n : ℕ) : + fixedFieldValuationSubringDVF (K := K) (target := target) H := by + let c := (subgroupOrbitPolynomialDVF + (base := base) (target := target) huniq H z).coeff n + refine ⟨⟨(c : L), ?_⟩, c.property⟩ + intro rho + have hmap := congrArg + (fun p : Polynomial target.valuationSubring => p.coeff n) + (subgroupOrbitPolynomialDVF_map_aut + (base := base) (target := target) huniq H z rho) + have hcoeff := congrArg Subtype.val hmap + change (rho : Gal(L/K)) (c : L) = (c : L) + simpa [c] using hcoeff + +/-- Product of generator displacements over the right coset `sigma H`. -/ +def cosetGeneratorDisplacementProductDVF + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) (sigma : Gal(L/K)) + (z : target.valuationSubring) : target.valuationSubring := by + classical + letI : Fintype H := Fintype.ofFinite H + exact ∏ tau : H, + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq (sigma * tau) z - z) + +omit [IsGalois K L] in +/-- States the theorem `subgroupOrbitPolynomialDVF_eval_self`. -/ +theorem subgroupOrbitPolynomialDVF_eval_self + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) (z : target.valuationSubring) : + (subgroupOrbitPolynomialDVF + (base := base) (target := target) huniq H z).eval z = 0 := by + classical + let : Fintype H := Fintype.ofFinite H + simp only [subgroupOrbitPolynomialDVF, Polynomial.eval_prod, + Polynomial.eval_sub, Polynomial.eval_X, Polynomial.eval_C] + apply Finset.prod_eq_zero (Finset.mem_univ (⟨1, H.one_mem⟩ : H)) + simp + +omit [IsGalois K L] in +/-- States the theorem `subgroupOrbitPolynomialDVF_map_eval_eq_sign_mul_cosetProduct`. -/ +theorem subgroupOrbitPolynomialDVF_map_eval_eq_sign_mul_cosetProduct + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) (sigma : Gal(L/K)) + (z : target.valuationSubring) : + ((subgroupOrbitPolynomialDVF + (base := base) (target := target) huniq H z).map + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma).toRingHom).eval z = + (-1) ^ Nat.card H * cosetGeneratorDisplacementProductDVF + (base := base) (target := target) huniq H sigma z := by + classical + let : Fintype H := Fintype.ofFinite H + let es := valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma + simp only [subgroupOrbitPolynomialDVF, Polynomial.map_prod, + Polynomial.map_sub, Polynomial.map_X, Polynomial.map_C, + Polynomial.eval_prod, Polynomial.eval_sub, Polynomial.eval_X, + Polynomial.eval_C] + change (∏ tau : H, + (z - es (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq tau z))) = _ + change (∏ tau : H, + (z - es (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq tau z))) = + (-1) ^ Nat.card H * ∏ tau : H, + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq (sigma * tau) z - z) + calc + (∏ tau : H, + (z - es (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq tau z))) = + ∏ tau : H, -(valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq (sigma * tau) z - z) := by + apply Finset.prod_congr rfl + intro tau _ + rw [show es (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq tau z) = + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq (sigma * tau) z by + simp [es]] + ring + _ = (-1) ^ Nat.card H * ∏ tau : H, + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq (sigma * tau) z - z) := by + simpa only [Nat.card_eq_fintype_card, Finset.card_univ] using + (Finset.prod_neg (s := Finset.univ) + (fun tau : H => valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq (sigma * tau) z - z)) + +/-- Inclusion into `O_L` intertwines the quotient automorphism with any chosen top lift. -/ +theorem fixedFieldToTarget_quotientAut_apply_dvf + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] + (sigma : Gal(L/K)) + (a : fixedFieldValuationSubringDVF (K := K) (target := target) H) : + fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H + (fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H + (IsGalois.normalAutEquivQuotient H sigma) a) = + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma + (fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H a) := by + rw [fixedFieldValuationSubringAutDVF_normalAutEquivQuotient] + exact fixedFieldValuationSubringDVFToTarget_aut_apply + (base := base) (target := target) huniq H sigma a + +omit [IsGalois K L] in +/-- The coset product divides every top displacement coming from the actual +fixed valuation ring. -/ +theorem cosetGeneratorDisplacementProductDVF_dvd_fixed_displacement + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) (sigma : Gal(L/K)) + {z : target.valuationSubring} + (hz : Algebra.adjoin base.valuationSubring + ({z} : Set target.valuationSubring) = ⊤) + (a : fixedFieldValuationSubringDVF (K := K) (target := target) H) : + cosetGeneratorDisplacementProductDVF + (base := base) (target := target) huniq H sigma z ∣ + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma + (fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H a) - + fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H a := by + classical + let : Fintype H := Fintype.ofFinite H + let aL := fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H a + have ha_adjoin : aL ∈ Algebra.adjoin base.valuationSubring + ({z} : Set target.valuationSubring) := by rw [hz]; simp + rw [Algebra.adjoin_singleton_eq_range_aeval] at ha_adjoin + rcases ha_adjoin with ⟨g, hg⟩ + have hg' : Polynomial.aeval z g = aL := by simpa using hg + let p : Polynomial target.valuationSubring := + g.map (algebraMap base.valuationSubring target.valuationSubring) - + Polynomial.C aL + let r : H → target.valuationSubring := fun tau => + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq tau z + have hr : Function.Injective r := by + intro tau upsilon htu + apply Subtype.ext + exact valuationSubringAutOfUniqueExtension_generator_injective + (base := base) (target := target) huniq hz htu + have hp : ∀ tau : H, p.eval (r tau) = 0 := by + intro tau + have hmap : + valuationSubringAlgEquivOfUniqueExtension + (base := base) (target := target) huniq tau + (Polynomial.aeval z g) = + Polynomial.aeval + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq tau z) g := by + calc + valuationSubringAlgEquivOfUniqueExtension + (base := base) (target := target) huniq tau + (Polynomial.aeval z g) = + Polynomial.aeval + (valuationSubringAlgEquivOfUniqueExtension + (base := base) (target := target) huniq tau z) g := + (Polynomial.aeval_algHom_apply + (valuationSubringAlgEquivOfUniqueExtension + (base := base) (target := target) huniq tau).toAlgHom z g).symm + _ = Polynomial.aeval + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq tau z) g := + congrArg (fun t : target.valuationSubring => Polynomial.aeval t g) + (show valuationSubringAlgEquivOfUniqueExtension + (base := base) (target := target) huniq tau z = + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq tau z by rfl) + have hfixed : + valuationSubringAlgEquivOfUniqueExtension + (base := base) (target := target) huniq tau aL = aL := by + apply Subtype.ext + exact (a : fixedFieldDVF (K := K) H).property tau + simp only [p, r, Polynomial.eval_sub, Polynomial.eval_map_algebraMap, + Polynomial.eval_C] + change Polynomial.aeval + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq tau z) g - aL = 0 + rw [← hmap, hg', hfixed, sub_self] + have horbit_dvd : subgroupOrbitPolynomialDVF + (base := base) (target := target) huniq H z ∣ p := + fintype_prod_X_sub_C_dvd_of_eval_eq_zero_of_injective_dvf r hr p hp + let es := valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma + have hmap_dvd := Polynomial.map_dvd es.toRingHom horbit_dvd + have heval_dvd := map_dvd (Polynomial.evalRingHom z) hmap_dvd + have hproduct_dvd_eval : + cosetGeneratorDisplacementProductDVF + (base := base) (target := target) huniq H sigma z ∣ + (p.map es.toRingHom).eval z := by + apply dvd_trans + (b := (-1) ^ Nat.card H * + cosetGeneratorDisplacementProductDVF + (base := base) (target := target) huniq H sigma z) + · exact dvd_mul_left _ _ + · rw [← subgroupOrbitPolynomialDVF_map_eval_eq_sign_mul_cosetProduct + (base := base) (target := target) huniq H sigma z] + exact heval_dvd + have heval_p : (p.map es.toRingHom).eval z = + -(valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma aL - aL) := by + have hcoeffmap : + (g.map (algebraMap base.valuationSubring target.valuationSubring)).map + es.toRingHom = + g.map (algebraMap base.valuationSubring target.valuationSubring) := by + ext n + simp [es] + simp only [p, Polynomial.map_sub, hcoeffmap, Polynomial.map_C, + Polynomial.eval_sub, Polynomial.eval_map_algebraMap, Polynomial.eval_C] + rw [hg'] + change aL - es aL = -(es aL - aL) + ring + rw [heval_p] at hproduct_dvd_eval + exact dvd_neg.mp hproduct_dvd_eval + +/-- The coset product belongs to the image of the actual fixed-field +displacement ideal. -/ +theorem cosetGeneratorDisplacementProductDVF_mem_map_fixedFieldDisplacementIdeal + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] + (sigma : Gal(L/K)) (z : target.valuationSubring) : + cosetGeneratorDisplacementProductDVF + (base := base) (target := target) huniq H sigma z ∈ + Ideal.map (fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H) + (fixedFieldDisplacementIdealDVF + (base := base) (target := target) huniq H + (IsGalois.normalAutEquivQuotient H sigma)) := by + classical + let : Fintype H := Fintype.ofFinite H + let f := subgroupOrbitPolynomialDVF + (base := base) (target := target) huniq H z + let es := valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma + let q : Polynomial target.valuationSubring := + f.map es.toRingHom - f + let I := Ideal.map (fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H) + (fixedFieldDisplacementIdealDVF + (base := base) (target := target) huniq H + (IsGalois.normalAutEquivQuotient H sigma)) + have hcoeff : ∀ n, q.coeff n ∈ I := by + intro n + let c := subgroupOrbitPolynomialCoeffFixedFieldDVF + (base := base) (target := target) huniq H z n + have hgen : + fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H + (IsGalois.normalAutEquivQuotient H sigma) c - c ∈ + fixedFieldDisplacementIdealDVF + (base := base) (target := target) huniq H + (IsGalois.normalAutEquivQuotient H sigma) := + Ideal.subset_span ⟨c, rfl⟩ + have hmap := Ideal.mem_map_of_mem + (fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H) hgen + have hc : + fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H c = + (subgroupOrbitPolynomialDVF + (base := base) (target := target) huniq H z).coeff n := + rfl + have hmap' : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma + (fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H c) - + fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H c ∈ + Ideal.map (fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H) + (fixedFieldDisplacementIdealDVF + (base := base) (target := target) huniq H + (IsGalois.normalAutEquivQuotient H sigma)) := by + simpa only [map_sub, fixedFieldToTarget_quotientAut_apply_dvf] using hmap + rw [hc] at hmap' + simpa [q, f, es, I, Polynomial.coeff_map] using hmap' + have hqeval : q.eval z ∈ I := + polynomial_eval_mem_ideal_of_coeff_mem_dvf I q z hcoeff + have hqeval_eq : q.eval z = (-1) ^ Nat.card H * + cosetGeneratorDisplacementProductDVF + (base := base) (target := target) huniq H sigma z := by + rw [show q = (subgroupOrbitPolynomialDVF + (base := base) (target := target) huniq H z).map + es.toRingHom - + subgroupOrbitPolynomialDVF + (base := base) (target := target) huniq H z by rfl] + rw [Polynomial.eval_sub, + subgroupOrbitPolynomialDVF_map_eval_eq_sign_mul_cosetProduct, + subgroupOrbitPolynomialDVF_eval_self, sub_zero] + have hsign : (-1) ^ Nat.card H * + cosetGeneratorDisplacementProductDVF + (base := base) (target := target) huniq H sigma z ∈ I := by + rwa [← hqeval_eq] + exact (I.unit_mul_mem_iff_mem (by simp : + IsUnit ((-1 : target.valuationSubring) ^ Nat.card H))).mp hsign + +/-- The quotient-depth identity, ideal-level form. -/ +theorem span_cosetGeneratorDisplacementProduct_eq_map_fixedFieldDisplacementIdeal + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] + (sigma : Gal(L/K)) {z : target.valuationSubring} + (hz : Algebra.adjoin base.valuationSubring + ({z} : Set target.valuationSubring) = ⊤) : + Ideal.span ({cosetGeneratorDisplacementProductDVF + (base := base) (target := target) huniq H sigma z} : + Set target.valuationSubring) = + Ideal.map (fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H) + (fixedFieldDisplacementIdealDVF + (base := base) (target := target) huniq H + (IsGalois.normalAutEquivQuotient H sigma)) := by + apply le_antisymm + · rw [Ideal.span_le] + rintro d hd + rw [Set.mem_singleton_iff] at hd + subst d + exact cosetGeneratorDisplacementProductDVF_mem_map_fixedFieldDisplacementIdeal + (base := base) (target := target) huniq H sigma z + · rw [Ideal.map_le_iff_le_comap] + change Ideal.span + {d | ∃ a : fixedFieldValuationSubringDVF + (K := K) (target := target) H, + d = fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H + (IsGalois.normalAutEquivQuotient H sigma) a - a} ≤ _ + rw [Ideal.span_le] + rintro d ⟨a, rfl⟩ + change fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H + (fixedFieldValuationSubringAutDVF + (base := base) (target := target) huniq H + (IsGalois.normalAutEquivQuotient H sigma) a - a) ∈ + Ideal.span ({cosetGeneratorDisplacementProductDVF + (base := base) (target := target) huniq H sigma z} : + Set target.valuationSubring) + rw [map_sub, fixedFieldToTarget_quotientAut_apply_dvf] + apply Ideal.mem_span_singleton.mpr + exact cosetGeneratorDisplacementProductDVF_dvd_fixed_displacement + (base := base) (target := target) huniq H sigma hz a + +end Higher +end RamificationTheory.HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/PadicLocalization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/PadicLocalization.lean new file mode 100644 index 0000000000..a8df81fed8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/PadicLocalization.lean @@ -0,0 +1,115 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.DegreeNormTrace +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.Padic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldLocalization +public import Mathlib.FieldTheory.Galois.Abelian +/-! +# Localizations at rational p-adic absolute values + +This file collects the reusable algebra, finiteness, Galois, and +nonarchimedean facts needed to compare a global algebraic localization with +an extension of `ℚ_[p]`. +-/ + +@[expose] public section + +noncomputable +section + +namespace HilbertRamification + +open AlgebraicNumberTheory.Valuations + +/-- Transport an algebra structure across an equivalence of its base ring. -/ +@[reducible] noncomputable def transportedAlgebraAlongRingEquiv + {K K' E : Type*} [CommSemiring K] [CommSemiring K'] [CommSemiring E] + [Algebra K E] (e : K ≃+* K') : Algebra K' E := + ((algebraMap K E).comp e.symm.toRingHom).toAlgebra + +/-- The transported algebra map is the original algebra map precomposed with +the inverse base-ring equivalence. -/ +@[simp] +theorem transportedAlgebraAlongRingEquiv_algebraMap + {K K' E : Type*} [CommSemiring K] [CommSemiring K'] [CommSemiring E] + [Algebra K E] (e : K ≃+* K') (x : K') : + @algebraMap K' E _ _ (transportedAlgebraAlongRingEquiv e) x = + algebraMap K E (e.symm x) := + rfl + +variable (p : ℕ) [Fact p.Prime] +variable (L : Type) [Field L] [Algebra ℚ L] + [FiniteDimensional ℚ L] [IsAbelianGalois ℚ L] + +/-- The localization of a finite global extension is finite over the +completed base field. -/ +theorem globalPadicLocalizationModuleFinite + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) L) : + let vK := Rat.AbsoluteValue.padic p + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := ℚ) w.1 + letI : SMul ℚ w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + Module.Finite vK.Completion + (AbsoluteValue.algebraicLocalization vK w.1 w.2) := by + let vK := Rat.AbsoluteValue.padic p + let hvK := padicAbsoluteValue_isNontrivial p + let hK := AbsoluteValue.extensionCompletionAlgebra (K := ℚ) w.1 + let : SMul ℚ w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + let : Module.Finite vK.Completion w.1.Completion := + completionModuleFinite vK hvK w + exact FiniteDimensional.of_injective E.val.toLinearMap E.val.injective + +omit [FiniteDimensional ℚ L] in +/-- The localization of a finite abelian global extension is abelian Galois +over the completed base. -/ +theorem globalPadicLocalization_isAbelianGalois + (w : AbsoluteValueExtension (Rat.AbsoluteValue.padic p) L) : + let vK := Rat.AbsoluteValue.padic p + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := ℚ) w.1 + letI : SMul ℚ w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + IsAbelianGalois vK.Completion + (AbsoluteValue.algebraicLocalization vK w.1 w.2) := by + let vK := Rat.AbsoluteValue.padic p + let hvK := padicAbsoluteValue_isNontrivial p + let hK := AbsoluteValue.extensionCompletionAlgebra (K := ℚ) w.1 + let : SMul ℚ w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + let : IsGalois vK.Completion E := + algebraicLocalization_isGalois vK w + let e := decompositionGroupEquivAlgebraicLocalizationAut vK hvK w + exact + { is_comm.comm := fun σ τ ↦ by + apply e.symm.injective + rw [map_mul, map_mul] + apply Subtype.ext + exact + (inferInstance : + IsMulCommutative (L ≃ₐ[ℚ] L)).is_comm.comm _ _ + } + +/-- The rational `p`-adic absolute value is nonarchimedean in the bounded +natural-number sense used by the ramification API. -/ +theorem rationalPadicAbsoluteValue_nonarchimedean : + LubinTate.Valuations.NonarchimedeanAbsoluteValue + (Rat.AbsoluteValue.padic p) := by + apply LubinTate.Valuations.nonarchimedean_of_strong_triangle + intro x y + change + ((padicNorm p (x + y) : ℚ) : ℝ) ≤ + max ((padicNorm p x : ℚ) : ℝ) ((padicNorm p y : ℚ) : ℝ) + exact_mod_cast padicNorm.nonarchimedean + +end HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Polynomial.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Polynomial.lean new file mode 100644 index 0000000000..cea68e4046 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Polynomial.lean @@ -0,0 +1,53 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Polynomial.Eval.Defs +public import Mathlib.Algebra.Ring.GeomSum +public import Mathlib.RingTheory.Ideal.Defs +public import Mathlib.Tactic.Ring +/-! +# Hilbert ramification theory: polynomial sources + +This file contains the generic polynomial congruence lemma used by the +completion-free formalization of ramification-number theory. +-/ + +@[expose] public section + +namespace RamificationTheory.HilbertRamification +namespace Higher + +/-- If two evaluation points are congruent modulo an ideal, then evaluating +any polynomial at them gives congruent results modulo the same ideal. -/ +theorem polynomial_eval₂_sub_mem_of_sub_mem + {R S : Type*} [CommRing R] [CommRing S] + (f : R →+* S) (I : Ideal S) {x y : S} (hxy : x - y ∈ I) + (P : Polynomial R) : + P.eval₂ f x - P.eval₂ f y ∈ I := by + induction P using Polynomial.induction_on' with + | add P Q hP hQ => + rw [Polynomial.eval₂_add, Polynomial.eval₂_add] + have hsum : (P.eval₂ f x - P.eval₂ f y) + + (Q.eval₂ f x - Q.eval₂ f y) ∈ I := + Ideal.add_mem I hP hQ + convert hsum using 1 + ring + | monomial n a => + rw [Polynomial.eval₂_monomial, Polynomial.eval₂_monomial] + have hpow : x ^ n - y ^ n ∈ I := by + rcases sub_dvd_pow_sub_pow x y n with ⟨c, hc⟩ + rw [hc] + exact Ideal.mul_mem_right c I hxy + have hrewrite : f a * x ^ n - f a * y ^ n = + f a * (x ^ n - y ^ n) := by + ring + rw [hrewrite] + exact Ideal.mul_mem_left I (f a) hpow + +end Higher +end RamificationTheory.HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationCharacterization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationCharacterization.lean new file mode 100644 index 0000000000..6833e79798 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationCharacterization.lean @@ -0,0 +1,94 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring +/-! +# Ramification inside the decomposition group + +The principal-unit condition forces trivial residue action, so the +ramification group inside inertia has a canonical image in the +decomposition group. + +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace RamificationTheory +namespace HilbertRamification +namespace ValuationSubring + +variable (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + +/-- The intrinsic principal-unit ramification condition already forces an +element of the decomposition group to lie in inertia. -/ +theorem ramificationCondition_mem_inertiaGroup + (A : _root_.ValuationSubring L) (sigma : decompositionGroup K A) + (hsigma : ∀ x : Lˣ, + automorphismUnitQuotient K A sigma x ∈ A.principalUnitGroup) : + sigma ∈ inertiaGroup K A := by + rw [← residueAction_ker (K := K) A, MonoidHom.mem_ker] + ext z + change sigma • z = z + induction z using Quotient.inductionOn' with + | h a => + change sigma • IsLocalRing.residue A a = IsLocalRing.residue A a + rw [← IsLocalRing.ResidueField.residue_smul] + by_cases ha : (a : L) = 0 + · have ha' : a = 0 := Subtype.ext ha + subst a + simp + · let x : Lˣ := Units.mk0 (a : L) ha + have hx : A.valuation + ((automorphismUnitQuotient K A sigma x : L) - 1) < 1 := + (A.mem_principalUnitGroup_iff + (automorphismUnitQuotient K A sigma x)).mp (hsigma x) + rw [← sub_eq_zero, ← map_sub, IsLocalRing.residue_eq_zero_iff, + A.valuation_lt_one_iff] + have hfield : + (((sigma • a - a : A) : A) : L) = + (a : L) * + ((automorphismUnitQuotient K A sigma x : L) - 1) := by + simp [automorphismUnitQuotient, x, div_eq_mul_inv, mul_sub, ha, + mul_comm] + rfl + rw [show ((sigma • a - a : A) : L) = + (a : L) * + ((automorphismUnitQuotient K A sigma x : L) - 1) by + simpa using hfield, + Valuation.map_mul] + exact (mul_le_of_le_one_left zero_le + (A.valuation_le_one a)).trans_lt hx + +/-- The ramification group transported from inertia into the decomposition group. -/ +abbrev ramificationGroupInDecomposition + (A : _root_.ValuationSubring L) : + Subgroup (decompositionGroup K A) := + Subgroup.map (inertiaGroup K A).subtype (ramificationGroup K A) +/-- Membership in the transported ramification group is the intrinsic principal-unit condition. -/ +theorem mem_ramificationGroupInDecomposition_iff + (A : _root_.ValuationSubring L) (sigma : decompositionGroup K A) : + sigma ∈ ramificationGroupInDecomposition K A ↔ + ∀ x : Lˣ, + automorphismUnitQuotient K A sigma x ∈ A.principalUnitGroup := by + constructor + · rintro ⟨iota, hiota, rfl⟩ + exact hiota + · intro hsigma + have hi : sigma ∈ inertiaGroup K A := + ramificationCondition_mem_inertiaGroup (K := K) A sigma hsigma + exact ⟨⟨sigma, hi⟩, hsigma, rfl⟩ + +end ValuationSubring +end HilbertRamification +end RamificationTheory +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationDepth.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationDepth.lean new file mode 100644 index 0000000000..34705cbace --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationDepth.lean @@ -0,0 +1,282 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumber +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniformizerGradedHom +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Average +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal +/-! +# General-DVF ramification numbers as a nonarchimedean depth +-/ + +@[expose] public section + +noncomputable +section + +universe u v w x + +namespace RamificationTheory.HilbertRamification +namespace Higher + + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] +variable {base : ValuationTheory.DiscreteValuationField.DVF.{u, v} K} +variable {target : ValuationTheory.DiscreteValuationField.DVF.{w, x} L} +variable [base.valuation.HasExtension target.valuation] + +/-- The additive valuation of the target DVR is invariant under the +valuation-ring action supplied by unique extension. -/ +theorem addVal_valuationSubringAutOfUniqueExtension + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (sigma : Gal(L/K)) (a : target.valuationSubring) : + IsDiscreteValuationRing.addVal target.valuationSubring + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a) = + IsDiscreteValuationRing.addVal target.valuationSubring a := + IsDiscreteValuationRing.addVal_ringEquiv + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma) a + +/-- Product displacement identity for the unique-extension action. -/ +theorem valuationSubringAutOfUniqueExtension_mul_sub_eq + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (a : target.valuationSubring) (sigma tau : Gal(L/K)) : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq (sigma * tau) a - a = + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq tau a - a) + + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a - a) := by + rw [valuationSubringAutOfUniqueExtension_mul_apply, map_sub] + ring + +/-- States the theorem `ramificationNumberOfUniqueExtension_mul_ge_min`. -/ +theorem ramificationNumberOfUniqueExtension_mul_ge_min + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (a : target.valuationSubring) (sigma tau : Gal(L/K)) : + min + (ramificationNumberOfUniqueExtension + (base := base) (target := target) huniq a sigma) + (ramificationNumberOfUniqueExtension + (base := base) (target := target) huniq a tau) ≤ + ramificationNumberOfUniqueExtension + (base := base) (target := target) huniq a (sigma * tau) := by + simp only [ramificationNumberOfUniqueExtension] + rw [valuationSubringAutOfUniqueExtension_mul_sub_eq + (base := base) (target := target) huniq] + rw [← addVal_valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq tau a - a)] + simpa [min_comm] using + (IsDiscreteValuationRing.addVal_add + (R := target.valuationSubring) + (a := valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq tau a - a)) + (b := valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a - a)) + +/-- States the theorem `ramificationNumberOfUniqueExtension_mul_eq_min_of_ne`. -/ +theorem ramificationNumberOfUniqueExtension_mul_eq_min_of_ne + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (a : target.valuationSubring) {sigma tau : Gal(L/K)} + (hne : ramificationNumberOfUniqueExtension + (base := base) (target := target) huniq a sigma ≠ + ramificationNumberOfUniqueExtension + (base := base) (target := target) huniq a tau) : + ramificationNumberOfUniqueExtension + (base := base) (target := target) huniq a (sigma * tau) = + min + (ramificationNumberOfUniqueExtension + (base := base) (target := target) huniq a sigma) + (ramificationNumberOfUniqueExtension + (base := base) (target := target) huniq a tau) := by + change IsDiscreteValuationRing.addVal target.valuationSubring + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq (sigma * tau) a - a) = _ + rw [valuationSubringAutOfUniqueExtension_mul_sub_eq + (base := base) (target := target) huniq] + have hdistinct : + IsDiscreteValuationRing.addVal target.valuationSubring + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq tau a - a)) ≠ + IsDiscreteValuationRing.addVal target.valuationSubring + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a - a) := by + rw [addVal_valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq] + exact fun h => hne h.symm + rw [(IsDiscreteValuationRing.addVal target.valuationSubring).map_add_of_distinct_val + hdistinct] + rw [addVal_valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq] + exact min_comm _ _ + +/-- States the theorem `ramificationNumberOfUniqueExtension_eq_top_iff`. -/ +theorem ramificationNumberOfUniqueExtension_eq_top_iff + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + {a : target.valuationSubring} + (ha : Algebra.adjoin base.valuationSubring + ({a} : Set target.valuationSubring) = ⊤) + (sigma : Gal(L/K)) : + ramificationNumberOfUniqueExtension + (base := base) (target := target) huniq a sigma = ⊤ ↔ sigma = 1 := by + constructor + · intro htop + have hafix : valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a = a := by + have hzero : valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a - a = 0 := + (IsDiscreteValuationRing.addVal_eq_top_iff).1 htop + exact sub_eq_zero.mp hzero + have hfix : ∀ b : target.valuationSubring, + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma b = b := by + have heq : + (valuationSubringAlgEquivOfUniqueExtension + (base := base) (target := target) huniq sigma).toAlgHom = + AlgHom.id base.valuationSubring target.valuationSubring := by + apply AlgHom.ext_of_adjoin_eq_top ha + intro b hb + simpa only [Set.mem_singleton_iff] using hb ▸ hafix + intro b + exact DFunLike.congr_fun heq b + apply AlgEquiv.ext + intro y + let : IsFractionRing target.valuationSubring L := + target.valuationSubring_isFractionRing + obtain ⟨b, c, _hc, hy⟩ := + IsFractionRing.div_surjective (A := target.valuationSubring) y + have hsigmab : sigma (b : L) = (b : L) := + congrArg Subtype.val (hfix b) + have hsigmac : sigma (c : L) = (c : L) := + congrArg Subtype.val (hfix c) + rw [← hy] + change sigma ((b : L) / (c : L)) = (b : L) / (c : L) + rw [map_div₀, hsigmab, hsigmac] + · rintro rfl + exact ramificationNumberOfUniqueExtension_one + (base := base) (target := target) huniq a + +/-- States the theorem `ramificationNumberOfUniqueExtension_conj`. -/ +theorem ramificationNumberOfUniqueExtension_conj + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + {a : target.valuationSubring} + (ha : Algebra.adjoin base.valuationSubring + ({a} : Set target.valuationSubring) = ⊤) + (sigma tau : Gal(L/K)) : + ramificationNumberOfUniqueExtension + (base := base) (target := target) huniq a (tau * sigma * tau⁻¹) = + ramificationNumberOfUniqueExtension + (base := base) (target := target) huniq a sigma := by + let b := valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq tau⁻¹ a + have hb : Algebra.adjoin base.valuationSubring + ({b} : Set target.valuationSubring) = ⊤ := by + change Algebra.adjoin base.valuationSubring + ({valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq tau⁻¹ a} : + Set target.valuationSubring) = ⊤ + let e := (valuationSubringAlgEquivOfUniqueExtension + (base := base) (target := target) huniq tau⁻¹).toAlgHom + have hmap : + (Algebra.adjoin base.valuationSubring + ({a} : Set target.valuationSubring)).map e = + Algebra.adjoin base.valuationSubring + ({valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq tau⁻¹ a} : + Set target.valuationSubring) := by + simp [e, valuationSubringAlgEquivOfUniqueExtension] + rw [← hmap, ha, Algebra.map_top] + change e.range = ⊤ + apply (AlgHom.range_eq_top e).2 + exact (valuationSubringAlgEquivOfUniqueExtension + (base := base) (target := target) huniq tau⁻¹).surjective + calc + ramificationNumberOfUniqueExtension + (base := base) (target := target) huniq a (tau * sigma * tau⁻¹) = + IsDiscreteValuationRing.addVal target.valuationSubring + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq tau + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma b - b)) := by + simp [ramificationNumberOfUniqueExtension, b, + valuationSubringAutOfUniqueExtension_mul_apply, map_sub] + _ = ramificationNumberOfUniqueExtension + (base := base) (target := target) huniq b sigma := by + rw [addVal_valuationSubringAutOfUniqueExtension] + rfl + _ = ramificationNumberOfUniqueExtension + (base := base) (target := target) huniq a sigma := + ramificationNumberOfUniqueExtension_eq_of_adjoin_eq_top + (base := base) (target := target) huniq hb ha sigma + +variable [FiniteDimensional K L] [IsGalois K L] +variable [Algebra.IsSeparable base.residueField target.residueField] + +/-- The canonical ramification number is a nonarchimedean depth under +the general DVF standing hypotheses. -/ +def ramificationNumberDepthOfUniqueExtension + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) : + RamificationTheory.DiscreteValuationField.HerbrandGroupTheory.NonarchimedeanDepth Gal(L/K) where + depth := intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq + depth_eq_top_iff := by + intro sigma + exact ramificationNumberOfUniqueExtension_eq_top_iff + (base := base) (target := target) huniq + (chosenRamificationGeneratorOfUniqueExtension_adjoin_eq_top + (base := base) (target := target) huniq) sigma + depth_mul_ge_min := ramificationNumberOfUniqueExtension_mul_ge_min + (base := base) (target := target) huniq + (chosenRamificationGeneratorOfUniqueExtension + (base := base) (target := target) huniq) + depth_mul_eq_min_of_ne := ramificationNumberOfUniqueExtension_mul_eq_min_of_ne + (base := base) (target := target) huniq + (chosenRamificationGeneratorOfUniqueExtension + (base := base) (target := target) huniq) + depth_conj := fun gamma sigma => ramificationNumberOfUniqueExtension_conj + (base := base) (target := target) huniq + (chosenRamificationGeneratorOfUniqueExtension_adjoin_eq_top + (base := base) (target := target) huniq) sigma gamma + +/-- States the theorem `ramificationNumberDepthOfUniqueExtension_depth`. -/ +@[simp] theorem ramificationNumberDepthOfUniqueExtension_depth + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (sigma : Gal(L/K)) : + (ramificationNumberDepthOfUniqueExtension + (base := base) (target := target) huniq).depth sigma = + intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq sigma := + rfl + +end Higher +end RamificationTheory.HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationGroup.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationGroup.lean new file mode 100644 index 0000000000..5d54d19d75 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationGroup.lean @@ -0,0 +1,178 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring + +/-! # Ramification Group -/ + +@[expose] public section +namespace RamificationTheory + +/-! +# Hilbert ramification theory: ramification subgroup source lemmas + +This file records the first structural facts about the classical ramification +subgroup `R_w`. The key point for the later character map +`I_w -> Hom(Delta/Gamma, lambda*)` is that `R_w` is a normal subgroup of +`I_w`, not merely a subgroup. +-/ + +noncomputable +section + +universe u v + +namespace HilbertRamification +namespace ValuationSubring + +variable (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + +/-- A decomposition-group automorphism preserves the principal unit group of +the valuation subring it stabilizes. -/ +theorem decompositionGroup_mapEquiv_mem_principalUnitGroup + (A : _root_.ValuationSubring L) (τ : decompositionGroup K A) + {u : Lˣ} (hu : u ∈ A.principalUnitGroup) : + Units.mapEquiv ((τ : L ≃ₐ[K] L).toMulEquiv) u ∈ A.principalUnitGroup := by + let uA : A.unitGroup := ⟨u, A.principal_units_le_units hu⟩ + let eA : A ≃+* A := MulSemiringAction.toRingEquiv (decompositionGroup K A) A τ + let uA' : A.unitGroup := + A.unitGroupMulEquiv.symm + (Units.mapEquiv eA.toMulEquiv (A.unitGroupMulEquiv uA)) + have huKer : + A.unitGroupMulEquiv uA ∈ + (Units.map (IsLocalRing.residue A).toMonoidHom).ker := + (A.coe_mem_principalUnitGroup_iff (x := uA)).mp hu + have huRes : + IsLocalRing.residue A (A.unitGroupMulEquiv uA : A) = 1 := by + have h := + congrArg + (fun z : (IsLocalRing.ResidueField A)ˣ => + (z : IsLocalRing.ResidueField A)) + (MonoidHom.mem_ker.mp huKer) + simpa using h + have hresMapped : + Units.map (IsLocalRing.residue A).toMonoidHom + (Units.mapEquiv eA.toMulEquiv (A.unitGroupMulEquiv uA)) = 1 := by + ext + change + IsLocalRing.residue A + (MulSemiringAction.toRingEquiv (decompositionGroup K A) A τ + (A.unitGroupMulEquiv uA : A)) = 1 + calc + IsLocalRing.residue A + (MulSemiringAction.toRingEquiv (decompositionGroup K A) A τ + (A.unitGroupMulEquiv uA : A)) = + τ • IsLocalRing.residue A (A.unitGroupMulEquiv uA : A) := by + rw [← IsLocalRing.ResidueField.residue_smul] + rfl + _ = τ • (1 : IsLocalRing.ResidueField A) := by + rw [huRes] + _ = 1 := by + simp + have huA' : + (uA' : Lˣ) ∈ A.principalUnitGroup := by + rw [A.coe_mem_principalUnitGroup_iff (x := uA')] + rw [MonoidHom.mem_ker] + simpa [uA'] using hresMapped + have huA'_coe : + (uA' : Lˣ) = + Units.mapEquiv ((τ : L ≃ₐ[K] L).toMulEquiv) u := by + ext + rfl + rw [← huA'_coe] + exact huA' + +/-- The normality calculation for the ramification subgroup: +the ramification group is normal in inertia. -/ +instance ramificationGroup_normal (A : _root_.ValuationSubring L) : + (ramificationGroup K A).Normal := by + refine ⟨?_⟩ + intro σ hσ τ + rw [mem_ramificationGroup_iff] at hσ ⊢ + intro x + have hquot : + automorphismUnitQuotient K A + (((τ * σ * τ⁻¹ : inertiaGroup K A) : decompositionGroup K A)) x = + Units.mapEquiv (((τ : decompositionGroup K A) : L ≃ₐ[K] L).toMulEquiv) + (automorphismUnitQuotient K A (σ : decompositionGroup K A) + (Units.mapEquiv + ((((τ⁻¹ : inertiaGroup K A) : decompositionGroup K A) : + L ≃ₐ[K] L).toMulEquiv) x)) := by + ext + simp [automorphismUnitQuotient, div_eq_mul_inv, mul_assoc] + rw [hquot] + exact decompositionGroup_mapEquiv_mem_principalUnitGroup (K := K) A + (τ : decompositionGroup K A) + (hσ (Units.mapEquiv + ((((τ⁻¹ : inertiaGroup K A) : decompositionGroup K A) : + L ≃ₐ[K] L).toMulEquiv) x)) + +/-- The inertia group is canonically equivalent to its image in the ambient +`K`-automorphism group. -/ +def inertiaGroupEquivInAut + (A : _root_.ValuationSubring L) : + inertiaGroup K A ≃* inertiaGroupInAut K A := + (inertiaGroup K A).equivMapOfInjective + (decompositionGroup K A).subtype + Subtype.coe_injective + +/-- The ramification subgroup, viewed as a subgroup of ambient inertia. -/ +abbrev ramificationGroupInInertiaAut + (A : _root_.ValuationSubring L) : + Subgroup (inertiaGroupInAut K A) := + Subgroup.map (inertiaGroupEquivInAut (K := K) A).toMonoidHom + (ramificationGroup K A) + +/-- States the theorem `mem_ramificationGroupInInertiaAut_iff`. -/ +theorem mem_ramificationGroupInInertiaAut_iff + (A : _root_.ValuationSubring L) (σ : inertiaGroupInAut K A) : + σ ∈ ramificationGroupInInertiaAut K A ↔ + ∃ τ : ramificationGroup K A, + inertiaGroupEquivInAut (K := K) A τ = σ := by + constructor + · rintro ⟨τ, hτ, rfl⟩ + exact ⟨⟨τ, hτ⟩, rfl⟩ + · rintro ⟨τ, rfl⟩ + exact ⟨(τ : inertiaGroup K A), τ.property, rfl⟩ + +/-- The ambient copy of `R_w` is normal inside the ambient copy of `I_w`. -/ +instance ramificationGroupInInertiaAut_normal + (A : _root_.ValuationSubring L) : + (ramificationGroupInInertiaAut K A).Normal := by + let e := inertiaGroupEquivInAut (K := K) A + simpa [ramificationGroupInInertiaAut, e] using + (Subgroup.Normal.map (ramificationGroup_normal (K := K) A) + e.toMonoidHom e.surjective) + +/-- The tame-inertia quotient identification source: +transport the quotient `I_w/R_w` to the corresponding quotient of the ambient +automorphism subgroups. -/ +def inertiaGroupQuotientRamificationEquivInertiaAutQuotient + (A : _root_.ValuationSubring L) : + inertiaGroup K A ⧸ ramificationGroup K A ≃* + inertiaGroupInAut K A ⧸ ramificationGroupInInertiaAut K A := + QuotientGroup.congr + (ramificationGroup K A) + (ramificationGroupInInertiaAut K A) + (inertiaGroupEquivInAut (K := K) A) + rfl + +/-- States the theorem `inertiaGroupQuotientRamificationEquivInertiaAutQuotient_mk`. -/ +theorem inertiaGroupQuotientRamificationEquivInertiaAutQuotient_mk + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) : + inertiaGroupQuotientRamificationEquivInertiaAutQuotient + (K := K) A (QuotientGroup.mk' (ramificationGroup K A) σ) = + QuotientGroup.mk' (ramificationGroupInInertiaAut K A) + (inertiaGroupEquivInAut (K := K) A σ) := + rfl + +end ValuationSubring +end HilbertRamification + +end +end RamificationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumber.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumber.lean new file mode 100644 index 0000000000..864b647f50 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumber.lean @@ -0,0 +1,299 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Monogeneity +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal +/-! +# Ramification numbers for a general discretely valued field + +This file gives the noncomplete version of the ramification number used in +ramification-number theory. Under the stated unique-extension and +separable-residue hypotheses, the monogenic integral-generator theorem supplies +an integral generator. We choose that generator internally, so downstream +statements do not carry a generator hypothesis. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w x + +namespace RamificationTheory.HilbertRamification +namespace Higher + + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] +variable {base : ValuationTheory.DiscreteValuationField.DVF.{u, v} K} +variable {target : ValuationTheory.DiscreteValuationField.DVF.{w, x} L} +variable [base.valuation.HasExtension target.valuation] + +/-- Elements whose displacement has a fixed maximal-ideal lower bound form a +base valuation-ring subalgebra. -/ +def valuationSubringDisplacementSubalgebraOfUniqueExtension + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (n : ℕ) (sigma : Gal(L/K)) : + Subalgebra base.valuationSubring target.valuationSubring where + carrier := + {a | valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a - a ∈ + target.maximalIdeal ^ n} + zero_mem' := by simp + one_mem' := by simp + add_mem' := by + intro a b ha hb + change + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma (a + b) - (a + b) ∈ + target.maximalIdeal ^ n + change valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a - a ∈ + target.maximalIdeal ^ n at ha + change valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma b - b ∈ + target.maximalIdeal ^ n at hb + have hrewrite : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma (a + b) - (a + b) = + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a - a) + + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma b - b) := by + simp + ring + rw [hrewrite] + exact Ideal.add_mem _ ha hb + mul_mem' := by + intro a b ha hb + change + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma (a * b) - a * b ∈ + target.maximalIdeal ^ n + change valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a - a ∈ + target.maximalIdeal ^ n at ha + change valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma b - b ∈ + target.maximalIdeal ^ n at hb + have hrewrite : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma (a * b) - a * b = + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a * + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma b - b) + + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a - a) * b := by + simp + ring + rw [hrewrite] + exact Ideal.add_mem _ + (Ideal.mul_mem_left _ _ hb) + (Ideal.mul_mem_right _ _ ha) + algebraMap_mem' := by + intro r + change + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma + (algebraMap base.valuationSubring target.valuationSubring r) - + algebraMap base.valuationSubring target.valuationSubring r ∈ + target.maximalIdeal ^ n + have hcomm : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma + (algebraMap base.valuationSubring target.valuationSubring r) = + algebraMap base.valuationSubring target.valuationSubring r := by + apply Subtype.ext + exact sigma.commutes (r : K) + rw [hcomm, sub_self] + exact Ideal.zero_mem _ + +/-- States the theorem `mem_valuationSubringDisplacementSubalgebraOfUniqueExtension_iff`. -/ +@[simp] theorem mem_valuationSubringDisplacementSubalgebraOfUniqueExtension_iff + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (n : ℕ) (sigma : Gal(L/K)) (a : target.valuationSubring) : + a ∈ valuationSubringDisplacementSubalgebraOfUniqueExtension + (base := base) (target := target) huniq n sigma ↔ + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a - a ∈ + target.maximalIdeal ^ n := + Iff.rfl + +/-- A displacement bound on a generator extends to every integral polynomial +expression in that generator. -/ +theorem valuationSubringAutOfUniqueExtension_sub_mem_of_mem_adjoin + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + {a z : target.valuationSubring} {n : ℕ} {sigma : Gal(L/K)} + (ha : valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a - a ∈ + target.maximalIdeal ^ n) + (hz : z ∈ Algebra.adjoin base.valuationSubring + ({a} : Set target.valuationSubring)) : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma z - z ∈ + target.maximalIdeal ^ n := by + have hle : + Algebra.adjoin base.valuationSubring ({a} : Set target.valuationSubring) ≤ + valuationSubringDisplacementSubalgebraOfUniqueExtension + (base := base) (target := target) huniq n sigma := by + rw [Algebra.adjoin_le_iff] + intro y hy + rw [Set.mem_singleton_iff] at hy + subst y + exact ha + exact hle hz + +/-- Ramification number attached to an integral element, before choosing the +integral generator. -/ +def ramificationNumberOfUniqueExtension + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (a : target.valuationSubring) (sigma : Gal(L/K)) : ℕ∞ := + IsDiscreteValuationRing.addVal target.valuationSubring + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a - a) + +/-- States the theorem `ramificationNumberOfUniqueExtension_one`. -/ +@[simp] theorem ramificationNumberOfUniqueExtension_one + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (a : target.valuationSubring) : + ramificationNumberOfUniqueExtension + (base := base) (target := target) huniq a 1 = ⊤ := by + simp [ramificationNumberOfUniqueExtension] + +/-- States the theorem `natCast_le_ramificationNumberOfUniqueExtension_iff`. -/ +theorem natCast_le_ramificationNumberOfUniqueExtension_iff + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (a : target.valuationSubring) (sigma : Gal(L/K)) (n : ℕ) : + (n : ℕ∞) ≤ ramificationNumberOfUniqueExtension + (base := base) (target := target) huniq a sigma ↔ + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a - a ∈ + target.maximalIdeal ^ n := by + exact (IsDiscreteValuationRing.mem_maximalIdeal_pow_iff_addVal_ge + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a - a) n).symm + +/-- The ramification number is independent of the monogenic generator. -/ +theorem ramificationNumberOfUniqueExtension_eq_of_adjoin_eq_top + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + {a b : target.valuationSubring} + (ha : Algebra.adjoin base.valuationSubring + ({a} : Set target.valuationSubring) = ⊤) + (hb : Algebra.adjoin base.valuationSubring + ({b} : Set target.valuationSubring) = ⊤) + (sigma : Gal(L/K)) : + ramificationNumberOfUniqueExtension + (base := base) (target := target) huniq a sigma = + ramificationNumberOfUniqueExtension + (base := base) (target := target) huniq b sigma := by + apply le_antisymm + · rw [← ENat.forall_natCast_le_iff_le] + intro n han + rw [natCast_le_ramificationNumberOfUniqueExtension_iff] at han ⊢ + exact valuationSubringAutOfUniqueExtension_sub_mem_of_mem_adjoin + (base := base) (target := target) huniq han (by rw [ha]; simp) + · rw [← ENat.forall_natCast_le_iff_le] + intro n hbn + rw [natCast_le_ramificationNumberOfUniqueExtension_iff] at hbn ⊢ + exact valuationSubringAutOfUniqueExtension_sub_mem_of_mem_adjoin + (base := base) (target := target) huniq hbn (by rw [hb]; simp) + +variable [FiniteDimensional K L] [IsGalois K L] +variable [Algebra.IsSeparable base.residueField target.residueField] + +/-- The integral generator supplied internally by the monogeneity theorem under +the standing hypotheses. -/ +def chosenRamificationGeneratorOfUniqueExtension + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) : target.valuationSubring := + Classical.choose + (exists_valuationSubring_adjoin_eq_top_of_uniqueExtension + (base := base) (target := target) huniq) + +/-- States the theorem `chosenRamificationGeneratorOfUniqueExtension_adjoin_eq_top`. -/ +theorem chosenRamificationGeneratorOfUniqueExtension_adjoin_eq_top + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) : + Algebra.adjoin base.valuationSubring + ({chosenRamificationGeneratorOfUniqueExtension + (base := base) (target := target) huniq} : + Set target.valuationSubring) = ⊤ := + Classical.choose_spec + (exists_valuationSubring_adjoin_eq_top_of_uniqueExtension + (base := base) (target := target) huniq) + +/-- The canonical ramification number. Its generator is supplied +internally by the monogenic integral-generator theorem. -/ +def intrinsicRamificationNumberOfUniqueExtension + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (sigma : Gal(L/K)) : ℕ∞ := + ramificationNumberOfUniqueExtension + (base := base) (target := target) huniq + (chosenRamificationGeneratorOfUniqueExtension + (base := base) (target := target) huniq) sigma + +/-- States the theorem `intrinsicRamificationNumberOfUniqueExtension_one`. -/ +@[simp] theorem intrinsicRamificationNumberOfUniqueExtension_one + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) : + intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq 1 = ⊤ := by + simp [intrinsicRamificationNumberOfUniqueExtension] + +/-- The canonical ramification number recovers the integral lower groups. -/ +theorem mem_lowerRamificationGroup_nat_iff_intrinsicRamificationNumberOfUniqueExtension_ge + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (n : ℕ) (sigma : Gal(L/K)) : + sigma ∈ lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ) ↔ + ((n + 1 : ℕ) : ℕ∞) ≤ + intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq sigma := by + change sigma ∈ lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ) ↔ + ((n + 1 : ℕ) : ℕ∞) ≤ ramificationNumberOfUniqueExtension + (base := base) (target := target) huniq + (chosenRamificationGeneratorOfUniqueExtension + (base := base) (target := target) huniq) sigma + rw [mem_lowerRamificationGroup_nat_iff, + natCast_le_ramificationNumberOfUniqueExtension_iff] + constructor + · intro hsigma + exact hsigma _ + · intro hgen z + exact valuationSubringAutOfUniqueExtension_sub_mem_of_mem_adjoin + (base := base) (target := target) huniq hgen (by + rw [chosenRamificationGeneratorOfUniqueExtension_adjoin_eq_top + (base := base) (target := target) huniq] + simp) + +end Higher +end RamificationTheory.HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberFormula.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberFormula.lean new file mode 100644 index 0000000000..ef8772dc35 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberFormula.lean @@ -0,0 +1,374 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumber +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandFunction +/-! +# Herbrand-function sum formula for a general discretely valued field + +This is the field-facing, noncomplete form of +the Herbrand-function sum formula. The monogenic integral-generator theorem +supplies the generator hidden inside +`intrinsicRamificationNumberOfUniqueExtension`; the public endpoint therefore +uses exactly the canonical standing hypotheses and has no generator parameter. +-/ + +@[expose] public section + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + card_lower_succ_eq_sum_indicator → + card_lower_succ_eq_sum_indicator + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction_eq_depth_sum_of_mem_Icc → + herbrandFunction_eq_depth_sum_of_mem_Icc + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction_of_nonpos → + herbrandFunction_of_nonpos + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + truncatedLowerDepth → + truncatedLowerDepth + + +noncomputable +section + +universe u v w x + +namespace RamificationTheory.HilbertRamification +namespace Higher + + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] +variable {base : ValuationTheory.DiscreteValuationField.DVF.{u, v} K} +variable {target : ValuationTheory.DiscreteValuationField.DVF.{w, x} L} +variable [FiniteDimensional K L] [base.valuation.HasExtension target.valuation] +variable [IsGalois K L] +variable [Algebra.IsSeparable base.residueField target.residueField] + +/-- The finite Galois group is equipped with an enumeration for ramification-group sums. -/ +local instance galoisFintype : Fintype Gal(L/K) := + Fintype.ofFinite Gal(L/K) + +/-- Each subgroup of the finite Galois group is equipped with a finite enumeration. -/ +local instance subgroupFintype (H : Subgroup Gal(L/K)) : Fintype H := + Fintype.ofFinite H + +/-- Classical decidability of membership in a subgroup of the Galois group. -/ +local instance subgroupMembershipDecidable + (H : Subgroup Gal(L/K)) (sigma : Gal(L/K)) : Decidable (sigma ∈ H) := + Classical.propDecidable _ + +/-- `min {i,r}`, with the extended value `infinity` truncated to `r`. -/ +def truncateENatAtDVF (i : ℕ∞) (r : ℝ) : ℝ := + ENat.recTopCoe r (fun n => min (n : ℝ) r) i + +/-- States the theorem `truncateENatAtDVF_top`. -/ +@[simp] theorem truncateENatAtDVF_top (r : ℝ) : + truncateENatAtDVF ⊤ r = r := by + simp [truncateENatAtDVF] + +/-- States the theorem `truncateENatAtDVF_coe`. -/ +@[simp] theorem truncateENatAtDVF_coe (n : ℕ) (r : ℝ) : + truncateENatAtDVF (n : ℕ∞) r = min (n : ℝ) r := by + simp [truncateENatAtDVF] + +/-- States the theorem `truncateENatAtDVF_eq_right_of_natCast_le`. -/ +theorem truncateENatAtDVF_eq_right_of_natCast_le + {i : ℕ∞} {m : ℕ} {r : ℝ} (hr : r ≤ m) (hi : (m : ℕ∞) ≤ i) : + truncateENatAtDVF i r = r := by + induction i using ENat.recTopCoe with + | top => simp + | coe n => + simp only [truncateENatAtDVF_coe] + rw [min_eq_right] + have hmn : m ≤ n := by exact_mod_cast hi + exact hr.trans (by exact_mod_cast hmn) + +/-- Pointwise ramification-number contribution for an element of inertia. -/ +theorem truncate_intrinsicRamificationNumberOfUniqueExtension_eq_intrinsic_summand + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (m : ℕ) {s : ℝ} (hms : (m : ℝ) ≤ s) (hsm : s ≤ m + 1) + (sigma : (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq).lower 0) : + truncateENatAtDVF + (intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq (sigma : Gal(L/K))) + (s + 1) = + 1 + ((truncatedLowerDepth (lowerRamificationFiltrationOfUniqueExtension (base := base) + (target := target) huniq)) m sigma : ℝ) + + (s - m) * + (if (sigma : Gal(L/K)) ∈ (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq).lower (m + 1) + then 1 else 0) := by + classical + let F := lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq + let i := intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq (sigma : Gal(L/K)) + change truncateENatAtDVF i (s + 1) = + 1 + ((truncatedLowerDepth F) m sigma : ℝ) + + (s - m) * (if (sigma : Gal(L/K)) ∈ F.lower (m + 1) then 1 else 0) + have hi_one : (1 : ℕ∞) ≤ i := by + exact (mem_lowerRamificationGroup_nat_iff_intrinsicRamificationNumberOfUniqueExtension_ge + (base := base) (target := target) huniq 0 (sigma : Gal(L/K))).1 sigma.property + by_cases hhigh : ((m + 2 : ℕ) : ℕ∞) ≤ i + · have hmem : (sigma : Gal(L/K)) ∈ F.lower (m + 1) := by + exact (mem_lowerRamificationGroup_nat_iff_intrinsicRamificationNumberOfUniqueExtension_ge + (base := base) (target := target) huniq (m + 1) + (sigma : Gal(L/K))).2 (by simpa [i, Nat.add_assoc] using hhigh) + have hdepth : + (truncatedLowerDepth F) m sigma = m := by + rw [truncatedLowerDepth] + rw [Finset.filter_eq_self.2] + · simp + · intro j hj + exact (mem_lowerRamificationGroup_nat_iff_intrinsicRamificationNumberOfUniqueExtension_ge + (base := base) (target := target) huniq (j + 1) + (sigma : Gal(L/K))).2 (by + have hjm : j < m := Finset.mem_range.1 hj + have : ((j + 2 : ℕ) : ℕ∞) ≤ (m + 2 : ℕ) := by + exact_mod_cast (by omega : j + 2 ≤ m + 2) + exact (by simpa [i, Nat.add_assoc] using this.trans hhigh)) + have htrunc : truncateENatAtDVF i (s + 1) = s + 1 := by + exact truncateENatAtDVF_eq_right_of_natCast_le + (m := m + 2) (by + norm_num [Nat.cast_add, Nat.cast_ofNat] at hsm ⊢ + linarith) hhigh + rw [htrunc, hdepth] + simp [hmem] + ring + · have hlt : i < ((m + 2 : ℕ) : ℕ∞) := lt_of_not_ge hhigh + have hine : i ≠ ⊤ := ne_top_of_lt hlt + obtain ⟨k, hk⟩ := ENat.ne_top_iff_exists.1 hine + have hk_one : 1 ≤ k := by + exact_mod_cast (hi_one.trans_eq hk.symm) + have hk_upper : k ≤ m + 1 := by + have : k < m + 2 := by exact_mod_cast (hk.symm ▸ hlt) + omega + have hmem : (sigma : Gal(L/K)) ∉ F.lower (m + 1) := by + intro hmem + have hge := + (mem_lowerRamificationGroup_nat_iff_intrinsicRamificationNumberOfUniqueExtension_ge + (base := base) (target := target) huniq (m + 1) + (sigma : Gal(L/K))).1 hmem + exact hhigh (by simpa [i, Nat.add_assoc] using hge) + have hdepth : + (truncatedLowerDepth F) m sigma = k - 1 := by + rw [truncatedLowerDepth] + have hfilter : + (Finset.range m).filter + (fun j => (sigma : Gal(L/K)) ∈ F.lower (j + 1)) = + Finset.range (k - 1) := by + ext j + simp only [Finset.mem_filter, Finset.mem_range] + have hthreshold : + ((sigma : Gal(L/K)) ∈ F.lower (j + 1)) ↔ j + 2 ≤ k := by + change + ((sigma : Gal(L/K)) ∈ lowerRamificationGroup + (base := base) (target := target) huniq ((j + 1 : ℕ) : ℝ)) ↔ + j + 2 ≤ k + rw [mem_lowerRamificationGroup_nat_iff_intrinsicRamificationNumberOfUniqueExtension_ge + (base := base) (target := target) huniq] + change (((j + 1 + 1 : ℕ) : ℕ∞) ≤ i) ↔ j + 2 ≤ k + rw [← hk] + norm_cast + rw [hthreshold] + omega + rw [hfilter, Finset.card_range] + have htrunc : truncateENatAtDVF i (s + 1) = k := by + rw [← hk, truncateENatAtDVF_coe, min_eq_left] + have : (k : ℝ) ≤ m + 1 := by exact_mod_cast hk_upper + linarith + rw [htrunc, hdepth] + simp only [lowerRamificationFiltrationOfUniqueExtension_lower, hmem, ↓reduceIte, mul_zero, + add_zero] + exact_mod_cast (by omega : k = 1 + (k - 1)) + +/-- States the theorem +`truncate_intrinsicRamificationNumberOfUniqueExtension_eq_zero_of_not_mem_inertia`. -/ +theorem truncate_intrinsicRamificationNumberOfUniqueExtension_eq_zero_of_not_mem_inertia + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + {s : ℝ} (hs : -1 ≤ s) {sigma : Gal(L/K)} + (hsigma : sigma ∉ (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq).lower 0) : + truncateENatAtDVF + (intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq sigma) (s + 1) = 0 := by + have hi : intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq sigma < 1 := by + rw [← not_le] + intro hi + exact hsigma + ((mem_lowerRamificationGroup_nat_iff_intrinsicRamificationNumberOfUniqueExtension_ge + (base := base) (target := target) huniq 0 sigma).2 hi) + have hi0 : intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq sigma = 0 := + Order.lt_one_iff.1 hi + rw [hi0] + simp [truncateENatAtDVF, + min_eq_left (show (0 : ℝ) ≤ s + 1 by linarith)] + +/-- States the theorem +`sum_truncate_intrinsicRamificationNumberOfUniqueExtension_eq_sum_inertia`. -/ +theorem sum_truncate_intrinsicRamificationNumberOfUniqueExtension_eq_sum_inertia + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + {s : ℝ} (hs : -1 ≤ s) : + (∑ sigma : Gal(L/K), truncateENatAtDVF + (intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq sigma) (s + 1)) = + ∑ sigma : (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq).lower 0, + truncateENatAtDVF + (intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq (sigma : Gal(L/K))) (s + 1) := by + classical + let H := (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq).lower 0 + let q : Gal(L/K) → ℝ := fun sigma => truncateENatAtDVF + (intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq sigma) (s + 1) + calc + ∑ sigma : Gal(L/K), q sigma = + ∑ sigma : Gal(L/K), if sigma ∈ H then q sigma else 0 := by + apply Finset.sum_congr rfl + intro sigma _ + by_cases hsigma : sigma ∈ H + · simp [hsigma] + · rw [ite_eq_right hsigma] + exact truncate_intrinsicRamificationNumberOfUniqueExtension_eq_zero_of_not_mem_inertia + (base := base) (target := target) huniq hs hsigma + _ = ∑ sigma : H, q (sigma : Gal(L/K)) := by + rw [← Finset.sum_filter (p := fun sigma : Gal(L/K) => sigma ∈ H)] + simpa only [Finset.subtype_univ] using + (Finset.sum_subtype_eq_sum_filter + (s := (Finset.univ : Finset Gal(L/K))) q + (p := fun sigma : Gal(L/K) => sigma ∈ H)).symm + +/-- States the theorem +`sum_inertia_truncate_intrinsicRamificationNumberOfUniqueExtension_eq_intrinsic`. -/ +theorem sum_inertia_truncate_intrinsicRamificationNumberOfUniqueExtension_eq_intrinsic + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (m : ℕ) {s : ℝ} (hms : (m : ℝ) ≤ s) (hsm : s ≤ m + 1) : + (∑ sigma : (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq).lower 0, + truncateENatAtDVF + (intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq (sigma : Gal(L/K))) (s + 1)) = + Nat.card ((lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq).lower 0) + + (∑ sigma : (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq).lower 0, + ((truncatedLowerDepth (lowerRamificationFiltrationOfUniqueExtension (base := base) + (target := target) huniq)) m sigma : ℝ)) + + (s - m) * Nat.card ((lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq).lower (m + 1)) := by + classical + let F := lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq + change (∑ sigma : F.lower 0, truncateENatAtDVF + (intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq (sigma : Gal(L/K))) (s + 1)) = + (Nat.card (F.lower 0) : ℝ) + + (∑ sigma : F.lower 0, + ((truncatedLowerDepth F) m sigma : ℝ)) + + (s - m) * Nat.card (F.lower (m + 1)) + simp_rw [truncate_intrinsicRamificationNumberOfUniqueExtension_eq_intrinsic_summand + (base := base) (target := target) huniq m hms hsm] + have hindicator : + (∑ sigma : F.lower 0, + (if (sigma : Gal(L/K)) ∈ F.lower (m + 1) then (1 : ℝ) else 0)) = + Nat.card (F.lower (m + 1)) := by + exact_mod_cast + ((card_lower_succ_eq_sum_indicator F) m).symm + change Finset.sum Finset.univ (fun sigma : F.lower 0 => + (1 : ℝ) + + ((truncatedLowerDepth F) m sigma : ℝ) + + (s - m) * + (if (sigma : Gal(L/K)) ∈ F.lower (m + 1) then 1 else 0)) = _ + rw [Finset.sum_add_distrib, Finset.sum_add_distrib] + rw [← Finset.mul_sum] + rw [hindicator] + simp + +/-- The Herbrand-function sum formula under the stated discretely valued field +assumptions. The generator from the monogenic integral-generator theorem is internal to the + canonical +ramification number, so this endpoint has no generator hypothesis. -/ +theorem herbrandFunctionOfUniqueExtension_eq_intrinsicRamificationNumber_sum + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + {s : ℝ} (hs : -1 ≤ s) : + herbrandFunctionOfUniqueExtension + (base := base) (target := target) huniq s = + (1 / Nat.card ((lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq).lower 0) : ℝ) * + (∑ sigma : Gal(L/K), truncateENatAtDVF + (intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq sigma) (s + 1)) - 1 := by + classical + let F := lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq + change + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + F) s = + (1 / Nat.card (F.lower 0) : ℝ) * + (∑ sigma : Gal(L/K), truncateENatAtDVF + (intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq sigma) (s + 1)) - 1 + have hcard : (Nat.card (F.lower 0) : ℝ) ≠ 0 := by + exact_mod_cast + (ne_of_gt (show 0 < Nat.card (F.lower 0) from Finite.card_pos)) + rw [sum_truncate_intrinsicRamificationNumberOfUniqueExtension_eq_sum_inertia + (base := base) (target := target) huniq hs] + by_cases hs0 : 0 ≤ s + · let m := ⌊s⌋₊ + have hms : (m : ℝ) ≤ s := Nat.floor_le hs0 + have hsm : s ≤ m + 1 := (Nat.lt_floor_add_one s).le + rw [sum_inertia_truncate_intrinsicRamificationNumberOfUniqueExtension_eq_intrinsic + (base := base) (target := target) huniq m hms hsm] + rw [(herbrandFunction_eq_depth_sum_of_mem_Icc F) m hms hsm] + field_simp + ring + · have hsle : s ≤ 0 := le_of_not_ge hs0 + rw [(herbrandFunction_of_nonpos F) hsle] + have hpoint : ∀ sigma : F.lower 0, + truncateENatAtDVF + (intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq (sigma : Gal(L/K))) + (s + 1) = s + 1 := by + intro sigma + have hi : (1 : ℕ∞) ≤ intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq (sigma : Gal(L/K)) := + (mem_lowerRamificationGroup_nat_iff_intrinsicRamificationNumberOfUniqueExtension_ge + (base := base) (target := target) huniq 0 + (sigma : Gal(L/K))).1 sigma.property + exact truncateENatAtDVF_eq_right_of_natCast_le + (m := 1) (by + norm_num at hsle ⊢ + linarith) hi + simp_rw [hpoint] + simp only [Finset.sum_const, nsmul_eq_mul] + rw [Finset.card_univ, ← Nat.card_eq_fintype_card] + field_simp + ring + +end Higher +end RamificationTheory.HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberRestriction.lean new file mode 100644 index 0000000000..a63c9af4be --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberRestriction.lean @@ -0,0 +1,208 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.OrbitPolynomialIdeal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamificationIndex +/-! +# quotient-depth identity over a general DVF + +The public endpoint has no generator argument. The monogenic integral-generator theorem + supplies the top +integral generator internally, while the fixed-field ramification number is +the intrinsic value of its displacement ideal. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w x + +namespace RamificationTheory.HilbertRamification +namespace Higher + + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] +variable {base : ValuationTheory.DiscreteValuationField.DVF.{u, v} K} +variable {target : ValuationTheory.DiscreteValuationField.DVF.{w, x} L} +variable [base.valuation.HasExtension target.valuation] +variable [FiniteDimensional K L] [IsGalois K L] + +/-- Sum of ramification numbers over the right coset `sigma H`, for a +specified top generator. -/ +def cosetRamificationNumberSum + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) (sigma : Gal(L/K)) + (z : target.valuationSubring) : ℕ∞ := by + classical + letI : Fintype H := Fintype.ofFinite H + exact ∑ tau : H, ramificationNumberOfUniqueExtension + (base := base) (target := target) huniq z (sigma * tau) + +omit [IsGalois K L] in +/-- The valuation of the coset displacement product is the corresponding +sum of ramification numbers. -/ +theorem addVal_cosetGeneratorDisplacementProduct + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) (sigma : Gal(L/K)) + (z : target.valuationSubring) : + IsDiscreteValuationRing.addVal target.valuationSubring + (cosetGeneratorDisplacementProductDVF + (base := base) (target := target) huniq H sigma z) = + cosetRamificationNumberSum + (base := base) (target := target) huniq H sigma z := by + classical + let : Fintype H := Fintype.ofFinite H + unfold cosetGeneratorDisplacementProductDVF + simp only [cosetRamificationNumberSum, + ramificationNumberOfUniqueExtension] + have hprod : ∀ s : Finset H, + IsDiscreteValuationRing.addVal target.valuationSubring + (∏ tau ∈ s, + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq (sigma * tau) z - z)) = + ∑ tau ∈ s, + IsDiscreteValuationRing.addVal target.valuationSubring + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq (sigma * tau) z - z) := by + intro s + induction s using Finset.induction_on with + | empty => simp + | @insert tau s htau ih => + rw [Finset.prod_insert htau, Finset.sum_insert htau, + IsDiscreteValuationRing.addVal_mul, ih] + simpa using hprod Finset.univ + +variable [Algebra.IsSeparable base.residueField target.residueField] + +/-- The canonical coset sum, with its monogenic integral generator hidden. -/ +def intrinsicCosetRamificationNumberSum + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) (sigma : Gal(L/K)) : ℕ∞ := by + classical + letI : Fintype H := Fintype.ofFinite H + exact ∑ tau : H, intrinsicRamificationNumberOfUniqueExtension + (base := base) (target := target) huniq (sigma * tau) + +/-- States the theorem `cosetRamificationNumberSum_eq_intrinsic`. -/ +theorem cosetRamificationNumberSum_eq_intrinsic + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) (sigma : Gal(L/K)) + {z : target.valuationSubring} + (hz : Algebra.adjoin base.valuationSubring + ({z} : Set target.valuationSubring) = ⊤) : + cosetRamificationNumberSum + (base := base) (target := target) huniq H sigma z = + intrinsicCosetRamificationNumberSum + (base := base) (target := target) huniq H sigma := by + classical + let : Fintype H := Fintype.ofFinite H + simp only [cosetRamificationNumberSum, + intrinsicCosetRamificationNumberSum, + intrinsicRamificationNumberOfUniqueExtension] + apply Finset.sum_congr rfl + intro tau _ + exact ramificationNumberOfUniqueExtension_eq_of_adjoin_eq_top + (base := base) (target := target) huniq hz + (chosenRamificationGeneratorOfUniqueExtension_adjoin_eq_top + (base := base) (target := target) huniq) (sigma * tau) + +/-- The quotient-depth identity (division-free normalized form). + +For `M = L ^ H` and `sigma' = sigma|_M`, + +`e(L/M) * i_(M/K)(sigma') = sum_(tau in H) i_(L/K)(sigma tau)`. + +The statement also covers the identity, where both sides are infinite. -/ +theorem ramificationIndex_nsmul_fixedFieldRamificationNumber_eq_cosetSum + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (H : Subgroup Gal(L/K)) [H.Normal] + (sigma : Gal(L/K)) : + fixedFieldRamificationIndex + (target := target) H • + fixedFieldRamificationNumber + (base := base) (target := target) huniq H + (IsGalois.normalAutEquivQuotient H sigma) = + intrinsicCosetRamificationNumberSum + (base := base) (target := target) huniq H sigma := by + let B := fixedFieldValuationSubringDVF (K := K) (target := target) H + let j := fixedFieldValuationSubringDVFToTarget + (K := K) (target := target) H + let q := IsGalois.normalAutEquivQuotient H sigma + let J := fixedFieldDisplacementIdealDVF + (base := base) (target := target) huniq H q + let z := chosenRamificationGeneratorOfUniqueExtension + (base := base) (target := target) huniq + let : IsDiscreteValuationRing B := + fixedFieldValuationSubringDVF_isDiscreteValuationRing + (base := base) (target := target) huniq H + let g : B := Submodule.IsPrincipal.generator J + have hz : Algebra.adjoin base.valuationSubring + ({z} : Set target.valuationSubring) = ⊤ := + chosenRamificationGeneratorOfUniqueExtension_adjoin_eq_top + (base := base) (target := target) huniq + have hspanJ : Ideal.span ({g} : Set B) = J := + Submodule.IsPrincipal.span_singleton_generator J + have hmapJ : Ideal.map j J = + Ideal.span ({j g} : Set target.valuationSubring) := by + rw [← hspanJ, Ideal.map_span, Set.image_singleton] + have hideal : + Ideal.span ({cosetGeneratorDisplacementProductDVF + (base := base) (target := target) huniq H sigma z} : + Set target.valuationSubring) = + Ideal.span ({j g} : Set target.valuationSubring) := by + rw [span_cosetGeneratorDisplacementProduct_eq_map_fixedFieldDisplacementIdeal + (base := base) (target := target) huniq H sigma hz] + exact hmapJ + have hadd : + IsDiscreteValuationRing.addVal target.valuationSubring + (cosetGeneratorDisplacementProductDVF + (base := base) (target := target) huniq H sigma z) = + IsDiscreteValuationRing.addVal target.valuationSubring (j g) := + (IsDiscreteValuationRing.addVal_eq_iff_associated _ _).2 + (Ideal.span_singleton_eq_span_singleton.mp hideal) + have hfixed : + fixedFieldRamificationNumber + (base := base) (target := target) huniq H q = + IsDiscreteValuationRing.addVal B g := by + unfold fixedFieldRamificationNumber + dsimp only + calc + fixedFieldRamificationIndex + (target := target) H • + fixedFieldRamificationNumber + (base := base) (target := target) huniq H q = + IsDiscreteValuationRing.addVal target.valuationSubring (j g) := by + rw [hfixed] + exact (addVal_fixedFieldValuationSubringToTarget_eq_ramificationIndex_nsmul + (base := base) (target := target) huniq H g).symm + _ = IsDiscreteValuationRing.addVal target.valuationSubring + (cosetGeneratorDisplacementProductDVF + (base := base) (target := target) huniq H sigma z) := hadd.symm + _ = cosetRamificationNumberSum + (base := base) (target := target) huniq H sigma z := + addVal_cosetGeneratorDisplacementProduct + (base := base) (target := target) huniq H sigma z + _ = intrinsicCosetRamificationNumberSum + (base := base) (target := target) huniq H sigma := + cosetRamificationNumberSum_eq_intrinsic + (base := base) (target := target) huniq H sigma hz + +end Higher +end RamificationTheory.HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationPrimeToResidueTorsion.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationPrimeToResidueTorsion.lean new file mode 100644 index 0000000000..6935683ef0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationPrimeToResidueTorsion.lean @@ -0,0 +1,119 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring +public import Mathlib.Algebra.BigOperators.Field +/-! +# Prime-to-residue torsion in the actual ramification group + +A ramification automorphism whose order is nonzero in the residue field is +trivial. For a moved element, divide its successive conjugate differences by +the first nonzero difference. Ramification makes every resulting quotient a +principal unit, whereas their sum vanishes by telescoping. Reduction would +then send the number of terms to zero. + +The argument uses the existing ramification subgroup and its principal-unit +condition. It requires no discreteness, Henselianity, or finite extension. +-/ + +@[expose] public section + +namespace RamificationTheory.HilbertRamification.ValuationSubring + +open scoped BigOperators + +universe u v + +variable (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + +/-- An element of the actual ramification group killed by an integer which +is nonzero in the residue field is the identity. -/ +theorem ramificationGroup_eq_one_of_pow_eq_one_of_residue_natCast_ne_zero + (A : _root_.ValuationSubring L) (σ : ramificationGroup K A) + (n : ℕ) (hn : (n : IsLocalRing.ResidueField A) ≠ 0) + (hσ : σ ^ n = 1) : σ = 1 := by + classical + let ρ : ramificationGroup K A →* (L ≃ₐ[K] L) := + (inertiaGroupToAut (K := K) A).comp (ramificationGroup K A).subtype + have hρ : Function.Injective ρ := by + intro a b hab + exact Subtype.ext (Subtype.ext (Subtype.ext hab)) + apply hρ + rw [map_one] + apply AlgEquiv.ext + intro x + change ρ σ x = x + by_contra hx + let γ : L ≃ₐ[K] L := ρ σ + have hγn : γ ^ n = 1 := by + rw [← map_pow ρ, hσ, map_one] + let y : L := γ x - x + have hy : y ≠ 0 := sub_ne_zero.mpr hx + let q : ℕ → Lˣ := fun i => + automorphismUnitQuotient K A + (((σ ^ i : ramificationGroup K A) : inertiaGroup K A) : + decompositionGroup K A) (Units.mk0 y hy) + have hq (i : ℕ) : q i ∈ A.principalUnitGroup := + (σ ^ i : ramificationGroup K A).property (Units.mk0 y hy) + let a : ℕ → A := fun i => + A.unitGroupMulEquiv ⟨q i, A.principal_units_le_units (hq i)⟩ + have ha (i : ℕ) : (a i : L) = (γ ^ i) y / y := by + change ((q i : Lˣ) : L) = (γ ^ i) y / y + simp only [q, automorphismUnitQuotient, Units.val_div_eq_div_val, Units.val_mk0] + change ρ (σ ^ i) y / y = (γ ^ i) y / y + rw [map_pow ρ] + have hred (i : ℕ) : IsLocalRing.residue A (a i) = 1 := by + have hker : A.unitGroupMulEquiv + ⟨q i, A.principal_units_le_units (hq i)⟩ ∈ + (Units.map (IsLocalRing.residue A).toMonoidHom).ker := + (A.coe_mem_principalUnitGroup_iff).mp (hq i) + exact congrArg (fun z : (IsLocalRing.ResidueField A)ˣ => + (z : IsLocalRing.ResidueField A)) (MonoidHom.mem_ker.mp hker) + have horbit (i : ℕ) : + (γ ^ i) y = (γ ^ (i + 1)) x - (γ ^ i) x := by + change (γ ^ i).toRingHom.toAddMonoidHom (γ x - x) = + (γ ^ (i + 1)) x - (γ ^ i) x + rw [map_sub (γ ^ i).toRingHom.toAddMonoidHom, pow_succ, AlgEquiv.mul_apply] + rfl + have htel (m : ℕ) : + ∑ i ∈ Finset.range m, (γ ^ i) y = (γ ^ m) x - x := by + calc + ∑ i ∈ Finset.range m, (γ ^ i) y = + ∑ i ∈ Finset.range m, ((γ ^ (i + 1)) x - (γ ^ i) x) := + Finset.sum_congr rfl (fun i _hi => horbit i) + _ = (γ ^ m) x - x := by + rw [Finset.sum_range_sub (fun i : ℕ => (γ ^ i) x) m, pow_zero, AlgEquiv.one_apply] + have horbitSum : ∑ i ∈ Finset.range n, (γ ^ i) y = 0 := by + rw [htel, hγn, AlgEquiv.one_apply, sub_self] + have hsum : ∑ i ∈ Finset.range n, a i = 0 := by + apply Subtype.ext + change A.subtype.toAddMonoidHom (∑ i ∈ Finset.range n, a i) = + A.subtype.toAddMonoidHom 0 + rw [map_sum A.subtype.toAddMonoidHom, map_zero] + calc + ∑ i ∈ Finset.range n, A.subtype (a i) = + ∑ i ∈ Finset.range n, (γ ^ i) y / y := + Finset.sum_congr rfl (fun i _hi => ha i) + _ = (∑ i ∈ Finset.range n, (γ ^ i) y) / y := + (Finset.sum_div (Finset.range n) (fun i => (γ ^ i) y) y).symm + _ = 0 := by rw [horbitSum, zero_div] + have hredSum : IsLocalRing.residue A (∑ i ∈ Finset.range n, a i) = + (n : IsLocalRing.ResidueField A) := by + change (IsLocalRing.residue A).toAddMonoidHom + (∑ i ∈ Finset.range n, a i) = (n : IsLocalRing.ResidueField A) + rw [map_sum (IsLocalRing.residue A).toAddMonoidHom] + calc + ∑ i ∈ Finset.range n, IsLocalRing.residue A (a i) = + ∑ i ∈ Finset.range n, (1 : IsLocalRing.ResidueField A) := + Finset.sum_congr rfl (fun i _hi => hred i) + _ = (n : IsLocalRing.ResidueField A) := by + simp only [Finset.sum_const, Finset.card_range, nsmul_eq_mul, mul_one] + rw [hsum, map_zero] at hredSum + exact hn hredSum.symm + +end RamificationTheory.HilbertRamification.ValuationSubring diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RealLowerGroups.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RealLowerGroups.lean new file mode 100644 index 0000000000..242b1ca3dc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RealLowerGroups.lean @@ -0,0 +1,575 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Basic +public import Mathlib.Algebra.Order.Archimedean.Real.Basic +public import Mathlib.RingTheory.Valuation.Extension +public import Mathlib.FieldTheory.Galois.Basic +/-! +# Real lower ramification groups + +This file gives the intrinsic definitions and the elementary structural +facts in the real lower-ramification definition and the lower-ramification base-change law. It uses +discretely valued fields, not complete discretely valued fields. The unique +extension hypothesis is stated for `DVF` itself and is used to derive (rather +than assume) preservation of the chosen valuation ring by the Galois group. + +The real index is implemented canonically by the maximal-ideal filtration: +the condition at `s` is membership in `m ^ ceil(s + 1)`. The exponent is +truncated at zero, so the definition extends harmlessly to every real number +and is the full Galois group for `s <= -1`. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Pointwise + +universe u v w x y + +namespace RamificationTheory.DiscreteValuationField + +open ValuationTheory.DiscreteValuationField + +namespace DVF + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] + +/-- Unique extension of a valuation, at the general DVF level. + +This is the direct noncomplete analogue of the existing predicates on +`HenselianDVF` and `CompleteDVF`: every valuation of `L` extending the chosen +base valuation is equivalent to the chosen target valuation. -/ +def HasUniqueValuationExtension (base : DVF.{u, v} K) + (target : DVF.{w, x} L) : Prop := + ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'], + target.valuation.IsEquiv v' + +/-- Pulling the target valuation back along a `K`-automorphism again gives an +extension of the base valuation. -/ +theorem algEquiv_comap_valuation_hasExtension + {base : DVF.{u, v} K} {target : DVF.{w, x} L} + [base.valuation.HasExtension target.valuation] + (σ : L ≃ₐ[K] L) : + base.valuation.HasExtension (target.valuation.comap (σ : L →+* L)) where + val_isEquiv_comap := by + rw [_root_.Valuation.isEquiv_iff_val_le_one] + intro a + simpa [_root_.Valuation.comap, σ.commutes a] using + (_root_.Valuation.HasExtension.val_map_le_one_iff + (vR := base.valuation) (vA := target.valuation) a).symm + +/-- Unique extension makes every `K`-automorphism preserve membership in the +chosen target valuation ring. -/ +theorem mem_valuationSubring_algEquiv_iff_of_hasUniqueValuationExtension + {base : DVF.{u, v} K} {target : DVF.{w, x} L} + [base.valuation.HasExtension target.valuation] + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} base target) + (σ : L ≃ₐ[K] L) (z : L) : + z ∈ target.valuation.valuationSubring ↔ + σ z ∈ target.valuation.valuationSubring := by + let vσ := target.valuation.comap (σ : L →+* L) + let : base.valuation.HasExtension vσ := + algEquiv_comap_valuation_hasExtension + (base := base) (target := target) σ + have hsub : + target.valuation.valuationSubring = vσ.valuationSubring := + (_root_.Valuation.isEquiv_iff_valuationSubring target.valuation vσ).1 + (huniq vσ) + change z ∈ target.valuation.valuationSubring ↔ z ∈ vσ.valuationSubring + rw [hsub] + +end DVF +end RamificationTheory.DiscreteValuationField + +namespace RamificationTheory.HilbertRamification +namespace Higher + +open RamificationTheory.DiscreteValuationField.DVF + +open RamificationTheory.DiscreteValuationField + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] +variable {base : ValuationTheory.DiscreteValuationField.DVF.{u, v} K} +variable {target : ValuationTheory.DiscreteValuationField.DVF.{w, x} L} +variable [base.valuation.HasExtension target.valuation] + +/-- The integral exponent corresponding to a real lower ramification index. + +For `s >= -1` this is `ceil (s + 1)`. The use of `Int.toNat` also makes it +zero for `s <= -1`, which gives the expected constant extension below the +natural indexing range. -/ +def realRamificationExponent (s : ℝ) : ℕ := + (Int.ceil (s + 1)).toNat + +/-- States the theorem `realRamificationExponent_mono`. -/ +theorem realRamificationExponent_mono : + Monotone realRamificationExponent := by + intro s t hst + apply Int.toNat_le_toNat + apply Int.ceil_mono + linarith + +/-- States the theorem `realRamificationExponent_neg_one`. -/ +@[simp] theorem realRamificationExponent_neg_one : + realRamificationExponent (-1) = 0 := by + simp [realRamificationExponent] + +/-- States the theorem `realRamificationExponent_eq_zero_of_le_neg_one`. -/ +theorem realRamificationExponent_eq_zero_of_le_neg_one + {s : ℝ} (hs : s ≤ -1) : + realRamificationExponent s = 0 := by + rw [realRamificationExponent, Int.toNat_eq_zero] + have hs' : s + 1 ≤ 0 := by linarith + exact Int.ceil_le.mpr (by simpa using hs') + +/-- States the theorem `realRamificationExponent_nat`. -/ +@[simp] theorem realRamificationExponent_nat (n : ℕ) : + realRamificationExponent (n : ℝ) = n + 1 := by + simp [realRamificationExponent] + +/-- The maximal-ideal power representing the real lower index `s`. -/ +def realRamificationIdeal (target : ValuationTheory.DiscreteValuationField.DVF.{w, x} L) + (s : ℝ) : Ideal target.valuationSubring := + target.maximalIdeal ^ realRamificationExponent s + +/-- States the theorem `realRamificationIdeal_antitone`. -/ +theorem realRamificationIdeal_antitone {s t : ℝ} (hst : s ≤ t) : + realRamificationIdeal target t ≤ realRamificationIdeal target s := by + exact Ideal.pow_le_pow_right (realRamificationExponent_mono hst) + +/-- States the theorem `realRamificationIdeal_neg_one`. -/ +@[simp] theorem realRamificationIdeal_neg_one : + realRamificationIdeal target (-1) = ⊤ := by + simp [realRamificationIdeal] + +/-- States the theorem `realRamificationIdeal_nat`. -/ +@[simp] theorem realRamificationIdeal_nat (n : ℕ) : + realRamificationIdeal target (n : ℝ) = target.maximalIdeal ^ (n + 1) := by + simp [realRamificationIdeal] + +/-- States the theorem `realRamificationIdeal_eq_top_of_le_neg_one`. -/ +theorem realRamificationIdeal_eq_top_of_le_neg_one + {s : ℝ} (hs : s ≤ -1) : + realRamificationIdeal target s = ⊤ := by + simp [realRamificationIdeal, + realRamificationExponent_eq_zero_of_le_neg_one hs] + +/-- The automorphism induced on the target valuation ring by uniqueness of the +valuation extension. -/ +def valuationSubringAutOfUniqueExtension + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (σ : Gal(L/K)) : + target.valuationSubring ≃+* target.valuationSubring where + toFun a := + ⟨σ (a : L), + (mem_valuationSubring_algEquiv_iff_of_hasUniqueValuationExtension + (base := base) (target := target) huniq σ (a : L)).1 a.property⟩ + invFun a := + ⟨σ⁻¹ (a : L), + (mem_valuationSubring_algEquiv_iff_of_hasUniqueValuationExtension + (base := base) (target := target) huniq σ⁻¹ (a : L)).1 a.property⟩ + left_inv a := by + ext + simp + right_inv a := by + ext + simp + map_mul' a b := by + ext + simp + map_add' a b := by + ext + simp + +/-- States the theorem `valuationSubringAutOfUniqueExtension_apply_coe`. -/ +@[simp] theorem valuationSubringAutOfUniqueExtension_apply_coe + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (σ : Gal(L/K)) (a : target.valuationSubring) : + ((valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a : + target.valuationSubring) : L) = σ (a : L) := + rfl + +/-- States the theorem `valuationSubringAutOfUniqueExtension_one_apply`. -/ +@[simp] theorem valuationSubringAutOfUniqueExtension_one_apply + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (a : target.valuationSubring) : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq 1 a = a := by + ext + simp + +/-- States the theorem `valuationSubringAutOfUniqueExtension_mul_apply`. -/ +@[simp] theorem valuationSubringAutOfUniqueExtension_mul_apply + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (σ τ : Gal(L/K)) (a : target.valuationSubring) : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq (σ * τ) a = + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq τ a) := by + ext + rfl + +/-- States the theorem `valuationSubringAutOfUniqueExtension_apply_inv_apply`. -/ +@[simp] theorem valuationSubringAutOfUniqueExtension_apply_inv_apply + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (σ : Gal(L/K)) (a : target.valuationSubring) : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ⁻¹ a) = a := by + ext + simp + +/-- A uniquely extended valuation-ring automorphism preserves the maximal +ideal. -/ +theorem valuationSubringAutOfUniqueExtension_mem_maximalIdeal_iff + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (σ : Gal(L/K)) (a : target.valuationSubring) : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a ∈ target.maximalIdeal ↔ + a ∈ target.maximalIdeal := by + let e := valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ + change e a ∈ target.maximalIdeal ↔ a ∈ target.maximalIdeal + rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff, + IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] + constructor + · intro hea ha + exact hea (by simpa using ha.map (e : target.valuationSubring →* target.valuationSubring)) + · intro ha hea + exact ha (by simpa using hea.map (e.symm : target.valuationSubring →* target.valuationSubring)) + +/-- A uniquely extended valuation-ring automorphism preserves every power of +the maximal ideal. -/ +theorem valuationSubringAutOfUniqueExtension_mem_maximalIdeal_pow_iff + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (σ : Gal(L/K)) (n : ℕ) (a : target.valuationSubring) : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a ∈ target.maximalIdeal ^ n ↔ + a ∈ target.maximalIdeal ^ n := by + let e := valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ + have hm : + Ideal.map (e : target.valuationSubring →+* target.valuationSubring) + target.maximalIdeal = target.maximalIdeal := by + ext a + rw [Ideal.mem_map_iff_of_surjective + (e : target.valuationSubring →+* target.valuationSubring) e.surjective] + constructor + · rintro ⟨b, hb, rfl⟩ + exact + (valuationSubringAutOfUniqueExtension_mem_maximalIdeal_iff + (base := base) (target := target) huniq σ b).2 hb + · intro ha + refine ⟨e.symm a, ?_, by simp [e]⟩ + exact + (valuationSubringAutOfUniqueExtension_mem_maximalIdeal_iff + (base := base) (target := target) huniq σ (e.symm a)).1 + (by simpa [e] using ha) + have hmap : + Ideal.map (e : target.valuationSubring →+* target.valuationSubring) + (target.maximalIdeal ^ n) = target.maximalIdeal ^ n := by + rw [Ideal.map_pow, hm] + constructor + · intro ha + rw [← hmap] at ha + rcases (Ideal.mem_map_iff_of_surjective + (e : target.valuationSubring →+* target.valuationSubring) e.surjective).1 ha with + ⟨b, hb, hba⟩ + have : b = a := e.injective hba + simpa [this] using hb + · intro ha + rw [← hmap] + exact Ideal.mem_map_of_mem + (e : target.valuationSubring →+* target.valuationSubring) ha + +/-- States the theorem `valuationSubringAutOfUniqueExtension_mem_realRamificationIdeal_iff`. -/ +theorem valuationSubringAutOfUniqueExtension_mem_realRamificationIdeal_iff + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (σ : Gal(L/K)) (s : ℝ) (a : target.valuationSubring) : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a ∈ + realRamificationIdeal target s ↔ + a ∈ realRamificationIdeal target s := by + exact valuationSubringAutOfUniqueExtension_mem_maximalIdeal_pow_iff + (base := base) (target := target) huniq σ + (realRamificationExponent s) a + +/-- The real lower-ramification definition: the real-index lower ramification +group. On the natural range `s >= -1`, membership is exactly the condition that +all integral displacements have normalized additive value at least `s + 1`, +expressed intrinsically as membership in `m ^ ceil(s + 1)`. -/ +def lowerRamificationGroup + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (s : ℝ) : Subgroup Gal(L/K) where + carrier := + {σ | ∀ a : target.valuationSubring, + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a - a ∈ + realRamificationIdeal target s} + one_mem' := by + intro a + simp + mul_mem' := by + intro σ τ hσ hτ a + have hτa : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq τ a - a ∈ + realRamificationIdeal target s := + hτ a + have hmapτa : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq τ a - a) ∈ + realRamificationIdeal target s := + (valuationSubringAutOfUniqueExtension_mem_realRamificationIdeal_iff + (base := base) (target := target) huniq σ s _).2 hτa + have hσa : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a - a ∈ + realRamificationIdeal target s := + hσ a + have hdecomp : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq (σ * τ) a - a = + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq τ a - a) + + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a - a) := by + rw [valuationSubringAutOfUniqueExtension_mul_apply, map_sub] + ring + rw [hdecomp] + exact Ideal.add_mem _ hmapτa hσa + inv_mem' := by + intro σ hσ a + let b := valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ⁻¹ a + have hb : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ b - b ∈ + realRamificationIdeal target s := + hσ b + have hab : a - b ∈ realRamificationIdeal target s := by + simpa [b] using hb + have hba : b - a ∈ realRamificationIdeal target s := by + simpa [sub_eq_add_neg, add_comm] using + (realRamificationIdeal target s).neg_mem hab + simpa [b] using hba + +/-- States the theorem `mem_lowerRamificationGroup_iff`. -/ +@[simp] theorem mem_lowerRamificationGroup_iff + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (s : ℝ) (σ : Gal(L/K)) : + σ ∈ lowerRamificationGroup + (base := base) (target := target) huniq s ↔ + ∀ a : target.valuationSubring, + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a - a ∈ + realRamificationIdeal target s := + Iff.rfl + +/-- At an integral index, the real definition is exactly the usual +`m^(n+1)` displacement condition. -/ +theorem mem_lowerRamificationGroup_nat_iff + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (n : ℕ) (σ : Gal(L/K)) : + σ ∈ lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ) ↔ + ∀ a : target.valuationSubring, + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a - a ∈ + target.maximalIdeal ^ (n + 1) := by + simp only [mem_lowerRamificationGroup_iff, realRamificationIdeal_nat] + +/-- The real lower-ramification definition: the lower groups are decreasing in their real index. -/ +theorem lowerRamificationGroup_antitone + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) : + Antitone (lowerRamificationGroup + (base := base) (target := target) huniq) := by + intro s t hst σ hσ a + exact realRamificationIdeal_antitone (target := target) hst (hσ a) + +/-- The real lower-ramification definition: every real lower ramification group is normal. -/ +theorem lowerRamificationGroup_normal + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (s : ℝ) : + (lowerRamificationGroup + (base := base) (target := target) huniq s).Normal := by + refine Subgroup.Normal.mk ?_ + intro σ hσ τ a + let b := valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq τ⁻¹ a + have hb : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ b - b ∈ + realRamificationIdeal target s := + hσ b + have hmap : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq τ + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ b - b) ∈ + realRamificationIdeal target s := + (valuationSubringAutOfUniqueExtension_mem_realRamificationIdeal_iff + (base := base) (target := target) huniq τ s _).2 hb + have hrewrite : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq (τ * σ * τ⁻¹) a - a = + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq τ + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ b - b) := by + simp [b, map_sub] + rwa [hrewrite] + +/-- Provides the instance `instNormal`. -/ +instance lowerRamificationGroup.instNormal + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (s : ℝ) : + (lowerRamificationGroup + (base := base) (target := target) huniq s).Normal := + lowerRamificationGroup_normal + (base := base) (target := target) huniq s + +/-- The real lower-ramification definition: `G_{-1}` is the full Galois group. -/ +@[simp] theorem lowerRamificationGroup_neg_one + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) : + lowerRamificationGroup + (base := base) (target := target) huniq (-1) = ⊤ := by + ext σ + simp [mem_lowerRamificationGroup_iff] + +/-- The all-real extension is constant at the full Galois group below the +distinguished endpoint `-1`. -/ +theorem lowerRamificationGroup_eq_top_of_le_neg_one + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) + {s : ℝ} (hs : s ≤ -1) : + lowerRamificationGroup + (base := base) (target := target) huniq s = ⊤ := by + ext σ + simp [mem_lowerRamificationGroup_iff, + realRamificationIdeal_eq_top_of_le_neg_one (target := target) hs] + +/-- Restriction of scalars from `Gal(L/M)` to `Gal(L/K)`. -/ +def galRestrictScalarsToIntermediate (M : IntermediateField K L) : + Gal(L/M) →* Gal(L/K) where + toFun σ := AlgEquiv.restrictScalars K σ + map_one' := rfl + map_mul' _ _ := rfl + +/-- States the theorem `galRestrictScalarsToIntermediate_apply`. -/ +@[simp] theorem galRestrictScalarsToIntermediate_apply + (M : IntermediateField K L) (σ : Gal(L/M)) : + galRestrictScalarsToIntermediate M σ = AlgEquiv.restrictScalars K σ := + rfl + +/-- States the theorem `galRestrictScalarsToIntermediate_injective`. -/ +theorem galRestrictScalarsToIntermediate_injective + (M : IntermediateField K L) : + Function.Injective (galRestrictScalarsToIntermediate M) := + AlgEquiv.restrictScalars_injective K + +/-- The range of restriction of scalars is precisely the subgroup fixing the +intermediate field. -/ +theorem galRestrictScalarsToIntermediate_range + (M : IntermediateField K L) : + (galRestrictScalarsToIntermediate M).range = M.fixingSubgroup := by + ext σ + constructor + · rintro ⟨τ, rfl⟩ + rw [IntermediateField.mem_fixingSubgroup_iff] + intro z hz + simpa using τ.commutes ⟨z, hz⟩ + · intro hσ + let τ : Gal(L/M) := IntermediateField.fixingSubgroupEquiv M ⟨σ, hσ⟩ + refine ⟨τ, ?_⟩ + ext z + rfl + +/-- The lower ramification group for `L/M`, using the same normalized top +valuation as for `L/K`. This is the real lower-ramification definition with only the automorphism +group changed. -/ +def lowerRamificationGroupOverIntermediate + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (M : IntermediateField K L) (s : ℝ) : Subgroup Gal(L/M) := + (lowerRamificationGroup + (base := base) (target := target) huniq s).comap + (galRestrictScalarsToIntermediate M) + +/-- States the theorem `mem_lowerRamificationGroupOverIntermediate_iff`. -/ +@[simp] theorem mem_lowerRamificationGroupOverIntermediate_iff + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (M : IntermediateField K L) (s : ℝ) (σ : Gal(L/M)) : + σ ∈ lowerRamificationGroupOverIntermediate + (base := base) (target := target) huniq M s ↔ + ∀ a : target.valuationSubring, + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq + (galRestrictScalarsToIntermediate M σ) a - a ∈ + realRamificationIdeal target s := + Iff.rfl + +/-- The lower-ramification base-change law: changing only the base field +intersects the lower ramification group with `Gal(L/M)`. The left side is +transported into `Gal(L/K)` by restriction of scalars, so the statement is a +literal subgroup equality. -/ +theorem lowerRamificationGroupOverIntermediate_map_eq_inf + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (M : IntermediateField K L) (s : ℝ) : + Subgroup.map (galRestrictScalarsToIntermediate M) + (lowerRamificationGroupOverIntermediate + (base := base) (target := target) huniq M s) = + lowerRamificationGroup + (base := base) (target := target) huniq s ⊓ M.fixingSubgroup := by + ext σ + constructor + · rintro ⟨τ, hτ, rfl⟩ + have hrange : + galRestrictScalarsToIntermediate M τ ∈ + (galRestrictScalarsToIntermediate M).range := + ⟨τ, rfl⟩ + rw [galRestrictScalarsToIntermediate_range] at hrange + exact ⟨hτ, hrange⟩ + · intro hσ + have hrange : σ ∈ (galRestrictScalarsToIntermediate M).range := by + rw [galRestrictScalarsToIntermediate_range] + exact hσ.2 + rcases hrange with ⟨τ, rfl⟩ + exact ⟨τ, hσ.1, rfl⟩ + +end Higher +end RamificationTheory.HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ResidueExactSequence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ResidueExactSequence.lean new file mode 100644 index 0000000000..53f03dc90a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ResidueExactSequence.lean @@ -0,0 +1,465 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.ClosedSubgroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.ProfiniteInvariant + +/-! # Residue Exact Sequence -/ + +@[expose] public section +namespace RamificationTheory + +/-! +# The residue-action exact sequence + +For a (possibly infinite) Galois extension and a chosen extension valuation, +the residue extension over the decomposition field is normal and reduction +gives the exact sequence + +`1 → I_w → G_w → Gal(λ/κ) → 1`. + +The base residue field is presented intrinsically as the quotient of the +fixed subring of the chosen valuation ring by the contraction of its maximal +ideal. This fixed subring is exactly the valuation ring on the decomposition +field. The profinite surjectivity proof is the compact inverse-limit argument +used in this construction, supplied by `Ideal.Quotient.stabilizerHom_surjective_of_profinite`. +-/ + +noncomputable +section + +universe u v + +namespace HilbertRamification +namespace ValuationSubring + +open scoped Pointwise Topology + +variable (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] +variable [IsGalois K L] + +/-- The valuation ring on the decomposition field, represented inside the +chosen valuation ring as the fixed subring of the decomposition group. -/ +abbrev decompositionFixedSubring (A : _root_.ValuationSubring L) : Subring A := + FixedPoints.subring A (decompositionGroup K A) + +/-- The maximal ideal of the decomposition-field valuation ring. -/ +abbrev decompositionFixedMaximalIdeal (A : _root_.ValuationSubring L) : + Ideal (decompositionFixedSubring K A) := + (IsLocalRing.maximalIdeal A).comap (decompositionFixedSubring K A).subtype + +/-- The actual base residue field `κ` in the residue-action exact sequence. -/ +abbrev decompositionResidueField (A : _root_.ValuationSubring L) := + decompositionFixedSubring K A ⧸ decompositionFixedMaximalIdeal K A + +/-- The actual target residue field `λ`. -/ +abbrev selectedResidueField (A : _root_.ValuationSubring L) := + IsLocalRing.ResidueField A + +/-- The literal valuation ring on the classical decomposition field `Z_w`. -/ +abbrev decompositionFieldValuationSubring + (A : _root_.ValuationSubring L) : + _root_.ValuationSubring (decompositionField K A) := + A.comap (decompositionField K A).val + +/-- The fixed-subring presentation used in the residue-action exact sequence is canonically +the literal valuation ring on `Z_w`. -/ +def decompositionFieldValuationSubringEquivFixedSubring + (A : _root_.ValuationSubring L) : + decompositionFieldValuationSubring K A ≃+* + decompositionFixedSubring K A where + toFun z := + ⟨⟨((z : decompositionField K A) : L), z.property⟩, by + intro sigma + apply Subtype.ext + change ((sigma : decompositionGroup K A) : L ≃ₐ[K] L) + ((z : decompositionField K A) : L) = + ((z : decompositionField K A) : L) + exact (IntermediateField.mem_fixedField_iff + (H := decompositionGroup K A) ((z : decompositionField K A) : L)).mp + (z : decompositionField K A).property + (sigma : L ≃ₐ[K] L) sigma.property⟩ + invFun r := by + let z : decompositionField K A := + ⟨((r : A) : L), by + rw [IntermediateField.mem_fixedField_iff] + intro sigma hsigma + have hr := r.property ⟨sigma, hsigma⟩ + exact congrArg Subtype.val hr⟩ + exact ⟨z, r.val.property⟩ + left_inv z := by ext; rfl + right_inv r := by ext; rfl + map_add' _ _ := by ext; rfl + map_mul' _ _ := by ext; rfl + +/-- Provides the instance `instIsLocalRing`. -/ +instance decompositionFixedSubring.instIsLocalRing + (A : _root_.ValuationSubring L) : + IsLocalRing (decompositionFixedSubring K A) := + (decompositionFieldValuationSubringEquivFixedSubring (K := K) A).isLocalRing + +private theorem decompositionGroup_action_locallyConstant + (A : _root_.ValuationSubring L) (a : A) : + IsLocallyConstant (fun g : decompositionGroup K A ↦ g • a) := by + rw [IsLocallyConstant.iff_exists_open] + intro sigma + let E : IntermediateField K L := IntermediateField.adjoin K {(a : L)} + let : FiniteDimensional K E := + IntermediateField.adjoin.finiteDimensional + (Algebra.IsIntegral.isIntegral (a : L)) + let U : Set (decompositionGroup K A) := + ((↑) : decompositionGroup K A → (L ≃ₐ[K] L)) ⁻¹' + (((sigma : L ≃ₐ[K] L)) • (E.fixingSubgroup : Set (L ≃ₐ[K] L))) + refine ⟨U, E.fixingSubgroup_isOpen.smul + (sigma : L ≃ₐ[K] L) |>.preimage continuous_subtype_val, ?_, ?_⟩ + · exact ⟨1, E.fixingSubgroup.one_mem, by simp⟩ + · intro tau htau + rcases htau with ⟨g, hg, heq⟩ + have hga : g (a : L) = (a : L) := + (IntermediateField.mem_fixingSubgroup_iff E g).mp hg (a : L) + (IntermediateField.subset_adjoin (F := K) (S := {(a : L)}) (by simp)) + apply Subtype.ext + change (((tau : decompositionGroup K A) : L ≃ₐ[K] L) (a : L)) = + (((sigma : decompositionGroup K A) : L ≃ₐ[K] L) (a : L)) + rw [← heq] + simp [AlgEquiv.mul_apply, hga] + +private theorem decompositionGroup_continuousSMul + (A : _root_.ValuationSubring L) : + letI : TopologicalSpace A := ⊥ + ContinuousSMul (decompositionGroup K A) A := by + let : TopologicalSpace A := ⊥ + let : DiscreteTopology A := ⟨rfl⟩ + constructor + rw [continuous_prod_of_discrete_right] + intro a + exact (decompositionGroup_action_locallyConstant (K := K) A a).continuous + +private theorem decompositionGroup_compactSpace + (A : _root_.ValuationSubring L) : + CompactSpace (decompositionGroup K A) := by + have hc : IsCompact (decompositionGroup K A : Set (L ≃ₐ[K] L)) := + (decompositionGroup_isClosed K A).isCompact + exact isCompact_iff_compactSpace.mp hc + +omit [IsGalois K L] in +private theorem decompositionFixedSubring_smulCommClass + (A : _root_.ValuationSubring L) : + SMulCommClass (decompositionGroup K A) + (decompositionFixedSubring K A) A := by + constructor + intro g r x + change g • ((r : A) * x) = (r : A) * (g • x) + rw [smul_mul', r.property g] + +omit [IsGalois K L] in +private theorem decompositionFixedSubring_isInvariant + (A : _root_.ValuationSubring L) : + Algebra.IsInvariant (decompositionFixedSubring K A) A + (decompositionGroup K A) := by + constructor + intro x hx + exact ⟨⟨x, hx⟩, rfl⟩ + +/-- Provides the instance `instSMulCommClass`. -/ +instance decompositionFixedSubring.instSMulCommClass + (A : _root_.ValuationSubring L) : + SMulCommClass (decompositionGroup K A) + (decompositionFixedSubring K A) A := + decompositionFixedSubring_smulCommClass (K := K) A + +/-- Provides the instance `instIsInvariant`. -/ +instance decompositionFixedSubring.instIsInvariant + (A : _root_.ValuationSubring L) : + Algebra.IsInvariant (decompositionFixedSubring K A) A + (decompositionGroup K A) := + decompositionFixedSubring_isInvariant (K := K) A + +private theorem decompositionFixedMaximalIdeal_isMaximal + (A : _root_.ValuationSubring L) : + (decompositionFixedMaximalIdeal K A).IsMaximal := by + let : TopologicalSpace A := ⊥ + let : DiscreteTopology A := ⟨rfl⟩ + let : CompactSpace (decompositionGroup K A) := + decompositionGroup_compactSpace (K := K) A + let : ContinuousSMul (decompositionGroup K A) A := + decompositionGroup_continuousSMul (K := K) A + let : SMulCommClass (decompositionGroup K A) + (decompositionFixedSubring K A) A := + decompositionFixedSubring_smulCommClass (K := K) A + let : Algebra.IsInvariant (decompositionFixedSubring K A) A + (decompositionGroup K A) := + decompositionFixedSubring_isInvariant (K := K) A + let : Algebra.IsIntegral (decompositionFixedSubring K A) A := + Algebra.IsInvariant.isIntegral_of_profinite + (G := decompositionGroup K A) + exact Ideal.isMaximal_comap_of_isIntegral_of_isMaximal + (decompositionFixedSubring K A).subtype + (fun x => Algebra.IsIntegral.isIntegral x) + (IsLocalRing.maximalIdeal A) + +/-- Provides the instance `instIsMaximal`. -/ +instance decompositionFixedMaximalIdeal.instIsMaximal + (A : _root_.ValuationSubring L) : + (decompositionFixedMaximalIdeal K A).IsMaximal := + decompositionFixedMaximalIdeal_isMaximal (K := K) A + +/-- The contracted ideal used in the intrinsic presentation is the actual +maximal ideal of the valuation ring on `Z_w`. -/ +theorem decompositionFixedMaximalIdeal_eq_maximalIdeal + (A : _root_.ValuationSubring L) : + decompositionFixedMaximalIdeal K A = + IsLocalRing.maximalIdeal (decompositionFixedSubring K A) := + IsLocalRing.eq_maximalIdeal + (decompositionFixedMaximalIdeal.instIsMaximal (K := K) A) + +/-- Canonical identification of the literal residue field of `Z_w` with the +base residue field used by the residue-action exact sequence. -/ +def decompositionFieldResidueEquiv + (A : _root_.ValuationSubring L) : + IsLocalRing.ResidueField (decompositionFieldValuationSubring K A) ≃+* + decompositionResidueField K A := + (IsLocalRing.ResidueField.mapEquiv + (decompositionFieldValuationSubringEquivFixedSubring (K := K) A)).trans + (Ideal.quotientEquivAlgOfEq ℤ + (decompositionFixedMaximalIdeal_eq_maximalIdeal (K := K) A).symm).toRingEquiv + +/-- Provides the instance `instLiesOver`. -/ +instance selectedMaximalIdeal.instLiesOver + (A : _root_.ValuationSubring L) : + (IsLocalRing.maximalIdeal A).LiesOver + (decompositionFixedMaximalIdeal K A) := by + constructor + rfl + +/-- Provides the instance `instField`. -/ +noncomputable instance decompositionResidueField.instField + (A : _root_.ValuationSubring L) : + Field (decompositionResidueField K A) := + Ideal.Quotient.field (decompositionFixedMaximalIdeal K A) + +/-- Provides the instance `instAlgebra`. -/ +noncomputable instance selectedResidueField.instAlgebra + (A : _root_.ValuationSubring L) : + Algebra (decompositionResidueField K A) (selectedResidueField A) := + Ideal.Quotient.algebraQuotientOfLEComap + (le_of_eq ((IsLocalRing.maximalIdeal A).over_def + (decompositionFixedMaximalIdeal K A))) + +omit [IsGalois K L] in +/-- Every decomposition-group automorphism stabilizes the maximal ideal of +the selected valuation ring. -/ +theorem decompositionGroup_maximalIdeal_stabilizer_eq_top + (A : _root_.ValuationSubring L) : + MulAction.stabilizer (decompositionGroup K A) + (IsLocalRing.maximalIdeal A) = ⊤ := by + apply top_unique + intro sigma _hsigma + change sigma • IsLocalRing.maximalIdeal A = IsLocalRing.maximalIdeal A + apply Ideal.ext + intro x + rw [Ideal.mem_pointwise_smul_iff_inv_smul_mem] + simp only [IsLocalRing.mem_maximalIdeal] + constructor + · intro hnonunit hx + apply hnonunit + simpa using hx.map (MulSemiringAction.toRingAut + (decompositionGroup K A) A sigma⁻¹) + · intro hnonunit hx + apply hnonunit + simpa using hx.map (MulSemiringAction.toRingAut + (decompositionGroup K A) A sigma) + +/-- The canonical identification of the decomposition group with the +stabilizer of the selected maximal ideal. -/ +def decompositionGroupToMaximalIdealStabilizer + (A : _root_.ValuationSubring L) : + decompositionGroup K A →* + MulAction.stabilizer (decompositionGroup K A) + (IsLocalRing.maximalIdeal A) where + toFun sigma := ⟨sigma, by + rw [decompositionGroup_maximalIdeal_stabilizer_eq_top (K := K) A] + exact Subgroup.mem_top sigma⟩ + map_one' := rfl + map_mul' _ _ := rfl + +/-- The residue-action exact sequence: the residue action of `G_w` on `λ/κ`. -/ +def decompositionGroupResidueAction + (A : _root_.ValuationSubring L) : + decompositionGroup K A →* + (selectedResidueField A ≃ₐ[decompositionResidueField K A] + selectedResidueField A) := + (Ideal.Quotient.stabilizerHom + (IsLocalRing.maximalIdeal A) + (decompositionFixedMaximalIdeal K A) + (decompositionGroup K A)).comp + (decompositionGroupToMaximalIdealStabilizer (K := K) A) + +omit [IsGalois K L] in +/-- States the theorem `decompositionGroupResidueAction_residue`. -/ +@[simp] theorem decompositionGroupResidueAction_residue + (A : _root_.ValuationSubring L) + (sigma : decompositionGroup K A) (x : A) : + decompositionGroupResidueAction (K := K) A sigma + (IsLocalRing.residue A x) = + IsLocalRing.residue A (sigma • x) := + rfl + +/-- The canonical embedding of the literal residue field of `Z_w` into the +selected residue field `λ`; it is the usual residue map, expressed through +the canonical fixed-subring comparison. -/ +def decompositionFieldResidueMapToSelected + (A : _root_.ValuationSubring L) : + IsLocalRing.ResidueField (decompositionFieldValuationSubring K A) →+* + selectedResidueField A := + (algebraMap (decompositionResidueField K A) + (selectedResidueField A)).comp + (decompositionFieldResidueEquiv (K := K) A).toRingHom + +/-- The residue action in the exact sequence fixes the actual residue field of the +decomposition field. This is the action-compatibility part of the bridge +from the intrinsic quotient presentation to the classical `λ/κ`. -/ +theorem decompositionGroupResidueAction_commutes_decompositionFieldResidue + (A : _root_.ValuationSubring L) + (sigma : decompositionGroup K A) + (x : IsLocalRing.ResidueField + (decompositionFieldValuationSubring K A)) : + decompositionGroupResidueAction (K := K) A sigma + (decompositionFieldResidueMapToSelected (K := K) A x) = + decompositionFieldResidueMapToSelected (K := K) A x := by + exact (decompositionGroupResidueAction (K := K) A sigma).commutes + (decompositionFieldResidueEquiv (K := K) A x) + +omit [IsGalois K L] in +/-- The residue-action homomorphism has the ordinary inertia group as kernel. -/ +theorem decompositionGroupResidueAction_ker + (A : _root_.ValuationSubring L) : + MonoidHom.ker (decompositionGroupResidueAction (K := K) A) = + inertiaGroup K A := by + ext sigma + rw [MonoidHom.mem_ker, ← residueAction_ker (K := K) A, + MonoidHom.mem_ker] + constructor + · intro hsigma + ext y + obtain ⟨x, rfl⟩ := IsLocalRing.residue_surjective y + have h := DFunLike.congr_fun hsigma (IsLocalRing.residue A x) + exact h + · intro hsigma + apply AlgEquiv.ext + intro y + obtain ⟨x, rfl⟩ := IsLocalRing.residue_surjective y + have h := DFunLike.congr_fun hsigma (IsLocalRing.residue A x) + exact h + +/-- The residue-action exact sequence, including the infinite case: reduction is onto the full +residue Galois group. -/ +theorem decompositionGroupResidueAction_surjective + (A : _root_.ValuationSubring L) : + Function.Surjective (decompositionGroupResidueAction (K := K) A) := by + let : TopologicalSpace A := ⊥ + let : DiscreteTopology A := ⟨rfl⟩ + let : CompactSpace (decompositionGroup K A) := + decompositionGroup_compactSpace (K := K) A + let : ContinuousSMul (decompositionGroup K A) A := + decompositionGroup_continuousSMul (K := K) A + let : SMulCommClass (decompositionGroup K A) + (decompositionFixedSubring K A) A := + decompositionFixedSubring_smulCommClass (K := K) A + let : Algebra.IsInvariant (decompositionFixedSubring K A) A + (decompositionGroup K A) := + decompositionFixedSubring_isInvariant (K := K) A + intro sigma + obtain ⟨tau, htau⟩ := + Ideal.Quotient.stabilizerHom_surjective_of_profinite + (G := decompositionGroup K A) + (decompositionFixedMaximalIdeal K A) + (IsLocalRing.maximalIdeal A) sigma + refine ⟨tau.1, ?_⟩ + have htau_eq : + decompositionGroupToMaximalIdealStabilizer (K := K) A tau.1 = tau := by + apply Subtype.ext + rfl + change + Ideal.Quotient.stabilizerHom + (IsLocalRing.maximalIdeal A) + (decompositionFixedMaximalIdeal K A) + (decompositionGroup K A) + (decompositionGroupToMaximalIdealStabilizer (K := K) A tau.1) = + sigma + rw [htau_eq] + exact htau + +/-- The residue-action exact sequence: `λ/κ` is normal, also in the infinite case. -/ +instance decompositionResidueExtension_normal + (A : _root_.ValuationSubring L) : + Normal (decompositionResidueField K A) (selectedResidueField A) := by + let : TopologicalSpace A := ⊥ + let : DiscreteTopology A := ⟨rfl⟩ + let : CompactSpace (decompositionGroup K A) := + decompositionGroup_compactSpace (K := K) A + let : ContinuousSMul (decompositionGroup K A) A := + decompositionGroup_continuousSMul (K := K) A + let : SMulCommClass (decompositionGroup K A) + (decompositionFixedSubring K A) A := + decompositionFixedSubring_smulCommClass (K := K) A + let : Algebra.IsInvariant (decompositionFixedSubring K A) A + (decompositionGroup K A) := + decompositionFixedSubring_isInvariant (K := K) A + exact RamificationTheory.Ideal.Quotient.normal_of_profinite + (G := decompositionGroup K A) + (decompositionFixedMaximalIdeal K A) + (IsLocalRing.maximalIdeal A) + +omit [IsGalois K L] in +/-- Exactness at `G_w` in the residue-action exact sequence. -/ +theorem inertiaGroup_mulExact_decompositionGroupResidueAction + (A : _root_.ValuationSubring L) : + Function.MulExact (inertiaGroup K A).subtype + (decompositionGroupResidueAction (K := K) A) := by + rw [MonoidHom.mulExact_iff, decompositionGroupResidueAction_ker] + exact (Subgroup.range_subtype _).symm + +/-- The residue-action exact sequence, arbitrary Galois form: +`1 → I_w → G_w → Gal(λ/κ) → 1`. -/ +theorem decompositionGroupResidueAction_shortExact + (A : _root_.ValuationSubring L) : + Function.Injective (inertiaGroup K A).subtype ∧ + Function.MulExact (inertiaGroup K A).subtype + (decompositionGroupResidueAction (K := K) A) ∧ + Function.Surjective (decompositionGroupResidueAction (K := K) A) := by + exact ⟨Subtype.coe_injective, + inertiaGroup_mulExact_decompositionGroupResidueAction (K := K) A, + decompositionGroupResidueAction_surjective (K := K) A⟩ + +/-- Quotient form of the residue-action exact sequence. -/ +def decompositionQuotientEquivResidueGalois + (A : _root_.ValuationSubring L) : + decompositionGroup K A ⧸ inertiaGroup K A ≃* + (selectedResidueField A ≃ₐ[decompositionResidueField K A] + selectedResidueField A) := + (QuotientGroup.quotientMulEquivOfEq + (decompositionGroupResidueAction_ker (K := K) A).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (decompositionGroupResidueAction (K := K) A) + (decompositionGroupResidueAction_surjective (K := K) A)) + +/-- States the theorem `decompositionQuotientEquivResidueGalois_mk`. -/ +theorem decompositionQuotientEquivResidueGalois_mk + (A : _root_.ValuationSubring L) (sigma : decompositionGroup K A) : + decompositionQuotientEquivResidueGalois (K := K) A + (QuotientGroup.mk' (inertiaGroup K A) sigma) = + decompositionGroupResidueAction (K := K) A sigma := by + exact QuotientGroup.kerLift_mk (decompositionGroupResidueAction (K := K) A) sigma + +end ValuationSubring +end HilbertRamification + +end + +end RamificationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean new file mode 100644 index 0000000000..aa7f28a764 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean @@ -0,0 +1,1068 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Monogeneity +/-! +# First ramification-quotient homomorphism over general DVFs + +This file constructs the graded uniformizer homomorphism under the standing +hypotheses of ramification-number theory. Completeness is not assumed. The +injectivity statement includes the necessary separability hypothesis on the +residue extension; the unconditional printed assertion is false for fiercely +ramified extensions. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w x + +namespace RamificationTheory.HilbertRamification +namespace Higher + +open ValuationTheory.DiscreteValuationField.ResidueField + + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] +variable {base : ValuationTheory.DiscreteValuationField.DVF.{u, v} K} +variable {target : ValuationTheory.DiscreteValuationField.DVF.{w, x} L} +variable [FiniteDimensional K L] [base.valuation.HasExtension target.valuation] +variable [IsGalois K L] + +/-- The principal-unit filtration attached to a general DVF. -/ +def dvfHigherPrincipalUnitGroup + (target : ValuationTheory.DiscreteValuationField.DVF.{w, x} L) (n : ℕ) : + Subgroup target.valuationSubringˣ where + carrier := {a | (a : target.valuationSubring) - 1 ∈ target.maximalIdeal ^ n} + one_mem' := by simp + mul_mem' := by + intro a b ha hb + have hre : + ((a * b : target.valuationSubringˣ) : target.valuationSubring) - 1 = + (a : target.valuationSubring) * + ((b : target.valuationSubring) - 1) + + ((a : target.valuationSubring) - 1) := by + simp + ring + change + ((a * b : target.valuationSubringˣ) : target.valuationSubring) - 1 ∈ + target.maximalIdeal ^ n + rw [hre] + exact Ideal.add_mem _ + (Ideal.mul_mem_left _ _ hb) ha + inv_mem' := by + intro a ha + have hre : + ((a⁻¹ : target.valuationSubringˣ) : target.valuationSubring) - 1 = + -(((a⁻¹ : target.valuationSubringˣ) : target.valuationSubring) * + ((a : target.valuationSubring) - 1)) := by + calc + ((a⁻¹ : target.valuationSubringˣ) : target.valuationSubring) - 1 = + ((a⁻¹ : target.valuationSubringˣ) : target.valuationSubring) - + ((a⁻¹ : target.valuationSubringˣ) : target.valuationSubring) * + (a : target.valuationSubring) := by simp + _ = _ := by ring + change + ((a⁻¹ : target.valuationSubringˣ) : target.valuationSubring) - 1 ∈ + target.maximalIdeal ^ n + rw [hre] + exact (target.maximalIdeal ^ n).neg_mem + (Ideal.mul_mem_left _ _ ha) + +/-- States the theorem `mem_dvfHigherPrincipalUnitGroup_iff`. -/ +@[simp] theorem mem_dvfHigherPrincipalUnitGroup_iff + (target : ValuationTheory.DiscreteValuationField.DVF.{w, x} L) + (n : ℕ) (a : target.valuationSubringˣ) : + a ∈ dvfHigherPrincipalUnitGroup target n ↔ + (a : target.valuationSubring) - 1 ∈ target.maximalIdeal ^ n := + Iff.rfl + +/-- States the theorem `dvfHigherPrincipalUnitGroup_antitone`. -/ +theorem dvfHigherPrincipalUnitGroup_antitone + (target : ValuationTheory.DiscreteValuationField.DVF.{w, x} L) : + Antitone (dvfHigherPrincipalUnitGroup target) := by + intro m n hmn a ha + exact Ideal.pow_le_pow_right hmn ha + +/-- The literal target U_L^n/U_L^(n+1). -/ +abbrev dvfPrincipalUnitGradedPiece + (target : ValuationTheory.DiscreteValuationField.DVF.{w, x} L) (n : ℕ) := + dvfHigherPrincipalUnitGroup target n ⧸ + (dvfHigherPrincipalUnitGroup target (n + 1)).subgroupOf + (dvfHigherPrincipalUnitGroup target n) + +/-- The literal source G_n/G_(n+1) formed from the real lower groups. -/ +abbrev lowerRamificationGradedPiece + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (n : ℕ) := + lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ) ⧸ + (lowerRamificationGroup + (base := base) (target := target) huniq ((n + 1 : ℕ) : ℝ)).subgroupOf + (lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ)) + +/-- The unique-extension action on target valuation-ring units. -/ +abbrev dvfValuationSubringUnitAut + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (sigma : Gal(L/K)) : + target.valuationSubringˣ →* target.valuationSubringˣ := + Units.map + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma).toMonoidHom + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- States the theorem `dvfValuationSubringUnitAut_apply`. -/ +@[simp] theorem dvfValuationSubringUnitAut_apply + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (sigma : Gal(L/K)) (a : target.valuationSubringˣ) : + ((dvfValuationSubringUnitAut + (base := base) (target := target) huniq sigma a : + target.valuationSubringˣ) : target.valuationSubring) = + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma + (a : target.valuationSubring) := + rfl + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Every Galois conjugate of a target uniformizer differs from it by a +valuation-ring unit. -/ +theorem exists_dvfUniformizerQuotientUnit + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + {pi : target.valuationSubring} + (hpi : target.valuation.IsUniformizer (pi : L)) + (sigma : Gal(L/K)) : + ∃ a : target.valuationSubringˣ, + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma pi = + (a : target.valuationSubring) * pi := by + let sigmaPi := + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma pi + have hpiMem : pi ∈ target.maximalIdeal := + target.uniformizer_mem_maximalIdeal hpi + have hpiDvd : pi ∣ sigmaPi := by + have hsigmaMem : sigmaPi ∈ target.maximalIdeal ^ 1 := by + exact + (valuationSubringAutOfUniqueExtension_mem_maximalIdeal_pow_iff + (base := base) (target := target) huniq sigma 1 pi).2 + (by simpa using hpiMem) + rw [← Ideal.mem_span_singleton] + have hsigmaMem' : sigmaPi ∈ target.maximalIdeal := by + simpa using hsigmaMem + rw [target.maximalIdeal_eq_span_uniformizer hpi] at hsigmaMem' + exact hsigmaMem' + have hsigmaDvd : sigmaPi ∣ pi := by + have hinvMem : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma⁻¹ pi ∈ + target.maximalIdeal ^ 1 := + (valuationSubringAutOfUniqueExtension_mem_maximalIdeal_pow_iff + (base := base) (target := target) huniq sigma⁻¹ 1 pi).2 + (by simpa using hpiMem) + have hdiv : + pi ∣ valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma⁻¹ pi := by + rw [← Ideal.mem_span_singleton] + have hinvMem' : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma⁻¹ pi ∈ + target.maximalIdeal := by + simpa using hinvMem + rw [target.maximalIdeal_eq_span_uniformizer hpi] at hinvMem' + exact hinvMem' + rcases hdiv with ⟨b, hb⟩ + refine + ⟨valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma b, ?_⟩ + calc + pi = + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma⁻¹ pi) := by + rw [valuationSubringAutOfUniqueExtension_apply_inv_apply] + _ = valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma (pi * b) := by + rw [hb] + _ = sigmaPi * + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma b := by + simp [sigmaPi] + rcases hpiDvd with ⟨a, ha⟩ + rcases hsigmaDvd with ⟨b, hb⟩ + have hpi0 : pi ≠ 0 := by + intro hzero + have hzeroL := + congrArg (fun z : target.valuationSubring => (z : L)) hzero + exact hpi.ne_zero (by simpa using hzeroL) + have hab : a * b = 1 := by + apply mul_left_cancel₀ hpi0 + calc + pi * (a * b) = (pi * a) * b := by rw [mul_assoc] + _ = sigmaPi * b := by rw [← ha] + _ = pi := hb.symm + _ = pi * 1 := by rw [mul_one] + refine ⟨⟨a, b, hab, ?_⟩, ?_⟩ + · simpa [mul_comm] using hab + · change sigmaPi = a * pi + simpa [mul_comm] using ha + +/-- The chosen unit sigma(pi)/pi. -/ +noncomputable def dvfUniformizerQuotientUnit + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (pi : target.valuationSubring) + (hpi : target.valuation.IsUniformizer (pi : L)) + (sigma : Gal(L/K)) : target.valuationSubringˣ := + Classical.choose + (exists_dvfUniformizerQuotientUnit + (base := base) (target := target) huniq hpi sigma) + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- States the theorem `dvfUniformizerQuotientUnit_mul_uniformizer`. -/ +@[simp] theorem dvfUniformizerQuotientUnit_mul_uniformizer + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (pi : target.valuationSubring) + (hpi : target.valuation.IsUniformizer (pi : L)) + (sigma : Gal(L/K)) : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma pi = + (dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi sigma : + target.valuationSubring) * pi := + Classical.choose_spec + (exists_dvfUniformizerQuotientUnit + (base := base) (target := target) huniq hpi sigma) + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Exact cocycle identity for the chosen quotient units. -/ +theorem dvfUniformizerQuotientUnit_mul_eq + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (pi : target.valuationSubring) + (hpi : target.valuation.IsUniformizer (pi : L)) + (sigma tau : Gal(L/K)) : + dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi (sigma * tau) = + dvfValuationSubringUnitAut + (base := base) (target := target) huniq sigma + (dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi tau) * + dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi sigma := by + apply Units.ext + have hpi0 : pi ≠ 0 := by + intro hzero + have hzeroL := + congrArg (fun z : target.valuationSubring => (z : L)) hzero + exact hpi.ne_zero (by simpa using hzeroL) + apply mul_right_cancel₀ hpi0 + calc + ((dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi (sigma * tau) : + target.valuationSubringˣ) : target.valuationSubring) * pi = + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq (sigma * tau) pi := by + rw [dvfUniformizerQuotientUnit_mul_uniformizer + (base := base) (target := target) huniq pi hpi (sigma * tau)] + _ = valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq tau pi) := by + rw [valuationSubringAutOfUniqueExtension_mul_apply] + _ = valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma + ((dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi tau : + target.valuationSubringˣ) : target.valuationSubring) * + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma pi := by + rw [dvfUniformizerQuotientUnit_mul_uniformizer + (base := base) (target := target) huniq pi hpi tau] + simp + _ = + ((dvfValuationSubringUnitAut + (base := base) (target := target) huniq sigma + (dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi tau) * + dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi sigma : + target.valuationSubringˣ) : target.valuationSubring) * pi := by + rw [dvfUniformizerQuotientUnit_mul_uniformizer + (base := base) (target := target) huniq pi hpi sigma] + simp [mul_assoc] + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Quotient-unit membership is equivalent to one-deeper displacement of the +uniformizer. -/ +theorem dvfUniformizerQuotientUnit_mem_iff_uniformizer_sub_mem + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + {pi : target.valuationSubring} + (hpi : target.valuation.IsUniformizer (pi : L)) + (n : ℕ) (sigma : Gal(L/K)) : + dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi sigma ∈ + dvfHigherPrincipalUnitGroup target n ↔ + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma pi - pi ∈ + target.maximalIdeal ^ (n + 1) := by + let a : target.valuationSubring := + (dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi sigma : + target.valuationSubring) + change a - 1 ∈ target.maximalIdeal ^ n ↔ _ + have hmul : + (a - 1) * pi = + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma pi - pi := by + dsimp [a] + rw [dvfUniformizerQuotientUnit_mul_uniformizer + (base := base) (target := target) huniq pi hpi sigma] + ring + constructor + · intro ha + rw [← hmul] + rw [target.mem_maximalIdeal_pow_iff_uniformizer_pow_dvd + (pi := pi) (x := (a - 1) * pi) hpi (n + 1)] + rw [target.mem_maximalIdeal_pow_iff_uniformizer_pow_dvd + (pi := pi) (x := a - 1) hpi n] at ha + rcases ha with ⟨b, hb⟩ + refine ⟨b, ?_⟩ + calc + (a - 1) * pi = (pi ^ n * b) * pi := by rw [hb] + _ = pi ^ (n + 1) * b := by rw [pow_succ]; ring + · intro hdiff + rw [← hmul] at hdiff + rw [target.mem_maximalIdeal_pow_iff_uniformizer_pow_dvd + (pi := pi) (x := (a - 1) * pi) hpi (n + 1)] at hdiff + rw [target.mem_maximalIdeal_pow_iff_uniformizer_pow_dvd + (pi := pi) (x := a - 1) hpi n] + rcases hdiff with ⟨b, hb⟩ + refine ⟨b, ?_⟩ + have hpi0 : pi ≠ 0 := by + intro hzero + have hzeroL := + congrArg (fun z : target.valuationSubring => (z : L)) hzero + exact hpi.ne_zero (by simpa using hzeroL) + apply mul_right_cancel₀ hpi0 + calc + (a - 1) * pi = pi ^ (n + 1) * b := hb + _ = (pi ^ n * b) * pi := by rw [pow_succ]; ring + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- If sigma lies in G_n, then sigma(pi)/pi lies in U_L^n. -/ +theorem dvfUniformizerQuotientUnit_mem_of_mem_lowerRamificationGroup + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + {pi : target.valuationSubring} + (hpi : target.valuation.IsUniformizer (pi : L)) + {n : ℕ} {sigma : Gal(L/K)} + (hsigma : + sigma ∈ lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ)) : + dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi sigma ∈ + dvfHigherPrincipalUnitGroup target n := by + exact + (dvfUniformizerQuotientUnit_mem_iff_uniformizer_sub_mem + (base := base) (target := target) huniq hpi n sigma).2 + ((mem_lowerRamificationGroup_nat_iff + (base := base) (target := target) huniq n sigma).1 hsigma pi) + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- A G_n automorphism acts trivially on every unit modulo U_L^(n+1). -/ +theorem dvfValuationSubringUnitAut_div_mem_succ + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + {n : ℕ} {sigma : Gal(L/K)} + (hsigma : + sigma ∈ lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ)) + (a : target.valuationSubringˣ) : + dvfValuationSubringUnitAut + (base := base) (target := target) huniq sigma a / a ∈ + dvfHigherPrincipalUnitGroup target (n + 1) := by + rw [mem_dvfHigherPrincipalUnitGroup_iff] + have hdiff : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma + (a : target.valuationSubring) - + (a : target.valuationSubring) ∈ + target.maximalIdeal ^ (n + 1) := + (mem_lowerRamificationGroup_nat_iff + (base := base) (target := target) huniq n sigma).1 hsigma a + have hre : + ((dvfValuationSubringUnitAut + (base := base) (target := target) huniq sigma a / a : + target.valuationSubringˣ) : target.valuationSubring) - 1 = + ((a⁻¹ : target.valuationSubringˣ) : target.valuationSubring) * + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma + (a : target.valuationSubring) - + (a : target.valuationSubring)) := by + simp only [div_eq_mul_inv, Units.val_mul, Units.coe_map, RingHom.toMonoidHom_eq_coe, + RingEquiv.toRingHom_eq_coe, MonoidHom.coe_coe, RingHom.coe_coe] + have hinv : + ((a⁻¹ : target.valuationSubringˣ) : target.valuationSubring) * + (a : target.valuationSubring) = 1 := by + exact_mod_cast Units.inv_mul a + rw [mul_sub, hinv] + ring + rw [hre] + exact Ideal.mul_mem_left _ _ hdiff + +/-- Any two target uniformizers differ by a valuation-ring unit. -/ +theorem exists_dvf_unit_mul_uniformizer_eq_uniformizer + {pi pi' : target.valuationSubring} + (hpi : target.valuation.IsUniformizer (pi : L)) + (hpi' : target.valuation.IsUniformizer (pi' : L)) : + ∃ a : target.valuationSubringˣ, + pi' = (a : target.valuationSubring) * pi := by + rcases Valuation.associated_of_isUniformizer + (v := target.valuation) hpi hpi' with + ⟨a, ha⟩ + exact ⟨a, by rw [← ha, mul_comm]⟩ + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Exact change-of-uniformizer formula. -/ +theorem dvfUniformizerQuotientUnit_eq_of_uniformizer_eq_unit_mul + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + {pi pi' : target.valuationSubring} + (hpi : target.valuation.IsUniformizer (pi : L)) + (hpi' : target.valuation.IsUniformizer (pi' : L)) + (a : target.valuationSubringˣ) + (hpiA : pi' = (a : target.valuationSubring) * pi) + (sigma : Gal(L/K)) : + dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi' hpi' sigma = + dvfValuationSubringUnitAut + (base := base) (target := target) huniq sigma a * + dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi sigma * a⁻¹ := by + apply Units.ext + have hpi'0 : pi' ≠ 0 := by + intro hzero + have hzeroL := + congrArg (fun z : target.valuationSubring => (z : L)) hzero + exact hpi'.ne_zero (by simpa using hzeroL) + apply mul_right_cancel₀ hpi'0 + calc + ((dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi' hpi' sigma : + target.valuationSubringˣ) : target.valuationSubring) * pi' = + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma pi' := by + rw [dvfUniformizerQuotientUnit_mul_uniformizer + (base := base) (target := target) huniq pi' hpi' sigma] + _ = valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma + ((a : target.valuationSubring) * pi) := by + rw [hpiA] + _ = + (dvfValuationSubringUnitAut + (base := base) (target := target) huniq sigma a : + target.valuationSubringˣ) * + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma pi := by + simp + _ = + (dvfValuationSubringUnitAut + (base := base) (target := target) huniq sigma a : + target.valuationSubringˣ) * + ((dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi sigma : + target.valuationSubringˣ) : target.valuationSubring) * pi := by + rw [dvfUniformizerQuotientUnit_mul_uniformizer + (base := base) (target := target) huniq pi hpi sigma] + ring + _ = + ((dvfValuationSubringUnitAut + (base := base) (target := target) huniq sigma a * + dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi sigma * a⁻¹ : + target.valuationSubringˣ) : target.valuationSubring) * pi' := by + rw [hpiA] + simp [mul_assoc, mul_comm] + +/-- Representative homomorphism from G_n to the literal principal-unit +graded quotient. -/ +noncomputable def dvfUniformizerRepresentativeHom + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (pi : target.valuationSubring) + (hpi : target.valuation.IsUniformizer (pi : L)) + (n : ℕ) : + lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ) →* + dvfPrincipalUnitGradedPiece target n where + toFun sigma := + QuotientGroup.mk' + ((dvfHigherPrincipalUnitGroup target (n + 1)).subgroupOf + (dvfHigherPrincipalUnitGroup target n)) + ⟨dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi + (sigma : Gal(L/K)), + dvfUniformizerQuotientUnit_mem_of_mem_lowerRamificationGroup + (base := base) (target := target) huniq hpi sigma.property⟩ + map_one' := by + let oneN : + lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ) := 1 + let u1 : dvfHigherPrincipalUnitGroup target n := + ⟨dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi 1, + dvfUniformizerQuotientUnit_mem_of_mem_lowerRamificationGroup + (base := base) (target := target) huniq hpi oneN.property⟩ + change + QuotientGroup.mk' + ((dvfHigherPrincipalUnitGroup target (n + 1)).subgroupOf + (dvfHigherPrincipalUnitGroup target n)) u1 = 1 + apply + (QuotientGroup.eq_one_iff + (N := (dvfHigherPrincipalUnitGroup target (n + 1)).subgroupOf + (dvfHigherPrincipalUnitGroup target n)) u1).2 + change + dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi 1 ∈ + dvfHigherPrincipalUnitGroup target (n + 1) + exact + dvfUniformizerQuotientUnit_mem_of_mem_lowerRamificationGroup + (base := base) (target := target) huniq hpi + (lowerRamificationGroup + (base := base) (target := target) huniq + ((n + 1 : ℕ) : ℝ)).one_mem + map_mul' := by + intro sigma tau + apply + (QuotientGroup.eq_iff_div_mem + (N := (dvfHigherPrincipalUnitGroup target (n + 1)).subgroupOf + (dvfHigherPrincipalUnitGroup target n))).2 + change + dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi + ((sigma : Gal(L/K)) * (tau : Gal(L/K))) / + (dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi + (sigma : Gal(L/K)) * + dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi + (tau : Gal(L/K))) ∈ + dvfHigherPrincipalUnitGroup target (n + 1) + have hact := + dvfValuationSubringUnitAut_div_mem_succ + (base := base) (target := target) huniq sigma.property + (dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi + (tau : Gal(L/K))) + rw [dvfUniformizerQuotientUnit_mul_eq + (base := base) (target := target) huniq pi hpi + (sigma : Gal(L/K)) (tau : Gal(L/K))] + simpa [div_eq_mul_inv, mul_assoc, mul_comm, mul_left_comm] using hact + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- States the theorem `dvfUniformizerRepresentativeHom_apply`. -/ +@[simp] theorem dvfUniformizerRepresentativeHom_apply + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (pi : target.valuationSubring) + (hpi : target.valuation.IsUniformizer (pi : L)) + (n : ℕ) + (sigma : + lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ)) : + dvfUniformizerRepresentativeHom + (base := base) (target := target) huniq pi hpi n sigma = + QuotientGroup.mk' + ((dvfHigherPrincipalUnitGroup target (n + 1)).subgroupOf + (dvfHigherPrincipalUnitGroup target n)) + ⟨dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi + (sigma : Gal(L/K)), + dvfUniformizerQuotientUnit_mem_of_mem_lowerRamificationGroup + (base := base) (target := target) huniq hpi sigma.property⟩ := + rfl + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Representative-level independence of the chosen uniformizer. -/ +theorem dvfUniformizerRepresentativeHom_apply_eq_of_uniformizers + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + {pi pi' : target.valuationSubring} + (hpi : target.valuation.IsUniformizer (pi : L)) + (hpi' : target.valuation.IsUniformizer (pi' : L)) + (n : ℕ) + (sigma : + lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ)) : + dvfUniformizerRepresentativeHom + (base := base) (target := target) huniq pi' hpi' n sigma = + dvfUniformizerRepresentativeHom + (base := base) (target := target) huniq pi hpi n sigma := by + rcases exists_dvf_unit_mul_uniformizer_eq_uniformizer + (target := target) hpi hpi' with + ⟨a, hpiA⟩ + apply + (QuotientGroup.eq_iff_div_mem + (N := (dvfHigherPrincipalUnitGroup target (n + 1)).subgroupOf + (dvfHigherPrincipalUnitGroup target n))).2 + change + dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi' hpi' + (sigma : Gal(L/K)) / + dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi + (sigma : Gal(L/K)) ∈ + dvfHigherPrincipalUnitGroup target (n + 1) + have hact := + dvfValuationSubringUnitAut_div_mem_succ + (base := base) (target := target) huniq sigma.property a + rw [dvfUniformizerQuotientUnit_eq_of_uniformizer_eq_unit_mul + (base := base) (target := target) huniq hpi hpi' a hpiA + (sigma : Gal(L/K))] + simpa [div_eq_mul_inv, mul_assoc, mul_comm, mul_left_comm] using hact + +/-- The first ramification-quotient homomorphism: the uniformizer quotient descends +to G_n/G_(n+1) with values in U_L^n/U_L^(n+1). -/ +noncomputable def uniformizerGradedHom + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (pi : target.valuationSubring) + (hpi : target.valuation.IsUniformizer (pi : L)) + (n : ℕ) : + lowerRamificationGradedPiece (base := base) (target := target) huniq n →* + dvfPrincipalUnitGradedPiece target n := + QuotientGroup.lift + ((lowerRamificationGroup + (base := base) (target := target) huniq + ((n + 1 : ℕ) : ℝ)).subgroupOf + (lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ))) + (dvfUniformizerRepresentativeHom + (base := base) (target := target) huniq pi hpi n) + (by + intro sigma hsigma + rw [MonoidHom.mem_ker] + change + QuotientGroup.mk' + ((dvfHigherPrincipalUnitGroup target (n + 1)).subgroupOf + (dvfHigherPrincipalUnitGroup target n)) + ⟨dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi + (sigma : Gal(L/K)), + dvfUniformizerQuotientUnit_mem_of_mem_lowerRamificationGroup + (base := base) (target := target) huniq hpi sigma.property⟩ = + 1 + apply + (QuotientGroup.eq_one_iff + (N := (dvfHigherPrincipalUnitGroup target (n + 1)).subgroupOf + (dvfHigherPrincipalUnitGroup target n)) + ⟨dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi + (sigma : Gal(L/K)), + dvfUniformizerQuotientUnit_mem_of_mem_lowerRamificationGroup + (base := base) (target := target) huniq hpi sigma.property⟩).2 + change + dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi + (sigma : Gal(L/K)) ∈ + dvfHigherPrincipalUnitGroup target (n + 1) + exact + dvfUniformizerQuotientUnit_mem_of_mem_lowerRamificationGroup + (base := base) (target := target) huniq hpi + (by simpa [Subgroup.mem_subgroupOf] using hsigma)) + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- States the theorem `uniformizerGradedHom_mk`. -/ +theorem uniformizerGradedHom_mk + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (pi : target.valuationSubring) + (hpi : target.valuation.IsUniformizer (pi : L)) + (n : ℕ) + (sigma : + lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ)) : + uniformizerGradedHom + (base := base) (target := target) huniq pi hpi n + (QuotientGroup.mk' + ((lowerRamificationGroup + (base := base) (target := target) huniq + ((n + 1 : ℕ) : ℝ)).subgroupOf + (lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ))) sigma) = + dvfUniformizerRepresentativeHom + (base := base) (target := target) huniq pi hpi n sigma := + rfl + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- The graded homomorphism is independent of the chosen uniformizer. -/ +theorem uniformizerGradedHom_eq_of_uniformizers + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + {pi pi' : target.valuationSubring} + (hpi : target.valuation.IsUniformizer (pi : L)) + (hpi' : target.valuation.IsUniformizer (pi' : L)) + (n : ℕ) : + uniformizerGradedHom + (base := base) (target := target) huniq pi' hpi' n = + uniformizerGradedHom + (base := base) (target := target) huniq pi hpi n := by + apply MonoidHom.ext + intro q + obtain ⟨sigma, rfl⟩ := + QuotientGroup.mk'_surjective + ((lowerRamificationGroup + (base := base) (target := target) huniq + ((n + 1 : ℕ) : ℝ)).subgroupOf + (lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ))) q + exact + dvfUniformizerRepresentativeHom_apply_eq_of_uniformizers + (base := base) (target := target) huniq hpi hpi' n sigma + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- Kernel criterion at a representative. -/ +theorem uniformizerGradedHom_mk_eq_one_iff + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (pi : target.valuationSubring) + (hpi : target.valuation.IsUniformizer (pi : L)) + (n : ℕ) + (sigma : + lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ)) : + uniformizerGradedHom + (base := base) (target := target) huniq pi hpi n + (QuotientGroup.mk' + ((lowerRamificationGroup + (base := base) (target := target) huniq + ((n + 1 : ℕ) : ℝ)).subgroupOf + (lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ))) sigma) = 1 ↔ + dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi + (sigma : Gal(L/K)) ∈ + dvfHigherPrincipalUnitGroup target (n + 1) := by + rw [uniformizerGradedHom_mk] + exact + QuotientGroup.eq_one_iff + (N := (dvfHigherPrincipalUnitGroup target (n + 1)).subgroupOf + (dvfHigherPrincipalUnitGroup target n)) + ⟨dvfUniformizerQuotientUnit + (base := base) (target := target) huniq pi hpi + (sigma : Gal(L/K)), + dvfUniformizerQuotientUnit_mem_of_mem_lowerRamificationGroup + (base := base) (target := target) huniq hpi sigma.property⟩ + +/-- The unique-extension ring automorphism as an algebra automorphism over +the base valuation ring. -/ +def valuationSubringAlgEquivOfUniqueExtension + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (sigma : Gal(L/K)) : + target.valuationSubring ≃ₐ[base.valuationSubring] + target.valuationSubring := + { valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma with + commutes' := by + intro a + apply Subtype.ext + simp [valuationSubringAutOfUniqueExtension] } + +/-- Taylor's one-step argument over a general DVF. -/ +theorem polynomial_argument_sub_mem_succ_dvf + {P : Polynomial target.valuationSubring} + {a b : target.valuationSubring} {n : ℕ} + (hderiv : IsUnit (P.derivative.eval a)) + (hab : b - a ∈ target.maximalIdeal ^ (n + 1)) + (hP : P.eval b - P.eval a ∈ target.maximalIdeal ^ (n + 2)) : + b - a ∈ target.maximalIdeal ^ (n + 2) := by + let q : Polynomial target.valuationSubring := + P /ₘ (Polynomial.X - Polynomial.C a) + have hdecomp : + P = Polynomial.C (P.eval a) + + (Polynomial.X - Polynomial.C a) * q := by + dsimp [q] + calc + P = P %ₘ (Polynomial.X - Polynomial.C a) + + (Polynomial.X - Polynomial.C a) * + (P /ₘ (Polynomial.X - Polynomial.C a)) := + (Polynomial.modByMonic_add_div P + (Polynomial.X - Polynomial.C a)).symm + _ = Polynomial.C (P.eval a) + + (Polynomial.X - Polynomial.C a) * + (P /ₘ (Polynomial.X - Polynomial.C a)) := by + rw [Polynomial.modByMonic_X_sub_C_eq_C_eval] + have hEval : + P.eval b - P.eval a = (b - a) * q.eval b := by + rw [hdecomp] + simp [Polynomial.eval_add, Polynomial.eval_mul, Polynomial.eval_sub] + have hqEval : q.eval a = P.derivative.eval a := by + simpa [q] using + ValuationTheory.DiscreteValuationField.divByMonic_X_sub_C_eval_eq_derivative_eval + (p := P) a + have hqUnitA : IsUnit (q.eval a) := by + simpa [hqEval] using hderiv + have hqdiff : + q.eval b - q.eval a ∈ target.maximalIdeal ^ (n + 1) := by + simpa using + polynomial_eval₂_sub_mem_of_sub_mem + (f := RingHom.id target.valuationSubring) + (I := target.maximalIdeal ^ (n + 1)) + (x := b) (y := a) hab q + have hqdiffM : q.eval b - q.eval a ∈ target.maximalIdeal := by + simpa using + Ideal.pow_le_pow_right (Nat.succ_pos n) hqdiff + have hres : + target.residueMap (q.eval b) = + target.residueMap (q.eval a) := by + rw [residue_eq_residue_iff_sub_mem_maximalIdeal + (R := target.valuationSubring)] + exact hqdiffM + have hresA : target.residueMap (q.eval a) ≠ 0 := + (target.residue_ne_zero_iff_isUnit (q.eval a)).2 hqUnitA + have hresB : target.residueMap (q.eval b) ≠ 0 := by + rw [hres] + exact hresA + have hqUnitB : IsUnit (q.eval b) := + (target.residue_ne_zero_iff_isUnit (q.eval b)).1 hresB + have hmul : + q.eval b * (b - a) ∈ target.maximalIdeal ^ (n + 2) := by + simpa [hEval, mul_comm] using hP + exact + ((target.maximalIdeal ^ (n + 2)).unit_mul_mem_iff_mem hqUnitB).1 + hmul + +omit [FiniteDimensional K L] [IsGalois K L] in +/-- A displacement bound on an algebra generator propagates to the algebra +it generates. -/ +theorem valuationSubringAutOfUniqueExtension_sub_mem_of_mem_adjoin_graded + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + {generator : target.valuationSubring} {r : ℕ} {sigma : Gal(L/K)} + (hgenerator : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma generator - + generator ∈ target.maximalIdeal ^ r) + {a : target.valuationSubring} + (ha : + a ∈ Algebra.adjoin base.valuationSubring + ({generator} : Set target.valuationSubring)) : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a - + a ∈ target.maximalIdeal ^ r := by + let e := + valuationSubringAlgEquivOfUniqueExtension + (base := base) (target := target) huniq sigma + induction ha using Algebra.adjoin_induction with + | mem a ha => + rw [Set.mem_singleton_iff] at ha + subst a + exact hgenerator + | algebraMap a => + rw [show + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma + (algebraMap base.valuationSubring target.valuationSubring a) = + algebraMap base.valuationSubring target.valuationSubring a from + e.commutes a, sub_self] + exact Ideal.zero_mem _ + | add a b _ha _hb ha hb => + have hre : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma (a + b) - + (a + b) = + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a - a) + + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma b - b) := by + simp + ring + rw [hre] + exact Ideal.add_mem _ ha hb + | mul a b _ha _hb ha hb => + have hre : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma (a * b) - + a * b = + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a * + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma b - b) + + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq sigma a - a) * b := by + simp + ring + rw [hre] + exact Ideal.add_mem _ + (Ideal.mul_mem_left _ _ hb) + (Ideal.mul_mem_right _ _ ha) + +/-- Corrected maximal form of the first ramification-quotient homomorphism over +general DVFs. Residue separability is essential: the unconditional +injectivity without additional hypotheses fails for fiercely ramified extensions. -/ +theorem uniformizerGradedHom_injective_of_residue_isSeparable + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + base target) + [Algebra.IsSeparable base.residueField target.residueField] + (pi : target.valuationSubring) + (hpi : target.valuation.IsUniformizer (pi : L)) + (n : ℕ) : + Function.Injective + (uniformizerGradedHom + (base := base) (target := target) huniq pi hpi n) := by + rcases exists_valuationSubring_generator_data_of_uniqueExtension + (base := base) (target := target) huniq with + ⟨P, generator, _hprim, hpiGenerator, hderiv, hgenerator⟩ + let piGenerator : target.valuationSubring := + Polynomial.aeval generator P + rw [← MonoidHom.ker_eq_bot_iff] + apply le_antisymm + · intro q hq + obtain ⟨sigma, rfl⟩ := + QuotientGroup.mk'_surjective + ((lowerRamificationGroup + (base := base) (target := target) huniq + ((n + 1 : ℕ) : ℝ)).subgroupOf + (lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ))) q + have hmapPi : + uniformizerGradedHom + (base := base) (target := target) huniq pi hpi n + (QuotientGroup.mk' + ((lowerRamificationGroup + (base := base) (target := target) huniq + ((n + 1 : ℕ) : ℝ)).subgroupOf + (lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ))) sigma) = + 1 := + MonoidHom.mem_ker.mp hq + have hmapGenerator : + uniformizerGradedHom + (base := base) (target := target) huniq + piGenerator hpiGenerator n + (QuotientGroup.mk' + ((lowerRamificationGroup + (base := base) (target := target) huniq + ((n + 1 : ℕ) : ℝ)).subgroupOf + (lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ))) sigma) = + 1 := by + rw [uniformizerGradedHom_eq_of_uniformizers + (base := base) (target := target) huniq hpi hpiGenerator n] + exact hmapPi + have hu : + dvfUniformizerQuotientUnit + (base := base) (target := target) huniq + piGenerator hpiGenerator (sigma : Gal(L/K)) ∈ + dvfHigherPrincipalUnitGroup target (n + 1) := + (uniformizerGradedHom_mk_eq_one_iff + (base := base) (target := target) huniq + piGenerator hpiGenerator n sigma).1 hmapGenerator + let e := + valuationSubringAlgEquivOfUniqueExtension + (base := base) (target := target) huniq (sigma : Gal(L/K)) + let Q : Polynomial target.valuationSubring := + P.map (algebraMap base.valuationSubring target.valuationSubring) + have hx : + e generator - generator ∈ target.maximalIdeal ^ (n + 1) := + (mem_lowerRamificationGroup_nat_iff + (base := base) (target := target) huniq n (sigma : Gal(L/K))).1 + sigma.property generator + have hpiDeep : + e piGenerator - piGenerator ∈ target.maximalIdeal ^ (n + 2) := by + exact + (dvfUniformizerQuotientUnit_mem_iff_uniformizer_sub_mem + (base := base) (target := target) huniq + hpiGenerator (n + 1) (sigma : Gal(L/K))).1 hu + have hmap : + e (Polynomial.aeval generator P) = + Polynomial.aeval (e generator) P := by + simpa [e] using + (Polynomial.aeval_algHom_apply e.toAlgHom generator P).symm + have hQeval : + Q.eval (e generator) - Q.eval generator = + e piGenerator - piGenerator := by + calc + Q.eval (e generator) - Q.eval generator = + Polynomial.aeval (e generator) P - + Polynomial.aeval generator P := by + simp [Q, Polynomial.aeval_def] + _ = e (Polynomial.aeval generator P) - + Polynomial.aeval generator P := by + rw [← hmap] + _ = e piGenerator - piGenerator := rfl + have hQdeep : + Q.eval (e generator) - Q.eval generator ∈ + target.maximalIdeal ^ (n + 2) := by + rw [hQeval] + exact hpiDeep + have hxDeep : + e generator - generator ∈ target.maximalIdeal ^ (n + 2) := + polynomial_argument_sub_mem_succ_dvf + (target := target) (P := Q) + (a := generator) (b := e generator) (n := n) + (by simpa [Q] using hderiv) hx hQdeep + have hnext : + (sigma : Gal(L/K)) ∈ + lowerRamificationGroup + (base := base) (target := target) huniq ((n + 1 : ℕ) : ℝ) := by + rw [mem_lowerRamificationGroup_nat_iff] + intro a + apply + valuationSubringAutOfUniqueExtension_sub_mem_of_mem_adjoin_graded + (base := base) (target := target) huniq + (generator := generator) (r := n + 2) + (sigma := (sigma : Gal(L/K))) + · exact hxDeep + · rw [hgenerator] + simp + exact + (QuotientGroup.eq_one_iff + (N := (lowerRamificationGroup + (base := base) (target := target) huniq + ((n + 1 : ℕ) : ℝ)).subgroupOf + (lowerRamificationGroup + (base := base) (target := target) huniq (n : ℝ))) + sigma).2 (by + simpa [Subgroup.mem_subgroupOf] using hnext) + · exact bot_le + +end Higher +end RamificationTheory.HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniqueExtensionIntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniqueExtensionIntegralClosure.lean new file mode 100644 index 0000000000..83cc259e37 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniqueExtensionIntegralClosure.lean @@ -0,0 +1,222 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +public import Mathlib.Algebra.Polynomial.Lifts +/-! +# Integral closure for a unique discrete valuation extension + +This file supplies the noncomplete integral-closure input used in +ramification-number theory. For a finite Galois extension with a uniquely chosen +extension of the base discrete valuation, the Galois orbit polynomial of an +integer has coefficients in the base valuation ring. Consequently the target +valuation ring is integral, hence finite, over the base valuation ring. + +No completeness or Henselian hypothesis is used. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w x + +namespace RamificationTheory.HilbertRamification +namespace Higher + +open RamificationTheory.DiscreteValuationField.DVF +open ValuationTheory.DiscreteValuationField.Valuation +open scoped Polynomial + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] +variable {base : ValuationTheory.DiscreteValuationField.DVF.{u, v} K} +variable {target : ValuationTheory.DiscreteValuationField.DVF.{w, x} L} +variable [FiniteDimensional K L] [base.valuation.HasExtension target.valuation] +variable [IsGalois K L] + +/-- The full Galois-orbit polynomial of an element of the target valuation +ring. Uniqueness of the valuation extension makes every factor integral. -/ +def integralOrbitPolynomial + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (a : target.valuationSubring) : Polynomial target.valuationSubring := by + classical + exact ∏ σ : Gal(L/K), + (Polynomial.X - Polynomial.C + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a)) + +omit [IsGalois K L] in +/-- States the theorem `integralOrbitPolynomial_monic`. -/ +theorem integralOrbitPolynomial_monic + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (a : target.valuationSubring) : + (integralOrbitPolynomial + (base := base) (target := target) huniq a).Monic := by + classical + apply Polynomial.monic_prod_of_monic + intro σ _hσ + exact Polynomial.monic_X_sub_C _ + +omit [IsGalois K L] in +/-- The orbit polynomial is invariant under every Galois automorphism. -/ +theorem integralOrbitPolynomial_map_valuationSubringAut + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (a : target.valuationSubring) (ρ : Gal(L/K)) : + (integralOrbitPolynomial + (base := base) (target := target) huniq a).map + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq ρ).toRingHom = + integralOrbitPolynomial + (base := base) (target := target) huniq a := by + classical + change + (∏ σ : Gal(L/K), (Polynomial.X - Polynomial.C + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a))).map + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq ρ).toRingHom = + ∏ σ : Gal(L/K), (Polynomial.X - Polynomial.C + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a)) + rw [Polynomial.map_prod] + simp only [Polynomial.map_sub, Polynomial.map_X, Polynomial.map_C] + refine Fintype.prod_equiv (Equiv.mulLeft ρ) + (fun σ : Gal(L/K) => + Polynomial.X - Polynomial.C + ((valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq ρ).toRingHom + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a))) + (fun σ : Gal(L/K) => + Polynomial.X - Polynomial.C + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a)) ?_ + intro σ + apply congrArg (fun z : target.valuationSubring => + Polynomial.X - Polynomial.C z) + exact + (congrFun + (RingEquiv.coe_toRingHom + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq ρ)) + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a)).trans + (valuationSubringAutOfUniqueExtension_mul_apply + (base := base) (target := target) huniq ρ σ a).symm + +/-- Every coefficient of the integral orbit polynomial descends to the base +valuation ring. -/ +theorem integralOrbitPolynomial_coeff_mem_range + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (a : target.valuationSubring) (n : ℕ) : + (integralOrbitPolynomial + (base := base) (target := target) huniq a).coeff n ∈ + Set.range (algebraMap base.valuationSubring target.valuationSubring) := by + let c : target.valuationSubring := + (integralOrbitPolynomial + (base := base) (target := target) huniq a).coeff n + have hfixed : ∀ σ : Gal(L/K), σ (c : L) = (c : L) := by + intro σ + have hmap := congrArg + (fun p : Polynomial target.valuationSubring => p.coeff n) + (integralOrbitPolynomial_map_valuationSubringAut + (base := base) (target := target) huniq a σ) + simpa [c] using congrArg Subtype.val hmap + obtain ⟨b, hb⟩ := + (IsGalois.mem_range_algebraMap_iff_fixed + (F := K) (E := L) (c : L)).2 hfixed + have hbmem : base.valuation b ≤ 1 := by + apply (_root_.Valuation.HasExtension.val_map_le_one_iff + (vR := base.valuation) (vA := target.valuation) b).1 + rw [hb] + exact c.property + let b0 : base.valuationSubring := ⟨b, hbmem⟩ + refine ⟨b0, ?_⟩ + apply Subtype.ext + exact hb + +/-- Every target integer is integral over the base valuation ring. The proof +uses its monic Galois-orbit polynomial and coefficient descent. -/ +theorem target_valuationSubring_element_isIntegral_of_uniqueExtension + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) + (a : target.valuationSubring) : + IsIntegral base.valuationSubring a := by + let p := integralOrbitPolynomial + (base := base) (target := target) huniq a + have hpmonic : p.Monic := + integralOrbitPolynomial_monic + (base := base) (target := target) huniq a + have hplifts : + p ∈ Polynomial.lifts + (algebraMap base.valuationSubring target.valuationSubring) := by + rw [Polynomial.lifts_iff_coeff_lifts] + intro n + exact integralOrbitPolynomial_coeff_mem_range + (base := base) (target := target) huniq a n + rcases Polynomial.lifts_and_natDegree_eq_and_monic hplifts hpmonic with + ⟨q, hqmap, _hqdeg, hqmonic⟩ + refine ⟨q, hqmonic, ?_⟩ + rw [Polynomial.eval₂_eq_eval_map, hqmap] + change + (integralOrbitPolynomial + (base := base) (target := target) huniq a).eval a = 0 + classical + change + (∏ σ : Gal(L/K), (Polynomial.X - Polynomial.C + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a))).eval a = 0 + rw [Polynomial.eval_prod] + apply Finset.prod_eq_zero (Finset.mem_univ (1 : Gal(L/K))) + simp + +/-- The target valuation ring is integral over the base valuation ring under +the standing unique-extension hypotheses of ramification-number theory. -/ +theorem target_valuationSubring_isIntegral_of_uniqueExtension + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) : + Algebra.IsIntegral base.valuationSubring target.valuationSubring := by + exact ⟨fun a => + target_valuationSubring_element_isIntegral_of_uniqueExtension + (base := base) (target := target) huniq a⟩ + +/-- Under the standing hypotheses, the target valuation ring is the actual +integral closure of the base valuation ring in `L`. -/ +theorem target_valuationSubring_isIntegralClosure_of_uniqueExtension + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) : + IsIntegralClosure target.valuationSubring base.valuationSubring L := by + let : Algebra.IsIntegral base.valuationSubring target.valuationSubring := + target_valuationSubring_isIntegral_of_uniqueExtension + (base := base) (target := target) huniq + exact valuationSubring_isIntegralClosure_of_isIntegral + (L := L) base.valuation target.valuation + +/-- The target valuation ring is finite over the base valuation ring. This +is the noncomplete replacement for the completeness-based finite-module input +formerly used by the ramification-number theory monogeneity proof. -/ +theorem target_valuationSubring_moduleFinite_of_uniqueExtension + (huniq : HasUniqueValuationExtension.{u, v, w, x, x} + base target) : + Module.Finite base.valuationSubring target.valuationSubring := by + let : IsNoetherianRing base.valuationSubring := + base.valuationSubring_isNoetherianRing + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_uniqueExtension + (base := base) (target := target) huniq + exact moduleFinite_valuationSubring_of_isIntegralClosure + (L := L) base.valuation target.valuation + +end Higher +end RamificationTheory.HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationKrasner.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationKrasner.lean new file mode 100644 index 0000000000..d6440519e1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationKrasner.lean @@ -0,0 +1,118 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationDepth +/-! +# A valuation-theoretic finite Galois form of Krasner's argument + +For a finite Galois extension with a uniquely extended discrete valuation, +suppose `b` is closer to an integral element `a` than any nontrivial +automorphic displacement of `a`. Then every automorphism fixing `b` also +fixes `a`. + +This is the stabilizer step in Krasner's lemma. Stating it directly for the +finite Galois overfield avoids introducing a second normed-field topology: +invariance of the normalized additive valuation and its ultrametric +inequality are sufficient. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w x + +namespace RamificationTheory.HilbertRamification +namespace Higher + +open ValuationTheory.DiscreteValuationField + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] +variable {base : DVF.{u, v} K} {target : DVF.{w, x} L} +variable [base.valuation.HasExtension target.valuation] + +/-- If `σ` fixes `b`, and `a-b` is strictly deeper than the displacement +`σ(a)-a` whenever that displacement is nonzero, then `σ` fixes `a`. + +The proof is the elementary Krasner contradiction + +`v(σ(a)-a) ≥ min(v(σ(a)-b), v(b-a)) = v(a-b)`. +-/ +theorem valuationSubringAutOfUniqueExtension_eq_of_fixed_of_close + (huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + base target) + (σ : Gal(L/K)) (a b : target.valuationSubring) + (hfix : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ b = b) + (hclose : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a ≠ a → + IsDiscreteValuationRing.addVal target.valuationSubring + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a - a) < + IsDiscreteValuationRing.addVal target.valuationSubring + (a - b)) : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a = a := by + by_contra hne + have hfirst : + IsDiscreteValuationRing.addVal target.valuationSubring + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a - b) = + IsDiscreteValuationRing.addVal target.valuationSubring + (a - b) := by + calc + IsDiscreteValuationRing.addVal target.valuationSubring + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a - b) = + IsDiscreteValuationRing.addVal target.valuationSubring + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ (a - b)) := by + apply congrArg + (IsDiscreteValuationRing.addVal + target.valuationSubring) + rw [map_sub, hfix] + _ = IsDiscreteValuationRing.addVal target.valuationSubring + (a - b) := + addVal_valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ (a - b) + have hsecond : + IsDiscreteValuationRing.addVal target.valuationSubring (b - a) = + IsDiscreteValuationRing.addVal target.valuationSubring (a - b) := by + have hneg : b - a = -(a - b) := by ring + rw [hneg, + (IsDiscreteValuationRing.addVal target.valuationSubring).map_neg] + have hultra := + IsDiscreteValuationRing.addVal_add + (R := target.valuationSubring) + (a := + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a - b) + (b := b - a) + have hle : + IsDiscreteValuationRing.addVal target.valuationSubring (a - b) ≤ + IsDiscreteValuationRing.addVal target.valuationSubring + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a - a) := by + have hsum : + (valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a - b) + + (b - a) = + valuationSubringAutOfUniqueExtension + (base := base) (target := target) huniq σ a - a := by + ring + simpa [hfirst, hsecond, hsum] using hultra + exact (not_le_of_gt (hclose hne)) hle + +end Higher +end RamificationTheory.HilbertRamification + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationRestriction.lean new file mode 100644 index 0000000000..796dad3aeb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationRestriction.lean @@ -0,0 +1,72 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationDepth +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions +/-! +# Compatibility of valuation-ring actions with Galois restriction + +For a normal field tower `M / L / K` with uniquely extended discrete +valuations, the valuation-ring action of an automorphism of `M / K` on an +element coming from `L` is the image of the valuation-ring action of its +restriction to `L / K`. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w x y z + +namespace RamificationTheory.HilbertRamification +namespace Higher + +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +variable {K : Type u} {L : Type w} {M : Type y} +variable [Field K] [Field L] [Field M] +variable [Algebra K L] [Algebra K M] [Algebra L M] +variable [IsScalarTower K L M] [Normal K L] +variable {base : DVF.{u, v} K} +variable {middle : DVF.{w, x} L} +variable {target : DVF.{y, z} M} +variable [base.valuation.HasExtension middle.valuation] +variable [middle.valuation.HasExtension target.valuation] +variable [base.valuation.HasExtension target.valuation] + +/-- Acting on an integral element from a normal intermediate field and then +viewing it in the top valuation ring agrees with first restricting the +Galois automorphism and acting in the intermediate valuation ring. -/ +theorem + valuationSubringAutOfUniqueExtension_integerMap_restrictNormal + (hmiddle : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + base middle) + (htarget : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + base target) + (σ : Gal(M/K)) (a : middle.valuationSubring) : + valuationSubringAutOfUniqueExtension + (base := base) (target := target) htarget σ + (integerMap middle target a) = + integerMap middle target + (valuationSubringAutOfUniqueExtension + (base := base) (target := middle) hmiddle + (σ.restrictNormal L) a) := by + apply Subtype.ext + change + σ (algebraMap L M (a : L)) = + algebraMap L M ((σ.restrictNormal L) (a : L)) + exact (AlgEquiv.restrictNormal_commutes σ L (a : L)).symm + +end Higher +end RamificationTheory.HilbertRamification + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationSubring.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationSubring.lean new file mode 100644 index 0000000000..a3506b5cf3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationSubring.lean @@ -0,0 +1,758 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Exact.Basic +public import Mathlib.Algebra.Group.Units.Equiv +public import Mathlib.Algebra.Group.Subgroup.Map +public import Mathlib.FieldTheory.Galois.Basic +public import Mathlib.GroupTheory.QuotientGroup.Basic +public import Mathlib.RingTheory.Valuation.RamificationGroup + +/-! # Valuation Subring -/ + +@[expose] public section +namespace RamificationTheory + +/-! +# Hilbert ramification theory: valuation-subring layer + +This file manages the ordinary valuation-subring decomposition/inertia exact +sequence. For an arbitrary valuation subring the residue action need not be +onto the full residue automorphism group; the canonical theorem is the exact +sequence with target equal to the range of the residue action. +-/ + +noncomputable +section + +universe u v + +namespace HilbertRamification +namespace ValuationSubring + +variable (K : Type u) {L : Type v} [Field K] [Field L] [Algebra K L] + +/-- finite Galois ramification theory: +the decomposition group of a valuation subring. -/ +abbrev decompositionGroup (A : _root_.ValuationSubring L) : + Subgroup (L ≃ₐ[K] L) := + A.decompositionSubgroup K + +/-- finite Galois ramification theory: +the inertia group of a valuation subring. -/ +abbrev inertiaGroup (A : _root_.ValuationSubring L) : + Subgroup (decompositionGroup K A) := + A.inertiaSubgroup K + +/-- The residue action of the decomposition group on the residue field. -/ +abbrev residueAction (A : _root_.ValuationSubring L) : + decompositionGroup K A →* + (IsLocalRing.ResidueField A ≃+* IsLocalRing.ResidueField A) := + MulSemiringAction.toRingAut + (A.decompositionSubgroup K) (IsLocalRing.ResidueField A) + +/-- The inertia group is the kernel of the residue action. -/ +theorem residueAction_ker (A : _root_.ValuationSubring L) : + MonoidHom.ker (residueAction K A) = inertiaGroup K A := by + rfl + +/-- Provides the instance `inertiaGroup_normal`. -/ +instance inertiaGroup_normal (A : _root_.ValuationSubring L) : + (inertiaGroup K A).Normal := by + rw [← residueAction_ker (K := K) A] + infer_instance + +/-- finite Galois ramification theory: +the unit quotient `σ x / x` attached to an automorphism in the decomposition +group. This is the expression used in the definition of the ramification +group. -/ +def automorphismUnitQuotient + (A : _root_.ValuationSubring L) (σ : decompositionGroup K A) (x : Lˣ) : + Lˣ := + Units.mapEquiv ((σ : L ≃ₐ[K] L).toMulEquiv) x / x + +/-- States the theorem `automorphismUnitQuotient_one`. -/ +@[simp] theorem automorphismUnitQuotient_one + (A : _root_.ValuationSubring L) (x : Lˣ) : + automorphismUnitQuotient K A 1 x = 1 := by + ext + simp [automorphismUnitQuotient] + +/-- States the theorem `automorphismUnitQuotient_mul`. -/ +theorem automorphismUnitQuotient_mul + (A : _root_.ValuationSubring L) (σ τ : decompositionGroup K A) (x : Lˣ) : + automorphismUnitQuotient K A (σ * τ) x = + automorphismUnitQuotient K A σ + (Units.mapEquiv ((τ : L ≃ₐ[K] L).toMulEquiv) x) * + automorphismUnitQuotient K A τ x := by + ext + simp [automorphismUnitQuotient, div_eq_mul_inv, mul_assoc] + +/-- The decomposition and inertia subgroup definitions: +the ramification group `R_w`, as the subgroup of inertia whose unit quotients +`σ x / x` are principal units for every `x : Lˣ`. -/ +def ramificationGroup (A : _root_.ValuationSubring L) : + Subgroup (inertiaGroup K A) where + carrier := + {σ | ∀ x : Lˣ, + automorphismUnitQuotient K A (σ : decompositionGroup K A) x ∈ + A.principalUnitGroup} + one_mem' := by + intro x + have hmap : Units.mapEquiv (AlgEquiv.toMulEquiv (1 : L ≃ₐ[K] L)) x = x := by + ext + rfl + simp [automorphismUnitQuotient, hmap] + mul_mem' := by + intro σ τ hσ hτ x + change + automorphismUnitQuotient K A ((σ * τ : inertiaGroup K A) : decompositionGroup K A) x ∈ + A.principalUnitGroup + have hx : + automorphismUnitQuotient K A (σ : decompositionGroup K A) + (Units.mapEquiv (((τ : decompositionGroup K A) : L ≃ₐ[K] L).toMulEquiv) x) * + automorphismUnitQuotient K A (τ : decompositionGroup K A) x ∈ + A.principalUnitGroup := + A.principalUnitGroup.mul_mem + (hσ (Units.mapEquiv (((τ : decompositionGroup K A) : L ≃ₐ[K] L).toMulEquiv) x)) + (hτ x) + simpa [automorphismUnitQuotient_mul] using hx + inv_mem' := by + intro σ hσ x + let y : Lˣ := + Units.mapEquiv + ((((σ : decompositionGroup K A)⁻¹ : decompositionGroup K A) : + L ≃ₐ[K] L).toMulEquiv) x + have hy : + automorphismUnitQuotient K A (σ : decompositionGroup K A) y ∈ + A.principalUnitGroup := + hσ y + have hyinv : + (automorphismUnitQuotient K A (σ : decompositionGroup K A) y)⁻¹ ∈ + A.principalUnitGroup := + A.principalUnitGroup.inv_mem hy + have hquot : + automorphismUnitQuotient K A + ((σ⁻¹ : inertiaGroup K A) : decompositionGroup K A) x = + (automorphismUnitQuotient K A (σ : decompositionGroup K A) y)⁻¹ := by + ext + simp [automorphismUnitQuotient, y, div_eq_mul_inv] + rw [hquot] + exact hyinv + +/-- States the theorem `mem_ramificationGroup_iff`. -/ +@[simp] theorem mem_ramificationGroup_iff + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) : + σ ∈ ramificationGroup K A ↔ + ∀ x : Lˣ, + automorphismUnitQuotient K A (σ : decompositionGroup K A) x ∈ + A.principalUnitGroup := + Iff.rfl + + +/-- finite Galois ramification theory: +the decomposition field `Z_w` is the fixed field of the decomposition group. -/ +abbrev decompositionField (A : _root_.ValuationSubring L) : + IntermediateField K L := + IntermediateField.fixedField (decompositionGroup K A) + +/-- States the theorem `mem_decompositionField_iff`. -/ +theorem mem_decompositionField_iff + (A : _root_.ValuationSubring L) (x : L) : + x ∈ decompositionField K A ↔ + ∀ σ ∈ decompositionGroup K A, σ x = x := by + exact IntermediateField.mem_fixedField_iff + (H := decompositionGroup K A) x + +/-- The inertia group as a subgroup of the full `K`-automorphism group of `L`. +This is the subgroup whose fixed field is the classical inertia field. -/ +abbrev inertiaGroupInAut (A : _root_.ValuationSubring L) : + Subgroup (L ≃ₐ[K] L) := + Subgroup.map (decompositionGroup K A).subtype (inertiaGroup K A) + +/-- The canonical inclusion `I_w -> G(L/K)`. -/ +def inertiaGroupToAut (A : _root_.ValuationSubring L) : + inertiaGroup K A →* (L ≃ₐ[K] L) := + (decompositionGroup K A).subtype.comp (inertiaGroup K A).subtype + +/-- States the theorem `inertiaGroupToAut_apply`. -/ +@[simp] theorem inertiaGroupToAut_apply + (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) : + inertiaGroupToAut (K := K) A σ = + ((σ : decompositionGroup K A) : L ≃ₐ[K] L) := + rfl + +/-- The inertia-field definition: +the inertia field `T_w` is the fixed field of the inertia group. -/ +abbrev inertiaField (A : _root_.ValuationSubring L) : + IntermediateField K L := + IntermediateField.fixedField (inertiaGroupInAut K A) + +/-- States the theorem `mem_inertiaField_iff`. -/ +theorem mem_inertiaField_iff + (A : _root_.ValuationSubring L) (x : L) : + x ∈ inertiaField K A ↔ + ∀ σ : inertiaGroup K A, ((σ : decompositionGroup K A) : L ≃ₐ[K] L) x = x := by + rw [inertiaField, IntermediateField.mem_fixedField_iff] + constructor + · intro h σ + exact h ((σ : decompositionGroup K A) : L ≃ₐ[K] L) + ⟨(σ : decompositionGroup K A), σ.property, rfl⟩ + · intro h σ hσ + rcases hσ with ⟨τ, hτ, rfl⟩ + exact h ⟨τ, hτ⟩ + +/-- The inertia subgroup, viewed inside the full automorphism group, lies in +the decomposition group. -/ +theorem inertiaGroupInAut_le_decompositionGroup + (A : _root_.ValuationSubring L) : + inertiaGroupInAut K A ≤ decompositionGroup K A := by + rintro σ ⟨τ, _hτ, rfl⟩ + exact τ.property + +/-- The ramification group as a subgroup of the full automorphism group. -/ +abbrev ramificationGroupInAut (A : _root_.ValuationSubring L) : + Subgroup (L ≃ₐ[K] L) := + Subgroup.map (inertiaGroupToAut (K := K) A) (ramificationGroup K A) + +/-- The ramification-field definition: +the ramification field `V_w` is the fixed field of the ramification group. -/ +abbrev ramificationField (A : _root_.ValuationSubring L) : + IntermediateField K L := + IntermediateField.fixedField (ramificationGroupInAut K A) + +/-- States the theorem `mem_ramificationField_iff`. -/ +theorem mem_ramificationField_iff + (A : _root_.ValuationSubring L) (x : L) : + x ∈ ramificationField K A ↔ + ∀ σ : ramificationGroup K A, + (((σ : inertiaGroup K A) : decompositionGroup K A) : L ≃ₐ[K] L) x = x := by + rw [ramificationField, IntermediateField.mem_fixedField_iff] + constructor + · intro h σ + exact h (inertiaGroupToAut (K := K) A (σ : inertiaGroup K A)) + ⟨(σ : inertiaGroup K A), σ.property, rfl⟩ + · intro h σ hσ + rcases hσ with ⟨τ, hτ, rfl⟩ + exact h ⟨τ, hτ⟩ + +/-- The ramification subgroup, viewed in `G(L/K)`, lies in inertia. -/ +theorem ramificationGroupInAut_le_inertiaGroupInAut + (A : _root_.ValuationSubring L) : + ramificationGroupInAut K A ≤ inertiaGroupInAut K A := by + rintro σ ⟨τ, _hτ, rfl⟩ + exact ⟨(τ : decompositionGroup K A), τ.property, rfl⟩ + +/-- finite Galois ramification theory: +the inertia field is contained in the ramification field. -/ +theorem inertiaField_le_ramificationField + (A : _root_.ValuationSubring L) : + inertiaField K A ≤ ramificationField K A := + IntermediateField.fixedField_le + (ramificationGroupInAut_le_inertiaGroupInAut (K := K) A) + +/-- The ramification-field definition source: +the ramification field, viewed as an intermediate field over the inertia field +`T_w`. -/ +abbrev ramificationFieldOverInertiaField + (A : _root_.ValuationSubring L) : + IntermediateField (inertiaField K A) L := + IntermediateField.extendScalars + (inertiaField_le_ramificationField (K := K) A) + +/-- States the theorem `ramificationFieldOverInertiaField_restrictScalars`. -/ +@[simp] theorem ramificationFieldOverInertiaField_restrictScalars + (A : _root_.ValuationSubring L) : + (ramificationFieldOverInertiaField K A).restrictScalars K = + ramificationField K A := + rfl + +/-- The ramification group is canonically equivalent to its image in +`G(L/K)`. -/ +def ramificationGroupEquivInAut + (A : _root_.ValuationSubring L) : + ramificationGroup K A ≃* ramificationGroupInAut K A := + (ramificationGroup K A).equivMapOfInjective + (inertiaGroupToAut (K := K) A) + (by + intro σ τ h + apply Subtype.ext + apply Subtype.ext + simpa [inertiaGroupToAut] using h) + +/-- The ramification-field definition source: +`G(L/V_w) = R_w` after viewing ramification inside the full automorphism +group. -/ +theorem ramificationField_fixingSubgroup_eq_of_finiteDimensional + [FiniteDimensional K L] (A : _root_.ValuationSubring L) : + (ramificationField K A).fixingSubgroup = ramificationGroupInAut K A := + IntermediateField.fixingSubgroup_fixedField (ramificationGroupInAut K A) + +/-- The ramification-field definition source: +the ramification group is the Galois group over its fixed field. -/ +def ramificationGroupEquivGalRamificationFieldOfFiniteDimensional + [FiniteDimensional K L] (A : _root_.ValuationSubring L) : + ramificationGroup K A ≃* (L ≃ₐ[ramificationField K A] L) := + (ramificationGroupEquivInAut (K := K) A).trans + (IntermediateField.subgroupEquivAlgEquiv (ramificationGroupInAut K A)) + +/-- finite Galois ramification theory: +the decomposition field is contained in the inertia field. -/ +theorem decompositionField_le_inertiaField + (A : _root_.ValuationSubring L) : + decompositionField K A ≤ inertiaField K A := + IntermediateField.fixedField_le + (inertiaGroupInAut_le_decompositionGroup (K := K) A) + +/-- finite Galois ramification theory: +the decomposition field is contained in the ramification field. -/ +theorem decompositionField_le_ramificationField + (A : _root_.ValuationSubring L) : + decompositionField K A ≤ ramificationField K A := + (decompositionField_le_inertiaField (K := K) A).trans + (inertiaField_le_ramificationField (K := K) A) + +/-- The ramification-field definition source: +the ramification field, viewed as an intermediate field over the decomposition +field `Z_w`. This is the field appearing in `V_w | Z_w`. -/ +abbrev ramificationFieldOverDecompositionField + (A : _root_.ValuationSubring L) : + IntermediateField (decompositionField K A) L := + IntermediateField.extendScalars + (decompositionField_le_ramificationField (K := K) A) + +/-- States the theorem `ramificationFieldOverDecompositionField_restrictScalars`. -/ +@[simp] theorem ramificationFieldOverDecompositionField_restrictScalars + (A : _root_.ValuationSubring L) : + (ramificationFieldOverDecompositionField K A).restrictScalars K = + ramificationField K A := + rfl + +/-- The inertia-field definition source: +the inertia field, viewed as an intermediate field over the decomposition +field `Z_w`. This is the field appearing in `G(T_w/Z_w)`. -/ +abbrev inertiaFieldOverDecompositionField + (A : _root_.ValuationSubring L) : + IntermediateField (decompositionField K A) L := + IntermediateField.extendScalars + (decompositionField_le_inertiaField (K := K) A) + +/-- States the theorem `mem_inertiaFieldOverDecompositionField_iff`. -/ +theorem mem_inertiaFieldOverDecompositionField_iff + (A : _root_.ValuationSubring L) (x : L) : + x ∈ inertiaFieldOverDecompositionField K A ↔ + ∀ σ : inertiaGroup K A, ((σ : decompositionGroup K A) : L ≃ₐ[K] L) x = x := by + rw [inertiaFieldOverDecompositionField, IntermediateField.mem_extendScalars, + mem_inertiaField_iff] + +/-- States the theorem `inertiaFieldOverDecompositionField_restrictScalars`. -/ +@[simp] theorem inertiaFieldOverDecompositionField_restrictScalars + (A : _root_.ValuationSubring L) : + (inertiaFieldOverDecompositionField K A).restrictScalars K = + inertiaField K A := + rfl + +/-- The fixed-field description of decomposition source: +`G(L/Z_w) = G_w` for the decomposition field. -/ +theorem decompositionField_fixingSubgroup_eq_of_finiteDimensional + [FiniteDimensional K L] (A : _root_.ValuationSubring L) : + (decompositionField K A).fixingSubgroup = decompositionGroup K A := + IntermediateField.fixingSubgroup_fixedField (decompositionGroup K A) + +/-- The fixed-field description of decomposition source: +the decomposition group is the Galois group over its fixed field. -/ +def decompositionGroupEquivGalDecompositionFieldOfFiniteDimensional + [FiniteDimensional K L] (A : _root_.ValuationSubring L) : + decompositionGroup K A ≃* (L ≃ₐ[decompositionField K A] L) := + IntermediateField.subgroupEquivAlgEquiv (decompositionGroup K A) + +/-- The fixed-field description of decomposition source: +`L/Z_w` is Galois because `Z_w` is the fixed field of the finite +decomposition group action. -/ +instance decompositionField_isGalois + [FiniteDimensional K L] (A : _root_.ValuationSubring L) : + IsGalois (decompositionField K A) L := + IsGalois.of_fixed_field L (decompositionGroup K A) + +/-- +States the theorem `decompositionGroupEquivGalDecompositionField_of_finiteDimensional_apply`. +-/ +@[simp] theorem decompositionGroupEquivGalDecompositionField_of_finiteDimensional_apply + [FiniteDimensional K L] (A : _root_.ValuationSubring L) + (σ : decompositionGroup K A) (x : L) : + decompositionGroupEquivGalDecompositionFieldOfFiniteDimensional (K := K) A σ x = + ((σ : L ≃ₐ[K] L) x) := + rfl + +/-- The inertia-field definition source: +the inertia subgroup transported to `Gal(L/Z_w)` through +`G_w = G(L/Z_w)`. -/ +abbrev inertiaGroupOverDecompositionField + [FiniteDimensional K L] (A : _root_.ValuationSubring L) : + Subgroup (L ≃ₐ[decompositionField K A] L) := + Subgroup.map + (decompositionGroupEquivGalDecompositionFieldOfFiniteDimensional + (K := K) A).toMonoidHom + (inertiaGroup K A) + +/-- States the theorem `mem_inertiaGroupOverDecompositionField_iff`. -/ +theorem mem_inertiaGroupOverDecompositionField_iff + [FiniteDimensional K L] (A : _root_.ValuationSubring L) + (σ : L ≃ₐ[decompositionField K A] L) : + σ ∈ inertiaGroupOverDecompositionField (K := K) A ↔ + ∃ τ : inertiaGroup K A, + decompositionGroupEquivGalDecompositionFieldOfFiniteDimensional + (K := K) A (τ : decompositionGroup K A) = σ := by + constructor + · rintro ⟨τ, hτ, rfl⟩ + exact ⟨⟨τ, hτ⟩, rfl⟩ + · rintro ⟨τ, rfl⟩ + exact ⟨(τ : decompositionGroup K A), τ.property, rfl⟩ + +/-- The transported inertia subgroup is normal in `Gal(L/Z_w)`. -/ +instance inertiaGroupOverDecompositionField_normal + [FiniteDimensional K L] (A : _root_.ValuationSubring L) : + (inertiaGroupOverDecompositionField (K := K) A).Normal := by + let e := + decompositionGroupEquivGalDecompositionFieldOfFiniteDimensional + (K := K) A + simpa [inertiaGroupOverDecompositionField, e] using + (Subgroup.Normal.map (inertiaGroup_normal (K := K) A) + e.toMonoidHom e.surjective) + +/-- The inertia-field definition source: +the fixed field of the transported inertia subgroup over `Z_w` is `T_w`. -/ +theorem inertiaFieldOverDecompositionField_fixedField_eq_of_finiteDimensional + [FiniteDimensional K L] (A : _root_.ValuationSubring L) : + IntermediateField.fixedField + (inertiaGroupOverDecompositionField (K := K) A) = + inertiaFieldOverDecompositionField K A := by + ext x + rw [IntermediateField.mem_fixedField_iff, + mem_inertiaFieldOverDecompositionField_iff] + constructor + · intro hx τ + have hτ : + decompositionGroupEquivGalDecompositionFieldOfFiniteDimensional + (K := K) A (τ : decompositionGroup K A) ∈ + inertiaGroupOverDecompositionField (K := K) A := by + exact ⟨(τ : decompositionGroup K A), τ.property, rfl⟩ + simpa using hx + (decompositionGroupEquivGalDecompositionFieldOfFiniteDimensional + (K := K) A (τ : decompositionGroup K A)) hτ + · intro hx σ hσ + rcases + (mem_inertiaGroupOverDecompositionField_iff (K := K) A σ).mp hσ with + ⟨τ, rfl⟩ + simpa using hx τ + +/-- The inertia-field definition source: +`G(L/T_w)` over the decomposition field is the transported inertia subgroup. +-/ +theorem inertiaFieldOverDecompositionField_fixingSubgroup_eq_of_finiteDimensional + [FiniteDimensional K L] (A : _root_.ValuationSubring L) : + (inertiaFieldOverDecompositionField K A).fixingSubgroup = + inertiaGroupOverDecompositionField (K := K) A := by + rw [← inertiaFieldOverDecompositionField_fixedField_eq_of_finiteDimensional + (K := K) A] + exact + IntermediateField.fixingSubgroup_fixedField + (inertiaGroupOverDecompositionField (K := K) A) + +/-- The inertia-field definition source: +the transported inertia group is the Galois group `G(L/T_w)` in the tower +`Z_w ⊆ T_w ⊆ L`. -/ +def +inertiaGroupOverDecompositionFieldEquivGalInertiaFieldOverDecompositionFieldOfFiniteDimensional + [FiniteDimensional K L] (A : _root_.ValuationSubring L) : + inertiaGroupOverDecompositionField (K := K) A ≃* + (L ≃ₐ[inertiaFieldOverDecompositionField K A] L) := + (MulEquiv.subgroupCongr + (inertiaFieldOverDecompositionField_fixingSubgroup_eq_of_finiteDimensional + (K := K) A).symm).trans + (IntermediateField.fixingSubgroupEquiv + (inertiaFieldOverDecompositionField K A)) + +/-- The inertia-field definition: +the Galois correspondence gives +`G(L/Z_w)/I_w ≃ G(T_w/Z_w)`. -/ +def decompositionQuotientInertiaEquivGalInertiaFieldOverDecompositionOfFiniteDimensional + [FiniteDimensional K L] (A : _root_.ValuationSubring L) : + (L ≃ₐ[decompositionField K A] L) ⧸ + inertiaGroupOverDecompositionField (K := K) A ≃* + (inertiaFieldOverDecompositionField K A ≃ₐ[decompositionField K A] + inertiaFieldOverDecompositionField K A) := by + rw [← inertiaFieldOverDecompositionField_fixedField_eq_of_finiteDimensional + (K := K) A] + exact + IsGalois.normalAutEquivQuotient + (inertiaGroupOverDecompositionField (K := K) A) + +/-- The inertia-field definition source: +transport the quotient `G_w/I_w` along `G_w = G(L/Z_w)`. -/ +def decompositionGroupQuotientInertiaEquivGalDecompositionQuotientOfFiniteDimensional + [FiniteDimensional K L] (A : _root_.ValuationSubring L) : + decompositionGroup K A ⧸ inertiaGroup K A ≃* + (L ≃ₐ[decompositionField K A] L) ⧸ + inertiaGroupOverDecompositionField (K := K) A := + QuotientGroup.congr + (inertiaGroup K A) + (inertiaGroupOverDecompositionField (K := K) A) + (decompositionGroupEquivGalDecompositionFieldOfFiniteDimensional + (K := K) A) + rfl + +/-- The inertia-field definition: +`G_w/I_w ≃ G(T_w/Z_w)`, the group-theoretic part of the isomorphism +obtained from the residue-action exact sequence. -/ +def decompositionGroupQuotientInertiaEquivGalInertiaFieldOverDecompositionOfFiniteDimensional + [FiniteDimensional K L] (A : _root_.ValuationSubring L) : + decompositionGroup K A ⧸ inertiaGroup K A ≃* + (inertiaFieldOverDecompositionField K A ≃ₐ[decompositionField K A] + inertiaFieldOverDecompositionField K A) := + (decompositionGroupQuotientInertiaEquivGalDecompositionQuotientOfFiniteDimensional + (K := K) A).trans + (decompositionQuotientInertiaEquivGalInertiaFieldOverDecompositionOfFiniteDimensional + (K := K) A) + +/-- The inertia-field definition source: +`G(L/T_w) = I_w` after viewing inertia inside the full automorphism group. -/ +theorem inertiaField_fixingSubgroup_eq_of_finiteDimensional + [FiniteDimensional K L] (A : _root_.ValuationSubring L) : + (inertiaField K A).fixingSubgroup = inertiaGroupInAut K A := + IntermediateField.fixingSubgroup_fixedField (inertiaGroupInAut K A) + +/-- The inertia-field definition source: +the inertia group is the Galois group over its fixed field. -/ +def inertiaGroupInAutEquivGalInertiaFieldOfFiniteDimensional + [FiniteDimensional K L] (A : _root_.ValuationSubring L) : + inertiaGroupInAut K A ≃* (L ≃ₐ[inertiaField K A] L) := + IntermediateField.subgroupEquivAlgEquiv (inertiaGroupInAut K A) + + +section IntermediateFieldFunctoriality + +variable {M : Type*} [Field M] [Algebra K M] [Algebra M L] + [IsScalarTower K M L] + +/-- Restrict scalars on automorphisms along an intermediate field +`K ⊆ M ⊆ L`. This is the inclusion `G(L/M) -> G(L/K)` used in +scalar-restriction compatibility of ramification subgroups. -/ +def restrictAutomorphismScalars : (L ≃ₐ[M] L) →* (L ≃ₐ[K] L) where + toFun σ := + { σ with + commutes' := by + intro a + simp [IsScalarTower.algebraMap_eq K M L, σ.commutes (algebraMap K M a)] } + map_one' := by + ext x + rfl + map_mul' σ τ := by + ext x + rfl + +/-- scalar-restriction compatibility of ramification subgroups, decomposition-group membership form: +an `M`-automorphism stabilizes `A` exactly when the same automorphism, viewed +over `K`, stabilizes `A`. -/ +theorem mem_decompositionGroup_restrictScalars_iff + (A : _root_.ValuationSubring L) (σ : L ≃ₐ[M] L) : + restrictAutomorphismScalars (K := K) (M := M) σ ∈ decompositionGroup K A ↔ + σ ∈ decompositionGroup M A := by + rfl + +/-- scalar-restriction compatibility of ramification subgroups: +`G_w(L/M)` maps onto `G_w(L/K) ∩ G(L/M)` under the scalar-restriction +inclusion. -/ +theorem decompositionGroup_range_eq_inf + (A : _root_.ValuationSubring L) : + Subgroup.map (restrictAutomorphismScalars (K := K) (M := M)) + (decompositionGroup M A) = + decompositionGroup K A ⊓ + (restrictAutomorphismScalars (K := K) (M := M)).range := by + ext σ + constructor + · rintro ⟨τ, hτ, rfl⟩ + exact + ⟨(mem_decompositionGroup_restrictScalars_iff + (K := K) (M := M) A τ).mpr hτ, + ⟨τ, rfl⟩⟩ + · rintro ⟨hσ, τ, rfl⟩ + exact + ⟨τ, + (mem_decompositionGroup_restrictScalars_iff + (K := K) (M := M) A τ).mp hσ, + rfl⟩ + +/-- Scalar restriction on decomposition groups along an intermediate field. -/ +def decompositionGroupRestrictScalars + (A : _root_.ValuationSubring L) : + decompositionGroup M A →* decompositionGroup K A where + toFun σ := + ⟨restrictAutomorphismScalars (K := K) (M := M) σ, + (mem_decompositionGroup_restrictScalars_iff + (K := K) (M := M) A σ).mpr σ.property⟩ + map_one' := by + ext x + rfl + map_mul' σ τ := by + ext x + rfl + +/-- scalar-restriction compatibility of ramification subgroups, inertia-group membership form: +the residue action is unchanged by scalar restriction from `M` to `K`. -/ +theorem mem_inertiaGroup_restrictScalars_iff + (A : _root_.ValuationSubring L) (σ : decompositionGroup M A) : + decompositionGroupRestrictScalars (K := K) (M := M) A σ ∈ inertiaGroup K A ↔ + σ ∈ inertiaGroup M A := by + rfl + +/-- scalar-restriction compatibility of ramification subgroups: +`I_w(L/M)` maps onto `I_w(L/K) ∩ G_w(L/M)` inside the decomposition group. -/ +theorem inertiaGroup_range_eq_inf + (A : _root_.ValuationSubring L) : + Subgroup.map (decompositionGroupRestrictScalars (K := K) (M := M) A) + (inertiaGroup M A) = + inertiaGroup K A ⊓ + (decompositionGroupRestrictScalars (K := K) (M := M) A).range := by + ext σ + constructor + · rintro ⟨τ, hτ, rfl⟩ + exact + ⟨(mem_inertiaGroup_restrictScalars_iff + (K := K) (M := M) A τ).mpr hτ, + ⟨τ, rfl⟩⟩ + · rintro ⟨hσ, τ, rfl⟩ + exact + ⟨τ, + (mem_inertiaGroup_restrictScalars_iff + (K := K) (M := M) A τ).mp hσ, + rfl⟩ + +/-- Scalar restriction on inertia groups along an intermediate field. -/ +def inertiaGroupRestrictScalars + (A : _root_.ValuationSubring L) : + inertiaGroup M A →* inertiaGroup K A where + toFun σ := + ⟨decompositionGroupRestrictScalars (K := K) (M := M) A + (σ : decompositionGroup M A), + (mem_inertiaGroup_restrictScalars_iff + (K := K) (M := M) A (σ : decompositionGroup M A)).mpr σ.property⟩ + map_one' := by + ext x + rfl + map_mul' σ τ := by + ext x + rfl + +/-- scalar-restriction compatibility of ramification subgroups, ramification-group membership form: +the condition defining `R_w` is unchanged by scalar restriction from `M` to +`K`. -/ +theorem mem_ramificationGroup_restrictScalars_iff + (A : _root_.ValuationSubring L) (σ : inertiaGroup M A) : + inertiaGroupRestrictScalars (K := K) (M := M) A σ ∈ ramificationGroup K A ↔ + σ ∈ ramificationGroup M A := by + constructor + · intro h + rw [mem_ramificationGroup_iff] at h + rw [mem_ramificationGroup_iff] + intro x + let τK : L ≃ₐ[K] L := + inertiaGroupRestrictScalars (K := K) (M := M) A σ + let τM : L ≃ₐ[M] L := σ + have hτ : τK.toMulEquiv = τM.toMulEquiv := by + ext y + rfl + have hx := h x + change Units.mapEquiv τK.toMulEquiv x / x ∈ A.principalUnitGroup at hx + change Units.mapEquiv τM.toMulEquiv x / x ∈ A.principalUnitGroup + rwa [hτ] at hx + · intro h + rw [mem_ramificationGroup_iff] at h + rw [mem_ramificationGroup_iff] + intro x + let τK : L ≃ₐ[K] L := + inertiaGroupRestrictScalars (K := K) (M := M) A σ + let τM : L ≃ₐ[M] L := σ + have hτ : τK.toMulEquiv = τM.toMulEquiv := by + ext y + rfl + have hx := h x + change Units.mapEquiv τM.toMulEquiv x / x ∈ A.principalUnitGroup at hx + change Units.mapEquiv τK.toMulEquiv x / x ∈ A.principalUnitGroup + rwa [hτ] + +/-- scalar-restriction compatibility of ramification subgroups: +`R_w(L/M)` maps onto `R_w(L/K) ∩ I_w(L/M)` under scalar restriction. Since +`R_w ≤ I_w`, this is the ramification-group part of the classical intersection +formula. -/ +theorem ramificationGroup_range_eq_inf + (A : _root_.ValuationSubring L) : + Subgroup.map (inertiaGroupRestrictScalars (K := K) (M := M) A) + (ramificationGroup M A) = + ramificationGroup K A ⊓ + (inertiaGroupRestrictScalars (K := K) (M := M) A).range := by + ext σ + constructor + · rintro ⟨τ, hτ, rfl⟩ + exact + ⟨(mem_ramificationGroup_restrictScalars_iff + (K := K) (M := M) A τ).mpr hτ, + ⟨τ, rfl⟩⟩ + · rintro ⟨hσ, τ, rfl⟩ + exact + ⟨τ, + (mem_ramificationGroup_restrictScalars_iff + (K := K) (M := M) A τ).mp hσ, + rfl⟩ + +end IntermediateFieldFunctoriality + +/-- The residue-action exact sequence, exact-at-decomposition form: +`I -> D -> Aut(k_A)` is exact for every valuation subring. -/ +theorem inertia_subtype_mulExact_residueAction + (A : _root_.ValuationSubring L) : + Function.MulExact (inertiaGroup K A).subtype (residueAction K A) := by + rw [MonoidHom.mulExact_iff, residueAction_ker] + exact (Subgroup.range_subtype _).symm + +/-- The ordinary valuation-subring first-isomorphism form: +`D/I` is the range of the residue action. -/ +def quotientInertiaEquivResidueActionRange + (A : _root_.ValuationSubring L) : + decompositionGroup K A ⧸ inertiaGroup K A ≃* + (residueAction K A).range := + (QuotientGroup.quotientMulEquivOfEq + (residueAction_ker K A).symm).trans + (QuotientGroup.quotientKerEquivRange (residueAction K A)) + +/-- States the theorem `quotientInertiaEquivResidueActionRange_mk`. -/ +theorem quotientInertiaEquivResidueActionRange_mk + (A : _root_.ValuationSubring L) (σ : decompositionGroup K A) : + quotientInertiaEquivResidueActionRange (K := K) A + (QuotientGroup.mk' (inertiaGroup K A) σ) = + (residueAction K A).rangeRestrict σ := + rfl + +/-- The inertia-field definition / the residue-action exact sequence source: +without surjectivity onto the whole residue automorphism group, the canonical +residue-field comparison is +`G(T_w/Z_w) ≃ range(G_w -> Aut(lambda))`. -/ +def galInertiaFieldOverDecompositionEquivResidueActionRangeOfFiniteDimensional + [FiniteDimensional K L] (A : _root_.ValuationSubring L) : + (inertiaFieldOverDecompositionField K A ≃ₐ[decompositionField K A] + inertiaFieldOverDecompositionField K A) ≃* + (residueAction K A).range := + (decompositionGroupQuotientInertiaEquivGalInertiaFieldOverDecompositionOfFiniteDimensional + (K := K) A).symm.trans + (quotientInertiaEquivResidueActionRange (K := K) A) + +end ValuationSubring +end HilbertRamification + +end +end RamificationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/InertiaCardinality.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/InertiaCardinality.lean new file mode 100644 index 0000000000..b8121c0f6f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/InertiaCardinality.lean @@ -0,0 +1,69 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Group.Subgroup.Finite +public import Mathlib.Algebra.Group.Subgroup.Lattice +public import Mathlib.SetTheory.Cardinal.NatCard +/-! +# The finite-group count in the global cyclotomic inertia argument + +The global Kronecker--Weber proof generates the full Galois group by the +inertia groups at the finitely many ramified primes. Since the group is +abelian, the cardinality of the subgroup that they generate is at most the +product of their cardinalities. This file isolates that elementary count +from the arithmetic part of the proof. +-/ + +@[expose] public section + +noncomputable +section + +namespace RamificationTheory + +open scoped BigOperators + +variable {G ι : Type*} [CommGroup G] [Finite G] + +/-- In a finite abelian group, the supremum of two subgroups has cardinality +at most the product of their cardinalities. -/ +theorem natCard_sup_le_mul_natCard (H J : Subgroup G) : + Nat.card ↥(H ⊔ J : Subgroup G) ≤ Nat.card H * Nat.card J := by + let : Finite H := Finite.of_injective (fun x : H ↦ (x : G)) + (fun _ _ h ↦ Subtype.ext h) + let : Finite J := Finite.of_injective (fun x : J ↦ (x : G)) + (fun _ _ h ↦ Subtype.ext h) + let : Fintype H := Fintype.ofFinite H + let : Fintype J := Fintype.ofFinite J + let f : H × J → ↥(H ⊔ J : Subgroup G) := fun x ↦ + ⟨x.1.1 * x.2.1, (H ⊔ J).mul_mem (show x.1.1 ∈ H ⊔ J from + (show H ≤ H ⊔ J from le_sup_left) x.1.2) + (show x.2.1 ∈ H ⊔ J from + (show J ≤ H ⊔ J from le_sup_right) x.2.2)⟩ + have hf : Function.Surjective f := by + rintro ⟨x, hx⟩ + rcases Subgroup.mem_sup.mp hx with ⟨h, hh, j, hj, rfl⟩ + exact ⟨(⟨h, hh⟩, ⟨j, hj⟩), rfl⟩ + simpa [Nat.card_prod] using Nat.card_le_card_of_surjective f hf + +/-- Finite-family form of the inertia-group cardinality bound used in the +proof of the global cyclotomic inertia argument. -/ +theorem natCard_finsetSup_le_prod_natCard + (s : Finset ι) (I : ι → Subgroup G) : + Nat.card ↥(s.sup I : Subgroup G) ≤ ∏ i ∈ s, Nat.card (I i) := by + classical + induction s using Finset.induction_on with + | empty => simp + | @insert a s ha ih => + rw [Finset.sup_insert, Finset.prod_insert ha] + exact (natCard_sup_le_mul_natCard (I a) (s.sup I)).trans + (Nat.mul_le_mul_left _ ih) + +end RamificationTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField.lean new file mode 100644 index 0000000000..4b55b3b380 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.FirstRamificationComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.InertiaCard +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/BaseChange.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/BaseChange.lean new file mode 100644 index 0000000000..0c3b23eed8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/BaseChange.lean @@ -0,0 +1,275 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +/-! +# Transport of upper ramification groups under an equivalent base field + +The target field can carry two algebra structures whose base fields are +identified by a valuation-preserving field equivalence. This file proves +that the resulting Galois groups have the same upper filtration, after +identifying their automorphisms by their common action on the target. +-/ + +@[expose] public section + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction_eq_of_card_lower_eq → + herbrandFunction_eq_of_card_lower_eq + + +noncomputable +section + +namespace RamificationTheory.LocalField + +open LocalFieldTheory +open RamificationTheory.HilbertRamification +open RamificationTheory.HilbertRamification.Higher +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension +open scoped ValuativeRel + +/-- If two base fields have the same image in a common extension, their +Galois groups are identified by leaving the underlying target automorphism +unchanged. -/ +noncomputable def galoisGroupEquivOfBaseRingEquiv + (B K E : Type) + [Field B] [Field K] [Field E] + [Algebra B E] [Algebra K E] + (e : B ≃+* K) + (he : ∀ b, algebraMap K E (e b) = algebraMap B E b) : + Gal(E/B) ≃* Gal(E/K) where + toFun σ := + { σ.toRingEquiv with + commutes' := by + intro k + rw [← e.apply_symm_apply k, he] + exact σ.commutes (e.symm k) } + invFun τ := + { τ.toRingEquiv with + commutes' := by + intro b + rw [← he b] + exact τ.commutes (e b) } + left_inv σ := by + ext x + rfl + right_inv τ := by + ext x + rfl + map_mul' σ τ := by + ext x + rfl + +@[simp] +theorem galoisGroupEquivOfBaseRingEquiv_apply + (B K E : Type) + [Field B] [Field K] [Field E] + [Algebra B E] [Algebra K E] + (e : B ≃+* K) + (he : ∀ b, algebraMap K E (e b) = algebraMap B E b) + (σ : Gal(E/B)) (x : E) : + galoisGroupEquivOfBaseRingEquiv B K E e he σ x = σ x := + rfl + +private theorem upperRamificationGroup_map_baseChange + (B K E : Type) + [Field B] [Field K] [Field E] + [Algebra B E] [Algebra K E] + [FiniteDimensional B E] [FiniteDimensional K E] + (baseB : DVF.{0, 0} B) + (baseK : DVF.{0, 0} K) + (target : DVF.{0, 0} E) + [baseB.valuation.HasExtension target.valuation] + [baseK.valuation.HasExtension target.valuation] + (huniqB : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + (base := baseB) (target := target)) + (huniqK : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + (base := baseK) (target := target)) + (q : Gal(E/B) ≃* Gal(E/K)) + (hq : ∀ σ x, q σ x = σ x) + (t : ℝ) : + Subgroup.map q.toMonoidHom + (upperRamificationGroupOfUniqueExtension + (base := baseB) (target := target) huniqB t) = + upperRamificationGroupOfUniqueExtension + (base := baseK) (target := target) huniqK t := by + have hdisplacement + (σ : Gal(E/B)) (a : target.valuationSubring) : + valuationSubringAutOfUniqueExtension + (base := baseK) (target := target) + huniqK (q σ) a - a = + valuationSubringAutOfUniqueExtension + (base := baseB) (target := target) + huniqB σ a - a := by + apply Subtype.ext + change q σ (a : E) - (a : E) = σ (a : E) - (a : E) + rw [hq σ (a : E)] + have hmem (s : ℝ) (σ : Gal(E/B)) : + σ ∈ lowerRamificationGroup + (base := baseB) (target := target) huniqB s ↔ + q σ ∈ lowerRamificationGroup + (base := baseK) (target := target) huniqK s := by + constructor + · intro hσ a + rw [hdisplacement] + exact hσ a + · intro hσ a + rw [← hdisplacement] + exact hσ a + have hlower (s : ℝ) : + Subgroup.map q.toMonoidHom + (lowerRamificationGroup + (base := baseB) (target := target) huniqB s) = + lowerRamificationGroup + (base := baseK) (target := target) huniqK s := by + ext τ + constructor + · rintro ⟨σ, hσ, rfl⟩ + exact (hmem s σ).1 hσ + · intro hτ + refine ⟨q.symm τ, (hmem s (q.symm τ)).2 ?_, by simp⟩ + simpa using hτ + have hcard (n : ℕ) : + Nat.card + ((lowerRamificationFiltrationOfUniqueExtension + (base := baseB) (target := target) huniqB).lower n) = + Nat.card + ((lowerRamificationFiltrationOfUniqueExtension + (base := baseK) (target := target) huniqK).lower n) := by + let H := + lowerRamificationGroup + (base := baseB) (target := target) huniqB (n : ℝ) + let qH := + (q.subgroupMap H).trans + (MulEquiv.subgroupCongr (hlower (n : ℝ))) + exact Nat.card_congr qH.toEquiv + have hherbrand (s : ℝ) : + herbrandFunctionOfUniqueExtension + (base := baseB) (target := target) huniqB s = + herbrandFunctionOfUniqueExtension + (base := baseK) (target := target) huniqK s := by + exact + herbrandFunction_eq_of_card_lower_eq + _ _ hcard s + have hinverse (u : ℝ) : + inverseHerbrandFunctionOfUniqueExtension + (base := baseB) (target := target) huniqB u = + inverseHerbrandFunctionOfUniqueExtension + (base := baseK) (target := target) huniqK u := by + apply + (herbrandFunctionOfUniqueExtension_strictMono + (base := baseK) (target := target) huniqK).injective + rw [herbrandFunctionOfUniqueExtension_psi] + rw [← hherbrand] + rw [herbrandFunctionOfUniqueExtension_psi] + change + Subgroup.map q.toMonoidHom + (lowerRamificationGroup + (base := baseB) (target := target) huniqB + (inverseHerbrandFunctionOfUniqueExtension + (base := baseB) (target := target) huniqB t)) = + lowerRamificationGroup + (base := baseK) (target := target) huniqK + (inverseHerbrandFunctionOfUniqueExtension + (base := baseK) (target := target) huniqK t) + rw [hinverse] + exact hlower _ + +/-- A valuation-preserving base-field equivalence transports every actual +local upper ramification group to the group for the transported algebra +structure on the same target field. -/ +theorem localUpperRamificationGroup_map_baseRingEquiv + (B K E : Type) + [Field B] [Field K] [Field E] + [Algebra B E] [Algebra K E] + [FiniteDimensional B E] [FiniteDimensional K E] + [IsGalois B E] [IsGalois K E] + [ValuativeRel B] [TopologicalSpace B] + [IsNonarchimedeanLocalField B] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (e : B ≃+* K) + (he : ∀ b, algebraMap K E (e b) = algebraMap B E b) + (hvaluation : ∀ b, + ValuativeRel.valuation B b ≤ 1 ↔ + ValuativeRel.valuation K (e b) ≤ 1) + (t : ℝ) : + Subgroup.map + (galoisGroupEquivOfBaseRingEquiv B K E e he).toMonoidHom + (localUpperRamificationGroup B E t) = + localUpperRamificationGroup K E t := by + let baseB := localCompleteDVF B + let baseK := localCompleteDVF K + let targetB := chosenLocalExtensionCompleteDVF B E + let targetK := chosenLocalExtensionCompleteDVF K E + let q := galoisGroupEquivOfBaseRingEquiv B K E e he + let hExtB : baseB.valuation.HasExtension targetB.valuation := + chosenLocalExtensionCompleteDVF_hasExtension B E + let hExtK : baseK.valuation.HasExtension targetK.valuation := + chosenLocalExtensionCompleteDVF_hasExtension K E + let hExtBK : baseB.valuation.HasExtension targetK.valuation := by + refine { val_isEquiv_comap := ?_ } + rw [_root_.Valuation.isEquiv_iff_val_le_one] + intro b + change + baseB.valuation b ≤ 1 ↔ + targetK.valuation (algebraMap B E b) ≤ 1 + rw [← he b] + exact + (hvaluation b).trans + ((_root_.Valuation.HasExtension.val_map_le_one_iff + (vR := baseK.valuation) (vA := targetK.valuation) (e b)).symm) + let huniqB : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + (base := baseB.toDVF) (target := targetB.toDVF) := + chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension B E + let huniqK : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + (base := baseK.toDVF) (target := targetK.toDVF) := + chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension K E + let huniqBK : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + (base := baseB.toDVF) (target := targetK.toDVF) := + hasUniqueValuationExtension_of_finite_separable baseB targetK + have hvaluationSubring : + targetB.valuation.valuationSubring = + targetK.valuation.valuationSubring := by + exact + (_root_.Valuation.isEquiv_iff_valuationSubring + targetB.valuation targetK.valuation).1 + (huniqB targetK.valuation) + have hchosen : + upperRamificationGroupOfUniqueExtension + (base := baseB.toDVF) (target := targetB.toDVF) + huniqB t = + upperRamificationGroupOfUniqueExtension + (base := baseB.toDVF) (target := targetK.toDVF) + huniqBK t := + upperRamificationGroup_eq_of_valuationSubring_eq + huniqB huniqBK hvaluationSubring t + change + Subgroup.map q.toMonoidHom + (upperRamificationGroupOfUniqueExtension + (base := baseB.toDVF) (target := targetB.toDVF) + huniqB t) = + upperRamificationGroupOfUniqueExtension + (base := baseK.toDVF) (target := targetK.toDVF) + huniqK t + rw [hchosen] + exact + upperRamificationGroup_map_baseChange + B K E baseB.toDVF baseK.toDVF targetK.toDVF + huniqBK huniqK q + (fun σ x => galoisGroupEquivOfBaseRingEquiv_apply + B K E e he σ x) t + +end RamificationTheory.LocalField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean new file mode 100644 index 0000000000..aff75df2ce --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean @@ -0,0 +1,999 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Function +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteGaloisLevelIndependence +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandFunction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandTheorem +/-! +# Upper ramification jumps + +The actual finite-level upper filtration attached to the canonical +complete-DVF structure of a nonarchimedean local field, together with its +right-limit subgroup and the intrinsic predicate for an upper jump. +-/ + +@[expose] public section + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction_eq_of_card_lower_eq → + herbrandFunction_eq_of_card_lower_eq + +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction_of_nonpos → + herbrandFunction_of_nonpos + + +noncomputable +section + +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension +open scoped ValuativeRel + +universe y + +namespace LocalFieldTheory + +/-- Uniqueness after forgetting completeness, in the form consumed by the +real lower and upper ramification APIs. -/ +theorem chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{0, 0, 0, 0, y} + (localCompleteDVF K).toDVF + (chosenLocalExtensionCompleteDVF K L).toDVF := + chosenLocalExtensionCompleteDVF_hasUniqueValuationExtension K L + +end LocalFieldTheory + +namespace RamificationTheory.LocalField + +open LocalFieldTheory +open RamificationTheory +open RamificationTheory.HilbertRamification +open RamificationTheory.HilbertRamification.Higher + +/-- Pull a complete discrete valuation back along a field equivalence. -/ +private noncomputable def completeDVFComapAlgEquiv + {L M : Type} [Field L] [Field M] + (target : CompleteDVF.{0, 0} M) (e : L ≃+* M) : + CompleteDVF.{0, 0} L where + ValueGroup := target.ValueGroup + valuation := target.valuation.comap e.toRingHom + instCompleteDiscrete := + Valuation.isCompleteDiscrete_comap_ringEquiv target.valuation e + +/-- Pullback along a base-linear equivalence preserves extension of the base +valuation. -/ +private theorem completeDVFComapAlgEquiv_hasExtension + (K L M : Type) [Field K] [Field L] [Field M] + [Algebra K L] [Algebra K M] + (base : CompleteDVF.{0, 0} K) + (target : CompleteDVF.{0, 0} M) + [base.valuation.HasExtension target.valuation] + (e : L ≃ₐ[K] M) : + base.valuation.HasExtension + (completeDVFComapAlgEquiv target e.toRingEquiv).valuation where + val_isEquiv_comap := by + rw [_root_.Valuation.isEquiv_iff_val_le_one] + intro a + change + base.valuation a ≤ 1 ↔ + target.valuation (e ((algebraMap K L) a)) ≤ 1 + rw [e.commutes] + exact + (_root_.Valuation.HasExtension.val_map_le_one_iff + (vR := base.valuation) (vA := target.valuation) a).symm + +/-- The actual real lower ramification group of an arbitrary finite Galois +extension of nonarchimedean local fields, using its integral-closure +valuation. -/ +noncomputable def localLowerRamificationGroup + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (t : ℝ) : Subgroup Gal(L/K) := + Higher.lowerRamificationGroup + (base := (localCompleteDVF K).toDVF) + (target := (chosenLocalExtensionCompleteDVF K L).toDVF) + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension K L) t + +/-- The actual real upper ramification group of an arbitrary finite Galois +extension of nonarchimedean local fields. -/ +noncomputable def localUpperRamificationGroup + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (t : ℝ) : Subgroup Gal(L/K) := + Higher.upperRamificationGroupOfUniqueExtension + (base := (localCompleteDVF K).toDVF) + (target := (chosenLocalExtensionCompleteDVF K L).toDVF) + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension K L) t + +/-- A base-linear field equivalence transports every local upper ramification +group to the corresponding group of the equivalent extension. -/ +theorem localUpperRamificationGroup_map_autCongr + (K L M : Type) + [Field K] [Field L] [Field M] + [Algebra K L] [Algebra K M] + [FiniteDimensional K L] [FiniteDimensional K M] + [IsGalois K L] [IsGalois K M] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (e : L ≃ₐ[K] M) (t : ℝ) : + Subgroup.map (AlgEquiv.autCongr e).toMonoidHom + (localUpperRamificationGroup K L t) = + localUpperRamificationGroup K M t := by + let base := localCompleteDVF K + let targetL := chosenLocalExtensionCompleteDVF K L + let targetM := chosenLocalExtensionCompleteDVF K M + let pulled := completeDVFComapAlgEquiv targetM e.toRingEquiv + let hExtL : base.valuation.HasExtension targetL.valuation := + chosenLocalExtensionCompleteDVF_hasExtension K L + let hExtM : base.valuation.HasExtension targetM.valuation := + chosenLocalExtensionCompleteDVF_hasExtension K M + let hExtPulled : base.valuation.HasExtension pulled.valuation := + completeDVFComapAlgEquiv_hasExtension K L M base targetM e + let huniqL : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + base.toDVF targetL.toDVF := + chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension K L + let huniqM : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + base.toDVF targetM.toDVF := + chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension K M + let huniqPulled : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + base.toDVF pulled.toDVF := + hasUniqueValuationExtension_of_finite_separable base pulled + let φ : Gal(L/K) ≃* Gal(M/K) := AlgEquiv.autCongr e + let r : pulled.valuationSubring ≃+* targetM.valuationSubring := + by + change + (targetM.valuation.comap e.toRingHom).valuationSubring ≃+* + targetM.valuation.valuationSubring + exact + Valuation.valuationSubringRingEquivOfComap + targetM.valuation e.toRingEquiv + have hmapMaximalIdeal : + Ideal.map + (r : pulled.valuationSubring →+* targetM.valuationSubring) + (IsLocalRing.maximalIdeal pulled.valuationSubring) = + IsLocalRing.maximalIdeal targetM.valuationSubring := by + exact IsLocalRing.map_ringEquiv_maximalIdeal r + have hmapIdeal (s : ℝ) : + Ideal.map (r : pulled.valuationSubring →+* targetM.valuationSubring) + (realRamificationIdeal pulled.toDVF s) = + realRamificationIdeal targetM.toDVF s := by + unfold realRamificationIdeal + rw [Ideal.map_pow, hmapMaximalIdeal] + have hideal (s : ℝ) (x : pulled.valuationSubring) : + x ∈ realRamificationIdeal pulled.toDVF s ↔ + r x ∈ realRamificationIdeal targetM.toDVF s := by + rw [← hmapIdeal s] + exact Ideal.apply_mem_of_equiv_iff.symm + have hdisplacement (σ : Gal(L/K)) (a : pulled.valuationSubring) : + r (valuationSubringAutOfUniqueExtension + (base := base.toDVF) (target := pulled.toDVF) + huniqPulled σ a - a) = + valuationSubringAutOfUniqueExtension + (base := base.toDVF) (target := targetM.toDVF) + huniqM (φ σ) (r a) - r a := by + apply Subtype.ext + change + e (σ (a : L) - (a : L)) = + (AlgEquiv.autCongr e σ) (e (a : L)) - e (a : L) + simp [AlgEquiv.autCongr_apply] + have hmem (s : ℝ) (σ : Gal(L/K)) : + σ ∈ lowerRamificationGroup + (base := base.toDVF) (target := pulled.toDVF) + huniqPulled s ↔ + φ σ ∈ lowerRamificationGroup + (base := base.toDVF) (target := targetM.toDVF) + huniqM s := by + constructor + · intro hσ a + let b : pulled.valuationSubring := r.symm a + have hb := (hideal s + (valuationSubringAutOfUniqueExtension + (base := base.toDVF) (target := pulled.toDVF) + huniqPulled σ b - b)).1 (hσ b) + rw [hdisplacement σ b] at hb + simpa [b] using hb + · intro hσ a + have ha := hσ (r a) + rw [← hdisplacement σ a] at ha + exact (hideal s _).2 ha + have hlower (s : ℝ) : + Subgroup.map φ.toMonoidHom + (lowerRamificationGroup + (base := base.toDVF) (target := pulled.toDVF) + huniqPulled s) = + lowerRamificationGroup + (base := base.toDVF) (target := targetM.toDVF) + huniqM s := by + ext τ + constructor + · rintro ⟨σ, hσ, rfl⟩ + exact (hmem s σ).1 hσ + · intro hτ + refine ⟨φ.symm τ, (hmem s (φ.symm τ)).2 ?_, by simp⟩ + simpa using hτ + have hcard (n : ℕ) : + Nat.card + ((lowerRamificationFiltrationOfUniqueExtension + (base := base.toDVF) (target := pulled.toDVF) + huniqPulled).lower n) = + Nat.card + ((lowerRamificationFiltrationOfUniqueExtension + (base := base.toDVF) (target := targetM.toDVF) + huniqM).lower n) := by + let H := + lowerRamificationGroup + (base := base.toDVF) (target := pulled.toDVF) + huniqPulled (n : ℝ) + let q := + (φ.subgroupMap H).trans + (MulEquiv.subgroupCongr (hlower (n : ℝ))) + exact Nat.card_congr q.toEquiv + have hherbrand (s : ℝ) : + herbrandFunctionOfUniqueExtension + (base := base.toDVF) (target := pulled.toDVF) + huniqPulled s = + herbrandFunctionOfUniqueExtension + (base := base.toDVF) (target := targetM.toDVF) + huniqM s := by + exact + herbrandFunction_eq_of_card_lower_eq + _ _ hcard s + have hinverse (u : ℝ) : + inverseHerbrandFunctionOfUniqueExtension + (base := base.toDVF) (target := pulled.toDVF) + huniqPulled u = + inverseHerbrandFunctionOfUniqueExtension + (base := base.toDVF) (target := targetM.toDVF) + huniqM u := by + apply + (herbrandFunctionOfUniqueExtension_strictMono + (base := base.toDVF) (target := targetM.toDVF) + huniqM).injective + rw [herbrandFunctionOfUniqueExtension_psi] + rw [← hherbrand] + rw [herbrandFunctionOfUniqueExtension_psi] + have hpulled : + Subgroup.map φ.toMonoidHom + (upperRamificationGroupOfUniqueExtension + (base := base.toDVF) (target := pulled.toDVF) + huniqPulled t) = + upperRamificationGroupOfUniqueExtension + (base := base.toDVF) (target := targetM.toDVF) + huniqM t := by + change + Subgroup.map φ.toMonoidHom + (lowerRamificationGroup + (base := base.toDVF) (target := pulled.toDVF) + huniqPulled + (inverseHerbrandFunctionOfUniqueExtension + (base := base.toDVF) (target := pulled.toDVF) + huniqPulled t)) = + lowerRamificationGroup + (base := base.toDVF) (target := targetM.toDVF) + huniqM + (inverseHerbrandFunctionOfUniqueExtension + (base := base.toDVF) (target := targetM.toDVF) + huniqM t) + rw [hinverse] + exact hlower _ + have hvaluationSubring : + targetL.valuation.valuationSubring = + pulled.valuation.valuationSubring := by + exact + (_root_.Valuation.isEquiv_iff_valuationSubring + targetL.valuation pulled.valuation).1 + (huniqL pulled.valuation) + have hchosen : + upperRamificationGroupOfUniqueExtension + (base := base.toDVF) (target := targetL.toDVF) + huniqL t = + upperRamificationGroupOfUniqueExtension + (base := base.toDVF) (target := pulled.toDVF) + huniqPulled t := + upperRamificationGroup_eq_of_valuationSubring_eq + huniqL huniqPulled hvaluationSubring t + change + Subgroup.map φ.toMonoidHom + (upperRamificationGroupOfUniqueExtension + (base := base.toDVF) (target := targetL.toDVF) + huniqL t) = + upperRamificationGroupOfUniqueExtension + (base := base.toDVF) (target := targetM.toDVF) + huniqM t + rw [hchosen] + exact hpulled + +private theorem fixedFieldUpperRamificationGroup_map_autCongr + (K L M : Type) + [Field K] [Field L] [Field M] + [Algebra K L] [Algebra K M] + [FiniteDimensional K L] [FiniteDimensional K M] + [IsGalois K L] [IsGalois K M] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : Subgroup Gal(L/K)) [H.Normal] + (e : IntermediateField.fixedField H ≃ₐ[K] M) + (t : ℝ) : + Subgroup.map (AlgEquiv.autCongr e).toMonoidHom + (fixedFieldUpperRamificationGroup + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension + K L) H t) = + localUpperRamificationGroup K M t := by + let base := localCompleteDVF K + let targetL := chosenLocalExtensionCompleteDVF K L + let targetM := chosenLocalExtensionCompleteDVF K M + let pulled := completeDVFComapAlgEquiv targetM e.toRingEquiv + let hExtL : base.valuation.HasExtension targetL.valuation := + chosenLocalExtensionCompleteDVF_hasExtension K L + let hExtM : base.valuation.HasExtension targetM.valuation := + chosenLocalExtensionCompleteDVF_hasExtension K M + let hExtPulled : base.valuation.HasExtension pulled.valuation := + completeDVFComapAlgEquiv_hasExtension K + (IntermediateField.fixedField H) M base targetM e + let huniqL : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + base.toDVF targetL.toDVF := + chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension K L + let huniqM : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + base.toDVF targetM.toDVF := + chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension K M + let huniqPulled : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + base.toDVF pulled.toDVF := + hasUniqueValuationExtension_of_finite_separable base pulled + let B := + fixedFieldValuationSubringDVF + (K := K) (target := targetL.toDVF) H + let hExtB : base.valuation.HasExtension B.valuation := + base_hasExtension_fixedFieldValuationSubringDVF + (base := base.toDVF) (target := targetL.toDVF) H + have hpulledB : + pulled.valuation.valuationSubring = B := by + calc + pulled.valuation.valuationSubring = + B.valuation.valuationSubring := + (_root_.Valuation.isEquiv_iff_valuationSubring + pulled.valuation B.valuation).1 + (huniqPulled B.valuation) + _ = B := ValuationSubring.valuationSubring_valuation B + let r : B ≃+* targetM.valuationSubring := + { toFun := fun a => + ⟨e (a : IntermediateField.fixedField H), by + change (a : IntermediateField.fixedField H) ∈ + pulled.valuation.valuationSubring + rw [hpulledB] + exact a.property⟩ + invFun := fun a => + ⟨e.symm (a : M), by + rw [← hpulledB] + change + targetM.valuation (e (e.symm (a : M))) ≤ 1 + rw [e.apply_symm_apply] + exact + (_root_.Valuation.mem_valuationSubring_iff + targetM.valuation (a : M)).1 a.property⟩ + left_inv a := Subtype.ext (e.symm_apply_apply (a : IntermediateField.fixedField H)) + right_inv a := Subtype.ext (e.apply_symm_apply (a : M)) + map_mul' a b := Subtype.ext (e.map_mul (a : IntermediateField.fixedField H) + (b : IntermediateField.fixedField H)) + map_add' a b := Subtype.ext (e.map_add (a : IntermediateField.fixedField H) + (b : IntermediateField.fixedField H)) } + have hmapMaximalIdeal : + Ideal.map (r : B →+* targetM.valuationSubring) + (IsLocalRing.maximalIdeal B) = + IsLocalRing.maximalIdeal targetM.valuationSubring := by + exact IsLocalRing.map_ringEquiv_maximalIdeal r + have hmapIdeal (s : ℝ) : + Ideal.map (r : B →+* targetM.valuationSubring) + (fixedFieldRamificationIdealDVF + (K := K) (target := targetL.toDVF) H s) = + realRamificationIdeal targetM.toDVF s := by + unfold fixedFieldRamificationIdealDVF realRamificationIdeal + rw [Ideal.map_pow, hmapMaximalIdeal] + have hideal (s : ℝ) (x : B) : + x ∈ fixedFieldRamificationIdealDVF + (K := K) (target := targetL.toDVF) H s ↔ + r x ∈ realRamificationIdeal targetM.toDVF s := by + rw [← hmapIdeal s] + exact Ideal.apply_mem_of_equiv_iff.symm + let φ : + Gal(IntermediateField.fixedField H/K) ≃* + Gal(M/K) := + AlgEquiv.autCongr e + have hdisplacement + (σ : Gal(IntermediateField.fixedField H/K)) + (a : B) : + r (fixedFieldValuationSubringAutDVF + (base := base.toDVF) (target := targetL.toDVF) + huniqL H σ a - a) = + valuationSubringAutOfUniqueExtension + (base := base.toDVF) (target := targetM.toDVF) + huniqM (φ σ) (r a) - r a := by + apply Subtype.ext + change + e (σ (a : IntermediateField.fixedField H) - + (a : IntermediateField.fixedField H)) = + (AlgEquiv.autCongr e σ) (e (a : IntermediateField.fixedField H)) - + e (a : IntermediateField.fixedField H) + simp [AlgEquiv.autCongr_apply] + have hmem (s : ℝ) + (σ : Gal(IntermediateField.fixedField H/K)) : + σ ∈ fixedFieldLowerRamificationGroup + (base := base.toDVF) (target := targetL.toDVF) + huniqL H s ↔ + φ σ ∈ lowerRamificationGroup + (base := base.toDVF) (target := targetM.toDVF) + huniqM s := by + constructor + · intro hσ a + let b : B := r.symm a + have hb := + (hideal s + (fixedFieldValuationSubringAutDVF + (base := base.toDVF) (target := targetL.toDVF) + huniqL H σ b - b)).1 (hσ b) + rw [hdisplacement σ b] at hb + simpa [b] using hb + · intro hσ a + have ha := hσ (r a) + rw [← hdisplacement σ a] at ha + exact (hideal s _).2 ha + have hlower (s : ℝ) : + Subgroup.map φ.toMonoidHom + (fixedFieldLowerRamificationGroup + (base := base.toDVF) (target := targetL.toDVF) + huniqL H s) = + lowerRamificationGroup + (base := base.toDVF) (target := targetM.toDVF) + huniqM s := by + ext τ + constructor + · rintro ⟨σ, hσ, rfl⟩ + exact (hmem s σ).1 hσ + · intro hτ + refine ⟨φ.symm τ, (hmem s (φ.symm τ)).2 ?_, by simp⟩ + simpa using hτ + have hcard (n : ℕ) : + Nat.card + ((fixedFieldLowerRamificationFiltration + (base := base.toDVF) (target := targetL.toDVF) + huniqL H).lower n) = + Nat.card + ((lowerRamificationFiltrationOfUniqueExtension + (base := base.toDVF) (target := targetM.toDVF) + huniqM).lower n) := by + let A := + fixedFieldLowerRamificationGroup + (base := base.toDVF) (target := targetL.toDVF) + huniqL H (n : ℝ) + let q := + (φ.subgroupMap A).trans + (MulEquiv.subgroupCongr (hlower (n : ℝ))) + exact Nat.card_congr q.toEquiv + have hherbrand (s : ℝ) : + fixedFieldHerbrandFunction + (base := base.toDVF) (target := targetL.toDVF) + huniqL H s = + herbrandFunctionOfUniqueExtension + (base := base.toDVF) (target := targetM.toDVF) + huniqM s := by + exact + herbrandFunction_eq_of_card_lower_eq + _ _ hcard s + have hinverse (u : ℝ) : + fixedFieldInverseHerbrandFunction + (base := base.toDVF) (target := targetL.toDVF) + huniqL H u = + inverseHerbrandFunctionOfUniqueExtension + (base := base.toDVF) (target := targetM.toDVF) + huniqM u := by + apply + (herbrandFunctionOfUniqueExtension_strictMono + (base := base.toDVF) (target := targetM.toDVF) + huniqM).injective + rw [herbrandFunctionOfUniqueExtension_psi] + rw [← hherbrand] + rw [fixedFieldHerbrandFunction_inverseHerbrandFunction] + change + Subgroup.map φ.toMonoidHom + (fixedFieldLowerRamificationGroup + (base := base.toDVF) (target := targetL.toDVF) + huniqL H + (fixedFieldInverseHerbrandFunction + (base := base.toDVF) (target := targetL.toDVF) + huniqL H t)) = + lowerRamificationGroup + (base := base.toDVF) (target := targetM.toDVF) + huniqM + (inverseHerbrandFunctionOfUniqueExtension + (base := base.toDVF) (target := targetM.toDVF) + huniqM t) + rw [hinverse] + exact hlower _ + +private theorem fixedFieldUpperRamificationGroup_eq_local + (K L : Type) + [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (H : Subgroup Gal(L/K)) [H.Normal] + (t : ℝ) : + fixedFieldUpperRamificationGroup + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension + K L) H t = + localUpperRamificationGroup K (IntermediateField.fixedField H) t := by + simpa using + fixedFieldUpperRamificationGroup_map_autCongr + K L (IntermediateField.fixedField H) H + (AlgEquiv.refl : IntermediateField.fixedField H ≃ₐ[K] + IntermediateField.fixedField H) t + +/-- Upper ramification groups descend along restriction between finite +Galois intermediate fields in a common separable closure. -/ +theorem localUpperRamificationGroup_map_restrict + (K : Type) [Field K] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (E F : IntermediateField K (SeparableClosure K)) (hEF : E ≤ F) + [FiniteDimensional K E] [FiniteDimensional K F] + [IsGalois K E] [IsGalois K F] + (t : ℝ) : + Subgroup.map + (intermediateFieldRestrictNormalHom E F hEF) + (localUpperRamificationGroup K F t) = + localUpperRamificationGroup K E t := by + let EF : IntermediateField K F := E.comap F.val + let eEF : EF ≃ₐ[K] E := + { toFun := fun x => ⟨F.val x, x.property⟩ + invFun := fun x => + ⟨IntermediateField.inclusion hEF x, by + change F.val (IntermediateField.inclusion hEF x) ∈ E + exact x.property⟩ + left_inv := by + intro x + apply Subtype.ext + apply F.val.injective + rfl + right_inv := by + intro x + apply Subtype.ext + rfl + map_mul' := by + intro x y + apply Subtype.ext + rfl + map_add' := by + intro x y + apply Subtype.ext + rfl + commutes' := by + intro x + apply Subtype.ext + rfl } + let : IsGalois K EF := IsGalois.of_algEquiv eEF.symm + let H : Subgroup Gal(F/K) := EF.fixingSubgroup + let : H.Normal := by + dsimp only [H] + infer_instance + let eFixed : IntermediateField.fixedField H ≃ₐ[K] E := + (IntermediateField.equivOfEq + (IsGalois.fixedField_fixingSubgroup EF)).trans eEF + let qEquiv : + (Gal(F/K) ⧸ H) ≃* Gal(E/K) := + (IsGalois.normalAutEquivQuotient H).trans + (AlgEquiv.autCongr eFixed) + let base := (localCompleteDVF K).toDVF + let target := (chosenLocalExtensionCompleteDVF K F).toDVF + let huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + base target := + chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension K F + let : Finite (localCompleteDVF K).residueField := by + change Finite 𝓀[K] + infer_instance + let : Module.Finite + base.valuationSubring target.valuationSubring := + chosenLocalExtensionCompleteDVF_valuationSubring_moduleFinite K F + let : FiniteDimensional base.residueField target.residueField := + residueField_finiteDimensional_of_moduleFinite_dvf + (base := base) (target := target) + have hquot := + upperRamificationGroup_quotient + (base := base) (target := target) huniq H t + have hrestrict : + intermediateFieldRestrictNormalHom E F hEF = + qEquiv.toMonoidHom.comp (QuotientGroup.mk' H) := by + apply MonoidHom.ext + intro σ + apply AlgEquiv.ext + intro x + apply E.val.injective + change + E.val (intermediateFieldRestrictNormalHom E F hEF σ x) = + E.val ((qEquiv.toMonoidHom.comp (QuotientGroup.mk' H)) σ x) + rw [intermediateFieldRestrictNormalHom_apply_val] + simp only [IntermediateField.coe_val, MulEquiv.toMonoidHom_eq_coe, + MulEquiv.coe_monoidHom_trans, MonoidHom.coe_comp, MonoidHom.coe_coe, QuotientGroup.coe_mk', + Function.comp_apply, IsGalois.normalAutEquivQuotient_apply, AlgEquiv.autCongr_apply, + AlgEquiv.trans_apply, AlgEquiv.symm_trans_apply, IntermediateField.equivOfEq_symm, + AlgEquiv.symm_mk, Equiv.symm_mk, AlgEquiv.coe_mk, Equiv.coe_fn_mk, + IntermediateField.equivOfEq_apply, IntermediateField.val_mk, SetLike.coe_eq_coe, H, EF, + qEquiv, eFixed, eEF] + symm + exact + AlgEquiv.restrictNormal_commutes σ + (IntermediateField.fixedField H) (eFixed.symm x) + have hmapComap : + Subgroup.map + (IsGalois.normalAutEquivQuotient H).toMonoidHom + (Subgroup.comap + (IsGalois.normalAutEquivQuotient H).toMonoidHom + (fixedFieldUpperRamificationGroup + (base := base) (target := target) huniq H t)) = + fixedFieldUpperRamificationGroup + (base := base) (target := target) huniq H t := by + exact + Subgroup.map_comap_eq_self_of_surjective + (IsGalois.normalAutEquivQuotient H).surjective _ + rw [hrestrict] + change + Subgroup.map + (qEquiv.toMonoidHom.comp (QuotientGroup.mk' H)) + (upperRamificationGroupOfUniqueExtension + (base := base) (target := target) huniq t) = + localUpperRamificationGroup K E t + rw [← Subgroup.map_map, hquot] + change + Subgroup.map + ((AlgEquiv.autCongr eFixed).toMonoidHom.comp + (IsGalois.normalAutEquivQuotient H).toMonoidHom) + (Subgroup.comap + (IsGalois.normalAutEquivQuotient H).toMonoidHom + (fixedFieldUpperRamificationGroup + (base := base) (target := target) huniq H t)) = + localUpperRamificationGroup K E t + rw [← Subgroup.map_map] + rw [hmapComap] + rw [fixedFieldUpperRamificationGroup_eq_local K F H t] + exact + localUpperRamificationGroup_map_autCongr + K (IntermediateField.fixedField H) E eFixed t + +/-- The local upper ramification filtration is antitone. -/ +theorem localUpperRamificationGroup_antitone + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + Antitone (localUpperRamificationGroup K L) := by + intro s t hst + unfold localUpperRamificationGroup + apply Higher.lowerRamificationGroup_antitone + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension K L) + exact + (Higher.inverseHerbrandFunctionOfUniqueExtension_strictMono + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension K L)).monotone hst + +/-- The subgroup immediately after an upper ramification index for an +arbitrary finite local Galois extension. -/ +def localUpperRamificationGroupAfter + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (t : ℝ) : Subgroup Gal(L/K) := + ⨆ s : {s : ℝ // t < s}, localUpperRamificationGroup K L s + +/-- The right-limit upper group lies in the group at the limiting index. -/ +theorem localUpperRamificationGroupAfter_le + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (t : ℝ) : + localUpperRamificationGroupAfter K L t ≤ + localUpperRamificationGroup K L t := by + apply iSup_le + intro s + exact localUpperRamificationGroup_antitone K L (le_of_lt s.property) + +/-- Intrinsic upper-jump predicate for an arbitrary finite local Galois +extension. -/ +def IsLocalUpperRamificationJump + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (t : ℝ) : Prop := + localUpperRamificationGroup K L t ≠ + localUpperRamificationGroupAfter K L t + +/-- Restriction along a finite Galois tower carries the right-limit of the +upper filtration onto the corresponding right-limit downstairs. -/ +theorem localUpperRamificationGroupAfter_map_restrict + (K : Type) [Field K] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (E F : IntermediateField K (SeparableClosure K)) (hEF : E ≤ F) + [FiniteDimensional K E] [FiniteDimensional K F] + [IsGalois K E] [IsGalois K F] + (t : ℝ) : + Subgroup.map + (intermediateFieldRestrictNormalHom E F hEF) + (localUpperRamificationGroupAfter K F t) = + localUpperRamificationGroupAfter K E t := by + unfold localUpperRamificationGroupAfter + calc + Subgroup.map + (intermediateFieldRestrictNormalHom E F hEF) + (⨆ s : {s : ℝ // t < s}, + localUpperRamificationGroup K F (s : ℝ)) = + ⨆ s : {s : ℝ // t < s}, + Subgroup.map + (intermediateFieldRestrictNormalHom E F hEF) + (localUpperRamificationGroup K F (s : ℝ)) := by + simpa using + Subgroup.map_iSup + (intermediateFieldRestrictNormalHom E F hEF) + (fun s : {s : ℝ // t < s} => + localUpperRamificationGroup K F (s : ℝ)) + _ = ⨆ s : {s : ℝ // t < s}, + localUpperRamificationGroup K E (s : ℝ) := by + apply iSup_congr + intro s + exact localUpperRamificationGroup_map_restrict + K E F hEF (s : ℝ) + +/-- Every upper jump downstairs in a finite Galois tower was already an +upper jump upstairs. Thus quotienting an extension cannot create new break +indices. -/ +theorem isLocalUpperRamificationJump_of_map_restrict + (K : Type) [Field K] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (E F : IntermediateField K (SeparableClosure K)) (hEF : E ≤ F) + [FiniteDimensional K E] [FiniteDimensional K F] + [IsGalois K E] [IsGalois K F] + {t : ℝ} (ht : IsLocalUpperRamificationJump K E t) : + IsLocalUpperRamificationJump K F t := by + intro hF + apply ht + calc + localUpperRamificationGroup K E t = + Subgroup.map + (intermediateFieldRestrictNormalHom E F hEF) + (localUpperRamificationGroup K F t) := + (localUpperRamificationGroup_map_restrict K E F hEF t).symm + _ = Subgroup.map + (intermediateFieldRestrictNormalHom E F hEF) + (localUpperRamificationGroupAfter K F t) := by rw [hF] + _ = localUpperRamificationGroupAfter K E t := + localUpperRamificationGroupAfter_map_restrict K E F hEF t + +private theorem localInverseHerbrandFunction_eq_self_of_nonpos + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (t : ℝ) (ht : t ≤ 0) : + inverseHerbrandFunctionOfUniqueExtension + (base := (localCompleteDVF K).toDVF) + (target := (chosenLocalExtensionCompleteDVF K L).toDVF) + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension K L) + t = + t := by + let huniq : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + (localCompleteDVF K).toDVF + (chosenLocalExtensionCompleteDVF K L).toDVF := + chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension K L + apply + (herbrandFunctionOfUniqueExtension_strictMono + (base := (localCompleteDVF K).toDVF) + (target := (chosenLocalExtensionCompleteDVF K L).toDVF) + huniq).injective + rw [herbrandFunctionOfUniqueExtension_psi] + exact + (herbrandFunction_of_nonpos + (lowerRamificationFiltrationOfUniqueExtension + (base := (localCompleteDVF K).toDVF) + (target := (chosenLocalExtensionCompleteDVF K L).toDVF) + huniq) + ht).symm + +/-- At every nonpositive index the inverse Herbrand function is the identity, +so upper and lower numbering agree. -/ +theorem localUpperRamificationGroup_eq_localLowerRamificationGroup_of_nonpos + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (t : ℝ) (ht : t ≤ 0) : + localUpperRamificationGroup K L t = + localLowerRamificationGroup K L t := by + unfold localUpperRamificationGroup + unfold localLowerRamificationGroup + unfold upperRamificationGroupOfUniqueExtension + rw [localInverseHerbrandFunction_eq_self_of_nonpos K L t ht] + +/-- The lower filtration is constant between the distinguished endpoints `-1` and +`0`: every such real index imposes exactly the first maximal-ideal power. -/ +theorem localLowerRamificationGroup_eq_zero_of_neg_one_lt_of_nonpos + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (t : ℝ) (hneg : -1 < t) (ht : t ≤ 0) : + localLowerRamificationGroup K L t = + localLowerRamificationGroup K L 0 := by + have hexp : realRamificationExponent t = 1 := by + unfold realRamificationExponent + have hceil : Int.ceil (t + 1) = 1 := by + rw [Int.ceil_eq_iff] + norm_num + constructor <;> linarith + rw [hceil] + norm_num + have hideal : + realRamificationIdeal + (chosenLocalExtensionCompleteDVF K L).toDVF t = + realRamificationIdeal + (chosenLocalExtensionCompleteDVF K L).toDVF 0 := by + unfold realRamificationIdeal + have hzero : realRamificationExponent (0 : ℝ) = 1 := by + norm_num [realRamificationExponent] + rw [hexp, hzero] + unfold localLowerRamificationGroup + ext sigma + change + (∀ a, _ ∈ realRamificationIdeal + (chosenLocalExtensionCompleteDVF K L).toDVF t) ↔ + ∀ a, _ ∈ realRamificationIdeal + (chosenLocalExtensionCompleteDVF K L).toDVF 0 + rw [hideal] + +/-- The upper filtration is constant on the half-open interval `(-1, 0]`. -/ +theorem localUpperRamificationGroup_eq_zero_of_neg_one_lt_of_nonpos + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (t : ℝ) (hneg : -1 < t) (ht : t ≤ 0) : + localUpperRamificationGroup K L t = + localUpperRamificationGroup K L 0 := by + rw [ + localUpperRamificationGroup_eq_localLowerRamificationGroup_of_nonpos + K L t ht, + localUpperRamificationGroup_eq_localLowerRamificationGroup_of_nonpos + K L 0 (by norm_num), + localLowerRamificationGroup_eq_zero_of_neg_one_lt_of_nonpos + K L t hneg ht] + +/-- At and below `-1`, the local upper ramification group is the full Galois +group. -/ +theorem localUpperRamificationGroup_eq_top_of_le_neg_one + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (t : ℝ) (ht : t ≤ -1) : + localUpperRamificationGroup K L t = ⊤ := by + rw [ + localUpperRamificationGroup_eq_localLowerRamificationGroup_of_nonpos + K L t (by linarith)] + unfold localLowerRamificationGroup + exact lowerRamificationGroup_eq_top_of_le_neg_one + (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension K L) ht + +/-- No upper jump occurs strictly below the distinguished endpoint `-1`. -/ +theorem not_isLocalUpperRamificationJump_of_lt_neg_one + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (t : ℝ) (ht : t < -1) : + ¬ IsLocalUpperRamificationJump K L t := by + intro hjump + apply hjump + have htgroup : + localUpperRamificationGroup K L t = ⊤ := + localUpperRamificationGroup_eq_top_of_le_neg_one K L t ht.le + let s : {s : ℝ // t < s} := ⟨(t + (-1)) / 2, by linarith⟩ + have hsle : (s : ℝ) ≤ -1 := by + dsimp [s] + linarith + have hsgroup : + localUpperRamificationGroup K L (s : ℝ) = ⊤ := + localUpperRamificationGroup_eq_top_of_le_neg_one K L s hsle + rw [htgroup] + apply le_antisymm + · calc + (⊤ : Subgroup Gal(L/K)) = + localUpperRamificationGroup K L (s : ℝ) := hsgroup.symm + _ ≤ localUpperRamificationGroupAfter K L t := + le_iSup (fun u : {u : ℝ // t < u} => + localUpperRamificationGroup K L (u : ℝ)) s + · exact le_top + +/-- No upper jump occurs strictly between `-1` and `0`. -/ +theorem not_isLocalUpperRamificationJump_of_neg_one_lt_of_lt_zero + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + (t : ℝ) (hneg : -1 < t) (ht : t < 0) : + ¬ IsLocalUpperRamificationJump K L t := by + intro hjump + apply hjump + let s : {s : ℝ // t < s} := ⟨t / 2, by linarith⟩ + have hsneg : -1 < (s : ℝ) := by + dsimp [s] + linarith + have hs0 : (s : ℝ) ≤ 0 := by + dsimp [s] + linarith + have htzero : + localUpperRamificationGroup K L t = + localUpperRamificationGroup K L 0 := + localUpperRamificationGroup_eq_zero_of_neg_one_lt_of_nonpos + K L t hneg ht.le + have hszero : + localUpperRamificationGroup K L (s : ℝ) = + localUpperRamificationGroup K L 0 := + localUpperRamificationGroup_eq_zero_of_neg_one_lt_of_nonpos + K L s hsneg hs0 + apply le_antisymm + · calc + localUpperRamificationGroup K L t = + localUpperRamificationGroup K L (s : ℝ) := + htzero.trans hszero.symm + _ ≤ localUpperRamificationGroupAfter K L t := + le_iSup (fun u : {u : ℝ // t < u} => + localUpperRamificationGroup K L (u : ℝ)) s + · exact localUpperRamificationGroupAfter_le K L t + +/-- Every local upper jump is either the possible endpoint `-1` or a +nonnegative index. -/ +theorem isLocalUpperRamificationJump_eq_neg_one_or_nonneg + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + {t : ℝ} (ht : IsLocalUpperRamificationJump K L t) : + t = -1 ∨ 0 ≤ t := by + rcases lt_trichotomy t (-1) with htlt | hteq | htgt + · exact False.elim + ((not_isLocalUpperRamificationJump_of_lt_neg_one K L t htlt) ht) + · exact Or.inl hteq + · by_cases ht0 : 0 ≤ t + · exact Or.inr ht0 + · exact False.elim + ((not_isLocalUpperRamificationJump_of_neg_one_lt_of_lt_zero + K L t htgt (lt_of_not_ge ht0)) ht) + +end RamificationTheory.LocalField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/FirstRamificationComparison.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/FirstRamificationComparison.lean new file mode 100644 index 0000000000..7184503b37 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/FirstRamificationComparison.lean @@ -0,0 +1,98 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FirstRamificationComparison +/-! +# The first lower ramification group of a local field extension + +The canonical complete-DVF valuation on a finite local extension specializes +the general comparison between the first lower group and Hilbert's +ramification group. The latter is transported from the decomposition group +back to the full Galois group. +-/ + +@[expose] public section + +noncomputable +section + +open scoped ValuativeRel +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +namespace RamificationTheory.LocalField + +open LocalFieldTheory + +/-- The first lower group of the chosen local extension is Hilbert's +ramification group for its canonical valuation ring. -/ +theorem localLowerRamificationGroup_one_eq_hilbertRamificationGroup + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + localLowerRamificationGroup K L 1 = + Subgroup.comap + (RamificationTheory.HilbertRamification.CompleteDVF.galEquivDecompositionGroup + (base := localCompleteDVF K) + (target := chosenLocalExtensionCompleteDVF K L)).toMonoidHom + (RamificationTheory.HilbertRamification.ValuationSubring.ramificationGroupInDecomposition K + (chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring) := by + let base := localCompleteDVF K + let target := chosenLocalExtensionCompleteDVF K L + let : base.valuation.HasExtension target.valuation := + chosenLocalExtensionCompleteDVF_hasExtension K L + let : Module.Finite base.valuationSubring target.valuationSubring := + moduleFinite_target_valuationSubring_of_finite_separable base target + let : FiniteDimensional base.residueField target.residueField := + residueField_finiteDimensional_of_moduleFinite base target + let : Finite base.residueField := by + change Finite 𝓀[K] + infer_instance + let : Algebra.IsAlgebraic base.residueField target.residueField := + Algebra.IsAlgebraic.of_finite _ _ + let : Algebra.IsSeparable base.residueField target.residueField := + inferInstance + exact + RamificationTheory.HilbertRamification.lowerRamificationGroup_one_eq_hilbertRamificationGroup + base target (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension K L) + +/-- Triviality of the first lower group is exactly triviality of Hilbert's +ramification group; the two transports above are both injective. -/ +theorem localLowerRamificationGroup_one_eq_bot_iff_hilbertRamificationGroup_eq_bot + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + localLowerRamificationGroup K L 1 = ⊥ ↔ + RamificationTheory.HilbertRamification.ValuationSubring.ramificationGroup K + (chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring = ⊥ := by + let A := (chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring + let e := RamificationTheory.HilbertRamification.CompleteDVF.galEquivDecompositionGroup + (base := localCompleteDVF K) (target := chosenLocalExtensionCompleteDVF K L) + let H := RamificationTheory.HilbertRamification.ValuationSubring.ramificationGroup K A + let f := (RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup K A).subtype + rw [localLowerRamificationGroup_one_eq_hilbertRamificationGroup] + change (H.map f).comap e.toMonoidHom = ⊥ ↔ H = ⊥ + have hrecover : + ((H.map f).comap e.toMonoidHom).map e.toMonoidHom = H.map f := + Subgroup.map_comap_eq_self_of_surjective e.surjective (H.map f) + calc + (H.map f).comap e.toMonoidHom = ⊥ ↔ + ((H.map f).comap e.toMonoidHom).map e.toMonoidHom = ⊥ := + (Subgroup.map_eq_bot_iff_of_injective + (H := (H.map f).comap e.toMonoidHom) + (f := e.toMonoidHom) e.injective).symm + _ ↔ H.map f = ⊥ := by rw [hrecover] + _ ↔ H = ⊥ := + Subgroup.map_eq_bot_iff_of_injective (H := H) (f := f) (by + intro x y hxy + exact Subtype.ext hxy) + +end RamificationTheory.LocalField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/InertiaCard.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/InertiaCard.lean new file mode 100644 index 0000000000..c122d1c403 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/InertiaCard.lean @@ -0,0 +1,69 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRamificationCard +/-! +# Inertia order and ramification index for a chosen local extension + +The residue field of a nonarchimedean local field is finite. A finite +extension of its chosen complete discrete valuation has finite-dimensional +residue field, hence a separable residue extension. This supplies the +residue-separability hypothesis of the general inertia-cardinality theorem. +-/ + +@[expose] public section + +noncomputable +section + +open scoped ValuativeRel +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension + +namespace RamificationTheory.LocalField + +open LocalFieldTheory +open RamificationTheory.HilbertRamification.CompleteDVF + +/-- The inertia group of the chosen valuation ring has order equal to the +ramification index of the chosen finite Galois local extension. -/ +theorem chosenLocalExtension_inertia_card_eq_ramificationIndex + (K L : Type) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + Nat.card + ((chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring.inertiaSubgroup K) = + ramificationIndex (localCompleteDVF K).toDVF + (chosenLocalExtensionCompleteDVF K L).toDVF := by + let base := localCompleteDVF K + let target := chosenLocalExtensionCompleteDVF K L + let : base.valuation.HasExtension target.valuation := + chosenLocalExtensionCompleteDVF_hasExtension K L + let : Module.Finite base.valuationSubring target.valuationSubring := + moduleFinite_target_valuationSubring_of_finite_separable base target + let : FiniteDimensional base.residueField target.residueField := + residueField_finiteDimensional_of_moduleFinite base target + let : Finite base.residueField := by + change Finite 𝓀[K] + infer_instance + let : Algebra.IsAlgebraic base.residueField target.residueField := + Algebra.IsAlgebraic.of_finite _ _ + let : Algebra.IsSeparable base.residueField target.residueField := + inferInstance + let : Algebra.IsSeparable + (base.valuationSubring ⧸ base.maximalIdeal) + (target.valuationSubring ⧸ target.maximalIdeal) := by + change Algebra.IsSeparable base.residueField target.residueField + infer_instance + exact natCard_decompositionInertiaSubgroup_eq_ramificationIndex base target + +end RamificationTheory.LocalField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Unramified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Unramified.lean new file mode 100644 index 0000000000..38caa18eb0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Unramified.lean @@ -0,0 +1,192 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing +/-! +# Ramification groups of unramified local extensions + +This file connects the concrete unramified-valued-extension predicate with +the actual upper ramification groups of a finite local extension. +-/ + +@[expose] public section + +noncomputable +section + +namespace RamificationTheory.LocalField + +open LocalFieldTheory +open RamificationTheory +open RamificationTheory.HilbertRamification +open RamificationTheory.HilbertRamification.Higher +open ValuationTheory.DiscreteValuationField +open ValuationTheory.DiscreteValuationField.ValuedExtension +open scoped ValuativeRel + +/-- The complete-DVF package used by local reciprocity contains the canonical +valuation of the local field. -/ +private theorem localCompleteDVF_valuation_eq_valuativeRel + (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] : + (localCompleteDVF K).valuation = ValuativeRel.valuation K := by + unfold localCompleteDVF + unfold ValuationTheory.Valuations.completeDVFOfCompleteValuedField + rfl + +/-- The inertia group, equivalently the lower ramification group at zero, is +trivial for an actual finite unramified Galois extension of local fields. -/ +private theorem localLowerRamificationGroup_zero_eq_bot_of_unramifiedValuation + (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : + localLowerRamificationGroup K L 0 = ⊥ := by + let base := localCompleteDVF K + let target := localCompleteDVF L + let chosenTarget := chosenLocalExtensionCompleteDVF K L + let hExtTarget : base.valuation.HasExtension target.valuation := by + apply Valuation.HasExtension.ofComapInteger + ext x + change + target.valuation (algebraMap K L x) ≤ 1 ↔ + base.valuation x ≤ 1 + dsimp only [base, target] + rw [localCompleteDVF_valuation_eq_valuativeRel K, + localCompleteDVF_valuation_eq_valuativeRel L] + exact + Valuation.HasExtension.val_map_le_one_iff + (ValuativeRel.valuation K) (ValuativeRel.valuation L) x + let huniqChosen : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + base.toDVF chosenTarget.toDVF := + chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension K L + let huniqTarget : + RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension + base.toDVF target.toDVF := + hasUniqueValuationExtension_of_finite_separable base target + have hvaluationSubring : + chosenTarget.valuation.valuationSubring = + target.valuation.valuationSubring := by + rw [← _root_.Valuation.isEquiv_iff_valuationSubring] + exact + chosenLocalExtensionCompleteDVF_hasUniqueValuationExtension K L + target.valuation + rw [show localLowerRamificationGroup K L 0 = + lowerRamificationGroup + (base := base.toDVF) (target := chosenTarget.toDVF) + huniqChosen 0 by rfl] + rw [lowerRamificationGroup_eq_of_valuationSubring_eq + huniqChosen huniqTarget hvaluationSubring 0] + ext σ + constructor + · intro hσ + have hker : + σ ∈ + (galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L).ker := by + rw [ + galoisGroupResidueAlgEquivHomOfIsIntegralClosure_mem_ker_iff_sub_mem_maximalIdeal + K L σ] + intro x + have hInteger : + target.valuation.valuationSubring.toSubring = + (ValuativeRel.valuation L).integer := by + dsimp only [target] + unfold localCompleteDVF + unfold ValuationTheory.Valuations.completeDVFOfCompleteValuedField + rfl + let eInteger : target.valuationSubring ≃+* 𝒪[L] := + RingEquiv.subringCongr hInteger + let y := eInteger.symm x + have hσ' : + σ ∈ + lowerRamificationGroup + (base := base.toDVF) (target := target.toDVF) + huniqTarget ((0 : ℕ) : ℝ) := by + simpa using hσ + have hx := + (mem_lowerRamificationGroup_nat_iff + (base := base.toDVF) (target := target.toDVF) + huniqTarget 0 σ).1 hσ' y + have hxMaximal : + valuationSubringAutOfUniqueExtension + (base := base.toDVF) (target := target.toDVF) + huniqTarget σ y - y ∈ + target.maximalIdeal := by + simpa only [Nat.zero_add, pow_one] using hx + have hxMapped : + eInteger + (valuationSubringAutOfUniqueExtension + (base := base.toDVF) (target := target.toDVF) + huniqTarget σ y - y) ∈ + (𝓂[L] : Ideal 𝒪[L]) := by + rw [IsLocalRing.mem_maximalIdeal, + map_mem_nonunits_iff eInteger, + ← IsLocalRing.mem_maximalIdeal] + exact hxMaximal + have hunderlying : + eInteger + (valuationSubringAutOfUniqueExtension + (base := base.toDVF) (target := target.toDVF) + huniqTarget σ y - y) = + galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ x - x := by + apply Subtype.ext + rfl + rw [← hunderlying] + exact hxMapped + have hinjective := + galoisGroupResidueAlgEquivHomOfIsIntegralClosure_injective_of_unramifiedValuation + K L + have hσone : σ = 1 := by + apply hinjective + rw [MonoidHom.mem_ker.mp hker, map_one] + change σ = 1 + exact hσone + · intro hσ + change σ = 1 at hσ + subst σ + exact Subgroup.one_mem _ + +/-- Every nonnegative upper ramification group of an actual finite +unramified Galois extension of local fields is trivial. -/ +theorem localUpperRamificationGroup_eq_bot_of_unramifiedValuation + (K L : Type) + [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] + [IsNonarchimedeanLocalField L] + [Algebra K L] [FiniteDimensional K L] [IsGalois K L] + [Valuation.HasExtension + (ValuativeRel.valuation K) (ValuativeRel.valuation L)] + [IsIntegralClosure 𝒪[L] 𝒪[K] L] + [Module.Finite 𝒪[K] 𝒪[L]] + [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (t : ℝ) (ht : 0 ≤ t) : + localUpperRamificationGroup K L t = ⊥ := by + apply le_antisymm + · calc + localUpperRamificationGroup K L t ≤ + localUpperRamificationGroup K L 0 := + localUpperRamificationGroup_antitone K L ht + _ = localLowerRamificationGroup K L 0 := + localUpperRamificationGroup_eq_localLowerRamificationGroup_of_nonpos + K L 0 (by norm_num) + _ = ⊥ := + localLowerRamificationGroup_zero_eq_bot_of_unramifiedValuation K L + · exact bot_le + +end RamificationTheory.LocalField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ProfiniteInvariant.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ProfiniteInvariant.lean new file mode 100644 index 0000000000..48bcdf7d6c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ProfiniteInvariant.lean @@ -0,0 +1,109 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.Galois.Profinite +public import Mathlib.RingTheory.Invariant.Profinite + +/-! # Profinite Invariant -/ + +@[expose] public section +namespace RamificationTheory + +/-! +# Profinite invariant rings: normality on prime residue fields + +The finite invariant-ring API proves that a prime residue extension is +normal. The residue-action exact sequence also needs the corresponding profinite +statement. The proof is the same finite-orbit argument as in this construction: an +element of the discrete ring is fixed by an open normal subgroup, so its +orbit polynomial is computed in a finite quotient. +-/ + +noncomputable +section + +open scoped Pointwise + +variable {A B : Type*} [CommRing A] [CommRing B] [Algebra A B] +variable {G : Type*} [Group G] [MulSemiringAction G B] [SMulCommClass G A B] +variable [TopologicalSpace G] [CompactSpace G] [TotallyDisconnectedSpace G] +variable [IsTopologicalGroup G] [TopologicalSpace B] [DiscreteTopology B] +variable [ContinuousSMul G B] [Algebra.IsInvariant A B G] + +namespace Ideal.Quotient + +attribute [local instance] Ideal.Quotient.field + +include G + +/-- Profinite version of `Ideal.Quotient.normal`. + +Every element has a finite orbit because the action on `B` is continuous and +`B` is discrete. Passing to an open normal subgroup fixing a representative +reduces the splitting calculation to the finite quotient action. -/ +theorem normal_of_profinite + (P : Ideal A) (Q : Ideal B) [P.IsMaximal] [Q.IsMaximal] [Q.LiesOver P] : + Normal (A ⧸ P) (B ⧸ Q) := by + cases subsingleton_or_nontrivial B + · cases ‹Q.IsMaximal›.ne_top (Subsingleton.elim _ _) + have hIntegral : Algebra.IsIntegral A B := + Algebra.IsInvariant.isIntegral_of_profinite (G := G) + constructor + intro x + obtain ⟨x, rfl⟩ := Ideal.Quotient.mk_surjective x + obtain ⟨N, hN⟩ := + ProfiniteGrp.exist_openNormalSubgroup_sub_open_nhds_of_one + (stabilizer_isOpen G x) (MulAction.mem_stabilizer_iff.mpr (one_smul G x)) + let B' := FixedPoints.subalgebra A B N.1.1 + let x' : B' := ⟨x, fun g ↦ hN g.2⟩ + let j : B' →ₐ[A] B := B'.val + have hjx : j x' = x := rfl + let : Algebra.IsInvariant A B' (G ⧸ N.1.1) := inferInstance + cases nonempty_fintype (G ⧸ N.1.1) + obtain ⟨p, hp, _hdegree, hpmonic⟩ := + Polynomial.lifts_and_degree_eq_and_monic + (Algebra.IsInvariant.charpoly_mem_lifts A B' (G ⧸ N.1.1) x') + (MulSemiringAction.monic_charpoly (G ⧸ N.1.1) x') + let qB : B →+* B ⧸ Q := Ideal.Quotient.mk Q + let qB' : B' →+* B ⧸ Q := qB.comp j.toRingHom + have hroot : Polynomial.aeval (Ideal.Quotient.mk Q x) + (p.map (algebraMap A (A ⧸ P))) = 0 := by + rw [Polynomial.aeval_def, ← Polynomial.eval_map] + have hmap : + (p.map (algebraMap A B')).map qB' = + p.map ((algebraMap (A ⧸ P) (B ⧸ Q)).comp + (Ideal.Quotient.mk P)) := by + rw [Polynomial.map_map] + apply congrArg (fun f : A →+* B ⧸ Q ↦ p.map f) + ext a + rfl + calc + Polynomial.eval (Ideal.Quotient.mk Q x) + ((p.map (algebraMap A (A ⧸ P))).map + (algebraMap (A ⧸ P) (B ⧸ Q))) = + Polynomial.eval (Ideal.Quotient.mk Q x) + ((p.map (algebraMap A B')).map qB') := by + rw [hmap, Polynomial.map_map, Ideal.Quotient.algebraMap_eq] + _ = 0 := by + rw [hp, show Ideal.Quotient.mk Q x = qB' x' from rfl, + Polynomial.eval_map_apply, MulSemiringAction.eval_charpoly, map_zero] + have hdiv := minpoly.dvd (A ⧸ P) (Ideal.Quotient.mk Q x) + (p := p.map (algebraMap A (A ⧸ P))) hroot + refine Polynomial.Splits.of_dvd ?_ ?_ ((Polynomial.map_dvd_map' _).mpr hdiv) + · rw [Polynomial.map_map, ← IsScalarTower.algebraMap_eq, + IsScalarTower.algebraMap_eq A B', ← Polynomial.map_map, hp, + MulSemiringAction.charpoly_eq, Polynomial.map_prod] + exact Polynomial.Splits.prod + (fun _ _ ↦ (Polynomial.Splits.X_sub_C _).map _) + · exact ((hpmonic.map _).map _).ne_zero + +end Ideal.Quotient + +end + +end RamificationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation.lean new file mode 100644 index 0000000000..cc4fb6ae71 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation.lean @@ -0,0 +1,20 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.HenselLemma +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.UniqueRing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.ValuedAdicComplete + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue.lean new file mode 100644 index 0000000000..34b6bd35ba --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue.lean @@ -0,0 +1,23 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ExponentialValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Ostrowski +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.PrincipalAdicCompleteness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.SpectralExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension.lean new file mode 100644 index 0000000000..b160c93463 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/Core.lean new file mode 100644 index 0000000000..e170623cda --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/Core.lean @@ -0,0 +1,512 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Ostrowski +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.SpectralExtension +public import Mathlib.RingTheory.Complex +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +/-! +# Unique extension to algebraic field extensions + +A nontrivial real-valued absolute value on a complete field extends uniquely to +every algebraic field extension. Both the archimedean and nonarchimedean +branches are included. +-/ + +@[expose] public section + +noncomputable +section + +namespace AbsoluteValue + +private abbrev algebraicExtension_standardRealAbsoluteValue : AbsoluteValue ℝ ℝ := + NormedField.toAbsoluteValue ℝ + +/-- archimedean standard branch: the usual absolute value on +`ℂ`. -/ +private abbrev algebraicExtension_standardComplexAbsoluteValue : AbsoluteValue ℂ ℝ := + NormedField.toAbsoluteValue ℂ + +/-- If `0 < s ≤ 1`, the `s`-power of a real-valued absolute value is again a +real-valued absolute value. This is the exponent transport needed for the +archimedean branch after Ostrowski's theorem. -/ +noncomputable def rpow + {F : Type*} [Field F] (v : AbsoluteValue F ℝ) + (s : ℝ) (hs0 : 0 < s) (hs1 : s ≤ 1) : AbsoluteValue F ℝ where + toFun x := v x ^ s + map_mul' x y := by + rw [v.map_mul, Real.mul_rpow (v.nonneg x) (v.nonneg y)] + nonneg' x := Real.rpow_nonneg (v.nonneg x) s + eq_zero' x := by + rw [Real.rpow_eq_zero (v.nonneg x) hs0.ne'] + exact v.eq_zero + add_le' x y := by + calc + v (x + y) ^ s ≤ (v x + v y) ^ s := + Real.rpow_le_rpow (v.nonneg _) (v.add_le x y) hs0.le + _ ≤ v x ^ s + v y ^ s := + Real.rpow_add_le_add_rpow (v.nonneg x) (v.nonneg y) hs0.le hs1 + +/-- Raising an absolute value to a real power evaluates by real exponentiation. -/ +@[simp] +theorem rpow_apply + {F : Type*} [Field F] (v : AbsoluteValue F ℝ) + (s : ℝ) (hs0 : 0 < s) (hs1 : s ≤ 1) (x : F) : + rpow v s hs0 hs1 x = v x ^ s := + rfl + +/-- A positive real power of a nonarchimedean absolute value is again an +absolute value. + +Unlike `AbsoluteValue.rpow`, no upper bound on the exponent is needed here: +the ultrametric inequality is preserved by every strictly increasing positive +power. This is the normalization operation for a nonarchimedean valuation +class. -/ +noncomputable def nonarchimedeanRpow + {F : Type*} [Field F] (v : AbsoluteValue F ℝ) + (hv : IsNonarchimedean (v : F → ℝ)) + (s : ℝ) (hs : 0 < s) : AbsoluteValue F ℝ where + toFun x := v x ^ s + map_mul' x y := by + rw [v.map_mul, Real.mul_rpow (v.nonneg x) (v.nonneg y)] + nonneg' x := Real.rpow_nonneg (v.nonneg x) s + eq_zero' x := by + rw [Real.rpow_eq_zero (v.nonneg x) hs.ne'] + exact v.eq_zero + add_le' x y := by + rcases le_total (v x) (v y) with hxy | hyx + · calc + v (x + y) ^ s ≤ v y ^ s := by + apply Real.rpow_le_rpow (v.nonneg _) + · simpa [max_eq_right hxy] using hv x y + · exact hs.le + _ ≤ v x ^ s + v y ^ s := + le_add_of_nonneg_left (Real.rpow_nonneg (v.nonneg x) s) + · calc + v (x + y) ^ s ≤ v x ^ s := by + apply Real.rpow_le_rpow (v.nonneg _) + · simpa [max_eq_left hyx] using hv x y + · exact hs.le + _ ≤ v x ^ s + v y ^ s := + le_add_of_nonneg_right (Real.rpow_nonneg (v.nonneg y) s) + +@[simp] +theorem nonarchimedeanRpow_apply + {F : Type*} [Field F] (v : AbsoluteValue F ℝ) + (hv : IsNonarchimedean (v : F → ℝ)) + (s : ℝ) (hs : 0 < s) (x : F) : + nonarchimedeanRpow v hv s hs x = v x ^ s := + rfl + +/-- Positive-power normalization does not change the underlying +nonarchimedean valuation class. -/ +theorem isEquiv_nonarchimedeanRpow + {F : Type*} [Field F] (v : AbsoluteValue F ℝ) + (hv : IsNonarchimedean (v : F → ℝ)) + (s : ℝ) (hs : 0 < s) : + v.IsEquiv (nonarchimedeanRpow v hv s hs) := by + rw [AbsoluteValue.isEquiv_iff_exists_rpow_eq] + exact ⟨s, hs, rfl⟩ + +/-- The usual complex absolute value restricts to the usual real absolute value. -/ +private theorem algebraicExtension_standardComplexAbsoluteValue_extends_standardReal + (x : ℝ) : + algebraicExtension_standardComplexAbsoluteValue (algebraMap ℝ ℂ x) = + algebraicExtension_standardRealAbsoluteValue x := by + change ‖(algebraMap ℝ ℂ x)‖ = ‖x‖ + simp + +/-- Pull back an absolute value along a `K`-algebra equivalence. This is the +transport step used after the archimedean classification identifies a complete +archimedean field with `ℝ` or `ℂ`. -/ +noncomputable def compAlgEquiv + {K L E : Type*} [Field K] [Field L] [Field E] + [Algebra K L] [Algebra K E] (e : L ≃ₐ[K] E) + (w : AbsoluteValue E ℝ) : AbsoluteValue L ℝ := + w.comp (f := e.toRingHom) e.injective + +/-- Composition with an algebra equivalence evaluates the absolute value after transport. -/ +@[simp] +theorem compAlgEquiv_apply + {K L E : Type*} [Field K] [Field L] [Field E] + [Algebra K L] [Algebra K E] (e : L ≃ₐ[K] E) + (w : AbsoluteValue E ℝ) (x : L) : + compAlgEquiv e w x = w (e x) := + rfl + +/-- Transporting an extending absolute value along an algebra equivalence preserves extension. -/ +theorem compAlgEquiv_extends_apply + {K L E : Type*} [Field K] [Field L] [Field E] + [Algebra K L] [Algebra K E] (e : L ≃ₐ[K] E) + (w : AbsoluteValue E ℝ) (v : AbsoluteValue K ℝ) + (hw : ∀ x : K, w (algebraMap K E x) = v x) + (x : K) : + compAlgEquiv e w (algebraMap K L x) = + v x := by + change w (e (algebraMap K L x)) = v x + rw [AlgEquiv.commutes, hw] + +/-- Pullback along an algebra equivalence preserves exact extension of the base value. -/ +theorem compAlgEquiv_extends + {K L E : Type*} [Field K] [Field L] [Field E] + [Algebra K L] [Algebra K E] (e : L ≃ₐ[K] E) + (w : AbsoluteValue E ℝ) (v : AbsoluteValue K ℝ) + (hw : Extends v w) : + Extends v (compAlgEquiv e w) := + compAlgEquiv_extends_apply e w v hw + +/-- Completeness is preserved when an absolute value is pulled back along an +algebra equivalence. -/ +theorem compAlgEquiv_complete + {K L E : Type*} [Field K] [Field L] [Field E] + [Algebra K L] [Algebra K E] (e : L ≃ₐ[K] E) + (w : AbsoluteValue E ℝ) + (hwcomplete : CompleteSpace (WithAbs w)) : + CompleteSpace (WithAbs (compAlgEquiv e w)) := by + let e' : WithAbs (compAlgEquiv e w) ≃ WithAbs w := + (WithAbs.congr (compAlgEquiv e w) w e.toRingEquiv).toEquiv + have he' : Isometry e' := by + apply Isometry.of_dist_eq + intro x y + rw [dist_eq_norm, dist_eq_norm] + rw [WithAbs.norm_eq_apply_ofAbs, WithAbs.norm_eq_apply_ofAbs] + dsimp only [e'] + rw [WithAbs.ofAbs_sub, WithAbs.ofAbs_sub] + change w (e x.ofAbs - e y.ofAbs) = + w (e (x.ofAbs - y.ofAbs)) + exact congrArg w (map_sub e x.ofAbs y.ofAbs).symm + exact (completeSpace_congr he'.isUniformEmbedding).2 hwcomplete + +private theorem algebraicExtension_real_algEquiv_real_unique_rpow_extension + {L : Type*} [Field L] [Algebra ℝ L] (e : L ≃ₐ[ℝ] ℝ) + (s : ℝ) (hs0 : 0 < s) (hs1 : s ≤ 1) + (w : AbsoluteValue L ℝ) + (hw : ∀ x : ℝ, w (algebraMap ℝ L x) = + algebraicExtension_standardRealAbsoluteValue x ^ s) : + w = rpow + (compAlgEquiv + e algebraicExtension_standardRealAbsoluteValue) + s hs0 hs1 := by + ext x + have hx : x = algebraMap ℝ L (e x) := by + calc + x = e.symm (e x) := by simp + _ = algebraMap ℝ L (e x) := by + simpa using (AlgEquiv.commutes e.symm (e x)) + rw [hx, hw] + exact congrArg (fun t : ℝ => t ^ s) + (compAlgEquiv_extends_apply e + algebraicExtension_standardRealAbsoluteValue algebraicExtension_standardRealAbsoluteValue + (fun x => rfl) (e x)).symm + +/-- In the `ℂ` branch over `ℝ`, the `s`-power of the usual complex absolute +value is the unique extension of the `s`-power of the usual real absolute +value. -/ +private theorem algebraicExtension_real_algEquiv_complex_unique_rpow_extension + {L : Type*} [Field L] [Algebra ℝ L] (e : L ≃ₐ[ℝ] ℂ) + (s : ℝ) (hs0 : 0 < s) (hs1 : s ≤ 1) + (w : AbsoluteValue L ℝ) + (hw : ∀ x : ℝ, w (algebraMap ℝ L x) = + algebraicExtension_standardRealAbsoluteValue x ^ s) : + w = rpow + (compAlgEquiv + e algebraicExtension_standardComplexAbsoluteValue) + s hs0 hs1 := by + let e' : WithAbs w ≃ₐ[ℝ] ℂ := + (WithAbs.algEquiv ℝ w).trans e + have hnorm : + ∀ r : ℝ, ‖algebraMap ℝ (WithAbs w) r‖ = ‖r‖ ^ s := by + intro r + rw [WithAbs.norm_eq_apply_ofAbs, WithAbs.algebraMap_right_apply] + change w (algebraMap ℝ L r) = + algebraicExtension_standardRealAbsoluteValue r ^ s + exact hw r + ext x + let y : WithAbs w := WithAbs.toAbs w x + change w x = ‖e x‖ ^ s + calc + w x = ‖y‖ := by + simp [y, WithAbs.norm_eq_apply_ofAbs] + _ = ‖e'.symm (e' y)‖ := by simp + _ = ‖e' y‖ ^ s := + AlgEquiv.norm_symm_apply_eq_norm_rpow + (F := WithAbs w) (s := s) hs0 hnorm e' (e' y) + _ = ‖e x‖ ^ s := by simp [y, e'] + +/-- Over `ℂ`, an absolute value extending the `s`-power of the usual complex +absolute value is the transported `s`-power. -/ +private theorem algebraicExtension_complex_algEquiv_complex_unique_rpow_extension + {L : Type*} [Field L] [Algebra ℂ L] (e : L ≃ₐ[ℂ] ℂ) + (s : ℝ) (hs0 : 0 < s) (hs1 : s ≤ 1) + (w : AbsoluteValue L ℝ) + (hw : ∀ z : ℂ, w (algebraMap ℂ L z) = + algebraicExtension_standardComplexAbsoluteValue z ^ s) : + w = rpow + (compAlgEquiv + e algebraicExtension_standardComplexAbsoluteValue) + s hs0 hs1 := by + ext x + have hx : x = algebraMap ℂ L (e x) := by + calc + x = e.symm (e x) := by simp + _ = algebraMap ℂ L (e x) := by + simpa using (AlgEquiv.commutes e.symm (e x)) + rw [hx, hw] + exact congrArg (fun t : ℝ => t ^ s) + (compAlgEquiv_extends_apply e + algebraicExtension_standardComplexAbsoluteValue + algebraicExtension_standardComplexAbsoluteValue + (fun z => rfl) (e x)).symm + +/-- A chosen absolute-value extension together with its uniqueness property. -/ +structure UniqueExtension + {K L : Type*} [Field K] [Field L] [Algebra K L] + (v : AbsoluteValue K ℝ) where + /-- The chosen absolute value on the extension field. -/ + extension : AbsoluteValue L ℝ + /-- The chosen absolute value restricts to the given base absolute value. -/ + isExtension : Extends v extension + /-- Every extension of the base absolute value equals the chosen one. -/ + unique : + ∀ w : AbsoluteValue L ℝ, + Extends v w → w = extension + +private noncomputable def algebraicExtension_realRpow + {L : Type*} [Field L] [Algebra ℝ L] [Algebra.IsAlgebraic ℝ L] + (s : ℝ) (hs0 : 0 < s) (hs1 : s ≤ 1) : + UniqueExtension (K := ℝ) (L := L) + (rpow + algebraicExtension_standardRealAbsoluteValue s hs0 hs1) := + Classical.choice <| by + rcases Real.nonempty_algEquiv_or L with hreal | hcomplex + · rcases hreal with ⟨e⟩ + exact ⟨ + { extension := + rpow + (compAlgEquiv + e algebraicExtension_standardRealAbsoluteValue) + s hs0 hs1 + isExtension := by + intro x + simp only [rpow_apply] + rw [compAlgEquiv_extends_apply e + algebraicExtension_standardRealAbsoluteValue + algebraicExtension_standardRealAbsoluteValue (fun x => rfl) x] + unique := + algebraicExtension_real_algEquiv_real_unique_rpow_extension + e s hs0 hs1 }⟩ + · rcases hcomplex with ⟨e⟩ + exact ⟨ + { extension := + rpow + (compAlgEquiv + e algebraicExtension_standardComplexAbsoluteValue) + s hs0 hs1 + isExtension := by + intro x + simp only [rpow_apply] + rw [compAlgEquiv_extends_apply e + algebraicExtension_standardComplexAbsoluteValue + algebraicExtension_standardRealAbsoluteValue + algebraicExtension_standardComplexAbsoluteValue_extends_standardReal x] + unique := + algebraicExtension_real_algEquiv_complex_unique_rpow_extension + e s hs0 hs1 }⟩ + +/-- archimedean `s`-power theorem over `ℂ`: every algebraic +extension of `ℂ` has a unique absolute value extending `|z|^s`, for +`0 < s ≤ 1`. -/ +private noncomputable def algebraicExtension_complexRpow + {L : Type*} [Field L] [Algebra ℂ L] [Algebra.IsAlgebraic ℂ L] + (s : ℝ) (hs0 : 0 < s) (hs1 : s ≤ 1) : + UniqueExtension (K := ℂ) (L := L) + (rpow + algebraicExtension_standardComplexAbsoluteValue s hs0 hs1) := by + letI : Algebra.IsIntegral ℂ L := Algebra.IsAlgebraic.isIntegral + let e0 : ℂ ≃ₐ[ℂ] L := + AlgEquiv.ofBijective (Algebra.ofId ℂ L) + (IsAlgClosed.algebraMap_bijective_of_isIntegral (k := ℂ) (K := L)) + let e : L ≃ₐ[ℂ] ℂ := e0.symm + exact + { extension := + rpow + (compAlgEquiv + e algebraicExtension_standardComplexAbsoluteValue) + s hs0 hs1 + isExtension := by + intro z + simp only [rpow_apply] + rw [compAlgEquiv_extends_apply e + algebraicExtension_standardComplexAbsoluteValue + algebraicExtension_standardComplexAbsoluteValue (fun z => rfl) z] + unique := + algebraicExtension_complex_algEquiv_complex_unique_rpow_extension + e s hs0 hs1 } + +/-- Algebraicity is preserved under transport of the base field by a ring equivalence. -/ +private theorem algebraicExtension_isAlgebraic_of_base_ringEquiv + {K E L : Type*} [Field K] [Field E] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] (σ : K ≃+* E) : + letI : Algebra E K := RingHom.toAlgebra σ.symm.toRingHom + letI : Algebra E L := + RingHom.toAlgebra ((algebraMap K L).comp σ.symm.toRingHom) + Algebra.IsAlgebraic E L := by + let : Algebra E K := RingHom.toAlgebra σ.symm.toRingHom + let : Algebra E L := + RingHom.toAlgebra ((algebraMap K L).comp σ.symm.toRingHom) + have : IsScalarTower E K L := + IsScalarTower.of_algebraMap_eq (fun r => by + simp [RingHom.algebraMap_toAlgebra]) + let e : K ≃ₐ[E] E := AlgEquiv.ofRingEquiv (f := σ) (by + intro r + simp [RingHom.algebraMap_toAlgebra]) + have : Algebra.IsAlgebraic E K := e.symm.isAlgebraic + exact Algebra.IsAlgebraic.trans E K L + +/-- Transport a unique algebraic absolute-value extension after replacing the +base field by a ring-equivalent field; the top algebra structure is +transported along the same equivalence. -/ +private noncomputable def algebraicExtension_baseRingEquiv + {K E L : Type*} [Field K] [Field E] [Field L] [Algebra K L] + (σ : K ≃+* E) (vK : AbsoluteValue K ℝ) (vE : AbsoluteValue E ℝ) + (hvσ : ∀ x : K, vE (σ x) = vK x) + (R : + letI : Algebra E L := + RingHom.toAlgebra ((algebraMap K L).comp σ.symm.toRingHom) + UniqueExtension (K := E) (L := L) vE) : + UniqueExtension (K := K) (L := L) vK := by + letI : Algebra E L := + RingHom.toAlgebra ((algebraMap K L).comp σ.symm.toRingHom) + exact + { extension := R.extension + isExtension := by + intro x + have hbase := R.isExtension (σ x) + have hmap : + algebraMap E L (σ x) = algebraMap K L x := by + simp [RingHom.algebraMap_toAlgebra] + calc + R.extension (algebraMap K L x) + = R.extension (algebraMap E L (σ x)) := by rw [hmap] + _ = vE (σ x) := hbase + _ = vK x := hvσ x + unique := by + intro w hw + apply R.unique w + intro z + have hmap : + algebraMap E L z = algebraMap K L (σ.symm z) := by + simp [RingHom.algebraMap_toAlgebra] + calc + w (algebraMap E L z) + = w (algebraMap K L (σ.symm z)) := by rw [hmap] + _ = vK (σ.symm z) := hw (σ.symm z) + _ = vE z := by + simpa using (hvσ (σ.symm z)).symm } + +/-- The archimedean branch of the unique algebraic-extension construction. -/ +noncomputable def algebraicExtensionArchimedean + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) + (hcomplete : CompleteSpace (WithAbs v)) + (harch : ¬ IsNonarchimedean (v : K → ℝ)) : + UniqueExtension (K := K) (L := L) v := + Classical.choice <| by + classical + let : CharZero K := AbsoluteValue.charZero_of_not_isNonarchimedean v harch + rcases AbsoluteValue.ostrowski_of_complete v hcomplete harch with + ⟨s, hs0, hs1, hbranch⟩ + rcases hbranch with hreal | hcomplex + · rcases hreal with ⟨σ, hσ⟩ + let : Algebra ℝ K := RingHom.toAlgebra σ.symm.toRingHom + let : Algebra ℝ L := + RingHom.toAlgebra ((algebraMap K L).comp σ.symm.toRingHom) + have : Algebra.IsAlgebraic ℝ L := + algebraicExtension_isAlgebraic_of_base_ringEquiv (K := K) (E := ℝ) + (L := L) σ + let R := + algebraicExtension_realRpow + (L := L) s hs0 hs1 + exact ⟨ + algebraicExtension_baseRingEquiv + (K := K) (E := ℝ) (L := L) σ v + (rpow + algebraicExtension_standardRealAbsoluteValue s hs0 hs1) + (fun x => (hσ x).symm) R⟩ + · rcases hcomplex with ⟨σ, hσ⟩ + let : Algebra ℂ K := RingHom.toAlgebra σ.symm.toRingHom + let : Algebra ℂ L := + RingHom.toAlgebra ((algebraMap K L).comp σ.symm.toRingHom) + have : Algebra.IsAlgebraic ℂ L := + algebraicExtension_isAlgebraic_of_base_ringEquiv (K := K) (E := ℂ) + (L := L) σ + let R := + algebraicExtension_complexRpow + (L := L) s hs0 hs1 + exact ⟨ + algebraicExtension_baseRingEquiv + (K := K) (E := ℂ) (L := L) σ v + (rpow + algebraicExtension_standardComplexAbsoluteValue s hs0 hs1) + (fun x => (hσ x).symm) R⟩ + +/-- nonarchimedean algebraic-extension theorem: +existence and uniqueness of the extension over any algebraic extension. -/ +noncomputable def algebraicExtensionNonarchimedean + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) + (hcomplete : CompleteSpace (WithAbs v)) + (hnonarch : IsNonarchimedean (v : K → ℝ)) + (hv : v.IsNontrivial) : + UniqueExtension (K := K) (L := L) v where + extension := + spectralExtension (K := K) (L := L) + v hcomplete hnonarch hv + isExtension := + spectralExtension_extends + (K := K) (L := L) v hcomplete hnonarch hv + unique := + eq_spectralExtension_of_extends + (K := K) (L := L) v hcomplete hnonarch hv + +/-- algebraic-extension theorem for the nontrivial +valuations: a complete valued field has a unique absolute-value extension to +every algebraic extension. The proof splits into the archimedean branch above +and the nonarchimedean spectral branch. -/ +noncomputable def uniqueAlgebraicExtension + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) + (hcomplete : CompleteSpace (WithAbs v)) + (hv : v.IsNontrivial) : + UniqueExtension (K := K) (L := L) v := by + by_cases hnonarch : IsNonarchimedean (v : K → ℝ) + · exact algebraicExtensionNonarchimedean + v hcomplete hnonarch hv + · exact algebraicExtensionArchimedean + v hcomplete hnonarch + + +/-- Existence and uniqueness as a unique-existence statement. -/ +theorem existsUnique_extends_of_isAlgebraic + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) + (hcomplete : CompleteSpace (WithAbs v)) + (hv : v.IsNontrivial) : + ∃! w : AbsoluteValue L ℝ, Extends v w := by + let R := uniqueAlgebraicExtension (K := K) (L := L) v hcomplete hv + exact ⟨R.extension, R.isExtension, fun w hw => R.unique w hw⟩ + +end AbsoluteValue + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/FiniteNormExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/FiniteNormExtension.lean new file mode 100644 index 0000000000..8aab75f94e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/FiniteNormExtension.lean @@ -0,0 +1,1280 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring +public import Mathlib.Analysis.Normed.Unbundled.SpectralNorm +public import Mathlib.RingTheory.Norm.Transitivity +public import Mathlib.RingTheory.Complex +/-! +# Finite-extension norm formula for complete valuations + +The nonarchimedean branch uses mathlib's spectral norm. The archimedean branch +uses the completed Ostrowski theorem, reducing the statement to the +standard `ℝ` and `ℂ` absolute values. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- the finite-degree norm construction, archimedean standard branch: the usual absolute value on +`ℝ`, bundled in the same `AbsoluteValue` API as the rest of the absolute-value construction. -/ +private abbrev finiteStandardRealAbsoluteValue : AbsoluteValue ℝ ℝ := + NormedField.toAbsoluteValue ℝ + +/-- the finite-degree norm construction, archimedean standard branch: the usual absolute value on +`ℂ`. -/ +private abbrev finiteStandardComplexAbsoluteValue : AbsoluteValue ℂ ℝ := + NormedField.toAbsoluteValue ℂ + + +/-- Taking a positive `s`-power of an absolute value does not change its +uniformity. -/ +private theorem finiteRpowUniformSpaceEq + {F : Type*} [Field F] (v : AbsoluteValue F ℝ) + (s : ℝ) (hs0 : 0 < s) (hs1 : s ≤ 1) : + (AbsoluteValue.rpow v s hs0 hs1).uniformSpace = + v.uniformSpace := by + apply le_antisymm + · exact + ((AbsoluteValue.hasBasis_uniformity + (AbsoluteValue.rpow v s hs0 hs1)).le_basis_iff + (AbsoluteValue.hasBasis_uniformity v)).2 (by + intro ε hε + refine ⟨ε ^ s, Real.rpow_pos_of_pos hε s, ?_⟩ + intro p hp + change v (p.2 - p.1) ^ s < ε ^ s at hp + exact (Real.rpow_lt_rpow_iff (v.nonneg _) (le_of_lt hε) hs0).1 hp) + · exact + ((AbsoluteValue.hasBasis_uniformity v).le_basis_iff + (AbsoluteValue.hasBasis_uniformity + (AbsoluteValue.rpow v s hs0 hs1))).2 (by + intro ε hε + refine ⟨ε ^ s⁻¹, Real.rpow_pos_of_pos hε s⁻¹, ?_⟩ + intro p hp + change v (p.2 - p.1) < ε ^ s⁻¹ at hp + change v (p.2 - p.1) ^ s < ε + have hpow : + v (p.2 - p.1) ^ s < (ε ^ s⁻¹) ^ s := + Real.rpow_lt_rpow (v.nonneg _) hp hs0 + have hεpow : (ε ^ s⁻¹) ^ s = ε := by + rw [← Real.rpow_mul (le_of_lt hε) s⁻¹ s, + inv_mul_cancel₀ hs0.ne', Real.rpow_one] + simpa [hεpow] using hpow) + +/-- Completeness is unchanged by taking a positive `s`-power of an absolute +value. -/ +private theorem finiteRpowCompleteIff + {F : Type*} [Field F] (v : AbsoluteValue F ℝ) + (s : ℝ) (hs0 : 0 < s) (hs1 : s ≤ 1) : + IsCompleteForAbsoluteValue + (AbsoluteValue.rpow v s hs0 hs1) ↔ + IsCompleteForAbsoluteValue v := by + dsimp [IsCompleteForAbsoluteValue] + rw [finiteRpowUniformSpaceEq v s hs0 hs1] + +/-- The absolute value underlying a complete normed field is complete. -/ +private theorem finiteStandardComplete + (F : Type*) [NormedField F] [CompleteSpace F] : + IsCompleteForAbsoluteValue (NormedField.toAbsoluteValue F) := by + apply (absoluteValueCompleteness_completeSpace_withAbs_iff_complete _).1 + let e : WithAbs (NormedField.toAbsoluteValue F) ≃ᵢ F := + { toEquiv := (WithAbs.equiv _).toEquiv + isometry_toFun := by + rw [isometry_iff_dist_eq] + intro x y + simp only [dist_eq_norm_sub, WithAbs.norm_eq_apply_ofAbs, + WithAbs.ofAbs_sub] + rfl } + exact e.completeSpace + +/-- The standard real absolute value is complete. -/ +private theorem finiteStandardRealComplete : + IsCompleteForAbsoluteValue finiteStandardRealAbsoluteValue := + finiteStandardComplete ℝ + +/-- The standard complex absolute value is complete. -/ +private theorem finiteStandardComplexComplete : + IsCompleteForAbsoluteValue finiteStandardComplexAbsoluteValue := + finiteStandardComplete ℂ + +/-- The `s`-power of the standard real absolute value is complete. -/ +private theorem finiteStandardRealRpowComplete + (s : ℝ) (hs0 : 0 < s) (hs1 : s ≤ 1) : + IsCompleteForAbsoluteValue + (AbsoluteValue.rpow + finiteStandardRealAbsoluteValue s hs0 hs1) := + (finiteRpowCompleteIff + finiteStandardRealAbsoluteValue s hs0 hs1).2 + finiteStandardRealComplete + +/-- The `s`-power of the standard complex absolute value is complete. -/ +private theorem finiteStandardComplexRpowComplete + (s : ℝ) (hs0 : 0 < s) (hs1 : s ≤ 1) : + IsCompleteForAbsoluteValue + (AbsoluteValue.rpow + finiteStandardComplexAbsoluteValue s hs0 hs1) := + (finiteRpowCompleteIff + finiteStandardComplexAbsoluteValue s hs0 hs1).2 + finiteStandardComplexComplete + +/-- the finite-degree norm construction, archimedean standard branch: the usual complex absolute +value extends the usual real absolute value. -/ +private theorem finiteStandardComplexExtendsReal + (x : ℝ) : + finiteStandardComplexAbsoluteValue (algebraMap ℝ ℂ x) = + finiteStandardRealAbsoluteValue x := by + change ‖(algebraMap ℝ ℂ x)‖ = ‖x‖ + simp + + +/-- Completeness is preserved when an absolute value is pulled back along an +algebra equivalence. -/ +private theorem finiteCompAlgEquivComplete + {K L E : Type*} [Field K] [Field L] [Field E] + [Algebra K L] [Algebra K E] (e : L ≃ₐ[K] E) + (w : AbsoluteValue E ℝ) + (hwcomplete : IsCompleteForAbsoluteValue w) : + IsCompleteForAbsoluteValue + (AbsoluteValue.compAlgEquiv e w) := + (absoluteValueCompleteness_completeSpace_withAbs_iff_complete _).1 + (AbsoluteValue.compAlgEquiv_complete e w + (completeSpace_withAbs_of_isCompleteForAbsoluteValue w hwcomplete)) + +/-- In the `ℝ` branch, an absolute value extending the `s`-power of the +standard real absolute value is the `s`-power of the transported standard +absolute value. -/ +private theorem finiteRealAlgEquivRealUniqueRpowExtension + {L : Type*} [Field L] [Algebra ℝ L] (e : L ≃ₐ[ℝ] ℝ) + (s : ℝ) (hs0 : 0 < s) (hs1 : s ≤ 1) + (w : AbsoluteValue L ℝ) + (hw : ∀ x : ℝ, w (algebraMap ℝ L x) = + finiteStandardRealAbsoluteValue x ^ s) : + w = AbsoluteValue.rpow + (AbsoluteValue.compAlgEquiv + e finiteStandardRealAbsoluteValue) + s hs0 hs1 := by + ext x + have hx : x = algebraMap ℝ L (e x) := by + calc + x = e.symm (e x) := by simp + _ = algebraMap ℝ L (e x) := by + simpa using (AlgEquiv.commutes e.symm (e x)) + rw [hx, hw] + exact congrArg (fun t : ℝ => t ^ s) + (AbsoluteValue.compAlgEquiv_extends_apply e + finiteStandardRealAbsoluteValue finiteStandardRealAbsoluteValue + (fun x => rfl) (e x)).symm + +/-- In the `ℂ` branch over `ℝ`, the `s`-power of the usual complex absolute +value is the unique extension of the `s`-power of the usual real absolute +value. -/ +private theorem finiteRealAlgEquivComplexUniqueRpowExtension + {L : Type*} [Field L] [Algebra ℝ L] (e : L ≃ₐ[ℝ] ℂ) + (s : ℝ) (hs0 : 0 < s) (hs1 : s ≤ 1) + (w : AbsoluteValue L ℝ) + (hw : ∀ x : ℝ, w (algebraMap ℝ L x) = + finiteStandardRealAbsoluteValue x ^ s) : + w = AbsoluteValue.rpow + (AbsoluteValue.compAlgEquiv + e finiteStandardComplexAbsoluteValue) + s hs0 hs1 := by + let : Algebra ℝ (WithAbs w) := inferInstance + let e' : WithAbs w ≃ₐ[ℝ] ℂ := + (WithAbs.algEquiv ℝ w).trans e + have hnorm : + ∀ r : ℝ, ‖algebraMap ℝ (WithAbs w) r‖ = ‖r‖ ^ s := by + intro r + rw [WithAbs.norm_eq_apply_ofAbs, WithAbs.algebraMap_right_apply] + change w (algebraMap ℝ L r) = + finiteStandardRealAbsoluteValue r ^ s + exact hw r + ext x + let y : WithAbs w := WithAbs.toAbs w x + change w x = ‖e x‖ ^ s + calc + w x = ‖y‖ := by + simp [y, WithAbs.norm_eq_apply_ofAbs] + _ = ‖e'.symm (e' y)‖ := by simp + _ = ‖e' y‖ ^ s := + AlgEquiv.norm_symm_apply_eq_norm_rpow + (F := WithAbs w) (s := s) hs0 hnorm e' (e' y) + _ = ‖e x‖ ^ s := by simp [y, e'] + +/-- Over `ℂ`, an absolute value extending the `s`-power of the usual complex +absolute value is the transported `s`-power. -/ +private theorem finiteComplexAlgEquivComplexUniqueRpowExtension + {L : Type*} [Field L] [Algebra ℂ L] (e : L ≃ₐ[ℂ] ℂ) + (s : ℝ) (hs0 : 0 < s) (hs1 : s ≤ 1) + (w : AbsoluteValue L ℝ) + (hw : ∀ z : ℂ, w (algebraMap ℂ L z) = + finiteStandardComplexAbsoluteValue z ^ s) : + w = AbsoluteValue.rpow + (AbsoluteValue.compAlgEquiv + e finiteStandardComplexAbsoluteValue) + s hs0 hs1 := by + ext x + have hx : x = algebraMap ℂ L (e x) := by + calc + x = e.symm (e x) := by simp + _ = algebraMap ℂ L (e x) := by + simpa using (AlgEquiv.commutes e.symm (e x)) + rw [hx, hw] + exact congrArg (fun t : ℝ => t ^ s) + (AbsoluteValue.compAlgEquiv_extends_apply e + finiteStandardComplexAbsoluteValue finiteStandardComplexAbsoluteValue + (fun z => rfl) (e x)).symm + +/-- the finite-degree norm construction, archimedean standard branch over `ℝ | ℝ`: the +construction's +finite norm formula in degree one is the usual real absolute value. -/ +private theorem finiteNormExtension_real_self_normFormulaValue_eq_standard + (x : ℝ) : + finiteExtensionNormFormulaValue (K := ℝ) (L := ℝ) + finiteStandardRealAbsoluteValue x = + finiteStandardRealAbsoluteValue x := by + rw [finiteExtensionNormFormulaValue, Module.finrank_self ℝ] + simp + +/-- the finite-degree norm construction, archimedean standard branch over `ℂ | ℂ`: the +construction's +finite norm formula in degree one is the usual complex absolute value. -/ +private theorem finiteNormExtension_complex_self_normFormulaValue_eq_standard + (z : ℂ) : + finiteExtensionNormFormulaValue (K := ℂ) (L := ℂ) + finiteStandardComplexAbsoluteValue z = + finiteStandardComplexAbsoluteValue z := by + rw [finiteExtensionNormFormulaValue, Module.finrank_self ℂ] + simp + +/-- the finite-degree norm construction, archimedean standard branch over `ℂ | ℝ`: the +construction's +finite norm formula `|N_{ℂ/ℝ}(z)|^(1/2)` is the usual complex absolute value. -/ +private theorem finiteNormExtension_real_complex_normFormulaValue_eq_standard + (z : ℂ) : + finiteExtensionNormFormulaValue (K := ℝ) (L := ℂ) + finiteStandardRealAbsoluteValue z = + finiteStandardComplexAbsoluteValue z := by + rw [finiteExtensionNormFormulaValue, Algebra.norm_complex_apply, + Complex.finrank_real_complex] + change ‖Complex.normSq z‖ ^ (1 / (2 : ℝ)) = ‖z‖ + rw [Real.norm_eq_abs, abs_of_nonneg (Complex.normSq_nonneg z), + Complex.normSq_eq_norm_sq] + rw [show (1 / (2 : ℝ)) = ((2 : ℕ) : ℝ)⁻¹ by norm_num] + exact Real.pow_rpow_inv_natCast (norm_nonneg z) + (by norm_num : (2 : ℕ) ≠ 0) + +/-- The finite norm formula commutes with taking an `s`-power of the +base absolute value. -/ +private theorem finiteNormExtension_finite_normFormulaValue_rpow + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (s : ℝ) (hs0 : 0 < s) (hs1 : s ≤ 1) + (x : L) : + finiteExtensionNormFormulaValue + (AbsoluteValue.rpow v s hs0 hs1) x = + finiteExtensionNormFormulaValue v x ^ s := by + rw [finiteExtensionNormFormulaValue, finiteExtensionNormFormulaValue] + simp only [AbsoluteValue.rpow_apply] + let a : ℝ := v (Algebra.norm K x) + have ha : 0 ≤ a := v.nonneg _ + change (a ^ s) ^ (1 / (Module.finrank K L : ℝ)) = + (a ^ (1 / (Module.finrank K L : ℝ))) ^ s + rw [← Real.rpow_mul ha s (1 / (Module.finrank K L : ℝ)), + ← Real.rpow_mul ha (1 / (Module.finrank K L : ℝ)) s] + rw [mul_comm s (1 / (Module.finrank K L : ℝ))] + +/-- The finite norm formula is invariant under algebra equivalence of +the top field. -/ +private theorem finiteNormExtension_finite_normFormulaValue_algEquiv + {K L E : Type*} [Field K] [Field L] [Field E] + [Algebra K L] [Algebra K E] + [FiniteDimensional K L] [FiniteDimensional K E] + (v : AbsoluteValue K ℝ) (e : L ≃ₐ[K] E) (x : L) : + finiteExtensionNormFormulaValue v x = + finiteExtensionNormFormulaValue v (e x) := by + rw [finiteExtensionNormFormulaValue, finiteExtensionNormFormulaValue] + rw [Algebra.norm_eq_of_algEquiv e x] + rw [e.toLinearEquiv.finrank_eq] + +/-- the finite-degree norm construction, archimedean `s`-power branch over `ℝ | ℝ`: the finite +norm formula is `|x|^s`. -/ +private theorem finiteNormExtension_real_self_normFormulaValue_eq_rpow + (s : ℝ) (hs0 : 0 < s) (hs1 : s ≤ 1) (x : ℝ) : + finiteExtensionNormFormulaValue (K := ℝ) (L := ℝ) + (AbsoluteValue.rpow + finiteStandardRealAbsoluteValue s hs0 hs1) x = + finiteStandardRealAbsoluteValue x ^ s := by + rw [finiteNormExtension_finite_normFormulaValue_rpow] + rw [finiteNormExtension_real_self_normFormulaValue_eq_standard] + +/-- the finite-degree norm construction, archimedean `s`-power branch over `ℂ | ℂ`: the finite +norm formula is `|z|^s`. -/ +private theorem finiteNormExtension_complex_self_normFormulaValue_eq_rpow + (s : ℝ) (hs0 : 0 < s) (hs1 : s ≤ 1) (z : ℂ) : + finiteExtensionNormFormulaValue (K := ℂ) (L := ℂ) + (AbsoluteValue.rpow + finiteStandardComplexAbsoluteValue s hs0 hs1) z = + finiteStandardComplexAbsoluteValue z ^ s := by + rw [finiteNormExtension_finite_normFormulaValue_rpow] + rw [finiteNormExtension_complex_self_normFormulaValue_eq_standard] + +/-- the finite-degree norm construction, archimedean `s`-power branch over `ℂ | ℝ`: the finite +norm formula is the `s`-power of the usual complex absolute value. -/ +private theorem finiteNormExtension_real_complex_normFormulaValue_eq_rpow + (s : ℝ) (hs0 : 0 < s) (hs1 : s ≤ 1) (z : ℂ) : + finiteExtensionNormFormulaValue (K := ℝ) (L := ℂ) + (AbsoluteValue.rpow + finiteStandardRealAbsoluteValue s hs0 hs1) z = + finiteStandardComplexAbsoluteValue z ^ s := by + rw [finiteNormExtension_finite_normFormulaValue_rpow] + rw [finiteNormExtension_real_complex_normFormulaValue_eq_standard] + +/-- The nontrivial-valuation convention excludes the trivial valuation in the +nontrivial-valuation convention; for the +nonarchimedean spectral branch this supplies the corresponding mathlib +`NontriviallyNormedField` instance on `WithAbs v`. -/ +@[reducible] private def finiteWithAbsNontriviallyNormedField + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) (hv : v.IsNontrivial) : + NontriviallyNormedField (WithAbs v) := + NontriviallyNormedField.ofNormNeOne + (by + rcases hv with ⟨x, hx0, hx1⟩ + refine ⟨WithAbs.toAbs v x, ?_, ?_⟩ + · intro hx + apply hx0 + simpa using congrArg (WithAbs.equiv v) hx + · simpa [WithAbs.norm_eq_apply_ofAbs] using hx1) + +/-- `WithAbs` is only a type synonym, so algebraicity is transported from the +original base field without adding data. -/ +private instance finiteWithAbsAlgebraIsAlgebraic + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] (v : AbsoluteValue K ℝ) : + Algebra.IsAlgebraic (WithAbs v) L := by + exact Algebra.IsAlgebraic.tower_top + (K := K) (L := WithAbs v) (A := L) + +/-- the real absolute-value classification, translated to the `WithAbs` normed-field structure. -/ +private theorem finiteWithAbsIsUltrametricDist + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) : + IsUltrametricDist (WithAbs v) := by + refine IsUltrametricDist.isUltrametricDist_of_isNonarchimedean_norm ?_ + intro x y + simpa [WithAbs.norm_eq_apply_ofAbs] using + (LubinTate.Valuations.strong_triangle_of_nonarchimedean v hnonarch + (WithAbs.equiv v x) (WithAbs.equiv v y)) + +/-- the finite-degree norm construction, existence branch: the spectral extension restricts to the +given chosen valuation on the base field. -/ +private theorem finiteSpectralNormExtendsBase + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) (x : K) : + _root_.spectralNorm (WithAbs v) L (algebraMap K L x) = v x := by + let : Algebra.IsAlgebraic (WithAbs v) L := + finiteWithAbsAlgebraIsAlgebraic v + simpa [WithAbs.algebraMap_left_apply, WithAbs.norm_eq_apply_ofAbs] using + (_root_.spectralNorm_extends + (K := WithAbs v) (L := L) ((WithAbs.equiv v).symm x)) + +/-- the finite-degree norm construction, existence branch: the spectral extension satisfies the +strong triangle inequality in the nonarchimedean case. -/ +private theorem finiteSpectralNormStrongTriangle + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) (x y : L) : + _root_.spectralNorm (WithAbs v) L (x + y) ≤ + max (_root_.spectralNorm (WithAbs v) L x) + (_root_.spectralNorm (WithAbs v) L y) := by + let : IsUltrametricDist (WithAbs v) := + finiteWithAbsIsUltrametricDist v hnonarch + let : Algebra.IsAlgebraic (WithAbs v) L := + finiteWithAbsAlgebraIsAlgebraic v + exact _root_.isNonarchimedean_spectralNorm + (K := WithAbs v) (L := L) x y + +/-- the finite-degree norm construction, existence branch: the spectral extension vanishes exactly +at zero. -/ +private theorem finiteSpectralNormEqZeroIff + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) (x : L) : + _root_.spectralNorm (WithAbs v) L x = 0 ↔ x = 0 := by + let : Algebra.IsAlgebraic (WithAbs v) L := + finiteWithAbsAlgebraIsAlgebraic v + constructor + · intro hx + exact _root_.eq_zero_of_map_spectralNorm_eq_zero + (K := WithAbs v) (L := L) hx + (Algebra.IsAlgebraic.isAlgebraic x) + · intro hx + rw [hx] + exact _root_.spectralNorm_zero (K := WithAbs v) (L := L) + +/-- the finite-degree norm construction, existence branch: multiplicativity of the spectral +extension over an algebraic extension. -/ +private theorem finiteSpectralNormMul + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) + (hcomplete : IsCompleteForAbsoluteValue v) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : v.IsNontrivial) (x y : L) : + _root_.spectralNorm (WithAbs v) L (x * y) = + _root_.spectralNorm (WithAbs v) L x * + _root_.spectralNorm (WithAbs v) L y := by + let : NontriviallyNormedField (WithAbs v) := + finiteWithAbsNontriviallyNormedField v hv + let : Algebra (WithAbs v) L := + WithAbs.algebraLeft L v + let : CompleteSpace (WithAbs v) := + completeSpace_withAbs_of_isCompleteForAbsoluteValue v hcomplete + let : IsUltrametricDist (WithAbs v) := + finiteWithAbsIsUltrametricDist v hnonarch + let : Algebra.IsAlgebraic (WithAbs v) L := + finiteWithAbsAlgebraIsAlgebraic v + simpa [_root_.spectralAlgNorm_def] using + (_root_.spectralAlgNorm_mul (K := WithAbs v) (L := L) x y) + +private theorem finiteBaseIsNonarchimedean + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) : + IsNonarchimedean (v : K → ℝ) := + (LubinTate.Valuations.strong_triangle_iff_isNonarchimedean v).1 + (LubinTate.Valuations.strong_triangle_of_nonarchimedean v hnonarch) + +private noncomputable def finiteSpectralExtension + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) + (hcomplete : IsCompleteForAbsoluteValue v) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : v.IsNontrivial) : AbsoluteValue L ℝ := + AbsoluteValue.spectralExtension v + (completeSpace_withAbs_of_isCompleteForAbsoluteValue v hcomplete) + (finiteBaseIsNonarchimedean v hnonarch) hv + +private theorem finiteSpectralExtension_extends_base + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) + (hcomplete : IsCompleteForAbsoluteValue v) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : v.IsNontrivial) (x : K) : + finiteSpectralExtension (K := K) (L := L) + v hcomplete hnonarch hv (algebraMap K L x) = v x := by + simpa [finiteSpectralExtension] using + (AbsoluteValue.spectralExtension_extends + (K := K) (L := L) v + (completeSpace_withAbs_of_isCompleteForAbsoluteValue v hcomplete) + (finiteBaseIsNonarchimedean v hnonarch) hv x) + +/-- Finite-dimensional completeness for the spectral norm. -/ +private theorem finiteSpectralNormCompleteSpace + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) + (hcomplete : IsCompleteForAbsoluteValue v) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : v.IsNontrivial) : + letI : NontriviallyNormedField (WithAbs v) := + finiteWithAbsNontriviallyNormedField v hv + letI : Algebra (WithAbs v) L := + WithAbs.algebraLeft L v + letI : CompleteSpace (WithAbs v) := + completeSpace_withAbs_of_isCompleteForAbsoluteValue v hcomplete + letI : IsUltrametricDist (WithAbs v) := + finiteWithAbsIsUltrametricDist v hnonarch + letI : Algebra.IsAlgebraic (WithAbs v) L := + finiteWithAbsAlgebraIsAlgebraic v + @CompleteSpace L (_root_.spectralNorm.uniformSpace (WithAbs v) L) := by + let : NontriviallyNormedField (WithAbs v) := + finiteWithAbsNontriviallyNormedField v hv + let : Algebra (WithAbs v) L := + WithAbs.algebraLeft L v + let : CompleteSpace (WithAbs v) := + completeSpace_withAbs_of_isCompleteForAbsoluteValue v hcomplete + let : IsUltrametricDist (WithAbs v) := + finiteWithAbsIsUltrametricDist v hnonarch + let : Algebra.IsAlgebraic (WithAbs v) L := + finiteWithAbsAlgebraIsAlgebraic v + infer_instance + +/-- the finite-degree norm construction, finite-extension completeness for the constructed +absolute-value extension. -/ +private theorem finiteSpectralExtensionComplete + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) + (hcomplete : IsCompleteForAbsoluteValue v) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : v.IsNontrivial) : + IsCompleteForAbsoluteValue + (finiteSpectralExtension (K := K) (L := L) + v hcomplete hnonarch hv) := by + let : NontriviallyNormedField (WithAbs v) := + finiteWithAbsNontriviallyNormedField v hv + let : Algebra (WithAbs v) L := + WithAbs.algebraLeft L v + let : CompleteSpace (WithAbs v) := + completeSpace_withAbs_of_isCompleteForAbsoluteValue v hcomplete + let : IsUltrametricDist (WithAbs v) := + finiteWithAbsIsUltrametricDist v hnonarch + let : Algebra.IsAlgebraic (WithAbs v) L := + finiteWithAbsAlgebraIsAlgebraic v + apply (absoluteValueCompleteness_completeSpace_withAbs_iff_complete _).1 + let : NormedField L := + _root_.spectralNorm.normedField (WithAbs v) L + let : CompleteSpace L := + finiteSpectralNormCompleteSpace + (K := K) (L := L) v hcomplete hnonarch hv + let e : + WithAbs (finiteSpectralExtension (K := K) (L := L) + v hcomplete hnonarch hv) ≃ᵢ L := + { toEquiv := (WithAbs.equiv _).toEquiv + isometry_toFun := by + rw [isometry_iff_dist_eq] + intro x y + simp only [dist_eq_norm_sub, WithAbs.norm_eq_apply_ofAbs, + WithAbs.ofAbs_sub] + rfl } + exact e.completeSpace + +/-- the finite-degree norm construction, finite norm-formula source: the spectral extension is +computed from the constant coefficient of the minimal polynomial. -/ +private theorem finiteSpectralNormEqMinpolyCoeffZeroRpow + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) + (hcomplete : IsCompleteForAbsoluteValue v) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : v.IsNontrivial) (x : L) : + _root_.spectralNorm (WithAbs v) L x = + v ((minpoly K x).coeff 0) ^ + (1 / ((minpoly K x).natDegree : ℝ)) := by + let : NontriviallyNormedField (WithAbs v) := + finiteWithAbsNontriviallyNormedField v hv + let : Algebra (WithAbs v) L := + WithAbs.algebraLeft L v + let : CompleteSpace (WithAbs v) := + completeSpace_withAbs_of_isCompleteForAbsoluteValue v hcomplete + let : IsUltrametricDist (WithAbs v) := + finiteWithAbsIsUltrametricDist v hnonarch + let : Algebra.IsAlgebraic (WithAbs v) L := + finiteWithAbsAlgebraIsAlgebraic v + let : Algebra.IsIntegral K L := Algebra.IsAlgebraic.isIntegral + have hminpoly : + (minpoly K x).map (WithAbs.equiv v).symm = + minpoly (WithAbs v) x := by + apply minpoly.map_eq_of_equiv_equiv + (f := (WithAbs.equiv v).symm) + (g := RingEquiv.refl L) + ext a + simp [WithAbs.algebraMap_left_apply] + have hs := + _root_.spectralNorm.spectralNorm_eq_norm_coeff_zero_rpow + (K := WithAbs v) (L := L) x + rw [← hminpoly] at hs + simpa [WithAbs.norm_eq_apply_ofAbs] using hs + +/-- the finite-degree norm construction, the same constant-term formula for the constructed +absolute-value extension. -/ +private theorem finiteSpectralExtensionEqMinpolyCoeffZeroRpow + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) + (hcomplete : IsCompleteForAbsoluteValue v) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : v.IsNontrivial) (x : L) : + finiteSpectralExtension (K := K) (L := L) + v hcomplete hnonarch hv x = + v ((minpoly K x).coeff 0) ^ + (1 / ((minpoly K x).natDegree : ℝ)) := + finiteSpectralNormEqMinpolyCoeffZeroRpow + v hcomplete hnonarch hv x + +/-- the finite-degree norm construction, finite norm-formula source: the absolute value of the +finite-extension norm is the corresponding power of the absolute value of the +constant coefficient of the minimal polynomial. -/ +private theorem finiteNormExtension_abs_norm_eq_minpoly_coeff_zero_pow_relfinrank + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (x : L) : + v (Algebra.norm K x) = + v ((minpoly K x).coeff 0) ^ + (Module.finrank (IntermediateField.adjoin K ({x} : Set L)) L) := by + let : Algebra.IsAlgebraic K L := Algebra.IsAlgebraic.of_finite K L + let : Algebra.IsIntegral K L := Algebra.IsAlgebraic.isIntegral + have hxint : IsIntegral K x := Algebra.IsIntegral.isIntegral x + rw [Algebra.norm_eq_norm_adjoin K x, map_pow] + have hgen : + Algebra.norm K (IntermediateField.AdjoinSimple.gen K x) = + (-1 : K) ^ (minpoly K x).natDegree * (minpoly K x).coeff 0 := by + simpa [IntermediateField.adjoin.powerBasis_gen, + IntermediateField.minpoly_gen, IntermediateField.adjoin.powerBasis_dim] + using + (Algebra.PowerBasis.norm_gen_eq_coeff_zero_minpoly + (IntermediateField.adjoin.powerBasis hxint)) + rw [hgen, v.map_mul, v.map_pow, AbsoluteValue.map_neg] + simp + +/-- For a nonnegative real number, taking an `n`th natural power and then the +reciprocal `m*n` real power cancels the `n` factor. -/ +private theorem finiteNatPowRpowInvMulCancel + {a : ℝ} (ha : 0 ≤ a) {m n : ℕ} (hm : 0 < m) (hn : 0 < n) : + (a ^ n) ^ (1 / ((m * n : ℕ) : ℝ)) = a ^ (1 / (m : ℝ)) := by + by_cases ha0 : a = 0 + · have hmn_ne : ((m * n : ℕ) : ℝ) ≠ 0 := by + exact_mod_cast Nat.mul_ne_zero (Nat.ne_of_gt hm) (Nat.ne_of_gt hn) + have hm_ne : (m : ℝ) ≠ 0 := by + exact_mod_cast Nat.ne_of_gt hm + rw [ha0, zero_pow (Nat.ne_of_gt hn), + Real.zero_rpow (one_div_ne_zero hmn_ne), + Real.zero_rpow (one_div_ne_zero hm_ne)] + · have ha_pos : 0 < a := lt_of_le_of_ne ha (fun h => ha0 h.symm) + rw [← Real.rpow_natCast, ← Real.rpow_mul ha_pos.le] + have hm_ne : (m : ℝ) ≠ 0 := by + exact_mod_cast Nat.ne_of_gt hm + have hn_ne : (n : ℝ) ≠ 0 := by + exact_mod_cast Nat.ne_of_gt hn + congr 1 + field_simp [hm_ne, hn_ne] + norm_num [Nat.cast_mul, mul_comm] + +/-- Symmetric form of `finiteNatPowRpowInvMulCancel`, cancelling the left +natural-power factor. -/ +private theorem finiteNatPowRpowInvMulCancelLeft + {a : ℝ} (ha : 0 ≤ a) {m n : ℕ} (hm : 0 < m) (hn : 0 < n) : + (a ^ m) ^ (1 / ((m * n : ℕ) : ℝ)) = a ^ (1 / (n : ℝ)) := by + simpa [Nat.mul_comm] using + (finiteNatPowRpowInvMulCancel (a := a) ha (m := n) (n := m) hn hm) + +/-- the finite-degree norm construction, finite case: the norm formula agrees with the +constructed spectral absolute-value extension. -/ +private theorem finiteNormExtension_finite_normFormulaValue_eq_spectralAbsoluteValue + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) + (hcomplete : IsCompleteForAbsoluteValue v) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : v.IsNontrivial) (x : L) : + finiteExtensionNormFormulaValue v x = + finiteSpectralExtension (K := K) (L := L) + v hcomplete hnonarch hv x := by + let : Algebra.IsIntegral K L := Algebra.IsAlgebraic.isIntegral + have hxint : IsIntegral K x := Algebra.IsIntegral.isIntegral x + let E : IntermediateField K L := IntermediateField.adjoin K ({x} : Set L) + let : FiniteDimensional K E := + IntermediateField.adjoin.finiteDimensional hxint + let : FiniteDimensional E L := FiniteDimensional.right K E L + have hd_pos : 0 < (minpoly K x).natDegree := + minpoly.natDegree_pos hxint + have hr_pos : 0 < Module.finrank E L := + Module.finrank_pos (R := E) (M := L) + rw [finiteExtensionNormFormulaValue, + finiteNormExtension_abs_norm_eq_minpoly_coeff_zero_pow_relfinrank, + finiteSpectralExtensionEqMinpolyCoeffZeroRpow] + rw [← Module.finrank_mul_finrank K E L, + IntermediateField.adjoin.finrank hxint] + exact finiteNatPowRpowInvMulCancel + (v.nonneg ((minpoly K x).coeff 0)) hd_pos hr_pos + +/-- the finite-degree norm construction, finite case: the finite norm formula inherits the strong +triangle inequality from the spectral extension. -/ +theorem finiteNormExtension_finite_normFormulaValue_strong_triangle + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) + (hcomplete : IsCompleteForAbsoluteValue v) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : v.IsNontrivial) (x y : L) : + finiteExtensionNormFormulaValue v (x + y) ≤ + max (finiteExtensionNormFormulaValue v x) + (finiteExtensionNormFormulaValue v y) := by + rw [finiteNormExtension_finite_normFormulaValue_eq_spectralAbsoluteValue + v hcomplete hnonarch hv (x + y), + finiteNormExtension_finite_normFormulaValue_eq_spectralAbsoluteValue + v hcomplete hnonarch hv x, + finiteNormExtension_finite_normFormulaValue_eq_spectralAbsoluteValue + v hcomplete hnonarch hv y] + simpa [finiteSpectralExtension, AbsoluteValue.spectralExtension] using + finiteSpectralNormStrongTriangle v hnonarch x y + +/-- the finite-degree norm construction, finite nonarchimedean branch: the norm formula, +bundled as an absolute value on the finite extension. -/ +noncomputable def finiteNormExtensionFiniteNormFormulaAbsoluteValue + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) + (hcomplete : IsCompleteForAbsoluteValue v) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : v.IsNontrivial) : AbsoluteValue L ℝ where + toFun := finiteExtensionNormFormulaValue v + map_mul' x y := by + rw [finiteNormExtension_finite_normFormulaValue_eq_spectralAbsoluteValue + v hcomplete hnonarch hv (x * y), + finiteNormExtension_finite_normFormulaValue_eq_spectralAbsoluteValue + v hcomplete hnonarch hv x, + finiteNormExtension_finite_normFormulaValue_eq_spectralAbsoluteValue + v hcomplete hnonarch hv y] + exact (finiteSpectralExtension (K := K) (L := L) + v hcomplete hnonarch hv).map_mul x y + nonneg' x := finiteExtensionNormFormulaValue_nonneg v x + eq_zero' x := by + rw [finiteNormExtension_finite_normFormulaValue_eq_spectralAbsoluteValue + v hcomplete hnonarch hv x] + exact (finiteSpectralExtension (K := K) (L := L) + v hcomplete hnonarch hv).eq_zero' x + add_le' x y := by + have hstrong := + finiteNormExtension_finite_normFormulaValue_strong_triangle + v hcomplete hnonarch hv x y + have hx_nonneg : 0 ≤ finiteExtensionNormFormulaValue v x := + finiteExtensionNormFormulaValue_nonneg v x + have hy_nonneg : 0 ≤ finiteExtensionNormFormulaValue v y := + finiteExtensionNormFormulaValue_nonneg v y + exact hstrong.trans + (max_le + (le_add_of_nonneg_right hy_nonneg) + (le_add_of_nonneg_left hx_nonneg)) + +/-- The bundled finite norm formula is pointwise the function +`x ↦ |N_{L/K}(x)|^(1/[L:K])`. -/ +theorem finiteNormExtension_finite_normFormulaAbsoluteValue_apply + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) + (hcomplete : IsCompleteForAbsoluteValue v) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : v.IsNontrivial) (x : L) : + finiteNormExtensionFiniteNormFormulaAbsoluteValue (K := K) (L := L) + v hcomplete hnonarch hv x = + finiteExtensionNormFormulaValue v x := + rfl + +/-- In the finite case, the norm-formula absolute value agrees with the +spectral extension. -/ +private theorem finiteNormExtension_finite_normFormulaAbsoluteValue_eq_spectralAbsoluteValue + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) + (hcomplete : IsCompleteForAbsoluteValue v) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : v.IsNontrivial) : + finiteNormExtensionFiniteNormFormulaAbsoluteValue (K := K) (L := L) + v hcomplete hnonarch hv = + finiteSpectralExtension (K := K) (L := L) + v hcomplete hnonarch hv := by + ext x + exact finiteNormExtension_finite_normFormulaValue_eq_spectralAbsoluteValue + v hcomplete hnonarch hv x + +/-- the finite-degree norm construction, finite case: the norm-formula absolute value restricts to +the given base valuation. -/ +theorem finiteNormExtension_finite_normFormulaAbsoluteValue_extends_base + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) + (hcomplete : IsCompleteForAbsoluteValue v) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : v.IsNontrivial) (x : K) : + finiteNormExtensionFiniteNormFormulaAbsoluteValue (K := K) (L := L) + v hcomplete hnonarch hv (algebraMap K L x) = v x := by + rw [finiteNormExtension_finite_normFormulaAbsoluteValue_eq_spectralAbsoluteValue + v hcomplete hnonarch hv] + exact finiteSpectralExtension_extends_base + (K := K) (L := L) v hcomplete hnonarch hv x + +/-- the finite-degree norm construction, finite case: the finite extension is complete for the +norm-formula absolute value. -/ +theorem finiteNormExtension_finite_normFormulaAbsoluteValue_complete + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) + (hcomplete : IsCompleteForAbsoluteValue v) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : v.IsNontrivial) : + IsCompleteForAbsoluteValue + (finiteNormExtensionFiniteNormFormulaAbsoluteValue (K := K) (L := L) + v hcomplete hnonarch hv) := by + rw [finiteNormExtension_finite_normFormulaAbsoluteValue_eq_spectralAbsoluteValue + v hcomplete hnonarch hv] + exact finiteSpectralExtensionComplete + (K := K) (L := L) v hcomplete hnonarch hv + + +/-- the finite-degree norm construction, finite case: the norm-formula absolute value is the unique +absolute-value extension of the complete nonarchimedean base valuation. -/ +theorem finiteNormExtension_unique_extension_finite_normFormulaAbsoluteValue + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) + (hcomplete : IsCompleteForAbsoluteValue v) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : v.IsNontrivial) + (w : AbsoluteValue L ℝ) + (hw_ext : ∀ x : K, w (algebraMap K L x) = v x) : + w = finiteNormExtensionFiniteNormFormulaAbsoluteValue (K := K) (L := L) + v hcomplete hnonarch hv := by + rw [finiteNormExtension_finite_normFormulaAbsoluteValue_eq_spectralAbsoluteValue + v hcomplete hnonarch hv] + simpa [finiteSpectralExtension] using + (AbsoluteValue.eq_spectralExtension_of_extends + (K := K) (L := L) v + (completeSpace_withAbs_of_isCompleteForAbsoluteValue v hcomplete) + (finiteBaseIsNonarchimedean v hnonarch) hv w hw_ext) + +/-- Explicit result package for the finite-degree norm construction, finite nonarchimedean case: +the unique extension is the norm formula and the finite extension is complete. -/ +structure FiniteNormExtensionFiniteExtensionResult + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) where + /-- The distinguished absolute value on the finite extension. -/ + extension : AbsoluteValue L ℝ + /-- The distinguished absolute value restricts to the given base absolute value. -/ + extends_base : ∀ x : K, extension (algebraMap K L x) = v x + /-- Every extension of the base absolute value equals the distinguished extension. -/ + unique : + ∀ w : AbsoluteValue L ℝ, + (∀ x : K, w (algebraMap K L x) = v x) → w = extension + /-- The distinguished extension is given by the finite-extension norm formula. -/ + norm_formula : ∀ x : L, extension x = finiteExtensionNormFormulaValue v x + /-- The distinguished extension is complete. -/ + complete_extension : IsCompleteForAbsoluteValue extension + +/-- Finite-extension result packages over the same base absolute value are +unique. In particular, choosing a package does not affect its public value. -/ +theorem FiniteNormExtensionFiniteExtensionResult.ext_unique + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + {v : AbsoluteValue K ℝ} + (R S : FiniteNormExtensionFiniteExtensionResult (K := K) (L := L) v) : + R = S := by + cases R with + | mk extensionR extendsBaseR uniqueR normFormulaR completeR => + cases S with + | mk extensionS extendsBaseS uniqueS normFormulaS completeS => + have hExtension : extensionS = extensionR := + uniqueR extensionS extendsBaseS + subst extensionS + rfl + +/-- the finite-degree norm construction, explicit archimedean finite theorem over `ℝ`: in +finite degree, the unique extension is the norm formula and the extension is +complete. -/ +private noncomputable def finiteNormExtension_real_finite_rpow_extension + {L : Type*} [Field L] [Algebra ℝ L] + [FiniteDimensional ℝ L] + (s : ℝ) (hs0 : 0 < s) (hs1 : s ≤ 1) : + FiniteNormExtensionFiniteExtensionResult (K := ℝ) (L := L) + (AbsoluteValue.rpow + finiteStandardRealAbsoluteValue s hs0 hs1) := + Classical.choice <| by + rcases Real.nonempty_algEquiv_or L with hreal | hcomplex + · rcases hreal with ⟨e⟩ + exact ⟨ + { extension := + AbsoluteValue.rpow + (AbsoluteValue.compAlgEquiv + e finiteStandardRealAbsoluteValue) + s hs0 hs1 + extends_base := by + intro x + simp only [AbsoluteValue.rpow_apply] + rw [AbsoluteValue.compAlgEquiv_extends_apply e + finiteStandardRealAbsoluteValue + finiteStandardRealAbsoluteValue (fun x => rfl) x] + unique := + finiteRealAlgEquivRealUniqueRpowExtension + e s hs0 hs1 + norm_formula := by + intro x + calc + AbsoluteValue.rpow + (AbsoluteValue.compAlgEquiv + e finiteStandardRealAbsoluteValue) + s hs0 hs1 x + = finiteStandardRealAbsoluteValue (e x) ^ s := rfl + _ = finiteExtensionNormFormulaValue (K := ℝ) (L := ℝ) + (AbsoluteValue.rpow + finiteStandardRealAbsoluteValue s hs0 hs1) (e x) := by + exact (finiteNormExtension_real_self_normFormulaValue_eq_rpow + s hs0 hs1 (e x)).symm + _ = finiteExtensionNormFormulaValue (K := ℝ) (L := L) + (AbsoluteValue.rpow + finiteStandardRealAbsoluteValue s hs0 hs1) x := by + exact (finiteNormExtension_finite_normFormulaValue_algEquiv + (AbsoluteValue.rpow + finiteStandardRealAbsoluteValue s hs0 hs1) e x).symm + complete_extension := by + exact (finiteRpowCompleteIff + (AbsoluteValue.compAlgEquiv + e finiteStandardRealAbsoluteValue) + s hs0 hs1).2 + (finiteCompAlgEquivComplete e + finiteStandardRealAbsoluteValue + finiteStandardRealComplete) }⟩ + · rcases hcomplex with ⟨e⟩ + exact ⟨ + { extension := + AbsoluteValue.rpow + (AbsoluteValue.compAlgEquiv + e finiteStandardComplexAbsoluteValue) + s hs0 hs1 + extends_base := by + intro x + simp only [AbsoluteValue.rpow_apply] + rw [AbsoluteValue.compAlgEquiv_extends_apply e + finiteStandardComplexAbsoluteValue + finiteStandardRealAbsoluteValue + finiteStandardComplexExtendsReal x] + unique := + finiteRealAlgEquivComplexUniqueRpowExtension + e s hs0 hs1 + norm_formula := by + intro x + calc + AbsoluteValue.rpow + (AbsoluteValue.compAlgEquiv + e finiteStandardComplexAbsoluteValue) + s hs0 hs1 x + = finiteStandardComplexAbsoluteValue (e x) ^ s := rfl + _ = finiteExtensionNormFormulaValue (K := ℝ) (L := ℂ) + (AbsoluteValue.rpow + finiteStandardRealAbsoluteValue s hs0 hs1) (e x) := by + exact (finiteNormExtension_real_complex_normFormulaValue_eq_rpow + s hs0 hs1 (e x)).symm + _ = finiteExtensionNormFormulaValue (K := ℝ) (L := L) + (AbsoluteValue.rpow + finiteStandardRealAbsoluteValue s hs0 hs1) x := by + exact (finiteNormExtension_finite_normFormulaValue_algEquiv + (AbsoluteValue.rpow + finiteStandardRealAbsoluteValue s hs0 hs1) e x).symm + complete_extension := by + exact (finiteRpowCompleteIff + (AbsoluteValue.compAlgEquiv + e finiteStandardComplexAbsoluteValue) + s hs0 hs1).2 + (finiteCompAlgEquivComplete e + finiteStandardComplexAbsoluteValue + finiteStandardComplexComplete) }⟩ + +/-- the finite-degree norm construction, explicit archimedean finite theorem over `ℂ`: in +finite degree, the unique extension is the norm formula and the extension is +complete. -/ +private noncomputable def finiteNormExtension_complex_finite_rpow_extension + {L : Type*} [Field L] [Algebra ℂ L] + [FiniteDimensional ℂ L] + (s : ℝ) (hs0 : 0 < s) (hs1 : s ≤ 1) : + FiniteNormExtensionFiniteExtensionResult (K := ℂ) (L := L) + (AbsoluteValue.rpow + finiteStandardComplexAbsoluteValue s hs0 hs1) := by + letI : Algebra.IsIntegral ℂ L := Algebra.IsAlgebraic.isIntegral + let e0 : ℂ ≃ₐ[ℂ] L := + AlgEquiv.ofBijective (Algebra.ofId ℂ L) + (IsAlgClosed.algebraMap_bijective_of_isIntegral (k := ℂ) (K := L)) + let e : L ≃ₐ[ℂ] ℂ := e0.symm + exact + { extension := + AbsoluteValue.rpow + (AbsoluteValue.compAlgEquiv + e finiteStandardComplexAbsoluteValue) + s hs0 hs1 + extends_base := by + intro z + simp only [AbsoluteValue.rpow_apply] + rw [AbsoluteValue.compAlgEquiv_extends_apply e + finiteStandardComplexAbsoluteValue + finiteStandardComplexAbsoluteValue (fun z => rfl) z] + unique := + finiteComplexAlgEquivComplexUniqueRpowExtension + e s hs0 hs1 + norm_formula := by + intro x + calc + AbsoluteValue.rpow + (AbsoluteValue.compAlgEquiv + e finiteStandardComplexAbsoluteValue) + s hs0 hs1 x + = finiteStandardComplexAbsoluteValue (e x) ^ s := rfl + _ = finiteExtensionNormFormulaValue (K := ℂ) (L := ℂ) + (AbsoluteValue.rpow + finiteStandardComplexAbsoluteValue s hs0 hs1) (e x) := by + exact (finiteNormExtension_complex_self_normFormulaValue_eq_rpow + s hs0 hs1 (e x)).symm + _ = finiteExtensionNormFormulaValue (K := ℂ) (L := L) + (AbsoluteValue.rpow + finiteStandardComplexAbsoluteValue s hs0 hs1) x := by + exact (finiteNormExtension_finite_normFormulaValue_algEquiv + (AbsoluteValue.rpow + finiteStandardComplexAbsoluteValue s hs0 hs1) e x).symm + complete_extension := by + exact (finiteRpowCompleteIff + (AbsoluteValue.compAlgEquiv + e finiteStandardComplexAbsoluteValue) + s hs0 hs1).2 + (finiteCompAlgEquivComplete e + finiteStandardComplexAbsoluteValue + finiteStandardComplexComplete) } + +/-- Algebraicity is preserved when the base field is replaced by a ring +equivalent field and the top algebra structure is transported through the same +equivalence. -/ +private theorem finiteIsAlgebraicOfBaseRingEquiv + {K E L : Type*} [Field K] [Field E] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] (σ : K ≃+* E) : + letI : Algebra E K := RingHom.toAlgebra σ.symm.toRingHom + letI : Algebra E L := + RingHom.toAlgebra ((algebraMap K L).comp σ.symm.toRingHom) + Algebra.IsAlgebraic E L := by + let : Algebra E K := RingHom.toAlgebra σ.symm.toRingHom + let : Algebra E L := + RingHom.toAlgebra ((algebraMap K L).comp σ.symm.toRingHom) + have : IsScalarTower E K L := + IsScalarTower.of_algebraMap_eq (fun r => by + simp [RingHom.algebraMap_toAlgebra]) + let e : K ≃ₐ[E] E := AlgEquiv.ofRingEquiv (f := σ) (by + intro r + simp [RingHom.algebraMap_toAlgebra]) + have : Algebra.IsAlgebraic E K := e.symm.isAlgebraic + exact Algebra.IsAlgebraic.trans E K L + +/-- Finite-dimensionality is preserved when the base field is replaced by an +equivalent field and the top algebra structure is transported along the same +equivalence. -/ +private theorem finiteNormExtension_finiteDimensional_of_base_ringEquiv + {K E L : Type*} [Field K] [Field E] [Field L] [Algebra K L] + [FiniteDimensional K L] (σ : K ≃+* E) : + letI : Algebra E L := + RingHom.toAlgebra ((algebraMap K L).comp σ.symm.toRingHom) + FiniteDimensional E L := by + let : Algebra E K := RingHom.toAlgebra σ.symm.toRingHom + let : Algebra E L := + RingHom.toAlgebra ((algebraMap K L).comp σ.symm.toRingHom) + have : IsScalarTower E K L := + IsScalarTower.of_algebraMap_eq (fun r => by + simp [RingHom.algebraMap_toAlgebra]) + let e : K ≃ₐ[E] E := AlgEquiv.ofRingEquiv (f := σ) (by + intro r + simp [RingHom.algebraMap_toAlgebra]) + have : Module.Finite E K := Module.Finite.equiv e.symm.toLinearEquiv + exact FiniteDimensional.trans E K L + +/-- The finite norm formula is preserved by replacing the base field by +an equivalent field, provided the two base absolute values correspond under +that equivalence. -/ +private theorem finiteNormExtension_finite_normFormulaValue_base_ringEquiv + {K E L : Type*} [Field K] [Field E] [Field L] [Algebra K L] + [FiniteDimensional K L] (σ : K ≃+* E) + (vK : AbsoluteValue K ℝ) (vE : AbsoluteValue E ℝ) + (hvσ : ∀ x : K, vE (σ x) = vK x) + (x : L) : + letI : Algebra E L := + RingHom.toAlgebra ((algebraMap K L).comp σ.symm.toRingHom) + letI : FiniteDimensional E L := + finiteNormExtension_finiteDimensional_of_base_ringEquiv (K := K) + (E := E) (L := L) σ + finiteExtensionNormFormulaValue (K := E) (L := L) vE x = + finiteExtensionNormFormulaValue (K := K) (L := L) vK x := by + let : Algebra E K := RingHom.toAlgebra σ.symm.toRingHom + let : Algebra E L := + RingHom.toAlgebra ((algebraMap K L).comp σ.symm.toRingHom) + have : IsScalarTower E K L := + IsScalarTower.of_algebraMap_eq (fun r => by + simp [RingHom.algebraMap_toAlgebra]) + let e : K ≃ₐ[E] E := AlgEquiv.ofRingEquiv (f := σ) (by + intro r + simp [RingHom.algebraMap_toAlgebra]) + have : Module.Finite E K := Module.Finite.equiv e.symm.toLinearEquiv + have : FiniteDimensional E L := FiniteDimensional.trans E K L + have hfinEK : Module.finrank E K = 1 := by + rw [e.toLinearEquiv.finrank_eq] + simp + have hfin : Module.finrank K L = Module.finrank E L := by + have hmul := Module.finrank_mul_finrank E K L + rwa [hfinEK, one_mul] at hmul + have he : (algebraMap E L).comp σ.toRingHom = algebraMap K L := by + ext x + simp [RingHom.algebraMap_toAlgebra] + have hnorm : Algebra.norm E x = σ (Algebra.norm K x) := + (Algebra.norm_eq_of_ringEquiv σ he x).symm + rw [finiteExtensionNormFormulaValue, finiteExtensionNormFormulaValue] + rw [hnorm, hvσ, ← hfin] + + +/-- Transport a finite-extension result across an equivalent base field. -/ +private noncomputable def finiteNormExtension_finiteExtensionResult_base_ringEquiv + {K E L : Type*} [Field K] [Field E] [Field L] [Algebra K L] + [FiniteDimensional K L] + (σ : K ≃+* E) (vK : AbsoluteValue K ℝ) (vE : AbsoluteValue E ℝ) + (hvσ : ∀ x : K, vE (σ x) = vK x) + (R : + letI : Algebra E L := + RingHom.toAlgebra ((algebraMap K L).comp σ.symm.toRingHom) + letI : FiniteDimensional E L := + finiteNormExtension_finiteDimensional_of_base_ringEquiv + (K := K) (E := E) (L := L) σ + FiniteNormExtensionFiniteExtensionResult (K := E) (L := L) vE) : + FiniteNormExtensionFiniteExtensionResult (K := K) (L := L) vK := by + letI : Algebra E L := + RingHom.toAlgebra ((algebraMap K L).comp σ.symm.toRingHom) + letI : FiniteDimensional E L := + finiteNormExtension_finiteDimensional_of_base_ringEquiv + (K := K) (E := E) (L := L) σ + exact + { extension := R.extension + extends_base := by + intro x + have hbase := R.extends_base (σ x) + have hmap : + algebraMap E L (σ x) = algebraMap K L x := by + simp [RingHom.algebraMap_toAlgebra] + calc + R.extension (algebraMap K L x) + = R.extension (algebraMap E L (σ x)) := by rw [hmap] + _ = vE (σ x) := hbase + _ = vK x := hvσ x + unique := by + intro w hw + apply R.unique w + intro z + have hmap : + algebraMap E L z = algebraMap K L (σ.symm z) := by + simp [RingHom.algebraMap_toAlgebra] + calc + w (algebraMap E L z) + = w (algebraMap K L (σ.symm z)) := by rw [hmap] + _ = vK (σ.symm z) := hw (σ.symm z) + _ = vE z := by + simpa using (hvσ (σ.symm z)).symm + norm_formula := by + intro x + calc + R.extension x + = finiteExtensionNormFormulaValue (K := E) (L := L) vE x := + R.norm_formula x + _ = finiteExtensionNormFormulaValue (K := K) (L := L) vK x := by + exact finiteNormExtension_finite_normFormulaValue_base_ringEquiv + (K := K) (E := E) (L := L) σ vK vE hvσ x + complete_extension := R.complete_extension } + + +/-- the finite-degree norm construction, explicit finite nonarchimedean theorem: in finite degree, +the unique extension is `|N_{L/K}(x)|^(1/[L:K])`, and the finite extension is +complete. -/ +noncomputable def finiteNormExtensionNonarchimedeanFiniteExtension + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) + (hcomplete : IsCompleteForAbsoluteValue v) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : v.IsNontrivial) : + FiniteNormExtensionFiniteExtensionResult (K := K) (L := L) v where + extension := + finiteNormExtensionFiniteNormFormulaAbsoluteValue (K := K) (L := L) + v hcomplete hnonarch hv + extends_base := + finiteNormExtension_finite_normFormulaAbsoluteValue_extends_base + (K := K) (L := L) v hcomplete hnonarch hv + unique := + finiteNormExtension_unique_extension_finite_normFormulaAbsoluteValue + (K := K) (L := L) v hcomplete hnonarch hv + norm_formula := + finiteNormExtension_finite_normFormulaAbsoluteValue_apply + (K := K) (L := L) v hcomplete hnonarch hv + complete_extension := + finiteNormExtension_finite_normFormulaAbsoluteValue_complete + (K := K) (L := L) v hcomplete hnonarch hv + +/-- Explicit archimedean finite-extension theorem: after the archimedean +classification, the finite norm formula and completeness reduce to the standard +`ℝ`/`ℂ` cases. -/ +noncomputable def finiteNormExtensionArchimedeanFiniteExtension + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) + (hcomplete : IsCompleteForAbsoluteValue v) + (harch : LubinTate.Valuations.ArchimedeanAbsoluteValue v) : + FiniteNormExtensionFiniteExtensionResult (K := K) (L := L) v := + Classical.choice <| by + classical + have harchStandard : ¬ IsNonarchimedean (v : K → ℝ) := by + intro hnonarch + exact harch ((AbsoluteValue.isNonarchimedean_iff_bounded_nat v).1 hnonarch) + let : CharZero K := + AbsoluteValue.charZero_of_not_isNonarchimedean v harchStandard + rcases AbsoluteValue.ostrowski_of_complete v + (completeSpace_withAbs_of_isCompleteForAbsoluteValue v hcomplete) + harchStandard with + ⟨s, hs0, hs1, hbranch⟩ + rcases hbranch with hreal | hcomplex + · rcases hreal with ⟨σ, hσ⟩ + let : Algebra ℝ K := RingHom.toAlgebra σ.symm.toRingHom + let : Algebra ℝ L := + RingHom.toAlgebra ((algebraMap K L).comp σ.symm.toRingHom) + have : Algebra.IsAlgebraic ℝ L := + finiteIsAlgebraicOfBaseRingEquiv (K := K) (E := ℝ) + (L := L) σ + have : FiniteDimensional ℝ L := + finiteNormExtension_finiteDimensional_of_base_ringEquiv (K := K) (E := ℝ) + (L := L) σ + let R := finiteNormExtension_real_finite_rpow_extension (L := L) s hs0 hs1 + exact ⟨ + finiteNormExtension_finiteExtensionResult_base_ringEquiv + (K := K) (E := ℝ) (L := L) σ v + (AbsoluteValue.rpow + finiteStandardRealAbsoluteValue s hs0 hs1) + (fun x => (hσ x).symm) R⟩ + · rcases hcomplex with ⟨σ, hσ⟩ + let : Algebra ℂ K := RingHom.toAlgebra σ.symm.toRingHom + let : Algebra ℂ L := + RingHom.toAlgebra ((algebraMap K L).comp σ.symm.toRingHom) + have : Algebra.IsAlgebraic ℂ L := + finiteIsAlgebraicOfBaseRingEquiv (K := K) (E := ℂ) + (L := L) σ + have : FiniteDimensional ℂ L := + finiteNormExtension_finiteDimensional_of_base_ringEquiv (K := K) (E := ℂ) + (L := L) σ + let R := finiteNormExtension_complex_finite_rpow_extension (L := L) s hs0 hs1 + exact ⟨ + finiteNormExtension_finiteExtensionResult_base_ringEquiv + (K := K) (E := ℂ) (L := L) σ v + (AbsoluteValue.rpow + finiteStandardComplexAbsoluteValue s hs0 hs1) + (fun x => (hσ x).symm) R⟩ + +/-- the finite-degree norm construction, explicit finite theorem for the nontrivial +valuations: in finite degree the unique extension is the norm formula, and the +finite extension is complete. -/ +noncomputable def finiteNormExtensionFiniteExtension + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) + (hcomplete : IsCompleteForAbsoluteValue v) + (hv : v.IsNontrivial) : + FiniteNormExtensionFiniteExtensionResult (K := K) (L := L) v := by + by_cases hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v + · exact finiteNormExtensionNonarchimedeanFiniteExtension + v hcomplete hnonarch hv + · exact finiteNormExtensionArchimedeanFiniteExtension + v hcomplete hnonarch + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormula.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormula.lean new file mode 100644 index 0000000000..e1fb930b56 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormula.lean @@ -0,0 +1,276 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness +public import Mathlib.RingTheory.Norm.Transitivity +/-! +# the finite norm-formula theorem + +Algebraic facts about the finite norm formula used in the explicit proof of +The algebraic-extension norm formula, together with restriction of a valued field tower to an +intermediate field. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w x y z + +namespace AlgebraicNumberTheory +namespace Valuations + +private theorem normFormula_real_natPow_rpow_inv_mul_cancel + {a : ℝ} (ha : 0 ≤ a) {m n : ℕ} (hm : 0 < m) (hn : 0 < n) : + (a ^ n) ^ (1 / ((m * n : ℕ) : ℝ)) = a ^ (1 / (m : ℝ)) := by + by_cases ha0 : a = 0 + · have hmn_ne : ((m * n : ℕ) : ℝ) ≠ 0 := by + exact_mod_cast Nat.mul_ne_zero (Nat.ne_of_gt hm) (Nat.ne_of_gt hn) + have hm_ne : (m : ℝ) ≠ 0 := by + exact_mod_cast Nat.ne_of_gt hm + rw [ha0, zero_pow (Nat.ne_of_gt hn), + Real.zero_rpow (one_div_ne_zero hmn_ne), + Real.zero_rpow (one_div_ne_zero hm_ne)] + · have ha_pos : 0 < a := lt_of_le_of_ne ha (fun h => ha0 h.symm) + rw [← Real.rpow_natCast, ← Real.rpow_mul ha_pos.le] + have hm_ne : (m : ℝ) ≠ 0 := by + exact_mod_cast Nat.ne_of_gt hm + have hn_ne : (n : ℝ) ≠ 0 := by + exact_mod_cast Nat.ne_of_gt hn + congr 1 + field_simp [hm_ne, hn_ne] + norm_num [Nat.cast_mul, mul_comm] + +/-- the finite norm-formula theorem, finite absolute-value norm-formula algebraic source: the +candidate `|N_{L/K}(x)|^(1/[L:K])` reduces to the same constant-term +formula as the spectral construction in the complete case. + +This is purely algebraic and does not use Henselianity. The remaining +the finite norm-formula theorem work is to identify the unique Henselian extension with this +candidate absolute value. -/ +theorem normFormula_finiteExtensionNormFormulaValue_eq_minpoly_coeff_zero_rpow + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (x : L) : + finiteExtensionNormFormulaValue v x = + v ((minpoly K x).coeff 0) ^ + (1 / ((minpoly K x).natDegree : ℝ)) := by + let : Algebra.IsAlgebraic K L := Algebra.IsAlgebraic.of_finite K L + let : Algebra.IsIntegral K L := Algebra.IsAlgebraic.isIntegral + have hxint : IsIntegral K x := Algebra.IsIntegral.isIntegral x + let : FiniteDimensional K (IntermediateField.adjoin K ({x} : Set L)) := + IntermediateField.adjoin.finiteDimensional hxint + let : FiniteDimensional (IntermediateField.adjoin K ({x} : Set L)) L := + FiniteDimensional.right K (IntermediateField.adjoin K ({x} : Set L)) L + have hd_pos : 0 < (minpoly K x).natDegree := + minpoly.natDegree_pos hxint + have hr_pos : + 0 < Module.finrank (IntermediateField.adjoin K ({x} : Set L)) L := + Module.finrank_pos + (R := IntermediateField.adjoin K ({x} : Set L)) (M := L) + have hnorm : + v (Algebra.norm K x) = + v ((minpoly K x).coeff 0) ^ + Module.finrank (IntermediateField.adjoin K ({x} : Set L)) L := by + rw [Algebra.norm_eq_norm_adjoin K x, map_pow] + have hgen : + Algebra.norm K (IntermediateField.AdjoinSimple.gen K x) = + (-1 : K) ^ (minpoly K x).natDegree * (minpoly K x).coeff 0 := by + simpa [IntermediateField.adjoin.powerBasis_gen, + IntermediateField.minpoly_gen, IntermediateField.adjoin.powerBasis_dim] + using + (Algebra.PowerBasis.norm_gen_eq_coeff_zero_minpoly + (IntermediateField.adjoin.powerBasis hxint)) + rw [hgen, v.map_mul, v.map_pow, AbsoluteValue.map_neg] + simp + rw [finiteExtensionNormFormulaValue, hnorm] + rw [← Module.finrank_mul_finrank K + (IntermediateField.adjoin K ({x} : Set L)) L, + IntermediateField.adjoin.finrank hxint] + exact normFormula_real_natPow_rpow_inv_mul_cancel + (v.nonneg ((minpoly K x).coeff 0)) hd_pos hr_pos + +/-- the finite norm-formula theorem, finite absolute-value norm-formula base-extension source: +the candidate `|N_{L/K}(x)|^(1/[L:K])` restricts to the original +absolute value on the base field. + +This verifies the extension part of the finite root-form formula without +using completeness or Henselianity. -/ +theorem normFormula_finiteExtensionNormFormulaValue_algebraMap + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (a : K) : + finiteExtensionNormFormulaValue v (algebraMap K L a) = v a := by + have hn : 0 < Module.finrank K L := + Module.finrank_pos (R := K) (M := L) + rw [finiteExtensionNormFormulaValue, Algebra.norm_algebraMap, v.map_pow] + simpa using + (normFormula_real_natPow_rpow_inv_mul_cancel + (a := v a) (m := 1) (n := Module.finrank K L) + (v.nonneg a) (by norm_num) hn) + +/-- the finite norm-formula theorem, finite absolute-value norm-formula source: raising the +candidate `|N_{L/K}(x)|^(1/[L:K])` to `[L : K]` recovers +`|N_{L/K}(x)|`. -/ +theorem normFormula_finiteExtensionNormFormulaValue_pow_finrank_eq_norm + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (x : L) : + finiteExtensionNormFormulaValue v x ^ Module.finrank K L = + v (Algebra.norm K x) := by + have hn : Module.finrank K L ≠ 0 := + Nat.ne_of_gt (Module.finrank_pos (R := K) (M := L)) + simpa [finiteExtensionNormFormulaValue, one_div] using + (Real.rpow_inv_natCast_pow (v.nonneg (Algebra.norm K x)) hn) + +/-- the finite norm-formula theorem, finite absolute-value norm-formula zero source: +the norm-formula candidate vanishes exactly at zero. -/ +theorem normFormula_finiteExtensionNormFormulaValue_eq_zero_iff + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (x : L) : + finiteExtensionNormFormulaValue v x = 0 ↔ x = 0 := by + have hn : (1 / (Module.finrank K L : ℝ)) ≠ 0 := by + exact ne_of_gt (one_div_pos.mpr (by + exact_mod_cast (Module.finrank_pos (R := K) (M := L)))) + have hpow : + v (Algebra.norm K x) ^ (1 / (Module.finrank K L : ℝ)) = 0 ↔ + v (Algebra.norm K x) = 0 := + Real.rpow_eq_zero (v.nonneg (Algebra.norm K x)) hn + have hnorm : v (Algebra.norm K x) = 0 ↔ x = 0 := by + rw [v.eq_zero] + exact Algebra.norm_eq_zero_iff + simpa [finiteExtensionNormFormulaValue] using hpow.trans hnorm + +/-- the finite norm-formula theorem, finite absolute-value norm-formula multiplicative source: +the norm-formula candidate is multiplicative. -/ +theorem normFormula_finiteExtensionNormFormulaValue_mul + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (x y : L) : + finiteExtensionNormFormulaValue v (x * y) = + finiteExtensionNormFormulaValue v x * + finiteExtensionNormFormulaValue v y := by + rw [finiteExtensionNormFormulaValue, finiteExtensionNormFormulaValue, + finiteExtensionNormFormulaValue, + show Algebra.norm K (x * y) = Algebra.norm K x * Algebra.norm K y from + map_mul (Algebra.norm K) x y, + v.map_mul] + exact Real.mul_rpow + (v.nonneg (Algebra.norm K x)) (v.nonneg (Algebra.norm K y)) + +/-- the finite norm-formula theorem, finite absolute-value norm-formula inverse source: +the norm-formula candidate sends inverses to inverses. -/ +theorem normFormula_finiteExtensionNormFormulaValue_inv + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (x : L) : + finiteExtensionNormFormulaValue v x⁻¹ = + (finiteExtensionNormFormulaValue v x)⁻¹ := by + rw [finiteExtensionNormFormulaValue, finiteExtensionNormFormulaValue, + show Algebra.norm K x⁻¹ = (Algebra.norm K x)⁻¹ from + Algebra.norm_inv (K := K) x, + map_inv₀ v (Algebra.norm K x)] + exact Real.inv_rpow (v.nonneg (Algebra.norm K x)) + (1 / (Module.finrank K L : ℝ)) + +/-- the finite norm-formula theorem, finite absolute-value norm-formula division source: +the norm-formula candidate is compatible with division. -/ +theorem normFormula_finiteExtensionNormFormulaValue_div + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (x y : L) : + finiteExtensionNormFormulaValue v (x / y) = + finiteExtensionNormFormulaValue v x / + finiteExtensionNormFormulaValue v y := by + rw [div_eq_mul_inv, normFormula_finiteExtensionNormFormulaValue_mul, + normFormula_finiteExtensionNormFormulaValue_inv, div_eq_mul_inv] + +/-- the finite norm-formula theorem, finite absolute-value norm-formula closed-unit/minpoly +source: the candidate is at most one exactly when the constant +coefficient of the minimal polynomial has base absolute value at most one. -/ +theorem normFormula_finiteExtensionNormFormulaValue_le_one_iff_minpoly_coeff_zero_le_one + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (x : L) : + finiteExtensionNormFormulaValue v x ≤ 1 ↔ + v ((minpoly K x).coeff 0) ≤ 1 := by + let : Algebra.IsAlgebraic K L := Algebra.IsAlgebraic.of_finite K L + let : Algebra.IsIntegral K L := Algebra.IsAlgebraic.isIntegral + have hxint : IsIntegral K x := Algebra.IsIntegral.isIntegral x + have hd : 0 < (1 / ((minpoly K x).natDegree : ℝ)) := by + exact one_div_pos.mpr (by + exact_mod_cast (minpoly.natDegree_pos hxint)) + rw [normFormula_finiteExtensionNormFormulaValue_eq_minpoly_coeff_zero_rpow] + simpa using + (Real.rpow_le_rpow_iff + (v.nonneg ((minpoly K x).coeff 0)) zero_le_one hd) + +/-- the finite norm-formula theorem, finite norm-formula/integrality source in the reverse +direction: integrality over the base closed-unit valuation ring forces the +finite norm-formula candidate to be at most one. -/ +theorem normFormula_finiteExtensionNormFormulaValue_le_one_of_isIntegral + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + {x : L} + (hx : IsIntegral + (absoluteValueValuationSubring v hnonarch) x) : + finiteExtensionNormFormulaValue v x ≤ 1 := by + let V := absoluteValueValuationSubring v hnonarch + let : Algebra.IsAlgebraic K L := Algebra.IsAlgebraic.of_finite K L + let : Algebra.IsIntegral K L := Algebra.IsAlgebraic.isIntegral + have hmin : + minpoly K x = (minpoly V x).map (algebraMap V K) := + minpoly.isIntegrallyClosed_eq_field_fractions' K hx + have hconst : v ((minpoly K x).coeff 0) ≤ 1 := by + rw [hmin, Polynomial.coeff_map] + exact + (mem_absoluteValueValuationSubring_iff + v hnonarch (((minpoly V x).coeff 0 : V) : K)).1 + ((minpoly V x).coeff 0).property + exact + (normFormula_finiteExtensionNormFormulaValue_le_one_iff_minpoly_coeff_zero_le_one + v x).2 hconst + +end Valuations +end AlgebraicNumberTheory + +namespace DiscreteValuationField + +namespace Valuation + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] +variable {ΓK : Type v} [LinearOrderedCommGroupWithZero ΓK] + +/-- Restricting a valuation on the top of a field tower to the middle field +preserves the fact that it extends the bottom valuation. -/ +theorem comap_to_middle_hasExtension_of_top_hasExtension + {M : Type y} [Field M] [Algebra L M] [Algebra K M] + [IsScalarTower K L M] + {ΓM : Type z} [LinearOrderedCommGroupWithZero ΓM] + (vK : _root_.Valuation K ΓK) (vM : _root_.Valuation M ΓM) + [vK.HasExtension vM] : + vK.HasExtension (vM.comap (algebraMap L M)) := by + apply _root_.Valuation.HasExtension.ofComapInteger + ext a + simp only [Subring.mem_comap] + change + vM (algebraMap L M ((algebraMap K L) a)) ≤ 1 ↔ + vK a ≤ 1 + rw [← IsScalarTower.algebraMap_apply K L M a] + exact _root_.Valuation.HasExtension.val_map_le_one_iff + (vR := vK) (vA := vM) a + +end Valuation +end DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaAbsoluteValue.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaAbsoluteValue.lean new file mode 100644 index 0000000000..8fa7e0d96d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaAbsoluteValue.lean @@ -0,0 +1,247 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure +/-! +# the finite norm-formula absolute value + +The factorization form of Hensel's lemma makes the closed unit ball of the +finite norm-formula value equal to the integral elements over the base +valuation ring. This supplies the strong triangle inequality and hence the +absolute value without completeness or separatedness assumptions. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- The closed unit ball of the finite norm-formula value is closed under +addition, using only the primitive factorization form of Hensel's lemma. -/ +theorem normFormula_finiteExtensionNormFormulaValue_add_le_one_of_le_one_of_henselFactorization + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + (absoluteValueValuationSubring v hnonarch)) + {x y : L} + (hx : finiteExtensionNormFormulaValue v x ≤ 1) + (hy : finiteExtensionNormFormulaValue v y ≤ 1) : + finiteExtensionNormFormulaValue v (x + y) ≤ 1 := by + exact normFormula_finiteExtensionNormFormulaValue_le_one_of_isIntegral + v hnonarch + (IsIntegral.add + (normFormula_finiteExtensionNormFormulaValue_isIntegral_of_le_one_of_henselFactorization + v hnonarch hv hx) + (normFormula_finiteExtensionNormFormulaValue_isIntegral_of_le_one_of_henselFactorization + v hnonarch hv hy)) + +/-- The finite norm-formula value satisfies the strong nonarchimedean triangle +inequality under the primitive factorization form of Hensel's lemma. -/ +theorem normFormula_finiteExtensionNormFormulaValue_strong_triangle_of_henselFactorization + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + (absoluteValueValuationSubring v hnonarch)) + (x y : L) : + finiteExtensionNormFormulaValue v (x + y) ≤ + max (finiteExtensionNormFormulaValue v x) + (finiteExtensionNormFormulaValue v y) := by + have hle_left : + ∀ {x y : L}, + finiteExtensionNormFormulaValue v y ≤ + finiteExtensionNormFormulaValue v x → + finiteExtensionNormFormulaValue v (x + y) ≤ + finiteExtensionNormFormulaValue v x := by + intro x y hyx + by_cases hx0 : x = 0 + · rw [hx0, zero_add] + simpa [hx0, + (normFormula_finiteExtensionNormFormulaValue_eq_zero_iff v + (0 : L)).2 rfl] using hyx + · have hxne : + finiteExtensionNormFormulaValue v x ≠ 0 := by + intro hxzero + exact hx0 + ((normFormula_finiteExtensionNormFormulaValue_eq_zero_iff v x).1 + hxzero) + have hxpos : 0 < finiteExtensionNormFormulaValue v x := + lt_of_le_of_ne + (finiteExtensionNormFormulaValue_nonneg v x) + (fun h => hxne h.symm) + have hone : + finiteExtensionNormFormulaValue v (1 : L) ≤ 1 := by + rw [← (show algebraMap K L (1 : K) = (1 : L) by simp), + normFormula_finiteExtensionNormFormulaValue_algebraMap] + simp + have hydiv : + finiteExtensionNormFormulaValue v (y / x) ≤ 1 := by + rw [normFormula_finiteExtensionNormFormulaValue_div] + exact (div_le_one hxpos).2 hyx + have hadd : + finiteExtensionNormFormulaValue v (1 + y / x) ≤ 1 := + normFormula_finiteExtensionNormFormulaValue_add_le_one_of_le_one_of_henselFactorization + v hnonarch hv hone hydiv + have hdecomp : x + y = x * (1 + y / x) := by + rw [mul_add, mul_one, mul_div_cancel₀ y hx0] + calc + finiteExtensionNormFormulaValue v (x + y) + = finiteExtensionNormFormulaValue v (x * (1 + y / x)) := by + rw [hdecomp] + _ = finiteExtensionNormFormulaValue v x * + finiteExtensionNormFormulaValue v (1 + y / x) := by + rw [normFormula_finiteExtensionNormFormulaValue_mul] + _ ≤ finiteExtensionNormFormulaValue v x * 1 := + mul_le_mul_of_nonneg_left hadd + (finiteExtensionNormFormulaValue_nonneg v x) + _ = finiteExtensionNormFormulaValue v x := by simp + rcases le_total (finiteExtensionNormFormulaValue v y) + (finiteExtensionNormFormulaValue v x) with hyx | hxy + · exact (hle_left hyx).trans + (le_max_left (finiteExtensionNormFormulaValue v x) + (finiteExtensionNormFormulaValue v y)) + · have hyx_add : + finiteExtensionNormFormulaValue v (y + x) ≤ + finiteExtensionNormFormulaValue v y := + hle_left hxy + calc + finiteExtensionNormFormulaValue v (x + y) + = finiteExtensionNormFormulaValue v (y + x) := by rw [add_comm] + _ ≤ finiteExtensionNormFormulaValue v y := hyx_add + _ ≤ max (finiteExtensionNormFormulaValue v x) + (finiteExtensionNormFormulaValue v y) := + le_max_right _ _ + +/-- the finite norm-formula theorem finite norm formula bundled as an absolute value, assuming +only the primitive factorization form of Hensel's lemma on the base valuation +ring. -/ +noncomputable def normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + (absoluteValueValuationSubring v hnonarch)) : + AbsoluteValue L ℝ where + toFun := finiteExtensionNormFormulaValue v + map_mul' x y := normFormula_finiteExtensionNormFormulaValue_mul v x y + nonneg' x := finiteExtensionNormFormulaValue_nonneg v x + eq_zero' x := normFormula_finiteExtensionNormFormulaValue_eq_zero_iff v x + add_le' x y := by + have hstrong := + normFormula_finiteExtensionNormFormulaValue_strong_triangle_of_henselFactorization + v hnonarch hv x y + have hx_nonneg : 0 ≤ finiteExtensionNormFormulaValue v x := + finiteExtensionNormFormulaValue_nonneg v x + have hy_nonneg : 0 ≤ finiteExtensionNormFormulaValue v y := + finiteExtensionNormFormulaValue_nonneg v y + exact hstrong.trans + (max_le + (le_add_of_nonneg_right hy_nonneg) + (le_add_of_nonneg_left hx_nonneg)) + +/-- The bundled finite norm-formula absolute value is pointwise the construction's +displayed value. -/ +theorem normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_apply + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + (absoluteValueValuationSubring v hnonarch)) + (x : L) : + normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization + (K := K) (L := L) v hnonarch hv x = + finiteExtensionNormFormulaValue v x := + rfl + +/-- The bundled norm-formula absolute value restricts to the original base +absolute value. -/ +theorem normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_extends_base + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + (absoluteValueValuationSubring v hnonarch)) + (x : K) : + normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization + (K := K) (L := L) v hnonarch hv (algebraMap K L x) = v x := + normFormula_finiteExtensionNormFormulaValue_algebraMap v x + +/-- The bundled finite norm-formula absolute value is nonarchimedean. -/ +theorem normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_nonarchimedean + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + (absoluteValueValuationSubring v hnonarch)) : + LubinTate.Valuations.NonarchimedeanAbsoluteValue + (normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization + (K := K) (L := L) v hnonarch hv) := by + refine LubinTate.Valuations.nonarchimedean_of_strong_triangle + (normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization + (K := K) (L := L) v hnonarch hv) ?_ + intro x y + exact + normFormula_finiteExtensionNormFormulaValue_strong_triangle_of_henselFactorization + v hnonarch hv x y + +/-- The closed unit ball of the bundled norm formula consists exactly of the +elements integral over the base valuation ring. -/ +theorem + henselFactorization_normFormula_mem_valuationSubring_iff_isIntegral + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + (absoluteValueValuationSubring v hnonarch)) + (x : L) : + x ∈ absoluteValueValuationSubring + (normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization + (K := K) (L := L) v hnonarch hv) + (normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_nonarchimedean + (K := K) (L := L) v hnonarch hv) ↔ + IsIntegral + (absoluteValueValuationSubring v hnonarch) x := by + rw [mem_absoluteValueValuationSubring_iff, + normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_apply] + constructor + · exact + normFormula_finiteExtensionNormFormulaValue_isIntegral_of_le_one_of_henselFactorization + v hnonarch hv + · exact normFormula_finiteExtensionNormFormulaValue_le_one_of_isIntegral + v hnonarch + +/-- The valuation ring of the bundled finite norm formula is the actual +integral closure of the base valuation ring in `L`. -/ +theorem + henselFactorization_normFormula_valuationSubring_eq_integralClosure + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + (absoluteValueValuationSubring v hnonarch)) : + (absoluteValueValuationSubring + (normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization + (K := K) (L := L) v hnonarch hv) + (normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_nonarchimedean + (K := K) (L := L) v hnonarch hv)).toSubring = + (integralClosure + (R := absoluteValueValuationSubring + v hnonarch) L).toSubring := by + ext x + exact + henselFactorization_normFormula_mem_valuationSubring_iff_isIntegral + (K := K) (L := L) v hnonarch hv x + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaCoefficients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaCoefficients.lean new file mode 100644 index 0000000000..90e4b8249f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaCoefficients.lean @@ -0,0 +1,179 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialLifting +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Core +/-! +# coefficient bound from primitive Hensel factorization + +This file reuses the algebraic normalization and irreducibility obstruction +from the irreducible-polynomial coefficient bounds. The factor lift is supplied directly by the +factorization form of Hensel's lemma in the primitive factorization definition, so no + completeness or +separatedness hypothesis is needed. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- The normalized residual factor input from the irreducible-polynomial coefficient bounds +contradicts +irreducibility as soon as the valuation ring satisfies the construction's +factorization form of Hensel's lemma. -/ +theorem normFormula_hensel_reduction_factor_input_not_irreducible_of_henselFactorization + {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + (absoluteValueValuationSubring v hnonarch)) + (F : (absoluteValueValuationSubring v hnonarch)[X]) + {r : ℕ} + (hrpos : 0 < r) (hrlt : r < F.natDegree) + (hfactor : + F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) = + Polynomial.X ^ r * + (F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) /ₘ + Polynomial.X ^ r)) + (hnatDegree : (Polynomial.X ^ r : + (IsLocalRing.ResidueField + (absoluteValueValuationSubring v hnonarch))[X]).natDegree = + r) + (hcoprime : IsCoprime (Polynomial.X ^ r) + (F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) /ₘ + Polynomial.X ^ r)) + (hQ0 : ((F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) /ₘ + Polynomial.X ^ r).coeff 0) ≠ 0) + {f : K[X]} + (hFmap : F.map (algebraMap + (absoluteValueValuationSubring v hnonarch) K) = f) + (hFdegree : F.natDegree = f.natDegree) : + ¬ Irreducible f := by + let V := absoluteValueValuationSubring v hnonarch + let k := IsLocalRing.ResidueField V + let fbar : k[X] := F.map (IsLocalRing.residue V) + let qbar : k[X] := fbar /ₘ Polynomial.X ^ r + have hprim : F.map (IsLocalRing.residue V) ≠ 0 := by + exact + irreduciblePolynomial_polynomial_ne_zero_of_eq_X_pow_mul_of_coeff_zero_ne_zero + hfactor hQ0 + rcases hv hprim (by simpa [V, k, fbar, qbar] using hfactor) hcoprime with + ⟨G, H, hGdegree_res, _hHle, hGH, _hGmap, _hHmap⟩ + have hGdegree : G.natDegree = r := hGdegree_res.trans hnatDegree + exact irreduciblePolynomial_not_irreducible_of_valuation_factorization + v hnonarch hFmap hFdegree hGH hGdegree hrpos hrlt + +/-- Scaling by a coefficient of positive maximum value and applying the construction +Hensel factorization contradicts irreducibility when both endpoint values are +strictly below that maximum. -/ +theorem normFormula_normalized_scale_not_irreducible_of_henselFactorization + {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + (absoluteValueValuationSubring v hnonarch)) + {f : K[X]} {m : ℝ} {n : ℕ} + (hmpos : 0 < m) + (hnmax : v (f.coeff n) = m) + (hbound : ∀ i : ℕ, v (f.coeff i) ≤ m) + (hconst : v (f.coeff 0) < m) + (hlead : v f.leadingCoeff < m) : + let g : K[X] := Polynomial.C (f.coeff n)⁻¹ * f + ¬ Irreducible g := by + let g : K[X] := Polynomial.C (f.coeff n)⁻¹ * f + rcases irreduciblePolynomial_normalized_scale_hensel_reduction_factor_input + v hnonarch hmpos hnmax hbound hconst hlead with + ⟨F, r, hFmap, hFdegree, hrpos, hrlt, hfactor, hnatDegree, hcoprime, hQ0⟩ + exact + normFormula_hensel_reduction_factor_input_not_irreducible_of_henselFactorization + v hnonarch hv F hrpos hrlt hfactor hnatDegree hcoprime hQ0 + hFmap hFdegree + +/-- Under primitive Hensel factorization, a positive coefficient maximum of an +irreducible polynomial is bounded by the larger endpoint value. -/ +theorem normFormula_coeff_max_le_endpoint_max_of_irreducible_of_henselFactorization + {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + (absoluteValueValuationSubring v hnonarch)) + {f : K[X]} {m : ℝ} {n : ℕ} + (hirr : Irreducible f) + (hmpos : 0 < m) + (hnmax : v (f.coeff n) = m) + (hbound : ∀ i : ℕ, v (f.coeff i) ≤ m) : + m ≤ max (v (f.coeff 0)) (v f.leadingCoeff) := by + by_contra hnot + have hmaxlt : max (v (f.coeff 0)) (v f.leadingCoeff) < m := + lt_of_not_ge hnot + have hconst : v (f.coeff 0) < m := + (le_max_left (v (f.coeff 0)) (v f.leadingCoeff)).trans_lt hmaxlt + have hlead : v f.leadingCoeff < m := + (le_max_right (v (f.coeff 0)) (v f.leadingCoeff)).trans_lt hmaxlt + have hscaled_irreducible : + Irreducible (Polynomial.C (f.coeff n)⁻¹ * f) := + irreduciblePolynomial_irreducible_normalized_scale_of_irreducible + v hmpos hnmax hirr + have hscaled_not_irreducible : + ¬ Irreducible (Polynomial.C (f.coeff n)⁻¹ * f) := + normFormula_normalized_scale_not_irreducible_of_henselFactorization + v hnonarch hv hmpos hnmax hbound hconst hlead + exact hscaled_not_irreducible hscaled_irreducible + +/-- the finite norm-formula theorem coefficient source: primitive Hensel factorization alone bounds +every coefficient of an irreducible polynomial by its two endpoint values. -/ +theorem normFormula_coeff_abs_le_endpoint_max_of_irreducible_of_henselFactorization + {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + (absoluteValueValuationSubring v hnonarch)) + {f : K[X]} (hirr : Irreducible f) : + ∀ i : ℕ, v (f.coeff i) ≤ max (v (f.coeff 0)) (v f.leadingCoeff) := by + rcases irreduciblePolynomial_exists_coeff_abs_max_of_ne_zero v hirr.ne_zero with + ⟨m, n, hmpos, _hnle, hnmax, hbound⟩ + have hmle : m ≤ max (v (f.coeff 0)) (v f.leadingCoeff) := + normFormula_coeff_max_le_endpoint_max_of_irreducible_of_henselFactorization + v hnonarch hv hirr hmpos hnmax hbound + intro i + exact (hbound i).trans hmle + +/-- the finite norm-formula theorem monic specialization: if the constant coefficient of an +irreducible monic polynomial lies in the closed unit ball, then every +coefficient lies there. -/ +theorem normFormula_monic_coeff_abs_le_one_of_const_abs_le_one_of_henselFactorization + {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + (absoluteValueValuationSubring v hnonarch)) + {f : K[X]} (hirr : Irreducible f) + (hmonic : f.Monic) + (hconst : v (f.coeff 0) ≤ 1) : + ∀ i : ℕ, v (f.coeff i) ≤ 1 := by + have hlead : v f.leadingCoeff = 1 := by + rw [hmonic.leadingCoeff] + simp + have hendpoint : + max (v (f.coeff 0)) (v f.leadingCoeff) ≤ 1 := by + rw [hlead] + exact max_le hconst le_rfl + intro i + exact + (normFormula_coeff_abs_le_endpoint_max_of_irreducible_of_henselFactorization + v hnonarch hv hirr i).trans hendpoint + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean new file mode 100644 index 0000000000..06f79e681e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean @@ -0,0 +1,328 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring +/-! +# algebraic extension and integral closure + +This file packages the explicit algebraic-extension statement. A +valuation is represented by its valuation subring, so uniqueness is literal +equality of valuation subrings (equivalently, equivalence of valuations). +-/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + integralClosureValuationSubringOfMemOrInv_hasExtension → + integralClosureValuationSubringOfMemOrInv_hasExtension + + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- the primitive factorization definition for the valuation subring attached to a nonarchimedean +absolute value, reduced to the exact factorization property used below. -/ +theorem henselianValuation_iff_henselFactorization + {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) : + ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (absoluteValueValuationSubring + v hnonarch).valuation ↔ + ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + (absoluteValueValuationSubring v hnonarch) := by + simp only [ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization, + ValuationSubring.valuationSubring_valuation] + +open DiscreteValuationField.Valuation renaming + normFormula_extension_valuationSubring_eq_integralClosure_of_mem_or_inv → + normFormula_valuationSubring_eq_integralClosure in +/-- the finite norm-formula theorem: a Henselian nonarchimedean valuation has exactly one +extension to every algebraic extension, and the valuation ring of that +extension is the actual integral closure of the base valuation ring. + +The extension is expressed by its valuation subring. The first conjunct says +that its canonical valuation extends the base valuation; the second is the +integral-closure identification. -/ +theorem normFormula_algebraic_extension + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (absoluteValueValuationSubring + v hnonarch).valuation) : + let V := absoluteValueValuationSubring v hnonarch + ∃! W : ValuationSubring L, + V.valuation.HasExtension W.valuation ∧ + W.toSubring = (integralClosure V L).toSubring := by + let V := absoluteValueValuationSubring v hnonarch + have hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty V := + (henselianValuation_iff_henselFactorization v hnonarch).1 hhens + have hvalV : + ∀ z : L, + z ∈ (integralClosure V L).toSubring ∨ + z⁻¹ ∈ (integralClosure V L).toSubring := + normFormula_algebraic_integralClosure_mem_or_inv_of_henselFactorization + v hnonarch hv + have hval : + ∀ z : L, + z ∈ (integralClosure V.valuation.valuationSubring L).toSubring ∨ + z⁻¹ ∈ + (integralClosure V.valuation.valuationSubring L).toSubring := by + rw [ValuationSubring.valuationSubring_valuation] + exact hvalV + let B : ValuationSubring L := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) V.valuation hval + have hBext : V.valuation.HasExtension B.valuation := + integralClosureValuationSubringOfMemOrInv_hasExtension + (L := L) V.valuation hval + have hBclosure : B.toSubring = (integralClosure V L).toSubring := by + change + (integralClosure V.valuation.valuationSubring L).toSubring = + (integralClosure V L).toSubring + rw [ValuationSubring.valuationSubring_valuation] + refine ⟨B, ⟨hBext, hBclosure⟩, ?_⟩ + intro W hW + let : V.valuation.HasExtension W.valuation := hW.1 + simpa only [ValuationSubring.valuationSubring_valuation] using + normFormula_valuationSubring_eq_integralClosure + (K := K) (L := L) V hval W.valuation + +/-- Exact extension of nonarchimedean absolute values supplies extension of +the canonical valuations of their closed unit balls. -/ +theorem absoluteValueValuation_hasExtension_of_extends + {K L : Type*} [Field K] [Field L] [Algebra K L] + (v : AbsoluteValue K ℝ) (w : AbsoluteValue L ℝ) + (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hw : LubinTate.Valuations.NonarchimedeanAbsoluteValue w) + (hext : ∀ a : K, w (algebraMap K L a) = v a) : + let V := absoluteValueValuationSubring v hv + let W := absoluteValueValuationSubring w hw + V.valuation.HasExtension W.valuation := by + let V := absoluteValueValuationSubring v hv + let W := absoluteValueValuationSubring w hw + apply _root_.Valuation.HasExtension.ofComapInteger + rw [ValuationSubring.integer_valuation, ValuationSubring.integer_valuation] + have hcomap := + comap_absoluteValueUnitBallSubring_eq_of_extends + v w hv hw hext + ext x + change algebraMap K L x ∈ absoluteValueUnitBallSubring w hw ↔ + x ∈ absoluteValueUnitBallSubring v hv + constructor + · intro hx + have hx' : x ∈ Subring.comap (algebraMap K L) + (absoluteValueUnitBallSubring w hw) := hx + rw [hcomap] at hx' + exact hx' + · intro hx + have hx' : x ∈ Subring.comap (algebraMap K L) + (absoluteValueUnitBallSubring w hw) := by + rw [hcomap] + exact hx + exact hx' + +/-- Equality of the closed unit balls of an extension absolute value and the +finite norm-formula absolute value forces pointwise equality. The normalization +is recovered by taking the field norm, so equivalence of valuations is +upgraded to equality of the chosen absolute values. -/ +theorem normFormula_finite_normFormulaAbsoluteValue_eq_of_valuationSubring_eq_of_henselFactorization + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + (absoluteValueValuationSubring v hnonarch)) + (w : AbsoluteValue L ℝ) (hwnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue w) + (hw_ext : ∀ a : K, w (algebraMap K L a) = v a) + (hsub : + absoluteValueValuationSubring w hwnonarch = + absoluteValueValuationSubring + (normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization + (K := K) (L := L) v hnonarch hv) + (normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_nonarchimedean + (K := K) (L := L) v hnonarch hv)) : + w = + normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization + (K := K) (L := L) v hnonarch hv := by + ext x + let rAbs := + normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization + (K := K) (L := L) v hnonarch hv + let hrnonarch := + normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_nonarchimedean + (K := K) (L := L) v hnonarch hv + by_cases hx : x = 0 + · simp [hx] + · let n := Module.finrank K L + have hn_pos : 0 < n := Module.finrank_pos (R := K) (M := L) + have hn_ne : n ≠ 0 := Nat.ne_of_gt hn_pos + have hnorm_ne : Algebra.norm K x ≠ 0 := + (Algebra.norm_ne_zero_iff).2 hx + have hbase_norm_ne : algebraMap K L (Algebra.norm K x) ≠ 0 := + (map_ne_zero (algebraMap K L)).2 hnorm_ne + have hxpow_ne : x ^ n ≠ 0 := pow_ne_zero n hx + let z := x ^ n / algebraMap K L (Algebra.norm K x) + have hz_ne : z ≠ 0 := by + dsimp [z] + exact div_ne_zero hxpow_ne hbase_norm_ne + have hvnorm_ne : v (Algebra.norm K x) ≠ 0 := by + intro hzero + exact hnorm_ne ((v.eq_zero).1 hzero) + have hr_pow : rAbs x ^ n = v (Algebra.norm K x) := by + simp [rAbs, + normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_apply, + normFormula_finiteExtensionNormFormulaValue_pow_finrank_eq_norm, + n] + have hrz : rAbs z = 1 := by + dsimp [z] + rw [map_div₀, AbsoluteValue.map_pow] + rw [hr_pow] + rw [show rAbs (algebraMap K L (Algebra.norm K x)) = + v (Algebra.norm K x) from by + simpa [rAbs] using + normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_extends_base + (K := K) (L := L) v hnonarch hv (Algebra.norm K x)] + exact div_self hvnorm_ne + have hrzinv : rAbs z⁻¹ = 1 := by + rw [map_inv₀, hrz] + simp + have hzR : + z ∈ absoluteValueValuationSubring + rAbs hrnonarch := by + rw [mem_absoluteValueValuationSubring_iff] + exact le_of_eq hrz + have hzinvR : + z⁻¹ ∈ absoluteValueValuationSubring + rAbs hrnonarch := by + rw [mem_absoluteValueValuationSubring_iff] + exact le_of_eq hrzinv + have hzW : + z ∈ absoluteValueValuationSubring + w hwnonarch := by + simpa [rAbs, hrnonarch, hsub] using hzR + have hzinvW : + z⁻¹ ∈ absoluteValueValuationSubring + w hwnonarch := by + simpa [rAbs, hrnonarch, hsub] using hzinvR + have hwz_le : w z ≤ 1 := + (mem_absoluteValueValuationSubring_iff + w hwnonarch z).1 hzW + have hwzinv_le : w z⁻¹ ≤ 1 := + (mem_absoluteValueValuationSubring_iff + w hwnonarch z⁻¹).1 hzinvW + have hwz_pos : 0 < w z := by + exact lt_of_le_of_ne (w.nonneg z) (by + intro hzero + exact hz_ne ((w.eq_zero).1 hzero.symm)) + have hwz_ge : 1 ≤ w z := by + have hwinv : (w z)⁻¹ ≤ 1 := by + simpa [map_inv₀] using hwzinv_le + exact (inv_le_one₀ hwz_pos).1 hwinv + have hwz_eq : w z = 1 := le_antisymm hwz_le hwz_ge + have hwz_value : + w z = w x ^ n / v (Algebra.norm K x) := by + dsimp [z] + rw [map_div₀, AbsoluteValue.map_pow, hw_ext] + have hw_pow : w x ^ n = v (Algebra.norm K x) := + (div_eq_one_iff_eq hvnorm_ne).1 (hwz_value ▸ hwz_eq) + have hpow_eq : w x ^ n = rAbs x ^ n := + hw_pow.trans hr_pow.symm + exact (pow_left_inj₀ (w.nonneg x) (rAbs.nonneg x) hn_ne).1 hpow_eq + +open DiscreteValuationField.Valuation renaming + normFormula_extension_valuationSubring_eq_integralClosure_of_mem_or_inv → + normFormula_valuationSubring_eq_integralClosure in +/-- The finite-degree part of the finite norm-formula theorem: the unique extended absolute value +is the norm formula `|N(x)|^(1/[L:K])`. -/ +theorem normFormula_finite_extension_norm_formula + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (absoluteValueValuationSubring + v hnonarch).valuation) : + let hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + (absoluteValueValuationSubring v hnonarch) := + (henselianValuation_iff_henselFactorization v hnonarch).1 hhens + let extended := + normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization + (K := K) (L := L) v hnonarch hv + LubinTate.Valuations.NonarchimedeanAbsoluteValue extended ∧ + (∀ a : K, extended (algebraMap K L a) = v a) ∧ + (∀ x : L, extended x = + v (Algebra.norm K x) ^ (1 / (Module.finrank K L : ℝ))) ∧ + ∀ w : AbsoluteValue L ℝ, + LubinTate.Valuations.NonarchimedeanAbsoluteValue w → + (∀ a : K, w (algebraMap K L a) = v a) → + w = extended := by + let V := absoluteValueValuationSubring v hnonarch + let hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty V := + (henselianValuation_iff_henselFactorization v hnonarch).1 hhens + let extended := + normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization + (K := K) (L := L) v hnonarch hv + let hextendedNonarch := + normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_nonarchimedean + (K := K) (L := L) v hnonarch hv + refine ⟨hextendedNonarch, ?_, ?_, ?_⟩ + · exact + normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_extends_base + (K := K) (L := L) v hnonarch hv + · intro x + exact + normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_apply + (K := K) (L := L) v hnonarch hv x + · intro w hwnonarch hw_ext + let W := absoluteValueValuationSubring w hwnonarch + let R := absoluteValueValuationSubring + extended hextendedNonarch + let : Algebra.IsAlgebraic K L := Algebra.IsAlgebraic.of_finite K L + have hvalV : + ∀ z : L, + z ∈ (integralClosure V L).toSubring ∨ + z⁻¹ ∈ (integralClosure V L).toSubring := + normFormula_algebraic_integralClosure_mem_or_inv_of_henselFactorization + v hnonarch hv + have hval : + ∀ z : L, + z ∈ (integralClosure V.valuation.valuationSubring L).toSubring ∨ + z⁻¹ ∈ + (integralClosure V.valuation.valuationSubring L).toSubring := by + rw [ValuationSubring.valuationSubring_valuation] + exact hvalV + let : V.valuation.HasExtension W.valuation := + absoluteValueValuation_hasExtension_of_extends + v w hnonarch hwnonarch hw_ext + have hW := + normFormula_valuationSubring_eq_integralClosure + (K := K) (L := L) V hval W.valuation + have hextendedBase : ∀ a : K, extended (algebraMap K L a) = v a := + normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_extends_base + (K := K) (L := L) v hnonarch hv + let : V.valuation.HasExtension R.valuation := + absoluteValueValuation_hasExtension_of_extends + v extended hnonarch hextendedNonarch hextendedBase + have hR := + normFormula_valuationSubring_eq_integralClosure + (K := K) (L := L) V hval R.valuation + have hsub : W = R := by + simpa only [ValuationSubring.valuationSubring_valuation] using + hW.trans hR.symm + exact + normFormula_finite_normFormulaAbsoluteValue_eq_of_valuationSubring_eq_of_henselFactorization + (K := K) (L := L) v hnonarch hv w hwnonarch hw_ext + (by simpa [W, R, extended, hextendedNonarch] using hsub) + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaIntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaIntegralClosure.lean new file mode 100644 index 0000000000..d84187f721 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaIntegralClosure.lean @@ -0,0 +1,152 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients +/-! +# the actual integral closure is a valuation ring + +The factorization form of Hensel's lemma forces the endpoint coefficient +estimate for every irreducible polynomial. Applied to the norm-formula value, +this says that every algebraic element or its inverse is integral over the +base valuation ring. Thus the actual integral closure, rather than an +assumed target ring, satisfies the valuation-ring dichotomy. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +open scoped Polynomial + +/-- A closed unit for the finite norm-formula value is integral over the base +valuation ring, using only the primitive factorization definition's primitive factorization + property. -/ +theorem normFormula_finiteExtensionNormFormulaValue_isIntegral_of_le_one_of_henselFactorization + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + (absoluteValueValuationSubring v hnonarch)) + {x : L} (hx : finiteExtensionNormFormulaValue v x ≤ 1) : + IsIntegral + (absoluteValueValuationSubring v hnonarch) x := by + let V := absoluteValueValuationSubring v hnonarch + let : Algebra.IsAlgebraic K L := Algebra.IsAlgebraic.of_finite K L + let : Algebra.IsIntegral K L := Algebra.IsAlgebraic.isIntegral + have hxint : IsIntegral K x := Algebra.IsIntegral.isIntegral x + have hconst : v ((minpoly K x).coeff 0) ≤ 1 := + (normFormula_finiteExtensionNormFormulaValue_le_one_iff_minpoly_coeff_zero_le_one + v x).1 hx + have hcoeff : ∀ i : ℕ, v ((minpoly K x).coeff i) ≤ 1 := + normFormula_monic_coeff_abs_le_one_of_const_abs_le_one_of_henselFactorization + v hnonarch hv (minpoly.irreducible hxint) (minpoly.monic hxint) hconst + rcases + exists_polynomial_over_absoluteValueUnitBallSubringAsValuationSubring_of_coeff_abs_le_one + v hnonarch (minpoly K x) hcoeff with + ⟨F, hFmap, hFdegree, _hcoeff⟩ + have hφinj : Function.Injective (algebraMap V K) := by + intro a b hab + exact Subtype.ext hab + have hFmonic : F.Monic := by + apply Polynomial.monic_of_injective hφinj + rw [hFmap] + exact minpoly.monic hxint + have hFdegree_ne : F.natDegree ≠ 0 := by + rw [hFdegree] + exact Nat.ne_of_gt (minpoly.natDegree_pos hxint) + have hroot : (Polynomial.aeval x) F = 0 := by + have hmaproot : + (Polynomial.aeval x) (F.map (algebraMap V K)) = 0 := by + rw [hFmap] + exact minpoly.aeval K x + rwa [Polynomial.aeval_map_algebraMap K x F] at hmaproot + exact IsIntegral.of_aeval_monic hFmonic hFdegree_ne (by + rw [hroot] + exact isIntegral_zero) + +/-- In a finite extension, every element or its inverse belongs to the actual +integral closure of the base valuation ring. -/ +theorem normFormula_finite_integralClosure_mem_or_inv_of_henselFactorization + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + (absoluteValueValuationSubring v hnonarch)) + (x : L) : + x ∈ (integralClosure + (absoluteValueValuationSubring v hnonarch) L).toSubring ∨ + x⁻¹ ∈ (integralClosure + (absoluteValueValuationSubring v hnonarch) L).toSubring := by + by_cases hx : finiteExtensionNormFormulaValue v x ≤ 1 + · left + exact + normFormula_finiteExtensionNormFormulaValue_isIntegral_of_le_one_of_henselFactorization + v hnonarch hv hx + · right + have hx_gt : 1 < finiteExtensionNormFormulaValue v x := + lt_of_not_ge hx + have hx_pos : 0 < finiteExtensionNormFormulaValue v x := + zero_lt_one.trans hx_gt + have hinv : finiteExtensionNormFormulaValue v x⁻¹ ≤ 1 := by + rw [normFormula_finiteExtensionNormFormulaValue_inv] + exact (inv_le_one₀ hx_pos).2 hx_gt.le + exact + normFormula_finiteExtensionNormFormulaValue_isIntegral_of_le_one_of_henselFactorization + v hnonarch hv hinv + +/-- the finite norm-formula theorem, source-producing algebraic endpoint: for an arbitrary +algebraic extension, the actual integral closure of the Henselian valuation +ring satisfies the valuation-ring dichotomy. Each element is handled inside +the finite simple subextension that it generates. -/ +theorem normFormula_algebraic_integralClosure_mem_or_inv_of_henselFactorization + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + (absoluteValueValuationSubring v hnonarch)) + (x : L) : + x ∈ (integralClosure + (absoluteValueValuationSubring v hnonarch) L).toSubring ∨ + x⁻¹ ∈ (integralClosure + (absoluteValueValuationSubring v hnonarch) L).toSubring := by + let V := absoluteValueValuationSubring v hnonarch + let E := IntermediateField.adjoin K ({x} : Set L) + let xE : E := + ⟨x, IntermediateField.subset_adjoin K ({x} : Set L) + (Set.mem_singleton x)⟩ + have hxint : IsIntegral K x := Algebra.IsIntegral.isIntegral x + let : FiniteDimensional K E := + IntermediateField.adjoin.finiteDimensional hxint + have hfinite := + normFormula_finite_integralClosure_mem_or_inv_of_henselFactorization + (K := K) (L := E) v hnonarch hv xE + rcases hfinite with hxE | hxEinv + · left + have hxEint : IsIntegral V xE := hxE + have hmap := hxEint.map + ((IntermediateField.val E).restrictScalars V) + have hxintV : IsIntegral V x := by + simpa [E, xE] using hmap + exact (mem_integralClosure_iff (R := V) (A := L)).2 hxintV + · right + have hxEinvint : IsIntegral V xE⁻¹ := hxEinv + have hmap := hxEinvint.map + ((IntermediateField.val E).restrictScalars V) + have hxinvintV : IsIntegral V x⁻¹ := by + simpa [E, xE] using hmap + exact (mem_integralClosure_iff (R := V) (A := L)).2 hxinvintV + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/RamificationInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/RamificationInvariants.lean new file mode 100644 index 0000000000..e51ccfa94b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/RamificationInvariants.lean @@ -0,0 +1,1605 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueAlgebraicExtensions +public import Mathlib.LinearAlgebra.Dimension.Finrank +public import Mathlib.LinearAlgebra.Dimension.Free +public import Mathlib.Algebra.Order.WithTop.Untop0 +public import Mathlib.GroupTheory.Index +public import Mathlib.Data.ZMod.QuotientGroup +public import Mathlib.Algebra.Algebra.Tower +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv +/-! +# the fundamental inequality and identity + +The first part follows the proof on pp. 149--150: residue-basis lifts are +multiplied by representatives of distinct value-group cosets, and the +resulting family is linearly independent over the base field. The second +part uses the actual valuation rings. For a discrete Henselian base and a +finite separable extension, the finite norm-formula theorem identifies the target valuation ring +with the integral closure, so the local Dedekind ramification identity applies +without completeness. +-/ + +@[expose] public section + +noncomputable +section + +open scoped BigOperators + +namespace AlgebraicNumberTheory +namespace Valuations + +open Module + +private def ramificationAddValuation {K : Type*} [Field K] + (v : LubinTate.Valuations.ExponentialValuation K) : AddValuation K (WithTop ℝ) := + AddValuation.of v + ((v.eq_top_iff 0).mpr rfl) + (LubinTate.Valuations.exponentialValuation_one v) + v.add_le_min v.map_mul + +@[simp] +private theorem ramificationAddValuation_apply {K : Type*} [Field K] + (v : LubinTate.Valuations.ExponentialValuation K) (x : K) : + ramificationAddValuation v x = v x := + rfl + +private theorem ramificationAddValuation_finset_sum_eq_of_unique_min + {K I : Type*} [Field K] + (v : LubinTate.Valuations.ExponentialValuation K) (s : Finset I) (f : I → K) (j : I) + (hj : j ∈ s) (hjtop : v (f j) ≠ ⊤) + (hmin : ∀ i ∈ s, i ≠ j → v (f j) < v (f i)) : + v (∑ i ∈ s, f i) = v (f j) := by + classical + rw [← Finset.sum_erase_add s f hj, add_comm] + apply (ramificationAddValuation v).map_add_eq_of_lt_left + apply (ramificationAddValuation v).map_lt_sum hjtop + intro i hi + rcases Finset.mem_erase.mp hi with ⟨hij, his⟩ + exact hmin i his hij + +/-- A finite sum of nonzero terms of pairwise distinct values cannot vanish. -/ +private theorem exponentialValuation_finset_sum_ne_zero_of_value_ne + {K I : Type*} [Field K] + (v : LubinTate.Valuations.ExponentialValuation K) (s : Finset I) (f : I → K) + (hne : ∃ i ∈ s, f i ≠ 0) + (hpair : ∀ i ∈ s, ∀ j ∈ s, i ≠ j → + f i ≠ 0 → f j ≠ 0 → v (f i) ≠ v (f j)) : + ∑ i ∈ s, f i ≠ 0 := by + classical + let T := s.filter fun i ↦ f i ≠ 0 + have hT : T.Nonempty := by + rcases hne with ⟨i, his, hfi⟩ + exact ⟨i, Finset.mem_filter.mpr ⟨his, hfi⟩⟩ + obtain ⟨j, hjT, hjmin⟩ := T.exists_min_image (fun i ↦ v (f i)) hT + have hjS : j ∈ s := (Finset.mem_filter.mp hjT).1 + have hfj : f j ≠ 0 := (Finset.mem_filter.mp hjT).2 + have hmin : ∀ i ∈ T, i ≠ j → v (f j) < v (f i) := by + intro i hiT hij + have hiS : i ∈ s := (Finset.mem_filter.mp hiT).1 + have hfi : f i ≠ 0 := (Finset.mem_filter.mp hiT).2 + exact lt_of_le_of_ne (hjmin i hiT) + (hpair j hjS i hiS hij.symm hfj hfi) + have hvalue := + ramificationAddValuation_finset_sum_eq_of_unique_min + v T f j hjT (LubinTate.Valuations.exponentialValuation_ne_top_of_ne_zero v hfj) hmin + have hsum : (∑ i ∈ T, f i) = ∑ i ∈ s, f i := by + dsimp [T] + rw [Finset.sum_filter] + apply Finset.sum_congr rfl + intro i hi + by_cases hfi : f i = 0 <;> simp [hfi] + rw [hsum] at hvalue + intro hzero + rw [hzero, (v.eq_top_iff 0).mpr rfl] at hvalue + exact (LubinTate.Valuations.exponentialValuation_ne_top_of_ne_zero v hfj) hvalue.symm + +/-- The map of valuation rings induced by an exact extension of exponential +exponential valuations. -/ +def exponentialValuationRingMap + {K L : Type*} [Field K] [Field L] [Algebra K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) : + LubinTate.Valuations.exponentialValuationSubring v →+* + LubinTate.Valuations.exponentialValuationSubring w := + (algebraMap K L).restrict _ _ fun a ha ↦ by + change (0 : WithTop ℝ) ≤ w (algebraMap K L a) + rw [hExt] + exact ha + +@[simp] +theorem exponentialValuationRingMap_apply + {K L : Type*} [Field K] [Field L] [Algebra K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (a : LubinTate.Valuations.exponentialValuationSubring v) : + ((exponentialValuationRingMap v w hExt a : + LubinTate.Valuations.exponentialValuationSubring w) : L) = + algebraMap K L (a : K) := + rfl + +/-- Exact extension makes the induced map of valuation rings local. -/ +theorem exponentialValuationRingMap_isLocalHom + {K L : Type*} [Field K] [Field L] [Algebra K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) : + IsLocalHom (exponentialValuationRingMap v w hExt) := by + constructor + intro a ha + have hwzero : + w (((exponentialValuationRingMap v w hExt) a : + LubinTate.Valuations.exponentialValuationSubring w) : L) = 0 := + LubinTate.Valuations.exponentialValuation_eq_zero_of_isUnit w ha + have hvzero : v (a : K) = 0 := by + rw [exponentialValuationRingMap_apply, hExt] at hwzero + exact hwzero + exact LubinTate.Valuations.isUnit_of_exponentialValuation_eq_zero v hvzero + +/-- A nontrivial residue-linear combination of lifts is a unit in the target +valuation ring. This is the residue-basis step in the proof of the +fundamental inequality. -/ +private theorem exponentialValuation_residueCombination_value_zero + {K L J : Type*} [Field K] [Field L] [Algebra K L] + [Fintype J] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (omega : J → LubinTate.Valuations.exponentialValuationSubring w) + (homega : + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := exponentialValuationRingMap v w hExt + letI : Algebra V W := i.toAlgebra + letI : IsLocalHom i := + exponentialValuationRingMap_isLocalHom v w hExt + letI : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (IsLocalRing.ResidueField.map i).toAlgebra + LinearIndependent (IsLocalRing.ResidueField V) + (fun j ↦ IsLocalRing.residue W (omega j))) + (c : J → LubinTate.Valuations.exponentialValuationSubring v) + (hc : ∃ j, IsLocalRing.residue + (LubinTate.Valuations.exponentialValuationSubring v) (c j) ≠ 0) : + w (∑ j, algebraMap K L (c j : K) * (omega j : L)) = 0 := by + classical + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := exponentialValuationRingMap v w hExt + let : IsLocalHom i := + exponentialValuationRingMap_isLocalHom v w hExt + let : Algebra V W := i.toAlgebra + let : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (IsLocalRing.ResidueField.map i).toAlgebra + let s : W := ∑ j, i (c j) * omega j + have hres_ne : IsLocalRing.residue W s ≠ 0 := by + intro hs + have hcoeff_zero : + ∀ j, IsLocalRing.residue V (c j) = 0 := by + apply (Fintype.linearIndependent_iff.mp homega + (fun j ↦ IsLocalRing.residue V (c j))) + rw [← hs] + dsimp only [s] + simp only [map_sum, map_mul] + apply Finset.sum_congr rfl + intro j _hj + rw [← IsLocalRing.ResidueField.map_residue i] + rfl + rcases hc with ⟨j, hj⟩ + exact hj (hcoeff_zero j) + have hsunit : IsUnit s := by + exact (IsLocalRing.residue_ne_zero_iff_isUnit s).mp hres_ne + have hsvalue : w (s : L) = 0 := + LubinTate.Valuations.exponentialValuation_eq_zero_of_isUnit w hsunit + have hs_coe : + (s : L) = ∑ j, algebraMap K L (c j : K) * (omega j : L) := by + dsimp only [s] + change W.subtype (∑ j, i (c j) * omega j) = _ + rw [map_sum] + apply Finset.sum_congr rfl + intro j _hj + congr 1 + rw [hs_coe] at hsvalue + exact hsvalue + +/-- Dividing by an element of no larger value produces an element of the +valuation ring. -/ +private theorem exponentialValuation_div_nonneg_of_le + {K : Type*} [Field K] (v : LubinTate.Valuations.ExponentialValuation K) + {a b : K} (hb : b ≠ 0) (hba : v b ≤ v a) : + (0 : WithTop ℝ) ≤ v (a / b) := by + by_cases ha : a = 0 + · simp [ha, (v.eq_top_iff 0).mpr rfl] + · obtain ⟨ra, hra⟩ := + LubinTate.Valuations.exponentialValuation_exists_real_of_ne_zero v ha + obtain ⟨rb, hrb⟩ := + LubinTate.Valuations.exponentialValuation_exists_real_of_ne_zero v hb + have hrle : rb ≤ ra := by + rw [hra, hrb] at hba + exact WithTop.coe_le_coe.mp hba + rw [div_eq_mul_inv, v.map_mul, + LubinTate.Valuations.exponentialValuation_inv_value v hb hrb, hra] + exact WithTop.coe_nonneg.mpr (sub_nonneg.mpr hrle) + +/-- A nonzero linear combination of residue-basis lifts has the value of one +of its nonzero base coefficients. -/ +private theorem exponentialValuation_residueCombination_value_in_base + {K L J : Type*} [Field K] [Field L] [Algebra K L] + [Fintype J] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (omega : J → LubinTate.Valuations.exponentialValuationSubring w) + (homega : + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := exponentialValuationRingMap v w hExt + letI : Algebra V W := i.toAlgebra + letI : IsLocalHom i := + exponentialValuationRingMap_isLocalHom v w hExt + letI : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (IsLocalRing.ResidueField.map i).toAlgebra + LinearIndependent (IsLocalRing.ResidueField V) + (fun j ↦ IsLocalRing.residue W (omega j))) + (a : J → K) (ha : ∃ j, a j ≠ 0) : + ∃ a₀ : K, a₀ ≠ 0 ∧ + w (∑ j, algebraMap K L (a j) * (omega j : L)) = + w (algebraMap K L a₀) := by + classical + let S : Finset J := Finset.univ.filter fun j ↦ a j ≠ 0 + have hS : S.Nonempty := by + rcases ha with ⟨j, hj⟩ + exact ⟨j, Finset.mem_filter.mpr ⟨Finset.mem_univ _, hj⟩⟩ + obtain ⟨j₀, hj₀S, hj₀min⟩ := + S.exists_min_image (fun j ↦ v (a j)) hS + have hj₀ : a j₀ ≠ 0 := (Finset.mem_filter.mp hj₀S).2 + let c : J → LubinTate.Valuations.exponentialValuationSubring v := fun j ↦ + ⟨a j / a j₀, by + by_cases hj : a j = 0 + · simp [hj] + · apply exponentialValuation_div_nonneg_of_le v hj₀ + exact hj₀min j (Finset.mem_filter.mpr ⟨Finset.mem_univ _, hj⟩)⟩ + have hcj₀ : IsLocalRing.residue + (LubinTate.Valuations.exponentialValuationSubring v) (c j₀) ≠ 0 := by + have hcj₀eq : c j₀ = 1 := by + ext + simp [c, hj₀] + rw [hcj₀eq, map_one] + exact one_ne_zero + have hcvalue := + exponentialValuation_residueCombination_value_zero + v w hExt omega homega c ⟨j₀, hcj₀⟩ + have hfactor : + (∑ j, algebraMap K L (a j) * (omega j : L)) = + algebraMap K L (a j₀) * + (∑ j, algebraMap K L (c j : K) * (omega j : L)) := by + rw [Finset.mul_sum] + apply Finset.sum_congr rfl + intro j hj + simp only [c] + rw [← mul_assoc, ← map_mul] + field_simp + refine ⟨a j₀, hj₀, ?_⟩ + rw [hfactor, w.map_mul, hcvalue, add_zero] + +/-- The actual additive value group `v(Kˣ)`, realized as a subgroup of +`ℝ`. -/ +def exponentialValueSubgroup + {K : Type*} [Field K] (v : LubinTate.Valuations.ExponentialValuation K) : + AddSubgroup ℝ where + carrier := {r | ∃ x : K, x ≠ 0 ∧ v x = (r : WithTop ℝ)} + zero_mem' := ⟨1, one_ne_zero, by simp⟩ + add_mem' := by + rintro r s ⟨x, hx, hr⟩ ⟨y, hy, hs⟩ + refine ⟨x * y, mul_ne_zero hx hy, ?_⟩ + rw [v.map_mul, hr, hs, WithTop.coe_add] + neg_mem' := by + rintro r ⟨x, hx, hr⟩ + refine ⟨x⁻¹, inv_ne_zero hx, ?_⟩ + exact LubinTate.Valuations.exponentialValuation_inv_value v hx hr + +/-- Conversely to the valuation-ring criterion, if the valuation ring attached to an exponential +exponential valuation is a DVR, its real value group is discrete. -/ +theorem discreteExponentialValuation_of_isDiscreteValuationRing + {K : Type*} [Field K] (v : LubinTate.Valuations.ExponentialValuation K) + [IsDiscreteValuationRing (LubinTate.Valuations.exponentialValuationSubring v)] : + LubinTate.Valuations.DiscreteExponentialValuation v := by + let V := LubinTate.Valuations.exponentialValuationSubring v + obtain ⟨pi, hpi⟩ := IsDiscreteValuationRing.exists_irreducible V + have hpi0V : pi ≠ 0 := hpi.ne_zero + have hpi0 : (pi : K) ≠ 0 := by + intro hz + exact hpi0V (Subtype.ext hz) + have hpiMax : pi ∈ IsLocalRing.maximalIdeal V := by + rw [IsLocalRing.mem_maximalIdeal] + exact hpi.not_isUnit + have hpipos : (0 : WithTop ℝ) < v (pi : K) := by + rw [← LubinTate.Valuations.exponentialMaxIdeal_eq_maximalIdeal v] at hpiMax + exact hpiMax + let s : ℝ := (v (pi : K)).untop₀ + have hpival : v (pi : K) = (s : WithTop ℝ) := + (WithTop.coe_untop₀_of_ne_top + (LubinTate.Valuations.exponentialValuation_ne_top_of_ne_zero v hpi0)).symm + have hs : 0 < s := by + rw [hpival] at hpipos + exact WithTop.coe_lt_coe.mp hpipos + refine ⟨s, hs, ?_, (pi : K), hpival⟩ + intro x hx + rcases LubinTate.Valuations.exponentialValuationRing_mem_or_inv_mem v x with hxV | hxinvV + · let xV : V := ⟨x, hxV⟩ + have hxV0 : xV ≠ 0 := by + intro hz + exact hx (congrArg Subtype.val hz) + obtain ⟨n, u, hu⟩ := + IsDiscreteValuationRing.eq_unit_mul_pow_irreducible hxV0 hpi + have huval : v (((u : Vˣ) : V) : K) = 0 := + LubinTate.Valuations.exponentialValuation_eq_zero_of_isUnit v u.isUnit + have hxEq : x = (((u : Vˣ) : V) : K) * (pi : K) ^ n := + congrArg Subtype.val hu + refine ⟨(n : ℤ), ?_⟩ + rw [hxEq, v.map_mul, huval, zero_add, + LubinTate.Valuations.discretePrimeElement_pow_value v hpival] + norm_num + · let xinvV : V := ⟨x⁻¹, hxinvV⟩ + have hxinv0 : xinvV ≠ 0 := by + intro hz + exact (inv_ne_zero hx) (congrArg Subtype.val hz) + obtain ⟨n, u, hu⟩ := + IsDiscreteValuationRing.eq_unit_mul_pow_irreducible hxinv0 hpi + have huval : v (((u : Vˣ) : V) : K) = 0 := + LubinTate.Valuations.exponentialValuation_eq_zero_of_isUnit v u.isUnit + have hxinvEq : x⁻¹ = (((u : Vˣ) : V) : K) * (pi : K) ^ n := + congrArg Subtype.val hu + have hxinvVal : v x⁻¹ = (((n : ℝ) * s : ℝ) : WithTop ℝ) := by + rw [hxinvEq, v.map_mul, huval, zero_add, + LubinTate.Valuations.discretePrimeElement_pow_value v hpival] + have hxVal := + LubinTate.Valuations.exponentialValuation_inv_value v (inv_ne_zero hx) hxinvVal + refine ⟨-(n : ℤ), ?_⟩ + rw [inv_inv] at hxVal + convert hxVal using 1 + norm_num + +private theorem discretePrimeElement_zpow_value_scaled + {K : Type*} [Field K] (v : LubinTate.Valuations.ExponentialValuation K) + {pi : K} {s : ℝ} (hpi0 : pi ≠ 0) + (hpival : v pi = (s : WithTop ℝ)) (m : ℤ) : + v (pi ^ m) = ((((m : ℝ) * s : ℝ)) : WithTop ℝ) := by + cases m with + | ofNat n => + simpa [zpow_natCast] using + LubinTate.Valuations.discretePrimeElement_pow_value v hpival n + | negSucc n => + have hpow0 : pi ^ (n + 1) ≠ 0 := pow_ne_zero _ hpi0 + have hpowval := + LubinTate.Valuations.discretePrimeElement_pow_value v hpival (n + 1) + have hinv := + LubinTate.Valuations.exponentialValuation_inv_value v hpow0 hpowval + rw [zpow_negSucc, hinv] + apply congrArg (fun z : ℝ ↦ (z : WithTop ℝ)) + norm_num [Int.cast_negSucc, Nat.cast_add, Nat.cast_one] + ring + +/-- A discrete value group with least positive value `s` is literally the +cyclic subgroup `sℤ` of `ℝ`. -/ +private theorem exponentialValueSubgroup_eq_zmultiples + {K : Type*} [Field K] (v : LubinTate.Valuations.ExponentialValuation K) + {s : ℝ} + (hvalues : ∀ x : K, x ≠ 0 → ∃ m : ℤ, + v x = ((((m : ℝ) * s : ℝ)) : WithTop ℝ)) + {pi : K} (hpival : v pi = (s : WithTop ℝ)) : + exponentialValueSubgroup v = AddSubgroup.zmultiples s := by + have hpi0 : pi ≠ 0 := + LubinTate.Valuations.discretePrimeElement_ne_zero_of_value v hpival + ext r + constructor + · rintro ⟨x, hx, hr⟩ + obtain ⟨m, hm⟩ := hvalues x hx + have hre : r = (m : ℝ) * s := by + rw [hr] at hm + exact WithTop.coe_eq_coe.mp hm + rw [AddSubgroup.mem_zmultiples_iff] + refine ⟨m, ?_⟩ + simpa [zsmul_eq_mul] using hre.symm + · rw [AddSubgroup.mem_zmultiples_iff] + rintro ⟨m, rfl⟩ + refine ⟨pi ^ m, zpow_ne_zero m hpi0, ?_⟩ + simpa [zsmul_eq_mul] using + discretePrimeElement_zpow_value_scaled v hpi0 hpival m + +/-- The element of least positive discrete discrete value generates the maximal +ideal of its valuation ring. -/ +private theorem maximalIdeal_eq_span_discretePrimeElement + {K : Type*} [Field K] (v : LubinTate.Valuations.ExponentialValuation K) + {s : ℝ} (hs : 0 < s) + (hvalues : ∀ x : K, x ≠ 0 → ∃ m : ℤ, + v x = ((((m : ℝ) * s : ℝ)) : WithTop ℝ)) + {pi : K} (hpival : v pi = (s : WithTop ℝ)) : + IsLocalRing.maximalIdeal (LubinTate.Valuations.exponentialValuationSubring v) = + Ideal.span ({LubinTate.Valuations.discretePrimeElementInValuationSubring + v hs.le hpival} : Set (LubinTate.Valuations.exponentialValuationSubring v)) := by + let piV := LubinTate.Valuations.discretePrimeElementInValuationSubring v hs.le hpival + apply le_antisymm + · intro x hx + by_cases hx0 : (x : K) = 0 + · have : x = 0 := Subtype.ext hx0 + simp [this] + · obtain ⟨n, hn⟩ := + LubinTate.Valuations.discreteExponentialValuation_subring_exists_nat_value + hs hvalues hx0 + have hxpos : (0 : WithTop ℝ) < v (x : K) := by + rw [← LubinTate.Valuations.exponentialMaxIdeal_eq_maximalIdeal v] at hx + exact hx + have hn0 : n ≠ 0 := by + intro hnzero + subst n + have hxval0 : v (x : K) = 0 := by simpa using hn + rw [hxval0] at hxpos + simp at hxpos + have hsle : ((s : ℝ) : WithTop ℝ) ≤ v (x : K) := by + rw [hn] + exact WithTop.coe_le_coe.mpr (by + have hnle : (1 : ℝ) ≤ n := by exact_mod_cast Nat.one_le_iff_ne_zero.mpr hn0 + nlinarith) + have hxpow : x ∈ LubinTate.Valuations.uniformizerPowerIdeal piV 1 := + (LubinTate.Valuations.discrete_uniformizerPowerIdeal_mem_iff_value_ge + v hs hpival 1 x).2 (by simpa using hsle) + simpa [piV, LubinTate.Valuations.uniformizerPowerIdeal] using hxpow + · rw [Ideal.span_le] + intro x hx + have hxpi : x = piV := by simpa [piV] using hx + subst x + rw [← LubinTate.Valuations.exponentialMaxIdeal_eq_maximalIdeal v] + change (0 : WithTop ℝ) < v pi + rw [hpival] + exact WithTop.coe_lt_coe.mpr hs + +/-- The ideal-theoretic ramification index is exactly the scaling factor +between the least positive generators of the two discrete value groups. -/ +private theorem exists_valueGroup_generators_scaled_by_ramificationIdx + {K L : Type*} [Field K] [Field L] [Algebra K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (hv : LubinTate.Valuations.DiscreteExponentialValuation v) + (hw : LubinTate.Valuations.DiscreteExponentialValuation w) + [IsDiscreteValuationRing (LubinTate.Valuations.exponentialValuationSubring v)] + [IsDiscreteValuationRing (LubinTate.Valuations.exponentialValuationSubring w)] : + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := exponentialValuationRingMap v w hExt + letI : Algebra V W := i.toAlgebra + let e := Ideal.ramificationIdx' + (IsLocalRing.maximalIdeal V) (IsLocalRing.maximalIdeal W) + ∃ s t : ℝ, t ≠ 0 ∧ + exponentialValueSubgroup v = AddSubgroup.zmultiples s ∧ + exponentialValueSubgroup w = AddSubgroup.zmultiples t ∧ + s = (e : ℝ) * t := by + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := exponentialValuationRingMap v w hExt + let : IsLocalHom i := + exponentialValuationRingMap_isLocalHom v w hExt + let : Algebra V W := i.toAlgebra + let e := Ideal.ramificationIdx' + (IsLocalRing.maximalIdeal V) (IsLocalRing.maximalIdeal W) + rcases hv with ⟨s, hs, hvalues, pi, hpival⟩ + rcases hw with ⟨t, ht, hwvalues, Pi, hPival⟩ + let piV := LubinTate.Valuations.discretePrimeElementInValuationSubring v hs.le hpival + let PiW := LubinTate.Valuations.discretePrimeElementInValuationSubring w ht.le hPival + have hVspan : IsLocalRing.maximalIdeal V = Ideal.span ({piV} : Set V) := + maximalIdeal_eq_span_discretePrimeElement v hs hvalues hpival + have hWspan : IsLocalRing.maximalIdeal W = Ideal.span ({PiW} : Set W) := + maximalIdeal_eq_span_discretePrimeElement w ht hwvalues hPival + have hi : Function.Injective i := by + intro a b hab + apply Subtype.ext + exact (algebraMap K L).injective (congrArg Subtype.val hab) + have hmap := + ValuationTheory.map_maximalIdeal_eq_pow_ramificationIdx + (R := V) (S := W) hi + change Ideal.map i (IsLocalRing.maximalIdeal V) = + IsLocalRing.maximalIdeal W ^ e at hmap + have hspan : Ideal.span ({i piV} : Set W) = + Ideal.span ({PiW ^ e} : Set W) := by + calc + Ideal.span ({i piV} : Set W) = + Ideal.map i (IsLocalRing.maximalIdeal V) := by + rw [hVspan, Ideal.map_span, Set.image_singleton] + _ = IsLocalRing.maximalIdeal W ^ e := hmap + _ = Ideal.span ({PiW} : Set W) ^ e := by rw [hWspan] + _ = Ideal.span ({PiW ^ e} : Set W) := + Ideal.span_singleton_pow PiW e + obtain ⟨u, hu⟩ := Ideal.span_singleton_eq_span_singleton.mp hspan + have huval : w ((((u : Wˣ) : W) : L)) = 0 := + LubinTate.Valuations.exponentialValuation_eq_zero_of_isUnit w u.isUnit + have hfield := congrArg (fun z : W ↦ (z : L)) hu + have hvalue := congrArg w hfield + have hscale : s = (e : ℝ) * t := by + change w (algebraMap K L pi * (((u : Wˣ) : W) : L)) = + w ((Pi : L) ^ e) at hvalue + rw [w.map_mul, hExt, hpival, huval, add_zero, + LubinTate.Valuations.discretePrimeElement_pow_value w hPival] at hvalue + exact WithTop.coe_eq_coe.mp hvalue + refine ⟨s, t, ne_of_gt ht, + exponentialValueSubgroup_eq_zmultiples v hvalues hpival, + exponentialValueSubgroup_eq_zmultiples w hwvalues hPival, + hscale⟩ + +/-- Exact extension embeds the base value group in the target value group. -/ +theorem exponentialValueSubgroup_le_of_extends + {K L : Type*} [Field K] [Field L] [Algebra K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) : + exponentialValueSubgroup v ≤ exponentialValueSubgroup w := by + rintro r ⟨a, ha, hval⟩ + refine ⟨algebraMap K L a, (map_ne_zero (algebraMap K L)).mpr ha, ?_⟩ + rw [hExt, hval] + +/-- The actual quotient `w(Lˣ) / v(Kˣ)` of value groups. The `comap` +is the base subgroup viewed inside the target subgroup. -/ +def ExponentialValueGroupQuotient + {K L : Type*} [Field K] [Field L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) := + exponentialValueSubgroup w ⧸ + (exponentialValueSubgroup v).comap + (exponentialValueSubgroup w).subtype + +/-- The ramification index as the actual value-group quotient cardinality. -/ +def exponentialRamificationIndex + {K L : Type*} [Field K] [Field L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) : ℕ := + Nat.card (ExponentialValueGroupQuotient v w) + +/-- If the target value group is `tℤ` and the base value group is +`(e t)ℤ`, their actual quotient has cardinality `e`. -/ +private theorem exponentialRamificationIndex_eq_of_cyclic_valueSubgroups + {K L : Type*} [Field K] [Field L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + {s t : ℝ} (ht : t ≠ 0) (e : ℕ) + (hvgroup : + exponentialValueSubgroup v = AddSubgroup.zmultiples s) + (hwgroup : + exponentialValueSubgroup w = AddSubgroup.zmultiples t) + (hscale : s = (e : ℝ) * t) : + exponentialRamificationIndex v w = e := by + let Gamma := exponentialValueSubgroup w + let H : AddSubgroup Gamma := + (exponentialValueSubgroup v).comap + (exponentialValueSubgroup w).subtype + let g : Gamma := ⟨t, by + change t ∈ exponentialValueSubgroup w + rw [hwgroup] + exact AddSubgroup.mem_zmultiples t⟩ + let phi : ℤ →+ Gamma := zmultiplesHom Gamma g + have hphi : Function.Surjective phi := by + intro z + have hz : (z : ℝ) ∈ AddSubgroup.zmultiples t := by + rw [← hwgroup] + exact z.property + obtain ⟨n, hn⟩ := AddSubgroup.mem_zmultiples_iff.mp hz + refine ⟨n, ?_⟩ + apply Subtype.ext + simpa [phi, g] using hn + have hcomap : H.comap phi = AddSubgroup.zmultiples (e : ℤ) := by + ext n + constructor + · intro hn + change phi n ∈ H at hn + change (((phi n : Gamma) : ℝ)) ∈ + exponentialValueSubgroup v at hn + have hn' : ((n : ℝ) * t) ∈ exponentialValueSubgroup v := by + simpa [phi, g, zsmul_eq_mul] using hn + rw [hvgroup, hscale, AddSubgroup.mem_zmultiples_iff] at hn' + obtain ⟨m, hm⟩ := hn' + rw [AddSubgroup.mem_zmultiples_iff] + refine ⟨m, ?_⟩ + have hreal : (m * (e : ℤ) : ℤ) = n := by + have hcast : (((m * (e : ℤ) : ℤ) : ℝ)) = (n : ℝ) := by + apply mul_right_cancel₀ ht + simpa [zsmul_eq_mul, mul_assoc, mul_comm, mul_left_comm] using hm + exact_mod_cast hcast + simp [hreal] + · intro hn + rw [AddSubgroup.mem_zmultiples_iff] at hn + obtain ⟨m, rfl⟩ := hn + change phi (m • (e : ℤ)) ∈ H + change (((phi (m • (e : ℤ)) : Gamma) : ℝ)) ∈ + exponentialValueSubgroup v + rw [hvgroup, hscale, AddSubgroup.mem_zmultiples_iff] + refine ⟨m, ?_⟩ + simp [phi, g, zsmul_eq_mul] + ring + change Nat.card (Gamma ⧸ H) = e + calc + Nat.card (Gamma ⧸ H) = H.index := rfl + _ = (H.comap phi).index := + (H.index_comap_of_surjective hphi).symm + _ = (AddSubgroup.zmultiples (e : ℤ)).index := by rw [hcomap] + _ = Nat.card (ℤ ⧸ AddSubgroup.zmultiples (e : ℤ)) := rfl + _ = Nat.card (ZMod e) := + Nat.card_congr (Int.quotientZMultiplesNatEquivZMod e).toEquiv + _ = e := Nat.card_zmod e + +/-- For discrete source and target valuation rings, the quotient-cardinality +ramification index agrees with mathlib's local Dedekind ramification index. -/ +theorem exponentialRamificationIndex_eq_ideal_ramificationIdx + {K L : Type*} [Field K] [Field L] [Algebra K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (hv : LubinTate.Valuations.DiscreteExponentialValuation v) + [IsDiscreteValuationRing (LubinTate.Valuations.exponentialValuationSubring v)] + [IsDiscreteValuationRing (LubinTate.Valuations.exponentialValuationSubring w)] : + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := exponentialValuationRingMap v w hExt + letI : Algebra V W := i.toAlgebra + exponentialRamificationIndex v w = + Ideal.ramificationIdx' + (IsLocalRing.maximalIdeal V) (IsLocalRing.maximalIdeal W) := by + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := exponentialValuationRingMap v w hExt + let : IsLocalHom i := + exponentialValuationRingMap_isLocalHom v w hExt + let : Algebra V W := i.toAlgebra + let e := Ideal.ramificationIdx' + (IsLocalRing.maximalIdeal V) (IsLocalRing.maximalIdeal W) + have hw : LubinTate.Valuations.DiscreteExponentialValuation w := + discreteExponentialValuation_of_isDiscreteValuationRing w + obtain ⟨s, t, ht, hvgroup, hwgroup, hscale⟩ := + exists_valueGroup_generators_scaled_by_ramificationIdx + v w hExt hv hw + exact exponentialRamificationIndex_eq_of_cyclic_valueSubgroups + v w ht e hvgroup hwgroup hscale + +/-- The actual residue degree of an exact valued extension. -/ +def exponentialResidueDegree + {K L : Type*} [Field K] [Field L] [Algebra K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) : ℕ := by + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := exponentialValuationRingMap v w hExt + letI : IsLocalHom i := + exponentialValuationRingMap_isLocalHom v w hExt + letI : Algebra V W := i.toAlgebra + letI : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (IsLocalRing.ResidueField.map i).toAlgebra + exact Module.finrank (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) + +/-- The residue finrank is exactly mathlib's local inertia degree. -/ +theorem exponentialResidueDegree_eq_ideal_inertiaDeg + {K L : Type*} [Field K] [Field L] [Algebra K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) : + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := exponentialValuationRingMap v w hExt + letI : IsLocalHom i := + exponentialValuationRingMap_isLocalHom v w hExt + letI : Algebra V W := i.toAlgebra + exponentialResidueDegree v w hExt = + (IsLocalRing.maximalIdeal W).inertiaDeg V := by + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := exponentialValuationRingMap v w hExt + let : IsLocalHom i := + exponentialValuationRingMap_isLocalHom v w hExt + let : Algebra V W := i.toAlgebra + let Amap : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (IsLocalRing.ResidueField.map i).toAlgebra + let : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := Amap + let : (IsLocalRing.maximalIdeal W).LiesOver + (IsLocalRing.maximalIdeal V) := + ⟨(ValuationTheory.DiscreteValuationField.ResidueField.comap_maximalIdeal_eq i).symm⟩ + change Module.finrank (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) = + (IsLocalRing.maximalIdeal W).inertiaDeg V + let Astd : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + Ideal.Quotient.algebraOfLiesOver + (IsLocalRing.maximalIdeal W) (IsLocalRing.maximalIdeal V) + have hmap : + @algebraMap (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) _ _ Amap = + @algebraMap (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) _ _ Astd := by + ext x + obtain ⟨a, rfl⟩ := IsLocalRing.residue_surjective x + rfl + have hAlg : Amap = Astd := by + apply Algebra.algebra_ext + intro r + exact DFunLike.congr_fun hmap r + have hfin : + @Module.finrank (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) _ _ + (@Algebra.toModule _ _ _ _ Amap) = + @Module.finrank (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) _ _ + (@Algebra.toModule _ _ _ _ Astd) := by + rw [hAlg] + have h := (Ideal.inertiaDeg_eq_of_isMaximal + (IsLocalRing.maximalIdeal V) (IsLocalRing.maximalIdeal W)).symm + exact h + +/-- The canonical multiplicative presentation `exp (-v(x))` of an exponential +exponential valuation. -/ +noncomputable def exponentialAssociatedAbsoluteValue + {K : Type*} [Field K] (v : LubinTate.Valuations.ExponentialValuation K) : + AbsoluteValue K ℝ := by + classical + refine + { toFun := fun x ↦ if x = 0 then 0 else Real.exp (-(v x).untop₀) + map_mul' := ?_ + nonneg' := ?_ + eq_zero' := ?_ + add_le' := ?_ } + · intro x y + by_cases hx : x = 0 + · subst x + simp + by_cases hy : y = 0 + · subst y + simp + have hxy : x * y ≠ 0 := mul_ne_zero hx hy + have hreal : (v (x * y)).untop₀ = + (v x).untop₀ + (v y).untop₀ := by + apply WithTop.coe_eq_coe.mp + rw [WithTop.coe_add, + WithTop.coe_untop₀_of_ne_top + (LubinTate.Valuations.exponentialValuation_ne_top_of_ne_zero v hxy), + WithTop.coe_untop₀_of_ne_top + (LubinTate.Valuations.exponentialValuation_ne_top_of_ne_zero v hx), + WithTop.coe_untop₀_of_ne_top + (LubinTate.Valuations.exponentialValuation_ne_top_of_ne_zero v hy)] + exact v.map_mul x y + simp only [hx, hy, hxy, ite_false] + rw [hreal, neg_add, Real.exp_add] + · intro x + by_cases hx : x = 0 + · simp [hx] + · simp [hx, Real.exp_nonneg] + · intro x + by_cases hx : x = 0 + · simp [hx] + · simp [hx, Real.exp_ne_zero] + · intro x y + by_cases hx : x = 0 + · subst x + simp + by_cases hy : y = 0 + · subst y + simp + by_cases hxy : x + y = 0 + · simp only [hx, hy, hxy, ite_false, ite_true] + positivity + let r := (v x).untop₀ + let s := (v y).untop₀ + let t := (v (x + y)).untop₀ + have hvr : v x = (r : WithTop ℝ) := + (WithTop.coe_untop₀_of_ne_top + (LubinTate.Valuations.exponentialValuation_ne_top_of_ne_zero v hx)).symm + have hvs : v y = (s : WithTop ℝ) := + (WithTop.coe_untop₀_of_ne_top + (LubinTate.Valuations.exponentialValuation_ne_top_of_ne_zero v hy)).symm + have hvt : v (x + y) = (t : WithTop ℝ) := + (WithTop.coe_untop₀_of_ne_top + (LubinTate.Valuations.exponentialValuation_ne_top_of_ne_zero v hxy)).symm + have hmin : min r s ≤ t := by + have h := v.add_le_min x y + rw [hvr, hvs, hvt] at h + exact WithTop.coe_le_coe.mp (by simpa only [WithTop.coe_min] using h) + have hmain : Real.exp (-t) ≤ Real.exp (-r) + Real.exp (-s) := by + refine (Real.exp_le_exp.mpr (neg_le_neg hmin)).trans ?_ + by_cases hrs : r ≤ s + · rw [min_eq_left hrs] + exact le_add_of_nonneg_right (Real.exp_nonneg _) + · rw [min_eq_right (le_of_not_ge hrs)] + exact le_add_of_nonneg_left (Real.exp_nonneg _) + simpa only [hx, hy, hxy, ite_false, r, s, t] using hmain + +/-- The canonical multiplicative presentation is associated to `v`, with +the fixed base `e = exp 1`. -/ +theorem exponentialAssociatedAbsoluteValue_associated + {K : Type*} [Field K] (v : LubinTate.Valuations.ExponentialValuation K) : + LubinTate.Valuations.AssociatedAbsoluteValue v (Real.exp 1) + (exponentialAssociatedAbsoluteValue v) := by + refine ⟨Real.one_lt_exp_iff.mpr zero_lt_one, ?_⟩ + intro x hx + refine ⟨(v x).untop₀, ?_, ?_⟩ + · exact (WithTop.coe_untop₀_of_ne_top + (LubinTate.Valuations.exponentialValuation_ne_top_of_ne_zero v hx)).symm + · simp [exponentialAssociatedAbsoluteValue, hx, Real.exp_one_rpow] + +/-- An absolute value associated to a exponential valuation is +nonarchimedean; the strong triangle inequality is the exponential +ultrametric inequality transported through the decreasing map +`r ↦ q ^ (-r)`. -/ +theorem associatedAbsoluteValue_nonarchimedean + {K : Type*} [Field K] + (v : LubinTate.Valuations.ExponentialValuation K) (q : ℝ) + (abv : AbsoluteValue K ℝ) + (hassoc : LubinTate.Valuations.AssociatedAbsoluteValue v q abv) : + LubinTate.Valuations.NonarchimedeanAbsoluteValue abv := by + apply LubinTate.Valuations.nonarchimedean_of_strong_triangle + intro x y + by_cases hx : x = 0 + · subst x + simp + by_cases hy : y = 0 + · subst y + simp + by_cases hxy : x + y = 0 + · simp [hxy] + obtain ⟨r, hvr, habvr⟩ := hassoc.2 x hx + obtain ⟨s, hvs, habvs⟩ := hassoc.2 y hy + obtain ⟨t, hvt, habvt⟩ := hassoc.2 (x + y) hxy + have hmin : min r s ≤ t := by + have h := v.add_le_min x y + rw [hvr, hvs, hvt] at h + exact WithTop.coe_le_coe.mp (by simpa only [WithTop.coe_min] using h) + rw [habvr, habvs, habvt] + have hpow : q ^ (-t) ≤ q ^ (-(min r s)) := + Real.rpow_le_rpow_of_exponent_le (le_of_lt hassoc.1) + (neg_le_neg hmin) + refine hpow.trans ?_ + by_cases hrs : r ≤ s + · rw [min_eq_left hrs] + exact le_max_left _ _ + · have hsr : s ≤ r := le_of_not_ge hrs + rw [min_eq_right hsr] + exact le_max_right _ _ + +/-- Associated additive and multiplicative presentations have the same +valuation subring. -/ +theorem associatedAbsoluteValue_valuationSubring_eq + {K : Type*} [Field K] + (v : LubinTate.Valuations.ExponentialValuation K) (q : ℝ) + (abv : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue abv) + (hassoc : LubinTate.Valuations.AssociatedAbsoluteValue v q abv) : + LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v = + absoluteValueValuationSubring abv hnonarch := by + ext x + rw [LubinTate.Valuations.mem_exponentialValuationSubringAsValuationSubring_iff, + mem_absoluteValueValuationSubring_iff] + by_cases hx : x = 0 + · subst x + simp [(v.eq_top_iff 0).mpr rfl] + · exact (LubinTate.Valuations.associatedAbsoluteValue_le_one_iff hassoc hx).symm + +/-- Exact extension of associated exponential valuations gives exact +extension of the associated absolute values. -/ +theorem associatedAbsoluteValue_extends + {K L : Type*} [Field K] [Field L] [Algebra K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (q : ℝ) (av : AbsoluteValue K ℝ) (aw : AbsoluteValue L ℝ) + (hav : LubinTate.Valuations.AssociatedAbsoluteValue v q av) + (haw : LubinTate.Valuations.AssociatedAbsoluteValue w q aw) : + ∀ a : K, aw (algebraMap K L a) = av a := by + intro a + by_cases ha : a = 0 + · subst a + simp + · have hma : algebraMap K L a ≠ 0 := + (map_ne_zero (algebraMap K L)).mpr ha + obtain ⟨r, hvr, havr⟩ := hav.2 a ha + obtain ⟨s, hws, haws⟩ := haw.2 (algebraMap K L a) hma + have hrs : r = s := by + rw [hExt, hvr] at hws + exact WithTop.coe_eq_coe.mp hws + rw [havr, haws, hrs] + +/-- A literal equality with the integral-closure subring produces the +corresponding `IsIntegralClosure` instance. -/ +private theorem isIntegralClosure_of_subring_eq + {K L : Type*} [Field K] [Field L] + (V : Subring K) (W : Subring L) + [Algebra V L] + (h : W = (integralClosure V L).toSubring) : + IsIntegralClosure W V L := by + refine + { algebraMap_injective := by + exact W.subtype_injective + isIntegral_iff := ?_ } + intro x + constructor + · intro hx + have hxW : x ∈ W := by + rw [h] + exact hx + exact ⟨⟨x, hxW⟩, rfl⟩ + · rintro ⟨y, rfl⟩ + change (y : L) ∈ (integralClosure V L).toSubring + rw [← h] + exact y.property + +/-- the finite norm-formula theorem applied directly to the exponential presentation: a chosen +extension of a Henselian valuation has valuation ring equal to the actual +integral closure. The required multiplicative presentations are constructed +internally. -/ +theorem exponentialValuationSubring_eq_integralClosure_of_henselian + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) : + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring w).toSubring = + (integralClosure + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v) L).toSubring := by + let av := exponentialAssociatedAbsoluteValue v + let aw := exponentialAssociatedAbsoluteValue w + have hav : LubinTate.Valuations.AssociatedAbsoluteValue v (Real.exp 1) av := + exponentialAssociatedAbsoluteValue_associated v + have haw : LubinTate.Valuations.AssociatedAbsoluteValue w (Real.exp 1) aw := + exponentialAssociatedAbsoluteValue_associated w + have havNonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue av := + associatedAbsoluteValue_nonarchimedean v (Real.exp 1) av hav + have hawNonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue aw := + associatedAbsoluteValue_nonarchimedean w (Real.exp 1) aw haw + let Vv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v + let Wv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring w + let Va := absoluteValueValuationSubring av havNonarch + let Wa := absoluteValueValuationSubring aw hawNonarch + have hV : Vv = Va := + associatedAbsoluteValue_valuationSubring_eq + v (Real.exp 1) av havNonarch hav + have hW : Wv = Wa := + associatedAbsoluteValue_valuationSubring_eq + w (Real.exp 1) aw hawNonarch haw + have hhensA : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + Va.valuation := by + rw [← hV] + exact hhens + have habsExt : ∀ a : K, aw (algebraMap K L a) = av a := + associatedAbsoluteValue_extends + v w hExt (Real.exp 1) av aw hav haw + have hWaExt : Va.valuation.HasExtension Wa.valuation := + absoluteValueValuation_hasExtension_of_extends + av aw havNonarch hawNonarch habsExt + let : Va.valuation.HasExtension Wa.valuation := hWaExt + obtain ⟨B, hB, _hBuniq⟩ := + normFormula_algebraic_extension (K := K) (L := L) + av havNonarch hhensA + obtain ⟨C, hC, hCuniq⟩ := + henselianUniqueExtension_unique_algebraic_valuationSubring_extension_of_henselian + (K := K) (L := L) av havNonarch hhensA + have hWaC : Wa = C := hCuniq Wa hWaExt + have hBC : B = C := hCuniq B hB.1 + have hWaB : Wa = B := hWaC.trans hBC.symm + calc + Wv.toSubring = Wa.toSubring := congrArg ValuationSubring.toSubring hW + _ = B.toSubring := congrArg ValuationSubring.toSubring hWaB + _ = (integralClosure Va L).toSubring := hB.2 + _ = (integralClosure Vv L).toSubring := by rw [hV] + +/-- The value-coset class of a nonzero target-field element. -/ +def exponentialValueCoset + {K L : Type*} [Field K] [Field L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (x : L) (hx : x ≠ 0) : ExponentialValueGroupQuotient v w := + QuotientAddGroup.mk ⟨(w x).untop₀, ⟨x, hx, + (WithTop.coe_untop₀_of_ne_top + (LubinTate.Valuations.exponentialValuation_ne_top_of_ne_zero w hx)).symm⟩⟩ + +/-- Every class in the actual value-group quotient is represented by the +value of a nonzero element of the target field. -/ +private theorem exponentialValueCoset_units_surjective + {K L : Type*} [Field K] [Field L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) : + Function.Surjective + (fun x : Lˣ ↦ exponentialValueCoset v w (x : L) x.ne_zero) := by + intro q + obtain ⟨gamma, hgamma⟩ := QuotientAddGroup.mk_surjective q + obtain ⟨x, hx, hvalue⟩ := gamma.property + refine ⟨Units.mk0 x hx, ?_⟩ + rw [← hgamma] + unfold exponentialValueCoset + apply congrArg QuotientAddGroup.mk + apply Subtype.ext + simp [hvalue] + +/-- Equality after cross-multiplying by nonzero base elements forces equality +of the corresponding value-group quotient classes. -/ +theorem exponentialValueCoset_eq_of_cross_value_eq + {K L : Type*} [Field K] [Field L] [Algebra K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + {x y : L} (hx : x ≠ 0) (hy : y ≠ 0) + {a b : K} (ha : a ≠ 0) (hb : b ≠ 0) + (hcross : + w (algebraMap K L a * x) = w (algebraMap K L b * y)) : + exponentialValueCoset v w x hx = exponentialValueCoset v w y hy := by + have hvaTop : v a ≠ ⊤ := + LubinTate.Valuations.exponentialValuation_ne_top_of_ne_zero v ha + have hvbTop : v b ≠ ⊤ := + LubinTate.Valuations.exponentialValuation_ne_top_of_ne_zero v hb + have hxTop : w x ≠ ⊤ := + LubinTate.Valuations.exponentialValuation_ne_top_of_ne_zero w hx + have hyTop : w y ≠ ⊤ := + LubinTate.Valuations.exponentialValuation_ne_top_of_ne_zero w hy + have hva : v a = (((v a).untop₀ : ℝ) : WithTop ℝ) := + (WithTop.coe_untop₀_of_ne_top hvaTop).symm + have hvb : v b = (((v b).untop₀ : ℝ) : WithTop ℝ) := + (WithTop.coe_untop₀_of_ne_top hvbTop).symm + have hvx : w x = (((w x).untop₀ : ℝ) : WithTop ℝ) := + (WithTop.coe_untop₀_of_ne_top hxTop).symm + have hvy : w y = (((w y).untop₀ : ℝ) : WithTop ℝ) := + (WithTop.coe_untop₀_of_ne_top hyTop).symm + have hreal : + (v a).untop₀ + (w x).untop₀ = + (v b).untop₀ + (w y).untop₀ := by + rw [w.map_mul, w.map_mul, hExt, hExt, hva, hvb, hvx, hvy] at hcross + exact WithTop.coe_eq_coe.mp (by simpa [WithTop.coe_add] using hcross) + let gammaX : exponentialValueSubgroup w := + ⟨(w x).untop₀, ⟨x, hx, hvx⟩⟩ + let gammaY : exponentialValueSubgroup w := + ⟨(w y).untop₀, ⟨y, hy, hvy⟩⟩ + change QuotientAddGroup.mk gammaX = QuotientAddGroup.mk gammaY + rw [QuotientAddGroup.eq_iff_sub_mem] + change (w x).untop₀ - (w y).untop₀ ∈ + exponentialValueSubgroup v + refine ⟨b / a, div_ne_zero hb ha, ?_⟩ + rw [div_eq_mul_inv, v.map_mul, + LubinTate.Valuations.exponentialValuation_inv_value v ha hva, hvb] + apply congrArg (fun z : ℝ ↦ (z : WithTop ℝ)) + linarith + +/-- A family in `Lˣ` represents distinct cosets modulo the values coming +from `Kˣ` exactly in the cross-multiplication form used in the proof. +This definition avoids choosing subtraction representatives in `WithTop ℝ`. -/ +def DistinctExponentialValueCosetRepresentatives + {K L I : Type*} [Field K] [Field L] [Algebra K L] + (_v : LubinTate.Valuations.ExponentialValuation K) + (w : LubinTate.Valuations.ExponentialValuation L) (pi : I → L) : Prop := + (∀ i, pi i ≠ 0) ∧ + Pairwise fun i j ↦ + ∀ a b : K, a ≠ 0 → b ≠ 0 → + w (algebraMap K L a * pi i) ≠ + w (algebraMap K L b * pi j) + +/-- Injectivity of the actual value-coset map supplies the pairwise +distinctness condition used by the constructive proof. -/ +theorem distinctExponentialValueCosetRepresentatives_of_injective + {K L I : Type*} [Field K] [Field L] [Algebra K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (pi : I → L) (hpi0 : ∀ i, pi i ≠ 0) + (hinj : Function.Injective + (fun i ↦ exponentialValueCoset v w (pi i) (hpi0 i))) : + DistinctExponentialValueCosetRepresentatives v w pi := by + refine ⟨hpi0, ?_⟩ + intro i j hij a b ha hb hcross + apply hij + apply hinj + exact exponentialValueCoset_eq_of_cross_value_eq + v w hExt (hpi0 i) (hpi0 j) ha hb hcross + +/-- The constructive core of the fundamental inequality. Distinct value-coset +representatives multiplied by linearly independent residue lifts form a +linearly independent family over the base field. Repeated roots or a degree +formula are not built into the statement: this is the actual +linear-independence argument. -/ +theorem ramificationInvariants_valueCosets_mul_residueLifts_linearIndependent + {K L I J : Type*} [Field K] [Field L] [Algebra K L] + [Finite I] [Finite J] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (pi : I → L) (hpi : DistinctExponentialValueCosetRepresentatives v w pi) + (omega : J → LubinTate.Valuations.exponentialValuationSubring w) + (homega : + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := exponentialValuationRingMap v w hExt + letI : Algebra V W := i.toAlgebra + letI : IsLocalHom i := + exponentialValuationRingMap_isLocalHom v w hExt + letI : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (IsLocalRing.ResidueField.map i).toAlgebra + LinearIndependent (IsLocalRing.ResidueField V) + (fun j ↦ IsLocalRing.residue W (omega j))) : + LinearIndependent K + (fun p : I × J ↦ (omega p.2 : L) * pi p.1) := by + classical + let := Fintype.ofFinite I + let := Fintype.ofFinite J + classical + rw [Fintype.linearIndependent_iff] + intro a hsum p + let s : I → L := fun i ↦ + ∑ j, algebraMap K L (a (i, j)) * (omega j : L) + have hsum' : ∑ i, s i * pi i = 0 := by + simpa only [s, Fintype.sum_prod_type, Algebra.smul_def, + Finset.sum_mul, mul_assoc] using hsum + by_contra hap + have hinner : ∀ i, s i ≠ 0 → + ∃ a₀ : K, a₀ ≠ 0 ∧ + w (s i) = w (algebraMap K L a₀) := by + intro i hsi + have hai : ∃ j, a (i, j) ≠ 0 := by + by_contra hnone + push Not at hnone + apply hsi + simp [s, hnone] + exact exponentialValuation_residueCombination_value_in_base + v w hExt omega homega (fun j ↦ a (i, j)) hai + have hpvalue := + exponentialValuation_residueCombination_value_in_base + v w hExt omega homega (fun j ↦ a (p.1, j)) ⟨p.2, hap⟩ + change ∃ a₀ : K, a₀ ≠ 0 ∧ + w (s p.1) = w (algebraMap K L a₀) at hpvalue + obtain ⟨ap, hapzero, hpvalue⟩ := hpvalue + have hsp : s p.1 ≠ 0 := by + intro hzero + rw [hzero, (w.eq_top_iff 0).mpr rfl] at hpvalue + exact (LubinTate.Valuations.exponentialValuation_ne_top_of_ne_zero w + ((map_ne_zero (algebraMap K L)).mpr hapzero)) hpvalue.symm + have hsum_ne : ∑ i, s i * pi i ≠ 0 := by + apply exponentialValuation_finset_sum_ne_zero_of_value_ne + w Finset.univ (fun i ↦ s i * pi i) + · exact ⟨p.1, Finset.mem_univ _, mul_ne_zero hsp (hpi.1 p.1)⟩ + · intro i hi j hj hij hterm_i hterm_j + have hsi : s i ≠ 0 := by + intro hzero + exact hterm_i (by simp [hzero]) + have hsj : s j ≠ 0 := by + intro hzero + exact hterm_j (by simp [hzero]) + obtain ⟨ai, hai, hvi⟩ := hinner i hsi + obtain ⟨aj, haj, hvj⟩ := hinner j hsj + have hwi : + w (s i * pi i) = w (algebraMap K L ai * pi i) := by + rw [w.map_mul, w.map_mul, hvi] + have hwj : + w (s j * pi j) = w (algebraMap K L aj * pi j) := by + rw [w.map_mul, w.map_mul, hvj] + intro heq + exact (hpi.2 hij ai aj hai haj) + (hwi.symm.trans (heq.trans hwj)) + exact hsum_ne hsum' + +/-- The linearly-independent product family does not require the two +indexing sets to have been proved finite in advance. Every finite part is +contained in a product of finite parts, to which the preceding constructive +argument applies. -/ +theorem ramificationInvariants_valueCosets_mul_residueLifts_linearIndependent_arbitrary + {K L I J : Type*} [Field K] [Field L] [Algebra K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (pi : I → L) (hpi : DistinctExponentialValueCosetRepresentatives v w pi) + (omega : J → LubinTate.Valuations.exponentialValuationSubring w) + (homega : + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := exponentialValuationRingMap v w hExt + letI : Algebra V W := i.toAlgebra + letI : IsLocalHom i := + exponentialValuationRingMap_isLocalHom v w hExt + letI : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (IsLocalRing.ResidueField.map i).toAlgebra + LinearIndependent (IsLocalRing.ResidueField V) + (fun j ↦ IsLocalRing.residue W (omega j))) : + LinearIndependent K + (fun p : I × J ↦ (omega p.2 : L) * pi p.1) := by + classical + rw [linearIndependent_iff_finset_linearIndependent] + intro s + let sI : Finset I := s.image Prod.fst + let sJ : Finset J := s.image Prod.snd + let piI : sI → L := fun i ↦ pi i + let omegaJ : sJ → LubinTate.Valuations.exponentialValuationSubring w := fun j ↦ omega j + have hpiI : DistinctExponentialValueCosetRepresentatives v w piI := by + refine ⟨fun i ↦ hpi.1 i, ?_⟩ + intro i j hij + apply hpi.2 + intro h + apply hij + exact Subtype.ext h + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := exponentialValuationRingMap v w hExt + let : Algebra V W := i.toAlgebra + let : IsLocalHom i := + exponentialValuationRingMap_isLocalHom v w hExt + let : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (IsLocalRing.ResidueField.map i).toAlgebra + have homegaJ : LinearIndependent (IsLocalRing.ResidueField V) + (fun j : sJ ↦ IsLocalRing.residue W (omegaJ j)) := by + exact homega.comp Subtype.val Subtype.val_injective + have hprod : LinearIndependent K + (fun p : sI × sJ ↦ (omegaJ p.2 : L) * piI p.1) := + ramificationInvariants_valueCosets_mul_residueLifts_linearIndependent + v w hExt piI hpiI omegaJ homegaJ + let emb : s → sI × sJ := fun p ↦ + (⟨p.1.1, Finset.mem_image.mpr ⟨p, p.2, rfl⟩⟩, + ⟨p.1.2, Finset.mem_image.mpr ⟨p, p.2, rfl⟩⟩) + have hemb : Function.Injective emb := by + intro p q hpq + apply Subtype.ext + exact Prod.ext (congrArg (fun z ↦ (z.1 : I)) hpq) + (congrArg (fun z ↦ (z.2 : J)) hpq) + change LinearIndependent K + ((fun p : sI × sJ ↦ (omegaJ p.2 : L) * piI p.1) ∘ emb) + exact hprod.comp emb hemb + +/-- Fundamental inequality in constructive cardinal form. Thus any complete +set of `e` value-coset representatives and any residue basis of size `f` +give `e f ≤ [L : K]`; no extension record carrying a pre-assumed degree +formula is used. -/ +theorem ramificationInvariants_valueCosets_mul_residueLifts_card_le_finrank + {K L I J : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Fintype I] [Fintype J] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (pi : I → L) (hpi : DistinctExponentialValueCosetRepresentatives v w pi) + (omega : J → LubinTate.Valuations.exponentialValuationSubring w) + (homega : + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := exponentialValuationRingMap v w hExt + letI : Algebra V W := i.toAlgebra + letI : IsLocalHom i := + exponentialValuationRingMap_isLocalHom v w hExt + letI : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (IsLocalRing.ResidueField.map i).toAlgebra + LinearIndependent (IsLocalRing.ResidueField V) + (fun j ↦ IsLocalRing.residue W (omega j))) : + Fintype.card I * Fintype.card J ≤ Module.finrank K L := by + have hli := + ramificationInvariants_valueCosets_mul_residueLifts_linearIndependent + v w hExt pi hpi omega homega + simpa using hli.fintype_card_le_finrank + +/-- Fundamental inequality with the ramification index identified as the +cardinality of the actual quotient `w(Lˣ)/v(Kˣ)`. -/ +theorem ramificationInvariants_actual_valueGroup_card_mul_residueLifts_card_le_finrank + {K L I J : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Finite I] [Fintype J] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (pi : I → L) (hpi0 : ∀ i, pi i ≠ 0) + (hpi : Function.Bijective + (fun i ↦ exponentialValueCoset v w (pi i) (hpi0 i))) + (omega : J → LubinTate.Valuations.exponentialValuationSubring w) + (homega : + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := exponentialValuationRingMap v w hExt + letI : Algebra V W := i.toAlgebra + letI : IsLocalHom i := + exponentialValuationRingMap_isLocalHom v w hExt + letI : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (IsLocalRing.ResidueField.map i).toAlgebra + LinearIndependent (IsLocalRing.ResidueField V) + (fun j ↦ IsLocalRing.residue W (omega j))) : + exponentialRamificationIndex v w * Fintype.card J ≤ Module.finrank K L := by + classical + let := Fintype.ofFinite I + have hdistinct := + distinctExponentialValueCosetRepresentatives_of_injective + v w hExt pi hpi0 hpi.1 + have hle := + ramificationInvariants_valueCosets_mul_residueLifts_card_le_finrank + v w hExt pi hdistinct omega homega + have he : exponentialRamificationIndex v w = Fintype.card I := by + rw [exponentialRamificationIndex] + calc + Nat.card (ExponentialValueGroupQuotient v w) = Nat.card I := + Nat.card_congr (Equiv.ofBijective + (fun i ↦ exponentialValueCoset v w (pi i) (hpi0 i)) hpi).symm + _ = Fintype.card I := Nat.card_eq_fintype_card + rwa [he] + +/-- the fundamental inequality, general fundamental inequality with both invariants +identified literally: `e` is the cardinality of `w(Lˣ)/v(Kˣ)` and `f` is +the residue-field finrank. The supplied `pi` and `omega` are genuine complete +systems of value-coset representatives and residue-basis lifts. -/ +theorem ramificationInvariants_fundamental_inequality_of_representatives + {K L I J : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Finite I] [Finite J] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (pi : I → L) (hpi0 : ∀ i, pi i ≠ 0) + (hpi : Function.Bijective + (fun i ↦ exponentialValueCoset v w (pi i) (hpi0 i))) + (omega : J → LubinTate.Valuations.exponentialValuationSubring w) + (beta : + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := exponentialValuationRingMap v w hExt + letI : Algebra V W := i.toAlgebra + letI : IsLocalHom i := + exponentialValuationRingMap_isLocalHom v w hExt + letI : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (IsLocalRing.ResidueField.map i).toAlgebra + Basis J (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W)) + (homega : + let W := LubinTate.Valuations.exponentialValuationSubring w + ∀ j, IsLocalRing.residue W (omega j) = beta j) : + exponentialRamificationIndex v w * exponentialResidueDegree v w hExt ≤ + Module.finrank K L := by + classical + let := Fintype.ofFinite I + let := Fintype.ofFinite J + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := exponentialValuationRingMap v w hExt + let : IsLocalHom i := + exponentialValuationRingMap_isLocalHom v w hExt + let : Algebra V W := i.toAlgebra + let : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (IsLocalRing.ResidueField.map i).toAlgebra + have homegaLI : LinearIndependent (IsLocalRing.ResidueField V) + (fun j ↦ IsLocalRing.residue W (omega j)) := by + rw [show (fun j ↦ IsLocalRing.residue W (omega j)) = beta from + funext homega] + exact beta.linearIndependent + have hle := + ramificationInvariants_actual_valueGroup_card_mul_residueLifts_card_le_finrank + v w hExt pi hpi0 hpi omega homegaLI + have hf : exponentialResidueDegree v w hExt = Fintype.card J := by + change Module.finrank (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) = Fintype.card J + exact Module.finrank_eq_card_basis beta + rwa [hf] + +/-- The fundamental inequality in its explicit form. The value +coset representatives and the residue-basis lifts are chosen internally. +Their indexing sets are proved finite from the product family's linear +independence, rather than assumed finite at the theorem boundary. -/ +theorem ramificationInvariants_fundamental_inequality + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) : + exponentialRamificationIndex v w * exponentialResidueDegree v w hExt ≤ + Module.finrank K L := by + classical + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := exponentialValuationRingMap v w hExt + let : IsLocalHom i := + exponentialValuationRingMap_isLocalHom v w hExt + let : Algebra V W := i.toAlgebra + let k := IsLocalRing.ResidueField V + let ell := IsLocalRing.ResidueField W + let : Algebra k ell := (IsLocalRing.ResidueField.map i).toAlgebra + let Q := ExponentialValueGroupQuotient v w + have hsur : Function.Surjective + (fun x : Lˣ ↦ exponentialValueCoset v w (x : L) x.ne_zero) := + exponentialValueCoset_units_surjective v w + let sigma : Q → Lˣ := fun q ↦ Classical.choose (hsur q) + let pi : Q → L := fun q ↦ (sigma q : L) + have hpi0 : ∀ q, pi q ≠ 0 := fun q ↦ (sigma q).ne_zero + have hpiClass : ∀ q, + exponentialValueCoset v w (pi q) (hpi0 q) = q := by + intro q + exact Classical.choose_spec (hsur q) + have hpiBij : Function.Bijective + (fun q ↦ exponentialValueCoset v w (pi q) (hpi0 q)) := by + constructor + · intro q r hqr + simpa only [hpiClass] using hqr + · intro q + exact ⟨q, hpiClass q⟩ + have hpiDistinct : DistinctExponentialValueCosetRepresentatives v w pi := + distinctExponentialValueCosetRepresentatives_of_injective + v w hExt pi hpi0 hpiBij.1 + have honeLI : LinearIndependent k + (fun _ : Unit ↦ IsLocalRing.residue W (1 : W)) := by + rw [linearIndependent_unique_iff] + simp + have hprodQ := + ramificationInvariants_valueCosets_mul_residueLifts_linearIndependent_arbitrary + v w hExt pi hpiDistinct (fun _ : Unit ↦ (1 : W)) honeLI + have hfiniteQ : Finite Q := + (hprodQ.comp (fun q ↦ (q, ())) (by + intro q r hqr + exact congrArg Prod.fst hqr)).finite + let : Finite Q := hfiniteQ + let : Fintype Q := Fintype.ofFinite Q + let J := Module.Free.ChooseBasisIndex k ell + let beta : Basis J k ell := Module.Free.chooseBasis k ell + let omega : J → W := fun j ↦ + Classical.choose (IsLocalRing.residue_surjective (beta j)) + have homega : ∀ j, IsLocalRing.residue W (omega j) = beta j := by + intro j + exact Classical.choose_spec (IsLocalRing.residue_surjective (beta j)) + have homegaLI : LinearIndependent k + (fun j ↦ IsLocalRing.residue W (omega j)) := by + rw [show (fun j ↦ IsLocalRing.residue W (omega j)) = beta from + funext homega] + exact beta.linearIndependent + let piOne : Unit → L := fun _ ↦ 1 + have hpiOne : DistinctExponentialValueCosetRepresentatives v w piOne := by + refine ⟨by intro; simp [piOne], ?_⟩ + intro a b hab + exact (hab (Subsingleton.elim a b)).elim + have hprodJ := + ramificationInvariants_valueCosets_mul_residueLifts_linearIndependent_arbitrary + v w hExt piOne hpiOne omega homegaLI + have hfiniteJ : Finite J := + (hprodJ.comp (fun j ↦ ((), j)) (by + intro a b hab + exact congrArg Prod.snd hab)).finite + let : Finite J := hfiniteJ + let : Fintype J := Fintype.ofFinite J + exact ramificationInvariants_fundamental_inequality_of_representatives + v w hExt pi hpi0 hpiBij omega beta homega + +/-- the fundamental inequality, equality case. For a finite separable extension of a +Henselian discretely valued field, the chosen extension valuation ring is +first identified with the actual integral closure by the norm-formula and +unique-extension theorems. +Its DVR structure and module-finiteness are then derived, so the local +Dedekind identity gives `[L : K] = e f` for the actual value-group and residue +invariants. No completeness hypothesis is used. -/ +theorem ramificationInvariants_fundamental_identity_of_discrete_of_separable + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) + (hExt : ∀ a : K, w (algebraMap K L a) = v a) + (hvdisc : LubinTate.Valuations.DiscreteExponentialValuation v) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) : + Module.finrank K L = + exponentialRamificationIndex v w * exponentialResidueDegree v w hExt := by + let : Algebra.IsAlgebraic K L := Algebra.IsAlgebraic.of_finite K L + let Vv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v + let Wv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring w + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let i := exponentialValuationRingMap v w hExt + let : IsLocalHom i := + exponentialValuationRingMap_isLocalHom v w hExt + let algVW : Algebra V W := i.toAlgebra + let : Algebra V W := algVW + let : SMul V W := algVW.toSMul + let algVL : Algebra V L := ((algebraMap K L).comp V.subtype).toAlgebra + let : Algebra V L := algVL + let : SMul V L := algVL.toSMul + let : SMul W L := (inferInstance : Algebra W L).toSMul + let : SMul V K := (inferInstance : Algebra V K).toSMul + let : IsScalarTower V W L := IsScalarTower.of_algebraMap_eq + (R := V) (S := W) (A := L) (by + intro x + rfl) + let : IsScalarTower V K L := IsScalarTower.of_algebraMap_eq + (R := V) (S := K) (A := L) (by + intro x + rfl) + have hclosure : Wv.toSubring = (integralClosure Vv L).toSubring := + exponentialValuationSubring_eq_integralClosure_of_henselian + v w hExt hhens + have hclosureSubring : W = (integralClosure V L).toSubring := by + change W = (integralClosure V L).toSubring at hclosure + exact hclosure + let : IsIntegralClosure W V L := + isIntegralClosure_of_subring_eq V W hclosureSubring + let : IsDiscreteValuationRing V := + LubinTate.Valuations.discreteExponentialValuationSubring_isDiscreteValuationRing hvdisc + let : IsFractionRing V K := by + change IsFractionRing Vv K + have hfr : IsFractionRing Vv.valuation.valuationSubring K := + (Valuation.valuationSubring.integers + (v := Vv.valuation)).isFractionRing + rw [Vv.valuationSubring_valuation] at hfr + exact hfr + let : IsFractionRing W L := by + change IsFractionRing Wv L + have hfr : IsFractionRing Wv.valuation.valuationSubring L := + (Valuation.valuationSubring.integers + (v := Wv.valuation)).isFractionRing + rw [Wv.valuationSubring_valuation] at hfr + exact hfr + let : IsDedekindDomain V := inferInstance + let : Module.Finite V W := IsIntegralClosure.finite V K L W + let : IsDedekindDomain W := + IsIntegralClosure.isDedekindDomain V K L W + have hWnotField : ¬ IsField W := by + intro hfield + let : Field W := hfield.toField + obtain ⟨s, hs, _hvalues, pi, hpival⟩ := hvdisc + have hpi0 : pi ≠ 0 := + LubinTate.Valuations.discretePrimeElement_ne_zero_of_value v hpival + let piV : V := + LubinTate.Valuations.discretePrimeElementInValuationSubring v hs.le hpival + have hpiV0 : piV ≠ 0 := by + intro hzero + exact hpi0 (congrArg Subtype.val hzero) + have hi : Function.Injective i := by + intro a b hab + apply Subtype.ext + exact (algebraMap K L).injective (congrArg Subtype.val hab) + have hiPi0 : i piV ≠ 0 := by + simpa using hi.ne hpiV0 + have hiPiUnit : IsUnit (i piV) := isUnit_iff_ne_zero.mpr hiPi0 + have hzero := + LubinTate.Valuations.exponentialValuation_eq_zero_of_isUnit w hiPiUnit + have hvalue : w ((((i piV : W)) : L)) = (s : WithTop ℝ) := by + change w (algebraMap K L pi) = (s : WithTop ℝ) + rw [hExt, hpival] + rw [hvalue] at hzero + have hs0 : s = 0 := + WithTop.coe_eq_coe.mp (by simpa using hzero) + exact (ne_of_gt hs) hs0 + let : IsNoetherianRing W := inferInstance + let : IsDiscreteValuationRing W := + ((IsDiscreteValuationRing.TFAE W hWnotField).out 3 1).mp + (show IsDedekindDomain W from inferInstance) + have hideal : + Ideal.ramificationIdx' + (IsLocalRing.maximalIdeal V) (IsLocalRing.maximalIdeal W) * + (IsLocalRing.maximalIdeal W).inertiaDeg V = Module.finrank K L := by + classical + have := FaithfulSMul.of_field_isFractionRing V W K L + have hp := IsDiscreteValuationRing.not_a_field V + have hprimes := IsLocalRing.primesOver_eq (A := W) hp + have hq (q : (IsLocalRing.maximalIdeal V).primesOver W) : + (q : Ideal W) = IsLocalRing.maximalIdeal W := + Set.mem_singleton_iff.mp (hprimes ▸ q.property) + let : Unique ((IsLocalRing.maximalIdeal V).primesOver W) := + { default := + ⟨IsLocalRing.maximalIdeal W, hprimes ▸ Set.mem_singleton _⟩ + uniq := fun q => + Subtype.ext (Set.mem_singleton_iff.mp (hprimes ▸ q.property)) } + rw [Ideal.ramificationIdx'_eq_ramificationIdx _ _ hp, + IsFractionRing.finrank_eq V K W L] + simpa only [show algebraMap V W = i from rfl, Fintype.sum_unique, hq] using + (Ideal.sum_ramification_inertia_eq_finrank + (IsLocalRing.maximalIdeal V) W) + rw [exponentialRamificationIndex_eq_ideal_ramificationIdx v w hExt hvdisc, + exponentialResidueDegree_eq_ideal_inertiaDeg v w hExt] + exact hideal.symm + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueExtensionCoefficients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueExtensionCoefficients.lean new file mode 100644 index 0000000000..1b3fe82673 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueExtensionCoefficients.lean @@ -0,0 +1,299 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialBounds +/-! +# the nonarchimedean valuation construction, the irreducible coefficient estimate: the + coefficient norm of an irreducible polynomial + +The unique nonarchimedean extension to a splitting field is invariant under +all ground-field automorphisms. Normality of a splitting field therefore +forces all conjugate roots of an irreducible polynomial to have one common +absolute value. Vieta's factorization and the strong triangle inequality +then bound every coefficient by the larger endpoint coefficient. +-/ + +@[expose] public section + +noncomputable +section + +open Polynomial + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- The hypothesis that `w` is the unique nonarchimedean exact +extension of `v` to `L`. -/ +def IsUniqueNonarchimedeanAbsoluteValueExtension + {K L : Type*} [Field K] [Field L] [Algebra K L] + (v : AbsoluteValue K ℝ) (w : AbsoluteValue L ℝ) : Prop := + LubinTate.Valuations.NonarchimedeanAbsoluteValue w ∧ AbsoluteValue.Extends v w ∧ + ∀ u : AbsoluteValue L ℝ, + LubinTate.Valuations.NonarchimedeanAbsoluteValue u → AbsoluteValue.Extends v u → u = w + +/-- Uniqueness of the nonarchimedean extension makes it invariant under every +ground-field automorphism of the splitting field. -/ +theorem uniqueNonarchimedeanAbsoluteValueExtension_map_algEquiv_eq + {K L : Type*} [Field K] [Field L] [Algebra K L] + {v : AbsoluteValue K ℝ} {w : AbsoluteValue L ℝ} + (huniq : IsUniqueNonarchimedeanAbsoluteValueExtension v w) + (σ : L ≃ₐ[K] L) (x : L) : + w (σ x) = w x := by + let u : AbsoluteValue L ℝ := w.comp (f := σ.toRingHom) σ.injective + have hu_nonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue u := by + rcases huniq.1 with ⟨C, hC⟩ + refine ⟨C, ?_⟩ + intro n + change w (σ (n : L)) ≤ C + simpa using hC n + have hu_extends : AbsoluteValue.Extends v u := by + intro a + change w (σ (algebraMap K L a)) = v a + rw [σ.commutes] + exact huniq.2.1 a + have hueq : u = w := huniq.2.2 u hu_nonarch hu_extends + exact congrArg (fun z : AbsoluteValue L ℝ => z x) hueq + +/-- In a normal extension, roots of one irreducible ground-field polynomial +have equal absolute value under the unique extension. -/ +theorem uniqueNonarchimedeanAbsoluteValueExtension_eq_on_roots_of_irreducible + {K L : Type*} [Field K] [Field L] [Algebra K L] [Normal K L] + {v : AbsoluteValue K ℝ} {w : AbsoluteValue L ℝ} + (huniq : IsUniqueNonarchimedeanAbsoluteValueExtension v w) + {p : Polynomial K} (hp : Irreducible p) + {α β : L} + (hα : α ∈ (p.map (algebraMap K L)).roots) + (hβ : β ∈ (p.map (algebraMap K L)).roots) : + w α = w β := by + have hp0 : p ≠ 0 := hp.ne_zero + have hmap0 : p.map (algebraMap K L) ≠ 0 := + (Polynomial.map_ne_zero_iff (algebraMap K L).injective).2 hp0 + have hαeval : (aeval α) p = 0 := by + simpa [aeval_def] using (Polynomial.mem_roots hmap0).1 hα + have hβeval : (aeval β) p = 0 := by + simpa [aeval_def] using (Polynomial.mem_roots hmap0).1 hβ + have hmin : minpoly K α = minpoly K β := by + rw [← minpoly.eq_of_irreducible hp hαeval, + ← minpoly.eq_of_irreducible hp hβeval] + obtain ⟨σ, hσ⟩ := (Normal.minpoly_eq_iff_mem_orbit L).1 hmin + rw [← hσ] + exact uniqueNonarchimedeanAbsoluteValueExtension_map_algEquiv_eq huniq σ β + +/-- A direct nonarchimedean Vieta estimate. If every element of `s` has +absolute value at most `B`, with `B ≥ 1`, then every coefficient of +`∏_{α∈s}(X-α)` has absolute value at most `B ^ |s|`. -/ +theorem abs_coeff_prod_X_sub_C_le_pow_card + {L : Type*} [Field L] + (w : AbsoluteValue L ℝ) (hstrong : LubinTate.Valuations.StrongTriangle w) + (B : ℝ) (hB : 1 ≤ B) (s : Multiset L) + (hs : ∀ α ∈ s, w α ≤ B) (i : ℕ) : + w (((s.map (fun α => X - C α)).prod).coeff i) ≤ B ^ s.card := by + induction s using Multiset.induction_on generalizing i with + | empty => + cases i <;> simp [Polynomial.coeff_one] + | @cons α s ih => + have hα : w α ≤ B := hs α (by simp) + have hs' : ∀ β ∈ s, w β ≤ B := by + intro β hβ + exact hs β (by simp [hβ]) + have hB0 : 0 ≤ B := zero_le_one.trans hB + have hpow_step : B ^ s.card ≤ B ^ (s.card + 1) := by + rw [pow_succ] + exact le_mul_of_one_le_right (pow_nonneg hB0 _) hB + simp only [Multiset.map_cons, Multiset.prod_cons, Multiset.card_cons] + cases i with + | zero => + have hq := ih hs' 0 + calc + w (((X - C α) * (s.map (fun β => X - C β)).prod).coeff 0) = + w α * w (((s.map (fun β => X - C β)).prod).coeff 0) := by + simp [Polynomial.coeff_zero_eq_eval_zero] + _ ≤ B * B ^ s.card := + mul_le_mul hα hq (w.nonneg _) hB0 + _ = B ^ (s.card + 1) := by + rw [pow_succ] + ac_rfl + | succ j => + rw [Polynomial.coeff_X_sub_C_mul] + have hqj := ih hs' j + have hqsucc := ih hs' (j + 1) + have hterm : + w (α * ((s.map (fun β => X - C β)).prod).coeff (j + 1)) ≤ + B ^ (s.card + 1) := by + rw [w.map_mul] + calc + w α * w (((s.map (fun β => X - C β)).prod).coeff (j + 1)) ≤ + B * B ^ s.card := + mul_le_mul hα hqsucc (w.nonneg _) hB0 + _ = B ^ (s.card + 1) := by + rw [pow_succ] + ac_rfl + have hsum := hstrong + (((s.map (fun β => X - C β)).prod).coeff j) + (-α * ((s.map (fun β => X - C β)).prod).coeff (j + 1)) + calc + w (((s.map (fun β => X - C β)).prod).coeff j - + α * ((s.map (fun β => X - C β)).prod).coeff (j + 1)) ≤ + max + (w (((s.map (fun β => X - C β)).prod).coeff j)) + (w (α * ((s.map (fun β => X - C β)).prod).coeff (j + 1))) := by + simpa [sub_eq_add_neg] using hsum + _ ≤ B ^ (s.card + 1) := + max_le (hqj.trans hpow_step) hterm + +/-- If all entries of a multiset have one absolute value, the absolute value +of their product is the corresponding power. -/ +theorem abs_multiset_prod_eq_pow_card_of_eq + {L : Type*} [Field L] (w : AbsoluteValue L ℝ) + (t : ℝ) (s : Multiset L) (hs : ∀ α ∈ s, w α = t) : + w s.prod = t ^ s.card := by + induction s using Multiset.induction_on with + | empty => simp + | @cons α s ih => + have hα : w α = t := hs α (by simp) + have hs' : ∀ β ∈ s, w β = t := by + intro β hβ + exact hs β (by simp [hβ]) + simp only [Multiset.prod_cons, Multiset.card_cons, w.map_mul, hα, ih hs', pow_succ] + ac_rfl + +/-- the irreducible coefficient estimate, coefficient estimate before taking the finite maximum. +All conjugate roots have one value; Vieta's formula and the direct finite +nonarchimedean estimate above bound every coefficient by an endpoint. -/ +theorem uniqueExtensionCoefficients_coeff_abs_le_endpoint_max_of_unique_extension + {K L : Type*} [Field K] [Field L] [Algebra K L] + (v : AbsoluteValue K ℝ) (w : AbsoluteValue L ℝ) + (f : Polynomial K) [IsSplittingField K L f] + (huniq : IsUniqueNonarchimedeanAbsoluteValueExtension v w) + (hirr : Irreducible f) : + ∀ i : ℕ, v (f.coeff i) ≤ max (v (f.coeff 0)) (v f.leadingCoeff) := by + let : Normal K L := Normal.of_isSplittingField f + have hsplit : (f.map (algebraMap K L)).Splits := + IsSplittingField.splits L f + have hmap0 : f.map (algebraMap K L) ≠ 0 := + (Polynomial.map_ne_zero_iff (algebraMap K L).injective).2 hirr.ne_zero + have hroots_ne : (f.map (algebraMap K L)).roots ≠ 0 := by + intro hz + have hcard := hsplit.natDegree_eq_card_roots + rw [hz] at hcard + have hdeg : f.natDegree = 0 := by + simpa using hcard + exact hirr.natDegree_pos.ne' hdeg + obtain ⟨α, hα⟩ := Multiset.exists_mem_of_ne_zero hroots_ne + let t : ℝ := w α + have hall : ∀ β ∈ (f.map (algebraMap K L)).roots, w β = t := by + intro β hβ + exact uniqueNonarchimedeanAbsoluteValueExtension_eq_on_roots_of_irreducible + huniq hirr hβ hα + have ht0 : 0 ≤ t := w.nonneg α + have hstrong : LubinTate.Valuations.StrongTriangle w := + LubinTate.Valuations.strong_triangle_of_nonarchimedean w huniq.1 + have hlead : w (algebraMap K L f.leadingCoeff) = v f.leadingCoeff := + huniq.2.1 f.leadingCoeff + have hconst : + v (f.coeff 0) = + v f.leadingCoeff * t ^ (f.map (algebraMap K L)).roots.card := by + calc + v (f.coeff 0) = w (algebraMap K L (f.coeff 0)) := + (huniq.2.1 (f.coeff 0)).symm + _ = w ((f.map (algebraMap K L)).coeff 0) := by + rw [Polynomial.coeff_map] + _ = w (((-1) ^ (f.map (algebraMap K L)).natDegree) * + (f.map (algebraMap K L)).leadingCoeff * + (f.map (algebraMap K L)).roots.prod) := by + rw [hsplit.coeff_zero_eq_leadingCoeff_mul_prod_roots] + _ = v f.leadingCoeff * t ^ (f.map (algebraMap K L)).roots.card := by + rw [w.map_mul, w.map_mul, + Polynomial.leadingCoeff_map_of_injective (algebraMap K L).injective, + hlead, + abs_multiset_prod_eq_pow_card_of_eq w t + (f.map (algebraMap K L)).roots hall] + simp + intro i + have hcoeff : + algebraMap K L (f.coeff i) = + algebraMap K L f.leadingCoeff * + (((f.map (algebraMap K L)).roots.map (fun β => X - C β)).prod).coeff i := by + rw [← Polynomial.coeff_map] + conv_lhs => rw [hsplit.eq_prod_roots] + rw [Polynomial.coeff_C_mul, + Polynomial.leadingCoeff_map_of_injective (algebraMap K L).injective] + have hcoeff_value : + v (f.coeff i) = + v f.leadingCoeff * + w ((((f.map (algebraMap K L)).roots.map + (fun β => X - C β)).prod).coeff i) := by + rw [← huniq.2.1 (f.coeff i), hcoeff, w.map_mul, hlead] + rcases le_total t 1 with ht | ht + · have hq : + w ((((f.map (algebraMap K L)).roots.map + (fun β => X - C β)).prod).coeff i) ≤ + (1 : ℝ) ^ (f.map (algebraMap K L)).roots.card := + abs_coeff_prod_X_sub_C_le_pow_card w hstrong 1 le_rfl + (f.map (algebraMap K L)).roots + (fun β hβ => (hall β hβ).trans_le ht) i + rw [hcoeff_value] + have hmul : + v f.leadingCoeff * + w ((((f.map (algebraMap K L)).roots.map + (fun β => X - C β)).prod).coeff i) ≤ + v f.leadingCoeff := by + have := mul_le_mul_of_nonneg_left (by simpa using hq) + (v.nonneg f.leadingCoeff) + simpa using this + exact hmul.trans (le_max_right _ _) + · have hq : + w ((((f.map (algebraMap K L)).roots.map + (fun β => X - C β)).prod).coeff i) ≤ + t ^ (f.map (algebraMap K L)).roots.card := + abs_coeff_prod_X_sub_C_le_pow_card w hstrong t ht + (f.map (algebraMap K L)).roots + (fun β hβ => (hall β hβ).le) i + rw [hcoeff_value] + have hmul := mul_le_mul_of_nonneg_left hq (v.nonneg f.leadingCoeff) + rw [← hconst] at hmul + exact hmul.trans (le_max_left _ _) + +/-- the irreducible coefficient estimate in the notation. For an irreducible polynomial, +if the nonarchimedean absolute value has a unique exact extension to its +splitting field, its coefficient norm is the larger of its constant and +leading coefficient absolute values. -/ +theorem uniqueExtensionCoefficients_polynomialCoeffAbsMax_eq_endpoint_max + {K L : Type*} [Field K] [Field L] [Algebra K L] + (v : AbsoluteValue K ℝ) (w : AbsoluteValue L ℝ) + (f : Polynomial K) [IsSplittingField K L f] + (huniq : IsUniqueNonarchimedeanAbsoluteValueExtension v w) + (hirr : Irreducible f) : + polynomialCoeffAbsMax v f = + max (v (f.coeff 0)) (v f.leadingCoeff) := by + let T : Finset ℝ := + (Finset.range (f.natDegree + 1)).image fun i => v (f.coeff i) + let hT : T.Nonempty := by + refine ⟨v (f.coeff 0), ?_⟩ + exact Finset.mem_image.mpr ⟨0, by simp, rfl⟩ + change T.max' hT = max (v (f.coeff 0)) (v f.leadingCoeff) + refine le_antisymm ?_ ?_ + · refine Finset.max'_le T hT _ ?_ + intro y hy + rcases Finset.mem_image.mp hy with ⟨i, _hi, rfl⟩ + exact uniqueExtensionCoefficients_coeff_abs_le_endpoint_max_of_unique_extension + v w f huniq hirr i + · refine max_le ?_ ?_ + · exact Finset.le_max' T (v (f.coeff 0)) + (Finset.mem_image.mpr ⟨0, by simp, rfl⟩) + · exact Finset.le_max' T (v f.leadingCoeff) + (Finset.mem_image.mpr + ⟨f.natDegree, by simp, + by rw [Polynomial.leadingCoeff]⟩) + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueValuationSubring.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueValuationSubring.lean new file mode 100644 index 0000000000..df131b6e25 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueValuationSubring.lean @@ -0,0 +1,129 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +/-! +# uniqueness from the integral-closure valuation ring + +Once the actual integral closure of a valuation subring satisfies the +valuative dichotomy, it is contained in every extension valuation ring. Its +integrality over the base then forces the center of every such overring to be +the unique maximal ideal, so the overring is the integral closure itself. +-/ + +@[expose] public section + +noncomputable +section + +universe u v w + +namespace DiscreteValuationField + +open ValuationTheory.DiscreteValuationField.Valuation + +namespace Valuation + +variable {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + +/-- the finite norm-formula theorem, uniqueness source after the actual integral closure has been +shown to be a valuation ring. + +No finiteness, separability, discreteness, or completeness assumption is used: +every valuation of `L` extending the canonical valuation of `V` has valuation +subring equal to the valuation subring built from the actual integral closure +of `V` in `L`. -/ +theorem normFormula_extension_valuationSubring_eq_integralClosure_of_mem_or_inv + (V : ValuationSubring K) + (hval : + ∀ z : L, + z ∈ + (integralClosure V.valuation.valuationSubring L).toSubring ∨ + z⁻¹ ∈ + (integralClosure V.valuation.valuationSubring L).toSubring) + {Γ : Type w} [LinearOrderedCommGroupWithZero Γ] + (wL : _root_.Valuation L Γ) [V.valuation.HasExtension wL] : + wL.valuationSubring = + integralClosureValuationSubringOfMemOrInv + (L := L) V.valuation hval := by + let B : ValuationSubring L := + integralClosureValuationSubringOfMemOrInv + (L := L) V.valuation hval + change wL.valuationSubring = B + let : V.valuation.HasExtension B.valuation := + integralClosureValuationSubringOfMemOrInv_hasExtension + (L := L) V.valuation hval + have hBW : B ≤ wL.valuationSubring := + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) V.valuation wL hval + let i : V.valuation.valuationSubring →+* B := + { toFun := fun a => + ⟨algebraMap K L (a : K), + (integralClosureValuationSubringOfMemOrInv_pullback + (L := L) V.valuation hval (a : K)).2 a.2⟩ + map_zero' := by ext; simp + map_one' := by ext; simp + map_add' := by intro a b; ext; simp + map_mul' := by intro a b; ext; simp } + let : Algebra V.valuation.valuationSubring B := i.toAlgebra + let : IsScalarTower V.valuation.valuationSubring B L := + IsScalarTower.of_algebraMap_eq fun _ => rfl + let P : Ideal B := + ValuationSubring.idealOfLE B wL.valuationSubring hBW + have hPcomap : + P.comap i = + IsLocalRing.maximalIdeal V.valuation.valuationSubring := by + apply Ideal.ext + intro a + rw [Ideal.mem_comap] + change + B.inclusion wL.valuationSubring hBW (i a) ∈ + IsLocalRing.maximalIdeal wL.valuationSubring ↔ + a ∈ IsLocalRing.maximalIdeal V.valuation.valuationSubring + rw [Valuation.mem_maximalIdeal_iff (v := wL)] + rw [Valuation.mem_maximalIdeal_iff (v := V.valuation)] + have hcoe : + ((B.inclusion wL.valuationSubring hBW (i a) : + wL.valuationSubring) : L) = algebraMap K L (a : K) := by + rfl + rw [hcoe] + exact + _root_.Valuation.HasExtension.val_map_lt_one_iff + V.valuation wL (a : K) + have hBClosure : + IsIntegralClosure B V.valuation.valuationSubring L := by + simpa [B] using + (integralClosureValuationSubringOfMemOrInv_isIntegralClosure + (L := L) V.valuation hval) + let : IsIntegralClosure B V.valuation.valuationSubring L := hBClosure + have hBIntegral : + Algebra.IsIntegral V.valuation.valuationSubring B := + IsIntegralClosure.isIntegral_algebra V.valuation.valuationSubring L + let : Algebra.IsIntegral V.valuation.valuationSubring B := hBIntegral + have hPmax : P.IsMaximal := by + have hcomapMax : + (P.comap (algebraMap V.valuation.valuationSubring B)).IsMaximal := by + change (P.comap i).IsMaximal + rw [hPcomap] + exact + IsLocalRing.maximalIdeal.isMaximal + V.valuation.valuationSubring + exact Ideal.isMaximal_of_isIntegral_of_isMaximal_comap i + (fun x => Algebra.IsIntegral.isIntegral x) P hcomapMax + have hP : + ValuationSubring.idealOfLE B wL.valuationSubring hBW = + IsLocalRing.maximalIdeal B := + IsLocalRing.eq_maximalIdeal hPmax + exact + valuationSubring_eq_of_le_of_idealOfLE_eq_maximalIdeal + B wL.valuationSubring hBW hP + +end Valuation +end DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicLocalization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicLocalization.lean new file mode 100644 index 0000000000..3f60f66b85 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicLocalization.lean @@ -0,0 +1,160 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion +public import Mathlib.FieldTheory.IntermediateField.Adjoin.Basic +/-! +# Algebraic localization inside an absolute-value completion + +For an exact extension `wL` of an absolute value `vK`, this file constructs +the compositum of `L` and the completed base field inside `wL.Completion`. +The construction applies to arbitrary algebraic extensions and does not use a +extra container for the chosen extension. +-/ + +@[expose] public section + +noncomputable +section + +namespace AbsoluteValue + +universe u v + +/-- The algebraic localization of `L / K` at an exact extension `wL` of +`vK`, realized inside `wL.Completion` as the field generated by the completed +base and the canonical dense copy of `L`. -/ +noncomputable def algebraicLocalization + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (wL : AbsoluteValue L ℝ) + (hw : Extends vK wL) : + letI := completionAlgebra vK wL hw + IntermediateField vK.Completion wL.Completion := by + let := completionAlgebra vK wL hw + exact IntermediateField.adjoin vK.Completion + (Set.range (toCompletion wL)) + +private theorem toCompletion_mem_algebraicLocalization + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (wL : AbsoluteValue L ℝ) + (hw : Extends vK wL) (x : L) : + letI := completionAlgebra vK wL hw + toCompletion wL x ∈ algebraicLocalization vK wL hw := by + let := completionAlgebra vK wL hw + exact IntermediateField.subset_adjoin vK.Completion _ ⟨x, rfl⟩ + +/-- The canonical copy of `L` in its algebraic localization. -/ +noncomputable def toAlgebraicLocalization + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (wL : AbsoluteValue L ℝ) + (hw : Extends vK wL) : + letI := completionAlgebra vK wL hw + L →+* algebraicLocalization vK wL hw := by + letI := completionAlgebra vK wL hw + exact RingHom.codRestrict (toCompletion wL) + (algebraicLocalization vK wL hw) + (by exact toCompletion_mem_algebraicLocalization vK wL hw) + +/-- The absolute value on an algebraic localization evaluates through its +fraction representation. -/ +@[simp] +theorem toAlgebraicLocalization_apply + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (wL : AbsoluteValue L ℝ) + (hw : Extends vK wL) (x : L) : + letI := completionAlgebra vK wL hw + ((toAlgebraicLocalization vK wL hw x : + algebraicLocalization vK wL hw) : wL.Completion) = + toCompletion wL x := by + let := completionAlgebra vK wL hw + rfl + +/-- The algebraic localization over the completed base is algebraic whenever +the original field extension is algebraic. -/ +theorem algebraicLocalization_isAlgebraic + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (vK : AbsoluteValue K ℝ) (wL : AbsoluteValue L ℝ) + (hw : Extends vK wL) : + letI := completionAlgebra vK wL hw + Algebra.IsAlgebraic vK.Completion + (algebraicLocalization vK wL hw) := by + let hK := extensionCompletionAlgebra (K := K) wL + let : SMul K wL.Completion := hK.toSMul + let := completionAlgebra vK wL hw + let : IsScalarTower K vK.Completion wL.Completion := + completion_isScalarTower vK wL hw + apply IntermediateField.isAlgebraic_adjoin + intro z hz + rcases hz with ⟨x, rfl⟩ + have hx : IsIntegral K x := + isAlgebraic_iff_isIntegral.mp (Algebra.IsAlgebraic.isAlgebraic x) + let : IsScalarTower K K wL.Completion := + IsScalarTower.of_algebraMap_eq' rfl + have hx' : IsIntegral K (toCompletion wL x) := + hx.map (toCompletionAlgHom (K := K) wL) + exact IsIntegral.tower_top (A := vK.Completion) hx' + +/-- The absolute value on the algebraic localization inherited from +`wL.Completion`. -/ +noncomputable def algebraicLocalizationAbsoluteValue + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (wL : AbsoluteValue L ℝ) + (hw : Extends vK wL) : + letI := completionAlgebra vK wL hw + AbsoluteValue (algebraicLocalization vK wL hw) ℝ := by + letI := completionAlgebra vK wL hw + exact (completionAbsoluteValue wL).comp + (algebraicLocalization vK wL hw).val.injective + +/-- The localization absolute value extends the completion absolute value. -/ +theorem algebraicLocalizationAbsoluteValue_extends + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (wL : AbsoluteValue L ℝ) + (hw : Extends vK wL) : + letI := completionAlgebra vK wL hw + Extends (completionAbsoluteValue vK) + (algebraicLocalizationAbsoluteValue vK wL hw) := by + let := completionAlgebra vK wL hw + intro x + change ‖completionMap vK wL hw x‖ = ‖x‖ + exact (completionMap_isometry vK wL hw).norm_map_of_map_zero + (map_zero _) x + +/-- On the canonical copy of `L`, the localization absolute value is `wL`. -/ +@[simp] +theorem algebraicLocalizationAbsoluteValue_toAlgebraicLocalization + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (wL : AbsoluteValue L ℝ) + (hw : Extends vK wL) (x : L) : + letI := completionAlgebra vK wL hw + algebraicLocalizationAbsoluteValue vK wL hw + (toAlgebraicLocalization vK wL hw x) = wL x := by + let := completionAlgebra vK wL hw + change ‖((WithAbs.equiv wL).symm x : wL.Completion)‖ = wL x + rw [UniformSpace.Completion.norm_coe] + rfl + +/-- The copy of `K` obtained through `L` agrees with its copy through the +completed base field. -/ +@[simp] +theorem toAlgebraicLocalization_algebraMap + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (wL : AbsoluteValue L ℝ) + (hw : Extends vK wL) (x : K) : + letI := completionAlgebra vK wL hw + toAlgebraicLocalization vK wL hw (algebraMap K L x) = + algebraMap vK.Completion (algebraicLocalization vK wL hw) + (algebraMap K vK.Completion x) := by + let := completionAlgebra vK wL hw + apply Subtype.ext + exact (completionMap_coe vK wL hw x).symm + +end AbsoluteValue + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completeness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completeness.lean new file mode 100644 index 0000000000..0892e47f18 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completeness.lean @@ -0,0 +1,126 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Analysis.Normed.Field.WithAbs +public import Mathlib.Analysis.SpecialFunctions.Pow.Real +public import Mathlib.RingTheory.Norm.Defs +public import Mathlib.Topology.UniformSpace.AbsoluteValue +/-! +# Minimal absolute-value norm API + +This file keeps only the lightweight explicit definitions used by the +current Section 4 formalization. The old experimental completion and norm +formula development was removed because it duplicated mathlib APIs and no +longer compiled. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- A valued field is complete if it is complete for the uniformity +induced by its absolute value. -/ +def IsCompleteForAbsoluteValue {K : Type*} [Field K] (v : AbsoluteValue K ℝ) : Prop := + @CompleteSpace K v.uniformSpace + +/-- The uniformity attached directly to an absolute value agrees with the +uniformity coming from the normed-field structure induced by that absolute +value. -/ +theorem absoluteValue_uniformSpace_eq_toNormedField + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) : + v.uniformSpace = (AbsoluteValue.toNormedField v).toUniformSpace := by + let : NormedField K := AbsoluteValue.toNormedField v + ext s + rw [(AbsoluteValue.hasBasis_uniformity v).mem_iff, + Metric.uniformity_basis_dist.mem_iff] + have hdist : ∀ p : K × K, dist p.1 p.2 = v (p.1 - p.2) := by + intro p + change v (-p.1 + p.2) = v (p.1 - p.2) + simpa [sub_eq_add_neg, add_comm] using (v.map_sub p.1 p.2).symm + simp [hdist, AbsoluteValue.map_sub] + +/-- Completeness in the absolute-value uniformity is the same as +completeness of the corresponding `WithAbs` normed field. -/ +theorem absoluteValueCompleteness_completeSpace_withAbs_iff_complete + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) : + CompleteSpace (WithAbs v) ↔ IsCompleteForAbsoluteValue v := by + let : NormedField K := AbsoluteValue.toNormedField v + let e : WithAbs v ≃ᵢ K := + { toEquiv := (WithAbs.equiv v).toEquiv + isometry_toFun := by + rw [isometry_iff_dist_eq] + intro x y + simp only [dist_eq_norm_sub, + WithAbs.norm_eq_apply_ofAbs, WithAbs.ofAbs_sub] + rfl } + rw [e.completeSpace_iff] + change @CompleteSpace K (AbsoluteValue.toNormedField v).toUniformSpace ↔ + @CompleteSpace K v.uniformSpace + rw [← absoluteValue_uniformSpace_eq_toNormedField v] + +/-- A complete valued field is complete as the corresponding `WithAbs` +normed field. -/ +theorem completeSpace_withAbs_of_isCompleteForAbsoluteValue + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hcomplete : IsCompleteForAbsoluteValue v) : + CompleteSpace (WithAbs v) := + (absoluteValueCompleteness_completeSpace_withAbs_iff_complete v).2 hcomplete + +/-- Sequence form of the sequential completeness criterion: a complete valued field is exactly one +where every Cauchy sequence in the absolute-value topology converges. -/ +theorem absoluteValueCompleteness_complete_iff_cauchySeq_converges + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) : + IsCompleteForAbsoluteValue v ↔ + ∀ u : ℕ → WithAbs v, CauchySeq u → + ∃ a : WithAbs v, Filter.Tendsto u Filter.atTop (nhds a) := by + constructor + · intro hcomplete u hu + let : CompleteSpace (WithAbs v) := + completeSpace_withAbs_of_isCompleteForAbsoluteValue v hcomplete + exact cauchySeq_tendsto_of_complete hu + · intro hseq + exact (absoluteValueCompleteness_completeSpace_withAbs_iff_complete v).1 + (Metric.complete_of_cauchySeq_tendsto hseq) + +/-- The nontrivial-valuation convention excludes the trivial valuation; this supplies the +corresponding mathlib `NontriviallyNormedField` instance for `WithAbs v`. -/ +@[reducible] +def withAbsNontriviallyNormedField + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) (hv : v.IsNontrivial) : + NontriviallyNormedField (WithAbs v) := + NontriviallyNormedField.ofNormNeOne + (by + rcases hv with ⟨x, hx0, hx1⟩ + refine ⟨(WithAbs.equiv v).symm x, ?_, ?_⟩ + · intro hx + apply hx0 + simpa using congrArg (WithAbs.equiv v) hx + · simpa [WithAbs.norm_eq_apply_ofAbs] using hx1) + +/-- The finite-degree norm-formula candidate: +`x ↦ |N_{L/K}(x)|^{1/[L:K]}`. -/ +def finiteExtensionNormFormulaValue + {K L : Type*} [Field K] [Field L] [Algebra K L] + (v : AbsoluteValue K ℝ) (x : L) : ℝ := + Real.rpow (v (Algebra.norm K x)) (1 / (Module.finrank K L : ℝ)) + +/-- The finite-degree norm formula candidate is nonnegative. -/ +theorem finiteExtensionNormFormulaValue_nonneg + {K L : Type*} [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] + (v : AbsoluteValue K ℝ) (x : L) : + 0 ≤ finiteExtensionNormFormulaValue v x := + Real.rpow_nonneg (v.nonneg _) _ + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completion.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completion.lean new file mode 100644 index 0000000000..84271e485e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completion.lean @@ -0,0 +1,477 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean +public import Mathlib.Analysis.Normed.Field.Instances +public import Mathlib.Analysis.Normed.Module.Completion +public import Mathlib.Analysis.Normed.Unbundled.RingSeminorm +/-! +# Completions of absolute-valued fields + +This file supplies the canonical absolute value, completion maps, density, +and complete-target universal property for real-valued absolute values. An +extension is expressed directly by AbsoluteValue.Extends; no extra +container is introduced. The base-to-completion algebra instance is the +canonical one inherited from WithAbs; algebras between different completions +remain explicit. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Topology + +namespace AbsoluteValue + +universe u v w + +/-- The norm absolute value on the completion attached to `vK`. -/ +noncomputable def completionAbsoluteValue + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) : + AbsoluteValue vK.Completion ℝ := + NormedField.toAbsoluteValue vK.Completion + +/-- The extended absolute value on the completion agrees with the original value +on embedded elements. -/ +@[simp] +theorem completionAbsoluteValue_coe + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) (x : K) : + completionAbsoluteValue vK (x : vK.Completion) = vK x := by + change ‖(x : vK.Completion)‖ = vK x + rw [UniformSpace.Completion.norm_coe] + rfl + +/-- The uniformity defined by the completion absolute value is the native +completion uniformity. -/ +theorem completionAbsoluteValue_uniformSpace_eq + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) : + (completionAbsoluteValue vK).uniformSpace = + (@UniformSpace.Completion.uniformSpace (WithAbs vK) inferInstance) := by + ext s + rw [(AbsoluteValue.hasBasis_uniformity + (completionAbsoluteValue vK)).mem_iff, + Metric.uniformity_basis_dist.mem_iff] + have hdist : ∀ p : vK.Completion × vK.Completion, + dist p.1 p.2 = completionAbsoluteValue vK (p.1 - p.2) := by + intro p + rw [dist_eq_norm] + rfl + simp [hdist, AbsoluteValue.map_sub] + +/-- The field equipped with its completion absolute value is complete. -/ +theorem completionAbsoluteValue_complete + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) : + CompleteSpace (WithAbs (completionAbsoluteValue vK)) := by + let e := WithAbs.equiv (completionAbsoluteValue vK) + have he : Isometry e := + AddMonoidHomClass.isometry_of_norm e.toRingHom fun _ ↦ rfl + exact (completeSpace_congr (e := e.toEquiv) he.isUniformEmbedding).2 inferInstance + +/-- Nontriviality passes to the completion absolute value. -/ +theorem completionAbsoluteValue_isNontrivial + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) : + (completionAbsoluteValue vK).IsNontrivial := by + rcases hvK with ⟨x, hx0, hx1⟩ + refine ⟨(x : vK.Completion), ?_, ?_⟩ + · intro hx + have hx' : (WithAbs.equiv vK).symm x = 0 := + UniformSpace.Completion.coe_injective (α := WithAbs vK) hx + exact hx0 (by simpa using congrArg (WithAbs.equiv vK) hx') + · simpa using hx1 + +/-- The canonical embedding of an absolute-valued field in its completion. -/ +noncomputable def toCompletion + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) : + K →+* vK.Completion := + UniformSpace.Completion.coeRingHom.comp + (WithAbs.equiv vK).symm.toRingHom + +/-- The canonical map into the completion sends an element to its constant Cauchy class. -/ +@[simp] +theorem toCompletion_apply + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) (x : K) : + toCompletion vK x = ((WithAbs.equiv vK).symm x : vK.Completion) := + rfl + +/-- The canonical completion embedding agrees with the completion algebra map. -/ +theorem toCompletion_eq_algebraMap + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) (x : K) : + toCompletion vK x = algebraMap K vK.Completion x := + rfl + +/-- The canonical copy of a field is dense in its completion. -/ +theorem denseRange_toCompletion + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) : + DenseRange (toCompletion vK) := by + change DenseRange + (UniformSpace.Completion.coe' ∘ WithAbs.toAbs vK) + exact + (@UniformSpace.Completion.denseRange_coe (WithAbs vK) inferInstance).comp + (WithAbs.toAbs_surjective vK).denseRange + (@UniformSpace.Completion.continuous_coe (WithAbs vK) inferInstance) + +/-- Embed the valued base field into the completion of the extension field. -/ +noncomputable def baseToExtensionCompletion + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (wL : AbsoluteValue L ℝ) : + WithAbs vK →+* wL.Completion := + UniformSpace.Completion.coeRingHom.comp + (algebraMap (WithAbs vK) (WithAbs wL)) + +private theorem baseToExtensionCompletion_norm + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (wL : AbsoluteValue L ℝ) + (hw : Extends vK wL) (x : WithAbs vK) : + ‖baseToExtensionCompletion vK wL x‖ = ‖x‖ := by + change + ‖((algebraMap (WithAbs vK) (WithAbs wL)) x : wL.Completion)‖ = ‖x‖ + rw [UniformSpace.Completion.norm_coe, WithAbs.norm_eq_apply_ofAbs, + WithAbs.norm_eq_apply_ofAbs, WithAbs.ofAbs_algebraMap] + exact hw x.ofAbs + +private theorem baseToExtensionCompletion_isometry + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (wL : AbsoluteValue L ℝ) + (hw : Extends vK wL) : + Isometry (baseToExtensionCompletion vK wL) := + AddMonoidHomClass.isometry_of_norm _ + (baseToExtensionCompletion_norm vK wL hw) + +/-- The isometric embedding between completions induced by an exact extension +of absolute values. -/ +noncomputable def completionMap + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (wL : AbsoluteValue L ℝ) + (hw : Extends vK wL) : + vK.Completion →+* wL.Completion := + UniformSpace.Completion.extensionHom + (baseToExtensionCompletion vK wL) + (by exact (baseToExtensionCompletion_isometry vK wL hw).continuous) + +private theorem completionMap_withAbs_coe + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (wL : AbsoluteValue L ℝ) + (hw : Extends vK wL) (x : WithAbs vK) : + completionMap vK wL hw (x : vK.Completion) = + baseToExtensionCompletion vK wL x := + UniformSpace.Completion.extensionHom_coe + (baseToExtensionCompletion vK wL) + (by exact (baseToExtensionCompletion_isometry vK wL hw).continuous) x + +/-- On the canonical copy of the base field, the map between completions is +the original algebra map followed by the canonical completion map. -/ +@[simp] +theorem completionMap_coe + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (wL : AbsoluteValue L ℝ) + (hw : Extends vK wL) (x : K) : + completionMap vK wL hw (algebraMap K vK.Completion x) = + toCompletion wL (algebraMap K L x) := by + change completionMap vK wL hw + (((WithAbs.equiv vK).symm x : WithAbs vK) : vK.Completion) = + (((WithAbs.equiv wL).symm (algebraMap K L x) : WithAbs wL) : + wL.Completion) + rw [completionMap_withAbs_coe] + rfl + +/-- The map induced between completions is an isometry. -/ +theorem completionMap_isometry + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (wL : AbsoluteValue L ℝ) + (hw : Extends vK wL) : + Isometry (completionMap vK wL hw) := + (baseToExtensionCompletion_isometry vK wL hw).completion_extension + +/-- The algebra structure on the extension completion induced by the +completion map. It is deliberately explicit rather than a global instance. -/ +@[reducible] noncomputable def completionAlgebra + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (wL : AbsoluteValue L ℝ) + (hw : Extends vK wL) : + Algebra vK.Completion wL.Completion := + (completionMap vK wL hw).toAlgebra + +/-- The algebra structure on the completion uses the canonical completion embedding. -/ +@[simp] +theorem completionAlgebra_algebraMap + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (wL : AbsoluteValue L ℝ) + (hw : Extends vK wL) (x : vK.Completion) : + @algebraMap vK.Completion wL.Completion _ _ + (completionAlgebra vK wL hw) x = completionMap vK wL hw x := + rfl + +/-- The algebra structure on an extension completion induced by the dense +copy of the extension field. It is deliberately explicit. -/ +@[reducible] noncomputable def extensionCompletionAlgebra + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (wL : AbsoluteValue L ℝ) : + Algebra K wL.Completion := + ((toCompletion wL).comp (algebraMap K L)).toAlgebra + +/-- The canonical dense embedding as an algebra homomorphism. -/ +noncomputable def toCompletionAlgHom + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (wL : AbsoluteValue L ℝ) : + letI := extensionCompletionAlgebra (K := K) wL + L →ₐ[K] wL.Completion := by + letI := extensionCompletionAlgebra (K := K) wL + exact + { __ := toCompletion wL + commutes' _ := rfl } + +/-- The scalar tower `K → K_v → L_w` supplied by an exact extension. -/ +theorem completion_isScalarTower + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (wL : AbsoluteValue L ℝ) + (hw : Extends vK wL) : + letI hK := extensionCompletionAlgebra (K := K) wL + letI : SMul K wL.Completion := hK.toSMul + letI := completionAlgebra vK wL hw + IsScalarTower K vK.Completion wL.Completion := by + let hK := extensionCompletionAlgebra (K := K) wL + let : SMul K wL.Completion := hK.toSMul + let := completionAlgebra vK wL hw + exact IsScalarTower.of_algebraMap_eq fun x ↦ + (completionMap_coe vK wL hw x).symm + +/-- The completion absolute value on `L_w` extends that on `K_v`. -/ +theorem completionAbsoluteValue_extends + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (wL : AbsoluteValue L ℝ) + (hw : Extends vK wL) : + letI := completionAlgebra vK wL hw + Extends (completionAbsoluteValue vK) (completionAbsoluteValue wL) := by + let := completionAlgebra vK wL hw + intro x + change ‖algebraMap vK.Completion wL.Completion x‖ = ‖x‖ + exact (completionMap_isometry vK wL hw).norm_map_of_map_zero + (map_zero _) x + +/-- Nonarchimedeanness passes to the completion absolute value. -/ +theorem completionAbsoluteValue_isNonarchimedean + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) + (hvK : IsNonarchimedean (vK : K → ℝ)) : + IsNonarchimedean + (completionAbsoluteValue vK : vK.Completion → ℝ) := by + rw [isNonarchimedean_iff_bounded_nat] + refine ⟨1, fun n ↦ ?_⟩ + rw [← map_natCast (algebraMap K vK.Completion) n, + ← toCompletion_eq_algebraMap vK (n : K)] + change completionAbsoluteValue vK + (((WithAbs.equiv vK).symm (n : K) : WithAbs vK) : + vK.Completion) ≤ 1 + rw [completionAbsoluteValue_coe] + change vK (n : K) ≤ 1 + simpa using hvK.apply_natCast_le_one (by simp) (by simp) + +/-- A nonarchimedean absolute value and its completion absolute value have the +same range. -/ +theorem completionAbsoluteValue_range_eq + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) + (hvK : IsNonarchimedean (vK : K → ℝ)) : + Set.range (completionAbsoluteValue vK) = Set.range vK := by + let vC := completionAbsoluteValue vK + have hvC : IsNonarchimedean (vC : vK.Completion → ℝ) := + completionAbsoluteValue_isNonarchimedean vK hvK + apply Set.Subset.antisymm + · rintro r ⟨y, rfl⟩ + by_cases hy : y = 0 + · subst y + exact ⟨0, by simp⟩ + · have hypos : 0 < vC y := vC.pos hy + obtain ⟨x, hx⟩ := + (denseRange_toCompletion vK).exists_dist_lt y hypos + have hclose : + vC (y - algebraMap K vK.Completion x) < vC y := by + change dist y (toCompletion vK x) < ‖y‖ at hx + change ‖y - toCompletion vK x‖ < ‖y‖ + simpa only [dist_eq_norm] using hx + have hne : vC y ≠ vC (-(y - algebraMap K vK.Completion x)) := by + rw [AbsoluteValue.map_neg] + exact ne_of_gt hclose + have hsum := IsNonarchimedean.add_eq_max_of_ne + (fun a => vC.map_neg a) hvC hne + refine ⟨x, ?_⟩ + calc + vK x = vC (algebraMap K vK.Completion x) := + (completionAbsoluteValue_coe vK x).symm + _ = vC (y + -(y - algebraMap K vK.Completion x)) := by + congr 1 + ring + _ = max (vC y) (vC (-(y - algebraMap K vK.Completion x))) := hsum + _ = vC y := by + rw [AbsoluteValue.map_neg] + exact max_eq_left hclose.le + · rintro r ⟨x, rfl⟩ + exact ⟨algebraMap K vK.Completion x, + completionAbsoluteValue_coe vK x⟩ + +section CompleteTarget + +variable {K : Type u} {D : Type w} [Field K] [Field D] + +/-- Transport a ring homomorphism to the absolute-value models of its fields. -/ +noncomputable def toCompleteTargetRingHom + (vK : AbsoluteValue K ℝ) (vD : AbsoluteValue D ℝ) + (i : K →+* D) : + WithAbs vK →+* WithAbs vD := + (WithAbs.equiv vD).symm.toRingHom.comp + (i.comp (WithAbs.equiv vK).toRingHom) + +private theorem toCompleteTargetRingHom_norm + (vK : AbsoluteValue K ℝ) (vD : AbsoluteValue D ℝ) + (i : K →+* D) (hi : ∀ x : K, vD (i x) = vK x) + (x : WithAbs vK) : + ‖toCompleteTargetRingHom vK vD i x‖ = ‖x‖ := by + change vD (i (WithAbs.equiv vK x)) = vK (WithAbs.equiv vK x) + exact hi _ + +private theorem toCompleteTargetRingHom_isometry + (vK : AbsoluteValue K ℝ) (vD : AbsoluteValue D ℝ) + (i : K →+* D) (hi : ∀ x : K, vD (i x) = vK x) : + Isometry (toCompleteTargetRingHom vK vD i) := + AddMonoidHomClass.isometry_of_norm _ + (toCompleteTargetRingHom_norm vK vD i hi) + +/-- A value-preserving embedding into a complete target extends uniquely from +the field to its metric completion. -/ +noncomputable def completionMapToCompleteTarget + (vK : AbsoluteValue K ℝ) (vD : AbsoluteValue D ℝ) + [CompleteSpace (WithAbs vD)] + (i : K →+* D) (hi : ∀ x : K, vD (i x) = vK x) : + vK.Completion →+* WithAbs vD := + UniformSpace.Completion.extensionHom + (toCompleteTargetRingHom vK vD i) + (by exact (toCompleteTargetRingHom_isometry vK vD i hi).continuous) + +private theorem completionMapToCompleteTarget_withAbs_coe + (vK : AbsoluteValue K ℝ) (vD : AbsoluteValue D ℝ) + [CompleteSpace (WithAbs vD)] + (i : K →+* D) (hi : ∀ x : K, vD (i x) = vK x) + (x : WithAbs vK) : + completionMapToCompleteTarget vK vD i hi + (x : vK.Completion) = + toCompleteTargetRingHom vK vD i x := + UniformSpace.Completion.extensionHom_coe + (toCompleteTargetRingHom vK vD i) + (by exact (toCompleteTargetRingHom_isometry vK vD i hi).continuous) x + +/-- The extension map to a complete target agrees with the original map on +embedded source elements. -/ +@[simp] +theorem completionMapToCompleteTarget_coe + (vK : AbsoluteValue K ℝ) (vD : AbsoluteValue D ℝ) + [CompleteSpace (WithAbs vD)] + (i : K →+* D) (hi : ∀ x : K, vD (i x) = vK x) + (x : K) : + completionMapToCompleteTarget vK vD i hi + (algebraMap K vK.Completion x) = + (WithAbs.equiv vD).symm (i x) := by + change completionMapToCompleteTarget vK vD i hi + (((WithAbs.equiv vK).symm x : WithAbs vK) : vK.Completion) = _ + rw [completionMapToCompleteTarget_withAbs_coe] + rfl + +/-- An isometric source map extends to an isometry from the completion. -/ +theorem completionMapToCompleteTarget_isometry + (vK : AbsoluteValue K ℝ) (vD : AbsoluteValue D ℝ) + [CompleteSpace (WithAbs vD)] + (i : K →+* D) (hi : ∀ x : K, vD (i x) = vK x) : + Isometry (completionMapToCompleteTarget vK vD i hi) := + (toCompleteTargetRingHom_isometry vK vD i hi).completion_extension + +/-- A continuous map from the completion is determined by its restriction to +the canonical dense copy of the source field. -/ +theorem completionMapToCompleteTarget_eq_of_coe_eq + (vK : AbsoluteValue K ℝ) (vD : AbsoluteValue D ℝ) + [CompleteSpace (WithAbs vD)] + (i : K →+* D) (hi : ∀ x : K, vD (i x) = vK x) + (g : vK.Completion →+* WithAbs vD) (hg : Continuous g) + (hcoe : ∀ x : K, + completionMapToCompleteTarget vK vD i hi + (algebraMap K vK.Completion x) = + g (algebraMap K vK.Completion x)) : + completionMapToCompleteTarget vK vD i hi = g := by + ext x + refine UniformSpace.Completion.induction_on (α := WithAbs vK) x ?_ ?_ + · exact isClosed_eq + (completionMapToCompleteTarget_isometry vK vD i hi).continuous hg + · intro a + have ha : (a : vK.Completion) = + algebraMap K vK.Completion (WithAbs.equiv vK a) := by + change (a : vK.Completion) = + (((WithAbs.equiv vK).symm (WithAbs.equiv vK a) : WithAbs vK) : + vK.Completion) + exact congrArg (fun z : WithAbs vK ↦ (z : vK.Completion)) + ((WithAbs.equiv vK).symm_apply_apply a).symm + rw [ha] + exact hcoe (WithAbs.equiv vK a) + +end CompleteTarget + +section CompleteTargetTower + +variable {K : Type u} {L : Type v} {D : Type w} +variable [Field K] [Field L] [Field D] [Algebra K L] + +/-- Dense-point compatibility for extending `L → D` and first embedding the +completed base in the completion of `L`. -/ +theorem completionMapToCompleteTarget_comp_completionMap_coe + (vK : AbsoluteValue K ℝ) (wL : AbsoluteValue L ℝ) + (hw : Extends vK wL) (vD : AbsoluteValue D ℝ) + [CompleteSpace (WithAbs vD)] + (i : L →+* D) (hi : ∀ x : L, vD (i x) = wL x) + (x : K) : + completionMapToCompleteTarget wL vD i hi + (completionMap vK wL hw (algebraMap K vK.Completion x)) = + (WithAbs.equiv vD).symm (i (algebraMap K L x)) := by + rw [completionMap_coe, toCompletion_eq_algebraMap, + completionMapToCompleteTarget_coe] + +/-- Two continuous maps out of the completed base agree if they agree on the +original base field after passage through the extension completion. -/ +theorem completionMapToCompleteTarget_comp_completionMap_eq_of_coe_eq + (vK : AbsoluteValue K ℝ) (wL : AbsoluteValue L ℝ) + (hw : Extends vK wL) (vD : AbsoluteValue D ℝ) + [CompleteSpace (WithAbs vD)] + (i : L →+* D) (hi : ∀ x : L, vD (i x) = wL x) + (g : vK.Completion →+* WithAbs vD) (hg : Continuous g) + (hcoe : ∀ x : K, + (WithAbs.equiv vD).symm (i (algebraMap K L x)) = + g (algebraMap K vK.Completion x)) : + (completionMapToCompleteTarget wL vD i hi).comp + (completionMap vK wL hw) = g := by + ext x + refine UniformSpace.Completion.induction_on (α := WithAbs vK) x ?_ ?_ + · exact isClosed_eq + ((completionMapToCompleteTarget_isometry wL vD i hi).continuous.comp + (completionMap_isometry vK wL hw).continuous) hg + · intro a + have ha : (a : vK.Completion) = + algebraMap K vK.Completion (WithAbs.equiv vK a) := by + change (a : vK.Completion) = + (((WithAbs.equiv vK).symm (WithAbs.equiv vK a) : WithAbs vK) : + vK.Completion) + exact congrArg (fun z : WithAbs vK ↦ (z : vK.Completion)) + ((WithAbs.equiv vK).symm_apply_apply a).symm + rw [ha] + exact + (completionMapToCompleteTarget_comp_completionMap_coe + vK wL hw vD i hi (WithAbs.equiv vK a)).trans + (hcoe (WithAbs.equiv vK a)) + +end CompleteTargetTower + +end AbsoluteValue + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ExponentialValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ExponentialValuation.lean new file mode 100644 index 0000000000..8a4e736c89 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ExponentialValuation.lean @@ -0,0 +1,158 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselianAlgebraicExtension +/-! +# Canonical exponential valuation attached to an absolute value + +The localization arguments of the ramification-localization construction are naturally + multiplicative, whereas the +unramified predicates of the unramified-extension construction use additive exponential + valuations. This file +supplies the canonical conversion `v(x) = -log |x|`. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +variable {K : Type*} [Field K] + +/-- The additive exponential valuation `- log |x|`, with value `∞` at zero. -/ +def absoluteValueExponentialValuation + (abv : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue abv) : + LubinTate.Valuations.ExponentialValuation K := by + classical + refine + { toFun := fun x ↦ + if x = 0 then ⊤ else ((-Real.log (abv x) : ℝ) : WithTop ℝ) + eq_top_iff := ?_ + map_mul := ?_ + add_le_min := ?_ } + · intro x + by_cases hx : x = 0 + · simp [hx] + · simp [hx] + · intro x y + by_cases hx : x = 0 + · subst x + simp + by_cases hy : y = 0 + · subst y + simp + have hxy : x * y ≠ 0 := mul_ne_zero hx hy + simp only [hx, hy, hxy, ite_false, map_mul] + rw [Real.log_mul (abv.ne_zero hx) (abv.ne_zero hy)] + simp only [neg_add, WithTop.coe_add] + · intro x y + by_cases hx : x = 0 + · subst x + simp + by_cases hy : y = 0 + · subst y + simp + by_cases hxy : x + y = 0 + · simp [hxy] + simp only [hx, hy, hxy, ite_false] + apply WithTop.coe_le_coe.mpr + by_cases hle : abv x ≤ abv y + · have hlogxy : Real.log (abv x) ≤ Real.log (abv y) := + Real.strictMonoOn_log.monotoneOn (abv.pos hx) (abv.pos hy) hle + rw [min_eq_right (neg_le_neg hlogxy)] + apply neg_le_neg + exact Real.strictMonoOn_log.monotoneOn (abv.pos hxy) (abv.pos hy) + (((LubinTate.Valuations.strong_triangle_of_nonarchimedean abv hnonarch) + x y).trans (max_eq_right hle).le) + · have hyx : abv y ≤ abv x := le_of_not_ge hle + have hlogyx : Real.log (abv y) ≤ Real.log (abv x) := + Real.strictMonoOn_log.monotoneOn (abv.pos hy) (abv.pos hx) hyx + rw [min_eq_left (neg_le_neg hlogyx)] + apply neg_le_neg + exact Real.strictMonoOn_log.monotoneOn (abv.pos hxy) (abv.pos hx) + (((LubinTate.Valuations.strong_triangle_of_nonarchimedean abv hnonarch) + x y).trans (max_eq_left hyx).le) + +@[simp] theorem absoluteValueExponentialValuation_apply_ne_zero + (abv : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue abv) + {x : K} (hx : x ≠ 0) : + absoluteValueExponentialValuation abv hnonarch x = + ((-Real.log (abv x) : ℝ) : WithTop ℝ) := by + simp [absoluteValueExponentialValuation, hx] + +/-- The original absolute value is associated to its canonical exponential +valuation, with base `e`. -/ +theorem absoluteValueExponentialValuation_associated + (abv : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue abv) : + LubinTate.Valuations.AssociatedAbsoluteValue + (absoluteValueExponentialValuation abv hnonarch) + (Real.exp 1) abv := by + refine ⟨Real.one_lt_exp_iff.mpr zero_lt_one, ?_⟩ + intro x hx + refine ⟨-Real.log (abv x), ?_, ?_⟩ + · simp [absoluteValueExponentialValuation, hx] + · simp only [neg_neg] + exact (Real.exp_log (abv.pos hx)).symm.trans + (Real.exp_one_rpow (Real.log (abv x))).symm + +/-- Extensionality for exponential valuations. -/ +theorem exponentialValuation_ext + (v w : LubinTate.Valuations.ExponentialValuation K) (h : ∀ x, v x = w x) : v = w := by + cases v with + | mk vf vtop vmul vadd => + cases w with + | mk wf wtop wmul wadd => + have hvw : vf = wf := funext h + subst wf + rfl + +/-- Converting the canonical associated absolute value back by `-log` +recovers the original exponential valuation literally. -/ +theorem absoluteValueExponentialValuation_associated_eq + (v : LubinTate.Valuations.ExponentialValuation K) : + absoluteValueExponentialValuation + (exponentialAssociatedAbsoluteValue v) + (associatedAbsoluteValue_nonarchimedean v (Real.exp 1) + (exponentialAssociatedAbsoluteValue v) + (exponentialAssociatedAbsoluteValue_associated v)) = v := by + apply exponentialValuation_ext + intro x + by_cases hx : x = 0 + · subst x + simp [absoluteValueExponentialValuation, + exponentialAssociatedAbsoluteValue, (v.eq_top_iff 0).mpr rfl] + · rw [absoluteValueExponentialValuation_apply_ne_zero _ _ hx] + simp [exponentialAssociatedAbsoluteValue, hx, Real.log_exp, + WithTop.coe_untop₀_of_ne_top + (LubinTate.Valuations.exponentialValuation_ne_top_of_ne_zero v hx)] + +/-- Exact extension of nonarchimedean absolute values gives exact extension +of their canonical exponential valuations. -/ +theorem absoluteValueExponentialValuation_extends + {L : Type*} [Field L] [Algebra K L] + (av : AbsoluteValue K ℝ) (aw : AbsoluteValue L ℝ) + (hav : LubinTate.Valuations.NonarchimedeanAbsoluteValue av) + (haw : LubinTate.Valuations.NonarchimedeanAbsoluteValue aw) + (hExt : ∀ x : K, aw (algebraMap K L x) = av x) : + ∀ x : K, + absoluteValueExponentialValuation aw haw (algebraMap K L x) = + absoluteValueExponentialValuation av hav x := by + intro x + by_cases hx : x = 0 + · subst x + simp [absoluteValueExponentialValuation] + · have hmx : algebraMap K L x ≠ 0 := (map_ne_zero _).mpr hx + simp [absoluteValueExponentialValuation, hx, hmx, hExt] + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Extension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Extension.lean new file mode 100644 index 0000000000..6c5c153462 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Extension.lean @@ -0,0 +1,25 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Algebra.Basic +public import Mathlib.Basic.Real.Basic +public import Mathlib.Topology.UniformSpace.AbsoluteValue +/-! +# Extensions of absolute values + +A reusable predicate for exact extension along an algebra map. +-/ + +@[expose] public section +namespace AbsoluteValue +/-- The target absolute value agrees with the base absolute value along the algebra map. -/ +def Extends {K L : Type*} [Field K] [Field L] [Algebra K L] + (v : AbsoluteValue K ℝ) (w : AbsoluteValue L ℝ) : Prop := + ∀ x : K, w (algebraMap K L x) = v x + +end AbsoluteValue diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Nonarchimedean.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Nonarchimedean.lean new file mode 100644 index 0000000000..e2f7066f10 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Nonarchimedean.lean @@ -0,0 +1,243 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Analysis.AbsoluteValue.Equivalence +public import Mathlib.Analysis.SpecialFunctions.Pow.Continuity +public import Mathlib.Algebra.Order.Ring.IsNonarchimedean +/-! +# Nonarchimedean absolute values + +The strong triangle inequality is equivalent to boundedness on natural numbers +for real-valued absolute values. +-/ + +@[expose] public section + +noncomputable +section + +open Filter +open scoped Topology + +namespace AbsoluteValue + +private theorem finset_sum_le + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + {ι : Type*} (s : Finset ι) (f : ι → K) : + v (s.sum f) ≤ s.sum (fun i => v (f i)) := by + classical + refine Finset.induction_on s ?empty ?insert + · simp + · intro i s his ih + rw [Finset.sum_insert his, Finset.sum_insert his] + exact (v.add_le (f i) (s.sum f)).trans + (by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_left ih (v (f i))) + +private theorem nat_bound_ge_one + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) {C : ℝ} + (hC : ∀ n : ℕ, v (n : K) ≤ C) : + 1 ≤ C := by + simpa using hC 1 + +/-- The binomial-estimate step in the proof of the nonarchimedean criterion: boundedness +of the values of natural numbers gives a polynomial factor in the estimate for +`(x + y)^n`. -/ +private theorem add_pow_le_of_bounded_nat + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) {C : ℝ} + (hC : ∀ n : ℕ, v (n : K) ≤ C) (x y : K) (n : ℕ) : + v ((x + y) ^ n) ≤ + ((n + 1 : ℕ) : ℝ) * C * (max (v x) (v y)) ^ n := by + classical + let M : ℝ := max (v x) (v y) + have hC_nonneg : 0 ≤ C := + (zero_le_one : (0 : ℝ) ≤ 1).trans + (nat_bound_ge_one v hC) + have hM_nonneg : 0 ≤ M := + (v.nonneg x).trans (le_max_left (v x) (v y)) + have hsum_le : + v ((Finset.range (n + 1)).sum + (fun m => x ^ m * y ^ (n - m) * (n.choose m : K))) ≤ + (Finset.range (n + 1)).sum + (fun m => v (x ^ m * y ^ (n - m) * (n.choose m : K))) := + finset_sum_le v (Finset.range (n + 1)) + (fun m => x ^ m * y ^ (n - m) * (n.choose m : K)) + have hterm : + ∀ m ∈ Finset.range (n + 1), + v (x ^ m * y ^ (n - m) * (n.choose m : K)) ≤ C * M ^ n := by + intro m hm + have hmle : m ≤ n := Nat.lt_succ_iff.mp (Finset.mem_range.mp hm) + have hxpow : v (x ^ m) ≤ M ^ m := by + rw [map_pow] + exact pow_le_pow_left₀ (v.nonneg x) (le_max_left (v x) (v y)) m + have hypow : v (y ^ (n - m)) ≤ M ^ (n - m) := by + rw [map_pow] + exact pow_le_pow_left₀ (v.nonneg y) (le_max_right (v x) (v y)) (n - m) + have hxy : + v (x ^ m) * v (y ^ (n - m)) ≤ M ^ m * M ^ (n - m) := + mul_le_mul hxpow hypow (v.nonneg (y ^ (n - m))) (pow_nonneg hM_nonneg m) + have hchoose : v ((n.choose m : ℕ) : K) ≤ C := hC (n.choose m) + calc + v (x ^ m * y ^ (n - m) * (n.choose m : K)) + = v (x ^ m) * v (y ^ (n - m)) * v ((n.choose m : ℕ) : K) := by + rw [map_mul, map_mul] + _ ≤ (M ^ m * M ^ (n - m)) * C := by + exact mul_le_mul hxy hchoose + (v.nonneg ((n.choose m : ℕ) : K)) + (mul_nonneg (pow_nonneg hM_nonneg m) + (pow_nonneg hM_nonneg (n - m))) + _ = C * M ^ n := by + rw [← pow_add, Nat.add_sub_of_le hmle] + ring + calc + v ((x + y) ^ n) + = v ((Finset.range (n + 1)).sum + (fun m => x ^ m * y ^ (n - m) * (n.choose m : K))) := by + rw [add_pow] + _ ≤ (Finset.range (n + 1)).sum + (fun m => v (x ^ m * y ^ (n - m) * (n.choose m : K))) := hsum_le + _ ≤ (Finset.range (n + 1)).sum (fun _m => C * M ^ n) := + Finset.sum_le_sum hterm + _ = ((n + 1 : ℕ) : ℝ) * C * M ^ n := by + simp [Finset.sum_const, nsmul_eq_mul, mul_assoc] + +/-- The real-variable limit used at the end of the nonarchimedean criterion: after taking +`n`-th roots, the polynomial factor `(n+1)C` disappears. -/ +private theorem tendsto_linear_bound_rpow_inv + {C : ℝ} (hC : 0 < C) : + Tendsto + (fun n : ℕ => ((((n + 1 : ℕ) : ℝ) * C) ^ ((n : ℝ)⁻¹))) + atTop (𝓝 1) := by + have hCroot : + Tendsto (fun n : ℕ => C ^ ((n : ℝ)⁻¹)) atTop (𝓝 1) := by + have hcont : ContinuousAt (fun t : ℝ => C ^ t) 0 := + Real.continuousAt_const_rpow hC.ne' + have hzero : Tendsto (fun n : ℕ => (n : ℝ)⁻¹) atTop (𝓝 0) := + tendsto_inv_atTop_zero.comp tendsto_natCast_atTop_atTop + have hroot := hcont.tendsto.comp hzero + change Tendsto (fun n : ℕ => C ^ ((n : ℝ)⁻¹)) atTop (𝓝 (C ^ (0 : ℝ))) at hroot + simpa [Real.rpow_zero] using hroot + have hshiftReal : + Tendsto (fun x : ℝ => x ^ ((1 : ℝ) / (1 * x + (-1)))) atTop (𝓝 1) := + tendsto_rpow_div_mul_add 1 1 (-1) zero_ne_one + have hshiftNat : + Tendsto (fun n : ℕ => (((n + 1 : ℕ) : ℝ) ^ ((n : ℝ)⁻¹))) + atTop (𝓝 1) := by + have hnatshift : Tendsto (fun n : ℕ => (n : ℝ) + 1) atTop atTop := + tendsto_atTop_add_const_right atTop 1 tendsto_natCast_atTop_atTop + refine (hshiftReal.comp hnatshift).congr' ?_ + exact Eventually.of_forall fun n => by + simp [Nat.cast_add, Nat.cast_one, one_div, add_assoc] + have htarget : + Tendsto + (fun n : ℕ => ((((n + 1 : ℕ) : ℝ) * C) ^ ((n : ℝ)⁻¹))) + atTop (𝓝 (1 * 1)) := by + refine (hshiftNat.mul hCroot).congr' ?_ + exact Eventually.of_forall fun n => by + have hn_nonneg : 0 ≤ ((n + 1 : ℕ) : ℝ) := by positivity + have hmul := + (Real.mul_rpow (z := ((n : ℝ)⁻¹)) hn_nonneg (le_of_lt hC)).symm + simpa [mul_comm, mul_left_comm, mul_assoc] using hmul + simpa using htarget + +/-- The root form of the binomial estimate in the nonarchimedean criterion. -/ +private theorem add_le_root_bound_of_bounded_nat + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) {C : ℝ} + (hC : ∀ n : ℕ, v (n : K) ≤ C) (x y : K) + {n : ℕ} (hn : n ≠ 0) : + v (x + y) ≤ + ((((n + 1 : ℕ) : ℝ) * C) ^ ((n : ℝ)⁻¹)) * + max (v x) (v y) := by + classical + let M : ℝ := max (v x) (v y) + have hC_pos : 0 < C := + zero_lt_one.trans_le (nat_bound_ge_one v hC) + have hM_nonneg : 0 ≤ M := + (v.nonneg x).trans (le_max_left (v x) (v y)) + by_cases hMzero : M = 0 + · have hx_le_zero : v x ≤ 0 := by + simpa [M, hMzero] using (le_max_left (v x) (v y)) + have hy_le_zero : v y ≤ 0 := by + simpa [M, hMzero] using (le_max_right (v x) (v y)) + have hxzero : x = 0 := (v.eq_zero).mp (le_antisymm hx_le_zero (v.nonneg x)) + have hyzero : y = 0 := (v.eq_zero).mp (le_antisymm hy_le_zero (v.nonneg y)) + simp [hxzero, hyzero] + · have hpow : + (v (x + y)) ^ n ≤ ((n + 1 : ℕ) : ℝ) * C * M ^ n := by + simpa [map_pow, M] using + add_pow_le_of_bounded_nat v hC x y n + have hright_nonneg : + 0 ≤ ((n + 1 : ℕ) : ℝ) * C * M ^ n := by + exact mul_nonneg + (mul_nonneg (by positivity) (le_of_lt hC_pos)) + (pow_nonneg hM_nonneg n) + have hn_pos : 0 < (n : ℝ) := Nat.cast_pos.mpr (Nat.pos_of_ne_zero hn) + have hroot : + v (x + y) ≤ + (((n + 1 : ℕ) : ℝ) * C * M ^ n) ^ ((n : ℝ)⁻¹) := by + rw [Real.le_rpow_inv_iff_of_pos (v.nonneg (x + y)) hright_nonneg hn_pos] + simpa [Real.rpow_natCast] using hpow + calc + v (x + y) + ≤ (((n + 1 : ℕ) : ℝ) * C * M ^ n) ^ ((n : ℝ)⁻¹) := hroot + _ = ((((n + 1 : ℕ) : ℝ) * C) ^ ((n : ℝ)⁻¹)) * M := by + have hcoef_nonneg : 0 ≤ ((n + 1 : ℕ) : ℝ) * C := + mul_nonneg (by positivity) (le_of_lt hC_pos) + rw [Real.mul_rpow hcoef_nonneg (pow_nonneg hM_nonneg n)] + rw [Real.pow_rpow_inv_natCast hM_nonneg hn] + _ = ((((n + 1 : ℕ) : ℝ) * C) ^ ((n : ℝ)⁻¹)) * + max (v x) (v y) := by + rfl + +/-- Boundedness on natural numbers implies the strong triangle inequality. -/ +private theorem isNonarchimedean_of_bounded_nat + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : ∃ C : ℝ, ∀ n : ℕ, v (n : K) ≤ C) : + IsNonarchimedean (v : K → ℝ) := by + rcases hnonarch with ⟨C, hC⟩ + have hC_pos : 0 < C := + zero_lt_one.trans_le (nat_bound_ge_one v hC) + intro x y + let M : ℝ := max (v x) (v y) + have hlim : + Tendsto + (fun n : ℕ => + ((((n + 1 : ℕ) : ℝ) * C) ^ ((n : ℝ)⁻¹)) * M) + atTop (𝓝 M) := by + simpa using + (tendsto_linear_bound_rpow_inv hC_pos).mul + (tendsto_const_nhds (x := M)) + have heventually : + ∀ᶠ n : ℕ in atTop, + v (x + y) ≤ + ((((n + 1 : ℕ) : ℝ) * C) ^ ((n : ℝ)⁻¹)) * M := by + refine eventually_atTop.2 ⟨1, ?_⟩ + intro n hn + exact add_le_root_bound_of_bounded_nat + (v := v) hC x y (n := n) (by omega) + have hle : + v (x + y) ≤ M := + le_of_tendsto_of_tendsto tendsto_const_nhds hlim heventually + simpa [M] using hle + +/-- A real-valued absolute value is nonarchimedean exactly when its values on +the natural numbers are bounded. -/ +theorem isNonarchimedean_iff_bounded_nat + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) : + IsNonarchimedean (v : K → ℝ) ↔ + ∃ C : ℝ, ∀ n : ℕ, v (n : K) ≤ C := by + constructor + · intro h + exact ⟨1, fun n => h.apply_natCast_le_one (by simp) (by simp)⟩ + · exact isNonarchimedean_of_bounded_nat v + + +end AbsoluteValue + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Ostrowski.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Ostrowski.lean new file mode 100644 index 0000000000..b7293ec729 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Ostrowski.lean @@ -0,0 +1,1175 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean +public import Mathlib.Analysis.Normed.Algebra.GelfandMazur +public import Mathlib.NumberTheory.Ostrowski +/-! +# Ostrowski classification for complete valued fields + +A complete field with an archimedean real-valued absolute value is isomorphic +to ℝ or ℂ, with the absolute value obtained from the standard norm by a +positive exponent at most one. +-/ + +@[expose] public section + +noncomputable +section + +open Filter + +namespace AbsoluteValue + +private theorem ostrowski_isNonarchimedean_of_charP_pos + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) {p : ℕ} + [CharP K p] (hp : p ≠ 0) : + IsNonarchimedean (v : K → ℝ) := by + rw [isNonarchimedean_iff_bounded_nat] + refine ⟨(p : ℝ), fun n => ?_⟩ + have hp_pos : 0 < p := Nat.pos_of_ne_zero hp + calc + v (n : K) = v ((n % p : ℕ) : K) := by + congr 1 + exact CharP.natCast_eq_natCast_mod K p n + _ ≤ ((n % p : ℕ) : ℝ) := v.apply_nat_le_self (n % p) + _ ≤ (p : ℝ) := by + exact_mod_cast (Nat.mod_lt n hp_pos).le + +/-- An archimedean absolute value forces characteristic zero. Otherwise +the preceding finite-residue-class bound would make it +nonarchimedean in the strong triangle sense. -/ +theorem charZero_of_not_isNonarchimedean + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (harch : ¬ IsNonarchimedean (v : K → ℝ)) : + CharZero K := by + obtain ⟨p, hpchar⟩ := CharP.exists K + have : CharP K p := hpchar + rcases CharP.char_is_prime_or_zero K p with hprime | hp0 + · exact (harch + (ostrowski_isNonarchimedean_of_charP_pos + (K := K) v hprime.ne_zero)).elim + · have : CharP K 0 := by + simpa [hp0] using hpchar + exact CharP.charP_to_charZero K + +private instance ostrowski_withAbsCharZero + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) : + CharZero (WithAbs v) := + ((WithAbs.equiv v).toRingHom.charZero_iff + (WithAbs.equiv v).injective).mpr inferInstance + +/-- The restriction of an absolute value on a characteristic-zero field to the +prime field `ℚ`. -/ +private noncomputable def ostrowski_restrictRatAbsoluteValue + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) : + AbsoluteValue ℚ ℝ := + v.comp (f := Rat.castHom K) Rat.cast_injective + +@[simp] +private theorem ostrowski_restrictRatAbsoluteValue_apply + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) (q : ℚ) : + ostrowski_restrictRatAbsoluteValue (K := K) v q = v (q : K) := + rfl + +/-- If the restriction to `ℚ` is nonarchimedean, then so is the original +absolute value. -/ +private theorem ostrowski_isNonarchimedean_of_restrictRat + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) + (h : IsNonarchimedean + (ostrowski_restrictRatAbsoluteValue (K := K) v : ℚ → ℝ)) : + IsNonarchimedean (v : K → ℝ) := by + rw [isNonarchimedean_iff_bounded_nat] at h ⊢ + rcases h with ⟨C, hC⟩ + refine ⟨C, fun n => ?_⟩ + simpa using hC n + +/-- Hence an archimedean absolute value restricts to an archimedean +absolute value on `ℚ`. -/ +private theorem ostrowski_restrictRat_not_isNonarchimedean + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) + (harch : ¬ IsNonarchimedean (v : K → ℝ)) : + ¬ IsNonarchimedean + (ostrowski_restrictRatAbsoluteValue (K := K) v : ℚ → ℝ) := by + intro hnonarch + exact harch + (ostrowski_isNonarchimedean_of_restrictRat + (K := K) v hnonarch) + +/-- The archimedean restriction to ℚ is equivalent to the real absolute value. -/ +private theorem ostrowski_restrictRat_isEquiv_real_of_not_isNonarchimedean + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) + (harch : ¬ IsNonarchimedean (v : K → ℝ)) : + (ostrowski_restrictRatAbsoluteValue (K := K) v).IsEquiv + Rat.AbsoluteValue.real := by + have harch_rat := + ostrowski_restrictRat_not_isNonarchimedean + (K := K) v harch + refine Rat.AbsoluteValue.equiv_real_of_unbounded ?_ + intro hbounded + exact harch_rat ((isNonarchimedean_iff_bounded_nat _).2 ⟨1, hbounded⟩) + +/-- Concrete exponent form of the previous statement: after raising the +restricted absolute value to a positive power, it is the usual absolute value +on `ℚ`. -/ +private theorem ostrowski_restrictRat_exists_rpow_eq_real_of_not_isNonarchimedean + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) + (harch : ¬ IsNonarchimedean (v : K → ℝ)) : + ∃ c : ℝ, 0 < c ∧ + ∀ q : ℚ, + (ostrowski_restrictRatAbsoluteValue (K := K) v q) ^ c = + Rat.AbsoluteValue.real q := by + rcases (AbsoluteValue.isEquiv_iff_exists_rpow_eq).mp + (ostrowski_restrictRat_isEquiv_real_of_not_isNonarchimedean + (K := K) v harch) with + ⟨c, hc_pos, hc⟩ + refine ⟨c, hc_pos, fun q => ?_⟩ + exact congrFun hc q + +/-- Exponent form of the rational restriction: on `ℚ`, a +archimedean absolute value is the usual absolute value raised to an +exponent `s ∈ (0, 1]`. -/ +private theorem ostrowski_restrictRat_exists_real_rpow_eq_of_not_isNonarchimedean + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) + (harch : ¬ IsNonarchimedean (v : K → ℝ)) : + ∃ s : ℝ, 0 < s ∧ s ≤ 1 ∧ + ∀ q : ℚ, + ostrowski_restrictRatAbsoluteValue (K := K) v q = + Rat.AbsoluteValue.real q ^ s := by + rcases ostrowski_restrictRat_exists_rpow_eq_real_of_not_isNonarchimedean + (K := K) v harch with + ⟨c, hc_pos, hc⟩ + refine ⟨c⁻¹, inv_pos.mpr hc_pos, ?_, fun q => ?_⟩ + · have htwo_le : + (2 : ℝ) ^ c⁻¹ ≤ (2 : ℝ) ^ (1 : ℝ) := by + have happly : + ostrowski_restrictRatAbsoluteValue (K := K) v (2 : ℚ) ≤ (2 : ℝ) := + (ostrowski_restrictRatAbsoluteValue (K := K) v).apply_nat_le_self 2 + have hq := + (Real.rpow_inv_eq + ((Rat.AbsoluteValue.real).nonneg (2 : ℚ)) + ((ostrowski_restrictRatAbsoluteValue (K := K) v).nonneg (2 : ℚ)) + hc_pos.ne').2 (hc (2 : ℚ)).symm + rw [← hq] at happly + simpa [Rat.AbsoluteValue.real_eq_abs, Real.rpow_one] using happly + exact (Real.rpow_le_rpow_left_iff one_lt_two).mp htwo_le + · have hq := + (Real.rpow_inv_eq + ((Rat.AbsoluteValue.real).nonneg q) + ((ostrowski_restrictRatAbsoluteValue (K := K) v).nonneg q) + hc_pos.ne').2 (hc q).symm + exact hq.symm + +/-- A positive rational whose s-power is smaller than a prescribed bound. -/ +private theorem ostrowski_exists_rat_pos_rpow_lt + {s ε : ℝ} (hs : 0 < s) (hε : 0 < ε) : + ∃ δ : ℚ, (0 : ℚ) < δ ∧ ((δ : ℝ) ^ s < ε) := by + let η : ℝ := ε ^ s⁻¹ + have hη_pos : 0 < η := Real.rpow_pos_of_pos hε s⁻¹ + obtain ⟨δ, hδ0, hδη⟩ := exists_rat_btwn hη_pos + refine ⟨δ, ?_, ?_⟩ + · exact_mod_cast hδ0 + · have hδ_nonneg : 0 ≤ (δ : ℝ) := le_of_lt hδ0 + have hlt : ((δ : ℝ) ^ s) < η ^ s := + Real.rpow_lt_rpow hδ_nonneg hδη hs + have hηpow : η ^ s = ε := by + dsimp [η] + rw [← Real.rpow_mul (le_of_lt hε)] + rw [inv_mul_cancel₀ hs.ne', Real.rpow_one] + simpa [hηpow] using hlt + +/-- If the restriction of the absolute value to `ℚ` is the usual absolute +value raised to `s`, then the prime-field embedding into `WithAbs v` has the +same snowflaked norm. -/ +private theorem ostrowski_ratCast_withAbs_norm_eq_of_real_rpow + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) + (s : ℝ) + (hnorm : ∀ q : ℚ, + ostrowski_restrictRatAbsoluteValue (K := K) v q = + Rat.AbsoluteValue.real q ^ s) + (q : ℚ) : + ‖Rat.castHom (WithAbs v) q‖ = ‖(q : ℝ)‖ ^ s := by + change v (q : K) = ‖(q : ℝ)‖ ^ s + rw [← ostrowski_restrictRatAbsoluteValue_apply (K := K) v q, hnorm q] + rw [Rat.AbsoluteValue.real_eq_abs, Real.norm_eq_abs, Rat.cast_abs] + +/-- A rational Cauchy sequence for the usual absolute value is still Cauchy +after transport through a prime-field embedding whose norm is `|·|^s`, for +`s > 0`. -/ +private def ostrowski_ratCauSeqMapWithAbs_of_real_rpow + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) + (s : ℝ) (hs : 0 < s) + (hnorm : ∀ q : ℚ, + ostrowski_restrictRatAbsoluteValue (K := K) v q = + Rat.AbsoluteValue.real q ^ s) + (u : CauSeq ℚ (abs : ℚ → ℚ)) : + CauSeq (WithAbs v) (norm : WithAbs v → ℝ) where + val n := Rat.castHom (WithAbs v) (u n) + property := by + intro ε hε + obtain ⟨δ, hδ0, hδε⟩ := ostrowski_exists_rat_pos_rpow_lt hs hε + obtain ⟨N, hN⟩ := u.2 δ hδ0 + refine ⟨N, fun j hj => ?_⟩ + have hsource : abs (u j - u N) < δ := hN j hj + have hsource_real : ((abs (u j - u N) : ℚ) : ℝ) < (δ : ℝ) := by + exact_mod_cast hsource + have hpow : + ((abs (u j - u N) : ℚ) : ℝ) ^ s < (δ : ℝ) ^ s := + Real.rpow_lt_rpow (by positivity) hsource_real hs + calc + ‖Rat.castHom (WithAbs v) (u j) - + Rat.castHom (WithAbs v) (u N)‖ + = ‖Rat.castHom (WithAbs v) (u j - u N)‖ := by + rw [map_sub] + _ = ‖((u j - u N : ℚ) : ℝ)‖ ^ s := + ostrowski_ratCast_withAbs_norm_eq_of_real_rpow + (K := K) v s hnorm (u j - u N) + _ = ((abs (u j - u N) : ℚ) : ℝ) ^ s := by + rw [Real.norm_eq_abs, Rat.cast_abs] + _ < ε := hpow.trans hδε + +@[simp] +private theorem ostrowski_ratCauSeqMapWithAbs_zero_of_real_rpow + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) + (s : ℝ) (hs : 0 < s) + (hnorm : ∀ q : ℚ, + ostrowski_restrictRatAbsoluteValue (K := K) v q = + Rat.AbsoluteValue.real q ^ s) : + ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm (0 : CauSeq ℚ (abs : ℚ → ℚ)) = 0 := by + ext n + simp [ostrowski_ratCauSeqMapWithAbs_of_real_rpow] + +@[simp] +private theorem ostrowski_ratCauSeqMapWithAbs_one_of_real_rpow + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) + (s : ℝ) (hs : 0 < s) + (hnorm : ∀ q : ℚ, + ostrowski_restrictRatAbsoluteValue (K := K) v q = + Rat.AbsoluteValue.real q ^ s) : + ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm (1 : CauSeq ℚ (abs : ℚ → ℚ)) = 1 := by + ext n + simp [ostrowski_ratCauSeqMapWithAbs_of_real_rpow] + +@[simp] +private theorem ostrowski_ratCauSeqMapWithAbs_add_of_real_rpow + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) + (s : ℝ) (hs : 0 < s) + (hnorm : ∀ q : ℚ, + ostrowski_restrictRatAbsoluteValue (K := K) v q = + Rat.AbsoluteValue.real q ^ s) + (u t : CauSeq ℚ (abs : ℚ → ℚ)) : + ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm (u + t) = + ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm u + + ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm t := by + ext n + change Rat.castHom (WithAbs v) (u n + t n) = + Rat.castHom (WithAbs v) (u n) + Rat.castHom (WithAbs v) (t n) + exact (Rat.castHom (WithAbs v)).map_add (u n) (t n) + +@[simp] +private theorem ostrowski_ratCauSeqMapWithAbs_mul_of_real_rpow + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) + (s : ℝ) (hs : 0 < s) + (hnorm : ∀ q : ℚ, + ostrowski_restrictRatAbsoluteValue (K := K) v q = + Rat.AbsoluteValue.real q ^ s) + (u t : CauSeq ℚ (abs : ℚ → ℚ)) : + ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm (u * t) = + ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm u * + ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm t := by + ext n + change Rat.castHom (WithAbs v) (u n * t n) = + Rat.castHom (WithAbs v) (u n) * Rat.castHom (WithAbs v) (t n) + exact (Rat.castHom (WithAbs v)).map_mul (u n) (t n) + +private theorem ostrowski_ratCauSeqMapWithAbs_equiv_of_real_rpow + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) + (s : ℝ) (hs : 0 < s) + (hnorm : ∀ q : ℚ, + ostrowski_restrictRatAbsoluteValue (K := K) v q = + Rat.AbsoluteValue.real q ^ s) + {u t : CauSeq ℚ (abs : ℚ → ℚ)} (hut : u ≈ t) : + ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm u ≈ + ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm t := by + intro ε hε + obtain ⟨δ, hδ0, hδε⟩ := ostrowski_exists_rat_pos_rpow_lt hs hε + obtain ⟨N, hN⟩ := hut δ hδ0 + refine ⟨N, fun j hj => ?_⟩ + have hsource : abs ((u - t) j) < δ := hN j hj + have hsource_real : ((abs ((u - t) j) : ℚ) : ℝ) < (δ : ℝ) := by + exact_mod_cast hsource + have hpow : + ((abs ((u - t) j) : ℚ) : ℝ) ^ s < (δ : ℝ) ^ s := + Real.rpow_lt_rpow (by positivity) hsource_real hs + calc + ‖((ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm u - + ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm t) j)‖ + = ‖Rat.castHom (WithAbs v) ((u - t) j)‖ := by + change ‖Rat.castHom (WithAbs v) (u j) - Rat.castHom (WithAbs v) (t j)‖ = + ‖Rat.castHom (WithAbs v) (u j - t j)‖ + exact (congrArg (fun z : WithAbs v => ‖z‖) + ((Rat.castHom (WithAbs v)).map_sub (u j) (t j))).symm + _ = ‖(((u - t) j : ℚ) : ℝ)‖ ^ s := + ostrowski_ratCast_withAbs_norm_eq_of_real_rpow + (K := K) v s hnorm ((u - t) j) + _ = ((abs ((u - t) j) : ℚ) : ℝ) ^ s := by + rw [Real.norm_eq_abs, Rat.cast_abs] + _ < ε := hpow.trans hδε + +/-- Completeness expressed through rational Cauchy sequences. -/ +private theorem ostrowski_cauSeq_isComplete_withAbs_of_complete + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hcomplete : CompleteSpace (WithAbs v)) : + CauSeq.IsComplete (WithAbs v) (norm : WithAbs v → ℝ) := by + let : CompleteSpace (WithAbs v) := + hcomplete + refine ⟨fun s => ?_⟩ + obtain ⟨a, ha⟩ := cauchySeq_tendsto_of_complete (CauSeq.cauchySeq s) + refine ⟨a, ?_⟩ + rw [Metric.tendsto_atTop] at ha + intro ε hε + obtain ⟨N, hN⟩ := ha ε hε + refine ⟨N, fun j hj => ?_⟩ + simpa [dist_eq_norm] using hN j hj + +/-- Cauchy-completion form of the normalized closure-of-`ℚ` map. This is the +same mathematical bridge as `ostrowski_ratCompletionEmbedding_of_normalized`, +but it uses the Cauchy model that underlies mathlib's `ℝ`. -/ +private theorem ostrowski_real_mk_tendsto_ratCauSeq + (s : CauSeq ℚ (abs : ℚ → ℚ)) : + Tendsto (fun n => (s n : ℝ)) atTop (nhds (Real.mk s)) := by + rw [Metric.tendsto_atTop] + intro ε hε + obtain ⟨δ, hδ0, hδε⟩ := exists_rat_btwn hε + have hδq : (0 : ℚ) < δ := by exact_mod_cast hδ0 + obtain ⟨N, hN⟩ := s.cauchy₂ hδq + refine ⟨N, fun n hn => ?_⟩ + rw [Real.dist_eq, abs_sub_comm] + have hnear : + |Real.mk s - (s n : ℝ)| ≤ (δ : ℝ) := + Real.mk_near_of_forall_near + (f := s) (x := (s n : ℝ)) (ε := (δ : ℝ)) + ⟨N, fun j hj => ?_⟩ + · exact hnear.trans_lt hδε + · have hsource : abs (s j - s n) < δ := hN j hj n hn + have hsource_real : ((abs (s j - s n) : ℚ) : ℝ) < (δ : ℝ) := by + exact_mod_cast hsource + rw [← Rat.cast_sub, ← Rat.cast_abs] + exact hsource_real.le + +/-- Cauchy-completion form of the non-normalized closure-of-`ℚ` map when the +restriction to `ℚ` is `|·|^s`. -/ +private noncomputable def ostrowski_ratCauSeqCompletionEmbedding_of_real_rpow + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) + (hcomplete : CompleteSpace (WithAbs v)) + (s : ℝ) (hs : 0 < s) + (hnorm : ∀ q : ℚ, + ostrowski_restrictRatAbsoluteValue (K := K) v q = + Rat.AbsoluteValue.real q ^ s) : + CauSeq.Completion.Cauchy (abs : ℚ → ℚ) →+* WithAbs v := by + letI : CauSeq.IsComplete (WithAbs v) (norm : WithAbs v → ℝ) := + ostrowski_cauSeq_isComplete_withAbs_of_complete v hcomplete + exact + { toFun := fun x => + Quotient.liftOn x + (fun u => + CauSeq.lim + (ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm u)) + (fun u t hut => + CauSeq.lim_eq_lim_of_equiv + (ostrowski_ratCauSeqMapWithAbs_equiv_of_real_rpow + (K := K) v s hs hnorm hut)) + map_zero' := by + change CauSeq.lim + (ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm (0 : CauSeq ℚ (abs : ℚ → ℚ))) = 0 + rw [ostrowski_ratCauSeqMapWithAbs_zero_of_real_rpow] + change CauSeq.lim (CauSeq.const (norm : WithAbs v → ℝ) 0) = 0 + rw [CauSeq.lim_const] + map_one' := by + change CauSeq.lim + (ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm (1 : CauSeq ℚ (abs : ℚ → ℚ))) = 1 + rw [ostrowski_ratCauSeqMapWithAbs_one_of_real_rpow] + change CauSeq.lim (CauSeq.const (norm : WithAbs v → ℝ) 1) = 1 + rw [CauSeq.lim_const] + map_add' := by + intro x y + refine Quotient.inductionOn₂ x y ?_ + intro u t + change CauSeq.lim + (ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm (u + t)) = + CauSeq.lim + (ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm u) + + CauSeq.lim + (ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm t) + rw [ostrowski_ratCauSeqMapWithAbs_add_of_real_rpow, + ← CauSeq.lim_add] + map_mul' := by + intro x y + refine Quotient.inductionOn₂ x y ?_ + intro u t + change CauSeq.lim + (ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm (u * t)) = + CauSeq.lim + (ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm u) * + CauSeq.lim + (ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm t) + rw [ostrowski_ratCauSeqMapWithAbs_mul_of_real_rpow, + ← CauSeq.lim_mul_lim] } + +/-- The non-normalized closure-of-`ℚ` map transported to the Cauchy model of +the real numbers. -/ +private noncomputable def ostrowski_realEmbedding_of_real_rpow + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) + (hcomplete : CompleteSpace (WithAbs v)) + (s : ℝ) (hs : 0 < s) + (hnorm : ∀ q : ℚ, + ostrowski_restrictRatAbsoluteValue (K := K) v q = + Rat.AbsoluteValue.real q ^ s) : + ℝ →+* WithAbs v := + (ostrowski_ratCauSeqCompletionEmbedding_of_real_rpow + (K := K) v hcomplete s hs hnorm).comp Real.ringEquivCauchy.toRingHom + +@[simp] +private theorem ostrowski_ratCauSeqCompletionEmbedding_norm_mk_of_real_rpow + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) + (hcomplete : CompleteSpace (WithAbs v)) + (s : ℝ) (hs : 0 < s) + (hnorm : ∀ q : ℚ, + ostrowski_restrictRatAbsoluteValue (K := K) v q = + Rat.AbsoluteValue.real q ^ s) + (u : CauSeq ℚ (abs : ℚ → ℚ)) : + ‖ostrowski_ratCauSeqCompletionEmbedding_of_real_rpow + (K := K) v hcomplete s hs hnorm (CauSeq.Completion.mk u)‖ = + ‖Real.mk u‖ ^ s := by + let : CauSeq.IsComplete (WithAbs v) (norm : WithAbs v → ℝ) := + ostrowski_cauSeq_isComplete_withAbs_of_complete v hcomplete + change ‖CauSeq.lim + (ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm u)‖ = ‖Real.mk u‖ ^ s + have hK : + Tendsto + (fun n => + ‖ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm u n‖) + atTop + (nhds ‖CauSeq.lim + (ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm u)‖) := + tendsto_norm.comp + (CauSeq.tendsto_limit + (ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm u)) + have hK' : + Tendsto (fun n => ‖(u n : ℝ)‖ ^ s) atTop + (nhds ‖CauSeq.lim + (ostrowski_ratCauSeqMapWithAbs_of_real_rpow + (K := K) v s hs hnorm u)‖) := by + convert hK using 1 + ext n + change ‖(u n : ℝ)‖ ^ s = ‖Rat.castHom (WithAbs v) (u n)‖ + exact (ostrowski_ratCast_withAbs_norm_eq_of_real_rpow + (K := K) v s hnorm (u n)).symm + have hRnorm : + Tendsto (fun n => ‖(u n : ℝ)‖) atTop (nhds ‖Real.mk u‖) := + tendsto_norm.comp (ostrowski_real_mk_tendsto_ratCauSeq u) + have hR : + Tendsto (fun n => ‖(u n : ℝ)‖ ^ s) atTop (nhds (‖Real.mk u‖ ^ s)) := + hRnorm.rpow_const (Or.inr hs.le) + exact tendsto_nhds_unique hK' hR + +private theorem ostrowski_realEmbedding_norm_eq_of_real_rpow + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) + (hcomplete : CompleteSpace (WithAbs v)) + (s : ℝ) (hs : 0 < s) + (hnorm : ∀ q : ℚ, + ostrowski_restrictRatAbsoluteValue (K := K) v q = + Rat.AbsoluteValue.real q ^ s) + (r : ℝ) : + ‖ostrowski_realEmbedding_of_real_rpow + (K := K) v hcomplete s hs hnorm r‖ = ‖r‖ ^ s := by + induction r using Real.ind_mk with + | h u => + change ‖ostrowski_ratCauSeqCompletionEmbedding_of_real_rpow + (K := K) v hcomplete s hs hnorm (CauSeq.Completion.mk u)‖ = + ‖Real.mk u‖ ^ s + exact ostrowski_ratCauSeqCompletionEmbedding_norm_mk_of_real_rpow + (K := K) v hcomplete s hs hnorm u + +/-- Algebra package for the embedded copy of `ℝ` obtained from the +non-normalized completion-of-`ℚ` construction. Its scalar norm is +`‖algebraMap r‖ = ‖r‖^s`, not the usual `NormedAlgebra` scalar norm when +`s < 1`. -/ +@[reducible] +private noncomputable def ostrowski_realAlgebra_of_real_rpow + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) + (hcomplete : CompleteSpace (WithAbs v)) + (s : ℝ) (hs : 0 < s) + (hnorm : ∀ q : ℚ, + ostrowski_restrictRatAbsoluteValue (K := K) v q = + Rat.AbsoluteValue.real q ^ s) : + Algebra ℝ (WithAbs v) := + (ostrowski_realEmbedding_of_real_rpow + (K := K) v hcomplete s hs hnorm).toAlgebra + +private theorem ostrowski_realAlgebra_norm_algebraMap_of_real_rpow + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) + (hcomplete : CompleteSpace (WithAbs v)) + (s : ℝ) (hs : 0 < s) + (hnorm : ∀ q : ℚ, + ostrowski_restrictRatAbsoluteValue (K := K) v q = + Rat.AbsoluteValue.real q ^ s) : + letI : Algebra ℝ (WithAbs v) := + ostrowski_realAlgebra_of_real_rpow (K := K) v hcomplete s hs hnorm + ∀ r : ℝ, ‖algebraMap ℝ (WithAbs v) r‖ = ‖r‖ ^ s := by + let : Algebra ℝ (WithAbs v) := + ostrowski_realAlgebra_of_real_rpow (K := K) v hcomplete s hs hnorm + intro r + change ‖ostrowski_realEmbedding_of_real_rpow + (K := K) v hcomplete s hs hnorm r‖ = ‖r‖ ^ s + exact ostrowski_realEmbedding_norm_eq_of_real_rpow + (K := K) v hcomplete s hs hnorm r + +section RealRpowGelfandMazur + +open Polynomial +open Bornology Filter Set Topology + +variable {F : Type*} [NormedField F] [Algebra ℝ F] + +/-- If the scalar embedding has norm `‖r‖^s` with `s > 0`, it is continuous. +This replaces the usual `NormedAlgebra` continuity in the non-normalized +Ostrowski step. -/ +private theorem ostrowski_continuous_algebraMap_of_real_rpow + {s : ℝ} (hs : 0 < s) + (hnorm : ∀ r : ℝ, ‖algebraMap ℝ F r‖ = ‖r‖ ^ s) : + Continuous (algebraMap ℝ F) := by + rw [Metric.continuous_iff] + intro r ε hε + obtain ⟨δ, hδ0, hδε⟩ := ostrowski_exists_rat_pos_rpow_lt hs hε + refine ⟨(δ : ℝ), by exact_mod_cast hδ0, fun y hy => ?_⟩ + have hdist : ‖y - r‖ < (δ : ℝ) := by + simpa [Real.dist_eq, dist_eq_norm] using hy + have hpow : ‖y - r‖ ^ s < (δ : ℝ) ^ s := + Real.rpow_lt_rpow (norm_nonneg _) hdist hs + calc + dist (algebraMap ℝ F y) (algebraMap ℝ F r) + = ‖algebraMap ℝ F (y - r)‖ := by + rw [dist_eq_norm, map_sub] + _ = ‖y - r‖ ^ s := hnorm (y - r) + _ < ε := hpow.trans hδε + +private theorem ostrowski_tendsto_norm_rpow_cobounded_atTop + {s : ℝ} (hs : 0 < s) : + Tendsto (fun r : ℝ => ‖r‖ ^ s) (cobounded ℝ) atTop := + (tendsto_rpow_atTop hs).comp tendsto_norm_cobounded_atTop + +private theorem ostrowski_tendsto_norm_rpow_fst_atTop + {s : ℝ} (hs : 0 < s) : + Tendsto (fun y : ℝ × ℝ => ‖y.1‖ ^ s) (cobounded ℝ ×ˢ ⊤) atTop := + (tendsto_rpow_atTop hs).comp + (by + rw [tendsto_norm_atTop_iff_cobounded] + exact tendsto_fst) + +private theorem ostrowski_tendsto_norm_rpow_snd_atTop + {s : ℝ} (hs : 0 < s) (S : Set ℝ) : + Tendsto (fun y : ℝ × ℝ => ‖y.2‖ ^ s) (𝓟 S ×ˢ cobounded ℝ) atTop := + (tendsto_rpow_atTop hs).comp + (by + rw [tendsto_norm_atTop_iff_cobounded] + exact tendsto_snd) + +/-- The quadratic test function from the real Gelfand-Mazur proof, written +without assuming a usual `NormedAlgebra ℝ F` structure. -/ +private abbrev ostrowski_realRpowPhi (x : F) (u : ℝ × ℝ) : F := + x ^ 2 - algebraMap ℝ F u.1 * x + algebraMap ℝ F u.2 + +private theorem ostrowski_continuous_realRpowPhi + {s : ℝ} (hs : 0 < s) + (hnorm : ∀ r : ℝ, ‖algebraMap ℝ F r‖ = ‖r‖ ^ s) + (x : F) : + Continuous (ostrowski_realRpowPhi (F := F) x) := by + have hcont_alg : Continuous (algebraMap ℝ F) := + ostrowski_continuous_algebraMap_of_real_rpow + (F := F) hs hnorm + exact ((continuous_const.pow 2).sub + ((hcont_alg.comp continuous_fst).mul continuous_const)).add + (hcont_alg.comp continuous_snd) + +private theorem ostrowski_aeval_eq_realRpowPhi + (x : F) (u : ℝ × ℝ) : + aeval x (X ^ 2 - C u.1 * X + C u.2) = + ostrowski_realRpowPhi (F := F) x u := by + simp [ostrowski_realRpowPhi] + +/-- The connectedness estimate used in the real Gelfand-Mazur argument. -/ +private theorem ostrowski_norm_eq_of_isMinOn_of_forall_le + {X E : Type*} [TopologicalSpace X] [PreconnectedSpace X] + [SeminormedAddCommGroup E] {f : X → E} {M : ℝ} {x : X} + (hM : 0 < M) (hx : ‖f x‖ = M) (h : IsMinOn (‖f ·‖) univ x) + (hf : Continuous f) + (H : ∀ {y} z, ‖f y‖ = M → + ∀ n > 0, ‖f z‖ ≤ M * (1 + (‖f z - f y‖ / M) ^ n)) + (y : X) : + ‖f y‖ = M := by + suffices {y | ‖f y‖ = M} = univ by + simpa only [← this, hx] using! mem_univ y + refine IsClopen.eq_univ ⟨isClosed_eq (by fun_prop) (by fun_prop), ?_⟩ + (nonempty_of_mem hx) + rw [isOpen_iff_eventually] + intro w hw + filter_upwards [mem_map.mp <| hf.tendsto w (Metric.ball_mem_nhds (f w) hM)] with u hu + simp only [mem_preimage, Metric.mem_ball, dist_eq_norm, ← div_lt_one₀ hM] at hu + refine le_antisymm ?_ (hx ▸ isMinOn_univ_iff.mp h u) + suffices Tendsto + (fun n : ℕ => M * (1 + (‖f u - f w‖ / M) ^ n)) + atTop (𝓝 (M * (1 + 0))) by + refine ge_of_tendsto (by simpa) ?_ + filter_upwards [Ioi_mem_atTop 0] with n hn + exact H u hw n hn + exact tendsto_pow_atTop_nhds_zero_of_lt_one (by positivity) hu + |>.const_add 1 |>.const_mul M + +/-- A lower bound for values of even-degree monic polynomials at `x`, assuming +the quadratic test function has lower bound `M`. -/ +private theorem ostrowski_le_aeval_of_isMonicOfDegree_real_rpow + {x : F} {M : ℝ} (hM : 0 ≤ M) + (h : ∀ z : ℝ × ℝ, M ≤ ‖ostrowski_realRpowPhi (F := F) x z‖) + {p : ℝ[X]} {n : ℕ} (hp : IsMonicOfDegree p (2 * n)) : + M ^ n ≤ ‖aeval x p‖ := by + induction n generalizing p with + | zero => simp_all + | succ n ih => + rw [mul_add, mul_one] at hp + obtain ⟨f₁, f₂, hf₁, hf₂, H⟩ := + hp.eq_isMonicOfDegree_two_mul_isMonicOfDegree + obtain ⟨a, b, hab⟩ := isMonicOfDegree_two_iff'.mp hf₁ + rw [H, aeval_mul, norm_mul, mul_comm, pow_succ, hab, + ostrowski_aeval_eq_realRpowPhi (F := F) x (a, b)] + exact mul_le_mul (ih hf₂) (h (a, b)) hM (norm_nonneg _) + +/-- If the quadratic test function has a positive minimum, then its norm is +constant. This is the algebraic part of the real Gelfand-Mazur proof and does +not need the usual `NormedAlgebra` inequality. -/ +private theorem ostrowski_norm_realRpowPhi_eq_of_isMinOn + {s : ℝ} (hs : 0 < s) + (hnorm : ∀ r : ℝ, ‖algebraMap ℝ F r‖ = ‖r‖ ^ s) + {x : F} {z : ℝ × ℝ} + (h : IsMinOn (‖ostrowski_realRpowPhi (F := F) x ·‖) univ z) + (H : ‖ostrowski_realRpowPhi (F := F) x z‖ ≠ 0) + (w : ℝ × ℝ) : + ‖ostrowski_realRpowPhi (F := F) x w‖ = + ‖ostrowski_realRpowPhi (F := F) x z‖ := by + set M : ℝ := ‖ostrowski_realRpowPhi (F := F) x z‖ with hM + have hM₀ : 0 < M := by positivity + refine ostrowski_norm_eq_of_isMinOn_of_forall_le + hM₀ hM.symm h + (ostrowski_continuous_realRpowPhi (F := F) hs hnorm x) + (fun {w} u hw n hn => ?_) w + have HH : + M * (1 + (‖ostrowski_realRpowPhi (F := F) x u - + ostrowski_realRpowPhi (F := F) x w‖ / M) ^ n) = + (M ^ n + ‖ostrowski_realRpowPhi (F := F) x u - + ostrowski_realRpowPhi (F := F) x w‖ ^ n) / M ^ (n - 1) := by + simp only [field, div_pow, ← pow_succ', Nat.sub_add_cancel hn] + rw [HH, le_div_iff₀ (by positivity)] + clear HH + let q (y : ℝ × ℝ) : ℝ[X] := X ^ 2 - C y.1 * X + C y.2 + have hq (y : ℝ × ℝ) : IsMonicOfDegree (q y) 2 := + isMonicOfDegree_sub_add_two .. + have hsub : q w - q u = (C u.1 - C w.1) * X + C w.2 - C u.2 := by + simp only [q] + ring + have hdvd : q u ∣ q w ^ n - (q w - q u) ^ n := by + nth_rewrite 1 [← sub_sub_self (q w) (q u)] + exact sub_dvd_pow_sub_pow .. + have H' : ((q w - q u) ^ n).natDegree < 2 * n := by + rw [hsub] + compute_degree + grind + obtain ⟨p, hp, hrel⟩ := + ((hq w).pow n).of_dvd_sub (by grind) (hq u) H' hdvd + clear H' hdvd hsub + rw [show 2 * n - 2 = 2 * (n - 1) by grind] at hp + grw [ostrowski_le_aeval_of_isMonicOfDegree_real_rpow + (F := F) hM₀.le (isMinOn_univ_iff.mp h) hp] + rw [← sub_eq_iff_eq_add, eq_comm, mul_comm] at hrel + apply_fun (‖aeval x ·‖) at hrel + rw [map_mul, norm_mul, map_sub, + ostrowski_aeval_eq_realRpowPhi (F := F) x u] at hrel + rw [hrel, norm_sub_rev (ostrowski_realRpowPhi (F := F) x u)] + exact (norm_sub_le ..).trans <| by + simp [q, ostrowski_aeval_eq_realRpowPhi, hw] + +/-- The one-variable minimization input for the non-normalized real +Gelfand-Mazur proof. -/ +private theorem ostrowski_exists_isMinOn_norm_sub_algebraMap_of_real_rpow + {s : ℝ} (hs : 0 < s) + (hnorm : ∀ r : ℝ, ‖algebraMap ℝ F r‖ = ‖r‖ ^ s) + (x : F) : + ∃ z : ℝ, IsMinOn (fun r : ℝ => ‖x - algebraMap ℝ F r‖) univ z := by + have hcont_alg : Continuous (algebraMap ℝ F) := + ostrowski_continuous_algebraMap_of_real_rpow + (F := F) hs hnorm + have htend : + Tendsto (fun r : ℝ => ‖x - algebraMap ℝ F r‖) + (cobounded ℝ) atTop := by + have hbase : + Tendsto (fun r : ℝ => ‖r‖ ^ s - ‖x‖) + (cobounded ℝ) atTop := + tendsto_atTop_add_const_right _ _ + (ostrowski_tendsto_norm_rpow_cobounded_atTop hs) + refine tendsto_atTop_mono' _ ?_ hbase + filter_upwards with r + calc + ‖r‖ ^ s - ‖x‖ = ‖algebraMap ℝ F r‖ - ‖x‖ := by + rw [hnorm r] + _ ≤ ‖algebraMap ℝ F r - x‖ := norm_sub_norm_le _ _ + _ = ‖x - algebraMap ℝ F r‖ := by rw [norm_sub_rev] + simp only [isMinOn_univ_iff] + refine (show Continuous fun r : ℝ => ‖x - algebraMap ℝ F r‖ from + (continuous_const.sub hcont_alg).norm).exists_forall_le_of_isBounded 0 ?_ + simpa [isBounded_def, compl_ofPred, Ioi] + using htend (Ioi_mem_atTop ‖x - algebraMap ℝ F (0 : ℝ)‖) + +/-- The quadratic test function is cobounded under the scalar norm +`‖algebraMap r‖ = ‖r‖^s`. -/ +private theorem ostrowski_tendsto_realRpowPhi_cobounded + {s : ℝ} (hs : 0 < s) + (hnorm : ∀ r : ℝ, ‖algebraMap ℝ F r‖ = ‖r‖ ^ s) + {x : F} {c : ℝ} (hc₀ : 0 < c) + (hbd : ∀ r : ℝ, c ≤ ‖x - algebraMap ℝ F r‖) : + Tendsto (ostrowski_realRpowPhi (F := F) x ·) + (cobounded (ℝ × ℝ)) (cobounded F) := by + simp_rw [ostrowski_realRpowPhi, sub_add] + refine tendsto_const_sub_cobounded _ |>.comp ?_ + rw [← tendsto_norm_atTop_iff_cobounded] + refine Tendsto.coprod_of_prod_top_right (α := ℝ) (fun S hS => ?_) ?_ + · rw [← isCobounded_def, ← isBounded_compl_iff] at hS + obtain ⟨M, hM_pos, hM⟩ : ∃ M > 0, ∀ y ∈ Sᶜ, ‖y‖ ≤ M := + hS.exists_pos_norm_le + suffices Tendsto + (fun y : ℝ × ℝ => ‖y.2‖ ^ s - M ^ s * ‖x‖) + (𝓟 Sᶜ ×ˢ cobounded ℝ) atTop by + refine tendsto_atTop_mono' _ ?_ this + filter_upwards [prod_mem_prod (mem_principal_self Sᶜ) univ_mem] with y hy + rw [norm_sub_rev] + refine le_trans ?_ (norm_sub_norm_le ..) + have hy₁_le : ‖y.1‖ ≤ M := hM _ (Set.mem_prod.mp hy).1 + have hy₁_pow : ‖y.1‖ ^ s ≤ M ^ s := + Real.rpow_le_rpow (norm_nonneg _) hy₁_le hs.le + calc + ‖algebraMap ℝ F y.2‖ - ‖algebraMap ℝ F y.1 * x‖ + = ‖y.2‖ ^ s - ‖y.1‖ ^ s * ‖x‖ := by + rw [hnorm y.2, norm_mul, hnorm y.1] + _ ≥ ‖y.2‖ ^ s - M ^ s * ‖x‖ := by + gcongr + exact tendsto_atTop_add_const_right _ _ + (ostrowski_tendsto_norm_rpow_snd_atTop hs Sᶜ) + · suffices Tendsto (fun y : ℝ × ℝ => ‖y.1‖ ^ s * c) + (cobounded ℝ ×ˢ ⊤) atTop by + refine tendsto_atTop_mono' _ ?_ this + filter_upwards [prod_mem_prod (isBounded_singleton (x := 0)) univ_mem] with y hy + have hy₁_ne : y.1 ≠ 0 := by + simpa using (Set.mem_prod.mp hy).1 + calc + ‖y.1‖ ^ s * c + ≤ ‖y.1‖ ^ s * ‖x - algebraMap ℝ F (y.1⁻¹ * y.2)‖ := by + gcongr + exact hbd _ + _ = ‖algebraMap ℝ F y.1‖ * + ‖x - algebraMap ℝ F (y.1⁻¹ * y.2)‖ := by + rw [hnorm y.1] + _ = ‖algebraMap ℝ F y.1 * + (x - algebraMap ℝ F (y.1⁻¹ * y.2))‖ := by + rw [norm_mul] + _ = ‖algebraMap ℝ F y.1 * x - algebraMap ℝ F y.2‖ := by + congr 1 + rw [mul_sub, ← map_mul] + have hmul : y.1 * (y.1⁻¹ * y.2) = y.2 := by + field_simp [hy₁_ne] + rw [hmul] + simpa [mul_comm] using + Tendsto.const_mul_atTop hc₀ + (ostrowski_tendsto_norm_rpow_fst_atTop hs) + +/-- The norm of the non-normalized quadratic test function attains a minimum. -/ +private theorem ostrowski_exists_isMinOn_norm_realRpowPhi + {s : ℝ} (hs : 0 < s) + (hnorm : ∀ r : ℝ, ‖algebraMap ℝ F r‖ = ‖r‖ ^ s) + (x : F) : + ∃ z : ℝ × ℝ, + IsMinOn (‖ostrowski_realRpowPhi (F := F) x ·‖) univ z := by + obtain ⟨u, hu⟩ := + ostrowski_exists_isMinOn_norm_sub_algebraMap_of_real_rpow + (F := F) hs hnorm x + rcases eq_or_lt_of_le (norm_nonneg (x - algebraMap ℝ F u)) with hc₀ | hc₀ + · rw [eq_comm, norm_eq_zero, sub_eq_zero] at hc₀ + exact ⟨(u, 0), fun y => by + simp [ostrowski_realRpowPhi, hc₀, sq]⟩ + · simp only [isMinOn_univ_iff] at hu ⊢ + refine (ostrowski_continuous_realRpowPhi (F := F) hs hnorm x).norm + |>.exists_forall_le_of_isBounded (0, 0) ?_ + simpa [isBounded_def, compl_ofPred, Ioi] + using tendsto_norm_cobounded_atTop.comp + (ostrowski_tendsto_realRpowPhi_cobounded + (F := F) hs hnorm hc₀ hu) + (Ioi_mem_atTop ‖ostrowski_realRpowPhi (F := F) x (0, 0)‖) + +/-- Non-normalized real Gelfand-Mazur core: every element is quadratic over the +embedded real line when scalar norms are `‖r‖^s`. -/ +private theorem ostrowski_exists_isMonicOfDegree_two_and_aeval_eq_zero_real_rpow + {s : ℝ} (hs : 0 < s) + (hnorm : ∀ r : ℝ, ‖algebraMap ℝ F r‖ = ‖r‖ ^ s) + (x : F) : + ∃ p : ℝ[X], IsMonicOfDegree p 2 ∧ aeval x p = 0 := by + obtain ⟨z, h⟩ := + ostrowski_exists_isMinOn_norm_realRpowPhi (F := F) hs hnorm x + suffices ostrowski_realRpowPhi (F := F) x z = 0 from + ⟨_, isMonicOfDegree_sub_add_two z.1 z.2, by + rwa [ostrowski_aeval_eq_realRpowPhi]⟩ + by_contra! H + set M := ‖ostrowski_realRpowPhi (F := F) x z‖ + have h' (r : ℝ) : √M ≤ ‖x - algebraMap ℝ F r‖ := by + rw [← sq_le_sq₀ M.sqrt_nonneg (norm_nonneg _), + Real.sq_sqrt (norm_nonneg _), ← norm_pow, + Commute.sub_sq <| (Algebra.commutes r x).symm] + have hcomm : x * algebraMap ℝ F r = algebraMap ℝ F r * x := + (Algebra.commutes r x).symm + convert! isMinOn_univ_iff.mp h (2 * r, r ^ 2) using 4 <;> + simp [two_mul, add_mul, sq, hcomm] + have htend := tendsto_norm_atTop_iff_cobounded.mpr <| + ostrowski_tendsto_realRpowPhi_cobounded + (F := F) hs hnorm (by positivity) h' + simp only [ostrowski_norm_realRpowPhi_eq_of_isMinOn + (F := F) hs hnorm h (norm_ne_zero_iff.mpr H)] at htend + exact Filter.not_tendsto_const_atTop _ _ htend + +/-- Non-normalized real Gelfand-Mazur: scalar norm `‖r‖^s` is enough for the +usual algebraic classification by `ℝ` or `ℂ`. -/ +private theorem ostrowski_gelfandMazur_of_real_rpow_scalar + (F : Type*) [NormedField F] [Algebra ℝ F] + {s : ℝ} (hs : 0 < s) + (hnorm : ∀ r : ℝ, ‖algebraMap ℝ F r‖ = ‖r‖ ^ s) : + Nonempty (F ≃ₐ[ℝ] ℝ) ∨ Nonempty (F ≃ₐ[ℝ] ℂ) := by + have : Algebra.IsAlgebraic ℝ F := by + refine ⟨fun x => ?_⟩ + obtain ⟨p, hp, hpx⟩ := + ostrowski_exists_isMonicOfDegree_two_and_aeval_eq_zero_real_rpow + (F := F) hs hnorm x + exact ⟨p, hp.ne_zero, hpx⟩ + exact _root_.Real.nonempty_algEquiv_or F + +end RealRpowGelfandMazur + +private theorem ostrowski_gelfandMazur_of_real_rpow + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) + (hcomplete : CompleteSpace (WithAbs v)) + (s : ℝ) (hs : 0 < s) + (hnorm : ∀ q : ℚ, + ostrowski_restrictRatAbsoluteValue (K := K) v q = + Rat.AbsoluteValue.real q ^ s) : + letI : Algebra ℝ (WithAbs v) := + ostrowski_realAlgebra_of_real_rpow (K := K) v hcomplete s hs hnorm + Nonempty (WithAbs v ≃ₐ[ℝ] ℝ) ∨ + Nonempty (WithAbs v ≃ₐ[ℝ] ℂ) := by + let : Algebra ℝ (WithAbs v) := + ostrowski_realAlgebra_of_real_rpow (K := K) v hcomplete s hs hnorm + exact ostrowski_gelfandMazur_of_real_rpow_scalar (WithAbs v) hs + (ostrowski_realAlgebra_norm_algebraMap_of_real_rpow + (K := K) v hcomplete s hs hnorm) + +private theorem ostrowski_realAlgEquiv_norm_eq_of_real_rpow + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) + (hcomplete : CompleteSpace (WithAbs v)) + (s : ℝ) (hs : 0 < s) + (hnorm : ∀ q : ℚ, + ostrowski_restrictRatAbsoluteValue (K := K) v q = + Rat.AbsoluteValue.real q ^ s) : + letI : Algebra ℝ (WithAbs v) := + ostrowski_realAlgebra_of_real_rpow (K := K) v hcomplete s hs hnorm + ∀ (e : WithAbs v ≃ₐ[ℝ] ℝ) (x : WithAbs v), + ‖x‖ = ‖e x‖ ^ s := by + let : Algebra ℝ (WithAbs v) := + ostrowski_realAlgebra_of_real_rpow (K := K) v hcomplete s hs hnorm + intro e x + have hx : x = algebraMap ℝ (WithAbs v) (e x) := by + calc + x = e.symm (e x) := by simp + _ = algebraMap ℝ (WithAbs v) (e x) := by + simpa using (AlgEquiv.commutes e.symm (e x)) + rw [hx] + simp only [AlgEquiv.commutes, Algebra.algebraMap_self_apply] + exact ostrowski_realAlgebra_norm_algebraMap_of_real_rpow + (K := K) v hcomplete s hs hnorm (e x) + +private theorem ostrowski_realBranch_abs_eq_of_real_rpow + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) + (hcomplete : CompleteSpace (WithAbs v)) + (s : ℝ) (hs : 0 < s) + (hnorm : ∀ q : ℚ, + ostrowski_restrictRatAbsoluteValue (K := K) v q = + Rat.AbsoluteValue.real q ^ s) : + letI : Algebra ℝ (WithAbs v) := + ostrowski_realAlgebra_of_real_rpow (K := K) v hcomplete s hs hnorm + ∀ (e : WithAbs v ≃ₐ[ℝ] ℝ) (x : K), + v x = ‖e ((WithAbs.equiv v).symm x)‖ ^ s := by + let : Algebra ℝ (WithAbs v) := + ostrowski_realAlgebra_of_real_rpow (K := K) v hcomplete s hs hnorm + intro e x + change ‖((WithAbs.equiv v).symm x : WithAbs v)‖ = + ‖e ((WithAbs.equiv v).symm x)‖ ^ s + exact ostrowski_realAlgEquiv_norm_eq_of_real_rpow + (K := K) v hcomplete s hs hnorm e ((WithAbs.equiv v).symm x) + +end AbsoluteValue + +namespace AlgEquiv + +private theorem norm_symm_I_eq_one + {F : Type*} [NormedField F] [Algebra ℝ F] + (e : F ≃ₐ[ℝ] ℂ) : + ‖e.symm Complex.I‖ = 1 := by + have hsq : (e.symm Complex.I : F) ^ 2 = -1 := by + apply e.injective + simp [Complex.I_sq] + have hsqnorm : ‖e.symm Complex.I‖ ^ 2 = (1 : ℝ) := by + calc + ‖e.symm Complex.I‖ ^ 2 = ‖(e.symm Complex.I : F) ^ 2‖ := by simp + _ = ‖(-1 : F)‖ := by rw [hsq] + _ = 1 := by simp + nlinarith [norm_nonneg (e.symm Complex.I), + sq_nonneg (‖e.symm Complex.I‖ - 1), hsqnorm] + +private theorem norm_symm_le_re_add_im_rpow + {F : Type*} [NormedField F] [Algebra ℝ F] + {s : ℝ} + (hnorm : ∀ r : ℝ, ‖algebraMap ℝ F r‖ = ‖r‖ ^ s) + (e : F ≃ₐ[ℝ] ℂ) (z : ℂ) : + ‖e.symm z‖ ≤ ‖z.re‖ ^ s + ‖z.im‖ ^ s := by + let j : F := e.symm Complex.I + have hj : ‖j‖ = 1 := + norm_symm_I_eq_one e + have hzdecomp : + e.symm z = algebraMap ℝ F z.re + algebraMap ℝ F z.im * j := by + apply e.injective + simp [j, Complex.re_add_im] + calc + ‖e.symm z‖ = + ‖algebraMap ℝ F z.re + algebraMap ℝ F z.im * j‖ := by + rw [hzdecomp] + _ ≤ ‖algebraMap ℝ F z.re‖ + ‖algebraMap ℝ F z.im * j‖ := + norm_add_le _ _ + _ = ‖z.re‖ ^ s + ‖z.im‖ ^ s := by + rw [norm_mul, hnorm z.re, hnorm z.im, hj, mul_one] + +private theorem norm_symm_le_one_of_norm_eq_one + {F : Type*} [NormedField F] [Algebra ℝ F] + {s : ℝ} (hs : 0 < s) + (hnorm : ∀ r : ℝ, ‖algebraMap ℝ F r‖ = ‖r‖ ^ s) + (e : F ≃ₐ[ℝ] ℂ) {z : ℂ} (hz : ‖z‖ = 1) : + ‖e.symm z‖ ≤ 1 := by + by_contra hnot + have hlt : 1 < ‖e.symm z‖ := lt_of_not_ge hnot + obtain ⟨n, hn⟩ := pow_unbounded_of_one_lt (2 : ℝ) hlt + have hbound : ‖e.symm z‖ ^ n ≤ (2 : ℝ) := by + calc + ‖e.symm z‖ ^ n = ‖(e.symm z : F) ^ n‖ := by simp + _ = ‖e.symm (z ^ n)‖ := by + congr 1 + exact (map_pow e.symm z n).symm + _ ≤ ‖(z ^ n).re‖ ^ s + ‖(z ^ n).im‖ ^ s := + norm_symm_le_re_add_im_rpow hnorm e (z ^ n) + _ ≤ 1 + 1 := by + have hzpow : ‖z ^ n‖ = (1 : ℝ) := by + rw [norm_pow, hz, one_pow] + have hre : ‖(z ^ n).re‖ ≤ (1 : ℝ) := by + rw [Real.norm_eq_abs] + exact (Complex.abs_re_le_norm (z ^ n)).trans_eq hzpow + have him : ‖(z ^ n).im‖ ≤ (1 : ℝ) := by + rw [Real.norm_eq_abs] + exact (Complex.abs_im_le_norm (z ^ n)).trans_eq hzpow + have hre_pow : ‖(z ^ n).re‖ ^ s ≤ (1 : ℝ) := + by simpa using + Real.rpow_le_rpow (norm_nonneg _) hre hs.le + have him_pow : ‖(z ^ n).im‖ ^ s ≤ (1 : ℝ) := + by simpa using + Real.rpow_le_rpow (norm_nonneg _) him hs.le + linarith + _ = 2 := by norm_num + exact not_lt_of_ge hbound hn + +private theorem norm_symm_eq_one_of_norm_eq_one + {F : Type*} [NormedField F] [Algebra ℝ F] + {s : ℝ} (hs : 0 < s) + (hnorm : ∀ r : ℝ, ‖algebraMap ℝ F r‖ = ‖r‖ ^ s) + (e : F ≃ₐ[ℝ] ℂ) {z : ℂ} (hz : ‖z‖ = 1) : + ‖e.symm z‖ = 1 := by + have hle : ‖e.symm z‖ ≤ 1 := + norm_symm_le_one_of_norm_eq_one + hs hnorm e hz + have hz0 : z ≠ 0 := by + intro h + simp [h] at hz + have hle_inv : ‖e.symm z⁻¹‖ ≤ 1 := by + exact norm_symm_le_one_of_norm_eq_one + hs hnorm e (by simp [norm_inv, hz]) + have hprod : ‖e.symm z‖ * ‖e.symm z⁻¹‖ = 1 := by + calc + ‖e.symm z‖ * ‖e.symm z⁻¹‖ = + ‖(e.symm z : F) * e.symm z⁻¹‖ := by + rw [norm_mul] + _ = ‖(1 : F)‖ := by + congr 1 + rw [← map_mul] + simp [hz0] + _ = 1 := by simp + have hpos_inv : 0 < ‖e.symm z⁻¹‖ := norm_pos_iff.mpr (by + intro h + apply hz0 + simpa using congrArg e h) + have hge : 1 ≤ ‖e.symm z‖ := by + nlinarith [hprod, hle_inv, hpos_inv] + exact le_antisymm hle hge + +/-- A real-algebra equivalence with ℂ determines the norm from its restriction to ℝ. -/ +theorem norm_symm_apply_eq_norm_rpow + {F : Type*} [NormedField F] [Algebra ℝ F] + {s : ℝ} (hs : 0 < s) + (hnorm : ∀ r : ℝ, ‖algebraMap ℝ F r‖ = ‖r‖ ^ s) + (e : F ≃ₐ[ℝ] ℂ) (z : ℂ) : + ‖e.symm z‖ = ‖z‖ ^ s := by + by_cases hz0 : z = 0 + · simp [hz0, hs.ne'] + · let r : ℝ := ‖z‖ + have hr_pos : 0 < r := by + simpa [r] using norm_pos_iff.mpr hz0 + let u : ℂ := (r⁻¹ : ℂ) * z + have hu_norm : ‖u‖ = 1 := by + simp [u, r, hr_pos.ne'] + have hz_decomp : z = (r : ℂ) * u := by + simp [u, r, hr_pos.ne'] + calc + ‖e.symm z‖ = ‖e.symm ((r : ℂ) * u)‖ := by rw [hz_decomp] + _ = ‖algebraMap ℝ F r * e.symm u‖ := by + congr 1 + rw [map_mul] + congr 1 + exact AlgEquiv.commutes e.symm r + _ = ‖z‖ ^ s := by + rw [norm_mul, hnorm r, + norm_symm_eq_one_of_norm_eq_one + hs hnorm e hu_norm, mul_one] + simp [r] + +end AlgEquiv + +namespace AbsoluteValue + +private theorem ostrowski_complexAlgEquiv_norm_eq_of_real_rpow + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) + (hcomplete : CompleteSpace (WithAbs v)) + (s : ℝ) (hs : 0 < s) + (hnorm : ∀ q : ℚ, + ostrowski_restrictRatAbsoluteValue (K := K) v q = + Rat.AbsoluteValue.real q ^ s) : + letI : Algebra ℝ (WithAbs v) := + ostrowski_realAlgebra_of_real_rpow (K := K) v hcomplete s hs hnorm + ∀ (e : WithAbs v ≃ₐ[ℝ] ℂ) (x : WithAbs v), + ‖x‖ = ‖e x‖ ^ s := by + let : Algebra ℝ (WithAbs v) := + ostrowski_realAlgebra_of_real_rpow (K := K) v hcomplete s hs hnorm + intro e x + calc + ‖x‖ = ‖e.symm (e x)‖ := by simp + _ = ‖e x‖ ^ s := + AlgEquiv.norm_symm_apply_eq_norm_rpow hs + (ostrowski_realAlgebra_norm_algebraMap_of_real_rpow + (K := K) v hcomplete s hs hnorm) e (e x) + +private theorem ostrowski_complexBranch_abs_eq_of_real_rpow + {K : Type*} [Field K] [CharZero K] (v : AbsoluteValue K ℝ) + (hcomplete : CompleteSpace (WithAbs v)) + (s : ℝ) (hs : 0 < s) + (hnorm : ∀ q : ℚ, + ostrowski_restrictRatAbsoluteValue (K := K) v q = + Rat.AbsoluteValue.real q ^ s) : + letI : Algebra ℝ (WithAbs v) := + ostrowski_realAlgebra_of_real_rpow (K := K) v hcomplete s hs hnorm + ∀ (e : WithAbs v ≃ₐ[ℝ] ℂ) (x : K), + v x = ‖e ((WithAbs.equiv v).symm x)‖ ^ s := by + let : Algebra ℝ (WithAbs v) := + ostrowski_realAlgebra_of_real_rpow (K := K) v hcomplete s hs hnorm + intro e x + change ‖((WithAbs.equiv v).symm x : WithAbs v)‖ = + ‖e ((WithAbs.equiv v).symm x)‖ ^ s + exact ostrowski_complexAlgEquiv_norm_eq_of_real_rpow + (K := K) v hcomplete s hs hnorm e ((WithAbs.equiv v).symm x) + +/-- Ostrowski classification for complete archimedean absolute values. +A field complete for an archimedean absolute value is isomorphic to ℝ or +ℂ, and the original absolute value is the standard one transported through +that isomorphism and raised to a fixed exponent `s ∈ (0,1]`. -/ +theorem ostrowski_of_complete + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hcomplete : CompleteSpace (WithAbs v)) + (harch : ¬ IsNonarchimedean (v : K → ℝ)) : + letI : CharZero K := charZero_of_not_isNonarchimedean v harch + ∃ s : ℝ, 0 < s ∧ s ≤ 1 ∧ + ((∃ σ : K ≃+* ℝ, ∀ a : K, v a = ‖σ a‖ ^ s) ∨ + (∃ σ : K ≃+* ℂ, ∀ a : K, v a = ‖σ a‖ ^ s)) := by + let : CharZero K := charZero_of_not_isNonarchimedean v harch + obtain ⟨s, hs, hs_le, hnorm⟩ := + ostrowski_restrictRat_exists_real_rpow_eq_of_not_isNonarchimedean + (K := K) v harch + refine ⟨s, hs, hs_le, ?_⟩ + let : Algebra ℝ (WithAbs v) := + ostrowski_realAlgebra_of_real_rpow (K := K) v hcomplete s hs hnorm + rcases ostrowski_gelfandMazur_of_real_rpow + (K := K) v hcomplete s hs hnorm with hreal | hcomplex + · rcases hreal with ⟨e⟩ + left + let σ : K ≃+* ℝ := (WithAbs.equiv v).symm.trans e.toRingEquiv + refine ⟨σ, fun a => ?_⟩ + change v a = ‖e ((WithAbs.equiv v).symm a)‖ ^ s + exact ostrowski_realBranch_abs_eq_of_real_rpow + (K := K) v hcomplete s hs hnorm e a + · rcases hcomplex with ⟨e⟩ + right + let σ : K ≃+* ℂ := (WithAbs.equiv v).symm.trans e.toRingEquiv + refine ⟨σ, fun a => ?_⟩ + change v a = ‖e ((WithAbs.equiv v).symm a)‖ ^ s + exact ostrowski_complexBranch_abs_eq_of_real_rpow + (K := K) v hcomplete s hs hnorm e a + + + +end AbsoluteValue + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/PrincipalAdicCompleteness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/PrincipalAdicCompleteness.lean new file mode 100644 index 0000000000..f3c401915c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/PrincipalAdicCompleteness.lean @@ -0,0 +1,291 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness +public import Mathlib.RingTheory.AdicCompletion.Basic +/-! +# Principal adic filtrations in complete nonarchimedean valuation rings + +For a complete nonarchimedean absolute value, a nonzero element of the open +unit ball generates a separated and precomplete principal filtration on the +closed unit ball. These facts are shared by the coefficientwise Hensel +construction and the irreducible-polynomial coefficient estimate. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- Membership in the `π`-adic principal power is exactly the corresponding +absolute-value bound on the closed unit ball of a nonarchimedean valued field. -/ +theorem principal_pow_mem_iff_abs_le + {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + {π x : absoluteValueValuationSubring v hnonarch} + (hπne : π ≠ 0) (n : ℕ) : + x ∈ (Ideal.span ({π} : Set + (absoluteValueValuationSubring v hnonarch))) ^ n ↔ + v (x : K) ≤ v ((π : absoluteValueValuationSubring v hnonarch) : K) ^ n := by + let V := absoluteValueValuationSubring v hnonarch + have hπK_ne : ((π : V) : K) ≠ 0 := by + intro hzero + exact hπne (Subtype.ext hzero) + constructor + · intro hx + rw [Ideal.span_singleton_pow, Ideal.mem_span_singleton] at hx + rcases hx with ⟨c, hc⟩ + have hc_abs : v ((c : V) : K) ≤ 1 := + (mem_absoluteValueValuationSubring_iff + v hnonarch ((c : V) : K)).1 c.property + calc + v (x : K) = v ((((π : V) : K) ^ n) * ((c : V) : K)) := by + exact congrArg (fun y : V => v ((y : V) : K)) hc + _ = v (((π : V) : K) ^ n) * v ((c : V) : K) := by rw [v.map_mul] + _ = v ((π : V) : K) ^ n * v ((c : V) : K) := by rw [map_pow] + _ ≤ v ((π : V) : K) ^ n * 1 := + mul_le_mul_of_nonneg_left hc_abs (pow_nonneg (v.nonneg _) n) + _ = v ((π : V) : K) ^ n := by rw [mul_one] + · intro hx + rw [Ideal.span_singleton_pow, Ideal.mem_span_singleton] + let cK : K := (x : K) / (((π : V) : K) ^ n) + have hπpow_pos : 0 < v (((π : V) : K) ^ n) := by + exact v.pos (pow_ne_zero n hπK_ne) + have hcK_mem : cK ∈ V := by + rw [mem_absoluteValueValuationSubring_iff] + have hdiv : + v cK = v (x : K) / v (((π : V) : K) ^ n) := by + change v ((x : K) / (((π : V) : K) ^ n)) = + v (x : K) / v (((π : V) : K) ^ n) + rw [div_eq_mul_inv, v.map_mul, map_inv₀, div_eq_mul_inv] + rw [hdiv] + exact div_le_one_of_le₀ (by simpa [map_pow] using hx) (le_of_lt hπpow_pos) + refine ⟨⟨cK, hcK_mem⟩, ?_⟩ + apply Subtype.ext + change (x : K) = (((π : V) : K) ^ n) * cK + change (x : K) = + (((π : V) : K) ^ n) * ((x : K) / (((π : V) : K) ^ n)) + rw [mul_comm, div_mul_cancel₀] + exact pow_ne_zero n hπK_ne + +/-- Principal congruence modulo `(π)^n` is exactly an absolute-value bound for +the difference. -/ +theorem principal_smodEq_iff_abs_sub_le + {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + {π x y : absoluteValueValuationSubring v hnonarch} + (hπne : π ≠ 0) {n : ℕ} : + x ≡ y [SMOD + ((Ideal.span ({π} : Set + (absoluteValueValuationSubring v hnonarch))) ^ n • + ⊤ : Submodule + (absoluteValueValuationSubring v hnonarch) + (absoluteValueValuationSubring v hnonarch))] ↔ + v ((x : K) - (y : K)) ≤ + v ((π : absoluteValueValuationSubring v hnonarch) : K) ^ n := by + let V := absoluteValueValuationSubring v hnonarch + constructor + · intro hxy + have hmem : (x - y : V) ∈ (Ideal.span ({π} : Set V)) ^ n := by + have h := SModEq.sub_mem.mp hxy + simpa [smul_eq_mul, Ideal.mul_top, V] using h + simpa using + (principal_pow_mem_iff_abs_le + v hnonarch (π := π) (x := x - y) hπne n).1 hmem + · intro hxy + rw [SModEq.sub_mem] + have hmem : (x - y : V) ∈ (Ideal.span ({π} : Set V)) ^ n := by + rw [principal_pow_mem_iff_abs_le + v hnonarch (π := π) (x := x - y) hπne n] + simpa using hxy + simpa [smul_eq_mul, Ideal.mul_top, V] using hmem + +/-- Forward direction of +`principal_smodEq_iff_abs_sub_le`. -/ +theorem abs_sub_le_of_principal_smodEq + {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + {π x y : absoluteValueValuationSubring v hnonarch} + (hπne : π ≠ 0) {n : ℕ} + (hxy : x ≡ y [SMOD + ((Ideal.span ({π} : Set + (absoluteValueValuationSubring v hnonarch))) ^ n • + ⊤ : Submodule + (absoluteValueValuationSubring v hnonarch) + (absoluteValueValuationSubring v hnonarch))]) : + v ((x : K) - (y : K)) ≤ + v ((π : absoluteValueValuationSubring v hnonarch) : K) ^ n := + (principal_smodEq_iff_abs_sub_le + v hnonarch (π := π) (x := x) (y := y) hπne).1 hxy + +/-- Principal separatedness for the element `π` chosen in the proof, as +soon as `π` is a nonzero element of the open unit ball. -/ +theorem principalHausdorff_of_nonzero_mem_maximalIdeal + {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + {π : absoluteValueValuationSubring v hnonarch} + (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal + (absoluteValueValuationSubring v hnonarch)) : + IsHausdorff (Ideal.span ({π} : Set + (absoluteValueValuationSubring v hnonarch))) + (absoluteValueValuationSubring v hnonarch) := by + let V := absoluteValueValuationSubring v hnonarch + refine ⟨?_⟩ + intro x hx + have hπ_abs_lt : v ((π : V) : K) < 1 := + (absoluteValueValuationSubring_mem_maximalIdeal_iff_abs_lt_one + v hnonarch π).1 hπmem + have hπK_ne : ((π : V) : K) ≠ 0 := by + intro hzero + exact hπne (Subtype.ext hzero) + by_contra hxne + have hxK_ne : (x : K) ≠ 0 := by + intro hxzero + exact hxne (Subtype.ext hxzero) + have hx_abs_pos : 0 < v (x : K) := v.pos hxK_ne + rcases exists_pow_lt_of_lt_one hx_abs_pos hπ_abs_lt with ⟨n, hn⟩ + have hxmem : x ∈ (Ideal.span ({π} : Set V)) ^ n := by + have h := (SModEq.zero.mp (hx n)) + simpa [smul_eq_mul, Ideal.mul_top, V] using h + have hx_abs_le := + (principal_pow_mem_iff_abs_le + v hnonarch (π := π) (x := x) hπne n).1 hxmem + exact not_lt_of_ge hx_abs_le hn + +/-- Principal precompleteness for the element `π` chosen in the proof, +deduced from completeness of the valued field. -/ +theorem principalPrecomplete_of_complete + {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) + (hcomplete : IsCompleteForAbsoluteValue v) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + {π : absoluteValueValuationSubring v hnonarch} + (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal + (absoluteValueValuationSubring v hnonarch)) : + IsPrecomplete (Ideal.span ({π} : Set + (absoluteValueValuationSubring v hnonarch))) + (absoluteValueValuationSubring v hnonarch) := by + let V := absoluteValueValuationSubring v hnonarch + let I : Ideal V := Ideal.span ({π} : Set V) + have hπ_abs_lt : v ((π : V) : K) < 1 := + (absoluteValueValuationSubring_mem_maximalIdeal_iff_abs_lt_one + v hnonarch π).1 hπmem + have hπK_ne : ((π : V) : K) ≠ 0 := by + intro hzero + exact hπne (Subtype.ext hzero) + have hπ_abs_pos : 0 < v ((π : V) : K) := v.pos hπK_ne + refine ⟨?_⟩ + intro f hf + let u : ℕ → WithAbs v := fun n => (WithAbs.equiv v).symm ((f n : V) : K) + have hu : CauchySeq u := by + rw [Metric.cauchySeq_iff] + intro ε hε + rcases exists_pow_lt_of_lt_one hε hπ_abs_lt with ⟨N, hN⟩ + refine ⟨N, ?_⟩ + intro m hm n hn + wlog hmn : m ≤ n generalizing m n with H + · have hnm : n ≤ m := le_of_not_ge hmn + simpa [dist_comm] using H n hn m hm hnm + have hsub_le : + v (((f m : V) : K) - ((f n : V) : K)) ≤ + v ((π : V) : K) ^ m := + abs_sub_le_of_principal_smodEq + v hnonarch (π := π) hπne (hf hmn) + have hpow_le : v ((π : V) : K) ^ m ≤ v ((π : V) : K) ^ N := + pow_le_pow_of_le_one (le_of_lt hπ_abs_pos) hπ_abs_lt.le hm + have hdist_le : + dist (u m) (u n) ≤ v ((π : V) : K) ^ N := by + calc + dist (u m) (u n) = + v (((f m : V) : K) - ((f n : V) : K)) := by + simp [u, dist_eq_norm, WithAbs.norm_eq_apply_ofAbs] + _ ≤ v ((π : V) : K) ^ m := hsub_le + _ ≤ v ((π : V) : K) ^ N := hpow_le + exact hdist_le.trans_lt hN + rcases (absoluteValueCompleteness_complete_iff_cauchySeq_converges v).1 + hcomplete u hu with + ⟨a, ha⟩ + let aK : K := WithAbs.equiv v a + have ha_dist_lt_one : ∃ N : ℕ, dist (u N) a < 1 := by + rcases Filter.eventually_atTop.1 + ((Metric.tendsto_nhds.mp ha) 1 zero_lt_one) with + ⟨N, hN⟩ + exact ⟨N, hN N le_rfl⟩ + rcases ha_dist_lt_one with ⟨N₁, hN₁⟩ + have ha_sub_lt_one : + v (aK - ((f N₁ : V) : K)) < 1 := by + have hfa : v (((f N₁ : V) : K) - aK) < 1 := by + simpa [aK, u, dist_eq_norm, WithAbs.norm_eq_apply_ofAbs] using hN₁ + have hneg : aK - ((f N₁ : V) : K) = -(((f N₁ : V) : K) - aK) := by + ring + rw [hneg] + rw [v.map_neg] + simpa using hfa + have ha_mem : aK ∈ V := by + rw [mem_absoluteValueValuationSubring_iff] + have hfN_mem : v (((f N₁ : V) : K)) ≤ 1 := + (mem_absoluteValueValuationSubring_iff + v hnonarch (((f N₁ : V) : K))).1 (f N₁).property + calc + v aK = v (((f N₁ : V) : K) + (aK - ((f N₁ : V) : K))) := by + ring_nf + _ ≤ max (v (((f N₁ : V) : K))) (v (aK - ((f N₁ : V) : K))) := + LubinTate.Valuations.strong_triangle_of_nonarchimedean + v hnonarch (((f N₁ : V) : K)) (aK - ((f N₁ : V) : K)) + _ ≤ 1 := max_le hfN_mem ha_sub_lt_one.le + let L : V := ⟨aK, ha_mem⟩ + refine ⟨L, ?_⟩ + intro n + have hπpow_pos : 0 < v ((π : V) : K) ^ n := + pow_pos hπ_abs_pos n + rcases Filter.eventually_atTop.1 + ((Metric.tendsto_nhds.mp ha) (v ((π : V) : K) ^ n) hπpow_pos) with + ⟨N₀, hN₀⟩ + let N : ℕ := max n N₀ + have hnN : n ≤ N := le_max_left n N₀ + have hN₀N : N₀ ≤ N := le_max_right n N₀ + have hsub_le : + v (((f n : V) : K) - ((f N : V) : K)) ≤ + v ((π : V) : K) ^ n := + abs_sub_le_of_principal_smodEq + v hnonarch (π := π) hπne (hf hnN) + have hN_lim : + v (((f N : V) : K) - aK) ≤ v ((π : V) : K) ^ n := by + have hdist := hN₀ N hN₀N + exact le_of_lt (by + simpa [aK, u, dist_eq_norm, WithAbs.norm_eq_apply_ofAbs] using hdist) + have hdiff_le : + v (((f n : V) : K) - (L : K)) ≤ v ((π : V) : K) ^ n := by + calc + v (((f n : V) : K) - (L : K)) = + v ((((f n : V) : K) - ((f N : V) : K)) + + (((f N : V) : K) - (L : K))) := by + ring_nf + _ ≤ max + (v (((f n : V) : K) - ((f N : V) : K))) + (v (((f N : V) : K) - (L : K))) := + LubinTate.Valuations.strong_triangle_of_nonarchimedean + v hnonarch + (((f n : V) : K) - ((f N : V) : K)) + (((f N : V) : K) - (L : K)) + _ ≤ v ((π : V) : K) ^ n := max_le hsub_le hN_lim + exact + (principal_smodEq_iff_abs_sub_le + v hnonarch (π := π) (x := f n) (y := L) hπne).2 + (by simpa [L] using hdiff_le) + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/SpectralExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/SpectralExtension.lean new file mode 100644 index 0000000000..271ea6435e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/SpectralExtension.lean @@ -0,0 +1,237 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean +public import Mathlib.Analysis.Normed.Unbundled.SpectralNorm +/-! +# Spectral extensions of nonarchimedean absolute values + +The spectral norm gives the unique extension of a complete nonarchimedean +absolute value to an algebraic field extension. +-/ + +@[expose] public section + +noncomputable +section + +namespace AbsoluteValue + +@[reducible] private def spectral_withAbsNontriviallyNormedField + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) (hv : v.IsNontrivial) : + NontriviallyNormedField (WithAbs v) := + NontriviallyNormedField.ofNormNeOne + (by + rcases hv with ⟨x, hx0, hx1⟩ + refine ⟨WithAbs.toAbs v x, ?_, ?_⟩ + · intro hx + apply hx0 + simpa using congrArg (WithAbs.equiv v) hx + · simpa [WithAbs.norm_eq_apply_ofAbs] using hx1) + +/-- Algebraicity is transported across the canonical `WithAbs` base-field +equivalence. -/ +private instance withAbsAlgebra_isAlgebraic + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] (v : AbsoluteValue K ℝ) : + Algebra.IsAlgebraic (WithAbs v) L := by + exact Algebra.IsAlgebraic.tower_top + (K := K) (L := WithAbs v) (A := L) + +/-- The strong triangle inequality on the induced normed-field structure. -/ +private theorem withAbs_isUltrametricDist + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : IsNonarchimedean (v : K → ℝ)) : + IsUltrametricDist (WithAbs v) := by + refine IsUltrametricDist.isUltrametricDist_of_isNonarchimedean_norm ?_ + intro x y + simpa [WithAbs.norm_eq_apply_ofAbs] using + hnonarch (WithAbs.equiv v x) (WithAbs.equiv v y) + +/-- existence branch: the spectral extension restricts to the +given absolute value on the base field. -/ +private theorem spectral_spectralNorm_extends_base + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) (x : K) : + _root_.spectralNorm (WithAbs v) L (algebraMap K L x) = v x := by + let : Algebra.IsAlgebraic (WithAbs v) L := + withAbsAlgebra_isAlgebraic v + simpa [WithAbs.algebraMap_left_apply, WithAbs.norm_eq_apply_ofAbs] using + (_root_.spectralNorm_extends + (K := WithAbs v) (L := L) ((WithAbs.equiv v).symm x)) + +/-- existence branch: the spectral extension satisfies the +strong triangle inequality in the nonarchimedean case. -/ +private theorem spectral_spectralNorm_strong_triangle + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) + (hnonarch : IsNonarchimedean (v : K → ℝ)) (x y : L) : + _root_.spectralNorm (WithAbs v) L (x + y) ≤ + max (_root_.spectralNorm (WithAbs v) L x) + (_root_.spectralNorm (WithAbs v) L y) := by + let : IsUltrametricDist (WithAbs v) := + withAbs_isUltrametricDist v hnonarch + let : Algebra.IsAlgebraic (WithAbs v) L := + withAbsAlgebra_isAlgebraic v + exact _root_.isNonarchimedean_spectralNorm + (K := WithAbs v) (L := L) x y + +/-- existence branch: the spectral extension vanishes exactly +at zero. -/ +private theorem spectral_spectralNorm_eq_zero_iff + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) (x : L) : + _root_.spectralNorm (WithAbs v) L x = 0 ↔ x = 0 := by + let : Algebra.IsAlgebraic (WithAbs v) L := + withAbsAlgebra_isAlgebraic v + constructor + · intro hx + exact _root_.eq_zero_of_map_spectralNorm_eq_zero + (K := WithAbs v) (L := L) hx + (Algebra.IsAlgebraic.isAlgebraic x) + · intro hx + rw [hx] + exact _root_.spectralNorm_zero (K := WithAbs v) (L := L) + +/-- existence branch: multiplicativity of the spectral +extension over an algebraic extension. -/ +private theorem spectral_spectralNorm_mul + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) + (hcomplete : CompleteSpace (WithAbs v)) + (hnonarch : IsNonarchimedean (v : K → ℝ)) + (hv : v.IsNontrivial) (x y : L) : + _root_.spectralNorm (WithAbs v) L (x * y) = + _root_.spectralNorm (WithAbs v) L x * + _root_.spectralNorm (WithAbs v) L y := by + let : NontriviallyNormedField (WithAbs v) := + spectral_withAbsNontriviallyNormedField v hv + let : Algebra (WithAbs v) L := + WithAbs.algebraLeft L v + let : CompleteSpace (WithAbs v) := + hcomplete + let : IsUltrametricDist (WithAbs v) := + withAbs_isUltrametricDist v hnonarch + let : Algebra.IsAlgebraic (WithAbs v) L := + withAbsAlgebra_isAlgebraic v + simpa [_root_.spectralAlgNorm_def] using + (_root_.spectralAlgNorm_mul (K := WithAbs v) (L := L) x y) + +/-- existence branch: the spectral norm, bundled as the unique +nonarchimedean absolute-value extension of the complete base valuation. -/ +noncomputable def spectralExtension + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) + (hcomplete : CompleteSpace (WithAbs v)) + (hnonarch : IsNonarchimedean (v : K → ℝ)) + (hv : v.IsNontrivial) : AbsoluteValue L ℝ where + toFun := _root_.spectralNorm (WithAbs v) L + map_mul' x y := by + exact spectral_spectralNorm_mul (K := K) (L := L) + v hcomplete hnonarch hv x y + nonneg' x := _root_.spectralNorm_nonneg (K := WithAbs v) (L := L) x + eq_zero' x := by + exact spectral_spectralNorm_eq_zero_iff (K := K) (L := L) v x + add_le' x y := by + have hstrong := + spectral_spectralNorm_strong_triangle v hnonarch x y + have hx_nonneg : + 0 ≤ _root_.spectralNorm (WithAbs v) L x := + _root_.spectralNorm_nonneg (K := WithAbs v) (L := L) x + have hy_nonneg : + 0 ≤ _root_.spectralNorm (WithAbs v) L y := + _root_.spectralNorm_nonneg (K := WithAbs v) (L := L) y + exact hstrong.trans + (max_le + (le_add_of_nonneg_right hy_nonneg) + (le_add_of_nonneg_left hx_nonneg)) + +/-- The absolute-value extension constructed is +nonarchimedean. -/ +theorem spectralExtension_isNonarchimedean + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) + (hcomplete : CompleteSpace (WithAbs v)) + (hnonarch : IsNonarchimedean (v : K → ℝ)) + (hv : v.IsNontrivial) : + IsNonarchimedean + (spectralExtension (K := K) (L := L) + v hcomplete hnonarch hv : L → ℝ) := by + intro x y + simpa [spectralExtension] using + spectral_spectralNorm_strong_triangle v hnonarch x y + +/-- The absolute-value extension constructed restricts to +the given base valuation. -/ +theorem spectralExtension_extends + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) + (hcomplete : CompleteSpace (WithAbs v)) + (hnonarch : IsNonarchimedean (v : K → ℝ)) + (hv : v.IsNontrivial) : + Extends v (spectralExtension (K := K) (L := L) + v hcomplete hnonarch hv) := + spectral_spectralNorm_extends_base v + +/-- Pointwise uniqueness of the spectral norm among extending absolute values. -/ +private theorem spectral_unique_spectralNorm + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) + (hcomplete : CompleteSpace (WithAbs v)) + (hnonarch : IsNonarchimedean (v : K → ℝ)) + (hv : v.IsNontrivial) + (w : AbsoluteValue L ℝ) + (hw_ext : Extends v w) + (x : L) : + w x = _root_.spectralNorm (WithAbs v) L x := by + let : NontriviallyNormedField (WithAbs v) := + spectral_withAbsNontriviallyNormedField v hv + let : Algebra (WithAbs v) L := + WithAbs.algebraLeft L v + let : CompleteSpace (WithAbs v) := + hcomplete + let : IsUltrametricDist (WithAbs v) := + withAbs_isUltrametricDist v hnonarch + let : Algebra.IsAlgebraic (WithAbs v) L := + withAbsAlgebra_isAlgebraic v + refine _root_.spectralNorm_unique_field_norm_ext + (K := WithAbs v) (L := L) (f := w) ?_ x + intro a + rw [WithAbs.algebraMap_left_apply, hw_ext] + exact (WithAbs.norm_eq_apply_ofAbs v a).symm + +/-- nonarchimedean complete branch: uniqueness of the +absolute-value extension, stated as equality with the constructed extension. -/ +theorem eq_spectralExtension_of_extends + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) + (hcomplete : CompleteSpace (WithAbs v)) + (hnonarch : IsNonarchimedean (v : K → ℝ)) + (hv : v.IsNontrivial) + (w : AbsoluteValue L ℝ) + (hw_ext : Extends v w) : + w = spectralExtension (K := K) (L := L) + v hcomplete hnonarch hv := by + ext x + exact spectral_unique_spectralNorm + v hcomplete hnonarch hv w hw_ext x + + +end AbsoluteValue + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory.lean new file mode 100644 index 0000000000..3cdc5f6f4f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.AbsoluteValues +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.ExponentialValuations + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/AbsoluteValues.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/AbsoluteValues.lean new file mode 100644 index 0000000000..c6cc9dcbbf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/AbsoluteValues.lean @@ -0,0 +1,778 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Analysis.AbsoluteValue.Equivalence +public import Mathlib.Algebra.Order.Ring.IsNonarchimedean +public import Mathlib.NumberTheory.Ostrowski +public import Mathlib.Topology.UniformSpace.AbsoluteValue +/-! +# Absolute values and exponential valuations + +This module collects the valuation-theory material used by local class field +theory. General results on equivalence of absolute values, Ostrowski theory, +approximation, and rational-function examples are imported from Mathlib where +needed. +-/ + +@[expose] public section + +noncomputable +section + +open Filter +open scoped BigOperators Topology + +namespace LubinTate +namespace Valuations + +/-- The distance attached by the absolute-value construction to an absolute value. -/ +def absoluteValueDist {K : Type*} [Field K] (v : AbsoluteValue K ℝ) (x y : K) : ℝ := + v (x - y) + +/-- The absolute-value distance is nonnegative. -/ +theorem absoluteValueDist_nonneg + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) (x y : K) : + 0 ≤ absoluteValueDist v x y := by + exact v.nonneg (x - y) + +/-- The absolute-value distance separates points. -/ +theorem absoluteValueDist_eq_zero_iff + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) (x y : K) : + absoluteValueDist v x y = 0 ↔ x = y := by + change v (x - y) = 0 ↔ x = y + exact AbsoluteValue.map_sub_eq_zero_iff (abv := v) x y + +/-- The absolute-value distance from a point to itself is zero. -/ +@[simp] +theorem absoluteValueDist_self + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) (x : K) : + absoluteValueDist v x x = 0 := by + simpa using (absoluteValueDist_eq_zero_iff v x x).mpr rfl + +/-- The absolute-value distance is symmetric. -/ +theorem absoluteValueDist_comm + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) (x y : K) : + absoluteValueDist v x y = absoluteValueDist v y x := by + simpa [absoluteValueDist] using (AbsoluteValue.map_sub v x y) + +/-- The absolute-value distance satisfies the triangle inequality. -/ +theorem absoluteValueDist_triangle + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) (x y z : K) : + absoluteValueDist v x z ≤ + absoluteValueDist v x y + absoluteValueDist v y z := by + simpa [absoluteValueDist] using v.sub_le x y z + +/-- The uniformity induced by the absolute-value construction distance is mathlib's uniformity +attached +to the same absolute value. -/ +theorem absoluteValueUniformity_basis + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) : + (@uniformity K v.uniformSpace).HasBasis ((0 : ℝ) < ·) + (fun ε => {p : K × K | absoluteValueDist v p.2 p.1 < ε}) := by + simpa [absoluteValueDist] using + (AbsoluteValue.hasBasis_uniformity (abv := v)) + +/-- The excluded trivial absolute value: all nonzero elements have value `1`. -/ +def TrivialAbsoluteValue {K : Type*} [Field K] (v : AbsoluteValue K ℝ) : Prop := + ∀ x : K, x ≠ 0 → v x = 1 + +/-- Being nontrivial is exactly having some nonzero element whose value is not +`1`. -/ +theorem not_trivialAbsoluteValue_iff_exists_ne_one + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) : + ¬ TrivialAbsoluteValue v ↔ ∃ x : K, x ≠ 0 ∧ v x ≠ 1 := by + classical + constructor + · intro h + by_contra hnone + apply h + intro x hx + by_contra hvx + exact hnone ⟨x, hx, hvx⟩ + · rintro ⟨x, hx, hvx⟩ htriv + exact hvx (htriv x hx) + +/-- excluding the trivial absolute value is mathlib's nontriviality +condition for absolute values. -/ +theorem not_trivialAbsoluteValue_iff_isNontrivial + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) : + ¬ TrivialAbsoluteValue v ↔ v.IsNontrivial := by + exact not_trivialAbsoluteValue_iff_exists_ne_one v + +/-- Definition of valuation, unpacked from mathlib's bundled `AbsoluteValue`. -/ +theorem absoluteValue_axioms + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) : + (∀ x : K, 0 ≤ v x ∧ (v x = 0 ↔ x = 0)) ∧ + (∀ x y : K, v (x * y) = v x * v y) ∧ + ∀ x y : K, v (x + y) ≤ v x + v y := by + exact ⟨fun x => ⟨v.nonneg x, v.eq_zero⟩, v.map_mul, v.add_le⟩ + +/-- Finite triangle inequality for a absolute values. -/ +theorem absoluteValue_finset_sum_le + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + {ι : Type*} (s : Finset ι) (f : ι → K) : + v (s.sum f) ≤ s.sum (fun i => v (f i)) := by + classical + refine Finset.induction_on s ?empty ?insert + · simp + · intro i s his ih + rw [Finset.sum_insert his, Finset.sum_insert his] + exact (v.add_le (f i) (s.sum f)).trans + (by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_left ih (v (f i))) + +/-- The equivalence relation on absolute values: two absolute values are equivalent if they +induce the +same topology. -/ +def EquivalentAbsoluteValues {K : Type*} [Field K] + (v w : AbsoluteValue K ℝ) : Prop := + IsHomeomorph (WithAbs.congr v w (.refl K)) + +/-- absolute-value equivalence is the same as mathlib's equivalence relation on real +absolute values. -/ +theorem equivalentAbsoluteValues_iff_isEquiv + {K : Type*} [Field K] (v w : AbsoluteValue K ℝ) : + EquivalentAbsoluteValues v w ↔ v.IsEquiv w := + (AbsoluteValue.isEquiv_iff_isHomeomorph v w).symm + +/-- Mathlib-equivalent absolute values are equivalent under the defining equivalence relation. -/ +theorem equivalentAbsoluteValues_of_isEquiv + {K : Type*} [Field K] {v w : AbsoluteValue K ℝ} + (h : v.IsEquiv w) : + EquivalentAbsoluteValues v w := + (equivalentAbsoluteValues_iff_isEquiv v w).mpr h + +/-- equivalent absolute values are mathlib-equivalent. -/ +theorem isEquiv_of_equivalentAbsoluteValues + {K : Type*} [Field K] {v w : AbsoluteValue K ℝ} + (h : EquivalentAbsoluteValues v w) : + v.IsEquiv w := + (equivalentAbsoluteValues_iff_isEquiv v w).mp h + +/-- absolute-value equivalence is reflexive. -/ +theorem equivalentAbsoluteValues_refl + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) : + EquivalentAbsoluteValues v v := + equivalentAbsoluteValues_of_isEquiv (AbsoluteValue.IsEquiv.rfl (v := v)) + +/-- absolute-value equivalence is symmetric. -/ +theorem equivalentAbsoluteValues_symm + {K : Type*} [Field K] {v w : AbsoluteValue K ℝ} + (h : EquivalentAbsoluteValues v w) : + EquivalentAbsoluteValues w v := + equivalentAbsoluteValues_of_isEquiv + (isEquiv_of_equivalentAbsoluteValues h).symm + +/-- absolute-value equivalence is transitive. -/ +theorem equivalentAbsoluteValues_trans + {K : Type*} [Field K] {v₁ v₂ v₃ : AbsoluteValue K ℝ} + (h₁₂ : EquivalentAbsoluteValues v₁ v₂) + (h₂₃ : EquivalentAbsoluteValues v₂ v₃) : + EquivalentAbsoluteValues v₁ v₃ := + equivalentAbsoluteValues_of_isEquiv + ((isEquiv_of_equivalentAbsoluteValues h₁₂).trans + (isEquiv_of_equivalentAbsoluteValues h₂₃)) + +/-- The power characterization of equivalent absolute values: two real absolute values are +equivalent exactly when +one is a positive real power of the other. -/ +theorem equivalentAbsoluteValues_iff_exists_rpow_eq + {K : Type*} [Field K] (v w : AbsoluteValue K ℝ) : + EquivalentAbsoluteValues v w ↔ ∃ s : ℝ, 0 < s ∧ (v · ^ s) = w := by + exact + (equivalentAbsoluteValues_iff_isEquiv v w).trans + (AbsoluteValue.isEquiv_iff_exists_rpow_eq (v := v) (w := w)) + +/-- The criterion used in the proof of the power characterization of equivalent absolute values: +equivalence is the +same as preserving the strict unit ball. -/ +theorem equivalentAbsoluteValues_iff_lt_one + {K : Type*} [Field K] (v w : AbsoluteValue K ℝ) : + EquivalentAbsoluteValues v w ↔ ∀ x : K, v x < 1 ↔ w x < 1 := by + exact + (equivalentAbsoluteValues_iff_isEquiv v w).trans + (AbsoluteValue.isEquiv_iff_lt_one_iff (v := v) (w := w)) + +/-- The first construction in the proof of the weak approximation theorem: +for any one valuation in a finite pairwise-inequivalent family, there is an +element large for it and small for all the others. -/ +theorem absoluteValueApproximation_exists_separating_element + {K : Type*} [Field K] {ι : Type*} [Finite ι] + (v : ι → AbsoluteValue K ℝ) + (hnontrivial : ∀ i, ¬ TrivialAbsoluteValue (v i)) + (hinequiv : Pairwise fun i j => ¬ EquivalentAbsoluteValues (v i) (v j)) : + ∀ i, ∃ z : K, 1 < v i z ∧ ∀ j, j ≠ i → v j z < 1 := by + apply AbsoluteValue.exists_one_lt_lt_one_pi_of_not_isEquiv + · intro i + exact (not_trivialAbsoluteValue_iff_isNontrivial (v i)).mp (hnontrivial i) + · intro i j hij hIsEquiv + exact + (hinequiv hij) + ((equivalentAbsoluteValues_iff_isEquiv (v i) (v j)).mpr hIsEquiv) + +/-- The bump-function construction in the proof of the weak approximation theorem: from an +element large at `i` and small at the other valuations, produce +an element close to `1` at `i` and close to `0` at the others. -/ +theorem absoluteValueApproximation_exists_bump_element + {K : Type*} [Field K] {ι : Type*} [Finite ι] + (v : ι → AbsoluteValue K ℝ) {i : ι} {z : K} + (hlarge : 1 < v i z) + (hsmall : ∀ j, j ≠ i → v j z < 1) + {ε : ℝ} (hε : 0 < ε) : + ∃ e : K, v i (e - 1) < ε ∧ ∀ j, j ≠ i → v j e < ε := by + classical + let a : K := z⁻¹ + have hz_ne_zero : z ≠ 0 := by + intro hz + rw [hz, map_zero] at hlarge + norm_num at hlarge + have hi_a_lt_one : v i a < 1 := by + dsimp [a] + rw [map_inv₀] + exact inv_lt_one_of_one_lt₀ hlarge + have hi_tendsto_element : + Tendsto + (fun n : ℕ => ((WithAbs.equiv (v i)).symm (1 / (1 + a ^ n)) : + WithAbs (v i))) + atTop (𝓝 1) := + WithAbs.tendsto_one_div_one_add_pow_nhds_one (v := v i) hi_a_lt_one + have hi_tendsto : + Tendsto (fun n : ℕ => v i (1 / (1 + a ^ n) - 1)) atTop (𝓝 0) := by + have hnorm := tendsto_iff_norm_sub_tendsto_zero.mp hi_tendsto_element + simpa [WithAbs.norm_eq_apply_ofAbs] using hnorm + have hi_eventually : + ∀ᶠ n : ℕ in atTop, v i (1 / (1 + a ^ n) - 1) < ε := + hi_tendsto.eventually (Iio_mem_nhds hε) + have hothers_eventually : + ∀ᶠ n : ℕ in atTop, ∀ j, j ≠ i → v j (1 / (1 + a ^ n)) < ε := by + rw [Filter.eventually_all] + intro j + by_cases hji : j = i + · exact Eventually.of_forall fun _ hj => (hj hji).elim + · have hj_a_gt_one : 1 < v j a := by + dsimp [a] + rw [map_inv₀] + exact (one_lt_inv₀ ((v j).pos hz_ne_zero)).mpr (hsmall j hji) + exact + ((AbsoluteValue.tendsto_div_one_add_pow_nhds_zero + (v := v j) hj_a_gt_one).eventually (Iio_mem_nhds hε)).mono + fun _ hlt _ => hlt + obtain ⟨N, hN⟩ := + Filter.eventually_atTop.1 (hi_eventually.and hothers_eventually) + refine ⟨1 / (1 + a ^ N), ?_, ?_⟩ + · exact (hN N le_rfl).1 + · intro j hji + exact (hN N le_rfl).2 j hji + +/-- Finite bump family used in the proof of the weak approximation theorem. -/ +theorem absoluteValueApproximation_exists_bump_family + {K : Type*} [Field K] {ι : Type*} [Finite ι] + (v : ι → AbsoluteValue K ℝ) + (hnontrivial : ∀ i, ¬ TrivialAbsoluteValue (v i)) + (hinequiv : Pairwise fun i j => ¬ EquivalentAbsoluteValues (v i) (v j)) + {ε : ℝ} (hε : 0 < ε) : + ∃ e : ι → K, + ∀ i, v i (e i - 1) < ε ∧ ∀ j, j ≠ i → v j (e i) < ε := by + classical + have hsep := + absoluteValueApproximation_exists_separating_element + (v := v) hnontrivial hinequiv + choose z hz using hsep + have hbump : + ∀ i, ∃ e : K, + v i (e - 1) < ε ∧ ∀ j, j ≠ i → v j e < ε := by + intro i + exact absoluteValueApproximation_exists_bump_element + (v := v) (i := i) (z := z i) (hz i).1 (hz i).2 hε + choose e he using hbump + exact ⟨e, he⟩ + +/-- Algebraic decomposition of the final approximation sum in the weak approximation theorem. -/ +theorem absoluteValueApproximation_sum_sub + {K : Type*} [Field K] {ι : Type*} [Fintype ι] [DecidableEq ι] + (a e : ι → K) (i : ι) : + (∑ j, a j * e j) - a i = + ∑ j, if j = i then a j * (e j - 1) else a j * e j := by + classical + have hsingle : (∑ j : ι, if j = i then a j else 0) = a i := by + simp + calc + (∑ j, a j * e j) - a i + = (∑ j, a j * e j) - ∑ j, (if j = i then a j else 0) := by + rw [hsingle] + _ = ∑ j, (a j * e j - if j = i then a j else 0) := by + rw [Finset.sum_sub_distrib] + _ = ∑ j, if j = i then a j * (e j - 1) else a j * e j := by + refine Finset.sum_congr rfl ?_ + intro j _ + by_cases hji : j = i + · simp [hji, mul_sub] + · simp [hji] + +/-- The finite-sum estimate in the weak approximation theorem, after the bump +functions have been chosen with errors already weighted by the coefficients. -/ +theorem absoluteValueApproximation_from_weighted_bump_family + {K : Type*} [Field K] {ι : Type*} [Fintype ι] + (v : ι → AbsoluteValue K ℝ) (a e : ι → K) {ε δ : ℝ} + (hεδ : (Fintype.card ι : ℝ) * δ < ε) + (hdiag : ∀ i, v i (a i) * v i (e i - 1) < δ) + (hoff : ∀ i j, j ≠ i → v i (a j) * v i (e j) < δ) : + ∃ x : K, ∀ i, v i (x - a i) < ε := by + classical + let x : K := ∑ j, a j * e j + refine ⟨x, ?_⟩ + intro i + have hsum_le : + v i (∑ j, if j = i then a j * (e j - 1) else a j * e j) ≤ + ∑ j, v i (if j = i then a j * (e j - 1) else a j * e j) := by + simpa using + absoluteValue_finset_sum_le (v i) Finset.univ + (fun j => if j = i then a j * (e j - 1) else a j * e j) + have hterms_le : + (∑ j, v i (if j = i then a j * (e j - 1) else a j * e j)) ≤ + ∑ _j : ι, δ := by + refine Finset.sum_le_sum ?_ + intro j _ + by_cases hji : j = i + · subst j + rw [ite_eq_left rfl, (v i).map_mul] + exact le_of_lt (hdiag i) + · rw [ite_eq_right hji, (v i).map_mul] + exact le_of_lt (hoff i j hji) + have hsum_bound : + (∑ j, v i (if j = i then a j * (e j - 1) else a j * e j)) < ε := by + calc + (∑ j, v i (if j = i then a j * (e j - 1) else a j * e j)) + ≤ ∑ _j : ι, δ := hterms_le + _ = (Fintype.card ι : ℝ) * δ := by + simp [Finset.sum_const, nsmul_eq_mul] + _ < ε := hεδ + calc + v i (x - a i) + = v i ((∑ j, a j * e j) - a i) := by rfl + _ = v i (∑ j, if j = i then a j * (e j - 1) else a j * e j) := by + rw [absoluteValueApproximation_sum_sub a e i] + _ ≤ ∑ j, v i (if j = i then a j * (e j - 1) else a j * e j) := hsum_le + _ < ε := hsum_bound + +/-- A single positive precision small enough after multiplication by all finitely +many coefficients appearing in the weak approximation theorem. -/ +theorem absoluteValueApproximation_exists_coefficient_precision + {K : Type*} [Field K] {ι : Type*} [Finite ι] + (v : ι → AbsoluteValue K ℝ) (a : ι → K) {δ : ℝ} (hδ : 0 < δ) : + ∃ η : ℝ, 0 < η ∧ ∀ i j, v i (a j) * η < δ := by + classical + let := Fintype.ofFinite ι + classical + let C : ℝ := ∑ i : ι, ∑ j : ι, v i (a j) + have hC_nonneg : 0 ≤ C := by + dsimp [C] + exact Finset.sum_nonneg fun i _ => + Finset.sum_nonneg fun j _ => (v i).nonneg (a j) + let η : ℝ := δ / (C + 1) + have hC_add_pos : 0 < C + 1 := by linarith + have hη_pos : 0 < η := by + dsimp [η] + exact div_pos hδ hC_add_pos + have hC_mul_eta_lt : C * η < δ := by + have hC_div_lt_one : C / (C + 1) < 1 := by + exact (div_lt_one hC_add_pos).mpr (by linarith) + calc + C * η = δ * (C / (C + 1)) := by + dsimp [η] + ring + _ < δ * 1 := mul_lt_mul_of_pos_left hC_div_lt_one hδ + _ = δ := by ring + refine ⟨η, hη_pos, ?_⟩ + intro i j + have hcoeff_le_inner : v i (a j) ≤ ∑ k : ι, v i (a k) := + Finset.single_le_sum + (fun k _ => (v i).nonneg (a k)) (Finset.mem_univ j) + have hinner_nonneg : + ∀ k : ι, 0 ≤ ∑ l : ι, v k (a l) := by + intro k + exact Finset.sum_nonneg fun l _ => (v k).nonneg (a l) + have hinner_le_C : (∑ l : ι, v i (a l)) ≤ C := by + dsimp [C] + exact Finset.single_le_sum + (fun k _ => hinner_nonneg k) (Finset.mem_univ i) + have hcoeff_le_C : v i (a j) ≤ C := + hcoeff_le_inner.trans hinner_le_C + exact + lt_of_le_of_lt + (mul_le_mul_of_nonneg_right hcoeff_le_C (le_of_lt hη_pos)) + hC_mul_eta_lt + +/-- The weak approximation theorem, Approximation Theorem for a finite family of pairwise +inequivalent nontrivial absolute values. -/ +theorem absoluteValueApproximation + {K : Type*} [Field K] {ι : Type*} [Finite ι] + (v : ι → AbsoluteValue K ℝ) + (hnontrivial : ∀ i, ¬ TrivialAbsoluteValue (v i)) + (hinequiv : Pairwise fun i j => ¬ EquivalentAbsoluteValues (v i) (v j)) + (a : ι → K) {ε : ℝ} (hε : 0 < ε) : + ∃ x : K, ∀ i, v i (x - a i) < ε := by + classical + let := Fintype.ofFinite ι + classical + let δ : ℝ := ε / ((Fintype.card ι : ℝ) + 1) + have hcard_add_pos : 0 < (Fintype.card ι : ℝ) + 1 := by positivity + have hδ_pos : 0 < δ := by + dsimp [δ] + exact div_pos hε hcard_add_pos + have hεδ : (Fintype.card ι : ℝ) * δ < ε := by + have hcard_div_lt_one : + (Fintype.card ι : ℝ) / ((Fintype.card ι : ℝ) + 1) < 1 := by + exact (div_lt_one hcard_add_pos).mpr (by linarith) + calc + (Fintype.card ι : ℝ) * δ = + ε * ((Fintype.card ι : ℝ) / ((Fintype.card ι : ℝ) + 1)) := by + dsimp [δ] + ring + _ < ε * 1 := mul_lt_mul_of_pos_left hcard_div_lt_one hε + _ = ε := by ring + obtain ⟨η, hη_pos, hη⟩ := + absoluteValueApproximation_exists_coefficient_precision (v := v) (a := a) hδ_pos + obtain ⟨e, he⟩ := + absoluteValueApproximation_exists_bump_family + (v := v) hnontrivial hinequiv (ε := η) hη_pos + exact + absoluteValueApproximation_from_weighted_bump_family + (v := v) (a := a) (e := e) hεδ + (fun i => by + have hmul_le : + v i (a i) * v i (e i - 1) ≤ v i (a i) * η := + mul_le_mul_of_nonneg_left (le_of_lt (he i).1) ((v i).nonneg (a i)) + exact lt_of_le_of_lt hmul_le (hη i i)) + (fun i j hji => by + have hsmall : v i (e j) < η := (he j).2 i (Ne.symm hji) + have hmul_le : + v i (a j) * v i (e j) ≤ v i (a j) * η := + mul_le_mul_of_nonneg_left (le_of_lt hsmall) ((v i).nonneg (a j)) + exact lt_of_le_of_lt hmul_le (hη i j)) + +/-- The archimedean/nonarchimedean dichotomy: a valuation is nonarchimedean when its values on the +natural numbers are bounded. -/ +def NonarchimedeanAbsoluteValue {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) : Prop := + ∃ C : ℝ, ∀ n : ℕ, v (n : K) ≤ C + +/-- The archimedean/nonarchimedean dichotomy: archimedean valuations are those which are not +nonarchimedean in the boundedness-on-integers sense. -/ +def ArchimedeanAbsoluteValue {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) : Prop := + ¬ NonarchimedeanAbsoluteValue v + +/-- The strong triangle inequality appearing in the boundedness characterization of +nonarchimedean absolute values. -/ +def StrongTriangle {K : Type*} [Field K] (v : AbsoluteValue K ℝ) : Prop := + ∀ x y : K, v (x + y) ≤ max (v x) (v y) + +/-- The archimedean/nonarchimedean dichotomy, unfolded. -/ +theorem nonarchimedean_iff_bounded_nat + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) : + NonarchimedeanAbsoluteValue v ↔ ∃ C : ℝ, ∀ n : ℕ, v (n : K) ≤ C := + Iff.rfl + +/-- The archimedean/nonarchimedean dichotomy, archimedean case unfolded. -/ +theorem archimedean_iff_not_nonarchimedean + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) : + ArchimedeanAbsoluteValue v ↔ ¬ NonarchimedeanAbsoluteValue v := + Iff.rfl + +/-- The boundedness characterization of nonarchimedean absolute values, strong triangle +inequality as mathlib's +`IsNonarchimedean` predicate. -/ +theorem strong_triangle_iff_isNonarchimedean + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) : + StrongTriangle v ↔ IsNonarchimedean (v : K → ℝ) := + Iff.rfl + +/-- The easy direction of the boundedness characterization of nonarchimedean absolute values: +the strong triangle inequality +bounds the values of the natural numbers by `1`. -/ +theorem nat_le_one_of_strong_triangle + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hstrong : StrongTriangle v) (n : ℕ) : + v (n : K) ≤ 1 := by + exact ((strong_triangle_iff_isNonarchimedean v).mp hstrong).apply_natCast_le_one + (by simp) (by simp) + +/-- The easy direction of the boundedness characterization of nonarchimedean absolute values: a +valuation satisfying the strong +triangle inequality is nonarchimedean in the boundedness-on-integers sense. -/ +theorem nonarchimedean_of_strong_triangle + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hstrong : StrongTriangle v) : + NonarchimedeanAbsoluteValue v := + ⟨1, nat_le_one_of_strong_triangle v hstrong⟩ + +/-- In the boundedness characterization of nonarchimedean absolute values, any bound for the +values of the natural numbers is at +least `1`. -/ +theorem nat_bound_ge_one + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) {C : ℝ} + (hC : ∀ n : ℕ, v (n : K) ≤ C) : + 1 ≤ C := by + simpa using hC 1 + +/-- The binomial-estimate step in the proof of the boundedness characterization of +nonarchimedean absolute values: boundedness +of the values of natural numbers gives a polynomial factor in the estimate for +`(x + y)^n`. -/ +theorem add_pow_le_of_bounded_nat + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) {C : ℝ} + (hC : ∀ n : ℕ, v (n : K) ≤ C) (x y : K) (n : ℕ) : + v ((x + y) ^ n) ≤ + ((n + 1 : ℕ) : ℝ) * C * (max (v x) (v y)) ^ n := by + classical + let M : ℝ := max (v x) (v y) + have hC_nonneg : 0 ≤ C := + (zero_le_one : (0 : ℝ) ≤ 1).trans + (nat_bound_ge_one v hC) + have hM_nonneg : 0 ≤ M := + (v.nonneg x).trans (le_max_left (v x) (v y)) + have hsum_le : + v ((Finset.range (n + 1)).sum + (fun m => x ^ m * y ^ (n - m) * (n.choose m : K))) ≤ + (Finset.range (n + 1)).sum + (fun m => v (x ^ m * y ^ (n - m) * (n.choose m : K))) := + absoluteValue_finset_sum_le v (Finset.range (n + 1)) + (fun m => x ^ m * y ^ (n - m) * (n.choose m : K)) + have hterm : + ∀ m ∈ Finset.range (n + 1), + v (x ^ m * y ^ (n - m) * (n.choose m : K)) ≤ C * M ^ n := by + intro m hm + have hmle : m ≤ n := Nat.lt_succ_iff.mp (Finset.mem_range.mp hm) + have hxpow : v (x ^ m) ≤ M ^ m := by + rw [map_pow] + exact pow_le_pow_left₀ (v.nonneg x) (le_max_left (v x) (v y)) m + have hypow : v (y ^ (n - m)) ≤ M ^ (n - m) := by + rw [map_pow] + exact pow_le_pow_left₀ (v.nonneg y) (le_max_right (v x) (v y)) (n - m) + have hxy : + v (x ^ m) * v (y ^ (n - m)) ≤ M ^ m * M ^ (n - m) := + mul_le_mul hxpow hypow (v.nonneg (y ^ (n - m))) (pow_nonneg hM_nonneg m) + have hchoose : v ((n.choose m : ℕ) : K) ≤ C := hC (n.choose m) + calc + v (x ^ m * y ^ (n - m) * (n.choose m : K)) + = v (x ^ m) * v (y ^ (n - m)) * v ((n.choose m : ℕ) : K) := by + rw [map_mul, map_mul] + _ ≤ (M ^ m * M ^ (n - m)) * C := by + exact mul_le_mul hxy hchoose + (v.nonneg ((n.choose m : ℕ) : K)) + (mul_nonneg (pow_nonneg hM_nonneg m) + (pow_nonneg hM_nonneg (n - m))) + _ = C * M ^ n := by + rw [← pow_add, Nat.add_sub_of_le hmle] + ring + calc + v ((x + y) ^ n) + = v ((Finset.range (n + 1)).sum + (fun m => x ^ m * y ^ (n - m) * (n.choose m : K))) := by + rw [add_pow] + _ ≤ (Finset.range (n + 1)).sum + (fun m => v (x ^ m * y ^ (n - m) * (n.choose m : K))) := hsum_le + _ ≤ (Finset.range (n + 1)).sum (fun _m => C * M ^ n) := + Finset.sum_le_sum hterm + _ = ((n + 1 : ℕ) : ℝ) * C * M ^ n := by + simp [Finset.sum_const, nsmul_eq_mul, mul_assoc] + +/-- The real-variable limit used at the end of the boundedness characterization of +nonarchimedean absolute values: after taking +`n`-th roots, the polynomial factor `(n+1)C` disappears. -/ +theorem tendsto_linear_bound_rpow_inv + {C : ℝ} (hC : 0 < C) : + Tendsto + (fun n : ℕ => ((((n + 1 : ℕ) : ℝ) * C) ^ ((n : ℝ)⁻¹))) + atTop (𝓝 1) := by + have hCroot : + Tendsto (fun n : ℕ => C ^ ((n : ℝ)⁻¹)) atTop (𝓝 1) := by + have hcont : ContinuousAt (fun t : ℝ => C ^ t) 0 := + Real.continuousAt_const_rpow hC.ne' + have hzero : Tendsto (fun n : ℕ => (n : ℝ)⁻¹) atTop (𝓝 0) := + tendsto_inv_atTop_zero.comp tendsto_natCast_atTop_atTop + change Tendsto + ((fun t : ℝ => C ^ t) ∘ fun n : ℕ => (n : ℝ)⁻¹) atTop (𝓝 1) + simpa only [Real.rpow_zero] using hcont.tendsto.comp hzero + have hshiftReal : + Tendsto (fun x : ℝ => x ^ ((1 : ℝ) / (1 * x + (-1)))) atTop (𝓝 1) := + tendsto_rpow_div_mul_add 1 1 (-1) zero_ne_one + have hshiftNat : + Tendsto (fun n : ℕ => (((n + 1 : ℕ) : ℝ) ^ ((n : ℝ)⁻¹))) + atTop (𝓝 1) := by + have hnatshift : Tendsto (fun n : ℕ => (n : ℝ) + 1) atTop atTop := + tendsto_atTop_add_const_right atTop 1 tendsto_natCast_atTop_atTop + refine (hshiftReal.comp hnatshift).congr' ?_ + exact Eventually.of_forall fun n => by + simp [Nat.cast_add, Nat.cast_one, one_div, add_assoc] + have htarget : + Tendsto + (fun n : ℕ => ((((n + 1 : ℕ) : ℝ) * C) ^ ((n : ℝ)⁻¹))) + atTop (𝓝 (1 * 1)) := by + refine (hshiftNat.mul hCroot).congr' ?_ + exact Eventually.of_forall fun n => by + have hn_nonneg : 0 ≤ ((n + 1 : ℕ) : ℝ) := by positivity + have hmul := + (Real.mul_rpow (z := ((n : ℝ)⁻¹)) hn_nonneg (le_of_lt hC)).symm + simpa [mul_comm, mul_left_comm, mul_assoc] using hmul + simpa using htarget + +/-- The root form of the binomial estimate in the boundedness characterization of nonarchimedean +absolute values. -/ +theorem add_le_root_bound_of_bounded_nat + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) {C : ℝ} + (hC : ∀ n : ℕ, v (n : K) ≤ C) (x y : K) + {n : ℕ} (hn : n ≠ 0) : + v (x + y) ≤ + ((((n + 1 : ℕ) : ℝ) * C) ^ ((n : ℝ)⁻¹)) * + max (v x) (v y) := by + classical + let M : ℝ := max (v x) (v y) + have hC_pos : 0 < C := + zero_lt_one.trans_le (nat_bound_ge_one v hC) + have hM_nonneg : 0 ≤ M := + (v.nonneg x).trans (le_max_left (v x) (v y)) + by_cases hMzero : M = 0 + · have hx_le_zero : v x ≤ 0 := by + simpa [M, hMzero] using (le_max_left (v x) (v y)) + have hy_le_zero : v y ≤ 0 := by + simpa [M, hMzero] using (le_max_right (v x) (v y)) + have hxzero : x = 0 := (v.eq_zero).mp (le_antisymm hx_le_zero (v.nonneg x)) + have hyzero : y = 0 := (v.eq_zero).mp (le_antisymm hy_le_zero (v.nonneg y)) + simp [hxzero, hyzero] + · have hpow : + (v (x + y)) ^ n ≤ ((n + 1 : ℕ) : ℝ) * C * M ^ n := by + simpa [map_pow, M] using + add_pow_le_of_bounded_nat v hC x y n + have hright_nonneg : + 0 ≤ ((n + 1 : ℕ) : ℝ) * C * M ^ n := by + exact mul_nonneg + (mul_nonneg (by positivity) (le_of_lt hC_pos)) + (pow_nonneg hM_nonneg n) + have hn_pos : 0 < (n : ℝ) := Nat.cast_pos.mpr (Nat.pos_of_ne_zero hn) + have hroot : + v (x + y) ≤ + (((n + 1 : ℕ) : ℝ) * C * M ^ n) ^ ((n : ℝ)⁻¹) := by + rw [Real.le_rpow_inv_iff_of_pos (v.nonneg (x + y)) hright_nonneg hn_pos] + simpa [Real.rpow_natCast] using hpow + calc + v (x + y) + ≤ (((n + 1 : ℕ) : ℝ) * C * M ^ n) ^ ((n : ℝ)⁻¹) := hroot + _ = ((((n + 1 : ℕ) : ℝ) * C) ^ ((n : ℝ)⁻¹)) * M := by + have hcoef_nonneg : 0 ≤ ((n + 1 : ℕ) : ℝ) * C := + mul_nonneg (by positivity) (le_of_lt hC_pos) + rw [Real.mul_rpow hcoef_nonneg (pow_nonneg hM_nonneg n)] + rw [Real.pow_rpow_inv_natCast hM_nonneg hn] + _ = ((((n + 1 : ℕ) : ℝ) * C) ^ ((n : ℝ)⁻¹)) * + max (v x) (v y) := by + rfl + +/-- The converse direction of the boundedness characterization of nonarchimedean absolute +values: a bounded-on-integers +valuation satisfies the strong triangle inequality. -/ +theorem strong_triangle_of_nonarchimedean + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : NonarchimedeanAbsoluteValue v) : + StrongTriangle v := by + rcases hnonarch with ⟨C, hC⟩ + have hC_pos : 0 < C := + zero_lt_one.trans_le (nat_bound_ge_one v hC) + intro x y + let M : ℝ := max (v x) (v y) + have hlim : + Tendsto + (fun n : ℕ => + ((((n + 1 : ℕ) : ℝ) * C) ^ ((n : ℝ)⁻¹)) * M) + atTop (𝓝 M) := by + simpa using + (tendsto_linear_bound_rpow_inv hC_pos).mul + (tendsto_const_nhds (x := M)) + have heventually : + ∀ᶠ n : ℕ in atTop, + v (x + y) ≤ + ((((n + 1 : ℕ) : ℝ) * C) ^ ((n : ℝ)⁻¹)) * M := by + refine eventually_atTop.2 ⟨1, ?_⟩ + intro n hn + exact add_le_root_bound_of_bounded_nat + (v := v) hC x y (n := n) (by omega) + have hle : + v (x + y) ≤ M := + le_of_tendsto_of_tendsto tendsto_const_nhds hlim heventually + simpa [M, StrongTriangle] using hle + +/-- The boundedness characterization of nonarchimedean absolute values: the boundedness +definition of nonarchimedean is +equivalent to the strong triangle inequality. -/ +theorem nonarchimedean_iff_strong_triangle + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) : + NonarchimedeanAbsoluteValue v ↔ StrongTriangle v := + ⟨strong_triangle_of_nonarchimedean v, + nonarchimedean_of_strong_triangle v⟩ + +/-- A consequence of the boundedness characterization: unequal values force equality in the +strong triangle inequality. -/ +theorem strong_triangle_eq_max_of_ne + {K : Type*} [Field K] {v : AbsoluteValue K ℝ} + (hstrong : StrongTriangle v) + {x y : K} (hxy : v x ≠ v y) : + v (x + y) = max (v x) (v y) := by + rcases lt_or_gt_of_ne hxy with hlt | hgt + · have hy_le : v y ≤ v (x + y) := by + have hbase : v y ≤ max (v (x + y)) (v x) := by + calc + v y = v ((x + y) + -x) := by ring_nf + _ ≤ max (v (x + y)) (v (-x)) := hstrong (x + y) (-x) + _ = max (v (x + y)) (v x) := by rw [AbsoluteValue.map_neg] + by_contra hnot + exact (not_lt_of_ge hbase) (max_lt (lt_of_not_ge hnot) hlt) + apply le_antisymm + · simpa [max_eq_right (le_of_lt hlt)] using hstrong x y + · simpa [max_eq_right (le_of_lt hlt)] using hy_le + · have hx_le : v x ≤ v (x + y) := by + have hbase : v x ≤ max (v (x + y)) (v y) := by + calc + v x = v ((x + y) + -y) := by ring_nf + _ ≤ max (v (x + y)) (v (-y)) := hstrong (x + y) (-y) + _ = max (v (x + y)) (v y) := by rw [AbsoluteValue.map_neg] + by_contra hnot + exact (not_lt_of_ge hbase) (max_lt (lt_of_not_ge hnot) hgt) + apply le_antisymm + · simpa [max_eq_left (le_of_lt hgt)] using hstrong x y + · simpa [max_eq_left (le_of_lt hgt)] using hx_le + +/-- Ostrowski's classification of absolute values on `ℚ`, stated with the canonical +equivalence relation and with the trivial absolute value excluded. +The classification itself is mathlib's `Rat.AbsoluteValue.equiv_real_or_padic`; +this theorem only translates the equivalence predicate. -/ +theorem rat_equivalent_real_or_padic + (v : AbsoluteValue ℚ ℝ) (hnontrivial : ¬ TrivialAbsoluteValue v) : + EquivalentAbsoluteValues v Rat.AbsoluteValue.real ∨ + ∃! p : ℕ, ∃ (_ : Fact p.Prime), + EquivalentAbsoluteValues v (Rat.AbsoluteValue.padic p) := by + have hv : v.IsNontrivial := + (not_trivialAbsoluteValue_iff_isNontrivial v).mp hnontrivial + rcases Rat.AbsoluteValue.equiv_real_or_padic v hv with hreal | hpadic + · exact .inl (equivalentAbsoluteValues_of_isEquiv hreal) + · refine .inr ?_ + rcases hpadic with ⟨p, hp, hpuniq⟩ + refine ⟨p, ?_, ?_⟩ + · rcases hp with ⟨hpPrime, hpEquiv⟩ + exact + ⟨hpPrime, + equivalentAbsoluteValues_of_isEquiv hpEquiv⟩ + · intro q hq + rcases hq with ⟨hqPrime, hqEquiv⟩ + exact + hpuniq q + ⟨hqPrime, + isEquiv_of_equivalentAbsoluteValues hqEquiv⟩ + +end Valuations +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/Core.lean new file mode 100644 index 0000000000..5637f4b290 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/Core.lean @@ -0,0 +1,854 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.AbsoluteValues +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.ExponentialValuations +/-! Provides the public declarations in the `ValuationTheory.AbsoluteValue.Theory` Lean module. -/ + +@[expose] public section + +noncomputable +section + +open Filter +open scoped BigOperators Topology + +namespace LubinTate +namespace Valuations + +/-- For a normalized exponential valuation, the principal-power ideal `π^n𝒪` attached to +a normalized prime element is the `n`-th power of the positive-value maximal ideal. -/ +theorem uniformizerPowerIdeal_primeElement_eq_exponentialMaxIdeal_pow_of_normalized + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : NormalizedExponentialValuation v) {π : K} + (hπ : PrimeElementFor v π) (n : ℕ) : + uniformizerPowerIdeal (primeElementInValuationSubring v hπ) n = + (exponentialMaxIdeal v) ^ n := by + rw [uniformizerPowerIdeal] + exact (exponentialMaxIdeal_pow_eq_span_primeElement_pow_of_normalized + hv hπ n).symm + +/-- The same identification, expressed using mathlib's maximal ideal of the +valuation ring. -/ +theorem uniformizerPowerIdeal_primeElement_eq_maximalIdeal_pow_of_normalized + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : NormalizedExponentialValuation v) {π : K} + (hπ : PrimeElementFor v π) (n : ℕ) : + uniformizerPowerIdeal (primeElementInValuationSubring v hπ) n = + (IsLocalRing.maximalIdeal (exponentialValuationSubring v)) ^ n := by + rw [← exponentialMaxIdeal_eq_maximalIdeal v] + exact uniformizerPowerIdeal_primeElement_eq_exponentialMaxIdeal_pow_of_normalized + hv hπ n + +/-- The ideal structure theorem for discrete valuation rings, successive-quotient part in +maximal-ideal notation: +`𝒪/𝔭 ≃+ 𝔭^n/𝔭^(n+1)`. This retains the additive structure supplied by the +generic quotient-of-powers theorem instead of weakening it to a bare +bijection. -/ +noncomputable def residueAddEquivMaximalIdealPowQuotient + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : NormalizedExponentialValuation v) {π : K} + (hπ : PrimeElementFor v π) (n : ℕ) : + (exponentialValuationSubring v ⧸ + IsLocalRing.maximalIdeal (exponentialValuationSubring v)) ≃+ + Ideal.map + (Ideal.Quotient.mk + ((IsLocalRing.maximalIdeal (exponentialValuationSubring v)) ^ (n + 1))) + ((IsLocalRing.maximalIdeal (exponentialValuationSubring v)) ^ n) := by + haveI : IsDiscreteValuationRing (exponentialValuationSubring v) := + normalizedExponentialValuationSubring_isDiscreteValuationRing hv hπ + exact + (Ideal.quotEquivPowQuotPowSucc + (IsPrincipalIdealRing.principal + (IsLocalRing.maximalIdeal (exponentialValuationSubring v))) + (IsDiscreteValuationRing.not_a_field (exponentialValuationSubring v)) + n).toAddEquiv.trans + (Ideal.powQuotPowSuccLinearEquivMapMkPowSuccPow + (IsLocalRing.maximalIdeal (exponentialValuationSubring v)) n).toAddEquiv + +/-- The ideal structure theorem for discrete valuation rings, successive-quotient part in the +principal-power notation `π^n𝒪`: `𝒪/(π) ≃+ π^n𝒪/π^(n+1)𝒪`, represented as the image of `π^n𝒪` +inside `𝒪/π^(n+1)𝒪`. -/ +noncomputable def residueAddEquivUniformizerPowerIdealQuotient + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : NormalizedExponentialValuation v) {π : K} + (hπ : PrimeElementFor v π) (n : ℕ) : + (exponentialValuationSubring v ⧸ + uniformizerPowerIdeal (primeElementInValuationSubring v hπ) 1) ≃+ + Ideal.map + (Ideal.Quotient.mk + (uniformizerPowerIdeal (primeElementInValuationSubring v hπ) (n + 1))) + (uniformizerPowerIdeal (primeElementInValuationSubring v hπ) n) := by + rw [uniformizerPowerIdeal_primeElement_eq_maximalIdeal_pow_of_normalized hv hπ 1, + pow_one, + uniformizerPowerIdeal_primeElement_eq_maximalIdeal_pow_of_normalized hv hπ n, + uniformizerPowerIdeal_primeElement_eq_maximalIdeal_pow_of_normalized hv hπ (n + 1)] + exact residueAddEquivMaximalIdealPowQuotient hv hπ n + +/-- The graded piece `π^n𝒪 / π^{n+1}𝒪` as an additive quotient. -/ +def uniformizerGradedPiece {O : Type*} [CommRing O] (π : O) (n : ℕ) : Type _ := + (uniformizerPowerIdeal π n) ⧸ + (Submodule.comap (uniformizerPowerIdeal π n).subtype + (uniformizerPowerIdeal π (n + 1) : Submodule O O) : + Submodule O (uniformizerPowerIdeal π n)) + +/-- A uniformizer graded piece inherits an additive commutative group structure. -/ +instance uniformizerGradedPieceAddCommGroup + {O : Type*} [CommRing O] (π : O) (n : ℕ) : + AddCommGroup (uniformizerGradedPiece π n) := by + change AddCommGroup + ((uniformizerPowerIdeal π n) ⧸ + (Submodule.comap (uniformizerPowerIdeal π n).subtype + (uniformizerPowerIdeal π (n + 1) : Submodule O O) : + Submodule O (uniformizerPowerIdeal π n))) + infer_instance + +/-- A uniformizer graded piece is a module over the valuation subring. -/ +instance uniformizerGradedPieceModule + {O : Type*} [CommRing O] (π : O) (n : ℕ) : + Module O (uniformizerGradedPiece π n) := by + change Module O + ((uniformizerPowerIdeal π n) ⧸ + (Submodule.comap (uniformizerPowerIdeal π n).subtype + (uniformizerPowerIdeal π (n + 1) : Submodule O O) : + Submodule O (uniformizerPowerIdeal π n))) + infer_instance + +/-- Explicit access to the submodule quotient implementing a uniformizer +graded piece. -/ +def uniformizerGradedPieceConcreteLinearEquiv + {O : Type*} [CommRing O] (π : O) (n : ℕ) : + uniformizerGradedPiece π n ≃ₗ[O] + ((uniformizerPowerIdeal π n) ⧸ + (Submodule.comap (uniformizerPowerIdeal π n).subtype + (uniformizerPowerIdeal π (n + 1) : Submodule O O) : + Submodule O (uniformizerPowerIdeal π n))) := by + change + ((uniformizerPowerIdeal π n) ⧸ + (Submodule.comap (uniformizerPowerIdeal π n).subtype + (uniformizerPowerIdeal π (n + 1) : Submodule O O) : + Submodule O (uniformizerPowerIdeal π n))) ≃ₗ[O] + ((uniformizerPowerIdeal π n) ⧸ + (Submodule.comap (uniformizerPowerIdeal π n).subtype + (uniformizerPowerIdeal π (n + 1) : Submodule O O) : + Submodule O (uniformizerPowerIdeal π n))) + exact LinearEquiv.refl O _ + +/-- The canonical class map into `π^n𝒪 / π^(n+1)𝒪`. -/ +def uniformizerGradedPieceMk + {O : Type*} [CommRing O] (π : O) (n : ℕ) : + uniformizerPowerIdeal π n →ₗ[O] uniformizerGradedPiece π n := by + change uniformizerPowerIdeal π n →ₗ[O] + ((uniformizerPowerIdeal π n) ⧸ + (Submodule.comap (uniformizerPowerIdeal π n).subtype + (uniformizerPowerIdeal π (n + 1) : Submodule O O) : + Submodule O (uniformizerPowerIdeal π n))) + exact Submodule.mkQ _ + +/-- The concrete graded-piece equivalence sends a quotient representative to the same coset. -/ +@[simp] theorem uniformizerGradedPieceConcreteLinearEquiv_mk + {O : Type*} [CommRing O] (π : O) (n : ℕ) + (a : uniformizerPowerIdeal π n) : + uniformizerGradedPieceConcreteLinearEquiv π n + (uniformizerGradedPieceMk π n a) = + Submodule.Quotient.mk a := + rfl + +/-- The canonical map onto a uniformizer graded piece is surjective. -/ +theorem uniformizerGradedPieceMk_surjective + {O : Type*} [CommRing O] (π : O) (n : ℕ) : + Function.Surjective (uniformizerGradedPieceMk π n) := + Submodule.mkQ_surjective _ + +/-- Eliminate a uniformizer graded-piece class through its canonical +representatives. -/ +protected theorem uniformizerGradedPiece.inductionOn + {O : Type*} [CommRing O] (π : O) (n : ℕ) + {motive : uniformizerGradedPiece π n → Prop} + (q : uniformizerGradedPiece π n) + (h : ∀ a : uniformizerPowerIdeal π n, + motive (uniformizerGradedPieceMk π n a)) : + motive q := by + change motive + (show + (uniformizerPowerIdeal π n) ⧸ + (Submodule.comap (uniformizerPowerIdeal π n).subtype + (uniformizerPowerIdeal π (n + 1) : Submodule O O) : + Submodule O (uniformizerPowerIdeal π n)) from q) + refine Quotient.inductionOn q ?_ + intro a + exact h a + +/-- Descend a linear map that vanishes on `π^(n+1)𝒪` inside `π^n𝒪`. -/ +def uniformizerGradedPieceLinearLift + {O M : Type*} [CommRing O] [AddCommGroup M] [Module O M] + (π : O) (n : ℕ) + (f : uniformizerPowerIdeal π n →ₗ[O] M) + (h : + (Submodule.comap (uniformizerPowerIdeal π n).subtype + (uniformizerPowerIdeal π (n + 1) : Submodule O O) : + Submodule O (uniformizerPowerIdeal π n)) ≤ f.ker) : + uniformizerGradedPiece π n →ₗ[O] M := by + change + ((uniformizerPowerIdeal π n) ⧸ + (Submodule.comap (uniformizerPowerIdeal π n).subtype + (uniformizerPowerIdeal π (n + 1) : Submodule O O) : + Submodule O (uniformizerPowerIdeal π n))) →ₗ[O] M + exact + (Submodule.comap (uniformizerPowerIdeal π n).subtype + (uniformizerPowerIdeal π (n + 1) : Submodule O O)).liftQ f h + +/-- A linear lift from the graded piece evaluates on representatives by the supplied map. -/ +@[simp] theorem uniformizerGradedPieceLinearLift_mk + {O M : Type*} [CommRing O] [AddCommGroup M] [Module O M] + (π : O) (n : ℕ) + (f : uniformizerPowerIdeal π n →ₗ[O] M) + (h : + (Submodule.comap (uniformizerPowerIdeal π n).subtype + (uniformizerPowerIdeal π (n + 1) : Submodule O O) : + Submodule O (uniformizerPowerIdeal π n)) ≤ f.ker) + (a : uniformizerPowerIdeal π n) : + uniformizerGradedPieceLinearLift π n f h + (uniformizerGradedPieceMk π n a) = f a := + rfl + +/-- A graded-piece class is zero exactly when its representative lies in the next +filtration step. -/ +theorem uniformizerGradedPieceMk_eq_zero_iff + {O : Type*} [CommRing O] (π : O) (n : ℕ) + (a : uniformizerPowerIdeal π n) : + uniformizerGradedPieceMk π n a = 0 ↔ + a ∈ + (Submodule.comap (uniformizerPowerIdeal π n).subtype + (uniformizerPowerIdeal π (n + 1) : Submodule O O) : + Submodule O (uniformizerPowerIdeal π n)) := by + change + (Submodule.Quotient.mk a : + (uniformizerPowerIdeal π n) ⧸ + (Submodule.comap (uniformizerPowerIdeal π n).subtype + (uniformizerPowerIdeal π (n + 1) : Submodule O O) : + Submodule O (uniformizerPowerIdeal π n))) = 0 ↔ _ + exact + Submodule.Quotient.mk_eq_zero + (Submodule.comap (uniformizerPowerIdeal π n).subtype + (uniformizerPowerIdeal π (n + 1) : Submodule O O)) + +/-- The higher-unit condition `u ∈ 1 + π^n𝒪`. -/ +def HigherUnit {O : Type*} [CommRing O] (π : O) (n : ℕ) (u : Oˣ) : Prop := + ∃ a : O, (u : O) = 1 + π ^ n * a + +/-- The higher-unit condition is equivalently `u - 1 ∈ π^n𝒪`. -/ +theorem higherUnit_iff_sub_one_mem_powerIdeal {O : Type*} [CommRing O] + (π : O) (n : ℕ) (u : Oˣ) : + HigherUnit π n u ↔ (u : O) - 1 ∈ uniformizerPowerIdeal π n := by + constructor + · rintro ⟨a, ha⟩ + rw [uniformizerPowerIdeal, Ideal.mem_span_singleton'] + refine ⟨a, ?_⟩ + rw [ha] + ring + · intro hu + rw [uniformizerPowerIdeal, Ideal.mem_span_singleton'] at hu + rcases hu with ⟨a, ha⟩ + use a + calc + (u : O) = 1 + ((u : O) - 1) := by ring + _ = 1 + a * π ^ n := by rw [← ha] + _ = 1 + π ^ n * a := by ring + +/-- The higher unit group `U⁽ⁿ⁾ = 1 + π^n𝒪`, as an actual subgroup of `Oˣ`. -/ +def higherUnitSubgroup {O : Type*} [CommRing O] (π : O) (n : ℕ) : Subgroup Oˣ where + carrier := {u | HigherUnit π n u} + one_mem' := by + use 0 + simp + mul_mem' := by + rintro u v ⟨a, ha⟩ ⟨b, hb⟩ + use a + b + π ^ n * a * b + calc + ((u * v : Oˣ) : O) = (u : O) * (v : O) := rfl + _ = (1 + π ^ n * a) * (1 + π ^ n * b) := by rw [ha, hb] + _ = 1 + π ^ n * (a + b + π ^ n * a * b) := by ring + inv_mem' := by + rintro u ⟨a, ha⟩ + use -((u⁻¹ : Oˣ) : O) * a + have hmul : ((u⁻¹ : Oˣ) : O) * (u : O) = 1 := by + simp + calc + ((u⁻¹ : Oˣ) : O) = + ((u⁻¹ : Oˣ) : O) * (u : O) - + ((u⁻¹ : Oˣ) : O) * ((u : O) - 1) := by + ring + _ = 1 - ((u⁻¹ : Oˣ) : O) * ((u : O) - 1) := by + rw [hmul] + _ = 1 + π ^ n * (-((u⁻¹ : Oˣ) : O) * a) := by + rw [ha] + ring + +/-- Membership in a higher-unit subgroup is characterized by proximity to one at the given level. -/ +@[simp] +theorem mem_higherUnitSubgroup {O : Type*} [CommRing O] + {π : O} {n : ℕ} {u : Oˣ} : + u ∈ higherUnitSubgroup π n ↔ HigherUnit π n u := + Iff.rfl + +/-- Membership in the higher-unit subgroup is equivalently `u - 1 ∈ π^n𝒪`. -/ +theorem mem_higherUnitSubgroup_iff_sub_one_mem_powerIdeal + {O : Type*} [CommRing O] {π : O} {n : ℕ} {u : Oˣ} : + u ∈ higherUnitSubgroup π n ↔ (u : O) - 1 ∈ uniformizerPowerIdeal π n := by + exact Iff.trans mem_higherUnitSubgroup + (higherUnit_iff_sub_one_mem_powerIdeal π n u) + +/-- For a normalized exponential valuation, higher units defined by a normalized +prime element are exactly units congruent to `1` modulo the corresponding +power of the maximal ideal. -/ +theorem mem_higherUnitSubgroup_primeElement_iff_sub_one_mem_maximalIdeal_pow + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : NormalizedExponentialValuation v) {π : K} + (hπ : PrimeElementFor v π) {n : ℕ} + {u : (exponentialValuationSubring v)ˣ} : + u ∈ higherUnitSubgroup (primeElementInValuationSubring v hπ) n ↔ + (u : exponentialValuationSubring v) - 1 ∈ + (IsLocalRing.maximalIdeal (exponentialValuationSubring v)) ^ n := by + rw [mem_higherUnitSubgroup_iff_sub_one_mem_powerIdeal, + uniformizerPowerIdeal_primeElement_eq_maximalIdeal_pow_of_normalized hv hπ n] + +/-- The coefficient in a higher-unit representation is unique in a domain. -/ +theorem higherUnit_coeff_unique {O : Type*} [CommRing O] [IsDomain O] + {π : O} {n : ℕ} (hπ0 : π ≠ 0) {u : Oˣ} {a b : O} + (ha : (u : O) = 1 + π ^ n * a) + (hb : (u : O) = 1 + π ^ n * b) : + a = b := by + have hpow : π ^ n ≠ 0 := pow_ne_zero n hπ0 + have hmul : π ^ n * a = π ^ n * b := by + have h : 1 + π ^ n * a = 1 + π ^ n * b := by + rw [← ha, ← hb] + exact add_left_cancel h + exact mul_left_cancel₀ hpow hmul + +/-- A chosen coefficient `a` for an element of `U⁽ⁿ⁾ = 1 + π^n𝒪`. -/ +noncomputable def chosenHigherUnitCoeff {O : Type*} [CommRing O] + (π : O) (n : ℕ) (u : higherUnitSubgroup π n) : O := + Classical.choose (show HigherUnit π n (u : Oˣ) from u.property) + +/-- The chosen coefficient really represents the higher unit. -/ +theorem chosenHigherUnitCoeff_spec {O : Type*} [CommRing O] + (π : O) (n : ℕ) (u : higherUnitSubgroup π n) : + ((u : Oˣ) : O) = 1 + π ^ n * chosenHigherUnitCoeff π n u := + Classical.choose_spec (show HigherUnit π n (u : Oˣ) from u.property) + +/-- The chosen coefficient agrees with any displayed representation. -/ +theorem chosenHigherUnitCoeff_eq_of_repr {O : Type*} [CommRing O] [IsDomain O] + {π : O} {n : ℕ} (hπ0 : π ≠ 0) {u : higherUnitSubgroup π n} {a : O} + (ha : ((u : Oˣ) : O) = 1 + π ^ n * a) : + chosenHigherUnitCoeff π n u = a := + higherUnit_coeff_unique hπ0 (chosenHigherUnitCoeff_spec π n u) ha + +/-- The higher-unit filtration is decreasing. -/ +theorem higherUnitSubgroup_succ_le {O : Type*} [CommRing O] + (π : O) (n : ℕ) : + higherUnitSubgroup π (n + 1) ≤ higherUnitSubgroup π n := by + rintro u ⟨a, ha⟩ + use π * a + calc + (u : O) = 1 + π ^ (n + 1) * a := ha + _ = 1 + π ^ n * (π * a) := by + rw [pow_succ'] + ring + +/-- The zeroth higher-unit subgroup is the whole unit group. -/ +theorem higherUnitSubgroup_zero_eq_top {O : Type*} [CommRing O] + (π : O) : + higherUnitSubgroup π 0 = ⊤ := by + ext u + constructor + · intro _ + trivial + · intro _ + use (u : O) - 1 + calc + (u : O) = 1 + ((u : O) - 1) := by ring + _ = 1 + π ^ 0 * ((u : O) - 1) := by ring + +/-- The higher-unit filtration is decreasing for arbitrary comparable indices. -/ +theorem higherUnitSubgroup_le_of_le {O : Type*} [CommRing O] + (π : O) {m n : ℕ} (hmn : m ≤ n) : + higherUnitSubgroup π n ≤ higherUnitSubgroup π m := by + rintro u ⟨a, ha⟩ + obtain ⟨k, rfl⟩ := Nat.exists_eq_add_of_le hmn + use π ^ k * a + calc + (u : O) = 1 + π ^ (m + k) * a := ha + _ = 1 + π ^ m * (π ^ k * a) := by + rw [pow_add] + ring + +/-- In a local ring, adding an element of the maximal ideal to `1` gives a unit. -/ +theorem isUnit_one_add_of_mem_maximalIdeal {O : Type*} [CommRing O] [IsLocalRing O] + {x : O} (hx : x ∈ IsLocalRing.maximalIdeal O) : + IsUnit (1 + x) := by + have hx_nonunit : x ∈ nonunits O := (IsLocalRing.mem_maximalIdeal x).mp hx + have hneg_nonunit : -x ∈ nonunits O := by + rw [mem_nonunits_iff] at hx_nonunit ⊢ + exact mt (fun h => (IsUnit.neg_iff x).mp h) hx_nonunit + have hunit : IsUnit (1 - (-x)) := + IsLocalRing.isUnit_one_sub_self_of_mem_nonunits (-x) hneg_nonunit + simpa using hunit + +/-- Reduction of units modulo an ideal. -/ +def unitReduction {O : Type*} [CommRing O] (I : Ideal O) : Oˣ →* (O ⧸ I)ˣ := + Units.map (Ideal.Quotient.mk I).toMonoidHom + +/-- Unit reduction is the residue of the underlying valuation-ring unit. -/ +@[simp] +theorem unitReduction_apply {O : Type*} [CommRing O] (I : Ideal O) (u : Oˣ) : + (unitReduction I u : O ⧸ I) = Ideal.Quotient.mk I (u : O) := + rfl + +/-- The kernel of reduction modulo `π^n𝒪` is the higher unit group `1 + π^n𝒪`. -/ +theorem unitReduction_ker_powerIdeal {O : Type*} [CommRing O] + (π : O) (n : ℕ) : + (unitReduction (uniformizerPowerIdeal π n)).ker = higherUnitSubgroup π n := by + ext u + constructor + · intro hu + have hval : + Ideal.Quotient.mk (uniformizerPowerIdeal π n) (u : O) = 1 := by + simpa [unitReduction] using congrArg Units.val hu + have hmem : (u : O) - 1 ∈ uniformizerPowerIdeal π n := by + rw [← Ideal.Quotient.eq_zero_iff_mem] + simp [map_sub, hval] + rw [uniformizerPowerIdeal, Ideal.mem_span_singleton] at hmem + rcases hmem with ⟨a, ha⟩ + use a + calc + (u : O) = 1 + ((u : O) - 1) := by ring + _ = 1 + π ^ n * a := by rw [ha] + · rintro ⟨a, ha⟩ + rw [MonoidHom.mem_ker] + ext + change Ideal.Quotient.mk (uniformizerPowerIdeal π n) (u : O) = 1 + rw [ha] + rw [← (Ideal.Quotient.mk (uniformizerPowerIdeal π n)).map_one] + apply Ideal.Quotient.eq.mpr + have hπ : π ^ n ∈ uniformizerPowerIdeal π n := + Ideal.subset_span (by simp) + simpa using (uniformizerPowerIdeal π n).mul_mem_right a hπ + +/-- For a normalized exponential valuation, the kernel of reduction modulo +`maximalIdeal^n` is the higher-unit subgroup attached to a normalized prime element. -/ +theorem unitReduction_ker_maximalIdeal_pow_primeElement_of_normalized + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : NormalizedExponentialValuation v) {π : K} + (hπ : PrimeElementFor v π) (n : ℕ) : + (unitReduction + ((IsLocalRing.maximalIdeal (exponentialValuationSubring v)) ^ n)).ker = + higherUnitSubgroup (primeElementInValuationSubring v hπ) n := by + rw [← uniformizerPowerIdeal_primeElement_eq_maximalIdeal_pow_of_normalized hv hπ n] + exact unitReduction_ker_powerIdeal (primeElementInValuationSubring v hπ) n + +/-- A local quotient map induces a surjection on unit groups. -/ +theorem unitReduction_surjective_of_isLocalHom {O : Type*} [CommRing O] + (I : Ideal O) [IsLocalHom (Ideal.Quotient.mk I)] : + Function.Surjective (unitReduction I) := by + exact IsLocalRing.surjective_units_map_of_local_ringHom + (Ideal.Quotient.mk I) Ideal.Quotient.mk_surjective inferInstance + +/-- For a exponential valuation ring, the quotient map modulo +`maximalIdeal^n` is local for `n ≥ 1`. -/ +theorem unitReduction_isLocalHom_maximalIdeal_pow_of_pos + {K : Type*} [Field K] (v : ExponentialValuation K) + {n : ℕ} (hn : 1 ≤ n) : + IsLocalHom + (Ideal.Quotient.mk + ((IsLocalRing.maximalIdeal (exponentialValuationSubring v)) ^ n)) := by + have hn0 : n ≠ 0 := by + omega + have hpow_le : + (IsLocalRing.maximalIdeal (exponentialValuationSubring v)) ^ n ≤ + IsLocalRing.maximalIdeal (exponentialValuationSubring v) := + Ideal.pow_le_self hn0 + exact + isLocalHom_of_le_jacobson_bot + ((IsLocalRing.maximalIdeal (exponentialValuationSubring v)) ^ n) + (hpow_le.trans + (IsLocalRing.maximalIdeal_le_jacobson + (⊥ : Ideal (exponentialValuationSubring v)))) + +/-- The first-isomorphism-theorem form of the unit quotient modulo `π^n𝒪`. -/ +noncomputable def unitsModPowerIdealEquivOfSurjective {O : Type*} [CommRing O] + (π : O) (n : ℕ) + (hsurj : Function.Surjective (unitReduction (uniformizerPowerIdeal π n))) : + Oˣ ⧸ higherUnitSubgroup π n ≃* (O ⧸ uniformizerPowerIdeal π n)ˣ := + (QuotientGroup.quotientMulEquivOfEq + (unitReduction_ker_powerIdeal π n).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (unitReduction (uniformizerPowerIdeal π n)) hsurj) + +/-- If reduction modulo `π^n𝒪` is a local quotient, then +`Oˣ/U⁽ⁿ⁾` is the unit group of `O/π^n𝒪`. +-/ +noncomputable def unitsModPowerIdealEquivOfIsLocalHom {O : Type*} [CommRing O] + (π : O) (n : ℕ) [IsLocalHom (Ideal.Quotient.mk (uniformizerPowerIdeal π n))] : + Oˣ ⧸ higherUnitSubgroup π n ≃* (O ⧸ uniformizerPowerIdeal π n)ˣ := + unitsModPowerIdealEquivOfSurjective π n + (unitReduction_surjective_of_isLocalHom (uniformizerPowerIdeal π n)) + +/-- The first-isomorphism-theorem form for a normalized exponential-valuation ring, +modulo `maximalIdeal^n`, assuming surjectivity of reduction on units. -/ +noncomputable def unitsModMaximalIdealPowEquivOfSurjectiveNormalized + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : NormalizedExponentialValuation v) {π : K} + (hπ : PrimeElementFor v π) (n : ℕ) + (hsurj : Function.Surjective + (unitReduction + ((IsLocalRing.maximalIdeal (exponentialValuationSubring v)) ^ n))) : + ((exponentialValuationSubring v)ˣ ⧸ + higherUnitSubgroup (primeElementInValuationSubring v hπ) n) ≃* + (exponentialValuationSubring v ⧸ + (IsLocalRing.maximalIdeal (exponentialValuationSubring v)) ^ n)ˣ := + (QuotientGroup.quotientMulEquivOfEq + (unitReduction_ker_maximalIdeal_pow_primeElement_of_normalized + hv hπ n).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (unitReduction + ((IsLocalRing.maximalIdeal (exponentialValuationSubring v)) ^ n)) + hsurj) + +/-- For a normalized exponential-valuation ring and `n ≥ 1`, +`Oˣ/U⁽ⁿ⁾` is the unit group of `O/maximalIdeal^n`. -/ +noncomputable def unitsModMaximalIdealPowEquivOfNormalized + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : NormalizedExponentialValuation v) {π : K} + (hπ : PrimeElementFor v π) {n : ℕ} (hn : 1 ≤ n) : + ((exponentialValuationSubring v)ˣ ⧸ + higherUnitSubgroup (primeElementInValuationSubring v hπ) n) ≃* + (exponentialValuationSubring v ⧸ + (IsLocalRing.maximalIdeal (exponentialValuationSubring v)) ^ n)ˣ := by + letI : IsLocalHom + (Ideal.Quotient.mk + ((IsLocalRing.maximalIdeal (exponentialValuationSubring v)) ^ n)) := + unitReduction_isLocalHom_maximalIdeal_pow_of_pos v hn + exact unitsModMaximalIdealPowEquivOfSurjectiveNormalized hv hπ n + (unitReduction_surjective_of_isLocalHom + ((IsLocalRing.maximalIdeal (exponentialValuationSubring v)) ^ n)) + +/-- For `n ≥ 1`, the ideal `π^n𝒪` is contained in `(π)`. -/ +theorem uniformizerPowerIdeal_le_span_singleton {O : Type*} [CommRing O] + {π : O} {n : ℕ} (hn : 1 ≤ n) : + uniformizerPowerIdeal π n ≤ Ideal.span ({π} : Set O) := by + cases n with + | zero => cases hn + | succ n => + rw [uniformizerPowerIdeal, Ideal.span_singleton_le_iff_mem, Ideal.mem_span_singleton] + exact ⟨π ^ n, by simp [pow_succ, mul_comm]⟩ + +/-- In a DVR, `π^n𝒪` lies in the Jacobson radical for `n ≥ 1` and `π` irreducible. -/ +theorem uniformizerPowerIdeal_le_jacobson_bot {O : Type*} + [CommRing O] [IsDomain O] [IsDiscreteValuationRing O] + {π : O} (hπ : Irreducible π) {n : ℕ} (hn : 1 ≤ n) : + uniformizerPowerIdeal π n ≤ Ideal.jacobson (⊥ : Ideal O) := by + have hmax : (Ideal.span ({π} : Set O)).IsMaximal := + PrincipalIdealRing.isMaximal_of_irreducible hπ + have hspan : Ideal.span ({π} : Set O) = IsLocalRing.maximalIdeal O := + IsLocalRing.eq_maximalIdeal hmax + exact (uniformizerPowerIdeal_le_span_singleton (π := π) hn).trans + (by rw [hspan]; exact IsLocalRing.maximalIdeal_le_jacobson (⊥ : Ideal O)) + +/-- The quotient map modulo `π^n𝒪` is local in a DVR, for `n ≥ 1`. -/ +theorem unitReduction_isLocalHom_of_dvr {O : Type*} + [CommRing O] [IsDomain O] [IsDiscreteValuationRing O] + {π : O} (hπ : Irreducible π) {n : ℕ} (hn : 1 ≤ n) : + IsLocalHom (Ideal.Quotient.mk (uniformizerPowerIdeal π n)) := + isLocalHom_of_le_jacobson_bot (uniformizerPowerIdeal π n) + (uniformizerPowerIdeal_le_jacobson_bot hπ hn) + +/-- The graded coefficient map `U⁽ⁿ⁾ → 𝒪/(π)`, `1 + π^n a ↦ a mod π`, +viewed multiplicatively by tagging the additive residue group as `Multiplicative`. +-/ +noncomputable def higherUnitCoeffModHom {O : Type*} + [CommRing O] [IsDomain O] {π : O} (hπ0 : π ≠ 0) (n : ℕ) (hn : 1 ≤ n) : + higherUnitSubgroup π n →* + Multiplicative (O ⧸ Ideal.span ({π} : Set O)) where + toFun u := + Multiplicative.ofAdd + (Ideal.Quotient.mk (Ideal.span ({π} : Set O)) (chosenHigherUnitCoeff π n u)) + map_one' := by + apply Multiplicative.ofAdd.injective + change Ideal.Quotient.mk (Ideal.span ({π} : Set O)) + (chosenHigherUnitCoeff π n (1 : higherUnitSubgroup π n)) = 0 + have hcoeff : + chosenHigherUnitCoeff π n (1 : higherUnitSubgroup π n) = 0 := by + apply chosenHigherUnitCoeff_eq_of_repr hπ0 + simp + rw [hcoeff] + simp + map_mul' u v := by + apply Multiplicative.ofAdd.injective + let I : Ideal O := Ideal.span ({π} : Set O) + let cu : O := chosenHigherUnitCoeff π n u + let cv : O := chosenHigherUnitCoeff π n v + let cuv : O := chosenHigherUnitCoeff π n (u * v) + have hu : ((u : Oˣ) : O) = 1 + π ^ n * cu := + chosenHigherUnitCoeff_spec π n u + have hv : ((v : Oˣ) : O) = 1 + π ^ n * cv := + chosenHigherUnitCoeff_spec π n v + have hrepr : (((u * v : higherUnitSubgroup π n) : Oˣ) : O) = + 1 + π ^ n * (cu + cv + π ^ n * cu * cv) := by + calc + (((u * v : higherUnitSubgroup π n) : Oˣ) : O) = + ((u : Oˣ) : O) * ((v : Oˣ) : O) := rfl + _ = (1 + π ^ n * cu) * (1 + π ^ n * cv) := by rw [hu, hv] + _ = 1 + π ^ n * (cu + cv + π ^ n * cu * cv) := by ring + have hcuv : cuv = cu + cv + π ^ n * cu * cv := + chosenHigherUnitCoeff_eq_of_repr hπ0 hrepr + change Ideal.Quotient.mk I cuv = + Ideal.Quotient.mk I cu + Ideal.Quotient.mk I cv + rw [hcuv] + change Ideal.Quotient.mk I (cu + cv + π ^ n * cu * cv) = + Ideal.Quotient.mk I (cu + cv) + apply Ideal.Quotient.eq.mpr + have hpow_mem : π ^ n * cu * cv ∈ I := by + have hbase : π ^ n ∈ uniformizerPowerIdeal π n := + Ideal.subset_span (by simp) + have hmem' : π ^ n * (cu * cv) ∈ I := + uniformizerPowerIdeal_le_span_singleton (π := π) hn + ((uniformizerPowerIdeal π n).mul_mem_right (cu * cv) hbase) + simpa [mul_assoc] using hmem' + have hdiff : (cu + cv + π ^ n * cu * cv) - (cu + cv) = π ^ n * cu * cv := by + ring + simpa [I, hdiff] + using hpow_mem + +/-- The kernel of the coefficient map is `U⁽ⁿ⁺¹⁾`. -/ +theorem higherUnitCoeffModHom_ker {O : Type*} + [CommRing O] [IsDomain O] {π : O} (hπ0 : π ≠ 0) (n : ℕ) (hn : 1 ≤ n) : + (higherUnitCoeffModHom (O := O) hπ0 n hn).ker = + Subgroup.comap (higherUnitSubgroup π n).subtype + (higherUnitSubgroup π (n + 1)) := by + ext u + constructor + · intro hu + have hzero : + Ideal.Quotient.mk (Ideal.span ({π} : Set O)) (chosenHigherUnitCoeff π n u) = 0 := by + simpa [higherUnitCoeffModHom] using congrArg Multiplicative.toAdd hu + have hmem : chosenHigherUnitCoeff π n u ∈ Ideal.span ({π} : Set O) := by + exact Ideal.Quotient.eq_zero_iff_mem.mp hzero + rw [Ideal.mem_span_singleton] at hmem + rcases hmem with ⟨b, hb⟩ + change (u : Oˣ) ∈ higherUnitSubgroup π (n + 1) + use b + calc + ((u : Oˣ) : O) = 1 + π ^ n * chosenHigherUnitCoeff π n u := + chosenHigherUnitCoeff_spec π n u + _ = 1 + π ^ (n + 1) * b := by + rw [hb] + rw [pow_succ'] + ring + · intro hu + rw [MonoidHom.mem_ker] + apply Multiplicative.ofAdd.injective + change Ideal.Quotient.mk (Ideal.span ({π} : Set O)) (chosenHigherUnitCoeff π n u) = 0 + rw [Ideal.Quotient.eq_zero_iff_mem, Ideal.mem_span_singleton] + change (u : Oˣ) ∈ higherUnitSubgroup π (n + 1) at hu + rcases hu with ⟨b, hb⟩ + refine ⟨b, ?_⟩ + apply chosenHigherUnitCoeff_eq_of_repr hπ0 + calc + ((u : Oˣ) : O) = 1 + π ^ (n + 1) * b := hb + _ = 1 + π ^ n * (π * b) := by + rw [pow_succ'] + ring + +/-- The coefficient map `U⁽ⁿ⁾ → 𝒪/(π)` is surjective. -/ +theorem higherUnitCoeffModHom_surjective {O : Type*} + [CommRing O] [IsDomain O] [IsDiscreteValuationRing O] + {π : O} (hπ : Irreducible π) (n : ℕ) (hn : 1 ≤ n) : + Function.Surjective (higherUnitCoeffModHom (O := O) hπ.ne_zero n hn) := by + intro y + refine Multiplicative.rec ?_ y + intro yadd + refine Quotient.inductionOn yadd ?_ + intro a + have hx_mem : π ^ n * a ∈ IsLocalRing.maximalIdeal O := by + rw [hπ.maximalIdeal_eq] + have hbase : π ^ n ∈ uniformizerPowerIdeal π n := + Ideal.subset_span (by simp) + exact uniformizerPowerIdeal_le_span_singleton (π := π) hn + ((uniformizerPowerIdeal π n).mul_mem_right a hbase) + have hunit : IsUnit (1 + π ^ n * a) := + isUnit_one_add_of_mem_maximalIdeal hx_mem + let u0 : Oˣ := hunit.unit + have hu0 : (u0 : O) = 1 + π ^ n * a := hunit.unit_spec + let u : higherUnitSubgroup π n := + ⟨u0, ⟨a, hu0⟩⟩ + refine ⟨u, ?_⟩ + apply Multiplicative.ofAdd.injective + change Ideal.Quotient.mk (Ideal.span ({π} : Set O)) (chosenHigherUnitCoeff π n u) = + Ideal.Quotient.mk (Ideal.span ({π} : Set O)) a + rw [chosenHigherUnitCoeff_eq_of_repr hπ.ne_zero] + exact hu0 + +/-- The explicit higher unit `1 + π^n a`, for `n ≥ 1` in a DVR. -/ +noncomputable def higherUnitOneAdd {O : Type*} + [CommRing O] [IsDomain O] [IsDiscreteValuationRing O] + {π : O} (hπ : Irreducible π) (n : ℕ) (hn : 1 ≤ n) (a : O) : + higherUnitSubgroup π n := + let hmem : π ^ n * a ∈ IsLocalRing.maximalIdeal O := by + rw [hπ.maximalIdeal_eq] + have hbase : π ^ n ∈ uniformizerPowerIdeal π n := + Ideal.subset_span (by simp) + exact uniformizerPowerIdeal_le_span_singleton (π := π) hn + ((uniformizerPowerIdeal π n).mul_mem_right a hbase) + let hunit : IsUnit (1 + π ^ n * a) := + isUnit_one_add_of_mem_maximalIdeal hmem + ⟨hunit.unit, ⟨a, hunit.unit_spec⟩⟩ + +/-- The explicit higher unit has the promised representative. -/ +theorem higherUnitOneAdd_val {O : Type*} + [CommRing O] [IsDomain O] [IsDiscreteValuationRing O] + {π : O} (hπ : Irreducible π) (n : ℕ) (hn : 1 ≤ n) (a : O) : + (((higherUnitOneAdd hπ n hn a : higherUnitSubgroup π n) : Oˣ) : O) = + 1 + π ^ n * a := by + simp [higherUnitOneAdd] + +/-- The coefficient of the explicit higher unit `1 + π^n a` is `a`. -/ +theorem chosenHigherUnitCoeff_oneAdd {O : Type*} + [CommRing O] [IsDomain O] [IsDiscreteValuationRing O] + {π : O} (hπ : Irreducible π) (n : ℕ) (hn : 1 ≤ n) (a : O) : + chosenHigherUnitCoeff π n (higherUnitOneAdd hπ n hn a) = a := + chosenHigherUnitCoeff_eq_of_repr hπ.ne_zero + (higherUnitOneAdd_val hπ n hn a) + +/-- The coefficient map sends the explicit higher unit `1 + π^n a` to +`a mod π`. -/ +theorem higherUnitCoeffModHom_oneAdd {O : Type*} + [CommRing O] [IsDomain O] [IsDiscreteValuationRing O] + {π : O} (hπ : Irreducible π) (n : ℕ) (hn : 1 ≤ n) (a : O) : + higherUnitCoeffModHom (O := O) hπ.ne_zero n hn + (higherUnitOneAdd hπ n hn a) = + Multiplicative.ofAdd + (Ideal.Quotient.mk (Ideal.span ({π} : Set O)) a) := by + change + Multiplicative.ofAdd + (Ideal.Quotient.mk (Ideal.span ({π} : Set O)) + (chosenHigherUnitCoeff π n (higherUnitOneAdd hπ n hn a))) = + Multiplicative.ofAdd + (Ideal.Quotient.mk (Ideal.span ({π} : Set O)) a) + rw [chosenHigherUnitCoeff_oneAdd] + +/-- If a higher unit is displayed as `1 + π^n a`, the coefficient map sends it +to `a mod π`. -/ +theorem higherUnitCoeffModHom_apply_of_repr {O : Type*} + [CommRing O] [IsDomain O] {π : O} (hπ0 : π ≠ 0) + {n : ℕ} (hn : 1 ≤ n) {u : higherUnitSubgroup π n} {a : O} + (ha : ((u : Oˣ) : O) = 1 + π ^ n * a) : + higherUnitCoeffModHom (O := O) hπ0 n hn u = + Multiplicative.ofAdd + (Ideal.Quotient.mk (Ideal.span ({π} : Set O)) a) := by + change + Multiplicative.ofAdd + (Ideal.Quotient.mk (Ideal.span ({π} : Set O)) + (chosenHigherUnitCoeff π n u)) = + Multiplicative.ofAdd + (Ideal.Quotient.mk (Ideal.span ({π} : Set O)) a) + rw [chosenHigherUnitCoeff_eq_of_repr hπ0 ha] + +/-- The multiplicative first-isomorphism-theorem form of +`U⁽ⁿ⁾/U⁽ⁿ⁺¹⁾ ≃ 𝒪/(π)`. +-/ +noncomputable def higherUnitGradedPieceMulEquivResidue {O : Type*} + [CommRing O] [IsDomain O] [IsDiscreteValuationRing O] + {π : O} (hπ : Irreducible π) (n : ℕ) (hn : 1 ≤ n) : + ((higherUnitSubgroup π n) ⧸ + Subgroup.comap (higherUnitSubgroup π n).subtype + (higherUnitSubgroup π (n + 1))) ≃* + Multiplicative (O ⧸ Ideal.span ({π} : Set O)) := + (QuotientGroup.quotientMulEquivOfEq + (higherUnitCoeffModHom_ker (O := O) hπ.ne_zero n hn).symm).trans + (QuotientGroup.quotientKerEquivOfSurjective + (higherUnitCoeffModHom (O := O) hπ.ne_zero n hn) + (higherUnitCoeffModHom_surjective hπ n hn)) + +/-- The unit-reduction and graded-piece equivalences, kernel part for the reduction map on unit +groups. -/ +theorem units_reduction_kernel + {O : Type*} [CommRing O] (π : O) (n : ℕ) : + (unitReduction (uniformizerPowerIdeal π n)).ker = higherUnitSubgroup π n := + unitReduction_ker_powerIdeal π n + +/-- The unit-reduction and graded-piece equivalences, surjectivity part for the reduction map on +unit groups. -/ +theorem units_reduction_surjective + {O : Type*} [CommRing O] [IsDomain O] [IsDiscreteValuationRing O] + {π : O} (hπ : Irreducible π) {n : ℕ} (hn : 1 ≤ n) : + Function.Surjective (unitReduction (uniformizerPowerIdeal π n)) := by + let : IsLocalHom (Ideal.Quotient.mk (uniformizerPowerIdeal π n)) := + unitReduction_isLocalHom_of_dvr hπ hn + exact unitReduction_surjective_of_isLocalHom (uniformizerPowerIdeal π n) + +/-- The unit-reduction and graded-piece equivalences, the named first-isomorphism-theorem +equivalence +`Oˣ/U⁽ⁿ⁾ ≃ (O/π^nO)ˣ`. -/ +noncomputable def unitsQuotientEquiv + {O : Type*} [CommRing O] [IsDomain O] [IsDiscreteValuationRing O] + {π : O} (hπ : Irreducible π) {n : ℕ} (hn : 1 ≤ n) : + Oˣ ⧸ higherUnitSubgroup π n ≃* (O ⧸ uniformizerPowerIdeal π n)ˣ := by + exact unitsModPowerIdealEquivOfSurjective π n + (units_reduction_surjective hπ hn) + +/-- The unit-quotient equivalence of the unit-reduction and graded-piece equivalences is induced by +reduction modulo `πⁿO`. -/ +@[simp] +theorem units_quotient_equiv_mk + {O : Type*} [CommRing O] [IsDomain O] [IsDiscreteValuationRing O] + {π : O} (hπ : Irreducible π) {n : ℕ} (hn : 1 ≤ n) (u : Oˣ) : + unitsQuotientEquiv hπ hn (QuotientGroup.mk u) = + unitReduction (uniformizerPowerIdeal π n) u := by + change QuotientGroup.kerLift (unitReduction (uniformizerPowerIdeal π n)) + ((QuotientGroup.quotientMulEquivOfEq + (unitReduction_ker_powerIdeal π n).symm) (QuotientGroup.mk u)) = + unitReduction (uniformizerPowerIdeal π n) u + rw [QuotientGroup.quotientMulEquivOfEq_mk] + exact QuotientGroup.kerLift_mk (unitReduction (uniformizerPowerIdeal π n)) u + +/-- The unit-reduction and graded-piece equivalences, kernel part for the coefficient map +`U⁽ⁿ⁾ → O/(π)`. -/ +theorem higher_unit_coeff_kernel + {O : Type*} [CommRing O] [IsDomain O] + {π : O} (hπ0 : π ≠ 0) {n : ℕ} (hn : 1 ≤ n) : + (higherUnitCoeffModHom (O := O) hπ0 n hn).ker = + Subgroup.comap (higherUnitSubgroup π n).subtype + (higherUnitSubgroup π (n + 1)) := + higherUnitCoeffModHom_ker (O := O) hπ0 n hn + +/-- The unit-reduction and graded-piece equivalences, surjectivity part for the coefficient map +`U⁽ⁿ⁾ → O/(π)`. -/ +theorem higher_unit_coeff_surjective + {O : Type*} [CommRing O] [IsDomain O] [IsDiscreteValuationRing O] + {π : O} (hπ : Irreducible π) {n : ℕ} (hn : 1 ≤ n) : + Function.Surjective (higherUnitCoeffModHom (O := O) hπ.ne_zero n hn) := + higherUnitCoeffModHom_surjective hπ n hn + +/-- The unit-reduction and graded-piece equivalences, the named additive graded-piece equivalence +`U⁽ⁿ⁾/U⁽ⁿ⁺¹⁾ ≃+ O/(π)`. -/ +noncomputable def higherUnitGradedEquiv + {O : Type*} [CommRing O] [IsDomain O] [IsDiscreteValuationRing O] + {π : O} (hπ : Irreducible π) {n : ℕ} (hn : 1 ≤ n) : + Additive + ((higherUnitSubgroup π n) ⧸ + Subgroup.comap (higherUnitSubgroup π n).subtype + (higherUnitSubgroup π (n + 1))) ≃+ + (O ⧸ Ideal.span ({π} : Set O)) := + MulEquiv.toAdditiveLeft + (higherUnitGradedPieceMulEquivResidue hπ n hn) + +end Valuations +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/ExponentialValuations.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/ExponentialValuations.lean new file mode 100644 index 0000000000..825f40ea53 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/ExponentialValuations.lean @@ -0,0 +1,1553 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.AbsoluteValues +public import Mathlib.GroupTheory.QuotientGroup.Basic +public import Mathlib.RingTheory.DiscreteValuationRing.Basic +public import Mathlib.RingTheory.Henselian +public import Mathlib.RingTheory.Ideal.IsPrincipalPowQuotient +public import Mathlib.RingTheory.Valuation.ValuationSubring +/-! Provides the public declarations in the + `ValuationTheory.AbsoluteValue.Theory.ExponentialValuations` Lean module. -/ + +@[expose] public section + +noncomputable +section + +open Filter +open scoped BigOperators Topology + +namespace LubinTate +namespace Valuations + +/-- The additive exponential valuation with value `∞` at zero. -/ +structure ExponentialValuation (K : Type*) [Field K] where + /-- The value map into `ℝ ∪ {∞}`. -/ + toFun : K → WithTop ℝ + /-- Exactly zero has value `∞`. -/ + eq_top_iff : ∀ x, toFun x = ⊤ ↔ x = 0 + /-- Multiplication becomes addition of values. -/ + map_mul : ∀ x y, toFun (x * y) = toFun x + toFun y + /-- The nonarchimedean inequality in additive form. -/ + add_le_min : ∀ x y, min (toFun x) (toFun y) ≤ toFun (x + y) + +/-- Coerce an exponential valuation to its function. -/ +instance exponentialValuationCoeFun {K : Type*} [Field K] : + CoeFun (ExponentialValuation K) (fun _ => K → WithTop ℝ) where + coe v := v.toFun + +/-- The trivial exponential valuation: every nonzero element has value `0`. -/ +def TrivialExponentialValuation {K : Type*} [Field K] + (v : ExponentialValuation K) : Prop := + ∀ x : K, x ≠ 0 → v x = 0 + +/-- Equivalence of exponential valuations by multiplication by a positive real scalar. -/ +def EquivalentExponentialValuations {K : Type*} [Field K] + (v w : ExponentialValuation K) : Prop := + ∃ s : ℝ, 0 < s ∧ ∀ x : K, x ≠ 0 → ∃ r : ℝ, + w x = (r : WithTop ℝ) ∧ v x = ((s * r : ℝ) : WithTop ℝ) + +/-- A multiplicative absolute value associated to an exponential valuation by `|x| = q^{-v(x)}`. -/ +def AssociatedAbsoluteValue {K : Type*} [Field K] + (v : ExponentialValuation K) (q : ℝ) (abv : AbsoluteValue K ℝ) : Prop := + 1 < q ∧ ∀ x : K, x ≠ 0 → ∃ r : ℝ, + v x = (r : WithTop ℝ) ∧ abv x = Real.rpow q (-r) + +/-- The valuation ring `{x | v(x) ≥ 0}` attached to an exponential valuation. -/ +def exponentialValuationRing {K : Type*} [Field K] + (v : ExponentialValuation K) : Set K := + {x | (0 : WithTop ℝ) ≤ v x} + +/-- Nonzero elements have finite value for a exponential valuation. -/ +theorem exponentialValuation_ne_top_of_ne_zero {K : Type*} [Field K] + (v : ExponentialValuation K) {x : K} (hx : x ≠ 0) : + v x ≠ ⊤ := by + intro htop + exact hx ((v.eq_top_iff x).mp htop) + +/-- A nonzero element has a real-valued exponential valuation. -/ +theorem exponentialValuation_exists_real_of_ne_zero {K : Type*} [Field K] + (v : ExponentialValuation K) {x : K} (hx : x ≠ 0) : + ∃ r : ℝ, v x = (r : WithTop ℝ) := by + rcases WithTop.ne_top_iff_exists.mp + (exponentialValuation_ne_top_of_ne_zero v hx) with ⟨r, hr⟩ + exact ⟨r, hr.symm⟩ + +/-- The value of `1` is `0` for a exponential valuation. -/ +@[simp] +theorem exponentialValuation_one {K : Type*} [Field K] + (v : ExponentialValuation K) : + v (1 : K) = 0 := by + obtain ⟨r, hr⟩ := + exponentialValuation_exists_real_of_ne_zero v (one_ne_zero : (1 : K) ≠ 0) + have hmul := v.map_mul (1 : K) (1 : K) + rw [one_mul, hr] at hmul + have hmul_real : r = r + r := + WithTop.coe_eq_coe.mp (by simpa [WithTop.coe_add] using hmul) + have hr0 : r = 0 := by linarith + simp [hr, hr0] + +/-- The value of `-1` is `0` for a exponential valuation. -/ +theorem exponentialValuation_neg_one {K : Type*} [Field K] + (v : ExponentialValuation K) : + v (-1 : K) = 0 := by + obtain ⟨r, hr⟩ := + exponentialValuation_exists_real_of_ne_zero v + (neg_ne_zero.mpr (one_ne_zero : (1 : K) ≠ 0)) + have hmul := v.map_mul (-1 : K) (-1 : K) + have hsq : (-1 : K) * (-1 : K) = 1 := by ring + rw [hsq, exponentialValuation_one v, hr] at hmul + have hmul_real : (0 : ℝ) = r + r := + WithTop.coe_eq_coe.mp (by simpa [WithTop.coe_add] using hmul) + have hr0 : r = 0 := by linarith + simp [hr, hr0] + +/-- Negation does not change a exponential valuation. -/ +@[simp] +theorem exponentialValuation_neg {K : Type*} [Field K] + (v : ExponentialValuation K) (x : K) : + v (-x) = v x := by + rw [← neg_one_mul, v.map_mul, exponentialValuation_neg_one, zero_add] + +/-- An element of value zero is nonzero. -/ +theorem exponentialValuation_ne_zero_of_value_eq_zero {K : Type*} [Field K] + (v : ExponentialValuation K) {x : K} (hx : v x = 0) : + x ≠ 0 := by + intro hzero + have htop : v x = ⊤ := (v.eq_top_iff x).mpr hzero + rw [hx] at htop + simp at htop + +/-- The inverse of a value-zero element again has value zero. -/ +theorem exponentialValuation_inv_of_value_eq_zero {K : Type*} [Field K] + (v : ExponentialValuation K) {x : K} (hx : v x = 0) : + v x⁻¹ = 0 := by + have hx0 : x ≠ 0 := exponentialValuation_ne_zero_of_value_eq_zero v hx + have hmul := v.map_mul x x⁻¹ + rw [mul_inv_cancel₀ hx0, exponentialValuation_one v, hx] at hmul + simpa using hmul.symm + +/-- Finite inverse-value formula for a exponential valuation. -/ +theorem exponentialValuation_inv_value {K : Type*} [Field K] + (v : ExponentialValuation K) {x : K} (hx : x ≠ 0) {r : ℝ} + (hval : v x = (r : WithTop ℝ)) : + v x⁻¹ = ((-r : ℝ) : WithTop ℝ) := by + obtain ⟨s, hs⟩ := + exponentialValuation_exists_real_of_ne_zero v (inv_ne_zero hx) + have hmul := v.map_mul x x⁻¹ + rw [mul_inv_cancel₀ hx, exponentialValuation_one v, hval, hs] at hmul + have hmul_real : (0 : ℝ) = r + s := + WithTop.coe_eq_coe.mp (by simpa [WithTop.coe_add] using hmul) + have hs_eq : s = -r := by + linarith + simp [hs, hs_eq] + +/-- The set `{x | 0 ≤ v x}` is a subring. -/ +def exponentialValuationSubring {K : Type*} [Field K] + (v : ExponentialValuation K) : Subring K where + carrier := exponentialValuationRing v + zero_mem' := by + change (0 : WithTop ℝ) ≤ v (0 : K) + rw [(v.eq_top_iff 0).mpr rfl] + simp + one_mem' := by + change (0 : WithTop ℝ) ≤ v (1 : K) + simp + add_mem' := by + intro x y hx hy + change (0 : WithTop ℝ) ≤ v (x + y) + exact (le_min hx hy).trans (v.add_le_min x y) + neg_mem' := by + intro x hx + change (0 : WithTop ℝ) ≤ v x at hx + change (0 : WithTop ℝ) ≤ v (-x) + simpa using hx + mul_mem' := by + intro x y hx hy + change (0 : WithTop ℝ) ≤ v (x * y) + rw [v.map_mul] + exact add_nonneg hx hy + +/-- Membership in the exponential-valuation subring is exactly the defining +condition `0 ≤ v x`. -/ +theorem mem_exponentialValuationSubring_iff {K : Type*} [Field K] + (v : ExponentialValuation K) (x : K) : + x ∈ exponentialValuationSubring v ↔ (0 : WithTop ℝ) ≤ v x := + Iff.rfl + +/-- Every element of the field or its inverse lies in the exponential-valuation ring. -/ +theorem exponentialValuationRing_mem_or_inv_mem {K : Type*} [Field K] + (v : ExponentialValuation K) (x : K) : + x ∈ exponentialValuationRing v ∨ x⁻¹ ∈ exponentialValuationRing v := by + by_cases hx : x = 0 + · left + subst x + change (0 : WithTop ℝ) ≤ v (0 : K) + rw [(v.eq_top_iff 0).mpr rfl] + simp + · obtain ⟨r, hr⟩ := exponentialValuation_exists_real_of_ne_zero v hx + by_cases hr_nonneg : 0 ≤ r + · left + change (0 : WithTop ℝ) ≤ v x + rw [hr] + exact WithTop.coe_le_coe.mpr hr_nonneg + · right + have hneg_nonneg : 0 ≤ -r := by + linarith + change (0 : WithTop ℝ) ≤ v x⁻¹ + rw [exponentialValuation_inv_value v hx hr] + exact WithTop.coe_le_coe.mpr hneg_nonneg + +/-- The absolute values subring satisfies mathlib's valuation-subring +membership alternative. -/ +theorem exponentialValuationSubring_mem_or_inv_mem {K : Type*} [Field K] + (v : ExponentialValuation K) (x : K) : + x ∈ exponentialValuationSubring v ∨ + x⁻¹ ∈ exponentialValuationSubring v := by + simpa [exponentialValuationSubring] using + exponentialValuationRing_mem_or_inv_mem v x + +/-- The exponential-valuation ring, bundled as mathlib's `ValuationSubring`. -/ +def exponentialValuationSubringAsValuationSubring + {K : Type*} [Field K] (v : ExponentialValuation K) : + ValuationSubring K := + ValuationSubring.ofSubring (exponentialValuationSubring v) + (exponentialValuationSubring_mem_or_inv_mem v) + +/-- Membership in the bundled mathlib valuation subring is the defining condition +`0 ≤ v x`. -/ +theorem mem_exponentialValuationSubringAsValuationSubring_iff + {K : Type*} [Field K] (v : ExponentialValuation K) (x : K) : + x ∈ exponentialValuationSubringAsValuationSubring v ↔ + (0 : WithTop ℝ) ≤ v x := + Iff.rfl + +/-- The unit set `{x | v(x) = 0}` attached to an exponential valuation. -/ +def exponentialUnitSet {K : Type*} [Field K] + (v : ExponentialValuation K) : Set K := + {x | v x = 0} + +/-- The maximal ideal `{x | v(x) > 0}` attached to an exponential valuation. -/ +def exponentialMaxIdealSet {K : Type*} [Field K] + (v : ExponentialValuation K) : Set K := + {x | (0 : WithTop ℝ) < v x} + +/-- Equivalent exponential valuations have the same nonnegative elements. -/ +theorem equivalentExponentialValuations_value_nonneg_iff + {K : Type*} [Field K] {v w : ExponentialValuation K} + (hequiv : EquivalentExponentialValuations v w) (x : K) : + (0 : WithTop ℝ) ≤ v x ↔ (0 : WithTop ℝ) ≤ w x := by + rcases hequiv with ⟨s, hs_pos, hscale⟩ + by_cases hx : x = 0 + · subst x + simp [(v.eq_top_iff 0).mpr rfl, (w.eq_top_iff 0).mpr rfl] + · rcases hscale x hx with ⟨r, hw, hv⟩ + constructor + · intro hv_nonneg + have hsr_nonneg : 0 ≤ s * r := by + have hwt : + ((0 : ℝ) : WithTop ℝ) ≤ ((s * r : ℝ) : WithTop ℝ) := by + simpa [hv] using hv_nonneg + exact WithTop.coe_le_coe.mp hwt + have hr_nonneg : 0 ≤ r := + nonneg_of_mul_nonneg_left (by simpa [mul_comm] using hsr_nonneg) hs_pos + have hwt : ((0 : ℝ) : WithTop ℝ) ≤ (r : WithTop ℝ) := + WithTop.coe_le_coe.mpr hr_nonneg + simpa [hw] using hwt + · intro hw_nonneg + have hr_nonneg : 0 ≤ r := by + have hwt : ((0 : ℝ) : WithTop ℝ) ≤ (r : WithTop ℝ) := by + simpa [hw] using hw_nonneg + exact WithTop.coe_le_coe.mp hwt + have hsr_nonneg : 0 ≤ s * r := + mul_nonneg (le_of_lt hs_pos) hr_nonneg + have hwt : + ((0 : ℝ) : WithTop ℝ) ≤ ((s * r : ℝ) : WithTop ℝ) := + WithTop.coe_le_coe.mpr hsr_nonneg + simpa [hv] using hwt + +/-- Equivalent exponential valuations have the same value-zero elements. -/ +theorem equivalentExponentialValuations_value_eq_zero_iff + {K : Type*} [Field K] {v w : ExponentialValuation K} + (hequiv : EquivalentExponentialValuations v w) (x : K) : + v x = 0 ↔ w x = 0 := by + rcases hequiv with ⟨s, hs_pos, hscale⟩ + by_cases hx : x = 0 + · subst x + simp [(v.eq_top_iff 0).mpr rfl, (w.eq_top_iff 0).mpr rfl] + · rcases hscale x hx with ⟨r, hw, hv⟩ + constructor + · intro hv_zero + have hsr_zero : s * r = 0 := by + exact WithTop.coe_eq_coe.mp (by simpa [hv] using hv_zero) + have hr_zero : r = 0 := + (mul_eq_zero.mp hsr_zero).resolve_left hs_pos.ne' + simp [hw, hr_zero] + · intro hw_zero + have hr_zero : r = 0 := by + exact WithTop.coe_eq_coe.mp (by simpa [hw] using hw_zero) + simp [hv, hr_zero] + +/-- Equivalent exponential valuations have the same positive-value elements. -/ +theorem equivalentExponentialValuations_value_pos_iff + {K : Type*} [Field K] {v w : ExponentialValuation K} + (hequiv : EquivalentExponentialValuations v w) (x : K) : + (0 : WithTop ℝ) < v x ↔ (0 : WithTop ℝ) < w x := by + constructor + · intro hv_pos + have hw_nonneg : + (0 : WithTop ℝ) ≤ w x := + (equivalentExponentialValuations_value_nonneg_iff hequiv x).mp + (le_of_lt hv_pos) + have hw_ne_zero : w x ≠ 0 := by + intro hw_zero + have hv_zero : + v x = 0 := + (equivalentExponentialValuations_value_eq_zero_iff hequiv x).mpr + hw_zero + exact (ne_of_gt hv_pos) hv_zero + exact lt_of_le_of_ne hw_nonneg (Ne.symm hw_ne_zero) + · intro hw_pos + have hv_nonneg : + (0 : WithTop ℝ) ≤ v x := + (equivalentExponentialValuations_value_nonneg_iff hequiv x).mpr + (le_of_lt hw_pos) + have hv_ne_zero : v x ≠ 0 := by + intro hv_zero + have hw_zero : + w x = 0 := + (equivalentExponentialValuations_value_eq_zero_iff hequiv x).mp + hv_zero + exact (ne_of_gt hw_pos) hw_zero + exact lt_of_le_of_ne hv_nonneg (Ne.symm hv_ne_zero) + +/-- Equivalent exponential valuations have the same exponential-valuation ring. -/ +theorem equivalentExponentialValuations_ring_eq + {K : Type*} [Field K] {v w : ExponentialValuation K} + (hequiv : EquivalentExponentialValuations v w) : + exponentialValuationRing v = exponentialValuationRing w := by + ext x + exact equivalentExponentialValuations_value_nonneg_iff hequiv x + +/-- Equivalent exponential valuations have the same bundled valuation subring. -/ +theorem equivalentExponentialValuations_subring_eq + {K : Type*} [Field K] {v w : ExponentialValuation K} + (hequiv : EquivalentExponentialValuations v w) : + exponentialValuationSubring v = exponentialValuationSubring w := by + ext x + exact equivalentExponentialValuations_value_nonneg_iff hequiv x + +/-- Equivalent exponential valuations define the same mathlib valuation +subring. -/ +theorem equivalentExponentialValuations_valuationSubring_eq + {K : Type*} [Field K] {v w : ExponentialValuation K} + (hequiv : EquivalentExponentialValuations v w) : + exponentialValuationSubringAsValuationSubring v = + exponentialValuationSubringAsValuationSubring w := by + ext x + exact equivalentExponentialValuations_value_nonneg_iff hequiv x + +/-- Equivalent exponential valuations have the same unit set. -/ +theorem equivalentExponentialValuations_unitSet_eq + {K : Type*} [Field K] {v w : ExponentialValuation K} + (hequiv : EquivalentExponentialValuations v w) : + exponentialUnitSet v = exponentialUnitSet w := by + ext x + exact equivalentExponentialValuations_value_eq_zero_iff hequiv x + +/-- Equivalent exponential valuations have the same positive-value ideal set. -/ +theorem equivalentExponentialValuations_maxIdealSet_eq + {K : Type*} [Field K] {v w : ExponentialValuation K} + (hequiv : EquivalentExponentialValuations v w) : + exponentialMaxIdealSet v = exponentialMaxIdealSet w := by + ext x + exact equivalentExponentialValuations_value_pos_iff hequiv x + +/-- For an associated multiplicative absolute value, `|x| ≤ 1` is the same as +the exponential value being nonnegative. -/ +theorem associatedAbsoluteValue_le_one_iff + {K : Type*} [Field K] {v : ExponentialValuation K} + {q : ℝ} {abv : AbsoluteValue K ℝ} + (hassoc : AssociatedAbsoluteValue v q abv) {x : K} (hx : x ≠ 0) : + abv x ≤ 1 ↔ (0 : WithTop ℝ) ≤ v x := by + rcases hassoc.2 x hx with ⟨r, hval, habv⟩ + have hq : 1 < q := hassoc.1 + have hq_pos : 0 < q := zero_lt_one.trans hq + have hq_not_le_one : ¬ q ≤ 1 := not_le.mpr hq + constructor + · intro habv_le + have hpow : q ^ (-r) ≤ 1 := by + simpa [habv] using habv_le + have hneg_nonpos : -r ≤ 0 := by + rcases (Real.rpow_le_one_iff_of_pos hq_pos).mp hpow with hcase | hcase + · exact hcase.2 + · exact (hq_not_le_one hcase.1).elim + have hr_nonneg : 0 ≤ r := by linarith + have hwt : ((0 : ℝ) : WithTop ℝ) ≤ (r : WithTop ℝ) := + WithTop.coe_le_coe.mpr hr_nonneg + simpa [hval] using hwt + · intro hval_nonneg + have hr_nonneg : 0 ≤ r := by + have hwt : ((0 : ℝ) : WithTop ℝ) ≤ (r : WithTop ℝ) := by + simpa [hval] using hval_nonneg + exact WithTop.coe_le_coe.mp hwt + have hneg_nonpos : -r ≤ 0 := by linarith + have hpow : q ^ (-r) ≤ 1 := + Real.rpow_le_one_of_one_le_of_nonpos (le_of_lt hq) hneg_nonpos + simpa [habv] using hpow + +/-- For an associated multiplicative absolute value, `|x| < 1` is the same as +the exponential value being positive. -/ +theorem associatedAbsoluteValue_lt_one_iff + {K : Type*} [Field K] {v : ExponentialValuation K} + {q : ℝ} {abv : AbsoluteValue K ℝ} + (hassoc : AssociatedAbsoluteValue v q abv) {x : K} (hx : x ≠ 0) : + abv x < 1 ↔ (0 : WithTop ℝ) < v x := by + rcases hassoc.2 x hx with ⟨r, hval, habv⟩ + have hq : 1 < q := hassoc.1 + have hq_pos : 0 < q := zero_lt_one.trans hq + have hq_not_lt_one : ¬ q < 1 := not_lt.mpr (le_of_lt hq) + constructor + · intro habv_lt + have hpow : q ^ (-r) < 1 := by + simpa [habv] using habv_lt + have hneg_neg : -r < 0 := by + rcases (Real.rpow_lt_one_iff_of_pos hq_pos).mp hpow with hcase | hcase + · exact hcase.2 + · exact (hq_not_lt_one hcase.1).elim + have hr_pos : 0 < r := by linarith + have hwt : ((0 : ℝ) : WithTop ℝ) < (r : WithTop ℝ) := + WithTop.coe_lt_coe.mpr hr_pos + simpa [hval] using hwt + · intro hval_pos + have hr_pos : 0 < r := by + have hwt : ((0 : ℝ) : WithTop ℝ) < (r : WithTop ℝ) := by + simpa [hval] using hval_pos + exact WithTop.coe_lt_coe.mp hwt + have hneg_neg : -r < 0 := by linarith + have hpow : q ^ (-r) < 1 := + Real.rpow_lt_one_of_one_lt_of_neg hq hneg_neg + simpa [habv] using hpow + +/-- For an associated multiplicative absolute value, `|x| = 1` is the same as +the exponential value being zero. -/ +theorem associatedAbsoluteValue_eq_one_iff + {K : Type*} [Field K] {v : ExponentialValuation K} + {q : ℝ} {abv : AbsoluteValue K ℝ} + (hassoc : AssociatedAbsoluteValue v q abv) {x : K} (hx : x ≠ 0) : + abv x = 1 ↔ v x = 0 := by + constructor + · intro habv_one + have hle : (0 : WithTop ℝ) ≤ v x := + (associatedAbsoluteValue_le_one_iff + (v := v) (q := q) (abv := abv) hassoc hx).mp + (le_of_eq habv_one) + have hnlt : ¬ (0 : WithTop ℝ) < v x := by + intro hvpos + have habv_lt : + abv x < 1 := + (associatedAbsoluteValue_lt_one_iff + (v := v) (q := q) (abv := abv) hassoc hx).mpr hvpos + exact (not_lt_of_ge (le_of_eq habv_one.symm)) habv_lt + exact le_antisymm (le_of_not_gt hnlt) hle + · intro hvzero + have hle : abv x ≤ 1 := + (associatedAbsoluteValue_le_one_iff + (v := v) (q := q) (abv := abv) hassoc hx).mpr + (by simp [hvzero]) + have hnlt : ¬ abv x < 1 := by + intro habv_lt + have hvpos : + (0 : WithTop ℝ) < v x := + (associatedAbsoluteValue_lt_one_iff + (v := v) (q := q) (abv := abv) hassoc hx).mp habv_lt + simp [hvzero] at hvpos + exact le_antisymm hle (le_of_not_gt hnlt) + +/-- The valuation ring of an exponential valuation is the closed unit ball for +any associated multiplicative absolute value. -/ +theorem associatedAbsoluteValue_ring_eq_closed_unit_ball + {K : Type*} [Field K] {v : ExponentialValuation K} + {q : ℝ} {abv : AbsoluteValue K ℝ} + (hassoc : AssociatedAbsoluteValue v q abv) : + exponentialValuationRing v = {x : K | abv x ≤ 1} := by + ext x + by_cases hx : x = 0 + · subst x + simp [exponentialValuationRing, (v.eq_top_iff 0).mpr rfl] + · simpa [exponentialValuationRing] using + (associatedAbsoluteValue_le_one_iff + (v := v) (q := q) (abv := abv) hassoc hx).symm + +/-- The zero-value unit set `{x | v x = 0}` is the unit sphere for any associated +multiplicative absolute value. -/ +theorem associatedAbsoluteValue_unitSet_eq_unit_sphere + {K : Type*} [Field K] {v : ExponentialValuation K} + {q : ℝ} {abv : AbsoluteValue K ℝ} + (hassoc : AssociatedAbsoluteValue v q abv) : + exponentialUnitSet v = {x : K | abv x = 1} := by + ext x + by_cases hx : x = 0 + · subst x + simp [exponentialUnitSet, (v.eq_top_iff 0).mpr rfl] + · simpa [exponentialUnitSet] using + (associatedAbsoluteValue_eq_one_iff + (v := v) (q := q) (abv := abv) hassoc hx).symm + +/-- The positive-value ideal of an exponential valuation is the open unit ball +for any associated multiplicative absolute value. -/ +theorem associatedAbsoluteValue_maxIdealSet_eq_open_unit_ball + {K : Type*} [Field K] {v : ExponentialValuation K} + {q : ℝ} {abv : AbsoluteValue K ℝ} + (hassoc : AssociatedAbsoluteValue v q abv) : + exponentialMaxIdealSet v = {x : K | abv x < 1} := by + ext x + by_cases hx : x = 0 + · subst x + simp [exponentialMaxIdealSet, (v.eq_top_iff 0).mpr rfl] + · simpa [exponentialMaxIdealSet] using + (associatedAbsoluteValue_lt_one_iff + (v := v) (q := q) (abv := abv) hassoc hx).symm + +/-- Elements of value zero lie in the valuation subring. -/ +theorem exponentialUnitSet_subset_ring {K : Type*} [Field K] + (v : ExponentialValuation K) : + exponentialUnitSet v ⊆ exponentialValuationRing v := by + intro x hx + change (0 : WithTop ℝ) ≤ v x + rw [hx] + +/-- Elements of positive value lie in the valuation subring. -/ +theorem exponentialMaxIdealSet_subset_ring {K : Type*} [Field K] + (v : ExponentialValuation K) : + exponentialMaxIdealSet v ⊆ exponentialValuationRing v := by + intro x hx + change (0 : WithTop ℝ) < v x at hx + change (0 : WithTop ℝ) ≤ v x + exact le_of_lt hx + +/-- The positive-value elements form an ideal of the exponential-valuation ring. -/ +def exponentialMaxIdeal {K : Type*} [Field K] + (v : ExponentialValuation K) : Ideal (exponentialValuationSubring v) where + carrier := {x | (0 : WithTop ℝ) < v (x : K)} + zero_mem' := by + change (0 : WithTop ℝ) < v (0 : K) + rw [(v.eq_top_iff 0).mpr rfl] + simp + add_mem' := by + intro x y hx hy + change (0 : WithTop ℝ) < v ((x + y : exponentialValuationSubring v) : K) + have hmin : (0 : WithTop ℝ) < min (v (x : K)) (v (y : K)) := + lt_min hx hy + exact lt_of_lt_of_le hmin (by simpa using v.add_le_min (x : K) (y : K)) + smul_mem' := by + intro a x hx + change (0 : WithTop ℝ) < v ((a : K) * (x : K)) + have ha : (0 : WithTop ℝ) ≤ v (a : K) := a.property + rw [v.map_mul] + have hx_le : v (x : K) ≤ v (a : K) + v (x : K) := by + simpa [zero_add] using + (add_le_add ha (le_rfl : v (x : K) ≤ v (x : K))) + exact lt_of_lt_of_le hx hx_le + +/-- Membership in the bundled positive-value ideal is the defining condition `0 < v x`. -/ +theorem mem_exponentialMaxIdeal_iff {K : Type*} [Field K] + (v : ExponentialValuation K) (x : exponentialValuationSubring v) : + x ∈ exponentialMaxIdeal v ↔ (0 : WithTop ℝ) < v (x : K) := + Iff.rfl + +/-- The unit element is not in the positive-value ideal. -/ +theorem one_not_mem_exponentialMaxIdeal {K : Type*} [Field K] + (v : ExponentialValuation K) : + (1 : exponentialValuationSubring v) ∉ exponentialMaxIdeal v := by + change ¬ (0 : WithTop ℝ) < v (1 : K) + simp + +/-- Inside the valuation ring, not lying in the positive-value ideal is the same +as having value zero. -/ +theorem not_mem_exponentialMaxIdeal_iff_value_eq_zero {K : Type*} [Field K] + (v : ExponentialValuation K) (x : exponentialValuationSubring v) : + x ∉ exponentialMaxIdeal v ↔ v (x : K) = 0 := by + constructor + · intro hx + change ¬ (0 : WithTop ℝ) < v (x : K) at hx + exact le_antisymm (le_of_not_gt hx) x.property + · intro hx + change ¬ (0 : WithTop ℝ) < v (x : K) + simp [hx] + +/-- Value-zero elements of the valuation ring are units of that ring. -/ +theorem isUnit_of_exponentialValuation_eq_zero {K : Type*} [Field K] + (v : ExponentialValuation K) {x : exponentialValuationSubring v} + (hx : v (x : K) = 0) : + IsUnit x := by + rw [Submonoid.isUnit_iff_and (S := exponentialValuationSubring v) (a := x)] + constructor + · exact exponentialValuation_ne_zero_of_value_eq_zero v hx + · change (0 : WithTop ℝ) ≤ v ((x : K)⁻¹) + simp [exponentialValuation_inv_of_value_eq_zero v hx] + +/-- Units of the valuation ring have value zero. -/ +theorem exponentialValuation_eq_zero_of_isUnit {K : Type*} [Field K] + (v : ExponentialValuation K) {x : exponentialValuationSubring v} + (hx : IsUnit x) : + v (x : K) = 0 := by + have hx_inv := + (Submonoid.isUnit_iff_and (S := exponentialValuationSubring v) (a := x)).mp hx + have hx_nonneg : (0 : WithTop ℝ) ≤ v (x : K) := x.property + have hinv_nonneg : (0 : WithTop ℝ) ≤ v ((x : K)⁻¹) := hx_inv.2 + have hmul := v.map_mul (x : K) ((x : K)⁻¹) + rw [mul_inv_cancel₀ hx_inv.1, exponentialValuation_one v] at hmul + have hx_le_zero : v (x : K) ≤ 0 := by + calc + v (x : K) ≤ v (x : K) + v ((x : K)⁻¹) := + le_add_of_nonneg_right hinv_nonneg + _ = 0 := hmul.symm + exact le_antisymm hx_le_zero hx_nonneg + +/-- A valuation-ring element outside the positive-value ideal is a unit. -/ +theorem isUnit_of_not_mem_exponentialMaxIdeal {K : Type*} [Field K] + (v : ExponentialValuation K) {x : exponentialValuationSubring v} + (hx : x ∉ exponentialMaxIdeal v) : + IsUnit x := + isUnit_of_exponentialValuation_eq_zero v + ((not_mem_exponentialMaxIdeal_iff_value_eq_zero v x).mp hx) + +/-- Units of the valuation ring do not lie in the positive-value ideal. -/ +theorem not_mem_exponentialMaxIdeal_of_isUnit {K : Type*} [Field K] + (v : ExponentialValuation K) {x : exponentialValuationSubring v} + (hx : IsUnit x) : + x ∉ exponentialMaxIdeal v := by + have hzero : v (x : K) = 0 := + exponentialValuation_eq_zero_of_isUnit v hx + change ¬ (0 : WithTop ℝ) < v (x : K) + simp [hzero] + +/-- In the valuation ring, the units are exactly the complement of the +positive-value ideal. -/ +theorem isUnit_iff_not_mem_exponentialMaxIdeal {K : Type*} [Field K] + (v : ExponentialValuation K) (x : exponentialValuationSubring v) : + IsUnit x ↔ x ∉ exponentialMaxIdeal v := by + constructor + · exact not_mem_exponentialMaxIdeal_of_isUnit v + · exact isUnit_of_not_mem_exponentialMaxIdeal v + +/-- For an associated absolute value, the units of the valuation ring are +exactly the elements of absolute value `1`. -/ +theorem associatedAbsoluteValue_isUnit_iff_eq_one + {K : Type*} [Field K] {v : ExponentialValuation K} + {q : ℝ} {abv : AbsoluteValue K ℝ} + (hassoc : AssociatedAbsoluteValue v q abv) + (x : exponentialValuationSubring v) : + IsUnit x ↔ abv (x : K) = 1 := by + constructor + · intro hx + have hvzero : v (x : K) = 0 := + exponentialValuation_eq_zero_of_isUnit v hx + have hx0 : (x : K) ≠ 0 := + exponentialValuation_ne_zero_of_value_eq_zero v hvzero + exact + (associatedAbsoluteValue_eq_one_iff + (v := v) (q := q) (abv := abv) hassoc hx0).mpr hvzero + · intro habv_one + have hx0 : (x : K) ≠ 0 := by + intro hx_zero + have hzero : abv (x : K) = 0 := by + simp [hx_zero] + rw [hzero] at habv_one + norm_num at habv_one + have hvzero : v (x : K) = 0 := + (associatedAbsoluteValue_eq_one_iff + (v := v) (q := q) (abv := abv) hassoc hx0).mp habv_one + exact isUnit_of_exponentialValuation_eq_zero v hvzero + +/-- The positive-value ideal is maximal in the exponential-valuation ring. -/ +theorem exponentialMaxIdeal_isMaximal {K : Type*} [Field K] + (v : ExponentialValuation K) : + (exponentialMaxIdeal v).IsMaximal := by + rw [Ideal.isMaximal_iff] + constructor + · exact one_not_mem_exponentialMaxIdeal v + · intro J x hIJ hx_not_mem hxJ + exact (Ideal.eq_top_iff_one J).mp + (J.eq_top_of_isUnit_mem hxJ + ((isUnit_iff_not_mem_exponentialMaxIdeal v x).mpr hx_not_mem)) + +/-- The exponential-valuation ring is local. -/ +instance exponentialValuationSubringIsLocalRing {K : Type*} [Field K] + (v : ExponentialValuation K) : + IsLocalRing (exponentialValuationSubring v) := + IsLocalRing.of_nonunits_add fun x y hx hy => by + have hx_mem : x ∈ exponentialMaxIdeal v := by + by_contra hx_not_mem + exact hx ((isUnit_iff_not_mem_exponentialMaxIdeal v x).mpr hx_not_mem) + have hy_mem : y ∈ exponentialMaxIdeal v := by + by_contra hy_not_mem + exact hy ((isUnit_iff_not_mem_exponentialMaxIdeal v y).mpr hy_not_mem) + have hxy_mem : x + y ∈ exponentialMaxIdeal v := + (exponentialMaxIdeal v).add_mem hx_mem hy_mem + exact fun hxy_unit => + (not_mem_exponentialMaxIdeal_of_isUnit v hxy_unit) hxy_mem + +/-- The positive-value ideal agrees with mathlib's maximal ideal of the +valuation ring. -/ +theorem exponentialMaxIdeal_eq_maximalIdeal {K : Type*} [Field K] + (v : ExponentialValuation K) : + exponentialMaxIdeal v = + IsLocalRing.maximalIdeal (exponentialValuationSubring v) := + IsLocalRing.eq_maximalIdeal (exponentialMaxIdeal_isMaximal v) + +/-- A discrete exponential valuation has a positive generator for its value group. -/ +def DiscreteExponentialValuation {K : Type*} [Field K] + (v : ExponentialValuation K) : Prop := + ∃ s : ℝ, 0 < s ∧ + (∀ x : K, x ≠ 0 → ∃ m : ℤ, v x = (((m : ℝ) * s : ℝ) : WithTop ℝ)) ∧ + ∃ π : K, v π = (s : WithTop ℝ) + +/-- A normalized discrete exponential valuation has value group `ℤ` +and a prime element of value `1`. +-/ +def NormalizedExponentialValuation {K : Type*} [Field K] + (v : ExponentialValuation K) : Prop := + DiscreteExponentialValuation v ∧ + (∀ x : K, x ≠ 0 → ∃ m : ℤ, v x = ((m : ℝ) : WithTop ℝ)) ∧ + ∃ π : K, v π = (1 : WithTop ℝ) + +/-- A prime element for a normalized exponential valuation. -/ +def PrimeElementFor {K : Type*} [Field K] + (v : ExponentialValuation K) (π : K) : Prop := + π ≠ 0 ∧ v π = (1 : WithTop ℝ) + +/-- Value `1` gives a prime element for a normalized exponential valuation. -/ +theorem primeElementFor_of_value_eq_one {K : Type*} [Field K] + (v : ExponentialValuation K) {π : K} + (hπ : v π = (1 : WithTop ℝ)) : + PrimeElementFor v π := by + constructor + · intro hzero + have htop : v π = ⊤ := (v.eq_top_iff π).mpr hzero + rw [hπ] at htop + simp at htop + · exact hπ + +/-- A normalized exponential valuation has a normalized prime element. -/ +theorem normalizedExponentialValuation_exists_primeElement + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : NormalizedExponentialValuation v) : + ∃ π : K, PrimeElementFor v π := by + rcases hv.2.2 with ⟨π, hπ⟩ + exact ⟨π, primeElementFor_of_value_eq_one v hπ⟩ + +/-- A normalized prime element, regarded as an element of the valuation ring. -/ +def primeElementInValuationSubring {K : Type*} [Field K] + (v : ExponentialValuation K) {π : K} + (hπ : PrimeElementFor v π) : + exponentialValuationSubring v := + ⟨π, by + change (0 : WithTop ℝ) ≤ v π + rw [hπ.2] + change ((0 : ℝ) : WithTop ℝ) ≤ ((1 : ℝ) : WithTop ℝ) + exact WithTop.coe_le_coe.mpr zero_le_one⟩ + +/-- A normalized prime element lies in the positive-value maximal ideal. -/ +theorem primeElement_mem_exponentialMaxIdeal + {K : Type*} [Field K] (v : ExponentialValuation K) {π : K} + (hπ : PrimeElementFor v π) : + primeElementInValuationSubring v hπ ∈ exponentialMaxIdeal v := by + change (0 : WithTop ℝ) < v π + rw [hπ.2] + change ((0 : ℝ) : WithTop ℝ) < ((1 : ℝ) : WithTop ℝ) + exact WithTop.coe_lt_coe.mpr zero_lt_one + +/-- A normalized prime element lies in mathlib's maximal ideal of the valuation ring. -/ +theorem primeElement_mem_maximalIdeal + {K : Type*} [Field K] (v : ExponentialValuation K) {π : K} + (hπ : PrimeElementFor v π) : + primeElementInValuationSubring v hπ ∈ + IsLocalRing.maximalIdeal (exponentialValuationSubring v) := by + rw [← exponentialMaxIdeal_eq_maximalIdeal v] + exact primeElement_mem_exponentialMaxIdeal v hπ + +/-- A normalized prime element is nonzero as an element of the valuation ring. -/ +theorem primeElementInValuationSubring_ne_zero + {K : Type*} [Field K] (v : ExponentialValuation K) {π : K} + (hπ : PrimeElementFor v π) : + primeElementInValuationSubring v hπ ≠ 0 := by + intro hzero + exact hπ.1 (by + simpa [primeElementInValuationSubring] using + congrArg (fun x : exponentialValuationSubring v => (x : K)) hzero) + +/-- A normalized prime element is not a unit of the valuation ring. -/ +theorem primeElementInValuationSubring_not_isUnit + {K : Type*} [Field K] (v : ExponentialValuation K) {π : K} + (hπ : PrimeElementFor v π) : + ¬ IsUnit (primeElementInValuationSubring v hπ) := by + intro hunit + exact + (not_mem_exponentialMaxIdeal_of_isUnit v hunit) + (primeElement_mem_exponentialMaxIdeal v hπ) + +/-- The inverse of a normalized prime element has value `-1`. -/ +theorem primeElementFor_inv_value {K : Type*} [Field K] + (v : ExponentialValuation K) {π : K} + (hπ : PrimeElementFor v π) : + v π⁻¹ = ((-1 : ℝ) : WithTop ℝ) := by + obtain ⟨s, hs⟩ := + exponentialValuation_exists_real_of_ne_zero v (inv_ne_zero hπ.1) + have hmul := v.map_mul π π⁻¹ + rw [mul_inv_cancel₀ hπ.1, exponentialValuation_one v, hπ.2, hs] at hmul + have hmul_real : (0 : ℝ) = 1 + s := + WithTop.coe_eq_coe.mp (by simpa [WithTop.coe_add] using hmul) + have hs_eq : s = -1 := by + linarith + simp [hs, hs_eq] + +/-- Powers of a normalized prime element have the expected normalized value. -/ +theorem primeElementFor_pow_value {K : Type*} [Field K] + (v : ExponentialValuation K) {π : K} + (hπ : PrimeElementFor v π) (n : ℕ) : + v (π ^ n) = ((n : ℝ) : WithTop ℝ) := by + induction n with + | zero => + simp + | succ n ih => + rw [pow_succ, v.map_mul, ih, hπ.2] + norm_num [Nat.cast_succ, WithTop.coe_add] + +/-- Powers of a normalized prime element are nonzero in the ambient field. -/ +theorem primeElementFor_pow_ne_zero {K : Type*} [Field K] + (v : ExponentialValuation K) {π : K} + (hπ : PrimeElementFor v π) (n : ℕ) : + π ^ n ≠ 0 := + pow_ne_zero n hπ.1 + +/-- Integer powers of a normalized prime element have the expected normalized value. -/ +theorem primeElementFor_zpow_value {K : Type*} [Field K] + (v : ExponentialValuation K) {π : K} + (hπ : PrimeElementFor v π) (m : ℤ) : + v (π ^ m) = ((m : ℝ) : WithTop ℝ) := by + cases m with + | ofNat n => + simpa [zpow_natCast] using primeElementFor_pow_value v hπ n + | negSucc n => + have hpow_ne : π ^ (n + 1) ≠ 0 := + pow_ne_zero (n + 1) hπ.1 + have hpow_val : + v (π ^ (n + 1)) = (((n + 1 : ℕ) : ℝ) : WithTop ℝ) := + primeElementFor_pow_value v hπ (n + 1) + have hinv : + v ((π ^ (n + 1))⁻¹) = + ((-(((n + 1 : ℕ) : ℝ)) : ℝ) : WithTop ℝ) := + exponentialValuation_inv_value v hpow_ne hpow_val + simpa [zpow_negSucc, Int.cast_negSucc, Nat.cast_add, Nat.cast_one] using hinv + +/-- A unit times an integer power of a normalized prime element has value equal to the +exponent. -/ +theorem primeElementFor_unit_mul_zpow_value + {K : Type*} [Field K] (v : ExponentialValuation K) {π : K} + (hπ : PrimeElementFor v π) + (u : exponentialValuationSubring v) (hu : IsUnit u) (m : ℤ) : + v ((u : K) * π ^ m) = ((m : ℝ) : WithTop ℝ) := by + have hu_val : v (u : K) = 0 := + exponentialValuation_eq_zero_of_isUnit v hu + rw [v.map_mul, hu_val, primeElementFor_zpow_value v hπ m] + simp + +/-- For a normalized exponential valuation and a normalized prime element, every +nonzero field element is a unit times an integer power of the prime element. -/ +theorem normalizedExponentialValuation_exists_unit_mul_zpow + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : NormalizedExponentialValuation v) {π x : K} + (hπ : PrimeElementFor v π) (hx : x ≠ 0) : + ∃ m : ℤ, ∃ u : exponentialValuationSubring v, + IsUnit u ∧ x = (u : K) * π ^ m := by + rcases hv.2.1 x hx with ⟨m, hm⟩ + have hπm_ne : π ^ m ≠ 0 := + zpow_ne_zero m hπ.1 + have hπm_val : v (π ^ m) = ((m : ℝ) : WithTop ℝ) := + primeElementFor_zpow_value v hπ m + have hπm_inv_val : + v ((π ^ m)⁻¹) = ((-(m : ℝ) : ℝ) : WithTop ℝ) := + exponentialValuation_inv_value v hπm_ne hπm_val + let uK : K := x * (π ^ m)⁻¹ + have hu_val : v uK = 0 := by + dsimp [uK] + rw [v.map_mul, hm, hπm_inv_val] + norm_num [WithTop.coe_add] + have hu_mem : uK ∈ exponentialValuationSubring v := by + change (0 : WithTop ℝ) ≤ v uK + rw [hu_val] + let u : exponentialValuationSubring v := ⟨uK, hu_mem⟩ + have hu_val_sub : v (u : K) = 0 := by + simpa [u, uK] using hu_val + refine ⟨m, u, isUnit_of_exponentialValuation_eq_zero v hu_val_sub, ?_⟩ + change x = (x * (π ^ m)⁻¹) * π ^ m + rw [mul_assoc, inv_mul_cancel₀ hπm_ne, mul_one] + +/-- For a fixed integer exponent, the unit in a representation `u * π^m` is +unique. -/ +theorem primeElementFor_unit_mul_zpow_unit_unique + {K : Type*} [Field K] {v : ExponentialValuation K} {π : K} + (hπ : PrimeElementFor v π) {m : ℤ} + {u t : exponentialValuationSubring v} + (h : (u : K) * π ^ m = (t : K) * π ^ m) : + u = t := by + apply Subtype.ext + exact mul_right_cancel₀ (zpow_ne_zero m hπ.1) h + +/-- The exponent in a representation `u * π^m` by a unit and a normalized prime +element is unique. -/ +theorem primeElementFor_unit_mul_zpow_exponent_unique + {K : Type*} [Field K] (v : ExponentialValuation K) {π : K} + (hπ : PrimeElementFor v π) + {m n : ℤ} {u t : exponentialValuationSubring v} + (hu : IsUnit u) (ht : IsUnit t) + (h : (u : K) * π ^ m = (t : K) * π ^ n) : + m = n := by + have hmval := primeElementFor_unit_mul_zpow_value v hπ u hu m + have hnval := primeElementFor_unit_mul_zpow_value v hπ t ht n + have hcoe : ((m : ℝ) : WithTop ℝ) = ((n : ℝ) : WithTop ℝ) := by + rw [← hmval, h, hnval] + have hreal : (m : ℝ) = (n : ℝ) := + WithTop.coe_eq_coe.mp hcoe + exact Int.cast_inj.mp hreal + +/-- The canonical representation `x = u * π^m` is unique: both the exponent and +the unit are determined by the represented element. -/ +theorem primeElementFor_unit_mul_zpow_unique + {K : Type*} [Field K] (v : ExponentialValuation K) {π : K} + (hπ : PrimeElementFor v π) + {m n : ℤ} {u t : exponentialValuationSubring v} + (hu : IsUnit u) (ht : IsUnit t) + (h : (u : K) * π ^ m = (t : K) * π ^ n) : + m = n ∧ u = t := by + have hmn : m = n := + primeElementFor_unit_mul_zpow_exponent_unique v hπ hu ht h + have hunit : u = t := by + apply primeElementFor_unit_mul_zpow_unit_unique hπ + simpa [hmn] using h + exact ⟨hmn, hunit⟩ + +/-- In a normalized exponential valuation, every nonzero element has a unique +normalized representation as a unit times an integer power of a prime element. -/ +theorem normalizedExponentialValuation_exists_unique_unit_mul_zpow + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : NormalizedExponentialValuation v) {π x : K} + (hπ : PrimeElementFor v π) (hx : x ≠ 0) : + ∃ m : ℤ, ∃ u : exponentialValuationSubring v, + IsUnit u ∧ x = (u : K) * π ^ m ∧ + ∀ n : ℤ, ∀ t : exponentialValuationSubring v, + IsUnit t → x = (t : K) * π ^ n → n = m ∧ t = u := by + rcases normalizedExponentialValuation_exists_unit_mul_zpow hv hπ hx with + ⟨m, u, hu, hrep⟩ + refine ⟨m, u, hu, hrep, ?_⟩ + intro n t ht ht_rep + have htu : (t : K) * π ^ n = (u : K) * π ^ m := by + rw [← ht_rep, hrep] + have huniq := + primeElementFor_unit_mul_zpow_unique v hπ ht hu htu + exact huniq + +/-- The same power-value formula for the prime element viewed inside the +valuation ring. -/ +theorem primeElementInValuationSubring_pow_value + {K : Type*} [Field K] (v : ExponentialValuation K) {π : K} + (hπ : PrimeElementFor v π) (n : ℕ) : + v ((primeElementInValuationSubring v hπ : exponentialValuationSubring v) ^ n : K) = + ((n : ℝ) : WithTop ℝ) := by + change v (π ^ n) = ((n : ℝ) : WithTop ℝ) + exact primeElementFor_pow_value v hπ n + +/-- In a normalized exponential valuation, a normalized prime element generates the +positive-value maximal ideal. -/ +theorem exponentialMaxIdeal_eq_span_primeElement_of_normalized + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : NormalizedExponentialValuation v) {π : K} + (hπ : PrimeElementFor v π) : + exponentialMaxIdeal v = + Ideal.span + ({primeElementInValuationSubring v hπ} : + Set (exponentialValuationSubring v)) := by + apply le_antisymm + · intro x hx + change (0 : WithTop ℝ) < v (x : K) at hx + by_cases hx0 : (x : K) = 0 + · have hx_eq : x = 0 := Subtype.ext hx0 + rw [hx_eq] + exact + Ideal.zero_mem + (Ideal.span + ({primeElementInValuationSubring v hπ} : + Set (exponentialValuationSubring v))) + · rcases hv.2.1 (x : K) hx0 with ⟨m, hm⟩ + have hxpos_real : (0 : ℝ) < (m : ℝ) := by + have hxpos_wt : + ((0 : ℝ) : WithTop ℝ) < ((m : ℝ) : WithTop ℝ) := by + simpa [hm] using hx + exact WithTop.coe_lt_coe.mp hxpos_wt + have hm_pos : (0 : ℤ) < m := by + exact Int.cast_pos.mp hxpos_real + have hm_ge_one : (1 : ℤ) ≤ m := by + omega + have hm_sub_nonneg : (0 : ℝ) ≤ (m : ℝ) - 1 := by + have hm_real : (1 : ℝ) ≤ (m : ℝ) := by + exact_mod_cast hm_ge_one + linarith + have hπinv : v π⁻¹ = ((-1 : ℝ) : WithTop ℝ) := + primeElementFor_inv_value v hπ + have hy_val : + v ((x : K) * π⁻¹) = (((m : ℝ) - 1 : ℝ) : WithTop ℝ) := by + rw [v.map_mul, hm, hπinv] + simp [sub_eq_add_neg, add_comm] + have hy_mem : (x : K) * π⁻¹ ∈ exponentialValuationSubring v := by + change (0 : WithTop ℝ) ≤ v ((x : K) * π⁻¹) + rw [hy_val] + change ((0 : ℝ) : WithTop ℝ) ≤ (((m : ℝ) - 1 : ℝ) : WithTop ℝ) + exact WithTop.coe_le_coe.mpr hm_sub_nonneg + let y : exponentialValuationSubring v := ⟨(x : K) * π⁻¹, hy_mem⟩ + refine Ideal.mem_span_singleton'.mpr ⟨y, ?_⟩ + apply Subtype.ext + change ((x : K) * π⁻¹) * π = (x : K) + rw [mul_assoc, inv_mul_cancel₀ hπ.1, mul_one] + · exact + (Ideal.span_singleton_le_iff_mem + (I := exponentialMaxIdeal v) + (x := primeElementInValuationSubring v hπ)).mpr + (primeElement_mem_exponentialMaxIdeal v hπ) + +/-- A normalized prime element generates mathlib's maximal ideal of the valuation +ring for a normalized exponential valuation. -/ +theorem maximalIdeal_eq_span_primeElement_of_normalized + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : NormalizedExponentialValuation v) {π : K} + (hπ : PrimeElementFor v π) : + IsLocalRing.maximalIdeal (exponentialValuationSubring v) = + Ideal.span + ({primeElementInValuationSubring v hπ} : + Set (exponentialValuationSubring v)) := by + rw [← exponentialMaxIdeal_eq_maximalIdeal v] + exact exponentialMaxIdeal_eq_span_primeElement_of_normalized hv hπ + +/-- The principal ideal generated by a normalized prime element is maximal. -/ +theorem span_primeElement_isMaximal_of_normalized + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : NormalizedExponentialValuation v) {π : K} + (hπ : PrimeElementFor v π) : + (Ideal.span + ({primeElementInValuationSubring v hπ} : + Set (exponentialValuationSubring v))).IsMaximal := by + rw [← maximalIdeal_eq_span_primeElement_of_normalized hv hπ] + exact IsLocalRing.maximalIdeal.isMaximal (exponentialValuationSubring v) + +/-- The principal ideal generated by a normalized prime element is prime. -/ +theorem span_primeElement_isPrime_of_normalized + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : NormalizedExponentialValuation v) {π : K} + (hπ : PrimeElementFor v π) : + (Ideal.span + ({primeElementInValuationSubring v hπ} : + Set (exponentialValuationSubring v))).IsPrime := + Ideal.IsMaximal.isPrime + (span_primeElement_isMaximal_of_normalized hv hπ) + +/-- A normalized prime element is prime as an element of the valuation ring. -/ +theorem primeElementInValuationSubring_prime_of_normalized + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : NormalizedExponentialValuation v) {π : K} + (hπ : PrimeElementFor v π) : + Prime (primeElementInValuationSubring v hπ) := + (Ideal.span_singleton_prime + (primeElementInValuationSubring_ne_zero v hπ)).mp + (span_primeElement_isPrime_of_normalized hv hπ) + +/-- A normalized prime element is irreducible as an element of the valuation ring. -/ +theorem primeElementInValuationSubring_irreducible_of_normalized + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : NormalizedExponentialValuation v) {π : K} + (hπ : PrimeElementFor v π) : + Irreducible (primeElementInValuationSubring v hπ) := + (primeElementInValuationSubring_prime_of_normalized hv hπ).irreducible + +/-- In a normalized exponential valuation, powers of the positive-value +maximal ideal are generated by powers of a normalized prime element. -/ +theorem exponentialMaxIdeal_pow_eq_span_primeElement_pow_of_normalized + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : NormalizedExponentialValuation v) {π : K} + (hπ : PrimeElementFor v π) (n : ℕ) : + (exponentialMaxIdeal v) ^ n = + Ideal.span + ({(primeElementInValuationSubring v hπ) ^ n} : + Set (exponentialValuationSubring v)) := by + rw [exponentialMaxIdeal_eq_span_primeElement_of_normalized hv hπ] + exact Ideal.span_singleton_pow (primeElementInValuationSubring v hπ) n + +/-- The DVR ideal `π^n𝒪`. -/ +def uniformizerPowerIdeal {O : Type*} [CommRing O] (π : O) (n : ℕ) : Ideal O := + Ideal.span ({π ^ n} : Set O) + +/-- Value description of a principal power ideal from the value of powers of +its generator. This is the common calculation behind both the normalized +and the scaled discrete forms of the ideal structure theorem for discrete valuation rings. -/ +theorem uniformizerPowerIdeal_mem_iff_value_ge_of_pow_value + {K : Type*} [Field K] (v : ExponentialValuation K) + {π : K} (πR : exponentialValuationSubring v) + (hπR : (πR : K) = π) {s : ℝ} (hπ0 : π ≠ 0) + (hpow : ∀ n : ℕ, v (π ^ n) = (((n : ℝ) * s : ℝ) : WithTop ℝ)) + (n : ℕ) (x : exponentialValuationSubring v) : + x ∈ uniformizerPowerIdeal πR n ↔ + (((n : ℝ) * s : ℝ) : WithTop ℝ) ≤ v (x : K) := by + constructor + · intro hx + rw [uniformizerPowerIdeal, Ideal.mem_span_singleton'] at hx + rcases hx with ⟨a, ha⟩ + have hcast : (x : K) = (a : K) * π ^ n := by + have hcast0 := + congrArg (fun y : exponentialValuationSubring v => (y : K)) ha.symm + simpa [hπR] using hcast0 + have ha_nonneg : (0 : WithTop ℝ) ≤ v (a : K) := a.property + have hpow_val : + v (π ^ n) = (((n : ℝ) * s : ℝ) : WithTop ℝ) := + hpow n + have hx_val : + v (x : K) = v (a : K) + (((n : ℝ) * s : ℝ) : WithTop ℝ) := by + rw [hcast, v.map_mul, hpow_val] + calc + (((n : ℝ) * s : ℝ) : WithTop ℝ) = + 0 + (((n : ℝ) * s : ℝ) : WithTop ℝ) := by simp + _ ≤ v (a : K) + (((n : ℝ) * s : ℝ) : WithTop ℝ) := + add_le_add ha_nonneg le_rfl + _ = v (x : K) := hx_val.symm + · intro hx + by_cases hx0 : (x : K) = 0 + · have hx_eq : x = 0 := Subtype.ext hx0 + rw [hx_eq] + exact Ideal.zero_mem (uniformizerPowerIdeal πR n) + · obtain ⟨r, hr⟩ := exponentialValuation_exists_real_of_ne_zero v hx0 + have hn_le_r : (n : ℝ) * s ≤ r := by + have hle : + ((((n : ℝ) * s : ℝ) : WithTop ℝ) ≤ ((r : ℝ) : WithTop ℝ)) := by + simpa [hr] using hx + exact WithTop.coe_le_coe.mp hle + have hpow_ne : π ^ n ≠ 0 := pow_ne_zero n hπ0 + have hpow_val : + v (π ^ n) = (((n : ℝ) * s : ℝ) : WithTop ℝ) := + hpow n + have hinv_val : + v ((π ^ n)⁻¹) = ((-((n : ℝ) * s) : ℝ) : WithTop ℝ) := + exponentialValuation_inv_value v hpow_ne hpow_val + let aK : K := (x : K) * (π ^ n)⁻¹ + have ha_val : + v aK = (((r - (n : ℝ) * s) : ℝ) : WithTop ℝ) := by + dsimp [aK] + rw [v.map_mul, hr, hinv_val] + simp [sub_eq_add_neg, add_comm] + have ha_mem : aK ∈ exponentialValuationSubring v := by + change (0 : WithTop ℝ) ≤ v aK + rw [ha_val] + exact WithTop.coe_le_coe.mpr (sub_nonneg.mpr hn_le_r) + let a : exponentialValuationSubring v := ⟨aK, ha_mem⟩ + rw [uniformizerPowerIdeal, Ideal.mem_span_singleton'] + refine ⟨a, ?_⟩ + apply Subtype.ext + change ((x : K) * (π ^ n)⁻¹) * (πR : K) ^ n = (x : K) + rw [hπR, mul_assoc, inv_mul_cancel₀ hpow_ne, mul_one] + +/-- If an ideal contains an element whose value is exactly the value of +`π^n`, then it contains the principal ideal generated by `π^n`. -/ +theorem uniformizerPowerIdeal_le_ideal_of_mem_value_eq_of_pow_value + {K : Type*} [Field K] {v : ExponentialValuation K} + {π : K} (πR : exponentialValuationSubring v) + (hπR : (πR : K) = π) {s : ℝ} (hπ0 : π ≠ 0) + (hpow : ∀ n : ℕ, v (π ^ n) = (((n : ℝ) * s : ℝ) : WithTop ℝ)) + {I : Ideal (exponentialValuationSubring v)} {n : ℕ} + {x : exponentialValuationSubring v} + (hxI : x ∈ I) + (hxval : v (x : K) = (((n : ℝ) * s : ℝ) : WithTop ℝ)) : + uniformizerPowerIdeal πR n ≤ I := by + have hpow_ne : π ^ n ≠ 0 := pow_ne_zero n hπ0 + have hpow_val : + v (π ^ n) = (((n : ℝ) * s : ℝ) : WithTop ℝ) := + hpow n + have hinv_val : + v ((π ^ n)⁻¹) = ((-((n : ℝ) * s) : ℝ) : WithTop ℝ) := + exponentialValuation_inv_value v hpow_ne hpow_val + let uK : K := (x : K) * (π ^ n)⁻¹ + have hu_val : v uK = 0 := by + dsimp [uK] + rw [v.map_mul, hxval, hinv_val] + change ((((n : ℝ) * s + -((n : ℝ) * s) : ℝ) : WithTop ℝ) = 0) + simp + have hu_mem : uK ∈ exponentialValuationSubring v := by + change (0 : WithTop ℝ) ≤ v uK + rw [hu_val] + let u : exponentialValuationSubring v := ⟨uK, hu_mem⟩ + have hu_subval : v (u : K) = 0 := by + simpa [u, uK] using hu_val + have hu_unit : IsUnit u := + isUnit_of_exponentialValuation_eq_zero v hu_subval + have hx_repr : x = u * πR ^ n := by + apply Subtype.ext + change (x : K) = ((x : K) * (π ^ n)⁻¹) * (πR : K) ^ n + rw [hπR, mul_assoc, inv_mul_cancel₀ hpow_ne, mul_one] + rw [uniformizerPowerIdeal, Ideal.span_singleton_le_iff_mem] + rcases hu_unit with ⟨uUnit, huUnit⟩ + have hxI' : u * πR ^ n ∈ I := by + simpa [hx_repr] using hxI + have hmem : + ((uUnit⁻¹ : (exponentialValuationSubring v)ˣ) : + exponentialValuationSubring v) * + (u * πR ^ n) ∈ I := + I.mul_mem_left _ hxI' + simpa [← huUnit, mul_assoc] using hmem + +/-- A nonzero ideal has an element of least indexed value whenever every +nonzero element has a value in a monotone sequence. This isolates the +well-ordering argument shared by the normalized and scaled forms of +the ideal structure theorem for discrete valuation rings. -/ +theorem ideal_exists_min_value_of_nat_indexed_values + {O α : Type*} [CommRing O] [Preorder α] + (value : O → α) (weight : ℕ → α) (hweight : Monotone weight) + (hvalue : ∀ x : O, x ≠ 0 → ∃ n : ℕ, value x = weight n) + (I : Ideal O) (hI : I ≠ ⊥) : + ∃ n : ℕ, ∃ x : O, + x ∈ I ∧ x ≠ 0 ∧ value x = weight n ∧ + ∀ y : O, y ∈ I → y ≠ 0 → weight n ≤ value y := by + classical + have hnonzero : ∃ x : O, x ∈ I ∧ x ≠ 0 := by + by_contra h + push Not at h + apply hI + apply le_antisymm + · intro x hx + simp [h x hx] + · exact bot_le + let P : ℕ → Prop := fun n => ∃ x : O, x ∈ I ∧ x ≠ 0 ∧ value x = weight n + have hP : ∃ n : ℕ, P n := by + rcases hnonzero with ⟨x, hxI, hx0⟩ + rcases hvalue x hx0 with ⟨n, hn⟩ + exact ⟨n, x, hxI, hx0, hn⟩ + let n : ℕ := Nat.find hP + rcases Nat.find_spec hP with ⟨x, hxI, hx0, hxval⟩ + refine ⟨n, x, hxI, hx0, hxval, ?_⟩ + intro y hyI hy0 + rcases hvalue y hy0 with ⟨m, hm⟩ + have hnm : n ≤ m := Nat.find_min' hP ⟨y, hyI, hy0, hm⟩ + exact (hweight hnm).trans_eq hm.symm + +/-- The ideal structure theorem for discrete valuation rings, value description of the ideals +`π^n𝒪`: for a normalized +prime element, membership in the principal power ideal is exactly the lower +bound `v(x) ≥ n`. -/ +theorem uniformizerPowerIdeal_mem_iff_value_ge + {K : Type*} [Field K] (v : ExponentialValuation K) {π : K} + (hπ : PrimeElementFor v π) (n : ℕ) + (x : exponentialValuationSubring v) : + x ∈ uniformizerPowerIdeal (primeElementInValuationSubring v hπ) n ↔ + ((n : ℝ) : WithTop ℝ) ≤ v (x : K) := by + simpa [mul_one] using + uniformizerPowerIdeal_mem_iff_value_ge_of_pow_value + (v := v) (π := π) (πR := primeElementInValuationSubring v hπ) + rfl (s := 1) hπ.1 + (fun n => by + simpa [mul_one] using primeElementFor_pow_value v hπ n) + n x + +/-- A nonnegative member of a positive real lattice has a natural-number +index. This is the order-theoretic step common to normalized and scaled +discrete valuations. -/ +theorem exists_nat_index_of_nonneg_int_multiple + {a : WithTop ℝ} {s : ℝ} (ha : 0 ≤ a) (hs : 0 < s) + (h : ∃ m : ℤ, a = (((m : ℝ) * s : ℝ) : WithTop ℝ)) : + ∃ n : ℕ, a = (((n : ℝ) * s : ℝ) : WithTop ℝ) := by + rcases h with ⟨m, rfl⟩ + cases m with + | ofNat n => exact ⟨n, by simp⟩ + | negSucc n => + have hmneg : ((Int.negSucc n : ℤ) : ℝ) < 0 := by + have hcast : + ((Int.negSucc n : ℤ) : ℝ) = -((n : ℝ) + 1) := by + norm_num [Int.cast_negSucc] + rw [hcast] + linarith [(Nat.cast_nonneg n : (0 : ℝ) ≤ (n : ℝ))] + exact False.elim <| (not_lt_of_ge (WithTop.coe_le_coe.mp ha)) + (mul_neg_of_neg_of_pos hmneg hs) + +/-- In a normalized exponential valuation, a nonzero element of the valuation +ring has a natural-number value. -/ +theorem normalizedExponentialValuation_subring_exists_nat_value + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : NormalizedExponentialValuation v) + {x : exponentialValuationSubring v} (hx : (x : K) ≠ 0) : + ∃ n : ℕ, v (x : K) = ((n : ℝ) : WithTop ℝ) := by + have hindexed : + ∃ m : ℤ, v (x : K) = (((m : ℝ) * 1 : ℝ) : WithTop ℝ) := by + rcases hv.2.1 (x : K) hx with ⟨m, hm⟩ + exact ⟨m, by simpa using hm⟩ + rcases exists_nat_index_of_nonneg_int_multiple x.property zero_lt_one hindexed with + ⟨n, hn⟩ + exact ⟨n, by simpa using hn⟩ + +/-- If an ideal contains an element of value exactly `n`, then it contains +`π^n𝒪`. -/ +theorem uniformizerPowerIdeal_le_ideal_of_mem_value_eq + {K : Type*} [Field K] {v : ExponentialValuation K} {π : K} + (hπ : PrimeElementFor v π) + {I : Ideal (exponentialValuationSubring v)} {n : ℕ} + {x : exponentialValuationSubring v} + (hxI : x ∈ I) + (hxval : v (x : K) = ((n : ℝ) : WithTop ℝ)) : + uniformizerPowerIdeal (primeElementInValuationSubring v hπ) n ≤ I := by + exact + uniformizerPowerIdeal_le_ideal_of_mem_value_eq_of_pow_value + (v := v) (π := π) (πR := primeElementInValuationSubring v hπ) + rfl (s := 1) hπ.1 + (fun n => by + simpa [mul_one] using primeElementFor_pow_value v hπ n) + hxI (by simpa [mul_one] using hxval) + +/-- The ideal structure theorem for discrete valuation rings, ideal classification part: every +nonzero ideal of a +normalized exponential-valuation ring is one of the ideals `π^n𝒪`. -/ +theorem nonzero_ideal_eq_uniformizerPowerIdeal + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : NormalizedExponentialValuation v) {π : K} + (hπ : PrimeElementFor v π) + (I : Ideal (exponentialValuationSubring v)) (hI : I ≠ ⊥) : + ∃ n : ℕ, + I = uniformizerPowerIdeal (primeElementInValuationSubring v hπ) n := by + have hvalue : + ∀ x : exponentialValuationSubring v, x ≠ 0 → + ∃ n : ℕ, v (x : K) = ((n : ℝ) : WithTop ℝ) := by + intro x hx + apply normalizedExponentialValuation_subring_exists_nat_value hv + intro hxK + exact hx (Subtype.ext hxK) + rcases ideal_exists_min_value_of_nat_indexed_values + (value := fun x : exponentialValuationSubring v => v (x : K)) + (weight := fun n : ℕ => ((n : ℝ) : WithTop ℝ)) + (fun _ _ hnm => WithTop.coe_le_coe.mpr (Nat.cast_le.mpr hnm)) + hvalue I hI with + ⟨n, x, hxI, _hx0, hxval, hmin⟩ + refine ⟨n, le_antisymm ?_ ?_⟩ + · intro y hyI + rw [uniformizerPowerIdeal_mem_iff_value_ge v hπ n y] + by_cases hyK0 : (y : K) = 0 + · have hyval_top : v (y : K) = ⊤ := (v.eq_top_iff (y : K)).mpr hyK0 + rw [hyval_top] + simp + · have hy0 : y ≠ 0 := by + intro hy0 + exact hyK0 (by + simpa using + congrArg (fun z : exponentialValuationSubring v => (z : K)) hy0) + exact hmin y hyI hy0 + · exact uniformizerPowerIdeal_le_ideal_of_mem_value_eq hπ hxI hxval + +/-- The ideal structure theorem for discrete valuation rings, PID part: the valuation ring of a +normalized +exponential valuation is a principal ideal ring. -/ +theorem normalizedExponentialValuationSubring_isPrincipalIdealRing + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : NormalizedExponentialValuation v) {π : K} + (hπ : PrimeElementFor v π) : + IsPrincipalIdealRing (exponentialValuationSubring v) := by + constructor + intro I + by_cases hI : I = ⊥ + · rw [hI] + exact ⟨0, by simp⟩ + · rcases nonzero_ideal_eq_uniformizerPowerIdeal hv hπ I hI with + ⟨n, hIn⟩ + refine ⟨(primeElementInValuationSubring v hπ) ^ n, ?_⟩ + rw [hIn, uniformizerPowerIdeal] + +/-- The ideal structure theorem for discrete valuation rings, DVR part: the valuation ring of a +normalized +exponential valuation is a discrete valuation ring. -/ +theorem normalizedExponentialValuationSubring_isDiscreteValuationRing + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : NormalizedExponentialValuation v) {π : K} + (hπ : PrimeElementFor v π) : + IsDiscreteValuationRing (exponentialValuationSubring v) := by + have : IsPrincipalIdealRing (exponentialValuationSubring v) := + normalizedExponentialValuationSubring_isPrincipalIdealRing hv hπ + refine { not_a_field' := ?_ } + intro hmax + have hπ_mem : + primeElementInValuationSubring v hπ ∈ + IsLocalRing.maximalIdeal (exponentialValuationSubring v) := + primeElement_mem_maximalIdeal v hπ + have hπ_bot : + primeElementInValuationSubring v hπ ∈ + (⊥ : Ideal (exponentialValuationSubring v)) := by + simpa [hmax] using hπ_mem + have hπ_zero : primeElementInValuationSubring v hπ = 0 := by + simpa using hπ_bot + exact primeElementInValuationSubring_ne_zero v hπ hπ_zero + +/-- A field element of positive discrete value, viewed inside the valuation ring. -/ +def discretePrimeElementInValuationSubring + {K : Type*} [Field K] (v : ExponentialValuation K) + {π : K} {s : ℝ} (hs : 0 ≤ s) (hπ : v π = (s : WithTop ℝ)) : + exponentialValuationSubring v := + ⟨π, by + change (0 : WithTop ℝ) ≤ v π + rw [hπ] + exact WithTop.coe_le_coe.mpr hs⟩ + +/-- A finite positive value forces the chosen discrete prime element to be nonzero. -/ +theorem discretePrimeElement_ne_zero_of_value + {K : Type*} [Field K] (v : ExponentialValuation K) + {π : K} {s : ℝ} (hπ : v π = (s : WithTop ℝ)) : + π ≠ 0 := by + intro hzero + have htop : v π = ⊤ := (v.eq_top_iff π).mpr hzero + rw [hπ] at htop + simp at htop + +/-- Powers of a discrete prime element have the expected scaled value. -/ +theorem discretePrimeElement_pow_value + {K : Type*} [Field K] (v : ExponentialValuation K) + {π : K} {s : ℝ} (hπ : v π = (s : WithTop ℝ)) (n : ℕ) : + v (π ^ n) = (((n : ℝ) * s : ℝ) : WithTop ℝ) := by + induction n with + | zero => + simp + | succ n ih => + rw [pow_succ, v.map_mul, ih, hπ] + change ((((n : ℝ) * s + s : ℝ) : WithTop ℝ) = + ((((n + 1 : ℕ) : ℝ) * s : ℝ) : WithTop ℝ)) + congr 1 + norm_num [Nat.cast_succ] + ring + +/-- A nonzero element of the valuation ring of a discrete valuation has a +nonnegative integer multiple of the least positive value. -/ +theorem discreteExponentialValuation_subring_exists_nat_value + {K : Type*} [Field K] {v : ExponentialValuation K} + {s : ℝ} (hs : 0 < s) + (hvalues : ∀ x : K, x ≠ 0 → ∃ m : ℤ, + v x = (((m : ℝ) * s : ℝ) : WithTop ℝ)) + {x : exponentialValuationSubring v} (hx : (x : K) ≠ 0) : + ∃ n : ℕ, v (x : K) = (((n : ℝ) * s : ℝ) : WithTop ℝ) := by + exact exists_nat_index_of_nonneg_int_multiple x.property hs (hvalues (x : K) hx) + +/-- The ideal structure theorem for discrete valuation rings, scaled value description for a +non-normalized discrete +prime element: membership in `π^n𝒪` is the lower bound `n * s ≤ v(x)`. -/ +theorem discrete_uniformizerPowerIdeal_mem_iff_value_ge + {K : Type*} [Field K] (v : ExponentialValuation K) + {π : K} {s : ℝ} (hs : 0 < s) (hπ : v π = (s : WithTop ℝ)) + (n : ℕ) (x : exponentialValuationSubring v) : + x ∈ uniformizerPowerIdeal + (discretePrimeElementInValuationSubring v (le_of_lt hs) hπ) n ↔ + (((n : ℝ) * s : ℝ) : WithTop ℝ) ≤ v (x : K) := by + have hπ0 : π ≠ 0 := discretePrimeElement_ne_zero_of_value v hπ + exact + uniformizerPowerIdeal_mem_iff_value_ge_of_pow_value + (v := v) (π := π) + (πR := discretePrimeElementInValuationSubring v (le_of_lt hs) hπ) + rfl (s := s) hπ0 (discretePrimeElement_pow_value v hπ) n x + +/-- If an ideal contains an element of scaled value `n * s`, then it contains +the principal ideal `π^n𝒪`. -/ +theorem discreteUniformizerPowerIdeal_le_ideal_of_mem_value_eq + {K : Type*} [Field K] {v : ExponentialValuation K} + {π : K} {s : ℝ} (hs : 0 < s) (hπ : v π = (s : WithTop ℝ)) + {I : Ideal (exponentialValuationSubring v)} {n : ℕ} + {x : exponentialValuationSubring v} + (hxI : x ∈ I) + (hxval : v (x : K) = (((n : ℝ) * s : ℝ) : WithTop ℝ)) : + uniformizerPowerIdeal + (discretePrimeElementInValuationSubring v (le_of_lt hs) hπ) n ≤ I := by + have hπ0 : π ≠ 0 := discretePrimeElement_ne_zero_of_value v hπ + exact + uniformizerPowerIdeal_le_ideal_of_mem_value_eq_of_pow_value + (v := v) (π := π) + (πR := discretePrimeElementInValuationSubring v (le_of_lt hs) hπ) + rfl (s := s) hπ0 (discretePrimeElement_pow_value v hπ) hxI hxval + +/-- The ideal structure theorem for discrete valuation rings, canonical PID part for an +arbitrary discrete +exponential valuation, before choosing the normalized representative. -/ +theorem discreteExponentialValuationSubring_isPrincipalIdealRing + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : DiscreteExponentialValuation v) : + IsPrincipalIdealRing (exponentialValuationSubring v) := by + rcases hv with ⟨s, hs, hvalues, π, hπ⟩ + let πR : exponentialValuationSubring v := + discretePrimeElementInValuationSubring v (le_of_lt hs) hπ + constructor + intro I + by_cases hI : I = ⊥ + · rw [hI] + exact ⟨0, by simp⟩ + · have hvalue : + ∀ x : exponentialValuationSubring v, x ≠ 0 → + ∃ n : ℕ, v (x : K) = (((n : ℝ) * s : ℝ) : WithTop ℝ) := by + intro x hx + apply discreteExponentialValuation_subring_exists_nat_value hs hvalues + intro hxK + exact hx (Subtype.ext hxK) + rcases ideal_exists_min_value_of_nat_indexed_values + (value := fun x : exponentialValuationSubring v => v (x : K)) + (weight := fun n : ℕ => (((n : ℝ) * s : ℝ) : WithTop ℝ)) + (fun _ _ hnm => WithTop.coe_le_coe.mpr + (mul_le_mul_of_nonneg_right (Nat.cast_le.mpr hnm) (le_of_lt hs))) + hvalue I hI with ⟨n, x, hxI, _hx0, hxval, hmin⟩ + refine ⟨πR ^ n, le_antisymm ?_ ?_⟩ + · intro y hyI + change y ∈ uniformizerPowerIdeal πR n + rw [discrete_uniformizerPowerIdeal_mem_iff_value_ge v hs hπ n y] + by_cases hyK0 : (y : K) = 0 + · have hyval_top : v (y : K) = ⊤ := (v.eq_top_iff (y : K)).mpr hyK0 + rw [hyval_top] + simp + · have hy0 : y ≠ 0 := by + intro hy0 + exact hyK0 (by + simpa using + congrArg (fun z : exponentialValuationSubring v => (z : K)) hy0) + exact hmin y hyI hy0 + · change uniformizerPowerIdeal πR n ≤ I + exact discreteUniformizerPowerIdeal_le_ideal_of_mem_value_eq hs hπ hxI hxval + +/-- The ideal structure theorem for discrete valuation rings, canonical DVR part for an +arbitrary discrete +exponential valuation. -/ +theorem discreteExponentialValuationSubring_isDiscreteValuationRing + {K : Type*} [Field K] {v : ExponentialValuation K} + (hv : DiscreteExponentialValuation v) : + IsDiscreteValuationRing (exponentialValuationSubring v) := by + rcases hv with ⟨s, hs, hvalues, π, hπ⟩ + have hv' : DiscreteExponentialValuation v := + ⟨s, hs, hvalues, π, hπ⟩ + have : IsPrincipalIdealRing (exponentialValuationSubring v) := + discreteExponentialValuationSubring_isPrincipalIdealRing hv' + refine { not_a_field' := ?_ } + intro hmax + let πR : exponentialValuationSubring v := + discretePrimeElementInValuationSubring v (le_of_lt hs) hπ + have hπ_mem : + πR ∈ IsLocalRing.maximalIdeal (exponentialValuationSubring v) := by + rw [← exponentialMaxIdeal_eq_maximalIdeal v] + change (0 : WithTop ℝ) < v π + rw [hπ] + exact WithTop.coe_lt_coe.mpr hs + have hπ_bot : πR ∈ (⊥ : Ideal (exponentialValuationSubring v)) := by + simpa [hmax] using hπ_mem + have hπ_zero : πR = 0 := by + simpa using hπ_bot + have hπ_ne : π ≠ 0 := discretePrimeElement_ne_zero_of_value v hπ + exact hπ_ne (by + simpa [πR, discretePrimeElementInValuationSubring] using + congrArg (fun x : exponentialValuationSubring v => (x : K)) hπ_zero) +end Valuations +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ValuationSubring.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ValuationSubring.lean new file mode 100644 index 0000000000..8ceedb07a3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ValuationSubring.lean @@ -0,0 +1,304 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core +public import Mathlib.Algebra.Polynomial.Lifts +public import Mathlib.RingTheory.LocalRing.ResidueField.Basic +public import Mathlib.RingTheory.Valuation.LocalSubring +/-! +# Closed unit balls of nonarchimedean absolute values + +This file records the valuation ring attached directly to a multiplicative +absolute value in the nonarchimedean case. It is the section-3 object used by +the finite-degree norm construction before any discrete-valuation-field packaging. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- The closed unit ball `{x | |x| ≤ 1}` of a nonarchimedean absolute value, +bundled as a subring. -/ +def absoluteValueUnitBallSubring + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) : Subring K where + carrier := {x | v x ≤ 1} + zero_mem' := by simp + one_mem' := by simp + add_mem' := by + intro x y hx hy + exact (LubinTate.Valuations.strong_triangle_of_nonarchimedean + v hnonarch x y).trans (max_le hx hy) + neg_mem' := by + intro x hx + simpa using hx + mul_mem' := by + intro x y hx hy + change v (x * y) ≤ 1 + rw [v.map_mul] + exact (mul_le_of_le_one_left (v.nonneg y) hx).trans hy + +/-- Membership in the absolute-value valuation subring is the closed-unit-ball +condition. -/ +theorem mem_absoluteValueUnitBallSubring_iff + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) (x : K) : + x ∈ absoluteValueUnitBallSubring v hnonarch ↔ v x ≤ 1 := + Iff.rfl + +/-- Every field element or its inverse lies in the closed unit ball of a +nonarchimedean absolute value. -/ +theorem absoluteValueUnitBallSubring_mem_or_inv_mem + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) (x : K) : + x ∈ absoluteValueUnitBallSubring v hnonarch ∨ + x⁻¹ ∈ absoluteValueUnitBallSubring v hnonarch := by + by_cases hx : v x ≤ 1 + · exact Or.inl ((mem_absoluteValueUnitBallSubring_iff + v hnonarch x).2 hx) + · right + have hx_gt : 1 < v x := lt_of_not_ge hx + rw [mem_absoluteValueUnitBallSubring_iff, map_inv₀] + exact inv_le_one_of_one_le₀ hx_gt.le + +/-- The closed unit ball of a nonarchimedean absolute value, bundled as +mathlib's `ValuationSubring`. -/ +def absoluteValueValuationSubring + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) : + ValuationSubring K := + ValuationSubring.ofSubring + (absoluteValueUnitBallSubring v hnonarch) + (absoluteValueUnitBallSubring_mem_or_inv_mem v hnonarch) + +/-- Membership in the bundled valuation subring is again the closed-unit-ball +condition. -/ +theorem mem_absoluteValueValuationSubring_iff + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) (x : K) : + x ∈ absoluteValueValuationSubring v hnonarch ↔ + v x ≤ 1 := by + exact (ValuationSubring.mem_ofSubring + (absoluteValueUnitBallSubring v hnonarch) + (absoluteValueUnitBallSubring_mem_or_inv_mem v hnonarch) x).trans + (mem_absoluteValueUnitBallSubring_iff v hnonarch x) + +/-- In any submonoid of a field whose elements are exactly the closed unit +ball of an absolute value, the units are exactly the elements of absolute +value `1`. -/ +theorem isUnit_iff_abs_eq_one_of_mem_iff_le_one + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + {C : Type*} [SetLike C K] [SubmonoidClass C K] + (S : C) (hS : ∀ x : K, x ∈ S ↔ v x ≤ 1) (x : S) : + IsUnit x ↔ v (x : K) = 1 := by + constructor + · intro hx + have hx_inv := + (Submonoid.isUnit_iff_and (S := S) (a := x)).mp hx + have hx_le : v (x : K) ≤ 1 := (hS (x : K)).1 x.property + have hinv_le : v ((x : K)⁻¹) ≤ 1 := + (hS ((x : K)⁻¹)).1 hx_inv.2 + have hmul : v (x : K) * v ((x : K)⁻¹) = 1 := by + rw [← v.map_mul, mul_inv_cancel₀ hx_inv.1] + simp + have hge : 1 ≤ v (x : K) := by + calc + 1 = v (x : K) * v ((x : K)⁻¹) := hmul.symm + _ ≤ v (x : K) * 1 := + mul_le_mul_of_nonneg_left hinv_le (v.nonneg (x : K)) + _ = v (x : K) := by simp + exact le_antisymm hx_le hge + · intro hx + rw [Submonoid.isUnit_iff_and (S := S) (a := x)] + constructor + · intro hx_zero + have hzero_one : (0 : ℝ) = 1 := by + simp [hx_zero] at hx + exact zero_ne_one hzero_one + · exact (hS ((x : K)⁻¹)).2 <| by + rw [map_inv₀, hx] + simp + +/-- In the same closed-unit-ball situation, nonunits are exactly the elements +of absolute value strictly less than `1`. -/ +theorem not_isUnit_iff_abs_lt_one_of_mem_iff_le_one + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + {C : Type*} [SetLike C K] [SubmonoidClass C K] + (S : C) (hS : ∀ x : K, x ∈ S ↔ v x ≤ 1) (x : S) : + ¬ IsUnit x ↔ v (x : K) < 1 := by + have hx_le : v (x : K) ≤ 1 := (hS (x : K)).1 x.property + rw [isUnit_iff_abs_eq_one_of_mem_iff_le_one v S hS] + exact hx_le.lt_iff_ne.symm + +/-- The same unit criterion for the valuation-subring bundle of the closed +unit ball. -/ +theorem absoluteValueUnitBallSubringAsValuationSubring_isUnit_iff_abs_eq_one + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (x : absoluteValueValuationSubring v hnonarch) : + IsUnit x ↔ v (x : K) = 1 := + isUnit_iff_abs_eq_one_of_mem_iff_le_one + v (absoluteValueValuationSubring v hnonarch) + (mem_absoluteValueValuationSubring_iff v hnonarch) x + +/-- The maximal ideal of the closed-unit-ball valuation subring consists +exactly of the elements of absolute value strictly less than `1`. -/ +theorem absoluteValueValuationSubring_mem_maximalIdeal_iff_abs_lt_one + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (x : absoluteValueValuationSubring v hnonarch) : + x ∈ IsLocalRing.maximalIdeal + (absoluteValueValuationSubring v hnonarch) ↔ + v (x : K) < 1 := by + rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] + exact not_isUnit_iff_abs_lt_one_of_mem_iff_le_one + v (absoluteValueValuationSubring v hnonarch) + (mem_absoluteValueValuationSubring_iff v hnonarch) x + +/-- A closed-unit-ball element reduces to zero in the residue field exactly +when its absolute value is strictly less than `1`. -/ +theorem absoluteValueUnitBallSubringAsValuationSubring_residue_eq_zero_iff_abs_lt_one + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (x : absoluteValueValuationSubring v hnonarch) : + IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch) x = 0 ↔ + v (x : K) < 1 := by + rw [IsLocalRing.residue_eq_zero_iff, + absoluteValueValuationSubring_mem_maximalIdeal_iff_abs_lt_one] + +/-- A closed-unit-ball element has nonzero residue exactly when its absolute +value is `1`. -/ +theorem absoluteValueUnitBallSubringAsValuationSubring_residue_ne_zero_iff_abs_eq_one + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (x : absoluteValueValuationSubring v hnonarch) : + IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch) x ≠ 0 ↔ + v (x : K) = 1 := by + have hx_le : v (x : K) ≤ 1 := + (mem_absoluteValueValuationSubring_iff + v hnonarch (x : K)).1 x.property + rw [ne_eq, + absoluteValueUnitBallSubringAsValuationSubring_residue_eq_zero_iff_abs_lt_one] + constructor + · intro hx + exact le_antisymm hx_le (not_lt.mp hx) + · intro hx + rw [hx] + exact not_lt_of_ge le_rfl + +/-- The closed unit ball of a nonarchimedean absolute value is integrally +closed in the ambient field. -/ +theorem absoluteValueUnitBallSubring_isIntegrallyClosedIn + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) : + IsIntegrallyClosedIn (absoluteValueUnitBallSubring v hnonarch) K := by + let V := absoluteValueValuationSubring v hnonarch + change IsIntegrallyClosedIn V K + exact (isIntegrallyClosed_iff_isIntegrallyClosedIn (R := V) (K := K)).mp + inferInstance + +/-- If an absolute value on `L` extends one on `K`, then its valuation subring +pulls back to the base valuation subring. -/ +theorem comap_absoluteValueUnitBallSubring_eq_of_extends + {K L : Type*} [Field K] [Field L] [Algebra K L] + (v : AbsoluteValue K ℝ) (w : AbsoluteValue L ℝ) + (hvnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hwnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue w) + (hw_ext : ∀ x : K, w (algebraMap K L x) = v x) : + (absoluteValueUnitBallSubring w hwnonarch).comap + (algebraMap K L) = + absoluteValueUnitBallSubring v hvnonarch := by + ext x + change w (algebraMap K L x) ≤ 1 ↔ v x ≤ 1 + rw [hw_ext x] + +/-- A polynomial over the field lifts from the closed-unit-ball valuation +subring exactly when all its coefficients lie in that valuation subring. -/ +theorem polynomial_lifts_absoluteValueUnitBallSubring_iff_coeff_mem + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) (f : K[X]) : + f ∈ Polynomial.lifts + (algebraMap (absoluteValueUnitBallSubring v hnonarch) K) ↔ + ∀ n : ℕ, f.coeff n ∈ absoluteValueUnitBallSubring v hnonarch := by + rw [Polynomial.lifts_iff_coeff_lifts + (f := algebraMap (absoluteValueUnitBallSubring v hnonarch) K)] + constructor + · intro h n + rcases h n with ⟨a, ha⟩ + rw [← ha] + exact a.property + · intro h n + exact ⟨⟨f.coeff n, h n⟩, rfl⟩ + +/-- Monic lift form used by irreducible-polynomial lifting: a monic field polynomial whose +coefficients lie in the closed unit ball has a monic valuation-ring lift of +the same natural degree. -/ +theorem exists_monic_polynomial_over_absoluteValueUnitBallSubring_of_coeff_mem + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) {f : K[X]} + (hfmonic : f.Monic) + (hfcoeff : ∀ n : ℕ, f.coeff n ∈ absoluteValueUnitBallSubring v hnonarch) : + ∃ F : (absoluteValueUnitBallSubring v hnonarch)[X], + F.Monic ∧ + F.map (algebraMap (absoluteValueUnitBallSubring v hnonarch) K) = f ∧ + F.natDegree = f.natDegree := by + have hlifts : + f ∈ Polynomial.lifts + (algebraMap (absoluteValueUnitBallSubring v hnonarch) K) := + (polynomial_lifts_absoluteValueUnitBallSubring_iff_coeff_mem + v hnonarch f).2 hfcoeff + rcases Polynomial.lifts_and_natDegree_eq_and_monic + (f := algebraMap (absoluteValueUnitBallSubring v hnonarch) K) + hlifts hfmonic with + ⟨F, hmap, hdeg, hmonic⟩ + exact ⟨F, hmonic, hmap, hdeg⟩ + +/-- A field polynomial whose coefficients lie in the closed unit ball has a +degree-preserving lift to the actual valuation-subring bundle used for +residue fields. The lift may be chosen coefficientwise, so the absolute +values of the lifted coefficients are the original coefficient values. -/ +theorem exists_polynomial_over_absoluteValueUnitBallSubringAsValuationSubring_of_coeff_abs_le_one + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) (f : K[X]) + (hfcoeff : ∀ n : ℕ, v (f.coeff n) ≤ 1) : + ∃ F : (absoluteValueValuationSubring v hnonarch)[X], + F.map (algebraMap + (absoluteValueValuationSubring v hnonarch) K) = f ∧ + F.natDegree = f.natDegree ∧ + ∀ n : ℕ, v (F.coeff n : K) = v (f.coeff n) := by + let V := absoluteValueValuationSubring v hnonarch + have hlifts : f ∈ Polynomial.lifts (algebraMap V K) := by + rw [Polynomial.lifts_iff_coeff_lifts] + intro n + exact + ⟨⟨f.coeff n, + (mem_absoluteValueValuationSubring_iff + v hnonarch (f.coeff n)).2 (hfcoeff n)⟩, + by simp [V]⟩ + rcases Polynomial.exists_degree_eq_of_mem_lifts hlifts with + ⟨F, hmap, hdegree⟩ + refine ⟨F, hmap, Polynomial.natDegree_eq_of_degree_eq hdegree, ?_⟩ + intro n + have hcoeff : + (F.coeff n : K) = f.coeff n := by + have h := congrArg (fun P : K[X] => P.coeff n) hmap + simpa [Polynomial.coeff_map, V] using h + rw [hcoeff] + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion.lean new file mode 100644 index 0000000000..aef2ebf94c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion.lean @@ -0,0 +1,26 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.AbsoluteValueExtensions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.BaseChangeAdjoinRoot +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.BaseChangeNormTrace +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.CanonicalTensorMap +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.DegreeNormTrace +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionFactorClassification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteProductNormTrace +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.Padic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialCRT +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialFactors +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.SeparablePolynomialFactors +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductProductFormulas + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/AbsoluteValueExtensions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/AbsoluteValueExtensions.lean new file mode 100644 index 0000000000..7c38852073 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/AbsoluteValueExtensions.lean @@ -0,0 +1,837 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ExponentialValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Ostrowski +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.PrincipalAdicCompleteness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.SpectralExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring +public import Mathlib.Analysis.Normed.Field.Instances +public import Mathlib.Analysis.Normed.Module.Completion +public import Mathlib.FieldTheory.IsAlgClosed.AlgebraicClosure +public import Mathlib.FieldTheory.IntermediateField.Adjoin.Algebra +/-! +# Extension of valuations to finite field extensions + +The setup uses nontrivial real-valued absolute values throughout. For an +absolute value `v` on `K`, we use mathlib's completion `v.Completion` and its +concrete algebraic closure. The absolute value `bar v` on that algebraic +closure is produced by the unique-extension unique extension theorem, not supplied as an +extra hypothesis. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Topology + +namespace AlgebraicNumberTheory +namespace Valuations + +universe u v + +/-- Absolute values on `L` which extend `v` pointwise. This is the common +index type for the valuation-extension theorem and the factor correspondence in the + extension-factor correspondence. -/ +abbrev AbsoluteValueExtension + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) + (L : Type v) [Field L] [Algebra K L] := + {w : AbsoluteValue L ℝ // AbsoluteValue.Extends vK w} + +/-- An exact extension of a nontrivial absolute value is nontrivial. -/ +theorem AbsoluteValueExtension.isNontrivial + {K : Type u} {L : Type v} + [Field K] [Field L] [Algebra K L] + {vK : AbsoluteValue K ℝ} + (u : AbsoluteValueExtension vK L) + (hvK : vK.IsNontrivial) : + u.1.IsNontrivial := by + rcases hvK with ⟨a, ha, hva⟩ + refine + ⟨algebraMap K L a, + (map_ne_zero (algebraMap K L)).2 ha, ?_⟩ + simpa only [u.2 a] using hva + +/-- The concrete algebraic closure `\bar K_v` used in the valuation-extension theorem. -/ +abbrev absoluteValueExtensionAlgebraicCompletionClosure + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) := + AlgebraicClosure vK.Completion + +/-- The unique extension `\bar v` of the completion absolute value to +`\bar K_v`. -/ +noncomputable def absoluteValueExtensionAlgebraicClosureAbsoluteValue + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) : + AbsoluteValue (absoluteValueExtensionAlgebraicCompletionClosure vK) ℝ := + (AbsoluteValue.uniqueAlgebraicExtension + (AbsoluteValue.completionAbsoluteValue vK) + (AbsoluteValue.completionAbsoluteValue_complete vK) + (AbsoluteValue.completionAbsoluteValue_isNontrivial vK hvK)).extension + +@[simp] +theorem absoluteValueExtension_algebraicClosureAbsoluteValue_algebraMap + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) (x : vK.Completion) : + absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK + (algebraMap vK.Completion + (absoluteValueExtensionAlgebraicCompletionClosure vK) x) = + AbsoluteValue.completionAbsoluteValue vK x := by + exact + (AbsoluteValue.uniqueAlgebraicExtension + (AbsoluteValue.completionAbsoluteValue vK) + (AbsoluteValue.completionAbsoluteValue_complete vK) + (AbsoluteValue.completionAbsoluteValue_isNontrivial vK hvK)).isExtension x + + +/-- A `K_v`-embedding of the algebraic localization into `\bar K_v`. -/ +noncomputable def absoluteValueExtensionLocalizationEmbedding + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (vK : AbsoluteValue K ℝ) (w : AbsoluteValueExtension vK L) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + AbsoluteValue.algebraicLocalization vK w.1 w.2 →ₐ[vK.Completion] + absoluteValueExtensionAlgebraicCompletionClosure vK := by + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : Algebra.IsAlgebraic vK.Completion + (AbsoluteValue.algebraicLocalization vK w.1 w.2) := + AbsoluteValue.algebraicLocalization_isAlgebraic vK w.1 w.2 + letI : Module.IsTorsionFree vK.Completion + (AbsoluteValue.algebraicLocalization vK w.1 w.2) := + Module.isTorsionFree_iff_algebraMap_injective.mpr + (algebraMap vK.Completion + (AbsoluteValue.algebraicLocalization vK w.1 w.2)).injective + letI : Module.IsTorsionFree vK.Completion + (absoluteValueExtensionAlgebraicCompletionClosure vK) := + Module.isTorsionFree_iff_algebraMap_injective.mpr + (algebraMap vK.Completion + (absoluteValueExtensionAlgebraicCompletionClosure vK)).injective + exact IsAlgClosed.lift + +/-- The localization absolute value is the pullback of `\bar v` along the +chosen localization embedding. -/ +theorem absoluteValueExtension_localizationAbsoluteValue_eq_pullback + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 = + (absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK).comp + (absoluteValueExtensionLocalizationEmbedding vK w).injective := by + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let : Algebra.IsAlgebraic vK.Completion + (AbsoluteValue.algebraicLocalization vK w.1 w.2) := + AbsoluteValue.algebraicLocalization_isAlgebraic vK w.1 w.2 + let R := AbsoluteValue.uniqueAlgebraicExtension + (K := vK.Completion) (L := AbsoluteValue.algebraicLocalization vK w.1 w.2) + (AbsoluteValue.completionAbsoluteValue vK) + (AbsoluteValue.completionAbsoluteValue_complete vK) + (AbsoluteValue.completionAbsoluteValue_isNontrivial vK hvK) + have hleft : AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 = R.extension := + R.unique _ (AbsoluteValue.algebraicLocalizationAbsoluteValue_extends vK w.1 w.2) + have hright : + (absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK).comp + (absoluteValueExtensionLocalizationEmbedding vK w).injective = R.extension := by + apply R.unique + intro x + change absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK + (absoluteValueExtensionLocalizationEmbedding vK w + (algebraMap vK.Completion (AbsoluteValue.algebraicLocalization vK w.1 w.2) x)) = _ + rw [(absoluteValueExtensionLocalizationEmbedding vK w).commutes] + exact absoluteValueExtension_algebraicClosureAbsoluteValue_algebraMap vK hvK x + exact hleft.trans hright.symm + +/-- Pull `\bar v` back along a `K`-embedding of `L` into `\bar K_v`. -/ +noncomputable def absoluteValueExtensionPullback + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) : + AbsoluteValue L ℝ := + (absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK).comp tau.injective + +/-- Every pullback along a `K`-embedding is an exact extension of `v`. -/ +theorem absoluteValueExtension_pullback_extends + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) : + AbsoluteValue.Extends vK (absoluteValueExtensionPullback vK hvK tau) := by + intro x + change absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK + (tau (algebraMap K L x)) = vK x + rw [tau.commutes, + IsScalarTower.algebraMap_apply K vK.Completion + (absoluteValueExtensionAlgebraicCompletionClosure vK), + absoluteValueExtension_algebraicClosureAbsoluteValue_algebraMap] + exact AbsoluteValue.completionAbsoluteValue_coe vK x + +/-- Extend an exact nontrivial absolute value through an algebraic +tower to an algebraically closed overfield. + +The construction pulls the canonical absolute value on the algebraic +closure of the completion back along an actual embedding of the +overfield. Unlike the finite normal-closure specialization, this +statement does not impose a finite-dimensional hypothesis. -/ +noncomputable def AbsoluteValueExtension.extendToAlgebraicallyClosed + {K : Type u} {L : Type v} {Ω : Type*} + [Field K] [Field L] [Field Ω] + [Algebra K L] [Algebra L Ω] [Algebra K Ω] + [IsScalarTower K L Ω] + [Algebra.IsAlgebraic L Ω] + (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) + (u : AbsoluteValueExtension vK L) : + AbsoluteValueExtension vK Ω := by + let τ : + Ω →ₐ[L] + absoluteValueExtensionAlgebraicCompletionClosure u.1 := + IsAlgClosed.lift + let wΩ : AbsoluteValue Ω ℝ := + absoluteValueExtensionPullback + u.1 (u.isNontrivial hvK) τ + have hwΩ : + AbsoluteValue.Extends u.1 wΩ := + absoluteValueExtension_pullback_extends + u.1 (u.isNontrivial hvK) τ + exact + { val := wΩ + property := by + intro x + rw [IsScalarTower.algebraMap_apply K L Ω, + hwΩ, u.2] } + +/-- The extension to an algebraically closed overfield restricts to +the original exact absolute value on the intermediate field. -/ +@[simp] +theorem AbsoluteValueExtension.extendToAlgebraicallyClosed_algebraMap + {K : Type u} {L : Type v} {Ω : Type*} + [Field K] [Field L] [Field Ω] + [Algebra K L] [Algebra L Ω] [Algebra K Ω] + [IsScalarTower K L Ω] + [Algebra.IsAlgebraic L Ω] [IsAlgClosed Ω] + (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) + (u : AbsoluteValueExtension vK L) + (x : L) : + (u.extendToAlgebraicallyClosed vK hvK : + AbsoluteValueExtension vK Ω).1 + (algebraMap L Ω x) = + u.1 x := by + change + absoluteValueExtensionPullback + u.1 (u.isNontrivial hvK) IsAlgClosed.lift + (algebraMap L Ω x) = + u.1 x + exact + absoluteValueExtension_pullback_extends + u.1 (u.isNontrivial hvK) IsAlgClosed.lift x + +/-- The `K`-embedding attached to an exact extension `w | v`. -/ +noncomputable def absoluteValueExtensionEmbeddingOfExtension + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (vK : AbsoluteValue K ℝ) (w : AbsoluteValueExtension vK L) : + L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK := by + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + let phi := absoluteValueExtensionLocalizationEmbedding vK w + refine + { __ := phi.toRingHom.comp (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2) + commutes' := ?_ } + intro x + change phi (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + (algebraMap K L x)) = algebraMap K + (absoluteValueExtensionAlgebraicCompletionClosure vK) x + rw [AbsoluteValue.toAlgebraicLocalization_algebraMap, + phi.commutes] + rfl + +@[simp] +theorem absoluteValueExtension_embeddingOfExtension_apply + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (vK : AbsoluteValue K ℝ) (w : AbsoluteValueExtension vK L) + (x : L) : + absoluteValueExtensionEmbeddingOfExtension vK w x = + absoluteValueExtensionLocalizationEmbedding vK w + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x) := + rfl + +/-- The canonical embedding attached to `w` pulls `\bar v` back to `w`. +This is the witness equality used in the valuation-extension theorem(i). -/ +theorem absoluteValueExtension_extension_eq_pullback_embeddingOfExtension + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) : + w.1 = absoluteValueExtensionPullback vK hvK + (absoluteValueExtensionEmbeddingOfExtension vK w) := by + ext x + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + have h := congrArg + (fun a : AbsoluteValue (AbsoluteValue.algebraicLocalization vK w.1 w.2) ℝ => + a (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x)) + (absoluteValueExtension_localizationAbsoluteValue_eq_pullback vK hvK w) + calc + w.1 x = AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x) := + (AbsoluteValue.algebraicLocalizationAbsoluteValue_toAlgebraicLocalization vK w.1 w.2 x).symm + _ = absoluteValueExtensionPullback vK hvK + (absoluteValueExtensionEmbeddingOfExtension vK w) x := by + change AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x) = + (absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK).comp + (absoluteValueExtensionLocalizationEmbedding vK w).injective + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x) + exact h + +/-- Clause (i) of the valuation-extension theorem: every exact extension of `v` to an algebraic +extension +`L / K` is the pullback of `\bar v` along a `K`-embedding into `\bar K_v`. -/ +theorem absoluteValueExtension_extension_exists_embedding + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) : + ∃ tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK, + w.1 = absoluteValueExtensionPullback vK hvK tau := by + exact ⟨absoluteValueExtensionEmbeddingOfExtension vK w, + absoluteValueExtension_extension_eq_pullback_embeddingOfExtension vK hvK w⟩ + +/-- Conjugacy of two `K`-embeddings over the completion `K_v`. -/ +def AbsoluteValueExtensionConjugateOverCompletion + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) + (tau tau' : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) : Prop := + ∃ sigma : absoluteValueExtensionAlgebraicCompletionClosure vK ≃ₐ[vK.Completion] + absoluteValueExtensionAlgebraicCompletionClosure vK, + ∀ x : L, tau' x = sigma (tau x) + +/-- The unique extension `\bar v` is invariant under every automorphism over +`K_v`. -/ +theorem absoluteValueExtension_algebraicClosureAbsoluteValue_algEquiv + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) + (sigma : absoluteValueExtensionAlgebraicCompletionClosure vK + ≃ₐ[vK.Completion] absoluteValueExtensionAlgebraicCompletionClosure vK) + (x : absoluteValueExtensionAlgebraicCompletionClosure vK) : + absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK (sigma x) = + absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK x := by + let R := AbsoluteValue.uniqueAlgebraicExtension + (K := vK.Completion) + (L := absoluteValueExtensionAlgebraicCompletionClosure vK) + (AbsoluteValue.completionAbsoluteValue vK) + (AbsoluteValue.completionAbsoluteValue_complete vK) + (AbsoluteValue.completionAbsoluteValue_isNontrivial vK hvK) + let a : AbsoluteValue (absoluteValueExtensionAlgebraicCompletionClosure vK) ℝ := + (absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK).comp + (f := sigma.toRingHom) sigma.injective + have ha : a = absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK := by + change a = R.extension + apply R.unique + intro y + change absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK + (sigma (algebraMap vK.Completion + (absoluteValueExtensionAlgebraicCompletionClosure vK) y)) = _ + rw [sigma.commutes] + exact absoluteValueExtension_algebraicClosureAbsoluteValue_algebraMap vK hvK y + exact congrArg (fun b : AbsoluteValue _ ℝ => b x) ha + +/-- Conjugate embeddings induce the same extension of `v`. -/ +theorem absoluteValueExtension_pullback_eq_of_conjugate + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + {tau tau' : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK} + (hconj : AbsoluteValueExtensionConjugateOverCompletion vK tau tau') : + absoluteValueExtensionPullback vK hvK tau = + absoluteValueExtensionPullback vK hvK tau' := by + rcases hconj with ⟨sigma, hsigma⟩ + ext x + change absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK (tau x) = + absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK (tau' x) + rw [hsigma x, absoluteValueExtension_algebraicClosureAbsoluteValue_algEquiv] + +/-- The dense embedding of `\bar K_v` into its metric completion. -/ +noncomputable def absoluteValueExtensionAlgebraicClosureToCompletionRingHom + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) : + absoluteValueExtensionAlgebraicCompletionClosure vK →+* + (absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK).Completion := + UniformSpace.Completion.coeRingHom.comp + (WithAbs.equiv + (absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK)).symm.toRingHom + +@[simp] +theorem absoluteValueExtension_algebraicClosureToCompletionRingHom_apply + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) + (x : absoluteValueExtensionAlgebraicCompletionClosure vK) : + absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK x = + ((WithAbs.equiv + (absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK)).symm x : + (absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK).Completion) := + rfl + +/-- The `K_v`-algebra structure on the completion of `\bar K_v` induced by +the dense algebraic closure. -/ +@[implicit_reducible] +noncomputable def absoluteValueExtensionAlgebraicClosureCompletionAlgebra + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) : + Algebra vK.Completion + (absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK).Completion := + ((absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK).comp + (algebraMap vK.Completion + (absoluteValueExtensionAlgebraicCompletionClosure vK))).toAlgebra + +/-- The dense algebraic-closure map as a `K_v`-algebra homomorphism. -/ +noncomputable def absoluteValueExtensionAlgebraicClosureToCompletionAlgHom + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) : + letI := absoluteValueExtensionAlgebraicClosureCompletionAlgebra vK hvK + absoluteValueExtensionAlgebraicCompletionClosure vK →ₐ[vK.Completion] + (absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK).Completion := by + letI := absoluteValueExtensionAlgebraicClosureCompletionAlgebra vK hvK + exact + { __ := absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK + commutes' _ := rfl } + +/-- A valuation-preserving `K`-embedding `tau` extends isometrically from +`L` to a map between metric completions. -/ +noncomputable def absoluteValueExtensionEmbeddingToAlgebraicClosureCompletionRingHom + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) : + WithAbs w.1 →+* + (absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK).Completion := + (absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK).comp + (tau.toRingHom.comp (WithAbs.equiv w.1).toRingHom) + +theorem absoluteValueExtension_embeddingToAlgebraicClosureCompletion_norm + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtensionPullback vK hvK tau) + (x : WithAbs w.1) : + ‖absoluteValueExtensionEmbeddingToAlgebraicClosureCompletionRingHom + vK hvK w tau x‖ = ‖x‖ := by + change ‖absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK + (tau (WithAbs.equiv w.1 x))‖ = ‖x‖ + rw [absoluteValueExtension_algebraicClosureToCompletionRingHom_apply, + UniformSpace.Completion.norm_coe, WithAbs.norm_eq_apply_ofAbs, + WithAbs.norm_eq_apply_ofAbs] + have h := congrArg (fun a : AbsoluteValue L ℝ => + a (WithAbs.equiv w.1 x)) htau + exact h.symm + +/-- The isometry on the dense field underlying the preceding completion +map. -/ +theorem absoluteValueExtension_embeddingToAlgebraicClosureCompletion_isometry + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtensionPullback vK hvK tau) : + Isometry (absoluteValueExtensionEmbeddingToAlgebraicClosureCompletionRingHom + vK hvK w tau) := + AddMonoidHomClass.isometry_of_norm _ + (absoluteValueExtension_embeddingToAlgebraicClosureCompletion_norm + vK hvK w tau htau) + +/-- Extension of `tau` to the completion `L_w`. -/ +noncomputable def absoluteValueExtensionEmbeddingCompletionMap + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtensionPullback vK hvK tau) : + w.1.Completion →+* + (absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK).Completion := + UniformSpace.Completion.extensionHom + (absoluteValueExtensionEmbeddingToAlgebraicClosureCompletionRingHom + vK hvK w tau) + (absoluteValueExtension_embeddingToAlgebraicClosureCompletion_isometry + vK hvK w tau htau).continuous + +@[simp] +theorem absoluteValueExtension_embeddingCompletionMap_coe + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtensionPullback vK hvK tau) + (x : WithAbs w.1) : + absoluteValueExtensionEmbeddingCompletionMap vK hvK w tau htau + (x : w.1.Completion) = + absoluteValueExtensionEmbeddingToAlgebraicClosureCompletionRingHom + vK hvK w tau x := + UniformSpace.Completion.extensionHom_coe + (absoluteValueExtensionEmbeddingToAlgebraicClosureCompletionRingHom + vK hvK w tau) + (absoluteValueExtension_embeddingToAlgebraicClosureCompletion_isometry + vK hvK w tau htau).continuous x + +/-- The extended completion map is still an isometry. -/ +theorem absoluteValueExtension_embeddingCompletionMap_isometry + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtensionPullback vK hvK tau) : + Isometry (absoluteValueExtensionEmbeddingCompletionMap vK hvK w tau htau) := + (absoluteValueExtension_embeddingToAlgebraicClosureCompletion_isometry + vK hvK w tau htau).completion_extension + +/-- The map `K_v → \widehat{\bar K_v}` through the dense algebraic closure +is an isometry. -/ +theorem absoluteValueExtension_completionToAlgebraicClosureCompletion_isometry + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) : + Isometry ((absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK).comp + (algebraMap vK.Completion + (absoluteValueExtensionAlgebraicCompletionClosure vK))) := by + apply AddMonoidHomClass.isometry_of_norm + intro x + change ‖absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK + (algebraMap vK.Completion + (absoluteValueExtensionAlgebraicCompletionClosure vK) x)‖ = ‖x‖ + rw [absoluteValueExtension_algebraicClosureToCompletionRingHom_apply, + UniformSpace.Completion.norm_coe, WithAbs.norm_eq_apply_ofAbs] + change absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK + (algebraMap vK.Completion + (absoluteValueExtensionAlgebraicCompletionClosure vK) x) = ‖x‖ + rw [absoluteValueExtension_algebraicClosureAbsoluteValue_algebraMap] + rfl + +/-- On `K_v`, the completion extension of `tau` agrees with the canonical +map through `\bar K_v`. Equality on the dense copy of `K` is extended by +continuity. -/ +theorem absoluteValueExtension_embeddingCompletionMap_completionMap + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtensionPullback vK hvK tau) + (x : vK.Completion) : + absoluteValueExtensionEmbeddingCompletionMap vK hvK w tau htau + (AbsoluteValue.completionMap vK w.1 w.2 x) = + absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK + (algebraMap vK.Completion + (absoluteValueExtensionAlgebraicCompletionClosure vK) x) := by + let f := (absoluteValueExtensionEmbeddingCompletionMap vK hvK w tau htau).comp + (AbsoluteValue.completionMap vK w.1 w.2) + let g := (absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK).comp + (algebraMap vK.Completion + (absoluteValueExtensionAlgebraicCompletionClosure vK)) + change f x = g x + refine UniformSpace.Completion.induction_on (α := WithAbs vK) x ?_ ?_ + · exact isClosed_eq + ((absoluteValueExtension_embeddingCompletionMap_isometry + vK hvK w tau htau).continuous.comp + (AbsoluteValue.completionMap_isometry vK w.1 w.2).continuous) + (absoluteValueExtension_completionToAlgebraicClosureCompletion_isometry + vK hvK).continuous + · intro a + dsimp [f, g] + change absoluteValueExtensionEmbeddingCompletionMap vK hvK w tau htau + (AbsoluteValue.completionMap vK w.1 w.2 + (algebraMap K vK.Completion (WithAbs.equiv vK a))) = + absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK + (algebraMap vK.Completion + (absoluteValueExtensionAlgebraicCompletionClosure vK) + (algebraMap K vK.Completion (WithAbs.equiv vK a))) + rw [AbsoluteValue.completionMap_coe] + change absoluteValueExtensionEmbeddingCompletionMap vK hvK w tau htau + (((algebraMap (WithAbs vK) (WithAbs w.1)) a : WithAbs w.1) : + w.1.Completion) = + absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK + (algebraMap vK.Completion + (absoluteValueExtensionAlgebraicCompletionClosure vK) + (a : vK.Completion)) + rw [absoluteValueExtension_embeddingCompletionMap_coe] + change absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK + (tau (algebraMap K L (WithAbs.equiv vK a))) = + absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK + (algebraMap vK.Completion + (absoluteValueExtensionAlgebraicCompletionClosure vK) + (algebraMap K vK.Completion (WithAbs.equiv vK a))) + congr 1 + rw [tau.commutes, + IsScalarTower.algebraMap_apply K vK.Completion + (absoluteValueExtensionAlgebraicCompletionClosure vK)] + +/-- The completion extension of `tau`, bundled over `K_v`. -/ +noncomputable def absoluteValueExtensionEmbeddingCompletionAlgHom + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtensionPullback vK hvK tau) : + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := absoluteValueExtensionAlgebraicClosureCompletionAlgebra vK hvK + w.1.Completion →ₐ[vK.Completion] + (absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK).Completion := by + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := absoluteValueExtensionAlgebraicClosureCompletionAlgebra vK hvK + exact + { __ := absoluteValueExtensionEmbeddingCompletionMap vK hvK w tau htau + commutes' x := + absoluteValueExtension_embeddingCompletionMap_completionMap + vK hvK w tau htau x } + +/-- The image of the localization under the completed embedding lies in the +dense algebraic closure inside its completion. -/ +theorem absoluteValueExtension_embeddingCompletionAlgHom_mem_range + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtensionPullback vK hvK tau) + (z : AbsoluteValue.algebraicLocalization vK w.1 w.2) : + letI := absoluteValueExtensionAlgebraicClosureCompletionAlgebra vK hvK + absoluteValueExtensionEmbeddingCompletionAlgHom vK hvK w tau htau (z : w.1.Completion) + ∈ (absoluteValueExtensionAlgebraicClosureToCompletionAlgHom vK hvK).range := by + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let := absoluteValueExtensionAlgebraicClosureCompletionAlgebra vK hvK + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + let F := absoluteValueExtensionEmbeddingCompletionAlgHom vK hvK w tau htau + let j := absoluteValueExtensionAlgebraicClosureToCompletionAlgHom vK hvK + change F (z : w.1.Completion) ∈ j.range + apply IntermediateField.adjoin_induction + (F := vK.Completion) + (s := Set.range (AbsoluteValue.toCompletion w.1)) + (p := fun x _ => F x ∈ j.range) + (x := (z : w.1.Completion)) + · intro x hx + rcases hx with ⟨y, rfl⟩ + refine ⟨tau y, ?_⟩ + symm + change absoluteValueExtensionEmbeddingCompletionMap vK hvK w tau htau + (AbsoluteValue.toCompletion w.1 y) = + absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK (tau y) + change absoluteValueExtensionEmbeddingCompletionMap vK hvK w tau htau + (((WithAbs.equiv w.1).symm y : WithAbs w.1) : w.1.Completion) = _ + rw [absoluteValueExtension_embeddingCompletionMap_coe] + rfl + · intro x + refine ⟨algebraMap vK.Completion + (absoluteValueExtensionAlgebraicCompletionClosure vK) x, ?_⟩ + exact (absoluteValueExtension_embeddingCompletionMap_completionMap + vK hvK w tau htau x).symm + · intro x y _ _ hx hy + simpa only [map_add] using j.range.add_mem hx hy + · intro x _ hx + rcases hx with ⟨a, ha⟩ + refine ⟨a⁻¹, ?_⟩ + simpa only [map_inv₀] using congrArg Inv.inv ha + · intro x y _ _ hx hy + simpa only [map_mul] using j.range.mul_mem hx hy + · exact z.property + +/-- A valuation-preserving embedding `tau : L → \bar K_v` extends to a +`K_v`-embedding of the common localization. The construction first extends +to metric completions and then factors through the actual dense copy of +`\bar K_v`; no completeness of the algebraic closure is assumed. -/ +noncomputable def absoluteValueExtensionLocalizationEmbeddingOfPullback + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtensionPullback vK hvK tau) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + AbsoluteValue.algebraicLocalization vK w.1 w.2 →ₐ[vK.Completion] + absoluteValueExtensionAlgebraicCompletionClosure vK := by + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := absoluteValueExtensionAlgebraicClosureCompletionAlgebra vK hvK + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + let F := absoluteValueExtensionEmbeddingCompletionAlgHom vK hvK w tau htau + let j := absoluteValueExtensionAlgebraicClosureToCompletionAlgHom vK hvK + let f : E →ₐ[vK.Completion] j.range := + (F.comp E.val).codRestrict j.range + (absoluteValueExtension_embeddingCompletionAlgHom_mem_range + vK hvK w tau htau) + exact (AlgEquiv.ofInjectiveField j).symm.toAlgHom.comp f + +/-- The extended localization embedding restricts to the original `tau` on +the dense copy of `L`. -/ +theorem absoluteValueExtension_localizationEmbeddingOfPullback_toLocalization + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtensionPullback vK hvK tau) + (x : L) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + absoluteValueExtensionLocalizationEmbeddingOfPullback vK hvK w tau htau + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x) = tau x := by + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let := absoluteValueExtensionAlgebraicClosureCompletionAlgebra vK hvK + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + let F := absoluteValueExtensionEmbeddingCompletionAlgHom vK hvK w tau htau + let j := absoluteValueExtensionAlgebraicClosureToCompletionAlgHom vK hvK + apply j.injective + change j ((AlgEquiv.ofInjectiveField j).symm + ⟨F (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x), + absoluteValueExtension_embeddingCompletionAlgHom_mem_range + vK hvK w tau htau _⟩) = j (tau x) + rw [show j ((AlgEquiv.ofInjectiveField j).symm + ⟨F (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x), + absoluteValueExtension_embeddingCompletionAlgHom_mem_range + vK hvK w tau htau _⟩) = + F (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x) by + exact congrArg Subtype.val + ((AlgEquiv.ofInjectiveField j).apply_symm_apply _)] + change absoluteValueExtensionEmbeddingCompletionMap vK hvK w tau htau + (AbsoluteValue.toCompletion w.1 x) = + absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK (tau x) + change absoluteValueExtensionEmbeddingCompletionMap vK hvK w tau htau + (((WithAbs.equiv w.1).symm x : WithAbs w.1) : w.1.Completion) = _ + rw [absoluteValueExtension_embeddingCompletionMap_coe] + rfl + +/-- Two embeddings of an algebraic extension into an algebraic closure are +conjugate by an automorphism of that algebraic closure. The algebra structure +on the closure over `E` is induced by the first embedding. -/ +theorem absoluteValueExtension_algHom_conjugate_in_algClosure + {F E A : Type*} [Field F] [Field E] [Field A] + [Algebra F E] [Algebra F A] + [IsAlgClosure F A] + (phi phi' : E →ₐ[F] A) : + ∃ sigma : A ≃ₐ[F] A, ∀ x : E, sigma (phi x) = phi' x := by + let : IsAlgClosed A := IsAlgClosure.isAlgClosed F + let : Algebra E A := phi.toRingHom.toAlgebra + let : IsScalarTower F E A := + IsScalarTower.of_algebraMap_eq' phi.comp_algebraMap.symm + let : Algebra.IsAlgebraic E A := + Algebra.IsAlgebraic.tower_top (K := F) E + obtain ⟨psi, hpsi⟩ := + IsAlgClosed.surjective_domRestrict_of_isAlgebraic + (K := F) (L := E) (M := A) (E := A) phi' + let sigma : A ≃ₐ[F] A := AlgEquiv.ofBijective psi + (Algebra.IsAlgebraic.algHom_bijective psi) + refine ⟨sigma, fun x => ?_⟩ + have hx := DFunLike.congr_fun hpsi x + change psi (phi x) = phi' x + change psi (algebraMap E A x) = phi' x at hx + rw [RingHom.algebraMap_toAlgebra] at hx + have hphi : phi.toRingHom x = phi x := + congrFun (AlgHom.coe_toRingHom phi) x + rw [hphi] at hx + exact hx + +/-- The difficult direction of clause (ii) of the valuation-extension theorem: equality of +pullback absolute +values forces conjugacy over `K_v`. -/ +theorem absoluteValueExtension_conjugate_of_pullback_eq + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + {tau tau' : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK} + (h : absoluteValueExtensionPullback vK hvK tau = + absoluteValueExtensionPullback vK hvK tau') : + AbsoluteValueExtensionConjugateOverCompletion vK tau tau' := by + let w : AbsoluteValueExtension vK L := + ⟨absoluteValueExtensionPullback vK hvK tau, + absoluteValueExtension_pullback_extends vK hvK tau⟩ + have htau : w.1 = absoluteValueExtensionPullback vK hvK tau := rfl + have htau' : w.1 = absoluteValueExtensionPullback vK hvK tau' := h + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let phi := absoluteValueExtensionLocalizationEmbeddingOfPullback + vK hvK w tau htau + let phi' := absoluteValueExtensionLocalizationEmbeddingOfPullback + vK hvK w tau' htau' + let : Algebra.IsAlgebraic vK.Completion + (AbsoluteValue.algebraicLocalization vK w.1 w.2) := + AbsoluteValue.algebraicLocalization_isAlgebraic vK w.1 w.2 + obtain ⟨sigma, hsigma⟩ := + absoluteValueExtension_algHom_conjugate_in_algClosure phi phi' + refine ⟨sigma, fun x => ?_⟩ + rw [← absoluteValueExtension_localizationEmbeddingOfPullback_toLocalization + vK hvK w tau htau x, + ← absoluteValueExtension_localizationEmbeddingOfPullback_toLocalization + vK hvK w tau' htau' x] + exact (hsigma (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x)).symm + +/-- Clause (ii) of the valuation-extension theorem: two embeddings induce the same extension +exactly when +they are conjugate by an automorphism over the completion `K_v`. -/ +theorem absoluteValueExtension_pullback_eq_iff_conjugate + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (tau tau' : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) : + absoluteValueExtensionPullback vK hvK tau = + absoluteValueExtensionPullback vK hvK tau' ↔ + AbsoluteValueExtensionConjugateOverCompletion vK tau tau' := by + constructor + · exact absoluteValueExtension_conjugate_of_pullback_eq vK hvK + · exact absoluteValueExtension_pullback_eq_of_conjugate vK hvK + +/-- The valuation-extension theorem, with its two clauses packaged together. +The only global side condition is that the base absolute value is +nontrivial. -/ +theorem absoluteValueExtension_extension_theorem + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) : + (∀ w : AbsoluteValueExtension vK L, + ∃ tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK, + w.1 = absoluteValueExtensionPullback vK hvK tau) ∧ + (∀ tau tau' : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK, + absoluteValueExtensionPullback vK hvK tau = + absoluteValueExtensionPullback vK hvK tau' ↔ + AbsoluteValueExtensionConjugateOverCompletion vK tau tau') := by + exact ⟨absoluteValueExtension_extension_exists_embedding vK hvK, + absoluteValueExtension_pullback_eq_iff_conjugate vK hvK⟩ + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeAdjoinRoot.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeAdjoinRoot.lean new file mode 100644 index 0000000000..29098b7ed2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeAdjoinRoot.lean @@ -0,0 +1,192 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.PrimitiveElement +public import Mathlib.LinearAlgebra.FiniteDimensional.Lemmas +public import Mathlib.RingTheory.AdjoinRoot +public import Mathlib.RingTheory.TensorProduct.Free +/-! +# A primitive extension after scalar extension + +If `L/K` has power basis generated by `α`, then the scalar extension +`A ⊗[K] L` is canonically `A[X]/(minpoly_K(α))`. The equivalence below is +the canonical algebra equivalence used in scalar-extension decompositions. +-/ + +@[expose] public section + +noncomputable +section + +namespace ValuationTheory +namespace Completion + +universe u v w + +open scoped TensorProduct Polynomial + +/-- Scalar extension of a power basis. -/ +noncomputable def powerBasisBaseChange + {K A L : Type*} [Field K] [Field A] [Field L] + [Algebra K A] [Algebra K L] + (pb : PowerBasis K L) : PowerBasis A (A ⊗[K] L) where + gen := 1 ⊗ₜ[K] pb.gen + dim := pb.dim + basis := Algebra.TensorProduct.basis A pb.basis + basis_eq_pow i := by + rw [Algebra.TensorProduct.basis_apply, pb.basis_eq_pow] + simp [Algebra.TensorProduct.tmul_pow] + +/-- The generator of a base-changed power basis is the tensor of one with the old generator. -/ +@[simp] +theorem powerBasisBaseChange_gen + {K A L : Type*} [Field K] [Field A] [Field L] + [Algebra K A] [Algebra K L] + (pb : PowerBasis K L) : + (powerBasisBaseChange (A := A) pb).gen = 1 ⊗ₜ[K] pb.gen := + rfl + +/-- The mapped primitive polynomial vanishes at `1 ⊗ α`. -/ +theorem minpoly_map_aeval_one_tmul + {K A L : Type*} [Field K] [Field A] [Field L] + [Algebra K A] [Algebra K L] + (pb : PowerBasis K L) : + Polynomial.aeval (1 ⊗ₜ[K] pb.gen : A ⊗[K] L) + ((minpoly K pb.gen).map (algebraMap K A)) = 0 := by + rw [Polynomial.aeval_map_algebraMap] + change Polynomial.aeval + ((Algebra.TensorProduct.includeRight : L →ₐ[K] A ⊗[K] L) pb.gen) + (minpoly K pb.gen) = 0 + rw [Polynomial.aeval_algHom_apply, minpoly.aeval, map_zero] + +/-- The canonical algebra map from the mapped primitive quotient to the +scalar extension. -/ +noncomputable def adjoinRootToBaseChange + {K A L : Type*} [Field K] [Field A] [Field L] + [Algebra K A] [Algebra K L] + (pb : PowerBasis K L) : + AdjoinRoot ((minpoly K pb.gen).map (algebraMap K A)) →ₐ[A] + A ⊗[K] L := + AdjoinRoot.liftAlgHom _ (Algebra.ofId A (A ⊗[K] L)) + (1 ⊗ₜ[K] pb.gen) (by + change Polynomial.aeval (1 ⊗ₜ[K] pb.gen : A ⊗[K] L) + ((minpoly K pb.gen).map (algebraMap K A)) = 0 + exact minpoly_map_aeval_one_tmul (A := A) pb) + +/-- The map from an adjoined-root algebra to its base change sends root to root. -/ +@[simp] +theorem adjoinRootToBaseChange_root + {K A L : Type*} [Field K] [Field A] [Field L] + [Algebra K A] [Algebra K L] + (pb : PowerBasis K L) : + adjoinRootToBaseChange (A := A) pb + (AdjoinRoot.root ((minpoly K pb.gen).map (algebraMap K A))) = + 1 ⊗ₜ[K] pb.gen := by + simp [adjoinRootToBaseChange] + +/-- The canonical map from the adjoined-root algebra onto its base change is surjective. -/ +theorem adjoinRootToBaseChange_surjective + {K A L : Type*} [Field K] [Field A] [Field L] + [Algebra K A] [Algebra K L] + (pb : PowerBasis K L) : + Function.Surjective (adjoinRootToBaseChange (A := A) pb) := by + let q := (minpoly K pb.gen).map (algebraMap K A) + let e := adjoinRootToBaseChange (A := A) pb + let b := (powerBasisBaseChange (A := A) pb).basis + change Function.Surjective e.toLinearMap + rw [← e.toLinearMap.range_eq_top] + apply top_unique + rw [← b.span_eq] + apply Submodule.span_le.2 + rintro _ ⟨i, rfl⟩ + refine ⟨AdjoinRoot.root q ^ (i : ℕ), ?_⟩ + change e (AdjoinRoot.root q ^ (i : ℕ)) = b i + rw [map_pow, (powerBasisBaseChange (A := A) pb).basis_eq_pow, + adjoinRootToBaseChange_root] + rw [powerBasisBaseChange_gen, Algebra.TensorProduct.tmul_pow, one_pow] + +/-- The mapped primitive quotient and scalar extension have equal dimension. -/ +theorem adjoinRoot_baseChange_finrank_eq + {K A L : Type*} [Field K] [Field A] [Field L] + [Algebra K A] [Algebra K L] + (pb : PowerBasis K L) : + Module.finrank A + (AdjoinRoot ((minpoly K pb.gen).map (algebraMap K A))) = + Module.finrank A (A ⊗[K] L) := by + let q := (minpoly K pb.gen).map (algebraMap K A) + let hq : q.Monic := + (minpoly.monic pb.isIntegral_gen).map (algebraMap K A) + let qpb : PowerBasis A (AdjoinRoot q) := AdjoinRoot.powerBasis' hq + calc + Module.finrank A (AdjoinRoot q) = q.natDegree := qpb.finrank + _ = (minpoly K pb.gen).natDegree := + (minpoly.monic pb.isIntegral_gen).natDegree_map (algebraMap K A) + _ = pb.dim := pb.natDegree_minpoly + _ = Module.finrank A (A ⊗[K] L) := + (powerBasisBaseChange (A := A) pb).finrank.symm + +/-- Canonical scalar-extension presentation, in the quotient-to-tensor +direction. -/ +noncomputable def adjoinRootEquivBaseChange + {K A L : Type*} [Field K] [Field A] [Field L] + [Algebra K A] [Algebra K L] + (pb : PowerBasis K L) : + AdjoinRoot ((minpoly K pb.gen).map (algebraMap K A)) ≃ₐ[A] + A ⊗[K] L := by + let q := (minpoly K pb.gen).map (algebraMap K A) + let hq : q.Monic := + (minpoly.monic pb.isIntegral_gen).map (algebraMap K A) + letI : Module.Finite A (AdjoinRoot q) := hq.finite_adjoinRoot + letI : Module.Finite A (A ⊗[K] L) := + (powerBasisBaseChange (A := A) pb).finite + exact AlgEquiv.ofBijective (adjoinRootToBaseChange (A := A) pb) + ⟨(LinearMap.injective_iff_surjective_of_finrank_eq_finrank + (adjoinRoot_baseChange_finrank_eq (A := A) pb) + (f := (adjoinRootToBaseChange (A := A) pb).toLinearMap)).2 + (adjoinRootToBaseChange_surjective (A := A) pb), + adjoinRootToBaseChange_surjective (A := A) pb⟩ + +/-- The adjoined-root/base-change equivalence preserves the distinguished root. -/ +@[simp] +theorem adjoinRootEquivBaseChange_root + {K A L : Type*} [Field K] [Field A] [Field L] + [Algebra K A] [Algebra K L] + (pb : PowerBasis K L) : + adjoinRootEquivBaseChange (A := A) pb + (AdjoinRoot.root ((minpoly K pb.gen).map (algebraMap K A))) = + 1 ⊗ₜ[K] pb.gen := by + change adjoinRootToBaseChange (A := A) pb + (AdjoinRoot.root ((minpoly K pb.gen).map (algebraMap K A))) = _ + exact adjoinRootToBaseChange_root (A := A) pb + +/-- Canonical scalar-extension presentation of a primitive field extension. -/ +noncomputable def baseChangeEquivAdjoinRoot + {K A L : Type*} [Field K] [Field A] [Field L] + [Algebra K A] [Algebra K L] + (pb : PowerBasis K L) : + A ⊗[K] L ≃ₐ[A] + AdjoinRoot ((minpoly K pb.gen).map (algebraMap K A)) := + (adjoinRootEquivBaseChange (A := A) pb).symm + +/-- The inverse base-change equivalence sends `1 ⊗ gen` to the adjoined root. -/ +@[simp] +theorem baseChangeEquivAdjoinRoot_one_tmul_gen + {K A L : Type*} [Field K] [Field A] [Field L] + [Algebra K A] [Algebra K L] + (pb : PowerBasis K L) : + baseChangeEquivAdjoinRoot (A := A) pb (1 ⊗ₜ[K] pb.gen) = + AdjoinRoot.root ((minpoly K pb.gen).map (algebraMap K A)) := by + change (adjoinRootEquivBaseChange (A := A) pb).symm + (1 ⊗ₜ[K] pb.gen) = _ + rw [← adjoinRootEquivBaseChange_root] + exact (adjoinRootEquivBaseChange (A := A) pb).symm_apply_apply _ + +end Completion +end ValuationTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeNormTrace.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeNormTrace.lean new file mode 100644 index 0000000000..aa4b06b8be --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeNormTrace.lean @@ -0,0 +1,59 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.LinearAlgebra.Charpoly.BaseChange +public import Mathlib.LinearAlgebra.Trace +public import Mathlib.RingTheory.Norm.Basic +public import Mathlib.RingTheory.Trace.Basic +public import Mathlib.RingTheory.TensorProduct.Basic +/-! +# Norm and trace under scalar extension + +Norm and trace formulas compare multiplication by an element of `L` before and after +extending scalars from `K` to `K_v`. These lemmas state that comparison +directly for the canonical element `1 ⊗ₜ x`. +-/ + +@[expose] public section + +noncomputable +section + +namespace ValuationTheory +namespace Completion + +universe u v w + +open scoped TensorProduct + +/-- Algebra norm commutes with scalar extension. -/ +theorem algebra_norm_baseChange_tmul + {K A L : Type*} [Field K] [Field A] [CommRing L] + [Algebra K A] [Algebra K L] + [Module.Free K L] [Module.Finite K L] + (x : L) : + Algebra.norm A (1 ⊗ₜ[K] x : A ⊗[K] L) = + algebraMap K A (Algebra.norm K x) := by + rw [Algebra.norm_apply, ← Algebra.baseChange_lmul, + LinearMap.det_baseChange, ← Algebra.norm_apply] + +/-- Algebra trace commutes with scalar extension. -/ +theorem algebra_trace_baseChange_tmul + {K A L : Type*} [Field K] [Field A] [CommRing L] + [Algebra K A] [Algebra K L] + [Module.Free K L] [Module.Finite K L] + (x : L) : + Algebra.trace A (A ⊗[K] L) (1 ⊗ₜ[K] x) = + algebraMap K A (Algebra.trace K L x) := by + rw [Algebra.trace_apply, ← Algebra.baseChange_lmul, + LinearMap.trace_baseChange, ← Algebra.trace_apply] + +end Completion +end ValuationTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/CanonicalTensorMap.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/CanonicalTensorMap.lean new file mode 100644 index 0000000000..a8022f3419 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/CanonicalTensorMap.lean @@ -0,0 +1,121 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization +public import Mathlib.Algebra.Algebra.Pi +/-! +# The canonical tensor map to all completions + +For every exact extension `w | v`, multiplication in `L_w` gives the map +`K_v ⊗_K L → L_w`. Taking all components produces the canonical map +which occurs in the tensor-product decomposition over a completion. This construction is +independent of the factorisation argument later used to prove bijectivity. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +universe u v + +open scoped TensorProduct + +/-- The product of the component maps `K_v ⊗_K L → L_w`. -/ +noncomputable def completionTensorMapLeftCanonicalHom + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) : + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + vK.Completion ⊗[K] L →ₐ[vK.Completion] + ∀ w : AbsoluteValueExtension vK L, w.1.Completion := by + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + exact AlgHom.pi fun w ↦ + absoluteValueExtensionLocalizationTensorHom vK w + +@[simp] +theorem completionTensorMap_leftCanonicalHom_tmul_apply + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (b : vK.Completion) (a : L) + (w : AbsoluteValueExtension vK L) : + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + completionTensorMapLeftCanonicalHom vK (b ⊗ₜ[K] a) w = + algebraMap vK.Completion w.1.Completion b * + AbsoluteValue.toCompletionAlgHom (K := K) w.1 a := by + let : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + exact absoluteValueExtension_localizationTensorHom_tmul vK w b a + +/-- The canonical `K_v`-algebra map in the chosen tensor-factor order +`L ⊗_K K_v`. -/ +noncomputable def completionTensorMapCanonicalHom + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) : + letI := Algebra.TensorProduct.rightAlgebra + (R := K) (A := L) (B := vK.Completion) + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + L ⊗[K] vK.Completion →ₐ[vK.Completion] + ∀ w : AbsoluteValueExtension vK L, w.1.Completion := by + letI := Algebra.TensorProduct.rightAlgebra + (R := K) (A := L) (B := vK.Completion) + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + let e := Algebra.TensorProduct.comm K L vK.Completion + let h : vK.Completion ⊗[K] L →ₐ[vK.Completion] + ∀ w : AbsoluteValueExtension vK L, w.1.Completion := + completionTensorMapLeftCanonicalHom vK + exact + { toRingHom := h.toRingHom.comp e.toRingEquiv.toRingHom + commutes' := fun b ↦ by + change h (e (algebraMap vK.Completion + (L ⊗[K] vK.Completion) b)) = _ + rw [Algebra.TensorProduct.right_algebraMap_apply, + Algebra.TensorProduct.comm_tmul] + exact h.commutes b } + +@[simp] +theorem completionTensorMap_canonicalHom_tmul_apply + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (a : L) (b : vK.Completion) + (w : AbsoluteValueExtension vK L) : + letI := Algebra.TensorProduct.rightAlgebra + (R := K) (A := L) (B := vK.Completion) + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + completionTensorMapCanonicalHom vK (a ⊗ₜ[K] b) w = + AbsoluteValue.toCompletionAlgHom (K := K) w.1 a * + algebraMap vK.Completion w.1.Completion b := by + let := Algebra.TensorProduct.rightAlgebra + (R := K) (A := L) (B := vK.Completion) + let : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + simp only [completionTensorMapCanonicalHom] + change completionTensorMapLeftCanonicalHom (L := L) vK + (Algebra.TensorProduct.comm K L vK.Completion (a ⊗ₜ[K] b)) w = _ + rw [Algebra.TensorProduct.comm_tmul, + completionTensorMap_leftCanonicalHom_tmul_apply, mul_comm] + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/DegreeNormTrace.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/DegreeNormTrace.lean new file mode 100644 index 0000000000..5606319c2d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/DegreeNormTrace.lean @@ -0,0 +1,174 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductDecomposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductProductFormulas +/-! +# Compatibility of local degree, norm, and trace + +The canonical decomposition of the completion tensor-product decomposition gives the sum of the + local +degrees and the product/sum formulas for norm and trace. Since the global +norm and trace lie in `K`, their Lean statements are mapped into `K_v`. +-/ + +@[expose] public section + +noncomputable +section + +open scoped BigOperators TensorProduct +open ValuationTheory.Completion + +namespace AlgebraicNumberTheory +namespace Valuations + +universe u v + +/-- Every local completion is finite-dimensional over `K_v`. This is +derived from the completion tensor-product decomposition by projecting from its finite product. -/ +theorem completionModuleFinite + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) : + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + Module.Finite vK.Completion w.1.Completion := by + let : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + let : Module.Finite vK.Completion (vK.Completion ⊗[K] L) := + inferInstance + let : Module.Finite vK.Completion + (∀ w : AbsoluteValueExtension vK L, w.1.Completion) := + Module.Finite.equiv (completionTensorDecompositionLeft vK hvK).toLinearEquiv + exact moduleFiniteOfPi + (fun w : AbsoluteValueExtension vK L ↦ w.1.Completion) w + +/-- the local degree, norm, and trace formulas, degree formula. -/ +theorem completionDegreeNormTrace_degree + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) : + letI := completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : ∀ w : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w.1.Completion := + fun w ↦ completionModuleFinite vK hvK w + Module.finrank K L = + ∑ w : AbsoluteValueExtension vK L, + Module.finrank vK.Completion w.1.Completion := by + let := completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK + let : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + let : ∀ w : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w.1.Completion := + fun w ↦ completionModuleFinite vK hvK w + exact baseChange_pi_finrank_eq_sum + (fun w : AbsoluteValueExtension vK L ↦ w.1.Completion) + (completionTensorDecompositionLeft vK hvK) + +/-- the local degree, norm, and trace formulas, norm formula, written in `K_v`. -/ +theorem completionDegreeNormTrace_norm + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) (x : L) : + letI := completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : ∀ w : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w.1.Completion := + fun w ↦ completionModuleFinite vK hvK w + algebraMap K vK.Completion (Algebra.norm K x) = + ∏ w : AbsoluteValueExtension vK L, + Algebra.norm vK.Completion + (AbsoluteValue.toCompletionAlgHom (K := K) w.1 x) := by + let := completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK + let : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + let : ∀ w : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w.1.Completion := + fun w ↦ completionModuleFinite vK hvK w + simpa using baseChange_pi_norm_eq_prod + (fun w : AbsoluteValueExtension vK L ↦ w.1.Completion) + (completionTensorDecompositionLeft vK hvK) x + +/-- the local degree, norm, and trace formulas, trace formula, written in `K_v`. -/ +theorem completionDegreeNormTrace_trace + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) (x : L) : + letI := completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : ∀ w : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w.1.Completion := + fun w ↦ completionModuleFinite vK hvK w + algebraMap K vK.Completion (Algebra.trace K L x) = + ∑ w : AbsoluteValueExtension vK L, + Algebra.trace vK.Completion w.1.Completion + (AbsoluteValue.toCompletionAlgHom (K := K) w.1 x) := by + let := completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK + let : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + let : ∀ w : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w.1.Completion := + fun w ↦ completionModuleFinite vK hvK w + simpa using baseChange_pi_trace_eq_sum + (fun w : AbsoluteValueExtension vK L ↦ w.1.Completion) + (completionTensorDecompositionLeft vK hvK) x + +/-- **the local degree, norm, and trace formulas.** The degree, norm, and trace formulas obtained +simultaneously from the canonical decomposition of the completion tensor-product decomposition. -/ +theorem completionDegreeNormTrace + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) : + letI := completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : ∀ w : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w.1.Completion := + fun w ↦ completionModuleFinite vK hvK w + (Module.finrank K L = + ∑ w : AbsoluteValueExtension vK L, + Module.finrank vK.Completion w.1.Completion) ∧ + (∀ x : L, + algebraMap K vK.Completion (Algebra.norm K x) = + ∏ w : AbsoluteValueExtension vK L, + Algebra.norm vK.Completion + (AbsoluteValue.toCompletionAlgHom (K := K) w.1 x)) ∧ + (∀ x : L, + algebraMap K vK.Completion (Algebra.trace K L x) = + ∑ w : AbsoluteValueExtension vK L, + Algebra.trace vK.Completion w.1.Completion + (AbsoluteValue.toCompletionAlgHom (K := K) w.1 x)) := by + let := completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK + let : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + let : ∀ w : AbsoluteValueExtension vK L, + Module.Finite vK.Completion w.1.Completion := + fun w ↦ completionModuleFinite vK hvK w + exact ⟨completionDegreeNormTrace_degree (K := K) (L := L) vK hvK, + fun x ↦ completionDegreeNormTrace_norm (K := K) (L := L) vK hvK x, + fun x ↦ completionDegreeNormTrace_trace (K := K) (L := L) vK hvK x⟩ + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionFactorClassification.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionFactorClassification.lean new file mode 100644 index 0000000000..005380ef4a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionFactorClassification.lean @@ -0,0 +1,1114 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialFactors +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization +public import Mathlib.FieldTheory.Minpoly.IsIntegrallyClosed +/-! +# Classification of extensions of a completed absolute value + +For a simple finite extension `L = K(α)`, the extensions of a nontrivial +absolute value of `K` correspond to the distinct irreducible factors, over +the completion, of an irreducible polynomial having `α` as a root. The final +theorem below also records the explicit pullback valuation and the extension +of the chosen embedding to the completed field. +-/ + +@[expose] public section + +noncomputable +section + +open Polynomial +open scoped Topology +open ValuationTheory.Completion + +namespace AlgebraicNumberTheory +namespace Valuations + +universe u v + +/-- Base change of the chosen irreducible polynomial from `K` to its completion `K_v`. -/ +abbrev completionExtensionFactorCompletionPolynomial + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) (f : K[X]) : + vK.Completion[X] := + f.map (algebraMap K vK.Completion) + +/-- The distinct normalized irreducible factors appearing after base change +to the completion. Repeated factors of an inseparable polynomial occur only once. -/ +abbrev CompletionExtensionFactorCompletionFactors + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) (f : K[X]) := + DistinctNormalizedFactors (completionExtensionFactorCompletionPolynomial vK f) + +/-- A root of the chosen irreducible polynomial is integral over the base +field. This is derived from `hf` and `hroot`; it is not an extra hypothesis +of the extension-factor correspondence. -/ +theorem completionExtensionFactor_root_isIntegral + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + {α : L} {f : K[X]} (hf : Irreducible f) + (hroot : Polynomial.aeval α f = 0) : IsIntegral K α := + (show IsAlgebraic K α from ⟨f, hf.ne_zero, hroot⟩).isIntegral + +/-- An irreducible polynomial having `α` as a root is associated to the +minimal polynomial of `α`. -/ +theorem completionExtensionFactor_definingPolynomial_associated_minpoly + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + {α : L} {f : K[X]} (hf : Irreducible f) + (hroot : Polynomial.aeval α f = 0) : + Associated f (minpoly K α) := by + have hlead : f.leadingCoeff ≠ 0 := leadingCoeff_ne_zero.mpr hf.ne_zero + have hunit : IsUnit (C f.leadingCoeff⁻¹ : K[X]) := + isUnit_C.mpr (IsUnit.mk0 f.leadingCoeff⁻¹ (inv_ne_zero hlead)) + exact (associated_mul_unit_right f (C f.leadingCoeff⁻¹) hunit).trans + (Associated.of_eq (minpoly.eq_of_irreducible hf hroot)) + +/-- After base change to the completion, the chosen irreducible polynomial and the minimal +polynomial still have exactly the same normalized irreducible factors. -/ +theorem completionExtensionFactor_completionFactors_eq_minpolyFactors + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) {α : L} {f : K[X]} + (hf : Irreducible f) (hroot : Polynomial.aeval α f = 0) : + polynomialDistinctNormalizedFactors + (completionExtensionFactorCompletionPolynomial vK f) = + polynomialDistinctNormalizedFactors + ((minpoly K α).map (algebraMap K vK.Completion)) := by + exact polynomialDistinctNormalizedFactors_eq_of_associated + (Polynomial.associated_map_map (algebraMap K vK.Completion) + (completionExtensionFactor_definingPolynomial_associated_minpoly hf hroot)) + +/-- Transport the factor set of the mapped minimal polynomial to the factor +set of the particular chosen irreducible polynomial. -/ +noncomputable def completionExtensionFactorMinpolyFactorsEquivCompletionFactors + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) {α : L} {f : K[X]} + (hf : Irreducible f) (hroot : Polynomial.aeval α f = 0) : + DistinctNormalizedFactors + ((minpoly K α).map (algebraMap K vK.Completion)) ≃ + CompletionExtensionFactorCompletionFactors vK f := + Set.equivOfEq (by + ext g + exact Finset.ext_iff.mp + (completionExtensionFactor_completionFactors_eq_minpolyFactors + vK hf hroot).symm g) + +/-- The root/minimal-polynomial relation transported from roots to simple +`K`-embeddings into the algebraic closure of `K_v`. -/ +abbrev CompletionExtensionFactorEmbeddingSetoid + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (α : L) (hα : IsIntegral K α) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) : + Setoid (L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) := + Setoid.comap + (simpleEmbeddingsEquivMappedMinpolyRoots + (K' := vK.Completion) + (E := absoluteValueExtensionAlgebraicCompletionClosure vK) + α hα hgen) + (rootMinpolySetoid + ((minpoly K α).map (algebraMap K vK.Completion))) + +/-- Conjugacy classes of simple embeddings are the distinct irreducible +factors of the mapped minimal polynomial. -/ +noncomputable def completionExtensionFactorEmbeddingClassesEquivMinpolyFactors + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (α : L) (hα : IsIntegral K α) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) : + Quotient (CompletionExtensionFactorEmbeddingSetoid vK α hα hgen) ≃ + DistinctNormalizedFactors + ((minpoly K α).map (algebraMap K vK.Completion)) := + let e := simpleEmbeddingsEquivMappedMinpolyRoots + (K' := vK.Completion) + (E := absoluteValueExtensionAlgebraicCompletionClosure vK) + α hα hgen + (Quotient.congr e (fun _ _ => Iff.rfl)).trans + (rootClassesEquivDistinctNormalizedFactors + (E := absoluteValueExtensionAlgebraicCompletionClosure vK) + ((Polynomial.map_ne_zero_iff + (algebraMap K vK.Completion).injective).2 (minpoly.ne_zero hα))) + +/-- For a simple extension, the relation used in the preceding quotient is +exactly conjugacy of embeddings over `K_v` from the valuation-extension theorem. -/ +theorem completionExtensionFactor_embeddingSetoid_rel_iff_conjugate + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (α : L) (hα : IsIntegral K α) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) + (τ τ' : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) : + (CompletionExtensionFactorEmbeddingSetoid vK α hα hgen).r τ τ' ↔ + AbsoluteValueExtensionConjugateOverCompletion vK τ τ' := by + let pb : PowerBasis K L := PowerBasis.ofAdjoinEqTop hα hgen + have hpbgen : pb.gen = α := by simp [pb] + change IsConjRoot vK.Completion (τ α) (τ' α) ↔ _ + constructor + · intro hconj + obtain ⟨σ, hσ⟩ := IsConjRoot.exists_algEquiv hconj.symm + refine ⟨σ, ?_⟩ + let στ : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK := + (σ.toAlgHom.restrictScalars K).comp τ + have heq : τ' = στ := by + apply pb.algHom_ext + rw [hpbgen] + exact hσ.symm + intro x + exact DFunLike.congr_fun heq x + · rintro ⟨σ, hσ⟩ + change minpoly vK.Completion (τ α) = minpoly vK.Completion (τ' α) + rw [hσ α] + exact (minpoly.algEquiv_eq σ (τ α)).symm + +/-- Regard the pullback attached to an embedding as an exact extension. +The extension property is the one proved in the valuation-extension theorem, rather than an +extra field in the data of the extension-factor correspondence. -/ +noncomputable def pullbackAbsoluteValueExtension + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (τ : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) : + AbsoluteValueExtension vK L := + ⟨absoluteValueExtensionPullback vK hvK τ, + absoluteValueExtension_pullback_extends vK hvK τ⟩ + +/-- In the simple-extension situation, equality of the two pullback +valuations is exactly the factor relation used on embeddings. The forward +direction is proved by extending both embeddings to the same completion and +comparing minimal polynomials there. -/ +theorem completionExtensionFactor_pullback_eq_iff_embeddingSetoid_rel + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (α : L) (hα : IsIntegral K α) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) + (τ τ' : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) : + absoluteValueExtensionPullback vK hvK τ = + absoluteValueExtensionPullback vK hvK τ' ↔ + (CompletionExtensionFactorEmbeddingSetoid vK α hα hgen).r τ τ' := by + let pb : PowerBasis K L := PowerBasis.ofAdjoinEqTop hα hgen + let : FiniteDimensional K L := pb.finite + let : Algebra.IsAlgebraic K L := inferInstance + rw [completionExtensionFactor_embeddingSetoid_rel_iff_conjugate + vK α hα hgen τ τ'] + exact absoluteValueExtension_pullback_eq_iff_conjugate vK hvK τ τ' + +/-- The canonical embedding attached to `w` by the valuation-extension theorem pulls `bar v` +back to `w` itself. -/ +theorem completionExtensionFactor_extension_eq_pullback_embeddingOfExtension + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) : + w.1 = absoluteValueExtensionPullback vK hvK + (absoluteValueExtensionEmbeddingOfExtension vK w) := by + exact absoluteValueExtension_extension_eq_pullback_embeddingOfExtension vK hvK w + +/-- Exact extensions are the same as the conjugacy classes of embeddings +used in the factor calculation. -/ +noncomputable def completionExtensionFactorExtensionsEquivEmbeddingClasses + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (α : L) (hα : IsIntegral K α) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) : + AbsoluteValueExtension vK L ≃ + Quotient (CompletionExtensionFactorEmbeddingSetoid vK α hα hgen) := by + let pb : PowerBasis K L := PowerBasis.ofAdjoinEqTop hα hgen + letI : FiniteDimensional K L := pb.finite + letI : Algebra.IsAlgebraic K L := inferInstance + let fromClass : + Quotient (CompletionExtensionFactorEmbeddingSetoid vK α hα hgen) → + AbsoluteValueExtension vK L := + Quotient.lift + (pullbackAbsoluteValueExtension vK hvK) + (by + intro τ τ' hrel + apply Subtype.ext + exact (completionExtensionFactor_pullback_eq_iff_embeddingSetoid_rel + vK hvK α hα hgen τ τ').2 hrel) + refine + { toFun := fun w => Quotient.mk + (CompletionExtensionFactorEmbeddingSetoid vK α hα hgen) + (absoluteValueExtensionEmbeddingOfExtension vK w) + invFun := fromClass + left_inv := ?_ + right_inv := ?_ } + · intro w + apply Subtype.ext + exact (completionExtensionFactor_extension_eq_pullback_embeddingOfExtension + vK hvK w).symm + · intro q + induction q using Quotient.inductionOn with + | _ τ => + apply Quotient.sound + let wτ : AbsoluteValueExtension vK L := + pullbackAbsoluteValueExtension vK hvK τ + apply (completionExtensionFactor_pullback_eq_iff_embeddingSetoid_rel + vK hvK α hα hgen + (absoluteValueExtensionEmbeddingOfExtension vK wτ) τ).1 + exact (completionExtensionFactor_extension_eq_pullback_embeddingOfExtension + vK hvK wτ).symm + +/-- Auxiliary form of the correspondence, first stated for the mapped +minimal polynomial. -/ +noncomputable def completionExtensionFactorExtensionsEquivMinpolyFactors + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (α : L) (hα : IsIntegral K α) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) : + AbsoluteValueExtension vK L ≃ + DistinctNormalizedFactors + ((minpoly K α).map (algebraMap K vK.Completion)) := + (completionExtensionFactorExtensionsEquivEmbeddingClasses + vK hvK α hα hgen).trans + (completionExtensionFactorEmbeddingClassesEquivMinpolyFactors + vK α hα hgen) + +/-- Auxiliary form with the particular chosen irreducible polynomial `f` as +target. -/ +noncomputable def completionExtensionFactorExtensionsEquivCompletionFactorsAux + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + {α : L} {f : K[X]} (hf : Irreducible f) + (hroot : Polynomial.aeval α f = 0) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) : + AbsoluteValueExtension vK L ≃ + CompletionExtensionFactorCompletionFactors vK f := + let hα := completionExtensionFactor_root_isIntegral hf hroot + (completionExtensionFactorExtensionsEquivMinpolyFactors + vK hvK α hα hgen).trans + (completionExtensionFactorMinpolyFactorsEquivCompletionFactors + vK hf hroot) + +/-- The irreducible factor attached directly to an exact extension `w`: it +is the minimal polynomial over `K_v` of the image of `α` in `L_w`. -/ +noncomputable def completionExtensionFactorExtensionFactor + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (α : L) + (w : AbsoluteValueExtension vK L) : vK.Completion[X] := by + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + exact minpoly vK.Completion + (AbsoluteValue.toCompletionAlgHom (K := K) w.1 α) + +/-- The directly attached factor is one of the distinct normalized factors +of the chosen irreducible polynomial over the completion. -/ +theorem completionExtensionFactor_extensionFactor_mem + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) {α : L} {f : K[X]} + (hf : Irreducible f) (hroot : Polynomial.aeval α f = 0) + (w : AbsoluteValueExtension vK L) : + completionExtensionFactorExtensionFactor vK α w ∈ + polynomialDistinctNormalizedFactors + (completionExtensionFactorCompletionPolynomial vK f) := by + classical + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let hKv := AbsoluteValue.completionAlgebra vK w.1 w.2 + let : IsScalarTower K vK.Completion w.1.Completion := + AbsoluteValue.completion_isScalarTower vK w.1 w.2 + let ι : L →ₐ[K] w.1.Completion := + AbsoluteValue.toCompletionAlgHom (K := K) w.1 + let a : w.1.Completion := ι α + have hαalg : IsAlgebraic K α := ⟨f, hf.ne_zero, hroot⟩ + have hα : IsIntegral K α := hαalg.isIntegral + have haK : IsIntegral K a := by + exact IsIntegral.map_of_comp_eq (RingHom.id K) ι.toRingHom + (by ext x; simp) hα + have haKv : IsIntegral vK.Completion a := + IsIntegral.tower_top haK + have hp0 : completionExtensionFactorCompletionPolynomial vK f ≠ 0 := + (Polynomial.map_ne_zero_iff + (algebraMap K vK.Completion).injective).2 hf.ne_zero + have haf : Polynomial.aeval a + (completionExtensionFactorCompletionPolynomial vK f) = 0 := by + change Polynomial.aeval (ι α) + (f.map (algebraMap K vK.Completion)) = 0 + rw [Polynomial.aeval_map_algebraMap] + rw [Polynomial.aeval_algHom_apply ι α f, hroot, map_zero] + dsimp [completionExtensionFactorExtensionFactor, + polynomialDistinctNormalizedFactors, polynomialNormalizedFactors] + rw [Multiset.mem_toFinset, Polynomial.mem_normalizedFactors_iff hp0] + exact ⟨minpoly.irreducible haKv, minpoly.monic haKv, + minpoly.dvd vK.Completion a haf⟩ + +/-- The canonical map from exact extensions to completion factors. -/ +noncomputable def completionExtensionFactorExtensionToFactor + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) {α : L} {f : K[X]} + (hf : Irreducible f) (hroot : Polynomial.aeval α f = 0) : + AbsoluteValueExtension vK L → + CompletionExtensionFactorCompletionFactors vK f := + fun w => ⟨completionExtensionFactorExtensionFactor vK α w, + completionExtensionFactor_extensionFactor_mem vK hf hroot w⟩ + +/-- The factor read from the canonical embedding supplied by the valuation-extension theorem is +the same polynomial as the factor read directly in the metric completion +`L_w`. -/ +theorem completionExtensionFactor_embeddingOfExtension_minpoly + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (vK : AbsoluteValue K ℝ) (α : L) + (w : AbsoluteValueExtension vK L) : + minpoly vK.Completion + (absoluteValueExtensionEmbeddingOfExtension vK w α) = + completionExtensionFactorExtensionFactor vK α w := by + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let a := AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 α + calc + minpoly vK.Completion + (absoluteValueExtensionEmbeddingOfExtension vK w α) = + minpoly vK.Completion a := + minpoly.algHom_eq + (absoluteValueExtensionLocalizationEmbedding vK w) + (absoluteValueExtensionLocalizationEmbedding vK w).injective a + _ = minpoly vK.Completion + (AbsoluteValue.toCompletionAlgHom (K := K) w.1 α) := by + rw [← minpoly.algHom_eq + (AbsoluteValue.algebraicLocalization vK w.1 w.2).val + (AbsoluteValue.algebraicLocalization vK w.1 w.2).val.injective a] + rfl + _ = completionExtensionFactorExtensionFactor vK α w := rfl + +/-- In a finite simple extension the image of the primitive generator +already generates the whole metric completion over `K_v`. No separability +hypothesis is used. -/ +theorem completionExtensionFactor_completion_adjoin_eq_top + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (α : L) (hα : IsIntegral K α) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) + (w : AbsoluteValueExtension vK L) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + Algebra.adjoin vK.Completion + ({AbsoluteValue.toCompletionAlgHom (K := K) w.1 α} : + Set w.1.Completion) = ⊤ := by + let pb : PowerBasis K L := PowerBasis.ofAdjoinEqTop hα hgen + let : FiniteDimensional K L := pb.finite + let : Algebra.IsAlgebraic K L := inferInstance + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let : IsScalarTower K vK.Completion w.1.Completion := + AbsoluteValue.completion_isScalarTower vK w.1 w.2 + let ι : L →ₐ[K] w.1.Completion := + AbsoluteValue.toCompletionAlgHom (K := K) w.1 + let a : w.1.Completion := ι α + have haK : IsIntegral K a := by + exact IsIntegral.map_of_comp_eq (RingHom.id K) ι.toRingHom + (by ext x; simp) hα + have haKv : IsIntegral vK.Completion a := + IsIntegral.tower_top haK + have hrange : Set.range + (AbsoluteValue.toCompletion w.1) ⊆ + (IntermediateField.adjoin vK.Completion ({a} : Set w.1.Completion) : + Set w.1.Completion) := by + rintro _ ⟨x, rfl⟩ + change ι x ∈ IntermediateField.adjoin vK.Completion ({a} : Set _) + have hx : x ∈ Algebra.adjoin K ({α} : Set L) := by + rw [hgen] + trivial + induction hx using Algebra.adjoin_induction with + | mem x hx => + rw [Set.mem_singleton_iff.mp hx] + exact IntermediateField.mem_adjoin_simple_self vK.Completion a + | algebraMap x => + rw [ι.commutes, + IsScalarTower.algebraMap_apply K vK.Completion w.1.Completion] + exact (IntermediateField.adjoin vK.Completion ({a} : Set _)).algebraMap_mem _ + | add x y _ _ hx hy => + simpa only [map_add] using + (IntermediateField.adjoin vK.Completion ({a} : Set _)).add_mem hx hy + | mul x y _ _ hx hy => + simpa only [map_mul] using + (IntermediateField.adjoin vK.Completion ({a} : Set _)).mul_mem hx hy + have hloc_le : AbsoluteValue.algebraicLocalization vK w.1 w.2 ≤ + IntermediateField.adjoin vK.Completion ({a} : Set _) := by + exact IntermediateField.adjoin_le_iff.mpr hrange + have hsimple : IntermediateField.adjoin vK.Completion ({a} : Set _) = ⊤ := by + apply top_unique + rw [← absoluteValueExtension_finiteLocalization_eq_top vK hvK w] + exact hloc_le + rw [← IntermediateField.adjoin_simple_toSubalgebra_of_isAlgebraic + haKv.isAlgebraic, + hsimple, IntermediateField.top_toSubalgebra] + +/-- The finite simple field cut out by the factor attached to `w` is the +metric completion `L_w`. -/ +noncomputable def completionExtensionFactorAdjoinRootEquivCompletion + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (α : L) (hα : IsIntegral K α) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) + (w : AbsoluteValueExtension vK L) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + AdjoinRoot (completionExtensionFactorExtensionFactor vK α w) ≃ₐ[vK.Completion] + w.1.Completion := by + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : IsScalarTower K vK.Completion w.1.Completion := + AbsoluteValue.completion_isScalarTower vK w.1 w.2 + let ι : L →ₐ[K] w.1.Completion := + AbsoluteValue.toCompletionAlgHom (K := K) w.1 + let a : w.1.Completion := ι α + have haK : IsIntegral K a := by + exact IsIntegral.map_of_comp_eq (RingHom.id K) ι.toRingHom + (by ext x; simp) hα + have haKv : IsIntegral vK.Completion a := + IsIntegral.tower_top haK + have htop : Algebra.adjoin vK.Completion ({a} : Set w.1.Completion) = ⊤ := + completionExtensionFactor_completion_adjoin_eq_top + vK hvK α hα hgen w + change AdjoinRoot (minpoly vK.Completion a) ≃ₐ[vK.Completion] + w.1.Completion + exact (@minpoly.equivAdjoin vK.Completion w.1.Completion _ _ _ _ _ _ + (Module.isTorsionFree_iff_algebraMap_injective.mpr + (algebraMap vK.Completion w.1.Completion).injective) a haKv).trans + ((Subalgebra.equivOfEq _ _ htop).trans Subalgebra.topEquiv) + +/-- The preceding equivalence sends the residue class of `X` to the +canonical image of the primitive generator in `L_w`. -/ +@[simp] +theorem completionExtensionFactor_adjoinRootEquivCompletion_root + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (α : L) (hα : IsIntegral K α) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) + (w : AbsoluteValueExtension vK L) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + completionExtensionFactorAdjoinRootEquivCompletion vK hvK α hα hgen w + (AdjoinRoot.root (completionExtensionFactorExtensionFactor vK α w)) = + AbsoluteValue.toCompletionAlgHom (K := K) w.1 α := by + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let : IsScalarTower K vK.Completion w.1.Completion := + AbsoluteValue.completion_isScalarTower vK w.1 w.2 + let ι : L →ₐ[K] w.1.Completion := + AbsoluteValue.toCompletionAlgHom (K := K) w.1 + let a : w.1.Completion := ι α + change ((AdjoinRoot.Minpoly.toAdjoin vK.Completion a) + (AdjoinRoot.root (minpoly vK.Completion a)) : w.1.Completion) = a + exact AdjoinRoot.Minpoly.coe_toAdjoin_mk_X + (R := vK.Completion) (x := a) + +/-- If `w` is presented as the pullback along an embedding `τ`, then the +factor attached to `w` is the minimal polynomial of `τ(α)`. -/ +theorem completionExtensionFactor_extensionFactor_eq_minpoly_of_pullback + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (α : L) (hα : IsIntegral K α) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) + (w : AbsoluteValueExtension vK L) + (τ : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) + (hτ : w.1 = absoluteValueExtensionPullback vK hvK τ) : + completionExtensionFactorExtensionFactor vK α w = + minpoly vK.Completion (τ α) := by + let pb : PowerBasis K L := PowerBasis.ofAdjoinEqTop hα hgen + let : FiniteDimensional K L := pb.finite + let : Algebra.IsAlgebraic K L := inferInstance + let τw := absoluteValueExtensionEmbeddingOfExtension vK w + have hpull : absoluteValueExtensionPullback vK hvK τw = + absoluteValueExtensionPullback vK hvK τ := + (absoluteValueExtension_extension_eq_pullback_embeddingOfExtension + vK hvK w).symm.trans hτ + have hrel : (CompletionExtensionFactorEmbeddingSetoid vK α hα hgen).r τw τ := + (completionExtensionFactor_pullback_eq_iff_embeddingSetoid_rel + vK hvK α hα hgen τw τ).1 hpull + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + change minpoly vK.Completion + (AbsoluteValue.toCompletionAlgHom (K := K) w.1 α) = _ + calc + minpoly vK.Completion + (AbsoluteValue.toCompletionAlgHom (K := K) w.1 α) = + minpoly vK.Completion (τw α) := + (completionExtensionFactor_embeddingOfExtension_minpoly vK α w).symm + _ = minpoly vK.Completion (τ α) := hrel + +/-- The embedding `τ` extends from `L` to an algebraic equivalence from +`L_w` onto the simple field `K_v(τ(α))`. The compatibility with every +element of `L` is proved below. -/ +noncomputable def completionExtensionFactorCompletionEquivSimpleRoot + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (α : L) (hα : IsIntegral K α) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) + (w : AbsoluteValueExtension vK L) + (τ : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) + (hτ : w.1 = absoluteValueExtensionPullback vK hvK τ) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + w.1.Completion ≃ₐ[vK.Completion] + IntermediateField.adjoin vK.Completion + ({τ α} : Set (absoluteValueExtensionAlgebraicCompletionClosure vK)) := by + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : IsScalarTower K vK.Completion w.1.Completion := + AbsoluteValue.completion_isScalarTower vK w.1 w.2 + have hfactor : completionExtensionFactorExtensionFactor vK α w = + minpoly vK.Completion (τ α) := + completionExtensionFactor_extensionFactor_eq_minpoly_of_pullback + vK hvK α hα hgen w τ hτ + have hτα : IsIntegral vK.Completion (τ α) := + (Algebra.IsAlgebraic.isAlgebraic (τ α)).isIntegral + exact (completionExtensionFactorAdjoinRootEquivCompletion + vK hvK α hα hgen w).symm |>.trans + ((AdjoinRoot.algEquivOfEq vK.Completion _ _ hfactor).trans + (IntermediateField.adjoinRootEquivAdjoin vK.Completion hτα)) + +/-- On the primitive generator, the completed embedding has the prescribed +value `τ(α)`. -/ +@[simp] +theorem completionExtensionFactor_completionEquivSimpleRoot_gen + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (α : L) (hα : IsIntegral K α) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) + (w : AbsoluteValueExtension vK L) + (τ : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) + (hτ : w.1 = absoluteValueExtensionPullback vK hvK τ) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + completionExtensionFactorCompletionEquivSimpleRoot + vK hvK α hα hgen w τ hτ + (AbsoluteValue.toCompletionAlgHom (K := K) w.1 α) = + IntermediateField.AdjoinSimple.gen vK.Completion (τ α) := by + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let : IsScalarTower K vK.Completion w.1.Completion := + AbsoluteValue.completion_isScalarTower vK w.1 w.2 + let e0 := completionExtensionFactorAdjoinRootEquivCompletion + vK hvK α hα hgen w + let hfactor : completionExtensionFactorExtensionFactor vK α w = + minpoly vK.Completion (τ α) := + completionExtensionFactor_extensionFactor_eq_minpoly_of_pullback + vK hvK α hα hgen w τ hτ + let e1 := AdjoinRoot.algEquivOfEq vK.Completion _ _ hfactor + have hτα : IsIntegral vK.Completion (τ α) := + (Algebra.IsAlgebraic.isAlgebraic (τ α)).isIntegral + let e2 := IntermediateField.adjoinRootEquivAdjoin vK.Completion hτα + have hinv : e0.symm + (AbsoluteValue.toCompletionAlgHom (K := K) w.1 α) = + AdjoinRoot.root (completionExtensionFactorExtensionFactor vK α w) := by + apply e0.injective + rw [e0.apply_symm_apply, + completionExtensionFactor_adjoinRootEquivCompletion_root] + change (e0.symm.trans (e1.trans e2)) + (AbsoluteValue.toCompletionAlgHom (K := K) w.1 α) = _ + rw [AlgEquiv.trans_apply, hinv, AlgEquiv.trans_apply, + AdjoinRoot.algEquivOfEq_root, + IntermediateField.adjoinRootEquivAdjoin_apply_root] + +/-- The equivalence to `K_v(τ(α))` really extends `τ` on every element of +`L`, not merely on the chosen primitive generator. -/ +theorem completionExtensionFactor_completionEquivSimpleRoot_coe + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (α : L) (hα : IsIntegral K α) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) + (w : AbsoluteValueExtension vK L) + (τ : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) + (hτ : w.1 = absoluteValueExtensionPullback vK hvK τ) + (x : L) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + ((completionExtensionFactorCompletionEquivSimpleRoot + vK hvK α hα hgen w τ hτ + (AbsoluteValue.toCompletionAlgHom (K := K) w.1 x) : + IntermediateField.adjoin vK.Completion + ({τ α} : Set (absoluteValueExtensionAlgebraicCompletionClosure vK))) : + absoluteValueExtensionAlgebraicCompletionClosure vK) = τ x := by + let pb : PowerBasis K L := PowerBasis.ofAdjoinEqTop hα hgen + let : FiniteDimensional K L := pb.finite + let : Algebra.IsAlgebraic K L := inferInstance + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let : IsScalarTower K vK.Completion w.1.Completion := + AbsoluteValue.completion_isScalarTower vK w.1 w.2 + let E := IntermediateField.adjoin vK.Completion + ({τ α} : Set (absoluteValueExtensionAlgebraicCompletionClosure vK)) + let e : w.1.Completion ≃ₐ[vK.Completion] E := + completionExtensionFactorCompletionEquivSimpleRoot + vK hvK α hα hgen w τ hτ + let ι : L →ₐ[K] w.1.Completion := + AbsoluteValue.toCompletionAlgHom (K := K) w.1 + let φ : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK := + ((E.val.comp e.toAlgHom).restrictScalars K).comp ι + have hpbgen : pb.gen = α := by simp [pb] + have hφ : φ = τ := by + apply pb.algHom_ext + rw [hpbgen] + change ((e (ι α) : E) : + absoluteValueExtensionAlgebraicCompletionClosure vK) = τ α + rw [completionExtensionFactor_completionEquivSimpleRoot_gen] + rfl + exact DFunLike.congr_fun hφ x + +/-- On an extension `w`, the auxiliary correspondence is the directly +defined polynomial `minpoly_{K_v}(α in L_w)`. -/ +theorem completionExtensionFactor_extensionsEquivCompletionFactorsAux_apply + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + {α : L} {f : K[X]} (hf : Irreducible f) + (hroot : Polynomial.aeval α f = 0) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) + (w : AbsoluteValueExtension vK L) : + (completionExtensionFactorExtensionsEquivCompletionFactorsAux + vK hvK hf hroot hgen w).1 = + completionExtensionFactorExtensionFactor vK α w := by + let hα := completionExtensionFactor_root_isIntegral hf hroot + let pb : PowerBasis K L := PowerBasis.ofAdjoinEqTop hα hgen + let : FiniteDimensional K L := pb.finite + let : Algebra.IsAlgebraic K L := inferInstance + change minpoly vK.Completion + (absoluteValueExtensionEmbeddingOfExtension vK w α) = + completionExtensionFactorExtensionFactor vK α w + exact completionExtensionFactor_embeddingOfExtension_minpoly vK α w + +/-- the extension-factor correspondence, correspondence part: exact extensions of `v` to the +simple extension are in canonical bijection with the distinct normalized +irreducible factors of `f` over `K_v`. Its forward map is definitionally the +factor obtained from `α` in `L_w`. -/ +noncomputable def completionExtensionFactorExtensionEquivFactors + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + {α : L} {f : K[X]} (hf : Irreducible f) + (hroot : Polynomial.aeval α f = 0) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) : + AbsoluteValueExtension vK L ≃ + CompletionExtensionFactorCompletionFactors vK f := by + let e := completionExtensionFactorExtensionsEquivCompletionFactorsAux + vK hvK hf hroot hgen + apply Equiv.ofBijective + (completionExtensionFactorExtensionToFactor vK hf hroot) + have heq : completionExtensionFactorExtensionToFactor vK hf hroot = e := by + funext w + apply Subtype.ext + exact (completionExtensionFactor_extensionsEquivCompletionFactorsAux_apply + vK hvK hf hroot hgen w).symm + rw [heq] + exact e.bijective + +/-- A factor in the correspondence is monic and irreducible and divides the +mapped minimal polynomial of the primitive generator. -/ +theorem completionExtensionFactor_factor_irreducible_monic_dvd_minpoly + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) {α : L} {f : K[X]} + (hf : Irreducible f) (hroot : Polynomial.aeval α f = 0) + (g : CompletionExtensionFactorCompletionFactors vK f) : + Irreducible g.1 ∧ g.1.Monic ∧ + g.1 ∣ (minpoly K α).map (algebraMap K vK.Completion) := by + classical + let p := (minpoly K α).map (algebraMap K vK.Completion) + have hp0 : p ≠ 0 := + (Polynomial.map_ne_zero_iff + (algebraMap K vK.Completion).injective).2 + (minpoly.ne_zero (completionExtensionFactor_root_isIntegral hf hroot)) + have hg : g.1 ∈ polynomialDistinctNormalizedFactors p := by + rw [← completionExtensionFactor_completionFactors_eq_minpolyFactors + vK hf hroot] + exact g.2 + dsimp [polynomialDistinctNormalizedFactors, + polynomialNormalizedFactors] at hg + rw [Multiset.mem_toFinset, + Polynomial.mem_normalizedFactors_iff hp0] at hg + exact hg + +/-- A chosen root of a factor is also a root of the mapped minimal +polynomial and hence determines a `K`-embedding of `L`. -/ +theorem completionExtensionFactor_factorRoot_mem_mappedMinpoly + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) {α : L} {f : K[X]} + (hf : Irreducible f) (hroot : Polynomial.aeval α f = 0) + (g : CompletionExtensionFactorCompletionFactors vK f) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtensionAlgebraicCompletionClosure vK)) : + β ∈ ((minpoly K α).map (algebraMap K vK.Completion)).rootSet + (absoluteValueExtensionAlgebraicCompletionClosure vK) := by + rcases completionExtensionFactor_factor_irreducible_monic_dvd_minpoly + vK hf hroot g with ⟨_, _, hgdvd⟩ + have hp0 : (minpoly K α).map (algebraMap K vK.Completion) ≠ 0 := + (Polynomial.map_ne_zero_iff + (algebraMap K vK.Completion).injective).2 + (minpoly.ne_zero (completionExtensionFactor_root_isIntegral hf hroot)) + rw [Polynomial.mem_rootSet] at hβ ⊢ + exact ⟨hp0, aeval_eq_zero_of_dvd_aeval_eq_zero hgdvd hβ.2⟩ + +/-- The embedding associated with a factor and a specifically chosen root +of that factor. -/ +noncomputable def completionExtensionFactorEmbeddingOfFactorRoot + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) {α : L} {f : K[X]} + (hf : Irreducible f) (hroot : Polynomial.aeval α f = 0) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) + (g : CompletionExtensionFactorCompletionFactors vK f) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtensionAlgebraicCompletionClosure vK)) : + L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK := + let hα := completionExtensionFactor_root_isIntegral hf hroot + (simpleEmbeddingsEquivMappedMinpolyRoots + (K' := vK.Completion) + (E := absoluteValueExtensionAlgebraicCompletionClosure vK) + α hα hgen).symm + ⟨β, completionExtensionFactor_factorRoot_mem_mappedMinpoly + vK hf hroot g β hβ⟩ + +/-- The embedding chosen from the root `β` sends `α` to exactly `β`. -/ +theorem completionExtensionFactor_embeddingOfFactorRoot_apply + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) {α : L} {f : K[X]} + (hf : Irreducible f) (hroot : Polynomial.aeval α f = 0) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) + (g : CompletionExtensionFactorCompletionFactors vK f) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtensionAlgebraicCompletionClosure vK)) : + completionExtensionFactorEmbeddingOfFactorRoot + vK hf hroot hgen g β hβ α = β := by + let hα := completionExtensionFactor_root_isIntegral hf hroot + let e := simpleEmbeddingsEquivMappedMinpolyRoots + (K' := vK.Completion) + (E := absoluteValueExtensionAlgebraicCompletionClosure vK) + α hα hgen + let z : PolynomialRootsIn + (absoluteValueExtensionAlgebraicCompletionClosure vK) + ((minpoly K α).map (algebraMap K vK.Completion)) := + ⟨β, completionExtensionFactor_factorRoot_mem_mappedMinpoly + vK hf hroot g β hβ⟩ + change (e.symm z) α = β + exact congrArg Subtype.val (e.apply_symm_apply z) + +/-- The valuation extension attached to the chosen root is the explicit +pullback `bar v ∘ τ`. -/ +noncomputable def completionExtensionFactorExtensionOfFactorRoot + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + {α : L} {f : K[X]} (hf : Irreducible f) + (hroot : Polynomial.aeval α f = 0) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) + (g : CompletionExtensionFactorCompletionFactors vK f) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtensionAlgebraicCompletionClosure vK)) : + AbsoluteValueExtension vK L := + pullbackAbsoluteValueExtension vK hvK + (completionExtensionFactorEmbeddingOfFactorRoot + vK hf hroot hgen g β hβ) + +theorem completionExtensionFactor_extensionOfFactorRoot_eq_pullback + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + {α : L} {f : K[X]} (hf : Irreducible f) + (hroot : Polynomial.aeval α f = 0) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) + (g : CompletionExtensionFactorCompletionFactors vK f) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtensionAlgebraicCompletionClosure vK)) : + (completionExtensionFactorExtensionOfFactorRoot + vK hvK hf hroot hgen g β hβ).1 = + absoluteValueExtensionPullback vK hvK + (completionExtensionFactorEmbeddingOfFactorRoot + vK hf hroot hgen g β hβ) := + rfl + +/-- The extension built from a root of `g` is sent back to exactly `g` by +the factor correspondence. -/ +theorem completionExtensionFactor_extensionOfFactorRoot_factor + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + {α : L} {f : K[X]} (hf : Irreducible f) + (hroot : Polynomial.aeval α f = 0) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) + (g : CompletionExtensionFactorCompletionFactors vK f) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtensionAlgebraicCompletionClosure vK)) : + completionExtensionFactorExtensionFactor vK α + (completionExtensionFactorExtensionOfFactorRoot + vK hvK hf hroot hgen g β hβ) = g.1 := by + let hα := completionExtensionFactor_root_isIntegral hf hroot + let τ := completionExtensionFactorEmbeddingOfFactorRoot + vK hf hroot hgen g β hβ + let w := completionExtensionFactorExtensionOfFactorRoot + vK hvK hf hroot hgen g β hβ + rcases completionExtensionFactor_factor_irreducible_monic_dvd_minpoly + vK hf hroot g with ⟨hgirr, hgmonic, _⟩ + have hβeval : Polynomial.aeval β g.1 = 0 := + (Polynomial.mem_rootSet.mp hβ).2 + have hmp : g.1 = minpoly vK.Completion β := + minpoly.eq_of_irreducible_of_monic hgirr hβeval hgmonic + calc + completionExtensionFactorExtensionFactor vK α w = + minpoly vK.Completion (τ α) := + completionExtensionFactor_extensionFactor_eq_minpoly_of_pullback + vK hvK α hα hgen w τ rfl + _ = minpoly vK.Completion β := by + rw [completionExtensionFactor_embeddingOfFactorRoot_apply] + _ = g.1 := hmp.symm + +/-- Thus the explicitly constructed pullback is the inverse image of `g` +under the canonical correspondence. -/ +theorem completionExtensionFactor_extensionOfFactorRoot_eq_equiv_symm + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + {α : L} {f : K[X]} (hf : Irreducible f) + (hroot : Polynomial.aeval α f = 0) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) + (g : CompletionExtensionFactorCompletionFactors vK f) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtensionAlgebraicCompletionClosure vK)) : + completionExtensionFactorExtensionOfFactorRoot + vK hvK hf hroot hgen g β hβ = + (completionExtensionFactorExtensionEquivFactors + vK hvK hf hroot hgen).symm g := by + let e := completionExtensionFactorExtensionEquivFactors + vK hvK hf hroot hgen + apply e.injective + rw [e.apply_symm_apply] + apply Subtype.ext + exact completionExtensionFactor_extensionOfFactorRoot_factor + vK hvK hf hroot hgen g β hβ + +/-- A normalized irreducible factor is the minimal polynomial of each of +its roots in the algebraic closure. -/ +theorem completionExtensionFactor_factor_eq_minpoly_root + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) {α : L} {f : K[X]} + (hf : Irreducible f) (hroot : Polynomial.aeval α f = 0) + (g : CompletionExtensionFactorCompletionFactors vK f) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtensionAlgebraicCompletionClosure vK)) : + g.1 = minpoly vK.Completion β := by + rcases completionExtensionFactor_factor_irreducible_monic_dvd_minpoly + vK hf hroot g with ⟨hgirr, hgmonic, _⟩ + exact minpoly.eq_of_irreducible_of_monic hgirr + (Polynomial.mem_rootSet.mp hβ).2 hgmonic + +/-- The completed field belonging to a factor and a chosen root `β` is +canonically `K_v(β)`. -/ +noncomputable def completionExtensionFactorFactorRootCompletionEquiv + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + {α : L} {f : K[X]} (hf : Irreducible f) + (hroot : Polynomial.aeval α f = 0) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) + (g : CompletionExtensionFactorCompletionFactors vK f) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtensionAlgebraicCompletionClosure vK)) : + let w := completionExtensionFactorExtensionOfFactorRoot + vK hvK hf hroot hgen g β hβ + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + w.1.Completion ≃ₐ[vK.Completion] + IntermediateField.adjoin vK.Completion + ({β} : Set (absoluteValueExtensionAlgebraicCompletionClosure vK)) := by + let hα := completionExtensionFactor_root_isIntegral hf hroot + let w := completionExtensionFactorExtensionOfFactorRoot + vK hvK hf hroot hgen g β hβ + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + have hfactor : completionExtensionFactorExtensionFactor vK α w = g.1 := + completionExtensionFactor_extensionOfFactorRoot_factor + vK hvK hf hroot hgen g β hβ + have hmp : g.1 = minpoly vK.Completion β := + completionExtensionFactor_factor_eq_minpoly_root vK hf hroot g β hβ + have hβint : IsIntegral vK.Completion β := + (Algebra.IsAlgebraic.isAlgebraic β).isIntegral + exact (completionExtensionFactorAdjoinRootEquivCompletion + vK hvK α hα hgen w).symm |>.trans + ((AdjoinRoot.algEquivOfEq vK.Completion _ _ (hfactor.trans hmp)).trans + (IntermediateField.adjoinRootEquivAdjoin vK.Completion hβint)) + +/-- On `α`, the chosen-root completion equivalence has value exactly `β`. -/ +@[simp] +theorem completionExtensionFactor_factorRootCompletionEquiv_gen + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + {α : L} {f : K[X]} (hf : Irreducible f) + (hroot : Polynomial.aeval α f = 0) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) + (g : CompletionExtensionFactorCompletionFactors vK f) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtensionAlgebraicCompletionClosure vK)) : + let w := completionExtensionFactorExtensionOfFactorRoot + vK hvK hf hroot hgen g β hβ + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + completionExtensionFactorFactorRootCompletionEquiv + vK hvK hf hroot hgen g β hβ + (AbsoluteValue.toCompletionAlgHom (K := K) w.1 α) = + IntermediateField.AdjoinSimple.gen vK.Completion β := by + let hα := completionExtensionFactor_root_isIntegral hf hroot + let w := completionExtensionFactorExtensionOfFactorRoot + vK hvK hf hroot hgen g β hβ + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let e0 := completionExtensionFactorAdjoinRootEquivCompletion + vK hvK α hα hgen w + let hpoly : completionExtensionFactorExtensionFactor vK α w = + minpoly vK.Completion β := + (completionExtensionFactor_extensionOfFactorRoot_factor + vK hvK hf hroot hgen g β hβ).trans + (completionExtensionFactor_factor_eq_minpoly_root vK hf hroot g β hβ) + let e1 := AdjoinRoot.algEquivOfEq vK.Completion _ _ hpoly + have hβint : IsIntegral vK.Completion β := + (Algebra.IsAlgebraic.isAlgebraic β).isIntegral + let e2 := IntermediateField.adjoinRootEquivAdjoin vK.Completion hβint + have hinv : e0.symm + (AbsoluteValue.toCompletionAlgHom (K := K) w.1 α) = + AdjoinRoot.root (completionExtensionFactorExtensionFactor vK α w) := by + apply e0.injective + rw [e0.apply_symm_apply, + completionExtensionFactor_adjoinRootEquivCompletion_root] + change (e0.symm.trans (e1.trans e2)) + (AbsoluteValue.toCompletionAlgHom (K := K) w.1 α) = _ + rw [AlgEquiv.trans_apply, hinv, AlgEquiv.trans_apply, + AdjoinRoot.algEquivOfEq_root, + IntermediateField.adjoinRootEquivAdjoin_apply_root] + +/-- The chosen-root equivalence extends the chosen embedding on every +element of `L`. -/ +theorem completionExtensionFactor_factorRootCompletionEquiv_coe + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + {α : L} {f : K[X]} (hf : Irreducible f) + (hroot : Polynomial.aeval α f = 0) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) + (g : CompletionExtensionFactorCompletionFactors vK f) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtensionAlgebraicCompletionClosure vK)) + (x : L) : + let τ := completionExtensionFactorEmbeddingOfFactorRoot + vK hf hroot hgen g β hβ + let w := completionExtensionFactorExtensionOfFactorRoot + vK hvK hf hroot hgen g β hβ + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + ((completionExtensionFactorFactorRootCompletionEquiv + vK hvK hf hroot hgen g β hβ + (AbsoluteValue.toCompletionAlgHom (K := K) w.1 x) : + IntermediateField.adjoin vK.Completion + ({β} : Set (absoluteValueExtensionAlgebraicCompletionClosure vK))) : + absoluteValueExtensionAlgebraicCompletionClosure vK) = τ x := by + let hα := completionExtensionFactor_root_isIntegral hf hroot + let pb : PowerBasis K L := PowerBasis.ofAdjoinEqTop hα hgen + let : FiniteDimensional K L := pb.finite + let : Algebra.IsAlgebraic K L := inferInstance + let τ := completionExtensionFactorEmbeddingOfFactorRoot + vK hf hroot hgen g β hβ + let w := completionExtensionFactorExtensionOfFactorRoot + vK hvK hf hroot hgen g β hβ + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let : IsScalarTower K vK.Completion w.1.Completion := + AbsoluteValue.completion_isScalarTower vK w.1 w.2 + let E := IntermediateField.adjoin vK.Completion + ({β} : Set (absoluteValueExtensionAlgebraicCompletionClosure vK)) + let e : w.1.Completion ≃ₐ[vK.Completion] E := + completionExtensionFactorFactorRootCompletionEquiv + vK hvK hf hroot hgen g β hβ + let ι : L →ₐ[K] w.1.Completion := + AbsoluteValue.toCompletionAlgHom (K := K) w.1 + let φ : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK := + ((E.val.comp e.toAlgHom).restrictScalars K).comp ι + have hpbgen : pb.gen = α := by simp [pb] + have hφ : φ = τ := by + apply pb.algHom_ext + rw [hpbgen] + change ((e (ι α) : E) : + absoluteValueExtensionAlgebraicCompletionClosure vK) = τ α + rw [completionExtensionFactor_factorRootCompletionEquiv_gen, + completionExtensionFactor_embeddingOfFactorRoot_apply] + rfl + exact DFunLike.congr_fun hφ x + +/-- **Classification of extensions of a completed absolute value.** + +For `L = K(α)` and an irreducible polynomial `f` with root `α`, exact +extensions of the nontrivial absolute value `v` are in bijection with the +distinct normalized irreducible factors of `f` over `K_v`. For every factor +and every chosen root `β` in `bar K_v`, the theorem records the embedding +`τ(α) = β`, the formula `w = bar v ∘ τ`, and an equivalence +`L_w ≃ K_v(β)` which extends `τ` on every element of `L`. -/ +theorem completionExtensionFactor_classification + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + {α : L} {f : K[X]} (hf : Irreducible f) + (hroot : Polynomial.aeval α f = 0) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) : + Function.Bijective (completionExtensionFactorExtensionToFactor vK hf hroot) ∧ + ∀ (g : CompletionExtensionFactorCompletionFactors vK f) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtensionAlgebraicCompletionClosure vK)), + let τ := completionExtensionFactorEmbeddingOfFactorRoot + vK hf hroot hgen g β hβ + let w := completionExtensionFactorExtensionOfFactorRoot + vK hvK hf hroot hgen g β hβ + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + let e := completionExtensionFactorFactorRootCompletionEquiv + vK hvK hf hroot hgen g β hβ + τ α = β ∧ + w.1 = absoluteValueExtensionPullback vK hvK τ ∧ + w = (completionExtensionFactorExtensionEquivFactors + vK hvK hf hroot hgen).symm g ∧ + completionExtensionFactorExtensionFactor vK α w = g.1 ∧ + ∀ x : L, + ((e (AbsoluteValue.toCompletionAlgHom (K := K) w.1 x) : + IntermediateField.adjoin vK.Completion + ({β} : Set + (absoluteValueExtensionAlgebraicCompletionClosure vK))) : + absoluteValueExtensionAlgebraicCompletionClosure vK) = τ x := by + constructor + · exact (completionExtensionFactorExtensionEquivFactors + vK hvK hf hroot hgen).bijective + · intro g β hβ + dsimp only + refine ⟨completionExtensionFactor_embeddingOfFactorRoot_apply + vK hf hroot hgen g β hβ, + completionExtensionFactor_extensionOfFactorRoot_eq_pullback + vK hvK hf hroot hgen g β hβ, + completionExtensionFactor_extensionOfFactorRoot_eq_equiv_symm + vK hvK hf hroot hgen g β hβ, + completionExtensionFactor_extensionOfFactorRoot_factor + vK hvK hf hroot hgen g β hβ, ?_⟩ + intro x + exact completionExtensionFactor_factorRootCompletionEquiv_coe + vK hvK hf hroot hgen g β hβ x + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean new file mode 100644 index 0000000000..fbbbe640c7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean @@ -0,0 +1,599 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ExponentialValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Ostrowski +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.PrincipalAdicCompleteness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.SpectralExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.DegreeNormTrace +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Complete +/-! +# Local degree, ramification, and residue invariants + +For a finite separable extension `L / K` and a discrete nonarchimedean +absolute value `v` on `K`, this file proves the exact degree formula +`∑_{w ∣ v} e_w f_w = [L : K]`. + +The proof makes explicit the two facts used implicitly in the construction: metric +completion preserves the value group and residue field, and every completed +local extension `L_w / K_v` is finite separable. The fundamental inequality then gives +`[L_w : K_v] = e_w f_w`; summing and applying the local degree, norm, and trace formulas gives + the result. +-/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.ResidueField renaming + residue_eq_residue_iff_sub_mem_maximalIdeal → + residue_eq_residue_iff_sub_mem_maximalIdeal + + +noncomputable +section + +open scoped BigOperators + +namespace AlgebraicNumberTheory.Valuations + +universe u v + +private theorem completionNonarchimedean + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) + (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : + LubinTate.Valuations.NonarchimedeanAbsoluteValue + (AbsoluteValue.completionAbsoluteValue vK) := + (AbsoluteValue.isNonarchimedean_iff_bounded_nat + (AbsoluteValue.completionAbsoluteValue vK)).1 + (AbsoluteValue.completionAbsoluteValue_isNonarchimedean vK + ((AbsoluteValue.isNonarchimedean_iff_bounded_nat vK).2 hv)) + +theorem mem_absoluteValueExponentialSubring_iff + {K : Type u} [Field K] (a : AbsoluteValue K ℝ) + (ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a) (x : K) : + x ∈ LubinTate.Valuations.exponentialValuationSubring + (absoluteValueExponentialValuation a ha) ↔ a x ≤ 1 := by + rw [LubinTate.Valuations.mem_exponentialValuationSubring_iff] + by_cases hx : x = 0 + · subst x + simp [absoluteValueExponentialValuation] + · rw [absoluteValueExponentialValuation_apply_ne_zero a ha hx] + rw [WithTop.coe_nonneg] + constructor + · intro h + by_contra hnot + have hone : 1 < a x := lt_of_not_ge hnot + linarith [Real.log_pos hone] + · intro h + exact neg_nonneg.mpr (Real.log_nonpos (a.nonneg x) h) + +theorem completionExponentialValueSubgroup_eq + {K : Type u} [Field K] (a : AbsoluteValue K ℝ) + (ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a) : + exponentialValueSubgroup + (absoluteValueExponentialValuation + (AbsoluteValue.completionAbsoluteValue a) + (by exact completionNonarchimedean a ha)) = + exponentialValueSubgroup + (absoluteValueExponentialValuation a ha) := by + let aC := AbsoluteValue.completionAbsoluteValue a + let haC : LubinTate.Valuations.NonarchimedeanAbsoluteValue aC := by + exact completionNonarchimedean a ha + let v := absoluteValueExponentialValuation a ha + let vC := absoluteValueExponentialValuation aC haC + ext r + constructor + · rintro ⟨x, hx, hxr⟩ + have hrange : aC x ∈ Set.range aC := ⟨x, rfl⟩ + have hrange' : aC x ∈ Set.range a := by + rw [← AbsoluteValue.completionAbsoluteValue_range_eq a + ((AbsoluteValue.isNonarchimedean_iff_bounded_nat a).2 ha)] + exact hrange + obtain ⟨y, hy⟩ := hrange' + have hy0 : y ≠ 0 := by + intro hyzero + subst y + have : aC x = 0 := by simpa using hy.symm + exact hx (aC.eq_zero.mp this) + refine ⟨y, hy0, ?_⟩ + rw [absoluteValueExponentialValuation_apply_ne_zero a ha hy0] + rw [absoluteValueExponentialValuation_apply_ne_zero aC haC hx] at hxr + simpa [hy] using hxr + · rintro ⟨x, hx, hxr⟩ + let xC : a.Completion := algebraMap K a.Completion x + have hxC : xC ≠ 0 := (algebraMap K a.Completion).injective.ne hx + refine ⟨xC, hxC, ?_⟩ + rw [absoluteValueExponentialValuation_apply_ne_zero aC haC hxC] + rw [absoluteValueExponentialValuation_apply_ne_zero a ha hx] at hxr + rw [show aC xC = a x by + exact AbsoluteValue.completionAbsoluteValue_coe a x] + exact hxr + +theorem completionRamificationIndex_eq + {K : Type u} {L : Type v} [Field K] [Field L] + (a : AbsoluteValue K ℝ) (b : AbsoluteValue L ℝ) + (ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a) + (hb : LubinTate.Valuations.NonarchimedeanAbsoluteValue b) : + exponentialRamificationIndex + (absoluteValueExponentialValuation + (AbsoluteValue.completionAbsoluteValue a) + (by exact completionNonarchimedean a ha)) + (absoluteValueExponentialValuation + (AbsoluteValue.completionAbsoluteValue b) + (by exact completionNonarchimedean b hb)) = + exponentialRamificationIndex + (absoluteValueExponentialValuation a ha) + (absoluteValueExponentialValuation b hb) := by + unfold exponentialRamificationIndex ExponentialValueGroupQuotient + rw [completionExponentialValueSubgroup_eq a ha, + completionExponentialValueSubgroup_eq b hb] + +theorem mem_absoluteValueExponentialSubring_maximalIdeal_iff + {K : Type u} [Field K] (a : AbsoluteValue K ℝ) + (ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a) + (x : LubinTate.Valuations.exponentialValuationSubring + (absoluteValueExponentialValuation a ha)) : + x ∈ IsLocalRing.maximalIdeal + (LubinTate.Valuations.exponentialValuationSubring + (absoluteValueExponentialValuation a ha)) ↔ + a (x : K) < 1 := by + rw [← LubinTate.Valuations.exponentialMaxIdeal_eq_maximalIdeal] + change (0 : WithTop ℝ) < + absoluteValueExponentialValuation a ha (x : K) ↔ _ + by_cases hx : (x : K) = 0 + · simp [hx, absoluteValueExponentialValuation] + · exact (LubinTate.Valuations.associatedAbsoluteValue_lt_one_iff + (absoluteValueExponentialValuation_associated a ha) hx).symm + +/-- The homomorphism from the exponential valuation subring of a field to that +of its completion, induced by the canonical map into the completion. -/ +def completionExponentialSubringMap + {K : Type u} [Field K] (a : AbsoluteValue K ℝ) + (ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a) : + LubinTate.Valuations.exponentialValuationSubring + (absoluteValueExponentialValuation a ha) →+* + LubinTate.Valuations.exponentialValuationSubring + (absoluteValueExponentialValuation + (AbsoluteValue.completionAbsoluteValue a) + (by exact completionNonarchimedean a ha)) := + (algebraMap K a.Completion).restrict _ _ fun x hx => by + rw [mem_absoluteValueExponentialSubring_iff] at hx ⊢ + change AbsoluteValue.completionAbsoluteValue a (x : a.Completion) ≤ 1 + rw [AbsoluteValue.completionAbsoluteValue_coe] + exact hx + +@[simp] theorem completionExponentialSubringMap_apply + {K : Type u} [Field K] (a : AbsoluteValue K ℝ) + (ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a) + (x : LubinTate.Valuations.exponentialValuationSubring + (absoluteValueExponentialValuation a ha)) : + ((completionExponentialSubringMap a ha x : + LubinTate.Valuations.exponentialValuationSubring + (absoluteValueExponentialValuation + (AbsoluteValue.completionAbsoluteValue a) + (by exact completionNonarchimedean a ha))) : a.Completion) = + algebraMap K a.Completion (x : K) := rfl + +theorem completionExponentialSubringMap_isLocalHom + {K : Type u} [Field K] (a : AbsoluteValue K ℝ) + (ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a) : + IsLocalHom (completionExponentialSubringMap a ha) := by + constructor + intro x hx + rw [LubinTate.Valuations.associatedAbsoluteValue_isUnit_iff_eq_one + (absoluteValueExponentialValuation_associated a ha)] + rw [LubinTate.Valuations.associatedAbsoluteValue_isUnit_iff_eq_one + (absoluteValueExponentialValuation_associated + (AbsoluteValue.completionAbsoluteValue a) + (by exact completionNonarchimedean a ha))] at hx + change AbsoluteValue.completionAbsoluteValue a + ((x : K) : a.Completion) = 1 at hx + rw [AbsoluteValue.completionAbsoluteValue_coe] at hx + exact hx + +theorem completionResidueMap_surjective + {K : Type u} [Field K] (a : AbsoluteValue K ℝ) + (ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a) : + letI : IsLocalHom (completionExponentialSubringMap a ha) := + completionExponentialSubringMap_isLocalHom a ha + Function.Surjective + (IsLocalRing.ResidueField.map (completionExponentialSubringMap a ha)) := by + let v := absoluteValueExponentialValuation a ha + let aC := AbsoluteValue.completionAbsoluteValue a + let haC : LubinTate.Valuations.NonarchimedeanAbsoluteValue aC := by + exact completionNonarchimedean a ha + let vC := absoluteValueExponentialValuation aC haC + let V := LubinTate.Valuations.exponentialValuationSubring v + let VC := LubinTate.Valuations.exponentialValuationSubring vC + let f : V →+* VC := completionExponentialSubringMap a ha + let : IsLocalHom f := completionExponentialSubringMap_isLocalHom a ha + intro z + obtain ⟨y, rfl⟩ := IsLocalRing.residue_surjective z + let vId : AbsoluteValueExtension a K := ⟨a, fun _ => rfl⟩ + obtain ⟨x, hx⟩ := + (AbsoluteValue.denseRange_toCompletion vId.1).exists_dist_lt + (y : a.Completion) zero_lt_one + have hclose : aC (algebraMap K a.Completion x - (y : a.Completion)) < 1 := by + change ‖algebraMap K a.Completion x - (y : a.Completion)‖ < 1 + rw [dist_eq_norm] at hx + change ‖(y : a.Completion) - algebraMap K a.Completion x‖ < 1 at hx + simpa only [norm_sub_rev] using hx + have hy_le : aC (y : a.Completion) ≤ 1 := by + exact (mem_absoluteValueExponentialSubring_iff aC haC (y : a.Completion)).1 y.property + have hx_leC : aC (algebraMap K a.Completion x) ≤ 1 := by + calc + aC (algebraMap K a.Completion x) = + aC ((algebraMap K a.Completion x - (y : a.Completion)) + y) := by + congr 1 + ring + _ ≤ max (aC (algebraMap K a.Completion x - (y : a.Completion))) + (aC (y : a.Completion)) := + LubinTate.Valuations.strong_triangle_of_nonarchimedean aC haC _ _ + _ ≤ 1 := max_le hclose.le hy_le + have hx_le : a x ≤ 1 := by + change aC (x : a.Completion) ≤ 1 at hx_leC + rwa [AbsoluteValue.completionAbsoluteValue_coe] at hx_leC + let xV : V := ⟨x, (mem_absoluteValueExponentialSubring_iff a ha x).2 hx_le⟩ + refine ⟨IsLocalRing.residue V xV, ?_⟩ + rw [IsLocalRing.ResidueField.map_residue] + rw [residue_eq_residue_iff_sub_mem_maximalIdeal] + rw [mem_absoluteValueExponentialSubring_maximalIdeal_iff aC haC] + exact hclose + +/-- The residue-field equivalence induced by the canonical map from a +nonarchimedean valued field to its completion. -/ +noncomputable def completionResidueEquiv + {K : Type u} [Field K] (a : AbsoluteValue K ℝ) + (ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a) : + IsLocalRing.ResidueField + (LubinTate.Valuations.exponentialValuationSubring + (absoluteValueExponentialValuation a ha)) ≃+* + IsLocalRing.ResidueField + (LubinTate.Valuations.exponentialValuationSubring + (absoluteValueExponentialValuation + (AbsoluteValue.completionAbsoluteValue a) + (by exact completionNonarchimedean a ha))) := by + letI : IsLocalHom (completionExponentialSubringMap a ha) := + completionExponentialSubringMap_isLocalHom a ha + exact ValuationTheory.DiscreteValuationField.ResidueField.ringEquivOfSurjective + (completionExponentialSubringMap a ha) + (completionResidueMap_surjective a ha) + +@[simp] theorem completionResidueEquiv_residue + {K : Type u} [Field K] (a : AbsoluteValue K ℝ) + (ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a) + (x : LubinTate.Valuations.exponentialValuationSubring + (absoluteValueExponentialValuation a ha)) : + completionResidueEquiv a ha + (IsLocalRing.residue _ x) = + IsLocalRing.residue _ (completionExponentialSubringMap a ha x) := by + let : IsLocalHom (completionExponentialSubringMap a ha) := + completionExponentialSubringMap_isLocalHom a ha + exact IsLocalRing.ResidueField.map_residue _ _ + +theorem absoluteValueExtension_nonarchimedean + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (a : AbsoluteValue K ℝ) (b : AbsoluteValue L ℝ) + (ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a) + (hExt : AbsoluteValue.Extends a b) : + LubinTate.Valuations.NonarchimedeanAbsoluteValue b := by + rcases ha with ⟨C, hC⟩ + refine ⟨C, fun n => ?_⟩ + simpa only [map_natCast] using (hExt (n : K)).trans_le (hC n) + +theorem completionAbsoluteValue_extends_base + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (a : AbsoluteValue K ℝ) (w : AbsoluteValueExtension a L) : + letI := AbsoluteValue.completionAlgebra a w.1 w.2 + AbsoluteValue.Extends + (AbsoluteValue.completionAbsoluteValue a) + (AbsoluteValue.completionAbsoluteValue w.1) := by + let := AbsoluteValue.completionAlgebra a w.1 w.2 + intro x + change ‖algebraMap a.Completion w.1.Completion x‖ = ‖x‖ + exact (AbsoluteValue.completionMap_isometry a w.1 w.2).norm_map_of_map_zero + (map_zero _) x + +theorem completionExponentialValuation_discrete + {K : Type u} [Field K] (a : AbsoluteValue K ℝ) + (ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a) + (hdisc : LubinTate.Valuations.DiscreteExponentialValuation + (absoluteValueExponentialValuation a ha)) : + LubinTate.Valuations.DiscreteExponentialValuation + (absoluteValueExponentialValuation + (AbsoluteValue.completionAbsoluteValue a) + (by exact completionNonarchimedean a ha)) := by + let aC := AbsoluteValue.completionAbsoluteValue a + let haC : LubinTate.Valuations.NonarchimedeanAbsoluteValue aC := by + exact completionNonarchimedean a ha + let v := absoluteValueExponentialValuation a ha + let vC := absoluteValueExponentialValuation aC haC + rcases hdisc with ⟨s, hs, hvalues, pi, hpival⟩ + have hpi0 : pi ≠ 0 := LubinTate.Valuations.discretePrimeElement_ne_zero_of_value v hpival + refine ⟨s, hs, ?_, algebraMap K a.Completion pi, ?_⟩ + · intro x hx + obtain ⟨r, hxr⟩ := LubinTate.Valuations.exponentialValuation_exists_real_of_ne_zero vC hx + have hrC : r ∈ exponentialValueSubgroup vC := ⟨x, hx, hxr⟩ + have hr : r ∈ exponentialValueSubgroup v := by + rw [← completionExponentialValueSubgroup_eq a ha] + exact hrC + obtain ⟨y, hy, hyr⟩ := hr + obtain ⟨m, hym⟩ := hvalues y hy + refine ⟨m, ?_⟩ + exact hxr.trans (hyr.symm.trans hym) + · have hpiC : (algebraMap K a.Completion pi) ≠ 0 := + (algebraMap K a.Completion).injective.ne hpi0 + rw [absoluteValueExponentialValuation_apply_ne_zero aC haC hpiC] + rw [absoluteValueExponentialValuation_apply_ne_zero a ha hpi0] at hpival + rw [show aC (algebraMap K a.Completion pi) = a pi by + change aC (pi : a.Completion) = a pi + exact AbsoluteValue.completionAbsoluteValue_coe a pi] + exact hpival + +theorem completionExponentialSubringMap_square + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (a : AbsoluteValue K ℝ) (b : AbsoluteValue L ℝ) + (ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a) + (hb : LubinTate.Valuations.NonarchimedeanAbsoluteValue b) + (hExt : AbsoluteValue.Extends a b) : + letI := AbsoluteValue.completionAlgebra a b hExt + let v := absoluteValueExponentialValuation a ha + let w := absoluteValueExponentialValuation b hb + let aC := AbsoluteValue.completionAbsoluteValue a + let bC := AbsoluteValue.completionAbsoluteValue b + let haC : LubinTate.Valuations.NonarchimedeanAbsoluteValue aC := by + exact completionNonarchimedean a ha + let hbC : LubinTate.Valuations.NonarchimedeanAbsoluteValue bC := by + exact completionNonarchimedean b hb + let vC := absoluteValueExponentialValuation aC haC + let wC := absoluteValueExponentialValuation bC hbC + let hvw := absoluteValueExponentialValuation_extends a b ha hb hExt + let hvwC := absoluteValueExponentialValuation_extends aC bC haC hbC + (completionAbsoluteValue_extends_base a ⟨b, hExt⟩) + (completionExponentialSubringMap b hb).comp (exponentialValuationRingMap v w hvw) = + (exponentialValuationRingMap vC wC hvwC).comp + (completionExponentialSubringMap a ha) := by + let := AbsoluteValue.completionAlgebra a b hExt + apply RingHom.ext + intro x + apply Subtype.ext + change (algebraMap L b.Completion) (algebraMap K L (x : K)) = + algebraMap a.Completion b.Completion (algebraMap K a.Completion (x : K)) + exact (AbsoluteValue.completionMap_coe a b hExt (x : K)).symm + +theorem completionResidueDegree_eq + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (a : AbsoluteValue K ℝ) (b : AbsoluteValue L ℝ) + (ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a) + (hb : LubinTate.Valuations.NonarchimedeanAbsoluteValue b) + (hExt : AbsoluteValue.Extends a b) : + letI := AbsoluteValue.completionAlgebra a b hExt + let v := absoluteValueExponentialValuation a ha + let w := absoluteValueExponentialValuation b hb + let aC := AbsoluteValue.completionAbsoluteValue a + let bC := AbsoluteValue.completionAbsoluteValue b + let haC : LubinTate.Valuations.NonarchimedeanAbsoluteValue aC := by + exact completionNonarchimedean a ha + let hbC : LubinTate.Valuations.NonarchimedeanAbsoluteValue bC := by + exact completionNonarchimedean b hb + let vC := absoluteValueExponentialValuation aC haC + let wC := absoluteValueExponentialValuation bC hbC + let hvw := absoluteValueExponentialValuation_extends a b ha hb hExt + let hvwC := absoluteValueExponentialValuation_extends aC bC haC hbC + (completionAbsoluteValue_extends_base a ⟨b, hExt⟩) + exponentialResidueDegree v w hvw = exponentialResidueDegree vC wC hvwC := by + let := AbsoluteValue.completionAlgebra a b hExt + let v := absoluteValueExponentialValuation a ha + let w := absoluteValueExponentialValuation b hb + let aC := AbsoluteValue.completionAbsoluteValue a + let bC := AbsoluteValue.completionAbsoluteValue b + let haC : LubinTate.Valuations.NonarchimedeanAbsoluteValue aC := by + exact completionNonarchimedean a ha + let hbC : LubinTate.Valuations.NonarchimedeanAbsoluteValue bC := by + exact completionNonarchimedean b hb + let vC := absoluteValueExponentialValuation aC haC + let wC := absoluteValueExponentialValuation bC hbC + let hvw := absoluteValueExponentialValuation_extends a b ha hb hExt + let hvwC := absoluteValueExponentialValuation_extends aC bC haC hbC + (completionAbsoluteValue_extends_base a ⟨b, hExt⟩) + let V := LubinTate.Valuations.exponentialValuationSubring v + let W := LubinTate.Valuations.exponentialValuationSubring w + let VC := LubinTate.Valuations.exponentialValuationSubring vC + let WC := LubinTate.Valuations.exponentialValuationSubring wC + let i := exponentialValuationRingMap v w hvw + let iC := exponentialValuationRingMap vC wC hvwC + let cv := completionExponentialSubringMap a ha + let cw := completionExponentialSubringMap b hb + let : IsLocalHom i := exponentialValuationRingMap_isLocalHom v w hvw + let : IsLocalHom iC := exponentialValuationRingMap_isLocalHom vC wC hvwC + let : IsLocalHom cv := completionExponentialSubringMap_isLocalHom a ha + let : IsLocalHom cw := completionExponentialSubringMap_isLocalHom b hb + let : Algebra V W := i.toAlgebra + let : Algebra VC WC := iC.toAlgebra + let ev := completionResidueEquiv a ha + let ew := completionResidueEquiv b hb + change Module.finrank (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) = + Module.finrank (IsLocalRing.ResidueField VC) + (IsLocalRing.ResidueField WC) + apply Algebra.finrank_eq_of_equiv_equiv ev ew + apply RingHom.ext + intro x + obtain ⟨x, rfl⟩ := IsLocalRing.residue_surjective x + change IsLocalRing.residue WC (iC (cv x)) = + IsLocalRing.residue WC (cw (i x)) + have hsquare := DFunLike.congr_fun + (completionExponentialSubringMap_square a b ha hb hExt) x + exact congrArg (IsLocalRing.residue WC) hsquare.symm + +theorem completionExtension_isSeparable + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (a : AbsoluteValue K ℝ) (ha : a.IsNontrivial) + (w : AbsoluteValueExtension a L) : + letI := AbsoluteValue.completionAlgebra a w.1 w.2 + Algebra.IsSeparable a.Completion w.1.Completion := by + let pb := completionTensorDecompositionPowerBasis K L + let α : L := pb.gen + let hα : IsIntegral K α := pb.isIntegral_gen + let hgen : Algebra.adjoin K ({α} : Set L) = ⊤ := pb.adjoin_gen_eq_top + let τ := absoluteValueExtensionEmbeddingOfExtension a w + let hτ := absoluteValueExtension_extension_eq_pullback_embeddingOfExtension a ha w + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra a w.1 w.2 + let : IsScalarTower K a.Completion w.1.Completion := + AbsoluteValue.completion_isScalarTower a w.1 w.2 + have hsepMapped : + ((minpoly K α).map (algebraMap K a.Completion)).Separable := + Polynomial.Separable.map + (Algebra.IsSeparable.isSeparable K α) + have hdvd : minpoly a.Completion (τ α) ∣ + (minpoly K α).map (algebraMap K a.Completion) := by + let g := completionExtensionFactorExtensionToFactor a + (minpoly.irreducible hα) (minpoly.aeval K α) w + have hgdvd := (completionExtensionFactor_factor_irreducible_monic_dvd_minpoly a + (minpoly.irreducible hα) (minpoly.aeval K α) g).2.2 + rw [completionExtensionFactor_embeddingOfExtension_minpoly a α w] + simpa [g, completionExtensionFactorExtensionToFactor] using hgdvd + have hτα : IsSeparable a.Completion (τ α) := + hsepMapped.of_dvd hdvd + let E := IntermediateField.adjoin a.Completion + ({τ α} : Set (absoluteValueExtensionAlgebraicCompletionClosure a)) + have hEsep : Algebra.IsSeparable a.Completion E := + Iff.mpr (IntermediateField.isSeparable_adjoin_iff_isSeparable + a.Completion (absoluteValueExtensionAlgebraicCompletionClosure a)) (by + intro x hx + simp only [Set.mem_singleton_iff] at hx + subst x + exact hτα) + let : Algebra.IsSeparable a.Completion E := hEsep + exact AlgEquiv.Algebra.isSeparable + (completionExtensionFactorCompletionEquivSimpleRoot + a ha α hα hgen w τ hτ).symm + +theorem completionExtensionInvariants_local_identity + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (a : AbsoluteValue K ℝ) (ha0 : a.IsNontrivial) + (ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a) + (hdisc : LubinTate.Valuations.DiscreteExponentialValuation + (absoluteValueExponentialValuation a ha)) + (w : AbsoluteValueExtension a L) : + let hb := absoluteValueExtension_nonarchimedean a w.1 ha w.2 + let v := absoluteValueExponentialValuation a ha + let wv := absoluteValueExponentialValuation w.1 hb + let hvw := absoluteValueExponentialValuation_extends + a w.1 ha hb w.2 + letI := AbsoluteValue.completionAlgebra a w.1 w.2 + Module.finrank a.Completion w.1.Completion = + exponentialRamificationIndex v wv * exponentialResidueDegree v wv hvw := by + let hb := absoluteValueExtension_nonarchimedean a w.1 ha w.2 + let v := absoluteValueExponentialValuation a ha + let wv := absoluteValueExponentialValuation w.1 hb + let hvw := absoluteValueExponentialValuation_extends + a w.1 ha hb w.2 + let aC := AbsoluteValue.completionAbsoluteValue a + let bC := AbsoluteValue.completionAbsoluteValue w.1 + let haC : LubinTate.Valuations.NonarchimedeanAbsoluteValue aC := by + exact completionNonarchimedean a ha + let hbC := completionNonarchimedean w.1 hb + let vC := absoluteValueExponentialValuation aC haC + let wC := absoluteValueExponentialValuation bC hbC + let := AbsoluteValue.completionAlgebra a w.1 w.2 + let hvwC := absoluteValueExponentialValuation_extends + aC bC haC hbC (completionAbsoluteValue_extends_base a w) + let : Module.Finite a.Completion w.1.Completion := + completionModuleFinite a ha0 w + let : Algebra.IsSeparable a.Completion w.1.Completion := + completionExtension_isSeparable a ha0 w + have hhensC : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vC).valuation := by + rw [associatedAbsoluteValue_valuationSubring_eq + vC (Real.exp 1) aC haC + (absoluteValueExponentialValuation_associated aC haC)] + exact henselianValuation_of_complete aC + ((absoluteValueCompleteness_completeSpace_withAbs_iff_complete _).1 + (AbsoluteValue.completionAbsoluteValue_complete a)) + haC + have hlocal := + ramificationInvariants_fundamental_identity_of_discrete_of_separable + vC wC hvwC (completionExponentialValuation_discrete a ha hdisc) hhensC + calc + Module.finrank a.Completion w.1.Completion = + exponentialRamificationIndex vC wC * exponentialResidueDegree vC wC hvwC := hlocal + _ = exponentialRamificationIndex v wv * exponentialResidueDegree v wv hvw := by + rw [completionRamificationIndex_eq a w.1 ha hb, + ← completionResidueDegree_eq a w.1 ha hb w.2] + +theorem absoluteValue_isNontrivial_of_discrete + {K : Type u} [Field K] (a : AbsoluteValue K ℝ) + (ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a) + (hdisc : LubinTate.Valuations.DiscreteExponentialValuation + (absoluteValueExponentialValuation a ha)) : + a.IsNontrivial := by + let v := absoluteValueExponentialValuation a ha + rcases hdisc with ⟨s, hs, _hvalues, pi, hpival⟩ + have hpi0 : pi ≠ 0 := LubinTate.Valuations.discretePrimeElement_ne_zero_of_value v hpival + refine ⟨pi, hpi0, ?_⟩ + intro hpi + have hvpi0 : v pi = 0 := by + rw [absoluteValueExponentialValuation_apply_ne_zero a ha hpi0, + hpi, Real.log_one] + norm_num + rw [hvpi0] at hpival + have hs0 : s = 0 := by + apply WithTop.coe_eq_coe.mp + simpa using hpival.symm + exact (ne_of_gt hs) hs0 + +/-- **the local ramification identity.** For a discrete valuation and a finite separable +extension, the sum of the ramification indices times residue degrees over all +extensions of the valuation is the global degree. -/ +theorem completionExtensionInvariants + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (a : AbsoluteValue K ℝ) + (ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a) + (hdisc : LubinTate.Valuations.DiscreteExponentialValuation + (absoluteValueExponentialValuation a ha)) : + let ha0 := absoluteValue_isNontrivial_of_discrete a ha hdisc + letI := completionTensorDecompositionExtensionFintype (K := K) (L := L) a ha0 + (∑ w : AbsoluteValueExtension a L, + let hw := absoluteValueExtension_nonarchimedean a w.1 ha w.2 + let va := absoluteValueExponentialValuation a ha + let vw := absoluteValueExponentialValuation w.1 hw + let hvw := absoluteValueExponentialValuation_extends + a w.1 ha hw w.2 + exponentialRamificationIndex va vw * exponentialResidueDegree va vw hvw) = + Module.finrank K L := by + let ha0 := absoluteValue_isNontrivial_of_discrete a ha hdisc + let := completionTensorDecompositionExtensionFintype (K := K) (L := L) a ha0 + rw [completionDegreeNormTrace_degree (K := K) (L := L) a ha0] + apply Finset.sum_congr rfl + intro w _hw + exact (completionExtensionInvariants_local_identity a ha0 ha hdisc w).symm + + +end AlgebraicNumberTheory.Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteLocalization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteLocalization.lean new file mode 100644 index 0000000000..28a076ff46 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteLocalization.lean @@ -0,0 +1,248 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.AbsoluteValueExtensions +public import Mathlib.Analysis.Normed.Module.FiniteDimension +public import Mathlib.RingTheory.TensorProduct.Finite +public import Mathlib.RingTheory.TensorProduct.Maps +/-! +# Finite localizations inside metric completions + +For a finite extension `L / K`, the localization `L K_v` inside +the metric completion `L_w` is already all of `L_w`. The proof uses no +separability: the image of `K_v ⊗_K L` is finite-dimensional and closed, +but contains the dense copy of `L`. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +universe u v + +open scoped TensorProduct + +/-- The nontriviality convention supplies the corresponding +nontrivially normed field structure on `K_v`. -/ +@[reducible] noncomputable def absoluteValueExtensionCompletionNontriviallyNormedField + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) : + NontriviallyNormedField vK.Completion := + NontriviallyNormedField.ofNormNeOne (by + rcases AbsoluteValue.completionAbsoluteValue_isNontrivial vK hvK with + ⟨x, hx0, hx1⟩ + exact ⟨x, hx0, hx1⟩) + +/-- The completion `L_w` is a normed algebra over `K_v`: its scalar map is +the isometric completion map supplied by the valuation-extension theorem. -/ +@[reducible] noncomputable def absoluteValueExtensionCompletionNormedAlgebra + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (w : AbsoluteValueExtension vK L) : + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + NormedAlgebra vK.Completion w.1.Completion := by + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + refine + { __ := AbsoluteValue.completionAlgebra vK w.1 w.2 + norm_smul_le := fun r x ↦ ?_ } + rw [Algebra.smul_def, norm_mul, + AbsoluteValue.completionAlgebra_algebraMap] + rw [(AbsoluteValue.completionMap_isometry vK w.1 w.2).norm_map_of_map_zero + (map_zero (AbsoluteValue.completionMap vK w.1 w.2))] + +/-- Multiplication gives the canonical map `K_v ⊗_K L → L_w`. -/ +noncomputable def absoluteValueExtensionLocalizationTensorHom + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (w : AbsoluteValueExtension vK L) : + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + vK.Completion ⊗[K] L →ₐ[vK.Completion] w.1.Completion := by + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI : IsScalarTower K vK.Completion w.1.Completion := + AbsoluteValue.completion_isScalarTower vK w.1 w.2 + exact Algebra.TensorProduct.lift + (Algebra.ofId vK.Completion w.1.Completion) + (AbsoluteValue.toCompletionAlgHom (K := K) w.1) + (fun _ _ ↦ Commute.all _ _) + +@[simp] +theorem absoluteValueExtension_localizationTensorHom_tmul + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (w : AbsoluteValueExtension vK L) + (b : vK.Completion) (a : L) : + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + absoluteValueExtensionLocalizationTensorHom vK w (b ⊗ₜ[K] a) = + algebraMap vK.Completion w.1.Completion b * + AbsoluteValue.toCompletionAlgHom (K := K) w.1 a := by + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + rfl + +/-- For a finite extension, the canonical map `K_v ⊗_K L → L_w` is +surjective. -/ +theorem absoluteValueExtension_localizationTensorHom_surjective + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) : + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + Function.Surjective (absoluteValueExtensionLocalizationTensorHom vK w) := by + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let : NontriviallyNormedField vK.Completion := + absoluteValueExtensionCompletionNontriviallyNormedField vK hvK + let : NormedAlgebra vK.Completion w.1.Completion := + absoluteValueExtensionCompletionNormedAlgebra vK w + let : Module.Finite vK.Completion (vK.Completion ⊗[K] L) := + inferInstance + let f := absoluteValueExtensionLocalizationTensorHom vK w + let : Module.Finite vK.Completion f.toLinearMap.range := + Module.Finite.range f.toLinearMap + have hrangeClosed : IsClosed (f.toLinearMap.range : Set w.1.Completion) := + Submodule.closed_of_finiteDimensional + (𝕜 := vK.Completion) f.toLinearMap.range + have hdense : DenseRange + (AbsoluteValue.toCompletion w.1) := + AbsoluteValue.denseRange_toCompletion w.1 + have hrange : Set.range + (AbsoluteValue.toCompletion w.1) ⊆ + (f.toLinearMap.range : Set w.1.Completion) := by + rintro _ ⟨x, rfl⟩ + refine ⟨1 ⊗ₜ[K] x, ?_⟩ + change f (1 ⊗ₜ[K] x) = _ + rw [absoluteValueExtension_localizationTensorHom_tmul] + simp [AbsoluteValue.toCompletionAlgHom] + change Function.Surjective f.toLinearMap + rw [← f.toLinearMap.range_eq_top] + apply top_unique + intro x _ + have hx : x ∈ closure + (Set.range (AbsoluteValue.toCompletion w.1)) := by + rw [hdense.closure_range] + trivial + exact closure_minimal hrange hrangeClosed hx + +/-- For a finite extension, the localization `L K_v` inside the +metric completion is the whole completion `L_w`. -/ +theorem absoluteValueExtension_finiteLocalization_eq_top + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + AbsoluteValue.algebraicLocalization vK w.1 w.2 = ⊤ := by + let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let := AbsoluteValue.completionAlgebra vK w.1 w.2 + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + apply top_unique + intro y _ + obtain ⟨z, rfl⟩ := + absoluteValueExtension_localizationTensorHom_surjective vK hvK w y + induction z using TensorProduct.inductionOn with + | tmul b x => + rw [absoluteValueExtension_localizationTensorHom_tmul] + exact E.mul_mem (E.algebraMap_mem b) + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x).property + | add x y hx hy => + simpa only [map_add] using E.add_mem (hx trivial) (hy trivial) + +end Valuations +end AlgebraicNumberTheory + +namespace AlgebraicNumberTheory +namespace Valuations + +universe u v + +open scoped TensorProduct + +/-- The algebraic localization of an extension inside the completion selected +by an extended absolute value. -/ +abbrev LocalizedCompletion + {K : Type u} {L : Type v} + [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) + (w : AbsoluteValueExtension vK L) := + AbsoluteValue.algebraicLocalization vK w.1 w.2 + +variable {K : Type u} {L : Type v} + [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] + +/-- The algebraic localization of a finite extension is finite-dimensional +over the completed base field. -/ +theorem localizedCompletionModuleFinite + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + Module.Finite vK.Completion + (AbsoluteValue.algebraicLocalization vK w.1 w.2) := by + let hK := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + let : SMul K w.1.Completion := hK.toSMul + let : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + let : Module.Finite vK.Completion + (vK.Completion ⊗[K] L) := + inferInstance + let f := + absoluteValueExtensionLocalizationTensorHom vK w + let : Module.Finite vK.Completion + w.1.Completion := + Module.Finite.of_surjective f.toLinearMap + (absoluteValueExtension_localizationTensorHom_surjective + vK hvK w) + exact FiniteDimensional.of_injective + (AbsoluteValue.algebraicLocalization vK w.1 w.2).val.toLinearMap + (AbsoluteValue.algebraicLocalization vK w.1 w.2).val.injective + +/-- In finite degree the algebraic localization is canonically the whole +metric completion. -/ +noncomputable def localizedCompletionEquivCompletion + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + AbsoluteValue.algebraicLocalization vK w.1 w.2 ≃ₐ[vK.Completion] + w.1.Completion := by + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + exact + (IntermediateField.equivOfEq + (absoluteValueExtension_finiteLocalization_eq_top vK hvK w)).trans + IntermediateField.topEquiv + +@[simp] +theorem localizedCompletionEquivCompletion_coe + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) + (x : AbsoluteValue.algebraicLocalization vK w.1 w.2) : + letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : SMul K w.1.Completion := hK.toSMul + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + localizedCompletionEquivCompletion vK hvK w x = + (x : w.1.Completion) := + rfl + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteProductNormTrace.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteProductNormTrace.lean new file mode 100644 index 0000000000..a48707b353 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteProductNormTrace.lean @@ -0,0 +1,208 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RingTheory.Norm.Basic +public import Mathlib.RingTheory.Trace.Basic +public import Mathlib.LinearAlgebra.Dimension.Constructions +/-! +# Norms and traces on finite dependent products + +These algebraic lemmas are the finite-product linear algebra used in +tensor-product norm and trace formulas. Mathlib has the binary trace formula and the +determinant of a binary product map; the dependent finite-product versions +are recorded here so that the local factors are allowed to have different +field degrees. +-/ + +@[expose] public section + +noncomputable +section + +namespace ValuationTheory +namespace Completion + +universe u v w + +open Module + +/-- A component of a module-valued product is finite whenever the whole +product is finite. Evaluation is a surjective linear map. -/ +theorem moduleFiniteOfPi + {R : Type u} [Semiring R] + {ι : Type v} (M : ι → Type w) + [∀ i, AddCommMonoid (M i)] [∀ i, Module R (M i)] + [Module.Finite R (∀ i, M i)] (i : ι) : + Module.Finite R (M i) := by + classical + apply Module.Finite.of_surjective (LinearMap.proj i) + intro x + exact ⟨Pi.single i x, by simp⟩ + +/-- Multiplication on a binary product is the product of the two +multiplication endomorphisms. -/ +theorem algebra_lmul_prod_eq_prodMap + {R S T : Type*} [CommRing R] [CommRing S] [CommRing T] + [Algebra R S] [Algebra R T] (x : S × T) : + Algebra.lmul R (S × T) x = + (Algebra.lmul R S x.1).prodMap (Algebra.lmul R T x.2) := by + apply LinearMap.ext + intro y + rcases y with ⟨y, z⟩ + rfl + +/-- The algebra norm on a binary product is the product of the component +norms. -/ +theorem algebra_norm_prod_apply + {R S T : Type*} [CommRing R] [CommRing S] [CommRing T] + [Algebra R S] [Algebra R T] + [Module.Free R S] [Module.Finite R S] + [Module.Free R T] [Module.Finite R T] + (x : S × T) : + Algebra.norm R x = Algebra.norm R x.1 * Algebra.norm R x.2 := by + rw [Algebra.norm_apply, algebra_lmul_prod_eq_prodMap, + LinearMap.det_prodMap, ← Algebra.norm_apply, ← Algebra.norm_apply] + +/-- Reindexing a dependent product is an algebra equivalence. -/ +noncomputable def piCongrLeftAlgEquiv + {R : Type*} [CommSemiring R] + {ι ι' : Type*} (A : ι' → Type*) [∀ i, Semiring (A i)] + [∀ i, Algebra R (A i)] (e : ι ≃ ι') : + ((i : ι) → A (e i)) ≃ₐ[R] ((i' : ι') → A i') where + __ := RingEquiv.piCongrLeft A e + commutes' r := by + funext j + obtain ⟨i, rfl⟩ := e.surjective j + change (Equiv.piCongrLeft A e + (fun i => algebraMap R (A (e i)) r)) (e i) = + algebraMap R (A (e i)) r + exact Equiv.piCongrLeft_apply_apply A e _ i + +/-- Splitting the `none` coordinate from an `Option`-indexed dependent +product is an algebra equivalence. -/ +noncomputable def piOptionEquivProdAlgEquiv + {R : Type*} [CommSemiring R] + {ι : Type*} (A : Option ι → Type*) [∀ i, Semiring (A i)] + [∀ i, Algebra R (A i)] : + ((i : Option ι) → A i) ≃ₐ[R] (A none × ((i : ι) → A (some i))) where + __ := RingEquiv.piOptionEquivProd + commutes' _ := rfl + +/-- The algebra norm of an element of a finite dependent product is the +product of its component norms. -/ +theorem algebra_norm_pi_apply + {R : Type u} [CommRing R] + {ι : Type v} [Fintype ι] + (A : ι → Type w) [∀ i, CommRing (A i)] [∀ i, Algebra R (A i)] + [∀ i, Module.Free R (A i)] [∀ i, Module.Finite R (A i)] + (x : ∀ i, A i) : + Algebra.norm R x = ∏ i, Algebra.norm R (x i) := by + classical + let P : ∀ (ι : Type v) [Fintype ι], Prop := + fun ι _ => + ∀ (A : ι → Type w) [∀ i, CommRing (A i)] [∀ i, Algebra R (A i)] + [∀ i, Module.Free R (A i)] [∀ i, Module.Finite R (A i)] + (x : ∀ i, A i), + Algebra.norm R x = ∏ i, Algebra.norm R (x i) + apply Fintype.induction_empty_option (P := P) + · intro α β _ e h A _ _ _ _ x + let : Fintype α := Fintype.ofEquiv β e.symm + let E := piCongrLeftAlgEquiv (R := R) A e + let x' : ∀ i : α, A (e i) := fun i => x (e i) + have hEx : E x' = x := by + apply E.symm.injective + rw [E.symm_apply_apply] + funext i + rfl + calc + Algebra.norm R x = Algebra.norm R (E x') := congrArg _ hEx.symm + _ = Algebra.norm R x' := Algebra.norm_eq_of_algEquiv E x' + _ = ∏ i : α, Algebra.norm R (x' i) := h _ _ + _ = ∏ j : β, Algebra.norm R (x j) := by + exact Fintype.prod_equiv e _ _ (fun i => rfl) + · intro A _ _ _ _ x + simp only [Fintype.prod_empty] + rw [Algebra.norm_apply] + exact LinearMap.det_eq_one_of_subsingleton _ + · intro α _ h A _ _ _ _ x + let E := piOptionEquivProdAlgEquiv (R := R) A + let y : A none × ((i : α) → A (some i)) := E x + calc + Algebra.norm R x = Algebra.norm R y := + (Algebra.norm_eq_of_algEquiv E x).symm + _ = Algebra.norm R y.1 * Algebra.norm R y.2 := + algebra_norm_prod_apply y + _ = Algebra.norm R (x none) * + ∏ i : α, Algebra.norm R (x (some i)) := by + rw [h] + rfl + _ = ∏ i : Option α, Algebra.norm R (x i) := by + rw [Fintype.prod_option] + +/-- The algebra trace of an element of a finite dependent product is the +sum of its component traces. -/ +theorem algebra_trace_pi_apply + {R : Type u} [CommRing R] + {ι : Type v} [Fintype ι] + (A : ι → Type w) [∀ i, CommRing (A i)] [∀ i, Algebra R (A i)] + [∀ i, Module.Free R (A i)] [∀ i, Module.Finite R (A i)] + (x : ∀ i, A i) : + Algebra.trace R (∀ i, A i) x = ∑ i, Algebra.trace R (A i) (x i) := by + classical + let P : ∀ (ι : Type v) [Fintype ι], Prop := + fun ι _ => + ∀ (A : ι → Type w) [∀ i, CommRing (A i)] [∀ i, Algebra R (A i)] + [∀ i, Module.Free R (A i)] [∀ i, Module.Finite R (A i)] + (x : ∀ i, A i), + Algebra.trace R (∀ i, A i) x = + ∑ i, Algebra.trace R (A i) (x i) + apply Fintype.induction_empty_option (P := P) + · intro α β _ e h A _ _ _ _ x + let : Fintype α := Fintype.ofEquiv β e.symm + let E := piCongrLeftAlgEquiv (R := R) A e + let x' : ∀ i : α, A (e i) := fun i => x (e i) + have hEx : E x' = x := by + apply E.symm.injective + rw [E.symm_apply_apply] + funext i + rfl + calc + Algebra.trace R (∀ j : β, A j) x = + Algebra.trace R (∀ i : α, A (e i)) x' := by + rw [← Algebra.trace_eq_of_algEquiv E x'] + rw [hEx] + _ = ∑ i : α, Algebra.trace R (A (e i)) (x' i) := h _ _ + _ = ∑ j : β, Algebra.trace R (A j) (x j) := by + exact Fintype.sum_equiv e _ _ (fun i => rfl) + · intro A _ _ _ _ x + simp only [Fintype.sum_empty] + rw [Algebra.trace_apply] + let b : Basis (Fin 0) R ((i : PEmpty) → A i) := Basis.empty _ + rw [LinearMap.trace_eq_matrix_trace R b] + simp [Matrix.trace] + · intro α _ h A _ _ _ _ x + let E := piOptionEquivProdAlgEquiv (R := R) A + let y : A none × ((i : α) → A (some i)) := E x + calc + Algebra.trace R (∀ i : Option α, A i) x = + Algebra.trace R (A none × ((i : α) → A (some i))) y := + (Algebra.trace_eq_of_algEquiv E x).symm + _ = Algebra.trace R (A none) y.1 + + Algebra.trace R ((i : α) → A (some i)) y.2 := + Algebra.trace_prod_apply y + _ = Algebra.trace R (A none) (x none) + + ∑ i : α, Algebra.trace R (A (some i)) (x (some i)) := by + rw [h] + rfl + _ = ∑ i : Option α, Algebra.trace R (A i) (x i) := by + rw [Fintype.sum_option] + +end Completion +end ValuationTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/Padic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/Padic.lean new file mode 100644 index 0000000000..95ea5ac60c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/Padic.lean @@ -0,0 +1,142 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion +public import Mathlib.NumberTheory.Ostrowski +public import Mathlib.NumberTheory.Padics.PadicNumbers +/-! +# The `p`-adic completion used in the global cyclotomic argument + +the completion construction constructs localizations using the absolute-value completion +`v.Completion`, whereas the local Kronecker--Weber local cyclotomic theorem is stated +over mathlib's concrete field `ℚ_[p]`. For the rational `p`-adic absolute +value these are canonically isomorphic. This file packages that comparison +without adding any hypothesis to the global theorem. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory.Valuations + + +variable (p : ℕ) [Fact p.Prime] + +/-- The rational `p`-adic absolute value is nontrivial. -/ +theorem padicAbsoluteValue_isNontrivial : + (Rat.AbsoluteValue.padic p).IsNontrivial := by + refine ⟨(p : ℚ), by exact_mod_cast (Fact.out : p.Prime).ne_zero, ?_⟩ + apply ne_of_lt + change ((padicNorm p p : ℚ) : ℝ) < 1 + exact_mod_cast (padicNorm.padicNorm_p_lt_one_of_prime (p := p)) + +/-- The dense isometric embedding of rational numbers, equipped with their +`p`-adic absolute value, into the concrete field `ℚ_[p]`. -/ +noncomputable def padicAbsoluteValueBaseMap : + WithAbs (Rat.AbsoluteValue.padic p) →+* ℚ_[p] := + (Rat.castHom ℚ_[p]).comp + (WithAbs.equiv (Rat.AbsoluteValue.padic p)).toRingHom + +/-- The dense rational embedding preserves the `p`-adic norm. -/ +theorem padicAbsoluteValueBaseMap_norm + (x : WithAbs (Rat.AbsoluteValue.padic p)) : + ‖padicAbsoluteValueBaseMap p x‖ = ‖x‖ := by + change ‖((WithAbs.equiv (Rat.AbsoluteValue.padic p) x : ℚ) : ℚ_[p])‖ = + Rat.AbsoluteValue.padic p (WithAbs.equiv (Rat.AbsoluteValue.padic p) x) + rw [Padic.eq_padicNorm] + rfl + +/-- The preceding rational embedding is an isometry. -/ +theorem padicAbsoluteValueBaseMap_isometry : + Isometry (padicAbsoluteValueBaseMap p) := + AddMonoidHomClass.isometry_of_norm _ + (padicAbsoluteValueBaseMap_norm p) + +/-- The canonical ring homomorphism from the absolute-value completion of +`ℚ` at `p` to the concrete `p`-adic field. -/ +noncomputable def padicAbsoluteValueCompletionRingHom : + (Rat.AbsoluteValue.padic p).Completion →+* ℚ_[p] := + UniformSpace.Completion.extensionHom + (padicAbsoluteValueBaseMap p) + (padicAbsoluteValueBaseMap_isometry p).continuous + +/-- On the dense rational subring, the completed map agrees with the original +`p`-adic embedding. -/ +@[simp] +theorem padicAbsoluteValueCompletionRingHom_coe + (x : WithAbs (Rat.AbsoluteValue.padic p)) : + padicAbsoluteValueCompletionRingHom p + (x : (Rat.AbsoluteValue.padic p).Completion) = + padicAbsoluteValueBaseMap p x := + UniformSpace.Completion.extensionHom_coe + (padicAbsoluteValueBaseMap p) + (padicAbsoluteValueBaseMap_isometry p).continuous x + +/-- The completed map remains an isometry. -/ +theorem padicAbsoluteValueCompletionRingHom_isometry : + Isometry (padicAbsoluteValueCompletionRingHom p) := + (padicAbsoluteValueBaseMap_isometry p).completion_extension + +/-- The completed map is surjective because its closed range contains the +dense copy of `ℚ` in `ℚ_[p]`. -/ +theorem padicAbsoluteValueCompletionRingHom_surjective : + Function.Surjective (padicAbsoluteValueCompletionRingHom p) := by + let f := padicAbsoluteValueCompletionRingHom p + have hrangeClosed : IsClosed (Set.range f) := + (padicAbsoluteValueCompletionRingHom_isometry p).isClosedEmbedding.isClosed_range + have hdense : DenseRange ((↑) : ℚ → ℚ_[p]) := + Padic.denseRange_ratCast p + have hrange : Set.range ((↑) : ℚ → ℚ_[p]) ⊆ Set.range f := by + rintro _ ⟨q, rfl⟩ + let q' : WithAbs (Rat.AbsoluteValue.padic p) := + (WithAbs.equiv (Rat.AbsoluteValue.padic p)).symm q + refine ⟨(q' : (Rat.AbsoluteValue.padic p).Completion), ?_⟩ + change padicAbsoluteValueCompletionRingHom p + (q' : (Rat.AbsoluteValue.padic p).Completion) = (q : ℚ_[p]) + rw [padicAbsoluteValueCompletionRingHom_coe] + rfl + intro x + have hx : x ∈ closure (Set.range ((↑) : ℚ → ℚ_[p])) := by + rw [hdense.closure_range] + trivial + exact closure_minimal hrange hrangeClosed hx + +/-- The absolute-value completion of `ℚ` at `p` is the concrete `p`-adic +field. -/ +noncomputable def padicAbsoluteValueCompletionRingEquiv : + (Rat.AbsoluteValue.padic p).Completion ≃+* ℚ_[p] := + RingEquiv.ofBijective (padicAbsoluteValueCompletionRingHom p) + ⟨(padicAbsoluteValueCompletionRingHom_isometry p).injective, + padicAbsoluteValueCompletionRingHom_surjective p⟩ + +/-- The same comparison as a `ℚ`-algebra equivalence, in the form needed +to transport the global cyclotomic local extension to the local cyclotomic theorem. -/ +noncomputable def padicAbsoluteValueCompletionAlgEquiv : + (Rat.AbsoluteValue.padic p).Completion ≃ₐ[ℚ] ℚ_[p] where + __ := padicAbsoluteValueCompletionRingEquiv p + commutes' q := by + change padicAbsoluteValueCompletionRingHom p + (((WithAbs.equiv (Rat.AbsoluteValue.padic p)).symm q : + WithAbs (Rat.AbsoluteValue.padic p)) : + (Rat.AbsoluteValue.padic p).Completion) = (q : ℚ_[p]) + rw [padicAbsoluteValueCompletionRingHom_coe] + rfl + +/-- On the dense rational subring, the completion algebra equivalence agrees +with the original `p`-adic embedding. -/ +@[simp] +theorem padicAbsoluteValueCompletionAlgEquiv_coe + (x : WithAbs (Rat.AbsoluteValue.padic p)) : + padicAbsoluteValueCompletionAlgEquiv p + (x : (Rat.AbsoluteValue.padic p).Completion) = + padicAbsoluteValueBaseMap p x := + padicAbsoluteValueCompletionRingHom_coe p x + +end AlgebraicNumberTheory.Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialCRT.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialCRT.lean new file mode 100644 index 0000000000..5fbc47614a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialCRT.lean @@ -0,0 +1,81 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RingTheory.AdjoinRoot +public import Mathlib.RingTheory.Ideal.Quotient.Operations +/-! +# Polynomial Chinese remainder equivalence + +This is the algebraic core of tensor-product decompositions. A squarefree factorization +of the base-changed primitive polynomial gives the canonical product of its +simple factor algebras. +-/ + +@[expose] public section + +noncomputable +section + +namespace ValuationTheory +namespace Completion + +universe u v + +open scoped Polynomial +open Function + +/-- The Chinese remainder ring equivalence is an algebra equivalence over +any coefficient ring acting on the ambient commutative ring. -/ +noncomputable def quotientInfAlgEquivPiQuotient + {R A : Type*} [CommRing R] [CommRing A] [Algebra R A] + {ι : Type*} [Finite ι] + (I : ι → Ideal A) (hI : Pairwise (IsCoprime on I)) : + (A ⧸ ⨅ i, I i) ≃ₐ[R] ∀ i, A ⧸ I i where + __ := Ideal.quotientInfRingEquivPiQuotient I hI + commutes' r := by + ext i + rfl + +/-- Chinese remainder equivalence for a finite family of pairwise coprime +polynomials. It is canonical: every polynomial class is sent to the family +of the same class modulo each factor. -/ +noncomputable def adjoinRootProdEquivPi + {F : Type u} [Field F] {ι : Type v} [Fintype ι] + (f : ι → F[X]) + (hf : ∀ i j, i ≠ j → IsCoprime (f i) (f j)) : + AdjoinRoot (∏ i, f i) ≃ₐ[F] ∀ i, AdjoinRoot (f i) := by + let I : ι → Ideal F[X] := fun i => Ideal.span ({f i} : Set F[X]) + have hI : Pairwise (IsCoprime on I) := by + intro i j hij + exact (Ideal.isCoprime_span_singleton_iff (f i) (f j)).2 + (hf i j hij) + have hInf : Ideal.span ({∏ i, f i} : Set F[X]) = ⨅ i, I i := by + symm + exact Ideal.iInf_span_singleton hf + exact + (Ideal.quotientEquivAlgOfEq F hInf).trans + (quotientInfAlgEquivPiQuotient I hI) + +/-- The product decomposition of an adjoined-root algebra evaluates +representatives coordinatewise. -/ +@[simp] +theorem adjoinRootProdEquivPi_mk + {F : Type u} [Field F] {ι : Type v} [Fintype ι] + (f : ι → F[X]) + (hf : ∀ i j, i ≠ j → IsCoprime (f i) (f j)) + (g : F[X]) (i : ι) : + adjoinRootProdEquivPi f hf (AdjoinRoot.mk (∏ i, f i) g) i = + AdjoinRoot.mk (f i) g := by + change Ideal.Quotient.mk (Ideal.span ({f i} : Set F[X])) g = + Ideal.Quotient.mk (Ideal.span ({f i} : Set F[X])) g + rfl + +end Completion +end ValuationTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialFactors.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialFactors.lean new file mode 100644 index 0000000000..4bac8f4890 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialFactors.lean @@ -0,0 +1,220 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.FieldTheory.IsAlgClosed.AlgebraicClosure +public import Mathlib.FieldTheory.Minpoly.IsConjRoot +public import Mathlib.Algebra.Polynomial.FieldDivision +public import Mathlib.RingTheory.Adjoin.PowerBasis +/-! +# Irreducible factors as conjugacy classes of roots + +This file records the algebraic source lemma underlying +the extension-factor correspondence. Multiplicities are deliberately discarded: extensions of a +valuation correspond to the *distinct* irreducible factors over the +completion. +-/ + +@[expose] public section + +noncomputable +section + +open Polynomial +open UniqueFactorizationMonoid + +namespace ValuationTheory +namespace Completion + +universe u v + +/-- The canonical monic normalization of polynomial factors over a field. +The normalization instances for an arbitrary field require a decidable +equality; this definition installs the classical one internally instead of +exposing it as an assumption of the extension-factor correspondence. -/ +noncomputable def polynomialNormalizedFactors + {F : Type u} [Field F] (p : F[X]) : Multiset F[X] := by + letI : DecidableEq F := Classical.decEq F + letI : NormalizationMonoid F := inferInstance + letI : NormalizationMonoid F[X] := Polynomial.instNormalizationMonoid + exact normalizedFactors p + +/-- The finite set underlying `polynomialNormalizedFactors`, with repeated +factors removed. -/ +noncomputable def polynomialDistinctNormalizedFactors + {F : Type u} [Field F] (p : F[X]) : Finset F[X] := by + classical + exact (polynomialNormalizedFactors p).toFinset + +/-- Associated polynomials have the same multiset of normalized irreducible factors. -/ +theorem polynomialNormalizedFactors_eq_of_associated + {F : Type u} [Field F] {p q : F[X]} (h : Associated p q) : + polynomialNormalizedFactors p = polynomialNormalizedFactors q := by + classical + dsimp [polynomialNormalizedFactors] + exact h.normalizedFactors_eq + +/-- Associated polynomials have the same set of distinct normalized factors. -/ +theorem polynomialDistinctNormalizedFactors_eq_of_associated + {F : Type u} [Field F] {p q : F[X]} (h : Associated p q) : + polynomialDistinctNormalizedFactors p = + polynomialDistinctNormalizedFactors q := by + classical + dsimp [polynomialDistinctNormalizedFactors] + rw [polynomialNormalizedFactors_eq_of_associated h] + +/-- The distinct normalized irreducible factors of a nonzero polynomial. +Using `toFinset` removes the multiplicities retained by `normalizedFactors`. +-/ +abbrev DistinctNormalizedFactors + {F : Type u} [Field F] (p : F[X]) := + {g : F[X] // g ∈ polynomialDistinctNormalizedFactors p} + +/-- The roots in `E` of a polynomial over the base field `F`. -/ +abbrev PolynomialRootsIn + {F : Type u} [Field F] (E : Type v) [Field E] [Algebra F E] + (p : F[X]) := + {x : E // x ∈ p.rootSet E} + +/-- Send a root to its monic minimal polynomial over the base field. -/ +def rootMinpoly + {F : Type u} [Field F] {E : Type v} [Field E] [Algebra F E] + (p : F[X]) : PolynomialRootsIn E p → F[X] := + fun x => minpoly F (x : E) + +/-- Equality of the minimal polynomials of two roots. Over a normal closure, +this is equivalently conjugacy under the absolute Galois group. -/ +abbrev rootMinpolySetoid + {F : Type u} [Field F] {E : Type v} [Field E] [Algebra F E] + (p : F[X]) : Setoid (PolynomialRootsIn E p) := + Setoid.ker (rootMinpoly p) + +/-- The minimal polynomial of a root occurs among the normalized factors of the polynomial. -/ +theorem rootMinpoly_mem_normalizedFactors + {F : Type u} [Field F] {E : Type v} [Field E] [Algebra F E] + [Algebra.IsAlgebraic F E] {p : F[X]} (hp : p ≠ 0) + (x : PolynomialRootsIn E p) : + rootMinpoly p x ∈ polynomialDistinctNormalizedFactors p := by + classical + dsimp [polynomialDistinctNormalizedFactors, polynomialNormalizedFactors] + rw [Multiset.mem_toFinset, Polynomial.mem_normalizedFactors_iff hp] + have hxint : IsIntegral F (x : E) := + (Algebra.IsAlgebraic.isAlgebraic (x : E)).isIntegral + refine ⟨minpoly.irreducible hxint, minpoly.monic hxint, ?_⟩ + exact minpoly.dvd F (x : E) (Polynomial.mem_rootSet.mp x.2).2 + +/-- Minimal polynomials of roots exhaust the distinct normalized factors. -/ +theorem range_rootMinpoly_eq_distinctNormalizedFactors + {F : Type u} [Field F] {E : Type v} [Field E] [Algebra F E] + [Algebra.IsAlgebraic F E] [IsAlgClosed E] + {p : F[X]} (hp : p ≠ 0) : + Set.range (rootMinpoly p : PolynomialRootsIn E p → F[X]) = + {g : F[X] | g ∈ polynomialDistinctNormalizedFactors p} := by + classical + ext g + constructor + · rintro ⟨x, rfl⟩ + exact rootMinpoly_mem_normalizedFactors hp x + · intro hg + have hg' : g ∈ normalizedFactors p := by + simpa only [polynomialDistinctNormalizedFactors, + polynomialNormalizedFactors, Multiset.mem_toFinset, Set.mem_ofPred_eq] using hg + obtain ⟨hgirred, hgmonic, hgdvd⟩ := + (Polynomial.mem_normalizedFactors_iff hp).mp hg' + have hgdegree : g.degree ≠ 0 := + (degree_pos_of_irreducible hgirred).ne' + obtain ⟨x, hx⟩ := IsAlgClosed.exists_aeval_eq_zero E g hgdegree + have hxp : Polynomial.aeval x p = 0 := + aeval_eq_zero_of_dvd_aeval_eq_zero hgdvd hx + have hxroot : x ∈ p.rootSet E := by + rw [Polynomial.mem_rootSet] + exact ⟨hp, hxp⟩ + refine ⟨⟨x, hxroot⟩, ?_⟩ + exact (minpoly.eq_of_irreducible_of_monic hgirred hx hgmonic).symm + +/-- Conjugacy classes of roots of `p` are in canonical bijection with the +distinct normalized irreducible factors of `p`. -/ +noncomputable def rootClassesEquivDistinctNormalizedFactors + {F : Type u} [Field F] {E : Type v} [Field E] [Algebra F E] + [Algebra.IsAlgebraic F E] [IsAlgClosed E] + {p : F[X]} (hp : p ≠ 0) : + Quotient (rootMinpolySetoid (E := E) p) ≃ + DistinctNormalizedFactors p := + (Setoid.quotientKerEquivRange (rootMinpoly p)).trans + (Set.equivOfEq (range_rootMinpoly_eq_distinctNormalizedFactors hp)) + +/-- Two roots are equivalent precisely when they are conjugate roots. -/ +theorem rootMinpolySetoid_rel_iff_isConjRoot + {F : Type u} [Field F] {E : Type v} [Field E] [Algebra F E] + {p : F[X]} (x y : PolynomialRootsIn E p) : + (rootMinpolySetoid p).r x y ↔ IsConjRoot F (x : E) (y : E) := + Iff.rfl + +/-- Minimal-polynomial equivalence of roots agrees with the Galois orbit relation. -/ +theorem rootMinpolySetoid_rel_iff_orbitRel + {F : Type u} [Field F] {E : Type v} [Field E] [Algebra F E] + [Normal F E] {p : F[X]} (x y : PolynomialRootsIn E p) : + (rootMinpolySetoid p).r x y ↔ + MulAction.orbitRel Gal(E/F) E (x : E) (y : E) := by + exact isConjRoot_iff_orbitRel + +/-- For a simple finite extension `L = K(α)`, `K`-embeddings into an +extension of `K'` are the roots, in that extension, of the minimal polynomial +of `α` after base change from `K` to `K'`. -/ +noncomputable def simpleEmbeddingsEquivMappedMinpolyRoots + {K : Type u} {L : Type v} {K' E : Type*} + [Field K] [Field L] [Field K'] [Field E] + [Algebra K L] [Algebra K K'] [Algebra K E] [Algebra K' E] + [IsScalarTower K K' E] + (α : L) (hα : IsIntegral K α) + (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) : + (L →ₐ[K] E) ≃ + PolynomialRootsIn E + ((minpoly K α).map (algebraMap K K')) := by + let pb : PowerBasis K L := PowerBasis.ofAdjoinEqTop hα hgen + let p : K'[X] := (minpoly K α).map (algebraMap K K') + have hpbgen : pb.gen = α := by simp [pb] + have hp : p ≠ 0 := + (Polynomial.map_ne_zero_iff (algebraMap K K').injective).2 + (minpoly.ne_zero hα) + have hroot (τ : L →ₐ[K] E) : τ α ∈ p.rootSet E := by + rw [Polynomial.mem_rootSet] + refine ⟨hp, ?_⟩ + change Polynomial.aeval (τ α) + ((minpoly K α).map (algebraMap K K')) = 0 + rw [aeval_map_algebraMap] + rw [aeval_algHom_apply τ α (minpoly K α), minpoly.aeval, map_zero] + have hbaseRoot (x : PolynomialRootsIn E p) : + Polynomial.aeval (x : E) (minpoly K pb.gen) = 0 := by + rw [hpbgen] + exact (Polynomial.aeval_map_algebraMap K' (x : E) (minpoly K α)).symm.trans + (Polynomial.mem_rootSet.mp x.2).2 + let toRoot : (L →ₐ[K] E) → PolynomialRootsIn E p := + fun τ => ⟨τ α, hroot τ⟩ + let fromRoot : PolynomialRootsIn E p → (L →ₐ[K] E) := + fun x => pb.lift (x : E) (hbaseRoot x) + refine + { toFun := toRoot + invFun := fromRoot + left_inv := ?_ + right_inv := ?_ } + · intro τ + apply pb.algHom_ext + change pb.lift (τ α) _ pb.gen = τ pb.gen + rw [pb.lift_gen, hpbgen] + · intro x + apply Subtype.ext + change pb.lift (x : E) _ α = x + calc + pb.lift (x : E) _ α = pb.lift (x : E) _ pb.gen := + congrArg (pb.lift (x : E) (hbaseRoot x)) hpbgen.symm + _ = x := pb.lift_gen (x : E) (hbaseRoot x) + +end Completion +end ValuationTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/SeparablePolynomialFactors.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/SeparablePolynomialFactors.lean new file mode 100644 index 0000000000..6432893cf0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/SeparablePolynomialFactors.lean @@ -0,0 +1,85 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialFactors +public import Mathlib.FieldTheory.Separable +/-! +# Distinct factors of a separable polynomial + +A separable monic polynomial is the product of its distinct normalized +irreducible factors, and those factors are pairwise coprime. These are the +factorization facts used in the Chinese-remainder proof of tensor-product decomposition. +-/ + +@[expose] public section + +noncomputable +section + +open Polynomial UniqueFactorizationMonoid +open scoped BigOperators + +namespace ValuationTheory +namespace Completion + +universe u + +/-- A monic separable polynomial is the product of its distinct normalized +irreducible factors. -/ +theorem separable_monic_eq_prod_distinctNormalizedFactors + {F : Type u} [Field F] (p : F[X]) + (hpmonic : p.Monic) (hpsep : p.Separable) : + p = ∏ g : DistinctNormalizedFactors p, (g.1 : F[X]) := by + classical + let : NormalizationMonoid F := inferInstance + let : NormalizationMonoid F[X] := Polynomial.instNormalizationMonoid + have hp0 : p ≠ 0 := hpmonic.ne_zero + have hnodup : (normalizedFactors p).Nodup := + (squarefree_iff_nodup_normalizedFactors hp0).1 hpsep.squarefree + have hprod : (normalizedFactors p).prod = p := by + simpa [hpmonic.leadingCoeff] using + (Polynomial.leadingCoeff_mul_prod_normalizedFactors p) + calc + p = (normalizedFactors p).prod := hprod.symm + _ = ∏ g : DistinctNormalizedFactors p, (g.1 : F[X]) := by + change (normalizedFactors p).prod = + ∏ g : {g : F[X] // g ∈ (normalizedFactors p).toFinset}, g.1 + rw [Finset.univ_eq_attach, + Finset.prod_attach (f := fun x : F[X] ↦ x)] + change (normalizedFactors p).prod = + ((normalizedFactors p).toFinset.1.map id).prod + rw [Multiset.toFinset_val, hnodup.dedup, Multiset.map_id] + +/-- Distinct normalized irreducible factors are pairwise coprime. -/ +theorem distinctNormalizedFactors_pairwise_coprime + {F : Type u} [Field F] (p : F[X]) : + ∀ i j : DistinctNormalizedFactors p, i ≠ j → + IsCoprime (i.1 : F[X]) j.1 := by + classical + let : NormalizationMonoid F := inferInstance + let : NormalizationMonoid F[X] := Polynomial.instNormalizationMonoid + intro i j hij + have hnorm : polynomialNormalizedFactors p = normalizedFactors p := by + rfl + have hi : i.1 ∈ normalizedFactors p := by + rw [← hnorm] + exact Multiset.mem_toFinset.mp i.2 + have hj : j.1 ∈ normalizedFactors p := by + rw [← hnorm] + exact Multiset.mem_toFinset.mp j.2 + rcases (prime_of_normalized_factor i.1 hi).irreducible.isCoprime_or_dvd j.1 with h | h + · exact h + · exfalso + apply hij + apply Subtype.ext + exact normalizedFactors_eq_of_dvd p i.1 hi j.1 hj h + +end Completion +end ValuationTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductDecomposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductDecomposition.lean new file mode 100644 index 0000000000..14ecb92a03 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductDecomposition.lean @@ -0,0 +1,434 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionFactorClassification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.SeparablePolynomialFactors +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.BaseChangeAdjoinRoot +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialCRT +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.CanonicalTensorMap +public import Mathlib.Algebra.Group.Pi.Units +/-! +# Tensor-product decomposition over a completion + +For a finite separable extension `L / K`, the canonical map +`L ⊗_K K_v → ∏_{w|v} L_w` is an isomorphism. The proof follows the +construction: choose a primitive element, factor its mapped minimal polynomial, +apply the Chinese remainder theorem, and identify every simple factor with +the corresponding completion using the extension-factor correspondence. +-/ + +@[expose] public section + +noncomputable +section + +open Polynomial +open scoped BigOperators TensorProduct +open ValuationTheory.Completion + +namespace AlgebraicNumberTheory +namespace Valuations + +universe u v + +/-- The primitive power basis used in the separable proof of the completion +tensor-product decomposition. -/ +noncomputable def completionTensorDecompositionPowerBasis + (K : Type u) (L : Type v) [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] : PowerBasis K L := + Field.powerBasisOfFiniteOfSeparable K L + +/-- the extension-factor correspondence makes the extensions `w | v` into a finite type. -/ +@[reducible] +noncomputable def completionTensorDecompositionExtensionFintype + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) : + Fintype (AbsoluteValueExtension vK L) := by + let pb := completionTensorDecompositionPowerBasis K L + let hf : Irreducible (minpoly K pb.gen) := + minpoly.irreducible pb.isIntegral_gen + let e := completionExtensionFactorExtensionEquivFactors vK hvK hf + (minpoly.aeval K pb.gen) pb.adjoin_gen_eq_top + exact Fintype.ofEquiv _ e.symm + +/-- In the separable case the mapped minimal polynomial is the product of +the factors indexed by all extensions `w | v`. -/ +theorem completionTensorDecomposition_mapped_minpoly_eq_prod_extensionFactors + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) : + letI := completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK + (minpoly K (completionTensorDecompositionPowerBasis K L).gen).map + (algebraMap K vK.Completion) = + ∏ w : AbsoluteValueExtension vK L, + completionExtensionFactorExtensionFactor vK + (completionTensorDecompositionPowerBasis K L).gen w := by + classical + let := completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK + let pb := completionTensorDecompositionPowerBasis K L + let p := (minpoly K pb.gen).map (algebraMap K vK.Completion) + let hf : Irreducible (minpoly K pb.gen) := + minpoly.irreducible pb.isIntegral_gen + let e := completionExtensionFactorExtensionEquivFactors vK hvK hf + (minpoly.aeval K pb.gen) pb.adjoin_gen_eq_top + have hpmonic : p.Monic := + (minpoly.monic pb.isIntegral_gen).map (algebraMap K vK.Completion) + have hpsep : p.Separable := + Polynomial.Separable.map + (Algebra.IsSeparable.isSeparable K (pb.gen : L)) + calc + p = ∏ g : CompletionExtensionFactorCompletionFactors vK (minpoly K pb.gen), + (g.1 : vK.Completion[X]) := + separable_monic_eq_prod_distinctNormalizedFactors p hpmonic hpsep + _ = ∏ w : AbsoluteValueExtension vK L, + completionExtensionFactorExtensionFactor vK pb.gen w := by + symm + exact Fintype.prod_equiv e _ _ (fun _ ↦ rfl) + +/-- The factors indexed by distinct extensions are pairwise coprime. -/ +theorem completionTensorDecomposition_extensionFactors_pairwise_coprime + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) : + letI := completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK + ∀ w w' : AbsoluteValueExtension vK L, w ≠ w' → + IsCoprime + (completionExtensionFactorExtensionFactor vK + (completionTensorDecompositionPowerBasis K L).gen w) + (completionExtensionFactorExtensionFactor vK + (completionTensorDecompositionPowerBasis K L).gen w') := by + classical + let := completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK + let pb := completionTensorDecompositionPowerBasis K L + let hf : Irreducible (minpoly K pb.gen) := + minpoly.irreducible pb.isIntegral_gen + let e := completionExtensionFactorExtensionEquivFactors vK hvK hf + (minpoly.aeval K pb.gen) pb.adjoin_gen_eq_top + intro w w' hww' + have he : e w ≠ e w' := fun h ↦ hww' (e.injective h) + exact distinctNormalizedFactors_pairwise_coprime + ((minpoly K pb.gen).map (algebraMap K vK.Completion)) + (e w) (e w') he + +/-- The factorization/CRT equivalence in the left tensor order +`K_v ⊗_K L`. -/ +noncomputable def completionTensorDecompositionFactorEquiv + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) : + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + vK.Completion ⊗[K] L ≃ₐ[vK.Completion] + ∀ w : AbsoluteValueExtension vK L, w.1.Completion := by + classical + letI := completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK + let pb := completionTensorDecompositionPowerBasis K L + let hα := pb.isIntegral_gen + let hgen := pb.adjoin_gen_eq_top + letI hK : ∀ w : AbsoluteValueExtension vK L, + Algebra K w.1.Completion := + fun w ↦ AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + letI : ∀ w : AbsoluteValueExtension vK L, SMul K w.1.Completion := + fun w ↦ (hK w).toSMul + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + let ebase := baseChangeEquivAdjoinRoot (A := vK.Completion) pb + let hprod := completionTensorDecomposition_mapped_minpoly_eq_prod_extensionFactors + (K := K) (L := L) vK hvK + let econgr := AdjoinRoot.algEquivOfEq vK.Completion _ _ hprod + let ecrt := adjoinRootProdEquivPi + (fun w : AbsoluteValueExtension vK L ↦ + completionExtensionFactorExtensionFactor vK pb.gen w) + (completionTensorDecomposition_extensionFactors_pairwise_coprime + (K := K) (L := L) vK hvK) + let elocal := AlgEquiv.piCongrRight fun w ↦ + completionExtensionFactorAdjoinRootEquivCompletion + vK hvK pb.gen hα hgen w + exact ebase.trans (econgr.trans (ecrt.trans elocal)) + +/-- The CRT equivalence sends the primitive generator to its canonical +image in every completion. -/ +@[simp] +theorem completionTensorDecomposition_factorEquiv_one_tmul_gen + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (w : AbsoluteValueExtension vK L) : + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + completionTensorDecompositionFactorEquiv (K := K) (L := L) vK hvK + (1 ⊗ₜ[K] (completionTensorDecompositionPowerBasis K L).gen) w = + AbsoluteValue.toCompletionAlgHom (K := K) w.1 + (completionTensorDecompositionPowerBasis K L).gen := by + classical + let := completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK + let pb := completionTensorDecompositionPowerBasis K L + let hK : ∀ w : AbsoluteValueExtension vK L, + Algebra K w.1.Completion := + fun w ↦ AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : ∀ w : AbsoluteValueExtension vK L, SMul K w.1.Completion := + fun w ↦ (hK w).toSMul + let : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + let factors := fun w : AbsoluteValueExtension vK L ↦ + completionExtensionFactorExtensionFactor vK pb.gen w + let hcop := completionTensorDecomposition_extensionFactors_pairwise_coprime + (K := K) (L := L) vK hvK + let ebase := baseChangeEquivAdjoinRoot (A := vK.Completion) pb + let hprod := completionTensorDecomposition_mapped_minpoly_eq_prod_extensionFactors + (K := K) (L := L) vK hvK + let econgr := AdjoinRoot.algEquivOfEq vK.Completion _ _ hprod + let ecrt := adjoinRootProdEquivPi factors hcop + let elocal := AlgEquiv.piCongrRight fun w ↦ + completionExtensionFactorAdjoinRootEquivCompletion + vK hvK pb.gen pb.isIntegral_gen pb.adjoin_gen_eq_top w + change elocal (ecrt (econgr (ebase (1 ⊗ₜ[K] pb.gen)))) w = _ + rw [baseChangeEquivAdjoinRoot_one_tmul_gen, + AdjoinRoot.algEquivOfEq_root] + change + (completionExtensionFactorAdjoinRootEquivCompletion + vK hvK pb.gen pb.isIntegral_gen pb.adjoin_gen_eq_top w) + (adjoinRootProdEquivPi factors hcop + (AdjoinRoot.mk (∏ w, factors w) X) w) = _ + rw [adjoinRootProdEquivPi_mk] + exact completionExtensionFactor_adjoinRootEquivCompletion_root + vK hvK pb.gen pb.isIntegral_gen pb.adjoin_gen_eq_top w + +/-- The factorization equivalence is not merely an abstract isomorphism: +its algebra homomorphism is the canonical product map. -/ +theorem completionTensorDecomposition_factorEquiv_toAlgHom + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) : + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + (completionTensorDecompositionFactorEquiv (K := K) (L := L) vK hvK).toAlgHom = + completionTensorMapLeftCanonicalHom vK := by + classical + let := completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK + let pb := completionTensorDecompositionPowerBasis K L + let hK : ∀ w : AbsoluteValueExtension vK L, + Algebra K w.1.Completion := + fun w ↦ AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + let : ∀ w : AbsoluteValueExtension vK L, SMul K w.1.Completion := + fun w ↦ (hK w).toSMul + let : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + apply (powerBasisBaseChange (A := vK.Completion) pb).algHom_ext + funext w + change + completionTensorDecompositionFactorEquiv (K := K) (L := L) vK hvK + (1 ⊗ₜ[K] (completionTensorDecompositionPowerBasis K L).gen) w = + completionTensorMapLeftCanonicalHom (K := K) (L := L) vK + (1 ⊗ₜ[K] (completionTensorDecompositionPowerBasis K L).gen) w + rw [completionTensorDecomposition_factorEquiv_one_tmul_gen + (K := K) (L := L) vK hvK w, + completionTensorMap_leftCanonicalHom_tmul_apply] + simp + +/-- The canonical product map in the left tensor order is bijective. -/ +theorem completionTensorDecomposition_leftCanonicalHom_bijective + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) : + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + Function.Bijective + (completionTensorMapLeftCanonicalHom (K := K) (L := L) vK) := by + classical + let : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + rw [← completionTensorDecomposition_factorEquiv_toAlgHom + (K := K) (L := L) vK hvK] + exact (completionTensorDecompositionFactorEquiv + (K := K) (L := L) vK hvK).bijective + +/-- the completion tensor-product decomposition in the left tensor order, retained for the scalar +extension calculations in the local degree, norm, and trace formulas. Its underlying map is + canonical. -/ +noncomputable def completionTensorDecompositionLeft + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) : + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + vK.Completion ⊗[K] L ≃ₐ[vK.Completion] + ∀ w : AbsoluteValueExtension vK L, w.1.Completion := by + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + exact AlgEquiv.ofBijective + (completionTensorMapLeftCanonicalHom (K := K) (L := L) vK) + (completionTensorDecomposition_leftCanonicalHom_bijective + (K := K) (L := L) vK hvK) + +@[simp] +theorem completionTensorDecomposition_left_tmul_apply + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (b : vK.Completion) (a : L) + (w : AbsoluteValueExtension vK L) : + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + completionTensorDecompositionLeft (K := K) (L := L) vK hvK (b ⊗ₜ[K] a) w = + algebraMap vK.Completion w.1.Completion b * + AbsoluteValue.toCompletionAlgHom (K := K) w.1 a := by + let : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + change completionTensorMapLeftCanonicalHom (K := K) (L := L) vK + (b ⊗ₜ[K] a) w = _ + exact completionTensorMap_leftCanonicalHom_tmul_apply vK b a w + +/-- The canonical map in the chosen tensor-factor order is bijective. -/ +theorem completionTensorDecomposition_canonicalHom_bijective + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) : + letI := Algebra.TensorProduct.rightAlgebra + (R := K) (A := L) (B := vK.Completion) + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + Function.Bijective + (completionTensorMapCanonicalHom (K := K) (L := L) vK) := by + let := Algebra.TensorProduct.rightAlgebra + (R := K) (A := L) (B := vK.Completion) + let : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + let c := Algebra.TensorProduct.comm K L vK.Completion + let h := completionTensorMapLeftCanonicalHom (K := K) (L := L) vK + change Function.Bijective (fun x ↦ h (c x)) + exact (completionTensorDecomposition_leftCanonicalHom_bijective + (K := K) (L := L) vK hvK).comp c.bijective + +/-- **The completion tensor-product decomposition.** The canonical map +`L ⊗_K K_v → ∏_{w|v} L_w` is an isomorphism for a finite separable +extension. -/ +noncomputable def completionTensorDecomposition + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) : + letI := Algebra.TensorProduct.rightAlgebra + (R := K) (A := L) (B := vK.Completion) + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + L ⊗[K] vK.Completion ≃ₐ[vK.Completion] + ∀ w : AbsoluteValueExtension vK L, w.1.Completion := by + letI := Algebra.TensorProduct.rightAlgebra + (R := K) (A := L) (B := vK.Completion) + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + exact AlgEquiv.ofBijective + (completionTensorMapCanonicalHom (K := K) (L := L) vK) + (completionTensorDecomposition_canonicalHom_bijective + (K := K) (L := L) vK hvK) + +/-- The endpoint is exactly the canonical homomorphism, not merely an +abstract algebra equivalence. -/ +theorem completionTensorDecomposition_toAlgHom + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) : + letI := Algebra.TensorProduct.rightAlgebra + (R := K) (A := L) (B := vK.Completion) + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + (completionTensorDecomposition (K := K) (L := L) vK hvK).toAlgHom = + completionTensorMapCanonicalHom vK := by + let := Algebra.TensorProduct.rightAlgebra + (R := K) (A := L) (B := vK.Completion) + let : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + rfl + +@[simp] +theorem completionTensorDecomposition_tmul_apply + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (a : L) (b : vK.Completion) + (w : AbsoluteValueExtension vK L) : + letI := Algebra.TensorProduct.rightAlgebra + (R := K) (A := L) (B := vK.Completion) + letI : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + completionTensorDecomposition (K := K) (L := L) vK hvK (a ⊗ₜ[K] b) w = + AbsoluteValue.toCompletionAlgHom (K := K) w.1 a * + algebraMap vK.Completion w.1.Completion b := by + let := Algebra.TensorProduct.rightAlgebra + (R := K) (A := L) (B := vK.Completion) + let : ∀ w : AbsoluteValueExtension vK L, + Algebra vK.Completion w.1.Completion := + fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 + change completionTensorMapCanonicalHom (K := K) (L := L) vK + (a ⊗ₜ[K] b) w = _ + exact completionTensorMap_canonicalHom_tmul_apply vK a b w + +/-- the completion tensor-product decomposition on unit groups, in the tensor-factor order used by +local scalar extension. -/ +noncomputable def localTensorUnitsEquivCompletionProduct + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) : + letI : ∀ w' : AbsoluteValueExtension vK L, + Algebra vK.Completion w'.1.Completion := + fun w' ↦ AbsoluteValue.completionAlgebra vK w'.1 w'.2 + (vK.Completion ⊗[K] L)ˣ ≃* + (∀ w' : AbsoluteValueExtension vK L, + w'.1.Completionˣ) := by + letI : ∀ w' : AbsoluteValueExtension vK L, + Algebra vK.Completion w'.1.Completion := + fun w' ↦ AbsoluteValue.completionAlgebra vK w'.1 w'.2 + exact + (Units.mapEquiv + (completionTensorDecompositionLeft + (K := K) (L := L) vK hvK).toMulEquiv).trans + MulEquiv.piUnits + +/-- Evaluation of the unit-group form of the completion tensor-product decomposition agrees with the +underlying tensor-product decomposition. -/ +@[simp] +theorem localTensorUnitsEquivCompletionProduct_apply_coe + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (z : (vK.Completion ⊗[K] L)ˣ) + (w' : AbsoluteValueExtension vK L) : + letI : ∀ u : AbsoluteValueExtension vK L, + Algebra vK.Completion u.1.Completion := + fun u ↦ AbsoluteValue.completionAlgebra vK u.1 u.2 + (((localTensorUnitsEquivCompletionProduct vK hvK z) w' : + w'.1.Completionˣ) : w'.1.Completion) = + completionTensorDecompositionLeft (K := K) (L := L) vK hvK + (z : vK.Completion ⊗[K] L) w' := + rfl + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductProductFormulas.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductProductFormulas.lean new file mode 100644 index 0000000000..cb1af866d8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductProductFormulas.lean @@ -0,0 +1,94 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.BaseChangeNormTrace +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteProductNormTrace +/-! +# Degree, norm, and trace through a tensor-product decomposition + +These are the purely linear-algebraic implications for a finite product decomposition. +They deliberately state the product terms as the components of a supplied +algebra equivalence. A tensor-product decomposition identifies those components +with the canonical images in `L_w`; no compatibility theorem is assumed +here. +-/ + +@[expose] public section + +noncomputable +section + +namespace ValuationTheory +namespace Completion + +universe u v w + +open scoped TensorProduct + +/-- Finite rank is the sum of the ranks of the factors in a finite +dependent-product decomposition after scalar extension. -/ +theorem baseChange_pi_finrank_eq_sum + {K : Type u} {A : Type v} {L : Type w} + [Field K] [Field A] [Field L] [Algebra K A] [Algebra K L] + {I : Type*} [Fintype I] + (B : I → Type*) [∀ i, Field (B i)] [∀ i, Algebra A (B i)] + [∀ i, Module.Finite A (B i)] + (e : A ⊗[K] L ≃ₐ[A] ∀ i, B i) : + Module.finrank K L = ∑ i, Module.finrank A (B i) := by + calc + Module.finrank K L = Module.finrank A (A ⊗[K] L) := + Module.finrank_baseChange.symm + _ = Module.finrank A (∀ i, B i) := e.toLinearEquiv.finrank_eq + _ = ∑ i, Module.finrank A (B i) := Module.finrank_pi_fintype A + +/-- The base-changed global norm is the product of the norms of the +components under a finite dependent-product decomposition. -/ +theorem baseChange_pi_norm_eq_prod + {K : Type u} {A : Type v} {L : Type w} + [Field K] [Field A] [Field L] [Algebra K A] [Algebra K L] + [FiniteDimensional K L] + {I : Type*} [Fintype I] + (B : I → Type*) [∀ i, Field (B i)] [∀ i, Algebra A (B i)] + [∀ i, Module.Finite A (B i)] + (e : A ⊗[K] L ≃ₐ[A] ∀ i, B i) (x : L) : + algebraMap K A (Algebra.norm K x) = + ∏ i, Algebra.norm A (e (1 ⊗ₜ[K] x) i) := by + calc + algebraMap K A (Algebra.norm K x) = + Algebra.norm A (1 ⊗ₜ[K] x) := + (algebra_norm_baseChange_tmul (A := A) x).symm + _ = Algebra.norm A (e (1 ⊗ₜ[K] x)) := + (Algebra.norm_eq_of_algEquiv e (1 ⊗ₜ[K] x)).symm + _ = ∏ i, Algebra.norm A (e (1 ⊗ₜ[K] x) i) := + algebra_norm_pi_apply B _ + +/-- The base-changed global trace is the sum of the traces of the +components under a finite dependent-product decomposition. -/ +theorem baseChange_pi_trace_eq_sum + {K : Type u} {A : Type v} {L : Type w} + [Field K] [Field A] [Field L] [Algebra K A] [Algebra K L] + [FiniteDimensional K L] + {I : Type*} [Fintype I] + (B : I → Type*) [∀ i, Field (B i)] [∀ i, Algebra A (B i)] + [∀ i, Module.Finite A (B i)] + (e : A ⊗[K] L ≃ₐ[A] ∀ i, B i) (x : L) : + algebraMap K A (Algebra.trace K L x) = + ∑ i, Algebra.trace A (B i) (e (1 ⊗ₜ[K] x) i) := by + calc + algebraMap K A (Algebra.trace K L x) = + Algebra.trace A (A ⊗[K] L) (1 ⊗ₜ[K] x) := + (algebra_trace_baseChange_tmul (A := A) x).symm + _ = Algebra.trace A (∀ i, B i) (e (1 ⊗ₜ[K] x)) := + (Algebra.trace_eq_of_algEquiv e (1 ⊗ₜ[K] x)).symm + _ = ∑ i, Algebra.trace A (B i) (e (1 ⊗ₜ[K] x) i) := + algebra_trace_pi_apply B _ + +end Completion +end ValuationTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField.lean new file mode 100644 index 0000000000..8ef1774855 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField.lean @@ -0,0 +1,29 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AdicPower +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AmbientUniformizer +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.CompleteDVRExpansion +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Compositum +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Henselian +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianFinite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianValuationExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.IntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ResidueField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationTransport + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AddVal.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AddVal.lean new file mode 100644 index 0000000000..2534b3831e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AddVal.lean @@ -0,0 +1,56 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RingTheory.DiscreteValuationRing.Basic +/-! +# Normalized additive valuations on discrete valuation rings + +This file supplies general-purpose facts about Mathlib's normalized additive +valuation on a discrete valuation ring which are independent of any chosen +valued-field presentation. +-/ + +@[expose] public section + +noncomputable +section + +universe u + +namespace IsDiscreteValuationRing + +variable {R : Type u} [CommRing R] [IsDomain R] [IsDiscreteValuationRing R] + +/-- Membership in a power of the maximal ideal is detected by the normalized +additive valuation. -/ +theorem mem_maximalIdeal_pow_iff_addVal_ge (a : R) (n : ℕ) : + a ∈ IsLocalRing.maximalIdeal R ^ n ↔ (n : ℕ∞) ≤ addVal R a := by + obtain ⟨ϖ, hϖ⟩ := exists_irreducible R + rw [hϖ.maximalIdeal_eq, Ideal.span_singleton_pow, + Ideal.mem_span_singleton, ← addVal_le_iff_dvd, hϖ.addVal_pow] + +/-- A ring automorphism of a discrete valuation ring preserves its normalized +additive valuation. -/ +@[simp] theorem addVal_ringEquiv (e : R ≃+* R) (a : R) : + addVal R (e a) = addVal R a := by + by_cases ha : a = 0 + · subst a + simp + obtain ⟨ϖ, hϖ⟩ := exists_irreducible R + obtain ⟨n, u, ha_decomp⟩ := eq_unit_mul_pow_irreducible ha hϖ + have hmapϖ : Irreducible (e ϖ) := hϖ.map e + have hmap_decomp : + e a = (Units.map e.toMonoidHom u : R) * (e ϖ) ^ n := by + rw [ha_decomp, map_mul, map_pow] + rfl + rw [addVal_def (e a) (Units.map e.toMonoidHom u) hmapϖ n hmap_decomp, + addVal_def a u hϖ n ha_decomp] + +end IsDiscreteValuationRing + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AdicPower.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AdicPower.lean new file mode 100644 index 0000000000..24df41fb82 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AdicPower.lean @@ -0,0 +1,305 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RingTheory.AdicCompletion.Functoriality + +/-! # Adic Power -/ + +@[expose] public section +namespace ValuationTheory + +/-! +# Adic completeness and positive powers of an ideal + +This file contains small generic source lemmas used to pass from completeness +for a positive power `I ^ n` back to completeness for `I`. +-/ + +noncomputable +section + +namespace DiscreteValuationField + +variable {R : Type*} [CommRing R] +variable {M : Type*} [AddCommGroup M] [Module R M] +variable {N : Type*} [AddCommGroup N] [Module R N] + +/-- Adic completeness is preserved by a linear equivalence of modules over the +same base ring and with respect to the same ideal. -/ +theorem isAdicComplete_of_linearEquiv + (I : Ideal R) (e : M ≃ₗ[R] N) [IsAdicComplete I M] : + IsAdicComplete I N := by + refine AdicCompletion.of_bijective_iff.mp ?_ + constructor + · intro x y hxy + have hpre : + e.symm x = e.symm y := by + apply (AdicCompletion.of_bijective I M).1 + apply (AdicCompletion.congr I e).injective + simpa [AdicCompletion.congr_apply, AdicCompletion.map_of] using hxy + exact e.symm.injective hpre + · intro y + obtain ⟨m, hm⟩ := + (AdicCompletion.of_bijective I M).2 + ((AdicCompletion.congr I e).symm y) + refine ⟨e m, ?_⟩ + calc + AdicCompletion.of I N (e m) = + AdicCompletion.congr I e (AdicCompletion.of I M m) := by + simp [AdicCompletion.congr_apply, AdicCompletion.map_of] + _ = AdicCompletion.congr I e + ((AdicCompletion.congr I e).symm y) := by + rw [hm] + _ = y := (AdicCompletion.congr I e).apply_symm_apply y + +/-- Membership in a power of the extended ideal is the same as membership in +the corresponding base-adic submodule after restricting scalars. -/ +theorem mem_map_algebraMap_pow_iff_mem_pow_smul_top + {S : Type*} [CommRing S] [Algebra R S] (I : Ideal R) + (n : ℕ) {x : S} : + x ∈ (I.map (algebraMap R S)) ^ n ↔ + x ∈ I ^ n • (⊤ : Submodule R S) := by + rw [Ideal.smul_top_eq_map, Ideal.map_pow] + rfl + +/-- The same scalar-restriction comparison as a submodule-membership statement. -/ +theorem mem_map_algebraMap_pow_smul_top_iff + {S : Type*} [CommRing S] [Algebra R S] (I : Ideal R) + (n : ℕ) {x : S} : + x ∈ ((I.map (algebraMap R S)) ^ n • ⊤ : Submodule S S) ↔ + x ∈ I ^ n • (⊤ : Submodule R S) := by + simpa only [smul_eq_mul, Ideal.mul_top] using + (mem_map_algebraMap_pow_iff_mem_pow_smul_top + (R := R) (S := S) I n (x := x)) + +/-- Congruence modulo powers of an extended ideal is unchanged after +restricting scalars to the base ring. -/ +theorem smodEq_map_algebraMap_pow_smul_top_iff + {S : Type*} [CommRing S] [Algebra R S] (I : Ideal R) + {x y : S} (n : ℕ) : + x ≡ y [SMOD ((I.map (algebraMap R S)) ^ n • ⊤ : Submodule S S)] ↔ + x ≡ y [SMOD (I ^ n • ⊤ : Submodule R S)] := by + rw [SModEq.sub_mem, SModEq.sub_mem] + exact mem_map_algebraMap_pow_smul_top_iff (I := I) n + +/-- Restricting scalars along an algebra map does not change precompleteness +for the ideal generated by the base ideal. -/ +theorem isPrecomplete_map_algebraMap_iff + {S : Type*} [CommRing S] [Algebra R S] (I : Ideal R) : + IsPrecomplete (I.map (algebraMap R S)) S ↔ IsPrecomplete I S := by + constructor + · intro h + refine ⟨fun f hf => ?_⟩ + have hfS : + ∀ {m n : ℕ}, m ≤ n → + f m ≡ f n + [SMOD ((I.map (algebraMap R S)) ^ m • ⊤ : Submodule S S)] := by + intro m n hmn + exact (smodEq_map_algebraMap_pow_smul_top_iff (I := I) m).mpr (hf hmn) + obtain ⟨L, hL⟩ := IsPrecomplete.prec h hfS + refine ⟨L, fun n => ?_⟩ + exact (smodEq_map_algebraMap_pow_smul_top_iff (I := I) n).mp (hL n) + · intro h + refine ⟨fun f hf => ?_⟩ + have hfR : + ∀ {m n : ℕ}, m ≤ n → + f m ≡ f n [SMOD (I ^ m • ⊤ : Submodule R S)] := by + intro m n hmn + exact (smodEq_map_algebraMap_pow_smul_top_iff (I := I) m).mp (hf hmn) + obtain ⟨L, hL⟩ := IsPrecomplete.prec h hfR + refine ⟨L, fun n => ?_⟩ + exact (smodEq_map_algebraMap_pow_smul_top_iff (I := I) n).mpr (hL n) + +/-- Restricting scalars along an algebra map does not change adic +completeness for the ideal generated by the base ideal. -/ +theorem isAdicComplete_map_algebraMap_iff + {S : Type*} [CommRing S] [Algebra R S] (I : Ideal R) : + IsAdicComplete (I.map (algebraMap R S)) S ↔ IsAdicComplete I S := by + constructor + · intro h + exact + { toIsHausdorff := IsHausdorff.map_algebraMap_iff.mp h.toIsHausdorff + toIsPrecomplete := (isPrecomplete_map_algebraMap_iff + (R := R) (S := S) I).mp h.toIsPrecomplete } + · intro h + exact + { toIsHausdorff := IsHausdorff.map_algebraMap_iff.mpr h.toIsHausdorff + toIsPrecomplete := (isPrecomplete_map_algebraMap_iff + (R := R) (S := S) I).mpr h.toIsPrecomplete } + +/-- Adic completeness is preserved by transporting the ring and ideal across a +ring equivalence. -/ +theorem isAdicComplete_map_ringEquiv + {S : Type*} [CommRing S] (I : Ideal R) (e : R ≃+* S) + [IsAdicComplete I R] : + IsAdicComplete (I.map (e : R →+* S)) S := by + let : Algebra R S := (e : R →+* S).toAlgebra + let lin : R ≃ₗ[R] S := + { toFun := e + invFun := e.symm + left_inv := fun x => e.symm_apply_apply x + right_inv := fun x => e.apply_symm_apply x + map_add' := fun x y => e.map_add x y + map_smul' := fun a x => by + change e (a * x) = e a * e x + exact e.map_mul a x } + have hS : IsAdicComplete I S := + isAdicComplete_of_linearEquiv (I := I) lin + simpa only [RingHom.algebraMap_toAlgebra] using + (isAdicComplete_map_algebraMap_iff (R := R) (S := S) I).2 hS + +/-- If a module is Hausdorff for an ideal, then it is Hausdorff for every +positive power of that ideal. -/ +theorem isHausdorff_pow_of_isHausdorff + (I : Ideal R) {n : ℕ} (hn : 0 < n) + [IsHausdorff I M] : + IsHausdorff (I ^ n) M := by + refine ⟨fun x hx => IsHausdorff.haus + (inferInstance : IsHausdorff I M) x ?_⟩ + intro k + have hle : k ≤ n * k := by + simpa using Nat.mul_le_mul_right k (Nat.succ_le_of_lt hn) + apply SModEq.mono (Submodule.pow_smul_top_le I M hle) + simpa [pow_mul] using hx k + +/-- If a module is precomplete for an ideal, then it is precomplete for every +positive power of that ideal. -/ +theorem isPrecomplete_pow_of_isPrecomplete + (I : Ideal R) {n : ℕ} (hn : 0 < n) + [IsPrecomplete I M] : + IsPrecomplete (I ^ n) M := by + refine ⟨fun f hf => ?_⟩ + have hfI : + ∀ {m k : ℕ}, m ≤ k → + f m ≡ f k [SMOD (I ^ m • ⊤ : Submodule R M)] := by + intro m k hmk + have hle : m ≤ n * m := by + simpa using Nat.mul_le_mul_right m (Nat.succ_le_of_lt hn) + apply SModEq.mono (Submodule.pow_smul_top_le I M hle) + simpa [pow_mul] using hf hmk + obtain ⟨L, hL⟩ := + IsPrecomplete.prec (I := I) (M := M) + (inferInstance : IsPrecomplete I M) hfI + refine ⟨L, fun m => ?_⟩ + have hmle : m ≤ n * m := by + simpa using Nat.mul_le_mul_right m (Nat.succ_le_of_lt hn) + have hstep : + f m ≡ f (n * m) + [SMOD ((I ^ n) ^ m • ⊤ : Submodule R M)] := + hf hmle + have hlimit : + f (n * m) ≡ L + [SMOD ((I ^ n) ^ m • ⊤ : Submodule R M)] := by + simpa [pow_mul] using hL (n * m) + exact hstep.trans hlimit + +/-- If a module is complete for an ideal, then it is complete for every +positive power of that ideal. -/ +theorem isAdicComplete_pow_of_isAdicComplete + (I : Ideal R) {n : ℕ} (hn : 0 < n) + [IsAdicComplete I M] : + IsAdicComplete (I ^ n) M where + toIsHausdorff := isHausdorff_pow_of_isHausdorff (M := M) I hn + toIsPrecomplete := isPrecomplete_pow_of_isPrecomplete (M := M) I hn + +/-- If a module is Hausdorff for a positive power of an ideal, then it is +Hausdorff for the ideal itself. -/ +theorem isHausdorff_of_isHausdorff_pow + (I : Ideal R) {n : ℕ} (_hn : 0 < n) + [IsHausdorff (I ^ n) M] : + IsHausdorff I M := by + refine ⟨fun x hx => IsHausdorff.haus + (inferInstance : IsHausdorff (I ^ n) M) x ?_⟩ + intro k + simpa [pow_mul] using hx (n * k) + +/-- If a module is precomplete for a positive power of an ideal, then it is +precomplete for the ideal itself. -/ +theorem isPrecomplete_of_isPrecomplete_pow + (I : Ideal R) {n : ℕ} (hn : 0 < n) + [IsPrecomplete (I ^ n) M] : + IsPrecomplete I M := by + refine ⟨fun f hf => ?_⟩ + have hsub : + ∀ {a b : ℕ}, a ≤ b → + f (n * a) ≡ f (n * b) + [SMOD ((I ^ n) ^ a • ⊤ : Submodule R M)] := by + intro a b hab + have hle : n * a ≤ n * b := Nat.mul_le_mul_left n hab + simpa [pow_mul] using hf hle + obtain ⟨L, hL⟩ := + IsPrecomplete.prec (I := I ^ n) (M := M) + (inferInstance : IsPrecomplete (I ^ n) M) + (f := fun k => f (n * k)) hsub + refine ⟨L, fun m => ?_⟩ + have hm : m ≤ n * m := by + simpa using Nat.mul_le_mul_right m (Nat.succ_le_of_lt hn) + have hfm : f m ≡ f (n * m) + [SMOD (I ^ m • ⊤ : Submodule R M)] := + hf hm + have htail : f (n * m) ≡ L + [SMOD (I ^ m • ⊤ : Submodule R M)] := by + apply SModEq.mono (Submodule.pow_smul_top_le I M hm) + simpa [pow_mul] using hL m + exact hfm.trans htail + +/-- If a module is complete for a positive power of an ideal, then it is +complete for the ideal itself. -/ +theorem isAdicComplete_of_isAdicComplete_pow + (I : Ideal R) {n : ℕ} (hn : 0 < n) + [IsAdicComplete (I ^ n) M] : + IsAdicComplete I M where + toIsHausdorff := isHausdorff_of_isHausdorff_pow (M := M) I hn + toIsPrecomplete := isPrecomplete_of_isPrecomplete_pow (M := M) I hn + +/-- Adic completeness is unchanged when two ideals define cofinal power +filtrations. The hypotheses `I ≤ J` and `J ^ n ≤ I`, with `n > 0`, +are the asymmetric form convenient for finite integral extensions: the +extended base ideal lies in the maximal ideal upstairs, while a positive +power of that maximal ideal lies back in the extended ideal. -/ +theorem isAdicComplete_of_le_of_pow_le + (I J : Ideal R) {n : ℕ} (hn : 0 < n) + (hIJ : I ≤ J) (hJI : J ^ n ≤ I) + [IsAdicComplete I M] : + IsAdicComplete J M := by + have hpow : ∀ k : ℕ, J ^ (n * k) • (⊤ : Submodule R M) ≤ + I ^ k • (⊤ : Submodule R M) := by + intro k + simpa only [pow_mul] using + Submodule.smul_mono (Ideal.pow_right_mono hJI k) le_rfl + refine + { toIsHausdorff := ?_ + toIsPrecomplete := ?_ } + · refine ⟨fun x hx ↦ IsHausdorff.haus + (inferInstance : IsHausdorff I M) x (fun k ↦ ?_)⟩ + exact SModEq.mono (hpow k) (hx (n * k)) + · refine ⟨fun f hf ↦ ?_⟩ + have hsubsequence : + ∀ {a b : ℕ}, a ≤ b → + f (n * a) ≡ f (n * b) + [SMOD (I ^ a • ⊤ : Submodule R M)] := by + intro a b hab + exact SModEq.mono (hpow a) (hf (Nat.mul_le_mul_left n hab)) + obtain ⟨L, hL⟩ := IsPrecomplete.prec + (inferInstance : IsPrecomplete I M) hsubsequence + refine ⟨L, fun k ↦ ?_⟩ + have hk : k ≤ n * k := by + simpa [Nat.mul_comm] using + Nat.mul_le_mul_right k (Nat.succ_le_of_lt hn) + have htail : f (n * k) ≡ L + [SMOD (J ^ k • ⊤ : Submodule R M)] := + SModEq.mono + (Submodule.smul_mono (Ideal.pow_right_mono hIJ k) le_rfl) + (hL k) + exact (hf hk).trans htail + +end DiscreteValuationField + +end + +end ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AmbientUniformizer.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AmbientUniformizer.lean new file mode 100644 index 0000000000..934b57342b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AmbientUniformizer.lean @@ -0,0 +1,306 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness +/-! +# Uniformizers detected in an ambient complete discrete valuation field + +An embedding into an ambient complete DVF can make a uniformizer easier to +recognize. For a finite separable extension, uniqueness of the extended +valuation transports that recognition back to the chosen valuation. +-/ + +@[expose] public section + +namespace ValuationTheory + +noncomputable +section + +universe u v w x y z + +namespace DiscreteValuationField +namespace ValuedExtension + +variable {K : Type u} {L : Type w} [Field K] [Field L] +variable [Algebra K L] [FiniteDimensional K L] [Algebra.IsSeparable K L] + +/-- An embedding into an ambient valued field restricts to valuation rings +whenever the chosen source valuation is equivalent to the pulled-back +ambient valuation. -/ +noncomputable def valuationSubringMapOfIsEquivComap + {M : Type y} [Field M] + {GammaL : Type x} {GammaM : Type z} + [LinearOrderedCommGroupWithZero GammaL] + [LinearOrderedCommGroupWithZero GammaM] + (vL : _root_.Valuation L GammaL) + (vM : _root_.Valuation M GammaM) + (ι : L →+* M) + (hEquiv : vL.IsEquiv (vM.comap ι)) : + vL.valuationSubring →+* vM.valuationSubring where + toFun a := + ⟨ι (a : L), by + have ha : + vL (a : L) ≤ vL 1 := + by + rw [map_one] + exact a.property + have hcomap := + (hEquiv.le_iff_le + (x := (a : L)) (y := (1 : L))).1 ha + change vM (ι (a : L)) ≤ 1 + simpa only [_root_.Valuation.comap_apply, map_one] using hcomap⟩ + map_one' := by + apply Subtype.ext + simp + map_mul' a b := by + apply Subtype.ext + simp + map_zero' := by + apply Subtype.ext + simp + map_add' a b := by + apply Subtype.ext + simp + +/-- The valuation-ring map induced by an equivalent ambient pullback acts +through the original field embedding. -/ +@[simp] +theorem valuationSubringMapOfIsEquivComap_apply + {M : Type y} [Field M] + {GammaL : Type x} {GammaM : Type z} + [LinearOrderedCommGroupWithZero GammaL] + [LinearOrderedCommGroupWithZero GammaM] + (vL : _root_.Valuation L GammaL) + (vM : _root_.Valuation M GammaM) + (ι : L →+* M) + (hEquiv : vL.IsEquiv (vM.comap ι)) + (a : vL.valuationSubring) : + ((valuationSubringMapOfIsEquivComap vL vM ι hEquiv a : + vM.valuationSubring) : M) = + ι (a : L) := + rfl + +/-- The valuation-ring map induced by an equivalent ambient pullback is a +local homomorphism. -/ +theorem valuationSubringMapOfIsEquivComap_isLocalHom + {M : Type y} [Field M] + {GammaL : Type x} {GammaM : Type z} + [LinearOrderedCommGroupWithZero GammaL] + [LinearOrderedCommGroupWithZero GammaM] + (vL : _root_.Valuation L GammaL) + (vM : _root_.Valuation M GammaM) + (ι : L →+* M) + (hEquiv : vL.IsEquiv (vM.comap ι)) : + IsLocalHom + (valuationSubringMapOfIsEquivComap vL vM ι hEquiv) := by + let f := valuationSubringMapOfIsEquivComap vL vM ι hEquiv + apply ((IsLocalRing.local_hom_TFAE f).out 2 1).mp + rintro _ ⟨a, ha, rfl⟩ + have haVal : vL (a : L) < 1 := + (_root_.Valuation.mem_maximalIdeal_iff (v := vL)).1 ha + have hlt := + (hEquiv.lt_iff_lt + (x := (a : L)) (y := (1 : L))).1 + (by + rw [map_one] + exact haVal) + exact (_root_.Valuation.mem_maximalIdeal_iff (v := vM)).2 <| by + simpa only [f, valuationSubringMapOfIsEquivComap_apply, + _root_.Valuation.comap_apply, map_one] using hlt + +/-- The induced injection from the chosen residue field into the ambient +residue field. -/ +noncomputable def residueFieldMapOfIsEquivComap + {M : Type y} [Field M] + {GammaL : Type x} {GammaM : Type z} + [LinearOrderedCommGroupWithZero GammaL] + [LinearOrderedCommGroupWithZero GammaM] + (vL : _root_.Valuation L GammaL) + (vM : _root_.Valuation M GammaM) + (ι : L →+* M) + (hEquiv : vL.IsEquiv (vM.comap ι)) : + IsLocalRing.ResidueField vL.valuationSubring →+* + IsLocalRing.ResidueField vM.valuationSubring := by + letI : + IsLocalHom + (valuationSubringMapOfIsEquivComap vL vM ι hEquiv) := + valuationSubringMapOfIsEquivComap_isLocalHom vL vM ι hEquiv + exact + IsLocalRing.ResidueField.map + (valuationSubringMapOfIsEquivComap vL vM ι hEquiv) + +/-- Reduction modulo the maximal ideal commutes with compatible +automorphisms of the source and ambient valuation rings. This is the +residue-field naturality needed when a finite valued subfield is realized +inside a larger complete discrete valuation field. -/ +theorem residueFieldMapOfIsEquivComap_mapEquiv + {M : Type y} [Field M] + {GammaL : Type x} {GammaM : Type z} + [LinearOrderedCommGroupWithZero GammaL] + [LinearOrderedCommGroupWithZero GammaM] + (vL : _root_.Valuation L GammaL) + (vM : _root_.Valuation M GammaM) + (ι : L →+* M) + (hEquiv : vL.IsEquiv (vM.comap ι)) + (σL : vL.valuationSubring ≃+* vL.valuationSubring) + (σM : vM.valuationSubring ≃+* vM.valuationSubring) + (hcompat : + ∀ a : vL.valuationSubring, + valuationSubringMapOfIsEquivComap vL vM ι hEquiv (σL a) = + σM + (valuationSubringMapOfIsEquivComap + vL vM ι hEquiv a)) + (a : IsLocalRing.ResidueField vL.valuationSubring) : + residueFieldMapOfIsEquivComap vL vM ι hEquiv + (IsLocalRing.ResidueField.mapEquiv σL a) = + IsLocalRing.ResidueField.mapEquiv σM + (residueFieldMapOfIsEquivComap vL vM ι hEquiv a) := by + let : + IsLocalHom + (valuationSubringMapOfIsEquivComap vL vM ι hEquiv) := + valuationSubringMapOfIsEquivComap_isLocalHom vL vM ι hEquiv + let : IsLocalHom σL.toRingHom := + IsLocalHom.of_surjective σL.toRingHom σL.surjective + let : IsLocalHom σM.toRingHom := + IsLocalHom.of_surjective σM.toRingHom σM.surjective + obtain ⟨b, rfl⟩ := Ideal.Quotient.mk_surjective a + change + IsLocalRing.ResidueField.map + (valuationSubringMapOfIsEquivComap vL vM ι hEquiv) + (IsLocalRing.ResidueField.map σL.toRingHom + (IsLocalRing.residue vL.valuationSubring b)) = + IsLocalRing.ResidueField.map σM.toRingHom + (IsLocalRing.ResidueField.map + (valuationSubringMapOfIsEquivComap vL vM ι hEquiv) + (IsLocalRing.residue vL.valuationSubring b)) + simp only [IsLocalRing.ResidueField.map_residue] + exact congrArg + (IsLocalRing.residue vM.valuationSubring) + (hcompat b) + +/-- Let `L / K` be finite separable with a chosen complete discrete valuation +extending the one on `K`. If a field embedding of `L` into another complete +DVF sends `π` to an ambient uniformizer, and the pulled-back ambient valuation +also extends the base valuation, then `π` is a uniformizer for the chosen +valuation on `L`. + +The proof first uses uniqueness of valuation extension to compare the chosen +valuation with the ambient comap valuation. It then pulls divisibility by the +ambient uniformizer back through the field embedding, proving that `π` +generates the chosen maximal ideal. -/ +theorem isUniformizer_of_ambient_image_isUniformizer + {M : Type y} [Field M] + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + (ambient : CompleteDVF.{y, z} M) + [base.valuation.HasExtension target.valuation] + (ι : L →+* M) + [base.valuation.HasExtension (ambient.valuation.comap ι)] + {π : L} (hπ : ambient.valuation.IsUniformizer (ι π)) : + target.valuation.IsUniformizer π := by + have hEquiv : + target.valuation.IsEquiv (ambient.valuation.comap ι) := + valuation_isEquiv_of_finite_separable base target + (ambient.valuation.comap ι) + have hπ_target_lt : target.valuation π < 1 := by + have hπ_comap_lt : + (ambient.valuation.comap ι) π < + (ambient.valuation.comap ι) 1 := by + simpa using hπ.val_lt_one + simpa using + (hEquiv.lt_iff_lt (x := π) (y := (1 : L))).2 hπ_comap_lt + let πtarget : target.valuationSubring := + ⟨π, hπ_target_lt.le⟩ + have hmaximal : + target.maximalIdeal = + Ideal.span ({πtarget} : Set target.valuationSubring) := by + apply le_antisymm + · intro a ha + have ha_target_lt : target.valuation (a : L) < 1 := + (_root_.Valuation.mem_maximalIdeal_iff + (v := target.valuation)).1 ha + have ha_ambient_lt : ambient.valuation (ι (a : L)) < 1 := by + have ha_comap_lt : + (ambient.valuation.comap ι) (a : L) < + (ambient.valuation.comap ι) 1 := + (hEquiv.lt_iff_lt (x := (a : L)) (y := (1 : L))).1 + (by simpa using ha_target_lt) + simpa using ha_comap_lt + let aambient : ambient.valuationSubring := + ⟨ι (a : L), ha_ambient_lt.le⟩ + let πambient : ambient.valuationSubring := + ⟨ι π, hπ.val_lt_one.le⟩ + have ha_ambient_maximal : + aambient ∈ ambient.maximalIdeal := + (_root_.Valuation.mem_maximalIdeal_iff + (v := ambient.valuation)).2 ha_ambient_lt + have hπambient : + ambient.valuation.IsUniformizer (πambient : M) := by + simpa [πambient] using hπ + rw [ambient.maximalIdeal_eq_span_uniformizer hπambient, + Ideal.mem_span_singleton] at ha_ambient_maximal + obtain ⟨c, hc⟩ := ha_ambient_maximal + have hc_field : + ι (a : L) = ι π * (c : M) := by + simpa [aambient, πambient] using + congrArg + (fun t : ambient.valuationSubring => (t : M)) hc + have hπ_ne : π ≠ 0 := by + intro hzero + apply hπ.ne_zero + simp [hzero] + have hc_eq : + (c : M) = ι (π⁻¹ * (a : L)) := by + apply mul_left_cancel₀ hπ.ne_zero + calc + ι π * (c : M) = ι (a : L) := hc_field.symm + _ = ι (π * (π⁻¹ * (a : L))) := by + congr 1 + rw [← mul_assoc, mul_inv_cancel₀ hπ_ne, one_mul] + _ = ι π * ι (π⁻¹ * (a : L)) := by + rw [map_mul] + have hquotient_comap : + (ambient.valuation.comap ι) (π⁻¹ * (a : L)) ≤ + (ambient.valuation.comap ι) 1 := by + have hquotient_ambient : + ambient.valuation (ι (π⁻¹ * (a : L))) ≤ 1 := by + rw [← hc_eq] + exact c.property + simpa using hquotient_ambient + have hquotient_target : + target.valuation (π⁻¹ * (a : L)) ≤ 1 := by + have hle := + (hEquiv.le_iff_le + (x := π⁻¹ * (a : L)) (y := (1 : L))).2 + hquotient_comap + simpa using hle + let quotient : target.valuationSubring := + ⟨π⁻¹ * (a : L), hquotient_target⟩ + rw [Ideal.mem_span_singleton] + refine ⟨quotient, ?_⟩ + apply Subtype.ext + change (a : L) = π * (π⁻¹ * (a : L)) + rw [← mul_assoc, mul_inv_cancel₀ hπ_ne, one_mul] + · rw [Ideal.span_le] + intro a ha + have ha_eq : a = πtarget := by + simpa using ha + subst a + exact + (_root_.Valuation.mem_maximalIdeal_iff + (v := target.valuation)).2 + (by simpa [πtarget] using hπ_target_lt) + have hπtarget : + target.valuation.IsUniformizer (πtarget : L) := + target.valuation.isUniformizer_of_maximalIdeal_eq_span hmaximal + simpa [πtarget] using hπtarget + +end ValuedExtension +end DiscreteValuationField +end +end ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Basic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Basic.lean new file mode 100644 index 0000000000..b1cd13963c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Basic.lean @@ -0,0 +1,667 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.CharP.Subring +public import Mathlib.RingTheory.LocalRing.ResidueField.Basic +public import Mathlib.RingTheory.Valuation.Discrete.Basic +public import Mathlib.RingTheory.Valuation.LocalSubring + +/-! # Basic -/ + +@[expose] public section +namespace ValuationTheory + +/-! +# Discretely valued fields + +This is the basic one-dimensional API for fields equipped with a chosen +rank-one discrete valuation. +-/ + +noncomputable +section + +universe u v + +namespace ValuationSubring + +/-- A valuation subring has the characteristic of its ambient field. -/ +instance charP {K : Type u} [Field K] (R : ValuationSubring K) (p : ℕ) [CharP K p] : + CharP R p := + CharP.subring K p R.toSubring + +end ValuationSubring + +namespace DiscreteValuationField + +/-- A field with a chosen rank-one discrete valuation. -/ +structure DVF (K : Type u) [Field K] where + /-- The ordered multiplicative value group. -/ + ValueGroup : Type v + /-- The ordered commutative group-with-zero structure on the value group. -/ + [instValueGroup : LinearOrderedCommGroupWithZero ValueGroup] + /-- The chosen valuation on the field. -/ + valuation : _root_.Valuation K ValueGroup + /-- The chosen valuation has discrete rank one. -/ + [instRankOneDiscrete : valuation.IsRankOneDiscrete] + +attribute [instance] DVF.instValueGroup DVF.instRankOneDiscrete + +namespace DVF + +variable {K : Type u} [Field K] + +/-- The valuation subring of a DVF. -/ +abbrev valuationSubring (F : DVF.{u, v} K) : Type u := + F.valuation.valuationSubring + +/-- The valuation subring of a discrete valuation field is a commutative ring. -/ +instance valuationSubring.commRing (F : DVF.{u, v} K) : + CommRing F.valuationSubring := + ValuationSubring.instCommRingSubtypeMem F.valuation.valuationSubring + +/-- The valuation subring of a discrete valuation field is local. -/ +instance valuationSubring.isLocalRing (F : DVF.{u, v} K) : + IsLocalRing F.valuationSubring := + ValuationSubring.isLocalRing F.valuation.valuationSubring + +/-- The valuation subring of a discrete valuation field is an integral domain. -/ +instance valuationSubring.isDomain (F : DVF.{u, v} K) : + IsDomain F.valuationSubring := + ValuationSubring.instIsDomainSubtypeMem F.valuation.valuationSubring + +/-- The maximal ideal of the valuation subring. -/ +abbrev maximalIdeal (F : DVF.{u, v} K) : Ideal F.valuationSubring := + IsLocalRing.maximalIdeal F.valuationSubring + +/-- The residue field of the valuation subring. -/ +abbrev residueField (F : DVF.{u, v} K) : Type u := + IsLocalRing.ResidueField F.valuationSubring + +/-- The residue ring of a discrete valuation field carries its canonical field structure. -/ +instance residueField.field (F : DVF.{u, v} K) : Field F.residueField := + IsLocalRing.ResidueField.field F.valuation.valuationSubring + +/-- The residue map of a DVF. -/ +abbrev residueMap (F : DVF.{u, v} K) : + RingHom F.valuationSubring F.residueField := + IsLocalRing.residue F.valuationSubring + +/-- The valuation subring of a DVF is a DVR. -/ +theorem valuationSubring_isDiscreteValuationRing (F : DVF.{u, v} K) : + IsDiscreteValuationRing F.valuationSubring := + Valuation.valuationSubring_isDiscreteValuationRing F.valuation + +/-- The valuation ring of a DVF is a fraction ring inside the field. -/ +theorem valuationSubring_isFractionRing (F : DVF.{u, v} K) : + IsFractionRing F.valuationSubring K := + (Valuation.valuationSubring.integers (v := F.valuation)).isFractionRing + +/-- The valuation ring of a DVF is integrally closed. -/ +theorem valuationSubring_isIntegrallyClosed (F : DVF.{u, v} K) : + IsIntegrallyClosed F.valuationSubring := by + change IsIntegrallyClosed F.valuation.valuationSubring + infer_instance + +/-- The valuation ring of a DVF is Noetherian. -/ +theorem valuationSubring_isNoetherianRing (F : DVF.{u, v} K) : + IsNoetherianRing F.valuationSubring := by + have : IsDiscreteValuationRing F.valuationSubring := + F.valuationSubring_isDiscreteValuationRing + infer_instance + +/-- Membership in the valuation subring is `v x <= 1`. -/ +theorem mem_valuationSubring_iff (F : DVF.{u, v} K) (x : K) : + x ∈ F.valuation.valuationSubring ↔ F.valuation x <= 1 := + Valuation.mem_valuationSubring_iff (v := F.valuation) x + +/-- Maximal-ideal membership is `v x < 1`. -/ +theorem mem_maximalIdeal_iff (F : DVF.{u, v} K) + (x : F.valuationSubring) : + x ∈ F.maximalIdeal ↔ F.valuation (x : K) < 1 := by + change + x ∈ IsLocalRing.maximalIdeal F.valuation.valuationSubring ↔ + (F.valuation (x : K) < 1) + exact Valuation.mem_maximalIdeal_iff (v := F.valuation) + +/-- Zero residue is equivalent to membership in the maximal ideal. -/ +theorem residue_eq_zero_iff (F : DVF.{u, v} K) + (x : F.valuationSubring) : + F.residueMap x = 0 ↔ x ∈ F.maximalIdeal := by + change + IsLocalRing.residue F.valuation.valuationSubring x = 0 ↔ + x ∈ IsLocalRing.maximalIdeal F.valuation.valuationSubring + exact IsLocalRing.residue_eq_zero_iff x + +/-- A residue class in a DVF valuation ring is nonzero exactly when its +representative is a unit of the valuation ring. -/ +theorem residue_ne_zero_iff_isUnit (F : DVF.{u, v} K) + (x : F.valuationSubring) : + F.residueMap x ≠ 0 ↔ IsUnit x := by + change IsLocalRing.residue F.valuation.valuationSubring x ≠ 0 ↔ IsUnit x + exact IsLocalRing.residue_ne_zero_iff_isUnit x + +/-- The residue map is surjective. -/ +theorem residue_surjective (F : DVF.{u, v} K) : + Function.Surjective F.residueMap := + IsLocalRing.residue_surjective (R := F.valuation.valuationSubring) + +/-- A DVF has a uniformizer in its valuation subring. -/ +theorem exists_uniformizer (F : DVF.{u, v} K) : + Exists (fun pi : F.valuationSubring => F.valuation.IsUniformizer (pi : K)) := by + change Exists + (fun pi : F.valuation.valuationSubring => F.valuation.IsUniformizer (pi : K)) + exact Valuation.exists_isUniformizer_of_isCyclic_of_nontrivial F.valuation + +/-- A uniformizer lies in the maximal ideal. -/ +theorem uniformizer_mem_maximalIdeal (F : DVF.{u, v} K) + {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) : + pi ∈ F.maximalIdeal := by + change pi ∈ IsLocalRing.maximalIdeal F.valuation.valuationSubring + exact (Valuation.mem_maximalIdeal_iff (v := F.valuation)).2 hpi.val_lt_one + +/-- A uniformizer generates the maximal ideal. -/ +theorem maximalIdeal_eq_span_uniformizer (F : DVF.{u, v} K) + {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) : + F.maximalIdeal = Ideal.span (Set.singleton pi) := by + change IsLocalRing.maximalIdeal F.valuation.valuationSubring = + Ideal.span (Set.singleton pi) + exact Valuation.IsUniformizer.is_generator (v := F.valuation) hpi + +/-- Powers of the maximal ideal are generated by powers of any chosen +uniformizer. -/ +theorem maximalIdeal_pow_eq_span_uniformizer_pow (F : DVF.{u, v} K) + {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) : + F.maximalIdeal ^ n = Ideal.span ({pi ^ n} : Set F.valuationSubring) := by + rw [F.maximalIdeal_eq_span_uniformizer hpi] + exact Ideal.span_singleton_pow pi n + +/-- Membership in a power of the maximal ideal is divisibility by the +corresponding power of a uniformizer. -/ +theorem mem_maximalIdeal_pow_iff_uniformizer_pow_dvd (F : DVF.{u, v} K) + {pi x : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) : + x ∈ F.maximalIdeal ^ n ↔ pi ^ n ∣ x := by + rw [F.maximalIdeal_pow_eq_span_uniformizer_pow hpi n, + Ideal.mem_span_singleton] + +/-- No power of a uniformizer lies one step deeper in the maximal-ideal +filtration. -/ +theorem uniformizer_pow_not_mem_maximalIdeal_pow_succ + (F : DVF.{u, v} K) + {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) : + pi ^ n ∉ F.maximalIdeal ^ (n + 1) := by + rw [F.mem_maximalIdeal_pow_iff_uniformizer_pow_dvd hpi (n + 1)] + rintro ⟨a, ha⟩ + have hpi_ne : pi ≠ 0 := by + intro hzero + exact hpi.ne_zero (by simpa using congrArg (fun x : F.valuationSubring => (x : K)) hzero) + have hpow_ne : pi ^ n ≠ 0 := pow_ne_zero n hpi_ne + have hcancel : (1 : F.valuationSubring) = pi * a := by + apply mul_left_cancel₀ hpow_ne + calc + pi ^ n * (1 : F.valuationSubring) = pi ^ n := by rw [mul_one] + _ = pi ^ (n + 1) * a := ha + _ = (pi ^ n * pi) * a := by rw [pow_succ] + _ = pi ^ n * (pi * a) := by rw [mul_assoc] + have hunit : IsUnit pi := + isUnit_iff_dvd_one.2 ⟨a, hcancel⟩ + exact hpi.not_isUnit hunit + +/-- A uniformizer belongs to the maximal ideal but not to its square. -/ +theorem uniformizer_not_mem_maximalIdeal_sq (F : DVF.{u, v} K) + {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) : + pi ∉ F.maximalIdeal ^ 2 := by + simpa using F.uniformizer_pow_not_mem_maximalIdeal_pow_succ hpi 1 + +/-- Every nonzero ideal in the valuation ring of a DVF is a power of the maximal +ideal. -/ +theorem nonzero_ideal_eq_maximalIdeal_pow (F : DVF.{u, v} K) + (I : Ideal F.valuationSubring) (hI : I ≠ ⊥) : + ∃ n : ℕ, I = F.maximalIdeal ^ n := by + obtain ⟨pi, hpi⟩ := + IsDiscreteValuationRing.exists_irreducible F.valuationSubring + obtain ⟨n, hn⟩ := + IsDiscreteValuationRing.ideal_eq_span_pow_irreducible hI hpi + refine ⟨n, ?_⟩ + rw [hn] + rw [← Ideal.span_singleton_pow] + rw [← hpi.maximalIdeal_eq] + +/-- An element of the valuation ring lying in the maximal ideal but not in its +square is a uniformizer. -/ +theorem isUniformizer_of_mem_maximalIdeal_of_not_mem_maximalIdeal_sq + (F : DVF.{u, v} K) {x : F.valuationSubring} + (hx : x ∈ F.maximalIdeal) (hx_sq : x ∉ F.maximalIdeal ^ 2) : + F.valuation.IsUniformizer (x : K) := by + have hx_ne : x ≠ 0 := by + intro hzero + exact hx_sq (by simp [hzero]) + have hspan_ne : Ideal.span ({x} : Set F.valuationSubring) ≠ ⊥ := by + intro hspan + have hx_bot : x ∈ (⊥ : Ideal F.valuationSubring) := by + rw [← hspan] + exact Ideal.mem_span_singleton_self x + exact hx_ne (by simpa using hx_bot) + rcases F.nonzero_ideal_eq_maximalIdeal_pow + (Ideal.span ({x} : Set F.valuationSubring)) hspan_ne with + ⟨n, hn⟩ + have hspan_le_max : + Ideal.span ({x} : Set F.valuationSubring) ≤ F.maximalIdeal := by + rw [Ideal.span_le] + intro y hy + have hyx : y = x := by simpa using hy + simpa [hyx] using hx + have hn_ne_zero : n ≠ 0 := by + intro hn_zero + have hone : (1 : F.valuationSubring) ∈ F.maximalIdeal := by + have htop_le : + (⊤ : Ideal F.valuationSubring) ≤ F.maximalIdeal := by + simpa [hn, hn_zero] using hspan_le_max + exact htop_le trivial + exact + (IsLocalRing.maximalIdeal.isMaximal F.valuationSubring).isPrime.one_notMem + hone + have hn_lt_two : n < 2 := by + by_contra hnot + have htwo_le : 2 ≤ n := Nat.le_of_not_lt hnot + have hx_span : x ∈ Ideal.span ({x} : Set F.valuationSubring) := + Ideal.mem_span_singleton_self x + have hx_pow : x ∈ F.maximalIdeal ^ n := by + simpa [hn] using hx_span + exact hx_sq (Ideal.pow_le_pow_right htwo_le hx_pow) + have hn_eq_one : n = 1 := by + cases n with + | zero => exact (hn_ne_zero rfl).elim + | succ n => + cases n with + | zero => rfl + | succ n => + exact + ((not_lt_of_ge + (Nat.succ_le_succ (Nat.succ_le_succ (Nat.zero_le n)))) + hn_lt_two).elim + have hmax : + F.maximalIdeal = Ideal.span ({x} : Set F.valuationSubring) := by + simpa [hn_eq_one] using hn.symm + exact Valuation.isUniformizer_of_maximalIdeal_eq_span (v := F.valuation) hmax + +/-- Multiplying a uniformizer by a valuation-ring unit does not move it into +the square of the maximal ideal. -/ +theorem uniformizer_mul_unit_not_mem_maximalIdeal_sq + (F : DVF.{u, v} K) {pi u : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) (hu : IsUnit u) : + pi * u ∉ F.maximalIdeal ^ 2 := by + intro hmem + have hmem' : u * pi ∈ F.maximalIdeal ^ 2 := by + rw [mul_comm u pi] + exact hmem + exact F.uniformizer_not_mem_maximalIdeal_sq hpi + (((F.maximalIdeal ^ 2).unit_mul_mem_iff_mem hu).1 hmem') + +/-- The maximal ideal of a DVF valuation ring is nonzero. -/ +theorem maximalIdeal_ne_bot (F : DVF.{u, v} K) : + F.maximalIdeal ≠ ⊥ := by + rcases F.exists_uniformizer with ⟨pi, hpi⟩ + intro hbot + have hmem : pi ∈ (⊥ : Ideal F.valuationSubring) := by + rw [← hbot] + exact F.uniformizer_mem_maximalIdeal hpi + have hzero_sub : pi = 0 := by + simpa using hmem + apply hpi.ne_zero + exact Subtype.ext_iff.mp hzero_sub + +/-! ### Successive quotients of powers of the maximal ideal -/ + +/-- The submodule `m^(n+1)` inside `m^n`. -/ +abbrev maximalIdealPowSuccSubmodule (F : DVF.{u, v} K) (n : ℕ) : + Submodule F.valuationSubring ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) := + Submodule.comap (Submodule.subtype (p := (F.maximalIdeal ^ n : Ideal F.valuationSubring))) + ((F.maximalIdeal ^ (n + 1) : Ideal F.valuationSubring) : + Submodule F.valuationSubring F.valuationSubring) + +/-- The additive ideal-power quotient `m^n/m^(n+1)`. -/ +def MaximalIdealPowSuccQuot (F : DVF.{u, v} K) (n : ℕ) : Type u := + ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) ⧸ + F.maximalIdealPowSuccSubmodule n + +/-- A successive maximal-ideal quotient is an additive commutative group. -/ +instance maximalIdealPowSuccQuotAddCommGroup + (F : DVF.{u, v} K) (n : ℕ) : + AddCommGroup (F.MaximalIdealPowSuccQuot n) := by + change AddCommGroup + (((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) ⧸ + F.maximalIdealPowSuccSubmodule n) + infer_instance + +/-- A successive maximal-ideal quotient is a module over the valuation subring. -/ +instance maximalIdealPowSuccQuotModule + (F : DVF.{u, v} K) (n : ℕ) : + Module F.valuationSubring (F.MaximalIdealPowSuccQuot n) := by + change Module F.valuationSubring + (((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) ⧸ + F.maximalIdealPowSuccSubmodule n) + infer_instance + +/-- Explicit access to the concrete submodule-quotient representation. -/ +def maximalIdealPowSuccQuotConcreteLinearEquiv + (F : DVF.{u, v} K) (n : ℕ) : + F.MaximalIdealPowSuccQuot n ≃ₗ[F.valuationSubring] + (((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) ⧸ + F.maximalIdealPowSuccSubmodule n) := by + change + (((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) ⧸ + F.maximalIdealPowSuccSubmodule n) ≃ₗ[F.valuationSubring] + (((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) ⧸ + F.maximalIdealPowSuccSubmodule n) + exact LinearEquiv.refl F.valuationSubring _ + +/-- The quotient map `m^n → m^n/m^(n+1)`. -/ +def maximalIdealPowSuccQuotMk (F : DVF.{u, v} K) (n : ℕ) : + ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) →ₗ[F.valuationSubring] + F.MaximalIdealPowSuccQuot n := by + change + ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) + →ₗ[F.valuationSubring] + (((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) ⧸ + F.maximalIdealPowSuccSubmodule n) + exact Submodule.mkQ (F.maximalIdealPowSuccSubmodule n) + +/-- The concrete linear equivalence sends a quotient representative to the same coset. -/ +@[simp] +theorem maximalIdealPowSuccQuotConcreteLinearEquiv_mk + (F : DVF.{u, v} K) (n : ℕ) + (a : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u)) : + F.maximalIdealPowSuccQuotConcreteLinearEquiv n + (F.maximalIdealPowSuccQuotMk n a) = + Submodule.Quotient.mk a := + rfl + +/-- The canonical map onto a successive maximal-ideal quotient is surjective. -/ +theorem maximalIdealPowSuccQuotMk_surjective + (F : DVF.{u, v} K) (n : ℕ) : + Function.Surjective (F.maximalIdealPowSuccQuotMk n) := + Submodule.mkQ_surjective (F.maximalIdealPowSuccSubmodule n) + +/-- Eliminate an ideal-power quotient class through its canonical map. -/ +protected theorem MaximalIdealPowSuccQuot.inductionOn + (F : DVF.{u, v} K) (n : ℕ) + {motive : F.MaximalIdealPowSuccQuot n → Prop} + (q : F.MaximalIdealPowSuccQuot n) + (h : ∀ a : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u), + motive (F.maximalIdealPowSuccQuotMk n a)) : + motive q := by + change motive + (show ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) ⧸ + F.maximalIdealPowSuccSubmodule n from q) + refine Submodule.Quotient.induction_on + (F.maximalIdealPowSuccSubmodule n) q ?_ + intro a + exact h a + +/-- Binary elimination through arbitrary ideal-power representatives. -/ +protected theorem MaximalIdealPowSuccQuot.inductionOn₂ + (F : DVF.{u, v} K) (n : ℕ) + {motive : F.MaximalIdealPowSuccQuot n → + F.MaximalIdealPowSuccQuot n → Prop} + (q r : F.MaximalIdealPowSuccQuot n) + (h : ∀ a b : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u), + motive (F.maximalIdealPowSuccQuotMk n a) + (F.maximalIdealPowSuccQuotMk n b)) : + motive q r := by + refine MaximalIdealPowSuccQuot.inductionOn F n + (motive := fun q' ↦ motive q' r) q ?_ + intro a + refine MaximalIdealPowSuccQuot.inductionOn F n + (motive := fun r' ↦ motive (F.maximalIdealPowSuccQuotMk n a) r') r ?_ + intro b + exact h a b + +/-- Descend a representative-level function constant modulo `m^(n+1)`. -/ +def maximalIdealPowSuccQuotLift + (F : DVF.{u, v} K) {P : Sort*} (n : ℕ) + (f : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) → P) + (h : ∀ a b, a - b ∈ F.maximalIdealPowSuccSubmodule n → + f a = f b) : + F.MaximalIdealPowSuccQuot n → P := by + change + ((((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) ⧸ + F.maximalIdealPowSuccSubmodule n) → P) + refine Quotient.lift f ?_ + intro a b hab + have hq : + (Submodule.Quotient.mk a : + ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) ⧸ + F.maximalIdealPowSuccSubmodule n) = + Submodule.Quotient.mk b := + Quotient.sound hab + exact h a b + ((Submodule.Quotient.eq (F.maximalIdealPowSuccSubmodule n)).1 hq) + +/-- A lift from the successive ideal quotient evaluates on representatives by the supplied map. -/ +@[simp] +theorem maximalIdealPowSuccQuotLift_mk + (F : DVF.{u, v} K) {P : Sort*} (n : ℕ) + (f : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) → P) + (h : ∀ a b, a - b ∈ F.maximalIdealPowSuccSubmodule n → + f a = f b) + (a : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u)) : + F.maximalIdealPowSuccQuotLift n f h + (F.maximalIdealPowSuccQuotMk n a) = f a := + rfl + +/-- Descend a linear map vanishing on `m^(n+1)` inside `m^n`. -/ +def maximalIdealPowSuccQuotLinearLift + (F : DVF.{u, v} K) {M : Type*} [AddCommGroup M] + [Module F.valuationSubring M] (n : ℕ) + (f : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) + →ₗ[F.valuationSubring] M) + (h : F.maximalIdealPowSuccSubmodule n ≤ f.ker) : + F.MaximalIdealPowSuccQuot n →ₗ[F.valuationSubring] M := by + change + (((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) ⧸ + F.maximalIdealPowSuccSubmodule n) →ₗ[F.valuationSubring] M + exact (F.maximalIdealPowSuccSubmodule n).liftQ f h + +/-- The linear lift from a successive ideal quotient has the prescribed value on representatives. -/ +@[simp] +theorem maximalIdealPowSuccQuotLinearLift_mk + (F : DVF.{u, v} K) {M : Type*} [AddCommGroup M] + [Module F.valuationSubring M] (n : ℕ) + (f : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) + →ₗ[F.valuationSubring] M) + (h : F.maximalIdealPowSuccSubmodule n ≤ f.ker) + (a : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u)) : + F.maximalIdealPowSuccQuotLinearLift n f h + (F.maximalIdealPowSuccQuotMk n a) = f a := + rfl + +/-- A successive ideal-quotient class is zero exactly when its representative +lies in the next power. -/ +theorem maximalIdealPowSuccQuotMk_eq_zero_iff (F : DVF.{u, v} K) (n : ℕ) + (a : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u)) : + F.maximalIdealPowSuccQuotMk n a = 0 ↔ + (a : F.valuationSubring) ∈ F.maximalIdeal ^ (n + 1) := by + change (Submodule.Quotient.mk a : + ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) ⧸ + F.maximalIdealPowSuccSubmodule n) = 0 ↔ _ + rw [Submodule.Quotient.mk_eq_zero] + rfl + +/-- Two successive ideal-quotient classes agree exactly when their difference +lies in the next power. -/ +@[simp] +theorem maximalIdealPowSuccQuotMk_eq_iff + (F : DVF.{u, v} K) (n : ℕ) + (a b : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u)) : + F.maximalIdealPowSuccQuotMk n a = + F.maximalIdealPowSuccQuotMk n b ↔ + a - b ∈ F.maximalIdealPowSuccSubmodule n := by + change (Submodule.Quotient.mk a : + ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) ⧸ + F.maximalIdealPowSuccSubmodule n) = + Submodule.Quotient.mk b ↔ _ + exact Submodule.Quotient.eq (F.maximalIdealPowSuccSubmodule n) + +/-- Multiplication by the corresponding uniformizer power lands in the required +maximal-ideal power. -/ +theorem mul_uniformizer_pow_mem_maximalIdeal_pow (F : DVF.{u, v} K) + {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (r : F.valuationSubring) : + r * pi ^ n ∈ F.maximalIdeal ^ n := by + rw [F.maximalIdeal_pow_eq_span_uniformizer_pow hpi n] + rw [Ideal.mem_span_singleton] + exact ⟨r, mul_comm _ _⟩ + +/-- Multiplication by `pi^n`, landing in `m^n`. -/ +def maximalIdealPowMulUniformizerPowMap (F : DVF.{u, v} K) + {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) : + F.valuationSubring →ₗ[F.valuationSubring] + ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) where + toFun r := ⟨r * pi ^ n, F.mul_uniformizer_pow_mem_maximalIdeal_pow hpi n r⟩ + map_add' r s := by + ext + simp [add_mul] + map_smul' a r := by + ext + simp [mul_assoc] + +/-- After multiplying by a uniformizer power, next-level membership is equivalent +to maximal-ideal membership. -/ +theorem mul_uniformizer_pow_mem_maximalIdeal_pow_succ_iff (F : DVF.{u, v} K) + {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) (r : F.valuationSubring) : + r * pi ^ n ∈ F.maximalIdeal ^ (n + 1) ↔ r ∈ F.maximalIdeal := by + rw [F.maximalIdeal_pow_eq_span_uniformizer_pow hpi (n + 1), + F.maximalIdeal_eq_span_uniformizer hpi] + constructor + · intro h + rcases (Ideal.mem_span_singleton.mp h) with ⟨c, hc⟩ + refine Ideal.mem_span_singleton.mpr ⟨c, ?_⟩ + have hpi_ne : pi ≠ 0 := by + intro hzero + exact hpi.ne_zero (by simpa using congrArg (fun x : F.valuationSubring => (x : K)) hzero) + have hne : pi ^ n ≠ 0 := pow_ne_zero n hpi_ne + have hcancel : r * pi ^ n = (pi * c) * pi ^ n := by + calc + r * pi ^ n = pi ^ (n + 1) * c := hc + _ = (pi * c) * pi ^ n := by + rw [pow_succ'] + ring + exact mul_right_cancel₀ hne hcancel + · intro h + rcases (Ideal.mem_span_singleton.mp h) with ⟨c, hc⟩ + refine Ideal.mem_span_singleton.mpr ⟨c, ?_⟩ + rw [hc] + rw [pow_succ'] + ring + +/-- The map `O → m^n/m^(n+1)` induced by multiplication by `pi^n`. -/ +def maximalIdealPowSuccQuotMulUniformizerPowMap (F : DVF.{u, v} K) + {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) : + F.valuationSubring →ₗ[F.valuationSubring] F.MaximalIdealPowSuccQuot n := + (F.maximalIdealPowSuccQuotMk n).comp + (F.maximalIdealPowMulUniformizerPowMap hpi n) + +/-- The kernel of multiplication by a uniformizer power is the residue-level defining submodule. -/ +theorem maximalIdealPowSuccQuotMulUniformizerPowMap_ker (F : DVF.{u, v} K) + {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) : + LinearMap.ker (F.maximalIdealPowSuccQuotMulUniformizerPowMap hpi n) = + F.maximalIdeal := by + ext r + rw [LinearMap.mem_ker] + change F.maximalIdealPowSuccQuotMk n + (F.maximalIdealPowMulUniformizerPowMap hpi n r) = 0 ↔ + r ∈ F.maximalIdeal + rw [F.maximalIdealPowSuccQuotMk_eq_zero_iff n] + change r * pi ^ n ∈ F.maximalIdeal ^ (n + 1) ↔ r ∈ F.maximalIdeal + exact F.mul_uniformizer_pow_mem_maximalIdeal_pow_succ_iff hpi n r + +/-- Multiplication by a uniformizer power surjects onto the successive ideal quotient. -/ +theorem maximalIdealPowSuccQuotMulUniformizerPowMap_surjective (F : DVF.{u, v} K) + {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) : + Function.Surjective (F.maximalIdealPowSuccQuotMulUniformizerPowMap hpi n) := by + intro x + refine MaximalIdealPowSuccQuot.inductionOn F n + (motive := fun x' ↦ + ∃ a, F.maximalIdealPowSuccQuotMulUniformizerPowMap hpi n a = x') x ?_ + intro a + have ha_span : (a : F.valuationSubring) ∈ + Ideal.span ({pi ^ n} : Set F.valuationSubring) := by + simpa [F.maximalIdeal_pow_eq_span_uniformizer_pow hpi n] using a.2 + rcases (Ideal.mem_span_singleton.mp ha_span) with ⟨r, hr⟩ + refine ⟨r, ?_⟩ + change F.maximalIdealPowSuccQuotMk n + (F.maximalIdealPowMulUniformizerPowMap hpi n r) = + F.maximalIdealPowSuccQuotMk n a + have hrep : F.maximalIdealPowMulUniformizerPowMap hpi n r = a := by + ext + simp [maximalIdealPowMulUniformizerPowMap, hr, mul_comm] + rw [hrep] + +/-- Principal-ideal scaling: multiplication by `pi^n` identifies +`O/m` linearly with `m^n/m^(n+1)`. -/ +noncomputable def residueLinearEquivMaximalIdealPowSuccQuotOfUniformizer + (F : DVF.{u, v} K) {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) : + F.residueField ≃ₗ[F.valuationSubring] F.MaximalIdealPowSuccQuot n := + (Submodule.quotEquivOfEq (F.maximalIdeal : Submodule F.valuationSubring F.valuationSubring) + (LinearMap.ker (F.maximalIdealPowSuccQuotMulUniformizerPowMap hpi n)) + (F.maximalIdealPowSuccQuotMulUniformizerPowMap_ker hpi n).symm).trans + ((F.maximalIdealPowSuccQuotMulUniformizerPowMap hpi n).quotKerEquivOfSurjective + (F.maximalIdealPowSuccQuotMulUniformizerPowMap_surjective hpi n)) + +/-- Additive form of `O/m ≃ m^n/m^(n+1)`. -/ +noncomputable def residueAddEquivMaximalIdealPowSuccQuotOfUniformizer + (F : DVF.{u, v} K) {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) : + F.residueField ≃+ F.MaximalIdealPowSuccQuot n := + (F.residueLinearEquivMaximalIdealPowSuccQuotOfUniformizer hpi n).toAddEquiv + +/-- The residue-to-graded-piece equivalence sends a residue class to its +uniformizer-scaled quotient class. -/ +@[simp] theorem residueAddEquivMaximalIdealPowSuccQuotOfUniformizer_residue + (F : DVF.{u, v} K) {pi : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) + (r : F.valuationSubring) : + F.residueAddEquivMaximalIdealPowSuccQuotOfUniformizer hpi n + (F.residueMap r) = + F.maximalIdealPowSuccQuotMulUniformizerPowMap hpi n r := by + let f := F.maximalIdealPowSuccQuotMulUniformizerPowMap hpi n + let hker : + (F.maximalIdeal : Submodule F.valuationSubring F.valuationSubring) = + LinearMap.ker f := + (F.maximalIdealPowSuccQuotMulUniformizerPowMap_ker hpi n).symm + change (Submodule.quotEquivOfEq + (F.maximalIdeal : Submodule F.valuationSubring F.valuationSubring) + (LinearMap.ker f) hker).trans + (f.quotKerEquivOfSurjective + (F.maximalIdealPowSuccQuotMulUniformizerPowMap_surjective hpi n)) + (Submodule.Quotient.mk r) = f r + rw [LinearEquiv.trans_apply] + have hquot : + Submodule.quotEquivOfEq + (F.maximalIdeal : Submodule F.valuationSubring F.valuationSubring) + (LinearMap.ker f) hker (Submodule.Quotient.mk r) = + (Submodule.Quotient.mk r : + F.valuationSubring ⧸ LinearMap.ker f) := by + exact Submodule.quotEquivOfEq_mk + (p := (F.maximalIdeal : Submodule F.valuationSubring F.valuationSubring)) + (p' := LinearMap.ker f) hker r + rw [hquot] + rw [LinearMap.quotKerEquivOfSurjective_apply_mk] + +end DVF +end DiscreteValuationField + +end + +end ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ChevalleyExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ChevalleyExtension.lean new file mode 100644 index 0000000000..3762ef4b89 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ChevalleyExtension.lean @@ -0,0 +1,1383 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationExtension +public import Mathlib.RingTheory.DedekindDomain.IntegralClosure +public import Mathlib.RingTheory.Valuation.LocalSubring +public import Mathlib.RingTheory.Valuation.Integral + +/-! # Chevalley Extension -/ + +@[expose] public section +namespace ValuationTheory + +/-! +# Chevalley's valuation extension theorem + +Mathlib has the predicate `Valuation.HasExtension` and the induced valuation +subring/residue-field API. This file proves the field-extension form of +Chevalley's valuation extension theorem from mathlib's maximal local subring +construction: a local subring of a field is dominated by a valuation subring. +-/ + +noncomputable +section + +universe u v w x y z + +namespace DiscreteValuationField +namespace Valuation + +open ValuationTheory.DiscreteValuationField.ResidueField + +variable {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] +variable {ΓK : Type w} [LinearOrderedCommGroupWithZero ΓK] + +/-- A valuation on `K` has some extension to the field extension `L / K`. + +Chevalley's extension theorem is precisely the general existence theorem for +this predicate under algebraic field-extension hypotheses. -/ +def HasSomeExtensionTo (vK : _root_.Valuation K ΓK) : Prop := + ∃ ΓL : Type v, + ∃ _ : LinearOrderedCommGroupWithZero ΓL, + ∃ vL : _root_.Valuation L ΓL, vK.HasExtension vL + +/-- If a valuation subring `B` of the extension field dominates the base +valuation ring locally, then any base-field element whose image lies in `B` +already lies in the base valuation ring. -/ +theorem mem_base_valuationSubring_of_lift_mem + (vK : _root_.Valuation K ΓK) + (B : ValuationSubring L) + (hB : ∀ x : vK.valuationSubring, algebraMap vK.valuationSubring L x ∈ B.toSubring) + (hlocal : IsLocalHom + ((algebraMap vK.valuationSubring L).codRestrict B.toSubring hB)) + {x : K} (hxB : algebraMap K L x ∈ B.toSubring) : + x ∈ vK.valuationSubring := by + let A := vK.valuationSubring + rcases A.mem_or_inv_mem x with hxA | hxinvA + · exact hxA + · by_cases hx0 : x = 0 + · simp [hx0] + let y : A := ⟨x⁻¹, hxinvA⟩ + let f : A →+* B.toSubring := + (algebraMap A L).codRestrict B.toSubring hB + let : IsLocalHom f := by + dsimp [f, A] + exact hlocal + have hfy_unit : IsUnit (f y) := by + apply IsUnit.of_mul_eq_one (⟨algebraMap K L x, hxB⟩ : B.toSubring) + ext + change (algebraMap K L) (x⁻¹) * (algebraMap K L) x = 1 + rw [← map_mul, inv_mul_cancel₀ hx0, map_one] + have hy_unit : IsUnit y := IsUnit.of_map f y hfy_unit + have hy_val : A.valuation (x⁻¹) = 1 := by + simpa [y] using (A.valuation_eq_one_iff y).1 hy_unit + have hx_val : A.valuation x = 1 := by + rw [← inv_inv x, map_inv₀, hy_val, inv_one] + exact A.mem_of_valuation_le_one x hx_val.le + +/-- Chevalley's theorem in valuation-subring form. + +For any field extension `L / K`, a valuation subring of `K` admits a dominating +valuation subring of `L`, and the original valuation subring is exactly the +pullback of the extension valuation subring along `K → L`. This is the +construction-level statement behind `chevalley_hasSomeExtensionTo`; downstream +finite-extension arguments can use the returned subring `B` before passing to +its canonical valuation. -/ +theorem exists_extension_valuationSubring + (vK : _root_.Valuation K ΓK) : + ∃ B : ValuationSubring L, + ∃ hB : ∀ x : vK.valuationSubring, + algebraMap vK.valuationSubring L x ∈ B.toSubring, + IsLocalHom + ((algebraMap vK.valuationSubring L).codRestrict B.toSubring hB) ∧ + ∀ x : K, algebraMap K L x ∈ B.toSubring ↔ + x ∈ vK.valuationSubring := by + obtain ⟨B, hB, hlocal⟩ := + IsLocalRing.exists_factor_valuationRing + (f := algebraMap vK.valuationSubring L) + refine ⟨B, hB, hlocal, ?_⟩ + intro x + constructor + · intro hxB + exact mem_base_valuationSubring_of_lift_mem vK B hB hlocal hxB + · intro hxA + have hxB : + algebraMap vK.valuationSubring L + (⟨x, hxA⟩ : vK.valuationSubring) ∈ B.toSubring := + hB ⟨x, hxA⟩ + rw [IsScalarTower.algebraMap_apply vK.valuationSubring K L] at hxB + simpa using hxB + +/-- Exact pullback of valuation subrings gives a `HasExtension` proof for the +canonical valuation attached to the target valuation subring. -/ +theorem hasExtension_valuation_of_valuationSubring_pullback + (vK : _root_.Valuation K ΓK) (B : ValuationSubring L) + (hpullback : ∀ x : K, algebraMap K L x ∈ B.toSubring ↔ + x ∈ vK.valuationSubring) : + vK.HasExtension B.valuation := by + apply _root_.Valuation.HasExtension.ofComapInteger + apply le_antisymm + · intro x hx + have hxB : algebraMap K L x ∈ B.toSubring := by + exact B.mem_of_valuation_le_one _ hx + have hxA : x ∈ vK.valuationSubring := (hpullback x).1 hxB + exact (vK.mem_integer_iff x).2 + ((vK.mem_valuationSubring_iff x).2 hxA) + · intro x hx + have hxA : x ∈ vK.valuationSubring := by + exact (vK.mem_valuationSubring_iff x).1 + ((vK.mem_integer_iff x).1 hx) + have hxB : algebraMap K L x ∈ B.toSubring := (hpullback x).2 hxA + exact (B.valuation_le_one_iff (algebraMap K L x)).2 hxB + +/-- A `HasExtension` proof for the canonical valuation attached to a valuation +subring gives exact pullback of valuation subrings. -/ +theorem valuationSubring_pullback_of_hasExtension_valuation + (vK : _root_.Valuation K ΓK) (B : ValuationSubring L) + [vK.HasExtension B.valuation] (x : K) : + algebraMap K L x ∈ B.toSubring ↔ x ∈ vK.valuationSubring := by + constructor + · intro hxB + have hx_le : B.valuation (algebraMap K L x) ≤ 1 := + (B.valuation_le_one_iff (algebraMap K L x)).2 hxB + have hxK_le : vK x ≤ 1 := + (_root_.Valuation.HasExtension.val_map_le_one_iff vK B.valuation x).1 hx_le + exact (vK.mem_valuationSubring_iff x).1 hxK_le + · intro hxK + have hxK_le : vK x ≤ 1 := + (vK.mem_valuationSubring_iff x).2 hxK + have hx_le : B.valuation (algebraMap K L x) ≤ 1 := + (_root_.Valuation.HasExtension.val_map_le_one_iff vK B.valuation x).2 hxK_le + exact (B.valuation_le_one_iff (algebraMap K L x)).1 hx_le + +/-- For the canonical valuation attached to a valuation subring of the target +field, `HasExtension` is equivalent to exact pullback of valuation subrings. -/ +theorem hasExtension_valuation_iff_valuationSubring_pullback + (vK : _root_.Valuation K ΓK) (B : ValuationSubring L) : + vK.HasExtension B.valuation ↔ + ∀ x : K, algebraMap K L x ∈ B.toSubring ↔ + x ∈ vK.valuationSubring := by + constructor + · intro hExt + let : vK.HasExtension B.valuation := hExt + exact valuationSubring_pullback_of_hasExtension_valuation vK B + · intro hpullback + exact hasExtension_valuation_of_valuationSubring_pullback vK B hpullback + +/-- Every element integral over the base valuation ring lies in any valuation +ring extending the base valuation. This is the valuation-theoretic integral +closure bridge used before specializing to complete or Henselian DVFs. -/ +theorem integralClosure_mem_valuationSubring_of_hasExtension + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] (z : integralClosure vK.valuationSubring L) : + (z : L) ∈ vL.valuationSubring := by + have hz_base : IsIntegral vK.valuationSubring (z : L) := + z.2 + have hz_target : IsIntegral vL.valuationSubring (z : L) := + IsIntegral.tower_top (A := vL.valuationSubring) hz_base + exact _root_.Valuation.Integers.mem_of_integral + (_root_.Valuation.valuationSubring.integers (v := vL)) hz_target + +/-- The actual integral closure over the base valuation ring has exact +pullback to the base field: a base-field element is integral over the base +valuation ring in the extension field exactly when it already belongs to the +base valuation ring. + +This is the construction-level input needed to turn the actual integral +closure into a valuation subring extending `vK` once the Henselian frontier +proves the valuative dichotomy for that integral closure. -/ +theorem algebraMap_mem_integralClosure_valuationSubring_iff + (vK : _root_.Valuation K ΓK) (a : K) : + algebraMap K L a ∈ (integralClosure vK.valuationSubring L).toSubring ↔ + a ∈ vK.valuationSubring := by + let A := vK.valuationSubring + constructor + · intro ha + have ha_integral_L : IsIntegral A (algebraMap K L a) := ha + have ha_integral_K : IsIntegral A a := by + let f : K →ₐ[A] L := IsScalarTower.toAlgHom A K L + exact (isIntegral_algHom_iff f (RingHom.injective _)).mp ha_integral_L + have hclosed : IsIntegrallyClosedIn A K := + (isIntegrallyClosed_iff_isIntegrallyClosedIn (R := A) (K := K)).mp + inferInstance + let : IsIntegrallyClosedIn A K := hclosed + rcases IsIntegrallyClosedIn.algebraMap_eq_of_integral + (R := A) (A := K) ha_integral_K with + ⟨b, hb⟩ + rw [← hb] + exact b.2 + · intro ha + change algebraMap A L (⟨a, ha⟩ : A) ∈ + (integralClosure A L).toSubring + exact algebraMap_mem (integralClosure A L) (⟨a, ha⟩ : A) + +/-- If the actual integral closure over the base valuation ring satisfies the +valuation-ring dichotomy inside the extension field, then it is the underlying +subring of an actual `ValuationSubring L`. + +This is not a replacement for the Henselian uniqueness theorem: the remaining +frontier is to prove the dichotomy from Henselian hypotheses. The theorem +constructs the valuation object that that proof will feed into. -/ +def integralClosureValuationSubringOfMemOrInv + (vK : _root_.Valuation K ΓK) + (hval : + ∀ z : L, + z ∈ (integralClosure vK.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure vK.valuationSubring L).toSubring) : + ValuationSubring L := + ValuationSubring.ofSubring + (integralClosure vK.valuationSubring L).toSubring hval + +/-- The Chevalley valuation ring contains every integral element or its inverse. -/ +@[simp] theorem mem_integralClosureValuationSubringOfMemOrInv + (vK : _root_.Valuation K ΓK) + (hval : + ∀ z : L, + z ∈ (integralClosure vK.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure vK.valuationSubring L).toSubring) + (z : L) : + z ∈ integralClosureValuationSubringOfMemOrInv (L := L) vK hval ↔ + z ∈ (integralClosure vK.valuationSubring L).toSubring := + ValuationSubring.mem_ofSubring _ _ z + +/-- The valuation subring built from the actual integral closure has exact +base-field pullback. -/ +theorem integralClosureValuationSubringOfMemOrInv_pullback + (vK : _root_.Valuation K ΓK) + (hval : + ∀ z : L, + z ∈ (integralClosure vK.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure vK.valuationSubring L).toSubring) + (a : K) : + algebraMap K L a ∈ + integralClosureValuationSubringOfMemOrInv (L := L) vK hval ↔ + a ∈ vK.valuationSubring := by + rw [mem_integralClosureValuationSubringOfMemOrInv] + exact algebraMap_mem_integralClosure_valuationSubring_iff (L := L) vK a + +/-- Once the actual integral closure over the base valuation ring has been +proved to be a valuation subring, its canonical valuation is an extension of +the base valuation. -/ +theorem integralClosureValuationSubringOfMemOrInv_hasExtension + (vK : _root_.Valuation K ΓK) + (hval : + ∀ z : L, + z ∈ (integralClosure vK.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure vK.valuationSubring L).toSubring) : + vK.HasExtension + (integralClosureValuationSubringOfMemOrInv (L := L) vK hval).valuation := by + exact hasExtension_valuation_of_valuationSubring_pullback vK + (integralClosureValuationSubringOfMemOrInv (L := L) vK hval) + (integralClosureValuationSubringOfMemOrInv_pullback (L := L) vK hval) + +/-- The valuation subring built from the actual integral closure is the actual +integral closure of the base valuation ring in the extension field. + +This removes the earlier packaging gap: after the Henselian frontier supplies +the valuative dichotomy for `integralClosure vK.valuationSubring L`, the +constructed valuation subring carries the canonical extension valuation and +satisfies the defining `IsIntegralClosure` equivalence, not merely equality of +underlying subrings. -/ +theorem integralClosureValuationSubringOfMemOrInv_isIntegralClosure + (vK : _root_.Valuation K ΓK) + (hval : + ∀ z : L, + z ∈ (integralClosure vK.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure vK.valuationSubring L).toSubring) : + let B := integralClosureValuationSubringOfMemOrInv (L := L) vK hval + letI : vK.HasExtension B.valuation := + integralClosureValuationSubringOfMemOrInv_hasExtension (L := L) vK hval + IsIntegralClosure B vK.valuationSubring L := by + let B := integralClosureValuationSubringOfMemOrInv (L := L) vK hval + let : vK.HasExtension B.valuation := + integralClosureValuationSubringOfMemOrInv_hasExtension (L := L) vK hval + change IsIntegralClosure B vK.valuationSubring L + refine + { algebraMap_injective := Subtype.coe_injective + isIntegral_iff := ?_ } + intro z + constructor + · intro hz + refine ⟨⟨z, ?_⟩, ?_⟩ + · exact + (mem_integralClosureValuationSubringOfMemOrInv + (L := L) vK hval z).2 hz + · rfl + · rintro ⟨y, rfl⟩ + exact + (mem_integralClosureValuationSubringOfMemOrInv + (L := L) vK hval (y : L)).1 y.2 + +/-- The integral-closure valuation subring is contained in every valuation +subring whose canonical valuation extends the base valuation. -/ +theorem integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + (hval : + ∀ z : L, + z ∈ (integralClosure vK.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure vK.valuationSubring L).toSubring) + [vK.HasExtension vL] : + integralClosureValuationSubringOfMemOrInv (L := L) vK hval ≤ + vL.valuationSubring := by + intro z hz + have hz_integral : + z ∈ (integralClosure vK.valuationSubring L).toSubring := by + exact + (mem_integralClosureValuationSubringOfMemOrInv + (L := L) vK hval z).1 hz + exact integralClosure_mem_valuationSubring_of_hasExtension + (L := L) vK vL ⟨z, hz_integral⟩ + +/-- Construction-level package for the integral-closure valuation subring: +the actual integral closure, once it satisfies the valuation-ring dichotomy, +is a valuation subring whose canonical valuation extends the base valuation. -/ +theorem exists_integralClosure_valuationSubring_of_forall_mem_or_inv + (vK : _root_.Valuation K ΓK) + (hval : + ∀ z : L, + z ∈ (integralClosure vK.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure vK.valuationSubring L).toSubring) : + ∃ B : ValuationSubring L, + B.toSubring = (integralClosure vK.valuationSubring L).toSubring ∧ + vK.HasExtension B.valuation := by + refine ⟨integralClosureValuationSubringOfMemOrInv (L := L) vK hval, + rfl, ?_⟩ + exact integralClosureValuationSubringOfMemOrInv_hasExtension (L := L) vK hval + +/-- Construction-level package for the actual integral-closure valuation +subring, including the integral-closure proof itself. The second witness is +kept explicit so downstream proofs can install it as an instance only where +they need the induced algebra structure from the base valuation ring. -/ +theorem exists_integralClosure_valuationSubring_isIntegralClosure_of_forall_mem_or_inv + (vK : _root_.Valuation K ΓK) + (hval : + ∀ z : L, + z ∈ (integralClosure vK.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure vK.valuationSubring L).toSubring) : + ∃ B : ValuationSubring L, + ∃ hExt : vK.HasExtension B.valuation, + letI : vK.HasExtension B.valuation := hExt + B.toSubring = (integralClosure vK.valuationSubring L).toSubring ∧ + IsIntegralClosure B vK.valuationSubring L := by + let B := integralClosureValuationSubringOfMemOrInv (L := L) vK hval + let hExt : vK.HasExtension B.valuation := + integralClosureValuationSubringOfMemOrInv_hasExtension (L := L) vK hval + refine ⟨B, hExt, ?_⟩ + let : vK.HasExtension B.valuation := hExt + exact ⟨rfl, integralClosureValuationSubringOfMemOrInv_isIntegralClosure + (L := L) vK hval⟩ + +/-- A valuation overring of a valuation subring is equal to it when the +corresponding localization prime is the maximal ideal of the smaller valuation +subring. This is the prime-theoretic comparison bridge used after proving +that an integral closure has a unique prime above the base maximal ideal. -/ +theorem valuationSubring_eq_of_le_of_idealOfLE_eq_maximalIdeal + (R S : ValuationSubring L) (hRS : R ≤ S) + (hcenter : + ValuationSubring.idealOfLE R S hRS = IsLocalRing.maximalIdeal R) : + S = R := by + have hcenter_self : + ValuationSubring.idealOfLE R R le_rfl = IsLocalRing.maximalIdeal R := by + change (IsLocalRing.maximalIdeal R).comap (R.inclusion R le_rfl) = + IsLocalRing.maximalIdeal R + ext x + rfl + have hle : + ValuationSubring.idealOfLE R R le_rfl ≤ + ValuationSubring.idealOfLE R S hRS := by + intro x hx + rw [hcenter_self] at hx + rw [hcenter] + exact hx + have hOfPrime : + ValuationSubring.ofPrime R (ValuationSubring.idealOfLE R S hRS) ≤ + ValuationSubring.ofPrime R (ValuationSubring.idealOfLE R R le_rfl) := + ValuationSubring.ofPrime_le_of_le (A := R) + (ValuationSubring.idealOfLE R R le_rfl) + (ValuationSubring.idealOfLE R S hRS) hle + have hSR : S ≤ R := by + intro x hx + have hx' : + x ∈ ValuationSubring.ofPrime R + (ValuationSubring.idealOfLE R S hRS) := by + rwa [ValuationSubring.ofPrime_idealOfLE R S hRS] + have hx'' := hOfPrime hx' + rwa [ValuationSubring.ofPrime_idealOfLE R R le_rfl] at hx'' + exact le_antisymm hSR hRS + +/-- Elementwise form of the center condition for a valuation overring. +The center `idealOfLE R S hRS` is the maximal ideal of `R` exactly when +membership in the maximal ideal of `S`, after the inclusion `R → S`, agrees +with membership in the maximal ideal of `R`. -/ +theorem idealOfLE_eq_maximalIdeal_of_mem_maximalIdeal_iff + (R S : ValuationSubring L) (hRS : R ≤ S) + (hmem : + ∀ x : R, + R.inclusion S hRS x ∈ IsLocalRing.maximalIdeal S ↔ + x ∈ IsLocalRing.maximalIdeal R) : + ValuationSubring.idealOfLE R S hRS = IsLocalRing.maximalIdeal R := by + ext x + change R.inclusion S hRS x ∈ IsLocalRing.maximalIdeal S ↔ + x ∈ IsLocalRing.maximalIdeal R + exact hmem x + +/-- Elementwise maximal-ideal criterion for collapse of a valuation overring. +This is the form used when the remaining Henselian argument proves equality +of centers by checking elements, rather than by manipulating `idealOfLE` +directly. -/ +theorem valuationSubring_eq_of_le_of_mem_maximalIdeal_iff + (R S : ValuationSubring L) (hRS : R ≤ S) + (hmem : + ∀ x : R, + R.inclusion S hRS x ∈ IsLocalRing.maximalIdeal S ↔ + x ∈ IsLocalRing.maximalIdeal R) : + S = R := + valuationSubring_eq_of_le_of_idealOfLE_eq_maximalIdeal R S hRS + (idealOfLE_eq_maximalIdeal_of_mem_maximalIdeal_iff R S hRS hmem) + +/-- A valuation overring of a valuation subring is equal to it as soon as the +inclusion is local. This is the local-map form of +`valuationSubring_eq_of_le_of_idealOfLE_eq_maximalIdeal`. -/ +theorem valuationSubring_eq_of_le_of_inclusion_isLocalHom + (R S : ValuationSubring L) (hRS : R ≤ S) + [IsLocalHom (R.inclusion S hRS)] : + S = R := by + refine valuationSubring_eq_of_le_of_idealOfLE_eq_maximalIdeal R S hRS ?_ + change (IsLocalRing.maximalIdeal S).comap (R.inclusion S hRS) = + IsLocalRing.maximalIdeal R + exact comap_maximalIdeal_eq + (R.inclusion S hRS) + +/-- Chevalley's intersection theorem in the form needed for valuation +extensions: an element is integral over the image of the base valuation ring +exactly when it lies in every valuation subring of the extension field +containing that image. This is the construction-level bridge from the actual +integral closure frontier to valuation-overring arguments. -/ +theorem mem_integralClosure_baseRange_iff_forall_valuationSubring + (vK : _root_.Valuation K ΓK) (z : L) : + z ∈ (integralClosure + (Subring.closure (Set.range (algebraMap vK.valuationSubring L))) L).toSubring ↔ + ∀ V : ValuationSubring L, + (∀ x : vK.valuationSubring, + algebraMap vK.valuationSubring L x ∈ V.toSubring) → + z ∈ V.toSubring := by + rw [← iInf_valuationSubring_superset + (s := Set.range (algebraMap vK.valuationSubring L))] + rw [Subring.mem_iInf] + constructor + · intro hz V hV + exact hz ⟨V, by + rintro _ ⟨x, rfl⟩ + exact hV x⟩ + · intro hz V + exact hz V.1 (fun x => V.2 (Set.mem_range_self x)) + +/-- The actual integral closure over the base valuation ring has the same +underlying subring as the integral closure over the bottom `vK`-subalgebra of +`L`, i.e. over the image of the base valuation ring. -/ +theorem integralClosure_toSubring_eq_integralClosure_botSubalgebra_toSubring + (vK : _root_.Valuation K ΓK) : + (integralClosure vK.valuationSubring L).toSubring = + (integralClosure (⊥ : Subalgebra vK.valuationSubring L) L).toSubring := by + let A := vK.valuationSubring + let B : Subalgebra A L := ⊥ + have hsurj : Function.Surjective (algebraMap A B) := by + intro y + rcases Algebra.mem_bot.mp y.2 with ⟨x, hx⟩ + exact ⟨x, Subtype.ext hx⟩ + let : Algebra.IsIntegral A B := + Algebra.isIntegral_of_surjective hsurj + ext z + change IsIntegral A z ↔ IsIntegral B z + constructor + · intro hz + exact IsIntegral.tower_top (A := B) hz + · intro hz + exact isIntegral_trans z hz + +/-- The actual integral closure over the base valuation ring agrees, as an +underlying subring of the extension field, with the integral closure over the +subring generated by the image of the base valuation ring. -/ +theorem integralClosure_toSubring_eq_integralClosure_baseRange + (vK : _root_.Valuation K ΓK) : + (integralClosure vK.valuationSubring L).toSubring = + (integralClosure + (Subring.closure (Set.range (algebraMap vK.valuationSubring L))) L).toSubring := by + have hbotIntegral : + (integralClosure (⊥ : Subalgebra vK.valuationSubring L) L).toSubring = + (integralClosure + ((⊥ : Subalgebra vK.valuationSubring L).toSubring) L).toSubring := by + ext z + change IsIntegral (⊥ : Subalgebra vK.valuationSubring L) z ↔ + IsIntegral ((⊥ : Subalgebra vK.valuationSubring L).toSubring) z + rfl + have hbot : + ((⊥ : Subalgebra vK.valuationSubring L).toSubring) = + Subring.closure (Set.range (algebraMap vK.valuationSubring L)) := by + calc + ((⊥ : Subalgebra vK.valuationSubring L).toSubring) = + (Algebra.adjoin vK.valuationSubring (∅ : Set L)).toSubring := by + rw [Algebra.adjoin_empty] + _ = Subring.closure + (Set.range (algebraMap vK.valuationSubring L) ∪ (∅ : Set L)) := by + rw [Algebra.adjoin_eq_ring_closure] + _ = Subring.closure (Set.range (algebraMap vK.valuationSubring L)) := by + rw [Set.union_empty] + rw [← hbot] + rw [← hbotIntegral] + exact integralClosure_toSubring_eq_integralClosure_botSubalgebra_toSubring (L := L) vK + +/-- Chevalley's intersection theorem for the actual integral closure over the +base valuation ring: an element is integral over the base valuation ring iff +it lies in every valuation subring of the extension field containing the base +valuation ring's image. -/ +theorem mem_integralClosure_iff_forall_valuationSubring + (vK : _root_.Valuation K ΓK) (z : L) : + z ∈ (integralClosure vK.valuationSubring L).toSubring ↔ + ∀ V : ValuationSubring L, + (∀ x : vK.valuationSubring, + algebraMap vK.valuationSubring L x ∈ V.toSubring) → + z ∈ V.toSubring := by + rw [integralClosure_toSubring_eq_integralClosure_baseRange (L := L) vK] + exact mem_integralClosure_baseRange_iff_forall_valuationSubring + (L := L) vK z + +/-- The canonical map from the actual integral closure of the base valuation +ring to any valuation ring extending the base valuation. -/ +def integralClosureToValuationSubringOfHasExtension + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] : + integralClosure vK.valuationSubring L →+* vL.valuationSubring where + toFun z := + ⟨(z : L), + integralClosure_mem_valuationSubring_of_hasExtension + (L := L) vK vL z⟩ + map_zero' := by ext; simp + map_one' := by ext; simp + map_add' z₁ z₂ := by ext; simp + map_mul' z₁ z₂ := by ext; simp + +/-- The canonical map from the integral closure to an extending valuation ring is inclusion. -/ +@[simp] theorem integralClosureToValuationSubringOfHasExtension_apply + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] + (z : integralClosure vK.valuationSubring L) : + ((integralClosureToValuationSubringOfHasExtension + (L := L) vK vL z : vL.valuationSubring) : L) = z := + rfl + +/-- The integral-closure map into an extension valuation ring is injective. -/ +theorem integralClosureToValuationSubringOfHasExtension_injective + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] : + Function.Injective + (integralClosureToValuationSubringOfHasExtension + (L := L) vK vL) := by + intro z₁ z₂ hz + apply Subtype.ext + exact congrArg (fun z : vL.valuationSubring => (z : L)) hz + +/-- If an extension valuation ring is finite over the base valuation ring, then +each of its elements is integral over the base valuation ring. -/ +theorem valuationSubring_mem_integralClosure_of_moduleFinite + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] + [Module.Finite vK.valuationSubring vL.valuationSubring] + (z : vL.valuationSubring) : + (z : L) ∈ integralClosure vK.valuationSubring L := by + have hz_ring : IsIntegral vK.valuationSubring z := + IsIntegral.of_finite vK.valuationSubring z + have hz_field : IsIntegral vK.valuationSubring + (algebraMap vL.valuationSubring L z) := + hz_ring.map + (IsScalarTower.toAlgHom vK.valuationSubring vL.valuationSubring L) + rw [mem_integralClosure_iff] + simpa using hz_field + +/-- If an extension valuation ring is integral over the base valuation ring, +then every target valuation-ring element lies in the actual integral closure. +This is the construction-level condition needed in the Henselian +finite-extension frontier. -/ +theorem valuationSubring_mem_integralClosure_of_isIntegral + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] + [Algebra.IsIntegral vK.valuationSubring vL.valuationSubring] + (z : vL.valuationSubring) : + (z : L) ∈ integralClosure vK.valuationSubring L := by + have hz_ring : IsIntegral vK.valuationSubring z := + Algebra.IsIntegral.isIntegral (R := vK.valuationSubring) z + have hz_field : IsIntegral vK.valuationSubring + (algebraMap vL.valuationSubring L z) := + hz_ring.map + (IsScalarTower.toAlgHom vK.valuationSubring vL.valuationSubring L) + rw [mem_integralClosure_iff] + simpa using hz_field + +/-- The reverse map from a module-finite extension valuation ring into the +actual integral closure. -/ +def valuationSubringToIntegralClosureOfModuleFinite + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] + [Module.Finite vK.valuationSubring vL.valuationSubring] : + vL.valuationSubring →+* integralClosure vK.valuationSubring L where + toFun z := + ⟨(z : L), + valuationSubring_mem_integralClosure_of_moduleFinite + (L := L) vK vL z⟩ + map_zero' := by ext; simp + map_one' := by ext; simp + map_add' z₁ z₂ := by ext; simp + map_mul' z₁ z₂ := by ext; simp + +/-- Under module finiteness, a valuation-ring element maps to its integral-closure class. -/ +@[simp] theorem valuationSubringToIntegralClosureOfModuleFinite_apply + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] + [Module.Finite vK.valuationSubring vL.valuationSubring] + (z : vL.valuationSubring) : + ((valuationSubringToIntegralClosureOfModuleFinite + (L := L) vK vL z : integralClosure vK.valuationSubring L) : L) = z := + rfl + +/-- Under module-finiteness, the integral closure maps onto the extension +valuation ring. -/ +theorem integralClosureToValuationSubringOfHasExtension_surjective_of_moduleFinite + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] + [Module.Finite vK.valuationSubring vL.valuationSubring] : + Function.Surjective + (integralClosureToValuationSubringOfHasExtension + (L := L) vK vL) := by + intro z + refine ⟨valuationSubringToIntegralClosureOfModuleFinite + (L := L) vK vL z, ?_⟩ + ext + rfl + +/-- Under module-finiteness, the integral-closure map into the extension +valuation ring is bijective. -/ +theorem integralClosureToValuationSubringOfHasExtension_bijective_of_moduleFinite + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] + [Module.Finite vK.valuationSubring vL.valuationSubring] : + Function.Bijective + (integralClosureToValuationSubringOfHasExtension + (L := L) vK vL) := + ⟨integralClosureToValuationSubringOfHasExtension_injective + (L := L) vK vL, + integralClosureToValuationSubringOfHasExtension_surjective_of_moduleFinite + (L := L) vK vL⟩ + +/-- A module-finite extension valuation ring is canonically equivalent to the +actual integral closure of the base valuation ring in the field extension. -/ +noncomputable def integralClosureRingEquivValuationSubringOfModuleFinite + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] + [Module.Finite vK.valuationSubring vL.valuationSubring] : + integralClosure vK.valuationSubring L ≃+* vL.valuationSubring := + RingEquiv.ofBijective + (integralClosureToValuationSubringOfHasExtension + (L := L) vK vL) + (integralClosureToValuationSubringOfHasExtension_bijective_of_moduleFinite + (L := L) vK vL) + +/-- A module-finite extension valuation ring is the actual integral closure of +the base valuation ring in the field extension. -/ +theorem valuationSubring_isIntegralClosure_of_moduleFinite + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] + [Module.Finite vK.valuationSubring vL.valuationSubring] : + IsIntegralClosure vL.valuationSubring vK.valuationSubring L := by + refine + { algebraMap_injective := Subtype.coe_injective + isIntegral_iff := ?_ } + intro z + constructor + · intro hz + refine ⟨integralClosureToValuationSubringOfHasExtension + (L := L) vK vL ⟨z, hz⟩, ?_⟩ + rfl + · rintro ⟨y, rfl⟩ + exact valuationSubring_mem_integralClosure_of_moduleFinite + (L := L) vK vL y + +/-- An extension valuation ring that is integral over the base valuation ring is +the actual integral closure of the base valuation ring in the field extension. +No finite-module certificate is introduced here; the proof is the defining +integral-closure equivalence. -/ +theorem valuationSubring_isIntegralClosure_of_isIntegral + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] + [Algebra.IsIntegral vK.valuationSubring vL.valuationSubring] : + IsIntegralClosure vL.valuationSubring vK.valuationSubring L := by + refine + { algebraMap_injective := Subtype.coe_injective + isIntegral_iff := ?_ } + intro z + constructor + · intro hz + refine ⟨integralClosureToValuationSubringOfHasExtension + (L := L) vK vL ⟨z, hz⟩, ?_⟩ + rfl + · rintro ⟨y, rfl⟩ + exact valuationSubring_mem_integralClosure_of_isIntegral + (L := L) vK vL y + +/-- Two valuation extensions of the same base valuation have the same +valuation subring once both extension valuation rings are integral over the +base valuation ring. + +This is the target-free uniqueness bridge used by the Henselian finite-level +route: after the Henselian argument proves integrality for all extension +valuation rings, no chosen target `DVF` package is needed to compare them. -/ +theorem valuationSubring_eq_of_hasExtension_of_isIntegral + {Γ₁ : Type x} {Γ₂ : Type y} + [LinearOrderedCommGroupWithZero Γ₁] + [LinearOrderedCommGroupWithZero Γ₂] + (vK : _root_.Valuation K ΓK) + (v₁ : _root_.Valuation L Γ₁) (v₂ : _root_.Valuation L Γ₂) + [vK.HasExtension v₁] [vK.HasExtension v₂] + [Algebra.IsIntegral vK.valuationSubring v₁.valuationSubring] + [Algebra.IsIntegral vK.valuationSubring v₂.valuationSubring] : + v₁.valuationSubring = v₂.valuationSubring := by + ext z + constructor + · intro hz + have hz_int : z ∈ integralClosure vK.valuationSubring L := + valuationSubring_mem_integralClosure_of_isIntegral + (L := L) vK v₁ ⟨z, hz⟩ + exact integralClosure_mem_valuationSubring_of_hasExtension + (L := L) vK v₂ ⟨z, hz_int⟩ + · intro hz + have hz_int : z ∈ integralClosure vK.valuationSubring L := + valuationSubring_mem_integralClosure_of_isIntegral + (L := L) vK v₂ ⟨z, hz⟩ + exact integralClosure_mem_valuationSubring_of_hasExtension + (L := L) vK v₁ ⟨z, hz_int⟩ + +/-- Valuation-equivalence form of +`valuationSubring_eq_of_hasExtension_of_isIntegral`. -/ +theorem valuation_isEquiv_of_hasExtension_of_isIntegral + {Γ₁ : Type x} {Γ₂ : Type y} + [LinearOrderedCommGroupWithZero Γ₁] + [LinearOrderedCommGroupWithZero Γ₂] + (vK : _root_.Valuation K ΓK) + (v₁ : _root_.Valuation L Γ₁) (v₂ : _root_.Valuation L Γ₂) + [vK.HasExtension v₁] [vK.HasExtension v₂] + [Algebra.IsIntegral vK.valuationSubring v₁.valuationSubring] + [Algebra.IsIntegral vK.valuationSubring v₂.valuationSubring] : + v₁.IsEquiv v₂ := + (_root_.Valuation.isEquiv_iff_valuationSubring v₁ v₂).2 + (valuationSubring_eq_of_hasExtension_of_isIntegral + (L := L) vK v₁ v₂) + +/-- Elementwise form of target-free integral valuation-extension uniqueness. -/ +theorem mem_valuationSubring_iff_of_hasExtension_of_isIntegral + {Γ₁ : Type x} {Γ₂ : Type y} + [LinearOrderedCommGroupWithZero Γ₁] + [LinearOrderedCommGroupWithZero Γ₂] + (vK : _root_.Valuation K ΓK) + (v₁ : _root_.Valuation L Γ₁) (v₂ : _root_.Valuation L Γ₂) + [vK.HasExtension v₁] [vK.HasExtension v₂] + [Algebra.IsIntegral vK.valuationSubring v₁.valuationSubring] + [Algebra.IsIntegral vK.valuationSubring v₂.valuationSubring] + (z : L) : + z ∈ v₁.valuationSubring ↔ z ∈ v₂.valuationSubring := by + rw [valuationSubring_eq_of_hasExtension_of_isIntegral + (L := L) vK v₁ v₂] + +/-- An integral extension valuation ring is exactly the valuation subring +constructed from the actual integral closure, once that integral closure has +the valuation-ring dichotomy. + +This is the comparison form used in finite-extension arguments: after proving +integrality of a chosen extension valuation ring, no separate equality with +the Chevalley/integral-closure construction has to be assumed. -/ +theorem valuationSubring_eq_integralClosureValuationSubringOfMemOrInv_of_isIntegral + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + (hval : + ∀ z : L, + z ∈ (integralClosure vK.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure vK.valuationSubring L).toSubring) + [vK.HasExtension vL] + [Algebra.IsIntegral vK.valuationSubring vL.valuationSubring] : + vL.valuationSubring = + integralClosureValuationSubringOfMemOrInv (L := L) vK hval := by + ext z + constructor + · intro hz + exact + (mem_integralClosureValuationSubringOfMemOrInv + (L := L) vK hval z).2 + (valuationSubring_mem_integralClosure_of_isIntegral + (L := L) vK vL ⟨z, hz⟩) + · intro hz + exact + (integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) vK vL hval) hz + +/-- If an extension valuation ring is already the actual integral closure in a +finite separable field extension over a Noetherian base valuation ring, then it +is finite over the base valuation ring. This is the generic finite-extension +input needed before specializing uniqueness of valuation extensions to +Henselian DVFs. -/ +theorem moduleFinite_valuationSubring_of_isIntegralClosure + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + [IsNoetherianRing vK.valuationSubring] + [IsIntegralClosure vL.valuationSubring vK.valuationSubring L] : + Module.Finite vK.valuationSubring vL.valuationSubring := by + let : IsFractionRing vK.valuationSubring K := + (_root_.Valuation.valuationSubring.integers (v := vK)).isFractionRing + let : IsIntegrallyClosed vK.valuationSubring := by + infer_instance + exact IsIntegralClosure.finite vK.valuationSubring K L vL.valuationSubring + +/-- Once the actual integral closure has been proved to be a valuation subring, +finite separability and Noetherianity of the base valuation ring make the +constructed integral-closure valuation ring finite over the base valuation +ring. -/ +theorem moduleFinite_integralClosureValuationSubringOfMemOrInv + (vK : _root_.Valuation K ΓK) + (hval : + ∀ z : L, + z ∈ (integralClosure vK.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure vK.valuationSubring L).toSubring) + [FiniteDimensional K L] [Algebra.IsSeparable K L] + [IsNoetherianRing vK.valuationSubring] : + let B := integralClosureValuationSubringOfMemOrInv (L := L) vK hval + letI : vK.HasExtension B.valuation := + integralClosureValuationSubringOfMemOrInv_hasExtension (L := L) vK hval + Module.Finite vK.valuationSubring B.valuation.valuationSubring := by + let B := integralClosureValuationSubringOfMemOrInv (L := L) vK hval + let : vK.HasExtension B.valuation := + integralClosureValuationSubringOfMemOrInv_hasExtension (L := L) vK hval + let : IsIntegralClosure B.valuation.valuationSubring vK.valuationSubring L := by + rw [ValuationSubring.valuationSubring_valuation B] + exact integralClosureValuationSubringOfMemOrInv_isIntegralClosure + (L := L) vK hval + exact moduleFinite_valuationSubring_of_isIntegralClosure + (L := L) vK B.valuation + +/-- For finite separable field extensions with a chosen valuation extension +over a Noetherian base valuation ring, being the integral closure is equivalent +to being finite as a module over the base valuation ring. -/ +theorem valuationSubring_isIntegralClosure_iff_moduleFinite + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] + [FiniteDimensional K L] [Algebra.IsSeparable K L] + [IsNoetherianRing vK.valuationSubring] : + IsIntegralClosure vL.valuationSubring vK.valuationSubring L ↔ + Module.Finite vK.valuationSubring vL.valuationSubring := by + constructor + · intro hIntegralClosure + let : IsIntegralClosure vL.valuationSubring vK.valuationSubring L := + hIntegralClosure + exact moduleFinite_valuationSubring_of_isIntegralClosure + (L := L) vK vL + · intro hFinite + let : Module.Finite vK.valuationSubring vL.valuationSubring := + hFinite + exact valuationSubring_isIntegralClosure_of_moduleFinite + (L := L) vK vL + +/-- For any chosen valuation extension, being the actual integral closure is +equivalent to the target valuation ring being integral over the base valuation +ring. The hard Henselian finite-extension step is therefore exactly to prove +this integrality for all extension valuations. -/ +theorem valuationSubring_isIntegralClosure_iff_isIntegral + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] : + IsIntegralClosure vL.valuationSubring vK.valuationSubring L ↔ + Algebra.IsIntegral vK.valuationSubring vL.valuationSubring := by + constructor + · intro hIntegralClosure + let : IsIntegralClosure vL.valuationSubring vK.valuationSubring L := + hIntegralClosure + exact IsIntegralClosure.isIntegral_algebra vK.valuationSubring L + · intro hIntegral + let : Algebra.IsIntegral vK.valuationSubring vL.valuationSubring := + hIntegral + exact valuationSubring_isIntegralClosure_of_isIntegral + (L := L) vK vL + +/-- Two module-finite valuation extensions of the same base valuation have the +same valuation subring. This is the finite-module uniqueness criterion that +the Henselian finite-extension theorem must eventually supply automatically. -/ +theorem valuationSubring_eq_of_hasExtension_of_moduleFinite + {Γ₁ : Type x} {Γ₂ : Type y} + [LinearOrderedCommGroupWithZero Γ₁] + [LinearOrderedCommGroupWithZero Γ₂] + (vK : _root_.Valuation K ΓK) + (v₁ : _root_.Valuation L Γ₁) (v₂ : _root_.Valuation L Γ₂) + [vK.HasExtension v₁] [vK.HasExtension v₂] + [Module.Finite vK.valuationSubring v₁.valuationSubring] + [Module.Finite vK.valuationSubring v₂.valuationSubring] : + v₁.valuationSubring = v₂.valuationSubring := by + ext z + constructor + · intro hz + have hz_int : z ∈ integralClosure vK.valuationSubring L := + valuationSubring_mem_integralClosure_of_moduleFinite + (L := L) vK v₁ ⟨z, hz⟩ + exact integralClosure_mem_valuationSubring_of_hasExtension + (L := L) vK v₂ ⟨z, hz_int⟩ + · intro hz + have hz_int : z ∈ integralClosure vK.valuationSubring L := + valuationSubring_mem_integralClosure_of_moduleFinite + (L := L) vK v₂ ⟨z, hz⟩ + exact integralClosure_mem_valuationSubring_of_hasExtension + (L := L) vK v₁ ⟨z, hz_int⟩ + +/-- Valuation-equivalence form of the module-finite uniqueness criterion. -/ +theorem valuation_isEquiv_of_hasExtension_of_moduleFinite + {Γ₁ : Type x} {Γ₂ : Type y} + [LinearOrderedCommGroupWithZero Γ₁] + [LinearOrderedCommGroupWithZero Γ₂] + (vK : _root_.Valuation K ΓK) + (v₁ : _root_.Valuation L Γ₁) (v₂ : _root_.Valuation L Γ₂) + [vK.HasExtension v₁] [vK.HasExtension v₂] + [Module.Finite vK.valuationSubring v₁.valuationSubring] + [Module.Finite vK.valuationSubring v₂.valuationSubring] : + v₁.IsEquiv v₂ := + (_root_.Valuation.isEquiv_iff_valuationSubring v₁ v₂).2 + (valuationSubring_eq_of_hasExtension_of_moduleFinite + (L := L) vK v₁ v₂) + +/-- Elementwise form of module-finite valuation-extension uniqueness. -/ +theorem mem_valuationSubring_iff_of_hasExtension_of_moduleFinite + {Γ₁ : Type x} {Γ₂ : Type y} + [LinearOrderedCommGroupWithZero Γ₁] + [LinearOrderedCommGroupWithZero Γ₂] + (vK : _root_.Valuation K ΓK) + (v₁ : _root_.Valuation L Γ₁) (v₂ : _root_.Valuation L Γ₂) + [vK.HasExtension v₁] [vK.HasExtension v₂] + [Module.Finite vK.valuationSubring v₁.valuationSubring] + [Module.Finite vK.valuationSubring v₂.valuationSubring] + (z : L) : + z ∈ v₁.valuationSubring ↔ z ∈ v₂.valuationSubring := by + rw [valuationSubring_eq_of_hasExtension_of_moduleFinite + (L := L) vK v₁ v₂] + +/-- Chevalley's theorem in construction form, keeping the dominating valuation +subring and the `HasExtension` proof attached to its canonical valuation. -/ +theorem exists_extension_valuationSubring_with_hasExtension + (vK : _root_.Valuation K ΓK) : + ∃ B : ValuationSubring L, + ∃ hB : ∀ x : vK.valuationSubring, + algebraMap vK.valuationSubring L x ∈ B.toSubring, + IsLocalHom + ((algebraMap vK.valuationSubring L).codRestrict B.toSubring hB) ∧ + (∀ x : K, algebraMap K L x ∈ B.toSubring ↔ + x ∈ vK.valuationSubring) ∧ + vK.HasExtension B.valuation := by + obtain ⟨B, hB, hlocal, hpullback⟩ := + exists_extension_valuationSubring (L := L) vK + refine ⟨B, hB, hlocal, hpullback, ?_⟩ + exact hasExtension_valuation_of_valuationSubring_pullback vK B hpullback + +/-- Chevalley's theorem as an actual valuation extension with exact pullback +of the extension valuation ring. This is the valuation-level form of +`exists_extension_valuationSubring_with_hasExtension`, not just the existential +predicate `HasSomeExtensionTo`. -/ +theorem chevalley_exists_extension_valuation_with_pullback + (vK : _root_.Valuation K ΓK) : + ∃ ΓL : Type v, + ∃ _ : LinearOrderedCommGroupWithZero ΓL, + ∃ vL : _root_.Valuation L ΓL, + ∃ _ : vK.HasExtension vL, + ∀ x : K, algebraMap K L x ∈ vL.valuationSubring ↔ + x ∈ vK.valuationSubring := by + obtain ⟨B, _hB, _hlocal, hpullback, hExt⟩ := + exists_extension_valuationSubring_with_hasExtension (L := L) vK + refine ⟨B.ValueGroup, inferInstance, B.valuation, hExt, ?_⟩ + intro x + simpa [ValuationSubring.valuationSubring_valuation] using hpullback x + +/-- Chevalley's construction can be chosen with the integral-closure dominance +made explicit: the produced extension valuation ring contains the actual +integral closure of the base valuation ring in the extension field. -/ +theorem exists_extension_valuationSubring_with_integralClosure + (vK : _root_.Valuation K ΓK) : + ∃ B : ValuationSubring L, + ∃ hB : ∀ x : vK.valuationSubring, + algebraMap vK.valuationSubring L x ∈ B.toSubring, + IsLocalHom + ((algebraMap vK.valuationSubring L).codRestrict B.toSubring hB) ∧ + (∀ x : K, algebraMap K L x ∈ B.toSubring ↔ + x ∈ vK.valuationSubring) ∧ + vK.HasExtension B.valuation ∧ + (∀ z : integralClosure vK.valuationSubring L, + (z : L) ∈ B.toSubring) := by + obtain ⟨B, hB, hlocal, hpullback, hExt⟩ := + exists_extension_valuationSubring_with_hasExtension (L := L) vK + let : vK.HasExtension B.valuation := hExt + refine ⟨B, hB, hlocal, hpullback, hExt, ?_⟩ + intro z + have hz : (z : L) ∈ B.valuation.valuationSubring := + integralClosure_mem_valuationSubring_of_hasExtension + (L := L) vK B.valuation z + simpa [ValuationSubring.valuationSubring_valuation] using hz + +/-- Chevalley's valuation extension can be chosen with both exact pullback of +the valuation ring and containment of the actual integral closure of the base +valuation ring. -/ +theorem chevalley_exists_extension_valuation_with_pullback_integralClosure + (vK : _root_.Valuation K ΓK) : + ∃ ΓL : Type v, + ∃ _ : LinearOrderedCommGroupWithZero ΓL, + ∃ vL : _root_.Valuation L ΓL, + ∃ _ : vK.HasExtension vL, + (∀ x : K, algebraMap K L x ∈ vL.valuationSubring ↔ + x ∈ vK.valuationSubring) ∧ + (∀ z : integralClosure vK.valuationSubring L, + (z : L) ∈ vL.valuationSubring) := by + obtain ⟨B, _hB, _hlocal, hpullback, hExt, hIntegral⟩ := + exists_extension_valuationSubring_with_integralClosure (L := L) vK + refine ⟨B.ValueGroup, inferInstance, B.valuation, hExt, ?_⟩ + constructor + · intro x + simpa [ValuationSubring.valuationSubring_valuation] using hpullback x + · intro z + simpa [ValuationSubring.valuationSubring_valuation] using hIntegral z + +/-- Chevalley's valuation extension with all construction-level data attached +to the same witness: exact valuation-ring pullback, integral-closure +containment, lies-over for maximal ideals, local valuation-ring map, and +injective residue-field map. -/ +theorem chevalley_exists_extension_valuation_with_pullback_integralClosure_local_data + (vK : _root_.Valuation K ΓK) : + ∃ ΓL : Type v, + ∃ _ : LinearOrderedCommGroupWithZero ΓL, + ∃ vL : _root_.Valuation L ΓL, + ∃ _ : vK.HasExtension vL, + (∀ x : K, algebraMap K L x ∈ vL.valuationSubring ↔ + x ∈ vK.valuationSubring) ∧ + (∀ z : integralClosure vK.valuationSubring L, + (z : L) ∈ vL.valuationSubring) ∧ + (IsLocalRing.maximalIdeal vL.valuationSubring).LiesOver + (IsLocalRing.maximalIdeal vK.valuationSubring) ∧ + IsLocalHom + (algebraMap vK.valuationSubring vL.valuationSubring) ∧ + Function.Injective + (IsLocalRing.ResidueField.map + (algebraMap vK.valuationSubring vL.valuationSubring)) := by + obtain ⟨ΓL, hΓL, vL, hExt, hpullback, hIntegral⟩ := + chevalley_exists_extension_valuation_with_pullback_integralClosure + (L := L) vK + let : LinearOrderedCommGroupWithZero ΓL := hΓL + let : vK.HasExtension vL := hExt + refine ⟨ΓL, inferInstance, vL, inferInstance, hpullback, hIntegral, ?_⟩ + exact ⟨inferInstance, inferInstance, + map_algebraMap_injective + (R := vK.valuationSubring) (S := vL.valuationSubring)⟩ + +/-- Chevalley's valuation extension theorem: every valuation on a field extends +to any field extension. The extended value group is the canonical value group +of a valuation subring of the extension field supplied by mathlib's maximal +local subring theorem. -/ +theorem chevalley_hasSomeExtensionTo + (vK : _root_.Valuation K ΓK) : + HasSomeExtensionTo (L := L) vK := by + obtain ⟨B, _hB, _hlocal, _hpullback, hExt⟩ := + exists_extension_valuationSubring_with_hasExtension (L := L) vK + exact ⟨B.ValueGroup, inferInstance, B.valuation, hExt⟩ + +/-- A specified valuation extension supplies existence of some extension to the target field. -/ +theorem hasSomeExtensionTo_of_hasExtension + {ΓL : Type v} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] : + HasSomeExtensionTo (L := L) vK := + ⟨ΓL, inferInstance, vL, inferInstance⟩ + +/-- The target valuation subring lies over the source valuation subring. -/ +theorem valuationSubring_liesOver_of_hasExtension + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] : + (IsLocalRing.maximalIdeal vL.valuationSubring).LiesOver + (IsLocalRing.maximalIdeal vK.valuationSubring) := + inferInstance + +/-- The integer map induced by a valuation extension is a local ring homomorphism. -/ +theorem integerMap_isLocalHom_of_hasExtension + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] : + IsLocalHom (algebraMap vK.valuationSubring vL.valuationSubring) := + inferInstance + +/-- The valuation-subring algebra maps are compatible with the ambient field +algebra map for any chosen valuation extension. -/ +theorem valuationSubring_isScalarTower_of_hasExtension + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] : + IsScalarTower vK.valuationSubring vL.valuationSubring L := by + refine ⟨?_⟩ + intro a b z + simp only [Algebra.smul_def] + have hmap : + (algebraMap vL.valuationSubring L) + ((algebraMap vK.valuationSubring vL.valuationSubring) a) = + (algebraMap vK.valuationSubring L) a := by + rfl + rw [map_mul, hmap, mul_assoc] + +/-- The residue-field map attached to any valuation extension is injective. -/ +theorem residueMap_injective_of_hasExtension + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] : + Function.Injective + (IsLocalRing.ResidueField.map + (algebraMap vK.valuationSubring vL.valuationSubring)) := by + exact map_algebraMap_injective + (R := vK.valuationSubring) (S := vL.valuationSubring) + +/-- The residue-field map attached to a valuation extension has trivial +kernel. -/ +theorem residueMap_eq_zero_iff_of_hasExtension + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] + (z : IsLocalRing.ResidueField vK.valuationSubring) : + IsLocalRing.ResidueField.map + (algebraMap vK.valuationSubring vL.valuationSubring) z = 0 ↔ + z = 0 := + map_algebraMap_eq_zero_iff + (R := vK.valuationSubring) (S := vL.valuationSubring) z + +/-- Equality of base residue classes can be checked after applying the +residue-field map attached to a valuation extension. -/ +theorem residueMap_eq_iff_of_hasExtension + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] + (z₁ z₂ : IsLocalRing.ResidueField vK.valuationSubring) : + IsLocalRing.ResidueField.map + (algebraMap vK.valuationSubring vL.valuationSubring) z₁ = + IsLocalRing.ResidueField.map + (algebraMap vK.valuationSubring vL.valuationSubring) z₂ ↔ + z₁ = z₂ := + map_eq_map_iff + (algebraMap vK.valuationSubring vL.valuationSubring) z₁ z₂ + +/-- Equality between the mapped residue of a base valuation-ring element and a +target valuation-ring residue representative is congruence modulo the target +maximal ideal. -/ +theorem residueMap_residue_eq_residue_iff_sub_mem_maximalIdeal_of_hasExtension + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] + (a : vK.valuationSubring) (b : vL.valuationSubring) : + IsLocalRing.ResidueField.map + (algebraMap vK.valuationSubring vL.valuationSubring) + (IsLocalRing.residue vK.valuationSubring a) = + IsLocalRing.residue vL.valuationSubring b ↔ + algebraMap vK.valuationSubring vL.valuationSubring a - b ∈ + IsLocalRing.maximalIdeal vL.valuationSubring := + map_residue_eq_residue_iff_sub_mem_maximalIdeal + (algebraMap vK.valuationSubring vL.valuationSubring) a b + +/-- Opposite-orientation congruence criterion for the residue-field map +attached to a valuation extension. -/ +theorem residue_eq_residueMap_residue_iff_sub_mem_maximalIdeal_of_hasExtension + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] + (b : vL.valuationSubring) (a : vK.valuationSubring) : + IsLocalRing.residue vL.valuationSubring b = + IsLocalRing.ResidueField.map + (algebraMap vK.valuationSubring vL.valuationSubring) + (IsLocalRing.residue vK.valuationSubring a) ↔ + b - algebraMap vK.valuationSubring vL.valuationSubring a ∈ + IsLocalRing.maximalIdeal vL.valuationSubring := + residue_eq_map_residue_iff_sub_mem_maximalIdeal + (algebraMap vK.valuationSubring vL.valuationSubring) b a + +/-- The target residue of a mapped base valuation-ring element is zero exactly +when the base element lies in the base maximal ideal. -/ +theorem residue_algebraMap_eq_zero_iff_of_hasExtension + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] + (a : vK.valuationSubring) : + IsLocalRing.residue vL.valuationSubring + (algebraMap vK.valuationSubring vL.valuationSubring a) = 0 ↔ + a ∈ IsLocalRing.maximalIdeal vK.valuationSubring := by + rw [residue_algebraMap_eq_zero_iff + (R := vK.valuationSubring) (S := vL.valuationSubring) a, + IsLocalRing.residue_eq_zero_iff] + +/-- Equality of target residues of two mapped base valuation-ring elements is +equality of the corresponding base residues. -/ +theorem residue_algebraMap_eq_iff_of_hasExtension + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (vK : _root_.Valuation K ΓK) (vL : _root_.Valuation L ΓL) + [vK.HasExtension vL] + (a b : vK.valuationSubring) : + IsLocalRing.residue vL.valuationSubring + (algebraMap vK.valuationSubring vL.valuationSubring a) = + IsLocalRing.residue vL.valuationSubring + (algebraMap vK.valuationSubring vL.valuationSubring b) ↔ + IsLocalRing.residue vK.valuationSubring a = + IsLocalRing.residue vK.valuationSubring b := + residue_algebraMap_eq_iff + (R := vK.valuationSubring) (S := vL.valuationSubring) a b + +section Tower + +variable {M : Type y} [Field M] +variable [Algebra L M] [Algebra K M] [IsScalarTower K L M] +variable {ΓL : Type x} {ΓM : Type z} +variable [LinearOrderedCommGroupWithZero ΓL] +variable [LinearOrderedCommGroupWithZero ΓM] + +/-- Valuation extension is transitive in a field tower. -/ +theorem hasExtension_trans + (vK : _root_.Valuation K ΓK) + (vL : _root_.Valuation L ΓL) + (vM : _root_.Valuation M ΓM) + [vK.HasExtension vL] [vL.HasExtension vM] : + vK.HasExtension vM := by + apply _root_.Valuation.HasExtension.ofComapInteger + ext a + simp only [Subring.mem_comap] + rw [vM.mem_integer_iff, vK.mem_integer_iff] + rw [IsScalarTower.algebraMap_apply K L M a] + exact + (_root_.Valuation.HasExtension.val_map_le_one_iff + (vR := vL) (vA := vM) (algebraMap K L a)).trans + (_root_.Valuation.HasExtension.val_map_le_one_iff + (vR := vK) (vA := vL) a) + +/-- In a tower of valuation extensions, the top valuation ring lies over the +bottom valuation ring. -/ +theorem valuationSubring_liesOver_tower_of_hasExtension + (vK : _root_.Valuation K ΓK) + (vL : _root_.Valuation L ΓL) + (vM : _root_.Valuation M ΓM) + [vK.HasExtension vL] [vL.HasExtension vM] : + letI : vK.HasExtension vM := hasExtension_trans vK vL vM + (IsLocalRing.maximalIdeal vM.valuationSubring).LiesOver + (IsLocalRing.maximalIdeal vK.valuationSubring) := by + let : vK.HasExtension vM := hasExtension_trans vK vL vM + exact valuationSubring_liesOver_of_hasExtension vK vM + +/-- The valuation-ring algebra maps in a tower agree with the direct +valuation-ring algebra map. The direct `HasExtension` instance can be supplied +by `hasExtension_trans`. -/ +theorem integerMap_comp_of_hasExtension_tower + (vK : _root_.Valuation K ΓK) + (vL : _root_.Valuation L ΓL) + (vM : _root_.Valuation M ΓM) + [vK.HasExtension vL] [vL.HasExtension vM] [vK.HasExtension vM] : + (algebraMap vL.valuationSubring vM.valuationSubring).comp + (algebraMap vK.valuationSubring vL.valuationSubring) = + algebraMap vK.valuationSubring vM.valuationSubring := by + ext a + change algebraMap L M (algebraMap K L (a : K)) = + algebraMap K M (a : K) + exact (IsScalarTower.algebraMap_apply K L M (a : K)).symm + +/-- Residue-field maps in a tower compose to the direct residue-field map. The +direct `HasExtension` instance can be supplied by `hasExtension_trans`. -/ +theorem residueMap_comp_of_hasExtension_tower + (vK : _root_.Valuation K ΓK) + (vL : _root_.Valuation L ΓL) + (vM : _root_.Valuation M ΓM) + [vK.HasExtension vL] [vL.HasExtension vM] [vK.HasExtension vM] : + (IsLocalRing.ResidueField.map + (algebraMap vL.valuationSubring vM.valuationSubring)).comp + (IsLocalRing.ResidueField.map + (algebraMap vK.valuationSubring vL.valuationSubring)) = + IsLocalRing.ResidueField.map + (algebraMap vK.valuationSubring vM.valuationSubring) := by + apply Ideal.Quotient.ringHom_ext + apply RingHom.ext + intro a + change IsLocalRing.residue vM.valuationSubring + ((algebraMap vL.valuationSubring vM.valuationSubring) + ((algebraMap vK.valuationSubring vL.valuationSubring) a)) = + IsLocalRing.residue vM.valuationSubring + ((algebraMap vK.valuationSubring vM.valuationSubring) a) + exact congrArg (IsLocalRing.residue vM.valuationSubring) + (congrArg (fun f : vK.valuationSubring →+* vM.valuationSubring => f a) + (integerMap_comp_of_hasExtension_tower vK vL vM)) + +/-- Elementwise form of `residueMap_comp_of_hasExtension_tower`. -/ +theorem residueMap_tower_apply_of_hasExtension + (vK : _root_.Valuation K ΓK) + (vL : _root_.Valuation L ΓL) + (vM : _root_.Valuation M ΓM) + [vK.HasExtension vL] [vL.HasExtension vM] [vK.HasExtension vM] + (x : IsLocalRing.ResidueField vK.valuationSubring) : + IsLocalRing.ResidueField.map + (algebraMap vL.valuationSubring vM.valuationSubring) + (IsLocalRing.ResidueField.map + (algebraMap vK.valuationSubring vL.valuationSubring) x) = + IsLocalRing.ResidueField.map + (algebraMap vK.valuationSubring vM.valuationSubring) x := by + exact DFunLike.congr_fun + (residueMap_comp_of_hasExtension_tower vK vL vM) x + +end Tower + +/-- Chevalley's extension theorem with the local valuation-ring data needed by +finite-extension and residue-field arguments: the chosen extension has a +valuation-ring map whose target maximal ideal lies over the base maximal ideal, +is local, and induces an injective residue-field map. -/ +theorem chevalley_exists_extension_with_local_data + (vK : _root_.Valuation K ΓK) : + ∃ ΓL : Type v, + ∃ _ : LinearOrderedCommGroupWithZero ΓL, + ∃ vL : _root_.Valuation L ΓL, + ∃ _ : vK.HasExtension vL, + (IsLocalRing.maximalIdeal vL.valuationSubring).LiesOver + (IsLocalRing.maximalIdeal vK.valuationSubring) ∧ + IsLocalHom + (algebraMap vK.valuationSubring vL.valuationSubring) ∧ + Function.Injective + (IsLocalRing.ResidueField.map + (algebraMap vK.valuationSubring vL.valuationSubring)) := by + obtain ⟨ΓL, hΓL, vL, hExt⟩ := chevalley_hasSomeExtensionTo (L := L) vK + let : LinearOrderedCommGroupWithZero ΓL := hΓL + let : vK.HasExtension vL := hExt + refine ⟨ΓL, inferInstance, vL, inferInstance, ?_⟩ + exact ⟨valuationSubring_liesOver_of_hasExtension vK vL, + integerMap_isLocalHom_of_hasExtension vK vL, + residueMap_injective_of_hasExtension vK vL⟩ + +end Valuation +end DiscreteValuationField + +end + +end ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Complete.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Complete.lean new file mode 100644 index 0000000000..374ad0f410 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Complete.lean @@ -0,0 +1,393 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Henselian +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AdicPower +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationTransport + +/-! # Complete -/ + +@[expose] public section +namespace ValuationTheory + +/-! +# Complete discretely valued fields +-/ + +noncomputable +section + +universe u v w + +namespace DiscreteValuationField + +namespace Valuation + +variable {K : Type u} [Field K] +variable {Gamma : Type v} [LinearOrderedCommGroupWithZero Gamma] + +/-- A complete discrete valuation. -/ +class IsCompleteDiscrete (val : _root_.Valuation K Gamma) : Prop where + /-- A complete discrete valuation has discrete rank one. -/ + [isRankOneDiscrete : val.IsRankOneDiscrete] + /-- The valuation ring is complete for its maximal-ideal adic topology. -/ + isAdicComplete : + IsAdicComplete (IsLocalRing.maximalIdeal val.valuationSubring) val.valuationSubring + +attribute [instance] IsCompleteDiscrete.isRankOneDiscrete + +/-- Completeness of the valued field implies adic completeness of its valuation subring. -/ +theorem isAdicComplete (val : _root_.Valuation K Gamma) [IsCompleteDiscrete val] : + IsAdicComplete (IsLocalRing.maximalIdeal val.valuationSubring) val.valuationSubring := + IsCompleteDiscrete.isAdicComplete (val := val) + +/-- Pulling a complete discrete valuation back along a field equivalence +preserves both rank-one discreteness and adic completeness. -/ +instance isCompleteDiscrete_comap_ringEquiv + {L : Type w} [Field L] + (val : _root_.Valuation K Gamma) [IsCompleteDiscrete val] (e : L ≃+* K) : + IsCompleteDiscrete (val.comap (e : L →+* K)) where + isRankOneDiscrete := isRankOneDiscrete_comap_ringEquiv val e + isAdicComplete := by + let r := valuationSubringRingEquivOfComap val e + have hmap : + (IsLocalRing.maximalIdeal val.valuationSubring).map + (r.symm : val.valuationSubring →+* + (val.comap (e : L →+* K)).valuationSubring) = + IsLocalRing.maximalIdeal + (val.comap (e : L →+* K)).valuationSubring := by + calc + (IsLocalRing.maximalIdeal val.valuationSubring).map + (r.symm : val.valuationSubring →+* + (val.comap (e : L →+* K)).valuationSubring) = + (IsLocalRing.maximalIdeal val.valuationSubring).comap + (r : (val.comap (e : L →+* K)).valuationSubring →+* + val.valuationSubring) := Ideal.map_symm r + _ = IsLocalRing.maximalIdeal + (val.comap (e : L →+* K)).valuationSubring := + maximalIdeal_comap_valuationSubringRingEquivOfComap val e + let : IsAdicComplete + (IsLocalRing.maximalIdeal val.valuationSubring) val.valuationSubring := + isAdicComplete val + simpa [hmap] using + (isAdicComplete_map_ringEquiv + (I := IsLocalRing.maximalIdeal val.valuationSubring) r.symm) + +/-- The valuation subring of a complete discrete valuation field is henselian. -/ +theorem henselianRing (val : _root_.Valuation K Gamma) [IsCompleteDiscrete val] : + HenselianRing val.valuationSubring (IsLocalRing.maximalIdeal val.valuationSubring) := by + let : IsAdicComplete (IsLocalRing.maximalIdeal val.valuationSubring) + val.valuationSubring := isAdicComplete val + infer_instance + +/-- In a rank-one discrete valuation ring, membership in the `n`-th power of +the maximal ideal is the same as the corresponding valuation bound against a +chosen uniformizer power. -/ +theorem mem_maximalIdeal_pow_iff_valuation_le_uniformizer_pow + (val : _root_.Valuation K Gamma) [val.IsRankOneDiscrete] + {pi x : val.valuationSubring} + (hpi : val.IsUniformizer (pi : K)) (n : ℕ) : + x ∈ IsLocalRing.maximalIdeal val.valuationSubring ^ n ↔ + val (x : K) ≤ val ((pi ^ n : val.valuationSubring) : K) := by + rw [hpi.is_generator, Ideal.span_singleton_pow] + simpa [Ideal.mem_span_singleton] using + (_root_.Valuation.Integers.dvd_iff_le + (_root_.Valuation.valuationSubring.integers (v := val)) + (x := pi ^ n) (y := x)) + +end Valuation + +/-- A field with a chosen complete rank-one discrete valuation. -/ +structure CompleteDVF (K : Type u) [Field K] where + /-- The ordered multiplicative value group. -/ + ValueGroup : Type v + /-- The ordered commutative group-with-zero structure on the value group. -/ + [instValueGroup : LinearOrderedCommGroupWithZero ValueGroup] + /-- The chosen valuation on the field. -/ + valuation : _root_.Valuation K ValueGroup + /-- The chosen valuation is complete and discretely rank one. -/ + [instCompleteDiscrete : Valuation.IsCompleteDiscrete valuation] + +attribute [instance] CompleteDVF.instValueGroup CompleteDVF.instCompleteDiscrete + +namespace CompleteDVF + +variable {K : Type u} [Field K] + +/-- A complete DVF is Henselian. This is the canonical forgetful projection: +all weaker DVF data are obtained through this object. -/ +abbrev toHenselianDVF (F : CompleteDVF.{u, v} K) : HenselianDVF.{u, v} K where + toDVF := + { ValueGroup := F.ValueGroup + valuation := F.valuation } + instHenselian := by + change HenselianRing F.valuation.valuationSubring + (IsLocalRing.maximalIdeal F.valuation.valuationSubring) + exact Valuation.henselianRing F.valuation + +/-- The underlying DVF, obtained along the canonical +`CompleteDVF -> HenselianDVF -> DVF` path. -/ +abbrev toDVF (F : CompleteDVF.{u, v} K) : DVF.{u, v} K := + F.toHenselianDVF.toDVF + +/-- Introduces the abbreviation `valuationSubring`. -/ +abbrev valuationSubring (F : CompleteDVF.{u, v} K) : Type u := + F.toHenselianDVF.valuationSubring + +/-- Introduces the abbreviation `maximalIdeal`. -/ +abbrev maximalIdeal (F : CompleteDVF.{u, v} K) : Ideal F.valuationSubring := + F.toHenselianDVF.maximalIdeal + +/-- Introduces the abbreviation `residueField`. -/ +abbrev residueField (F : CompleteDVF.{u, v} K) : Type u := + F.toHenselianDVF.residueField + +/-- Introduces the abbreviation `residueMap`. -/ +abbrev residueMap (F : CompleteDVF.{u, v} K) : + RingHom F.valuationSubring F.residueField := + F.toHenselianDVF.residueMap + +/-- The valuation subring in the complete model is a discrete valuation ring. -/ +theorem valuationSubring_isDiscreteValuationRing (F : CompleteDVF.{u, v} K) : + IsDiscreteValuationRing F.valuationSubring := + F.toDVF.valuationSubring_isDiscreteValuationRing + +/-- The complete DVR model is complete for its maximal-ideal-adic topology. -/ +theorem isAdicComplete (F : CompleteDVF.{u, v} K) : + IsAdicComplete F.maximalIdeal F.valuationSubring := by + change IsAdicComplete + (IsLocalRing.maximalIdeal F.valuation.valuationSubring) + F.valuation.valuationSubring + exact Valuation.isAdicComplete F.valuation + +/-- The complete DVR valuation ring carries its canonical adic-completeness instance. -/ +instance instIsAdicComplete (F : CompleteDVF.{u, v} K) : + IsAdicComplete F.maximalIdeal F.valuationSubring := + F.isAdicComplete + +/-- Adic completeness makes the complete DVR valuation ring henselian. -/ +theorem henselianRing (F : CompleteDVF.{u, v} K) : + HenselianRing F.valuationSubring F.maximalIdeal := + F.toHenselianDVF.henselianRing + +/-- Membership in the valuation subring is characterized by nonnegative valuation. -/ +theorem mem_valuationSubring_iff (F : CompleteDVF.{u, v} K) (x : K) : + x ∈ F.valuation.valuationSubring ↔ F.valuation x <= 1 := + F.toDVF.mem_valuationSubring_iff x + +/-- Membership in the maximal ideal is characterized by strictly positive valuation. -/ +theorem mem_maximalIdeal_iff (F : CompleteDVF.{u, v} K) + (x : F.valuationSubring) : + x ∈ F.maximalIdeal ↔ F.valuation (x : K) < 1 := + F.toDVF.mem_maximalIdeal_iff x + +/-- An integral element has zero residue exactly when it lies in the maximal ideal. -/ +theorem residue_eq_zero_iff (F : CompleteDVF.{u, v} K) + (x : F.valuationSubring) : + F.residueMap x = 0 ↔ x ∈ F.maximalIdeal := + IsLocalRing.residue_eq_zero_iff x + +/-- An integral element has nonzero residue exactly when it is a unit. -/ +theorem residue_ne_zero_iff_isUnit (F : CompleteDVF.{u, v} K) + (x : F.valuationSubring) : + F.residueMap x ≠ 0 ↔ IsUnit x := + IsLocalRing.residue_ne_zero_iff_isUnit x + +/-- Every residue-field element has a representative in the valuation ring. -/ +theorem residue_surjective (F : CompleteDVF.{u, v} K) : + Function.Surjective F.residueMap := + IsLocalRing.residue_surjective + +/-- A complete discrete valuation field admits a uniformizer. -/ +theorem exists_uniformizer (F : CompleteDVF.{u, v} K) : + Exists (fun pi : F.valuationSubring => F.valuation.IsUniformizer (pi : K)) := + F.toDVF.exists_uniformizer + +/-- Every chosen uniformizer lies in the maximal ideal. -/ +theorem uniformizer_mem_maximalIdeal (F : CompleteDVF.{u, v} K) + {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) : + pi ∈ F.maximalIdeal := + F.toDVF.uniformizer_mem_maximalIdeal hpi + +/-- The maximal ideal is the principal ideal generated by a uniformizer. -/ +theorem maximalIdeal_eq_span_uniformizer (F : CompleteDVF.{u, v} K) + {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) : + F.maximalIdeal = Ideal.span ({pi} : Set F.valuationSubring) := + F.toDVF.maximalIdeal_eq_span_uniformizer hpi + +/-- Powers of the maximal ideal are generated by powers of any chosen +uniformizer. -/ +theorem maximalIdeal_pow_eq_span_uniformizer_pow (F : CompleteDVF.{u, v} K) + {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) : + F.maximalIdeal ^ n = Ideal.span ({pi ^ n} : Set F.valuationSubring) := + F.toDVF.maximalIdeal_pow_eq_span_uniformizer_pow hpi n + +/-- Membership in a power of the maximal ideal is divisibility by the +corresponding power of a uniformizer. -/ +theorem mem_maximalIdeal_pow_iff_uniformizer_pow_dvd (F : CompleteDVF.{u, v} K) + {pi x : F.valuationSubring} + (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) : + x ∈ F.maximalIdeal ^ n ↔ pi ^ n ∣ x := + F.toDVF.mem_maximalIdeal_pow_iff_uniformizer_pow_dvd hpi n + +/-- A uniformizer belongs to the maximal ideal but not to its square. -/ +theorem uniformizer_not_mem_maximalIdeal_sq (F : CompleteDVF.{u, v} K) + {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) : + pi ∉ F.maximalIdeal ^ 2 := + F.toDVF.uniformizer_not_mem_maximalIdeal_sq hpi + +/-- Every nonzero ideal in the valuation ring of a complete DVF is a power of +the maximal ideal. -/ +theorem nonzero_ideal_eq_maximalIdeal_pow (F : CompleteDVF.{u, v} K) + (I : Ideal F.valuationSubring) (hI : I ≠ ⊥) : + ∃ n : ℕ, I = F.maximalIdeal ^ n := + F.toDVF.nonzero_ideal_eq_maximalIdeal_pow I hI + +/-- In a complete DVF, the principal filtration generated by any nonzero +element of the maximal ideal is complete. The source is that every nonzero +ideal in a DVR is a positive power of the maximal ideal. -/ +theorem principalAdicComplete_of_ne_zero_mem_maximalIdeal + (F : CompleteDVF.{u, v} K) {π : F.valuationSubring} + (hπ_ne : π ≠ 0) (hπ_mem : π ∈ F.maximalIdeal) : + IsAdicComplete (Ideal.span ({π} : Set F.valuationSubring)) + F.valuationSubring := by + have hspan_ne : + Ideal.span ({π} : Set F.valuationSubring) ≠ ⊥ := by + intro hspan + have hπ_bot : π ∈ (⊥ : Ideal F.valuationSubring) := by + rw [← hspan] + exact Ideal.mem_span_singleton_self π + exact hπ_ne (by simpa using hπ_bot) + rcases F.nonzero_ideal_eq_maximalIdeal_pow + (Ideal.span ({π} : Set F.valuationSubring)) hspan_ne with + ⟨n, hn⟩ + have hspan_le : + Ideal.span ({π} : Set F.valuationSubring) ≤ F.maximalIdeal := by + rw [Ideal.span_le] + intro x hx + have hxπ : x = π := by simpa using hx + simpa [hxπ] using hπ_mem + have hn_ne_zero : n ≠ 0 := by + intro hn_zero + have htop_le : (⊤ : Ideal F.valuationSubring) ≤ F.maximalIdeal := by + simpa [hn, hn_zero] using hspan_le + have hone : (1 : F.valuationSubring) ∈ F.maximalIdeal := + htop_le trivial + exact + (IsLocalRing.maximalIdeal.isMaximal F.valuationSubring).isPrime.one_notMem + hone + have hn_pos : 0 < n := Nat.pos_of_ne_zero hn_ne_zero + have hmax_complete : IsAdicComplete F.maximalIdeal F.valuationSubring := + F.isAdicComplete + let : IsAdicComplete F.maximalIdeal F.valuationSubring := hmax_complete + have hpow : + IsAdicComplete (F.maximalIdeal ^ n) F.valuationSubring := + isAdicComplete_pow_of_isAdicComplete + (M := F.valuationSubring) F.maximalIdeal hn_pos + simpa [hn] using hpow + +/-- Principal precompleteness generated from complete-DVF completeness. -/ +theorem principalPrecomplete_of_ne_zero_mem_maximalIdeal + (F : CompleteDVF.{u, v} K) {π : F.valuationSubring} + (hπ_ne : π ≠ 0) (hπ_mem : π ∈ F.maximalIdeal) : + IsPrecomplete (Ideal.span ({π} : Set F.valuationSubring)) + F.valuationSubring := + (F.principalAdicComplete_of_ne_zero_mem_maximalIdeal + hπ_ne hπ_mem).toIsPrecomplete + +/-- Principal separatedness generated from complete-DVF completeness. -/ +theorem principalHausdorff_of_ne_zero_mem_maximalIdeal + (F : CompleteDVF.{u, v} K) {π : F.valuationSubring} + (hπ_ne : π ≠ 0) (hπ_mem : π ∈ F.maximalIdeal) : + IsHausdorff (Ideal.span ({π} : Set F.valuationSubring)) + F.valuationSubring := + (F.principalAdicComplete_of_ne_zero_mem_maximalIdeal + hπ_ne hπ_mem).toIsHausdorff + +/-- The maximal ideal of a complete DVF valuation ring is nonzero. -/ +theorem maximalIdeal_ne_bot (F : CompleteDVF.{u, v} K) : + F.maximalIdeal ≠ ⊥ := by + rcases F.exists_uniformizer with ⟨pi, hpi⟩ + intro hbot + have hmem : pi ∈ (⊥ : Ideal F.valuationSubring) := by + rw [← hbot] + exact F.uniformizer_mem_maximalIdeal hpi + have hzero_sub : pi = 0 := by + simpa using hmem + apply hpi.ne_zero + exact Subtype.ext_iff.mp hzero_sub + +/-- No power of a uniformizer lies one step deeper in the maximal-ideal +filtration. -/ +theorem uniformizer_pow_not_mem_maximalIdeal_pow_succ + (F : CompleteDVF.{u, v} K) + {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) + (n : ℕ) : + pi ^ n ∉ F.maximalIdeal ^ (n + 1) := + F.toDVF.uniformizer_pow_not_mem_maximalIdeal_pow_succ hpi n + +/-- The maximal-ideal topology on the valuation ring of a complete DVF is +separated. This is the uniqueness half needed by unit-level completion +arguments. -/ +theorem eq_zero_of_mem_maximalIdeal_pow_all + (F : CompleteDVF.{u, v} K) {x : F.valuationSubring} + (hx : ∀ n : ℕ, x ∈ F.maximalIdeal ^ n) : + x = 0 := by + by_contra hx_ne + have hspan_ne : Ideal.span ({x} : Set F.valuationSubring) ≠ ⊥ := by + intro hspan + have hx_bot : x ∈ (⊥ : Ideal F.valuationSubring) := by + rw [← hspan] + exact Ideal.mem_span_singleton_self x + exact hx_ne (by simpa using hx_bot) + rcases F.nonzero_ideal_eq_maximalIdeal_pow + (Ideal.span ({x} : Set F.valuationSubring)) hspan_ne with + ⟨n, hspan_eq⟩ + rcases F.exists_uniformizer with ⟨pi, hpi⟩ + have hspan_le : Ideal.span ({x} : Set F.valuationSubring) ≤ + F.maximalIdeal ^ (n + 1) := by + rw [Ideal.span_le] + intro y hy + have hyx : y = x := by simpa using hy + simpa [hyx] using hx (n + 1) + have hle : F.maximalIdeal ^ n ≤ F.maximalIdeal ^ (n + 1) := by + simpa [hspan_eq] using hspan_le + have hpow_mem : pi ^ n ∈ F.maximalIdeal ^ n := by + rw [F.maximalIdeal_pow_eq_span_uniformizer_pow hpi n] + exact Ideal.mem_span_singleton_self (pi ^ n) + exact F.uniformizer_pow_not_mem_maximalIdeal_pow_succ hpi n (hle hpow_mem) + +/-- Valuation-ring units are separated by all finite maximal-ideal quotient +coordinates. -/ +theorem unit_eq_of_idealQuotient_eq_all + (F : CompleteDVF.{u, v} K) {u₁ u₂ : F.valuationSubringˣ} + (h : + ∀ n : ℕ, + Ideal.Quotient.mk (F.maximalIdeal ^ n) (u₁ : F.valuationSubring) = + Ideal.Quotient.mk (F.maximalIdeal ^ n) (u₂ : F.valuationSubring)) : + u₁ = u₂ := by + apply Units.ext + have hsub : + ∀ n : ℕ, + (u₁ : F.valuationSubring) - (u₂ : F.valuationSubring) ∈ + F.maximalIdeal ^ n := by + intro n + exact + (Ideal.Quotient.mk_eq_mk_iff_sub_mem + (I := F.maximalIdeal ^ n) + (x := (u₁ : F.valuationSubring)) + (y := (u₂ : F.valuationSubring))).1 (h n) + exact sub_eq_zero.mp (F.eq_zero_of_mem_maximalIdeal_pow_all hsub) + +end CompleteDVF +end DiscreteValuationField + +end + +end ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/CompleteDVRExpansion.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/CompleteDVRExpansion.lean new file mode 100644 index 0000000000..ae49656b34 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/CompleteDVRExpansion.lean @@ -0,0 +1,554 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.Models +public import Mathlib.Topology.Algebra.Nonarchimedean.AdicTopology +/-! +# Coefficients for a complete DVR expansion + +This file formalizes the recursive coefficient construction in the recursive coefficient proof. + Given a section of the residue map and a uniformizer `π`, every element +of the valuation ring has uniquely determined successive representative +coefficients and remainders satisfying + +`u = a 0 + a 1 * π + ... + a (n - 1) * π ^ (n - 1) + π ^ n * b n`. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate +namespace Valuations + +universe u v + +open ValuationTheory.DiscreteValuationField + +/-- A normalized system of representatives for the residue field of a local +ring. This common structure is used both for the original valuation ring and +for the valuation ring in its completion. -/ +structure residueRepresentativeSystemOf + (O : Type u) [CommRing O] [IsLocalRing O] where + /-- The chosen representative of each residue class. -/ + repr : IsLocalRing.ResidueField O → O + /-- Reducing a chosen representative recovers its residue class. -/ + residue_repr : ∀ a : IsLocalRing.ResidueField O, + IsLocalRing.residue O (repr a) = a + /-- The zero residue class is represented by zero. -/ + repr_zero : repr 0 = 0 + +namespace residueRepresentativeSystemOf + +variable (O : Type u) [CommRing O] [IsLocalRing O] + +/-- A normalized representative system exists by surjectivity of the residue +map. -/ +noncomputable def ofChoice : residueRepresentativeSystemOf O := by + classical + refine + { repr := fun a => + if ha : a = 0 then 0 else Classical.choose (IsLocalRing.residue_surjective a) + residue_repr := ?_ + repr_zero := ?_ } + · intro a + by_cases ha : a = 0 + · simp [ha] + · simp [ha, Classical.choose_spec (IsLocalRing.residue_surjective a)] + · simp + +end residueRepresentativeSystemOf + +/-- A system of representatives for the residue field of a complete DVF +valuation ring, encoded as a section of the residue map and normalized at +zero. -/ +abbrev residueRepresentativeSystem + {K : Type u} [Field K] + (F : CompleteDVF.{u, v} K) := + residueRepresentativeSystemOf F.valuationSubring + +namespace residueRepresentativeSystem + +variable {K : Type u} [Field K] +variable (F : CompleteDVF.{u, v} K) + +/-- A representative system exists by surjectivity of the residue map. -/ +noncomputable def ofChoice : residueRepresentativeSystem F := by + exact residueRepresentativeSystemOf.ofChoice F.valuationSubring + +end residueRepresentativeSystem + +variable {K : Type u} [Field K] +variable (F : CompleteDVF.{u, v} K) + +/-- One step of the digit expansion: subtract the chosen residue +representative, then divide by the uniformizer. -/ +theorem exists_remainder_step + (R : residueRepresentativeSystem F) + (π : F.valuationSubring) (hπ : F.valuation.IsUniformizer (π : K)) + (r : F.valuationSubring) : + ∃ b : F.valuationSubring, + r = R.repr (F.residueMap r) + π * b := by + have hres : + F.residueMap (r - R.repr (F.residueMap r)) = 0 := by + simp [map_sub, R.residue_repr] + have hmem : + r - R.repr (F.residueMap r) ∈ F.maximalIdeal := + (F.residue_eq_zero_iff _).1 hres + have hspan : + r - R.repr (F.residueMap r) ∈ + Ideal.span ({π} : Set F.valuationSubring) := by + simpa [F.maximalIdeal_eq_span_uniformizer hπ] using hmem + rcases (Ideal.mem_span_singleton.mp hspan) with ⟨b, hb⟩ + refine ⟨b, ?_⟩ + rw [sub_eq_iff_eq_add] at hb + simpa [add_comm] using hb + +/-- The recursively defined remainders in the expansion of `u`. -/ +noncomputable def remainder + (R : residueRepresentativeSystem F) + (π : F.valuationSubring) (hπ : F.valuation.IsUniformizer (π : K)) + (u : F.valuationSubring) : + ℕ → F.valuationSubring + | 0 => u + | n + 1 => + Classical.choose + (exists_remainder_step F R π hπ + (remainder R π hπ u n)) + +/-- The recursively defined representative coefficients in the expansion of +`u`. -/ +noncomputable def coeff + (R : residueRepresentativeSystem F) + (π : F.valuationSubring) (hπ : F.valuation.IsUniformizer (π : K)) + (u : F.valuationSubring) (n : ℕ) : + F.valuationSubring := + R.repr (F.residueMap (remainder F R π hπ u n)) + +/-- The defining recursion for the remainders and coefficients. -/ +theorem remainder_step + (R : residueRepresentativeSystem F) + (π : F.valuationSubring) (hπ : F.valuation.IsUniformizer (π : K)) + (u : F.valuationSubring) (n : ℕ) : + remainder F R π hπ u n = + coeff F R π hπ u n + + π * remainder F R π hπ u (n + 1) := by + exact + Classical.choose_spec + (exists_remainder_step F R π hπ + (remainder F R π hπ u n)) + +/-- Adding a multiple of the uniformizer does not change the residue class. -/ +theorem residueMap_add_uniformizer_mul + (π : F.valuationSubring) (hπ : F.valuation.IsUniformizer (π : K)) + (a b : F.valuationSubring) : + F.residueMap (a + π * b) = F.residueMap a := by + have hπ_res : F.residueMap π = 0 := + (F.residue_eq_zero_iff π).2 (F.uniformizer_mem_maximalIdeal hπ) + rw [map_add, map_mul, hπ_res, zero_mul, add_zero] + +/-- Recursive uniqueness of the coefficient and remainder sequences in the +valuation-ring part of the complete-DVR expansion. -/ +theorem coeff_remainder_unique + (R : residueRepresentativeSystem F) + (π : F.valuationSubring) (hπ : F.valuation.IsUniformizer (π : K)) + (u : F.valuationSubring) + (c b : ℕ → F.valuationSubring) + (hb0 : b 0 = u) + (hstep : ∀ n : ℕ, b n = c n + π * b (n + 1)) + (hcoeff_repr : ∀ n : ℕ, ∃ a : F.residueField, c n = R.repr a) : + ∀ n : ℕ, + b n = remainder F R π hπ u n ∧ + c n = coeff F R π hπ u n := by + classical + have hπ_ne : π ≠ 0 := by + intro hzero + exact hπ.ne_zero (by simpa using congrArg (fun x : F.valuationSubring => (x : K)) hzero) + have coeff_eq_of_remainder_eq : + ∀ n : ℕ, + b n = remainder F R π hπ u n → + c n = coeff F R π hπ u n := by + intro n hb + rcases hcoeff_repr n with ⟨a, ha⟩ + have hres_eq : F.residueMap (b n) = F.residueMap (c n) := by + rw [hstep n] + exact residueMap_add_uniformizer_mul F π hπ + (c n) (b (n + 1)) + calc + c n = R.repr a := ha + _ = R.repr (F.residueMap (c n)) := by rw [ha, R.residue_repr] + _ = R.repr (F.residueMap (b n)) := by rw [hres_eq] + _ = coeff F R π hπ u n := by + simp [coeff, hb] + have next_remainder_eq_of : + ∀ n : ℕ, + b n = remainder F R π hπ u n → + c n = coeff F R π hπ u n → + b (n + 1) = remainder F R π hπ u (n + 1) := by + intro n hb hc + have hmul : π * b (n + 1) = + π * remainder F R π hπ u (n + 1) := by + apply add_left_cancel (a := coeff F R π hπ u n) + calc + coeff F R π hπ u n + π * b (n + 1) + = c n + π * b (n + 1) := by rw [hc] + _ = b n := (hstep n).symm + _ = remainder F R π hπ u n := hb + _ = coeff F R π hπ u n + + π * remainder F R π hπ u (n + 1) := + remainder_step F R π hπ u n + exact mul_left_cancel₀ hπ_ne hmul + intro n + induction n with + | zero => + have hb : b 0 = remainder F R π hπ u 0 := by + simp [remainder, hb0] + exact ⟨hb, coeff_eq_of_remainder_eq 0 hb⟩ + | succ n ih => + have hb_succ : b (n + 1) = remainder F R π hπ u (n + 1) := + next_remainder_eq_of n ih.1 ih.2 + exact ⟨hb_succ, coeff_eq_of_remainder_eq (n + 1) hb_succ⟩ + +/-- Laurent-unit decomposition in a complete DVF: every nonzero field element +is a power of the chosen uniformizer times a valuation-ring unit. -/ +theorem exists_laurent_unit + (π : F.valuationSubring) (hπ : F.valuation.IsUniformizer (π : K)) + {x : K} (hx : x ≠ 0) : + ∃ m : ℤ, ∃ u : F.valuationSubring, + IsUnit u ∧ x = (π : K) ^ m * (u : K) := by + classical + rcases F.valuation.valuationSubring.mem_or_inv_mem x with hxmem | hxinvmem + · let r : F.valuationSubring := ⟨x, hxmem⟩ + have hr : r ≠ 0 := by + intro hr0 + exact hx (by simpa [r] using congrArg (fun y : F.valuationSubring => (y : K)) hr0) + rcases Valuation.exists_pow_Uniformizer (v := F.valuation) hr + (Valuation.Uniformizer.mk π hπ) with ⟨n, u, hu⟩ + let u0 : F.valuationSubring := u.val + have hu0 : IsUnit u0 := by + simp [u0] + have hcoe_pow : + ((π ^ n : F.valuationSubring) : K) = (π : K) ^ n := by + exact map_pow F.valuation.integer.subtype π n + refine ⟨(n : ℤ), u0, hu0, ?_⟩ + calc + x = ((π ^ n : F.valuationSubring) : K) * (u0 : K) := by + change x = ((π ^ n : F.valuationSubring) : K) * (u0 : K) at hu + exact hu + _ = (π : K) ^ (n : ℤ) * (u0 : K) := by + rw [hcoe_pow, zpow_natCast] + · let r : F.valuationSubring := ⟨x⁻¹, hxinvmem⟩ + have hr : r ≠ 0 := by + intro hr0 + have hxinv0 : x⁻¹ = 0 := by + simpa [r] using congrArg (fun y : F.valuationSubring => (y : K)) hr0 + exact inv_ne_zero hx hxinv0 + rcases Valuation.exists_pow_Uniformizer (v := F.valuation) hr + (Valuation.Uniformizer.mk π hπ) with ⟨n, u, hu⟩ + let u0 : F.valuationSubring := (u⁻¹).val + have hu0 : IsUnit u0 := by + simp [u0] + have hcoe_pow : + ((π ^ n : F.valuationSubring) : K) = (π : K) ^ n := by + exact map_pow F.valuation.integer.subtype π n + have huK : x⁻¹ = (π : K) ^ n * ((u.val : F.valuationSubring) : K) := by + calc + x⁻¹ = ((π ^ n : F.valuationSubring) : K) * + ((u.val : F.valuationSubring) : K) := by + change x⁻¹ = ((π ^ n : F.valuationSubring) : K) * + ((u.val : F.valuationSubring) : K) at hu + exact hu + _ = (π : K) ^ n * ((u.val : F.valuationSubring) : K) := by + rw [hcoe_pow] + have huinv : (((u.val : F.valuationSubring) : K))⁻¹ = (u0 : K) := by + have hmulO : + (u.val : F.valuationSubring) * ((u⁻¹).val : F.valuationSubring) = 1 := + Units.mul_inv u + have hmulK : ((u.val : F.valuationSubring) : K) * (u0 : K) = 1 := by + change + (((u.val : F.valuationSubring) * ((u⁻¹).val : F.valuationSubring) : + F.valuationSubring) : K) = (1 : K) + rw [hmulO] + rfl + exact inv_eq_of_mul_eq_one_right hmulK + refine ⟨-((n : ℤ)), u0, hu0, ?_⟩ + calc + x = (x⁻¹)⁻¹ := by rw [inv_inv] + _ = ((π : K) ^ n * ((u.val : F.valuationSubring) : K))⁻¹ := by rw [huK] + _ = (((u.val : F.valuationSubring) : K))⁻¹ * ((π : K) ^ n)⁻¹ := by + rw [mul_inv_rev] + _ = ((π : K) ^ n)⁻¹ * (((u.val : F.valuationSubring) : K))⁻¹ := by + rw [mul_comm] + _ = (π : K) ^ (-((n : ℤ))) * (u0 : K) := by + rw [huinv] + rw [zpow_neg, zpow_natCast] + +/-- The uniformizer exponent in a Laurent-unit decomposition is unique. -/ +theorem laurent_exponent_unique + (π : F.valuationSubring) (hπ : F.valuation.IsUniformizer (π : K)) + {m n : ℤ} {u w : F.valuationSubring} + (hu : IsUnit u) (hw : IsUnit w) + (h : (π : K) ^ m * (u : K) = (π : K) ^ n * (w : K)) : + m = n := by + have huval : F.valuation (u : K) = 1 := by + change F.valuation ((algebraMap F.valuationSubring K) u) = 1 + exact + (Valuation.Integers.isUnit_iff_valuation_eq_one + (Valuation.integer.integers F.valuation) (x := u)).mp hu + have hwval : F.valuation (w : K) = 1 := by + change F.valuation ((algebraMap F.valuationSubring K) w) = 1 + exact + (Valuation.Integers.isUnit_iff_valuation_eq_one + (Valuation.integer.integers F.valuation) (x := w)).mp hw + have hval : + F.valuation ((π : K) ^ m * (u : K)) = + F.valuation ((π : K) ^ n * (w : K)) := + congrArg F.valuation h + rw [map_mul, map_mul, map_zpow₀, map_zpow₀, huval, hwval, mul_one, mul_one] at hval + exact zpow_right_injective₀ hπ.val_pos (ne_of_lt hπ.val_lt_one) hval + +/-- The Laurent-unit part of the complete-DVR expansion is unique: if two unit +decompositions with powers of the same uniformizer represent the same field +element, then both the exponent and the unit agree. -/ +theorem laurent_unit_unique + (π : F.valuationSubring) (hπ : F.valuation.IsUniformizer (π : K)) + {m n : ℤ} {u w : F.valuationSubring} + (hu : IsUnit u) (hw : IsUnit w) + (h : (π : K) ^ m * (u : K) = (π : K) ^ n * (w : K)) : + m = n ∧ u = w := by + have hm : m = n := laurent_exponent_unique F π hπ hu hw h + subst n + have hπ_ne : (π : K) ≠ 0 := hπ.ne_zero + have hpow_ne : (π : K) ^ m ≠ 0 := zpow_ne_zero m hπ_ne + have hu_eq : (u : K) = (w : K) := mul_left_cancel₀ hpow_ne h + exact ⟨rfl, Subtype.ext hu_eq⟩ + +/-- Finite partial sums of the `π`-adic representative expansion. -/ +noncomputable def partialSum + (R : residueRepresentativeSystem F) + (π : F.valuationSubring) (hπ : F.valuation.IsUniformizer (π : K)) + (u : F.valuationSubring) : + ℕ → F.valuationSubring + | 0 => 0 + | n + 1 => + partialSum R π hπ u n + + coeff F R π hπ u n * π ^ n + +/-- Finite-stage expansion with a remainder term. -/ +theorem partialSum_add_remainder + (R : residueRepresentativeSystem F) + (π : F.valuationSubring) (hπ : F.valuation.IsUniformizer (π : K)) + (u : F.valuationSubring) (n : ℕ) : + u = + partialSum F R π hπ u n + + π ^ n * remainder F R π hπ u n := by + induction n with + | zero => + simp [partialSum, remainder] + | succ n ih => + calc + u = + partialSum F R π hπ u n + + π ^ n * remainder F R π hπ u n := ih + _ = + partialSum F R π hπ u n + + π ^ n * + (coeff F R π hπ u n + + π * remainder F R π hπ u (n + 1)) := by + rw [remainder_step F R π hπ u n] + _ = + partialSum F R π hπ u (n + 1) + + π ^ (n + 1) * remainder F R π hπ u (n + 1) := by + change + partialSum F R π hπ u n + + π ^ n * + (coeff F R π hπ u n + + π * remainder F R π hπ u (n + 1)) = + (partialSum F R π hπ u n + + coeff F R π hπ u n * π ^ n) + + π ^ (n + 1) * remainder F R π hπ u (n + 1) + rw [pow_succ] + ring + +/-- The finite expansion gives the correct residue modulo `π ^ n`. -/ +theorem partialSum_congr + (R : residueRepresentativeSystem F) + (π : F.valuationSubring) (hπ : F.valuation.IsUniformizer (π : K)) + (u : F.valuationSubring) (n : ℕ) : + u - partialSum F R π hπ u n ∈ F.maximalIdeal ^ n := by + let ps := partialSum F R π hπ u n + let rem := remainder F R π hπ u n + have hsum : + u = ps + π ^ n * rem := by + simpa [ps, rem] using + partialSum_add_remainder F R π hπ u n + have hdiff : + u - ps = π ^ n * rem := by + nth_rewrite 1 [hsum] + ring + have hpow : + π ^ n * rem ∈ + Ideal.span ({π ^ n} : Set F.valuationSubring) := by + rw [Ideal.mem_span_singleton] + exact ⟨rem, by rw [mul_comm]⟩ + have hspan_eq := F.maximalIdeal_pow_eq_span_uniformizer_pow hπ n + simpa [ps, rem, hdiff, hspan_eq] using hpow + +/-- Convergence of the finite partial sums in the maximal-ideal adic +topology, represented on a type-level topological copy of the valuation +ring. -/ +def PartialSumsConvergeAdically + (R : residueRepresentativeSystem F) + (π : F.valuationSubring) (hπ : F.valuation.IsUniformizer (π : K)) + (u : F.valuationSubring) : Prop := + Filter.Tendsto + (fun n => + WithTopology.toTopology F.maximalIdeal.adicTopology + (partialSum F R π hπ u n)) + Filter.atTop + (nhds + (WithTopology.toTopology F.maximalIdeal.adicTopology u)) + +/-- The finite partial sums converge to `u` in the type-level model of the +maximal-ideal adic topology. -/ +theorem partialSum_tendsto_adic + (R : residueRepresentativeSystem F) + (π : F.valuationSubring) (hπ : F.valuation.IsUniformizer (π : K)) + (u : F.valuationSubring) : + PartialSumsConvergeAdically F R π hπ u := by + classical + unfold PartialSumsConvergeAdically + apply WithTopology.tendsto_nhds_iff.mpr + let : TopologicalSpace F.valuationSubring := F.maximalIdeal.adicTopology + rw [Filter.tendsto_def] + intro s hs + rw [Filter.mem_atTop_sets] + rcases (Ideal.hasBasis_nhds_adic F.maximalIdeal u).mem_iff.mp hs with + ⟨m, _hm, hms⟩ + refine ⟨m, ?_⟩ + intro n hn + apply hms + let ps := partialSum F R π hπ u n + refine ⟨ps - u, ?_, ?_⟩ + · have hcongr : u - ps ∈ F.maximalIdeal ^ n := by + simpa [ps] using partialSum_congr F R π hπ u n + have hneg : ps - u ∈ F.maximalIdeal ^ n := by + simpa [ps, sub_eq_add_neg] using + (F.maximalIdeal ^ n).neg_mem hcongr + exact Ideal.pow_le_pow_right hn hneg + · simp [ps, sub_eq_add_neg] + +/-- The residue of each coefficient is the residue of the corresponding +remainder. -/ +theorem residue_coeff + (R : residueRepresentativeSystem F) + (π : F.valuationSubring) (hπ : F.valuation.IsUniformizer (π : K)) + (u : F.valuationSubring) (n : ℕ) : + F.residueMap (coeff F R π hπ u n) = + F.residueMap (remainder F R π hπ u n) := by + simp [coeff, R.residue_repr] + +/-- The first digit of a unit is nonzero. -/ +theorem coeff_zero_ne_zero_of_isUnit + (R : residueRepresentativeSystem F) + (π : F.valuationSubring) (hπ : F.valuation.IsUniformizer (π : K)) + {u : F.valuationSubring} (hu : IsUnit u) : + coeff F R π hπ u 0 ≠ 0 := by + intro hzero + have hres_coeff : + F.residueMap (coeff F R π hπ u 0) = 0 := by + simp [hzero] + have hres_u : F.residueMap u = 0 := by + have hcoeff := + residue_coeff F R π hπ u 0 + rw [hres_coeff] at hcoeff + simpa [remainder] using hcoeff.symm + have hne : F.residueMap u ≠ 0 := + (F.residue_ne_zero_iff_isUnit u).2 hu + exact hne hres_u + +/-- The complete-DVR expansion, existence-side Laurent expansion data for a nonzero field +element: after extracting the uniformizer power, the unit part has a +convergent representative expansion with nonzero first digit. -/ +theorem exists_laurent_expansion_data + (R : residueRepresentativeSystem F) + (π : F.valuationSubring) (hπ : F.valuation.IsUniformizer (π : K)) + {x : K} (hx : x ≠ 0) : + ∃ m : ℤ, ∃ u : F.valuationSubring, + IsUnit u ∧ + x = (π : K) ^ m * (u : K) ∧ + coeff F R π hπ u 0 ≠ 0 ∧ + PartialSumsConvergeAdically F R π hπ u ∧ + ∀ n : ℕ, + x = + (π : K) ^ m * + (((partialSum F R π hπ u n + + π ^ n * remainder F R π hπ u n) : + F.valuationSubring) : K) := by + rcases exists_laurent_unit F π hπ hx with ⟨m, u, hu, hx_eq⟩ + refine + ⟨m, u, hu, hx_eq, coeff_zero_ne_zero_of_isUnit F R π hπ hu, + partialSum_tendsto_adic F R π hπ u, ?_⟩ + intro n + have hstage : (u : K) = + (((partialSum F R π hπ u n + + π ^ n * remainder F R π hπ u n) : + F.valuationSubring) : K) := by + simpa using + congrArg (fun y : F.valuationSubring => (y : K)) + (partialSum_add_remainder F R π hπ u n) + rw [hx_eq, hstage] + +/-- The complete-DVR expansion, the canonical Laurent-series representation predicate. +The element `x` is represented as +`π^m * (a₀ + a₁π + a₂π² + ⋯)`, where the coefficients are the canonical +representatives attached to the unit part `u`. -/ +def isLaurentExpansion + (R : residueRepresentativeSystem F) + (π : F.valuationSubring) (hπ : F.valuation.IsUniformizer (π : K)) + (x : K) (m : ℤ) (u : F.valuationSubring) : Prop := + IsUnit u ∧ + x = (π : K) ^ m * (u : K) ∧ + coeff F R π hπ u 0 ≠ 0 ∧ + PartialSumsConvergeAdically F R π hπ u ∧ + ∀ n : ℕ, + x = + (π : K) ^ m * + (((partialSum F R π hπ u n + + π ^ n * remainder F R π hπ u n) : + F.valuationSubring) : K) + +/-- The complete-DVR expansion, public form: every nonzero element of a complete +discretely valued field has a unique convergent Laurent expansion with respect +to the chosen uniformizer and residue representative system. -/ +theorem exists_unique_laurent_expansion + (R : residueRepresentativeSystem F) + (π : F.valuationSubring) (hπ : F.valuation.IsUniformizer (π : K)) + {x : K} (hx : x ≠ 0) : + ∃! p : ℤ × F.valuationSubring, + isLaurentExpansion F R π hπ x p.1 p.2 := by + rcases exists_laurent_expansion_data F R π hπ hx with + ⟨m, u, hu, hx_eq, hcoeff0, htendsto, hstage⟩ + refine ⟨(m, u), ?_, ?_⟩ + · exact ⟨hu, hx_eq, hcoeff0, htendsto, hstage⟩ + · intro p hp + rcases p with ⟨n, w⟩ + rcases hp with ⟨hw, hx_eq_w, _hcoeff0_w, _htendsto_w, _hstage_w⟩ + have hsame : + (π : K) ^ m * (u : K) = (π : K) ^ n * (w : K) := by + rw [← hx_eq, ← hx_eq_w] + rcases laurent_unit_unique F π hπ hu hw hsame with + ⟨hm, huw⟩ + exact Prod.ext hm.symm huw.symm + +end Valuations +end LubinTate + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Compositum.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Compositum.lean new file mode 100644 index 0000000000..d074e47e0f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Compositum.lean @@ -0,0 +1,1014 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Algebra.Subalgebra.Lattice +public import Mathlib.FieldTheory.IntermediateField.Adjoin.Basic +public import Mathlib.FieldTheory.Relrank +public import Mathlib.FieldTheory.LinearDisjoint +public import Mathlib.FieldTheory.SeparableClosure +public import Mathlib.RingTheory.Ideal.Quotient.Operations +public import Mathlib.RingTheory.Unramified.Field +public import Mathlib.RingTheory.TensorProduct.Finite +/-! +# Field-theoretic composita for finite valued extensions + +The actual common-top part of Abhyankar's lemma needs valuation data on the +compositum `L ⊔ K'` inside a common ambient field. This file records the +purely field-theoretic source facts before any valuation extension is added: +finite-dimensionality over either branch, degree bounds and equalities, the +intersection degree square, and separability of the common top. +-/ + +@[expose] public section + +noncomputable +section + +universe u v + +namespace DiscreteValuationField +namespace FieldCompositum + +open scoped TensorProduct + +variable {K : Type u} {Ω : Type v} [Field K] [Field Ω] [Algebra K Ω] + +/-- A finitely generated intermediate field of the ambient field `Ω` which is +contained in `L` remains finitely generated after pulling it back to the field +type `L`. -/ +theorem fg_comap_val_of_fg_of_le + (L₀ L : IntermediateField K Ω) (hL₀_le : L₀ ≤ L) (hfg : L₀.FG) : + (L₀.comap L.val).FG := by + classical + obtain ⟨T, hT⟩ := hfg + let S : Set L := L.val ⁻¹' (T : Set Ω) + have hS_finite : S.Finite := by + exact Set.Finite.preimage + (f := L.val) (s := (T : Set Ω)) + (fun x _hx y _hy hxy => Subtype.ext hxy) + T.finite_toSet + have hImage : L.val '' S = (T : Set Ω) := by + ext x + constructor + · rintro ⟨y, hy, rfl⟩ + exact hy + · intro hx + have hxL₀ : x ∈ L₀ := by + rw [← hT] + exact IntermediateField.subset_adjoin K (T : Set Ω) hx + exact ⟨⟨x, hL₀_le hxL₀⟩, hx, rfl⟩ + have hComap : + (L₀.comap L.val).map L.val = L₀ := + IntermediateField.map_comap_eq_self + (f := L.val) (S := L₀) + (by simpa [IntermediateField.fieldRange_val] using hL₀_le) + refine IntermediateField.fg_def.2 ⟨S, hS_finite, ?_⟩ + apply IntermediateField.map_injective L.val + calc + (IntermediateField.adjoin K S).map L.val + = IntermediateField.adjoin K (L.val '' S) := by + rw [IntermediateField.adjoin_map] + _ = IntermediateField.adjoin K (T : Set Ω) := by + rw [hImage] + _ = L₀ := hT + _ = (L₀.comap L.val).map L.val := hComap.symm + +/-- The image of an intermediate field of `L` under the ambient inclusion +`L -> Ω` is contained in the original ambient intermediate field `L`. -/ +theorem map_val_le_self + (L : IntermediateField K Ω) (U : IntermediateField K L) : + U.map L.val ≤ L := by + intro x hx + rcases hx with ⟨y, _hy, rfl⟩ + exact y.2 + +/-- If the right finite-support field lies in `K'`, then the finite common +top built from a left subfield of `L` maps into the ambient common top +`L ⊔ K'`. -/ +theorem sup_map_val_sup_le_sup_of_right_le + (L K' : IntermediateField K Ω) (U : IntermediateField K L) + {K₀ : IntermediateField K Ω} (hK₀ : K₀ ≤ K') : + (U.map L.val ⊔ K₀ : IntermediateField K Ω) ≤ + (L ⊔ K' : IntermediateField K Ω) := by + refine sup_le ?_ ?_ + · exact + (map_val_le_self (K := K) (Ω := Ω) L U).trans + (show L ≤ (L ⊔ K' : IntermediateField K Ω) from le_sup_left) + · exact + hK₀.trans + (show K' ≤ (L ⊔ K' : IntermediateField K Ω) from le_sup_right) + +/-- Finite-dimensionality transfers from a left subextension `U ≤ L` to its +image in the ambient field `Ω`. -/ +theorem finiteDimensional_map_val_of_finiteDimensional + (L : IntermediateField K Ω) (U : IntermediateField K L) + [FiniteDimensional K U] : + FiniteDimensional K (U.map L.val) := + (IntermediateField.equivMap U L.val).toLinearEquiv.finiteDimensional + +instance supRightAlgebra (L K' : IntermediateField K Ω) : + Algebra K' (L ⊔ K' : IntermediateField K Ω) := + (IntermediateField.inclusion (show K' ≤ L ⊔ K' from le_sup_right)).toAlgebra + +instance supLeftAlgebra (L K' : IntermediateField K Ω) : + Algebra L (L ⊔ K' : IntermediateField K Ω) := + (IntermediateField.inclusion (show L ≤ L ⊔ K' from le_sup_left)).toAlgebra + +instance supRightIsScalarTower (L K' : IntermediateField K Ω) : + IsScalarTower K K' (L ⊔ K' : IntermediateField K Ω) := by + apply IsScalarTower.of_algebraMap_eq + intro x + ext + rfl + +instance supLeftIsScalarTower (L K' : IntermediateField K Ω) : + IsScalarTower K L (L ⊔ K' : IntermediateField K Ω) := by + apply IsScalarTower.of_algebraMap_eq + intro x + ext + rfl + +/-- Every tensor is a finite sum of pure tensors. This local source form is +used to move from abstract field-level tensor representatives to denominator +clearing data in the compositum arguments. -/ +theorem tensorProduct_exists_list_sum_tmul + {R : Type u} {A B : Type v} [CommSemiring R] + [AddCommMonoid A] [Module R A] [AddCommMonoid B] [Module R B] + (z : A ⊗[R] B) : + ∃ l : List (A × B), z = (l.map (fun p => p.1 ⊗ₜ[R] p.2)).sum := by + refine TensorProduct.inductionOn z ?tmul ?add + · intro a b + exact ⟨[(a, b)], by simp⟩ + · intro x y hx hy + rcases hx with ⟨lx, hx⟩ + rcases hy with ⟨ly, hy⟩ + refine ⟨lx ++ ly, ?_⟩ + rw [List.map_append, List.sum_append, ← hx, ← hy] + +/-- The field-level product map `L ⊗_K K' -> Ω` has image exactly the +compositum subalgebra `L ⊔ K'`. This is the pure algebraic generation source +behind the later valuation-ring common-top comparison. -/ +theorem sup_productMap_range + (L K' : IntermediateField K Ω) [FiniteDimensional K L] : + (Algebra.TensorProduct.productMap L.val K'.val).range = + (L ⊔ K').toSubalgebra := by + rw [Algebra.TensorProduct.productMap_range, L.range_val, K'.range_val, + IntermediateField.sup_toSubalgebra_of_left] + +/-- Every element of the compositum is represented by a tensor under the +field-level product map `L ⊗_K K' -> Ω`. -/ +theorem exists_tensor_productMap_eq_of_mem_sup + (L K' : IntermediateField K Ω) [FiniteDimensional K L] + {x : Ω} (hx : x ∈ (L ⊔ K' : IntermediateField K Ω)) : + ∃ z : L ⊗[K] K', Algebra.TensorProduct.productMap L.val K'.val z = x := by + have hmem : + x ∈ (Algebra.TensorProduct.productMap L.val K'.val).range := by + rw [sup_productMap_range (K := K) (Ω := Ω) L K'] + exact hx + rcases hmem with ⟨z, hz⟩ + exact ⟨z, hz⟩ + +/-- The product map into the actual compositum subtype agrees with the +ambient product map after coercing the target back to `Ω`. -/ +theorem sup_productMap_val_comp + (L K' : IntermediateField K Ω) : + (L ⊔ K').val.comp + (Algebra.TensorProduct.productMap + (IntermediateField.inclusion (show L ≤ L ⊔ K' from le_sup_left)) + (IntermediateField.inclusion (show K' ≤ L ⊔ K' from le_sup_right))) = + Algebra.TensorProduct.productMap L.val K'.val := by + apply Algebra.TensorProduct.ext + · ext a + rfl + · ext b + rfl + +/-- Every element of the compositum subtype is represented by a tensor under +the intrinsic product map `L ⊗_K K' -> L ⊔ K'`. -/ +theorem exists_sup_tensor_productMap_eq + (L K' : IntermediateField K Ω) [FiniteDimensional K L] + (x : (L ⊔ K' : IntermediateField K Ω)) : + ∃ z : L ⊗[K] K', + Algebra.TensorProduct.productMap + (IntermediateField.inclusion (show L ≤ L ⊔ K' from le_sup_left)) + (IntermediateField.inclusion (show K' ≤ L ⊔ K' from le_sup_right)) z = + x := by + rcases exists_tensor_productMap_eq_of_mem_sup + (K := K) (Ω := Ω) L K' x.2 with ⟨z, hz⟩ + refine ⟨z, ?_⟩ + apply Subtype.ext + rw [← hz] + exact congrArg (fun f => f z) + (sup_productMap_val_comp (K := K) (Ω := Ω) L K') + +/-- The intrinsic field-level product map `L ⊗_K K' -> L ⊔ K'` is +surjective. This is the exact field-generation source used before any +valuation-ring generation statement is attempted. -/ +theorem sup_productMap_surjective + (L K' : IntermediateField K Ω) [FiniteDimensional K L] : + Function.Surjective + (Algebra.TensorProduct.productMap + (IntermediateField.inclusion (show L ≤ L ⊔ K' from le_sup_left)) + (IntermediateField.inclusion (show K' ≤ L ⊔ K' from le_sup_right))) := by + intro x + exact exists_sup_tensor_productMap_eq (K := K) (Ω := Ω) L K' x + +/-- Finite-sum form of the intrinsic field-level product-map generation +`L ⊗_K K' -> L ⊔ K'`. -/ +theorem exists_list_sum_sup_tensor_productMap_eq + (L K' : IntermediateField K Ω) [FiniteDimensional K L] + (x : (L ⊔ K' : IntermediateField K Ω)) : + ∃ l : List (L × K'), + Algebra.TensorProduct.productMap + (IntermediateField.inclusion (show L ≤ L ⊔ K' from le_sup_left)) + (IntermediateField.inclusion (show K' ≤ L ⊔ K' from le_sup_right)) + ((l.map (fun p => p.1 ⊗ₜ[K] p.2)).sum) = + x := by + rcases exists_sup_tensor_productMap_eq (K := K) (Ω := Ω) L K' x with + ⟨z, hz⟩ + rcases tensorProduct_exists_list_sum_tmul + (R := K) (A := L) (B := K') z with ⟨l, hl⟩ + refine ⟨l, ?_⟩ + rw [← hl] + exact hz + +/-- The compositum is generated over the left factor by the right factor. -/ +theorem sup_left_adjoin_right_range_eq_top + (L K' : IntermediateField K Ω) [FiniteDimensional K L] : + Algebra.adjoin L + (Set.range + (IntermediateField.inclusion + (show K' ≤ L ⊔ K' from le_sup_right))) = + (⊤ : Subalgebra L (L ⊔ K' : IntermediateField K Ω)) := by + let iL : + L →ₐ[K] (L ⊔ K' : IntermediateField K Ω) := + IntermediateField.inclusion (show L ≤ L ⊔ K' from le_sup_left) + let iK' : + K' →ₐ[K] (L ⊔ K' : IntermediateField K Ω) := + IntermediateField.inclusion (show K' ≤ L ⊔ K' from le_sup_right) + let S : Subalgebra L (L ⊔ K' : IntermediateField K Ω) := + Algebra.adjoin L (Set.range iK') + change S = ⊤ + apply Algebra.eq_top_iff.2 + intro x + rcases exists_sup_tensor_productMap_eq (K := K) (Ω := Ω) L K' x with + ⟨z, hz⟩ + rw [← hz] + refine TensorProduct.inductionOn z ?tmul ?add + · intro a b + have ha : iL a ∈ S := by + change algebraMap L (L ⊔ K' : IntermediateField K Ω) a ∈ S + exact S.algebraMap_mem a + have hb : iK' b ∈ S := + Algebra.subset_adjoin (R := L) (s := Set.range iK') ⟨b, rfl⟩ + simpa [S, iL, iK', Algebra.TensorProduct.productMap_apply_tmul] using + S.mul_mem ha hb + · intro x y hx hy + simpa [map_add] using S.add_mem hx hy + +/-- The field-level product map `K' ⊗_K L -> Ω` has image exactly the +compositum subalgebra `L ⊔ K'`. This is the order matching the later +valuation-ring tensor product `O_K' ⊗_{O_K} O_L`. -/ +theorem sup_flip_productMap_range + (L K' : IntermediateField K Ω) [FiniteDimensional K L] : + (Algebra.TensorProduct.productMap K'.val L.val).range = + (L ⊔ K').toSubalgebra := by + rw [Algebra.TensorProduct.productMap_range, K'.range_val, L.range_val, + ← IntermediateField.sup_toSubalgebra_of_right (E1 := K') (E2 := L), + sup_comm] + +/-- Every element of the compositum is represented by a tensor under the +field-level product map `K' ⊗_K L -> Ω`, in the order matching the valuation +ring tensor product. -/ +theorem exists_flip_tensor_productMap_eq_of_mem_sup + (L K' : IntermediateField K Ω) [FiniteDimensional K L] + {x : Ω} (hx : x ∈ (L ⊔ K' : IntermediateField K Ω)) : + ∃ z : K' ⊗[K] L, Algebra.TensorProduct.productMap K'.val L.val z = x := by + have hmem : + x ∈ (Algebra.TensorProduct.productMap K'.val L.val).range := by + rw [sup_flip_productMap_range (K := K) (Ω := Ω) L K'] + exact hx + rcases hmem with ⟨z, hz⟩ + exact ⟨z, hz⟩ + +/-- The product map `K' ⊗_K L -> L ⊔ K'` agrees with the ambient product map +after coercing the target back to `Ω`. -/ +theorem sup_flip_productMap_val_comp + (L K' : IntermediateField K Ω) : + (L ⊔ K').val.comp + (Algebra.TensorProduct.productMap + (IntermediateField.inclusion (show K' ≤ L ⊔ K' from le_sup_right)) + (IntermediateField.inclusion (show L ≤ L ⊔ K' from le_sup_left))) = + Algebra.TensorProduct.productMap K'.val L.val := by + apply Algebra.TensorProduct.ext + · ext a + rfl + · ext b + rfl + +/-- Every element of the compositum subtype is represented by a tensor under +the intrinsic product map `K' ⊗_K L -> L ⊔ K'`. -/ +theorem exists_sup_flip_tensor_productMap_eq + (L K' : IntermediateField K Ω) [FiniteDimensional K L] + (x : (L ⊔ K' : IntermediateField K Ω)) : + ∃ z : K' ⊗[K] L, + Algebra.TensorProduct.productMap + (IntermediateField.inclusion (show K' ≤ L ⊔ K' from le_sup_right)) + (IntermediateField.inclusion (show L ≤ L ⊔ K' from le_sup_left)) z = + x := by + rcases exists_flip_tensor_productMap_eq_of_mem_sup + (K := K) (Ω := Ω) L K' x.2 with ⟨z, hz⟩ + refine ⟨z, ?_⟩ + apply Subtype.ext + rw [← hz] + exact congrArg (fun f => f z) + (sup_flip_productMap_val_comp (K := K) (Ω := Ω) L K') + +/-- The intrinsic field-level product map `K' ⊗_K L -> L ⊔ K'` is +surjective. This is the source form aligned with the valuation-ring tensor +map used in the unramified base-change construction. -/ +theorem sup_flip_productMap_surjective + (L K' : IntermediateField K Ω) [FiniteDimensional K L] : + Function.Surjective + (Algebra.TensorProduct.productMap + (IntermediateField.inclusion (show K' ≤ L ⊔ K' from le_sup_right)) + (IntermediateField.inclusion (show L ≤ L ⊔ K' from le_sup_left))) := by + intro x + exact exists_sup_flip_tensor_productMap_eq (K := K) (Ω := Ω) L K' x + +/-- The intrinsic product map `K' ⊗_K L -> L ⊔ K'`, regarded as a +`K'`-algebra hom. This is the field-level base-change map used in the +the unramified base-change theorem; no separability of `K'/K` is involved. -/ +noncomputable def supFlipProductMapRightAlgHom + (L K' : IntermediateField K Ω) : + K' ⊗[K] L →ₐ[K'] (L ⊔ K' : IntermediateField K Ω) := + AlgHom.mk' + (Algebra.TensorProduct.productMap + (IntermediateField.inclusion (show K' ≤ L ⊔ K' from le_sup_right)) + (IntermediateField.inclusion (show L ≤ L ⊔ K' from le_sup_left))).toRingHom + (by + intro c x + simp [Algebra.smul_def, RingHom.algebraMap_toAlgebra]) + +/-- The `K'`-algebra product map `K' ⊗_K L -> L ⊔ K'` is surjective. -/ +theorem supFlipProductMapRightAlgHom_surjective + (L K' : IntermediateField K Ω) [FiniteDimensional K L] : + Function.Surjective + (supFlipProductMapRightAlgHom (K := K) (Ω := Ω) L K') := by + simpa [supFlipProductMapRightAlgHom] using + sup_flip_productMap_surjective (K := K) (Ω := Ω) L K' + +/-- The actual compositum `L ⊔ K'` is finite over the right factor whenever +the left factor is finite over the base. + +This is the finite-dimensional source needed for unramified base change: +base change by an arbitrary algebraic extension is reduced elementwise to a +finite right subextension, but the finiteness of the right branch itself comes +from the finite left factor. -/ +theorem finiteDimensional_sup_over_right_of_left + (L K' : IntermediateField K Ω) [FiniteDimensional K L] : + FiniteDimensional K' (L ⊔ K' : IntermediateField K Ω) := by + exact + FiniteDimensional.of_surjective + (supFlipProductMapRightAlgHom (K := K) (Ω := Ω) L K').toLinearMap + (supFlipProductMapRightAlgHom_surjective (K := K) (Ω := Ω) L K') + +/-- The algebraic first-isomorphism theorem with the source ring structure +fixed by its commutative-ring parent. -/ +local instance tensorProductIdealHasQuotient + (L K' : IntermediateField K Ω) : + HasQuotient (K' ⊗[K] L) (Ideal (K' ⊗[K] L)) := + @Ideal.instHasQuotient (K' ⊗[K] L) + (inferInstance : CommRing (K' ⊗[K] L)).toRing + +noncomputable def quotientKerAlgEquivOfSurjectiveCommRing + {R A B : Type*} + [ringR : CommSemiring R] [ringA : CommRing A] + [algebraRA : Algebra R A] + [ringB : Semiring B] [algebraRB : Algebra R B] + {f : A →ₐ[R] B} (hf : Function.Surjective f) : + (@HasQuotient.Quotient A (Ideal A) + (@Ideal.instHasQuotient A ringA.toRing) + (RingHom.ker f.toRingHom)) ≃ₐ[R] B := + Ideal.quotientKerAlgEquivOfSurjective hf + +/-- The field factor selected by the product map `K' ⊗_K L -> L ⊔ K'` is +the actual compositum field: quotienting by the kernel of the surjective +`K'`-algebra map gives `L ⊔ K'`. -/ +noncomputable def supFlipProductMapRightAlgHomQuotientKerAlgEquiv + (L K' : IntermediateField K Ω) [FiniteDimensional K L] : + ((K' ⊗[K] L) ⧸ + (RingHom.ker + (supFlipProductMapRightAlgHom (K := K) (Ω := Ω) L K').toRingHom)) + ≃ₐ[K'] (L ⊔ K' : IntermediateField K Ω) := + let f : K' ⊗[K] L →ₐ[K'] (L ⊔ K' : IntermediateField K Ω) := + supFlipProductMapRightAlgHom (K := K) (Ω := Ω) L K' + have hf : Function.Surjective f := + supFlipProductMapRightAlgHom_surjective (K := K) (Ω := Ω) L K' + quotientKerAlgEquivOfSurjectiveCommRing + (R := K') (A := K' ⊗[K] L) + (B := (L ⊔ K' : IntermediateField K Ω)) + (ringR := (inferInstance : CommSemiring K')) + (ringA := (inferInstance : CommRing (K' ⊗[K] L))) + (algebraRA := (inferInstance : Algebra K' (K' ⊗[K] L))) + (ringB := (inferInstance : Semiring (L ⊔ K' : IntermediateField K Ω))) + (algebraRB := (inferInstance : Algebra K' (L ⊔ K' : IntermediateField K Ω))) + (f := f) hf + +/-- Finite-sum form of the intrinsic field-level product-map generation +`K' ⊗_K L -> L ⊔ K'`, in the order matching the valuation-ring tensor +product. -/ +theorem exists_list_sum_sup_flip_tensor_productMap_eq + (L K' : IntermediateField K Ω) [FiniteDimensional K L] + (x : (L ⊔ K' : IntermediateField K Ω)) : + ∃ l : List (K' × L), + Algebra.TensorProduct.productMap + (IntermediateField.inclusion (show K' ≤ L ⊔ K' from le_sup_right)) + (IntermediateField.inclusion (show L ≤ L ⊔ K' from le_sup_left)) + ((l.map (fun p => p.1 ⊗ₜ[K] p.2)).sum) = + x := by + rcases exists_sup_flip_tensor_productMap_eq (K := K) (Ω := Ω) L K' x with + ⟨z, hz⟩ + rcases tensorProduct_exists_list_sum_tmul + (R := K) (A := K') (B := L) z with ⟨l, hl⟩ + refine ⟨l, ?_⟩ + rw [← hl] + exact hz + +/-- The compositum is generated over the right factor by the left factor. -/ +theorem sup_right_adjoin_left_range_eq_top + (L K' : IntermediateField K Ω) [FiniteDimensional K L] : + Algebra.adjoin K' + (Set.range + (IntermediateField.inclusion + (show L ≤ L ⊔ K' from le_sup_left))) = + (⊤ : Subalgebra K' (L ⊔ K' : IntermediateField K Ω)) := by + let iK' : + K' →ₐ[K] (L ⊔ K' : IntermediateField K Ω) := + IntermediateField.inclusion (show K' ≤ L ⊔ K' from le_sup_right) + let iL : + L →ₐ[K] (L ⊔ K' : IntermediateField K Ω) := + IntermediateField.inclusion (show L ≤ L ⊔ K' from le_sup_left) + let S : Subalgebra K' (L ⊔ K' : IntermediateField K Ω) := + Algebra.adjoin K' (Set.range iL) + change S = ⊤ + apply Algebra.eq_top_iff.2 + intro x + rcases exists_sup_flip_tensor_productMap_eq (K := K) (Ω := Ω) L K' x with + ⟨z, hz⟩ + rw [← hz] + refine TensorProduct.inductionOn z ?tmul ?add + · intro a b + have ha : iK' a ∈ S := by + change algebraMap K' (L ⊔ K' : IntermediateField K Ω) a ∈ S + exact S.algebraMap_mem a + have hb : iL b ∈ S := + Algebra.subset_adjoin (R := K') (s := Set.range iL) ⟨b, rfl⟩ + simpa [S, iK', iL, Algebra.TensorProduct.productMap_apply_tmul] using + S.mul_mem ha hb + · intro x y hx hy + simpa [map_add] using S.add_mem hx hy + +/-- If the left factor is generated over `K` by one element, then the +compositum is generated over the right factor by the image of that same +element. This is the field-level primitive-generator source behind the +residue-generation step in unramified base change. -/ +theorem sup_right_adjoin_left_singleton_eq_top_of_adjoin_eq_top + (L K' : IntermediateField K Ω) [FiniteDimensional K L] + (x : L) + (hx : Algebra.adjoin K ({x} : Set L) = + (⊤ : Subalgebra K L)) : + Algebra.adjoin K' + ({(IntermediateField.inclusion + (show L ≤ L ⊔ K' from le_sup_left)) x} : + Set (L ⊔ K' : IntermediateField K Ω)) = + (⊤ : Subalgebra K' (L ⊔ K' : IntermediateField K Ω)) := by + let iL : + L →ₐ[K] (L ⊔ K' : IntermediateField K Ω) := + IntermediateField.inclusion (show L ≤ L ⊔ K' from le_sup_left) + let S : Subalgebra K' (L ⊔ K' : IntermediateField K Ω) := + Algebra.adjoin K' ({iL x} : Set (L ⊔ K' : IntermediateField K Ω)) + have hrange_le : + Algebra.adjoin K' (Set.range iL) ≤ S := by + rw [Algebra.adjoin_le_iff] + intro y hy + rcases hy with ⟨z, rfl⟩ + have hz : z ∈ Algebra.adjoin K ({x} : Set L) := by + simp [hx] + change iL z ∈ S + refine + Algebra.adjoin_induction + (p := fun z _ => iL z ∈ S) + ?mem ?algebraMap ?add ?mul hz + · intro z hz + have hz_eq : z = x := by + simpa using hz + rw [hz_eq] + exact Algebra.self_mem_adjoin_singleton K' (iL x) + · intro a + have hscalar : + iL (algebraMap K L a) = + algebraMap K' (L ⊔ K' : IntermediateField K Ω) + (algebraMap K K' a) := by + ext + rfl + rw [hscalar] + exact S.algebraMap_mem (algebraMap K K' a) + · intro z₁ z₂ _hz₁ _hz₂ hz₁_mem hz₂_mem + simpa [map_add] using S.add_mem hz₁_mem hz₂_mem + · intro z₁ z₂ _hz₁ _hz₂ hz₁_mem hz₂_mem + simpa [map_mul] using S.mul_mem hz₁_mem hz₂_mem + have htop_le : (⊤ : Subalgebra K' (L ⊔ K' : IntermediateField K Ω)) ≤ S := by + rw [← sup_right_adjoin_left_range_eq_top (K := K) (Ω := Ω) L K'] + exact hrange_le + exact le_antisymm le_top htop_le + +/-- Tower formula for the degree of the compositum over the right factor. -/ +theorem right_finrank_mul_compositum_finrank + (L K' : IntermediateField K Ω) : + Module.finrank K K' * + Module.finrank K' + (IntermediateField.extendScalars (show K' ≤ L ⊔ K' from le_sup_right)) = + Module.finrank K (L ⊔ K' : IntermediateField K Ω) := by + have h := IntermediateField.finrank_bot_mul_relfinrank + (show K' ≤ L ⊔ K' from le_sup_right) + simpa [IntermediateField.relfinrank_eq_finrank_of_le + (show K' ≤ L ⊔ K' from le_sup_right)] using h + +/-- Tower formula for the degree of the compositum over the left factor. -/ +theorem left_finrank_mul_compositum_finrank + (L K' : IntermediateField K Ω) : + Module.finrank K L * + Module.finrank L + (IntermediateField.extendScalars (show L ≤ L ⊔ K' from le_sup_left)) = + Module.finrank K (L ⊔ K' : IntermediateField K Ω) := by + have h := IntermediateField.finrank_bot_mul_relfinrank + (show L ≤ L ⊔ K' from le_sup_left) + simpa [IntermediateField.relfinrank_eq_finrank_of_le + (show L ≤ L ⊔ K' from le_sup_left)] using h + +/-- The compositum is finite over the right factor when the left factor is +finite over the base. -/ +theorem finiteDimensional_compositum_over_right_of_left + (L K' : IntermediateField K Ω) + [FiniteDimensional K L] : + FiniteDimensional K' + (IntermediateField.extendScalars (show K' ≤ L ⊔ K' from le_sup_right)) := by + change FiniteDimensional K' (L ⊔ K' : IntermediateField K Ω) + exact finiteDimensional_sup_over_right_of_left L K' + +/-- The compositum is finite over the right factor when the left factor is +finite over the base. -/ +theorem finiteDimensional_compositum_over_right + (L K' : IntermediateField K Ω) + [FiniteDimensional K L] : + FiniteDimensional K' + (IntermediateField.extendScalars (show K' ≤ L ⊔ K' from le_sup_right)) := by + exact finiteDimensional_compositum_over_right_of_left L K' + +/-- The compositum is finite over the left factor when both factors are finite +over the base. -/ +theorem finiteDimensional_compositum_over_left + (L K' : IntermediateField K Ω) + [FiniteDimensional K L] [FiniteDimensional K K'] : + FiniteDimensional L + (IntermediateField.extendScalars (show L ≤ L ⊔ K' from le_sup_left)) := by + apply FiniteDimensional.of_finrank_pos + have hformula := left_finrank_mul_compositum_finrank (K := K) (Ω := Ω) L K' + have hsup_pos : 0 < Module.finrank K (L ⊔ K' : IntermediateField K Ω) := by + exact Module.finrank_pos + rw [← hformula] at hsup_pos + exact Nat.pos_of_mul_pos_left hsup_pos + +/-- The common top field `L ⊔ K'` is finite over the right factor. -/ +theorem finiteDimensional_sup_over_right + (L K' : IntermediateField K Ω) + [FiniteDimensional K L] : + FiniteDimensional K' (L ⊔ K' : IntermediateField K Ω) := by + exact finiteDimensional_sup_over_right_of_left L K' + +/-- The common top field `L ⊔ K'` is finite over the left factor. -/ +theorem finiteDimensional_sup_over_left + (L K' : IntermediateField K Ω) + [FiniteDimensional K L] [FiniteDimensional K K'] : + FiniteDimensional L (L ⊔ K' : IntermediateField K Ω) := by + exact FiniteDimensional.right K L (L ⊔ K' : IntermediateField K Ω) + +/-- The degree of the base-changed field extension `L K' / K'` is bounded by +the degree of `L / K`. -/ +theorem compositum_finrank_over_right_le_left + (L K' : IntermediateField K Ω) + [FiniteDimensional K K'] : + Module.finrank K' + (IntermediateField.extendScalars (show K' ≤ L ⊔ K' from le_sup_right)) ≤ + Module.finrank K L := by + have hformula := right_finrank_mul_compositum_finrank (K := K) (Ω := Ω) L K' + have hsup_le := IntermediateField.finrank_sup_le L K' + have hmul : + Module.finrank K K' * + Module.finrank K' + (IntermediateField.extendScalars (show K' ≤ L ⊔ K' from le_sup_right)) ≤ + Module.finrank K K' * Module.finrank K L := by + calc + Module.finrank K K' * + Module.finrank K' + (IntermediateField.extendScalars (show K' ≤ L ⊔ K' from le_sup_right)) = + Module.finrank K (L ⊔ K' : IntermediateField K Ω) := hformula + _ ≤ Module.finrank K L * Module.finrank K K' := hsup_le + _ = Module.finrank K K' * Module.finrank K L := by rw [mul_comm] + exact Nat.le_of_mul_le_mul_left hmul + (Module.finrank_pos (R := K) (M := K')) + +/-- Symmetric bound for the degree of the compositum over the left factor. -/ +theorem compositum_finrank_over_left_le_right + (L K' : IntermediateField K Ω) + [FiniteDimensional K L] : + Module.finrank L + (IntermediateField.extendScalars (show L ≤ L ⊔ K' from le_sup_left)) ≤ + Module.finrank K K' := by + have hformula := left_finrank_mul_compositum_finrank (K := K) (Ω := Ω) L K' + have hsup_le := IntermediateField.finrank_sup_le L K' + have hmul : + Module.finrank K L * + Module.finrank L + (IntermediateField.extendScalars (show L ≤ L ⊔ K' from le_sup_left)) ≤ + Module.finrank K L * Module.finrank K K' := by + calc + Module.finrank K L * + Module.finrank L + (IntermediateField.extendScalars (show L ≤ L ⊔ K' from le_sup_left)) = + Module.finrank K (L ⊔ K' : IntermediateField K Ω) := hformula + _ ≤ Module.finrank K L * Module.finrank K K' := hsup_le + exact Nat.le_of_mul_le_mul_left hmul + (Module.finrank_pos (R := K) (M := L)) + +/-- Common-top form of the degree bound for `L ⊔ K' / K'`. -/ +theorem sup_finrank_over_right_le_left + (L K' : IntermediateField K Ω) + [FiniteDimensional K K'] : + Module.finrank K' (L ⊔ K' : IntermediateField K Ω) ≤ + Module.finrank K L := by + have hformula : + Module.finrank K K' * + Module.finrank K' (L ⊔ K' : IntermediateField K Ω) = + Module.finrank K (L ⊔ K' : IntermediateField K Ω) := + Module.finrank_mul_finrank K K' (L ⊔ K' : IntermediateField K Ω) + have hsup_le := IntermediateField.finrank_sup_le L K' + have hmul : + Module.finrank K K' * + Module.finrank K' (L ⊔ K' : IntermediateField K Ω) ≤ + Module.finrank K K' * Module.finrank K L := by + calc + Module.finrank K K' * + Module.finrank K' (L ⊔ K' : IntermediateField K Ω) = + Module.finrank K (L ⊔ K' : IntermediateField K Ω) := hformula + _ ≤ Module.finrank K L * Module.finrank K K' := hsup_le + _ = Module.finrank K K' * Module.finrank K L := by rw [mul_comm] + exact Nat.le_of_mul_le_mul_left hmul + (Module.finrank_pos (R := K) (M := K')) + +/-- Common-top form of the degree bound for `L ⊔ K' / L`. -/ +theorem sup_finrank_over_left_le_right + (L K' : IntermediateField K Ω) + [FiniteDimensional K L] : + Module.finrank L (L ⊔ K' : IntermediateField K Ω) ≤ + Module.finrank K K' := by + have hformula : + Module.finrank K L * + Module.finrank L (L ⊔ K' : IntermediateField K Ω) = + Module.finrank K (L ⊔ K' : IntermediateField K Ω) := + Module.finrank_mul_finrank K L (L ⊔ K' : IntermediateField K Ω) + have hsup_le := IntermediateField.finrank_sup_le L K' + have hmul : + Module.finrank K L * + Module.finrank L (L ⊔ K' : IntermediateField K Ω) ≤ + Module.finrank K L * Module.finrank K K' := by + calc + Module.finrank K L * + Module.finrank L (L ⊔ K' : IntermediateField K Ω) = + Module.finrank K (L ⊔ K' : IntermediateField K Ω) := hformula + _ ≤ Module.finrank K L * Module.finrank K K' := hsup_le + exact Nat.le_of_mul_le_mul_left hmul + (Module.finrank_pos (R := K) (M := L)) + +/-- Relative-degree square for a compositum, measured from the intersection +`L ⊓ K'`. -/ +theorem relfinrank_intersection_square + (L K' : IntermediateField K Ω) : + (L ⊓ K').relfinrank K' * K'.relfinrank (L ⊔ K') = + (L ⊓ K').relfinrank L * L.relfinrank (L ⊔ K') := by + have hright : + (L ⊓ K').relfinrank K' * K'.relfinrank (L ⊔ K') = + (L ⊓ K').relfinrank (L ⊔ K') := + IntermediateField.relfinrank_mul_relfinrank + (show L ⊓ K' ≤ K' from inf_le_right) + (show K' ≤ L ⊔ K' from le_sup_right) + have hleft : + (L ⊓ K').relfinrank L * L.relfinrank (L ⊔ K') = + (L ⊓ K').relfinrank (L ⊔ K') := + IntermediateField.relfinrank_mul_relfinrank + (show L ⊓ K' ≤ L from inf_le_left) + (show L ≤ L ⊔ K' from le_sup_left) + rw [hright, hleft] + +/-- The same relative-degree square written with base-changed intermediate +fields over the right and left compositum branches. -/ +theorem relfinrank_intersection_extendScalars_square + (L K' : IntermediateField K Ω) : + (L ⊓ K').relfinrank K' * + Module.finrank K' + (IntermediateField.extendScalars (show K' ≤ L ⊔ K' from le_sup_right)) = + (L ⊓ K').relfinrank L * + Module.finrank L + (IntermediateField.extendScalars (show L ≤ L ⊔ K' from le_sup_left)) := by + rw [← IntermediateField.relfinrank_eq_finrank_of_le + (show K' ≤ L ⊔ K' from le_sup_right), + ← IntermediateField.relfinrank_eq_finrank_of_le + (show L ≤ L ⊔ K' from le_sup_left)] + exact relfinrank_intersection_square L K' + +/-- The right compositum degree divides the left intersection-product. -/ +theorem compositum_finrank_over_right_dvd_intersection_product + (L K' : IntermediateField K Ω) : + Module.finrank K' + (IntermediateField.extendScalars (show K' ≤ L ⊔ K' from le_sup_right)) ∣ + (L ⊓ K').relfinrank L * + Module.finrank L + (IntermediateField.extendScalars (show L ≤ L ⊔ K' from le_sup_left)) := by + exact dvd_of_mul_left_eq _ + (relfinrank_intersection_extendScalars_square L K') + +/-- The left compositum degree divides the symmetric intersection-product. -/ +theorem compositum_finrank_over_left_dvd_intersection_product + (L K' : IntermediateField K Ω) : + Module.finrank L + (IntermediateField.extendScalars (show L ≤ L ⊔ K' from le_sup_left)) ∣ + (L ⊓ K').relfinrank K' * + Module.finrank K' + (IntermediateField.extendScalars (show K' ≤ L ⊔ K' from le_sup_right)) := by + exact dvd_of_mul_left_eq _ + (relfinrank_intersection_extendScalars_square L K').symm + +/-- Common-top form of the right branch degree divisibility. -/ +theorem sup_finrank_over_right_dvd_intersection_product + (L K' : IntermediateField K Ω) : + Module.finrank K' (L ⊔ K' : IntermediateField K Ω) ∣ + (L ⊓ K').relfinrank L * + Module.finrank L (L ⊔ K' : IntermediateField K Ω) := by + change Module.finrank K' + (IntermediateField.extendScalars + (show K' ≤ L ⊔ K' from le_sup_right)) ∣ + (L ⊓ K').relfinrank L * + Module.finrank L + (IntermediateField.extendScalars (show L ≤ L ⊔ K' from le_sup_left)) + exact compositum_finrank_over_right_dvd_intersection_product L K' + +/-- Common-top form of the left branch degree divisibility. -/ +theorem sup_finrank_over_left_dvd_intersection_product + (L K' : IntermediateField K Ω) : + Module.finrank L (L ⊔ K' : IntermediateField K Ω) ∣ + (L ⊓ K').relfinrank K' * + Module.finrank K' (L ⊔ K' : IntermediateField K Ω) := by + change Module.finrank L + (IntermediateField.extendScalars (show L ≤ L ⊔ K' from le_sup_left)) ∣ + (L ⊓ K').relfinrank K' * + Module.finrank K' + (IntermediateField.extendScalars + (show K' ≤ L ⊔ K' from le_sup_right)) + exact compositum_finrank_over_left_dvd_intersection_product L K' + +/-- If two finite-degree intermediate fields have coprime degrees over the +base, then they are linearly disjoint over the base. -/ +theorem linearDisjoint_of_finrank_coprime + (L K' : IntermediateField K Ω) + (hcop : Nat.Coprime (Module.finrank K L) (Module.finrank K K')) : + L.LinearDisjoint K' := + IntermediateField.LinearDisjoint.of_finrank_coprime hcop + +/-- Under linear disjointness, the degree of `L K' / K'` equals the degree of +`L / K`. -/ +theorem compositum_finrank_over_right_eq_left_of_linearDisjoint + (L K' : IntermediateField K Ω) + [FiniteDimensional K K'] + (hlin : L.LinearDisjoint K') : + Module.finrank K' + (IntermediateField.extendScalars (show K' ≤ L ⊔ K' from le_sup_right)) = + Module.finrank K L := by + have hformula := right_finrank_mul_compositum_finrank (K := K) (Ω := Ω) L K' + have hsup := hlin.finrank_sup + have hmul : + Module.finrank K K' * + Module.finrank K' + (IntermediateField.extendScalars (show K' ≤ L ⊔ K' from le_sup_right)) = + Module.finrank K K' * Module.finrank K L := by + calc + Module.finrank K K' * + Module.finrank K' + (IntermediateField.extendScalars (show K' ≤ L ⊔ K' from le_sup_right)) = + Module.finrank K (L ⊔ K' : IntermediateField K Ω) := hformula + _ = Module.finrank K L * Module.finrank K K' := hsup + _ = Module.finrank K K' * Module.finrank K L := by rw [mul_comm] + exact Nat.mul_left_cancel (Module.finrank_pos (R := K) (M := K')) hmul + +/-- Under linear disjointness, the degree of `L K' / L` equals the degree of +`K' / K`. -/ +theorem compositum_finrank_over_left_eq_right_of_linearDisjoint + (L K' : IntermediateField K Ω) + [FiniteDimensional K L] + (hlin : L.LinearDisjoint K') : + Module.finrank L + (IntermediateField.extendScalars (show L ≤ L ⊔ K' from le_sup_left)) = + Module.finrank K K' := by + have hformula := left_finrank_mul_compositum_finrank (K := K) (Ω := Ω) L K' + have hsup := hlin.finrank_sup + have hmul : + Module.finrank K L * + Module.finrank L + (IntermediateField.extendScalars (show L ≤ L ⊔ K' from le_sup_left)) = + Module.finrank K L * Module.finrank K K' := by + calc + Module.finrank K L * + Module.finrank L + (IntermediateField.extendScalars (show L ≤ L ⊔ K' from le_sup_left)) = + Module.finrank K (L ⊔ K' : IntermediateField K Ω) := hformula + _ = Module.finrank K L * Module.finrank K K' := hsup + exact Nat.mul_left_cancel (Module.finrank_pos (R := K) (M := L)) hmul + +/-- Common-top form of the degree equality for `L ⊔ K' / K'` under linear +disjointness. -/ +theorem sup_finrank_over_right_eq_left_of_linearDisjoint + (L K' : IntermediateField K Ω) + [FiniteDimensional K K'] + (hlin : L.LinearDisjoint K') : + Module.finrank K' (L ⊔ K' : IntermediateField K Ω) = + Module.finrank K L := by + have hformula : + Module.finrank K K' * + Module.finrank K' (L ⊔ K' : IntermediateField K Ω) = + Module.finrank K (L ⊔ K' : IntermediateField K Ω) := + Module.finrank_mul_finrank K K' (L ⊔ K' : IntermediateField K Ω) + have hsup := hlin.finrank_sup + have hmul : + Module.finrank K K' * + Module.finrank K' (L ⊔ K' : IntermediateField K Ω) = + Module.finrank K K' * Module.finrank K L := by + calc + Module.finrank K K' * + Module.finrank K' (L ⊔ K' : IntermediateField K Ω) = + Module.finrank K (L ⊔ K' : IntermediateField K Ω) := hformula + _ = Module.finrank K L * Module.finrank K K' := hsup + _ = Module.finrank K K' * Module.finrank K L := by rw [mul_comm] + exact Nat.mul_left_cancel (Module.finrank_pos (R := K) (M := K')) hmul + +/-- Common-top form of the degree equality for `L ⊔ K' / L` under linear +disjointness. -/ +theorem sup_finrank_over_left_eq_right_of_linearDisjoint + (L K' : IntermediateField K Ω) + [FiniteDimensional K L] + (hlin : L.LinearDisjoint K') : + Module.finrank L (L ⊔ K' : IntermediateField K Ω) = + Module.finrank K K' := by + have hformula : + Module.finrank K L * + Module.finrank L (L ⊔ K' : IntermediateField K Ω) = + Module.finrank K (L ⊔ K' : IntermediateField K Ω) := + Module.finrank_mul_finrank K L (L ⊔ K' : IntermediateField K Ω) + have hsup := hlin.finrank_sup + have hmul : + Module.finrank K L * + Module.finrank L (L ⊔ K' : IntermediateField K Ω) = + Module.finrank K L * Module.finrank K K' := by + calc + Module.finrank K L * + Module.finrank L (L ⊔ K' : IntermediateField K Ω) = + Module.finrank K (L ⊔ K' : IntermediateField K Ω) := hformula + _ = Module.finrank K L * Module.finrank K K' := hsup + exact Nat.mul_left_cancel (Module.finrank_pos (R := K) (M := L)) hmul + +/-- Coprime-degree form of the degree equality for `L K' / K'`. -/ +theorem compositum_finrank_over_right_eq_left_of_finrank_coprime + (L K' : IntermediateField K Ω) + [FiniteDimensional K K'] + (hcop : Nat.Coprime (Module.finrank K L) (Module.finrank K K')) : + Module.finrank K' + (IntermediateField.extendScalars (show K' ≤ L ⊔ K' from le_sup_right)) = + Module.finrank K L := + compositum_finrank_over_right_eq_left_of_linearDisjoint L K' + (linearDisjoint_of_finrank_coprime L K' hcop) + +/-- Coprime-degree form of the degree equality for `L K' / L`. -/ +theorem compositum_finrank_over_left_eq_right_of_finrank_coprime + (L K' : IntermediateField K Ω) + [FiniteDimensional K L] + (hcop : Nat.Coprime (Module.finrank K L) (Module.finrank K K')) : + Module.finrank L + (IntermediateField.extendScalars (show L ≤ L ⊔ K' from le_sup_left)) = + Module.finrank K K' := + compositum_finrank_over_left_eq_right_of_linearDisjoint L K' + (linearDisjoint_of_finrank_coprime L K' hcop) + +/-- Common-top coprime-degree form of the degree equality for `L ⊔ K' / K'`. -/ +theorem sup_finrank_over_right_eq_left_of_finrank_coprime + (L K' : IntermediateField K Ω) + [FiniteDimensional K L] [FiniteDimensional K K'] + (hcop : Nat.Coprime (Module.finrank K L) (Module.finrank K K')) : + Module.finrank K' (L ⊔ K' : IntermediateField K Ω) = + Module.finrank K L := + sup_finrank_over_right_eq_left_of_linearDisjoint L K' + (linearDisjoint_of_finrank_coprime L K' hcop) + +/-- Common-top coprime-degree form of the degree equality for `L ⊔ K' / L`. -/ +theorem sup_finrank_over_left_eq_right_of_finrank_coprime + (L K' : IntermediateField K Ω) + [FiniteDimensional K L] [FiniteDimensional K K'] + (hcop : Nat.Coprime (Module.finrank K L) (Module.finrank K K')) : + Module.finrank L (L ⊔ K' : IntermediateField K Ω) = + Module.finrank K K' := + sup_finrank_over_left_eq_right_of_linearDisjoint L K' + (linearDisjoint_of_finrank_coprime L K' hcop) + +/-- Field-level source for unramified base change: after arbitrary +base change `K'/K`, the common top `L ⊔ K'` is separable over `K'` as soon as +`L/K` is separable. + +This uses formal unramifiedness of separable field extensions, stability under +base change, and the surjective product map `K' ⊗_K L -> L ⊔ K'`. -/ +theorem isSeparable_sup_over_right_of_left + (L K' : IntermediateField K Ω) + [FiniteDimensional K L] + [Algebra.IsSeparable K L] : + Algebra.IsSeparable K' (L ⊔ K' : IntermediateField K Ω) := by + have : Algebra.FormallyUnramified K L := + Algebra.FormallyUnramified.of_isSeparable K L + have hsurj : Function.Surjective + (supFlipProductMapRightAlgHom (K := K) (Ω := Ω) L K') := + supFlipProductMapRightAlgHom_surjective (K := K) (Ω := Ω) L K' + have : Algebra.FormallyUnramified K' + (L ⊔ K' : IntermediateField K Ω) := + Algebra.FormallyUnramified.of_surjective + (R := K') (A := K' ⊗[K] L) + (B := (L ⊔ K' : IntermediateField K Ω)) + (supFlipProductMapRightAlgHom (K := K) (Ω := Ω) L K') + hsurj + have : Algebra.EssFiniteType K' + (L ⊔ K' : IntermediateField K Ω) := by + have : FiniteDimensional K' (L ⊔ K' : IntermediateField K Ω) := + finiteDimensional_sup_over_right_of_left (K := K) (Ω := Ω) L K' + infer_instance + exact Algebra.FormallyUnramified.isSeparable K' + (L ⊔ K' : IntermediateField K Ω) + +/-- The compositum is separable over the right factor after arbitrary finite +base change, provided the left factor is separable over the base. -/ +theorem isSeparable_compositum_over_right + (L K' : IntermediateField K Ω) + [FiniteDimensional K L] [FiniteDimensional K K'] + [Algebra.IsSeparable K L] : + Algebra.IsSeparable K' + (IntermediateField.extendScalars (show K' ≤ L ⊔ K' from le_sup_right)) := by + change Algebra.IsSeparable K' (L ⊔ K' : IntermediateField K Ω) + exact isSeparable_sup_over_right_of_left L K' + +/-- Symmetric separability statement for the compositum over the left factor. -/ +theorem isSeparable_compositum_over_left + (L K' : IntermediateField K Ω) + [Algebra.IsSeparable K L] [Algebra.IsSeparable K K'] : + Algebra.IsSeparable L + (IntermediateField.extendScalars (show L ≤ L ⊔ K' from le_sup_left)) := by + have : Algebra.IsSeparable K + (IntermediateField.extendScalars (show L ≤ L ⊔ K' from le_sup_left)) := by + change Algebra.IsSeparable K + ((IntermediateField.extendScalars + (show L ≤ L ⊔ K' from le_sup_left)).restrictScalars K) + rw [IntermediateField.extendScalars_restrictScalars] + infer_instance + exact Algebra.isSeparable_tower_top_of_isSeparable K L + (IntermediateField.extendScalars (show L ≤ L ⊔ K' from le_sup_left)) + +/-- The common top field is separable over the right factor after arbitrary +finite base change, provided the left factor is separable over the base. -/ +theorem isSeparable_sup_over_right + (L K' : IntermediateField K Ω) + [FiniteDimensional K L] [FiniteDimensional K K'] + [Algebra.IsSeparable K L] : + Algebra.IsSeparable K' (L ⊔ K' : IntermediateField K Ω) := by + exact isSeparable_sup_over_right_of_left L K' + +/-- The common top field is separable over the left factor when both factors +are separable over the base. -/ +theorem isSeparable_sup_over_left + (L K' : IntermediateField K Ω) + [Algebra.IsSeparable K L] [Algebra.IsSeparable K K'] : + Algebra.IsSeparable L (L ⊔ K' : IntermediateField K Ω) := by + exact Algebra.isSeparable_tower_top_of_isSeparable K L + (L ⊔ K' : IntermediateField K Ω) + +end FieldCompositum +end DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Extensions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Extensions.lean new file mode 100644 index 0000000000..1f307c849c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Extensions.lean @@ -0,0 +1,506 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ResidueField +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete +public import Mathlib.RingTheory.Valuation.Extension +public import Mathlib.RingTheory.RamificationInertia.Basic +public import Mathlib.NumberTheory.RamificationInertia.Inertia +public import Mathlib.NumberTheory.RamificationInertia.Ramification +public import Mathlib.LinearAlgebra.FiniteDimensional.Basic +public import Mathlib.Algebra.Group.Units.Hom + +/-! # Extensions -/ + +@[expose] public section +namespace ValuationTheory + +/-! +# Finite extensions of discretely valued fields + +The extension relation is ambient data: an algebra, finite-dimensionality, and +mathlib's `Valuation.HasExtension` property. There is deliberately no +proof-irrelevant marker object. All invariants and maps are defined once for +`DVF` values and can therefore be used unchanged for Henselian and complete +discretely valued fields through their canonical `toDVF` projections. +-/ + +noncomputable +section + +universe u v w x + +namespace DiscreteValuationField +namespace ValuedExtension + +variable {K : Type u} {L : Type w} [Field K] [Field L] +variable [Algebra K L] [FiniteDimensional K L] +variable (base : DVF.{u, v} K) (target : DVF.{w, x} L) +variable [base.valuation.HasExtension target.valuation] + +/-- The field degree of a finite valued extension. -/ +def degree (_base : DVF.{u, v} K) (_target : DVF.{w, x} L) : ℕ := + Module.finrank K L + +omit [FiniteDimensional K L] + [base.valuation.HasExtension target.valuation] in +/-- The degree of a finite extension of discrete valuation fields is its linear `finrank`. -/ +@[simp] theorem degree_eq_finrank : + degree base target = Module.finrank K L := + rfl + +/-- The canonical ramification index of the target maximal ideal over the +base maximal ideal. -/ +noncomputable def ramificationIndex : ℕ := + Ideal.ramificationIdx' + (base.maximalIdeal : Ideal base.valuationSubring) + (target.maximalIdeal : Ideal target.valuationSubring) + +/-- The canonical residue degree of the target maximal ideal over the base +maximal ideal. -/ +noncomputable def residueDegree : ℕ := + (target.maximalIdeal : Ideal target.valuationSubring).inertiaDeg + base.valuationSubring + +/-- The induced map between valuation subrings. -/ +def integerMap : + base.valuationSubring →+* target.valuationSubring := + algebraMap base.valuationSubring target.valuationSubring + +omit [FiniteDimensional K L] in +/-- The induced map between valuation subrings is injective. -/ +theorem integerMap_injective : + Function.Injective (integerMap base target) := by + change Function.Injective + (algebraMap base.valuation.valuationSubring + target.valuation.valuationSubring) + exact _root_.Valuation.HasExtension.algebraMap_injective + (vK := base.valuation) (vA := target.valuation) + +omit [FiniteDimensional K L] in +/-- The valuation-subring map evaluates through the ambient algebra map. -/ +@[simp] theorem integerMap_apply (a : base.valuationSubring) : + (((integerMap base target) a : target.valuationSubring) : L) = + algebraMap K L (a : K) := by + change ((algebraMap base.valuation.valuationSubring + target.valuation.valuationSubring) a : L) = algebraMap K L (a : K) + rfl + +omit [FiniteDimensional K L] in +/-- Elementwise form of valuation-ring pullback along the field algebra map. -/ +theorem algebraMap_mem_valuationSubring_iff (a : K) : + algebraMap K L a ∈ target.valuation.valuationSubring ↔ + a ∈ base.valuation.valuationSubring := by + rw [target.mem_valuationSubring_iff, base.mem_valuationSubring_iff] + exact _root_.Valuation.HasExtension.val_map_le_one_iff + (vR := base.valuation) (vA := target.valuation) a + +omit [FiniteDimensional K L] in +/-- Maximal-ideal membership is reflected by a valued extension. -/ +theorem integerMap_mem_maximalIdeal_iff (a : base.valuationSubring) : + integerMap base target a ∈ target.maximalIdeal ↔ + a ∈ base.maximalIdeal := by + rw [target.mem_maximalIdeal_iff (integerMap base target a), + base.mem_maximalIdeal_iff a, integerMap_apply base target a] + exact _root_.Valuation.HasExtension.val_map_lt_one_iff + (vR := base.valuation) (vA := target.valuation) (a : K) + +omit [FiniteDimensional K L] in +/-- Nonmembership in the maximal ideal is reflected by a valued extension. -/ +theorem integerMap_not_mem_maximalIdeal_iff (a : base.valuationSubring) : + integerMap base target a ∉ target.maximalIdeal ↔ + a ∉ base.maximalIdeal := + not_congr (integerMap_mem_maximalIdeal_iff base target a) + +omit [FiniteDimensional K L] in +/-- The integer map of a valued extension preserves and reflects units. -/ +theorem integerMap_isUnit_iff (a : base.valuationSubring) : + IsUnit (integerMap base target a) ↔ IsUnit a := by + rw [← IsLocalRing.notMem_maximalIdeal, + ← IsLocalRing.notMem_maximalIdeal] + exact integerMap_not_mem_maximalIdeal_iff base target a + +omit [FiniteDimensional K L] in +/-- The target maximal ideal pulls back to the base maximal ideal. -/ +theorem maximalIdeal_comap_integerMap_eq : + target.maximalIdeal.comap (integerMap base target) = + base.maximalIdeal := by + ext a + exact integerMap_mem_maximalIdeal_iff base target a + +omit [FiniteDimensional K L] in +/-- The image of the source maximal ideal in the target valuation ring is nonzero. -/ +theorem maximalIdeal_map_integerMap_ne_bot : + Ideal.map (integerMap base target) base.maximalIdeal ≠ ⊥ := by + intro h + exact base.maximalIdeal_ne_bot + ((Ideal.map_eq_bot_iff_of_injective + (integerMap_injective base target)).1 h) + +omit [FiniteDimensional K L] in +/-- The source maximal ideal maps into the target maximal ideal. -/ +theorem maximalIdeal_map_integerMap_le : + Ideal.map (integerMap base target) base.maximalIdeal ≤ + target.maximalIdeal := by + rw [Ideal.map_le_iff_le_comap, + maximalIdeal_comap_integerMap_eq base target] + +/- A valued extension preserves the residue-field characteristic. -/ +omit [FiniteDimensional K L] in +/-- Residue fields connected by a valued extension have the same ring characteristic. -/ +theorem residueField_ringChar_eq_of_hasExtension : + ringChar target.residueField = ringChar base.residueField := + (Algebra.ringChar_eq base.residueField target.residueField).symm + +/-- The induced map on residue fields. -/ +def residueMap : + base.residueField →+* target.residueField := + algebraMap base.residueField target.residueField + +omit [FiniteDimensional K L] in +/-- The residue-field map sends the residue of an integer to its target residue. -/ +@[simp] theorem residueMap_residue (a : base.valuationSubring) : + residueMap base target (base.residueMap a) = + target.residueMap (integerMap base target a) := by + change + (algebraMap + (_root_.IsLocalRing.ResidueField base.valuation.valuationSubring) + (_root_.IsLocalRing.ResidueField target.valuation.valuationSubring)) + (_root_.IsLocalRing.residue base.valuation.valuationSubring a) = + _root_.IsLocalRing.residue target.valuation.valuationSubring + ((algebraMap base.valuation.valuationSubring + target.valuation.valuationSubring) a) + rfl + +omit [FiniteDimensional K L] in +/-- The residue-field map of a valued extension is injective. -/ +theorem residueMap_injective : + Function.Injective (residueMap base target) := by + change Function.Injective + (algebraMap + (_root_.IsLocalRing.ResidueField base.valuation.valuationSubring) + (_root_.IsLocalRing.ResidueField target.valuation.valuationSubring)) + rw [ValuationTheory.DiscreteValuationField.ResidueField.algebraMap_eq_map_algebraMap] + exact ValuationTheory.DiscreteValuationField.ResidueField.map_algebraMap_injective + +omit [FiniteDimensional K L] in +/-- The residue-field map of a valued extension has trivial kernel. -/ +theorem residueMap_eq_zero_iff (z : base.residueField) : + residueMap base target z = 0 ↔ z = 0 := by + constructor + · intro hz + exact residueMap_injective base target (by simpa using hz) + · rintro rfl + exact map_zero (residueMap base target) + +omit [FiniteDimensional K L] in +/-- Nonzero residue classes remain nonzero after mapping. -/ +theorem residueMap_ne_zero_iff (z : base.residueField) : + residueMap base target z ≠ 0 ↔ z ≠ 0 := + not_congr (residueMap_eq_zero_iff base target z) + +omit [FiniteDimensional K L] in +/-- Equality of base residue classes can be checked after mapping. -/ +theorem residueMap_eq_iff (a b : base.residueField) : + residueMap base target a = residueMap base target b ↔ a = b := by + constructor + · intro h + exact residueMap_injective base target h + · rintro rfl + rfl + +omit [FiniteDimensional K L] in +/-- The residue-field map reflects the unit element. -/ +theorem residueMap_eq_one_iff (a : base.residueField) : + residueMap base target a = 1 ↔ a = 1 := by + rw [← map_one (residueMap base target), + residueMap_eq_iff base target a 1] + +omit [FiniteDimensional K L] in +/-- Surjectivity of the residue map upgrades its canonical injectivity to +bijectivity. -/ +theorem residueMap_bijective_of_surjective + (hSurj : Function.Surjective (residueMap base target)) : + Function.Bijective (residueMap base target) := + ⟨residueMap_injective base target, hSurj⟩ + +omit [FiniteDimensional K L] in +/-- The residue-field isomorphism attached to a surjective residue map. -/ +noncomputable def residueFieldEquivOfSurjective + (hSurj : Function.Surjective (residueMap base target)) : + base.residueField ≃+* target.residueField := + RingEquiv.ofBijective (residueMap base target) + (residueMap_bijective_of_surjective base target hSurj) + +omit [FiniteDimensional K L] in +/-- The residue-field equivalence induced by surjectivity evaluates by the residue map. -/ +@[simp] theorem residueFieldEquivOfSurjective_apply + (hSurj : Function.Surjective (residueMap base target)) + (z : base.residueField) : + residueFieldEquivOfSurjective base target hSurj z = + residueMap base target z := + rfl + +omit [FiniteDimensional K L] in +/-- The inverse residue-field equivalence recovers a source class after applying the residue map. -/ +@[simp] theorem residueFieldEquivOfSurjective_symm_apply_residueMap + (hSurj : Function.Surjective (residueMap base target)) + (z : base.residueField) : + (residueFieldEquivOfSurjective base target hSurj).symm + (residueMap base target z) = z := by + simpa using + (residueFieldEquivOfSurjective base target hSurj).symm_apply_apply z + +omit [FiniteDimensional K L] in +/-- Applying the residue map after the inverse residue-field equivalence recovers +the target class. -/ +@[simp] theorem residueMap_residueFieldEquivOfSurjective_symm_apply + (hSurj : Function.Surjective (residueMap base target)) + (z : target.residueField) : + residueMap base target + ((residueFieldEquivOfSurjective base target hSurj).symm z) = z := + (residueFieldEquivOfSurjective base target hSurj).apply_symm_apply z + +omit [FiniteDimensional K L] in +/-- Zero of a mapped residue class is exactly base maximal-ideal membership. -/ +theorem residueMap_residue_eq_zero_iff (a : base.valuationSubring) : + residueMap base target (base.residueMap a) = 0 ↔ + a ∈ base.maximalIdeal := by + rw [residueMap_eq_zero_iff base target, + base.residue_eq_zero_iff] + +omit [FiniteDimensional K L] in +/-- Nonzero of a mapped residue class is exactly nonmembership in the base +maximal ideal. -/ +theorem residueMap_residue_ne_zero_iff (a : base.valuationSubring) : + residueMap base target (base.residueMap a) ≠ 0 ↔ + a ∉ base.maximalIdeal := + not_congr (residueMap_residue_eq_zero_iff base target a) + +omit [FiniteDimensional K L] in +/-- Nonzero of a mapped residue class is exactly unitness of its +representative. -/ +theorem residueMap_residue_ne_zero_iff_isUnit + (a : base.valuationSubring) : + residueMap base target (base.residueMap a) ≠ 0 ↔ IsUnit a := + (residueMap_residue_ne_zero_iff base target a).trans + (IsLocalRing.notMem_maximalIdeal (x := a)) + +omit [FiniteDimensional K L] in +/-- Equality of mapped residue classes is equality in the base residue field. -/ +theorem residueMap_residue_eq_iff (a b : base.valuationSubring) : + residueMap base target (base.residueMap a) = + residueMap base target (base.residueMap b) ↔ + base.residueMap a = base.residueMap b := + residueMap_eq_iff base target (base.residueMap a) (base.residueMap b) + +omit [FiniteDimensional K L] in +/-- Congruence criterion comparing a mapped base residue with a target +representative. -/ +theorem residueMap_residue_eq_target_residue_iff_sub_mem_maximalIdeal + (a : base.valuationSubring) (b : target.valuationSubring) : + residueMap base target (base.residueMap a) = target.residueMap b ↔ + integerMap base target a - b ∈ target.maximalIdeal := by + rw [residueMap_residue base target] + exact + ValuationTheory.DiscreteValuationField.ResidueField.residue_eq_residue_iff_sub_mem_maximalIdeal + (R := target.valuationSubring) (integerMap base target a) b + +omit [FiniteDimensional K L] in +/-- Opposite-orientation form of the target congruence criterion. -/ +theorem target_residue_eq_residueMap_residue_iff_sub_mem_maximalIdeal + (b : target.valuationSubring) (a : base.valuationSubring) : + target.residueMap b = residueMap base target (base.residueMap a) ↔ + b - integerMap base target a ∈ target.maximalIdeal := by + rw [residueMap_residue base target] + exact + ValuationTheory.DiscreteValuationField.ResidueField.residue_eq_residue_iff_sub_mem_maximalIdeal + (R := target.valuationSubring) b (integerMap base target a) + +omit [FiniteDimensional K L] in +/-- Target-residue form of zero detection for a mapped base integer. -/ +theorem target_residue_integerMap_eq_zero_iff + (a : base.valuationSubring) : + target.residueMap (integerMap base target a) = 0 ↔ + a ∈ base.maximalIdeal := by + rw [← residueMap_residue base target a, + residueMap_residue_eq_zero_iff base target] + +omit [FiniteDimensional K L] in +/-- Target-residue form of nonzero detection for a mapped base integer. -/ +theorem target_residue_integerMap_ne_zero_iff + (a : base.valuationSubring) : + target.residueMap (integerMap base target a) ≠ 0 ↔ + a ∉ base.maximalIdeal := + not_congr (target_residue_integerMap_eq_zero_iff base target a) + +omit [FiniteDimensional K L] in +/-- A mapped base integer has nonzero target residue exactly when it is a +unit in the base valuation ring. -/ +theorem target_residue_integerMap_ne_zero_iff_isUnit + (a : base.valuationSubring) : + target.residueMap (integerMap base target a) ≠ 0 ↔ IsUnit a := + (target_residue_integerMap_ne_zero_iff base target a).trans + (IsLocalRing.notMem_maximalIdeal (x := a)) + +omit [FiniteDimensional K L] in +/-- A mapped base integer has nonzero target residue exactly when its image is +a unit. -/ +theorem target_residue_integerMap_ne_zero_iff_integerMap_isUnit + (a : base.valuationSubring) : + target.residueMap (integerMap base target a) ≠ 0 ↔ + IsUnit (integerMap base target a) := + target.residue_ne_zero_iff_isUnit (integerMap base target a) + +omit [FiniteDimensional K L] in +/-- Nonzero residue is preserved and reflected by the integer map. -/ +theorem target_residue_integerMap_ne_zero_iff_base_residue_ne_zero + (a : base.valuationSubring) : + target.residueMap (integerMap base target a) ≠ 0 ↔ + base.residueMap a ≠ 0 := + (target_residue_integerMap_ne_zero_iff_isUnit base target a).trans + (base.residue_ne_zero_iff_isUnit a).symm + +omit [FiniteDimensional K L] in +/-- A mapped valuation-ring element is a unit exactly when its target residue is nonzero. -/ +theorem integerMap_isUnit_iff_target_residue_integerMap_ne_zero + (a : base.valuationSubring) : + IsUnit (integerMap base target a) ↔ + target.residueMap (integerMap base target a) ≠ 0 := + (target_residue_integerMap_ne_zero_iff_integerMap_isUnit + base target a).symm + +omit [FiniteDimensional K L] in +/-- A mapped valuation-ring element is a unit exactly when its source residue is nonzero. -/ +theorem integerMap_isUnit_iff_base_residue_ne_zero + (a : base.valuationSubring) : + IsUnit (integerMap base target a) ↔ base.residueMap a ≠ 0 := + (integerMap_isUnit_iff base target a).trans + (base.residue_ne_zero_iff_isUnit a).symm + +omit [FiniteDimensional K L] in +/-- Equality of target residues of mapped base integers is equality of their +base residues. -/ +theorem target_residue_integerMap_eq_iff + (a b : base.valuationSubring) : + target.residueMap (integerMap base target a) = + target.residueMap (integerMap base target b) ↔ + base.residueMap a = base.residueMap b := by + rw [← residueMap_residue base target a, + ← residueMap_residue base target b, + residueMap_residue_eq_iff base target] + +omit [FiniteDimensional K L] in +/-- A mapped integer has target residue one exactly when its source residue is one. -/ +theorem target_residue_integerMap_eq_one_iff_base_residue_eq_one + (a : base.valuationSubring) : + target.residueMap (integerMap base target a) = 1 ↔ + base.residueMap a = 1 := by + rw [← residueMap_residue base target a, + residueMap_eq_one_iff base target] + +/-- The induced map on unit groups of valuation rings. -/ +def unitMap : + base.valuationSubringˣ →* target.valuationSubringˣ := + Units.map (integerMap base target).toMonoidHom + +omit [FiniteDimensional K L] in +/-- The induced unit map agrees with the valuation-ring map on underlying elements. -/ +@[simp] theorem unitMap_apply (a : base.valuationSubringˣ) : + ((unitMap base target a : target.valuationSubringˣ) : + target.valuationSubring) = + integerMap base target (a : base.valuationSubring) := + rfl + +omit [FiniteDimensional K L] in +/-- The induced map on residue-field units is injective. -/ +theorem residueUnitsMap_injective : + Function.Injective + (Units.map (residueMap base target).toMonoidHom) := + Units.map_injective (residueMap_injective base target) + +omit [FiniteDimensional K L] in +/-- Surjectivity of the residue map implies surjectivity on residue-field units. -/ +theorem residueUnitsMap_surjective_of_residueMap_surjective + (hSurj : Function.Surjective (residueMap base target)) : + Function.Surjective + (Units.map (residueMap base target).toMonoidHom) := by + intro y + obtain ⟨z, hz⟩ := hSurj (y : target.residueField) + have hz0 : z ≠ 0 := by + intro h + exact y.ne_zero (by simpa [h] using hz.symm) + refine ⟨Units.mk0 z hz0, ?_⟩ + apply Units.ext + simpa using hz + +omit [FiniteDimensional K L] in +/-- A surjective residue map induces a bijection on residue-field units. -/ +theorem residueUnitsMap_bijective_of_residueMap_surjective + (hSurj : Function.Surjective (residueMap base target)) : + Function.Bijective + (Units.map (residueMap base target).toMonoidHom) := + ⟨residueUnitsMap_injective base target, + residueUnitsMap_surjective_of_residueMap_surjective base target hSurj⟩ + +omit [FiniteDimensional K L] in +/-- The unit-group equivalence induced by a surjective residue map. -/ +noncomputable def residueUnitsEquivOfResidueMapSurjective + (hSurj : Function.Surjective (residueMap base target)) : + base.residueFieldˣ ≃* target.residueFieldˣ := + MulEquiv.ofBijective (Units.map (residueMap base target).toMonoidHom) + (residueUnitsMap_bijective_of_residueMap_surjective + base target hSurj) + +omit [FiniteDimensional K L] in +/-- The residue-unit equivalence evaluates by the induced residue-unit map. -/ +@[simp] theorem residueUnitsEquivOfResidueMapSurjective_apply + (hSurj : Function.Surjective (residueMap base target)) + (a : base.residueFieldˣ) : + residueUnitsEquivOfResidueMapSurjective base target hSurj a = + Units.map (residueMap base target).toMonoidHom a := + rfl + +omit [FiniteDimensional K L] in +/-- The residue-field equivalence sends a source residue to the corresponding target residue. -/ +theorem residueFieldEquivOfSurjective_apply_residue + (hSurj : Function.Surjective (residueMap base target)) + (a : base.valuationSubring) : + residueFieldEquivOfSurjective base target hSurj (base.residueMap a) = + target.residueMap (integerMap base target a) := by + rw [residueFieldEquivOfSurjective_apply, + residueMap_residue] + +omit [FiniteDimensional K L] in +/-- The inverse residue-field equivalence sends a target residue back to its source residue. -/ +@[simp] theorem residueFieldEquivOfSurjective_symm_apply_target_residue + (hSurj : Function.Surjective (residueMap base target)) + (a : base.valuationSubring) : + (residueFieldEquivOfSurjective base target hSurj).symm + (target.residueMap (integerMap base target a)) = + base.residueMap a := by + rw [← residueMap_residue base target, + residueFieldEquivOfSurjective_symm_apply_residueMap] + +/-- Unramified means that the canonical ramification index is one. -/ +def IsUnramified : Prop := + ramificationIndex base target = 1 + +/-- Totally ramified means that the canonical residue degree is one. -/ +def IsTotallyRamified : Prop := + residueDegree base target = 1 + +/-- Defectlessness is the exact fundamental equality. -/ +def IsDefectless : Prop := + degree base target = + ramificationIndex base target * residueDegree base target + +end ValuedExtension +end DiscreteValuationField +end +end ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension.lean new file mode 100644 index 0000000000..705ac5b51f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Defectless +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Degree +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean new file mode 100644 index 0000000000..e3bc4ef06b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean @@ -0,0 +1,775 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Degree +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness +/-! Provides the public declarations in the + `ValuationTheory.DiscreteValuationField.FiniteExtension` Lean module. -/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + integralClosureValuationSubringOfMemOrInv → + integralClosureValuationSubringOfMemOrInv + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + integralClosureValuationSubringOfMemOrInv_hasExtension → + integralClosureValuationSubringOfMemOrInv_hasExtension + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + integralClosureValuationSubringOfMemOrInv_isIntegralClosure → + integralClosureValuationSubringOfMemOrInv_isIntegralClosure + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + integralClosureValuationSubringOfMemOrInv_pullback → + integralClosureValuationSubringOfMemOrInv_pullback + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + integralClosure_mem_valuationSubring_of_hasExtension → + integralClosure_mem_valuationSubring_of_hasExtension + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + valuationSubring_eq_of_le_of_idealOfLE_eq_maximalIdeal → + valuationSubring_eq_of_le_of_idealOfLE_eq_maximalIdeal + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + valuationSubring_mem_integralClosure_of_isIntegral → + valuationSubring_mem_integralClosure_of_isIntegral + +open _root_.ValuationTheory.DiscreteValuationField renaming + henselianRing_map_algebraMap_of_moduleFinite_of_isAdicComplete → + henselianRing_map_algebraMap_of_moduleFinite_of_isAdicComplete + + +namespace ValuationTheory + +noncomputable +section + +universe u v w x y + +namespace DiscreteValuationField + +namespace ValuedExtension.Henselian + +variable {K : Type u} {L : Type w} [Field K] [Field L] +variable [Algebra K L] [FiniteDimensional K L] +variable (base : HenselianDVF.{u, v} K) (target : HenselianDVF.{w, x} L) +variable [base.toDVF.valuation.HasExtension target.toDVF.valuation] + +/-- The canonical integer map from a Henselian base valuation ring to the +valuation subring constructed from the actual integral closure. -/ +def integralClosureValuationSubringIntegerMapOfMemOrInv + (base : HenselianDVF.{u, v} K) + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) : + base.valuationSubring →+* + integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval where + toFun a := + ⟨algebraMap K L (a : K), + (integralClosureValuationSubringOfMemOrInv_pullback + (L := L) base.toDVF.valuation hval (a : K)).2 a.2⟩ + map_zero' := by ext; simp + map_one' := by ext; simp + map_add' := by intro a b; ext; simp + map_mul' := by intro a b; ext; simp + +omit [FiniteDimensional K L] in +/-- The integer map into the integral-closure valuation ring is the ambient algebra map. -/ +@[simp] theorem integralClosureValuationSubringIntegerMapOfMemOrInv_apply + (base : HenselianDVF.{u, v} K) + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (a : base.valuationSubring) : + ((integralClosureValuationSubringIntegerMapOfMemOrInv + (K := K) (L := L) base hval a : + integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval) : L) = + algebraMap K L (a : K) := + rfl + +omit [FiniteDimensional K L] in +/-- The canonical integer map into the valuation subring built from the actual +integral closure is injective. -/ +theorem integralClosureValuationSubringIntegerMapOfMemOrInv_injective + (base : HenselianDVF.{u, v} K) + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) : + Function.Injective + (integralClosureValuationSubringIntegerMapOfMemOrInv + (K := K) (L := L) base hval) := by + intro a b hab + apply Subtype.ext + apply FaithfulSMul.algebraMap_injective K L + simpa using + congrArg + (fun x : + integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval => (x : L)) hab + +omit [FiniteDimensional K L] in +open ValuationTheory.DiscreteValuationField.Valuation renaming + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension → + integralClosureValuationSubring_le_of_hasExtension in +/-- The center of an extension valuation ring on the constructed actual +integral-closure valuation subring contracts to the base maximal ideal. -/ +theorem idealOfLE_comap_integralClosureValuationSubringIntegerMap_eq_maximalIdeal + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (base : HenselianDVF.{u, v} K) (vL : _root_.Valuation L ΓL) + [base.toDVF.valuation.HasExtension vL] + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) : + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval + let hvL_le : B ≤ vL.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.toDVF.valuation vL hval + (ValuationSubring.idealOfLE B vL.valuationSubring hvL_le).comap + (integralClosureValuationSubringIntegerMapOfMemOrInv + (K := K) (L := L) base hval) = + base.maximalIdeal := by + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval + let hvL_le : B ≤ vL.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.toDVF.valuation vL hval + let i : base.valuationSubring →+* B := + integralClosureValuationSubringIntegerMapOfMemOrInv + (K := K) (L := L) base hval + apply Ideal.ext + intro a + rw [Ideal.mem_comap] + change B.inclusion vL.valuationSubring hvL_le (i a) ∈ + IsLocalRing.maximalIdeal vL.valuationSubring ↔ + a ∈ IsLocalRing.maximalIdeal base.toDVF.valuation.valuationSubring + rw [Valuation.mem_maximalIdeal_iff (v := vL)] + rw [Valuation.mem_maximalIdeal_iff (v := base.toDVF.valuation)] + have hcoe : + ((B.inclusion vL.valuationSubring hvL_le (i a) : + vL.valuationSubring) : L) = + algebraMap K L (a : K) := by + rfl + rw [hcoe] + exact Valuation.HasExtension.val_map_lt_one_iff base.toDVF.valuation vL (a : K) + +/-- In a finite separable extension, once the actual integral closure has the +valuation-ring dichotomy, the constructed integral-closure valuation ring has a +unique prime over the base maximal ideal. -/ +theorem prime_eq_maximalIdeal_of_comap_integralClosureValuationSubringIntegerMap_eq_maximalIdeal + (base : HenselianDVF.{u, v} K) + [Algebra.IsSeparable K L] + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (P : + Ideal + (integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval)) + (hP : P.IsPrime) + (hcomap : + P.comap + (integralClosureValuationSubringIntegerMapOfMemOrInv + (K := K) (L := L) base hval) = + base.maximalIdeal) : + P = + IsLocalRing.maximalIdeal + (integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval) := by + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval + let i : base.valuationSubring →+* B := + integralClosureValuationSubringIntegerMapOfMemOrInv + (K := K) (L := L) base hval + let : base.toDVF.valuation.HasExtension B.valuation := + integralClosureValuationSubringOfMemOrInv_hasExtension + (L := L) base.toDVF.valuation hval + let : IsFractionRing base.valuationSubring K := + base.toDVF.valuationSubring_isFractionRing + let : IsDiscreteValuationRing base.valuationSubring := + base.valuationSubring_isDiscreteValuationRing + let : IsDedekindDomain base.valuationSubring := inferInstance + let : Algebra base.valuationSubring B := RingHom.toAlgebra i + let : IsScalarTower base.valuationSubring B L := + IsScalarTower.of_algebraMap_eq (by + intro a + rfl) + let : IsIntegralClosure B base.valuationSubring L := + integralClosureValuationSubringOfMemOrInv_isIntegralClosure + (L := L) base.toDVF.valuation hval + let : IsDedekindDomain B := + IsIntegralClosure.isDedekindDomain base.valuationSubring K L B + have hi : Function.Injective i := + integralClosureValuationSubringIntegerMapOfMemOrInv_injective + (K := K) (L := L) base hval + have hP_ne_bot : P ≠ ⊥ := by + have hnot_le_bot : ¬ base.maximalIdeal ≤ ⊥ := by + intro hle + exact base.maximalIdeal_ne_bot (le_antisymm hle bot_le) + obtain ⟨a, ha_max, ha_not_bot⟩ := Set.not_subset.mp hnot_le_bot + have ha_ne_zero : a ≠ 0 := by + intro ha + exact ha_not_bot (by simp [ha]) + intro hPbot + have ha_comap : a ∈ P.comap i := by + simpa [B, i, hcomap] using ha_max + have hai_mem : i a ∈ P := by + simpa [Ideal.mem_comap] using ha_comap + have hai_zero : i a = 0 := by + simpa [hPbot] using hai_mem + exact ha_ne_zero (hi (by simpa using hai_zero)) + exact IsLocalRing.eq_maximalIdeal (hP.isMaximal hP_ne_bot) + +omit [FiniteDimensional K L] in +open ValuationTheory.DiscreteValuationField.Valuation renaming + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension → + integralClosureValuationSubring_le_of_hasExtension in +/-- Center-equality form of Henselian-DVF valuation uniqueness after the actual +integral closure has been turned into a valuation subring. -/ +theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_center_eq_maximalIdeal + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (htargetCenter : + ValuationSubring.idealOfLE + (integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval) + target.toDVF.valuation.valuationSubring + (integralClosureValuationSubring_le_of_hasExtension + (L := L) base.toDVF.valuation target.toDVF.valuation hval) = + IsLocalRing.maximalIdeal + (integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval)) + (hcenter : + ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.toDVF.valuation.HasExtension v'], + ValuationSubring.idealOfLE + (integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval) + v'.valuationSubring + (integralClosureValuationSubring_le_of_hasExtension + (L := L) base.toDVF.valuation v' hval) = + IsLocalRing.maximalIdeal + (integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval)) : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target := by + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval + have htarget_le : B ≤ target.toDVF.valuation.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.toDVF.valuation target.toDVF.valuation hval + have htarget_eq : target.toDVF.valuation.valuationSubring = B := + valuationSubring_eq_of_le_of_idealOfLE_eq_maximalIdeal + B target.toDVF.valuation.valuationSubring htarget_le + (by simpa [B, htarget_le] using htargetCenter) + intro Gamma' _ v' hExt + let : base.toDVF.valuation.HasExtension v' := hExt + have hv_le : B ≤ v'.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.toDVF.valuation v' hval + have hv_eq : v'.valuationSubring = B := + valuationSubring_eq_of_le_of_idealOfLE_eq_maximalIdeal + B v'.valuationSubring hv_le + (by simpa [B, hv_le] using (@hcenter Gamma' inferInstance v' hExt)) + have hSubring : target.toDVF.valuation.valuationSubring = v'.valuationSubring := + htarget_eq.trans hv_eq.symm + exact HenselianDVF.valuation_isEquiv_of_valuationSubring_eq base target v' hSubring + +omit [FiniteDimensional K L] in +open ValuationTheory.DiscreteValuationField.Valuation renaming + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension → + integralClosureValuationSubring_le_of_hasExtension in +/-- Prime-uniqueness form of Henselian-DVF valuation uniqueness. -/ +theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_unique_primes_over_base_maximal + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (hunique : + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval + let i : base.valuationSubring →+* B := + integralClosureValuationSubringIntegerMapOfMemOrInv + (K := K) (L := L) base hval + ∀ P : Ideal B, P.IsPrime → P.comap i = base.maximalIdeal → + P = IsLocalRing.maximalIdeal B) : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target := by + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval + let i : base.valuationSubring →+* B := + integralClosureValuationSubringIntegerMapOfMemOrInv + (K := K) (L := L) base hval + refine + (hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_center_eq_maximalIdeal + (K := K) (L := L) (base := base) (target := target) hval ?_ ?_ : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target) + · let htarget_le : B ≤ target.toDVF.valuation.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.toDVF.valuation target.toDVF.valuation hval + exact hunique + (ValuationSubring.idealOfLE B target.toDVF.valuation.valuationSubring htarget_le) + (by infer_instance) + (by + simpa [B, htarget_le, i] using + idealOfLE_comap_integralClosureValuationSubringIntegerMap_eq_maximalIdeal + (K := K) (L := L) base target.toDVF.valuation hval) + · intro Gamma' _ v' hExt + let : base.toDVF.valuation.HasExtension v' := hExt + let hv_le : B ≤ v'.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.toDVF.valuation v' hval + exact hunique + (ValuationSubring.idealOfLE B v'.valuationSubring hv_le) + (by infer_instance) + (by + simpa [B, hv_le, i] using + idealOfLE_comap_integralClosureValuationSubringIntegerMap_eq_maximalIdeal + (K := K) (L := L) base v' hval) + +/-- Finite-separable Henselian-DVF uniqueness once the actual integral closure +has the valuative dichotomy. -/ +theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv + [Algebra.IsSeparable K L] + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target := + (hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_unique_primes_over_base_maximal + base target) + hval + (by + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval + let i : base.valuationSubring →+* B := + integralClosureValuationSubringIntegerMapOfMemOrInv + (K := K) (L := L) base hval + change ∀ P : Ideal B, P.IsPrime → P.comap i = base.maximalIdeal → + P = IsLocalRing.maximalIdeal B + intro P hP hcomap + exact + prime_eq_maximalIdeal_of_comap_integralClosureValuationSubringIntegerMap_eq_maximalIdeal + (K := K) (L := L) (base := base) hval P hP hcomap) + +/-- Finite-separable Henselian-DVF uniqueness once the actual integral closure +is local. -/ +theorem hasUniqueValuationExtension_of_integralClosure_isLocalRing + [Algebra.IsSeparable K L] + [IsLocalRing (integralClosureIntegers base target)] : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target := + (hasUniqueValuationExtension_of_integralClosure_mem_or_inv base target) + (integralClosure_mem_or_inv_of_isLocalRing base target) + +/-- Finite-separable Henselian-DVF uniqueness once the residue fiber over the +base maximal ideal has at most one prime. -/ +theorem hasUniqueValuationExtension_of_integralClosure_base_maximal_fiber_subsingleton + [Algebra.IsSeparable K L] + [Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target)))] : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target := by + let : IsLocalRing (integralClosureIntegers base target) := + (integralClosure_isLocalRing_of_base_maximal_fiber_subsingleton base target) + exact + (hasUniqueValuationExtension_of_integralClosure_isLocalRing + (K := K) (L := L) (base := base) (target := target) : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target) + +/-- Finite-separable Henselian-DVF uniqueness from idempotent lifting in the +residue fiber over the base maximal ideal. -/ +theorem hasUniqueValuationExtension_of_integralClosure_base_maximal_fiber_idempotents_lift + [Algebra.IsSeparable K L] + (hlift : + ∀ e : base.maximalIdeal.Fiber (integralClosureIntegers base target), + IsIdempotentElem e → + ∃ b : (integralClosureIntegers base target), + IsIdempotentElem b ∧ + Algebra.TensorProduct.includeRight b = e) : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target := by + let : Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target))) := + (integralClosure_base_maximal_fiber_subsingleton_of_idempotents_lift base target) hlift + exact + (hasUniqueValuationExtension_of_integralClosure_base_maximal_fiber_subsingleton + (K := K) (L := L) (base := base) (target := target) : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target) + +/-- Finite-separable Henselian-DVF uniqueness from the Henselian-kernel +idempotent-lifting criterion for the residue-fiber `includeRight` map. -/ +theorem IntegralClosureFiber.unique_of_includeRight_surjective_henselianRing_ker + [Algebra.IsSeparable K L] + (hsurj : + Function.Surjective + (Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target))) + [HenselianRing (integralClosureIntegers base target) + (RingHom.ker + ((Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target)) : + (integralClosureIntegers base target) →+* + base.maximalIdeal.Fiber (integralClosureIntegers base target)))] : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target := by + let : Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target))) := + (integralClosure_maximal_fiber_subsingleton_of_includeRight_surjective_henselian_ker + base target) + hsurj + exact + (hasUniqueValuationExtension_of_integralClosure_base_maximal_fiber_subsingleton + (K := K) (L := L) (base := base) (target := target) : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target) + +/-- Finite-separable Henselian-DVF uniqueness from the Henselian-kernel +criterion for the residue-fiber `includeRight` map. Surjectivity of +`includeRight` is supplied by the local base valuation ring. -/ +theorem + hasUniqueValuationExtension_of_integralClosure_base_maximal_fiber_includeRight_henselianRing_ker + [Algebra.IsSeparable K L] + [HenselianRing (integralClosureIntegers base target) + (RingHom.ker + ((Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target)) : + (integralClosureIntegers base target) →+* + base.maximalIdeal.Fiber (integralClosureIntegers base target)))] : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target := by + let : Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target))) := + (integralClosure_base_maximal_fiber_subsingleton_of_includeRight_henselianRing_ker base target) + exact + (hasUniqueValuationExtension_of_integralClosure_base_maximal_fiber_subsingleton + (K := K) (L := L) (base := base) (target := target) : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target) + +omit [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- If the base Henselian-DVF valuation ring is actually complete for its +maximal-ideal topology, then the actual integral closure is Henselian along the +ideal generated by the base maximal ideal. -/ +theorem integralClosure_base_maximal_map_henselianRing_of_isAdicComplete + [Algebra.IsSeparable K L] + [IsAdicComplete base.maximalIdeal base.valuationSubring] : + HenselianRing (integralClosureIntegers base target) + (base.maximalIdeal.map + (algebraMap base.valuationSubring (integralClosureIntegers base target))) := by + let : IsNoetherianRing base.valuationSubring := + base.toDVF.valuationSubring_isNoetherianRing + let : Module.Finite base.valuationSubring (integralClosureIntegers base target) := + (moduleFinite_integralClosureIntegers base target) + exact + henselianRing_map_algebraMap_of_moduleFinite_of_isAdicComplete + (R := base.valuationSubring) (S := (integralClosureIntegers base target)) + (I := base.maximalIdeal) + +omit [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- If the base Henselian-DVF valuation ring is precomplete for its +maximal-ideal topology, then the actual integral closure is Henselian along the +ideal generated by the base maximal ideal. + +The separatedness needed upstairs is derived from the Henselian Jacobson +condition and finite generation, so this does not assume base adic +completeness. -/ +theorem integralClosure_base_maximal_map_henselianRing_of_base_isPrecomplete + [Algebra.IsSeparable K L] + [IsPrecomplete base.maximalIdeal base.valuationSubring] : + HenselianRing (integralClosureIntegers base target) + (base.maximalIdeal.map + (algebraMap base.valuationSubring (integralClosureIntegers base target))) := by + let : IsNoetherianRing base.valuationSubring := + base.toDVF.valuationSubring_isNoetherianRing + let : Module.Finite base.valuationSubring (integralClosureIntegers base target) := + (moduleFinite_integralClosureIntegers base target) + have hHausR : IsHausdorff base.maximalIdeal base.valuationSubring := + IsHausdorff.of_le_jacobson + (I := base.maximalIdeal) (M := base.valuationSubring) + (show base.maximalIdeal ≤ Ideal.jacobson (⊥ : Ideal base.valuationSubring) from + HenselianRing.jac) + have hCompleteR : IsAdicComplete base.maximalIdeal base.valuationSubring := + { toIsHausdorff := hHausR + toIsPrecomplete := inferInstance } + let : IsAdicComplete base.maximalIdeal base.valuationSubring := hCompleteR + exact + henselianRing_map_algebraMap_of_moduleFinite_of_isAdicComplete + (R := base.valuationSubring) (S := (integralClosureIntegers base target)) + (I := base.maximalIdeal) + +omit [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- The actual integral closure is Henselian once finite-algebra transfer is +available over the base valuation ring. + +This is the CFT-facing specialization of the finite-algebra transfer frontier: +the actual integral closure is module-finite over the Henselian base valuation +ring in a finite separable extension, so the monogenic `AdjoinRoot` transfer +route constructed in `Henselian.lean` gives the natural Henselian pair upstairs. +-/ +theorem integralClosure_base_maximal_map_henselianRing_of_finiteTransfer + [Algebra.IsSeparable K L] + (hTransfer : + ∀ {T : Type w} [CommRing T] [Algebra base.valuationSubring T] + [Module.Finite base.valuationSubring T], + HenselianRing T + (base.maximalIdeal.map + (algebraMap base.valuationSubring T))) : + HenselianRing (integralClosureIntegers base target) + (base.maximalIdeal.map + (algebraMap base.valuationSubring (integralClosureIntegers base target))) := by + let : Module.Finite base.valuationSubring (integralClosureIntegers base target) := + (moduleFinite_integralClosureIntegers base target) + change HenselianRing (integralClosure base.valuationSubring L) + (base.maximalIdeal.map + (algebraMap base.valuationSubring (integralClosure base.valuationSubring L))) + exact hTransfer (T := (integralClosure base.valuationSubring L : Type w)) + +/-- Finite-separable Henselian-DVF uniqueness from the natural Henselian-pair +ideal in the actual integral closure. -/ +theorem hasUniqueValuationExtension_of_integralClosure_base_maximal_map_henselianRing + [Algebra.IsSeparable K L] + [HenselianRing (integralClosureIntegers base target) + (base.maximalIdeal.map + (algebraMap base.valuationSubring (integralClosureIntegers base target)))] : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target := by + let : Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target))) := + (integralClosure_base_maximal_fiber_subsingleton_of_henselianRing_maximalIdeal_map base target) + let : IsLocalRing (integralClosureIntegers base target) := + (integralClosure_isLocalRing_of_base_maximal_fiber_subsingleton base target) + exact + (hasUniqueValuationExtension_of_integralClosure_isLocalRing + (K := K) (L := L) (base := base) (target := target) : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target) + +/-- Finite-separable Henselian-DVF uniqueness for bases that are complete for +the maximal-ideal topology. This is the actual-integral-closure specialization +of finite-algebra transfer in the complete-base case. -/ +theorem hasUniqueValuationExtension_of_finite_separable_of_base_isAdicComplete + [Algebra.IsSeparable K L] + [IsAdicComplete base.maximalIdeal base.valuationSubring] : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target := by + let : HenselianRing (integralClosureIntegers base target) + (base.maximalIdeal.map + (algebraMap base.valuationSubring (integralClosureIntegers base target))) := + (integralClosure_base_maximal_map_henselianRing_of_isAdicComplete base target) + exact + (hasUniqueValuationExtension_of_integralClosure_base_maximal_map_henselianRing + (K := K) (L := L) (base := base) (target := target) : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target) + +/-- Finite-separable Henselian-DVF uniqueness for bases whose valuation ring is +precomplete for the maximal-ideal topology. This is the CFT-facing +specialization of finite-algebra transfer with separatedness derived from the +Henselian Jacobson condition. -/ +theorem hasUniqueValuationExtension_of_finite_separable_of_base_isPrecomplete + [Algebra.IsSeparable K L] + [IsPrecomplete base.maximalIdeal base.valuationSubring] : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target := by + let : HenselianRing (integralClosureIntegers base target) + (base.maximalIdeal.map + (algebraMap base.valuationSubring (integralClosureIntegers base target))) := + (integralClosure_base_maximal_map_henselianRing_of_base_isPrecomplete base target) + exact + (hasUniqueValuationExtension_of_integralClosure_base_maximal_map_henselianRing + (K := K) (L := L) (base := base) (target := target) : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target) + +/-- Finite-separable Henselian-DVF valuation uniqueness once finite-algebra +Henselian transfer is available over the base valuation ring. + +This is the downstream CFT specialization of the current finite-algebra +frontier: finite transfer gives the Henselian pair on the actual integral +closure, and the existing residue-fiber/localness argument then gives +uniqueness of the extended valuation. -/ +theorem hasUniqueValuationExtension_of_finite_separable_of_finiteTransfer + [Algebra.IsSeparable K L] + (hTransfer : + ∀ {T : Type w} [CommRing T] [Algebra base.valuationSubring T] + [Module.Finite base.valuationSubring T], + HenselianRing T + (base.maximalIdeal.map + (algebraMap base.valuationSubring T))) : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target := by + let : HenselianRing (integralClosureIntegers base target) + (base.maximalIdeal.map + (algebraMap base.valuationSubring (integralClosureIntegers base target))) := + (integralClosure_base_maximal_map_henselianRing_of_finiteTransfer base target) + hTransfer + exact + (hasUniqueValuationExtension_of_integralClosure_base_maximal_map_henselianRing + (K := K) (L := L) (base := base) (target := target) : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target) + +end ValuedExtension.Henselian + +namespace HenselianDVF + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] + +/-- Target-free finite-separable valuation-subring uniqueness, reduced to the +remaining Henselian integrality frontier. + +Once every valuation subring extending the base valuation is integral over the +base valuation ring, any two such valuation subrings coincide. This is the +`B C : ValuationSubring L` form needed by the absolute route, without +packaging either side as a target `HenselianDVF`. -/ +theorem valuationSubring_eq_of_finite_separable_of_forall_isIntegral + (base : HenselianDVF.{u, v} K) + (hintegral : + ∀ (B : ValuationSubring L) + [_root_.Valuation.HasExtension base.valuation B.valuation], + Algebra.IsIntegral base.valuation.valuationSubring + B.valuation.valuationSubring) + (B C : ValuationSubring L) + [_root_.Valuation.HasExtension base.valuation B.valuation] + [_root_.Valuation.HasExtension base.valuation C.valuation] : + B = C := by + have hBInt : Algebra.IsIntegral base.valuation.valuationSubring + B.valuation.valuationSubring := + hintegral B + have hCInt : Algebra.IsIntegral base.valuation.valuationSubring + C.valuation.valuationSubring := + hintegral C + have hsub : B.valuation.valuationSubring = C.valuation.valuationSubring := by + ext z + constructor + · intro hz + have hz_int : z ∈ integralClosure base.valuation.valuationSubring L := + valuationSubring_mem_integralClosure_of_isIntegral + (L := L) base.valuation B.valuation ⟨z, hz⟩ + exact + integralClosure_mem_valuationSubring_of_hasExtension + (L := L) base.valuation C.valuation ⟨z, hz_int⟩ + · intro hz + have hz_int : z ∈ integralClosure base.valuation.valuationSubring L := + valuationSubring_mem_integralClosure_of_isIntegral + (L := L) base.valuation C.valuation ⟨z, hz⟩ + exact + integralClosure_mem_valuationSubring_of_hasExtension + (L := L) base.valuation B.valuation ⟨z, hz_int⟩ + simpa [ValuationSubring.valuationSubring_valuation] using hsub + +/-- Target-free finite-separable valuation-subring uniqueness from finite +valuation-ring extensions. + +This is the module-finite form of +`valuationSubring_eq_of_finite_separable_of_forall_isIntegral`; finite +valuation-ring extensions are converted to integral extensions before applying +the integral uniqueness route. -/ +theorem valuationSubring_eq_of_finite_separable_of_forall_moduleFinite + (base : HenselianDVF.{u, v} K) + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (hfinite : + ∀ (B : ValuationSubring L) + [_root_.Valuation.HasExtension base.valuation B.valuation], + Module.Finite base.valuation.valuationSubring + B.valuation.valuationSubring) + (B C : ValuationSubring L) + [_root_.Valuation.HasExtension base.valuation B.valuation] + [_root_.Valuation.HasExtension base.valuation C.valuation] : + B = C := + valuationSubring_eq_of_finite_separable_of_forall_isIntegral + (base := base) + (hintegral := by + intro D _ + let : Module.Finite base.valuation.valuationSubring + D.valuation.valuationSubring := + hfinite D + infer_instance) + (B := B) (C := C) + +/-- In a finite separable extension, the target-free uniqueness theorem +identifies every extension valuation subring with the valuation subring +constructed from the actual integral closure. + +The remaining upstream input is explicit: every valuation subring extending +the base valuation must be integral over the base valuation ring, and the +actual integral closure must satisfy the valuation-ring dichotomy. -/ +theorem valuationSubring_eq_integralClosureValuationSubring_of_finite_separable + (base : HenselianDVF.{u, v} K) + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuation.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuation.valuationSubring L).toSubring) + (hintegral : + ∀ (B : ValuationSubring L) + [_root_.Valuation.HasExtension base.valuation B.valuation], + Algebra.IsIntegral base.valuation.valuationSubring + B.valuation.valuationSubring) + (B : ValuationSubring L) + [_root_.Valuation.HasExtension base.valuation B.valuation] : + B = + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval := by + let C := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let : _root_.Valuation.HasExtension base.valuation C.valuation := + integralClosureValuationSubringOfMemOrInv_hasExtension + (L := L) base.valuation hval + exact + valuationSubring_eq_of_finite_separable_of_forall_isIntegral + (base := base) (hintegral := hintegral) (B := B) (C := C) + +/-- Elementwise form of +`valuationSubring_eq_of_finite_separable_of_forall_isIntegral`. -/ +theorem mem_valuationSubring_iff_of_finite_separable_of_forall_isIntegral + (base : HenselianDVF.{u, v} K) + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (hintegral : + ∀ (B : ValuationSubring L) + [_root_.Valuation.HasExtension base.valuation B.valuation], + Algebra.IsIntegral base.valuation.valuationSubring + B.valuation.valuationSubring) + (B C : ValuationSubring L) + [_root_.Valuation.HasExtension base.valuation B.valuation] + [_root_.Valuation.HasExtension base.valuation C.valuation] + (z : L) : + z ∈ B ↔ z ∈ C := by + rw [valuationSubring_eq_of_finite_separable_of_forall_isIntegral + (base := base) (hintegral := hintegral) (B := B) (C := C)] + +/-- Elementwise form of +`valuationSubring_eq_of_finite_separable_of_forall_moduleFinite`. -/ +theorem mem_valuationSubring_iff_of_finite_separable_of_forall_moduleFinite + (base : HenselianDVF.{u, v} K) + [FiniteDimensional K L] [Algebra.IsSeparable K L] + (hfinite : + ∀ (B : ValuationSubring L) + [_root_.Valuation.HasExtension base.valuation B.valuation], + Module.Finite base.valuation.valuationSubring + B.valuation.valuationSubring) + (B C : ValuationSubring L) + [_root_.Valuation.HasExtension base.valuation B.valuation] + [_root_.Valuation.HasExtension base.valuation C.valuation] + (z : L) : + z ∈ B ↔ z ∈ C := by + rw [valuationSubring_eq_of_finite_separable_of_forall_moduleFinite + (base := base) (hfinite := hfinite) (B := B) (C := C)] + +end HenselianDVF +end DiscreteValuationField + +end + +end ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Defectless.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Defectless.lean new file mode 100644 index 0000000000..4454f2d358 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Defectless.lean @@ -0,0 +1,66 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions +public import Mathlib.LinearAlgebra.Dimension.Localization +public import Mathlib.RingTheory.RamificationInertia.Basic +/-! +# Defectlessness from a finite extension of valuation rings + +The local Dedekind fundamental identity only needs discretely valued fields. +Completeness and Henselianity play no role once the target valuation ring is a +finite module over the base valuation ring. +-/ + +@[expose] public section + +noncomputable +section + +namespace ValuationTheory.DiscreteValuationField.ValuedExtension + +universe u v w x + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] + +/-- A valued extension of discretely valued fields is defectless when its +target valuation ring is finite over the base valuation ring. -/ +theorem isDefectless_of_moduleFinite + (base : DVF.{u, v} K) (target : DVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Module.Finite base.valuationSubring target.valuationSubring] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + IsDefectless base target := by + classical + let : FaithfulSMul base.valuationSubring target.valuationSubring := + FaithfulSMul.of_field_isFractionRing + base.valuationSubring target.valuationSubring K L + have hprimes := + IsLocalRing.primesOver_eq target.valuationSubring base.maximalIdeal_ne_bot + have hq : target.maximalIdeal ∈ base.maximalIdeal.primesOver target.valuationSubring := by + rw [hprimes] + exact Set.mem_singleton target.maximalIdeal + let : target.maximalIdeal.LiesOver base.maximalIdeal := hq.2 + let : Subsingleton (base.maximalIdeal.primesOver target.valuationSubring) := + Set.Subsingleton.coe_sort (by + rw [hprimes] + exact Set.subsingleton_singleton) + have hsum := + Ideal.sum_ramification_inertia_eq_finrank base.maximalIdeal target.valuationSubring + rw [Fintype.sum_subsingleton _ ⟨target.maximalIdeal, hq⟩] at hsum + change Module.finrank K L = + Ideal.ramificationIdx' base.maximalIdeal target.maximalIdeal * + target.maximalIdeal.inertiaDeg base.valuationSubring + rw [Ideal.ramificationIdx'_eq_ramificationIdx + base.maximalIdeal target.maximalIdeal base.maximalIdeal_ne_bot, + IsFractionRing.finrank_eq base.valuationSubring K target.valuationSubring L] + exact hsum.symm + +end ValuationTheory.DiscreteValuationField.ValuedExtension + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Degree.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Degree.lean new file mode 100644 index 0000000000..a703f8f105 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Degree.lean @@ -0,0 +1,924 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.IntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianValuationExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Defectless +public import Mathlib.RingTheory.RamificationInertia.Basic + +/-! # Degree -/ + +@[expose] public section +namespace ValuationTheory + +/-! +# Finite valued extension consequences + +This file collects theorem-level consequences around finite valued extensions: +canonical local-Dedekind degree formulas, uniqueness criteria for extended +valuations, and the algebra equivalence identifying an actual integral-closure +valuation ring with mathlib's `integralClosure`. +-/ + +noncomputable +section + +universe u v w x y + +namespace DiscreteValuationField +namespace ValuedExtension + +open ValuationTheory.DiscreteValuationField.Valuation + +/-- If an element maps into the maximal ideal of a local target ring, then the +original element is in the maximal ideal of the local source ring. This is the +automatic half of the center/maximal-ideal condition used in the Henselian +finite-extension frontier. -/ +theorem mem_maximalIdeal_of_map_mem_maximalIdeal + {R : Type u} {S : Type w} [CommRing R] [CommRing S] + [IsLocalRing R] [IsLocalRing S] (f : R →+* S) {x : R} + (hx : f x ∈ IsLocalRing.maximalIdeal S) : + x ∈ IsLocalRing.maximalIdeal R := by + rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] at hx ⊢ + intro hxunit + exact hx (hxunit.map f) + +/-- Integral valuation overrings have maximal center. + +For a valuation overring `R ≤ S`, if the inclusion is integral, then the center +of `S` on `R` is the maximal ideal of `R`. This is the usable form needed in +the Henselian finite-extension frontier, where the remaining mathematical work +is to prove integrality of the relevant extension valuation-ring inclusions. -/ +theorem idealOfLE_eq_maximalIdeal_of_isIntegral + {M : Type u} [Field M] (R S : ValuationSubring M) (hRS : R ≤ S) + (hIntegral : (R.inclusion S hRS).IsIntegral) : + ValuationSubring.idealOfLE R S hRS = IsLocalRing.maximalIdeal R := by + exact ((IsLocalRing.local_hom_TFAE (R.inclusion S hRS)).out 1 5).mp + (hIntegral.isLocalHom (by + intro x y hxy + apply Subtype.ext + calc + (x : M) = ((R.inclusion S hRS x : S) : M) := rfl + _ = ((R.inclusion S hRS y : S) : M) := congrArg Subtype.val hxy + _ = (y : M) := rfl)) + +/-- Finite valuation overrings have maximal center. -/ +theorem idealOfLE_eq_maximalIdeal_of_finite + {M : Type u} [Field M] (R S : ValuationSubring M) (hRS : R ≤ S) + (hFinite : (R.inclusion S hRS).Finite) : + ValuationSubring.idealOfLE R S hRS = IsLocalRing.maximalIdeal R := + idealOfLE_eq_maximalIdeal_of_isIntegral R S hRS hFinite.to_isIntegral + +variable {K : Type u} {L : Type w} [Field K] [Field L] +variable [Algebra K L] [FiniteDimensional K L] +variable (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) +variable [base.valuation.HasExtension target.valuation] + +/-- The canonical integer map from the base valuation ring to the valuation +subring constructed from the actual integral closure. Its definition uses the +exact pullback theorem for the constructed integral-closure valuation subring, +so no auxiliary alias of the base or target valuation ring is introduced. -/ +def integralClosureValuationSubringIntegerMapOfMemOrInv + (base : CompleteDVF.{u, v} K) + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) : + base.valuationSubring →+* + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval where + toFun a := + ⟨algebraMap K L (a : K), + (integralClosureValuationSubringOfMemOrInv_pullback + (L := L) base.valuation hval (a : K)).2 a.2⟩ + map_zero' := by ext; simp + map_one' := by ext; simp + map_add' := by intro a b; ext; simp + map_mul' := by intro a b; ext; simp + +omit [FiniteDimensional K L] in +/-- The finite-extension integer map into the integral closure is the ambient algebra map. -/ +@[simp] theorem integralClosureValuationSubringIntegerMapOfMemOrInv_apply + (base : CompleteDVF.{u, v} K) + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (a : base.valuationSubring) : + ((integralClosureValuationSubringIntegerMapOfMemOrInv + (K := K) (L := L) base hval a : + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval) : L) = + algebraMap K L (a : K) := + rfl + +omit [FiniteDimensional K L] in +/-- The canonical integer map into the valuation subring built from the actual +integral closure is injective. This is the ring-theoretic input needed to +turn a prime over the base maximal ideal into a nonzero prime of the constructed +integral-closure valuation ring. -/ +theorem integralClosureValuationSubringIntegerMapOfMemOrInv_injective + (base : CompleteDVF.{u, v} K) + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) : + Function.Injective + (integralClosureValuationSubringIntegerMapOfMemOrInv + (K := K) (L := L) base hval) := by + intro a b hab + apply Subtype.ext + apply FaithfulSMul.algebraMap_injective K L + have hvalEq := congrArg + (fun x : + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval => (x : L)) hab + change algebraMap K L (a : K) = algebraMap K L (b : K) at hvalEq + exact hvalEq + +/- Numerical defect is a derived quotient; defectlessness itself is the +canonical equality `degree = e * f` defined in `Extensions`. Positivity +and the fundamental identity are established below only under the hypotheses +needed by the local-Dedekind theorem. -/ +omit [FiniteDimensional K L] in +/-- The target maximal ideal lies over the base maximal ideal for any actual +extension of the chosen valuations. This is the record-free form of the local +map property used by finite-extension invariants. -/ +theorem maximalIdeal_liesOver_of_hasExtension + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] : + target.maximalIdeal.LiesOver base.maximalIdeal := + target_maximalIdeal_liesOver_base_maximal_of_hasExtension base target + +omit [FiniteDimensional K L] in +/-- The center of an extension valuation ring on the constructed actual +integral-closure valuation subring contracts to the base maximal ideal. + +This is the nontrivial half of locating the center: the center is represented +as `ValuationSubring.idealOfLE`, and its contraction along the canonical map +from the base valuation ring is computed using the `HasExtension` valuation +inequality. A later Henselian local-integral-closure theorem can combine this +with uniqueness of primes above the base maximal ideal to identify the center +with the maximal ideal of the constructed integral closure. -/ +theorem idealOfLE_comap_integralClosureValuationSubringIntegerMap_eq_maximalIdeal + {ΓL : Type x} [LinearOrderedCommGroupWithZero ΓL] + (base : CompleteDVF.{u, v} K) (vL : _root_.Valuation L ΓL) + [base.valuation.HasExtension vL] + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) : + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let hvL_le : B ≤ vL.valuationSubring := + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation vL hval + (ValuationSubring.idealOfLE B vL.valuationSubring hvL_le).comap + (integralClosureValuationSubringIntegerMapOfMemOrInv + (K := K) (L := L) base hval) = + base.maximalIdeal := by + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let hvL_le : B ≤ vL.valuationSubring := + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation vL hval + let i : base.valuationSubring →+* B := + integralClosureValuationSubringIntegerMapOfMemOrInv + (K := K) (L := L) base hval + apply Ideal.ext + intro a + rw [Ideal.mem_comap] + change B.inclusion vL.valuationSubring hvL_le (i a) ∈ + IsLocalRing.maximalIdeal vL.valuationSubring ↔ + a ∈ IsLocalRing.maximalIdeal base.valuation.valuationSubring + rw [Valuation.mem_maximalIdeal_iff (v := vL)] + rw [Valuation.mem_maximalIdeal_iff (v := base.valuation)] + change vL + ((B.inclusion vL.valuationSubring hvL_le (i a) : + vL.valuationSubring) : L) < 1 ↔ + base.valuation (a : K) < 1 + have hcoe : + ((B.inclusion vL.valuationSubring hvL_le (i a) : + vL.valuationSubring) : L) = + algebraMap K L (a : K) := by + rfl + rw [hcoe] + exact Valuation.HasExtension.val_map_lt_one_iff base.valuation vL (a : K) + +/-- In a finite separable extension, once the actual integral closure has the +valuation-ring dichotomy, the constructed integral-closure valuation ring has a +unique prime over the base maximal ideal. + +The proof uses real structure, not a certificate: the constructed valuation +ring is the actual integral closure, hence Dedekind over the base DVR; a prime +whose contraction is the base maximal ideal is nonzero by injectivity of the +canonical integer map, hence maximal by the dimension-one property, and then +equal to the unique maximal ideal because the constructed ring is local. -/ +theorem prime_eq_maximalIdeal_of_comap_integralClosureValuationSubringIntegerMap_eq_maximalIdeal + (base : CompleteDVF.{u, v} K) + [Algebra.IsSeparable K L] + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (P : + Ideal + (integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval)) + (hP : P.IsPrime) + (hcomap : + P.comap + (integralClosureValuationSubringIntegerMapOfMemOrInv + (K := K) (L := L) base hval) = + base.maximalIdeal) : + P = + IsLocalRing.maximalIdeal + (integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval) := by + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let i : base.valuationSubring →+* B := + integralClosureValuationSubringIntegerMapOfMemOrInv + (K := K) (L := L) base hval + let : base.valuation.HasExtension B.valuation := + integralClosureValuationSubringOfMemOrInv_hasExtension + (L := L) base.valuation hval + let : IsFractionRing base.valuationSubring K := + base_valuationSubring_isFractionRing (K := K) base + let : IsDiscreteValuationRing base.valuationSubring := + base.valuationSubring_isDiscreteValuationRing + let : IsDedekindDomain base.valuationSubring := inferInstance + let : Algebra base.valuationSubring B := RingHom.toAlgebra i + let : IsScalarTower base.valuationSubring B L := + IsScalarTower.of_algebraMap_eq (by + intro a + rfl) + let : IsIntegralClosure B base.valuationSubring L := + integralClosureValuationSubringOfMemOrInv_isIntegralClosure + (L := L) base.valuation hval + let : IsDedekindDomain B := + IsIntegralClosure.isDedekindDomain base.valuationSubring K L B + have hi : Function.Injective i := + integralClosureValuationSubringIntegerMapOfMemOrInv_injective + (K := K) (L := L) base hval + have hP_ne_bot : P ≠ ⊥ := by + have hnot_le_bot : ¬ base.maximalIdeal ≤ ⊥ := by + intro hle + exact base.maximalIdeal_ne_bot (le_antisymm hle bot_le) + obtain ⟨a, ha_max, ha_not_bot⟩ := Set.not_subset.mp hnot_le_bot + have ha_ne_zero : a ≠ 0 := by + intro ha + exact ha_not_bot (by simp [ha]) + intro hPbot + have ha_comap : a ∈ P.comap i := by + simpa [B, i, hcomap] using ha_max + have hai_mem : i a ∈ P := by + simpa [Ideal.mem_comap] using ha_comap + have hai_zero : i a = 0 := by + simpa [hPbot] using hai_mem + exact ha_ne_zero (hi (by simpa using hai_zero)) + exact IsLocalRing.eq_maximalIdeal (hP.isMaximal hP_ne_bot) + +omit [FiniteDimensional K L] in +/-- The local-Dedekind fundamental identity in record-free form: for the actual +valuation rings attached to a finite valued field extension, mathlib's +ramification index times mathlib's inertia degree is the field degree. -/ +theorem ideal_ramificationIdx_mul_inertiaDeg_eq_finrank_of_hasExtension + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Module.Finite base.valuationSubring target.valuationSubring] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + Ideal.ramificationIdx' base.maximalIdeal target.maximalIdeal * + target.maximalIdeal.inertiaDeg base.valuationSubring = Module.finrank K L := by + exact (isDefectless_of_moduleFinite base.toDVF target.toDVF).symm + +/-- If the target valuation ring is the integral closure of the base valuation +ring in a finite separable field extension, then the local-Dedekind +ramification identity holds without separately assuming module-finiteness. -/ +theorem ideal_ramificationIdx_mul_inertiaDeg_eq_finrank_of_isIntegralClosure + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + [IsIntegralClosure target.valuationSubring base.valuationSubring L] : + Ideal.ramificationIdx' base.maximalIdeal target.maximalIdeal * + target.maximalIdeal.inertiaDeg base.valuationSubring = Module.finrank K L := by + let : Module.Finite base.valuationSubring target.valuationSubring := + moduleFinite_target_valuationSubring_of_isIntegralClosure + (K := K) (L := L) base target + exact ideal_ramificationIdx_mul_inertiaDeg_eq_finrank_of_hasExtension + (K := K) (L := L) base target + +omit [FiniteDimensional K L] in +/-- Local-inclusion form of the integral-closure frontier for the chosen +target valuation ring. Once the actual integral closure has the +valuation-ring dichotomy, a local inclusion from the constructed +integral-closure valuation subring into the target valuation ring identifies +the target valuation ring with the actual integral closure. -/ +theorem target_valuationSubring_isIntegralClosure_of_integralClosure_mem_or_inv_of_local_inclusion + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (htargetLocal : + IsLocalHom + ((integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval).inclusion + target.valuation.valuationSubring + (integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation target.valuation hval))) : + IsIntegralClosure target.valuationSubring base.valuationSubring L := by + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + have htarget_le : B ≤ target.valuation.valuationSubring := + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation target.valuation hval + have htarget_eq : target.valuation.valuationSubring = B := by + let : IsLocalHom (B.inclusion target.valuation.valuationSubring htarget_le) := + htargetLocal + exact + valuationSubring_eq_of_le_of_inclusion_isLocalHom + B target.valuation.valuationSubring htarget_le + let : base.valuation.HasExtension B.valuation := + integralClosureValuationSubringOfMemOrInv_hasExtension + (L := L) base.valuation hval + have hBIntegralClosure : + IsIntegralClosure B base.valuationSubring L := + integralClosureValuationSubringOfMemOrInv_isIntegralClosure + (L := L) base.valuation hval + change IsIntegralClosure target.valuation.valuationSubring + base.valuationSubring L + rw [htarget_eq] + exact hBIntegralClosure + +omit [FiniteDimensional K L] in +/-- Center-prime form of the same integral-closure bridge. This is the form +expected after the Henselian finite-extension argument proves that the center +of the target valuation ring on the constructed integral-closure valuation +ring is the maximal ideal. -/ +theorem +target_valuationSubring_isIntegralClosure_of_integralClosure_mem_or_inv_of_center_eq_maximalIdeal + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (htargetCenter : + ValuationSubring.idealOfLE + (integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval) + target.valuation.valuationSubring + (integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation target.valuation hval) = + IsLocalRing.maximalIdeal + (integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval)) : + IsIntegralClosure target.valuationSubring base.valuationSubring L := by + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + have htarget_le : B ≤ target.valuation.valuationSubring := + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation target.valuation hval + have htarget_eq : target.valuation.valuationSubring = B := + valuationSubring_eq_of_le_of_idealOfLE_eq_maximalIdeal + B target.valuation.valuationSubring htarget_le htargetCenter + let : base.valuation.HasExtension B.valuation := + integralClosureValuationSubringOfMemOrInv_hasExtension + (L := L) base.valuation hval + have hBIntegralClosure : + IsIntegralClosure B base.valuationSubring L := + integralClosureValuationSubringOfMemOrInv_isIntegralClosure + (L := L) base.valuation hval + change IsIntegralClosure target.valuation.valuationSubring + base.valuationSubring L + rw [htarget_eq] + exact hBIntegralClosure + +omit [FiniteDimensional K L] in +/-- Integral-inclusion form of the target integral-closure bridge. Once the +actual integral closure has the valuation-ring dichotomy, integrality of the +inclusion from that constructed valuation ring into the target valuation ring +forces the target to be the actual integral closure. -/ +theorem +target_valuationSubring_isIntegralClosure_of_integralClosure_mem_or_inv_of_integral_inclusion + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (htargetIntegral : + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation target.valuation hval + (B.inclusion target.valuation.valuationSubring htarget_le).IsIntegral) : + IsIntegralClosure target.valuationSubring base.valuationSubring L := by + refine ( +target_valuationSubring_isIntegralClosure_of_integralClosure_mem_or_inv_of_center_eq_maximalIdeal + (K := K) (L := L) base target hval ?_) + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation target.valuation hval + exact idealOfLE_eq_maximalIdeal_of_isIntegral B target.valuation.valuationSubring + htarget_le (by simpa [B, htarget_le] using htargetIntegral) + +omit [FiniteDimensional K L] in +/-- Elementwise center form of the target integral-closure bridge. -/ +theorem target_valuationSubring_isIntegralClosure_of_integralClosure_mem_or_inv_of_center_mem_iff + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (htargetCenterMem : + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation target.valuation hval + ∀ x : B, + B.inclusion target.valuation.valuationSubring htarget_le x ∈ + IsLocalRing.maximalIdeal target.valuation.valuationSubring ↔ + x ∈ IsLocalRing.maximalIdeal B) : + IsIntegralClosure target.valuationSubring base.valuationSubring L := by + refine ( +target_valuationSubring_isIntegralClosure_of_integralClosure_mem_or_inv_of_center_eq_maximalIdeal + (K := K) (L := L) base target hval ?_) + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation target.valuation hval + exact + idealOfLE_eq_maximalIdeal_of_mem_maximalIdeal_iff + B target.valuation.valuationSubring htarget_le + (by simpa [B, htarget_le] using htargetCenterMem) + +/-- Module-finiteness of the target valuation ring from the Henselian +frontier-shaped hypotheses: valuative dichotomy for the actual integral +closure plus local inclusion into the target. -/ +theorem moduleFinite_target_valuationSubring_of_integralClosure_mem_or_inv_of_local_inclusion + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (htargetLocal : + IsLocalHom + ((integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval).inclusion + target.valuation.valuationSubring + (integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation target.valuation hval))) : + Module.Finite base.valuationSubring target.valuationSubring := by + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_integralClosure_mem_or_inv_of_local_inclusion + (K := K) (L := L) base target hval htargetLocal + exact moduleFinite_target_valuationSubring_of_isIntegralClosure + (K := K) (L := L) base target + +/-- Center-prime form of module-finiteness for the target valuation ring. -/ +theorem moduleFinite_target_valuationSubring_of_integralClosure_mem_or_inv_of_center_eq_maximalIdeal + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (htargetCenter : + ValuationSubring.idealOfLE + (integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval) + target.valuation.valuationSubring + (integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation target.valuation hval) = + IsLocalRing.maximalIdeal + (integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval)) : + Module.Finite base.valuationSubring target.valuationSubring := by + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := ( +target_valuationSubring_isIntegralClosure_of_integralClosure_mem_or_inv_of_center_eq_maximalIdeal + (K := K) (L := L) base target hval htargetCenter) + exact moduleFinite_target_valuationSubring_of_isIntegralClosure + (K := K) (L := L) base target + +/-- Integral-inclusion form of module-finiteness for the target valuation +ring. -/ +theorem moduleFinite_target_valuationSubring_of_integralClosure_mem_or_inv_of_integral_inclusion + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (htargetIntegral : + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation target.valuation hval + (B.inclusion target.valuation.valuationSubring htarget_le).IsIntegral) : + Module.Finite base.valuationSubring target.valuationSubring := by + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_integralClosure_mem_or_inv_of_integral_inclusion + (K := K) (L := L) base target hval htargetIntegral + exact moduleFinite_target_valuationSubring_of_isIntegralClosure + (K := K) (L := L) base target + +/-- Elementwise center form of module-finiteness for the target valuation +ring. -/ +theorem moduleFinite_target_valuationSubring_of_integralClosure_mem_or_inv_of_center_mem_iff + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (htargetCenterMem : + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation target.valuation hval + ∀ x : B, + B.inclusion target.valuation.valuationSubring htarget_le x ∈ + IsLocalRing.maximalIdeal target.valuation.valuationSubring ↔ + x ∈ IsLocalRing.maximalIdeal B) : + Module.Finite base.valuationSubring target.valuationSubring := by + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_integralClosure_mem_or_inv_of_center_mem_iff + (K := K) (L := L) base target hval htargetCenterMem + exact moduleFinite_target_valuationSubring_of_isIntegralClosure + (K := K) (L := L) base target + +/-- Local-inclusion form of the local-Dedekind fundamental identity. This is +the degree bridge used after the Henselian proof supplies the valuative +dichotomy and target local-overring condition. -/ +theorem +ideal_ramificationIdx_mul_inertiaDeg_eq_finrank_of_integralClosure_mem_or_inv_of_local_inclusion + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (htargetLocal : + IsLocalHom + ((integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval).inclusion + target.valuation.valuationSubring + (integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation target.valuation hval))) : + Ideal.ramificationIdx' base.maximalIdeal target.maximalIdeal * + target.maximalIdeal.inertiaDeg base.valuationSubring = Module.finrank K L := by + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_integralClosure_mem_or_inv_of_local_inclusion + (K := K) (L := L) base target hval htargetLocal + exact ideal_ramificationIdx_mul_inertiaDeg_eq_finrank_of_isIntegralClosure + (K := K) (L := L) base target + +/-- Center-prime form of the local-Dedekind fundamental identity. -/ +theorem IntegralClosureMemOrInv.ideal_degree_eq_finrank_of_center_eq_maximalIdeal + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (htargetCenter : + ValuationSubring.idealOfLE + (integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval) + target.valuation.valuationSubring + (integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation target.valuation hval) = + IsLocalRing.maximalIdeal + (integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval)) : + Ideal.ramificationIdx' base.maximalIdeal target.maximalIdeal * + target.maximalIdeal.inertiaDeg base.valuationSubring = Module.finrank K L := by + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := ( +target_valuationSubring_isIntegralClosure_of_integralClosure_mem_or_inv_of_center_eq_maximalIdeal + (K := K) (L := L) base target hval htargetCenter) + exact ideal_ramificationIdx_mul_inertiaDeg_eq_finrank_of_isIntegralClosure + (K := K) (L := L) base target + +/-- Integral-inclusion form of the local-Dedekind fundamental identity. -/ +theorem +ideal_ramificationIdx_mul_inertiaDeg_eq_finrank_of_integralClosure_mem_or_inv_of_integral_inclusion + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (htargetIntegral : + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation target.valuation hval + (B.inclusion target.valuation.valuationSubring htarget_le).IsIntegral) : + Ideal.ramificationIdx' base.maximalIdeal target.maximalIdeal * + target.maximalIdeal.inertiaDeg base.valuationSubring = Module.finrank K L := by + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_integralClosure_mem_or_inv_of_integral_inclusion + (K := K) (L := L) base target hval htargetIntegral + exact ideal_ramificationIdx_mul_inertiaDeg_eq_finrank_of_isIntegralClosure + (K := K) (L := L) base target + +/-- Elementwise center form of the local-Dedekind fundamental identity. -/ +theorem +ideal_ramificationIdx_mul_inertiaDeg_eq_finrank_of_integralClosure_mem_or_inv_of_center_mem_iff + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (htargetCenterMem : + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation target.valuation hval + ∀ x : B, + B.inclusion target.valuation.valuationSubring htarget_le x ∈ + IsLocalRing.maximalIdeal target.valuation.valuationSubring ↔ + x ∈ IsLocalRing.maximalIdeal B) : + Ideal.ramificationIdx' base.maximalIdeal target.maximalIdeal * + target.maximalIdeal.inertiaDeg base.valuationSubring = Module.finrank K L := by + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_integralClosure_mem_or_inv_of_center_mem_iff + (K := K) (L := L) base target hval htargetCenterMem + exact ideal_ramificationIdx_mul_inertiaDeg_eq_finrank_of_isIntegralClosure + (K := K) (L := L) base target + +/-- A valued extension whose target is the integral closure is defectless. -/ +theorem isDefectless_of_isIntegralClosure + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + [IsIntegralClosure target.valuationSubring base.valuationSubring L] : + ValuedExtension.IsDefectless base.toDVF target.toDVF := by + change Module.finrank K L = + Ideal.ramificationIdx' base.maximalIdeal target.maximalIdeal * + target.maximalIdeal.inertiaDeg base.valuationSubring + exact (ideal_ramificationIdx_mul_inertiaDeg_eq_finrank_of_isIntegralClosure + (K := K) (L := L) base target).symm + +omit [FiniteDimensional K L] in +/-- The target maximal ideal lies over the base maximal ideal for a valued +extension. -/ +theorem maximalIdeal_liesOver : + target.maximalIdeal.LiesOver base.maximalIdeal := + maximalIdeal_liesOver_of_hasExtension (K := K) (L := L) base target + +omit [FiniteDimensional K L] in +/-- Residue degree is the linear rank of the target residue field over the source residue field. -/ +theorem residueDegree_eq_finrank_quotient + : + letI : target.maximalIdeal.LiesOver base.maximalIdeal := + (maximalIdeal_liesOver base target) + (ValuedExtension.residueDegree base.toDVF target.toDVF) = + Module.finrank + (base.valuationSubring ⧸ base.maximalIdeal) + (target.valuationSubring ⧸ target.maximalIdeal) := by + exact Ideal.inertiaDeg_eq_of_isMaximal base.maximalIdeal target.maximalIdeal + +omit [FiniteDimensional K L] in +/-- The residue degree of a finite extension is strictly positive. -/ +theorem residueDegree_pos + [Module.Finite base.valuationSubring target.valuationSubring] : + 0 < (ValuedExtension.residueDegree base.toDVF target.toDVF) := by + let : target.maximalIdeal.LiesOver base.maximalIdeal := + (maximalIdeal_liesOver base target) + simpa [residueDegree, residueDegree] using + (target.maximalIdeal.inertiaDeg_pos base.valuationSubring) + +omit [FiniteDimensional K L] in +/-- A finite extension of valuation rings induces a finite-dimensional residue +field extension. This is the source behind using a primitive element for the +residue extension: mathlib's inertia degree is the residue-field `finrank`. -/ +theorem residueField_finiteDimensional_of_moduleFinite + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Module.Finite base.valuationSubring target.valuationSubring] : + FiniteDimensional base.residueField target.residueField := by + have h := residueDegree_pos base target + rw [residueDegree_eq_finrank_quotient base target] at h + exact FiniteDimensional.of_finrank_pos h + +omit [FiniteDimensional K L] in +/-- The residue degree of a finite extension is nonzero. -/ +theorem residueDegree_ne_zero + [Module.Finite base.valuationSubring target.valuationSubring] : + (ValuedExtension.residueDegree base.toDVF target.toDVF) ≠ 0 := + Nat.ne_of_gt (residueDegree_pos base target) + +omit [FiniteDimensional K L] in +/-- The ramification index of a finite extension is nonzero. -/ +theorem ramificationIndex_ne_zero + [Module.IsTorsionFree base.valuationSubring target.valuationSubring] : + (ValuedExtension.ramificationIndex base.toDVF target.toDVF) ≠ 0 := by + let : target.maximalIdeal.LiesOver base.maximalIdeal := + (maximalIdeal_liesOver base target) + simpa [ramificationIndex] using + (Ideal.IsDedekindDomain.ramificationIdx'_ne_zero_of_liesOver + target.maximalIdeal base.maximalIdeal_ne_bot) + +omit [FiniteDimensional K L] in +/-- The actual local-Dedekind fundamental identity for the chosen valuation +rings: in the local case, the mathlib ramification index times the mathlib +inertia degree is the field degree. -/ +theorem ramificationIndex_mul_residueDegree_eq_degree + [Module.Finite base.valuationSubring target.valuationSubring] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + (ValuedExtension.ramificationIndex base.toDVF target.toDVF) * + ValuedExtension.residueDegree base.toDVF target.toDVF = + ValuedExtension.degree base.toDVF target.toDVF := by + simpa [ramificationIndex, residueDegree, + ramificationIndex, residueDegree, degree] using + (ideal_ramificationIdx_mul_inertiaDeg_eq_finrank_of_hasExtension + (K := K) (L := L) base target) + +/-- Integral-closure form of the local-Dedekind degree identity for a valued +finite separable extension. -/ +theorem ramificationIndex_mul_residueDegree_eq_degree_of_isIntegralClosure + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + [IsIntegralClosure target.valuationSubring base.valuationSubring L] : + (ValuedExtension.ramificationIndex base.toDVF target.toDVF) * + ValuedExtension.residueDegree base.toDVF target.toDVF = + ValuedExtension.degree base.toDVF target.toDVF := by + simpa [ramificationIndex, residueDegree, + ramificationIndex, residueDegree, degree] using + (ideal_ramificationIdx_mul_inertiaDeg_eq_finrank_of_isIntegralClosure + (K := K) (L := L) base target) + +/-- Local-inclusion form of the canonical Dedekind degree identity. The +remaining Henselian input is exactly the valuative dichotomy for the integral +closure and the local-overring condition; this theorem performs the algebraic +degree/e/f bridge. -/ +theorem +ramificationIndex_mul_residueDegree_eq_degree_of_integralClosure_mem_or_inv_of_local_inclusion + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (htargetLocal : + IsLocalHom + ((integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval).inclusion + target.valuation.valuationSubring + (integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation target.valuation hval))) : + (ValuedExtension.ramificationIndex base.toDVF target.toDVF) * + ValuedExtension.residueDegree base.toDVF target.toDVF = + ValuedExtension.degree base.toDVF target.toDVF := by + simpa [ramificationIndex, residueDegree, + ramificationIndex, residueDegree, degree] using ( +ideal_ramificationIdx_mul_inertiaDeg_eq_finrank_of_integralClosure_mem_or_inv_of_local_inclusion + (K := K) (L := L) base target hval htargetLocal) + +/-- Center-prime form of the canonical Dedekind degree identity. -/ +theorem IntegralClosureMemOrInv.degree_eq_of_center_eq_maximalIdeal + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (htargetCenter : + ValuationSubring.idealOfLE + (integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval) + target.valuation.valuationSubring + (integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation target.valuation hval) = + IsLocalRing.maximalIdeal + (integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval)) : + (ValuedExtension.ramificationIndex base.toDVF target.toDVF) * + ValuedExtension.residueDegree base.toDVF target.toDVF = + ValuedExtension.degree base.toDVF target.toDVF := by + simpa [ramificationIndex, residueDegree, + ramificationIndex, residueDegree, degree] using + (IntegralClosureMemOrInv.ideal_degree_eq_finrank_of_center_eq_maximalIdeal + (K := K) (L := L) base target hval htargetCenter) + +/-- Integral-inclusion form of the canonical Dedekind degree identity. -/ +theorem +ramificationIndex_mul_residueDegree_eq_degree_of_integralClosure_mem_or_inv_of_integral_inclusion + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (htargetIntegral : + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation target.valuation hval + (B.inclusion target.valuation.valuationSubring htarget_le).IsIntegral) : + (ValuedExtension.ramificationIndex base.toDVF target.toDVF) * + ValuedExtension.residueDegree base.toDVF target.toDVF = + ValuedExtension.degree base.toDVF target.toDVF := by + simpa [ramificationIndex, residueDegree, + ramificationIndex, residueDegree, degree] using ( +ideal_ramificationIdx_mul_inertiaDeg_eq_finrank_of_integralClosure_mem_or_inv_of_integral_inclusion + (K := K) (L := L) base target hval htargetIntegral) + +/-- Elementwise center form of the canonical Dedekind degree identity. -/ +theorem +ramificationIndex_mul_residueDegree_eq_degree_of_integralClosure_mem_or_inv_of_center_mem_iff + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (htargetCenterMem : + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation target.valuation hval + ∀ x : B, + B.inclusion target.valuation.valuationSubring htarget_le x ∈ + IsLocalRing.maximalIdeal target.valuation.valuationSubring ↔ + x ∈ IsLocalRing.maximalIdeal B) : + (ValuedExtension.ramificationIndex base.toDVF target.toDVF) * + ValuedExtension.residueDegree base.toDVF target.toDVF = + ValuedExtension.degree base.toDVF target.toDVF := by + simpa [ramificationIndex, residueDegree, + ramificationIndex, residueDegree, degree] using + (ideal_ramificationIdx_mul_inertiaDeg_eq_finrank_of_integralClosure_mem_or_inv_of_center_mem_iff + (K := K) (L := L) base target hval htargetCenterMem) + +omit [FiniteDimensional K L] in +/-- The local-Dedekind formula in raw mathlib notation. -/ +theorem ideal_ramificationIdx_mul_inertiaDeg_eq_finrank + [Module.Finite base.valuationSubring target.valuationSubring] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + Ideal.ramificationIdx' base.maximalIdeal target.maximalIdeal * + target.maximalIdeal.inertiaDeg base.valuationSubring = Module.finrank K L := + ideal_ramificationIdx_mul_inertiaDeg_eq_finrank_of_hasExtension + (K := K) (L := L) base target +end ValuedExtension +end DiscreteValuationField + +end + +end ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean new file mode 100644 index 0000000000..49e46bb294 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean @@ -0,0 +1,1344 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Degree +/-! Provides the public declarations in the + `ValuationTheory.DiscreteValuationField.FiniteExtension.Uniqueness` Lean module. -/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + exists_extension_valuationSubring_with_hasExtension → + exists_extension_valuationSubring_with_hasExtension + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + idealOfLE_eq_maximalIdeal_of_mem_maximalIdeal_iff → + idealOfLE_eq_maximalIdeal_of_mem_maximalIdeal_iff + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + integralClosureValuationSubringOfMemOrInv → + integralClosureValuationSubringOfMemOrInv + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + integralClosureValuationSubringOfMemOrInv_hasExtension → + integralClosureValuationSubringOfMemOrInv_hasExtension + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + integralClosureValuationSubringOfMemOrInv_isIntegralClosure → + integralClosureValuationSubringOfMemOrInv_isIntegralClosure + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + moduleFinite_valuationSubring_of_isIntegralClosure → + moduleFinite_valuationSubring_of_isIntegralClosure + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + valuationSubring_eq_of_le_of_idealOfLE_eq_maximalIdeal → + valuationSubring_eq_of_le_of_idealOfLE_eq_maximalIdeal + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + valuationSubring_eq_of_le_of_inclusion_isLocalHom → + valuationSubring_eq_of_le_of_inclusion_isLocalHom + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + valuationSubring_isIntegralClosure_of_isIntegral → + valuationSubring_isIntegralClosure_of_isIntegral + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + valuation_isEquiv_of_hasExtension_of_moduleFinite → + valuation_isEquiv_of_hasExtension_of_moduleFinite + + +namespace ValuationTheory + +noncomputable +section + +universe u v w x y + +namespace DiscreteValuationField +namespace ValuedExtension + +variable {K : Type u} {L : Type w} [Field K] [Field L] +variable [Algebra K L] [FiniteDimensional K L] +variable (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) +variable [base.valuation.HasExtension target.valuation] + +/-- A complete-DVF uniqueness predicate for extensions of the base valuation. -/ +def HasUniqueValuationExtension (base : CompleteDVF.{u, v} K) + (target : CompleteDVF.{w, x} L) : Prop := + ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'], + target.valuation.IsEquiv v' + +omit [FiniteDimensional K L] [base.valuation.HasExtension target.valuation] in +/-- Forgetting completeness turns complete-DVF uniqueness into the +Henselian-DVF uniqueness predicate. -/ +theorem hasUniqueValuationExtension_toHenselianDVF + (huniq : HasUniqueValuationExtension.{u, v, w, x, y} + (base := base) (target := target)) : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} + base.toHenselianDVF target.toHenselianDVF := by + intro Gamma' _ v' hExt + exact @huniq Gamma' inferInstance v' hExt + +omit [FiniteDimensional K L] [base.valuation.HasExtension target.valuation] in +/-- Equality of valuation subrings for all extensions proves uniqueness up to +mathlib's valuation equivalence. -/ +theorem hasUniqueValuationExtension_of_forall_valuationSubring_eq + (h : + ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'], + target.valuation.valuationSubring = v'.valuationSubring) : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by + intro Gamma' _ v' _ + exact valuation_isEquiv_of_valuationSubring_eq target v' (@h Gamma' _ v' _) + +omit [FiniteDimensional K L] in +/-- Finite-module criterion for uniqueness of valuation extensions. If every +valuation extending the base valuation has a module-finite valuation ring over +the base valuation ring, then the extension valuation is unique up to mathlib's +valuation equivalence. -/ +theorem hasUniqueValuationExtension_of_forall_moduleFinite + [Module.Finite base.valuationSubring target.valuationSubring] + (hfinite : + ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'], + [Algebra base.valuation.valuationSubring v'.valuationSubring] → + Module.Finite base.valuation.valuationSubring v'.valuationSubring) : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by + intro Gamma' _ v' hExt + let : base.valuation.HasExtension v' := hExt + let : Module.Finite base.valuation.valuationSubring v'.valuationSubring := + @hfinite Gamma' inferInstance v' hExt inferInstance + let : Module.Finite base.valuation.valuationSubring + target.valuation.valuationSubring := by + change Module.Finite base.valuationSubring target.valuationSubring + infer_instance + exact + valuation_isEquiv_of_hasExtension_of_moduleFinite + (L := L) base.valuation target.valuation v' + +/-- Integral-closure criterion for uniqueness of valuation extensions. In a +finite separable extension over a complete DVF, if the chosen target valuation +ring and every comparison valuation ring extending the base valuation are the +actual integral closure of the base valuation ring in `L`, then the extension +valuation is unique up to mathlib's valuation equivalence. + +For the Henselian finite-extension theorem, this isolates the remaining +frontier: prove the integral-closure statement for all extension valuations +from the Henselian hypothesis, rather than adding a certificate carrying +uniqueness. -/ +theorem hasUniqueValuationExtension_of_forall_isIntegralClosure + [Algebra.IsSeparable K L] + [IsIntegralClosure target.valuationSubring base.valuationSubring L] + (hintegral : + ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'], + [Algebra base.valuation.valuationSubring v'.valuationSubring] → + IsIntegralClosure v'.valuationSubring base.valuation.valuationSubring L) : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by + let : IsNoetherianRing base.valuationSubring := + base_valuationSubring_isNoetherianRing (K := K) base + let : IsIntegralClosure target.valuation.valuationSubring + base.valuation.valuationSubring L := by + change IsIntegralClosure target.valuationSubring base.valuationSubring L + infer_instance + let : Module.Finite base.valuation.valuationSubring + target.valuation.valuationSubring := + moduleFinite_valuationSubring_of_isIntegralClosure + (L := L) base.valuation target.valuation + intro Gamma' _ v' hExt + let : base.valuation.HasExtension v' := hExt + let : IsIntegralClosure v'.valuationSubring base.valuation.valuationSubring L := + @hintegral Gamma' inferInstance v' hExt inferInstance + let : Module.Finite base.valuation.valuationSubring v'.valuationSubring := + moduleFinite_valuationSubring_of_isIntegralClosure + (L := L) base.valuation v' + exact + valuation_isEquiv_of_hasExtension_of_moduleFinite + (L := L) base.valuation target.valuation v' + +/-- If the chosen target valuation ring and every comparison valuation ring +extending the base valuation are integral over the base valuation ring, then +the valuation extension is unique. + +This is the non-certificate Henselian frontier reduction: to prove uniqueness +over a Henselian base it is now enough to prove the actual integrality of each +extension valuation ring, because the preceding Chevalley bridge identifies +such valuation rings with the actual integral closure. -/ +theorem hasUniqueValuationExtension_of_forall_isIntegral + [Algebra.IsSeparable K L] + [Algebra.IsIntegral base.valuationSubring target.valuationSubring] + (hintegral : + ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'], + [Algebra base.valuation.valuationSubring v'.valuationSubring] → + Algebra.IsIntegral base.valuation.valuationSubring v'.valuationSubring) : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by + let : Algebra.IsIntegral base.valuation.valuationSubring + target.valuation.valuationSubring := by + change Algebra.IsIntegral base.valuationSubring target.valuationSubring + infer_instance + let : IsNoetherianRing base.valuationSubring := + base_valuationSubring_isNoetherianRing (K := K) base + let : IsIntegralClosure target.valuation.valuationSubring + base.valuation.valuationSubring L := + valuationSubring_isIntegralClosure_of_isIntegral + (L := L) base.valuation target.valuation + let : Module.Finite base.valuation.valuationSubring + target.valuation.valuationSubring := + moduleFinite_valuationSubring_of_isIntegralClosure + (L := L) base.valuation target.valuation + intro Gamma' _ v' hExt + let : base.valuation.HasExtension v' := hExt + let : Algebra.IsIntegral base.valuation.valuationSubring v'.valuationSubring := + @hintegral Gamma' inferInstance v' hExt inferInstance + let : IsIntegralClosure v'.valuationSubring base.valuation.valuationSubring L := + valuationSubring_isIntegralClosure_of_isIntegral + (L := L) base.valuation v' + let : Module.Finite base.valuation.valuationSubring v'.valuationSubring := + moduleFinite_valuationSubring_of_isIntegralClosure + (L := L) base.valuation v' + exact + valuation_isEquiv_of_hasExtension_of_moduleFinite + (L := L) base.valuation target.valuation v' + +omit [FiniteDimensional K L] in +open ValuationTheory.DiscreteValuationField.Valuation renaming + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension → + integralClosureValuationSubring_le_of_hasExtension in +/-- Valuation-ring form of the Henselian uniqueness frontier. + +If the actual integral closure of the base valuation ring in `L` has the +valuation-ring dichotomy, and every valuation extension is a local overring of +that integral-closure valuation subring, then the base valuation has a unique +extension to `L` up to mathlib valuation equivalence. + +The remaining Henselian theorem is not hidden in a certificate here: it is +precisely the proof of the dichotomy and local-overring condition from the +Henselian hypotheses. This theorem performs the actual Chevalley plus +valuation-overring collapse step. -/ +theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_local_inclusion + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (htargetLocal : + IsLocalHom + ((integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval).inclusion + target.valuation.valuationSubring + (integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation target.valuation hval))) + (hlocal : + ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'], + IsLocalHom + ((integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval).inclusion + v'.valuationSubring + (integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation v' hval))) : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + have htarget_le : B ≤ target.valuation.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation target.valuation hval + have htarget_eq : target.valuation.valuationSubring = B := by + let : IsLocalHom (B.inclusion target.valuation.valuationSubring htarget_le) := + htargetLocal + exact + valuationSubring_eq_of_le_of_inclusion_isLocalHom + B target.valuation.valuationSubring htarget_le + intro Gamma' _ v' hExt + let : base.valuation.HasExtension v' := hExt + have hv_le : B ≤ v'.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation v' hval + have hv_eq : v'.valuationSubring = B := by + let : IsLocalHom (B.inclusion v'.valuationSubring hv_le) := + @hlocal Gamma' inferInstance v' hExt + exact + valuationSubring_eq_of_le_of_inclusion_isLocalHom + B v'.valuationSubring hv_le + have hSubring : target.valuation.valuationSubring = v'.valuationSubring := + htarget_eq.trans hv_eq.symm + exact valuation_isEquiv_of_valuationSubring_eq target v' hSubring + +omit [FiniteDimensional K L] in +open ValuationTheory.DiscreteValuationField.Valuation renaming + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension → + integralClosureValuationSubring_le_of_hasExtension in +/-- Center-prime form of the Henselian uniqueness frontier. + +If the actual integral closure of the base valuation ring is a valuation ring, +and the center of every extension valuation ring on that integral-closure +valuation ring is the maximal ideal, then the extension valuation is unique. + +This is the exact prime-theoretic step that remains after proving the +Henselian valuative dichotomy: the hypotheses are the center equalities +the Henselian finite-extension theorem must supply, not local-map or +certificate-style substitutes. -/ +theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_center_eq_maximalIdeal + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (htargetCenter : + ValuationSubring.idealOfLE + (integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval) + target.valuation.valuationSubring + (integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation target.valuation hval) = + IsLocalRing.maximalIdeal + (integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval)) + (hcenter : + ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'], + ValuationSubring.idealOfLE + (integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval) + v'.valuationSubring + (integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation v' hval) = + IsLocalRing.maximalIdeal + (integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval)) : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + have htarget_le : B ≤ target.valuation.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation target.valuation hval + have htarget_eq : target.valuation.valuationSubring = B := + valuationSubring_eq_of_le_of_idealOfLE_eq_maximalIdeal + B target.valuation.valuationSubring htarget_le + (by simpa [B, htarget_le] using htargetCenter) + intro Gamma' _ v' hExt + let : base.valuation.HasExtension v' := hExt + have hv_le : B ≤ v'.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation v' hval + have hv_eq : v'.valuationSubring = B := + valuationSubring_eq_of_le_of_idealOfLE_eq_maximalIdeal + B v'.valuationSubring hv_le + (by simpa [B, hv_le] using (@hcenter Gamma' inferInstance v' hExt)) + have hSubring : target.valuation.valuationSubring = v'.valuationSubring := + htarget_eq.trans hv_eq.symm + exact valuation_isEquiv_of_valuationSubring_eq target v' hSubring + +omit [FiniteDimensional K L] in +open ValuationTheory.DiscreteValuationField.Valuation renaming + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension → + integralClosureValuationSubring_le_of_hasExtension in +/-- Prime-uniqueness form of the Henselian uniqueness frontier. + +After the actual integral closure has been turned into a valuation subring, it +is enough to prove that every prime of that valuation subring whose contraction +to the base valuation ring is the base maximal ideal is itself the maximal +ideal. The center of each extension valuation ring has exactly that +contraction, so this theorem converts the Henselian local prime-uniqueness +statement into uniqueness of valuation extensions. -/ +theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_unique_primes_over_base_maximal + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (hunique : + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let i : base.valuationSubring →+* B := + integralClosureValuationSubringIntegerMapOfMemOrInv + (K := K) (L := L) base hval + ∀ P : Ideal B, P.IsPrime → P.comap i = base.maximalIdeal → + P = IsLocalRing.maximalIdeal B) : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let i : base.valuationSubring →+* B := + integralClosureValuationSubringIntegerMapOfMemOrInv + (K := K) (L := L) base hval + refine + (hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_center_eq_maximalIdeal + (K := K) (L := L) (base := base) (target := target) hval ?_ ?_ : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target)) + · let htarget_le : B ≤ target.valuation.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation target.valuation hval + exact hunique + (ValuationSubring.idealOfLE B target.valuation.valuationSubring htarget_le) + (by infer_instance) + (by + simpa [B, htarget_le, i] using + idealOfLE_comap_integralClosureValuationSubringIntegerMap_eq_maximalIdeal + (K := K) (L := L) base target.valuation hval) + · intro Gamma' _ v' hExt + let : base.valuation.HasExtension v' := hExt + let hv_le : B ≤ v'.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation v' hval + exact hunique + (ValuationSubring.idealOfLE B v'.valuationSubring hv_le) + (by infer_instance) + (by + simpa [B, hv_le, i] using + idealOfLE_comap_integralClosureValuationSubringIntegerMap_eq_maximalIdeal + (K := K) (L := L) base v' hval) + +/-- Finite-separable form of the Henselian uniqueness bridge. + +After the Henselian part proves the valuative dichotomy for the actual +integral closure, finite separability supplies the prime uniqueness over the +base maximal ideal by Dedekind theory. Thus no separate local-map, center +equality, integral-inclusion, or module-finiteness certificates are needed to +deduce uniqueness of the valuation extension. -/ +theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv + [Algebra.IsSeparable K L] + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := + (hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_unique_primes_over_base_maximal + base target) + hval + (by + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let i : base.valuationSubring →+* B := + integralClosureValuationSubringIntegerMapOfMemOrInv + (K := K) (L := L) base hval + change ∀ P : Ideal B, P.IsPrime → P.comap i = base.maximalIdeal → + P = IsLocalRing.maximalIdeal B + intro P hP hcomap + exact + prime_eq_maximalIdeal_of_comap_integralClosureValuationSubringIntegerMap_eq_maximalIdeal + (K := K) (L := L) (base := base) hval P hP hcomap) + +/-- Finite-separable uniqueness once the chosen target valuation ring has been +identified as the actual integral closure of the base valuation ring. + +The proof first turns the integral-closure identification into the valuative +dichotomy for `integralClosure base.valuationSubring L`; the finite-separable +Dedekind/local bridge above then supplies uniqueness of all valuation +extensions. -/ +theorem hasUniqueValuationExtension_of_target_valuationSubring_isIntegralClosure + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + [IsIntegralClosure target.valuationSubring base.valuationSubring L] : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := + (hasUniqueValuationExtension_of_integralClosure_mem_or_inv base target) + (integralClosure_mem_or_inv_of_target_valuationSubring_isIntegralClosure + (K := K) (L := L) base target) + +/-- Finite-separable uniqueness once the chosen target valuation ring is +module-finite over the base valuation ring. + +This is a theorem-level bridge, not a certificate package: module-finiteness +identifies the target valuation ring with the actual integral closure, and the +preceding theorem converts that identification into uniqueness of valuation +extensions. -/ +theorem hasUniqueValuationExtension_of_target_moduleFinite + [Algebra.IsSeparable K L] + [Module.Finite base.valuationSubring target.valuationSubring] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_moduleFinite + (K := K) (L := L) base target + exact + (hasUniqueValuationExtension_of_target_valuationSubring_isIntegralClosure + (K := K) (L := L) (base := base) (target := target) : + HasUniqueValuationExtension.{u, v, w, x, y} + (base := base) (target := target)) + +/-- Finite-separable uniqueness once the actual integral closure is known to be +a valuation ring. + +This is the local/DVR-facing form of the frontier: a Henselian proof may first +show that the finite integral closure is local, hence a valuation ring, and +then this theorem supplies uniqueness through the proven finite-separable +Dedekind/local bridge. -/ +theorem hasUniqueValuationExtension_of_integralClosure_valuationRing + [Algebra.IsSeparable K L] + [ValuationRing (integralClosureIntegers base target)] : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := + (hasUniqueValuationExtension_of_integralClosure_mem_or_inv base target) + ((integralClosure_mem_or_inv_of_integralClosure_valuationRing base target)) + +/-- Finite-separable uniqueness once the actual integral closure is local. + +This is the sharpened Henselian frontier: after the Henselian argument proves +that the finite integral closure is a local ring, Dedekind theory makes it a +valuation ring and the valuative-dichotomy bridge above supplies uniqueness of +all valuation extensions. -/ +theorem hasUniqueValuationExtension_of_integralClosure_isLocalRing + [Algebra.IsSeparable K L] + [IsLocalRing (integralClosureIntegers base target)] : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := + (hasUniqueValuationExtension_of_integralClosure_mem_or_inv base target) + (integralClosure_mem_or_inv_of_isLocalRing base target) + +/-- Finite-separable uniqueness once the actual integral closure has a unique +prime over the base maximal ideal. + +This is another Henselian-facing form: a Henselian argument may prove directly +that the finite integral closure has one prime above the base maximal ideal. +Integral going-up over the local base then makes the integral closure local, and +the local bridge above supplies uniqueness of valuation extensions. -/ +theorem hasUniqueValuationExtension_of_integralClosure_primesOver_base_maximal_eq_singleton + [Algebra.IsSeparable K L] + (P : Ideal (integralClosureIntegers base target)) + (hP : + Ideal.primesOver base.maximalIdeal (integralClosureIntegers base target) = {P}) : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by + let : IsLocalRing (integralClosureIntegers base target) := + (integralClosure_isLocalRing_of_primesOver_base_maximal_eq_singleton base target) P hP + exact + (hasUniqueValuationExtension_of_integralClosure_isLocalRing + (K := K) (L := L) (base := base) (target := target) : + HasUniqueValuationExtension.{u, v, w, x, y} + (base := base) (target := target)) + +/-- Finite-separable uniqueness once the residue fiber over the base maximal +ideal has at most one prime. + +The actual integral closure has a prime above the base maximal ideal by +going-up, and the fiber order-isomorphism identifies uniqueness in the fiber +with uniqueness of primes above the base maximal ideal. The already-proved +singleton/local bridge then supplies valuation uniqueness. -/ +theorem hasUniqueValuationExtension_of_integralClosure_base_maximal_fiber_subsingleton + [Algebra.IsSeparable K L] + [Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target)))] : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by + let : IsLocalRing (integralClosureIntegers base target) := + (integralClosure_isLocalRing_of_base_maximal_fiber_subsingleton base target) + exact + (hasUniqueValuationExtension_of_integralClosure_isLocalRing + (K := K) (L := L) (base := base) (target := target) : + HasUniqueValuationExtension.{u, v, w, x, y} + (base := base) (target := target)) + +/-- Finite-separable uniqueness from idempotent lifting in the residue fiber +over the base maximal ideal. + +This is the current Henselian-facing frontier: a Henselian idempotent-lifting +argument can supply `hlift`; the finite Artinian fiber/topological bridge then +gives a unique prime above the base maximal ideal, localness of the actual +integral closure, and hence uniqueness of valuation extensions. -/ +theorem hasUniqueValuationExtension_of_integralClosure_base_maximal_fiber_idempotents_lift + [Algebra.IsSeparable K L] + (hlift : + ∀ e : base.maximalIdeal.Fiber (integralClosureIntegers base target), + IsIdempotentElem e → + ∃ b : (integralClosureIntegers base target), + IsIdempotentElem b ∧ + Algebra.TensorProduct.includeRight b = e) : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by + let : Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target))) := + (integralClosure_base_maximal_fiber_subsingleton_of_idempotents_lift base target) hlift + exact + (hasUniqueValuationExtension_of_integralClosure_base_maximal_fiber_subsingleton + (K := K) (L := L) (base := base) (target := target) : + HasUniqueValuationExtension.{u, v, w, x, y} + (base := base) (target := target)) + +/-- Finite-separable uniqueness from the Henselian-kernel idempotent-lifting +form for the residue fiber over the base maximal ideal. + +This is a sharper Henselian-facing criterion than the raw `hlift` theorem: +Hensel's lemma for `X^2 - X` supplies the idempotent lift once the fiber map is +surjective and its kernel is a Henselian ideal of the actual integral closure. -/ +theorem IntegralClosureFiber.unique_of_includeRight_surjective_henselianRing_ker + [Algebra.IsSeparable K L] + (hsurj : + Function.Surjective + (Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target))) + [HenselianRing (integralClosureIntegers base target) + (RingHom.ker + ((Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target)) : + (integralClosureIntegers base target) →+* + base.maximalIdeal.Fiber (integralClosureIntegers base target)))] : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by + let : Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target))) := + (integralClosure_maximal_fiber_subsingleton_of_includeRight_surjective_henselian_ker + base target) + hsurj + exact + (hasUniqueValuationExtension_of_integralClosure_base_maximal_fiber_subsingleton + (K := K) (L := L) (base := base) (target := target) : + HasUniqueValuationExtension.{u, v, w, x, y} + (base := base) (target := target)) + +/-- Finite-separable uniqueness from the remaining Henselian-kernel input for +the residue-fiber `includeRight` map. + +Surjectivity of `includeRight` is automatic over the local base valuation ring; +the only remaining Henselian-pair input in this criterion is that its kernel is +Henselian in the actual integral closure. -/ +theorem + hasUniqueValuationExtension_of_integralClosure_base_maximal_fiber_includeRight_henselianRing_ker + [Algebra.IsSeparable K L] + [HenselianRing (integralClosureIntegers base target) + (RingHom.ker + ((Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target)) : + (integralClosureIntegers base target) →+* + base.maximalIdeal.Fiber (integralClosureIntegers base target)))] : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by + let : Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target))) := + (integralClosure_base_maximal_fiber_subsingleton_of_includeRight_henselianRing_ker base target) + exact + (hasUniqueValuationExtension_of_integralClosure_base_maximal_fiber_subsingleton + (K := K) (L := L) (base := base) (target := target) : + HasUniqueValuationExtension.{u, v, w, x, y} + (base := base) (target := target)) + +/-- Finite-separable uniqueness from the natural Henselian-pair ideal in the +actual integral closure. + +The kernel computation for the residue-fiber includeRight map identifies its +kernel with base.maximalIdeal.map; hence a Henselian proof for that natural +ideal is enough to enter the finite-extension uniqueness bridge. -/ +theorem hasUniqueValuationExtension_of_integralClosure_base_maximal_map_henselianRing + [Algebra.IsSeparable K L] + [HenselianRing (integralClosureIntegers base target) + (base.maximalIdeal.map + (algebraMap base.valuationSubring (integralClosureIntegers base target)))] : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by + let : Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target))) := + (integralClosure_base_maximal_fiber_subsingleton_of_henselianRing_maximalIdeal_map base target) + exact + (hasUniqueValuationExtension_of_integralClosure_base_maximal_fiber_subsingleton + (K := K) (L := L) (base := base) (target := target) : + HasUniqueValuationExtension.{u, v, w, x, y} + (base := base) (target := target)) + + +/-- Finite separable extensions of complete DVFs have a unique extension of the +base valuation, up to mathlib's valuation equivalence. + +The proof routes through the actual integral closure: finite-module completeness +makes the ideal generated by the base maximal ideal Henselian there, and the +residue-fiber idempotent argument collapses the possible primes above the base +maximal ideal. -/ +theorem hasUniqueValuationExtension_of_finite_separable + [Algebra.IsSeparable K L] : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by + let : HenselianRing (integralClosureIntegers base target) + (base.maximalIdeal.map + (algebraMap base.valuationSubring (integralClosureIntegers base target))) := + (integralClosure_base_maximal_map_henselianRing base target) + exact + (hasUniqueValuationExtension_of_integralClosure_base_maximal_map_henselianRing + (K := K) (L := L) (base := base) (target := target) : + HasUniqueValuationExtension.{u, v, w, x, y} + (base := base) (target := target)) + +/-- In a finite separable extension of complete DVFs, uniqueness also holds +after forgetting both fields to Henselian DVFs. -/ +theorem henselian_hasUniqueValuationExtension_of_finite_separable + [Algebra.IsSeparable K L] : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} + base.toHenselianDVF target.toHenselianDVF := + hasUniqueValuationExtension_toHenselianDVF base target + ((hasUniqueValuationExtension_of_finite_separable base target) : + HasUniqueValuationExtension.{u, v, w, x, y} + (base := base) (target := target)) + +/-- In a finite separable extension of complete DVFs, the actual integral +closure of the base valuation ring is itself a valuation ring. -/ +theorem integralClosure_mem_or_inv_of_finite_separable + (target : CompleteDVF.{w, x} L) + [Algebra.IsSeparable K L] : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring := by + let : HenselianRing (integralClosureIntegers base target) + (base.maximalIdeal.map + (algebraMap base.valuationSubring (integralClosureIntegers base target))) := + (integralClosure_base_maximal_map_henselianRing base target) + let : Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target))) := + (integralClosure_base_maximal_fiber_subsingleton_of_henselianRing_maximalIdeal_map base target) + let : IsLocalRing (integralClosureIntegers base target) := + (integralClosure_isLocalRing_of_base_maximal_fiber_subsingleton base target) + exact (integralClosure_mem_or_inv_of_isLocalRing base target) + +omit [FiniteDimensional K L] in +open ValuationTheory.DiscreteValuationField.Valuation renaming + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension → + integralClosureValuationSubring_le_of_hasExtension in +/-- Integral-inclusion form of the Henselian uniqueness frontier. + +Once the actual integral closure has been shown to be a valuation ring, it is +enough to prove that the inclusions from that valuation ring into every +extension valuation ring are integral. The center equalities needed for the +valuation-overring collapse then follow from going-up for integral maps between +local rings, not from a separate center certificate. -/ +theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_integral_inclusion + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (htargetIntegral : + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation target.valuation hval + (B.inclusion target.valuation.valuationSubring htarget_le).IsIntegral) + (hintegral : + ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'], + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let hv_le : B ≤ v'.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation v' hval + (B.inclusion v'.valuationSubring hv_le).IsIntegral) : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by + refine + (hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_center_eq_maximalIdeal + base target) + hval ?_ ?_ + · let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation target.valuation hval + exact idealOfLE_eq_maximalIdeal_of_isIntegral B target.valuation.valuationSubring + htarget_le (by simpa [B, htarget_le] using htargetIntegral) + · intro Gamma' _ v' hExt + let : base.valuation.HasExtension v' := hExt + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let hv_le : B ≤ v'.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation v' hval + exact idealOfLE_eq_maximalIdeal_of_isIntegral B v'.valuationSubring hv_le + (by simpa [B, hv_le] using (@hintegral Gamma' inferInstance v' hExt)) + +omit [FiniteDimensional K L] in +open ValuationTheory.DiscreteValuationField.Valuation renaming + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension → + integralClosureValuationSubring_le_of_hasExtension in +/-- Finite-inclusion form of the Henselian uniqueness frontier. + +This is useful when the Henselian argument proves finite generation of the +valuation-overring inclusions rather than integrality directly. -/ +theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_finite_inclusion + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (htargetFinite : + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation target.valuation hval + (B.inclusion target.valuation.valuationSubring htarget_le).Finite) + (hfinite : + ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'], + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let hv_le : B ≤ v'.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation v' hval + (B.inclusion v'.valuationSubring hv_le).Finite) : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by + refine + (hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_integral_inclusion base + target) + hval ?_ ?_ + · let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation target.valuation hval + have htargetFinite' : + (B.inclusion target.valuation.valuationSubring htarget_le).Finite := by + simpa [B, htarget_le] using htargetFinite + exact htargetFinite'.to_isIntegral + · intro Gamma' _ v' hExt + let : base.valuation.HasExtension v' := hExt + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let hv_le : B ≤ v'.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation v' hval + have hvFinite : + (B.inclusion v'.valuationSubring hv_le).Finite := by + simpa [B, hv_le] using + (@hfinite Gamma' inferInstance v' hExt) + exact hvFinite.to_isIntegral + +omit [FiniteDimensional K L] in +open ValuationTheory.DiscreteValuationField.Valuation renaming + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension → + integralClosureValuationSubring_le_of_hasExtension in +/-- Elementwise center form of the Henselian uniqueness frontier. + +After proving that the actual integral closure is a valuation ring, it is +enough to check centers by maximal-ideal membership along the inclusions into +the target valuation ring and every comparison extension valuation ring. This +is the form closest to the remaining Henselian argument: one proves an +element of the integral closure is nonunit exactly when its image in the +extension valuation ring is nonunit, and the valuation-overring collapse is +then automatic. -/ +theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_center_mem_iff + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (htargetCenterMem : + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation target.valuation hval + ∀ x : B, + B.inclusion target.valuation.valuationSubring htarget_le x ∈ + IsLocalRing.maximalIdeal target.valuation.valuationSubring ↔ + x ∈ IsLocalRing.maximalIdeal B) + (hcenterMem : + ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'], + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let hv_le : B ≤ v'.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation v' hval + ∀ x : B, + B.inclusion v'.valuationSubring hv_le x ∈ + IsLocalRing.maximalIdeal v'.valuationSubring ↔ + x ∈ IsLocalRing.maximalIdeal B) : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by + refine + (hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_center_eq_maximalIdeal + (K := K) (L := L) (base := base) (target := target) hval ?_ ?_ : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target)) + · let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation target.valuation hval + exact + idealOfLE_eq_maximalIdeal_of_mem_maximalIdeal_iff + B target.valuation.valuationSubring htarget_le + (by simpa [B, htarget_le] using htargetCenterMem) + · intro Gamma' _ v' hExt + let : base.valuation.HasExtension v' := hExt + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let hv_le : B ≤ v'.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation v' hval + exact + idealOfLE_eq_maximalIdeal_of_mem_maximalIdeal_iff + B v'.valuationSubring hv_le + (by simpa [B, hv_le] using (@hcenterMem Gamma' inferInstance v' hExt)) + +omit [FiniteDimensional K L] in +open ValuationTheory.DiscreteValuationField.Valuation renaming + integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension → + integralClosureValuationSubring_le_of_hasExtension in +/-- One-sided elementwise center form of the Henselian uniqueness frontier. + +For inclusions of local rings, the implication from target nonunit to source +nonunit is automatic. Thus, after proving that the actual integral closure is +a valuation ring, the remaining center work is only to show that elements in the +maximal ideal of the integral-closure valuation ring map into the maximal ideals +of the extension valuation rings. -/ +theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_center_mem + (hval : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) + (htargetCenterMem : + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation target.valuation hval + ∀ x : B, + x ∈ IsLocalRing.maximalIdeal B → + B.inclusion target.valuation.valuationSubring htarget_le x ∈ + IsLocalRing.maximalIdeal target.valuation.valuationSubring) + (hcenterMem : + ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'], + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let hv_le : B ≤ v'.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation v' hval + ∀ x : B, + x ∈ IsLocalRing.maximalIdeal B → + B.inclusion v'.valuationSubring hv_le x ∈ + IsLocalRing.maximalIdeal v'.valuationSubring) : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by + refine + (hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_center_mem_iff base target) + hval ?_ ?_ + · let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation target.valuation hval + change ∀ x : B, + B.inclusion target.valuation.valuationSubring htarget_le x ∈ + IsLocalRing.maximalIdeal target.valuation.valuationSubring ↔ + x ∈ IsLocalRing.maximalIdeal B + intro x + constructor + · intro hx + exact mem_maximalIdeal_of_map_mem_maximalIdeal + (B.inclusion target.valuation.valuationSubring htarget_le) hx + · intro hx + simpa [B, htarget_le] using htargetCenterMem x hx + · intro Gamma' _ v' hExt + let : base.valuation.HasExtension v' := hExt + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let hv_le : B ≤ v'.valuationSubring := + integralClosureValuationSubring_le_of_hasExtension + (L := L) base.valuation v' hval + change ∀ x : B, + B.inclusion v'.valuationSubring hv_le x ∈ + IsLocalRing.maximalIdeal v'.valuationSubring ↔ + x ∈ IsLocalRing.maximalIdeal B + intro x + constructor + · intro hx + exact mem_maximalIdeal_of_map_mem_maximalIdeal + (B.inclusion v'.valuationSubring hv_le) hx + · intro hx + simpa [B, hv_le] using + (@hcenterMem Gamma' inferInstance v' hExt x hx) + +omit [FiniteDimensional K L] [base.valuation.HasExtension target.valuation] in +/-- The valuation-subring equality consequence of unique valuation extension. -/ +theorem valuationSubring_eq_of_hasUniqueValuationExtension + (huniq : HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target)) + {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'] : + target.valuation.valuationSubring = v'.valuationSubring := + valuationSubring_eq_of_valuation_isEquiv target (@huniq Gamma' _ v' _) + +omit [FiniteDimensional K L] [base.valuation.HasExtension target.valuation] in +/-- Unique extension of the base valuation is equivalent to equality of the +valuation subring with every extension valuation. -/ +theorem hasUniqueValuationExtension_iff_forall_valuationSubring_eq + : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) ↔ + ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'], + target.valuation.valuationSubring = v'.valuationSubring := by + constructor + · intro huniq Gamma' _ v' _ + exact (valuationSubring_eq_of_hasUniqueValuationExtension base target) huniq v' + · intro h + exact (hasUniqueValuationExtension_of_forall_valuationSubring_eq base target) + (by + intro Gamma' _ v' _ + exact h v') + +omit [FiniteDimensional K L] [base.valuation.HasExtension target.valuation] in +/-- Unique extension of the base valuation can be checked pointwise on +membership in valuation subrings. -/ +theorem hasUniqueValuationExtension_iff_forall_mem_valuationSubring + : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) ↔ + ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'], + ∀ z : L, z ∈ target.valuation.valuationSubring ↔ + z ∈ v'.valuationSubring := by + constructor + · intro huniq Gamma' _ v' _ z + rw [(valuationSubring_eq_of_hasUniqueValuationExtension base target) huniq v'] + · intro h + rw [(hasUniqueValuationExtension_iff_forall_valuationSubring_eq base target)] + intro Gamma' _ v' _ + exact (valuationSubring_eq_iff_mem_valuationSubring target v').2 + (@h Gamma' _ v' _) + +/-- In a finite separable extension of complete DVFs, every extension valuation +is equivalent to the chosen target valuation. -/ +theorem valuation_isEquiv_of_finite_separable + [Algebra.IsSeparable K L] + {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'] : + target.valuation.IsEquiv v' := + ((hasUniqueValuationExtension_of_finite_separable base target) : + HasUniqueValuationExtension.{u, v, w, x, y} + (base := base) (target := target)) v' + +/-- In a finite separable extension of complete DVFs, the chosen target +valuation subring equals the valuation subring of any extension valuation. -/ +theorem valuationSubring_eq_of_finite_separable + [Algebra.IsSeparable K L] + {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'] : + target.valuation.valuationSubring = v'.valuationSubring := + (valuationSubring_eq_of_hasUniqueValuationExtension base target) + ((hasUniqueValuationExtension_of_finite_separable base target) : + HasUniqueValuationExtension.{u, v, w, x, y} + (base := base) (target := target)) v' + +/-- Symmetric form of `valuationSubring_eq_of_finite_separable`, useful for +rewriting a comparison valuation back to the chosen target valuation ring. -/ +theorem valuationSubring_eq_target_of_finite_separable + [Algebra.IsSeparable K L] + {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'] : + v'.valuationSubring = target.valuation.valuationSubring := + ((valuationSubring_eq_of_finite_separable base target) v').symm + +/-- Elementwise finite-separable comparison of the chosen target valuation +subring with any other extension valuation subring. -/ +theorem mem_valuationSubring_iff_of_finite_separable + [Algebra.IsSeparable K L] + {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'] + (z : L) : + z ∈ target.valuation.valuationSubring ↔ z ∈ v'.valuationSubring := by + rw [(valuationSubring_eq_of_finite_separable base target) v'] + +/-- Symmetric elementwise finite-separable comparison, useful when the +comparison valuation is the left-hand side. -/ +theorem mem_target_valuationSubring_iff_of_finite_separable + [Algebra.IsSeparable K L] + {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'] + (z : L) : + z ∈ v'.valuationSubring ↔ z ∈ target.valuation.valuationSubring := + ((mem_valuationSubring_iff_of_finite_separable base target) v' z).symm + +omit [FiniteDimensional K L] [base.valuation.HasExtension target.valuation] in +/-- Under unique extension, any valuation subring whose canonical valuation +extends the base valuation is the chosen target valuation ring. -/ +theorem target_valuationSubring_eq_of_hasUniqueValuationExtension + (huniq : HasUniqueValuationExtension.{u, v, w, x, w} + (base := base) (target := target)) + (B : ValuationSubring L) [base.valuation.HasExtension B.valuation] : + target.valuation.valuationSubring = B := by + have hEquiv : target.valuation.IsEquiv B.valuation := + huniq B.valuation + have hSubring : + target.valuation.valuationSubring = B.valuation.valuationSubring := + (_root_.Valuation.isEquiv_iff_valuationSubring + target.valuation B.valuation).1 hEquiv + simpa [ValuationSubring.valuationSubring_valuation] using hSubring + +omit [FiniteDimensional K L] [base.valuation.HasExtension target.valuation] in +/-- Under unique extension, the valuation subring produced by Chevalley's +construction is the chosen target valuation ring. -/ +theorem exists_chevalley_valuationSubring_eq_target_of_hasUniqueValuationExtension + (huniq : HasUniqueValuationExtension.{u, v, w, x, w} + (base := base) (target := target)) : + ∃ B : ValuationSubring L, + ∃ hB : ∀ x : base.valuationSubring, + algebraMap base.valuationSubring L x ∈ B.toSubring, + IsLocalHom + ((algebraMap base.valuationSubring L).codRestrict B.toSubring hB) ∧ + (∀ x : K, algebraMap K L x ∈ B.toSubring ↔ + x ∈ base.valuation.valuationSubring) ∧ + base.valuation.HasExtension B.valuation ∧ + target.valuation.valuationSubring = B := by + obtain ⟨B, hB, hlocal, hpullback, hExt⟩ := + exists_extension_valuationSubring_with_hasExtension + (L := L) base.valuation + let : base.valuation.HasExtension B.valuation := hExt + refine ⟨B, hB, hlocal, hpullback, hExt, ?_⟩ + exact target_valuationSubring_eq_of_hasUniqueValuationExtension + (K := K) (L := L) (base := base) (target := target) huniq B + +omit [FiniteDimensional K L] [base.valuation.HasExtension target.valuation] in +open ValuationTheory.DiscreteValuationField.Valuation renaming + chevalley_exists_extension_valuation_with_pullback_integralClosure_local_data → + chevalley_exists_extension_valuation_with_integralClosure in +/-- Under unique extension, the actual valuation produced by Chevalley's +theorem can be chosen together with all construction data and is equivalent to +the chosen target valuation. This is the finite-extension frontier form of +Chevalley plus uniqueness: it does not merely return a valuation subring, but +keeps the extension valuation, exact base pullback, integral-closure +containment, local map, residue injection, valuation equivalence, and +valuation-ring equality for the same witness. -/ +theorem exists_chevalley_extension_valuation_eq_target_of_hasUniqueValuationExtension + (huniq : HasUniqueValuationExtension.{u, v, w, x, w} + (base := base) (target := target)) : + ∃ ΓL : Type w, + ∃ _ : LinearOrderedCommGroupWithZero ΓL, + ∃ vL : _root_.Valuation L ΓL, + ∃ hExt : base.valuation.HasExtension vL, + letI : base.valuation.HasExtension vL := hExt + letI : Algebra base.valuationSubring vL.valuationSubring := by + change Algebra base.valuation.valuationSubring vL.valuationSubring + infer_instance + letI : IsLocalHom + (algebraMap base.valuationSubring vL.valuationSubring) := by + exact Valuation.integerMap_isLocalHom_of_hasExtension + base.valuation vL + (∀ a : K, algebraMap K L a ∈ vL.valuationSubring ↔ + a ∈ base.valuation.valuationSubring) ∧ + (∀ z : integralClosure base.valuationSubring L, + (z : L) ∈ vL.valuationSubring) ∧ + (IsLocalRing.maximalIdeal vL.valuationSubring).LiesOver + (IsLocalRing.maximalIdeal base.valuationSubring) ∧ + IsLocalHom + (algebraMap base.valuationSubring vL.valuationSubring) ∧ + Function.Injective + (IsLocalRing.ResidueField.map + (algebraMap base.valuationSubring vL.valuationSubring)) ∧ + target.valuation.IsEquiv vL ∧ + target.valuation.valuationSubring = vL.valuationSubring := by + obtain ⟨ΓL, hΓL, vL, hExt, hpullback, hIntegral, hlies, hlocal, + hResidue⟩ := + chevalley_exists_extension_valuation_with_integralClosure + (L := L) base.valuation + let : LinearOrderedCommGroupWithZero ΓL := hΓL + let : base.valuation.HasExtension vL := hExt + let : Algebra base.valuationSubring vL.valuationSubring := by + change Algebra base.valuation.valuationSubring vL.valuationSubring + infer_instance + let : IsLocalHom + (algebraMap base.valuationSubring vL.valuationSubring) := by + exact Valuation.integerMap_isLocalHom_of_hasExtension + base.valuation vL + have hEquiv : target.valuation.IsEquiv vL := + @huniq ΓL inferInstance vL inferInstance + have hSubring : target.valuation.valuationSubring = vL.valuationSubring := + valuationSubring_eq_of_valuation_isEquiv target hEquiv + exact ⟨ΓL, inferInstance, vL, inferInstance, hpullback, hIntegral, hlies, + hlocal, hResidue, hEquiv, hSubring⟩ + + +/-- In a finite separable extension, any valuation subring whose valuation +extends the base valuation is the chosen target valuation ring. -/ +theorem target_valuationSubring_eq_of_finite_separable + [Algebra.IsSeparable K L] + (B : ValuationSubring L) [base.valuation.HasExtension B.valuation] : + target.valuation.valuationSubring = B := by + exact target_valuationSubring_eq_of_hasUniqueValuationExtension + (K := K) (L := L) (base := base) (target := target) + ((hasUniqueValuationExtension_of_finite_separable base target) : + HasUniqueValuationExtension.{u, v, w, x, w} + (base := base) (target := target)) B + +/-- In a finite separable extension, the chosen target valuation ring is the +actual integral closure of the base valuation ring in `L`. -/ +theorem target_valuationSubring_isIntegralClosure_of_finite_separable + [Algebra.IsSeparable K L] + : + IsIntegralClosure target.valuationSubring base.valuationSubring L := by + let hval := (integralClosure_mem_or_inv_of_finite_separable base target) + let B := + integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let : base.valuation.HasExtension B.valuation := + integralClosureValuationSubringOfMemOrInv_hasExtension + (L := L) base.valuation hval + have htarget_eq : target.valuation.valuationSubring = B := + (target_valuationSubring_eq_of_finite_separable base target) B + have hB : IsIntegralClosure B base.valuationSubring L := + integralClosureValuationSubringOfMemOrInv_isIntegralClosure + (L := L) base.valuation hval + change IsIntegralClosure target.valuation.valuationSubring base.valuationSubring L + rw [htarget_eq] + exact hB + +/-- Module-finiteness of the target valuation ring in a finite separable +extension, with no separate integral-closure certificate. -/ +theorem moduleFinite_target_valuationSubring_of_finite_separable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + Module.Finite base.valuationSubring target.valuationSubring := by + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + (target_valuationSubring_isIntegralClosure_of_finite_separable base target) + exact moduleFinite_target_valuationSubring_of_isIntegralClosure + (K := K) (L := L) base target + +/-- In a finite separable complete-DVF extension, the chosen target maximal +ideal is the unique prime above the base maximal ideal. -/ +theorem target_primesOver_base_maximal_eq_singleton_of_finite_separable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + Ideal.primesOver base.maximalIdeal target.valuationSubring = + {target.maximalIdeal} := by + let : Module.Finite base.valuationSubring target.valuationSubring := + (moduleFinite_target_valuationSubring_of_finite_separable base target) + exact target_primesOver_base_maximal_eq_singleton_of_moduleFinite + (K := K) (L := L) base target + +/-- Cardinal form of +`target_primesOver_base_maximal_eq_singleton_of_finite_separable`. -/ +theorem ncard_target_primesOver_base_maximal_eq_one_of_finite_separable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + (Ideal.primesOver base.maximalIdeal target.valuationSubring).ncard = 1 := by + rw [(target_primesOver_base_maximal_eq_singleton_of_finite_separable base target)] + exact Set.ncard_singleton target.maximalIdeal + +/-- Torsion-freeness of the target valuation ring over the base valuation ring +in a finite separable extension, with no separate integral-closure +certificate. -/ +theorem moduleIsTorsionFree_target_valuationSubring_of_finite_separable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + Module.IsTorsionFree base.valuationSubring target.valuationSubring := by + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + (target_valuationSubring_isIntegralClosure_of_finite_separable base target) + let : IsFractionRing base.valuationSubring K := + base_valuationSubring_isFractionRing (K := K) base + let : FaithfulSMul base.valuationSubring L := + FaithfulSMul.of_field_isFractionRing base.valuationSubring L K L + let : Module.IsTorsionFree base.valuationSubring L := inferInstance + exact IsIntegralClosure.isTorsionFree base.valuationSubring L + +/-- Local-Dedekind fundamental identity for a finite separable extension, +stated directly for the chosen target valuation ring. -/ +theorem ideal_ramificationIdx_mul_inertiaDeg_eq_finrank_of_finite_separable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + Ideal.ramificationIdx' base.maximalIdeal target.maximalIdeal * + target.maximalIdeal.inertiaDeg base.valuationSubring = Module.finrank K L := by + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + (target_valuationSubring_isIntegralClosure_of_finite_separable base target) + exact ideal_ramificationIdx_mul_inertiaDeg_eq_finrank_of_isIntegralClosure + (K := K) (L := L) base target + +/-- The canonical ramification index times residue degree is the field degree for a +finite separable extension, with no separate integral-closure certificate. -/ +theorem ramificationIndex_mul_residueDegree_eq_degree_of_finite_separable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + (ValuedExtension.ramificationIndex base.toDVF target.toDVF) * (ValuedExtension.residueDegree + base.toDVF target.toDVF) = (ValuedExtension.degree base.toDVF target.toDVF) := by + let : IsIntegralClosure target.valuationSubring base.valuationSubring L := + (target_valuationSubring_isIntegralClosure_of_finite_separable base target) + exact (ramificationIndex_mul_residueDegree_eq_degree_of_isIntegralClosure base target) + +/-- A finite separable valued extension is defectless. -/ +theorem isDefectless_of_finite_separable + [Algebra.IsSeparable K L] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + ValuedExtension.IsDefectless base.toDVF target.toDVF := by + change Module.finrank K L = + Ideal.ramificationIdx' base.maximalIdeal target.maximalIdeal * + target.maximalIdeal.inertiaDeg base.valuationSubring + exact ((ideal_ramificationIdx_mul_inertiaDeg_eq_finrank_of_finite_separable base target)).symm + +/-- In a finite separable extension, Chevalley's extension valuation can be +chosen so that its valuation subring is the target valuation ring. -/ +theorem exists_chevalley_valuationSubring_eq_target_of_finite_separable + [Algebra.IsSeparable K L] : + ∃ B : ValuationSubring L, + ∃ hB : ∀ x : base.valuationSubring, + algebraMap base.valuationSubring L x ∈ B.toSubring, + IsLocalHom + ((algebraMap base.valuationSubring L).codRestrict B.toSubring hB) ∧ + (∀ x : K, algebraMap K L x ∈ B.toSubring ↔ + x ∈ base.valuation.valuationSubring) ∧ + base.valuation.HasExtension B.valuation ∧ + target.valuation.valuationSubring = B := by + exact exists_chevalley_valuationSubring_eq_target_of_hasUniqueValuationExtension + (K := K) (L := L) (base := base) (target := target) + ((hasUniqueValuationExtension_of_finite_separable base target) : + HasUniqueValuationExtension.{u, v, w, x, w} + (base := base) (target := target)) + +/-- In a finite separable extension, Chevalley's extension valuation can be +chosen with all local/integral-closure data and equivalent to the target +valuation. -/ +theorem exists_chevalley_extension_valuation_eq_target_of_finite_separable + [Algebra.IsSeparable K L] : + ∃ ΓL : Type w, + ∃ _ : LinearOrderedCommGroupWithZero ΓL, + ∃ vL : _root_.Valuation L ΓL, + ∃ hExt : base.valuation.HasExtension vL, + letI : base.valuation.HasExtension vL := hExt + letI : Algebra base.valuationSubring vL.valuationSubring := by + change Algebra base.valuation.valuationSubring vL.valuationSubring + infer_instance + letI : IsLocalHom + (algebraMap base.valuationSubring vL.valuationSubring) := by + exact Valuation.integerMap_isLocalHom_of_hasExtension + base.valuation vL + (∀ a : K, algebraMap K L a ∈ vL.valuationSubring ↔ + a ∈ base.valuation.valuationSubring) ∧ + (∀ z : integralClosure base.valuationSubring L, + (z : L) ∈ vL.valuationSubring) ∧ + (IsLocalRing.maximalIdeal vL.valuationSubring).LiesOver + (IsLocalRing.maximalIdeal base.valuationSubring) ∧ + IsLocalHom + (algebraMap base.valuationSubring vL.valuationSubring) ∧ + Function.Injective + (IsLocalRing.ResidueField.map + (algebraMap base.valuationSubring vL.valuationSubring)) ∧ + target.valuation.IsEquiv vL ∧ + target.valuation.valuationSubring = vL.valuationSubring := by + exact (exists_chevalley_extension_valuation_eq_target_of_hasUniqueValuationExtension base target) + ((hasUniqueValuationExtension_of_finite_separable base target) : + HasUniqueValuationExtension.{u, v, w, x, w} + (base := base) (target := target)) + +/-- If the chosen target valuation ring is an actual integral closure of the base +valuation ring in `L`, it is canonically equivalent to mathlib's +`integralClosure`. -/ +noncomputable def integralClosureEquivValuationSubring + [Algebra base.valuationSubring L] + [IsScalarTower base.valuationSubring target.valuationSubring L] + [IsIntegralClosure target.valuationSubring base.valuationSubring L] : + (integralClosure base.valuationSubring L) ≃ₐ[base.valuationSubring] + target.valuationSubring := + IsIntegralClosure.equiv base.valuationSubring + (integralClosure base.valuationSubring L) L target.valuationSubring + +end ValuedExtension +end DiscreteValuationField + +end + +end ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteIntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteIntegralClosure.lean new file mode 100644 index 0000000000..2a4bf4c9e8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteIntegralClosure.lean @@ -0,0 +1,766 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core +public import Mathlib.RingTheory.Valuation.Discrete.IsDiscreteValuationRing + +/-! # Finite Integral Closure -/ + +@[expose] public section +namespace ValuationTheory + +/-! +# Finite integral closures over complete DVFs + +This file provides record-free theorems for the integral closure +of a complete-DVF valuation ring in a finite separable field extension. +-/ + +noncomputable +section + +universe u v w + +namespace DiscreteValuationField +namespace ValuedExtension + +open DiscreteValuationField.Valuation + +variable {K : Type u} {L : Type w} [Field K] [Field L] +variable [Algebra K L] [FiniteDimensional K L] + +/- The algebra map from the base valuation ring into the integral +closure is injective. -/ +omit [FiniteDimensional K L] in +/-- The algebra map into a finite integral closure is injective. -/ +theorem CanonicalIntegralClosure.algebraMap_injective + (base : CompleteDVF.{u, v} K) : + Function.Injective + (algebraMap base.valuationSubring + (integralClosure base.valuationSubring L)) := by + intro x y hxy + apply Subtype.ext + apply FaithfulSMul.algebraMap_injective K L + exact + congrArg + (fun z : integralClosure base.valuationSubring L => (z : L)) hxy + +/- The integral closure is faithful as a module over the base valuation +ring. -/ +omit [FiniteDimensional K L] in +/-- Scalar multiplication on a finite integral closure is faithful. -/ +theorem CanonicalIntegralClosure.faithfulSMul + (base : CompleteDVF.{u, v} K) : + FaithfulSMul base.valuationSubring + (integralClosure base.valuationSubring L) := + (faithfulSMul_iff_algebraMap_injective base.valuationSubring + (integralClosure base.valuationSubring L)).mpr + (CanonicalIntegralClosure.algebraMap_injective (K := K) (L := L) base) + +/-- In a finite separable extension of a complete DVF, the actual integral +closure is complete for the ideal generated by the base maximal ideal. -/ +theorem integralClosure_base_maximal_map_isAdicComplete_of_finite_separable + (base : CompleteDVF.{u, v} K) + [Algebra.IsSeparable K L] : + IsAdicComplete + (base.maximalIdeal.map + (algebraMap base.valuationSubring + (integralClosure base.valuationSubring L))) + (integralClosure base.valuationSubring L) := by + let : IsNoetherianRing base.valuationSubring := + base_valuationSubring_isNoetherianRing (K := K) base + let : IsFractionRing base.valuationSubring K := + base_valuationSubring_isFractionRing (K := K) base + let : IsIntegrallyClosed base.valuationSubring := + base_valuationSubring_isIntegrallyClosed (K := K) base + let : Module.Finite base.valuationSubring + (integralClosure base.valuationSubring L) := + IsIntegralClosure.finite base.valuationSubring K L + (integralClosure base.valuationSubring L) + have : IsAdicComplete base.maximalIdeal base.valuationSubring := + base.isAdicComplete + have hcomplete : + IsAdicComplete base.maximalIdeal + (integralClosure base.valuationSubring L) := + ValuationTheory.DiscreteValuationField.isAdicComplete_of_moduleFinite + (I := base.maximalIdeal) + exact + (isAdicComplete_map_algebraMap_iff + (I := base.maximalIdeal) + (S := integralClosure base.valuationSubring L)).mpr hcomplete + +/-- In a finite separable extension of a complete DVF, the actual integral +closure of the base valuation ring is Henselian along the ideal generated by +the base maximal ideal. + +This is independent of any pre-existing `Extension` record. It is the +source-producing input used before canonical ramification and residue +invariants have been packaged. -/ +theorem integralClosure_henselianRing_of_finite_separable + (base : CompleteDVF.{u, v} K) + [Algebra.IsSeparable K L] : + HenselianRing (integralClosure base.valuationSubring L) + (base.maximalIdeal.map + (algebraMap base.valuationSubring + (integralClosure base.valuationSubring L))) := by + let : + IsAdicComplete + (base.maximalIdeal.map + (algebraMap base.valuationSubring + (integralClosure base.valuationSubring L))) + (integralClosure base.valuationSubring L) := + integralClosure_base_maximal_map_isAdicComplete_of_finite_separable + (K := K) (L := L) base + infer_instance + +/-- In a finite separable extension of a complete DVF, the residue fiber of the +actual integral closure over the base maximal ideal has at most one prime. + +The proof combines finite Artinian residue fibers with Henselian idempotent +lifting from `integralClosure_henselianRing_of_finite_separable`. -/ +theorem integralClosure_base_maximal_fiber_subsingleton_of_finite_separable + (base : CompleteDVF.{u, v} K) + [Algebra.IsSeparable K L] : + Subsingleton + (PrimeSpectrum + (base.maximalIdeal.Fiber (integralClosure base.valuationSubring L))) := by + let B := integralClosure base.valuationSubring L + let : IsNoetherianRing base.valuationSubring := + base_valuationSubring_isNoetherianRing (K := K) base + let : IsFractionRing base.valuationSubring K := + base_valuationSubring_isFractionRing (K := K) base + let : IsIntegrallyClosed base.valuationSubring := + base_valuationSubring_isIntegrallyClosed (K := K) base + let : Module.Finite base.valuationSubring B := + IsIntegralClosure.finite base.valuationSubring K L B + let : Algebra.QuasiFinite base.valuationSubring B := by + infer_instance + let : IsArtinianRing (base.maximalIdeal.Fiber B) := by + infer_instance + refine primeSpectrum_subsingleton_of_isArtinianRing_of_idempotents_trivial ?_ + intro e he + let : HenselianRing B + (base.maximalIdeal.map (algebraMap base.valuationSubring B)) := + integralClosure_henselianRing_of_finite_separable (K := K) (L := L) base + let : HenselianRing B + (RingHom.ker + ((Algebra.TensorProduct.includeRight : + B →ₐ[base.valuationSubring] base.maximalIdeal.Fiber B) : + B →+* base.maximalIdeal.Fiber B)) := by + rw [maximalIdeal_fiber_includeRight_ker_eq_maximalIdeal_map + (R := base.valuationSubring) (S := B)] + infer_instance + let φ : B →+* base.maximalIdeal.Fiber B := + (Algebra.TensorProduct.includeRight : + B →ₐ[base.valuationSubring] base.maximalIdeal.Fiber B) + have hsurj : Function.Surjective φ := by + simpa [φ] using + (maximalIdeal_fiber_includeRight_surjective + (R := base.valuationSubring) (S := B)) + rcases exists_idempotent_lift_of_surjective_henselianRing_ker + φ hsurj e he with + ⟨b, hbidem, hbmap⟩ + let : IsDomain B := by + change IsDomain (integralClosure base.valuationSubring L) + infer_instance + rcases IsIdempotentElem.iff_eq_zero_or_one.mp hbidem with rfl | rfl + · left + rw [← hbmap] + simp [φ] + · right + rw [← hbmap] + exact (Algebra.TensorProduct.includeRight : + B →ₐ[base.valuationSubring] base.maximalIdeal.Fiber B).map_one + +/-- In a finite separable extension of a complete DVF, the actual integral +closure of the base valuation ring is local. + +This is the record-free localness form of the Henselian finite-extension +frontier. It uses the residue-fiber singleton theorem above and integral +lies-over, without assuming a chosen target +valuation ring. -/ +theorem integralClosure_isLocalRing_of_finite_separable + (base : CompleteDVF.{u, v} K) + [Algebra.IsSeparable K L] : + IsLocalRing (integralClosure base.valuationSubring L) := by + let B := integralClosure base.valuationSubring L + let : Algebra.IsIntegral base.valuationSubring B := by + change Algebra.IsIntegral base.valuationSubring + (integralClosure base.valuationSubring L) + infer_instance + let : FaithfulSMul base.valuationSubring B := + CanonicalIntegralClosure.faithfulSMul (K := K) (L := L) base + have hNonempty : + Nonempty (Ideal.primesOver base.maximalIdeal B) := by + rcases Ideal.exists_maximal_ideal_liesOver_of_isIntegral + (S := B) base.maximalIdeal with + ⟨P, hPmax, hPover⟩ + exact ⟨⟨P, hPmax.isPrime, hPover⟩⟩ + let : Subsingleton (PrimeSpectrum (base.maximalIdeal.Fiber B)) := + integralClosure_base_maximal_fiber_subsingleton_of_finite_separable + (K := K) (L := L) base + have hPrimeSub : + Subsingleton (Ideal.primesOver base.maximalIdeal B) := by + constructor + intro P Q + let e := PrimeSpectrum.primesOverOrderIsoFiber + base.valuationSubring B base.maximalIdeal + exact e.injective (Subsingleton.elim (e P) (e Q)) + rcases hNonempty with ⟨P⟩ + have hPrimesSingleton : + Ideal.primesOver base.maximalIdeal B = {P.1} := by + let : Subsingleton (Ideal.primesOver base.maximalIdeal B) := hPrimeSub + refine Set.eq_singleton_iff_unique_mem.mpr ⟨P.2, ?_⟩ + intro Q hQ + exact congrArg Subtype.val + (Subsingleton.elim + (⟨Q, hQ⟩ : Ideal.primesOver base.maximalIdeal B) P) + have hPmem : P.1 ∈ Ideal.primesOver base.maximalIdeal B := P.2 + let : Nonempty (MaximalSpectrum B) := + ⟨⟨P.1, Ideal.isMaximal_of_mem_primesOver hPmem⟩⟩ + have hMaxSub : Subsingleton (MaximalSpectrum B) := by + constructor + intro M N + apply MaximalSpectrum.ext + have hMcomap : + (M.asIdeal.comap (algebraMap base.valuationSubring B)) = + base.maximalIdeal := + IsLocalRing.eq_maximalIdeal + (Ideal.isMaximal_comap_of_isIntegral_of_isMaximal + (algebraMap base.valuationSubring B) + (algebraMap_isIntegral_iff.mpr inferInstance) M.asIdeal) + have hNcomap : + (N.asIdeal.comap (algebraMap base.valuationSubring B)) = + base.maximalIdeal := + IsLocalRing.eq_maximalIdeal + (Ideal.isMaximal_comap_of_isIntegral_of_isMaximal + (algebraMap base.valuationSubring B) + (algebraMap_isIntegral_iff.mpr inferInstance) N.asIdeal) + have hMmem : + M.asIdeal ∈ Ideal.primesOver base.maximalIdeal B := + ⟨M.isMaximal.isPrime, ⟨hMcomap.symm⟩⟩ + have hNmem : + N.asIdeal ∈ Ideal.primesOver base.maximalIdeal B := + ⟨N.isMaximal.isPrime, ⟨hNcomap.symm⟩⟩ + have hMeq : M.asIdeal = P.1 := by + simpa [hPrimesSingleton] using hMmem + have hNeq : N.asIdeal = P.1 := by + simpa [hPrimesSingleton] using hNmem + exact hMeq.trans hNeq.symm + exact IsLocalRing.of_singleton_maximalSpectrum + +/-- The maximal ideal of the integral closure, using the finite +separable localness theorem above. -/ +noncomputable def CanonicalIntegralClosure.maximalIdeal + (base : CompleteDVF.{u, v} K) + [Algebra.IsSeparable K L] : + Ideal (integralClosure base.valuationSubring L) := + letI : IsLocalRing (integralClosure base.valuationSubring L) := + integralClosure_isLocalRing_of_finite_separable (K := K) (L := L) base + IsLocalRing.maximalIdeal (integralClosure base.valuationSubring L) + +/-- In the actual integral closure, the ideal generated by the base maximal +ideal is contained in the upstairs maximal ideal. -/ +theorem integralClosure_base_maximal_map_le_maximalIdeal_of_finite_separable + (base : CompleteDVF.{u, v} K) + [Algebra.IsSeparable K L] : + base.maximalIdeal.map + (algebraMap base.valuationSubring + (integralClosure base.valuationSubring L)) ≤ + CanonicalIntegralClosure.maximalIdeal (K := K) (L := L) base := by + let B := integralClosure base.valuationSubring L + let : IsLocalRing B := + integralClosure_isLocalRing_of_finite_separable (K := K) (L := L) base + change + base.maximalIdeal.map (algebraMap base.valuationSubring B) ≤ + IsLocalRing.maximalIdeal B + let : Algebra.IsIntegral base.valuationSubring B := by + change Algebra.IsIntegral base.valuationSubring + (integralClosure base.valuationSubring L) + infer_instance + have hlocal : IsLocalHom (algebraMap base.valuationSubring B) := + (algebraMap_isIntegral_iff.mpr + (show Algebra.IsIntegral base.valuationSubring B from inferInstance) + ).isLocalHom + (CanonicalIntegralClosure.algebraMap_injective (K := K) (L := L) base) + exact + ((IsLocalRing.local_hom_TFAE + (algebraMap base.valuationSubring B)).out 1 3).mp hlocal + +/- In the actual integral closure, the ideal generated by the base maximal +ideal is nonzero. -/ +omit [FiniteDimensional K L] in +/-- In a finite separable extension, the image of the base maximal ideal is nonzero. -/ +theorem integralClosure_base_maximal_map_ne_bot_of_finite_separable + (base : CompleteDVF.{u, v} K) + : + base.maximalIdeal.map + (algebraMap base.valuationSubring + (integralClosure base.valuationSubring L)) ≠ ⊥ := by + intro hbot + exact base.maximalIdeal_ne_bot + ((Ideal.map_eq_bot_iff_of_injective + (CanonicalIntegralClosure.algebraMap_injective (K := K) (L := L) base)).1 + hbot) + +/- In a finite separable extension of a complete DVF, the actual integral +closure of the base valuation ring is not a field. -/ +omit [FiniteDimensional K L] in +/-- The integral closure in a nontrivial finite separable extension is not a field. -/ +theorem integralClosure_not_isField_of_finite_separable + (base : CompleteDVF.{u, v} K) + : + ¬ IsField (integralClosure base.valuationSubring L) := by + let B := integralClosure base.valuationSubring L + let : Algebra.IsIntegral base.valuationSubring B := by + change Algebra.IsIntegral base.valuationSubring + (integralClosure base.valuationSubring L) + infer_instance + let : FaithfulSMul base.valuationSubring B := + CanonicalIntegralClosure.faithfulSMul (K := K) (L := L) base + intro hB + have hbase : IsField base.valuationSubring := + isField_of_isIntegral_of_isField + (R := base.valuationSubring) (S := B) + (FaithfulSMul.algebraMap_injective base.valuationSubring B) hB + exact IsDiscreteValuationRing.not_isField base.valuationSubring hbase + +/-- In a finite separable extension of a complete DVF, the actual integral +closure of the base valuation ring is a DVR. -/ +theorem integralClosure_isDiscreteValuationRing_of_finite_separable + (base : CompleteDVF.{u, v} K) + [Algebra.IsSeparable K L] : + IsDiscreteValuationRing (integralClosure base.valuationSubring L) := by + let : IsLocalRing (integralClosure base.valuationSubring L) := + integralClosure_isLocalRing_of_finite_separable (K := K) (L := L) base + let : IsFractionRing base.valuationSubring K := + base_valuationSubring_isFractionRing (K := K) base + let : IsDomain (integralClosure base.valuationSubring L) := by + infer_instance + let : IsDedekindDomain (integralClosure base.valuationSubring L) := by + exact integralClosure.isDedekindDomain base.valuationSubring K L + let : IsNoetherianRing (integralClosure base.valuationSubring L) := by + exact integralClosure.isNoetherianRing (A := base.valuationSubring) (K := K) L + have hnot : + ¬ IsField (integralClosure base.valuationSubring L) := + integralClosure_not_isField_of_finite_separable + (K := K) (L := L) base + exact + ((IsDiscreteValuationRing.TFAE + (integralClosure base.valuationSubring L) hnot).out 3 1).mp + (show IsDedekindDomain (integralClosure base.valuationSubring L) from + inferInstance) + +/-- In the actual integral closure, the ideal generated by the base maximal +ideal is a power of the upstairs maximal ideal. -/ +theorem exists_integralClosure_base_maximal_map_eq_maximalIdeal_pow + (base : CompleteDVF.{u, v} K) + [Algebra.IsSeparable K L] : + ∃ n : ℕ, + base.maximalIdeal.map + (algebraMap base.valuationSubring + (integralClosure base.valuationSubring L)) = + CanonicalIntegralClosure.maximalIdeal (K := K) (L := L) base ^ n := by + let B := integralClosure base.valuationSubring L + let : IsLocalRing B := + integralClosure_isLocalRing_of_finite_separable (K := K) (L := L) base + change + ∃ n : ℕ, + base.maximalIdeal.map (algebraMap base.valuationSubring B) = + IsLocalRing.maximalIdeal B ^ n + let : IsDomain B := by + change IsDomain (integralClosure base.valuationSubring L) + infer_instance + let : IsDiscreteValuationRing B := + integralClosure_isDiscreteValuationRing_of_finite_separable + (K := K) (L := L) base + have hI : + base.maximalIdeal.map + (algebraMap base.valuationSubring B) ≠ ⊥ := + integralClosure_base_maximal_map_ne_bot_of_finite_separable + (K := K) (L := L) base + obtain ⟨pi, hpi⟩ := IsDiscreteValuationRing.exists_irreducible B + obtain ⟨n, hn⟩ := + IsDiscreteValuationRing.ideal_eq_span_pow_irreducible hI hpi + refine ⟨n, ?_⟩ + rw [hn, ← Ideal.span_singleton_pow, ← hpi.maximalIdeal_eq] + +/-- In the actual integral closure, the ideal generated by the base maximal +ideal is a positive power of the upstairs maximal ideal. -/ +theorem exists_integralClosure_base_maximal_map_eq_maximalIdeal_pow_pos + (base : CompleteDVF.{u, v} K) + [Algebra.IsSeparable K L] : + ∃ n : ℕ, + 0 < n ∧ + base.maximalIdeal.map + (algebraMap base.valuationSubring + (integralClosure base.valuationSubring L)) = + CanonicalIntegralClosure.maximalIdeal (K := K) (L := L) base ^ n := by + let B := integralClosure base.valuationSubring L + let : IsLocalRing B := + integralClosure_isLocalRing_of_finite_separable (K := K) (L := L) base + change + ∃ n : ℕ, + 0 < n ∧ + base.maximalIdeal.map (algebraMap base.valuationSubring B) = + IsLocalRing.maximalIdeal B ^ n + obtain ⟨n, hn⟩ := + exists_integralClosure_base_maximal_map_eq_maximalIdeal_pow + (K := K) (L := L) base + refine ⟨n, ?_, hn⟩ + by_contra hnot + have hn0 : n = 0 := Nat.eq_zero_of_not_pos hnot + have htop : + base.maximalIdeal.map (algebraMap base.valuationSubring B) = ⊤ := by + simpa [hn0] using hn + have hle : + base.maximalIdeal.map (algebraMap base.valuationSubring B) ≤ + IsLocalRing.maximalIdeal B := + integralClosure_base_maximal_map_le_maximalIdeal_of_finite_separable + (K := K) (L := L) base + have htop_le : (⊤ : Ideal B) ≤ IsLocalRing.maximalIdeal B := by + simpa [htop] using hle + exact + (IsLocalRing.maximalIdeal.isMaximal B).ne_top + (top_le_iff.mp htop_le) + +/-- In a finite separable extension of a complete DVF, the actual integral +closure is complete for its own maximal ideal. -/ +theorem integralClosure_maximalIdeal_isAdicComplete_of_finite_separable + (base : CompleteDVF.{u, v} K) + [Algebra.IsSeparable K L] : + IsAdicComplete + (CanonicalIntegralClosure.maximalIdeal (K := K) (L := L) base) + (integralClosure base.valuationSubring L) := by + let B := integralClosure base.valuationSubring L + let : IsLocalRing B := + integralClosure_isLocalRing_of_finite_separable (K := K) (L := L) base + change IsAdicComplete (IsLocalRing.maximalIdeal B) B + obtain ⟨n, hnpos, hn⟩ := + exists_integralClosure_base_maximal_map_eq_maximalIdeal_pow_pos + (K := K) (L := L) base + have hmap : + IsAdicComplete + (base.maximalIdeal.map (algebraMap base.valuationSubring B)) B := + integralClosure_base_maximal_map_isAdicComplete_of_finite_separable + (K := K) (L := L) base + let : + IsAdicComplete ((IsLocalRing.maximalIdeal B) ^ n) B := by + have hn' : + base.maximalIdeal.map (algebraMap base.valuationSubring B) = + IsLocalRing.maximalIdeal B ^ n := by + simpa [CanonicalIntegralClosure.maximalIdeal] using hn + simpa [hn'] using hmap + exact + isAdicComplete_of_isAdicComplete_pow + (M := B) (IsLocalRing.maximalIdeal B) hnpos + +/-- A packaged rank-one discrete valuation coming from the actual integral +closure, together with its valuation-subring comparison. -/ +theorem exists_integralClosure_standard_rankOneDiscrete_valuation + (base : CompleteDVF.{u, v} K) + [Algebra.IsSeparable K L] : + ∃ ΓL : Type, + ∃ _ : LinearOrderedCommGroupWithZero ΓL, + ∃ vL : _root_.Valuation L ΓL, + ∃ _ : vL.IsRankOneDiscrete, + ∃ _ : (integralClosure base.valuationSubring L) ≃+* + vL.valuationSubring, + True := by + let B := integralClosure base.valuationSubring L + let : IsLocalRing B := + integralClosure_isLocalRing_of_finite_separable (K := K) (L := L) base + let : IsDomain B := by + change IsDomain (integralClosure base.valuationSubring L) + infer_instance + let : IsDiscreteValuationRing B := + integralClosure_isDiscreteValuationRing_of_finite_separable + (K := K) (L := L) base + let : IsFractionRing B L := by + change IsFractionRing (integralClosure base.valuationSubring L) L + exact integralClosure.isFractionRing_of_finite_extension K L + let vL := (IsDiscreteValuationRing.maximalIdeal B).valuation L + refine ⟨_, inferInstance, vL, inferInstance, ?_, trivial⟩ + exact IsDiscreteValuationRing.equivValuationSubring (A := B) (K := L) + +/-- The actual integral closure supplies a rank-one discrete standard adic +valuation, its own maximal-ideal adic completeness, and the comparison of +that valuation ring with the actual integral closure. -/ +theorem exists_integralClosure_standard_complete_valuation_data + (base : CompleteDVF.{u, v} K) + [Algebra.IsSeparable K L] : + ∃ ΓL : Type, + ∃ _ : LinearOrderedCommGroupWithZero ΓL, + ∃ vL : _root_.Valuation L ΓL, + ∃ _ : vL.IsRankOneDiscrete, + IsAdicComplete + (CanonicalIntegralClosure.maximalIdeal (K := K) (L := L) base) + (integralClosure base.valuationSubring L) ∧ + ∃ _ : (integralClosure base.valuationSubring L) ≃+* + vL.valuationSubring, + True := by + obtain ⟨ΓL, hΓL, vL, hvdisc, hev, _⟩ := + exists_integralClosure_standard_rankOneDiscrete_valuation + (K := K) (L := L) base + let : LinearOrderedCommGroupWithZero ΓL := hΓL + refine ⟨ΓL, inferInstance, vL, hvdisc, ?_, hev, trivial⟩ + exact integralClosure_maximalIdeal_isAdicComplete_of_finite_separable + (K := K) (L := L) base + +/-- The actual integral closure supplies a complete-DVF target whose valuation +subring is ring-equivalent to the actual integral closure. -/ +theorem exists_integralClosure_standard_completeDVF + (base : CompleteDVF.{u, v} K) + [Algebra.IsSeparable K L] : + ∃ target : CompleteDVF.{w, 0} L, + (∀ z : L, + z ∈ target.valuation.valuationSubring ↔ + z ∈ (integralClosure base.valuationSubring L).toSubring) ∧ + ∃ _ : (integralClosure base.valuationSubring L) ≃+* + target.valuationSubring, + True := by + let B := integralClosure base.valuationSubring L + let : IsLocalRing B := + integralClosure_isLocalRing_of_finite_separable (K := K) (L := L) base + let : IsDomain B := by + change IsDomain (integralClosure base.valuationSubring L) + infer_instance + let : IsDiscreteValuationRing B := + integralClosure_isDiscreteValuationRing_of_finite_separable + (K := K) (L := L) base + let : IsFractionRing B L := by + change IsFractionRing (integralClosure base.valuationSubring L) L + exact integralClosure.isFractionRing_of_finite_extension K L + let vL := (IsDiscreteValuationRing.maximalIdeal B).valuation L + let e : B ≃+* vL.valuationSubring := + IsDiscreteValuationRing.equivValuationSubring (A := B) (K := L) + let : Algebra B vL.valuationSubring := e.toRingHom.toAlgebra + let eLin : B ≃ₗ[B] vL.valuationSubring := + { toFun := e + invFun := e.symm + left_inv := e.left_inv + right_inv := e.right_inv + map_add' := e.map_add + map_smul' := by + intro r x + change e (r * x) = (algebraMap B vL.valuationSubring r) * e x + simp [RingHom.algebraMap_toAlgebra] } + have : + IsAdicComplete (IsLocalRing.maximalIdeal B) B := + integralClosure_maximalIdeal_isAdicComplete_of_finite_separable + (K := K) (L := L) base + have hcompleteAsB : + IsAdicComplete (IsLocalRing.maximalIdeal B) vL.valuationSubring := + isAdicComplete_of_linearEquiv + (M := B) (N := vL.valuationSubring) + (IsLocalRing.maximalIdeal B) eLin + have hcompleteMap : + IsAdicComplete + ((IsLocalRing.maximalIdeal B).map + (algebraMap B vL.valuationSubring)) + vL.valuationSubring := + (isAdicComplete_map_algebraMap_iff + (I := IsLocalRing.maximalIdeal B) + (S := vL.valuationSubring)).2 hcompleteAsB + have hmem (x : B) : + algebraMap B vL.valuationSubring x ∈ + IsLocalRing.maximalIdeal vL.valuationSubring ↔ + x ∈ IsLocalRing.maximalIdeal B := by + simp only [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] + constructor + · intro hx hunit + exact hx (hunit.map (algebraMap B vL.valuationSubring)) + · intro hx hunit + apply hx + have hpre := hunit.map e.symm.toRingHom + simpa [RingHom.algebraMap_toAlgebra] using hpre + have hmapMax : + (IsLocalRing.maximalIdeal B).map + (algebraMap B vL.valuationSubring) = + IsLocalRing.maximalIdeal vL.valuationSubring := by + apply le_antisymm + · rw [Ideal.map_le_iff_le_comap] + intro x hx + exact (hmem x).2 hx + · intro y hy + have hx : + e.symm y ∈ IsLocalRing.maximalIdeal B := by + apply (hmem (e.symm y)).1 + simpa [RingHom.algebraMap_toAlgebra] using hy + have hmap := + Ideal.mem_map_of_mem (algebraMap B vL.valuationSubring) hx + simpa [RingHom.algebraMap_toAlgebra] using hmap + have hcompletev : + IsAdicComplete + (IsLocalRing.maximalIdeal vL.valuationSubring) + vL.valuationSubring := by + simpa [hmapMax] using hcompleteMap + have hmapSub : + Subring.map (algebraMap B L) ⊤ = + vL.valuationSubring.toSubring := + IsDiscreteValuationRing.map_algebraMap_eq_valuationSubring + (A := B) (K := L) + have hmemStandard (z : L) : + z ∈ vL.valuationSubring ↔ z ∈ B.toSubring := by + constructor + · intro hz + have hzmap : + z ∈ Subring.map (algebraMap B L) ⊤ := by + simpa [hmapSub] using hz + rcases hzmap with ⟨b, _hbtop, hb⟩ + rw [← hb] + exact b.2 + · intro hz + have hzmap : + z ∈ Subring.map (algebraMap B L) ⊤ := + ⟨⟨z, hz⟩, trivial, rfl⟩ + simpa [hmapSub] using hzmap + let : Valuation.IsCompleteDiscrete vL := + { isRankOneDiscrete := inferInstance + isAdicComplete := hcompletev } + let target : CompleteDVF.{w, 0} L := + { ValueGroup := WithZero (Multiplicative ℤ) + instValueGroup := inferInstance + valuation := vL + instCompleteDiscrete := inferInstance } + refine ⟨target, ?_, e, trivial⟩ + intro z + exact hmemStandard z + +/-- The standard complete-DVF target supplied by the actual integral closure, +together with its valuation-extension property, integral-closure comparison, +and the fundamental ramification identity. -/ +theorem exists_integralClosure_standard_fundamental_identity + (base : CompleteDVF.{u, v} K) + [Algebra.IsSeparable K L] : + ∃ target : CompleteDVF.{w, 0} L, + ∃ hExt : base.valuation.HasExtension target.valuation, + letI : base.valuation.HasExtension target.valuation := hExt + IsIntegralClosure target.valuationSubring + base.valuationSubring L ∧ + ValuedExtension.degree base.toDVF target.toDVF = + ValuedExtension.ramificationIndex base.toDVF target.toDVF * + ValuedExtension.residueDegree base.toDVF target.toDVF := by + obtain ⟨target, hmem, _hequiv⟩ := + exists_integralClosure_standard_completeDVF + (K := K) (L := L) base + have hExt : base.valuation.HasExtension target.valuation := by + apply _root_.Valuation.HasExtension.ofComapInteger + ext a + change + algebraMap K L a ∈ target.valuation.valuationSubring ↔ + a ∈ base.valuation.valuationSubring + rw [hmem] + exact algebraMap_mem_integralClosure_valuationSubring_iff + (L := L) base.valuation a + refine ⟨target, hExt, ?_⟩ + let : base.valuation.HasExtension target.valuation := hExt + have hIntegralClosure : + IsIntegralClosure target.valuationSubring + base.valuationSubring L := by + refine + { algebraMap_injective := ?_ + isIntegral_iff := ?_ } + · intro x y hxy + exact Subtype.ext hxy + · intro z + constructor + · intro hz + have hzmem : + z ∈ (integralClosure base.valuationSubring L).toSubring := hz + exact ⟨⟨z, (hmem z).2 hzmem⟩, rfl⟩ + · rintro ⟨y, rfl⟩ + exact (hmem (y : L)).1 y.2 + refine ⟨hIntegralClosure, ?_⟩ + let : + IsIntegralClosure target.valuationSubring + base.valuationSubring L := hIntegralClosure + let : IsScalarTower base.valuationSubring + target.valuationSubring L := by + apply IsScalarTower.of_algebraMap_eq + intro x + rfl + exact isDefectless_of_isIntegralClosure + (K := K) (L := L) base target + +/-- In a finite separable extension of a complete DVF, the actual integral +closure of the base valuation ring is a valuation ring. -/ +theorem integralClosure_valuationRing_of_finite_separable + (base : CompleteDVF.{u, v} K) + [Algebra.IsSeparable K L] : + ValuationRing (integralClosure base.valuationSubring L) := by + let : IsLocalRing (integralClosure base.valuationSubring L) := + integralClosure_isLocalRing_of_finite_separable (K := K) (L := L) base + let : IsFractionRing base.valuationSubring K := + base_valuationSubring_isFractionRing (K := K) base + let : IsDomain (integralClosure base.valuationSubring L) := by + infer_instance + let : IsDedekindDomain (integralClosure base.valuationSubring L) := by + exact integralClosure.isDedekindDomain base.valuationSubring K L + let : IsNoetherianRing (integralClosure base.valuationSubring L) := by + exact integralClosure.isNoetherianRing (A := base.valuationSubring) (K := K) L + exact + ((tfae_of_isNoetherianRing_of_isLocalRing_of_isDomain + (integralClosure base.valuationSubring L)).out 3 2).mp + (show IsDedekindDomain (integralClosure base.valuationSubring L) from + inferInstance) + +/-- Record-free valuative dichotomy for the integral closure in a finite +separable extension of a complete DVF. -/ +theorem CanonicalIntegralClosure.mem_or_inv_of_finite_separable + (base : CompleteDVF.{u, v} K) + [Algebra.IsSeparable K L] : + ∀ z : L, + z ∈ (integralClosure base.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring := by + let B := integralClosure base.valuationSubring L + let : ValuationRing B := + integralClosure_valuationRing_of_finite_separable (K := K) (L := L) base + let : IsFractionRing base.valuationSubring K := + base_valuationSubring_isFractionRing (K := K) base + let : IsFractionRing B L := by + change IsFractionRing (integralClosure base.valuationSubring L) L + exact integralClosure.isFractionRing_of_finite_extension K L + intro z + rcases ValuationRing.isInteger_or_isInteger (R := B) (K := L) z with + hz | hz + · left + rcases hz with ⟨y, hy⟩ + rw [← hy] + exact y.2 + · right + rcases hz with ⟨y, hy⟩ + rw [← hy] + exact y.2 + +/-- In a finite separable extension of a complete DVF, the integral +closure itself supplies a valuation subring whose canonical valuation extends +the base valuation. + +This is the record-free source used before a `CompleteDVF` target has been +chosen. -/ +theorem exists_integralClosure_valuationSubring_of_finite_separable + (base : CompleteDVF.{u, v} K) + [Algebra.IsSeparable K L] : + ∃ B : ValuationSubring L, + ∃ hExt : base.valuation.HasExtension B.valuation, + letI : base.valuation.HasExtension B.valuation := hExt + B.toSubring = (integralClosure base.valuationSubring L).toSubring ∧ + IsIntegralClosure B base.valuationSubring L := by + exact + exists_integralClosure_valuationSubring_isIntegralClosure_of_forall_mem_or_inv + (L := L) base.valuation + (CanonicalIntegralClosure.mem_or_inv_of_finite_separable + (K := K) (L := L) base) + +end ValuedExtension +end DiscreteValuationField + +end + +end ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Henselian.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Henselian.lean new file mode 100644 index 0000000000..7678c85db6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Henselian.lean @@ -0,0 +1,282 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Basic +public import Mathlib.RingTheory.Henselian +public import Mathlib.RingTheory.Ideal.Quotient.Operations + +/-! # Henselian -/ + +@[expose] public section +namespace ValuationTheory + +/-! +# Henselian discretely valued fields + +This file contains the lightweight package for a discretely valued field whose +valuation ring is Henselian at its maximal ideal. +-/ + +noncomputable +section + +universe u v + +namespace DiscreteValuationField + +/-- The idempotent polynomial `X^2 - X` is monic in every nontrivial +coefficient ring. -/ +theorem idempotentPolynomial_monic + {R : Type*} [CommRing R] [Nontrivial R] : + (Polynomial.X ^ 2 - Polynomial.X : Polynomial R).Monic := by + exact Polynomial.monic_X_pow_sub (by + rw [Polynomial.degree_X] + norm_num) + +/-- A quotient idempotent is an approximate root of `X^2 - X`. -/ +theorem idempotentPolynomial_eval_mem_of_quotient_idempotent + {R : Type*} [CommRing R] {I : Ideal R} (a0 : R) + (ha0 : IsIdempotentElem (Ideal.Quotient.mk I a0)) : + (Polynomial.X ^ 2 - Polynomial.X : Polynomial R).eval a0 ∈ I := by + rw [← Ideal.Quotient.eq_zero_iff_mem] + change + Ideal.Quotient.mk I + ((Polynomial.X ^ 2 - Polynomial.X : Polynomial R).eval a0) = 0 + simpa [pow_two] using sub_eq_zero.mpr ha0.eq + +/-- At a quotient idempotent, the derivative of `X^2 - X` is a unit in the +quotient. -/ +theorem idempotentPolynomial_derivative_eval_isUnit_of_quotient_idempotent + {R : Type*} [CommRing R] {I : Ideal R} (a0 : R) + (ha0 : IsIdempotentElem (Ideal.Quotient.mk I a0)) : + IsUnit + (Ideal.Quotient.mk I + ((Polynomial.X ^ 2 - Polynomial.X : Polynomial R).derivative.eval a0)) := by + rw [isUnit_iff_exists] + refine + ⟨Ideal.Quotient.mk I + ((Polynomial.X ^ 2 - Polynomial.X : Polynomial R).derivative.eval a0), + ?_, ?_⟩ + · simp only [pow_two, Polynomial.derivative_mul, Polynomial.derivative_X, one_mul, mul_one, + Polynomial.eval_sub, Polynomial.eval_add, Polynomial.eval_X, Polynomial.eval_one, map_sub, + map_add, map_one] + calc + (Ideal.Quotient.mk I a0 + Ideal.Quotient.mk I a0 - 1) * + (Ideal.Quotient.mk I a0 + Ideal.Quotient.mk I a0 - 1) = + 1 + (4 * (Ideal.Quotient.mk I a0 * Ideal.Quotient.mk I a0) - + 4 * Ideal.Quotient.mk I a0) := by + ring + _ = 1 := by + rw [ha0.eq] + ring + · simp only [pow_two, Polynomial.derivative_mul, Polynomial.derivative_X, one_mul, mul_one, + Polynomial.eval_sub, Polynomial.eval_add, Polynomial.eval_X, Polynomial.eval_one, map_sub, + map_add, map_one] + calc + (Ideal.Quotient.mk I a0 + Ideal.Quotient.mk I a0 - 1) * + (Ideal.Quotient.mk I a0 + Ideal.Quotient.mk I a0 - 1) = + 1 + (4 * (Ideal.Quotient.mk I a0 * Ideal.Quotient.mk I a0) - + 4 * Ideal.Quotient.mk I a0) := by + ring + _ = 1 := by + rw [ha0.eq] + ring + +/-- Idempotents lift along a surjective ring map whose kernel is a Henselian +ideal. + +This is the `X^2 - X` simple-root form of Hensel's lemma. At an idempotent, +the derivative `2X - 1` is a unit because its square is `1`. -/ +theorem exists_idempotent_lift_of_surjective_henselianRing_ker + {R S : Type*} [CommRing R] [CommRing S] (f : R →+* S) + (hf : Function.Surjective f) + [HenselianRing R (RingHom.ker f)] + (e : S) (he : IsIdempotentElem e) : + ∃ e' : R, IsIdempotentElem e' ∧ f e' = e := by + cases subsingleton_or_nontrivial R with + | inl hR => + have hS : Subsingleton S := by + constructor + intro x y + rcases hf x with ⟨a, rfl⟩ + rcases hf y with ⟨b, rfl⟩ + exact congrArg f (Subsingleton.elim a b) + exact ⟨0, Subsingleton.elim _ _, Subsingleton.elim _ _⟩ + | inr hR => + let : Nontrivial R := hR + rcases hf e with ⟨a0, ha0⟩ + let p : Polynomial R := Polynomial.X ^ 2 - Polynomial.X + have hpmonic : p.Monic := by + dsimp [p] + exact idempotentPolynomial_monic + have ha0_quotient : + IsIdempotentElem + (Ideal.Quotient.mk (RingHom.ker f) a0) := by + rw [IsIdempotentElem] + rw [← map_mul, Ideal.Quotient.eq] + rw [RingHom.mem_ker] + simp [ha0, he.eq] + have hroot : p.eval a0 ∈ RingHom.ker f := by + simpa [p] using + idempotentPolynomial_eval_mem_of_quotient_idempotent + (I := RingHom.ker f) a0 ha0_quotient + have hsimple : + IsUnit + (Ideal.Quotient.mk (RingHom.ker f) (p.derivative.eval a0)) := by + simpa [p] using + idempotentPolynomial_derivative_eval_isUnit_of_quotient_idempotent + (I := RingHom.ker f) a0 ha0_quotient + rcases HenselianRing.is_henselian p hpmonic a0 hroot hsimple with + ⟨a, haroot, hacongr⟩ + refine ⟨a, ?_, ?_⟩ + · change a * a = a + exact sub_eq_zero.mp (by simpa [p, pow_two] using haroot) + · have hsub : f (a - a0) = 0 := RingHom.mem_ker.mp hacongr + rw [map_sub, ha0, sub_eq_zero] at hsub + exact hsub + +/-- Chosen-representative form of idempotent lifting for Henselian pairs. -/ +theorem exists_idempotent_lift_of_henselianRing_mk + {R : Type*} [CommRing R] {I : Ideal R} [HenselianRing R I] + (a0 : R) (ha0 : IsIdempotentElem (Ideal.Quotient.mk I a0)) : + ∃ e : R, + IsIdempotentElem e ∧ + Ideal.Quotient.mk I e = Ideal.Quotient.mk I a0 ∧ + e - a0 ∈ I := by + cases subsingleton_or_nontrivial R with + | inl hR => + have ha0zero : a0 = 0 := Subsingleton.elim _ _ + refine ⟨0, ?_, ?_, ?_⟩ + · rw [IsIdempotentElem] + simp + · simp [ha0zero] + · simp [ha0zero] + | inr hR => + let : Nontrivial R := hR + let p : Polynomial R := Polynomial.X ^ 2 - Polynomial.X + have hpmonic : p.Monic := by + dsimp [p] + exact idempotentPolynomial_monic + have hroot : p.eval a0 ∈ I := by + simpa [p] using + idempotentPolynomial_eval_mem_of_quotient_idempotent + (I := I) a0 ha0 + have hsimple : + IsUnit + (Ideal.Quotient.mk I (p.derivative.eval a0)) := by + simpa [p] using + idempotentPolynomial_derivative_eval_isUnit_of_quotient_idempotent + (I := I) a0 ha0 + rcases HenselianRing.is_henselian p hpmonic a0 hroot hsimple with + ⟨e, heroot, hecongr⟩ + refine ⟨e, ?_, ?_, hecongr⟩ + · change e * e = e + exact sub_eq_zero.mp (by simpa [p, pow_two] using heroot) + · rw [Ideal.Quotient.eq] + exact hecongr + +/-- Quotient form of idempotent lifting for Henselian pairs: every idempotent +modulo the Henselian ideal has an idempotent representative. -/ +theorem exists_idempotent_lift_of_henselianRing + {R : Type*} [CommRing R] {I : Ideal R} [HenselianRing R I] + (e : R ⧸ I) (he : IsIdempotentElem e) : + ∃ e' : R, IsIdempotentElem e' ∧ Ideal.Quotient.mk I e' = e := by + rcases Ideal.Quotient.mk_surjective e with ⟨a0, rfl⟩ + rcases exists_idempotent_lift_of_henselianRing_mk + (I := I) a0 he with + ⟨e', he', hqe', _⟩ + exact ⟨e', he', hqe'⟩ + +/-- A Henselian discretely valued field. -/ +structure HenselianDVF (K : Type u) [Field K] extends DVF.{u, v} K where + /-- The valuation ring is Henselian along its maximal ideal. -/ + [instHenselian : HenselianRing toDVF.valuationSubring toDVF.maximalIdeal] + +attribute [instance] HenselianDVF.instHenselian + +namespace HenselianDVF + +variable {K : Type u} [Field K] + +/-- Introduces the abbreviation `valuationSubring`. -/ +abbrev valuationSubring (F : HenselianDVF.{u, v} K) : Type u := + F.toDVF.valuationSubring + +/-- Introduces the abbreviation `maximalIdeal`. -/ +abbrev maximalIdeal (F : HenselianDVF.{u, v} K) : Ideal F.valuationSubring := + F.toDVF.maximalIdeal + +/-- Introduces the abbreviation `residueField`. -/ +abbrev residueField (F : HenselianDVF.{u, v} K) : Type u := + F.toDVF.residueField + +/-- Introduces the abbreviation `residueMap`. -/ +abbrev residueMap (F : HenselianDVF.{u, v} K) : + RingHom F.valuationSubring F.residueField := + F.toDVF.residueMap + +/-- Every residue-field polynomial admits a coefficientwise lift to the +valuation ring. -/ +theorem exists_polynomial_lift_residue (F : HenselianDVF.{u, v} K) + (fbar : Polynomial F.residueField) : + ∃ f : Polynomial F.valuationSubring, f.map F.residueMap = fbar := by + classical + choose c hc using fun n : ℕ => F.toDVF.residue_surjective (fbar.coeff n) + let f : Polynomial F.valuationSubring := + fbar.support.sum fun n => Polynomial.monomial n (c n) + refine ⟨f, ?_⟩ + ext n + by_cases hn : n ∈ fbar.support + · simp only [Polynomial.coeff_map, Polynomial.finsetSum_coeff, map_sum, f] + rw [Finset.sum_eq_single n] + · simp [hc] + · intro b hb hbn + simp [Polynomial.coeff_monomial, hbn] + · intro hnot + exact False.elim (hnot hn) + · have hcoeff : fbar.coeff n = 0 := by + simpa [Polynomial.mem_support_iff] using hn + simp only [Polynomial.coeff_map, Polynomial.finsetSum_coeff, map_sum, hcoeff, f] + refine Finset.sum_eq_zero ?_ + intro b hb + have hbn : n ≠ b := by + intro h + exact hn (by simpa [h] using hb) + simp [Polynomial.coeff_monomial, hbn.symm] + +/-- The valuation subring of the henselian model is a discrete valuation ring. -/ +theorem valuationSubring_isDiscreteValuationRing (F : HenselianDVF.{u, v} K) : + IsDiscreteValuationRing F.valuationSubring := + F.toDVF.valuationSubring_isDiscreteValuationRing + +/-- The valuation subring of the henselian discrete valuation field is henselian. -/ +theorem henselianRing (F : HenselianDVF.{u, v} K) : + HenselianRing F.valuationSubring F.maximalIdeal := by + change HenselianRing F.toDVF.valuationSubring F.toDVF.maximalIdeal + infer_instance + +/-- The maximal ideal of a Henselian DVF valuation ring is nonzero. -/ +theorem maximalIdeal_ne_bot (F : HenselianDVF.{u, v} K) : + F.maximalIdeal ≠ ⊥ := + F.toDVF.maximalIdeal_ne_bot + +/-- Hensel's lemma in the simple-root form used by mathlib. -/ +theorem exists_lift_root_simple (F : HenselianDVF.{u, v} K) + (f : Polynomial F.valuationSubring) (hf : f.Monic) (a0 : F.valuationSubring) + (hroot : f.eval a0 ∈ F.maximalIdeal) + (hsimple : IsUnit (Ideal.Quotient.mk F.maximalIdeal (f.derivative.eval a0))) : + ∃ a : F.valuationSubring, f.IsRoot a ∧ a - a0 ∈ F.maximalIdeal := + HenselianRing.is_henselian f hf a0 hroot hsimple + +end HenselianDVF + +end DiscreteValuationField + +end + +end ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianFinite.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianFinite.lean new file mode 100644 index 0000000000..42dd52f3d8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianFinite.lean @@ -0,0 +1,330 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Henselian +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AdicPower +public import Mathlib.Algebra.Module.Shrink +public import Mathlib.RingTheory.AdicCompletion.AsTensorProduct +public import Mathlib.RingTheory.AdicCompletion.Noetherian +public import Mathlib.RingTheory.Nakayama + +/-! # Henselian Finite -/ + +@[expose] public section +namespace ValuationTheory + +/-! +# Finite algebra consequences of Henselian pairs + +This file keeps the Nakayama and finite-module completion consequences away +from the lightweight `HenselianDVF` core. +-/ + +noncomputable +section + +universe u v + +namespace DiscreteValuationField + +/-- If an ideal lies in the Jacobson radical of the base ring, then its action +on any module lands in the module Jacobson radical. -/ +theorem ideal_smul_top_le_module_jacobson_of_le_jacobson_bot + {R M : Type*} [CommRing R] [AddCommGroup M] [Module R M] + {I : Ideal R} (hI : I ≤ Ideal.jacobson (⊥ : Ideal R)) : + I • (⊤ : Submodule R M) ≤ Module.jacobson R M := by + rw [Ideal.jacobson_bot] at hI + exact (Submodule.smul_mono hI le_rfl).trans + (Ring.jacobson_smul_top_le R M) + +/-- The `jac` field of `HenselianRing` gives the Nakayama/module-Jacobson +component needed after applying the Henselian ideal to any module. -/ +theorem ideal_smul_top_le_module_jacobson_of_henselianRing + {R M : Type*} [CommRing R] [AddCommGroup M] [Module R M] + {I : Ideal R} [HenselianRing R I] : + I • (⊤ : Submodule R M) ≤ Module.jacobson R M := + ideal_smul_top_le_module_jacobson_of_le_jacobson_bot HenselianRing.jac + +/-- Algebra form of `ideal_smul_top_le_module_jacobson_of_henselianRing`: the +base Henselian ideal mapped into an algebra lies in the module Jacobson radical +after restricting scalars to the base. -/ +theorem ideal_map_restrictScalars_le_module_jacobson_of_henselianRing + {R S : Type*} [CommRing R] [CommRing S] [Algebra R S] + {I : Ideal R} [HenselianRing R I] : + (I.map (algebraMap R S)).restrictScalars R ≤ Module.jacobson R S := by + simpa [Ideal.smul_top_eq_map] using + (ideal_smul_top_le_module_jacobson_of_henselianRing + (R := R) (M := S) (I := I)) + +/-- Finite algebra form of the Jacobson/Nakayama component: if an ideal lies +in the Jacobson radical of the base, then its extension to a finite algebra +lies in the Jacobson radical upstairs. -/ +theorem ideal_map_le_jacobson_bot_of_le_jacobson_bot_of_moduleFinite + {R S : Type*} [CommRing R] [CommRing S] [Algebra R S] + [Module.Finite R S] {I : Ideal R} + (hI : I ≤ Ideal.jacobson (⊥ : Ideal R)) : + I.map (algebraMap R S) ≤ Ideal.jacobson (⊥ : Ideal S) := by + rw [Ideal.jacobson, le_sInf_iff] + rintro Q ⟨-, hQmax⟩ + by_contra hle + rw [SetLike.le_def] at hle + push Not at hle + rcases hle with ⟨x, hxI, hxQ⟩ + let : Q.IsMaximal := hQmax + let : Field (S ⧸ Q) := Ideal.Quotient.field Q + let qlin : S →ₗ[R] S ⧸ Q := (Ideal.Quotient.mkₐ R Q).toLinearMap + have : Module.Finite R (S ⧸ Q) := + Module.Finite.of_surjective qlin (Ideal.Quotient.mkₐ_surjective R Q) + have hxQideal : + Ideal.Quotient.mk Q x ∈ I.map (algebraMap R (S ⧸ Q)) := by + simpa [Ideal.map_map, RingHom.comp_apply] using + Ideal.mem_map_of_mem (Ideal.Quotient.mk Q) hxI + have hunit : IsUnit (Ideal.Quotient.mk Q x) := by + exact isUnit_iff_ne_zero.mpr (by + intro hzero + exact hxQ (Ideal.Quotient.eq_zero_iff_mem.mp hzero)) + have htop : + (⊤ : Submodule R (S ⧸ Q)) ≤ + I • (⊤ : Submodule R (S ⧸ Q)) := by + intro y hy + rcases hunit with ⟨u, hu⟩ + have hyideal : y ∈ I.map (algebraMap R (S ⧸ Q)) := by + rw [← Units.mul_inv_cancel_left u y] + exact (I.map (algebraMap R (S ⧸ Q))).mul_mem_right + (↑u⁻¹ * y) (by simpa [hu.symm] using hxQideal) + simpa [Ideal.smul_top_eq_map] using hyideal + have hbot : + (⊤ : Submodule R (S ⧸ Q)) = ⊥ := + Submodule.eq_bot_of_le_smul_of_le_jacobson_bot I + (⊤ : Submodule R (S ⧸ Q)) Module.Finite.fg_top htop hI + exact (top_ne_bot : (⊤ : Submodule R (S ⧸ Q)) ≠ ⊥) hbot + +/-- Henselian-ring version of +`ideal_map_le_jacobson_bot_of_le_jacobson_bot_of_moduleFinite`. -/ +theorem ideal_map_le_jacobson_bot_of_henselianRing_of_moduleFinite + {R S : Type*} [CommRing R] [CommRing S] [Algebra R S] + [Module.Finite R S] {I : Ideal R} [HenselianRing R I] : + I.map (algebraMap R S) ≤ Ideal.jacobson (⊥ : Ideal S) := + ideal_map_le_jacobson_bot_of_le_jacobson_bot_of_moduleFinite + (R := R) (S := S) (I := I) HenselianRing.jac + +/-- In a Noetherian finite algebra over a Henselian pair, the extended +Henselian ideal is adically Hausdorff. -/ +theorem isHausdorff_map_algebraMap_of_henselianRing_of_moduleFinite + {R S : Type*} [CommRing R] [CommRing S] [Algebra R S] + [Module.Finite R S] [IsNoetherianRing S] + {I : Ideal R} [HenselianRing R I] : + IsHausdorff (I.map (algebraMap R S)) S := + IsHausdorff.of_le_jacobson + (R := S) (M := S) (I := I.map (algebraMap R S)) + (ideal_map_le_jacobson_bot_of_henselianRing_of_moduleFinite + (R := R) (S := S) (I := I)) + +/-- Pulling back an adic power submodule along a linear equivalence gives the +corresponding adic power submodule on the source. -/ +theorem linearEquiv_comap_pow_smul_top + {R M N : Type*} [CommRing R] (I : Ideal R) + [AddCommGroup M] [Module R M] + [AddCommGroup N] [Module R N] + (e : M ≃ₗ[R] N) (n : ℕ) : + ((I ^ n • ⊤ : Submodule R N).comap (e : M →ₗ[R] N)) = + (I ^ n • ⊤ : Submodule R M) := by + rw [Submodule.comap_equiv_eq_map_symm] + rw [Submodule.map_smul''] + rw [Submodule.map_top] + simp + +/-- Mapping an adic power submodule along a linear equivalence gives the +corresponding adic power submodule on the target. -/ +theorem linearEquiv_map_pow_smul_top + {R M N : Type*} [CommRing R] (I : Ideal R) + [AddCommGroup M] [Module R M] + [AddCommGroup N] [Module R N] + (e : M ≃ₗ[R] N) (n : ℕ) : + ((I ^ n • ⊤ : Submodule R M).map (e : M →ₗ[R] N)) = + (I ^ n • ⊤ : Submodule R N) := by + rw [Submodule.map_smul''] + rw [Submodule.map_top] + simp + +/-- Adic Hausdorffness is preserved by linear equivalence of modules. -/ +theorem isHausdorff_of_linearEquiv + {R M N : Type*} [CommRing R] (I : Ideal R) + [AddCommGroup M] [Module R M] + [AddCommGroup N] [Module R N] + (e : M ≃ₗ[R] N) + [IsHausdorff I M] : IsHausdorff I N := by + refine ⟨fun y hy => ?_⟩ + have hsymm : e.symm y = 0 := by + apply IsHausdorff.haus (I := I) (M := M) (show IsHausdorff I M from inferInstance) + intro n + have hy' : e.symm y ≡ e.symm 0 + [SMOD ((I ^ n • ⊤ : Submodule R N).comap (e : M →ₗ[R] N))] := by + have hy0 : e (e.symm y) ≡ e (e.symm 0) + [SMOD (I ^ n • ⊤ : Submodule R N)] := by + simpa using hy n + exact SModEq.comap (I ^ n • ⊤ : Submodule R N) (f := (e : M →ₗ[R] N)) hy0 + simpa [linearEquiv_comap_pow_smul_top (I := I) e n] using hy' + exact e.symm.injective (by simpa using hsymm) + +/-- Adic precompleteness is preserved by linear equivalence of modules. -/ +theorem isPrecomplete_of_linearEquiv + {R M N : Type*} [CommRing R] (I : Ideal R) + [AddCommGroup M] [Module R M] + [AddCommGroup N] [Module R N] + (e : M ≃ₗ[R] N) + [IsPrecomplete I M] : IsPrecomplete I N := by + refine ⟨fun f hf => ?_⟩ + have hcf : + ∀ {m n : ℕ}, m ≤ n → + e.symm (f m) ≡ e.symm (f n) [SMOD (I ^ m • ⊤ : Submodule R M)] := by + intro m n hmn + have hfn : e (e.symm (f m)) ≡ e (e.symm (f n)) + [SMOD (I ^ m • ⊤ : Submodule R N)] := by + simpa using hf hmn + have hcomap : e.symm (f m) ≡ e.symm (f n) + [SMOD ((I ^ m • ⊤ : Submodule R N).comap (e : M →ₗ[R] N))] := + SModEq.comap (I ^ m • ⊤ : Submodule R N) (f := (e : M →ₗ[R] N)) hfn + simpa [linearEquiv_comap_pow_smul_top (I := I) e m] using hcomap + obtain ⟨L, hL⟩ := IsPrecomplete.prec + (show IsPrecomplete I M from inferInstance) hcf + refine ⟨e L, fun n => ?_⟩ + have hmap : e (e.symm (f n)) ≡ e L + [SMOD ((I ^ n • ⊤ : Submodule R M).map (e : M →ₗ[R] N))] := + SModEq.map (hL n) (e : M →ₗ[R] N) + simpa [linearEquiv_map_pow_smul_top (I := I) e n] using hmap + +/-- Hausdorffness for an ideal is invariant under a linear equivalence. -/ +theorem isHausdorff_linearEquiv_iff + {R M N : Type*} [CommRing R] (I : Ideal R) + [AddCommGroup M] [Module R M] + [AddCommGroup N] [Module R N] + (e : M ≃ₗ[R] N) : + IsHausdorff I N ↔ IsHausdorff I M := by + constructor + · intro h + let : IsHausdorff I N := h + exact isHausdorff_of_linearEquiv I e.symm + · intro h + let : IsHausdorff I M := h + exact isHausdorff_of_linearEquiv I e + +/-- Precompleteness for an ideal is invariant under a linear equivalence. -/ +theorem isPrecomplete_linearEquiv_iff + {R M N : Type*} [CommRing R] (I : Ideal R) + [AddCommGroup M] [Module R M] + [AddCommGroup N] [Module R N] + (e : M ≃ₗ[R] N) : + IsPrecomplete I N ↔ IsPrecomplete I M := by + constructor + · intro h + let : IsPrecomplete I N := h + exact isPrecomplete_of_linearEquiv I e.symm + · intro h + let : IsPrecomplete I M := h + exact isPrecomplete_of_linearEquiv I e + +/-- Same-universe finite modules over a Noetherian adically complete ring are +adically complete. -/ +theorem isAdicComplete_of_moduleFinite_sameUniverse + {R M : Type u} [CommRing R] (I : Ideal R) + [AddCommGroup M] [Module R M] + [IsNoetherianRing R] [Module.Finite R M] + [IsAdicComplete I R] : + IsAdicComplete I M := by + refine AdicCompletion.of_bijective_iff.mp ?_ + let e : M ≃ₗ[R] AdicCompletion I M := + (TensorProduct.lid R M).symm.trans + ((TensorProduct.congr (AdicCompletion.ofLinearEquiv I R) + (LinearEquiv.refl R M)).trans + ((AdicCompletion.ofTensorProductEquivOfFiniteNoetherian I M).restrictScalars R)) + have heq : (e : M →ₗ[R] AdicCompletion I M) = AdicCompletion.of I M := by + ext x n + simp only [LinearEquiv.coe_coe, LinearEquiv.trans_apply, TensorProduct.lid_symm_apply, + TensorProduct.congr_tmul, AdicCompletion.ofLinearEquiv_apply, LinearEquiv.refl_apply, + LinearEquiv.restrictScalars_apply, + AdicCompletion.ofTensorProductEquivOfFiniteNoetherian_apply, + AdicCompletion.ofTensorProduct_tmul, AdicCompletion.smul_eval, smul_eq_mul, + Submodule.mapQ_eq_factor, Submodule.factor_eq_factor, AdicCompletion.of_apply, + Submodule.mkQ_apply, Ideal.Quotient.mk_eq_mk, map_one, e] + exact one_smul (R ⧸ (I ^ n • ⊤ : Ideal R)) + (Submodule.Quotient.mk (p := (I ^ n • ⊤ : Submodule R M)) x) + have hebij : Function.Bijective (e : M → AdicCompletion I M) := e.bijective + rw [← heq] + exact hebij + +/-- A finite module over a Noetherian adically complete ring is adically complete. + +This is a universe-polymorphic wrapper around mathlib's tensor-product +finite-module completion theorem. -/ +theorem isAdicComplete_of_moduleFinite + {R : Type u} {M : Type v} [CommRing R] (I : Ideal R) + [AddCommGroup M] [Module R M] + [IsNoetherianRing R] [Module.Finite R M] + [IsAdicComplete I R] : + IsAdicComplete I M := by + let : Small.{u} M := Module.Finite.small R M + let : Module.Finite R (Shrink.{u} M) := + Module.Finite.of_surjective + ((Shrink.linearEquiv R M).symm : M →ₗ[R] Shrink.{u} M) + (Shrink.linearEquiv R M).symm.surjective + have : IsAdicComplete I (Shrink.{u} M) := + isAdicComplete_of_moduleFinite_sameUniverse (I := I) + exact ValuationTheory.DiscreteValuationField.isAdicComplete_of_linearEquiv + (I := I) (Shrink.linearEquiv R M) + +/-- A finite algebra over a Noetherian `I`-adically complete base is Henselian +along the ideal generated by `I`. -/ +theorem henselianRing_map_algebraMap_of_moduleFinite_of_isAdicComplete + {R : Type u} {S : Type v} [CommRing R] [CommRing S] [Algebra R S] + {I : Ideal R} [IsNoetherianRing R] [Module.Finite R S] + [IsAdicComplete I R] : + HenselianRing S (I.map (algebraMap R S)) := by + have hRS : IsAdicComplete I S := + isAdicComplete_of_moduleFinite (I := I) (M := S) + have hmap : IsAdicComplete (I.map (algebraMap R S)) S := + (isAdicComplete_map_algebraMap_iff (I := I) (S := S)).2 hRS + let : IsAdicComplete (I.map (algebraMap R S)) S := hmap + infer_instance + +namespace HenselianDVF + +variable {K : Type u} [Field K] + +/-- The maximal-ideal topology on a Henselian DVF valuation ring is separated. + +The proof uses only the Henselian Jacobson condition together with the +Noetherian DVR structure of the valuation ring. -/ +theorem isHausdorff_maximalIdeal (F : HenselianDVF.{u, v} K) : + IsHausdorff F.maximalIdeal F.valuationSubring := by + let : IsNoetherianRing F.valuationSubring := + F.toDVF.valuationSubring_isNoetherianRing + exact + IsHausdorff.of_le_jacobson + (R := F.valuationSubring) (M := F.valuationSubring) + (I := F.maximalIdeal) + (show F.maximalIdeal ≤ + Ideal.jacobson (⊥ : Ideal F.valuationSubring) from + HenselianRing.jac) + +/-- A precomplete Henselian DVF valuation ring is adically complete at its +maximal ideal, since separatedness is automatic. -/ +theorem isAdicComplete_maximalIdeal_of_isPrecomplete + (F : HenselianDVF.{u, v} K) + [IsPrecomplete F.maximalIdeal F.valuationSubring] : + IsAdicComplete F.maximalIdeal F.valuationSubring where + toIsHausdorff := F.isHausdorff_maximalIdeal + toIsPrecomplete := inferInstance + +end HenselianDVF + +end DiscreteValuationField + +end + +end ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianValuationExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianValuationExtension.lean new file mode 100644 index 0000000000..9c11ea8e8d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianValuationExtension.lean @@ -0,0 +1,164 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Henselian +public import Mathlib.RingTheory.Valuation.Extension + +/-! # Henselian Valuation Extension -/ + +@[expose] public section +namespace ValuationTheory + +/-! +# Valuation-extension API for Henselian discretely valued fields + +This file keeps the valuation-extension uniqueness interface separate from the +lightweight Henselian-DVF core. The core file is used by Hensel lifting and +does not need to import mathlib's full `Valuation.HasExtension` API. +-/ + +noncomputable +section + +universe u v w x y + +namespace DiscreteValuationField +namespace HenselianDVF + +variable {K : Type u} [Field K] +variable {L : Type w} [Field L] [Algebra K L] + +/-- A Henselian-DVF uniqueness predicate for extensions of the base valuation. +This is the non-complete analogue of the complete-DVF predicate used by +`ValuedExtension.HasUniqueValuationExtension`. -/ +def HasUniqueValuationExtension (base : HenselianDVF.{u, v} K) + (target : HenselianDVF.{w, x} L) : Prop := + ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.toDVF.valuation.HasExtension v'], + target.toDVF.valuation.IsEquiv v' + +omit [Algebra K L] in +/-- A Henselian-DVF valuation is equivalent to another valuation as soon as +their valuation subrings are equal. -/ +theorem valuation_isEquiv_of_valuationSubring_eq + (_base : HenselianDVF.{u, v} K) (target : HenselianDVF.{w, x} L) + {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') + (hsub : target.toDVF.valuation.valuationSubring = v'.valuationSubring) : + target.toDVF.valuation.IsEquiv v' := + (_root_.Valuation.isEquiv_iff_valuationSubring target.toDVF.valuation v').2 hsub + +omit [Algebra K L] in +/-- Equivalent valuations have the same valuation subring. -/ +theorem valuationSubring_eq_of_valuation_isEquiv + (_base : HenselianDVF.{u, v} K) (target : HenselianDVF.{w, x} L) + {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + {v' : _root_.Valuation L Gamma'} + (h : target.toDVF.valuation.IsEquiv v') : + target.toDVF.valuation.valuationSubring = v'.valuationSubring := + (_root_.Valuation.isEquiv_iff_valuationSubring target.toDVF.valuation v').1 h + +omit [Algebra K L] in +/-- Valuation equivalence is exactly equality of valuation subrings. -/ +theorem valuation_isEquiv_iff_valuationSubring_eq + (_base : HenselianDVF.{u, v} K) (target : HenselianDVF.{w, x} L) + {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') : + target.toDVF.valuation.IsEquiv v' ↔ + target.toDVF.valuation.valuationSubring = v'.valuationSubring := + _root_.Valuation.isEquiv_iff_valuationSubring target.toDVF.valuation v' + +omit [Algebra K L] in +/-- Equality of valuation subrings is exactly pointwise equality of membership +in those subrings. -/ +theorem valuationSubring_eq_iff_mem_valuationSubring + (_base : HenselianDVF.{u, v} K) (target : HenselianDVF.{w, x} L) + {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') : + target.toDVF.valuation.valuationSubring = v'.valuationSubring ↔ + ∀ z : L, z ∈ target.toDVF.valuation.valuationSubring ↔ + z ∈ v'.valuationSubring := by + constructor + · intro h z + rw [h] + · intro h + exact SetLike.ext (fun z => h z) + +omit [Algebra K L] in +/-- Valuation equivalence can be checked by pointwise equality of membership +in valuation subrings. -/ +theorem valuation_isEquiv_iff_mem_valuationSubring + (base : HenselianDVF.{u, v} K) (target : HenselianDVF.{w, x} L) + {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') : + target.toDVF.valuation.IsEquiv v' ↔ + ∀ z : L, z ∈ target.toDVF.valuation.valuationSubring ↔ + z ∈ v'.valuationSubring := by + rw [valuation_isEquiv_iff_valuationSubring_eq base target v', + valuationSubring_eq_iff_mem_valuationSubring base target v'] + +/-- Equality of valuation subrings for all extensions proves Henselian-DVF +uniqueness up to mathlib's valuation equivalence. -/ +theorem hasUniqueValuationExtension_of_forall_valuationSubring_eq + (base : HenselianDVF.{u, v} K) (target : HenselianDVF.{w, x} L) + (h : + ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.toDVF.valuation.HasExtension v'], + target.toDVF.valuation.valuationSubring = v'.valuationSubring) : + HasUniqueValuationExtension.{u, v, w, x, y} base target := by + intro Gamma' _ v' _ + exact valuation_isEquiv_of_valuationSubring_eq base target v' (@h Gamma' _ v' _) + +/-- Henselian-DVF unique extension implies valuation-subring equality for every +extension valuation. -/ +theorem valuationSubring_eq_of_hasUniqueValuationExtension + (base : HenselianDVF.{u, v} K) (target : HenselianDVF.{w, x} L) + (huniq : HasUniqueValuationExtension.{u, v, w, x, y} base target) + {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.toDVF.valuation.HasExtension v'] : + target.toDVF.valuation.valuationSubring = v'.valuationSubring := + valuationSubring_eq_of_valuation_isEquiv base target (@huniq Gamma' _ v' _) + +/-- Henselian-DVF unique extension is equivalent to equality of the chosen +target valuation subring with every extension valuation subring. -/ +theorem hasUniqueValuationExtension_iff_forall_valuationSubring_eq + (base : HenselianDVF.{u, v} K) (target : HenselianDVF.{w, x} L) : + HasUniqueValuationExtension.{u, v, w, x, y} base target ↔ + ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.toDVF.valuation.HasExtension v'], + target.toDVF.valuation.valuationSubring = v'.valuationSubring := by + constructor + · intro huniq Gamma' _ v' _ + exact valuationSubring_eq_of_hasUniqueValuationExtension base target huniq v' + · intro h + exact hasUniqueValuationExtension_of_forall_valuationSubring_eq base target h + +/-- Henselian-DVF unique extension can be checked pointwise on membership in +valuation subrings. -/ +theorem hasUniqueValuationExtension_iff_forall_mem_valuationSubring + (base : HenselianDVF.{u, v} K) (target : HenselianDVF.{w, x} L) : + HasUniqueValuationExtension.{u, v, w, x, y} base target ↔ + ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.toDVF.valuation.HasExtension v'], + ∀ z : L, z ∈ target.toDVF.valuation.valuationSubring ↔ + z ∈ v'.valuationSubring := by + constructor + · intro huniq Gamma' _ v' _ z + rw [valuationSubring_eq_of_hasUniqueValuationExtension base target huniq v'] + · intro h + rw [hasUniqueValuationExtension_iff_forall_valuationSubring_eq] + intro Gamma' _ v' _ + exact (valuationSubring_eq_iff_mem_valuationSubring base target v').2 + (@h Gamma' _ v' _) + +end HenselianDVF +end DiscreteValuationField + +end + +end ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean new file mode 100644 index 0000000000..cf2a107e72 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean @@ -0,0 +1,1794 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianFinite +public import Mathlib.RingTheory.DedekindDomain.IntegralClosure +public import Mathlib.RingTheory.DiscreteValuationRing.TFAE +public import Mathlib.RingTheory.Ideal.GoingUp +public import Mathlib.RingTheory.QuasiFinite.Basic +public import Mathlib.RingTheory.Spectrum.Prime.Topology +public import Mathlib.RingTheory.TensorProduct.Quotient +public import Mathlib.RingTheory.Valuation.Integral +public import Mathlib.LinearAlgebra.TensorProduct.RightExactness + +/-! # Integral Closure -/ + +@[expose] public section +namespace ValuationTheory + +/-! +# Integral closures of valuation rings + +This module uses the actual mathlib integral closure +`integralClosure base.toDVF.valuationSubring L`. It does not introduce a replacement +structure. +-/ + +noncomputable +section + +universe u v w x + +namespace DiscreteValuationField +namespace ValuedExtension + +/-- An Artinian ring whose idempotents are all trivial has at most one prime. + +This is the topological/idempotent bridge used in the Henselian frontier: +in an Artinian ring, `Spec` is discrete, so a hypothetical singleton clopen +separating two primes is represented by an idempotent. -/ +theorem primeSpectrum_subsingleton_of_isArtinianRing_of_idempotents_trivial + {A : Type u} [CommRing A] [IsArtinianRing A] + (hidempotent : ∀ e : A, IsIdempotentElem e → e = 0 ∨ e = 1) : + Subsingleton (PrimeSpectrum A) := by + constructor + intro P Q + by_contra hPQ + have hclopen : IsClopen ({P} : Set (PrimeSpectrum A)) := + isClopen_discrete {P} + rcases PrimeSpectrum.exists_idempotent_basicOpen_eq_of_isClopen hclopen with + ⟨e, heidem, heopen⟩ + rcases hidempotent e heidem with rfl | rfl + · have hPmem : + P ∈ (PrimeSpectrum.basicOpen (0 : A) : Set (PrimeSpectrum A)) := by + rw [← heopen] + exact Set.mem_singleton P + simp at hPmem + · have hQmem : Q ∈ ({P} : Set (PrimeSpectrum A)) := by + rw [heopen] + simp + exact hPQ hQmem.symm + +/-- Over a local base ring, the canonical map from an algebra to the fiber over +the maximal ideal is surjective. -/ +theorem maximalIdeal_fiber_includeRight_surjective + {R S : Type*} [CommRing R] [IsLocalRing R] [CommRing S] + [Algebra R S] : + Function.Surjective + (Algebra.TensorProduct.includeRight : + S →ₐ[R] (IsLocalRing.maximalIdeal R).Fiber S) := by + intro x + rcases Ideal.Fiber.exists_smul_eq_one_tmul + (p := IsLocalRing.maximalIdeal R) (S := S) x with + ⟨r, hr, s, hs⟩ + have hrunit : IsUnit r := by + rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] at hr + exact Classical.not_not.mp hr + rcases hrunit with ⟨u, rfl⟩ + refine ⟨(↑u⁻¹ : R) • s, ?_⟩ + have hs' := congrArg (fun y => + (↑u⁻¹ : R) • y) hs + simpa [Algebra.TensorProduct.includeRight_apply, smul_smul, + Units.inv_mul, one_smul] using hs'.symm + +/-- Over a local base ring, the kernel of the canonical map from an algebra to +the fiber over the maximal ideal is the ideal generated by the maximal ideal of +the base. + +This is the Ideal.Fiber form of the residue-field tensor kernel calculation: +S -> (maximalIdeal R).Fiber S has kernel maximalIdeal R * S. -/ +theorem maximalIdeal_fiber_includeRight_ker_eq_maximalIdeal_map + {R S : Type*} [CommRing R] [IsLocalRing R] [CommRing S] + [Algebra R S] : + RingHom.ker ((Algebra.TensorProduct.includeRight : + S →ₐ[R] (IsLocalRing.maximalIdeal R).Fiber S) : + S →+* (IsLocalRing.maximalIdeal R).Fiber S) = + (IsLocalRing.maximalIdeal R).map (algebraMap R S) := by + let I := (IsLocalRing.maximalIdeal R).map (algebraMap R S) + let e : (IsLocalRing.maximalIdeal R).Fiber S ≃ₐ[R] S ⧸ I := + (Algebra.TensorProduct.congr (.symm <| .ofBijective _ + (Ideal.bijective_algebraMap_quotient_residueField + (IsLocalRing.maximalIdeal R))) .refl).trans <| + (Algebra.TensorProduct.comm _ _ _).trans + ((Algebra.TensorProduct.quotIdealMapEquivTensorQuot S + (IsLocalRing.maximalIdeal R)).symm.restrictScalars _) + have he_apply (s : S) : + e ((Algebra.TensorProduct.includeRight : + S →ₐ[R] (IsLocalRing.maximalIdeal R).Fiber S) s) = + Ideal.Quotient.mk I s := by + simpa [e, I, Algebra.TensorProduct.includeRight_apply] using + (Algebra.TensorProduct.quotIdealMapEquivTensorQuot_symm_tmul + (B := S) (I := IsLocalRing.maximalIdeal R) s (1 : R)) + ext s + constructor + · intro hs + have hq : + e ((Algebra.TensorProduct.includeRight : + S →ₐ[R] (IsLocalRing.maximalIdeal R).Fiber S) s) = 0 := by + simpa using congrArg e hs + rw [he_apply s] at hq + simpa [I, Ideal.Quotient.eq_zero_iff_mem] using hq + · intro hs + change (Algebra.TensorProduct.includeRight : + S →ₐ[R] (IsLocalRing.maximalIdeal R).Fiber S) s = 0 + apply e.injective + rw [he_apply s, map_zero] + simpa [I, Ideal.Quotient.eq_zero_iff_mem] using hs + +/-- For a local ring `R`, the kernel of `S → κ(R) ⊗[R] S` is the ideal of +`S` generated by the maximal ideal of `R`. + +This is the local-residue-field tensor form of the kernel computation needed +for the Henselian finite-extension frontier. -/ +theorem residueField_tensor_includeRight_ker_eq_maximalIdeal_map + {R S : Type*} [CommRing R] [IsLocalRing R] [CommRing S] + [Algebra R S] : + RingHom.ker ((Algebra.TensorProduct.includeRight : + S →ₐ[R] TensorProduct R (IsLocalRing.ResidueField R) S) : + S →+* TensorProduct R (IsLocalRing.ResidueField R) S) = + (IsLocalRing.maximalIdeal R).map (algebraMap R S) := by + let k := IsLocalRing.ResidueField R + let f : R →ₐ[R] k := Algebra.ofId R k + let F : TensorProduct R R S →ₐ[R] TensorProduct R k S := + Algebra.TensorProduct.map f (AlgHom.id R S) + let inc : R →+* TensorProduct R R S := + (Algebra.TensorProduct.includeLeft : + R →ₐ[R] TensorProduct R R S).toRingHom + let lid : TensorProduct R R S →+* S := + (Algebra.TensorProduct.lid R S).toRingEquiv.toRingHom + have hf_eq : (f : R →+* k) = IsLocalRing.residue R := by + change algebraMap R k = IsLocalRing.residue R + dsimp only [k] + exact IsLocalRing.ResidueField.algebraMap_eq R + have hf : Function.Surjective f := by + change Function.Surjective (algebraMap R k) + rw [IsLocalRing.ResidueField.algebraMap_eq] + exact IsLocalRing.residue_surjective + have hkerf : + RingHom.ker f = IsLocalRing.maximalIdeal R := by + rw [AlgHom.ker_coe, hf_eq] + exact IsLocalRing.ker_residue + have hkerF : + RingHom.ker F = + (RingHom.ker f).map + (Algebra.TensorProduct.includeLeft : + R →ₐ[R] TensorProduct R R S) := + Algebra.TensorProduct.rTensor_ker (R := R) (A := R) (B := k) + (C := S) f hf + have hcomp : + ∀ x : S, + F ((Algebra.TensorProduct.lid R S).symm x) = + (Algebra.TensorProduct.includeRight : + S →ₐ[R] TensorProduct R k S) x := by + intro x + simp [F, Algebra.TensorProduct.lid_symm_apply, + Algebra.TensorProduct.includeRight_apply] + have hmap_lid : + ((RingHom.ker f).map inc).map lid = + (RingHom.ker f).map (algebraMap R S) := by + calc + ((RingHom.ker f).map inc).map lid = + (RingHom.ker f).map (lid.comp inc) := by + exact Ideal.map_map inc lid + (I := RingHom.ker f) + _ = (RingHom.ker f).map (algebraMap R S) := by + congr 1 + ext r + simp [inc, lid, Algebra.TensorProduct.includeLeft_apply, + Algebra.smul_def] + ext x + rw [RingHom.mem_ker] + change + (Algebra.TensorProduct.includeRight : + S →ₐ[R] TensorProduct R k S) x = 0 ↔ + x ∈ (IsLocalRing.maximalIdeal R).map (algebraMap R S) + rw [← hcomp x] + change (Algebra.TensorProduct.lid R S).symm x ∈ + RingHom.ker F ↔ + x ∈ (IsLocalRing.maximalIdeal R).map (algebraMap R S) + rw [hkerF, hkerf] + change (Algebra.TensorProduct.lid R S).symm x ∈ + (IsLocalRing.maximalIdeal R).map inc ↔ + x ∈ (IsLocalRing.maximalIdeal R).map (algebraMap R S) + have hmap_lid_m : + ((IsLocalRing.maximalIdeal R).map inc).map lid = + (IsLocalRing.maximalIdeal R).map (algebraMap R S) := by + simpa [hkerf] using hmap_lid + constructor + · intro hx + have hxmap : + lid + ((Algebra.TensorProduct.lid R S).symm x) ∈ + ((IsLocalRing.maximalIdeal R).map inc).map lid := + Ideal.mem_map_of_mem lid hx + have hxmap' : x ∈ ((IsLocalRing.maximalIdeal R).map inc).map lid := by + simpa [lid] using hxmap + simpa [hmap_lid_m] using hxmap' + · intro hx + have hxmap : x ∈ ((IsLocalRing.maximalIdeal R).map inc).map lid := by + simpa [hmap_lid_m] using hx + rw [Ideal.mem_map_iff_of_surjective + lid + (Algebra.TensorProduct.lid R S).surjective] at hxmap + rcases hxmap with ⟨y, hy, hyx⟩ + simpa [inc, lid, ← hyx] using hy + +variable {K : Type u} {L : Type w} [Field K] [Field L] +variable [Algebra K L] [FiniteDimensional K L] +variable (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) +variable [base.valuation.HasExtension target.valuation] + +omit [FiniteDimensional K L] in +/-- Every element integral over the base valuation ring lies in any valuation +ring extending the base valuation. This is the construction-level inclusion +from the actual integral closure into an extension valuation ring. -/ +theorem integralClosure_mem_target_valuationSubring_of_hasExtension + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [IsScalarTower base.toDVF.valuationSubring target.toDVF.valuationSubring L] + (z : integralClosure base.toDVF.valuationSubring L) : + (z : L) ∈ target.valuation.valuationSubring := by + have hz_base : IsIntegral base.toDVF.valuationSubring (z : L) := + z.2 + have hz_target : IsIntegral target.toDVF.valuationSubring (z : L) := + IsIntegral.tower_top (A := target.toDVF.valuationSubring) hz_base + exact Valuation.Integers.mem_of_integral + (Valuation.valuationSubring.integers (v := target.valuation)) hz_target + +/-- The canonical map from the actual integral closure of the base valuation +ring in `L` to any valuation ring extending the base valuation. -/ +def integralClosureToTargetValuationSubringOfHasExtension + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [IsScalarTower base.toDVF.valuationSubring target.toDVF.valuationSubring L] : + integralClosure base.toDVF.valuationSubring L →+* target.toDVF.valuationSubring where + toFun z := + ⟨(z : L), + integralClosure_mem_target_valuationSubring_of_hasExtension + (K := K) (L := L) base target z⟩ + map_zero' := by ext; simp + map_one' := by ext; simp + map_add' z₁ z₂ := by ext; simp + map_mul' z₁ z₂ := by ext; simp + +omit [FiniteDimensional K L] in +/-- The map from the integral closure to the target valuation ring uses the ambient inclusion. -/ +@[simp] theorem integralClosureToTargetValuationSubringOfHasExtension_apply + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [IsScalarTower base.toDVF.valuationSubring target.toDVF.valuationSubring L] + (z : integralClosure base.toDVF.valuationSubring L) : + ((integralClosureToTargetValuationSubringOfHasExtension + (K := K) (L := L) base target z : target.toDVF.valuationSubring) : L) = z := + rfl + +omit [FiniteDimensional K L] in +/-- The canonical map from the integral closure to an extension valuation ring +is injective. -/ +theorem integralClosureToTargetValuationSubringOfHasExtension_injective + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [IsScalarTower base.toDVF.valuationSubring target.toDVF.valuationSubring L] : + Function.Injective + (integralClosureToTargetValuationSubringOfHasExtension + (K := K) (L := L) base target) := by + intro z₁ z₂ hz + apply Subtype.ext + exact congrArg (fun z : target.toDVF.valuationSubring => (z : L)) hz + +omit [FiniteDimensional K L] in +/-- Under module-finiteness of the extension valuation ring over the base +valuation ring, every target valuation-ring element is integral over the base +valuation ring. -/ +theorem target_valuationSubring_mem_integralClosure_of_moduleFinite + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Module.Finite base.toDVF.valuationSubring target.toDVF.valuationSubring] + [IsScalarTower base.toDVF.valuationSubring target.toDVF.valuationSubring L] + (z : target.toDVF.valuationSubring) : + (z : L) ∈ integralClosure base.toDVF.valuationSubring L := by + have hz_target : IsIntegral base.toDVF.valuationSubring z := + IsIntegral.of_finite base.toDVF.valuationSubring z + have hz_L : IsIntegral base.toDVF.valuationSubring + (algebraMap target.toDVF.valuationSubring L z) := + hz_target.map + (IsScalarTower.toAlgHom base.toDVF.valuationSubring target.toDVF.valuationSubring L) + rw [mem_integralClosure_iff] + simpa using hz_L + +/-- The canonical map from a finite extension valuation ring into the actual +integral closure of the base valuation ring. -/ +def targetValuationSubringToIntegralClosureOfModuleFinite + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Module.Finite base.toDVF.valuationSubring target.toDVF.valuationSubring] + [IsScalarTower base.toDVF.valuationSubring target.toDVF.valuationSubring L] : + target.toDVF.valuationSubring →+* integralClosure base.toDVF.valuationSubring L where + toFun z := + ⟨(z : L), + target_valuationSubring_mem_integralClosure_of_moduleFinite + (K := K) (L := L) base target z⟩ + map_zero' := by ext; simp + map_one' := by ext; simp + map_add' z₁ z₂ := by ext; simp + map_mul' z₁ z₂ := by ext; simp + +omit [FiniteDimensional K L] in +/-- The inverse map sends a target integer to its integral-closure representative. -/ +@[simp] theorem targetValuationSubringToIntegralClosureOfModuleFinite_apply + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Module.Finite base.toDVF.valuationSubring target.toDVF.valuationSubring] + [IsScalarTower base.toDVF.valuationSubring target.toDVF.valuationSubring L] + (z : target.toDVF.valuationSubring) : + ((targetValuationSubringToIntegralClosureOfModuleFinite + (K := K) (L := L) base target z : + integralClosure base.toDVF.valuationSubring L) : L) = z := + rfl + +omit [FiniteDimensional K L] in +/-- Under module-finiteness, the canonical map from the integral closure to the +extension valuation ring is surjective. -/ +theorem integralClosureToTargetValuationSubringOfHasExtension_surjective_of_moduleFinite + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Module.Finite base.toDVF.valuationSubring target.toDVF.valuationSubring] + [IsScalarTower base.toDVF.valuationSubring target.toDVF.valuationSubring L] : + Function.Surjective + (integralClosureToTargetValuationSubringOfHasExtension + (K := K) (L := L) base target) := by + intro z + refine ⟨targetValuationSubringToIntegralClosureOfModuleFinite + (K := K) (L := L) base target z, ?_⟩ + ext + rfl + +omit [FiniteDimensional K L] in +/-- Under module-finiteness, the canonical map from the integral closure to the +extension valuation ring is bijective. -/ +theorem integralClosureToTargetValuationSubringOfHasExtension_bijective_of_moduleFinite + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Module.Finite base.toDVF.valuationSubring target.toDVF.valuationSubring] + [IsScalarTower base.toDVF.valuationSubring target.toDVF.valuationSubring L] : + Function.Bijective + (integralClosureToTargetValuationSubringOfHasExtension + (K := K) (L := L) base target) := + ⟨integralClosureToTargetValuationSubringOfHasExtension_injective + (K := K) (L := L) base target, + integralClosureToTargetValuationSubringOfHasExtension_surjective_of_moduleFinite + (K := K) (L := L) base target⟩ + +/-- If the extension valuation ring is finite over the base valuation ring, +then it is canonically ring-equivalent to the actual integral closure of the +base valuation ring in the extension field. -/ +noncomputable def integralClosureRingEquivTargetValuationSubringOfModuleFinite + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Module.Finite base.toDVF.valuationSubring target.toDVF.valuationSubring] + [IsScalarTower base.toDVF.valuationSubring target.toDVF.valuationSubring L] : + integralClosure base.toDVF.valuationSubring L ≃+* target.toDVF.valuationSubring := + RingEquiv.ofBijective + (integralClosureToTargetValuationSubringOfHasExtension + (K := K) (L := L) base target) + (integralClosureToTargetValuationSubringOfHasExtension_bijective_of_moduleFinite + (K := K) (L := L) base target) + +omit [FiniteDimensional K L] in +/-- The finite integral-closure ring equivalence evaluates by the canonical inclusion. -/ +@[simp] theorem integralClosureRingEquivTargetValuationSubringOfModuleFinite_apply + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Module.Finite base.toDVF.valuationSubring target.toDVF.valuationSubring] + [IsScalarTower base.toDVF.valuationSubring target.toDVF.valuationSubring L] + (z : integralClosure base.toDVF.valuationSubring L) : + (integralClosureRingEquivTargetValuationSubringOfModuleFinite + (K := K) (L := L) base target z : + target.toDVF.valuationSubring) = + integralClosureToTargetValuationSubringOfHasExtension + (K := K) (L := L) base target z := + rfl + +/-- Algebra-equivalence form of +`integralClosureRingEquivTargetValuationSubringOfModuleFinite`. -/ +noncomputable def integralClosureAlgEquivTargetValuationSubringOfModuleFinite + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Module.Finite base.toDVF.valuationSubring target.toDVF.valuationSubring] + [IsScalarTower base.toDVF.valuationSubring target.toDVF.valuationSubring L] : + integralClosure base.toDVF.valuationSubring L ≃ₐ[base.toDVF.valuationSubring] + target.toDVF.valuationSubring := + AlgEquiv.ofRingEquiv + (f := integralClosureRingEquivTargetValuationSubringOfModuleFinite + (K := K) (L := L) base target) + (by + intro x + ext + exact (IsScalarTower.algebraMap_apply + base.toDVF.valuationSubring target.toDVF.valuationSubring L x).symm) + +omit [FiniteDimensional K L] in +/-- The finite integral-closure algebra equivalence evaluates by the canonical inclusion. -/ +@[simp] theorem integralClosureAlgEquivTargetValuationSubringOfModuleFinite_apply + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Module.Finite base.toDVF.valuationSubring target.toDVF.valuationSubring] + [IsScalarTower base.toDVF.valuationSubring target.toDVF.valuationSubring L] + (z : integralClosure base.toDVF.valuationSubring L) : + (integralClosureAlgEquivTargetValuationSubringOfModuleFinite + (K := K) (L := L) base target z : + target.toDVF.valuationSubring) = + integralClosureToTargetValuationSubringOfHasExtension + (K := K) (L := L) base target z := + integralClosureRingEquivTargetValuationSubringOfModuleFinite_apply + (K := K) (L := L) base target z + +omit [FiniteDimensional K L] in +/-- If the extension valuation ring is finite over the base valuation ring, +then it is the integral closure of the base valuation ring in the extension +field. -/ +theorem target_valuationSubring_isIntegralClosure_of_moduleFinite + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Module.Finite base.toDVF.valuationSubring target.toDVF.valuationSubring] + [IsScalarTower base.toDVF.valuationSubring target.toDVF.valuationSubring L] : + IsIntegralClosure target.toDVF.valuationSubring base.toDVF.valuationSubring L := by + refine + { algebraMap_injective := Subtype.coe_injective + isIntegral_iff := ?_ } + intro x + constructor + · intro hx + refine ⟨integralClosureToTargetValuationSubringOfHasExtension + (K := K) (L := L) base target ⟨x, hx⟩, ?_⟩ + rfl + · rintro ⟨y, rfl⟩ + exact target_valuationSubring_mem_integralClosure_of_moduleFinite + (K := K) (L := L) base target y + +omit [FiniteDimensional K L] in +/-- Ambient-context version of +`target_valuationSubring_isIntegralClosure_of_moduleFinite`. -/ +theorem target_valuationSubring_isIntegralClosure_of_moduleFinite' + [Module.Finite base.toDVF.valuationSubring target.toDVF.valuationSubring] + [IsScalarTower base.toDVF.valuationSubring target.toDVF.valuationSubring L] : + IsIntegralClosure target.toDVF.valuationSubring base.toDVF.valuationSubring L := + target_valuationSubring_isIntegralClosure_of_moduleFinite + (K := K) (L := L) base target + +/-- The valuation ring of a complete DVF is a fraction ring inside the field. -/ +theorem base_valuationSubring_isFractionRing (base : CompleteDVF.{u, v} K) : + IsFractionRing base.toDVF.valuationSubring K := + (Valuation.valuationSubring.integers (v := base.valuation)).isFractionRing + +/-- The valuation ring of a complete DVF is integrally closed. -/ +theorem base_valuationSubring_isIntegrallyClosed + (base : CompleteDVF.{u, v} K) : + IsIntegrallyClosed base.toDVF.valuationSubring := by + exact inferInstanceAs (IsIntegrallyClosed base.valuation.valuationSubring) + +/-- The valuation ring of a complete DVF is Noetherian. -/ +theorem base_valuationSubring_isNoetherianRing + (base : CompleteDVF.{u, v} K) : + IsNoetherianRing base.toDVF.valuationSubring := by + have : IsDiscreteValuationRing base.toDVF.valuationSubring := + base.valuationSubring_isDiscreteValuationRing + infer_instance + +/-- If a chosen extension valuation ring is already proved to be the integral +closure of the base valuation ring in a finite separable field extension, then +it is finite over the base valuation ring. -/ +theorem moduleFinite_target_valuationSubring_of_isIntegralClosure + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Algebra.IsSeparable K L] + [IsScalarTower base.toDVF.valuationSubring target.toDVF.valuationSubring L] + [IsIntegralClosure target.toDVF.valuationSubring base.toDVF.valuationSubring L] : + Module.Finite base.toDVF.valuationSubring target.toDVF.valuationSubring := by + let : IsFractionRing base.toDVF.valuationSubring K := + base_valuationSubring_isFractionRing (K := K) base + let : IsIntegrallyClosed base.toDVF.valuationSubring := + base_valuationSubring_isIntegrallyClosed (K := K) base + let : IsNoetherianRing base.toDVF.valuationSubring := + base_valuationSubring_isNoetherianRing (K := K) base + exact IsIntegralClosure.finite base.toDVF.valuationSubring K L target.toDVF.valuationSubring + +/-- Ambient-context version of +`moduleFinite_target_valuationSubring_of_isIntegralClosure`. -/ +theorem moduleFinite_target_valuationSubring_of_isIntegralClosure' + [Algebra.IsSeparable K L] + [IsScalarTower base.toDVF.valuationSubring target.toDVF.valuationSubring L] + [IsIntegralClosure target.toDVF.valuationSubring base.toDVF.valuationSubring L] : + Module.Finite base.toDVF.valuationSubring target.toDVF.valuationSubring := + moduleFinite_target_valuationSubring_of_isIntegralClosure + (K := K) (L := L) base target + +/-- For finite separable field extensions with a chosen valuation extension, +being the integral closure is equivalent to being finite as a module over the +base valuation ring. -/ +theorem target_valuationSubring_isIntegralClosure_iff_moduleFinite + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Algebra.IsSeparable K L] + [IsScalarTower base.toDVF.valuationSubring target.toDVF.valuationSubring L] : + IsIntegralClosure target.toDVF.valuationSubring base.toDVF.valuationSubring L ↔ + Module.Finite base.toDVF.valuationSubring target.toDVF.valuationSubring := by + constructor + · intro hIntegralClosure + let : + IsIntegralClosure target.toDVF.valuationSubring base.toDVF.valuationSubring L := + hIntegralClosure + exact moduleFinite_target_valuationSubring_of_isIntegralClosure + (K := K) (L := L) base target + · intro hFinite + let : Module.Finite base.toDVF.valuationSubring target.toDVF.valuationSubring := + hFinite + exact target_valuationSubring_isIntegralClosure_of_moduleFinite + (K := K) (L := L) base target + +/-- Ambient-context version of +`target_valuationSubring_isIntegralClosure_iff_moduleFinite`. -/ +theorem target_valuationSubring_isIntegralClosure_iff_moduleFinite' + [Algebra.IsSeparable K L] + [IsScalarTower base.toDVF.valuationSubring target.toDVF.valuationSubring L] : + IsIntegralClosure target.toDVF.valuationSubring base.toDVF.valuationSubring L ↔ + Module.Finite base.toDVF.valuationSubring target.toDVF.valuationSubring := + target_valuationSubring_isIntegralClosure_iff_moduleFinite + (K := K) (L := L) base target + +omit [FiniteDimensional K L] in +/-- The target maximal ideal lies over the base maximal ideal for an actual +extension of valuations. This is the prime-theoretic input for replacing +certificate-style choices of a prime above the base maximal ideal. -/ +theorem target_maximalIdeal_liesOver_base_maximal_of_hasExtension + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] : + target.maximalIdeal.LiesOver base.maximalIdeal := by + exact inferInstanceAs + ((IsLocalRing.maximalIdeal target.valuation.valuationSubring).LiesOver + (IsLocalRing.maximalIdeal base.valuation.valuationSubring)) + +omit [FiniteDimensional K L] in +/-- In an integral local valued extension, every prime of the target valuation +ring lying over the base maximal ideal is the target maximal ideal. -/ +theorem target_primeOver_eq_maximalIdeal_of_isIntegral + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Algebra.IsIntegral base.toDVF.valuationSubring target.toDVF.valuationSubring] + {P : Ideal target.toDVF.valuationSubring} + (hP : P ∈ Ideal.primesOver base.maximalIdeal target.toDVF.valuationSubring) : + P = target.maximalIdeal := + IsLocalRing.eq_maximalIdeal (Ideal.isMaximal_of_mem_primesOver hP) + +omit [FiniteDimensional K L] in +/-- Integral local valued extensions have a unique prime above the base +maximal ideal: the target maximal ideal. -/ +theorem target_primesOver_base_maximal_eq_singleton_of_isIntegral + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Algebra.IsIntegral base.toDVF.valuationSubring target.toDVF.valuationSubring] : + Ideal.primesOver base.maximalIdeal target.toDVF.valuationSubring = + {target.maximalIdeal} := by + refine Set.eq_singleton_iff_unique_mem.mpr ⟨?_, ?_⟩ + · exact + ⟨(IsLocalRing.maximalIdeal.isMaximal target.toDVF.valuationSubring).isPrime, + target_maximalIdeal_liesOver_base_maximal_of_hasExtension + (K := K) (L := L) base target⟩ + · intro P hP + exact target_primeOver_eq_maximalIdeal_of_isIntegral + (K := K) (L := L) base target hP + +omit [FiniteDimensional K L] in +/-- Module-finite local valued extensions have a unique prime above the base +maximal ideal. -/ +theorem target_primesOver_base_maximal_eq_singleton_of_moduleFinite + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [Module.Finite base.toDVF.valuationSubring target.toDVF.valuationSubring] : + Ideal.primesOver base.maximalIdeal target.toDVF.valuationSubring = + {target.maximalIdeal} := by + let : Algebra.IsIntegral base.toDVF.valuationSubring target.toDVF.valuationSubring := + Algebra.IsIntegral.of_finite base.toDVF.valuationSubring target.toDVF.valuationSubring + exact target_primesOver_base_maximal_eq_singleton_of_isIntegral + (K := K) (L := L) base target + +omit [FiniteDimensional K L] in +/-- If the target valuation ring has already been identified as the integral +closure of the base valuation ring in the field extension, then the prime over +the base maximal ideal is unique. -/ +theorem target_primesOver_base_maximal_eq_singleton_of_isIntegralClosure + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [IsScalarTower base.toDVF.valuationSubring target.toDVF.valuationSubring L] + [IsIntegralClosure target.toDVF.valuationSubring base.toDVF.valuationSubring L] : + Ideal.primesOver base.maximalIdeal target.toDVF.valuationSubring = + {target.maximalIdeal} := by + let : Algebra.IsIntegral base.toDVF.valuationSubring target.toDVF.valuationSubring := + IsIntegralClosure.isIntegral_algebra base.toDVF.valuationSubring L + exact target_primesOver_base_maximal_eq_singleton_of_isIntegral + (K := K) (L := L) base target + +omit [FiniteDimensional K L] in +/-- If the chosen extension valuation ring is the actual integral closure of +the base valuation ring in `L`, then the actual integral closure satisfies the +valuation-ring dichotomy. This is the bridge from an integral-closure +identification to the `hval` input used by the finite-separable uniqueness API. -/ +theorem integralClosure_mem_or_inv_of_target_valuationSubring_isIntegralClosure + (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + [base.valuation.HasExtension target.valuation] + [IsIntegralClosure target.toDVF.valuationSubring base.toDVF.valuationSubring L] : + ∀ z : L, + z ∈ (integralClosure base.toDVF.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.toDVF.valuationSubring L).toSubring := by + intro z + rcases target.valuation.valuationSubring.mem_or_inv_mem z with hz | hz + · left + exact + (show IsIntegral base.toDVF.valuationSubring z from + (IsIntegralClosure.isIntegral_iff + (A := target.toDVF.valuationSubring) (R := base.toDVF.valuationSubring) + (B := L)).2 ⟨⟨z, hz⟩, rfl⟩) + · right + exact + (show IsIntegral base.toDVF.valuationSubring z⁻¹ from + (IsIntegralClosure.isIntegral_iff + (A := target.toDVF.valuationSubring) (R := base.toDVF.valuationSubring) + (B := L)).2 ⟨⟨z⁻¹, hz⟩, rfl⟩) + +/-- The actual integral closure of the base valuation ring in the extension +field. -/ +abbrev integralClosureIntegers (base : CompleteDVF.{u, v} K) + (_target : CompleteDVF.{w, x} L) : Type _ := + integralClosure base.toDVF.valuationSubring L + +omit [FiniteDimensional K L] [base.valuation.HasExtension target.valuation] in +/-- The actual integral closure is an `IsIntegralClosure`. -/ +theorem integralClosure_isIntegralClosure : + IsIntegralClosure (integralClosureIntegers base target) base.toDVF.valuationSubring L := by + exact inferInstanceAs + (IsIntegralClosure (integralClosure base.toDVF.valuationSubring L) + base.toDVF.valuationSubring L) + +omit [FiniteDimensional K L] [base.valuation.HasExtension target.valuation] in +/-- The actual integral closure is integral over the base valuation ring. -/ +theorem integralClosure_isIntegral : + Algebra.IsIntegral base.toDVF.valuationSubring (integralClosureIntegers base target) := by + exact inferInstanceAs + (Algebra.IsIntegral base.toDVF.valuationSubring + (integralClosure base.toDVF.valuationSubring L)) + +omit [base.valuation.HasExtension target.valuation] in +/-- The algebra map from the base valuation ring into the actual integral +closure is injective. -/ +theorem integralClosure_algebraMap_injective : + Function.Injective + (algebraMap base.toDVF.valuationSubring (integralClosureIntegers base target)) := by + intro x y hxy + apply Subtype.ext + apply FaithfulSMul.algebraMap_injective K L + exact congrArg (fun z : (integralClosureIntegers base target) => (z : L)) hxy + +omit [base.valuation.HasExtension target.valuation] in +/-- The actual integral closure is faithful over the base valuation ring. -/ +theorem integralClosure_faithfulSMul : + FaithfulSMul base.toDVF.valuationSubring (integralClosureIntegers base target) := + (faithfulSMul_iff_algebraMap_injective + base.toDVF.valuationSubring (integralClosureIntegers base target)).mpr + (integralClosure_algebraMap_injective base target) + +omit [base.valuation.HasExtension target.valuation] in +/-- In a finite separable field extension, the actual integral closure is +module-finite over the base valuation ring. -/ +theorem moduleFinite_integralClosureIntegers + [Algebra.IsSeparable K L] : + Module.Finite base.toDVF.valuationSubring (integralClosureIntegers base target) := by + let : IsFractionRing base.toDVF.valuationSubring K := + base_valuationSubring_isFractionRing (K := K) base + let : IsIntegrallyClosed base.toDVF.valuationSubring := + base_valuationSubring_isIntegrallyClosed (K := K) base + let : IsNoetherianRing base.toDVF.valuationSubring := + base_valuationSubring_isNoetherianRing (K := K) base + exact + (show Module.Finite base.toDVF.valuationSubring + (integralClosure base.toDVF.valuationSubring L) from + IsIntegralClosure.finite base.toDVF.valuationSubring K L + (integralClosure base.toDVF.valuationSubring L)) + +omit [base.valuation.HasExtension target.valuation] in +/-- In a finite separable field extension, the actual integral closure is +quasi-finite over the base valuation ring. -/ +theorem integralClosure_quasiFinite + [Algebra.IsSeparable K L] : + Algebra.QuasiFinite base.toDVF.valuationSubring (integralClosureIntegers base target) := by + let : Module.Finite base.toDVF.valuationSubring (integralClosureIntegers base target) := + (moduleFinite_integralClosureIntegers base target) + infer_instance + +omit [base.valuation.HasExtension target.valuation] in +/-- The residue fiber of the finite actual integral closure over the base +maximal ideal is Artinian. -/ +theorem integralClosure_base_maximal_fiber_isArtinianRing + [Algebra.IsSeparable K L] : + IsArtinianRing (base.maximalIdeal.Fiber (integralClosureIntegers base target)) := by + let : Algebra.QuasiFinite base.toDVF.valuationSubring (integralClosureIntegers base target) := + (integralClosure_quasiFinite base target) + infer_instance + +omit [FiniteDimensional K L] [base.valuation.HasExtension target.valuation] in +/-- For the actual integral closure, the kernel of the residue-fiber +includeRight map is the ideal generated by the base maximal ideal. -/ +theorem integralClosure_base_maximal_fiber_includeRight_ker_eq_maximalIdeal_map + : + RingHom.ker + ((Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.toDVF.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target)) : + (integralClosureIntegers base target) →+* + base.maximalIdeal.Fiber (integralClosureIntegers base target)) = + base.maximalIdeal.map + (algebraMap base.toDVF.valuationSubring (integralClosureIntegers base target)) := by + simpa using + (maximalIdeal_fiber_includeRight_ker_eq_maximalIdeal_map + (R := base.toDVF.valuationSubring) (S := (integralClosureIntegers base target))) + +omit [FiniteDimensional K L] [base.valuation.HasExtension target.valuation] in +/-- Idempotents in the actual integral closure in the extension field are +trivial. + +This keeps the Henselian frontier focused on lifting idempotents out of the +finite residue fiber: once an idempotent has lifted to the actual integral +closure, domainhood inside the field forces it to be `0` or `1`. -/ +theorem integralClosure_idempotent_eq_zero_or_one + (e : (integralClosureIntegers base target)) + (he : IsIdempotentElem e) : + e = 0 ∨ e = 1 := by + let : IsDomain (integralClosureIntegers base target) := by + exact inferInstanceAs + (IsDomain (integralClosure base.toDVF.valuationSubring L)) + exact IsIdempotentElem.iff_eq_zero_or_one.mp he + +omit [base.valuation.HasExtension target.valuation] in +/-- If every idempotent of the residue fiber over the base maximal ideal lifts +to an idempotent of the actual integral closure, then that fiber has at most +one prime. + +This packages the topological Artinian-fiber/idempotent argument in the form +needed by the Henselian finite-extension proof. -/ +theorem integralClosure_base_maximal_fiber_subsingleton_of_idempotents_lift + [Algebra.IsSeparable K L] + (hlift : + ∀ e : base.maximalIdeal.Fiber (integralClosureIntegers base target), + IsIdempotentElem e → + ∃ b : (integralClosureIntegers base target), + IsIdempotentElem b ∧ + Algebra.TensorProduct.includeRight b = e) : + Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target))) := by + let : IsArtinianRing + (base.maximalIdeal.Fiber (integralClosureIntegers base target)) := + (integralClosure_base_maximal_fiber_isArtinianRing base target) + refine primeSpectrum_subsingleton_of_isArtinianRing_of_idempotents_trivial ?_ + intro e he + rcases hlift e he with ⟨b, hbidem, hbmap⟩ + rcases (integralClosure_idempotent_eq_zero_or_one base target) b hbidem with rfl | rfl + · left + rw [← hbmap] + simp + · right + rw [← hbmap] + exact (Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.toDVF.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target)).map_one + +omit [FiniteDimensional K L] [base.valuation.HasExtension target.valuation] in +/-- Henselian-kernel form of idempotent lifting for the residue fiber of the +actual integral closure. + +The remaining Henselian finite-extension work can now focus on proving that +the `includeRight` map to the finite residue fiber is surjective and has +Henselian kernel; the idempotent lifting itself is supplied by Hensel's lemma +for `X^2 - X`. -/ +theorem +integralClosure_base_maximal_fiber_idempotents_lift_of_includeRight_surjective_henselianRing_ker + (hsurj : + Function.Surjective + (Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.toDVF.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target))) + [HenselianRing (integralClosureIntegers base target) + (RingHom.ker + ((Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.toDVF.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target)) : + (integralClosureIntegers base target) →+* + base.maximalIdeal.Fiber (integralClosureIntegers base target)))] : + ∀ e : base.maximalIdeal.Fiber (integralClosureIntegers base target), + IsIdempotentElem e → + ∃ b : (integralClosureIntegers base target), + IsIdempotentElem b ∧ + Algebra.TensorProduct.includeRight b = e := by + intro e he + let φ : (integralClosureIntegers base target) →+* + base.maximalIdeal.Fiber (integralClosureIntegers base target) := + (Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.toDVF.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target)) + have hsurjφ : Function.Surjective φ := by + simpa [φ] using hsurj + rcases exists_idempotent_lift_of_surjective_henselianRing_ker + φ hsurjφ e he with + ⟨b, hbidem, hbmap⟩ + exact ⟨b, hbidem, by simpa [φ] using hbmap⟩ + +omit [base.valuation.HasExtension target.valuation] in +/-- If the residue-fiber `includeRight` map has Henselian kernel and is +surjective, then the fiber has at most one prime. -/ +theorem integralClosure_maximal_fiber_subsingleton_of_includeRight_surjective_henselian_ker + [Algebra.IsSeparable K L] + (hsurj : + Function.Surjective + (Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.toDVF.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target))) + [HenselianRing (integralClosureIntegers base target) + (RingHom.ker + ((Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.toDVF.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target)) : + (integralClosureIntegers base target) →+* + base.maximalIdeal.Fiber (integralClosureIntegers base target)))] : + Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target))) := by + refine + (integralClosure_base_maximal_fiber_subsingleton_of_idempotents_lift base target) ?_ + exact ( +integralClosure_base_maximal_fiber_idempotents_lift_of_includeRight_surjective_henselianRing_ker + base target) hsurj + +omit [FiniteDimensional K L] [base.valuation.HasExtension target.valuation] in +/-- Henselian-kernel idempotent lifting for the residue fiber of the actual +integral closure. + +The `includeRight` map is automatically surjective because the base valuation +ring is local. -/ +theorem integralClosure_base_maximal_fiber_idempotents_lift_of_includeRight_henselianRing_ker + [HenselianRing (integralClosureIntegers base target) + (RingHom.ker + ((Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.toDVF.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target)) : + (integralClosureIntegers base target) →+* + base.maximalIdeal.Fiber (integralClosureIntegers base target)))] : + ∀ e : base.maximalIdeal.Fiber (integralClosureIntegers base target), + IsIdempotentElem e → + ∃ b : (integralClosureIntegers base target), + IsIdempotentElem b ∧ + Algebra.TensorProduct.includeRight b = e := by + refine ( +integralClosure_base_maximal_fiber_idempotents_lift_of_includeRight_surjective_henselianRing_ker + base target) ?_ + simpa using + (maximalIdeal_fiber_includeRight_surjective + (R := base.toDVF.valuationSubring) (S := (integralClosureIntegers base target))) + +omit [base.valuation.HasExtension target.valuation] in +/-- If the `includeRight` map to the residue fiber has Henselian kernel, then +the fiber has at most one prime. -/ +theorem integralClosure_base_maximal_fiber_subsingleton_of_includeRight_henselianRing_ker + [Algebra.IsSeparable K L] + [HenselianRing (integralClosureIntegers base target) + (RingHom.ker + ((Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.toDVF.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target)) : + (integralClosureIntegers base target) →+* + base.maximalIdeal.Fiber (integralClosureIntegers base target)))] : + Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target))) := by + refine + (integralClosure_base_maximal_fiber_subsingleton_of_idempotents_lift base target) ?_ + exact + (integralClosure_base_maximal_fiber_idempotents_lift_of_includeRight_henselianRing_ker + base target) + +omit [FiniteDimensional K L] [base.valuation.HasExtension target.valuation] in +/-- Idempotent lifting from the natural Henselian-pair ideal +`base.maximalIdeal.map` in the actual integral closure. + +The generic kernel computation identifies this ideal with the kernel of the +residue-fiber includeRight map. -/ +theorem integralClosure_base_maximal_fiber_idempotents_lift_of_henselianRing_maximalIdeal_map + [HenselianRing (integralClosureIntegers base target) + (base.maximalIdeal.map + (algebraMap base.toDVF.valuationSubring (integralClosureIntegers base target)))] : + ∀ e : base.maximalIdeal.Fiber (integralClosureIntegers base target), + IsIdempotentElem e → + ∃ b : (integralClosureIntegers base target), + IsIdempotentElem b ∧ + Algebra.TensorProduct.includeRight b = e := by + let : HenselianRing (integralClosureIntegers base target) + (RingHom.ker + ((Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.toDVF.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target)) : + (integralClosureIntegers base target) →+* + base.maximalIdeal.Fiber (integralClosureIntegers base target))) := by + rw [(integralClosure_base_maximal_fiber_includeRight_ker_eq_maximalIdeal_map base target)] + infer_instance + exact + (integralClosure_base_maximal_fiber_idempotents_lift_of_includeRight_henselianRing_ker + base target) + +omit [base.valuation.HasExtension target.valuation] in +/-- If the ideal generated by the base maximal ideal is Henselian in the actual +integral closure, then the residue fiber has at most one prime. -/ +theorem integralClosure_base_maximal_fiber_subsingleton_of_henselianRing_maximalIdeal_map + [Algebra.IsSeparable K L] + [HenselianRing (integralClosureIntegers base target) + (base.maximalIdeal.map + (algebraMap base.toDVF.valuationSubring (integralClosureIntegers base target)))] : + Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target))) := by + let : HenselianRing (integralClosureIntegers base target) + (RingHom.ker + ((Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.toDVF.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target)) : + (integralClosureIntegers base target) →+* + base.maximalIdeal.Fiber (integralClosureIntegers base target))) := by + rw [(integralClosure_base_maximal_fiber_includeRight_ker_eq_maximalIdeal_map base target)] + infer_instance + exact + (integralClosure_base_maximal_fiber_subsingleton_of_includeRight_henselianRing_ker base target) + + + +omit [base.valuation.HasExtension target.valuation] in +/-- In a finite separable extension of complete DVFs, the natural ideal generated +by the base maximal ideal is Henselian in the actual integral closure. + +This packages the finite-module completeness theorem together with the +comparison between I-adic and I.map-adic completeness. -/ +theorem integralClosure_base_maximal_map_henselianRing + [Algebra.IsSeparable K L] : + HenselianRing (integralClosureIntegers base target) + (base.maximalIdeal.map + (algebraMap base.toDVF.valuationSubring (integralClosureIntegers base target))) := by + let : IsNoetherianRing base.toDVF.valuationSubring := + base_valuationSubring_isNoetherianRing (K := K) base + let : Module.Finite base.toDVF.valuationSubring (integralClosureIntegers base target) := + (moduleFinite_integralClosureIntegers base target) + have : IsAdicComplete base.maximalIdeal base.toDVF.valuationSubring := + base.isAdicComplete + have hcomplete : IsAdicComplete base.maximalIdeal (integralClosureIntegers base target) := + ValuationTheory.DiscreteValuationField.isAdicComplete_of_moduleFinite + (I := base.maximalIdeal) + have hmapComplete : + IsAdicComplete + (base.maximalIdeal.map + (algebraMap base.toDVF.valuationSubring (integralClosureIntegers base target))) + (integralClosureIntegers base target) := + (isAdicComplete_map_algebraMap_iff + (I := base.maximalIdeal) (S := (integralClosureIntegers base target))).mpr hcomplete + have := hmapComplete + infer_instance + +omit [base.valuation.HasExtension target.valuation] in +/-- In a finite separable field extension, there are only finitely many primes +of the actual integral closure above the base maximal ideal. -/ +theorem integralClosure_primesOver_base_maximal_finite + [Algebra.IsSeparable K L] : + (Ideal.primesOver base.maximalIdeal (integralClosureIntegers base target)).Finite := by + let : Algebra.QuasiFinite base.toDVF.valuationSubring (integralClosureIntegers base target) := + (integralClosure_quasiFinite base target) + exact Algebra.QuasiFinite.finite_primesOver + (S := (integralClosureIntegers base target)) base.maximalIdeal + +omit [base.valuation.HasExtension target.valuation] in +/-- The actual integral closure has at least one prime above the base maximal +ideal. -/ +theorem integralClosure_primesOver_base_maximal_nonempty + : + Nonempty (Ideal.primesOver base.maximalIdeal (integralClosureIntegers base target)) := by + let : Algebra.IsIntegral base.toDVF.valuationSubring (integralClosureIntegers base target) := + (integralClosure_isIntegral base target) + let : FaithfulSMul base.toDVF.valuationSubring (integralClosureIntegers base target) := + (integralClosure_faithfulSMul base target) + rcases Ideal.exists_maximal_ideal_liesOver_of_isIntegral + (S := (integralClosureIntegers base target)) base.maximalIdeal with + ⟨P, hPmax, hPover⟩ + exact ⟨⟨P, hPmax.isPrime, hPover⟩⟩ + +omit [FiniteDimensional K L] [base.valuation.HasExtension target.valuation] in +/-- If the residue fiber over the base maximal ideal has at most one prime, +then so does the actual set of primes above the base maximal ideal. -/ +theorem integralClosure_primesOver_base_maximal_subsingleton_of_fiber_subsingleton + [Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target)))] : + Subsingleton + (Ideal.primesOver base.maximalIdeal (integralClosureIntegers base target)) := by + constructor + intro P Q + let e := PrimeSpectrum.primesOverOrderIsoFiber + base.toDVF.valuationSubring (integralClosureIntegers base target) base.maximalIdeal + exact e.injective (Subsingleton.elim (e P) (e Q)) + +omit [base.valuation.HasExtension target.valuation] in +/-- If the residue fiber over the base maximal ideal has at most one prime, +then the primes of the actual integral closure over the base maximal ideal form +a singleton. -/ +theorem integralClosure_primesOver_base_maximal_eq_singleton_of_fiber_subsingleton + [Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target)))] : + ∃ P : Ideal (integralClosureIntegers base target), + Ideal.primesOver base.maximalIdeal (integralClosureIntegers base target) = {P} := by + let : Subsingleton + (Ideal.primesOver base.maximalIdeal (integralClosureIntegers base target)) := + (integralClosure_primesOver_base_maximal_subsingleton_of_fiber_subsingleton base target) + rcases (integralClosure_primesOver_base_maximal_nonempty base target) with ⟨P⟩ + refine ⟨P, Set.eq_singleton_iff_unique_mem.mpr ⟨P.2, ?_⟩⟩ + intro Q hQ + exact congrArg Subtype.val + (Subsingleton.elim + (⟨Q, hQ⟩ : + Ideal.primesOver base.maximalIdeal (integralClosureIntegers base target)) P) + +omit [base.valuation.HasExtension target.valuation] in +/-- The actual integral closure is a fraction ring for the finite field +extension. -/ +theorem integralClosure_isFractionRing : + IsFractionRing (integralClosureIntegers base target) L := by + let : IsFractionRing base.toDVF.valuationSubring K := + base_valuationSubring_isFractionRing (K := K) base + exact + (show IsFractionRing (integralClosure base.toDVF.valuationSubring L) L from + integralClosure.isFractionRing_of_finite_extension K L) + +omit [base.valuation.HasExtension target.valuation] in +/-- If the actual integral closure is a valuation ring, then it satisfies the +valuative dichotomy inside the extension field. + +This is the local/DVR-oriented bridge for the Henselian frontier: after proving +that the finite integral closure is local, one can obtain a valuation-ring +instance and feed this theorem into the finite-separable uniqueness API. -/ +theorem integralClosure_mem_or_inv_of_integralClosure_valuationRing + [ValuationRing (integralClosureIntegers base target)] : + ∀ z : L, + z ∈ (integralClosure base.toDVF.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.toDVF.valuationSubring L).toSubring := by + let : IsFractionRing (integralClosureIntegers base target) L := + (integralClosure_isFractionRing base target) + intro z + rcases ValuationRing.isInteger_or_isInteger + (R := (integralClosureIntegers base target)) (K := L) z with hz | hz + · left + rcases hz with ⟨y, hy⟩ + rw [← hy] + exact y.2 + · right + rcases hz with ⟨y, hy⟩ + rw [← hy] + exact y.2 + +omit [base.valuation.HasExtension target.valuation] in +/-- If the base valuation ring is used as a fraction ring for `K` and the field +extension is separable, the integral closure is Dedekind. -/ +theorem integralClosure_isDedekindDomain + [IsFractionRing base.toDVF.valuationSubring K] [Algebra.IsSeparable K L] : + IsDedekindDomain (integralClosureIntegers base target) := by + exact + (show IsDedekindDomain (integralClosure base.toDVF.valuationSubring L) from + integralClosure.isDedekindDomain base.toDVF.valuationSubring K L) + +omit [FiniteDimensional K L] [base.valuation.HasExtension target.valuation] in +/-- If the primes of the actual integral closure over the base maximal ideal +form a singleton, then the actual integral closure is local. + +For integral extensions, every maximal ideal upstairs lies over a maximal ideal +downstairs. Since the base valuation ring is local, all maximal ideals upstairs +therefore lie over `base.maximalIdeal`; the singleton hypothesis makes the +maximal spectrum upstairs a singleton. -/ +theorem integralClosure_isLocalRing_of_primesOver_base_maximal_eq_singleton + (P : Ideal (integralClosureIntegers base target)) + (hP : + Ideal.primesOver base.maximalIdeal (integralClosureIntegers base target) = {P}) : + IsLocalRing (integralClosureIntegers base target) := by + let : Algebra.IsIntegral base.toDVF.valuationSubring (integralClosureIntegers base target) := + (integralClosure_isIntegral base target) + have hPmem : P ∈ Ideal.primesOver base.maximalIdeal (integralClosureIntegers base target) := by + rw [hP] + exact Set.mem_singleton P + let : Nonempty (MaximalSpectrum (integralClosureIntegers base target)) := + ⟨⟨P, Ideal.isMaximal_of_mem_primesOver hPmem⟩⟩ + have hsub : + Subsingleton (MaximalSpectrum (integralClosureIntegers base target)) := by + constructor + intro M N + apply MaximalSpectrum.ext + have hMcomap : + (M.asIdeal.comap + (algebraMap base.toDVF.valuationSubring (integralClosureIntegers base target))) = + base.maximalIdeal := + IsLocalRing.eq_maximalIdeal + (Ideal.isMaximal_comap_of_isIntegral_of_isMaximal + (R := base.toDVF.valuationSubring) + (S := (integralClosureIntegers base target)) + (algebraMap base.toDVF.valuationSubring (integralClosureIntegers base target)) + (fun x => Algebra.IsIntegral.isIntegral x) M.asIdeal) + have hNcomap : + (N.asIdeal.comap + (algebraMap base.toDVF.valuationSubring (integralClosureIntegers base target))) = + base.maximalIdeal := + IsLocalRing.eq_maximalIdeal + (Ideal.isMaximal_comap_of_isIntegral_of_isMaximal + (R := base.toDVF.valuationSubring) + (S := (integralClosureIntegers base target)) + (algebraMap base.toDVF.valuationSubring (integralClosureIntegers base target)) + (fun x => Algebra.IsIntegral.isIntegral x) N.asIdeal) + have hMmem : + M.asIdeal ∈ Ideal.primesOver base.maximalIdeal + (integralClosureIntegers base target) := + ⟨M.isMaximal.isPrime, ⟨hMcomap.symm⟩⟩ + have hNmem : + N.asIdeal ∈ Ideal.primesOver base.maximalIdeal + (integralClosureIntegers base target) := + ⟨N.isMaximal.isPrime, ⟨hNcomap.symm⟩⟩ + have hMeq : M.asIdeal = P := by + simpa [hP] using hMmem + have hNeq : N.asIdeal = P := by + simpa [hP] using hNmem + exact hMeq.trans hNeq.symm + exact IsLocalRing.of_singleton_maximalSpectrum + +omit [base.valuation.HasExtension target.valuation] in +/-- If the residue fiber over the base maximal ideal has at most one prime, +then the actual integral closure is local. -/ +theorem integralClosure_isLocalRing_of_base_maximal_fiber_subsingleton + [Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target)))] : + IsLocalRing (integralClosureIntegers base target) := by + rcases + (integralClosure_primesOver_base_maximal_eq_singleton_of_fiber_subsingleton + base target) with + ⟨P, hP⟩ + exact (integralClosure_isLocalRing_of_primesOver_base_maximal_eq_singleton base target) P hP + +omit [base.valuation.HasExtension target.valuation] in +/-- Henselian-facing localness criterion via idempotent lifting in the finite +residue fiber. -/ +theorem integralClosure_isLocalRing_of_base_maximal_fiber_idempotents_lift + [Algebra.IsSeparable K L] + (hlift : + ∀ e : base.maximalIdeal.Fiber (integralClosureIntegers base target), + IsIdempotentElem e → + ∃ b : (integralClosureIntegers base target), + IsIdempotentElem b ∧ + Algebra.TensorProduct.includeRight b = e) : + IsLocalRing (integralClosureIntegers base target) := by + let : Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target))) := + (integralClosure_base_maximal_fiber_subsingleton_of_idempotents_lift base target) hlift + exact (integralClosure_isLocalRing_of_base_maximal_fiber_subsingleton base target) + +omit [base.valuation.HasExtension target.valuation] in +/-- A local actual integral closure in a finite separable extension of a complete +DVF is a valuation ring. + +The Henselian frontier can therefore aim only at localness of the finite +integral closure. Dedekind theory and mathlib's local Noetherian-domain TFAE +then turn that local integral closure into a valuation ring, giving the +valuative dichotomy needed by the finite-extension uniqueness bridge. -/ +theorem integralClosure_valuationRing_of_isLocalRing + [Algebra.IsSeparable K L] + [IsLocalRing (integralClosureIntegers base target)] : + ValuationRing (integralClosureIntegers base target) := by + let : IsFractionRing base.toDVF.valuationSubring K := + base_valuationSubring_isFractionRing (K := K) base + let : IsIntegrallyClosed base.toDVF.valuationSubring := + base_valuationSubring_isIntegrallyClosed (K := K) base + let : IsNoetherianRing base.toDVF.valuationSubring := + base_valuationSubring_isNoetherianRing (K := K) base + let : IsDomain (integralClosureIntegers base target) := by + exact inferInstanceAs + (IsDomain (integralClosure base.toDVF.valuationSubring L)) + let : IsDedekindDomain (integralClosureIntegers base target) := + (integralClosure_isDedekindDomain base target) + exact + ((tfae_of_isNoetherianRing_of_isLocalRing_of_isDomain + (integralClosureIntegers base target)).out 3 2).mp + (show IsDedekindDomain (integralClosureIntegers base target) from inferInstance) + +omit [base.valuation.HasExtension target.valuation] in +/-- If the actual integral closure is local, then it satisfies the valuative +dichotomy inside the extension field. -/ +theorem integralClosure_mem_or_inv_of_isLocalRing + [Algebra.IsSeparable K L] + [IsLocalRing (integralClosureIntegers base target)] : + ∀ z : L, + z ∈ (integralClosure base.toDVF.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.toDVF.valuationSubring L).toSubring := by + let : ValuationRing (integralClosureIntegers base target) := + (integralClosure_valuationRing_of_isLocalRing base target) + exact (integralClosure_mem_or_inv_of_integralClosure_valuationRing base target) + +/-- The chosen target valuation ring remains a DVR. -/ +theorem target_valuationSubring_isDiscreteValuationRing + : + IsDiscreteValuationRing target.toDVF.valuationSubring := + target.valuationSubring_isDiscreteValuationRing + +end ValuedExtension + +namespace ValuedExtension.Henselian + +variable {K : Type u} {L : Type w} [Field K] [Field L] +variable [Algebra K L] [FiniteDimensional K L] +variable (base : HenselianDVF.{u, v} K) (target : HenselianDVF.{w, x} L) +variable [base.toDVF.valuation.HasExtension target.toDVF.valuation] + +/-- The actual integral closure of the base valuation ring in the extension +field, for a Henselian valued extension. -/ +abbrev integralClosureIntegers (base : HenselianDVF.{u, v} K) + (_target : HenselianDVF.{w, x} L) : Type _ := + integralClosure base.toDVF.valuationSubring L + +omit [FiniteDimensional K L] + [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- The actual integral closure is an `IsIntegralClosure`. -/ +theorem integralClosure_isIntegralClosure : + IsIntegralClosure (integralClosureIntegers base target) base.toDVF.valuationSubring L := by + exact inferInstanceAs + (IsIntegralClosure (integralClosure base.toDVF.valuationSubring L) + base.toDVF.valuationSubring L) + +omit [FiniteDimensional K L] + [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- The actual integral closure is integral over the base valuation ring. -/ +theorem integralClosure_isIntegral : + Algebra.IsIntegral base.toDVF.valuationSubring (integralClosureIntegers base target) := by + exact inferInstanceAs + (Algebra.IsIntegral base.toDVF.valuationSubring + (integralClosure base.toDVF.valuationSubring L)) + +omit [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- The algebra map from the base valuation ring into the actual integral +closure is injective. -/ +theorem integralClosure_algebraMap_injective + : + Function.Injective + (algebraMap base.toDVF.valuationSubring (integralClosureIntegers base target)) := by + intro x y hxy + apply Subtype.ext + apply FaithfulSMul.algebraMap_injective K L + exact congrArg (fun z : (integralClosureIntegers base target) => (z : L)) hxy + +omit [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- The actual integral closure is faithful over the base valuation ring. -/ +theorem integralClosure_faithfulSMul : + FaithfulSMul base.toDVF.valuationSubring (integralClosureIntegers base target) := + (faithfulSMul_iff_algebraMap_injective + base.toDVF.valuationSubring (integralClosureIntegers base target)).mpr + (integralClosure_algebraMap_injective base target) + +omit [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- In a finite separable field extension, the actual integral closure is +module-finite over the base Henselian valuation ring. -/ +theorem moduleFinite_integralClosureIntegers + [Algebra.IsSeparable K L] : + Module.Finite base.toDVF.valuationSubring (integralClosureIntegers base target) := by + let : IsFractionRing base.toDVF.valuationSubring K := + base.toDVF.valuationSubring_isFractionRing + let : IsIntegrallyClosed base.toDVF.valuationSubring := + base.toDVF.valuationSubring_isIntegrallyClosed + let : IsNoetherianRing base.toDVF.valuationSubring := + base.toDVF.valuationSubring_isNoetherianRing + exact + (show Module.Finite base.toDVF.valuationSubring + (integralClosure base.toDVF.valuationSubring L) from + IsIntegralClosure.finite base.toDVF.valuationSubring K L + (integralClosure base.toDVF.valuationSubring L)) + +omit [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- In a finite separable field extension, the actual integral closure is +quasi-finite over the base Henselian valuation ring. -/ +theorem integralClosure_quasiFinite + [Algebra.IsSeparable K L] : + Algebra.QuasiFinite base.toDVF.valuationSubring (integralClosureIntegers base target) := by + let : Module.Finite base.toDVF.valuationSubring (integralClosureIntegers base target) := + (moduleFinite_integralClosureIntegers base target) + infer_instance + +omit [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- The residue fiber of the finite actual integral closure over the base +maximal ideal is Artinian. -/ +theorem integralClosure_base_maximal_fiber_isArtinianRing + [Algebra.IsSeparable K L] : + IsArtinianRing (base.maximalIdeal.Fiber (integralClosureIntegers base target)) := by + let : Algebra.QuasiFinite base.toDVF.valuationSubring (integralClosureIntegers base target) := + (integralClosure_quasiFinite base target) + infer_instance + +omit [FiniteDimensional K L] + [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- For the actual integral closure, the kernel of the residue-fiber +includeRight map is the ideal generated by the base maximal ideal. -/ +theorem integralClosure_base_maximal_fiber_includeRight_ker_eq_maximalIdeal_map + : + RingHom.ker + ((Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.toDVF.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target)) : + (integralClosureIntegers base target) →+* + base.maximalIdeal.Fiber (integralClosureIntegers base target)) = + base.maximalIdeal.map + (algebraMap base.toDVF.valuationSubring (integralClosureIntegers base target)) := by + simpa using + (ValuedExtension.maximalIdeal_fiber_includeRight_ker_eq_maximalIdeal_map + (R := base.toDVF.valuationSubring) (S := (integralClosureIntegers base target))) + +omit [FiniteDimensional K L] + [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- The ideal generated by the base maximal ideal lies in the module Jacobson +radical of the actual integral closure after restricting scalars to the base. + +This is the Nakayama/Jacobson component of the desired finite-algebra +Henselian-pair transfer, specialized to the Henselian-DVF integral closure. -/ +theorem integralClosure_base_maximal_map_restrictScalars_le_module_jacobson + : + (base.maximalIdeal.map + (algebraMap base.toDVF.valuationSubring + (integralClosureIntegers base target))).restrictScalars + base.toDVF.valuationSubring ≤ + Module.jacobson base.toDVF.valuationSubring (integralClosureIntegers base target) := + ideal_map_restrictScalars_le_module_jacobson_of_henselianRing + +omit [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- In a finite separable Henselian extension, the ideal generated by the base +maximal ideal lies in the Jacobson radical of the actual integral closure. -/ +theorem integralClosure_base_maximal_map_le_jacobson_bot + [Algebra.IsSeparable K L] : + base.maximalIdeal.map + (algebraMap base.toDVF.valuationSubring (integralClosureIntegers base target)) ≤ + Ideal.jacobson (⊥ : Ideal (integralClosureIntegers base target)) := by + let : Module.Finite base.toDVF.valuationSubring (integralClosureIntegers base target) := + (moduleFinite_integralClosureIntegers base target) + exact ideal_map_le_jacobson_bot_of_henselianRing_of_moduleFinite + +omit [FiniteDimensional K L] + [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- Idempotents in the actual integral closure in the extension field are +trivial. -/ +theorem integralClosure_idempotent_eq_zero_or_one + (e : (integralClosureIntegers base target)) + (he : IsIdempotentElem e) : + e = 0 ∨ e = 1 := by + let : IsDomain (integralClosureIntegers base target) := by + exact inferInstanceAs + (IsDomain (integralClosure base.toDVF.valuationSubring L)) + exact IsIdempotentElem.iff_eq_zero_or_one.mp he + +omit [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- If every idempotent of the residue fiber over the base maximal ideal lifts +to an idempotent of the actual integral closure, then that fiber has at most +one prime. -/ +theorem integralClosure_base_maximal_fiber_subsingleton_of_idempotents_lift + [Algebra.IsSeparable K L] + (hlift : + ∀ e : base.maximalIdeal.Fiber (integralClosureIntegers base target), + IsIdempotentElem e → + ∃ b : (integralClosureIntegers base target), + IsIdempotentElem b ∧ + Algebra.TensorProduct.includeRight b = e) : + Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target))) := by + let : IsArtinianRing + (base.maximalIdeal.Fiber (integralClosureIntegers base target)) := + (integralClosure_base_maximal_fiber_isArtinianRing base target) + refine ValuedExtension.primeSpectrum_subsingleton_of_isArtinianRing_of_idempotents_trivial ?_ + intro e he + rcases hlift e he with ⟨b, hbidem, hbmap⟩ + rcases (integralClosure_idempotent_eq_zero_or_one base target) b hbidem with rfl | rfl + · left + rw [← hbmap] + simp + · right + rw [← hbmap] + exact (Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.toDVF.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target)).map_one + +omit [FiniteDimensional K L] + [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- Henselian-kernel form of idempotent lifting for the residue fiber of the +actual integral closure. -/ +theorem +integralClosure_base_maximal_fiber_idempotents_lift_of_includeRight_surjective_henselianRing_ker + (hsurj : + Function.Surjective + (Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.toDVF.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target))) + [HenselianRing (integralClosureIntegers base target) + (RingHom.ker + ((Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.toDVF.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target)) : + (integralClosureIntegers base target) →+* + base.maximalIdeal.Fiber (integralClosureIntegers base target)))] : + ∀ e : base.maximalIdeal.Fiber (integralClosureIntegers base target), + IsIdempotentElem e → + ∃ b : (integralClosureIntegers base target), + IsIdempotentElem b ∧ + Algebra.TensorProduct.includeRight b = e := by + intro e he + let φ : (integralClosureIntegers base target) →+* + base.maximalIdeal.Fiber (integralClosureIntegers base target) := + (Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.toDVF.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target)) + have hsurjφ : Function.Surjective φ := by + simpa [φ] using hsurj + rcases exists_idempotent_lift_of_surjective_henselianRing_ker + φ hsurjφ e he with + ⟨b, hbidem, hbmap⟩ + exact ⟨b, hbidem, by simpa [φ] using hbmap⟩ + +omit [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- If the residue-fiber `includeRight` map has Henselian kernel and is +surjective, then the fiber has at most one prime. -/ +theorem integralClosure_maximal_fiber_subsingleton_of_includeRight_surjective_henselian_ker + [Algebra.IsSeparable K L] + (hsurj : + Function.Surjective + (Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.toDVF.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target))) + [HenselianRing (integralClosureIntegers base target) + (RingHom.ker + ((Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.toDVF.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target)) : + (integralClosureIntegers base target) →+* + base.maximalIdeal.Fiber (integralClosureIntegers base target)))] : + Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target))) := by + refine + (integralClosure_base_maximal_fiber_subsingleton_of_idempotents_lift base target) ?_ + exact ( +integralClosure_base_maximal_fiber_idempotents_lift_of_includeRight_surjective_henselianRing_ker + base target) hsurj + +omit [FiniteDimensional K L] + [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- Henselian-kernel idempotent lifting for the residue fiber of the actual +integral closure. The `includeRight` map is automatically surjective because +the base valuation ring is local. -/ +theorem integralClosure_base_maximal_fiber_idempotents_lift_of_includeRight_henselianRing_ker + [HenselianRing (integralClosureIntegers base target) + (RingHom.ker + ((Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.toDVF.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target)) : + (integralClosureIntegers base target) →+* + base.maximalIdeal.Fiber (integralClosureIntegers base target)))] : + ∀ e : base.maximalIdeal.Fiber (integralClosureIntegers base target), + IsIdempotentElem e → + ∃ b : (integralClosureIntegers base target), + IsIdempotentElem b ∧ + Algebra.TensorProduct.includeRight b = e := by + refine ( +integralClosure_base_maximal_fiber_idempotents_lift_of_includeRight_surjective_henselianRing_ker + base target) ?_ + simpa using + (ValuedExtension.maximalIdeal_fiber_includeRight_surjective + (R := base.toDVF.valuationSubring) (S := (integralClosureIntegers base target))) + +omit [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- If the `includeRight` map to the residue fiber has Henselian kernel, then +the fiber has at most one prime. -/ +theorem integralClosure_base_maximal_fiber_subsingleton_of_includeRight_henselianRing_ker + [Algebra.IsSeparable K L] + [HenselianRing (integralClosureIntegers base target) + (RingHom.ker + ((Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.toDVF.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target)) : + (integralClosureIntegers base target) →+* + base.maximalIdeal.Fiber (integralClosureIntegers base target)))] : + Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target))) := by + refine + (integralClosure_base_maximal_fiber_subsingleton_of_idempotents_lift base target) ?_ + exact + (integralClosure_base_maximal_fiber_idempotents_lift_of_includeRight_henselianRing_ker + base target) + +omit [FiniteDimensional K L] + [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- Idempotent lifting from the natural Henselian-pair ideal +`base.maximalIdeal.map` in the actual integral closure. -/ +theorem integralClosure_base_maximal_fiber_idempotents_lift_of_henselianRing_maximalIdeal_map + [HenselianRing (integralClosureIntegers base target) + (base.maximalIdeal.map + (algebraMap base.toDVF.valuationSubring (integralClosureIntegers base target)))] : + ∀ e : base.maximalIdeal.Fiber (integralClosureIntegers base target), + IsIdempotentElem e → + ∃ b : (integralClosureIntegers base target), + IsIdempotentElem b ∧ + Algebra.TensorProduct.includeRight b = e := by + let : HenselianRing (integralClosureIntegers base target) + (RingHom.ker + ((Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.toDVF.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target)) : + (integralClosureIntegers base target) →+* + base.maximalIdeal.Fiber (integralClosureIntegers base target))) := by + rw [(integralClosure_base_maximal_fiber_includeRight_ker_eq_maximalIdeal_map base target)] + infer_instance + exact + (integralClosure_base_maximal_fiber_idempotents_lift_of_includeRight_henselianRing_ker + base target) + +omit [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- If the ideal generated by the base maximal ideal is Henselian in the actual +integral closure, then the residue fiber has at most one prime. -/ +theorem integralClosure_base_maximal_fiber_subsingleton_of_henselianRing_maximalIdeal_map + [Algebra.IsSeparable K L] + [HenselianRing (integralClosureIntegers base target) + (base.maximalIdeal.map + (algebraMap base.toDVF.valuationSubring (integralClosureIntegers base target)))] : + Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target))) := by + let : HenselianRing (integralClosureIntegers base target) + (RingHom.ker + ((Algebra.TensorProduct.includeRight : + (integralClosureIntegers base target) →ₐ[base.toDVF.valuationSubring] + base.maximalIdeal.Fiber (integralClosureIntegers base target)) : + (integralClosureIntegers base target) →+* + base.maximalIdeal.Fiber (integralClosureIntegers base target))) := by + rw [(integralClosure_base_maximal_fiber_includeRight_ker_eq_maximalIdeal_map base target)] + infer_instance + exact + (integralClosure_base_maximal_fiber_subsingleton_of_includeRight_henselianRing_ker base target) + +omit [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- The actual integral closure has at least one prime above the base maximal +ideal. -/ +theorem integralClosure_primesOver_base_maximal_nonempty + : + Nonempty (Ideal.primesOver base.maximalIdeal (integralClosureIntegers base target)) := by + let : Algebra.IsIntegral base.toDVF.valuationSubring (integralClosureIntegers base target) := + (integralClosure_isIntegral base target) + let : FaithfulSMul base.toDVF.valuationSubring (integralClosureIntegers base target) := + (integralClosure_faithfulSMul base target) + rcases Ideal.exists_maximal_ideal_liesOver_of_isIntegral + (S := (integralClosureIntegers base target)) base.maximalIdeal with + ⟨P, hPmax, hPover⟩ + exact ⟨⟨P, hPmax.isPrime, hPover⟩⟩ + +omit [FiniteDimensional K L] + [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- If the residue fiber over the base maximal ideal has at most one prime, +then so does the actual set of primes above the base maximal ideal. -/ +theorem integralClosure_primesOver_base_maximal_subsingleton_of_fiber_subsingleton + [Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target)))] : + Subsingleton + (Ideal.primesOver base.maximalIdeal (integralClosureIntegers base target)) := by + constructor + intro P Q + let e := PrimeSpectrum.primesOverOrderIsoFiber + base.toDVF.valuationSubring (integralClosureIntegers base target) base.maximalIdeal + exact e.injective (Subsingleton.elim (e P) (e Q)) + +omit [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- If the residue fiber over the base maximal ideal has at most one prime, +then the primes of the actual integral closure over the base maximal ideal form +a singleton. -/ +theorem integralClosure_primesOver_base_maximal_eq_singleton_of_fiber_subsingleton + [Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target)))] : + ∃ P : Ideal (integralClosureIntegers base target), + Ideal.primesOver base.maximalIdeal (integralClosureIntegers base target) = {P} := by + let : Subsingleton + (Ideal.primesOver base.maximalIdeal (integralClosureIntegers base target)) := + (integralClosure_primesOver_base_maximal_subsingleton_of_fiber_subsingleton base target) + rcases (integralClosure_primesOver_base_maximal_nonempty base target) with ⟨P⟩ + refine ⟨P, Set.eq_singleton_iff_unique_mem.mpr ⟨P.2, ?_⟩⟩ + intro Q hQ + exact congrArg Subtype.val + (Subsingleton.elim + (⟨Q, hQ⟩ : + Ideal.primesOver base.maximalIdeal (integralClosureIntegers base target)) P) + +omit [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- The actual integral closure is a fraction ring for the finite field +extension. -/ +theorem integralClosure_isFractionRing : + IsFractionRing (integralClosureIntegers base target) L := by + let : IsFractionRing base.toDVF.valuationSubring K := + base.toDVF.valuationSubring_isFractionRing + change IsFractionRing (integralClosure base.toDVF.valuationSubring L) L + exact integralClosure.isFractionRing_of_finite_extension K L + +omit [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- If the actual integral closure is a valuation ring, then it satisfies the +valuative dichotomy inside the extension field. -/ +theorem integralClosure_mem_or_inv_of_integralClosure_valuationRing + [ValuationRing (integralClosureIntegers base target)] : + ∀ z : L, + z ∈ (integralClosure base.toDVF.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.toDVF.valuationSubring L).toSubring := by + let : IsFractionRing (integralClosureIntegers base target) L := + (integralClosure_isFractionRing base target) + intro z + rcases ValuationRing.isInteger_or_isInteger + (R := (integralClosureIntegers base target)) (K := L) z with hz | hz + · left + rcases hz with ⟨y, hy⟩ + rw [← hy] + exact y.2 + · right + rcases hz with ⟨y, hy⟩ + rw [← hy] + exact y.2 + +omit [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- If the base valuation ring is used as a fraction ring for `K` and the field +extension is separable, the integral closure is Dedekind. -/ +theorem integralClosure_isDedekindDomain + [IsFractionRing base.toDVF.valuationSubring K] [Algebra.IsSeparable K L] : + IsDedekindDomain (integralClosureIntegers base target) := by + change IsDedekindDomain (integralClosure base.toDVF.valuationSubring L) + exact integralClosure.isDedekindDomain base.toDVF.valuationSubring K L + +omit [FiniteDimensional K L] + [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- If the primes of the actual integral closure over the base maximal ideal +form a singleton, then the actual integral closure is local. -/ +theorem integralClosure_isLocalRing_of_primesOver_base_maximal_eq_singleton + (P : Ideal (integralClosureIntegers base target)) + (hP : + Ideal.primesOver base.maximalIdeal (integralClosureIntegers base target) = {P}) : + IsLocalRing (integralClosureIntegers base target) := by + let : Algebra.IsIntegral base.toDVF.valuationSubring (integralClosureIntegers base target) := + (integralClosure_isIntegral base target) + have hPmem : P ∈ Ideal.primesOver base.maximalIdeal (integralClosureIntegers base target) := by + rw [hP] + exact Set.mem_singleton P + let : Nonempty (MaximalSpectrum (integralClosureIntegers base target)) := + ⟨⟨P, Ideal.isMaximal_of_mem_primesOver hPmem⟩⟩ + have hsub : + Subsingleton (MaximalSpectrum (integralClosureIntegers base target)) := by + constructor + intro M N + apply MaximalSpectrum.ext + have hMcomap : + (M.asIdeal.comap + (algebraMap base.toDVF.valuationSubring (integralClosureIntegers base target))) = + base.maximalIdeal := + IsLocalRing.eq_maximalIdeal + (Ideal.isMaximal_comap_of_isIntegral_of_isMaximal + (R := base.toDVF.valuationSubring) + (S := (integralClosureIntegers base target)) + (algebraMap base.toDVF.valuationSubring (integralClosureIntegers base target)) + (fun x => Algebra.IsIntegral.isIntegral x) M.asIdeal) + have hNcomap : + (N.asIdeal.comap + (algebraMap base.toDVF.valuationSubring (integralClosureIntegers base target))) = + base.maximalIdeal := + IsLocalRing.eq_maximalIdeal + (Ideal.isMaximal_comap_of_isIntegral_of_isMaximal + (R := base.toDVF.valuationSubring) + (S := (integralClosureIntegers base target)) + (algebraMap base.toDVF.valuationSubring (integralClosureIntegers base target)) + (fun x => Algebra.IsIntegral.isIntegral x) N.asIdeal) + have hMmem : + M.asIdeal ∈ Ideal.primesOver base.maximalIdeal + (integralClosureIntegers base target) := + ⟨M.isMaximal.isPrime, ⟨hMcomap.symm⟩⟩ + have hNmem : + N.asIdeal ∈ Ideal.primesOver base.maximalIdeal + (integralClosureIntegers base target) := + ⟨N.isMaximal.isPrime, ⟨hNcomap.symm⟩⟩ + have hMeq : M.asIdeal = P := by + simpa [hP] using hMmem + have hNeq : N.asIdeal = P := by + simpa [hP] using hNmem + exact hMeq.trans hNeq.symm + exact IsLocalRing.of_singleton_maximalSpectrum + +omit [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- If the residue fiber over the base maximal ideal has at most one prime, +then the actual integral closure is local. -/ +theorem integralClosure_isLocalRing_of_base_maximal_fiber_subsingleton + [Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target)))] : + IsLocalRing (integralClosureIntegers base target) := by + rcases + (integralClosure_primesOver_base_maximal_eq_singleton_of_fiber_subsingleton + base target) with + ⟨P, hP⟩ + exact (integralClosure_isLocalRing_of_primesOver_base_maximal_eq_singleton base target) P hP + +omit [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- Henselian-facing localness criterion via idempotent lifting in the finite +residue fiber. -/ +theorem integralClosure_isLocalRing_of_base_maximal_fiber_idempotents_lift + [Algebra.IsSeparable K L] + (hlift : + ∀ e : base.maximalIdeal.Fiber (integralClosureIntegers base target), + IsIdempotentElem e → + ∃ b : (integralClosureIntegers base target), + IsIdempotentElem b ∧ + Algebra.TensorProduct.includeRight b = e) : + IsLocalRing (integralClosureIntegers base target) := by + let : Subsingleton + (PrimeSpectrum (base.maximalIdeal.Fiber (integralClosureIntegers base target))) := + (integralClosure_base_maximal_fiber_subsingleton_of_idempotents_lift base target) hlift + exact (integralClosure_isLocalRing_of_base_maximal_fiber_subsingleton base target) + +omit [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- A local actual integral closure in a finite separable extension of a +Henselian DVF is a valuation ring. -/ +theorem integralClosure_valuationRing_of_isLocalRing + [Algebra.IsSeparable K L] + [IsLocalRing (integralClosureIntegers base target)] : + ValuationRing (integralClosureIntegers base target) := by + let : IsFractionRing base.toDVF.valuationSubring K := + base.toDVF.valuationSubring_isFractionRing + let : IsIntegrallyClosed base.toDVF.valuationSubring := + base.toDVF.valuationSubring_isIntegrallyClosed + let : IsNoetherianRing base.toDVF.valuationSubring := + base.toDVF.valuationSubring_isNoetherianRing + let : IsDomain (integralClosureIntegers base target) := by + change IsDomain (integralClosure base.toDVF.valuationSubring L) + infer_instance + let : IsDedekindDomain (integralClosureIntegers base target) := + (integralClosure_isDedekindDomain base target) + exact + ((tfae_of_isNoetherianRing_of_isLocalRing_of_isDomain + (integralClosureIntegers base target)).out 3 2).mp + (show IsDedekindDomain (integralClosureIntegers base target) from inferInstance) + +omit [base.toDVF.valuation.HasExtension target.toDVF.valuation] in +/-- If the actual integral closure is local, then it satisfies the valuative +dichotomy inside the extension field. -/ +theorem integralClosure_mem_or_inv_of_isLocalRing + [Algebra.IsSeparable K L] + [IsLocalRing (integralClosureIntegers base target)] : + ∀ z : L, + z ∈ (integralClosure base.toDVF.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure base.toDVF.valuationSubring L).toSubring := by + let : ValuationRing (integralClosureIntegers base target) := + (integralClosure_valuationRing_of_isLocalRing base target) + exact (integralClosure_mem_or_inv_of_integralClosure_valuationRing base target) + +/-- The chosen Henselian target valuation ring remains a DVR. -/ +theorem target_valuationSubring_isDiscreteValuationRing + : + IsDiscreteValuationRing target.toDVF.valuationSubring := + target.valuationSubring_isDiscreteValuationRing + +end ValuedExtension.Henselian +end DiscreteValuationField + +end + +end ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ResidueField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ResidueField.lean new file mode 100644 index 0000000000..d73c5cd09e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ResidueField.lean @@ -0,0 +1,341 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RingTheory.LocalRing.ResidueField.Basic + +/-! # Residue Field -/ + +@[expose] public section +namespace ValuationTheory + +/-! +# Residue-field API for local maps + +This file adds reusable local-ring residue-field lemmas that are used by the +Henselian and unramified parts of the DVF library. It keeps mathlib's +`IsLocalRing.ResidueField.map` and `IsLocalRing.residue` as the primary +objects. +-/ + +noncomputable +section + +universe u v w + +namespace DiscreteValuationField +namespace ResidueField + +variable {R : Type u} {S : Type v} {T : Type w} + +section LocalRing + +variable [CommRing R] [IsLocalRing R] + +/-- Equality in the residue field is equality modulo the maximal ideal. -/ +theorem residue_eq_residue_iff_sub_mem_maximalIdeal (x y : R) : + IsLocalRing.residue R x = IsLocalRing.residue R y ↔ + x - y ∈ IsLocalRing.maximalIdeal R := by + rw [← sub_eq_zero, ← map_sub, IsLocalRing.residue_eq_zero_iff] + +/-- The residue of a difference is zero exactly when the two residues are +equal. -/ +theorem residue_sub_eq_zero_iff (x y : R) : + IsLocalRing.residue R (x - y) = 0 ↔ + IsLocalRing.residue R x = IsLocalRing.residue R y := by + rw [IsLocalRing.residue_eq_zero_iff, + residue_eq_residue_iff_sub_mem_maximalIdeal] + +end LocalRing + +section FieldLift + +variable [CommRing R] [IsLocalRing R] [Field S] +variable (f : R →+* S) [IsLocalHom f] + +/-- The map from the residue field induced by a local homomorphism to a field is +uniquely characterized by its composite with the residue map. -/ +theorem lift_eq_of_comp_residue_eq + (g : IsLocalRing.ResidueField R →+* S) + (hg : g.comp (IsLocalRing.residue R) = f) : + g = IsLocalRing.ResidueField.lift f := by + ext x + obtain ⟨r, rfl⟩ := IsLocalRing.residue_surjective x + have hr := congr_arg (fun h : R →+* S => h r) hg + simpa [RingHom.comp_apply, IsLocalRing.ResidueField.lift_residue_apply] using hr + +end FieldLift + +section LocalHom + +variable [CommRing R] [IsLocalRing R] [CommRing S] [IsLocalRing S] +variable (f : R →+* S) [IsLocalHom f] + +/-- A local homomorphism pulls back the target maximal ideal to the source +maximal ideal. -/ +theorem comap_maximalIdeal_eq : + (IsLocalRing.maximalIdeal S).comap f = IsLocalRing.maximalIdeal R := + IsLocalRing.maximalIdeal_comap f + +/-- A local homomorphism induces an injective map on residue fields. -/ +theorem map_injective : + Function.Injective (IsLocalRing.ResidueField.map f) := by + intro x y hxy + obtain ⟨r, rfl⟩ := IsLocalRing.residue_surjective x + obtain ⟨s, rfl⟩ := IsLocalRing.residue_surjective y + rw [IsLocalRing.ResidueField.map_residue, + IsLocalRing.ResidueField.map_residue] at hxy + rw [residue_eq_residue_iff_sub_mem_maximalIdeal] + have hsubS : f (r - s) ∈ IsLocalRing.maximalIdeal S := by + rw [map_sub] + exact + (residue_eq_residue_iff_sub_mem_maximalIdeal + (R := S) (f r) (f s)).1 hxy + have hpre : r - s ∈ (IsLocalRing.maximalIdeal S).comap f := hsubS + rwa [comap_maximalIdeal_eq f] at hpre + +/-- A residue-field map induced by a local homomorphism has trivial kernel. -/ +theorem map_eq_zero_iff (x : IsLocalRing.ResidueField R) : + IsLocalRing.ResidueField.map f x = 0 ↔ x = 0 := by + constructor + · intro hx + exact map_injective f (by simpa using hx) + · intro hx + rw [hx, map_zero] + +/-- Equality can be checked after applying the residue-field map induced by a +local homomorphism. -/ +theorem map_eq_map_iff (x y : IsLocalRing.ResidueField R) : + IsLocalRing.ResidueField.map f x = IsLocalRing.ResidueField.map f y ↔ + x = y := by + constructor + · intro hxy + exact map_injective f hxy + · intro h + rw [h] + +/-- The residue-field isomorphism induced by a surjective residue-field map +coming from a local homomorphism. -/ +noncomputable def ringEquivOfSurjective + (hsurj : Function.Surjective (IsLocalRing.ResidueField.map f)) : + IsLocalRing.ResidueField R ≃+* IsLocalRing.ResidueField S := + RingEquiv.ofBijective (IsLocalRing.ResidueField.map f) + ⟨map_injective f, hsurj⟩ + +/-- The residue-ring equivalence induced by a surjective map evaluates by that map. -/ +@[simp] +theorem ringEquivOfSurjective_apply + (hsurj : Function.Surjective (IsLocalRing.ResidueField.map f)) + (x : IsLocalRing.ResidueField R) : + ringEquivOfSurjective f hsurj x = + IsLocalRing.ResidueField.map f x := + rfl + +/-- A local homomorphism preserves and reflects zero residues. -/ +theorem residue_map_eq_zero_iff (x : R) : + IsLocalRing.residue S (f x) = 0 ↔ IsLocalRing.residue R x = 0 := by + rw [← IsLocalRing.ResidueField.map_residue f x] + exact map_eq_zero_iff f (IsLocalRing.residue R x) + +/-- A local homomorphism preserves and reflects equality of residues. -/ +theorem residue_map_eq_iff (x y : R) : + IsLocalRing.residue S (f x) = IsLocalRing.residue S (f y) ↔ + IsLocalRing.residue R x = IsLocalRing.residue R y := by + simpa [IsLocalRing.ResidueField.map_residue f] using + map_eq_map_iff f (IsLocalRing.residue R x) (IsLocalRing.residue R y) + +/-- A mapped residue class equals a target residue class exactly when their +chosen representatives are congruent modulo the target maximal ideal. -/ +theorem map_residue_eq_residue_iff_sub_mem_maximalIdeal (x : R) (y : S) : + IsLocalRing.ResidueField.map f (IsLocalRing.residue R x) = + IsLocalRing.residue S y ↔ + f x - y ∈ IsLocalRing.maximalIdeal S := by + simpa [IsLocalRing.ResidueField.map_residue f x] using + residue_eq_residue_iff_sub_mem_maximalIdeal (R := S) (f x) y + +/-- Target residue equality with a mapped residue class, in the opposite +orientation, is also equality modulo the target maximal ideal. -/ +theorem residue_eq_map_residue_iff_sub_mem_maximalIdeal (y : S) (x : R) : + IsLocalRing.residue S y = + IsLocalRing.ResidueField.map f (IsLocalRing.residue R x) ↔ + y - f x ∈ IsLocalRing.maximalIdeal S := by + simpa [IsLocalRing.ResidueField.map_residue f x] using + residue_eq_residue_iff_sub_mem_maximalIdeal (R := S) y (f x) + +end LocalHom + +section Algebra + +variable [CommRing R] [IsLocalRing R] [CommRing S] [IsLocalRing S] +variable [Algebra R S] [IsLocalHom (algebraMap R S)] + +/-- For a local algebra map, mathlib's residue-field algebra map agrees with +the residue-field map induced by the structure homomorphism. -/ +theorem algebraMap_eq_map_algebraMap : + algebraMap (IsLocalRing.ResidueField R) + (IsLocalRing.ResidueField S) = + IsLocalRing.ResidueField.map (algebraMap R S) := by + ext x + obtain ⟨r, rfl⟩ := IsLocalRing.residue_surjective x + simp [IsLocalRing.ResidueField.map_residue, + IsLocalRing.ResidueField.algebraMap_residue] + +/-- The residue-field map induced by a local algebra map is injective. -/ +theorem map_algebraMap_injective : + Function.Injective + (IsLocalRing.ResidueField.map (algebraMap R S)) := + map_injective (algebraMap R S) + +/-- The residue-field map induced by a local algebra map has trivial +kernel. -/ +theorem map_algebraMap_eq_zero_iff (x : IsLocalRing.ResidueField R) : + IsLocalRing.ResidueField.map (algebraMap R S) x = 0 ↔ x = 0 := + map_eq_zero_iff (algebraMap R S) x + +/-- A local algebra map preserves and reflects zero residues. -/ +theorem residue_algebraMap_eq_zero_iff (x : R) : + IsLocalRing.residue S (algebraMap R S x) = 0 ↔ + IsLocalRing.residue R x = 0 := + residue_map_eq_zero_iff (algebraMap R S) x + +/-- A local algebra map preserves and reflects equality of residues. -/ +theorem residue_algebraMap_eq_iff (x y : R) : + IsLocalRing.residue S (algebraMap R S x) = + IsLocalRing.residue S (algebraMap R S y) ↔ + IsLocalRing.residue R x = IsLocalRing.residue R y := + residue_map_eq_iff (algebraMap R S) x y + +/-- The residue-field algebra map sends the residue of `x` to the residue of +`y` exactly when `algebraMap R S x` and `y` are congruent modulo the target +maximal ideal. -/ +theorem algebraMap_residue_eq_residue_iff_sub_mem_maximalIdeal + (x : R) (y : S) : + algebraMap (IsLocalRing.ResidueField R) (IsLocalRing.ResidueField S) + (IsLocalRing.residue R x) = IsLocalRing.residue S y ↔ + algebraMap R S x - y ∈ IsLocalRing.maximalIdeal S := by + rw [algebraMap_eq_map_algebraMap] + exact map_residue_eq_residue_iff_sub_mem_maximalIdeal (algebraMap R S) x y + +end Algebra + +section AlgEquiv + +variable [CommRing T] [IsLocalRing T] +variable [CommRing R] [IsLocalRing R] [Algebra T R] +variable [CommRing S] [IsLocalRing S] [Algebra T S] +variable [IsLocalHom (algebraMap T R)] [IsLocalHom (algebraMap T S)] + +/-- A local algebra equivalence induces an algebra equivalence on residue +fields over the base residue field. -/ +noncomputable def algEquivOfAlgEquiv + (e : R ≃ₐ[T] S) : + IsLocalRing.ResidueField R ≃ₐ[IsLocalRing.ResidueField T] + IsLocalRing.ResidueField S := by + letI : IsLocalHom (e.toRingEquiv : R →+* S) := + IsLocalHom.of_surjective (e.toRingEquiv : R →+* S) e.surjective + letI : IsLocalHom (e.symm.toRingEquiv : S →+* R) := + IsLocalHom.of_surjective (e.symm.toRingEquiv : S →+* R) e.symm.surjective + exact + { IsLocalRing.ResidueField.mapEquiv e.toRingEquiv with + commutes' := by + intro x + obtain ⟨t, rfl⟩ := IsLocalRing.residue_surjective x + simp [IsLocalRing.ResidueField.algebraMap_residue, + IsLocalRing.ResidueField.map_residue, e.commutes t] } + +/-- The residue-field equivalence induced by an algebra equivalence acts through +residue representatives. -/ +@[simp] +theorem algEquivOfAlgEquiv_apply + (e : R ≃ₐ[T] S) + (x : IsLocalRing.ResidueField R) : + algEquivOfAlgEquiv e x = + IsLocalRing.ResidueField.map e.toRingEquiv x := + rfl + +/-- The induced residue algebra equivalence agrees with the canonical quotient-map equivalence. -/ +theorem algEquivOfAlgEquiv_apply_eq_mapEquiv + (e : R ≃ₐ[T] S) + (x : IsLocalRing.ResidueField R) : + algEquivOfAlgEquiv e x = + IsLocalRing.ResidueField.mapEquiv e.toRingEquiv x := + rfl + +/-- The inverse induced residue equivalence agrees with the inverse quotient-map equivalence. -/ +theorem algEquivOfAlgEquiv_symm_apply_eq_mapEquiv + (e : R ≃ₐ[T] S) + (x : IsLocalRing.ResidueField S) : + (algEquivOfAlgEquiv e).symm x = + IsLocalRing.ResidueField.mapEquiv e.symm.toRingEquiv x := + rfl + +/-- The induced residue equivalence sends the residue of an integral element to +its transported residue. -/ +@[simp] +theorem algEquivOfAlgEquiv_apply_residue + (e : R ≃ₐ[T] S) (x : R) : + algEquivOfAlgEquiv e (IsLocalRing.residue R x) = + IsLocalRing.residue S (e x) := by + let : IsLocalHom (e.toRingEquiv : R →+* S) := + IsLocalHom.of_surjective (e.toRingEquiv : R →+* S) e.surjective + change IsLocalRing.ResidueField.map e.toRingEquiv + (IsLocalRing.residue R x) = IsLocalRing.residue S (e x) + rfl + +/-- The inverse induced residue equivalence sends residues back along the inverse +algebra equivalence. -/ +theorem algEquivOfAlgEquiv_symm_apply_residue + (e : R ≃ₐ[T] S) (x : S) : + (algEquivOfAlgEquiv e).symm (IsLocalRing.residue S x) = + IsLocalRing.residue R (e.symm x) := by + let : IsLocalHom (e.symm.toRingEquiv : S →+* R) := + IsLocalHom.of_surjective (e.symm.toRingEquiv : S →+* R) e.symm.surjective + rw [algEquivOfAlgEquiv_symm_apply_eq_mapEquiv] + change IsLocalRing.ResidueField.map e.symm.toRingEquiv + (IsLocalRing.residue S x) = IsLocalRing.residue R (e.symm x) + rfl + +/-- Passing to residue fields commutes with inversion of algebra equivalences. -/ +@[simp] +theorem algEquivOfAlgEquiv_symm + (e : R ≃ₐ[T] S) : + (algEquivOfAlgEquiv e).symm = algEquivOfAlgEquiv e.symm := by + ext x + rfl + +/-- The identity algebra equivalence induces the identity on residue fields. -/ +@[simp] +theorem algEquivOfAlgEquiv_refl : + algEquivOfAlgEquiv (AlgEquiv.refl : R ≃ₐ[T] R) = + (AlgEquiv.refl : + IsLocalRing.ResidueField R ≃ₐ[IsLocalRing.ResidueField T] + IsLocalRing.ResidueField R) := by + ext x + simp [algEquivOfAlgEquiv] + +/-- Residue-field equivalences respect composition of algebra equivalences. -/ +@[simp] +theorem algEquivOfAlgEquiv_trans + {U : Type*} [CommRing U] [IsLocalRing U] [Algebra T U] + [IsLocalHom (algebraMap T U)] + (eRS : R ≃ₐ[T] S) (eSU : S ≃ₐ[T] U) : + (algEquivOfAlgEquiv eRS).trans (algEquivOfAlgEquiv eSU) = + algEquivOfAlgEquiv (eRS.trans eSU) := by + ext x + rw [algEquivOfAlgEquiv] + exact congr_arg (fun f => f x) + (IsLocalRing.ResidueField.mapEquiv_trans + eRS.toRingEquiv eSU.toRingEquiv).symm + +end AlgEquiv + +end ResidueField +end DiscreteValuationField + +end + +end ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationExtension.lean new file mode 100644 index 0000000000..714c2a107b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationExtension.lean @@ -0,0 +1,276 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions + +/-! # Valuation Extension -/ + +@[expose] public section +namespace ValuationTheory + +/-! +# Valuation extensions + +Mathlib's uniqueness criterion for valuations is expressed through +`Valuation.IsEquiv`: two valuations on the same field are equivalent exactly +when they have the same valuation subring. The results here use the ambient +valued-extension property directly; no marker object is introduced. +-/ + +noncomputable +section + +universe u v w x y + +namespace DiscreteValuationField +namespace ValuedExtension + +variable {K : Type u} {L : Type w} [Field K] [Field L] [Algebra K L] + +section EquivalentBase + +variable {Gamma₁ Gamma₂ GammaL : Type*} +variable [LinearOrderedCommGroupWithZero Gamma₁] +variable [LinearOrderedCommGroupWithZero Gamma₂] +variable [LinearOrderedCommGroupWithZero GammaL] + +/-- Replacing the base valuation by an equivalent valuation preserves the +extension relation. -/ +theorem hasExtension_of_isEquiv_base + {v₁ : _root_.Valuation K Gamma₁} + {v₂ : _root_.Valuation K Gamma₂} + {wL : _root_.Valuation L GammaL} + (h : v₁.IsEquiv v₂) [v₂.HasExtension wL] : + v₁.HasExtension wL where + val_isEquiv_comap := + h.trans + (_root_.Valuation.HasExtension.val_isEquiv_comap + (vR := v₂) (vA := wL)) + +end EquivalentBase + +section ComapAlongCompatibleEmbedding + +variable {M : Type y} [Field M] [Algebra K M] +variable {GammaK GammaM : Type*} +variable [LinearOrderedCommGroupWithZero GammaK] +variable [LinearOrderedCommGroupWithZero GammaM] + +/-- If an ambient valuation extends the base valuation, then its pullback +along any field embedding compatible with the two base embeddings also +extends the base valuation. -/ +theorem hasExtension_comap_of_algebraMap_compatible + {vK : _root_.Valuation K GammaK} + {vM : _root_.Valuation M GammaM} + (ι : L →+* M) + (hι : + ι.comp (algebraMap K L) = + algebraMap K M) + [vK.HasExtension vM] : + vK.HasExtension (vM.comap ι) where + val_isEquiv_comap := by + rw [_root_.Valuation.isEquiv_iff_val_le_one] + intro a + change + vK a ≤ 1 ↔ + vM (ι (algebraMap K L a)) ≤ 1 + rw [show ι (algebraMap K L a) = algebraMap K M a by + exact DFunLike.congr_fun hι a] + exact + (_root_.Valuation.HasExtension.val_map_le_one_iff + (vR := vK) (vA := vM) a).symm + +end ComapAlongCompatibleEmbedding + +section LocalValuationSubringMap + +variable (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) + +/-- A local map between the valuation rings, whose map on fraction fields is +the given algebra map, determines an extension of valuations. + +The locality hypothesis is the essential point: if an element of the base +field is not integral, its inverse lies in the maximal ideal. Locality sends +that inverse into the target maximal ideal, so the image of the original +element cannot be integral. -/ +theorem valuation_hasExtension_of_local_valuationSubring_map + (f : base.valuationSubring →+* target.valuationSubring) + [IsLocalHom f] + (hcoe : ∀ z : base.valuationSubring, + ((f z : target.valuationSubring) : L) = + algebraMap K L (z : K)) : + base.valuation.HasExtension target.valuation := by + apply _root_.Valuation.HasExtension.ofComapInteger + ext z + change + algebraMap K L z ∈ target.valuation.valuationSubring ↔ + z ∈ base.valuation.valuationSubring + constructor + · intro hzTarget + by_contra hzBase + have hz_ne : z ≠ 0 := by + intro hz + subst z + exact hzBase base.valuation.valuationSubring.zero_mem + have hinvNonunit : + z⁻¹ ∈ base.valuation.valuationSubring.nonunits := + (base.valuation.valuationSubring.inv_mem_nonunits_iff).2 + (Or.inr hzBase) + let zinverse : base.valuationSubring := + ⟨z⁻¹, + base.valuation.valuationSubring.nonunits_subset hinvNonunit⟩ + have hzinverseMaximal : + zinverse ∈ IsLocalRing.maximalIdeal base.valuationSubring := by + apply + base.valuation.valuationSubring.coe_mem_nonunits_iff.mp + exact hinvNonunit + have hmapMaximal : + f zinverse ∈ IsLocalRing.maximalIdeal target.valuationSubring := + map_nonunit f zinverse hzinverseMaximal + let ztarget : target.valuationSubring := + ⟨algebraMap K L z, hzTarget⟩ + have hproduct : f zinverse * ztarget = 1 := by + apply Subtype.ext + change + ((f zinverse : target.valuationSubring) : L) * + algebraMap K L z = + 1 + rw [hcoe] + change algebraMap K L (z⁻¹) * algebraMap K L z = 1 + rw [← map_mul, inv_mul_cancel₀ hz_ne, map_one] + have hone : + (1 : target.valuationSubring) ∈ + IsLocalRing.maximalIdeal target.valuationSubring := by + rw [← hproduct] + exact + (IsLocalRing.maximalIdeal target.valuationSubring).mul_mem_right + ztarget hmapMaximal + exact + (IsLocalRing.maximalIdeal.isMaximal target.valuationSubring).isPrime.one_notMem + hone + · intro hzBase + let zbase : base.valuationSubring := ⟨z, hzBase⟩ + have hzMap : + ((f zbase : target.valuationSubring) : L) ∈ + target.valuation.valuationSubring := + (f zbase).property + rwa [hcoe] at hzMap + +/-- An equivalence of valuation subrings whose underlying field map is the +given algebra map determines an extension of valuations. Surjectivity makes +the induced ring homomorphism local, so this is the source-producing +equivalence form of +`valuation_hasExtension_of_local_valuationSubring_map`. -/ +theorem valuation_hasExtension_of_valuationSubring_equiv + (e : base.valuationSubring ≃+* target.valuationSubring) + (hcoe : ∀ z : base.valuationSubring, + ((e z : target.valuationSubring) : L) = + algebraMap K L (z : K)) : + base.valuation.HasExtension target.valuation := by + let : IsLocalHom e.toRingHom := + IsLocalHom.of_surjective e.toRingHom e.surjective + exact + valuation_hasExtension_of_local_valuationSubring_map + base target e.toRingHom hcoe + +end LocalValuationSubringMap + +section Pullback + +variable (base : CompleteDVF.{u, v} K) (target : CompleteDVF.{w, x} L) +variable [base.valuation.HasExtension target.valuation] + +/-- The target valuation subring pulls back to the base valuation subring. -/ +theorem comap_valuationSubring_eq_base : + target.valuation.valuationSubring.comap (algebraMap K L) = + base.valuation.valuationSubring := by + ext a + simp [Valuation.mem_valuationSubring_iff, + _root_.Valuation.HasExtension.val_map_le_one_iff + (vR := base.valuation) (vA := target.valuation)] + +/-- Any valuation extending the base valuation has valuation subring pulling +back to the base valuation subring. -/ +theorem comap_valuationSubring_eq_base_of_hasExtension + {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'] : + v'.valuationSubring.comap (algebraMap K L) = + base.valuation.valuationSubring := by + ext a + simp [Valuation.mem_valuationSubring_iff, + _root_.Valuation.HasExtension.val_map_le_one_iff + (vR := base.valuation) (vA := v')] + +end Pullback + +section Comparison + +variable (target : CompleteDVF.{w, x} L) + +/-- Equality of valuation subrings implies valuation equivalence. -/ +theorem valuation_isEquiv_of_valuationSubring_eq + {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') + (hsub : target.valuation.valuationSubring = v'.valuationSubring) : + target.valuation.IsEquiv v' := + (_root_.Valuation.isEquiv_iff_valuationSubring target.valuation v').2 hsub + +/-- Equivalent valuations have the same valuation subring. -/ +theorem valuationSubring_eq_of_valuation_isEquiv + {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + {v' : _root_.Valuation L Gamma'} + (h : target.valuation.IsEquiv v') : + target.valuation.valuationSubring = v'.valuationSubring := + (_root_.Valuation.isEquiv_iff_valuationSubring target.valuation v').1 h + +/-- Valuation equivalence is exactly equality of valuation subrings. -/ +theorem valuation_isEquiv_iff_valuationSubring_eq + {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') : + target.valuation.IsEquiv v' ↔ + target.valuation.valuationSubring = v'.valuationSubring := + _root_.Valuation.isEquiv_iff_valuationSubring target.valuation v' + +/-- Equality of valuation subrings is pointwise equality of membership. -/ +theorem valuationSubring_eq_iff_mem_valuationSubring + {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') : + target.valuation.valuationSubring = v'.valuationSubring ↔ + ∀ z : L, z ∈ target.valuation.valuationSubring ↔ + z ∈ v'.valuationSubring := by + constructor + · intro h z + rw [h] + · exact fun h => SetLike.ext h + +/-- Valuation equivalence can be checked pointwise on valuation-ring +membership. -/ +theorem valuation_isEquiv_iff_mem_valuationSubring + {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') : + target.valuation.IsEquiv v' ↔ + ∀ z : L, z ∈ target.valuation.valuationSubring ↔ + z ∈ v'.valuationSubring := by + rw [valuation_isEquiv_iff_valuationSubring_eq target v', + valuationSubring_eq_iff_mem_valuationSubring target v'] + +/-- A pointwise valuation-ring membership criterion gives valuation +equivalence. -/ +theorem valuation_isEquiv_of_mem_valuationSubring_iff + {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') + (hmem : ∀ z : L, + z ∈ target.valuation.valuationSubring ↔ z ∈ v'.valuationSubring) : + target.valuation.IsEquiv v' := + valuation_isEquiv_of_valuationSubring_eq target v' (SetLike.ext hmem) + +end Comparison +end ValuedExtension +end DiscreteValuationField +end +end ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationTransport.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationTransport.lean new file mode 100644 index 0000000000..af0ce88d52 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationTransport.lean @@ -0,0 +1,187 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Basic + +/-! # Valuation Transport -/ + +@[expose] public section +namespace ValuationTheory + +/-! +# Valuation transport along field equivalences + +This file records the source facts needed to transport complete-DVF data from +a finite subextension to its image inside a common ambient field. The +transport is by comapping the valuation along a field equivalence; no +valuation-comparison hypothesis is added. +-/ + +noncomputable +section + +universe u v w + +namespace DiscreteValuationField +namespace Valuation + +variable {K : Type u} {L : Type w} [Field K] [Field L] +variable {Γ : Type v} [LinearOrderedCommGroupWithZero Γ] + +/-- Pulling a valuation back along a field equivalence does not change its +value group. -/ +theorem valueGroup_comap_ringEquiv + (v : _root_.Valuation K Γ) (e : L ≃+* K) : + MonoidWithZeroHom.valueGroup + (.ofClass (v.comap (e : L →+* K))) = + MonoidWithZeroHom.valueGroup (.ofClass v) := by + ext γ + constructor + · intro hγ + have hval : + (γ : Γ) ∈ Set.range (v.comap (e : L →+* K)) \ {0} := by + have himage : + (γ : Γ) ∈ Units.val '' MonoidWithZeroHom.valueGroup + (.ofClass (v.comap (e : L →+* K))) := + ⟨γ, hγ, rfl⟩ + rw [MonoidWithZeroHom.valueGroup_eq_range] at himage + simpa only [MonoidWithZeroHom.coe_ofClass] using himage + rcases hval with ⟨hrange, hne⟩ + rcases hrange with ⟨x, hx⟩ + have hval' : (γ : Γ) ∈ Set.range v \ {0} := by + exact ⟨⟨e x, by simpa using hx⟩, hne⟩ + have himage : + (γ : Γ) ∈ + Units.val '' MonoidWithZeroHom.valueGroup (.ofClass v) := by + rw [MonoidWithZeroHom.valueGroup_eq_range] + simpa only [MonoidWithZeroHom.coe_ofClass] using hval' + rcases himage with ⟨δ, hδ, hδγ⟩ + have hδ_eq : δ = γ := Units.ext hδγ + simpa [hδ_eq] using hδ + · intro hγ + have hval : (γ : Γ) ∈ Set.range v \ {0} := by + have himage : + (γ : Γ) ∈ + Units.val '' MonoidWithZeroHom.valueGroup (.ofClass v) := + ⟨γ, hγ, rfl⟩ + rw [MonoidWithZeroHom.valueGroup_eq_range] at himage + simpa only [MonoidWithZeroHom.coe_ofClass] using himage + rcases hval with ⟨hrange, hne⟩ + rcases hrange with ⟨x, hx⟩ + have hval' : + (γ : Γ) ∈ Set.range (v.comap (e : L →+* K)) \ {0} := by + exact ⟨⟨e.symm x, by simpa using hx⟩, hne⟩ + have himage : + (γ : Γ) ∈ + Units.val '' MonoidWithZeroHom.valueGroup + (.ofClass (v.comap (e : L →+* K))) := by + rw [MonoidWithZeroHom.valueGroup_eq_range] + simpa only [MonoidWithZeroHom.coe_ofClass] using hval' + rcases himage with ⟨δ, hδ, hδγ⟩ + have hδ_eq : δ = γ := Units.ext hδγ + simpa [hδ_eq] using hδ + +/-- Rank-one discreteness is preserved by pulling a valuation back along a +field equivalence. -/ +instance isRankOneDiscrete_comap_ringEquiv + (v : _root_.Valuation K Γ) [v.IsRankOneDiscrete] (e : L ≃+* K) : + (v.comap (e : L →+* K)).IsRankOneDiscrete where + exists_generator_lt_one' := by + rcases _root_.Valuation.IsRankOneDiscrete.exists_generator_lt_one v with + ⟨γ, hγ, hlt⟩ + refine ⟨γ, ?_, hlt⟩ + simpa [valueGroup_comap_ringEquiv (v := v) e] using hγ + +/-- The valuation ring of a comapped valuation is the source valuation ring, +transported through the field equivalence. -/ +noncomputable def valuationSubringRingEquivOfComap + (v : _root_.Valuation K Γ) (e : L ≃+* K) : + (v.comap (e : L →+* K)).valuationSubring ≃+* v.valuationSubring where + toFun x := ⟨e (x : L), x.2⟩ + invFun y := ⟨e.symm (y : K), by + change v (e (e.symm (y : K))) ≤ 1 + rw [e.apply_symm_apply] + exact y.2⟩ + left_inv x := by + ext + simp + right_inv y := by + ext + simp + map_mul' x y := by + ext + simp + map_add' x y := by + ext + simp + +/-- The valuation-subring equivalence induced by a comap acts through the ambient ring map. -/ +@[simp] theorem valuationSubringRingEquivOfComap_apply + (v : _root_.Valuation K Γ) (e : L ≃+* K) + (x : (v.comap (e : L →+* K)).valuationSubring) : + ((valuationSubringRingEquivOfComap v e x : v.valuationSubring) : K) = + e (x : L) := + rfl + +/-- The valuation-ring equivalence attached to a comap carries maximal-ideal +membership exactly. -/ +theorem valuationSubringRingEquivOfComap_mem_maximalIdeal_iff + (v : _root_.Valuation K Γ) (e : L ≃+* K) + (x : (v.comap (e : L →+* K)).valuationSubring) : + valuationSubringRingEquivOfComap v e x ∈ + IsLocalRing.maximalIdeal v.valuationSubring ↔ + x ∈ IsLocalRing.maximalIdeal + (v.comap (e : L →+* K)).valuationSubring := by + rw [_root_.Valuation.mem_maximalIdeal_iff, + _root_.Valuation.mem_maximalIdeal_iff] + rfl + +/-- Map form of maximal-ideal preservation for the valuation-ring equivalence +attached to a comap. -/ +@[simp] theorem maximalIdeal_map_valuationSubringRingEquivOfComap + (v : _root_.Valuation K Γ) (e : L ≃+* K) : + (IsLocalRing.maximalIdeal + (v.comap (e : L →+* K)).valuationSubring).map + (valuationSubringRingEquivOfComap v e : + (v.comap (e : L →+* K)).valuationSubring →+* + v.valuationSubring) = + IsLocalRing.maximalIdeal v.valuationSubring := by + let r := valuationSubringRingEquivOfComap v e + ext y + rw [Ideal.mem_map_iff_of_surjective + (r : (v.comap (e : L →+* K)).valuationSubring →+* + v.valuationSubring) r.surjective] + constructor + · rintro ⟨x, hx, rfl⟩ + exact + (valuationSubringRingEquivOfComap_mem_maximalIdeal_iff v e x).2 hx + · intro hy + refine ⟨r.symm y, ?_, by simp [r]⟩ + exact + (valuationSubringRingEquivOfComap_mem_maximalIdeal_iff v e + (r.symm y)).1 (by simpa [r] using hy) + +/-- Comap form of maximal-ideal preservation for the valuation-ring +equivalence attached to a comap. -/ +@[simp] theorem maximalIdeal_comap_valuationSubringRingEquivOfComap + (v : _root_.Valuation K Γ) (e : L ≃+* K) : + (IsLocalRing.maximalIdeal v.valuationSubring).comap + (valuationSubringRingEquivOfComap v e : + (v.comap (e : L →+* K)).valuationSubring →+* + v.valuationSubring) = + IsLocalRing.maximalIdeal + (v.comap (e : L →+* K)).valuationSubring := by + ext x + exact valuationSubringRingEquivOfComap_mem_maximalIdeal_iff v e x + +end Valuation +end DiscreteValuationField + +end + +end ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/HenselLemma.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/HenselLemma.lean new file mode 100644 index 0000000000..30a3e12f9b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/HenselLemma.lean @@ -0,0 +1,333 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Henselian +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ResidueField +public import Mathlib.Algebra.Polynomial.FieldDivision + +/-! # Hensel Lemma -/ + +@[expose] public section +namespace ValuationTheory + +/-! +# Factorization-shaped Hensel consequences + +Mathlib exposes the simple-root form of Hensel's lemma. The statements below +turn it into a linear-factor lifting API for a simple residual linear factor. +-/ + +noncomputable +section + +universe u v + +namespace DiscreteValuationField + +/-- The cofactor obtained by dividing by `X - C a` evaluates to the derivative +value at `a`. This is the polynomial identity behind the simple-root +decomposition over the residual algebra. -/ +theorem divByMonic_X_sub_C_eval_eq_derivative_eval + {S : Type*} [CommRing S] (p : Polynomial S) (a : S) : + (p /ₘ (Polynomial.X - Polynomial.C a)).eval a = + p.derivative.eval a := by + have h := + Polynomial.divByMonic_add_X_sub_C_mul_derivative_divByMonic_eq_derivative + p a + have heval := congrArg (fun q : Polynomial S => q.eval a) h + simpa [Polynomial.eval_add, Polynomial.eval_mul, Polynomial.eval_sub] using + heval + +namespace HenselianDVF + +open ValuationTheory.DiscreteValuationField.ResidueField + +variable {K : Type u} [Field K] + +/-- A linear factor is coprime to any polynomial whose value at the root is a +unit. This is the elementary Bezout step used in factorization-form Hensel +arguments. -/ +theorem isCoprime_X_sub_C_of_isUnit_eval + {R : Type u} [CommRing R] (q : Polynomial R) (a : R) + (hq : IsUnit (q.eval a)) : + IsCoprime (Polynomial.X - Polynomial.C a) q := by + rcases Polynomial.X_sub_C_dvd_sub_C_eval (p := q) (a := a) with ⟨r, hr⟩ + refine ⟨-Polynomial.C hq.unit⁻¹.val * r, Polynomial.C hq.unit⁻¹.val, ?_⟩ + have hq_eq : + q = (Polynomial.X - Polynomial.C a) * r + Polynomial.C (q.eval a) := by + rw [← sub_eq_iff_eq_add] + exact hr + have hq_sub : + q - (Polynomial.X - Polynomial.C a) * r = Polynomial.C (q.eval a) := by + rw [← hr] + ring + calc + -Polynomial.C ↑hq.unit⁻¹ * r * (Polynomial.X - Polynomial.C a) + + Polynomial.C ↑hq.unit⁻¹ * q = + Polynomial.C ↑hq.unit⁻¹ * (q - (Polynomial.X - Polynomial.C a) * r) := by + ring + _ = Polynomial.C ↑hq.unit⁻¹ * Polynomial.C (q.eval a) := by + rw [hq_sub] + _ = 1 := by + rw [← Polynomial.C_mul] + exact congrArg Polynomial.C hq.val_inv_mul + +/-- If `f = (X - a) * q` and the derivative of `f` at `a` is a unit, then +the linear factor and the quotient are coprime. + +This is the coprime-factor algebra bridge needed after a Hensel lift proves +that the lifted root remains simple. -/ +theorem linearFactor_isCoprime_quotient_of_derivative_isUnit + {R : Type u} [CommRing R] (f q : Polynomial R) (a : R) + (hfactor : f = (Polynomial.X - Polynomial.C a) * q) + (hderiv : IsUnit (f.derivative.eval a)) : + IsCoprime (Polynomial.X - Polynomial.C a) q := by + have hq_eval : f.derivative.eval a = q.eval a := by + rw [hfactor, Polynomial.derivative_mul, Polynomial.eval_add, + Polynomial.eval_mul, Polynomial.derivative_X_sub_C, Polynomial.eval_one, + one_mul, Polynomial.eval_mul, Polynomial.eval_sub, Polynomial.eval_X, + Polynomial.eval_C, sub_self, zero_mul, add_zero] + exact isCoprime_X_sub_C_of_isUnit_eval q a (hq_eval ▸ hderiv) + +variable (F : HenselianDVF.{u, v} K) + +/-- A simple root in a fixed residue class is unique. + +This is the uniqueness half used by residue-lift constructions: if two actual +roots have the same residue and one of them has unit derivative, then they are +equal. -/ +theorem eq_of_isRoot_of_isRoot_of_residue_eq_of_derivative_isUnit + {f : Polynomial F.valuationSubring} {a b : F.valuationSubring} + (ha : f.IsRoot a) (hb : f.IsRoot b) + (hres : F.residueMap b = F.residueMap a) + (hderiv : IsUnit (f.derivative.eval a)) : + b = a := by + let q : Polynomial F.valuationSubring := + f /ₘ (Polynomial.X - Polynomial.C a) + have hfactor : + (Polynomial.X - Polynomial.C a) * q = f := by + dsimp [q] + rw [Polynomial.mul_divByMonic_eq_iff_isRoot] + exact ha + have hq_eval : + q.eval a = f.derivative.eval a := by + simpa [q] using + divByMonic_X_sub_C_eval_eq_derivative_eval (p := f) a + have hq_unit_a : IsUnit (q.eval a) := by + simpa [hq_eval] using hderiv + have hq_residue : + F.residueMap (q.eval b) = F.residueMap (q.eval a) := by + calc + F.residueMap (q.eval b) = + (q.map F.residueMap).eval (F.residueMap b) := by + exact (Polynomial.eval_map_apply (f := F.residueMap) (p := q) b).symm + _ = (q.map F.residueMap).eval (F.residueMap a) := by + rw [hres] + _ = F.residueMap (q.eval a) := by + exact Polynomial.eval_map_apply (f := F.residueMap) (p := q) a + have hq_residue_ne : F.residueMap (q.eval b) ≠ 0 := by + rw [hq_residue] + exact (F.toDVF.residue_ne_zero_iff_isUnit (q.eval a)).2 hq_unit_a + have hq_ne : q.eval b ≠ 0 := by + intro hzero + exact hq_residue_ne (by rw [hzero, map_zero]) + have hmul : (b - a) * q.eval b = 0 := by + have hb_eval : + ((Polynomial.X - Polynomial.C a) * q).eval b = 0 := by + rw [hfactor] + exact Polynomial.IsRoot.def.mp hb + simpa [Polynomial.eval_mul, Polynomial.eval_sub] using hb_eval + have hsub : b - a = 0 := + (mul_eq_zero.mp hmul).resolve_right hq_ne + exact sub_eq_zero.mp hsub + +/-- Hensel's lemma gives a linear factor lifting from a simple approximate root. -/ +theorem exists_linear_factor_lift + (f : Polynomial F.valuationSubring) (hf : f.Monic) (a0 : F.valuationSubring) + (hroot : f.eval a0 ∈ F.maximalIdeal) + (hsimple : IsUnit (Ideal.Quotient.mk F.maximalIdeal (f.derivative.eval a0))) : + ∃ a : F.valuationSubring, ∃ q : Polynomial F.valuationSubring, + f.IsRoot a ∧ a - a0 ∈ F.maximalIdeal ∧ + f = (Polynomial.X - Polynomial.C a) * q := by + rcases F.exists_lift_root_simple f hf a0 hroot hsimple with + ⟨a, ha_root, ha_congruent⟩ + rcases (Polynomial.dvd_iff_isRoot.mpr ha_root) with ⟨q, hq⟩ + exact ⟨a, q, ha_root, ha_congruent, hq⟩ + +/-- The lifted linear factor is monic. -/ +theorem exists_monic_linear_factor_lift + (f : Polynomial F.valuationSubring) (hf : f.Monic) (a0 : F.valuationSubring) + (hroot : f.eval a0 ∈ F.maximalIdeal) + (hsimple : IsUnit (Ideal.Quotient.mk F.maximalIdeal (f.derivative.eval a0))) : + ∃ a : F.valuationSubring, ∃ q : Polynomial F.valuationSubring, + f.IsRoot a ∧ a - a0 ∈ F.maximalIdeal ∧ + (Polynomial.X - Polynomial.C a).Monic ∧ + f = (Polynomial.X - Polynomial.C a) * q := by + rcases F.exists_linear_factor_lift f hf a0 hroot hsimple with + ⟨a, q, ha_root, ha_congruent, hfactor⟩ + exact ⟨a, q, ha_root, ha_congruent, Polynomial.monic_X_sub_C a, hfactor⟩ + +/-- Hensel's lemma gives a monic linear factor whose quotient is also monic. -/ +theorem exists_monic_linear_factor_lift_with_monic_quotient + (f : Polynomial F.valuationSubring) (hf : f.Monic) (a0 : F.valuationSubring) + (hroot : f.eval a0 ∈ F.maximalIdeal) + (hsimple : IsUnit (Ideal.Quotient.mk F.maximalIdeal (f.derivative.eval a0))) : + ∃ a : F.valuationSubring, ∃ q : Polynomial F.valuationSubring, + f.IsRoot a ∧ a - a0 ∈ F.maximalIdeal ∧ + (Polynomial.X - Polynomial.C a).Monic ∧ q.Monic ∧ + f = (Polynomial.X - Polynomial.C a) * q := by + rcases F.exists_monic_linear_factor_lift f hf a0 hroot hsimple with + ⟨a, q, ha_root, ha_congruent, hlinear, hfactor⟩ + have hq : q.Monic := hlinear.of_mul_monic_left (hfactor ▸ hf) + exact ⟨a, q, ha_root, ha_congruent, hlinear, hq, hfactor⟩ + +/-- Residue-field form of the lifted monic linear factor theorem. Starting +from an actual simple root of the reduced polynomial over the residue field, +Hensel's lemma gives a root with the prescribed residue class, a monic lifted +linear factor, and a monic quotient. -/ +theorem exists_monic_linear_factor_lift_of_residue_root + (f : Polynomial F.valuationSubring) (hf : f.Monic) + (aBar : F.residueField) + (hroot : (f.map F.residueMap).eval aBar = 0) + (hsimple : (f.derivative.map F.residueMap).eval aBar ≠ 0) : + ∃ a : F.valuationSubring, ∃ q : Polynomial F.valuationSubring, + f.IsRoot a ∧ F.residueMap a = aBar ∧ + (Polynomial.X - Polynomial.C a).Monic ∧ q.Monic ∧ + f = (Polynomial.X - Polynomial.C a) * q := by + obtain ⟨a0, ha0⟩ := F.toDVF.residue_surjective aBar + have hroot_residue : F.residueMap (f.eval a0) = 0 := by + have heval : + (f.map F.residueMap).eval (F.residueMap a0) = + F.residueMap (f.eval a0) := by + exact Polynomial.eval_map_apply (f := F.residueMap) (p := f) a0 + rw [← heval, ha0] + exact hroot + have hroot_mem : f.eval a0 ∈ F.maximalIdeal := by + simpa [HenselianDVF.residueMap, DVF.residueMap] + using (IsLocalRing.residue_eq_zero_iff (f.eval a0)).1 hroot_residue + have hderivative_residue : + F.residueMap (f.derivative.eval a0) ≠ 0 := by + have heval : + (f.derivative.map F.residueMap).eval (F.residueMap a0) = + F.residueMap (f.derivative.eval a0) := by + exact Polynomial.eval_map_apply (f := F.residueMap) + (p := f.derivative) a0 + rw [← heval, ha0] + exact hsimple + have hsimple_unit : + IsUnit (Ideal.Quotient.mk F.maximalIdeal (f.derivative.eval a0)) := by + change IsUnit (F.residueMap (f.derivative.eval a0)) + exact isUnit_iff_ne_zero.mpr hderivative_residue + rcases F.exists_monic_linear_factor_lift_with_monic_quotient + f hf a0 hroot_mem hsimple_unit with + ⟨a, q, ha_root, ha_congruent, hlinear, hq, hfactor⟩ + have ha_residue : F.residueMap a = aBar := by + rw [← ha0] + exact + (residue_eq_residue_iff_sub_mem_maximalIdeal + (R := F.valuationSubring) a a0).2 ha_congruent + exact ⟨a, q, ha_root, ha_residue, hlinear, hq, hfactor⟩ + +/-- Natural reduced-polynomial form of the lifted monic linear factor theorem. +The simplicity condition is stated using the derivative of the reduced +polynomial itself. -/ +theorem exists_monic_linear_factor_lift_of_reduced_simple_root + (f : Polynomial F.valuationSubring) (hf : f.Monic) + (aBar : F.residueField) + (hroot : (f.map F.residueMap).eval aBar = 0) + (hsimple : ((f.map F.residueMap).derivative).eval aBar ≠ 0) : + ∃ a : F.valuationSubring, ∃ q : Polynomial F.valuationSubring, + f.IsRoot a ∧ F.residueMap a = aBar ∧ + (Polynomial.X - Polynomial.C a).Monic ∧ q.Monic ∧ + f = (Polynomial.X - Polynomial.C a) * q := by + exact F.exists_monic_linear_factor_lift_of_residue_root + f hf aBar hroot (by simpa [Polynomial.derivative_map] using hsimple) + +/-- Reduced-factorization compatibility for the lifted monic linear factor. +The lifted factorization reduces to the original reduced linear factor +`X - aBar`. This is the linear-factor compatibility input needed for the +later full factorization-form Hensel theorem. -/ +theorem exists_monic_linear_factor_lift_of_reduced_simple_root_with_reduction + (f : Polynomial F.valuationSubring) (hf : f.Monic) + (aBar : F.residueField) + (hroot : (f.map F.residueMap).eval aBar = 0) + (hsimple : ((f.map F.residueMap).derivative).eval aBar ≠ 0) : + ∃ a : F.valuationSubring, ∃ q : Polynomial F.valuationSubring, + f.IsRoot a ∧ F.residueMap a = aBar ∧ + (Polynomial.X - Polynomial.C a).Monic ∧ q.Monic ∧ + f = (Polynomial.X - Polynomial.C a) * q ∧ + (q.map F.residueMap).Monic ∧ + f.map F.residueMap = + (Polynomial.X - Polynomial.C aBar) * q.map F.residueMap := by + rcases F.exists_monic_linear_factor_lift_of_reduced_simple_root + f hf aBar hroot hsimple with + ⟨a, q, ha_root, ha_residue, hlinear, hq, hfactor⟩ + refine ⟨a, q, ha_root, ha_residue, hlinear, hq, hfactor, + hq.map F.residueMap, ?_⟩ + calc + f.map F.residueMap = + (((Polynomial.X - Polynomial.C a) * q).map F.residueMap) := by + rw [hfactor] + _ = (Polynomial.X - Polynomial.C (F.residueMap a)) * + q.map F.residueMap := by + simp [Polynomial.map_mul, Polynomial.map_sub] + _ = (Polynomial.X - Polynomial.C aBar) * q.map F.residueMap := by + rw [ha_residue] + +/-- A Hensel lift of a simple reduced root has a unit derivative at the lifted +root, so the lifted linear factor is coprime to the lifted quotient. + +This is the first construction-level bridge from simple-root Hensel to the +coprime factorization form: the coprimeness is proved from the actual lifted +factorization and the nonzero reduced derivative, not assumed as extra data. -/ +theorem exists_monic_linear_factor_lift_of_reduced_simple_root_with_coprime_quotient + (f : Polynomial F.valuationSubring) (hf : f.Monic) + (aBar : F.residueField) + (hroot : (f.map F.residueMap).eval aBar = 0) + (hsimple : ((f.map F.residueMap).derivative).eval aBar ≠ 0) : + ∃ a : F.valuationSubring, ∃ q : Polynomial F.valuationSubring, + f.IsRoot a ∧ F.residueMap a = aBar ∧ + (Polynomial.X - Polynomial.C a).Monic ∧ q.Monic ∧ + IsUnit (f.derivative.eval a) ∧ + IsCoprime (Polynomial.X - Polynomial.C a) q ∧ + f = (Polynomial.X - Polynomial.C a) * q ∧ + (q.map F.residueMap).Monic ∧ + f.map F.residueMap = + (Polynomial.X - Polynomial.C aBar) * q.map F.residueMap := by + rcases F.exists_monic_linear_factor_lift_of_reduced_simple_root_with_reduction + f hf aBar hroot hsimple with + ⟨a, q, ha_root, ha_residue, hlinear, hq, hfactor, hqbar, hred⟩ + have hderiv_residue : + F.residueMap (f.derivative.eval a) = + ((f.map F.residueMap).derivative).eval aBar := by + calc + F.residueMap (f.derivative.eval a) = + (f.derivative.map F.residueMap).eval (F.residueMap a) := by + exact (Polynomial.eval_map_apply (f := F.residueMap) + (p := f.derivative) a).symm + _ = (f.derivative.map F.residueMap).eval aBar := by + rw [ha_residue] + _ = ((f.map F.residueMap).derivative).eval aBar := by + rw [Polynomial.derivative_map] + have hderiv_ne : F.residueMap (f.derivative.eval a) ≠ 0 := by + rw [hderiv_residue] + exact hsimple + have hderiv_unit : IsUnit (f.derivative.eval a) := + (F.toDVF.residue_ne_zero_iff_isUnit (f.derivative.eval a)).1 hderiv_ne + have hcoprime : + IsCoprime (Polynomial.X - Polynomial.C a) q := + linearFactor_isCoprime_quotient_of_derivative_isUnit f q a hfactor hderiv_unit + exact ⟨a, q, ha_root, ha_residue, hlinear, hq, hderiv_unit, + hcoprime, hfactor, hqbar, hred⟩ + +end HenselianDVF +end DiscreteValuationField + +end + +end ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian.lean new file mode 100644 index 0000000000..fc946d71f7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian.lean @@ -0,0 +1,30 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.AlgebraicExtensionUniqueness +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.AlgebraicIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Complete +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.CoprimeFactorLifting +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.EtaleLifting +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialBounds +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialLifting +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.MonicFactorization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.NonmonicReduction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveFactorization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveReduction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.SimpleRootFactorization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.StandardEtaleLifting +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueAlgebraicExtensions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionPrimitive +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionReduction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.ValuationExtensionCriterion + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/AlgebraicExtensionUniqueness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/AlgebraicExtensionUniqueness.lean new file mode 100644 index 0000000000..d36bcfdd9e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/AlgebraicExtensionUniqueness.lean @@ -0,0 +1,58 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.AlgebraicIntegralClosure +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring +/-! +# Uniqueness over an algebraic extension of a Henselian valued field + +The integral closure is an actual valuation ring. Every extension valuation +has this ring of integers, so any two extension valuations are equivalent. +-/ + +@[expose] public section + +namespace ValuationTheory.Henselian + +variable {K L : Type*} [Field K] [Field L] [Algebra K L] [Algebra.IsAlgebraic K L] + (V : ValuationSubring K) [HenselianRing V (IsLocalRing.maximalIdeal V)] + +open _root_.DiscreteValuationField.Valuation renaming + normFormula_extension_valuationSubring_eq_integralClosure_of_mem_or_inv → + normFormula_valuationSubring_eq_integralClosure in +/-- The valuation ring of any algebraic extension valuation is the actual +integral closure of the Henselian base valuation ring. -/ +theorem valuationSubring_eq_integralClosure_of_henselianRing + {Γ : Type*} [LinearOrderedCommGroupWithZero Γ] + (w : _root_.Valuation L Γ) [V.valuation.HasExtension w] : + w.valuationSubring.toSubring = (integralClosure V L).toSubring := by + have hval : ∀ z : L, + z ∈ (integralClosure V.valuation.valuationSubring L).toSubring ∨ + z⁻¹ ∈ (integralClosure V.valuation.valuationSubring L).toSubring := by + rw [ValuationSubring.valuationSubring_valuation] + exact integralClosure_mem_or_inv_of_henselianRing (L := L) V + have h := congrArg ValuationSubring.toSubring + (normFormula_valuationSubring_eq_integralClosure + V hval w) + change w.valuationSubring.toSubring = + (integralClosure V.valuation.valuationSubring L).toSubring at h + rw [ValuationSubring.valuationSubring_valuation] at h + exact h + +/-- Extension valuations over a Henselian base have the same valuation ring. -/ +theorem valuationSubring_eq_of_henselianRing + {Γ₁ Γ₂ : Type*} [LinearOrderedCommGroupWithZero Γ₁] + [LinearOrderedCommGroupWithZero Γ₂] + (w₁ : _root_.Valuation L Γ₁) (w₂ : _root_.Valuation L Γ₂) + [V.valuation.HasExtension w₁] [V.valuation.HasExtension w₂] : + w₁.valuationSubring = w₂.valuationSubring := by + have h := (valuationSubring_eq_integralClosure_of_henselianRing V w₁).trans + (valuationSubring_eq_integralClosure_of_henselianRing V w₂).symm + exact SetLike.ext (fun z => SetLike.ext_iff.mp h z) + +end ValuationTheory.Henselian diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/AlgebraicIntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/AlgebraicIntegralClosure.lean new file mode 100644 index 0000000000..eb3adb9f5f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/AlgebraicIntegralClosure.lean @@ -0,0 +1,111 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.SimpleRootFactorization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.MonicFactorization +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +public import Mathlib.Algebra.Polynomial.Lifts +public import Mathlib.FieldTheory.IsAlgClosed.AlgebraicClosure +public import Mathlib.RingTheory.IntegralClosure.IsIntegral.Basic +/-! +# Integral closures of Henselian valuation rings + +In an algebraic extension, every element or its inverse is integral over a +Henselian valuation ring. The argument extends the valuation to an algebraic +closure, uses equality of the values of conjugate roots, and bounds the +coefficients of the minimal polynomial by the nonarchimedean Vieta bound. +No restriction on the rank or value group is imposed. +-/ + +@[expose] public section + +namespace ValuationTheory.Henselian + +private theorem minpoly_coeff_mem_of_mem_extension + {K Ω : Type*} [Field K] [Field Ω] [Algebra K Ω] [IsAlgClosure K Ω] + (V : ValuationSubring K) [HenselianRing V (IsLocalRing.maximalIdeal V)] + (B : ValuationSubring Ω) [V.valuation.HasExtension B.valuation] + (α : Ω) (hαB : α ∈ B) : + ∀ i : ℕ, (minpoly K α).coeff i ∈ V := by + have hα : IsIntegral K α := + (Algebra.IsAlgebraic.isAlgebraic (R := K) α).isIntegral + have hmonic : ((minpoly K α).map (algebraMap K Ω)).Monic := + (minpoly.monic hα).map (algebraMap K Ω) + have hsplit : ((minpoly K α).map (algebraMap K Ω)).Splits := + (IsAlgClosure.isAlgClosed K).splits ((minpoly K α).map (algebraMap K Ω)) + have hαroot : α ∈ ((minpoly K α).map (algebraMap K Ω)).roots := by + apply (Polynomial.mem_roots hmonic.ne_zero).2 + rw [Polynomial.IsRoot, Polynomial.eval_map_algebraMap] + exact minpoly.aeval K α + have hlift : DiscreteValuationField.MonicResidualCoprimeFactorLifting V := + DiscreteValuationField.monicResidualCoprimeFactorLifting_of_henselianRing V + have hroots : ∀ β ∈ ((minpoly K α).map (algebraMap K Ω)).roots, + B.valuation β ≤ 1 := by + intro β hβ + rw [hlift.irreducible_roots_same_valuation B + (minpoly.irreducible hα) hsplit hβ hαroot] + exact (B.valuation_le_one_iff α).2 hαB + intro i + apply V.mem_of_valuation_le_one + apply (Valuation.HasExtension.val_map_le_one_iff V.valuation B.valuation + ((minpoly K α).coeff i)).1 + have hbound := DiscreteValuationField.valuation_coeff_prod_X_sub_C_le_pow_card + B.valuation 1 le_rfl ((minpoly K α).map (algebraMap K Ω)).roots hroots i + rw [← hsplit.eq_prod_roots_of_monic hmonic, Polynomial.coeff_map, one_pow] at hbound + exact hbound + +private theorem isIntegral_of_mem_extension + {K Ω : Type*} [Field K] [Field Ω] [Algebra K Ω] [IsAlgClosure K Ω] + (V : ValuationSubring K) [HenselianRing V (IsLocalRing.maximalIdeal V)] + (B : ValuationSubring Ω) [V.valuation.HasExtension B.valuation] + (α : Ω) (hαB : α ∈ B) : IsIntegral V α := by + have hα : IsIntegral K α := + (Algebra.IsAlgebraic.isAlgebraic (R := K) α).isIntegral + have hcoeff : ∀ i : ℕ, (minpoly K α).coeff i ∈ V := + minpoly_coeff_mem_of_mem_extension V B α hαB + have hlifts : minpoly K α ∈ Polynomial.lifts (algebraMap V K) := by + apply (Polynomial.lifts_iff_coeff_lifts (minpoly K α)).2 + intro i + exact ⟨⟨(minpoly K α).coeff i, hcoeff i⟩, rfl⟩ + obtain ⟨f, hf⟩ := (Polynomial.mem_lifts (minpoly K α)).1 hlifts + have hfmonic : f.Monic := by + apply Polynomial.monic_of_injective (show Function.Injective (algebraMap V K) from + fun x y hxy => Subtype.ext hxy) + rw [hf] + exact minpoly.monic hα + have hfroot : Polynomial.aeval α f = 0 := by + rw [← Polynomial.aeval_map_algebraMap K α f, hf] + exact minpoly.aeval K α + exact ⟨f, hfmonic, hfroot⟩ + +/-- For every algebraic extension of a Henselian valued field, an element +or its inverse lies in the actual integral closure of the valuation ring. -/ +theorem integralClosure_mem_or_inv_of_henselianRing + {K L : Type*} [Field K] [Field L] [Algebra K L] [Algebra.IsAlgebraic K L] + (V : ValuationSubring K) [HenselianRing V (IsLocalRing.maximalIdeal V)] + (z : L) : + z ∈ (integralClosure V L).toSubring ∨ + z⁻¹ ∈ (integralClosure V L).toSubring := by + let ι : L →ₐ[K] AlgebraicClosure K := IsAlgClosed.lift + obtain ⟨B, _hB, _hlocal, _hpullback, hext⟩ := + DiscreteValuationField.Valuation.exists_extension_valuationSubring_with_hasExtension + (L := AlgebraicClosure K) V.valuation + let : V.valuation.HasExtension B.valuation := hext + rcases B.mem_or_inv_mem (ι z) with hz | hzinv + · left + change IsIntegral V z + exact (isIntegral_algHom_iff (ι.restrictScalars V) ι.injective).1 + (isIntegral_of_mem_extension V B (ι z) hz) + · right + change IsIntegral V z⁻¹ + apply (isIntegral_algHom_iff (ι.restrictScalars V) ι.injective).1 + apply isIntegral_of_mem_extension V B (ι z⁻¹) + rw [map_inv₀] + exact hzinv + +end ValuationTheory.Henselian diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Complete.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Complete.lean new file mode 100644 index 0000000000..6bbc9934bd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Complete.lean @@ -0,0 +1,80 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Complete +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +/-! +# Complete nonarchimedean absolute values are Henselian + +The localization reduction in the ramification-localization argument passes to the completion +of a rank-one nonarchimedean absolute value. the factorization form of Hensel's lemma already + supplies the +degree-controlled factorization statement for every complete +nonarchimedean absolute value. This file records the direct the primitive factorization definition +consequence used in the henselianity criterion. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- A complete nonarchimedean absolute value satisfies the factorization +form of Hensel's lemma from the primitive factorization definition. -/ +theorem henselFactorization_of_complete + {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) + (hcomplete : IsCompleteForAbsoluteValue v) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) : + ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + (absoluteValueValuationSubring v hnonarch) := by + intro f gbar hbar hprimitive hfactor hcoprime + obtain ⟨G, H, hGH, hGdegree, hGresidue, hHresidue⟩ := + henselFactorization_complete_exists_factorization + v hcomplete hnonarch hprimitive hfactor hcoprime + have hproduct : gbar * hbar ≠ 0 := by + rw [← hfactor] + exact hprimitive + have hgbar : gbar ≠ 0 := left_ne_zero_of_mul hproduct + have hhbar : hbar ≠ 0 := right_ne_zero_of_mul hproduct + have hG : G ≠ 0 := by + intro hzero + subst G + simp at hGresidue + exact hgbar hGresidue.symm + have hH : H ≠ 0 := by + intro hzero + subst H + simp at hHresidue + exact hhbar hHresidue.symm + have hdegree : + H.natDegree = f.natDegree - gbar.natDegree := by + rw [hGH, Polynomial.natDegree_mul hG hH, hGdegree, + Nat.add_sub_cancel_left] + exact ⟨G, H, hGdegree, hdegree.le, hGH, hGresidue, hHresidue⟩ + +/-- A complete nonarchimedean absolute value is Henselian in the exact sense +of the primitive factorization definition. -/ +theorem henselianValuation_of_complete + {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) + (hcomplete : IsCompleteForAbsoluteValue v) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) : + ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (absoluteValueValuationSubring + v hnonarch).valuation := by + rw [henselianValuation_iff_henselFactorization v hnonarch] + exact henselFactorization_of_complete v hcomplete hnonarch + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/CoprimeFactorLifting.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/CoprimeFactorLifting.lean new file mode 100644 index 0000000000..c87ee3de8b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/CoprimeFactorLifting.lean @@ -0,0 +1,88 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.EtaleLifting +public import Mathlib.RingTheory.Polynomial.UniversalFactorizationRing +/-! +# Coprime factor lifting from the simple-root Hensel property + +A coprime monic factorization over the residue field gives a point of the +universal coprime factorization algebra. This algebra is etale, so its residue +point lifts over a Henselian pair. The universal factors give the requested +factorization, with their degrees and prescribed reductions. +-/ + +@[expose] public section + +namespace ValuationTheory.Henselian + +open Polynomial + +variable {R : Type*} [CommRing R] {I : Ideal R} [I.IsMaximal] [HenselianRing R I] + +/-- A coprime monic factorization modulo a maximal Henselian ideal lifts to +a coprime monic factorization over the base ring with the same degrees. -/ +theorem exists_coprime_factor_lift + (f : R[X]) (gbar hbar : (R ⧸ I)[X]) + (hf : f.Monic) (hgbar : gbar.Monic) (hhbar : hbar.Monic) + (hfac : f.map (Ideal.Quotient.mk I) = gbar * hbar) + (hcop : IsCoprime gbar hbar) : + ∃ g h : R[X], g.Monic ∧ h.Monic ∧ f = g * h ∧ + g.natDegree = gbar.natDegree ∧ h.natDegree = hbar.natDegree ∧ + g.map (Ideal.Quotient.mk I) = gbar ∧ h.map (Ideal.Quotient.mk I) = hbar ∧ + IsCoprime g h := by + have : Nontrivial (R ⧸ I) := + Ideal.Quotient.nontrivial_iff.mpr (Ideal.IsMaximal.ne_top (inferInstance : I.IsMaximal)) + have hn : f.natDegree = gbar.natDegree + hbar.natDegree := by + calc + f.natDegree = (f.map (Ideal.Quotient.mk I)).natDegree := + (hf.natDegree_map (Ideal.Quotient.mk I)).symm + _ = gbar.natDegree + hbar.natDegree := by + rw [hfac, hgbar.natDegree_mul hhbar] + let p : MonicDegreeEq R f.natDegree := MonicDegreeEq.mk f hf rfl + let g₀ : MonicDegreeEq (R ⧸ I) gbar.natDegree := MonicDegreeEq.mk gbar hgbar rfl + let h₀ : MonicDegreeEq (R ⧸ I) hbar.natDegree := MonicDegreeEq.mk hbar hhbar rfl + let c : { q : MonicDegreeEq (R ⧸ I) gbar.natDegree × + MonicDegreeEq (R ⧸ I) hbar.natDegree // + q.1.1 * q.2.1 = p.1.map (algebraMap R (R ⧸ I)) ∧ IsCoprime q.1.1 q.2.1 } := + ⟨(g₀, h₀), hfac.symm, hcop⟩ + let σ : UniversalCoprimeFactorizationRing gbar.natDegree hbar.natDegree hn p →ₐ[R] + R ⧸ I := + (UniversalCoprimeFactorizationRing.homEquiv (R ⧸ I) + gbar.natDegree hbar.natDegree hn p).symm c + obtain ⟨τ, hτ⟩ := exists_etale_lift σ + let factors := UniversalCoprimeFactorizationRing.homEquiv R + gbar.natDegree hbar.natDegree hn p τ + have hres : (UniversalCoprimeFactorizationRing.homEquiv (R ⧸ I) + gbar.natDegree hbar.natDegree hn p ((Ideal.Quotient.mkₐ R I).comp τ)).1 = c.1 := by + rw [hτ] + exact congrArg Subtype.val + ((UniversalCoprimeFactorizationRing.homEquiv (R ⧸ I) + gbar.natDegree hbar.natDegree hn p).apply_symm_apply c) + have hg : factors.1.1.1.map (Ideal.Quotient.mk I) = gbar := by + have heq := UniversalCoprimeFactorizationRing.homEquiv_comp_fst R + gbar.natDegree hbar.natDegree hn p τ (Ideal.Quotient.mkₐ R I) + have hfst := congrArg (fun q => q.1.1) hres + rw [heq] at hfst + exact hfst + have hh : factors.1.2.1.map (Ideal.Quotient.mk I) = hbar := by + have heq := UniversalCoprimeFactorizationRing.homEquiv_comp_snd R + gbar.natDegree hbar.natDegree hn p τ (Ideal.Quotient.mkₐ R I) + have hsnd := congrArg (fun q => q.2.1) hres + rw [heq] at hsnd + exact hsnd + refine ⟨factors.1.1.1, factors.1.2.1, factors.1.1.monic, factors.1.2.monic, + ?_, ?_, ?_, hg, hh, factors.2.2⟩ + · simpa only [Algebra.algebraMap_self, Polynomial.map_id, p, MonicDegreeEq.mk_coe] + using factors.2.1.symm + · exact ((factors.1.1.monic.natDegree_map (Ideal.Quotient.mk I)).symm).trans + (congrArg Polynomial.natDegree hg) + · exact ((factors.1.2.monic.natDegree_map (Ideal.Quotient.mk I)).symm).trans + (congrArg Polynomial.natDegree hh) + +end ValuationTheory.Henselian diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Core.lean new file mode 100644 index 0000000000..51799c884e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Core.lean @@ -0,0 +1,161 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianFinite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianValuationExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.HenselLemma +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.AdicLimits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Assembly +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.CoefficientMinimum +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Complete +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DegreeBounds +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DivisionBounds +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.ErrorPowers +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.FiniteApproximation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.InfiniteApproximation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Iteration +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.PrincipalLimits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Step +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Truncation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.WeakLimits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialLifting +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionReduction + +/-! # Core -/ + +@[expose] public section +namespace ValuationTheory + +/-! +# Henselian discretely valued fields + +The Henselian factorization condition and the residual linear-factor lemmas used in the +residual linear-factor criterion. +-/ + +noncomputable +section + +namespace DiscreteValuationField + +universe u v + +/-- The factorization form of Hensel's lemma used in the Henselian factorization condition. + +Every primitive polynomial whose reduction is a product of coprime factors has +degree-controlled lifts with the prescribed reductions. -/ +def HenselFactorizationProperty {K : Type u} [Field K] + (V : ValuationSubring K) : Prop := + ∀ {f : Polynomial V} + {gbar hbar : Polynomial (IsLocalRing.ResidueField V)}, + f.map (IsLocalRing.residue V) ≠ 0 → + f.map (IsLocalRing.residue V) = gbar * hbar → + IsCoprime gbar hbar → + ∃ G H : Polynomial V, + G.natDegree = gbar.natDegree ∧ + H.natDegree ≤ f.natDegree - gbar.natDegree ∧ + f = G * H ∧ + G.map (IsLocalRing.residue V) = gbar ∧ + H.map (IsLocalRing.residue V) = hbar + +/-- The Henselian factorization condition: a valuation is Henselian when its valuation ring +satisfies Hensel's lemma in the factorization sense. -/ +def HenselianValuationByFactorization {K : Type u} [Field K] + {Γ : Type v} [LinearOrderedCommGroupWithZero Γ] + (val : _root_.Valuation K Γ) : Prop := + HenselFactorizationProperty val.valuationSubring + +/-- An approximate root becomes an actual root after reducing coefficients +modulo the ideal. -/ +theorem eval_map_quotient_mk_eq_zero_of_eval_mem + {S : Type*} [CommRing S] {J : Ideal S} {p : Polynomial S} {a₀ : S} + (hroot : p.eval a₀ ∈ J) : + (p.map (Ideal.Quotient.mk J)).eval (Ideal.Quotient.mk J a₀) = 0 := by + let q : S →+* S ⧸ J := Ideal.Quotient.mk J + have hq : q (p.eval a₀) = 0 := + Ideal.Quotient.eq_zero_iff_mem.mpr hroot + simpa [q, Polynomial.eval_map] using hq + +/-- Derivatives commute with coefficient reduction and evaluation at the +reduced approximate root. -/ +theorem derivative_eval_map_quotient_mk + {S : Type*} [CommRing S] (J : Ideal S) (p : Polynomial S) (a₀ : S) : + (p.map (Ideal.Quotient.mk J)).derivative.eval (Ideal.Quotient.mk J a₀) = + Ideal.Quotient.mk J (p.derivative.eval a₀) := by + simp [Polynomial.derivative_map] + +/-- The simple-root hypothesis is the derivative-unit condition for the +residual polynomial. -/ +theorem derivative_isUnit_map_quotient_mk_of_simpleRoot_mod + {S : Type*} [CommRing S] {J : Ideal S} {p : Polynomial S} {a₀ : S} + (hsimple : IsUnit (Ideal.Quotient.mk J (p.derivative.eval a₀))) : + IsUnit + ((p.map (Ideal.Quotient.mk J)).derivative.eval + (Ideal.Quotient.mk J a₀)) := by + simpa [derivative_eval_map_quotient_mk (J := J) (p := p) (a₀ := a₀)] + using hsimple + +/-- A derivative unit makes the linear factor coprime to the cofactor obtained +by monic division. -/ +theorem isCoprime_X_sub_C_divByMonic_of_derivative_isUnit + {S : Type*} [CommRing S] (p : Polynomial S) (a : S) + (hunit : IsUnit (p.derivative.eval a)) : + IsCoprime (Polynomial.X - Polynomial.C a) + (p /ₘ (Polynomial.X - Polynomial.C a)) := by + apply HenselianDVF.isCoprime_X_sub_C_of_isUnit_eval + simpa only [divByMonic_X_sub_C_eval_eq_derivative_eval] using hunit + +/-- A residual approximate root supplies an actual linear factor after +coefficient reduction. -/ +theorem residual_X_sub_C_mul_divByMonic_eq_map_of_eval_mem + {S : Type*} [CommRing S] {J : Ideal S} {p : Polynomial S} {a₀ : S} + (hroot : p.eval a₀ ∈ J) : + (Polynomial.X - Polynomial.C (Ideal.Quotient.mk J a₀)) * + ((p.map (Ideal.Quotient.mk J)) /ₘ + (Polynomial.X - Polynomial.C (Ideal.Quotient.mk J a₀))) = + p.map (Ideal.Quotient.mk J) := by + rw [Polynomial.mul_divByMonic_eq_iff_isRoot] + exact eval_map_quotient_mk_eq_zero_of_eval_mem hroot + +/-- A residual simple root splits the residual polynomial into coprime linear +and complementary factors. -/ +theorem isCoprime_residual_X_sub_C_divByMonic_of_simpleRoot_mod + {S : Type*} [CommRing S] {J : Ideal S} {p : Polynomial S} {a₀ : S} + (hsimple : IsUnit (Ideal.Quotient.mk J (p.derivative.eval a₀))) : + IsCoprime + (Polynomial.X - Polynomial.C (Ideal.Quotient.mk J a₀)) + ((p.map (Ideal.Quotient.mk J)) /ₘ + (Polynomial.X - Polynomial.C (Ideal.Quotient.mk J a₀))) := + isCoprime_X_sub_C_divByMonic_of_derivative_isUnit + (p := p.map (Ideal.Quotient.mk J)) + (a := Ideal.Quotient.mk J a₀) + (derivative_isUnit_map_quotient_mk_of_simpleRoot_mod hsimple) + +/-- Finite algebras over a Noetherian Henselian, precomplete base are +Henselian along the extended ideal. -/ +theorem henselianRing_map_algebraMap_of_moduleFinite_of_base_isPrecomplete + {R : Type u} {S : Type v} [CommRing R] [CommRing S] [Algebra R S] + {I : Ideal R} [IsNoetherianRing R] [Module.Finite R S] + [HenselianRing R I] [IsPrecomplete I R] : + HenselianRing S (I.map (algebraMap R S)) := by + have hHausdorff : IsHausdorff I R := + IsHausdorff.of_le_jacobson + (R := R) (M := R) (I := I) + (show I ≤ Ideal.jacobson (⊥ : Ideal R) from HenselianRing.jac) + let : IsAdicComplete I R := + { toIsHausdorff := hHausdorff + toIsPrecomplete := inferInstance } + exact henselianRing_map_algebraMap_of_moduleFinite_of_isAdicComplete + (R := R) (S := S) (I := I) + +end DiscreteValuationField + +end + +end ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/EtaleLifting.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/EtaleLifting.lean new file mode 100644 index 0000000000..adea07a9a0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/EtaleLifting.lean @@ -0,0 +1,47 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.StandardEtaleLifting +public import Mathlib.RingTheory.Unramified.LocalStructure +/-! +# Lifting residue points of etale algebras + +At the kernel of a residue point, an etale algebra has a standard etale +localization. The Henselian root lift on that localization restricts to +the requested lift on the original algebra. +-/ + +@[expose] public section + +namespace ValuationTheory.Henselian + +variable {R S : Type*} [CommRing R] [CommRing S] [Algebra R S] + {I : Ideal R} [I.IsMaximal] [HenselianRing R I] [Algebra.Etale R S] + +/-- A residue point of an etale algebra over a Henselian local pair lifts +to an actual point over the base ring. -/ +theorem exists_etale_lift (σ : S →ₐ[R] R ⧸ I) : + ∃ τ : S →ₐ[R] R, (Ideal.Quotient.mkₐ R I).comp τ = σ := by + let : Field (R ⧸ I) := Ideal.Quotient.field I + let Q : Ideal S := RingHom.ker σ.toRingHom + have : Q.IsPrime := RingHom.ker_isPrime σ.toRingHom + obtain ⟨s, hs, hstandard⟩ := Algebra.IsEtaleAt.exists_isStandardEtale (R := R) Q + have : Algebra.IsStandardEtale R (Localization.Away s) := hstandard + have hsunit : IsUnit (σ s) := isUnit_iff_ne_zero.mpr (show σ s ≠ 0 from hs) + let σloc : Localization.Away s →ₐ[R] R ⧸ I := + IsLocalization.Away.liftAlgHom (f := σ) s hsunit + obtain ⟨τloc, hτloc⟩ := exists_isStandardEtale_lift σloc + refine ⟨τloc.comp (IsScalarTower.toAlgHom R S (Localization.Away s)), ?_⟩ + apply AlgHom.ext + intro x + have hx := congrArg (fun f : Localization.Away s →ₐ[R] R ⧸ I => + f (algebraMap S (Localization.Away s) x)) hτloc + change Ideal.Quotient.mk I (τloc (algebraMap S (Localization.Away s) x)) = σ x + exact hx.trans (IsLocalization.Away.lift_eq s hsunit x) + +end ValuationTheory.Henselian diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization.lean new file mode 100644 index 0000000000..2352c59087 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization.lean @@ -0,0 +1,26 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.AdicLimits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Assembly +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.CoefficientMinimum +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Complete +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DegreeBounds +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DivisionBounds +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.ErrorPowers +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.FiniteApproximation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.InfiniteApproximation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Iteration +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.PrincipalLimits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Step +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Truncation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.WeakLimits + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/AdicLimits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/AdicLimits.lean new file mode 100644 index 0000000000..a5a006da84 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/AdicLimits.lean @@ -0,0 +1,283 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic +public import Mathlib.RingTheory.AdicCompletion.Basic +/-! +# coefficientwise limit preparation + +This file records the coefficientwise Cauchy form of the infinite Hensel +approximants. It is the input needed for the adic-completeness step in +the coefficientwise proof of Hensel's lemma. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial +open scoped BigOperators + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- the directed adic Cauchy estimate for a coefficient +sequence: later differences from stage `M` lie in `I^(M+1)`. -/ +def henselFactorizationAdicCoeffCauchy + {R : Type*} [CommRing R] (I : Ideal R) (x : ℕ → R) : Prop := + ∀ {M N : ℕ}, M ≤ N → x N - x M ∈ I ^ (M + 1) + +/-- A coefficientwise Cauchy estimate for a polynomial sequence gives an +adic Cauchy estimate for each fixed coefficient. -/ +theorem henselFactorization_coeff_adicCoeffCauchy_of_sub_coeff_mem + {R : Type*} [CommRing R] (I : Ideal R) {Pseq : ℕ → R[X]} + (hsub : + ∀ {M N : ℕ}, M ≤ N → ∀ i : ℕ, + (Pseq N - Pseq M).coeff i ∈ I ^ (M + 1)) + (i : ℕ) : + henselFactorizationAdicCoeffCauchy I (fun N : ℕ => (Pseq N).coeff i) := by + intro M N hMN + simpa [henselFactorizationAdicCoeffCauchy, Polynomial.coeff_sub] using hsub hMN i + +/-- the coefficientwise `I^(M+1)` estimate gives mathlib's +`I`-adic Cauchy condition after weakening `I^(M+1) ≤ I^M`. -/ +theorem henselFactorization_adicCoeffCauchy_isAdicCauchy + {R : Type*} [CommRing R] (I : Ideal R) {x : ℕ → R} + (hx : henselFactorizationAdicCoeffCauchy I x) : + AdicCompletion.IsAdicCauchy I R x := by + intro M N hMN + apply SModEq.sub_mem.mpr + have hdeep : x N - x M ∈ I ^ M := + Ideal.pow_le_pow_right (Nat.le_succ M) (hx hMN) + have hsign : x M - x N ∈ I ^ M := by + simpa [neg_sub] using (I ^ M).neg_mem hdeep + simpa [smul_eq_mul, Ideal.mul_top] using hsign + +/-- precompleteness supplies a coefficient limit for every +coefficient sequence satisfying the directed estimate. -/ +theorem henselFactorization_exists_adicCoeffLimit + {R : Type*} [CommRing R] (I : Ideal R) [IsPrecomplete I R] + {x : ℕ → R} + (hx : henselFactorizationAdicCoeffCauchy I x) : + ∃ L : R, ∀ n : ℕ, x n - L ∈ I ^ n := by + obtain ⟨L, hL⟩ := + IsPrecomplete.prec (show IsPrecomplete I R from inferInstance) + (henselFactorization_adicCoeffCauchy_isAdicCauchy I hx) + refine ⟨L, fun n => ?_⟩ + have hmem := SModEq.sub_mem.mp (hL n) + simpa [smul_eq_mul, Ideal.mul_top] using hmem + +/-- assemble finitely many coefficient limits into the +polynomial supported in degrees at most `N`. -/ +def henselFactorizationPolyOfLimitCoeffs + {R : Type*} [Semiring R] (N : ℕ) (c : ℕ → R) : R[X] := + Finset.sum (Finset.range (N + 1)) fun i => Polynomial.monomial i (c i) + +/-- coefficients of the finite polynomial assembled from +coefficient limits, inside the cutoff. -/ +theorem henselFactorization_polyOfLimitCoeffs_coeff_of_le + {R : Type*} [Semiring R] {N n : ℕ} (c : ℕ → R) (hn : n ≤ N) : + (henselFactorizationPolyOfLimitCoeffs N c).coeff n = c n := by + classical + unfold henselFactorizationPolyOfLimitCoeffs + rw [Polynomial.finsetSum_coeff] + rw [Finset.sum_eq_single n] + · simp + · intro b _hb hbn + simp [Polynomial.coeff_monomial, hbn] + · intro hnot + exact False.elim (hnot (Finset.mem_range.mpr (Nat.lt_succ_of_le hn))) + +/-- coefficients of the finite polynomial assembled from +coefficient limits vanish above the cutoff. -/ +theorem henselFactorization_polyOfLimitCoeffs_coeff_eq_zero_of_lt + {R : Type*} [Semiring R] {N n : ℕ} (c : ℕ → R) (hn : N < n) : + (henselFactorizationPolyOfLimitCoeffs N c).coeff n = 0 := by + classical + unfold henselFactorizationPolyOfLimitCoeffs + rw [Polynomial.finsetSum_coeff] + refine Finset.sum_eq_zero ?_ + intro b hb + have hbn : b ≠ n := by + intro hbn + have hn_le : n ≤ N := Nat.lt_succ_iff.mp (by simpa [hbn] using hb) + exact (Nat.not_lt_of_ge hn_le) hn + simp [Polynomial.coeff_monomial, hbn] + +/-- the polynomial assembled from finitely many coefficient +limits has the stated degree bound. -/ +theorem henselFactorization_polyOfLimitCoeffs_natDegree_le + {R : Type*} [Semiring R] (N : ℕ) (c : ℕ → R) : + (henselFactorizationPolyOfLimitCoeffs N c).natDegree ≤ N := by + rw [Polynomial.natDegree_le_iff_coeff_eq_zero] + intro n hn + exact henselFactorization_polyOfLimitCoeffs_coeff_eq_zero_of_lt (c := c) hn + +/-- bounded polynomial approximants with coefficientwise +adic limits have a bounded polynomial limit. -/ +theorem henselFactorization_exists_limitPolynomial_of_bounded_coeffLimits + {R : Type*} [CommRing R] (I : Ideal R) [IsPrecomplete I R] + {N : ℕ} {Pseq : ℕ → R[X]} + (hdeg : ∀ n : ℕ, (Pseq n).natDegree ≤ N) + (hcauchy : + ∀ i : ℕ, henselFactorizationAdicCoeffCauchy I + (fun n : ℕ => (Pseq n).coeff i)) : + ∃ P : R[X], P.natDegree ≤ N ∧ + ∀ n i : ℕ, (Pseq n - P).coeff i ∈ I ^ n := by + classical + let L : ℕ → R := + fun i => + Classical.choose + (henselFactorization_exists_adicCoeffLimit (I := I) (hcauchy i)) + let P : R[X] := henselFactorizationPolyOfLimitCoeffs N L + refine ⟨P, henselFactorization_polyOfLimitCoeffs_natDegree_le N L, ?_⟩ + intro n i + by_cases hi : i ≤ N + · have hlim := + Classical.choose_spec + (henselFactorization_exists_adicCoeffLimit (I := I) (hcauchy i)) n + simpa [P, L, Polynomial.coeff_sub, + henselFactorization_polyOfLimitCoeffs_coeff_of_le (c := L) hi] using hlim + · have hlt : N < i := Nat.lt_of_not_ge hi + have hseq : (Pseq n).coeff i = 0 := + Polynomial.coeff_eq_zero_of_natDegree_lt + (lt_of_le_of_lt (hdeg n) hlt) + have hP : P.coeff i = 0 := + henselFactorization_polyOfLimitCoeffs_coeff_eq_zero_of_lt (c := L) hlt + simp [Polynomial.coeff_sub, hseq, hP] + +/-- if all coefficients of the left factor lie in an ideal, +then all coefficients of its product with any polynomial lie in the same +ideal. -/ +theorem henselFactorization_mul_left_coeff_mem_ideal + {R : Type*} [CommRing R] (I : Ideal R) {A B : R[X]} + (hA : ∀ i : ℕ, A.coeff i ∈ I) : + ∀ i : ℕ, (A * B).coeff i ∈ I := by + intro i + rw [Polynomial.coeff_mul] + exact I.sum_mem fun p _hp => I.mul_mem_right _ (hA p.1) + +/-- if all coefficients of the right factor lie in an ideal, +then all coefficients of its product with any polynomial lie in the same +ideal. -/ +theorem henselFactorization_mul_right_coeff_mem_ideal + {R : Type*} [CommRing R] (I : Ideal R) {A B : R[X]} + (hB : ∀ i : ℕ, B.coeff i ∈ I) : + ∀ i : ℕ, (A * B).coeff i ∈ I := by + intro i + rw [Polynomial.coeff_mul] + exact I.sum_mem fun p _hp => I.mul_mem_left _ (hB p.2) + +/-- coefficientwise convergence is preserved by multiplying +two polynomial approximants. -/ +theorem henselFactorization_mul_sub_mul_coeff_mem_of_coeff_mem + {R : Type*} [CommRing R] (I : Ideal R) {A A' B B' : R[X]} + (hA : ∀ i : ℕ, (A - A').coeff i ∈ I) + (hB : ∀ i : ℕ, (B - B').coeff i ∈ I) : + ∀ i : ℕ, (A * B - A' * B').coeff i ∈ I := by + have hdecomp : A * B - A' * B' = (A - A') * B + A' * (B - B') := by + ring + intro i + rw [hdecomp, Polynomial.coeff_add] + exact I.add_mem + (henselFactorization_mul_left_coeff_mem_ideal (I := I) hA i) + (henselFactorization_mul_right_coeff_mem_ideal (I := I) hB i) + +/-- combine the product convergence with the residual error +estimate at one adic level. -/ +theorem henselFactorization_limit_factor_coeff_mem_of_approximants + {R : Type*} [CommRing R] (I : Ideal R) + {f G H Gn Hn : R[X]} + (herr : ∀ i : ℕ, (f - Gn * Hn).coeff i ∈ I) + (hG : ∀ i : ℕ, (Gn - G).coeff i ∈ I) + (hH : ∀ i : ℕ, (Hn - H).coeff i ∈ I) : + ∀ i : ℕ, (f - G * H).coeff i ∈ I := by + have hdecomp : f - G * H = (f - Gn * Hn) + (Gn * Hn - G * H) := by + ring + intro i + rw [hdecomp, Polynomial.coeff_add] + exact I.add_mem (herr i) + (henselFactorization_mul_sub_mul_coeff_mem_of_coeff_mem + (I := I) hG hH i) + +/-- a polynomial whose coefficients lie in every adic power is +zero in a Hausdorff coefficient ring. -/ +theorem henselFactorization_polynomial_eq_zero_of_coeff_mem_all_powers + {R : Type*} [CommRing R] (I : Ideal R) [IsHausdorff I R] + {P : R[X]} + (hP : ∀ n i : ℕ, P.coeff i ∈ I ^ n) : + P = 0 := by + ext i + apply IsHausdorff.haus (show IsHausdorff I R from inferInstance) + intro n + have hmem : P.coeff i - 0 ∈ I ^ n := by + simpa using hP n i + simpa [SModEq.sub_mem, smul_eq_mul, Ideal.mul_top] using hmem + +/-- if the approximating factorization and both factors +converge coefficientwise at every adic level, then the limiting polynomials +factor `f`. -/ +theorem henselFactorization_limit_factor_eq_of_approximants + {R : Type*} [CommRing R] (I : Ideal R) [IsHausdorff I R] + {f G H : R[X]} {Gseq Hseq : ℕ → R[X]} + (herr : ∀ n i : ℕ, (f - Gseq n * Hseq n).coeff i ∈ I ^ n) + (hG : ∀ n i : ℕ, (Gseq n - G).coeff i ∈ I ^ n) + (hH : ∀ n i : ℕ, (Hseq n - H).coeff i ∈ I ^ n) : + f = G * H := by + have hzero : f - G * H = 0 := by + apply henselFactorization_polynomial_eq_zero_of_coeff_mem_all_powers (I := I) + intro n i + exact henselFactorization_limit_factor_coeff_mem_of_approximants + (I := I ^ n) (herr n) (hG n) (hH n) i + exact sub_eq_zero.mp hzero + +/-- the limit of approximants preserving a fixed residual +class preserves that residual class. Only the first adic level is needed. -/ +theorem henselFactorization_limit_reduction_of_approx_reduction + {R : Type*} [CommRing R] (I : Ideal R) + {P P0 : R[X]} {Pseq : ℕ → R[X]} + (hlim : ∀ n i : ℕ, (Pseq n - P).coeff i ∈ I ^ n) + (hred : ∀ n i : ℕ, (Pseq n - P0).coeff i ∈ I) : + ∀ i : ℕ, (P - P0).coeff i ∈ I := by + intro i + have hlim1 : (Pseq 1 - P).coeff i ∈ I := by + simpa using hlim 1 i + have hred1 : (Pseq 1 - P0).coeff i ∈ I := hred 1 i + have hdecomp : P - P0 = -(Pseq 1 - P) + (Pseq 1 - P0) := by + ring + rw [hdecomp, Polynomial.coeff_add, Polynomial.coeff_neg] + exact I.add_mem (I.neg_mem hlim1) hred1 + +/-- coefficientwise membership in a ring-hom kernel gives +equality after mapping coefficients. -/ +theorem henselFactorization_map_eq_of_sub_coeff_mem_ker + {R k : Type*} [CommRing R] [CommRing k] (φ : R →+* k) + {P Q : R[X]} + (hcoeff : ∀ i : ℕ, (P - Q).coeff i ∈ RingHom.ker φ) : + P.map φ = Q.map φ := by + have hzero : (P - Q).map φ = 0 := + (henselFactorization_map_eq_zero_iff_coeff_mem_ker φ (P - Q)).2 hcoeff + rw [Polynomial.map_sub] at hzero + exact sub_eq_zero.mp hzero + +/-- coefficientwise maximal-ideal congruence is exactly +equality after mapping to the residue field. -/ +theorem henselFactorization_residue_map_eq_of_sub_coeff_mem_maximalIdeal + {R : Type*} [CommRing R] [IsLocalRing R] {P Q : R[X]} + (hcoeff : ∀ i : ℕ, (P - Q).coeff i ∈ IsLocalRing.maximalIdeal R) : + P.map (IsLocalRing.residue R) = Q.map (IsLocalRing.residue R) := by + apply henselFactorization_map_eq_of_sub_coeff_mem_ker + intro i + have hi := hcoeff i + rwa [IsLocalRing.ker_residue] + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Assembly.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Assembly.lean new file mode 100644 index 0000000000..f8037e7711 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Assembly.lean @@ -0,0 +1,280 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.CoefficientMinimum +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.WeakLimits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.PrincipalLimits +/-! +# explicit valuation-ring Hensel statement + +This file connects the chosen finite-minimum coefficient to +the displayed-factor complete-limit theorem. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- complete-limit factorization from coprime residual factors +and chosen lifts over a valuation ring. The element `π` is chosen from the +finite set of coefficients of the two initial error polynomials, as in the +proof. -/ +theorem henselFactorization_exists_limit_factorization_of_coprime_lifts_valuationRing + {R : Type*} [CommRing R] [Nontrivial R] [PreValuationRing R] + [NoZeroDivisors R] + [IsPrecomplete (IsLocalRing.maximalIdeal R) R] + [IsHausdorff (IsLocalRing.maximalIdeal R) R] + {f g0 h0 : R[X]} + {gbar hbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hfbar : f.map (IsLocalRing.residue R) = gbar * hbar) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hh0map : h0.map (IsLocalRing.residue R) = hbar) + (hcop : IsCoprime gbar hbar) + (hf : f.natDegree ≤ d) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hmd : m ≤ d) : + ∃ G H : R[X], + G.natDegree ≤ m ∧ H.natDegree ≤ d - m ∧ f = G * H ∧ + G.map (IsLocalRing.residue R) = gbar ∧ + H.map (IsLocalRing.residue R) = hbar := by + classical + rcases henselFactorization_exists_bezout_lifts + (IsLocalRing.residue R) IsLocalRing.residue_surjective + hcop hg0map hh0map with + ⟨a, b, hbez⟩ + let S := henselFactorizationTwoPolynomialCoeffFinset + (f - g0 * h0) (a * g0 + b * h0 - 1) + by_cases hs : S.Nonempty + · rcases henselFactorization_exists_pi_factor_initial_errors_of_residue_lifts_of_nonempty + (R := R) (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) + (gbar := gbar) (hbar := hbar) + hfbar hg0map hh0map hbez (by simpa [S] using hs) with + ⟨π, hπmem, hπcoeff, ⟨f1, hfactor0⟩, ⟨e, hbezFactor⟩⟩ + have hπne : π ≠ 0 := + henselFactorization_ne_zero_of_mem_twoPolynomialCoeffFinset hπcoeff + exact henselFactorization_exists_limit_factorization_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (hbar := hbar) (m := m) (d := d) + hf hg0map hh0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd + · have hSempty : + henselFactorizationTwoPolynomialCoeffFinset + (f - g0 * h0) (a * g0 + b * h0 - 1) = ∅ := by + apply Finset.eq_empty_iff_forall_notMem.mpr + intro x hx + exact hs ⟨x, by simpa [S] using hx⟩ + have hzeros := + henselFactorization_twoPolynomialCoeffFinset_empty_iff.mp hSempty + rcases hzeros with ⟨hfactor0, _hbez0⟩ + refine ⟨g0, h0, ?_, hh0deg, ?_, hg0map, hh0map⟩ + · simp [hg0nat] + · exact sub_eq_zero.mp hfactor0 + +/-- complete-limit factorization from coprime residual factors +and chosen lifts over a valuation ring, using the principal filtration +generated by the finite-minimum element `π`. -/ +theorem henselFactorization_exists_limit_factorization_of_coprime_lifts_valuationRing_principal + {R : Type*} [CommRing R] [Nontrivial R] [PreValuationRing R] + [NoZeroDivisors R] + (hpre : ∀ π : R, π ≠ 0 → π ∈ IsLocalRing.maximalIdeal R → + IsPrecomplete (Ideal.span ({π} : Set R)) R) + (hhaus : ∀ π : R, π ≠ 0 → π ∈ IsLocalRing.maximalIdeal R → + IsHausdorff (Ideal.span ({π} : Set R)) R) + {f g0 h0 : R[X]} + {gbar hbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hfbar : f.map (IsLocalRing.residue R) = gbar * hbar) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hh0map : h0.map (IsLocalRing.residue R) = hbar) + (hcop : IsCoprime gbar hbar) + (hf : f.natDegree ≤ d) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hmd : m ≤ d) : + ∃ G H : R[X], + G.natDegree ≤ m ∧ H.natDegree ≤ d - m ∧ f = G * H ∧ + G.map (IsLocalRing.residue R) = gbar ∧ + H.map (IsLocalRing.residue R) = hbar := by + classical + rcases henselFactorization_exists_bezout_lifts + (IsLocalRing.residue R) IsLocalRing.residue_surjective + hcop hg0map hh0map with + ⟨a, b, hbez⟩ + let S := henselFactorizationTwoPolynomialCoeffFinset + (f - g0 * h0) (a * g0 + b * h0 - 1) + by_cases hs : S.Nonempty + · rcases henselFactorization_exists_pi_factor_initial_errors_of_residue_lifts_of_nonempty + (R := R) (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) + (gbar := gbar) (hbar := hbar) + hfbar hg0map hh0map hbez (by simpa [S] using hs) with + ⟨π, hπmem, hπcoeff, ⟨f1, hfactor0⟩, ⟨e, hbezFactor⟩⟩ + have hπne : π ≠ 0 := + henselFactorization_ne_zero_of_mem_twoPolynomialCoeffFinset hπcoeff + let : IsPrecomplete (Ideal.span ({π} : Set R)) R := + hpre π hπne hπmem + let : IsHausdorff (Ideal.span ({π} : Set R)) R := + hhaus π hπne hπmem + exact henselFactorization_exists_limit_factorization_of_mem_span_principal + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (hbar := hbar) (m := m) (d := d) + hf hg0map hh0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd + · have hSempty : + henselFactorizationTwoPolynomialCoeffFinset + (f - g0 * h0) (a * g0 + b * h0 - 1) = ∅ := by + apply Finset.eq_empty_iff_forall_notMem.mpr + intro x hx + exact hs ⟨x, by simpa [S] using hx⟩ + have hzeros := + henselFactorization_twoPolynomialCoeffFinset_empty_iff.mp hSempty + rcases hzeros with ⟨hfactor0, _hbez0⟩ + refine ⟨g0, h0, ?_, hh0deg, ?_, hg0map, hh0map⟩ + · simp [hg0nat] + · exact sub_eq_zero.mp hfactor0 + +/-- Degree-controlled polynomial lifts of a nonzero residual +factorization. This is the algebraic preparation shared by the maximal-ideal +and principal-adic forms of Hensel's lemma. -/ +theorem henselFactorization_exists_degreeControlledLifts_of_residual_factorization + {R : Type*} [CommRing R] [IsLocalRing R] + {f : R[X]} {gbar hbar : (IsLocalRing.ResidueField R)[X]} + (hprim : f.map (IsLocalRing.residue R) ≠ 0) + (hfbar : f.map (IsLocalRing.residue R) = gbar * hbar) : + ∃ g0 h0 : R[X], + g0.map (IsLocalRing.residue R) = gbar ∧ + h0.map (IsLocalRing.residue R) = hbar ∧ + g0.natDegree = gbar.natDegree ∧ + h0.natDegree ≤ f.natDegree - gbar.natDegree ∧ + gbar.natDegree ≤ f.natDegree ∧ + gbar.leadingCoeff ≠ 0 := by + have hfmap : + (f.map (IsLocalRing.residue R)).natDegree ≤ f.natDegree := + henselFactorization_map_natDegree_le_of_natDegree_le + (IsLocalRing.residue R) le_rfl + have hgbar_ne : gbar ≠ 0 := by + intro hgbar + apply hprim + rw [hfbar, hgbar, zero_mul] + have hhbar_ne : hbar ≠ 0 := by + intro hhbar + apply hprim + rw [hfbar, hhbar, mul_zero] + have hglead : gbar.leadingCoeff ≠ 0 := + Polynomial.leadingCoeff_ne_zero.mpr hgbar_ne + have hprod_degree : + (gbar * hbar).natDegree ≤ f.natDegree := by + simpa [hfbar] using hfmap + have hsum : + gbar.natDegree + hbar.natDegree ≤ f.natDegree := by + simpa [Polynomial.natDegree_mul hgbar_ne hhbar_ne] using hprod_degree + have hmd : gbar.natDegree ≤ f.natDegree := + (Nat.le_add_right gbar.natDegree hbar.natDegree).trans hsum + have hhbar_deg : + hbar.natDegree ≤ f.natDegree - gbar.natDegree := + henselFactorization_residual_right_natDegree_le + (fbar := f.map (IsLocalRing.residue R)) + (gbar := gbar) (hbar := hbar) + (m := gbar.natDegree) (d := f.natDegree) + hfbar hfmap rfl hglead + rcases henselFactorization_exists_polynomial_lift_natDegree_eq + (IsLocalRing.residue R) IsLocalRing.residue_surjective gbar with + ⟨g0, hg0map, hg0nat⟩ + rcases henselFactorization_exists_polynomial_lift_natDegree_eq + (IsLocalRing.residue R) IsLocalRing.residue_surjective hbar with + ⟨h0, hh0map, hh0nat⟩ + refine ⟨g0, h0, hg0map, hh0map, hg0nat, ?_, hmd, hglead⟩ + simpa [hh0nat] using hhbar_deg + +/-- explicit residual-factor form of Hensel's lemma for a +complete separated valuation ring. -/ +theorem henselFactorization_exists_limit_factorization_of_residual_factors_valuationRing + {R : Type*} [CommRing R] [Nontrivial R] [PreValuationRing R] + [NoZeroDivisors R] + [IsPrecomplete (IsLocalRing.maximalIdeal R) R] + [IsHausdorff (IsLocalRing.maximalIdeal R) R] + {f : R[X]} + {gbar hbar : (IsLocalRing.ResidueField R)[X]} + (hprim : f.map (IsLocalRing.residue R) ≠ 0) + (hfbar : f.map (IsLocalRing.residue R) = gbar * hbar) + (hcop : IsCoprime gbar hbar) : + ∃ G H : R[X], + G.natDegree = gbar.natDegree ∧ + H.natDegree ≤ f.natDegree - gbar.natDegree ∧ + f = G * H ∧ + G.map (IsLocalRing.residue R) = gbar ∧ + H.map (IsLocalRing.residue R) = hbar := by + rcases henselFactorization_exists_degreeControlledLifts_of_residual_factorization + hprim hfbar with + ⟨g0, h0, hg0map, hh0map, hg0nat, hh0deg, hmd, hglead⟩ + rcases henselFactorization_exists_limit_factorization_of_coprime_lifts_valuationRing + (f := f) (g0 := g0) (h0 := h0) + (gbar := gbar) (hbar := hbar) + (m := gbar.natDegree) (d := f.natDegree) + hfbar hg0map hh0map hcop le_rfl hg0nat rfl hglead hh0deg hmd with + ⟨G, H, hGle, hHle, hfactor, hGmap, hHmap⟩ + have hGdegree : G.natDegree = gbar.natDegree := + henselFactorization_natDegree_eq_of_residue_eq_of_le + (R := R) (P := G) (gbar := gbar) (m := gbar.natDegree) + hGle hGmap rfl hglead + exact ⟨G, H, hGdegree, hHle, hfactor, hGmap, hHmap⟩ + +/-- explicit residual-factor form using the principal +filtration generated by the finite-minimum element chosen in the proof. -/ +theorem henselFactorization_exists_limit_factorization_of_residual_factors_valuationRing_principal + {R : Type*} [CommRing R] [Nontrivial R] [PreValuationRing R] + [NoZeroDivisors R] + (hpre : ∀ π : R, π ≠ 0 → π ∈ IsLocalRing.maximalIdeal R → + IsPrecomplete (Ideal.span ({π} : Set R)) R) + (hhaus : ∀ π : R, π ≠ 0 → π ∈ IsLocalRing.maximalIdeal R → + IsHausdorff (Ideal.span ({π} : Set R)) R) + {f : R[X]} + {gbar hbar : (IsLocalRing.ResidueField R)[X]} + (hprim : f.map (IsLocalRing.residue R) ≠ 0) + (hfbar : f.map (IsLocalRing.residue R) = gbar * hbar) + (hcop : IsCoprime gbar hbar) : + ∃ G H : R[X], + G.natDegree = gbar.natDegree ∧ + H.natDegree ≤ f.natDegree - gbar.natDegree ∧ + f = G * H ∧ + G.map (IsLocalRing.residue R) = gbar ∧ + H.map (IsLocalRing.residue R) = hbar := by + rcases henselFactorization_exists_degreeControlledLifts_of_residual_factorization + hprim hfbar with + ⟨g0, h0, hg0map, hh0map, hg0nat, hh0deg, hmd, hglead⟩ + rcases + henselFactorization_exists_limit_factorization_of_coprime_lifts_valuationRing_principal + (R := R) hpre hhaus + (f := f) (g0 := g0) (h0 := h0) + (gbar := gbar) (hbar := hbar) + (m := gbar.natDegree) (d := f.natDegree) + hfbar hg0map hh0map hcop le_rfl hg0nat rfl hglead hh0deg hmd with + ⟨G, H, hGle, hHle, hfactor, hGmap, hHmap⟩ + have hGdegree : G.natDegree = gbar.natDegree := + henselFactorization_natDegree_eq_of_residue_eq_of_le + (R := R) (P := G) (gbar := gbar) (m := gbar.natDegree) + hGle hGmap rfl hglead + exact ⟨G, H, hGdegree, hHle, hfactor, hGmap, hHmap⟩ + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Basic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Basic.lean new file mode 100644 index 0000000000..a630b0d673 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Basic.lean @@ -0,0 +1,458 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Polynomial.Div +public import Mathlib.Algebra.Polynomial.Lifts +public import Mathlib.RingTheory.LocalRing.ResidueField.Basic +/-! +# algebraic input for Hensel's lemma + +This file records the residue-polynomial data used at the start of the +proof of Hensel's lemma. The analytic convergence step is kept separate; the +lemmas here are the initial lifts and congruences. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- Polynomial coefficient maps distribute over the Bezout expression used in +the Hensel input. -/ +theorem henselFactorization_map_mul_add_mul + {R k : Type*} [CommSemiring R] [CommSemiring k] (φ : R →+* k) + (a b g h : R[X]) : + (a * g + b * h).map φ = a.map φ * g.map φ + b.map φ * h.map φ := by + simp [Polynomial.map_add, Polynomial.map_mul] + +/-- Polynomial coefficient maps distribute over `f - g*h`, the first Hensel +congruence expression. -/ +theorem henselFactorization_map_sub_mul + {R k : Type*} [CommRing R] [CommRing k] (φ : R →+* k) + (f g h : R[X]) : + (f - g * h).map φ = f.map φ - g.map φ * h.map φ := by + simp [Polynomial.map_sub, Polynomial.map_mul] + +/-- Polynomial coefficient maps distribute over `P*F - F`, the normalized +Bezout-error expression in the Hensel correction congruence. -/ +theorem henselFactorization_map_mul_sub_self + {R k : Type*} [CommRing R] [CommRing k] (φ : R →+* k) + (P F : R[X]) : + (P * F - F).map φ = P.map φ * F.map φ - F.map φ := by + simp [Polynomial.map_sub, Polynomial.map_mul] + +/-- Polynomial coefficient maps distribute over `g*q - A`, the product +congruence used to bound the high coefficients of the quotient. -/ +theorem henselFactorization_map_mul_sub + {R k : Type*} [CommRing R] [CommRing k] (φ : R →+* k) + (g q A : R[X]) : + (g * q - A).map φ = g.map φ * q.map φ - A.map φ := by + simp [Polynomial.map_sub, Polynomial.map_mul] + +/-- Polynomial coefficient maps distribute over the Hensel correction expression +`g*q + h*p - fn`. -/ +theorem henselFactorization_map_mul_add_mul_sub + {R k : Type*} [CommRing R] [CommRing k] (φ : R →+* k) + (g h q p fn : R[X]) : + (g * q + h * p - fn).map φ = + g.map φ * q.map φ + h.map φ * p.map φ - fn.map φ := by + simp [Polynomial.map_sub, Polynomial.map_add, Polynomial.map_mul] + +/-- If the maximal ideal is generated by `π`, then `π` is in it. -/ +theorem henselFactorization_generator_mem_maximalIdeal_of_eq + {R : Type*} [CommRing R] [IsLocalRing R] {π : R} + (hπ : IsLocalRing.maximalIdeal R = Ideal.span ({π} : Set R)) : + π ∈ IsLocalRing.maximalIdeal R := by + rw [hπ] + exact Ideal.mem_span_singleton_self π + +/-- Equality with the principal ideal gives the weakened containment form used +by the recursive construction. -/ +theorem henselFactorization_maximalIdeal_le_span_of_eq + {R : Type*} [CommRing R] [IsLocalRing R] {π : R} + (hπ : IsLocalRing.maximalIdeal R = Ideal.span ({π} : Set R)) : + IsLocalRing.maximalIdeal R ≤ Ideal.span ({π} : Set R) := by + simp [hπ] + +/-- The two principal-maximal-ideal facts used throughout the proof of +the factorization form of Hensel's lemma. -/ +theorem henselFactorization_principal_maximal_mem_le_of_eq + {R : Type*} [CommRing R] [IsLocalRing R] {π : R} + (hπ : IsLocalRing.maximalIdeal R = Ideal.span ({π} : Set R)) : + π ∈ IsLocalRing.maximalIdeal R ∧ + IsLocalRing.maximalIdeal R ≤ Ideal.span ({π} : Set R) := by + exact ⟨henselFactorization_generator_mem_maximalIdeal_of_eq hπ, + henselFactorization_maximalIdeal_le_span_of_eq hπ⟩ + +/-- lift input: a residue polynomial can be lifted along a +surjective coefficient map with the same polynomial degree. -/ +theorem henselFactorization_exists_polynomial_lift_degree_eq + {R k : Type*} [CommRing R] [CommRing k] (φ : R →+* k) + (hφ : Function.Surjective φ) (fbar : k[X]) : + ∃ f : R[X], f.map φ = fbar ∧ f.degree = fbar.degree := by + have hlifts : fbar ∈ Polynomial.lifts φ := by + rw [Polynomial.lifts_iff_coeff_lifts] + intro n + exact hφ (fbar.coeff n) + rcases Polynomial.exists_degree_eq_of_mem_lifts hlifts with + ⟨f, hmap, hdegree⟩ + exact ⟨f, hmap, hdegree⟩ + +/-- lift input: a residue polynomial can be lifted along a +surjective coefficient map with the same natural degree. -/ +theorem henselFactorization_exists_polynomial_lift_natDegree_eq + {R k : Type*} [CommRing R] [CommRing k] (φ : R →+* k) + (hφ : Function.Surjective φ) (fbar : k[X]) : + ∃ f : R[X], f.map φ = fbar ∧ f.natDegree = fbar.natDegree := by + rcases henselFactorization_exists_polynomial_lift_degree_eq φ hφ fbar with + ⟨f, hmap, hdegree⟩ + exact ⟨f, hmap, Polynomial.natDegree_eq_of_degree_eq hdegree⟩ + +/-- unit-leading input: a lift with the same natural degree as +a nonzero residual polynomial has unit leading coefficient. -/ +theorem henselFactorization_lift_leadingCoeff_isUnit_of_natDegree_eq + {R : Type*} [CommRing R] [IsLocalRing R] + {g0 : R[X]} {gbar : (IsLocalRing.ResidueField R)[X]} + (hg0 : g0.map (IsLocalRing.residue R) = gbar) + (hdegree : g0.natDegree = gbar.natDegree) + (hlead : gbar.leadingCoeff ≠ 0) : + IsUnit g0.leadingCoeff := by + have hcoeff := + congrArg (fun P : (IsLocalRing.ResidueField R)[X] => + P.coeff gbar.natDegree) hg0 + have hres_lead : + IsLocalRing.residue R g0.leadingCoeff = gbar.leadingCoeff := by + change (g0.map (IsLocalRing.residue R)).coeff gbar.natDegree = + gbar.coeff gbar.natDegree at hcoeff + rw [Polynomial.coeff_map] at hcoeff + change IsLocalRing.residue R (g0.coeff g0.natDegree) = + gbar.coeff gbar.natDegree + rw [hdegree] + exact hcoeff + have hres_ne : IsLocalRing.residue R g0.leadingCoeff ≠ 0 := by + rw [hres_lead] + exact hlead + exact (IsLocalRing.residue_ne_zero_iff_isUnit g0.leadingCoeff).1 hres_ne + +/-- unit-leading normalization: a polynomial whose leading +coefficient is a unit becomes monic after multiplying by the inverse leading +coefficient, and this normalization preserves degree. -/ +theorem henselFactorization_monic_normalization_of_unit_leadingCoeff + {R : Type*} [CommRing R] {g : R[X]} (hunit : IsUnit g.leadingCoeff) : + ∃ u : Rˣ, + (u : R) = g.leadingCoeff ∧ + (Polynomial.C ((u⁻¹ : Rˣ) : R) * g).Monic ∧ + (Polynomial.C ((u⁻¹ : Rˣ) : R) * g).degree = g.degree ∧ + (Polynomial.C ((u⁻¹ : Rˣ) : R) * g).natDegree = g.natDegree := by + rcases hunit with ⟨u, hu⟩ + have hinvUnit : IsUnit (((u⁻¹ : Rˣ) : R)) := ⟨u⁻¹, rfl⟩ + refine ⟨u, hu, ?_, ?_, ?_⟩ + · exact Polynomial.monic_C_mul_of_mul_leadingCoeff_eq_one + (p := g) (b := ((u⁻¹ : Rˣ) : R)) (Units.inv_mul_of_eq (u := u) hu) + · exact Polynomial.degree_C_mul_of_isUnit hinvUnit g + · exact Polynomial.natDegree_C_mul_of_isUnit hinvUnit g + +/-- Bezout lift input: if the two residual factors are +coprime, then after choosing arbitrary lifts `g0`, `h0`, the Bezout +coefficients can also be lifted so that `a g0 + b h0` reduces to `1`. -/ +theorem henselFactorization_exists_bezout_lifts + {R k : Type*} [CommRing R] [CommRing k] (φ : R →+* k) + (hφ : Function.Surjective φ) + {gbar hbar : k[X]} (hcop : IsCoprime gbar hbar) + {g0 h0 : R[X]} (hg0 : g0.map φ = gbar) (hh0 : h0.map φ = hbar) : + ∃ a b : R[X], (a * g0 + b * h0).map φ = 1 := by + rcases hcop with ⟨abar, bbar, hbezout⟩ + rcases henselFactorization_exists_polynomial_lift_degree_eq φ hφ abar with + ⟨a, ha, _⟩ + rcases henselFactorization_exists_polynomial_lift_degree_eq φ hφ bbar with + ⟨b, hb, _⟩ + refine ⟨a, b, ?_⟩ + calc + (a * g0 + b * h0).map φ = + a.map φ * g0.map φ + b.map φ * h0.map φ := by + exact henselFactorization_map_mul_add_mul φ a b g0 h0 + _ = abar * gbar + bbar * hbar := by + rw [ha, hb, hg0, hh0] + _ = 1 := hbezout + +/-- A polynomial maps to zero iff all of its coefficients lie in the kernel of +the coefficient map. This is the coefficientwise form used by the Hensel +correction congruences. -/ +theorem henselFactorization_map_eq_zero_iff_coeff_mem_ker + {R k : Type*} [CommRing R] [CommRing k] (φ : R →+* k) (P : R[X]) : + P.map φ = 0 ↔ ∀ n : ℕ, P.coeff n ∈ RingHom.ker φ := by + constructor + · intro h n + rw [RingHom.mem_ker] + have hcoeff := congrArg (fun Q : k[X] => Q.coeff n) h + simpa [Polynomial.coeff_map] using hcoeff + · intro h + ext n + rw [Polynomial.coeff_map, Polynomial.coeff_zero] + exact RingHom.mem_ker.mp (h n) + +/-- Polynomial coefficient maps are equal iff every coefficient of the +difference lies in the kernel. -/ +theorem henselFactorization_map_eq_iff_sub_coeff_mem_ker + {R k : Type*} [CommRing R] [CommRing k] (φ : R →+* k) (P Q : R[X]) : + P.map φ = Q.map φ ↔ ∀ n : ℕ, (P - Q).coeff n ∈ RingHom.ker φ := by + rw [← sub_eq_zero, ← Polynomial.map_sub] + exact henselFactorization_map_eq_zero_iff_coeff_mem_ker φ (P - Q) + +/-- The kernel of the quotient map `R -> R/I` is exactly `I`. -/ +theorem henselFactorization_mem_ker_quotient_mk_iff + {R : Type*} [CommRing R] (I : Ideal R) (x : R) : + x ∈ RingHom.ker (Ideal.Quotient.mk I) ↔ x ∈ I := by + rw [RingHom.mem_ker, Ideal.Quotient.eq_zero_iff_mem] + +/-- Specialization of the coefficientwise zero criterion to quotient maps: +a polynomial maps to zero in `(R/I)[X]` iff all of its coefficients lie in +`I`. -/ +theorem henselFactorization_map_quotient_eq_zero_iff_coeff_mem + {R : Type*} [CommRing R] (I : Ideal R) (P : R[X]) : + P.map (Ideal.Quotient.mk I) = 0 ↔ ∀ n : ℕ, P.coeff n ∈ I := by + rw [henselFactorization_map_eq_zero_iff_coeff_mem_ker] + constructor + · intro h n + rw [← Ideal.Quotient.eq_zero_iff_mem] + exact RingHom.mem_ker.mp (h n) + · intro h n + rw [RingHom.mem_ker] + exact Ideal.Quotient.eq_zero_iff_mem.mpr (h n) + +/-- Coefficientwise form of +`henselFactorization_map_quotient_eq_zero_iff_coeff_mem`. -/ +theorem henselFactorization_quotient_map_coeff_eq_zero_iff_coeff_mem + {R : Type*} [CommRing R] (I : Ideal R) (P : R[X]) (n : ℕ) : + (P.map (Ideal.Quotient.mk I)).coeff n = 0 ↔ P.coeff n ∈ I := by + rw [Polynomial.coeff_map, Ideal.Quotient.eq_zero_iff_mem] + +/-- Equality after quotienting coefficients is the same as coefficientwise +membership of the difference in the quotient ideal. -/ +theorem henselFactorization_map_quotient_eq_iff_sub_coeff_mem + {R : Type*} [CommRing R] (I : Ideal R) (P Q : R[X]) : + P.map (Ideal.Quotient.mk I) = Q.map (Ideal.Quotient.mk I) ↔ + ∀ n : ℕ, (P - Q).coeff n ∈ I := by + rw [henselFactorization_map_eq_iff_sub_coeff_mem_ker] + constructor + · intro h n + exact (henselFactorization_mem_ker_quotient_mk_iff I _).1 (h n) + · intro h n + exact (henselFactorization_mem_ker_quotient_mk_iff I _).2 (h n) + +/-- first congruence input: if `f` reduces to the product of +the residual factors and `g0`, `h0` lift those factors, then every coefficient +of `f - g0 h0` lies in the kernel of the coefficient map. -/ +theorem henselFactorization_coeff_mem_ker_sub_mul_of_lifts + {R k : Type*} [CommRing R] [CommRing k] (φ : R →+* k) + {f g0 h0 : R[X]} {gbar hbar : k[X]} + (hfbar : f.map φ = gbar * hbar) + (hg0 : g0.map φ = gbar) (hh0 : h0.map φ = hbar) : + ∀ n : ℕ, (f - g0 * h0).coeff n ∈ RingHom.ker φ := by + have hmap : (f - g0 * h0).map φ = 0 := by + calc + (f - g0 * h0).map φ = f.map φ - g0.map φ * h0.map φ := by + exact henselFactorization_map_sub_mul φ f g0 h0 + _ = gbar * hbar - gbar * hbar := by + rw [hfbar, hg0, hh0] + _ = 0 := by simp + exact (henselFactorization_map_eq_zero_iff_coeff_mem_ker φ _).1 hmap + +/-- local-ring form of the first congruence input for the +residue map. -/ +theorem henselFactorization_coeff_mem_maximalIdeal_sub_mul_of_residue_lifts + {R : Type*} [CommRing R] [IsLocalRing R] + {f g0 h0 : R[X]} {gbar hbar : (IsLocalRing.ResidueField R)[X]} + (hfbar : f.map (IsLocalRing.residue R) = gbar * hbar) + (hg0 : g0.map (IsLocalRing.residue R) = gbar) + (hh0 : h0.map (IsLocalRing.residue R) = hbar) : + ∀ n : ℕ, (f - g0 * h0).coeff n ∈ IsLocalRing.maximalIdeal R := by + intro n + have hker : + (f - g0 * h0).coeff n ∈ RingHom.ker (IsLocalRing.residue R) := + henselFactorization_coeff_mem_ker_sub_mul_of_lifts + (IsLocalRing.residue R) hfbar hg0 hh0 n + rwa [IsLocalRing.ker_residue] at hker + +/-- if a polynomial maps to `1`, then subtracting `1` gives +coefficients in the kernel of the coefficient map. -/ +theorem henselFactorization_coeff_mem_ker_sub_one_of_map_eq_one + {R k : Type*} [CommRing R] [CommRing k] (φ : R →+* k) + {P : R[X]} (hP : P.map φ = 1) : + ∀ n : ℕ, (P - 1).coeff n ∈ RingHom.ker φ := by + have hmap : (P - 1).map φ = 0 := by + calc + (P - 1).map φ = P.map φ - 1 := by + simp [Polynomial.map_sub] + _ = 0 := by + rw [hP] + simp + exact (henselFactorization_map_eq_zero_iff_coeff_mem_ker φ _).1 hmap + +/-- local-ring form of the lifted Bezout congruence: +`a*g0 + b*h0 ≡ 1` modulo the residue map means every coefficient of +`a*g0 + b*h0 - 1` lies in the maximal ideal. -/ +theorem henselFactorization_coeff_mem_maximalIdeal_sub_one_of_bezout_lift + {R : Type*} [CommRing R] [IsLocalRing R] + {a b g0 h0 : R[X]} + (hbez : (a * g0 + b * h0).map (IsLocalRing.residue R) = 1) : + ∀ n : ℕ, (a * g0 + b * h0 - 1).coeff n ∈ + IsLocalRing.maximalIdeal R := by + intro n + have hker : + (a * g0 + b * h0 - 1).coeff n ∈ + RingHom.ker (IsLocalRing.residue R) := + henselFactorization_coeff_mem_ker_sub_one_of_map_eq_one + (IsLocalRing.residue R) hbez n + rwa [IsLocalRing.ker_residue] at hker + +/-- division step: division by a monic polynomial gives the +quotient and remainder used in the correction construction, with remainder +degree strictly smaller than the divisor degree. -/ +theorem henselFactorization_division_by_monic_degree_lt + {R : Type*} [CommRing R] [Nontrivial R] (F g : R[X]) (hg : g.Monic) : + ∃ q p : R[X], F = g * q + p ∧ p.degree < g.degree := by + refine ⟨F /ₘ g, F %ₘ g, ?_, ?_⟩ + · calc + F = F %ₘ g + g * (F /ₘ g) := by + exact (Polynomial.modByMonic_add_div F g).symm + _ = g * (F /ₘ g) + F %ₘ g := by + ring + · exact Polynomial.degree_modByMonic_lt F hg + +/-- division by a unit-leading divisor: the division step used +in the Hensel correction construction does not require the chosen lift `g0` to +be monic; a unit leading coefficient is enough. -/ +theorem henselFactorization_division_by_unit_leading_degree_lt + {R : Type*} [CommRing R] [Nontrivial R] (F g : R[X]) + (hunit : IsUnit g.leadingCoeff) : + ∃ q p : R[X], F = g * q + p ∧ p.degree < g.degree := by + rcases henselFactorization_monic_normalization_of_unit_leadingCoeff + (g := g) hunit with + ⟨u, _hu, hmonic, hdegree, _hnatDegree⟩ + rcases henselFactorization_division_by_monic_degree_lt F + (Polynomial.C ((u⁻¹ : Rˣ) : R) * g) hmonic with + ⟨q, p, hdiv, hpdeg⟩ + refine ⟨Polynomial.C ((u⁻¹ : Rˣ) : R) * q, p, ?_, ?_⟩ + · calc + F = (Polynomial.C ((u⁻¹ : Rˣ) : R) * g) * q + p := hdiv + _ = g * (Polynomial.C ((u⁻¹ : Rˣ) : R) * q) + p := by + ring + · rwa [hdegree] at hpdeg + +/-- division by a lifted residual factor: if `g0` lifts +`gbar` with the same degree and `gbar` is nonzero in leading coefficient, then +the construction division step `F = g0 q + p`, `deg p < deg g0`, is available in the +valuation ring. -/ +theorem henselFactorization_division_by_lifted_factor_degree_lt + {R : Type*} [CommRing R] [IsLocalRing R] + {g0 : R[X]} {gbar : (IsLocalRing.ResidueField R)[X]} + (hg0 : g0.map (IsLocalRing.residue R) = gbar) + (hdegree : g0.natDegree = gbar.natDegree) + (hlead : gbar.leadingCoeff ≠ 0) (F : R[X]) : + ∃ q p : R[X], F = g0 * q + p ∧ p.degree < g0.degree := by + exact henselFactorization_division_by_unit_leading_degree_lt F g0 + (henselFactorization_lift_leadingCoeff_isUnit_of_natDegree_eq hg0 hdegree hlead) + +/-- Algebra identity behind the Hensel correction step after the division +`b * fn = g0 * q + p`. -/ +theorem henselFactorization_correction_identity_after_division + {R : Type*} [CommSemiring R] {a b g0 h0 fn q p : R[X]} + (hdiv : b * fn = g0 * q + p) : + g0 * (a * fn + h0 * q) + h0 * p = (a * g0 + b * h0) * fn := by + calc + g0 * (a * fn + h0 * q) + h0 * p = + a * g0 * fn + h0 * (g0 * q + p) := by + ring + _ = a * g0 * fn + h0 * (b * fn) := by + rw [← hdiv] + _ = (a * g0 + b * h0) * fn := by + ring + +/-- correction congruence after the division step. If +`a g0 + b h0` is `1` modulo the coefficient map and `b fn = g0 q + p`, then +the divided correction still represents `fn` modulo the same kernel. -/ +theorem henselFactorization_correction_congruence_after_division + {R k : Type*} [CommRing R] [CommRing k] (φ : R →+* k) + {a b g0 h0 fn q p : R[X]} + (hbez : (a * g0 + b * h0).map φ = 1) + (hdiv : b * fn = g0 * q + p) : + ∀ n : ℕ, + (g0 * (a * fn + h0 * q) + h0 * p - fn).coeff n ∈ RingHom.ker φ := by + have halg := + henselFactorization_correction_identity_after_division + (a := a) (h0 := h0) hdiv + have hmap : + (g0 * (a * fn + h0 * q) + h0 * p - fn).map φ = 0 := by + calc + (g0 * (a * fn + h0 * q) + h0 * p - fn).map φ = + (((a * g0 + b * h0) * fn - fn).map φ) := by + rw [halg] + _ = (a * g0 + b * h0).map φ * fn.map φ - fn.map φ := by + exact henselFactorization_map_mul_sub_self φ (a * g0 + b * h0) fn + _ = 0 := by + rw [hbez] + simp + exact (henselFactorization_map_eq_zero_iff_coeff_mem_ker φ _).1 hmap + +/-- correction congruence after division, read directly +modulo the principal ideal `(π)`: if the lifted Bezout error has a displayed +`C π` factor, then the divided correction represents `fn` modulo `(π)`. -/ +theorem henselFactorization_correction_congruence_span_singleton_after_division + {R : Type*} [CommRing R] {π : R} + {a b g0 h0 fn q p e : R[X]} + (hbez : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hdiv : b * fn = g0 * q + p) : + ∀ n : ℕ, + (g0 * (a * fn + h0 * q) + h0 * p - fn).coeff n ∈ + Ideal.span ({π} : Set R) := by + have halg := + henselFactorization_correction_identity_after_division + (a := a) (h0 := h0) hdiv + have hfactor : + g0 * (a * fn + h0 * q) + h0 * p - fn = + Polynomial.C π * (e * fn) := by + calc + g0 * (a * fn + h0 * q) + h0 * p - fn = + (a * g0 + b * h0 - 1) * fn := by + rw [halg] + ring + _ = Polynomial.C π * (e * fn) := by + rw [hbez] + ring + intro n + rw [hfactor, Polynomial.coeff_C_mul, Ideal.mem_span_singleton] + exact dvd_mul_right π ((e * fn).coeff n) + +/-- local-ring form of the correction congruence after the +division step. -/ +theorem henselFactorization_correction_mem_maximalIdeal_after_division + {R : Type*} [CommRing R] [IsLocalRing R] + {a b g0 h0 fn q p : R[X]} + (hbez : (a * g0 + b * h0).map (IsLocalRing.residue R) = 1) + (hdiv : b * fn = g0 * q + p) : + ∀ n : ℕ, + (g0 * (a * fn + h0 * q) + h0 * p - fn).coeff n ∈ + IsLocalRing.maximalIdeal R := by + intro n + have hker : + (g0 * (a * fn + h0 * q) + h0 * p - fn).coeff n ∈ + RingHom.ker (IsLocalRing.residue R) := + henselFactorization_correction_congruence_after_division + (IsLocalRing.residue R) hbez hdiv n + rwa [IsLocalRing.ker_residue] at hker + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/CoefficientMinimum.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/CoefficientMinimum.lean new file mode 100644 index 0000000000..0f02382b31 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/CoefficientMinimum.lean @@ -0,0 +1,301 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RingTheory.Valuation.ValuationRing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.ErrorPowers +/-! +# the finite minimum coefficient + +The coefficientwise proof of Hensel's lemma chooses, among the finitely many +coefficients of `f - g₀h₀` and `ag₀ + bh₀ - 1`, one coefficient of minimum +valuation and calls it `π`. In a valuation ring this is the same algebraic +input as choosing one coefficient that divides all coefficients in the finite +set. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- finite divisibility minimum in a valuation ring: every +nonempty finite set has an element that divides all elements of the set. -/ +theorem henselFactorization_exists_mem_finset_dvd_all + {R : Type*} [Monoid R] [PreValuationRing R] {s : Finset R} + (hs : s.Nonempty) : + ∃ π ∈ s, ∀ x ∈ s, π ∣ x := by + classical + induction s using Finset.induction_on with + | empty => + rcases hs with ⟨x, hx⟩ + simp at hx + | @insert a s ha ih => + by_cases hs' : s.Nonempty + · rcases ih hs' with ⟨π, hπs, hπall⟩ + rcases ValuationRing.dvd_total π a with hπa | haπ + · refine ⟨π, Finset.mem_insert_of_mem hπs, ?_⟩ + intro x hx + rw [Finset.mem_insert] at hx + rcases hx with rfl | hxs + · exact hπa + · exact hπall x hxs + · refine ⟨a, Finset.mem_insert_self a s, ?_⟩ + intro x hx + rw [Finset.mem_insert] at hx + rcases hx with rfl | hxs + · exact dvd_refl _ + · exact dvd_trans haπ (hπall x hxs) + · refine ⟨a, Finset.mem_insert_self a s, ?_⟩ + intro x hx + rw [Finset.mem_insert] at hx + rcases hx with rfl | hxs + · exact dvd_refl _ + · exact False.elim (hs' ⟨x, hxs⟩) + +/-- the finite set of coefficients of two polynomials from +which the construction chooses the minimum-value coefficient. -/ +def henselFactorizationTwoPolynomialCoeffFinset + {R : Type*} [Semiring R] (P Q : R[X]) : Finset R := by + classical + exact P.support.image (fun n => P.coeff n) ∪ + Q.support.image (fun n => Q.coeff n) + +/-- A coefficient supported in the left polynomial belongs to the two-polynomial +coefficient set. -/ +theorem henselFactorization_mem_twoPolynomialCoeffFinset_left + {R : Type*} [Semiring R] {P Q : R[X]} {n : ℕ} + (hn : n ∈ P.support) : + P.coeff n ∈ henselFactorizationTwoPolynomialCoeffFinset P Q := by + classical + unfold henselFactorizationTwoPolynomialCoeffFinset + exact Finset.mem_union.mpr + (Or.inl (Finset.mem_image.mpr ⟨n, hn, rfl⟩)) + +/-- A coefficient supported in the right polynomial belongs to the +two-polynomial coefficient set. -/ +theorem henselFactorization_mem_twoPolynomialCoeffFinset_right + {R : Type*} [Semiring R] {P Q : R[X]} {n : ℕ} + (hn : n ∈ Q.support) : + Q.coeff n ∈ henselFactorizationTwoPolynomialCoeffFinset P Q := by + classical + unfold henselFactorizationTwoPolynomialCoeffFinset + exact Finset.mem_union.mpr + (Or.inr (Finset.mem_image.mpr ⟨n, hn, rfl⟩)) + +/-- every element of the finite coefficient set is a +nonzero coefficient. -/ +theorem henselFactorization_ne_zero_of_mem_twoPolynomialCoeffFinset + {R : Type*} [Semiring R] {P Q : R[X]} {x : R} + (hx : x ∈ henselFactorizationTwoPolynomialCoeffFinset P Q) : + x ≠ 0 := by + classical + unfold henselFactorizationTwoPolynomialCoeffFinset at hx + rw [Finset.mem_union] at hx + rcases hx with hx | hx + · rcases Finset.mem_image.mp hx with ⟨n, hn, rfl⟩ + simpa [Polynomial.mem_support_iff] using hn + · rcases Finset.mem_image.mp hx with ⟨n, hn, rfl⟩ + simpa [Polynomial.mem_support_iff] using hn + +/-- if the two-polynomial coefficient set is nonempty, one of +its coefficients divides every coefficient of both polynomials. -/ +theorem henselFactorization_exists_coeff_dvd_all_two_polynomials + {R : Type*} [CommRing R] [PreValuationRing R] {P Q : R[X]} + (hs : (henselFactorizationTwoPolynomialCoeffFinset P Q).Nonempty) : + ∃ π ∈ henselFactorizationTwoPolynomialCoeffFinset P Q, + (∀ n : ℕ, π ∣ P.coeff n) ∧ + (∀ n : ℕ, π ∣ Q.coeff n) := by + classical + rcases henselFactorization_exists_mem_finset_dvd_all + (R := R) (s := henselFactorizationTwoPolynomialCoeffFinset P Q) hs with + ⟨π, hπ, hπall⟩ + refine ⟨π, hπ, ?_, ?_⟩ + · intro n + by_cases hn : n ∈ P.support + · exact hπall (P.coeff n) + (henselFactorization_mem_twoPolynomialCoeffFinset_left + (P := P) (Q := Q) hn) + · rw [Polynomial.notMem_support_iff.mp hn] + exact dvd_zero π + · intro n + by_cases hn : n ∈ Q.support + · exact hπall (Q.coeff n) + (henselFactorization_mem_twoPolynomialCoeffFinset_right + (P := P) (Q := Q) hn) + · rw [Polynomial.notMem_support_iff.mp hn] + exact dvd_zero π + +/-- if the two polynomials have coefficients in an ideal, the +chosen finite-minimum coefficient lies in the same ideal. -/ +theorem henselFactorization_exists_coeff_mem_ideal_dvd_all_two_polynomials + {R : Type*} [CommRing R] [PreValuationRing R] {I : Ideal R} + {P Q : R[X]} + (hP : ∀ n : ℕ, P.coeff n ∈ I) + (hQ : ∀ n : ℕ, Q.coeff n ∈ I) + (hs : (henselFactorizationTwoPolynomialCoeffFinset P Q).Nonempty) : + ∃ π ∈ I, + π ∈ henselFactorizationTwoPolynomialCoeffFinset P Q ∧ + (∀ n : ℕ, π ∣ P.coeff n) ∧ + (∀ n : ℕ, π ∣ Q.coeff n) := by + classical + rcases henselFactorization_exists_coeff_dvd_all_two_polynomials + (R := R) (P := P) (Q := Q) hs with + ⟨π, hπcoeff, hπP, hπQ⟩ + have hπI : π ∈ I := by + unfold henselFactorizationTwoPolynomialCoeffFinset at hπcoeff + rw [Finset.mem_union] at hπcoeff + rcases hπcoeff with hπleft | hπright + · rcases Finset.mem_image.mp hπleft with ⟨n, _hn, hnπ⟩ + rw [← hnπ] + exact hP n + · rcases Finset.mem_image.mp hπright with ⟨n, _hn, hnπ⟩ + rw [← hnπ] + exact hQ n + exact ⟨π, hπI, hπcoeff, hπP, hπQ⟩ + +/-- nonempty finite-minimum branch with the ideal +membership retained: if both source polynomials have coefficients in `I`, the +chosen coefficient `π` lies in `I` and simultaneously factors both +polynomials. -/ +theorem henselFactorization_exists_coeff_mem_ideal_minimum_factor_two_polynomials + {R : Type*} [CommRing R] [PreValuationRing R] {I : Ideal R} + {P Q : R[X]} + (hP : ∀ n : ℕ, P.coeff n ∈ I) + (hQ : ∀ n : ℕ, Q.coeff n ∈ I) + (hs : (henselFactorizationTwoPolynomialCoeffFinset P Q).Nonempty) : + ∃ π ∈ I, + π ∈ henselFactorizationTwoPolynomialCoeffFinset P Q ∧ + (∃ P' : R[X], P = Polynomial.C π * P') ∧ + (∃ Q' : R[X], Q = Polynomial.C π * Q') := by + classical + rcases henselFactorization_exists_coeff_mem_ideal_dvd_all_two_polynomials + (R := R) (I := I) (P := P) (Q := Q) hP hQ hs with + ⟨π, hπI, hπcoeff, hπP, hπQ⟩ + refine ⟨π, hπI, hπcoeff, ?_, ?_⟩ + · exact henselFactorization_exists_factor_of_coeff_mem_span_singleton + (a := π) (P := P) (by + intro n + rw [Ideal.mem_span_singleton] + exact hπP n) + · exact henselFactorization_exists_factor_of_coeff_mem_span_singleton + (a := π) (P := Q) (by + intro n + rw [Ideal.mem_span_singleton] + exact hπQ n) + +/-- the first choice of `π` in the nonempty branch: +from the two initial source polynomials +`f - g0*h0` and `a*g0 + b*h0 - 1`, choose a coefficient `π` lying in the +maximal ideal that factors both source polynomials. -/ +theorem henselFactorization_exists_pi_factor_initial_errors_of_nonempty + {R : Type*} [CommRing R] [IsLocalRing R] [PreValuationRing R] + {f g0 h0 a b : R[X]} + (herr : ∀ n : ℕ, (f - g0 * h0).coeff n ∈ + IsLocalRing.maximalIdeal R) + (hbezerr : ∀ n : ℕ, (a * g0 + b * h0 - 1).coeff n ∈ + IsLocalRing.maximalIdeal R) + (hs : + (henselFactorizationTwoPolynomialCoeffFinset + (f - g0 * h0) (a * g0 + b * h0 - 1)).Nonempty) : + ∃ π ∈ IsLocalRing.maximalIdeal R, + π ∈ henselFactorizationTwoPolynomialCoeffFinset + (f - g0 * h0) (a * g0 + b * h0 - 1) ∧ + (∃ f1 : R[X], f - g0 * h0 = Polynomial.C π * f1) ∧ + (∃ e1 : R[X], + a * g0 + b * h0 - 1 = Polynomial.C π * e1) := by + exact henselFactorization_exists_coeff_mem_ideal_minimum_factor_two_polynomials + (R := R) (I := IsLocalRing.maximalIdeal R) + (P := f - g0 * h0) (Q := a * g0 + b * h0 - 1) + herr hbezerr hs + +/-- residue-factorization form of the first `π` +choice in the nonempty branch. The two coefficient-in-the-maximal-ideal +inputs are produced from the residue factorization and lifted Bezout +congruence. -/ +theorem henselFactorization_exists_pi_factor_initial_errors_of_residue_lifts_of_nonempty + {R : Type*} [CommRing R] [IsLocalRing R] [PreValuationRing R] + {f g0 h0 a b : R[X]} + {gbar hbar : (IsLocalRing.ResidueField R)[X]} + (hfbar : f.map (IsLocalRing.residue R) = gbar * hbar) + (hg0 : g0.map (IsLocalRing.residue R) = gbar) + (hh0 : h0.map (IsLocalRing.residue R) = hbar) + (hbez : (a * g0 + b * h0).map (IsLocalRing.residue R) = 1) + (hs : + (henselFactorizationTwoPolynomialCoeffFinset + (f - g0 * h0) (a * g0 + b * h0 - 1)).Nonempty) : + ∃ π ∈ IsLocalRing.maximalIdeal R, + π ∈ henselFactorizationTwoPolynomialCoeffFinset + (f - g0 * h0) (a * g0 + b * h0 - 1) ∧ + (∃ f1 : R[X], f - g0 * h0 = Polynomial.C π * f1) ∧ + (∃ e1 : R[X], + a * g0 + b * h0 - 1 = Polynomial.C π * e1) := by + exact henselFactorization_exists_pi_factor_initial_errors_of_nonempty + (R := R) (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) + (henselFactorization_coeff_mem_maximalIdeal_sub_mul_of_residue_lifts + hfbar hg0 hh0) + (henselFactorization_coeff_mem_maximalIdeal_sub_one_of_bezout_lift hbez) + hs + +/-- if the finite coefficient set is empty, the first +polynomial is zero. -/ +theorem henselFactorization_left_eq_zero_of_twoPolynomialCoeffFinset_empty + {R : Type*} [Semiring R] {P Q : R[X]} + (h : henselFactorizationTwoPolynomialCoeffFinset P Q = ∅) : + P = 0 := by + ext n + by_cases hn : n ∈ P.support + · have hmem : + P.coeff n ∈ henselFactorizationTwoPolynomialCoeffFinset P Q := + henselFactorization_mem_twoPolynomialCoeffFinset_left + (P := P) (Q := Q) hn + rw [h] at hmem + simp at hmem + · exact Polynomial.notMem_support_iff.mp hn + +/-- if the finite coefficient set is empty, the second +polynomial is zero. -/ +theorem henselFactorization_right_eq_zero_of_twoPolynomialCoeffFinset_empty + {R : Type*} [Semiring R] {P Q : R[X]} + (h : henselFactorizationTwoPolynomialCoeffFinset P Q = ∅) : + Q = 0 := by + ext n + by_cases hn : n ∈ Q.support + · have hmem : + Q.coeff n ∈ henselFactorizationTwoPolynomialCoeffFinset P Q := + henselFactorization_mem_twoPolynomialCoeffFinset_right + (P := P) (Q := Q) hn + rw [h] at hmem + simp at hmem + · exact Polynomial.notMem_support_iff.mp hn + +/-- the empty finite coefficient set is exactly the branch +where both source polynomials are zero. -/ +theorem henselFactorization_twoPolynomialCoeffFinset_empty_iff + {R : Type*} [Semiring R] {P Q : R[X]} : + henselFactorizationTwoPolynomialCoeffFinset P Q = ∅ ↔ P = 0 ∧ Q = 0 := by + classical + constructor + · intro h + exact ⟨ + henselFactorization_left_eq_zero_of_twoPolynomialCoeffFinset_empty + (P := P) (Q := Q) h, + henselFactorization_right_eq_zero_of_twoPolynomialCoeffFinset_empty + (P := P) (Q := Q) h⟩ + · rintro ⟨rfl, rfl⟩ + unfold henselFactorizationTwoPolynomialCoeffFinset + simp + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Complete.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Complete.lean new file mode 100644 index 0000000000..afb28a3fe0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Complete.lean @@ -0,0 +1,82 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Assembly +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.PrincipalAdicCompleteness +/-! +# Hensel's lemma over a complete valued field + +This file supplies the explicit endpoint from completeness and +nonarchimedeanness, using the principal element selected from the finitely many +initial error coefficients in the proof core. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- Hensel's lemma in the complete +nonarchimedean-valued-field setting. A primitive polynomial over the +valuation ring whose reduction is a product of coprime factors lifts to a +factorization with the prescribed reductions and with the degree of the left +factor unchanged. -/ +theorem henselFactorization_complete_exists_factorization + {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) + (hcomplete : IsCompleteForAbsoluteValue v) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + {f : (absoluteValueValuationSubring v hnonarch)[X]} + {gbar hbar : (IsLocalRing.ResidueField + (absoluteValueValuationSubring v hnonarch))[X]} + (hprim : f.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) ≠ 0) + (hfbar : f.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) = + gbar * hbar) + (hcop : IsCoprime gbar hbar) : + ∃ G H : + (absoluteValueValuationSubring v hnonarch)[X], + f = G * H ∧ + G.natDegree = gbar.natDegree ∧ + G.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) = + gbar ∧ + H.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) = + hbar := by + let V := absoluteValueValuationSubring v hnonarch + let hpre : + ∀ π : V, π ≠ 0 → π ∈ IsLocalRing.maximalIdeal V → + IsPrecomplete (Ideal.span ({π} : Set V)) V := by + intro π hπne hπmem + exact principalPrecomplete_of_complete + v hcomplete hnonarch hπne hπmem + let hhaus : + ∀ π : V, π ≠ 0 → π ∈ IsLocalRing.maximalIdeal V → + IsHausdorff (Ideal.span ({π} : Set V)) V := by + intro π hπne hπmem + exact principalHausdorff_of_nonzero_mem_maximalIdeal + v hnonarch hπne hπmem + rcases + henselFactorization_exists_limit_factorization_of_residual_factors_valuationRing_principal + (R := V) hpre hhaus + (f := f) (gbar := gbar) (hbar := hbar) + hprim hfbar hcop with + ⟨G, H, hGdegree, _hHle, hfactor, hGmap, hHmap⟩ + exact ⟨G, H, hfactor, hGdegree, hGmap, hHmap⟩ + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DegreeBounds.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DegreeBounds.lean new file mode 100644 index 0000000000..aca7cf7b82 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DegreeBounds.lean @@ -0,0 +1,138 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DivisionBounds +/-! +# degree bounds for the error factors + +This file supplies the degree estimates for the polynomials `f_n` appearing in +the coefficientwise Hensel iteration. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- a natural-degree bound survives reduction of +coefficients. -/ +theorem henselFactorization_map_natDegree_le_of_natDegree_le + {R k : Type*} [CommRing R] [CommRing k] (φ : R →+* k) + {P : R[X]} {d : ℕ} (hP : P.natDegree ≤ d) : + (P.map φ).natDegree ≤ d := + Polynomial.natDegree_map_le.trans hP + +/-- exact degree is recovered from a bounded lift whose +reduction has nonzero leading coefficient in the prescribed degree. -/ +theorem henselFactorization_natDegree_eq_of_residue_eq_of_le + {R : Type*} [CommRing R] [IsLocalRing R] + {P : R[X]} {gbar : (IsLocalRing.ResidueField R)[X]} {m : ℕ} + (hP : P.natDegree ≤ m) + (hmap : P.map (IsLocalRing.residue R) = gbar) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) : + P.natDegree = m := by + refine le_antisymm hP ?_ + have hcoeff_map := + congrArg (fun Q : (IsLocalRing.ResidueField R)[X] => Q.coeff m) hmap + have hcoeff : + IsLocalRing.residue R (P.coeff m) = gbar.coeff m := by + simpa [Polynomial.coeff_map] using hcoeff_map + have hgcoeff : gbar.coeff m ≠ 0 := by + simpa [Polynomial.leadingCoeff, hgbar_nat] using hglead + have hPcoeff : P.coeff m ≠ 0 := by + intro hzero + apply hgcoeff + rw [← hcoeff, hzero, map_zero] + exact Polynomial.le_natDegree_of_ne_zero hPcoeff + +/-- the stated degree bound for the second residual factor: +if `fbar = gbar*hbar`, `deg fbar≤d`, and `deg gbar=m` with `gbar≠0`, then +`deg hbar≤d-m`. -/ +theorem henselFactorization_residual_right_natDegree_le + {k : Type*} [Field k] {fbar gbar hbar : k[X]} {m d : ℕ} + (hfbar : fbar = gbar * hbar) + (hf : fbar.natDegree ≤ d) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) : + hbar.natDegree ≤ d - m := by + by_cases hh : hbar = 0 + · simp [hh] + · have hg : gbar ≠ 0 := Polynomial.leadingCoeff_ne_zero.mp hglead + have hprod : (gbar * hbar).natDegree ≤ d := by + simpa [hfbar] using hf + have hsum : m + hbar.natDegree ≤ d := by + simpa [hgbar_nat, Polynomial.natDegree_mul hg hh] using hprod + exact Nat.le_sub_of_add_le (by simpa [Nat.add_comm] using hsum) + +/-- if `deg f ≤ d`, `deg g ≤ m`, and `deg h ≤ d-m`, then +`deg(f-gh)≤d`. -/ +theorem henselFactorization_error_natDegree_le + {R : Type*} [CommRing R] {f g h : R[X]} {d m : ℕ} + (hf : f.natDegree ≤ d) (hg : g.natDegree ≤ m) + (hh : h.natDegree ≤ d - m) (hmd : m ≤ d) : + (f - g * h).natDegree ≤ d := by + have hmul : (g * h).natDegree ≤ d := by + have hmul' : (g * h).natDegree ≤ m + (d - m) := + Polynomial.natDegree_mul_le_of_le hg hh + have hsum : m + (d - m) = d := by + rw [Nat.add_comm, Nat.sub_add_cancel hmd] + simpa [hsum] using hmul' + have hsub := Polynomial.natDegree_sub_le_of_le hf hmul + simpa using hsub + +/-- if `P=C(a)Q` with `a≠0`, then a degree bound on `P` +is a degree bound on `Q`. -/ +theorem henselFactorization_factor_natDegree_le_of_constant_mul_eq + {R : Type*} [CommRing R] [NoZeroDivisors R] {a : R} (ha : a ≠ 0) + {P Q : R[X]} {d : ℕ} + (hP : P.natDegree ≤ d) (hfactor : P = Polynomial.C a * Q) : + Q.natDegree ≤ d := by + have hCQ : (Polynomial.C a * Q).natDegree ≤ d := by + simpa [hfactor] using hP + simpa [Polynomial.natDegree_C_mul (p := Q) (a0 := ha)] using hCQ + +/-- degree bound for the next error factor `f_n` from the +current factorization error. -/ +theorem henselFactorization_error_factor_natDegree_le + {R : Type*} [CommRing R] [NoZeroDivisors R] {π : R} {n : ℕ} + (hπn : π ^ n ≠ 0) + {f g h fn : R[X]} {d m : ℕ} + (hf : f.natDegree ≤ d) (hg : g.natDegree ≤ m) + (hh : h.natDegree ≤ d - m) (hmd : m ≤ d) + (hfactor : f - g * h = Polynomial.C (π ^ n) * fn) : + fn.natDegree ≤ d := + henselFactorization_factor_natDegree_le_of_constant_mul_eq + (a := π ^ n) hπn + (P := f - g * h) (Q := fn) + (henselFactorization_error_natDegree_le hf hg hh hmd) + hfactor + +/-- residue-degree bound for the next error factor `f_n`. -/ +theorem henselFactorization_error_factor_residue_natDegree_le + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} {n : ℕ} (hπn : π ^ n ≠ 0) + {f g h fn : R[X]} {d m : ℕ} + (hf : f.natDegree ≤ d) (hg : g.natDegree ≤ m) + (hh : h.natDegree ≤ d - m) (hmd : m ≤ d) + (hfactor : f - g * h = Polynomial.C (π ^ n) * fn) : + (fn.map (IsLocalRing.residue R)).natDegree ≤ d := + henselFactorization_map_natDegree_le_of_natDegree_le + (IsLocalRing.residue R) + (henselFactorization_error_factor_natDegree_le + (π := π) hπn hf hg hh hmd hfactor) + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DivisionBounds.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DivisionBounds.lean new file mode 100644 index 0000000000..9acb7394fb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DivisionBounds.lean @@ -0,0 +1,58 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic +/-! +# degree bounds for the division remainder + +This file supplies the degree estimate for the remainder in the coefficientwise Hensel +correction step. It removes the later need to assume separately that the +residue of the remainder has small degree. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- the remainder estimate before reducing +coefficients. -/ +theorem henselFactorization_remainder_natDegree_le_of_degree_lt + {R : Type*} [CommRing R] {g0 p : R[X]} {m : ℕ} + (hg0nat : g0.natDegree = m) (hpdeg : p.degree < g0.degree) : + p.natDegree ≤ m := by + apply Polynomial.natDegree_le_of_degree_le + have hlt : p.degree < (m : WithBot ℕ) := by + calc + p.degree < g0.degree := hpdeg + _ ≤ (g0.natDegree : WithBot ℕ) := Polynomial.degree_le_natDegree + _ = (m : WithBot ℕ) := by rw [hg0nat] + exact hlt.le + +/-- the remainder estimate in residue-degree form: if +the division remainder has degree strictly smaller than `g0`, and `g0` has +natural degree `m`, then the residue of the remainder has natural degree at +most `m`. -/ +theorem henselFactorization_residue_remainder_natDegree_le_of_degree_lt + {R : Type*} [CommRing R] [IsLocalRing R] + {g0 p : R[X]} {m : ℕ} + (hg0nat : g0.natDegree = m) (hpdeg : p.degree < g0.degree) : + (p.map (IsLocalRing.residue R)).natDegree ≤ m := by + exact Polynomial.natDegree_map_le.trans + (henselFactorization_remainder_natDegree_le_of_degree_lt hg0nat hpdeg) + + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/ErrorPowers.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/ErrorPowers.lean new file mode 100644 index 0000000000..e463e9bf84 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/ErrorPowers.lean @@ -0,0 +1,244 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Truncation +/-! +# the power step in Hensel's iteration + +This file contains the `π^n`-to-`π^(n+1)` step in the coefficientwise proof of +Hensel's lemma. The preceding files produce the correction congruence modulo +the maximal ideal; here it is converted into the actual improvement of the +factorization error after the update +`g ↦ g + π^n p`, `h ↦ h + π^n q`. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- coefficientwise divisibility gives a polynomial factor by +the corresponding `C a` polynomial. -/ +theorem henselFactorization_exists_factor_of_coeff_mem_span_singleton + {R : Type*} [CommRing R] {a : R} {P : R[X]} + (hP : ∀ i : ℕ, P.coeff i ∈ Ideal.span ({a} : Set R)) : + ∃ Q : R[X], P = Polynomial.C a * Q := by + have hdvd : ∀ i : ℕ, a ∣ P.coeff i := by + intro i + simpa [Ideal.mem_span_singleton] using hP i + exact (Polynomial.C_dvd_iff_dvd_coeff a P).2 hdvd + +/-- a displayed `C(π^n)` factor gives coefficientwise +membership in the principal ideal `(π^n)`. -/ +theorem henselFactorization_coeff_mem_span_singleton_pow_of_factor + {R : Type*} [CommRing R] {π : R} {n : ℕ} {P Q : R[X]} + (hfactor : P = Polynomial.C (π ^ n) * Q) : + ∀ i : ℕ, P.coeff i ∈ Ideal.span ({π ^ n} : Set R) := by + intro i + rw [hfactor, Polynomial.coeff_C_mul] + refine Ideal.mem_span_singleton'.mpr ⟨Q.coeff i, ?_⟩ + ring + +/-- a displayed `C(π^n)` factor gives coefficientwise +membership in the `n`-th power of the principal ideal `(π)`. -/ +theorem henselFactorization_coeff_mem_span_pow_of_factor + {R : Type*} [CommRing R] {π : R} {n : ℕ} {P Q : R[X]} + (hfactor : P = Polynomial.C (π ^ n) * Q) : + ∀ i : ℕ, P.coeff i ∈ Ideal.span ({π} : Set R) ^ n := by + intro i + rw [Ideal.span_singleton_pow] + exact henselFactorization_coeff_mem_span_singleton_pow_of_factor + (π := π) (n := n) hfactor i + +/-- the principal ideal generated by an element of an ideal is +contained in that ideal. -/ +theorem henselFactorization_span_singleton_le_ideal_of_mem + {R : Type*} [CommRing R] (I : Ideal R) {π : R} (hπ : π ∈ I) : + Ideal.span ({π} : Set R) ≤ I := by + rw [Ideal.span_le] + intro x hx + have hxπ : x = π := by simpa using hx + simpa [hxπ] using hπ + +/-- local-ring form: if `π` lies in the maximal ideal, then a +displayed `C(π^n)` factor has every coefficient in `m^n`. -/ +theorem henselFactorization_coeff_mem_maximalIdeal_pow_of_factor_of_mem + {R : Type*} [CommRing R] [IsLocalRing R] {π : R} {n : ℕ} {P Q : R[X]} + (hπ : π ∈ IsLocalRing.maximalIdeal R) + (hfactor : P = Polynomial.C (π ^ n) * Q) : + ∀ i : ℕ, P.coeff i ∈ IsLocalRing.maximalIdeal R ^ n := by + intro i + have hspan : + P.coeff i ∈ Ideal.span ({π ^ n} : Set R) := + henselFactorization_coeff_mem_span_singleton_pow_of_factor + (π := π) (n := n) hfactor i + have hπpow : π ^ n ∈ IsLocalRing.maximalIdeal R ^ n := + Ideal.pow_mem_pow hπ n + have hspan_le : + Ideal.span ({π ^ n} : Set R) ≤ IsLocalRing.maximalIdeal R ^ n := + henselFactorization_span_singleton_le_ideal_of_mem + (IsLocalRing.maximalIdeal R ^ n) hπpow + exact hspan_le hspan + +/-- multiplying a coefficient congruent to zero modulo `π` +by `π^n` puts it in `(π^(n+1))`. -/ +theorem henselFactorization_span_singleton_pow_mul_mem_succ + {R : Type*} [CommRing R] {π x : R} (n : ℕ) + (hx : x ∈ Ideal.span ({π} : Set R)) : + π ^ n * x ∈ Ideal.span ({π ^ (n + 1)} : Set R) := by + rcases (Ideal.mem_span_singleton'.mp hx) with ⟨c, hc⟩ + refine Ideal.mem_span_singleton'.mpr ⟨c, ?_⟩ + rw [← hc] + rw [pow_succ] + ring + +/-- a positive power of `π` times any coefficient is +congruent to zero modulo `π`. -/ +theorem henselFactorization_pow_mul_mem_span_singleton_of_pos + {R : Type*} [CommRing R] {π x : R} {n : ℕ} (hn : 1 ≤ n) : + π ^ n * x ∈ Ideal.span ({π} : Set R) := by + refine Ideal.mem_span_singleton'.mpr ⟨π ^ (n - 1) * x, ?_⟩ + have hpow : π ^ (n - 1) * π = π ^ n := by + rw [← pow_succ, Nat.sub_add_cancel hn] + calc + (π ^ (n - 1) * x) * π = (π ^ (n - 1) * π) * x := by ring + _ = π ^ n * x := by rw [hpow] + +/-- the quadratic term in the Hensel update is automatically +in `(π^(n+1))` once `n ≥ 1`. -/ +theorem henselFactorization_span_singleton_pow_mul_pow_mem_succ_of_pos + {R : Type*} [CommRing R] {π x : R} {n : ℕ} (hn : 1 ≤ n) : + π ^ n * (π ^ n * x) ∈ Ideal.span ({π ^ (n + 1)} : Set R) := + henselFactorization_span_singleton_pow_mul_mem_succ + (π := π) (x := π ^ n * x) n + (henselFactorization_pow_mul_mem_span_singleton_of_pos + (π := π) (x := x) hn) + +/-- reversing the sign of a coefficientwise congruence modulo +the principal ideal `(π)`. -/ +theorem henselFactorization_correction_congruence_symm_span_singleton + {R : Type*} [CommRing R] {π : R} {A B : R[X]} + (hcong : ∀ i : ℕ, (A - B).coeff i ∈ Ideal.span ({π} : Set R)) : + ∀ i : ℕ, (B - A).coeff i ∈ Ideal.span ({π} : Set R) := by + intro i + have hneg : + -((A - B).coeff i) ∈ Ideal.span ({π} : Set R) := + (Ideal.span ({π} : Set R)).neg_mem (hcong i) + convert hneg using 1 + simp [Polynomial.coeff_sub] + +/-- the algebraic power-improvement step: if +`f - g h = π^n f_n` and the chosen correction satisfies +`g q + h p ≡ f_n mod π`, then after the update +`g ↦ g + π^n p`, `h ↦ h + π^n q`, every coefficient of the new error lies in +`(π^(n+1))`. -/ +theorem henselFactorization_power_update_error_coeff_mem_span_singleton + {R : Type*} [CommRing R] {π : R} {n : ℕ} (hn : 1 ≤ n) + {f g h fn p q : R[X]} + (hfactor : f - g * h = Polynomial.C (π ^ n) * fn) + (hcorr : + ∀ i : ℕ, (g * q + h * p - fn).coeff i ∈ + Ideal.span ({π} : Set R)) : + ∀ i : ℕ, + (f - (g + Polynomial.C (π ^ n) * p) * + (h + Polynomial.C (π ^ n) * q)).coeff i ∈ + Ideal.span ({π ^ (n + 1)} : Set R) := by + intro i + have hsymm : + (fn - (g * q + h * p)).coeff i ∈ Ideal.span ({π} : Set R) := + henselFactorization_correction_congruence_symm_span_singleton + (π := π) (A := g * q + h * p) (B := fn) hcorr i + have hfirst : + π ^ n * (fn - (g * q + h * p)).coeff i ∈ + Ideal.span ({π ^ (n + 1)} : Set R) := + henselFactorization_span_singleton_pow_mul_mem_succ (π := π) n hsymm + have hsecond : + π ^ n * (π ^ n * (p * q).coeff i) ∈ + Ideal.span ({π ^ (n + 1)} : Set R) := + henselFactorization_span_singleton_pow_mul_pow_mem_succ_of_pos + (π := π) (x := (p * q).coeff i) hn + have herr : + f - (g + Polynomial.C (π ^ n) * p) * + (h + Polynomial.C (π ^ n) * q) = + Polynomial.C (π ^ n) * (fn - (g * q + h * p)) - + Polynomial.C (π ^ n) * (Polynomial.C (π ^ n) * (p * q)) := by + have hf : f = Polynomial.C (π ^ n) * fn + g * h := by + calc + f = (f - g * h) + g * h := by ring + _ = Polynomial.C (π ^ n) * fn + g * h := by rw [hfactor] + rw [hf] + ring + have hcoeff : + (f - (g + Polynomial.C (π ^ n) * p) * + (h + Polynomial.C (π ^ n) * q)).coeff i = + π ^ n * (fn - (g * q + h * p)).coeff i - + π ^ n * (π ^ n * (p * q).coeff i) := by + rw [herr] + simp only [Polynomial.coeff_sub, Polynomial.coeff_C_mul] + rw [hcoeff] + exact (Ideal.span ({π ^ (n + 1)} : Set R)).sub_mem hfirst hsecond + +/-- factor form of the power-improvement step. -/ +theorem henselFactorization_power_update_error_factor_exists + {R : Type*} [CommRing R] {π : R} {n : ℕ} (hn : 1 ≤ n) + {f g h fn p q : R[X]} + (hfactor : f - g * h = Polynomial.C (π ^ n) * fn) + (hcorr : + ∀ i : ℕ, (g * q + h * p - fn).coeff i ∈ + Ideal.span ({π} : Set R)) : + ∃ fnNext : R[X], + f - (g + Polynomial.C (π ^ n) * p) * + (h + Polynomial.C (π ^ n) * q) = + Polynomial.C (π ^ (n + 1)) * fnNext := + henselFactorization_exists_factor_of_coeff_mem_span_singleton + (a := π ^ (n + 1)) + (P := f - (g + Polynomial.C (π ^ n) * p) * + (h + Polynomial.C (π ^ n) * q)) + (henselFactorization_power_update_error_coeff_mem_span_singleton + (π := π) hn hfactor hcorr) + +/-- maximal-ideal correction congruence rewritten through a +principal ideal containing the maximal ideal. -/ +theorem henselFactorization_correction_congruence_span_singleton_of_maximalIdeal_le + {R : Type*} [CommRing R] [IsLocalRing R] {π : R} {A B : R[X]} + (hπ : IsLocalRing.maximalIdeal R ≤ Ideal.span ({π} : Set R)) + (hcong : ∀ i : ℕ, (A - B).coeff i ∈ IsLocalRing.maximalIdeal R) : + ∀ i : ℕ, (A - B).coeff i ∈ Ideal.span ({π} : Set R) := by + intro i + exact hπ (hcong i) + +/-- explicit local-ring form of the power update. This is +the step used in the recursive Hensel construction when the correction +congruence modulo the maximal ideal can be read modulo `(π)`. -/ +theorem henselFactorization_power_update_error_factor_exists_of_maximalIdeal_correction_le + {R : Type*} [CommRing R] [IsLocalRing R] {π : R} {n : ℕ} (hn : 1 ≤ n) + (hπ : IsLocalRing.maximalIdeal R ≤ Ideal.span ({π} : Set R)) + {f g h fn p q : R[X]} + (hfactor : f - g * h = Polynomial.C (π ^ n) * fn) + (hcorr : + ∀ i : ℕ, (g * q + h * p - fn).coeff i ∈ + IsLocalRing.maximalIdeal R) : + ∃ fnNext : R[X], + f - (g + Polynomial.C (π ^ n) * p) * + (h + Polynomial.C (π ^ n) * q) = + Polynomial.C (π ^ (n + 1)) * fnNext := + henselFactorization_power_update_error_factor_exists + (π := π) hn hfactor + (henselFactorization_correction_congruence_span_singleton_of_maximalIdeal_le + (π := π) hπ hcorr) + + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/FiniteApproximation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/FiniteApproximation.lean new file mode 100644 index 0000000000..0d9d388a74 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/FiniteApproximation.lean @@ -0,0 +1,144 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Iteration +/-! +# finite Hensel prefixes + +This file isolates the reusable one-step extension in the finite +Hensel construction. Compatible prefixes themselves are assembled once, as +HenselFactorizationFinitePrefixState, in the next layer. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- extend a finite Hensel prefix by one step in the +displayed-factor principal-element form. The current iterates are automatically +congruent to the initial lifts modulo `(π)`, so the extension uses only +`π ∈ m` and the displayed Bezout-error factor. -/ +theorem henselFactorization_extend_finite_prefix_one_step_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d n : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0 : h0.natDegree ≤ d - m) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) + (pCorr qCorr : ℕ → R[X]) + (hprefix : + ∀ r : ℕ, r ≤ n → + ∃ fr : R[X], + f - henselFactorizationHenselIterate π g0 pCorr r * + henselFactorizationHenselIterate π h0 qCorr r = + Polynomial.C (π ^ (r + 1)) * fr) + {fn : R[X]} + (hfactor : + f - henselFactorizationHenselIterate π g0 pCorr n * + henselFactorizationHenselIterate π h0 qCorr n = + Polynomial.C (π ^ (n + 1)) * fn) + (hgDeg : (henselFactorizationHenselIterate π g0 pCorr n).natDegree ≤ m) + (hhDeg : (henselFactorizationHenselIterate π h0 qCorr n).natDegree ≤ d - m) : + ∃ p q fnNext : R[X], + p.natDegree ≤ m ∧ q.natDegree ≤ d - m ∧ + (∀ r : ℕ, r ≤ n → + ∃ fr : R[X], + f - henselFactorizationHenselIterate π g0 + (Function.update pCorr (n + 1) p) r * + henselFactorizationHenselIterate π h0 + (Function.update qCorr (n + 1) q) r = + Polynomial.C (π ^ (r + 1)) * fr) ∧ + f - henselFactorizationHenselIterate π g0 + (Function.update pCorr (n + 1) p) (n + 1) * + henselFactorizationHenselIterate π h0 + (Function.update qCorr (n + 1) q) (n + 1) = + Polynomial.C (π ^ (n + 2)) * fnNext ∧ + (henselFactorizationHenselIterate π g0 + (Function.update pCorr (n + 1) p) (n + 1)).natDegree ≤ m ∧ + (henselFactorizationHenselIterate π h0 + (Function.update qCorr (n + 1) q) (n + 1)).natDegree ≤ + d - m ∧ + (∀ i : ℕ, + (henselFactorizationHenselIterate π g0 + (Function.update pCorr (n + 1) p) (n + 1) - + g0).coeff i ∈ IsLocalRing.maximalIdeal R) ∧ + (∀ i : ℕ, + (henselFactorizationHenselIterate π h0 + (Function.update qCorr (n + 1) q) (n + 1) - + h0).coeff i ∈ IsLocalRing.maximalIdeal R) := by + have hπpow : π ^ (n + 1) ≠ 0 := pow_ne_zero (n + 1) hπne + have hgSpan : + ∀ i : ℕ, + (henselFactorizationHenselIterate π g0 pCorr n - g0).coeff i ∈ + Ideal.span ({π} : Set R) := + henselFactorization_henselIterate_span_singleton (π := π) g0 pCorr n + have hhSpan : + ∀ i : ℕ, + (henselFactorizationHenselIterate π h0 qCorr n - h0).coeff i ∈ + Ideal.span ({π} : Set R) := + henselFactorization_henselIterate_span_singleton (π := π) h0 qCorr n + rcases henselFactorization_exists_one_step_update_with_degree_bounds_of_mem_span + (π := π) (n := n + 1) (Nat.succ_pos n) hπpow hπmem + (f := f) (g0 := g0) (h0 := h0) + (g := henselFactorizationHenselIterate π g0 pCorr n) + (h := henselFactorizationHenselIterate π h0 qCorr n) + (fn := fn) (a := a) (b := b) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hgSpan hhSpan hgDeg hhDeg hg0map hg0nat hgbar_nat hglead + hh0 hbezFactor hfactor hmd with + ⟨p, q, fnNext, hpDeg, hqDeg, hgNextDeg, hhNextDeg, + _hgNextSpan, _hhNextSpan, hgNextRed, hhNextRed, hfactorNextRaw⟩ + have hfactorNext : + f - (henselFactorizationHenselIterate π g0 pCorr n + + Polynomial.C (π ^ (n + 1)) * p) * + (henselFactorizationHenselIterate π h0 qCorr n + + Polynomial.C (π ^ (n + 1)) * q) = + Polynomial.C (π ^ (n + 2)) * fnNext := by + simpa [Nat.add_assoc] using hfactorNextRaw + refine ⟨p, q, fnNext, hpDeg, hqDeg, ?_, ?_, ?_, ?_, ?_, ?_⟩ + · intro r hr + rcases hprefix r hr with ⟨fr, hfr⟩ + exact ⟨fr, + henselFactorization_henselIterate_update_preserves_factor_of_le + (π := π) (pCorr := pCorr) (qCorr := qCorr) + (n := n) (r := r) hr p q fr hfr⟩ + · exact henselFactorization_henselIterate_update_next_factor + (π := π) (f := f) (g0 := g0) (h0 := h0) + pCorr qCorr n p q fnNext hfactorNext + · rw [henselFactorization_henselIterate_update_next + (π := π) (F0 := g0) (corr := pCorr) (n := n) (c := p)] + exact hgNextDeg + · rw [henselFactorization_henselIterate_update_next + (π := π) (F0 := h0) (corr := qCorr) (n := n) (c := q)] + exact hhNextDeg + · intro i + rw [henselFactorization_henselIterate_update_next + (π := π) (F0 := g0) (corr := pCorr) (n := n) (c := p)] + exact hgNextRed i + · intro i + rw [henselFactorization_henselIterate_update_next + (π := π) (F0 := h0) (corr := qCorr) (n := n) (c := q)] + exact hhNextRed i + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/InfiniteApproximation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/InfiniteApproximation.lean new file mode 100644 index 0000000000..fda6d73a62 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/InfiniteApproximation.lean @@ -0,0 +1,1044 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.FiniteApproximation +/-! +# compatible Hensel prefixes + +This file turns the finite Hensel-prefix construction into a recursive family +of compatible prefixes. The completion/limit argument is kept for the next +layer. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- the data carried by a finite Hensel prefix at stage `N`. +The fields are exactly the invariants needed to extend the prefix one more +step and later pass to the complete limit. -/ +structure HenselFactorizationFinitePrefixState + {R : Type*} [CommRing R] [IsLocalRing R] (π : R) + (f g0 h0 : R[X]) (m d N : ℕ) where + /-- The polynomial corrections for the first factor at each stage. -/ + pCorr : ℕ → R[X] + /-- The polynomial corrections for the second factor at each stage. -/ + qCorr : ℕ → R[X] + /-- The residual error polynomial at the current stage. -/ + fErr : R[X] + /-- Every prefix through the current stage factors the error by the corresponding power of `π`. -/ + prefixFactor : + ∀ r : ℕ, r ≤ N → + ∃ fr : R[X], + f - henselFactorizationHenselIterate π g0 pCorr r * + henselFactorizationHenselIterate π h0 qCorr r = + Polynomial.C (π ^ (r + 1)) * fr + /-- Each correction for the first factor has degree at most `m`. -/ + pCorrDeg : ∀ r : ℕ, (pCorr r).natDegree ≤ m + /-- Each correction for the second factor has degree at most `d - m`. -/ + qCorrDeg : ∀ r : ℕ, (qCorr r).natDegree ≤ d - m + /-- At stage `N`, the factorization error is `π ^ (N + 1)` times `fErr`. -/ + factor : + f - henselFactorizationHenselIterate π g0 pCorr N * + henselFactorizationHenselIterate π h0 qCorr N = + Polynomial.C (π ^ (N + 1)) * fErr + /-- The first approximate factor at stage `N` has degree at most `m`. -/ + gDeg : (henselFactorizationHenselIterate π g0 pCorr N).natDegree ≤ m + /-- The second approximate factor at stage `N` has degree at most `d - m`. -/ + hDeg : (henselFactorizationHenselIterate π h0 qCorr N).natDegree ≤ d - m + /-- The first approximate factor remains congruent to `g0` modulo the maximal ideal. -/ + gRed : + ∀ i : ℕ, + (henselFactorizationHenselIterate π g0 pCorr N - g0).coeff i ∈ + IsLocalRing.maximalIdeal R + /-- The second approximate factor remains congruent to `h0` modulo the maximal ideal. -/ + hRed : + ∀ i : ℕ, + (henselFactorizationHenselIterate π h0 qCorr N - h0).coeff i ∈ + IsLocalRing.maximalIdeal R + +/-- the stage `0` prefix state from a displayed +finite-minimum factor of the initial error. -/ +def henselFactorizationInitialPrefixStateOfFactor + {R : Type*} [CommRing R] [IsLocalRing R] + {π : R} {f g0 h0 f1 : R[X]} {m d : ℕ} + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hg0nat : g0.natDegree = m) + (hh0deg : h0.natDegree ≤ d - m) : + HenselFactorizationFinitePrefixState π f g0 h0 m d 0 := by + refine + { pCorr := fun _ => 0 + qCorr := fun _ => 0 + fErr := f1 + prefixFactor := ?_ + pCorrDeg := ?_ + qCorrDeg := ?_ + factor := ?_ + gDeg := ?_ + hDeg := ?_ + gRed := ?_ + hRed := ?_ } + · intro r hr + have hr0 : r = 0 := Nat.eq_zero_of_le_zero hr + subst r + exact ⟨f1, by simpa using hfactor0⟩ + · intro r + simp + · intro r + simp + · simpa using hfactor0 + · simp [hg0nat] + · simpa using hh0deg + · intro i + simp + · intro i + simp + +/-- Choose an extension of a prefix state by one Hensel correction in the +displayed-factor form. -/ +def henselFactorizationChosenNextPrefixStateOfMemSpan + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d N : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) + (s : HenselFactorizationFinitePrefixState π f g0 h0 m d N) : + HenselFactorizationFinitePrefixState π f g0 h0 m d (N + 1) := by + classical + let hstep := henselFactorization_extend_finite_prefix_one_step_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (e := e) + (gbar := gbar) (m := m) (d := d) (n := N) + hf hg0map hg0nat hgbar_nat hglead hh0deg hbezFactor hmd + s.pCorr s.qCorr s.prefixFactor s.factor s.gDeg s.hDeg + let p := Classical.choose hstep + have hpstep := Classical.choose_spec hstep + let q := Classical.choose hpstep + have hqstep := Classical.choose_spec hpstep + let fnNext := Classical.choose hqstep + have hspec := Classical.choose_spec hqstep + have hpdeg : p.natDegree ≤ m := hspec.1 + have hqdeg : q.natDegree ≤ d - m := hspec.2.1 + have hprefixOld : + ∀ r : ℕ, r ≤ N → + ∃ fr : R[X], + f - henselFactorizationHenselIterate π g0 + (Function.update s.pCorr (N + 1) p) r * + henselFactorizationHenselIterate π h0 + (Function.update s.qCorr (N + 1) q) r = + Polynomial.C (π ^ (r + 1)) * fr := hspec.2.2.1 + have hfactorNext : + f - henselFactorizationHenselIterate π g0 + (Function.update s.pCorr (N + 1) p) (N + 1) * + henselFactorizationHenselIterate π h0 + (Function.update s.qCorr (N + 1) q) (N + 1) = + Polynomial.C (π ^ (N + 2)) * fnNext := hspec.2.2.2.1 + have hgNextDeg : + (henselFactorizationHenselIterate π g0 + (Function.update s.pCorr (N + 1) p) (N + 1)).natDegree ≤ m := + hspec.2.2.2.2.1 + have hhNextDeg : + (henselFactorizationHenselIterate π h0 + (Function.update s.qCorr (N + 1) q) (N + 1)).natDegree ≤ d - m := + hspec.2.2.2.2.2.1 + have hgNextRed : + ∀ i : ℕ, + (henselFactorizationHenselIterate π g0 + (Function.update s.pCorr (N + 1) p) (N + 1) - g0).coeff i ∈ + IsLocalRing.maximalIdeal R := + hspec.2.2.2.2.2.2.1 + have hhNextRed : + ∀ i : ℕ, + (henselFactorizationHenselIterate π h0 + (Function.update s.qCorr (N + 1) q) (N + 1) - h0).coeff i ∈ + IsLocalRing.maximalIdeal R := + hspec.2.2.2.2.2.2.2 + refine + { pCorr := Function.update s.pCorr (N + 1) p + qCorr := Function.update s.qCorr (N + 1) q + fErr := fnNext + prefixFactor := ?_ + pCorrDeg := ?_ + qCorrDeg := ?_ + factor := ?_ + gDeg := hgNextDeg + hDeg := hhNextDeg + gRed := hgNextRed + hRed := hhNextRed } + · intro r hr + by_cases htop : r = N + 1 + · subst r + exact ⟨fnNext, by simpa [Nat.add_assoc] using hfactorNext⟩ + · have hrn : r ≤ N := Nat.lt_succ_iff.mp (lt_of_le_of_ne hr htop) + exact hprefixOld r hrn + · exact henselFactorization_update_corr_natDegree_le s.pCorrDeg hpdeg + · exact henselFactorization_update_corr_natDegree_le s.qCorrDeg hqdeg + · simpa [Nat.add_assoc] using hfactorNext + +/-- in the displayed-factor prefix extension the `p` +correction changes only at the newly constructed index. -/ +theorem henselFactorization_chosenNextPrefixState_pCorr_of_ne_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d N r : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) + (s : HenselFactorizationFinitePrefixState π f g0 h0 m d N) + (hr : r ≠ N + 1) : + (henselFactorizationChosenNextPrefixStateOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (e := e) + (gbar := gbar) (m := m) (d := d) (N := N) + hf hg0map hg0nat hgbar_nat hglead hh0deg hbezFactor hmd s).pCorr r = + s.pCorr r := by + unfold henselFactorizationChosenNextPrefixStateOfMemSpan + simp [Function.update_of_ne hr] + +/-- in the displayed-factor prefix extension the `q` +correction changes only at the newly constructed index. -/ +theorem henselFactorization_chosenNextPrefixState_qCorr_of_ne_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d N r : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) + (s : HenselFactorizationFinitePrefixState π f g0 h0 m d N) + (hr : r ≠ N + 1) : + (henselFactorizationChosenNextPrefixStateOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (e := e) + (gbar := gbar) (m := m) (d := d) (N := N) + hf hg0map hg0nat hgbar_nat hglead hh0deg hbezFactor hmd s).qCorr r = + s.qCorr r := by + unfold henselFactorizationChosenNextPrefixStateOfMemSpan + simp [Function.update_of_ne hr] + +/-- recursively chosen compatible finite Hensel prefixes in +the displayed-factor displayed-factor form. -/ +def henselFactorizationPrefixStateSeqOfMemSpan + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) : + (N : ℕ) → HenselFactorizationFinitePrefixState π f g0 h0 m d N + | 0 => + henselFactorizationInitialPrefixStateOfFactor + (π := π) (f := f) (g0 := g0) (h0 := h0) + (f1 := f1) (m := m) (d := d) + hfactor0 hg0nat hh0deg + | N + 1 => + henselFactorizationChosenNextPrefixStateOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (e := e) + (gbar := gbar) (m := m) (d := d) (N := N) + hf hg0map hg0nat hgbar_nat hglead hh0deg hbezFactor hmd + (henselFactorizationPrefixStateSeqOfMemSpan + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd N) + +/-- coherence of the displayed-factor `p`-corrections: +later prefix states agree with earlier ones at every already constructed +index. -/ +theorem henselFactorization_prefixStateSeq_pCorr_eq_of_le_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) : + ∀ {M N : ℕ}, M ≤ N → + (henselFactorizationPrefixStateSeqOfMemSpan + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd N).pCorr M = + (henselFactorizationPrefixStateSeqOfMemSpan + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd M).pCorr M := by + intro M N hMN + induction N generalizing M with + | zero => + have hM0 : M = 0 := Nat.eq_zero_of_le_zero hMN + subst M + rfl + | succ N ih => + by_cases htop : M = N + 1 + · subst M + rfl + · have hMN' : M ≤ N := Nat.lt_succ_iff.mp (lt_of_le_of_ne hMN htop) + calc + (henselFactorizationPrefixStateSeqOfMemSpan + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd (N + 1)).pCorr M = + (henselFactorizationPrefixStateSeqOfMemSpan + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd N).pCorr M := by + simpa [henselFactorizationPrefixStateSeqOfMemSpan] using + henselFactorization_chosenNextPrefixState_pCorr_of_ne_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (e := e) + (gbar := gbar) (m := m) (d := d) (N := N) (r := M) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hbezFactor hmd + (henselFactorizationPrefixStateSeqOfMemSpan + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd N) + htop + _ = + (henselFactorizationPrefixStateSeqOfMemSpan + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd M).pCorr M := ih hMN' + +/-- coherence of the displayed-factor `q`-corrections: +later prefix states agree with earlier ones at every already constructed +index. -/ +theorem henselFactorization_prefixStateSeq_qCorr_eq_of_le_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) : + ∀ {M N : ℕ}, M ≤ N → + (henselFactorizationPrefixStateSeqOfMemSpan + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd N).qCorr M = + (henselFactorizationPrefixStateSeqOfMemSpan + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd M).qCorr M := by + intro M N hMN + induction N generalizing M with + | zero => + have hM0 : M = 0 := Nat.eq_zero_of_le_zero hMN + subst M + rfl + | succ N ih => + by_cases htop : M = N + 1 + · subst M + rfl + · have hMN' : M ≤ N := Nat.lt_succ_iff.mp (lt_of_le_of_ne hMN htop) + calc + (henselFactorizationPrefixStateSeqOfMemSpan + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd (N + 1)).qCorr M = + (henselFactorizationPrefixStateSeqOfMemSpan + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd N).qCorr M := by + simpa [henselFactorizationPrefixStateSeqOfMemSpan] using + henselFactorization_chosenNextPrefixState_qCorr_of_ne_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (e := e) + (gbar := gbar) (m := m) (d := d) (N := N) (r := M) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hbezFactor hmd + (henselFactorizationPrefixStateSeqOfMemSpan + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd N) + htop + _ = + (henselFactorizationPrefixStateSeqOfMemSpan + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd M).qCorr M := ih hMN' + +/-- the infinite `p`-correction sequence from the +displayed-factor displayed-factor prefix construction. -/ +def henselFactorizationInfinitePCorrOfMemSpan + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) (n : ℕ) : R[X] := + (henselFactorizationPrefixStateSeqOfMemSpan + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd n).pCorr n + +/-- the infinite `q`-correction sequence from the +displayed-factor displayed-factor prefix construction. -/ +def henselFactorizationInfiniteQCorrOfMemSpan + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) (n : ℕ) : R[X] := + (henselFactorizationPrefixStateSeqOfMemSpan + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd n).qCorr n + +/-- the displayed-factor infinite `p`-corrections retain the +stated degree bound. -/ +theorem henselFactorization_infinitePCorr_natDegree_le_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) : + ∀ n : ℕ, + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd n).natDegree ≤ m := by + intro n + unfold henselFactorizationInfinitePCorrOfMemSpan + exact + (henselFactorizationPrefixStateSeqOfMemSpan + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd n).pCorrDeg n + +/-- the displayed-factor infinite `q`-corrections retain the +stated degree bound. -/ +theorem henselFactorization_infiniteQCorr_natDegree_le_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) : + ∀ n : ℕ, + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd n).natDegree ≤ d - m := by + intro n + unfold henselFactorizationInfiniteQCorrOfMemSpan + exact + (henselFactorizationPrefixStateSeqOfMemSpan + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd n).qCorrDeg n + +/-- a displayed-factor finite prefix state's +`p`-correction agrees with the extracted infinite `p`-correction at every +constructed index. -/ +theorem henselFactorization_prefixStateSeq_pCorr_eq_infinite_of_le_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) : + ∀ {r N : ℕ}, r ≤ N → + (henselFactorizationPrefixStateSeqOfMemSpan + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd N).pCorr r = + henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd r := by + intro r N hr + unfold henselFactorizationInfinitePCorrOfMemSpan + exact henselFactorization_prefixStateSeq_pCorr_eq_of_le_of_mem_span + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd hr + +/-- a displayed-factor finite prefix state's +`q`-correction agrees with the extracted infinite `q`-correction at every +constructed index. -/ +theorem henselFactorization_prefixStateSeq_qCorr_eq_infinite_of_le_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) : + ∀ {r N : ℕ}, r ≤ N → + (henselFactorizationPrefixStateSeqOfMemSpan + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd N).qCorr r = + henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd r := by + intro r N hr + unfold henselFactorizationInfiniteQCorrOfMemSpan + exact henselFactorization_prefixStateSeq_qCorr_eq_of_le_of_mem_span + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd hr + +/-- every finite displayed-factor factorization invariant +transfers from the coherent prefix states to the extracted infinite correction +sequences. -/ +theorem henselFactorization_infiniteCorr_factor_prefix_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) : + ∀ N : ℕ, + ∃ fN : R[X], + f - henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) N * + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) N = + Polynomial.C (π ^ (N + 1)) * fN := by + intro N + let S := + henselFactorizationPrefixStateSeqOfMemSpan + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd N + have hp : + henselFactorizationHenselIterate π g0 S.pCorr N = + henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + N := by + apply henselFactorization_henselIterate_eq_of_corr_eq_le + intro k hk + simpa [S] using + henselFactorization_prefixStateSeq_pCorr_eq_infinite_of_le_of_mem_span + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd (r := k) (N := N) hk + have hq : + henselFactorizationHenselIterate π h0 S.qCorr N = + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + N := by + apply henselFactorization_henselIterate_eq_of_corr_eq_le + intro k hk + simpa [S] using + henselFactorization_prefixStateSeq_qCorr_eq_infinite_of_le_of_mem_span + (π := π) (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd (r := k) (N := N) hk + exact ⟨S.fErr, by simpa [S, hp, hq] using S.factor⟩ + +/-- the factorization error of the displayed-factor infinite +approximants is coefficientwise in the corresponding high power of the +maximal ideal. -/ +theorem henselFactorization_infiniteCorr_error_coeff_mem_maximalIdeal_pow_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) : + ∀ N i : ℕ, + (f - henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) N * + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) N).coeff i ∈ + IsLocalRing.maximalIdeal R ^ (N + 1) := by + intro N i + rcases henselFactorization_infiniteCorr_factor_prefix_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd N with + ⟨fN, hfactor⟩ + exact henselFactorization_coeff_mem_maximalIdeal_pow_of_factor_of_mem + (π := π) (n := N + 1) hπmem hfactor i + +/-- the displayed-factor `g`-approximants keep the construction +degree bound. -/ +theorem henselFactorization_infiniteGIter_natDegree_le_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) : + ∀ N : ℕ, + (henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + N).natDegree ≤ m := by + exact henselFactorization_henselIterate_natDegree_le + (π := π) (F0 := g0) + (corr := henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + (M := m) + (by simp [hg0nat]) + (henselFactorization_infinitePCorr_natDegree_le_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + +/-- the displayed-factor `h`-approximants keep the construction +degree bound. -/ +theorem henselFactorization_infiniteHIter_natDegree_le_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) : + ∀ N : ℕ, + (henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + N).natDegree ≤ d - m := by + exact henselFactorization_henselIterate_natDegree_le + (π := π) (F0 := h0) + (corr := henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + (M := d - m) + hh0deg + (henselFactorization_infiniteQCorr_natDegree_le_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + +/-- the displayed-factor infinite `g`-approximants keep the +original residual class of `g0`. -/ +theorem henselFactorization_infiniteGIter_reduction_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) : + ∀ N i : ℕ, + (henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + N - g0).coeff i ∈ + IsLocalRing.maximalIdeal R := + henselFactorization_henselIterate_reduction_of_mem + (π := π) hπmem g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + +/-- the displayed-factor infinite `h`-approximants keep the +original residual class of `h0`. -/ +theorem henselFactorization_infiniteHIter_reduction_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) : + ∀ N i : ℕ, + (henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + N - h0).coeff i ∈ + IsLocalRing.maximalIdeal R := + henselFactorization_henselIterate_reduction_of_mem + (π := π) hπmem h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + +/-- coefficientwise Cauchy estimate for the displayed-factor +infinite `g`-approximants. -/ +theorem henselFactorization_infiniteGIter_sub_coeff_mem_maximalIdeal_pow_of_le_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) : + ∀ {M N : ℕ}, M ≤ N → ∀ i : ℕ, + (henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + N - + henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + M).coeff i ∈ + IsLocalRing.maximalIdeal R ^ (M + 1) := + henselFactorization_henselIterate_sub_coeff_mem_maximalIdeal_pow_of_le_of_mem + (π := π) hπmem g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + +/-- coefficientwise Cauchy estimate for the displayed-factor +infinite `h`-approximants. -/ +theorem henselFactorization_infiniteHIter_sub_coeff_mem_maximalIdeal_pow_of_le_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) : + ∀ {M N : ℕ}, M ≤ N → ∀ i : ℕ, + (henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + N - + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + M).coeff i ∈ + IsLocalRing.maximalIdeal R ^ (M + 1) := + henselFactorization_henselIterate_sub_coeff_mem_maximalIdeal_pow_of_le_of_mem + (π := π) hπmem h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Iteration.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Iteration.lean new file mode 100644 index 0000000000..77f4ba06f0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Iteration.lean @@ -0,0 +1,366 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Step +/-! +# recursive Hensel iterates + +This file records the recursive polynomial iterates used in the proof +of Hensel's lemma and the coefficientwise adic estimates needed for the later +completion argument. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- the recursive polynomial sequence +`F_{n+1}=F_n+π^(n+1)c_{n+1}` used for either factor in Hensel's iteration. -/ +def henselFactorizationHenselIterate {R : Type*} [CommRing R] + (π : R) (F0 : R[X]) (corr : ℕ → R[X]) : ℕ → R[X] + | 0 => F0 + | n + 1 => + henselFactorizationHenselIterate π F0 corr n + + Polynomial.C (π ^ (n + 1)) * corr (n + 1) + +@[simp] +theorem henselFactorization_henselIterate_zero + {R : Type*} [CommRing R] (π : R) (F0 : R[X]) (corr : ℕ → R[X]) : + henselFactorizationHenselIterate π F0 corr 0 = F0 := + rfl + +@[simp] +theorem henselFactorization_henselIterate_succ + {R : Type*} [CommRing R] (π : R) (F0 : R[X]) (corr : ℕ → R[X]) + (n : ℕ) : + henselFactorizationHenselIterate π F0 corr (n + 1) = + henselFactorizationHenselIterate π F0 corr n + + Polynomial.C (π ^ (n + 1)) * corr (n + 1) := + rfl + +/-- every recursive iterate has the same reduction as the +initial lift modulo the maximal ideal. -/ +theorem henselFactorization_henselIterate_reduction_of_mem + {R : Type*} [CommRing R] [IsLocalRing R] {π : R} + (hπ : π ∈ IsLocalRing.maximalIdeal R) + (F0 : R[X]) (corr : ℕ → R[X]) : + ∀ n i : ℕ, + (henselFactorizationHenselIterate π F0 corr n - F0).coeff i ∈ + IsLocalRing.maximalIdeal R := by + intro n + induction n with + | zero => + intro i + simp + | succ n ih => + intro i + simpa [henselFactorization_henselIterate_succ] using + (henselFactorization_update_preserves_reduction_of_mem + (π := π) (n := n + 1) + (g := henselFactorizationHenselIterate π F0 corr n) + (g0 := F0) (p := corr (n + 1)) + (Nat.succ_pos n) hπ ih i) + +/-- every recursive iterate is congruent to its initial lift +modulo `(π)`. This is built into the update formula and does not require +`(π)` to be the maximal ideal. -/ +theorem henselFactorization_henselIterate_span_singleton + {R : Type*} [CommRing R] {π : R} + (F0 : R[X]) (corr : ℕ → R[X]) : + ∀ n i : ℕ, + (henselFactorizationHenselIterate π F0 corr n - F0).coeff i ∈ + Ideal.span ({π} : Set R) := by + intro n + induction n with + | zero => + intro i + simp + | succ n ih => + intro i + simpa [henselFactorization_henselIterate_succ] using + (henselFactorization_update_preserves_span_singleton + (π := π) (n := n + 1) + (g := henselFactorizationHenselIterate π F0 corr n) + (g0 := F0) (p := corr (n + 1)) + (Nat.succ_pos n) ih i) + +/-- if the initial polynomial and all correction polynomials +have degree at most `M`, then every recursive iterate has degree at most +`M`. -/ +theorem henselFactorization_henselIterate_natDegree_le + {R : Type*} [CommRing R] {π : R} {F0 : R[X]} {corr : ℕ → R[X]} {M : ℕ} + (hF0 : F0.natDegree ≤ M) + (hcorr : ∀ n : ℕ, (corr n).natDegree ≤ M) : + ∀ n : ℕ, (henselFactorizationHenselIterate π F0 corr n).natDegree ≤ M := by + intro n + induction n with + | zero => + simpa using hF0 + | succ n ih => + rw [henselFactorization_henselIterate_succ] + have hterm : + (Polynomial.C (π ^ (n + 1)) * corr (n + 1)).natDegree ≤ M := + (Polynomial.natDegree_C_mul_le (π ^ (n + 1)) (corr (n + 1))).trans + (hcorr (n + 1)) + exact Polynomial.natDegree_add_le_of_degree_le ih hterm + +/-- an iterate only depends on the correction coefficients up +to its own index. -/ +theorem henselFactorization_henselIterate_eq_of_corr_eq_le + {R : Type*} [CommRing R] {π : R} {F0 : R[X]} + {corr corr' : ℕ → R[X]} : + ∀ n : ℕ, + (∀ k : ℕ, k ≤ n → corr k = corr' k) → + henselFactorizationHenselIterate π F0 corr n = + henselFactorizationHenselIterate π F0 corr' n := by + intro n hcorr + induction n with + | zero => + rfl + | succ n ih => + rw [henselFactorization_henselIterate_succ, + henselFactorization_henselIterate_succ] + have hprev : + henselFactorizationHenselIterate π F0 corr n = + henselFactorizationHenselIterate π F0 corr' n := + ih (by + intro k hk + exact hcorr k (Nat.le_trans hk (Nat.le_succ n))) + rw [hprev, hcorr (n + 1) le_rfl] + +/-- changing a correction coefficient at a later index does +not change an earlier Hensel iterate. -/ +theorem henselFactorization_henselIterate_update_of_lt + {R : Type*} [CommRing R] (π : R) (F0 : R[X]) + (corr : ℕ → R[X]) {n k : ℕ} (c : R[X]) (h : n < k) : + henselFactorizationHenselIterate π F0 (Function.update corr k c) n = + henselFactorizationHenselIterate π F0 corr n := by + induction n with + | zero => + rfl + | succ n ih => + rw [henselFactorization_henselIterate_succ, + henselFactorization_henselIterate_succ] + have hnlt : n < k := lt_trans (Nat.lt_succ_self n) h + rw [ih hnlt] + have hne : n + 1 ≠ k := ne_of_lt h + rw [Function.update_of_ne hne] + +/-- extending the correction sequence at the next index gives +the expected next Hensel iterate. -/ +theorem henselFactorization_henselIterate_update_next + {R : Type*} [CommRing R] (π : R) (F0 : R[X]) + (corr : ℕ → R[X]) (n : ℕ) (c : R[X]) : + henselFactorizationHenselIterate π F0 + (Function.update corr (n + 1) c) (n + 1) = + henselFactorizationHenselIterate π F0 corr n + + Polynomial.C (π ^ (n + 1)) * c := by + rw [henselFactorization_henselIterate_succ] + rw [henselFactorization_henselIterate_update_of_lt + (π := π) (F0 := F0) (corr := corr) (c := c) (Nat.lt_succ_self n)] + rw [Function.update_self] + +/-- updating the correction functions at `n+1` preserves all +factorization invariants already established up to stage `n`. -/ +theorem henselFactorization_henselIterate_update_preserves_factor_of_le + {R : Type*} [CommRing R] {π : R} + {f g0 h0 : R[X]} (pCorr qCorr : ℕ → R[X]) + {n r : ℕ} (hr : r ≤ n) (p q fn : R[X]) + (hfactor : + f - henselFactorizationHenselIterate π g0 pCorr r * + henselFactorizationHenselIterate π h0 qCorr r = + Polynomial.C (π ^ (r + 1)) * fn) : + f - henselFactorizationHenselIterate π g0 + (Function.update pCorr (n + 1) p) r * + henselFactorizationHenselIterate π h0 + (Function.update qCorr (n + 1) q) r = + Polynomial.C (π ^ (r + 1)) * fn := by + have hrlt : r < n + 1 := Nat.lt_succ_of_le hr + rw [henselFactorization_henselIterate_update_of_lt + (π := π) (F0 := g0) (corr := pCorr) (c := p) hrlt, + henselFactorization_henselIterate_update_of_lt + (π := π) (F0 := h0) (corr := qCorr) (c := q) hrlt] + exact hfactor + +/-- the one-step factorization statement rewritten in terms +of the updated Hensel iterates. -/ +theorem henselFactorization_henselIterate_update_next_factor + {R : Type*} [CommRing R] {π : R} + {f g0 h0 : R[X]} (pCorr qCorr : ℕ → R[X]) + (n : ℕ) (p q fnNext : R[X]) + (hfactorNext : + f - (henselFactorizationHenselIterate π g0 pCorr n + + Polynomial.C (π ^ (n + 1)) * p) * + (henselFactorizationHenselIterate π h0 qCorr n + + Polynomial.C (π ^ (n + 1)) * q) = + Polynomial.C (π ^ (n + 2)) * fnNext) : + f - henselFactorizationHenselIterate π g0 + (Function.update pCorr (n + 1) p) (n + 1) * + henselFactorizationHenselIterate π h0 + (Function.update qCorr (n + 1) q) (n + 1) = + Polynomial.C (π ^ (n + 2)) * fnNext := by + rw [henselFactorization_henselIterate_update_next + (π := π) (F0 := g0) (corr := pCorr) (c := p), + henselFactorization_henselIterate_update_next + (π := π) (F0 := h0) (corr := qCorr) (c := q)] + exact hfactorNext + +/-- a global correction-degree bound is preserved when one +correction coefficient is replaced by another coefficient satisfying the same +bound. -/ +theorem henselFactorization_update_corr_natDegree_le + {R : Type*} [CommRing R] {corr : ℕ → R[X]} {k M : ℕ} {c : R[X]} + (hcorr : ∀ r : ℕ, (corr r).natDegree ≤ M) + (hc : c.natDegree ≤ M) : + ∀ r : ℕ, ((Function.update corr k c) r).natDegree ≤ M := by + intro r + by_cases h : r = k + · subst r + simpa [Function.update_self] using hc + · rw [Function.update_of_ne h] + exact hcorr r + +/-- the increment from step `n` to step `n+1` is exactly the +chosen `π^(n+1)`-multiple. -/ +theorem henselFactorization_henselIterate_succ_sub_eq + {R : Type*} [CommRing R] (π : R) (F0 : R[X]) (corr : ℕ → R[X]) + (n : ℕ) : + henselFactorizationHenselIterate π F0 corr (n + 1) - + henselFactorizationHenselIterate π F0 corr n = + Polynomial.C (π ^ (n + 1)) * corr (n + 1) := by + rw [henselFactorization_henselIterate_succ] + ring + +/-- coefficient form of the increment estimate in the +principal ideal `(π^(n+1))`. -/ +theorem henselFactorization_henselIterate_succ_sub_coeff_mem_span_singleton_pow + {R : Type*} [CommRing R] {π : R} (F0 : R[X]) (corr : ℕ → R[X]) + (n i : ℕ) : + (henselFactorizationHenselIterate π F0 corr (n + 1) - + henselFactorizationHenselIterate π F0 corr n).coeff i ∈ + Ideal.span ({π ^ (n + 1)} : Set R) := by + rw [henselFactorization_henselIterate_succ_sub_eq, Polynomial.coeff_C_mul] + refine Ideal.mem_span_singleton'.mpr ⟨(corr (n + 1)).coeff i, ?_⟩ + ring + +/-- coefficient form of the increment estimate in the +`(n+1)`-st power of the principal ideal `(π)`. -/ +theorem henselFactorization_henselIterate_succ_sub_coeff_mem_span_pow + {R : Type*} [CommRing R] {π : R} (F0 : R[X]) (corr : ℕ → R[X]) + (n i : ℕ) : + (henselFactorizationHenselIterate π F0 corr (n + 1) - + henselFactorizationHenselIterate π F0 corr n).coeff i ∈ + Ideal.span ({π} : Set R) ^ (n + 1) := by + rw [Ideal.span_singleton_pow] + exact henselFactorization_henselIterate_succ_sub_coeff_mem_span_singleton_pow + F0 corr n i + +/-- coefficient form of the increment estimate in the +`(n+1)`-st power of the maximal ideal, using only `π ∈ m`. -/ +theorem henselFactorization_henselIterate_succ_sub_coeff_mem_maximalIdeal_pow_of_mem + {R : Type*} [CommRing R] [IsLocalRing R] {π : R} + (hπ : π ∈ IsLocalRing.maximalIdeal R) + (F0 : R[X]) (corr : ℕ → R[X]) (n i : ℕ) : + (henselFactorizationHenselIterate π F0 corr (n + 1) - + henselFactorizationHenselIterate π F0 corr n).coeff i ∈ + IsLocalRing.maximalIdeal R ^ (n + 1) := + henselFactorization_coeff_mem_maximalIdeal_pow_of_factor_of_mem + (π := π) (n := n + 1) hπ + (henselFactorization_henselIterate_succ_sub_eq π F0 corr n) i + +/-- Cauchy-control estimate for two iterates: for `m ≤ n`, +their coefficient difference lies in the `(m+1)`-st power of the maximal +ideal. -/ +theorem henselFactorization_henselIterate_sub_coeff_mem_maximalIdeal_pow_of_le_of_mem + {R : Type*} [CommRing R] [IsLocalRing R] {π : R} + (hπ : π ∈ IsLocalRing.maximalIdeal R) + (F0 : R[X]) (corr : ℕ → R[X]) : + ∀ {m n : ℕ}, m ≤ n → ∀ i : ℕ, + (henselFactorizationHenselIterate π F0 corr n - + henselFactorizationHenselIterate π F0 corr m).coeff i ∈ + IsLocalRing.maximalIdeal R ^ (m + 1) := by + intro m n hmn + induction n generalizing m with + | zero => + intro i + have hm0 : m = 0 := Nat.eq_zero_of_le_zero hmn + simp [hm0] + | succ n ih => + intro i + by_cases hm : m = n + 1 + · simp [hm] + · have hmle : m ≤ n := Nat.lt_succ_iff.mp (lt_of_le_of_ne hmn hm) + have hprev := ih hmle i + have hincr : + (henselFactorizationHenselIterate π F0 corr (n + 1) - + henselFactorizationHenselIterate π F0 corr n).coeff i ∈ + IsLocalRing.maximalIdeal R ^ (m + 1) := + (Ideal.pow_le_pow_right (Nat.succ_le_succ hmle)) + (henselFactorization_henselIterate_succ_sub_coeff_mem_maximalIdeal_pow_of_mem + (π := π) hπ F0 corr n i) + have hsplit : + henselFactorizationHenselIterate π F0 corr (n + 1) - + henselFactorizationHenselIterate π F0 corr m = + (henselFactorizationHenselIterate π F0 corr n - + henselFactorizationHenselIterate π F0 corr m) + + (henselFactorizationHenselIterate π F0 corr (n + 1) - + henselFactorizationHenselIterate π F0 corr n) := by + ring + rw [hsplit, Polynomial.coeff_add] + exact (IsLocalRing.maximalIdeal R ^ (m + 1)).add_mem hprev hincr + +/-- Cauchy-control estimate for two iterates in the +principal-ideal filtration generated by `π`. -/ +theorem henselFactorization_henselIterate_sub_coeff_mem_span_pow_of_le + {R : Type*} [CommRing R] {π : R} + (F0 : R[X]) (corr : ℕ → R[X]) : + ∀ {m n : ℕ}, m ≤ n → ∀ i : ℕ, + (henselFactorizationHenselIterate π F0 corr n - + henselFactorizationHenselIterate π F0 corr m).coeff i ∈ + Ideal.span ({π} : Set R) ^ (m + 1) := by + intro m n hmn + induction n generalizing m with + | zero => + intro i + have hm0 : m = 0 := Nat.eq_zero_of_le_zero hmn + simp [hm0] + | succ n ih => + intro i + by_cases hm : m = n + 1 + · simp [hm] + · have hmle : m ≤ n := Nat.lt_succ_iff.mp (lt_of_le_of_ne hmn hm) + have hprev := ih hmle i + have hincr : + (henselFactorizationHenselIterate π F0 corr (n + 1) - + henselFactorizationHenselIterate π F0 corr n).coeff i ∈ + Ideal.span ({π} : Set R) ^ (m + 1) := + (Ideal.pow_le_pow_right (Nat.succ_le_succ hmle)) + (henselFactorization_henselIterate_succ_sub_coeff_mem_span_pow + F0 corr n i) + have hsplit : + henselFactorizationHenselIterate π F0 corr (n + 1) - + henselFactorizationHenselIterate π F0 corr m = + (henselFactorizationHenselIterate π F0 corr n - + henselFactorizationHenselIterate π F0 corr m) + + (henselFactorizationHenselIterate π F0 corr (n + 1) - + henselFactorizationHenselIterate π F0 corr n) := by + ring + rw [hsplit, Polynomial.coeff_add] + exact (Ideal.span ({π} : Set R) ^ (m + 1)).add_mem hprev hincr + + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/PrincipalLimits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/PrincipalLimits.lean new file mode 100644 index 0000000000..a11922207f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/PrincipalLimits.lean @@ -0,0 +1,446 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.InfiniteApproximation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.AdicLimits +/-! +# principal-ideal limit route + +This file keeps the Hensel limit step in the filtration generated by the +chosen chosen element `π`. This is the route needed for complete valued fields +whose maximal ideal is not assumed principal or adically separated. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- displayed-factor infinite `g`-approximants are Cauchy for +the principal-ideal filtration generated by the chosen `π`. -/ +theorem henselFactorization_infiniteG_coeff_spanAdicCoeffCauchy_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) (i : ℕ) : + henselFactorizationAdicCoeffCauchy (Ideal.span ({π} : Set R)) + (fun N : ℕ => + (henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + N).coeff i) := by + exact henselFactorization_coeff_adicCoeffCauchy_of_sub_coeff_mem + (Ideal.span ({π} : Set R)) + (Pseq := fun N : ℕ => + henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + N) + (by + intro M N hMN i + exact henselFactorization_henselIterate_sub_coeff_mem_span_pow_of_le + (π := π) g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + hMN i) + i + +/-- principal-filtration polynomial limit for the +displayed-factor infinite `g`-approximants. -/ +theorem henselFactorization_exists_infiniteG_spanLimitPolynomial_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} [IsPrecomplete (Ideal.span ({π} : Set R)) R] + (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) : + ∃ G : R[X], G.natDegree ≤ m ∧ + ∀ n i : ℕ, + (henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) n - G).coeff i ∈ + Ideal.span ({π} : Set R) ^ n := by + exact + henselFactorization_exists_limitPolynomial_of_bounded_coeffLimits + (Ideal.span ({π} : Set R)) + (N := m) + (Pseq := fun n : ℕ => + henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + n) + (henselFactorization_infiniteGIter_natDegree_le_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + (fun i => + henselFactorization_infiniteG_coeff_spanAdicCoeffCauchy_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd i) + +/-- displayed-factor infinite `h`-approximants are Cauchy for +the principal-ideal filtration generated by the chosen `π`. -/ +theorem henselFactorization_infiniteH_coeff_spanAdicCoeffCauchy_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) (i : ℕ) : + henselFactorizationAdicCoeffCauchy (Ideal.span ({π} : Set R)) + (fun N : ℕ => + (henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + N).coeff i) := by + exact henselFactorization_coeff_adicCoeffCauchy_of_sub_coeff_mem + (Ideal.span ({π} : Set R)) + (Pseq := fun N : ℕ => + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + N) + (by + intro M N hMN i + exact henselFactorization_henselIterate_sub_coeff_mem_span_pow_of_le + (π := π) h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + hMN i) + i + +/-- principal-filtration polynomial limit for the +displayed-factor infinite `h`-approximants. -/ +theorem henselFactorization_exists_infiniteH_spanLimitPolynomial_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} [IsPrecomplete (Ideal.span ({π} : Set R)) R] + (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) : + ∃ H : R[X], H.natDegree ≤ d - m ∧ + ∀ n i : ℕ, + (henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) n - H).coeff i ∈ + Ideal.span ({π} : Set R) ^ n := by + exact + henselFactorization_exists_limitPolynomial_of_bounded_coeffLimits + (Ideal.span ({π} : Set R)) + (N := d - m) + (Pseq := fun n : ℕ => + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + n) + (henselFactorization_infiniteHIter_natDegree_le_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + (fun i => + henselFactorization_infiniteH_coeff_spanAdicCoeffCauchy_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd i) + +/-- displayed-factor error estimate in the principal +filtration generated by `π`. -/ +theorem henselFactorization_infiniteCorr_error_coeff_mem_span_pow_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) : + ∀ N i : ℕ, + (f - henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) N * + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) N).coeff i ∈ + Ideal.span ({π} : Set R) ^ (N + 1) := by + intro N i + rcases henselFactorization_infiniteCorr_factor_prefix_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd N with + ⟨fN, hfactor⟩ + exact henselFactorization_coeff_mem_span_pow_of_factor + (π := π) (n := N + 1) hfactor i + +/-- complete-limit factorization from displayed initial +principal-element errors, using the `π`-adic principal filtration. -/ +theorem henselFactorization_exists_limit_factorization_of_mem_span_principal + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} [IsPrecomplete (Ideal.span ({π} : Set R)) R] + [IsHausdorff (Ideal.span ({π} : Set R)) R] + (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar hbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hh0map : h0.map (IsLocalRing.residue R) = hbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) : + ∃ G H : R[X], + G.natDegree ≤ m ∧ H.natDegree ≤ d - m ∧ f = G * H ∧ + G.map (IsLocalRing.residue R) = gbar ∧ + H.map (IsLocalRing.residue R) = hbar := by + rcases henselFactorization_exists_infiniteG_spanLimitPolynomial_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd with + ⟨G, hGdeg, hGlim⟩ + rcases henselFactorization_exists_infiniteH_spanLimitPolynomial_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd with + ⟨H, hHdeg, hHlim⟩ + let I : Ideal R := Ideal.span ({π} : Set R) + have hfactor : f = G * H := by + apply henselFactorization_limit_factor_eq_of_approximants + (I := I) + (Gseq := fun n : ℕ => + henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + n) + (Hseq := fun n : ℕ => + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + n) + · intro n i + exact (Ideal.pow_le_pow_right (Nat.le_succ n)) + (by + simpa [I] using + henselFactorization_infiniteCorr_error_coeff_mem_span_pow_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd n i) + · simpa [I] using hGlim + · simpa [I] using hHlim + have hGredSpan : ∀ i : ℕ, (G - g0).coeff i ∈ Ideal.span ({π} : Set R) := + henselFactorization_limit_reduction_of_approx_reduction + (I := Ideal.span ({π} : Set R)) + (Pseq := fun n : ℕ => + henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + n) + (P := G) (P0 := g0) hGlim + (henselFactorization_henselIterate_span_singleton g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd)) + have hHredSpan : ∀ i : ℕ, (H - h0).coeff i ∈ Ideal.span ({π} : Set R) := + henselFactorization_limit_reduction_of_approx_reduction + (I := Ideal.span ({π} : Set R)) + (Pseq := fun n : ℕ => + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + n) + (P := H) (P0 := h0) hHlim + (henselFactorization_henselIterate_span_singleton h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd)) + have hspan_le : + Ideal.span ({π} : Set R) ≤ IsLocalRing.maximalIdeal R := + henselFactorization_span_singleton_le_ideal_of_mem + (IsLocalRing.maximalIdeal R) hπmem + have hGred : ∀ i : ℕ, (G - g0).coeff i ∈ IsLocalRing.maximalIdeal R := + fun i => hspan_le (hGredSpan i) + have hHred : ∀ i : ℕ, (H - h0).coeff i ∈ IsLocalRing.maximalIdeal R := + fun i => hspan_le (hHredSpan i) + have hGmap0 : + G.map (IsLocalRing.residue R) = + g0.map (IsLocalRing.residue R) := + henselFactorization_residue_map_eq_of_sub_coeff_mem_maximalIdeal hGred + have hHmap0 : + H.map (IsLocalRing.residue R) = + h0.map (IsLocalRing.residue R) := + henselFactorization_residue_map_eq_of_sub_coeff_mem_maximalIdeal hHred + refine ⟨G, H, hGdeg, hHdeg, hfactor, ?_, ?_⟩ + · rw [hGmap0, hg0map] + · rw [hHmap0, hh0map] + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Step.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Step.lean new file mode 100644 index 0000000000..92dc0a73c8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Step.lean @@ -0,0 +1,479 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.ErrorPowers +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DegreeBounds +/-! +# one Hensel iteration step + +This file packages the algebraic correction, degree truncation, and `π`-power +update into the single step used recursively in the proof of Hensel's +lemma. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- Algebraic splitting of an update by a `π^n`-multiple around the initial +lift. -/ +theorem henselFactorization_update_sub_eq_initial_error_add + {R : Type*} [CommRing R] {π : R} {n : ℕ} {g g0 p : R[X]} : + g + Polynomial.C (π ^ n) * p - g0 = + (g - g0) + Polynomial.C (π ^ n) * p := by + ring + +/-- adding a `π^n`-multiple preserves the reduction modulo the +maximal ideal once `n ≥ 1` and `π` itself lies in the maximal ideal. -/ +theorem henselFactorization_update_preserves_reduction_of_mem + {R : Type*} [CommRing R] [IsLocalRing R] {π : R} {n : ℕ} (hn : 1 ≤ n) + (hπ : π ∈ IsLocalRing.maximalIdeal R) + {g g0 p : R[X]} + (hg : ∀ i : ℕ, (g - g0).coeff i ∈ IsLocalRing.maximalIdeal R) : + ∀ i : ℕ, + (g + Polynomial.C (π ^ n) * p - g0).coeff i ∈ + IsLocalRing.maximalIdeal R := by + intro i + rw [henselFactorization_update_sub_eq_initial_error_add, Polynomial.coeff_add] + refine (IsLocalRing.maximalIdeal R).add_mem (hg i) ?_ + rw [Polynomial.coeff_C_mul] + have hspan : + π ^ n * p.coeff i ∈ Ideal.span ({π} : Set R) := + henselFactorization_pow_mul_mem_span_singleton_of_pos + (π := π) (x := p.coeff i) hn + exact + (henselFactorization_span_singleton_le_ideal_of_mem + (IsLocalRing.maximalIdeal R) hπ) hspan + +/-- adding a `π^n`-multiple preserves congruence modulo +`(π)` once `n ≥ 1`. This is the inductive congruence needed for the +displayed-factor one-step update. -/ +theorem henselFactorization_update_preserves_span_singleton + {R : Type*} [CommRing R] {π : R} {n : ℕ} (hn : 1 ≤ n) + {g g0 p : R[X]} + (hg : ∀ i : ℕ, (g - g0).coeff i ∈ Ideal.span ({π} : Set R)) : + ∀ i : ℕ, + (g + Polynomial.C (π ^ n) * p - g0).coeff i ∈ + Ideal.span ({π} : Set R) := by + intro i + rw [henselFactorization_update_sub_eq_initial_error_add, Polynomial.coeff_add] + refine (Ideal.span ({π} : Set R)).add_mem (hg i) ?_ + rw [Polynomial.coeff_C_mul] + exact henselFactorization_pow_mul_mem_span_singleton_of_pos + (π := π) (x := p.coeff i) hn + +/-- one recursive Hensel step from the division data, with the +two uses of the principal element separated: `π ∈ m` preserves reductions, +and `m ≤ (π)` reads the correction congruence modulo `(π)`. -/ +theorem henselFactorization_one_step_update_from_division_data_of_mem_le + {R : Type*} [CommRing R] [IsLocalRing R] {π : R} {n : ℕ} (hn : 1 ≤ n) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + (hπle : IsLocalRing.maximalIdeal R ≤ Ideal.span ({π} : Set R)) + {f g0 h0 g h fn a b qdiv p : R[X]} {m d : ℕ} + (hfactor : f - g * h = Polynomial.C (π ^ n) * fn) + (hg : ∀ i : ℕ, (g - g0).coeff i ∈ IsLocalRing.maximalIdeal R) + (hh : ∀ i : ℕ, (h - h0).coeff i ∈ IsLocalRing.maximalIdeal R) + (hgdeg : (g0.map (IsLocalRing.residue R)).natDegree = m) + (hgnonzero : g0.map (IsLocalRing.residue R) ≠ 0) + (hbez : (a * g0 + b * h0).map (IsLocalRing.residue R) = 1) + (hdiv : b * fn = g0 * qdiv + p) + (hfn : (fn.map (IsLocalRing.residue R)).natDegree ≤ d) + (hh0 : (h0.map (IsLocalRing.residue R)).natDegree ≤ d - m) + (hp : (p.map (IsLocalRing.residue R)).natDegree ≤ m) + (hmd : m ≤ d) : + (henselFactorizationLowPart (d - m) (a * fn + h0 * qdiv)).natDegree ≤ d - m ∧ + (∀ i : ℕ, + (g + Polynomial.C (π ^ n) * p - g0).coeff i ∈ + IsLocalRing.maximalIdeal R) ∧ + (∀ i : ℕ, + (h + Polynomial.C (π ^ n) * + henselFactorizationLowPart (d - m) (a * fn + h0 * qdiv) - h0).coeff i ∈ + IsLocalRing.maximalIdeal R) ∧ + ∃ fnNext : R[X], + f - (g + Polynomial.C (π ^ n) * p) * + (h + Polynomial.C (π ^ n) * + henselFactorizationLowPart (d - m) (a * fn + h0 * qdiv)) = + Polynomial.C (π ^ (n + 1)) * fnNext := by + rcases henselFactorization_correction_after_division_degree_truncation + (g0 := g0) (h0 := h0) (fn := fn) + (a := a) (b := b) (q := qdiv) (p := p) + (m := m) (d := d) + hgdeg hgnonzero hbez hdiv hfn hh0 hp hmd with + ⟨hqdeg, hcorrInitial⟩ + have hcorrCurrent : + ∀ i : ℕ, + (g * henselFactorizationLowPart (d - m) (a * fn + h0 * qdiv) + + h * p - fn).coeff i ∈ IsLocalRing.maximalIdeal R := + henselFactorization_correction_congruence_replace_initial_factors + (g0 := g0) (h0 := h0) (g := g) (h := h) + (fn := fn) (p := p) + (q := henselFactorizationLowPart (d - m) (a * fn + h0 * qdiv)) + hg hh hcorrInitial + refine ⟨hqdeg, ?_, ?_, ?_⟩ + · exact henselFactorization_update_preserves_reduction_of_mem + (π := π) hn hπmem hg + · exact henselFactorization_update_preserves_reduction_of_mem + (π := π) hn hπmem hh + · exact + henselFactorization_power_update_error_factor_exists_of_maximalIdeal_correction_le + (π := π) hn hπle hfactor hcorrCurrent + +/-- displayed-factor one recursive Hensel step from the division +data. The congruence modulo `(π)` is produced from the displayed Bezout-error +factor, and the update needs only `π ∈ m`, not `m ≤ (π)`. -/ +theorem henselFactorization_one_step_update_from_division_data_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] {π : R} {n : ℕ} (hn : 1 ≤ n) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 g h fn a b qdiv p e : R[X]} {m d : ℕ} + (hfactor : f - g * h = Polynomial.C (π ^ n) * fn) + (hg : ∀ i : ℕ, (g - g0).coeff i ∈ Ideal.span ({π} : Set R)) + (hh : ∀ i : ℕ, (h - h0).coeff i ∈ Ideal.span ({π} : Set R)) + (hgunit : IsUnit g0.leadingCoeff) + (hg0nat : g0.natDegree = m) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hdiv : b * fn = g0 * qdiv + p) + (hfn : fn.natDegree ≤ d) + (hh0 : h0.natDegree ≤ d - m) + (hp : p.natDegree ≤ m) + (hmd : m ≤ d) : + (henselFactorizationLowPart (d - m) (a * fn + h0 * qdiv)).natDegree ≤ d - m ∧ + (∀ i : ℕ, + (g + Polynomial.C (π ^ n) * p - g0).coeff i ∈ + Ideal.span ({π} : Set R)) ∧ + (∀ i : ℕ, + (h + Polynomial.C (π ^ n) * + henselFactorizationLowPart (d - m) (a * fn + h0 * qdiv) - h0).coeff i ∈ + Ideal.span ({π} : Set R)) ∧ + (∀ i : ℕ, + (g + Polynomial.C (π ^ n) * p - g0).coeff i ∈ + IsLocalRing.maximalIdeal R) ∧ + (∀ i : ℕ, + (h + Polynomial.C (π ^ n) * + henselFactorizationLowPart (d - m) (a * fn + h0 * qdiv) - h0).coeff i ∈ + IsLocalRing.maximalIdeal R) ∧ + ∃ fnNext : R[X], + f - (g + Polynomial.C (π ^ n) * p) * + (h + Polynomial.C (π ^ n) * + henselFactorizationLowPart (d - m) (a * fn + h0 * qdiv)) = + Polynomial.C (π ^ (n + 1)) * fnNext := by + rcases henselFactorization_correction_after_division_degree_truncation_span_singleton + (π := π) hπmem hgunit hg0nat hbezFactor hdiv hfn hh0 hp hmd with + ⟨hqdeg, hcorrInitial⟩ + have hcorrCurrent : + ∀ i : ℕ, + (g * henselFactorizationLowPart (d - m) (a * fn + h0 * qdiv) + + h * p - fn).coeff i ∈ Ideal.span ({π} : Set R) := + henselFactorization_correction_congruence_replace_initial_factors_span_singleton + (π := π) (g0 := g0) (h0 := h0) (g := g) (h := h) + (fn := fn) (p := p) + (q := henselFactorizationLowPart (d - m) (a * fn + h0 * qdiv)) + hg hh hcorrInitial + have hgNext : + ∀ i : ℕ, + (g + Polynomial.C (π ^ n) * p - g0).coeff i ∈ + Ideal.span ({π} : Set R) := + henselFactorization_update_preserves_span_singleton (π := π) hn hg + have hhNext : + ∀ i : ℕ, + (h + Polynomial.C (π ^ n) * + henselFactorizationLowPart (d - m) (a * fn + h0 * qdiv) - h0).coeff i ∈ + Ideal.span ({π} : Set R) := + henselFactorization_update_preserves_span_singleton (π := π) hn hh + have hspan_le : + Ideal.span ({π} : Set R) ≤ IsLocalRing.maximalIdeal R := + henselFactorization_span_singleton_le_ideal_of_mem + (IsLocalRing.maximalIdeal R) hπmem + refine ⟨hqdeg, hgNext, hhNext, ?_, ?_, ?_⟩ + · intro i + exact hspan_le (hgNext i) + · intro i + exact hspan_le (hhNext i) + · exact henselFactorization_power_update_error_factor_exists + (π := π) hn hfactor hcorrCurrent + +/-- one recursive Hensel step from the actual division +remainder estimate, with the principal-element assumptions separated. -/ +theorem henselFactorization_one_step_update_from_division_degree_lt_of_mem_le + {R : Type*} [CommRing R] [IsLocalRing R] {π : R} {n : ℕ} (hn : 1 ≤ n) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + (hπle : IsLocalRing.maximalIdeal R ≤ Ideal.span ({π} : Set R)) + {f g0 h0 g h fn a b qdiv p : R[X]} {m d : ℕ} + (hfactor : f - g * h = Polynomial.C (π ^ n) * fn) + (hg : ∀ i : ℕ, (g - g0).coeff i ∈ IsLocalRing.maximalIdeal R) + (hh : ∀ i : ℕ, (h - h0).coeff i ∈ IsLocalRing.maximalIdeal R) + (hgdeg : (g0.map (IsLocalRing.residue R)).natDegree = m) + (hg0nat : g0.natDegree = m) + (hgnonzero : g0.map (IsLocalRing.residue R) ≠ 0) + (hbez : (a * g0 + b * h0).map (IsLocalRing.residue R) = 1) + (hdiv : b * fn = g0 * qdiv + p) + (hpdeg : p.degree < g0.degree) + (hfn : (fn.map (IsLocalRing.residue R)).natDegree ≤ d) + (hh0 : (h0.map (IsLocalRing.residue R)).natDegree ≤ d - m) + (hmd : m ≤ d) : + (henselFactorizationLowPart (d - m) (a * fn + h0 * qdiv)).natDegree ≤ d - m ∧ + (∀ i : ℕ, + (g + Polynomial.C (π ^ n) * p - g0).coeff i ∈ + IsLocalRing.maximalIdeal R) ∧ + (∀ i : ℕ, + (h + Polynomial.C (π ^ n) * + henselFactorizationLowPart (d - m) (a * fn + h0 * qdiv) - h0).coeff i ∈ + IsLocalRing.maximalIdeal R) ∧ + ∃ fnNext : R[X], + f - (g + Polynomial.C (π ^ n) * p) * + (h + Polynomial.C (π ^ n) * + henselFactorizationLowPart (d - m) (a * fn + h0 * qdiv)) = + Polynomial.C (π ^ (n + 1)) * fnNext := by + exact henselFactorization_one_step_update_from_division_data_of_mem_le + (π := π) hn hπmem hπle hfactor hg hh hgdeg hgnonzero hbez hdiv hfn hh0 + (henselFactorization_residue_remainder_natDegree_le_of_degree_lt + (R := R) (g0 := g0) (p := p) hg0nat hpdeg) + hmd + +/-- existence of one recursive Hensel step from the current +error factor, with the principal-element assumptions separated. -/ +theorem henselFactorization_exists_one_step_update_of_mem_le + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} {n : ℕ} (hn : 1 ≤ n) (hπn : π ^ n ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + (hπle : IsLocalRing.maximalIdeal R ≤ Ideal.span ({π} : Set R)) + {f g0 h0 g h fn a b : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg : ∀ i : ℕ, (g - g0).coeff i ∈ IsLocalRing.maximalIdeal R) + (hh : ∀ i : ℕ, (h - h0).coeff i ∈ IsLocalRing.maximalIdeal R) + (hgdeg : g.natDegree ≤ m) + (hhdeg : h.natDegree ≤ d - m) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0 : (h0.map (IsLocalRing.residue R)).natDegree ≤ d - m) + (hbez : (a * g0 + b * h0).map (IsLocalRing.residue R) = 1) + (hfactor : f - g * h = Polynomial.C (π ^ n) * fn) + (hmd : m ≤ d) : + ∃ p q fnNext : R[X], + p.natDegree ≤ m ∧ q.natDegree ≤ d - m ∧ + (∀ i : ℕ, + (g + Polynomial.C (π ^ n) * p - g0).coeff i ∈ + IsLocalRing.maximalIdeal R) ∧ + (∀ i : ℕ, + (h + Polynomial.C (π ^ n) * q - h0).coeff i ∈ + IsLocalRing.maximalIdeal R) ∧ + f - (g + Polynomial.C (π ^ n) * p) * + (h + Polynomial.C (π ^ n) * q) = + Polynomial.C (π ^ (n + 1)) * fnNext := by + have hdegree : g0.natDegree = gbar.natDegree := by + rw [hg0nat, hgbar_nat] + rcases henselFactorization_division_by_lifted_factor_degree_lt + (g0 := g0) (gbar := gbar) hg0map hdegree hglead (b * fn) with + ⟨qdiv, p, hdiv, hpdeg⟩ + have hpNat : p.natDegree ≤ m := + henselFactorization_remainder_natDegree_le_of_degree_lt + (R := R) (g0 := g0) (p := p) hg0nat hpdeg + have hgnonzero : g0.map (IsLocalRing.residue R) ≠ 0 := by + rw [hg0map] + exact (Polynomial.leadingCoeff_ne_zero).1 hglead + have hg0resdeg : (g0.map (IsLocalRing.residue R)).natDegree = m := by + rw [hg0map, hgbar_nat] + have hfn : + (fn.map (IsLocalRing.residue R)).natDegree ≤ d := + henselFactorization_error_factor_residue_natDegree_le + (π := π) hπn hf hgdeg hhdeg hmd hfactor + rcases henselFactorization_one_step_update_from_division_degree_lt_of_mem_le + (π := π) hn hπmem hπle hfactor hg hh hg0resdeg hg0nat hgnonzero + hbez hdiv hpdeg hfn hh0 hmd with + ⟨hqdeg, hgNext, hhNext, hnext⟩ + rcases hnext with ⟨fnNext, hfactorNext⟩ + exact ⟨p, henselFactorizationLowPart (d - m) (a * fn + h0 * qdiv), fnNext, + hpNat, hqdeg, hgNext, hhNext, hfactorNext⟩ + +/-- existence of one recursive Hensel step from the current +error factor in the displayed-factor principal-element form. The chosen `π` +only has to lie in the maximal ideal; the needed congruence modulo `(π)` is +carried as an invariant and is produced from the displayed finite-minimum +Bezout-error factor. -/ +theorem henselFactorization_exists_one_step_update_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} {n : ℕ} (hn : 1 ≤ n) (hπn : π ^ n ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 g h fn a b e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg : ∀ i : ℕ, (g - g0).coeff i ∈ Ideal.span ({π} : Set R)) + (hh : ∀ i : ℕ, (h - h0).coeff i ∈ Ideal.span ({π} : Set R)) + (hgdeg : g.natDegree ≤ m) + (hhdeg : h.natDegree ≤ d - m) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0 : h0.natDegree ≤ d - m) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hfactor : f - g * h = Polynomial.C (π ^ n) * fn) + (hmd : m ≤ d) : + ∃ p q fnNext : R[X], + p.natDegree ≤ m ∧ q.natDegree ≤ d - m ∧ + (∀ i : ℕ, + (g + Polynomial.C (π ^ n) * p - g0).coeff i ∈ + Ideal.span ({π} : Set R)) ∧ + (∀ i : ℕ, + (h + Polynomial.C (π ^ n) * q - h0).coeff i ∈ + Ideal.span ({π} : Set R)) ∧ + (∀ i : ℕ, + (g + Polynomial.C (π ^ n) * p - g0).coeff i ∈ + IsLocalRing.maximalIdeal R) ∧ + (∀ i : ℕ, + (h + Polynomial.C (π ^ n) * q - h0).coeff i ∈ + IsLocalRing.maximalIdeal R) ∧ + f - (g + Polynomial.C (π ^ n) * p) * + (h + Polynomial.C (π ^ n) * q) = + Polynomial.C (π ^ (n + 1)) * fnNext := by + have hdegree : g0.natDegree = gbar.natDegree := by + rw [hg0nat, hgbar_nat] + rcases henselFactorization_division_by_lifted_factor_degree_lt + (g0 := g0) (gbar := gbar) hg0map hdegree hglead (b * fn) with + ⟨qdiv, p, hdiv, hpdeg⟩ + have hpNat : p.natDegree ≤ m := + henselFactorization_remainder_natDegree_le_of_degree_lt + (R := R) (g0 := g0) (p := p) hg0nat hpdeg + have hgunit : IsUnit g0.leadingCoeff := + henselFactorization_lift_leadingCoeff_isUnit_of_natDegree_eq + hg0map hdegree hglead + have hfn : fn.natDegree ≤ d := + henselFactorization_error_factor_natDegree_le + (π := π) hπn hf hgdeg hhdeg hmd hfactor + rcases henselFactorization_one_step_update_from_division_data_of_mem_span + (π := π) hn hπmem hfactor hg hh hgunit hg0nat + hbezFactor hdiv hfn hh0 hpNat hmd with + ⟨hqdeg, hgNext, hhNext, hgNextMax, hhNextMax, hnext⟩ + rcases hnext with ⟨fnNext, hfactorNext⟩ + exact ⟨p, henselFactorizationLowPart (d - m) (a * fn + h0 * qdiv), fnNext, + hpNat, hqdeg, hgNext, hhNext, hgNextMax, hhNextMax, hfactorNext⟩ + +/-- displayed-factor one-step existence with the degree +invariants for the next approximants included. -/ +theorem henselFactorization_exists_one_step_update_with_degree_bounds_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} {n : ℕ} (hn : 1 ≤ n) (hπn : π ^ n ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 g h fn a b e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg : ∀ i : ℕ, (g - g0).coeff i ∈ Ideal.span ({π} : Set R)) + (hh : ∀ i : ℕ, (h - h0).coeff i ∈ Ideal.span ({π} : Set R)) + (hgdeg : g.natDegree ≤ m) + (hhdeg : h.natDegree ≤ d - m) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0 : h0.natDegree ≤ d - m) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hfactor : f - g * h = Polynomial.C (π ^ n) * fn) + (hmd : m ≤ d) : + ∃ p q fnNext : R[X], + p.natDegree ≤ m ∧ q.natDegree ≤ d - m ∧ + (g + Polynomial.C (π ^ n) * p).natDegree ≤ m ∧ + (h + Polynomial.C (π ^ n) * q).natDegree ≤ d - m ∧ + (∀ i : ℕ, + (g + Polynomial.C (π ^ n) * p - g0).coeff i ∈ + Ideal.span ({π} : Set R)) ∧ + (∀ i : ℕ, + (h + Polynomial.C (π ^ n) * q - h0).coeff i ∈ + Ideal.span ({π} : Set R)) ∧ + (∀ i : ℕ, + (g + Polynomial.C (π ^ n) * p - g0).coeff i ∈ + IsLocalRing.maximalIdeal R) ∧ + (∀ i : ℕ, + (h + Polynomial.C (π ^ n) * q - h0).coeff i ∈ + IsLocalRing.maximalIdeal R) ∧ + f - (g + Polynomial.C (π ^ n) * p) * + (h + Polynomial.C (π ^ n) * q) = + Polynomial.C (π ^ (n + 1)) * fnNext := by + rcases henselFactorization_exists_one_step_update_of_mem_span + (π := π) hn hπn hπmem hf hg hh hgdeg hhdeg + hg0map hg0nat hgbar_nat hglead hh0 hbezFactor hfactor hmd with + ⟨p, q, fnNext, hpdeg, hqdeg, hgNext, hhNext, + hgNextMax, hhNextMax, hfactorNext⟩ + have hgNextDeg : + (g + Polynomial.C (π ^ n) * p).natDegree ≤ m := by + have hterm : (Polynomial.C (π ^ n) * p).natDegree ≤ m := + (Polynomial.natDegree_C_mul_le (π ^ n) p).trans hpdeg + exact Polynomial.natDegree_add_le_of_degree_le hgdeg hterm + have hhNextDeg : + (h + Polynomial.C (π ^ n) * q).natDegree ≤ d - m := by + have hterm : (Polynomial.C (π ^ n) * q).natDegree ≤ d - m := + (Polynomial.natDegree_C_mul_le (π ^ n) q).trans hqdeg + exact Polynomial.natDegree_add_le_of_degree_le hhdeg hterm + exact ⟨p, q, fnNext, hpdeg, hqdeg, hgNextDeg, hhNextDeg, + hgNext, hhNext, hgNextMax, hhNextMax, hfactorNext⟩ + +/-- existence of one recursive Hensel step with the degree +invariants for the next approximants included, with the principal-element +assumptions separated. -/ +theorem henselFactorization_exists_one_step_update_with_degree_bounds_of_mem_le + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} {n : ℕ} (hn : 1 ≤ n) (hπn : π ^ n ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + (hπle : IsLocalRing.maximalIdeal R ≤ Ideal.span ({π} : Set R)) + {f g0 h0 g h fn a b : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg : ∀ i : ℕ, (g - g0).coeff i ∈ IsLocalRing.maximalIdeal R) + (hh : ∀ i : ℕ, (h - h0).coeff i ∈ IsLocalRing.maximalIdeal R) + (hgdeg : g.natDegree ≤ m) + (hhdeg : h.natDegree ≤ d - m) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0 : (h0.map (IsLocalRing.residue R)).natDegree ≤ d - m) + (hbez : (a * g0 + b * h0).map (IsLocalRing.residue R) = 1) + (hfactor : f - g * h = Polynomial.C (π ^ n) * fn) + (hmd : m ≤ d) : + ∃ p q fnNext : R[X], + p.natDegree ≤ m ∧ q.natDegree ≤ d - m ∧ + (g + Polynomial.C (π ^ n) * p).natDegree ≤ m ∧ + (h + Polynomial.C (π ^ n) * q).natDegree ≤ d - m ∧ + (∀ i : ℕ, + (g + Polynomial.C (π ^ n) * p - g0).coeff i ∈ + IsLocalRing.maximalIdeal R) ∧ + (∀ i : ℕ, + (h + Polynomial.C (π ^ n) * q - h0).coeff i ∈ + IsLocalRing.maximalIdeal R) ∧ + f - (g + Polynomial.C (π ^ n) * p) * + (h + Polynomial.C (π ^ n) * q) = + Polynomial.C (π ^ (n + 1)) * fnNext := by + rcases henselFactorization_exists_one_step_update_of_mem_le + (π := π) hn hπn hπmem hπle hf hg hh hgdeg hhdeg + hg0map hg0nat hgbar_nat hglead hh0 hbez hfactor hmd with + ⟨p, q, fnNext, hpdeg, hqdeg, hgNext, hhNext, hfactorNext⟩ + have hgNextDeg : + (g + Polynomial.C (π ^ n) * p).natDegree ≤ m := by + have hterm : (Polynomial.C (π ^ n) * p).natDegree ≤ m := + (Polynomial.natDegree_C_mul_le (π ^ n) p).trans hpdeg + exact Polynomial.natDegree_add_le_of_degree_le hgdeg hterm + have hhNextDeg : + (h + Polynomial.C (π ^ n) * q).natDegree ≤ d - m := by + have hterm : (Polynomial.C (π ^ n) * q).natDegree ≤ d - m := + (Polynomial.natDegree_C_mul_le (π ^ n) q).trans hqdeg + exact Polynomial.natDegree_add_le_of_degree_le hhdeg hterm + exact ⟨p, q, fnNext, hpdeg, hqdeg, hgNextDeg, hhNextDeg, + hgNext, hhNext, hfactorNext⟩ + + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Truncation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Truncation.lean new file mode 100644 index 0000000000..1c94963334 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Truncation.lean @@ -0,0 +1,805 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic +/-! +# coefficient truncation for the Hensel correction step + +This file contains the finite coefficient-cutting step used in the +proof of Hensel's lemma: after the division step, coefficients already zero in +the residue field may be omitted to impose the required degree bound. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial +open scoped BigOperators + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- low-degree part of a polynomial up to degree `N`. -/ +def henselFactorizationLowPart {R : Type*} [Semiring R] (N : ℕ) (P : R[X]) : R[X] := + Finset.sum (Finset.range (N + 1)) fun i => Polynomial.monomial i (P.coeff i) + +/-- coefficients at degrees kept by `lowPart`. -/ +theorem henselFactorization_lowPart_coeff_of_le + {R : Type*} [Semiring R] {N n : ℕ} (P : R[X]) (hn : n ≤ N) : + (henselFactorizationLowPart N P).coeff n = P.coeff n := by + classical + unfold henselFactorizationLowPart + rw [Polynomial.finsetSum_coeff] + rw [Finset.sum_eq_single n] + · simp + · intro b _hb hbn + simp [Polynomial.coeff_monomial, hbn] + · intro hnot + exact False.elim (hnot (Finset.mem_range.mpr (Nat.lt_succ_of_le hn))) + +/-- coefficients above the cutoff vanish in `lowPart`. -/ +theorem henselFactorization_lowPart_coeff_eq_zero_of_lt + {R : Type*} [Semiring R] {N n : ℕ} (P : R[X]) (hn : N < n) : + (henselFactorizationLowPart N P).coeff n = 0 := by + classical + unfold henselFactorizationLowPart + rw [Polynomial.finsetSum_coeff] + refine Finset.sum_eq_zero ?_ + intro b hb + have hbn : b ≠ n := by + intro hbn + have hn_le : n ≤ N := Nat.lt_succ_iff.mp (by simpa [hbn] using hb) + exact (Nat.not_lt_of_ge hn_le) hn + simp [Polynomial.coeff_monomial, hbn] + +/-- `lowPart` has the intended degree bound. -/ +theorem henselFactorization_lowPart_natDegree_le + {R : Type*} [Semiring R] (N : ℕ) (P : R[X]) : + (henselFactorizationLowPart N P).natDegree ≤ N := by + rw [Polynomial.natDegree_le_iff_coeff_eq_zero] + intro n hn + exact henselFactorization_lowPart_coeff_eq_zero_of_lt (P := P) hn + +/-- omitting high coefficients already in the kernel does not +change the residual polynomial. -/ +theorem henselFactorization_lowPart_map_eq_of_high_coeff_mem_ker + {R k : Type*} [CommRing R] [CommRing k] (φ : R →+* k) + (N : ℕ) (P : R[X]) + (hhigh : ∀ n : ℕ, N < n → P.coeff n ∈ RingHom.ker φ) : + (henselFactorizationLowPart N P).map φ = P.map φ := by + ext n + by_cases hn : n ≤ N + · rw [Polynomial.coeff_map, Polynomial.coeff_map, + henselFactorization_lowPart_coeff_of_le (P := P) hn] + · have hlt : N < n := Nat.lt_of_not_ge hn + have hker := hhigh n hlt + rw [Polynomial.coeff_map, Polynomial.coeff_map, + henselFactorization_lowPart_coeff_eq_zero_of_lt (P := P) hlt] + rw [RingHom.mem_ker] at hker + simpa using hker.symm + +/-- residue-map form of high-coefficient truncation. -/ +theorem henselFactorization_lowPart_residue_map_eq_of_high_coeff_mem_maximalIdeal + {R : Type*} [CommRing R] [IsLocalRing R] (N : ℕ) (P : R[X]) + (hhigh : ∀ n : ℕ, N < n → P.coeff n ∈ IsLocalRing.maximalIdeal R) : + (henselFactorizationLowPart N P).map (IsLocalRing.residue R) = + P.map (IsLocalRing.residue R) := by + apply henselFactorization_lowPart_map_eq_of_high_coeff_mem_ker + intro n hn + have h := hhigh n hn + rwa [IsLocalRing.ker_residue] + +/-- kernel-level truncation: the correction congruence +survives replacing a provisional correction polynomial by its low-degree part +when the omitted coefficients already lie in the same coefficient-map kernel. -/ +theorem henselFactorization_correction_after_lowPart_ker + {R k : Type*} [CommRing R] [CommRing k] (φ : R →+* k) + {g0 h0 fn p Q : R[X]} (N : ℕ) + (hcorr : + ∀ n : ℕ, (g0 * Q + h0 * p - fn).coeff n ∈ RingHom.ker φ) + (hhigh : ∀ n : ℕ, N < n → Q.coeff n ∈ RingHom.ker φ) : + (henselFactorizationLowPart N Q).natDegree ≤ N ∧ + ∀ n : ℕ, + (g0 * henselFactorizationLowPart N Q + h0 * p - fn).coeff n ∈ + RingHom.ker φ := by + refine ⟨henselFactorization_lowPart_natDegree_le N Q, ?_⟩ + have hmapQ := + henselFactorization_lowPart_map_eq_of_high_coeff_mem_ker φ N Q hhigh + have hmapOld : + (g0 * Q + h0 * p - fn).map φ = 0 := by + exact (henselFactorization_map_eq_zero_iff_coeff_mem_ker + φ (g0 * Q + h0 * p - fn)).2 hcorr + have hmapNew : + (g0 * henselFactorizationLowPart N Q + h0 * p - fn).map φ = 0 := by + calc + (g0 * henselFactorizationLowPart N Q + h0 * p - fn).map φ = + g0.map φ * (henselFactorizationLowPart N Q).map φ + + h0.map φ * p.map φ - fn.map φ := by + exact henselFactorization_map_mul_add_mul_sub φ g0 h0 + (henselFactorizationLowPart N Q) p fn + _ = g0.map φ * Q.map φ + h0.map φ * p.map φ - fn.map φ := by + rw [hmapQ] + _ = (g0 * Q + h0 * p - fn).map φ := by + exact (henselFactorization_map_mul_add_mul_sub φ g0 h0 Q p fn).symm + _ = 0 := hmapOld + intro n + exact (henselFactorization_map_eq_zero_iff_coeff_mem_ker + φ (g0 * henselFactorizationLowPart N Q + h0 * p - fn)).1 hmapNew n + +/-- ideal-level truncation: the correction congruence survives +replacing a provisional correction polynomial by its low-degree part when the +omitted coefficients already lie in the same ideal. -/ +theorem henselFactorization_correction_after_lowPart_ideal + {R : Type*} [CommRing R] {I : Ideal R} + {g0 h0 fn p Q : R[X]} (N : ℕ) + (hcorr : + ∀ n : ℕ, (g0 * Q + h0 * p - fn).coeff n ∈ I) + (hhigh : ∀ n : ℕ, N < n → Q.coeff n ∈ I) : + (henselFactorizationLowPart N Q).natDegree ≤ N ∧ + ∀ n : ℕ, + (g0 * henselFactorizationLowPart N Q + h0 * p - fn).coeff n ∈ I := by + let φ : R →+* R ⧸ I := Ideal.Quotient.mk I + have hcorrKer : + ∀ n : ℕ, (g0 * Q + h0 * p - fn).coeff n ∈ RingHom.ker φ := by + intro n + exact (henselFactorization_mem_ker_quotient_mk_iff I _).2 (hcorr n) + have hhighKer : + ∀ n : ℕ, N < n → Q.coeff n ∈ RingHom.ker φ := by + intro n hn + exact (henselFactorization_mem_ker_quotient_mk_iff I _).2 (hhigh n hn) + rcases henselFactorization_correction_after_lowPart_ker + φ (N := N) (g0 := g0) (h0 := h0) (fn := fn) + (p := p) (Q := Q) hcorrKer hhighKer with + ⟨hdeg, hker⟩ + refine ⟨hdeg, ?_⟩ + intro n + exact (henselFactorization_mem_ker_quotient_mk_iff I _).1 (hker n) + +/-- principal-ideal truncation: if the provisional correction +is congruent modulo `(π)` and all omitted coefficients are divisible by `π`, +then the truncated correction keeps the same congruence modulo `(π)`. -/ +theorem henselFactorization_correction_after_lowPart_span_singleton + {R : Type*} [CommRing R] {π : R} + {g0 h0 fn p Q : R[X]} (N : ℕ) + (hcorr : + ∀ n : ℕ, (g0 * Q + h0 * p - fn).coeff n ∈ + Ideal.span ({π} : Set R)) + (hhigh : ∀ n : ℕ, N < n → Q.coeff n ∈ + Ideal.span ({π} : Set R)) : + (henselFactorizationLowPart N Q).natDegree ≤ N ∧ + ∀ n : ℕ, + (g0 * henselFactorizationLowPart N Q + h0 * p - fn).coeff n ∈ + Ideal.span ({π} : Set R) := by + exact henselFactorization_correction_after_lowPart_ideal + (I := Ideal.span ({π} : Set R)) N hcorr hhigh + +/-- residue-field degree division: if the product with a +nonzero degree-`m` polynomial has degree at most `d`, then the right factor +has degree at most `d - m`. -/ +theorem henselFactorization_natDegree_right_le_tsub_of_mul_natDegree_le + {k : Type*} [Field k] {g Q : k[X]} {m d : ℕ} + (hgdeg : g.natDegree = m) (hg : g ≠ 0) + (hprod : (g * Q).natDegree ≤ d) : + Q.natDegree ≤ d - m := by + by_cases hQ : Q = 0 + · simp [hQ] + · have hsum : m + Q.natDegree ≤ d := by + simpa [hgdeg, Polynomial.natDegree_mul hg hQ] using hprod + exact Nat.le_sub_of_add_le (by simpa [Nat.add_comm] using hsum) + +/-- unit-leading degree division over an arbitrary +commutative ring: if the product with a degree-`m` polynomial whose leading +coefficient is a unit has degree at most `d`, then the right factor has degree +at most `d - m`. This is the form needed over `O/(π)` in the iterative proof. -/ +theorem henselFactorization_natDegree_right_le_tsub_of_unit_leading_mul_natDegree_le + {R : Type*} [CommRing R] {g Q : R[X]} {m d : ℕ} + (hgunit : IsUnit g.leadingCoeff) (hgdeg : g.natDegree = m) + (hprod : (g * Q).natDegree ≤ d) : + Q.natDegree ≤ d - m := by + by_cases hQ : Q = 0 + · simp [hQ] + rcases henselFactorization_monic_normalization_of_unit_leadingCoeff + (g := g) hgunit with + ⟨u, _hu, hmonic, _hdegree, hnatDegree⟩ + let G : R[X] := Polynomial.C (((u⁻¹ : Rˣ) : R)) * g + have hGmonic : G.Monic := by + simpa [G] using hmonic + have hGnat : G.natDegree = m := by + simpa [G, hgdeg] using hnatDegree + have hinvUnit : IsUnit (((u⁻¹ : Rˣ) : R)) := ⟨u⁻¹, rfl⟩ + have hGprod : (G * Q).natDegree ≤ d := by + have hrewrite : + G * Q = Polynomial.C (((u⁻¹ : Rˣ) : R)) * (g * Q) := by + dsimp [G] + ring + rw [hrewrite, Polynomial.natDegree_C_mul_of_isUnit hinvUnit] + exact hprod + have hsum : m + Q.natDegree ≤ d := by + have hmul := hGmonic.natDegree_mul' hQ + rw [hGnat] at hmul + simpa [hmul] using hGprod + exact Nat.le_sub_of_add_le (by simpa [Nat.add_comm] using hsum) + +/-- a unit-leading polynomial remains unit-leading with the +same natural degree after mapping to a nontrivial target ring. This supplies +the unit-leading input used over `O/(π)`. -/ +theorem henselFactorization_map_unit_leadingCoeff_natDegree_eq + {R S : Type*} [CommRing R] [CommRing S] [Nontrivial S] + (φ : R →+* S) {g : R[X]} {m : ℕ} + (hgunit : IsUnit g.leadingCoeff) (hgdeg : g.natDegree = m) : + IsUnit (g.map φ).leadingCoeff ∧ (g.map φ).natDegree = m := by + have hlead : + (g.map φ).leadingCoeff = φ g.leadingCoeff := + Polynomial.leadingCoeff_map_eq_of_isUnit_leadingCoeff φ hgunit + have hnat : + (g.map φ).natDegree = g.natDegree := + Polynomial.natDegree_map_eq_of_isUnit_leadingCoeff φ hgunit + exact ⟨by + rw [hlead] + exact IsUnit.map φ hgunit, by + rw [hnat, hgdeg]⟩ + +/-- quotient specialization of +`henselFactorization_map_unit_leadingCoeff_natDegree_eq`. -/ +theorem henselFactorization_quotient_unit_leadingCoeff_natDegree_eq + {R : Type*} [CommRing R] {I : Ideal R} [Nontrivial (R ⧸ I)] + {g : R[X]} {m : ℕ} + (hgunit : IsUnit g.leadingCoeff) (hgdeg : g.natDegree = m) : + IsUnit (g.map (Ideal.Quotient.mk I)).leadingCoeff ∧ + (g.map (Ideal.Quotient.mk I)).natDegree = m := + henselFactorization_map_unit_leadingCoeff_natDegree_eq + (Ideal.Quotient.mk I) hgunit hgdeg + +/-- if `π` lies in the maximal ideal of a local ring, then +the quotient `O/(π)` is nontrivial. This is the displayed-factor source for the +nontriviality needed in the degree argument modulo `(π)`. -/ +theorem henselFactorization_span_singleton_quotient_nontrivial_of_mem_maximalIdeal + {R : Type*} [CommRing R] [IsLocalRing R] {π : R} + (hπ : π ∈ IsLocalRing.maximalIdeal R) : + Nontrivial (R ⧸ Ideal.span ({π} : Set R)) := by + rw [Ideal.Quotient.nontrivial_iff] + intro htop + have hle : Ideal.span ({π} : Set R) ≤ IsLocalRing.maximalIdeal R := by + rw [Ideal.span_le] + intro x hx + rw [Set.mem_singleton_iff] at hx + simpa [hx] using hπ + have htop_le : + (⊤ : Ideal R) ≤ IsLocalRing.maximalIdeal R := by + simpa [htop] using hle + have hmaxTop : IsLocalRing.maximalIdeal R = ⊤ := + le_antisymm le_top htop_le + exact (IsLocalRing.maximalIdeal.isMaximal R).ne_top hmaxTop + +/-- local-ring specialization: a unit-leading polynomial of +degree `m` stays unit-leading of degree `m` after reducing modulo `(π)`, for +`π` in the maximal ideal. -/ +theorem henselFactorization_span_singleton_quotient_unit_leadingCoeff_natDegree_eq + {R : Type*} [CommRing R] [IsLocalRing R] {π : R} + {g : R[X]} {m : ℕ} + (hπ : π ∈ IsLocalRing.maximalIdeal R) + (hgunit : IsUnit g.leadingCoeff) (hgdeg : g.natDegree = m) : + IsUnit + ((g.map (Ideal.Quotient.mk (Ideal.span ({π} : Set R)))).leadingCoeff) ∧ + (g.map (Ideal.Quotient.mk (Ideal.span ({π} : Set R)))).natDegree = m := by + let : Nontrivial (R ⧸ Ideal.span ({π} : Set R)) := + henselFactorization_span_singleton_quotient_nontrivial_of_mem_maximalIdeal hπ + exact henselFactorization_quotient_unit_leadingCoeff_natDegree_eq + (I := Ideal.span ({π} : Set R)) hgunit hgdeg + +/-- residual degree bound for the polynomial +`fn - h0 * p` that appears after the division step. -/ +theorem henselFactorization_residue_sub_mul_natDegree_le + {R : Type*} [CommRing R] [IsLocalRing R] + {fn h0 P : R[X]} {a b d : ℕ} + (hfn : (fn.map (IsLocalRing.residue R)).natDegree ≤ d) + (hh0 : (h0.map (IsLocalRing.residue R)).natDegree ≤ a) + (hP : (P.map (IsLocalRing.residue R)).natDegree ≤ b) + (hab : a + b ≤ d) : + ((fn - h0 * P).map (IsLocalRing.residue R)).natDegree ≤ d := by + have hmul : + (h0.map (IsLocalRing.residue R) * + P.map (IsLocalRing.residue R)).natDegree ≤ d := + (Polynomial.natDegree_mul_le_of_le hh0 hP).trans hab + have hmap : + (fn - h0 * P).map (IsLocalRing.residue R) = + fn.map (IsLocalRing.residue R) - + h0.map (IsLocalRing.residue R) * P.map (IsLocalRing.residue R) := by + exact henselFactorization_map_sub_mul (IsLocalRing.residue R) fn h0 P + rw [hmap] + simpa using + (Polynomial.natDegree_sub_le_of_le + (p := fn.map (IsLocalRing.residue R)) + (q := h0.map (IsLocalRing.residue R) * + P.map (IsLocalRing.residue R)) hfn hmul) + +/-- mapped degree bound for the polynomial `fn - h0*p` from +degree bounds already available before mapping. This is the quotient-level +replacement for the residue-field degree bound in the principal `(π)` route. -/ +theorem henselFactorization_map_sub_mul_natDegree_le_of_degree_bounds + {R S : Type*} [CommRing R] [CommRing S] (φ : R →+* S) + {fn h0 P : R[X]} {a b d : ℕ} + (hfn : fn.natDegree ≤ d) + (hh0 : h0.natDegree ≤ a) + (hP : P.natDegree ≤ b) + (hab : a + b ≤ d) : + ((fn - h0 * P).map φ).natDegree ≤ d := by + have hfnmap : (fn.map φ).natDegree ≤ d := + Polynomial.natDegree_map_le.trans hfn + have hh0map : (h0.map φ).natDegree ≤ a := + Polynomial.natDegree_map_le.trans hh0 + have hPmap : (P.map φ).natDegree ≤ b := + Polynomial.natDegree_map_le.trans hP + have hmul : + (h0.map φ * P.map φ).natDegree ≤ d := + (Polynomial.natDegree_mul_le_of_le hh0map hPmap).trans hab + have hmap : + (fn - h0 * P).map φ = + fn.map φ - h0.map φ * P.map φ := by + exact henselFactorization_map_sub_mul φ fn h0 P + rw [hmap] + simpa using + (Polynomial.natDegree_sub_le_of_le + (p := fn.map φ) (q := h0.map φ * P.map φ) hfnmap hmul) + +/-- quotient specialization of the degree bound for +`fn - h0*p` used before truncating the Hensel correction. -/ +theorem henselFactorization_span_singleton_quotient_sub_mul_natDegree_le_of_degree_bounds + {R : Type*} [CommRing R] {π : R} + {fn h0 P : R[X]} {a b d : ℕ} + (hfn : fn.natDegree ≤ d) + (hh0 : h0.natDegree ≤ a) + (hP : P.natDegree ≤ b) + (hab : a + b ≤ d) : + ((fn - h0 * P).map + (Ideal.Quotient.mk (Ideal.span ({π} : Set R)))).natDegree ≤ d := + henselFactorization_map_sub_mul_natDegree_le_of_degree_bounds + (Ideal.Quotient.mk (Ideal.span ({π} : Set R))) hfn hh0 hP hab + +/-- the correction congruence can be read in the product form +needed for the high-coefficient degree argument. -/ +theorem henselFactorization_product_congruence_of_correction + {R : Type*} [CommRing R] [IsLocalRing R] + {g0 h0 fn p Q : R[X]} + (hcorr : + ∀ n : ℕ, (g0 * Q + h0 * p - fn).coeff n ∈ IsLocalRing.maximalIdeal R) : + ∀ n : ℕ, (g0 * Q - (fn - h0 * p)).coeff n ∈ + IsLocalRing.maximalIdeal R := by + intro n + have heq : g0 * Q - (fn - h0 * p) = g0 * Q + h0 * p - fn := by + ring + rw [heq] + exact hcorr n + +/-- high-coefficient source for the correction truncation: +if `g0 * Q` is congruent to a polynomial of residual degree at most `d`, and +the residual degree of `g0` is `m`, then every coefficient of `Q` above +`d - m` lies in the maximal ideal. -/ +theorem henselFactorization_high_coeff_mem_maximalIdeal_of_product_congruence_degree + {R : Type*} [CommRing R] [IsLocalRing R] + {g0 Q A : R[X]} {m d : ℕ} + (hgdeg : (g0.map (IsLocalRing.residue R)).natDegree = m) + (hg : g0.map (IsLocalRing.residue R) ≠ 0) + (hcong : ∀ n : ℕ, (g0 * Q - A).coeff n ∈ IsLocalRing.maximalIdeal R) + (hAdeg : (A.map (IsLocalRing.residue R)).natDegree ≤ d) : + ∀ n : ℕ, d - m < n → Q.coeff n ∈ IsLocalRing.maximalIdeal R := by + have hmap : + (g0 * Q - A).map (IsLocalRing.residue R) = 0 := by + apply (henselFactorization_map_eq_zero_iff_coeff_mem_ker + (IsLocalRing.residue R) (g0 * Q - A)).2 + intro n + have h := hcong n + rwa [IsLocalRing.ker_residue] + have hsub : + g0.map (IsLocalRing.residue R) * Q.map (IsLocalRing.residue R) - + A.map (IsLocalRing.residue R) = 0 := by + simpa [henselFactorization_map_mul_sub] using hmap + have hprod_eq : + g0.map (IsLocalRing.residue R) * Q.map (IsLocalRing.residue R) = + A.map (IsLocalRing.residue R) := + sub_eq_zero.mp hsub + have hprod_degree : + (g0.map (IsLocalRing.residue R) * Q.map (IsLocalRing.residue R)).natDegree ≤ d := by + rw [hprod_eq] + exact hAdeg + have hQdeg : + (Q.map (IsLocalRing.residue R)).natDegree ≤ d - m := + henselFactorization_natDegree_right_le_tsub_of_mul_natDegree_le + (g := g0.map (IsLocalRing.residue R)) + (Q := Q.map (IsLocalRing.residue R)) hgdeg hg hprod_degree + intro n hn + have hcoeff : + (Q.map (IsLocalRing.residue R)).coeff n = 0 := + Polynomial.coeff_eq_zero_of_natDegree_lt (lt_of_le_of_lt hQdeg hn) + rw [Polynomial.coeff_map] at hcoeff + have hker : Q.coeff n ∈ RingHom.ker (IsLocalRing.residue R) := by + rw [RingHom.mem_ker] + exact hcoeff + rwa [IsLocalRing.ker_residue] at hker + +/-- high-coefficient source modulo `(π)`: if `g0 * Q` is +congruent to a polynomial of degree at most `d` modulo `(π)`, and `g0` has +degree `m` with unit leading coefficient after reduction modulo `(π)`, then +every coefficient of `Q` above `d - m` is divisible by `π`. -/ +theorem henselFactorization_high_coeff_mem_span_singleton_of_product_congruence_degree + {R : Type*} [CommRing R] {π : R} + {g0 Q A : R[X]} {m d : ℕ} + (hgunit : + IsUnit + ((g0.map (Ideal.Quotient.mk (Ideal.span ({π} : Set R)))).leadingCoeff)) + (hgdeg : + (g0.map (Ideal.Quotient.mk (Ideal.span ({π} : Set R)))).natDegree = m) + (hcong : ∀ n : ℕ, (g0 * Q - A).coeff n ∈ + Ideal.span ({π} : Set R)) + (hAdeg : + (A.map (Ideal.Quotient.mk (Ideal.span ({π} : Set R)))).natDegree ≤ d) : + ∀ n : ℕ, d - m < n → Q.coeff n ∈ Ideal.span ({π} : Set R) := by + let φ : R →+* R ⧸ Ideal.span ({π} : Set R) := + Ideal.Quotient.mk (Ideal.span ({π} : Set R)) + have hmap : + (g0 * Q - A).map φ = 0 := by + simpa [φ] using + (henselFactorization_map_quotient_eq_zero_iff_coeff_mem + (Ideal.span ({π} : Set R)) (g0 * Q - A)).2 hcong + have hsub : + g0.map φ * Q.map φ - A.map φ = 0 := by + simpa [henselFactorization_map_mul_sub] using hmap + have hprod_eq : g0.map φ * Q.map φ = A.map φ := + sub_eq_zero.mp hsub + have hprod_degree : (g0.map φ * Q.map φ).natDegree ≤ d := by + rw [hprod_eq] + exact hAdeg + have hQdeg : + (Q.map φ).natDegree ≤ d - m := + henselFactorization_natDegree_right_le_tsub_of_unit_leading_mul_natDegree_le + (g := g0.map φ) (Q := Q.map φ) (m := m) (d := d) + (by simpa [φ] using hgunit) (by simpa [φ] using hgdeg) hprod_degree + intro n hn + have hcoeff : (Q.map φ).coeff n = 0 := + Polynomial.coeff_eq_zero_of_natDegree_lt (lt_of_le_of_lt hQdeg hn) + exact + (henselFactorization_quotient_map_coeff_eq_zero_iff_coeff_mem + (Ideal.span ({π} : Set R)) Q n).1 (by simpa [φ] using hcoeff) + +/-- high-coefficient source specialized to the correction +congruence produced by the division step. -/ +theorem henselFactorization_high_coeff_mem_maximalIdeal_of_correction_degree + {R : Type*} [CommRing R] [IsLocalRing R] + {g0 h0 fn p Q : R[X]} {m d : ℕ} + (hgdeg : (g0.map (IsLocalRing.residue R)).natDegree = m) + (hg : g0.map (IsLocalRing.residue R) ≠ 0) + (hcorr : + ∀ n : ℕ, (g0 * Q + h0 * p - fn).coeff n ∈ + IsLocalRing.maximalIdeal R) + (hAdeg : ((fn - h0 * p).map (IsLocalRing.residue R)).natDegree ≤ d) : + ∀ n : ℕ, d - m < n → Q.coeff n ∈ IsLocalRing.maximalIdeal R := by + exact henselFactorization_high_coeff_mem_maximalIdeal_of_product_congruence_degree + (g0 := g0) (Q := Q) (A := fn - h0 * p) + (m := m) (d := d) hgdeg hg + (henselFactorization_product_congruence_of_correction hcorr) hAdeg + +/-- high-coefficient source modulo `(π)` specialized to the +correction congruence produced by the division step. -/ +theorem henselFactorization_high_coeff_mem_span_singleton_of_correction_degree + {R : Type*} [CommRing R] {π : R} + {g0 h0 fn p Q : R[X]} {m d : ℕ} + (hgunit : + IsUnit + ((g0.map (Ideal.Quotient.mk (Ideal.span ({π} : Set R)))).leadingCoeff)) + (hgdeg : + (g0.map (Ideal.Quotient.mk (Ideal.span ({π} : Set R)))).natDegree = m) + (hcorr : + ∀ n : ℕ, (g0 * Q + h0 * p - fn).coeff n ∈ + Ideal.span ({π} : Set R)) + (hAdeg : + ((fn - h0 * p).map + (Ideal.Quotient.mk (Ideal.span ({π} : Set R)))).natDegree ≤ d) : + ∀ n : ℕ, d - m < n → Q.coeff n ∈ Ideal.span ({π} : Set R) := by + have hcong : + ∀ n : ℕ, (g0 * Q - (fn - h0 * p)).coeff n ∈ + Ideal.span ({π} : Set R) := by + intro n + have heq : g0 * Q - (fn - h0 * p) = g0 * Q + h0 * p - fn := by + ring + rw [heq] + exact hcorr n + exact henselFactorization_high_coeff_mem_span_singleton_of_product_congruence_degree + (π := π) (g0 := g0) (Q := Q) (A := fn - h0 * p) + (m := m) (d := d) hgunit hgdeg hcong hAdeg + +/-- one-step degree truncation modulo `(π)`: under the +principal correction congruence, the quotient-degree bound for `fn - h0*p`, +and the unit-leading degree data for `g0` modulo `(π)`, the low-degree part of +`Q` has degree at most `d-m` and keeps the correction congruence modulo `(π)`. -/ +theorem henselFactorization_correction_after_degree_truncation_span_singleton + {R : Type*} [CommRing R] {π : R} + {g0 h0 fn p Q : R[X]} {m d : ℕ} + (hgunit : + IsUnit + ((g0.map (Ideal.Quotient.mk (Ideal.span ({π} : Set R)))).leadingCoeff)) + (hgdeg : + (g0.map (Ideal.Quotient.mk (Ideal.span ({π} : Set R)))).natDegree = m) + (hcorr : + ∀ n : ℕ, (g0 * Q + h0 * p - fn).coeff n ∈ + Ideal.span ({π} : Set R)) + (hAdeg : + ((fn - h0 * p).map + (Ideal.Quotient.mk (Ideal.span ({π} : Set R)))).natDegree ≤ d) : + (henselFactorizationLowPart (d - m) Q).natDegree ≤ d - m ∧ + ∀ n : ℕ, + (g0 * henselFactorizationLowPart (d - m) Q + h0 * p - fn).coeff n ∈ + Ideal.span ({π} : Set R) := by + exact henselFactorization_correction_after_lowPart_span_singleton + (π := π) (N := d - m) hcorr + (henselFactorization_high_coeff_mem_span_singleton_of_correction_degree + (π := π) (g0 := g0) (h0 := h0) (fn := fn) (p := p) + (Q := Q) (m := m) (d := d) hgunit hgdeg hcorr hAdeg) + +/-- principal-ideal one-step correction after Bezout and +division. This is the displayed-factor route: the displayed factor +`a*g0 + b*h0 - 1 = C π * e`, not an equality `m = (π)`, supplies the +correction congruence modulo `(π)`. -/ +theorem henselFactorization_correction_after_division_degree_truncation_span_singleton + {R : Type*} [CommRing R] [IsLocalRing R] {π : R} + {a b g0 h0 fn q p e : R[X]} {m d : ℕ} + (hπ : π ∈ IsLocalRing.maximalIdeal R) + (hgunit : IsUnit g0.leadingCoeff) + (hg0nat : g0.natDegree = m) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hdiv : b * fn = g0 * q + p) + (hfn : fn.natDegree ≤ d) + (hh0 : h0.natDegree ≤ d - m) + (hp : p.natDegree ≤ m) + (hmd : m ≤ d) : + (henselFactorizationLowPart (d - m) (a * fn + h0 * q)).natDegree ≤ d - m ∧ + ∀ n : ℕ, + (g0 * henselFactorizationLowPart (d - m) (a * fn + h0 * q) + + h0 * p - fn).coeff n ∈ Ideal.span ({π} : Set R) := by + rcases henselFactorization_span_singleton_quotient_unit_leadingCoeff_natDegree_eq + (π := π) hπ hgunit hg0nat with + ⟨hgunitQuot, hgdegQuot⟩ + have hcorr : + ∀ n : ℕ, (g0 * (a * fn + h0 * q) + h0 * p - fn).coeff n ∈ + Ideal.span ({π} : Set R) := + henselFactorization_correction_congruence_span_singleton_after_division + (π := π) hbezFactor hdiv + have hAdeg : + ((fn - h0 * p).map + (Ideal.Quotient.mk (Ideal.span ({π} : Set R)))).natDegree ≤ d := + henselFactorization_span_singleton_quotient_sub_mul_natDegree_le_of_degree_bounds + (π := π) (fn := fn) (h0 := h0) (P := p) + (a := d - m) (b := m) (d := d) hfn hh0 hp (by + rw [Nat.sub_add_cancel hmd]) + exact henselFactorization_correction_after_degree_truncation_span_singleton + (π := π) (g0 := g0) (h0 := h0) (fn := fn) (p := p) + (Q := a * fn + h0 * q) (m := m) (d := d) + hgunitQuot hgdegQuot hcorr hAdeg + +/-- the correction congruence survives replacing a provisional +correction polynomial by its low-degree part when the omitted coefficients are +already zero in the residue field. -/ +theorem henselFactorization_correction_after_lowPart + {R : Type*} [CommRing R] [IsLocalRing R] + {g0 h0 fn p Q : R[X]} (N : ℕ) + (hcorr : + ∀ n : ℕ, (g0 * Q + h0 * p - fn).coeff n ∈ IsLocalRing.maximalIdeal R) + (hhigh : ∀ n : ℕ, N < n → Q.coeff n ∈ IsLocalRing.maximalIdeal R) : + (henselFactorizationLowPart N Q).natDegree ≤ N ∧ + ∀ n : ℕ, + (g0 * henselFactorizationLowPart N Q + h0 * p - fn).coeff n ∈ + IsLocalRing.maximalIdeal R := by + refine ⟨henselFactorization_lowPart_natDegree_le N Q, ?_⟩ + have hmapQ := + henselFactorization_lowPart_residue_map_eq_of_high_coeff_mem_maximalIdeal + N Q hhigh + have hmapOld : + (g0 * Q + h0 * p - fn).map (IsLocalRing.residue R) = 0 := by + apply (henselFactorization_map_eq_zero_iff_coeff_mem_ker + (IsLocalRing.residue R) (g0 * Q + h0 * p - fn)).2 + intro n + have h := hcorr n + rwa [IsLocalRing.ker_residue] + have hmapNew : + (g0 * henselFactorizationLowPart N Q + h0 * p - fn).map + (IsLocalRing.residue R) = 0 := by + calc + (g0 * henselFactorizationLowPart N Q + h0 * p - fn).map + (IsLocalRing.residue R) = + g0.map (IsLocalRing.residue R) * + (henselFactorizationLowPart N Q).map (IsLocalRing.residue R) + + h0.map (IsLocalRing.residue R) * p.map (IsLocalRing.residue R) - + fn.map (IsLocalRing.residue R) := by + exact henselFactorization_map_mul_add_mul_sub (IsLocalRing.residue R) g0 h0 + (henselFactorizationLowPart N Q) p fn + _ = g0.map (IsLocalRing.residue R) * Q.map (IsLocalRing.residue R) + + h0.map (IsLocalRing.residue R) * p.map (IsLocalRing.residue R) - + fn.map (IsLocalRing.residue R) := by + rw [hmapQ] + _ = (g0 * Q + h0 * p - fn).map (IsLocalRing.residue R) := by + exact (henselFactorization_map_mul_add_mul_sub (IsLocalRing.residue R) g0 h0 Q p fn).symm + _ = 0 := hmapOld + intro n + have hker := + (henselFactorization_map_eq_zero_iff_coeff_mem_ker + (IsLocalRing.residue R) + (g0 * henselFactorizationLowPart N Q + h0 * p - fn)).1 hmapNew n + rwa [IsLocalRing.ker_residue] at hker + +/-- one-step degree truncation of the provisional correction: +under the correction congruence and the residual degree bound for +`fn - h0*p`, the low-degree part of `Q` has degree at most `d - m` and keeps +the correction congruence. -/ +theorem henselFactorization_correction_after_degree_truncation + {R : Type*} [CommRing R] [IsLocalRing R] + {g0 h0 fn p Q : R[X]} {m d : ℕ} + (hgdeg : (g0.map (IsLocalRing.residue R)).natDegree = m) + (hg : g0.map (IsLocalRing.residue R) ≠ 0) + (hcorr : + ∀ n : ℕ, (g0 * Q + h0 * p - fn).coeff n ∈ + IsLocalRing.maximalIdeal R) + (hAdeg : ((fn - h0 * p).map (IsLocalRing.residue R)).natDegree ≤ d) : + (henselFactorizationLowPart (d - m) Q).natDegree ≤ d - m ∧ + ∀ n : ℕ, + (g0 * henselFactorizationLowPart (d - m) Q + h0 * p - fn).coeff n ∈ + IsLocalRing.maximalIdeal R := by + exact henselFactorization_correction_after_lowPart + (N := d - m) hcorr + (henselFactorization_high_coeff_mem_maximalIdeal_of_correction_degree + (g0 := g0) (h0 := h0) (fn := fn) (p := p) (Q := Q) + (m := m) (d := d) hgdeg hg hcorr hAdeg) + +/-- one-step correction after Bezout and division. If +`b*fn = g0*q + p` is the division output and the residual degree bounds from +the proof are available, then the truncated provisional correction has +degree at most `d-m` and gives the required congruence. -/ +theorem henselFactorization_correction_after_division_degree_truncation + {R : Type*} [CommRing R] [IsLocalRing R] + {a b g0 h0 fn q p : R[X]} {m d : ℕ} + (hgdeg : (g0.map (IsLocalRing.residue R)).natDegree = m) + (hg : g0.map (IsLocalRing.residue R) ≠ 0) + (hbez : (a * g0 + b * h0).map (IsLocalRing.residue R) = 1) + (hdiv : b * fn = g0 * q + p) + (hfn : (fn.map (IsLocalRing.residue R)).natDegree ≤ d) + (hh0 : (h0.map (IsLocalRing.residue R)).natDegree ≤ d - m) + (hp : (p.map (IsLocalRing.residue R)).natDegree ≤ m) + (hmd : m ≤ d) : + (henselFactorizationLowPart (d - m) (a * fn + h0 * q)).natDegree ≤ d - m ∧ + ∀ n : ℕ, + (g0 * henselFactorizationLowPart (d - m) (a * fn + h0 * q) + + h0 * p - fn).coeff n ∈ IsLocalRing.maximalIdeal R := by + have hcorr : + ∀ n : ℕ, (g0 * (a * fn + h0 * q) + h0 * p - fn).coeff n ∈ + IsLocalRing.maximalIdeal R := + henselFactorization_correction_mem_maximalIdeal_after_division hbez hdiv + have hAdeg : + ((fn - h0 * p).map (IsLocalRing.residue R)).natDegree ≤ d := + henselFactorization_residue_sub_mul_natDegree_le + (fn := fn) (h0 := h0) (P := p) + (a := d - m) (b := m) (d := d) hfn hh0 hp (by + rw [Nat.sub_add_cancel hmd]) + exact henselFactorization_correction_after_degree_truncation + (g0 := g0) (h0 := h0) (fn := fn) (p := p) + (Q := a * fn + h0 * q) (m := m) (d := d) + hgdeg hg hcorr hAdeg + +/-- replacement of the initial lifted factors by the current +inductive approximants in the correction congruence. If `g` and `h` still +reduce to `g0` and `h0`, then a correction congruence for `g0,h0` is also a +correction congruence for `g,h`. -/ +theorem henselFactorization_correction_congruence_replace_initial_factors + {R : Type*} [CommRing R] [IsLocalRing R] + {g0 h0 g h fn p q : R[X]} + (hg : ∀ n : ℕ, (g - g0).coeff n ∈ IsLocalRing.maximalIdeal R) + (hh : ∀ n : ℕ, (h - h0).coeff n ∈ IsLocalRing.maximalIdeal R) + (hcorr : + ∀ n : ℕ, (g0 * q + h0 * p - fn).coeff n ∈ + IsLocalRing.maximalIdeal R) : + ∀ n : ℕ, (g * q + h * p - fn).coeff n ∈ + IsLocalRing.maximalIdeal R := by + have hgmap : g.map (IsLocalRing.residue R) = + g0.map (IsLocalRing.residue R) := by + have hzero : (g - g0).map (IsLocalRing.residue R) = 0 := by + apply (henselFactorization_map_eq_zero_iff_coeff_mem_ker + (IsLocalRing.residue R) (g - g0)).2 + intro n + have hmem := hg n + rwa [IsLocalRing.ker_residue] + have hsub : + g.map (IsLocalRing.residue R) - g0.map (IsLocalRing.residue R) = 0 := by + simpa [Polynomial.map_sub] using hzero + exact sub_eq_zero.mp hsub + have hhmap : h.map (IsLocalRing.residue R) = + h0.map (IsLocalRing.residue R) := by + have hzero : (h - h0).map (IsLocalRing.residue R) = 0 := by + apply (henselFactorization_map_eq_zero_iff_coeff_mem_ker + (IsLocalRing.residue R) (h - h0)).2 + intro n + have hmem := hh n + rwa [IsLocalRing.ker_residue] + have hsub : + h.map (IsLocalRing.residue R) - h0.map (IsLocalRing.residue R) = 0 := by + simpa [Polynomial.map_sub] using hzero + exact sub_eq_zero.mp hsub + have hcorrMap : + (g0 * q + h0 * p - fn).map (IsLocalRing.residue R) = 0 := by + apply (henselFactorization_map_eq_zero_iff_coeff_mem_ker + (IsLocalRing.residue R) (g0 * q + h0 * p - fn)).2 + intro n + have hmem := hcorr n + rwa [IsLocalRing.ker_residue] + have hmap : + (g * q + h * p - fn).map (IsLocalRing.residue R) = 0 := by + calc + (g * q + h * p - fn).map (IsLocalRing.residue R) = + g.map (IsLocalRing.residue R) * q.map (IsLocalRing.residue R) + + h.map (IsLocalRing.residue R) * p.map (IsLocalRing.residue R) - + fn.map (IsLocalRing.residue R) := by + exact henselFactorization_map_mul_add_mul_sub (IsLocalRing.residue R) g h q p fn + _ = g0.map (IsLocalRing.residue R) * q.map (IsLocalRing.residue R) + + h0.map (IsLocalRing.residue R) * p.map (IsLocalRing.residue R) - + fn.map (IsLocalRing.residue R) := by + rw [hgmap, hhmap] + _ = (g0 * q + h0 * p - fn).map (IsLocalRing.residue R) := by + exact (henselFactorization_map_mul_add_mul_sub (IsLocalRing.residue R) g0 h0 q p fn).symm + _ = 0 := hcorrMap + intro n + have hker := + (henselFactorization_map_eq_zero_iff_coeff_mem_ker + (IsLocalRing.residue R) (g * q + h * p - fn)).1 hmap n + rwa [IsLocalRing.ker_residue] at hker + +/-- principal-ideal version of replacement of the initial +lifted factors by the current inductive approximants. If `g` and `h` are +still congruent to `g0` and `h0` modulo `(π)`, then a correction congruence +for `g0,h0` modulo `(π)` is also one for `g,h`. -/ +theorem henselFactorization_correction_congruence_replace_initial_factors_span_singleton + {R : Type*} [CommRing R] {π : R} + {g0 h0 g h fn p q : R[X]} + (hg : ∀ n : ℕ, (g - g0).coeff n ∈ Ideal.span ({π} : Set R)) + (hh : ∀ n : ℕ, (h - h0).coeff n ∈ Ideal.span ({π} : Set R)) + (hcorr : + ∀ n : ℕ, (g0 * q + h0 * p - fn).coeff n ∈ + Ideal.span ({π} : Set R)) : + ∀ n : ℕ, (g * q + h * p - fn).coeff n ∈ + Ideal.span ({π} : Set R) := by + let φ : R →+* R ⧸ Ideal.span ({π} : Set R) := + Ideal.Quotient.mk (Ideal.span ({π} : Set R)) + have hgmap : g.map φ = g0.map φ := by + simpa [φ] using + (henselFactorization_map_quotient_eq_iff_sub_coeff_mem + (Ideal.span ({π} : Set R)) g g0).2 hg + have hhmap : h.map φ = h0.map φ := by + simpa [φ] using + (henselFactorization_map_quotient_eq_iff_sub_coeff_mem + (Ideal.span ({π} : Set R)) h h0).2 hh + have hcorrMap : (g0 * q + h0 * p - fn).map φ = 0 := by + simpa [φ] using + (henselFactorization_map_quotient_eq_zero_iff_coeff_mem + (Ideal.span ({π} : Set R)) (g0 * q + h0 * p - fn)).2 hcorr + have hmap : (g * q + h * p - fn).map φ = 0 := by + calc + (g * q + h * p - fn).map φ = + g.map φ * q.map φ + h.map φ * p.map φ - fn.map φ := by + exact henselFactorization_map_mul_add_mul_sub φ g h q p fn + _ = g0.map φ * q.map φ + h0.map φ * p.map φ - fn.map φ := by + rw [hgmap, hhmap] + _ = (g0 * q + h0 * p - fn).map φ := by + exact (henselFactorization_map_mul_add_mul_sub φ g0 h0 q p fn).symm + _ = 0 := hcorrMap + intro n + exact + (henselFactorization_map_quotient_eq_zero_iff_coeff_mem + (Ideal.span ({π} : Set R)) (g * q + h * p - fn)).1 + (by simpa [φ] using hmap) n + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/WeakLimits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/WeakLimits.lean new file mode 100644 index 0000000000..53c746264f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/WeakLimits.lean @@ -0,0 +1,372 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.InfiniteApproximation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.AdicLimits +/-! +# maximal-ideal limit from displayed factors + +This file carries the displayed `C π` factors from the infinite Hensel +prefixes through the maximal-ideal complete-limit argument. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- each coefficient sequence of the displayed-factor +infinite `g`-approximants is adic Cauchy for the maximal-ideal filtration. -/ +theorem henselFactorization_infiniteG_coeff_adicCoeffCauchy_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) (i : ℕ) : + henselFactorizationAdicCoeffCauchy (IsLocalRing.maximalIdeal R) + (fun N : ℕ => + (henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + N).coeff i) := by + exact henselFactorization_coeff_adicCoeffCauchy_of_sub_coeff_mem + (IsLocalRing.maximalIdeal R) + (Pseq := fun N : ℕ => + henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + N) + (by + intro M N hMN i + exact henselFactorization_infiniteGIter_sub_coeff_mem_maximalIdeal_pow_of_le_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd hMN i) + i + +/-- the displayed-factor infinite `g`-approximants have a +bounded polynomial limit obtained from their coefficientwise adic limits. -/ +theorem henselFactorization_exists_infiniteG_limitPolynomial_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + [IsPrecomplete (IsLocalRing.maximalIdeal R) R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) : + ∃ G : R[X], G.natDegree ≤ m ∧ + ∀ n i : ℕ, + (henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) n - G).coeff i ∈ + IsLocalRing.maximalIdeal R ^ n := by + exact + henselFactorization_exists_limitPolynomial_of_bounded_coeffLimits + (IsLocalRing.maximalIdeal R) + (N := m) + (Pseq := fun n : ℕ => + henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + n) + (henselFactorization_infiniteGIter_natDegree_le_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + (fun i => + henselFactorization_infiniteG_coeff_adicCoeffCauchy_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd i) + +/-- each coefficient sequence of the displayed-factor +infinite `h`-approximants is adic Cauchy for the maximal-ideal filtration. -/ +theorem henselFactorization_infiniteH_coeff_adicCoeffCauchy_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) (i : ℕ) : + henselFactorizationAdicCoeffCauchy (IsLocalRing.maximalIdeal R) + (fun N : ℕ => + (henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + N).coeff i) := by + exact henselFactorization_coeff_adicCoeffCauchy_of_sub_coeff_mem + (IsLocalRing.maximalIdeal R) + (Pseq := fun N : ℕ => + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + N) + (by + intro M N hMN i + exact henselFactorization_infiniteHIter_sub_coeff_mem_maximalIdeal_pow_of_le_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd hMN i) + i + +/-- the displayed-factor infinite `h`-approximants have a +bounded polynomial limit obtained from their coefficientwise adic limits. -/ +theorem henselFactorization_exists_infiniteH_limitPolynomial_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + [IsPrecomplete (IsLocalRing.maximalIdeal R) R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) : + ∃ H : R[X], H.natDegree ≤ d - m ∧ + ∀ n i : ℕ, + (henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) n - H).coeff i ∈ + IsLocalRing.maximalIdeal R ^ n := by + exact + henselFactorization_exists_limitPolynomial_of_bounded_coeffLimits + (IsLocalRing.maximalIdeal R) + (N := d - m) + (Pseq := fun n : ℕ => + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + n) + (henselFactorization_infiniteHIter_natDegree_le_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd) + (fun i => + henselFactorization_infiniteH_coeff_adicCoeffCauchy_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd i) + +/-- complete-limit factorization from displayed initial +principal-element errors, without assuming `maximalIdeal ≤ (π)`. -/ +theorem henselFactorization_exists_limit_factorization_of_mem_span + {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] + [IsPrecomplete (IsLocalRing.maximalIdeal R) R] + [IsHausdorff (IsLocalRing.maximalIdeal R) R] + {π : R} (hπne : π ≠ 0) + (hπmem : π ∈ IsLocalRing.maximalIdeal R) + {f g0 h0 a b f1 e : R[X]} + {gbar hbar : (IsLocalRing.ResidueField R)[X]} {m d : ℕ} + (hf : f.natDegree ≤ d) + (hg0map : g0.map (IsLocalRing.residue R) = gbar) + (hh0map : h0.map (IsLocalRing.residue R) = hbar) + (hg0nat : g0.natDegree = m) + (hgbar_nat : gbar.natDegree = m) + (hglead : gbar.leadingCoeff ≠ 0) + (hh0deg : h0.natDegree ≤ d - m) + (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) + (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) + (hmd : m ≤ d) : + ∃ G H : R[X], + G.natDegree ≤ m ∧ H.natDegree ≤ d - m ∧ f = G * H ∧ + G.map (IsLocalRing.residue R) = gbar ∧ + H.map (IsLocalRing.residue R) = hbar := by + rcases henselFactorization_exists_infiniteG_limitPolynomial_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg hfactor0 hbezFactor hmd with + ⟨G, hGdeg, hGlim⟩ + rcases henselFactorization_exists_infiniteH_limitPolynomial_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg hfactor0 hbezFactor hmd with + ⟨H, hHdeg, hHlim⟩ + have hfactor : f = G * H := by + apply henselFactorization_limit_factor_eq_of_approximants + (I := IsLocalRing.maximalIdeal R) + (Gseq := fun n : ℕ => + henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg hfactor0 hbezFactor hmd) + n) + (Hseq := fun n : ℕ => + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg hfactor0 hbezFactor hmd) + n) + · intro n i + exact (Ideal.pow_le_pow_right (Nat.le_succ n)) + (henselFactorization_infiniteCorr_error_coeff_mem_maximalIdeal_pow_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg + hfactor0 hbezFactor hmd n i) + · exact hGlim + · exact hHlim + have hGred : ∀ i : ℕ, (G - g0).coeff i ∈ IsLocalRing.maximalIdeal R := + henselFactorization_limit_reduction_of_approx_reduction + (I := IsLocalRing.maximalIdeal R) + (Pseq := fun n : ℕ => + henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg hfactor0 hbezFactor hmd) + n) + (P := G) (P0 := g0) hGlim + (henselFactorization_infiniteGIter_reduction_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg hfactor0 hbezFactor hmd) + have hHred : ∀ i : ℕ, (H - h0).coeff i ∈ IsLocalRing.maximalIdeal R := + henselFactorization_limit_reduction_of_approx_reduction + (I := IsLocalRing.maximalIdeal R) + (Pseq := fun n : ℕ => + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg hfactor0 hbezFactor hmd) + n) + (P := H) (P0 := h0) hHlim + (henselFactorization_infiniteHIter_reduction_of_mem_span + (π := π) hπne hπmem + (f := f) (g0 := g0) (h0 := h0) + (a := a) (b := b) (f1 := f1) (e := e) + (gbar := gbar) (m := m) (d := d) + hf hg0map hg0nat hgbar_nat hglead hh0deg hfactor0 hbezFactor hmd) + have hGmap0 : + G.map (IsLocalRing.residue R) = + g0.map (IsLocalRing.residue R) := + henselFactorization_residue_map_eq_of_sub_coeff_mem_maximalIdeal hGred + have hHmap0 : + H.map (IsLocalRing.residue R) = + h0.map (IsLocalRing.residue R) := + henselFactorization_residue_map_eq_of_sub_coeff_mem_maximalIdeal hHred + refine ⟨G, H, hGdeg, hHdeg, hfactor, ?_, ?_⟩ + · rw [hGmap0, hg0map] + · rw [hHmap0, hh0map] + + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialBounds.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialBounds.lean new file mode 100644 index 0000000000..5458704bce --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialBounds.lean @@ -0,0 +1,817 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring +public import Mathlib.Algebra.Polynomial.Div +/-! +# reduction input for the coefficient estimate + +This file isolates the residue-polynomial input used in the +irreducible-polynomial coefficient estimate. For the closed-unit-ball valuation ring attached + to a nonarchimedean +absolute value, coefficients of value `< 1` reduce to zero and coefficients of +value `1` reduce to nonzero elements. Hence the first coefficient of value +`1` gives the exact initial `X`-power dividing the reduced polynomial. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- The coefficient norm `|f|` used in irreducible-polynomial lifting: the maximum absolute +value of the coefficients of `f`. -/ +noncomputable def polynomialCoeffAbsMax + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) (f : K[X]) : ℝ := + let T : Finset ℝ := + (Finset.range (f.natDegree + 1)).image fun i => v (f.coeff i) + T.max' (by + refine ⟨v (f.coeff 0), ?_⟩ + exact Finset.mem_image.mpr ⟨0, by simp, rfl⟩) + +/-- reduction input: a coefficient of absolute value `< 1` +reduces to the zero coefficient of the residue polynomial. -/ +theorem irreduciblePolynomial_reduction_coeff_eq_zero_of_abs_lt_one + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (F : (absoluteValueValuationSubring v hnonarch)[X]) + {i : ℕ} (hi : v (F.coeff i : K) < 1) : + (F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch))).coeff i = + 0 := by + rw [Polynomial.coeff_map] + exact + (absoluteValueUnitBallSubringAsValuationSubring_residue_eq_zero_iff_abs_lt_one + v hnonarch (F.coeff i)).2 hi + +/-- reduction input: a coefficient of absolute value `1` +reduces to a nonzero coefficient of the residue polynomial. -/ +theorem irreduciblePolynomial_reduction_coeff_ne_zero_of_abs_eq_one + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (F : (absoluteValueValuationSubring v hnonarch)[X]) + {i : ℕ} (hi : v (F.coeff i : K) = 1) : + (F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch))).coeff i ≠ + 0 := by + rw [Polynomial.coeff_map] + exact + (absoluteValueUnitBallSubringAsValuationSubring_residue_ne_zero_iff_abs_eq_one + v hnonarch (F.coeff i)).2 hi + +/-- reduction input: if all coefficients below `r` have +absolute value `< 1`, then `X^r` divides the reduced polynomial. -/ +theorem irreduciblePolynomial_reduction_X_pow_dvd_of_initial_abs_lt_one + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (F : (absoluteValueValuationSubring v hnonarch)[X]) + {r : ℕ} (hinit : ∀ i : ℕ, i < r → v (F.coeff i : K) < 1) : + Polynomial.X ^ r ∣ + F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) := by + rw [Polynomial.X_pow_dvd_iff] + intro i hi + exact irreduciblePolynomial_reduction_coeff_eq_zero_of_abs_lt_one + v hnonarch F (hinit i hi) + +/-- reduction input: if `r` is the first coefficient with +absolute value `1`, then the reduced polynomial is divisible by exactly +`X^r` at the origin. -/ +theorem irreduciblePolynomial_reduction_exact_X_pow_of_first_abs_eq_one + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (F : (absoluteValueValuationSubring v hnonarch)[X]) + {r : ℕ} (hinit : ∀ i : ℕ, i < r → v (F.coeff i : K) < 1) + (hr : v (F.coeff r : K) = 1) : + Polynomial.X ^ r ∣ + F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) ∧ + ¬ Polynomial.X ^ (r + 1) ∣ + F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) := by + constructor + · exact irreduciblePolynomial_reduction_X_pow_dvd_of_initial_abs_lt_one + v hnonarch F hinit + · intro hdiv + have hcoeff_zero : + (F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch))).coeff r = + 0 := by + rw [Polynomial.X_pow_dvd_iff] at hdiv + exact hdiv r (Nat.lt_succ_self r) + exact (irreduciblePolynomial_reduction_coeff_ne_zero_of_abs_eq_one + v hnonarch F hr) hcoeff_zero + +/-- reduction input: from any coefficient of value `1`, choose +the first such coefficient. Every earlier coefficient then has value `< 1` +because all coefficients already lie in the closed unit ball. -/ +theorem irreduciblePolynomial_exists_first_abs_eq_one_coeff + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (F : (absoluteValueValuationSubring v hnonarch)[X]) + {n : ℕ} (hn : v (F.coeff n : K) = 1) : + ∃ r : ℕ, + v (F.coeff r : K) = 1 ∧ + ∀ i : ℕ, i < r → v (F.coeff i : K) < 1 := by + classical + let P : ℕ → Prop := fun i => v (F.coeff i : K) = 1 + have hex : ∃ i : ℕ, P i := ⟨n, hn⟩ + refine ⟨Nat.find hex, Nat.find_spec hex, ?_⟩ + intro i hi + have hne : v (F.coeff i : K) ≠ 1 := + Nat.find_min hex hi + have hle : v (F.coeff i : K) ≤ 1 := + (mem_absoluteValueValuationSubring_iff + v hnonarch (F.coeff i : K)).1 (F.coeff i).property + exact lt_of_le_of_ne hle hne + +/-- reduction input: if some coefficient has value `1`, then +the reduced polynomial has an exact initial `X^r` divisor for the first such +coefficient `r`. -/ +theorem irreduciblePolynomial_exists_exact_X_pow_reduction_of_abs_eq_one_coeff + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (F : (absoluteValueValuationSubring v hnonarch)[X]) + {n : ℕ} (hn : v (F.coeff n : K) = 1) : + ∃ r : ℕ, + v (F.coeff r : K) = 1 ∧ + Polynomial.X ^ r ∣ + F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) ∧ + ¬ Polynomial.X ^ (r + 1) ∣ + F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) := by + rcases irreduciblePolynomial_exists_first_abs_eq_one_coeff v hnonarch F hn with + ⟨r, hr, hinit⟩ + exact ⟨r, hr, + irreduciblePolynomial_reduction_exact_X_pow_of_first_abs_eq_one + v hnonarch F hinit hr⟩ + +/-- reduction input: if the degree-zero coefficient has absolute +value `< 1`, then the first coefficient of value `1` has positive index. -/ +theorem irreduciblePolynomial_first_abs_eq_one_index_pos_of_const_abs_lt_one + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (F : (absoluteValueValuationSubring v hnonarch)[X]) + {r : ℕ} (hconst : v (F.coeff 0 : K) < 1) + (hr : v (F.coeff r : K) = 1) : + 0 < r := by + refine Nat.pos_of_ne_zero ?_ + intro hr0 + have hcoeff0 : v (F.coeff 0 : K) = 1 := by + simpa [hr0] using hr + have hlt : (1 : ℝ) < 1 := by + simp [hcoeff0] at hconst ⊢ + exact (lt_irrefl (1 : ℝ)) hlt + +/-- A coefficient whose absolute value is `1` is nonzero. This small +field-level fact is used repeatedly when passing from coefficient estimates to +degree bounds. -/ +theorem irreduciblePolynomial_coeff_ne_zero_of_abs_eq_one + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (F : (absoluteValueValuationSubring v hnonarch)[X]) + {i : ℕ} (hi : v (F.coeff i : K) = 1) : + F.coeff i ≠ 0 := by + intro hzero + simp [hzero] at hi + +/-- reduction input: if the leading coefficient has absolute +value `< 1`, then a coefficient of value `1` occurs strictly before the +natural degree. -/ +theorem irreduciblePolynomial_abs_eq_one_index_lt_natDegree_of_leading_abs_lt_one + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (F : (absoluteValueValuationSubring v hnonarch)[X]) + {r : ℕ} (hlead : v (F.leadingCoeff : K) < 1) + (hr : v (F.coeff r : K) = 1) : + r < F.natDegree := by + have hle : r ≤ F.natDegree := + Polynomial.le_natDegree_of_ne_zero + (irreduciblePolynomial_coeff_ne_zero_of_abs_eq_one v hnonarch F hr) + have hne : r ≠ F.natDegree := by + intro hrdeg + have hlead_eq : v (F.leadingCoeff : K) = 1 := by + simpa [Polynomial.leadingCoeff, hrdeg.symm] using hr + have hlt : (1 : ℝ) < 1 := by + simp [hlead_eq] at hlead ⊢ + exact (lt_irrefl (1 : ℝ)) hlt + exact lt_of_le_of_ne hle hne + +/-- finite support input: a coefficient of absolute value `1` +can only occur at an index bounded by the natural degree. -/ +theorem irreduciblePolynomial_abs_eq_one_index_le_natDegree + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (F : (absoluteValueValuationSubring v hnonarch)[X]) + {i : ℕ} (hi : v (F.coeff i : K) = 1) : + i ≤ F.natDegree := by + exact Polynomial.le_natDegree_of_ne_zero + (irreduciblePolynomial_coeff_ne_zero_of_abs_eq_one v hnonarch F hi) + +/-- reduction input: from any coefficient of value `1`, choose +the last such coefficient. -/ +theorem irreduciblePolynomial_exists_last_abs_eq_one_coeff + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (F : (absoluteValueValuationSubring v hnonarch)[X]) + {n : ℕ} (hn : v (F.coeff n : K) = 1) : + ∃ s : ℕ, + v (F.coeff s : K) = 1 ∧ + ∀ i : ℕ, v (F.coeff i : K) = 1 → i ≤ s := by + classical + let S : Finset ℕ := + (Finset.range (F.natDegree + 1)).filter + (fun i => v (F.coeff i : K) = 1) + have hnle : n ≤ F.natDegree := + irreduciblePolynomial_abs_eq_one_index_le_natDegree v hnonarch F hn + have hnmem : n ∈ S := by + simp [S, Finset.mem_range, Nat.lt_succ_of_le hnle, hn] + have hS : S.Nonempty := ⟨n, hnmem⟩ + refine ⟨S.max' hS, ?_, ?_⟩ + · have hmaxmem : S.max' hS ∈ S := S.max'_mem hS + have hmaxfilter : + S.max' hS ∈ (Finset.range (F.natDegree + 1)).filter + (fun i => v (F.coeff i : K) = 1) := by + simpa [S] using hmaxmem + exact (Finset.mem_filter.1 hmaxfilter).2 + · intro i hi + have hile : i ≤ F.natDegree := + irreduciblePolynomial_abs_eq_one_index_le_natDegree v hnonarch F hi + have himem : i ∈ S := by + simp [S, Finset.mem_range, Nat.lt_succ_of_le hile, hi] + exact S.le_max' i himem + +/-- reduction input: if the leading coefficient has absolute +value `< 1`, then the last coefficient of value `1` occurs strictly before the +natural degree. -/ +theorem irreduciblePolynomial_last_abs_eq_one_index_lt_natDegree_of_leading_abs_lt_one + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (F : (absoluteValueValuationSubring v hnonarch)[X]) + {s : ℕ} (hlead : v (F.leadingCoeff : K) < 1) + (hs : v (F.coeff s : K) = 1) : + s < F.natDegree := + irreduciblePolynomial_abs_eq_one_index_lt_natDegree_of_leading_abs_lt_one + v hnonarch F hlead hs + +/-- reduction input: the last coefficient of value `1` is the +natural degree of the reduced polynomial. -/ +theorem irreduciblePolynomial_reduction_natDegree_eq_last_abs_eq_one + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (F : (absoluteValueValuationSubring v hnonarch)[X]) + {s : ℕ} (hs : v (F.coeff s : K) = 1) + (hlast : ∀ i : ℕ, v (F.coeff i : K) = 1 → i ≤ s) : + (F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch))).natDegree = + s := by + refine Polynomial.natDegree_eq_of_le_of_coeff_ne_zero ?_ ?_ + · rw [Polynomial.natDegree_le_iff_coeff_eq_zero] + intro N hN + have hle : v (F.coeff N : K) ≤ 1 := + (mem_absoluteValueValuationSubring_iff + v hnonarch (F.coeff N : K)).1 (F.coeff N).property + have hne : v (F.coeff N : K) ≠ 1 := by + intro hNvalue + exact (not_lt_of_ge (hlast N hNvalue)) hN + exact irreduciblePolynomial_reduction_coeff_eq_zero_of_abs_lt_one + v hnonarch F (lt_of_le_of_ne hle hne) + · exact irreduciblePolynomial_reduction_coeff_ne_zero_of_abs_eq_one + v hnonarch F hs + +/-- reduction input: exact `X^r` divisibility rewrites the +reduced polynomial as `X^r` times its monic quotient. -/ +theorem irreduciblePolynomial_reduction_eq_X_pow_mul_divByMonic_of_X_pow_dvd + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (F : (absoluteValueValuationSubring v hnonarch)[X]) + {r : ℕ} + (hdiv : Polynomial.X ^ r ∣ + F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch))) : + F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) = + Polynomial.X ^ r * + (F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) /ₘ + Polynomial.X ^ r) := by + let P := + F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) + have hmonic : (Polynomial.X ^ r : + (IsLocalRing.ResidueField + (absoluteValueValuationSubring v hnonarch))[X]).Monic := + Polynomial.monic_X_pow r + have hmod : P %ₘ Polynomial.X ^ r = 0 := + (Polynomial.modByMonic_eq_zero_iff_dvd hmonic).2 hdiv + have hdecomp := Polynomial.modByMonic_add_div P (Polynomial.X ^ r) + rw [hmod, zero_add] at hdecomp + simpa [P] using hdecomp.symm + +/-- reduction input: exact nondivisibility by `X^(r+1)` says +that the monic quotient by `X^r` has nonzero degree-zero coefficient. -/ +theorem irreduciblePolynomial_reduction_divByMonic_X_pow_coeff_zero_ne_zero + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (F : (absoluteValueValuationSubring v hnonarch)[X]) + {r : ℕ} + (hdiv : Polynomial.X ^ r ∣ + F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch))) + (hnotdiv : ¬ Polynomial.X ^ (r + 1) ∣ + F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch))) : + ((F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) /ₘ + Polynomial.X ^ r).coeff 0) ≠ 0 := by + let P := + F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) + let Q := P /ₘ Polynomial.X ^ r + have hfac : P = Polynomial.X ^ r * Q := by + simpa [P, Q] using + irreduciblePolynomial_reduction_eq_X_pow_mul_divByMonic_of_X_pow_dvd + v hnonarch F hdiv + intro hQ0 + have hXdvdQ : Polynomial.X ∣ Q := by + rw [Polynomial.X_dvd_iff] + exact hQ0 + rcases hXdvdQ with ⟨T, hT⟩ + apply hnotdiv + refine ⟨T, ?_⟩ + calc + P = Polynomial.X ^ r * Q := hfac + _ = Polynomial.X ^ r * (Polynomial.X * T) := by rw [hT] + _ = Polynomial.X ^ (r + 1) * T := by + rw [pow_succ, mul_assoc] + +/-- Hensel input: if the quotient after removing the exact +initial `X^r` factor has nonzero degree-zero coefficient, then it is coprime +to `X^r`. -/ +theorem irreduciblePolynomial_reduction_X_pow_isCoprime_divByMonic_of_coeff_zero_ne_zero + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (F : (absoluteValueValuationSubring v hnonarch)[X]) + {r : ℕ} + (hQ0 : + ((F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) /ₘ + Polynomial.X ^ r).coeff 0) ≠ 0) : + IsCoprime (Polynomial.X ^ r) + (F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) /ₘ + Polynomial.X ^ r) := by + let P := + F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) + let Q := P /ₘ Polynomial.X ^ r + have hnotX : + ¬ (Polynomial.X : + (IsLocalRing.ResidueField + (absoluteValueValuationSubring v hnonarch))[X]) ∣ + Q := by + intro hX + exact hQ0 (by + simpa [P, Q] using (Polynomial.X_dvd_iff.mp hX)) + have hcopX : + IsCoprime + (Polynomial.X : + (IsLocalRing.ResidueField + (absoluteValueValuationSubring v hnonarch))[X]) + Q := by + exact + (Polynomial.prime_X + (R := IsLocalRing.ResidueField + (absoluteValueValuationSubring v hnonarch))).coprime_iff_not_dvd.2 + hnotX + simpa [P, Q] using (hcopX.pow_left (m := r)) + +/-- Hensel input: exact `X^r` divisibility of the reduction +supplies the coprime factor pair `X^r` and the remaining quotient. -/ +theorem irreduciblePolynomial_reduction_X_pow_isCoprime_divByMonic_of_exact + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (F : (absoluteValueValuationSubring v hnonarch)[X]) + {r : ℕ} + (hdiv : Polynomial.X ^ r ∣ + F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch))) + (hnotdiv : ¬ Polynomial.X ^ (r + 1) ∣ + F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch))) : + IsCoprime (Polynomial.X ^ r) + (F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) /ₘ + Polynomial.X ^ r) := by + exact + irreduciblePolynomial_reduction_X_pow_isCoprime_divByMonic_of_coeff_zero_ne_zero + v hnonarch F + (irreduciblePolynomial_reduction_divByMonic_X_pow_coeff_zero_ne_zero + v hnonarch F hdiv hnotdiv) + +/-- reduction input: after dividing the reduced polynomial by +`X^r`, the monic quotient has natural degree `s - r`. -/ +theorem irreduciblePolynomial_reduction_divByMonic_X_pow_natDegree + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (F : (absoluteValueValuationSubring v hnonarch)[X]) + {r s : ℕ} + (hnatDegree : + (F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch))).natDegree = + s) : + (F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) /ₘ + Polynomial.X ^ r).natDegree = + s - r := by + rw [Polynomial.natDegree_divByMonic] + · rw [hnatDegree] + simp + · exact Polynomial.monic_X_pow r + +/-- reduction input: under the endpoint inequalities used in +the proof, the first coefficient of value `1` gives a nontrivial exact +initial `X^r` divisor with `0 < r < natDegree`. -/ +theorem irreduciblePolynomial_exists_nontrivial_exact_X_pow_reduction + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (F : (absoluteValueValuationSubring v hnonarch)[X]) + (hconst : v (F.coeff 0 : K) < 1) + (hlead : v (F.leadingCoeff : K) < 1) + {n : ℕ} (hn : v (F.coeff n : K) = 1) : + ∃ r : ℕ, + 0 < r ∧ r < F.natDegree ∧ + v (F.coeff r : K) = 1 ∧ + Polynomial.X ^ r ∣ + F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) ∧ + ¬ Polynomial.X ^ (r + 1) ∣ + F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) := by + rcases irreduciblePolynomial_exists_exact_X_pow_reduction_of_abs_eq_one_coeff + v hnonarch F hn with + ⟨r, hr, hdiv, hnotdiv⟩ + exact ⟨r, + irreduciblePolynomial_first_abs_eq_one_index_pos_of_const_abs_lt_one + v hnonarch F hconst hr, + irreduciblePolynomial_abs_eq_one_index_lt_natDegree_of_leading_abs_lt_one + v hnonarch F hlead hr, + hr, hdiv, hnotdiv⟩ + +/-- Hensel input: under the endpoint inequalities used in the +proof, the reduction has a nontrivial monic factor `X^r`, the remaining +quotient, and these two factors are coprime. -/ +theorem irreduciblePolynomial_exists_hensel_reduction_factor_input + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (F : (absoluteValueValuationSubring v hnonarch)[X]) + (hconst : v (F.coeff 0 : K) < 1) + (hlead : v (F.leadingCoeff : K) < 1) + {n : ℕ} (hn : v (F.coeff n : K) = 1) : + ∃ r : ℕ, + 0 < r ∧ r < F.natDegree ∧ + F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) = + Polynomial.X ^ r * + (F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) /ₘ + Polynomial.X ^ r) ∧ + (Polynomial.X ^ r : + (IsLocalRing.ResidueField + (absoluteValueValuationSubring v hnonarch))[X]).natDegree = + r ∧ + IsCoprime (Polynomial.X ^ r) + (F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) /ₘ + Polynomial.X ^ r) ∧ + ((F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) /ₘ + Polynomial.X ^ r).coeff 0) ≠ 0 := by + rcases irreduciblePolynomial_exists_nontrivial_exact_X_pow_reduction + v hnonarch F hconst hlead hn with + ⟨r, hrpos, hrlt, _hr, hdiv, hnotdiv⟩ + refine ⟨r, hrpos, hrlt, ?_, ?_, ?_, ?_⟩ + · exact irreduciblePolynomial_reduction_eq_X_pow_mul_divByMonic_of_X_pow_dvd + v hnonarch F hdiv + · exact Polynomial.natDegree_X_pow r + · exact irreduciblePolynomial_reduction_X_pow_isCoprime_divByMonic_of_exact + v hnonarch F hdiv hnotdiv + · exact irreduciblePolynomial_reduction_divByMonic_X_pow_coeff_zero_ne_zero + v hnonarch F hdiv hnotdiv + +/-- field-polynomial input: once a field polynomial has been +normalized so that every coefficient lies in the closed unit ball and one +coefficient has value `1`, the endpoint inequalities produce the same Hensel +reduction factor data after choosing a degree-preserving valuation-ring lift. -/ +theorem irreduciblePolynomial_exists_hensel_reduction_factor_input_of_field_coeffs + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (f : K[X]) + (hfcoeff : ∀ i : ℕ, v (f.coeff i) ≤ 1) + (hconst : v (f.coeff 0) < 1) + (hlead : v f.leadingCoeff < 1) + {n : ℕ} (hn : v (f.coeff n) = 1) : + ∃ F : (absoluteValueValuationSubring v hnonarch)[X], + ∃ r : ℕ, + F.map (algebraMap + (absoluteValueValuationSubring v hnonarch) K) = + f ∧ + F.natDegree = f.natDegree ∧ + 0 < r ∧ r < F.natDegree ∧ + F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) = + Polynomial.X ^ r * + (F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) /ₘ + Polynomial.X ^ r) ∧ + (Polynomial.X ^ r : + (IsLocalRing.ResidueField + (absoluteValueValuationSubring v hnonarch))[X]).natDegree = + r ∧ + IsCoprime (Polynomial.X ^ r) + (F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) /ₘ + Polynomial.X ^ r) ∧ + ((F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) /ₘ + Polynomial.X ^ r).coeff 0) ≠ 0 := by + rcases + exists_polynomial_over_absoluteValueUnitBallSubringAsValuationSubring_of_coeff_abs_le_one + v hnonarch f hfcoeff with + ⟨F, hmap, hdegree, hcoeff_abs⟩ + have hconstF : v (F.coeff 0 : K) < 1 := by + simpa [hcoeff_abs 0] using hconst + have hleadF : v (F.leadingCoeff : K) < 1 := by + have hlead_abs : + v (F.leadingCoeff : K) = v f.leadingCoeff := by + rw [Polynomial.leadingCoeff, Polynomial.leadingCoeff, ← hdegree] + exact hcoeff_abs F.natDegree + simpa [hlead_abs] using hlead + have hnF : v (F.coeff n : K) = 1 := by + simpa [hcoeff_abs n] using hn + rcases irreduciblePolynomial_exists_hensel_reduction_factor_input + v hnonarch F hconstF hleadF hnF with + ⟨r, hrpos, hrlt, hfactor, hnatDegree, hcoprime, hQ0⟩ + exact + ⟨F, r, hmap, hdegree, hrpos, hrlt, hfactor, hnatDegree, hcoprime, hQ0⟩ + +/-- normalization source: a nonzero polynomial has a positive +maximum among the absolute values of its coefficients, attained within the +finite coefficient range up to `natDegree`. -/ +theorem irreduciblePolynomial_exists_coeff_abs_max_of_ne_zero + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + {f : K[X]} (hf : f ≠ 0) : + ∃ m : ℝ, ∃ n : ℕ, + 0 < m ∧ n ≤ f.natDegree ∧ v (f.coeff n) = m ∧ + ∀ i : ℕ, v (f.coeff i) ≤ m := by + classical + let S : Finset ℕ := Finset.range (f.natDegree + 1) + let T : Finset ℝ := S.image fun i => v (f.coeff i) + have hdegmem : f.natDegree ∈ S := by + simp [S] + have hT : T.Nonempty := by + exact ⟨v (f.coeff f.natDegree), + Finset.mem_image.mpr ⟨f.natDegree, hdegmem, rfl⟩⟩ + let m : ℝ := T.max' hT + have hlead_ne : f.leadingCoeff ≠ 0 := + (Polynomial.leadingCoeff_ne_zero).2 hf + have hlead_pos : 0 < v f.leadingCoeff := by + have hv_ne : v f.leadingCoeff ≠ 0 := by + intro hzero + exact hlead_ne ((v.eq_zero).1 hzero) + exact lt_of_le_of_ne (v.nonneg f.leadingCoeff) hv_ne.symm + have hlead_le_m : v f.leadingCoeff ≤ m := by + have hmem : v (f.coeff f.natDegree) ∈ T := + Finset.mem_image.mpr ⟨f.natDegree, hdegmem, rfl⟩ + change v (f.coeff f.natDegree) ≤ m + exact T.le_max' _ hmem + have hmpos : 0 < m := hlead_pos.trans_le hlead_le_m + have hmaxmem : m ∈ T := T.max'_mem hT + rcases Finset.mem_image.mp hmaxmem with ⟨n, hnS, hnmax⟩ + have hnle : n ≤ f.natDegree := by + exact Nat.lt_succ_iff.mp (by simpa [S] using hnS) + refine ⟨m, n, hmpos, hnle, hnmax, ?_⟩ + intro i + by_cases hi : i ≤ f.natDegree + · have hiS : i ∈ S := by + simp [S, Nat.lt_succ_of_le hi] + have himem : v (f.coeff i) ∈ T := + Finset.mem_image.mpr ⟨i, hiS, rfl⟩ + exact T.le_max' _ himem + · have hlt : f.natDegree < i := Nat.lt_of_not_ge hi + have hzero : f.coeff i = 0 := + Polynomial.coeff_eq_zero_of_natDegree_lt hlt + rw [hzero, map_zero] + exact hmpos.le + +/-- normalization source: dividing a nonzero polynomial by a +coefficient whose absolute value is the positive coefficient maximum preserves +degree, puts every coefficient in the closed unit ball, and makes that chosen +coefficient have value `1`. -/ +theorem irreduciblePolynomial_scale_by_max_coeff_abs_data + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + {f : K[X]} {m : ℝ} {n : ℕ} + (hmpos : 0 < m) + (hnmax : v (f.coeff n) = m) + (hbound : ∀ i : ℕ, v (f.coeff i) ≤ m) : + let g : K[X] := Polynomial.C (f.coeff n)⁻¹ * f + g.natDegree = f.natDegree ∧ + (∀ i : ℕ, v (g.coeff i) = m⁻¹ * v (f.coeff i)) ∧ + (∀ i : ℕ, v (g.coeff i) ≤ 1) ∧ + v (g.coeff n) = 1 := by + let g : K[X] := Polynomial.C (f.coeff n)⁻¹ * f + have hmne : m ≠ 0 := ne_of_gt hmpos + have hn_ne : f.coeff n ≠ 0 := by + intro hzero + have h0m : (0 : ℝ) = m := by + simpa [hzero] using hnmax + exact hmne h0m.symm + have hdegree : g.natDegree = f.natDegree := by + dsimp [g] + exact Polynomial.natDegree_C_mul (p := f) (a0 := inv_ne_zero hn_ne) + have hcoeff_abs : ∀ i : ℕ, v (g.coeff i) = m⁻¹ * v (f.coeff i) := by + intro i + dsimp [g] + calc + v ((Polynomial.C (f.coeff n)⁻¹ * f).coeff i) = + v ((f.coeff n)⁻¹ * f.coeff i) := by + rw [Polynomial.coeff_C_mul] + _ = v ((f.coeff n)⁻¹) * v (f.coeff i) := by + rw [v.map_mul] + _ = m⁻¹ * v (f.coeff i) := by + rw [map_inv₀, hnmax] + have hcoeff_le : ∀ i : ℕ, v (g.coeff i) ≤ 1 := by + intro i + rw [hcoeff_abs i] + calc + m⁻¹ * v (f.coeff i) ≤ m⁻¹ * m := + mul_le_mul_of_nonneg_left (hbound i) (inv_nonneg.mpr hmpos.le) + _ = 1 := inv_mul_cancel₀ hmne + have hn_one : v (g.coeff n) = 1 := by + rw [hcoeff_abs n, hnmax, inv_mul_cancel₀ hmne] + exact ⟨hdegree, hcoeff_abs, hcoeff_le, hn_one⟩ + +/-- normalization source: every nonzero field polynomial has a +scaled polynomial with coefficient maximum `1`, obtained by dividing by a +coefficient that attains the original positive maximum. -/ +theorem irreduciblePolynomial_exists_normalized_scale_of_ne_zero + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + {f : K[X]} (hf : f ≠ 0) : + ∃ m : ℝ, ∃ n : ℕ, ∃ g : K[X], + 0 < m ∧ n ≤ f.natDegree ∧ + v (f.coeff n) = m ∧ + (∀ i : ℕ, v (f.coeff i) ≤ m) ∧ + g = Polynomial.C (f.coeff n)⁻¹ * f ∧ + g.natDegree = f.natDegree ∧ + (∀ i : ℕ, v (g.coeff i) = m⁻¹ * v (f.coeff i)) ∧ + (∀ i : ℕ, v (g.coeff i) ≤ 1) ∧ + v (g.coeff n) = 1 := by + rcases irreduciblePolynomial_exists_coeff_abs_max_of_ne_zero + v hf with + ⟨m, n, hmpos, hnle, hnmax, hbound⟩ + let g : K[X] := Polynomial.C (f.coeff n)⁻¹ * f + rcases irreduciblePolynomial_scale_by_max_coeff_abs_data + v hmpos hnmax hbound with + ⟨hdegree, hcoeff_abs, hcoeff_le, hn_one⟩ + exact + ⟨m, n, g, hmpos, hnle, hnmax, hbound, rfl, hdegree, + hcoeff_abs, hcoeff_le, hn_one⟩ + +/-- normalization source: if the original constant and +leading coefficients are strictly smaller than the coefficient maximum, then +after scaling by a maximum coefficient they are strictly inside the open unit +ball. -/ +theorem irreduciblePolynomial_normalized_scale_endpoint_abs_lt_one + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + {f g : K[X]} {m : ℝ} + (hmpos : 0 < m) + (hdegree : g.natDegree = f.natDegree) + (hcoeff_abs : ∀ i : ℕ, v (g.coeff i) = m⁻¹ * v (f.coeff i)) + (hconst : v (f.coeff 0) < m) + (hlead : v f.leadingCoeff < m) : + v (g.coeff 0) < 1 ∧ v g.leadingCoeff < 1 := by + have hmne : m ≠ 0 := ne_of_gt hmpos + constructor + · rw [hcoeff_abs 0] + calc + m⁻¹ * v (f.coeff 0) < m⁻¹ * m := + mul_lt_mul_of_pos_left hconst (inv_pos.mpr hmpos) + _ = 1 := inv_mul_cancel₀ hmne + · have hlead_abs : + v g.leadingCoeff = m⁻¹ * v f.leadingCoeff := by + rw [Polynomial.leadingCoeff, Polynomial.leadingCoeff, ← hdegree] + exact hcoeff_abs g.natDegree + rw [hlead_abs] + calc + m⁻¹ * v f.leadingCoeff < m⁻¹ * m := + mul_lt_mul_of_pos_left hlead (inv_pos.mpr hmpos) + _ = 1 := inv_mul_cancel₀ hmne + +/-- normalized Hensel input: after scaling by a coefficient +that attains the positive coefficient maximum, strict endpoint bounds below +that maximum give the exact Hensel reduction factor input for the scaled +polynomial. -/ +theorem irreduciblePolynomial_normalized_scale_hensel_reduction_factor_input + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + {f : K[X]} {m : ℝ} {n : ℕ} + (hmpos : 0 < m) + (hnmax : v (f.coeff n) = m) + (hbound : ∀ i : ℕ, v (f.coeff i) ≤ m) + (hconst : v (f.coeff 0) < m) + (hlead : v f.leadingCoeff < m) : + let g : K[X] := Polynomial.C (f.coeff n)⁻¹ * f + ∃ F : (absoluteValueValuationSubring v hnonarch)[X], + ∃ r : ℕ, + F.map (algebraMap + (absoluteValueValuationSubring v hnonarch) K) = + g ∧ + F.natDegree = g.natDegree ∧ + 0 < r ∧ r < F.natDegree ∧ + F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) = + Polynomial.X ^ r * + (F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) /ₘ + Polynomial.X ^ r) ∧ + (Polynomial.X ^ r : + (IsLocalRing.ResidueField + (absoluteValueValuationSubring v hnonarch))[X]).natDegree = + r ∧ + IsCoprime (Polynomial.X ^ r) + (F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) /ₘ + Polynomial.X ^ r) ∧ + ((F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) /ₘ + Polynomial.X ^ r).coeff 0) ≠ 0 := by + let g : K[X] := Polynomial.C (f.coeff n)⁻¹ * f + rcases irreduciblePolynomial_scale_by_max_coeff_abs_data + v hmpos hnmax hbound with + ⟨hdegree, hcoeff_abs, hcoeff_le, hn_one⟩ + rcases irreduciblePolynomial_normalized_scale_endpoint_abs_lt_one + v hmpos hdegree hcoeff_abs hconst hlead with + ⟨hconstg, hleadg⟩ + exact + irreduciblePolynomial_exists_hensel_reduction_factor_input_of_field_coeffs + v hnonarch g hcoeff_le hconstg hleadg hn_one + +/-- reduction input: under the endpoint inequalities, choose +the first and last coefficients of value `1`; the first gives the exact +initial `X^r` divisor and the last lies before the natural degree. -/ +theorem irreduciblePolynomial_exists_first_last_abs_eq_one_coeff + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (F : (absoluteValueValuationSubring v hnonarch)[X]) + (hconst : v (F.coeff 0 : K) < 1) + (hlead : v (F.leadingCoeff : K) < 1) + {n : ℕ} (hn : v (F.coeff n : K) = 1) : + ∃ r s : ℕ, + 0 < r ∧ r ≤ s ∧ s < F.natDegree ∧ + v (F.coeff r : K) = 1 ∧ + v (F.coeff s : K) = 1 ∧ + (∀ i : ℕ, i < r → v (F.coeff i : K) < 1) ∧ + (∀ i : ℕ, v (F.coeff i : K) = 1 → i ≤ s) ∧ + Polynomial.X ^ r ∣ + F.map (IsLocalRing.residue + (absoluteValueValuationSubring + v hnonarch)) ∧ + ¬ Polynomial.X ^ (r + 1) ∣ + F.map (IsLocalRing.residue + (absoluteValueValuationSubring + v hnonarch)) ∧ + (F.map (IsLocalRing.residue + (absoluteValueValuationSubring + v hnonarch))).natDegree = s := by + rcases irreduciblePolynomial_exists_first_abs_eq_one_coeff v hnonarch F hn with + ⟨r, hr, hinit⟩ + rcases irreduciblePolynomial_exists_last_abs_eq_one_coeff v hnonarch F hn with + ⟨s, hs, hlast⟩ + rcases irreduciblePolynomial_reduction_exact_X_pow_of_first_abs_eq_one + v hnonarch F hinit hr with + ⟨hdiv, hnotdiv⟩ + exact ⟨r, s, + irreduciblePolynomial_first_abs_eq_one_index_pos_of_const_abs_lt_one + v hnonarch F hconst hr, + hlast r hr, + irreduciblePolynomial_last_abs_eq_one_index_lt_natDegree_of_leading_abs_lt_one + v hnonarch F hlead hs, + hr, hs, hinit, hlast, hdiv, hnotdiv, + irreduciblePolynomial_reduction_natDegree_eq_last_abs_eq_one + v hnonarch F hs hlast⟩ + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialLifting.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialLifting.lean new file mode 100644 index 0000000000..8adaaedd8d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialLifting.lean @@ -0,0 +1,374 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Assembly +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialBounds +/-! +# Hensel obstruction to irreducibility + +This file applies the explicit Hensel lemma from the coefficientwise Hensel construction to the +normalized residue input constructed by the coefficient-bound lemmas. The result here is the +core contradiction for irreducible-polynomial lifting: a nontrivial factorization of +the reduction gives a nontrivial factorization over the complete valuation +ring, hence the mapped field polynomial is not irreducible. +-/ + +@[expose] public section + +noncomputable +section + +open scoped Polynomial + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- algebraic obstruction: a field polynomial with a factor of +positive degree strictly smaller than its own degree is not irreducible. -/ +theorem irreduciblePolynomial_not_irreducible_of_field_factor_natDegree_lt + {K : Type*} [Field K] {f g h : K[X]} + (hfactor : f = g * h) + (hgpos : 0 < g.natDegree) + (hglt : g.natDegree < f.natDegree) : + ¬ Irreducible f := by + intro hirr + have hg_notunit : ¬ IsUnit g := by + intro hgunit + exact (Nat.ne_of_gt hgpos) (Polynomial.natDegree_eq_zero_of_isUnit hgunit) + rcases hirr.isUnit_or_isUnit hfactor with hgunit | hhunit + · exact hg_notunit hgunit + · have hg_ne : g ≠ 0 := by + intro hgzero + simp [hgzero] at hgpos + have hh_ne : h ≠ 0 := hhunit.ne_zero + have hdeg : f.natDegree = g.natDegree := by + simpa [hfactor, Polynomial.natDegree_eq_zero_of_isUnit hhunit] using + (Polynomial.natDegree_mul hg_ne hh_ne) + exact (Nat.ne_of_lt hglt) hdeg.symm + +/-- transport obstruction: a nontrivial factorization over the +closed-unit-ball valuation ring maps to a nontrivial field factorization. -/ +theorem irreduciblePolynomial_not_irreducible_of_valuation_factorization + {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + {F G H : (absoluteValueValuationSubring v hnonarch)[X]} + {f : K[X]} {r : ℕ} + (hFmap : F.map (algebraMap + (absoluteValueValuationSubring v hnonarch) K) = f) + (hFdegree : F.natDegree = f.natDegree) + (hfactor : F = G * H) + (hGdegree : G.natDegree = r) + (hrpos : 0 < r) + (hrlt : r < F.natDegree) : + ¬ Irreducible f := by + let V := absoluteValueValuationSubring v hnonarch + let φ : V →+* K := algebraMap V K + have hφinj : Function.Injective φ := by + intro x y hxy + exact Subtype.ext (by simpa [φ] using hxy) + let Gk : K[X] := G.map φ + let Hk : K[X] := H.map φ + have hfacK : f = Gk * Hk := by + calc + f = F.map φ := hFmap.symm + _ = (G * H).map φ := by rw [hfactor] + _ = G.map φ * H.map φ := by simp [Polynomial.map_mul] + _ = Gk * Hk := rfl + have hGkDegree : Gk.natDegree = r := by + calc + Gk.natDegree = G.natDegree := by + simpa [Gk] using Polynomial.natDegree_map_eq_of_injective hφinj G + _ = r := hGdegree + have hGkpos : 0 < Gk.natDegree := by + simpa [hGkDegree] using hrpos + have hGklt : Gk.natDegree < f.natDegree := by + simpa [hGkDegree, hFdegree] using hrlt + exact irreduciblePolynomial_not_irreducible_of_field_factor_natDegree_lt + hfacK hGkpos hGklt + +/-- The common nonvanishing step in the three irreducible-polynomial lifting Hensel routes: +if a polynomial is `X ^ r` times a polynomial with nonzero constant +coefficient, then it is nonzero. -/ +theorem irreduciblePolynomial_polynomial_ne_zero_of_eq_X_pow_mul_of_coeff_zero_ne_zero + {k : Type*} [Field k] {P Q : k[X]} {r : ℕ} + (hfactor : P = Polynomial.X ^ r * Q) + (hQ0 : Q.coeff 0 ≠ 0) : + P ≠ 0 := by + have hQne : Q ≠ 0 := by + intro hQzero + exact hQ0 (by simp [hQzero]) + rw [hfactor] + exact mul_ne_zero (pow_ne_zero r Polynomial.X_ne_zero) hQne + +/-- Hensel obstruction: the normalized `X^r` residue factor +input from the residue-polynomial coefficient bounds, together with the adic completeness and + separatedness +needed by the coefficientwise Hensel construction, contradicts irreducibility of the mapped field +polynomial. -/ +theorem irreduciblePolynomial_hensel_reduction_factor_input_not_irreducible + {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + [IsPrecomplete (IsLocalRing.maximalIdeal + (absoluteValueValuationSubring v hnonarch)) + (absoluteValueValuationSubring v hnonarch)] + [IsHausdorff (IsLocalRing.maximalIdeal + (absoluteValueValuationSubring v hnonarch)) + (absoluteValueValuationSubring v hnonarch)] + (F : (absoluteValueValuationSubring v hnonarch)[X]) + {r : ℕ} + (hrpos : 0 < r) (hrlt : r < F.natDegree) + (hfactor : + F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) = + Polynomial.X ^ r * + (F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) /ₘ + Polynomial.X ^ r)) + (hnatDegree : (Polynomial.X ^ r : + (IsLocalRing.ResidueField + (absoluteValueValuationSubring v hnonarch))[X]).natDegree = + r) + (hcoprime : IsCoprime (Polynomial.X ^ r) + (F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) /ₘ + Polynomial.X ^ r)) + (hQ0 : ((F.map (IsLocalRing.residue + (absoluteValueValuationSubring v hnonarch)) /ₘ + Polynomial.X ^ r).coeff 0) ≠ 0) + {f : K[X]} + (hFmap : F.map (algebraMap + (absoluteValueValuationSubring v hnonarch) K) = f) + (hFdegree : F.natDegree = f.natDegree) : + ¬ Irreducible f := by + let V := absoluteValueValuationSubring v hnonarch + let k := IsLocalRing.ResidueField V + let fbar : k[X] := F.map (IsLocalRing.residue V) + let qbar : k[X] := fbar /ₘ Polynomial.X ^ r + have hprim : F.map (IsLocalRing.residue V) ≠ 0 := by + exact + irreduciblePolynomial_polynomial_ne_zero_of_eq_X_pow_mul_of_coeff_zero_ne_zero + hfactor hQ0 + rcases henselFactorization_exists_limit_factorization_of_residual_factors_valuationRing + (R := V) (f := F) (gbar := (Polynomial.X ^ r : k[X])) (hbar := qbar) + hprim (by simpa [V, k, fbar, qbar] using hfactor) hcoprime with + ⟨G, H, hGdegree_res, _hHle, hGH, _hGmap, _hHmap⟩ + have hGdegree : G.natDegree = r := hGdegree_res.trans hnatDegree + exact irreduciblePolynomial_not_irreducible_of_valuation_factorization + v hnonarch hFmap hFdegree hGH hGdegree hrpos hrlt + +/-- coefficient form: if a field polynomial already has all +coefficients in the closed unit ball, with both endpoints in the open unit +ball and some coefficient on the unit sphere, then Hensel's lemma contradicts +irreducibility. -/ +theorem irreduciblePolynomial_field_coeffs_hensel_input_not_irreducible + {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + [IsPrecomplete (IsLocalRing.maximalIdeal + (absoluteValueValuationSubring v hnonarch)) + (absoluteValueValuationSubring v hnonarch)] + [IsHausdorff (IsLocalRing.maximalIdeal + (absoluteValueValuationSubring v hnonarch)) + (absoluteValueValuationSubring v hnonarch)] + (f : K[X]) + (hfcoeff : ∀ i : ℕ, v (f.coeff i) ≤ 1) + (hconst : v (f.coeff 0) < 1) + (hlead : v f.leadingCoeff < 1) + {n : ℕ} (hn : v (f.coeff n) = 1) : + ¬ Irreducible f := by + rcases irreduciblePolynomial_exists_hensel_reduction_factor_input_of_field_coeffs + v hnonarch f hfcoeff hconst hlead hn with + ⟨F, r, hFmap, hFdegree, hrpos, hrlt, hfactor, hnatDegree, hcoprime, hQ0⟩ + exact irreduciblePolynomial_hensel_reduction_factor_input_not_irreducible + v hnonarch F hrpos hrlt hfactor hnatDegree hcoprime hQ0 + hFmap hFdegree + +/-- normalized-scale obstruction: after dividing by a +coefficient whose absolute value is the positive coefficient maximum, strict +endpoint inequalities force the scaled polynomial to be reducible. -/ +theorem irreduciblePolynomial_normalized_scale_hensel_input_not_irreducible + {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + [IsPrecomplete (IsLocalRing.maximalIdeal + (absoluteValueValuationSubring v hnonarch)) + (absoluteValueValuationSubring v hnonarch)] + [IsHausdorff (IsLocalRing.maximalIdeal + (absoluteValueValuationSubring v hnonarch)) + (absoluteValueValuationSubring v hnonarch)] + {f : K[X]} {m : ℝ} {n : ℕ} + (hmpos : 0 < m) + (hnmax : v (f.coeff n) = m) + (hbound : ∀ i : ℕ, v (f.coeff i) ≤ m) + (hconst : v (f.coeff 0) < m) + (hlead : v f.leadingCoeff < m) : + let g : K[X] := Polynomial.C (f.coeff n)⁻¹ * f + ¬ Irreducible g := by + let g : K[X] := Polynomial.C (f.coeff n)⁻¹ * f + rcases irreduciblePolynomial_normalized_scale_hensel_reduction_factor_input + v hnonarch hmpos hnmax hbound hconst hlead with + ⟨F, r, hFmap, hFdegree, hrpos, hrlt, hfactor, hnatDegree, hcoprime, hQ0⟩ + exact irreduciblePolynomial_hensel_reduction_factor_input_not_irreducible + v hnonarch F hrpos hrlt hfactor hnatDegree hcoprime hQ0 + hFmap hFdegree + +/-- scalar normalization preserves irreducibility: multiplying +by the inverse of a nonzero coefficient is multiplication by a unit. -/ +theorem irreduciblePolynomial_irreducible_normalized_scale_of_irreducible + {K : Type*} [Field K] (v : AbsoluteValue K ℝ) + {f : K[X]} {m : ℝ} {n : ℕ} + (hmpos : 0 < m) + (hnmax : v (f.coeff n) = m) + (hirr : Irreducible f) : + Irreducible (Polynomial.C (f.coeff n)⁻¹ * f) := by + have hmne : m ≠ 0 := ne_of_gt hmpos + have hn_ne : f.coeff n ≠ 0 := by + intro hzero + have h0m : (0 : ℝ) = m := by + simpa [hzero] using hnmax + exact hmne h0m.symm + have hunit : + IsUnit (Polynomial.C (f.coeff n)⁻¹ : K[X]) := + Polynomial.isUnit_C.mpr (isUnit_iff_ne_zero.mpr (inv_ne_zero hn_ne)) + exact (irreducible_isUnit_mul hunit).2 hirr + +/-- endpoint contradiction: for an irreducible polynomial, +the positive maximum of the coefficient absolute values cannot be strictly +larger than both endpoint absolute values. -/ +theorem irreduciblePolynomial_not_both_endpoint_abs_lt_coeff_max_of_irreducible + {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + [IsPrecomplete (IsLocalRing.maximalIdeal + (absoluteValueValuationSubring v hnonarch)) + (absoluteValueValuationSubring v hnonarch)] + [IsHausdorff (IsLocalRing.maximalIdeal + (absoluteValueValuationSubring v hnonarch)) + (absoluteValueValuationSubring v hnonarch)] + {f : K[X]} {m : ℝ} {n : ℕ} + (hirr : Irreducible f) + (hmpos : 0 < m) + (hnmax : v (f.coeff n) = m) + (hbound : ∀ i : ℕ, v (f.coeff i) ≤ m) : + ¬ (v (f.coeff 0) < m ∧ v f.leadingCoeff < m) := by + intro hend + have hscaled_irreducible : + Irreducible (Polynomial.C (f.coeff n)⁻¹ * f) := + irreduciblePolynomial_irreducible_normalized_scale_of_irreducible + v hmpos hnmax hirr + have hscaled_not_irreducible : + ¬ Irreducible (Polynomial.C (f.coeff n)⁻¹ * f) := + irreduciblePolynomial_normalized_scale_hensel_input_not_irreducible + v hnonarch hmpos hnmax hbound hend.1 hend.2 + exact hscaled_not_irreducible hscaled_irreducible + +/-- coefficient maximum estimate for a chosen positive +coefficient maximum. -/ +theorem irreduciblePolynomial_coeff_max_le_endpoint_max_of_irreducible + {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + [IsPrecomplete (IsLocalRing.maximalIdeal + (absoluteValueValuationSubring v hnonarch)) + (absoluteValueValuationSubring v hnonarch)] + [IsHausdorff (IsLocalRing.maximalIdeal + (absoluteValueValuationSubring v hnonarch)) + (absoluteValueValuationSubring v hnonarch)] + {f : K[X]} {m : ℝ} {n : ℕ} + (hirr : Irreducible f) + (hmpos : 0 < m) + (hnmax : v (f.coeff n) = m) + (hbound : ∀ i : ℕ, v (f.coeff i) ≤ m) : + m ≤ max (v (f.coeff 0)) (v f.leadingCoeff) := by + by_contra hnot + have hmaxlt : max (v (f.coeff 0)) (v f.leadingCoeff) < m := + lt_of_not_ge hnot + have hconst : v (f.coeff 0) < m := + (le_max_left (v (f.coeff 0)) (v f.leadingCoeff)).trans_lt hmaxlt + have hlead : v f.leadingCoeff < m := + (le_max_right (v (f.coeff 0)) (v f.leadingCoeff)).trans_lt hmaxlt + exact irreduciblePolynomial_not_both_endpoint_abs_lt_coeff_max_of_irreducible + v hnonarch hirr hmpos hnmax hbound ⟨hconst, hlead⟩ + +/-- coefficient estimate: every coefficient of an irreducible +polynomial is bounded by the larger of the degree-zero and leading +coefficients. -/ +theorem irreduciblePolynomial_coeff_abs_le_endpoint_max_of_irreducible + {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + [IsPrecomplete (IsLocalRing.maximalIdeal + (absoluteValueValuationSubring v hnonarch)) + (absoluteValueValuationSubring v hnonarch)] + [IsHausdorff (IsLocalRing.maximalIdeal + (absoluteValueValuationSubring v hnonarch)) + (absoluteValueValuationSubring v hnonarch)] + {f : K[X]} (hirr : Irreducible f) : + ∀ i : ℕ, v (f.coeff i) ≤ max (v (f.coeff 0)) (v f.leadingCoeff) := by + rcases irreduciblePolynomial_exists_coeff_abs_max_of_ne_zero + v hirr.ne_zero with + ⟨m, n, hmpos, _hnle, hnmax, hbound⟩ + have hmle : m ≤ max (v (f.coeff 0)) (v f.leadingCoeff) := + irreduciblePolynomial_coeff_max_le_endpoint_max_of_irreducible + v hnonarch hirr hmpos hnmax hbound + intro i + exact (hbound i).trans hmle + +/-- monic consequence: if an irreducible monic polynomial has +degree-zero coefficient in the closed unit ball, then every coefficient lies in +the closed unit ball. -/ +theorem irreduciblePolynomial_monic_coeff_abs_le_one_of_const_abs_le_one_of_irreducible + {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + [IsPrecomplete (IsLocalRing.maximalIdeal + (absoluteValueValuationSubring v hnonarch)) + (absoluteValueValuationSubring v hnonarch)] + [IsHausdorff (IsLocalRing.maximalIdeal + (absoluteValueValuationSubring v hnonarch)) + (absoluteValueValuationSubring v hnonarch)] + {f : K[X]} (hirr : Irreducible f) + (hmonic : f.Monic) + (hconst : v (f.coeff 0) ≤ 1) : + ∀ i : ℕ, v (f.coeff i) ≤ 1 := by + have hlead : v f.leadingCoeff = 1 := by + rw [hmonic.leadingCoeff] + simp + have hendpoint : + max (v (f.coeff 0)) (v f.leadingCoeff) ≤ 1 := by + rw [hlead] + exact max_le hconst le_rfl + intro i + exact + (irreduciblePolynomial_coeff_abs_le_endpoint_max_of_irreducible + v hnonarch hirr i).trans hendpoint + +/-- monic lift consequence: the preceding coefficient bound +gives a degree-preserving lift to the closed-unit-ball valuation ring. -/ +theorem irreduciblePolynomial_exists_valuation_lift_of_monic_const_abs_le_one_of_irreducible + {K : Type*} [Field K] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + [IsPrecomplete (IsLocalRing.maximalIdeal + (absoluteValueValuationSubring v hnonarch)) + (absoluteValueValuationSubring v hnonarch)] + [IsHausdorff (IsLocalRing.maximalIdeal + (absoluteValueValuationSubring v hnonarch)) + (absoluteValueValuationSubring v hnonarch)] + {f : K[X]} (hirr : Irreducible f) + (hmonic : f.Monic) + (hconst : v (f.coeff 0) ≤ 1) : + ∃ F : (absoluteValueValuationSubring v hnonarch)[X], + F.map (algebraMap + (absoluteValueValuationSubring v hnonarch) K) = f ∧ + F.natDegree = f.natDegree := by + rcases + exists_polynomial_over_absoluteValueUnitBallSubringAsValuationSubring_of_coeff_abs_le_one + v hnonarch f + (irreduciblePolynomial_monic_coeff_abs_le_one_of_const_abs_le_one_of_irreducible + v hnonarch hirr hmonic hconst) with + ⟨F, hmap, hdegree, _hcoeff⟩ + exact ⟨F, hmap, hdegree⟩ + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/MonicFactorization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/MonicFactorization.lean new file mode 100644 index 0000000000..a85f824914 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/MonicFactorization.lean @@ -0,0 +1,1184 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.CoefficientMinimum +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveFactorization +public import Mathlib.FieldTheory.Normal.Basic +public import Mathlib.RingTheory.Norm.Basic +public import Mathlib.RingTheory.Polynomial.Vieta +/-! +# Monic Hensel factor lifting + +This file isolates the algebraic condition used in the factor-lifting criterion. +The condition is the exact condition: a monic polynomial whose +reduction is a product of relatively prime monic polynomials has monic factors +with exactly those reductions. +-/ + +@[expose] public section + +noncomputable +section + +open Polynomial + +namespace DiscreteValuationField +open ValuationTheory.DiscreteValuationField + +universe u + +/-- Multiplicative nonarchimedean Vieta bound. If every entry of `s` has +valuation at most `B`, with `B ≥ 1`, every coefficient of the corresponding +monic product is bounded by `B ^ |s|`. -/ +theorem valuation_coeff_prod_X_sub_C_le_pow_card + {L Γ : Type*} [Field L] [LinearOrderedCommGroupWithZero Γ] + (w : Valuation L Γ) (B : Γ) (hB : 1 ≤ B) (s : Multiset L) + (hs : ∀ α ∈ s, w α ≤ B) (i : ℕ) : + w (((s.map (fun α => Polynomial.X - Polynomial.C α)).prod).coeff i) ≤ + B ^ s.card := by + induction s using Multiset.induction_on generalizing i with + | empty => + cases i <;> simp [Polynomial.coeff_one] + | @cons α s ih => + have hα : w α ≤ B := hs α (by simp) + have hs' : ∀ β ∈ s, w β ≤ B := by + intro β hβ + exact hs β (by simp [hβ]) + have hpow_step : B ^ s.card ≤ B ^ (s.card + 1) := by + rw [pow_succ] + calc + B ^ s.card = B ^ s.card * 1 := (mul_one _).symm + _ ≤ B ^ s.card * B := by + simpa [mul_comm] using mul_le_mul_right hB (B ^ s.card) + simp only [Multiset.map_cons, Multiset.prod_cons, Multiset.card_cons] + cases i with + | zero => + have hq := ih hs' 0 + calc + w (((Polynomial.X - Polynomial.C α) * + (s.map (fun β => Polynomial.X - Polynomial.C β)).prod).coeff 0) = + w α * + w (((s.map (fun β => + Polynomial.X - Polynomial.C β)).prod).coeff 0) := by + simp [Polynomial.coeff_zero_eq_eval_zero] + _ ≤ B * B ^ s.card := mul_le_mul' hα hq + _ = B ^ (s.card + 1) := by + rw [pow_succ] + ac_rfl + | succ j => + rw [Polynomial.coeff_X_sub_C_mul] + have hqj := ih hs' j + have hqsucc := ih hs' (j + 1) + have hterm : + w (α * ((s.map (fun β => + Polynomial.X - Polynomial.C β)).prod).coeff (j + 1)) ≤ + B ^ (s.card + 1) := by + rw [w.map_mul] + calc + w α * w (((s.map (fun β => + Polynomial.X - Polynomial.C β)).prod).coeff (j + 1)) ≤ + B * B ^ s.card := mul_le_mul' hα hqsucc + _ = B ^ (s.card + 1) := by + rw [pow_succ] + ac_rfl + calc + w (((s.map (fun β => Polynomial.X - Polynomial.C β)).prod).coeff j - + α * ((s.map (fun β => + Polynomial.X - Polynomial.C β)).prod).coeff (j + 1)) ≤ + max + (w (((s.map (fun β => + Polynomial.X - Polynomial.C β)).prod).coeff j)) + (w (α * ((s.map (fun β => + Polynomial.X - Polynomial.C β)).prod).coeff (j + 1))) := by + exact + w.map_sub + (((s.map (fun β => + Polynomial.X - Polynomial.C β)).prod).coeff j) + (α * ((s.map (fun β => + Polynomial.X - Polynomial.C β)).prod).coeff (j + 1)) + _ ≤ B ^ (s.card + 1) := + max_le (hqj.trans hpow_step) hterm + +/-- If all elements of a multiset have valuation `t`, the valuation of their +product is `t` to the cardinality. -/ +theorem valuation_multiset_prod_eq_pow_card_of_eq + {L Γ : Type*} [Field L] [LinearOrderedCommGroupWithZero Γ] + (w : Valuation L Γ) (t : Γ) (s : Multiset L) + (hs : ∀ α ∈ s, w α = t) : + w s.prod = t ^ s.card := by + induction s using Multiset.induction_on with + | empty => simp + | @cons α s ih => + have hα : w α = t := hs α (by simp) + have hs' : ∀ β ∈ s, w β = t := by + intro β hβ + exact hs β (by simp [hβ]) + simp only [Multiset.prod_cons, Multiset.card_cons, w.map_mul, + hα, ih hs', pow_succ] + ac_rfl + +/-- The elementary-symmetric recursion in a form convenient for valuation +estimates. -/ +theorem esymm_cons_succ + {R : Type*} [CommRing R] (a : R) (s : Multiset R) (n : ℕ) : + (a ::ₘ s).esymm (n + 1) = s.esymm (n + 1) + a * s.esymm n := by + simp only [Multiset.esymm, Multiset.powersetCard_cons, + Multiset.map_add, Multiset.sum_add, Multiset.map_map, + Function.comp_apply, Multiset.prod_cons, Multiset.sum_map_mul_left] + +/-- A nonarchimedean bound for elementary symmetric functions. -/ +theorem valuation_esymm_le_pow + {L Γ : Type*} [Field L] [LinearOrderedCommGroupWithZero Γ] + (w : Valuation L Γ) (t : Γ) (s : Multiset L) + (hs : ∀ a ∈ s, w a ≤ t) (n : ℕ) : + w (s.esymm n) ≤ t ^ n := by + induction s using Multiset.induction_on generalizing n with + | empty => + cases n with + | zero => + rw [Multiset.esymm, Multiset.powersetCard_zero_left, + Multiset.map_singleton, Multiset.prod_zero, Multiset.sum_singleton, + w.map_one, pow_zero] + | succ n => + rw [Multiset.esymm, Multiset.powersetCard_zero_right, + Multiset.map_zero, Multiset.sum_zero, w.map_zero] + exact zero_le + | @cons a s ih => + cases n with + | zero => simp [Multiset.esymm] + | succ n => + rw [show n + 1 = n.succ by rfl, esymm_cons_succ] + apply le_trans (w.map_add _ _) (max_le ?_ ?_) + · exact ih (fun b hb => hs b (by simp [hb])) (n + 1) + · rw [w.map_mul, pow_succ] + simpa [mul_comm] using + (mul_le_mul' (hs a (by simp)) + (ih (fun b hb => hs b (by simp [hb])) n)) + +/-- Strict elementary-symmetric bound when every entry is strictly below +the target value. -/ +theorem valuation_esymm_lt_pow + {L Γ : Type*} [Field L] [LinearOrderedCommGroupWithZero Γ] + (w : Valuation L Γ) (t : Γ) (ht : t ≠ 0) (s : Multiset L) + (hs : ∀ a ∈ s, w a < t) {n : ℕ} (hn : 0 < n) : + w (s.esymm n) < t ^ n := by + induction s using Multiset.induction_on generalizing n with + | empty => + obtain ⟨n, rfl⟩ := Nat.exists_eq_succ_of_ne_zero (Nat.ne_of_gt hn) + rw [Multiset.esymm, Multiset.powersetCard_zero_right, + Multiset.map_zero, Multiset.sum_zero, w.map_zero] + exact (zero_lt_iff).2 (pow_ne_zero (n + 1) ht) + | @cons a s ih => + obtain ⟨n, rfl⟩ := Nat.exists_eq_succ_of_ne_zero (Nat.ne_of_gt hn) + change w ((a ::ₘ s).esymm (n + 1)) < t ^ (n + 1) + rw [esymm_cons_succ] + apply w.map_add_lt + · exact ih (fun b hb => hs b (by simp [hb])) (Nat.succ_pos n) + · rw [w.map_mul, pow_succ] + simpa [mul_comm] using + (mul_lt_mul_of_nonneg_of_pos (hs a (by simp)) + (valuation_esymm_le_pow w t s + (fun b hb => (hs b (by simp [hb])).le) n) + (zero_le : 0 ≤ w a) ((zero_lt_iff).2 (pow_ne_zero n ht))) + +/-- If every entry has value at most one and one entry has value below one, +then the product has value below one. -/ +theorem valuation_multiset_prod_lt_one_of_mem_lt_one + {L Γ : Type*} [Field L] [LinearOrderedCommGroupWithZero Γ] + (w : Valuation L Γ) (s : Multiset L) {a : L} + (ha : a ∈ s) (halt : w a < 1) + (hs : ∀ b ∈ s, w b ≤ 1) : + w s.prod < 1 := by + obtain ⟨t, rfl⟩ := Multiset.exists_cons_of_mem ha + rw [Multiset.prod_cons, w.map_mul] + have hprodle : ∀ u : Multiset L, + (∀ b ∈ u, w b ≤ 1) → w u.prod ≤ 1 := by + intro u hu + induction u using Multiset.induction_on with + | empty => simp + | @cons b u ih => + rw [Multiset.prod_cons, w.map_mul] + simpa using mul_le_mul' (hu b (by simp)) + (ih (fun c hc => hu c (by simp [hc]))) + have htprod : w t.prod ≤ 1 := + hprodle t (fun b hb => hs b (by simp [hb])) + exact mul_lt_one_of_lt_of_le halt htprod + +/-- The boundary elementary symmetric function is dominated by the unique +term using all roots of maximal value. This is the valuation-theoretic +coefficient calculation in Artin's Nart transform. -/ +theorem valuation_esymm_eq_pow_card_add_of_eq_of_lt + {L Γ : Type*} [Field L] [LinearOrderedCommGroupWithZero Γ] + (w : Valuation L Γ) (t : Γ) (ht : t ≠ 0) + (seq slt : Multiset L) + (hseq : ∀ a ∈ seq, w a = t) + (hslt : ∀ a ∈ slt, w a < t) : + w ((seq + slt).esymm seq.card) = t ^ seq.card := by + have hstrong : ∀ seq : Multiset L, + (∀ a ∈ seq, w a = t) → + (w ((seq + slt).esymm seq.card) = t ^ seq.card ∧ + ∀ n, seq.card < n → + w ((seq + slt).esymm n) < t ^ n) := by + intro seq + induction seq using Multiset.induction_on with + | empty => + intro _ + constructor + · simp [Multiset.esymm] + · intro n hn + simpa using valuation_esymm_lt_pow w t ht slt hslt hn + | @cons a s ih => + intro hs + have ha : w a = t := hs a (by simp) + have hs' : ∀ b ∈ s, w b = t := by + intro b hb + exact hs b (by simp [hb]) + rcases ih hs' with ⟨heq, hlt⟩ + constructor + · simp only [Multiset.card_cons] + rw [show (a ::ₘ s) + slt = a ::ₘ (s + slt) by simp, + esymm_cons_succ] + have hfirst : w ((s + slt).esymm (s.card + 1)) < + t ^ (s.card + 1) := hlt _ (Nat.lt_succ_self _) + have hsecond : w (a * (s + slt).esymm s.card) = + t ^ (s.card + 1) := by + rw [w.map_mul, ha, heq, pow_succ] + ac_rfl + rw [w.map_add_of_distinct_val (ne_of_lt (hfirst.trans_eq hsecond.symm)), + hsecond] + simp [hfirst.le] + · intro n hn + obtain ⟨m, rfl⟩ := Nat.exists_eq_succ_of_ne_zero + (Nat.ne_of_gt (Nat.zero_lt_of_lt hn)) + simp only [Multiset.card_cons, Nat.succ_eq_add_one] at hn + change w (((a ::ₘ s) + slt).esymm (m + 1)) < t ^ (m + 1) + rw [show (a ::ₘ s) + slt = a ::ₘ (s + slt) by simp, + esymm_cons_succ] + apply w.map_add_lt + · exact hlt _ (Nat.lt_trans (Nat.lt_succ_self _) hn) + · rw [w.map_mul, ha, pow_succ] + conv_rhs => rw [mul_comm] + exact mul_lt_mul_of_pos_of_nonneg le_rfl (hlt m (by omega)) + ((zero_lt_iff).2 ht) (zero_le : 0 ≤ t ^ m) + exact (hstrong seq hseq).1 + +open AlgebraicNumberTheory.Valuations renaming + henselFactorization_exists_coeff_mem_ideal_dvd_all_two_polynomials → + henselFactorization_exists_coeff_mem_ideal_dvd_all_two_polynomials in +/-- Over a valuation ring, Gauss-primitivity is also detected by nonzero +reduction. The finite set of nonzero coefficients has a divisibility-minimal +coefficient; if every coefficient reduced to zero, that nonunit would divide +the whole polynomial, contradicting primitivity. -/ +theorem residue_ne_zero_of_isPrimitive_valuationSubring + {K : Type u} [Field K] (V : ValuationSubring K) + {p : Polynomial V} (hp : p.IsPrimitive) : + p.map (IsLocalRing.residue V) ≠ 0 := by + intro hzero + have hp0 : p ≠ 0 := hp.ne_zero + obtain ⟨n, hn⟩ := Polynomial.support_nonempty.mpr hp0 + have hs : + (AlgebraicNumberTheory.Valuations.henselFactorizationTwoPolynomialCoeffFinset p + 0).Nonempty := by + refine ⟨p.coeff n, ?_⟩ + exact + AlgebraicNumberTheory.Valuations.henselFactorization_mem_twoPolynomialCoeffFinset_left hn + have hcoeffMax : ∀ i : ℕ, p.coeff i ∈ IsLocalRing.maximalIdeal V := by + intro i + rw [← Ideal.Quotient.eq_zero_iff_mem] + change IsLocalRing.residue V (p.coeff i) = 0 + rw [← Polynomial.coeff_map, hzero] + simp + have hzeroCoeff : ∀ i : ℕ, (0 : Polynomial V).coeff i ∈ + IsLocalRing.maximalIdeal V := by + intro i + simp + rcases + henselFactorization_exists_coeff_mem_ideal_dvd_all_two_polynomials + (I := IsLocalRing.maximalIdeal V) hcoeffMax hzeroCoeff hs with + ⟨π, hπmax, _hπcoeff, hπp, _hπzero⟩ + have hC : Polynomial.C π ∣ p := + (Polynomial.C_dvd_iff_dvd_coeff π p).2 hπp + have hπunit : IsUnit π := + (Polynomial.isPrimitive_iff_isUnit_of_C_dvd.mp hp) π hC + exact (IsLocalRing.mem_maximalIdeal π).mp hπmax hπunit + +theorem valuation_coeff_prod_X_sub_C_lt_coeff_zero_of_one_lt + {L Γ : Type*} [Field L] [LinearOrderedCommGroupWithZero Γ] + (w : Valuation L Γ) (s : Multiset L) + (hs : ∀ α ∈ s, 1 < w α) (j : ℕ) (hj : 0 < j) : + w (((s.map (fun α => Polynomial.X - Polynomial.C α)).prod).coeff j) < + w (((s.map (fun α => Polynomial.X - Polynomial.C α)).prod).coeff 0) := by + induction s using Multiset.induction_on generalizing j with + | empty => + simp [Polynomial.coeff_one, Nat.ne_of_gt hj] + | @cons α s ih => + have hα : 1 < w α := hs α (by simp) + have hs' : ∀ β ∈ s, 1 < w β := by + intro β hβ + exact hs β (by simp [hβ]) + let q : Polynomial L := + (s.map (fun β => Polynomial.X - Polynomial.C β)).prod + have hqzero : q.coeff 0 ≠ 0 := by + have hprod : (s.map fun β => -β).prod ≠ 0 := by + apply Multiset.prod_ne_zero + intro hzero + rcases Multiset.mem_map.mp hzero with ⟨β, hβ, hβzero⟩ + have hβne : β ≠ 0 := by + intro h + subst β + simpa using hs' 0 hβ + exact hβne (neg_eq_zero.mp hβzero) + dsimp [q] + rw [Polynomial.coeff_zero_eq_eval_zero, + Polynomial.eval_multiset_prod] + simpa using hprod + have hqzeroPos : 0 < w (q.coeff 0) := + (Valuation.pos_iff w).2 hqzero + cases j with + | zero => simp at hj + | succ k => + have hfirst : + w (q.coeff k) < w α * w (q.coeff 0) := by + cases k with + | zero => exact lt_mul_of_one_lt_left hqzeroPos hα + | succ k => + exact (ih hs' (k + 1) (Nat.succ_pos k)).trans + (lt_mul_of_one_lt_left hqzeroPos hα) + have hsecond : + w (α * q.coeff (k + 1)) < + w α * w (q.coeff 0) := by + rw [w.map_mul] + exact mul_lt_mul_of_pos_left + (ih hs' (k + 1) (Nat.succ_pos k)) (zero_lt_one.trans hα) + simp only [Multiset.map_cons, Multiset.prod_cons] + rw [Polynomial.coeff_X_sub_C_mul] + have hadd := w.map_add (q.coeff k) (-α * q.coeff (k + 1)) + have hneg : w (-α * q.coeff (k + 1)) = + w (α * q.coeff (k + 1)) := by simp + have hcoeff : + w (q.coeff k - α * q.coeff (k + 1)) < + w α * w (q.coeff 0) := by + calc + w (q.coeff k - α * q.coeff (k + 1)) ≤ + max (w (q.coeff k)) + (w (-α * q.coeff (k + 1))) := by + simpa [sub_eq_add_neg] using hadd + _ < w α * w (q.coeff 0) := + max_lt hfirst (hneg.trans_lt hsecond) + simpa [q, Polynomial.coeff_zero_eq_eval_zero, w.map_mul] using hcoeff + + + +theorem residue_root_of_integral_root + {K L : Type*} [Field K] [Field L] [Algebra K L] + (V : ValuationSubring K) (B : ValuationSubring L) + [V.valuation.HasExtension B.valuation] + {Q : Polynomial V} {β : L} + (hβle : B.valuation β ≤ 1) + (hroot : ((Q.map V.subtype).map (algebraMap K L)).IsRoot β) : + ∃ ρ : IsLocalRing.ResidueField V →+* IsLocalRing.ResidueField B, + ((Q.map (IsLocalRing.residue V)).map ρ).IsRoot + (IsLocalRing.residue B + (⟨β, (B.valuation_le_one_iff β).1 hβle⟩ : B)) := by + let ι : V →+* B := + { toFun := fun x => + ⟨algebraMap K L (x : K), + (B.valuation_le_one_iff _).1 + ((Valuation.HasExtension.val_map_le_one_iff + V.valuation B.valuation (x : K)).2 + ((V.valuation_le_one_iff (x : K)).2 x.2))⟩ + map_zero' := by ext; simp + map_one' := by ext; simp + map_add' := by intro x y; ext; simp + map_mul' := by intro x y; ext; simp } + let : Algebra V B := ι.toAlgebra + have halg : algebraMap V B = ι := rfl + let : IsLocalHom (algebraMap V B) := + IsLocalHom.mk fun x hx => by + apply (V.valuation_eq_one_iff x).mpr + apply (Valuation.HasExtension.val_map_eq_one_iff + V.valuation B.valuation (x : K)).mp + exact (B.valuation_eq_one_iff (algebraMap V B x)).mp hx + let βB : B := ⟨β, (B.valuation_le_one_iff β).1 hβle⟩ + have hrootB : Q.eval₂ (algebraMap V B) βB = 0 := by + apply B.subtype_injective + simp only [map_zero] + rw [Polynomial.eval₂_eq_eval_map] + rw [← Polynomial.eval₂_at_apply] + rw [Polynomial.eval₂_map] + change Polynomial.eval₂ (B.subtype.comp (algebraMap V B)) β Q = 0 + have hcomp : B.subtype.comp (algebraMap V B) = + (algebraMap K L).comp V.subtype := by + ext x + rfl + rw [hcomp] + simpa [Polynomial.eval₂_eq_eval_map, Polynomial.map_map] using hroot + let ρ : IsLocalRing.ResidueField V →+* IsLocalRing.ResidueField B := + IsLocalRing.ResidueField.map (algebraMap V B) + refine ⟨ρ, ?_⟩ + change ((Q.map (IsLocalRing.residue V)).map + ρ).eval + (IsLocalRing.residue B βB) = 0 + dsimp [ρ] + rw [Polynomial.eval_map, Polynomial.eval₂_map] + rw [IsLocalRing.ResidueField.map_comp_residue] + rw [← Polynomial.eval₂_map] + rw [Polynomial.eval₂_at_apply] + rw [← Polynomial.eval₂_eq_eval_map, hrootB, map_zero] + +/-- A split monic polynomial with integral roots, including a unit root and a +strictly small root, lifts to a polynomial whose reduction has both zero and nonzero roots. -/ +private theorem exists_monic_residue_polynomial_of_mixed_roots + {K L : Type*} [Field K] [Field L] [Algebra K L] + (V : ValuationSubring K) (B : ValuationSubring L) + [V.valuation.HasExtension B.valuation] + (q : Polynomial K) (hqmonic : q.Monic) (hqirr : Irreducible q) + (hqsplit : (q.map (algebraMap K L)).Splits) + (z zγ : L) (hzval : B.valuation z = 1) (hzγval : B.valuation zγ < 1) + (hqz : (q.map (algebraMap K L)).IsRoot z) + (hqzγ : (q.map (algebraMap K L)).IsRoot zγ) + (hqrootsBound : ∀ δ ∈ (q.map (algebraMap K L)).roots, B.valuation δ ≤ 1) : + ∃ Q : Polynomial V, + Q.Monic ∧ Irreducible (Q.map V.subtype) ∧ + (Q.map (IsLocalRing.residue V)).coeff 0 = 0 ∧ + ∃ (ρ : IsLocalRing.ResidueField V →+* + IsLocalRing.ResidueField B) + (b : IsLocalRing.ResidueField B), + b ≠ 0 ∧ ((Q.map (IsLocalRing.residue V)).map ρ).IsRoot b := by + classical + let qroots : Multiset L := (q.map (algebraMap K L)).roots + have hqmap0 : q.map (algebraMap K L) ≠ 0 := + (Polynomial.map_ne_zero_iff (algebraMap K L).injective).2 hqirr.ne_zero + have hqprod : q.map (algebraMap K L) = + (qroots.map (fun x => Polynomial.X - Polynomial.C x)).prod := by + calc + q.map (algebraMap K L) = + Polynomial.C (q.map (algebraMap K L)).leadingCoeff * + (qroots.map (fun x => Polynomial.X - Polynomial.C x)).prod := + hqsplit.eq_prod_roots + _ = (qroots.map (fun x => Polynomial.X - Polynomial.C x)).prod := by + rw [(hqmonic.map (algebraMap K L))] + simp + have hqcoeffTarget : ∀ i : ℕ, + B.valuation (algebraMap K L (q.coeff i)) ≤ 1 := by + intro i + have hbound := valuation_coeff_prod_X_sub_C_le_pow_card + B.valuation 1 le_rfl qroots hqrootsBound i + rw [one_pow] at hbound + calc + B.valuation (algebraMap K L (q.coeff i)) = + B.valuation ((q.map (algebraMap K L)).coeff i) := by + rw [Polynomial.coeff_map] + _ = B.valuation + ((qroots.map (fun x => Polynomial.X - Polynomial.C x)).prod.coeff i) := by + rw [hqprod] + _ ≤ 1 := hbound + have hqcoeffBase : ∀ i : ℕ, V.valuation (q.coeff i) ≤ 1 := by + intro i + exact (Valuation.HasExtension.val_map_le_one_iff + V.valuation B.valuation (q.coeff i)).mp (hqcoeffTarget i) + have hqlifts : q ∈ Polynomial.lifts V.subtype := by + rw [Polynomial.lifts_iff_coeff_lifts] + intro i + exact ⟨⟨q.coeff i, + (V.valuation_le_one_iff (q.coeff i)).1 (hqcoeffBase i)⟩, rfl⟩ + rcases Polynomial.lifts_and_natDegree_eq_and_monic + (f := V.subtype) hqlifts hqmonic with + ⟨Q, hQmap, _hQdegree, hQmonic⟩ + have hQirr : Irreducible (Q.map V.subtype) := by + rw [hQmap] + exact hqirr + have hzmem : z ∈ qroots := (Polynomial.mem_roots hqmap0).2 hqz + have hzγmem : zγ ∈ qroots := (Polynomial.mem_roots hqmap0).2 hqzγ + have hqconstTarget : B.valuation (algebraMap K L (q.coeff 0)) < 1 := by + have hprodlt := valuation_multiset_prod_lt_one_of_mem_lt_one + B.valuation qroots hzγmem hzγval hqrootsBound + have hconst := hqsplit.coeff_zero_eq_leadingCoeff_mul_prod_roots + have hlead : (q.map (algebraMap K L)).leadingCoeff = 1 := + hqmonic.map (algebraMap K L) + calc + B.valuation (algebraMap K L (q.coeff 0)) = + B.valuation ((q.map (algebraMap K L)).coeff 0) := by + rw [Polynomial.coeff_map] + _ = B.valuation + (((-1) ^ (q.map (algebraMap K L)).natDegree) * + (q.map (algebraMap K L)).leadingCoeff * qroots.prod) := by + rw [hconst] + _ = B.valuation qroots.prod := by + rw [hlead] + simp + _ < 1 := hprodlt + have hqconstBase : V.valuation (q.coeff 0) < 1 := + (Valuation.HasExtension.val_map_lt_one_iff + V.valuation B.valuation (q.coeff 0)).mp hqconstTarget + have hQconstMax : Q.coeff 0 ∈ IsLocalRing.maximalIdeal V := by + apply (V.valuation_lt_one_iff (Q.coeff 0)).mpr + have hcoeff := congrArg (fun f : Polynomial K => f.coeff 0) hQmap + change (Q.map V.subtype).coeff 0 = q.coeff 0 at hcoeff + rw [Polynomial.coeff_map] at hcoeff + change (Q.coeff 0 : K) = q.coeff 0 at hcoeff + rw [hcoeff] + exact hqconstBase + have hQbarConst : (Q.map (IsLocalRing.residue V)).coeff 0 = 0 := by + rw [Polynomial.coeff_map] + exact (IsLocalRing.residue_eq_zero_iff (Q.coeff 0)).2 hQconstMax + have hzle : B.valuation z ≤ 1 := hzval.le + have hrootQ : ((Q.map V.subtype).map (algebraMap K L)).IsRoot z := by + rw [hQmap] + exact hqz + obtain ⟨ρ, hrootBar⟩ := residue_root_of_integral_root + V B hzle hrootQ + let zB : B := ⟨z, (B.valuation_le_one_iff z).1 hzle⟩ + let zbar : IsLocalRing.ResidueField B := IsLocalRing.residue B zB + have hzBunit : IsUnit zB := by + apply (B.valuation_eq_one_iff zB).mpr + exact hzval + have hzbar0 : zbar ≠ 0 := + (IsLocalRing.residue_ne_zero_iff_isUnit zB).2 hzBunit + refine ⟨Q, hQmonic, hQirr, hQbarConst, ρ, zbar, hzbar0, ?_⟩ + simpa [zbar, zB] using hrootBar + +theorem exists_mixed_residual_minpoly_of_irreducible_roots_unequal + {K L : Type*} [Field K] [Field L] [Algebra K L] [Normal K L] + (V : ValuationSubring K) (B : ValuationSubring L) + [V.valuation.HasExtension B.valuation] + {p : Polynomial K} (hp : Irreducible p) + (hsplit : (p.map (algebraMap K L)).Splits) + {α β : L} + (hα : α ∈ (p.map (algebraMap K L)).roots) + (hβ : β ∈ (p.map (algebraMap K L)).roots) + (hαβ : B.valuation α ≠ B.valuation β) : + ∃ Q : Polynomial V, + Q.Monic ∧ Irreducible (Q.map V.subtype) ∧ + (Q.map (IsLocalRing.residue V)).coeff 0 = 0 ∧ + ∃ (ρ : IsLocalRing.ResidueField V →+* + IsLocalRing.ResidueField B) + (b : IsLocalRing.ResidueField B), + b ≠ 0 ∧ ((Q.map (IsLocalRing.residue V)).map ρ).IsRoot b := by + classical + let F : Polynomial L := p.map (algebraMap K L) + let roots : Multiset L := F.roots + have hF0 : F ≠ 0 := + (Polynomial.map_ne_zero_iff (algebraMap K L).injective).2 hp.ne_zero + have hrootsCard : roots.card = p.natDegree := by + calc + roots.card = F.natDegree := Polynomial.splits_iff_card_roots.mp hsplit + _ = p.natDegree := Polynomial.natDegree_map_eq_of_injective + (algebraMap K L).injective p + have hroots0 : roots ≠ 0 := by + intro hzero + have hpdeg : 0 < p.natDegree := hp.natDegree_pos + rw [hzero] at hrootsCard + exact (Nat.ne_of_gt hpdeg) hrootsCard.symm + obtain ⟨amax, hamax, hmax⟩ := + roots.exists_max_image B.valuation hroots0 + let t : B.ValueGroup := B.valuation amax + have hα' : α ∈ roots := hα + have hβ' : β ∈ roots := hβ + have hαle : B.valuation α ≤ t := hmax α hα' + have hβle : B.valuation β ≤ t := hmax β hβ' + obtain ⟨γ, hγ, hγlt⟩ : ∃ γ ∈ roots, B.valuation γ < t := by + by_cases hαt : B.valuation α = t + · refine ⟨β, hβ', lt_of_le_of_ne hβle ?_⟩ + intro hβt + exact hαβ (hαt.trans hβt.symm) + · exact ⟨α, hα', lt_of_le_of_ne hαle hαt⟩ + have htpos : 0 < t := (zero_le : 0 ≤ B.valuation γ).trans_lt hγlt + have ht0 : t ≠ 0 := ne_of_gt htpos + let seq : Multiset L := roots.filter (fun x => B.valuation x = t) + let slt : Multiset L := roots.filter (fun x => B.valuation x ≠ t) + have hpart : seq + slt = roots := by + simpa [seq, slt] using + (Multiset.filter_add_not (fun x => B.valuation x = t) roots) + have hseq : ∀ x ∈ seq, B.valuation x = t := by + intro x hx + exact (Multiset.mem_filter.mp hx).2 + have hslt : ∀ x ∈ slt, B.valuation x < t := by + intro x hx + have hxdata := Multiset.mem_filter.mp hx + exact lt_of_le_of_ne (hmax x hxdata.1) hxdata.2 + let r : ℕ := seq.card + have hrpos : 0 < r := by + have : amax ∈ seq := by + simp [seq, t, hamax] + exact Multiset.card_pos.mpr (by + intro hzero + rw [hzero] at this + simp at this) + have hrle : r ≤ p.natDegree := by + rw [← hrootsCard] + exact Multiset.card_le_card (Multiset.filter_le _ _) + have hboundary : B.valuation (roots.esymm r) = t ^ r := by + rw [← hpart] + exact valuation_esymm_eq_pow_card_add_of_eq_of_lt + B.valuation t ht0 seq slt hseq hslt + let k : ℕ := p.natDegree - r + have hk : k ≤ F.natDegree := by + rw [show F.natDegree = p.natDegree from + Polynomial.natDegree_map_eq_of_injective (algebraMap K L).injective p] + exact Nat.sub_le _ _ + have hsub : F.natDegree - k = r := by + rw [show F.natDegree = p.natDegree from + Polynomial.natDegree_map_eq_of_injective (algebraMap K L).injective p] + exact Nat.sub_sub_self hrle + have hcoeffF : F.coeff k = + F.leadingCoeff * (-1) ^ r * roots.esymm r := by + have h := Polynomial.coeff_eq_esymm_roots_of_splits hsplit hk + change F.coeff k = F.leadingCoeff * (-1) ^ (F.natDegree - k) * + roots.esymm (F.natDegree - k) at h + rwa [hsub] at h + have hleadF : F.leadingCoeff = algebraMap K L p.leadingCoeff := + Polynomial.leadingCoeff_map_of_injective (algebraMap K L).injective p + have hleadF0 : F.leadingCoeff ≠ 0 := + Polynomial.leadingCoeff_ne_zero.mpr hF0 + let a : K := p.coeff k / p.leadingCoeff + have hmapa : algebraMap K L a = (-1) ^ r * roots.esymm r := by + dsimp [a] + rw [map_div₀ (algebraMap K L)] + rw [← Polynomial.coeff_map, show p.map (algebraMap K L) = F from rfl] + rw [hcoeffF, ← hleadF] + field_simp + have hmapaVal : B.valuation (algebraMap K L a) = t ^ r := by + rw [hmapa, B.valuation.map_mul, hboundary] + simp + have hmapa0 : algebraMap K L a ≠ 0 := by + intro hzero + have := congrArg B.valuation hzero + rw [hmapaVal] at this + simp [pow_ne_zero _ ht0] at this + let z : L := amax ^ r / algebraMap K L a + let zγ : L := γ ^ r / algebraMap K L a + have hzval : B.valuation z = 1 := by + dsimp [z] + rw [B.valuation.map_div, B.valuation.map_pow, hmapaVal] + simp [t, pow_ne_zero _ ht0] + have hγpow : B.valuation γ ^ r < t ^ r := + pow_lt_pow_left₀ hγlt zero_le (Nat.ne_of_gt hrpos) + have hzγval : B.valuation zγ < 1 := by + dsimp [zγ] + rw [B.valuation.map_div, B.valuation.map_pow, hmapaVal] + exact (div_lt_one₀ ((zero_lt_iff).2 (pow_ne_zero r ht0))).2 hγpow + have hamaxEval : (aeval amax) p = 0 := by + simpa [aeval_def, F, roots] using (Polynomial.mem_roots hF0).1 hamax + have hγEval : (aeval γ) p = 0 := by + simpa [aeval_def, F, roots] using (Polynomial.mem_roots hF0).1 hγ + have hminRoots : minpoly K amax = minpoly K γ := by + rw [← minpoly.eq_of_irreducible hp hamaxEval, + ← minpoly.eq_of_irreducible hp hγEval] + obtain ⟨σ, hσ⟩ := (Normal.minpoly_eq_iff_mem_orbit L).1 hminRoots + have hσz : σ zγ = z := by + have hσγ : σ γ = amax := hσ + simp [zγ, z, hσγ] + let q : Polynomial K := minpoly K z + have hzint : IsIntegral K z := + (Algebra.IsAlgebraic.isAlgebraic z).isIntegral + have hqmonic : q.Monic := minpoly.monic hzint + have hqirr : Irreducible q := minpoly.irreducible hzint + have hqsplit : (q.map (algebraMap K L)).Splits := + Normal.splits (inferInstance : Normal K L) z + have hq0 : q ≠ 0 := hqirr.ne_zero + have hqmap0 : q.map (algebraMap K L) ≠ 0 := + (Polynomial.map_ne_zero_iff (algebraMap K L).injective).2 hq0 + have hqz : (q.map (algebraMap K L)).IsRoot z := by + simpa [q, aeval_def] using minpoly.aeval K z + have hqzγ : (q.map (algebraMap K L)).IsRoot zγ := by + have hminσ : minpoly K (σ zγ) = minpoly K zγ := minpoly.algEquiv_eq σ zγ + have hminzγ : minpoly K zγ = q := by + rw [← hminσ, hσz] + simpa [q, hminzγ, aeval_def] using minpoly.aeval K zγ + let qroots : Multiset L := (q.map (algebraMap K L)).roots + have hqrootsBound : ∀ δ ∈ qroots, B.valuation δ ≤ 1 := by + intro δ hδ + have hδeval : (aeval δ) q = 0 := by + simpa [aeval_def, qroots] using (Polynomial.mem_roots hqmap0).1 hδ + have hminδ : minpoly K δ = minpoly K z := by + have h := minpoly.eq_of_irreducible hqirr hδeval + simpa [q, hqmonic] using h.symm + obtain ⟨τ, hτ⟩ := (Normal.minpoly_eq_iff_mem_orbit L).1 hminδ + have hτroot : τ amax ∈ roots := by + apply (Polynomial.mem_roots hF0).2 + change F.eval (τ amax) = 0 + have heval := (Polynomial.aeval_algHom_apply τ amax p).symm + rw [hamaxEval, map_zero] at heval + simpa [F, Polynomial.aeval_def] using heval.symm + have hτle : B.valuation (τ amax) ≤ t := hmax _ hτroot + have hτz0 : τ z = δ := hτ + rw [← hτz0] + have hτz : τ z = (τ amax) ^ r / algebraMap K L a := by + simp [z] + rw [hτz, B.valuation.map_div, + B.valuation.map_pow, hmapaVal] + apply (div_le_one₀ ((zero_lt_iff).2 (pow_ne_zero r ht0))).2 + exact pow_le_pow_left₀ zero_le hτle r + exact exists_monic_residue_polynomial_of_mixed_roots V B q hqmonic hqirr hqsplit + z zγ hzval hzγval hqz hqzγ hqrootsBound + + + +/-- If a primitive polynomial has nonunit leading and constant coefficients, +the roots of its irreducible fraction-field image cannot all have the same +value under an extension valuation. This is the Vieta estimate at the start +of Artin's proof of the factor-lifting criterion. -/ +theorem not_all_roots_same_valuation_of_primitive_irreducible_endpoints_nonunit + {K L : Type*} [Field K] [Field L] [Algebra K L] + (V : ValuationSubring K) (B : ValuationSubring L) + [V.valuation.HasExtension B.valuation] + {p : Polynomial V} + (hpprim : p.IsPrimitive) + (hirr : Irreducible (p.map (algebraMap V K))) + (hsplit : + ((p.map (algebraMap V K)).map (algebraMap K L)).Splits) + (hlead : ¬IsUnit p.leadingCoeff) + (hconst : ¬IsUnit (p.coeff 0)) + {α : L} + (hα : α ∈ ((p.map (algebraMap V K)).map + (algebraMap K L)).roots) : + ¬ ∀ β ∈ ((p.map (algebraMap V K)).map + (algebraMap K L)).roots, B.valuation β = B.valuation α := by + let pk : Polynomial K := p.map (algebraMap V K) + let F : Polynomial L := pk.map (algebraMap K L) + let roots : Multiset L := F.roots + change F.Splits at hsplit + change α ∈ roots at hα + intro hall + change ∀ β ∈ roots, B.valuation β = B.valuation α at hall + have hpbar0 : p.map (IsLocalRing.residue V) ≠ 0 := + residue_ne_zero_of_isPrimitive_valuationSubring V hpprim + obtain ⟨i, hi⟩ := Polynomial.support_nonempty.mpr hpbar0 + have hcoeffResidue : IsLocalRing.residue V (p.coeff i) ≠ 0 := by + intro hzero + exact (Polynomial.mem_support_iff.mp hi) (by + rw [Polynomial.coeff_map] + exact hzero) + have hcoeffUnit : IsUnit (p.coeff i) := + (IsLocalRing.residue_ne_zero_iff_isUnit (p.coeff i)).mp hcoeffResidue + have hcoeffBase : V.valuation (p.coeff i : K) = 1 := + (V.valuation_eq_one_iff (p.coeff i)).mp hcoeffUnit + have hcoeffTarget : + B.valuation (algebraMap K L (p.coeff i : K)) = 1 := + (Valuation.HasExtension.val_map_eq_one_iff + V.valuation B.valuation (p.coeff i : K)).mpr hcoeffBase + have hleadMax : p.leadingCoeff ∈ IsLocalRing.maximalIdeal V := + (IsLocalRing.mem_maximalIdeal p.leadingCoeff).mpr hlead + have hconstMax : p.coeff 0 ∈ IsLocalRing.maximalIdeal V := + (IsLocalRing.mem_maximalIdeal (p.coeff 0)).mpr hconst + have hleadBase : V.valuation (p.leadingCoeff : K) < 1 := + (V.valuation_lt_one_iff p.leadingCoeff).mp hleadMax + have hconstBase : V.valuation (p.coeff 0 : K) < 1 := + (V.valuation_lt_one_iff (p.coeff 0)).mp hconstMax + have hleadTarget : + B.valuation (algebraMap K L (p.leadingCoeff : K)) < 1 := + (Valuation.HasExtension.val_map_lt_one_iff + V.valuation B.valuation (p.leadingCoeff : K)).mpr hleadBase + have hconstTarget : + B.valuation (algebraMap K L (p.coeff 0 : K)) < 1 := + (Valuation.HasExtension.val_map_lt_one_iff + V.valuation B.valuation (p.coeff 0 : K)).mpr hconstBase + have hpk0 : pk ≠ 0 := hirr.ne_zero + have hF0 : F ≠ 0 := + (Polynomial.map_ne_zero_iff (algebraMap K L).injective).mpr hpk0 + have hinjVK : Function.Injective (algebraMap V K) := by + intro x y hxy + exact Subtype.ext hxy + have halgVK (x : V) : algebraMap V K x = (x : K) := rfl + have hleadF : + F.leadingCoeff = algebraMap K L (p.leadingCoeff : K) := by + rw [Polynomial.leadingCoeff_map_of_injective (algebraMap K L).injective] + rw [Polynomial.leadingCoeff_map_of_injective hinjVK] + rw [halgVK] + have hcoeffFactor (j : ℕ) : + algebraMap K L (p.coeff j : K) = + algebraMap K L (p.leadingCoeff : K) * + ((roots.map (fun x => + Polynomial.X - Polynomial.C x)).prod).coeff j := by + have hcoeffSplit := congrArg (fun q : Polynomial L => q.coeff j) + hsplit.eq_prod_roots + simp only [Polynomial.coeff_C_mul] at hcoeffSplit + rw [hleadF] at hcoeffSplit + simpa [roots, F, pk, Polynomial.coeff_map, halgVK] using hcoeffSplit + let t : B.ValueGroup := B.valuation α + have hroots : ∀ β ∈ roots, B.valuation β = t := by + intro β hβ + exact hall β (by simpa [roots, F, pk] using hβ) + have hconstFactor : + B.valuation (algebraMap K L (p.coeff 0 : K)) = + B.valuation (algebraMap K L (p.leadingCoeff : K)) * + t ^ roots.card := by + calc + B.valuation (algebraMap K L (p.coeff 0 : K)) = + B.valuation (F.coeff 0) := by + simp [F, pk, Polynomial.coeff_map] + _ = B.valuation + (((-1) ^ F.natDegree) * F.leadingCoeff * roots.prod) := by + rw [hsplit.coeff_zero_eq_leadingCoeff_mul_prod_roots] + _ = B.valuation (algebraMap K L (p.leadingCoeff : K)) * + B.valuation roots.prod := by + rw [B.valuation.map_mul, B.valuation.map_mul] + rw [hleadF] + simp + _ = B.valuation (algebraMap K L (p.leadingCoeff : K)) * + t ^ roots.card := by + rw [valuation_multiset_prod_eq_pow_card_of_eq B.valuation t roots hroots] + rcases le_total t 1 with ht | ht + · have hprodCoeff : + B.valuation + (((roots.map (fun x => + Polynomial.X - Polynomial.C x)).prod).coeff i) ≤ 1 := by + have := valuation_coeff_prod_X_sub_C_le_pow_card + B.valuation 1 le_rfl roots + (fun β hβ => (hroots β hβ).trans_le ht) i + simpa using this + have hlt : + B.valuation + (algebraMap K L (p.leadingCoeff : K) * + ((roots.map (fun x => + Polynomial.X - Polynomial.C x)).prod).coeff i) < 1 := by + rw [B.valuation.map_mul] + exact mul_lt_one_of_lt_of_le hleadTarget hprodCoeff + have hcoeffLt : + B.valuation (algebraMap K L (p.coeff i : K)) < 1 := by + rw [hcoeffFactor i] + exact hlt + rw [hcoeffTarget] at hcoeffLt + exact lt_irrefl 1 hcoeffLt + · have hprodCoeff : + B.valuation + (((roots.map (fun x => + Polynomial.X - Polynomial.C x)).prod).coeff i) ≤ + t ^ roots.card := + valuation_coeff_prod_X_sub_C_le_pow_card + B.valuation t ht roots (fun β hβ => (hroots β hβ).le) i + have hcoeffLe : + B.valuation (algebraMap K L (p.coeff i : K)) ≤ + B.valuation (algebraMap K L (p.coeff 0 : K)) := by + rw [hcoeffFactor i, B.valuation.map_mul, hconstFactor] + simpa [mul_comm] using + mul_le_mul_right hprodCoeff + (B.valuation (algebraMap K L (p.leadingCoeff : K))) + have : + B.valuation (algebraMap K L (p.coeff i : K)) < 1 := + hcoeffLe.trans_lt hconstTarget + rw [hcoeffTarget] at this + exact lt_irrefl 1 this + +/-- The monic residual coprime-factor lifting property appearing in +the factor-lifting criterion. Both residual factors and both lifted factors are monic, and +both residual identities are retained. -/ +def MonicResidualCoprimeFactorLifting + {K : Type u} [Field K] (V : ValuationSubring K) : Prop := + ∀ {f : Polynomial V} + {gbar hbar : Polynomial (IsLocalRing.ResidueField V)}, + f.Monic → + gbar.Monic → + hbar.Monic → + f.map (IsLocalRing.residue V) = gbar * hbar → + IsCoprime gbar hbar → + ∃ G H : Polynomial V, + G.Monic ∧ H.Monic ∧ f = G * H ∧ + G.map (IsLocalRing.residue V) = gbar ∧ + H.map (IsLocalRing.residue V) = hbar + +/-- the primitive factorization definition's primitive factorization property contains, in +particular, the exact monic lifting property of the factor-lifting criterion. The factors +returned by the primitive factorization definition are normalized by the mutually inverse leading +coefficients; their reductions stay fixed because both leading coefficients +reduce to `1`. -/ +theorem monicResidualCoprimeFactorLifting_of_henselFactorization + {K : Type u} [Field K] {V : ValuationSubring K} + (hhensel : HenselFactorizationProperty V) : + MonicResidualCoprimeFactorLifting V := by + intro f gbar hbar hf hgbar hhbar hfactor hcoprime + have hprimitive : f.map (IsLocalRing.residue V) ≠ 0 := + (hf.map (IsLocalRing.residue V)).ne_zero + rcases hhensel hprimitive hfactor hcoprime with + ⟨G, H, hGdegree, _hHdegree, hGH, hGmap, hHmap⟩ + have hG0 : G ≠ 0 := by + intro hzero + rw [hzero] at hGmap + exact hgbar.ne_zero (by simpa using hGmap.symm) + have hH0 : H ≠ 0 := by + intro hzero + rw [hzero] at hHmap + exact hhbar.ne_zero (by simpa using hHmap.symm) + have hleadProduct : G.leadingCoeff * H.leadingCoeff = 1 := by + calc + G.leadingCoeff * H.leadingCoeff = (G * H).leadingCoeff := by + rw [Polynomial.leadingCoeff_mul] + _ = f.leadingCoeff := by rw [← hGH] + _ = 1 := hf + have hGleadResidue : + IsLocalRing.residue V G.leadingCoeff = 1 := by + change IsLocalRing.residue V (G.coeff G.natDegree) = 1 + rw [hGdegree] + calc + IsLocalRing.residue V (G.coeff gbar.natDegree) = + (G.map (IsLocalRing.residue V)).coeff gbar.natDegree := by + rw [Polynomial.coeff_map] + _ = gbar.coeff gbar.natDegree := by rw [hGmap] + _ = 1 := hgbar + have hHleadResidue : + IsLocalRing.residue V H.leadingCoeff = 1 := by + have h := congrArg (IsLocalRing.residue V) hleadProduct + simpa [map_mul, hGleadResidue] using h + let G' : Polynomial V := Polynomial.C H.leadingCoeff * G + let H' : Polynomial V := Polynomial.C G.leadingCoeff * H + have hG' : G'.Monic := by + apply Polynomial.monic_C_mul_of_mul_leadingCoeff_eq_one + simpa [mul_comm] using hleadProduct + have hH' : H'.Monic := by + apply Polynomial.monic_C_mul_of_mul_leadingCoeff_eq_one + exact hleadProduct + have hfactor' : f = G' * H' := by + have hC : + Polynomial.C H.leadingCoeff * Polynomial.C G.leadingCoeff = + (1 : Polynomial V) := by + rw [← Polynomial.C_mul, mul_comm, hleadProduct] + simp + calc + f = G * H := hGH + _ = 1 * (G * H) := by simp + _ = (Polynomial.C H.leadingCoeff * Polynomial.C G.leadingCoeff) * + (G * H) := by rw [hC] + _ = G' * H' := by + dsimp [G', H'] + ring + refine ⟨G', H', hG', hH', hfactor', ?_, ?_⟩ + · simp [G', Polynomial.map_mul, hGmap, hHleadResidue] + · simp [H', Polynomial.map_mul, hHmap, hGleadResidue] + +/-- A factor of positive degree and degree strictly below the product rules +out irreducibility over a field. -/ +theorem not_irreducible_of_factor_natDegree_lt + {K : Type u} [Field K] {f g h : Polynomial K} + (hfactor : f = g * h) + (hgpos : 0 < g.natDegree) + (hglt : g.natDegree < f.natDegree) : + ¬ Irreducible f := by + intro hirr + rcases hirr.isUnit_or_isUnit hfactor with hgunit | hhunit + · exact (Nat.ne_of_gt hgpos) (Polynomial.natDegree_eq_zero_of_isUnit hgunit) + · have hg0 : g ≠ 0 := by + intro hzero + simp [hzero] at hgpos + have hh0 : h ≠ 0 := hhunit.ne_zero + have hdegree : f.natDegree = g.natDegree := by + rw [hfactor, Polynomial.natDegree_mul hg0 hh0, + Polynomial.natDegree_eq_zero_of_isUnit hhunit, Nat.add_zero] + exact (Nat.ne_of_lt hglt) hdegree.symm + +/-- The zero-slope contradiction in Artin's proof of the factor-lifting criterion. +A nonconstant coprime residual splitting of a monic polynomial lifts to a +genuine factor of intermediate degree, so its image in the fraction field is +not irreducible. -/ +theorem MonicResidualCoprimeFactorLifting.not_irreducible_map + {K : Type u} [Field K] {V : ValuationSubring K} + (hlift : MonicResidualCoprimeFactorLifting V) + {f : Polynomial V} + {gbar hbar : Polynomial (IsLocalRing.ResidueField V)} + (hf : f.Monic) (hgbar : gbar.Monic) (hhbar : hbar.Monic) + (hfactor : f.map (IsLocalRing.residue V) = gbar * hbar) + (hcoprime : IsCoprime gbar hbar) + (hgpos : 0 < gbar.natDegree) (hhpos : 0 < hbar.natDegree) : + ¬ Irreducible (f.map (algebraMap V K)) := by + rcases hlift hf hgbar hhbar hfactor hcoprime with + ⟨G, H, hG, _hH, hGH, hGmap, _hHmap⟩ + have hGdegree : G.natDegree = gbar.natDegree := by + calc + G.natDegree = (G.map (IsLocalRing.residue V)).natDegree := + (hG.natDegree_map (IsLocalRing.residue V)).symm + _ = gbar.natDegree := by rw [hGmap] + have hfdegree : + f.natDegree = gbar.natDegree + hbar.natDegree := by + calc + f.natDegree = (f.map (IsLocalRing.residue V)).natDegree := + (hf.natDegree_map (IsLocalRing.residue V)).symm + _ = (gbar * hbar).natDegree := by rw [hfactor] + _ = gbar.natDegree + hbar.natDegree := + Polynomial.natDegree_mul hgbar.ne_zero hhbar.ne_zero + let Gk : Polynomial K := G.map (algebraMap V K) + let Hk : Polynomial K := H.map (algebraMap V K) + have hinj : Function.Injective (algebraMap V K) := by + intro x y hxy + exact Subtype.ext hxy + have hGkdegree : Gk.natDegree = gbar.natDegree := by + calc + Gk.natDegree = G.natDegree := + Polynomial.natDegree_map_eq_of_injective hinj G + _ = gbar.natDegree := hGdegree + have hfkdegree : (f.map (algebraMap V K)).natDegree = f.natDegree := + Polynomial.natDegree_map_eq_of_injective hinj f + have hfieldFactor : f.map (algebraMap V K) = Gk * Hk := by + rw [hGH, Polynomial.map_mul] + apply not_irreducible_of_factor_natDegree_lt hfieldFactor + · simpa [hGkdegree] using hgpos + · rw [hGkdegree, hfkdegree, hfdegree] + exact Nat.lt_add_of_pos_right hhpos + +/-- A monic polynomial irreducible over the fraction field cannot have a +coprime residual splitting into two positive-degree monic factors. -/ +theorem MonicResidualCoprimeFactorLifting.irreducible_monic_reduction_coprime_factor_degree_zero + {K : Type u} [Field K] {V : ValuationSubring K} + (hlift : MonicResidualCoprimeFactorLifting V) + {f : Polynomial V} + {gbar hbar : Polynomial (IsLocalRing.ResidueField V)} + (hf : f.Monic) + (hirr : Irreducible (f.map (algebraMap V K))) + (hgbar : gbar.Monic) (hhbar : hbar.Monic) + (hfactor : f.map (IsLocalRing.residue V) = gbar * hbar) + (hcoprime : IsCoprime gbar hbar) : + gbar.natDegree = 0 ∨ hbar.natDegree = 0 := by + by_contra hdegree + push Not at hdegree + exact + (hlift.not_irreducible_map hf hgbar hhbar hfactor hcoprime + (Nat.pos_of_ne_zero hdegree.1) (Nat.pos_of_ne_zero hdegree.2)) hirr + +theorem MonicResidualCoprimeFactorLifting.false_of_residue_constant_zero_and_nonzero_root + {K : Type u} [Field K] {V : ValuationSubring K} + (hlift : MonicResidualCoprimeFactorLifting V) + {Q : Polynomial V} (hQmonic : Q.Monic) + (hQirr : Irreducible (Q.map V.subtype)) + (hconst : (Q.map (IsLocalRing.residue V)).coeff 0 = 0) + {k' : Type*} [Field k'] + (ρ : IsLocalRing.ResidueField V →+* k') + {b : k'} (hb0 : b ≠ 0) + (hroot : ((Q.map (IsLocalRing.residue V)).map ρ).IsRoot b) : + False := by + let qbar : Polynomial (IsLocalRing.ResidueField V) := + Q.map (IsLocalRing.residue V) + have hqbarMonic : qbar.Monic := hQmonic.map (IsLocalRing.residue V) + have hqbar0 : qbar ≠ 0 := hqbarMonic.ne_zero + have hzeroRoot : qbar.IsRoot 0 := by + simpa [qbar, Polynomial.IsRoot, Polynomial.coeff_zero_eq_eval_zero] + using hconst + obtain ⟨R, hfactor, hnotdiv⟩ := + qbar.exists_eq_pow_rootMultiplicity_mul_and_not_dvd hqbar0 0 + let r : ℕ := qbar.rootMultiplicity 0 + have hrpos : 0 < r := by + dsimp [r] + exact (Polynomial.rootMultiplicity_pos hqbar0).2 hzeroRoot + have hfactorX : qbar = Polynomial.X ^ r * R := by + simpa [r] using hfactor + have hnotX : ¬ Polynomial.X ∣ R := by + simpa [r] using hnotdiv + have hXmonic : + (Polynomial.X ^ r : Polynomial (IsLocalRing.ResidueField V)).Monic := + Polynomial.monic_X_pow r + have hRmonic : R.Monic := + hXmonic.of_mul_monic_left (hfactorX ▸ hqbarMonic) + have hcoprime : IsCoprime (Polynomial.X ^ r) R := by + have hcopX : IsCoprime + (Polynomial.X : Polynomial (IsLocalRing.ResidueField V)) R := + (Polynomial.prime_X + (R := IsLocalRing.ResidueField V)).coprime_iff_not_dvd.2 hnotX + exact hcopX.pow_left + have hfactorMap : qbar.map ρ = + Polynomial.X ^ r * R.map ρ := by + rw [hfactorX, Polynomial.map_mul, Polynomial.map_pow, Polynomial.map_X] + have hRroot : (R.map ρ).IsRoot b := by + have heval : b ^ r * (R.map ρ).eval b = 0 := by + rw [Polynomial.IsRoot, hfactorMap, Polynomial.eval_mul] at hroot + simpa using hroot + rw [Polynomial.IsRoot] + exact (mul_eq_zero.mp heval).resolve_left (pow_ne_zero r hb0) + have hRpos : 0 < R.natDegree := by + by_contra hnotpos + have hRdegree : R.natDegree = 0 := Nat.eq_zero_of_not_pos hnotpos + have hRone : R = 1 := + Polynomial.eq_one_of_monic_natDegree_zero hRmonic hRdegree + rw [hRone] at hRroot + simp [Polynomial.IsRoot] at hRroot + exact + (hlift.not_irreducible_map hQmonic hXmonic hRmonic + hfactorX hcoprime (by simpa using hrpos) hRpos) hQirr + +/-- Artin's Nart-transform conclusion: under exact monic lifting, the roots +of an irreducible polynomial in any finite normal splitting extension all +have the same value. -/ +theorem MonicResidualCoprimeFactorLifting.irreducible_roots_same_valuation + {K L : Type*} [Field K] [Field L] [Algebra K L] [Normal K L] + {V : ValuationSubring K} (B : ValuationSubring L) + [V.valuation.HasExtension B.valuation] + (hlift : MonicResidualCoprimeFactorLifting V) + {p : Polynomial K} (hp : Irreducible p) + (hsplit : (p.map (algebraMap K L)).Splits) + {α β : L} + (hα : α ∈ (p.map (algebraMap K L)).roots) + (hβ : β ∈ (p.map (algebraMap K L)).roots) : + B.valuation α = B.valuation β := by + by_contra hαβ + obtain ⟨Q, hQmonic, hQirr, hconst, ρ, b, hb0, hroot⟩ := + exists_mixed_residual_minpoly_of_irreducible_roots_unequal + V B hp hsplit hα hβ hαβ + exact hlift.false_of_residue_constant_zero_and_nonzero_root + hQmonic hQirr hconst ρ hb0 hroot + + + +/-- Exact monic coprime-factor lifting supplies the usual simple-root +Henselian structure. This is an intermediate consequence only; the +factor-lifting criterion below continues to the stronger primitive factorization statement of +the primitive factorization definition. -/ +theorem henselianRing_of_monicResidualCoprimeFactorLifting + {K : Type u} [Field K] {V : ValuationSubring K} + (hlift : MonicResidualCoprimeFactorLifting V) : + HenselianRing V (IsLocalRing.maximalIdeal V) where + jac := by + rw [Ideal.jacobson, le_sInf_iff] + rintro I ⟨-, hI⟩ + exact (IsLocalRing.eq_maximalIdeal hI).ge + is_henselian := by + intro f hf a0 hroot hsimple + let fbar : Polynomial (IsLocalRing.ResidueField V) := + f.map (IsLocalRing.residue V) + let abar : IsLocalRing.ResidueField V := IsLocalRing.residue V a0 + let lbar : Polynomial (IsLocalRing.ResidueField V) := + Polynomial.X - Polynomial.C abar + let qbar : Polynomial (IsLocalRing.ResidueField V) := fbar /ₘ lbar + have hlbar : lbar.Monic := Polynomial.monic_X_sub_C abar + have hresidual : fbar = lbar * qbar := by + symm + exact residual_X_sub_C_mul_divByMonic_eq_map_of_eval_mem hroot + have hfbar : fbar.Monic := hf.map (IsLocalRing.residue V) + have hqbar : qbar.Monic := + hlbar.of_mul_monic_left (hresidual ▸ hfbar) + have hcoprime : IsCoprime lbar qbar := + isCoprime_residual_X_sub_C_divByMonic_of_simpleRoot_mod hsimple + rcases hlift hf hlbar hqbar hresidual hcoprime with + ⟨G, H, hG, _hH, hfactor, hGmap, _hHmap⟩ + have hGdegree : G.natDegree = 1 := by + calc + G.natDegree = (G.map (IsLocalRing.residue V)).natDegree := + (hG.natDegree_map (IsLocalRing.residue V)).symm + _ = lbar.natDegree := by rw [hGmap] + _ = 1 := by simp [lbar] + let a : V := -G.coeff 0 + have hGshape : G = Polynomial.X - Polynomial.C a := by + rw [hG.eq_X_add_C hGdegree] + simp [a] + have haRoot : f.IsRoot a := by + rw [hfactor, hGshape, Polynomial.IsRoot, Polynomial.eval_mul] + simp + have hcoeffmap : + IsLocalRing.residue V (G.coeff 0) = -abar := by + have h := congrArg (fun p => p.coeff 0) hGmap + simpa [lbar, Polynomial.coeff_map] using h + have haresidue : IsLocalRing.residue V a = abar := by + dsimp [a] + rw [map_neg, hcoeffmap] + simp + refine ⟨a, haRoot, ?_⟩ + rw [← Ideal.Quotient.eq_zero_iff_mem] + change IsLocalRing.residue V (a - a0) = 0 + rw [map_sub, haresidue] + simp [abar] + +end DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/NonmonicReduction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/NonmonicReduction.lean new file mode 100644 index 0000000000..a9f9aff3c6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/NonmonicReduction.lean @@ -0,0 +1,178 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.MonicFactorization +/-! +# the nonmonic reduction branch + +This file extracts the Newton--Vieta part of the converse Hensel argument +from the unique-extension criterion. No uniqueness of valuation extensions is used here: once +all conjugate roots have the same value, a primitive irreducible polynomial +with nonunit leading coefficient has constant reduction. +-/ + +@[expose] public section + +noncomputable +section + +open Polynomial + +namespace AlgebraicNumberTheory +namespace Valuations + +universe u + +open DiscreteValuationField renaming + not_all_roots_same_valuation_of_primitive_irreducible_endpoints_nonunit → + not_all_roots_same_valuation_of_primitive_irreducible_endpoints_nonunit in +/-- If the roots of a primitive irreducible polynomial all have the same +value in a splitting field, then the nonunit-leading-coefficient branch has +constant reduction. -/ +theorem primitive_irreducible_reduction_natDegree_zero_of_leadingCoeff_nonunit_of_roots_eq + {K L : Type u} [Field K] [Field L] [Algebra K L] + (V : ValuationSubring K) (B : ValuationSubring L) + [V.valuation.HasExtension B.valuation] + (Q : Polynomial V) (hQprim : Q.IsPrimitive) + (hQirr : Irreducible (Q.map V.subtype)) + [IsSplittingField K L (Q.map V.subtype)] + (hlead : ¬ IsUnit Q.leadingCoeff) + (hrootsEq : ∀ {a b : L}, + a ∈ ((Q.map V.subtype).map (algebraMap K L)).roots → + b ∈ ((Q.map V.subtype).map (algebraMap K L)).roots → + B.valuation a = B.valuation b) : + (Q.map (IsLocalRing.residue V)).natDegree = 0 := by + let p : Polynomial K := Q.map V.subtype + let F : Polynomial L := p.map (algebraMap K L) + let roots : Multiset L := F.roots + have hsplit : F.Splits := by + change (p.map (algebraMap K L)).Splits + exact IsSplittingField.splits L p + have hFnat : F.natDegree = p.natDegree := + Polynomial.natDegree_map_eq_of_injective (algebraMap K L).injective p + have hcardpos : 0 < roots.card := by + rw [← hsplit.natDegree_eq_card_roots, hFnat] + exact hQirr.natDegree_pos + obtain ⟨α, hα⟩ := Multiset.card_pos_iff_exists_mem.mp hcardpos + have hall : ∀ β ∈ roots, B.valuation β = B.valuation α := by + intro β hβ + exact hrootsEq hβ hα + have hconst : IsUnit (Q.coeff 0) := by + by_contra hconst + exact + (not_all_roots_same_valuation_of_primitive_irreducible_endpoints_nonunit + V B hQprim hQirr hsplit hlead hconst hα) hall + have hconstBase : V.valuation (Q.coeff 0 : K) = 1 := + (V.valuation_eq_one_iff (Q.coeff 0)).mp hconst + have hconstTarget : + B.valuation (algebraMap K L (Q.coeff 0 : K)) = 1 := + (Valuation.HasExtension.val_map_eq_one_iff + V.valuation B.valuation (Q.coeff 0 : K)).mpr hconstBase + have hleadMax : Q.leadingCoeff ∈ IsLocalRing.maximalIdeal V := + (IsLocalRing.mem_maximalIdeal Q.leadingCoeff).mpr hlead + have hleadBase : V.valuation (Q.leadingCoeff : K) < 1 := + (V.valuation_lt_one_iff Q.leadingCoeff).mp hleadMax + have hleadTarget : + B.valuation (algebraMap K L (Q.leadingCoeff : K)) < 1 := + (Valuation.HasExtension.val_map_lt_one_iff + V.valuation B.valuation (Q.leadingCoeff : K)).mpr hleadBase + have hinjVK : Function.Injective (algebraMap V K) := by + intro x y hxy + exact Subtype.ext hxy + have halgVK (x : V) : algebraMap V K x = (x : K) := rfl + have hleadF : + F.leadingCoeff = algebraMap K L (Q.leadingCoeff : K) := by + rw [Polynomial.leadingCoeff_map_of_injective (algebraMap K L).injective] + change algebraMap K L ((Q.map V.subtype).leadingCoeff) = _ + rw [Polynomial.leadingCoeff_map_of_injective V.subtype_injective] + rfl + have hcoeffFactor (j : ℕ) : + algebraMap K L (Q.coeff j : K) = + algebraMap K L (Q.leadingCoeff : K) * + ((roots.map (fun x => + Polynomial.X - Polynomial.C x)).prod).coeff j := by + have hcoeffSplit := congrArg (fun q : Polynomial L => q.coeff j) + hsplit.eq_prod_roots + simp only [Polynomial.coeff_C_mul] at hcoeffSplit + rw [hleadF] at hcoeffSplit + simpa [roots, F, p, Polynomial.coeff_map, halgVK] using hcoeffSplit + let t : B.ValueGroup := B.valuation α + have hroots : ∀ β ∈ roots, B.valuation β = t := by + intro β hβ + exact hall β hβ + have hconstFactor : + B.valuation (algebraMap K L (Q.coeff 0 : K)) = + B.valuation (algebraMap K L (Q.leadingCoeff : K)) * + t ^ roots.card := by + calc + B.valuation (algebraMap K L (Q.coeff 0 : K)) = + B.valuation (F.coeff 0) := by + simp [F, p, Polynomial.coeff_map] + _ = B.valuation + (((-1) ^ F.natDegree) * F.leadingCoeff * roots.prod) := by + rw [hsplit.coeff_zero_eq_leadingCoeff_mul_prod_roots] + _ = B.valuation (algebraMap K L (Q.leadingCoeff : K)) * + B.valuation roots.prod := by + rw [B.valuation.map_mul, B.valuation.map_mul] + rw [hleadF] + simp + _ = B.valuation (algebraMap K L (Q.leadingCoeff : K)) * + t ^ roots.card := by + rw [DiscreteValuationField.valuation_multiset_prod_eq_pow_card_of_eq + B.valuation t roots hroots] + have ht : 1 < t := by + by_contra hnot + have htle : t ≤ 1 := not_lt.mp hnot + have hpow : t ^ roots.card ≤ 1 := pow_le_one₀ (bot_le : 0 ≤ t) htle + have hlt : + B.valuation (algebraMap K L (Q.leadingCoeff : K)) * + t ^ roots.card < 1 := by + exact mul_lt_one_of_lt_of_le hleadTarget hpow + rw [← hconstFactor, hconstTarget] at hlt + exact lt_irrefl 1 hlt + have hleadTargetPos : + 0 < B.valuation (algebraMap K L (Q.leadingCoeff : K)) := by + apply (Valuation.pos_iff B.valuation).2 + intro hzero + have hzeroK : (Q.leadingCoeff : K) = 0 := by + apply (algebraMap K L).injective + simpa using hzero + have hzeroV : Q.leadingCoeff = 0 := V.subtype_injective hzeroK + exact Q.leadingCoeff_ne_zero.mpr hQprim.ne_zero hzeroV + have hpositiveCoeff (j : ℕ) (hj : 0 < j) : + V.valuation (Q.coeff j : K) < 1 := by + have hprod := + DiscreteValuationField.valuation_coeff_prod_X_sub_C_lt_coeff_zero_of_one_lt + B.valuation roots (fun β hβ => by rw [hroots β hβ]; exact ht) j hj + have htarget : + B.valuation (algebraMap K L (Q.coeff j : K)) < + B.valuation (algebraMap K L (Q.coeff 0 : K)) := by + rw [hcoeffFactor j, hcoeffFactor 0, + B.valuation.map_mul, B.valuation.map_mul] + exact mul_lt_mul_of_pos_left hprod hleadTargetPos + have htargetOne : + B.valuation (algebraMap K L (Q.coeff j : K)) < 1 := by + rwa [hconstTarget] at htarget + exact + (Valuation.HasExtension.val_map_lt_one_iff + V.valuation B.valuation (Q.coeff j : K)).mp htargetOne + apply Polynomial.eq_C_coeff_zero_iff_natDegree_eq_zero.mp + ext j + cases j with + | zero => simp + | succ j => + rw [Polynomial.coeff_map] + simp only [Polynomial.coeff_C, Nat.succ_ne_zero, ite_false] + exact (IsLocalRing.residue_eq_zero_iff (Q.coeff (j + 1))).2 + ((V.valuation_lt_one_iff (Q.coeff (j + 1))).mpr + (hpositiveCoeff (j + 1) (Nat.succ_pos j))) + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveFactorization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveFactorization.lean new file mode 100644 index 0000000000..74c8124c2d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveFactorization.lean @@ -0,0 +1,381 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveReduction +/-! +# Primitive irreducible reductions and Hensel factorization + +This file isolates the common algebraic last step in the unique-extension +and factor-lifting criteria. The proof first proves that the reduction of every +primitive irreducible factor is either constant or has full degree and is a +power of one irreducible residual polynomial. Unique factorization then +partitions the fraction-field irreducible factors along any coprime residual +factorization. +-/ + +@[expose] public section + +noncomputable +section + +open Polynomial + +namespace DiscreteValuationField + +open ValuationTheory.DiscreteValuationField + +/-- The precise irreducible-factor input used in the last paragraph of the +proof of the unique-extension criterion. The second clause is the factorization-free +form of saying that a nonconstant reduction is a scalar times a power of one +irreducible polynomial. -/ +def PrimitiveIrreducibleReductionProperty + {K : Type*} [Field K] (V : ValuationSubring K) : Prop := + ∀ Q : Polynomial V, + Q.IsPrimitive → Irreducible (Q.map V.subtype) → + let qbar := Q.map (IsLocalRing.residue V) + (qbar.natDegree = 0 ∨ qbar.natDegree = Q.natDegree) ∧ + ∀ a b : Polynomial (IsLocalRing.ResidueField V), + qbar = a * b → IsCoprime a b → + a.natDegree = 0 ∨ b.natDegree = 0 + +/-- A primitive irreducible reduction satisfying the primitive factorization property divides +exactly one side of every coprime residual product that it divides. -/ +theorem primitiveIrreducibleReduction_dvd_left_or_right_of_coprime + {K : Type*} [Field K] (V : ValuationSubring K) + (hproperty : PrimitiveIrreducibleReductionProperty V) + (Q : Polynomial V) (hQprim : Q.IsPrimitive) + (hQirr : Irreducible (Q.map V.subtype)) + (gbar hbar : Polynomial (IsLocalRing.ResidueField V)) + (hcoprime : IsCoprime gbar hbar) + (hQdvd : Q.map (IsLocalRing.residue V) ∣ gbar * hbar) : + Q.map (IsLocalRing.residue V) ∣ gbar ∨ + Q.map (IsLocalRing.residue V) ∣ hbar := by + let qbar := Q.map (IsLocalRing.residue V) + obtain ⟨q₁, q₂, hq₁g, hq₂h, hQfactor⟩ := + exists_dvd_and_dvd_of_dvd_mul hQdvd + have hqcoprime : IsCoprime q₁ q₂ := by + rcases hcoprime with ⟨A, B, hbez⟩ + obtain ⟨g', hg'⟩ := hq₁g + obtain ⟨h', hh'⟩ := hq₂h + refine ⟨A * g', B * h', ?_⟩ + calc + (A * g') * q₁ + (B * h') * q₂ = + A * (q₁ * g') + B * (q₂ * h') := by ring + _ = A * gbar + B * hbar := by rw [← hg', ← hh'] + _ = 1 := hbez + have hdegrees := (hproperty Q hQprim hQirr).2 q₁ q₂ hQfactor hqcoprime + have hQbar0 : qbar ≠ 0 := + polynomial_residue_ne_zero_of_isPrimitive V hQprim + have hqprod0 : q₁ * q₂ ≠ 0 := by + rw [← hQfactor] + exact hQbar0 + have hq₁0 : q₁ ≠ 0 := left_ne_zero_of_mul hqprod0 + have hq₂0 : q₂ ≠ 0 := right_ne_zero_of_mul hqprod0 + rcases hdegrees with hq₁deg | hq₂deg + · right + have hq₁unit : IsUnit q₁ := by + rw [Polynomial.isUnit_iff_degree_eq_zero, + Polynomial.degree_eq_natDegree hq₁0, hq₁deg] + rfl + have hassoc : Associated (q₁ * q₂) q₂ := + associated_unit_mul_left q₂ q₁ hq₁unit + change qbar ∣ hbar + have hqfactor : qbar = q₁ * q₂ := hQfactor + rw [hqfactor] + exact hassoc.dvd_iff_dvd_left.mpr hq₂h + · left + have hq₂unit : IsUnit q₂ := by + rw [Polynomial.isUnit_iff_degree_eq_zero, + Polynomial.degree_eq_natDegree hq₂0, hq₂deg] + rfl + have hassoc : Associated (q₁ * q₂) q₁ := + associated_mul_unit_left q₁ q₂ hq₂unit + change qbar ∣ gbar + have hqfactor : qbar = q₁ * q₂ := hQfactor + rw [hqfactor] + exact hassoc.dvd_iff_dvd_left.mpr hq₁g + +/-- Partition primitive irreducible factors along a coprime residual +factorization. Factors with constant reduction are placed on the right; +therefore the left lifted factor has exactly the degree of the prescribed +left residual factor. -/ +theorem partition_primitive_irreducible_factors_along_coprime_reduction + {K : Type*} [Field K] (V : ValuationSubring K) + (hproperty : PrimitiveIrreducibleReductionProperty V) + (factors : Multiset (Polynomial V)) + (hfactors : ∀ Q ∈ factors, + Q.IsPrimitive ∧ Irreducible (Q.map V.subtype)) + (gbar hbar : Polynomial (IsLocalRing.ResidueField V)) + (hproduct : + (factors.map (fun Q => Q.map (IsLocalRing.residue V))).prod = + gbar * hbar) + (hcoprime : IsCoprime gbar hbar) : + ∃ G H : Polynomial V, + factors.prod = G * H ∧ + G.map (IsLocalRing.residue V) = gbar ∧ + H.map (IsLocalRing.residue V) = hbar ∧ + G.natDegree = gbar.natDegree := by + classical + induction factors using Multiset.induction_on generalizing gbar hbar with + | empty => + have hgh : gbar * hbar = 1 := by simpa using hproduct.symm + have hgunit : IsUnit gbar := + isUnit_iff_exists_inv'.2 ⟨hbar, by simpa [mul_comm] using hgh⟩ + obtain ⟨c, hcunit, hcg⟩ := Polynomial.isUnit_iff.mp hgunit + obtain ⟨a, ha⟩ := Ideal.Quotient.mk_surjective c + have hares : IsLocalRing.residue V a = c := ha + have haunit : IsUnit a := + (IsLocalRing.residue_ne_zero_iff_isUnit a).1 + (by simpa [hares] using hcunit.ne_zero) + obtain ⟨ua, hua⟩ := haunit + let G : Polynomial V := Polynomial.C a + let H : Polynomial V := Polynomial.C (ua⁻¹ : Vˣ) + have hGH : G * H = 1 := by + change Polynomial.C a * Polynomial.C ((ua⁻¹ : Vˣ) : V) = + Polynomial.C 1 + rw [← Polynomial.C_mul] + congr 1 + rw [← hua] + exact Units.mul_inv ua + have hGmap : G.map (IsLocalRing.residue V) = gbar := by + simpa [G, hares] using hcg + have hHmap : H.map (IsLocalRing.residue V) = hbar := by + apply mul_left_cancel₀ hgunit.ne_zero + calc + gbar * H.map (IsLocalRing.residue V) = + G.map (IsLocalRing.residue V) * + H.map (IsLocalRing.residue V) := by rw [hGmap] + _ = (G * H).map (IsLocalRing.residue V) := by + rw [Polynomial.map_mul] + _ = 1 := by simp [hGH] + _ = gbar * hbar := hgh.symm + have hGunit : IsUnit G := by + dsimp [G] + rw [← hua] + exact Polynomial.isUnit_C.mpr ua.isUnit + refine ⟨G, H, ?_, hGmap, hHmap, ?_⟩ + · simpa using hGH.symm + · rw [Polynomial.natDegree_eq_zero_of_isUnit hGunit, + Polynomial.natDegree_eq_zero_of_isUnit hgunit] + | cons Q factors ih => + have hQdata : Q.IsPrimitive ∧ Irreducible (Q.map V.subtype) := + hfactors Q (by simp) + have htail : ∀ R ∈ factors, + R.IsPrimitive ∧ Irreducible (R.map V.subtype) := by + intro R hR + exact hfactors R (by simp [hR]) + let qbar : Polynomial (IsLocalRing.ResidueField V) := + Q.map (IsLocalRing.residue V) + have hQbar0 : qbar ≠ 0 := + polynomial_residue_ne_zero_of_isPrimitive V hQdata.1 + have hdegreeData := (hproperty Q hQdata.1 hQdata.2).1 + have hproduct' : + qbar * (factors.map + (fun R => R.map (IsLocalRing.residue V))).prod = + gbar * hbar := by + simpa [qbar] using hproduct + have hQdvd : qbar ∣ gbar * hbar := by + rw [← hproduct'] + exact dvd_mul_right _ _ + have hside : + (qbar.natDegree = Q.natDegree ∧ qbar ∣ gbar) ∨ + qbar ∣ hbar := by + rcases hdegreeData with hqconst | hqfull + · right + have hqunit : IsUnit qbar := by + rw [Polynomial.isUnit_iff_degree_eq_zero, + Polynomial.degree_eq_natDegree hQbar0, hqconst] + rfl + exact hqunit.dvd + · rcases + primitiveIrreducibleReduction_dvd_left_or_right_of_coprime + V hproperty Q hQdata.1 hQdata.2 gbar hbar hcoprime hQdvd with + hQg | hQh + · exact Or.inl ⟨hqfull, hQg⟩ + · exact Or.inr hQh + rcases hside with ⟨hQdegree, hQg⟩ | hQh + · obtain ⟨g', hg'⟩ := hQg + have hg'coprime : IsCoprime g' hbar := by + rcases hcoprime with ⟨A, B, hbez⟩ + refine ⟨A * qbar, B, ?_⟩ + calc + (A * qbar) * g' + B * hbar = + A * (qbar * g') + B * hbar := by ring + _ = A * gbar + B * hbar := by rw [← hg'] + _ = 1 := hbez + have hrest : + (factors.map + (fun R => R.map (IsLocalRing.residue V))).prod = + g' * hbar := by + apply mul_left_cancel₀ hQbar0 + calc + qbar * (factors.map + (fun R => R.map (IsLocalRing.residue V))).prod = + gbar * hbar := hproduct' + _ = (qbar * g') * hbar := by rw [← hg'] + _ = qbar * (g' * hbar) := by ring + obtain ⟨G, H, hfactorGH, hGbar, hHbar, hGdegree⟩ := + ih htail g' hbar hrest hg'coprime + have hQ0 : Q ≠ 0 := hQdata.1.ne_zero + have hg'0 : g' ≠ 0 := by + have hrest0 : + (factors.map + (fun R => R.map (IsLocalRing.residue V))).prod ≠ 0 := + Multiset.prod_ne_zero (by + intro hzeroMem + rcases Multiset.mem_map.mp hzeroMem with ⟨R, hR, hRzero⟩ + exact + (polynomial_residue_ne_zero_of_isPrimitive V (htail R hR).1) + hRzero) + have hmul0 : g' * hbar ≠ 0 := by + rw [← hrest] + exact hrest0 + exact left_ne_zero_of_mul hmul0 + have hG0 : G ≠ 0 := by + intro hzero + rw [hzero] at hGbar + exact hg'0 (by simpa using hGbar.symm) + refine ⟨Q * G, H, ?_, ?_, hHbar, ?_⟩ + · simp only [Multiset.prod_cons, hfactorGH] + ring + · rw [Polynomial.map_mul, hGbar] + exact hg'.symm + · rw [Polynomial.natDegree_mul hQ0 hG0] + calc + Q.natDegree + G.natDegree = + qbar.natDegree + g'.natDegree := by + rw [hQdegree, hGdegree] + _ = (qbar * g').natDegree := + (Polynomial.natDegree_mul hQbar0 hg'0).symm + _ = gbar.natDegree := by rw [← hg'] + · obtain ⟨h', hh'⟩ := hQh + have hh'coprime : IsCoprime gbar h' := by + rcases hcoprime with ⟨A, B, hbez⟩ + refine ⟨A, B * qbar, ?_⟩ + calc + A * gbar + (B * qbar) * h' = + A * gbar + B * (qbar * h') := by ring + _ = A * gbar + B * hbar := by rw [← hh'] + _ = 1 := hbez + have hrest : + (factors.map + (fun R => R.map (IsLocalRing.residue V))).prod = + gbar * h' := by + apply mul_left_cancel₀ hQbar0 + calc + qbar * (factors.map + (fun R => R.map (IsLocalRing.residue V))).prod = + gbar * hbar := hproduct' + _ = gbar * (qbar * h') := by rw [← hh'] + _ = qbar * (gbar * h') := by ring + obtain ⟨G, H, hfactorGH, hGbar, hHbar, hGdegree⟩ := + ih htail gbar h' hrest hh'coprime + refine ⟨G, Q * H, ?_, hGbar, ?_, hGdegree⟩ + · simp only [Multiset.prod_cons, hfactorGH] + ring + · rw [Polynomial.map_mul, hHbar] + exact hh'.symm + +/-- The common last step of the unique-extension criterion and the factor-lifting criterion: the +construction's +primitive irreducible reduction property implies the exact degree-controlled +factorization form of Hensel's lemma from the primitive factorization definition. -/ +theorem henselFactorization_of_primitiveIrreducibleReductionProperty + {K : Type*} [Field K] (V : ValuationSubring K) + (hproperty : PrimitiveIrreducibleReductionProperty V) : + HenselFactorizationProperty V := by + intro f gbar hbar hfbar hfactor hcoprime + have hfprim : f.IsPrimitive := + polynomial_isPrimitive_of_residue_ne_zero hfbar + obtain ⟨factors, hfactors, hassoc⟩ := + primitive_associated_prod_primitive_irreducible_map_factors V f hfprim + obtain ⟨u, hu⟩ := hassoc + let U : Polynomial V := (u : Polynomial V) + let ubar : (Polynomial (IsLocalRing.ResidueField V))ˣ := + Units.map (Polynomial.mapRingHom (IsLocalRing.residue V)) u + let hbar' : Polynomial (IsLocalRing.ResidueField V) := + hbar * (ubar⁻¹ : + (Polynomial (IsLocalRing.ResidueField V))ˣ) + have hmapU : U.map (IsLocalRing.residue V) = + (ubar : Polynomial (IsLocalRing.ResidueField V)) := by + rfl + have humap : + (factors.map + (fun Q => Q.map (IsLocalRing.residue V))).prod * + (ubar : Polynomial (IsLocalRing.ResidueField V)) = + gbar * hbar := by + have h := congrArg (Polynomial.map (IsLocalRing.residue V)) hu + rw [Polynomial.map_mul, Polynomial.map_multiset_prod] at h + change + (factors.map + (fun Q => Q.map (IsLocalRing.residue V))).prod * + (ubar : Polynomial (IsLocalRing.ResidueField V)) = + f.map (IsLocalRing.residue V) at h + exact h.trans hfactor + have hproduct : + (factors.map + (fun Q => Q.map (IsLocalRing.residue V))).prod = + gbar * hbar' := by + apply mul_right_cancel₀ ubar.ne_zero + calc + (factors.map + (fun Q => Q.map (IsLocalRing.residue V))).prod * + (ubar : Polynomial (IsLocalRing.ResidueField V)) = + gbar * hbar := humap + _ = (gbar * hbar') * + (ubar : Polynomial (IsLocalRing.ResidueField V)) := by + dsimp [hbar'] + simp [mul_assoc] + have hcoprime' : IsCoprime gbar hbar' := by + rcases hcoprime with ⟨A, B, hbez⟩ + refine ⟨A, B * (ubar : Polynomial (IsLocalRing.ResidueField V)), ?_⟩ + dsimp [hbar'] + calc + A * gbar + (B * (ubar : Polynomial (IsLocalRing.ResidueField V))) * + (hbar * (ubar⁻¹ : + (Polynomial (IsLocalRing.ResidueField V))ˣ)) = + A * gbar + B * hbar := by + simp [mul_assoc, mul_comm, mul_left_comm] + _ = 1 := hbez + obtain ⟨G, H₀, hGH₀, hGmap, hH₀map, hGdegree⟩ := + partition_primitive_irreducible_factors_along_coprime_reduction + V hproperty factors hfactors gbar hbar' hproduct hcoprime' + let H : Polynomial V := H₀ * U + have hfactorGH : f = G * H := by + calc + f = factors.prod * U := hu.symm + _ = (G * H₀) * U := by rw [hGH₀] + _ = G * H := by simp [H, mul_assoc] + have hHmap : H.map (IsLocalRing.residue V) = hbar := by + change (H₀ * U).map (IsLocalRing.residue V) = hbar + rw [Polynomial.map_mul, hH₀map, hmapU] + dsimp [hbar'] + simp [mul_assoc] + have hgh0 : gbar * hbar ≠ 0 := by + rw [← hfactor] + exact hfbar + have hg0 : gbar ≠ 0 := left_ne_zero_of_mul hgh0 + have hh0 : hbar ≠ 0 := right_ne_zero_of_mul hgh0 + have hG0 : G ≠ 0 := by + intro hzero + rw [hzero] at hGmap + exact hg0 (by simpa using hGmap.symm) + have hH0 : H ≠ 0 := by + intro hzero + rw [hzero] at hHmap + exact hh0 (by simpa using hHmap.symm) + have hdegree : f.natDegree = G.natDegree + H.natDegree := by + rw [hfactorGH, Polynomial.natDegree_mul hG0 hH0] + have hHdegree : H.natDegree ≤ f.natDegree - gbar.natDegree := by + rw [hGdegree] at hdegree + omega + exact ⟨G, H, hGdegree, hHdegree, hfactorGH, hGmap, hHmap⟩ + +end DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveReduction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveReduction.lean new file mode 100644 index 0000000000..2e5a50e77e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveReduction.lean @@ -0,0 +1,353 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Core +public import Mathlib.RingTheory.Polynomial.GaussLemma +public import Mathlib.RingTheory.Polynomial.ContentIdeal +/-! +# Primitive polynomials detected by reduction + +The construction calls a polynomial over a valuation ring primitive when its +reduction modulo the maximal ideal is nonzero. The lemma below identifies +that condition with the divisibility notion used by mathlib's Gauss lemma. +-/ + +@[expose] public section + +noncomputable +section + +open Polynomial +open UniqueFactorizationMonoid + +namespace DiscreteValuationField + +/-- Over a local ring, a polynomial whose residue is nonzero is primitive in +the Gauss-lemma sense: every constant divisor is a unit. -/ +theorem polynomial_isPrimitive_of_residue_ne_zero + {R : Type*} [CommRing R] [IsLocalRing R] + {f : Polynomial R} + (hf : f.map (IsLocalRing.residue R) ≠ 0) : + f.IsPrimitive := by + rw [Polynomial.isPrimitive_iff_isUnit_of_C_dvd] + intro r hr + apply (IsLocalRing.residue_ne_zero_iff_isUnit r).mp + intro hrzero + rcases hr with ⟨q, hq⟩ + apply hf + rw [hq, Polynomial.map_mul] + simp [hrzero] + +/-- A primitive polynomial over a valuation subring has a unit coefficient. +The proof chooses a coefficient of maximal valuation; it divides every other +coefficient, so primitivity forces it to be a unit. -/ +theorem exists_isUnit_coeff_of_isPrimitive + {K : Type*} [Field K] (V : ValuationSubring K) + {f : Polynomial V} (hf : f.IsPrimitive) : + ∃ i : ℕ, IsUnit (f.coeff i) := by + classical + have hf0 : f ≠ 0 := hf.ne_zero + obtain ⟨i, hi, himax⟩ := + f.support.exists_max_image + (fun n => V.valuation ((f.coeff n : V) : K)) + (Polynomial.support_nonempty.mpr hf0) + refine ⟨i, hf (f.coeff i) ?_⟩ + rw [Polynomial.C_dvd_iff_dvd_coeff] + intro n + by_cases hnzero : f.coeff n = 0 + · simp [hnzero] + · have hn : n ∈ f.support := + Polynomial.mem_support_iff.mpr hnzero + obtain ⟨z, hz⟩ := + (V.valuation_le_iff + ((f.coeff n : V) : K) ((f.coeff i : V) : K)).mp + (himax n hn) + refine ⟨z, ?_⟩ + apply V.subtype_injective + change ((f.coeff n : V) : K) = + ((f.coeff i : V) : K) * (z : K) + rw [mul_comm, hz] + +/-- The reduction of a primitive polynomial over a valuation subring is +nonzero. -/ +theorem polynomial_residue_ne_zero_of_isPrimitive + {K : Type*} [Field K] (V : ValuationSubring K) + {f : Polynomial V} (hf : f.IsPrimitive) : + f.map (IsLocalRing.residue V) ≠ 0 := by + obtain ⟨i, hi⟩ := exists_isUnit_coeff_of_isPrimitive V hf + intro hzero + have hcoeff := congrArg (fun p => p.coeff i) hzero + change (f.map (IsLocalRing.residue V)).coeff i = + (0 : Polynomial (IsLocalRing.ResidueField V)).coeff i at hcoeff + rw [Polynomial.coeff_map] at hcoeff + simp only [Polynomial.coeff_zero] at hcoeff + exact ((IsLocalRing.residue_ne_zero_iff_isUnit (f.coeff i)).2 hi) hcoeff + +/-- Pointwise associated factors have associated multiset products. -/ +theorem associated_multiset_map_prod_of_forall + {I M : Type*} [CommMonoid M] + (s : Multiset I) (f g : I → M) + (h : ∀ i ∈ s, Associated (f i) (g i)) : + Associated (s.map f).prod (s.map g).prod := by + induction s using Multiset.induction_on with + | empty => exact Associated.refl 1 + | cons i s ih => + simp only [Multiset.map_cons, Multiset.prod_cons] + exact (h i (by simp)).mul_mul + (ih (fun j hj => h j (by simp [hj]))) + +/-- Gauss association descends through a valuation subring: primitive +polynomials that become associated over the fraction field are already +associated over the valuation ring. -/ +theorem associated_of_isPrimitive_of_map_associated + {K : Type*} [Field K] (V : ValuationSubring K) + {f g : Polynomial V} (hf : f.IsPrimitive) (hg : g.IsPrimitive) + (hassoc : Associated (f.map V.subtype) (g.map V.subtype)) : + Associated f g := by + classical + obtain ⟨u, hu⟩ := hassoc + obtain ⟨c, hcunit, hcu⟩ := Polynomial.isUnit_iff.mp u.isUnit + have hscalar : + f.map V.subtype * Polynomial.C c = g.map V.subtype := by + rw [hcu] + exact hu + obtain ⟨i, hfi⟩ := exists_isUnit_coeff_of_isPrimitive V hf + obtain ⟨uf, huf⟩ := hfi + let cV : V := (uf⁻¹ : Vˣ) * g.coeff i + have hicoeff := congrArg (fun P : Polynomial K => P.coeff i) hscalar + change (f.map V.subtype * Polynomial.C c).coeff i = + (g.map V.subtype).coeff i at hicoeff + rw [Polynomial.coeff_mul_C] at hicoeff + simp only [Polynomial.coeff_map] at hicoeff + change ((f.coeff i : V) : K) * c = + ((g.coeff i : V) : K) at hicoeff + have hcV : ((cV : V) : K) = c := by + dsimp [cV] + change (((uf⁻¹ : Vˣ) : V) : K) * ((g.coeff i : V) : K) = c + rw [← hicoeff, ← huf] + have hinvV : ((uf⁻¹ : Vˣ) : V) * (uf : V) = 1 := by simp + have hinvK := congrArg V.subtype hinvV + change (((uf⁻¹ : Vˣ) : V) : K) * ((uf : V) : K) = 1 at hinvK + rw [← mul_assoc, hinvK, one_mul] + obtain ⟨j, hgj⟩ := exists_isUnit_coeff_of_isPrimitive V hg + have hjcoeff := congrArg (fun P : Polynomial K => P.coeff j) hscalar + change (f.map V.subtype * Polynomial.C c).coeff j = + (g.map V.subtype).coeff j at hjcoeff + rw [Polynomial.coeff_mul_C] at hjcoeff + simp only [Polynomial.coeff_map] at hjcoeff + change ((f.coeff j : V) : K) * c = + ((g.coeff j : V) : K) at hjcoeff + have hjV : f.coeff j * cV = g.coeff j := by + apply V.subtype_injective + change ((f.coeff j : V) : K) * ((cV : V) : K) = + ((g.coeff j : V) : K) + rw [hcV] + exact hjcoeff + have hcVunit : IsUnit cV := by + apply isUnit_of_mul_isUnit_right + rw [hjV] + exact hgj + have hfg : f * Polynomial.C cV = g := by + apply Polynomial.map_injective V.subtype V.subtype_injective + rw [Polynomial.map_mul, Polynomial.map_C] + change f.map V.subtype * Polynomial.C ((cV : V) : K) = + g.map V.subtype + rw [hcV] + exact hscalar + exact + (associated_mul_unit_right f (Polynomial.C cV) + (Polynomial.isUnit_C.mpr hcVunit)).trans + (Associated.of_eq hfg) + +/-- Gauss's product lemma for a valuation subring, stated without choosing a +`NormalizedGCDMonoid` structure. -/ +theorem isPrimitive_mul_of_valuationSubring + {K : Type*} [Field K] (V : ValuationSubring K) + {f g : Polynomial V} (hf : f.IsPrimitive) (hg : g.IsPrimitive) : + (f * g).IsPrimitive := by + rw [Polynomial.isPrimitive_iff_contentIdeal_eq_top] at hf hg ⊢ + exact Polynomial.contentIdeal_mul_eq_top_of_contentIdeal_eq_top hf hg + +/-- A finite product of primitive polynomials over a valuation subring is +primitive. -/ +theorem isPrimitive_finset_prod_of_valuationSubring + {K I : Type*} [Field K] (V : ValuationSubring K) + (s : Finset I) (f : I → Polynomial V) + (hf : ∀ i ∈ s, (f i).IsPrimitive) : + (∏ i ∈ s, f i).IsPrimitive := by + classical + induction s using Finset.induction_on with + | empty => simp + | @insert a s ha ih => + rw [Finset.prod_insert ha] + exact isPrimitive_mul_of_valuationSubring V + (hf a (Finset.mem_insert_self a s)) + (ih (fun i hi => hf i (Finset.mem_insert_of_mem hi))) + +/-- Multiset form of the preceding primitive-product lemma, convenient for +unique-factorization multisets over `K[X]`. -/ +theorem isPrimitive_multiset_prod_of_valuationSubring + {K : Type*} [Field K] (V : ValuationSubring K) + (s : Multiset (Polynomial V)) + (hs : ∀ f ∈ s, f.IsPrimitive) : + s.prod.IsPrimitive := by + induction s using Multiset.induction_on with + | empty => simp + | cons f s ih => + rw [Multiset.prod_cons] + exact isPrimitive_mul_of_valuationSubring V + (hs f (by simp)) + (ih (fun g hg => hs g (by simp [hg]))) + +/-- Every irreducible polynomial over the fraction field of a valuation +subring is associated to the image of a primitive irreducible polynomial +over the valuation subring. This is the normalization step used when the +the construction factors a primitive polynomial over `K` and then rescales each +irreducible factor back into the valuation ring. -/ +theorem exists_primitive_irreducible_lift_of_irreducible + {K : Type*} [Field K] (V : ValuationSubring K) + {p : Polynomial K} (hp : Irreducible p) : + ∃ q : Polynomial V, + q.IsPrimitive ∧ Irreducible q ∧ + Associated (q.map V.subtype) p := by + classical + have hp0 : p ≠ 0 := hp.ne_zero + obtain ⟨i, hi, himax⟩ := + p.support.exists_max_image (fun n => V.valuation (p.coeff n)) + (Polynomial.support_nonempty.mpr hp0) + let a : K := p.coeff i + have ha : a ≠ 0 := by + simpa [a, Polynomial.mem_support_iff] using hi + let coeffV : ℕ → V := fun n => + if hn : n ∈ p.support then + ⟨p.coeff n / a, by + obtain ⟨z, hz⟩ := + (V.valuation_le_iff (p.coeff n) a).mp (himax n hn) + have hzdiv : p.coeff n / a = (z : K) := by + rw [← hz] + simp [ha] + rw [hzdiv] + exact z.2⟩ + else 0 + let q : Polynomial V := + ∑ n ∈ p.support, Polynomial.monomial n (coeffV n) + have hqcoeffV (n : ℕ) : q.coeff n = coeffV n := by + by_cases hn : n ∈ p.support + · have hcoeffne : p.coeff n ≠ 0 := + Polynomial.mem_support_iff.mp hn + simp [q, Polynomial.coeff_monomial, coeffV, hn, hcoeffne] + · have hcoeffzero : p.coeff n = 0 := + Polynomial.notMem_support_iff.mp hn + simp [q, Polynomial.coeff_monomial, coeffV, hn, hcoeffzero] + have hqcoeff (n : ℕ) : + ((q.coeff n : V) : K) = p.coeff n / a := by + rw [hqcoeffV] + by_cases hn : n ∈ p.support + · have hcoeffne : p.coeff n ≠ 0 := + Polynomial.mem_support_iff.mp hn + simp [coeffV, hcoeffne] + · have hcoeffzero : p.coeff n = 0 := + Polynomial.notMem_support_iff.mp hn + simp [coeffV, hcoeffzero] + have hqcoeffi : q.coeff i = 1 := by + apply V.subtype_injective + simpa [a, ha] using hqcoeff i + have hqprim : q.IsPrimitive := by + rw [Polynomial.isPrimitive_iff_isUnit_of_C_dvd] + intro r hr + rcases hr with ⟨s, hs⟩ + apply IsUnit.of_mul_eq_one (s.coeff i) + calc + r * s.coeff i = (Polynomial.C r * s).coeff i := by + simp + _ = q.coeff i := by rw [← hs] + _ = 1 := hqcoeffi + have hqmap : q.map V.subtype = Polynomial.C a⁻¹ * p := by + ext n + rw [Polynomial.coeff_map] + change ((q.coeff n : V) : K) = _ + rw [hqcoeff] + simp [div_eq_mul_inv, mul_comm] + have hunitC : IsUnit (Polynomial.C a⁻¹) := + Polynomial.isUnit_C.mpr (isUnit_iff_ne_zero.mpr (inv_ne_zero ha)) + have hqassoc : Associated (q.map V.subtype) p := + (Associated.of_eq hqmap).trans + (associated_unit_mul_left p (Polynomial.C a⁻¹) hunitC) + have hqirrMap : Irreducible (q.map V.subtype) := + hqassoc.symm.irreducible hp + have hqirr : Irreducible q := + hqprim.irreducible_of_irreducible_map_of_injective + V.subtype_injective hqirrMap + exact ⟨q, hqprim, hqirr, hqassoc⟩ + +/-- A primitive polynomial over a valuation subring is, up to a unit over +that valuation subring, a finite product of primitive polynomials whose +fraction-field images are irreducible. -/ +theorem primitive_associated_prod_primitive_irreducible_map_factors + {K : Type*} [Field K] (V : ValuationSubring K) + (f : Polynomial V) (hf : f.IsPrimitive) : + ∃ factors : Multiset (Polynomial V), + (∀ Q ∈ factors, Q.IsPrimitive ∧ Irreducible (Q.map V.subtype)) ∧ + Associated factors.prod f := by + classical + let fk : Polynomial K := f.map V.subtype + have hfk0 : fk ≠ 0 := + (Polynomial.map_ne_zero_iff V.subtype_injective).2 hf.ne_zero + let S : Multiset (Polynomial K) := normalizedFactors fk + have hlift : ∀ q : Polynomial K, q ∈ S → + ∃ Q : Polynomial V, + Q.IsPrimitive ∧ Irreducible Q ∧ Associated (Q.map V.subtype) q := by + intro q hq + have hqS : q ∈ normalizedFactors fk := by simpa [S] using hq + have hqirr : Irreducible q := + (Polynomial.mem_normalizedFactors_iff hfk0).1 hqS |>.1 + exact exists_primitive_irreducible_lift_of_irreducible V hqirr + choose lift hlift_prim hlift_irr hlift_assoc using hlift + let factors : Multiset (Polynomial V) := + S.attach.map (fun q => lift q.1 q.2) + have hfactors : ∀ Q ∈ factors, + Q.IsPrimitive ∧ Irreducible (Q.map V.subtype) := by + intro Q hQ + rcases Multiset.mem_map.mp hQ with ⟨q, hq, rfl⟩ + have hqmem : q.1 ∈ S := q.2 + have hqS : q.1 ∈ normalizedFactors fk := by + simpa [S] using hqmem + exact ⟨hlift_prim q.1 hqmem, + (hlift_assoc q.1 hqmem).symm.irreducible + ((Polynomial.mem_normalizedFactors_iff hfk0).1 hqS |>.1)⟩ + have hmapAssoc : + Associated + (factors.map (Polynomial.map V.subtype)).prod S.prod := by + have h := associated_multiset_map_prod_of_forall S.attach + (fun q => (lift q.1 q.2).map V.subtype) (fun q => q.1) + (fun q _ => hlift_assoc q.1 q.2) + simpa [factors] using h + have hprodMapAssoc : + Associated (factors.prod.map V.subtype) S.prod := by + simpa only [Polynomial.map_multiset_prod] using hmapAssoc + have hlc0 : fk.leadingCoeff ≠ 0 := + Polynomial.leadingCoeff_ne_zero.mpr hfk0 + have hCunit : IsUnit (Polynomial.C fk.leadingCoeff) := + Polynomial.isUnit_C.mpr (isUnit_iff_ne_zero.mpr hlc0) + have hSprod : + Polynomial.C fk.leadingCoeff * S.prod = fk := by + simpa [S] using Polynomial.leadingCoeff_mul_prod_normalizedFactors fk + have hSassoc : Associated S.prod fk := + (associated_unit_mul_right S.prod + (Polynomial.C fk.leadingCoeff) hCunit).trans + (Associated.of_eq hSprod) + have hprodprim : factors.prod.IsPrimitive := + isPrimitive_multiset_prod_of_valuationSubring V factors + (fun Q hQ => (hfactors Q hQ).1) + refine ⟨factors, hfactors, ?_⟩ + exact associated_of_isPrimitive_of_map_associated + V hprodprim hf (hprodMapAssoc.trans hSassoc) + +end DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/SimpleRootFactorization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/SimpleRootFactorization.lean new file mode 100644 index 0000000000..f9150adfea --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/SimpleRootFactorization.lean @@ -0,0 +1,42 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.CoprimeFactorLifting +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.ValuationExtensionCriterion +/-! +# From simple-root Hensel lifting to valuation factorization + +The Henselian ring assumption now supplies the actual coprime factors. +The valuation factorization criterion then extends the monic result to +all primitive polynomials, with the prescribed reductions and degree bounds. +-/ + +@[expose] public section + +namespace DiscreteValuationField + +open ValuationTheory.DiscreteValuationField + +variable {K : Type*} [Field K] (V : ValuationSubring K) + [HenselianRing V (IsLocalRing.maximalIdeal V)] + +/-- The simple-root Henselian condition supplies monic coprime-factor lifting. -/ +theorem monicResidualCoprimeFactorLifting_of_henselianRing : + MonicResidualCoprimeFactorLifting V := by + intro f gbar hbar hf hgbar hhbar hfac hcop + obtain ⟨g, h, hg, hh, hgh, _, _, hgmap, hhmap, _⟩ := + ValuationTheory.Henselian.exists_coprime_factor_lift + (I := IsLocalRing.maximalIdeal V) f gbar hbar hf hgbar hhbar hfac hcop + exact ⟨g, h, hg, hh, hgh, hgmap, hhmap⟩ + +/-- A Henselian valuation ring satisfies the full primitive factorization +form of Hensel's lemma, without completeness or rank assumptions. -/ +theorem henselFactorization_of_henselianRing : HenselFactorizationProperty V := + henselianValuationExtension V (monicResidualCoprimeFactorLifting_of_henselianRing V) + +end DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/StandardEtaleLifting.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/StandardEtaleLifting.lean new file mode 100644 index 0000000000..d7334f5aaa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/StandardEtaleLifting.lean @@ -0,0 +1,79 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RingTheory.Henselian +public import Mathlib.RingTheory.Etale.StandardEtale +/-! +# Lifting points of standard étale algebras + +The simple-root condition for a Henselian pair lifts a residue point of a +standard étale algebra to the base ring. The defining monic polynomial and +its derivative condition supply the Hensel input, and the Jacobson condition +makes the localization denominator invertible at the lifted root. +-/ + +@[expose] public section + +namespace ValuationTheory.Henselian + +variable {R : Type*} [CommRing R] {I : Ideal R} [HenselianRing R I] + +/-- A point of a standard étale algebra modulo a Henselian ideal lifts to +a point over the original ring. -/ +theorem exists_standardEtale_lift + (P : StandardEtalePair R) (σ : P.Ring →ₐ[R] R ⧸ I) : + ∃ τ : P.Ring →ₐ[R] R, (Ideal.Quotient.mkₐ R I).comp τ = σ := by + let q : R →ₐ[R] R ⧸ I := Ideal.Quotient.mkₐ R I + have hσ : P.HasMap (σ P.X) := P.hasMap_X.map σ + obtain ⟨a₀, ha₀⟩ := Ideal.Quotient.mk_surjective (σ P.X) + change q a₀ = σ P.X at ha₀ + have hroot : P.f.eval a₀ ∈ I := by + apply Ideal.Quotient.eq_zero_iff_mem.mp + change q (Polynomial.aeval a₀ P.f) = 0 + rw [← Polynomial.aeval_algHom_apply, ha₀] + exact hσ.1 + have hsimple : IsUnit (Ideal.Quotient.mk I (P.f.derivative.eval a₀)) := by + change IsUnit (q (Polynomial.aeval a₀ P.f.derivative)) + rw [← Polynomial.aeval_algHom_apply, ha₀] + exact StandardEtalePair.HasMap.isUnit_derivative_f P hσ + obtain ⟨a, ha, hacongr⟩ := HenselianRing.is_henselian P.f P.monic_f a₀ hroot hsimple + have hqa : q a = σ P.X := by + exact (Ideal.Quotient.eq.mpr hacongr).trans ha₀ + have hdenom : IsUnit (Polynomial.aeval a P.g) := by + let : IsLocalHom (Ideal.Quotient.mk I) := + isLocalHom_of_le_jacobson_bot I HenselianRing.jac + apply IsUnit.of_map (Ideal.Quotient.mk I) + change IsUnit (q (Polynomial.aeval a P.g)) + rw [← Polynomial.aeval_algHom_apply, hqa] + exact hσ.2 + have haP : P.HasMap a := ⟨ha, hdenom⟩ + refine ⟨P.lift a haP, ?_⟩ + apply P.hom_ext + rw [AlgHom.comp_apply, P.lift_X] + exact hqa + +/-- A residue point of an algebra admitting a standard étale presentation +lifts over a Henselian pair. -/ +theorem exists_isStandardEtale_lift + {S : Type*} [CommRing S] [Algebra R S] [Algebra.IsStandardEtale R S] + (σ : S →ₐ[R] R ⧸ I) : + ∃ τ : S →ₐ[R] R, (Ideal.Quotient.mkₐ R I).comp τ = σ := by + let P : StandardEtalePresentation R S := + Classical.choice (inferInstance : Nonempty (StandardEtalePresentation R S)) + obtain ⟨τ, hτ⟩ := exists_standardEtale_lift P.P + (σ.comp P.equivRing.symm.toAlgHom) + refine ⟨τ.comp P.equivRing.toAlgHom, ?_⟩ + apply AlgHom.ext + intro s + change Ideal.Quotient.mk I (τ (P.equivRing s)) = σ s + calc + Ideal.Quotient.mk I (τ (P.equivRing s)) = + σ (P.equivRing.symm (P.equivRing s)) := DFunLike.congr_fun hτ (P.equivRing s) + _ = σ s := congrArg σ (P.equivRing.symm_apply_apply s) + +end ValuationTheory.Henselian diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueAlgebraicExtensions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueAlgebraicExtensions.lean new file mode 100644 index 0000000000..fa51680479 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueAlgebraicExtensions.lean @@ -0,0 +1,201 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionPrimitive +/-! +# unique extension criterion + +Valuations are regarded valuations up to equivalence. Accordingly, uniqueness on +an algebraic extension is stated as literal uniqueness of its valuation +subring. This is the same endpoint used in the finite norm-formula theorem. +-/ + +@[expose] public section + +noncomputable +section + +namespace AlgebraicNumberTheory +namespace Valuations + +universe u + +/-- A valuation subring has a unique extension valuation ring to `L`. -/ +def HasUniqueValuationSubringExtension + {K L : Type*} [Field K] [Field L] [Algebra K L] + (V : ValuationSubring K) : Prop := + ∃! W : ValuationSubring L, V.valuation.HasExtension W.valuation + +/-- A valuation subring has a unique extension valuation ring on every +algebraic extension in the same universe. This is the valuation-ring form +of the right-hand side of the unique-extension criterion. -/ +def HasUniqueAlgebraicValuationSubringExtensions + {K : Type u} [Field K] (V : ValuationSubring K) : Prop := + ∀ (L : Type u) [Field L] [Algebra K L] [Algebra.IsAlgebraic K L], + HasUniqueValuationSubringExtension (L := L) V + +/-- Unique extension on every algebraic field supplies the exact monic +coprime-factor lifting property. Factor the monic polynomial into monic +irreducibles over the valuation ring; uniqueness on each splitting field +forces every irreducible reduction to lie wholly on one side of a coprime +residual factorization. -/ +theorem monicResidualCoprimeFactorLifting_of_unique_algebraic_extensions + {K : Type u} [Field K] (V : ValuationSubring K) + (hunique : HasUniqueAlgebraicValuationSubringExtensions V) : + DiscreteValuationField.MonicResidualCoprimeFactorLifting V := by + intro f gbar hbar hf hgbar hhbar hfactor hcoprime + obtain ⟨factors, hfactors, hprod⟩ := + monic_eq_prod_monic_irreducible_map_factors V f hf + have hredprod : + (factors.map + (fun Q => Q.map (IsLocalRing.residue V))).prod = gbar * hbar := by + calc + (factors.map + (fun Q => Q.map (IsLocalRing.residue V))).prod = + factors.prod.map (IsLocalRing.residue V) := by + rw [Polynomial.map_multiset_prod] + _ = f.map (IsLocalRing.residue V) := by rw [hprod] + _ = gbar * hbar := hfactor + obtain ⟨G, H, hG, hH, hGH, hGbar, hHbar⟩ := + partition_monic_irreducible_factors_along_coprime_reduction + V hunique factors hfactors gbar hbar hgbar hhbar hredprod hcoprime + exact ⟨G, H, hG, hH, hprod.symm.trans hGH, hGbar, hHbar⟩ + +open DiscreteValuationField.Valuation renaming + normFormula_extension_valuationSubring_eq_integralClosure_of_mem_or_inv → + normFormula_valuationSubring_eq_integralClosure in +/-- the unique-extension criterion, forward direction. the primitive factorization definition, +in its exact +factorization form, gives a unique extension valuation ring on every +algebraic extension. -/ +theorem henselianUniqueExtension_unique_algebraic_valuationSubring_extension_of_henselian + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Algebra.IsAlgebraic K L] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (absoluteValueValuationSubring + v hnonarch).valuation) : + HasUniqueValuationSubringExtension + (L := L) (absoluteValueValuationSubring v hnonarch) := by + let V := absoluteValueValuationSubring v hnonarch + obtain ⟨B, hB, hBuniq⟩ := + normFormula_algebraic_extension (K := K) (L := L) + v hnonarch hhens + refine ⟨B, hB.1, ?_⟩ + intro W hW + apply hBuniq W + refine ⟨hW, ?_⟩ + have hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty V := + (henselianValuation_iff_henselFactorization v hnonarch).1 hhens + have hvalV : + ∀ z : L, + z ∈ (integralClosure V L).toSubring ∨ + z⁻¹ ∈ (integralClosure V L).toSubring := + normFormula_algebraic_integralClosure_mem_or_inv_of_henselFactorization + v hnonarch hv + have hval : + ∀ z : L, + z ∈ (integralClosure V.valuation.valuationSubring L).toSubring ∨ + z⁻¹ ∈ + (integralClosure V.valuation.valuationSubring L).toSubring := by + rw [ValuationSubring.valuationSubring_valuation] + exact hvalV + let : V.valuation.HasExtension W.valuation := hW + have hWic : + W = + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) V.valuation hval := by + simpa only [ValuationSubring.valuationSubring_valuation] using + normFormula_valuationSubring_eq_integralClosure + (K := K) (L := L) V hval W.valuation + change W.toSubring = (integralClosure V L).toSubring + rw [hWic] + ext z + change z ∈ + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) V.valuation hval ↔ z ∈ (integralClosure V L).toSubring + rw [ValuationTheory.DiscreteValuationField.Valuation.mem_integralClosureValuationSubringOfMemOrInv + V.valuation hval z] + rw [ValuationSubring.valuationSubring_valuation] + +/-- the unique-extension criterion, forward implication simultaneously for every algebraic +extension. -/ +theorem henselianUniqueExtension_unique_algebraic_valuationSubring_extensions_of_henselian + {K : Type u} [Field K] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (absoluteValueValuationSubring + v hnonarch).valuation) : + HasUniqueAlgebraicValuationSubringExtensions + (absoluteValueValuationSubring v hnonarch) := by + intro L _ _ _ + exact + henselianUniqueExtension_unique_algebraic_valuationSubring_extension_of_henselian + (L := L) v hnonarch hhens + +/-- the unique-extension criterion, converse in the exact factorization form of the primitive +factorization definition. +The Galois argument gives the primitive-irreducible reduction property, and +the primitive-factor partition turns it into the required degree-controlled +factorization. -/ +theorem henselFactorization_of_unique_algebraic_valuationSubring_extensions + {K : Type u} [Field K] (V : ValuationSubring K) + (hunique : HasUniqueAlgebraicValuationSubringExtensions V) : + ValuationTheory.DiscreteValuationField.HenselFactorizationProperty V := by + apply + DiscreteValuationField.henselFactorization_of_primitiveIrreducibleReductionProperty + exact + primitiveIrreducibleReductionProperty_of_unique_algebraic_extensions + V hunique + +/-- The converse of the unique-extension criterion for the valuation attached to the construction's +nonarchimedean absolute value. -/ +theorem henselianUniqueExtension_henselian_of_unique_algebraic_valuationSubring_extensions + {K : Type u} [Field K] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) + (hunique : HasUniqueAlgebraicValuationSubringExtensions + (absoluteValueValuationSubring v hnonarch)) : + ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (absoluteValueValuationSubring + v hnonarch).valuation := by + change ValuationTheory.DiscreteValuationField.HenselFactorizationProperty + ((absoluteValueValuationSubring + v hnonarch).valuation.valuationSubring) + rw [ValuationSubring.valuationSubring_valuation] + intro f gbar hbar hprimitive hfactor hcoprime + exact + (henselFactorization_of_unique_algebraic_valuationSubring_extensions + (absoluteValueValuationSubring v hnonarch) hunique) + hprimitive hfactor hcoprime + +/-- the unique-extension criterion. A nonarchimedean valuation is Henselian exactly when its +valuation ring has a unique extension valuation ring on every algebraic +extension. Literal equality of valuation rings is the equivalence +relation on valuations. -/ +theorem henselianUniqueExtension_henselian_iff_unique_algebraic_valuationSubring_extensions + {K : Type u} [Field K] + (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) : + ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + (absoluteValueValuationSubring + v hnonarch).valuation ↔ + HasUniqueAlgebraicValuationSubringExtensions + (absoluteValueValuationSubring v hnonarch) := by + constructor + · exact + henselianUniqueExtension_unique_algebraic_valuationSubring_extensions_of_henselian + v hnonarch + · exact + henselianUniqueExtension_henselian_of_unique_algebraic_valuationSubring_extensions + v hnonarch + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionPrimitive.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionPrimitive.lean new file mode 100644 index 0000000000..b8347c68e9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionPrimitive.lean @@ -0,0 +1,409 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionReduction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.MonicFactorization +public import Mathlib.GroupTheory.OrderOfElement +/-! +# primitive irreducible reductions + +This file supplies the last Galois/Newton-polygon input in the converse of +the unique-extension criterion. Uniqueness of the extension valuation ring makes it invariant +under the finite Galois group of a splitting field. Consequently conjugate +roots have the same value. Vieta's formulas then show that a primitive +irreducible polynomial has either full-degree reduction or constant +reduction; in the full-degree case the monic normalization has no coprime +nonconstant residual factorization. +-/ + +@[expose] public section + +noncomputable +section + +open Polynomial + +namespace AlgebraicNumberTheory +namespace Valuations +open ValuationTheory.Valuations + +universe u + +/-- A finite-order ground-field automorphism stabilizing a valuation subring +preserves its canonical valuation exactly. Stabilization first preserves +the order relation on values. A strict change would iterate around the +finite orbit of the automorphism and give a strict cycle. -/ +theorem valuation_algEquiv_eq_of_unique_extension_of_finiteDimensional + {K L : Type*} [Field K] [Field L] [Algebra K L] + [FiniteDimensional K L] + (V : ValuationSubring K) (W : ValuationSubring L) + (hW : V.valuation.HasExtension W.valuation) + (huniq : ∀ W' : ValuationSubring L, + V.valuation.HasExtension W'.valuation → W' = W) + (σ : L ≃ₐ[K] L) (x : L) : + W.valuation (σ x) = W.valuation x := by + have hle (a b : L) : + W.valuation a ≤ W.valuation b ↔ + W.valuation (σ a) ≤ W.valuation (σ b) := by + constructor + · intro hab + obtain ⟨c, hc⟩ := (W.valuation_le_iff a b).1 hab + apply (W.valuation_le_iff (σ a) (σ b)).2 + refine ⟨⟨σ (c : L), ?_⟩, ?_⟩ + · exact + (algEquiv_mem_valuationSubring_iff_of_unique_extension + V W hW huniq σ (c : L)).2 c.2 + · change σ (c : L) * σ b = σ a + rw [← map_mul, hc] + · intro hab + obtain ⟨c, hc⟩ := (W.valuation_le_iff (σ a) (σ b)).1 hab + apply (W.valuation_le_iff a b).2 + refine ⟨⟨σ⁻¹ (c : L), ?_⟩, ?_⟩ + · exact + (algEquiv_mem_valuationSubring_iff_of_unique_extension + V W hW huniq σ⁻¹ (c : L)).2 c.2 + · apply σ.injective + simpa using hc + have hlt (a b : L) : + W.valuation a < W.valuation b ↔ + W.valuation (σ a) < W.valuation (σ b) := by + simpa only [lt_iff_not_ge] using not_congr (hle b a) + have hfin : IsOfFinOrder σ := isOfFinOrder_of_finite σ + obtain ⟨n, hn, hσn⟩ := hfin.exists_pow_eq_one + rcases lt_trichotomy (W.valuation (σ x)) (W.valuation x) with + hdown | heq | hup + · have hstep : ∀ m : ℕ, + W.valuation ((σ ^ (m + 1)) x) < + W.valuation ((σ ^ m) x) := by + intro m + induction m with + | zero => simpa using hdown + | succ m ih => + have hmapped := (hlt ((σ ^ (m + 1)) x) ((σ ^ m) x)).1 ih + simpa [pow_succ'] using hmapped + have hcycle : ∀ m : ℕ, + W.valuation ((σ ^ (m + 1)) x) < W.valuation x := by + intro m + induction m with + | zero => simpa using hdown + | succ m ih => exact (hstep (m + 1)).trans ih + obtain ⟨m, rfl⟩ := Nat.exists_eq_succ_of_ne_zero (Nat.ne_of_gt hn) + have := hcycle m + rw [hσn] at this + simp at this + · exact heq + · have hstep : ∀ m : ℕ, + W.valuation ((σ ^ m) x) < + W.valuation ((σ ^ (m + 1)) x) := by + intro m + induction m with + | zero => simpa using hup + | succ m ih => + have hmapped := (hlt ((σ ^ m) x) ((σ ^ (m + 1)) x)).1 ih + simpa [pow_succ'] using hmapped + have hcycle : ∀ m : ℕ, + W.valuation x < W.valuation ((σ ^ (m + 1)) x) := by + intro m + induction m with + | zero => simpa using hup + | succ m ih => exact ih.trans (hstep (m + 1)) + obtain ⟨m, rfl⟩ := Nat.exists_eq_succ_of_ne_zero (Nat.ne_of_gt hn) + have := hcycle m + rw [hσn] at this + simp at this + +/-- Roots of one irreducible ground-field polynomial have the same canonical +value in a finite normal splitting field with a unique extension valuation +ring. -/ +theorem valuation_eq_on_roots_of_irreducible_of_unique_extension + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Normal K L] [FiniteDimensional K L] + (V : ValuationSubring K) (W : ValuationSubring L) + (hW : V.valuation.HasExtension W.valuation) + (huniq : ∀ W' : ValuationSubring L, + V.valuation.HasExtension W'.valuation → W' = W) + (p : Polynomial K) (hirr : Irreducible p) + {a b : L} + (ha : a ∈ (p.map (algebraMap K L)).roots) + (hb : b ∈ (p.map (algebraMap K L)).roots) : + W.valuation a = W.valuation b := by + have hpL0 : p.map (algebraMap K L) ≠ 0 := + (Polynomial.map_ne_zero_iff (algebraMap K L).injective).2 hirr.ne_zero + have haeval : aeval a p = 0 := by + have h := (Polynomial.mem_roots hpL0).1 ha + simpa [aeval_def, Polynomial.eval_map] using h + have hbeval : aeval b p = 0 := by + have h := (Polynomial.mem_roots hpL0).1 hb + simpa [aeval_def, Polynomial.eval_map] using h + have hmin : minpoly K a = minpoly K b := by + rw [← minpoly.eq_of_irreducible hirr haeval, + ← minpoly.eq_of_irreducible hirr hbeval] + obtain ⟨σ, hσ⟩ := (Normal.minpoly_eq_iff_mem_orbit L).1 hmin + calc + W.valuation a = W.valuation (σ b) := congrArg W.valuation hσ.symm + _ = W.valuation b := + valuation_algEquiv_eq_of_unique_extension_of_finiteDimensional + V W hW huniq σ b + +/-- If all roots of a split monic product have value strictly larger than +one, every positive-degree coefficient has value strictly smaller than the +constant coefficient. -/ +theorem valuation_coeff_prod_X_sub_C_lt_coeff_zero_of_one_lt + {L Γ : Type*} [Field L] [LinearOrderedCommGroupWithZero Γ] + (w : Valuation L Γ) (s : Multiset L) + (hs : ∀ α ∈ s, 1 < w α) (j : ℕ) (hj : 0 < j) : + w (((s.map (fun α => Polynomial.X - Polynomial.C α)).prod).coeff j) < + w (((s.map (fun α => Polynomial.X - Polynomial.C α)).prod).coeff 0) := + DiscreteValuationField.valuation_coeff_prod_X_sub_C_lt_coeff_zero_of_one_lt + w s hs j hj + +open DiscreteValuationField renaming + not_all_roots_same_valuation_of_primitive_irreducible_endpoints_nonunit → + not_all_roots_same_valuation_of_primitive_irreducible_endpoints_nonunit in +/-- In the nonmonic branch of Artin's argument, uniqueness on the splitting +field forces every root to have value greater than one. Vieta's formula then +puts every positive-degree coefficient in the maximal ideal, so the +reduction is constant. -/ +theorem primitive_irreducible_reduction_natDegree_zero_of_leadingCoeff_nonunit + {K L : Type*} [Field K] [Field L] [Algebra K L] + (V : ValuationSubring K) (W : ValuationSubring L) + (hW : V.valuation.HasExtension W.valuation) + (huniq : ∀ W' : ValuationSubring L, + V.valuation.HasExtension W'.valuation → W' = W) + (Q : Polynomial V) (hQprim : Q.IsPrimitive) + (hQirr : Irreducible (Q.map V.subtype)) + [IsSplittingField K L (Q.map V.subtype)] + (hlead : ¬ IsUnit Q.leadingCoeff) : + (Q.map (IsLocalRing.residue V)).natDegree = 0 := by + let : V.valuation.HasExtension W.valuation := hW + let p : Polynomial K := Q.map V.subtype + let F : Polynomial L := p.map (algebraMap K L) + let roots : Multiset L := F.roots + let : FiniteDimensional K L := IsSplittingField.finiteDimensional L p + let : Normal K L := Normal.of_isSplittingField p + have hsplit : F.Splits := by + change (p.map (algebraMap K L)).Splits + exact IsSplittingField.splits L p + have hFnat : F.natDegree = p.natDegree := + Polynomial.natDegree_map_eq_of_injective (algebraMap K L).injective p + have hcardpos : 0 < roots.card := by + rw [← hsplit.natDegree_eq_card_roots, hFnat] + exact hQirr.natDegree_pos + obtain ⟨α, hα⟩ := Multiset.card_pos_iff_exists_mem.mp hcardpos + have hall : ∀ β ∈ roots, W.valuation β = W.valuation α := by + intro β hβ + exact valuation_eq_on_roots_of_irreducible_of_unique_extension + V W hW huniq p hQirr hβ hα + have hconst : IsUnit (Q.coeff 0) := by + by_contra hconst + exact + (not_all_roots_same_valuation_of_primitive_irreducible_endpoints_nonunit + V W hQprim hQirr hsplit hlead hconst hα) hall + have hconstBase : V.valuation (Q.coeff 0 : K) = 1 := + (V.valuation_eq_one_iff (Q.coeff 0)).mp hconst + have hconstTarget : + W.valuation (algebraMap K L (Q.coeff 0 : K)) = 1 := + (Valuation.HasExtension.val_map_eq_one_iff + V.valuation W.valuation (Q.coeff 0 : K)).mpr hconstBase + have hleadMax : Q.leadingCoeff ∈ IsLocalRing.maximalIdeal V := + (IsLocalRing.mem_maximalIdeal Q.leadingCoeff).mpr hlead + have hleadBase : V.valuation (Q.leadingCoeff : K) < 1 := + (V.valuation_lt_one_iff Q.leadingCoeff).mp hleadMax + have hleadTarget : + W.valuation (algebraMap K L (Q.leadingCoeff : K)) < 1 := + (Valuation.HasExtension.val_map_lt_one_iff + V.valuation W.valuation (Q.leadingCoeff : K)).mpr hleadBase + have hinjVK : Function.Injective (algebraMap V K) := by + intro x y hxy + exact Subtype.ext hxy + have halgVK (x : V) : algebraMap V K x = (x : K) := rfl + have hleadF : + F.leadingCoeff = algebraMap K L (Q.leadingCoeff : K) := by + rw [Polynomial.leadingCoeff_map_of_injective (algebraMap K L).injective] + change algebraMap K L ((Q.map V.subtype).leadingCoeff) = _ + rw [Polynomial.leadingCoeff_map_of_injective V.subtype_injective] + rfl + have hcoeffFactor (j : ℕ) : + algebraMap K L (Q.coeff j : K) = + algebraMap K L (Q.leadingCoeff : K) * + ((roots.map (fun x => + Polynomial.X - Polynomial.C x)).prod).coeff j := by + have hcoeffSplit := congrArg (fun q : Polynomial L => q.coeff j) + hsplit.eq_prod_roots + simp only [Polynomial.coeff_C_mul] at hcoeffSplit + rw [hleadF] at hcoeffSplit + simpa [roots, F, p, Polynomial.coeff_map, halgVK] using hcoeffSplit + let t : W.ValueGroup := W.valuation α + have hroots : ∀ β ∈ roots, W.valuation β = t := by + intro β hβ + exact hall β hβ + have hconstFactor : + W.valuation (algebraMap K L (Q.coeff 0 : K)) = + W.valuation (algebraMap K L (Q.leadingCoeff : K)) * + t ^ roots.card := by + calc + W.valuation (algebraMap K L (Q.coeff 0 : K)) = + W.valuation (F.coeff 0) := by + simp [F, p, Polynomial.coeff_map] + _ = W.valuation + (((-1) ^ F.natDegree) * F.leadingCoeff * roots.prod) := by + rw [hsplit.coeff_zero_eq_leadingCoeff_mul_prod_roots] + _ = W.valuation (algebraMap K L (Q.leadingCoeff : K)) * + W.valuation roots.prod := by + rw [W.valuation.map_mul, W.valuation.map_mul] + rw [hleadF] + simp + _ = W.valuation (algebraMap K L (Q.leadingCoeff : K)) * + t ^ roots.card := by + rw [DiscreteValuationField.valuation_multiset_prod_eq_pow_card_of_eq + W.valuation t roots hroots] + have ht : 1 < t := by + by_contra hnot + have htle : t ≤ 1 := not_lt.mp hnot + have hpow : t ^ roots.card ≤ 1 := pow_le_one₀ (bot_le : 0 ≤ t) htle + have hlt : + W.valuation (algebraMap K L (Q.leadingCoeff : K)) * + t ^ roots.card < 1 := by + exact mul_lt_one_of_lt_of_le hleadTarget hpow + rw [← hconstFactor, hconstTarget] at hlt + exact lt_irrefl 1 hlt + have hleadTargetPos : + 0 < W.valuation (algebraMap K L (Q.leadingCoeff : K)) := by + apply (Valuation.pos_iff W.valuation).2 + intro hzero + have hzeroK : (Q.leadingCoeff : K) = 0 := by + apply (algebraMap K L).injective + simpa using hzero + have hzeroV : Q.leadingCoeff = 0 := V.subtype_injective hzeroK + exact Q.leadingCoeff_ne_zero.mpr hQprim.ne_zero hzeroV + have hpositiveCoeff (j : ℕ) (hj : 0 < j) : + V.valuation (Q.coeff j : K) < 1 := by + have hprod := + valuation_coeff_prod_X_sub_C_lt_coeff_zero_of_one_lt + W.valuation roots (fun β hβ => by rw [hroots β hβ]; exact ht) j hj + have htarget : + W.valuation (algebraMap K L (Q.coeff j : K)) < + W.valuation (algebraMap K L (Q.coeff 0 : K)) := by + rw [hcoeffFactor j, hcoeffFactor 0, + W.valuation.map_mul, W.valuation.map_mul] + exact mul_lt_mul_of_pos_left hprod hleadTargetPos + have htargetOne : + W.valuation (algebraMap K L (Q.coeff j : K)) < 1 := by + rwa [hconstTarget] at htarget + exact + (Valuation.HasExtension.val_map_lt_one_iff + V.valuation W.valuation (Q.coeff j : K)).mp htargetOne + apply Polynomial.eq_C_coeff_zero_iff_natDegree_eq_zero.mp + ext j + cases j with + | zero => simp + | succ j => + rw [Polynomial.coeff_map] + simp only [Polynomial.coeff_C, Nat.succ_ne_zero, ite_false] + exact (IsLocalRing.residue_eq_zero_iff (Q.coeff (j + 1))).2 + ((V.valuation_lt_one_iff (Q.coeff (j + 1))).mpr + (hpositiveCoeff (j + 1) (Nat.succ_pos j))) + +/-- The primitive-irreducible reduction property in the last paragraph of +the proof of the unique-extension criterion, obtained directly from unique extension valuation +rings on algebraic fields. -/ +theorem primitiveIrreducibleReductionProperty_of_unique_algebraic_extensions + {K : Type u} [Field K] (V : ValuationSubring K) + (hunique : ∀ (E : Type u) [Field E] [Algebra K E] + [Algebra.IsAlgebraic K E], + ∃! W : ValuationSubring E, + V.valuation.HasExtension W.valuation) : + DiscreteValuationField.PrimitiveIrreducibleReductionProperty V := by + intro Q hQprim hQirr + let qbar : Polynomial (IsLocalRing.ResidueField V) := + Q.map (IsLocalRing.residue V) + have hqbar0 : qbar ≠ 0 := by + exact DiscreteValuationField.polynomial_residue_ne_zero_of_isPrimitive + V hQprim + by_cases hlead : IsUnit Q.leadingCoeff + · have hdegree : qbar.natDegree = Q.natDegree := by + exact Polynomial.natDegree_map_eq_of_isUnit_leadingCoeff + (IsLocalRing.residue V) hlead + refine ⟨Or.inr hdegree, ?_⟩ + intro a b hfactor hcoprime + let u : Vˣ := hlead.unit + let F : Polynomial V := Polynomial.C ((u⁻¹ : Vˣ) : V) * Q + have hu : (u : V) = Q.leadingCoeff := hlead.unit_spec + have hFmonic : F.Monic := by + apply Polynomial.monic_C_mul_of_mul_leadingCoeff_eq_one + change (((u⁻¹ : Vˣ) : V) * Q.leadingCoeff) = 1 + rw [← hu] + simp + have hscalarUnitK : IsUnit (((u⁻¹ : Vˣ) : V) : K) := by + exact isUnit_iff_ne_zero.mpr + (V.subtype_injective.ne (Units.ne_zero (u⁻¹ : Vˣ))) + have hCunitK : + IsUnit (Polynomial.C (((u⁻¹ : Vˣ) : V) : K)) := + Polynomial.isUnit_C.mpr hscalarUnitK + have hFmap : + F.map V.subtype = + Polynomial.C (((u⁻¹ : Vˣ) : V) : K) * Q.map V.subtype := by + dsimp [F] + rw [Polynomial.map_mul, Polynomial.map_C] + rfl + have hFirr : Irreducible (F.map V.subtype) := by + have hassoc : Associated (F.map V.subtype) (Q.map V.subtype) := by + rw [hFmap] + exact associated_unit_mul_left _ _ hCunitK + exact hassoc.symm.irreducible hQirr + let c : IsLocalRing.ResidueField V := + IsLocalRing.residue V (((u⁻¹ : Vˣ) : V)) + have hcunit : IsUnit c := + (IsLocalRing.residue V).isUnit_map (Units.isUnit (u⁻¹ : Vˣ)) + have hCunit : IsUnit (Polynomial.C c) := + Polynomial.isUnit_C.mpr hcunit + let a' : Polynomial (IsLocalRing.ResidueField V) := Polynomial.C c * a + have hfactor' : F.map (IsLocalRing.residue V) = a' * b := by + dsimp [F, a', c] + rw [Polynomial.map_mul, Polynomial.map_C, hfactor] + ring + have hcoprime' : IsCoprime a' b := by + exact (isCoprime_mul_unit_left_left hCunit a b).2 hcoprime + let E : Type u := (F.map V.subtype).SplittingField + obtain ⟨W, hW, hWuniq⟩ := hunique E + let : V.valuation.HasExtension W.valuation := hW + have hdegrees : a'.natDegree = 0 ∨ b.natDegree = 0 := + irreducible_monic_reduction_coprime_factor_degree_zero + V W hWuniq F hFmonic hFirr a' b hfactor' hcoprime' + have hab0 : a ≠ 0 ∧ b ≠ 0 := by + have hab : a * b ≠ 0 := by + rw [← hfactor] + exact hqbar0 + exact ⟨left_ne_zero_of_mul hab, right_ne_zero_of_mul hab⟩ + have ha'degree : a'.natDegree = a.natDegree := by + dsimp [a'] + rw [Polynomial.natDegree_mul (Polynomial.isUnit_C.mpr hcunit).ne_zero hab0.1, + Polynomial.natDegree_C, Nat.zero_add] + rcases hdegrees with ha' | hb + · exact Or.inl (ha'degree.symm.trans ha') + · exact Or.inr hb + · let E : Type u := (Q.map V.subtype).SplittingField + obtain ⟨W, hW, hWuniq⟩ := hunique E + have hdegree : qbar.natDegree = 0 := + primitive_irreducible_reduction_natDegree_zero_of_leadingCoeff_nonunit + V W hW hWuniq Q hQprim hQirr hlead + refine ⟨Or.inl hdegree, ?_⟩ + intro a b hfactor _hcoprime + have hab : a * b ≠ 0 := by + rw [← hfactor] + exact hqbar0 + have hmulDegree := + Polynomial.natDegree_mul (left_ne_zero_of_mul hab) (right_ne_zero_of_mul hab) + have hsum : a.natDegree + b.natDegree = 0 := by + rw [← hmulDegree, ← hfactor, hdegree] + exact Or.inl (Nat.eq_zero_of_add_eq_zero_right hsum) + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionReduction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionReduction.lean new file mode 100644 index 0000000000..8b65d1edf6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionReduction.lean @@ -0,0 +1,539 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.UniqueRing +public import Mathlib.RingTheory.Polynomial.GaussLemma +/-! +# reduction of irreducible factors + +This file develops the Galois/residue input in the converse direction. A +monic polynomial over the base valuation ring whose roots lie in a splitting +field in fact splits over every extension valuation ring: its roots are +integral over the base and hence belong to that ring. +-/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + integralClosure_mem_valuationSubring_of_hasExtension → + integralClosure_mem_valuationSubring_of_hasExtension + + +noncomputable +section + +open Polynomial +open UniqueFactorizationMonoid + +namespace AlgebraicNumberTheory +namespace Valuations + +open ValuationTheory.Valuations + +universe u + + +/-- A monic polynomial over the base valuation ring that splits in the +extension field already splits over any extension valuation ring. -/ +theorem monic_splits_in_extension_valuationSubring + {K L : Type*} [Field K] [Field L] [Algebra K L] + (V : ValuationSubring K) (W : ValuationSubring L) + [hW : V.valuation.HasExtension W.valuation] + (F : Polynomial V) (hFmonic : F.Monic) + (hsplit : (F.map ((algebraMap K L).comp V.subtype)).Splits) : + (F.map (valuationSubringMapOfHasExtension V W hW)).Splits := by + let ιVW : V →+* W := valuationSubringMapOfHasExtension V W hW + let FW : Polynomial W := F.map ιVW + have hmap : FW.map W.subtype = + F.map ((algebraMap K L).comp V.subtype) := by + ext i + simp only [FW, Polynomial.coeff_map, Function.comp_apply, + RingHom.coe_comp, ιVW] + rfl + have hsplit_map : (FW.map W.subtype).Splits := by + rw [hmap] + exact hsplit + apply Polynomial.Splits.of_splits_map_of_injective W.subtype_injective hsplit_map + intro α hα + have hαroot : (F.map ((algebraMap K L).comp V.subtype)).eval α = 0 := by + rw [← hmap] + exact (Polynomial.mem_roots + ((Polynomial.map_ne_zero_iff W.subtype_injective).2 + (hFmonic.map ιVW).ne_zero)).1 hα + have hαint : IsIntegral V α := by + refine ⟨F, hFmonic, ?_⟩ + have hVL : (algebraMap V L) = + (algebraMap K L).comp V.subtype := by + ext x + rfl + rw [hVL] + rw [Polynomial.eval_map] at hαroot + exact hαroot + have hαmem : α ∈ W := by + have hαint' : IsIntegral V.valuation.valuationSubring α := by + rw [ValuationSubring.valuationSubring_valuation] + exact hαint + have hz : α ∈ W.valuation.valuationSubring := + integralClosure_mem_valuationSubring_of_hasExtension + (L := L) V.valuation W.valuation ⟨α, hαint'⟩ + simpa [ValuationSubring.valuationSubring_valuation] using hz + exact ⟨⟨α, hαmem⟩, rfl⟩ + +/-- A monic polynomial over a valuation ring is a product of monic factors +whose images in the fraction field are irreducible. Integrally closedness of +the valuation ring is what brings the normalized fraction-field factors back +to the valuation ring. -/ +theorem monic_eq_prod_monic_irreducible_map_factors + {K : Type*} [Field K] (V : ValuationSubring K) + (f : Polynomial V) (hf : f.Monic) : + ∃ factors : Multiset (Polynomial V), + (∀ Q ∈ factors, Q.Monic ∧ Irreducible (Q.map V.subtype)) ∧ + factors.prod = f := by + classical + let fk : Polynomial K := f.map V.subtype + let S : Multiset (Polynomial K) := normalizedFactors fk + have hfk : fk.Monic := hf.map V.subtype + have hlift : ∀ q : Polynomial K, q ∈ S → + ∃ Q : Polynomial V, Q.Monic ∧ Q.map V.subtype = q := by + intro q hq + have hqdata := (Polynomial.mem_normalizedFactors_iff hfk.ne_zero).1 hq + obtain ⟨Q, hQ⟩ := IsIntegrallyClosed.eq_map_mul_C_of_dvd + (K := K) hf hqdata.2.2 + have hAlgebraMap : algebraMap V K = V.subtype := by + ext x + exact V.algebraMap_apply x + have hQmap : Q.map V.subtype = q := by + simpa [hAlgebraMap, hqdata.2.1] using hQ + have hQmonic : Q.Monic := by + apply (V.subtype_injective.monic_map_iff).2 + rw [hQmap] + exact hqdata.2.1 + exact ⟨Q, hQmonic, hQmap⟩ + choose lift hlift_monic hlift_map using hlift + let factors : Multiset (Polynomial V) := + S.attach.map (fun q => lift q.1 q.2) + have hfactors : ∀ Q ∈ factors, + Q.Monic ∧ Irreducible (Q.map V.subtype) := by + intro Q hQ + rcases Multiset.mem_map.mp hQ with ⟨q, hq, rfl⟩ + have hqmem : q.1 ∈ S := q.2 + refine ⟨hlift_monic q.1 hqmem, ?_⟩ + rw [hlift_map q.1 hqmem] + exact (Polynomial.mem_normalizedFactors_iff hfk.ne_zero).1 hqmem |>.1 + have hmapFactors : factors.map (Polynomial.map V.subtype) = S := by + simp [factors, hlift_map] + have hSprod : S.prod = fk := by + have hprod := Polynomial.leadingCoeff_mul_prod_normalizedFactors fk + simpa [S, hfk.leadingCoeff] using hprod + refine ⟨factors, hfactors, ?_⟩ + apply Polynomial.map_injective V.subtype V.subtype_injective + rw [Polynomial.map_multiset_prod, hmapFactors, hSprod] + +/-- The canonical residue-field map sends the residue of a base-ring element +to the residue of its image in the extension valuation ring. -/ +theorem residueFieldMapOfHasExtension_residue + {K L : Type*} [Field K] [Field L] [Algebra K L] + (V : ValuationSubring K) (W : ValuationSubring L) + (hW : V.valuation.HasExtension W.valuation) (x : V) : + residueFieldMapOfHasExtension V W hW (IsLocalRing.residue V x) = + IsLocalRing.residue W (valuationSubringMapOfHasExtension V W hW x) := by + let : IsLocalHom (valuationSubringMapOfHasExtension V W hW) := + valuationSubringMapOfHasExtension_isLocalHom V W hW + exact IsLocalRing.ResidueField.map_residue + (valuationSubringMapOfHasExtension V W hW) x + +/-- Reducing a monic split polynomial along an extension valuation ring gives +a split polynomial over the extension residue field. -/ +theorem monic_reduction_splits_in_extension_residueField + {K L : Type*} [Field K] [Field L] [Algebra K L] + (V : ValuationSubring K) (W : ValuationSubring L) + [hW : V.valuation.HasExtension W.valuation] + (F : Polynomial V) (hFmonic : F.Monic) + (hsplit : (F.map ((algebraMap K L).comp V.subtype)).Splits) : + ((F.map (IsLocalRing.residue V)).map + (residueFieldMapOfHasExtension V W hW)).Splits := by + have hsplitW : + (F.map (valuationSubringMapOfHasExtension V W hW)).Splits := + monic_splits_in_extension_valuationSubring V W F hFmonic hsplit + have hsplitResidue := hsplitW.map (IsLocalRing.residue W) + have hpoly : + (F.map (IsLocalRing.residue V)).map + (residueFieldMapOfHasExtension V W hW) = + (F.map (valuationSubringMapOfHasExtension V W hW)).map + (IsLocalRing.residue W) := by + ext i + simp only [Polynomial.coeff_map] + exact residueFieldMapOfHasExtension_residue V W hW (F.coeff i) + rw [hpoly] + exact hsplitResidue + +/-- In a normal extension with a unique extension valuation ring, reductions +of two roots of one irreducible ground-field polynomial are conjugate under +the induced residue-field automorphism. -/ +theorem residues_of_irreducible_roots_are_conjugate + {K L : Type*} [Field K] [Field L] [Algebra K L] [Normal K L] + (V : ValuationSubring K) (W : ValuationSubring L) + (hW : V.valuation.HasExtension W.valuation) + (huniq : ∀ W' : ValuationSubring L, + V.valuation.HasExtension W'.valuation → W' = W) + (F : Polynomial V) + (hirr : Irreducible (F.map V.subtype)) + {a b : W} + (ha : (F.map (valuationSubringMapOfHasExtension V W hW)).eval a = 0) + (hb : (F.map (valuationSubringMapOfHasExtension V W hW)).eval b = 0) : + ∃ σ : L ≃ₐ[K] L, + residueFieldEquivOfUniqueExtension V W hW huniq σ + (IsLocalRing.residue W b) = + IsLocalRing.residue W a := by + let p : Polynomial K := F.map V.subtype + let ιVW : V →+* W := valuationSubringMapOfHasExtension V W hW + have hmap : + (F.map ιVW).map W.subtype = + p.map (algebraMap K L) := by + ext i + simp only [Polynomial.coeff_map, p, ιVW] + rfl + have haL : (p.map (algebraMap K L)).eval (a : L) = 0 := by + rw [← hmap] + rw [Polynomial.eval_map] + change Polynomial.eval₂ W.subtype (W.subtype a) (F.map ιVW) = 0 + rw [Polynomial.eval₂_hom] + exact congrArg W.subtype ha + have hbL : (p.map (algebraMap K L)).eval (b : L) = 0 := by + rw [← hmap] + rw [Polynomial.eval_map] + change Polynomial.eval₂ W.subtype (W.subtype b) (F.map ιVW) = 0 + rw [Polynomial.eval₂_hom] + exact congrArg W.subtype hb + have haeval : (aeval (a : L)) p = 0 := by + simpa [aeval_def, Polynomial.eval_map] using haL + have hbeval : (aeval (b : L)) p = 0 := by + simpa [aeval_def, Polynomial.eval_map] using hbL + have hmin : minpoly K (a : L) = minpoly K (b : L) := by + rw [← minpoly.eq_of_irreducible hirr haeval, + ← minpoly.eq_of_irreducible hirr hbeval] + obtain ⟨σ, hσ⟩ := (Normal.minpoly_eq_iff_mem_orbit L).1 hmin + refine ⟨σ, ?_⟩ + rw [residueFieldEquivOfUniqueExtension_residue] + congr 1 + ext + exact hσ + +/-- A monic irreducible factor over the ground field cannot acquire two +coprime positive-degree factors after reduction when the extension valuation +ring on its splitting field is unique. This is the precise primary-reduction +input used in the proof of the unique-extension criterion. -/ +theorem irreducible_monic_reduction_coprime_factor_degree_zero + {K L : Type*} [Field K] [Field L] [Algebra K L] + (V : ValuationSubring K) (W : ValuationSubring L) + [hW : V.valuation.HasExtension W.valuation] + (huniq : ∀ W' : ValuationSubring L, + V.valuation.HasExtension W'.valuation → W' = W) + (F : Polynomial V) (hFmonic : F.Monic) + (hirr : Irreducible (F.map V.subtype)) + [IsSplittingField K L (F.map V.subtype)] + (gbar hbar : Polynomial (IsLocalRing.ResidueField V)) + (hfactor : F.map (IsLocalRing.residue V) = gbar * hbar) + (hcoprime : IsCoprime gbar hbar) : + gbar.natDegree = 0 ∨ hbar.natDegree = 0 := by + let : Normal K L := Normal.of_isSplittingField (F.map V.subtype) + by_contra hdegrees + push Not at hdegrees + have hgpos : 0 < gbar.natDegree := Nat.pos_of_ne_zero hdegrees.1 + have hhpos : 0 < hbar.natDegree := Nat.pos_of_ne_zero hdegrees.2 + let k := IsLocalRing.ResidueField V + let l := IsLocalRing.ResidueField W + let φ : k →+* l := residueFieldMapOfHasExtension V W hW + let Fbar : Polynomial k := F.map (IsLocalRing.residue V) + let FW : Polynomial W := F.map (valuationSubringMapOfHasExtension V W hW) + have hsplitL : + (F.map ((algebraMap K L).comp V.subtype)).Splits := by + have hs := IsSplittingField.splits L (F.map V.subtype) + simpa [Polynomial.map_map] using hs + have hsplitW : FW.Splits := by + exact monic_splits_in_extension_valuationSubring V W F hFmonic hsplitL + have hpolyResidue : + Fbar.map φ = FW.map (IsLocalRing.residue W) := by + ext i + simp only [Fbar, FW, Polynomial.coeff_map, φ] + exact residueFieldMapOfHasExtension_residue V W hW (F.coeff i) + have hsplitBar : (Fbar.map φ).Splits := by + rw [hpolyResidue] + exact hsplitW.map (IsLocalRing.residue W) + have hFbar0 : Fbar.map φ ≠ 0 := + (hFmonic.map (IsLocalRing.residue V)).map φ |>.ne_zero + have hfactorMap : Fbar.map φ = gbar.map φ * hbar.map φ := by + rw [← Polynomial.map_mul, ← hfactor] + have hgSplit : (gbar.map φ).Splits := + hsplitBar.of_dvd hFbar0 (by + rw [hfactorMap] + exact dvd_mul_right _ _) + have hhSplit : (hbar.map φ).Splits := + hsplitBar.of_dvd hFbar0 (by + rw [hfactorMap] + exact dvd_mul_left _ _) + have hgRootsNe : (gbar.map φ).roots ≠ 0 := by + intro hz + have hc := hgSplit.natDegree_eq_card_roots + rw [hz] at hc + have : gbar.natDegree = 0 := by + simpa [Polynomial.natDegree_map] using hc + exact hdegrees.1 this + have hhRootsNe : (hbar.map φ).roots ≠ 0 := by + intro hz + have hc := hhSplit.natDegree_eq_card_roots + rw [hz] at hc + have : hbar.natDegree = 0 := by + simpa [Polynomial.natDegree_map] using hc + exact hdegrees.2 this + obtain ⟨γ, hγg⟩ := Multiset.exists_mem_of_ne_zero hgRootsNe + obtain ⟨δ, hδh⟩ := Multiset.exists_mem_of_ne_zero hhRootsNe + have hprod0 : gbar.map φ * hbar.map φ ≠ 0 := by + rw [← hfactorMap] + exact hFbar0 + have hg0 : gbar.map φ ≠ 0 := left_ne_zero_of_mul hprod0 + have hh0 : hbar.map φ ≠ 0 := right_ne_zero_of_mul hprod0 + have hγF : γ ∈ (Fbar.map φ).roots := by + rw [hfactorMap, Polynomial.roots_mul hprod0] + simp [hγg] + have hδF : δ ∈ (Fbar.map φ).roots := by + rw [hfactorMap, Polynomial.roots_mul hprod0] + simp [hδh] + have hγFW : γ ∈ (FW.map (IsLocalRing.residue W)).roots := by + rwa [← hpolyResidue] + have hδFW : δ ∈ (FW.map (IsLocalRing.residue W)).roots := by + rwa [← hpolyResidue] + have hrootsMap : + FW.roots.map (IsLocalRing.residue W) = + (FW.map (IsLocalRing.residue W)).roots := + (hFmonic.map (valuationSubringMapOfHasExtension V W hW)).roots_map_of_card_eq_natDegree + (IsLocalRing.residue W) hsplitW.natDegree_eq_card_roots.symm + rw [← hrootsMap] at hγFW hδFW + obtain ⟨a, haRoot, haResidue⟩ := Multiset.mem_map.mp hγFW + obtain ⟨b, hbRoot, hbResidue⟩ := Multiset.mem_map.mp hδFW + have haEval : FW.eval a = 0 := + (Polynomial.mem_roots (hFmonic.map + (valuationSubringMapOfHasExtension V W hW)).ne_zero).1 haRoot + have hbEval : FW.eval b = 0 := + (Polynomial.mem_roots (hFmonic.map + (valuationSubringMapOfHasExtension V W hW)).ne_zero).1 hbRoot + obtain ⟨σ, hσres⟩ := + residues_of_irreducible_roots_are_conjugate V W hW huniq F hirr hbEval haEval + let τ : l ≃+* l := residueFieldEquivOfUniqueExtension V W hW huniq σ + have hτγδ : τ γ = δ := by + dsimp [τ] + rw [← haResidue, ← hbResidue] + exact hσres + have hτcoeff : (gbar.map φ).map τ.toRingHom = gbar.map φ := by + ext i + simp only [Polynomial.coeff_map, φ, τ] + exact residueFieldEquivOfUniqueExtension_algebraMap + V W huniq σ (gbar.coeff i) + have hγeval : (gbar.map φ).eval γ = 0 := + (Polynomial.mem_roots hg0).1 hγg + have hδg : (gbar.map φ).eval δ = 0 := by + calc + (gbar.map φ).eval δ = (gbar.map φ).eval (τ γ) := by rw [hτγδ] + _ = ((gbar.map φ).map τ.toRingHom).eval (τ γ) := by rw [hτcoeff] + _ = τ ((gbar.map φ).eval γ) := by + change ((gbar.map φ).map τ.toRingHom).eval (τ.toRingHom γ) = _ + exact Polynomial.eval_map_apply (p := gbar.map φ) (f := τ.toRingHom) γ + _ = 0 := by rw [hγeval, map_zero] + have hδeval : (hbar.map φ).eval δ = 0 := + (Polynomial.mem_roots hh0).1 hδh + have hcoprimeMap : IsCoprime (gbar.map φ) (hbar.map φ) := by + simpa using hcoprime.map (Polynomial.mapRingHom φ) + rcases hcoprimeMap with ⟨A, B, hbez⟩ + have hbezEval := congrArg (Polynomial.eval δ) hbez + simp [hδg, hδeval] at hbezEval + +/-- A reduced monic irreducible factor divides exactly one side of any +coprime residual product that it divides. -/ +theorem irreducible_monic_reduction_dvd_left_or_right_of_coprime + {K L : Type*} [Field K] [Field L] [Algebra K L] + (V : ValuationSubring K) (W : ValuationSubring L) + [hW : V.valuation.HasExtension W.valuation] + (huniq : ∀ W' : ValuationSubring L, + V.valuation.HasExtension W'.valuation → W' = W) + (Q : Polynomial V) (hQmonic : Q.Monic) + (hQirr : Irreducible (Q.map V.subtype)) + [IsSplittingField K L (Q.map V.subtype)] + (gbar hbar : Polynomial (IsLocalRing.ResidueField V)) + (hcoprime : IsCoprime gbar hbar) + (hQdvd : Q.map (IsLocalRing.residue V) ∣ gbar * hbar) : + Q.map (IsLocalRing.residue V) ∣ gbar ∨ + Q.map (IsLocalRing.residue V) ∣ hbar := by + obtain ⟨q₁, q₂, hq₁g, hq₂h, hQfactor⟩ := + exists_dvd_and_dvd_of_dvd_mul hQdvd + have hqcoprime : IsCoprime q₁ q₂ := by + rcases hcoprime with ⟨A, B, hbez⟩ + obtain ⟨g', hg'⟩ := hq₁g + obtain ⟨h', hh'⟩ := hq₂h + refine ⟨A * g', B * h', ?_⟩ + calc + (A * g') * q₁ + (B * h') * q₂ = + A * (q₁ * g') + B * (q₂ * h') := by ring + _ = A * gbar + B * hbar := by rw [← hg', ← hh'] + _ = 1 := hbez + have hdegrees := + irreducible_monic_reduction_coprime_factor_degree_zero + V W huniq Q hQmonic hQirr q₁ q₂ hQfactor hqcoprime + have hQbar0 : Q.map (IsLocalRing.residue V) ≠ 0 := + (hQmonic.map (IsLocalRing.residue V)).ne_zero + have hqprod0 : q₁ * q₂ ≠ 0 := by + rw [← hQfactor] + exact hQbar0 + have hq₁0 : q₁ ≠ 0 := left_ne_zero_of_mul hqprod0 + have hq₂0 : q₂ ≠ 0 := right_ne_zero_of_mul hqprod0 + rcases hdegrees with hq₁deg | hq₂deg + · right + have hq₁unit : IsUnit q₁ := by + rw [Polynomial.isUnit_iff_degree_eq_zero, + Polynomial.degree_eq_natDegree hq₁0, hq₁deg] + rfl + have hassoc : Associated (q₁ * q₂) q₂ := by + exact associated_unit_mul_left q₂ q₁ hq₁unit + rw [hQfactor] + exact hassoc.dvd_iff_dvd_left.mpr hq₂h + · left + have hq₂unit : IsUnit q₂ := by + rw [Polynomial.isUnit_iff_degree_eq_zero, + Polynomial.degree_eq_natDegree hq₂0, hq₂deg] + rfl + have hassoc : Associated (q₁ * q₂) q₁ := by + exact associated_mul_unit_left q₁ q₂ hq₂unit + rw [hQfactor] + exact hassoc.dvd_iff_dvd_left.mpr hq₁g + +/-- Partition a multiset of monic irreducible ground-field factors according +to a coprime factorization of the product of their reductions. Unique +extendability supplies the all-or-nothing divisibility of each individual +reduced factor. -/ +theorem partition_monic_irreducible_factors_along_coprime_reduction + {K : Type u} [Field K] (V : ValuationSubring K) + (hunique : ∀ (E : Type u) [Field E] [Algebra K E] + [Algebra.IsAlgebraic K E], + ∃! W : ValuationSubring E, + V.valuation.HasExtension W.valuation) + (factors : Multiset (Polynomial V)) + (hfactors : ∀ Q ∈ factors, + Q.Monic ∧ Irreducible (Q.map V.subtype)) + (gbar hbar : Polynomial (IsLocalRing.ResidueField V)) + (hgmonic : gbar.Monic) (hhmonic : hbar.Monic) + (hproduct : + (factors.map (fun Q => Q.map (IsLocalRing.residue V))).prod = + gbar * hbar) + (hcoprime : IsCoprime gbar hbar) : + ∃ G H : Polynomial V, + G.Monic ∧ H.Monic ∧ factors.prod = G * H ∧ + G.map (IsLocalRing.residue V) = gbar ∧ + H.map (IsLocalRing.residue V) = hbar := by + classical + induction factors using Multiset.induction_on generalizing gbar hbar with + | empty => + have hgh : gbar * hbar = 1 := by simpa using hproduct.symm + have hgunit : IsUnit gbar := + isUnit_iff_exists_inv'.2 ⟨hbar, by simpa [mul_comm] using hgh⟩ + have hhunit : IsUnit hbar := + isUnit_iff_exists_inv'.2 ⟨gbar, hgh⟩ + have hg : gbar = 1 := hgmonic.isUnit_iff.1 hgunit + have hh : hbar = 1 := hhmonic.isUnit_iff.1 hhunit + subst gbar + subst hbar + exact ⟨1, 1, Polynomial.monic_one, Polynomial.monic_one, by simp, by simp, by simp⟩ + | cons Q factors ih => + have hQdata : Q.Monic ∧ Irreducible (Q.map V.subtype) := + hfactors Q (by simp) + have htail : ∀ R ∈ factors, + R.Monic ∧ Irreducible (R.map V.subtype) := by + intro R hR + exact hfactors R (by simp [hR]) + let qbar : Polynomial (IsLocalRing.ResidueField V) := + Q.map (IsLocalRing.residue V) + have hQbarMonic : qbar.Monic := hQdata.1.map (IsLocalRing.residue V) + have hproduct' : + qbar * (factors.map + (fun R => R.map (IsLocalRing.residue V))).prod = gbar * hbar := by + simpa [qbar] using hproduct + have hQdvd : qbar ∣ gbar * hbar := by + rw [← hproduct'] + exact dvd_mul_right _ _ + let E : Type u := (Q.map V.subtype).SplittingField + obtain ⟨W, hW, hWuniq⟩ := hunique E + let : V.valuation.HasExtension W.valuation := hW + have hside : qbar ∣ gbar ∨ qbar ∣ hbar := + irreducible_monic_reduction_dvd_left_or_right_of_coprime + V W hWuniq Q hQdata.1 hQdata.2 gbar hbar hcoprime hQdvd + rcases hside with hQg | hQh + · obtain ⟨g', hg'⟩ := hQg + have hg'monic : g'.Monic := by + apply hQbarMonic.of_mul_monic_left + rw [← hg'] + exact hgmonic + have hg'coprime : IsCoprime g' hbar := by + rcases hcoprime with ⟨A, B, hbez⟩ + refine ⟨A * qbar, B, ?_⟩ + calc + (A * qbar) * g' + B * hbar = + A * (qbar * g') + B * hbar := by ring + _ = A * gbar + B * hbar := by rw [← hg'] + _ = 1 := hbez + have hrest : + (factors.map + (fun R => R.map (IsLocalRing.residue V))).prod = + g' * hbar := by + apply mul_left_cancel₀ hQbarMonic.ne_zero + calc + qbar * (factors.map + (fun R => R.map (IsLocalRing.residue V))).prod = + gbar * hbar := hproduct' + _ = (qbar * g') * hbar := by rw [← hg'] + _ = qbar * (g' * hbar) := by ring + obtain ⟨G, H, hGmonic, hHmonic, hfactorGH, hGbar, hHbar⟩ := + ih htail g' hbar hg'monic hhmonic hrest hg'coprime + refine ⟨Q * G, H, hQdata.1.mul hGmonic, hHmonic, ?_, ?_, hHbar⟩ + · simp only [Multiset.prod_cons, hfactorGH] + ring + · rw [Polynomial.map_mul, hGbar] + exact hg'.symm + · obtain ⟨h', hh'⟩ := hQh + have hh'monic : h'.Monic := by + apply hQbarMonic.of_mul_monic_left + rw [← hh'] + exact hhmonic + have hh'coprime : IsCoprime gbar h' := by + rcases hcoprime with ⟨A, B, hbez⟩ + refine ⟨A, B * qbar, ?_⟩ + calc + A * gbar + (B * qbar) * h' = + A * gbar + B * (qbar * h') := by ring + _ = A * gbar + B * hbar := by rw [← hh'] + _ = 1 := hbez + have hrest : + (factors.map + (fun R => R.map (IsLocalRing.residue V))).prod = + gbar * h' := by + apply mul_left_cancel₀ hQbarMonic.ne_zero + calc + qbar * (factors.map + (fun R => R.map (IsLocalRing.residue V))).prod = + gbar * hbar := hproduct' + _ = gbar * (qbar * h') := by rw [← hh'] + _ = qbar * (gbar * h') := by ring + obtain ⟨G, H, hGmonic, hHmonic, hfactorGH, hGbar, hHbar⟩ := + ih htail gbar h' hgmonic hh'monic hrest hh'coprime + refine ⟨G, Q * H, hGmonic, hQdata.1.mul hHmonic, ?_, hGbar, ?_⟩ + · simp only [Multiset.prod_cons, hfactorGH] + ring + · rw [Polynomial.map_mul, hHbar] + exact hh'.symm + +end Valuations +end AlgebraicNumberTheory + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean new file mode 100644 index 0000000000..a4ad5e68d2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean @@ -0,0 +1,231 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.NonmonicReduction +/-! +# the factor-lifting criterion + +Artin's monic coprime-factor lifting criterion implies the exact primitive +factorization form of Hensel's lemma from the primitive factorization definition. +-/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + exists_extension_valuationSubring_with_hasExtension → + exists_extension_valuationSubring_with_hasExtension + + +noncomputable +section + +open Polynomial + +namespace DiscreteValuationField +open ValuationTheory.DiscreteValuationField + +universe u + +/-- The unit-leading-coefficient branch of the factor-lifting criterion. Normalize the +ground-field irreducible polynomial to be monic, then normalize both residual +factors without changing their product or coprimality. -/ +theorem MonicResidualCoprimeFactorLifting.leadingCoeff_unit_branch + {K : Type u} [Field K] {V : ValuationSubring K} + (hlift : MonicResidualCoprimeFactorLifting V) + {Q : Polynomial V} (hQprim : Q.IsPrimitive) + (hQirr : Irreducible (Q.map V.subtype)) + (hlead : IsUnit Q.leadingCoeff) : + let qbar := Q.map (IsLocalRing.residue V) + qbar.natDegree = Q.natDegree ∧ + ∀ a b : Polynomial (IsLocalRing.ResidueField V), + qbar = a * b → IsCoprime a b → + a.natDegree = 0 ∨ b.natDegree = 0 := by + let qbar : Polynomial (IsLocalRing.ResidueField V) := + Q.map (IsLocalRing.residue V) + have hdegree : qbar.natDegree = Q.natDegree := + Polynomial.natDegree_map_eq_of_isUnit_leadingCoeff + (IsLocalRing.residue V) hlead + refine ⟨hdegree, ?_⟩ + intro a b hfactor hcoprime + let u : Vˣ := hlead.unit + let F : Polynomial V := Polynomial.C ((u⁻¹ : Vˣ) : V) * Q + have hu : (u : V) = Q.leadingCoeff := hlead.unit_spec + have hFmonic : F.Monic := by + apply Polynomial.monic_C_mul_of_mul_leadingCoeff_eq_one + change (((u⁻¹ : Vˣ) : V) * Q.leadingCoeff) = 1 + rw [← hu] + simp + have hscalarUnitK : IsUnit (((u⁻¹ : Vˣ) : V) : K) := by + exact isUnit_iff_ne_zero.mpr + (V.subtype_injective.ne (Units.ne_zero (u⁻¹ : Vˣ))) + have hCunitK : + IsUnit (Polynomial.C (((u⁻¹ : Vˣ) : V) : K)) := + Polynomial.isUnit_C.mpr hscalarUnitK + have hFmap : + F.map V.subtype = + Polynomial.C (((u⁻¹ : Vˣ) : V) : K) * Q.map V.subtype := by + dsimp [F] + rw [Polynomial.map_mul, Polynomial.map_C] + rfl + have hFirr : Irreducible (F.map V.subtype) := by + have hassoc : Associated (F.map V.subtype) (Q.map V.subtype) := by + rw [hFmap] + exact associated_unit_mul_left _ _ hCunitK + exact hassoc.symm.irreducible hQirr + let c : IsLocalRing.ResidueField V := + IsLocalRing.residue V (((u⁻¹ : Vˣ) : V)) + have hcunit : IsUnit c := + (IsLocalRing.residue V).isUnit_map (Units.isUnit (u⁻¹ : Vˣ)) + have hCunit : IsUnit (Polynomial.C c) := + Polynomial.isUnit_C.mpr hcunit + let a' : Polynomial (IsLocalRing.ResidueField V) := Polynomial.C c * a + have hfactor' : F.map (IsLocalRing.residue V) = a' * b := by + dsimp [F, a', c] + rw [Polynomial.map_mul, Polynomial.map_C, hfactor] + ring + have hcoprime' : IsCoprime a' b := + (isCoprime_mul_unit_left_left hCunit a b).2 hcoprime + have hqbar0 : qbar ≠ 0 := + residue_ne_zero_of_isPrimitive_valuationSubring V hQprim + have hab0 : a ≠ 0 ∧ b ≠ 0 := by + have hab : a * b ≠ 0 := by + rw [← hfactor] + exact hqbar0 + exact ⟨left_ne_zero_of_mul hab, right_ne_zero_of_mul hab⟩ + have ha'0 : a' ≠ 0 := by + dsimp [a'] + exact mul_ne_zero hCunit.ne_zero hab0.1 + have ha'lead0 : a'.leadingCoeff ≠ 0 := + Polynomial.leadingCoeff_ne_zero.mpr ha'0 + have hleadProduct : a'.leadingCoeff * b.leadingCoeff = 1 := by + have hproductMonic : (a' * b).Monic := by + rw [← hfactor'] + exact hFmonic.map (IsLocalRing.residue V) + simpa only [Polynomial.Monic, Polynomial.leadingCoeff_mul] using hproductMonic + let A : Polynomial (IsLocalRing.ResidueField V) := + Polynomial.C a'.leadingCoeff⁻¹ * a' + let B : Polynomial (IsLocalRing.ResidueField V) := + Polynomial.C a'.leadingCoeff * b + have hAmonic : A.Monic := by + dsimp [A] + apply Polynomial.monic_C_mul_of_mul_leadingCoeff_eq_one + exact inv_mul_cancel₀ ha'lead0 + have hBmonic : B.Monic := by + dsimp [B] + apply Polynomial.monic_C_mul_of_mul_leadingCoeff_eq_one + exact hleadProduct + have hfactorAB : F.map (IsLocalRing.residue V) = A * B := by + rw [hfactor'] + dsimp [A, B] + rw [show + (Polynomial.C a'.leadingCoeff⁻¹ * a') * + (Polynomial.C a'.leadingCoeff * b) = + (Polynomial.C a'.leadingCoeff⁻¹ * + Polynomial.C a'.leadingCoeff) * (a' * b) by ring] + rw [← Polynomial.C_mul, inv_mul_cancel₀ ha'lead0] + simp + have hCinvUnit : IsUnit (Polynomial.C a'.leadingCoeff⁻¹) := + Polynomial.isUnit_C.mpr + (isUnit_iff_ne_zero.mpr (inv_ne_zero ha'lead0)) + have hCleadUnit : IsUnit (Polynomial.C a'.leadingCoeff) := + Polynomial.isUnit_C.mpr (isUnit_iff_ne_zero.mpr ha'lead0) + have hcoprimeAB : IsCoprime A B := by + dsimp [A, B] + exact + (isCoprime_mul_units_left hCinvUnit hCleadUnit a' b).2 hcoprime' + have hdegrees : A.natDegree = 0 ∨ B.natDegree = 0 := + hlift.irreducible_monic_reduction_coprime_factor_degree_zero + hFmonic hFirr hAmonic hBmonic hfactorAB hcoprimeAB + have hAdegree : A.natDegree = a'.natDegree := by + dsimp [A] + rw [Polynomial.natDegree_mul hCinvUnit.ne_zero ha'0, + Polynomial.natDegree_C, Nat.zero_add] + have hBdegree : B.natDegree = b.natDegree := by + dsimp [B] + rw [Polynomial.natDegree_mul hCleadUnit.ne_zero hab0.2, + Polynomial.natDegree_C, Nat.zero_add] + have ha'degree : a'.natDegree = a.natDegree := by + dsimp [a'] + rw [Polynomial.natDegree_mul hCunit.ne_zero hab0.1, + Polynomial.natDegree_C, Nat.zero_add] + exact hdegrees.elim + (fun hA ↦ Or.inl (ha'degree.symm.trans (hAdegree.symm.trans hA))) + (fun hB ↦ Or.inr (hBdegree.symm.trans hB)) + +open AlgebraicNumberTheory.Valuations renaming + primitive_irreducible_reduction_natDegree_zero_of_leadingCoeff_nonunit_of_roots_eq → + primitive_reduction_natDegree_zero_of_roots_eq in +/-- the factor-lifting criterion's irreducible-factor input. Exact monic lifting forces a +primitive irreducible polynomial to have either full-degree or constant +reduction, and the reduction has no coprime splitting into two nonconstant +factors. -/ +theorem primitiveIrreducibleReductionProperty_of_monicResidualCoprimeFactorLifting + {K : Type u} [Field K] (V : ValuationSubring K) + (hlift : MonicResidualCoprimeFactorLifting V) : + PrimitiveIrreducibleReductionProperty V := by + intro Q hQprim hQirr + let qbar : Polynomial (IsLocalRing.ResidueField V) := + Q.map (IsLocalRing.residue V) + have hqbar0 : qbar ≠ 0 := + residue_ne_zero_of_isPrimitive_valuationSubring V hQprim + by_cases hlead : IsUnit Q.leadingCoeff + · have hbranch := hlift.leadingCoeff_unit_branch hQprim hQirr hlead + exact ⟨Or.inr hbranch.1, hbranch.2⟩ + · let L : Type u := (Q.map V.subtype).SplittingField + obtain ⟨B, _hB, _hlocal, _hpullback, hExt⟩ := + exists_extension_valuationSubring_with_hasExtension + (L := L) V.valuation + let : V.valuation.HasExtension B.valuation := hExt + let : Normal K L := + Normal.of_isSplittingField (Q.map V.subtype) + have hsplit : + ((Q.map V.subtype).map (algebraMap K L)).Splits := + IsSplittingField.splits L (Q.map V.subtype) + have hrootsEq : ∀ {a b : L}, + a ∈ ((Q.map V.subtype).map (algebraMap K L)).roots → + b ∈ ((Q.map V.subtype).map (algebraMap K L)).roots → + B.valuation a = B.valuation b := by + intro a b ha hb + exact hlift.irreducible_roots_same_valuation B hQirr hsplit ha hb + have hdegree : qbar.natDegree = 0 := + primitive_reduction_natDegree_zero_of_roots_eq + V B Q hQprim hQirr hlead hrootsEq + refine ⟨Or.inl hdegree, ?_⟩ + intro a b hfactor _hcoprime + have hab : a * b ≠ 0 := by + rw [← hfactor] + exact hqbar0 + have hmulDegree := + Polynomial.natDegree_mul (left_ne_zero_of_mul hab) + (right_ne_zero_of_mul hab) + have hsum : a.natDegree + b.natDegree = 0 := by + rw [← hmulDegree, ← hfactor, hdegree] + exact Or.inl (Nat.eq_zero_of_add_eq_zero_right hsum) + +/-- the factor-lifting criterion: monic coprime-factor lifting is sufficient for +Hensel's lemma in the exact primitive factorization form of the primitive factorization + definition. -/ +theorem henselianValuationExtension + {K : Type u} [Field K] (V : ValuationSubring K) + (hlift : MonicResidualCoprimeFactorLifting V) : + HenselFactorizationProperty V := + henselFactorization_of_primitiveIrreducibleReductionProperty V + (primitiveIrreducibleReductionProperty_of_monicResidualCoprimeFactorLifting + V hlift) + +/-- Exact criterion form of the factor-lifting criterion. The reverse implication is the +monic specialization of the primitive factorization definition. -/ +theorem henselianValuationExtension_iff + {K : Type u} [Field K] (V : ValuationSubring K) : + MonicResidualCoprimeFactorLifting V ↔ HenselFactorizationProperty V := + ⟨henselianValuationExtension V, + monicResidualCoprimeFactorLifting_of_henselFactorization⟩ + +end DiscreteValuationField + +end diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/LocalRingEquiv.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/LocalRingEquiv.lean new file mode 100644 index 0000000000..37f1e4a095 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/LocalRingEquiv.lean @@ -0,0 +1,101 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.NumberTheory.RamificationInertia.Ramification +public import Mathlib.RingTheory.LocalRing.Basic +public import Mathlib.RingTheory.Valuation.Discrete.IsDiscreteValuationRing +/-! +# Local-ring equivalences and maximal ideals + +Equivalences of local rings preserve the maximal ideal and all of its powers. +The resulting membership criterion is useful when transporting principal-unit +filtrations between equivalent valuation rings. +-/ + +@[expose] public section + +namespace ValuationTheory + +/-- A local-ring equivalence maps the maximal ideal onto the maximal ideal. -/ +theorem ringEquiv_map_maximalIdeal + {R S : Type*} [CommRing R] [CommRing S] + [IsLocalRing R] [IsLocalRing S] (e : R ≃+* S) : + Ideal.map e.toRingHom (IsLocalRing.maximalIdeal R) = + IsLocalRing.maximalIdeal S := by + apply le_antisymm + · rw [Ideal.map_le_iff_le_comap] + intro x hx + change e x ∈ IsLocalRing.maximalIdeal S + rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] at hx ⊢ + intro h + have h' := h.map e.symm.toRingHom + exact hx (by simpa using h') + · intro y hy + obtain ⟨x, rfl⟩ := e.surjective y + apply Ideal.mem_map_of_mem + rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] at hy ⊢ + intro h + exact hy (h.map e.toRingHom) + +/-- A local-ring equivalence maps every power of the maximal ideal onto the +corresponding power. -/ +theorem ringEquiv_map_maximalIdeal_pow + {R S : Type*} [CommRing R] [CommRing S] + [IsLocalRing R] [IsLocalRing S] (e : R ≃+* S) (n : ℕ) : + Ideal.map e.toRingHom (IsLocalRing.maximalIdeal R ^ n) = + IsLocalRing.maximalIdeal S ^ n := by + rw [Ideal.map_pow, ringEquiv_map_maximalIdeal] + +/-- Membership in a maximal-ideal power is preserved by a local-ring +equivalence. -/ +theorem ringEquiv_mem_maximalIdeal_pow_iff + {R S : Type*} [CommRing R] [CommRing S] + [IsLocalRing R] [IsLocalRing S] (e : R ≃+* S) (n : ℕ) (x : R) : + e x ∈ IsLocalRing.maximalIdeal S ^ n ↔ + x ∈ IsLocalRing.maximalIdeal R ^ n := by + rw [← ringEquiv_map_maximalIdeal_pow e n] + constructor + · intro hx + rcases (Ideal.mem_map_iff_of_surjective e.toRingHom e.surjective).1 hx with + ⟨y, hy, hey⟩ + exact e.injective hey ▸ hy + · exact Ideal.mem_map_of_mem e.toRingHom + +/-- For an injective local map of discrete valuation rings, the image of the +maximal ideal is the power prescribed by the ramification index. -/ +theorem map_maximalIdeal_eq_pow_ramificationIdx + {R S : Type*} [CommRing R] [IsDomain R] + [CommRing S] [IsDomain S] + [IsDiscreteValuationRing R] [IsDiscreteValuationRing S] + [Algebra R S] + (hi : Function.Injective (algebraMap R S)) : + Ideal.map (algebraMap R S) (IsLocalRing.maximalIdeal R) = + IsLocalRing.maximalIdeal S ^ + Ideal.ramificationIdx' + (IsLocalRing.maximalIdeal R) (IsLocalRing.maximalIdeal S) := by + let q := IsLocalRing.maximalIdeal R + let Q := IsLocalRing.maximalIdeal S + have hq0 : q ≠ ⊥ := IsDiscreteValuationRing.not_a_field R + have hmap0 : Ideal.map (algebraMap R S) q ≠ ⊥ := + (Ideal.map_eq_bot_iff_of_injective hi).not.mpr hq0 + obtain ⟨pi, hpi⟩ := IsDiscreteValuationRing.exists_irreducible S + obtain ⟨n, hn⟩ := + IsDiscreteValuationRing.ideal_eq_span_pow_irreducible hmap0 hpi + have hmapPow : Ideal.map (algebraMap R S) q = Q ^ n := by + rw [hn, show Q = IsLocalRing.maximalIdeal S from rfl, + hpi.maximalIdeal_eq, Ideal.span_singleton_pow] + have hnot : ¬ Ideal.map (algebraMap R S) q ≤ Q ^ (n + 1) := by + rw [hmapPow] + exact not_le_of_gt (Ideal.pow_succ_lt_pow + (IsDiscreteValuationRing.not_a_field S) n) + have he : Ideal.ramificationIdx' q Q = n := + Ideal.ramificationIdx'_spec (by rw [hmapPow]) hnot + rw [he] + exact hmapPow + +end ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology.lean new file mode 100644 index 0000000000..c108ca5a5a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicCompletionInverseLimit +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicCompletionInverseLimitRing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicContractingFixedPoint +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.CompatibleInverseLimit +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.Models + +/-! Supporting modules for Local and global class field theory. -/ + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean new file mode 100644 index 0000000000..2d10bbfd85 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean @@ -0,0 +1,1722 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicCompletionInverseLimitRing +/-! +# Adic unit and higher-unit inverse limits + +This file contains the algebraic and topological projective-limit descriptions +of unit groups of adically complete rings and complete discrete valuation +rings. The underlying adic ring inverse-limit theory lives in +`AdicCompletionInverseLimitRing`. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate +namespace Valuations + +universe u v + +open ValuationTheory.DiscreteValuationField +open ValuationTheory.Valuations +open Filter Set Topology +open scoped Valued + +/-- The adic inverse-limit equivalence, unit form of the canonical adic-completion isomorphism. -/ +def adicCompletionUnitsEquiv + {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] : + Rˣ ≃* (AdicCompletion I R)ˣ := + Units.mapEquiv (adicCompletionAlgEquiv I).toRingEquiv.toMulEquiv + +/-- The unit isomorphism is induced by the canonical ring map into the adic +completion. -/ +theorem adicCompletionUnitsEquiv_apply + {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] (u : Rˣ) : + (adicCompletionUnitsEquiv I u : + AdicCompletion I R) = + adicCompletionAlgEquiv I (u : R) := + rfl + +/-- The adic inverse-limit equivalence, unit-coordinate injectivity: a unit of a complete ring is +determined by all of its finite reductions modulo `I ^ n`. -/ +theorem adicCompletion_units_coordinates_injective + {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] + {u v : Rˣ} + (h : ∀ n : ℕ, + unitReduction (I ^ n) u = unitReduction (I ^ n) v) : + u = v := by + apply Units.ext + apply adicCompletion_coordinates_injective I + intro n + exact congrArg Units.val (h n) + +/-- The adic inverse-limit equivalence, unit-coordinate surjectivity against the adic completion: +every unit in the adic completion is represented by a unit of the complete +ring, and the finite quotient coordinates agree. -/ +theorem adicCompletion_units_coordinates_surjective + {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] + (z : (AdicCompletion I R)ˣ) : + ∃ u : Rˣ, + adicCompletionUnitsEquiv I u = z ∧ + ∀ n : ℕ, + unitReduction (I ^ n) u = + Units.map (AdicCompletion.evalₐ I n).toMonoidHom z := by + refine ⟨(adicCompletionUnitsEquiv I).symm z, ?_, ?_⟩ + · simp + · intro n + ext + simp only [unitReduction, RingHom.toMonoidHom_eq_coe, Units.coe_map, MonoidHom.coe_coe, + AlgHom.toRingHom_eq_coe, AlgHom.toRingHom_toMonoidHom] + have hval : + (((adicCompletionUnitsEquiv I).symm z : Rˣ) : R) = + (adicCompletionAlgEquiv I).symm + (z : AdicCompletion I R) := rfl + rw [hval] + simp [adicCompletionAlgEquiv] + +/-- The adic inverse-limit equivalence, finite unit quotient form: if reduction modulo `I` is a +local quotient map, then `Rˣ / ker(Rˣ → (R/I)ˣ)` is `(R/I)ˣ`. For valuation +rings and `I = 𝔭^n`, this is the finite stage of +`𝒪ˣ ≅ lim 𝒪ˣ/U⁽ⁿ⁾`. -/ +noncomputable def unitsModIdealEquivQuotientUnits + {R : Type*} [CommRing R] (I : Ideal R) + [IsLocalHom (Ideal.Quotient.mk I)] : + Rˣ ⧸ (unitReduction I).ker ≃* (R ⧸ I)ˣ := + QuotientGroup.quotientKerEquivOfSurjective (unitReduction I) + (unitReduction_surjective_of_isLocalHom I) + +/-- The finite unit quotient equivalence is induced by reduction. -/ +theorem unitsModIdealEquivQuotientUnits_mk + {R : Type*} [CommRing R] (I : Ideal R) + [IsLocalHom (Ideal.Quotient.mk I)] (u : Rˣ) : + unitsModIdealEquivQuotientUnits I (QuotientGroup.mk u) = + unitReduction I u := by + unfold unitsModIdealEquivQuotientUnits + QuotientGroup.quotientKerEquivOfSurjective + QuotientGroup.quotientKerEquivOfRightInverse + exact QuotientGroup.kerLift_mk (unitReduction I) u + +/-- In a local ring, reduction modulo a positive power of the maximal ideal is +a local quotient map. -/ +theorem isLocalHom_quotient_maximalIdeal_pow + {R : Type*} [CommRing R] [IsLocalRing R] + {n : ℕ} (hn : 1 ≤ n) : + IsLocalHom (Ideal.Quotient.mk ((IsLocalRing.maximalIdeal R) ^ n)) := by + have hn0 : n ≠ 0 := Nat.ne_of_gt (Nat.succ_le_iff.mp hn) + have hpow_le : + (IsLocalRing.maximalIdeal R) ^ n ≤ IsLocalRing.maximalIdeal R := + Ideal.pow_le_self hn0 + exact + isLocalHom_of_le_jacobson_bot + ((IsLocalRing.maximalIdeal R) ^ n) + (hpow_le.trans + (IsLocalRing.maximalIdeal_le_jacobson (⊥ : Ideal R))) + +/-- The adic inverse-limit equivalence, finite unit quotient form for the maximal-ideal +filtration of a local ring. -/ +noncomputable def unitsModMaximalIdealPowEquiv + {R : Type*} [CommRing R] [IsLocalRing R] + {n : ℕ} (hn : 1 ≤ n) : + Rˣ ⧸ (unitReduction ((IsLocalRing.maximalIdeal R) ^ n)).ker ≃* + (R ⧸ (IsLocalRing.maximalIdeal R) ^ n)ˣ := by + letI : IsLocalHom + (Ideal.Quotient.mk ((IsLocalRing.maximalIdeal R) ^ n)) := + isLocalHom_quotient_maximalIdeal_pow hn + exact unitsModIdealEquivQuotientUnits + ((IsLocalRing.maximalIdeal R) ^ n) + +/-- The maximal-ideal finite unit quotient equivalence is induced by +reduction. -/ +theorem unitsModMaximalIdealPowEquiv_mk + {R : Type*} [CommRing R] [IsLocalRing R] + {n : ℕ} (hn : 1 ≤ n) (u : Rˣ) : + unitsModMaximalIdealPowEquiv (R := R) hn + (QuotientGroup.mk u) = + unitReduction ((IsLocalRing.maximalIdeal R) ^ n) u := by + let : IsLocalHom + (Ideal.Quotient.mk ((IsLocalRing.maximalIdeal R) ^ n)) := + isLocalHom_quotient_maximalIdeal_pow hn + exact unitsModIdealEquivQuotientUnits_mk + ((IsLocalRing.maximalIdeal R) ^ n) u + +/-- The opaque projective-limit object `lim_n (R/I^n)^*` for quotient-unit +groups. -/ +def adicUnitInverseLimit + {R : Type*} [CommRing R] (I : Ideal R) : Type _ := + compatibleGroupFamilies (fun n : ℕ => (R ⧸ I ^ n)ˣ) + (fun {_ _} hmn => + Units.map (Ideal.Quotient.factorPow I hmn).toMonoidHom) + +/-- Defines `adicUnitInverseLimitCompatibleFamiliesEquiv`. -/ +def adicUnitInverseLimitCompatibleFamiliesEquiv + {R : Type*} [CommRing R] (I : Ideal R) : + adicUnitInverseLimit I ≃ + compatibleGroupFamilies (fun n : ℕ => (R ⧸ I ^ n)ˣ) + (fun {_ _} hmn => + Units.map (Ideal.Quotient.factorPow I hmn).toMonoidHom) := by + unfold adicUnitInverseLimit + exact Equiv.refl _ + +/-- Compatible unit families form a commutative group under coordinatewise multiplication. -/ +instance adicUnitInverseLimit.instCommGroup + {R : Type*} [CommRing R] (I : Ideal R) : + CommGroup (adicUnitInverseLimit I) := + (adicUnitInverseLimitCompatibleFamiliesEquiv I).commGroup + +/-- Defines `adicUnitInverseLimitRepresentation`. -/ +def adicUnitInverseLimitRepresentation + {R : Type*} [CommRing R] (I : Ideal R) : + adicUnitInverseLimit I ≃* + compatibleGroupFamilies (fun n : ℕ => (R ⧸ I ^ n)ˣ) + (fun {_ _} hmn => + Units.map (Ideal.Quotient.factorPow I hmn).toMonoidHom) := + (adicUnitInverseLimitCompatibleFamiliesEquiv I).mulEquiv + +/-- Defines `adicUnitInverseLimitMk`. -/ +def adicUnitInverseLimitMk + {R : Type*} [CommRing R] (I : Ideal R) + (x : ∀ n : ℕ, (R ⧸ I ^ n)ˣ) + (compatible : ∀ {m n : ℕ} (hmn : m ≤ n), + Units.map (Ideal.Quotient.factorPow I hmn).toMonoidHom (x n) = x m) : + adicUnitInverseLimit I := + (adicUnitInverseLimitCompatibleFamiliesEquiv I).symm ⟨x, compatible⟩ + +/-- Defines `adicUnitInverseLimitEval`. -/ +def adicUnitInverseLimitEval + {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) : + adicUnitInverseLimit I →* (R ⧸ I ^ n)ˣ where + toFun x := (adicUnitInverseLimitCompatibleFamiliesEquiv I x).1 n + map_one' := by rfl + map_mul' _ _ := by rfl + +/-- Evaluation of a compatible unit family returns its component at the selected level. -/ +@[simp] +theorem adicUnitInverseLimit_eval_mk + {R : Type*} [CommRing R] (I : Ideal R) + (x : ∀ n : ℕ, (R ⧸ I ^ n)ˣ) + (compatible : ∀ {m n : ℕ} (hmn : m ≤ n), + Units.map (Ideal.Quotient.factorPow I hmn).toMonoidHom (x n) = x m) + (n : ℕ) : + adicUnitInverseLimitEval I n (adicUnitInverseLimitMk I x compatible) = + x n := by + rfl + +/-- Two adic unit inverse-limit elements are equal when all evaluations agree. -/ +@[ext] +theorem adicUnitInverseLimit_ext + {R : Type*} [CommRing R] (I : Ideal R) + {x y : adicUnitInverseLimit I} + (h : ∀ n : ℕ, adicUnitInverseLimitEval I n x = + adicUnitInverseLimitEval I n y) : + x = y := by + apply (adicUnitInverseLimitCompatibleFamiliesEquiv I).injective + apply Subtype.ext + funext n + exact h n + +/-- Evaluation commutes with the transition map between adic quotient levels. -/ +theorem adicUnitInverseLimit_eval_transition + {R : Type*} [CommRing R] (I : Ideal R) + {m n : ℕ} (hmn : m ≤ n) (x : adicUnitInverseLimit I) : + Units.map (Ideal.Quotient.factorPow I hmn).toMonoidHom + (adicUnitInverseLimitEval I n x) = + adicUnitInverseLimitEval I m x := + (adicUnitInverseLimitCompatibleFamiliesEquiv I x).2 hmn + +/-- Units of the explicit projective-limit ring are the same as compatible +families of units in the finite quotient rings. -/ +def adicQuotientInverseLimitUnitsEquiv + {R : Type*} [CommRing R] (I : Ideal R) : + (adicQuotientInverseLimit I)ˣ ≃* + adicUnitInverseLimit I where + toFun u := adicUnitInverseLimitMk I + (fun n => Units.map (adicQuotientInverseLimitEval I n).toMonoidHom u) + (fun hmn => by + ext + exact adicQuotientInverseLimit_eval_factorPow I hmn + (u : adicQuotientInverseLimit I)) + invFun u := + { val := adicQuotientInverseLimitMk I + (fun n => (adicUnitInverseLimitEval I n u : R ⧸ I ^ n)) + (fun hmn => congrArg Units.val + (adicUnitInverseLimit_eval_transition I hmn u)) + inv := adicQuotientInverseLimitMk I + (fun n => + (((adicUnitInverseLimitEval I n u)⁻¹ : (R ⧸ I ^ n)ˣ) : + R ⧸ I ^ n)) + (fun hmn => by + have h := congrArg Units.val + (congrArg Inv.inv + (adicUnitInverseLimit_eval_transition I hmn u)) + simpa using h) + val_inv := by + ext n + exact Units.mul_inv (adicUnitInverseLimitEval I n u) + inv_val := by + ext n + exact Units.inv_mul (adicUnitInverseLimitEval I n u) } + left_inv u := by + ext n + rfl + right_inv u := by + ext n + rfl + map_mul' u v := by + ext n + rfl + +/-- The adic inverse-limit equivalence, units of the adic completion are the projective limit of +the units of the finite quotient rings. -/ +def adicCompletionUnitsEquivUnitInverseLimit + {R : Type*} [CommRing R] (I : Ideal R) : + (AdicCompletion I R)ˣ ≃* adicUnitInverseLimit I := + (Units.mapEquiv + (adicCompletionEquivQuotientInverseLimit I).toMulEquiv).trans + (adicQuotientInverseLimitUnitsEquiv I) + +/-- The adic inverse-limit equivalence, unit projective-limit form for a complete ring. -/ +def unitsEquivUnitInverseLimit + {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] : + Rˣ ≃* adicUnitInverseLimit I := + (adicCompletionUnitsEquiv I).trans + (adicCompletionUnitsEquivUnitInverseLimit I) + +/-- The complete-ring unit projective-limit isomorphism is induced by unit +reduction in each coordinate. -/ +theorem unitsEquivUnitInverseLimit_apply + {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] + (u : Rˣ) (n : ℕ) : + adicUnitInverseLimitEval I n (unitsEquivUnitInverseLimit I u) = + unitReduction (I ^ n) u := by + ext + rfl + +/-- The opaque positive-indexed unit inverse limit +`lim_n (R/I^(n+1))ˣ`. -/ +def adicPositiveUnitInverseLimit + {R : Type*} [CommRing R] (I : Ideal R) : Type _ := + compatibleGroupFamilies (fun n : ℕ => (R ⧸ I ^ (n + 1))ˣ) + (fun {_ _} hmn => + Units.map + (Ideal.Quotient.factorPow I (Nat.succ_le_succ hmn)).toMonoidHom) + +/-- Defines `adicPositiveUnitInverseLimitCompatibleFamiliesEquiv`. -/ +def adicPositiveUnitInverseLimitCompatibleFamiliesEquiv + {R : Type*} [CommRing R] (I : Ideal R) : + adicPositiveUnitInverseLimit I ≃ + compatibleGroupFamilies (fun n : ℕ => (R ⧸ I ^ (n + 1))ˣ) + (fun {_ _} hmn => + Units.map + (Ideal.Quotient.factorPow I + (Nat.succ_le_succ hmn)).toMonoidHom) := by + unfold adicPositiveUnitInverseLimit + exact Equiv.refl _ + +/-- Positive-level compatible unit families form a commutative group. -/ +instance adicPositiveUnitInverseLimit.instCommGroup + {R : Type*} [CommRing R] (I : Ideal R) : + CommGroup (adicPositiveUnitInverseLimit I) := + (adicPositiveUnitInverseLimitCompatibleFamiliesEquiv I).commGroup + +/-- Defines `adicPositiveUnitInverseLimitRepresentation`. -/ +def adicPositiveUnitInverseLimitRepresentation + {R : Type*} [CommRing R] (I : Ideal R) : + adicPositiveUnitInverseLimit I ≃* + compatibleGroupFamilies (fun n : ℕ => (R ⧸ I ^ (n + 1))ˣ) + (fun {_ _} hmn => + Units.map + (Ideal.Quotient.factorPow I + (Nat.succ_le_succ hmn)).toMonoidHom) := + (adicPositiveUnitInverseLimitCompatibleFamiliesEquiv I).mulEquiv + +/-- Defines `adicPositiveUnitInverseLimitMk`. -/ +def adicPositiveUnitInverseLimitMk + {R : Type*} [CommRing R] (I : Ideal R) + (x : ∀ n : ℕ, (R ⧸ I ^ (n + 1))ˣ) + (compatible : ∀ {m n : ℕ} (hmn : m ≤ n), + Units.map + (Ideal.Quotient.factorPow I + (Nat.succ_le_succ hmn)).toMonoidHom (x n) = x m) : + adicPositiveUnitInverseLimit I := + (adicPositiveUnitInverseLimitCompatibleFamiliesEquiv I).symm + ⟨x, compatible⟩ + +/-- Defines `adicPositiveUnitInverseLimitEval`. -/ +def adicPositiveUnitInverseLimitEval + {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) : + adicPositiveUnitInverseLimit I →* (R ⧸ I ^ (n + 1))ˣ where + toFun x := + (adicPositiveUnitInverseLimitCompatibleFamiliesEquiv I x).1 n + map_one' := by rfl + map_mul' _ _ := by rfl + +/-- Evaluation of a positive-level unit family returns its chosen component. -/ +@[simp] +theorem adicPositiveUnitInverseLimit_eval_mk + {R : Type*} [CommRing R] (I : Ideal R) + (x : ∀ n : ℕ, (R ⧸ I ^ (n + 1))ˣ) + (compatible : ∀ {m n : ℕ} (hmn : m ≤ n), + Units.map + (Ideal.Quotient.factorPow I + (Nat.succ_le_succ hmn)).toMonoidHom (x n) = x m) + (n : ℕ) : + adicPositiveUnitInverseLimitEval I n + (adicPositiveUnitInverseLimitMk I x compatible) = x n := by + rfl + +/-- Positive adic unit families are determined by all of their components. -/ +@[ext] +theorem adicPositiveUnitInverseLimit_ext + {R : Type*} [CommRing R] (I : Ideal R) + {x y : adicPositiveUnitInverseLimit I} + (h : ∀ n : ℕ, adicPositiveUnitInverseLimitEval I n x = + adicPositiveUnitInverseLimitEval I n y) : + x = y := by + apply (adicPositiveUnitInverseLimitCompatibleFamiliesEquiv I).injective + apply Subtype.ext + funext n + exact h n + +/-- Positive-level evaluation respects the adic transition maps. -/ +theorem adicPositiveUnitInverseLimit_eval_transition + {R : Type*} [CommRing R] (I : Ideal R) + {m n : ℕ} (hmn : m ≤ n) (x : adicPositiveUnitInverseLimit I) : + Units.map + (Ideal.Quotient.factorPow I + (Nat.succ_le_succ hmn)).toMonoidHom + (adicPositiveUnitInverseLimitEval I n x) = + adicPositiveUnitInverseLimitEval I m x := + (adicPositiveUnitInverseLimitCompatibleFamiliesEquiv I x).2 hmn + +/-- Defines `adicUnitInverseLimitToPositive`. -/ +def adicUnitInverseLimitToPositive + {R : Type*} [CommRing R] (I : Ideal R) : + adicUnitInverseLimit I → + adicPositiveUnitInverseLimit I := + fun u => + adicPositiveUnitInverseLimitMk I + (fun n => adicUnitInverseLimitEval I (n + 1) u) + (fun hmn => adicUnitInverseLimit_eval_transition I + (Nat.succ_le_succ hmn) u) + +/-- Defines `adicPositiveUnitInverseLimitToAll`. -/ +def adicPositiveUnitInverseLimitToAll + {R : Type*} [CommRing R] (I : Ideal R) : + adicPositiveUnitInverseLimit I → + adicUnitInverseLimit I := + fun u => + adicUnitInverseLimitMk I (fun n => match n with + | 0 => 1 + | k + 1 => adicPositiveUnitInverseLimitEval I k u) + (by + intro m n hmn + cases m with + | zero => + ext + have : Subsingleton (R ⧸ I ^ 0) := by + simpa only [pow_zero, Ideal.one_eq_top] using + (inferInstance : Subsingleton (R ⧸ (⊤ : Ideal R))) + exact Subsingleton.elim _ _ + | succ m => + cases n with + | zero => cases hmn + | succ n => + exact adicPositiveUnitInverseLimit_eval_transition I + (Nat.succ_le_succ_iff.mp hmn) u) + +/-- Restricting an all-level unit family to positive levels and extending back is the identity. -/ +theorem adicPositiveUnitInverseLimit_toPositive_toAll + {R : Type*} [CommRing R] (I : Ideal R) + (u : adicPositiveUnitInverseLimit I) : + adicUnitInverseLimitToPositive I + (adicPositiveUnitInverseLimitToAll I u) = u := by + ext n + rfl + +/-- Extending a positive-level unit family and restricting again is the identity. -/ +theorem adicUnitInverseLimit_toAll_toPositive + {R : Type*} [CommRing R] (I : Ideal R) + (u : adicUnitInverseLimit I) : + adicPositiveUnitInverseLimitToAll I + (adicUnitInverseLimitToPositive I u) = u := by + ext n + cases n with + | zero => + have : Subsingleton (R ⧸ I ^ 0) := by + simpa only [pow_zero, Ideal.one_eq_top] using + (inferInstance : Subsingleton (R ⧸ (⊤ : Ideal R))) + exact Subsingleton.elim _ _ + | succ n => + rfl + +/-- The all-level unit inverse limit is equivalent to the positive-indexed +one. This removes the degenerate `I^0` coordinate used by mathlib's adic +completion API. -/ +def adicUnitInverseLimitEquivPositive + {R : Type*} [CommRing R] (I : Ideal R) : + adicUnitInverseLimit I ≃* + adicPositiveUnitInverseLimit I where + toFun := adicUnitInverseLimitToPositive I + invFun := adicPositiveUnitInverseLimitToAll I + left_inv := adicUnitInverseLimit_toAll_toPositive I + right_inv := adicPositiveUnitInverseLimit_toPositive_toAll I + map_mul' u v := by + ext n + rfl + +/-- Complete-ring unit projective-limit form with the positive indexing. -/ +def unitsEquivPositiveUnitInverseLimit + {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] : + Rˣ ≃* adicPositiveUnitInverseLimit I := + (unitsEquivUnitInverseLimit I).trans + (adicUnitInverseLimitEquivPositive I) + +/-- The positive-indexed complete-ring unit inverse-limit isomorphism is +coordinatewise reduction modulo `I^(n+1)`. -/ +theorem unitsEquivPositiveUnitInverseLimit_apply + {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] + (u : Rˣ) (n : ℕ) : + adicPositiveUnitInverseLimitEval I n + (unitsEquivPositiveUnitInverseLimit I u) = + unitReduction (I ^ (n + 1)) u := by + exact unitsEquivUnitInverseLimit_apply I u (n + 1) + +/-- The first principal ideal generated by `π` has powers `π^nO`. -/ +theorem dvrPowerIdeal_one_pow + {O : Type*} [CommRing O] (π : O) (n : ℕ) : + (uniformizerPowerIdeal π 1) ^ n = uniformizerPowerIdeal π n := by + simp [uniformizerPowerIdeal, Ideal.span_singleton_pow] + +/-- The principal-power ideals form a decreasing filtration. -/ +theorem dvrPowerIdeal_le_of_le + {O : Type*} [CommRing O] (π : O) {m n : ℕ} (hmn : m ≤ n) : + uniformizerPowerIdeal π n ≤ uniformizerPowerIdeal π m := by + rw [← dvrPowerIdeal_one_pow π m, + ← dvrPowerIdeal_one_pow π n] + exact Ideal.pow_le_pow_right hmn + +/-- Transition map on the finite unit quotients `(O/π^(n+1)O)ˣ`. -/ +def dvrPowerIdealUnitTransition + {O : Type*} [CommRing O] (π : O) {m n : ℕ} (hmn : m ≤ n) : + O ⧸ uniformizerPowerIdeal π (n + 1) →+* + O ⧸ uniformizerPowerIdeal π (m + 1) := + Ideal.Quotient.factor + (dvrPowerIdeal_le_of_le π (Nat.succ_le_succ hmn)) + +/-- The opaque positive-indexed projective limit +`lim_n (O/π^(n+1)O)ˣ`. -/ +def dvrPowerIdealUnitInverseLimit + {O : Type*} [CommRing O] (π : O) : Type _ := + compatibleGroupFamilies + (fun n : ℕ => (O ⧸ uniformizerPowerIdeal π (n + 1))ˣ) + (fun {_ _} hmn => + Units.map + (dvrPowerIdealUnitTransition π hmn).toMonoidHom) + +/-- Defines `dvrPowerIdealUnitInverseLimitCompatibleFamiliesEquiv`. -/ +def dvrPowerIdealUnitInverseLimitCompatibleFamiliesEquiv + {O : Type*} [CommRing O] (π : O) : + dvrPowerIdealUnitInverseLimit π ≃ + compatibleGroupFamilies + (fun n : ℕ => (O ⧸ uniformizerPowerIdeal π (n + 1))ˣ) + (fun {_ _} hmn => + Units.map + (dvrPowerIdealUnitTransition π hmn).toMonoidHom) := by + unfold dvrPowerIdealUnitInverseLimit + exact Equiv.refl _ + +/-- Compatible units modulo powers of a DVR element form a commutative group. -/ +instance dvrPowerIdealUnitInverseLimit.instCommGroup + {O : Type*} [CommRing O] (π : O) : + CommGroup (dvrPowerIdealUnitInverseLimit π) := + (dvrPowerIdealUnitInverseLimitCompatibleFamiliesEquiv π).commGroup + +/-- Defines `dvrPowerIdealUnitInverseLimitRepresentation`. -/ +def dvrPowerIdealUnitInverseLimitRepresentation + {O : Type*} [CommRing O] (π : O) : + dvrPowerIdealUnitInverseLimit π ≃* + compatibleGroupFamilies + (fun n : ℕ => (O ⧸ uniformizerPowerIdeal π (n + 1))ˣ) + (fun {_ _} hmn => + Units.map + (dvrPowerIdealUnitTransition π hmn).toMonoidHom) := + (dvrPowerIdealUnitInverseLimitCompatibleFamiliesEquiv π).mulEquiv + +/-- Defines `dvrPowerIdealUnitInverseLimitMk`. -/ +def dvrPowerIdealUnitInverseLimitMk + {O : Type*} [CommRing O] (π : O) + (x : ∀ n : ℕ, (O ⧸ uniformizerPowerIdeal π (n + 1))ˣ) + (compatible : ∀ {m n : ℕ} (hmn : m ≤ n), + Units.map (dvrPowerIdealUnitTransition π hmn).toMonoidHom (x n) = x m) : + dvrPowerIdealUnitInverseLimit π := + (dvrPowerIdealUnitInverseLimitCompatibleFamiliesEquiv π).symm + ⟨x, compatible⟩ + +/-- Defines `dvrPowerIdealUnitInverseLimitEval`. -/ +def dvrPowerIdealUnitInverseLimitEval + {O : Type*} [CommRing O] (π : O) (n : ℕ) : + dvrPowerIdealUnitInverseLimit π →* + (O ⧸ uniformizerPowerIdeal π (n + 1))ˣ where + toFun x := + (dvrPowerIdealUnitInverseLimitCompatibleFamiliesEquiv π x).1 n + map_one' := by rfl + map_mul' _ _ := by rfl + +/-- DVR power-ideal unit families are equal when all coordinate evaluations agree. -/ +@[ext] +theorem dvrPowerIdealUnitInverseLimit_ext + {O : Type*} [CommRing O] (π : O) + {x y : dvrPowerIdealUnitInverseLimit π} + (h : ∀ n : ℕ, dvrPowerIdealUnitInverseLimitEval π n x = + dvrPowerIdealUnitInverseLimitEval π n y) : + x = y := by + apply (dvrPowerIdealUnitInverseLimitCompatibleFamiliesEquiv π).injective + apply Subtype.ext + funext n + exact h n + +/-- The finite quotient-unit stage for `(π)^(n+1)` agrees with the canonical +stage `π^(n+1)O`. -/ +def powerIdealStageEquiv + {O : Type*} [CommRing O] (π : O) (n : ℕ) : + (O ⧸ (uniformizerPowerIdeal π 1) ^ (n + 1))ˣ ≃* + (O ⧸ uniformizerPowerIdeal π (n + 1))ˣ := + Units.mapEquiv + (Ideal.quotientEquivAlgOfEq O + (dvrPowerIdeal_one_pow π (n + 1))).toRingEquiv.toMulEquiv + +/-- The finite stage equivalence is induced by the equality +`(πO)^(n+1) = π^(n+1)O`. -/ +theorem powerIdealStageEquiv_apply + {O : Type*} [CommRing O] (π : O) (n : ℕ) + (u : (O ⧸ (uniformizerPowerIdeal π 1) ^ (n + 1))ˣ) : + (powerIdealStageEquiv π n u : + O ⧸ uniformizerPowerIdeal π (n + 1)) = + (Ideal.quotientEquivAlgOfEq O + (dvrPowerIdeal_one_pow π (n + 1))) (u : _) := + rfl + +/-- The stage equivalences commute with the projective transition maps. -/ +theorem powerIdealStageEquiv_factorPow + {O : Type*} [CommRing O] (π : O) {m n : ℕ} (hmn : m ≤ n) + (x : O ⧸ (uniformizerPowerIdeal π 1) ^ (n + 1)) : + (Ideal.quotientEquivAlgOfEq O + (dvrPowerIdeal_one_pow π (m + 1))) + (Ideal.Quotient.factorPow (uniformizerPowerIdeal π 1) + (Nat.succ_le_succ hmn) x) = + dvrPowerIdealUnitTransition π hmn + ((Ideal.quotientEquivAlgOfEq O + (dvrPowerIdeal_one_pow π (n + 1))) x) := by + refine Quotient.inductionOn' x ?_ + intro r + change (Ideal.quotientEquivAlgOfEq O + (dvrPowerIdeal_one_pow π (m + 1))) + (Ideal.Quotient.factorPow (uniformizerPowerIdeal π 1) + (Nat.succ_le_succ hmn) + (Ideal.Quotient.mk ((uniformizerPowerIdeal π 1) ^ (n + 1)) r)) = + dvrPowerIdealUnitTransition π hmn + ((Ideal.quotientEquivAlgOfEq O + (dvrPowerIdeal_one_pow π (n + 1))) + (Ideal.Quotient.mk ((uniformizerPowerIdeal π 1) ^ (n + 1)) r)) + rw [Ideal.quotientEquivAlgOfEq_mk] + simp [dvrPowerIdealUnitTransition, Ideal.Quotient.factorPow] + +/-- The positive-indexed unit inverse limit for the principal ideal `(π)` is +the finite quotient-unit inverse limit `lim_n (O/π^(n+1)O)ˣ`. -/ +def adicPositiveUnitInverseLimitEquivDVRPowerIdealUnitInverseLimit + {O : Type*} [CommRing O] (π : O) : + adicPositiveUnitInverseLimit (uniformizerPowerIdeal π 1) ≃* + dvrPowerIdealUnitInverseLimit π := + (adicPositiveUnitInverseLimitRepresentation + (uniformizerPowerIdeal π 1)).trans + ((compatibleGroupFamiliesMulEquiv + (fun n : ℕ => (O ⧸ (uniformizerPowerIdeal π 1) ^ (n + 1))ˣ) + (fun n : ℕ => (O ⧸ uniformizerPowerIdeal π (n + 1))ˣ) + (fun {_ _} hmn => + Units.map + (Ideal.Quotient.factorPow (uniformizerPowerIdeal π 1) + (Nat.succ_le_succ hmn)).toMonoidHom) + (fun {_ _} hmn => + Units.map + (dvrPowerIdealUnitTransition π hmn).toMonoidHom) + (fun n => powerIdealStageEquiv π n) + (by + intro m n hmn u + apply Units.ext + exact (powerIdealStageEquiv_factorPow π hmn (u : _)).symm)).trans + (dvrPowerIdealUnitInverseLimitRepresentation π).symm) + +/-- Transition map on the positive-indexed quotients `Oˣ/U^(n+1)`. -/ +def dvrHigherUnitQuotientTransition + {O : Type*} [CommRing O] (π : O) {m n : ℕ} (hmn : m ≤ n) : + Oˣ ⧸ higherUnitSubgroup π (n + 1) →* + Oˣ ⧸ higherUnitSubgroup π (m + 1) := + QuotientGroup.map _ _ (MonoidHom.id Oˣ) <| by + intro u hu + exact higherUnitSubgroup_le_of_le π (Nat.succ_le_succ hmn) hu + +private theorem dvrHigherUnitQuotientTransition_mk + {O : Type*} [CommRing O] (π : O) {m n : ℕ} (hmn : m ≤ n) (u : Oˣ) : + dvrHigherUnitQuotientTransition π hmn + (u : Oˣ ⧸ higherUnitSubgroup π (n + 1)) = + (u : Oˣ ⧸ higherUnitSubgroup π (m + 1)) := by + have hmap : + higherUnitSubgroup π (n + 1) ≤ + (higherUnitSubgroup π (m + 1)).comap (MonoidHom.id Oˣ) := by + intro x hx + exact higherUnitSubgroup_le_of_le π (Nat.succ_le_succ hmn) hx + unfold dvrHigherUnitQuotientTransition + exact QuotientGroup.map_mk + (N := higherUnitSubgroup π (n + 1)) + (higherUnitSubgroup π (m + 1)) (MonoidHom.id Oˣ) hmap u + +/-- A higher-unit quotient with discreteness fixed in its type. -/ +structure DiscreteHigherUnitQuotient + {O : Type*} [CommRing O] (π : O) (n : ℕ) where + /-- The underlying higher-unit quotient class. -/ + val : Oˣ ⧸ higherUnitSubgroup π n + +namespace DiscreteHigherUnitQuotient + +/-- Defines `equiv`. -/ +def equiv {O : Type*} [CommRing O] (π : O) (n : ℕ) : + DiscreteHigherUnitQuotient π n ≃ + Oˣ ⧸ higherUnitSubgroup π n where + toFun := val + invFun := fun x => ⟨x⟩ + left_inv := fun x => by cases x; rfl + right_inv := fun _ => rfl + +/-- A discrete higher-unit quotient inherits its commutative group structure +from the concrete quotient. -/ +instance {O : Type*} [CommRing O] (π : O) (n : ℕ) : + CommGroup (DiscreteHigherUnitQuotient π n) := + (equiv π n).commGroup + +/-- Each higher-unit quotient is equipped with the discrete topology. -/ +instance {O : Type*} [CommRing O] (π : O) (n : ℕ) : + TopologicalSpace (DiscreteHigherUnitQuotient π n) := ⊥ + +/-- The chosen topology on a higher-unit quotient is discrete. -/ +instance {O : Type*} [CommRing O] (π : O) (n : ℕ) : + DiscreteTopology (DiscreteHigherUnitQuotient π n) := + ⟨rfl⟩ + +/-- Defines `of`. -/ +def of {O : Type*} [CommRing O] (π : O) (n : ℕ) + (x : Oˣ ⧸ higherUnitSubgroup π n) : + DiscreteHigherUnitQuotient π n := + ⟨x⟩ + +/-- Forgetting the discrete wrapper after inserting a quotient element recovers that element. -/ +@[simp] +theorem val_of {O : Type*} [CommRing O] (π : O) (n : ℕ) + (x : Oˣ ⧸ higherUnitSubgroup π n) : (of π n x).val = x := + rfl + +/-- Defines `homeomorph`. -/ +def homeomorph {O : Type*} [CommRing O] (π : O) (n : ℕ) : + @Homeomorph (DiscreteHigherUnitQuotient π n) + (Oˣ ⧸ higherUnitSubgroup π n) + (inferInstance : TopologicalSpace + (DiscreteHigherUnitQuotient π n)) + (⊥ : TopologicalSpace (Oˣ ⧸ higherUnitSubgroup π n)) := by + letI : TopologicalSpace (Oˣ ⧸ higherUnitSubgroup π n) := ⊥ + letI : DiscreteTopology (Oˣ ⧸ higherUnitSubgroup π n) := ⟨rfl⟩ + exact + { toEquiv := equiv π n + continuous_toFun := continuous_of_discreteTopology + continuous_invFun := continuous_of_discreteTopology } + +/-- The discrete comparison homeomorphism acts as the underlying quotient equivalence. -/ +@[simp] +theorem homeomorph_apply {O : Type*} [CommRing O] (π : O) (n : ℕ) + (x : DiscreteHigherUnitQuotient π n) : homeomorph π n x = x.val := + rfl + +/-- The inverse discrete quotient equivalence wraps the concrete quotient element. -/ +@[simp] +theorem equiv_symm_apply {O : Type*} [CommRing O] + (π : O) (n : ℕ) (x : Oˣ ⧸ higherUnitSubgroup π n) : + (equiv π n).symm x = of π n x := + rfl + +end DiscreteHigherUnitQuotient + +/-- The opaque direct quotient-system object `lim_n Oˣ/U^(n+1)`. -/ +def dvrHigherUnitQuotientInverseLimit + {O : Type*} [CommRing O] (π : O) : Type _ := + compatibleGroupFamilies + (fun n : ℕ => Oˣ ⧸ higherUnitSubgroup π (n + 1)) + (fun {_ _} hmn => dvrHigherUnitQuotientTransition π hmn) + +/-- Defines `dvrHigherUnitQuotientInverseLimitCompatibleFamiliesEquiv`. -/ +def dvrHigherUnitQuotientInverseLimitCompatibleFamiliesEquiv + {O : Type*} [CommRing O] (π : O) : + dvrHigherUnitQuotientInverseLimit π ≃ + compatibleGroupFamilies + (fun n : ℕ => Oˣ ⧸ higherUnitSubgroup π (n + 1)) + (fun {_ _} hmn => dvrHigherUnitQuotientTransition π hmn) := by + unfold dvrHigherUnitQuotientInverseLimit + exact Equiv.refl _ + +/-- The inverse limit of higher-unit quotients is a commutative group. -/ +instance dvrHigherUnitQuotientInverseLimit.instCommGroup + {O : Type*} [CommRing O] (π : O) : + CommGroup (dvrHigherUnitQuotientInverseLimit π) := + (dvrHigherUnitQuotientInverseLimitCompatibleFamiliesEquiv π).commGroup + +/-- Defines `dvrHigherUnitQuotientInverseLimitRepresentation`. -/ +def dvrHigherUnitQuotientInverseLimitRepresentation + {O : Type*} [CommRing O] (π : O) : + dvrHigherUnitQuotientInverseLimit π ≃* + compatibleGroupFamilies + (fun n : ℕ => Oˣ ⧸ higherUnitSubgroup π (n + 1)) + (fun {_ _} hmn => dvrHigherUnitQuotientTransition π hmn) := + (dvrHigherUnitQuotientInverseLimitCompatibleFamiliesEquiv π).mulEquiv + +/-- Defines `dvrHigherUnitQuotientInverseLimitMk`. -/ +def dvrHigherUnitQuotientInverseLimitMk + {O : Type*} [CommRing O] (π : O) + (x : ∀ n : ℕ, Oˣ ⧸ higherUnitSubgroup π (n + 1)) + (compatible : ∀ {m n : ℕ} (hmn : m ≤ n), + dvrHigherUnitQuotientTransition π hmn (x n) = x m) : + dvrHigherUnitQuotientInverseLimit π := + (dvrHigherUnitQuotientInverseLimitCompatibleFamiliesEquiv π).symm + ⟨x, compatible⟩ + +/-- Defines `dvrHigherUnitQuotientInverseLimitEval`. -/ +def dvrHigherUnitQuotientInverseLimitEval + {O : Type*} [CommRing O] (π : O) (n : ℕ) : + dvrHigherUnitQuotientInverseLimit π →* + Oˣ ⧸ higherUnitSubgroup π (n + 1) where + toFun x := + (dvrHigherUnitQuotientInverseLimitCompatibleFamiliesEquiv π x).1 n + map_one' := by rfl + map_mul' _ _ := by rfl + +/-- Evaluation of a higher-unit inverse-limit family returns its selected quotient component. -/ +@[simp] +theorem dvrHigherUnitQuotientInverseLimit_eval_mk + {O : Type*} [CommRing O] (π : O) + (x : ∀ n : ℕ, Oˣ ⧸ higherUnitSubgroup π (n + 1)) + (compatible : ∀ {m n : ℕ} (hmn : m ≤ n), + dvrHigherUnitQuotientTransition π hmn (x n) = x m) + (n : ℕ) : + dvrHigherUnitQuotientInverseLimitEval π n + (dvrHigherUnitQuotientInverseLimitMk π x compatible) = x n := by + rfl + +/-- Higher-unit inverse-limit elements are determined by their evaluations at every level. -/ +@[ext] +theorem dvrHigherUnitQuotientInverseLimit_ext + {O : Type*} [CommRing O] (π : O) + {x y : dvrHigherUnitQuotientInverseLimit π} + (h : ∀ n : ℕ, dvrHigherUnitQuotientInverseLimitEval π n x = + dvrHigherUnitQuotientInverseLimitEval π n y) : + x = y := by + apply (dvrHigherUnitQuotientInverseLimitCompatibleFamiliesEquiv π).injective + apply Subtype.ext + funext n + exact h n + +/-- Higher-unit evaluation is compatible with quotient transition maps. -/ +theorem dvrHigherUnitQuotientInverseLimit_eval_transition + {O : Type*} [CommRing O] (π : O) + {m n : ℕ} (hmn : m ≤ n) + (x : dvrHigherUnitQuotientInverseLimit π) : + dvrHigherUnitQuotientTransition π hmn + (dvrHigherUnitQuotientInverseLimitEval π n x) = + dvrHigherUnitQuotientInverseLimitEval π m x := + (dvrHigherUnitQuotientInverseLimitCompatibleFamiliesEquiv π x).2 hmn + +/-- The higher-unit inverse limit carries the topology induced by its discrete coordinates. -/ +noncomputable instance dvrHigherUnitQuotientInverseLimit.instTopologicalSpace + {O : Type*} [CommRing O] (π : O) : + TopologicalSpace (dvrHigherUnitQuotientInverseLimit π) := by + letI : (n : ℕ) → TopologicalSpace + (Oˣ ⧸ higherUnitSubgroup π (n + 1)) := fun _ => ⊥ + exact + (dvrHigherUnitQuotientInverseLimitCompatibleFamiliesEquiv π).topologicalSpace + +/-- The higher-unit inverse limit is homeomorphic to its compatible coordinate families. -/ +noncomputable def + dvrHigherUnitQuotientInverseLimitRepresentationHomeomorph + {O : Type*} [CommRing O] (π : O) : + letI : (n : ℕ) → TopologicalSpace + (Oˣ ⧸ higherUnitSubgroup π (n + 1)) := fun _ => ⊥ + dvrHigherUnitQuotientInverseLimit π ≃ₜ + compatibleGroupFamilies + (fun n : ℕ => Oˣ ⧸ higherUnitSubgroup π (n + 1)) + (fun {_ _} hmn => dvrHigherUnitQuotientTransition π hmn) := by + letI : (n : ℕ) → TopologicalSpace + (Oˣ ⧸ higherUnitSubgroup π (n + 1)) := fun _ => ⊥ + exact + (dvrHigherUnitQuotientInverseLimitCompatibleFamiliesEquiv π).homeomorph + +/-- Defines `dvrHigherUnitQuotientInverseLimitDiscreteEval`. -/ +def dvrHigherUnitQuotientInverseLimitDiscreteEval + {O : Type*} [CommRing O] (π : O) (n : ℕ) : + dvrHigherUnitQuotientInverseLimit π → + DiscreteHigherUnitQuotient π (n + 1) := + fun x => DiscreteHigherUnitQuotient.of π (n + 1) + (dvrHigherUnitQuotientInverseLimitEval π n x) + +/-- Every coordinate evaluation from the higher-unit inverse limit to its +discrete quotient is continuous. -/ +theorem dvrHigherUnitQuotientInverseLimit_discreteEval_continuous + {O : Type*} [CommRing O] (π : O) (n : ℕ) : + Continuous (dvrHigherUnitQuotientInverseLimitDiscreteEval π n) := by + let : (n : ℕ) → TopologicalSpace + (Oˣ ⧸ higherUnitSubgroup π (n + 1)) := fun _ => ⊥ + let representation := + dvrHigherUnitQuotientInverseLimitRepresentationHomeomorph π + have hraw : Continuous fun x : dvrHigherUnitQuotientInverseLimit π => + (dvrHigherUnitQuotientInverseLimitCompatibleFamiliesEquiv π x).1 n := + (continuous_apply n).comp + (continuous_subtype_val.comp representation.continuous) + have hmodel := + (DiscreteHigherUnitQuotient.homeomorph π (n + 1)).symm.continuous.comp + hraw + change Continuous (fun x : dvrHigherUnitQuotientInverseLimit π => + (DiscreteHigherUnitQuotient.equiv π (n + 1)).symm + ((dvrHigherUnitQuotientInverseLimitCompatibleFamiliesEquiv π x).1 n)) at hmodel + change Continuous (fun x : dvrHigherUnitQuotientInverseLimit π => + (DiscreteHigherUnitQuotient.equiv π (n + 1)).symm + ((dvrHigherUnitQuotientInverseLimitCompatibleFamiliesEquiv π x).1 n)) + exact hmodel + +/-- A map into the higher-unit inverse limit is continuous exactly when all +of its named discrete coordinates are continuous. This is the public +universal property of the canonical prodiscrete topology; raw quotient +topology instances remain confined to the proof. -/ +theorem dvrHigherUnitQuotientInverseLimit_continuous_iff + {O : Type*} [CommRing O] {α : Type*} [TopologicalSpace α] + (π : O) (f : α → dvrHigherUnitQuotientInverseLimit π) : + Continuous f ↔ + ∀ n : ℕ, Continuous fun x => + dvrHigherUnitQuotientInverseLimitDiscreteEval π n (f x) := by + constructor + · intro hf n + exact + (dvrHigherUnitQuotientInverseLimit_discreteEval_continuous π n).comp hf + · intro h + let : (n : ℕ) → TopologicalSpace + (Oˣ ⧸ higherUnitSubgroup π (n + 1)) := fun _ => ⊥ + let : (n : ℕ) → DiscreteTopology + (Oˣ ⧸ higherUnitSubgroup π (n + 1)) := fun _ => ⟨rfl⟩ + let representation := + dvrHigherUnitQuotientInverseLimitRepresentationHomeomorph π + have hrepresentation : Continuous fun x => representation (f x) := + Continuous.subtype_mk + (continuous_pi fun n => by + have hraw := + (DiscreteHigherUnitQuotient.homeomorph π (n + 1)).continuous.comp + (h n) + change Continuous fun x => + dvrHigherUnitQuotientInverseLimitEval π n (f x) + exact hraw) + (fun x => by + change ∀ {i j : ℕ} (hij : i ≤ j), + dvrHigherUnitQuotientTransition π hij + ((dvrHigherUnitQuotientInverseLimitCompatibleFamiliesEquiv π + (f x)).1 j) = + (dvrHigherUnitQuotientInverseLimitCompatibleFamiliesEquiv π + (f x)).1 i + exact + (dvrHigherUnitQuotientInverseLimitCompatibleFamiliesEquiv π + (f x)).2) + have hback := representation.symm.continuous.comp hrepresentation + exact hback.congr fun x => representation.symm_apply_apply (f x) + +/-- The canonical homomorphism +`Oˣ → lim_n Oˣ/U^(n+1)`. -/ +def unitsToHigherUnitQuotientInverseLimit + {O : Type*} [CommRing O] (π : O) : + Oˣ →* dvrHigherUnitQuotientInverseLimit π where + toFun u := dvrHigherUnitQuotientInverseLimitMk π + (fun _ => QuotientGroup.mk u) + (fun {m n} hmn => by + exact dvrHigherUnitQuotientTransition_mk π (m := m) (n := n) hmn u) + map_one' := by ext n; rfl + map_mul' u v := by ext n; rfl + +/-- The finite-stage isomorphisms +`Oˣ/U^(n+1) ≃ (O/π^(n+1)O)ˣ` commute with the projective transition maps. -/ +theorem higherUnitQuotient_finiteStage_compat + {O : Type*} [CommRing O] [IsDomain O] [IsDiscreteValuationRing O] + {π : O} (hπ : Irreducible π) {m n : ℕ} (hmn : m ≤ n) + (q : Oˣ ⧸ higherUnitSubgroup π (n + 1)) : + unitsQuotientEquiv hπ + (Nat.succ_pos m) + (dvrHigherUnitQuotientTransition π hmn q) = + Units.map (dvrPowerIdealUnitTransition π hmn).toMonoidHom + (unitsQuotientEquiv hπ + (Nat.succ_pos n) q) := by + refine QuotientGroup.induction_on q ?_ + intro u + rw [dvrHigherUnitQuotientTransition_mk] + ext + simp [units_quotient_equiv_mk, + dvrPowerIdealUnitTransition, unitReduction] + +/-- The direct quotient-system `lim Oˣ/U^(n+1)` is equivalent to the finite +quotient-unit limit `lim (O/π^(n+1)O)ˣ`. -/ +def higherUnitQuotientInverseLimitEquivPowerIdealUnitInverseLimit + {O : Type*} [CommRing O] [IsDomain O] [IsDiscreteValuationRing O] + {π : O} (hπ : Irreducible π) : + dvrHigherUnitQuotientInverseLimit π ≃* + dvrPowerIdealUnitInverseLimit π := + (dvrHigherUnitQuotientInverseLimitRepresentation π).trans + ((compatibleGroupFamiliesMulEquiv + (fun n : ℕ => Oˣ ⧸ higherUnitSubgroup π (n + 1)) + (fun n : ℕ => (O ⧸ uniformizerPowerIdeal π (n + 1))ˣ) + (fun {_ _} hmn => dvrHigherUnitQuotientTransition π hmn) + (fun {_ _} hmn => + Units.map + (dvrPowerIdealUnitTransition π hmn).toMonoidHom) + (fun n => unitsQuotientEquiv hπ + (Nat.succ_pos n)) + (by + intro m n hmn q + exact (higherUnitQuotient_finiteStage_compat + hπ hmn q).symm)).trans + (dvrPowerIdealUnitInverseLimitRepresentation π).symm) + +/-- The adic inverse-limit equivalence, direct unit-quotient form: +if `O` is complete for the `(π)`-adic topology, then `Oˣ` is isomorphic to +the projective limit `lim_n Oˣ/U^(n+1)`. -/ +def dvrUnitsEquivHigherUnitQuotientInverseLimit + {O : Type*} [CommRing O] [IsDomain O] [IsDiscreteValuationRing O] + {π : O} (hπ : Irreducible π) [IsAdicComplete (uniformizerPowerIdeal π 1) O] : + Oˣ ≃* dvrHigherUnitQuotientInverseLimit π := + ((unitsEquivPositiveUnitInverseLimit (uniformizerPowerIdeal π 1)).trans + (adicPositiveUnitInverseLimitEquivDVRPowerIdealUnitInverseLimit π)).trans + (higherUnitQuotientInverseLimitEquivPowerIdealUnitInverseLimit hπ).symm + +/-- The direct unit-quotient inverse-limit isomorphism is the canonical +map, coordinatewise `u ↦ u mod U^(n+1)`. -/ +theorem dvrUnitsEquivHigherUnitQuotientInverseLimit_apply + {O : Type*} [CommRing O] [IsDomain O] [IsDiscreteValuationRing O] + {π : O} (hπ : Irreducible π) [IsAdicComplete (uniformizerPowerIdeal π 1) O] + (u : Oˣ) (n : ℕ) : + dvrHigherUnitQuotientInverseLimitEval π n + (dvrUnitsEquivHigherUnitQuotientInverseLimit hπ u) = + QuotientGroup.mk u := by + apply + (unitsQuotientEquiv hπ + (Nat.succ_pos n)).injective + change unitsQuotientEquiv hπ (Nat.succ_pos n) + (dvrHigherUnitQuotientInverseLimitEval π n + (dvrUnitsEquivHigherUnitQuotientInverseLimit hπ u)) = + unitsQuotientEquiv hπ (Nat.succ_pos n) + (QuotientGroup.mk u) + rw [units_quotient_equiv_mk] + change dvrPowerIdealUnitInverseLimitEval π n + ((higherUnitQuotientInverseLimitEquivPowerIdealUnitInverseLimit hπ) + (dvrUnitsEquivHigherUnitQuotientInverseLimit hπ u)) = + unitReduction (uniformizerPowerIdeal π (n + 1)) u + simp only [dvrUnitsEquivHigherUnitQuotientInverseLimit, + adicPositiveUnitInverseLimitEquivDVRPowerIdealUnitInverseLimit, Nat.succ_eq_add_one, + RingHom.toMonoidHom_eq_coe, MulEquiv.trans_apply, MulEquiv.apply_symm_apply, unitReduction] + ext + change (Ideal.quotientEquivAlgOfEq O + (dvrPowerIdeal_one_pow π (n + 1))) + (Ideal.Quotient.mk ((uniformizerPowerIdeal π 1) ^ (n + 1)) (u : O)) = + Ideal.Quotient.mk (uniformizerPowerIdeal π (n + 1)) (u : O) + rw [Ideal.quotientEquivAlgOfEq_mk] + +/-- Equality in the finite higher-unit quotient is exactly congruence modulo +`π^nO` on the underlying elements. -/ +theorem higherUnitQuotient_mk_eq_mk_iff_sub_mem + {O : Type*} [CommRing O] (π : O) (n : ℕ) (u v : Oˣ) : + (QuotientGroup.mk v : Oˣ ⧸ higherUnitSubgroup π n) = + QuotientGroup.mk u ↔ + (v : O) - (u : O) ∈ uniformizerPowerIdeal π n := by + constructor + · intro h + have hdiv : v / u ∈ higherUnitSubgroup π n := by + exact (QuotientGroup.eq_iff_div_mem + (N := higherUnitSubgroup π n) (x := v) (y := u)).1 h + have hmem : + ((v / u : Oˣ) : O) - 1 ∈ uniformizerPowerIdeal π n := + (mem_higherUnitSubgroup_iff_sub_one_mem_powerIdeal + (π := π) (n := n) (u := v / u)).1 hdiv + have hmul : + (((v / u : Oˣ) : O) - 1) * (u : O) ∈ + uniformizerPowerIdeal π n := + (uniformizerPowerIdeal π n).mul_mem_right (u : O) hmem + have hcalc : + (((v / u : Oˣ) : O) - 1) * (u : O) = (v : O) - (u : O) := by + calc + (((v / u : Oˣ) : O) - 1) * (u : O) + = ((v : O) * ((u⁻¹ : Oˣ) : O) - 1) * (u : O) := rfl + _ = (v : O) * (((u⁻¹ : Oˣ) : O) * (u : O)) - (u : O) := by ring + _ = (v : O) - (u : O) := by simp + simpa [hcalc] using hmul + · intro hsub + have hmem : + ((v / u : Oˣ) : O) - 1 ∈ uniformizerPowerIdeal π n := by + have hmul : + ((v : O) - (u : O)) * ((u⁻¹ : Oˣ) : O) ∈ + uniformizerPowerIdeal π n := + (uniformizerPowerIdeal π n).mul_mem_right ((u⁻¹ : Oˣ) : O) hsub + convert hmul using 1 + calc + ((v / u : Oˣ) : O) - 1 + = (v : O) * ((u⁻¹ : Oˣ) : O) - 1 := rfl + _ = (v : O) * ((u⁻¹ : Oˣ) : O) - + (u : O) * ((u⁻¹ : Oˣ) : O) := by simp + _ = ((v : O) - (u : O)) * ((u⁻¹ : Oˣ) : O) := by ring + have hdiv : v / u ∈ higherUnitSubgroup π n := + (mem_higherUnitSubgroup_iff_sub_one_mem_powerIdeal + (π := π) (n := n) (u := v / u)).2 hmem + exact (QuotientGroup.eq_iff_div_mem + (N := higherUnitSubgroup π n) (x := v) (y := u)).2 hdiv + +/-- The topology on a unit group induced by an explicitly chosen adic +topology on its ring. -/ +@[reducible] +noncomputable def adicUnitsTopology + {O : Type*} [CommRing O] (I : Ideal O) : TopologicalSpace Oˣ := by + letI : TopologicalSpace O := I.adicTopology + exact inferInstance + +/-- Reduction to a higher-unit quotient is continuous for the adic topology +on `Oˣ` and the discrete topology on the finite quotient. -/ +private theorem higherUnitQuotient_mk_continuous_adic_raw + {O : Type*} [CommRing O] (π : O) (n : ℕ) : + @Continuous Oˣ (Oˣ ⧸ higherUnitSubgroup π n) + (adicUnitsTopology (uniformizerPowerIdeal π 1)) + (⊥ : TopologicalSpace (Oˣ ⧸ higherUnitSubgroup π n)) + (fun u : Oˣ => + (QuotientGroup.mk u : Oˣ ⧸ higherUnitSubgroup π n)) := by + let : TopologicalSpace O := (uniformizerPowerIdeal π 1).adicTopology + let : TopologicalSpace (Oˣ ⧸ higherUnitSubgroup π n) := ⊥ + let : DiscreteTopology (Oˣ ⧸ higherUnitSubgroup π n) := ⟨rfl⟩ + rw [continuous_iff_continuousAt] + intro u + change Filter.Tendsto + (fun v : Oˣ => (QuotientGroup.mk v : + Oˣ ⧸ higherUnitSubgroup π n)) (𝓝 u) + (𝓝 (QuotientGroup.mk u : Oˣ ⧸ higherUnitSubgroup π n)) + rw [@nhds_discrete (Oˣ ⧸ higherUnitSubgroup π n) _ _] + rw [Filter.tendsto_def] + intro s hs + rw [mem_pure] at hs + let ball : Set O := + (fun y => (u : O) + y) '' + (((uniformizerPowerIdeal π 1) ^ n : Ideal O) : Set O) + have hball : ball ∈ 𝓝 (u : O) := + (Ideal.hasBasis_nhds_adic (uniformizerPowerIdeal π 1) (u : O)).mem_iff.mpr + ⟨n, trivial, subset_rfl⟩ + have hpre : {v : Oˣ | (v : O) ∈ ball} ∈ 𝓝 u := + Units.continuous_val.continuousAt hball + exact mem_of_superset hpre (by + intro v hv + rcases hv with ⟨z, hz, hzv⟩ + have hsub : (v : O) - (u : O) ∈ uniformizerPowerIdeal π n := by + rw [← dvrPowerIdeal_one_pow π n] + have hz_eq : (v : O) - (u : O) = z := by + rw [← hzv] + ring + simpa [hz_eq] using hz + have hq : + (QuotientGroup.mk v : Oˣ ⧸ higherUnitSubgroup π n) = + QuotientGroup.mk u := + (higherUnitQuotient_mk_eq_mk_iff_sub_mem + π n u v).2 hsub + simpa [hq] using hs) + +/-- The quotient map from adic units to a named discrete higher-unit stage +is continuous. -/ +theorem higherUnitQuotient_mk_continuous_adic + {O : Type*} [CommRing O] (π : O) (n : ℕ) : + Continuous fun u : WithTopology Oˣ + (adicUnitsTopology (uniformizerPowerIdeal π 1)) => + DiscreteHigherUnitQuotient.of π n + (QuotientGroup.mk u.ofTopology : Oˣ ⧸ higherUnitSubgroup π n) := by + let : TopologicalSpace O := (uniformizerPowerIdeal π 1).adicTopology + let : TopologicalSpace (Oˣ ⧸ higherUnitSubgroup π n) := ⊥ + let : DiscreteTopology (Oˣ ⧸ higherUnitSubgroup π n) := ⟨rfl⟩ + have hraw := higherUnitQuotient_mk_continuous_adic_raw π n + have hunderlying : Continuous fun u : + WithTopology Oˣ + (adicUnitsTopology (uniformizerPowerIdeal π 1)) => + (QuotientGroup.mk u.ofTopology : Oˣ ⧸ higherUnitSubgroup π n) := + hraw.comp (WithTopology.continuous_ofTopology + (adicUnitsTopology (uniformizerPowerIdeal π 1))) + have hmodel := + (DiscreteHigherUnitQuotient.homeomorph π n).symm.continuous.comp + hunderlying + change Continuous (fun u : WithTopology Oˣ + (adicUnitsTopology (uniformizerPowerIdeal π 1)) => + (DiscreteHigherUnitQuotient.equiv π n).symm + (QuotientGroup.mk u.ofTopology : Oˣ ⧸ higherUnitSubgroup π n)) at hmodel + simpa only [DiscreteHigherUnitQuotient.equiv_symm_apply] using hmodel + +private theorem continuous_unitHom_of_continuous_val + {A O : Type*} [Group A] [TopologicalSpace A] + [CommRing O] [TopologicalSpace O] + (f : A →* Oˣ) (hval : Continuous fun a => (f a : O)) + (hinv : Continuous (fun a : A => a⁻¹)) : Continuous f := by + apply Units.continuous_iff.mpr + refine ⟨hval, ?_⟩ + simpa only [Function.comp_def, map_inv] using hval.comp hinv + +/-- Identify adic units with compatible families of their discrete higher-unit quotients. -/ +noncomputable def unitsCompatibleFamiliesHomeomorph + {O : Type*} [CommRing O] [IsDomain O] [IsDiscreteValuationRing O] + {π : O} (hπ : Irreducible π) [IsAdicComplete (uniformizerPowerIdeal π 1) O] : + letI : TopologicalSpace O := (uniformizerPowerIdeal π 1).adicTopology + letI : (n : ℕ) → + TopologicalSpace (Oˣ ⧸ higherUnitSubgroup π (n + 1)) := fun _ => ⊥ + Oˣ ≃ₜ compatibleGroupFamilies + (fun n : ℕ => Oˣ ⧸ higherUnitSubgroup π (n + 1)) + (fun {_ _} hmn => dvrHigherUnitQuotientTransition π hmn) := by + letI : TopologicalSpace O := (uniformizerPowerIdeal π 1).adicTopology + letI : (n : ℕ) → + TopologicalSpace (Oˣ ⧸ higherUnitSubgroup π (n + 1)) := fun _ => ⊥ + letI : (n : ℕ) → + DiscreteTopology (Oˣ ⧸ higherUnitSubgroup π (n + 1)) := + fun _ => ⟨rfl⟩ + let e := (dvrUnitsEquivHigherUnitQuotientInverseLimit hπ).trans + (dvrHigherUnitQuotientInverseLimitRepresentation π) + let c := (dvrHigherUnitQuotientInverseLimitRepresentation π).toMonoidHom.comp + (unitsToHigherUnitQuotientInverseLimit π) + exact + { toFun := fun u => c u + invFun := fun q => e.symm q + left_inv := by + intro u + have hc : c u = e u := by + ext n + exact (dvrUnitsEquivHigherUnitQuotientInverseLimit_apply + hπ u n).symm + change e.symm (c u) = u + rw [hc] + exact e.left_inv u + right_inv := by + intro q + ext n + change (QuotientGroup.mk (e.symm q) : + Oˣ ⧸ higherUnitSubgroup π (n + 1)) = q.1 n + calc + (QuotientGroup.mk (e.symm q) : + Oˣ ⧸ higherUnitSubgroup π (n + 1)) = + (e (e.symm q)).1 n := + (dvrUnitsEquivHigherUnitQuotientInverseLimit_apply + hπ (e.symm q) n).symm + _ = q.1 n := by simp [e.apply_symm_apply q] + continuous_toFun := by + change Continuous fun u : Oˣ => c u + exact Continuous.subtype_mk + (continuous_pi fun n => by + simpa [c, unitsToHigherUnitQuotientInverseLimit] using + (higherUnitQuotient_mk_continuous_adic_raw π (n + 1))) + (by + intro u m n hmn + exact dvrHigherUnitQuotientTransition_mk π hmn u) + continuous_invFun := by + have hval : Continuous (fun q => ((e.symm q : Oˣ) : O)) := by + rw [continuous_iff_continuousAt] + intro q + rw [ContinuousAt, Filter.tendsto_def] + intro s hs + rcases (Ideal.hasBasis_nhds_adic (uniformizerPowerIdeal π 1) + ((e.symm q : Oˣ) : O)).mem_iff.mp hs with + ⟨n, _hn, hns⟩ + let cylinder : Set (compatibleGroupFamilies + (fun n : ℕ => Oˣ ⧸ higherUnitSubgroup π (n + 1)) + (fun {_ _} hmn => dvrHigherUnitQuotientTransition π hmn)) := + {q' | q'.1 n = q.1 n} + have hcont_coord : + Continuous fun q' : compatibleGroupFamilies + (fun n : ℕ => Oˣ ⧸ higherUnitSubgroup π (n + 1)) + (fun {_ _} hmn => dvrHigherUnitQuotientTransition π hmn) => + q'.1 n := by + exact (continuous_apply n).comp continuous_subtype_val + have hcyl_open : IsOpen cylinder := by + exact + (isOpen_discrete + ({q.1 n} : Set (Oˣ ⧸ higherUnitSubgroup π (n + 1)))).preimage + hcont_coord + have hqmem : q ∈ cylinder := rfl + exact mem_of_superset (hcyl_open.mem_nhds hqmem) (by + intro q' hq' + apply hns + have hmk : + (QuotientGroup.mk (e.symm q') : + Oˣ ⧸ higherUnitSubgroup π (n + 1)) = + QuotientGroup.mk (e.symm q) := by + calc + (QuotientGroup.mk (e.symm q') : + Oˣ ⧸ higherUnitSubgroup π (n + 1)) = + (e (e.symm q')).1 n := + (dvrUnitsEquivHigherUnitQuotientInverseLimit_apply + hπ (e.symm q') n).symm + _ = q'.1 n := by simp [e.apply_symm_apply q'] + _ = q.1 n := hq' + _ = (e (e.symm q)).1 n := by simp [e.apply_symm_apply q] + _ = QuotientGroup.mk (e.symm q) := + dvrUnitsEquivHigherUnitQuotientInverseLimit_apply + hπ (e.symm q) n + have hsub_succ : + ((e.symm q' : Oˣ) : O) - ((e.symm q : Oˣ) : O) ∈ + uniformizerPowerIdeal π (n + 1) := + (higherUnitQuotient_mk_eq_mk_iff_sub_mem + π (n + 1) (e.symm q) (e.symm q')).1 hmk + have hsub : + ((e.symm q' : Oˣ) : O) - ((e.symm q : Oˣ) : O) ∈ + (uniformizerPowerIdeal π 1) ^ n := by + rw [dvrPowerIdeal_one_pow π n] + exact dvrPowerIdeal_le_of_le π (Nat.le_succ n) hsub_succ + refine ⟨((e.symm q' : Oˣ) : O) - ((e.symm q : Oˣ) : O), hsub, ?_⟩ + change ((e.symm q : Oˣ) : O) + + (((e.symm q' : Oˣ) : O) - ((e.symm q : Oˣ) : O)) = + ((e.symm q' : Oˣ) : O) + ring) + have hinv : Continuous (fun q : compatibleGroupFamilies + (fun n : ℕ => Oˣ ⧸ higherUnitSubgroup π (n + 1)) + (fun {_ _} hmn => dvrHigherUnitQuotientTransition π hmn) => q⁻¹) := by + apply Continuous.subtype_mk + apply continuous_pi + intro n + exact ((continuous_apply n).comp continuous_subtype_val).inv + exact continuous_unitHom_of_continuous_val e.symm.toMonoidHom hval hinv } + +/-- The unit-group inverse-limit homeomorphism with the adic source and +prodiscrete target fixed at the type level. -/ +noncomputable def unitsEquivHigherUnitQuotientInverseLimitHomeomorph + {O : Type*} [CommRing O] [IsDomain O] [IsDiscreteValuationRing O] + {π : O} (hπ : Irreducible π) + [IsAdicComplete (uniformizerPowerIdeal π 1) O] : + WithTopology Oˣ + (adicUnitsTopology (uniformizerPowerIdeal π 1)) ≃ₜ + dvrHigherUnitQuotientInverseLimit π := by + letI : TopologicalSpace O := (uniformizerPowerIdeal π 1).adicTopology + letI : (n : ℕ) → TopologicalSpace + (Oˣ ⧸ higherUnitSubgroup π (n + 1)) := fun _ => ⊥ + let source := WithTopology.homeomorph + (α := Oˣ) + (topology := adicUnitsTopology (uniformizerPowerIdeal π 1)) + let algebraic := unitsCompatibleFamiliesHomeomorph hπ + let target := dvrHigherUnitQuotientInverseLimitRepresentationHomeomorph π + exact source.trans (algebraic.trans target.symm) + +/-- Complete-DVF specialization of the adic inverse-limit equivalence: the valuation ring is +canonically +isomorphic to its maximal-ideal adic completion. -/ +def completeDVFValuationSubringAdicCompletionAlgEquiv + {K : Type u} [Field K] + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) : + F.valuationSubring ≃ₐ[F.valuationSubring] + AdicCompletion F.maximalIdeal F.valuationSubring := + adicCompletionAlgEquiv F.maximalIdeal + +/-- Complete-DVF specialization of the adic inverse-limit equivalence: the valuation ring is the +explicit +projective limit of its finite quotients by powers of the maximal ideal. -/ +def completeDVFValuationSubringQuotientInverseLimitEquiv + {K : Type u} [Field K] + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) : + F.valuationSubring ≃+* + adicQuotientInverseLimit F.maximalIdeal := + adicQuotientInverseLimitEquiv F.maximalIdeal + +/-- The complete-DVF projective-limit isomorphism is coordinatewise reduction +modulo `𝔭^n`. -/ +theorem completeDVF_valuationSubring_quotientInverseLimitEquiv_apply + {K : Type u} [Field K] + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + (x : F.valuationSubring) (n : ℕ) : + adicQuotientInverseLimitEval F.maximalIdeal n + (completeDVFValuationSubringQuotientInverseLimitEquiv F x) = + Ideal.Quotient.mk (F.maximalIdeal ^ n) x := by + exact adicQuotientInverseLimitEquiv_apply F.maximalIdeal x n + +/-- Complete-DVF specialization of the adic inverse-limit equivalence, units of the valuation +ring agree +with units of its maximal-ideal adic completion. -/ +def completeDVFUnitsAdicCompletionUnitsEquiv + {K : Type u} [Field K] + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) : + F.valuationSubringˣ ≃* + (AdicCompletion F.maximalIdeal F.valuationSubring)ˣ := + adicCompletionUnitsEquiv F.maximalIdeal + +/-- The complete-DVF unit equivalence is induced by the canonical valuation-ring +map into the adic completion. -/ +theorem completeDVF_units_adicCompletionUnitsEquiv_apply + {K : Type u} [Field K] + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + (u : F.valuationSubringˣ) : + (completeDVFUnitsAdicCompletionUnitsEquiv F u : + AdicCompletion F.maximalIdeal F.valuationSubring) = + completeDVFValuationSubringAdicCompletionAlgEquiv F + (u : F.valuationSubring) := by + rfl + +/-- Complete-DVF specialization of the adic inverse-limit equivalence, unit-coordinate +injectivity. -/ +theorem completeDVF_units_coordinates_injective + {K : Type u} [Field K] + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + {u₁ u₂ : F.valuationSubringˣ} + (h : + ∀ n : ℕ, + unitReduction (F.maximalIdeal ^ n) u₁ = + unitReduction (F.maximalIdeal ^ n) u₂) : + u₁ = u₂ := by + exact adicCompletion_units_coordinates_injective + F.maximalIdeal h + +/-- Complete-DVF specialization of the adic inverse-limit equivalence, unit-coordinate +surjectivity against +the adic completion. -/ +theorem completeDVF_units_coordinates_surjective + {K : Type u} [Field K] + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + (z : (AdicCompletion F.maximalIdeal F.valuationSubring)ˣ) : + ∃ u : F.valuationSubringˣ, + completeDVFUnitsAdicCompletionUnitsEquiv F u = z ∧ + ∀ n : ℕ, + unitReduction (F.maximalIdeal ^ n) u = + Units.map (AdicCompletion.evalₐ F.maximalIdeal n).toMonoidHom z := by + exact adicCompletion_units_coordinates_surjective F.maximalIdeal z + +/-- Complete-DVF specialization of the adic inverse-limit equivalence: units of the valuation +ring are the +projective limit of the units of the finite quotient rings. -/ +def completeDVFUnitsEquivUnitInverseLimit + {K : Type u} [Field K] + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) : + F.valuationSubringˣ ≃* + adicUnitInverseLimit F.maximalIdeal := + unitsEquivUnitInverseLimit F.maximalIdeal + +/-- The complete-DVF unit projective-limit isomorphism is coordinatewise unit +reduction modulo `𝔭^n`. -/ +theorem completeDVF_unitsEquivUnitInverseLimit_apply + {K : Type u} [Field K] + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + (u : F.valuationSubringˣ) (n : ℕ) : + adicUnitInverseLimitEval F.maximalIdeal n + (completeDVFUnitsEquivUnitInverseLimit F u) = + unitReduction (F.maximalIdeal ^ n) u := by + exact unitsEquivUnitInverseLimit_apply F.maximalIdeal u n + +/-- Complete-DVF specialization of the adic inverse-limit equivalence, finite unit quotient form: +`𝒪ˣ / ker(𝒪ˣ → (𝒪/𝔭ⁿ)ˣ) ≃ (𝒪/𝔭ⁿ)ˣ` for `n ≥ 1`. -/ +noncomputable def completeDVFUnitsModMaximalIdealPowEquiv + {K : Type u} [Field K] + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + {n : ℕ} (hn : 1 ≤ n) : + F.valuationSubringˣ ⧸ + (unitReduction (F.maximalIdeal ^ n)).ker ≃* + (F.valuationSubring ⧸ F.maximalIdeal ^ n)ˣ := by + exact unitsModMaximalIdealPowEquiv + (R := F.valuationSubring) hn + +/-- The complete-DVF finite unit quotient equivalence is induced by reduction +modulo `𝔭ⁿ`. -/ +theorem completeDVF_unitsModMaximalIdealPowEquiv_mk + {K : Type u} [Field K] + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + {n : ℕ} (hn : 1 ≤ n) (u : F.valuationSubringˣ) : + completeDVFUnitsModMaximalIdealPowEquiv F hn + (QuotientGroup.mk u) = + unitReduction (F.maximalIdeal ^ n) u := by + exact unitsModMaximalIdealPowEquiv_mk + (R := F.valuationSubring) hn u + +/-- The adic inverse-limit equivalence, injectivity source: an element of the valuation ring is +determined by all of its reductions modulo powers of the maximal ideal. -/ +theorem completeDVF_valuationSubring_quotient_coordinates_injective + {K : Type u} [Field K] + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + {x y : F.valuationSubring} + (h : + ∀ n : ℕ, + Ideal.Quotient.mk (F.maximalIdeal ^ n) x = + Ideal.Quotient.mk (F.maximalIdeal ^ n) y) : + x = y := by + have hsub : + ∀ n : ℕ, x - y ∈ F.maximalIdeal ^ n := by + intro n + exact + (Ideal.Quotient.mk_eq_mk_iff_sub_mem + (I := F.maximalIdeal ^ n) + (x := x) (y := y)).1 (h n) + exact sub_eq_zero.mp (F.eq_zero_of_mem_maximalIdeal_pow_all hsub) + +/-- The adic inverse-limit equivalence, unit injectivity source: a unit is determined by all of +its reductions modulo powers of the maximal ideal. -/ +theorem completeDVF_units_quotient_coordinates_injective + {K : Type u} [Field K] + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) + {u₁ u₂ : F.valuationSubringˣ} + (h : + ∀ n : ℕ, + Ideal.Quotient.mk (F.maximalIdeal ^ n) (u₁ : F.valuationSubring) = + Ideal.Quotient.mk (F.maximalIdeal ^ n) (u₂ : F.valuationSubring)) : + u₁ = u₂ := by + exact F.unit_eq_of_idealQuotient_eq_all h + +/-! ### Direct complete-valued-field form of the adic inverse-limit equivalence -/ + +/-- The adic inverse-limit equivalence, direct algebraic endpoint from valued-field completeness: +the canonical map from the valuation ring to the positive-indexed inverse +limit of its maximal-ideal quotients is a ring equivalence. -/ +def completeValuedFieldValuationSubringEquivPositiveQuotientInverseLimit + {K : Type u} [Field K] {Gamma : Type v} + [LinearOrderedCommGroupWithZero Gamma] [MulArchimedean Gamma] + [Valued K Gamma] + [(Valued.v : Valuation K Gamma).IsRankOneDiscrete] + [CompleteSpace K] : + let val := (Valued.v : Valuation K Gamma) + let O := val.valuationSubring + let m := IsLocalRing.maximalIdeal O + O ≃+* adicPositiveQuotientInverseLimit m := by + dsimp only + let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K := + completeDVFOfCompleteValuedField (K := K) (Gamma := Gamma) + exact + (completeDVFValuationSubringQuotientInverseLimitEquiv F).trans + (adicQuotientInverseLimitEquivPositive F.maximalIdeal) + +/-- The direct valuation-ring equivalence is the canonical map, +coordinatewise reduction modulo `𝓅^(n+1)`. -/ +theorem completeValuedField_valuationSubringEquivPositiveQuotientInverseLimit_apply + {K : Type u} [Field K] {Gamma : Type v} + [LinearOrderedCommGroupWithZero Gamma] [MulArchimedean Gamma] + [Valued K Gamma] + [(Valued.v : Valuation K Gamma).IsRankOneDiscrete] + [CompleteSpace K] + (x : (Valued.v : Valuation K Gamma).valuationSubring) (n : ℕ) : + adicPositiveQuotientInverseLimitEval + (IsLocalRing.maximalIdeal + (Valued.v : Valuation K Gamma).valuationSubring) n + (completeValuedFieldValuationSubringEquivPositiveQuotientInverseLimit + (K := K) (Gamma := Gamma) x) = + Ideal.Quotient.mk + ((IsLocalRing.maximalIdeal + (Valued.v : Valuation K Gamma).valuationSubring) ^ (n + 1)) x := by + let val := (Valued.v : Valuation K Gamma) + let O := val.valuationSubring + let m := IsLocalRing.maximalIdeal O + let : IsAdicComplete m O := + rankOneDiscreteValuationSubring_isAdicComplete + (K := K) (Gamma := Gamma) + change + adicPositiveQuotientInverseLimitEval m n + (adicPositiveQuotientInverseLimitEquiv m x) = + Ideal.Quotient.mk (m ^ (n + 1)) x + exact adicPositiveQuotientInverseLimitEquiv_apply m x n + +/-- The adic inverse-limit equivalence, direct topological endpoint: with the native valued +topology on the valuation ring and discrete topology at every finite stage, +the canonical ring equivalence is a homeomorphism. -/ +def completeValuedFieldValuationSubringPositiveQuotientInverseLimitHomeomorph + {K : Type u} [Field K] {Gamma : Type v} + [LinearOrderedCommGroupWithZero Gamma] [MulArchimedean Gamma] + [Valued K Gamma] + [(Valued.v : Valuation K Gamma).IsRankOneDiscrete] + [CompleteSpace K] : + let val := (Valued.v : Valuation K Gamma) + let O := val.valuationSubring + let m := IsLocalRing.maximalIdeal O + O ≃ₜ adicPositiveQuotientInverseLimit m := by + dsimp only + let val := (Valued.v : Valuation K Gamma) + let O := val.valuationSubring + let m := IsLocalRing.maximalIdeal O + letI : IsAdicComplete m O := + rankOneDiscreteValuationSubring_isAdicComplete + (K := K) (Gamma := Gamma) + have hadic : IsAdic m := + rankOneDiscreteValuationSubring_isAdic + (K := K) (Gamma := Gamma) + let hAdic := adicPositiveQuotientInverseLimitHomeomorph m + let hNative := hadic.symm ▸ hAdic + exact + (WithTopology.homeomorph + (α := O) + (topology := (inferInstance : TopologicalSpace O))).symm.trans hNative + +/-- A uniformizer of a complete rank-one discrete valued field is irreducible +in its valuation ring. -/ +theorem completeValuedField_uniformizer_irreducible + {K : Type u} [Field K] {Gamma : Type v} + [LinearOrderedCommGroupWithZero Gamma] + [Valued K Gamma] + [(Valued.v : Valuation K Gamma).IsRankOneDiscrete] + {pi : (Valued.v : Valuation K Gamma).valuationSubring} + (hpi : (Valued.v : Valuation K Gamma).IsUniformizer (pi : K)) : + Irreducible pi := by + let val := (Valued.v : Valuation K Gamma) + let F : ValuationTheory.DiscreteValuationField.DVF.{u, v} K := + { ValueGroup := Gamma + valuation := val } + let : IsDiscreteValuationRing val.valuationSubring := + rankOneDiscreteValuationSubring_isDiscreteValuationRing + (K := K) (Gamma := Gamma) + exact (IsDiscreteValuationRing.irreducible_iff_uniformizer pi).2 + (F.maximalIdeal_eq_span_uniformizer hpi) + +/-- For a uniformizer, the first principal-power ideal is the maximal +ideal of the valuation ring. -/ +theorem completeValuedField_uniformizerPowerIdeal_one_eq_maximalIdeal + {K : Type u} [Field K] {Gamma : Type v} + [LinearOrderedCommGroupWithZero Gamma] + [Valued K Gamma] + [(Valued.v : Valuation K Gamma).IsRankOneDiscrete] + {pi : (Valued.v : Valuation K Gamma).valuationSubring} + (hpi : (Valued.v : Valuation K Gamma).IsUniformizer (pi : K)) : + uniformizerPowerIdeal pi 1 = + IsLocalRing.maximalIdeal + (Valued.v : Valuation K Gamma).valuationSubring := by + let val := (Valued.v : Valuation K Gamma) + let F : ValuationTheory.DiscreteValuationField.DVF.{u, v} K := + { ValueGroup := Gamma + valuation := val } + rw [uniformizerPowerIdeal, pow_one] + change Ideal.span {pi} = + IsLocalRing.maximalIdeal + (Valued.v : Valuation K Gamma).valuationSubring + have h := F.maximalIdeal_eq_span_uniformizer hpi + change IsLocalRing.maximalIdeal + (Valued.v : Valuation K Gamma).valuationSubring = + Ideal.span {pi} at h + exact h.symm + +/-- Completeness of the valued field supplies completeness for the principal +uniformizer filtration used by the higher-unit quotients. -/ +theorem completeValuedField_uniformizerIdeal_isAdicComplete + {K : Type u} [Field K] {Gamma : Type v} + [LinearOrderedCommGroupWithZero Gamma] [MulArchimedean Gamma] + [Valued K Gamma] + [(Valued.v : Valuation K Gamma).IsRankOneDiscrete] + [CompleteSpace K] + {pi : (Valued.v : Valuation K Gamma).valuationSubring} + (hpi : (Valued.v : Valuation K Gamma).IsUniformizer (pi : K)) : + IsAdicComplete (uniformizerPowerIdeal pi 1) + (Valued.v : Valuation K Gamma).valuationSubring := by + rw [completeValuedField_uniformizerPowerIdeal_one_eq_maximalIdeal hpi] + exact rankOneDiscreteValuationSubring_isAdicComplete + (K := K) (Gamma := Gamma) + +/-- The native topology of the valuation ring is also the principal +uniformizer-adic topology. -/ +theorem completeValuedField_uniformizerIdeal_isAdic + {K : Type u} [Field K] {Gamma : Type v} + [LinearOrderedCommGroupWithZero Gamma] [MulArchimedean Gamma] + [Valued K Gamma] + [(Valued.v : Valuation K Gamma).IsRankOneDiscrete] + [CompleteSpace K] + {pi : (Valued.v : Valuation K Gamma).valuationSubring} + (hpi : (Valued.v : Valuation K Gamma).IsUniformizer (pi : K)) : + IsAdic (uniformizerPowerIdeal pi 1) := by + rw [completeValuedField_uniformizerPowerIdeal_one_eq_maximalIdeal hpi] + exact rankOneDiscreteValuationSubring_isAdic + (K := K) (Gamma := Gamma) + +/-- The adic inverse-limit equivalence, direct unit-group endpoint from valued-field +completeness: the canonical map `𝒪ˣ → lim 𝒪ˣ/U⁽ⁿ⁾` is a +multiplicative equivalence. -/ +def completeValuedFieldUnitsEquivHigherUnitQuotientInverseLimit + {K : Type u} [Field K] {Gamma : Type v} + [LinearOrderedCommGroupWithZero Gamma] [MulArchimedean Gamma] + [Valued K Gamma] + [(Valued.v : Valuation K Gamma).IsRankOneDiscrete] + [CompleteSpace K] + {pi : (Valued.v : Valuation K Gamma).valuationSubring} + (hpi : (Valued.v : Valuation K Gamma).IsUniformizer (pi : K)) : + (Valued.v : Valuation K Gamma).valuationSubringˣ ≃* + dvrHigherUnitQuotientInverseLimit pi := by + let O := (Valued.v : Valuation K Gamma).valuationSubring + letI : IsDiscreteValuationRing O := + rankOneDiscreteValuationSubring_isDiscreteValuationRing + (K := K) (Gamma := Gamma) + letI : IsAdicComplete (uniformizerPowerIdeal pi 1) O := + completeValuedField_uniformizerIdeal_isAdicComplete hpi + exact dvrUnitsEquivHigherUnitQuotientInverseLimit + (completeValuedField_uniformizer_irreducible hpi) + +/-- The direct unit equivalence is coordinatewise the canonical quotient map +`u ↦ u mod U⁽ⁿ⁺¹⁾`. -/ +theorem completeValuedField_unitsEquivHigherUnitQuotientInverseLimit_apply + {K : Type u} [Field K] {Gamma : Type v} + [LinearOrderedCommGroupWithZero Gamma] [MulArchimedean Gamma] + [Valued K Gamma] + [(Valued.v : Valuation K Gamma).IsRankOneDiscrete] + [CompleteSpace K] + {pi : (Valued.v : Valuation K Gamma).valuationSubring} + (hpi : (Valued.v : Valuation K Gamma).IsUniformizer (pi : K)) + (u : (Valued.v : Valuation K Gamma).valuationSubringˣ) (n : ℕ) : + dvrHigherUnitQuotientInverseLimitEval pi n + (completeValuedFieldUnitsEquivHigherUnitQuotientInverseLimit + hpi u) = QuotientGroup.mk u := by + let O := (Valued.v : Valuation K Gamma).valuationSubring + let : IsDiscreteValuationRing O := + rankOneDiscreteValuationSubring_isDiscreteValuationRing + (K := K) (Gamma := Gamma) + let : IsAdicComplete (uniformizerPowerIdeal pi 1) O := + completeValuedField_uniformizerIdeal_isAdicComplete hpi + exact dvrUnitsEquivHigherUnitQuotientInverseLimit_apply + (completeValuedField_uniformizer_irreducible hpi) u n + +/-- The adic inverse-limit equivalence, direct topological unit endpoint: for the native topology +on `𝒪ˣ` and discrete topology on all finite quotients, the canonical +unit map is a homeomorphism. -/ +def completeValuedFieldUnitsHigherUnitQuotientInverseLimitHomeomorph + {K : Type u} [Field K] {Gamma : Type v} + [LinearOrderedCommGroupWithZero Gamma] [MulArchimedean Gamma] + [Valued K Gamma] + [(Valued.v : Valuation K Gamma).IsRankOneDiscrete] + [CompleteSpace K] + {pi : (Valued.v : Valuation K Gamma).valuationSubring} + (hpi : (Valued.v : Valuation K Gamma).IsUniformizer (pi : K)) : + let O := (Valued.v : Valuation K Gamma).valuationSubring + Oˣ ≃ₜ dvrHigherUnitQuotientInverseLimit pi := by + dsimp only + let O := (Valued.v : Valuation K Gamma).valuationSubring + letI : IsDiscreteValuationRing O := + rankOneDiscreteValuationSubring_isDiscreteValuationRing + (K := K) (Gamma := Gamma) + letI : IsAdicComplete (uniformizerPowerIdeal pi 1) O := + completeValuedField_uniformizerIdeal_isAdicComplete hpi + have hadic : IsAdic (uniformizerPowerIdeal pi 1) := + completeValuedField_uniformizerIdeal_isAdic hpi + let hirr := completeValuedField_uniformizer_irreducible hpi + let hAdic : + WithTopology Oˣ + (adicUnitsTopology (uniformizerPowerIdeal pi 1)) ≃ₜ + dvrHigherUnitQuotientInverseLimit pi := + unitsEquivHigherUnitQuotientInverseLimitHomeomorph hirr + have hUnitsTopology : + (inferInstance : TopologicalSpace Oˣ) = + adicUnitsTopology (uniformizerPowerIdeal pi 1) := by + unfold adicUnitsTopology + rw [← hadic] + let hNative : + WithTopology Oˣ + (inferInstance : TopologicalSpace Oˣ) ≃ₜ + dvrHigherUnitQuotientInverseLimit pi := + hUnitsTopology.symm ▸ hAdic + exact + (WithTopology.homeomorph + (α := Oˣ) + (topology := (inferInstance : TopologicalSpace Oˣ))).symm.trans hNative + +end Valuations +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean new file mode 100644 index 0000000000..a72b2da9cc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean @@ -0,0 +1,954 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.ValuedAdicComplete +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.CompatibleInverseLimit +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.Models +public import Mathlib.Algebra.Ring.TransferInstance +public import Mathlib.Topology.Homeomorph.TransferInstance +/-! +# Adic completion and inverse limits + +This file contains the algebraic and topological projective-limit descriptions +of adically complete rings, complete discrete valuation rings, and their unit +groups. +-/ + +@[expose] public section + +noncomputable +section + +namespace LubinTate +namespace Valuations + +open ValuationTheory.DiscreteValuationField +open ValuationTheory.Valuations +open Filter Set Topology +open scoped Valued + +/-- The adic inverse-limit equivalence, algebraic form: an adically complete ring is canonically +isomorphic to its adic completion. -/ +def adicCompletionAlgEquiv + {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] : + R ≃ₐ[R] AdicCompletion I R := + AdicCompletion.ofAlgEquiv I + +/-- The canonical isomorphism to the adic completion is induced by the usual +completion map. -/ +theorem adicCompletionAlgEquiv_apply + {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] (x : R) : + adicCompletionAlgEquiv I x = AdicCompletion.of I R x := by + exact AdicCompletion.ofAlgEquiv_apply (S := R) I x + +/-- The finite coordinates of the canonical adic-completion isomorphism are +the usual quotient classes modulo `I ^ n`. -/ +theorem adicCompletion_eval_apply + {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] + (n : ℕ) (x : R) : + AdicCompletion.evalₐ I n (adicCompletionAlgEquiv I x) = + Ideal.Quotient.mk (I ^ n) x := by + rw [adicCompletionAlgEquiv_apply] + exact AdicCompletion.evalₐ_of (R := R) I n x + +/-- The adic inverse-limit equivalence, projective-limit surjectivity in coordinates: every +compatible adic-completion point is represented by a unique element of the +original complete ring, and all finite coordinates agree with reduction modulo +`I ^ n`. -/ +theorem adicCompletion_coordinates_surjective + {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] + (z : AdicCompletion I R) : + ∃ x : R, + adicCompletionAlgEquiv I x = z ∧ + ∀ n : ℕ, + Ideal.Quotient.mk (I ^ n) x = AdicCompletion.evalₐ I n z := by + refine ⟨(adicCompletionAlgEquiv I).symm z, ?_, ?_⟩ + · simp + · intro n + simp [adicCompletionAlgEquiv, + AdicCompletion.mk_ofAlgEquiv_symm] + +/-- The adic inverse-limit equivalence, uniqueness in coordinates: two elements with the same +finite reductions modulo every `I ^ n` are equal. -/ +theorem adicCompletion_coordinates_injective + {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] + {x y : R} + (h : + ∀ n : ℕ, + Ideal.Quotient.mk (I ^ n) x = Ideal.Quotient.mk (I ^ n) y) : + x = y := by + have hsub : ∀ n : ℕ, x - y ∈ I ^ n := by + intro n + exact + (Ideal.Quotient.mk_eq_mk_iff_sub_mem + (I := I ^ n) (x := x) (y := y)).1 (h n) + have hz : x - y = 0 := by + apply IsHausdorff.haus (show IsHausdorff I R from inferInstance) + intro n + rw [SModEq.zero, smul_eq_mul, Ideal.mul_top] + exact hsub n + exact sub_eq_zero.mp hz + +/-- A finite adic quotient with its discrete topology fixed in the type. -/ +structure DiscreteAdicQuotient + {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) where + /-- The underlying residue class modulo `I ^ n`. -/ + val : R ⧸ I ^ n + +namespace DiscreteAdicQuotient + +/-- Defines `equiv`. -/ +def equiv {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) : + DiscreteAdicQuotient I n ≃ R ⧸ I ^ n where + toFun := val + invFun := fun x => ⟨x⟩ + left_inv := fun x => by cases x; rfl + right_inv := fun _ => rfl + +/-- A discrete adic quotient inherits its commutative ring structure from the concrete quotient. -/ +instance {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) : + CommRing (DiscreteAdicQuotient I n) := + (equiv I n).commRing + +/-- Each adic quotient is equipped with the discrete topology. -/ +instance {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) : + TopologicalSpace (DiscreteAdicQuotient I n) := ⊥ + +/-- The selected topology on an adic quotient is discrete. -/ +instance {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) : + DiscreteTopology (DiscreteAdicQuotient I n) := + ⟨rfl⟩ + +/-- Defines `of`. -/ +def of {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) + (x : R ⧸ I ^ n) : DiscreteAdicQuotient I n := + ⟨x⟩ + +/-- Forgetting the discrete adic wrapper after insertion recovers the original quotient element. -/ +@[simp] +theorem val_of {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) + (x : R ⧸ I ^ n) : (of I n x).val = x := + rfl + +/-- The explicit boundary homeomorphism to the raw quotient equipped with +the discrete topology. -/ +def homeomorph {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) : + @Homeomorph (DiscreteAdicQuotient I n) (R ⧸ I ^ n) + (inferInstance : TopologicalSpace (DiscreteAdicQuotient I n)) + (⊥ : TopologicalSpace (R ⧸ I ^ n)) := by + letI : TopologicalSpace (R ⧸ I ^ n) := ⊥ + letI : DiscreteTopology (R ⧸ I ^ n) := ⟨rfl⟩ + exact + { toEquiv := equiv I n + continuous_toFun := continuous_of_discreteTopology + continuous_invFun := continuous_of_discreteTopology } + +/-- The discrete adic homeomorphism evaluates as the underlying quotient equivalence. -/ +@[simp] +theorem homeomorph_apply {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) + (x : DiscreteAdicQuotient I n) : homeomorph I n x = x.val := + rfl + +/-- The inverse quotient equivalence inserts a concrete quotient into its discrete copy. -/ +@[simp] +theorem equiv_symm_apply {R : Type*} [CommRing R] + (I : Ideal R) (n : ℕ) (x : R ⧸ I ^ n) : + (equiv I n).symm x = of I n x := + rfl + +end DiscreteAdicQuotient + +/-- The adic inverse-limit object `lim_n R/I^n`. This is an opaque public +type; its compatible-family implementation is exposed only through the named +equivalence and coordinate API below. -/ +def adicQuotientInverseLimit + {R : Type*} [CommRing R] (I : Ideal R) : Type _ := + compatibleRingFamilies (fun n : ℕ => R ⧸ I ^ n) + (fun {_ _} hmn => Ideal.Quotient.factorPow I hmn) + +/-- The implementation representation of the all-level adic inverse limit. -/ +def adicQuotientInverseLimitCompatibleFamiliesEquiv + {R : Type*} [CommRing R] (I : Ideal R) : + adicQuotientInverseLimit I ≃ + compatibleRingFamilies (fun n : ℕ => R ⧸ I ^ n) + (fun {_ _} hmn => Ideal.Quotient.factorPow I hmn) := by + unfold adicQuotientInverseLimit + exact Equiv.refl _ + +/-- Compatible adic quotient families form a commutative ring coordinatewise. -/ +instance adicQuotientInverseLimit.instCommRing + {R : Type*} [CommRing R] (I : Ideal R) : + CommRing (adicQuotientInverseLimit I) := + (adicQuotientInverseLimitCompatibleFamiliesEquiv I).commRing + +/-- The algebraic representation equivalence of the all-level adic inverse +limit. -/ +def adicQuotientInverseLimitRepresentation + {R : Type*} [CommRing R] (I : Ideal R) : + adicQuotientInverseLimit I ≃+* + compatibleRingFamilies (fun n : ℕ => R ⧸ I ^ n) + (fun {_ _} hmn => Ideal.Quotient.factorPow I hmn) := + (adicQuotientInverseLimitCompatibleFamiliesEquiv I).ringEquiv + +/-- Build an all-level adic inverse-limit point from a compatible family. -/ +def adicQuotientInverseLimitMk + {R : Type*} [CommRing R] (I : Ideal R) + (x : ∀ n : ℕ, R ⧸ I ^ n) + (compatible : ∀ {m n : ℕ} (hmn : m ≤ n), + Ideal.Quotient.factorPow I hmn (x n) = x m) : + adicQuotientInverseLimit I := + (adicQuotientInverseLimitCompatibleFamiliesEquiv I).symm + ⟨x, compatible⟩ + +/-- Coordinate evaluation from the explicit projective limit. -/ +def adicQuotientInverseLimitEval + {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) : + adicQuotientInverseLimit I →+* R ⧸ I ^ n where + toFun x := (adicQuotientInverseLimitCompatibleFamiliesEquiv I x).1 n + map_one' := by rfl + map_mul' _ _ := by rfl + map_zero' := by rfl + map_add' _ _ := by rfl + +/-- Evaluation of an adic inverse-limit family returns its component at the selected level. -/ +@[simp] +theorem adicQuotientInverseLimit_eval_mk + {R : Type*} [CommRing R] (I : Ideal R) + (x : ∀ n : ℕ, R ⧸ I ^ n) + (compatible : ∀ {m n : ℕ} (hmn : m ≤ n), + Ideal.Quotient.factorPow I hmn (x n) = x m) + (n : ℕ) : + adicQuotientInverseLimitEval I n + (adicQuotientInverseLimitMk I x compatible) = x n := by + rfl + +/-- Adic inverse-limit elements are equal when all coordinate evaluations agree. -/ +@[ext] +theorem adicQuotientInverseLimit_ext + {R : Type*} [CommRing R] (I : Ideal R) + {x y : adicQuotientInverseLimit I} + (h : ∀ n : ℕ, adicQuotientInverseLimitEval I n x = + adicQuotientInverseLimitEval I n y) : + x = y := by + apply (adicQuotientInverseLimitCompatibleFamiliesEquiv I).injective + apply Subtype.ext + funext n + exact h n + +/-- The explicit projective-limit coordinates are compatible with quotient +transition maps. -/ +theorem adicQuotientInverseLimit_eval_factorPow + {R : Type*} [CommRing R] (I : Ideal R) + {m n : ℕ} (hmn : m ≤ n) + (x : adicQuotientInverseLimit I) : + Ideal.Quotient.factorPow I hmn + (adicQuotientInverseLimitEval I n x) = + adicQuotientInverseLimitEval I m x := + (adicQuotientInverseLimitCompatibleFamiliesEquiv I x).2 hmn + +/-- The canonical prodiscrete topology on the all-level inverse limit. The +finite quotient stages are discrete inside this one representation boundary; +their raw topology instances do not escape into public theorem statements. -/ +noncomputable instance adicQuotientInverseLimit.instTopologicalSpace + {R : Type*} [CommRing R] (I : Ideal R) : + TopologicalSpace (adicQuotientInverseLimit I) := by + letI : (n : ℕ) → TopologicalSpace (R ⧸ I ^ n) := fun _ => ⊥ + exact (adicQuotientInverseLimitCompatibleFamiliesEquiv I).topologicalSpace + +noncomputable def adicQuotientInverseLimitRepresentationHomeomorph + {R : Type*} [CommRing R] (I : Ideal R) : + letI : (n : ℕ) → TopologicalSpace (R ⧸ I ^ n) := fun _ => ⊥ + adicQuotientInverseLimit I ≃ₜ + compatibleRingFamilies (fun n : ℕ => R ⧸ I ^ n) + (fun {_ _} hmn => Ideal.Quotient.factorPow I hmn) := by + letI : (n : ℕ) → TopologicalSpace (R ⧸ I ^ n) := fun _ => ⊥ + exact (adicQuotientInverseLimitCompatibleFamiliesEquiv I).homeomorph + +/-- Coordinate evaluation into a type whose discreteness is recorded in the +type itself. -/ +def adicQuotientInverseLimitDiscreteEval + {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) : + adicQuotientInverseLimit I → DiscreteAdicQuotient I n := + fun x => DiscreteAdicQuotient.of I n + (adicQuotientInverseLimitEval I n x) + +/-- Evaluation from the adic inverse limit to each discrete quotient is continuous. -/ +theorem adicQuotientInverseLimit_discreteEval_continuous + {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) : + Continuous (adicQuotientInverseLimitDiscreteEval I n) := by + let : (n : ℕ) → TopologicalSpace (R ⧸ I ^ n) := fun _ => ⊥ + let representation := adicQuotientInverseLimitRepresentationHomeomorph I + have hraw : Continuous fun x : adicQuotientInverseLimit I => + (adicQuotientInverseLimitCompatibleFamiliesEquiv I x).1 n := + (continuous_apply n).comp + (continuous_subtype_val.comp representation.continuous) + have hmodel := + (DiscreteAdicQuotient.homeomorph I n).symm.continuous.comp hraw + change Continuous (fun x : adicQuotientInverseLimit I => + DiscreteAdicQuotient.of I n + ((adicQuotientInverseLimitCompatibleFamiliesEquiv I x).1 n)) + exact hmodel + +/-- The quotient algebra equivalence induced by equal ideals sends inverse +representatives as expected. -/ +theorem quotientEquivAlgOfEq_apply_symm + {R : Type*} [CommRing R] {I J : Ideal R} + (h₁ h₂ : I = J) (y : R ⧸ J) : + (Ideal.quotientEquivAlgOfEq R h₁) + ((Ideal.quotientEquivAlgOfEq R h₂).symm y) = y := by + refine Quotient.inductionOn' y ?_ + intro r + rw [Ideal.quotientEquivAlgOfEq_symm] + change (Ideal.quotientEquivAlgOfEq R h₁) + ((Ideal.quotientEquivAlgOfEq R h₂.symm) (Ideal.Quotient.mk J r)) = + Ideal.Quotient.mk J r + rw [Ideal.quotientEquivAlgOfEq_mk] + rw [Ideal.quotientEquivAlgOfEq_mk] + +/-- Adic transition maps commute with quotient equivalences arising from equal powers. -/ +theorem transitionMap_quotientEquivAlgOfEq + {R : Type*} [CommRing R] (I : Ideal R) + {m n : ℕ} (hmn : m ≤ n) + (hm : (I ^ m • ⊤ : Ideal R) = I ^ m) + (hn : (I ^ n • ⊤ : Ideal R) = I ^ n) + (y : R ⧸ I ^ n) : + (Ideal.quotientEquivAlgOfEq R hm) + (AdicCompletion.transitionMap I R hmn + ((Ideal.quotientEquivAlgOfEq R hn).symm y)) = + Ideal.Quotient.factorPow I hmn y := by + refine Quotient.inductionOn' y ?_ + intro r + rw [Ideal.quotientEquivAlgOfEq_symm] + change (Ideal.quotientEquivAlgOfEq R hm) + (AdicCompletion.transitionMap I R hmn + ((Ideal.quotientEquivAlgOfEq R hn.symm) + (Ideal.Quotient.mk (I ^ n) r))) = + Ideal.Quotient.factorPow I hmn (Ideal.Quotient.mk (I ^ n) r) + rw [Ideal.quotientEquivAlgOfEq_mk] + rw [AdicCompletion.transitionMap_ideal_mk] + rw [Ideal.quotientEquivAlgOfEq_mk] + rfl + +/-- The finite quotient coordinates of an adic-completion point are compatible +under the transition maps. -/ +theorem adicCompletion_eval_factorPow + {R : Type*} [CommRing R] (I : Ideal R) + {m n : ℕ} (hmn : m ≤ n) (z : AdicCompletion I R) : + Ideal.Quotient.factorPow I hmn (AdicCompletion.evalₐ I n z) = + AdicCompletion.evalₐ I m z := by + rcases AdicCompletion.mk_surjective I R z with ⟨seq, rfl⟩ + simpa [AdicCompletion.evalₐ_mk, Ideal.Quotient.factorPow] using + (AdicCompletion.Ideal.mk_eq_mk I hmn seq) + +/-- The map from the adic completion to the explicit projective limit +`lim_n R/I^n`. -/ +def adicCompletionToQuotientInverseLimit + {R : Type*} [CommRing R] (I : Ideal R) : + AdicCompletion I R → adicQuotientInverseLimit I := + fun z => + adicQuotientInverseLimitMk I + (fun n => AdicCompletion.evalₐ I n z) + (fun hmn => adicCompletion_eval_factorPow I hmn z) + +/-- The inverse map from the explicit projective limit `lim_n R/I^n` to the +adic completion. -/ +def adicQuotientInverseLimitToCompletion + {R : Type*} [CommRing R] (I : Ideal R) : + adicQuotientInverseLimit I → AdicCompletion I R := + fun x => + ⟨fun n => + let h : (I ^ n • ⊤ : Ideal R) = I ^ n := by ext r; simp + (Ideal.quotientEquivAlgOfEq R h).symm + (adicQuotientInverseLimitEval I n x), + by + intro m n hmn + let hm : (I ^ m • ⊤ : Ideal R) = I ^ m := by ext r; simp + let hn : (I ^ n • ⊤ : Ideal R) = I ^ n := by ext r; simp + apply (Ideal.quotientEquivAlgOfEq R hm).injective + rw [transitionMap_quotientEquivAlgOfEq I hmn hm hn] + rw [quotientEquivAlgOfEq_apply_symm] + exact adicQuotientInverseLimit_eval_factorPow I hmn x⟩ + +/-- The map from the adic inverse limit to the completion has the prescribed +residue at every level. -/ +theorem adicQuotientInverseLimit_toCompletion_eval + {R : Type*} [CommRing R] (I : Ideal R) + (x : adicQuotientInverseLimit I) (n : ℕ) : + AdicCompletion.evalₐ I n + (adicQuotientInverseLimitToCompletion I x) = + adicQuotientInverseLimitEval I n x := by + change (Ideal.quotientEquivAlgOfEq R (by ext r; simp)) + ((adicQuotientInverseLimitToCompletion I x).val n) = + adicQuotientInverseLimitEval I n x + dsimp [adicQuotientInverseLimitToCompletion] + rw [quotientEquivAlgOfEq_apply_symm] + +/-- Mapping an inverse-limit family to the completion and back recovers the family. -/ +theorem adicQuotientInverseLimit_left_inverse + {R : Type*} [CommRing R] (I : Ideal R) (z : AdicCompletion I R) : + adicQuotientInverseLimitToCompletion I + (adicCompletionToQuotientInverseLimit I z) = z := by + apply AdicCompletion.ext_evalₐ + intro n + rw [adicQuotientInverseLimit_toCompletion_eval] + rfl + +/-- Mapping a completion element to its residue family and back recovers the element. -/ +theorem adicQuotientInverseLimit_right_inverse + {R : Type*} [CommRing R] (I : Ideal R) + (x : adicQuotientInverseLimit I) : + adicCompletionToQuotientInverseLimit I + (adicQuotientInverseLimitToCompletion I x) = x := by + ext n + change AdicCompletion.evalₐ I n + (adicQuotientInverseLimitToCompletion I x) = + adicQuotientInverseLimitEval I n x + rw [adicQuotientInverseLimit_toCompletion_eval] + +/-- The adic inverse-limit equivalence, algebraic projective-limit form: +the adic completion is canonically isomorphic to `lim_n R/I^n`. -/ +def adicCompletionEquivQuotientInverseLimit + {R : Type*} [CommRing R] (I : Ideal R) : + AdicCompletion I R ≃+* adicQuotientInverseLimit I where + toFun := adicCompletionToQuotientInverseLimit I + invFun := adicQuotientInverseLimitToCompletion I + left_inv := adicQuotientInverseLimit_left_inverse I + right_inv := adicQuotientInverseLimit_right_inverse I + map_mul' x y := by + ext n + change AdicCompletion.evalₐ I n (x * y) = + AdicCompletion.evalₐ I n x * AdicCompletion.evalₐ I n y + simp + map_add' x y := by + ext n + change AdicCompletion.evalₐ I n (x + y) = + AdicCompletion.evalₐ I n x + AdicCompletion.evalₐ I n y + simp + +/-- The adic inverse-limit equivalence, canonical map from a ring to the explicit projective +limit of its quotients. -/ +def adicQuotientInverseLimitCanonicalMap + {R : Type*} [CommRing R] (I : Ideal R) : + R →+* adicQuotientInverseLimit I where + toFun x := adicQuotientInverseLimitMk I + (fun n => Ideal.Quotient.mk (I ^ n) x) + (fun _ => rfl) + map_one' := by ext n; rfl + map_mul' x y := by ext n; rfl + map_zero' := by ext n; rfl + map_add' x y := by ext n; rfl + +/-- The adic inverse-limit equivalence, if `R` is complete for the `I`-adic topology, the +canonical map `R → lim_n R/I^n` is a ring isomorphism. -/ +def adicQuotientInverseLimitEquiv + {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] : + R ≃+* adicQuotientInverseLimit I := + (adicCompletionAlgEquiv I).toRingEquiv.trans + (adicCompletionEquivQuotientInverseLimit I) + +/-- The complete-ring projective-limit isomorphism is induced by reduction +modulo `I^n` in each coordinate. -/ +theorem adicQuotientInverseLimitEquiv_apply + {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] + (x : R) (n : ℕ) : + adicQuotientInverseLimitEval I n + (adicQuotientInverseLimitEquiv I x) = + Ideal.Quotient.mk (I ^ n) x := by + change AdicCompletion.evalₐ I n + (adicCompletionAlgEquiv I x) = + Ideal.Quotient.mk (I ^ n) x + rw [adicCompletion_eval_apply] + +/-- Reduction modulo `I^n` is continuous from the `I`-adic topology to the +discrete finite quotient topology. -/ +private theorem quotient_mk_continuous_adic_raw + {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) : + @Continuous R (R ⧸ I ^ n) I.adicTopology + (⊥ : TopologicalSpace (R ⧸ I ^ n)) + (Ideal.Quotient.mk (I ^ n)) := by + let : TopologicalSpace R := I.adicTopology + let : TopologicalSpace (R ⧸ I ^ n) := ⊥ + let : DiscreteTopology (R ⧸ I ^ n) := ⟨rfl⟩ + rw [continuous_iff_continuousAt] + intro x + change Filter.Tendsto (Ideal.Quotient.mk (I ^ n)) (𝓝 x) + (𝓝 (Ideal.Quotient.mk (I ^ n) x)) + rw [@nhds_discrete (R ⧸ I ^ n) _ _] + rw [Filter.tendsto_def] + intro s hs + rw [mem_pure] at hs + exact (Ideal.hasBasis_nhds_adic I x).mem_iff.mpr ⟨n, trivial, by + intro y hy + rcases hy with ⟨z, hz, rfl⟩ + have hq : Ideal.Quotient.mk (I ^ n) (x + z) = + Ideal.Quotient.mk (I ^ n) x := by + apply Ideal.Quotient.eq.mpr + simpa [sub_eq_add_neg, add_comm, add_left_comm, add_assoc] using hz + simpa [hq] using hs⟩ + +/-- Reduction from the type-level adic ring to the named discrete quotient +model is continuous. -/ +theorem quotient_mk_continuous_adic + {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) : + Continuous fun x : + WithTopology R I.adicTopology => + DiscreteAdicQuotient.of I n + (Ideal.Quotient.mk (I ^ n) x.ofTopology) := by + let : TopologicalSpace R := I.adicTopology + let : TopologicalSpace (R ⧸ I ^ n) := ⊥ + let : DiscreteTopology (R ⧸ I ^ n) := ⟨rfl⟩ + have hraw := quotient_mk_continuous_adic_raw I n + have hunderlying : + Continuous fun x : + WithTopology R I.adicTopology => + Ideal.Quotient.mk (I ^ n) x.ofTopology := + hraw.comp (WithTopology.continuous_ofTopology I.adicTopology) + have hmodel := + (DiscreteAdicQuotient.homeomorph I n).symm.continuous.comp hunderlying + convert hmodel using 1 + rfl + +noncomputable def adicQuotientCompatibleFamiliesHomeomorph + {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] : + letI : TopologicalSpace R := I.adicTopology + letI : (n : ℕ) → TopologicalSpace (R ⧸ I ^ n) := fun _ => ⊥ + R ≃ₜ compatibleRingFamilies (fun n : ℕ => R ⧸ I ^ n) + (fun {_ _} hmn => Ideal.Quotient.factorPow I hmn) := by + letI : TopologicalSpace R := I.adicTopology + letI : (n : ℕ) → TopologicalSpace (R ⧸ I ^ n) := fun _ => ⊥ + letI : (n : ℕ) → DiscreteTopology (R ⧸ I ^ n) := fun _ => ⟨rfl⟩ + let e := (adicQuotientInverseLimitEquiv I).trans + (adicQuotientInverseLimitRepresentation I) + refine + { toFun := e + invFun := e.symm + left_inv := e.left_inv + right_inv := e.right_inv + continuous_toFun := ?_ + continuous_invFun := ?_ } + · exact Continuous.subtype_mk + (continuous_pi fun n => by + convert quotient_mk_continuous_adic_raw I n using 1 + funext x + exact adicCompletion_eval_apply I n x) + (fun x => by + intro m n hmn + exact adicCompletion_eval_factorPow I hmn + ((adicCompletionAlgEquiv I) x)) + · rw [continuous_iff_continuousAt] + intro q + rw [ContinuousAt] + rw [Filter.tendsto_def] + intro s hs + rcases (Ideal.hasBasis_nhds_adic I (e.symm q)).mem_iff.mp hs with + ⟨n, _hn, hns⟩ + let cylinder : Set + (compatibleRingFamilies (fun n : ℕ => R ⧸ I ^ n) + (fun {_ _} hmn => Ideal.Quotient.factorPow I hmn)) := + {q' | q'.1 n = q.1 n} + have hcont_coord : + Continuous fun q' : + compatibleRingFamilies (fun n : ℕ => R ⧸ I ^ n) + (fun {_ _} hmn => Ideal.Quotient.factorPow I hmn) => + q'.1 n := by + exact (continuous_apply n).comp continuous_subtype_val + have hcyl_open : IsOpen cylinder := by + exact (isOpen_discrete ({q.1 n} : Set (R ⧸ I ^ n))).preimage hcont_coord + have hqmem : q ∈ cylinder := rfl + exact mem_of_superset (hcyl_open.mem_nhds hqmem) (by + intro q' hq' + apply hns + have hred' : Ideal.Quotient.mk (I ^ n) (e.symm q') = q'.1 n := by + calc + Ideal.Quotient.mk (I ^ n) (e.symm q') = (e (e.symm q')).1 n := + (adicQuotientInverseLimitEquiv_apply I (e.symm q') n).symm + _ = q'.1 n := by + simp [e.apply_symm_apply q'] + have hred : Ideal.Quotient.mk (I ^ n) (e.symm q) = q.1 n := by + calc + Ideal.Quotient.mk (I ^ n) (e.symm q) = (e (e.symm q)).1 n := + (adicQuotientInverseLimitEquiv_apply I (e.symm q) n).symm + _ = q.1 n := by + simp [e.apply_symm_apply q] + have hmk : Ideal.Quotient.mk (I ^ n) (e.symm q') = + Ideal.Quotient.mk (I ^ n) (e.symm q) := by + rw [hred', hred, hq'] + have hmem : e.symm q' - e.symm q ∈ I ^ n := by + exact (Ideal.Quotient.mk_eq_mk_iff_sub_mem + (I := I ^ n) (x := e.symm q') (y := e.symm q)).1 hmk + refine ⟨e.symm q' - e.symm q, hmem, ?_⟩ + ring) + +/-- The canonical equivalence from an adically complete ring, represented by +an adic type-level source and the opaque prodiscrete inverse-limit target. -/ +noncomputable def adicQuotientInverseLimitHomeomorph + {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] : + WithTopology R I.adicTopology ≃ₜ + adicQuotientInverseLimit I := by + letI : TopologicalSpace R := I.adicTopology + letI : (n : ℕ) → TopologicalSpace (R ⧸ I ^ n) := fun _ => ⊥ + let source := WithTopology.homeomorph + (α := R) (topology := I.adicTopology) + let algebraic := adicQuotientCompatibleFamiliesHomeomorph I + let target := adicQuotientInverseLimitRepresentationHomeomorph I + exact source.trans (algebraic.trans target.symm) + +/-- The opaque positive-indexed projective-limit object +`lim_n R/I^(n+1)`. -/ +def adicPositiveQuotientInverseLimit + {R : Type*} [CommRing R] (I : Ideal R) : Type _ := + compatibleRingFamilies (fun n : ℕ => R ⧸ I ^ (n + 1)) + (fun {_ _} hmn => + Ideal.Quotient.factorPow I (Nat.succ_le_succ hmn)) + +/-- The implementation representation of the positive-indexed ring limit. -/ +def adicPositiveQuotientInverseLimitCompatibleFamiliesEquiv + {R : Type*} [CommRing R] (I : Ideal R) : + adicPositiveQuotientInverseLimit I ≃ + compatibleRingFamilies (fun n : ℕ => R ⧸ I ^ (n + 1)) + (fun {_ _} hmn => + Ideal.Quotient.factorPow I (Nat.succ_le_succ hmn)) := by + unfold adicPositiveQuotientInverseLimit + exact Equiv.refl _ + +/-- Positive-level compatible adic quotient families form a commutative ring. -/ +instance adicPositiveQuotientInverseLimit.instCommRing + {R : Type*} [CommRing R] (I : Ideal R) : + CommRing (adicPositiveQuotientInverseLimit I) := + (adicPositiveQuotientInverseLimitCompatibleFamiliesEquiv I).commRing + +/-- Defines `adicPositiveQuotientInverseLimitRepresentation`. -/ +def adicPositiveQuotientInverseLimitRepresentation + {R : Type*} [CommRing R] (I : Ideal R) : + adicPositiveQuotientInverseLimit I ≃+* + compatibleRingFamilies (fun n : ℕ => R ⧸ I ^ (n + 1)) + (fun {_ _} hmn => + Ideal.Quotient.factorPow I (Nat.succ_le_succ hmn)) := + (adicPositiveQuotientInverseLimitCompatibleFamiliesEquiv I).ringEquiv + +/-- Defines `adicPositiveQuotientInverseLimitMk`. -/ +def adicPositiveQuotientInverseLimitMk + {R : Type*} [CommRing R] (I : Ideal R) + (x : ∀ n : ℕ, R ⧸ I ^ (n + 1)) + (compatible : ∀ {m n : ℕ} (hmn : m ≤ n), + Ideal.Quotient.factorPow I (Nat.succ_le_succ hmn) (x n) = x m) : + adicPositiveQuotientInverseLimit I := + (adicPositiveQuotientInverseLimitCompatibleFamiliesEquiv I).symm + ⟨x, compatible⟩ + +/-- Defines `adicPositiveQuotientInverseLimitEval`. -/ +def adicPositiveQuotientInverseLimitEval + {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) : + adicPositiveQuotientInverseLimit I →+* R ⧸ I ^ (n + 1) where + toFun x := + (adicPositiveQuotientInverseLimitCompatibleFamiliesEquiv I x).1 n + map_one' := by rfl + map_mul' _ _ := by rfl + map_zero' := by rfl + map_add' _ _ := by rfl + +/-- Positive-level evaluation returns the selected adic quotient component. -/ +@[simp] +theorem adicPositiveQuotientInverseLimit_eval_mk + {R : Type*} [CommRing R] (I : Ideal R) + (x : ∀ n : ℕ, R ⧸ I ^ (n + 1)) + (compatible : ∀ {m n : ℕ} (hmn : m ≤ n), + Ideal.Quotient.factorPow I (Nat.succ_le_succ hmn) (x n) = x m) + (n : ℕ) : + adicPositiveQuotientInverseLimitEval I n + (adicPositiveQuotientInverseLimitMk I x compatible) = x n := by + rfl + +/-- Positive adic inverse-limit elements are determined by all of their components. -/ +@[ext] +theorem adicPositiveQuotientInverseLimit_ext + {R : Type*} [CommRing R] (I : Ideal R) + {x y : adicPositiveQuotientInverseLimit I} + (h : ∀ n : ℕ, adicPositiveQuotientInverseLimitEval I n x = + adicPositiveQuotientInverseLimitEval I n y) : + x = y := by + apply (adicPositiveQuotientInverseLimitCompatibleFamiliesEquiv I).injective + apply Subtype.ext + funext n + exact h n + +/-- Positive-level evaluation is compatible with the factor map between ideal powers. -/ +theorem adicPositiveQuotientInverseLimit_eval_factorPow + {R : Type*} [CommRing R] (I : Ideal R) + {m n : ℕ} (hmn : m ≤ n) + (x : adicPositiveQuotientInverseLimit I) : + Ideal.Quotient.factorPow I (Nat.succ_le_succ hmn) + (adicPositiveQuotientInverseLimitEval I n x) = + adicPositiveQuotientInverseLimitEval I m x := + (adicPositiveQuotientInverseLimitCompatibleFamiliesEquiv I x).2 hmn + +/-- The positive adic inverse limit carries the topology induced by its discrete coordinates. -/ +noncomputable instance adicPositiveQuotientInverseLimit.instTopologicalSpace + {R : Type*} [CommRing R] (I : Ideal R) : + TopologicalSpace (adicPositiveQuotientInverseLimit I) := by + letI : (n : ℕ) → TopologicalSpace (R ⧸ I ^ (n + 1)) := fun _ => ⊥ + exact + (adicPositiveQuotientInverseLimitCompatibleFamiliesEquiv I).topologicalSpace + +/-- Identify the positive adic inverse limit with its compatible families +of discrete coordinates. -/ +noncomputable def + adicPositiveQuotientInverseLimitRepresentationHomeomorph + {R : Type*} [CommRing R] (I : Ideal R) : + letI : (n : ℕ) → TopologicalSpace (R ⧸ I ^ (n + 1)) := fun _ => ⊥ + adicPositiveQuotientInverseLimit I ≃ₜ + compatibleRingFamilies (fun n : ℕ => R ⧸ I ^ (n + 1)) + (fun {_ _} hmn => + Ideal.Quotient.factorPow I (Nat.succ_le_succ hmn)) := by + letI : (n : ℕ) → TopologicalSpace (R ⧸ I ^ (n + 1)) := fun _ => ⊥ + exact + (adicPositiveQuotientInverseLimitCompatibleFamiliesEquiv I).homeomorph + +/-- Defines `adicPositiveQuotientInverseLimitDiscreteEval`. -/ +def adicPositiveQuotientInverseLimitDiscreteEval + {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) : + adicPositiveQuotientInverseLimit I → DiscreteAdicQuotient I (n + 1) := + fun x => DiscreteAdicQuotient.of I (n + 1) + (adicPositiveQuotientInverseLimitEval I n x) + +/-- Every positive-level coordinate evaluation into a discrete adic quotient is continuous. -/ +theorem adicPositiveQuotientInverseLimit_discreteEval_continuous + {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) : + Continuous (adicPositiveQuotientInverseLimitDiscreteEval I n) := by + let : (n : ℕ) → TopologicalSpace (R ⧸ I ^ (n + 1)) := fun _ => ⊥ + let representation := + adicPositiveQuotientInverseLimitRepresentationHomeomorph I + have hraw : Continuous fun x : adicPositiveQuotientInverseLimit I => + (adicPositiveQuotientInverseLimitCompatibleFamiliesEquiv I x).1 n := + (continuous_apply n).comp + (continuous_subtype_val.comp representation.continuous) + have hmodel := + (DiscreteAdicQuotient.homeomorph I (n + 1)).symm.continuous.comp hraw + change Continuous (fun x : adicPositiveQuotientInverseLimit I => + DiscreteAdicQuotient.of I (n + 1) + ((adicPositiveQuotientInverseLimitCompatibleFamiliesEquiv I x).1 n)) + exact hmodel + +/-- Defines `adicQuotientInverseLimitToPositive`. -/ +def adicQuotientInverseLimitToPositive + {R : Type*} [CommRing R] (I : Ideal R) : + adicQuotientInverseLimit I → + adicPositiveQuotientInverseLimit I := + fun x => + adicPositiveQuotientInverseLimitMk I + (fun n => adicQuotientInverseLimitEval I (n + 1) x) + (fun hmn => + adicQuotientInverseLimit_eval_factorPow I + (Nat.succ_le_succ hmn) x) + +/-- Defines `adicPositiveQuotientInverseLimitToAll`. -/ +def adicPositiveQuotientInverseLimitToAll + {R : Type*} [CommRing R] (I : Ideal R) : + adicPositiveQuotientInverseLimit I → + adicQuotientInverseLimit I := + fun x => + adicQuotientInverseLimitMk I (fun n => match n with + | 0 => 0 + | k + 1 => adicPositiveQuotientInverseLimitEval I k x) + (by + intro m n hmn + cases m with + | zero => + have : Subsingleton (R ⧸ I ^ 0) := by + simpa only [pow_zero, Ideal.one_eq_top] using + (inferInstance : Subsingleton (R ⧸ (⊤ : Ideal R))) + exact Subsingleton.elim _ _ + | succ m => + cases n with + | zero => cases hmn + | succ n => + exact adicPositiveQuotientInverseLimit_eval_factorPow I + (Nat.succ_le_succ_iff.mp hmn) x) + +/-- Restricting an all-level adic family to positive levels and extending back is the identity. -/ +theorem adicPositiveQuotientInverseLimit_toPositive_toAll + {R : Type*} [CommRing R] (I : Ideal R) + (x : adicPositiveQuotientInverseLimit I) : + adicQuotientInverseLimitToPositive I + (adicPositiveQuotientInverseLimitToAll I x) = x := by + ext n + rfl + +/-- Extending a positive-level adic family and restricting again is the identity. -/ +theorem adicQuotientInverseLimit_toAll_toPositive + {R : Type*} [CommRing R] (I : Ideal R) + (x : adicQuotientInverseLimit I) : + adicPositiveQuotientInverseLimitToAll I + (adicQuotientInverseLimitToPositive I x) = x := by + ext n + cases n with + | zero => + have : Subsingleton (R ⧸ I ^ 0) := by + simpa only [pow_zero, Ideal.one_eq_top] using + (inferInstance : Subsingleton (R ⧸ (⊤ : Ideal R))) + exact Subsingleton.elim _ _ + | succ n => + rfl + +/-- The all-level quotient inverse limit is equivalent to the canonical +positive-indexed one. -/ +def adicQuotientInverseLimitEquivPositive + {R : Type*} [CommRing R] (I : Ideal R) : + adicQuotientInverseLimit I ≃+* + adicPositiveQuotientInverseLimit I where + toFun := adicQuotientInverseLimitToPositive I + invFun := adicPositiveQuotientInverseLimitToAll I + left_inv := adicQuotientInverseLimit_toAll_toPositive I + right_inv := adicPositiveQuotientInverseLimit_toPositive_toAll I + map_mul' x y := by + ext n + rfl + map_add' x y := by + ext n + rfl + +/-- The adic inverse-limit equivalence, canonical map from a ring to the positive-indexed +projective limit of its quotients. -/ +def adicPositiveQuotientInverseLimitCanonicalMap + {R : Type*} [CommRing R] (I : Ideal R) : + R →+* adicPositiveQuotientInverseLimit I where + toFun x := adicPositiveQuotientInverseLimitMk I + (fun n => Ideal.Quotient.mk (I ^ (n + 1)) x) + (fun _ => rfl) + map_one' := by ext n; rfl + map_mul' x y := by ext n; rfl + map_zero' := by ext n; rfl + map_add' x y := by ext n; rfl + +/-- The adic inverse-limit equivalence, if `R` is complete for the `I`-adic topology, the +canonical map `R → lim_n R/I^(n+1)` is a ring isomorphism. -/ +def adicPositiveQuotientInverseLimitEquiv + {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] : + R ≃+* adicPositiveQuotientInverseLimit I := + (adicQuotientInverseLimitEquiv I).trans + (adicQuotientInverseLimitEquivPositive I) + +/-- The positive-indexed projective-limit isomorphism is induced by reduction +modulo `I^(n+1)` in each coordinate. -/ +theorem adicPositiveQuotientInverseLimitEquiv_apply + {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] + (x : R) (n : ℕ) : + adicPositiveQuotientInverseLimitEval I n + (adicPositiveQuotientInverseLimitEquiv I x) = + Ideal.Quotient.mk (I ^ (n + 1)) x := + adicQuotientInverseLimitEquiv_apply I x (n + 1) + +noncomputable def adicPositiveQuotientCompatibleFamiliesHomeomorph + {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] : + letI : TopologicalSpace R := I.adicTopology + letI : (n : ℕ) → TopologicalSpace (R ⧸ I ^ (n + 1)) := fun _ => ⊥ + R ≃ₜ compatibleRingFamilies (fun n : ℕ => R ⧸ I ^ (n + 1)) + (fun {_ _} hmn => + Ideal.Quotient.factorPow I (Nat.succ_le_succ hmn)) := by + letI : TopologicalSpace R := I.adicTopology + letI : (n : ℕ) → TopologicalSpace (R ⧸ I ^ (n + 1)) := fun _ => ⊥ + letI : (n : ℕ) → DiscreteTopology (R ⧸ I ^ (n + 1)) := fun _ => ⟨rfl⟩ + let e := (adicPositiveQuotientInverseLimitEquiv I).trans + (adicPositiveQuotientInverseLimitRepresentation I) + let c := (adicPositiveQuotientInverseLimitRepresentation I).toRingHom.comp + (adicPositiveQuotientInverseLimitCanonicalMap I) + refine + { toFun := fun x => c x + invFun := fun q => e.symm q + left_inv := ?_ + right_inv := ?_ + continuous_toFun := ?_ + continuous_invFun := ?_ } + · intro x + have hc : c x = e x := by + ext n + exact (adicPositiveQuotientInverseLimitEquiv_apply I x n).symm + change e.symm (c x) = x + rw [hc] + exact e.left_inv x + · intro q + ext n + change Ideal.Quotient.mk (I ^ (n + 1)) (e.symm q) = q.1 n + calc + Ideal.Quotient.mk (I ^ (n + 1)) (e.symm q) = (e (e.symm q)).1 n := + (adicPositiveQuotientInverseLimitEquiv_apply I (e.symm q) n).symm + _ = q.1 n := by simp [e.apply_symm_apply q] + · change Continuous fun x : R => c x + exact Continuous.subtype_mk + (continuous_pi fun n => by + simpa [c, adicPositiveQuotientInverseLimitCanonicalMap] using + (quotient_mk_continuous_adic_raw I (n + 1))) + (by + intro x m n hmn + rfl) + · rw [continuous_iff_continuousAt] + intro q + rw [ContinuousAt, Filter.tendsto_def] + intro s hs + rcases (Ideal.hasBasis_nhds_adic I (e.symm q)).mem_iff.mp hs with + ⟨n, _hn, hns⟩ + let cylinder : Set + (compatibleRingFamilies (fun n : ℕ => R ⧸ I ^ (n + 1)) + (fun {_ _} hmn => + Ideal.Quotient.factorPow I (Nat.succ_le_succ hmn))) := + {q' | q'.1 n = q.1 n} + have hcont_coord : + Continuous fun q' : compatibleRingFamilies + (fun n : ℕ => R ⧸ I ^ (n + 1)) + (fun {_ _} hmn => + Ideal.Quotient.factorPow I (Nat.succ_le_succ hmn)) => + q'.1 n := by + exact (continuous_apply n).comp continuous_subtype_val + have hcyl_open : IsOpen cylinder := by + exact + (isOpen_discrete ({q.1 n} : Set (R ⧸ I ^ (n + 1)))).preimage + hcont_coord + have hqmem : q ∈ cylinder := rfl + exact mem_of_superset (hcyl_open.mem_nhds hqmem) (by + intro q' hq' + apply hns + have hred' : Ideal.Quotient.mk (I ^ (n + 1)) (e.symm q') = q'.1 n := by + calc + Ideal.Quotient.mk (I ^ (n + 1)) (e.symm q') = (e (e.symm q')).1 n := + (adicPositiveQuotientInverseLimitEquiv_apply + I (e.symm q') n).symm + _ = q'.1 n := by simp [e.apply_symm_apply q'] + have hred : Ideal.Quotient.mk (I ^ (n + 1)) (e.symm q) = q.1 n := by + calc + Ideal.Quotient.mk (I ^ (n + 1)) (e.symm q) = (e (e.symm q)).1 n := + (adicPositiveQuotientInverseLimitEquiv_apply + I (e.symm q) n).symm + _ = q.1 n := by simp [e.apply_symm_apply q] + have hmk : Ideal.Quotient.mk (I ^ (n + 1)) (e.symm q') = + Ideal.Quotient.mk (I ^ (n + 1)) (e.symm q) := by + rw [hred', hred, hq'] + have hmem_succ : e.symm q' - e.symm q ∈ I ^ (n + 1) := by + exact (Ideal.Quotient.mk_eq_mk_iff_sub_mem + (I := I ^ (n + 1)) (x := e.symm q') (y := e.symm q)).1 hmk + have hmem : e.symm q' - e.symm q ∈ I ^ n := + Ideal.pow_le_pow_right (Nat.le_succ n) hmem_succ + refine ⟨e.symm q' - e.symm q, hmem, ?_⟩ + ring) + +/-- The positive-indexed topological inverse-limit equivalence with both +topologies fixed by their types. -/ +noncomputable def adicPositiveQuotientInverseLimitHomeomorph + {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] : + WithTopology R I.adicTopology ≃ₜ + adicPositiveQuotientInverseLimit I := by + letI : TopologicalSpace R := I.adicTopology + letI : (n : ℕ) → TopologicalSpace (R ⧸ I ^ (n + 1)) := fun _ => ⊥ + let source := WithTopology.homeomorph + (α := R) (topology := I.adicTopology) + let algebraic := adicPositiveQuotientCompatibleFamiliesHomeomorph I + let target := adicPositiveQuotientInverseLimitRepresentationHomeomorph I + exact source.trans (algebraic.trans target.symm) + +end Valuations +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicContractingFixedPoint.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicContractingFixedPoint.lean new file mode 100644 index 0000000000..9f437df625 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicContractingFixedPoint.lean @@ -0,0 +1,152 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.RingTheory.AdicCompletion.Basic +/-! +# Fixed points of adically contracting additive maps + +An additive endomorphism which sends `I ^ n` into `I ^ (n + 1)` is +topologically nilpotent for the `I`-adic topology. Completeness therefore +solves the affine fixed-point equation + +`x = b + T x` + +uniquely. The proof uses the successive approximations +`x₀ = 0`, `xₙ₊₁ = b + T xₙ` and mathlib's `IsPrecomplete.prec`. +-/ + +@[expose] public section + +namespace IsAdicComplete + +variable {R : Type*} [CommRing R] + +private def contractingApproximation + (T : R →+ R) (b : R) : ℕ → R + | 0 => 0 + | n + 1 => b + T (contractingApproximation T b n) + +private theorem contractingApproximation_succ + (T : R →+ R) (b : R) (n : ℕ) : + contractingApproximation T b (n + 1) = + b + T (contractingApproximation T b n) := + rfl + +private theorem ideal_smul_top_eq_self (J : Ideal R) : + J • (⊤ : Submodule R R) = (J : Submodule R R) := by + rw [Ideal.smul_top_eq_map, Algebra.algebraMap_self, Ideal.map_id, + Submodule.restrictScalars_self] + +private theorem map_smodEq_pow_succ + (I : Ideal R) (T : R →+ R) + (hT : ∀ (n : ℕ) {x : R}, x ∈ I ^ n → T x ∈ I ^ (n + 1)) + (n : ℕ) {x y : R} + (hxy : x ≡ y [SMOD (I ^ n : Ideal R)]) : + T x ≡ T y [SMOD (I ^ (n + 1) : Ideal R)] := by + rw [SModEq.sub_mem, ← T.map_sub] + exact hT n ((SModEq.sub_mem).1 hxy) + +private theorem contractingApproximation_sub_mem_pow + (I : Ideal R) (T : R →+ R) + (hT : ∀ (n : ℕ) {x : R}, x ∈ I ^ n → T x ∈ I ^ (n + 1)) + (b : R) : + ∀ n, contractingApproximation T b n - + contractingApproximation T b (n + 1) ∈ I ^ n := by + intro n + induction n with + | zero => + rw [pow_zero, Ideal.one_eq_top] + exact (Submodule.mem_top : + contractingApproximation T b 0 - + contractingApproximation T b (0 + 1) ∈ (⊤ : Ideal R)) + | succ n ih => + simpa only [contractingApproximation_succ, + add_sub_add_left_eq_sub, ← T.map_sub] using hT n ih + +private theorem contractingApproximation_limit_is_fixed + (I : Ideal R) [IsHausdorff I R] + (T : R →+ R) + (hT : ∀ (n : ℕ) {x : R}, x ∈ I ^ n → T x ∈ I ^ (n + 1)) + (b a : R) + (ha : ∀ n, contractingApproximation T b n ≡ + a [SMOD (I ^ n : Ideal R)]) : + a = b + T a := by + apply (IsHausdorff.eq_iff_smodEq (I := I)).2 + intro n + rw [ideal_smul_top_eq_self] + have hpow : + (I ^ (n + 1) : Ideal R) ≤ I ^ n := + Ideal.pow_le_pow_right (Nat.le_succ n) + have haleft : + a ≡ contractingApproximation T b (n + 1) + [SMOD (I ^ n : Ideal R)] := + SModEq.mono hpow (ha (n + 1)).symm + have hTcongr : + T (contractingApproximation T b n) ≡ T a + [SMOD (I ^ (n + 1) : Ideal R)] := + map_smodEq_pow_succ I T hT n (ha n) + have haright : + contractingApproximation T b (n + 1) ≡ b + T a + [SMOD (I ^ n : Ideal R)] := by + apply SModEq.mono hpow + simpa only [contractingApproximation_succ] using + SModEq.add + (SModEq.rfl : + b ≡ b [SMOD (I ^ (n + 1) : Ideal R)]) + hTcongr + exact haleft.trans haright + +private theorem eq_of_eq_add_of_maps_pow_succ + (I : Ideal R) [IsHausdorff I R] + (T : R →+ R) + (hT : ∀ (n : ℕ) {x : R}, x ∈ I ^ n → T x ∈ I ^ (n + 1)) + (b : R) {x y : R} + (hx : x = b + T x) (hy : y = b + T y) : + x = y := by + have hsub : ∀ n, x - y ∈ I ^ n := by + intro n + induction n with + | zero => + rw [pow_zero, Ideal.one_eq_top] + exact (Submodule.mem_top : x - y ∈ (⊤ : Ideal R)) + | succ n ih => + rw [hx, hy, add_sub_add_left_eq_sub, ← T.map_sub] + exact hT n ih + apply (IsHausdorff.eq_iff_smodEq (I := I)).2 + intro n + rw [ideal_smul_top_eq_self, SModEq.sub_mem] + exact hsub n + +/-- An additive endomorphism which raises the `I`-adic filtration by one +has a unique affine fixed point on an `I`-adically complete ring. -/ +theorem existsUnique_eq_add_of_maps_pow_succ + (I : Ideal R) [IsAdicComplete I R] + (T : R →+ R) + (hT : ∀ (n : ℕ) {x : R}, x ∈ I ^ n → T x ∈ I ^ (n + 1)) + (b : R) : + ∃! x : R, x = b + T x := by + let x : ℕ → R := contractingApproximation T b + have hcauchy : AdicCompletion.IsAdicCauchy I R x := + (AdicCompletion.isAdicCauchy_iff I R x).2 (by + intro n + rw [ideal_smul_top_eq_self, SModEq.sub_mem] + simpa only [x] using contractingApproximation_sub_mem_pow I T hT b n) + obtain ⟨a, ha⟩ := + (inferInstance : IsPrecomplete I R).prec hcauchy + have ha' : + ∀ n, x n ≡ a [SMOD (I ^ n : Ideal R)] := by + intro n + simpa only [ideal_smul_top_eq_self] using ha n + have hfix : a = b + T a := + contractingApproximation_limit_is_fixed I T hT b a (by + simpa only [x] using ha') + refine ⟨a, hfix, ?_⟩ + intro y hy + exact eq_of_eq_add_of_maps_pow_succ I T hT b hy hfix + +end IsAdicComplete diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/CompatibleInverseLimit.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/CompatibleInverseLimit.lean new file mode 100644 index 0000000000..e2dc6d1f0a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/CompatibleInverseLimit.lean @@ -0,0 +1,170 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Algebra.Ring.Subring.Basic +public import Mathlib.Algebra.Ring.Pi +/-! +# Compatible families in inverse systems + +The elementary inverse limits used in the local-field structure development are subobjects of + dependent +products: their elements are precisely the families preserved by every +transition map. Keeping this construction at the level of `Subring` and +`Subgroup` lets Lean inherit the ambient algebraic structure instead of +rebuilding the same pointwise instances for each inverse system. +-/ + +@[expose] public section + +namespace LubinTate + +/-- Families in a preorder-indexed system of rings that are preserved by all +transition maps. No coherence hypotheses on `transition` are needed merely +to form this subring; concrete inverse systems supply them separately when +they are used. -/ +def compatibleRingFamilies + {ι : Type*} [Preorder ι] (R : ι → Type*) [∀ i, Ring (R i)] + (transition : ∀ {i j : ι}, i ≤ j → R j →+* R i) : + Subring (∀ i, R i) where + carrier := + {x | ∀ {i j : ι} (hij : i ≤ j), transition hij (x j) = x i} + zero_mem' := by + intro i j hij + exact map_zero (transition hij) + one_mem' := by + intro i j hij + exact map_one (transition hij) + add_mem' hx hy := by + intro i j hij + simpa using congrArg₂ (· + ·) (hx hij) (hy hij) + mul_mem' hx hy := by + intro i j hij + simpa using congrArg₂ (· * ·) (hx hij) (hy hij) + neg_mem' hx := by + intro i j hij + simpa using congrArg Neg.neg (hx hij) + +/-- Families in a preorder-indexed system of groups that are preserved by all +transition maps. The resulting subtype inherits its group structure from +the dependent product. -/ +def compatibleGroupFamilies + {ι : Type*} [Preorder ι] (G : ι → Type*) [∀ i, Group (G i)] + (transition : ∀ {i j : ι}, i ≤ j → G j →* G i) : + Subgroup (∀ i, G i) where + carrier := + {x | ∀ {i j : ι} (hij : i ≤ j), transition hij (x j) = x i} + one_mem' := by + intro i j hij + exact map_one (transition hij) + mul_mem' hx hy := by + intro i j hij + simpa using congrArg₂ (· * ·) (hx hij) (hy hij) + inv_mem' hx := by + intro i j hij + simpa using congrArg Inv.inv (hx hij) + +/-- The group structure transported from the concrete compatible-family +subgroup. Declaring it explicitly keeps clients independent of reducibility +of `compatibleGroupFamilies`. -/ +instance compatibleGroupFamiliesGroup + {ι : Type*} [Preorder ι] (G : ι → Type*) [∀ i, Group (G i)] + (transition : ∀ {i j : ι}, i ≤ j → G j →* G i) : + Group (compatibleGroupFamilies G transition) := by + unfold compatibleGroupFamilies + infer_instance + +/-- Coordinatewise commutativity descends to the compatible-family inverse +limit. -/ +instance compatibleGroupFamiliesCommGroup + {ι : Type*} [Preorder ι] (G : ι → Type*) [∀ i, CommGroup (G i)] + (transition : ∀ {i j : ι}, i ≤ j → G j →* G i) : + CommGroup (compatibleGroupFamilies G transition) := + { (compatibleGroupFamiliesGroup G transition) with + mul_comm := fun x y => by + apply Subtype.ext + funext i + exact mul_comm (x.1 i) (y.1 i) } + +/-- Evaluation of a compatible family at one coordinate. -/ +def compatibleGroupFamiliesEval + {ι : Type*} [Preorder ι] (G : ι → Type*) [∀ i, Group (G i)] + (transition : ∀ {i j : ι}, i ≤ j → G j →* G i) (i : ι) : + compatibleGroupFamilies G transition →* G i := + (Pi.evalMonoidHom G i).comp (compatibleGroupFamilies G transition).subtype + +/-- Evaluation of a compatible group family returns its component at the chosen index. -/ +@[simp] +theorem compatibleGroupFamiliesEval_apply + {ι : Type*} [Preorder ι] (G : ι → Type*) [∀ i, Group (G i)] + (transition : ∀ {i j : ι}, i ≤ j → G j →* G i) + (i : ι) (x : compatibleGroupFamilies G transition) : + compatibleGroupFamiliesEval G transition i x = x.1 i := + rfl + +/-- The named compatibility law for an inverse-limit family. -/ +theorem compatibleGroupFamilies_transition + {ι : Type*} [Preorder ι] (G : ι → Type*) [∀ i, Group (G i)] + (transition : ∀ {i j : ι}, i ≤ j → G j →* G i) + (x : compatibleGroupFamilies G transition) {i j : ι} (hij : i ≤ j) : + transition hij (compatibleGroupFamiliesEval G transition j x) = + compatibleGroupFamiliesEval G transition i x := + x.2 hij + +/-- Compatible families are equal when all named coordinate evaluations +agree. -/ +@[ext] +theorem compatibleGroupFamilies_ext + {ι : Type*} [Preorder ι] (G : ι → Type*) [∀ i, Group (G i)] + (transition : ∀ {i j : ι}, i ≤ j → G j →* G i) + {x y : compatibleGroupFamilies G transition} + (h : ∀ i, compatibleGroupFamiliesEval G transition i x = + compatibleGroupFamiliesEval G transition i y) : x = y := by + apply Subtype.ext + funext i + exact h i + +/-- Stagewise multiplicative equivalences induce an equivalence of compatible +families when they commute with every transition map. This is the reusable +inverse-limit boundary behind the quotient-unit comparisons between finite quotient systems. -/ +def compatibleGroupFamiliesMulEquiv + {ι : Type*} [Preorder ι] + (G H : ι → Type*) [∀ i, Group (G i)] [∀ i, Group (H i)] + (transitionG : ∀ {i j : ι}, i ≤ j → G j →* G i) + (transitionH : ∀ {i j : ι}, i ≤ j → H j →* H i) + (e : ∀ i, G i ≃* H i) + (hcomm : ∀ {i j : ι} (hij : i ≤ j) (x : G j), + transitionH hij (e j x) = e i (transitionG hij x)) : + compatibleGroupFamilies G transitionG ≃* + compatibleGroupFamilies H transitionH where + toFun x := + ⟨fun i => e i (x.1 i), by + intro i j hij + rw [hcomm hij, x.2 hij]⟩ + invFun y := + ⟨fun i => (e i).symm (y.1 i), by + intro i j hij + apply (e i).injective + calc + e i (transitionG hij ((e j).symm (y.1 j))) = + transitionH hij (e j ((e j).symm (y.1 j))) := + (hcomm hij ((e j).symm (y.1 j))).symm + _ = transitionH hij (y.1 j) := by rw [(e j).apply_symm_apply] + _ = y.1 i := y.2 hij + _ = e i ((e i).symm (y.1 i)) := by rw [(e i).apply_symm_apply] + ⟩ + left_inv x := by + ext i + exact (e i).symm_apply_apply (x.1 i) + right_inv y := by + ext i + exact (e i).apply_symm_apply (y.1 i) + map_mul' x y := by + ext i + exact (e i).map_mul (x.1 i) (y.1 i) + +end LubinTate diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/Models.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/Models.lean new file mode 100644 index 0000000000..40d5dd2108 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/Models.lean @@ -0,0 +1,50 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import Mathlib.Topology.Homeomorph.Defs +public import Mathlib.Topology.Order +public import Mathlib.Topology.WithTopology +/-! +# Topological API for `WithTopology` + +This file adds only the two topology lemmas used by valuation theory. The +underlying type, topology, and basic API come directly from Mathlib. Algebraic +structures needed on a particular topology-indexed copy are installed at that +copy's owner rather than globally in the root `WithTopology` namespace. +-/ + +@[expose] public section + +universe u v + +namespace WithTopology + +variable {X : Type u} {t : TopologicalSpace X} + +/-- The canonical homeomorphism from Mathlib's topology-indexed copy to its +underlying carrier equipped with the indexed topology. -/ +def homeomorph {α : Type u} {topology : TopologicalSpace α} : + @Homeomorph (WithTopology α topology) α + (inferInstance : TopologicalSpace (WithTopology α topology)) topology where + toEquiv := WithTopology.equiv α topology + continuous_toFun := continuous_ofTopology topology + continuous_invFun := continuous_toTopology topology + +/-- Convergence in a topology-indexed copy is convergence of the underlying +points for the indexed topology. -/ +theorem tendsto_nhds_iff {ι : Type v} {l : Filter ι} + {f : ι → WithTopology X t} {x : WithTopology X t} : + Filter.Tendsto f l (nhds x) ↔ + Filter.Tendsto (fun i => (f i).ofTopology) l + (@nhds X t x.ofTopology) := by + have h := + (homeomorph (α := X) (topology := t)).isEmbedding.tendsto_nhds_iff + (f := f) (l := l) (y := x) + exact h + +end WithTopology diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/UniqueRing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/UniqueRing.lean new file mode 100644 index 0000000000..38874fab4c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/UniqueRing.lean @@ -0,0 +1,292 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +public import Mathlib.RingTheory.Valuation.RamificationGroup +public import Mathlib.FieldTheory.Normal.Basic + +/-! # Unique Ring -/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + hasExtension_valuation_of_valuationSubring_pullback → + hasExtension_valuation_of_valuationSubring_pullback + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + valuationSubring_pullback_of_hasExtension_valuation → + valuationSubring_pullback_of_hasExtension_valuation + +namespace ValuationTheory + +/-! +# The unique-extension characterization: automorphism invariance from unique extension + +The pullback of an extension valuation ring by a ground-field automorphism is +again an extension valuation ring. Hence uniqueness forces the chosen ring +to be fixed by every automorphism of the extension field. This is the first +Galois-theoretic step in the converse direction of the unique-extension characterization. +-/ + +noncomputable +section + +open scoped Pointwise + +namespace Valuations + +/-- Translating an extension valuation ring by a `K`-automorphism preserves +the extension property. -/ +theorem algEquiv_smul_valuationSubring_hasExtension + {K L : Type*} [Field K] [Field L] [Algebra K L] + (V : ValuationSubring K) (W : ValuationSubring L) + (hW : V.valuation.HasExtension W.valuation) + (σ : L ≃ₐ[K] L) : + V.valuation.HasExtension (σ • W).valuation := by + let : V.valuation.HasExtension W.valuation := hW + have hpullback : ∀ x : K, + algebraMap K L x ∈ (σ • W).toSubring ↔ x ∈ V.toSubring := by + intro x + calc + algebraMap K L x ∈ (σ • W).toSubring ↔ + algebraMap K L x ∈ (σ • W : ValuationSubring L) := + (σ • W).mem_toSubring (algebraMap K L x) + _ ↔ σ⁻¹ • algebraMap K L x ∈ W := + ValuationSubring.mem_pointwise_smul_iff_inv_smul_mem + _ ↔ algebraMap K L x ∈ W := by + simp + _ ↔ x ∈ V := by + simpa only [ValuationSubring.mem_toSubring, + ValuationSubring.valuationSubring_valuation] using + (valuationSubring_pullback_of_hasExtension_valuation + V.valuation W x) + _ ↔ x ∈ V.toSubring := (V.mem_toSubring x).symm + apply + hasExtension_valuation_of_valuationSubring_pullback + intro x + simpa only [ValuationSubring.mem_toSubring, + ValuationSubring.valuationSubring_valuation] using hpullback x + +/-- If the extension valuation ring is unique, every ground-field +automorphism stabilizes it. -/ +theorem algEquiv_smul_valuationSubring_eq_of_unique_extension + {K L : Type*} [Field K] [Field L] [Algebra K L] + (V : ValuationSubring K) (W : ValuationSubring L) + (hW : V.valuation.HasExtension W.valuation) + (huniq : ∀ W' : ValuationSubring L, + V.valuation.HasExtension W'.valuation → W' = W) + (σ : L ≃ₐ[K] L) : + σ • W = W := + huniq (σ • W) + (algEquiv_smul_valuationSubring_hasExtension V W hW σ) + +/-- The preceding equality in elementwise form. -/ +theorem algEquiv_mem_valuationSubring_iff_of_unique_extension + {K L : Type*} [Field K] [Field L] [Algebra K L] + (V : ValuationSubring K) (W : ValuationSubring L) + (hW : V.valuation.HasExtension W.valuation) + (huniq : ∀ W' : ValuationSubring L, + V.valuation.HasExtension W'.valuation → W' = W) + (σ : L ≃ₐ[K] L) (x : L) : + σ x ∈ W.toSubring ↔ x ∈ W.toSubring := by + have hstable := + algEquiv_smul_valuationSubring_eq_of_unique_extension V W hW huniq σ + constructor + · intro hx + have : σ x ∈ σ • W := by simpa [hstable] using hx + exact (ValuationSubring.smul_mem_pointwise_smul_iff + (g := σ) (S := W) (x := x)).1 this + · intro hx + have : σ x ∈ σ • W := + ValuationSubring.smul_mem_pointwise_smul σ x W hx + simpa [hstable] using this + +/-- A ground-field automorphism restricts to an automorphism of the unique +extension valuation ring. -/ +def valuationSubringEquivOfUniqueExtension + {K L : Type*} [Field K] [Field L] [Algebra K L] + (V : ValuationSubring K) (W : ValuationSubring L) + (hW : V.valuation.HasExtension W.valuation) + (huniq : ∀ W' : ValuationSubring L, + V.valuation.HasExtension W'.valuation → W' = W) + (σ : L ≃ₐ[K] L) : W ≃+* W where + toFun x := ⟨σ (x : L), + (algEquiv_mem_valuationSubring_iff_of_unique_extension + V W hW huniq σ (x : L)).2 x.2⟩ + invFun x := ⟨σ⁻¹ (x : L), + (algEquiv_mem_valuationSubring_iff_of_unique_extension + V W hW huniq σ⁻¹ (x : L)).2 x.2⟩ + left_inv x := by ext; simp + right_inv x := by ext; simp + map_mul' x y := by ext; simp + map_add' x y := by ext; simp + +/-- The unique-extension equivalence acts on underlying valuation-ring elements as expected. -/ +@[simp] +theorem coe_valuationSubringEquivOfUniqueExtension_apply + {K L : Type*} [Field K] [Field L] [Algebra K L] + (V : ValuationSubring K) (W : ValuationSubring L) + (hW : V.valuation.HasExtension W.valuation) + (huniq : ∀ W' : ValuationSubring L, + V.valuation.HasExtension W'.valuation → W' = W) + (σ : L ≃ₐ[K] L) (x : W) : + ((valuationSubringEquivOfUniqueExtension V W hW huniq σ x : W) : L) = + σ (x : L) := + rfl + +/-- The induced automorphism of the residue field of the unique extension +valuation ring. -/ +def residueFieldEquivOfUniqueExtension + {K L : Type*} [Field K] [Field L] [Algebra K L] + (V : ValuationSubring K) (W : ValuationSubring L) + (hW : V.valuation.HasExtension W.valuation) + (huniq : ∀ W' : ValuationSubring L, + V.valuation.HasExtension W'.valuation → W' = W) + (σ : L ≃ₐ[K] L) : + IsLocalRing.ResidueField W ≃+* IsLocalRing.ResidueField W := + IsLocalRing.ResidueField.mapEquiv + (valuationSubringEquivOfUniqueExtension V W hW huniq σ) + +/-- Reduction commutes with the automorphism induced on the unique +extension's residue field. -/ +theorem residueFieldEquivOfUniqueExtension_residue + {K L : Type*} [Field K] [Field L] [Algebra K L] + (V : ValuationSubring K) (W : ValuationSubring L) + (hW : V.valuation.HasExtension W.valuation) + (huniq : ∀ W' : ValuationSubring L, + V.valuation.HasExtension W'.valuation → W' = W) + (σ : L ≃ₐ[K] L) (x : W) : + residueFieldEquivOfUniqueExtension V W hW huniq σ + (IsLocalRing.residue W x) = + IsLocalRing.residue W + ⟨σ (x : L), + (algEquiv_mem_valuationSubring_iff_of_unique_extension + V W hW huniq σ (x : L)).2 x.2⟩ := by + change + IsLocalRing.ResidueField.map + (valuationSubringEquivOfUniqueExtension V W hW huniq σ : W →+* W) + (IsLocalRing.residue W x) = _ + rw [IsLocalRing.ResidueField.map_residue] + congr 1 + +/-- The canonical homomorphism from the base valuation ring into an extension +valuation ring, without identifying either ring with the valuation subring of +its canonical valuation. -/ +def valuationSubringMapOfHasExtension + {K L : Type*} [Field K] [Field L] [Algebra K L] + (V : ValuationSubring K) (W : ValuationSubring L) + (hW : V.valuation.HasExtension W.valuation) : V →+* W := by + letI : V.valuation.HasExtension W.valuation := hW + exact (algebraMap K L).restrict V.toSubring W.toSubring (by + intro x hx + exact + (valuationSubring_pullback_of_hasExtension_valuation + V.valuation W x).2 (by + simpa only [ValuationSubring.valuationSubring_valuation, + ValuationSubring.mem_toSubring] using hx)) + +/-- The canonical map of valuation rings attached to an extension is local. -/ +theorem valuationSubringMapOfHasExtension_isLocalHom + {K L : Type*} [Field K] [Field L] [Algebra K L] + (V : ValuationSubring K) (W : ValuationSubring L) + (hW : V.valuation.HasExtension W.valuation) : + IsLocalHom (valuationSubringMapOfHasExtension V W hW) := by + let : V.valuation.HasExtension W.valuation := hW + apply ((IsLocalRing.local_hom_TFAE + (valuationSubringMapOfHasExtension V W hW)).out 5 1).mp + ext x + rw [Ideal.mem_comap, W.valuation_lt_one_iff, V.valuation_lt_one_iff] + change + W.valuation (algebraMap K L (x : K)) < 1 ↔ + V.valuation (x : K) < 1 + exact + _root_.Valuation.HasExtension.val_map_lt_one_iff + V.valuation W.valuation (x : K) + +/-- The residue-field homomorphism induced by the canonical local map of +valuation rings. -/ +def residueFieldMapOfHasExtension + {K L : Type*} [Field K] [Field L] [Algebra K L] + (V : ValuationSubring K) (W : ValuationSubring L) + (hW : V.valuation.HasExtension W.valuation) : + IsLocalRing.ResidueField V →+* IsLocalRing.ResidueField W := by + letI : IsLocalHom (valuationSubringMapOfHasExtension V W hW) := + valuationSubringMapOfHasExtension_isLocalHom V W hW + exact IsLocalRing.ResidueField.map + (valuationSubringMapOfHasExtension V W hW) + +/-- The induced residue-field automorphism fixes the embedded residue field +of the base valuation ring. -/ +theorem residueFieldEquivOfUniqueExtension_algebraMap + {K L : Type*} [Field K] [Field L] [Algebra K L] + (V : ValuationSubring K) (W : ValuationSubring L) + [hW : V.valuation.HasExtension W.valuation] + (huniq : ∀ W' : ValuationSubring L, + V.valuation.HasExtension W'.valuation → W' = W) + (σ : L ≃ₐ[K] L) + (x : IsLocalRing.ResidueField V) : + residueFieldEquivOfUniqueExtension V W hW huniq σ + (residueFieldMapOfHasExtension V W hW x) = + residueFieldMapOfHasExtension V W hW x := by + obtain ⟨a, rfl⟩ := Ideal.Quotient.mk_surjective x + change + residueFieldEquivOfUniqueExtension V W hW huniq σ + (IsLocalRing.residue W + (valuationSubringMapOfHasExtension V W hW a)) = + IsLocalRing.residue W (valuationSubringMapOfHasExtension V W hW a) + rw [residueFieldEquivOfUniqueExtension_residue] + congr 1 + ext + exact σ.commutes (a : K) + +/-- Conjugate integral elements have conjugate reductions over the residue +field of the base valuation ring. In particular, their reductions have the +same minimal polynomial. This is the residue-field form of the Galois +argument used in the converse direction of the unique-extension characterization. -/ +theorem minpoly_residue_eq_of_minpoly_eq_of_unique_extension + {K L : Type*} [Field K] [Field L] [Algebra K L] + [Normal K L] + (V : ValuationSubring K) (W : ValuationSubring L) + [hW : V.valuation.HasExtension W.valuation] + (huniq : ∀ W' : ValuationSubring L, + V.valuation.HasExtension W'.valuation → W' = W) + {x y : L} (hxy : minpoly K x = minpoly K y) + (hx : x ∈ W.toSubring) (hy : y ∈ W.toSubring) : + letI : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (residueFieldMapOfHasExtension V W hW).toAlgebra + minpoly (IsLocalRing.ResidueField V) + (IsLocalRing.residue W ⟨x, hx⟩) = + minpoly (IsLocalRing.ResidueField V) + (IsLocalRing.residue W ⟨y, hy⟩) := by + let : Algebra (IsLocalRing.ResidueField V) + (IsLocalRing.ResidueField W) := + (residueFieldMapOfHasExtension V W hW).toAlgebra + obtain ⟨σ, hσ⟩ := (Normal.minpoly_eq_iff_mem_orbit L).1 hxy + let e : IsLocalRing.ResidueField W ≃ₐ[IsLocalRing.ResidueField V] + IsLocalRing.ResidueField W := + { residueFieldEquivOfUniqueExtension V W hW huniq σ with + commutes' := fun z => + residueFieldEquivOfUniqueExtension_algebraMap V W huniq σ z } + have hred : + e (IsLocalRing.residue W ⟨y, hy⟩) = + IsLocalRing.residue W ⟨x, hx⟩ := by + change + residueFieldEquivOfUniqueExtension V W hW huniq σ + (IsLocalRing.residue W ⟨y, hy⟩) = + IsLocalRing.residue W ⟨x, hx⟩ + rw [residueFieldEquivOfUniqueExtension_residue] + congr 1 + exact Subtype.ext hσ + rw [← hred] + exact minpoly.algEquiv_eq e _ + +end Valuations +end + +end ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/ValuedAdicComplete.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/ValuedAdicComplete.lean new file mode 100644 index 0000000000..e0f2f626e6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/ValuedAdicComplete.lean @@ -0,0 +1,177 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ +module + + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete +public import Mathlib.RingTheory.AdicCompletion.Topology +public import Mathlib.Topology.Algebra.Valued.ValuedField + +/-! # Valued Adic Complete -/ + +@[expose] public section + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + mem_maximalIdeal_pow_iff_valuation_le_uniformizer_pow → + mem_maximalIdeal_pow_iff_valuation_le_uniformizer_pow + +universe u v + +namespace ValuationTheory + +/-! +# Adic completeness of complete rank-one discrete valued fields + +This file supplies the common source used in the valuation-topology and adic-completeness + arguments: on a +rank-one discrete valued field with archimedean ambient value group, the +native topology of the valuation ring is its maximal-ideal adic topology. +Consequently a complete valued field has an adically complete valuation ring. +-/ + +noncomputable +section + +namespace Valuations + +open DiscreteValuationField + +/-- The valuation ring of a rank-one discrete valued field is a discrete +valuation ring. -/ +theorem rankOneDiscreteValuationSubring_isDiscreteValuationRing + {K : Type u} [Field K] {Gamma : Type v} + [LinearOrderedCommGroupWithZero Gamma] + [Valued K Gamma] + [(Valued.v : Valuation K Gamma).IsRankOneDiscrete] : + IsDiscreteValuationRing + (Valued.v : Valuation K Gamma).valuationSubring := by + let F : DVF.{u, v} K := + { ValueGroup := Gamma + valuation := Valued.v } + exact F.valuationSubring_isDiscreteValuationRing + +/-- The native subtype topology on the valuation ring of a rank-one discrete +valued field is its maximal-ideal adic topology. -/ +theorem rankOneDiscreteValuationSubring_isAdic + {K : Type u} [Field K] {Gamma : Type v} + [LinearOrderedCommGroupWithZero Gamma] [MulArchimedean Gamma] + [Valued K Gamma] + [(Valued.v : Valuation K Gamma).IsRankOneDiscrete] : + IsAdic + (IsLocalRing.maximalIdeal + (Valued.v : Valuation K Gamma).valuationSubring) := by + let val := (Valued.v : Valuation K Gamma) + let : IsTopologicalRing val.valuationSubring := + Subring.instIsTopologicalRing val.valuationSubring.toSubring + rcases Valuation.exists_isUniformizer_of_isCyclic_of_nontrivial val with + ⟨pi, hpi⟩ + rw [isAdic_iff] + constructor + · intro n + have h_radius_ne : + val (((pi ^ n : val.valuationSubring) : K)) ≠ 0 := by + change val ((pi : K) ^ n) ≠ 0 + rw [map_pow] + exact pow_ne_zero n hpi.val_ne_zero + have h_restrict_radius_ne : + val.restrict (((pi ^ n : val.valuationSubring) : K)) ≠ 0 := by + simpa using h_radius_ne + have h_open_ball_restrict : IsOpen + {x : K | + val.restrict x ≤ + val.restrict (((pi ^ n : val.valuationSubring) : K))} := + Valued.isOpen_closedBall K h_restrict_radius_ne + have h_open_ball : IsOpen + {x : K | + val x ≤ val (((pi ^ n : val.valuationSubring) : K))} := by + simpa only [val.restrict_le_iff] using h_open_ball_restrict + have h_preimage_open : IsOpen + {x : val.valuationSubring | + val (x : K) ≤ val (((pi ^ n : val.valuationSubring) : K))} := + h_open_ball.preimage continuous_subtype_val + convert h_preimage_open using 1 + ext x + exact + (mem_maximalIdeal_pow_iff_valuation_le_uniformizer_pow + (val := val) (pi := pi) hpi n) + · intro s hs + rcases + (mem_nhds_subtype (val.valuationSubring : Set K) + (0 : val.valuationSubring) s).1 hs with + ⟨t, ht, hts⟩ + rcases (Valued.hasBasis_nhds_zero K Gamma).mem_iff.mp ht with + ⟨gamma, _hgamma, hgamma_t⟩ + let gamma' : Gammaˣ := + Units.map + (MonoidWithZeroHom.ValueGroup₀.embedding (f := (.ofClass val))) + gamma + rcases exists_pow_lt + (Valuation.IsRankOneDiscrete.generator_lt_one val) + gamma' with + ⟨n, hn⟩ + refine ⟨n, ?_⟩ + intro x hx + apply hts + apply hgamma_t + change val.restrict (x : K) < gamma.1 + rw [Valuation.restrict_lt_iff_lt_embedding] + have hx_le := + (mem_maximalIdeal_pow_iff_valuation_le_uniformizer_pow + (val := val) (pi := pi) hpi n).1 hx + calc + val (x : K) ≤ val (((pi ^ n : val.valuationSubring) : K)) := hx_le + _ = ((Valuation.IsRankOneDiscrete.generator val) ^ n : Gamma) := by + simp [map_pow, hpi.val] + _ < MonoidWithZeroHom.ValueGroup₀.embedding (f := (.ofClass val)) gamma.1 := by + have hn_coe := Units.val_lt_val.mp hn + change + ((Valuation.IsRankOneDiscrete.generator val : Gammaˣ) : Gamma) ^ n < + MonoidWithZeroHom.ValueGroup₀.embedding + (f := (.ofClass val)) gamma.1 at hn_coe + exact hn_coe + +/-- Completeness of a rank-one discrete valued field produces adic +completeness of its valuation ring; no adic-completeness assumption is +exposed. -/ +theorem rankOneDiscreteValuationSubring_isAdicComplete + {K : Type u} [Field K] {Gamma : Type v} + [LinearOrderedCommGroupWithZero Gamma] [MulArchimedean Gamma] + [Valued K Gamma] + [(Valued.v : Valuation K Gamma).IsRankOneDiscrete] + [CompleteSpace K] : + IsAdicComplete + (IsLocalRing.maximalIdeal + (Valued.v : Valuation K Gamma).valuationSubring) + (Valued.v : Valuation K Gamma).valuationSubring := by + let val := (Valued.v : Valuation K Gamma) + let : IsUniformAddGroup val.valuationSubring := + val.valuationSubring.toAddSubgroup.isUniformAddGroup + let : IsTopologicalRing val.valuationSubring := + Subring.instIsTopologicalRing val.valuationSubring.toSubring + let : CompleteSpace val.valuationSubring := + (Valued.isClosed_valuationSubring K).completeSpace_coe + exact rankOneDiscreteValuationSubring_isAdic.isAdicComplete_iff.2 + ⟨inferInstance, inferInstance⟩ + +/-- A complete rank-one discrete valued field, equipped with its distinguished +valuation, gives a `CompleteDVF` by construction. -/ +noncomputable def completeDVFOfCompleteValuedField + {K : Type u} [Field K] {Gamma : Type v} + [LinearOrderedCommGroupWithZero Gamma] [MulArchimedean Gamma] + [Valued K Gamma] + [(Valued.v : Valuation K Gamma).IsRankOneDiscrete] + [CompleteSpace K] : + CompleteDVF.{u, v} K where + ValueGroup := Gamma + valuation := Valued.v + instCompleteDiscrete := + { isRankOneDiscrete := inferInstance + isAdicComplete := rankOneDiscreteValuationSubring_isAdicComplete } + +end Valuations +end + +end ValuationTheory diff --git a/LeanPool/projects.yml b/LeanPool/projects.yml index aa3f2206f2..72314e066b 100644 --- a/LeanPool/projects.yml +++ b/LeanPool/projects.yml @@ -11351,3 +11351,36 @@ projects: msc: - 60A05 - 05C05 + - title: Local and global class field theory + summary: Formalizes local and global reciprocity and existence theorems, Hasse–Arf, Hilbert pairings, + the cyclic Hasse norm theorem, conductors, ray class fields, Hilbert class fields, and Kronecker–Weber, + together with the valuation, cohomology, and profinite-group support used in their proofs. + branch: algebraic number theory + main_declarations: + - ClassFieldTheory.finiteAbelianLocalReciprocity + - ClassFieldTheory.topologicalGlobalReciprocity + main_results: + - declaration: ClassFieldTheory.finiteAbelianLocalReciprocity + informal: For a finite abelian extension of nonarchimedean local fields, there is a surjective + continuous Artin map with kernel equal to the field-norm subgroup. + - declaration: ClassFieldTheory.topologicalGlobalReciprocity + informal: The idèle-class quotient by its identity component is topologically isomorphic to the + abelianized absolute Galois group. + tags: + - class-field-theory + - local-fields + - number-fields + - galois-cohomology + msc: + - 11R37 + - 11S31 + slug: classfieldtheory + entry_module: LeanPool.ClassFieldTheory + authors: + - n-yamaguchi-0729 + source: + url: https://github.com/n-yamaguchi-0729/ClassFieldTheory + github_repo: n-yamaguchi-0729/ClassFieldTheory + commit: 01b4614ee76fa6f50e7f3ea3e1cff93b85693345 + license: Apache-2.0 + status: verified